[med-svn] [praat] 02/14: Imported Upstream version 6.0.1

Rafael Laboissière rlaboiss-guest at moszumanska.debian.org
Sun Nov 1 19:08:25 UTC 2015


This is an automated email from the git hooks/post-receive script.

rlaboiss-guest pushed a commit to branch master
in repository praat.

commit d232f4e94de64b4c0c6948e2cfe620ed80ecd144
Author: Rafael Laboissiere <rafael at laboissiere.net>
Date:   Fri Oct 30 04:18:20 2015 -0200

    Imported Upstream version 6.0.1
---
 .gitignore                                         |    20 +
 EEG/EEG.cpp                                        |   398 +-
 EEG/EEG.h                                          |    18 +-
 EEG/EEGWindow.cpp                                  |    48 +-
 EEG/EEGWindow.h                                    |    43 +-
 EEG/EEGWindow_prefs.h                              |    47 +-
 EEG/EEG_def.h                                      |    16 +-
 EEG/ERP.cpp                                        |    36 +-
 EEG/ERP.h                                          |     6 +-
 EEG/ERPTier.cpp                                    |   116 +-
 EEG/ERPTier.h                                      |    20 +-
 EEG/ERPTier_def.h                                  |    21 +-
 EEG/ERPWindow.cpp                                  |    28 +-
 EEG/ERPWindow.h                                    |    35 +-
 EEG/ERPWindow_prefs.h                              |    50 +-
 EEG/ERP_def.h                                      |     2 +-
 EEG/manual_EEG.cpp                                 |    46 +-
 EEG/praat_EEG.cpp                                  |   985 +-
 FFNet/FFNet.cpp                                    |   244 +-
 FFNet/FFNet.h                                      |    24 +-
 FFNet/FFNet_Activation_Categories.cpp              |    54 +-
 FFNet/FFNet_Activation_Categories.h                |    16 +-
 FFNet/FFNet_Eigen.cpp                              |    32 +-
 FFNet/FFNet_Eigen.h                                |    10 +-
 FFNet/FFNet_Matrix.cpp                             |    32 +-
 FFNet/FFNet_Matrix.h                               |    14 +-
 FFNet/FFNet_Pattern.cpp                            |     2 +-
 FFNet/FFNet_Pattern.h                              |    10 +-
 FFNet/FFNet_Pattern_Activation.cpp                 |   100 +-
 FFNet/FFNet_Pattern_Activation.h                   |    12 +-
 FFNet/FFNet_Pattern_Categories.cpp                 |    55 +-
 FFNet/FFNet_Pattern_Categories.h                   |    13 +-
 FFNet/FFNet_def.h                                  |    13 +-
 FFNet/manual_FFNet.cpp                             |   462 +-
 FFNet/praat_FFNet_init.cpp                         |   648 +-
 LPC/.kdev_include_paths                            |     3 -
 LPC/Cepstrogram.cpp                                |   138 +-
 LPC/Cepstrogram.h                                  |    25 +-
 LPC/Cepstrum.cpp                                   |   109 +-
 LPC/Cepstrum.h                                     |    22 +-
 LPC/Cepstrum_and_Spectrum.cpp                      |    50 +-
 LPC/Cepstrum_and_Spectrum.h                        |    28 +-
 LPC/Cepstrumc.cpp                                  |    49 +-
 LPC/Cepstrumc.h                                    |     8 +-
 LPC/Cepstrumc_def.h                                |     6 +-
 LPC/Formant_extensions.cpp                         |    22 +-
 LPC/Formant_extensions.h                           |     6 +-
 LPC/LPC.cpp                                        |    55 +-
 LPC/LPC.h                                          |    10 +-
 LPC/LPC_and_Cepstrumc.cpp                          |    16 +-
 LPC/LPC_and_Cepstrumc.h                            |    14 +-
 LPC/LPC_and_Formant.cpp                            |    28 +-
 LPC/LPC_and_Formant.h                              |    14 +-
 LPC/LPC_and_LFCC.cpp                               |    21 +-
 LPC/LPC_and_LFCC.h                                 |    14 +-
 LPC/LPC_and_Polynomial.cpp                         |    14 +-
 LPC/LPC_and_Polynomial.h                           |    14 +-
 LPC/LPC_and_Tube.cpp                               |    44 +-
 LPC/LPC_and_Tube.h                                 |     8 +-
 LPC/LPC_def.h                                      |     6 +-
 LPC/LPC_to_Spectrogram.cpp                         |     8 +-
 LPC/LPC_to_Spectrogram.h                           |    12 +-
 LPC/LPC_to_Spectrum.cpp                            |    16 +-
 LPC/LPC_to_Spectrum.h                              |    14 +-
 LPC/Sound_and_Cepstrum.cpp                         |    38 +-
 LPC/Sound_and_Cepstrum.h                           |    16 +-
 LPC/Sound_and_LPC.cpp                              |   147 +-
 LPC/Sound_and_LPC.h                                |    26 +-
 LPC/Sound_and_LPC_robust.cpp                       |    43 +-
 LPC/Tube.cpp                                       |    45 +-
 LPC/Tube.h                                         |     6 +-
 LPC/Tube_def.h                                     |     4 +-
 LPC/VocalTractTier.cpp                             |    42 +-
 LPC/VocalTractTier.h                               |    14 +-
 LPC/manual_LPC.cpp                                 |   810 +-
 LPC/praat_LPC_init.cpp                             |  1340 +-
 README.md                                          |   141 +
 artsynth/Art_Speaker.cpp                           |     4 +-
 artsynth/Art_Speaker_to_VocalTract.cpp             |    34 +-
 artsynth/Articulation.cpp                          |     4 +-
 artsynth/Articulation.h                            |     6 +-
 artsynth/Articulation_def.h                        |     4 +-
 artsynth/Articulation_enums.h                      |    62 +-
 artsynth/Artword.cpp                               |    26 +-
 artsynth/Artword.h                                 |    12 +-
 artsynth/ArtwordEditor.cpp                         |    71 +-
 artsynth/ArtwordEditor.h                           |    29 +-
 artsynth/Artword_Speaker_Sound.cpp                 |    11 +-
 artsynth/Artword_Speaker_to_Sound.cpp              |   335 +-
 artsynth/Artword_Speaker_to_Sound.h                |    10 +-
 artsynth/Artword_def.h                             |     4 +-
 artsynth/Artword_to_Art.cpp                        |     4 +-
 artsynth/Delta.cpp                                 |    18 +-
 artsynth/Delta.h                                   |    28 +-
 artsynth/Speaker.cpp                               |    36 +-
 artsynth/Speaker.h                                 |     6 +-
 artsynth/Speaker_def.h                             |     2 +-
 artsynth/Speaker_to_Delta.cpp                      |     2 +-
 artsynth/manual_Artsynth.cpp                       |   194 +-
 artsynth/praat_Artsynth.cpp                        |   456 +-
 contrib/ola/FeatureWeights.cpp                     |    20 +-
 contrib/ola/FeatureWeights.h                       |     2 +-
 contrib/ola/FeatureWeights_def.h                   |     6 +-
 contrib/ola/KNN.cpp                                |    68 +-
 contrib/ola/KNN.h                                  |     4 +-
 contrib/ola/KNN_def.h                              |     2 +-
 contrib/ola/KNN_threads.cpp                        |    26 +-
 contrib/ola/KNN_threads.h                          |     4 +-
 contrib/ola/Pattern_to_Categories_cluster.cpp      |     4 +-
 contrib/ola/manual_KNN.cpp                         |   898 +-
 contrib/ola/praat_contrib_Ola_KNN.cpp              |  1470 +-
 dwsys/Collection_extensions.cpp                    |   135 +-
 dwsys/Collection_extensions.h                      |    38 +-
 dwsys/Command.cpp                                  |    12 +-
 dwsys/Command.h                                    |     6 +-
 dwsys/DLL.cpp                                      |    76 +-
 dwsys/DLL.h                                        |    44 +-
 dwsys/Eigen.cpp                                    |   152 +-
 dwsys/Eigen.h                                      |    10 +-
 dwsys/Eigen_def.h                                  |     2 +-
 dwsys/FileInMemory.cpp                             |   147 +-
 dwsys/FileInMemory.h                               |    46 +-
 dwsys/Graphics_extensions.cpp                      |    22 +-
 dwsys/Graphics_extensions.h                        |     4 +-
 dwsys/Index.cpp                                    |    29 +-
 dwsys/Index.h                                      |     4 +-
 dwsys/Index_def.h                                  |     6 +-
 dwsys/NUM2.cpp                                     |   565 +-
 dwsys/NUM2.h                                       |    49 +-
 dwsys/NUMcblas.cpp                                 |    16 +-
 dwsys/NUMcblas.h                                   |    11 +-
 dwsys/NUMclapack.h                                 |     8 -
 dwsys/NUMf2c.cpp                                   |     6 +-
 dwsys/NUMf2c.h                                     |     8 -
 dwsys/NUMhuber.cpp                                 |    18 +-
 dwsys/NUMlapack.cpp                                |     4 +-
 dwsys/NUMlapack.h                                  |     8 -
 dwsys/NUMmachar.h                                  |     8 -
 dwsys/NUMmathlib.cpp                               |     4 +-
 dwsys/NUMsort2.cpp                                 |   242 +-
 dwsys/NUMstring.cpp                                |   285 +-
 dwsys/Permutation.cpp                              |    97 +-
 dwsys/Permutation.h                                |     2 +-
 dwsys/Permutation_and_Index.cpp                    |     5 +-
 dwsys/Permutation_and_Index.h                      |    10 +-
 dwsys/Permutation_def.h                            |     6 +-
 dwsys/SVD.cpp                                      |    76 +-
 dwsys/SVD.h                                        |     4 +-
 dwsys/SVD_def.h                                    |    12 +-
 dwsys/SimpleVector.cpp                             |     8 +-
 dwsys/SimpleVector.h                               |     4 +-
 dwsys/SimpleVector_def.h                           |     4 +-
 dwsys/Simple_extensions.cpp                        |    40 +-
 dwsys/Simple_extensions.h                          |    14 +-
 dwsys/regularExp.cpp                               |   793 +-
 dwsys/regularExp.h                                 |    55 +-
 dwtest/runAllTests.praat                           |    19 +-
 dwtest/test_Confusion.praat                        |     8 +-
 dwtest/test_KlattGrid.praat                        |     7 +-
 dwtest/test_KruskalWallis.praat                    |     7 +-
 ...st_onewayAnova.praat => test_OnewayAnova.praat} |     9 +-
 dwtest/test_Polygon_simplify.praat                 |     4 -
 dwtest/test_Procrustes.praat                       |   263 +-
 dwtest/test_Sound_paint_where.praat                |     2 +-
 dwtest/test_TableOfReal_extensions.praat           |     3 +-
 ...est_henzeZirklerMultivariateNormalityTest.praat |     4 +-
 dwtest/test_regex.praat                            |     1 -
 dwtools/.DTW_def.h.kate-swp                        |   Bin 77 -> 0 bytes
 dwtools/.KlattGridEditors.cpp.kate-swp             |   Bin 103 -> 0 bytes
 dwtools/.Sound_extensions.cpp.kate-swp             |   Bin 4764 -> 0 bytes
 dwtools/.SpeechSynthesizer.cpp.kate-swp            |   Bin 304 -> 0 bytes
 dwtools/.Table_extensions.cpp.kate-swp             |   Bin 160 -> 0 bytes
 dwtools/.manual_dwtools.cpp.kate-swp               |   Bin 1317 -> 0 bytes
 dwtools/.praat_David_init.cpp.kate-swp             |   Bin 152 -> 0 bytes
 dwtools/Activation.cpp                             |    35 +-
 dwtools/Activation.h                               |    18 +-
 dwtools/AffineTransform.cpp                        |    38 +-
 dwtools/AffineTransform.h                          |    14 +-
 dwtools/AffineTransform_def.h                      |     4 +-
 dwtools/CC.cpp                                     |    32 +-
 dwtools/CCA.cpp                                    |    94 +-
 dwtools/CCA.h                                      |     4 +-
 dwtools/CCA_and_Correlation.cpp                    |    33 +-
 dwtools/CCA_and_Correlation.h                      |    17 +-
 dwtools/CCA_def.h                                  |     6 +-
 dwtools/CC_def.h                                   |     6 +-
 dwtools/CCs_to_DTW.cpp                             |    45 +-
 dwtools/CCs_to_DTW.h                               |     2 +-
 dwtools/Categories.cpp                             |    58 +-
 dwtools/Categories.h                               |    24 +-
 dwtools/CategoriesEditor.cpp                       |  1611 +-
 dwtools/CategoriesEditor.h                         |     2 +-
 dwtools/Categories_and_Strings.cpp                 |    12 +-
 dwtools/ClassificationTable.cpp                    |    22 +-
 dwtools/ComplexSpectrogram.cpp                     |   253 +
 dwtools/ComplexSpectrogram.h                       |    43 +
 dwtools/{Vowel_def.h => ComplexSpectrogram_def.h}  |    17 +-
 dwtools/Configuration.cpp                          |   219 +-
 dwtools/Configuration.h                            |    24 +-
 dwtools/Configuration_AffineTransform.cpp          |    59 +-
 dwtools/Configuration_AffineTransform.h            |    25 +-
 dwtools/Configuration_and_Procrustes.cpp           |     4 +-
 dwtools/Configuration_and_Procrustes.h             |     8 -
 dwtools/Configuration_def.h                        |     4 +-
 dwtools/Confusion.cpp                              |   248 +-
 dwtools/Confusion.h                                |    39 +-
 dwtools/ContingencyTable.cpp                       |   127 +-
 dwtools/ContingencyTable.h                         |    38 +-
 dwtools/DTW.cpp                                    |   225 +-
 dwtools/DTW.h                                      |    39 +-
 dwtools/DTW_and_TextGrid.cpp                       |    44 +-
 dwtools/DTW_def.h                                  |     4 +-
 dwtools/DataModeler.cpp                            |  1069 +-
 dwtools/DataModeler.h                              |   128 +-
 dwtools/DataModeler_def.h                          |    13 +-
 dwtools/Discriminant.cpp                           |   234 +-
 dwtools/Discriminant.h                             |    49 +-
 dwtools/Discriminant_Pattern_Categories.cpp        |    18 +-
 dwtools/Discriminant_Pattern_Categories.h          |    15 +-
 dwtools/Discriminant_def.h                         |     4 +-
 dwtools/Distance.cpp                               |     8 +-
 dwtools/Distance.h                                 |     4 +-
 dwtools/EEG_extensions.cpp                         |   585 +-
 dwtools/EEG_extensions.h                           |    12 +-
 dwtools/EditDistanceTable.cpp                      |   115 +-
 dwtools/EditDistanceTable.h                        |    24 +-
 dwtools/EditDistanceTable_def.h                    |    20 +-
 dwtools/Eigen_and_Matrix.cpp                       |    17 +-
 dwtools/Eigen_and_Matrix.h                         |    21 +-
 dwtools/Eigen_and_Procrustes.cpp                   |     8 +-
 dwtools/Eigen_and_Procrustes.h                     |     8 -
 dwtools/Eigen_and_SSCP.cpp                         |     8 +-
 dwtools/Eigen_and_SSCP.h                           |    17 +-
 dwtools/Eigen_and_TableOfReal.cpp                  |    21 +-
 dwtools/Eigen_and_TableOfReal.h                    |    21 +-
 dwtools/Excitations.cpp                            |    14 +-
 dwtools/FilterBank.cpp                             |   199 +-
 dwtools/FilterBank.h                               |    37 +-
 dwtools/FormantGrid_extensions.cpp                 |    10 +-
 dwtools/FormantGrid_extensions.h                   |    10 +-
 dwtools/GaussianMixture.cpp                        |   286 +-
 dwtools/GaussianMixture.h                          |    22 +-
 dwtools/GaussianMixture_def.h                      |     6 +-
 dwtools/HMM.cpp                                    |   538 +-
 dwtools/HMM.h                                      |   108 +-
 dwtools/HMM_def.h                                  |    12 +-
 dwtools/ICA.cpp                                    |   121 +-
 dwtools/ICA.h                                      |    14 +-
 dwtools/Intensity_extensions.cpp                   |    28 +-
 dwtools/Intensity_extensions.h                     |     4 +-
 dwtools/KlattGrid.cpp                              |  1014 +-
 dwtools/KlattGrid.h                                |    89 +-
 dwtools/KlattGridEditors.cpp                       |   298 +-
 dwtools/KlattGridEditors.h                         |   530 +-
 dwtools/KlattGrid_def.h                            |    99 +-
 dwtools/KlattTable.cpp                             |    88 +-
 dwtools/LFCC.cpp                                   |     2 +-
 dwtools/LongSound_extensions.cpp                   |    42 +-
 dwtools/LongSound_extensions.h                     |     6 -
 dwtools/Ltas_extensions.cpp                        |     4 +-
 dwtools/MDS.cpp                                    |  1268 +-
 dwtools/MDS.h                                      |   200 +-
 dwtools/MFCC.cpp                                   |    29 +-
 dwtools/Makefile                                   |     5 +-
 dwtools/Matrix_Categories.cpp                      |    11 +-
 dwtools/Matrix_Categories.h                        |    10 +-
 dwtools/Matrix_extensions.cpp                      |    92 +-
 dwtools/Matrix_extensions.h                        |    24 +-
 dwtools/Minimizers.cpp                             |   143 +-
 dwtools/Minimizers.h                               |    82 +-
 dwtools/OptimalCeilingTier.cpp                     |    44 +
 .../OptimalCeilingTier.h                           |    28 +-
 dwtools/OptimalCeilingTierEditor.cpp               |    50 +
 dwtools/OptimalCeilingTierEditor.h                 |    63 +
 dwtools/PCA.cpp                                    |    40 +-
 dwtools/PCA.h                                      |     2 +-
 dwtools/PCA_def.h                                  |     4 +-
 dwtools/Pattern.cpp                                |    27 +-
 dwtools/Pattern.h                                  |     8 +-
 dwtools/Pitch_extensions.cpp                       |    22 +-
 dwtools/Pitch_extensions.h                         |    17 +-
 dwtools/Polygon_extensions.cpp                     |   187 +-
 dwtools/Polygon_extensions.h                       |     9 +-
 dwtools/Polynomial.cpp                             |   208 +-
 dwtools/Polynomial.h                               |    14 +-
 dwtools/Procrustes.cpp                             |     2 +-
 dwtools/Proximity.cpp                              |    13 +-
 dwtools/Proximity.h                                |     2 +-
 dwtools/Resonator.cpp                              |    17 +-
 dwtools/Resonator.h                                |    57 +-
 dwtools/SPINET.cpp                                 |    49 +-
 dwtools/SPINET_def.h                               |     4 +-
 dwtools/SPINET_to_Pitch.cpp                        |    32 +-
 dwtools/SPINET_to_Pitch.h                          |     9 -
 dwtools/SSCP.cpp                                   |   524 +-
 dwtools/SSCP.h                                     |    72 +-
 dwtools/SSCP_def.h                                 |     4 +-
 dwtools/Sampled2.cpp                               |     8 +-
 dwtools/Sound_and_FilterBank.cpp                   |   421 +
 dwtools/Sound_and_FilterBank.h                     |    58 +
 dwtools/Sound_and_PCA.cpp                          |    14 +-
 dwtools/Sound_and_Spectrogram_extensions.cpp       |    46 +-
 dwtools/Sound_extensions.cpp                       |   349 +-
 dwtools/Sound_extensions.h                         |    14 +-
 dwtools/Sound_to_DTW.h                             |     8 -
 dwtools/Sound_to_MFCC.cpp                          |     2 +-
 dwtools/Sound_to_MFCC.h                            |     8 -
 dwtools/Sound_to_Pitch2.cpp                        |    10 +-
 dwtools/Sound_to_Pitch2.h                          |     8 -
 dwtools/Sound_to_SPINET.cpp                        |     7 +-
 dwtools/Sound_to_SPINET.h                          |     8 -
 dwtools/Sounds_to_DTW.cpp                          |     2 +-
 dwtools/Spectrogram_extensions.cpp                 |   166 +-
 dwtools/Spectrogram_extensions.h                   |    52 +-
 dwtools/Spectrum_extensions.cpp                    |    52 +-
 dwtools/SpeechSynthesizer.cpp                      |   168 +-
 dwtools/SpeechSynthesizer.h                        |    14 +-
 dwtools/SpeechSynthesizer_and_TextGrid.cpp         |   178 +-
 dwtools/SpeechSynthesizer_and_TextGrid.h           |     4 +-
 dwtools/SpeechSynthesizer_def.h                    |     4 +-
 dwtools/Strings_extensions.cpp                     |    93 +-
 dwtools/Strings_extensions.h                       |    12 +-
 dwtools/TableOfReal_and_Permutation.cpp            |    12 +-
 dwtools/TableOfReal_and_Permutation.h              |    12 +-
 dwtools/TableOfReal_and_SVD.cpp                    |    30 +-
 dwtools/TableOfReal_and_SVD.h                      |    18 +-
 dwtools/TableOfReal_extensions.cpp                 |   576 +-
 dwtools/TableOfReal_extensions.h                   |   120 +-
 dwtools/Table_extensions.cpp                       |   586 +-
 dwtools/Table_extensions.h                         |    37 +-
 dwtools/TextGrid_extensions.cpp                    |   227 +-
 dwtools/TextGrid_extensions.h                      |    26 +-
 dwtools/VowelEditor.cpp                            |   902 +-
 dwtools/VowelEditor.h                              |    70 +-
 dwtools/Vowel_def.h                                |     6 +-
 dwtools/manual_BSS.cpp                             |   250 +-
 dwtools/manual_DataModeler.cpp                     |    40 +-
 dwtools/manual_HMM.cpp                             |   506 +-
 dwtools/manual_KlattGrid.cpp                       |   252 +-
 dwtools/manual_MDS.cpp                             |  2107 +-
 dwtools/manual_Permutation.cpp                     |   546 +-
 dwtools/manual_dwtools.cpp                         |  5990 ++---
 dwtools/octave-workspace                           |   Bin 43 -> 0 bytes
 dwtools/praat_BSS_init.cpp                         |   551 +-
 dwtools/praat_DataModeler_init.cpp                 |  1604 +-
 dwtools/praat_David_init.cpp                       |  8415 +++---
 dwtools/praat_HMM_init.cpp                         |   814 +-
 dwtools/praat_KlattGrid_init.cpp                   |  1125 +-
 dwtools/praat_MDS_init.cpp                         |  1496 +-
 external/espeak/dictionary.cpp                     |     6 +-
 external/espeak/espeakdata_FileInMemory.cpp        |    41 +-
 external/espeak/espeakdata_FileInMemory.h          |     2 +-
 external/espeak/espeakdata_dicts.cpp               |   286 +-
 external/espeak/espeakdata_phons.cpp               |    18 +-
 external/espeak/espeakdata_variants.cpp            |    74 +-
 external/espeak/espeakdata_voices.cpp              |   338 +-
 external/espeak/klatt.cpp                          |     9 +
 external/espeak/readclause.cpp                     |     0
 external/espeak/setlengths.cpp                     |     0
 external/espeak/sonic.cpp                          |     0
 external/espeak/sonic.h                            |     0
 external/espeak/speech.h                           |     9 +-
 external/espeak/synth_mbrola.cpp                   |     0
 external/espeak/synthdata.cpp                      |     8 +-
 external/espeak/synthesize.cpp                     |     0
 external/espeak/synthesize.h                       |     0
 external/espeak/translate.h                        |     0
 external/espeak/voices.cpp                         |     4 +-
 external/espeak/wavegen.cpp                        |     0
 external/flac/flac_FLAC_format.h                   |    10 +-
 external/flac/flac_stream_decoder.c                |     6 +-
 external/flac/flac_stream_encoder.c                |     4 +-
 external/mp3/mp3.cpp                               |    93 +-
 external/mp3/mp3.h                                 |     2 +-
 fon/AmplitudeTier.cpp                              |    76 +-
 fon/AmplitudeTier.h                                |    27 +-
 fon/AmplitudeTierEditor.cpp                        |    14 +-
 fon/AmplitudeTierEditor.h                          |    51 +-
 fon/AnyTier.cpp                                    |     8 +-
 fon/AnyTier.h                                      |     4 +-
 fon/AnyTier_def.h                                  |    10 +-
 fon/Cochleagram.cpp                                |    50 +-
 fon/Cochleagram.h                                  |    19 +-
 fon/Cochleagram_and_Excitation.cpp                 |     8 +-
 fon/Cochleagram_and_Excitation.h                   |     4 +-
 fon/Distributions_and_Transition.cpp               |    46 +-
 fon/Distributions_and_Transition.h                 |     8 +-
 fon/DurationTier.cpp                               |    34 +-
 fon/DurationTier.h                                 |    16 +-
 fon/DurationTierEditor.cpp                         |    16 +-
 fon/DurationTierEditor.h                           |    52 +-
 fon/Excitation.cpp                                 |    70 +-
 fon/Excitation.h                                   |    16 +-
 fon/Excitation_to_Formant.cpp                      |     8 +-
 fon/Excitation_to_Formant.h                        |     4 +-
 fon/ExperimentMFC.cpp                              |   117 +-
 fon/ExperimentMFC.h                                |     4 +-
 fon/ExperimentMFC_def.h                            |    12 +-
 fon/Experiment_enums.h                             |    16 +-
 fon/Formant.cpp                                    |   139 +-
 fon/Formant.h                                      |    22 +-
 fon/FormantGrid.cpp                                |    86 +-
 fon/FormantGrid.h                                  |    24 +-
 fon/FormantGridEditor.cpp                          |   184 +-
 fon/FormantGridEditor.h                            |    38 +-
 fon/FormantGridEditor_prefs.h                      |    39 +-
 fon/FormantGrid_def.h                              |    23 +-
 fon/FormantTier.cpp                                |    62 +-
 fon/FormantTier.h                                  |    18 +-
 fon/FormantTier_def.h                              |     2 +-
 fon/Formant_def.h                                  |    14 +-
 fon/FujisakiPitch.cpp                              |    22 +-
 fon/FujisakiPitch.h                                |    10 +-
 fon/Function.cpp                                   |    16 +-
 fon/Function.h                                     |     6 +-
 fon/FunctionEditor.cpp                             |   420 +-
 fon/FunctionEditor.h                               |   220 +-
 fon/FunctionEditor_prefs.h                         |    19 +-
 fon/Function_def.h                                 |    48 +-
 fon/Harmonicity.cpp                                |    62 +-
 fon/Harmonicity.h                                  |    16 +-
 fon/Harmonics.h                                    |    16 +-
 fon/Harmonics_def.h                                |     9 +-
 fon/Image.h                                        |    24 +-
 fon/Intensity.cpp                                  |    48 +-
 fon/Intensity.h                                    |    21 +-
 fon/IntensityTier.cpp                              |    52 +-
 fon/IntensityTier.h                                |    27 +-
 fon/IntensityTierEditor.cpp                        |    14 +-
 fon/IntensityTierEditor.h                          |    49 +-
 fon/Label.cpp                                      |    50 +-
 fon/Label.h                                        |    45 +-
 fon/LongSound.cpp                                  |   134 +-
 fon/LongSound.h                                    |    59 +-
 fon/Ltas.cpp                                       |   168 +-
 fon/Ltas.h                                         |    46 +-
 fon/Ltas_to_SpectrumTier.cpp                       |     6 +-
 fon/Ltas_to_SpectrumTier.h                         |     4 +-
 fon/Manipulation.cpp                               |   356 +-
 fon/Manipulation.h                                 |    32 +-
 fon/ManipulationEditor.cpp                         |   550 +-
 fon/ManipulationEditor.h                           |    62 +-
 fon/ManipulationEditor_enums.h                     |    14 +-
 fon/ManipulationEditor_prefs.h                     |    23 +-
 fon/Manipulation_def.h                             |    39 +-
 fon/Matrix.cpp                                     |   179 +-
 fon/Matrix.h                                       |    30 +-
 fon/Matrix_and_Pitch.cpp                           |    20 +-
 fon/Matrix_and_Pitch.h                             |     6 +-
 fon/Matrix_and_PointProcess.cpp                    |    16 +-
 fon/Matrix_and_PointProcess.h                      |    10 +-
 fon/Matrix_and_Polygon.cpp                         |    22 +-
 fon/Matrix_and_Polygon.h                           |    10 +-
 fon/Matrix_def.h                                   |    35 +-
 fon/Movie.cpp                                      |    44 +-
 fon/Movie.h                                        |     6 +-
 fon/MovieWindow.cpp                                |    10 +-
 fon/MovieWindow.h                                  |    29 +-
 fon/Movie_def.h                                    |     6 +-
 fon/ParamCurve.cpp                                 |   111 +-
 fon/ParamCurve.h                                   |     9 +-
 fon/ParamCurve_def.h                               |    10 +-
 fon/Photo.cpp                                      |   154 +-
 fon/Photo.h                                        |     4 +-
 fon/Photo_def.h                                    |    49 +-
 fon/Pitch.cpp                                      |   259 +-
 fon/Pitch.h                                        |    20 +-
 fon/PitchEditor.cpp                                |   122 +-
 fon/PitchEditor.h                                  |    20 +-
 fon/PitchTier.cpp                                  |    52 +-
 fon/PitchTier.h                                    |    15 +-
 fon/PitchTierEditor.cpp                            |    18 +-
 fon/PitchTierEditor.h                              |    50 +-
 fon/PitchTier_to_PointProcess.cpp                  |    50 +-
 fon/PitchTier_to_PointProcess.h                    |    16 +-
 fon/PitchTier_to_Sound.cpp                         |    52 +-
 fon/PitchTier_to_Sound.h                           |    14 +-
 fon/Pitch_AnyTier_to_PitchTier.cpp                 |    18 +-
 fon/Pitch_AnyTier_to_PitchTier.h                   |     6 +-
 fon/Pitch_Intensity.cpp                            |    12 +-
 fon/Pitch_def.h                                    |    34 +-
 fon/Pitch_enums.h                                  |    20 +-
 fon/Pitch_to_PitchTier.cpp                         |    26 +-
 fon/Pitch_to_PitchTier.h                           |     8 +-
 fon/Pitch_to_PointProcess.cpp                      |    93 +-
 fon/Pitch_to_PointProcess.h                        |     6 +-
 fon/Pitch_to_Sound.cpp                             |    26 +-
 fon/Pitch_to_Sound.h                               |     6 +-
 fon/PointEditor.cpp                                |    95 +-
 fon/PointEditor.h                                  |    27 +-
 fon/PointProcess.cpp                               |   133 +-
 fon/PointProcess.h                                 |    14 +-
 fon/PointProcess_and_Sound.cpp                     |    46 +-
 fon/PointProcess_and_Sound.h                       |    11 +-
 fon/PointProcess_def.h                             |    16 +-
 fon/Polygon.cpp                                    |    38 +-
 fon/Polygon.h                                      |     6 +-
 fon/Polygon_def.h                                  |    10 +-
 fon/Praat_tests.cpp                                |   260 +-
 fon/Praat_tests.h                                  |     4 +-
 fon/Praat_tests_enums.h                            |    39 +-
 fon/RealTier.cpp                                   |    56 +-
 fon/RealTier.h                                     |    10 +-
 fon/RealTierEditor.cpp                             |    66 +-
 fon/RealTierEditor.h                               |    62 +-
 fon/RealTier_def.h                                 |    52 +-
 fon/RunnerMFC.cpp                                  |    92 +-
 fon/RunnerMFC.h                                    |    33 +-
 fon/Sampled.cpp                                    |    76 +-
 fon/SampledXY_def.h                                |    29 +-
 fon/Sampled_def.h                                  |    30 +-
 fon/Sound.cpp                                      |   238 +-
 fon/Sound.h                                        |    33 +-
 fon/SoundEditor.cpp                                |   104 +-
 fon/SoundEditor.h                                  |    47 +-
 fon/SoundRecorder.cpp                              |   302 +-
 fon/SoundRecorder.h                                |   112 +-
 fon/SoundRecorder_enums.h                          |     6 +-
 fon/SoundRecorder_prefs.h                          |    15 +-
 fon/Sound_PointProcess.cpp                         |    12 +-
 fon/Sound_and_Spectrogram.cpp                      |    30 +-
 fon/Sound_and_Spectrogram_enums.h                  |    16 +-
 fon/Sound_and_Spectrum.cpp                         |    34 +-
 fon/Sound_and_Spectrum.h                           |     4 +-
 fon/Sound_audio.cpp                                |    79 +-
 fon/Sound_enhance.cpp                              |    16 +-
 fon/Sound_enums.h                                  |    44 +-
 fon/Sound_files.cpp                                |    96 +-
 fon/Sound_to_Cochleagram.cpp                       |    33 +-
 fon/Sound_to_Formant.cpp                           |    58 +-
 fon/Sound_to_Harmonicity.cpp                       |     6 +-
 fon/Sound_to_Harmonicity_GNE.cpp                   |    20 +-
 fon/Sound_to_Intensity.cpp                         |    32 +-
 fon/Sound_to_Intensity.h                           |     4 +-
 fon/Sound_to_Pitch.cpp                             |    80 +-
 fon/Sound_to_Pitch.h                               |     8 +-
 fon/Sound_to_PointProcess.cpp                      |    34 +-
 fon/Sound_to_PointProcess.h                        |    16 +-
 fon/Spectrogram.cpp                                |    50 +-
 fon/Spectrogram.h                                  |    12 +-
 fon/SpectrogramEditor.cpp                          |    12 +-
 fon/SpectrogramEditor.h                            |    16 +-
 fon/Spectrum.cpp                                   |   100 +-
 fon/SpectrumEditor.cpp                             |    86 +-
 fon/SpectrumEditor.h                               |    58 +-
 fon/SpectrumEditor_prefs.h                         |    17 +-
 fon/SpectrumTier.cpp                               |    34 +-
 fon/SpectrumTier.h                                 |    16 +-
 fon/Spectrum_and_Spectrogram.cpp                   |    10 +-
 fon/Spectrum_def.h                                 |    14 +-
 fon/Spectrum_to_Excitation.cpp                     |     4 +-
 fon/Spectrum_to_Formant.cpp                        |     4 +-
 fon/SpellingChecker.cpp                            |   150 +-
 fon/SpellingChecker.h                              |    10 +-
 fon/SpellingChecker_def.h                          |    28 +-
 fon/TextGrid.cpp                                   |   858 +-
 fon/TextGrid.h                                     |    61 +-
 fon/TextGridEditor.cpp                             |   794 +-
 fon/TextGridEditor.h                               |    99 +-
 fon/TextGridEditor_enums.h                         |    58 +-
 fon/TextGridEditor_prefs.h                         |    39 +-
 fon/TextGrid_Sound.cpp                             |   210 +-
 fon/TextGrid_Sound.h                               |     6 +-
 fon/TextGrid_def.h                                 |    67 +-
 fon/TimeSoundAnalysisEditor.cpp                    |  1419 +-
 fon/TimeSoundAnalysisEditor.h                      |    86 +-
 fon/TimeSoundAnalysisEditor_enums.h                |    30 +-
 fon/TimeSoundAnalysisEditor_prefs.h                |   157 +-
 fon/TimeSoundEditor.cpp                            |   359 +-
 fon/TimeSoundEditor.h                              |    56 +-
 fon/TimeSoundEditor_enums.h                        |    12 +-
 fon/TimeSoundEditor_prefs.h                        |    29 +-
 fon/Transition.cpp                                 |    68 +-
 fon/Transition.h                                   |     7 +-
 fon/Transition_def.h                               |     8 +-
 fon/Vector.cpp                                     |    12 +-
 fon/Vector.h                                       |    25 +-
 fon/VocalTract.cpp                                 |    70 +-
 fon/VocalTract.h                                   |    16 +-
 fon/VocalTract_to_Spectrum.cpp                     |     4 +-
 fon/VoiceAnalysis.cpp                              |   104 +-
 fon/WordList.cpp                                   |   110 +-
 fon/WordList.h                                     |     6 +-
 fon/WordList_def.h                                 |     7 +-
 fon/manual_Exp.cpp                                 |  1092 +-
 fon/manual_Fon.cpp                                 |  2482 +-
 fon/manual_Manual.cpp                              |   262 +-
 fon/manual_Picture.cpp                             |  1296 +-
 fon/manual_Sampling.cpp                            |   208 +-
 fon/manual_Script.cpp                              |  5732 ++--
 fon/manual_annotation.cpp                          |   488 +-
 fon/manual_exampleSound.cpp                        |    26 +-
 fon/manual_exampleSound.h                          |     4 +-
 fon/manual_formant.cpp                             |   766 +-
 fon/manual_glossary.cpp                            |   628 +-
 fon/manual_pitch.cpp                               |   910 +-
 fon/manual_programming.cpp                         |    70 +-
 fon/manual_references.cpp                          |   214 +-
 fon/manual_sound.cpp                               |  1530 +-
 fon/manual_soundFiles.cpp                          |   494 +-
 fon/manual_spectrum.cpp                            |  1027 +-
 fon/manual_tutorials.cpp                           |  5147 ++--
 fon/manual_voice.cpp                               |   196 +-
 fon/praat_Exp.cpp                                  |   120 +-
 fon/praat_Fon.cpp                                  |  7681 +++---
 fon/praat_Sound_init.cpp                           |  2226 +-
 fon/praat_TextGrid_init.cpp                        |  1570 +-
 gram/Network.cpp                                   |    76 +-
 gram/Network.h                                     |     2 +-
 gram/Network_def.h                                 |    14 +-
 gram/Network_enums.h                               |     8 +-
 gram/OTGrammar.cpp                                 |   794 +-
 gram/OTGrammar.h                                   |    52 +-
 gram/OTGrammarEditor.cpp                           |   208 +-
 gram/OTGrammarEditor.h                             |    27 +-
 gram/OTGrammar_def.h                               |    10 +-
 gram/OTGrammar_enums.h                             |    40 +-
 gram/OTGrammar_ex_NPA.cpp                          |    39 +-
 gram/OTGrammar_ex_NoCoda.cpp                       |    20 +-
 gram/OTGrammar_ex_metrics.cpp                      |   269 +-
 gram/OTGrammar_ex_tongueRoot.cpp                   |    44 +-
 gram/OTMulti.cpp                                   |   335 +-
 gram/OTMulti.h                                     |    22 +-
 gram/OTMultiEditor.cpp                             |   152 +-
 gram/OTMultiEditor.h                               |    34 +-
 gram/OTMulti_def.h                                 |    10 +-
 gram/OTMulti_ex_metrics.cpp                        |   270 +-
 gram/manual_gram.cpp                               |  1274 +-
 gram/praat_gram.cpp                                |  1732 +-
 kar/Makefile                                       |     4 +-
 kar/UnicodeData.h                                  | 26674 +++++++++----------
 kar/ipaSerifRegular24.cpp                          |  6050 -----
 kar/longchar.cpp                                   |    29 +-
 kar/longchar.h                                     |     8 +-
 main/main_Praat.cpp                                |    27 +-
 main/palias                                        |    66 -
 makefiles/makefile.defs.cygwin64                   |    25 +
 ...akefile.defs.mingw32 => makefile.defs.darmin32} |     0
 ...akefile.defs.mingw64 => makefile.defs.darmin64} |     0
 makefiles/makefile.defs.linux.alsa                 |     4 +-
 makefiles/makefile.defs.linux.pulse                |    23 +
 makefiles/makefile.defs.linux.silent               |     4 +-
 makefiles/makefile.defs.linuxc.alsa                |    23 -
 makefiles/makefile.defs.linuxs.alsa                |     4 +-
 makefiles/makefile.defs.mingw32                    |    23 +-
 makefiles/makefile.defs.mingw32-490                |    24 -
 makefiles/makefile.defs.mingw32c                   |    24 -
 makefiles/makefile.defs.mingw64                    |    23 +-
 makefiles/makefile.defs.mingw64-490                |    24 -
 makefiles/makefile.defs.mingw64c                   |    24 -
 num/NUM.cpp                                        |    24 +-
 num/NUM.h                                          |    66 +-
 num/NUMarrays.cpp                                  |   123 +-
 num/NUMlinprog.cpp                                 |    38 +-
 num/NUMrandom.cpp                                  |    57 +-
 num/NUMsort.cpp                                    |    12 +-
 stat/Distributions.cpp                             |    42 +-
 stat/Distributions.h                               |    11 +-
 stat/Distributions_and_Strings.cpp                 |    42 +-
 stat/LogisticRegression.cpp                        |    56 +-
 stat/LogisticRegression.h                          |     8 +-
 stat/LogisticRegression_def.h                      |     6 +-
 stat/PairDistribution.cpp                          |   102 +-
 stat/PairDistribution.h                            |    19 +-
 stat/PairDistribution_def.h                        |    12 +-
 stat/Regression.cpp                                |    48 +-
 stat/Regression.h                                  |    12 +-
 stat/Regression_def.h                              |    10 +-
 stat/Table.cpp                                     |   499 +-
 stat/Table.h                                       |    64 +-
 stat/TableEditor.cpp                               |    86 +-
 stat/TableEditor.h                                 |    41 +-
 stat/TableOfReal.cpp                               |   428 +-
 stat/TableOfReal.h                                 |    30 +-
 stat/TableOfReal_def.h                             |    43 +-
 stat/Table_def.h                                   |    45 +-
 stat/manual_statistics.cpp                         |   130 +-
 stat/praat_Stat.cpp                                |  1646 +-
 sys/ButtonEditor.cpp                               |   144 +-
 sys/ButtonEditor.h                                 |    25 +-
 sys/Collection.cpp                                 |   276 +-
 sys/Collection.h                                   |   158 +-
 sys/Data.cpp                                       |   217 +-
 sys/Data.h                                         |   199 +-
 sys/DataEditor.cpp                                 |   400 +-
 sys/DataEditor.h                                   |    87 +-
 sys/DemoEditor.cpp                                 |   219 +-
 sys/DemoEditor.h                                   |    72 +-
 sys/Editor.cpp                                     |   209 +-
 sys/Editor.h                                       |   348 +-
 sys/EditorM.h                                      |    22 +-
 sys/Editor_enums.h                                 |     8 +-
 sys/Editor_prefs.h                                 |     7 +-
 sys/Formula.cpp                                    |  2383 +-
 sys/Formula.h                                      |    10 +-
 sys/Graphics.cpp                                   |    35 +-
 sys/Graphics.h                                     |   285 +-
 sys/GraphicsP.h                                    |   186 +-
 sys/GraphicsPostscript.cpp                         |    44 +-
 sys/GraphicsScreen.cpp                             |   202 +-
 sys/Graphics_colour.cpp                            |   204 +-
 sys/Graphics_enums.h                               |    66 +-
 sys/Graphics_grey.cpp                              |     4 +-
 sys/Graphics_image.cpp                             |    79 +-
 sys/Graphics_linesAndAreas.cpp                     |   134 +-
 sys/Graphics_mouse.cpp                             |     4 +-
 sys/Graphics_record.cpp                            |    39 +-
 sys/Graphics_text.cpp                              |  1349 +-
 sys/Graphics_utils.cpp                             |   330 +-
 sys/Gui.cpp                                        |    16 +-
 sys/Gui.h                                          |   425 +-
 sys/GuiButton.cpp                                  |    84 +-
 sys/GuiCheckButton.cpp                             |    64 +-
 sys/GuiControl.cpp                                 |   144 +-
 sys/GuiDialog.cpp                                  |    38 +-
 sys/GuiDrawingArea.cpp                             |   154 +-
 sys/GuiFileSelect.cpp                              |   203 +-
 sys/GuiForm.cpp                                    |    10 +-
 sys/GuiLabel.cpp                                   |    52 +-
 sys/GuiList.cpp                                    |   373 +-
 sys/GuiMenu.cpp                                    |   226 +-
 sys/GuiMenuItem.cpp                                |   181 +-
 sys/GuiObject.cpp                                  |     6 +-
 sys/GuiOptionMenu.cpp                              |   116 +-
 sys/GuiP.h                                         |    21 +-
 sys/GuiProgressBar.cpp                             |    28 +-
 sys/GuiRadioButton.cpp                             |   118 +-
 sys/GuiScale.cpp                                   |    30 +-
 sys/GuiScrollBar.cpp                               |    69 +-
 sys/GuiScrolledWindow.cpp                          |    18 +-
 sys/GuiShell.cpp                                   |    60 +-
 sys/GuiText.cpp                                    |  1008 +-
 sys/GuiThing.cpp                                   |    50 +-
 sys/GuiWindow.cpp                                  |   105 +-
 sys/HyperPage.cpp                                  |   334 +-
 sys/HyperPage.h                                    |   152 +-
 sys/HyperPage_prefs.h                              |     9 +-
 sys/InfoEditor.cpp                                 |    18 +-
 sys/InfoEditor.h                                   |    15 +-
 sys/Interpreter.cpp                                |  1420 +-
 sys/Interpreter.h                                  |    96 +-
 sys/Makefile                                       |     4 +-
 sys/ManPage.h                                      |    18 +-
 sys/ManPage_enums.h                                |    54 +-
 sys/ManPages.cpp                                   |   558 +-
 sys/ManPages.h                                     |    33 +-
 sys/ManPagesM.h                                    |     6 +-
 sys/Manual.cpp                                     |   297 +-
 sys/Manual.h                                       |    67 +-
 sys/MelderThread.h                                 |    12 +-
 sys/Picture.cpp                                    |   108 +-
 sys/Picture.h                                      |    12 +-
 sys/Preferences.cpp                                |   143 +-
 sys/Preferences.h                                  |    42 +-
 sys/Printer.cpp                                    |   110 +-
 sys/Printer.h                                      |    10 +-
 sys/Script.cpp                                     |     2 +-
 sys/Script.h                                       |     8 +-
 sys/ScriptEditor.cpp                               |   269 +-
 sys/ScriptEditor.h                                 |    42 +-
 sys/Simple.cpp                                     |    14 +-
 sys/Simple.h                                       |    12 +-
 sys/Simple_def.h                                   |    10 +-
 sys/Strings.cpp                                    |   135 +-
 sys/StringsEditor.cpp                              |    60 +-
 sys/StringsEditor.h                                |    24 +-
 sys/Strings_.h                                     |    12 +-
 sys/Strings_def.h                                  |    13 +-
 sys/TextEditor.cpp                                 |   432 +-
 sys/TextEditor.h                                   |    53 +-
 sys/TextEditor_prefs.h                             |     7 +-
 sys/Thing.cpp                                      |   133 +-
 sys/Thing.h                                        |   341 +-
 sys/Ui.cpp                                         |   774 +-
 sys/Ui.h                                           |   235 +-
 sys/UiFile.cpp                                     |    90 +-
 sys/UiPause.cpp                                    |   177 +-
 sys/UiPause.h                                      |    36 +-
 sys/abcio.cpp                                      |  1797 +-
 sys/abcio.h                                        |   204 +-
 sys/abcio_enums.h                                  |    18 +-
 sys/enums.h                                        |     6 +-
 sys/enums_getText.h                                |     4 +-
 sys/enums_getValue.h                               |    12 +-
 sys/lispio.cpp                                     |   145 -
 sys/lispio.h                                       |   109 -
 sys/machine.cpp                                    |    10 +-
 sys/machine.h                                      |    10 +-
 sys/melder.cpp                                     |  1080 +-
 sys/melder.h                                       |  1584 +-
 sys/melder_alloc.cpp                               |   347 +-
 sys/melder_atof.cpp                                |   106 +-
 sys/melder_audio.cpp                               |   724 +-
 sys/melder_audiofiles.cpp                          |   447 +-
 sys/melder_console.cpp                             |    34 +-
 sys/melder_debug.cpp                               |   576 +-
 sys/melder_enums.h                                 |   108 +-
 sys/melder_error.cpp                               |   453 +-
 sys/melder_files.cpp                               |   567 +-
 sys/melder_ftoa.cpp                                |   401 +-
 sys/melder_info.cpp                                |   775 +-
 sys/melder_quantity.cpp                            |    24 +-
 sys/melder_readtext.cpp                            |   256 +-
 sys/melder_strings.cpp                             |  1334 +-
 sys/melder_sysenv.cpp                              |    45 +-
 sys/melder_textencoding.cpp                        |   536 +-
 sys/melder_time.cpp                                |     4 +-
 sys/melder_token.cpp                               |    48 +-
 sys/melder_writetext.cpp                           |   642 +-
 sys/motifEmulator.cpp                              |   656 +-
 sys/oo.h                                           |    47 +-
 sys/oo_CAN_WRITE_AS_ENCODING.h                     |    25 +-
 sys/oo_COPY.h                                      |    22 +-
 sys/oo_DESCRIPTION.h                               |   252 +-
 sys/oo_DESTROY.h                                   |    13 +-
 sys/oo_EQUAL.h                                     |    20 +-
 sys/oo_READ_BINARY.h                               |    73 +-
 sys/oo_READ_TEXT.h                                 |    75 +-
 sys/oo_WRITE_BINARY.h                              |    16 +-
 sys/oo_WRITE_TEXT.h                                |    82 +-
 sys/oo_undef.h                                     |    10 +-
 sys/praat.cpp                                      |  1513 +-
 sys/praat.h                                        |   173 +-
 sys/praatP.h                                       |    99 +-
 sys/praat_actions.cpp                              |   387 +-
 sys/praat_logo.cpp                                 |    26 +-
 sys/praat_menuCommands.cpp                         |   210 +-
 sys/praat_objectMenus.cpp                          |   737 +-
 sys/praat_picture.cpp                              |  1411 +-
 sys/praat_script.cpp                               |   470 +-
 sys/praat_script.h                                 |    22 +-
 sys/praat_statistics.cpp                           |   132 +-
 sys/praat_version.h                                |     8 +-
 sys/prefs.h                                        |    34 +-
 sys/prefs_copyToInstance.h                         |    16 +-
 sys/prefs_define.h                                 |    40 +-
 sys/prefs_install.h                                |    32 +-
 sys/sendpraat.c                                    |    20 +-
 sys/sendsocket.c                                   |    10 +-
 sys/site.cpp                                       |    14 +-
 sys/site.h                                         |     8 +-
 sys/winport_off.h                                  |     3 +-
 sys/winport_on.h                                   |     3 +-
 test/fon/data.praat                                |   Bin 13426 -> 13494 bytes
 test/kar/unicode.praat                             |   Bin 9014 -> 9020 bytes
 .../kar/\303\245b\303\247\303\251\303\274.wav"     |   Bin
 test/manually/demo_pdf.praat                       |     6 +
 test/manually/testCommandLineCalls.praat           |    33 +
 test/num/fisherQ.praat                             |     2 +-
 test/num/mathFunctions.praat                       |     4 +-
 test/runAllTests.praat                             |    88 +-
 test/{test.txt => test.praat}                      |     0
 852 files changed, 90441 insertions(+), 92904 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2ed53df
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,20 @@
+# Intermediate build products for Windows and Linux
+*.o
+*.a
+
+*.xcodeproj/
+
+# Intermediate build products for MacOSX
+DerivedData
+
+# OSX-specific files
+.DS_Store
+
+# editor temporaries
+*.kate-swp
+*.orig
+
+# Praat temporary files
+*kanweg*
+
+makefile.defs
diff --git a/EEG/EEG.cpp b/EEG/EEG.cpp
index 9c9253a..22ea457 100644
--- a/EEG/EEG.cpp
+++ b/EEG/EEG.cpp
@@ -1,6 +1,6 @@
 /* EEG.cpp
  *
- * Copyright (C) 2011-2012,2013,2014 Paul Boersma
+ * Copyright (C) 2011-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -42,33 +42,33 @@
 Thing_implement (EEG, Function, 0);
 
 void structEEG :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (our xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (our xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (our xmax - our xmin), L" seconds");
-	if (our sound != NULL) {
-		MelderInfo_writeLine (L"Time sampling of the signal:");
-		MelderInfo_writeLine (L"   Number of samples: ", Melder_integer (our sound -> nx));
-		MelderInfo_writeLine (L"   Sampling period: ", Melder_double (our sound -> dx), L" seconds");
-		MelderInfo_writeLine (L"   Sampling frequency: ", Melder_single (1.0 / our sound -> dx), L" Hz");
-		MelderInfo_writeLine (L"   First sample centred at: ", Melder_double (our sound -> x1), L" seconds");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", our xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", our xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", our xmax - our xmin, U" seconds");
+	if (our sound) {
+		MelderInfo_writeLine (U"Time sampling of the signal:");
+		MelderInfo_writeLine (U"   Number of samples: ", our sound -> nx);
+		MelderInfo_writeLine (U"   Sampling period: ", our sound -> dx, U" seconds");
+		MelderInfo_writeLine (U"   Sampling frequency: ", Melder_single (1.0 / our sound -> dx), U" Hz");
+		MelderInfo_writeLine (U"   First sample centred at: ", our sound -> x1, U" seconds");
 	}
-	MelderInfo_writeLine (L"Number of cap electrodes: ", Melder_integer (EEG_getNumberOfCapElectrodes (this)));
-	MelderInfo_writeLine (L"Number of external electrodes: ", Melder_integer (EEG_getNumberOfExternalElectrodes (this)));
-	MelderInfo_writeLine (L"Number of extra sensors: ", Melder_integer (EEG_getNumberOfExtraSensors (this)));
+	MelderInfo_writeLine (U"Number of cap electrodes: ", EEG_getNumberOfCapElectrodes (this));
+	MelderInfo_writeLine (U"Number of external electrodes: ", EEG_getNumberOfExternalElectrodes (this));
+	MelderInfo_writeLine (U"Number of extra sensors: ", EEG_getNumberOfExtraSensors (this));
 }
 
 void structEEG :: v_shiftX (double xfrom, double xto) {
 	EEG_Parent :: v_shiftX (xfrom, xto);
-	if (our sound    != NULL)  Function_shiftXTo (our sound,    xfrom, xto);
-	if (our textgrid != NULL)  Function_shiftXTo (our textgrid, xfrom, xto);
+	if (our sound   )  Function_shiftXTo (our sound,    xfrom, xto);
+	if (our textgrid)  Function_shiftXTo (our textgrid, xfrom, xto);
 }
 
 void structEEG :: v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto) {
 	EEG_Parent :: v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	if (our sound    != NULL)  our sound    -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	if (our textgrid != NULL)  our textgrid -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
+	if (our sound   )  our sound    -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
+	if (our textgrid)  our textgrid -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
 }
 
 void EEG_init (EEG me, double tmin, double tmax) {
@@ -82,13 +82,13 @@ EEG EEG_create (double tmin, double tmax) {
 		EEG_init (me.peek(), tmin, tmax);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("EEG object not created.");
+		Melder_throw (U"EEG object not created.");
 	}
 }
 
-long EEG_getChannelNumber (EEG me, const wchar_t *channelName) {
+long EEG_getChannelNumber (EEG me, const char32 *channelName) {
 	for (long ichan = 1; ichan <= my numberOfChannels; ichan ++) {
-		if (Melder_wcsequ (my channelNames [ichan], channelName)) {
+		if (Melder_equ (my channelNames [ichan], channelName)) {
 			return ichan;
 		}
 	}
@@ -102,31 +102,31 @@ EEG EEG_readFromBdfFile (MelderFile file) {
 		fread (buffer, 1, 8, f); buffer [8] = '\0';
 		bool is24bit = buffer [0] == (char) 255;
 		fread (buffer, 1, 80, f); buffer [80] = '\0';
-		trace ("Local subject identification: \"%s\"", buffer);
+		trace (U"Local subject identification: \"", Melder_peek8to32 (buffer), U"\"");
 		fread (buffer, 1, 80, f); buffer [80] = '\0';
-		trace ("Local recording identification: \"%s\"", buffer);
+		trace (U"Local recording identification: \"", Melder_peek8to32 (buffer), U"\"");
 		fread (buffer, 1, 8, f); buffer [8] = '\0';
-		trace ("Start date of recording: \"%s\"", buffer);
+		trace (U"Start date of recording: \"", Melder_peek8to32 (buffer), U"\"");
 		fread (buffer, 1, 8, f); buffer [8] = '\0';
-		trace ("Start time of recording: \"%s\"", buffer);
+		trace (U"Start time of recording: \"", Melder_peek8to32 (buffer), U"\"");
 		fread (buffer, 1, 8, f); buffer [8] = '\0';
 		long numberOfBytesInHeaderRecord = atol (buffer);
-		trace ("Number of bytes in header record: %ld", numberOfBytesInHeaderRecord);
+		trace (U"Number of bytes in header record: ", numberOfBytesInHeaderRecord);
 		fread (buffer, 1, 44, f); buffer [44] = '\0';
-		trace ("Version of data format: \"%s\"", buffer);
+		trace (U"Version of data format: \"", Melder_peek8to32 (buffer), U"\"");
 		fread (buffer, 1, 8, f); buffer [8] = '\0';
-		long numberOfDataRecords = strtol (buffer, NULL, 10);
-		trace ("Number of data records: %ld", numberOfDataRecords);
+		long numberOfDataRecords = strtol (buffer, nullptr, 10);
+		trace (U"Number of data records: ", numberOfDataRecords);
 		fread (buffer, 1, 8, f); buffer [8] = '\0';
 		double durationOfDataRecord = atof (buffer);
-		trace ("Duration of a data record: \"%f\"", durationOfDataRecord);
+		trace (U"Duration of a data record: ", durationOfDataRecord);
 		fread (buffer, 1, 4, f); buffer [4] = '\0';
 		long numberOfChannels = atol (buffer);
-		trace ("Number of channels in data record: %ld", numberOfChannels);
+		trace (U"Number of channels in data record: ", numberOfChannels);
 		if (numberOfBytesInHeaderRecord != (numberOfChannels + 1) * 256)
-			Melder_throw ("Number of bytes in header record (", numberOfBytesInHeaderRecord,
-				") doesn't match number of channels (", numberOfChannels, ").");
-		autostringvector channelNames (1, numberOfChannels);
+			Melder_throw (U"Number of bytes in header record (", numberOfBytesInHeaderRecord,
+				U") doesn't match number of channels (", numberOfChannels, U").");
+		autostring32vector channelNames (1, numberOfChannels);
 		for (long ichannel = 1; ichannel <= numberOfChannels; ichannel ++) {
 			fread (buffer, 1, 16, f); buffer [16] = '\0';   // labels of the channels
 			/*
@@ -139,10 +139,10 @@ EEG EEG_readFromBdfFile (MelderFile file) {
 					break;
 				}
 			}
-			channelNames [ichannel] = Melder_wcsdup (Melder_peekUtf8ToWcs (buffer));
-			trace ("Channel <<%ls>>", channelNames [ichannel]);
+			channelNames [ichannel] = Melder_8to32 (buffer);
+			trace (U"Channel <<", channelNames [ichannel], U">>");
 		}
-		bool hasLetters = wcsequ (channelNames [numberOfChannels], L"EDF Annotations");
+		bool hasLetters = str32equ (channelNames [numberOfChannels], U"EDF Annotations");
 		double samplingFrequency = NUMundefined;
 		for (long channel = 1; channel <= numberOfChannels; channel ++) {
 			fread (buffer, 1, 80, f); buffer [80] = '\0';   // transducer type
@@ -182,9 +182,9 @@ EEG EEG_readFromBdfFile (MelderFile file) {
 				samplingFrequency = numberOfSamplesInThisDataRecord / durationOfDataRecord;
 			}
 			if (numberOfSamplesInThisDataRecord / durationOfDataRecord != samplingFrequency)
-				Melder_throw (L"Number of samples per data record in channel ", channel,
-					" (", numberOfSamplesInThisDataRecord,
-					") doesn't match sampling frequency of channel 1 (", samplingFrequency, ").");
+				Melder_throw (U"Number of samples per data record in channel ", channel,
+					U" (", numberOfSamplesInThisDataRecord,
+					U") doesn't match sampling frequency of channel 1 (", samplingFrequency, U").");
 		}
 		for (long channel = 1; channel <= numberOfChannels; channel ++) {
 			fread (buffer, 1, 32, f); buffer [32] = '\0';   // reserved
@@ -217,9 +217,9 @@ EEG EEG_readFromBdfFile (MelderFile file) {
 					for (long i = 1; i <= numberOfSamplesPerDataRecord; i ++) {
 						long sample = i + (record - 1) * numberOfSamplesPerDataRecord;
 						Melder_assert (sample <= my nx);
-						uint8_t lowByte = *p ++, highByte = *p ++;
-						uint16_t externalValue = ((uint16_t) highByte << 8) | (uint16_t) lowByte;
-						my z [channel] [sample] = (int16_t) externalValue * factor;
+						uint8 lowByte = *p ++, highByte = *p ++;
+						uint16 externalValue = (uint16) ((uint16) highByte << 8) | (uint16) lowByte;
+						my z [channel] [sample] = (int16) externalValue * factor;
 					}
 				}
 			}
@@ -233,23 +233,23 @@ EEG EEG_readFromBdfFile (MelderFile file) {
 		}
 		autoTextGrid thee;
 		if (hasLetters) {
-			thee.reset (TextGrid_create (0, duration, L"Mark Trigger", L"Mark Trigger"));
+			thee.reset (TextGrid_create (0, duration, U"Mark Trigger", U"Mark Trigger"));
 			autoMelderString letters;
 			double time = NUMundefined;
 			for (long i = 1; i <= my nx; i ++) {
 				unsigned long value = (long) my z [numberOfChannels] [i];
 				for (int byte = 1; byte <= numberOfStatusBits / 8; byte ++) {
 					unsigned long mask = byte == 1 ? 0x000000ff : 0x0000ff00;
-					wchar_t kar = byte == 1 ? (value & mask) : (value & mask) >> 8;
-					if (kar != '\0' && kar != 20) {
+					char32 kar = byte == 1 ? (value & mask) : (value & mask) >> 8;
+					if (kar != U'\0' && kar != 20) {
 						MelderString_appendCharacter (& letters, kar);
-					} else if (letters. string [0] != '\0') {
-						if (letters. string [0] == '+') {
+					} else if (letters. string [0] != U'\0') {
+						if (letters. string [0] == U'+') {
 							if (NUMdefined (time)) {
 								try {
-									TextGrid_insertPoint (thee.peek(), 1, time, L"");
+									TextGrid_insertPoint (thee.peek(), 1, time, U"");
 								} catch (MelderError) {
-									Melder_throw ("Did not insert empty mark (", letters. string, ") on Mark tier.");
+									Melder_throw (U"Did not insert empty mark (", letters. string, U") on Mark tier.");
 								}
 								time = NUMundefined;   // defensive
 							}
@@ -257,21 +257,21 @@ EEG EEG_readFromBdfFile (MelderFile file) {
 							MelderString_empty (& letters);
 						} else {
 							if (! NUMdefined (time)) {
-								Melder_throw ("Undefined time for label at sample ", i, ".");
+								Melder_throw (U"Undefined time for label at sample ", i, U".");
 							}
 							try {
-								if (Melder_wcsnequ (letters. string, L"Trigger-", 8)) {
+								if (Melder_nequ (letters. string, U"Trigger-", 8)) {
 									try {
 										TextGrid_insertPoint (thee.peek(), 2, time, & letters. string [8]);
 									} catch (MelderError) {
 										Melder_clearError ();
-										trace ("Duplicate trigger at %f seconds: %ls", time, & letters. string [8]);
+										trace (U"Duplicate trigger at ", time, U" seconds: ", & letters. string [8]);
 									}
 								} else {
 									TextGrid_insertPoint (thee.peek(), 1, time, & letters. string [0]);
 								}
 							} catch (MelderError) {
-								Melder_throw ("Did not insert mark (", letters. string, ") on Trigger tier.");
+								Melder_throw (U"Did not insert mark (", letters. string, U") on Trigger tier.");
 							}
 							time = NUMundefined;   // crucial
 							MelderString_empty (& letters);
@@ -280,12 +280,12 @@ EEG EEG_readFromBdfFile (MelderFile file) {
 				}
 			}
 			if (NUMdefined (time)) {
-				TextGrid_insertPoint (thee.peek(), 1, time, L"");
+				TextGrid_insertPoint (thee.peek(), 1, time, U"");
 				time = NUMundefined;   // defensive
 			}
 		} else {
 			thee.reset (TextGrid_create (0, duration,
-				numberOfStatusBits == 8 ? L"S1 S2 S3 S4 S5 S6 S7 S8" : L"S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 S16", L""));
+				numberOfStatusBits == 8 ? U"S1 S2 S3 S4 S5 S6 S7 S8" : U"S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 S16", U""));
 			for (int bit = 1; bit <= numberOfStatusBits; bit ++) {
 				unsigned long bitValue = 1 << (bit - 1);
 				IntervalTier tier = (IntervalTier) thy tiers -> item [bit];
@@ -297,7 +297,7 @@ EEG EEG_readFromBdfFile (MelderFile file) {
 						if (time != 0.0)
 							TextGrid_insertBoundary (thee.peek(), bit, time);
 						if ((thisValue & bitValue) != 0)
-							TextGrid_setIntervalText (thee.peek(), bit, tier -> intervals -> size, L"1");
+							TextGrid_setIntervalText (thee.peek(), bit, tier -> intervals -> size, U"1");
 					}
 				}
 			}
@@ -307,107 +307,107 @@ EEG EEG_readFromBdfFile (MelderFile file) {
 		his sound = me.transfer();
 		his textgrid = thee.transfer();
 		if (EEG_getNumberOfCapElectrodes (him.peek()) == 32) {
-			EEG_setChannelName (him.peek(), 1, L"Fp1");
-			EEG_setChannelName (him.peek(), 2, L"AF3");
-			EEG_setChannelName (him.peek(), 3, L"F7");
-			EEG_setChannelName (him.peek(), 4, L"F3");
-			EEG_setChannelName (him.peek(), 5, L"FC1");
-			EEG_setChannelName (him.peek(), 6, L"FC5");
-			EEG_setChannelName (him.peek(), 7, L"T7");
-			EEG_setChannelName (him.peek(), 8, L"C3");
-			EEG_setChannelName (him.peek(), 9, L"CP1");
-			EEG_setChannelName (him.peek(), 10, L"CP5");
-			EEG_setChannelName (him.peek(), 11, L"P7");
-			EEG_setChannelName (him.peek(), 12, L"P3");
-			EEG_setChannelName (him.peek(), 13, L"Pz");
-			EEG_setChannelName (him.peek(), 14, L"PO3");
-			EEG_setChannelName (him.peek(), 15, L"O1");
-			EEG_setChannelName (him.peek(), 16, L"Oz");
-			EEG_setChannelName (him.peek(), 17, L"O2");
-			EEG_setChannelName (him.peek(), 18, L"PO4");
-			EEG_setChannelName (him.peek(), 19, L"P4");
-			EEG_setChannelName (him.peek(), 20, L"P8");
-			EEG_setChannelName (him.peek(), 21, L"CP6");
-			EEG_setChannelName (him.peek(), 22, L"CP2");
-			EEG_setChannelName (him.peek(), 23, L"C4");
-			EEG_setChannelName (him.peek(), 24, L"T8");
-			EEG_setChannelName (him.peek(), 25, L"FC6");
-			EEG_setChannelName (him.peek(), 26, L"FC2");
-			EEG_setChannelName (him.peek(), 27, L"F4");
-			EEG_setChannelName (him.peek(), 28, L"F8");
-			EEG_setChannelName (him.peek(), 29, L"AF4");
-			EEG_setChannelName (him.peek(), 30, L"Fp2");
-			EEG_setChannelName (him.peek(), 31, L"Fz");
-			EEG_setChannelName (him.peek(), 32, L"Cz");
+			EEG_setChannelName (him.peek(), 1, U"Fp1");
+			EEG_setChannelName (him.peek(), 2, U"AF3");
+			EEG_setChannelName (him.peek(), 3, U"F7");
+			EEG_setChannelName (him.peek(), 4, U"F3");
+			EEG_setChannelName (him.peek(), 5, U"FC1");
+			EEG_setChannelName (him.peek(), 6, U"FC5");
+			EEG_setChannelName (him.peek(), 7, U"T7");
+			EEG_setChannelName (him.peek(), 8, U"C3");
+			EEG_setChannelName (him.peek(), 9, U"CP1");
+			EEG_setChannelName (him.peek(), 10, U"CP5");
+			EEG_setChannelName (him.peek(), 11, U"P7");
+			EEG_setChannelName (him.peek(), 12, U"P3");
+			EEG_setChannelName (him.peek(), 13, U"Pz");
+			EEG_setChannelName (him.peek(), 14, U"PO3");
+			EEG_setChannelName (him.peek(), 15, U"O1");
+			EEG_setChannelName (him.peek(), 16, U"Oz");
+			EEG_setChannelName (him.peek(), 17, U"O2");
+			EEG_setChannelName (him.peek(), 18, U"PO4");
+			EEG_setChannelName (him.peek(), 19, U"P4");
+			EEG_setChannelName (him.peek(), 20, U"P8");
+			EEG_setChannelName (him.peek(), 21, U"CP6");
+			EEG_setChannelName (him.peek(), 22, U"CP2");
+			EEG_setChannelName (him.peek(), 23, U"C4");
+			EEG_setChannelName (him.peek(), 24, U"T8");
+			EEG_setChannelName (him.peek(), 25, U"FC6");
+			EEG_setChannelName (him.peek(), 26, U"FC2");
+			EEG_setChannelName (him.peek(), 27, U"F4");
+			EEG_setChannelName (him.peek(), 28, U"F8");
+			EEG_setChannelName (him.peek(), 29, U"AF4");
+			EEG_setChannelName (him.peek(), 30, U"Fp2");
+			EEG_setChannelName (him.peek(), 31, U"Fz");
+			EEG_setChannelName (him.peek(), 32, U"Cz");
 		} else if (EEG_getNumberOfCapElectrodes (him.peek()) == 64) {
-			EEG_setChannelName (him.peek(), 1, L"Fp1");
-			EEG_setChannelName (him.peek(), 2, L"AF7");
-			EEG_setChannelName (him.peek(), 3, L"AF3");
-			EEG_setChannelName (him.peek(), 4, L"F1");
-			EEG_setChannelName (him.peek(), 5, L"F3");
-			EEG_setChannelName (him.peek(), 6, L"F5");
-			EEG_setChannelName (him.peek(), 7, L"F7");
-			EEG_setChannelName (him.peek(), 8, L"FT7");
-			EEG_setChannelName (him.peek(), 9, L"FC5");
-			EEG_setChannelName (him.peek(), 10, L"FC3");
-			EEG_setChannelName (him.peek(), 11, L"FC1");
-			EEG_setChannelName (him.peek(), 12, L"C1");
-			EEG_setChannelName (him.peek(), 13, L"C3");
-			EEG_setChannelName (him.peek(), 14, L"C5");
-			EEG_setChannelName (him.peek(), 15, L"T7");
-			EEG_setChannelName (him.peek(), 16, L"TP7");
-			EEG_setChannelName (him.peek(), 17, L"CP5");
-			EEG_setChannelName (him.peek(), 18, L"CP3");
-			EEG_setChannelName (him.peek(), 19, L"CP1");
-			EEG_setChannelName (him.peek(), 20, L"P1");
-			EEG_setChannelName (him.peek(), 21, L"P3");
-			EEG_setChannelName (him.peek(), 22, L"P5");
-			EEG_setChannelName (him.peek(), 23, L"P7");
-			EEG_setChannelName (him.peek(), 24, L"P9");
-			EEG_setChannelName (him.peek(), 25, L"PO7");
-			EEG_setChannelName (him.peek(), 26, L"PO3");
-			EEG_setChannelName (him.peek(), 27, L"O1");
-			EEG_setChannelName (him.peek(), 28, L"Iz");
-			EEG_setChannelName (him.peek(), 29, L"Oz");
-			EEG_setChannelName (him.peek(), 30, L"POz");
-			EEG_setChannelName (him.peek(), 31, L"Pz");
-			EEG_setChannelName (him.peek(), 32, L"CPz");
-			EEG_setChannelName (him.peek(), 33, L"Fpz");
-			EEG_setChannelName (him.peek(), 34, L"Fp2");
-			EEG_setChannelName (him.peek(), 35, L"AF8");
-			EEG_setChannelName (him.peek(), 36, L"AF4");
-			EEG_setChannelName (him.peek(), 37, L"AFz");
-			EEG_setChannelName (him.peek(), 38, L"Fz");
-			EEG_setChannelName (him.peek(), 39, L"F2");
-			EEG_setChannelName (him.peek(), 40, L"F4");
-			EEG_setChannelName (him.peek(), 41, L"F6");
-			EEG_setChannelName (him.peek(), 42, L"F8");
-			EEG_setChannelName (him.peek(), 43, L"FT8");
-			EEG_setChannelName (him.peek(), 44, L"FC6");
-			EEG_setChannelName (him.peek(), 45, L"FC4");
-			EEG_setChannelName (him.peek(), 46, L"FC2");
-			EEG_setChannelName (him.peek(), 47, L"FCz");
-			EEG_setChannelName (him.peek(), 48, L"Cz");
-			EEG_setChannelName (him.peek(), 49, L"C2");
-			EEG_setChannelName (him.peek(), 50, L"C4");
-			EEG_setChannelName (him.peek(), 51, L"C6");
-			EEG_setChannelName (him.peek(), 52, L"T8");
-			EEG_setChannelName (him.peek(), 53, L"TP8");
-			EEG_setChannelName (him.peek(), 54, L"CP6");
-			EEG_setChannelName (him.peek(), 55, L"CP4");
-			EEG_setChannelName (him.peek(), 56, L"CP2");
-			EEG_setChannelName (him.peek(), 57, L"P2");
-			EEG_setChannelName (him.peek(), 58, L"P4");
-			EEG_setChannelName (him.peek(), 59, L"P6");
-			EEG_setChannelName (him.peek(), 60, L"P8");
-			EEG_setChannelName (him.peek(), 61, L"P10");
-			EEG_setChannelName (him.peek(), 62, L"PO8");
-			EEG_setChannelName (him.peek(), 63, L"PO4");
-			EEG_setChannelName (him.peek(), 64, L"O2");
+			EEG_setChannelName (him.peek(), 1, U"Fp1");
+			EEG_setChannelName (him.peek(), 2, U"AF7");
+			EEG_setChannelName (him.peek(), 3, U"AF3");
+			EEG_setChannelName (him.peek(), 4, U"F1");
+			EEG_setChannelName (him.peek(), 5, U"F3");
+			EEG_setChannelName (him.peek(), 6, U"F5");
+			EEG_setChannelName (him.peek(), 7, U"F7");
+			EEG_setChannelName (him.peek(), 8, U"FT7");
+			EEG_setChannelName (him.peek(), 9, U"FC5");
+			EEG_setChannelName (him.peek(), 10, U"FC3");
+			EEG_setChannelName (him.peek(), 11, U"FC1");
+			EEG_setChannelName (him.peek(), 12, U"C1");
+			EEG_setChannelName (him.peek(), 13, U"C3");
+			EEG_setChannelName (him.peek(), 14, U"C5");
+			EEG_setChannelName (him.peek(), 15, U"T7");
+			EEG_setChannelName (him.peek(), 16, U"TP7");
+			EEG_setChannelName (him.peek(), 17, U"CP5");
+			EEG_setChannelName (him.peek(), 18, U"CP3");
+			EEG_setChannelName (him.peek(), 19, U"CP1");
+			EEG_setChannelName (him.peek(), 20, U"P1");
+			EEG_setChannelName (him.peek(), 21, U"P3");
+			EEG_setChannelName (him.peek(), 22, U"P5");
+			EEG_setChannelName (him.peek(), 23, U"P7");
+			EEG_setChannelName (him.peek(), 24, U"P9");
+			EEG_setChannelName (him.peek(), 25, U"PO7");
+			EEG_setChannelName (him.peek(), 26, U"PO3");
+			EEG_setChannelName (him.peek(), 27, U"O1");
+			EEG_setChannelName (him.peek(), 28, U"Iz");
+			EEG_setChannelName (him.peek(), 29, U"Oz");
+			EEG_setChannelName (him.peek(), 30, U"POz");
+			EEG_setChannelName (him.peek(), 31, U"Pz");
+			EEG_setChannelName (him.peek(), 32, U"CPz");
+			EEG_setChannelName (him.peek(), 33, U"Fpz");
+			EEG_setChannelName (him.peek(), 34, U"Fp2");
+			EEG_setChannelName (him.peek(), 35, U"AF8");
+			EEG_setChannelName (him.peek(), 36, U"AF4");
+			EEG_setChannelName (him.peek(), 37, U"AFz");
+			EEG_setChannelName (him.peek(), 38, U"Fz");
+			EEG_setChannelName (him.peek(), 39, U"F2");
+			EEG_setChannelName (him.peek(), 40, U"F4");
+			EEG_setChannelName (him.peek(), 41, U"F6");
+			EEG_setChannelName (him.peek(), 42, U"F8");
+			EEG_setChannelName (him.peek(), 43, U"FT8");
+			EEG_setChannelName (him.peek(), 44, U"FC6");
+			EEG_setChannelName (him.peek(), 45, U"FC4");
+			EEG_setChannelName (him.peek(), 46, U"FC2");
+			EEG_setChannelName (him.peek(), 47, U"FCz");
+			EEG_setChannelName (him.peek(), 48, U"Cz");
+			EEG_setChannelName (him.peek(), 49, U"C2");
+			EEG_setChannelName (him.peek(), 50, U"C4");
+			EEG_setChannelName (him.peek(), 51, U"C6");
+			EEG_setChannelName (him.peek(), 52, U"T8");
+			EEG_setChannelName (him.peek(), 53, U"TP8");
+			EEG_setChannelName (him.peek(), 54, U"CP6");
+			EEG_setChannelName (him.peek(), 55, U"CP4");
+			EEG_setChannelName (him.peek(), 56, U"CP2");
+			EEG_setChannelName (him.peek(), 57, U"P2");
+			EEG_setChannelName (him.peek(), 58, U"P4");
+			EEG_setChannelName (him.peek(), 59, U"P6");
+			EEG_setChannelName (him.peek(), 60, U"P8");
+			EEG_setChannelName (him.peek(), 61, U"P10");
+			EEG_setChannelName (him.peek(), 62, U"PO8");
+			EEG_setChannelName (him.peek(), 63, U"PO4");
+			EEG_setChannelName (him.peek(), 64, U"O2");
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("BDF file not read.");
+		Melder_throw (U"BDF file not read.");
 	}
 }
 
@@ -436,7 +436,7 @@ void EEG_filter (EEG me, double lowFrequency, double lowWidth, double highFreque
 */
 		for (long ichan = 1; ichan <= my numberOfChannels - EEG_getNumberOfExtraSensors (me); ichan ++) {
 			autoSound channel = Sound_extractChannel (my sound, ichan);
-			autoSpectrum spec = Sound_to_Spectrum (channel.peek(), TRUE);
+			autoSpectrum spec = Sound_to_Spectrum (channel.peek(), true);
 			Spectrum_passHannBand (spec.peek(), lowFrequency, 0.0, lowWidth);
 			Spectrum_passHannBand (spec.peek(), 0.0, highFrequency, highWidth);
 			if (doNotch50Hz) {
@@ -446,22 +446,22 @@ void EEG_filter (EEG me, double lowFrequency, double lowWidth, double highFreque
 			NUMvector_copyElements (his z [1], my sound -> z [ichan], 1, my sound -> nx);
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered.");
+		Melder_throw (me, U": not filtered.");
 	}
 }
 
-void EEG_setChannelName (EEG me, long channelNumber, const wchar_t *a_name) {
-	autostring l_name = Melder_wcsdup (a_name);
+void EEG_setChannelName (EEG me, long channelNumber, const char32 *a_name) {
+	autostring32 l_name = Melder_dup (a_name);
 	Melder_free (my channelNames [channelNumber]);
 	my channelNames [channelNumber] = l_name.transfer();
 }
 
 void EEG_setExternalElectrodeNames (EEG me,
-	const wchar_t *nameExg1, const wchar_t *nameExg2, const wchar_t *nameExg3, const wchar_t *nameExg4,
-	const wchar_t *nameExg5, const wchar_t *nameExg6, const wchar_t *nameExg7, const wchar_t *nameExg8)
+	const char32 *nameExg1, const char32 *nameExg2, const char32 *nameExg3, const char32 *nameExg4,
+	const char32 *nameExg5, const char32 *nameExg6, const char32 *nameExg7, const char32 *nameExg8)
 {
 	if (EEG_getNumberOfExternalElectrodes (me) != 8)
-		Melder_throw (L"There aren't 8 external electrodes.");
+		Melder_throw (U"There aren't 8 external electrodes.");
 	const long firstExternalElectrode = EEG_getNumberOfCapElectrodes (me) + 1;
 	EEG_setChannelName (me, firstExternalElectrode, nameExg1);
 	EEG_setChannelName (me, firstExternalElectrode + 1, nameExg2);
@@ -473,13 +473,13 @@ void EEG_setExternalElectrodeNames (EEG me,
 	EEG_setChannelName (me, firstExternalElectrode + 7, nameExg8);
 }
 
-void EEG_subtractReference (EEG me, const wchar_t *channelNumber1_text, const wchar_t *channelNumber2_text) {
+void EEG_subtractReference (EEG me, const char32 *channelNumber1_text, const char32 *channelNumber2_text) {
 	long channelNumber1 = EEG_getChannelNumber (me, channelNumber1_text);
 	if (channelNumber1 == 0)
-		Melder_throw (me, ": no channel named \"", channelNumber1_text, "\".");
+		Melder_throw (me, U": no channel named \"", channelNumber1_text, U"\".");
 	long channelNumber2 = EEG_getChannelNumber (me, channelNumber2_text);
 	if (channelNumber2 == 0 && channelNumber2_text [0] != '\0')
-		Melder_throw (me, ": no channel named \"", channelNumber2_text, "\".");
+		Melder_throw (me, U": no channel named \"", channelNumber2_text, U"\".");
 	const long numberOfElectrodeChannels = my numberOfChannels - EEG_getNumberOfExtraSensors (me);
 	for (long isamp = 1; isamp <= my sound -> nx; isamp ++) {
 		double referenceValue = channelNumber2 == 0 ? my sound -> z [channelNumber1] [isamp] :
@@ -492,11 +492,11 @@ void EEG_subtractReference (EEG me, const wchar_t *channelNumber1_text, const wc
 
 void EEG_subtractMeanChannel (EEG me, long fromChannel, long toChannel) {
 	if (fromChannel < 1 || fromChannel > my numberOfChannels)
-		Melder_throw ("No channel ", fromChannel, ".");
+		Melder_throw (U"No channel ", fromChannel, U".");
 	if (toChannel < 1 || toChannel > my numberOfChannels)
-		Melder_throw ("No channel ", toChannel, ".");
+		Melder_throw (U"No channel ", toChannel, U".");
 	if (fromChannel > toChannel)
-		Melder_throw ("Channel range cannot run from ", fromChannel, " to ", toChannel, ". Please reverse.");
+		Melder_throw (U"Channel range cannot run from ", fromChannel, U" to ", toChannel, U". Please reverse.");
 	const long numberOfElectrodeChannels = my numberOfChannels - EEG_getNumberOfExtraSensors (me);
 	for (long isamp = 1; isamp <= my sound -> nx; isamp ++) {
 		double referenceValue = 0.0;
@@ -513,79 +513,79 @@ void EEG_subtractMeanChannel (EEG me, long fromChannel, long toChannel) {
 void EEG_setChannelToZero (EEG me, long channelNumber) {
 	try {
 		if (channelNumber < 1 || channelNumber > my numberOfChannels)
-			Melder_throw ("No channel ", channelNumber, ".");
+			Melder_throw (U"No channel ", channelNumber, U".");
 		long numberOfSamples = my sound -> nx;
 		double *channel = my sound -> z [channelNumber];
 		for (long isample = 1; isample <= numberOfSamples; isample ++) {
 			channel [isample] = 0.0;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": channel ", channelNumber, " not set to zero.");
+		Melder_throw (me, U": channel ", channelNumber, U" not set to zero.");
 	}
 }
 
-void EEG_setChannelToZero (EEG me, const wchar_t *channelName) {
+void EEG_setChannelToZero (EEG me, const char32 *channelName) {
 	try {
 		long channelNumber = EEG_getChannelNumber (me, channelName);
 		if (channelNumber == 0)
-			Melder_throw ("No channel named \"", channelName, "\".");
+			Melder_throw (U"No channel named \"", channelName, U"\".");
 		EEG_setChannelToZero (me, channelNumber);
 	} catch (MelderError) {
-		Melder_throw (me, ": channel ", channelName, " not set to zero.");
+		Melder_throw (me, U": channel ", channelName, U" not set to zero.");
 	}
 }
 
-void EEG_removeTriggers (EEG me, int which_Melder_STRING, const wchar_t *criterion) {
+void EEG_removeTriggers (EEG me, int which_Melder_STRING, const char32 *criterion) {
 	try {
-		if (my textgrid -> numberOfTiers () < 2 || ! Melder_wcsequ (my textgrid -> tier (2) -> name, L"Trigger"))
-			Melder_throw (me, " does not have a Trigger channel.");
-		my textgrid -> removePoints (2, which_Melder_STRING, criterion);
+		if (my textgrid -> numberOfTiers () < 2 || ! Melder_equ (my textgrid -> tier (2) -> name, U"Trigger"))
+			Melder_throw (me, U" does not have a Trigger channel.");
+		TextGrid_removePoints (my textgrid, 2, which_Melder_STRING, criterion);
 	} catch (MelderError) {
-		Melder_throw (me, ": triggers not removed.");
+		Melder_throw (me, U": triggers not removed.");
 	}
 }
 
 EEG EEG_extractChannel (EEG me, long channelNumber) {
 	try {
 		if (channelNumber < 1 || channelNumber > my numberOfChannels)
-			Melder_throw ("No channel ", channelNumber, ".");
+			Melder_throw (U"No channel ", channelNumber, U".");
 		autoEEG thee = EEG_create (my xmin, my xmax);
 		thy numberOfChannels = 1;
-		thy channelNames = NUMvector <wchar_t *> (1, 1);
-		thy channelNames [1] = Melder_wcsdup (my channelNames [1]);
+		thy channelNames = NUMvector <char32 *> (1, 1);
+		thy channelNames [1] = Melder_dup (my channelNames [1]);
 		thy sound = Sound_extractChannel (my sound, channelNumber);
 		thy textgrid = Data_copy (my textgrid);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": channel ", channelNumber, " not extracted.");
+		Melder_throw (me, U": channel ", channelNumber, U" not extracted.");
 	}
 }
 
-EEG EEG_extractChannel (EEG me, const wchar_t *channelName) {
+EEG EEG_extractChannel (EEG me, const char32 *channelName) {
 	try {
 		long channelNumber = EEG_getChannelNumber (me, channelName);
 		if (channelNumber == 0)
-			Melder_throw ("No channel named \"", channelName, "\".");
+			Melder_throw (U"No channel named \"", channelName, U"\".");
 		return EEG_extractChannel (me, channelNumber);
 	} catch (MelderError) {
-		Melder_throw (me, ": channel ", channelName, " not extracted.");
+		Melder_throw (me, U": channel ", channelName, U" not extracted.");
 	}
 }
 
 EEG EEGs_concatenate (Collection me) {
 	try {
 		if (my size < 1)
-			Melder_throw ("Cannot concatenate zero EEG objects.");
+			Melder_throw (U"Cannot concatenate zero EEG objects.");
 		EEG first = (EEG) my item [1];
 		long numberOfChannels = first -> numberOfChannels;
-		wchar_t **channelNames = first -> channelNames;
+		char32 **channelNames = first -> channelNames;
 		for (long ieeg = 2; ieeg <= my size; ieeg ++) {
 			EEG other = (EEG) my item [ieeg];
 			if (other -> numberOfChannels != numberOfChannels)
-				Melder_throw ("The number of channels of ", other, " does not match the number of channels of ", first, ".");
+				Melder_throw (U"The number of channels of ", other, U" does not match the number of channels of ", first, U".");
 			for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-				if (! Melder_wcsequ (other -> channelNames [ichan], channelNames [ichan]))
-					Melder_throw ("Channel ", ichan, " has a different name in ", other, " (", other -> channelNames [ichan], ") than in ", first, " (", channelNames [ichan], ").");
+				if (! Melder_equ (other -> channelNames [ichan], channelNames [ichan]))
+					Melder_throw (U"Channel ", ichan, U" has a different name in ", other, U" (", other -> channelNames [ichan], U") than in ", first, U" (", channelNames [ichan], U").");
 			}
 		}
 		autoOrdered soundCollection = Ordered_create ();
@@ -599,9 +599,9 @@ EEG EEGs_concatenate (Collection me) {
 		}
 		autoEEG thee = Thing_new (EEG);
 		thy numberOfChannels = numberOfChannels;
-		thy channelNames = NUMvector <wchar_t *> (1, numberOfChannels);
+		thy channelNames = NUMvector <char32 *> (1, numberOfChannels);
 		for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-			thy channelNames [ichan] = Melder_wcsdup (channelNames [ichan]);
+			thy channelNames [ichan] = Melder_dup (channelNames [ichan]);
 		}
 		thy sound = Sounds_concatenate_e (soundCollection.peek(), 0.0);
 		thy textgrid = TextGrids_concatenate (textgridCollection.peek());
@@ -609,7 +609,7 @@ EEG EEGs_concatenate (Collection me) {
 		thy xmax = thy textgrid -> xmax;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrids not concatenated.");
+		Melder_throw (U"TextGrids not concatenated.");
 	}
 }
 
@@ -617,9 +617,9 @@ EEG EEG_extractPart (EEG me, double tmin, double tmax, bool preserveTimes) {
 	try {
 		autoEEG thee = Thing_new (EEG);
 		thy numberOfChannels = my numberOfChannels;
-		thy channelNames = NUMvector <wchar_t *> (1, my numberOfChannels);
+		thy channelNames = NUMvector <char32 *> (1, my numberOfChannels);
 		for (long ichan = 1; ichan <= my numberOfChannels; ichan ++) {
-			thy channelNames [ichan] = Melder_wcsdup (my channelNames [ichan]);
+			thy channelNames [ichan] = Melder_dup (my channelNames [ichan]);
 		}
 		thy sound = Sound_extractPart (my sound, tmin, tmax, kSound_windowShape_RECTANGULAR, 1.0, preserveTimes);
 		thy textgrid = TextGrid_extractPart (my textgrid, tmin, tmax, preserveTimes);
@@ -627,7 +627,7 @@ EEG EEG_extractPart (EEG me, double tmin, double tmax, bool preserveTimes) {
 		thy xmax = thy textgrid -> xmax;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": part not extracted.");
+		Melder_throw (me, U": part not extracted.");
 	}
 }
 
@@ -637,7 +637,7 @@ void EEG_replaceTextGrid (EEG me, TextGrid textgrid) {
 		forget (my textgrid);
 		my textgrid = textgrid2.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": TextGrid not replaced with ", textgrid, ".");
+		Melder_throw (me, U": TextGrid not replaced with ", textgrid, U".");
 	}
 }
 
@@ -647,12 +647,12 @@ MixingMatrix EEG_to_MixingMatrix (EEG me, long maxNumberOfIterations, double tol
 		autoMixingMatrix thee = MixingMatrix_create (my sound -> ny, my sound -> ny);
 		for (long ichan = 1; ichan <= my numberOfChannels; ichan ++) {
 			TableOfReal_setRowLabel (thee.peek(), ichan, my channelNames [ichan]);
-			TableOfReal_setColumnLabel (thee.peek(), ichan, Melder_wcscat (L"ic", Melder_integer (ichan)));
+			TableOfReal_setColumnLabel (thee.peek(), ichan, Melder_cat (U"ic", ichan));
 		}
 		MixingMatrix_and_CrossCorrelationTables_improveUnmixing (thee.peek(), tables.peek(), maxNumberOfIterations, tol, method);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MixingMatrix created.");
+		Melder_throw (me, U": no MixingMatrix created.");
 	}
 }
 
diff --git a/EEG/EEG.h b/EEG/EEG.h
index 5bc223f..e3314ab 100644
--- a/EEG/EEG.h
+++ b/EEG/EEG.h
@@ -2,7 +2,7 @@
 #define _EEG_h_
 /* EEG.h
  *
- * Copyright (C) 2011-2012,2014 Paul Boersma
+ * Copyright (C) 2011-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,8 +33,8 @@ EEG EEG_readFromBdfFile (MelderFile file);
 EEG EEGs_concatenate (Collection me);
 
 void EEG_init (EEG me, double tmin, double tmax);
-long EEG_getChannelNumber (EEG me, const wchar_t *channelName);
-void EEG_setChannelName (EEG me, long channelNumber, const wchar_t *a_name);
+long EEG_getChannelNumber (EEG me, const char32 *channelName);
+void EEG_setChannelName (EEG me, long channelNumber, const char32 *a_name);
 static inline long EEG_getNumberOfCapElectrodes (EEG me) {
 	return (my numberOfChannels - 1) & ~ 15L;   // BUG
 }
@@ -44,17 +44,17 @@ static inline long EEG_getNumberOfExtraSensors (EEG me) {
 static inline long EEG_getNumberOfExternalElectrodes (EEG me) {
 	return my numberOfChannels - EEG_getNumberOfCapElectrodes (me) - EEG_getNumberOfExtraSensors (me);
 }
-void EEG_setExternalElectrodeNames (EEG me, const wchar_t *nameExg1, const wchar_t *nameExg2, const wchar_t *nameExg3, const wchar_t *nameExg4,
-	const wchar_t *nameExg5, const wchar_t *nameExg6, const wchar_t *nameExg7, const wchar_t *nameExg8);
+void EEG_setExternalElectrodeNames (EEG me, const char32 *nameExg1, const char32 *nameExg2, const char32 *nameExg3, const char32 *nameExg4,
+	const char32 *nameExg5, const char32 *nameExg6, const char32 *nameExg7, const char32 *nameExg8);
 void EEG_detrend (EEG me);
 void EEG_filter (EEG me, double lowFrequency, double lowWidth, double highFrequency, double highWidth, bool doNotch50Hz);
-void EEG_subtractReference (EEG me, const wchar_t *channelNumber1, const wchar_t *channelNumber2);
+void EEG_subtractReference (EEG me, const char32 *channelNumber1, const char32 *channelNumber2);
 void EEG_subtractMeanChannel (EEG me, long fromChannel, long toChannel);
 void EEG_setChannelToZero (EEG me, long channelNumber);
-void EEG_setChannelToZero (EEG me, const wchar_t *channelName);
-void EEG_removeTriggers (EEG me, int which_Melder_STRING, const wchar_t *criterion);
+void EEG_setChannelToZero (EEG me, const char32 *channelName);
+void EEG_removeTriggers (EEG me, int which_Melder_STRING, const char32 *criterion);
 EEG EEG_extractChannel (EEG me, long channelNumber);
-EEG EEG_extractChannel (EEG me, const wchar_t *channelName);
+EEG EEG_extractChannel (EEG me, const char32 *channelName);
 static inline Sound EEG_extractSound (EEG me) { return Data_copy (my sound); }
 static inline TextGrid EEG_extractTextGrid (EEG me) { return Data_copy (my textgrid); }
 EEG EEG_extractPart (EEG me, double tmin, double tmax, bool preserveTimes);
diff --git a/EEG/EEGWindow.cpp b/EEG/EEGWindow.cpp
index af38765..25cedff 100644
--- a/EEG/EEGWindow.cpp
+++ b/EEG/EEGWindow.cpp
@@ -1,6 +1,6 @@
 /* EEGWindow.cpp
  *
- * Copyright (C) 2011-2012,2013,2014 Paul Boersma
+ * Copyright (C) 2011-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,7 +29,7 @@ Thing_implement (EEGWindow, TextGridEditor, 0);
 #include "prefs_copyToInstance.h"
 #include "EEGWindow_prefs.h"
 
-static void menu_cb_EEGWindowHelp (EDITOR_ARGS) { EDITOR_IAM (EEGWindow); Melder_help (L"EEG window"); }
+static void menu_cb_EEGWindowHelp (EDITOR_ARGS) { EDITOR_IAM (EEGWindow); Melder_help (U"EEG window"); }
 
 void structEEGWindow :: v_createMenus () {
 	EEGWindow_Parent :: v_createMenus ();
@@ -37,54 +37,54 @@ void structEEGWindow :: v_createMenus () {
 
 void structEEGWindow :: v_createHelpMenuItems (EditorMenu menu) {
 	TextGridEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"EEGWindow help", '?', menu_cb_EEGWindowHelp);
+	EditorMenu_addCommand (menu, U"EEGWindow help", '?', menu_cb_EEGWindowHelp);
 }
 
-const wchar_t * structEEGWindow :: v_getChannelName (long channelNumber) {
-	Melder_assert (our d_eeg != NULL);
-	return our d_eeg -> channelNames [channelNumber];
+const char32 * structEEGWindow :: v_getChannelName (long channelNumber) {
+	Melder_assert (our eeg != nullptr);
+	return our eeg -> channelNames [channelNumber];
 }
 
 static void menu_cb_ExtractSelectedEEG_preserveTimes (EDITOR_ARGS) {
 	EDITOR_IAM (EEGWindow);
-	if (my d_endSelection <= my d_startSelection) Melder_throw ("No selection.");
-	autoEEG extract = EEG_extractPart (my d_eeg, my d_startSelection, my d_endSelection, true);
-	my broadcastPublication (extract.transfer());
+	if (my d_endSelection <= my d_startSelection) Melder_throw (U"No selection.");
+	autoEEG extract = EEG_extractPart (my eeg, my d_startSelection, my d_endSelection, true);
+	Editor_broadcastPublication (me, extract.transfer());
 }
 
 static void menu_cb_ExtractSelectedEEG_timeFromZero (EDITOR_ARGS) {
 	EDITOR_IAM (EEGWindow);
-	if (my d_endSelection <= my d_startSelection) Melder_throw ("No selection.");
-	autoEEG extract = EEG_extractPart (my d_eeg, my d_startSelection, my d_endSelection, false);
-	my broadcastPublication (extract.transfer());
+	if (my d_endSelection <= my d_startSelection) Melder_throw (U"No selection.");
+	autoEEG extract = EEG_extractPart (my eeg, my d_startSelection, my d_endSelection, false);
+	Editor_broadcastPublication (me, extract.transfer());
 }
 
 void structEEGWindow :: v_createMenuItems_file_extract (EditorMenu menu) {
 	EEGWindow_Parent :: v_createMenuItems_file_extract (menu);
-	our d_extractSelectedEEGPreserveTimesButton =
-		EditorMenu_addCommand (menu, L"Extract selected EEG (preserve times)", 0, menu_cb_ExtractSelectedEEG_preserveTimes);
-	our d_extractSelectedEEGTimeFromZeroButton =
-		EditorMenu_addCommand (menu, L"Extract selected EEG (time from zero)", 0, menu_cb_ExtractSelectedEEG_timeFromZero);
+	our extractSelectedEEGPreserveTimesButton =
+		EditorMenu_addCommand (menu, U"Extract selected EEG (preserve times)", 0, menu_cb_ExtractSelectedEEG_preserveTimes);
+	our extractSelectedEEGTimeFromZeroButton =
+		EditorMenu_addCommand (menu, U"Extract selected EEG (time from zero)", 0, menu_cb_ExtractSelectedEEG_timeFromZero);
 }
 
 void structEEGWindow :: v_updateMenuItems_file () {
 	EEGWindow_Parent :: v_updateMenuItems_file ();
-	our d_extractSelectedEEGPreserveTimesButton -> f_setSensitive (d_endSelection > d_startSelection);
-	our d_extractSelectedEEGTimeFromZeroButton -> f_setSensitive (d_endSelection > d_startSelection);
+	GuiThing_setSensitive (our extractSelectedEEGPreserveTimesButton, d_endSelection > d_startSelection);
+	GuiThing_setSensitive (our extractSelectedEEGTimeFromZeroButton,  d_endSelection > d_startSelection);
 }
 
-void EEGWindow_init (EEGWindow me, const wchar_t *title, EEG eeg) {
-	my d_eeg = eeg;   // before initing, because initing will already draw!
-	TextGridEditor_init (me, title, eeg -> textgrid, eeg -> sound, false, NULL, NULL);
+void EEGWindow_init (EEGWindow me, const char32 *title, EEG eeg) {
+	my eeg = eeg;   // before initing, because initing will already draw!
+	TextGridEditor_init (me, title, eeg -> textgrid, eeg -> sound, false, nullptr, nullptr);
 }
 
-EEGWindow EEGWindow_create (const wchar_t *title, EEG eeg) {
+autoEEGWindow EEGWindow_create (const char32 *title, EEG eeg) {
 	try {
 		autoEEGWindow me = Thing_new (EEGWindow);
 		EEGWindow_init (me.peek(), title, eeg);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("EEG window not created.");
+		Melder_throw (U"EEG window not created.");
 	}
 }
 
diff --git a/EEG/EEGWindow.h b/EEG/EEGWindow.h
index 84274b7..c6f7107 100644
--- a/EEG/EEGWindow.h
+++ b/EEG/EEGWindow.h
@@ -2,7 +2,7 @@
 #define _EEGWindow_h_
 /* EEGWindow.h
  *
- * Copyright (C) 2011-2012,2013,2014 Paul Boersma
+ * Copyright (C) 2011-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,26 +22,35 @@
 #include "TextGridEditor.h"
 #include "EEG.h"
 
-Thing_define (EEGWindow, TextGridEditor) { public:
-	// new data:
-		EEG d_eeg;
-		GuiMenuItem d_extractSelectedEEGPreserveTimesButton, d_extractSelectedEEGTimeFromZeroButton;
-	// overridden methods:
-		virtual bool v_hasPitch     () { return false; }
-		virtual bool v_hasIntensity () { return false; }
-		virtual bool v_hasFormants  () { return false; }
-		virtual bool v_hasPulses    () { return false; }
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual const wchar_t * v_getChannelName (long channelNumber);
-		virtual void v_createMenuItems_file_extract (EditorMenu menu);
-		virtual void v_updateMenuItems_file ();
+Thing_define (EEGWindow, TextGridEditor) {
+	EEG eeg;
+	GuiMenuItem extractSelectedEEGPreserveTimesButton, extractSelectedEEGTimeFromZeroButton;
+
+	bool v_hasPitch ()
+		override { return false; }
+	bool v_hasIntensity ()
+		override { return false; }
+	bool v_hasFormants ()
+		override { return false; }
+	bool v_hasPulses ()
+		override { return false; }
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	const char32 * v_getChannelName (long channelNumber)
+		override;
+	void v_createMenuItems_file_extract (EditorMenu menu)
+		override;
+	void v_updateMenuItems_file ()
+		override;
+
 	#include "EEGWindow_prefs.h"
 };
 
-void EEGWindow_init (EEGWindow me, const wchar_t *title, EEG eeg);
+void EEGWindow_init (EEGWindow me, const char32 *title, EEG eeg);
 
-EEGWindow EEGWindow_create (const wchar_t *title, EEG eeg);
+autoEEGWindow EEGWindow_create (const char32 *title, EEG eeg);
 
 /* End of file EEGWindow.h */
 #endif
diff --git a/EEG/EEGWindow_prefs.h b/EEG/EEGWindow_prefs.h
index 9dc181e..0ba45f6 100644
--- a/EEG/EEGWindow_prefs.h
+++ b/EEG/EEGWindow_prefs.h
@@ -1,6 +1,6 @@
 /* EEGWindow_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,28 +18,29 @@
  */
 
 prefs_begin (EEGWindow)
-	// overridden:
-		prefs_add_bool   (EEGWindow, showSelectionViewer,            1, false)
-		prefs_add_enum   (EEGWindow, sound_scalingStrategy,          1, kTimeSoundEditor_scalingStrategy, DEFAULT)
-		prefs_add_double (EEGWindow, sound_scaling_height,           1, L"20e-6")
-		prefs_add_double (EEGWindow, sound_scaling_minimum,          1, L"-10e-6")
-		prefs_add_double (EEGWindow, sound_scaling_maximum,          1, L"10e-6")
-		prefs_add_double (EEGWindow, picture_bottom,                 1, L"0.0")
-		prefs_add_double (EEGWindow, picture_top,                    1, L"0.0 (= auto)")
-		prefs_add_bool   (EEGWindow, spectrogram_show,               1, false);
-		prefs_add_double (EEGWindow, spectrogram_viewFrom,           1, L"0.0")   // Hz
-		prefs_add_double (EEGWindow, spectrogram_viewTo,             1, L"60.0")   // Hz
-		prefs_add_double (EEGWindow, spectrogram_windowLength,       1, L"0.5")   // seconds
-		prefs_add_double (EEGWindow, spectrogram_dynamicRange,       1, L"40.0")   // dB
-		prefs_add_long   (EEGWindow, spectrogram_timeSteps,          1, L"1000")
-		prefs_add_long   (EEGWindow, spectrogram_frequencySteps,     1, L"250")
-		prefs_add_enum   (EEGWindow, spectrogram_method,             1, kSound_to_Spectrogram_method, DEFAULT)
-		prefs_add_enum   (EEGWindow, spectrogram_windowShape,        1, kSound_to_Spectrogram_windowShape, DEFAULT)
-		prefs_add_bool   (EEGWindow, spectrogram_autoscaling,        1, true)
-		prefs_add_double (EEGWindow, spectrogram_maximum,            1, L"100.0")   // dB/Hz
-		prefs_add_double (EEGWindow, spectrogram_preemphasis,        1, L"0.0")   // dB/octave
-		prefs_add_double (EEGWindow, spectrogram_dynamicCompression, 1, L"0.0")
-		prefs_add_bool   (EEGWindow, spectrogram_picture_garnish,    1, true)
+
+	prefs_override_bool   (EEGWindow, showSelectionViewer,            1, false)
+	prefs_override_enum   (EEGWindow, sound_scalingStrategy,          1, kTimeSoundEditor_scalingStrategy, DEFAULT)
+	prefs_override_double (EEGWindow, sound_scaling_height,           1, U"20e-6")
+	prefs_override_double (EEGWindow, sound_scaling_minimum,          1, U"-10e-6")
+	prefs_override_double (EEGWindow, sound_scaling_maximum,          1, U"10e-6")
+	prefs_override_double (EEGWindow, picture_bottom,                 1, U"0.0")
+	prefs_override_double (EEGWindow, picture_top,                    1, U"0.0 (= auto)")
+	prefs_override_bool   (EEGWindow, spectrogram_show,               1, false);
+	prefs_override_double (EEGWindow, spectrogram_viewFrom,           1, U"0.0")   // Hz
+	prefs_override_double (EEGWindow, spectrogram_viewTo,             1, U"60.0")   // Hz
+	prefs_override_double (EEGWindow, spectrogram_windowLength,       1, U"0.5")   // seconds
+	prefs_override_double (EEGWindow, spectrogram_dynamicRange,       1, U"40.0")   // dB
+	prefs_override_long   (EEGWindow, spectrogram_timeSteps,          1, U"1000")
+	prefs_override_long   (EEGWindow, spectrogram_frequencySteps,     1, U"250")
+	prefs_override_enum   (EEGWindow, spectrogram_method,             1, kSound_to_Spectrogram_method, DEFAULT)
+	prefs_override_enum   (EEGWindow, spectrogram_windowShape,        1, kSound_to_Spectrogram_windowShape, DEFAULT)
+	prefs_override_bool   (EEGWindow, spectrogram_autoscaling,        1, true)
+	prefs_override_double (EEGWindow, spectrogram_maximum,            1, U"100.0")   // dB/Hz
+	prefs_override_double (EEGWindow, spectrogram_preemphasis,        1, U"0.0")   // dB/octave
+	prefs_override_double (EEGWindow, spectrogram_dynamicCompression, 1, U"0.0")
+	prefs_override_bool   (EEGWindow, spectrogram_picture_garnish,    1, true)
+
 prefs_end (EEGWindow)
 
 /* End of file EEGWindow_prefs.h */
diff --git a/EEG/EEG_def.h b/EEG/EEG_def.h
index 635316d..7708ebb 100644
--- a/EEG/EEG_def.h
+++ b/EEG/EEG_def.h
@@ -1,6 +1,6 @@
 /* EEG_def.h
  *
- * Copyright (C) 2011,2014 Paul Boersma
+ * Copyright (C) 2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,12 +27,14 @@ oo_DEFINE_CLASS (EEG, Function)
 	oo_OBJECT (TextGrid, 0, textgrid)
 
 	#if oo_DECLARING
-		// overridden methods:
-		protected:
-			virtual void v_info ();
-			virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
-			virtual void v_shiftX (double xfrom, double xto);
-			virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		void v_info ()
+			override;
+		int v_domainQuantity ()
+			override { return MelderQuantity_TIME_SECONDS; }
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
 	#endif
 
 oo_END_CLASS (EEG)
diff --git a/EEG/ERP.cpp b/EEG/ERP.cpp
index f26ec7c..476c2b4 100644
--- a/EEG/ERP.cpp
+++ b/EEG/ERP.cpp
@@ -1,6 +1,6 @@
 /* ERP.cpp
  *
- * Copyright (C) 2011-2012,2013,2014 Paul Boersma
+ * Copyright (C) 2011-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -42,9 +42,9 @@
 
 Thing_implement (ERP, Sound, 2);
 
-long ERP_getChannelNumber (ERP me, const wchar_t *channelName) {
+long ERP_getChannelNumber (ERP me, const char32 *channelName) {
 	for (long ichan = 1; ichan <= my ny; ichan ++) {
-		if (Melder_wcsequ (my channelNames [ichan], channelName)) {
+		if (Melder_equ (my channelNames [ichan], channelName)) {
 			return ichan;
 		}
 	}
@@ -84,40 +84,40 @@ void ERP_drawChannel_number (ERP me, Graphics graphics, long channelNumber, doub
 	Graphics_unsetInner (graphics);
 	if (garnish) {
 		Graphics_drawInnerBox (graphics);
-		Graphics_textTop (graphics, true, Melder_wcscat (L"Channel ", my channelNames [channelNumber]));
-		Graphics_textBottom (graphics, true, L"Time (s)");
+		Graphics_textTop (graphics, true, Melder_cat (U"Channel ", my channelNames [channelNumber]));
+		Graphics_textBottom (graphics, true, U"Time (s)");
 		Graphics_marksBottom (graphics, 2, true, true, false);
 		if (0.0 > tmin && 0.0 < tmax)
-			Graphics_markBottom (graphics, 0.0, true, true, true, NULL);
-		Graphics_markLeft (graphics, vmin, true, true, false, NULL);
-		Graphics_markLeft (graphics, vmax, true, true, false, NULL);
-			Graphics_markBottom (graphics, 0.0, true, true, true, NULL);
+			Graphics_markBottom (graphics, 0.0, true, true, true, nullptr);
+		Graphics_markLeft (graphics, vmin, true, true, false, nullptr);
+		Graphics_markLeft (graphics, vmax, true, true, false, nullptr);
+			Graphics_markBottom (graphics, 0.0, true, true, true, nullptr);
 		if (vmin != 0.0 && vmax != 0.0 && (vmin > 0.0) != (vmax > 0.0)) {
-			Graphics_markLeft (graphics, 0.0, true, true, true, NULL);
+			Graphics_markLeft (graphics, 0.0, true, true, true, nullptr);
 		}
 	}
 
 }
 
-void ERP_drawChannel_name (ERP me, Graphics graphics, const wchar_t *channelName, double tmin, double tmax, double vmin, double vmax, bool garnish) {
+void ERP_drawChannel_name (ERP me, Graphics graphics, const char32 *channelName, double tmin, double tmax, double vmin, double vmax, bool garnish) {
 	ERP_drawChannel_number (me, graphics, ERP_getChannelNumber (me, channelName), tmin, tmax, vmin, vmax, garnish);
 }
 
 Table ERP_tabulate (ERP me, bool includeSampleNumbers, bool includeTime, int timeDecimals, int voltageDecimals, int units) {
 	double voltageScaling = 1.0;
-	const wchar_t *unitText = L"(V)";
+	const char32 *unitText = U"(V)";
 	if (units == 2) {
 		voltageDecimals -= 6;
 		voltageScaling = 1000000.0;
-		unitText = L"(uV)";
+		unitText = U"(uV)";
 	}
 	try {
 		autoTable thee = Table_createWithoutColumnNames (my nx, includeSampleNumbers + includeTime + my ny);
 		long icol = 0;
-		if (includeSampleNumbers) Table_setColumnLabel (thee.peek(), ++ icol, L"sample");
-		if (includeTime) Table_setColumnLabel (thee.peek(), ++ icol, L"time(s)");
+		if (includeSampleNumbers) Table_setColumnLabel (thee.peek(), ++ icol, U"sample");
+		if (includeTime) Table_setColumnLabel (thee.peek(), ++ icol, U"time(s)");
 		for (long ichan = 1; ichan <= my ny; ichan ++) {
-			Table_setColumnLabel (thee.peek(), ++ icol, Melder_wcscat (my channelNames [ichan], unitText));
+			Table_setColumnLabel (thee.peek(), ++ icol, Melder_cat (my channelNames [ichan], unitText));
 		}
 		for (long isamp = 1; isamp <= my nx; isamp ++) {
 			icol = 0;
@@ -129,7 +129,7 @@ Table ERP_tabulate (ERP me, bool includeSampleNumbers, bool includeTime, int tim
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Table.");
+		Melder_throw (me, U": not converted to Table.");
 	}
 }
 
@@ -139,7 +139,7 @@ Sound ERP_downto_Sound (ERP me) {
 		my structSound :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
diff --git a/EEG/ERP.h b/EEG/ERP.h
index 39ae252..2d9b24f 100644
--- a/EEG/ERP.h
+++ b/EEG/ERP.h
@@ -2,7 +2,7 @@
 #define _ERP_h_
 /* ERP.h
  *
- * Copyright (C) 2011,2014 Paul Boersma
+ * Copyright (C) 2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,7 +27,7 @@ oo_CLASS_CREATE (ERP, Sound);
 /**
 	Look up the channel number from its name.
 */
-long ERP_getChannelNumber (ERP me, const wchar_t *channelName);
+long ERP_getChannelNumber (ERP me, const char32 *channelName);
 
 /**
  * Draw the scalp distribution.
@@ -40,7 +40,7 @@ void ERP_drawScalp (ERP me,
 void ERP_drawScalp_garnish (Graphics graphics, double vmin, double vmax, enum kGraphics_colourScale colourScale);
 
 void ERP_drawChannel_number (ERP me, Graphics graphics, long channelNumber, double tmin, double tmax, double vmin, double vmax, bool garnish);
-void ERP_drawChannel_name (ERP me, Graphics graphics, const wchar_t *channelName, double tmin, double tmax, double vmin, double vmax, bool garnish);
+void ERP_drawChannel_name (ERP me, Graphics graphics, const char32 *channelName, double tmin, double tmax, double vmin, double vmax, bool garnish);
 
 Table ERP_tabulate (ERP me, bool includeSampleNumbers, bool includeTime, int timeDecimals, int voltageDecimals, int units);
 
diff --git a/EEG/ERPTier.cpp b/EEG/ERPTier.cpp
index 94a3971..d7c0dcb 100644
--- a/EEG/ERPTier.cpp
+++ b/EEG/ERPTier.cpp
@@ -1,6 +1,6 @@
 /* ERPTier.cpp
  *
- * Copyright (C) 2011-2012,2014 Paul Boersma
+ * Copyright (C) 2011-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -48,19 +48,19 @@ Thing_implement (ERPTier, Function, 0);
 
 void structERPTier :: v_shiftX (double xfrom, double xto) {
 	ERPTier_Parent :: v_shiftX (xfrom, xto);
-	//if (our sound    != NULL)  Function_shiftXTo (our sound,    xfrom, xto);
-	//if (our textgrid != NULL)  Function_shiftXTo (our textgrid, xfrom, xto);
+	//if (our sound   )  Function_shiftXTo (our sound,    xfrom, xto);
+	//if (our textgrid)  Function_shiftXTo (our textgrid, xfrom, xto);
 }
 
 void structERPTier :: v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto) {
 	ERPTier_Parent :: v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	//if (our sound    != NULL)  our sound    -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	//if (our textgrid != NULL)  our textgrid -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
+	//if (our sound   )  our sound    -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
+	//if (our textgrid)  our textgrid -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
 }
 
-long ERPTier_getChannelNumber (ERPTier me, const wchar_t *channelName) {
+long ERPTier_getChannelNumber (ERPTier me, const char32 *channelName) {
 	for (long ichan = 1; ichan <= my numberOfChannels; ichan ++) {
-		if (Melder_wcsequ (my channelNames [ichan], channelName)) {
+		if (Melder_equ (my channelNames [ichan], channelName)) {
 			return ichan;
 		}
 	}
@@ -71,10 +71,10 @@ double ERPTier_getMean (ERPTier me, long pointNumber, long channelNumber, double
 	if (pointNumber < 1 || pointNumber > my events -> size) return NUMundefined;
 	if (channelNumber < 1 || channelNumber > my numberOfChannels) return NUMundefined;
 	ERPPoint point = my event (pointNumber);
-	return Vector_getMean (point -> erp, tmin, tmax, channelNumber);
+	return Vector_getMean (point -> erp.get(), tmin, tmax, channelNumber);
 }
 
-double ERPTier_getMean (ERPTier me, long pointNumber, const wchar_t *channelName, double tmin, double tmax) {
+double ERPTier_getMean (ERPTier me, long pointNumber, const char32 *channelName, double tmin, double tmax) {
 	return ERPTier_getMean (me, pointNumber, ERPTier_getChannelNumber (me, channelName), tmin, tmax);
 }
 
@@ -84,17 +84,17 @@ static ERPTier EEG_PointProcess_to_ERPTier (EEG me, PointProcess events, double
 		Function_init (thee.peek(), fromTime, toTime);
 		thy numberOfChannels = my numberOfChannels - EEG_getNumberOfExtraSensors (me);
 		Melder_assert (thy numberOfChannels > 0);
-		thy channelNames = NUMvector <wchar_t *> (1, thy numberOfChannels);
+		thy channelNames = NUMvector <char32 *> (1, thy numberOfChannels);
 		for (long ichan = 1; ichan <= thy numberOfChannels; ichan ++) {
-			thy channelNames [ichan] = Melder_wcsdup (my channelNames [ichan]);
+			thy channelNames [ichan] = Melder_dup (my channelNames [ichan]);
 		}
 		long numberOfEvents = events -> nt;
 		thy events = SortedSetOfDouble_create ();
 		double soundDuration = toTime - fromTime;
 		double samplingPeriod = my sound -> dx;
-		long numberOfSamples = floor (soundDuration / samplingPeriod) + 1;
+		long numberOfSamples = (long) floor (soundDuration / samplingPeriod) + 1;
 		if (numberOfSamples < 1)
-			Melder_throw (L"Time window too short.");
+			Melder_throw (U"Time window too short.");
 		double midTime = 0.5 * (fromTime + toTime);
 		double soundPhysicalDuration = numberOfSamples * samplingPeriod;
 		double firstTime = midTime - 0.5 * soundPhysicalDuration + 0.5 * samplingPeriod;   // distribute the samples evenly over the time domain
@@ -106,7 +106,7 @@ static ERPTier EEG_PointProcess_to_ERPTier (EEG me, PointProcess events, double
 			double erpEventTime = 0.0;
 			double eegSample = 1 + (eegEventTime - my sound -> x1) / samplingPeriod;
 			double erpSample = 1 + (erpEventTime - firstTime) / samplingPeriod;
-			long sampleDifference = round (eegSample - erpSample);
+			long sampleDifference = lround (eegSample - erpSample);
 			for (long ichannel = 1; ichannel <= thy numberOfChannels; ichannel ++) {
 				for (long isample = 1; isample <= numberOfSamples; isample ++) {
 					long jsample = isample + sampleDifference;
@@ -117,50 +117,48 @@ static ERPTier EEG_PointProcess_to_ERPTier (EEG me, PointProcess events, double
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": ERP analysis not performed.");
+		Melder_throw (me, U": ERP analysis not performed.");
 	}
 }
 
 ERPTier EEG_to_ERPTier_bit (EEG me, double fromTime, double toTime, int markerBit) {
 	try {
-		autoPointProcess events = TextGrid_getStartingPoints (my textgrid, markerBit, kMelder_string_EQUAL_TO, L"1");
+		autoPointProcess events = TextGrid_getStartingPoints (my textgrid, markerBit, kMelder_string_EQUAL_TO, U"1");
 		autoERPTier thee = EEG_PointProcess_to_ERPTier (me, events.peek(), fromTime, toTime);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": ERPTier not created.");
+		Melder_throw (me, U": ERPTier not created.");
 	}
 }
 
-static PointProcess TextGrid_getStartingPoints_multiNumeric (TextGrid me, uint16_t number) {
+static autoPointProcess TextGrid_getStartingPoints_multiNumeric (TextGrid me, uint16_t number) {
 	try {
-		autoPointProcess thee = NULL;
+		autoPointProcess thee;
 		int numberOfBits = my numberOfTiers();
 		for (int ibit = 0; ibit < numberOfBits; ibit ++) {
 			(void) TextGrid_checkSpecifiedTierIsIntervalTier (me, ibit + 1);
 			if (number & (1 << ibit)) {
-				autoPointProcess bitEvents = TextGrid_getStartingPoints (me, ibit + 1, kMelder_string_EQUAL_TO, L"1");
-				if (thee.peek()) {
-					autoPointProcess intersection = PointProcesses_intersection (thee.peek(), bitEvents.peek());
-					thee.reset (intersection.transfer());
+				autoPointProcess bitEvents = TextGrid_getStartingPoints (me, ibit + 1, kMelder_string_EQUAL_TO, U"1");
+				if (thee) {
+					thee = PointProcesses_intersection (thee.peek(), bitEvents.peek());
 				} else {
-					thee.reset (bitEvents.transfer());
+					thee = bitEvents.move();
 				}
 			}
 		}
 		for (int ibit = 0; ibit < numberOfBits; ibit ++) {
-			autoPointProcess bitEvents = TextGrid_getStartingPoints (me, ibit + 1, kMelder_string_EQUAL_TO, L"1");
+			autoPointProcess bitEvents = TextGrid_getStartingPoints (me, ibit + 1, kMelder_string_EQUAL_TO, U"1");
 			if (! (number & (1 << ibit))) {
-				if (thee.peek()) {
-					autoPointProcess difference = PointProcesses_difference (thee.peek(), bitEvents.peek());
-					thee.reset (difference.transfer());
+				if (thee) {
+					thee = PointProcesses_difference (thee.peek(), bitEvents.peek());
 				} else {
-					thee.reset (PointProcess_create (my xmin, my xmax, 10));
+					thee = PointProcess_create (my xmin, my xmax, 10);
 				}
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": starting points not converted to PointProcess.");
+		Melder_throw (me, U": starting points not converted to PointProcess.");
 	}
 }
 
@@ -170,25 +168,25 @@ ERPTier EEG_to_ERPTier_marker (EEG me, double fromTime, double toTime, uint16_t
 		autoERPTier thee = EEG_PointProcess_to_ERPTier (me, events.peek(), fromTime, toTime);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": ERPTier not created.");
+		Melder_throw (me, U": ERPTier not created.");
 	}
 }
 
 ERPTier EEG_to_ERPTier_triggers (EEG me, double fromTime, double toTime,
-	int which_Melder_STRING, const wchar_t *criterion)
+	int which_Melder_STRING, const char32 *criterion)
 {
 	try {
 		autoPointProcess events = TextGrid_getPoints (my textgrid, 2, which_Melder_STRING, criterion);
 		autoERPTier thee = EEG_PointProcess_to_ERPTier (me, events.peek(), fromTime, toTime);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": ERPTier not created.");
+		Melder_throw (me, U": ERPTier not created.");
 	}
 }
 
 ERPTier EEG_to_ERPTier_triggers_preceded (EEG me, double fromTime, double toTime,
-	int which_Melder_STRING, const wchar_t *criterion,
-	int which_Melder_STRING_precededBy, const wchar_t *criterion_precededBy)
+	int which_Melder_STRING, const char32 *criterion,
+	int which_Melder_STRING_precededBy, const char32 *criterion_precededBy)
 {
 	try {
 		autoPointProcess events = TextGrid_getPoints_preceded (my textgrid, 2,
@@ -197,7 +195,7 @@ ERPTier EEG_to_ERPTier_triggers_preceded (EEG me, double fromTime, double toTime
 		autoERPTier thee = EEG_PointProcess_to_ERPTier (me, events.peek(), fromTime, toTime);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": ERPTier not created.");
+		Melder_throw (me, U": ERPTier not created.");
 	}
 }
 
@@ -211,7 +209,7 @@ void ERPTier_subtractBaseline (ERPTier me, double tmin, double tmax) {
 	for (long ievent = 1; ievent <= numberOfEvents; ievent ++) {
 		ERPPoint event = my event (ievent);
 		for (long ichannel = 1; ichannel <= numberOfChannels; ichannel ++) {
-			double mean = Vector_getMean (event -> erp, tmin, tmax, ichannel);
+			double mean = Vector_getMean (event -> erp.get(), tmin, tmax, ichannel);
 			double *channel = event -> erp -> z [ichannel];
 			for (long isample = 1; isample <= numberOfSamples; isample ++) {
 				channel [isample] -= mean;
@@ -251,7 +249,7 @@ ERP ERPTier_extractERP (ERPTier me, long eventNumber) {
 	try {
 		long numberOfEvents = my events -> size;
 		if (numberOfEvents < 1)
-			Melder_throw ("No events.");
+			Melder_throw (U"No events.");
 		ERPTier_checkEventNumber (me, eventNumber);
 		ERPPoint event = my event (eventNumber);
 		long numberOfChannels = event -> erp -> ny;
@@ -265,13 +263,13 @@ ERP ERPTier_extractERP (ERPTier me, long eventNumber) {
 				newChannel [isample] = oldChannel [isample];
 			}
 		}
-		thy channelNames = NUMvector <wchar_t *> (1, thy ny);
+		thy channelNames = NUMvector <char32 *> (1, thy ny);
 		for (long ichan = 1; ichan <= thy ny; ichan ++) {
-			thy channelNames [ichan] = Melder_wcsdup (my channelNames [ichan]);
+			thy channelNames [ichan] = Melder_dup (my channelNames [ichan]);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": ERP not extracted.");
+		Melder_throw (me, U": ERP not extracted.");
 	}
 }
 
@@ -279,7 +277,7 @@ ERP ERPTier_to_ERP_mean (ERPTier me) {
 	try {
 		long numberOfEvents = my events -> size;
 		if (numberOfEvents < 1)
-			Melder_throw ("No events.");
+			Melder_throw (U"No events.");
 		ERPPoint firstEvent = my event (1);
 		long numberOfChannels = firstEvent -> erp -> ny;
 		long numberOfSamples = firstEvent -> erp -> nx;
@@ -302,13 +300,13 @@ ERP ERPTier_to_ERP_mean (ERPTier me) {
 				meanChannel [isample] *= factor;
 			}
 		}
-		mean -> channelNames = NUMvector <wchar_t *> (1, mean -> ny);
+		mean -> channelNames = NUMvector <char32 *> (1, mean -> ny);
 		for (long ichan = 1; ichan <= mean -> ny; ichan ++) {
-			mean -> channelNames [ichan] = Melder_wcsdup (my channelNames [ichan]);
+			mean -> channelNames [ichan] = Melder_dup (my channelNames [ichan]);
 		}
 		return mean.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": mean not computed.");
+		Melder_throw (me, U": mean not computed.");
 	}
 }
 
@@ -317,14 +315,14 @@ ERPTier ERPTier_extractEventsWhereColumn_number (ERPTier me, Table table, long c
 		Table_checkSpecifiedColumnNumberWithinRange (table, columnNumber);
 		Table_numericize_Assert (table, columnNumber);   // extraction should work even if cells are not defined
 		if (my events -> size != table -> rows -> size)
-			Melder_throw (me, " & ", table, ": the number of rows in the table (", table -> rows -> size,
-				") doesn't match the number of events (", my events -> size, ").");
+			Melder_throw (me, U" & ", table, U": the number of rows in the table (", table -> rows -> size,
+				U") doesn't match the number of events (", my events -> size, U").");
 		autoERPTier thee = Thing_new (ERPTier);
 		Function_init (thee.peek(), my xmin, my xmax);
 		thy numberOfChannels = my numberOfChannels;
-		thy channelNames = NUMvector <wchar_t *> (1, thy numberOfChannels);
+		thy channelNames = NUMvector <char32 *> (1, thy numberOfChannels);
 		for (long ichan = 1; ichan <= thy numberOfChannels; ichan ++) {
-			thy channelNames [ichan] = Melder_wcsdup (my channelNames [ichan]);
+			thy channelNames [ichan] = Melder_dup (my channelNames [ichan]);
 		}
 		thy events = SortedSetOfDouble_create ();
 		for (long ievent = 1; ievent <= my events -> size; ievent ++) {
@@ -336,28 +334,28 @@ ERPTier ERPTier_extractEventsWhereColumn_number (ERPTier me, Table table, long c
 			}
 		}
 		if (thy events -> size == 0) {
-			Melder_warning ("No event matches criterion.");
+			Melder_warning (U"No event matches criterion.");
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": events not extracted.");
+		Melder_throw (me, U": events not extracted.");
 	}
 }
 
 ERPTier ERPTier_extractEventsWhereColumn_string (ERPTier me, Table table,
-	long columnNumber, int which_Melder_STRING, const wchar_t *criterion)
+	long columnNumber, int which_Melder_STRING, const char32 *criterion)
 {
 	try {
 		Table_checkSpecifiedColumnNumberWithinRange (table, columnNumber);
 		if (my events -> size != table -> rows -> size)
-			Melder_throw (me, " & ", table, ": the number of rows in the table (", table -> rows -> size,
-				") doesn't match the number of events (", my events -> size, ").");
+			Melder_throw (me, U" & ", table, U": the number of rows in the table (", table -> rows -> size,
+				U") doesn't match the number of events (", my events -> size, U").");
 		autoERPTier thee = Thing_new (ERPTier);
 		Function_init (thee.peek(), my xmin, my xmax);
 		thy numberOfChannels = my numberOfChannels;
-		thy channelNames = NUMvector <wchar_t *> (1, thy numberOfChannels);
+		thy channelNames = NUMvector <char32 *> (1, thy numberOfChannels);
 		for (long ichan = 1; ichan <= thy numberOfChannels; ichan ++) {
-			thy channelNames [ichan] = Melder_wcsdup (my channelNames [ichan]);
+			thy channelNames [ichan] = Melder_dup (my channelNames [ichan]);
 		}
 		thy events = SortedSetOfDouble_create ();
 		for (long ievent = 1; ievent <= my events -> size; ievent ++) {
@@ -369,11 +367,11 @@ ERPTier ERPTier_extractEventsWhereColumn_string (ERPTier me, Table table,
 			}
 		}
 		if (thy events -> size == 0) {
-			Melder_warning ("No event matches criterion.");
+			Melder_warning (U"No event matches criterion.");
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": events not extracted.");
+		Melder_throw (me, U": events not extracted.");
 	}
 }
 
diff --git a/EEG/ERPTier.h b/EEG/ERPTier.h
index 200168b..ad717eb 100644
--- a/EEG/ERPTier.h
+++ b/EEG/ERPTier.h
@@ -2,7 +2,7 @@
 #define _ERPTier_h_
 /* ERPTier.h
  *
- * Copyright (C) 2011,2014 Paul Boersma
+ * Copyright (C) 2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,29 +27,29 @@ oo_CLASS_CREATE (ERPPoint, AnyPoint);
 oo_CLASS_CREATE (ERPTier, Function);
 
 
-long ERPTier_getChannelNumber (ERPTier me, const wchar_t *channelName);
+long ERPTier_getChannelNumber (ERPTier me, const char32 *channelName);
 static inline void ERPTier_checkEventNumber (ERPTier me, long eventNumber) {
 	if (eventNumber < 1)
-		Melder_throw ("The specified event number is ", eventNumber, " but should have been positive.");
+		Melder_throw (U"The specified event number is ", eventNumber, U" but should have been positive.");
 	if (eventNumber > my events -> size)
-		Melder_throw ("The specified event number (", eventNumber, ") exceeds the number of events (", my events -> size, ").");
+		Melder_throw (U"The specified event number (", eventNumber, U") exceeds the number of events (", my events -> size, U").");
 }
 double ERPTier_getMean (ERPTier me, long pointNumber, long channelNumber, double tmin, double tmax);
-double ERPTier_getMean (ERPTier me, long pointNumber, const wchar_t *channelName, double tmin, double tmax);
+double ERPTier_getMean (ERPTier me, long pointNumber, const char32 *channelName, double tmin, double tmax);
 void ERPTier_subtractBaseline (ERPTier me, double tmin, double tmax);
 void ERPTier_rejectArtefacts (ERPTier me, double threshold);
 ERP ERPTier_extractERP (ERPTier me, long pointNumber);
 ERP ERPTier_to_ERP_mean (ERPTier me);
 ERPTier ERPTier_extractEventsWhereColumn_number (ERPTier me, Table table, long columnNumber, int which_Melder_NUMBER, double criterion);
-ERPTier ERPTier_extractEventsWhereColumn_string (ERPTier me, Table table, long columnNumber, int which_Melder_STRING, const wchar_t *criterion);
+ERPTier ERPTier_extractEventsWhereColumn_string (ERPTier me, Table table, long columnNumber, int which_Melder_STRING, const char32 *criterion);
 
 ERPTier EEG_to_ERPTier_bit (EEG me, double fromTime, double toTime, int markerBit);
-ERPTier EEG_to_ERPTier_marker (EEG me, double fromTime, double toTime, uint16_t marker);
+ERPTier EEG_to_ERPTier_marker (EEG me, double fromTime, double toTime, uint16 marker);
 ERPTier EEG_to_ERPTier_triggers (EEG me, double fromTime, double toTime,
-	int which_Melder_STRING, const wchar_t *criterion);
+	int which_Melder_STRING, const char32 *criterion);
 ERPTier EEG_to_ERPTier_triggers_preceded (EEG me, double fromTime, double toTime,
-	int which_Melder_STRING, const wchar_t *criterion,
-	int which_Melder_STRING_precededBy, const wchar_t *criterion_precededBy);
+	int which_Melder_STRING, const char32 *criterion,
+	int which_Melder_STRING_precededBy, const char32 *criterion_precededBy);
 
 /* End of file ERPTier.h */
 #endif
diff --git a/EEG/ERPTier_def.h b/EEG/ERPTier_def.h
index 3443f5a..d3bb2c1 100644
--- a/EEG/ERPTier_def.h
+++ b/EEG/ERPTier_def.h
@@ -1,6 +1,6 @@
 /* ERPTier_def.h
  *
- * Copyright (C) 2011,2014 Paul Boersma
+ * Copyright (C) 2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
 #define ooSTRUCT ERPPoint
 oo_DEFINE_CLASS (ERPPoint, AnyPoint)
 
-	oo_OBJECT (Sound, 2, erp)
+	oo_AUTO_OBJECT (Sound, 2, erp)
 
 oo_END_CLASS (ERPPoint)
 #undef ooSTRUCT
@@ -36,14 +36,15 @@ oo_DEFINE_CLASS (ERPTier, Function)
 	oo_STRING_VECTOR (channelNames, numberOfChannels)
 
 	#if oo_DECLARING
-		// functions:
-		public:
-			ERPPoint event (long i) { return static_cast <ERPPoint> (our events -> item [i]); }
-		// overridden methods:
-		protected:
-			virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
-			virtual void v_shiftX (double xfrom, double xto);
-			virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		ERPPoint event (long i)   // rvalue accessor
+			{ return static_cast <ERPPoint> (our events -> item [i]); }
+
+		int v_domainQuantity ()
+			override { return MelderQuantity_TIME_SECONDS; }
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
 	#endif
 
 oo_END_CLASS (ERPTier)
diff --git a/EEG/ERPWindow.cpp b/EEG/ERPWindow.cpp
index 348618b..a08088e 100644
--- a/EEG/ERPWindow.cpp
+++ b/EEG/ERPWindow.cpp
@@ -1,6 +1,6 @@
 /* ERPWindow.cpp
  *
- * Copyright (C) 2012,2013,2014 Paul Boersma
+ * Copyright (C) 2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -163,9 +163,9 @@ void ERP_drawScalp_garnish (Graphics graphics, double vmin, double vmax, enum kG
 	Graphics_setColourScale (graphics, kGraphics_colourScale_GREY);
 	Graphics_rectangle (graphics, 0.85, 0.98, -0.8, +0.8);
 	Graphics_setTextAlignment (graphics, Graphics_RIGHT, Graphics_TOP);
-	Graphics_text2 (graphics, 1.0, -0.8, Melder_double (vmin * 1e6), L" μV");
+	Graphics_text (graphics, 1.0, -0.8,   vmin * 1e6, U" μV");
 	Graphics_setTextAlignment (graphics, Graphics_RIGHT, Graphics_BOTTOM);
-	Graphics_text2 (graphics, 1.0, +0.8, Melder_double (vmax * 1e6), L" μV");
+	Graphics_text (graphics, 1.0, +0.8,   vmax * 1e6, U" μV");
 }
 
 void ERP_drawScalp (ERP me, Graphics graphics, double tmin, double tmax, double vmin, double vmax, enum kGraphics_colourScale colourScale, bool garnish) {
@@ -175,8 +175,8 @@ void ERP_drawScalp (ERP me, Graphics graphics, double tmin, double tmax, double
 	//Graphics_fillRectangle (graphics, -1.1, 1.1, -1.01, 1.19);
 	//Graphics_setColour (graphics, Graphics_BLACK);
 	long numberOfDrawableChannels =
-			my ny >= 64 && Melder_wcsequ (my channelNames [64], L"O2") ? 64 :
-			my ny >= 32 && Melder_wcsequ (my channelNames [32], L"Cz") ? 32 :
+			my ny >= 64 && Melder_equ (my channelNames [64], U"O2") ? 64 :
+			my ny >= 32 && Melder_equ (my channelNames [32], U"Cz") ? 32 :
 			0;
 	BiosemiLocationData *biosemiLocationData = numberOfDrawableChannels == 64 ? biosemiCapCoordinates64 : numberOfDrawableChannels == 32 ? biosemiCapCoordinates32 : 0;
 	for (long ichan = 1; ichan <= numberOfDrawableChannels; ichan ++) {
@@ -277,8 +277,8 @@ void structERPWindow :: v_drawSelectionViewer () {
 	Graphics_fillRectangle (d_graphics, -1.1, 1.1, -1.01, 1.19);
 	Graphics_setColour (d_graphics, Graphics_BLACK);
 	long numberOfDrawableChannels =
-			erp -> ny >= 64 && Melder_wcsequ (erp -> channelNames [64], L"O2") ? 64 :
-			erp -> ny >= 32 && Melder_wcsequ (erp -> channelNames [32], L"Cz") ? 32 :
+			erp -> ny >= 64 && Melder_equ (erp -> channelNames [64], U"O2") ? 64 :
+			erp -> ny >= 32 && Melder_equ (erp -> channelNames [32], U"Cz") ? 32 :
 			0;
 	BiosemiLocationData *biosemiLocationData = numberOfDrawableChannels == 64 ? biosemiCapCoordinates64 : numberOfDrawableChannels == 32 ? biosemiCapCoordinates32 : 0;
 	for (long ichan = 1; ichan <= numberOfDrawableChannels; ichan ++) {
@@ -392,24 +392,24 @@ void structERPWindow :: v_drawSelectionViewer () {
 
 void structERPWindow :: v_prefs_addFields (EditorCommand cmd) {
 	Any radio;
-	OPTIONMENU_ENUM (L"Scalp colour space", kGraphics_colourScale, kGraphics_colourScale_BLUE_TO_RED)
+	OPTIONMENU_ENUM (U"Scalp colour space", kGraphics_colourScale, kGraphics_colourScale_BLUE_TO_RED)
 }
 void structERPWindow :: v_prefs_setValues (EditorCommand cmd) {
-	SET_ENUM (L"Scalp colour space", kGraphics_colourScale, p_scalp_colourScale)
+	SET_ENUM (U"Scalp colour space", kGraphics_colourScale, p_scalp_colourScale)
 }
 void structERPWindow :: v_prefs_getValues (EditorCommand cmd) {
-	pref_scalp_colourScale () = p_scalp_colourScale = GET_ENUM (kGraphics_colourScale, L"Scalp colour space");
+	pref_scalp_colourScale () = p_scalp_colourScale = GET_ENUM (kGraphics_colourScale, U"Scalp colour space");
 	FunctionEditor_redraw (this);
 }
 
-ERPWindow ERPWindow_create (const wchar_t *title, ERP data) {
-	Melder_assert (data != NULL);
+autoERPWindow ERPWindow_create (const char32 *title, ERP data) {
+	Melder_assert (data);
 	try {
 		autoERPWindow me = Thing_new (ERPWindow);
 		SoundEditor_init (me.peek(), title, data);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("ERP window not created.");
+		Melder_throw (U"ERP window not created.");
 	}
 }
 
diff --git a/EEG/ERPWindow.h b/EEG/ERPWindow.h
index fb8184b..90e0b77 100644
--- a/EEG/ERPWindow.h
+++ b/EEG/ERPWindow.h
@@ -2,7 +2,7 @@
 #define _ERPWindow_h_
 /* ERPWindow.h
  *
- * Copyright (C) 2012,2013,2014 Paul Boersma
+ * Copyright (C) 2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,27 +22,36 @@
 #include "SoundEditor.h"
 #include "ERP.h"
 
-Thing_define (ERPWindow, SoundEditor) { public:
-	// overridden methods:
-		virtual const wchar_t * v_getChannelName (long channelNumber) {
+Thing_define (ERPWindow, SoundEditor) {
+	const char32 * v_getChannelName (long channelNumber)
+		override {
 			ERP erp = (ERP) our data;
 			return erp -> channelNames [channelNumber];
 		}
-		virtual void v_drawSelectionViewer ();
-		virtual bool v_hasPitch     () { return false; }
-		virtual bool v_hasIntensity () { return false; }
-		virtual bool v_hasFormants  () { return false; }
-		virtual bool v_hasPulses    () { return false; }
-		virtual void v_prefs_addFields (EditorCommand cmd);
-		virtual void v_prefs_setValues (EditorCommand cmd);
-		virtual void v_prefs_getValues (EditorCommand cmd);
+	void v_drawSelectionViewer ()
+		override;
+	bool v_hasPitch ()
+		override { return false; }
+	bool v_hasIntensity ()
+		override { return false; }
+	bool v_hasFormants ()
+		override { return false; }
+	bool v_hasPulses ()
+		override { return false; }
+	void v_prefs_addFields (EditorCommand cmd)
+		override;
+	void v_prefs_setValues (EditorCommand cmd)
+		override;
+	void v_prefs_getValues (EditorCommand cmd)
+		override;
+
 	#include "ERPWindow_prefs.h"
 };
 
 /**
 	Create an ERPWindow.
 */
-ERPWindow ERPWindow_create (const wchar_t *title, ERP data);
+autoERPWindow ERPWindow_create (const char32 *title, ERP data);
 
 /* End of file ERPWindow.h */
 #endif
diff --git a/EEG/ERPWindow_prefs.h b/EEG/ERPWindow_prefs.h
index 27743bd..906a2e8 100644
--- a/EEG/ERPWindow_prefs.h
+++ b/EEG/ERPWindow_prefs.h
@@ -1,6 +1,6 @@
 /* ERPWindow_prefs.h
  *
- * Copyright (C) 2013,2014 Paul Boersma
+ * Copyright (C) 2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,29 +18,31 @@
  */
 
 prefs_begin (ERPWindow)
-	// overridden:
-		prefs_add_bool   (ERPWindow, showSelectionViewer,            1, true)
-		prefs_add_enum_with_data   (ERPWindow, scalp_colourScale,              1, kGraphics_colourScale, BLUE_TO_RED)
-		prefs_add_enum   (ERPWindow, sound_scalingStrategy,          1, kTimeSoundEditor_scalingStrategy, DEFAULT)
-		prefs_add_double (ERPWindow, sound_scaling_height,           1, L"20e-6")
-		prefs_add_double (ERPWindow, sound_scaling_minimum,          1, L"-10e-6")
-		prefs_add_double (ERPWindow, sound_scaling_maximum,          1, L"10e-6")
-		prefs_add_double (ERPWindow, picture_bottom,                 1, L"0.0")
-		prefs_add_double (ERPWindow, picture_top,                    1, L"0.0 (= auto)")
-		prefs_add_bool   (ERPWindow, spectrogram_show,               1, false);
-		prefs_add_double (ERPWindow, spectrogram_viewFrom,           1, L"0.0")   // Hz
-		prefs_add_double (ERPWindow, spectrogram_viewTo,             1, L"60.0")   // Hz
-		prefs_add_double (ERPWindow, spectrogram_windowLength,       1, L"0.5")   // seconds
-		prefs_add_double (ERPWindow, spectrogram_dynamicRange,       1, L"40.0")   // dB
-		prefs_add_long   (ERPWindow, spectrogram_timeSteps,          1, L"1000")
-		prefs_add_long   (ERPWindow, spectrogram_frequencySteps,     1, L"250")
-		prefs_add_enum   (ERPWindow, spectrogram_method,             1, kSound_to_Spectrogram_method, DEFAULT)
-		prefs_add_enum   (ERPWindow, spectrogram_windowShape,        1, kSound_to_Spectrogram_windowShape, DEFAULT)
-		prefs_add_bool   (ERPWindow, spectrogram_autoscaling,        1, true)
-		prefs_add_double (ERPWindow, spectrogram_maximum,            1, L"100.0")   // dB/Hz
-		prefs_add_double (ERPWindow, spectrogram_preemphasis,        1, L"0.0")   // dB/octave
-		prefs_add_double (ERPWindow, spectrogram_dynamicCompression, 1, L"0.0")
-		prefs_add_bool   (ERPWindow, spectrogram_picture_garnish,    1, true)
+
+	prefs_override_bool   (ERPWindow, showSelectionViewer,            1, true)
+	prefs_override_enum   (ERPWindow, sound_scalingStrategy,          1, kTimeSoundEditor_scalingStrategy, DEFAULT)
+	prefs_override_double (ERPWindow, sound_scaling_height,           1, U"20e-6")
+	prefs_override_double (ERPWindow, sound_scaling_minimum,          1, U"-10e-6")
+	prefs_override_double (ERPWindow, sound_scaling_maximum,          1, U"10e-6")
+	prefs_override_double (ERPWindow, picture_bottom,                 1, U"0.0")
+	prefs_override_double (ERPWindow, picture_top,                    1, U"0.0 (= auto)")
+	prefs_override_bool   (ERPWindow, spectrogram_show,               1, false);
+	prefs_override_double (ERPWindow, spectrogram_viewFrom,           1, U"0.0")   // Hz
+	prefs_override_double (ERPWindow, spectrogram_viewTo,             1, U"60.0")   // Hz
+	prefs_override_double (ERPWindow, spectrogram_windowLength,       1, U"0.5")   // seconds
+	prefs_override_double (ERPWindow, spectrogram_dynamicRange,       1, U"40.0")   // dB
+	prefs_override_long   (ERPWindow, spectrogram_timeSteps,          1, U"1000")
+	prefs_override_long   (ERPWindow, spectrogram_frequencySteps,     1, U"250")
+	prefs_override_enum   (ERPWindow, spectrogram_method,             1, kSound_to_Spectrogram_method, DEFAULT)
+	prefs_override_enum   (ERPWindow, spectrogram_windowShape,        1, kSound_to_Spectrogram_windowShape, DEFAULT)
+	prefs_override_bool   (ERPWindow, spectrogram_autoscaling,        1, true)
+	prefs_override_double (ERPWindow, spectrogram_maximum,            1, U"100.0")   // dB/Hz
+	prefs_override_double (ERPWindow, spectrogram_preemphasis,        1, U"0.0")   // dB/octave
+	prefs_override_double (ERPWindow, spectrogram_dynamicCompression, 1, U"0.0")
+	prefs_override_bool   (ERPWindow, spectrogram_picture_garnish,    1, true)
+
+	prefs_add_enum_with_data (ERPWindow, scalp_colourScale,           1, kGraphics_colourScale, BLUE_TO_RED)
+
 prefs_end (ERPWindow)
 
 /* End of file ERPWindow_prefs.h */
diff --git a/EEG/ERP_def.h b/EEG/ERP_def.h
index 5d41eb3..9812cab 100644
--- a/EEG/ERP_def.h
+++ b/EEG/ERP_def.h
@@ -1,6 +1,6 @@
 /* ERP_def.h
  *
- * Copyright (C) 2011-2012,2014 Paul Boersma
+ * Copyright (C) 2011-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/EEG/manual_EEG.cpp b/EEG/manual_EEG.cpp
index 8394364..f53417a 100644
--- a/EEG/manual_EEG.cpp
+++ b/EEG/manual_EEG.cpp
@@ -1,6 +1,6 @@
 /* manual_EEG.cpp
  *
- * Copyright (C) 2012 Paul Boersma
+ * Copyright (C) 2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,39 +22,39 @@
 void manual_EEG_init (ManPages me);
 void manual_EEG_init (ManPages me) {
 
-MAN_BEGIN (L"EEG", L"ppgb", 20120511)
-INTRO (L"EEG means electro-encephalography: brain potentials recorded via e.g. 32 or 64 electrodes on the scalp. "
+MAN_BEGIN (U"EEG", U"ppgb", 20120511)
+INTRO (U"EEG means electro-encephalography: brain potentials recorded via e.g. 32 or 64 electrodes on the scalp. "
 	"In Praat, an EEG object looks like a combination of a Sound object with e.g. 32 or 64 channels "
 	"and a TextGrid object that marks the events.")
-ENTRY (L"1. How to get an EEG object in Praat")
-NORMAL (L"You typically create an EEG object in Praat by opening a BDF/EDF file with @@Read from file... at . "
+ENTRY (U"1. How to get an EEG object in Praat")
+NORMAL (U"You typically create an EEG object in Praat by opening a BDF/EDF file with @@Read from file... at . "
 	"Praat tries to read the whole file into memory, so you may want to work with a 64-bit edition of Praat "
 	"if you want to avoid \"out of memory\" messages.")
-NORMAL (L"After you do ##Read from file...#, an EEG object will appear in the list of objects.")
-ENTRY (L"2. How to look into an EEG object")
-NORMAL (L"Once you have an EEG object in the list, you can click ##View & Edit# to look into it. "
+NORMAL (U"After you do ##Read from file...#, an EEG object will appear in the list of objects.")
+ENTRY (U"2. How to look into an EEG object")
+NORMAL (U"Once you have an EEG object in the list, you can click ##View & Edit# to look into it. "
 	"You will typically see the first 8 channels, but you scroll to the other channels by clicking on the up and down arrows. "
 	"You can scroll and zoom in the same way as in a Sound window.")
-NORMAL (L"The channel names that you see are often A1, A2, ... A32, B1, B2, ... B32, C1, C2, ... C32, and so on. These represent the cap electrodes. "
+NORMAL (U"The channel names that you see are often A1, A2, ... A32, B1, B2, ... B32, C1, C2, ... C32, and so on. These represent the cap electrodes. "
 	"If the number of cap electrodes is 32, though, the channel names are Fp1, AF3, ... Cz, "
 	"and if it is 64, the channel names are Fp1, AF7, ... O2. You can change these names with "
 	"##Set channel name...# from the #Modify menu.")
-NORMAL (L"Below the cap electrodes you may see a number of channels for the external electrodes. "
+NORMAL (U"Below the cap electrodes you may see a number of channels for the external electrodes. "
 	"These are typically named EXG1, EXG2, ... EXG8, but you can change these names with ##Edit external electrode names...# "
 	"from the #Modify menu.")
-NORMAL (L"Below the external electrodes you may see a number of special channels, "
+NORMAL (U"Below the external electrodes you may see a number of special channels, "
 	"perhaps named GSR1, GSR2, Erg1, Erg2, Resp, Plet, Temp, and Status. "
 	"These represent recordings from other sensors than the electrodes.")
-NORMAL (L"The Status channel is special. It is the 8-bit digital signal that you fed to your EEG apparatus. "
+NORMAL (U"The Status channel is special. It is the 8-bit digital signal that you fed to your EEG apparatus. "
 	"When reading the BDF file, Praat extracts all 8 bits from this status signal, "
 	"and these 8 bits are shown in the EEG window as TextGrid interval tiers named S1, S2, ... S8. "
 	"These bits are the place to mark events. For instance, in our lab we use S8 to mark any event, "
 	"S5 to mark a \"standard\" event, and S4 to mark a \"deviant\" event.")
-ENTRY (L"3. What to do to an EEG object")
-NORMAL (L"The raw EEG signal that you have read from a file is typically quite noisy and may have a very large "
+ENTRY (U"3. What to do to an EEG object")
+NORMAL (U"The raw EEG signal that you have read from a file is typically quite noisy and may have a very large "
 	"DC (direct-current) component as compared to the small vibrations that you are interested in. "
 	"There are several ways to clean it up.")
-NORMAL (L"##Subtracting a reference signal.# The voltage on the whole scalp may rise and fall in time. "
+NORMAL (U"##Subtracting a reference signal.# The voltage on the whole scalp may rise and fall in time. "
 	"You are unlikely to be interested in these global movements; instead, you are likely to be interested only "
 	"in the voltage movements on the brain-influenced part of the scalp (the cap electrodes) "
 	"with respect to the voltage movements on the non-brain-influenced part of the scalp (the external electrodes). "
@@ -62,29 +62,29 @@ NORMAL (L"##Subtracting a reference signal.# The voltage on the whole scalp may
 	"you can use ##Subtract reference...# to subtract the average of the two mastoid channels from all electrode channels (including the external electrodes themselves). "
 	"If you have no such recordings, you can still regard the average of a range of electrode channels as a reference signal, "
 	"and use ##Subtract mean channel...# to subtract this from each electrode channel.")
-NORMAL (L"##Detrending.# With #Detrend, you subtract from each electrode channel a line in such a way that the first sample and the last sample become zero. "
+NORMAL (U"##Detrending.# With #Detrend, you subtract from each electrode channel a line in such a way that the first sample and the last sample become zero. "
 	"Detrending and reference subtraction can be performed in either order.")
-NORMAL (L"##Filtering.# With ##Filter...#, you band-pass filter each electrode channel. Filtering has to be done after detrending, but "
+NORMAL (U"##Filtering.# With ##Filter...#, you band-pass filter each electrode channel. Filtering has to be done after detrending, but "
 	"filtering and reference subtraction can be performed in either order.")
-ENTRY (L"4. How to do an ERP analysis")
-NORMAL (L"An ERP is an Event-Related Potential. Events are marked somewhere in S1, S2, ... S8. In the above example, "
+ENTRY (U"4. How to do an ERP analysis")
+NORMAL (U"An ERP is an Event-Related Potential. Events are marked somewhere in S1, S2, ... S8. In the above example, "
 	"we extract all the \"deviant\" events by doing ##To ERPTier...#, setting ##From time# to -0.11 seconds, "
 	"##To Time# to 0.39 seconds, and ##Marker bit# to 4. This way, an ERPTier object appears in the list, containing "
 	"the parts of the EEG signal that lie in a time window of [-0.11, 0.39] seconds around each event on the S4 (deviant) tier. "
 	"Thus, if S4 contains 150 events, the resulting ERPTier will contain 150 pieces of the original EEG signal (without the extra sensors).")
-NORMAL (L"You are typically interested in the part of each ERP in the ERPTier after the event. "
+NORMAL (U"You are typically interested in the part of each ERP in the ERPTier after the event. "
 	"That is, you are probably interested in how this part compares to the part not influenced by the event, "
 	"i.e. the part before the event. To make this comparison easier, you can do ##Subtract baseline...#: "
 	"the waveform of the ERP will be moved up or down in such a way that the average amplitude of the part between the specified times becomes zero; "
 	"the times you will typically fill in here are the starting time of the ERP (a negative number) and the time of the event (0.0).")
-NORMAL (L"After you subtract the baseline, the part after the event contains the interesting part of the ERP: "
+NORMAL (U"After you subtract the baseline, the part after the event contains the interesting part of the ERP: "
 	"even its sign (positive or negative) is meaningful now. Some ERPs, however, will contain very large positive or negative peaks "
 	"because of eye movements and other disturbing signals. To remove those ERPs from the ERPTier, "
 	"do ##Reject artefacts...#, while specifying the amount by which you allow the amplitude of an ERP to go above or below zero.")
-NORMAL (L"Once you have an ERPTier, you can extract each of the 150 ERPs from it with ##Extract ERP...#. "
+NORMAL (U"Once you have an ERPTier, you can extract each of the 150 ERPs from it with ##Extract ERP...#. "
 	"It is perhaps more interesting to compute the average of all those 150 ERPs with ##To ERP (mean)#. "
 	"These commands put a new ERP object in the list.")
-NORMAL (L"Once you have an ERP object, you can look into it with ##View & Edit#. "
+NORMAL (U"Once you have an ERP object, you can look into it with ##View & Edit#. "
 	"If you want to see in the ERP window the scalp distribution at the time of the cursor, or the average scalp distribution in the selected time stretch, "
 	"you have to switch on ##Show selection viewer# in the #Preferences window (available from the #File menu).")
 MAN_END
diff --git a/EEG/praat_EEG.cpp b/EEG/praat_EEG.cpp
index 37185f5..eb389b3 100644
--- a/EEG/praat_EEG.cpp
+++ b/EEG/praat_EEG.cpp
@@ -1,6 +1,6 @@
 /* praat_EEG.cpp
  *
- * Copyright (C) 2011-2012,2013,2014 Paul Boersma
+ * Copyright (C) 2011-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,286 +29,286 @@
 
 /***** EEG *****/
 
-DIRECT (EEGs_concatenate)
+DIRECT2 (EEGs_concatenate) {
 	autoCollection eegs = praat_getSelectedObjects ();
 	autoEEG thee = EEGs_concatenate (eegs.peek());
-	praat_new (thee.transfer(), L"chain");
-END
+	praat_new (thee.transfer(), U"chain");
+END2 }
 
-DIRECT (EEG_detrend)
+DIRECT2 (EEG_detrend) {
 	LOOP {
 		iam (EEG);
 		EEG_detrend (me);
 		praat_dataChanged (me);
 	}
-END
-
-FORM (EEG_editExternalElectrodeNames, L"Edit external electrode names", 0)
-	WORD (L"External electrode 1", L"EXG1")
-	WORD (L"External electrode 2", L"EXG2")
-	WORD (L"External electrode 3", L"EXG3")
-	WORD (L"External electrode 4", L"EXG4")
-	WORD (L"External electrode 5", L"EXG5")
-	WORD (L"External electrode 6", L"EXG6")
-	WORD (L"External electrode 7", L"EXG7")
-	WORD (L"External electrode 8", L"EXG8")
-	OK
+END2 }
+
+FORM (EEG_editExternalElectrodeNames, U"Edit external electrode names", 0) {
+	WORD (U"External electrode 1", U"EXG1")
+	WORD (U"External electrode 2", U"EXG2")
+	WORD (U"External electrode 3", U"EXG3")
+	WORD (U"External electrode 4", U"EXG4")
+	WORD (U"External electrode 5", U"EXG5")
+	WORD (U"External electrode 6", U"EXG6")
+	WORD (U"External electrode 7", U"EXG7")
+	WORD (U"External electrode 8", U"EXG8")
+	OK2
 int IOBJECT;
 LOOP {
 	iam (EEG);
 	if (EEG_getNumberOfExternalElectrodes (me) == 8) {
 		const long offsetExternalElectrode = EEG_getNumberOfCapElectrodes (me);
-		SET_STRING (L"External electrode 1", my channelNames [offsetExternalElectrode + 1])
-		SET_STRING (L"External electrode 2", my channelNames [offsetExternalElectrode + 2])
-		SET_STRING (L"External electrode 3", my channelNames [offsetExternalElectrode + 3])
-		SET_STRING (L"External electrode 4", my channelNames [offsetExternalElectrode + 4])
-		SET_STRING (L"External electrode 5", my channelNames [offsetExternalElectrode + 5])
-		SET_STRING (L"External electrode 6", my channelNames [offsetExternalElectrode + 6])
-		SET_STRING (L"External electrode 7", my channelNames [offsetExternalElectrode + 7])
-		SET_STRING (L"External electrode 8", my channelNames [offsetExternalElectrode + 8])
+		SET_STRING (U"External electrode 1", my channelNames [offsetExternalElectrode + 1])
+		SET_STRING (U"External electrode 2", my channelNames [offsetExternalElectrode + 2])
+		SET_STRING (U"External electrode 3", my channelNames [offsetExternalElectrode + 3])
+		SET_STRING (U"External electrode 4", my channelNames [offsetExternalElectrode + 4])
+		SET_STRING (U"External electrode 5", my channelNames [offsetExternalElectrode + 5])
+		SET_STRING (U"External electrode 6", my channelNames [offsetExternalElectrode + 6])
+		SET_STRING (U"External electrode 7", my channelNames [offsetExternalElectrode + 7])
+		SET_STRING (U"External electrode 8", my channelNames [offsetExternalElectrode + 8])
 	}
 }
 DO
 	LOOP {
 		iam (EEG);
 		if (EEG_getNumberOfExternalElectrodes (me) != 8)
-			Melder_throw ("You can do this only if there are 8 external electrodes.");
-		EEG_setExternalElectrodeNames (me, GET_STRING (L"External electrode 1"), GET_STRING (L"External electrode 2"), GET_STRING (L"External electrode 3"),
-			GET_STRING (L"External electrode 4"), GET_STRING (L"External electrode 5"), GET_STRING (L"External electrode 6"),
-			GET_STRING (L"External electrode 7"), GET_STRING (L"External electrode 8"));
+			Melder_throw (U"You can do this only if there are 8 external electrodes.");
+		EEG_setExternalElectrodeNames (me, GET_STRING (U"External electrode 1"), GET_STRING (U"External electrode 2"), GET_STRING (U"External electrode 3"),
+			GET_STRING (U"External electrode 4"), GET_STRING (U"External electrode 5"), GET_STRING (U"External electrode 6"),
+			GET_STRING (U"External electrode 7"), GET_STRING (U"External electrode 8"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (EEG_extractChannel, L"EEG: Extract channel", 0)
-	SENTENCE (L"Channel name", L"Cz")
-	OK
+FORM (EEG_extractChannel, U"EEG: Extract channel", 0) {
+	SENTENCE (U"Channel name", U"Cz")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		const wchar_t *channelName = GET_STRING (L"Channel name");
+		const char32 *channelName = GET_STRING (U"Channel name");
 		autoEEG thee = EEG_extractChannel (me, channelName);
-		praat_new (thee.transfer(), my name, L"_", channelName);
+		praat_new (thee.transfer(), my name, U"_", channelName);
 	}
-END
+END2 }
 
-FORM (EEG_extractPart, L"EEG: Extract part", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"1.0")
-	BOOLEAN (L"Preserve times", 0)
-	OK
+FORM (EEG_extractPart, U"EEG: Extract part", 0) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"1.0")
+	BOOLEAN (U"Preserve times", 0)
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		autoEEG thee = EEG_extractPart (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Preserve times"));
-		praat_new (thee.transfer(), my name, L"_part");
+		autoEEG thee = EEG_extractPart (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Preserve times"));
+		praat_new (thee.transfer(), my name, U"_part");
 	}
-END
+END2 }
 
-DIRECT (EEG_extractSound)
+DIRECT2 (EEG_extractSound) {
 	LOOP {
 		iam (EEG);
-		if (! my sound) Melder_throw (me, ": I don't contain a waveform.");
+		if (! my sound) Melder_throw (me, U": I don't contain a waveform.");
 		autoSound thee = EEG_extractSound (me);
-		praat_new (thee.transfer(), NULL);
+		praat_new (thee.transfer());
 	}
-END
+END2 }
 
-DIRECT (EEG_extractTextGrid)
+DIRECT2 (EEG_extractTextGrid) {
 	LOOP {
 		iam (EEG);
-		if (! my textgrid) Melder_throw (me, ": I don't contain marks.");
+		if (! my textgrid) Melder_throw (me, U": I don't contain marks.");
 		autoTextGrid thee = EEG_extractTextGrid (me);
-		praat_new (thee.transfer(), NULL);
+		praat_new (thee.transfer());
 	}
-END
+END2 }
 
-FORM (EEG_filter, L"Filter", 0)
-	REAL (L"Low frequency (Hz)", L"1.0")
-	REAL (L"Low width (Hz)", L"0.5")
-	REAL (L"High frequency (Hz)", L"25.0")
-	REAL (L"High width (Hz)", L"12.5")
-	BOOLEAN (L"Notch at 50 Hz", true)
-	OK
+FORM (EEG_filter, U"Filter", 0) {
+	REAL (U"Low frequency (Hz)", U"1.0")
+	REAL (U"Low width (Hz)", U"0.5")
+	REAL (U"High frequency (Hz)", U"25.0")
+	REAL (U"High width (Hz)", U"12.5")
+	BOOLEAN (U"Notch at 50 Hz", true)
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		EEG_filter (me, GET_REAL (L"Low frequency"), GET_REAL (L"Low width"), GET_REAL (L"High frequency"), GET_REAL (L"High width"), GET_INTEGER (L"Notch at 50 Hz"));
+		EEG_filter (me, GET_REAL (U"Low frequency"), GET_REAL (U"Low width"), GET_REAL (U"High frequency"), GET_REAL (U"High width"), GET_INTEGER (U"Notch at 50 Hz"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (EEG_getChannelName, L"Get channel name", 0)
-	NATURAL (L"Channel number", L"1")
-	OK
+FORM (EEG_getChannelName, U"Get channel name", 0) {
+	NATURAL (U"Channel number", U"1")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		long channelNumber = GET_INTEGER (L"Channel number");
+		long channelNumber = GET_INTEGER (U"Channel number");
 		if (channelNumber > my numberOfChannels)
-			Melder_throw (me, ": there are only ", my numberOfChannels, " channels.");
+			Melder_throw (me, U": there are only ", my numberOfChannels, U" channels.");
 		Melder_information (my channelNames [channelNumber]);
 	}
-END
+END2 }
 
-FORM (EEG_getChannelNumber, L"Get channel number", 0)
-	WORD (L"Channel name", L"Cz")
-	OK
+FORM (EEG_getChannelNumber, U"Get channel number", 0) {
+	WORD (U"Channel name", U"Cz")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		Melder_information (Melder_integer (EEG_getChannelNumber (me, GET_STRING (L"Channel name"))));
+		Melder_information (EEG_getChannelNumber (me, GET_STRING (U"Channel name")));
 	}
-END
+END2 }
 
-FORM (EEG_removeTriggers, L"Remove triggers", 0)
-	OPTIONMENU_ENUM (L"Remove every trigger that...", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"hi")
-	OK
+FORM (EEG_removeTriggers, U"Remove triggers", 0) {
+	OPTIONMENU_ENUM (U"Remove every trigger that...", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		EEG_removeTriggers (me, GET_ENUM (kMelder_string, L"Remove every trigger that..."), GET_STRING (L"...the text"));
+		EEG_removeTriggers (me, GET_ENUM (kMelder_string, U"Remove every trigger that..."), GET_STRING (U"...the text"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (EEG_setChannelName, L"Set channel name", 0)
-	NATURAL (L"Channel number", L"1")
-	WORD (L"New name", L"BLA")
-	OK
+FORM (EEG_setChannelName, U"Set channel name", 0) {
+	NATURAL (U"Channel number", U"1")
+	WORD (U"New name", U"BLA")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		EEG_setChannelName (me, GET_INTEGER (L"Channel number"), GET_STRING (L"New name"));
+		EEG_setChannelName (me, GET_INTEGER (U"Channel number"), GET_STRING (U"New name"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (EEG_setChannelToZero, L"Set channel to zero", 0)
-	SENTENCE (L"Channel", L"Iz")
-	OK
+FORM (EEG_setChannelToZero, U"Set channel to zero", 0) {
+	SENTENCE (U"Channel", U"Iz")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		EEG_setChannelToZero (me, GET_STRING (L"Channel"));
+		EEG_setChannelToZero (me, GET_STRING (U"Channel"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (EEG_subtractMeanChannel, L"Subtract mean channel", 0)
-	LABEL (L"label", L"Range of reference channels:")
-	NATURAL (L"From channel", L"1")
-	NATURAL (L"To channel", L"32")
-	OK
+FORM (EEG_subtractMeanChannel, U"Subtract mean channel", 0) {
+	LABEL (U"label", U"Range of reference channels:")
+	NATURAL (U"From channel", U"1")
+	NATURAL (U"To channel", U"32")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		EEG_subtractMeanChannel (me, GET_INTEGER (L"From channel"), GET_INTEGER (L"To channel"));
+		EEG_subtractMeanChannel (me, GET_INTEGER (U"From channel"), GET_INTEGER (U"To channel"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (EEG_subtractReference, L"Subtract reference", 0)
-	WORD (L"Reference channel 1", L"MASL")
-	WORD (L"Reference channel 2 (optional)", L"MASR")
-	OK
+FORM (EEG_subtractReference, U"Subtract reference", 0) {
+	WORD (U"Reference channel 1", U"MASL")
+	WORD (U"Reference channel 2 (optional)", U"MASR")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		EEG_subtractReference (me, GET_STRING (L"Reference channel 1"), GET_STRING (L"Reference channel 2"));
+		EEG_subtractReference (me, GET_STRING (U"Reference channel 1"), GET_STRING (U"Reference channel 2"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (EEG_to_ERPTier_bit, L"To ERPTier (bit)", 0)
-	REAL (L"From time (s)", L"-0.11")
-	REAL (L"To time (s)", L"0.39")
-	NATURAL (L"Marker bit", L"8")
-	OK
+FORM (EEG_to_ERPTier_bit, U"To ERPTier (bit)", 0) {
+	REAL (U"From time (s)", U"-0.11")
+	REAL (U"To time (s)", U"0.39")
+	NATURAL (U"Marker bit", U"8")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		int markerBit = GET_INTEGER (L"Marker bit");
-		autoERPTier thee = EEG_to_ERPTier_bit (me, GET_REAL (L"From time"), GET_REAL (L"To time"), markerBit);
-		praat_new (thee.transfer(), my name, L"_bit", Melder_integer (markerBit));
+		int markerBit = GET_INTEGER (U"Marker bit");
+		autoERPTier thee = EEG_to_ERPTier_bit (me, GET_REAL (U"From time"), GET_REAL (U"To time"), markerBit);
+		praat_new (thee.transfer(), my name, U"_bit", markerBit);
 	}
-END
+END2 }
 
-FORM (EEG_to_ERPTier_marker, L"To ERPTier (marker)", 0)
-	REAL (L"From time (s)", L"-0.11")
-	REAL (L"To time (s)", L"0.39")
-	NATURAL (L"Marker number", L"12")
-	OK
+FORM (EEG_to_ERPTier_marker, U"To ERPTier (marker)", 0) {
+	REAL (U"From time (s)", U"-0.11")
+	REAL (U"To time (s)", U"0.39")
+	NATURAL (U"Marker number", U"12")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		uint16_t markerNumber = GET_INTEGER (L"Marker number");
-		autoERPTier thee = EEG_to_ERPTier_marker (me, GET_REAL (L"From time"), GET_REAL (L"To time"), markerNumber);
-		praat_new (thee.transfer(), my name, L"_", Melder_integer (markerNumber));
+		uint16 markerNumber = GET_INTEGER (U"Marker number");
+		autoERPTier thee = EEG_to_ERPTier_marker (me, GET_REAL (U"From time"), GET_REAL (U"To time"), markerNumber);
+		praat_new (thee.transfer(), my name, U"_", markerNumber);
 	}
-END
+END2 }
 
-FORM (EEG_to_ERPTier_triggers, L"To ERPTier (triggers)", 0)
-	REAL (L"From time (s)", L"-0.11")
-	REAL (L"To time (s)", L"0.39")
-	OPTIONMENU_ENUM (L"Get every event with a trigger that", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"1")
-	OK
+FORM (EEG_to_ERPTier_triggers, U"To ERPTier (triggers)", 0) {
+	REAL (U"From time (s)", U"-0.11")
+	REAL (U"To time (s)", U"0.39")
+	OPTIONMENU_ENUM (U"Get every event with a trigger that", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"1")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		autoERPTier thee = EEG_to_ERPTier_triggers (me, GET_REAL (L"From time"), GET_REAL (L"To time"),
-			GET_ENUM (kMelder_string, L"Get every event with a trigger that"), GET_STRING (L"...the text"));
-		praat_new (thee.transfer(), my name, L"_trigger", GET_STRING (L"...the text"));
+		autoERPTier thee = EEG_to_ERPTier_triggers (me, GET_REAL (U"From time"), GET_REAL (U"To time"),
+			GET_ENUM (kMelder_string, U"Get every event with a trigger that"), GET_STRING (U"...the text"));
+		praat_new (thee.transfer(), my name, U"_trigger", GET_STRING (U"...the text"));
 	}
-END
+END2 }
 
-FORM (EEG_to_ERPTier_triggers_preceded, L"To ERPTier (triggers, preceded)", 0)
-	REAL (L"From time (s)", L"-0.11")
-	REAL (L"To time (s)", L"0.39")
-	OPTIONMENU_ENUM (L"Get every event with a trigger that", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"1")
-	OPTIONMENU_ENUM (L"and is preceded by a trigger that", kMelder_string, DEFAULT)
-	SENTENCE (L" ...the text", L"4")
-	OK
+FORM (EEG_to_ERPTier_triggers_preceded, U"To ERPTier (triggers, preceded)", 0) {
+	REAL (U"From time (s)", U"-0.11")
+	REAL (U"To time (s)", U"0.39")
+	OPTIONMENU_ENUM (U"Get every event with a trigger that", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"1")
+	OPTIONMENU_ENUM (U"and is preceded by a trigger that", kMelder_string, DEFAULT)
+	SENTENCE (U" ...the text", U"4")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
-		autoERPTier thee = EEG_to_ERPTier_triggers_preceded (me, GET_REAL (L"From time"), GET_REAL (L"To time"),
-			GET_ENUM (kMelder_string, L"Get every event with a trigger that"), GET_STRING (L"...the text"),
-			GET_ENUM (kMelder_string, L"and is preceded by a trigger that"), GET_STRING (L" ...the text"));
-		praat_new (thee.transfer(), my name, L"_trigger", GET_STRING (L" ...the text"));
+		autoERPTier thee = EEG_to_ERPTier_triggers_preceded (me, GET_REAL (U"From time"), GET_REAL (U"To time"),
+			GET_ENUM (kMelder_string, U"Get every event with a trigger that"), GET_STRING (U"...the text"),
+			GET_ENUM (kMelder_string, U"and is preceded by a trigger that"), GET_STRING (U" ...the text"));
+		praat_new (thee.transfer(), my name, U"_trigger", GET_STRING (U" ...the text"));
 	}
-END
+END2 }
 
-FORM (EEG_to_MixingMatrix, L"To MixingMatrix", 0)
-	NATURAL (L"Maximum number of iterations", L"100")
-	POSITIVE (L"Tolerance", L"0.001")
-	OPTIONMENU (L"Diagonalization method", 2)
-		OPTION (L"qdiag")
-		OPTION (L"ffdiag")
-	OK
+FORM (EEG_to_MixingMatrix, U"To MixingMatrix", 0) {
+	NATURAL (U"Maximum number of iterations", U"100")
+	POSITIVE (U"Tolerance", U"0.001")
+	OPTIONMENU (U"Diagonalization method", 2)
+		OPTION (U"qdiag")
+		OPTION (U"ffdiag")
+	OK2
 DO
 	LOOP {
 		iam (EEG);
 		autoMixingMatrix thee = EEG_to_MixingMatrix (me,
-			GET_INTEGER (L"Maximum number of iterations"), GET_REAL (L"Tolerance"),
-			GET_INTEGER (L"Diagonalization method"));
+			GET_INTEGER (U"Maximum number of iterations"), GET_REAL (U"Tolerance"),
+			GET_INTEGER (U"Diagonalization method"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-static void cb_EEGWindow_publication (Editor editor, void *closure, Data publication) {
+static void cb_EEGWindow_publication (Editor editor, void *closure, Daata publication) {
 	(void) editor;
 	(void) closure;
 	/*
 	 * Keep the gate for error handling.
 	 */
 	try {
-		praat_new (publication, NULL);
+		praat_new (publication);
 		praat_updateSelection ();
-		if (Thing_member (publication, classSpectrum) && wcsequ (Thing_getName (publication), L"slice")) {
+		if (Thing_isa (publication, classSpectrum) && str32equ (Thing_getName (publication), U"slice")) {
 			int IOBJECT;
 			LOOP {
 				iam (Spectrum);
@@ -317,316 +317,316 @@ static void cb_EEGWindow_publication (Editor editor, void *closure, Data publica
 			}
 		}
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 }
-DIRECT (EEG_viewAndEdit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit an EEG from batch.");
+DIRECT2 (EEG_viewAndEdit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit an EEG from batch.");
 	LOOP {
 		iam (EEG);
 		autoEEGWindow editor = EEGWindow_create (ID_AND_FULL_NAME, me);
-		editor -> setPublicationCallback (cb_EEGWindow_publication, NULL);
+		Editor_setPublicationCallback (editor.peek(), cb_EEGWindow_publication, NULL);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
 #pragma mark EEG & TextGrid
 
-DIRECT (EEG_TextGrid_replaceTextGrid)
+DIRECT2 (EEG_TextGrid_replaceTextGrid) {
 	EEG me = FIRST (EEG);
 	EEG_replaceTextGrid (me, FIRST (TextGrid));
 	praat_dataChanged (me);
-END
+END2 }
 
 #pragma mark ERP
 
-DIRECT (ERP_downto_Sound)
+DIRECT2 (ERP_downto_Sound) {
 	LOOP {
 		iam (ERP);
 		autoSound thee = ERP_downto_Sound (me);
-		praat_new (thee.transfer(), NULL);
+		praat_new (thee.transfer());
 	}
-END
+END2 }
 
-FORM (ERP_downto_Table, L"ERP: Down to Table", 0)
-	BOOLEAN (L"Include sample number", false)
-	BOOLEAN (L"Include time", true)
-	NATURAL (L"Time decimals", L"6")
-	NATURAL (L"Voltage decimals", L"12")
-	RADIO (L"Voltage units", 1)
-		OPTION (L"volt")
-		OPTION (L"microvolt")
-	OK
+FORM (ERP_downto_Table, U"ERP: Down to Table", 0) {
+	BOOLEAN (U"Include sample number", false)
+	BOOLEAN (U"Include time", true)
+	NATURAL (U"Time decimals", U"6")
+	NATURAL (U"Voltage decimals", U"12")
+	RADIO (U"Voltage units", 1)
+		OPTION (U"volt")
+		OPTION (U"microvolt")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
-		autoTable thee = ERP_tabulate (me, GET_INTEGER (L"Include sample number"),
-			GET_INTEGER (L"Include time"), GET_INTEGER (L"Time decimals"), GET_INTEGER (L"Voltage decimals"), GET_INTEGER (L"Voltage units"));
+		autoTable thee = ERP_tabulate (me, GET_INTEGER (U"Include sample number"),
+			GET_INTEGER (U"Include time"), GET_INTEGER (U"Time decimals"), GET_INTEGER (U"Voltage decimals"), GET_INTEGER (U"Voltage units"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (ERP_draw, L"ERP: Draw", 0)
-	SENTENCE (L"Channel name", L"Cz")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range", L"0.0 (= all)")
-	REAL (L"left Voltage range (V)", L"10e-6")
-	REAL (L"right Voltage range", L"-10e-6")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (ERP_draw, U"ERP: Draw", 0) {
+	SENTENCE (U"Channel name", U"Cz")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range", U"0.0 (= all)")
+	REAL (U"left Voltage range (V)", U"10e-6")
+	REAL (U"right Voltage range", U"-10e-6")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (ERP);
-		ERP_drawChannel_name (me, GRAPHICS, GET_STRING (L"Channel name"), GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Voltage range"), GET_REAL (L"right Voltage range"), GET_INTEGER (L"Garnish"));
+		ERP_drawChannel_name (me, GRAPHICS, GET_STRING (U"Channel name"), GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Voltage range"), GET_REAL (U"right Voltage range"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-FORM (ERP_drawScalp, L"ERP: Draw scalp", 0)
-	REAL (L"left Time range (s)", L"0.1")
-	REAL (L"right Time range", L"0.2")
-	REAL (L"left Voltage range (V)", L"10e-6")
-	REAL (L"right Voltage range", L"-10e-6")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (ERP_drawScalp, U"ERP: Draw scalp", 0) {
+	REAL (U"left Time range (s)", U"0.1")
+	REAL (U"right Time range", U"0.2")
+	REAL (U"left Voltage range (V)", U"10e-6")
+	REAL (U"right Voltage range", U"-10e-6")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (ERP);
-		ERP_drawScalp (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Voltage range"), GET_REAL (L"right Voltage range"), kGraphics_colourScale_GREY, GET_INTEGER (L"Garnish"));
+		ERP_drawScalp (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Voltage range"), GET_REAL (U"right Voltage range"), kGraphics_colourScale_GREY, GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-FORM (ERP_drawScalp_colour, L"ERP: Draw scalp (colour)", 0)
-	REAL (L"left Time range (s)", L"0.1")
-	REAL (L"right Time range", L"0.2")
-	REAL (L"left Voltage range (V)", L"10e-6")
-	REAL (L"right Voltage range", L"-10e-6")
-	RADIO_ENUM (L"Colour scale", kGraphics_colourScale, BLUE_TO_RED)
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (ERP_drawScalp_colour, U"ERP: Draw scalp (colour)", 0) {
+	REAL (U"left Time range (s)", U"0.1")
+	REAL (U"right Time range", U"0.2")
+	REAL (U"left Voltage range (V)", U"10e-6")
+	REAL (U"right Voltage range", U"-10e-6")
+	RADIO_ENUM (U"Colour scale", kGraphics_colourScale, BLUE_TO_RED)
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (ERP);
-		ERP_drawScalp (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Voltage range"), GET_REAL (L"right Voltage range"), GET_ENUM(kGraphics_colourScale, L"Colour scale"), GET_INTEGER (L"Garnish"));
+		ERP_drawScalp (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Voltage range"), GET_REAL (U"right Voltage range"), GET_ENUM (kGraphics_colourScale, U"Colour scale"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-FORM (ERP_drawScalp_garnish, L"ERP: Draw scalp (garnish)", 0)
-	REAL (L"left Voltage range (V)", L"10e-6")
-	REAL (L"right Voltage range", L"-10e-6")
-	RADIO_ENUM (L"Colour scale", kGraphics_colourScale, BLUE_TO_RED)
-	OK
+FORM (ERP_drawScalp_garnish, U"ERP: Draw scalp (garnish)", 0) {
+	REAL (U"left Voltage range (V)", U"10e-6")
+	REAL (U"right Voltage range", U"-10e-6")
+	RADIO_ENUM (U"Colour scale", kGraphics_colourScale, BLUE_TO_RED)
+	OK2
 DO
 	autoPraatPicture picture;
 	ERP_drawScalp_garnish (GRAPHICS,
-		GET_REAL (L"left Voltage range"), GET_REAL (L"right Voltage range"), GET_ENUM(kGraphics_colourScale, L"Colour scale"));
-END
+		GET_REAL (U"left Voltage range"), GET_REAL (U"right Voltage range"), GET_ENUM (kGraphics_colourScale, U"Colour scale"));
+END2 }
 
-FORM (ERP_extractOneChannelAsSound, L"ERP: Extract one channel as Sound", 0)
-	WORD (L"Channel name", L"Cz")
-	OK
+FORM (ERP_extractOneChannelAsSound, U"ERP: Extract one channel as Sound", 0) {
+	WORD (U"Channel name", U"Cz")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
-		const wchar_t *channelName = GET_STRING (L"Channel name");
+		const char32 *channelName = GET_STRING (U"Channel name");
 		long channelNumber = ERP_getChannelNumber (me, channelName);
-		if (channelNumber == 0) Melder_throw (me, ": no channel named \"", channelName, "\".");
+		if (channelNumber == 0) Melder_throw (me, U": no channel named \"", channelName, U"\".");
 		autoSound thee = Sound_extractChannel (me, channelNumber);
-		praat_new (thee.transfer(), my name, L"_", channelName);
+		praat_new (thee.transfer(), my name, U"_", channelName);
 	}
-END
+END2 }
 
-FORM (ERP_formula, L"ERP: Formula", L"ERP: Formula...")
-	LABEL (L"label1", L"! `x' is the time in seconds, `col' is the sample number.")
-	LABEL (L"label2", L"x = x1   ! time associated with first sample")
-	LABEL (L"label3", L"for col from 1 to ncol")
-	LABEL (L"label4", L"   self [col] = ...")
-	TEXTFIELD (L"formula", L"self")
-	LABEL (L"label5", L"   x = x + dx")
-	LABEL (L"label6", L"endfor")
-	OK
+FORM (ERP_formula, U"ERP: Formula", U"ERP: Formula...") {
+	LABEL (U"label1", U"! `x' is the time in seconds, `col' is the sample number.")
+	LABEL (U"label2", U"x = x1   ! time associated with first sample")
+	LABEL (U"label3", U"for col from 1 to ncol")
+	LABEL (U"label4", U"   self [col] = ...")
+	TEXTFIELD (U"formula", U"self")
+	LABEL (U"label5", U"   x = x + dx")
+	LABEL (U"label6", U"endfor")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
 		try {
-			Matrix_formula (me, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the ERP may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (ERP_formula_part, L"ERP: Formula (part)", L"ERP: Formula...")
-	REAL (L"From time", L"0.0")
-	REAL (L"To time", L"0.0 (= all)")
-	NATURAL (L"From channel", L"1")
-	NATURAL (L"To channel", L"2")
-	TEXTFIELD (L"formula", L"2 * self")
-	OK
+FORM (ERP_formula_part, U"ERP: Formula (part)", U"ERP: Formula...") {
+	REAL (U"From time", U"0.0")
+	REAL (U"To time", U"0.0 (= all)")
+	NATURAL (U"From channel", U"1")
+	NATURAL (U"To channel", U"2")
+	TEXTFIELD (U"formula", U"2 * self")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
 		try {
 			Matrix_formula_part (me,
-				GET_REAL (L"From time"), GET_REAL (L"To time"),
-				GET_INTEGER (L"From channel") - 0.5, GET_INTEGER (L"To channel") + 0.5,
-				GET_STRING (L"formula"), interpreter, NULL);
+				GET_REAL (U"From time"), GET_REAL (U"To time"),
+				GET_INTEGER (U"From channel") - 0.5, GET_INTEGER (U"To channel") + 0.5,
+				GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the ERP may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (ERP_getChannelName, L"Get channel name", 0)
-	NATURAL (L"Channel number", L"1")
-	OK
+FORM (ERP_getChannelName, U"Get channel name", 0) {
+	NATURAL (U"Channel number", U"1")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
-		long channelNumber = GET_INTEGER (L"Channel number");
+		long channelNumber = GET_INTEGER (U"Channel number");
 		if (channelNumber > my ny)
-			Melder_throw (me, ": there are only ", my ny, " channels.");
+			Melder_throw (me, U": there are only ", my ny, U" channels.");
 		Melder_information (my channelNames [channelNumber]);
 	}
-END
+END2 }
 
-FORM (ERP_getChannelNumber, L"Get channel number", 0)
-	WORD (L"Channel name", L"Cz")
-	OK
+FORM (ERP_getChannelNumber, U"Get channel number", 0) {
+	WORD (U"Channel name", U"Cz")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
-		Melder_information (Melder_integer (ERP_getChannelNumber (me, GET_STRING (L"Channel name"))));
+		Melder_information (ERP_getChannelNumber (me, GET_STRING (U"Channel name")));
 	}
-END
+END2 }
 
-FORM (ERP_getMaximum, L"ERP: Get maximum", L"Sound: Get maximum...")
-	SENTENCE (L"Channel name", L"Cz")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 4)
-		RADIOBUTTON (L"None")
-		RADIOBUTTON (L"Parabolic")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
-	OK
+FORM (ERP_getMaximum, U"ERP: Get maximum", U"Sound: Get maximum...") {
+	SENTENCE (U"Channel name", U"Cz")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
-		const wchar_t *channelName = GET_STRING (L"Channel name");
+		const char32 *channelName = GET_STRING (U"Channel name");
 		long channelNumber = ERP_getChannelNumber (me, channelName);
-		if (channelNumber == 0) Melder_throw (me, ": no channel named \"", channelName, "\".");
+		if (channelNumber == 0) Melder_throw (me, U": no channel named \"", channelName, U"\".");
 		double maximum;
-		Vector_getMaximumAndX (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), channelNumber, GET_INTEGER (L"Interpolation") - 1, & maximum, NULL);
-		Melder_informationReal (maximum, L"Volt");
+		Vector_getMaximumAndX (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), channelNumber, GET_INTEGER (U"Interpolation") - 1, & maximum, NULL);
+		Melder_informationReal (maximum, U"Volt");
 	}
-END
+END2 }
 
-FORM (ERP_getMean, L"ERP: Get mean", L"ERP: Get mean...")
-	SENTENCE (L"Channel name", L"Cz")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	OK
+FORM (ERP_getMean, U"ERP: Get mean", U"ERP: Get mean...") {
+	SENTENCE (U"Channel name", U"Cz")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
-		const wchar_t *channelName = GET_STRING (L"Channel name");
+		const char32 *channelName = GET_STRING (U"Channel name");
 		long channelNumber = ERP_getChannelNumber (me, channelName);
-		if (channelNumber == 0) Melder_throw (me, ": no channel named \"", channelName, "\".");
-		double mean = Vector_getMean (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), channelNumber);
-		Melder_informationReal (mean, L"Volt");
+		if (channelNumber == 0) Melder_throw (me, U": no channel named \"", channelName, U"\".");
+		double mean = Vector_getMean (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), channelNumber);
+		Melder_informationReal (mean, U"Volt");
 	}
-END
+END2 }
 
-FORM (ERP_getMinimum, L"ERP: Get minimum", L"Sound: Get minimum...")
-	SENTENCE (L"Channel name", L"Cz")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 4)
-		RADIOBUTTON (L"None")
-		RADIOBUTTON (L"Parabolic")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
-	OK
+FORM (ERP_getMinimum, U"ERP: Get minimum", U"Sound: Get minimum...") {
+	SENTENCE (U"Channel name", U"Cz")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
-		const wchar_t *channelName = GET_STRING (L"Channel name");
+		const char32 *channelName = GET_STRING (U"Channel name");
 		long channelNumber = ERP_getChannelNumber (me, channelName);
-		if (channelNumber == 0) Melder_throw (me, ": no channel named \"", channelName, "\".");
+		if (channelNumber == 0) Melder_throw (me, U": no channel named \"", channelName, U"\".");
 		double minimum;
-		Vector_getMinimumAndX (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), channelNumber, GET_INTEGER (L"Interpolation") - 1, & minimum, NULL);
-		Melder_informationReal (minimum, L"Volt");
+		Vector_getMinimumAndX (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), channelNumber, GET_INTEGER (U"Interpolation") - 1, & minimum, NULL);
+		Melder_informationReal (minimum, U"Volt");
 	}
-END
+END2 }
 
-FORM (ERP_getTimeOfMaximum, L"ERP: Get time of maximum", L"Sound: Get time of maximum...")
-	SENTENCE (L"Channel name", L"Cz")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 4)
-		RADIOBUTTON (L"None")
-		RADIOBUTTON (L"Parabolic")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
-	OK
+FORM (ERP_getTimeOfMaximum, U"ERP: Get time of maximum", U"Sound: Get time of maximum...") {
+	SENTENCE (U"Channel name", U"Cz")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
-		const wchar_t *channelName = GET_STRING (L"Channel name");
+		const char32 *channelName = GET_STRING (U"Channel name");
 		long channelNumber = ERP_getChannelNumber (me, channelName);
-		if (channelNumber == 0) Melder_throw (me, ": no channel named \"", channelName, "\".");
+		if (channelNumber == 0) Melder_throw (me, U": no channel named \"", channelName, U"\".");
 		double timeOfMaximum;
-		Vector_getMaximumAndX (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), channelNumber, GET_INTEGER (L"Interpolation") - 1, NULL, & timeOfMaximum);
-		Melder_informationReal (timeOfMaximum, L"seconds");
+		Vector_getMaximumAndX (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), channelNumber, GET_INTEGER (U"Interpolation") - 1, NULL, & timeOfMaximum);
+		Melder_informationReal (timeOfMaximum, U"seconds");
 	}
-END
+END2 }
 
-FORM (ERP_getTimeOfMinimum, L"ERP: Get time of minimum", L"Sound: Get time of minimum...")
-	SENTENCE (L"Channel name", L"Cz")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 4)
-		RADIOBUTTON (L"None")
-		RADIOBUTTON (L"Parabolic")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
-	OK
+FORM (ERP_getTimeOfMinimum, U"ERP: Get time of minimum", U"Sound: Get time of minimum...") {
+	SENTENCE (U"Channel name", U"Cz")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
+	OK2
 DO
 	LOOP {
 		iam (ERP);
-		const wchar_t *channelName = GET_STRING (L"Channel name");
+		const char32 *channelName = GET_STRING (U"Channel name");
 		long channelNumber = ERP_getChannelNumber (me, channelName);
-		if (channelNumber == 0) Melder_throw (me, ": no channel named \"", channelName, "\".");
+		if (channelNumber == 0) Melder_throw (me, U": no channel named \"", channelName, U"\".");
 		double timeOfMinimum;
-		Vector_getMinimumAndX (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), channelNumber, GET_INTEGER (L"Interpolation") - 1, NULL, & timeOfMinimum);
-		Melder_informationReal (timeOfMinimum, L"seconds");
+		Vector_getMinimumAndX (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), channelNumber, GET_INTEGER (U"Interpolation") - 1, NULL, & timeOfMinimum);
+		Melder_informationReal (timeOfMinimum, U"seconds");
 	}
-END
+END2 }
 
-static void cb_ERPWindow_publication (Editor editor, void *closure, Data publication) {
+static void cb_ERPWindow_publication (Editor editor, void *closure, Daata publication) {
 	(void) editor;
 	(void) closure;
 	/*
 	 * Keep the gate for error handling.
 	 */
 	try {
-		praat_new (publication, NULL);
+		praat_new (publication);
 		praat_updateSelection ();
-		if (Thing_member (publication, classSpectrum) && wcsequ (Thing_getName (publication), L"slice")) {
+		if (Thing_isa (publication, classSpectrum) && str32equ (Thing_getName (publication), U"slice")) {
 			int IOBJECT;
 			LOOP {
 				iam (Spectrum);
@@ -635,154 +635,159 @@ static void cb_ERPWindow_publication (Editor editor, void *closure, Data publica
 			}
 		}
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 }
-DIRECT (ERP_viewAndEdit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit an ERP from batch.");
+DIRECT2 (ERP_viewAndEdit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit an ERP from batch.");
 	LOOP {
 		iam (ERP);
 		autoERPWindow editor = ERPWindow_create (ID_AND_FULL_NAME, me);
-		editor -> setPublicationCallback (cb_ERPWindow_publication, NULL);
+		Editor_setPublicationCallback (editor.peek(), cb_ERPWindow_publication, NULL);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
 /***** ERPTier *****/
 
-FORM (ERPTier_getChannelName, L"Get channel name", 0)
-	NATURAL (L"Channel number", L"1")
-	OK
+FORM (ERPTier_getChannelName, U"Get channel name", 0) {
+	NATURAL (U"Channel number", U"1")
+	OK2
 DO
 	LOOP {
 		iam (ERPTier);
-		long channelNumber = GET_INTEGER (L"Channel number");
+		long channelNumber = GET_INTEGER (U"Channel number");
 		if (channelNumber > my numberOfChannels)
-			Melder_throw (me, ": there are only ", my numberOfChannels, " channels.");
+			Melder_throw (me, U": there are only ", my numberOfChannels, U" channels.");
 		Melder_information (my channelNames [channelNumber]);
 	}
-END
+END2 }
 
-FORM (ERPTier_getChannelNumber, L"Get channel number", 0)
-	WORD (L"Channel name", L"Cz")
-	OK
+FORM (ERPTier_getChannelNumber, U"Get channel number", 0) {
+	WORD (U"Channel name", U"Cz")
+	OK2
 DO
 	LOOP {
 		iam (ERPTier);
-		Melder_information (Melder_integer (ERPTier_getChannelNumber (me, GET_STRING (L"Channel name"))));
+		Melder_information (ERPTier_getChannelNumber (me, GET_STRING (U"Channel name")));
 	}
-END
+END2 }
 
-FORM (ERPTier_getMean, L"ERPTier: Get mean", L"ERPTier: Get mean...")
-	NATURAL (L"Point number", L"1")
-	SENTENCE (L"Channel name", L"Cz")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	OK
+FORM (ERPTier_getMean, U"ERPTier: Get mean", U"ERPTier: Get mean...") {
+	NATURAL (U"Point number", U"1")
+	SENTENCE (U"Channel name", U"Cz")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	OK2
 DO
 	LOOP {
 		iam (ERPTier);
-		double mean = ERPTier_getMean (me, GET_INTEGER (L"Point number"), GET_STRING (L"Channel name"), GET_REAL (L"left Time range"), GET_REAL (L"right Time range"));
-		Melder_informationReal (mean, L"Volt");
+		double mean = ERPTier_getMean (me, GET_INTEGER (U"Point number"), GET_STRING (U"Channel name"), GET_REAL (U"left Time range"), GET_REAL (U"right Time range"));
+		Melder_informationReal (mean, U"Volt");
 	}
-END
+END2 }
 
-FORM (ERPTier_rejectArtefacts, L"Reject artefacts", 0)
-	POSITIVE (L"Threshold (V)", L"75e-6")
-	OK
+FORM (ERPTier_rejectArtefacts, U"Reject artefacts", 0) {
+	POSITIVE (U"Threshold (V)", U"75e-6")
+	OK2
 DO
 	LOOP {
 		iam (ERPTier);
-		ERPTier_rejectArtefacts (me, GET_REAL (L"Threshold"));
+		ERPTier_rejectArtefacts (me, GET_REAL (U"Threshold"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (ERPTier_removeEventsBetween, L"Remove events", L"ERPTier: Remove events between...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"1.0")
-	OK
+FORM (ERPTier_removeEventsBetween, U"Remove events", U"ERPTier: Remove events between...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"1.0")
+	OK2
 DO
 	LOOP {
 		iam (ERPTier);
-		AnyTier_removePointsBetween (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"));
+		AnyTier_removePointsBetween (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (ERPTier_subtractBaseline, L"Subtract baseline", 0)
-	REAL (L"From time (s)", L"-0.11")
-	REAL (L"To time (s)", L"0.0")
-	OK
+FORM (ERPTier_subtractBaseline, U"Subtract baseline", 0) {
+	REAL (U"From time (s)", U"-0.11")
+	REAL (U"To time (s)", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (ERPTier);
-		ERPTier_subtractBaseline (me, GET_REAL (L"From time"), GET_REAL (L"To time"));
+		ERPTier_subtractBaseline (me, GET_REAL (U"From time"), GET_REAL (U"To time"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (ERPTier_to_ERP, L"ERPTier: To ERP", 0)
-	NATURAL (L"Event number", L"1")
-	OK
+FORM (ERPTier_to_ERP, U"ERPTier: To ERP", 0) {
+	NATURAL (U"Event number", U"1")
+	OK2
 DO
 	LOOP {
 		iam (ERPTier);
-		autoERP thee = ERPTier_extractERP (me, GET_INTEGER (L"Event number"));
-		praat_new (thee.transfer(), my name, L"_mean");
+		autoERP thee = ERPTier_extractERP (me, GET_INTEGER (U"Event number"));
+		praat_new (thee.transfer(), my name, U"_mean");
 	}
-END
+END2 }
 
-DIRECT (ERPTier_to_ERP_mean)
+DIRECT2 (ERPTier_to_ERP_mean) {
 	LOOP {
 		iam (ERPTier);
 		autoERP thee = ERPTier_to_ERP_mean (me);
-		praat_new (thee.transfer(), my name, L"_mean");
+		praat_new (thee.transfer(), my name, U"_mean");
 	}
-END
+END2 }
 
 /***** ERPTier & Table *****/
 
-FORM (ERPTier_Table_extractEventsWhereColumn_number, L"Extract events where column (number)", 0)
-	WORD (L"Extract all events where column...", L"")
-	RADIO_ENUM (L"...is...", kMelder_number, DEFAULT)
-	REAL (L"...the number", L"0.0")
-	OK
+FORM (ERPTier_Table_extractEventsWhereColumn_number, U"Extract events where column (number)", 0) {
+	WORD (U"Extract all events where column...", U"")
+	RADIO_ENUM (U"...is...", kMelder_number, DEFAULT)
+	REAL (U"...the number", U"0.0")
+	OK2
 DO
 	ERPTier erpTier = FIRST (ERPTier);
 	Table table = FIRST (Table);
-	long columnNumber = Table_getColumnIndexFromColumnLabel (table, GET_STRING (L"Extract all events where column..."));
-	autoERPTier thee = ERPTier_extractEventsWhereColumn_number (erpTier, table, columnNumber, GET_ENUM (kMelder_number, L"...is..."), GET_REAL (L"...the number"));
+	long columnNumber = Table_getColumnIndexFromColumnLabel (table, GET_STRING (U"Extract all events where column..."));
+	autoERPTier thee = ERPTier_extractEventsWhereColumn_number (erpTier, table, columnNumber, GET_ENUM (kMelder_number, U"...is..."), GET_REAL (U"...the number"));
 	praat_new (thee.transfer(), erpTier -> name);
-END
+END2 }
 
-FORM (ERPTier_Table_extractEventsWhereColumn_text, L"Extract events where column (text)", 0)
-	WORD (L"Extract all events where column...", L"")
-	OPTIONMENU_ENUM (L"...", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"hi")
-	OK
+FORM (ERPTier_Table_extractEventsWhereColumn_text, U"Extract events where column (text)", 0) {
+	WORD (U"Extract all events where column...", U"")
+	OPTIONMENU_ENUM (U"...", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
+	OK2
 DO
 	ERPTier erpTier = FIRST (ERPTier);
 	Table table = FIRST (Table);
-	long columnNumber = Table_getColumnIndexFromColumnLabel (table, GET_STRING (L"Extract all events where column..."));
-	autoERPTier thee = ERPTier_extractEventsWhereColumn_string (erpTier, table, columnNumber, GET_ENUM (kMelder_string, L"..."), GET_STRING (L"...the text"));
+	long columnNumber = Table_getColumnIndexFromColumnLabel (table, GET_STRING (U"Extract all events where column..."));
+	autoERPTier thee = ERPTier_extractEventsWhereColumn_string (erpTier, table, columnNumber, GET_ENUM (kMelder_string, U"..."), GET_STRING (U"...the text"));
 	praat_new (thee.transfer(), erpTier -> name);
-END
+END2 }
 
 /***** Help menus *****/
 
-DIRECT (EEG_help)     Melder_help (L"EEG");     END
-DIRECT (ERPTier_help) Melder_help (L"ERPTier"); END
+DIRECT2 (EEG_help) {
+	Melder_help (U"EEG");
+END2 }
+
+DIRECT2 (ERPTier_help) {
+	Melder_help (U"ERPTier");
+END2 }
 
 /***** file recognizers *****/
 
 static Any bdfFileRecognizer (int nread, const char *header, MelderFile file) {
 	(void) header;
-	const wchar_t *fileName = MelderFile_name (file);
-	bool isBdfFile = Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".bdf") ||
-	                 Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".BDF");
-	bool isEdfFile = Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".edf") ||
-	                 Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".EDF");
+	const char32 *fileName = MelderFile_name (file);
+	bool isBdfFile = Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".bdf") ||
+	                 Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".BDF");
+	bool isEdfFile = Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".edf") ||
+	                 Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".EDF");
 	if (nread < 512 || (! isBdfFile && ! isEdfFile)) return NULL;
 	return EEG_readFromBdfFile (file);
 }
@@ -791,94 +796,94 @@ static Any bdfFileRecognizer (int nread, const char *header, MelderFile file) {
 
 void praat_TimeTier_query_init (ClassInfo klas);   // Query buttons for time-based subclasses of AnyTier.
 
-void praat_EEG_init (void);
-void praat_EEG_init (void) {
+void praat_EEG_init ();
+void praat_EEG_init () {
 
 	Thing_recognizeClassesByName (classEEG, classERPTier, classERP, NULL);
 
 	Data_recognizeFileType (bdfFileRecognizer);
 
-	praat_addAction1 (classEEG, 0, L"EEG help", 0, 0, DO_EEG_help);
-	praat_addAction1 (classEEG, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_EEG_viewAndEdit);
-	praat_addAction1 (classEEG, 0, L"Query -", 0, 0, 0);
-		praat_addAction1 (classEEG, 0, L"Get channel name...", 0, 1, DO_EEG_getChannelName);
-		praat_addAction1 (classEEG, 0, L"Get channel number...", 0, 1, DO_EEG_getChannelNumber);
-	praat_addAction1 (classEEG, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classEEG, 0, L"Set channel name...", 0, 1, DO_EEG_setChannelName);
-		praat_addAction1 (classEEG, 1, L"Edit external electrode names...", 0, 1, DO_EEG_editExternalElectrodeNames);
-		praat_addAction1 (classEEG, 0, L"-- processing --", 0, 1, 0);
-		praat_addAction1 (classEEG, 0, L"Subtract reference...", 0, 1, DO_EEG_subtractReference);
-		praat_addAction1 (classEEG, 0, L"Subtract mean channel...", 0, 1, DO_EEG_subtractMeanChannel);
-		praat_addAction1 (classEEG, 0, L"Detrend", 0, 1, DO_EEG_detrend);
-		praat_addAction1 (classEEG, 0, L"Filter...", 0, 1, DO_EEG_filter);
-		praat_addAction1 (classEEG, 0, L"Remove triggers...", 0, 1, DO_EEG_removeTriggers);
-		praat_addAction1 (classEEG, 0, L"Set channel to zero...", 0, 1, DO_EEG_setChannelToZero);
-	praat_addAction1 (classEEG, 0, L"Analyse", 0, 0, 0);
-		praat_addAction1 (classEEG, 0, L"Extract channel...", 0, 0, DO_EEG_extractChannel);
-		praat_addAction1 (classEEG, 1, L"Extract part...", 0, 0, DO_EEG_extractPart);
-		praat_addAction1 (classEEG, 0, L"To ERPTier -", 0, 0, 0);
-		praat_addAction1 (classEEG, 0, L"To ERPTier (bit)...", 0, 1, DO_EEG_to_ERPTier_bit);
-		praat_addAction1 (classEEG, 0, L"To ERPTier (marker)...", 0, 1, DO_EEG_to_ERPTier_marker);
-		praat_addAction1 (classEEG, 0, L"To ERPTier (triggers)...", 0, 1, DO_EEG_to_ERPTier_triggers);
-		praat_addAction1 (classEEG, 0, L"To ERPTier (triggers, preceded)...", 0, 1, DO_EEG_to_ERPTier_triggers_preceded);
-		praat_addAction1 (classEEG, 0, L"To ERPTier...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_EEG_to_ERPTier_bit);
-		praat_addAction1 (classEEG, 0, L"To MixingMatrix...", 0, 0, DO_EEG_to_MixingMatrix);
-	praat_addAction1 (classEEG, 0, L"Synthesize", 0, 0, 0);
-		praat_addAction1 (classEEG, 0, L"Concatenate", 0, 0, DO_EEGs_concatenate);
-	praat_addAction1 (classEEG, 0, L"Hack -", 0, 0, 0);
-		praat_addAction1 (classEEG, 0, L"Extract waveforms as Sound", 0, 1, DO_EEG_extractSound);
-		praat_addAction1 (classEEG, 0, L"Extract marks as TextGrid", 0, 1, DO_EEG_extractTextGrid);
-
-	praat_addAction1 (classERP, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_ERP_viewAndEdit);
-	praat_addAction1 (classERP, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classERP, 0, L"Draw...", 0, 1, DO_ERP_draw);
-		praat_addAction1 (classERP, 0, L"Draw scalp...", 0, 1, DO_ERP_drawScalp);
-		praat_addAction1 (classERP, 0, L"Draw scalp (colour)...", 0, 1, DO_ERP_drawScalp_colour);
-		praat_addAction1 (classERP, 0, L"Draw scalp (garnish)...", 0, 1, DO_ERP_drawScalp_garnish);
-	praat_addAction1 (classERP, 0, L"Tabulate -", 0, 0, 0);
-		praat_addAction1 (classERP, 0, L"Down to Table...", 0, 1, DO_ERP_downto_Table);
-	praat_addAction1 (classERP, 0, L"Query -", 0, 0, 0);
-		praat_addAction1 (classERP, 0, L"Get channel name...", 0, 1, DO_ERP_getChannelName);
-		praat_addAction1 (classERP, 0, L"Get channel number...", 0, 1, DO_ERP_getChannelNumber);
-		praat_addAction1 (classERP, 0, L"-- get shape --", 0, 1, 0);
-		praat_addAction1 (classERP, 0, L"Get minimum...", 0, 1, DO_ERP_getMinimum);
-		praat_addAction1 (classERP, 0, L"Get time of minimum...", 0, 1, DO_ERP_getTimeOfMinimum);
-		praat_addAction1 (classERP, 0, L"Get maximum...", 0, 1, DO_ERP_getMaximum);
-		praat_addAction1 (classERP, 0, L"Get time of maximum...", 0, 1, DO_ERP_getTimeOfMaximum);
-		praat_addAction1 (classERP, 0, L"-- get statistics --", 0, 1, 0);
-		praat_addAction1 (classERP, 0, L"Get mean...", 0, 1, DO_ERP_getMean);
-	praat_addAction1 (classERP, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classERP, 0, L"Formula...", 0, 1, DO_ERP_formula);
-		praat_addAction1 (classERP, 0, L"Formula (part)...", 0, 1, DO_ERP_formula_part);
-	// praat_addAction1 (classERP, 0, L"Analyse -", 0, 0, 0);
-		// praat_addAction1 (classERP, 0, L"To ERP (difference)", 0, 1, DO_ERP_to_ERP_difference);
-		// praat_addAction1 (classERP, 0, L"To ERP (mean)", 0, 1, DO_ERP_to_ERP_mean);
-	praat_addAction1 (classERP, 0, L"Hack -", 0, 0, 0);
-		praat_addAction1 (classERP, 0, L"Down to Sound", 0, 1, DO_ERP_downto_Sound);
-		praat_addAction1 (classERP, 0, L"Extract one channel as Sound...", 0, 1, DO_ERP_extractOneChannelAsSound);
-
-	praat_addAction1 (classERPTier, 0, L"ERPTier help", 0, 0, DO_ERPTier_help);
-	// praat_addAction1 (classERPTier, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_ERPTier_viewAndEdit);
-	praat_addAction1 (classERPTier, 0, L"Query -", 0, 0, 0);
+	praat_addAction1 (classEEG, 0, U"EEG help", 0, 0, DO_EEG_help);
+	praat_addAction1 (classEEG, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_EEG_viewAndEdit);
+	praat_addAction1 (classEEG, 0, U"Query -", 0, 0, 0);
+		praat_addAction1 (classEEG, 0, U"Get channel name...", 0, 1, DO_EEG_getChannelName);
+		praat_addAction1 (classEEG, 0, U"Get channel number...", 0, 1, DO_EEG_getChannelNumber);
+	praat_addAction1 (classEEG, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classEEG, 0, U"Set channel name...", 0, 1, DO_EEG_setChannelName);
+		praat_addAction1 (classEEG, 1, U"Edit external electrode names...", 0, 1, DO_EEG_editExternalElectrodeNames);
+		praat_addAction1 (classEEG, 0, U"-- processing --", 0, 1, 0);
+		praat_addAction1 (classEEG, 0, U"Subtract reference...", 0, 1, DO_EEG_subtractReference);
+		praat_addAction1 (classEEG, 0, U"Subtract mean channel...", 0, 1, DO_EEG_subtractMeanChannel);
+		praat_addAction1 (classEEG, 0, U"Detrend", 0, 1, DO_EEG_detrend);
+		praat_addAction1 (classEEG, 0, U"Filter...", 0, 1, DO_EEG_filter);
+		praat_addAction1 (classEEG, 0, U"Remove triggers...", 0, 1, DO_EEG_removeTriggers);
+		praat_addAction1 (classEEG, 0, U"Set channel to zero...", 0, 1, DO_EEG_setChannelToZero);
+	praat_addAction1 (classEEG, 0, U"Analyse", 0, 0, 0);
+		praat_addAction1 (classEEG, 0, U"Extract channel...", 0, 0, DO_EEG_extractChannel);
+		praat_addAction1 (classEEG, 1, U"Extract part...", 0, 0, DO_EEG_extractPart);
+		praat_addAction1 (classEEG, 0, U"To ERPTier -", 0, 0, 0);
+		praat_addAction1 (classEEG, 0, U"To ERPTier (bit)...", 0, 1, DO_EEG_to_ERPTier_bit);
+		praat_addAction1 (classEEG, 0, U"To ERPTier (marker)...", 0, 1, DO_EEG_to_ERPTier_marker);
+		praat_addAction1 (classEEG, 0, U"To ERPTier (triggers)...", 0, 1, DO_EEG_to_ERPTier_triggers);
+		praat_addAction1 (classEEG, 0, U"To ERPTier (triggers, preceded)...", 0, 1, DO_EEG_to_ERPTier_triggers_preceded);
+		praat_addAction1 (classEEG, 0, U"To ERPTier...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_EEG_to_ERPTier_bit);
+		praat_addAction1 (classEEG, 0, U"To MixingMatrix...", 0, 0, DO_EEG_to_MixingMatrix);
+	praat_addAction1 (classEEG, 0, U"Synthesize", 0, 0, 0);
+		praat_addAction1 (classEEG, 0, U"Concatenate", 0, 0, DO_EEGs_concatenate);
+	praat_addAction1 (classEEG, 0, U"Hack -", 0, 0, 0);
+		praat_addAction1 (classEEG, 0, U"Extract waveforms as Sound", 0, 1, DO_EEG_extractSound);
+		praat_addAction1 (classEEG, 0, U"Extract marks as TextGrid", 0, 1, DO_EEG_extractTextGrid);
+
+	praat_addAction1 (classERP, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_ERP_viewAndEdit);
+	praat_addAction1 (classERP, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classERP, 0, U"Draw...", 0, 1, DO_ERP_draw);
+		praat_addAction1 (classERP, 0, U"Draw scalp...", 0, 1, DO_ERP_drawScalp);
+		praat_addAction1 (classERP, 0, U"Draw scalp (colour)...", 0, 1, DO_ERP_drawScalp_colour);
+		praat_addAction1 (classERP, 0, U"Draw scalp (garnish)...", 0, 1, DO_ERP_drawScalp_garnish);
+	praat_addAction1 (classERP, 0, U"Tabulate -", 0, 0, 0);
+		praat_addAction1 (classERP, 0, U"Down to Table...", 0, 1, DO_ERP_downto_Table);
+	praat_addAction1 (classERP, 0, U"Query -", 0, 0, 0);
+		praat_addAction1 (classERP, 0, U"Get channel name...", 0, 1, DO_ERP_getChannelName);
+		praat_addAction1 (classERP, 0, U"Get channel number...", 0, 1, DO_ERP_getChannelNumber);
+		praat_addAction1 (classERP, 0, U"-- get shape --", 0, 1, 0);
+		praat_addAction1 (classERP, 0, U"Get minimum...", 0, 1, DO_ERP_getMinimum);
+		praat_addAction1 (classERP, 0, U"Get time of minimum...", 0, 1, DO_ERP_getTimeOfMinimum);
+		praat_addAction1 (classERP, 0, U"Get maximum...", 0, 1, DO_ERP_getMaximum);
+		praat_addAction1 (classERP, 0, U"Get time of maximum...", 0, 1, DO_ERP_getTimeOfMaximum);
+		praat_addAction1 (classERP, 0, U"-- get statistics --", 0, 1, 0);
+		praat_addAction1 (classERP, 0, U"Get mean...", 0, 1, DO_ERP_getMean);
+	praat_addAction1 (classERP, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classERP, 0, U"Formula...", 0, 1, DO_ERP_formula);
+		praat_addAction1 (classERP, 0, U"Formula (part)...", 0, 1, DO_ERP_formula_part);
+	// praat_addAction1 (classERP, 0, U"Analyse -", 0, 0, 0);
+		// praat_addAction1 (classERP, 0, U"To ERP (difference)", 0, 1, DO_ERP_to_ERP_difference);
+		// praat_addAction1 (classERP, 0, U"To ERP (mean)", 0, 1, DO_ERP_to_ERP_mean);
+	praat_addAction1 (classERP, 0, U"Hack -", 0, 0, 0);
+		praat_addAction1 (classERP, 0, U"Down to Sound", 0, 1, DO_ERP_downto_Sound);
+		praat_addAction1 (classERP, 0, U"Extract one channel as Sound...", 0, 1, DO_ERP_extractOneChannelAsSound);
+
+	praat_addAction1 (classERPTier, 0, U"ERPTier help", 0, 0, DO_ERPTier_help);
+	// praat_addAction1 (classERPTier, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_ERPTier_viewAndEdit);
+	praat_addAction1 (classERPTier, 0, U"Query -", 0, 0, 0);
 		praat_TimeTier_query_init (classERPTier);
-		praat_addAction1 (classERPTier, 0, L"-- channel names --", 0, 1, 0);
-		praat_addAction1 (classERPTier, 0, L"Get channel name...", 0, 1, DO_ERPTier_getChannelName);
-		praat_addAction1 (classERPTier, 0, L"Get channel number...", 0, 1, DO_ERPTier_getChannelNumber);
-		praat_addAction1 (classERPTier, 0, L"-- erp --", 0, 1, 0);
-		praat_addAction1 (classERPTier, 0, L"Get mean...", 0, 1, DO_ERPTier_getMean);
-	praat_addAction1 (classERPTier, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classERPTier, 0, L"Subtract baseline...", 0, 1, DO_ERPTier_subtractBaseline);
-		praat_addAction1 (classERPTier, 0, L"Reject artefacts...", 0, 1, DO_ERPTier_rejectArtefacts);
-		praat_addAction1 (classERPTier, 0, L"-- structure --", 0, 1, 0);
-		praat_addAction1 (classERPTier, 0, L"Remove events between...", 0, 1, DO_ERPTier_removeEventsBetween);
-	praat_addAction1 (classERPTier, 0, L"Analyse", 0, 0, 0);
-		praat_addAction1 (classERPTier, 0, L"Extract ERP...", 0, 0, DO_ERPTier_to_ERP);
-		praat_addAction1 (classERPTier, 0, L"To ERP (mean)", 0, 0, DO_ERPTier_to_ERP_mean);
-
-	praat_addAction2 (classEEG, 1, classTextGrid, 1, L"Replace TextGrid", 0, 0, DO_EEG_TextGrid_replaceTextGrid);
-	praat_addAction2 (classERPTier, 1, classTable, 1, L"Extract -", 0, 0, 0);
-	praat_addAction2 (classERPTier, 1, classTable, 1, L"Extract events where column (number)...", 0, 1, DO_ERPTier_Table_extractEventsWhereColumn_number);
-	praat_addAction2 (classERPTier, 1, classTable, 1, L"Extract events where column (text)...", 0, 1, DO_ERPTier_Table_extractEventsWhereColumn_text);
+		praat_addAction1 (classERPTier, 0, U"-- channel names --", 0, 1, 0);
+		praat_addAction1 (classERPTier, 0, U"Get channel name...", 0, 1, DO_ERPTier_getChannelName);
+		praat_addAction1 (classERPTier, 0, U"Get channel number...", 0, 1, DO_ERPTier_getChannelNumber);
+		praat_addAction1 (classERPTier, 0, U"-- erp --", 0, 1, 0);
+		praat_addAction1 (classERPTier, 0, U"Get mean...", 0, 1, DO_ERPTier_getMean);
+	praat_addAction1 (classERPTier, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classERPTier, 0, U"Subtract baseline...", 0, 1, DO_ERPTier_subtractBaseline);
+		praat_addAction1 (classERPTier, 0, U"Reject artefacts...", 0, 1, DO_ERPTier_rejectArtefacts);
+		praat_addAction1 (classERPTier, 0, U"-- structure --", 0, 1, 0);
+		praat_addAction1 (classERPTier, 0, U"Remove events between...", 0, 1, DO_ERPTier_removeEventsBetween);
+	praat_addAction1 (classERPTier, 0, U"Analyse", 0, 0, 0);
+		praat_addAction1 (classERPTier, 0, U"Extract ERP...", 0, 0, DO_ERPTier_to_ERP);
+		praat_addAction1 (classERPTier, 0, U"To ERP (mean)", 0, 0, DO_ERPTier_to_ERP_mean);
+
+	praat_addAction2 (classEEG, 1, classTextGrid, 1, U"Replace TextGrid", 0, 0, DO_EEG_TextGrid_replaceTextGrid);
+	praat_addAction2 (classERPTier, 1, classTable, 1, U"Extract -", 0, 0, 0);
+	praat_addAction2 (classERPTier, 1, classTable, 1, U"Extract events where column (number)...", 0, 1, DO_ERPTier_Table_extractEventsWhereColumn_number);
+	praat_addAction2 (classERPTier, 1, classTable, 1, U"Extract events where column (text)...", 0, 1, DO_ERPTier_Table_extractEventsWhereColumn_text);
 
 	structEEGWindow :: f_preferences ();
 	structERPWindow :: f_preferences ();
diff --git a/FFNet/FFNet.cpp b/FFNet/FFNet.cpp
index 48064fa..aed24e3 100644
--- a/FFNet/FFNet.cpp
+++ b/FFNet/FFNet.cpp
@@ -1,6 +1,6 @@
 /* FFNet.cpp
  *
- * Copyright (C) 1997-2011 David Weenink
+ * Copyright (C) 1997-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@
  djmw 20050131 Reversed sign of derivative in minimumCrossEntropy.
  djmw 20060811 Changed %d to %ld in sprintf for longs.
  djmw 20061212 Changed info to Melder_writeLine<x> format.
- djmw 20070902 FFNet_createNameFromTopology to wchar_t
+ djmw 20070902 FFNet_createNameFromTopology to wchar
  djmw 20071014 Melder_error<n>
  djmw 20080121 float -> double
  djmw 20110304 Thing_new
@@ -62,51 +62,50 @@ static void bookkeeping (FFNet me);
 #include "oo_DESCRIPTION.h"
 #include "FFNet_def.h"
 
-Thing_implement (FFNet, Data, 0);
+Thing_implement (FFNet, Daata, 0);
 
 static void FFNet_checkLayerNumber (FFNet me, long layer) {
 	if (layer < 1 || layer > my nLayers) {
 		if (layer == 0) {
-			Melder_throw (L"A Layer number of 0 is not allowed.");
+			Melder_throw (U"A Layer number of 0 is not allowed.");
 		} else if (layer < 0) {
-			Melder_throw (L"A negative layer number is not allowed.");
+			Melder_throw (U"A negative layer number is not allowed.");
 		} else if (layer > my nLayers) {
-			Melder_throw (L"A layer number of ", layer, " is too big.");
+			Melder_throw (U"A layer number of ", layer, U" is too big.");
 		}
 
-		Melder_error_ ("This FFNet has ", layer, " layer", (my nLayers > 1 ? "s\n" : "\n"));
+		Melder_appendError (U"This FFNet has ", layer, U" layer", (my nLayers > 1 ? U"s\n" : U"\n"));
 		if (my nLayers == 1) {
-			Melder_throw (L"Layer number must be equal to 1.");
+			Melder_throw (U"Layer number must be equal to 1.");
 		} else if (my nLayers == 2) {
-			Melder_throw (L"Layer number must be equal to 1 or 2.");
+			Melder_throw (U"Layer number must be equal to 1 or 2.");
 		} else if (my nLayers == 3) {
-			Melder_throw (L"Layer number must be equal to 1, 2 or 3.");
+			Melder_throw (U"Layer number must be equal to 1, 2 or 3.");
 		} else {
-			Melder_throw (L"Layer number must be in the range 1 to ", my nLayers);
+			Melder_throw (U"Layer number must be in the range 1 to ", my nLayers);
 		}
 	}
 }
 
-wchar_t *FFNet_createNameFromTopology (FFNet me) {
-	MelderString name = { 0 };
-	MelderString_copy (&name, Melder_integer (my nUnitsInLayer[0]));
+autostring32 FFNet_createNameFromTopology (FFNet me) {
+	autoMelderString name;
+	MelderString_copy (&name, my nUnitsInLayer[0]);
 	for (long i = 1; i <= my nLayers; i++) {
-		MelderString_appendCharacter (&name, '-');
-		MelderString_append (&name, Melder_integer (my nUnitsInLayer[i]));
+		MelderString_appendCharacter (&name, U'-');
+		MelderString_append (&name, my nUnitsInLayer[i]);
 	}
-	return name.string;
+	autostring32 naam = Melder_dup (name.string);
+	return naam.transfer();
 }
 
 /****** non-linearities ****************************************************/
 
-static double sigmoid (I, double x, double *deriv) {
+static double sigmoid (FFNet /*me*/, double x, double *deriv) {
 	double act = NUMsigmoid (x);
-	(void) void_me;
 	*deriv = act * (1.0 - act);
 	return act;
 }
 
-
 /* ******************* cost functions ****************************************/
 
 /*
@@ -115,8 +114,7 @@ static double sigmoid (I, double x, double *deriv) {
 		if target < activity ==> error < 0
 */
 
-static double minimumSquaredError (I, const double target[]) {
-	iam (FFNet);
+static double minimumSquaredError (FFNet me, const double target[]) {
 	long k = my nNodes - my nOutputs + 1;
 	double cost = 0.0;
 	for (long i = 1; i <= my nOutputs; i++, k++) {
@@ -129,8 +127,7 @@ static double minimumSquaredError (I, const double target[]) {
 /* E = - sum (i=1; i=nPatterns; sum (k=1;k=nOutputs; t[k]*ln (o[k]) + (1-t[k])ln (1-o[k]))) */
 /* dE/do[k] = -(1-t[k])/ (1-o[k]) + t[k]/o[k] */
 /* werkt niet bij (grote?) netten */
-static double minimumCrossEntropy (I, const double target[]) {
-	iam (FFNet);
+static double minimumCrossEntropy (FFNet me, const double target[]) {
 	long k = my nNodes - my nOutputs + 1;
 	double cost = 0.0;
 
@@ -155,7 +152,7 @@ void bookkeeping (FFNet me) {
 		nWeights += my nUnitsInLayer[i] * (my nUnitsInLayer[i - 1] + 1);
 	}
 	if (my nWeights > 0 && my nWeights != nWeights) {
-		Melder_throw ("Number of weights is incorret.");
+		Melder_throw (U"Number of weights is incorret.");
 	}
 	my nWeights = nWeights;
 
@@ -176,7 +173,8 @@ void bookkeeping (FFNet me) {
 	my dw = NUMvector<double> (1, my nWeights);
 	my nInputs = my nUnitsInLayer[0];
 	my nOutputs = my nUnitsInLayer[my nLayers];
-	my isbias[my nInputs + 1] = my activity[my nInputs + 1] = 1;
+	my isbias[my nInputs + 1] = 1;
+	my activity[my nInputs + 1] = 1.0;
 
 	long n = my nUnitsInLayer[0] + 2;
 	long firstNodeInPrevious = 1, lastWeightInPrevious = 0;
@@ -189,7 +187,8 @@ void bookkeeping (FFNet me) {
 			my wLast[n] = my wFirst[n] + my nUnitsInLayer[j - 1];
 		}
 		if (j != my nLayers) {
-			my isbias[n] = my activity[n] = 1;
+			my isbias[n] = 1;
+			my activity[n] = 1.0;
 		}
 		lastWeightInPrevious = my wLast[n - 1];
 		firstNodeInPrevious += my nUnitsInLayer[j - 1] + 1;
@@ -198,31 +197,28 @@ void bookkeeping (FFNet me) {
 }
 
 void structFFNet :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of layers: ", Melder_integer (nLayers));
-	MelderInfo_writeLine (L"Total number of units: ", Melder_integer (FFNet_getNumberOfUnits (this)));
-	MelderInfo_writeLine (L"   Number of units in layer ", Melder_integer (nLayers), L" (output): ",
-	                       Melder_integer (nUnitsInLayer[nLayers]));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of layers: ", nLayers);
+	MelderInfo_writeLine (U"Total number of units: ", FFNet_getNumberOfUnits (this));
+	MelderInfo_writeLine (U"   Number of units in layer ", nLayers, U" (output): ", nUnitsInLayer[nLayers]);
 	for (long i = nLayers - 1; i >= 1; i--) {
-		MelderInfo_writeLine (L"   Number of units in layer ", Melder_integer (i), L" (hidden): ",
-		                       Melder_integer (nUnitsInLayer[i]));
+		MelderInfo_writeLine (U"   Number of units in layer ", i, U" (hidden): ", nUnitsInLayer[i]);
 	}
-	MelderInfo_writeLine (L"   Number of units in layer 0 (input): ", Melder_integer (nUnitsInLayer[0]));
-	MelderInfo_writeLine (L"Outputs are linear: ", Melder_boolean (outputsAreLinear));
-	MelderInfo_writeLine (L"Number of weights: ", Melder_integer (nWeights), L" (",
-	                       Melder_integer (FFNet_dimensionOfSearchSpace (this)), L" selected)");
-	MelderInfo_writeLine (L"Number of nodes: ", Melder_integer (nNodes));
+	MelderInfo_writeLine (U"   Number of units in layer 0 (input): ", nUnitsInLayer[0]);
+	MelderInfo_writeLine (U"Outputs are linear: ", Melder_boolean (outputsAreLinear));
+	MelderInfo_writeLine (U"Number of weights: ", nWeights, U" (",
+	                       FFNet_dimensionOfSearchSpace (this), U" selected)");
+	MelderInfo_writeLine (U"Number of nodes: ", nNodes);
 }
 
-void FFNet_init (FFNet me, long numberOfInputs, long nodesInLayer1, long nodesInLayer2,
-                 long numberOfOutputs, int outputsAreLinear) {
+void FFNet_init (FFNet me, long numberOfInputs, long nodesInLayer1, long nodesInLayer2, long numberOfOutputs, int outputsAreLinear) {
 	long numberOfLayers = 3;
 
 	if (numberOfInputs < 1) {
-		Melder_throw ("Number of inputs must be a natrural number.");
+		Melder_throw (U"Number of inputs must be a natural number.");
 	}
 	if (numberOfOutputs < 1) {
-		Melder_throw ("Number of outputs must be a natrural number.");
+		Melder_throw (U"Number of outputs must be a natural number.");
 	}
 	if (nodesInLayer1 < 1) {
 		numberOfLayers--;
@@ -254,26 +250,24 @@ void FFNet_init (FFNet me, long numberOfInputs, long nodesInLayer1, long nodesIn
 void FFNet_setOutputCategories (FFNet me, Categories thee) {
 	autoCategories uniq = Categories_selectUniqueItems (thee, 1);
 	if (uniq -> size == thy size) {
-		forget (my outputCategories);
 		my outputCategories = uniq.transfer();
 	}
 }
 
-FFNet FFNet_create (long numberOfInputs, long numberInLayer1, long numberInLayer2,
-                    long numberOfOutputs, int outputsAreLinear) {
+autoFFNet FFNet_create (long numberOfInputs, long numberInLayer1, long numberInLayer2, long numberOfOutputs, int outputsAreLinear) {
 	try {
 		autoFFNet me = Thing_new (FFNet);
 		FFNet_init (me.peek(), numberOfInputs, numberInLayer1, numberInLayer2, numberOfOutputs, outputsAreLinear);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("FFNet not created.");
+		Melder_throw (U"FFNet not created.");
 	}
 }
 
 void FFNet_setNonLinearity (FFNet me, int nonLinearityType) {
 	my nonLinearityType = nonLinearityType;
 	my nonLinearity = sigmoid;
-	my nlClosure = NULL;
+	my nlClosure = nullptr;
 }
 
 void FFNet_setCostFunction (FFNet me, int costType) {
@@ -283,14 +277,14 @@ void FFNet_setCostFunction (FFNet me, int costType) {
 	} else {
 		my costFunction = minimumSquaredError;
 	}
-	my cfClosure = NULL;
+	my cfClosure = nullptr;
 }
 
 double FFNet_getBias (FFNet me, long layer, long unit) {
 	try {
 		long node = FFNet_getNodeNumberFromUnitNumber (me, unit, layer);
 		if (node < 1) {
-			Melder_throw ("Not a valid unit / layer combination.");
+			Melder_throw (U"Not a valid unit / layer combination.");
 		}
 		long bias_unit = my wLast[node];
 		return my w[bias_unit];
@@ -302,7 +296,7 @@ double FFNet_getBias (FFNet me, long layer, long unit) {
 void FFNet_setBias (FFNet me, long layer, long unit, double value) {
 	long node = FFNet_getNodeNumberFromUnitNumber (me, unit, layer);
 	if (node < 1) {
-		Melder_throw ("Not a valid unit / layer combination.");
+		Melder_throw (U"Not a valid unit / layer combination.");
 	}
 	long bias_unit = my wLast[node]; // ??? +1
 	my w[bias_unit] = value;
@@ -311,11 +305,11 @@ void FFNet_setBias (FFNet me, long layer, long unit, double value) {
 void FFNet_setWeight (FFNet me, long layer, long unit, long unit_from, double value) {
 	long node = FFNet_getNodeNumberFromUnitNumber (me, unit, layer);
 	if (node < 1) {
-		Melder_throw ("Not a valid unit / layer combination.");
+		Melder_throw (U"Not a valid unit / layer combination.");
 	}
 	long nodef = FFNet_getNodeNumberFromUnitNumber (me, unit_from, layer - 1);
 	if (nodef < 1) {
-		Melder_throw ("Not a valid unit / layer combination.");
+		Melder_throw (U"Not a valid unit / layer combination.");
 	}
 	long w_unit = my wFirst[node] + unit_from - 1;
 	my w[w_unit] = value;
@@ -324,21 +318,22 @@ void FFNet_setWeight (FFNet me, long layer, long unit, long unit_from, double va
 double FFNet_getWeight (FFNet me, long layer, long unit, long unit_from) {
 	long node = FFNet_getNodeNumberFromUnitNumber (me, unit, layer);
 	if (node < 1) {
-		Melder_throw ("Not a valid unit / layer combination.");
+		Melder_throw (U"Not a valid unit / layer combination.");
 	}
 	long nodef = FFNet_getNodeNumberFromUnitNumber (me, unit_from, layer - 1);
 	if (nodef < 1) {
-		Melder_throw ("Not a valid unit / layer combination.");
+		Melder_throw (U"Not a valid unit / layer combination.");
 	}
 	long w_unit = my wFirst[node] + unit_from - 1;
 	return my w[w_unit];
 }
 
 void FFNet_reset (FFNet me, double wrange) {
-	for (long i = 1; i <= my nWeights; i++)
+	for (long i = 1; i <= my nWeights; i++) {
 		if (my wSelected[i]) {
 			my w[i] = NUMrandomUniform (-wrange, wrange);
 		}
+	}
 	for (long i = 1; i <= my nNodes; i++) {
 		my activity[i] = (my isbias[i] ? 1.0 : 0.0);
 	}
@@ -382,9 +377,11 @@ void FFNet_propagate (FFNet me, const double input[], double output[]) {
 		}
 	}
 	k = my nNodes - my nOutputs + 1;
-	if (output) for (long i = 1; i <= my nOutputs; i++, k++) {
+	if (output) {
+		for (long i = 1; i <= my nOutputs; i++, k++) {
 			output[i] = my activity[k];
 		}
+	}
 }
 
 
@@ -426,14 +423,16 @@ void FFNet_computeDerivative (FFNet me) {
 long FFNet_getWinningUnit (FFNet me, int labeling) {
 	long pos = 1, k = my nNodes - my nOutputs;
 	if (labeling == 2) { /* stochastic */
-		double sum = 0;
+		double sum = 0.0;
 		for (long i = 1; i <= my nOutputs; i++) {
 			sum += my activity[k + i];
 		}
-		double random = NUMrandomUniform (0, sum);
-		for (pos = my nOutputs; pos >= 2; pos--) if (random > (sum -= my activity[k + pos])) {
+		double random = NUMrandomUniform (0.0, sum);
+		for (pos = my nOutputs; pos >= 2; pos--) {
+			if (random > (sum -= my activity[k + pos])) {
 				break;
 			}
+		}
 	} else { /* winner-takes-all */
 		double max = my activity[k + 1];
 		for (long i = 2; i <= my nOutputs; i++) if (my activity[k + i] > max) {
@@ -447,7 +446,7 @@ long FFNet_getWinningUnit (FFNet me, int labeling) {
 void FFNet_propagateToLayer (FFNet me, const double input[], double activity[], long layer) {
 	Melder_assert (activity);
 	long k = 0;
-	FFNet_propagate (me, input, 0);
+	FFNet_propagate (me, input, nullptr);
 	for (long i = 0; i < layer; i++) {
 		k += my nUnitsInLayer[i] + 1;
 	}
@@ -479,7 +478,7 @@ void FFNet_selectBiasesInLayer (FFNet me, long layer) {
 		return;
 	}
 	for (long i = 1; i <= my nWeights; i++) {
-		my wSelected[i] = 0;
+		my wSelected[i] = 0.0;
 	}
 	for (long i = 1; i < layer; i++) {
 		node += my nUnitsInLayer[i] + 1;
@@ -570,7 +569,7 @@ void FFNet_drawTopology (FFNet me, Graphics g) {
 		}
 	}
 	double dx = 1.0 / maxNumOfUnits;
-	double radius = dx / 10;
+	double radius = dx / 10.0;
 	Graphics_setInner (g);
 	Graphics_setWindow (g, 0.0, 1.0, 0.0, 1.0);
 	for (long i = 0; i <= my nLayers; i++) {
@@ -579,13 +578,13 @@ void FFNet_drawTopology (FFNet me, Graphics g) {
 		/* draw the units */
 		if (! dxIsFixed) {
 			dx2 = 1.0 / my nUnitsInLayer[i];
-			x2 = dx2 / 2;
+			x2 = dx2 / 2.0;
 		}
 		if (i == 0) {
 			Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_TOP);
 			x2WC = x2;
 			for (long j = 1; j <= my nInputs; j++) {
-				Graphics_arrow (g, x2WC, y2WC - radius - dy / 4, x2WC, y2WC - radius);
+				Graphics_arrow (g, x2WC, y2WC - radius - dy / 4.0, x2WC, y2WC - radius);
 				x2WC += dx2;
 			}
 		}
@@ -601,11 +600,11 @@ void FFNet_drawTopology (FFNet me, Graphics g) {
 		Graphics_setColour (g, Graphics_BLACK);
 		if (i > 0) {
 			double dx1 = dx;
-			double x1 = (maxNumOfUnits - my nUnitsInLayer[i - 1] + 1) * dx1 / 2;
+			double x1 = (maxNumOfUnits - my nUnitsInLayer[i - 1] + 1) * dx1 / 2.0;
 			double y1WC = y2WC - dy;
 			if (! dxIsFixed) {
 				dx1 = 1.0 / my nUnitsInLayer[i - 1];
-				x1 = dx1 / 2;
+				x1 = dx1 / 2.0;
 			}
 			x2WC = x2;
 			for (long j = 1; j <= my nUnitsInLayer[i]; j++) {
@@ -624,9 +623,9 @@ void FFNet_drawTopology (FFNet me, Graphics g) {
 			x2WC = x2;
 			Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_BOTTOM);
 			for (long j = 1; j <= my nOutputs; j++) {
-				Graphics_arrow (g, x2WC, y2WC + radius, x2WC, y2WC + radius + dy / 4);
+				Graphics_arrow (g, x2WC, y2WC + radius, x2WC, y2WC + radius + dy / 4.0);
 				if (my outputCategories) {
-					Categories_drawItem (my outputCategories, g, j, x2WC, y2WC + radius + dy / 4);
+					Categories_drawItem (my outputCategories.peek(), g, j, x2WC, y2WC + radius + dy / 4.0);
 				}
 				x2WC += dx2;
 			}
@@ -649,13 +648,13 @@ void FFNet_drawActivation (FFNet me, Graphics g) {
 		}
 	}
 	double dx = 1.0 / maxNumOfUnits;
-	double r1 = dx / 2; /* May touch when neighbouring activities are both 1 (very rare). */
+	double r1 = dx / 2.0; /* May touch when neighbouring activities are both 1 (very rare). */
 	for (long i = 0; i <= my nLayers; i++, node++) {
-		double dx2 = dx, x2WC, y2WC = dy / 2 + i * dy;
-		double x2 = (maxNumOfUnits - my nUnitsInLayer[i] + 1) * dx2 / 2;
+		double dx2 = dx, x2WC, y2WC = dy / 2.0 + i * dy;
+		double x2 = (maxNumOfUnits - my nUnitsInLayer[i] + 1) * dx2 / 2.0;
 		if (! dxIsFixed) {
 			dx2 = 1.0 / my nUnitsInLayer[i];
-			x2 = dx2 / 2;
+			x2 = dx2 / 2.0;
 		}
 		x2WC = x2;
 		for (long j = 1; j <= my nUnitsInLayer[i]; j++, node++) {
@@ -676,26 +675,24 @@ void FFNet_drawActivation (FFNet me, Graphics g) {
 /* This routine is deprecated since praat-4.2.4 20040422 and will be removed in the future. */
 void FFNet_drawWeightsToLayer (FFNet me, Graphics g, int layer, int scaling, int garnish) {
 	if (layer < 1 || layer > my nLayers) {
-		Melder_throw ("Layer must be in [1,", my nLayers, "].");
+		Melder_throw (U"Layer must be in [1,", my nLayers, U"].");
 	}
 	autoMatrix weights = FFNet_weightsToMatrix (me, layer, 0);
 	Matrix_scale (weights.peek(), scaling);
-	Matrix_drawAsSquares (weights.peek(), g, 0, 0, 0, 0, 0);
+	Matrix_drawAsSquares (weights.peek(), g, 0.0, 0.0, 0.0, 0.0, 0);
 	if (garnish) {
-		double x1WC, x2WC, y1WC, y2WC; wchar_t text[30];
+		double x1WC, x2WC, y1WC, y2WC;
 		Graphics_inqWindow (g, & x1WC, & x2WC, & y1WC, & y2WC);
-		swprintf (text, 30, L"Units in layer %ld ->", layer);
-		Graphics_textBottom (g, 0, text);
+		Graphics_textBottom (g, false, Melder_cat (U"Units in layer ", layer, U" ->"));
 		if (layer == 1) {
-			wcscpy (text, L"Input units ->");
+			Graphics_textLeft (g, false, U"Input units ->");
 		} else {
-			swprintf (text, 30, L"Units in layer %ld ->", layer - 1);
+			Graphics_textLeft (g, false, Melder_cat (U"Units in layer ", layer - 1, U" ->"));
 		}
-		Graphics_textLeft (g, 0, text);
 		/* how do I find out the current settings ??? */
 		Graphics_setTextAlignment (g, Graphics_RIGHT, Graphics_HALF);
 		Graphics_setInner (g);
-		Graphics_text (g, 0.5, weights->ny, L"bias");
+		Graphics_text (g, 0.5, weights->ny, U"bias");
 		Graphics_unsetInner (g);
 	}
 }
@@ -706,25 +703,26 @@ void FFNet_drawWeights (FFNet me, Graphics g, long layer, int garnish) {
 }
 
 void FFNet_drawCostHistory (FFNet me, Graphics g, long iFrom, long iTo, double costMin, double costMax, int garnish) {
-	if (my minimizer) Minimizer_drawHistory (my minimizer, g, iFrom, iTo,
-		        costMin, costMax, 0);
+	if (my minimizer) {
+		Minimizer_drawHistory (my minimizer, g, iFrom, iTo, costMin, costMax, 0);
+	}
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textLeft (g, 1, my costFunctionType == FFNet_COST_MSE ?
-		                   L"Minimum squared error" : L"Minimum cross entropy");
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textBottom (g, 1, L"Number of epochs");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
+		Graphics_textLeft (g, true, my costFunctionType == FFNet_COST_MSE ?
+		                   U"Minimum squared error" : U"Minimum cross entropy");
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textBottom (g, true, U"Number of epochs");
+		Graphics_marksBottom (g, 2, true, true, false);
 	}
 }
 
-Collection FFNet_createIrisExample (long numberOfHidden1, long numberOfHidden2) {
+autoCollection FFNet_createIrisExample (long numberOfHidden1, long numberOfHidden2) {
 	try {
-		autoCollection c = Collection_create (classData, 3);
+		autoCollection c = Collection_create (classDaata, 3);
 		autoCategories uniq = Categories_sequentialNumbers (3);
 		autoFFNet me = FFNet_create (4, numberOfHidden1, numberOfHidden2, 3, 0);
 		FFNet_setOutputCategories (me.peek(), uniq.peek());
-		autostring name = FFNet_createNameFromTopology (me.peek());
+		autostring32 name = FFNet_createNameFromTopology (me.peek());
 		Thing_setName (me.peek(), name.peek());
 		Collection_addItem (c.peek(), me.transfer());
 		autoTableOfReal iris = TableOfReal_createIrisDataset ();
@@ -737,20 +735,21 @@ Collection FFNet_createIrisExample (long numberOfHidden1, long numberOfHidden2)
 			}
 		}
 
-		Pattern thee = 0; Categories him = 0;
+		Pattern thee = nullptr;
+		Categories him = nullptr;
 		TableOfReal_to_Pattern_and_Categories (iris.peek(), 0, 0, 0, 0, &thee, &him);
 		autoPattern ap = thee; autoCategories ac = him;
-		Thing_setName (ap.peek(), L"iris");
-		Thing_setName (ac.peek(), L"iris");
+		Thing_setName (ap.peek(), U"iris");
+		Thing_setName (ac.peek(), U"iris");
 		Collection_addItem (c.peek(), ap.transfer());
 		Collection_addItem (c.peek(), ac.transfer());
-		return c.transfer();
+		return c;
 	} catch (MelderError) {
-		Melder_throw ("Iris example not created.");
+		Melder_throw (U"Iris example not created.");
 	}
 }
 
-TableOfReal FFNet_extractWeights (FFNet me, long layer) {
+autoTableOfReal FFNet_extractWeights (FFNet me, long layer) {
 	try {
 		FFNet_checkLayerNumber (me, layer);
 
@@ -758,14 +757,14 @@ TableOfReal FFNet_extractWeights (FFNet me, long layer) {
 		long numberOfUnitsTo = my nUnitsInLayer[layer];
 		autoTableOfReal thee = TableOfReal_create (numberOfUnitsFrom, numberOfUnitsTo);
 
-		wchar_t label[20];
+		char32 label[40];
 		for (long i = 1; i <= numberOfUnitsFrom - 1; i++) {
-			swprintf (label, 20, L"L%ld-%ld", layer - 1, i);
+			Melder_sprint (label,40, U"L", layer - 1, U"-", i);
 			TableOfReal_setRowLabel (thee.peek(), i, label);
 		}
-		TableOfReal_setRowLabel (thee.peek(), numberOfUnitsFrom, L"Bias");
+		TableOfReal_setRowLabel (thee.peek(), numberOfUnitsFrom, U"Bias");
 		for (long i = 1; i <= numberOfUnitsTo; i++) {
-			swprintf (label, 20, L"L%ld-%ld", layer, i);
+			Melder_sprint (label,40, U"L", layer, U"-", i);
 			TableOfReal_setColumnLabel (thee.peek(), i, label);
 		}
 
@@ -779,20 +778,20 @@ TableOfReal FFNet_extractWeights (FFNet me, long layer) {
 				thy data[k++][i] = my w[j];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no TableOfReal created.");
+		Melder_throw (me, U": no TableOfReal created.");
 	}
 }
 
-FFNet FFNet_and_TabelOfReal_to_FFNet (FFNet me, TableOfReal him, long layer) {
+autoFFNet FFNet_and_TabelOfReal_to_FFNet (FFNet me, TableOfReal him, long layer) {
 	try {
 		FFNet_checkLayerNumber (me, layer);
-		if ( (my nUnitsInLayer[layer] != his numberOfColumns) ||
+		if ((my nUnitsInLayer[layer] != his numberOfColumns) ||
 		        (my nUnitsInLayer[layer] == his numberOfColumns && my nUnitsInLayer[layer - 1] + 1 == his numberOfRows)) {
-			long trys[3], rows[3], cols[3], ntry = my nLayers > 3 ? 3 : my nLayers, ok = 0;
+			long trys[1+3], rows[1+3], cols[1+3], ntry = my nLayers > 3 ? 3 : my nLayers, ok = 0;
 			if (my nLayers > 3) {
-				Melder_throw ("Dimensions don't fit.");
+				Melder_throw (U"Dimensions don't fit.");
 			}
 			for (long i = 1; i <= ntry; i++) {
 				cols[i] = my nUnitsInLayer[i] == his numberOfColumns;
@@ -802,19 +801,20 @@ FFNet FFNet_and_TabelOfReal_to_FFNet (FFNet me, TableOfReal him, long layer) {
 					ok ++;
 				}
 			}
-			if (! rows[layer]) Melder_throw ("The number of rows in the TableOfReal does not equal \n"
-				                                 "the number of units in the layer that connect to layer ", layer, L".");
-			else
-				Melder_throw ("The number of columns in the TableOfReal does not equal \n"
-				              "the number of units in layer ", layer, L".");
+			if (! rows[layer]){
+				Melder_throw (U"The number of rows in the TableOfReal does not equal \n"
+				U"the number of units in the layer that connect to layer ", layer, U".");
+			} else {
+				Melder_throw (U"The number of columns in the TableOfReal does not equal \n"
+				    U"the number of units in layer ", layer, U".");
+			}
 			if (ok == 0) {
-				Melder_throw ("Please quit, there is no appropriate layer in the FFNet for this TableOfReal.");
+				Melder_throw (U"Please quit, there is no appropriate layer in the FFNet for this TableOfReal.");
 			} else {
-				if (ok == 1)
-					Melder_throw ("Please try again with layer number ",
-					              trys[1] ? trys[1] : (trys[2] ? trys[2] : trys[3]), L".");
-				else {
-					Melder_throw ("Please try again with one of the other two layer numbers.");
+				if (ok == 1) {
+					Melder_throw (U"Please try again with layer number ", trys[1] ? trys[1] : (trys[2] ? trys[2] : trys[3]), U".");
+				} else {
+					Melder_throw (U"Please try again with one of the other two layer numbers.");
 				}
 			}
 		}
@@ -829,9 +829,9 @@ FFNet FFNet_and_TabelOfReal_to_FFNet (FFNet me, TableOfReal him, long layer) {
 				thy w[j] = his data[k][i];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no FFNet created.");
+		Melder_throw (me, U": no FFNet created.");
 	}
 }
 
diff --git a/FFNet/FFNet.h b/FFNet/FFNet.h
index 608aeff..752b527 100644
--- a/FFNet/FFNet.h
+++ b/FFNet/FFNet.h
@@ -2,7 +2,7 @@
 #define _FFNet_h_
 /* FFNet.h
  *
- * Copyright (C) 1997-2011 David Weenink
+ * Copyright (C) 1997-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,7 +36,7 @@
 #include "TableOfReal.h"
 
 #include "FFNet_def.h"
-oo_CLASS_CREATE (FFNet, Data);
+oo_CLASS_CREATE (FFNet, Daata);
 
 /* Parameters:
  *  long nLayers	    : the #layers in the net (exclusive the inputs)
@@ -120,10 +120,10 @@ oo_CLASS_CREATE (FFNet, Data);
 void FFNet_init (FFNet me, long numberOfInputs, long nodesInLayer1, long nodesInLayer2,
 	long numberOfOutputs, int outputsAreLinear);
 
-FFNet FFNet_create (long numberOfInputs, long numberInLayer1, long numberInLayer2,
+autoFFNet FFNet_create (long numberOfInputs, long numberInLayer1, long numberInLayer2,
 	long numberOfOutputs, int outputsAreLinear	);
 
-wchar_t * FFNet_createNameFromTopology (FFNet me);
+autostring32 FFNet_createNameFromTopology (FFNet me);
 /* Create names as <inputs>-<outputs>, <inputs>-<hidden>-<outputs>,
 	<inputs>-<hidden1>-<hidden2>-<outputs> for 1, 2 or 3 layer networks.
 */
@@ -139,8 +139,11 @@ void FFNet_setNonLinearity (FFNet me, int type);
 void FFNet_setOutputCategories (FFNet me, Categories thee);
 
 double FFNet_getBias (FFNet me, long layer, long unit);
+
 void FFNet_setBias (FFNet me, long layer, long node, double value);
+
 void FFNet_setWeight (FFNet me, long later, long node, long node_from, double value);
+
 double FFNet_getWeight (FFNet me, long later, long node, long node_from);
 
 void FFNet_reset (FFNet me, double wrange);
@@ -155,7 +158,7 @@ void FFNet_propagateToLayer (FFNet me, const double input[], double activity[],
 
 void FFNet_propagate (FFNet me, const double input[], double output[]);
 /* step (1) feed forward input from "input layer" to "output layer"
- * if output != NULL the output activity is copied into output.
+ * if output != nullptr the output activity is copied into output.
  * postcondition: my activities defined
  */
 
@@ -173,6 +176,7 @@ long FFNet_getWinningUnit (FFNet me, int labeling);
 /* labeling = 2 : stochastic */
 
 void FFNet_selectAllWeights (FFNet me);
+
 void FFNet_selectBiasesInLayer (FFNet me, long layer);
 
 long FFNet_dimensionOfSearchSpace (FFNet me);
@@ -203,7 +207,9 @@ long FFNet_getNumberOfUnitsInLayer (FFNet me, int layer);
 double FFNet_getMinimum (FFNet me);
 
 void FFNet_drawTopology (FFNet me, Graphics g);
+
 void FFNet_drawActivation (FFNet me, Graphics g);
+
 void FFNet_drawWeightsToLayer (FFNet me, Graphics g, int toLayer, int scaling, int garnish);
 /* Deprecated: the strengths of the weights that connect to the nodes in later 'layer' */
 /* are drawn with boxes. The area of each box corresponds to the strength. */
@@ -213,10 +219,12 @@ void FFNet_drawCostHistory (FFNet me, Graphics g, long from_iteration, long to_i
 	double from_cost, double to_cost, int garnish);
 /* draw cost vs epochs */
 
-Collection FFNet_createIrisExample (long numberOfHidden1, long numberOfHidden2);
+autoCollection FFNet_createIrisExample (long numberOfHidden1, long numberOfHidden2);
+
+autoTableOfReal FFNet_extractWeights (FFNet me, long layer);
 
-TableOfReal FFNet_extractWeights (FFNet me, long layer);
 void FFNet_drawWeights (FFNet me, Graphics g, long layer, int garnish);
-FFNet FFNet_and_TabelOfReal_to_FFNet (FFNet me, TableOfReal him, long layer);
+
+autoFFNet FFNet_and_TabelOfReal_to_FFNet (FFNet me, TableOfReal him, long layer);
 
 #endif /* _FFNet_h_ */
diff --git a/FFNet/FFNet_Activation_Categories.cpp b/FFNet/FFNet_Activation_Categories.cpp
index c9ba59f..ad45b8e 100644
--- a/FFNet/FFNet_Activation_Categories.cpp
+++ b/FFNet/FFNet_Activation_Categories.cpp
@@ -1,6 +1,6 @@
 /* FFNet_Activation_Categories.cpp
  *
- * Copyright (C) 1997-2011 David Weenink
+ * Copyright (C) 1997-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,8 +26,7 @@
 
 #include "FFNet_Activation_Categories.h"
 
-static long winnerTakesAll (I, const double activation[]) {
-	iam (FFNet);
+static long winnerTakesAll (FFNet me, const double activation[]) {
 	long pos = 1;
 	double max = activation[1];
 	for (long i = 2; i <= my nOutputs; i++) {
@@ -38,15 +37,13 @@ static long winnerTakesAll (I, const double activation[]) {
 	return pos;
 }
 
-static long stochastic (I, const double activation[]) {
-	iam (FFNet);
+static long stochastic (FFNet me, const double activation[]) {
 	long i;
-	double range = 0;
+	double range = 0.0, lower = 0.0;
 	for (i = 1; i <= my nOutputs; i++) {
 		range += activation[i];
 	}
-	double number = NUMrandomUniform (0, range);
-	double lower = 0;
+	double number = NUMrandomUniform (0.0, range);
 	for (i = 1; i <= my nOutputs; i++) {
 		lower += activation[i];
 		if (number < lower) {
@@ -56,55 +53,54 @@ static long stochastic (I, const double activation[]) {
 	return i;
 }
 
-Categories FFNet_Activation_to_Categories (FFNet me, Activation activation, int labeling) {
+autoCategories FFNet_Activation_to_Categories (FFNet me, Activation activation, int labeling) {
 	try {
-		Categories categories = (Categories) my outputCategories;
-		long (*labelingFunction) (I, const double act[]);
+		long (*labelingFunction) (FFNet me, const double act[]);
 
-		if (my outputCategories == 0) {
-			Melder_throw ("No Categories (has the FFNet been trained yet?).");
+		if (! my outputCategories) {
+			Melder_throw (U"No Categories (has the FFNet been trained yet?).");
 		}
-		if (my nOutputs != activation->nx) {
-			Melder_throw ("Number of columns and number of outputs must be equal.");
+		if (my nOutputs != activation -> nx) {
+			Melder_throw (U"Number of columns and number of outputs must be equal.");
 		}
 		autoCategories thee = Categories_create ();
 		labelingFunction = labeling == 2 ? stochastic : winnerTakesAll;
 		for (long i = 1; i <= activation->ny; i++) {
 			long index = labelingFunction (me, activation -> z[i]);
-			autoSimpleString item = Data_copy ( (SimpleString) categories -> item[index]);
+			autoSimpleString item = Data_copy ((SimpleString) my outputCategories -> item[index]);
 			Collection_addItem (thee.peek(), item.transfer());
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Categories created.");
+		Melder_throw (me, U": no Categories created.");
 	}
 }
 
-Activation FFNet_Categories_to_Activation (FFNet me, Categories thee) {
+autoActivation FFNet_Categories_to_Activation (FFNet me, Categories thee) {
 	try {
 		autoCategories uniq = Categories_selectUniqueItems (thee, 1);
 
-		if (my outputCategories == 0) {
-			Melder_throw ("The FFNet does not have categories.");
+		if (! my outputCategories) {
+			Melder_throw (U"The FFNet does not have categories.");
 		}
-		long nl =  OrderedOfString_isSubsetOf (uniq.peek(), my outputCategories, 0);
+		long nl =  OrderedOfString_isSubsetOf (uniq.peek(), my outputCategories.peek(), 0);
 		if (nl == 0) {
-			Melder_throw ("The Categories do not match the categories of the FFNet.");
+			Melder_throw (U"The Categories do not match the categories of the FFNet.");
 		}
 
 		autoActivation him = Activation_create (thy size, my nOutputs);
 		for (long i = 1; i <= thy size; i++) {
-			const wchar *citem = OrderedOfString_itemAtIndex_c (thee, i);
-			long pos =  OrderedOfString_indexOfItem_c (my outputCategories, citem);
+			const char32 *citem = OrderedOfString_itemAtIndex_c (thee, i);
+			long pos =  OrderedOfString_indexOfItem_c (my outputCategories.peek(), citem);
 			if (pos < 1) {
-				Melder_throw ("The FFNet doesn't know the category ", citem, ".");
+				Melder_throw (U"The FFNet doesn't know the category ", citem, U".");
 			}
 			his z[i][pos] = 1.0;
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Activation created.");
+		Melder_throw (me, U": no Activation created.");
 	}
 }
 
-/* End of file FFNet_Activation_Categories.c */
+/* End of file FFNet_Activation_Categories.cpp */
diff --git a/FFNet/FFNet_Activation_Categories.h b/FFNet/FFNet_Activation_Categories.h
index 374c9c4..634c055 100644
--- a/FFNet/FFNet_Activation_Categories.h
+++ b/FFNet/FFNet_Activation_Categories.h
@@ -2,7 +2,7 @@
 #define _FFNet_Activation_Categories_h_
 /* FFNet_Activation_Categories.h
  *
- * Copyright (C) 1997-2011 David Weenink
+ * Copyright (C) 1997-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,19 +29,11 @@
 #include "Activation.h"
 #include "Categories.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-Categories FFNet_Activation_to_Categories (FFNet me, Activation activation, int labeling);
+autoCategories FFNet_Activation_to_Categories (FFNet me, Activation activation, int labeling);
 /* labeling = 1 : winner-takes-all */
 /* labeling = 2 : stochastic */
 
-Activation FFNet_Categories_to_Activation (FFNet me, Categories labels);
-/* Postcondition: my outputCategories != NULL; */
-
-#ifdef __cplusplus
-	}
-#endif
+autoActivation FFNet_Categories_to_Activation (FFNet me, Categories labels);
+/* Postcondition: my outputCategories != nullptr; */
 
 #endif /* _FFNet_Activation_Categories_h_ */
diff --git a/FFNet/FFNet_Eigen.cpp b/FFNet/FFNet_Eigen.cpp
index 64c9900..9832c6b 100644
--- a/FFNet/FFNet_Eigen.cpp
+++ b/FFNet/FFNet_Eigen.cpp
@@ -1,6 +1,6 @@
 /* FFNet_Eigen.cpp
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,8 +26,7 @@
 #include "Graphics.h"
 #include "NUM2.h"
 
-void FFNet_Eigen_drawIntersection (FFNet me, Eigen eigen, Graphics g, long pcx, long pcy,
-                                   double xmin, double xmax, double ymin, double ymax) {
+void FFNet_Eigen_drawIntersection (FFNet me, Eigen eigen, Graphics g, long pcx, long pcy, double xmin, double xmax, double ymin, double ymax) {
 	long ix = labs (pcx), iy = labs (pcy);
 	long numberOfEigenvalues = eigen -> numberOfEigenvalues;
 	long dimension = eigen -> dimension;
@@ -74,7 +73,7 @@ void FFNet_Eigen_drawIntersection (FFNet me, Eigen eigen, Graphics g, long pcx,
 			ys[ns] = y[j] + (y[j + 1] - y[j]) * r;
 		}
 		if (ns < 2) {
-			Melder_casual ("Intersection for unit %ld outside range", i);
+			Melder_casual (U"Intersection for unit ", i, U" outside range");
 		} else {
 			Graphics_line (g, xs[1], ys[1], xs[2], ys[2]);
 		}
@@ -86,8 +85,7 @@ void FFNet_Eigen_drawIntersection (FFNet me, Eigen eigen, Graphics g, long pcx,
 	Draw the intersection line of the decision hyperplane 'w.e-b' of the weights of unit i
 	from layer j with the plane spanned by eigenvectors pcx and pcy.
 */
-void FFNet_Eigen_drawDecisionPlaneInEigenspace (FFNet me, thou, Graphics g, long unit,
-        long layer, long pcx, long pcy, double xmin, double xmax, double ymin, double ymax) {
+void FFNet_Eigen_drawDecisionPlaneInEigenspace (FFNet me, thou, Graphics g, long unit, long layer, long pcx, long pcy, double xmin, double xmax, double ymin, double ymax) {
 	thouart (Eigen);
 
 	if (layer < 1 || layer > my nLayers) {
@@ -146,7 +144,7 @@ void FFNet_Eigen_drawDecisionPlaneInEigenspace (FFNet me, thou, Graphics g, long
 	*/
 
 	long iw = my wFirst[node] - 1;
-	double we1 = 0, we2 = 0;
+	double we1 = 0.0, we2 = 0.0;
 	for (long i = 1; i <= my nUnitsInLayer[layer - 1]; i++) {
 		we1 += my w[iw + i] * thy eigenvectors[pcx][i];
 		we2 += my w[iw + i] * thy eigenvectors[pcy][i];
@@ -155,24 +153,24 @@ void FFNet_Eigen_drawDecisionPlaneInEigenspace (FFNet me, thou, Graphics g, long
 	double bias = my w[my wLast[node]];
 	x1 = xmin; x2 = xmax;
 	y1 = ymin; y2 = ymax;
-	if (we1 != 0) {
-		x1 = -bias / we1; y1 = 0;
+	if (we1 != 0.0) {
+		x1 = -bias / we1; y1 = 0.0;
 	}
-	if (we2 != 0) {
-		x2 = 0; y2 = -bias / we2;
+	if (we2 != 0.0) {
+		x2 = 0.0; y2 = -bias / we2;
 	}
-	if (we1 == 0 && we2 == 0) {
-		Melder_warning (L"We cannot draw the intersection of the neural net decision plane\n"
-		                 "for unit ", Melder_integer (unit), L" in layer ", Melder_integer (layer),
-		                 L" with the plane spanned by the eigenvectors because \nboth planes are parallel.");
+	if (we1 == 0.0 && we2 == 0.0) {
+		Melder_warning (U"We cannot draw the intersection of the neural net decision plane\n"
+		    "for unit ", unit, U" in layer ", layer, U" with the plane spanned by the eigenvectors because \nboth planes are parallel.");
 		return;
 	}
 	double xi[3], yi[3]; /* Intersections */
 	double ni = NUMgetIntersectionsWithRectangle (x1, y1, x2, y2, xmin, ymin, xmax, ymax, xi, yi);
 	if (ni == 2) {
 		Graphics_line (g, xi[1], yi[1], xi[2], yi[2]);
-	} else Melder_warning (L"There were no intersections in the drawing area.\n"
-		                        "Please enlarge the drawing area.");
+	} else {
+		Melder_warning (U"There were no intersections in the drawing area.\nPlease enlarge the drawing area.");
+	}
 	Graphics_unsetInner (g);
 }
 
diff --git a/FFNet/FFNet_Eigen.h b/FFNet/FFNet_Eigen.h
index 4a553a3..f930ad9 100644
--- a/FFNet/FFNet_Eigen.h
+++ b/FFNet/FFNet_Eigen.h
@@ -2,7 +2,7 @@
 #define _FFNet_Eigen_h_
 /* FFNet_Eigen.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,10 +27,6 @@
 #include "FFNet.h"
 #include "Eigen.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 void FFNet_Eigen_drawIntersection (FFNet me, Eigen eigen, Graphics g, long pcx, long pcy,
     double xmin, double xmax, double ymin, double ymax);
 /* Draw intersections of hyperplanes of units in layer 1 with eigenplane */
@@ -41,8 +37,4 @@ void FFNet_Eigen_drawIntersection (FFNet me, Eigen eigen, Graphics g, long pcx,
 void FFNet_Eigen_drawDecisionPlaneInEigenspace (FFNet me, thou, Graphics g, long unit, 
 	long layer,	long pcx, long pcy, double xmin, double xmax, double ymin, double ymax);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _FFNet_Eigen_h_ */
diff --git a/FFNet/FFNet_Matrix.cpp b/FFNet/FFNet_Matrix.cpp
index 2d5bc15..c7bdb7c 100644
--- a/FFNet/FFNet_Matrix.cpp
+++ b/FFNet/FFNet_Matrix.cpp
@@ -1,6 +1,6 @@
 /* FFNet_Matrix.cpp
  *
- * Copyright (C) 1997-2011 David Weenink
+ * Copyright (C) 1997-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,14 +24,13 @@
 
 #include "FFNet_Matrix.h"
 
-Matrix FFNet_weightsToMatrix (FFNet me, long layer, int deltaWeights) {
+autoMatrix FFNet_weightsToMatrix (FFNet me, long layer, int deltaWeights) {
 	try {
 		if (layer < 1 || layer > my nLayers) {
-			Melder_throw ("Layer must be > 0 and < ", my nLayers, ".");
+			Melder_throw (U"Layer must be > 0 and < ", my nLayers, U".");
 		}
-		autoMatrix thee = Matrix_create (
-		                      0.5, my nUnitsInLayer[layer] + 0.5, my nUnitsInLayer[layer], 1, 1,
-		                      0.5, my nUnitsInLayer[layer - 1] + 1 + 0.5, my nUnitsInLayer[layer - 1] + 1, 1, 1);
+		autoMatrix thee = Matrix_create (0.5, my nUnitsInLayer[layer] + 0.5, my nUnitsInLayer[layer], 1.0, 1.0,
+		    0.5, my nUnitsInLayer[layer - 1] + 1 + 0.5, my nUnitsInLayer[layer - 1] + 1, 1.0, 1.0);
 		long node = 1;
 		for (long i = 0; i < layer; i++) {
 			node += my nUnitsInLayer[i] + 1;
@@ -42,24 +41,25 @@ Matrix FFNet_weightsToMatrix (FFNet me, long layer, int deltaWeights) {
 				thy z[k++][i] = deltaWeights ? my dwi[j] : my w[j];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Matrix created.");
+		Melder_throw (me, U": no Matrix created.");
 	}
 }
 
-FFNet FFNet_weightsFromMatrix (FFNet me, Matrix him, long layer) {
+autoFFNet FFNet_weightsFromMatrix (FFNet me, Matrix him, long layer) {
 	try {
 		if (layer < 1 || layer > my nLayers) {
-			Melder_throw ("Layer must be > 0 and < ", my nLayers, ".");
+			Melder_throw (U"Layer must be > 0 and < ", my nLayers, U".");
+		}
+		if (my nUnitsInLayer[layer] != his nx) {
+			Melder_throw (U"The #columns (", his nx, U") must equal #units (", my nUnitsInLayer[layer], U") in layer ", layer, U".");
 		}
-		if (my nUnitsInLayer[layer] != his nx) Melder_throw (L"The #columns (", his nx, ") must equal "
-			        "#units (", my nUnitsInLayer[layer], ") in layer ", layer, ".");
 		long nunits = my nUnitsInLayer[layer - 1] + 1;
 		if (nunits != his ny) {
-			Melder_throw (" The #rows (", his ny, ")  must equal #units (", nunits , ") in layer ", layer - 1, ".");
+			Melder_throw (U" The #rows (", his ny, U")  must equal #units (", nunits , U") in layer ", layer - 1, U".");
 		}
-		autoFFNet thee = (FFNet) Data_copy (me);
+		autoFFNet thee = Data_copy (me);
 		long node = 1;
 		for (long i = 0; i < layer; i++) {
 			node += thy nUnitsInLayer[i] + 1;
@@ -70,9 +70,9 @@ FFNet FFNet_weightsFromMatrix (FFNet me, Matrix him, long layer) {
 				thy w[j] = his z[k][i];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no FFNet created.");
+		Melder_throw (me, U": no FFNet created.");
 	}
 }
 
diff --git a/FFNet/FFNet_Matrix.h b/FFNet/FFNet_Matrix.h
index 4a3fa96..7aaf98b 100644
--- a/FFNet/FFNet_Matrix.h
+++ b/FFNet/FFNet_Matrix.h
@@ -2,7 +2,7 @@
 #define _FFNet_Matrix_h_
 /* FFNet_Matrix.h
  *
- * Copyright (C) 1997-2011 David Weenink
+ * Copyright (C) 1997-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,10 +28,6 @@
 #include "Matrix.h"
 #include "FFNet.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 /* The Matrix organization is as follows:									*/
 /*																			*/
 /* nx = nUnitsInLayer[layer]												*/
@@ -42,15 +38,11 @@
 /* x1 = y1 = 1																*/
 /*																			*/
 
-Matrix FFNet_weightsToMatrix (FFNet me, long layer, int deltaWeights);
+autoMatrix FFNet_weightsToMatrix (FFNet me, long layer, int deltaWeights);
 /* (delta) weights connected to layer into Matrix */
 
-FFNet FFNet_weightsFromMatrix (FFNet me, Matrix matrix, long layer);
+autoFFNet FFNet_weightsFromMatrix (FFNet me, Matrix matrix, long layer);
 /* creates a new FFNet in which the weights that connect to layer are		*/
 /* replaced by the weights in the matrix									*/
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _FFNet_Matrix_h_ */
diff --git a/FFNet/FFNet_Pattern.cpp b/FFNet/FFNet_Pattern.cpp
index 0e214e2..82f7dea 100644
--- a/FFNet/FFNet_Pattern.cpp
+++ b/FFNet/FFNet_Pattern.cpp
@@ -28,7 +28,7 @@ void FFNet_Pattern_drawActivation (FFNet me, Pattern pattern, Graphics g, long i
 	if (index < 1 || index > pattern->ny) {
 		return;
 	}
-	FFNet_propagate (me, pattern->z[index], NULL);
+	FFNet_propagate (me, pattern->z[index], nullptr);
 	FFNet_drawActivation (me, g);
 }
 
diff --git a/FFNet/FFNet_Pattern.h b/FFNet/FFNet_Pattern.h
index fa4c445..824aec7 100644
--- a/FFNet/FFNet_Pattern.h
+++ b/FFNet/FFNet_Pattern.h
@@ -2,7 +2,7 @@
 #define _FFNet_Pattern_h_
 /* FFNet_Pattern.h
  *
- * Copyright (C) 1997-2011 David Weenink
+ * Copyright (C) 1997-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,14 +28,6 @@
 #include "Pattern.h"
 #include "FFNet.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 void FFNet_Pattern_drawActivation( FFNet me, Pattern pattern, Graphics g, long ipattern );
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _FFNet_Pattern_h_ */
diff --git a/FFNet/FFNet_Pattern_Activation.cpp b/FFNet/FFNet_Pattern_Activation.cpp
index 9a95828..c38eee3 100644
--- a/FFNet/FFNet_Pattern_Activation.cpp
+++ b/FFNet/FFNet_Pattern_Activation.cpp
@@ -1,6 +1,6 @@
 /* FFNet_Pattern_Activation.cpp
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,10 +28,10 @@
 #include "Graphics.h"
 #include "FFNet_Pattern_Activation.h"
 
-static double func (Data object, const double p[]) {
+static double func (Daata object, const double p[]) {
 	FFNet me = (FFNet) object;
 	Minimizer thee = my minimizer;
-	double fp = 0;
+	double fp = 0.0;
 
 	for (long j = 1, k = 1; k <= my nWeights; k++) {
 		my dw[k] = 0.0;
@@ -40,7 +40,7 @@ static double func (Data object, const double p[]) {
 		}
 	}
 	for (long i = 1; i <= my nPatterns; i++) {
-		FFNet_propagate (me, my inputPattern[i], NULL);
+		FFNet_propagate (me, my inputPattern[i], nullptr);
 		fp += FFNet_computeError (me, my targetActivation[i]);
 		FFNet_computeDerivative (me);
 		/* derivative (cumulative) */
@@ -52,7 +52,7 @@ static double func (Data object, const double p[]) {
 	return fp;
 }
 
-static void dfunc_optimized (Data object, const double p[], double dp[]) {
+static void dfunc_optimized (Daata object, const double p[], double dp[]) {
 	FFNet me = (FFNet) object;
 	(void) p;
 
@@ -65,23 +65,23 @@ static void dfunc_optimized (Data object, const double p[], double dp[]) {
 }
 
 static void _FFNet_Pattern_Activation_checkDimensions (FFNet me, Pattern p, Activation a) {
-	if (my nInputs != p -> nx) Melder_throw (L"The Pattern and the FFNet do not match.\n"
-		        "The number of colums in the Pattern must equal the number of inputs in the FFNet.");
-	if (my nOutputs != a -> nx) Melder_throw (L"The Activation and the FFNet do not match.\n"
-		        "The number of colums in the Activation must equal the number of outputs in the FFNet.");
-	if (p -> ny != a -> ny) Melder_throw (L"The Pattern and the Activation do not match.\n"
-		                                      "The number of rows in the Pattern must equal the number of rows in the Activation.");
-	if (! _Pattern_checkElements (p)) Melder_throw (L"The elements in the Pattern are not all "
-		        "in the interval [0, 1].\nThe input of the neural net can only process values that are between 0 "
-		        "and 1.\nYou could use a \"Formula...\" to scale the Pattern values first.");
-	if (! _Activation_checkElements (a)) Melder_throw (L"The elements in the Activation are not "
-		        "all in the interval [0, 1].\nThe output of the neural net can only process values that are "
-		        "between 0 and 1.\nYou could use \"Formula...\" to scale the Activation values first.");
+	if (my nInputs != p -> nx) {
+		Melder_throw (U"The Pattern and the FFNet do not match.\nThe number of columns in the Pattern must equal the number of inputs in the FFNet.");
+	}
+	if (my nOutputs != a -> nx) {
+		Melder_throw (U"The Activation and the FFNet do not match.\nThe number of columns in the Activation must equal the number of outputs in the FFNet.");
+	}
+	if (p -> ny != a -> ny) {
+		Melder_throw (U"The Pattern and the Activation do not match.\nThe number of rows in the Pattern must equal the number of rows in the Activation.");
+	}
+	if (! _Pattern_checkElements (p)) {
+		Melder_throw (U"All Pattern elements must be in the interval [0, 1].\nYou could use \"Formula...\" to scale the Pattern values first.");	}
+	if (! _Activation_checkElements (a)) {
+		Melder_throw (U"All Activation elements must be in the interval [0, 1].\nYou could use \"Formula...\" to scale the Activation values first.");
+	}
 }
 
-static void _FFNet_Pattern_Activation_learn (FFNet me, Pattern pattern,
-        Activation activation, long maxNumOfEpochs, double tolerance,
-        Any parameters, int costFunctionType, int reset) {
+static void _FFNet_Pattern_Activation_learn (FFNet me, Pattern pattern, Activation activation, long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType, int reset) {
 	try {
 		_FFNet_Pattern_Activation_checkDimensions (me, pattern, activation);
 		Minimizer_setParameters (my minimizer, parameters);
@@ -109,50 +109,46 @@ static void _FFNet_Pattern_Activation_learn (FFNet me, Pattern pattern,
 		// Unlink
 
 		my nPatterns = 0;
-		my inputPattern = NULL;
-		my targetActivation = NULL;
+		my inputPattern = nullptr;
+		my targetActivation = nullptr;
 	} catch (MelderError) {
 		my nPatterns = 0;
-		my inputPattern = 0;
-		my targetActivation = 0;
+		my inputPattern = nullptr;
+		my targetActivation = nullptr;
 	}
 }
 
 
-void FFNet_Pattern_Activation_learnSD (FFNet me, Pattern p, Activation a,
-                                       long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType) {
+void FFNet_Pattern_Activation_learnSD (FFNet me, Pattern p, Activation a, long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType) {
 	int resetMinimizer = 0;
 	/* Did we choose another minimizer */
-	if (my minimizer != 0 && ! Thing_member (my minimizer, classSteepestDescentMinimizer)) {
+	if (my minimizer && ! Thing_isa (my minimizer, classSteepestDescentMinimizer)) {
 		forget (my minimizer);
 		resetMinimizer = 1;
 	}
 	/* create the minimizer if it doesn't exist */
-	if (my minimizer == 0) {
+	if (! my minimizer) {
 		resetMinimizer = 1;
 		my minimizer = (Minimizer) SteepestDescentMinimizer_create (my dimension, me, func, dfunc_optimized);
 	}
-	_FFNet_Pattern_Activation_learn (me, p, a, maxNumOfEpochs,
-	                                 tolerance, parameters, costFunctionType, resetMinimizer);
+	_FFNet_Pattern_Activation_learn (me, p, a, maxNumOfEpochs,tolerance, parameters, costFunctionType, resetMinimizer);
 }
 
-void FFNet_Pattern_Activation_learnSM (FFNet me, Pattern p, Activation a,
-                                       long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType) {
+void FFNet_Pattern_Activation_learnSM (FFNet me, Pattern p, Activation a, long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType) {
 	int resetMinimizer = 0;
-	/*
-		Did we choose another minimizer
-	*/
-	if (my minimizer != 0 && ! Thing_member (my minimizer, classVDSmagtMinimizer)) {
+
+	// Did we choose another minimizer
+
+	if (my minimizer && ! Thing_isa (my minimizer, classVDSmagtMinimizer)) {
 		forget (my minimizer);
 		resetMinimizer = 1;
 	}
-	/* create the minimizer if it doesn't exist */
-	if (my minimizer == 0) {
+	// create the minimizer if it doesn't exist
+	if (! my minimizer) {
 		resetMinimizer = 1;
 		my minimizer = (Minimizer) VDSmagtMinimizer_create (my dimension, me, func, dfunc_optimized);
 	}
-	_FFNet_Pattern_Activation_learn (me, p, a, maxNumOfEpochs,
-	                                 tolerance, parameters, costFunctionType, resetMinimizer);
+	_FFNet_Pattern_Activation_learn (me, p, a, maxNumOfEpochs, tolerance, parameters, costFunctionType, resetMinimizer);
 }
 
 double FFNet_Pattern_Activation_getCosts_total (FFNet me, Pattern p, Activation a, int costFunctionType) {
@@ -160,9 +156,9 @@ double FFNet_Pattern_Activation_getCosts_total (FFNet me, Pattern p, Activation
 		_FFNet_Pattern_Activation_checkDimensions (me, p, a);
 		FFNet_setCostFunction (me, costFunctionType);
 
-		double cost = 0;
+		double cost = 0.0;
 		for (long i = 1; i <= p -> ny; i++) {
-			FFNet_propagate (me, p -> z[i], NULL);
+			FFNet_propagate (me, p -> z[i], nullptr);
 			cost += FFNet_computeError (me, a -> z[i]);
 		}
 		return cost;
@@ -176,28 +172,26 @@ double FFNet_Pattern_Activation_getCosts_average (FFNet me, Pattern p, Activatio
 	return costs == NUMundefined ? NUMundefined : costs / p -> ny;
 }
 
-Activation FFNet_Pattern_to_Activation (FFNet me, Pattern p, long layer) {
+autoActivation FFNet_Pattern_to_Activation (FFNet me, Pattern p, long layer) {
 	try {
 		if (layer < 1 || layer > my nLayers) {
 			layer = my nLayers;
 		}
-		if (my nInputs != p -> nx) Melder_throw ("The Pattern and the FFNet do not match. "
-			        "The number of colums in the Pattern (", p -> nx, ") must equal the number of inputs "
-			        "in the FFNet (", my nInputs, ").");
-		if (! _Pattern_checkElements (p)) Melder_throw
-			("The elements in the Activation are not all in the interval [0, 1].\n"
-			 "The output units of the neural net can only process values that are between 0 and 1.\n"
-			 "You could use \"Formula...\" to scale the Activation values first.");
-
+		if (my nInputs != p -> nx) {
+			Melder_throw (U"The Pattern and the FFNet do not match. The number of colums in the Pattern (", p -> nx, U") should equal the number of inputs in the FFNet (", my nInputs, U").");
+		}
+		if (! _Pattern_checkElements (p)) {
+			Melder_throw (U"All Pattern elements must be in the interval [0, 1].\nYou could use \"Formula...\" to scale the Pattern values first.");
+		}
 		long nPatterns = p -> ny;
 		autoActivation thee = Activation_create (nPatterns, my nUnitsInLayer[layer]);
 
 		for (long i = 1; i <= nPatterns; i++) {
 			FFNet_propagateToLayer (me, p -> z[i], thy z[i], layer);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Activation created.");
+		Melder_throw (me, U": no Activation created.");
 	}
 }
 
diff --git a/FFNet/FFNet_Pattern_Activation.h b/FFNet/FFNet_Pattern_Activation.h
index aac4583..1aba086 100644
--- a/FFNet/FFNet_Pattern_Activation.h
+++ b/FFNet/FFNet_Pattern_Activation.h
@@ -2,7 +2,7 @@
 #define _FFNet_Pattern_Activation_h_
 /* FFNet_Pattern_Activation.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,10 +32,6 @@
 #include "Activation.h"
 #include "Minimizers.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 void FFNet_Pattern_Activation_learnSD (FFNet me, Pattern p, Activation a, long maxNumOfEpochs,
     double tolerance, Any parameters, int costFunctionType);
 /* Steepest Descent minimization */
@@ -46,12 +42,8 @@ void FFNet_Pattern_Activation_learnSM (FFNet me, Pattern p, Activation a, long m
 double FFNet_Pattern_Activation_getCosts_total (FFNet me, Pattern p, Activation a, int costFunctionType);
 double FFNet_Pattern_Activation_getCosts_average (FFNet me, Pattern p, Activation a, int costFunctionType);
 
-Activation FFNet_Pattern_to_Activation (FFNet me, Pattern p, long layer);
+autoActivation FFNet_Pattern_to_Activation (FFNet me, Pattern p, long layer);
 /* Calculate the activations at a layer */
 /* if (layer<1 || layer > my nLayers) layer = my nLayers; */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _FFNet_Pattern_Activation_h_ */
diff --git a/FFNet/FFNet_Pattern_Categories.cpp b/FFNet/FFNet_Pattern_Categories.cpp
index c434374..1b79b87 100644
--- a/FFNet/FFNet_Pattern_Categories.cpp
+++ b/FFNet/FFNet_Pattern_Categories.cpp
@@ -1,6 +1,6 @@
 /* FFNet_Pattern_Categories.cpp
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,18 +30,18 @@
 
 static void _FFNet_Pattern_Categories_checkDimensions (FFNet me, Pattern p, Categories c) {
 
-	if (my nInputs != p -> nx) Melder_throw (L"The Pattern and the FFNet do not match.\n"
-		        "The number of colums in the Pattern must equal the number of inputs in the FFNet.");
-	if (p -> ny != c -> size) Melder_throw (L"The Pattern and the categories do not match.\n"
-		                                        "The number of rows in the Pattern must equal the number of categories.");
-	if (! _Pattern_checkElements (p)) Melder_throw (L"The elements in the Pattern are not all "
-		        "in the interval [0, 1].\nThe input of the neural net can only process values that are between 0 "
-		        "and 1.\nYou could use \"Formula...\" to scale the Pattern values first.");
+	if (my nInputs != p -> nx) {
+		Melder_throw (U"The Pattern and the FFNet do not match.\nThe number of colums in the Pattern must equal the number of inputs in the FFNet.");
+	}
+	if (p -> ny != c -> size) {
+		Melder_throw (U"The Pattern and the categories do not match.\nThe number of rows in the Pattern must equal the number of categories.");
+	}
+	if (! _Pattern_checkElements (p)) {
+		Melder_throw (U"All Pattern elements must be in the interval [0, 1].\nYou could use \"Formula...\" to scale the Pattern values first.");
+	}
 }
 
-static void _FFNet_Pattern_Categories_learn (FFNet me, Pattern p, Categories c,
-        long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType,
-        void (*learn) (FFNet, Pattern, Activation, long, double, Any, int)) {
+static void _FFNet_Pattern_Categories_learn (FFNet me, Pattern p, Categories c, long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType, void (*learn) (FFNet, Pattern, Activation, long, double, Any, int)) {
 	_FFNet_Pattern_Categories_checkDimensions (me, p, c);
 	autoActivation activation = FFNet_Categories_to_Activation (me, c);
 	double min, max;
@@ -64,40 +64,37 @@ double FFNet_Pattern_Categories_getCosts_average (FFNet me, Pattern p, Categorie
 	return costs == NUMundefined ? NUMundefined : costs / p -> ny;
 }
 
-void FFNet_Pattern_Categories_learnSM (FFNet me, Pattern p, Categories c,
-                                       long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType) {
+void FFNet_Pattern_Categories_learnSM (FFNet me, Pattern p, Categories c, long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType) {
 	_FFNet_Pattern_Categories_learn (me, p, c, maxNumOfEpochs, tolerance, parameters, costFunctionType, FFNet_Pattern_Activation_learnSM);
 }
 
-void FFNet_Pattern_Categories_learnSD (FFNet me, Pattern p, Categories c,
-                                       long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType) {
+void FFNet_Pattern_Categories_learnSD (FFNet me, Pattern p, Categories c, long maxNumOfEpochs, double tolerance, Any parameters, int costFunctionType) {
 	_FFNet_Pattern_Categories_learn (me, p, c, maxNumOfEpochs, tolerance, parameters, costFunctionType, FFNet_Pattern_Activation_learnSD);
 }
 
-Categories FFNet_Pattern_to_Categories (FFNet me, Pattern thee, int labeling) {
+autoCategories FFNet_Pattern_to_Categories (FFNet me, Pattern thee, int labeling) {
 	try {
-		if (my outputCategories == 0) {
-			Melder_throw ("The FFNet has no output categories.");
+		if (! my outputCategories) {
+			Melder_throw (U"The FFNet has no output categories.");
+		}
+		if (my nInputs != thy nx) {
+			Melder_throw (U"The number of colums in the Pattern (", thy nx, U") should equal the number of inputs in the FFNet (", my nInputs, U").");
+		}
+		if (! _Pattern_checkElements (thee)) {
+			Melder_throw (U"All Pattern elements must be in the interval [0, 1].\nYou could use \"Formula...\" to scale the Pattern values first.");
 		}
-		if (my nInputs != thy nx) Melder_throw ("The number of colums in the Pattern (", thy nx,
-			                                        ") must equal the number of inputs in the FFNet (", my nInputs, L").");
-		if (! _Pattern_checkElements (thee)) Melder_throw
-			("The elements in the Pattern are not all in the interval [0, 1].\n"
-			 "The input of the neural net can only process values that are between 0 and 1.\n"
-			 "You could use \"Formula...\" to scale the Pattern values first.");
-
 
 		autoCategories him = Categories_create ();
 
 		for (long k = 1; k <= thy ny; k++) {
-			FFNet_propagate (me, thy z[k], 0);
+			FFNet_propagate (me, thy z[k], nullptr);
 			long index = FFNet_getWinningUnit (me, labeling);
-			autoData item = Data_copy ( (Data) my outputCategories -> item[index]);
+			autoDaata item = Data_copy ((Daata) my outputCategories -> item[index]);
 			Collection_addItem (him.peek(), item.transfer());
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Categories created.");
+		Melder_throw (me, U": no Categories created.");
 	}
 }
 
diff --git a/FFNet/FFNet_Pattern_Categories.h b/FFNet/FFNet_Pattern_Categories.h
index 3f50d9f..07128f4 100644
--- a/FFNet/FFNet_Pattern_Categories.h
+++ b/FFNet/FFNet_Pattern_Categories.h
@@ -2,7 +2,7 @@
 #define _FFNet_Pattern_Categories_h_
 /* FFNet_Pattern_Categories.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,10 +30,6 @@
 #include "Categories.h"
 #include "Minimizers.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 void FFNet_Pattern_Categories_learnSD (FFNet me, Pattern p, Categories c, long maxNumOfEpochs,
     double tolerance, Any parameters, int costFunctionType);
 /* Steepest descent */
@@ -45,15 +41,10 @@ void FFNet_Pattern_Categories_learnSM (FFNet me, Pattern p, Categories c, long m
 double FFNet_Pattern_Categories_getCosts_total (FFNet me, Pattern p, Categories c, int costFunctionType);
 double FFNet_Pattern_Categories_getCosts_average (FFNet me, Pattern p, Categories c, int costFunctionType);
 
-Categories FFNet_Pattern_to_Categories (FFNet me, Pattern p, int labeling);
+autoCategories FFNet_Pattern_to_Categories (FFNet me, Pattern p, int labeling);
 /* classify the Pattern */
 /* labeling = 1 : winner-takes-all */
 /* labeling = 2 : stochastic */
 /* Preconditions: I have labels */
 
-
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _FFNet_Pattern_Categories_h_ */
diff --git a/FFNet/FFNet_def.h b/FFNet/FFNet_def.h
index 00d16f8..f52d8bc 100644
--- a/FFNet/FFNet_def.h
+++ b/FFNet/FFNet_def.h
@@ -25,7 +25,7 @@
 */
 
 #define ooSTRUCT FFNet
-oo_DEFINE_CLASS (FFNet, Data)
+oo_DEFINE_CLASS (FFNet, Daata)
 
 	oo_LONG (nLayers)	/* number of layers */
 	
@@ -36,8 +36,7 @@ oo_DEFINE_CLASS (FFNet, Data)
 	oo_INT (nonLinearityType)
 
 	oo_INT (costFunctionType)
-
-	oo_COLLECTION (Categories, outputCategories, SimpleString, 0)
+	oo_AUTO_OBJECT (Categories, 0, outputCategories)
 
 	oo_LONG (nWeights)	/* number of weights */
 
@@ -50,9 +49,9 @@ oo_DEFINE_CLASS (FFNet, Data)
 		oo_LONG (dimension)
 
 		#if oo_DECLARING
-			double (*nonLinearity) (I, double /* x */, double * /* deriv */);
+			double (*nonLinearity) (FFNet /* me */, double /* x */, double * /* deriv */);
     		void *nlClosure;
-    		double (*costFunction) (I, const double * /* target */);
+    		double (*costFunction) (FFNet /* me */, const double * /* target */);
 			void *cfClosure;
 		#endif
 		
@@ -94,8 +93,8 @@ oo_DEFINE_CLASS (FFNet, Data)
 	#endif
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (FFNet)
diff --git a/FFNet/manual_FFNet.cpp b/FFNet/manual_FFNet.cpp
index dbe8e65..ef46aeb 100644
--- a/FFNet/manual_FFNet.cpp
+++ b/FFNet/manual_FFNet.cpp
@@ -35,53 +35,53 @@ void manual_FFNet_init (ManPages me);
 void manual_FFNet_init (ManPages me)
 {
 
-MAN_BEGIN (L"epoch", L"djmw", 20040428)
-INTRO (L"A term that is often used in the context of machine learning. An epoch is one complete "
+MAN_BEGIN (U"epoch", U"djmw", 20040428)
+INTRO (U"A term that is often used in the context of machine learning. An epoch is one complete "
 	"presentation of the %%data set to be learned% to a learning machine.")
-NORMAL (L"Learning machines like @@FFNet|feedforward neural nets@ that use iterative algorithms "
+NORMAL (U"Learning machines like @@FFNet|feedforward neural nets@ that use iterative algorithms "
 	"often need many epochs during their learning phase.")
-NORMAL (L"A @@Discriminant|discriminant classifier@ is also a learning machine. "
+NORMAL (U"A @@Discriminant|discriminant classifier@ is also a learning machine. "
 	"However, in contrast with neural nets a discriminant classifier only needs one epoch to learn.")
 MAN_END
 
-MAN_BEGIN (L"Feedforward neural networks", L"djmw", 20040511)
-INTRO (L"This tutorial describes the use of @FFNet feedforward neural networks in P\\s{RAAT}. ")
-NORMAL (L"@@Feedforward neural networks 1. What is a feedforward neural network?|1. What is a feedforward neural network?@")
-LIST_ITEM (L"  @@Feedforward neural networks 1.1. The learning phase|1.1 The learning phase")
-LIST_ITEM (L"  @@Feedforward neural networks 1.2. The classification phase|1.2 The classification phase")
-NORMAL (L"@@Feedforward neural networks 2. Quick start|2. Quick start@")
-NORMAL (L"@@Feedforward neural networks 3. FFNet versus discriminant classifier|3. FFNet versus discriminant classifier@")
-NORMAL (L"@@Feedforward neural networks 4. Command overview|4. Command overview@")
+MAN_BEGIN (U"Feedforward neural networks", U"djmw", 20040511)
+INTRO (U"This tutorial describes the use of @FFNet feedforward neural networks in P\\s{RAAT}. ")
+NORMAL (U"@@Feedforward neural networks 1. What is a feedforward neural network?|1. What is a feedforward neural network?@")
+LIST_ITEM (U"  @@Feedforward neural networks 1.1. The learning phase|1.1 The learning phase")
+LIST_ITEM (U"  @@Feedforward neural networks 1.2. The classification phase|1.2 The classification phase")
+NORMAL (U"@@Feedforward neural networks 2. Quick start|2. Quick start@")
+NORMAL (U"@@Feedforward neural networks 3. FFNet versus discriminant classifier|3. FFNet versus discriminant classifier@")
+NORMAL (U"@@Feedforward neural networks 4. Command overview|4. Command overview@")
 MAN_END
 
-MAN_BEGIN (L"Feedforward neural networks 1. What is a feedforward neural network?", L"djmw", 20040426)
-INTRO (L"A feedforward neural network is a biologically inspired classification algorithm. "
+MAN_BEGIN (U"Feedforward neural networks 1. What is a feedforward neural network?", U"djmw", 20040426)
+INTRO (U"A feedforward neural network is a biologically inspired classification algorithm. "
 	"It consist of a (possibly large) number of simple neuron-like processing %units, organized in %layers. "
 	"Every unit in a layer is connected with all the units in the previous layer. "
-	"These connections are not all equal, each connection may have a different strength or %weight. "
+	"These connections are not all equal: each connection may have a different strength or %weight. "
 	"The weights on these connections encode the knowledge of a network. "
 	"Often the units in a neural network are also called %nodes.")
-NORMAL (L"Data enters at the inputs and passes through the network, layer by layer, until it arrives at the outputs. "
+NORMAL (U"Data enters at the inputs and passes through the network, layer by layer, until it arrives at the outputs. "
 	"During normal operation, that is when it acts as a classifier, there is no feedback between layers. "
 	"This is why they are called %%feedforward% neural networks. ")
-NORMAL (L"In the following figure we see an example of a 2-layered network with, from top to bottom: "
+NORMAL (U"In the following figure we see an example of a 2-layered network with, from top to bottom: "
 	"an output layer with 5 units, a %hidden layer with 4 units, respectively. The network has 3 input units.")
 PICTURE (5, 5, drawFFNet_345)
-NORMAL (L"The 3 inputs are shown as circles and these do not belong to any layer of the network (although the inputs "
+NORMAL (U"The 3 inputs are shown as circles and these do not belong to any layer of the network (although the inputs "
 	"sometimes are considered as a virtual layer with layer number 0). Any layer that is not an output layer is a "
 	"%hidden layer. This network therefore has 1 hidden layer and 1 output layer. The figure also shows all the "
 	"connections between the units in different layers. A layer only connects to the previous layer. ")
-NORMAL (L"The operation of this network can be divided into two phases:")
-NORMAL (L"@@Feedforward neural networks 1.1. The learning phase|1. The learning phase")
-NORMAL (L"@@Feedforward neural networks 1.2. The classification phase|2. The classification phase")
+NORMAL (U"The operation of this network can be divided into two phases:")
+NORMAL (U"@@Feedforward neural networks 1.1. The learning phase|1. The learning phase")
+NORMAL (U"@@Feedforward neural networks 1.2. The classification phase|2. The classification phase")
 MAN_END
 
-MAN_BEGIN (L"Feedforward neural networks 1.1. The learning phase", L"djmw", 20040428)
-INTRO (L"During the learning phase the weights in the FFNet will be modified. "
+MAN_BEGIN (U"Feedforward neural networks 1.1. The learning phase", U"djmw", 20040428)
+INTRO (U"During the learning phase the weights in the FFNet will be modified. "
 	"All weights are modified in such a way that when a pattern is presented, "
 	"the output unit with the correct category, hopefully, will have the largest output value.")
-ENTRY (L"How does learning take place?")
-NORMAL (L"The FFNet uses a %supervised learning algorithm: besides the input pattern, "
+ENTRY (U"How does learning take place?")
+NORMAL (U"The FFNet uses a %supervised learning algorithm: besides the input pattern, "
 	"the neural net also needs to know to what category the pattern belongs. "
 	"Learning proceeds as follows: a pattern is presented at the inputs. "
 	"The pattern will be transformed in its passage through the layers of the network until it "
@@ -96,42 +96,42 @@ NORMAL (L"The FFNet uses a %supervised learning algorithm: besides the input pat
 	"little bit lower than they are now. (The differences between the actual outputs and the idealized outputs "
 	"are propagated back from the top layer to lower layers to be used at these layers to modify connection weights. "
 	"This is why the term %%backpropagation network% is also often used to describe this type of neural network.")
-NORMAL (L"If you perform the procedure above once for every pattern and category pair in your data "
+NORMAL (U"If you perform the procedure above once for every pattern and category pair in your data "
 	"set you have have performed 1 @epoch of learning.")
-NORMAL (L"The hope is that eventually, probably after many epochs, "
+NORMAL (U"The hope is that eventually, probably after many epochs, "
 	"the neural net will remember these pattern-category pairs. "
 	"You even hope that the neural net when the learning phase has terminated, will be able to %generalize "
 	"and has learned to "
 	"@@FFNet & Pattern: To Categories...|classify@ correctly any unknown pattern presented to it. ")
-NORMAL (L"Because real-life data many times contains noise as well as partly contradictory information "
+NORMAL (U"Because real-life data many times contains noise as well as partly contradictory information "
 	"these hopes can only be partly fulfilled. ")
-NORMAL (L"For @@FFNet & Pattern & Categories: Learn...|learning@ you "
+NORMAL (U"For @@FFNet & Pattern & Categories: Learn...|learning@ you "
 	"need to select 3 different objects together: a FFNet (the %classifier), "
 	"a Pattern (the %inputs) and a Categories (the %%correct outputs%).")
-ENTRY (L"How long will the learning phase take?")
-NORMAL (L"In general this question is hard to answer. It depends on the size of the neural network, "
+ENTRY (U"How long will the learning phase take?")
+NORMAL (U"In general this question is hard to answer. It depends on the size of the neural network, "
 	"the number of patterns to be learned, the number of epochs, the tolerance of the minimizer "
 	"and the speed of your computer, how much computing time the learning phase may take. ")
-NORMAL (L"If computing time becomes excessive in your interactive environment then consider using the "
+NORMAL (U"If computing time becomes excessive in your interactive environment then consider using the "
 	"powerful @@Scripting|scripting@ facilities in P\\s{RAAT} to process your learning job as a batch job. ")
 MAN_END
 
-MAN_BEGIN (L"Feedforward neural networks 1.2. The classification phase", L"djmw", 20040428)
-INTRO (L"In the classification phase the weights of the network are fixed. ")
-NORMAL (L"A pattern, presented at the inputs, will be transformed from layer to layer until it reaches the output layer. "
+MAN_BEGIN (U"Feedforward neural networks 1.2. The classification phase", U"djmw", 20040428)
+INTRO (U"In the classification phase the weights of the network are fixed. ")
+NORMAL (U"A pattern, presented at the inputs, will be transformed from layer to layer until it reaches the output layer. "
 	"Now classification can occur by selecting the category associated with the output unit that has "
 	"the largest output value.  "
 	"For classification we only need to select an FFNet and a Pattern together and "
 	"choose  @@FFNet & Pattern: To Categories...|To Categories... at . ")
-NORMAL (L"In contrast to the @@Feedforward neural networks 1.1. The learning phase|learning phase@ classification is very fast.")
+NORMAL (U"In contrast to the @@Feedforward neural networks 1.1. The learning phase|learning phase@ classification is very fast.")
 MAN_END
 
-MAN_BEGIN (L"Feedforward neural networks 2. Quick start", L"djmw", 20040426)
-INTRO (L"You may create the iris example set with the @@Create iris example...@ command "
+MAN_BEGIN (U"Feedforward neural networks 2. Quick start", U"djmw", 20040426)
+INTRO (U"You may create the iris example set with the @@Create iris example...@ command "
 	"that you will find under the ##Neural nets# option in the #New menu. "
 	"Three new objects will appear in the @@List of Objects@: a @FFNet, a @Categories and "
 	"a @Pattern.")
-NORMAL (L"The #Pattern contains the @@iris data set@ in a 150 rows by 4 columns matrix. "
+NORMAL (U"The #Pattern contains the @@iris data set@ in a 150 rows by 4 columns matrix. "
 	"To  guarantee that every cell in the Pattern is in the [0,1] interval, all measurement "
 	"values were divided by 10. In the #Categories the three iris species %setosa, "
 	"%versicolor, and %virginica were categorized with the numbers #1, #2 and #3, respectively. "
@@ -140,8 +140,8 @@ NORMAL (L"The #Pattern contains the @@iris data set@ in a 150 rows by 4 columns
 	"If you have entered a positive number in one of the fields in the form, the FFNet will have "
 	"this number of units in a %%hidden layer%. The name of the newly created FFNet "
 	"will reflect its topology. If you did opt for the default, 0 hidden units, the FFNet will be named 4-3.")
-ENTRY (L"Learning the iris data")
-NORMAL (L"The first thing you probably might want to do is to let the #FFNet learn the association in "
+ENTRY (U"Learning the iris data")
+NORMAL (U"The first thing you probably might want to do is to let the #FFNet learn the association in "
 	"each pattern-category pair.  To do this select all three objects together and choose "
 	"@@FFNet & Pattern & Categories: Learn...|Learn... at . "
 	"A form will appear, asking you to supply some settings for "
@@ -149,8 +149,8 @@ NORMAL (L"The first thing you probably might want to do is to let the #FFNet lea
 	"Since the example network does not have too many weights that need to be adjusted and "
 	"the learning data set is very small and computers nowadays are very fast, this will only take a "
 	"very short time.")
-ENTRY (L"Classify")
-NORMAL (L"Now, if you are curious how well the FFNet has learned the iris data, you may select the "
+ENTRY (U"Classify")
+NORMAL (U"Now, if you are curious how well the FFNet has learned the iris data, you may select the "
 	"#FFNet and the #Pattern together and choose @@FFNet & Pattern: To Categories...|To Categories... at . "
 	"A new #Categories appears in the ##List of Objects# with the name %4-3_iris (if %%4-3% was the name of the FFNet and %iris% the name of the Pattern). "
 	"We have two different Categories in the list of objects, the topmost one has the original categories, the other "
@@ -159,102 +159,102 @@ NORMAL (L"Now, if you are curious how well the FFNet has learned the iris data,
 	"Select the two #Categories and choose @@Categories: To Confusion|To Confusion@ and a newly "
 	"created @Confusion appears. Pressing the @Info button will show you an info window with, "
 	"among others, the fraction correct. ")
-NORMAL (L"You might also want to "
+NORMAL (U"You might also want to "
 	"@@Feedforward neural networks 3. FFNet versus discriminant classifier|compare the FFNet classifier with a discriminant classifier at .")
-ENTRY (L"Create other neural net topologies")
-NORMAL (L"With a #Pattern and a #Categories selected together, you can for example create a new #FFNet of a different topology.")
+ENTRY (U"Create other neural net topologies")
+NORMAL (U"With a #Pattern and a #Categories selected together, you can for example create a new #FFNet of a different topology.")
 MAN_END
 
-MAN_BEGIN (L"Feedforward neural networks 3. FFNet versus discriminant classifier", L"djmw", 20040426)
-NORMAL (L"You might want to compare the FFNet classifier with a discriminant classifier. "
+MAN_BEGIN (U"Feedforward neural networks 3. FFNet versus discriminant classifier", U"djmw", 20040426)
+NORMAL (U"You might want to compare the FFNet classifier with a discriminant classifier. "
 	"Unlike the FFNet, a @@Discriminant|discriminant@ classifier does not need any iterative procedure in the "
 	"learning phase and can be used immediately after creation for classification. "
 	"The following three simple steps will give you the confusion matrix based on discriminant analysis:")
-LIST_ITEM (L"1. Select the Pattern and the Categories together and choose ##To Discriminant#.  "
+LIST_ITEM (U"1. Select the Pattern and the Categories together and choose ##To Discriminant#.  "
 	"A newly created Discriminant will appear.")
-LIST_ITEM (L"2. Select the Discriminant and the Pattern together and choose ##To Categories...#. A newly created @Categories will appear.")
-LIST_ITEM (L"3. Select the two appropriate Categories and choose @@categories: To Confusion|To Confusion at .  "
+LIST_ITEM (U"2. Select the Discriminant and the Pattern together and choose ##To Categories...#. A newly created @Categories will appear.")
+LIST_ITEM (U"3. Select the two appropriate Categories and choose @@categories: To Confusion|To Confusion at .  "
 	"A newly created @Confusion will appear. After pushing the @Info button, the info window will "
 	"show you the fraction correct.")
-NORMAL (L"See also the @@Discriminant analysis@ tutorial for more information.")
-MAN_END
-
-MAN_BEGIN (L"Feedforward neural networks 4. Command overview", L"djmw", 20040426)
-INTRO (L"FFNet commands")
-ENTRY (L"Creation:")
-LIST_ITEM (L"\\bu @@Pattern & Categories: To FFNet...@")
-LIST_ITEM (L"\\bu @@Create FFNet...@")
-ENTRY (L"Learning:")
-LIST_ITEM (L"\\bu @@FFNet & Pattern & Categories: Learn...@")
-LIST_ITEM (L"\\bu @@FFNet & Pattern & Categories: Learn slow...@")
-ENTRY (L"Classification:")
-LIST_ITEM (L"\\bu @@FFNet & Pattern: To Categories...@")
-ENTRY (L"Drawing:")
-LIST_ITEM (L"\\bu @@FFNet: Draw topology@")
-LIST_ITEM (L"\\bu @@FFNet: Draw weights...@")
-LIST_ITEM (L"\\bu @@FFNet: Draw cost history...@")
-ENTRY (L"Queries")
-LIST_ITEM (L"\\bu @@FFNet & Pattern & Categories: Get total costs...@")
-LIST_ITEM (L"\\bu @@FFNet & Pattern & Categories: Get average costs...@")
-LIST_ITEM (L"\\bu @@FFNet & Pattern & Activation: Get total costs...@")
-LIST_ITEM (L"\\bu @@FFNet & Pattern & Activation: Get average costs...@")
-ENTRY (L"Analysis:")
-LIST_ITEM (L"\\bu ##FFNet & Pattern: To Activation...#")
-ENTRY (L"Modification:")
-LIST_ITEM (L"\\bu @@FFNet: Reset...@")
-LIST_ITEM (L"\\bu ##FFNet: Select biases...#")
-LIST_ITEM (L"\\bu ##FFNet: Select all weights#")
-MAN_END
-
-MAN_BEGIN (L"FFNet", L"djmw", 19961015)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"A #FFNet models a feedforward neural net. A feedforward "
+NORMAL (U"See also the @@Discriminant analysis@ tutorial for more information.")
+MAN_END
+
+MAN_BEGIN (U"Feedforward neural networks 4. Command overview", U"djmw", 20040426)
+INTRO (U"FFNet commands")
+ENTRY (U"Creation:")
+LIST_ITEM (U"\\bu @@Pattern & Categories: To FFNet...@")
+LIST_ITEM (U"\\bu @@Create FFNet...@")
+ENTRY (U"Learning:")
+LIST_ITEM (U"\\bu @@FFNet & Pattern & Categories: Learn...@")
+LIST_ITEM (U"\\bu @@FFNet & Pattern & Categories: Learn slow...@")
+ENTRY (U"Classification:")
+LIST_ITEM (U"\\bu @@FFNet & Pattern: To Categories...@")
+ENTRY (U"Drawing:")
+LIST_ITEM (U"\\bu @@FFNet: Draw topology@")
+LIST_ITEM (U"\\bu @@FFNet: Draw weights...@")
+LIST_ITEM (U"\\bu @@FFNet: Draw cost history...@")
+ENTRY (U"Queries")
+LIST_ITEM (U"\\bu @@FFNet & Pattern & Categories: Get total costs...@")
+LIST_ITEM (U"\\bu @@FFNet & Pattern & Categories: Get average costs...@")
+LIST_ITEM (U"\\bu @@FFNet & Pattern & Activation: Get total costs...@")
+LIST_ITEM (U"\\bu @@FFNet & Pattern & Activation: Get average costs...@")
+ENTRY (U"Analysis:")
+LIST_ITEM (U"\\bu ##FFNet & Pattern: To Activation...#")
+ENTRY (U"Modification:")
+LIST_ITEM (U"\\bu @@FFNet: Reset...@")
+LIST_ITEM (U"\\bu ##FFNet: Select biases...#")
+LIST_ITEM (U"\\bu ##FFNet: Select all weights#")
+MAN_END
+
+MAN_BEGIN (U"FFNet", U"djmw", 19961015)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"A #FFNet models a feedforward neural net. A feedforward "
 	"neural net can %learn associations between its %input and its %output. "
 	"The @@Feedforward neural networks@ tutorial gives you an introduction to feedforward neural nets.")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Draw topology", L"djmw", 19970218)
-INTRO (L"You can choose this command after selecting 1 or more @FFNet's.")
-ENTRY (L"Behaviour")
-NORMAL (L"Draws all units and all connections of a feedforward neural net.")
+MAN_BEGIN (U"FFNet: Draw topology", U"djmw", 19970218)
+INTRO (U"You can choose this command after selecting 1 or more @FFNet's.")
+ENTRY (U"Behaviour")
+NORMAL (U"Draws all units and all connections of a feedforward neural net.")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Draw weights...", L"djmw", 20040422)
-INTRO (L"Draws the weights in a layer of the selected @FFNet feedforward neural net.")
-ENTRY (L"Settings")
-TAG (L"##Layer number")
-DEFINITION (L"determines the layer.")
-TAG (L"##Garnish")
-DEFINITION (L"determines whether additional information is drawn.")
-ENTRY (L"Behaviour")
-NORMAL (L"The weights are arranged in a matrix. The columns of this matrix are indexed by the units in the layer, "
+MAN_BEGIN (U"FFNet: Draw weights...", U"djmw", 20040422)
+INTRO (U"Draws the weights in a layer of the selected @FFNet feedforward neural net.")
+ENTRY (U"Settings")
+TAG (U"##Layer number")
+DEFINITION (U"determines the layer.")
+TAG (U"##Garnish")
+DEFINITION (U"determines whether additional information is drawn.")
+ENTRY (U"Behaviour")
+NORMAL (U"The weights are arranged in a matrix. The columns of this matrix are indexed by the units in the layer, "
 	"while the rows are indexed by the units in the previous layer. There is one extra row for the biases."
 	"The values of the weights are shown as rectangles. The area of a rectangle is proportional "
 	"to the value.  Negative values are shown as filled black rectangles.")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Draw cost history...", L"djmw", 19970218)
-INTRO (L"You can choose this command after selecting 1 or more @FFNet's.")
-ENTRY (L"Settings")
-TAG (L"##Iteration range")
-DEFINITION (L"determines the horizontal range of the plot.")
-TAG (L"##Cost range")
-DEFINITION (L"determines the vertical range of the plot.")
-TAG (L"##Garnish")
-DEFINITION (L"determines whether a box and axis labels are drawn.")
-ENTRY (L"Behaviour")
-NORMAL (L"Draws the history of the cost versus iteration number during previous learning.")
+MAN_BEGIN (U"FFNet: Draw cost history...", U"djmw", 19970218)
+INTRO (U"You can choose this command after selecting 1 or more @FFNet's.")
+ENTRY (U"Settings")
+TAG (U"##Iteration range")
+DEFINITION (U"determines the horizontal range of the plot.")
+TAG (U"##Cost range")
+DEFINITION (U"determines the vertical range of the plot.")
+TAG (U"##Garnish")
+DEFINITION (U"determines whether a box and axis labels are drawn.")
+ENTRY (U"Behaviour")
+NORMAL (U"Draws the history of the cost versus iteration number during previous learning.")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Extract weights...", L"djmw", 20040422)
-INTRO (L"Extract all the weights, from all the units in the specified layer of the selected "
+MAN_BEGIN (U"FFNet: Extract weights...", U"djmw", 20040422)
+INTRO (U"Extract all the weights, from all the units in the specified layer of the selected "
 	"@FFNet, to a @TableOfReal.")
-ENTRY (L"Settings")
-TAG (L"##Layer number")
-DEFINITION (L"determines the layer.")
-ENTRY (L"Behaviour")
-NORMAL (L"The weights will be arranged in the TableOfReal as follows: ")
-NORMAL (L"The table columns will be indexed by the unit numbers in the selected layer, "
+ENTRY (U"Settings")
+TAG (U"##Layer number")
+DEFINITION (U"determines the layer.")
+ENTRY (U"Behaviour")
+NORMAL (U"The weights will be arranged in the TableOfReal as follows: ")
+NORMAL (U"The table columns will be indexed by the unit numbers in the selected layer, "
 	"while the rows will be indexed by the unit numbers from the previous layer. "
 	"There will be one extra row to accommodate the bias weights. "
 	"The rows and columns are labelled with layer number and unit number as \"L%i-%j\", where %i is the layer number and "
@@ -262,206 +262,206 @@ NORMAL (L"The table columns will be indexed by the unit numbers in the selected
 	"The last row is labelled as \"Bias\".")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Get number of outputs", L"djmw", 20040420)
-INTRO (L"Queries the selected @FFNet for the number of output units in the output layer. ")
+MAN_BEGIN (U"FFNet: Get number of outputs", U"djmw", 20040420)
+INTRO (U"Queries the selected @FFNet for the number of output units in the output layer. ")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Get number of inputs", L"djmw", 20040420)
-INTRO (L"Queries the selected @FFNet for the number of inputs. ")
-NORMAL (L"For a network with only one layer, the inputs are connected directly to the output layer. "
+MAN_BEGIN (U"FFNet: Get number of inputs", U"djmw", 20040420)
+INTRO (U"Queries the selected @FFNet for the number of inputs. ")
+NORMAL (U"For a network with only one layer, the inputs are connected directly to the output layer. "
 	"In a two-layer network the inputs are connected to a hidden layer.")
 MAN_END
 
 
-MAN_BEGIN (L"FFNet: Get number of hidden units...", L"djmw", 20040420)
-INTRO (L"Queries the selected @FFNet for the number of units in a hidden layer.")
-ENTRY (L"Settings")
-TAG (L"##Hidden layer number")
-DEFINITION (L"determines the layer that is queried.")
-ENTRY (L"Layer numbering")
-NORMAL (L"The number of hidden layers is always one less than the total number of layers in a FFNet. "
+MAN_BEGIN (U"FFNet: Get number of hidden units...", U"djmw", 20040420)
+INTRO (U"Queries the selected @FFNet for the number of units in a hidden layer.")
+ENTRY (U"Settings")
+TAG (U"##Hidden layer number")
+DEFINITION (U"determines the layer that is queried.")
+ENTRY (U"Layer numbering")
+NORMAL (U"The number of hidden layers is always one less than the total number of layers in a FFNet. "
 	"A network with the output units connected to the inputs therefore has only 1 layer, the output layer and "
 	"no hidden layers. ")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Get number of hidden weights...", L"djmw", 20040420)
-INTRO (L"Queries the selected @FFNet for the number of weights in a hidden layer.")
-ENTRY (L"Settings")
-TAG (L"##Hidden layer number")
-DEFINITION (L"determines the layer that is queried.")
+MAN_BEGIN (U"FFNet: Get number of hidden weights...", U"djmw", 20040420)
+INTRO (U"Queries the selected @FFNet for the number of weights in a hidden layer.")
+ENTRY (U"Settings")
+TAG (U"##Hidden layer number")
+DEFINITION (U"determines the layer that is queried.")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Reset...", L"djmw", 20040420)
-INTRO (L"You can choose this command after selecting 1 or more @FFNet's.")
-ENTRY (L"WARNING")
-NORMAL (L"This command destroys all previous learning.")
-ENTRY (L"Settings")
-TAG (L"##Range")
-DEFINITION (L"determines the upper limit of  the [-%range, +%range] interval from "
+MAN_BEGIN (U"FFNet: Reset...", U"djmw", 20040420)
+INTRO (U"You can choose this command after selecting 1 or more @FFNet's.")
+ENTRY (U"WARNING")
+NORMAL (U"This command destroys all previous learning.")
+ENTRY (U"Settings")
+TAG (U"##Range")
+DEFINITION (U"determines the upper limit of  the [-%range, +%range] interval from "
 	"which new weights will be randomly selected.")
-ENTRY (L"Behaviour")
-NORMAL (L"All (selected) weights are reset to random numbers uniformly drawn from the interval [-%range, +%range]. "
+ENTRY (U"Behaviour")
+NORMAL (U"All (selected) weights are reset to random numbers uniformly drawn from the interval [-%range, +%range]. "
 	"This command also clears the cost history.")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Select biases...", L"djmw", 20040422)
-INTRO (L"Selects only the biases in one particular layer as subject for modification during learning of the @FFNet.")
-ENTRY (L"Settings")
-TAG (L"##Layer number")
-DEFINITION (L"determines the layer whose biases will be modified.")
-ENTRY (L"Behaviour")
-NORMAL (L"This command induces very specific behaviour during a following learning phase. "
+MAN_BEGIN (U"FFNet: Select biases...", U"djmw", 20040422)
+INTRO (U"Selects only the biases in one particular layer as subject for modification during learning of the @FFNet.")
+ENTRY (U"Settings")
+TAG (U"##Layer number")
+DEFINITION (U"determines the layer whose biases will be modified.")
+ENTRY (U"Behaviour")
+NORMAL (U"This command induces very specific behaviour during a following learning phase. "
 	"Instead of all the weights, only the biases in the specified layer will be changed during learning and the "
 	"rest of the weights stay fixed. ")
 MAN_END
 
 #define FFNet_Create_COMMON_HELP_INOUT \
-ENTRY (L"Settings")\
-TAG (L"##Number of inputs")\
-DEFINITION (L"the dimension of the input of the neural net.")\
-TAG (L"##Number of outputs (\\>_ 1)#")\
-DEFINITION (L"the number of different categories that you want the net to learn.")
+ENTRY (U"Settings")\
+TAG (U"##Number of inputs")\
+DEFINITION (U"the dimension of the input of the neural net.")\
+TAG (U"##Number of outputs (\\>_ 1)#")\
+DEFINITION (U"the number of different categories that you want the net to learn.")
 
 #define FFNet_Create_COMMON_HELP_HIDDEN \
-TAG (L"##Number of units in hidden layer 1#, ##Number of units in hidden layer 2#") \
-DEFINITION (L"determine the number of units in the hidden layers. " \
+TAG (U"##Number of units in hidden layer 1#, ##Number of units in hidden layer 2#") \
+DEFINITION (U"determine the number of units in the hidden layers. " \
 	"If you want a neural net with no hidden layers, both numbers have to be 0. "\
 	"If you want a neural net with only 1 hidden layer then one of these numbers has to differ from 0. ")
 
-MAN_BEGIN (L"Create FFNet...", L"djmw", 20040420)
-INTRO (L"Create a new feedforward neural net of type @FFNet.")
+MAN_BEGIN (U"Create FFNet...", U"djmw", 20040420)
+INTRO (U"Create a new feedforward neural net of type @FFNet.")
 FFNet_Create_COMMON_HELP_INOUT
 FFNet_Create_COMMON_HELP_HIDDEN
 MAN_END
 
-MAN_BEGIN (L"Create FFNet (linear outputs)...", L"djmw", 20040422)
-INTRO (L"Create a @FFNet feedforward neural network whose output units are linear.")
+MAN_BEGIN (U"Create FFNet (linear outputs)...", U"djmw", 20040422)
+INTRO (U"Create a @FFNet feedforward neural network whose output units are linear.")
 FFNet_Create_COMMON_HELP_INOUT
 FFNet_Create_COMMON_HELP_HIDDEN
 MAN_END
 
-MAN_BEGIN (L"Create iris example...", L"djmw", 20040423)
-INTRO (L"A @FFNet feedforward neural net will be created together with two other objects: "
+MAN_BEGIN (U"Create iris example...", U"djmw", 20040423)
+INTRO (U"A @FFNet feedforward neural net will be created together with two other objects: "
 	"a @Pattern and a @Categories. The Pattern will contain the observations in the @@iris data set@, "
 	"and the Categories will contain the 3 different iris species categorized by numbers.")
-ENTRY (L"Settings")
+ENTRY (U"Settings")
 FFNet_Create_COMMON_HELP_HIDDEN
-NORMAL (L"For this simple data you can leave both hidden layers empty.")
+NORMAL (U"For this simple data you can leave both hidden layers empty.")
 
 MAN_END
 
-MAN_BEGIN (L"iris data set", L"djmw", 19961015)
-NORMAL (L"A data set with 150 random samples of flowers from the iris species %setosa, "
+MAN_BEGIN (U"iris data set", U"djmw", 19961015)
+NORMAL (U"A data set with 150 random samples of flowers from the iris species %setosa, "
 	"%versicolor, and %virginica collected by @@Anderson (1935)@. From each species there are 50 observations for "
 	"sepal length, sepal width, petal length, and petal width in cm. This dataset was "
 	"used by @@Fisher (1936)@ in his initiation of the linear-discriminant-function technique.")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Pattern", L"djmw", 19960918)
-INTRO (L"A @Pattern is a @Matrix in which each row forms one input pattern (vector) for the neural net.")
-NORMAL (L"The number of columns is the dimensionality of the input. "
+MAN_BEGIN (U"FFNet: Pattern", U"djmw", 19960918)
+INTRO (U"A @Pattern is a @Matrix in which each row forms one input pattern (vector) for the neural net.")
+NORMAL (U"The number of columns is the dimensionality of the input. "
 "The number of rows is the number of patterns.")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Categories", L"djmw", 19960918)
-INTRO (L"The categories for training a neural net with a @Pattern. ")
-ENTRY (L"Preconditions")
-NORMAL (L"The number of categories in a @Categories must equal the number of rows in #Pattern.")
+MAN_BEGIN (U"FFNet: Categories", U"djmw", 19960918)
+INTRO (U"The categories for training a neural net with a @Pattern. ")
+ENTRY (U"Preconditions")
+NORMAL (U"The number of categories in a @Categories must equal the number of rows in #Pattern.")
 MAN_END
 
-MAN_BEGIN (L"Activation", L"djmw", 20041118)
-INTRO (L"A @Matrix whose elements must be >= 0 and <= 1. "
+MAN_BEGIN (U"Activation", U"djmw", 20041118)
+INTRO (U"A @Matrix whose elements must be >= 0 and <= 1. "
 "Classification: the response of a particular layer in a neural net to a @Pattern."
 "Learning: the desired response of the output layer in a neural net to a @Pattern.")
 MAN_END
 
-MAN_BEGIN (L"FFNet: Principal components", L"djmw", 19960918)
-INTRO (L"When you select @FFNet and @Eigen the decision planes of layer 1 are drawn in the PC-plane.\n")
+MAN_BEGIN (U"FFNet: Principal components", U"djmw", 19960918)
+INTRO (U"When you select @FFNet and @Eigen the decision planes of layer 1 are drawn in the PC-plane.\n")
 MAN_END
 
-MAN_BEGIN (L"FFNet & Pattern: To Categories...", L"djmw", 19960918)
-INTRO (L"The @FFNet is used as a classifier. Each pattern from the @Pattern will be "
+MAN_BEGIN (U"FFNet & Pattern: To Categories...", U"djmw", 19960918)
+INTRO (U"The @FFNet is used as a classifier. Each pattern from the @Pattern will be "
 	"classified into one of the FFNet's categories.")
 MAN_END
 
-MAN_BEGIN (L"Pattern & Categories: To FFNet...", L"djmw", 20040422)
-INTRO (L"Create a new @FFNet feedforward neural network. "
+MAN_BEGIN (U"Pattern & Categories: To FFNet...", U"djmw", 20040422)
+INTRO (U"Create a new @FFNet feedforward neural network. "
 	"The number of inputs of the newly created FFNet will be equal to the number of "
 	"columns in the @Pattern and the number of outputs "
 	"will be equal to the number of unique categories in the @Categories.")
-ENTRY (L"Settings")
+ENTRY (U"Settings")
 FFNet_Create_COMMON_HELP_HIDDEN
 MAN_END
 
-MAN_BEGIN (L"FFNet & Pattern & Categories: Learn slow...", L"djmw", 19960918)
-INTRO (L"To learn an association you have to select a @FFNet, a @Pattern and a @Categories object.")
-ENTRY (L"Preconditions")
-LIST_ITEM (L"The number of columns in a #Pattern must equal the number of input units of #FFNet.")
-ENTRY (L" Algorithm")
-NORMAL (L"Steepest descent")
-ENTRY (L"Preconditions")
-LIST_ITEM (L"The number of rows in a #Pattern must equal the number of categories in a #Categories.")
-LIST_ITEM (L"The number of unique categories in a #Categories must equal the number of output units in #FFNet.")
-MAN_END
-
-MAN_BEGIN (L"FFNet & Pattern & Categories: Learn...", L"djmw", 20040511)
-INTRO (L"You can choose this command after selecting one @Pattern, one @Categories and one @FFNet.")
-ENTRY (L"Settings")
-TAG (L"##Maximum number of epochs")
-DEFINITION (L"the maximum number of times that the complete #Pattern dataset will be presented to the neural net.")
-TAG (L"##Tolerance of minimizer")
-DEFINITION (L"when the difference in costs between two successive learning cycles is "
+MAN_BEGIN (U"FFNet & Pattern & Categories: Learn slow...", U"djmw", 19960918)
+INTRO (U"To learn an association you have to select a @FFNet, a @Pattern and a @Categories object.")
+ENTRY (U"Preconditions")
+LIST_ITEM (U"The number of columns in a #Pattern must equal the number of input units of #FFNet.")
+ENTRY (U" Algorithm")
+NORMAL (U"Steepest descent")
+ENTRY (U"Preconditions")
+LIST_ITEM (U"The number of rows in a #Pattern must equal the number of categories in a #Categories.")
+LIST_ITEM (U"The number of unique categories in a #Categories must equal the number of output units in #FFNet.")
+MAN_END
+
+MAN_BEGIN (U"FFNet & Pattern & Categories: Learn...", U"djmw", 20040511)
+INTRO (U"You can choose this command after selecting one @Pattern, one @Categories and one @FFNet.")
+ENTRY (U"Settings")
+TAG (U"##Maximum number of epochs")
+DEFINITION (U"the maximum number of times that the complete #Pattern dataset will be presented to the neural net.")
+TAG (U"##Tolerance of minimizer")
+DEFINITION (U"when the difference in costs between two successive learning cycles is "
 "smaller than this value, the minimization process will be stopped.")
-NORMAL (L"##Cost function")
-LIST_ITEM (L"Minimum-squared-error:")
-LIST_ITEM (L"  %costs = \\su__%allPatterns_ \\su__%allOutputs_ (%o__%k_ - d__%k_)^2, where")
-LIST_ITEM (L"      %o__%k_ : actual output of unit %k")
-LIST_ITEM (L"      %d__%k_ : desired output of unit %k")
-LIST_ITEM (L"Minimum-cross-entropy:")
-LIST_ITEM (L"  %costs = - \\su__%allPatterns_ \\su__%allOutputs_ (%d__%k_ \\.c ln %o__%k_ + (1-%d__%k_) \\.c ln (1-%o__%k_))")
-ENTRY (L"Algorithm")
-NORMAL (L"The minimization procedure is a variant of conjugate gradient minimization, "
+NORMAL (U"##Cost function")
+LIST_ITEM (U"Minimum-squared-error:")
+LIST_ITEM (U"  %costs = \\su__%allPatterns_ \\su__%allOutputs_ (%o__%k_ - d__%k_)^2, where")
+LIST_ITEM (U"      %o__%k_ : actual output of unit %k")
+LIST_ITEM (U"      %d__%k_ : desired output of unit %k")
+LIST_ITEM (U"Minimum-cross-entropy:")
+LIST_ITEM (U"  %costs = - \\su__%allPatterns_ \\su__%allOutputs_ (%d__%k_ \\.c ln %o__%k_ + (1-%d__%k_) \\.c ln (1-%o__%k_))")
+ENTRY (U"Algorithm")
+NORMAL (U"The minimization procedure is a variant of conjugate gradient minimization, "
 	"see for example @@Press et al. (1992)@, chapter 10, or @@Nocedal & Wright (1999)@, chapter 5.")
 MAN_END
 
-MAN_BEGIN (L"FFNet & Pattern & Categories: Get total costs...", L"djmw", 20041118)
-INTRO (L"Query the selected @FFNet, @Pattern and @Categories for the total costs.")
-ENTRY (L"Algorithm")
-NORMAL (L"All patterns are propagated and the total costs are calculated as is shown in @@FFNet & Pattern & Categories: Learn... at . ")
+MAN_BEGIN (U"FFNet & Pattern & Categories: Get total costs...", U"djmw", 20041118)
+INTRO (U"Query the selected @FFNet, @Pattern and @Categories for the total costs.")
+ENTRY (U"Algorithm")
+NORMAL (U"All patterns are propagated and the total costs are calculated as is shown in @@FFNet & Pattern & Categories: Learn... at . ")
 MAN_END
 
-MAN_BEGIN (L"FFNet & Pattern & Activation: Get total costs...", L"djmw", 20041118)
-INTRO (L"Query the selected @FFNet, @Pattern and @Activation for the total costs.")
-ENTRY (L"Algorithm")
-NORMAL (L"All patterns are propagated and the total costs are calculated as is shown in @@FFNet & Pattern & Categories: Learn... at . ")
+MAN_BEGIN (U"FFNet & Pattern & Activation: Get total costs...", U"djmw", 20041118)
+INTRO (U"Query the selected @FFNet, @Pattern and @Activation for the total costs.")
+ENTRY (U"Algorithm")
+NORMAL (U"All patterns are propagated and the total costs are calculated as is shown in @@FFNet & Pattern & Categories: Learn... at . ")
 MAN_END
 
-MAN_BEGIN (L"FFNet & Pattern & Categories: Get average costs...", L"djmw", 20041118)
-INTRO (L"Query the selected @FFNet, @Pattern and @Categories for the average costs.")
-ENTRY (L"Algorithm")
-NORMAL (L"All patterns are propagated and the total costs are calculated as is shown in @@FFNet & Pattern & Categories: Learn... at . "
+MAN_BEGIN (U"FFNet & Pattern & Categories: Get average costs...", U"djmw", 20041118)
+INTRO (U"Query the selected @FFNet, @Pattern and @Categories for the average costs.")
+ENTRY (U"Algorithm")
+NORMAL (U"All patterns are propagated and the total costs are calculated as is shown in @@FFNet & Pattern & Categories: Learn... at . "
 	"These total costs are then divided by the number of patterns.")
 MAN_END
 
-MAN_BEGIN (L"FFNet & Pattern & Activation: Get average costs...", L"djmw", 20041118)
-INTRO (L"Query the selected @FFNet, @Pattern and @Activation for the average costs.")
-ENTRY (L"Algorithm")
-NORMAL (L"All patterns are propagated and the total costs are calculated as is shown in @@FFNet & Pattern & Categories: Learn... at . "
+MAN_BEGIN (U"FFNet & Pattern & Activation: Get average costs...", U"djmw", 20041118)
+INTRO (U"Query the selected @FFNet, @Pattern and @Activation for the average costs.")
+ENTRY (U"Algorithm")
+NORMAL (U"All patterns are propagated and the total costs are calculated as is shown in @@FFNet & Pattern & Categories: Learn... at . "
 	"These total costs are then divided by the number of patterns.")
 MAN_END
 
-MAN_BEGIN (L"Anderson (1935)", L"djmw", 20040423)
-NORMAL (L"E. Anderson (1935): \"The irises of the Gasp\\e' peninsula.\" "
+MAN_BEGIN (U"Anderson (1935)", U"djmw", 20040423)
+NORMAL (U"E. Anderson (1935): \"The irises of the Gasp\\e' peninsula.\" "
 	"%%Bulletin of the American Iris Society% #59: 2\\--5.")
 MAN_END
 
-MAN_BEGIN (L"Fisher (1936)", L"djmw", 19980114)
-NORMAL (L"R.A. Fisher (1936): \"The use of multiple measurements in taxonomic "
+MAN_BEGIN (U"Fisher (1936)", U"djmw", 19980114)
+NORMAL (U"R.A. Fisher (1936): \"The use of multiple measurements in taxonomic "
 	"problems.\" %%Annals of Eugenics% #7: 179\\--188.")
 MAN_END
 
-MAN_BEGIN (L"Nocedal & Wright (1999)", L"djmw", 20040511)
-NORMAL (L"J. Nocedal & S.J. Wright (1999): %%Numerical optimization.% Springer.")
+MAN_BEGIN (U"Nocedal & Wright (1999)", U"djmw", 20040511)
+NORMAL (U"J. Nocedal & S.J. Wright (1999): %%Numerical optimization.% Springer.")
 MAN_END
 }
 
diff --git a/FFNet/praat_FFNet_init.cpp b/FFNet/praat_FFNet_init.cpp
index 1642d21..fe19a94 100644
--- a/FFNet/praat_FFNet_init.cpp
+++ b/FFNet/praat_FFNet_init.cpp
@@ -25,7 +25,7 @@
  djmw 20041123 Latest modification
  djmw 20061218 Changed to Melder_information<x> format.
  djmw 20080902 Melder_error<1...>
- djmw 20071011 REQUIRE requires L"".
+ djmw 20071011 REQUIRE requires U"".
  djmw 20071024 Use MelderString_append in FFNet_createNameFromTopology
  djmw 20100511 FFNet query outputs
 */
@@ -50,280 +50,279 @@
 #undef iam
 #define iam iam_LOOP
 
-static wchar_t const *QUERY_BUTTON   = L"Query -";
-static wchar_t const *DRAW_BUTTON     = L"Draw -";
-static wchar_t const *MODIFY_BUTTON  = L"Modify -";
-static wchar_t const *EXTRACT_BUTTON = L"Extract -";
+static char32 const *QUERY_BUTTON   = U"Query -";
+static char32 const *DRAW_BUTTON     = U"Draw -";
+static char32 const *MODIFY_BUTTON  = U"Modify -";
+static char32 const *EXTRACT_BUTTON = U"Extract -";
 
 /**************** New FFNet ***************************/
 
-static void FFNet_create_addCommonFields_inputOutput (void *dia) {
-	NATURAL (L"Number of inputs", L"4")
-	NATURAL (L"Number of outputs", L"3")
+static void FFNet_create_addCommonFields_inputOutput (UiForm dia) {
+	NATURAL (U"Number of inputs", U"4")
+	NATURAL (U"Number of outputs", U"3")
 }
 
-static void FFNet_create_checkCommonFields_inputOutput (void *dia, long *numberOfInputs, long *numberOfOutputs) {
-	*numberOfInputs = GET_INTEGER (L"Number of inputs");
-	*numberOfOutputs = GET_INTEGER (L"Number of outputs");
+static void FFNet_create_checkCommonFields_inputOutput (UiForm dia, long *numberOfInputs, long *numberOfOutputs) {
+	*numberOfInputs = GET_INTEGER (U"Number of inputs");
+	*numberOfOutputs = GET_INTEGER (U"Number of outputs");
 }
 
-static void FFNet_create_addCommonFields_hidden (void *dia) {
-	INTEGER (L"Number of units in hidden layer 1", L"0")
-	INTEGER (L"Number of units in hidden layer 2", L"0")
+static void FFNet_create_addCommonFields_hidden (UiForm dia) {
+	INTEGER (U"Number of units in hidden layer 1", U"0")
+	INTEGER (U"Number of units in hidden layer 2", U"0")
 }
 
-static void FFNet_create_checkCommonFields_hidden (void *dia, 	long *numberOfHidden1, long *numberOfHidden2) {
-	*numberOfHidden1 = GET_INTEGER (L"Number of units in hidden layer 1");
-	*numberOfHidden2 = GET_INTEGER (L"Number of units in hidden layer 2");
+static void FFNet_create_checkCommonFields_hidden (UiForm dia, 	long *numberOfHidden1, long *numberOfHidden2) {
+	*numberOfHidden1 = GET_INTEGER (U"Number of units in hidden layer 1");
+	*numberOfHidden2 = GET_INTEGER (U"Number of units in hidden layer 2");
 	if (*numberOfHidden1 < 0 || *numberOfHidden2 < 0) {
-		Melder_throw ("The number of units in a hidden layer must be geater equal zero");
+		Melder_throw (U"The number of units in a hidden layer must be geater equal zero");
 	}
 }
 
-static void FFNet_create_addCommonFields (void *dia) {
+static void FFNet_create_addCommonFields (UiForm dia) {
 	FFNet_create_addCommonFields_inputOutput (dia);
 	FFNet_create_addCommonFields_hidden (dia);
 }
 
-static void FFNet_create_checkCommonFields (void *dia, long *numberOfInputs, long *numberOfOutputs,
+static void FFNet_create_checkCommonFields (UiForm dia, long *numberOfInputs, long *numberOfOutputs,
         long *numberOfHidden1, long *numberOfHidden2) {
 	FFNet_create_checkCommonFields_inputOutput (dia, numberOfInputs, numberOfOutputs);
 	FFNet_create_checkCommonFields_hidden (dia, numberOfHidden1, numberOfHidden2);
 }
 
-FORM (FFNet_create, L"Create FFNet", L"Create FFNet...")
-	WORD (L"Name", L"4-3")
+FORM (FFNet_create, U"Create FFNet", U"Create FFNet...")
+	WORD (U"Name", U"4-3")
 	FFNet_create_addCommonFields (dia);
 	OK
 DO
 	long numberOfInputs, numberOfOutputs, numberOfHidden1, numberOfHidden2;
 	FFNet_create_checkCommonFields (dia, &numberOfInputs, &numberOfOutputs, &numberOfHidden1, &numberOfHidden2);
 	autoFFNet thee = FFNet_create (numberOfInputs, numberOfHidden1, numberOfHidden2, numberOfOutputs, 0);
-	praat_new (thee.transfer(), GET_STRING (L"Name"));
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
 END
 
-FORM (FFNet_create_linearOutputs, L"Create FFNet", L"Create FFNet (linear outputs)...")
-	WORD (L"Name", L"4-3L")
+FORM (FFNet_create_linearOutputs, U"Create FFNet", U"Create FFNet (linear outputs)...")
+	WORD (U"Name", U"4-3L")
 	FFNet_create_addCommonFields (dia);
 	OK
 DO
 	long numberOfInputs, numberOfOutputs, numberOfHidden1, numberOfHidden2;
 	FFNet_create_checkCommonFields (dia, &numberOfInputs, &numberOfOutputs, &numberOfHidden1, &numberOfHidden2);
 	autoFFNet thee = FFNet_create (numberOfInputs, numberOfHidden1, numberOfHidden2, numberOfOutputs, 1);
-	praat_new (thee.transfer(), GET_STRING (L"Name"));
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
 END
 
-FORM (FFNet_createIrisExample, L"Create iris example", L"Create iris example...")
-	LABEL (L"", L"For the feedforward neural net we need to know the:")
+FORM (FFNet_createIrisExample, U"Create iris example", U"Create iris example...")
+	LABEL (U"", U"For the feedforward neural net we need to know the:")
 	FFNet_create_addCommonFields_hidden (dia);
 	OK
 DO
 	long numberOfHidden1, numberOfHidden2;
 	FFNet_create_checkCommonFields_hidden (dia, &numberOfHidden1, &numberOfHidden2);
-	praat_new (FFNet_createIrisExample (numberOfHidden1, numberOfHidden2), 0);
+	autoCollection thee = FFNet_createIrisExample (numberOfHidden1, numberOfHidden2);
+	praat_new (thee.transfer());
 END
 
 DIRECT (FFNet_getNumberOfInputs)
 	LOOP {
 		iam (FFNet);
-		Melder_information (Melder_integer (my nUnitsInLayer[0]), L" units");
+		Melder_information (my nUnitsInLayer[0], U" units");
 	}
 END
 
 DIRECT (FFNet_getNumberOfOutputs)
 	LOOP {
 		iam (FFNet);
-		Melder_information (Melder_integer (my nUnitsInLayer[my nLayers]), L" units");
+		Melder_information (my nUnitsInLayer[my nLayers], U" units");
 	}
 END
 
-FORM (FFNet_getNumberOfHiddenUnits, L"FFNet: Get number of hidden units", L"FFNet: Get number of hidden units...")
-	NATURAL (L"Hidden layer number", L"1")
+FORM (FFNet_getNumberOfHiddenUnits, U"FFNet: Get number of hidden units", U"FFNet: Get number of hidden units...")
+	NATURAL (U"Hidden layer number", U"1")
 	OK
 DO
 	LOOP {
 		iam (FFNet);
-		long layerNumber = GET_INTEGER (L"Hidden layer number");
+		long layerNumber = GET_INTEGER (U"Hidden layer number");
 		long numberOfUnits = 0;
 		if (layerNumber > 0 && layerNumber <= my nLayers - 1) {
 			numberOfUnits = my nUnitsInLayer[layerNumber];
 		}
-		Melder_information (Melder_integer (numberOfUnits), L" units");
+		Melder_information (numberOfUnits, U" units");
 	}
 END
 
-FORM (FFNet_getCategoryOfOutputUnit, L"FFNet: Get category of output unit", L"")
-	NATURAL (L"Output unit", L"1")
+FORM (FFNet_getCategoryOfOutputUnit, U"FFNet: Get category of output unit", U"")
+	NATURAL (U"Output unit", U"1")
 	OK
 	DO
 	LOOP {
 		iam (FFNet);
-		Categories c = (Categories) my outputCategories;
-		long unit = GET_INTEGER (L"Output unit");
-		if (unit > c -> size) {
-			Melder_throw (L"Output unit cannot be larger than ", c -> size, L".");
+		long unit = GET_INTEGER (U"Output unit");
+		if (unit > my outputCategories -> size) {
+			Melder_throw (U"Output unit cannot be larger than ", my outputCategories -> size, U".");
 		}
-		SimpleString ss = (SimpleString) c -> item[unit];
+		SimpleString ss = (SimpleString) my outputCategories -> item[unit];
 		Melder_information (ss -> string);
 	}
 END
 
-FORM (FFNet_getOutputUnitOfCategory, L"FFNet: Get output unit of category", L"")
-	SENTENCE (L"Category", L"u")
+FORM (FFNet_getOutputUnitOfCategory, U"FFNet: Get output unit of category", U"")
+	SENTENCE (U"Category", U"u")
 	OK
 DO
 	LOOP {
 		iam (FFNet);
-		Categories c = my outputCategories;
-		wchar_t *category = GET_STRING (L"Category");
+		char32 *category = GET_STRING (U"Category");
 		long index = 0;
-		for (long i = 1; i <= c -> size; i++) {
-			SimpleString s = (SimpleString) c -> item[i];
-			if (Melder_wcsequ (s -> string, category)) {
+		for (long i = 1; i <= my outputCategories -> size; i++) {
+			SimpleString s = (SimpleString) my outputCategories -> item[i];
+			if (Melder_equ (s -> string, category)) {
 				index = i;
 				break;
 			}
 		}
-		Melder_information (Melder_integer (index));
+		Melder_information (index);
 	}
 END
 
-FORM (FFNet_getBias, L"FFNet: Get bias", 0)
-	NATURAL (L"Layer", L"1")
-	NATURAL (L"Unit", L"1")
+FORM (FFNet_getBias, U"FFNet: Get bias", 0)
+	NATURAL (U"Layer", U"1")
+	NATURAL (U"Unit", U"1")
 	OK
 DO
 	LOOP {
 		iam (FFNet);
-		long layer = GET_INTEGER (L"Layer");
-		long unit = GET_INTEGER (L"Unit");
+		long layer = GET_INTEGER (U"Layer");
+		long unit = GET_INTEGER (U"Unit");
 		double bias = FFNet_getBias (me, layer, unit);
-		Melder_information (Melder_double (bias), L"(bias for unit ", Melder_integer (unit), L"in layer ",
-		Melder_integer (layer), L").");
+		Melder_information (bias, U"(bias for unit ", unit, U"in layer ", layer, U").");
 	}
 END
 
-FORM (FFNet_setBias, L"FFNet: Set bias", 0)
-	NATURAL (L"Layer", L"1")
-	NATURAL (L"Unit", L"1")
-	REAL (L"Value", L"0.0")
+FORM (FFNet_setBias, U"FFNet: Set bias", 0)
+	NATURAL (U"Layer", U"1")
+	NATURAL (U"Unit", U"1")
+	REAL (U"Value", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (FFNet);
-		FFNet_setBias (me, GET_INTEGER (L"Layer"), GET_INTEGER (L"Unit"), GET_REAL (L"Value"));
+		FFNet_setBias (me, GET_INTEGER (U"Layer"), GET_INTEGER (U"Unit"), GET_REAL (U"Value"));
 	}
 END
 
-FORM (FFNet_getWeight, L"FFNet: Get weight", 0)
-	NATURAL (L"Layer", L"1")
-	NATURAL (L"Unit", L"1")
-	NATURAL (L"Unit from", L"1")
+FORM (FFNet_getWeight, U"FFNet: Get weight", 0)
+	NATURAL (U"Layer", U"1")
+	NATURAL (U"Unit", U"1")
+	NATURAL (U"Unit from", U"1")
 	OK
 DO
 	LOOP {
 		iam (FFNet);
-		long layer = GET_INTEGER (L"Layer");
-		long unit = GET_INTEGER (L"Unit");
-		long unitf = GET_INTEGER (L"Unit from");
+		long layer = GET_INTEGER (U"Layer");
+		long unit = GET_INTEGER (U"Unit");
+		long unitf = GET_INTEGER (U"Unit from");
 		double w = FFNet_getWeight (me, layer, unit, unitf);
-		Melder_information (Melder_double (w), L"(weight between unit ", Melder_integer (unit),
-			L" in layer ", Melder_integer (layer), L", and unit ", Melder_integer (unitf), L"in layer ",
-			Melder_integer (layer - 1));
+		Melder_information (w, U"(weight between unit ", unit,
+			U" in layer ", layer, U", and unit ", unitf, U"in layer ",
+			layer - 1);
 	}
 END
 
-FORM (FFNet_setWeight, L"FFNet: Set weight", 0)
-	NATURAL (L"Layer", L"1")
-	NATURAL (L"Unit", L"1")
-	NATURAL (L"Unit (from)", L"1")
-	REAL (L"Value", L"0.0")
+FORM (FFNet_setWeight, U"FFNet: Set weight", 0)
+	NATURAL (U"Layer", U"1")
+	NATURAL (U"Unit", U"1")
+	NATURAL (U"Unit (from)", U"1")
+	REAL (U"Value", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (FFNet);
-		long layer = GET_INTEGER (L"Layer");
-		long unit = GET_INTEGER (L"Unit");
-		long unitf = GET_INTEGER (L"Unit (from)");
-		FFNet_setWeight (me, layer, unit, unitf, GET_REAL (L"Value"));
+		long layer = GET_INTEGER (U"Layer");
+		long unit = GET_INTEGER (U"Unit");
+		long unitf = GET_INTEGER (U"Unit (from)");
+		FFNet_setWeight (me, layer, unit, unitf, GET_REAL (U"Value"));
 	}
 END
 
-FORM (FFNet_getNumberOfHiddenWeights, L"FFNet: Get number of hidden weights", L"FFNet: Get number of hidden weights...")
-	NATURAL (L"Hidden layer number", L"1")
+FORM (FFNet_getNumberOfHiddenWeights, U"FFNet: Get number of hidden weights", U"FFNet: Get number of hidden weights...")
+	NATURAL (U"Hidden layer number", U"1")
 	OK
 DO
 	LOOP {
 		iam (FFNet);
-		long layerNumber = GET_INTEGER (L"Hidden layer number");
+		long layerNumber = GET_INTEGER (U"Hidden layer number");
 		long numberOfWeights = 0;
 		if (layerNumber > 0 && layerNumber <= my nLayers - 1) {
 			numberOfWeights = my nUnitsInLayer[layerNumber] * (my nUnitsInLayer[layerNumber - 1] + 1);
 		}
-		Melder_information (Melder_integer (numberOfWeights), L" weights (including biases)");
+		Melder_information (numberOfWeights, U" weights (including biases)");
 	}
 END
 
 DIRECT (FFNet_getNumberOfOutputWeights)
 	LOOP {
 		iam (FFNet);
-		Melder_information (Melder_integer (my nUnitsInLayer[my nLayers] * (my nUnitsInLayer[my nLayers - 1] + 1)),
-		L" weights");
+		Melder_information (my nUnitsInLayer[my nLayers] * (my nUnitsInLayer[my nLayers - 1] + 1),
+		U" weights");
 	}
 END
 
 /**************** New Pattern ***************************/
 
-FORM (Pattern_create, L"Create Pattern", 0)
-	WORD (L"Name", L"1x1")
-	NATURAL (L"Dimension of a pattern", L"1")
-	NATURAL (L"Number of patterns", L"1")
+FORM (Pattern_create, U"Create Pattern", 0)
+	WORD (U"Name", U"1x1")
+	NATURAL (U"Dimension of a pattern", U"1")
+	NATURAL (U"Number of patterns", U"1")
 	OK
 DO
-	praat_new (Pattern_create (GET_INTEGER (L"Number of patterns"),
-		GET_INTEGER (L"Dimension of a pattern")), GET_STRING (L"Name"));
+	praat_new (Pattern_create (GET_INTEGER (U"Number of patterns"),
+		GET_INTEGER (U"Dimension of a pattern")), GET_STRING (U"Name"));
 END
 
 /**************** New Categories ***************************/
 
-FORM (Categories_create, L"Create Categories", L"")
-	WORD (L"Name", L"empty")
+FORM (Categories_create, U"Create Categories", U"")
+	WORD (U"Name", U"empty")
 	OK
 DO
-	praat_new (Categories_create (), GET_STRING (L"Name"));
+	autoCategories thee = Categories_create ();
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
 END
 
-DIRECT (FFNet_help) Melder_help (L"Feedforward neural networks"); END
+DIRECT (FFNet_help) Melder_help (U"Feedforward neural networks"); END
 
 DIRECT (FFNet_getMinimum)
 	LOOP {
 		iam (FFNet);
-		Melder_information (Melder_double (FFNet_getMinimum (me)));
+		Melder_information (FFNet_getMinimum (me));
 	}
 END
 
-FORM (FFNet_reset, L"FFNet: Reset", L"FFNet: Reset...")
-	LABEL (L"", L"Warning: this command destroys all previous learning.")
-	LABEL (L"", L"New weights will be randomly chosen from the interval [-range, +range].")
-	POSITIVE (L"Range", L"0.1")
+FORM (FFNet_reset, U"FFNet: Reset", U"FFNet: Reset...")
+	LABEL (U"", U"Warning: this command destroys all previous learning.")
+	LABEL (U"", U"New weights will be randomly chosen from the interval [-range, +range].")
+	POSITIVE (U"Range", U"0.1")
 	OK
 DO
 	LOOP {
 		iam (FFNet);
-		FFNet_reset (me, GET_REAL (L"Range"));
+		FFNet_reset (me, GET_REAL (U"Range"));
 		praat_dataChanged (OBJECT);
 	}
 END
 
-FORM (FFNet_selectBiasesInLayer, L"FFNet: Select biases", L"FFNet: Select biases...")
-	LABEL (L"", L"WARNING: This command induces very specific behaviour ")
-	LABEL (L"", L"during a following learning phase.")
-	NATURAL (L"Layer number", L"1")
+FORM (FFNet_selectBiasesInLayer, U"FFNet: Select biases", U"FFNet: Select biases...")
+	LABEL (U"", U"WARNING: This command induces very specific behaviour ")
+	LABEL (U"", U"during a following learning phase.")
+	NATURAL (U"Layer number", U"1")
 	OK
 	DO
 	LOOP {
 		iam (FFNet);
-		FFNet_selectBiasesInLayer (me, GET_INTEGER (L"Layer number"));
+		FFNet_selectBiasesInLayer (me, GET_INTEGER (U"Layer number"));
 		praat_dataChanged (OBJECT);
 	}
 END
@@ -344,128 +343,131 @@ DIRECT (FFNet_drawTopology)
 	}
 END
 
-FORM (FFNet_drawWeightsToLayer, L"FFNet: Draw weights to layer", 0)
-	LABEL (L"", L"Warning: Disapproved. Use \"Draw weights..\" instead.")
-	NATURAL (L"Layer number", L"1")
-	RADIO (L"Scale", 1)
-	RADIOBUTTON (L"by maximum of all weights to layer")
-	RADIOBUTTON (L"by maximum weight from 'from-unit'")
-	RADIOBUTTON (L"by maximum weight to 'to-unit'")
-	BOOLEAN (L"Garnish", 1)
+FORM (FFNet_drawWeightsToLayer, U"FFNet: Draw weights to layer", 0)
+	LABEL (U"", U"Warning: Disapproved. Use \"Draw weights..\" instead.")
+	NATURAL (U"Layer number", U"1")
+	RADIO (U"Scale", 1)
+	RADIOBUTTON (U"by maximum of all weights to layer")
+	RADIOBUTTON (U"by maximum weight from 'from-unit'")
+	RADIOBUTTON (U"by maximum weight to 'to-unit'")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FFNet);
-		FFNet_drawWeightsToLayer (me, GRAPHICS, GET_INTEGER (L"Layer number"),
-			GET_INTEGER (L"Scale"), GET_INTEGER (L"Garnish"));
+		FFNet_drawWeightsToLayer (me, GRAPHICS, GET_INTEGER (U"Layer number"),
+			GET_INTEGER (U"Scale"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FFNet_drawWeights, L"FFNet: Draw weights", L"FFNet: Draw weights...")
-	NATURAL (L"Layer number", L"1")
-	BOOLEAN (L"Garnish", 1)
+FORM (FFNet_drawWeights, U"FFNet: Draw weights", U"FFNet: Draw weights...")
+	NATURAL (U"Layer number", U"1")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FFNet);
-		FFNet_drawWeights (me, GRAPHICS, GET_INTEGER (L"Layer number"), GET_INTEGER (L"Garnish"));
+		FFNet_drawWeights (me, GRAPHICS, GET_INTEGER (U"Layer number"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FFNet_drawCostHistory, L"FFNet: Draw cost history", L"FFNet: Draw cost history...")
-	INTEGER (L"left Iteration_range", L"0")
-	INTEGER (L"right Iteration_range", L"0")
-	REAL (L"left Cost_range", L"0.0")
-	REAL (L"right Cost_range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (FFNet_drawCostHistory, U"FFNet: Draw cost history", U"FFNet: Draw cost history...")
+	INTEGER (U"left Iteration_range", U"0")
+	INTEGER (U"right Iteration_range", U"0")
+	REAL (U"left Cost_range", U"0.0")
+	REAL (U"right Cost_range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FFNet);
-		FFNet_drawCostHistory (me, GRAPHICS, GET_INTEGER (L"left Iteration_range"),
-			GET_INTEGER (L"right Iteration_range"), GET_REAL (L"left Cost_range"), GET_REAL (L"right Cost_range"),
-			GET_INTEGER (L"Garnish"));
+		FFNet_drawCostHistory (me, GRAPHICS, GET_INTEGER (U"left Iteration_range"),
+			GET_INTEGER (U"right Iteration_range"), GET_REAL (U"left Cost_range"), GET_REAL (U"right Cost_range"),
+			GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FFNet_extractWeights, L"FFNet: Extract weights", L"FFNet: Extract weights...")
-	NATURAL (L"Layer number", L"1")
+FORM (FFNet_extractWeights, U"FFNet: Extract weights", U"FFNet: Extract weights...")
+	NATURAL (U"Layer number", U"1")
 	OK
 	DO
 	LOOP {
 		iam (FFNet);
-		praat_new (FFNet_extractWeights (me, GET_INTEGER (L"Layer number")), 0);
+		autoTableOfReal thee = FFNet_extractWeights (me, GET_INTEGER (U"Layer number"));
+		praat_new (thee.transfer());
 	}
 END
 
-FORM (FFNet_weightsToMatrix, L"FFNet: Weights to Matrix ", 0)
-	LABEL (L"", L"Warning: Use \"Extract weights..\" instead.")
-	NATURAL (L"Layer number", L"1")
+FORM (FFNet_weightsToMatrix, U"FFNet: Weights to Matrix ", 0)
+	LABEL (U"", U"Warning: Use \"Extract weights..\" instead.")
+	NATURAL (U"Layer number", U"1")
 	OK
 DO
 	LOOP {
 		iam (FFNet);
-		praat_new (FFNet_weightsToMatrix (me, GET_INTEGER (L"Layer number"), 0), my name);
+		autoMatrix thee = FFNet_weightsToMatrix (me, GET_INTEGER (U"Layer number"), 0);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 /******************* FFNet && Activation *************************************/
 
-FORM (FFNet_Activation_to_Categories, L"FFNet & Activation: To Categories", 0)
-	RADIO (L"Kind of labeling", 1)
-	RADIOBUTTON (L"Winner-takes-all")
-	RADIOBUTTON (L"Stochastic")
+FORM (FFNet_Activation_to_Categories, U"FFNet & Activation: To Categories", 0)
+	RADIO (U"Kind of labeling", 1)
+	RADIOBUTTON (U"Winner-takes-all")
+	RADIOBUTTON (U"Stochastic")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Activation thee = FIRST (Activation);
-	praat_new (FFNet_Activation_to_Categories (me, thee, GET_INTEGER (L"Kind of labeling")), my name, L"_", thy name);
+	autoCategories him = FFNet_Activation_to_Categories (me, thee, GET_INTEGER (U"Kind of labeling"));
+	praat_new (him.transfer(), my name, U"_", thy name);
 END
 
 /******************* FFNet && Eigen ******************************************/
 
-FORM (FFNet_Eigen_drawIntersection, L"FFnet & Eigen: Draw intersection", 0)
-	INTEGER (L"X-component", L"1")
-	INTEGER (L"Y-component", L"2")
-	REAL (L"xmin", L"0.0")
-	REAL (L"xmax", L"0.0")
-	REAL (L"ymin", L"0.0")
-	REAL (L"ymax", L"0.0")
+FORM (FFNet_Eigen_drawIntersection, U"FFnet & Eigen: Draw intersection", 0)
+	INTEGER (U"X-component", U"1")
+	INTEGER (U"Y-component", U"2")
+	REAL (U"xmin", U"0.0")
+	REAL (U"xmax", U"0.0")
+	REAL (U"ymin", U"0.0")
+	REAL (U"ymax", U"0.0")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Eigen thee = FIRST (Eigen);
 	autoPraatPicture picture;
-	long pcx = GET_INTEGER (L"X-component");
-	long pcy = GET_INTEGER (L"Y-component");
-	REQUIRE (pcx != 0 && pcy != 0, L"X and Y component must differ from 0.")
-	FFNet_Eigen_drawIntersection (me, thee, GRAPHICS, pcx, pcy, GET_REAL (L"xmin"), GET_REAL (L"xmax"),
-		GET_REAL (L"ymin"), GET_REAL (L"ymax"));
+	long pcx = GET_INTEGER (U"X-component");
+	long pcy = GET_INTEGER (U"Y-component");
+	REQUIRE (pcx != 0 && pcy != 0, U"X and Y component must differ from 0.")
+	FFNet_Eigen_drawIntersection (me, thee, GRAPHICS, pcx, pcy, GET_REAL (U"xmin"), GET_REAL (U"xmax"),
+		GET_REAL (U"ymin"), GET_REAL (U"ymax"));
 END
 
-FORM (FFNet_PCA_drawDecisionPlaneInEigenspace, L"FFNet & PCA: Draw decision plane", L"")
-	NATURAL (L"Unit number", L"1")
-	NATURAL (L"Layer number", L"1")
-	NATURAL (L"Horizontal eigenvector number", L"1")
-	NATURAL (L"Vertical eigenvector number", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
+FORM (FFNet_PCA_drawDecisionPlaneInEigenspace, U"FFNet & PCA: Draw decision plane", U"")
+	NATURAL (U"Unit number", U"1")
+	NATURAL (U"Layer number", U"1")
+	NATURAL (U"Horizontal eigenvector number", U"1")
+	NATURAL (U"Vertical eigenvector number", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
 	OK
 DO
 	autoPraatPicture picture;
 	FFNet me = FIRST (FFNet);
 	PCA thee = FIRST (PCA);
 	FFNet_Eigen_drawDecisionPlaneInEigenspace (me, thee,
-		GRAPHICS, GET_INTEGER (L"Unit number"), GET_INTEGER (L"Layer number"),
-		GET_INTEGER (L"Horizontal eigenvector number"),
-		GET_INTEGER (L"Vertical eigenvector number"), GET_REAL (L"left Horizontal range"),
-		GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"),
-		GET_REAL (L"right Vertical range"));
+		GRAPHICS, GET_INTEGER (U"Unit number"), GET_INTEGER (U"Layer number"),
+		GET_INTEGER (U"Horizontal eigenvector number"),
+		GET_INTEGER (U"Vertical eigenvector number"), GET_REAL (U"left Horizontal range"),
+		GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"),
+		GET_REAL (U"right Vertical range"));
 END
 
 /************************* FFNet && Categories **********************************/
@@ -473,162 +475,166 @@ END
 DIRECT (FFNet_Categories_to_Activation)
 	FFNet me = FIRST (FFNet);
 	Categories thee = FIRST (Categories);
-	praat_new (FFNet_Categories_to_Activation (me, thee), my name);
+	autoActivation him = FFNet_Categories_to_Activation (me, thee);
+	praat_new (him.transfer(), my name);
 END
 
 /************************* FFNet && Matrix **********************************/
 
-FORM (FFNet_weightsFromMatrix, L"Replace weights by values from Matrix", 0)
-	NATURAL (L"Layer", L"1")
+FORM (FFNet_weightsFromMatrix, U"Replace weights by values from Matrix", 0)
+	NATURAL (U"Layer", U"1")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Matrix thee = FIRST (Matrix);
-	praat_new (FFNet_weightsFromMatrix (me, thee, GET_INTEGER (L"Layer")), my name);
+	autoFFNet him = FFNet_weightsFromMatrix (me, thee, GET_INTEGER (U"Layer"));
+	praat_new (him.transfer(), my name);
 END
 
 /************************* FFNet && Pattern **********************************/
 
-FORM (FFNet_Pattern_drawActivation, L"Draw an activation", 0)
-	NATURAL (L"Pattern (row) number", L"1");
+FORM (FFNet_Pattern_drawActivation, U"Draw an activation", 0)
+	NATURAL (U"Pattern (row) number", U"1");
 	OK
 DO
 	autoPraatPicture picture;
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
-	FFNet_Pattern_drawActivation (me, thee, GRAPHICS, GET_INTEGER (L"Pattern"));
+	FFNet_Pattern_drawActivation (me, thee, GRAPHICS, GET_INTEGER (U"Pattern"));
 END
 
-FORM (FFNet_Pattern_to_Activation, L"To activations in layer", 0)
-	NATURAL (L"Layer", L"1")
+FORM (FFNet_Pattern_to_Activation, U"To activations in layer", 0)
+	NATURAL (U"Layer", U"1")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
-	praat_new (FFNet_Pattern_to_Activation (me, thee, GET_INTEGER (L"Layer")), my name, L"_", thy name);
+	autoActivation him = FFNet_Pattern_to_Activation (me, thee, GET_INTEGER (U"Layer"));
+	praat_new (him.transfer(), my name, U"_", thy name);
 END
 
 DIRECT (hint_FFNet_and_Pattern_classify)
-	Melder_information (L"You can use the FFNet as a classifier by selecting a\n"
+	Melder_information (U"You can use the FFNet as a classifier by selecting a\n"
 		"FFNet and a Pattern together and choosing \"To Categories...\".");
 END
 
 DIRECT (hint_FFNet_and_Pattern_and_Categories_learn)
-	Melder_information (L"You can teach a FFNet to classify by selecting a\n"
+	Melder_information (U"You can teach a FFNet to classify by selecting a\n"
 		"FFNet, a Pattern and a Categories together and choosing \"Learn...\".");
 END
 
-FORM (FFNet_Pattern_to_Categories, L"FFNet & Pattern: To Categories", L"FFNet & Pattern: To Categories...")
-	RADIO (L"Determine output category as", 1)
-	RADIOBUTTON (L"Winner-takes-all")
-	RADIOBUTTON (L"Stochastic")
+FORM (FFNet_Pattern_to_Categories, U"FFNet & Pattern: To Categories", U"FFNet & Pattern: To Categories...")
+	RADIO (U"Determine output category as", 1)
+	RADIOBUTTON (U"Winner-takes-all")
+	RADIOBUTTON (U"Stochastic")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
-	praat_new (FFNet_Pattern_to_Categories (me, thee, GET_INTEGER (L"Determine output category as")), my name, L"_", thy name);
+	autoCategories him = FFNet_Pattern_to_Categories (me, thee, GET_INTEGER (U"Determine output category as"));
+	praat_new (him.transfer(), my name, U"_", thy name);
 END
 
 /*********** FFNet Pattern Activation **********************************/
 
-FORM (FFNet_Pattern_Activation_getCosts_total, L"FFNet & Pattern & Activation: Get total costs", L"FFNet & Pattern & Activation: Get total costs...")
-	RADIO (L"Cost function", 1)
-	RADIOBUTTON (L"Minimum-squared-error")
-	RADIOBUTTON (L"Minimum-cross-entropy")
+FORM (FFNet_Pattern_Activation_getCosts_total, U"FFNet & Pattern & Activation: Get total costs", U"FFNet & Pattern & Activation: Get total costs...")
+	RADIO (U"Cost function", 1)
+	RADIOBUTTON (U"Minimum-squared-error")
+	RADIOBUTTON (U"Minimum-cross-entropy")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
 	Activation him = FIRST (Activation);
-	Melder_information (Melder_double (FFNet_Pattern_Activation_getCosts_total (me, thee, him, GET_INTEGER (L"Cost function"))));
+	Melder_information (FFNet_Pattern_Activation_getCosts_total (me, thee, him, GET_INTEGER (U"Cost function")));
 END
 
-FORM (FFNet_Pattern_Activation_getCosts_average, L"FFNet & Pattern & Activation: Get average costs", L"FFNet & Pattern & Activation: Get average costs...")
-	RADIO (L"Cost function", 1)
-	RADIOBUTTON (L"Minimum-squared-error")
-	RADIOBUTTON (L"Minimum-cross-entropy")
+FORM (FFNet_Pattern_Activation_getCosts_average, U"FFNet & Pattern & Activation: Get average costs", U"FFNet & Pattern & Activation: Get average costs...")
+	RADIO (U"Cost function", 1)
+	RADIOBUTTON (U"Minimum-squared-error")
+	RADIOBUTTON (U"Minimum-cross-entropy")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
 	Activation him = FIRST (Activation);
-	Melder_information (Melder_double (FFNet_Pattern_Activation_getCosts_average (me, thee, him, GET_INTEGER (L"Cost function"))));
+	Melder_information (FFNet_Pattern_Activation_getCosts_average (me, thee, him, GET_INTEGER (U"Cost function")));
 END
 
-FORM (FFNet_Pattern_Activation_learnSD, L"FFNet & Pattern & Activation: Learn slow", 0)
-	NATURAL (L"Maximum number of epochs", L"100")
-	POSITIVE (L"Tolerance of minimizer", L"1e-7")
-	LABEL (L"Specifics", L"Specific for this minimization")
-	POSITIVE (L"Learning rate", L"0.1")
-	REAL (L"Momentum", L"0.9")
-	RADIO (L"Cost function", 1)
-	RADIOBUTTON (L"Minimum-squared-error")
-	RADIOBUTTON (L"Minimum-cross-entropy")
+FORM (FFNet_Pattern_Activation_learnSD, U"FFNet & Pattern & Activation: Learn slow", 0)
+	NATURAL (U"Maximum number of epochs", U"100")
+	POSITIVE (U"Tolerance of minimizer", U"1e-7")
+	LABEL (U"Specifics", U"Specific for this minimization")
+	POSITIVE (U"Learning rate", U"0.1")
+	REAL (U"Momentum", U"0.9")
+	RADIO (U"Cost function", 1)
+	RADIOBUTTON (U"Minimum-squared-error")
+	RADIOBUTTON (U"Minimum-cross-entropy")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
 	Activation him = FIRST (Activation);
 	struct structSteepestDescentMinimizer_parameters p;
-	p.eta = GET_REAL (L"Learning rate");
-	p.momentum = GET_REAL (L"Momentum");
-	return FFNet_Pattern_Activation_learnSD (me, thee, him, GET_INTEGER (L"Maximum number of epochs"),
-			GET_REAL (L"Tolerance of minimizer"), & p, GET_INTEGER (L"Cost function"));
+	p.eta = GET_REAL (U"Learning rate");
+	p.momentum = GET_REAL (U"Momentum");
+	return FFNet_Pattern_Activation_learnSD (me, thee, him, GET_INTEGER (U"Maximum number of epochs"),
+			GET_REAL (U"Tolerance of minimizer"), & p, GET_INTEGER (U"Cost function"));
 END
 
-FORM (FFNet_Pattern_Activation_learnSM, L"FFNet & Pattern & Activation: Learn", 0)
-	NATURAL (L"Maximum number of epochs", L"100")
-	POSITIVE (L"Tolerance of minimizer", L"1e-7")
-	RADIO (L"Cost function", 1)
-	RADIOBUTTON (L"Minimum-squared-error")
-	RADIOBUTTON (L"Minimum-cross-entropy")
+FORM (FFNet_Pattern_Activation_learnSM, U"FFNet & Pattern & Activation: Learn", 0)
+	NATURAL (U"Maximum number of epochs", U"100")
+	POSITIVE (U"Tolerance of minimizer", U"1e-7")
+	RADIO (U"Cost function", 1)
+	RADIOBUTTON (U"Minimum-squared-error")
+	RADIOBUTTON (U"Minimum-cross-entropy")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
 	Activation him = FIRST (Activation);
-	return FFNet_Pattern_Activation_learnSM (me, thee, him, GET_INTEGER (L"Maximum number of epochs"),
-		GET_REAL (L"Tolerance of minimizer"), NULL,
-		GET_INTEGER (L"Cost function"));
+	return FFNet_Pattern_Activation_learnSM (me, thee, him, GET_INTEGER (U"Maximum number of epochs"),
+		GET_REAL (U"Tolerance of minimizer"), NULL,
+		GET_INTEGER (U"Cost function"));
 END
 
 /*********** FFNet Pattern Categories **********************************/
 
-FORM (FFNet_Pattern_Categories_getCosts_total, L"FFNet & Pattern & Categories: Get total costs", L"FFNet & Pattern & Categories: Get total costs...")
-	RADIO (L"Cost function", 1)
-	RADIOBUTTON (L"Minimum-squared-error")
-	RADIOBUTTON (L"Minimum-cross-entropy")
+FORM (FFNet_Pattern_Categories_getCosts_total, U"FFNet & Pattern & Categories: Get total costs", U"FFNet & Pattern & Categories: Get total costs...")
+	RADIO (U"Cost function", 1)
+	RADIOBUTTON (U"Minimum-squared-error")
+	RADIOBUTTON (U"Minimum-cross-entropy")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
 	Categories him = FIRST (Categories);
-	Melder_information (Melder_double (FFNet_Pattern_Categories_getCosts_total (me, thee, him,
-		GET_INTEGER (L"Cost function"))));
+	Melder_information (FFNet_Pattern_Categories_getCosts_total (me, thee, him,
+		GET_INTEGER (U"Cost function")));
 END
 
-FORM (FFNet_Pattern_Categories_getCosts_average, L"FFNet & Pattern & Categories: Get average costs", L"FFNet & Pattern & Categories: Get average costs...")
-	RADIO (L"Cost function", 1)
-	RADIOBUTTON (L"Minimum-squared-error")
-	RADIOBUTTON (L"Minimum-cross-entropy")
+FORM (FFNet_Pattern_Categories_getCosts_average, U"FFNet & Pattern & Categories: Get average costs", U"FFNet & Pattern & Categories: Get average costs...")
+	RADIO (U"Cost function", 1)
+	RADIOBUTTON (U"Minimum-squared-error")
+	RADIOBUTTON (U"Minimum-cross-entropy")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
 	Categories him = FIRST (Categories);
-	Melder_information (Melder_double (FFNet_Pattern_Categories_getCosts_average (me, thee, him,
-		GET_INTEGER (L"Cost function"))));
+	Melder_information (FFNet_Pattern_Categories_getCosts_average (me, thee, him,
+		GET_INTEGER (U"Cost function")));
 END
 
-FORM (Pattern_Categories_to_FFNet, L"Pattern & Categories: To FFNet", L"Pattern & Categories: To FFNet...")
-	INTEGER (L"Number of units in hidden layer 1", L"0")
-	INTEGER (L"Number of units in hidden layer 2", L"0")
+FORM (Pattern_Categories_to_FFNet, U"Pattern & Categories: To FFNet", U"Pattern & Categories: To FFNet...")
+	INTEGER (U"Number of units in hidden layer 1", U"0")
+	INTEGER (U"Number of units in hidden layer 2", U"0")
 	OK
 DO
 	Pattern me = FIRST (Pattern);
 	Categories thee = FIRST (Categories);
-	long nHidden1 = GET_INTEGER (L"Number of units in hidden layer 1");
-	long nHidden2 = GET_INTEGER (L"Number of units in hidden layer 2");
+	long nHidden1 = GET_INTEGER (U"Number of units in hidden layer 1");
+	long nHidden2 = GET_INTEGER (U"Number of units in hidden layer 2");
 
 	if (nHidden1 < 1) {
 		nHidden1 = 0;
@@ -638,131 +644,131 @@ DO
 	}
 	autoCategories uniq = Categories_selectUniqueItems (thee, 1);
 	long numberOfOutputs = uniq -> size;
-	if (numberOfOutputs < 1) Melder_throw ("There are not enough categories in the Categories.\n"
-		"Please try again with more categories in the Categories.");
+	if (numberOfOutputs < 1) Melder_throw (U"There are not enough categories in the Categories.\n"
+		U"Please try again with more categories in the Categories.");
 
 	autoFFNet ffnet = FFNet_create (my nx, nHidden1, nHidden2, numberOfOutputs, 0);
 	FFNet_setOutputCategories (ffnet.peek(), uniq.peek());
-	autostring ffnetName = FFNet_createNameFromTopology (ffnet.peek());
+	autostring32 ffnetName = FFNet_createNameFromTopology (ffnet.peek());
 	praat_new (ffnet.transfer(), ffnetName.peek());
 END
 
-FORM (FFNet_Pattern_Categories_learnSM, L"FFNet & Pattern & Categories: Learn", L"FFNet & Pattern & Categories: Learn...")
-	NATURAL (L"Maximum number of epochs", L"100")
-	POSITIVE (L"Tolerance of minimizer", L"1e-7")
-	RADIO (L"Cost function", 1)
-	RADIOBUTTON (L"Minimum-squared-error")
-	RADIOBUTTON (L"Minimum-cross-entropy")
+FORM (FFNet_Pattern_Categories_learnSM, U"FFNet & Pattern & Categories: Learn", U"FFNet & Pattern & Categories: Learn...")
+	NATURAL (U"Maximum number of epochs", U"100")
+	POSITIVE (U"Tolerance of minimizer", U"1e-7")
+	RADIO (U"Cost function", 1)
+	RADIOBUTTON (U"Minimum-squared-error")
+	RADIOBUTTON (U"Minimum-cross-entropy")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
 	Categories him = FIRST (Categories);
-	FFNet_Pattern_Categories_learnSM (me, thee, him, GET_INTEGER (L"Maximum number of epochs"),
-		GET_REAL (L"Tolerance of minimizer"), NULL, GET_INTEGER (L"Cost function"));
+	FFNet_Pattern_Categories_learnSM (me, thee, him, GET_INTEGER (U"Maximum number of epochs"),
+		GET_REAL (U"Tolerance of minimizer"), NULL, GET_INTEGER (U"Cost function"));
 END
 
-FORM (FFNet_Pattern_Categories_learnSD, L"FFNet & Pattern & Categories: Learn slow", L"FFNet & Pattern & Categories: Learn slow...")
-	NATURAL (L"Maximum number of epochs", L"100")
-	POSITIVE (L"Tolerance of minimizer", L"1e-7")
-	LABEL (L"Specifics", L"Specific for this minimization")
-	POSITIVE (L"Learning rate", L"0.1")
-	REAL (L"Momentum", L"0.9")
-	RADIO (L"Cost function", 1)
-	RADIOBUTTON (L"Minimum-squared-error")
-	RADIOBUTTON (L"Minimum-cross-entropy")
+FORM (FFNet_Pattern_Categories_learnSD, U"FFNet & Pattern & Categories: Learn slow", U"FFNet & Pattern & Categories: Learn slow...")
+	NATURAL (U"Maximum number of epochs", U"100")
+	POSITIVE (U"Tolerance of minimizer", U"1e-7")
+	LABEL (U"Specifics", U"Specific for this minimization")
+	POSITIVE (U"Learning rate", U"0.1")
+	REAL (U"Momentum", U"0.9")
+	RADIO (U"Cost function", 1)
+	RADIOBUTTON (U"Minimum-squared-error")
+	RADIOBUTTON (U"Minimum-cross-entropy")
 	OK
 DO
 	FFNet me = FIRST (FFNet);
 	Pattern thee = FIRST (Pattern);
 	Categories him = FIRST (Categories);
 	struct structSteepestDescentMinimizer_parameters p;
-	p.eta = GET_REAL (L"Learning rate");
-	p.momentum = GET_REAL (L"Momentum");
-	FFNet_Pattern_Categories_learnSD (me, thee, him, GET_INTEGER (L"Maximum number of epochs"),
-		GET_REAL (L"Tolerance of minimizer"), &p, GET_INTEGER (L"Cost function"));
+	p.eta = GET_REAL (U"Learning rate");
+	p.momentum = GET_REAL (U"Momentum");
+	FFNet_Pattern_Categories_learnSD (me, thee, him, GET_INTEGER (U"Maximum number of epochs"),
+		GET_REAL (U"Tolerance of minimizer"), &p, GET_INTEGER (U"Cost function"));
 END
 
 void praat_uvafon_FFNet_init ();
 void praat_uvafon_FFNet_init () {
 	Thing_recognizeClassesByName (classFFNet, NULL);
 
-	praat_addMenuCommand (L"Objects", L"New", L"Neural nets", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Feedforward neural networks", 0, 1, DO_FFNet_help);
-	praat_addMenuCommand (L"Objects", L"New", L"-- FFNet --", 0, 1, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Create iris example...", 0, 1, DO_FFNet_createIrisExample);
-	praat_addMenuCommand (L"Objects", L"New", L"Create FFNet...", 0, 1, DO_FFNet_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Advanced", 0, 1, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Pattern...", 0, 2, DO_Pattern_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Categories...", 0, 2, DO_Categories_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create FFNet (linear outputs)...", 0, 2, DO_FFNet_create_linearOutputs);
-
-	praat_addAction1 (classFFNet, 0, L"FFNet help", 0, 0, DO_FFNet_help);
+	praat_addMenuCommand (U"Objects", U"New", U"Neural nets", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Feedforward neural networks", 0, 1, DO_FFNet_help);
+	praat_addMenuCommand (U"Objects", U"New", U"-- FFNet --", 0, 1, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Create iris example...", 0, 1, DO_FFNet_createIrisExample);
+	praat_addMenuCommand (U"Objects", U"New", U"Create FFNet...", 0, 1, DO_FFNet_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Advanced", 0, 1, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Pattern...", 0, 2, DO_Pattern_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Categories...", 0, 2, DO_Categories_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create FFNet (linear outputs)...", 0, 2, DO_FFNet_create_linearOutputs);
+
+	praat_addAction1 (classFFNet, 0, U"FFNet help", 0, 0, DO_FFNet_help);
 	praat_addAction1 (classFFNet, 0, DRAW_BUTTON, 0, 0, 0);
-	praat_addAction1 (classFFNet, 0, L"Draw topology", 0, 1, DO_FFNet_drawTopology);
-	praat_addAction1 (classFFNet, 0, L"Draw weights...", 0, 1, DO_FFNet_drawWeights);
-	praat_addAction1 (classFFNet, 0, L"Draw weights to layer...", 0,  praat_DEPTH_1 | praat_HIDDEN, DO_FFNet_drawWeightsToLayer);
-	praat_addAction1 (classFFNet, 0, L"Draw cost history...", 0, 1, DO_FFNet_drawCostHistory);
+	praat_addAction1 (classFFNet, 0, U"Draw topology", 0, 1, DO_FFNet_drawTopology);
+	praat_addAction1 (classFFNet, 0, U"Draw weights...", 0, 1, DO_FFNet_drawWeights);
+	praat_addAction1 (classFFNet, 0, U"Draw weights to layer...", 0,  praat_DEPTH_1 | praat_HIDDEN, DO_FFNet_drawWeightsToLayer);
+	praat_addAction1 (classFFNet, 0, U"Draw cost history...", 0, 1, DO_FFNet_drawCostHistory);
 	praat_addAction1 (classFFNet, 0, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classFFNet, 0, L"Query structure", 0, 1, 0);
-	praat_addAction1 (classFFNet, 1, L"Get number of outputs", 0, 2, DO_FFNet_getNumberOfOutputs);
-	praat_addAction1 (classFFNet, 1, L"Get number of hidden units...", 0, 2, DO_FFNet_getNumberOfHiddenUnits);
-	praat_addAction1 (classFFNet, 1, L"Get number of inputs", 0, 2, DO_FFNet_getNumberOfInputs);
-	praat_addAction1 (classFFNet, 1, L"Get number of hidden weights...", 0, 2, DO_FFNet_getNumberOfHiddenWeights);
-	praat_addAction1 (classFFNet, 1, L"Get number of output weights", 0, 2, DO_FFNet_getNumberOfOutputWeights);
-	praat_addAction1 (classFFNet, 1, L"Get category of output unit...", 0, 2, DO_FFNet_getCategoryOfOutputUnit);
-	praat_addAction1 (classFFNet, 1, L"Get output unit of category...", 0, 2, DO_FFNet_getOutputUnitOfCategory);
-	praat_addAction1 (classFFNet, 0, L"-- FFNet weights --", 0, 1, 0);
-	praat_addAction1 (classFFNet, 1, L"Get bias...", 0, 1, DO_FFNet_getBias);
-	praat_addAction1 (classFFNet, 1, L"Get weight...", 0, 1, DO_FFNet_getWeight);
-	praat_addAction1 (classFFNet, 1, L"Get minimum", 0, 1, DO_FFNet_getMinimum);
+	praat_addAction1 (classFFNet, 0, U"Query structure", 0, 1, 0);
+	praat_addAction1 (classFFNet, 1, U"Get number of outputs", 0, 2, DO_FFNet_getNumberOfOutputs);
+	praat_addAction1 (classFFNet, 1, U"Get number of hidden units...", 0, 2, DO_FFNet_getNumberOfHiddenUnits);
+	praat_addAction1 (classFFNet, 1, U"Get number of inputs", 0, 2, DO_FFNet_getNumberOfInputs);
+	praat_addAction1 (classFFNet, 1, U"Get number of hidden weights...", 0, 2, DO_FFNet_getNumberOfHiddenWeights);
+	praat_addAction1 (classFFNet, 1, U"Get number of output weights", 0, 2, DO_FFNet_getNumberOfOutputWeights);
+	praat_addAction1 (classFFNet, 1, U"Get category of output unit...", 0, 2, DO_FFNet_getCategoryOfOutputUnit);
+	praat_addAction1 (classFFNet, 1, U"Get output unit of category...", 0, 2, DO_FFNet_getOutputUnitOfCategory);
+	praat_addAction1 (classFFNet, 0, U"-- FFNet weights --", 0, 1, 0);
+	praat_addAction1 (classFFNet, 1, U"Get bias...", 0, 1, DO_FFNet_getBias);
+	praat_addAction1 (classFFNet, 1, U"Get weight...", 0, 1, DO_FFNet_getWeight);
+	praat_addAction1 (classFFNet, 1, U"Get minimum", 0, 1, DO_FFNet_getMinimum);
 	praat_addAction1 (classFFNet, 0, MODIFY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classFFNet, 1, L"Set bias...", 0, 1, DO_FFNet_setBias);
-	praat_addAction1 (classFFNet, 1, L"Set weight...", 0, 1, DO_FFNet_setWeight);
-	praat_addAction1 (classFFNet, 1, L"Reset...", 0, 1, DO_FFNet_reset);
-	praat_addAction1 (classFFNet, 0, L"Select biases...", 0, 1, DO_FFNet_selectBiasesInLayer);
-	praat_addAction1 (classFFNet, 0, L"Select all weights", 0, 1, DO_FFNet_selectAllWeights);
+	praat_addAction1 (classFFNet, 1, U"Set bias...", 0, 1, DO_FFNet_setBias);
+	praat_addAction1 (classFFNet, 1, U"Set weight...", 0, 1, DO_FFNet_setWeight);
+	praat_addAction1 (classFFNet, 1, U"Reset...", 0, 1, DO_FFNet_reset);
+	praat_addAction1 (classFFNet, 0, U"Select biases...", 0, 1, DO_FFNet_selectBiasesInLayer);
+	praat_addAction1 (classFFNet, 0, U"Select all weights", 0, 1, DO_FFNet_selectAllWeights);
 	praat_addAction1 (classFFNet, 0, EXTRACT_BUTTON, 0, 0, 0);
-	praat_addAction1 (classFFNet, 0, L"Extract weights...", 0, 1, DO_FFNet_extractWeights);
-	praat_addAction1 (classFFNet, 0, L"Weights to Matrix...", 0, praat_DEPTH_1 | praat_HIDDEN, DO_FFNet_weightsToMatrix);
-	praat_addAction1 (classFFNet, 0, L"& Pattern: Classify?", 0, 0, DO_hint_FFNet_and_Pattern_classify);
-	praat_addAction1 (classFFNet, 0, L"& Pattern & Categories: Learn?", 0, 0, DO_hint_FFNet_and_Pattern_and_Categories_learn);
+	praat_addAction1 (classFFNet, 0, U"Extract weights...", 0, 1, DO_FFNet_extractWeights);
+	praat_addAction1 (classFFNet, 0, U"Weights to Matrix...", 0, praat_DEPTH_1 | praat_HIDDEN, DO_FFNet_weightsToMatrix);
+	praat_addAction1 (classFFNet, 0, U"& Pattern: Classify?", 0, 0, DO_hint_FFNet_and_Pattern_classify);
+	praat_addAction1 (classFFNet, 0, U"& Pattern & Categories: Learn?", 0, 0, DO_hint_FFNet_and_Pattern_and_Categories_learn);
 
-	praat_addAction2 (classFFNet, 1, classActivation, 1, L"Analyse", 0, 0, 0);
-	praat_addAction2 (classFFNet, 1, classActivation, 1, L"To Categories...", 0, 0, DO_FFNet_Activation_to_Categories);
+	praat_addAction2 (classFFNet, 1, classActivation, 1, U"Analyse", 0, 0, 0);
+	praat_addAction2 (classFFNet, 1, classActivation, 1, U"To Categories...", 0, 0, DO_FFNet_Activation_to_Categories);
 
-	praat_addAction2 (classFFNet, 1, classEigen, 1, L"Draw", 0, 0, 0);
-	praat_addAction2 (classFFNet, 1, classEigen, 1, L"Draw hyperplane intersections", 0, 0, DO_FFNet_Eigen_drawIntersection);
+	praat_addAction2 (classFFNet, 1, classEigen, 1, U"Draw", 0, 0, 0);
+	praat_addAction2 (classFFNet, 1, classEigen, 1, U"Draw hyperplane intersections", 0, 0, DO_FFNet_Eigen_drawIntersection);
 
-	praat_addAction2 (classFFNet, 1, classCategories, 1, L"Analyse", 0, 0, 0);
-	praat_addAction2 (classFFNet, 1, classCategories, 1, L"To Activation", 0, 0, DO_FFNet_Categories_to_Activation);
+	praat_addAction2 (classFFNet, 1, classCategories, 1, U"Analyse", 0, 0, 0);
+	praat_addAction2 (classFFNet, 1, classCategories, 1, U"To Activation", 0, 0, DO_FFNet_Categories_to_Activation);
 
-	praat_addAction2 (classFFNet, 1, classMatrix, 1, L"Modify", 0, 0, 0);
-	praat_addAction2 (classFFNet, 1, classMatrix, 1, L"Weights from Matrix...", 0, 0, DO_FFNet_weightsFromMatrix);
+	praat_addAction2 (classFFNet, 1, classMatrix, 1, U"Modify", 0, 0, 0);
+	praat_addAction2 (classFFNet, 1, classMatrix, 1, U"Weights from Matrix...", 0, 0, DO_FFNet_weightsFromMatrix);
 
-	praat_addAction2 (classFFNet, 1, classPattern, 1, L"Draw", 0, 0, 0);
-	praat_addAction2 (classFFNet, 1, classPattern, 1, L"Draw activation...", 0, 0, DO_FFNet_Pattern_drawActivation);
-	praat_addAction2 (classFFNet, 1, classPattern, 1, L"Analyse", 0, 0, 0);
-	praat_addAction2 (classFFNet, 1, classPattern, 1, L"To Categories...", 0, 0, DO_FFNet_Pattern_to_Categories);
-	praat_addAction2 (classFFNet, 1, classPattern, 1, L"To Activation...", 0, 0, DO_FFNet_Pattern_to_Activation);
+	praat_addAction2 (classFFNet, 1, classPattern, 1, U"Draw", 0, 0, 0);
+	praat_addAction2 (classFFNet, 1, classPattern, 1, U"Draw activation...", 0, 0, DO_FFNet_Pattern_drawActivation);
+	praat_addAction2 (classFFNet, 1, classPattern, 1, U"Analyse", 0, 0, 0);
+	praat_addAction2 (classFFNet, 1, classPattern, 1, U"To Categories...", 0, 0, DO_FFNet_Pattern_to_Categories);
+	praat_addAction2 (classFFNet, 1, classPattern, 1, U"To Activation...", 0, 0, DO_FFNet_Pattern_to_Activation);
 
-	praat_addAction2 (classFFNet, 1, classPCA, 1, L"Draw decision plane...", 0, 0, DO_FFNet_PCA_drawDecisionPlaneInEigenspace);
+	praat_addAction2 (classFFNet, 1, classPCA, 1, U"Draw decision plane...", 0, 0, DO_FFNet_PCA_drawDecisionPlaneInEigenspace);
 
-	praat_addAction2 (classPattern, 1, classCategories, 1, L"To FFNet...", 0, 0, DO_Pattern_Categories_to_FFNet);
+	praat_addAction2 (classPattern, 1, classCategories, 1, U"To FFNet...", 0, 0, DO_Pattern_Categories_to_FFNet);
 
-	praat_addAction3 (classFFNet, 1, classPattern, 1, classActivation, 1, L"Get total costs...", 0, 0, DO_FFNet_Pattern_Activation_getCosts_total);
-	praat_addAction3 (classFFNet, 1, classPattern, 1, classActivation, 1, L"Get average costs...", 0, 0, DO_FFNet_Pattern_Activation_getCosts_average);
-	praat_addAction3 (classFFNet, 1, classPattern, 1, classActivation, 1, L"Learn", 0, 0, 0);
-	praat_addAction3 (classFFNet, 1, classPattern, 1, classActivation, 1, L"Learn...", 0, 0, DO_FFNet_Pattern_Activation_learnSM);
-	praat_addAction3 (classFFNet, 1, classPattern, 1, classActivation, 1, L"Learn slow...", 0, 0, DO_FFNet_Pattern_Activation_learnSD);
+	praat_addAction3 (classFFNet, 1, classPattern, 1, classActivation, 1, U"Get total costs...", 0, 0, DO_FFNet_Pattern_Activation_getCosts_total);
+	praat_addAction3 (classFFNet, 1, classPattern, 1, classActivation, 1, U"Get average costs...", 0, 0, DO_FFNet_Pattern_Activation_getCosts_average);
+	praat_addAction3 (classFFNet, 1, classPattern, 1, classActivation, 1, U"Learn", 0, 0, 0);
+	praat_addAction3 (classFFNet, 1, classPattern, 1, classActivation, 1, U"Learn...", 0, 0, DO_FFNet_Pattern_Activation_learnSM);
+	praat_addAction3 (classFFNet, 1, classPattern, 1, classActivation, 1, U"Learn slow...", 0, 0, DO_FFNet_Pattern_Activation_learnSD);
 
-	praat_addAction3 (classFFNet, 1, classPattern, 1, classCategories, 1, L"Get total costs...", 0, 0, DO_FFNet_Pattern_Categories_getCosts_total);
-	praat_addAction3 (classFFNet, 1, classPattern, 1, classCategories, 1, L"Get average costs...", 0, 0, DO_FFNet_Pattern_Categories_getCosts_average);
-	praat_addAction3 (classFFNet, 1, classPattern, 1, classCategories, 1, L"Learn", 0, 0, 0);
-	praat_addAction3 (classFFNet, 1, classPattern, 1, classCategories, 1, L"Learn...", 0, 0, DO_FFNet_Pattern_Categories_learnSM);
-	praat_addAction3 (classFFNet, 1, classPattern, 1, classCategories, 1, L"Learn slow...", 0, 0, DO_FFNet_Pattern_Categories_learnSD);
+	praat_addAction3 (classFFNet, 1, classPattern, 1, classCategories, 1, U"Get total costs...", 0, 0, DO_FFNet_Pattern_Categories_getCosts_total);
+	praat_addAction3 (classFFNet, 1, classPattern, 1, classCategories, 1, U"Get average costs...", 0, 0, DO_FFNet_Pattern_Categories_getCosts_average);
+	praat_addAction3 (classFFNet, 1, classPattern, 1, classCategories, 1, U"Learn", 0, 0, 0);
+	praat_addAction3 (classFFNet, 1, classPattern, 1, classCategories, 1, U"Learn...", 0, 0, DO_FFNet_Pattern_Categories_learnSM);
+	praat_addAction3 (classFFNet, 1, classPattern, 1, classCategories, 1, U"Learn slow...", 0, 0, DO_FFNet_Pattern_Categories_learnSD);
 
 	INCLUDE_MANPAGES (manual_FFNet_init)
 }
 
-/* End of file praat_FFnet_init.cpp */
\ No newline at end of file
+/* End of file praat_FFnet_init.cpp */
diff --git a/LPC/.kdev_include_paths b/LPC/.kdev_include_paths
deleted file mode 100644
index c1a8344..0000000
--- a/LPC/.kdev_include_paths
+++ /dev/null
@@ -1,3 +0,0 @@
-/home/david/praat/build/dwsys/
-/home/david/praat/build/num/
-/home/david/praat/build/fon/
diff --git a/LPC/Cepstrogram.cpp b/LPC/Cepstrogram.cpp
index 309c469..840bf3b 100644
--- a/LPC/Cepstrogram.cpp
+++ b/LPC/Cepstrogram.cpp
@@ -1,6 +1,6 @@
 /* Cepstrogram.cpp
  *
- * Copyright (C) 2013 David Weenink
+ * Copyright (C) 2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -37,27 +37,27 @@
 Thing_implement (Cepstrogram, Matrix, 2);
 Thing_implement (PowerCepstrogram, Cepstrogram, 2); // derives from Matrix -> also version 2
 
-Cepstrogram Cepstrogram_create (double tmin, double tmax, long nt, double dt, double t1,
+autoCepstrogram Cepstrogram_create (double tmin, double tmax, long nt, double dt, double t1,
 	double qmin, double qmax, long nq, double dq, double q1) {
 	try {
 		autoCepstrogram me = Thing_new (Cepstrogram);
 
 		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, qmin, qmax, nq, dq, q1);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Cepstrogram not created.");
+		Melder_throw (U"Cepstrogram not created.");
 	}
 }
 
-PowerCepstrogram PowerCepstrogram_create (double tmin, double tmax, long nt, double dt, double t1,
+autoPowerCepstrogram PowerCepstrogram_create (double tmin, double tmax, long nt, double dt, double t1,
 	double qmin, double qmax, long nq, double dq, double q1) {
 	try {
 		autoPowerCepstrogram me = Thing_new (PowerCepstrogram);
 
 		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, qmin, qmax, nq, dq, q1);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("PowerCepstrogram not created.");
+		Melder_throw (U"PowerCepstrogram not created.");
 	}
 }
 
@@ -70,7 +70,7 @@ void PowerCepstrogram_paint (PowerCepstrogram me, Graphics g, double tmin, doubl
 		return;
 	}
 	autoMatrix thee = (Matrix) Data_copy (me);
-	double min = 1e38, max = -min;
+	double min = 1e308, max = -min;
 	for (long i = 1; i <= my ny; i++) {
 		for (long j = 1; j <= my nx; j++) {
 			double val = TO10LOG (my z[i][j]);
@@ -111,10 +111,10 @@ void PowerCepstrogram_paint (PowerCepstrogram me, Graphics g, double tmin, doubl
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"Quefrency (s)");
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Quefrency (s)");
 	}
 }
 
@@ -131,24 +131,24 @@ void PowerCepstrogram_subtractTilt_inline (PowerCepstrogram me, double qstartFit
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no tilt subtracted (inline).");
+		Melder_throw (me, U": no tilt subtracted (inline).");
 	}
 }
 
-PowerCepstrogram PowerCepstrogram_subtractTilt (PowerCepstrogram me, double qstartFit, double qendFit, int lineType, int fitMethod) {
+autoPowerCepstrogram PowerCepstrogram_subtractTilt (PowerCepstrogram me, double qstartFit, double qendFit, int lineType, int fitMethod) {
 	try {
 		autoPowerCepstrogram thee = Data_copy (me);
 		PowerCepstrogram_subtractTilt_inline (thee.peek(), qstartFit, qendFit, lineType, fitMethod);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no tilt subtracted.");
+		Melder_throw (me, U": no tilt subtracted.");
 	}
 	
 }
 
-Table PowerCepstrogram_to_Table_hillenbrand (PowerCepstrogram me, double pitchFloor, double pitchCeiling) {
+autoTable PowerCepstrogram_to_Table_hillenbrand (PowerCepstrogram me, double pitchFloor, double pitchCeiling) {
 	try {
-		autoTable thee = Table_createWithColumnNames (my nx, L"time quefrency cpp f0");
+		autoTable thee = Table_createWithColumnNames (my nx, U"time quefrency cpp f0");
 		autoPowerCepstrum him = PowerCepstrum_create (my ymax, my ny);
 		for (long i = 1; i <= my nx; i++) {
 			for (long j = 1; j <= my ny; j++) {
@@ -161,21 +161,21 @@ Table PowerCepstrogram_to_Table_hillenbrand (PowerCepstrogram me, double pitchFl
 			Table_setNumericValue (thee.peek(), i, 3, cpp); // Cepstrogram_getCPPS depends on this index 3!!
 			Table_setNumericValue (thee.peek(), i, 4, 1.0 / qpeak);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Table with cepstral peak prominence values created.");
+		Melder_throw (me, U": no Table with cepstral peak prominence values created.");
 	}
 }
 
-Table PowerCepstrogram_to_Table_cpp (PowerCepstrogram me, double pitchFloor, double pitchCeiling, double deltaF0, int interpolation, double qstartFit, double qendFit, int lineType, int fitMethod) {
+autoTable PowerCepstrogram_to_Table_cpp (PowerCepstrogram me, double pitchFloor, double pitchCeiling, double deltaF0, int interpolation, double qstartFit, double qendFit, int lineType, int fitMethod) {
 	try {
-		autoTable thee = Table_createWithColumnNames (my nx, L"time quefrency cpp f0 rnr");
+		autoTable thee = Table_createWithColumnNames (my nx, U"time quefrency cpp f0 rnr");
 		autoPowerCepstrum him = PowerCepstrum_create (my ymax, my ny);
 		for (long i = 1; i <= my nx; i++) {
 			for (long j = 1; j <= my ny; j++) {
 				his z[1][j] = my z[j][i];
 			}
-			double qpeak, z, cpp = PowerCepstrum_getPeakProminence (him.peek(), pitchFloor, pitchCeiling, interpolation,
+			double qpeak, cpp = PowerCepstrum_getPeakProminence (him.peek(), pitchFloor, pitchCeiling, interpolation,
 				qstartFit, qendFit, lineType, fitMethod, &qpeak);
 			double rnr = PowerCepstrum_getRNR (him.peek(), pitchFloor, pitchCeiling, deltaF0);
 			double time = Sampled_indexToX (me, i);
@@ -185,17 +185,17 @@ Table PowerCepstrogram_to_Table_cpp (PowerCepstrogram me, double pitchFloor, dou
 			Table_setNumericValue (thee.peek(), i, 4, 1.0 / qpeak);
 			Table_setNumericValue (thee.peek(), i, 5, rnr);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Table with cepstral peak prominence values created.");
+		Melder_throw (me, U": no Table with cepstral peak prominence values created.");
 	}
 }
 
-PowerCepstrogram PowerCepstrogram_smooth (PowerCepstrogram me, double timeAveragingWindow, double quefrencyAveragingWindow) {
+autoPowerCepstrogram PowerCepstrogram_smooth (PowerCepstrogram me, double timeAveragingWindow, double quefrencyAveragingWindow) {
 	try {
-		autoPowerCepstrogram thee = (PowerCepstrogram) Data_copy (me);
+		autoPowerCepstrogram thee = Data_copy (me);
 		// 1. average across time
-		long numberOfFrames = timeAveragingWindow / my dx;
+		long numberOfFrames = (long) floor (timeAveragingWindow / my dx);
 		if (numberOfFrames > 1) {
 			autoNUMvector<double> qin (1, my nx);
 			autoNUMvector<double> qout (1, my nx);
@@ -212,7 +212,7 @@ PowerCepstrogram PowerCepstrogram_smooth (PowerCepstrogram me, double timeAverag
 			}
 		}
 		// 2. average across quefrencies
-		long numberOfQuefrencyBins = quefrencyAveragingWindow / my dy;
+		long numberOfQuefrencyBins = (long) floor (quefrencyAveragingWindow / my dy);
 		if (numberOfQuefrencyBins > 1) {
 			autoNUMvector<double> qin (1, thy ny);
 			autoNUMvector<double> qout (1, thy ny);
@@ -228,23 +228,23 @@ PowerCepstrogram PowerCepstrogram_smooth (PowerCepstrogram me, double timeAverag
 				}
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not smoothed.");
+		Melder_throw (me, U": not smoothed.");
 	}
 }
 
-Matrix PowerCepstrogram_to_Matrix (PowerCepstrogram me) {
+autoMatrix PowerCepstrogram_to_Matrix (PowerCepstrogram me) {
 	try {
 		autoMatrix thee = Thing_new (Matrix);
 		my structMatrix :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Matrix created.");
+		Melder_throw (me, U": no Matrix created.");
 	}
 }
 
-PowerCepstrum PowerCepstrogram_to_PowerCepstrum_slice (PowerCepstrogram me, double time) {
+autoPowerCepstrum PowerCepstrogram_to_PowerCepstrum_slice (PowerCepstrogram me, double time) {
 	try {
 		long iframe = Sampled_xToNearestIndex (me, time);
 		iframe = iframe < 1 ? 1 : iframe > my nx ? my nx : iframe;
@@ -252,28 +252,28 @@ PowerCepstrum PowerCepstrogram_to_PowerCepstrum_slice (PowerCepstrogram me, doub
 		for (long i = 1; i <= my ny; i++) {
 			thy z[1][i] = my z[i][iframe];
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": Cepstrum not extracted.");
+		Melder_throw (me, U": Cepstrum not extracted.");
 	}
 }
 
-PowerCepstrogram Matrix_to_PowerCepstrogram (Matrix me);
-PowerCepstrogram Matrix_to_PowerCepstrogram (Matrix me) {
+autoPowerCepstrogram Matrix_to_PowerCepstrogram (Matrix me);
+autoPowerCepstrogram Matrix_to_PowerCepstrogram (Matrix me) {
 	try {
 		autoPowerCepstrogram thee = Thing_new (PowerCepstrogram);
 		my structMatrix :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no PowerCepstrogram created.");
+		Melder_throw (me, U": no PowerCepstrogram created.");
 	}
 }
 
-PowerCepstrogram Sound_to_PowerCepstrogram (Sound me, double pitchFloor, double dt, double maximumFrequency, double preEmphasisFrequency) {
+autoPowerCepstrogram Sound_to_PowerCepstrogram (Sound me, double pitchFloor, double dt, double maximumFrequency, double preEmphasisFrequency) {
 	try {
 		// minimum analysis window has 3 periods of lowest pitch
-		double analysisWidth = 3  / pitchFloor;
-		double windowDuration = 2 * analysisWidth; /* gaussian window */
+		double analysisWidth = 3.0  / pitchFloor;
+		double windowDuration = 2.0 * analysisWidth; /* gaussian window */
 		long nFrames;
 
 		// Convenience: analyse the whole sound into one Cepstrogram_frame
@@ -293,7 +293,7 @@ PowerCepstrogram Sound_to_PowerCepstrogram (Sound me, double pitchFloor, double
 		double qmax = 0.5 * nfft / samplingFrequency, dq = qmax / (nq - 1);
 		autoPowerCepstrogram thee = PowerCepstrogram_create (my xmin, my xmax, nFrames, dt, t1, 0, qmax, nq, dq, 0);
 
-		autoMelderProgress progress (L"Cepstrogram analysis");
+		autoMelderProgress progress (U"Cepstrogram analysis");
 
 		for (long iframe = 1; iframe <= nFrames; iframe++) {
 			double t = Sampled_indexToX (thee.peek(), iframe);
@@ -306,23 +306,23 @@ PowerCepstrogram Sound_to_PowerCepstrogram (Sound me, double pitchFloor, double
 				thy z[i][iframe] = cepstrum -> z[1][i];
 			}
 			if ((iframe % 10) == 1) {
-				Melder_progress ((double) iframe / nFrames, L"PowerCepstrogram analysis of frame ",
-					Melder_integer (iframe), L" out of ", Melder_integer (nFrames), L".");
+				Melder_progress ((double) iframe / nFrames, U"PowerCepstrogram analysis of frame ",
+					iframe, U" out of ", nFrames, U".");
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no PowerCepstrogram created.");
+		Melder_throw (me, U": no PowerCepstrogram created.");
 	}
 }
 
-Cepstrum Spectrum_to_Cepstrum_hillenbrand (Spectrum me);
-Cepstrum Spectrum_to_Cepstrum_hillenbrand (Spectrum me) {
+autoCepstrum Spectrum_to_Cepstrum_hillenbrand (Spectrum me);
+autoCepstrum Spectrum_to_Cepstrum_hillenbrand (Spectrum me) {
 	try {
 		autoNUMfft_Table fftTable;
 		// originalNumberOfSamplesProbablyOdd irrelevant
 		if (my x1 != 0.0) {
-			Melder_throw ("A Fourier-transformable Spectrum must have a first frequency of 0 Hz, not ", my x1, L" Hz.");
+			Melder_throw (U"A Fourier-transformable Spectrum must have a first frequency of 0 Hz, not ", my x1, U" Hz.");
 		}
 		long numberOfSamples = my nx - 1;
 		autoCepstrum thee = Cepstrum_create (0.5 / my dx, my nx);
@@ -338,9 +338,9 @@ Cepstrum Spectrum_to_Cepstrum_hillenbrand (Spectrum me) {
 			double val = amp[i] / numberOfSamples;// scaling 1/n because ifft(fft(1))= n;
 			thy z[1][i] = val * val; // power cepstrum
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
@@ -365,17 +365,17 @@ static void complexfftoutput_to_power (double *fft, long nfft, double *dbs, bool
 }
 
 
-PowerCepstrogram Sound_to_PowerCepstrogram_hillenbrand (Sound me, double minimumPitch, double dt) {
+autoPowerCepstrogram Sound_to_PowerCepstrogram_hillenbrand (Sound me, double minimumPitch, double dt) {
 	try {
 		// minimum analysis window has 3 periods of lowest pitch
 		double analysisWidth = 3  / minimumPitch;
 		if (analysisWidth > my dx * my nx) {
 			analysisWidth = my dx * my nx;
 		}
-		double t1, samplingFrequency = 1 / my dx;
+		double t1, samplingFrequency = 1.0 / my dx;
 		autoSound thee;
 		if (samplingFrequency > 30000) {
-			samplingFrequency = samplingFrequency / 2;
+			samplingFrequency = samplingFrequency / 2.0;
 			thee.reset (Sound_resample (me, samplingFrequency, 1));
 		} else {
 			thee.reset (Data_copy (me));
@@ -384,9 +384,9 @@ PowerCepstrogram Sound_to_PowerCepstrogram_hillenbrand (Sound me, double minimum
 		for (long i = thy nx; i > 1; i--) {
 			thy z[1][i] -= 0.9 * thy z[1][i - 1];
 		}
-		long nosInWindow = analysisWidth * samplingFrequency, nFrames;
+		long nosInWindow = (long) floor (analysisWidth * samplingFrequency), nFrames;
 		if (nosInWindow < 8) {
-			Melder_throw ("Analysis window too short.");
+			Melder_throw (U"Analysis window too short.");
 		}
 		Sampled_shortTermAnalysis (thee.peek(), analysisWidth, dt, & nFrames, & t1);
 		autoNUMvector<double> hamming (1, nosInWindow);
@@ -404,12 +404,12 @@ PowerCepstrogram Sound_to_PowerCepstrogram_hillenbrand (Sound me, double minimum
 		double qmax = 0.5 * nfft / samplingFrequency, dq = qmax / (nfftdiv2 + 1);
 		autoPowerCepstrogram him = PowerCepstrogram_create (my xmin, my xmax, nFrames, dt, t1, 0, qmax, nfftdiv2+1, dq, 0);
 		
-		autoMelderProgress progress (L"Cepstrogram analysis");
+		autoMelderProgress progress (U"Cepstrogram analysis");
 		
 		for (long iframe = 1; iframe <= nFrames; iframe++) {
 			double tbegin = t1 + (iframe - 1) * dt - analysisWidth / 2;
 			tbegin = tbegin < thy xmin ? thy xmin : tbegin;
-			long istart = Sampled_xToIndex (thee.peek(), tbegin);
+			long istart = Sampled_xToLowIndex (thee.peek(), tbegin);   // ppgb: afronding naar beneden?
 			istart = istart < 1 ? 1 : istart;
 			long iend = istart + nosInWindow - 1;
 			iend = iend > thy nx ? thy nx : iend;
@@ -448,13 +448,13 @@ PowerCepstrogram Sound_to_PowerCepstrogram_hillenbrand (Sound me, double minimum
 				his z[i][iframe] = fftbuf[i] * fftbuf[i];
 			}
 			if ((iframe % 10) == 1) {
-				Melder_progress ((double) iframe / nFrames, L"Cepstrogram analysis of frame ",
-					 Melder_integer (iframe), L" out of ", Melder_integer (nFrames), L".");
+				Melder_progress ((double) iframe / nFrames, U"Cepstrogram analysis of frame ",
+					 iframe, U" out of ", nFrames, U".");
 			}
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Cepstrogram created.");
+		Melder_throw (me, U": no Cepstrogram created.");
 	}
 }
 
@@ -462,14 +462,14 @@ double PowerCepstrogram_getCPPS (PowerCepstrogram me, bool subtractTiltBeforeSmo
 	try {
 		autoPowerCepstrogram him;
 		if (subtractTiltBeforeSmoothing) {
-			him.reset(PowerCepstrogram_subtractTilt (me, qstartFit, qendFit, lineType, fitMethod));
+			him = PowerCepstrogram_subtractTilt (me, qstartFit, qendFit, lineType, fitMethod);
 		}
 		autoPowerCepstrogram smooth = PowerCepstrogram_smooth (subtractTiltBeforeSmoothing ? him.peek() : me, timeAveragingWindow, quefrencyAveragingWindow);
 		autoTable table = PowerCepstrogram_to_Table_cpp (smooth.peek(), pitchFloor, pitchCeiling, deltaF0, interpolation, qstartFit, qendFit, lineType, fitMethod);
 		double cpps = Table_getMean (table.peek(), 3);
 		return cpps;
 	} catch (MelderError) {
-		Melder_throw (me, ": no CPPS value calculated.");
+		Melder_throw (me, U": no CPPS value calculated.");
 	}
 }
 
@@ -477,14 +477,14 @@ double PowerCepstrogram_getCPPS_hillenbrand (PowerCepstrogram me, bool subtractT
 	try {
 		autoPowerCepstrogram him;
 		if (subtractTiltBeforeSmoothing) {
-			him.reset(PowerCepstrogram_subtractTilt (me, 0.001, 0, 1, 1));
+			him = PowerCepstrogram_subtractTilt (me, 0.001, 0, 1, 1);
 		}
 		autoPowerCepstrogram smooth = PowerCepstrogram_smooth (subtractTiltBeforeSmoothing ? him.peek() : me, timeAveragingWindow, quefrencyAveragingWindow);
 		autoTable table = PowerCepstrogram_to_Table_hillenbrand (smooth.peek(), pitchFloor, pitchCeiling);
 		double cpps = Table_getMean (table.peek(), 3);
 		return cpps;
 	} catch (MelderError) {
-		Melder_throw (me, ": no CPPS value calculated.");
+		Melder_throw (me, U": no CPPS value calculated.");
 	}
 }
 
diff --git a/LPC/Cepstrogram.h b/LPC/Cepstrogram.h
index e198212..695087e 100644
--- a/LPC/Cepstrogram.h
+++ b/LPC/Cepstrogram.h
@@ -49,30 +49,29 @@ Thing_define (PowerCepstrogram, Cepstrogram) {
 
 */
 
-Cepstrogram Cepstrogram_create (double tmin, double tmax, long nt, double dt, double t1,
+autoCepstrogram Cepstrogram_create (double tmin, double tmax, long nt, double dt, double t1,
 	double qmin, double qmax, long nq, double dq, double q1);
-PowerCepstrogram PowerCepstrogram_create (double tmin, double tmax, long nt, double dt, double t1,
+autoPowerCepstrogram PowerCepstrogram_create (double tmin, double tmax, long nt, double dt, double t1,
 	double qmin, double qmax, long nq, double dq, double q1);
 
 void PowerCepstrogram_paint (PowerCepstrogram me, Graphics g, double tmin, double tmax, double qmin, double qmax, double dBmaximum, int autoscaling, double dynamicRangedB, double dynamicCompression, int garnish);
 
-PowerCepstrogram PowerCepstrogram_smooth (PowerCepstrogram me, double timeAveragingWindow, double quefrencyAveragingWindow);
+autoPowerCepstrogram PowerCepstrogram_smooth (PowerCepstrogram me, double timeAveragingWindow, double quefrencyAveragingWindow);
 
-PowerCepstrogram Sound_to_PowerCepstrogram (Sound me, double analysisWidth, double dt, double maximumFrequency, double preEmphasisFrequency);
+autoPowerCepstrogram Sound_to_PowerCepstrogram (Sound me, double analysisWidth, double dt, double maximumFrequency, double preEmphasisFrequency);
 
-PowerCepstrogram Sound_to_PowerCepstrogram_hillenbrand (Sound me, double analysisWidth, double dt);
+autoPowerCepstrogram Sound_to_PowerCepstrogram_hillenbrand (Sound me, double analysisWidth, double dt);
 
-Table PowerCepstrogram_to_Table_hillenbrand (PowerCepstrogram me, double pitchFloor, double pitchCeiling);
-Table PowerCepstrogram_to_Table_cpp (PowerCepstrogram me, double pitchFloor, double pitchCeiling, double deltaF0, int interpolation, double qstartFit, double qendFit, int lineType, int method);
-PowerCepstrum PowerCepstrogram_to_PowerCepstrum_slice (PowerCepstrogram me, double time);
+autoTable PowerCepstrogram_to_Table_hillenbrand (PowerCepstrogram me, double pitchFloor, double pitchCeiling);
+autoTable PowerCepstrogram_to_Table_cpp (PowerCepstrogram me, double pitchFloor, double pitchCeiling, double deltaF0, int interpolation, double qstartFit, double qendFit, int lineType, int method);
+autoPowerCepstrum PowerCepstrogram_to_PowerCepstrum_slice (PowerCepstrogram me, double time);
 
-PowerCepstrogram PowerCepstrogram_subtractTilt (PowerCepstrogram me, double qstartFit, double qendFit, int lineType, int fitMethod);
+autoPowerCepstrogram PowerCepstrogram_subtractTilt (PowerCepstrogram me, double qstartFit, double qendFit, int lineType, int fitMethod);
 void PowerCepstrogram_subtractTilt_inline (PowerCepstrogram me, double qstartFit, double qendFit, int lineType, int fitMethod);
 
 double PowerCepstrogram_getCPPS_hillenbrand (PowerCepstrogram me, bool subtractTiltBeforeSmoothing, double timeAveragingWindow, double quefrencyAveragingWindow, double pitchFloor, double pitchCeiling);
-double PowerCepstrogram_getCPPS (PowerCepstrogram me, bool subtractTiltBeforeSmoothing, double timeAveragingWindow, double quefrencyAveragingWindow,
-	double pitchFloor, double pitchCeiling, double deltaF0, int interpolation, double qstartFit, double qendFit, int lineType, int fitMethod);
+double PowerCepstrogram_getCPPS (PowerCepstrogram me, bool subtractTiltBeforeSmoothing, double timeAveragingWindow, double quefrencyAveragingWindow, double pitchFloor, double pitchCeiling, double deltaF0, int interpolation, double qstartFit, double qendFit, int lineType, int fitMethod);
 
-Matrix PowerCepstrogram_to_Matrix (PowerCepstrogram me);
-PowerCepstrogram Matrix_to_Cepstrogram (Matrix me);
+autoMatrix PowerCepstrogram_to_Matrix (PowerCepstrogram me);
+autoPowerCepstrogram Matrix_to_Cepstrogram (Matrix me);
 #endif /* _Cepstrogram_h_ */
diff --git a/LPC/Cepstrum.cpp b/LPC/Cepstrum.cpp
index 81b4469..df8bbb3 100644
--- a/LPC/Cepstrum.cpp
+++ b/LPC/Cepstrum.cpp
@@ -1,6 +1,6 @@
 /* Cepstrum.cpp
  *
- * Copyright (C) 1994-2014 David Weenink
+ * Copyright (C) 1994-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -54,7 +54,7 @@ static void NUMvector_filter (double *input, long numberOfDataPoints, double *fi
 			long jfrom = ifrom < 1 ? 1 : ifrom;
 			long jto = ito > numberOfDataPoints ? numberOfDataPoints : ito;
 			long index = ifrom < 1 ? 2 - ifrom : 1;
-			double out = 0, sum = 0;
+			double out = 0.0, sum = 0.0;
 			for (long j = jfrom; j <= jto; j++, index++) {
 				out += filter[index] * input[j];
 				sum += filter[index];
@@ -100,43 +100,43 @@ double structPowerCepstrum :: v_getValueAtSample (long isamp, long which, int un
 	return NUMundefined;
 }
 
-Cepstrum Cepstrum_create (double qmax, long nq) {
+autoCepstrum Cepstrum_create (double qmax, long nq) {
 	try {
 		autoCepstrum me = Thing_new (Cepstrum);
 		double dq = qmax / (nq - 1);
 
-		Matrix_init (me.peek(), 0, qmax, nq, dq, 0, 1, 1, 1, 1, 1);
-		return me.transfer();
+		Matrix_init (me.peek(), 0.0, qmax, nq, dq, 0.0, 1.0, 1.0, 1, 1, 1.0);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Cepstrum not created.");
+		Melder_throw (U"Cepstrum not created.");
 	}
 }
 
-PowerCepstrum Cepstrum_downto_PowerCepstrum (Cepstrum me ) {
+autoPowerCepstrum Cepstrum_downto_PowerCepstrum (Cepstrum me ) {
 	try {
 		autoPowerCepstrum thee = PowerCepstrum_create (my xmax, my nx);
 		for (long i = 1; i <= my nx; i++) {
 			thy z[1][i] = my z[1][i] * my z[1][i];
 		}
-		return thee.transfer ();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, " not converted.");
+		Melder_throw (me, U" not converted.");
 	}
 }
 
-PowerCepstrum PowerCepstrum_create (double qmax, long nq) {
+autoPowerCepstrum PowerCepstrum_create (double qmax, long nq) {
 	try {
 		autoPowerCepstrum me = Thing_new (PowerCepstrum);
 		double dq = qmax / (nq - 1);
 
-		Matrix_init (me.peek(), 0, qmax, nq, dq, 0, 1, 1, 1, 1, 1);
-		return me.transfer();
+		Matrix_init (me.peek(), 0.0, qmax, nq, dq, 0.0, 1.0, 1.0, 1, 1, 1.0);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("PowerCepstrum not created.");
+		Melder_throw (U"PowerCepstrum not created.");
 	}
 }
 
-void _Cepstrum_draw (Cepstrum me, Graphics g, double qmin, double qmax, double minimum, double maximum, int power, int garnish) {
+static void _Cepstrum_draw (Cepstrum me, Graphics g, double qmin, double qmax, double minimum, double maximum, int power, int garnish) {
 	int autoscaling = minimum >= maximum;
 
 	Graphics_setInner (g);
@@ -173,10 +173,10 @@ void _Cepstrum_draw (Cepstrum me, Graphics g, double qmin, double qmax, double m
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Quefrency (s)");
-		Graphics_marksBottom (g, 2, TRUE, TRUE, FALSE);
-		Graphics_textLeft (g, 1, power ? L"Amplitude (dB)" : L"Amplitude");
-		Graphics_marksLeft (g, 2, TRUE, TRUE, FALSE);
+		Graphics_textBottom (g, true, U"Quefrency (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textLeft (g, true, power ? U"Amplitude (dB)" : U"Amplitude");
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
@@ -276,7 +276,7 @@ void PowerCepstrum_fitTiltLine (PowerCepstrum me, double qmin, double qmax, doub
 		imin = (lineType == 2 && imin == 1) ? 2 : imin; // log(0) is undefined!
 		long numberOfPoints = imax - imin + 1;
 		if (numberOfPoints < 2) {
-			Melder_throw ("Not enough points for fit.");
+			Melder_throw (U"Not enough points for fit.");
 		}
 		autoNUMvector<double> y (1, numberOfPoints);
 		autoNUMvector<double> x (1, numberOfPoints);
@@ -310,12 +310,12 @@ void PowerCepstrum_fitTiltLine (PowerCepstrum me, double qmin, double qmax, doub
 		// fit a straight line through (x,y)'s
 		NUMlineFit (x.peek(), y.peek(), numberOfPoints, a, intercept, method);
 	} catch (MelderError) {
-		Melder_throw (me, ": couldn't fit a line.");
+		Melder_throw (me, U": couldn't fit a line.");
 	}
 }
 
 // Hillenbrand subtracts dB values and if the result is negative it is made zero
-void PowerCepstrum_subtractTiltLine_inline2 (PowerCepstrum me, double slope, double intercept, int lineType) {
+static void PowerCepstrum_subtractTiltLine_inline2 (PowerCepstrum me, double slope, double intercept, int lineType) {
 	for (long j = 1; j <= my nx; j++) {
 		double q = my x1 + (j - 1) * my dx;
 		q = j == 1 ? 0.5 * my dx : q; // approximation
@@ -328,7 +328,7 @@ void PowerCepstrum_subtractTiltLine_inline2 (PowerCepstrum me, double slope, dou
 }
 
 // clip with tilt line
-void PowerCepstrum_subtractTiltLine_inline (PowerCepstrum me, double slope, double intercept, int lineType) {
+static void PowerCepstrum_subtractTiltLine_inline (PowerCepstrum me, double slope, double intercept, int lineType) {
 	for (long j = 1; j <= my nx; j++) {
 		double q = my x1 + (j - 1) * my dx;
 		q = j == 1 ? 0.5 * my dx : q; // approximation
@@ -339,7 +339,7 @@ void PowerCepstrum_subtractTiltLine_inline (PowerCepstrum me, double slope, doub
 		if (diff < 0) {
 			diff = 0;
 		}
-		my z[1][j] = exp (diff * NUMln10 / 10) - 1e-30;
+		my z[1][j] = exp (diff * NUMln10 / 10.0) - 1e-30;
 	}
 }
 
@@ -350,19 +350,19 @@ void PowerCepstrum_subtractTilt_inline (PowerCepstrum me, double qstartFit, doub
 	PowerCepstrum_subtractTiltLine_inline (me, slope, intercept, lineType);
 }
 
-PowerCepstrum PowerCepstrum_subtractTilt (PowerCepstrum me, double qstartFit, double qendFit, int lineType, int fitMethod) {
+autoPowerCepstrum PowerCepstrum_subtractTilt (PowerCepstrum me, double qstartFit, double qendFit, int lineType, int fitMethod) {
 	try {
 		autoPowerCepstrum thee = Data_copy (me);
 		PowerCepstrum_subtractTilt_inline (thee.peek(), qstartFit,  qendFit, lineType, fitMethod);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": couldn't subtract tilt line.");
+		Melder_throw (me, U": couldn't subtract tilt line.");
 	}
 }
 
-void PowerCepstrum_smooth_inline2 (PowerCepstrum me, double quefrencyAveragingWindow) {
+static void PowerCepstrum_smooth_inline2 (PowerCepstrum me, double quefrencyAveragingWindow) {
 	try {
-		long numberOfQuefrencyBins = quefrencyAveragingWindow / my dx;
+		long numberOfQuefrencyBins = (long) floor (quefrencyAveragingWindow / my dx);
 		if (numberOfQuefrencyBins > 1) {
 			autoNUMvector<double> qin (1, my nx);
 			autoNUMvector<double> qout (1, my nx);
@@ -375,13 +375,13 @@ void PowerCepstrum_smooth_inline2 (PowerCepstrum me, double quefrencyAveragingWi
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not smoothed.");
+		Melder_throw (me, U": not smoothed.");
 	}
 }
 
 void PowerCepstrum_smooth_inline (PowerCepstrum me, double quefrencyAveragingWindow, long numberOfIterations) {
 	try {
-		long numberOfQuefrencyBins = quefrencyAveragingWindow / my dx;
+		long numberOfQuefrencyBins = (long) floor (quefrencyAveragingWindow / my dx);
 		if (numberOfQuefrencyBins > 1) {
 			autoNUMvector<double> qin (1, my nx);
 			autoNUMvector<double> qout (1, my nx);
@@ -399,14 +399,14 @@ void PowerCepstrum_smooth_inline (PowerCepstrum me, double quefrencyAveragingWin
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not smoothed.");
+		Melder_throw (me, U": not smoothed.");
 	}
 }
 
-PowerCepstrum PowerCepstrum_smooth (PowerCepstrum me, double quefrencyAveragingWindow, long numberOfIterations) {
+autoPowerCepstrum PowerCepstrum_smooth (PowerCepstrum me, double quefrencyAveragingWindow, long numberOfIterations) {
 	autoPowerCepstrum thee = Data_copy (me);
 	PowerCepstrum_smooth_inline (thee.peek(), quefrencyAveragingWindow, numberOfIterations);
-	return thee.transfer();
+	return thee;
 }
 
 void PowerCepstrum_getMaximumAndQuefrency (PowerCepstrum me, double pitchFloor, double pitchCeiling, int interpolation, double *peakdB, double *quefrency) {
@@ -442,8 +442,8 @@ static void Cepstrum_getZ2 (Cepstrum me, long imin, long imax, double peakdB, lo
 	double mean, variance;
 	NUMvector_avevar (&ymax[npeaks], ipeak, &mean, &variance);
 	double sigma = sqrt (variance / (ipeak - 1));
-	double peak = exp (peakdB * NUMln10 / 10) - 1e-30;
-	*z = sigma <= 0 ? NUMundefined : peak / sigma;
+	double peak = exp (peakdB * NUMln10 / 10.0) - 1e-30;
+	*z = sigma <= 0.0 ? NUMundefined : peak / sigma;
 }
 
 static void Cepstrum_getZ (Cepstrum me, long imin, long imax, double peakdB, double slope, double intercept, int lineType, double *z) {
@@ -455,12 +455,12 @@ static void Cepstrum_getZ (Cepstrum me, long imin, long imax, double peakdB, dou
 		double xq = lineType == 2 ? log(q) : q;
 		double db_background = slope * xq + intercept;
 		double db_cepstrum = my v_getValueAtSample (i, 1, 0);
-		double diff = exp ((db_cepstrum - db_background) * NUMln10 / 10) - 1e-30;
+		double diff = exp ((db_cepstrum - db_background) * NUMln10 / 10.0) - 1e-30;
 		//double diff = fabs (db_cepstrum - db_background);
 		dabs[i - imin + 1] = diff;
 	}
 	double q50 = NUMquantile (ndata, dabs.peek(), 0.5);
-	double peak = exp (peakdB * NUMln10 / 10) - 1e-30;
+	double peak = exp (peakdB * NUMln10 / 10.0) - 1e-30;
 	//*z = peakdB / q50;
 	*z = peak / q50;
 }
@@ -522,59 +522,60 @@ double PowerCepstrum_getPeakProminence (PowerCepstrum me, double pitchFloor, dou
 	double xq = lineType == 2 ? log(quefrency) : quefrency;
 	double db_background = slope * xq + intercept;
 	double cpp = peakdB - db_background;
-	if (qpeak != NULL) {
+	if (qpeak != nullptr) {
 		*qpeak = quefrency;
 	}
 	return cpp;
 }
 
-Matrix PowerCepstrum_to_Matrix (PowerCepstrum me) {
+autoMatrix PowerCepstrum_to_Matrix (PowerCepstrum me) {
 	try {
 		autoMatrix thee = Thing_new (Matrix);
 		my structMatrix :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Matrix created.");
+		Melder_throw (me, U": no Matrix created.");
 	}
 }
 
-PowerCepstrum Matrix_to_PowerCepstrum (Matrix me) {
+autoPowerCepstrum Matrix_to_PowerCepstrum (Matrix me) {
 	try {
-		if (my ny != 1)
-			Melder_throw ("Matrix must have exactly 1 row.");
+		if (my ny != 1) {
+			Melder_throw (U"Matrix should have exactly 1 row.");
+		}
 		autoPowerCepstrum thee = Thing_new (PowerCepstrum);
 		my structMatrix :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to PowerCepstrum.");
+		Melder_throw (me, U": not converted to PowerCepstrum.");
 	}
 }
 
-PowerCepstrum Matrix_to_PowerCepstrum_row (Matrix me, long row) {
+autoPowerCepstrum Matrix_to_PowerCepstrum_row (Matrix me, long row) {
 	try {
 		autoPowerCepstrum thee = PowerCepstrum_create (my xmax, my nx);
 		if (row < 1 || row > my ny) {
-			Melder_throw ("Row number must be between 1 and ", my ny, " inclusive.");
+			Melder_throw (U"Row number should be between 1 and ", my ny, U" inclusive.");
 		}
 		NUMvector_copyElements (my z[row], thy z[1], 1, my nx);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no PowerCepstrum created.");
+		Melder_throw (me, U": no PowerCepstrum created.");
 	}
 }
 
-PowerCepstrum Matrix_to_PowerCepstrum_column (Matrix me, long col) {
+autoPowerCepstrum Matrix_to_PowerCepstrum_column (Matrix me, long col) {
 	try {
 		autoPowerCepstrum thee = PowerCepstrum_create (my ymax, my ny);
 		if (col < 1 || col > my nx) {
-			Melder_throw ("Column number must be between 1 and ", my nx, " inclusive.");
+			Melder_throw (U"Column number should be between 1 and ", my nx, U" inclusive.");
 		}
 		for (long i = 1; i <= my ny; i++) {
 			thy z[1][i] = my z[i][col];
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no PowerCepstrum created.");
+		Melder_throw (me, U": no PowerCepstrum created.");
 	}
 }
 
diff --git a/LPC/Cepstrum.h b/LPC/Cepstrum.h
index 86e65e2..50e8752 100644
--- a/LPC/Cepstrum.h
+++ b/LPC/Cepstrum.h
@@ -2,7 +2,7 @@
 #define _Cepstrum_h_
 /* Cepstrum.h
  *
- * Copyright (C) 1994-2013 David Weenink
+ * Copyright (C) 1994-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -60,8 +60,8 @@ Thing_define (PowerCepstrum, Cepstrum) {
 	ny = 1
 */
 
-Cepstrum Cepstrum_create (double qmax, long nq);
-PowerCepstrum PowerCepstrum_create (double qmax, long nq);
+autoCepstrum Cepstrum_create (double qmax, long nq);
+autoPowerCepstrum PowerCepstrum_create (double qmax, long nq);
 /* Preconditions:
 		nq >= 2;
 	Postconditions:
@@ -96,16 +96,16 @@ double PowerCepstrum_getPeakProminence_hillenbrand (PowerCepstrum me, double pit
 double PowerCepstrum_getRNR (PowerCepstrum me, double pitchFloor, double pitchCeiling, double f0fractionalWidth);
 double PowerCepstrum_getPeakProminence (PowerCepstrum me, double pitchFloor, double pitchCeiling, int interpolation, double qstartFit, double qendFit, int lineType, int fitMethod, double *qpeak);
 void PowerCepstrum_fitTiltLine (PowerCepstrum me, double qmin, double qmax, double *slope, double *intercept, int lineType, int method);
-PowerCepstrum PowerCepstrum_subtractTilt (PowerCepstrum me, double qstartFit, double qendFit, int lineType, int fitMethod);
+autoPowerCepstrum PowerCepstrum_subtractTilt (PowerCepstrum me, double qstartFit, double qendFit, int lineType, int fitMethod);
 void PowerCepstrum_subtractTilt_inline (PowerCepstrum me, double qstartFit, double qendFit, int lineType, int fitMethod);
-PowerCepstrum PowerCepstrum_subtractTilt (PowerCepstrum me, double qstartFit, double qendFit, int lineType, int fitMethod);
+
 void PowerCepstrum_smooth_inline (PowerCepstrum me, double quefrencyAveragingWindow, long numberOfIterations);
-PowerCepstrum PowerCepstrum_smooth (PowerCepstrum me, double quefrencyAveragingWindow, long numberOfIterations);
+autoPowerCepstrum PowerCepstrum_smooth (PowerCepstrum me, double quefrencyAveragingWindow, long numberOfIterations);
 
-Matrix PowerCepstrum_to_Matrix (PowerCepstrum me);
-PowerCepstrum Matrix_to_PowerCepstrum (Matrix me);
-PowerCepstrum Matrix_to_PowerCepstrum_row (Matrix me, long row);
-PowerCepstrum Matrix_to_PowerCepstrum_column (Matrix me, long col);
-PowerCepstrum Cepstrum_downto_PowerCepstrum (Cepstrum me);
+autoMatrix PowerCepstrum_to_Matrix (PowerCepstrum me);
+autoPowerCepstrum Matrix_to_PowerCepstrum (Matrix me);
+autoPowerCepstrum Matrix_to_PowerCepstrum_row (Matrix me, long row);
+autoPowerCepstrum Matrix_to_PowerCepstrum_column (Matrix me, long col);
+autoPowerCepstrum Cepstrum_downto_PowerCepstrum (Cepstrum me);
 
 #endif /* _Cepstrum_h_ */
diff --git a/LPC/Cepstrum_and_Spectrum.cpp b/LPC/Cepstrum_and_Spectrum.cpp
index f63bf94..c597150 100644
--- a/LPC/Cepstrum_and_Spectrum.cpp
+++ b/LPC/Cepstrum_and_Spectrum.cpp
@@ -1,6 +1,6 @@
 /* Cepstrum_and_Spectrum.cpp
  *
- * Copyright (C) 1994-2012 David Weenink
+ * Copyright (C) 1994-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,7 +30,7 @@
 #include "Spectrum_extensions.h"
 #include "Sound_and_Spectrum.h"
 
-Cepstrum Spectrum_to_Cepstrum_cmplx (Spectrum me) {
+static autoCepstrum Spectrum_to_Cepstrum_cmplx (Spectrum me) {
 	try {
 		autoMatrix unwrap = Spectrum_unwrap (me);
 		autoSpectrum sx = Data_copy (me);
@@ -39,7 +39,7 @@ Cepstrum Spectrum_to_Cepstrum_cmplx (Spectrum me) {
 
 		for (long i = 1; i <= my nx; i ++) {
 			double xa = unwrap -> z[1][i];
-			sx -> z[1][i] = xa > 0 ? 0.5 * log (xa) : -300;
+			sx -> z[1][i] = xa > 0.0 ? 0.5 * log (xa) : -300.0;
 			sx -> z[2][i] = unwrap -> z[2][i];
 		}
 
@@ -48,13 +48,13 @@ Cepstrum Spectrum_to_Cepstrum_cmplx (Spectrum me) {
 		autoSound x = Spectrum_to_Sound (sx.peek());
 		autoCepstrum thee = Cepstrum_create (x -> xmax - x -> xmin, x -> nx);
 		NUMvector_copyElements (x -> z[1], thy z[1], 1, x -> nx);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Cepstrum created.");
+		Melder_throw (me, U": no Cepstrum created.");
 	}
 }
 
-PowerCepstrum Spectrum_to_PowerCepstrum (Spectrum me) {
+autoPowerCepstrum Spectrum_to_PowerCepstrum (Spectrum me) {
 	try {
 		autoSpectrum dBspectrum = Data_copy (me);
 		double *re = dBspectrum -> z[1], *im = dBspectrum -> z[2];
@@ -68,13 +68,13 @@ PowerCepstrum Spectrum_to_PowerCepstrum (Spectrum me) {
 			double val = cepstrum -> z[1][i];
 			thy z[1][i] = val * val;
 		}
-		return thee.transfer ();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
-Cepstrum Spectrum_to_Cepstrum (Spectrum me) {
+autoCepstrum Spectrum_to_Cepstrum (Spectrum me) {
 	try {
 		autoSpectrum dBspectrum = Data_copy (me);
 		double *re = dBspectrum -> z[1], *im = dBspectrum -> z[2];
@@ -88,13 +88,13 @@ Cepstrum Spectrum_to_Cepstrum (Spectrum me) {
 			double val = cepstrum -> z[1][i];
 			thy z[1][i] = val;
 		}
-		return thee.transfer ();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
-Spectrum Cepstrum_to_Spectrum (Cepstrum me) { //TODO power cepstrum
+autoSpectrum Cepstrum_to_Spectrum (Cepstrum me) { //TODO power cepstrum
 	try {
 		autoCepstrum cepstrum = Data_copy (me);
 		cepstrum ->  z[1][1] = my z[1][1];
@@ -108,18 +108,18 @@ Spectrum Cepstrum_to_Spectrum (Cepstrum me) { //TODO power cepstrum
 			re[i] =  exp (0.5 * re[i]);   // i.e., sqrt (exp(re [i]))
 			im[i] = 0.0;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Spectrum created.");
+		Melder_throw (me, U": no Spectrum created.");
 	}
 }
 
-Cepstrum Spectrum_to_Cepstrum2 (Spectrum me) {
+static autoCepstrum Spectrum_to_Cepstrum2 (Spectrum me) {
 	try {
 		autoNUMfft_Table fftTable;
 		// originalNumberOfSamplesProbablyOdd irrelevant
 		if (my x1 != 0.0) {
-			Melder_throw ("A Fourier-transformable Spectrum must have a first frequency of 0 Hz, not ", my x1, L" Hz.");
+			Melder_throw (U"A Fourier-transformable Spectrum must have a first frequency of 0 Hz, not ", my x1, U" Hz.");
 		}
 		long numberOfSamples = 2 * my nx - 2;
 		autoCepstrum thee = Cepstrum_create (0.5 / my dx, my nx);
@@ -131,7 +131,7 @@ Cepstrum Spectrum_to_Cepstrum2 (Spectrum me) {
 		fftbuf[1] = my v_getValueAtSample (1, 0, 2);
 		for (long i = 2; i < my nx; i++) {
 			fftbuf [i + i - 2] = my v_getValueAtSample (i, 0, 2);
-			fftbuf [i + i - 1] = 0;
+			fftbuf [i + i - 1] = 0.0;
 		}
 		fftbuf [numberOfSamples] = my v_getValueAtSample (my nx, 0, 2);
 		NUMfft_backward (&fftTable, fftbuf.peek());
@@ -139,14 +139,14 @@ Cepstrum Spectrum_to_Cepstrum2 (Spectrum me) {
 			double val = fftbuf[i] / numberOfSamples; // scaling 1/n because ifft(fft(1))= n;
 			thy z[1][i] = val * val; // power cepstrum
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Cepstrum.");
+		Melder_throw (me, U": not converted to Cepstrum.");
 	}
 }
 
 
-Spectrum Cepstrum_to_Spectrum2 (Cepstrum me) { //TODO power cepstrum
+static autoSpectrum Cepstrum_to_Spectrum2 (Cepstrum me) { //TODO power cepstrum
 	try {
 		autoNUMfft_Table fftTable;
 		long numberOfSamples = 2 * my nx - 2;
@@ -155,7 +155,7 @@ Spectrum Cepstrum_to_Spectrum2 (Cepstrum me) { //TODO power cepstrum
 		autoSpectrum thee = Spectrum_create (0.5 / my dx, my nx);
 		fftbuf[1] = sqrt (my z[1][1]);
 		for (long i = 2; i <= my nx; i++) {
-			fftbuf[i] = 2 * sqrt (my z[1][i]);
+			fftbuf[i] = 2.0 * sqrt (my z[1][i]);
 		}
 		// fftbuf[my nx+1 ... numberOfSamples] = 0
 		NUMfft_Table_init (&fftTable, numberOfSamples);
@@ -168,12 +168,12 @@ Spectrum Cepstrum_to_Spectrum2 (Cepstrum me) { //TODO power cepstrum
 		}
 		thy z[1][my nx] = fabs (fftbuf[numberOfSamples]);
 		for (long i = 1; i <= my nx; i++) {
-			thy z[1][i] = exp (NUMln10 * thy z[1][i] / 20) * 2e-5 / sqrt (2 * thy dx);
-			thy z[2][i] = 0;
+			thy z[1][i] = exp (NUMln10 * thy z[1][i] / 20.0) * 2e-5 / sqrt (2 * thy dx);
+			thy z[2][i] = 0.0;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Spectrum created.");
+		Melder_throw (me, U": no Spectrum created.");
 	}
 }
 
diff --git a/LPC/Cepstrum_and_Spectrum.h b/LPC/Cepstrum_and_Spectrum.h
index 17daeae..30e9a61 100644
--- a/LPC/Cepstrum_and_Spectrum.h
+++ b/LPC/Cepstrum_and_Spectrum.h
@@ -1,11 +1,31 @@
 #ifndef _Cepstrum_and_Spectrum_h_
 #define _Cepstrum_and_Spectrum_h_
-/* David Weenink, 20010101 */
+/* Cepstrum_and_Spectrum.h
+ *
+ * Copyright (C) 1994-2012, 2015 David Weenink
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
 
 #include "Spectrum.h"
 #include "Cepstrum.h"
 
-Cepstrum Spectrum_to_Cepstrum (Spectrum me);
-Spectrum Cepstrum_to_Spectrum (Cepstrum me);
-PowerCepstrum Spectrum_to_PowerCepstrum (Spectrum me);
+autoCepstrum Spectrum_to_Cepstrum (Spectrum me);
+
+autoSpectrum Cepstrum_to_Spectrum (Cepstrum me);
+
+autoPowerCepstrum Spectrum_to_PowerCepstrum (Spectrum me);
+
 #endif /* _Cepstrum_and_Spectrum_h_ */
diff --git a/LPC/Cepstrumc.cpp b/LPC/Cepstrumc.cpp
index 0cf212f..bf328b8 100644
--- a/LPC/Cepstrumc.cpp
+++ b/LPC/Cepstrumc.cpp
@@ -1,6 +1,6 @@
 /* Cepstrumc.c
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -50,13 +50,13 @@
 Thing_implement (Cepstrumc, Sampled, 1);
 
 void structCepstrumc :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"  Start time: ", Melder_double (xmin));
-	MelderInfo_writeLine (L"  End time: ", Melder_double (xmax));
-	MelderInfo_writeLine (L"  Number of frames: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"  Time step: ", Melder_double (dx));
-	MelderInfo_writeLine (L"  First frame at: ", Melder_double (x1));
-	MelderInfo_writeLine (L"  Number of coefficients: ", Melder_integer (maxnCoefficients));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"  Start time: ", xmin);
+	MelderInfo_writeLine (U"  End time: ", xmax);
+	MelderInfo_writeLine (U"  Number of frames: ", nx);
+	MelderInfo_writeLine (U"  Time step: ", dx);
+	MelderInfo_writeLine (U"  First frame at: ", x1);
+	MelderInfo_writeLine (U"  Number of coefficients: ", maxnCoefficients);
 }
 
 void Cepstrumc_Frame_init (Cepstrumc_Frame me, int nCoefficients) {
@@ -72,14 +72,14 @@ void Cepstrumc_init (Cepstrumc me, double tmin, double tmax, long nt, double dt,
 	my frame = NUMvector<structCepstrumc_Frame> (1, nt);
 }
 
-Cepstrumc Cepstrumc_create (double tmin, double tmax, long nt, double dt, double t1,
+autoCepstrumc Cepstrumc_create (double tmin, double tmax, long nt, double dt, double t1,
                             int nCoefficients, double samplingFrequency) {
 	try {
 		autoCepstrumc me = Thing_new (Cepstrumc);
 		Cepstrumc_init (me.peek(), tmin, tmax, nt, dt, t1, nCoefficients, samplingFrequency);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Cepstrum not created.");
+		Melder_throw (U"Cepstrum not created.");
 	}
 }
 
@@ -106,22 +106,21 @@ static void regression (Cepstrumc me, long frame, double r[], long nr) {
 	}
 }
 
-DTW Cepstrumc_to_DTW (Cepstrumc me, Cepstrumc thee, double wc, double wle,
-                      double wr, double wer, double dtr, int matchStart, int matchEnd, int constraint) {
+autoDTW Cepstrumc_to_DTW (Cepstrumc me, Cepstrumc thee, double wc, double wle, double wr, double wer, double dtr, int matchStart, int matchEnd, int constraint) {
 	try {
-		long nr = dtr / my dx;
+		long nr = (long) floor (dtr / my dx);
 
 		if (my maxnCoefficients != thy maxnCoefficients) {
-			Melder_throw ("Cepstrumc orders must be equal.");
+			Melder_throw (U"Cepstrumc orders must be equal.");
 		}
 		if (wr != 0 && nr < 2) {
-			Melder_throw ("Time window for regression coefficients too small.");
+			Melder_throw (U"Time window for regression coefficients too small.");
 		}
 		if (nr % 2 == 0) {
 			nr++;
 		}
 		if (wr != 0) {
-			Melder_casual ("Number of frames used for regression coefficients %ld", nr);
+			Melder_casual (U"Number of frames used for regression coefficients ", nr);
 		}
 		autoDTW him = DTW_create (my xmin, my xmax, my nx, my dx, my x1, thy xmin, thy xmax, thy nx, thy dx, thy x1);
 		autoNUMvector<double> ri (0L, my maxnCoefficients);
@@ -129,7 +128,7 @@ DTW Cepstrumc_to_DTW (Cepstrumc me, Cepstrumc thee, double wc, double wle,
 
 		// Calculate distance matrix
 
-		autoMelderProgress progress (L"");
+		autoMelderProgress progress (U"");
 		for (long i = 1; i <= my nx; i++) {
 			Cepstrumc_Frame fi = & my frame[i];
 			regression (me, i, ri.peek(), nr);
@@ -164,17 +163,17 @@ DTW Cepstrumc_to_DTW (Cepstrumc me, Cepstrumc thee, double wc, double wle,
 				dist /= wc + wle + wr + wer;
 				his z[i][j] = sqrt (dist); // prototype along y-direction
 			}
-			Melder_progress ( (double) i / my nx, L"Calculate distances: frame ",
-			                   Melder_integer (i), L" from ", Melder_integer (my nx), L".");
+			Melder_progress ( (double) i / my nx, U"Calculate distances: frame ",
+			                   i, U" from ", my nx, U".");
 		}
 		DTW_findPath (him.peek(), matchStart, matchEnd, constraint);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("DTW not created.");
+		Melder_throw (U"DTW not created.");
 	}
 }
 
-Matrix Cepstrumc_to_Matrix (Cepstrumc me) {
+autoMatrix Cepstrumc_to_Matrix (Cepstrumc me) {
 	try {
 		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1,
 		                                 0, my maxnCoefficients, my maxnCoefficients + 1, 1, 0);
@@ -185,9 +184,9 @@ Matrix Cepstrumc_to_Matrix (Cepstrumc me) {
 				thy z[j][i] = his c[j - 1];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Matrix created.");
+		Melder_throw (me, U": no Matrix created.");
 	}
 }
 
diff --git a/LPC/Cepstrumc.h b/LPC/Cepstrumc.h
index 49b30d9..e2621d8 100644
--- a/LPC/Cepstrumc.h
+++ b/LPC/Cepstrumc.h
@@ -2,7 +2,7 @@
 #define _Cepstrumc_h_
 /* Cepstrumc.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,14 +36,14 @@ oo_CLASS_CREATE (Cepstrumc, Sampled);
 void Cepstrumc_init (Cepstrumc me, double tmin, double tmax, long nt, double dt, double t1,
 	int nCoefficients, double samplingFrequency);
 	
-Cepstrumc Cepstrumc_create (double tmin, double tmax, long nt, double dt, double t1,
+autoCepstrumc Cepstrumc_create (double tmin, double tmax, long nt, double dt, double t1,
 	int nCoefficients, double samplingFrequency);
 
 /******************* Frames ************************************************/
 
 void Cepstrumc_Frame_init (Cepstrumc_Frame me, int nCoefficients);
 	
-DTW Cepstrumc_to_DTW ( Cepstrumc me, Cepstrumc thee, double wc, double wle,
+autoDTW Cepstrumc_to_DTW ( Cepstrumc me, Cepstrumc thee, double wc, double wle,
 	double wr, double wer, double dtr, int matchStart, int matchEnd, int constraint);
 /*
 	1. Calculate distances between Cepstra:
@@ -64,6 +64,6 @@ DTW Cepstrumc_to_DTW ( Cepstrumc me, Cepstrumc thee, double wc, double wle,
 	at least one of wc, wle, wr, wer != 0
 */
 
-Matrix Cepstrumc_to_Matrix (Cepstrumc me);
+autoMatrix Cepstrumc_to_Matrix (Cepstrumc me);
 
 #endif /* _Cepstrumc_h_ */
diff --git a/LPC/Cepstrumc_def.h b/LPC/Cepstrumc_def.h
index 4004d50..fedb108 100644
--- a/LPC/Cepstrumc_def.h
+++ b/LPC/Cepstrumc_def.h
@@ -27,7 +27,7 @@ oo_DEFINE_STRUCT (Cepstrumc_Frame)
 
 	oo_INT (nCoefficients)
 	#if oo_READING_BINARY
-		if (localVersion == 0)
+		if (formatVersion == 0)
 		{
 			oo_FLOAT_VECTOR_FROM (c, 0, nCoefficients)
 		}
@@ -51,8 +51,8 @@ oo_DEFINE_CLASS (Cepstrumc, Sampled)
 	oo_STRUCT_VECTOR (Cepstrumc_Frame, frame, nx)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (Cepstrumc)
diff --git a/LPC/Formant_extensions.cpp b/LPC/Formant_extensions.cpp
index a5744ec..762732f 100644
--- a/LPC/Formant_extensions.cpp
+++ b/LPC/Formant_extensions.cpp
@@ -1,6 +1,6 @@
 /* Formant_extensions.c
  *
- * Copyright (C) 2012 David Weenink
+ * Copyright (C) 2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,7 +24,7 @@
 #include "Formant_extensions.h"
 #include "NUM2.h"
 
-void Formant_formula (Formant me, double tmin, double tmax, long formantmin, long formantmax, Interpreter interpreter, wchar_t *expression) {
+void Formant_formula (Formant me, double tmin, double tmax, long formantmin, long formantmax, Interpreter interpreter, char32 *expression) {
 	try {
 		long numberOfPossibleFormants = my maxnFormants;
 		if (tmax <= tmin) {
@@ -48,8 +48,8 @@ void Formant_formula (Formant me, double tmin, double tmax, long formantmin, lon
 			}
 		}
 		// Apply formula
-		double ymin = 2 * formantmin - 1, ymax = 2 * formantmax;
-		Matrix_formula_part (fb.peek(), tmin, tmax, ymin, ymax, expression, interpreter, NULL);
+		double ymin = 2.0 * formantmin - 1.0, ymax = 2.0 * formantmax;
+		Matrix_formula_part (fb.peek(), tmin, tmax, ymin, ymax, expression, interpreter, nullptr);
 		// Put results back in Formant
 		long ixmin, ixmax, iymin, iymax;
 		(void) Matrix_getWindowSamplesX (fb.peek(), tmin, tmax, & ixmin, & ixmax);
@@ -86,20 +86,20 @@ void Formant_formula (Formant me, double tmin, double tmax, long formantmin, lon
 			frame ->  nFormants = iformantto;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered.");
+		Melder_throw (me, U": not filtered.");
 	}
 }
 
-IntensityTier Formant_and_Spectrogram_to_IntensityTier (Formant me, Spectrogram thee, long iformant) {
+autoIntensityTier Formant_and_Spectrogram_to_IntensityTier (Formant me, Spectrogram thee, long iformant) {
 	try {
 		if (my xmin != thy xmin || my xmax != thy xmax) {
-			Melder_throw ("The start and end times of the Formant and the Spectrogram must be equal.");
+			Melder_throw (U"The start and end times of the Formant and the Spectrogram must be equal.");
 		}
 		if (iformant < 1 || iformant > my maxnFormants) {
-			Melder_throw ("Formant number not in range [1, ", my maxnFormants, "].");
+			Melder_throw (U"Formant number not in range [1, ", my maxnFormants, U"].");
 		}
 		autoIntensityTier him = IntensityTier_create (my xmin, my xmax);
-		double previousValue = -80000; // can never occur
+		double previousValue = -80000.0; // can never occur
 		double previousTime = my xmin;
 		for (long iframe = 1; iframe <= my nx; iframe++) {
 			Formant_Frame frame = & my d_frames [iframe];
@@ -121,9 +121,9 @@ IntensityTier Formant_and_Spectrogram_to_IntensityTier (Formant me, Spectrogram
 			}
 			previousValue = value;
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("IntensityTier not created from ", me, " and ", thee, ".");
+		Melder_throw (U"IntensityTier not created from ", me, U" and ", thee, U".");
 	}
 }
 
diff --git a/LPC/Formant_extensions.h b/LPC/Formant_extensions.h
index 6bf7dc6..57048fa 100644
--- a/LPC/Formant_extensions.h
+++ b/LPC/Formant_extensions.h
@@ -2,7 +2,7 @@
 #define _Formant_extensions_h_
 /* Formant_extensions.h
  *
- * Copyright (C) 2012 David Weenink
+ * Copyright (C) 2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,7 +29,7 @@
 #include "Spectrogram.h"
 
 
-void Formant_formula (Formant me, double tmin, double tmax, long formantmin, long formantmax, Interpreter interpreter, wchar_t *expression);
-IntensityTier Formant_and_Spectrogram_to_IntensityTier (Formant me, Spectrogram thee, long iformant);
+void Formant_formula (Formant me, double tmin, double tmax, long formantmin, long formantmax, Interpreter interpreter, char32 *expression);
+autoIntensityTier Formant_and_Spectrogram_to_IntensityTier (Formant me, Spectrogram thee, long iformant);
 
 #endif /* _Formant_extensions_h_ */
diff --git a/LPC/LPC.cpp b/LPC/LPC.cpp
index 6e939db..518d3ce 100644
--- a/LPC/LPC.cpp
+++ b/LPC/LPC.cpp
@@ -1,6 +1,6 @@
 /* LPC.cpp
  *
- * Copyright (C) 1994-2014 David Weenink
+ * Copyright (C) 1994-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -53,13 +53,12 @@
 Thing_implement (LPC, Sampled, 1);
 
 void structLPC :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain: ", Melder_double (xmin), L" to ", Melder_double (xmax),
-	                       L" (s).");
-	MelderInfo_writeLine (L"Prediction order: ", Melder_integer (maxnCoefficients));
-	MelderInfo_writeLine (L"Number of frames: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"Time step: ", Melder_double (dx), L" (s).");
-	MelderInfo_writeLine (L"First frame at: ", Melder_double (x1), L" (s).");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain: ", xmin, U" to ", xmax, U" (s).");
+	MelderInfo_writeLine (U"Prediction order: ", maxnCoefficients);
+	MelderInfo_writeLine (U"Number of frames: ", nx);
+	MelderInfo_writeLine (U"Time step: ", dx, U" (s).");
+	MelderInfo_writeLine (U"First frame at: ", x1, U" (s).");
 }
 
 void LPC_Frame_init (LPC_Frame me, int nCoefficients) {
@@ -77,14 +76,14 @@ void LPC_init (LPC me, double tmin, double tmax, long nt, double dt, double t1,
 	my d_frames = NUMvector<structLPC_Frame> (1, nt);
 }
 
-LPC LPC_create (double tmin, double tmax, long nt, double dt, double t1,
+autoLPC LPC_create (double tmin, double tmax, long nt, double dt, double t1,
                 int predictionOrder, double samplingPeriod) {
 	try {
 		autoLPC me = Thing_new (LPC);
 		LPC_init (me.peek(), tmin, tmax, nt, dt, t1, predictionOrder, samplingPeriod);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("LPC not created.");
+		Melder_throw (U"LPC not created.");
 	}
 }
 
@@ -119,37 +118,37 @@ void LPC_drawGain (LPC me, Graphics g, double tmin, double tmax, double gmin, do
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (seconds)");
-		Graphics_textLeft (g, 1, L"Gain");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_textBottom (g, true, U"Time (seconds)");
+		Graphics_textLeft (g, true, U"Gain");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
 void LPC_drawPoles (LPC me, Graphics g, double time, int garnish) {
 	autoPolynomial p = LPC_to_Polynomial (me, time);
 	autoRoots r = Polynomial_to_Roots (p.peek());
-	Roots_draw (r.peek(), g, -1, 1, -1, 1, L"+", 12, garnish);
+	Roots_draw (r.peek(), g, -1.0, 1.0, -1.0, 1.0, U"+", 12, garnish);
 }
 
-Matrix LPC_downto_Matrix_lpc (LPC me) {
+autoMatrix LPC_downto_Matrix_lpc (LPC me) {
 	try {
-		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 0.5, 0.5 + my maxnCoefficients, my maxnCoefficients, 1, 1);
+		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 0.5, 0.5 + my maxnCoefficients, my maxnCoefficients, 1.0, 1.0);
 		for (long j = 1; j <= my nx; j++) {
 			LPC_Frame lpc = & my d_frames[j];
 			for (long i = 1; i <= lpc -> nCoefficients; i++) {
 				thy z[i][j] = lpc -> a[i];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Matrix with linear prediction coefficients created.");
+		Melder_throw (me, U": no Matrix with linear prediction coefficients created.");
 	}
 }
 
-Matrix LPC_downto_Matrix_rc (LPC me) {
+autoMatrix LPC_downto_Matrix_rc (LPC me) {
 	try {
-		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 0.5, 0.5 + my maxnCoefficients, my maxnCoefficients, 1, 1);
+		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 0.5, 0.5 + my maxnCoefficients, my maxnCoefficients, 1.0, 1.0);
 		autoNUMvector<double> rc (1, my maxnCoefficients);
 		for (long j = 1; j <= my nx; j++) {
 			LPC_Frame lpc = & my d_frames[j];
@@ -158,15 +157,15 @@ Matrix LPC_downto_Matrix_rc (LPC me) {
 				thy z[i][j] = rc[i];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Matrix with relection coefficients created.");
+		Melder_throw (me, U": no Matrix with relection coefficients created.");
 	}
 }
 
-Matrix LPC_downto_Matrix_area (LPC me) {
+autoMatrix LPC_downto_Matrix_area (LPC me) {
 	try {
-		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 0.5, 0.5 + my maxnCoefficients, my maxnCoefficients, 1, 1);
+		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 0.5, 0.5 + my maxnCoefficients, my maxnCoefficients, 1.0, 1.0);
 		autoNUMvector<double> rc (1, my maxnCoefficients);
 		autoNUMvector<double> area (1, my maxnCoefficients);
 		for (long j = 1; j <= my nx; j++) {
@@ -177,9 +176,9 @@ Matrix LPC_downto_Matrix_area (LPC me) {
 				thy z[i][j] = area[i];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Matrix with areas created.");
+		Melder_throw (me, U": no Matrix with areas created.");
 	}
 }
 
diff --git a/LPC/LPC.h b/LPC/LPC.h
index d824b07..5a42502 100644
--- a/LPC/LPC.h
+++ b/LPC/LPC.h
@@ -2,7 +2,7 @@
 #define _LPC_h_
 /* LPC.h
  *
- * Copyright (C) 1994-2012 David Weenink
+ * Copyright (C) 1994-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,7 +36,7 @@ oo_CLASS_CREATE (LPC, Sampled);
 void LPC_init (LPC me, double tmin, double tmax, long nt, double dt, double t1,
 	int predictionOrder, double samplingPeriod);
 
-LPC LPC_create (double tmin, double tmax, long nt, double dt, double t1,
+autoLPC LPC_create (double tmin, double tmax, long nt, double dt, double t1,
 	int predictionOrder, double samplingPeriod);
 
 void LPC_drawGain (LPC me, Graphics g, double t1, double t2,
@@ -44,9 +44,9 @@ void LPC_drawGain (LPC me, Graphics g, double t1, double t2,
 
 void LPC_drawPoles (LPC me, Graphics g, double time, int garnish);
 
-Matrix LPC_downto_Matrix_lpc (LPC me);
-Matrix LPC_downto_Matrix_rc (LPC me);
-Matrix LPC_downto_Matrix_area (LPC me);
+autoMatrix LPC_downto_Matrix_lpc (LPC me);
+autoMatrix LPC_downto_Matrix_rc (LPC me);
+autoMatrix LPC_downto_Matrix_area (LPC me);
 
 /******************* Frames ************************************************/
 
diff --git a/LPC/LPC_and_Cepstrumc.cpp b/LPC/LPC_and_Cepstrumc.cpp
index 417a76c..74c6c31 100644
--- a/LPC/LPC_and_Cepstrumc.cpp
+++ b/LPC/LPC_and_Cepstrumc.cpp
@@ -1,6 +1,6 @@
 /* LPC_and_Cepstrumc.cpp
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,7 +46,7 @@ void LPC_Frame_into_Cepstrumc_Frame (LPC_Frame me, Cepstrumc_Frame thee) {
 
 void Cepstrumc_Frame_into_LPC_Frame (Cepstrumc_Frame me, LPC_Frame thee) {
 	double *c = my c, *a = thy a;
-	thy gain = exp (2 * c[0]);
+	thy gain = exp (2.0 * c[0]);
 	if (thy nCoefficients == 0) {
 		return;
 	}
@@ -66,7 +66,7 @@ void Cepstrumc_Frame_into_LPC_Frame (Cepstrumc_Frame me, LPC_Frame thee) {
 	}
 }
 
-Cepstrumc LPC_to_Cepstrumc (LPC me) {
+autoCepstrumc LPC_to_Cepstrumc (LPC me) {
 	try {
 		autoCepstrumc thee = Cepstrumc_create (my xmin, my xmax, my nx, my dx, my x1,
 		                                       my maxnCoefficients, 1.0 / my samplingPeriod);
@@ -75,13 +75,13 @@ Cepstrumc LPC_to_Cepstrumc (LPC me) {
 			Cepstrumc_Frame_init (& thy frame[i], my d_frames[i].nCoefficients);
 			LPC_Frame_into_Cepstrumc_Frame (& my d_frames[i], & thy frame[i]);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Cepstrum created.");
+		Melder_throw (me, U": no Cepstrum created.");
 	}
 }
 
-LPC Cepstrumc_to_LPC (Cepstrumc me) {
+autoLPC Cepstrumc_to_LPC (Cepstrumc me) {
 	try {
 		autoLPC thee = LPC_create (my xmin, my xmax, my nx, my dx, my x1,
 		                           my maxnCoefficients, 1.0 / my samplingFrequency);
@@ -89,9 +89,9 @@ LPC Cepstrumc_to_LPC (Cepstrumc me) {
 			LPC_Frame_init (& thy d_frames[i], my frame[i].nCoefficients);
 			Cepstrumc_Frame_into_LPC_Frame (& my frame[i], & thy d_frames[i]);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ":no LPC created.");
+		Melder_throw (me, U":no LPC created.");
 	}
 }
 
diff --git a/LPC/LPC_and_Cepstrumc.h b/LPC/LPC_and_Cepstrumc.h
index f193798..40b55d6 100644
--- a/LPC/LPC_and_Cepstrumc.h
+++ b/LPC/LPC_and_Cepstrumc.h
@@ -2,7 +2,7 @@
 #define _LPC_and_Cepstrumc_h_
 /* LPC_and_Cepstrumc.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,19 +28,11 @@
 #include "LPC.h"
 #include "Cepstrumc.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
+autoCepstrumc LPC_to_Cepstrumc (LPC me);
 
-Cepstrumc LPC_to_Cepstrumc (LPC me);
-
-LPC Cepstrumc_to_LPC (Cepstrumc me);
+autoLPC Cepstrumc_to_LPC (Cepstrumc me);
 
 void LPC_Frame_into_Cepstrumc_Frame (LPC_Frame me, Cepstrumc_Frame thee);
 void Cepstrumc_Frame_into_LPC_Frame (Cepstrumc_Frame me, LPC_Frame thee);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _LPC_and_Cepstrumc_h_ */
diff --git a/LPC/LPC_and_Formant.cpp b/LPC/LPC_and_Formant.cpp
index 2f43644..015c97d 100644
--- a/LPC/LPC_and_Formant.cpp
+++ b/LPC/LPC_and_Formant.cpp
@@ -1,6 +1,6 @@
 /* LPC_and_Formant.cpp
  *
- * Copyright (C) 1994-2013 David Weenink
+ * Copyright (C) 1994-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -54,7 +54,7 @@ void Roots_into_Formant_Frame (Roots me, Formant_Frame thee, double samplingFreq
 		if (my v[i].im < 0) {
 			continue;
 		}
-		double f = fabs (atan2 (my v[i].im, my v[i].re)) * samplingFrequency / 2 / NUMpi;
+		double f = fabs (atan2 (my v[i].im, my v[i].re)) * samplingFrequency / 2.0 / NUMpi;
 		if (f >= fLow && f <= fHigh) {
 			/*b = - log (my v[i].re * my v[i].re + my v[i].im * my v[i].im) * samplingFrequency / 2 / NUMpi;*/
 			double b = - log (dcomplex_abs (my v[i])) * samplingFrequency / NUMpi;
@@ -84,22 +84,22 @@ void LPC_Frame_into_Formant_Frame (LPC_Frame me, Formant_Frame thee, double samp
 	Roots_into_Formant_Frame (r.peek(), thee, 1 / samplingPeriod, margin);
 }
 
-Formant LPC_to_Formant (LPC me, double margin) {
+autoFormant LPC_to_Formant (LPC me, double margin) {
 	try {
 		double samplingFrequency = 1.0 / my samplingPeriod;
 		long nmax = my maxnCoefficients, err = 0;
 		long interval = nmax > 20 ? 1 : 10;
 
 		if (nmax > 99) {
-			Melder_throw ("We cannot find the roots of a polynomial of order > 99.");
+			Melder_throw (U"We cannot find the roots of a polynomial of order > 99.");
 		}
 		if (margin >= samplingFrequency / 4) {
-			Melder_throw ("Margin must be smaller than ", samplingFrequency / 4, ".");
+			Melder_throw (U"Margin should be smaller than ", samplingFrequency / 4, U".");
 		}
 
 		autoFormant thee = Formant_create (my xmin, my xmax, my nx, my dx, my x1, (nmax + 1) / 2);
 
-		autoMelderProgress progress (L"LPC to Formant");
+		autoMelderProgress progress (U"LPC to Formant");
 
 		for (long i = 1; i <= my nx; i++) {
 			Formant_Frame formant = & thy d_frames[i];
@@ -115,18 +115,18 @@ Formant LPC_to_Formant (LPC me, double margin) {
 			}
 
 			if ( (interval == 1 || (i % interval) == 1)) {
-				Melder_progress ( (double) i / my nx, L"LPC to Formant: frame ", Melder_integer (i),
-				                   L" out of ", Melder_integer (my nx), L".");
+				Melder_progress ( (double) i / my nx, U"LPC to Formant: frame ", i,
+				                   U" out of ", my nx, U".");
 			}
 		}
 
 		Formant_sort (thee.peek());
 		if (err > 0) {
-			Melder_warning (Melder_integer (err), L" formant frames out of ", Melder_integer (my nx), L" suspect.");
+			Melder_warning (err, U" formant frames out of ", my nx, U" are suspect.");
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Formant created.");
+		Melder_throw (me, U": no Formant created.");
 	}
 }
 
@@ -169,7 +169,7 @@ void Formant_Frame_into_LPC_Frame (Formant_Frame me, LPC_Frame thee, double samp
 	thy gain = my intensity;
 }
 
-LPC Formant_to_LPC (Formant me, double samplingPeriod) {
+autoLPC Formant_to_LPC (Formant me, double samplingPeriod) {
 	try {
 		autoLPC thee = LPC_create (my xmin, my xmax, my nx, my dx, my x1, 2 * my maxnFormants, samplingPeriod);
 
@@ -181,9 +181,9 @@ LPC Formant_to_LPC (Formant me, double samplingPeriod) {
 			LPC_Frame_init (lpc, m);
 			Formant_Frame_into_LPC_Frame (f, lpc, samplingPeriod);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no LPC created.");
+		Melder_throw (me, U": no LPC created.");
 	}
 }
 
diff --git a/LPC/LPC_and_Formant.h b/LPC/LPC_and_Formant.h
index b3f372e..52a0d58 100644
--- a/LPC/LPC_and_Formant.h
+++ b/LPC/LPC_and_Formant.h
@@ -2,7 +2,7 @@
 #define  _LPC_and_Formant_h_
 /* LPC_and_Formant.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,13 +28,9 @@
 #include "Polynomial.h"
 #include "Formant.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
+autoFormant LPC_to_Formant (LPC me, double margin);
 
-Formant LPC_to_Formant (LPC me, double margin);
-
-LPC Formant_to_LPC (Formant me, double samplingPeriod);
+autoLPC Formant_to_LPC (Formant me, double samplingPeriod);
 
 void LPC_Frame_into_Formant_Frame (LPC_Frame me, Formant_Frame thee, 
 	double samplingPeriod, double margin);
@@ -47,8 +43,4 @@ void Roots_into_Formant_Frame (Roots me, Formant_Frame thee, double samplingFreq
 
 void Formant_Frame_init (Formant_Frame me, long nFormants);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _LPC_and_Formant_h_ */
diff --git a/LPC/LPC_and_LFCC.cpp b/LPC/LPC_and_LFCC.cpp
index 3d457c1..b102f12 100644
--- a/LPC/LPC_and_LFCC.cpp
+++ b/LPC/LPC_and_LFCC.cpp
@@ -1,6 +1,6 @@
 /* LPC_and_LFCC.cpp
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -56,7 +56,7 @@ void CC_Frame_into_LPC_Frame (CC_Frame me, LPC_Frame thee) {
 	long n = MIN (my numberOfCoefficients, thy nCoefficients);
 	double *c = my c, *a = thy a;
 
-	thy gain = exp (2 * my c0);
+	thy gain = exp (2.0 * my c0);
 
 	if (n < 1) {
 		return;
@@ -72,26 +72,25 @@ void CC_Frame_into_LPC_Frame (CC_Frame me, LPC_Frame thee) {
 	}
 }
 
-LFCC LPC_to_LFCC (LPC me, long numberOfCoefficients) {
+autoLFCC LPC_to_LFCC (LPC me, long numberOfCoefficients) {
 	try {
 		if (numberOfCoefficients < 1) {
 			numberOfCoefficients = my maxnCoefficients;
 		}
 
-		autoLFCC thee = LFCC_create (my xmin, my xmax, my nx, my dx, my x1,
-		                             numberOfCoefficients, 0, 0.5 / my samplingPeriod);
+		autoLFCC thee = LFCC_create (my xmin, my xmax, my nx, my dx, my x1, numberOfCoefficients, 0, 0.5 / my samplingPeriod);
 
 		for (long i = 1; i <= my nx; i++) {
 			CC_Frame_init (& thy frame[i], numberOfCoefficients);
 			LPC_Frame_into_CC_Frame (& my d_frames[i], & thy frame[i]);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no LFCC created.");
+		Melder_throw (me, U": no LFCC created.");
 	}
 }
 
-LPC LFCC_to_LPC (LFCC me, long numberOfCoefficients) {
+autoLPC LFCC_to_LPC (LFCC me, long numberOfCoefficients) {
 	try {
 		if (numberOfCoefficients < 1) {
 			numberOfCoefficients = my maximumNumberOfCoefficients;
@@ -103,12 +102,12 @@ LPC LFCC_to_LPC (LFCC me, long numberOfCoefficients) {
 			LPC_Frame_init (& thy d_frames[i], numberOfCoefficients);
 			CC_Frame_into_LPC_Frame (& my frame[i], & thy d_frames[i]);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no LPC created.");
+		Melder_throw (me, U": no LPC created.");
 	}
 }
 
 #undef MIN
 
-/* End of file LPC_and_LFCC.c  */
+/* End of file LPC_and_LFCC.cpp  */
diff --git a/LPC/LPC_and_LFCC.h b/LPC/LPC_and_LFCC.h
index 2323ed4..508ebe8 100644
--- a/LPC/LPC_and_LFCC.h
+++ b/LPC/LPC_and_LFCC.h
@@ -2,7 +2,7 @@
 #define _LPC_and_LFCC_h_
 /* LPC_and_LFCC.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,13 +28,9 @@
 #include "LPC.h"
 #include "LFCC.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
+autoLFCC LPC_to_LFCC (LPC me, long numberOfCoefficients);
 
-LFCC LPC_to_LFCC (LPC me, long numberOfCoefficients);
-
-LPC LFCC_to_LPC (LFCC me, long numberOfCoefficients);
+autoLPC LFCC_to_LPC (LFCC me, long numberOfCoefficients);
 
 void LPC_Frame_into_CC_Frame (LPC_Frame me, CC_Frame thee);
 /*
@@ -60,8 +56,4 @@ void CC_Frame_into_LPC_Frame (CC_Frame me, LPC_Frame thee);
 	1979 (page 4.3-6).
 */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _LPC_and_LFCC_h_ */
diff --git a/LPC/LPC_and_Polynomial.cpp b/LPC/LPC_and_Polynomial.cpp
index 2219ffd..784dec9 100644
--- a/LPC/LPC_and_Polynomial.cpp
+++ b/LPC/LPC_and_Polynomial.cpp
@@ -1,6 +1,6 @@
 /* LPC_and_Polynomial.cpp
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,27 +23,27 @@
 
 #include "LPC_and_Polynomial.h"
 
-Polynomial LPC_Frame_to_Polynomial (LPC_Frame me) {
+autoPolynomial LPC_Frame_to_Polynomial (LPC_Frame me) {
 	long degree = (long) my nCoefficients;
 	autoPolynomial thee = Polynomial_create (-1, 1, degree);
 	for (long i = 1; i <= degree; i++) {
 		thy coefficients[i] = my a[degree - i + 1];
 	}
 	thy coefficients[degree + 1] = 1;
-	return thee.transfer();
+	return thee;
 }
 
-Polynomial LPC_to_Polynomial (LPC me, double time) {
+autoPolynomial LPC_to_Polynomial (LPC me, double time) {
 	try {
 		long iFrame = Sampled_xToIndex (me, time);
 
 		if (iFrame < 1 || iFrame > my nx) {
-			Melder_throw ("invalid frame number.");
+			Melder_throw (U"invalid frame number.");
 		}
 		autoPolynomial thee = LPC_Frame_to_Polynomial (&my d_frames[iFrame]);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ":no Polynomial created.");
+		Melder_throw (me, U":no Polynomial created.");
 	}
 }
 
diff --git a/LPC/LPC_and_Polynomial.h b/LPC/LPC_and_Polynomial.h
index edd8f7d..f685655 100644
--- a/LPC/LPC_and_Polynomial.h
+++ b/LPC/LPC_and_Polynomial.h
@@ -2,7 +2,7 @@
 #define _LPC_and_Polynomial_h_
 /* LPC_and_Polynomial.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,16 +29,8 @@
 #include "LPC.h"
 #include "Polynomial.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
+autoPolynomial LPC_to_Polynomial (LPC me, double t);
 
-Polynomial LPC_to_Polynomial (LPC me, double t);
-
-Polynomial LPC_Frame_to_Polynomial (LPC_Frame me);
-
-#ifdef __cplusplus
-	}
-#endif
+autoPolynomial LPC_Frame_to_Polynomial (LPC_Frame me);
 
 #endif /* _LPC_and_Polynomial_h_ */
diff --git a/LPC/LPC_and_Tube.cpp b/LPC/LPC_and_Tube.cpp
index dc14776..75df1e9 100644
--- a/LPC/LPC_and_Tube.cpp
+++ b/LPC/LPC_and_Tube.cpp
@@ -1,6 +1,6 @@
 /* LPC_and_Tube.cpp
  *
- * Copyright (C) 1993-2012, 2014 David Weenink
+ * Copyright (C) 1993-2012, 2014-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -48,7 +48,7 @@ void LPC_Frame_into_Tube_Frame_rc (LPC_Frame me, Tube_Frame thee) {
 	for (long m = p; m > 0; m--) {
 		rc[m] = a[m];
 		if (fabs (rc[m]) > 1) {
-			Melder_throw ("Relection coefficient [", Melder_integer(m), "] larger 1.");    // TODO kan er geen Tube worden gemaakt?
+			Melder_throw (U"Relection coefficient [", m, U"] larger 1.");    // TODO kan er geen Tube worden gemaakt?
 		}
 		for (long i = 1; i < m; i++) {
 			b[i] = a[i];
@@ -72,7 +72,7 @@ double VocalTract_and_LPC_Frame_getMatchingLength (VocalTract me, LPC_Frame thee
 	try {
 		// match the average distance between the first two formants in the VocaTract and the LPC spectrum
 		long numberOfFrequencies = 1000;
-		double maximumFrequency = 5000;
+		double maximumFrequency = 5000.0;
 		autoSpectrum vts = VocalTract_to_Spectrum (me, numberOfFrequencies, maximumFrequency, glottalDamping, radiationDamping, internalDamping);
 		double samplingFrequency =  1000.0 * my nx;
 		autoSpectrum lps = Spectrum_create (0.5 * samplingFrequency, numberOfFrequencies);
@@ -85,7 +85,7 @@ double VocalTract_and_LPC_Frame_getMatchingLength (VocalTract me, LPC_Frame thee
 		double dl = - df / lp_f2;
 		return my dx * my nx * (1 + dl);
 	} catch (MelderError) {
-		Melder_throw (L"Length could not be determined from VocalTract and LPC_Frame.");
+		Melder_throw (U"Length could not be determined from VocalTract and LPC_Frame.");
 	}
 }
 
@@ -99,7 +99,7 @@ double LPC_Frame_getVTL_wakita (LPC_Frame me, double samplingPeriod, double refL
 	try {
 		long m = my nCoefficients;
 		double length, dlength = 0.001, wakita_length = NUMundefined;
-		double varMin = 1e38;
+		double varMin = 1e308;
 
 		memset (& lpc_struct, 0, sizeof (lpc_struct));
 		memset (& f_struct, 0, sizeof (f_struct));
@@ -118,7 +118,7 @@ double LPC_Frame_getVTL_wakita (LPC_Frame me, double samplingPeriod, double refL
 		// LPC_Frame_into_Formant_Frame performs the Formant_Frame_init !!
 
 		if (f -> nFormants < 1) {
-			Melder_throw ("Not enough formants.");
+			Melder_throw (U"Not enough formants.");
 		}
 
 		double *area = af -> c;
@@ -159,14 +159,14 @@ double LPC_Frame_getVTL_wakita (LPC_Frame me, double samplingPeriod, double refL
 
 			// step 6.2 Log(areas)
 
-			double logSum = 0;
+			double logSum = 0.0;
 			for (long i = 1; i <= af -> nSegments; i++) {
 				area[i] = log (area[i]);
 				logSum += area[i];
 			}
 
 			// step 6.3 and 7
-			double var = 0;
+			double var = 0.0;
 			for (long i = 1; i <= af -> nSegments; i++) {
 				double delta = area[i] - logSum / af -> nSegments;
 				var += delta * delta;
@@ -212,9 +212,9 @@ void VocalTract_setLength (VocalTract me, double newLength) {
 	my x1 = 0.5 * my dx;
 }
 
-VocalTract LPC_to_VocalTract (LPC me, double time, double glottalDamping, bool radiationDamping, bool internalDamping) {
+autoVocalTract LPC_to_VocalTract (LPC me, double time, double glottalDamping, bool radiationDamping, bool internalDamping) {
 	try {
-		long iframe = Sampled_xToIndex (me, time);
+		long iframe = Sampled_xToLowIndex (me, time);   // ppgb: BUG? Is rounding down the correct thing to do? not nearestIndex?
 		if (iframe < 1) {
 			iframe = 1;
 		}
@@ -225,13 +225,13 @@ VocalTract LPC_to_VocalTract (LPC me, double time, double glottalDamping, bool r
 		autoVocalTract thee = LPC_Frame_to_VocalTract (lpc, 0.17);
 		double length = VocalTract_and_LPC_Frame_getMatchingLength (thee.peek(), lpc, glottalDamping, radiationDamping, internalDamping);
 		VocalTract_setLength (thee.peek(), length);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no VocalTract created.");
+		Melder_throw (me, U": no VocalTract created.");
 	}
 }
 
-VocalTract LPC_Frame_to_VocalTract2 (LPC_Frame me, double length) {
+static autoVocalTract LPC_Frame_to_VocalTract2 (LPC_Frame me, double length) {
 	struct structTube_Frame area_struct = { 0 };
 	Tube_Frame area = & area_struct;
 	try {
@@ -248,14 +248,14 @@ VocalTract LPC_Frame_to_VocalTract2 (LPC_Frame me, double length) {
 			thy z[1][i] = area -> c[m + 1 - i];
 		}
 		area -> destroy ();
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
 		area -> destroy ();
-		Melder_throw ("No VocalTract created from LPC_Frame.");
+		Melder_throw (U"No VocalTract created from LPC_Frame.");
 	}
 }
 
-VocalTract LPC_Frame_to_VocalTract (LPC_Frame me, double length) {
+autoVocalTract LPC_Frame_to_VocalTract (LPC_Frame me, double length) {
 	try {
 		long m = my nCoefficients;
 		autoNUMvector<double> area (1, m + 1);
@@ -267,15 +267,15 @@ VocalTract LPC_Frame_to_VocalTract (LPC_Frame me, double length) {
 		for (long i = 1; i <= m; i++) {
 			thy z[1][i] = area[m + 1 - i];
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("No VocalTract created from LPC_Frame.");
+		Melder_throw (U"No VocalTract created from LPC_Frame.");
 	}
 }
 
-VocalTract LPC_to_VocalTract (LPC me, double time, double length) {
+autoVocalTract LPC_to_VocalTract (LPC me, double time, double length) {
 	try {
-		long iframe = Sampled_xToIndex (me, time);
+		long iframe = Sampled_xToLowIndex (me, time);   // ppgb: BUG? Is rounding down the correct thing to do?
 		if (iframe < 1) {
 			iframe = 1;
 		}
@@ -284,9 +284,9 @@ VocalTract LPC_to_VocalTract (LPC me, double time, double length) {
 		}
 		LPC_Frame lpc = & my d_frames[iframe];
 		autoVocalTract thee = LPC_Frame_to_VocalTract (lpc, length);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no VocalTract created.");
+		Melder_throw (me, U": no VocalTract created.");
 	}
 }
 
diff --git a/LPC/LPC_and_Tube.h b/LPC/LPC_and_Tube.h
index 84d3332..54b3e99 100644
--- a/LPC/LPC_and_Tube.h
+++ b/LPC/LPC_and_Tube.h
@@ -2,7 +2,7 @@
 #define _LPC_and_Tube_h_
 /* LPC_and_Tube.h
  *
- * Copyright (C) 1994-2012 David Weenink
+ * Copyright (C) 1994-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@
 void LPC_Frame_into_Tube_Frame_rc (LPC_Frame me, Tube_Frame thee);
 void LPC_Frame_into_Tube_Frame_area (LPC_Frame me, Tube_Frame thee);
 
-VocalTract LPC_Frame_to_VocalTract (LPC_Frame me, double length);
+autoVocalTract LPC_Frame_to_VocalTract (LPC_Frame me, double length);
 
 double LPC_Frame_getVTL_wakita (LPC_Frame me, double samplingPeriod, double refLength);
 double VocalTract_and_LPC_Frame_getMatchingLength (VocalTract me, LPC_Frame thee, double glottalDamping, bool radiationDamping, bool internalDamping);
@@ -40,9 +40,9 @@ int Tube_Frame_into_LPC_Frame_area (Tube_Frame me, LPC_Frame thee);
 
 int Tube_Frame_into_LPC_Frame_rc (Tube_Frame me, LPC_Frame thee);
 
-VocalTract LPC_to_VocalTract (LPC me, double time, double length);
+autoVocalTract LPC_to_VocalTract (LPC me, double time, double length);
 void VocalTract_setLength (VocalTract me, double newLength);
 
-VocalTract LPC_to_VocalTract (LPC me, double time, double glottalDamping, bool radiationDamping, bool internalDamping);
+autoVocalTract LPC_to_VocalTract (LPC me, double time, double glottalDamping, bool radiationDamping, bool internalDamping);
 
 #endif /* _LPC_and_Tube_h_ */
diff --git a/LPC/LPC_def.h b/LPC/LPC_def.h
index 323d6c4..fa649a4 100644
--- a/LPC/LPC_def.h
+++ b/LPC/LPC_def.h
@@ -23,7 +23,7 @@ oo_DEFINE_STRUCT (LPC_Frame)
 
 	oo_INT (nCoefficients)
 	#if oo_READING_BINARY
-		if (localVersion == 0)
+		if (formatVersion == 0)
 		{
 			oo_FLOAT_VECTOR (a, nCoefficients)
 			oo_FLOAT (gain)
@@ -51,8 +51,8 @@ oo_DEFINE_CLASS (LPC, Sampled)
 	oo_STRUCT_VECTOR (LPC_Frame, d_frames, nx)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (LPC)
diff --git a/LPC/LPC_to_Spectrogram.cpp b/LPC/LPC_to_Spectrogram.cpp
index ad48731..4b9bad2 100644
--- a/LPC/LPC_to_Spectrogram.cpp
+++ b/LPC/LPC_to_Spectrogram.cpp
@@ -1,6 +1,6 @@
 /* LPC_to_Spectrogram.cpp
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,7 +24,7 @@
 
 #include "LPC_to_Spectrogram.h"
 
-Spectrogram LPC_to_Spectrogram (LPC me, double dfMin, double bandwidthReduction, double deEmphasisFrequency) {
+autoSpectrogram LPC_to_Spectrogram (LPC me, double dfMin, double bandwidthReduction, double deEmphasisFrequency) {
 	try {
 		double samplingFrequency = 1.0 / my samplingPeriod;
 		long nfft = 2;
@@ -47,9 +47,9 @@ Spectrogram LPC_to_Spectrogram (LPC me, double dfMin, double bandwidthReduction,
 				thy z[j][i] =  re * re + im * im;
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Spectrogram created.");
+		Melder_throw (me, U": no Spectrogram created.");
 	}
 }
 
diff --git a/LPC/LPC_to_Spectrogram.h b/LPC/LPC_to_Spectrogram.h
index 75ed81d..d7772cd 100644
--- a/LPC/LPC_to_Spectrogram.h
+++ b/LPC/LPC_to_Spectrogram.h
@@ -2,7 +2,7 @@
 #define _LPC_to_Spectrogram_h_
 /* LPC_to_Spectrogram.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,15 +29,7 @@
 #include "Spectrogram.h"
 #include "LPC_to_Spectrum.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-Spectrogram LPC_to_Spectrogram (LPC me, double dfMin, double bandwidthReduction, double deEmphasisFrequency);
+autoSpectrogram LPC_to_Spectrogram (LPC me, double dfMin, double bandwidthReduction, double deEmphasisFrequency);
 /* if(dfMin >= 0) df <= dfMin else df = NyquistFrequency / 512 */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _LPC_and_Spectrogram_h_ */
diff --git a/LPC/LPC_to_Spectrum.cpp b/LPC/LPC_to_Spectrum.cpp
index e7f2d33..8c3eea8 100644
--- a/LPC/LPC_to_Spectrum.cpp
+++ b/LPC/LPC_to_Spectrum.cpp
@@ -1,6 +1,6 @@
 /* LPC_to_Spectrum.cpp
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,7 +38,7 @@ void LPC_Frame_into_Spectrum (LPC_Frame me, Spectrum thee, double bandwidthReduc
                               double deEmphasisFrequency) {
 	if (my nCoefficients == 0) {
 		for (long i = 1; i <= thy nx; i++) {
-			thy z[1][i] = thy z[2][i] = 0;
+			thy z[1][i] = thy z[2][i] = 0.0;
 		}
 		return;
 	}
@@ -46,9 +46,9 @@ void LPC_Frame_into_Spectrum (LPC_Frame me, Spectrum thee, double bandwidthReduc
 	// When deEmphasisFrequency is effective we need 1 extra position in the fftbuffer.
 
 	long nfft = 2 * (thy nx - 1), ndata = my nCoefficients + 1;
-	double scale = 1.0 / sqrt (2 * thy xmax * thy dx);
+	double scale = 1.0 / sqrt (2.0 * thy xmax * thy dx);
 	if (ndata >= nfft - 1 && (deEmphasisFrequency < thy xmax || ndata > nfft)) {
-		Melder_throw ("Spectrum size not large enough.");
+		Melder_throw (U"Spectrum size not large enough.");
 	}
 
 	autoNUMvector<double> fftbuffer (1, nfft);
@@ -104,7 +104,7 @@ void LPC_Frame_into_Spectrum (LPC_Frame me, Spectrum thee, double bandwidthReduc
 	thy z[2][thy nx] = 0;
 }
 
-Spectrum LPC_to_Spectrum (LPC me, double t, double dfMin, double bandwidthReduction, double deEmphasisFrequency) {
+autoSpectrum LPC_to_Spectrum (LPC me, double t, double dfMin, double bandwidthReduction, double deEmphasisFrequency) {
 	try {
 		double samplingFrequency = 1.0 / my samplingPeriod;
 		long nfft = 2, index = Sampled_xToNearestIndex (me, t);
@@ -121,11 +121,11 @@ Spectrum LPC_to_Spectrum (LPC me, double t, double dfMin, double bandwidthReduct
 		while (samplingFrequency / nfft > dfMin || nfft <= my d_frames[index].nCoefficients) {
 			nfft *= 2;
 		}
-		autoSpectrum thee = Spectrum_create (samplingFrequency / 2, nfft / 2 + 1);
+		autoSpectrum thee = Spectrum_create (samplingFrequency / 2.0, nfft / 2 + 1);
 		LPC_Frame_into_Spectrum (& my d_frames[index], thee.peek(), bandwidthReduction, deEmphasisFrequency);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Spectrum created.");
+		Melder_throw (me, U": no Spectrum created.");
 	}
 }
 
diff --git a/LPC/LPC_to_Spectrum.h b/LPC/LPC_to_Spectrum.h
index c6e9b55..11f8ec4 100644
--- a/LPC/LPC_to_Spectrum.h
+++ b/LPC/LPC_to_Spectrum.h
@@ -2,7 +2,7 @@
 #define _LPC_to_Spectrum_h_
 /* LPC_to_Spectrum.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,22 +28,14 @@
 #include "LPC.h"
 #include "Spectrum.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 void LPC_Frame_into_Spectrum (LPC_Frame me, Spectrum thee, double bandwidthReduction,
 	double deEmphasisFrequency);
 	
-Spectrum LPC_to_Spectrum (LPC me, double t, double dfMin, double bandwidthReduction,
+autoSpectrum LPC_to_Spectrum (LPC me, double t, double dfMin, double bandwidthReduction,
 	double deEmphasisFrequency);
 	
-Spectrum LPC_to_Spectrum2 (LPC me, double t, double dfMin, double bandwidthReduction);
+autoSpectrum LPC_to_Spectrum2 (LPC me, double t, double dfMin, double bandwidthReduction);
 /* if(dfMin >= 0) df <= dfMin else df = NyquistFrequency / 512 */
 /* integration radius r = exp (- pi * bandwidthReduction / samplingFrequency) */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _LPC_and_Spectrum_h_ */
diff --git a/LPC/Sound_and_Cepstrum.cpp b/LPC/Sound_and_Cepstrum.cpp
index 9535a23..c699945 100644
--- a/LPC/Sound_and_Cepstrum.cpp
+++ b/LPC/Sound_and_Cepstrum.cpp
@@ -1,6 +1,6 @@
 /* Sound_and_Cepstrum.cpp
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@
 	without Phase Unwrapping or Integration, IEEE Trans. on ASSP 33,
 	1014-1017 (Does not work yet).
 */
-Cepstrum Sound_to_Cepstrum_bw (Sound me) {
+autoCepstrum Sound_to_Cepstrum_bw (Sound me) {
 	try {
 		long nfft = 2;
 		while (nfft < my nx) {
@@ -62,13 +62,13 @@ Cepstrum Sound_to_Cepstrum_bw (Sound me) {
 		// Compute Avg (ln |X(f)|) as Avg (ln |X(f)|^2) / 2.
 		// Treat i=1 separately: x[1] * nx[1] / |x[1]|^2
 
-		double lnxa = 0;
-		if (x[1] != 0) {
-			lnxa = 2 * log (fabs (x[1]));
+		double lnxa = 0.0;
+		if (x[1] != 0.0) {
+			lnxa = 2.0 * log (fabs (x[1]));
 			x[1] = nx[1] / x[1];
 		}
-		if (x[2] != 0) {
-			lnxa = 2 * log (fabs (x[2]));
+		if (x[2] != 0.0) {
+			lnxa = 2.0 * log (fabs (x[2]));
 			x[2] = nx[2] / x[2];
 		}
 
@@ -76,16 +76,16 @@ Cepstrum Sound_to_Cepstrum_bw (Sound me) {
 			double xr = x[i], nxr = nx[i];
 			double xi = x[i + 1], nxi = nx[i + 1];
 			double xa = xr * xr + xi * xi;
-			if (xa > 0) {
+			if (xa > 0.0) {
 				x[i]   = (xr * nxr + xi * nxi) / xa;
 				x[i + 1] = (xr * nxi - xi * nxr) / xa;
 				lnxa += log (xa);
 			} else {
-				x[i] = x[i + 1] = 0;
+				x[i] = x[i + 1] = 0.0;
 			}
 		}
 
-		lnxa /= 2 * nfft / 2;
+		lnxa /= 2.0 * nfft / 2.0; // TODO
 
 		// Step 4: Inverse transform of complex array x
 		//	results in: n * xhat (n)
@@ -102,31 +102,31 @@ Cepstrum Sound_to_Cepstrum_bw (Sound me) {
 		// Step 6: xhat[0] = Avg (ln |X(f)|)
 
 		thy z[1][1] = lnxa;
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Cepstrum created.");
+		Melder_throw (me, U": no Cepstrum created.");
 	}
 }
 
 /* Zijn nog niet elkaars inverse!!!!*/
 
-Cepstrum Sound_to_Cepstrum (Sound me) {
+autoCepstrum Sound_to_Cepstrum (Sound me) {
 	try {
-		autoSpectrum spectrum = Sound_to_Spectrum (me, TRUE);
+		autoSpectrum spectrum = Sound_to_Spectrum (me, true);
 		autoCepstrum thee = Spectrum_to_Cepstrum (spectrum.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Cepstrum calculated.");
+		Melder_throw (me, U": no Cepstrum calculated.");
 	}
 }
 
-Sound Cepstrum_to_Sound (Cepstrum me) {
+autoSound Cepstrum_to_Sound (Cepstrum me) {
 	try {
 		autoSpectrum sx = Cepstrum_to_Spectrum (me);
 		autoSound thee = Spectrum_to_Sound (sx.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Sound calculated.");
+		Melder_throw (me, U": no Sound calculated.");
 	}
 }
 
diff --git a/LPC/Sound_and_Cepstrum.h b/LPC/Sound_and_Cepstrum.h
index 428be71..a4d040e 100644
--- a/LPC/Sound_and_Cepstrum.h
+++ b/LPC/Sound_and_Cepstrum.h
@@ -2,7 +2,7 @@
 #define _Sound_and_Cepstrum_h_
 /* Sound_and_Cepstrum.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,18 +27,10 @@
 #include "Sound.h"
 #include "Cepstrum.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
+autoCepstrum Sound_to_Cepstrum (Sound me);
 
-Cepstrum Sound_to_Cepstrum (Sound me);
+autoCepstrum Sound_to_Cepstrum_bw (Sound me);
 
-Cepstrum Sound_to_Cepstrum_bw (Sound me);
-
-Sound Cepstrum_to_Sound (Cepstrum me);
-
-#ifdef __cplusplus
-	}
-#endif
+autoSound Cepstrum_to_Sound (Cepstrum me);
 
 #endif /* _Sound_and_Cepstrum_h_ */
diff --git a/LPC/Sound_and_LPC.cpp b/LPC/Sound_and_LPC.cpp
index 98dbbf7..9c2f4ea 100644
--- a/LPC/Sound_and_LPC.cpp
+++ b/LPC/Sound_and_LPC.cpp
@@ -1,6 +1,6 @@
 /* Sound_and_LPC.cpp
  *
- * Copyright (C) 1994-2013 David Weenink
+ * Copyright (C) 1994-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -86,13 +86,13 @@ static int Sound_into_LPC_Frame_auto (Sound me, LPC_Frame thee) {
 			r[i] += x[j] * x[j + i - 1];
 		}
 	}
-	if (r[1] == 0) {
+	if (r[1] == 0.0) {
 		i = 1; /* ! */ goto end;
 	}
 	a[1] = 1; a[2] = rc[1] = - r[2] / r[1];
 	thy gain = r[1] + r[2] * rc[1];
 	for (i = 2; i <= m; i++) {
-		double s = 0;
+		double s = 0.0;
 		for (long j = 1; j <= i; j++) {
 			s += r[i - j + 2] * a[j];
 		}
@@ -117,7 +117,7 @@ end:
 	}
 	thy nCoefficients = i;
 	for (long j = i + 1; j <= m; j++) {
-		thy a[j] = 0;
+		thy a[j] = 0.0;
 	}
 	return 0; // Melder_warning ("Less coefficienst than asked for.");
 }
@@ -141,38 +141,38 @@ static int Sound_into_LPC_Frame_covar (Sound me, LPC_Frame thee) {
 	autoNUMvector<double> beta (1, m);
 	autoNUMvector<double> cc (1, m + 1);
 
-	thy gain = 0;
+	thy gain = 0.0;
 	for (i = m + 1; i <= n; i++) {
 		thy gain += x[i] * x[i];
 		cc[1] += x[i] * x[i - 1];
 		cc[2] += x[i - 1] * x[i - 1];
 	}
 
-	if (thy gain == 0) {
+	if (thy gain == 0.0) {
 		i = 1; /* ! */ goto end;
 	}
 
-	b[1] = 1;
+	b[1] = 1.0;
 	beta[1] = cc[2];
-	a[1] = 1;
+	a[1] = 1.0;
 	a[2] = grc[1] = -cc[1] / cc[2];
 	thy gain += grc[1] * cc[1];
 
 	for (i = 2; i <= m; i++) { /*130*/
-		double s = 0; /* 20 */
+		double s = 0.0; /* 20 */
 		for (long j = 1; j <= i; j++) {
 			cc[i - j + 2] = cc[i - j + 1] + x[m - i + 1] * x[m - i + j] - x[n - i + 1] * x[n - i + j];
 		}
-		cc[1] = 0;
+		cc[1] = 0.0;
 		for (long j = m + 1; j <= n; j++) {
 			cc[1] += x[j - i] * x[j]; /* 30 */
 		}
-		b[i * (i + 1) / 2] = 1;
+		b[i * (i + 1) / 2] = 1.0;
 		for (long j = 1; j <= i - 1; j++) { /* 70 */
-			double gam = 0;
-			if (beta[j] < 0) {
+			double gam = 0.0;
+			if (beta[j] < 0.0) {
 				goto end;
-			} else if (beta[j] == 0) {
+			} else if (beta[j] == 0.0) {
 				continue;
 			}
 			for (long k = 1; k <= j; k++) {
@@ -184,11 +184,11 @@ static int Sound_into_LPC_Frame_covar (Sound me, LPC_Frame thee) {
 			}
 		}
 
-		beta[i] = 0;
+		beta[i] = 0.0;
 		for (long j = 1; j <= i; j++) {
 			beta[i] += cc[j + 1] * b[i * (i - 1) / 2 + j]; /*80*/
 		}
-		if (beta[i] <= 0) {
+		if (beta[i] <= 0.0) {
 			goto end;
 		}
 
@@ -203,7 +203,7 @@ static int Sound_into_LPC_Frame_covar (Sound me, LPC_Frame thee) {
 		a[i + 1] = grc[i];
 		s = grc[i] * grc[i] * beta[i];
 		thy gain -= s;
-		if (thy gain <= 0) {
+		if (thy gain <= 0.0) {
 			goto end;
 		}
 	}
@@ -219,7 +219,7 @@ end:
 
 	thy nCoefficients = i;
 	for (long j = i + 1; j <= m; j++) {
-		thy a[j] = 0;
+		thy a[j] = 0.0;
 	}
 	return 0; // Melder_warning ("Less coefficienst than asked for.");
 }
@@ -241,12 +241,12 @@ static int Sound_into_LPC_Frame_marple (Sound me, LPC_Frame thee, double tol1, d
 	autoNUMvector<double> c (1, mmax + 1);
 	autoNUMvector<double> d (1, mmax + 1);
 	autoNUMvector<double> r (1, mmax + 1);
-	double e0 = 0;
+	double e0 = 0.0;
 	for (long k = 1; k <= n; k++) {
 		e0 += x[k] * x[k];
 	}
-	e0 *= 2;
-	if (e0 == 0) {
+	e0 *= 2.0;
+	if (e0 == 0.0) {
 		m = 0; thy gain *= 0.5; /* because e0 is twice the energy */
 		thy nCoefficients = m; return 0; // warning no signal
 	}
@@ -290,7 +290,7 @@ static int Sound_into_LPC_Frame_marple (Sound me, LPC_Frame thee, double tol1, d
 		double y5 = 2.0 * h * s;
 		q += y1 * q1 + q4 * (y2 * q6 + q7 * q5 + v * y5);
 		w += y3 * q1 + q4 * (y4 * q5 + q7 * q6 + u * y5);
-		h = s = u = v = 0;
+		h = s = u = v = 0.0;
 		for (long k = 0; k <= m; k++) {
 			h += x[n - m + k] * c[k + 1];
 			s += x[n - k] * c[k + 1];
@@ -300,7 +300,7 @@ static int Sound_into_LPC_Frame_marple (Sound me, LPC_Frame thee, double tol1, d
 		q5 = 1.0 - q;
 		q6 = 1.0 - w;
 		den = q5 * q6 - h * h;
-		if (den <= 0) {
+		if (den <= 0.0) {
 			status = 2; goto end; /* 2: ill-conditioning */
 		}
 		q4 = 1.0 / den;
@@ -369,15 +369,14 @@ end:
 	return status == 1 || status == 4 || status == 5;
 }
 
-static LPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidth, double dt,
-                          double preEmphasisFrequency, int method, double tol1, double tol2) {
+static autoLPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidth, double dt, double preEmphasisFrequency, int method, double tol1, double tol2) {
 	double t1, samplingFrequency = 1.0 / my dx;
 	double windowDuration = 2 * analysisWidth; /* gaussian window */
 	long nFrames, frameErrorCount = 0;
 
-	if (floor (windowDuration / my dx) < predictionOrder + 1) Melder_throw ("Analysis window duration too short.\n"
-		        "For a prediction order of ", predictionOrder, " the analysis window duration has to be greater than ", my dx * (predictionOrder + 1),
-		        "Please increase the analysis window duration or lower the prediction order.");
+	if (floor (windowDuration / my dx) < predictionOrder + 1) Melder_throw (U"Analysis window duration too short.\n"
+		        U"For a prediction order of ", predictionOrder, U" the analysis window duration has to be greater than ", my dx * (predictionOrder + 1),
+		        U"Please increase the analysis window duration or lower the prediction order.");
 	// Convenience: analyse the whole sound into one LPC_frame
 	if (windowDuration > my dx * my nx) {
 		windowDuration = my dx * my nx;
@@ -388,7 +387,7 @@ static LPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidth, d
 	autoSound window = Sound_createGaussian (windowDuration, samplingFrequency);
 	autoLPC thee = LPC_create (my xmin, my xmax, nFrames, dt, t1, predictionOrder, my dx);
 
-	autoMelderProgress progress (L"LPC analysis");
+	autoMelderProgress progress (U"LPC analysis");
 
 	if (preEmphasisFrequency < samplingFrequency / 2) {
 		Sound_preEmphasis (sound.peek(), preEmphasisFrequency);
@@ -419,70 +418,66 @@ static LPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidth, d
 			}
 		}
 		if ( (i % 10) == 1) {
-			Melder_progress ( (double) i / nFrames, L"LPC analysis of frame ",
-			                   Melder_integer (i), L" out of ", Melder_integer (nFrames), L".");
+			Melder_progress ( (double) i / nFrames, U"LPC analysis of frame ",
+			                   i, U" out of ", nFrames, U".");
 		}
 	}
-	return thee.transfer();
+	return thee;
 }
 
-LPC Sound_to_LPC_auto (Sound me, int predictionOrder, double analysisWidth, double dt,
-                       double preEmphasisFrequency) {
+autoLPC Sound_to_LPC_auto (Sound me, int predictionOrder, double analysisWidth, double dt, double preEmphasisFrequency) {
 	try {
 		autoLPC thee = _Sound_to_LPC (me, predictionOrder, analysisWidth, dt, preEmphasisFrequency, LPC_METHOD_AUTO, 0, 0);
-		return thee.transfer ();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no LPC (auto) created.");
+		Melder_throw (me, U": no LPC (auto) created.");
 	}
 }
 
-LPC Sound_to_LPC_covar (Sound me, int predictionOrder, double analysisWidth, double dt,
-                        double preEmphasisFrequency) {
+autoLPC Sound_to_LPC_covar (Sound me, int predictionOrder, double analysisWidth, double dt, double preEmphasisFrequency) {
 	try {
 		autoLPC thee = _Sound_to_LPC (me, predictionOrder, analysisWidth, dt, preEmphasisFrequency, LPC_METHOD_COVAR, 0, 0);
-		return thee.transfer ();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no LPC (covar) created.");
+		Melder_throw (me, U": no LPC (covar) created.");
 	}
 }
 
-LPC Sound_to_LPC_burg (Sound me, int predictionOrder, double analysisWidth, double dt,
-                       double preEmphasisFrequency) {
+autoLPC Sound_to_LPC_burg (Sound me, int predictionOrder, double analysisWidth, double dt, double preEmphasisFrequency) {
 	try {
 		autoLPC thee = _Sound_to_LPC (me, predictionOrder, analysisWidth, dt, preEmphasisFrequency, LPC_METHOD_BURG, 0, 0);
-		return thee.transfer ();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no LPC (burg) created.");
+		Melder_throw (me, U": no LPC (burg) created.");
 	}
 }
 
-LPC Sound_to_LPC_marple (Sound me, int predictionOrder, double analysisWidth, double dt,
-                         double preEmphasisFrequency, double tol1, double tol2) {
+autoLPC Sound_to_LPC_marple (Sound me, int predictionOrder, double analysisWidth, double dt, double preEmphasisFrequency, double tol1, double tol2) {
 	try {
 		autoLPC thee = _Sound_to_LPC (me, predictionOrder, analysisWidth, dt, preEmphasisFrequency, LPC_METHOD_MARPLE, tol1, tol2);
-		return thee.transfer ();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no LPC (marple) created.");
+		Melder_throw (me, U": no LPC (marple) created.");
 	}
 }
 
-Sound LPC_and_Sound_filterInverse (LPC me, Sound thee) {
+autoSound LPC_and_Sound_filterInverse (LPC me, Sound thee) {
 	try {
 		if (my samplingPeriod != thy dx) {
-			Melder_throw ("Sampling frequencies are not the same.");
+			Melder_throw (U"Sampling frequencies are not the same.");
 		}
 		if (my xmin != thy xmin || thy xmax != my xmax) {
-			Melder_throw ("Domains of LPC and Sound are not equal.");
+			Melder_throw (U"Domains of LPC and Sound are not equal.");
 		}
 		autoSound him = Data_copy (thee);
 
 		double *e = his z[1], *x = thy z[1];
 		for (long i = 1; i <= his nx; i++) {
 			double t = his x1 + (i - 1) * his dx; /* Sampled_indexToX (him, i) */
-			long iFrame = floor ( (t - my x1) / my dx + 1.5); /* Sampled_xToNearestIndex (me, t) */
+			long iFrame = lround ( (t - my x1) / my dx + 1.0); /* Sampled_xToNearestIndex (me, t) */
 			double *a;
 			if (iFrame < 1 || iFrame > my nx) {
-				e[i] = 0;
+				e[i] = 0.0;
 				continue;
 			}
 			a = my d_frames[iFrame].a;
@@ -491,9 +486,9 @@ Sound LPC_and_Sound_filterInverse (LPC me, Sound thee) {
 				e[i] += a[j] * x[i - j];
 			}
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (thee, ": not inverse filtered.");
+		Melder_throw (thee, U": not inverse filtered.");
 	}
 }
 
@@ -501,16 +496,16 @@ Sound LPC_and_Sound_filterInverse (LPC me, Sound thee) {
 	gain used as a constant amplitude multiplyer within a frame of duration my dx.
 	future alternative: convolve gain with a  smoother.
 */
-Sound LPC_and_Sound_filter (LPC me, Sound thee, int useGain) {
+autoSound LPC_and_Sound_filter (LPC me, Sound thee, int useGain) {
 	try {
 		double xmin = my xmin > thy xmin ? my xmin : thy xmin;
 		double xmax = my xmax < thy xmax ? my xmax : thy xmax;
 		if (xmin >= xmax) {
-			Melder_throw ("Domains of Sound [", Melder_double(thy xmin), ",", Melder_double(thy xmax), "] and LPC [",
-				Melder_double(my xmin), ",", Melder_double(my xmax), "] do not overlap.");
+			Melder_throw (U"Domains of Sound [", thy xmin, U",", thy xmax, U"] and LPC [",
+				my xmin, U",", my xmax, U"] do not overlap.");
 		}
 		// resample sound if samplings don't match
-		autoSound source = 0;
+		autoSound source = nullptr;
 		if (my samplingPeriod != thy dx) {
 			source.reset (Sound_resample (thee, 1.0 / my samplingPeriod, 50));
 			thee = source.peek();   // reference copy; remove at end
@@ -523,7 +518,7 @@ Sound LPC_and_Sound_filter (LPC me, Sound thee, int useGain) {
 		long ilast = Sampled_xToLowIndex (thee, xmax);
 		for (long i = ifirst; i <= ilast; i++) {
 			double t = his x1 + (i - 1) * his dx; /* Sampled_indexToX (him, i) */
-			long iFrame = floor ( (t - my x1) / my dx + 1.5); /* Sampled_xToNearestIndex (me, t) */
+			long iFrame = lround ( (t - my x1) / my dx + 1.0); /* Sampled_xToNearestIndex (me, t) */
 			if (iFrame < 1) {
 				continue;
 			}
@@ -540,31 +535,31 @@ Sound LPC_and_Sound_filter (LPC me, Sound thee, int useGain) {
 		// Make samples before first frame and after last frame zero.
 
 		for (long i = 1; i < ifirst; i++) {
-			x[i] = 0;
+			x[i] = 0.0;
 		}
 
 		for (long i = ilast + 1; i <= his nx; i++) {
-			x[i] = 0;
+			x[i] = 0.0;
 		}
 		if (useGain) {
 			for (long i = ifirst; i <= ilast; i++) {
 				double t = his x1 + (i - 1) * his dx; /* Sampled_indexToX (him, i) */
 				double riFrame = (t - my x1) / my dx + 1; /* Sampled_xToIndex (me, t); */
-				long iFrame = floor (riFrame);
+				long iFrame = (long) floor (riFrame);
 				double phase = riFrame - iFrame;
 				if (iFrame < 0 || iFrame > my nx) {
-					x[i] = 0;
+					x[i] = 0.0;
 				} else if (iFrame == 0) {
 					x[i] *= sqrt (my d_frames[1].gain) * phase;
 				} else if (iFrame == my nx) {
-					x[i] *= sqrt (my d_frames[my nx].gain) * (1 - phase);
+					x[i] *= sqrt (my d_frames[my nx].gain) * (1.0 - phase);
 				} else x[i] *=
-					    phase * sqrt (my d_frames[iFrame + 1].gain) + (1 - phase) * sqrt (my d_frames[iFrame].gain);
+					    phase * sqrt (my d_frames[iFrame + 1].gain) + (1.0 - phase) * sqrt (my d_frames[iFrame].gain);
 			}
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (thee, ": not filtered.");
+		Melder_throw (thee, U": not filtered.");
 	}
 }
 
@@ -580,7 +575,7 @@ void LPC_and_Sound_filterWithFilterAtTime_inline (LPC me, Sound thee, int channe
 		channel = 1;
 	}
 	if (frameIndex < 1 || frameIndex > my nx) {
-		Melder_throw ("Frame number out of range.");
+		Melder_throw (U"Frame number out of range.");
 	}
 	if (channel > 0) {
 		LPC_Frame_and_Sound_filter (& (my d_frames[frameIndex]), thee, channel);
@@ -591,13 +586,13 @@ void LPC_and_Sound_filterWithFilterAtTime_inline (LPC me, Sound thee, int channe
 	}
 }
 
-Sound LPC_and_Sound_filterWithFilterAtTime (LPC me, Sound thee, int channel, double time) {
+autoSound LPC_and_Sound_filterWithFilterAtTime (LPC me, Sound thee, int channel, double time) {
 	try {
 		autoSound him = Data_copy (thee);
 		LPC_and_Sound_filterWithFilterAtTime_inline (me, him.peek(), channel, time);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (thee, ": not filtered.");
+		Melder_throw (thee, U": not filtered.");
 	}
 }
 
@@ -621,17 +616,17 @@ void LPC_and_Sound_filterInverseWithFilterAtTime_inline (LPC me, Sound thee, int
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (thee, ": not inverse filtered.");
+		Melder_throw (thee, U": not inverse filtered.");
 	}
 }
 
-Sound LPC_and_Sound_filterInverseWithFilterAtTime (LPC me, Sound thee, int channel, double time) {
+autoSound LPC_and_Sound_filterInverseWithFilterAtTime (LPC me, Sound thee, int channel, double time) {
 	try {
 		autoSound him = Data_copy (thee);
 		LPC_and_Sound_filterInverseWithFilterAtTime_inline (me, him.peek(), channel, time);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (thee, ": not inverse filtered.");
+		Melder_throw (thee, U": not inverse filtered.");
 	}
 }
 
diff --git a/LPC/Sound_and_LPC.h b/LPC/Sound_and_LPC.h
index c0a708c..ab88810 100644
--- a/LPC/Sound_and_LPC.h
+++ b/LPC/Sound_and_LPC.h
@@ -2,7 +2,7 @@
 #define _Sound_and_LPC_h_
 /* Sound_and_LPC.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,20 +29,16 @@
 #include "LPC.h"
 #include "Sound.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-LPC Sound_to_LPC_auto (Sound me, int predictionOrder, double analysisWidth, double dt,
+autoLPC Sound_to_LPC_auto (Sound me, int predictionOrder, double analysisWidth, double dt,
 	double preEmphasisFrequency);
 
-LPC Sound_to_LPC_covar (Sound me, int predictionOrder, double analysisWidth, double dt,
+autoLPC Sound_to_LPC_covar (Sound me, int predictionOrder, double analysisWidth, double dt,
 	double preEmphasisFrequency);
 
-LPC Sound_to_LPC_burg (Sound me, int predictionOrder, double analysisWidth, double dt,
+autoLPC Sound_to_LPC_burg (Sound me, int predictionOrder, double analysisWidth, double dt,
 	double preEmphasisFrequency);
 
-LPC Sound_to_LPC_marple (Sound me, int predictionOrder, double analysisWidth, double dt,
+autoLPC Sound_to_LPC_marple (Sound me, int predictionOrder, double analysisWidth, double dt,
 	double preEmphasisFrequency, double tol1, double tol2);
 
 /*
@@ -75,7 +71,7 @@ LPC Sound_to_LPC_marple (Sound me, int predictionOrder, double analysisWidth, do
  */
 
 void LPC_Frame_and_Sound_filterInverse (LPC_Frame me, Sound thee, int channel);
-Sound LPC_and_Sound_filter (LPC me, Sound thee, int useGain);
+autoSound LPC_and_Sound_filter (LPC me, Sound thee, int useGain);
 /*
 	E(z) = X(z)A(z),
 	A(z) = 1 + Sum (k=1, k=m, a(k)z^-k);
@@ -87,9 +83,9 @@ Sound LPC_and_Sound_filter (LPC me, Sound thee, int useGain);
 */
 
 void LPC_and_Sound_filterWithFilterAtTime_inline (LPC me, Sound thee, int channel, double time);
-Sound LPC_and_Sound_filterWithFilterAtTime (LPC me, Sound thee, int channel, double time);
+autoSound LPC_and_Sound_filterWithFilterAtTime (LPC me, Sound thee, int channel, double time);
 
-Sound LPC_and_Sound_filterInverse (LPC me, Sound thee);
+autoSound LPC_and_Sound_filterInverse (LPC me, Sound thee);
 /*
 	E(z) = X(z)A(z),
 	A(z) = 1 + Sum (k=1, k=m, a(k)z^-k);
@@ -99,11 +95,7 @@ Sound LPC_and_Sound_filterInverse (LPC me, Sound thee);
 		e(n) = x(n) + Sum (k=1, m, a(k)x(n-k))
 */
 
-Sound LPC_and_Sound_filterInverseWithFilterAtTime (LPC me, Sound thee, int channel, double time);
+autoSound LPC_and_Sound_filterInverseWithFilterAtTime (LPC me, Sound thee, int channel, double time);
 void LPC_and_Sound_filterInverseWithFilterAtTime_inline (LPC me, Sound thee, int channel, double time);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Sound_and_LPC_h_ */
diff --git a/LPC/Sound_and_LPC_robust.cpp b/LPC/Sound_and_LPC_robust.cpp
index 19215ec..eb907a3 100644
--- a/LPC/Sound_and_LPC_robust.cpp
+++ b/LPC/Sound_and_LPC_robust.cpp
@@ -1,6 +1,6 @@
 /* Sound_and_LPC_robust.cpp
  *
- * Copyright (C) 1994-2013 David Weenink
+ * Copyright (C) 1994-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -50,9 +50,9 @@ struct huber_struct {
 
 static void huber_struct_init (struct huber_struct *hs, double windowDuration,
                                long p, double samplingFrequency, double location, int wantlocation) {
-	hs -> w = hs -> work = hs -> a = hs -> c = 0;
-	hs -> covar = 0; hs -> svd = 0;
-	hs -> e = Sound_createSimple (1, windowDuration, samplingFrequency);
+	hs -> w = hs -> work = hs -> a = hs -> c = nullptr;
+	hs -> covar = nullptr; hs -> svd = nullptr;
+	hs -> e = Sound_createSimple (1, windowDuration, samplingFrequency).transfer();
 	long n = hs -> e -> nx;
 	hs -> n = n;
 	hs -> p = p;
@@ -85,7 +85,7 @@ static void huber_struct_getWeights (struct huber_struct *hs, double *e) {
 
 	for (long i = 1 ; i <= hs -> n; i++) {
 		double ei = e[i] - hs -> location;
-		w[i] = ei > -ks && ei < ks ? 1 : ks / fabs (ei);
+		w[i] = ei > -ks && ei < ks ? 1.0 : ks / fabs (ei);
 	}
 }
 
@@ -134,7 +134,7 @@ void LPC_Frames_and_Sound_huber (LPC_Frame me, Sound thee, LPC_Frame him, struct
 	double *e = hs -> e -> z[1], *s = thy z[1];
 
 	hs -> iter = 0;
-	hs -> scale = 1e38;
+	hs -> scale = 1e308;
 	hs -> p = p;
 
 	double s0;
@@ -182,17 +182,17 @@ LPC LPC_and_Sound_to_LPC_robust (LPC thee, Sound me, double analysisWidth, doubl
 		long p = thy maxnCoefficients;
 
 		if (my xmin != thy xmin || my xmax != thy xmax) {
-			Melder_throw ("Time domains differ.");
+			Melder_throw (U"Time domains differ.");
 		}
 		if (my dx != thy samplingPeriod) {
-			Melder_throw ("Sampling intervals differ.");
+			Melder_throw (U"Sampling intervals differ.");
 		}
 		if (floor (windowDuration / my dx) < p + 1) {
-			Melder_throw ("Analysis window too short.");
+			Melder_throw (U"Analysis window too short.");
 		}
 		Sampled_shortTermAnalysis (me, windowDuration, thy dx, & nFrames, & t1);
 		if (nFrames != thy nx || t1 != thy x1) {
-			Melder_throw ("Incorrect retrieved analysis width");
+			Melder_throw (U"Incorrect retrieved analysis width");
 		}
 
 		autoSound sound = Data_copy (me);
@@ -206,7 +206,7 @@ LPC LPC_and_Sound_to_LPC_robust (LPC thee, Sound me, double analysisWidth, doubl
 		struct_huber.tol_svd = tol_svd;
 		struct_huber.itermax = itermax;
 
-		autoMelderProgress progess (L"LPC analysis");
+		autoMelderProgress progess (U"LPC analysis");
 
 		Sound_preEmphasis (sound.peek(), preEmphasisFrequency);
 
@@ -228,20 +228,19 @@ LPC LPC_and_Sound_to_LPC_robust (LPC thee, Sound me, double analysisWidth, doubl
 			iter += struct_huber.iter;
 
 			if ( (i % 10) == 1) {
-				Melder_progress ( (double) i / nFrames, L"LPC analysis of frame ",
-				                   Melder_integer (i), L" out of ", Melder_integer (nFrames), L".");
+				Melder_progress ( (double) i / nFrames, U"LPC analysis of frame ", i, U" out of ", nFrames, U".");
 			}
 		}
 
-		if (frameErrorCount) Melder_warning (L"Results of ", Melder_integer (frameErrorCount),
-			L" frame(s) out of ", Melder_integer (nFrames), L" could not be optimised.");
-		MelderInfo_writeLine (L"Number of iterations: ", Melder_integer (iter),
-			L"\n   Average per frame: ", Melder_double (((double) iter) / nFrames));
+		if (frameErrorCount) Melder_warning (U"Results of ", frameErrorCount,
+			U" frame(s) out of ", nFrames, U" could not be optimised.");
+		MelderInfo_writeLine (U"Number of iterations: ", iter,
+			U"\n   Average per frame: ", ((double) iter) / nFrames);
 		huber_struct_destroy (&struct_huber);
 		return him.transfer();
 	} catch (MelderError) {
 		huber_struct_destroy (&struct_huber);
-		Melder_throw (me, ": no robust LPC created.");
+		Melder_throw (me, U": no robust LPC created.");
 	}
 }
 
@@ -250,13 +249,13 @@ Formant Sound_to_Formant_robust (Sound me, double dt_in, double numberOfFormants
 {
 	double dt = dt_in > 0.0 ? dt_in : halfdt_window / 4.0;
 	double nyquist = 0.5 / my dx;
-	int predictionOrder = 2 * numberOfFormants;
+	int predictionOrder = (long) floor (2 * numberOfFormants);
 	try {
 		autoSound sound = NULL;
-		if (maximumFrequency <= 0.0 || fabs (maximumFrequency / nyquist - 1) < 1.0e-12) {
+		if (maximumFrequency <= 0.0 || fabs (maximumFrequency / nyquist - 1.0) < 1.0e-12) {
 			sound.reset (Data_copy (me));   // will be modified
 		} else {
-			sound.reset (Sound_resample (me, maximumFrequency * 2, 50));
+			sound.reset (Sound_resample (me, maximumFrequency * 2.0, 50));
 		}
 
 		autoLPC lpc = Sound_to_LPC_auto (sound.peek(), predictionOrder, halfdt_window, dt, preEmphasisFrequency);
@@ -264,7 +263,7 @@ Formant Sound_to_Formant_robust (Sound me, double dt_in, double numberOfFormants
 		autoFormant thee = LPC_to_Formant (lpcr.peek(), safetyMargin);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no robust Formant created.");
+		Melder_throw (me, U": no robust Formant created.");
 	}
 }
 
diff --git a/LPC/Tube.cpp b/LPC/Tube.cpp
index 25db529..608d0ca 100644
--- a/LPC/Tube.cpp
+++ b/LPC/Tube.cpp
@@ -1,6 +1,6 @@
 /* Tube.cpp
  *
- * Copyright (C) 1994-2012 David Weenink
+ * Copyright (C) 1994-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -48,19 +48,19 @@
 Thing_implement (Tube, Sampled, 0);
 
 void structTube :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain: ", Melder_double (xmin), L" to ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"Maximum number of segments: ", Melder_integer (maxnSegments));
-	MelderInfo_writeLine (L"Number of frames: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"Time step: ", Melder_double (dx), L" seconds");
-	MelderInfo_writeLine (L"First frame at: ", Melder_double (x1), L" seconds");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain: ", xmin, U" to ", xmax, U" seconds");
+	MelderInfo_writeLine (U"Maximum number of segments: ", maxnSegments);
+	MelderInfo_writeLine (U"Number of frames: ", nx);
+	MelderInfo_writeLine (U"Time step: ", dx, U" seconds");
+	MelderInfo_writeLine (U"First frame at: ", x1, U" seconds");
 }
 
 void Tube_Frame_init (Tube_Frame me, long nSegments, double length) {
 	my nSegments = nSegments;
 	my length = length;
 	if (nSegments <= 0) {
-		Melder_throw ("Number of segments must be a natural number.");
+		Melder_throw (U"Number of segments must be a natural number.");
 	}
 	my c = NUMvector<double> (1, nSegments);
 }
@@ -68,7 +68,7 @@ void Tube_Frame_init (Tube_Frame me, long nSegments, double length) {
 /* Gray & Markel (1979), LPTRN */
 void Tube_Frames_rc_into_area (Tube_Frame me, Tube_Frame thee) {
 	if (my nSegments > thy nSegments) {
-		Melder_throw ("Number of segments to big.");
+		Melder_throw (U"Number of segments to big.");
 	}
 
 	double s = 0.0001; /* 1.0 cm^2 at glottis */
@@ -79,8 +79,7 @@ void Tube_Frames_rc_into_area (Tube_Frame me, Tube_Frame thee) {
 	}
 }
 
-static void Tube_setLengths (I, double length) {
-	iam (Tube);
+static void Tube_setLengths (Tube me, double length) {
 	for (long i = 1; i <= my nx; i++) {
 		Tube_Frame f = & my frame[i];
 		if (f) {
@@ -89,9 +88,7 @@ static void Tube_setLengths (I, double length) {
 	}
 }
 
-void Tube_init (I, double tmin, double tmax, long nt, double dt, double t1,
-                long maxnSegments, double defaultLength) {
-	iam (Tube);
+void Tube_init (Tube me, double tmin, double tmax, long nt, double dt, double t1, long maxnSegments, double defaultLength) {
 	my maxnSegments = maxnSegments;
 	Sampled_init (me, tmin, tmax, nt, dt, t1);
 	my frame = NUMvector<structTube_Frame> (1, nt);
@@ -100,37 +97,33 @@ void Tube_init (I, double tmin, double tmax, long nt, double dt, double t1,
 
 Thing_implement (Area, Tube, 0);
 
-void Area_init (Area me, double tmin, double tmax, long nt, double dt, double t1,
-                long maxnSegments, double defaultLength) {
+void Area_init (Area me, double tmin, double tmax, long nt, double dt, double t1, long maxnSegments, double defaultLength) {
 	Tube_init (me, tmin, tmax, nt, dt, t1, maxnSegments, defaultLength);
 }
 
-Area Area_create (double tmin, double tmax, long nt, double dt, double t1,
-                  long maxnSegments, double defaultLength) {
+autoArea Area_create (double tmin, double tmax, long nt, double dt, double t1, long maxnSegments, double defaultLength) {
 	try {
 		autoArea me = Thing_new (Area);
 		Area_init (me.peek(), tmin, tmax, nt, dt, t1, maxnSegments, defaultLength);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Area not crteated.");
+		Melder_throw (U"Area not crteated.");
 	}
 }
 
 Thing_implement (RC, Tube, 0);
 
-void RC_init (RC me, double tmin, double tmax, long nt, double dt, double t1,
-              long maxnSegments, double defaultLength) {
+void RC_init (RC me, double tmin, double tmax, long nt, double dt, double t1, long maxnSegments, double defaultLength) {
 	Tube_init (me, tmin, tmax, nt, dt, t1, maxnSegments, defaultLength);
 }
 
-RC RC_create (double tmin, double tmax, long nt, double dt, double t1,
-              long maxnCoefficients, double defaultLength) {
+autoRC RC_create (double tmin, double tmax, long nt, double dt, double t1, long maxnCoefficients, double defaultLength) {
 	try {
 		autoRC me = Thing_new (RC);
 		RC_init (me.peek(), tmin, tmax, nt, dt, t1, maxnCoefficients, defaultLength);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("RC not crteated.");
+		Melder_throw (U"RC not crteated.");
 	}
 }
 
diff --git a/LPC/Tube.h b/LPC/Tube.h
index b847316..dbd56be 100644
--- a/LPC/Tube.h
+++ b/LPC/Tube.h
@@ -2,7 +2,7 @@
 #define _Tube_h_
 /* Tube.h
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -50,7 +50,7 @@ Thing_define (Area, Tube) {
 void Area_init (Area me, double tmin, double tmax, long nt, double dt, double t1,
 	long maxnSegments, double defaultLength);
 
-Area Area_create (double tmin, double tmax, long nt, double dt, double t1,
+autoArea Area_create (double tmin, double tmax, long nt, double dt, double t1,
 	long maxnSegments, double defaultLength);
 
 Thing_define (RC, Tube) {
@@ -65,7 +65,7 @@ Thing_define (RC, Tube) {
 void RC_init (RC me, double tmin, double tmax, long nt, double dt, double t1,
 	long maxnCoefficients, double defaultLength);
 
-RC RC_create (double tmin, double tmax, long nt, double dt, double t1,
+autoRC RC_create (double tmin, double tmax, long nt, double dt, double t1,
 	long maxnCoefficients, double defaultLength);
 
 #endif // _Tube_h_
diff --git a/LPC/Tube_def.h b/LPC/Tube_def.h
index 5bb1fb3..ab3d27e 100644
--- a/LPC/Tube_def.h
+++ b/LPC/Tube_def.h
@@ -36,8 +36,8 @@ oo_DEFINE_CLASS (Tube, Sampled)
 	oo_STRUCT_VECTOR (Tube_Frame, frame, nx)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (Tube)
diff --git a/LPC/VocalTractTier.cpp b/LPC/VocalTractTier.cpp
index 90abf49..4278912 100644
--- a/LPC/VocalTractTier.cpp
+++ b/LPC/VocalTractTier.cpp
@@ -1,6 +1,6 @@
 /* VocalTractTier.cpp
  *
- * Copyright (C) 2012 David Weenink
+ * Copyright (C) 2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -48,7 +48,7 @@ void VocalTract_drawSegments (VocalTract me, Graphics g, double maxLength, doubl
 	double maxCrossection = sqrt (maxArea);
 	Graphics_setWindow (g, 0, maxLength, -maxCrossection, maxCrossection);
 	for (long isection = 1; isection <= my nx; isection++) {
-		double x1 = (isection - 1) * my dx, x2 = x1 + my dx;
+		double x1 = (isection - 1.0) * my dx, x2 = x1 + my dx;
 		double crosssection2 = sqrt (my z[1][isection]);
 		Graphics_line (g, x1, crosssection2, x2, crosssection2);
 		Graphics_line (g, x1, -crosssection2, x2, -crosssection2);
@@ -65,14 +65,14 @@ void VocalTract_drawSegments (VocalTract me, Graphics g, double maxLength, doubl
 
 Thing_implement (VocalTractPoint, AnyPoint, 0);
 
-VocalTractPoint VocalTract_to_VocalTractPoint (VocalTract me, double time) {
+autoVocalTractPoint VocalTract_to_VocalTractPoint (VocalTract me, double time) {
 	try {
 		autoVocalTractPoint thee = Thing_new (VocalTractPoint);
 		thy number = time;
 		thy d_vocalTract = (VocalTract) Data_copy (me);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to VocalTractPoint.");
+		Melder_throw (me, U": not converted to VocalTractPoint.");
 	}
 }
 
@@ -80,24 +80,24 @@ VocalTractPoint VocalTract_to_VocalTractPoint (VocalTract me, double time) {
 
 Thing_implement (VocalTractTier, Function, 0);
 
-VocalTractTier VocalTractTier_create (double fromTime, double toTime) {
+autoVocalTractTier VocalTractTier_create (double fromTime, double toTime) {
 	try {
 		autoVocalTractTier me = Thing_new (VocalTractTier);
 		Function_init (me.peek(), fromTime, toTime);
 		my d_vocalTracts = SortedSetOfDouble_create ();
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw (": VocalTractTier not created.");
+		Melder_throw (U": VocalTractTier not created.");
 	}
 }
 
-VocalTractTier VocalTract_to_VocalTractTier (VocalTract me, double startTime, double endTime, double time) {
+autoVocalTractTier VocalTract_to_VocalTractTier (VocalTract me, double startTime, double endTime, double time) {
 	try {
 		autoVocalTractTier thee = VocalTractTier_create (startTime, endTime);
 		VocalTractTier_addVocalTract (thee.peek(), time, me);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to VocalTractTier");
+		Melder_throw (me, U": not converted to VocalTractTier");
 	}
 }
 
@@ -109,16 +109,16 @@ void VocalTractTier_addVocalTract (VocalTractTier me, double time, VocalTract vo
 			long numberOfSections = vtp -> d_vocalTract -> nx;
 			if (numberOfSections != vocaltract -> nx) {
 				forget (vocaltract);
-				Melder_throw ("The number of sections must be equal to ", Melder_integer (numberOfSections), ".");
+				Melder_throw (U"The number of sections must be equal to ", numberOfSections, U".");
 			}
 		}
 		Collection_addItem (my d_vocalTracts, thee.transfer());
 	} catch (MelderError) {
-		Melder_throw (me, ": no VocalTract added.");
+		Melder_throw (me, U": no VocalTract added.");
 	}
 }
 
-VocalTract VocalTractTier_to_VocalTract (VocalTractTier me, double time) {
+autoVocalTract VocalTractTier_to_VocalTract (VocalTractTier me, double time) {
 	try {
 		VocalTractPoint vtp = (VocalTractPoint) my d_vocalTracts -> item[1];
 		long numberOfSections = vtp -> d_vocalTract -> nx;
@@ -132,18 +132,18 @@ VocalTract VocalTractTier_to_VocalTract (VocalTractTier me, double time) {
 			}
 			thy z[1][isection] = RealTier_getValueAtTime (section.peek(), time);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no VocalTract created.");
+		Melder_throw (me, U": no VocalTract created.");
 	}
 }
 
-LPC VocalTractTier_to_LPC (VocalTractTier me, double timeStep) {
+autoLPC VocalTractTier_to_LPC (VocalTractTier me, double timeStep) {
 	try {
 		if (my d_vocalTracts -> size == 0) {
-			Melder_throw ("Empty VocalTractTier");
+			Melder_throw (U"Empty VocalTractTier");
 		}
-		long numberOfFrames = floor((my xmax - my xmin) / timeStep);
+		long numberOfFrames = (long) floor ((my xmax - my xmin) / timeStep);
 		VocalTractPoint vtp = (VocalTractPoint) my d_vocalTracts -> item[1];
 		long numberOfSections = vtp -> d_vocalTract -> nx;
 		double samplingPeriod = 1.0 / (1000.0 * numberOfSections);
@@ -173,9 +173,9 @@ LPC VocalTractTier_to_LPC (VocalTractTier me, double timeStep) {
 			NUMlpc_area_to_lpc (areavec.peek(), numberOfSections + 1, frame -> a);
 			frame -> gain = 1e-6; // something
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (": not converted to LPC.");
+		Melder_throw (U": not converted to LPC.");
 	}
 }
 
diff --git a/LPC/VocalTractTier.h b/LPC/VocalTractTier.h
index 7151d86..0693814 100644
--- a/LPC/VocalTractTier.h
+++ b/LPC/VocalTractTier.h
@@ -2,7 +2,7 @@
 #define _VocalTractTier_h_
 /* VocalTractTier.h
  *
- * Copyright (C) 2012 David Weenink
+ * Copyright (C) 2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,15 +29,17 @@ oo_CLASS_CREATE (VocalTractTier, Function);
 
 void VocalTract_drawSegments (VocalTract me, Graphics g, double maxLength, double maxArea, bool closedAtGlottis);
 
-VocalTractPoint VocalTract_to_VocalTractPoint (VocalTract me, double time);
+autoVocalTractPoint VocalTract_to_VocalTractPoint (VocalTract me, double time);
 
-VocalTractTier VocalTractTier_create (double fromTime, double toTime);
-VocalTractTier VocalTract_to_VocalTractTier (VocalTract me, double startTime, double endTime, double time);
+autoVocalTractTier VocalTractTier_create (double fromTime, double toTime);
+
+autoVocalTractTier VocalTract_to_VocalTractTier (VocalTract me, double startTime, double endTime, double time);
 
 void VocalTractTier_addVocalTract (VocalTractTier me, double time, VocalTract thee);
 
-LPC VocalTractTier_to_LPC (VocalTractTier me, double timeStep);
-VocalTract VocalTractTier_to_VocalTract (VocalTractTier me, double time);
+autoLPC VocalTractTier_to_LPC (VocalTractTier me, double timeStep);
+
+autoVocalTract VocalTractTier_to_VocalTract (VocalTractTier me, double time);
 
 /* End of file VocalTractTier.h */
 #endif
diff --git a/LPC/manual_LPC.cpp b/LPC/manual_LPC.cpp
index d82ea75..93899e8 100644
--- a/LPC/manual_LPC.cpp
+++ b/LPC/manual_LPC.cpp
@@ -29,290 +29,290 @@ void manual_LPC (ManPages me);
 void manual_LPC (ManPages me)
 {
 
-MAN_BEGIN (L"CC: Paint...", L"djmw", 20040407)
-INTRO (L"A command to paint the cepstral coefficients in shades of grey.")
-ENTRY (L"Settings")
-TAG (L"##From coefficient#, ##To coefficient#")
-DEFINITION (L"the range of coefficients that will be represented.")
+MAN_BEGIN (U"CC: Paint...", U"djmw", 20040407)
+INTRO (U"A command to paint the cepstral coefficients in shades of grey.")
+ENTRY (U"Settings")
+TAG (U"##From coefficient#, ##To coefficient#")
+DEFINITION (U"the range of coefficients that will be represented.")
 MAN_END
 
-MAN_BEGIN (L"CC: To DTW...", L"djmw", 19960918)
-INTRO (L"You can choose this command after selecting 2 objects with cepstral "
+MAN_BEGIN (U"CC: To DTW...", U"djmw", 19960918)
+INTRO (U"You can choose this command after selecting 2 objects with cepstral "
 	"coefficients (two @MFCC's or @LFCC's). "
 	"With this command you perform dynamic time warping. ")
-ENTRY (L"Algorithm")
-NORMAL (L"First we calculate distances between cepstral coefficients: ")
-LIST_ITEM (L"The distance between frame %i (from me) and %j (from thee) is:")
-LIST_ITEM (L"    %wc \\.c %d1 + %wle \\.c %d2 + %wr \\.c %d3,")
-LIST_ITEM (L"    where %wc, %wle & %wr are user-supplied weights and")
-LIST_ITEM (L"      %d1 = \\su (%k=1..%nCoefficients; (%c__%ik_ - %c__%jk_)^2)")
-LIST_ITEM (L"      %d2 = (c__%i0_ - c__%j0_)^2")
-LIST_ITEM (L"      %d3 = \\su (%k=1..%nCoefficients; (%r__%ik_ - %r__%jk_)^2), with ")
-LIST_ITEM (L"      %r__%ik_ the regression coefficient of the cepstral coefficients "
+ENTRY (U"Algorithm")
+NORMAL (U"First we calculate distances between cepstral coefficients: ")
+LIST_ITEM (U"The distance between frame %i (from me) and %j (from thee) is:")
+LIST_ITEM (U"    %wc \\.c %d1 + %wle \\.c %d2 + %wr \\.c %d3,")
+LIST_ITEM (U"    where %wc, %wle & %wr are user-supplied weights and")
+LIST_ITEM (U"      %d1 = \\su (%k=1..%nCoefficients; (%c__%ik_ - %c__%jk_)^2)")
+LIST_ITEM (U"      %d2 = (c__%i0_ - c__%j0_)^2")
+LIST_ITEM (U"      %d3 = \\su (%k=1..%nCoefficients; (%r__%ik_ - %r__%jk_)^2), with ")
+LIST_ITEM (U"      %r__%ik_ the regression coefficient of the cepstral coefficients "
 	"from the frames within a time span of %dtr seconds. "
 	"c__%ij_ is %j-th cepstral coefficient in frame %i. ")
-NORMAL (L"Next we find the optimum path through the distance matrix with a "
+NORMAL (U"Next we find the optimum path through the distance matrix with a "
 	"Viterbi-algorithm.")
 MAN_END
 
-MAN_BEGIN (L"CC: To Matrix", L"djmw", 20011123)
-INTRO (L"Copies the cepstral coefficients of the selected @CC "
+MAN_BEGIN (U"CC: To Matrix", U"djmw", 20011123)
+INTRO (U"Copies the cepstral coefficients of the selected @CC "
 	"object to a newly created @Matrix object.")
-ENTRY (L"Behaviour")
-FORMULA (L"%z__%ji_ = %c__%ij_, with 1 \\<_ %i \\<_ %nx and "
+ENTRY (U"Behaviour")
+FORMULA (U"%z__%ji_ = %c__%ij_, with 1 \\<_ %i \\<_ %nx and "
 	"1 \\<_ j \\<_ %numberOfCoefficients__%i_,")
-NORMAL (L"where %z__%ji_ is the matrix element in row %j and column %i and "
+NORMAL (U"where %z__%ji_ is the matrix element in row %j and column %i and "
 	"%c__%ij_ is the %j-th cepstral coefficient in frame %i.")
 MAN_END
 
-MAN_BEGIN (L"Formants: Extract smoothest part...", L"djmw", 20140313)
-INTRO (L"Extracts the part from one of the selected formants which shows the smoothest formant tracks in a given interval.")
-ENTRY (L"Settings")
-SCRIPT (5, Manual_SETTINGS_WINDOW_HEIGHT (5), L""
-	Manual_DRAW_SETTINGS_WINDOW (L"Formants: Extract smoothest part", 5)
-	Manual_DRAW_SETTINGS_WINDOW_RANGE (L"Time range (s)", L"0.0", L"0.0")
-	Manual_DRAW_SETTINGS_WINDOW_RANGE (L"Fitter formant range", L"1", L"3")
-	Manual_DRAW_SETTINGS_WINDOW_FIELD (L"Order of polynomials", L"3")
-	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN (L"Use bandwidths to model formant tracks", 1)
-	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN (L"Bandwidths for smoothing test", 0)
+MAN_BEGIN (U"Formants: Extract smoothest part...", U"djmw", 20140313)
+INTRO (U"Extracts the part from one of the selected formants which shows the smoothest formant tracks in a given interval.")
+ENTRY (U"Settings")
+SCRIPT (5, Manual_SETTINGS_WINDOW_HEIGHT (5), U""
+	Manual_DRAW_SETTINGS_WINDOW (U"Formants: Extract smoothest part", 5)
+	Manual_DRAW_SETTINGS_WINDOW_RANGE (U"Time range (s)", U"0.0", U"0.0")
+	Manual_DRAW_SETTINGS_WINDOW_RANGE (U"Fitter formant range", U"1", U"3")
+	Manual_DRAW_SETTINGS_WINDOW_FIELD (U"Order of polynomials", U"3")
+	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN (U"Use bandwidths to model formant tracks", 1)
+	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN (U"Bandwidths for smoothing test", 0)
 )
-TAG (L"##Time range (s)#")
-DEFINITION (L"determines the position of the intervals that have to be compared.")
-TAG (L"##Fitter formant range")
-DEFINITION (L"determines which formant tracks will be modelled with a polynomial function. The goodness of fit of these models will be used in the comparison.")
-TAG (L"##Order of polynomials")
-DEFINITION (L"determines the maximum order of the polynomials that are used in modeling each formant track. Order 0 means a model which is a constant function; this model needs only one parameter. Order 1 means a model that is a straight line function; this order needs two parameters. Order 2 means that an additional parabolic function is used in the modeling; order 2 needs therefore 3 parameters. In general an order %p model needs %p+1 parameters.")
-TAG (L"##Use bandwidths to model formant tracks")
-DEFINITION (L"Bandwidths give an indication about the sharpness of a spectral peak. Sharp peaks have small bandwidths and, vice versa, broad peaks have large bandwidths. The width of a peak can also be interpreted as a measure of certainty for its formant frequency value. Setting this option %%on%, the default setting, means that you force the modeling function to be closer to frequencies that are well defined, i.e. that have sharp peaks, than to the frequencies of broad peaks, if choice [...]
-TAG (L"##Bandwidths for smoothing test")
-DEFINITION (L"determines whether for the smoothnes determination the formant frequencies are still needed. Not using them anymore probably gives a better indication of the smoothness of a track.")
-MAN_END
-
-MAN_BEGIN (L"PowerCepstrogram", L"djmw", 20130616)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-ENTRY (L"Description")
-NORMAL (L"The PowerCepstrogram shows @@PowerCepstrum|cepstral slices@ as a function of time.")
-MAN_END
-
-MAN_BEGIN (L"PowerCepstrogram: To Table (peak prominence)...", L"djmw", 20130616)
-INTRO (L"A command to create a table with @@PowerCepstrum: Get peak prominence...|cepstral peak prominence@ values.")
-ENTRY (L"Settings")
-SCRIPT (5, Manual_SETTINGS_WINDOW_HEIGHT (7), L""
+TAG (U"##Time range (s)#")
+DEFINITION (U"determines the position of the intervals that have to be compared.")
+TAG (U"##Fitter formant range")
+DEFINITION (U"determines which formant tracks will be modelled with a polynomial function. The goodness of fit of these models will be used in the comparison.")
+TAG (U"##Order of polynomials")
+DEFINITION (U"determines the maximum order of the polynomials that are used in modeling each formant track. Order 0 means a model which is a constant function; this model needs only one parameter. Order 1 means a model that is a straight line function; this order needs two parameters. Order 2 means that an additional parabolic function is used in the modeling; order 2 needs therefore 3 parameters. In general an order %p model needs %p+1 parameters.")
+TAG (U"##Use bandwidths to model formant tracks")
+DEFINITION (U"Bandwidths give an indication about the sharpness of a spectral peak. Sharp peaks have small bandwidths and, vice versa, broad peaks have large bandwidths. The width of a peak can also be interpreted as a measure of certainty for its formant frequency value. Setting this option %%on%, the default setting, means that you force the modeling function to be closer to frequencies that are well defined, i.e. that have sharp peaks, than to the frequencies of broad peaks, if choice [...]
+TAG (U"##Bandwidths for smoothing test")
+DEFINITION (U"determines whether for the smoothnes determination the formant frequencies are still needed. Not using them anymore probably gives a better indication of the smoothness of a track.")
+MAN_END
+
+MAN_BEGIN (U"PowerCepstrogram", U"djmw", 20130616)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+ENTRY (U"Description")
+NORMAL (U"The PowerCepstrogram shows @@PowerCepstrum|cepstral slices@ as a function of time.")
+MAN_END
+
+MAN_BEGIN (U"PowerCepstrogram: To Table (peak prominence)...", U"djmw", 20130616)
+INTRO (U"A command to create a table with @@PowerCepstrum: Get peak prominence...|cepstral peak prominence@ values.")
+ENTRY (U"Settings")
+SCRIPT (5, Manual_SETTINGS_WINDOW_HEIGHT (7), U""
 	Manual_DRAW_SETTINGS_WINDOW ("PowerCepstrogram: To Table (peak prominence)", 7)
-	Manual_DRAW_SETTINGS_WINDOW_RANGE("Peak search pitch range (Hz)", L"60.0", L"300.0")
-	Manual_DRAW_SETTINGS_WINDOW_RADIO (L"Interpolation", L"None", 0)
-	Manual_DRAW_SETTINGS_WINDOW_RADIO (L"", L"Parabolic", 0)
-	Manual_DRAW_SETTINGS_WINDOW_RADIO (L"", L"Cubic", 1)
-	Manual_DRAW_SETTINGS_WINDOW_RADIO (L"", L"Sinc70", 0)
-	Manual_DRAW_SETTINGS_WINDOW_RANGE("Tilt line quefrency range (s)", L"0.001", L"0.0 (=end)")
-	Manual_DRAW_SETTINGS_WINDOW_OPTIONMENU(L"Fit method", L"Robust")
+	Manual_DRAW_SETTINGS_WINDOW_RANGE("Peak search pitch range (Hz)", U"60.0", U"300.0")
+	Manual_DRAW_SETTINGS_WINDOW_RADIO (U"Interpolation", U"None", 0)
+	Manual_DRAW_SETTINGS_WINDOW_RADIO (U"", U"Parabolic", 0)
+	Manual_DRAW_SETTINGS_WINDOW_RADIO (U"", U"Cubic", 1)
+	Manual_DRAW_SETTINGS_WINDOW_RADIO (U"", U"Sinc70", 0)
+	Manual_DRAW_SETTINGS_WINDOW_RANGE("Tilt line quefrency range (s)", U"0.001", U"0.0 (=end)")
+	Manual_DRAW_SETTINGS_WINDOW_OPTIONMENU(U"Fit method", U"Robust")
 )
-NORMAL (L"The meaning of these settings is explained @@PowerCepstrum: Get peak prominence...|here at .")
+NORMAL (U"The meaning of these settings is explained @@PowerCepstrum: Get peak prominence...|here at .")
 MAN_END
 
-MAN_BEGIN(L"PowerCepstrogram: Paint...", L"djmw", 20131001)
-INTRO (L"A command to draw the selected @@PowerCepstrogram@ object(s) in shades of grey.")
-ENTRY (L"Settings")
-SCRIPT (5, Manual_SETTINGS_WINDOW_HEIGHT (7), L""
-	Manual_DRAW_SETTINGS_WINDOW (L"PowerCepstrogram: Paint", 7)
-	Manual_DRAW_SETTINGS_WINDOW_RANGE("Time range (s)", L"0.0", L"0.0")
-	Manual_DRAW_SETTINGS_WINDOW_RANGE("Quefrency range (s)", L"0.0", L"0.0")
-	Manual_DRAW_SETTINGS_WINDOW_FIELD("Maximum (dB)",L"80.0")
+MAN_BEGIN(U"PowerCepstrogram: Paint...", U"djmw", 20131001)
+INTRO (U"A command to draw the selected @@PowerCepstrogram@ object(s) in shades of grey.")
+ENTRY (U"Settings")
+SCRIPT (5, Manual_SETTINGS_WINDOW_HEIGHT (7), U""
+	Manual_DRAW_SETTINGS_WINDOW (U"PowerCepstrogram: Paint", 7)
+	Manual_DRAW_SETTINGS_WINDOW_RANGE("Time range (s)", U"0.0", U"0.0")
+	Manual_DRAW_SETTINGS_WINDOW_RANGE("Quefrency range (s)", U"0.0", U"0.0")
+	Manual_DRAW_SETTINGS_WINDOW_FIELD("Maximum (dB)", U"80.0")
 	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN("Autoscaling",0)
-	Manual_DRAW_SETTINGS_WINDOW_FIELD("Dynamic range (dB)",L"30.0")
-	Manual_DRAW_SETTINGS_WINDOW_FIELD("Dynamic compression (0-1)",L"0.0")
+	Manual_DRAW_SETTINGS_WINDOW_FIELD("Dynamic range (dB)", U"30.0")
+	Manual_DRAW_SETTINGS_WINDOW_FIELD("Dynamic compression (0-1)", U"0.0")
 	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN("Garnish",1)
 )
-TAG (L"##Time range (s)")
-DEFINITION (L"the time domain along the %%x% axis.")
-TAG (L"##Quefrency range (s)")
-DEFINITION (L"the quefency domain along the %%y% axis.")
-TAG (L"##Maximum (dB)")
-DEFINITION (L"cells that have cepstral values greater or equal than this value are drawn in black.")
-TAG (L"##Autoscaling")
-DEFINITION (L"If %%on%, overrules the effects of the previous option and the following three options. I.e. the global maximum and the "
+TAG (U"##Time range (s)")
+DEFINITION (U"the time domain along the %%x% axis.")
+TAG (U"##Quefrency range (s)")
+DEFINITION (U"the quefency domain along the %%y% axis.")
+TAG (U"##Maximum (dB)")
+DEFINITION (U"cells that have cepstral values greater or equal than this value are drawn in black.")
+TAG (U"##Autoscaling")
+DEFINITION (U"If %%on%, overrules the effects of the previous option and the following three options. I.e. the global maximum and the "
 	"global minimum cepstral values determine the maximum blackness and the minimal blackness. Values in-between have apropriate "
 	"values of grey.")
-TAG (L"##Dynamic range (dB)")
-DEFINITION (L"All values more than %%Dynamic range% below the maximum will be drawn in white. Values in-between have apropriate "
+TAG (U"##Dynamic range (dB)")
+DEFINITION (U"All values more than %%Dynamic range% below the maximum will be drawn in white. Values in-between have apropriate "
 	"values of grey.")
-TAG (L"##Dynamic compression (0-1)")
-DEFINITION (L"determines how much stronger weak frames should be made before drawing. Normally this parameter is between 0 and 1. "
+TAG (U"##Dynamic compression (0-1)")
+DEFINITION (U"determines how much stronger weak frames should be made before drawing. Normally this parameter is between 0 and 1. "
 	"If it is 0, no dynamic compression will take place. If it is 1, all time frames (vertical bands) will contain cepstral values "
 	"that are drawn in black. If the global %%maximum% is set at 80 dB, %%autoscaling% is off, %%dynamic range% is 30 dB and "
 	"%%dynamic compression% is 0.4 then for a frame with a local maximum of 40 dB all values will be lifted by 0.4*(80-40)=16 dB, "
 	"so that its maximum will be seen at 56 dB (thus making the corresponding cell visible).")
-TAG (L"##Garnish")
-DEFINITION (L"Draws a box around the cepstrogram and labels the axes.")
+TAG (U"##Garnish")
+DEFINITION (U"Draws a box around the cepstrogram and labels the axes.")
 MAN_END
 
-MAN_BEGIN (L"PowerCepstrogram: Smooth...", L"djmw", 20140117)
-INTRO (L"Smoothes the selected @PowerCepstrogram by averaging cepstra. The smoothed PowerCepstrogram is the result of two separate steps. "
+MAN_BEGIN (U"PowerCepstrogram: Smooth...", U"djmw", 20140117)
+INTRO (U"Smoothes the selected @PowerCepstrogram by averaging cepstra. The smoothed PowerCepstrogram is the result of two separate steps. "
 	"In the first step, cepsta are averaged across time. In the second step, cepstra are averaged across quefrency.")
-ENTRY (L"Settings")
-TAG (L"##Time averaging window (s)")
-DEFINITION (L"determines how many frames will used in the first step, averaging across time. The user-supplied value will be divided "
+ENTRY (U"Settings")
+TAG (U"##Time averaging window (s)")
+DEFINITION (U"determines how many frames will used in the first step, averaging across time. The user-supplied value will be divided "
 	"by the Cepstrograms's time step value (its %dx). If %%numberOfFramesToAverage%, the result of the division, turns out to be one or less, no averaging across time is performed. "
 	"If %%numberOfFramesToAverage% is larger than one and is even, one will be added. "
 	"Each new cepstral frame will be the average of %numberOfFramesToAverage frames of the input Cepstrogram. "
 	"For example, if %numberOfFramesToAverage turns out to be 5, then the %j-th new cepstral frame is the result of averaging the 5 frames with indices %j\\--2 , %j\\--1, %j, %j+1 and %j+2 for all frames %j=3..%%numberOfFrames%\\--2, i.e. besides frame %j, the 2 frames on either side are used in the averaging. The %numberOfFramesToAverage has to be uneven to allow for this symmetric behaviour. ")
-TAG (L"##Quefrency averaging window (s)")
-DEFINITION (L"determines how many quefrency bins will be used for the averaging across quefrency step. The number of bins used in this step "
+TAG (U"##Quefrency averaging window (s)")
+DEFINITION (U"determines how many quefrency bins will be used for the averaging across quefrency step. The number of bins used in this step "
 	"is the result of the division of the user-supplied value by the quefrency step value (the Cepstrogram's %dy). "
 	"If the result turns out to be one or less, no averaging across quefrencies is performed. If the resulting value is even, one will be added. "
 	"If, for example, the result happens to be 3 then the value in quefrency bin %k will be the average value of the values in quefrency bins "
 	"%k\\--1, %k and %k+1. ")
-ENTRY (L"Note")
-NORMAL (L"The following commands should reproduce the smoothing described in the @@Hillenbrand & Houde (1996)@ article, where they use a 20 ms "
+ENTRY (U"Note")
+NORMAL (U"The following commands should reproduce the smoothing described in the @@Hillenbrand & Houde (1996)@ article, where they use a 20 ms "
 	"(10 frame) time smoothing and a 1 ms (10 bin) quefrency smoothing. ")
-CODE (L"selectObject (\"Sound xxx\")")
-CODE (L"To PowerCepstrogram: 0.041, 0.002, 5000.0")
-CODE (L"Smooth: 0.02, 0.001")
+CODE (U"selectObject (\"Sound xxx\")")
+CODE (U"To PowerCepstrogram: 0.041, 0.002, 5000.0")
+CODE (U"Smooth: 0.02, 0.001")
 MAN_END
 
-MAN_BEGIN (L"Cepstrum", L"djmw", 20130616)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-ENTRY (L"Description")
-NORMAL (L"A Cepstrum is the log spectrum of the log power spectrum.")
+MAN_BEGIN (U"Cepstrum", U"djmw", 20130616)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+ENTRY (U"Description")
+NORMAL (U"A Cepstrum is the log spectrum of the log power spectrum.")
 MAN_END
 
-MAN_BEGIN (L"PowerCepstrum", L"djmw", 20130616)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-ENTRY (L"Description")
-NORMAL (L"A PowerCepstrum is the log power spectrum of the log power spectrum. The vertical scale will show the amplitude expressed in dB. The horizontal scale shows %%quefrency% in units of seconds.")
+MAN_BEGIN (U"PowerCepstrum", U"djmw", 20130616)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+ENTRY (U"Description")
+NORMAL (U"A PowerCepstrum is the log power spectrum of the log power spectrum. The vertical scale will show the amplitude expressed in dB. The horizontal scale shows %%quefrency% in units of seconds.")
 MAN_END
 
-MAN_BEGIN (L"PowerCepstrum: Get peak prominence...", L"djmw", 20130616)
-INTRO (L"Calculates the cepstral peak prominence measure (CPP) as defined by @@Hillenbrand et al. (1994)@")
-NORMAL (L"The CPP measure is the difference in amplitude between the cepstral peak and the corresponding value on the regression "
+MAN_BEGIN (U"PowerCepstrum: Get peak prominence...", U"djmw", 20130616)
+INTRO (U"Calculates the cepstral peak prominence measure (CPP) as defined by @@Hillenbrand et al. (1994)@")
+NORMAL (U"The CPP measure is the difference in amplitude between the cepstral peak and the corresponding value on the regression "
 	"line that is directly below the peak (i.e., the predicted magnitude for the quefrency at the cepstral peak). "
 	"The CPP measure represents how far the cepstral peak emerges from the cepstrum background. ")
-ENTRY (L"Settings")
-SCRIPT (7, Manual_SETTINGS_WINDOW_HEIGHT (7), L""
-	Manual_DRAW_SETTINGS_WINDOW (L"PowerCepstrum: Get peak prominence", 7)
-	Manual_DRAW_SETTINGS_WINDOW_RANGE("Search peak in pitch range (s)", L"60.0", L"333.3")
-	Manual_DRAW_SETTINGS_WINDOW_RADIO (L"Interpolation", L"None", 0)
-	Manual_DRAW_SETTINGS_WINDOW_RADIO (L"", L"Parabolic", 0)
-	Manual_DRAW_SETTINGS_WINDOW_RADIO (L"", L"Cubic", 1)
-	Manual_DRAW_SETTINGS_WINDOW_RADIO (L"", L"Sinc70", 0)
-	Manual_DRAW_SETTINGS_WINDOW_RANGE (L"Tilt line quefrency range (s)", L"0.001", L"0.0 (=end)")
-	Manual_DRAW_SETTINGS_WINDOW_OPTIONMENU (L"Fit method", L"Robust")
+ENTRY (U"Settings")
+SCRIPT (7, Manual_SETTINGS_WINDOW_HEIGHT (7), U""
+	Manual_DRAW_SETTINGS_WINDOW (U"PowerCepstrum: Get peak prominence", 7)
+	Manual_DRAW_SETTINGS_WINDOW_RANGE("Search peak in pitch range (s)", U"60.0", U"333.3")
+	Manual_DRAW_SETTINGS_WINDOW_RADIO (U"Interpolation", U"None", 0)
+	Manual_DRAW_SETTINGS_WINDOW_RADIO (U"", U"Parabolic", 0)
+	Manual_DRAW_SETTINGS_WINDOW_RADIO (U"", U"Cubic", 1)
+	Manual_DRAW_SETTINGS_WINDOW_RADIO (U"", U"Sinc70", 0)
+	Manual_DRAW_SETTINGS_WINDOW_RANGE (U"Tilt line quefrency range (s)", U"0.001", U"0.0 (=end)")
+	Manual_DRAW_SETTINGS_WINDOW_OPTIONMENU (U"Fit method", U"Robust")
 )
-TAG (L"##Search peak in pitch range")
-DEFINITION (L"determine the limits of the quefrency range where a peak is searched for. The lower quefrency is determined as "
+TAG (U"##Search peak in pitch range")
+DEFINITION (U"determine the limits of the quefrency range where a peak is searched for. The lower quefrency is determined as "
 	"1 / %%pitchCeiling% and this value is in general more critical than "
 	"the value of the upper quefrency which equals 1 / %%pitchFloor%. A %%pitchCeiling% of 300 Hz will correspond to a lower quefrency of 1/300\\~~0.0033 seconds.")
-TAG (L"##Interpolation")
-DEFINITION (L"determines how the @@vector peak interpolation|amplitude of a peak is determined at .")
-TAG (L"##Tilt line quefrency range")
-DEFINITION (L"the quefrency range for which the amplitudes (in dB) will be modelled by a straight line. "
+TAG (U"##Interpolation")
+DEFINITION (U"determines how the @@vector peak interpolation|amplitude of a peak is determined at .")
+TAG (U"##Tilt line quefrency range")
+DEFINITION (U"the quefrency range for which the amplitudes (in dB) will be modelled by a straight line. "
 	"The lower value for this range in the Hillenbrand article was chosen as 0.001 s "
 	"in order to reduce the effect of the low quefrency data on the straight line fit. In our analysis this value is not so critical "
 	"as we use a more robust straight line fit.")
-TAG (L"##Fit method")
-DEFINITION (L"the default method is @@theil regression|Theil's robust line fit at . However, to be compatible with the past, a standard least squares line fit has also  been implemented.")
-ENTRY (L"Note")
-NORMAL (L"The CPP value does not depend on the reference value used in the dB calculation of the power cepstrum.")
+TAG (U"##Fit method")
+DEFINITION (U"the default method is @@theil regression|Theil's robust line fit at . However, to be compatible with the past, a standard least squares line fit has also  been implemented.")
+ENTRY (U"Note")
+NORMAL (U"The CPP value does not depend on the reference value used in the dB calculation of the power cepstrum.")
 MAN_END
 
-MAN_BEGIN (L"PowerCepstrum: Draw tilt line...", L"djmw", 20130616)
-INTRO (L"Draws the line that models the backgound of the power cepstrum.")
+MAN_BEGIN (U"PowerCepstrum: Draw tilt line...", U"djmw", 20130616)
+INTRO (U"Draws the line that models the backgound of the power cepstrum.")
 MAN_END
 
-MAN_BEGIN (L"Formant & Spectrogram: To IntensityTier...", L"djmw", 20130109)
-INTRO (L"Determines the formant intensities from the selected Spectrogram.")
-NORMAL (L"The intensities at the frequencies of the selected formant are copied from the corresponding positions in the spectrogram. "
+MAN_BEGIN (U"Formant & Spectrogram: To IntensityTier...", U"djmw", 20130109)
+INTRO (U"Determines the formant intensities from the selected Spectrogram.")
+NORMAL (U"The intensities at the frequencies of the selected formant are copied from the corresponding positions in the spectrogram. "
 	"If the selected formant doesn't exist in a particular frame, then a large negative value (< -200 dB) is substituted instead. "
 	"Because the values in the spectrogram are expressed in Pa^^2^/Hz, the units in the intensity tier are in dB/Hz. ")
 MAN_END
 
-MAN_BEGIN (L"LFCC", L"djmw", 20040421)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type LFCC represents cepstral "
+MAN_BEGIN (U"LFCC", U"djmw", 20040421)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type LFCC represents cepstral "
 	"coefficients on a linear frequency scale as a function of time. "
 	"The coefficients are represented in frames with constant sampling "
 	"period.")
-ENTRY (L"#LFCC commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@LPC: To LFCC...")
-MAN_END
-
-MAN_BEGIN (L"LFCC: To LPC...", L"djmw", 20040407)
-INTRO (L"You can choose this command after selecting 1 or more @LFCC's.")
-ENTRY (L"Settings")
-TAG (L"##Number of coefficients")
-DEFINITION (L"the desired number of linear predictive coefficients.")
-ENTRY (L"Behaviour")
-NORMAL (L"The transformation from cepstral coefficients to %a-coefficients "
+ENTRY (U"#LFCC commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@LPC: To LFCC...")
+MAN_END
+
+MAN_BEGIN (U"LFCC: To LPC...", U"djmw", 20040407)
+INTRO (U"You can choose this command after selecting 1 or more @LFCC's.")
+ENTRY (U"Settings")
+TAG (U"##Number of coefficients")
+DEFINITION (U"the desired number of linear predictive coefficients.")
+ENTRY (U"Behaviour")
+NORMAL (U"The transformation from cepstral coefficients to %a-coefficients "
 	"as described in @@Markel & Gray (1976)@.")
 MAN_END
 
-MAN_BEGIN (L"LPC", L"djmw", 19990610)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type LPC represents filter coefficients as a function of time. "
+MAN_BEGIN (U"LPC", U"djmw", 19990610)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type LPC represents filter coefficients as a function of time. "
 	"The coefficients are represented in frames with constant sampling period.")
-ENTRY (L"LPC commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@Sound: To LPC (autocorrelation)...@")
-LIST_ITEM (L"\\bu @@Sound: To LPC (covariance)...@")
-LIST_ITEM (L"\\bu @@Sound: To LPC (burg)...@")
-LIST_ITEM (L"\\bu @@Sound: To LPC (marple)...@")
-ENTRY (L"Conversion")
-LIST_ITEM (L"\\bu @@LPC: To LFCC...|To LFCC...@")
-LIST_ITEM (L"\\bu @@LPC: To Spectrogram...|To Spectrogram...@")
-LIST_ITEM (L"\\bu @@LPC: To Spectrum (slice)...|To Spectrum (slice)...@")
-LIST_ITEM (L"\\bu @@LPC: To Polynomial (slice)...|To Polynomial (slice)...@")
-MAN_END
-
-MAN_BEGIN (L"LPC: Draw gain...", L"djmw", 20040407)
-INTRO (L"You can choose this command after selecting 1 or more @LPC objects.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)#, ##To time (seconds)#")
-DEFINITION (L"the time domain along the %x-axis.")
-TAG (L"##Minimum gain#, ##Maximum gain#")
-DEFINITION (L"the range for the %y-axis.")
-TAG (L"##Garnish")
-DEFINITION (L"determines whether to draw a bounding box and axis labels.")
-ENTRY (L"Behaviour")
-NORMAL (L"Gain will be drawn as a function of time (gain also equals the prediction error "
+ENTRY (U"LPC commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@Sound: To LPC (autocorrelation)...@")
+LIST_ITEM (U"\\bu @@Sound: To LPC (covariance)...@")
+LIST_ITEM (U"\\bu @@Sound: To LPC (burg)...@")
+LIST_ITEM (U"\\bu @@Sound: To LPC (marple)...@")
+ENTRY (U"Conversion")
+LIST_ITEM (U"\\bu @@LPC: To LFCC...|To LFCC...@")
+LIST_ITEM (U"\\bu @@LPC: To Spectrogram...|To Spectrogram...@")
+LIST_ITEM (U"\\bu @@LPC: To Spectrum (slice)...|To Spectrum (slice)...@")
+LIST_ITEM (U"\\bu @@LPC: To Polynomial (slice)...|To Polynomial (slice)...@")
+MAN_END
+
+MAN_BEGIN (U"LPC: Draw gain...", U"djmw", 20040407)
+INTRO (U"You can choose this command after selecting 1 or more @LPC objects.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)#, ##To time (seconds)#")
+DEFINITION (U"the time domain along the %x-axis.")
+TAG (U"##Minimum gain#, ##Maximum gain#")
+DEFINITION (U"the range for the %y-axis.")
+TAG (U"##Garnish")
+DEFINITION (U"determines whether to draw a bounding box and axis labels.")
+ENTRY (U"Behaviour")
+NORMAL (U"Gain will be drawn as a function of time (gain also equals the prediction error "
 	"energy). ")
 MAN_END
 
-MAN_BEGIN (L"LPC: Draw poles...", L"djmw", 20040407)
-INTRO (L"You can choose this command after selecting 1 or more @LPC objects.")
-ENTRY (L"Settings")
-TAG (L"##Time (s)")
-DEFINITION (L"the time of the nearest frame.")
-ENTRY (L"Behaviour")
-NORMAL (L"The @@Roots|roots@ of the @@LPC: To Polynomial (slice)...|linear prediction "
+MAN_BEGIN (U"LPC: Draw poles...", U"djmw", 20040407)
+INTRO (U"You can choose this command after selecting 1 or more @LPC objects.")
+ENTRY (U"Settings")
+TAG (U"##Time (s)")
+DEFINITION (U"the time of the nearest frame.")
+ENTRY (U"Behaviour")
+NORMAL (U"The @@Roots|roots@ of the @@LPC: To Polynomial (slice)...|linear prediction "
 	"polynomial@, constructed from the coefficients "
 	"of the analysis frame, will be drawn in the complex plane.")
 MAN_END
 
-MAN_BEGIN (L"LPC: To LFCC...", L"djmw", 20040407)
-INTRO (L"You can choose this command after selecting 1 or more @LPC objects.")
-ENTRY (L"Behaviour")
-NORMAL (L"The transformation from a-coefficients to cepstral coefficients "
+MAN_BEGIN (U"LPC: To LFCC...", U"djmw", 20040407)
+INTRO (U"You can choose this command after selecting 1 or more @LPC objects.")
+ENTRY (U"Behaviour")
+NORMAL (U"The transformation from a-coefficients to cepstral coefficients "
 	"as described in @@Markel & Gray (1976)@.")
-ENTRY (L"Settings")
-TAG (L"%%Number of coefficients%")
-DEFINITION (L"the desired number of cepstral coefficients.")
+ENTRY (U"Settings")
+TAG (U"%%Number of coefficients%")
+DEFINITION (U"the desired number of cepstral coefficients.")
 MAN_END
 
-MAN_BEGIN (L"LPC: To Matrix", L"djmw", 20011123)
-INTRO (L"Copies the linear prediction coefficients of the selected @LPC "
+MAN_BEGIN (U"LPC: To Matrix", U"djmw", 20011123)
+INTRO (U"Copies the linear prediction coefficients of the selected @LPC "
 	"object to a newly created @Matrix object.")
-ENTRY (L"Behaviour")
-FORMULA (L"%z__%ji_ = %a__%ij_, with 1 \\<_ %i \\<_ %nx and "
+ENTRY (U"Behaviour")
+FORMULA (U"%z__%ji_ = %a__%ij_, with 1 \\<_ %i \\<_ %nx and "
 	"1 \\<_ j \\<_ %nCoefficients__%i_,")
-NORMAL (L"where %z__%ji_ is the matrix element in row %j and column %i and "
+NORMAL (U"where %z__%ji_ is the matrix element in row %j and column %i and "
 	"%a__%ij_ is the %j-th linear prediction coefficient in frame %i.")
 MAN_END
 
-MAN_BEGIN (L"LPC: To Formant", L"djmw", 19970123)
-INTRO (L"You can choose this command after selecting 1 or more @LPC objects.")
-ENTRY (L"Behaviour")
-NORMAL (L"For each LPC_Frame, the zeros of the linear prediction polynomial are extracted. "
+MAN_BEGIN (U"LPC: To Formant", U"djmw", 19970123)
+INTRO (U"You can choose this command after selecting 1 or more @LPC objects.")
+ENTRY (U"Behaviour")
+NORMAL (U"For each LPC_Frame, the zeros of the linear prediction polynomial are extracted. "
 	"Zeros that are outside the unit circle are reflected into it. "
 	"Next, formant frequencies and bandwidths are calculated from all the roots that have the "
 	"imaginary part positive, i.e., that lie in the upper half of the unit circle. "
@@ -320,106 +320,106 @@ NORMAL (L"For each LPC_Frame, the zeros of the linear prediction polynomial are
 	"The remaining frequencies and bandwidths are sorted "
 	"and copied to the Formant_Frame. Finally, the %gain field of the LPC is copied to the %intensity "
 	"field of the Formant_Frame.")
-ENTRY (L"Algorithm")
-NORMAL (L"The root finder is Laguerre's method followed by root polishing, see @@Press "
+ENTRY (U"Algorithm")
+NORMAL (U"The root finder is Laguerre's method followed by root polishing, see @@Press "
 	"et al. (1992)@.")
-ENTRY (L"Warning")
-LIST_ITEM (L"\\bu The formant values can be very inaccurate if you did not resample the Sound "
+ENTRY (U"Warning")
+LIST_ITEM (U"\\bu The formant values can be very inaccurate if you did not resample the Sound "
 	"before the LPC-analysis (consult the @@Source-filter synthesis@ tutorial).")
-LIST_ITEM (L"\\bu The results of the root finder may not always be accurate when more than 30 "
+LIST_ITEM (U"\\bu The results of the root finder may not always be accurate when more than 30 "
 	"roots have to be found.")
 MAN_END
 
-MAN_BEGIN (L"LPC: To Polynomial (slice)...", L"djmw", 20040407)
-INTRO (L"A command that creates a Polynomial object from each selected @LPC object.")
-ENTRY (L"Settings")
-TAG (L"##Time (s)")
-DEFINITION (L"defines the LPC frame whose coefficents will be selected.")
-ENTRY (L"Behaviour")
-NORMAL (L"The linear prediction coefficients %a__1..%n_ of the selected LPC "
+MAN_BEGIN (U"LPC: To Polynomial (slice)...", U"djmw", 20040407)
+INTRO (U"A command that creates a Polynomial object from each selected @LPC object.")
+ENTRY (U"Settings")
+TAG (U"##Time (s)")
+DEFINITION (U"defines the LPC frame whose coefficents will be selected.")
+ENTRY (U"Behaviour")
+NORMAL (U"The linear prediction coefficients %a__1..%n_ of the selected LPC "
 	"frame will be copied to polynomial coefficients %c__1..%n+1_ as follows:")
-FORMULA (L"%c__%i_ = %a__%n\\--%i+1_, ")
-FORMULA (L"%c__%n+1_ = 1")
+FORMULA (U"%c__%i_ = %a__%n\\--%i+1_, ")
+FORMULA (U"%c__%n+1_ = 1")
 MAN_END
 
-MAN_BEGIN (L"LPC: To Spectrum (slice)...", L"djmw", 20071120)
-INTRO (L"You can choose this command after selecting 1 or more @LPC objects.")
-ENTRY (L"Settings")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which the Spectrum must be calculated.")
-TAG (L"##Minimum frequency resolution (Hz)")
-DEFINITION (L"successive frequencies in the @Spectrum "
+MAN_BEGIN (U"LPC: To Spectrum (slice)...", U"djmw", 20071120)
+INTRO (U"You can choose this command after selecting 1 or more @LPC objects.")
+ENTRY (U"Settings")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which the Spectrum must be calculated.")
+TAG (U"##Minimum frequency resolution (Hz)")
+DEFINITION (U"successive frequencies in the @Spectrum "
 	"will be maximally this distance apart.")
-TAG (L"##Bandwidth reduction (Hz)")
-DEFINITION (L"formants with small bandwidths show up very well as peaks in the spectrum because the poles "
+TAG (U"##Bandwidth reduction (Hz)")
+DEFINITION (U"formants with small bandwidths show up very well as peaks in the spectrum because the poles "
 	"lie close to the contour along which the spectrum is computed (the unit circle in the z-plane). "
 	"Peak enhancement can be realized by computing the spectrum in the z-plane along a contour of radius "
 	"%r = exp (\\-- %\\pi \\.c %bandwidthReduction / %samplingFrequency). "
 	"This technique is also called off-axis spectrum computation. "
 	"Negative values evaluate the spectrum on a contour %outside the unit circle and therefore result in a "
 	"flattened  spectrum.")
-TAG (L"##De-emphasis frequency (Hz)")
-DEFINITION (L"Performs de-emphasis when frequency is in the interval (0, @@Nyquist frequency@)")
-ENTRY (L"Algorithm")
-NORMAL (L"The Spectrum at time %t will be calculated from the %nearest LPC_Frame according to:")
-FORMULA (L"Spectrum (%f) = \\Vr(%gain\\.c%T/%df) / (1 + \\su__%k=1..%numberOfCoefficients_ %a__%k_%z^^\\--%k^),")
-NORMAL (L"where %T is the sampling period and %z = exp (\\--2 %\\pi %i %f %T) and %df is the distance in Hz "
+TAG (U"##De-emphasis frequency (Hz)")
+DEFINITION (U"Performs de-emphasis when frequency is in the interval (0, @@Nyquist frequency@)")
+ENTRY (U"Algorithm")
+NORMAL (U"The Spectrum at time %t will be calculated from the %nearest LPC_Frame according to:")
+FORMULA (U"Spectrum (%f) = \\Vr(%gain\\.c%T/%df) / (1 + \\su__%k=1..%numberOfCoefficients_ %a__%k_%z^^\\--%k^),")
+NORMAL (U"where %T is the sampling period and %z = exp (\\--2 %\\pi %i %f %T) and %df is the distance in Hz "
 	"between two successive components in the Spectrum.")
-LIST_ITEM (L"1. Allocate a large enough buffer[1..%nfft] to perform an FFT analysis.")
-LIST_ITEM (L"2. Make the first value of the buffer 1 and copy the prediction coefficients #a into "
+LIST_ITEM (U"1. Allocate a large enough buffer[1..%nfft] to perform an FFT analysis.")
+LIST_ITEM (U"2. Make the first value of the buffer 1 and copy the prediction coefficients #a into "
 	"the buffer. This results in buffer values: (1, %a__1_, ..., %a__%numberOfCoefficients_, 0, ..., 0).")
-LIST_ITEM (L"3. If ##De-emphasis frequency# is in the interval (0, %nyquistFrequency) then \"multiply\" "
+LIST_ITEM (U"3. If ##De-emphasis frequency# is in the interval (0, %nyquistFrequency) then \"multiply\" "
 	"the buffer with (1 - %b %z^^\\--1^), where %b = exp (\\-- %\\pi %deEmphasisFrequency %T). "
 	"This results in buffer values: (1, %a__1_\\--%b, %a__2_\\--%b\\.c%a__1_, ..., "
 	"%a__%numberOfCoefficients_\\--%b\\.c%a__%numberOfCoefficients\\--1_, "
 	"\\--%b\\.c%a__%numberOfCoefficients_, 0, ..., 0). Note that the number of values in the buffer that differ from 0 "
 	"has increased by one.")
-LIST_ITEM (L"4. If ##Bandwidth reduction# is greater than 0 then multiply corresponding values in the buffer by %g^^%i\\--1^ where "
+LIST_ITEM (U"4. If ##Bandwidth reduction# is greater than 0 then multiply corresponding values in the buffer by %g^^%i\\--1^ where "
 	"%g = exp (2%\\pi %bandwidthReduction %T / %nfft), and %i is the position index in the buffer. "
 	"%i runs from 1 to %numberOfCoefficients+1+%t, where %t equals 1 when de-emphasis was performed, "
 	"else 0.")
-LIST_ITEM (L"5. Calculate the FFT spectrum of the buffer with the coefficients. This results in complex "
+LIST_ITEM (U"5. Calculate the FFT spectrum of the buffer with the coefficients. This results in complex "
 	"amplitudes (%a__%j_,%b__%j_), %j=1..%nfft/2+1.")
-LIST_ITEM (L"6. Calculate the LPC Spectrum by taking the inverse of the FFT spectrum, i.e., each complex "
+LIST_ITEM (U"6. Calculate the LPC Spectrum by taking the inverse of the FFT spectrum, i.e., each complex "
 	"amplitude becomes (%a__%j_,%b__%j_)^^\\--1^ = (%a__%j_,\\--%b__%j_) / (%a__%j_^2 + %b__%j_^2)")
-LIST_ITEM (L"7. Multiply all values with the scale factor \\Vr(%gain\\.c%T/%df).")
+LIST_ITEM (U"7. Multiply all values with the scale factor \\Vr(%gain\\.c%T/%df).")
 MAN_END
 
-MAN_BEGIN (L"LPC: To Spectrogram...", L"djmw", 20040407)
-INTRO (L"You can choose this command after selecting 1 or more @LPC objects.")
-ENTRY (L"Settings")
-TAG (L"##Minimum frequency resolution (Hz)")
-DEFINITION (L"successive frequencies in the Spectrum will be maximally this distance apart")
-TAG (L"##Bandwidth reduction (Hz)")
-DEFINITION (L"formants with small bandwidths show up very well as darker regions in the spectrogram "
+MAN_BEGIN (U"LPC: To Spectrogram...", U"djmw", 20040407)
+INTRO (U"You can choose this command after selecting 1 or more @LPC objects.")
+ENTRY (U"Settings")
+TAG (U"##Minimum frequency resolution (Hz)")
+DEFINITION (U"successive frequencies in the Spectrum will be maximally this distance apart")
+TAG (U"##Bandwidth reduction (Hz)")
+DEFINITION (U"formants with small bandwidths show up very well as darker regions in the spectrogram "
 	"because the poles lie close to the contour along which a spectrum is computed (the unit circle "
 	"in the z-plane). "
 	"Peak enhancement can be realized by computing a spectrum in the z-plane along a contour of radius "
 	"%r = exp (\\-- %\\pi \\.c %bandwidthReduction / %samplingFrequency).")
-TAG (L"##De-emphasis frequency (Hz)")
-DEFINITION (L"Performs de-emphasis when value is in the interval (0, @@Nyquist frequency@)")
-ENTRY (L"Algorithm")
-NORMAL (L"For each LPC_Frame the corresponding Spectrum will be calculated according to the algorithm "
+TAG (U"##De-emphasis frequency (Hz)")
+DEFINITION (U"Performs de-emphasis when value is in the interval (0, @@Nyquist frequency@)")
+ENTRY (U"Algorithm")
+NORMAL (U"For each LPC_Frame the corresponding Spectrum will be calculated according to the algorithm "
 	"explained in @@LPC: To Spectrum (slice)... at . "
 	"For each frequency the power, i.e., the square of the complex values, will be stored in the "
 	"corresponding area in the Spectrogram.")
 MAN_END
 
-MAN_BEGIN (L"LPC: To VocalTract (slice)...", L"djmw", 20050615)
-INTRO (L"You can choose this command after selecting 1 or more @LPC objects.")
-ENTRY (L"Settings")
-TAG (L"##Time (s)")
-DEFINITION (L"the time of the nearest frame, in seconds.")
-TAG (L"##Length (m)")
-DEFINITION (L"the length of the vocal tract, in metres.")
+MAN_BEGIN (U"LPC: To VocalTract (slice)...", U"djmw", 20050615)
+INTRO (U"You can choose this command after selecting 1 or more @LPC objects.")
+ENTRY (U"Settings")
+TAG (U"##Time (s)")
+DEFINITION (U"the time of the nearest frame, in seconds.")
+TAG (U"##Length (m)")
+DEFINITION (U"the length of the vocal tract, in metres.")
 /*
-TAG (L"##Compute length according to Wakita")
-DEFINITION (L"the length of the vocal tract is calculated according "
+TAG (U"##Compute length according to Wakita")
+DEFINITION (U"the length of the vocal tract is calculated according "
 	"to the algorithm as described in @@Wakita (1977)@.")
-ENTRY (L"Behaviour")
-NORMAL (L"A new @VocalTract area function is calculated from the prediction coefficients in the frame. ")
-ENTRY (L"Warning")
-NORMAL (L"If ##Compute length according to Wakita# is on, the optimal length is searched for in the range from 0.1 m to "
+ENTRY (U"Behaviour")
+NORMAL (U"A new @VocalTract area function is calculated from the prediction coefficients in the frame. ")
+ENTRY (U"Warning")
+NORMAL (U"If ##Compute length according to Wakita# is on, the optimal length is searched for in the range from 0.1 m to "
 	"0.25 m. This length calculation is extremely sensitive to the number of and the positions of the formants "
 	"with respect to the @@Nyquist frequency at . For example, there is a large difference "
 	"between the vocal tract length estimates if the highest formant is just below or just above the "
@@ -427,140 +427,140 @@ NORMAL (L"If ##Compute length according to Wakita# is on, the optimal length is
 	"The algorithm is not very reliable in vocal tract length estimation and we do not recommend using it. " )*/
 MAN_END
 
-MAN_BEGIN (L"LPC & Sound: Filter...", L"djmw", 20040407)
-INTRO (L"A command that creates a new Sound object from one @Sound and one @LPC "
+MAN_BEGIN (U"LPC & Sound: Filter...", U"djmw", 20040407)
+INTRO (U"A command that creates a new Sound object from one @Sound and one @LPC "
 	"object which have been selected together.")
-ENTRY (L"Settings")
-TAG (L"##Use LPC gain")
-DEFINITION (L"Determines whether the gain from the LPC is used in the synthesis.")
-ENTRY (L"Behaviour")
-NORMAL (L"Filters the selected Sound by the selected LPC-filter.")
-NORMAL (L"When the LPC-gain is used the samples in the new Sound will be "
+ENTRY (U"Settings")
+TAG (U"##Use LPC gain")
+DEFINITION (U"Determines whether the gain from the LPC is used in the synthesis.")
+ENTRY (U"Behaviour")
+NORMAL (U"Filters the selected Sound by the selected LPC-filter.")
+NORMAL (U"When the LPC-gain is used the samples in the new Sound will be "
 	"multiplied with the square root of the corresponding LPC-gain value.")
-NORMAL (L"In #Z-domain notation: #O(%z) = #H(%z) \\.c #E(%z), where "
+NORMAL (U"In #Z-domain notation: #O(%z) = #H(%z) \\.c #E(%z), where "
 	"#E(%z) is the selected filter input Sound, #H(%z) the selected LPC filter, "
 	"and, #O(%z) the filter output (the new Sound that will appear in the List of objects).")
 MAN_END
 
-MAN_BEGIN (L"LPC & Sound: Filter with filter at time...", L"djmw", 20101009)
-INTRO (L"Filters the selected @Sound with a static filter that is formed by the filter coefficients "
+MAN_BEGIN (U"LPC & Sound: Filter with filter at time...", U"djmw", 20101009)
+INTRO (U"Filters the selected @Sound with a static filter that is formed by the filter coefficients "
 	"from only one @LPC frame.")
-ENTRY (L"Settings")
-TAG (L"##Channel")
-DEFINITION (L"determines the sound channel to be filtered.")
-TAG (L"##Use filter at time (s)")
-DEFINITION (L"determines which LPC frame will be chosen to filter the sound. ")
+ENTRY (U"Settings")
+TAG (U"##Channel")
+DEFINITION (U"determines the sound channel to be filtered.")
+TAG (U"##Use filter at time (s)")
+DEFINITION (U"determines which LPC frame will be chosen to filter the sound. ")
 MAN_END
 
-MAN_BEGIN (L"LPC & Sound: Filter (inverse)", L"djmw", 19970126)
-INTRO (L"A command that creates a new Sound object from one @Sound and one @LPC "
+MAN_BEGIN (U"LPC & Sound: Filter (inverse)", U"djmw", 19970126)
+INTRO (U"A command that creates a new Sound object from one @Sound and one @LPC "
 	"object which have been selected together.")
-ENTRY (L"Behaviour")
-NORMAL (L"Given a filter (the selected LPC) and its output (the selected Sound), "
+ENTRY (U"Behaviour")
+NORMAL (U"Given a filter (the selected LPC) and its output (the selected Sound), "
 	"its input is reconstructed (the new Sound that will appear in the List of objects).")
-NORMAL (L"In Z-domain notation: #E(%z) = #O(%z) / #H(%z), where "
+NORMAL (U"In Z-domain notation: #E(%z) = #O(%z) / #H(%z), where "
 	"#O(%z) is the filter output Sound, #H(%z) the LPC filter, and, #E(%z) the filter "
 	"input Sound. (Selecting this newly generated Sound and the LPC, choosing the option "
 	"`Filter...' generates a Sound that is identical to the Sound that originated "
 	"the LPC.)")
 MAN_END
 
-MAN_BEGIN (L"LPC & Sound: Filter (inverse) with filter at time...", L"djmw", 20101009)
-INTRO (L"%%Inverse% filters the selected @Sound with a static inverse filter that is formed by the filter coefficients "
+MAN_BEGIN (U"LPC & Sound: Filter (inverse) with filter at time...", U"djmw", 20101009)
+INTRO (U"%%Inverse% filters the selected @Sound with a static inverse filter that is formed by the filter coefficients "
 	"from only one @LPC frame.")
-ENTRY (L"Settings")
-TAG (L"##Channel")
-DEFINITION (L"determines the sound channel to be filtered.")
-TAG (L"##Use filter at time (s)")
-DEFINITION (L"determines which LPC frame will be chosen to inverse filter the sound. ")
+ENTRY (U"Settings")
+TAG (U"##Channel")
+DEFINITION (U"determines the sound channel to be filtered.")
+TAG (U"##Use filter at time (s)")
+DEFINITION (U"determines which LPC frame will be chosen to inverse filter the sound. ")
 MAN_END
 
-MAN_BEGIN (L"MFCC", L"djmw", 20141022)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type MFCC represents mel frequency cepstral coefficients "
+MAN_BEGIN (U"MFCC", U"djmw", 20141022)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type MFCC represents mel frequency cepstral coefficients "
 	"as a function of time. The coefficients are represented in frames "
 	"at constant sampling period.")
-ENTRY (L"MFCC commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@Sound: To MFCC...@")
-LIST_ITEM (L"\\bu @@MelSpectrogram: To MFCC...@")
-MAN_END
-
-MAN_BEGIN (L"MFCC: To MelFilter...", L"djmw", 20141023)
-INTRO (L"A #deprecated command replaced by @@MFCC: To MelSpectrogram... at .")
-ENTRY (L"Settings")
-TAG (L"##From coefficient#, ##To coefficient#")
-DEFINITION (L"the range of coefficients that will be used in the reconstruction.")
-ENTRY (L"Details")
-NORMAL (L"The output of the triangular filters in a mel filter bank will be "
+ENTRY (U"MFCC commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@Sound: To MFCC...@")
+LIST_ITEM (U"\\bu @@MelSpectrogram: To MFCC...@")
+MAN_END
+
+MAN_BEGIN (U"MFCC: To MelFilter...", U"djmw", 20141023)
+INTRO (U"A #deprecated command replaced by @@MFCC: To MelSpectrogram... at .")
+ENTRY (U"Settings")
+TAG (U"##From coefficient#, ##To coefficient#")
+DEFINITION (U"the range of coefficients that will be used in the reconstruction.")
+ENTRY (U"Details")
+NORMAL (U"The output of the triangular filters in a mel filter bank will be "
 	"reconstructed by applying the inverse cosine transform:")
-FORMULA (L"%P__%j_ = 2/N (%c__0_/2 + \\Si__%k=1_^^%N-1^ %c__%k_ cos (\\pi%k(%j-0.5)/%N))),")
-NORMAL (L"where %N represents the number of filters, %j runs from 1 to %N, and coefficients %c__%k_ with %k less than "
+FORMULA (U"%P__%j_ = 2/N (%c__0_/2 + \\Si__%k=1_^^%N-1^ %c__%k_ cos (\\pi%k(%j-0.5)/%N))),")
+NORMAL (U"where %N represents the number of filters, %j runs from 1 to %N, and coefficients %c__%k_ with %k less than "
 	"%%fromCoefficient% and %k larger than %%toCoefficient% take zero values in the evaluation.")
 MAN_END
 
-MAN_BEGIN (L"MFCC: To MelSpectrogram...", L"djmw", 20141023)
-INTRO (L"A command to (re)construct a @MelSpectrogram object from the selected @MFCC object.")
-ENTRY (L"Settings")
-TAG (L"##From coefficient#, ##To coefficient#")
-DEFINITION (L"the range of coefficients that will be used in the reconstruction.")
-TAG (L"##Include constant term")
-DEFINITION (L"selects whether or not to include the %c__0_ coefficient in the reconstruction. As can be seen from the formula below, the contribution of the %c__0_ term is equal for each filter.")
-ENTRY (L"Details")
-NORMAL (L"The values %P__%j_ in each frame of the MelSpectrogram will be constructed by applying the inverse Discrete Cosine Transform to the corresponding frame of the MFCC object:")
-FORMULA (L"%P__%j_ = 2/N (%c__0_/2 + \\Si__%k=1_^^%N-1^ %c__%k_ cos (\\pi%k(%j-0.5)/%N))),")
-NORMAL (L"where %N represents the number of filters that were used to get the MFCC object, %j runs from 1 to %N, and coefficients %c__%k_ with %k less than "
+MAN_BEGIN (U"MFCC: To MelSpectrogram...", U"djmw", 20141023)
+INTRO (U"A command to (re)construct a @MelSpectrogram object from the selected @MFCC object.")
+ENTRY (U"Settings")
+TAG (U"##From coefficient#, ##To coefficient#")
+DEFINITION (U"the range of coefficients that will be used in the reconstruction.")
+TAG (U"##Include constant term")
+DEFINITION (U"selects whether or not to include the %c__0_ coefficient in the reconstruction. As can be seen from the formula below, the contribution of the %c__0_ term is equal for each filter.")
+ENTRY (U"Details")
+NORMAL (U"The values %P__%j_ in each frame of the MelSpectrogram will be constructed by applying the inverse Discrete Cosine Transform to the corresponding frame of the MFCC object:")
+FORMULA (U"%P__%j_ = 2/N (%c__0_/2 + \\Si__%k=1_^^%N-1^ %c__%k_ cos (\\pi%k(%j-0.5)/%N))),")
+NORMAL (U"where %N represents the number of filters that were used to get the MFCC object, %j runs from 1 to %N, and coefficients %c__%k_ with %k less than "
 	"%%fromCoefficient% and %k larger than %%toCoefficient% take zero values in the evaluation.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To PowerCepstrogram...", L"djmw", 20130616)
-INTRO (L"A command that creates a @@PowerCepstrogram@ from every selected @@Sound at .")
-ENTRY (L"Settings")
-TAG (L"##Pitch floor (Hz)")
-DEFINITION (L"determines the effective length of the analysis window: it will be 3 longest periods long, i.e. if the pitch floor is 60 Hz, the window will be 3/60 = 0.05 seconds long.")
-TAG (L"##Time step (s)")
-TAG (L"##Maximum frequency (Hz)")
-TAG (L"##Pre-emphasis from (Hz)")
+MAN_BEGIN (U"Sound: To PowerCepstrogram...", U"djmw", 20130616)
+INTRO (U"A command that creates a @@PowerCepstrogram@ from every selected @@Sound at .")
+ENTRY (U"Settings")
+TAG (U"##Pitch floor (Hz)")
+DEFINITION (U"determines the effective length of the analysis window: it will be 3 longest periods long, i.e. if the pitch floor is 60 Hz, the window will be 3/60 = 0.05 seconds long.")
+TAG (U"##Time step (s)")
+TAG (U"##Maximum frequency (Hz)")
+TAG (U"##Pre-emphasis from (Hz)")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Formant (robust)...", L"djmw", 20111027)
-INTRO (L"A command that creates a @@Formant@ object from every selected @@Sound at . ")
-ENTRY (L"Settings")
-NORMAL (L"The settings for ##Time step (s)#, ##Maximum number of formants#, ##Maximum formant (Hz), "
+MAN_BEGIN (U"Sound: To Formant (robust)...", U"djmw", 20111027)
+INTRO (U"A command that creates a @@Formant@ object from every selected @@Sound at . ")
+ENTRY (U"Settings")
+NORMAL (U"The settings for ##Time step (s)#, ##Maximum number of formants#, ##Maximum formant (Hz), "
 	"##Window length (s)# and ##Pre emphasis from (Hz)# are as in @@Sound: To Formant (burg)... at . "
 	" The following settings determine aspects of the iterative formant frequency refinement.")
-TAG (L"%%Number of std. dev.%,")
-DEFINITION (L"determines the number of standard deviation from where selective weighing of samples starts. ")
-TAG (L"%%Maximum number of iterations%,")
-DEFINITION (L"determines the maximum number of iterations allowed in the refinement step.")
-TAG (L"%%Tolerance%,")
-DEFINITION (L"detemines another stop ctriterion for the refinement step. If the relative change in variance "
+TAG (U"%%Number of std. dev.%,")
+DEFINITION (U"determines the number of standard deviation from where selective weighing of samples starts. ")
+TAG (U"%%Maximum number of iterations%,")
+DEFINITION (U"determines the maximum number of iterations allowed in the refinement step.")
+TAG (U"%%Tolerance%,")
+DEFINITION (U"detemines another stop ctriterion for the refinement step. If the relative change in variance "
 	"between successive iterations is less then this value, iteration stops. Iteration stops whenever "
 	"one of the two defined stop criteria is reached.")
-ENTRY (L"Algorithm")
-NORMAL (L"First the sound is downsampled to twice the maximum formant frequency. Next the LPC coefficients are determined by the autocorrelation method. Finally, in an iterative procedure as described by @@Lee (1988)@ the formant frequencies and bandwidths are refined by selectively weighting of samples values.")
+ENTRY (U"Algorithm")
+NORMAL (U"First the sound is downsampled to twice the maximum formant frequency. Next the LPC coefficients are determined by the autocorrelation method. Finally, in an iterative procedure as described by @@Lee (1988)@ the formant frequencies and bandwidths are refined by selectively weighting of samples values.")
 MAN_END
 
-MAN_BEGIN (L"Sound: LPC analysis", L"djmw", 19970126)
-INTRO (L"You can perform this analysis by selecting one or more @Sound objects and "
+MAN_BEGIN (U"Sound: LPC analysis", U"djmw", 19970126)
+INTRO (U"You can perform this analysis by selecting one or more @Sound objects and "
 	"choosing the appropriate command to generate an @LPC.")
-NORMAL (L"The acronym LPC stands for Linear Predictive Coding.")
-NORMAL (L"In the LPC analysis one tries to predict %x__%n_ on the basis of the %p previous samples,")
-FORMULA (L"%x\\'p__%n_ = \\su %a__%k_ %x__%%n-k%_")
-NORMAL (L"then {%a__1_, %a__2_, ..., %a__%p_} can be chosen to minimize the prediction power %%Q__p_% where")
-FORMULA (L"%%Q__p_% = E[ |%x__%n_ - %x\\'p__%n_|^2].")
-NORMAL (L"Several different algorithms exist for minimizing %%Q__p_%:")
-LIST_ITEM (L"\\bu @@Sound: To LPC (autocorrelation)...|To LPC (autocorrelation)...@")
-LIST_ITEM (L"\\bu @@Sound: To LPC (covariance)...|To LPC (covariance)...@")
-LIST_ITEM (L"\\bu @@Sound: To LPC (burg)...|To LPC (burg)...@")
-LIST_ITEM (L"\\bu @@Sound: To LPC (marple)...|To LPC (marple)...@")
+NORMAL (U"The acronym LPC stands for Linear Predictive Coding.")
+NORMAL (U"In the LPC analysis one tries to predict %x__%n_ on the basis of the %p previous samples,")
+FORMULA (U"%x\\'p__%n_ = \\su %a__%k_ %x__%%n-k%_")
+NORMAL (U"then {%a__1_, %a__2_, ..., %a__%p_} can be chosen to minimize the prediction power %%Q__p_% where")
+FORMULA (U"%%Q__p_% = E[ |%x__%n_ - %x\\'p__%n_|^2].")
+NORMAL (U"Several different algorithms exist for minimizing %%Q__p_%:")
+LIST_ITEM (U"\\bu @@Sound: To LPC (autocorrelation)...|To LPC (autocorrelation)...@")
+LIST_ITEM (U"\\bu @@Sound: To LPC (covariance)...|To LPC (covariance)...@")
+LIST_ITEM (U"\\bu @@Sound: To LPC (burg)...|To LPC (burg)...@")
+LIST_ITEM (U"\\bu @@Sound: To LPC (marple)...|To LPC (marple)...@")
 MAN_END
 
 #define Sound_to_LPC_COMMON_HELP(method) \
-INTRO (L"With this command you create a new @LPC from every selected @Sound, " \
+INTRO (U"With this command you create a new @LPC from every selected @Sound, " \
 	"using " #method " method.") \
-ENTRY (L"Warning") \
-NORMAL (L"You are advised not to use this command for formant analysis. " \
+ENTRY (U"Warning") \
+NORMAL (U"You are advised not to use this command for formant analysis. " \
 	"For formant analysis, instead use @@Sound: To Formant (burg)...@, " \
 	"which also works via LPC (linear predictive coding). This is because " \
 	"##Sound: To Formant (burg)...# lets you specify a maximum frequency, " \
@@ -570,114 +570,114 @@ NORMAL (L"You are advised not to use this command for formant analysis. " \
 	"For instance, if you want five formants below 5500 Hz but your Sound has a sampling frequency " \
 	"of 44100 Hz, you have to downsample the sound to 11000 Hz with the @@Sound: Resample...@ command. " \
 	"After that, you can use the ##To LPC# commands, with a prediction order of 10 or 11.") \
-ENTRY (L"Settings") \
-TAG (L"##Prediction order#") \
-DEFINITION (L"the number of linear prediction coefficients, also called the %%number of poles%. " \
+ENTRY (U"Settings") \
+TAG (U"##Prediction order#") \
+DEFINITION (U"the number of linear prediction coefficients, also called the %%number of poles%. " \
 	"Choose this number at least twice as large as the number of spectral peaks that you want " \
 	"to detect.") \
-TAG (L"##Analysis window duration (s)") \
-DEFINITION (L"the effective duration of each analysis frame, in seconds.") \
-TAG (L"##Time step (s)") \
-DEFINITION (L"the time step between two consecutive analysis frames.") \
-TAG (L"##Pre-emphasis frequency (Hz)") \
-DEFINITION (L"a +6dB / octave filtering will be applied above this frequency. " \
+TAG (U"##Analysis window duration (s)") \
+DEFINITION (U"the effective duration of each analysis frame, in seconds.") \
+TAG (U"##Time step (s)") \
+DEFINITION (U"the time step between two consecutive analysis frames.") \
+TAG (U"##Pre-emphasis frequency (Hz)") \
+DEFINITION (U"a +6dB / octave filtering will be applied above this frequency. " \
 	"A pre-emphasis frequency of 48.47 Hz for a signal with a sampling frequency of 10 kHz " \
 	"approximately corresponds to a value of %a = 0.97 for the filter %y__%n_ = %x__%n_ - %a \\.c %x__%n-1_. " \
 	"The relation between %a and the pre-emphasis frequency is: " \
 	"%a = exp (\\--2\\.c%\\pi\\.c%preemphasisFrequency/%samplingFrequency). " \
 	"If you do not want pre-emphasis, choose a frequency greater than the @@Nyquist frequency at .")
 
-MAN_BEGIN (L"Sound: To LPC (autocorrelation)...", L"David Weenink & Paul Boersma", 20040407)
+MAN_BEGIN (U"Sound: To LPC (autocorrelation)...", U"David Weenink & Paul Boersma", 20040407)
 Sound_to_LPC_COMMON_HELP ("the autocorrelation")
-ENTRY (L"Algorithm")
-NORMAL (L"The autocorrelation algorithm is decribed in @@Markel & Gray (1976)@.")
+ENTRY (U"Algorithm")
+NORMAL (U"The autocorrelation algorithm is decribed in @@Markel & Gray (1976)@.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To LPC (covariance)...", L"David Weenink & Paul Boersma", 20040407)
+MAN_BEGIN (U"Sound: To LPC (covariance)...", U"David Weenink & Paul Boersma", 20040407)
 Sound_to_LPC_COMMON_HELP ("the covariance")
-ENTRY (L"Algorithm")
-NORMAL (L"The covariance algorithm is decribed in @@Markel & Gray (1976)@.")
+ENTRY (U"Algorithm")
+NORMAL (U"The covariance algorithm is decribed in @@Markel & Gray (1976)@.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To LPC (marple)...", L"djmw", 19970126)
+MAN_BEGIN (U"Sound: To LPC (marple)...", U"djmw", 19970126)
 Sound_to_LPC_COMMON_HELP ("Marple's")
-TAG (L"##Tolerance 1")
-DEFINITION (L"stop the iteration when %E(%m) / %E(0) < %%Tolerance 1%, where %E(%m) is the "
+TAG (U"##Tolerance 1")
+DEFINITION (U"stop the iteration when %E(%m) / %E(0) < %%Tolerance 1%, where %E(%m) is the "
 	"prediction error for order %m.")
-TAG (L"##Tolerance 2")
-DEFINITION (L"stop the iteration when (%E(%m) - %E(%m-1)) / %E(%m-1) < %%Tolerance 2.")
-ENTRY (L"Algorithm")
-NORMAL (L"The algorithm is described in @@Marple (1980)@.")
+TAG (U"##Tolerance 2")
+DEFINITION (U"stop the iteration when (%E(%m) - %E(%m-1)) / %E(%m-1) < %%Tolerance 2.")
+ENTRY (U"Algorithm")
+NORMAL (U"The algorithm is described in @@Marple (1980)@.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To LPC (burg)...", L"David Weenink & Paul Boersma", 20040407)
+MAN_BEGIN (U"Sound: To LPC (burg)...", U"David Weenink & Paul Boersma", 20040407)
 Sound_to_LPC_COMMON_HELP ("Burg's")
-ENTRY (L"Algorithm")
-NORMAL (L"Burg's algorithm is described in @@Anderson (1978)@")
+ENTRY (U"Algorithm")
+NORMAL (U"Burg's algorithm is described in @@Anderson (1978)@")
 MAN_END
 
-MAN_BEGIN (L"Sound: To MFCC...", L"djmw", 20141022)
-INTRO (L"A command that creates a @MFCC object from every selected @Sound "
+MAN_BEGIN (U"Sound: To MFCC...", U"djmw", 20141022)
+INTRO (U"A command that creates a @MFCC object from every selected @Sound "
 	"object.")
-NORMAL (L"The analysis proceeds in two steps:")
-LIST_ITEM (L"1.  We perform a spectrum analysis on a mel frequency scale "
+NORMAL (U"The analysis proceeds in two steps:")
+LIST_ITEM (U"1.  We perform a spectrum analysis on a mel frequency scale "
 	"(see @@Sound: To MelSpectrogram...@ for details).")
-LIST_ITEM (L"2.  We convert the melspectrogram values to mel frequency cepstral "
+LIST_ITEM (U"2.  We convert the melspectrogram values to mel frequency cepstral "
 	"coefficients (see @@MelSpectrogram: To MFCC...@ for details).")
 MAN_END
 
-MAN_BEGIN (L"VocalTractTier", L"djmw", 20120423)
-INTRO (L"One of the @@types of objects@ in Praat. A VocalTractTier objects contains a number of (%time, %VocalTract) points, where a @@VocalTract@ represents the area function of the vocal tract expressed as m^^2^, running from the glottis to the lips.")
+MAN_BEGIN (U"VocalTractTier", U"djmw", 20120423)
+INTRO (U"One of the @@types of objects@ in Praat. A VocalTractTier objects contains a number of (%time, %VocalTract) points, where a @@VocalTract@ represents the area function of the vocal tract expressed as m^^2^, running from the glottis to the lips.")
 MAN_END
 
-MAN_BEGIN (L"theil regression", L"djmw", 20130710)
-NORMAL (L"a robust linear regression method, first proposed by @@Theil (1950)@. The slope of the regression line is estimated as "
+MAN_BEGIN (U"theil regression", U"djmw", 20130710)
+NORMAL (U"a robust linear regression method, first proposed by @@Theil (1950)@. The slope of the regression line is estimated as "
 	"the median of all pairwise slopes between each pair of points in the data set. Because this number of pairs increases quadratically "
 	"with the number of data points, we have implemented a somewhat less computationally intensive procedure, the %%incomplete% theil regression. In the incomplete method we first split the data set of %N data points (%x__%i_, %y__%i_), %i = 1..%N, in two equal sets "
 	"of size %N/2 and then calculate %N/2 slopes as ")
-FORMULA (L"%m__%i_ = (%y__%N/2+%i_ - %y__%i_) / (%x__%N/2+%i_ - %x__%i_), for %i = 1..%N/2.")
-NORMAL (L"The regression slope %m is calculated as the median of these %N/2 values %m__%i_.")
-NORMAL (L"Given the slope %m, the offset %b is calculated as the median of the %N values %b__%i_= %y__%i_ - %m\\.c%x__%i_.")
-NORMAL (L"The theil regression has a breakdown point of 29.3\\% , which means that it can tolerate arbitrary corruption of up to 29.3% of the input data-points without degradation of its accuracy")
+FORMULA (U"%m__%i_ = (%y__%N/2+%i_ - %y__%i_) / (%x__%N/2+%i_ - %x__%i_), for %i = 1..%N/2.")
+NORMAL (U"The regression slope %m is calculated as the median of these %N/2 values %m__%i_.")
+NORMAL (U"Given the slope %m, the offset %b is calculated as the median of the %N values %b__%i_= %y__%i_ - %m\\.c%x__%i_.")
+NORMAL (U"The theil regression has a breakdown point of 29.3\\% , which means that it can tolerate arbitrary corruption of up to 29.3% of the input data-points without degradation of its accuracy")
 MAN_END
 
-MAN_BEGIN (L"Anderson (1978)", L"djmw", 20030701)
-NORMAL (L"N. Anderson (1978): \"On the calculation of filter coefficients for "
+MAN_BEGIN (U"Anderson (1978)", U"djmw", 20030701)
+NORMAL (U"N. Anderson (1978): \"On the calculation of filter coefficients for "
 	"maximum entropy spectral analysis.\" In Childers: %%Modern Spectrum Analysis%, "
 	"IEEE Press: 252\\--255.")
 MAN_END
 
-MAN_BEGIN (L"Hillenbrand et al. (1994)", L"djmw", 20121017)
-NORMAL (L"J. Hillenbrand, R.A. Cleveland & R.L. Erickson (1994): \"Acoustic correlates of breathy vocal quality\", %%Journal of speech and hearing research% #37: 769\\--778.")
+MAN_BEGIN (U"Hillenbrand et al. (1994)", U"djmw", 20121017)
+NORMAL (U"J. Hillenbrand, R.A. Cleveland & R.L. Erickson (1994): \"Acoustic correlates of breathy vocal quality\", %%Journal of speech and hearing research% #37: 769\\--778.")
 MAN_END
 
-MAN_BEGIN (L"Hillenbrand & Houde (1996)", L"djmw", 20121203)
-NORMAL (L"J. Hillenbrand & R.A. Houde (1996): \"Acoustic correlates of breathy vocal quality: Dysphonic voices and continuous speech\", %%Journal of speech and hearing research% #39: 311\\--321.")
+MAN_BEGIN (U"Hillenbrand & Houde (1996)", U"djmw", 20121203)
+NORMAL (U"J. Hillenbrand & R.A. Houde (1996): \"Acoustic correlates of breathy vocal quality: Dysphonic voices and continuous speech\", %%Journal of speech and hearing research% #39: 311\\--321.")
 
 MAN_END
 
-MAN_BEGIN (L"Lee (1988)", L"djmw", 20111027)
-NORMAL (L"C.-H. Lee (1988): \"On Robust Linear Prediction of Speech.\", %%IEEE Trans. on ASSP% #36: 642\\--649.")
+MAN_BEGIN (U"Lee (1988)", U"djmw", 20111027)
+NORMAL (U"C.-H. Lee (1988): \"On Robust Linear Prediction of Speech.\", %%IEEE Trans. on ASSP% #36: 642\\--649.")
 MAN_END
 
-MAN_BEGIN (L"Markel & Gray (1976)", L"djmw", 19980114)
-NORMAL (L"J.D. Markel & A.H. Gray, Jr. (1976): %%Linear Prediction of Speech.% "
+MAN_BEGIN (U"Markel & Gray (1976)", U"djmw", 19980114)
+NORMAL (U"J.D. Markel & A.H. Gray, Jr. (1976): %%Linear Prediction of Speech.% "
 	"Springer Verlag, Berlin.")
 MAN_END
 
 
-MAN_BEGIN (L"Marple (1980)", L"djmw", 19980114)
-NORMAL (L"L. Marple (1980): \"A new autoregressive spectrum analysis algorithm.\" "
+MAN_BEGIN (U"Marple (1980)", U"djmw", 19980114)
+NORMAL (U"L. Marple (1980): \"A new autoregressive spectrum analysis algorithm.\" "
 	"%%IEEE Trans. on ASSP% #28, 441\\--454.")
 MAN_END
 
-MAN_BEGIN (L"Theil (1950)", L"djmw", 20121118)
-NORMAL (L"H. Theil (1950): \"A rank-invariant method of linear and polynomial regression analysis\", "
+MAN_BEGIN (U"Theil (1950)", U"djmw", 20121118)
+NORMAL (U"H. Theil (1950): \"A rank-invariant method of linear and polynomial regression analysis\", "
 	"%%Proceedings of Koninklijke Nederlandse Akademie van Wetenschappen% ##A.53#: 1397\\--1412.")
 MAN_END
 
-MAN_BEGIN (L"Wakita (1977)", L"djmw", 19980114)
-NORMAL (L"H. Wakita (1977): \"Normalization of vowels by vocal-tract "
+MAN_BEGIN (U"Wakita (1977)", U"djmw", 19980114)
+NORMAL (U"H. Wakita (1977): \"Normalization of vowels by vocal-tract "
 	"length and its application to vowel identification.\" %%IEEE Trans. on ASSP% "
 	"#25: 183\\--192.")
 MAN_END
diff --git a/LPC/praat_LPC_init.cpp b/LPC/praat_LPC_init.cpp
index b412288..fc1df11 100644
--- a/LPC/praat_LPC_init.cpp
+++ b/LPC/praat_LPC_init.cpp
@@ -56,9 +56,9 @@
 #undef iam
 #define iam iam_LOOP
 
-static const wchar_t *DRAW_BUTTON    = L"Draw -";
-static const wchar_t *QUERY_BUTTON   = L"Query -";
-static const wchar_t *MODIFY_BUTTON   = L"Modify -";
+static const char32 *DRAW_BUTTON    = U"Draw -";
+static const char32 *QUERY_BUTTON   = U"Query -";
+static const char32 *MODIFY_BUTTON   = U"Modify -";
 
 void praat_CC_init (ClassInfo klas);
 void praat_TimeFrameSampled_query_init (ClassInfo klas);
@@ -76,480 +76,482 @@ DIRECT (Cepstrum_downto_PowerCepstrum)
 END
 
 DIRECT (PowerCepstrum_help)
-	Melder_help (L"PowerCepstrum");
+	Melder_help (U"PowerCepstrum");
 END
 
-FORM (Cepstrum_drawLinear, L"Cepstrum: Draw linear", L"Cepstrum: Draw (linear)...")
-	REAL (L"left Quefrency range (s)", L"0.0")
-	REAL (L"right Quefrency range (s)", L"0.0")
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (Cepstrum_drawLinear, U"Cepstrum: Draw linear", U"Cepstrum: Draw (linear)...")
+	REAL (U"left Quefrency range (s)", U"0.0")
+	REAL (U"right Quefrency range (s)", U"0.0")
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Cepstrum);
-		Cepstrum_drawLinear (me, GRAPHICS, GET_REAL (L"left Quefrency range"), GET_REAL (L"right Quefrency range"),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"), GET_INTEGER (L"Garnish"));
+		Cepstrum_drawLinear (me, GRAPHICS, GET_REAL (U"left Quefrency range"), GET_REAL (U"right Quefrency range"),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (PowerCepstrum_draw, L"PowerCepstrum: Draw", L"PowerCepstrum: Draw...")
-	REAL (L"left Quefrency range (s)", L"0.0")
-	REAL (L"right Quefrency range (s)", L"0.0")
-	REAL (L"Minimum (dB)", L"0.0")
-	REAL (L"Maximum (dB)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (PowerCepstrum_draw, U"PowerCepstrum: Draw", U"PowerCepstrum: Draw...")
+	REAL (U"left Quefrency range (s)", U"0.0")
+	REAL (U"right Quefrency range (s)", U"0.0")
+	REAL (U"Minimum (dB)", U"0.0")
+	REAL (U"Maximum (dB)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (PowerCepstrum);
-		PowerCepstrum_draw (me, GRAPHICS, GET_REAL (L"left Quefrency range"), GET_REAL (L"right Quefrency range"),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"), GET_INTEGER (L"Garnish"));
-	}
-END
-
-FORM (PowerCepstrum_drawTiltLine, L"PowerCepstrum: Draw tilt line", L"PowerCepstrum: Draw tilt line...")
-	REAL (L"left Quefrency range (s)", L"0.0")
-	REAL (L"right Quefrency range (s)", L"0.0")
-	REAL (L"left Amplitude range (dB)", L"0.0")
-	REAL (L"right Amplitude range (dB)", L"0.0")
-	LABEL (L"", L"Parameters for the tilt line fit")
-	REAL (L"left Tilt line quefrency range (s)", L"0.001")
-	REAL (L"right Tilt line quefrency range (s)", L"0.0 (=end)")
-	OPTIONMENU (L"Line type", 1)
-	OPTION (L"Straight")
-	OPTION (L"Exponential decay")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+		PowerCepstrum_draw (me, GRAPHICS, GET_REAL (U"left Quefrency range"), GET_REAL (U"right Quefrency range"),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"), GET_INTEGER (U"Garnish"));
+	}
+END
+
+FORM (PowerCepstrum_drawTiltLine, U"PowerCepstrum: Draw tilt line", U"PowerCepstrum: Draw tilt line...")
+	REAL (U"left Quefrency range (s)", U"0.0")
+	REAL (U"right Quefrency range (s)", U"0.0")
+	REAL (U"left Amplitude range (dB)", U"0.0")
+	REAL (U"right Amplitude range (dB)", U"0.0")
+	LABEL (U"", U"Parameters for the tilt line fit")
+	REAL (U"left Tilt line quefrency range (s)", U"0.001")
+	REAL (U"right Tilt line quefrency range (s)", U"0.0 (=end)")
+	OPTIONMENU (U"Line type", 1)
+	OPTION (U"Straight")
+	OPTION (U"Exponential decay")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (PowerCepstrum);
-		PowerCepstrum_drawTiltLine (me, GRAPHICS, GET_REAL (L"left Quefrency range"), GET_REAL (L"right Quefrency range"),
-			GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"),
-			GET_REAL (L"left Tilt line quefrency range"), GET_REAL (L"right Tilt line quefrency range"), 
-			GET_INTEGER (L"Line type"), GET_INTEGER (L"Fit method"));
+		PowerCepstrum_drawTiltLine (me, GRAPHICS, GET_REAL (U"left Quefrency range"), GET_REAL (U"right Quefrency range"),
+			GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"),
+			GET_REAL (U"left Tilt line quefrency range"), GET_REAL (U"right Tilt line quefrency range"), 
+			GET_INTEGER (U"Line type"), GET_INTEGER (U"Fit method"));
 	}
 END
 
-FORM (PowerCepstrum_formula, L"PowerCepstrum: Formula...", L"PowerCepstrum: Formula...")
-	LABEL (L"label", L"y := y1; for row := 1 to nrow do { x := x1; "
+FORM (PowerCepstrum_formula, U"PowerCepstrum: Formula...", U"PowerCepstrum: Formula...")
+	LABEL (U"label", U"y := y1; for row := 1 to nrow do { x := x1; "
 		"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + dx } y := y + dy }")
-	TEXTFIELD (L"formula", L"self")
+	TEXTFIELD (U"formula", U"self")
 	OK
 DO
 	praat_Fon_formula (dia, interpreter);
 END
 
-FORM (PowerCepstrum_getPeak, L"PowerCepstrum: Get peak", 0)
-	REAL (L"left Search peak in pitch range (Hz)", L"60.0")
-	REAL (L"right Search peak in pitch range (Hz)", L"333.3")
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
+FORM (PowerCepstrum_getPeak, U"PowerCepstrum: Get peak", 0)
+	REAL (U"left Search peak in pitch range (Hz)", U"60.0")
+	REAL (U"right Search peak in pitch range (Hz)", U"333.3")
+	RADIO (U"Interpolation", 2)
+	RADIOBUTTON (U"None")
+	RADIOBUTTON (U"Parabolic")
+	RADIOBUTTON (U"Cubic")
+	RADIOBUTTON (U"Sinc70")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
 		double peakdB, quefrency;
-		PowerCepstrum_getMaximumAndQuefrency (me, GET_REAL (L"left Search peak in pitch range"), GET_REAL (L"right Search peak in pitch range"), GET_INTEGER (L"Interpolation") - 1, &peakdB, &quefrency);
-		Melder_informationReal (peakdB, L" dB");
+		PowerCepstrum_getMaximumAndQuefrency (me, GET_REAL (U"left Search peak in pitch range"), GET_REAL (U"right Search peak in pitch range"), GET_INTEGER (U"Interpolation") - 1, &peakdB, &quefrency);
+		Melder_informationReal (peakdB, U" dB");
 	}
 END
 
-FORM (PowerCepstrum_getQuefrencyOfPeak, L"PowerCepstrum: Get quefrency of peak", 0)
-	REAL (L"left Search peak in pitch range (Hz)", L"60.0")
-	REAL (L"right Search peak in pitch range (Hz)", L"333.3")
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
+FORM (PowerCepstrum_getQuefrencyOfPeak, U"PowerCepstrum: Get quefrency of peak", 0)
+	REAL (U"left Search peak in pitch range (Hz)", U"60.0")
+	REAL (U"right Search peak in pitch range (Hz)", U"333.3")
+	RADIO (U"Interpolation", 2)
+	RADIOBUTTON (U"None")
+	RADIOBUTTON (U"Parabolic")
+	RADIOBUTTON (U"Cubic")
+	RADIOBUTTON (U"Sinc70")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
 		double peakdB, quefrency;
-		PowerCepstrum_getMaximumAndQuefrency (me, GET_REAL (L"left Search peak in pitch range"), GET_REAL (L"right Search peak in pitch range"), GET_INTEGER (L"Interpolation") - 1, &peakdB, &quefrency);
-		double f = 1 / quefrency;
-		Melder_information (Melder_double (quefrency), L" s (f =", Melder_double (f), L" Hz)");
+		PowerCepstrum_getMaximumAndQuefrency (me, GET_REAL (U"left Search peak in pitch range"), GET_REAL (U"right Search peak in pitch range"), GET_INTEGER (U"Interpolation") - 1, &peakdB, &quefrency);
+		double f = 1.0 / quefrency;
+		Melder_information (quefrency, U" s (f =", f, U" Hz)");
 	}
 END
 
-FORM (PowerCepstrum_getRNR, L"PowerCepstrum: Get rhamonics to noise ration", 0)
-	REAL (L"left Pitch range (Hz)", L"60.0")
-	REAL (L"right Pitch range (Hz)", L"333.3")
-	POSITIVE (L"Fractional width (0-1)", L"0.05")
+FORM (PowerCepstrum_getRNR, U"PowerCepstrum: Get rhamonics to noise ration", 0)
+	REAL (U"left Pitch range (Hz)", U"60.0")
+	REAL (U"right Pitch range (Hz)", U"333.3")
+	POSITIVE (U"Fractional width (0-1)", U"0.05")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
-		double rnr = PowerCepstrum_getRNR (me, GET_REAL (L"left Pitch range"), GET_REAL (L"right Pitch range"), GET_REAL (L"Fractional width"));
-		Melder_information (Melder_double (rnr), L" (rnr)");
+		double rnr = PowerCepstrum_getRNR (me, GET_REAL (U"left Pitch range"), GET_REAL (U"right Pitch range"), GET_REAL (U"Fractional width"));
+		Melder_information (rnr, U" (rnr)");
 	}
 END
 
-FORM (PowerCepstrum_getPeakProminence_hillenbrand, L"PowerCepstrum: Get peak prominence (hillenbrand)", L"PowerCepstrum: Get peak prominence (hillenbrand)...")
-	REAL (L"left Search peak in pitch range (Hz)", L"60.0")
-	REAL (L"right Search peak in pitch range (Hz)", L"333.3")
+FORM (PowerCepstrum_getPeakProminence_hillenbrand, U"PowerCepstrum: Get peak prominence (hillenbrand)", U"PowerCepstrum: Get peak prominence (hillenbrand)...")
+	REAL (U"left Search peak in pitch range (Hz)", U"60.0")
+	REAL (U"right Search peak in pitch range (Hz)", U"333.3")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
 		double qpeak, cpp = PowerCepstrum_getPeakProminence_hillenbrand (me,
-			GET_REAL (L"left Search peak in pitch range"), GET_REAL (L"right Search peak in pitch range"), &qpeak);
-		Melder_information (Melder_double (cpp), L" dB; quefrency=", Melder_double (qpeak), L" s (f=",
-			Melder_double (1 / qpeak), L" Hz).");
+			GET_REAL (U"left Search peak in pitch range"), GET_REAL (U"right Search peak in pitch range"), &qpeak);
+		Melder_information (cpp, U" dB; quefrency=", qpeak, U" s (f=",
+			1.0 / qpeak, U" Hz).");
 	}
 END
 
-FORM (PowerCepstrum_getTiltLineSlope, L"PowerCepstrum: Get tilt line slope", 0)
-	REAL (L"left Tilt line quefrency range (s)", L"0.001")
-	REAL (L"right Tilt line quefrency range (s)", L"0.0 (=end)")
-	OPTIONMENU (L"Line type", 1)
-	OPTION (L"Straight")
-	OPTION (L"Exponential decay")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+FORM (PowerCepstrum_getTiltLineSlope, U"PowerCepstrum: Get tilt line slope", 0)
+	REAL (U"left Tilt line quefrency range (s)", U"0.001")
+	REAL (U"right Tilt line quefrency range (s)", U"0.0 (=end)")
+	OPTIONMENU (U"Line type", 1)
+	OPTION (U"Straight")
+	OPTION (U"Exponential decay")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
 		double a, intercept;
-		int lineType = GET_INTEGER (L"Line type");
-		PowerCepstrum_fitTiltLine (me, GET_REAL (L"left Tilt line quefrency range"), GET_REAL (L"right Tilt line quefrency range"), 
-			  &a, &intercept, lineType, GET_INTEGER (L"Fit method"));
-		Melder_information (Melder_double (a), L" dB / ", lineType == 1 ? L"s" : L"ln (s)");
+		int lineType = GET_INTEGER (U"Line type");
+		PowerCepstrum_fitTiltLine (me, GET_REAL (U"left Tilt line quefrency range"), GET_REAL (U"right Tilt line quefrency range"), 
+			  &a, &intercept, lineType, GET_INTEGER (U"Fit method"));
+		Melder_information (a, U" dB / ", lineType == 1 ? U"s" : U"ln (s)");
 	}
 END
 
 
-FORM (PowerCepstrum_getTiltLineIntercept, L"PowerCepstrum: Get tilt line intercept", 0)
-	REAL (L"left Tilt line quefrency range (s)", L"0.001")
-	REAL (L"right Tilt line quefrency range (s)", L"0.0 (=end)")
-	OPTIONMENU (L"Line type", 1)
-	OPTION (L"Straight")
-	OPTION (L"Exponential decay")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+FORM (PowerCepstrum_getTiltLineIntercept, U"PowerCepstrum: Get tilt line intercept", 0)
+	REAL (U"left Tilt line quefrency range (s)", U"0.001")
+	REAL (U"right Tilt line quefrency range (s)", U"0.0 (=end)")
+	OPTIONMENU (U"Line type", 1)
+	OPTION (U"Straight")
+	OPTION (U"Exponential decay")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
 		double a, intercept;
-		int lineType = GET_INTEGER (L"Line type");
-		PowerCepstrum_fitTiltLine (me, GET_REAL (L"left Tilt line quefrency range"), GET_REAL (L"right Tilt line quefrency range"), 
-			  &a, &intercept, lineType, GET_INTEGER (L"Fit method"));
-		Melder_information (Melder_double (intercept), L" dB");
-	}
-END
-
-FORM (PowerCepstrum_getPeakProminence, L"PowerCepstrum: Get peak prominence", L"PowerCepstrum: Get peak prominence...")
-	REAL (L"left Search peak in pitch range (Hz)", L"60.0")
-	REAL (L"right Search peak in pitch range (Hz)", L"333.3")
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
-	REAL (L"left Tilt line quefrency range (s)", L"0.001")
-	REAL (L"right Tilt line quefrency range (s)", L"0.0 (=end)")
-	OPTIONMENU (L"Line type", 1)
-	OPTION (L"Straight")
-	OPTION (L"Exponential decay")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+		int lineType = GET_INTEGER (U"Line type");
+		PowerCepstrum_fitTiltLine (me, GET_REAL (U"left Tilt line quefrency range"), GET_REAL (U"right Tilt line quefrency range"), 
+			  &a, &intercept, lineType, GET_INTEGER (U"Fit method"));
+		Melder_information (intercept, U" dB");
+	}
+END
+
+FORM (PowerCepstrum_getPeakProminence, U"PowerCepstrum: Get peak prominence", U"PowerCepstrum: Get peak prominence...")
+	REAL (U"left Search peak in pitch range (Hz)", U"60.0")
+	REAL (U"right Search peak in pitch range (Hz)", U"333.3")
+	RADIO (U"Interpolation", 2)
+	RADIOBUTTON (U"None")
+	RADIOBUTTON (U"Parabolic")
+	RADIOBUTTON (U"Cubic")
+	RADIOBUTTON (U"Sinc70")
+	REAL (U"left Tilt line quefrency range (s)", U"0.001")
+	REAL (U"right Tilt line quefrency range (s)", U"0.0 (=end)")
+	OPTIONMENU (U"Line type", 1)
+	OPTION (U"Straight")
+	OPTION (U"Exponential decay")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
 		double qpeak, cpp = PowerCepstrum_getPeakProminence (me,
-			GET_REAL (L"left Search peak in pitch range"), GET_REAL (L"right Search peak in pitch range"),
-			GET_INTEGER (L"Interpolation") - 1,
-			GET_REAL (L"left Tilt line quefrency range"), GET_REAL (L"right Tilt line quefrency range"),
-			GET_INTEGER (L"Line type"), GET_INTEGER (L"Fit method"), &qpeak);
-		Melder_information (Melder_double (cpp), L" dB; quefrency=", Melder_double (qpeak), L" s (f=",
-			Melder_double (1 / qpeak), L" Hz).");
-	}
-END
-
-FORM (PowerCepstrum_subtractTilt_inline, L"PowerCepstrum: Subtract tilt (in-line)", 0)
-	REAL (L"left Tilt line quefrency range (s)", L"0.001")
-	REAL (L"right Tilt line quefrency range (s)", L"0.0 (=end)")
-	OPTIONMENU (L"Line type", 1)
-	OPTION (L"Straight")
-	OPTION (L"Exponential decay")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+			GET_REAL (U"left Search peak in pitch range"), GET_REAL (U"right Search peak in pitch range"),
+			GET_INTEGER (U"Interpolation") - 1,
+			GET_REAL (U"left Tilt line quefrency range"), GET_REAL (U"right Tilt line quefrency range"),
+			GET_INTEGER (U"Line type"), GET_INTEGER (U"Fit method"), &qpeak);
+		Melder_information (cpp, U" dB; quefrency=", qpeak, U" s (f=",
+			1.0 / qpeak, U" Hz).");
+	}
+END
+
+FORM (PowerCepstrum_subtractTilt_inline, U"PowerCepstrum: Subtract tilt (in-line)", 0)
+	REAL (U"left Tilt line quefrency range (s)", U"0.001")
+	REAL (U"right Tilt line quefrency range (s)", U"0.0 (=end)")
+	OPTIONMENU (U"Line type", 1)
+	OPTION (U"Straight")
+	OPTION (U"Exponential decay")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
-		PowerCepstrum_subtractTilt_inline (me, GET_REAL (L"left Tilt line quefrency range"), 
-			GET_REAL (L"right Tilt line quefrency range"), GET_INTEGER (L"Line type"), GET_INTEGER (L"Fit method"));
+		PowerCepstrum_subtractTilt_inline (me, GET_REAL (U"left Tilt line quefrency range"), 
+			GET_REAL (U"right Tilt line quefrency range"), GET_INTEGER (U"Line type"), GET_INTEGER (U"Fit method"));
 	}
 END
 
-FORM (PowerCepstrum_smooth_inline, L"PowerCepstrum: Smooth (in-line)", 0)
-	REAL (L"Quefrency averaging window (s)", L"0.0005")
-	NATURAL (L"Number of iterations", L"1");
+FORM (PowerCepstrum_smooth_inline, U"PowerCepstrum: Smooth (in-line)", 0)
+	REAL (U"Quefrency averaging window (s)", U"0.0005")
+	NATURAL (U"Number of iterations", U"1");
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
-		PowerCepstrum_smooth_inline (me, GET_REAL (L"Quefrency averaging window"), GET_INTEGER (L"Number of iterations"));
+		PowerCepstrum_smooth_inline (me, GET_REAL (U"Quefrency averaging window"), GET_INTEGER (U"Number of iterations"));
 	}
 END
 
-FORM (PowerCepstrum_smooth, L"PowerCepstrum: Smooth", 0)
-	REAL (L"Quefrency averaging window (s)", L"0.0005")
-	NATURAL (L"Number of iterations", L"1");
+FORM (PowerCepstrum_smooth, U"PowerCepstrum: Smooth", 0)
+	REAL (U"Quefrency averaging window (s)", U"0.0005")
+	NATURAL (U"Number of iterations", U"1");
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
-		autoPowerCepstrum thee = PowerCepstrum_smooth (me, GET_REAL (L"Quefrency averaging window"), GET_INTEGER (L"Number of iterations"));
-		praat_new (thee.transfer(), my name, L"_smooth");
+		autoPowerCepstrum thee = PowerCepstrum_smooth (me, GET_REAL (U"Quefrency averaging window"), GET_INTEGER (U"Number of iterations"));
+		praat_new (thee.transfer(), my name, U"_smooth");
 	}
 END
 
-FORM (PowerCepstrum_subtractTilt, L"PowerCepstrum: Subtract tilt", 0)
-	REAL (L"left Tilt line quefrency range (s)", L"0.001")
-	REAL (L"right Tilt line quefrency range (s)", L"0.0 (=end)")
-	OPTIONMENU (L"Line type", 1)
-	OPTION (L"Straight")
-	OPTION (L"Exponential decay")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+FORM (PowerCepstrum_subtractTilt, U"PowerCepstrum: Subtract tilt", 0)
+	REAL (U"left Tilt line quefrency range (s)", U"0.001")
+	REAL (U"right Tilt line quefrency range (s)", U"0.0 (=end)")
+	OPTIONMENU (U"Line type", 1)
+	OPTION (U"Straight")
+	OPTION (U"Exponential decay")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrum);
-		autoPowerCepstrum thee = PowerCepstrum_subtractTilt (me, GET_REAL (L"left Tilt line quefrency range"), 
-			GET_REAL (L"right Tilt line quefrency range"), GET_INTEGER (L"Line type"), GET_INTEGER (L"Fit method"));
-		praat_new (thee.transfer(), my name, L"minusTilt");
+		autoPowerCepstrum thee = PowerCepstrum_subtractTilt (me, GET_REAL (U"left Tilt line quefrency range"), 
+			GET_REAL (U"right Tilt line quefrency range"), GET_INTEGER (U"Line type"), GET_INTEGER (U"Fit method"));
+		praat_new (thee.transfer(), my name, U"minusTilt");
 	}
 END
 
 DIRECT (Cepstrum_to_Spectrum)
 	LOOP {
 		iam (Cepstrum);
-		praat_new (Cepstrum_to_Spectrum (me), my name);
+		autoSpectrum thee = Cepstrum_to_Spectrum (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 DIRECT (PowerCepstrum_to_Matrix)
 	LOOP {
 		iam (PowerCepstrum);
-		praat_new (PowerCepstrum_to_Matrix (me), my name);
+		autoMatrix thee = PowerCepstrum_to_Matrix (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 /********************** Cepstrogram  ****************************************/
 
 DIRECT (PowerCepstrogram_help)
-	Melder_help (L"PowerCepstrogram");
+	Melder_help (U"PowerCepstrogram");
 END
 
-FORM (old_PowerCepstrogram_paint, L"PowerCepstrogram: Paint", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Quefrency range (s)", L"0.0")
-	REAL (L"right Quefrency range (s)", L"0.0")
-	REAL (L"Minimum (dB)", L"0.0")
-	REAL (L"Maximum (dB)", L"0.0")
-	BOOLEAN (L"Garnish", 1);
+FORM (old_PowerCepstrogram_paint, U"PowerCepstrogram: Paint", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Quefrency range (s)", U"0.0")
+	REAL (U"right Quefrency range (s)", U"0.0")
+	REAL (U"Minimum (dB)", U"0.0")
+	REAL (U"Maximum (dB)", U"0.0")
+	BOOLEAN (U"Garnish", 1);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (PowerCepstrogram);
-		PowerCepstrogram_paint (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Quefrency range"), GET_REAL (L"right Quefrency range"),
-			GET_REAL (L"Maximum"), false, GET_REAL (L"Maximum") - GET_REAL (L"Minimum"),
-			0.0, GET_INTEGER (L"Garnish"));
+		PowerCepstrogram_paint (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Quefrency range"), GET_REAL (U"right Quefrency range"),
+			GET_REAL (U"Maximum"), false, GET_REAL (U"Maximum") - GET_REAL (U"Minimum"),
+			0.0, GET_INTEGER (U"Garnish"));
         }
 END
 
-FORM (PowerCepstrogram_paint, L"PowerCepstrogram: Paint", L"PowerCepstrogram: Paint...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Quefrency range (s)", L"0.0")
-	REAL (L"right Quefrency range (s)", L"0.0")
-	REAL (L"Maximum (dB)", L"80.0")
-	BOOLEAN (L"Autoscaling", 0);
-	REAL (L"Dynamic range (dB)", L"30.0");
-	REAL (L"Dynamic compression (0-1)", L"0.0");
-	BOOLEAN (L"Garnish", 1);
+FORM (PowerCepstrogram_paint, U"PowerCepstrogram: Paint", U"PowerCepstrogram: Paint...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Quefrency range (s)", U"0.0")
+	REAL (U"right Quefrency range (s)", U"0.0")
+	REAL (U"Maximum (dB)", U"80.0")
+	BOOLEAN (U"Autoscaling", 0);
+	REAL (U"Dynamic range (dB)", U"30.0");
+	REAL (U"Dynamic compression (0-1)", U"0.0");
+	BOOLEAN (U"Garnish", 1);
 	OK
 DO_ALTERNATIVE (old_PowerCepstrogram_paint)
 	autoPraatPicture picture;
 	LOOP {
 		iam (PowerCepstrogram);
-		PowerCepstrogram_paint (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Quefrency range"), GET_REAL (L"right Quefrency range"),
-		GET_REAL (L"Maximum"), GET_INTEGER (L"Autoscaling"), GET_REAL (L"Dynamic range"),
-		GET_REAL (L"Dynamic compression"), GET_INTEGER (L"Garnish"));
+		PowerCepstrogram_paint (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Quefrency range"), GET_REAL (U"right Quefrency range"),
+		GET_REAL (U"Maximum"), GET_INTEGER (U"Autoscaling"), GET_REAL (U"Dynamic range"),
+		GET_REAL (U"Dynamic compression"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (PowerCepstrogram_smooth, L"PowerCepstrogram: Smooth", L"PowerCepstrogram: Smooth...")
-	REAL (L"Time averaging window (s)", L"0.02")
-	REAL (L"Quefrency averaging window (s)", L"0.0005")
+FORM (PowerCepstrogram_smooth, U"PowerCepstrogram: Smooth", U"PowerCepstrogram: Smooth...")
+	REAL (U"Time averaging window (s)", U"0.02")
+	REAL (U"Quefrency averaging window (s)", U"0.0005")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrogram);
-		autoPowerCepstrogram thee = PowerCepstrogram_smooth (me, GET_REAL (L"Time averaging window"), GET_REAL (L"Quefrency averaging window"));
-		praat_new (thee.transfer(), my name, L"_smoothed");
+		autoPowerCepstrogram thee = PowerCepstrogram_smooth (me, GET_REAL (U"Time averaging window"), GET_REAL (U"Quefrency averaging window"));
+		praat_new (thee.transfer(), my name, U"_smoothed");
 	}
 END
 
 DIRECT (PowerCepstrogram_getStartQuefrency)
 	LOOP {
 		iam (PowerCepstrogram);
-		Melder_informationReal (my ymin, L" (s)");
+		Melder_informationReal (my ymin, U" (s)");
 	}
 END
 
 DIRECT (PowerCepstrogram_getEndQuefrency)
 	LOOP {
 		iam (PowerCepstrogram);
-		Melder_informationReal (my ymax, L" (s)");
+		Melder_informationReal (my ymax, U" (s)");
 	}
 END
 
 DIRECT (PowerCepstrogram_getNumberOfQuefrencyBins)
 	LOOP {
 		iam (PowerCepstrogram);
-		Melder_informationReal (my ny, L" quefrency bins");
+		Melder_informationReal (my ny, U" quefrency bins");
 	}
 END
 
 DIRECT (PowerCepstrogram_getQuefrencyStep)
 	LOOP {
 		iam (PowerCepstrogram);
-		Melder_informationReal (my dy, L" quefrency step (s)");
+		Melder_informationReal (my dy, U" quefrency step (s)");
 	}
 END
 
-FORM (PowerCepstrogram_subtractTilt, L"PowerCepstrogram: Subtract tilt", 0)
-	REAL (L"left Tilt line quefrency range (s)", L"0.001")
-	REAL (L"right Tilt line quefrency range (s)", L"0.0 (=end)")
-	OPTIONMENU (L"Line type", 2)
-	OPTION (L"Straight")
-	OPTION (L"Exponential decay")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+FORM (PowerCepstrogram_subtractTilt, U"PowerCepstrogram: Subtract tilt", 0)
+	REAL (U"left Tilt line quefrency range (s)", U"0.001")
+	REAL (U"right Tilt line quefrency range (s)", U"0.0 (=end)")
+	OPTIONMENU (U"Line type", 2)
+	OPTION (U"Straight")
+	OPTION (U"Exponential decay")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrogram);
-		autoPowerCepstrogram thee = PowerCepstrogram_subtractTilt (me, GET_REAL (L"left Tilt line quefrency range"), 
-			GET_REAL (L"right Tilt line quefrency range"), GET_INTEGER (L"Line type"), GET_INTEGER (L"Fit method"));
-		praat_new (thee.transfer(), my name, L"_minusTilt");
+		autoPowerCepstrogram thee = PowerCepstrogram_subtractTilt (me, GET_REAL (U"left Tilt line quefrency range"), 
+			GET_REAL (U"right Tilt line quefrency range"), GET_INTEGER (U"Line type"), GET_INTEGER (U"Fit method"));
+		praat_new (thee.transfer(), my name, U"_minusTilt");
 	}
 END
 
-FORM (PowerCepstrogram_subtractTilt_inline, L"PowerCepstrogram: Subtract tilt (in-line)", 0)
-	REAL (L"left Tilt line quefrency range (s)", L"0.001")
-	REAL (L"right Tilt line quefrency range (s)", L"0.0 (=end)")
-	OPTIONMENU (L"Line type", 2)
-	OPTION (L"Straight")
-	OPTION (L"Exponential decay")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+FORM (PowerCepstrogram_subtractTilt_inline, U"PowerCepstrogram: Subtract tilt (in-line)", 0)
+	REAL (U"left Tilt line quefrency range (s)", U"0.001")
+	REAL (U"right Tilt line quefrency range (s)", U"0.0 (=end)")
+	OPTIONMENU (U"Line type", 2)
+	OPTION (U"Straight")
+	OPTION (U"Exponential decay")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrogram);
-		PowerCepstrogram_subtractTilt_inline (me, GET_REAL (L"left Tilt line quefrency range"), 
-			GET_REAL (L"right Tilt line quefrency range"), GET_INTEGER (L"Line type"), GET_INTEGER (L"Fit method"));
+		PowerCepstrogram_subtractTilt_inline (me, GET_REAL (U"left Tilt line quefrency range"), 
+			GET_REAL (U"right Tilt line quefrency range"), GET_INTEGER (U"Line type"), GET_INTEGER (U"Fit method"));
 	}
 END
 
-FORM (PowerCepstrogram_getCPPS_hillenbrand, L"PowerCepstrogram: Get CPPS", 0)
-	LABEL (L"", L"Smoothing:")
-	BOOLEAN (L"Subtract tilt before smoothing", 1)
-	REAL (L"Time averaging window (s)", L"0.001")
-	REAL (L"Quefrency averaging window (s)", L"0.00005")
-	LABEL (L"", L"Peak search:")
-	REAL (L"left Peak search pitch range (Hz)", L"60.0")
-	REAL (L"right Peak search pitch range (Hz)", L"330.0")
+FORM (PowerCepstrogram_getCPPS_hillenbrand, U"PowerCepstrogram: Get CPPS", 0)
+	LABEL (U"", U"Smoothing:")
+	BOOLEAN (U"Subtract tilt before smoothing", 1)
+	REAL (U"Time averaging window (s)", U"0.001")
+	REAL (U"Quefrency averaging window (s)", U"0.00005")
+	LABEL (U"", U"Peak search:")
+	REAL (U"left Peak search pitch range (Hz)", U"60.0")
+	REAL (U"right Peak search pitch range (Hz)", U"330.0")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrogram);
-		double cpps = PowerCepstrogram_getCPPS_hillenbrand (me, GET_INTEGER (L"Subtract tilt before smoothing"), GET_REAL (L"Time averaging window"), GET_REAL (L"Quefrency averaging window"),
-			GET_REAL (L"left Peak search pitch range"), GET_REAL (L"right Peak search pitch range"));
-		Melder_informationReal (cpps, L" dB");
-	}
-END
-
-
-FORM (PowerCepstrogram_getCPPS, L"PowerCepstrogram: Get CPPS", 0)
-	LABEL (L"", L"Smoothing:")
-	BOOLEAN (L"Subtract tilt before smoothing", 1)
-	REAL (L"Time averaging window (s)", L"0.001")
-	REAL (L"Quefrency averaging window (s)", L"0.00005")
-	LABEL (L"", L"Peak search:")
-	REAL (L"left Peak search pitch range (Hz)", L"60.0")
-	REAL (L"right Peak search pitch range (Hz)", L"330.0")
-	POSITIVE (L"Tolerance (0-1)", L"0.05")
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
-	LABEL (L"", L"Tilt line:")
-	REAL (L"left Tilt line quefrency range (s)", L"0.001")
-	REAL (L"right Tilt line quefrency range (s)", L"0.0 (=end)")
-	OPTIONMENU (L"Line type", 2)
-	OPTION (L"Straight")
-	OPTION (L"Exponential decay")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+		double cpps = PowerCepstrogram_getCPPS_hillenbrand (me, GET_INTEGER (U"Subtract tilt before smoothing"), GET_REAL (U"Time averaging window"), GET_REAL (U"Quefrency averaging window"),
+			GET_REAL (U"left Peak search pitch range"), GET_REAL (U"right Peak search pitch range"));
+		Melder_informationReal (cpps, U" dB");
+	}
+END
+
+
+FORM (PowerCepstrogram_getCPPS, U"PowerCepstrogram: Get CPPS", 0)
+	LABEL (U"", U"Smoothing:")
+	BOOLEAN (U"Subtract tilt before smoothing", 1)
+	REAL (U"Time averaging window (s)", U"0.001")
+	REAL (U"Quefrency averaging window (s)", U"0.00005")
+	LABEL (U"", U"Peak search:")
+	REAL (U"left Peak search pitch range (Hz)", U"60.0")
+	REAL (U"right Peak search pitch range (Hz)", U"330.0")
+	POSITIVE (U"Tolerance (0-1)", U"0.05")
+	RADIO (U"Interpolation", 2)
+	RADIOBUTTON (U"None")
+	RADIOBUTTON (U"Parabolic")
+	RADIOBUTTON (U"Cubic")
+	RADIOBUTTON (U"Sinc70")
+	LABEL (U"", U"Tilt line:")
+	REAL (U"left Tilt line quefrency range (s)", U"0.001")
+	REAL (U"right Tilt line quefrency range (s)", U"0.0 (=end)")
+	OPTIONMENU (U"Line type", 2)
+	OPTION (U"Straight")
+	OPTION (U"Exponential decay")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrogram);
-		double cpps = PowerCepstrogram_getCPPS (me, GET_INTEGER (L"Subtract tilt before smoothing"), GET_REAL (L"Time averaging window"), 
-			GET_REAL (L"Quefrency averaging window"),
-			GET_REAL (L"left Peak search pitch range"), GET_REAL (L"right Peak search pitch range"), GET_REAL (L"Tolerance"),
-			GET_INTEGER (L"Interpolation") - 1, GET_REAL (L"left Tilt line quefrency range"), GET_REAL (L"right Tilt line quefrency range"),
-			GET_INTEGER (L"Line type"), GET_INTEGER (L"Fit method"));
-		Melder_informationReal (cpps, L" dB");
-	}
-END
-
-FORM (PowerCepstrogram_formula, L"PowerCepstrogram: Formula", L"")
-	LABEL (L"label", L"Do for all times and quefrencies:")
-	LABEL (L"label", L"   `x' is the time in seconds")
-	LABEL (L"label", L"   `y' is the quefrency in seconds")
-	LABEL (L"label", L"   `self' is the current value")
-	LABEL (L"label", L"   Replace all values with:")
-	TEXTFIELD (L"formula", L"sqrt(self)")
+		double cpps = PowerCepstrogram_getCPPS (me, GET_INTEGER (U"Subtract tilt before smoothing"), GET_REAL (U"Time averaging window"), 
+			GET_REAL (U"Quefrency averaging window"),
+			GET_REAL (U"left Peak search pitch range"), GET_REAL (U"right Peak search pitch range"), GET_REAL (U"Tolerance"),
+			GET_INTEGER (U"Interpolation") - 1, GET_REAL (U"left Tilt line quefrency range"), GET_REAL (U"right Tilt line quefrency range"),
+			GET_INTEGER (U"Line type"), GET_INTEGER (U"Fit method"));
+		Melder_informationReal (cpps, U" dB");
+	}
+END
+
+FORM (PowerCepstrogram_formula, U"PowerCepstrogram: Formula", U"")
+	LABEL (U"label", U"Do for all times and quefrencies:")
+	LABEL (U"label", U"   `x' is the time in seconds")
+	LABEL (U"label", U"   `y' is the quefrency in seconds")
+	LABEL (U"label", U"   `self' is the current value")
+	LABEL (U"label", U"   Replace all values with:")
+	TEXTFIELD (U"formula", U"sqrt(self)")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrogram);
 		try {
-			Matrix_formula ((Matrix) me, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula ((Matrix) me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the PowerCepstrogram may have partially changed
@@ -558,58 +560,58 @@ DO
 	}
 END
 
-FORM (PowerCepstrogram_to_PowerCepstrum_slice, L"PowerCepstrogram: To PowerCepstrum (slice)", 0)
-	REAL (L"Time (s)", L"0.1")
+FORM (PowerCepstrogram_to_PowerCepstrum_slice, U"PowerCepstrogram: To PowerCepstrum (slice)", 0)
+	REAL (U"Time (s)", U"0.1")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrogram);
-		double time = GET_REAL (L"Time");
+		double time = GET_REAL (U"Time");
 		autoPowerCepstrum thee = PowerCepstrogram_to_PowerCepstrum_slice (me, time);
 		praat_new (thee.transfer(), my name, NUMstring_timeNoDot (time));
 	}
 END
 
-FORM (PowerCepstrogram_to_Table_cpp, L"PowerCepstrogram: To Table (peak prominence)", L"PowerCepstrogram: To Table (peak prominence)...")
-	REAL (L"left Peak search pitch range (Hz)", L"60.0")
-	REAL (L"right Peak search pitch range (Hz)", L"330.0")
-	POSITIVE (L"Tolerance (0-1)", L"0.05")
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
-	REAL (L"left Tilt line quefrency range (s)", L"0.001")
-	REAL (L"right Tilt line quefrency range (s)", L"0.0 (=end)")
-	OPTIONMENU (L"Line type", 2)
-	OPTION (L"Straight")
-	OPTION (L"Exponential decay")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+FORM (PowerCepstrogram_to_Table_cpp, U"PowerCepstrogram: To Table (peak prominence)", U"PowerCepstrogram: To Table (peak prominence)...")
+	REAL (U"left Peak search pitch range (Hz)", U"60.0")
+	REAL (U"right Peak search pitch range (Hz)", U"330.0")
+	POSITIVE (U"Tolerance (0-1)", U"0.05")
+	RADIO (U"Interpolation", 2)
+	RADIOBUTTON (U"None")
+	RADIOBUTTON (U"Parabolic")
+	RADIOBUTTON (U"Cubic")
+	RADIOBUTTON (U"Sinc70")
+	REAL (U"left Tilt line quefrency range (s)", U"0.001")
+	REAL (U"right Tilt line quefrency range (s)", U"0.0 (=end)")
+	OPTIONMENU (U"Line type", 2)
+	OPTION (U"Straight")
+	OPTION (U"Exponential decay")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrogram);
 		autoTable thee = PowerCepstrogram_to_Table_cpp (me,
-			GET_REAL (L"left Peak search pitch range"), GET_REAL (L"right Peak search pitch range"), GET_REAL (L"Tolerance"),
-			GET_INTEGER (L"Interpolation") - 1,
-			GET_REAL (L"left Tilt line quefrency range"), GET_REAL (L"right Tilt line quefrency range"),
-			GET_INTEGER (L"Line type"), GET_INTEGER (L"Fit method"));
-		praat_new (thee.transfer(), my name, L"_cpp");
+			GET_REAL (U"left Peak search pitch range"), GET_REAL (U"right Peak search pitch range"), GET_REAL (U"Tolerance"),
+			GET_INTEGER (U"Interpolation") - 1,
+			GET_REAL (U"left Tilt line quefrency range"), GET_REAL (U"right Tilt line quefrency range"),
+			GET_INTEGER (U"Line type"), GET_INTEGER (U"Fit method"));
+		praat_new (thee.transfer(), my name, U"_cpp");
 	}
 END
 
-FORM (PowerCepstrogram_to_Table_hillenbrand, L"PowerCepstrogram: To Table (hillenbrand)", L"PowerCepstrogram: To Table (peak prominence...")
-	REAL (L"left Peak search pitch range (Hz)", L"60.0")
-	REAL (L"right Peak search pitch range (Hz)", L"330.0")
+FORM (PowerCepstrogram_to_Table_hillenbrand, U"PowerCepstrogram: To Table (hillenbrand)", U"PowerCepstrogram: To Table (peak prominence...")
+	REAL (U"left Peak search pitch range (Hz)", U"60.0")
+	REAL (U"right Peak search pitch range (Hz)", U"330.0")
 	OK
 DO
 	LOOP {
 		iam (PowerCepstrogram);
 		autoTable thee = PowerCepstrogram_to_Table_hillenbrand (me,
-			GET_REAL (L"left Peak search pitch range"), GET_REAL (L"right Peak search pitch range"));
-		praat_new (thee.transfer(), my name, L"_cpp");
+			GET_REAL (U"left Peak search pitch range"), GET_REAL (U"right Peak search pitch range"));
+		praat_new (thee.transfer(), my name, U"_cpp");
 	}
 END
 
@@ -626,353 +628,368 @@ END
 DIRECT (Cepstrumc_to_LPC)
 	LOOP {
 		iam (Cepstrumc);
-		praat_new (Cepstrumc_to_LPC (me), my name);
-	}
-END
-
-FORM (Cepstrumc_to_DTW, L"Cepstrumc: To DTW", L"Cepstrumc: To DTW...")
-	LABEL (L"", L"Distance calculation between Cepstra")
-	REAL (L"Cepstral weight", L"1.0")
-	REAL (L"Log energy weight", L"0.0")
-	REAL (L"Regression weight", L"0.0")
-	REAL (L"Regression weight log energy", L"0.0")
-	REAL (L"Window for regression coefficients (seconds)", L"0.056")
-	LABEL (L"", L"Boundary conditions for time warp")
-	BOOLEAN (L"Match begin positions", 0)
-	BOOLEAN (L"Match end positions", 0)
-	RADIO (L"Slope constraints", 1)
-	RADIOBUTTON (L"no restriction")
-	RADIOBUTTON (L"1/3 < slope < 3")
-	RADIOBUTTON (L"1/2 < slope < 2")
-	RADIOBUTTON (L"2/3 < slope < 3/2")
+		autoLPC thee = Cepstrumc_to_LPC (me);
+		praat_new (thee.transfer(), my name);
+	}
+END
+
+FORM (Cepstrumc_to_DTW, U"Cepstrumc: To DTW", U"Cepstrumc: To DTW...")
+	LABEL (U"", U"Distance calculation between Cepstra")
+	REAL (U"Cepstral weight", U"1.0")
+	REAL (U"Log energy weight", U"0.0")
+	REAL (U"Regression weight", U"0.0")
+	REAL (U"Regression weight log energy", U"0.0")
+	REAL (U"Window for regression coefficients (seconds)", U"0.056")
+	LABEL (U"", U"Boundary conditions for time warp")
+	BOOLEAN (U"Match begin positions", 0)
+	BOOLEAN (U"Match end positions", 0)
+	RADIO (U"Slope constraints", 1)
+	RADIOBUTTON (U"no restriction")
+	RADIOBUTTON (U"1/3 < slope < 3")
+	RADIOBUTTON (U"1/2 < slope < 2")
+	RADIOBUTTON (U"2/3 < slope < 3/2")
 	OK
 DO
-	Cepstrumc c1 = 0, c2 = 0;
+	Cepstrumc c1 = nullptr, c2 = nullptr;
 	LOOP {
 		iam (Cepstrumc);
 		(c1 ? c2 : c1) = me;
 	}
 	Melder_assert (c1 && c2);
-	praat_new (Cepstrumc_to_DTW (c1, c2, GET_REAL (L"Cepstral weight"),
-		GET_REAL (L"Log energy weight"), GET_REAL (L"Regression weight"),
-		GET_REAL (L"Regression weight log energy"), GET_REAL (L"Window for regression coefficients"),
-		GET_INTEGER (L"Match begin positions"), GET_INTEGER (L"Match end positions"),
-		GET_INTEGER (L"Slope constraints")), c1->name, L"_", c2->name);
+	autoDTW thee = Cepstrumc_to_DTW (c1, c2, GET_REAL (U"Cepstral weight"),
+		GET_REAL (U"Log energy weight"), GET_REAL (U"Regression weight"),
+		GET_REAL (U"Regression weight log energy"), GET_REAL (U"Window for regression coefficients"),
+		GET_INTEGER (U"Match begin positions"), GET_INTEGER (U"Match end positions"),
+		GET_INTEGER (U"Slope constraints"));
+	praat_new (thee.transfer(), c1 -> name, U"_", c2 -> name);
 END
 
 DIRECT (Cepstrumc_to_Matrix)
 	LOOP {
 		iam (Cepstrumc);
-		praat_new (Cepstrumc_to_Matrix (me), my name);
+		autoMatrix thee = Cepstrumc_to_Matrix (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 /******************** Formant ********************************************/
 
-FORM (Formant_to_LPC, L"Formant: To LPC", 0)
-	POSITIVE (L"Sampling frequency (Hz)", L"16000.0")
+FORM (Formant_to_LPC, U"Formant: To LPC", 0)
+	POSITIVE (U"Sampling frequency (Hz)", U"16000.0")
 	OK
 DO
 	LOOP {
 		iam (Formant);
-		praat_new (Formant_to_LPC (me, 1.0 / GET_REAL (L"Sampling frequency")), my name);
+		autoLPC thee = Formant_to_LPC (me, 1.0 / GET_REAL (U"Sampling frequency"));
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (Formant_formula, L"Formant: Formula", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	NATURAL (L"left Formant range", L"1")
-	NATURAL (L"right Formant range", L"5")
-	LABEL (L"", L"Formant frequencies in odd numbered rows")
-	LABEL (L"", L"Formant bandwidths in even numbered rows")
-	SENTENCE (L"Formula", L"if row mod 2 = 1 and self[row,col]/self[row+1,col] < 5 then 0 else self fi")
+FORM (Formant_formula, U"Formant: Formula", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	NATURAL (U"left Formant range", U"1")
+	NATURAL (U"right Formant range", U"5")
+	LABEL (U"", U"Formant frequencies in odd numbered rows")
+	LABEL (U"", U"Formant bandwidths in even numbered rows")
+	SENTENCE (U"Formula", U"if row mod 2 = 1 and self[row,col]/self[row+1,col] < 5 then 0 else self fi")
 	OK
 DO
-	wchar_t *expression = GET_STRING (L"Formula");
+	char32 *expression = GET_STRING (U"Formula");
 	LOOP {
 		iam (Formant);
-		Formant_formula (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_INTEGER (L"left Formant range"), GET_INTEGER (L"right Formant range"), interpreter, expression);
+		Formant_formula (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_INTEGER (U"left Formant range"), GET_INTEGER (U"right Formant range"), interpreter, expression);
 	}
 END
 
 /******************** Formant & Spectrogram ************************************/
 
-FORM (Formant_and_Spectrogram_to_IntensityTier, L"Formant & Spectrogram: To IntensityTier", L"Formant & Spectrogram: To IntensityTier...")
-	NATURAL (L"Formant number", L"1")
+FORM (Formant_and_Spectrogram_to_IntensityTier, U"Formant & Spectrogram: To IntensityTier", U"Formant & Spectrogram: To IntensityTier...")
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
 	Formant me = FIRST (Formant);
-	long iformant = GET_INTEGER (L"Formant number");
+	long iformant = GET_INTEGER (U"Formant number");
 	Spectrogram thee = FIRST (Spectrogram);
 	autoIntensityTier him = Formant_and_Spectrogram_to_IntensityTier (me, thee, iformant);
-	praat_new (him.transfer(), my name, L"_", Melder_integer (GET_INTEGER (L"Formant number")));
+	praat_new (him.transfer(), my name, U"_", GET_INTEGER (U"Formant number"));
 END
 
 /********************LFCC ********************************************/
 
 DIRECT (LFCC_help)
-	Melder_help (L"LFCC");
+	Melder_help (U"LFCC");
 END
 
-FORM (LFCC_to_LPC, L"LFCC: To LPC", L"LFCC: To LPC...")
-	INTEGER (L"Number of coefficients", L"0")
+FORM (LFCC_to_LPC, U"LFCC: To LPC", U"LFCC: To LPC...")
+	INTEGER (U"Number of coefficients", U"0")
 	OK
 DO
-	long ncof = GET_INTEGER (L"Number of coefficients");
+	long ncof = GET_INTEGER (U"Number of coefficients");
 	if (ncof < 0) {
-		Melder_throw ("Number of coefficients must be greater or equal zero.");
+		Melder_throw (U"Number of coefficients must be greater or equal zero.");
 	}
 	LOOP {
 		iam (LFCC);
-		praat_new (LFCC_to_LPC (me, ncof), my name);
+		autoLPC thee = LFCC_to_LPC (me, ncof);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 /********************LPC ********************************************/
 
-DIRECT (LPC_help) Melder_help (L"LPC"); END
+DIRECT (LPC_help) Melder_help (U"LPC"); END
 
-FORM (LPC_drawGain, L"LPC: Draw gain", L"LPC: Draw gain...")
-	REAL (L"From time (seconds)", L"0.0")
-	REAL (L"To time (seconds)", L"0.0 (=all)")
-	REAL (L"Minimum gain", L"0.0")
-	REAL (L"Maximum gain", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (LPC_drawGain, U"LPC: Draw gain", U"LPC: Draw gain...")
+	REAL (U"From time (seconds)", U"0.0")
+	REAL (U"To time (seconds)", U"0.0 (=all)")
+	REAL (U"Minimum gain", U"0.0")
+	REAL (U"Maximum gain", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (LPC);
-		LPC_drawGain (me, GRAPHICS, GET_REAL (L"From time"), GET_REAL (L"To time"),
-			GET_REAL (L"Minimum gain"), GET_REAL (L"Maximum gain"), GET_INTEGER (L"Garnish"));
+		LPC_drawGain (me, GRAPHICS, GET_REAL (U"From time"), GET_REAL (U"To time"),
+			GET_REAL (U"Minimum gain"), GET_REAL (U"Maximum gain"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (LPC_getSamplingInterval)
 	LOOP {
 		iam (LPC);
-		Melder_information (Melder_double (my samplingPeriod), L" seconds");
+		Melder_information (my samplingPeriod, U" seconds");
 	}
 END
 
-FORM (LPC_getNumberOfCoefficients, L"LPC: Get number of coefficients", L"LPC: Get number of coefficients...")
-	NATURAL (L"Frame number", L"1")
+FORM (LPC_getNumberOfCoefficients, U"LPC: Get number of coefficients", U"LPC: Get number of coefficients...")
+	NATURAL (U"Frame number", U"1")
 	OK
 DO
-	long iframe = GET_INTEGER (L"Frame number");
+	long iframe = GET_INTEGER (U"Frame number");
 	LOOP {
 		iam (LPC);
 		if (iframe > my nx) {
-			Melder_throw ("Frame number is too large.\n\nPlease choose a number between 1 and ", my nx);
+			Melder_throw (U"Frame number is too large.\n\nPlease choose a number between 1 and ", my nx);
 		}
-		Melder_information (Melder_integer ( (my d_frames[iframe]).nCoefficients), L" coefficients");
+		Melder_information (my d_frames[iframe].nCoefficients, U" coefficients");
 	}
 END
 
-FORM (LPC_drawPoles, L"LPC: Draw poles", L"LPC: Draw poles...")
-	REAL (L"Time (seconds)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (LPC_drawPoles, U"LPC: Draw poles", U"LPC: Draw poles...")
+	REAL (U"Time (seconds)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (LPC);
-		LPC_drawPoles (me, GRAPHICS, GET_REAL (L"Time"), GET_INTEGER (L"Garnish"));
+		LPC_drawPoles (me, GRAPHICS, GET_REAL (U"Time"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (LPC_to_Formant)
 	LOOP {
 		iam (LPC);
-		praat_new (LPC_to_Formant (me, 50), my name);
+		autoFormant thee = LPC_to_Formant (me, 50);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 DIRECT (LPC_to_Formant_keep_all)
 	LOOP {
 		iam (LPC);
-		praat_new (LPC_to_Formant (me, 0), my name);
+		autoFormant thee = LPC_to_Formant (me, 0);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (LPC_to_LFCC, L"LPC: To LFCC", L"LPC: To LFCC...")
-	INTEGER (L"Number of coefficients", L"0")
+FORM (LPC_to_LFCC, U"LPC: To LFCC", U"LPC: To LFCC...")
+	NATURAL (U"Number of coefficients", U"0")
 	OK
 DO
-	long ncof = GET_INTEGER (L"Number of coefficients");
+	long ncof = GET_INTEGER (U"Number of coefficients");
 	if (ncof < 0) {
-		Melder_throw ("Number of coefficients must be greater or equal zero.");
+		Melder_throw (U"Number of coefficients must be greater or equal zero.");
 	}
 	LOOP {
 		iam (LPC);
-		praat_new (LPC_to_LFCC (me, ncof), my name);
+		autoLFCC thee = LPC_to_LFCC (me, ncof);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (LPC_to_Polynomial, L"LPC: To Polynomial", L"LPC: To Polynomial (slice)...")
-	REAL (L"Time (seconds)", L"0.0")
+FORM (LPC_to_Polynomial, U"LPC: To Polynomial", U"LPC: To Polynomial (slice)...")
+	REAL (U"Time (seconds)", U"0.0")
 	OK
-	DO
+DO
+	double time = GET_REAL (U"Time");
 	LOOP {
 		iam (LPC);
-		double time = GET_REAL (L"Time");
-		praat_new (LPC_to_Polynomial (me, time), my name, NUMstring_timeNoDot (time));
+		autoPolynomial thee = LPC_to_Polynomial (me, time);
+		praat_new (thee.transfer(), my name, NUMstring_timeNoDot (time));
 	}
 END
 
-FORM (LPC_to_Spectrum, L"LPC: To Spectrum", L"LPC: To Spectrum (slice)...")
-	REAL (L"Time (seconds)", L"0.0")
-	REAL (L"Minimum frequency resolution (Hz)", L"20.0")
-	REAL (L"Bandwidth reduction (Hz)", L"0.0")
-	REAL (L"De-emphasis frequency (Hz)", L"50.0")
+FORM (LPC_to_Spectrum, U"LPC: To Spectrum", U"LPC: To Spectrum (slice)...")
+	REAL (U"Time (seconds)", U"0.0")
+	REAL (U"Minimum frequency resolution (Hz)", U"20.0")
+	REAL (U"Bandwidth reduction (Hz)", U"0.0")
+	REAL (U"De-emphasis frequency (Hz)", U"50.0")
 	OK
 DO
 	LOOP {
 		iam (LPC);
-		double time = GET_REAL (L"Time");
-		praat_new (LPC_to_Spectrum (me, time, GET_REAL (L"Minimum frequency resolution"),
-		GET_REAL (L"Bandwidth reduction"), GET_REAL (L"De-emphasis frequency")), my name, NUMstring_timeNoDot (time));
+		double time = GET_REAL (U"Time");
+		autoSpectrum thee = LPC_to_Spectrum (me, time, GET_REAL (U"Minimum frequency resolution"),
+		GET_REAL (U"Bandwidth reduction"), GET_REAL (U"De-emphasis frequency"));
+		praat_new (thee.transfer(), my name, NUMstring_timeNoDot (time));
 	}
 END
 
-FORM (LPC_to_Spectrogram, L"LPC: To Spectrogram", L"LPC: To Spectrogram...")
-	REAL (L"Minimum frequency resolution (Hz)", L"20.0")
-	REAL (L"Bandwidth reduction (Hz)", L"0.0")
-	REAL (L"De-emphasis frequency (Hz)", L"50.0")
+FORM (LPC_to_Spectrogram, U"LPC: To Spectrogram", U"LPC: To Spectrogram...")
+	REAL (U"Minimum frequency resolution (Hz)", U"20.0")
+	REAL (U"Bandwidth reduction (Hz)", U"0.0")
+	REAL (U"De-emphasis frequency (Hz)", U"50.0")
 	OK
 DO
 	LOOP {
 		iam (LPC);
-		praat_new (LPC_to_Spectrogram (me, GET_REAL (L"Minimum frequency resolution"),
-			GET_REAL (L"Bandwidth reduction"), GET_REAL (L"De-emphasis frequency")), my name);
+		autoSpectrogram thee = LPC_to_Spectrogram (me, GET_REAL (U"Minimum frequency resolution"), GET_REAL (U"Bandwidth reduction"), GET_REAL (U"De-emphasis frequency"));
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (LPC_to_VocalTract_special, L"LPC: To VocalTract", L"LPC: To VocalTract (slice, special)...")
-	REAL (L"Time (s)", L"0.0")
-	REAL (L"Glottal damping", L"0.1")
-	BOOLEAN (L"Radiation damping", 1)
-	BOOLEAN (L"Internal damping", 1)
+FORM (LPC_to_VocalTract_special, U"LPC: To VocalTract", U"LPC: To VocalTract (slice, special)...")
+	REAL (U"Time (s)", U"0.0")
+	REAL (U"Glottal damping", U"0.1")
+	BOOLEAN (U"Radiation damping", 1)
+	BOOLEAN (U"Internal damping", 1)
 	OK
 DO
-	double glottalDamping = GET_REAL (L"Glottal damping");
-	bool radiationDamping = GET_INTEGER (L"Radiation damping");
-	bool internalDamping = GET_INTEGER (L"Internal damping");
+	double glottalDamping = GET_REAL (U"Glottal damping");
+	bool radiationDamping = GET_INTEGER (U"Radiation damping");
+	bool internalDamping = GET_INTEGER (U"Internal damping");
 	LOOP {
 		iam (LPC);
-		double time = GET_REAL (L"Time");
-		praat_new (LPC_to_VocalTract (me, time, glottalDamping, radiationDamping, internalDamping), my name, NUMstring_timeNoDot (time));
+		double time = GET_REAL (U"Time");
+		autoVocalTract thee = LPC_to_VocalTract (me, time, glottalDamping, radiationDamping, internalDamping);
+		praat_new (thee.transfer(), my name, NUMstring_timeNoDot (time));
 	}
 END
 
-FORM (LPC_to_VocalTract, L"LPC: To VocalTract", L"LPC: To VocalTract (slice)...")
-	REAL (L"Time (s)", L"0.0")
-	POSITIVE (L"Length (m)", L"0.17")
+FORM (LPC_to_VocalTract, U"LPC: To VocalTract", U"LPC: To VocalTract (slice)...")
+	REAL (U"Time (s)", U"0.0")
+	POSITIVE (U"Length (m)", U"0.17")
 	OK
 DO
+	double time = GET_REAL (U"Time");
 	LOOP {
 		iam (LPC);
-		double time = GET_REAL (L"Time");
-		praat_new (LPC_to_VocalTract (me, time, GET_REAL (L"Length")), my name, NUMstring_timeNoDot (time));
+		autoVocalTract thee = LPC_to_VocalTract (me, time, GET_REAL (U"Length"));
+		praat_new (thee.transfer(), my name, NUMstring_timeNoDot (time));
 	}
 END
 
 DIRECT (LPC_downto_Matrix_lpc)
 	LOOP {
 		iam (LPC);
-		praat_new (LPC_downto_Matrix_lpc (me), my name, L"_lpc");
+		autoMatrix thee = LPC_downto_Matrix_lpc (me);
+		praat_new (thee.transfer(), my name, U"_lpc");
 	}
 END
 
 DIRECT (LPC_downto_Matrix_rc)
 	LOOP {
 		iam (LPC);
-		praat_new (LPC_downto_Matrix_rc (me), my name, L"_rc");
+		autoMatrix thee = LPC_downto_Matrix_rc (me);
+		praat_new (thee.transfer(), my name, U"_rc");
 	}
 END
 
 DIRECT (LPC_downto_Matrix_area)
 	LOOP {
 		iam (LPC);
-		praat_new (LPC_downto_Matrix_area (me), my name, L"_area");
+		autoMatrix thee = LPC_downto_Matrix_area (me);
+		praat_new (thee.transfer(), my name, U"_area");
 	}
 END
 
 /********************** Sound *******************************************/
 
-FORM (Sound_to_PowerCepstrogram, L"Sound: To PowerCepstrogram", L"Sound: To PowerCepstrogram...")
-	POSITIVE (L"Pitch floor (Hz)", L"60.0")
-	POSITIVE (L"Time step (s)", L"0.002")
-	POSITIVE (L"Maximum frequency (Hz)", L"5000.0")
-	POSITIVE (L"Pre-emphasis from (Hz)", L"50")
+FORM (Sound_to_PowerCepstrogram, U"Sound: To PowerCepstrogram", U"Sound: To PowerCepstrogram...")
+	POSITIVE (U"Pitch floor (Hz)", U"60.0")
+	POSITIVE (U"Time step (s)", U"0.002")
+	POSITIVE (U"Maximum frequency (Hz)", U"5000.0")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		autoPowerCepstrogram thee = Sound_to_PowerCepstrogram (me, GET_REAL (L"Pitch floor"), GET_REAL (L"Time step"), GET_REAL(L"Maximum frequency"),
-			 GET_REAL (L"Pre-emphasis from"));
+		autoPowerCepstrogram thee = Sound_to_PowerCepstrogram (me, GET_REAL (U"Pitch floor"), GET_REAL (U"Time step"), GET_REAL(U"Maximum frequency"),
+			 GET_REAL (U"Pre-emphasis from"));
 		praat_new (thee.transfer(), my name);
 	}
 END
 
 
-FORM (Sound_to_PowerCepstrogram_hillenbrand, L"Sound: To PowerCepstrogram (hillenbrand)", L"Sound: To PowerCepstrogram...")
-	POSITIVE (L"Pitch floor (Hz)", L"60.0")
-	POSITIVE (L"Time step (s)", L"0.002")
+FORM (Sound_to_PowerCepstrogram_hillenbrand, U"Sound: To PowerCepstrogram (hillenbrand)", U"Sound: To PowerCepstrogram...")
+	POSITIVE (U"Pitch floor (Hz)", U"60.0")
+	POSITIVE (U"Time step (s)", U"0.002")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		autoPowerCepstrogram thee = Sound_to_PowerCepstrogram_hillenbrand (me, GET_REAL (L"Pitch floor"), GET_REAL (L"Time step"));
+		autoPowerCepstrogram thee = Sound_to_PowerCepstrogram_hillenbrand (me, GET_REAL (U"Pitch floor"), GET_REAL (U"Time step"));
 		praat_new (thee.transfer(), my name);
 	}
 END
 	
-FORM (Sound_to_Formant_robust, L"Sound: To Formant (robust)", L"Sound: To Formant (robust)...")
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	POSITIVE (L"Max. number of formants", L"5.0")
-	REAL (L"Maximum formant (Hz)", L"5500 (= adult female)")
-	POSITIVE (L"Window length (s)", L"0.025")
-	POSITIVE (L"Pre-emphasis from (Hz)", L"50")
-	POSITIVE (L"Number of std. dev.", L"1.5")
-	NATURAL (L"Maximum number of iterations", L"5")
-	REAL (L"Tolerance", L"0.000001")
+FORM (Sound_to_Formant_robust, U"Sound: To Formant (robust)", U"Sound: To Formant (robust)...")
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	POSITIVE (U"Max. number of formants", U"5.0")
+	REAL (U"Maximum formant (Hz)", U"5500 (= adult female)")
+	POSITIVE (U"Window length (s)", U"0.025")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50")
+	POSITIVE (U"Number of std. dev.", U"1.5")
+	NATURAL (U"Maximum number of iterations", U"5")
+	REAL (U"Tolerance", U"0.000001")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_Formant_robust (me, GET_REAL (L"Time step"), GET_REAL (L"Max. number of formants"),
-			GET_REAL (L"Maximum formant"), GET_REAL (L"Window length"), GET_REAL (L"Pre-emphasis from"), 50.0,
-			GET_REAL (L"Number of std. dev."), GET_INTEGER (L"Maximum number of iterations"),
-			GET_REAL (L"Tolerance"), 1), my name);
-	}
-END
-
-static void Sound_to_LPC_addCommonFields (void *dia) {
-	LABEL (L"", L"Warning 1:  for formant analysis, use \"To Formant\" instead.")
-	LABEL (L"", L"Warning 2:  if you do use \"To LPC\", you may want to resample first.")
-	LABEL (L"", L"Click Help for more details.")
-	LABEL (L"", L"")
-	NATURAL (L"Prediction order", L"16")
-	POSITIVE (L"Window length (s)", L"0.025")
-	POSITIVE (L"Time step (s)", L"0.005")
-	REAL (L"Pre-emphasis frequency (Hz)", L"50.0")
+		praat_new (Sound_to_Formant_robust (me, GET_REAL (U"Time step"), GET_REAL (U"Max. number of formants"),
+			GET_REAL (U"Maximum formant"), GET_REAL (U"Window length"), GET_REAL (U"Pre-emphasis from"), 50.0,
+			GET_REAL (U"Number of std. dev."), GET_INTEGER (U"Maximum number of iterations"),
+			GET_REAL (U"Tolerance"), 1), my name);
+	}
+END
+
+static void Sound_to_LPC_addCommonFields (UiForm dia) {
+	LABEL (U"", U"Warning 1:  for formant analysis, use \"To Formant\" instead.")
+	LABEL (U"", U"Warning 2:  if you do use \"To LPC\", you may want to resample first.")
+	LABEL (U"", U"Click Help for more details.")
+	LABEL (U"", U"")
+	NATURAL (U"Prediction order", U"16")
+	POSITIVE (U"Window length (s)", U"0.025")
+	POSITIVE (U"Time step (s)", U"0.005")
+	REAL (U"Pre-emphasis frequency (Hz)", U"50.0")
 }
 
-static void Sound_to_LPC_checkCommonFields (void *dia, long *predictionOrder, double *analysisWindowDuration,
+static void Sound_to_LPC_checkCommonFields (UiForm dia, long *predictionOrder, double *analysisWindowDuration,
         double *timeStep, double *preemphasisFrequency) {
-	*predictionOrder = GET_INTEGER (L"Prediction order");
-	*analysisWindowDuration = GET_REAL (L"Window length");
-	*timeStep = GET_REAL (L"Time step");
-	*preemphasisFrequency = GET_REAL (L"Pre-emphasis frequency");
+	*predictionOrder = GET_INTEGER (U"Prediction order");
+	*analysisWindowDuration = GET_REAL (U"Window length");
+	*timeStep = GET_REAL (U"Time step");
+	*preemphasisFrequency = GET_REAL (U"Pre-emphasis frequency");
 	if (*preemphasisFrequency < 0.0) {
-		Melder_throw ("Pre-emphasis frequencies cannot be negative.");
+		Melder_throw (U"Pre-emphasis frequencies cannot be negative.");
 	}
 }
 
-FORM (Sound_to_LPC_auto, L"Sound: To LPC (autocorrelation)", L"Sound: To LPC (autocorrelation)...")
+FORM (Sound_to_LPC_auto, U"Sound: To LPC (autocorrelation)", U"Sound: To LPC (autocorrelation)...")
 	Sound_to_LPC_addCommonFields (dia);
 	OK
 DO
@@ -981,11 +998,12 @@ DO
 	Sound_to_LPC_checkCommonFields (dia, & numberOfPoles, & analysisWindowDuration, & timeStep, &preemphasisFrequency);
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_LPC_auto (me, numberOfPoles, analysisWindowDuration, timeStep, preemphasisFrequency), my name);
+		autoLPC thee = Sound_to_LPC_auto (me, numberOfPoles, analysisWindowDuration, timeStep, preemphasisFrequency);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (Sound_to_LPC_covar, L"Sound: To LPC (covariance)", L"Sound: To LPC (covariance)...")
+FORM (Sound_to_LPC_covar, U"Sound: To LPC (covariance)", U"Sound: To LPC (covariance)...")
 	Sound_to_LPC_addCommonFields (dia);
 	OK
 DO
@@ -994,11 +1012,12 @@ DO
 	Sound_to_LPC_checkCommonFields (dia, & numberOfPoles, & analysisWindowDuration, & timeStep, & preemphasisFrequency);
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_LPC_covar (me, numberOfPoles, analysisWindowDuration, timeStep, preemphasisFrequency), my name);
+		autoLPC thee = Sound_to_LPC_covar (me, numberOfPoles, analysisWindowDuration, timeStep, preemphasisFrequency);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (Sound_to_LPC_burg, L"Sound: To LPC (burg)", L"Sound: To LPC (burg)...")
+FORM (Sound_to_LPC_burg, U"Sound: To LPC (burg)", U"Sound: To LPC (burg)...")
 	Sound_to_LPC_addCommonFields (dia);
 	OK
 DO
@@ -1007,14 +1026,15 @@ DO
 	Sound_to_LPC_checkCommonFields (dia, & numberOfPoles, & analysisWindowDuration, & timeStep, & preemphasisFrequency);
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_LPC_burg (me, numberOfPoles, analysisWindowDuration, timeStep, preemphasisFrequency), my name);
+		autoLPC thee = Sound_to_LPC_burg (me, numberOfPoles, analysisWindowDuration, timeStep, preemphasisFrequency);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (Sound_to_LPC_marple, L"Sound: To LPC (marple)", L"Sound: To LPC (marple)...")
+FORM (Sound_to_LPC_marple, U"Sound: To LPC (marple)", U"Sound: To LPC (marple)...")
 	Sound_to_LPC_addCommonFields (dia);
-	POSITIVE (L"Tolerance 1", L"1e-6")
-	POSITIVE (L"Tolerance 2", L"1e-6")
+	POSITIVE (U"Tolerance 1", U"1e-6")
+	POSITIVE (U"Tolerance 2", U"1e-6")
 	OK
 DO
 	long numberOfPoles;
@@ -1022,43 +1042,43 @@ DO
 	Sound_to_LPC_checkCommonFields (dia, & numberOfPoles, & analysisWindowDuration, &timeStep, & preemphasisFrequency);
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_LPC_marple (me, numberOfPoles, analysisWindowDuration, timeStep, preemphasisFrequency,
-		GET_REAL (L"Tolerance 1"), GET_REAL (L"Tolerance 2")), my name);
+		autoLPC thee = Sound_to_LPC_marple (me, numberOfPoles, analysisWindowDuration, timeStep, preemphasisFrequency, GET_REAL (U"Tolerance 1"), GET_REAL (U"Tolerance 2"));
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (Sound_to_MFCC, L"Sound: To MFCC", L"Sound: To MFCC...")
-	NATURAL (L"Number of coefficients", L"12")
-	POSITIVE (L"Window length (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.005")
-	LABEL (L"", L"Filter bank parameters")
-	POSITIVE (L"Position of first filter (mel)", L"100.0")
-	POSITIVE (L"Distance between filters (mel)", L"100.0")
-	REAL (L"Maximum frequency (mel)", L"0.0");
+FORM (Sound_to_MFCC, U"Sound: To MFCC", U"Sound: To MFCC...")
+	NATURAL (U"Number of coefficients", U"12")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.005")
+	LABEL (U"", U"Filter bank parameters")
+	POSITIVE (U"Position of first filter (mel)", U"100.0")
+	POSITIVE (U"Distance between filters (mel)", U"100.0")
+	REAL (U"Maximum frequency (mel)", U"0.0");
 	OK
 DO
-	long p = GET_INTEGER (L"Number of coefficients");
+	long p = GET_INTEGER (U"Number of coefficients");
 	if (p > 24) {
-		Melder_throw ("Number of coefficients must be < 25.");
+		Melder_throw (U"Number of coefficients must be < 25.");
 	}
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_MFCC (me, p, GET_REAL (L"Window length"),
-			GET_REAL (L"Time step"), GET_REAL (L"Position of first filter"),
-			GET_REAL (L"Maximum frequency"), GET_REAL (L"Distance between filters")), my name);
+		praat_new (Sound_to_MFCC (me, p, GET_REAL (U"Window length"),
+			GET_REAL (U"Time step"), GET_REAL (U"Position of first filter"),
+			GET_REAL (U"Maximum frequency"), GET_REAL (U"Distance between filters")), my name);
 	}
 END
 
-FORM (VocalTract_drawSegments, L"VocalTract: Draw segments", 0)
-	POSITIVE (L"Maximum length (cm)", L"20.0")
-	POSITIVE (L"Maximum area (cm^2)", L"90.0")
-	BOOLEAN (L"Closed at glottis", 1)
+FORM (VocalTract_drawSegments, U"VocalTract: Draw segments", 0)
+	POSITIVE (U"Maximum length (cm)", U"20.0")
+	POSITIVE (U"Maximum area (cm^2)", U"90.0")
+	BOOLEAN (U"Closed at glottis", 1)
 	OK
 DO
 	autoPraatPicture picture;
-	double maxLength = GET_REAL (L"Maximum length") / 100;
-	double maxArea = GET_REAL (L"Maximum area") / 10000;
-	bool closedAtGlottis = GET_INTEGER (L"Closed at glottis");
+	double maxLength = GET_REAL (U"Maximum length") / 100.0;
+	double maxArea = GET_REAL (U"Maximum area") / 10000.0;
+	bool closedAtGlottis = GET_INTEGER (U"Closed at glottis");
 	LOOP {
 		iam (VocalTract);
 		VocalTract_drawSegments (me, GRAPHICS, maxLength, maxArea, closedAtGlottis);
@@ -1068,32 +1088,32 @@ END
 DIRECT (VocalTract_getLength)
 	LOOP {
 		iam (VocalTract);
-		Melder_information (Melder_double (my xmax - my xmin), L" m");
+		Melder_information (my xmax - my xmin, U" m");
 	}
 END
 
-FORM (VocalTract_setLength, L"", 0)
-	POSITIVE (L"New length (m)", L"0.17")
+FORM (VocalTract_setLength, U"", 0)
+	POSITIVE (U"New length (m)", U"0.17")
 	OK
 DO
-	double newLength = GET_REAL (L"New length");
+	double newLength = GET_REAL (U"New length");
 	LOOP {
 		iam (VocalTract);
 		VocalTract_setLength (me, newLength);
 	}
 END
 
-FORM (VocalTract_to_VocalTractTier, L"VocalTract: To VocalTractTier", 0)
-	REAL (L"Tier start time (s)", L"0.0")
-	REAL (L"Tier end time (s)", L"1.0")
-	REAL (L"Insert at time (s)", L"0.5")
+FORM (VocalTract_to_VocalTractTier, U"VocalTract: To VocalTractTier", 0)
+	REAL (U"Tier start time (s)", U"0.0")
+	REAL (U"Tier end time (s)", U"1.0")
+	REAL (U"Insert at time (s)", U"0.5")
 	OK
 DO
-	double xmin = GET_REAL (L"Tier start time");
-	double xmax = GET_REAL (L"Tier end time");
-	double time = GET_REAL (L"Insert at time");
-	REQUIRE (xmin < xmax, L"The start time must be before the end time.")
-	REQUIRE (time >= xmin and time <= xmax, L"The insert time must be between start en end time.")
+	double xmin = GET_REAL (U"Tier start time");
+	double xmax = GET_REAL (U"Tier end time");
+	double time = GET_REAL (U"Insert at time");
+	REQUIRE (xmin < xmax, U"The start time must be before the end time.")
+	REQUIRE (time >= xmin and time <= xmax, U"The insert time must be between start en end time.")
 	LOOP {
 		iam (VocalTract);
 		autoVocalTractTier thee = VocalTract_to_VocalTractTier (me, xmin, xmax, time);
@@ -1102,227 +1122,233 @@ DO
 END
 
 DIRECT (VocalTractTier_help)
-	Melder_help (L"VocalTractTier");
+	Melder_help (U"VocalTractTier");
 END
 
-FORM (VocalTractTier_to_LPC, L"VocalTractTier: To LPC", 0)
-	POSITIVE (L"Time step", L"0.005")
+FORM (VocalTractTier_to_LPC, U"VocalTractTier: To LPC", 0)
+	POSITIVE (U"Time step", U"0.005")
 	OK
 DO
 	LOOP {
 		iam (VocalTractTier);
-		praat_new (VocalTractTier_to_LPC (me, GET_REAL (L"Time step")), my name);
+		autoLPC thee = VocalTractTier_to_LPC (me, GET_REAL (U"Time step"));
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (VocalTractTier_to_VocalTract, L"", 0)
-	REAL (L"Time (s)", L"0.1")
+FORM (VocalTractTier_to_VocalTract, U"", 0)
+	REAL (U"Time (s)", U"0.1")
 	OK
 DO
-	double time = GET_REAL (L"Time");
+	double time = GET_REAL (U"Time");
 	LOOP {
 		iam (VocalTractTier);
-		praat_new (VocalTractTier_to_VocalTract (me, time), my name);
+		autoVocalTract thee = VocalTractTier_to_VocalTract (me, time);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (VocalTractTier_addVocalTract, L"VocalTractTier: Add VocalTract", 0)
-	REAL (L"Time", L"0.1")
+FORM (VocalTractTier_addVocalTract, U"VocalTractTier: Add VocalTract", 0)
+	REAL (U"Time", U"0.1")
 	OK
 DO
 	VocalTractTier me = FIRST (VocalTractTier);
 	VocalTract thee = FIRST (VocalTract);
-	VocalTractTier_addVocalTract (me, GET_REAL (L"Time"), thee);
+	VocalTractTier_addVocalTract (me, GET_REAL (U"Time"), thee);
 	praat_dataChanged (me);
 END
 
 /******************* LPC & Sound *************************************/
 
-FORM (LPC_and_Sound_filter, L"LPC & Sound: Filter", L"LPC & Sound: Filter...")
-	BOOLEAN (L"Use LPC gain", 0)
+FORM (LPC_and_Sound_filter, U"LPC & Sound: Filter", U"LPC & Sound: Filter...")
+	BOOLEAN (U"Use LPC gain", 0)
 	OK
 DO
 	LPC me = FIRST (LPC);
 	Sound s = FIRST (Sound);
-	praat_new (LPC_and_Sound_filter (me , s, GET_INTEGER (L"Use LPC gain")), my name);
+	autoSound thee = LPC_and_Sound_filter (me , s, GET_INTEGER (U"Use LPC gain"));
+	praat_new (thee.transfer(), my name);
 END
 
-FORM (LPC_and_Sound_filterWithFilterAtTime, L"LPC & Sound: Filter with one filter at time",
-      L"LPC & Sound: Filter with filter at time...")
-	OPTIONMENU (L"Channel", 2)
-	OPTION (L"Both")
-	OPTION (L"Left")
-	OPTION (L"Right")
-	REAL (L"Use filter at time (s)", L"0.0")
+FORM (LPC_and_Sound_filterWithFilterAtTime, U"LPC & Sound: Filter with one filter at time",
+      U"LPC & Sound: Filter with filter at time...")
+	OPTIONMENU (U"Channel", 2)
+	OPTION (U"Both")
+	OPTION (U"Left")
+	OPTION (U"Right")
+	REAL (U"Use filter at time (s)", U"0.0")
 	OK
 DO
 	LPC me = FIRST (LPC);
 	Sound s = FIRST (Sound);
-	long channel = GET_INTEGER (L"Channel") - 1;
-	praat_new (LPC_and_Sound_filterWithFilterAtTime (me , s, channel, GET_REAL (L"Use filter at time")), my name);
+	long channel = GET_INTEGER (U"Channel") - 1;
+	autoSound thee = LPC_and_Sound_filterWithFilterAtTime (me , s, channel, GET_REAL (U"Use filter at time"));
+	praat_new (thee.transfer(), my name);
 END
 
 DIRECT (LPC_and_Sound_filterInverse)
 	LPC me = FIRST (LPC);
 	Sound s = FIRST (Sound);
-	praat_new (LPC_and_Sound_filterInverse (me , s), my name);
+	autoSound thee = LPC_and_Sound_filterInverse (me , s);
+	praat_new (thee.transfer(), my name);
 END
 
-FORM (LPC_and_Sound_filterInverseWithFilterAtTime, L"LPC & Sound: Filter (inverse) with filter at time",
-      L"LPC & Sound: Filter (inverse) with filter at time...")
-	OPTIONMENU (L"Channel", 2)
-	OPTION (L"Both")
-	OPTION (L"Left")
-	OPTION (L"Right")
-	REAL (L"Use filter at time (s)", L"0.0")
+FORM (LPC_and_Sound_filterInverseWithFilterAtTime, U"LPC & Sound: Filter (inverse) with filter at time",
+      U"LPC & Sound: Filter (inverse) with filter at time...")
+	OPTIONMENU (U"Channel", 2)
+	OPTION (U"Both")
+	OPTION (U"Left")
+	OPTION (U"Right")
+	REAL (U"Use filter at time (s)", U"0.0")
 	OK
 DO
 	LPC me = FIRST (LPC);
 	Sound s = FIRST (Sound);
-	long channel = GET_INTEGER (L"Channel") - 1;
-	praat_new (LPC_and_Sound_filterInverseWithFilterAtTime (me , s, channel, GET_REAL (L"Use filter at time")), my name);
-END
-
-FORM (LPC_and_Sound_to_LPC_robust, L"Robust LPC analysis", L"LPC & Sound: To LPC (robust)...")
-	POSITIVE (L"Window length (s)", L"0.025")
-	POSITIVE (L"Pre-emphasis frequency (Hz)", L"50.0")
-	POSITIVE (L"Number of std. dev.", L"1.5")
-	NATURAL (L"Maximum number of iterations", L"5")
-	REAL (L"Tolerance", L"0.000001")
-	BOOLEAN (L"Variable location", 0)
+	long channel = GET_INTEGER (U"Channel") - 1;
+	autoSound thee = LPC_and_Sound_filterInverseWithFilterAtTime (me , s, channel, GET_REAL (U"Use filter at time"));
+	praat_new (thee.transfer(), my name);
+END
+
+FORM (LPC_and_Sound_to_LPC_robust, U"Robust LPC analysis", U"LPC & Sound: To LPC (robust)...")
+	POSITIVE (U"Window length (s)", U"0.025")
+	POSITIVE (U"Pre-emphasis frequency (Hz)", U"50.0")
+	POSITIVE (U"Number of std. dev.", U"1.5")
+	NATURAL (U"Maximum number of iterations", U"5")
+	REAL (U"Tolerance", U"0.000001")
+	BOOLEAN (U"Variable location", 0)
 	OK
 DO
 	LPC me = FIRST (LPC);
 	Sound s = FIRST (Sound);
-	praat_new (LPC_and_Sound_to_LPC_robust (me, s, GET_REAL (L"Window length"), GET_REAL (L"Pre-emphasis frequency"),
-		GET_REAL (L"Number of std. dev."), GET_INTEGER (L"Maximum number of iterations"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Variable location")), my name, L"_r");
+	praat_new (LPC_and_Sound_to_LPC_robust (me, s, GET_REAL (U"Window length"), GET_REAL (U"Pre-emphasis frequency"),
+		GET_REAL (U"Number of std. dev."), GET_INTEGER (U"Maximum number of iterations"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Variable location")), my name, U"_r");
 END
 
 extern void praat_TimeTier_query_init (ClassInfo klas);
 extern void praat_TimeTier_modify_init (ClassInfo klas);
-void praat_uvafon_LPC_init (void);
-void praat_uvafon_LPC_init (void) {
+void praat_uvafon_LPC_init ();
+void praat_uvafon_LPC_init () {
 	Thing_recognizeClassesByName (classCepstrumc, classPowerCepstrum, classCepstrogram, classPowerCepstrogram, classLPC, classLFCC, classMFCC, classVocalTractTier, NULL);
 
-	praat_addAction1 (classPowerCepstrum, 0, L"PowerCepstrum help", 0, 0, DO_PowerCepstrum_help);
-	praat_addAction1 (classPowerCepstrum, 0, L"Draw...", 0, 0, DO_PowerCepstrum_draw);
-	praat_addAction1 (classPowerCepstrum, 0, L"Draw tilt line...", 0, 0, DO_PowerCepstrum_drawTiltLine);
-	praat_addAction1 (classCepstrum, 0, L"Draw (linear)...", 0, praat_HIDDEN, DO_Cepstrum_drawLinear);
-	praat_addAction1 (classCepstrum, 0, L"Down to PowerCepstrum", 0, 0, DO_Cepstrum_downto_PowerCepstrum);
+	praat_addAction1 (classPowerCepstrum, 0, U"PowerCepstrum help", 0, 0, DO_PowerCepstrum_help);
+	praat_addAction1 (classPowerCepstrum, 0, U"Draw...", 0, 0, DO_PowerCepstrum_draw);
+	praat_addAction1 (classPowerCepstrum, 0, U"Draw tilt line...", 0, 0, DO_PowerCepstrum_drawTiltLine);
+	praat_addAction1 (classCepstrum, 0, U"Draw (linear)...", 0, praat_HIDDEN, DO_Cepstrum_drawLinear);
+	praat_addAction1 (classCepstrum, 0, U"Down to PowerCepstrum", 0, 0, DO_Cepstrum_downto_PowerCepstrum);
 	
-	praat_addAction1 (classPowerCepstrum, 1, L"Query -", 0, 0, 0);
-		praat_addAction1 (classPowerCepstrum, 0, L"Get peak...", 0, 1, DO_PowerCepstrum_getPeak);
-		praat_addAction1 (classPowerCepstrum, 0, L"Get quefrency of peak...", 0, 1, DO_PowerCepstrum_getQuefrencyOfPeak);
-		praat_addAction1 (classPowerCepstrum, 0, L"Get peak prominence (hillenbrand)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_PowerCepstrum_getPeakProminence_hillenbrand);
-		praat_addAction1 (classPowerCepstrum, 0, L"Get peak prominence...", 0, 1, DO_PowerCepstrum_getPeakProminence);
-		praat_addAction1 (classPowerCepstrum, 0, L"Get tilt line slope...", 0, 1, DO_PowerCepstrum_getTiltLineSlope);
-		praat_addAction1 (classPowerCepstrum, 0, L"Get tilt line intercept...", 0, 1, DO_PowerCepstrum_getTiltLineIntercept);
-		praat_addAction1 (classPowerCepstrum, 0, L"Get rhamonics to noise ratio...", 0, 1, DO_PowerCepstrum_getRNR);
-	praat_addAction1 (classPowerCepstrum, 1, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classPowerCepstrum, 0, L"Formula...", 0, 1, DO_PowerCepstrum_formula);
-		praat_addAction1 (classPowerCepstrum, 0, L"Subtract tilt (in-line)...", 0, 1, DO_PowerCepstrum_subtractTilt_inline);
-		praat_addAction1 (classPowerCepstrum, 0, L"Smooth (in-line)...", 0, 1, DO_PowerCepstrum_smooth_inline);
-
-	praat_addAction1 (classPowerCepstrum, 0, L"Subtract tilt...", 0, 0, DO_PowerCepstrum_subtractTilt);
-	praat_addAction1 (classPowerCepstrum, 0, L"Smooth...", 0, 0, DO_PowerCepstrum_smooth);
-	praat_addAction1 (classCepstrum, 0, L"To Spectrum", 0, praat_HIDDEN, DO_Cepstrum_to_Spectrum);
-	praat_addAction1 (classPowerCepstrum, 0, L"To Matrix", 0, 0, DO_PowerCepstrum_to_Matrix);
-
-	praat_addAction1 (classPowerCepstrogram, 0, L"PowerCepstrogram help", 0, 0, DO_PowerCepstrogram_help);
-	praat_addAction1 (classPowerCepstrogram, 0, L"Paint...", 0, 0, DO_PowerCepstrogram_paint);
-	praat_addAction1 (classPowerCepstrogram, 1, L"Query -", 0, 0, 0);
+	praat_addAction1 (classPowerCepstrum, 1, U"Query -", 0, 0, 0);
+		praat_addAction1 (classPowerCepstrum, 0, U"Get peak...", 0, 1, DO_PowerCepstrum_getPeak);
+		praat_addAction1 (classPowerCepstrum, 0, U"Get quefrency of peak...", 0, 1, DO_PowerCepstrum_getQuefrencyOfPeak);
+		praat_addAction1 (classPowerCepstrum, 0, U"Get peak prominence (hillenbrand)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_PowerCepstrum_getPeakProminence_hillenbrand);
+		praat_addAction1 (classPowerCepstrum, 0, U"Get peak prominence...", 0, 1, DO_PowerCepstrum_getPeakProminence);
+		praat_addAction1 (classPowerCepstrum, 0, U"Get tilt line slope...", 0, 1, DO_PowerCepstrum_getTiltLineSlope);
+		praat_addAction1 (classPowerCepstrum, 0, U"Get tilt line intercept...", 0, 1, DO_PowerCepstrum_getTiltLineIntercept);
+		praat_addAction1 (classPowerCepstrum, 0, U"Get rhamonics to noise ratio...", 0, 1, DO_PowerCepstrum_getRNR);
+	praat_addAction1 (classPowerCepstrum, 1, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classPowerCepstrum, 0, U"Formula...", 0, 1, DO_PowerCepstrum_formula);
+		praat_addAction1 (classPowerCepstrum, 0, U"Subtract tilt (in-line)...", 0, 1, DO_PowerCepstrum_subtractTilt_inline);
+		praat_addAction1 (classPowerCepstrum, 0, U"Smooth (in-line)...", 0, 1, DO_PowerCepstrum_smooth_inline);
+
+	praat_addAction1 (classPowerCepstrum, 0, U"Subtract tilt...", 0, 0, DO_PowerCepstrum_subtractTilt);
+	praat_addAction1 (classPowerCepstrum, 0, U"Smooth...", 0, 0, DO_PowerCepstrum_smooth);
+	praat_addAction1 (classCepstrum, 0, U"To Spectrum", 0, praat_HIDDEN, DO_Cepstrum_to_Spectrum);
+	praat_addAction1 (classPowerCepstrum, 0, U"To Matrix", 0, 0, DO_PowerCepstrum_to_Matrix);
+
+	praat_addAction1 (classPowerCepstrogram, 0, U"PowerCepstrogram help", 0, 0, DO_PowerCepstrogram_help);
+	praat_addAction1 (classPowerCepstrogram, 0, U"Paint...", 0, 0, DO_PowerCepstrogram_paint);
+	praat_addAction1 (classPowerCepstrogram, 1, U"Query -", 0, 0, 0);
 		praat_TimeFrameSampled_query_init (classPowerCepstrogram);
-		praat_addAction1 (classPowerCepstrogram, 1, L"Query quefrency domain", 0, 1, 0);
-			praat_addAction1 (classPowerCepstrogram, 1, L"Get start quefrency", 0, 2, DO_PowerCepstrogram_getStartQuefrency);
-			praat_addAction1 (classPowerCepstrogram, 1, L"Get end quefrency", 0, 2, DO_PowerCepstrogram_getEndQuefrency);
-		praat_addAction1 (classPowerCepstrogram, 1, L"Query quefrency sampling", 0, 1, 0);
-			praat_addAction1 (classPowerCepstrogram, 1, L"Get number of quefrency bins", 0, 2, DO_PowerCepstrogram_getNumberOfQuefrencyBins);
-			praat_addAction1 (classPowerCepstrogram, 1, L"Get quefrency step", 0, 2, DO_PowerCepstrogram_getQuefrencyStep);
-		praat_addAction1 (classPowerCepstrogram, 0, L"Get CPPS (hillenbrand)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_PowerCepstrogram_getCPPS_hillenbrand);
-		praat_addAction1 (classPowerCepstrogram, 0, L"Get CPPS...", 0, 1, DO_PowerCepstrogram_getCPPS);
-	praat_addAction1 (classPowerCepstrogram, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classPowerCepstrogram, 1, U"Query quefrency domain", 0, 1, 0);
+			praat_addAction1 (classPowerCepstrogram, 1, U"Get start quefrency", 0, 2, DO_PowerCepstrogram_getStartQuefrency);
+			praat_addAction1 (classPowerCepstrogram, 1, U"Get end quefrency", 0, 2, DO_PowerCepstrogram_getEndQuefrency);
+		praat_addAction1 (classPowerCepstrogram, 1, U"Query quefrency sampling", 0, 1, 0);
+			praat_addAction1 (classPowerCepstrogram, 1, U"Get number of quefrency bins", 0, 2, DO_PowerCepstrogram_getNumberOfQuefrencyBins);
+			praat_addAction1 (classPowerCepstrogram, 1, U"Get quefrency step", 0, 2, DO_PowerCepstrogram_getQuefrencyStep);
+		praat_addAction1 (classPowerCepstrogram, 0, U"Get CPPS (hillenbrand)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_PowerCepstrogram_getCPPS_hillenbrand);
+		praat_addAction1 (classPowerCepstrogram, 0, U"Get CPPS...", 0, 1, DO_PowerCepstrogram_getCPPS);
+	praat_addAction1 (classPowerCepstrogram, 0, U"Modify -", 0, 0, 0);
 		praat_TimeFunction_modify_init (classPowerCepstrogram);
-		praat_addAction1 (classPowerCepstrogram, 0, L"Formula...", 0, 1, DO_PowerCepstrogram_formula);
-		praat_addAction1 (classPowerCepstrogram, 0, L"Subtract tilt (in-line)...", 0, 1, DO_PowerCepstrogram_subtractTilt_inline);
-	praat_addAction1 (classPowerCepstrogram, 0, L"To PowerCepstrum (slice)...", 0, 0, DO_PowerCepstrogram_to_PowerCepstrum_slice);
-	praat_addAction1 (classPowerCepstrogram, 0, L"Smooth...", 0, 0, DO_PowerCepstrogram_smooth);
-	praat_addAction1 (classPowerCepstrogram, 0, L"Subtract tilt...", 0, 0, DO_PowerCepstrogram_subtractTilt);
-	praat_addAction1 (classPowerCepstrogram, 0, L"To Table (hillenbrand)...", 0, praat_HIDDEN, DO_PowerCepstrogram_to_Table_hillenbrand);
-	praat_addAction1 (classPowerCepstrogram, 0, L"To Table (peak prominence)...", 0, praat_HIDDEN, DO_PowerCepstrogram_to_Table_cpp);
-	praat_addAction1 (classPowerCepstrogram, 0, L"To Matrix", 0, 0, DO_PowerCepstrogram_to_Matrix);
-
-	praat_addAction1 (classCepstrumc, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classCepstrumc, 0, L"To LPC", 0, 0, DO_Cepstrumc_to_LPC);
-	praat_addAction1 (classCepstrumc, 2, L"To DTW...", 0, 0, DO_Cepstrumc_to_DTW);
-	praat_addAction1 (classCepstrumc, 0, L"Hack", 0, 0, 0);
-	praat_addAction1 (classCepstrumc, 0, L"To Matrix", 0, 0, DO_Cepstrumc_to_Matrix);
-
-	praat_addAction1 (classFormant, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classFormant, 0, L"To LPC...", 0, 0, DO_Formant_to_LPC);
-	praat_addAction1 (classFormant, 0, L"Formula...", L"Formula (bandwidths)...", 1, DO_Formant_formula);
-	praat_addAction2 (classFormant, 1, classSpectrogram, 1, L"To IntensityTier...", 0, 0, DO_Formant_and_Spectrogram_to_IntensityTier);
+		praat_addAction1 (classPowerCepstrogram, 0, U"Formula...", 0, 1, DO_PowerCepstrogram_formula);
+		praat_addAction1 (classPowerCepstrogram, 0, U"Subtract tilt (in-line)...", 0, 1, DO_PowerCepstrogram_subtractTilt_inline);
+	praat_addAction1 (classPowerCepstrogram, 0, U"To PowerCepstrum (slice)...", 0, 0, DO_PowerCepstrogram_to_PowerCepstrum_slice);
+	praat_addAction1 (classPowerCepstrogram, 0, U"Smooth...", 0, 0, DO_PowerCepstrogram_smooth);
+	praat_addAction1 (classPowerCepstrogram, 0, U"Subtract tilt...", 0, 0, DO_PowerCepstrogram_subtractTilt);
+	praat_addAction1 (classPowerCepstrogram, 0, U"To Table (hillenbrand)...", 0, praat_HIDDEN, DO_PowerCepstrogram_to_Table_hillenbrand);
+	praat_addAction1 (classPowerCepstrogram, 0, U"To Table (peak prominence)...", 0, praat_HIDDEN, DO_PowerCepstrogram_to_Table_cpp);
+	praat_addAction1 (classPowerCepstrogram, 0, U"To Matrix", 0, 0, DO_PowerCepstrogram_to_Matrix);
+
+	praat_addAction1 (classCepstrumc, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classCepstrumc, 0, U"To LPC", 0, 0, DO_Cepstrumc_to_LPC);
+	praat_addAction1 (classCepstrumc, 2, U"To DTW...", 0, 0, DO_Cepstrumc_to_DTW);
+	praat_addAction1 (classCepstrumc, 0, U"Hack", 0, 0, 0);
+	praat_addAction1 (classCepstrumc, 0, U"To Matrix", 0, 0, DO_Cepstrumc_to_Matrix);
+
+	praat_addAction1 (classFormant, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classFormant, 0, U"To LPC...", 0, 0, DO_Formant_to_LPC);
+	praat_addAction1 (classFormant, 0, U"Formula...", U"Formula (bandwidths)...", 1, DO_Formant_formula);
+	praat_addAction2 (classFormant, 1, classSpectrogram, 1, U"To IntensityTier...", 0, 0, DO_Formant_and_Spectrogram_to_IntensityTier);
 
 	
 	
-	praat_addAction1 (classLFCC, 0, L"LFCC help", 0, 0, DO_LFCC_help);
+	praat_addAction1 (classLFCC, 0, U"LFCC help", 0, 0, DO_LFCC_help);
 	praat_CC_init (classLFCC);
-	praat_addAction1 (classLFCC, 0, L"To LPC...", 0, 0, DO_LFCC_to_LPC);
+	praat_addAction1 (classLFCC, 0, U"To LPC...", 0, 0, DO_LFCC_to_LPC);
 
-	praat_addAction1 (classLPC, 0, L"LPC help", 0, 0, DO_LPC_help);
+	praat_addAction1 (classLPC, 0, U"LPC help", 0, 0, DO_LPC_help);
 	praat_addAction1 (classLPC, 0, DRAW_BUTTON, 0, 0, 0);
-	praat_addAction1 (classLPC, 0, L"Draw gain...", 0, 1, DO_LPC_drawGain);
-	praat_addAction1 (classLPC, 0, L"Draw poles...", 0, 1, DO_LPC_drawPoles);
+	praat_addAction1 (classLPC, 0, U"Draw gain...", 0, 1, DO_LPC_drawGain);
+	praat_addAction1 (classLPC, 0, U"Draw poles...", 0, 1, DO_LPC_drawPoles);
 	praat_addAction1 (classLPC, 0, QUERY_BUTTON, 0, 0, 0);
 		praat_TimeFrameSampled_query_init (classLPC);
-		praat_addAction1 (classLPC, 1, L"Get sampling interval", 0, 1, DO_LPC_getSamplingInterval);
-		praat_addAction1 (classLPC, 1, L"Get number of coefficients...", 0, 1, DO_LPC_getNumberOfCoefficients);
+		praat_addAction1 (classLPC, 1, U"Get sampling interval", 0, 1, DO_LPC_getSamplingInterval);
+		praat_addAction1 (classLPC, 1, U"Get number of coefficients...", 0, 1, DO_LPC_getNumberOfCoefficients);
 	praat_addAction1 (classLPC, 0, MODIFY_BUTTON, 0, 0, 0);
 		praat_TimeFunction_modify_init (classLPC);
-	praat_addAction1 (classLPC, 0, L"Extract", 0, 0, 0);
-
-	praat_addAction1 (classLPC, 0, L"To Spectrum (slice)...", 0, 0, DO_LPC_to_Spectrum);
-	praat_addAction1 (classLPC, 0, L"To VocalTract (slice)...", 0, 0, DO_LPC_to_VocalTract);
-	praat_addAction1 (classLPC, 0, L"To VocalTract (slice, special)...", 0, 0, DO_LPC_to_VocalTract_special);
-	praat_addAction1 (classLPC, 0, L"To Polynomial (slice)...", 0, 0, DO_LPC_to_Polynomial);
-	praat_addAction1 (classLPC, 0, L"Down to Matrix (lpc)", 0, 0, DO_LPC_downto_Matrix_lpc);
-	praat_addAction1 (classLPC, 0, L"Down to Matrix (rc)", 0, praat_HIDDEN, DO_LPC_downto_Matrix_rc);
-	praat_addAction1 (classLPC, 0, L"Down to Matrix (area)", 0, praat_HIDDEN, DO_LPC_downto_Matrix_area);
-	praat_addAction1 (classLPC, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classLPC, 0, L"To Formant", 0, 0, DO_LPC_to_Formant);
-	praat_addAction1 (classLPC, 0, L"To Formant (keep all)", 0, 0, DO_LPC_to_Formant_keep_all);
-	praat_addAction1 (classLPC, 0, L"To LFCC...", 0, 0, DO_LPC_to_LFCC);
-	praat_addAction1 (classLPC, 0, L"To Spectrogram...", 0, 0, DO_LPC_to_Spectrogram);
-
-	praat_addAction2 (classLPC, 1, classSound, 1, L"Analyse", 0, 0, 0);
-	praat_addAction2 (classLPC, 1, classSound, 1, L"Filter...", 0, 0, DO_LPC_and_Sound_filter);
-	praat_addAction2 (classLPC, 1, classSound, 1, L"Filter (inverse)", 0, 0, DO_LPC_and_Sound_filterInverse);
-	praat_addAction2 (classLPC, 1, classSound, 1, L"To LPC (robust)...", 0, praat_HIDDEN + praat_DEPTH_1, DO_LPC_and_Sound_to_LPC_robust);
-	praat_addAction2 (classLPC, 1, classSound, 1, L"Filter with filter at time...", 0, 0, DO_LPC_and_Sound_filterWithFilterAtTime);
-	praat_addAction2 (classLPC, 1, classSound, 1, L"Filter (inverse) with filter at time...", 0, 0, DO_LPC_and_Sound_filterInverseWithFilterAtTime);
-
-
-	praat_addAction1 (classSound, 0, L"To LPC (autocorrelation)...", L"To Formant (sl)...", 1, DO_Sound_to_LPC_auto);
-	praat_addAction1 (classSound, 0, L"To LPC (covariance)...", L"To LPC (autocorrelation)...", 1, DO_Sound_to_LPC_covar);
-	praat_addAction1 (classSound, 0, L"To LPC (burg)...", L"To LPC (covariance)...", 1, DO_Sound_to_LPC_burg);
-	praat_addAction1 (classSound, 0, L"To LPC (marple)...", L"To LPC (burg)...", 1, DO_Sound_to_LPC_marple);
-	praat_addAction1 (classSound, 0, L"To MFCC...", L"To LPC (marple)...", 1, DO_Sound_to_MFCC);
-	praat_addAction1 (classSound, 0, L"To Formant (robust)...", L"To Formant (sl)...", 2, DO_Sound_to_Formant_robust);
-	praat_addAction1 (classSound, 0, L"To PowerCepstrogram...", L"To Harmonicity (gne)...", 1, DO_Sound_to_PowerCepstrogram);
-	praat_addAction1 (classSound, 0, L"To PowerCepstrogram (hillenbrand)...", L"To Harmonicity (gne)...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_PowerCepstrogram_hillenbrand);
+	praat_addAction1 (classLPC, 0, U"Extract", 0, 0, 0);
+
+	praat_addAction1 (classLPC, 0, U"To Spectrum (slice)...", 0, 0, DO_LPC_to_Spectrum);
+	praat_addAction1 (classLPC, 0, U"To VocalTract (slice)...", 0, 0, DO_LPC_to_VocalTract);
+	praat_addAction1 (classLPC, 0, U"To VocalTract (slice, special)...", 0, 0, DO_LPC_to_VocalTract_special);
+	praat_addAction1 (classLPC, 0, U"To Polynomial (slice)...", 0, 0, DO_LPC_to_Polynomial);
+	praat_addAction1 (classLPC, 0, U"Down to Matrix (lpc)", 0, 0, DO_LPC_downto_Matrix_lpc);
+	praat_addAction1 (classLPC, 0, U"Down to Matrix (rc)", 0, praat_HIDDEN, DO_LPC_downto_Matrix_rc);
+	praat_addAction1 (classLPC, 0, U"Down to Matrix (area)", 0, praat_HIDDEN, DO_LPC_downto_Matrix_area);
+	praat_addAction1 (classLPC, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classLPC, 0, U"To Formant", 0, 0, DO_LPC_to_Formant);
+	praat_addAction1 (classLPC, 0, U"To Formant (keep all)", 0, 0, DO_LPC_to_Formant_keep_all);
+	praat_addAction1 (classLPC, 0, U"To LFCC...", 0, 0, DO_LPC_to_LFCC);
+	praat_addAction1 (classLPC, 0, U"To Spectrogram...", 0, 0, DO_LPC_to_Spectrogram);
+
+	praat_addAction2 (classLPC, 1, classSound, 1, U"Analyse", 0, 0, 0);
+	praat_addAction2 (classLPC, 1, classSound, 1, U"Filter...", 0, 0, DO_LPC_and_Sound_filter);
+	praat_addAction2 (classLPC, 1, classSound, 1, U"Filter (inverse)", 0, 0, DO_LPC_and_Sound_filterInverse);
+	praat_addAction2 (classLPC, 1, classSound, 1, U"To LPC (robust)...", 0, praat_HIDDEN + praat_DEPTH_1, DO_LPC_and_Sound_to_LPC_robust);
+	praat_addAction2 (classLPC, 1, classSound, 1, U"Filter with filter at time...", 0, 0, DO_LPC_and_Sound_filterWithFilterAtTime);
+	praat_addAction2 (classLPC, 1, classSound, 1, U"Filter (inverse) with filter at time...", 0, 0, DO_LPC_and_Sound_filterInverseWithFilterAtTime);
+
+
+	praat_addAction1 (classSound, 0, U"To LPC (autocorrelation)...", U"To Formant (sl)...", 1, DO_Sound_to_LPC_auto);
+	praat_addAction1 (classSound, 0, U"To LPC (covariance)...", U"To LPC (autocorrelation)...", 1, DO_Sound_to_LPC_covar);
+	praat_addAction1 (classSound, 0, U"To LPC (burg)...", U"To LPC (covariance)...", 1, DO_Sound_to_LPC_burg);
+	praat_addAction1 (classSound, 0, U"To LPC (marple)...", U"To LPC (burg)...", 1, DO_Sound_to_LPC_marple);
+	praat_addAction1 (classSound, 0, U"To MFCC...", U"To LPC (marple)...", 1, DO_Sound_to_MFCC);
+	praat_addAction1 (classSound, 0, U"To Formant (robust)...", U"To Formant (sl)...", 2, DO_Sound_to_Formant_robust);
+	praat_addAction1 (classSound, 0, U"To PowerCepstrogram...", U"To Harmonicity (gne)...", 1, DO_Sound_to_PowerCepstrogram);
+	praat_addAction1 (classSound, 0, U"To PowerCepstrogram (hillenbrand)...", U"To Harmonicity (gne)...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_PowerCepstrogram_hillenbrand);
 	
-	praat_addAction1 (classVocalTract, 0, L"Draw segments...", L"Draw", 0, DO_VocalTract_drawSegments);
-	praat_addAction1 (classVocalTract, 1, L"Get length", L"Draw segments...", 0, DO_VocalTract_getLength);
-	praat_addAction1 (classVocalTract, 1, L"Set length", L"Formula...", 0, DO_VocalTract_getLength);
-	praat_addAction1 (classVocalTract, 0, L"To VocalTractTier...", L"To Spectrum...", 0, DO_VocalTract_to_VocalTractTier);
-	praat_addAction1 (classVocalTractTier, 0, L"VocalTractTier help", 0, 0, DO_VocalTractTier_help);
-	praat_addAction1 (classVocalTractTier, 0, L"Query -", 0, 0, 0);
+	praat_addAction1 (classVocalTract, 0, U"Draw segments...", U"Draw", 0, DO_VocalTract_drawSegments);
+	praat_addAction1 (classVocalTract, 1, U"Get length", U"Draw segments...", 0, DO_VocalTract_getLength);
+	praat_addAction1 (classVocalTract, 1, U"Set length", U"Formula...", 0, DO_VocalTract_getLength);
+	praat_addAction1 (classVocalTract, 0, U"To VocalTractTier...", U"To Spectrum...", 0, DO_VocalTract_to_VocalTractTier);
+	praat_addAction1 (classVocalTractTier, 0, U"VocalTractTier help", 0, 0, DO_VocalTractTier_help);
+	praat_addAction1 (classVocalTractTier, 0, U"Query -", 0, 0, 0);
 		praat_TimeTier_query_init (classVocalTractTier);
-	praat_addAction1 (classVocalTractTier, 0, L"Modify -", 0, 0, 0);
+	praat_addAction1 (classVocalTractTier, 0, U"Modify -", 0, 0, 0);
 		praat_TimeTier_modify_init (classVocalTractTier);
-	praat_addAction1 (classVocalTractTier, 0, L"To LPC...", 0, 0, DO_VocalTractTier_to_LPC);
-	praat_addAction1 (classVocalTractTier, 0, L"To VocalTract...", 0, 0, DO_VocalTractTier_to_VocalTract);
-	praat_addAction2 (classVocalTractTier, 1, classVocalTract, 1, L"Add VocalTract...", 0, 0, DO_VocalTractTier_addVocalTract);
+	praat_addAction1 (classVocalTractTier, 0, U"To LPC...", 0, 0, DO_VocalTractTier_to_LPC);
+	praat_addAction1 (classVocalTractTier, 0, U"To VocalTract...", 0, 0, DO_VocalTractTier_to_VocalTract);
+	praat_addAction2 (classVocalTractTier, 1, classVocalTract, 1, U"Add VocalTract...", 0, 0, DO_VocalTractTier_addVocalTract);
 
 	INCLUDE_MANPAGES (manual_LPC)
 	INCLUDE_MANPAGES (manual_DataModeler)
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ca54e16
--- /dev/null
+++ b/README.md
@@ -0,0 +1,141 @@
+# Praat: doing phonetics by computer
+
+Most information on how the program works is in its manual and on http://www.praat.org.
+
+## 1. Compiling the source code
+
+You need the Praat source code only in the following cases:
+
+1. you want to extend Praat’s functionality by adding C or C++ code to it; or
+2. you want to understand or reuse Praat’s source code; or
+3. you want to compile Praat for a computer for which we do not provide binary executables,
+e.g. Linux for non-Intel computers, FreeBSD, HP-UX, SGI, or SPARC Solaris.
+
+Before trying to dive into Praat’s source code, you should be familiar with the working of the Praat program
+and with writing Praat scripts. The Praat program can be downloaded from http://www.praat.org.
+
+### 1.1. License
+
+All of the code is available under the
+[GNU General Public License](http://www.fon.hum.uva.nl/praat/GNU_General_Public_License.txt).
+Of course, any improvements are welcomed by the authors.
+
+### 1.2. Downloading the archive
+
+To download the latest source code of Praat,
+click on one of the *zip* or *tar.gz* archives at the latest release or at any later change.
+
+### 1.3. Unpacking the archive
+
+On most computers you can unpack the *zip* file by double-clicking. If you prefer to try the *tar.gz* file instead,
+drop it on *StuffIt Expander* (on Windows), double-click it (on Macintosh),
+or use `gunzip` and `tar xvf` (on Unix).
+
+### 1.4. Steps to take if you want to extend Praat
+
+First make sure that the source code can be compiled as is.
+Then add your own buttons by editing `main/main_Praat.cpp` or `fon/praat_Fon.cpp`.
+Consult the manual page on [Programming](http://www.fon.hum.uva.nl/praat/manual/Programming_with_Praat.html).
+
+### 1.5. The programming language
+
+Most of the source code is written in C++, but some parts are written in C.
+The code requires that your compiler supports C99 and C++11 (for e.g. `char32_t` and rvalue references).
+
+### 1.6. Compiling for Windows
+
+Install Cygwin (on a 64-bit computer),
+and under Cygwin install the Devel packages i686-w64-mingw32 (for 32-bit targets)
+and/or x86_64-w64-mingw32 (for 64-bit targets).
+Move the Praat sources directory somewhere in your `/home/yourname` tree.
+Go to this sources directory (i.e. where `makefile` is) and type
+
+    cp makefiles/makefile.defs.mingw32 ./makefile.defs
+
+if you want to build Praat's 32-bit edition, or
+
+    cp makefiles/makefile.defs.mingw64 ./makefile.defs
+
+if you want to build Praat's 64-bit edition. Then type `make` to build `Praat.exe`
+(use `make -j4` to speed this up, i.e. to use 4 processors in parallel).
+
+Cross-compiling for Windows: use the [MinGW](http://www.mingw.org) compiler, perhaps on a Mac or Linux computer.
+You can find toolchains for 32 and 64 bits
+[here](http://sourceforge.net/projects/mingw-w64/files/) (look for Automated Builds).
+Install the GDI+ headers and the GDI+ library ([32-bit](http://www.fon.hum.uva.nl/praat/libgdiplus.a-32.zip);
+for 64-bit Windows just extract a GDI+ DLL from somewhere).
+Then copy the file `makefiles/makefile.defs.darmin32` or `makefiles/makefile.defs.darmin64`
+to the sources directory and rename it to `makefile.defs`.
+Then type `make`.
+
+### 1.7. Compiling for Macintosh
+
+Extract the *xcodeproj64.zip* or *xcodeproj32.zip* file from the latest release
+(depending on whether you want to compile the 64-bit or the 32-bit edition) into the directory that contains
+`sys`, `fon`, `dwtools` and so on. Then open the project `praat32.xcodeproj` or `praat64.xcodeproj` in Xcode
+and choose Build or Run. The project contains the target `praat_mac` (for MacOS X, on Intel processors).
+
+If you get an error message like “Code Signing Identity xxx does not match any valid, non-expired,
+code-signing certificate in your keychain”, then select the target `praat_mac`, go to Info → Build,
+and switch “Code Signing Identity” to “Don’t Code Sign”,
+or sign with your own certificate if you have one as a registered Apple developer.
+
+If you get lots of errors saying “Expected unqualified-id” or “Unknown type name NSString”,
+then you may have to switch the Type of some .cpp file from “C++ Source” to “Objective-C++ Source”
+(under “Identity and Type” in the righthand sidebar).
+
+### 1.8. Compiling on Linux and other Unixes
+
+Install `libgtk2.0-dev` (and its dependencies) and `libasound2-dev`. Then go to the sources directory and type
+
+    cp makefiles/makefile.defs.linux.alsa ./makefile.defs
+    mv external/portaudio external/portaudio2014
+    mv external/portaudio2007 external/portaudio
+
+Then type `make` to build the program. You may have to `kill jackd` or `artsd` to get audio to function.
+If your Unix isn’t Linux, you may have to edit the library names in the makefile
+(you may need pthread, gtk-x11-2.0, gdk-x11-2.0, atk-1.0, pangoft2-1.0, gdk_pixbuf-2.0, m, pangocairo-1.0,
+cairo, gio-2.0, pango-1.0, freetype, fontconfig, gobject-2.0, gmodule-2.0, gthread-2.0, rt, glib-2.0, asound).
+
+When compiling Praat on an external supercomputer or so, you will not have sound.
+If you do have `libgtk2.0-dev` (and its dependencies), do
+
+    cp makefiles/makefile.defs.linux.silent ./makefile.defs
+
+Then type `make` to build the program. If your Unix isn’t Linux,
+you may have to edit the library names in the makefile (you may need pthread, gtk-x11-2.0, gdk-x11-2.0, atk-1.0,
+pangoft2-1.0, gdk_pixbuf-2.0, m, pangocairo-1.0, cairo, gio-2.0, pango-1.0, freetype, fontconfig, gobject-2.0,
+gmodule-2.0, gthread-2.0, rt, glib-2.0).
+
+## 2. Binary executables
+
+The meaning of the names of binary files uploaded on GitHub is as follows:
+
+### 2.1. Windows binaries
+- `praatXXXX_win64.zip`: zipped executable for 64-bit Windows (XP and higher)
+- `praatXXXX_win32.zip`: zipped executable for 32-bit Windows (XP and higher)
+- `praatconXXXX_win64.zip`: zipped executable for 64-bit Windows, console edition
+- `praatconXXXX_win32.zip`: zipped executable for 32-bit Windows, console edition
+- `praatconXXXX_win32sit.exe`: self-extracting StuffIt archive with executable for 32-bit Windows, console edition
+- `praatXXXX_win98.zip`: zipped executable for Windows 98
+- `praatXXXX_win98sit.exe`: self-extracting StuffIt archive with executable for Windows 98
+
+### 2.2. Mac binaries
+- `praatXXXX_mac64.dmg`: disk image with executable for 64-bit Intel Macs (Cocoa)
+- `praatXXXX_mac32.dmg`: disk image with executable for 32-bit Intel Macs (Carbon)
+- `praatXXXX_xcodeproj64.zip`: zipped Xcode project file for the 64-bit edition (Cocoa)
+- `praatXXXX_xcodeproj32.zip`: zipped Xcode project file for the 32-bit edition (Carbon)
+- `praatXXXX_macU.dmg`: disk image with universal executable for (32-bit) PPC and Intel Macs (Carbon)
+- `praatXXXX_macU.sit`: StuffIt archive with universal executable for (32-bit) PPC and Intel Macs (Carbon)
+- `praatXXXX_macU.zip`: zipped universal executable for (32-bit) PPC and Intel Macs (Carbon)
+- `praatXXXX_macX.zip`: zipped executable for MacOS X (PPC)
+- `praatXXXX_mac9.sit`: StuffIt archive with executable for MacOS 9
+- `praatXXXX_mac9.zip`: zipped executable for MacOS 9
+- `praatXXXX_mac7.sit`: StuffIt archive with executable for MacOS 7
+
+### 2.3. Unix binaries
+- `praatXXXX_linux64.tar.gz`: gzipped tarred executable for 64-bit Linux (GTK)
+- `praatXXXX_linux32.tar.gz`: gzipped tarred executable for 32-bit Linux (GTK)
+- `praatXXXX_linux_motif64.tar.gz`: gzipped tarred executable for 64-bit Linux (Motif)
+- `praatXXXX_linux_motif32.tar.gz`: gzipped tarred executable for 32-bit Linux (Motif)
+- `praatXXXX_solaris.tar.gz`: gzipped tarred executable for Solaris
diff --git a/artsynth/Art_Speaker.cpp b/artsynth/Art_Speaker.cpp
index d9d2c37..b13b103 100644
--- a/artsynth/Art_Speaker.cpp
+++ b/artsynth/Art_Speaker.cpp
@@ -1,6 +1,6 @@
 /* Art_Speaker.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -420,7 +420,7 @@ void Art_Speaker_drawMesh (Art art, Speaker speaker, Graphics graphics) {
 	for (i = 1; i <= Art_Speaker_meshCount + 1; i ++)
 		Graphics_speckle (graphics, xmm [i], ymm [i]);
 	Graphics_setTextAlignment (graphics, Graphics_LEFT, Graphics_HALF);
-	Graphics_text (graphics, 0.0, 0.0, L"O");   /* Origin. */
+	Graphics_text (graphics, 0.0, 0.0, U"O");   // origin
 	Graphics_resetViewport (graphics, previous);
 }
 
diff --git a/artsynth/Art_Speaker_to_VocalTract.cpp b/artsynth/Art_Speaker_to_VocalTract.cpp
index f3c2b79..3ac3b86 100644
--- a/artsynth/Art_Speaker_to_VocalTract.cpp
+++ b/artsynth/Art_Speaker_to_VocalTract.cpp
@@ -1,6 +1,6 @@
 /* Art_Speaker_to_VocalTract.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,33 +22,23 @@
 #include "Art_Speaker_Delta.h"
 #include "Art_Speaker_to_VocalTract.h"
 
-VocalTract Art_Speaker_to_VocalTract (Art art, Speaker speaker)
-{
-	VocalTract thee = NULL;
-	long isection;
+VocalTract Art_Speaker_to_VocalTract (Art art, Speaker speaker) {
+	autoDelta delta = Speaker_to_Delta (speaker);
+	Art_Speaker_intoDelta (art, speaker, delta.get());
 	double area [300];
-	int numberOfSections;
-	double sectionLength = 0.001;   /* One millimetre. */
-	Delta delta = NULL;
-
-	delta = Speaker_to_Delta (speaker); if (! delta) goto end;
-	Art_Speaker_intoDelta (art, speaker, delta);
-	numberOfSections = 0;
-	for (isection = 1; isection <= 27; isection ++)
-	{
+	constexpr double sectionLength = 0.001;   // one millimetre
+	int numberOfSections = 0;
+	for (long isection = 1; isection <= 27; isection ++) {
 		Delta_Tube tube = delta -> tube + 37 + isection;
-		int numberOfConstantSections = floor (tube -> Dxeq / sectionLength + 0.5);
+		int numberOfConstantSections = lround (tube -> Dxeq / sectionLength);
 		double constantArea = tube -> Dyeq * tube -> Dzeq;
-		int jsection; for (jsection = 1; jsection <= numberOfConstantSections; jsection ++)
+		for (int jsection = 1; jsection <= numberOfConstantSections; jsection ++)
 			area [++ numberOfSections] = constantArea;
 	}
-	thee = VocalTract_create (numberOfSections, sectionLength); if (! thee) goto end;
-	for (isection = 1; isection <= numberOfSections; isection ++)
+	autoVocalTract thee = VocalTract_create (numberOfSections, sectionLength);
+	for (long isection = 1; isection <= numberOfSections; isection ++)
 		thy z [1] [isection] = area [isection];
-
-end:
-	forget (delta);
-	return thee;
+	return thee.transfer();
 }
 
 /* End of file Art_Speaker_to_VocalTract.cpp */
diff --git a/artsynth/Articulation.cpp b/artsynth/Articulation.cpp
index 38ee2d3..de9a7c1 100644
--- a/artsynth/Articulation.cpp
+++ b/artsynth/Articulation.cpp
@@ -43,9 +43,9 @@
 #include "enums_getValue.h"
 #include "Articulation_enums.h"
 
-Thing_implement (Art, Data, 0);
+Thing_implement (Art, Daata, 0);
 
-Art Art_create (void) {
+Art Art_create () {
 	return Thing_new (Art);
 }
 
diff --git a/artsynth/Articulation.h b/artsynth/Articulation.h
index 4cd041f..50d98a3 100644
--- a/artsynth/Articulation.h
+++ b/artsynth/Articulation.h
@@ -2,7 +2,7 @@
 #define _Articulation_h_
 /* Articulation.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,9 +28,9 @@
 #include "Articulation_enums.h"
 
 #include "Articulation_def.h"
-oo_CLASS_CREATE (Art, Data);
+oo_CLASS_CREATE (Art, Daata);
 
-Art Art_create (void);
+Art Art_create ();
 /*
 	Return value:
 		an array of double, with indices from enum Art.
diff --git a/artsynth/Articulation_def.h b/artsynth/Articulation_def.h
index 6e5f9a2..8847f01 100644
--- a/artsynth/Articulation_def.h
+++ b/artsynth/Articulation_def.h
@@ -1,6 +1,6 @@
 /* Articulation_def.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 
 #define ooSTRUCT Art
-oo_DEFINE_CLASS (Art, Data)
+oo_DEFINE_CLASS (Art, Daata)
 
 	oo_DOUBLE_SET (art, kArt_muscle)
 
diff --git a/artsynth/Articulation_enums.h b/artsynth/Articulation_enums.h
index 8b4271d..8a31290 100644
--- a/artsynth/Articulation_enums.h
+++ b/artsynth/Articulation_enums.h
@@ -1,6 +1,6 @@
 /* Articulation_enums.h
  *
- * Copyright (C) 1992-2009 Paul Boersma
+ * Copyright (C) 1992-2009,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,45 +18,45 @@
  */
 
 enums_begin (kArt_muscle, 0)
-	enums_add (kArt_muscle, 0, _, L"_")
-	enums_add (kArt_muscle, 1, LUNGS, L"Lungs")
+	enums_add (kArt_muscle, 0, _, U"_")
+	enums_add (kArt_muscle, 1, LUNGS, U"Lungs")
 
-	enums_add (kArt_muscle, 2, INTERARYTENOID, L"Interarytenoid")   // constriction of larynx; 0 = breathing, 1 = constricted glottis
-	enums_add (kArt_muscle, 3, CRICOTHYROID, L"Cricothyroid")   // vocal-cord tension
-	enums_add (kArt_muscle, 4, VOCALIS, L"Vocalis")   // vocal-cord tension
-	enums_add (kArt_muscle, 5, THYROARYTENOID, L"Thyroarytenoid")
-	enums_add (kArt_muscle, 6, POSTERIOR_CRICOARYTENOID, L"PosteriorCricoarytenoid")   // opening of glottis
-	enums_add (kArt_muscle, 7, LATERAL_CRICOARYTENOID, L"LateralCricoarytenoid")   // opening of glottis
+	enums_add (kArt_muscle, 2, INTERARYTENOID, U"Interarytenoid")   // constriction of larynx; 0 = breathing, 1 = constricted glottis
+	enums_add (kArt_muscle, 3, CRICOTHYROID, U"Cricothyroid")   // vocal-cord tension
+	enums_add (kArt_muscle, 4, VOCALIS, U"Vocalis")   // vocal-cord tension
+	enums_add (kArt_muscle, 5, THYROARYTENOID, U"Thyroarytenoid")
+	enums_add (kArt_muscle, 6, POSTERIOR_CRICOARYTENOID, U"PosteriorCricoarytenoid")   // opening of glottis
+	enums_add (kArt_muscle, 7, LATERAL_CRICOARYTENOID, U"LateralCricoarytenoid")   // opening of glottis
 
-	enums_add (kArt_muscle, 8, STYLOHYOID, L"Stylohyoid")   // up movement of hyoid bone
-	enums_add (kArt_muscle, 9, STERNOHYOID, L"Sternohyoid")   // down movement of hyoid bone
+	enums_add (kArt_muscle, 8, STYLOHYOID, U"Stylohyoid")   // up movement of hyoid bone
+	enums_add (kArt_muscle, 9, STERNOHYOID, U"Sternohyoid")   // down movement of hyoid bone
 
-	enums_add (kArt_muscle, 10, THYROPHARYNGEUS, L"Thyropharyngeus")   // constriction of ventricular folds
-	enums_add (kArt_muscle, 11, LOWER_CONSTRICTOR, L"LowerConstrictor")
-	enums_add (kArt_muscle, 12, MIDDLE_CONSTRICTOR, L"MiddleConstrictor")
-	enums_add (kArt_muscle, 13, UPPER_CONSTRICTOR, L"UpperConstrictor")
-	enums_add (kArt_muscle, 14, SPHINCTER, L"Sphincter")   // constriction of pharynx
+	enums_add (kArt_muscle, 10, THYROPHARYNGEUS, U"Thyropharyngeus")   // constriction of ventricular folds
+	enums_add (kArt_muscle, 11, LOWER_CONSTRICTOR, U"LowerConstrictor")
+	enums_add (kArt_muscle, 12, MIDDLE_CONSTRICTOR, U"MiddleConstrictor")
+	enums_add (kArt_muscle, 13, UPPER_CONSTRICTOR, U"UpperConstrictor")
+	enums_add (kArt_muscle, 14, SPHINCTER, U"Sphincter")   // constriction of pharynx
 
-	enums_add (kArt_muscle, 15, HYOGLOSSUS, L"Hyoglossus")   // down movement of tongue body
-	enums_add (kArt_muscle, 16, STYLOGLOSSUS, L"Styloglossus")   // up movement of tongue body
-	enums_add (kArt_muscle, 17, GENIOGLOSSUS, L"Genioglossus")   // forward movement of tongue body
+	enums_add (kArt_muscle, 15, HYOGLOSSUS, U"Hyoglossus")   // down movement of tongue body
+	enums_add (kArt_muscle, 16, STYLOGLOSSUS, U"Styloglossus")   // up movement of tongue body
+	enums_add (kArt_muscle, 17, GENIOGLOSSUS, U"Genioglossus")   // forward movement of tongue body
 
-	enums_add (kArt_muscle, 18, UPPER_TONGUE, L"UpperTongue")   // up curling of the tongue tip
-	enums_add (kArt_muscle, 19, LOWER_TONGUE, L"LowerTongue")   // down curling of the tongue
-	enums_add (kArt_muscle, 20, TRANSVERSE_TONGUE, L"TransverseTongue")   // thickening of tongue
-	enums_add (kArt_muscle, 21, VERTICAL_TONGUE, L"VerticalTongue")   // thinning of tongue
+	enums_add (kArt_muscle, 18, UPPER_TONGUE, U"UpperTongue")   // up curling of the tongue tip
+	enums_add (kArt_muscle, 19, LOWER_TONGUE, U"LowerTongue")   // down curling of the tongue
+	enums_add (kArt_muscle, 20, TRANSVERSE_TONGUE, U"TransverseTongue")   // thickening of tongue
+	enums_add (kArt_muscle, 21, VERTICAL_TONGUE, U"VerticalTongue")   // thinning of tongue
 
-	enums_add (kArt_muscle, 22, RISORIUS, L"Risorius")   // spreading of lips
-	enums_add (kArt_muscle, 23, ORBICULARIS_ORIS, L"OrbicularisOris")   // rounding of lips
+	enums_add (kArt_muscle, 22, RISORIUS, U"Risorius")   // spreading of lips
+	enums_add (kArt_muscle, 23, ORBICULARIS_ORIS, U"OrbicularisOris")   // rounding of lips
 
-	enums_add (kArt_muscle, 24, LEVATOR_PALATINI, L"LevatorPalatini")   // closing of velo-pharyngeal port; 0 = open ("nasal"), 1 = closed ("oral")
-	enums_add (kArt_muscle, 25, TENSOR_PALATINI, L"TensorPalatini")
+	enums_add (kArt_muscle, 24, LEVATOR_PALATINI, U"LevatorPalatini")   // closing of velo-pharyngeal port; 0 = open ("nasal"), 1 = closed ("oral")
+	enums_add (kArt_muscle, 25, TENSOR_PALATINI, U"TensorPalatini")
 
-	enums_add (kArt_muscle, 26, MASSETER, L"Masseter")   // closing of jaw; 0 = open, 1 = closed
-	enums_add (kArt_muscle, 27, MYLOHYOID, L"Mylohyoid")   // opening of jaw
-	enums_add (kArt_muscle, 28, LATERAL_PTERYGOID, L"LateralPterygoid")   // horizontal jaw position
+	enums_add (kArt_muscle, 26, MASSETER, U"Masseter")   // closing of jaw; 0 = open, 1 = closed
+	enums_add (kArt_muscle, 27, MYLOHYOID, U"Mylohyoid")   // opening of jaw
+	enums_add (kArt_muscle, 28, LATERAL_PTERYGOID, U"LateralPterygoid")   // horizontal jaw position
 
-	enums_add (kArt_muscle, 29, BUCCINATOR, L"Buccinator")   // oral wall tension
+	enums_add (kArt_muscle, 29, BUCCINATOR, U"Buccinator")   // oral wall tension
 enums_end (kArt_muscle, 29, LUNGS)
 
 /* End of file Articulation.enums */
diff --git a/artsynth/Artword.cpp b/artsynth/Artword.cpp
index 8162184..64a1416 100644
--- a/artsynth/Artword.cpp
+++ b/artsynth/Artword.cpp
@@ -1,6 +1,6 @@
 /* Artword.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,14 +38,13 @@
 #include "oo_DESCRIPTION.h"
 #include "Artword_def.h"
 
-Thing_implement (Artword, Data, 0);
+Thing_implement (Artword, Daata, 0);
 
-Artword Artword_create (double totalTime) {
-	Artword me = Thing_new (Artword);
-	if (! me) return NULL;
+autoArtword Artword_create (double totalTime) {
+	autoArtword me = Thing_new (Artword);
 	my totalTime = totalTime;
 	for (int i = 1; i <= kArt_muscle_MAX; i ++)
-		Artword_setDefault (me, i);
+		Artword_setDefault (me.get(), i);
 	return me;
 }
 
@@ -85,7 +84,7 @@ void Artword_setTarget (Artword me, int feature, double time, double target) {
 		f -> targets [insert] = target;
 		f -> times [insert] = time;
 	} catch (MelderError) {
-		Melder_throw (me, ": target not set.");
+		Melder_throw (me, U": target not set.");
 	}
 }
 
@@ -114,8 +113,7 @@ void Artword_removeTarget (Artword me, int feature, int iTarget) {
 	else if (iTarget == f -> numberOfTargets)
 		f -> targets [f -> numberOfTargets] = 0.0;
 	else {
-		int i;
-		for (i = iTarget; i < f -> numberOfTargets; i ++) {
+		for (int i = iTarget; i < f -> numberOfTargets; i ++) {
 			f -> times [i] = f -> times [i + 1];
 			f -> targets [i] = f -> targets [i + 1];
 		}
@@ -136,7 +134,7 @@ void Artword_draw (Artword me, Graphics g, int feature, int garnish) {
 		autoNUMvector <double> x (1, numberOfTargets);
 		autoNUMvector <double> y (1, numberOfTargets);
 		Graphics_setInner (g);
-		Graphics_setWindow (g, 0, my totalTime, -1, 1);
+		Graphics_setWindow (g, 0, my totalTime, -1.0, 1.0);
 		for (int i = 1; i <= numberOfTargets; i ++) {
 			x [i] = my data [feature]. times [i];
 			y [i] = my data [feature]. targets [i];
@@ -147,10 +145,10 @@ void Artword_draw (Artword me, Graphics g, int feature, int garnish) {
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, TRUE, TRUE, FALSE);
-		Graphics_marksLeft (g, 3, TRUE, TRUE, TRUE);
-		Graphics_textTop (g, FALSE, kArt_muscle_getText (feature));
-		Graphics_textBottom (g, TRUE, L"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 3, true, true, true);
+		Graphics_textTop (g, false, kArt_muscle_getText (feature));
+		Graphics_textBottom (g, true, U"Time (s)");
 	}
 }
 
diff --git a/artsynth/Artword.h b/artsynth/Artword.h
index 431c0c2..458113e 100644
--- a/artsynth/Artword.h
+++ b/artsynth/Artword.h
@@ -2,7 +2,7 @@
 #define _Artword_h_
 /* Artword.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,9 +23,9 @@
 #include "Graphics.h"
 
 #include "Artword_def.h"
-oo_CLASS_CREATE (Artword, Data);
+oo_CLASS_CREATE (Artword, Daata);
 
-Artword Artword_create (double totalTime);
+autoArtword Artword_create (double totalTime);
 
 void Artword_setDefault (Artword me, int feature);
 /*
@@ -49,7 +49,7 @@ void Artword_removeTarget (Artword me, int feature, int iTarget);
 		If "iTarget" is the first or the last target in the list,
 		only set the target to zero (begin and end targets remain).
 	Preconditions:
-		self != NULL;
+		self != nullptr;
 		feature in enum Art_MUSCLE;
 		iTarget >= 1;
 		iTarget <= self -> data [feature]. numberOfTargets;
@@ -78,8 +78,8 @@ void Artword_intoArt (Artword me, Art art, double tim);
 	Function:
 		Linear interpolation between targets, into an existing Art.
 	Preconditions:
-		me != NULL;
-		art != NULL;
+		me != nullptr;
+		art != nullptr;
 */
 	
 void Artword_draw (Artword me, Graphics graphics, int feature, int garnish);
diff --git a/artsynth/ArtwordEditor.cpp b/artsynth/ArtwordEditor.cpp
index a4e0be4..9668aca 100644
--- a/artsynth/ArtwordEditor.cpp
+++ b/artsynth/ArtwordEditor.cpp
@@ -1,6 +1,6 @@
 /* ArtwordEditor.cpp
  *
- * Copyright (C) 1992-2011,2013 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,12 +30,11 @@ void structArtwordEditor :: v_destroy () {
 static void updateList (ArtwordEditor me) {
 	Artword artword = (Artword) my data;
 	ArtwordData a = & artword -> data [my feature];
-	my list -> f_deleteAllItems ();
+	GuiList_deleteAllItems (my list);
 	for (int i = 1; i <= a -> numberOfTargets; i ++) {
-		static MelderString itemText = { 0 };
-		MelderString_empty (& itemText);
-		MelderString_append (& itemText, Melder_single (a -> times [i]), L"  ", Melder_single (a -> targets [i]));
-		my list -> f_insertItem (itemText.string, i);
+		GuiList_insertItem (my list,
+			Melder_cat (Melder_single (a -> times [i]), U"  ", Melder_single (a -> targets [i])),
+			i);
 	}
 	Graphics_updateWs (my graphics);
 }
@@ -44,23 +43,24 @@ static void gui_button_cb_removeTarget (I, GuiButtonEvent event) {
 	(void) event;
 	iam (ArtwordEditor);
 	Artword artword = (Artword) my data;
-	long numberOfSelectedPositions, *selectedPositions = my list -> f_getSelectedPositions (& numberOfSelectedPositions);   // BUG memory
-	if (selectedPositions != NULL) {
+	long numberOfSelectedPositions;
+	long *selectedPositions = GuiList_getSelectedPositions (my list, & numberOfSelectedPositions);   // BUG memory
+	if (selectedPositions) {
 		for (long ipos = numberOfSelectedPositions; ipos > 0; ipos --)
 			Artword_removeTarget (artword, my feature, selectedPositions [ipos]);
 	}
 	NUMvector_free <long> (selectedPositions, 1);
 	updateList (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void gui_button_cb_addTarget (I, GuiButtonEvent event) {
 	(void) event;
 	iam (ArtwordEditor);
 	Artword artword = (Artword) my data;
-	wchar_t *timeText = my time -> f_getString ();
+	char32 *timeText = GuiText_getString (my time);
 	double tim = Melder_atof (timeText);
-	wchar_t *valueText = my value -> f_getString ();
+	char32 *valueText = GuiText_getString (my value);
 	double value = Melder_atof (valueText);
 	ArtwordData a = & artword -> data [my feature];
 	int i = 1, oldCount = a -> numberOfTargets;
@@ -76,16 +76,14 @@ static void gui_button_cb_addTarget (I, GuiButtonEvent event) {
 		i ++;
 		Melder_assert (i <= a -> numberOfTargets);   // can fail if tim is in an extended precision register
 	}
-	static MelderString itemText = { 0 };
-	MelderString_empty (& itemText);
-	MelderString_append (& itemText, Melder_single (tim), L"  ", Melder_single (value));
+	const char32 *itemText = Melder_cat (Melder_single (tim), U"  ", Melder_single (value));
 	if (a -> numberOfTargets == oldCount) {
-		my list -> f_replaceItem (itemText.string, i);
+		GuiList_replaceItem (my list, itemText, i);
 	} else {
-		my list -> f_insertItem (itemText.string, i);
+		GuiList_insertItem (my list, itemText, i);
 	}
 	Graphics_updateWs (my graphics);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void gui_radiobutton_cb_toggle (I, GuiRadioButtonEvent event) {
@@ -96,26 +94,25 @@ static void gui_radiobutton_cb_toggle (I, GuiRadioButtonEvent event) {
 	updateList (me);
 }
 
-static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
+static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent /* event */) {
 	iam (ArtwordEditor);
-	(void) event;
-	if (my graphics == NULL) return;
+	if (! my graphics) return;
 	Artword artword = (Artword) my data;
 	Graphics_clearWs (my graphics);
-	Artword_draw (artword, my graphics, my feature, TRUE);
+	Artword_draw (artword, my graphics, my feature, true);
 }
 
 static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 	iam (ArtwordEditor);
-	if (my graphics == NULL) return;
+	if (! my graphics) return;
 	Artword artword = (Artword) my data;
 	Graphics_setWindow (my graphics, 0, artword -> totalTime, -1.0, 1.0);
 	Graphics_setInner (my graphics);
 	double xWC, yWC;
 	Graphics_DCtoWC (my graphics, event -> x, event -> y, & xWC, & yWC);
 	Graphics_unsetInner (my graphics);
-	my time  -> f_setString (Melder_fixed (xWC, 6));
-	my value -> f_setString (Melder_fixed (yWC, 6));
+	GuiText_setString (my time,  Melder_fixed (xWC, 6));
+	GuiText_setString (my value, Melder_fixed (yWC, 6));
 }
 
 void structArtwordEditor :: v_dataChanged () {
@@ -125,23 +122,23 @@ void structArtwordEditor :: v_dataChanged () {
 
 void structArtwordEditor :: v_createChildren () {
 	int dy = Machine_getMenuBarHeight ();
-	GuiLabel_createShown (d_windowForm, 40, 100, dy + 3, dy + 3 + Gui_LABEL_HEIGHT, L"Targets:", 0);
-	GuiLabel_createShown (d_windowForm, 5, 65, dy + 20, dy + 20 + Gui_LABEL_HEIGHT, L"Times:", 0);
-	GuiLabel_createShown (d_windowForm, 80, 140, dy + 20, dy + 20 + Gui_LABEL_HEIGHT, L"Values:", 0);
-	list = GuiList_createShown (d_windowForm, 0, 140, dy + 40, dy + 340, true, NULL);
+	GuiLabel_createShown (d_windowForm, 40, 100, dy + 3, dy + 3 + Gui_LABEL_HEIGHT, U"Targets:", 0);
+	GuiLabel_createShown (d_windowForm, 5, 65, dy + 20, dy + 20 + Gui_LABEL_HEIGHT, U"Times:", 0);
+	GuiLabel_createShown (d_windowForm, 80, 140, dy + 20, dy + 20 + Gui_LABEL_HEIGHT, U"Values:", 0);
+	list = GuiList_createShown (d_windowForm, 0, 140, dy + 40, dy + 340, true, nullptr);
 
-	GuiButton_createShown (d_windowForm, 10, 130, dy + 410, dy + 410 + Gui_PUSHBUTTON_HEIGHT, L"Remove target", gui_button_cb_removeTarget, this, 0);
+	GuiButton_createShown (d_windowForm, 10, 130, dy + 410, dy + 410 + Gui_PUSHBUTTON_HEIGHT, U"Remove target", gui_button_cb_removeTarget, this, 0);
 
 	drawingArea = GuiDrawingArea_createShown (d_windowForm, 170, 470, dy + 10, dy + 310,
-		gui_drawingarea_cb_expose, gui_drawingarea_cb_click, NULL, NULL, this, 0);
+		gui_drawingarea_cb_expose, gui_drawingarea_cb_click, nullptr, nullptr, this, 0);
 
-	GuiLabel_createShown (d_windowForm, 220, 270, dy + 340, dy + 340 + Gui_LABEL_HEIGHT, L"Time:", 0);
+	GuiLabel_createShown (d_windowForm, 220, 270, dy + 340, dy + 340 + Gui_LABEL_HEIGHT, U"Time:", 0);
 	time = GuiText_createShown (d_windowForm, 270, 370, dy + 340, dy + 340 + Gui_TEXTFIELD_HEIGHT, 0);
 
-	GuiLabel_createShown (d_windowForm, 220, 270, dy + 370, dy + 370 + Gui_LABEL_HEIGHT, L"Value:", 0);
+	GuiLabel_createShown (d_windowForm, 220, 270, dy + 370, dy + 370 + Gui_LABEL_HEIGHT, U"Value:", 0);
 	value = GuiText_createShown (d_windowForm, 270, 370, dy + 370, dy + 370 + Gui_TEXTFIELD_HEIGHT, 0);
 
-	GuiButton_createShown (d_windowForm, 240, 360, dy + 410, dy + 410 + Gui_PUSHBUTTON_HEIGHT, L"Add target", gui_button_cb_addTarget, this, GuiButton_DEFAULT);
+	GuiButton_createShown (d_windowForm, 240, 360, dy + 410, dy + 410 + Gui_PUSHBUTTON_HEIGHT, U"Add target", gui_button_cb_addTarget, this, GuiButton_DEFAULT);
 
 	dy = Machine_getMenuBarHeight ();
 	GuiRadioGroup_begin ();
@@ -153,19 +150,19 @@ void structArtwordEditor :: v_createChildren () {
 	}
 	GuiRadioGroup_end ();
 	feature = 1;
-	button [feature] -> f_set ();
+	GuiRadioButton_set (button [feature]);
 }
 
-ArtwordEditor ArtwordEditor_create (const wchar_t *title, Artword data) {
+autoArtwordEditor ArtwordEditor_create (const char32 *title, Artword data) {
 	try {
 		autoArtwordEditor me = Thing_new (ArtwordEditor);
 		Editor_init (me.peek(), 20, 40, 650, 600, title, data);
 		//XtUnmanageChild (my menuBar);
 		my graphics = Graphics_create_xmdrawingarea (my drawingArea);
 		updateList (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Artword window not created.");
+		Melder_throw (U"Artword window not created.");
 	}
 }
 
diff --git a/artsynth/ArtwordEditor.h b/artsynth/ArtwordEditor.h
index 70fdeff..8a2134e 100644
--- a/artsynth/ArtwordEditor.h
+++ b/artsynth/ArtwordEditor.h
@@ -2,7 +2,7 @@
 #define _ArtwordEditor_h_
 /* ArtwordEditor.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,21 +23,22 @@
 #include "Artword.h"
 
 Thing_define (ArtwordEditor, Editor) {
-	// new data:
-	public:
-		Graphics graphics;
-		int feature;
-		GuiList list;
-		GuiDrawingArea drawingArea;
-		GuiText time, value;
-		GuiRadioButton button [1 + kArt_muscle_MAX];
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_createChildren ();
-		virtual void v_dataChanged ();
+	Graphics graphics;
+	int feature;
+	GuiList list;
+	GuiDrawingArea drawingArea;
+	GuiText time, value;
+	GuiRadioButton button [1 + kArt_muscle_MAX];
+
+	void v_destroy ()
+		override;
+	void v_createChildren ()
+		override;
+	void v_dataChanged ()
+		override;
 };
 
-ArtwordEditor ArtwordEditor_create (const wchar_t *title, Artword data);
+autoArtwordEditor ArtwordEditor_create (const char32 *title, Artword data);
 
 /* End of file ArtwordEditor.h */
 #endif
diff --git a/artsynth/Artword_Speaker_Sound.cpp b/artsynth/Artword_Speaker_Sound.cpp
index 100d8a2..dca99bf 100644
--- a/artsynth/Artword_Speaker_Sound.cpp
+++ b/artsynth/Artword_Speaker_Sound.cpp
@@ -1,6 +1,6 @@
 /* Artword_Speaker_Sound.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,12 +27,9 @@ struct playInfo {
 	Graphics graphics;
 };
 
-static int playCallback (void *playClosure, int phase, double tmin, double tmax, double t) {
+static int playCallback (void *playClosure, int /* phase */, double /* tmin */, double /* tmax */, double t) {
 	struct playInfo *me = (struct playInfo *) playClosure;
 	static Art art;
-	(void) phase;
-	(void) tmin;
-	(void) tmax;
 	if (! art) art = Art_create ();
 	Artword_intoArt (my artword, art, t);
 	Graphics_clearWs (my graphics);
@@ -46,10 +43,10 @@ void Artword_Speaker_Sound_movie (Artword artword, Speaker speaker, Sound sound,
 		info. artword = artword;
 		info. speaker = speaker;
 		info. graphics = graphics;
-		autoSound mySound = sound ? NULL : Sound_createSimple (1, artword -> totalTime, 44100);
+		autoSound mySound = sound ? nullptr : Sound_createSimple (1, artword -> totalTime, 44100);
 		Sound_play (sound ? sound : mySound.peek(), playCallback, & info);
 	} catch (MelderError) {
-		Melder_throw (artword, " & ", speaker, ": movie not played.");
+		Melder_throw (artword, U" & ", speaker, U": movie not played.");
 	}
 }
 
diff --git a/artsynth/Artword_Speaker_to_Sound.cpp b/artsynth/Artword_Speaker_to_Sound.cpp
index 4042789..4c5c97a 100644
--- a/artsynth/Artword_Speaker_to_Sound.cpp
+++ b/artsynth/Artword_Speaker_to_Sound.cpp
@@ -1,6 +1,6 @@
 /* Artword_Speaker_to_Sound.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,70 +38,71 @@
 #define MASS_LEAPFROG  0
 #define B91 0
 
-Sound Artword_Speaker_to_Sound (Artword artword, Speaker speaker,
+autoSound Artword_Speaker_to_Sound (Artword artword, Speaker speaker,
 	double fsamp, int oversampling,
-	Sound *out_w1, int iw1, Sound *out_w2, int iw2, Sound *out_w3, int iw3,
-	Sound *out_p1, int ip1, Sound *out_p2, int ip2, Sound *out_p3, int ip3,
-	Sound *out_v1, int iv1, Sound *out_v2, int iv2, Sound *out_v3, int iv3)
+	autoSound *out_w1, int iw1, autoSound *out_w2, int iw2, autoSound *out_w3, int iw3,
+	autoSound *out_p1, int ip1, autoSound *out_p2, int ip2, autoSound *out_p3, int ip3,
+	autoSound *out_v1, int iv1, autoSound *out_v2, int iv2, autoSound *out_v3, int iv3)
 {
 	try {
 		autoSound result = Sound_createSimple (1, artword -> totalTime, fsamp);
 		long numberOfSamples = result -> nx;
-		double minTract [1+78], maxTract [1+78];   /* For drawing. */
-		double Dt = 1 / fsamp / oversampling,
+		double minTract [1+78], maxTract [1+78];   // for drawing
+		double Dt = 1.0 / fsamp / oversampling,
 			rho0 = 1.14,
-			c = 353,
+			c = 353.0,
 			onebyc2 = 1.0 / (c * c),
 			rho0c2 = rho0 * c * c,
 			halfDt = 0.5 * Dt,
-			twoDt = 2 * Dt,
+			twoDt = 2.0 * Dt,
 			halfc2Dt = 0.5 * c * c * Dt,
-			twoc2Dt = 2 * c * c * Dt,
+			twoc2Dt = 2.0 * c * c * Dt,
 			onebytworho0 = 1.0 / (2.0 * rho0),
 			Dtbytworho0 = Dt / (2.0 * rho0);
 		double tension, rrad, onebygrad, totalVolume;
 		autoArt art = Art_create ();
-		long sample;
-		int n, m, M;
 		autoDelta delta = Speaker_to_Delta (speaker);
-		autoMelderMonitor monitor (L"Articulatory synthesis");
+		autoMelderMonitor monitor (U"Articulatory synthesis");
 		Artword_intoArt (artword, art.peek(), 0.0);
 		Art_Speaker_intoDelta (art.peek(), speaker, delta.peek());
-		M = delta -> numberOfTubes;
+		int M = delta -> numberOfTubes;
 		autoSound w1, w2, w3, p1, p2, p3, v1, v2, v3;
-		if (iw1 > 0 && iw1 <= M) w1.reset (Sound_createSimple (1, artword -> totalTime, fsamp)); else iw1 = 0;
-		if (iw2 > 0 && iw2 <= M) w2.reset (Sound_createSimple (1, artword -> totalTime, fsamp)); else iw2 = 0;
-		if (iw3 > 0 && iw3 <= M) w3.reset (Sound_createSimple (1, artword -> totalTime, fsamp)); else iw3 = 0;
-		if (ip1 > 0 && ip1 <= M) p1.reset (Sound_createSimple (1, artword -> totalTime, fsamp)); else ip1 = 0;
-		if (ip2 > 0 && ip2 <= M) p2.reset (Sound_createSimple (1, artword -> totalTime, fsamp)); else ip2 = 0;
-		if (ip3 > 0 && ip3 <= M) p3.reset (Sound_createSimple (1, artword -> totalTime, fsamp)); else ip3 = 0;
-		if (iv1 > 0 && iv1 <= M) v1.reset (Sound_createSimple (1, artword -> totalTime, fsamp)); else iv1 = 0;
-		if (iv2 > 0 && iv2 <= M) v2.reset (Sound_createSimple (1, artword -> totalTime, fsamp)); else iv2 = 0;
-		if (iv3 > 0 && iv3 <= M) v3.reset (Sound_createSimple (1, artword -> totalTime, fsamp)); else iv3 = 0;
+		if (iw1 > 0 && iw1 <= M) w1 = Sound_createSimple (1, artword -> totalTime, fsamp); else iw1 = 0;
+		if (iw2 > 0 && iw2 <= M) w2 = Sound_createSimple (1, artword -> totalTime, fsamp); else iw2 = 0;
+		if (iw3 > 0 && iw3 <= M) w3 = Sound_createSimple (1, artword -> totalTime, fsamp); else iw3 = 0;
+		if (ip1 > 0 && ip1 <= M) p1 = Sound_createSimple (1, artword -> totalTime, fsamp); else ip1 = 0;
+		if (ip2 > 0 && ip2 <= M) p2 = Sound_createSimple (1, artword -> totalTime, fsamp); else ip2 = 0;
+		if (ip3 > 0 && ip3 <= M) p3 = Sound_createSimple (1, artword -> totalTime, fsamp); else ip3 = 0;
+		if (iv1 > 0 && iv1 <= M) v1 = Sound_createSimple (1, artword -> totalTime, fsamp); else iv1 = 0;
+		if (iv2 > 0 && iv2 <= M) v2 = Sound_createSimple (1, artword -> totalTime, fsamp); else iv2 = 0;
+		if (iv3 > 0 && iv3 <= M) v3 = Sound_createSimple (1, artword -> totalTime, fsamp); else iv3 = 0;
 		/* Initialize drawing. */
-		{ int i; for (i = 1; i <= 78; i ++) { minTract [i] = 100; maxTract [i] = -100; } }
+		for (int i = 1; i <= 78; i ++) {
+			minTract [i] = 100.0;
+			maxTract [i] = -100.0;
+		}
 		totalVolume = 0.0;
-		for (m = 1; m <= M; m ++) {
+		for (int m = 1; m <= M; m ++) {
 			Delta_Tube t = delta->tube + m;
 			if (! t -> left1 && ! t -> right1) continue;
-			t->Dx = t->Dxeq; t->dDxdt = 0;   /* 5.113 */
-			t->Dy = t->Dyeq; t->dDydt = 0;   /* 5.113 */
-			t->Dz = t->Dzeq;   /* 5.113 */
+			t->Dx = t->Dxeq; t->dDxdt = 0.0;   // 5.113 (numbers refer to equations in Boersma (1998)
+			t->Dy = t->Dyeq; t->dDydt = 0.0;   // 5.113
+			t->Dz = t->Dzeq;   // 5.113
 			t->A = t->Dz * ( t->Dy >= t->dy ? t->Dy + Dymin :
 				t->Dy <= - t->dy ? Dymin :
-				(t->dy + t->Dy) * (t->dy + t->Dy) / (4 * t->dy) + Dymin );   /* 4.4, 4.5 */
+				(t->dy + t->Dy) * (t->dy + t->Dy) / (4.0 * t->dy) + Dymin );   // 4.4, 4.5
 			#if EQUAL_TUBE_WIDTHS
 				t->A = 0.0001;
 			#endif
-			t->Jleft = t->Jright = 0;   /* 5.113 */
-			t->Qleft = t->Qright = rho0c2;   /* 5.113 */
-			t->pleft = t->pright = 0;   /* 5.114 */
-			t->Kleft = t->Kright = 0;   /* 5.114 */
-			t->V = t->A * t->Dx;   /* 5.114 */
+			t->Jleft = t->Jright = 0.0;   // 5.113
+			t->Qleft = t->Qright = rho0c2;   // 5.113
+			t->pleft = t->pright = 0.0;   // 5.114
+			t->Kleft = t->Kright = 0.0;   // 5.114
+			t->V = t->A * t->Dx;   // 5.114
 			totalVolume += t->V;
 		}
-		//Melder_casual ("Starting volume: %.10g litres.", totalVolume * 1000);
-		for (sample = 1; sample <= numberOfSamples; sample ++) {
+		//Melder_casual (U"Starting volume: ", totalVolume * 1000, U" litres.");
+		for (long sample = 1; sample <= numberOfSamples; sample ++) {
 			double time = (sample - 1) / fsamp;
 			Artword_intoArt (artword, art.peek(), time);
 			Art_Speaker_intoDelta (art.peek(), speaker, delta.peek());
@@ -116,55 +117,55 @@ Sound Artword_Speaker_to_Sound (Artword artword, Speaker speaker,
 				}
 				Graphics_clearWs (graphics);
 
-				vp = Graphics_insetViewport (monitor.graphics(), 0, 0.5, 0.5, 1);
-				Graphics_setWindow (graphics, 0, 1, 0, 0.05);
+				vp = Graphics_insetViewport (monitor.graphics(), 0.0, 0.5, 0.5, 1.0);
+				Graphics_setWindow (graphics, 0.0, 1.0, 0.0, 0.05);
 				Graphics_setColour (graphics, Graphics_RED);
-				Graphics_function (graphics, minTract, 1, 35, 0, 0.9);
-				Graphics_function (graphics, maxTract, 1, 35, 0, 0.9);
+				Graphics_function (graphics, minTract, 1, 35, 0.0, 0.9);
+				Graphics_function (graphics, maxTract, 1, 35, 0.0, 0.9);
 				Graphics_setColour (graphics, Graphics_BLACK);
-				Graphics_function (graphics, area, 1, 35, 0, 0.9);
+				Graphics_function (graphics, area, 1, 35, 0.0, 0.9);
 				Graphics_setLineType (graphics, Graphics_DOTTED);
-				Graphics_line (graphics, 0, 0, 1, 0);
+				Graphics_line (graphics, 0.0, 0.0, 1.0, 0.0);
 				Graphics_setLineType (graphics, Graphics_DRAWN);
 				Graphics_resetViewport (graphics, vp);
 
 				vp = Graphics_insetViewport (graphics, 0, 0.5, 0, 0.5);
-				Graphics_setWindow (graphics, 0, 1, -0.000003, 0.00001);
+				Graphics_setWindow (graphics, 0.0, 1.0, -0.000003, 0.00001);
 				Graphics_setColour (graphics, Graphics_RED);
 				Graphics_function (graphics, minTract, 36, 37, 0.2, 0.8);
 				Graphics_function (graphics, maxTract, 36, 37, 0.2, 0.8);
 				Graphics_setColour (graphics, Graphics_BLACK);
 				Graphics_function (graphics, area, 36, 37, 0.2, 0.8);
 				Graphics_setLineType (graphics, Graphics_DOTTED);
-				Graphics_line (graphics, 0, 0, 1, 0);
+				Graphics_line (graphics, 0.0, 0.0, 1.0, 0.0);
 				Graphics_setLineType (graphics, Graphics_DRAWN);
 				Graphics_resetViewport (graphics, vp);
 
-				vp = Graphics_insetViewport (graphics, 0.5, 1, 0.5, 1);
-				Graphics_setWindow (graphics, 0, 1, 0, 0.001);
+				vp = Graphics_insetViewport (graphics, 0.5, 1.0, 0.5, 1.0);
+				Graphics_setWindow (graphics, 0.0, 1.0, 0.0, 0.001);
 				Graphics_setColour (graphics, Graphics_RED);
-				Graphics_function (graphics, minTract, 38, 64, 0, 1);
-				Graphics_function (graphics, maxTract, 38, 64, 0, 1);
+				Graphics_function (graphics, minTract, 38, 64, 0.0, 1.0);
+				Graphics_function (graphics, maxTract, 38, 64, 0.0, 1.0);
 				Graphics_setColour (graphics, Graphics_BLACK);
-				Graphics_function (graphics, area, 38, 64, 0, 1);
+				Graphics_function (graphics, area, 38, 64, 0.0, 1.0);
 				Graphics_setLineType (graphics, Graphics_DOTTED);
-				Graphics_line (graphics, 0, 0, 1, 0);
+				Graphics_line (graphics, 0.0, 0.0, 1.0, 0.0);
 				Graphics_setLineType (graphics, Graphics_DRAWN);
 				Graphics_resetViewport (graphics, vp);
 
-				vp = Graphics_insetViewport (graphics, 0.5, 1, 0, 0.5);
-				Graphics_setWindow (graphics, 0, 1, 0.001, 0);
+				vp = Graphics_insetViewport (graphics, 0.5, 1.0, 0.0, 0.5);
+				Graphics_setWindow (graphics, 0.0, 1.0, 0.001, 0.0);
 				Graphics_setColour (graphics, Graphics_RED);
-				Graphics_function (graphics, minTract, 65, 78, 0.5, 1);
-				Graphics_function (graphics, maxTract, 65, 78, 0.5, 1);
+				Graphics_function (graphics, minTract, 65, 78, 0.5, 1.0);
+				Graphics_function (graphics, maxTract, 65, 78, 0.5, 1.0);
 				Graphics_setColour (graphics, Graphics_BLACK);
-				Graphics_function (graphics, area, 65, 78, 0.5, 1);
+				Graphics_function (graphics, area, 65, 78, 0.5, 1.0);
 				Graphics_setLineType (graphics, Graphics_DRAWN);
 				Graphics_resetViewport (graphics, vp);
-				Melder_monitor ((double) sample / numberOfSamples, L"Articulatory synthesis: ", Melder_half (time), L" seconds");
+				Melder_monitor ((double) sample / numberOfSamples, U"Articulatory synthesis: ", Melder_half (time), U" seconds");
 			}
-			for (n = 1; n <= oversampling; n ++) {
-				for (m = 1; m <= M; m ++) {
+			for (int n = 1; n <= oversampling; n ++) {
+				for (int m = 1; m <= M; m ++) {
 					Delta_Tube t = delta -> tube + m;
 					if (! t -> left1 && ! t -> right1) continue;
 
@@ -173,189 +174,189 @@ Sound Artword_Speaker_to_Sound (Artword artword, Speaker speaker,
 					#if CONSTANT_TUBE_LENGTHS
 						t->Dxnew = t->Dx;
 					#else
-						t->dDxdtnew = (t->dDxdt + Dt * 10000 * (t->Dxeq - t->Dx)) /
-							(1 + 200 * Dt);   /* Critical damping, 10 ms. */
+						t->dDxdtnew = (t->dDxdt + Dt * 10000.0 * (t->Dxeq - t->Dx)) /
+							(1.0 + 200.0 * Dt);   // critical damping, 10 ms
 						t->Dxnew = t->Dx + t->dDxdtnew * Dt;
 					#endif
 					/* 3-way: equal lengths. */
 					/* This requires left tubes to be processed before right tubes. */
 					if (t->left1 && t->left1->right2) t->Dxnew = t->left1->Dxnew;
 					t->Dz = t->Dzeq;   /* immediate... */
-					t->eleft = (t->Qleft - t->Kleft) * t->V;   /* 5.115 */
-					t->eright = (t->Qright - t->Kright) * t->V;   /* 5.115 */
-					t->e = 0.5 * (t->eleft + t->eright);   /* 5.116 */
-					t->p = 0.5 * (t->pleft + t->pright);   /* 5.116 */
-					t->DeltaP = t->e / t->V - rho0c2;   /* 5.117 */
-					t->v = t->p / (rho0 + onebyc2 * t->DeltaP);   /* 5.118 */
+					t->eleft = (t->Qleft - t->Kleft) * t->V;   // 5.115
+					t->eright = (t->Qright - t->Kright) * t->V;   // 5.115
+					t->e = 0.5 * (t->eleft + t->eright);   // 5.116
+					t->p = 0.5 * (t->pleft + t->pright);   // 5.116
+					t->DeltaP = t->e / t->V - rho0c2;   // 5.117
+					t->v = t->p / (rho0 + onebyc2 * t->DeltaP);   // 5.118
 					{
 						double dDy = t->Dyeq - t->Dy;
 						double cubic = t->k3 * dDy * dDy;
 						Delta_Tube l1 = t->left1, l2 = t->left2, r1 = t->right1, r2 = t->right2;
 						tension = dDy * (t->k1 + cubic);
-						t->B = 2 * t->Brel * sqrt (t->mass * (t->k1 + 3 * cubic));
-						if (t->k1left1 && l1)
+						t->B = 2.0 * t->Brel * sqrt (t->mass * (t->k1 + 3.0 * cubic));
+						if (t->k1left1 != 0.0 && l1)
 							tension += t->k1left1 * t->k1 * (dDy - (l1->Dyeq - l1->Dy));
-						if (t->k1left2 && l2)
+						if (t->k1left2 != 0.0 && l2)
 							tension += t->k1left2 * t->k1 * (dDy - (l2->Dyeq - l2->Dy));
-						if (t->k1right1 && r1)
+						if (t->k1right1 != 0.0 && r1)
 							tension += t->k1right1 * t->k1 * (dDy - (r1->Dyeq - r1->Dy));
-						if (t->k1right2 && r2)
+						if (t->k1right2 != 0.0 && r2)
 							tension += t->k1right2 * t->k1 * (dDy - (r2->Dyeq - r2->Dy));
 					}
 					if (t->Dy < t->dy) {
 						if (t->Dy >= - t->dy) {
 							double dDy = t->dy - t->Dy, dDy2 = dDy * dDy;
-							tension += dDy2 / (4 * t->dy) * (t->s1 + 0.5 * t->s3 * dDy2);
-							t->B += 2 * dDy / (2 * t->dy) *
+							tension += dDy2 / (4.0 * t->dy) * (t->s1 + 0.5 * t->s3 * dDy2);
+							t->B += 2.0 * dDy / (2.0 * t->dy) *
 								sqrt (t->mass * (t->s1 + t->s3 * dDy2));
 						} else {
 							tension -= t->Dy * (t->s1 + t->s3 * (t->Dy * t->Dy + t->dy * t->dy));
-							t->B += 2 * sqrt (t->mass * (t->s1 + t->s3 * (3 * t->Dy * t->Dy + t->dy * t->dy)));
+							t->B += 2.0 * sqrt (t->mass * (t->s1 + t->s3 * (3.0 * t->Dy * t->Dy + t->dy * t->dy)));
 						}
 					}
-					t->dDydtnew = (t->dDydt + Dt / t->mass * (tension + 2 * t->DeltaP * t->Dz * t->Dx)) /
-						(1 + t->B * Dt / t->mass);   /* 5.119 */
-					t->Dynew = t->Dy + t->dDydtnew * Dt;   /* 5.119 */
+					t->dDydtnew = (t->dDydt + Dt / t->mass * (tension + 2.0 * t->DeltaP * t->Dz * t->Dx)) /
+						(1.0 + t->B * Dt / t->mass);   // 5.119
+					t->Dynew = t->Dy + t->dDydtnew * Dt;   // 5.119
 					#if NO_MOVING_WALLS
 						t->Dynew = t->Dy;
 					#endif
 					t->Anew = t->Dz * ( t->Dynew >= t->dy ? t->Dynew + Dymin :
 						t->Dynew <= - t->dy ? Dymin :
-						(t->dy + t->Dynew) * (t->dy + t->Dynew) / (4 * t->dy) + Dymin );   /* 4.4, 4.5 */
+						(t->dy + t->Dynew) * (t->dy + t->Dynew) / (4.0 * t->dy) + Dymin );   // 4.4, 4.5
 					#if EQUAL_TUBE_WIDTHS
 						t->Anew = 0.0001;
 					#endif
-					t->Ahalf = 0.5 * (t->A + t->Anew);   /* 5.120 */
-					t->Dxhalf = 0.5 * (t->Dxnew + t->Dx);   /* 5.121 */
-					t->Vnew = t->Anew * t->Dxnew;   /* 5.128 */
+					t->Ahalf = 0.5 * (t->A + t->Anew);   // 5.120
+					t->Dxhalf = 0.5 * (t->Dxnew + t->Dx);   // 5.121
+					t->Vnew = t->Anew * t->Dxnew;   // 5.128
 					{ double oneByDyav = t->Dz / t->A;
-					/*t->R = 12 * 1.86e-5 * t->parallel * t->parallel * oneByDyav * oneByDyav;*/
-					if (t->Dy < 0)
-						t->R = 12 * 1.86e-5 / (Dymin * Dymin + t->dy * t->dy);
+					/*t->R = 12.0 * 1.86e-5 * t->parallel * t->parallel * oneByDyav * oneByDyav;*/
+					if (t->Dy < 0.0)
+						t->R = 12.0 * 1.86e-5 / (Dymin * Dymin + t->dy * t->dy);
 					else
-						t->R = 12 * 1.86e-5 * t->parallel * t->parallel /
+						t->R = 12.0 * 1.86e-5 * t->parallel * t->parallel /
 							((t->Dy + Dymin) * (t->Dy + Dymin) + t->dy * t->dy);
 					t->R += 0.3 * t->parallel * oneByDyav;   /* 5.23 */ }
-					t->r = (1 + t->R * Dt / rho0) * t->Dxhalf / t->Anew;   /* 5.122 */
-					t->ehalf = t->e + halfc2Dt * (t->Jleft - t->Jright);   /* 5.123 */
-					t->phalf = (t->p + halfDt * (t->Qleft - t->Qright) / t->Dx) / (1 + Dtbytworho0 * t->R);   /* 5.123 */
+					t->r = (1.0 + t->R * Dt / rho0) * t->Dxhalf / t->Anew;   // 5.122
+					t->ehalf = t->e + halfc2Dt * (t->Jleft - t->Jright);   // 5.123
+					t->phalf = (t->p + halfDt * (t->Qleft - t->Qright) / t->Dx) / (1.0 + Dtbytworho0 * t->R);   // 5.123
 					#if MASS_LEAPFROG
-						t->ehalf = t->ehalfold + 2 * halfc2Dt * (t->Jleft - t->Jright);
+						t->ehalf = t->ehalfold + 2.0 * halfc2Dt * (t->Jleft - t->Jright);
 					#endif
-					t->Jhalf = t->phalf * t->Ahalf;   /* 5.124 */
-					t->Qhalf = t->ehalf / (t->Ahalf * t->Dxhalf) + onebytworho0 * t->phalf * t->phalf;   /* 5.124 */
+					t->Jhalf = t->phalf * t->Ahalf;   // 5.124
+					t->Qhalf = t->ehalf / (t->Ahalf * t->Dxhalf) + onebytworho0 * t->phalf * t->phalf;   // 5.124
 					#if NO_BERNOULLI_EFFECT
 						t->Qhalf = t->ehalf / (t->Ahalf * t->Dxhalf);
 					#endif
 				}
-				for (m = 1; m <= M; m ++) {   /* Compute Jleftnew and Qleftnew. */
+				for (int m = 1; m <= M; m ++) {   // compute Jleftnew and Qleftnew
 					Delta_Tube l = delta->tube + m, r1 = l -> right1, r2 = l -> right2, r = r1;
-					Delta_Tube l1 = l, l2 = r ? r -> left2 : NULL;
-					if (l->left1 == NULL) {   /* Closed boundary at the left side (diaphragm)? */
-						if (r == NULL) continue;   /* Tube not connected at all. */
-						l->Jleftnew = 0;   /* 5.132. */
-						l->Qleftnew = (l->eleft - twoc2Dt * l->Jhalf) / l->Vnew;   /* 5.132. */
+					Delta_Tube l1 = l, l2 = r ? r -> left2 : nullptr;
+					if (! l->left1) {   // closed boundary at the left side (diaphragm)?
+						if (! r) continue;   // tube not connected at all
+						l->Jleftnew = 0;   // 5.132
+						l->Qleftnew = (l->eleft - twoc2Dt * l->Jhalf) / l->Vnew;   // 5.132
 					}
-					else   /* Left boundary open to another tube will be handled... */
-						(void) 0;   /* ...together with the right boundary of the tube to the left. */
-					if (r == NULL) {   /* Open boundary at the right side (lips, nostrils)? */
-						rrad = 1 - c * Dt / 0.02;   /* Radiation resistance, 5.135. */
-						onebygrad = 1 / (1 + c * Dt / 0.02);   /* Radiation conductance, 5.135. */
+					else   // left boundary open to another tube will be handled...
+						(void) 0;   // ...together with the right boundary of the tube to the left
+					if (! r) {   // open boundary at the right side (lips, nostrils)?
+						rrad = 1.0 - c * Dt / 0.02;   // radiation resistance, 5.135
+						onebygrad = 1.0 / (1.0 + c * Dt / 0.02);   // radiation conductance, 5.135
 						#if NO_RADIATION_DAMPING
 							rrad = 0;
 							onebygrad = 0;
 						#endif
 						l->prightnew = ((l->Dxhalf / Dt + c * onebygrad) * l->pright +
-							 2 * ((l->Qhalf - rho0c2) - (l->Qright - rho0c2) * onebygrad)) /
-							(l->r * l->Anew / Dt + c * onebygrad);   /* 5.136 */
-						l->Jrightnew = l->prightnew * l->Anew;   /* 5.136 */
+							 2.0 * ((l->Qhalf - rho0c2) - (l->Qright - rho0c2) * onebygrad)) /
+							(l->r * l->Anew / Dt + c * onebygrad);   // 5.136
+						l->Jrightnew = l->prightnew * l->Anew;   // 5.136
 						l->Qrightnew = (rrad * (l->Qright - rho0c2) +
-							c * (l->prightnew - l->pright)) * onebygrad + rho0c2;   /* 5.136 */
-					} else if (l2 == NULL && r2 == NULL) {   /* Two-way boundary. */
+							c * (l->prightnew - l->pright)) * onebygrad + rho0c2;   // 5.136
+					} else if (! l2 && ! r2) {   // two-way boundary
 						if (l->v > criticalVelocity && l->A < r->A) {
 							l->Pturbrightnew = -0.5 * rho0 * (l->v - criticalVelocity) *
-								(1 - l->A / r->A) * (1 - l->A / r->A) * l->v;
+								(1.0 - l->A / r->A) * (1.0 - l->A / r->A) * l->v;
 							if (l->Pturbrightnew != 0.0)
-								l->Pturbrightnew *= 1 + NUMrandomGauss (0, noiseFactor) /* * l->A */;
+								l->Pturbrightnew *= NUMrandomGauss (1.0, noiseFactor) /* * l->A */;
 						}
 						if (r->v < - criticalVelocity && r->A < l->A) {
 							l->Pturbrightnew = 0.5 * rho0 * (r->v + criticalVelocity) *
-								(1 - r->A / l->A) * (1 - r->A / l->A) * r->v;
+								(1.0 - r->A / l->A) * (1.0 - r->A / l->A) * r->v;
 							if (l->Pturbrightnew != 0.0)
-								l->Pturbrightnew *= 1 + NUMrandomGauss (0, noiseFactor) /* * r->A */;
+								l->Pturbrightnew *= NUMrandomGauss (1.0, noiseFactor) /* * r->A */;
 						}
 						#if NO_TURBULENCE
-							l->Pturbrightnew = 0;
+							l->Pturbrightnew = 0.0;
 						#endif
 						l->Jrightnew = r->Jleftnew =
 							(l->Dxhalf * l->pright + r->Dxhalf * r->pleft +
 							 twoDt * (l->Qhalf - r->Qhalf + l->Pturbright)) /
-							(l->r + r->r);   /* 5.127 */
+							(l->r + r->r);   // 5.127
 						#if B91
 							l->Jrightnew = r->Jleftnew =
 								(l->pright + r->pleft +
-								 2 * twoDt * (l->Qhalf - r->Qhalf + l->Pturbright) / (l->Dxhalf + r->Dxhalf)) /
+								 2.0 * twoDt * (l->Qhalf - r->Qhalf + l->Pturbright) / (l->Dxhalf + r->Dxhalf)) /
 								(l->r / l->Dxhalf + r->r / r->Dxhalf);
 						#endif
-						l->prightnew = l->Jrightnew / l->Anew;   /* 5.128 */
-						r->pleftnew = r->Jleftnew / r->Anew;   /* 5.128 */
-						l->Krightnew = onebytworho0 * l->prightnew * l->prightnew;   /* 5.128 */
-						r->Kleftnew = onebytworho0 * r->pleftnew * r->pleftnew;   /* 5.128 */
+						l->prightnew = l->Jrightnew / l->Anew;   // 5.128
+						r->pleftnew = r->Jleftnew / r->Anew;   // 5.128
+						l->Krightnew = onebytworho0 * l->prightnew * l->prightnew;   // 5.128
+						r->Kleftnew = onebytworho0 * r->pleftnew * r->pleftnew;   // 5.128
 						#if NO_BERNOULLI_EFFECT
-							l->Krightnew = r->Kleftnew = 0;
+							l->Krightnew = r->Kleftnew = 0.0;
 						#endif
 						l->Qrightnew =
 							(l->eright + r->eleft + twoc2Dt * (l->Jhalf - r->Jhalf)
 							 + l->Krightnew * l->Vnew + (r->Kleftnew - l->Pturbrightnew) * r->Vnew) /
-							(l->Vnew + r->Vnew);   /* 5.131 */
-						r->Qleftnew = l->Qrightnew + l->Pturbrightnew;   /* 5.131 */
-					} else if (r2) {   /* Two adjacent tubes at the right side (velic). */
+							(l->Vnew + r->Vnew);   // 5.131
+						r->Qleftnew = l->Qrightnew + l->Pturbrightnew;   // 5.131
+					} else if (r2) {   // two adjacent tubes at the right side (velic)
 						r1->Jleftnew =
-							(r1->Jleft * r1->Dxhalf * (1 / (l->A + r2->A) + 1 / r1->A) +
+							(r1->Jleft * r1->Dxhalf * (1.0 / (l->A + r2->A) + 1.0 / r1->A) +
 							 twoDt * ((l->Ahalf * l->Qhalf + r2->Ahalf * r2->Qhalf ) / (l->Ahalf  + r2->Ahalf) - r1->Qhalf)) /
-							(1 / (1 / l->r + 1 / r2->r) + r1->r);   /* 5.138 */
+							(1.0 / (1.0 / l->r + 1.0 / r2->r) + r1->r);   // 5.138
 						r2->Jleftnew =
-							(r2->Jleft * r2->Dxhalf * (1 / (l->A + r1->A) + 1 / r2->A) +
+							(r2->Jleft * r2->Dxhalf * (1.0 / (l->A + r1->A) + 1.0 / r2->A) +
 							 twoDt * ((l->Ahalf * l->Qhalf + r1->Ahalf * r1->Qhalf ) / (l->Ahalf  + r1->Ahalf) - r2->Qhalf)) /
-							(1 / (1 / l->r + 1 / r1->r) + r2->r);   /* 5.138 */
-						l->Jrightnew = r1->Jleftnew + r2->Jleftnew;   /* 5.139 */
-						l->prightnew = l->Jrightnew / l->Anew;   /* 5.128 */
-						r1->pleftnew = r1->Jleftnew / r1->Anew;   /* 5.128 */
-						r2->pleftnew = r2->Jleftnew / r2->Anew;   /* 5.128 */
-						l->Krightnew = onebytworho0 * l->prightnew * l->prightnew;   /* 5.128 */
-						r1->Kleftnew = onebytworho0 * r1->pleftnew * r1->pleftnew;   /* 5.128 */
-						r2->Kleftnew = onebytworho0 * r2->pleftnew * r2->pleftnew;   /* 5.128 */
+							(1.0 / (1.0 / l->r + 1.0 / r1->r) + r2->r);   // 5.138
+						l->Jrightnew = r1->Jleftnew + r2->Jleftnew;   // 5.139
+						l->prightnew = l->Jrightnew / l->Anew;   // 5.128
+						r1->pleftnew = r1->Jleftnew / r1->Anew;   // 5.128
+						r2->pleftnew = r2->Jleftnew / r2->Anew;   // 5.128
+						l->Krightnew = onebytworho0 * l->prightnew * l->prightnew;   // 5.128
+						r1->Kleftnew = onebytworho0 * r1->pleftnew * r1->pleftnew;   // 5.128
+						r2->Kleftnew = onebytworho0 * r2->pleftnew * r2->pleftnew;   // 5.128
 						#if NO_BERNOULLI_EFFECT
 							l->Krightnew = r1->Kleftnew = r2->Kleftnew = 0;
 						#endif
 						l->Qrightnew = r1->Qleftnew = r2->Qleftnew =
 							(l->eright + r1->eleft + r2->eleft + twoc2Dt * (l->Jhalf - r1->Jhalf - r2->Jhalf) +
 							 l->Krightnew * l->Vnew + r1->Kleftnew * r1->Vnew + r2->Kleftnew * r2->Vnew) /
-							(l->Vnew + r1->Vnew + r2->Vnew);   /* 5.137 */
+							(l->Vnew + r1->Vnew + r2->Vnew);   // 5.137
 					} else {
-						Melder_assert (l2 != NULL);
+						Melder_assert (l2 != nullptr);
 						l1->Jrightnew =
-							(l1->Jright * l1->Dxhalf * (1 / (r->A + l2->A) + 1 / l1->A) -
+							(l1->Jright * l1->Dxhalf * (1.0 / (r->A + l2->A) + 1.0 / l1->A) -
 							 twoDt * ((r->Ahalf * r->Qhalf + l2->Ahalf * l2->Qhalf ) / (r->Ahalf  + l2->Ahalf) - l1->Qhalf)) /
-							(1 / (1 / r->r + 1 / l2->r) + l1->r);   /* 5.138 */
+							(1.0 / (1.0 / r->r + 1.0 / l2->r) + l1->r);   // 5.138
 						l2->Jrightnew =
-							(l2->Jright * l2->Dxhalf * (1 / (r->A + l1->A) + 1 / l2->A) -
+							(l2->Jright * l2->Dxhalf * (1.0 / (r->A + l1->A) + 1.0 / l2->A) -
 							 twoDt * ((r->Ahalf * r->Qhalf + l1->Ahalf  * l1->Qhalf ) / (r->Ahalf  + l1->Ahalf) - l2->Qhalf)) /
-							(1 / (1 / r->r + 1 / l1->r) + l2->r);   /* 5.138 */
-						r->Jleftnew = l1->Jrightnew + l2->Jrightnew;   /* 5.139 */
-						r->pleftnew = r->Jleftnew / r->Anew;   /* 5.128 */
-						l1->prightnew = l1->Jrightnew / l1->Anew;   /* 5.128 */
-						l2->prightnew = l2->Jrightnew / l2->Anew;   /* 5.128 */
-						r->Kleftnew = onebytworho0 * r->pleftnew * r->pleftnew;   /* 5.128 */
-						l1->Krightnew = onebytworho0 * l1->prightnew * l1->prightnew;   /* 5.128 */
-						l2->Krightnew = onebytworho0 * l2->prightnew * l2->prightnew;   /* 5.128 */
+							(1.0 / (1.0 / r->r + 1.0 / l1->r) + l2->r);   // 5.138
+						r->Jleftnew = l1->Jrightnew + l2->Jrightnew;   // 5.139
+						r->pleftnew = r->Jleftnew / r->Anew;   // 5.128
+						l1->prightnew = l1->Jrightnew / l1->Anew;   // 5.128
+						l2->prightnew = l2->Jrightnew / l2->Anew;   // 5.128
+						r->Kleftnew = onebytworho0 * r->pleftnew * r->pleftnew;   // 5.128
+						l1->Krightnew = onebytworho0 * l1->prightnew * l1->prightnew;   // 5.128
+						l2->Krightnew = onebytworho0 * l2->prightnew * l2->prightnew;   // 5.128
 						#if NO_BERNOULLI_EFFECT
-							r->Kleftnew = l1->Krightnew = l2->Krightnew = 0;
+							r->Kleftnew = l1->Krightnew = l2->Krightnew = 0.0;
 						#endif
 						r->Qleftnew = l1->Qrightnew = l2->Qrightnew =
 							(r->eleft + l1->eright + l2->eright + twoc2Dt * (l1->Jhalf + l2->Jhalf - r->Jhalf) +
 							 r->Kleftnew * r->Vnew + l1->Krightnew * l1->Vnew + l2->Krightnew * l2->Vnew) /
-							(r->Vnew + l1->Vnew + l2->Vnew);   /* 5.137 */
+							(r->Vnew + l1->Vnew + l2->Vnew);   // 5.137
 					}
 				}
 
@@ -363,13 +364,13 @@ Sound Artword_Speaker_to_Sound (Artword artword, Speaker speaker,
 
 				if (n == (oversampling + 1) / 2) {
 					double out = 0.0;
-					for (m = 1; m <= M; m ++) {
+					for (int m = 1; m <= M; m ++) {
 						Delta_Tube t = delta->tube + m;
-						out += rho0 * t->Dx * t->Dz * t->dDydt * Dt * 1000;   /* Radiation of wall movement, 5.140. */
-						if (t->right1 == NULL)
-							out += t->Jrightnew - t->Jright;   /* Radiation of open tube end. */
+						out += rho0 * t->Dx * t->Dz * t->dDydt * Dt * 1000.0;   // radiation of wall movement, 5.140
+						if (! t->right1)
+							out += t->Jrightnew - t->Jright;   // radiation of open tube end
 					}
-					result -> z [1] [sample] = out /= 4 * NUMpi * 0.4 * Dt;   /* At 0.4 metres. */
+					result -> z [1] [sample] = out /= 4.0 * NUMpi * 0.4 * Dt;   // at 0.4 metres
 					if (iw1) w1 -> z [1] [sample] = delta->tube[iw1].Dy;
 					if (iw2) w2 -> z [1] [sample] = delta->tube[iw2].Dy;
 					if (iw3) w3 -> z [1] [sample] = delta->tube[iw3].Dy;
@@ -380,7 +381,7 @@ Sound Artword_Speaker_to_Sound (Artword artword, Speaker speaker,
 					if (iv2) v2 -> z [1] [sample] = delta->tube[iv2].v;
 					if (iv3) v3 -> z [1] [sample] = delta->tube[iv3].v;
 				}
-				for (m = 1; m <= M; m ++) {
+				for (int m = 1; m <= M; m ++) {
 					Delta_Tube t = delta->tube + m;
 					t->Jleft = t->Jleftnew;
 					t->Jright = t->Jrightnew;
@@ -406,21 +407,21 @@ Sound Artword_Speaker_to_Sound (Artword artword, Speaker speaker,
 			}
 		}
 		totalVolume = 0.0;
-		for (m = 1; m <= M; m ++)
+		for (int m = 1; m <= M; m ++)
 			totalVolume += delta->tube [m]. V;
-		//Melder_casual ("Ending volume: %.10g litres.", totalVolume * 1000);
-		if (out_w1) *out_w1 = w1.transfer();
-		if (out_w2) *out_w2 = w2.transfer();
-		if (out_w3) *out_w3 = w3.transfer();
-		if (out_p1) *out_p1 = p1.transfer();
-		if (out_p2) *out_p2 = p2.transfer();
-		if (out_p3) *out_p3 = p3.transfer();
-		if (out_v1) *out_v1 = v1.transfer();
-		if (out_v2) *out_v2 = v2.transfer();
-		if (out_v3) *out_v3 = v3.transfer();
-		return result.transfer();
+		//Melder_casual (U"Ending volume: ", totalVolume * 1000, U" litres.");
+		if (out_w1) *out_w1 = w1.move();
+		if (out_w2) *out_w2 = w2.move();
+		if (out_w3) *out_w3 = w3.move();
+		if (out_p1) *out_p1 = p1.move();
+		if (out_p2) *out_p2 = p2.move();
+		if (out_p3) *out_p3 = p3.move();
+		if (out_v1) *out_v1 = v1.move();
+		if (out_v2) *out_v2 = v2.move();
+		if (out_v3) *out_v3 = v3.move();
+		return result;
 	} catch (MelderError) {
-		Melder_throw (artword, " & ", speaker, ": articulatory synthesis not performed.");
+		Melder_throw (artword, U" & ", speaker, U": articulatory synthesis not performed.");
 	}
 }
 
diff --git a/artsynth/Artword_Speaker_to_Sound.h b/artsynth/Artword_Speaker_to_Sound.h
index 969d181..266f8a2 100644
--- a/artsynth/Artword_Speaker_to_Sound.h
+++ b/artsynth/Artword_Speaker_to_Sound.h
@@ -1,6 +1,6 @@
 /* Artword_Speaker_to_Sound.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,10 +21,10 @@
 #include "Speaker.h"
 #include "Sound.h"
 
-Sound Artword_Speaker_to_Sound (Artword artword, Speaker speaker,
+autoSound Artword_Speaker_to_Sound (Artword artword, Speaker speaker,
    double samplingFrequency, int oversampling,
-   Sound *w1, int iw1, Sound *w2, int iw2, Sound *w3, int iw3,
-   Sound *p1, int ip1, Sound *p2, int ip2, Sound *p3, int ip3,
-   Sound *v1, int iv1, Sound *v2, int iv2, Sound *v3, int iv3);
+   autoSound *w1, int iw1, autoSound *w2, int iw2, autoSound *w3, int iw3,
+   autoSound *p1, int ip1, autoSound *p2, int ip2, autoSound *p3, int ip3,
+   autoSound *v1, int iv1, autoSound *v2, int iv2, autoSound *v3, int iv3);
 
 /* End of file Artword_Speaker_to_Sound.h */
diff --git a/artsynth/Artword_def.h b/artsynth/Artword_def.h
index d2c7ef0..151dcee 100644
--- a/artsynth/Artword_def.h
+++ b/artsynth/Artword_def.h
@@ -1,6 +1,6 @@
 /* Artword_def.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@ oo_END_STRUCT (ArtwordData)
 
 
 #define ooSTRUCT Artword
-oo_DEFINE_CLASS (Artword, Data)
+oo_DEFINE_CLASS (Artword, Daata)
 
 	oo_DOUBLE (totalTime)
 	oo_STRUCT_SET (ArtwordData, data, kArt_muscle)
diff --git a/artsynth/Artword_to_Art.cpp b/artsynth/Artword_to_Art.cpp
index 6ce7be0..a85923c 100644
--- a/artsynth/Artword_to_Art.cpp
+++ b/artsynth/Artword_to_Art.cpp
@@ -1,6 +1,6 @@
 /* Artword_to_Art.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ Art Artword_to_Art (Artword me, double tim) {
 		Artword_intoArt (me, thee.peek(), tim);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Articulation.");
+		Melder_throw (me, U": not converted to Articulation.");
 	}
 }
 
diff --git a/artsynth/Delta.cpp b/artsynth/Delta.cpp
index bb9cc0d..294a997 100644
--- a/artsynth/Delta.cpp
+++ b/artsynth/Delta.cpp
@@ -1,6 +1,6 @@
 /* Delta.cpp
  *
- * Copyright (C) 1992-2011,2012,2013 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,19 +26,19 @@ void structDelta :: v_destroy () {
 	Delta_Parent :: v_destroy ();
 }
 
-void structDelta :: init (int a_numberOfTubes) {
-	Melder_assert (a_numberOfTubes >= 1);
-	our numberOfTubes = a_numberOfTubes;
-	our tube = NUMvector <struct structDelta_Tube> (1, a_numberOfTubes);
-	for (int itube = 1; itube <= a_numberOfTubes; itube ++) {
-		Delta_Tube t = our tube + itube;
+void Delta_init (Delta me, int numberOfTubes) {
+	Melder_assert (numberOfTubes >= 1);
+	my numberOfTubes = numberOfTubes;
+	my tube = NUMvector <struct structDelta_Tube> (1, numberOfTubes);
+	for (int itube = 1; itube <= numberOfTubes; itube ++) {
+		Delta_Tube t = & my tube [itube];
 		t -> parallel = 1;
 	}
 }
 
-Delta Delta_create (int a_numberOfTubes) {
+Delta Delta_create (int numberOfTubes) {
 	autoDelta me = Thing_new (Delta);
-	my init (a_numberOfTubes);
+	Delta_init (me.peek(), numberOfTubes);
 	return me.transfer();
 }
 
diff --git a/artsynth/Delta.h b/artsynth/Delta.h
index 2dd08af..61afd35 100644
--- a/artsynth/Delta.h
+++ b/artsynth/Delta.h
@@ -2,7 +2,7 @@
 #define _Delta_h_
 /* Delta.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,10 +26,10 @@ struct structDelta_Tube
 {
 	/* Structure: static. */
 
-	Delta_Tube left1;   /* If NULL: closed at left edge. */
-	Delta_Tube left2;   /* If not NULL: two merging streams. */
-	Delta_Tube right1;  /* If NULL: radiation at right edge. */
-	Delta_Tube right2;  /* If not NULL: a stream splitting into two. */
+	Delta_Tube left1;   /* If null: closed at left edge. */
+	Delta_Tube left2;   /* If not null: two merging streams. */
+	Delta_Tube right1;  /* If null: radiation at right edge. */
+	Delta_Tube right2;  /* If not null: a stream splitting into two. */
 	long parallel;   /* Parallel subdivision. */
 
 	/* Controlled by articulation: quasistatic. */
@@ -54,17 +54,15 @@ struct structDelta_Tube
 };
 
 Thing_define (Delta, Thing) {
-	// functions:
-	public:
-		void init (int numberOfTubes);
-	// new data:
-	public:
-		int numberOfTubes;              // >= 1
-		struct structDelta_Tube *tube;  // tube [1..numberOfTubes]
-	// overridden methods:
-		virtual void v_destroy ();
+	int numberOfTubes;              // >= 1
+	struct structDelta_Tube *tube;  // tube [1..numberOfTubes]
+
+	void v_destroy ()
+		override;
 };
 
+void Delta_init (Delta me, int numberOfTubes);
+
 Delta Delta_create (int numberOfTubes);
 /*
 	Function:
@@ -73,7 +71,7 @@ Delta Delta_create (int numberOfTubes);
 		numberOfTubes >= 1;
 	Postconditions:
 		result -> numberOfTubes = numberOfTubes;
-		all members of result -> tube [1..numberOfTubes] are zero or NULL,
+		all members of result -> tube [1..numberOfTubes] are zero or null,
 		except 'parallel', which is 1.
 */
 
diff --git a/artsynth/Speaker.cpp b/artsynth/Speaker.cpp
index 8bcde38..c230e85 100644
--- a/artsynth/Speaker.cpp
+++ b/artsynth/Speaker.cpp
@@ -1,6 +1,6 @@
 /* Speaker.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,9 +38,9 @@
 #include "oo_DESCRIPTION.h"
 #include "Speaker_def.h"
 
-Thing_implement (Speaker, Data, 0);
+Thing_implement (Speaker, Daata, 0);
 
-Speaker Speaker_create (wchar_t *kindOfSpeaker, int numberOfVocalCordMasses) {
+Speaker Speaker_create (char32 *kindOfSpeaker, int numberOfVocalCordMasses) {
 	Speaker me = Thing_new (Speaker);
 
 	/* Supralaryngeal dimensions are taken from P. Mermelstein (1973):		*/
@@ -50,36 +50,36 @@ Speaker Speaker_create (wchar_t *kindOfSpeaker, int numberOfVocalCordMasses) {
 
 	double scaling;
 	if (! me) return NULL;
-	if (wcsequ (kindOfSpeaker, L"Male")) my relativeSize = 1.1;
-	else if (wcsequ (kindOfSpeaker, L"Child")) my relativeSize = 0.7;
+	if (str32equ (kindOfSpeaker, U"Male")) my relativeSize = 1.1;
+	else if (str32equ (kindOfSpeaker, U"Child")) my relativeSize = 0.7;
 	else my relativeSize = 1.0;
 	scaling = my relativeSize;
 
 	/* Laryngeal system. Data for male speaker from Ishizaka and Flanagan.	*/
 
-	if (wcsequ (kindOfSpeaker, L"Female")) {
-		my lowerCord.thickness = 1.4e-3;   /* dx, in metres */
+	if (str32equ (kindOfSpeaker, U"Female")) {
+		my lowerCord.thickness = 1.4e-3;   // dx, in metres
 		my upperCord.thickness = 0.7e-3;
 		my cord.length = 10e-3;
-		my lowerCord.mass = 0.02e-3;   /* kilograms */
+		my lowerCord.mass = 0.02e-3;   // kilograms
 		my upperCord.mass = 0.01e-3;
-		my lowerCord.k1 = 10;   /* Newtons per metre */
+		my lowerCord.k1 = 10;   // Newtons per metre
 		my upperCord.k1 = 4;
-	} else if (wcsequ (kindOfSpeaker, L"Male")) {
-		my lowerCord.thickness = 2.0e-3;   /* dx, in metres */
+	} else if (str32equ (kindOfSpeaker, U"Male")) {
+		my lowerCord.thickness = 2.0e-3;   // dx, in metres
 		my upperCord.thickness = 1.0e-3;
 		my cord.length = 18e-3;
-		my lowerCord.mass = 0.1e-3;   /* kilograms */
+		my lowerCord.mass = 0.1e-3;   // kilograms
 		my upperCord.mass = 0.05e-3;
-		my lowerCord.k1 = 12;   /* Newtons per metre */
+		my lowerCord.k1 = 12;   // Newtons per metre
 		my upperCord.k1 = 4;
 	} else /* "Child" */ {
-		my lowerCord.thickness = 0.7e-3;   /* dx, in metres */
+		my lowerCord.thickness = 0.7e-3;   // dx, in metres
 		my upperCord.thickness = 0.3e-3;
 		my cord.length = 6e-3;
-		my lowerCord.mass = 0.003e-3;   /* kilograms */
+		my lowerCord.mass = 0.003e-3;   // kilograms
 		my upperCord.mass = 0.002e-3;
-		my lowerCord.k1 = 6;   /* Newtons per metre */
+		my lowerCord.k1 = 6;   // Newtons per metre
 		my upperCord.k1 = 2;
 	}
 	my cord.numberOfMasses = numberOfVocalCordMasses;
@@ -103,8 +103,8 @@ Speaker Speaker_create (wchar_t *kindOfSpeaker, int numberOfVocalCordMasses) {
 	my teethCavity.dx1 = -0.009 * scaling;
 	my teethCavity.dx2 = -0.004 * scaling;
 	my teethCavity.dy = -0.011 * scaling;
-	my lowerTeeth.a = -0.30;   /* radians */
-	my lowerTeeth.r = 0.113 * scaling;   /* metres */
+	my lowerTeeth.a = -0.30;   // radians
+	my lowerTeeth.r = 0.113 * scaling;   // metres
 	my upperTeeth.x = 0.036 * scaling;
 	my upperTeeth.y = 0.026 * scaling;
 	my lowerLip.dx = 0.010 * scaling;
diff --git a/artsynth/Speaker.h b/artsynth/Speaker.h
index 3b652f6..aad255a 100644
--- a/artsynth/Speaker.h
+++ b/artsynth/Speaker.h
@@ -2,7 +2,7 @@
 #define _Speaker_h_
 /* Speaker.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,9 +22,9 @@
 #include "Data.h"
 
 #include "Speaker_def.h"
-oo_CLASS_CREATE (Speaker, Data);
+oo_CLASS_CREATE (Speaker, Daata);
 
-Speaker Speaker_create (wchar_t *kindOfSpeaker, int numberOfVocalCordMasses);
+Speaker Speaker_create (char32 *kindOfSpeaker, int numberOfVocalCordMasses);
 	/* Preconditions:								*/
 	/*    1 <= numberOfVocalCordMasses <= 2;					*/
 	/* Failures:									*/
diff --git a/artsynth/Speaker_def.h b/artsynth/Speaker_def.h
index b5012f8..d38ecc4 100644
--- a/artsynth/Speaker_def.h
+++ b/artsynth/Speaker_def.h
@@ -108,7 +108,7 @@ oo_END_STRUCT (Speaker_Nose)
 
 
 #define ooSTRUCT Speaker
-oo_DEFINE_CLASS (Speaker, Data)
+oo_DEFINE_CLASS (Speaker, Daata)
 
 	oo_DOUBLE (relativeSize)   /* Different for female, male, child. */
 
diff --git a/artsynth/Speaker_to_Delta.cpp b/artsynth/Speaker_to_Delta.cpp
index 4bc5458..c49c164 100644
--- a/artsynth/Speaker_to_Delta.cpp
+++ b/artsynth/Speaker_to_Delta.cpp
@@ -19,7 +19,7 @@
 
 #include "Art_Speaker.h"
 #include "Speaker_to_Delta.h"
-#define SMOOTH_LUNGS  TRUE
+#define SMOOTH_LUNGS  true
 #define FIRST_TUBE  7
 
 Delta Speaker_to_Delta (Speaker me) {
diff --git a/artsynth/manual_Artsynth.cpp b/artsynth/manual_Artsynth.cpp
index ad19eee..ff8dfb3 100644
--- a/artsynth/manual_Artsynth.cpp
+++ b/artsynth/manual_Artsynth.cpp
@@ -1,6 +1,6 @@
 /* manual_Artsynth.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,162 +22,162 @@
 void manual_Artsynth_init (ManPages me);
 void manual_Artsynth_init (ManPages me) {
 
-MAN_BEGIN (L"Articulatory synthesis", L"ppgb", 201101028)
-INTRO (L"This is a description of the articulatory synthesis package in Praat. "
+MAN_BEGIN (U"Articulatory synthesis", U"ppgb", 201101028)
+INTRO (U"This is a description of the articulatory synthesis package in Praat. "
 	"For a detailed description of the physics and mathematics behind the model, "
 	"see @@Boersma (1998)@, chapters 2 and 3. "
 	"For examples of how to synthesize utterances, consult http://www.fon.hum.uva.nl/paul/diss/ch5/.")
-ENTRY (L"How to start (after reading the @Intro)")
-NORMAL (L"We are going to have the synthesizer say [əpə]. We need a @Speaker and an @Artword object.")
-NORMAL (L"1. Create a speaker with @@Create Speaker...@ from the @@New menu at .")
-NORMAL (L"2. Create an articulation word of 0.5 seconds with @@Create Artword... at .")
-NORMAL (L"3. Edit the Artword by selecting it and clicking ##View & Edit#.")
-NORMAL (L"4. To set the glottis to a position suitable for phonation, use the ArtwordEditor to "
+ENTRY (U"How to start (after reading the @Intro)")
+NORMAL (U"We are going to have the synthesizer say [əpə]. We need a @Speaker and an @Artword object.")
+NORMAL (U"1. Create a speaker with @@Create Speaker...@ from the @@New menu at .")
+NORMAL (U"2. Create an articulation word of 0.5 seconds with @@Create Artword... at .")
+NORMAL (U"3. Edit the Artword by selecting it and clicking ##View & Edit#.")
+NORMAL (U"4. To set the glottis to a position suitable for phonation, use the ArtwordEditor to "
 	"set the %Interarytenoid activity to 0.5 throughout the utterance. You set two targets: "
 	"0.5 at a time of 0 seconds, and 0.5 at a time of 0.5 seconds.")
-NORMAL (L"5. To prevent air escaping from the nose, close the nasopharyngeal port "
+NORMAL (U"5. To prevent air escaping from the nose, close the nasopharyngeal port "
 	"by setting the %LevatorPalatini activity to 1.0 throughout the utterance.")
-NORMAL (L"6. To generate the lung pressure needed for phonation, you set the %Lungs activity at 0 seconds to 0.2, "
+NORMAL (U"6. To generate the lung pressure needed for phonation, you set the %Lungs activity at 0 seconds to 0.2, "
 	"and at 0.1 seconds to 0.")
-NORMAL (L"7. To force a jaw movement that closes the lips, set the %Masseter activity at 0.25 seconds to 0.7, "
+NORMAL (U"7. To force a jaw movement that closes the lips, set the %Masseter activity at 0.25 seconds to 0.7, "
 	"and the %OrbicularisOris activity at 0.25 seconds to 0.2.")
-NORMAL (L"8. Select the Speaker and the Artword and click #Movie; "
+NORMAL (U"8. Select the Speaker and the Artword and click #Movie; "
 	"you will see a closing-and-opening gesture of the mouth.")
-NORMAL (L"9. Select the Speaker and the Artword and click ##To Sound...# "
+NORMAL (U"9. Select the Speaker and the Artword and click ##To Sound...# "
 	"(see @@Artword & Speaker: To Sound...@).")
-NORMAL (L"10. Just click #OK; the synthesis starts.")
-NORMAL (L"11. If you are sitting at a 1997 computer, this will last for 5 minutes or so; at a 2010 computer, 6 seconds. "
+NORMAL (U"10. Just click #OK; the synthesis starts.")
+NORMAL (U"11. If you are sitting at a 1997 computer, this will last for 5 minutes or so; at a 2010 computer, 6 seconds. "
 	"If this is too slow for you, click #Interrupt. "
 	"Otherwise, you can watch the vibrating vocal cords "
 	"and the changing vocal-tract shape.")
-NORMAL (L"12. You can play, view, and analyse the resulting @Sound as you would any other. "
+NORMAL (U"12. You can play, view, and analyse the resulting @Sound as you would any other. "
 	"You can see and hear a sound movie if you select the Speaker, "
 	"the Artword, and the Sound, and click #Play.")
 MAN_END
 
-MAN_BEGIN (L"Artword", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat. See @@Articulatory synthesis at .")
-NORMAL (L"An object of class Artword object represents the activities of several speech muscles as functions of time.")
-ENTRY (L"Artword commands")
-LIST_ITEM (L"• @@Create Artword...@: creates an Artword with relaxed muscles")
-LIST_ITEM (L"• @@Artword & Speaker: To Sound...@: articulatory synthesis")
+MAN_BEGIN (U"Artword", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat. See @@Articulatory synthesis at .")
+NORMAL (U"An object of class Artword object represents the activities of several speech muscles as functions of time.")
+ENTRY (U"Artword commands")
+LIST_ITEM (U"• @@Create Artword...@: creates an Artword with relaxed muscles")
+LIST_ITEM (U"• @@Artword & Speaker: To Sound...@: articulatory synthesis")
 MAN_END
 
-MAN_BEGIN (L"Artword & Speaker: To Sound...", L"ppgb", 20040331)
-INTRO (L"A command to synthesize a @Sound object from the selected @Speaker and the selected @Artword.")
-NORMAL (L"This is the command that performs the actual articulatory synthesis. "
+MAN_BEGIN (U"Artword & Speaker: To Sound...", U"ppgb", 20040331)
+INTRO (U"A command to synthesize a @Sound object from the selected @Speaker and the selected @Artword.")
+NORMAL (U"This is the command that performs the actual articulatory synthesis. "
 	"See @@Articulatory synthesis at .")
-ENTRY (L"Settings")
-TAG (L"##Sampling frequency (Hz)")
-DEFINITION (L"the number of times per second that the equilibrium widths and lengths and the tensions of the muscles "
+ENTRY (U"Settings")
+TAG (U"##Sampling frequency (Hz)")
+DEFINITION (U"the number of times per second that the equilibrium widths and lengths and the tensions of the muscles "
 	"are recomputed from the Artword. This will also be the sampling frequency of the resulting sound and "
 	"of the optional resulting tube widths, air pressures, and air velocities. The standard value is 22050 Hz.")
-TAG (L"##Oversampling")
-DEFINITION (L"the number of times that the aerodynamic quantities and the state of the tube walls "
+TAG (U"##Oversampling")
+DEFINITION (U"the number of times that the aerodynamic quantities and the state of the tube walls "
 	"will be recomputed during each sample period. The standard value is 25.")
-TAG (L"##Width 1#, ##Width 2#, ##Width 3#")
-DEFINITION (L"the numbers (see below) of the tubes whose widths you want to monitor. "
+TAG (U"##Width 1#, ##Width 2#, ##Width 3#")
+DEFINITION (U"the numbers (see below) of the tubes whose widths you want to monitor. "
 	"E.g., if ##Width 1# is 36, the synthesizer will create a Sound object named $$width36$, "
 	"which contains the width of tube 36 (the lower glottis) as a function of time, expressed in metres. "
 	"To prevent the creation of a $$width$ object, specify $$0$ (the standard value).")
-TAG (L"##Pressure 1#, ##Pressure 2#, ##Pressure 3#")
-DEFINITION (L"the numbers (see below) of the tubes whose air pressures you want to monitor. "
+TAG (U"##Pressure 1#, ##Pressure 2#, ##Pressure 3#")
+DEFINITION (U"the numbers (see below) of the tubes whose air pressures you want to monitor. "
 	"E.g., if ##Pressure 3# is 37, the synthesizer will create a Sound object named $$pressure37$, "
 	"which contains the air pressure of tube 37 (the upper glottis) as a function of time, expressed in Pascal. "
 	"To prevent the creation of a $$pressure$ object, specify $$0$ (the standard value).")
-TAG (L"##Velocity 1#, ##Velocity 2#, ##Velocity 3")
-DEFINITION (L"the numbers (see below) of the tubes whose air velocities you want to monitor. "
+TAG (U"##Velocity 1#, ##Velocity 2#, ##Velocity 3")
+DEFINITION (U"the numbers (see below) of the tubes whose air velocities you want to monitor. "
 	"E.g., if ##Velocity 1# is 60, the synthesizer will create a Sound object named $velocity60, "
 	"which contains the air velocity of tube 60 (in the mouth) as a function of time, expressed in metres per second. "
 	"To prevent the creation of a $velocity object, specify $0 (the standard value).")
-ENTRY (L"Stability")
-NORMAL (L"The internal sampling frequency for the aerodynamics is the specified ##Sampling frequency#, "
+ENTRY (U"Stability")
+NORMAL (U"The internal sampling frequency for the aerodynamics is the specified ##Sampling frequency#, "
 	"multiplied by the specified #Oversampling. With the standard settings, this is 22050 times 25 = 550750 Hz.")
-NORMAL (L"To ensure the stability of the synthesis, this internal sampling frequency should not be less than the "
+NORMAL (U"To ensure the stability of the synthesis, this internal sampling frequency should not be less than the "
 	"velocity of sound (353 m/s) divided by the length of the shortest tube. For the standard #Female, "
 	"#Male, and #Child speakers, the shortest tube is the upper glottis, which has a length "
 	"of 0.7, 1.0, and 0.3 millimetres, respectively. The minimum internal sampling frequencies, therefore, "
 	"are 504286, 353000, and 1176667 hertz, respectively.")
-ENTRY (L"Time resolution")
-NORMAL (L"To capture the microscopic pressure changes in the glottis, you will want maximum time resolution. "
+ENTRY (U"Time resolution")
+NORMAL (U"To capture the microscopic pressure changes in the glottis, you will want maximum time resolution. "
 	"For a female speaker, you could set ##Sampling frequency# to 550750 Hz, and #Oversampling to 1.")
-ENTRY (L"Tube numbers")
-NORMAL (L"Here are the tube numbers that you can use for the #Width, #Pressure, and #Velocity settings:")
-LIST_ITEM (L"1..23: lungs (from bottom to top)")
-LIST_ITEM (L"24..29: bronchi (from bottom to top)")
-LIST_ITEM (L"30..35: trachea (from bottom to top)")
-LIST_ITEM (L"36: lower glottis")
-LIST_ITEM (L"37: upper glottis (not for a one-mass model)")
-LIST_ITEM (L"38..49: pharynx (from bottom to top)")
-LIST_ITEM (L"50..51: nasopharyngeal branching")
-LIST_ITEM (L"52..64: mouth (from back to front)")
-LIST_ITEM (L"65..78: nose (from back to front)")
-LIST_ITEM (L"79..86: conus elasticus (only for a 10-mass model)")
-LIST_ITEM (L"87..89: glottal shunt between the arytenoids (from bottom to top)")
-NORMAL (L"Some structural properties:")
-LIST_ITEM (L"• Tube 1 is closed at the bottom.")
-LIST_ITEM (L"• Tubes 64 (lips) and 78 (nostrils) radiate into the air.")
-LIST_ITEM (L"• The nasopharyngeal branch is at tubes 50, 51, and 65. They are constrained to have equal lengths.")
-LIST_ITEM (L"• For a one-mass model of the vocal cords, tube 36 is connected to 38.")
-LIST_ITEM (L"• For a 10-mass model, tubes 32..35 are replaced with 79..86, so that "
+ENTRY (U"Tube numbers")
+NORMAL (U"Here are the tube numbers that you can use for the #Width, #Pressure, and #Velocity settings:")
+LIST_ITEM (U"1..23: lungs (from bottom to top)")
+LIST_ITEM (U"24..29: bronchi (from bottom to top)")
+LIST_ITEM (U"30..35: trachea (from bottom to top)")
+LIST_ITEM (U"36: lower glottis")
+LIST_ITEM (U"37: upper glottis (not for a one-mass model)")
+LIST_ITEM (U"38..49: pharynx (from bottom to top)")
+LIST_ITEM (U"50..51: nasopharyngeal branching")
+LIST_ITEM (U"52..64: mouth (from back to front)")
+LIST_ITEM (U"65..78: nose (from back to front)")
+LIST_ITEM (U"79..86: conus elasticus (only for a 10-mass model)")
+LIST_ITEM (U"87..89: glottal shunt between the arytenoids (from bottom to top)")
+NORMAL (U"Some structural properties:")
+LIST_ITEM (U"• Tube 1 is closed at the bottom.")
+LIST_ITEM (U"• Tubes 64 (lips) and 78 (nostrils) radiate into the air.")
+LIST_ITEM (U"• The nasopharyngeal branch is at tubes 50, 51, and 65. They are constrained to have equal lengths.")
+LIST_ITEM (U"• For a one-mass model of the vocal cords, tube 36 is connected to 38.")
+LIST_ITEM (U"• For a 10-mass model, tubes 32..35 are replaced with 79..86, so that "
 	"tube 31 is connected to 79, and 86 is connected to 36.")
-LIST_ITEM (L"• A glottal shunt will be implemented if the speaker's $$shunt.Dx$ attribute is not zero. "
+LIST_ITEM (U"• A glottal shunt will be implemented if the speaker's $$shunt.Dx$ attribute is not zero. "
 	"A branch is then made from tubes 34 and 35 (or 85 and 86) to 87, "
 	"and from tube 89 to 38 and 39.")
 MAN_END
 
-MAN_BEGIN (L"Create Artword...", L"ppgb", 20101212)
-INTRO (L"A command to create an @Artword object with all muscle activities set to zero. "
+MAN_BEGIN (U"Create Artword...", U"ppgb", 20101212)
+INTRO (U"A command to create an @Artword object with all muscle activities set to zero. "
 	"See @@Articulatory synthesis at .")
-ENTRY (L"Settings")
-TAG (L"##Name")
-DEFINITION (L"the name that you give to the created object. The standard name is $$hallo$, "
+ENTRY (U"Settings")
+TAG (U"##Name")
+DEFINITION (U"the name that you give to the created object. The standard name is $$hallo$, "
 	"but you should give it a more sensible name, possibly something that represents the utterance "
 	"that it is supposed to generate.")
-TAG (L"##Duration (seconds)")
-DEFINITION (L"the duration of the resulting Artword. Should be as long as the utterance that "
+TAG (U"##Duration (seconds)")
+DEFINITION (U"the duration of the resulting Artword. Should be as long as the utterance that "
 	"you want to generate with it. The standard value is 1 second.")
 MAN_END
 
-MAN_BEGIN (L"Create Speaker...", L"ppgb", 20101212)
-INTRO (L"A command to create a @Speaker object. See @@Articulatory synthesis at .")
-ENTRY (L"Settings")
-TAG (L"##Name")
-DEFINITION (L"the name that you give to the created object. The standard name is \"speaker\", "
+MAN_BEGIN (U"Create Speaker...", U"ppgb", 20101212)
+INTRO (U"A command to create a @Speaker object. See @@Articulatory synthesis at .")
+ENTRY (U"Settings")
+TAG (U"##Name")
+DEFINITION (U"the name that you give to the created object. The standard name is \"speaker\", "
 	"but if you work with multiple Speaker objects, give them sensible names to reduce confusion.")
-TAG (L"##Kind of speaker")
-DEFINITION (L"Choose from #Female, #Male, or #Child. The only difference is a relative size.")
-TAG (L"##Number of tubes in glottis")
-DEFINITION (L"Choose from #1, #2, or #10. See @@Artword & Speaker: To Sound...@ for details.")
+TAG (U"##Kind of speaker")
+DEFINITION (U"Choose from #Female, #Male, or #Child. The only difference is a relative size.")
+TAG (U"##Number of tubes in glottis")
+DEFINITION (U"Choose from #1, #2, or #10. See @@Artword & Speaker: To Sound...@ for details.")
 MAN_END
 
-MAN_BEGIN (L"Create Vocal Tract from phone...", L"ppgb", 19960908)
-INTRO (L"A way to create a @VocalTract object.")
-ENTRY (L"Purpose")
-NORMAL (L"to translate a phone symbol like [a], [u], etc., into a vocal-tract area function.")
-ENTRY (L"Behaviour")
-NORMAL (L"The resulting VocalTract will appear in the list of objects, "
+MAN_BEGIN (U"Create Vocal Tract from phone...", U"ppgb", 19960908)
+INTRO (U"A way to create a @VocalTract object.")
+ENTRY (U"Purpose")
+NORMAL (U"to translate a phone symbol like [a], [u], etc., into a vocal-tract area function.")
+ENTRY (U"Behaviour")
+NORMAL (U"The resulting VocalTract will appear in the list of objects, "
 	"with the same name as the phone.")
-ENTRY (L"Algorithm")
-NORMAL (L"The area function of the resulting VocalTract is taken from the Russian speaker from @@Fant (1960)@.")
+ENTRY (U"Algorithm")
+NORMAL (U"The area function of the resulting VocalTract is taken from the Russian speaker from @@Fant (1960)@.")
 MAN_END
 
-MAN_BEGIN (L"Speaker", L"ppgb", 19980201)
-INTRO (L"One of the @@types of objects@ in Praat. See @@Articulatory synthesis at .")
-ENTRY (L"Speaker commands")
-LIST_ITEM (L"• @@Create Speaker...")
-LIST_ITEM (L"• @@Artword & Speaker: To Sound...@: articulatory synthesis")
+MAN_BEGIN (U"Speaker", U"ppgb", 19980201)
+INTRO (U"One of the @@types of objects@ in Praat. See @@Articulatory synthesis at .")
+ENTRY (U"Speaker commands")
+LIST_ITEM (U"• @@Create Speaker...")
+LIST_ITEM (U"• @@Artword & Speaker: To Sound...@: articulatory synthesis")
 MAN_END
 
-MAN_BEGIN (L"VocalTract", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"A VocalTract object represents the area function of the vocal tract, expressed in m^2, "
+MAN_BEGIN (U"VocalTract", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"A VocalTract object represents the area function of the vocal tract, expressed in m^2, "
 	"running from the glottis to the lips.")
 MAN_END
 
-MAN_BEGIN (L"VocalTract: Formula...", L"ppgb", 20021206)
-INTRO (L"A command for changing the data in all selected @VocalTract objects.")
-NORMAL (L"See the @Formulas tutorial for examples and explanations.")
+MAN_BEGIN (U"VocalTract: Formula...", U"ppgb", 20021206)
+INTRO (U"A command for changing the data in all selected @VocalTract objects.")
+NORMAL (U"See the @Formulas tutorial for examples and explanations.")
 MAN_END
 
 }
diff --git a/artsynth/praat_Artsynth.cpp b/artsynth/praat_Artsynth.cpp
index 4ea4e07..3b3e19b 100644
--- a/artsynth/praat_Artsynth.cpp
+++ b/artsynth/praat_Artsynth.cpp
@@ -1,6 +1,6 @@
 /* praat_Artsynth.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,24 +27,24 @@
 #include "VocalTract_to_Spectrum.h"
 #include "praat.h"
 
-extern "C" Graphics Movie_create (const wchar_t *title, int width, int height);
+extern "C" Graphics Movie_create (const char32 *title, int width, int height);
 
 #undef iam
 #define iam iam_LOOP
 
 /***** ART *****/
 
-FORM (Art_create, L"Create a default Articulation", L"Articulatory synthesis")
-	WORD (L"Name", L"articulation")
-	OK
+FORM (Art_create, U"Create a default Articulation", U"Articulatory synthesis") {
+	WORD (U"Name", U"articulation")
+	OK2
 DO
-	praat_new (Art_create (), GET_STRING (L"Name"));
-END
+	praat_new (Art_create (), GET_STRING (U"Name"));
+END2 }
 
-FORM (Art_edit, L"View & Edit Articulation", 0)
+FORM (Art_edit, U"View & Edit Articulation", 0) {
 	for (int i = 1; i <= kArt_muscle_MAX; i ++)
-		REAL (kArt_muscle_getText (i), L"0.0")
-	OK
+		REAL (kArt_muscle_getText (i), U"0.0")
+	OK2
 {
 	Art object = (Art) ONLY_OBJECT;
 	for (int i = 1; i <= kArt_muscle_MAX; i ++)
@@ -53,350 +53,356 @@ FORM (Art_edit, L"View & Edit Articulation", 0)
 DO
 	Art object = (Art) ONLY_OBJECT;
 	if (theCurrentPraatApplication -> batch)
-		Melder_throw ("Cannot edit an Art from batch.");
+		Melder_throw (U"Cannot edit an Art from batch.");
 	for (int i = 1; i <= kArt_muscle_MAX; i ++)
 		object -> art [i] = GET_REAL (kArt_muscle_getText (i));
-END
+END2 }
 
 /***** ARTWORD *****/
 
-FORM (Artword_create, L"Create an empty Artword", L"Create Artword...")
-	WORD (L"Name", L"hallo")
-	POSITIVE (L"Duration (seconds)", L"1.0")
-	OK
+FORM (Artword_create, U"Create an empty Artword", U"Create Artword...") {
+	WORD (U"Name", U"hallo")
+	POSITIVE (U"Duration (seconds)", U"1.0")
+	OK2
 DO
-	praat_new (Artword_create (GET_REAL (L"Duration")), GET_STRING (L"Name"));
-END
+	praat_new (Artword_create (GET_REAL (U"Duration")).transfer(), GET_STRING (U"Name"));
+END2 }
 
-FORM (Artword_draw, L"Draw one Artword tier", NULL)
-	OPTIONMENU (L"Muscle", kArt_muscle_LUNGS)
+FORM (Artword_draw, U"Draw one Artword tier", NULL) {
+	OPTIONMENU (U"Muscle", kArt_muscle_LUNGS)
 	for (int ienum = 1; ienum <= kArt_muscle_MAX; ienum ++)
 		OPTION (kArt_muscle_getText (ienum))
-	BOOLEAN (L"Garnish", 1)
-	OK
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	
 	autoPraatPicture picture;
 	LOOP {
 		iam (Artword);
-		Artword_draw (me, GRAPHICS, GET_INTEGER (L"Muscle"), GET_INTEGER (L"Garnish"));
+		Artword_draw (me, GRAPHICS, GET_INTEGER (U"Muscle"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-DIRECT (Artword_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit an Artword from batch.");
+DIRECT2 (Artword_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit an Artword from batch.");
 	WHERE (SELECTED) {
 		iam_LOOP (Artword);
 		autoArtwordEditor editor = ArtwordEditor_create (ID_AND_FULL_NAME, me);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-FORM (Artword_getTarget, L"Get one Artword target", 0)
-	REAL (L"Time (seconds)", L"0.0")
-	OPTIONMENU (L"Muscle", kArt_muscle_LUNGS)
+FORM (Artword_getTarget, U"Get one Artword target", 0) {
+	REAL (U"Time (seconds)", U"0.0")
+	OPTIONMENU (U"Muscle", kArt_muscle_LUNGS)
 	for (int ienum = 1; ienum <= kArt_muscle_MAX; ienum ++)
 		OPTION (kArt_muscle_getText (ienum))
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Artword);
-		double target = Artword_getTarget (me, GET_INTEGER (L"Muscle"), GET_REAL (L"Time"));
-		Melder_information (Melder_double (target));
+		double target = Artword_getTarget (me, GET_INTEGER (U"Muscle"), GET_REAL (U"Time"));
+		Melder_information (target);
 	}
-END
+END2 }
 
-DIRECT (Artword_help)
-	Melder_help (L"Artword");
-END
+DIRECT2 (Artword_help) {
+	Melder_help (U"Artword");
+END2 }
 
-FORM (Artword_setTarget, L"Set one Artword target", 0)
-	REAL (L"Time (seconds)", L"0.0")
-	REAL (L"Target value (0-1)", L"0.0")
-	OPTIONMENU (L"Muscle", kArt_muscle_LUNGS)
+FORM (Artword_setTarget, U"Set one Artword target", 0) {
+	REAL (U"Time (seconds)", U"0.0")
+	REAL (U"Target value (0-1)", U"0.0")
+	OPTIONMENU (U"Muscle", kArt_muscle_LUNGS)
 	for (int ienum = 1; ienum <= kArt_muscle_MAX; ienum ++)
 		OPTION (kArt_muscle_getText (ienum))
-	OK
+	OK2
 DO
-	double time = GET_REAL (L"Time");
-	if (time < 0.0) Melder_throw ("Specified time should not be less than 0.");
+	double time = GET_REAL (U"Time");
+	if (time < 0.0) Melder_throw (U"Specified time should not be less than 0.");
 	LOOP {
 		iam (Artword);
-		Artword_setTarget (me, GET_INTEGER (L"Muscle"), time, GET_REAL (L"Target value"));
+		Artword_setTarget (me, GET_INTEGER (U"Muscle"), time, GET_REAL (U"Target value"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (Artword_to_Art, L"From Artword to Art", 0)
-	REAL (L"Time (seconds)", L"0.0")
-	OK
+FORM (Artword_to_Art, U"From Artword to Art", 0) {
+	REAL (U"Time (seconds)", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Artword);
-		autoArt thee = Artword_to_Art (me, GET_REAL (L"Time"));
+		autoArt thee = Artword_to_Art (me, GET_REAL (U"Time"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** ART & SPEAKER *****/
 
-DIRECT (Art_Speaker_draw)
+DIRECT2 (Art_Speaker_draw) {
 	autoPraatPicture picture;
 	iam_ONLY (Art);
 	thouart_ONLY (Speaker);
 	Art_Speaker_draw (me, thee, GRAPHICS);
-END
+END2 }
 
-DIRECT (Art_Speaker_fillInnerContour)
+DIRECT2 (Art_Speaker_fillInnerContour) {
 	autoPraatPicture picture;
 	iam_ONLY (Art);
 	thouart_ONLY (Speaker);
 	Art_Speaker_fillInnerContour (me, thee, GRAPHICS);
-END
+END2 }
 
-DIRECT (Art_Speaker_drawMesh)
+DIRECT2 (Art_Speaker_drawMesh) {
 	autoPraatPicture picture;
 	iam_ONLY (Art);
 	thouart_ONLY (Speaker);
 	Art_Speaker_drawMesh (me, thee, GRAPHICS);
-END
+END2 }
 
-DIRECT (Art_Speaker_to_VocalTract)
+DIRECT2 (Art_Speaker_to_VocalTract) {
 	iam_ONLY (Art);
 	thouart_ONLY (Speaker);
 	autoVocalTract him = Art_Speaker_to_VocalTract (me, thee);
-	praat_new (him.transfer(), my name, L"_", thy name);
-END
+	praat_new (him.transfer(), my name, U"_", thy name);
+END2 }
 
 /***** ARTWORD & SPEAKER *****/
 
-FORM (Artword_Speaker_draw, L"Draw Artword & Speaker", 0)
-	NATURAL (L"Number of steps", L"5")
-	OK
+FORM (Artword_Speaker_draw, U"Draw Artword & Speaker", 0) {
+	NATURAL (U"Number of steps", U"5")
+	OK2
 DO
 	autoPraatPicture picture;
 	iam_ONLY (Artword);
 	thouart_ONLY (Speaker);
-	Artword_Speaker_draw (me, thee, GRAPHICS, GET_INTEGER (L"Number of steps"));
-END
-
-FORM (Artword_Speaker_to_Sound, L"Articulatory synthesizer", L"Artword & Speaker: To Sound...")
-	POSITIVE (L"Sampling frequency (Hz)", L"22050")
-	NATURAL (L"Oversampling factor", L"25")
-	INTEGER (L"Width 1", L"0")
-	INTEGER (L"Width 2", L"0")
-	INTEGER (L"Width 3", L"0")
-	INTEGER (L"Pressure 1", L"0")
-	INTEGER (L"Pressure 2", L"0")
-	INTEGER (L"Pressure 3", L"0")
-	INTEGER (L"Velocity 1", L"0")
-	INTEGER (L"Velocity 2", L"0")
-	INTEGER (L"Velocity 3", L"0")
-	OK
+	Artword_Speaker_draw (me, thee, GRAPHICS, GET_INTEGER (U"Number of steps"));
+END2 }
+
+FORM (Artword_Speaker_to_Sound, U"Articulatory synthesizer", U"Artword & Speaker: To Sound...") {
+	POSITIVE (U"Sampling frequency (Hz)", U"22050")
+	NATURAL (U"Oversampling factor", U"25")
+	INTEGER (U"Width 1", U"0")
+	INTEGER (U"Width 2", U"0")
+	INTEGER (U"Width 3", U"0")
+	INTEGER (U"Pressure 1", U"0")
+	INTEGER (U"Pressure 2", U"0")
+	INTEGER (U"Pressure 3", U"0")
+	INTEGER (U"Velocity 1", U"0")
+	INTEGER (U"Velocity 2", U"0")
+	INTEGER (U"Velocity 3", U"0")
+	OK2
 DO
-	Sound w1, w2, w3, p1, p2, p3, v1, v2, v3;
-	int iw1 = GET_INTEGER (L"Width 1");
-	int iw2 = GET_INTEGER (L"Width 2");
-	int iw3 = GET_INTEGER (L"Width 3");
-	int ip1 = GET_INTEGER (L"Pressure 1");
-	int ip2 = GET_INTEGER (L"Pressure 2");
-	int ip3 = GET_INTEGER (L"Pressure 3");
-	int iv1 = GET_INTEGER (L"Velocity 1");
-	int iv2 = GET_INTEGER (L"Velocity 2");
-	int iv3 = GET_INTEGER (L"Velocity 3");
+	autoSound w1, w2, w3, p1, p2, p3, v1, v2, v3;
+	int iw1 = GET_INTEGER (U"Width 1");
+	int iw2 = GET_INTEGER (U"Width 2");
+	int iw3 = GET_INTEGER (U"Width 3");
+	int ip1 = GET_INTEGER (U"Pressure 1");
+	int ip2 = GET_INTEGER (U"Pressure 2");
+	int ip3 = GET_INTEGER (U"Pressure 3");
+	int iv1 = GET_INTEGER (U"Velocity 1");
+	int iv2 = GET_INTEGER (U"Velocity 2");
+	int iv3 = GET_INTEGER (U"Velocity 3");
 	iam_ONLY (Artword);
 	thouart_ONLY (Speaker);
 	autoSound him = Artword_Speaker_to_Sound (me, thee,
-			GET_REAL (L"Sampling frequency"), GET_INTEGER (L"Oversampling factor"),
+			GET_REAL (U"Sampling frequency"), GET_INTEGER (U"Oversampling factor"),
 			& w1, iw1, & w2, iw2, & w3, iw3,
 			& p1, ip1, & p2, ip2, & p3, ip3,
 			& v1, iv1, & v2, iv2, & v3, iv3);
-	praat_new (him.transfer(), my name, L"_", thy name);
-	if (iw1) praat_new (w1, L"width", Melder_integer (iw1));
-	if (iw2) praat_new (w2, L"width", Melder_integer (iw2));
-	if (iw3) praat_new (w3, L"width", Melder_integer (iw3));
-	if (ip1) praat_new (p1, L"pressure", Melder_integer (ip1));
-	if (ip2) praat_new (p2, L"pressure", Melder_integer (ip2));
-	if (ip3) praat_new (p3, L"pressure", Melder_integer (ip3));
-	if (iv1) praat_new (v1, L"velocity", Melder_integer (iv1));
-	if (iv2) praat_new (v2, L"velocity", Melder_integer (iv2));
-	if (iv3) praat_new (v3, L"velocity", Melder_integer (iv3));
-END
+	praat_new (him.transfer(), my name, U"_", thy name);
+	if (iw1) praat_new (w1.transfer(), U"width", iw1);
+	if (iw2) praat_new (w2.transfer(), U"width", iw2);
+	if (iw3) praat_new (w3.transfer(), U"width", iw3);
+	if (ip1) praat_new (p1.transfer(), U"pressure", ip1);
+	if (ip2) praat_new (p2.transfer(), U"pressure", ip2);
+	if (ip3) praat_new (p3.transfer(), U"pressure", ip3);
+	if (iv1) praat_new (v1.transfer(), U"velocity", iv1);
+	if (iv2) praat_new (v2.transfer(), U"velocity", iv2);
+	if (iv3) praat_new (v3.transfer(), U"velocity", iv3);
+END2 }
 
 /***** ARTWORD & SPEAKER [ & SOUND ] *****/
 
-DIRECT (Artword_Speaker_movie)
-	Graphics g = Movie_create (L"Artword & Speaker movie", 300, 300);
+DIRECT2 (Artword_Speaker_movie) {
+	Graphics g = Movie_create (U"Artword & Speaker movie", 300, 300);
 	iam_ONLY (Artword);
 	thouart_ONLY (Speaker);
 	heis_ONLY (Sound);   // can be null
 	Artword_Speaker_Sound_movie (me, thee, him, g);
-END
+END2 }
 
 /***** SPEAKER *****/
 
-FORM (Speaker_create, L"Create a Speaker", L"Create Speaker...")
-	WORD (L"Name", L"speaker")
-	OPTIONMENU (L"Kind of speaker", 1)
-		OPTION (L"Female")
-		OPTION (L"Male")
-		OPTION (L"Child")
-	OPTIONMENU (L"Number of tubes in glottis", 2)
-		OPTION (L"1")
-		OPTION (L"2")
-		OPTION (L"10")
-	OK
+FORM (Speaker_create, U"Create a Speaker", U"Create Speaker...") {
+	WORD (U"Name", U"speaker")
+	OPTIONMENU (U"Kind of speaker", 1)
+		OPTION (U"Female")
+		OPTION (U"Male")
+		OPTION (U"Child")
+	OPTIONMENU (U"Number of tubes in glottis", 2)
+		OPTION (U"1")
+		OPTION (U"2")
+		OPTION (U"10")
+	OK2
 DO
-	autoSpeaker me = Speaker_create (GET_STRING (L"Kind of speaker"), wcstol (GET_STRING (L"Number of tubes in glottis"), NULL, 10));
-	praat_new (me.transfer(), GET_STRING (L"Name"));
-END
+	autoSpeaker me = Speaker_create (GET_STRING (U"Kind of speaker"), Melder_atoi (GET_STRING (U"Number of tubes in glottis")));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
+END2 }
 
-DIRECT (Speaker_help) Melder_help (L"Speaker"); END
+DIRECT2 (Speaker_help) {
+	Melder_help (U"Speaker");
+END2 }
 
 /***** VOCAL TRACT *****/
 
-FORM (VocalTract_createFromPhone, L"Create Vocal Tract from phone", L"Create Vocal Tract from phone...")
-	OPTIONMENU (L"Phone", 1)
-		OPTION (L"a")
-		OPTION (L"e")
-		OPTION (L"i")
-		OPTION (L"o")
-		OPTION (L"u")
-		OPTION (L"y1")
-		OPTION (L"y2")
-		OPTION (L"y3")
-		OPTION (L"jery")
-		OPTION (L"p")
-		OPTION (L"t")
-		OPTION (L"k")
-		OPTION (L"x")
-		OPTION (L"pa")
-		OPTION (L"ta")
-		OPTION (L"ka")
-		OPTION (L"pi")
-		OPTION (L"ti")
-		OPTION (L"ki")
-		OPTION (L"pu")
-		OPTION (L"tu")
-		OPTION (L"ku")
-	OK
+FORM (VocalTract_createFromPhone, U"Create Vocal Tract from phone", U"Create Vocal Tract from phone...") {
+	OPTIONMENU (U"Phone", 1)
+		OPTION (U"a")
+		OPTION (U"e")
+		OPTION (U"i")
+		OPTION (U"o")
+		OPTION (U"u")
+		OPTION (U"y1")
+		OPTION (U"y2")
+		OPTION (U"y3")
+		OPTION (U"jery")
+		OPTION (U"p")
+		OPTION (U"t")
+		OPTION (U"k")
+		OPTION (U"x")
+		OPTION (U"pa")
+		OPTION (U"ta")
+		OPTION (U"ka")
+		OPTION (U"pi")
+		OPTION (U"ti")
+		OPTION (U"ki")
+		OPTION (U"pu")
+		OPTION (U"tu")
+		OPTION (U"ku")
+	OK2
 DO
-	autoVocalTract me = VocalTract_createFromPhone (GET_STRING (L"Phone"));
-	praat_new (me.transfer(), GET_STRING (L"Phone"));
-END
+	autoVocalTract me = VocalTract_createFromPhone (GET_STRING (U"Phone"));
+	praat_new (me.transfer(), GET_STRING (U"Phone"));
+END2 }
 
-DIRECT (VocalTract_draw)
+DIRECT2 (VocalTract_draw) {
 	autoPraatPicture picture;
 	WHERE (SELECTED) {
 		iam_LOOP (VocalTract);
 		VocalTract_draw (me, GRAPHICS);
 	}
-END
+END2 }
 
-FORM (VocalTract_formula, L"VocalTract Formula", L"Matrix: Formula...")
-	LABEL (L"label", L"`x' is the distance form the glottis in metres, `col' is the section number, `self' is in m\u00B2")
-	LABEL (L"label", L"x := x1;   for col := 1 to ncol do { self [col] := `formula' ; x := x + dx }")
-	TEXTFIELD (L"formula", L"0")
-	OK
+FORM (VocalTract_formula, U"VocalTract Formula", U"Matrix: Formula...") {
+	LABEL (U"label", U"`x' is the distance form the glottis in metres, `col' is the section number, `self' is in m\u00B2")
+	LABEL (U"label", U"x := x1;   for col := 1 to ncol do { self [col] := `formula' ; x := x + dx }")
+	TEXTFIELD (U"formula", U"0")
+	OK2
 DO
 	LOOP {
 		iam (VocalTract);
 		try {
-			Matrix_formula (me, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);
 			throw;
 		}
 	}
-END
+END2 }
 
-DIRECT (VocalTract_help) Melder_help (L"VocalTract"); END
+DIRECT2 (VocalTract_help) {
+	Melder_help (U"VocalTract");
+END2 }
 
-DIRECT (VocalTract_to_Matrix)
+DIRECT2 (VocalTract_to_Matrix) {
 	WHERE (SELECTED) {
 		iam_LOOP (VocalTract);
 		autoMatrix thee = VocalTract_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
-
-FORM (VocalTract_to_Spectrum, L"From Vocal Tract to Spectrum", 0)
-	LABEL (L"", L"Compute transfer function")
-	NATURAL (L"Number of frequencies", L"4097")
-	POSITIVE (L"Maximum frequency (Hz)", L"5000")
-	REAL (L"Glottal damping", L"0.1")
-	BOOLEAN (L"Radiation damping", 1)
-	BOOLEAN (L"Internal damping", 1)
-	OK
+END2 }
+
+FORM (VocalTract_to_Spectrum, U"From Vocal Tract to Spectrum", 0) {
+	LABEL (U"", U"Compute transfer function")
+	NATURAL (U"Number of frequencies", U"4097")
+	POSITIVE (U"Maximum frequency (Hz)", U"5000")
+	REAL (U"Glottal damping", U"0.1")
+	BOOLEAN (U"Radiation damping", 1)
+	BOOLEAN (U"Internal damping", 1)
+	OK2
 DO
 	LOOP {
 		iam (VocalTract);
-		autoSpectrum thee = VocalTract_to_Spectrum (me, GET_INTEGER (L"Number of frequencies"),
-			GET_REAL (L"Maximum frequency"), GET_REAL (L"Glottal damping"),
-			GET_INTEGER (L"Radiation damping"), GET_INTEGER (L"Internal damping"));
+		autoSpectrum thee = VocalTract_to_Spectrum (me, GET_INTEGER (U"Number of frequencies"),
+			GET_REAL (U"Maximum frequency"), GET_REAL (U"Glottal damping"),
+			GET_INTEGER (U"Radiation damping"), GET_INTEGER (U"Internal damping"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (ArticulatorySynthesisTutorial) Melder_help (L"Articulatory synthesis"); END
+DIRECT2 (ArticulatorySynthesisTutorial) {
+	Melder_help (U"Articulatory synthesis");
+END2 }
 
 void manual_Artsynth_init (ManPages me);
 
-void praat_uvafon_Artsynth_init (void);
-void praat_uvafon_Artsynth_init (void) {
+void praat_uvafon_Artsynth_init ();
+void praat_uvafon_Artsynth_init () {
 	Thing_recognizeClassesByName (classArt, classArtword, classSpeaker, NULL);
 
-	praat_addMenuCommand (L"Objects", L"New", L"Articulatory synthesis", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Articulatory synthesis tutorial", 0, 1, DO_ArticulatorySynthesisTutorial);
-	praat_addMenuCommand (L"Objects", L"New", L"-- new articulatory synthesis -- ", 0, 1, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Articulation...", 0, 1, DO_Art_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Speaker...", 0, 1, DO_Speaker_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Artword...", 0, 1, DO_Artword_create);
-	praat_addMenuCommand (L"Objects", L"New", L"-- new vocal tract --", 0, 1, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Vocal Tract from phone...", 0, 1, DO_VocalTract_createFromPhone);
-
-	praat_addAction1 (classArt, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_Art_edit);
-	praat_addAction1 (classArt, 1, L"Edit", 0, praat_HIDDEN, DO_Art_edit);
-
-	praat_addAction1 (classArtword, 0, L"Artword help", 0, 0, DO_Artword_help);
-	praat_addAction1 (classArtword, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_Artword_edit);
-	praat_addAction1 (classArtword, 1, L"Edit", 0, praat_HIDDEN, DO_Artword_edit);
-	praat_addAction1 (classArtword, 0, L"Info", 0, 0, 0);
-	praat_addAction1 (classArtword, 1, L"Get target...", 0, 0, DO_Artword_getTarget);
-	praat_addAction1 (classArtword, 0, L"Draw", 0, 0, 0);
-	praat_addAction1 (classArtword, 0, L"Draw...", 0, 0, DO_Artword_draw);
-	praat_addAction1 (classArtword, 0, L"Modify", 0, 0, 0);
-	praat_addAction1 (classArtword, 1, L"Set target...", 0, 0, DO_Artword_setTarget);
-	praat_addAction1 (classArtword, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classArtword, 0, L"To Art (slice)...", 0, 0, DO_Artword_to_Art);
-
-	praat_addAction2 (classArt, 1, classSpeaker, 1, L"Draw", 0, 0, 0);
-	praat_addAction2 (classArt, 1, classSpeaker, 1, L"Draw", 0, 0, DO_Art_Speaker_draw);
-	praat_addAction2 (classArt, 1, classSpeaker, 1, L"Fill inner contour", 0, 0, DO_Art_Speaker_fillInnerContour);
-	praat_addAction2 (classArt, 1, classSpeaker, 1, L"Draw mesh", 0, 0, DO_Art_Speaker_drawMesh);
-	praat_addAction2 (classArt, 1, classSpeaker, 1, L"Synthesize", 0, 0, 0);
-	praat_addAction2 (classArt, 1, classSpeaker, 1, L"To VocalTract", 0, 0, DO_Art_Speaker_to_VocalTract);
-
-	praat_addAction2 (classArtword, 1, classSpeaker, 1, L"Movie", 0, 0, DO_Artword_Speaker_movie);
-	praat_addAction2 (classArtword, 1, classSpeaker, 1, L"Draw", 0, 0, 0);
-	praat_addAction2 (classArtword, 1, classSpeaker, 1, L"Draw...", 0, 0, DO_Artword_Speaker_draw);
-	praat_addAction2 (classArtword, 1, classSpeaker, 1, L"Synthesize", 0, 0, 0);
-	praat_addAction2 (classArtword, 1, classSpeaker, 1, L"To Sound...", 0, 0, DO_Artword_Speaker_to_Sound);
-
-	praat_addAction3 (classArtword, 1, classSpeaker, 1, classSound, 1, L"Movie", 0, 0, DO_Artword_Speaker_movie);
-
-	praat_addAction1 (classSpeaker, 0, L"Speaker help", 0, 0, DO_Speaker_help);
-
-	praat_addAction1 (classVocalTract, 0, L"VocalTract help", 0, 0, DO_VocalTract_help);
-	praat_addAction1 (classVocalTract, 0, L"Draw", 0, 0, 0);
-	praat_addAction1 (classVocalTract, 0, L"Draw", 0, 0, DO_VocalTract_draw);
-	praat_addAction1 (classVocalTract, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classVocalTract, 0, L"To Spectrum...", 0, 0, DO_VocalTract_to_Spectrum);
-	praat_addAction1 (classVocalTract, 0, L"Modify", 0, 0, 0);
-	praat_addAction1 (classVocalTract, 0, L"Formula...", 0, 0, DO_VocalTract_formula);
-	praat_addAction1 (classVocalTract, 0, L"Hack", 0, 0, 0);
-	praat_addAction1 (classVocalTract, 0, L"To Matrix", 0, 0, DO_VocalTract_to_Matrix);
+	praat_addMenuCommand (U"Objects", U"New", U"Articulatory synthesis", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Articulatory synthesis tutorial", 0, 1, DO_ArticulatorySynthesisTutorial);
+	praat_addMenuCommand (U"Objects", U"New", U"-- new articulatory synthesis -- ", 0, 1, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Articulation...", 0, 1, DO_Art_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Speaker...", 0, 1, DO_Speaker_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Artword...", 0, 1, DO_Artword_create);
+	praat_addMenuCommand (U"Objects", U"New", U"-- new vocal tract --", 0, 1, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Vocal Tract from phone...", 0, 1, DO_VocalTract_createFromPhone);
+
+	praat_addAction1 (classArt, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_Art_edit);
+	praat_addAction1 (classArt, 1, U"Edit", 0, praat_HIDDEN, DO_Art_edit);
+
+	praat_addAction1 (classArtword, 0, U"Artword help", 0, 0, DO_Artword_help);
+	praat_addAction1 (classArtword, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_Artword_edit);
+	praat_addAction1 (classArtword, 1, U"Edit", 0, praat_HIDDEN, DO_Artword_edit);
+	praat_addAction1 (classArtword, 0, U"Info", 0, 0, 0);
+	praat_addAction1 (classArtword, 1, U"Get target...", 0, 0, DO_Artword_getTarget);
+	praat_addAction1 (classArtword, 0, U"Draw", 0, 0, 0);
+	praat_addAction1 (classArtword, 0, U"Draw...", 0, 0, DO_Artword_draw);
+	praat_addAction1 (classArtword, 0, U"Modify", 0, 0, 0);
+	praat_addAction1 (classArtword, 1, U"Set target...", 0, 0, DO_Artword_setTarget);
+	praat_addAction1 (classArtword, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classArtword, 0, U"To Art (slice)...", 0, 0, DO_Artword_to_Art);
+
+	praat_addAction2 (classArt, 1, classSpeaker, 1, U"Draw", 0, 0, 0);
+	praat_addAction2 (classArt, 1, classSpeaker, 1, U"Draw", 0, 0, DO_Art_Speaker_draw);
+	praat_addAction2 (classArt, 1, classSpeaker, 1, U"Fill inner contour", 0, 0, DO_Art_Speaker_fillInnerContour);
+	praat_addAction2 (classArt, 1, classSpeaker, 1, U"Draw mesh", 0, 0, DO_Art_Speaker_drawMesh);
+	praat_addAction2 (classArt, 1, classSpeaker, 1, U"Synthesize", 0, 0, 0);
+	praat_addAction2 (classArt, 1, classSpeaker, 1, U"To VocalTract", 0, 0, DO_Art_Speaker_to_VocalTract);
+
+	praat_addAction2 (classArtword, 1, classSpeaker, 1, U"Movie", 0, 0, DO_Artword_Speaker_movie);
+	praat_addAction2 (classArtword, 1, classSpeaker, 1, U"Draw", 0, 0, 0);
+	praat_addAction2 (classArtword, 1, classSpeaker, 1, U"Draw...", 0, 0, DO_Artword_Speaker_draw);
+	praat_addAction2 (classArtword, 1, classSpeaker, 1, U"Synthesize", 0, 0, 0);
+	praat_addAction2 (classArtword, 1, classSpeaker, 1, U"To Sound...", 0, 0, DO_Artword_Speaker_to_Sound);
+
+	praat_addAction3 (classArtword, 1, classSpeaker, 1, classSound, 1, U"Movie", 0, 0, DO_Artword_Speaker_movie);
+
+	praat_addAction1 (classSpeaker, 0, U"Speaker help", 0, 0, DO_Speaker_help);
+
+	praat_addAction1 (classVocalTract, 0, U"VocalTract help", 0, 0, DO_VocalTract_help);
+	praat_addAction1 (classVocalTract, 0, U"Draw", 0, 0, 0);
+	praat_addAction1 (classVocalTract, 0, U"Draw", 0, 0, DO_VocalTract_draw);
+	praat_addAction1 (classVocalTract, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classVocalTract, 0, U"To Spectrum...", 0, 0, DO_VocalTract_to_Spectrum);
+	praat_addAction1 (classVocalTract, 0, U"Modify", 0, 0, 0);
+	praat_addAction1 (classVocalTract, 0, U"Formula...", 0, 0, DO_VocalTract_formula);
+	praat_addAction1 (classVocalTract, 0, U"Hack", 0, 0, 0);
+	praat_addAction1 (classVocalTract, 0, U"To Matrix", 0, 0, DO_VocalTract_to_Matrix);
 
 	manual_Artsynth_init (theCurrentPraatApplication -> manPages);
 }
diff --git a/contrib/ola/FeatureWeights.cpp b/contrib/ola/FeatureWeights.cpp
index e34994c..c414aba 100644
--- a/contrib/ola/FeatureWeights.cpp
+++ b/contrib/ola/FeatureWeights.cpp
@@ -48,11 +48,11 @@
 
 void structFeatureWeights :: v_info ()
 {
-    this -> structData :: v_info ();
-    MelderInfo_writeLine (L"Number of weights: ", Melder_integer (fweights -> numberOfColumns));
+    this -> structDaata :: v_info ();
+    MelderInfo_writeLine (U"Number of weights: ", fweights -> numberOfColumns);
 }
 
-Thing_implement (FeatureWeights, Data, 0);
+Thing_implement (FeatureWeights, Daata, 0);
 
 /////////////////////////////////////////////////////////////////////////////////////////////
 // Creation...    //
@@ -76,7 +76,7 @@ FeatureWeights FeatureWeights_create
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("FeatureWeights not created.");
+		Melder_throw (U"FeatureWeights not created.");
 	}
 }
 
@@ -172,7 +172,7 @@ FeatureWeights FeatureWeights_computeWrapperInt
 )
 
 {
-	if (! me) return NULL;
+	if (! me) return nullptr;
 
 	try {
 		double pivot = 0.5;
@@ -240,10 +240,10 @@ FeatureWeights FeatureWeights_computeWrapperInt
 		}
 
 		FeatureWeights result = cs [nseeds];
-		cs [nseeds] = NULL;   // prevent destruction
+		cs [nseeds] = nullptr;   // prevent destruction
 		return result;
 	} catch (MelderError) {
-		Melder_throw ("FeatureWeights: wrapper not computed.");
+		Melder_throw (U"FeatureWeights: wrapper not computed.");
 	}
 }
 
@@ -278,7 +278,7 @@ FeatureWeights FeatureWeights_computeWrapperExt
 )
 
 {
-	if (nn == NULL) return NULL;
+	if (! nn) return nullptr;
 
 	try {
 		double pivot = 0.5;
@@ -346,10 +346,10 @@ FeatureWeights FeatureWeights_computeWrapperExt
 		}
 
 		FeatureWeights result = cs [nseeds];
-		cs [nseeds] = NULL;   // prevent destruction
+		cs [nseeds] = nullptr;   // prevent destruction
 		return result;
 	} catch (MelderError) {
-		Melder_throw ("FeatureWeights: wrapper not computed.");
+		Melder_throw (U"FeatureWeights: wrapper not computed.");
 	}
 }
 
diff --git a/contrib/ola/FeatureWeights.h b/contrib/ola/FeatureWeights.h
index 74786a2..d3f0d77 100644
--- a/contrib/ola/FeatureWeights.h
+++ b/contrib/ola/FeatureWeights.h
@@ -44,7 +44,7 @@
 /////////////////////////////////////////////////////
 
 #include "FeatureWeights_def.h"
-oo_CLASS_CREATE (FeatureWeights, Data);
+oo_CLASS_CREATE (FeatureWeights, Daata);
 
 /////////////////////////////////////////////////////
 // Private definitions and macros                  //
diff --git a/contrib/ola/FeatureWeights_def.h b/contrib/ola/FeatureWeights_def.h
index a712620..420a3c6 100644
--- a/contrib/ola/FeatureWeights_def.h
+++ b/contrib/ola/FeatureWeights_def.h
@@ -19,12 +19,12 @@
 
 
 #define ooSTRUCT FeatureWeights
-oo_DEFINE_CLASS (FeatureWeights, Data)
+oo_DEFINE_CLASS (FeatureWeights, Daata)
 	oo_OBJECT (TableOfReal, 0, fweights)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (FeatureWeights)
diff --git a/contrib/ola/KNN.cpp b/contrib/ola/KNN.cpp
index 7ab7df7..4b6df8e 100644
--- a/contrib/ola/KNN.cpp
+++ b/contrib/ola/KNN.cpp
@@ -49,7 +49,7 @@
 #include "KNN_def.h"
 
 
-Thing_implement (KNN, Data, 0);
+Thing_implement (KNN, Daata, 0);
 
 /////////////////////////////////////////////////////////////////////////////////////////////
 // Praat specifics                                                                         //
@@ -57,8 +57,8 @@ Thing_implement (KNN, Data, 0);
 
 void structKNN :: v_info ()
 {
-    structData :: v_info ();
-    MelderInfo_writeLine (L"Size of instancebase: ", Melder_integer (nInstances));
+    structDaata :: v_info ();
+    MelderInfo_writeLine (U"Size of instancebase: ", nInstances);
 }
 
 /////////////////////////////////////////////////////////////////////////////////////////////
@@ -72,7 +72,7 @@ KNN KNN_create ()
         my nInstances = 0;
         return me.transfer();
     } catch (MelderError) {
-		Melder_throw ("KNN classifier not created.");
+		Melder_throw (U"KNN classifier not created.");
 	}
 }
 
@@ -130,7 +130,7 @@ int KNN_learn
 				/*
 				 * Create without change.
 				 */
-                autoPattern tinput = (Pattern) Matrix_appendRows (my input, p, classPattern);
+                autoPattern tinput = (Pattern) Matrix_appendRows (my input, p, classPattern).transfer();
                 autoCategories toutput = (Categories) Collections_merge (my output, c);
 
 				/*
@@ -213,11 +213,11 @@ Categories KNN_classifyToCategories
     long istart = 1;
     long istop = chunksize;
 
-    Categories output = Categories_create();
+    autoCategories output = Categories_create ();
     KNN_input_ToCategories_t ** input = (KNN_input_ToCategories_t **) malloc(nthreads * sizeof(KNN_input_ToCategories_t *));
 
-    if(!input)
-        return(NULL);
+    if (!input)
+        return nullptr;
 
     for(int i = 0; i < nthreads; ++i)
     {
@@ -228,7 +228,7 @@ Categories KNN_classifyToCategories
                 free(input[i]);
 
             free(input);
-            return(NULL);
+            return nullptr;
         }
     }
 
@@ -264,16 +264,16 @@ Categories KNN_classifyToCategories
     if (error)           // Something went very wrong, you ought to inform the user!
     {
         free (error);
-        return NULL;
+        return nullptr;
     }
 
     if (output)
     {
         for (long i = 1; i <= ps->ny; ++i)
-            Collection_addItem (output, Data_copy ((SimpleString) my output -> item [outputindices [i]]));
+            Collection_addItem (output.get(), Data_copy ((SimpleString) my output -> item [outputindices [i]]));
     }
 	NUMvector_free (outputindices, 0);
-    return output;
+    return output.transfer();
 }
 
 void * KNN_classifyToCategoriesAux
@@ -351,7 +351,7 @@ void * KNN_classifyToCategoriesAux
 	NUMvector_free (freqindices, 0);
 	NUMvector_free (distances, 0);
 	NUMvector_free (freqs, 0);
-    return(NULL);
+    return nullptr;
 
 }
 
@@ -393,15 +393,15 @@ TableOfReal KNN_classifyToTableOfReal
 {
     int nthreads = KNN_getNumberOfCPUs();
     long chunksize =  ps->ny / nthreads;
-    Categories uniqueCategories = Categories_selectUniqueItems(my output, 1);
-    long ncategories = Categories_getSize(uniqueCategories);
+    autoCategories uniqueCategories = Categories_selectUniqueItems (my output, 1);
+    long ncategories = Categories_getSize (uniqueCategories.get());
    
-    Melder_assert(nthreads > 0);
-    Melder_assert(ncategories > 0);
-    Melder_assert(k > 0 && k <= my nInstances);
+    Melder_assert (nthreads > 0);
+    Melder_assert (ncategories > 0);
+    Melder_assert (k > 0 && k <= my nInstances);
  
-    if(!ncategories)
-        return(NULL);
+    if (! ncategories)
+        return nullptr;
 
     if(chunksize < 1)
     {
@@ -415,7 +415,7 @@ TableOfReal KNN_classifyToTableOfReal
     KNN_input_ToTableOfReal_t ** input = (KNN_input_ToTableOfReal_t **) malloc(nthreads * sizeof(KNN_input_ToTableOfReal_t *));
     
     if(!input)
-        return(NULL);
+        return nullptr;
 
     TableOfReal output = TableOfReal_create(ps->ny, ncategories);
 
@@ -431,7 +431,7 @@ TableOfReal KNN_classifyToTableOfReal
                 free(input[i]);
 
             free(input);
-            return(NULL);
+            return nullptr;
         }
     }
 
@@ -440,7 +440,7 @@ TableOfReal KNN_classifyToTableOfReal
         input[i]->me = me;
         input[i]->ps = ps;
         input[i]->output = output;
-        input[i]->uniqueCategories = uniqueCategories;
+        input[i]->uniqueCategories = uniqueCategories.transfer();
         input[i]->fws = fws;
         input[i]->k = k;
         input[i]->dist = dist;
@@ -467,7 +467,7 @@ TableOfReal KNN_classifyToTableOfReal
     if(error)           // Something went very wrong, you ought to inform the user!
     {
         free(error);
-        return(NULL);
+        return nullptr;
     }
     return(output);
 }
@@ -550,7 +550,7 @@ void * KNN_classifyToTableOfRealAux
     }
 	NUMvector_free (indices, 0);
 	NUMvector_free (distances, 0);
-    return(NULL);
+    return nullptr;
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////////
@@ -633,11 +633,11 @@ Categories KNN_classifyFold
         outputindices [noutputindices++] = freqindices [KNN_max (freqs.peek(), ncategories)];
     }
 
-    Categories output = Categories_create ();
+	autoCategories output = Categories_create ();
 	for (long o = 0; o < noutputindices; o ++) {
-		Collection_addItem (output, Data_copy ((SimpleString) my output -> item [outputindices [o]]));
+		Collection_addItem (output.get(), Data_copy ((SimpleString) my output -> item [outputindices [o]]));
 	}
-	return output;
+	return output.transfer();
 }
 
 /////////////////////////////////////////////////////////////////////////////////////////////
@@ -826,7 +826,7 @@ double KNN_modelSearch
 
 		return best.performance;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", fws, ": model search not performed.");
+		Melder_throw (me, U" & ", fws, U": model search not performed.");
 	}
 }
 
@@ -1310,7 +1310,7 @@ long KNN_kUniqueEnemies
     Melder_assert (jy <= j->ny);
 	Melder_assert (k <= p->ny);
 	Melder_assert (k > 0);
-    Melder_assert (indices != NULL);
+    Melder_assert (indices);
 
     while (dc < k && py <= p->ny)
     {
@@ -1602,7 +1602,7 @@ Permutation KNN_SA_ToPermutation
                     KNN_SA_t_energy, 
                     KNN_SA_t_step, 
                     KNN_SA_t_metric, 
-                    NULL,                // KNN_SA_t_print, 
+                    nullptr,                // KNN_SA_t_print
                     KNN_SA_t_copy, 
                     KNN_SA_t_copy_construct, 
                     KNN_SA_t_destroy, 
@@ -1676,10 +1676,10 @@ double KNN_SA_t_metric
 }
 
 void KNN_SA_t_print (void * istruct) {
-    Melder_casual ("\n");
+    Melder_casual (U"\n");
     for (long i = 1; i <= ((KNN_SA_t *) istruct) -> p -> ny; i ++)
-        Melder_casual ("%ld,", ((KNN_SA_t *) istruct) -> indices [i]);
-    Melder_casual ("\n");
+        Melder_casual (((KNN_SA_t *) istruct) -> indices [i]);
+    Melder_casual (U"\n");
 }
 
 void KNN_SA_t_step
diff --git a/contrib/ola/KNN.h b/contrib/ola/KNN.h
index b5fea78..e535d6b 100644
--- a/contrib/ola/KNN.h
+++ b/contrib/ola/KNN.h
@@ -48,7 +48,7 @@
 /////////////////////////////////////////////////////
 
 #include "KNN_def.h"
-oo_CLASS_CREATE (KNN, Data);
+oo_CLASS_CREATE (KNN, Daata);
 
 /////////////////////////////////////////////////////
 // Private definitions and macros                  //
@@ -84,7 +84,7 @@ oo_CLASS_CREATE (KNN, Data);
 /////////////////////////////////////////////////////
 
 // a near-dummy function
-KNN KNN_create(void);
+KNN KNN_create ();
 
 // Learning
 int KNN_learn
diff --git a/contrib/ola/KNN_def.h b/contrib/ola/KNN_def.h
index 74444d9..1d0faa2 100644
--- a/contrib/ola/KNN_def.h
+++ b/contrib/ola/KNN_def.h
@@ -21,7 +21,7 @@
 #include "Pattern.h"
 
 #define ooSTRUCT KNN
-oo_DEFINE_CLASS (KNN, Data)
+oo_DEFINE_CLASS (KNN, Daata)
 	oo_LONG (nInstances)
 	oo_OBJECT (Pattern, 2, input)
 	oo_OBJECT (Categories, 0, output)
diff --git a/contrib/ola/KNN_threads.cpp b/contrib/ola/KNN_threads.cpp
index 58a970b..313a278 100644
--- a/contrib/ola/KNN_threads.cpp
+++ b/contrib/ola/KNN_threads.cpp
@@ -1,4 +1,4 @@
-/* KNN_threads.c
+/* KNN_threads.cpp
  *
  * Copyright (C) 2009 Ola Söder
  *
@@ -55,7 +55,7 @@
 // KNN_getNumberOfCPUs                             //
 /////////////////////////////////////////////////////
 
-int KNN_getNumberOfCPUs(void)
+int KNN_getNumberOfCPUs ()
 {
     return(1);
     
@@ -97,8 +97,8 @@ int KNN_getNumberOfCPUs(void)
     if(!Glpi) 
         return(1);
     
-    done = FALSE;
-    buffer = NULL;
+    done = false;
+    buffer = nullptr;
     returnLength = 0;
 
     while(!done) 
@@ -112,7 +112,7 @@ int KNN_getNumberOfCPUs(void)
                     free(buffer);
                 return (1);
             } 
-            else done = TRUE;
+            else done = true;
         }
         byteOffset = 0;
         ptr=buffer;
@@ -169,7 +169,7 @@ void * KNN_threadDistribution
         /*
         HANDLE hHandle[nthreads];
         for(int i = 0; i < nthreds; ++)
-            hHandle[i] = CreateThread(NULL, 0, function, input[i], 0, NULL);    
+            hHandle[i] = CreateThread(nullptr, 0, function, input[i], 0, nullptr);
         while(nthreads--)
             WaitForSingleObject(hHandle[nthreds], INFINITE);
         */
@@ -178,10 +178,10 @@ void * KNN_threadDistribution
         /*
         pthread_t thread_ids[nthreads];
         for(int i = 0; i < nthreads; ++i)
-            pthread_create(&thread_ids[i], NULL, function, input[i]);
+            pthread_create(&thread_ids[i], nullptr, function, input[i]);
         while(nthreads--)
-            pthread_join(thread_ids[nthreads], NULL);
-        return(NULL);
+            pthread_join(thread_ids[nthreads], nullptr);
+        return nullptr;
         */
 #endif
 	}
@@ -195,7 +195,7 @@ void * KNN_threadDistribution
 // KNN_threadTest                                  //
 /////////////////////////////////////////////////////
 
-void KNN_threadTest(void)
+void KNN_threadTest ()
 {
     void * dummy[KNN_getNumberOfCPUs()];
     KNN_threadDistribution(KNN_threadTestAux, (void **) &dummy, KNN_getNumberOfCPUs());
@@ -207,14 +207,14 @@ void KNN_threadTest(void)
 // KNN_threadTestAux                               //
 /////////////////////////////////////////////////////
 
-void * KNN_threadTestAux(void * dummy)
+void * KNN_threadTestAux (void * dummy)
 {
-    dummy = NULL; // dummy assignment to avoid compiler warnings;
+    dummy = nullptr; // dummy assignment to avoid compiler warnings;
 
     for(int i = 0; i < 50000; ++i)
         for(int i = 0; i < 50000; ++i) ;
 
-    return(NULL);
+    return nullptr;
 }
 
 
diff --git a/contrib/ola/KNN_threads.h b/contrib/ola/KNN_threads.h
index a50a805..f57476c 100644
--- a/contrib/ola/KNN_threads.h
+++ b/contrib/ola/KNN_threads.h
@@ -37,7 +37,7 @@ enum KNN_thread_status
 };
 
 // Query the number of available CPUs
-int KNN_getNumberOfCPUs(void);
+int KNN_getNumberOfCPUs ();
 
 // Distribute the work specified by 
 // (*function) and input over nthreads 
@@ -50,7 +50,7 @@ void * KNN_threadDistribution
 );
 
 // Test threading
-void KNN_threadTest(void);
+void KNN_threadTest ();
 
 // Test threading aux
 void * KNN_threadTestAux
diff --git a/contrib/ola/Pattern_to_Categories_cluster.cpp b/contrib/ola/Pattern_to_Categories_cluster.cpp
index 1c66b55..75e904e 100644
--- a/contrib/ola/Pattern_to_Categories_cluster.cpp
+++ b/contrib/ola/Pattern_to_Categories_cluster.cpp
@@ -72,7 +72,7 @@ Categories Pattern_to_Categories_cluster
 		{
 			double delta;
 			long nfriends  = 0;
-			Melder_progress (1 - (progress - m) / progress, L"");
+			Melder_progress (1 - (progress - m) / progress, U"");
 
 			for (long y = 1; y <= centroids->ny; y++)
 			{
@@ -149,7 +149,7 @@ Categories Pattern_to_Categories_cluster
 					}
 				}
 			}
-			while (delta);
+			while (delta != 0.0);
 
 			double smax = sizes [1];
 			double smin = sizes [1];
diff --git a/contrib/ola/manual_KNN.cpp b/contrib/ola/manual_KNN.cpp
index 7aed770..965ec15 100644
--- a/contrib/ola/manual_KNN.cpp
+++ b/contrib/ola/manual_KNN.cpp
@@ -30,529 +30,529 @@ void manual_KNN_init (ManPages me);
 
 void manual_KNN_init (ManPages me)
 {
-MAN_BEGIN (L"kNN classifiers", L"Ola Söder", 20080529)
-INTRO (L"This tutorial describes the use of kNN classifiers in Praat.")
-NORMAL (L"@@kNN classifiers 1. What is a kNN classifier?|1. What is a kNN classifier?@")
-NORMAL (L"@@kNN classifiers 1.1. Improving classification accuracy|1.1. Improving classification accuracy@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting|1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1.1. Filter-based feature weighting|1.1.1.1. Filter-based feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting|1.1.1.2. Wrapper-based feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.2. Model selection|1.1.2. Model selection@")
-NORMAL (L"@@kNN classifiers 1.2. Improving resource efficiency|1.2. Improving resource efficiency@")
-LIST_ITEM (L"@@kNN classifiers 1.2.1. Pruning|1.2.1. Pruning@")
-NORMAL (L"@@kNN classifiers 2. Quick start|2. Quick start@")
-NORMAL (L"@@kNN classifiers 3. Command overview|3. Command overview@")
-MAN_END
-
-MAN_BEGIN (L"KNN", L"Ola Söder", 20080529)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"A #KNN classifier can %learn associations between its %input and its %output. "
+MAN_BEGIN (U"kNN classifiers", U"Ola Söder", 20080529)
+INTRO (U"This tutorial describes the use of kNN classifiers in Praat.")
+NORMAL (U"@@kNN classifiers 1. What is a kNN classifier?|1. What is a kNN classifier?@")
+NORMAL (U"@@kNN classifiers 1.1. Improving classification accuracy|1.1. Improving classification accuracy@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting|1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1.1. Filter-based feature weighting|1.1.1.1. Filter-based feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting|1.1.1.2. Wrapper-based feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.2. Model selection|1.1.2. Model selection@")
+NORMAL (U"@@kNN classifiers 1.2. Improving resource efficiency|1.2. Improving resource efficiency@")
+LIST_ITEM (U"@@kNN classifiers 1.2.1. Pruning|1.2.1. Pruning@")
+NORMAL (U"@@kNN classifiers 2. Quick start|2. Quick start@")
+NORMAL (U"@@kNN classifiers 3. Command overview|3. Command overview@")
+MAN_END
+
+MAN_BEGIN (U"KNN", U"Ola Söder", 20080529)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"A #KNN classifier can %learn associations between its %input and its %output. "
 	"The @@kNN classifiers@ tutorial gives you an introduction to the usage of %%k%NN learners in Praat.")
 MAN_END
 
-MAN_BEGIN (L"FeatureWeights", L"Ola Söder", 20080729)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"A @FeatureWeights object is a %d-dimensional vector containing weight values used to transform a %d-dimensional space. Feature weighting can be used to improve the classifcation accuracy of @KNN classifiers. It can also be used to generate a @Dissimilarity matrix from a @Pattern object. @Dissimilarity matrices in conjunction with @@Multidimensional scaling|MDS-analysis@ can aid the visualization of high-dimensional data.")
+MAN_BEGIN (U"FeatureWeights", U"Ola Söder", 20080729)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"A @FeatureWeights object is a %d-dimensional vector containing weight values used to transform a %d-dimensional space. Feature weighting can be used to improve the classifcation accuracy of @KNN classifiers. It can also be used to generate a @Dissimilarity matrix from a @Pattern object. @Dissimilarity matrices in conjunction with @@Multidimensional scaling|MDS-analysis@ can aid the visualization of high-dimensional data.")
 MAN_END
 
-MAN_BEGIN (L"kNN classifiers 1. What is a kNN classifier?", L"Ola Söder", 20080529)
-NORMAL (L"%%Instance-based% classifiers such as the %%k%NN classifier operate on the premises that classification of unknown instances "
+MAN_BEGIN (U"kNN classifiers 1. What is a kNN classifier?", U"Ola Söder", 20080529)
+NORMAL (U"%%Instance-based% classifiers such as the %%k%NN classifier operate on the premises that classification of unknown instances "
 	"can be done by relating the unknown to the known according to some @@Euclidean distance|distance/similarity function at . "
 	"The intuition is that two instances far apart in the %%instance space% defined by the appropriate %%distance function% are less likely "
 	"than two closely situated instances to belong to the same class.")
-ENTRY (L"The learning process")
-NORMAL (L"Unlike many artificial learners, %%instance-based% learners do not abstract any information from the training data during the learning phase. "
+ENTRY (U"The learning process")
+NORMAL (U"Unlike many artificial learners, %%instance-based% learners do not abstract any information from the training data during the learning phase. "
 	"Learning is merely a question of encapsulating the training data. The process of %generalization is postponed until it is absolutely unavoidable, "
 	"that is, at the time of %classification. This property has lead to the referring to %%instance-based% learners as %lazy learners, "
 	"whereas classifiers such as @@Feedforward neural networks 1. What is a feedforward neural network?|feedforward neural networks@, "
 	"where proper %abstraction is done during the learning phase, often are entitled %eager learners.")
-ENTRY (L"Classification")
-NORMAL (L"Classification (%generalization) using an %%instance-based% classifier can be a simple matter of locating the nearest neighbour in %%instance space% "
+ENTRY (U"Classification")
+NORMAL (U"Classification (%generalization) using an %%instance-based% classifier can be a simple matter of locating the nearest neighbour in %%instance space% "
 	"and labelling the unknown instance with the same class label as that of the located (known) neighbour. "
 	"This approach is often referred to as a %%nearest neighbour classifier%. "
 	"The downside of this simple approach is the lack of robustness that characterize the resulting classifiers. "
 	"The high degree of local sensitivity makes %%nearest neighbour classifiers% highly susceptible to noise in the training data.")
-NORMAL (L"More robust models can be achieved by locating %k, where %k > 1, neighbours and letting the majority vote decide the outcome of the class labelling. "
+NORMAL (U"More robust models can be achieved by locating %k, where %k > 1, neighbours and letting the majority vote decide the outcome of the class labelling. "
 	"A higher value of %k results in a smoother, less locally sensitive, function. "
 	"The %%nearest neighbour classifier% can be regarded as a special case of the more general %%k-nearest neighbours classifier%, "
 	"hereafter referred to as a %%k%NN classifier. The drawback of increasing the value of %k is of course that as %k approaches %n, "
 	"where %n is the size of the %%instance base%, the performance of the classifier will approach that of the most straightforward %%statistical baseline%, "
 	"the assumption that all unknown instances belong to the class most most frequently represented in the training data.")
-NORMAL (L"This problem can be avoided by limiting the influence of distant instances. "
+NORMAL (U"This problem can be avoided by limiting the influence of distant instances. "
 	"One way of doing so is to assign a weight to each vote, where the weight is a function of the distance between the unknown and the known instance. "
 	"By letting each weight be defined by the inversed squared distance between the known and unknown instances votes cast by distant instances "
 	"will have very little influence on the decision process compared to instances in the near neighbourhood. "
 	"%%Distance weighted voting% usually serves as a good middle ground as far as local sensitivity is concerned.")
 MAN_END
 
-MAN_BEGIN (L"kNN classifiers 1.1. Improving classification accuracy", L"Ola Söder", 20080529)
-NORMAL (L"This tutorial describes possible ways of improving the classification accuracy of a %%k%NN classifier.")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting|1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.2. Model selection|1.1.2. Model selection@")
+MAN_BEGIN (U"kNN classifiers 1.1. Improving classification accuracy", U"Ola Söder", 20080529)
+NORMAL (U"This tutorial describes possible ways of improving the classification accuracy of a %%k%NN classifier.")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting|1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.2. Model selection|1.1.2. Model selection@")
 MAN_END
 
-MAN_BEGIN (L"kNN classifiers 1.1.1. Feature weighting", L"Ola Söder", 20080529)
-NORMAL (L"A %%k%NN classifier in its most basic form operates under the implicit assumption that all features are of equal value as far as the classification problem at hand is concerned. When irrelevant and noisy features influence the neighbourhood search to the same degree as highly relevant features, the accuracy of the model is likely to deteriorate. %%Feature weighting% is a technique used to approximate the optimal degree of influence of individual features using a training set. W [...]
-NORMAL (L"Two fundamentally different approaches to this optimization problem can be identified, the %%filter-based% and the %%wrapper-based%. The class of %%filter-based% methods contains algorithms that use no input other than the training data itself to calculate the %%feature weights%, whereas %%wrapper-based% algorithms use feedback from a classifier to guide the search. %%Wrapper-based% algorithms are inherently more powerful than their filter-based counterpart as they implicitly t [...]
-NORMAL (L"In @@kNN classifiers 1.1.1.1. Filter-based feature weighting|section 1.1.1.1.@ the %%filter-based% feature weighting algorithm implemented in Praat is presented. @@kNN classifiers 1.1.1.2. Wrapper-based feature weighting|Section 1.1.1.2.@ contains an account of the implemented %%wrapper-based% feature weighting algorithm.")
+MAN_BEGIN (U"kNN classifiers 1.1.1. Feature weighting", U"Ola Söder", 20080529)
+NORMAL (U"A %%k%NN classifier in its most basic form operates under the implicit assumption that all features are of equal value as far as the classification problem at hand is concerned. When irrelevant and noisy features influence the neighbourhood search to the same degree as highly relevant features, the accuracy of the model is likely to deteriorate. %%Feature weighting% is a technique used to approximate the optimal degree of influence of individual features using a training set. W [...]
+NORMAL (U"Two fundamentally different approaches to this optimization problem can be identified, the %%filter-based% and the %%wrapper-based%. The class of %%filter-based% methods contains algorithms that use no input other than the training data itself to calculate the %%feature weights%, whereas %%wrapper-based% algorithms use feedback from a classifier to guide the search. %%Wrapper-based% algorithms are inherently more powerful than their filter-based counterpart as they implicitly t [...]
+NORMAL (U"In @@kNN classifiers 1.1.1.1. Filter-based feature weighting|section 1.1.1.1.@ the %%filter-based% feature weighting algorithm implemented in Praat is presented. @@kNN classifiers 1.1.1.2. Wrapper-based feature weighting|Section 1.1.1.2.@ contains an account of the implemented %%wrapper-based% feature weighting algorithm.")
 MAN_END
 
-MAN_BEGIN (L"kNN classifiers 1.1.1.1. Filter-based feature weighting", L"Ola Söder", 20080529)
-NORMAL (L"The %%filter-based% %%feature weighting% algorithm implemented in Praat is an extended version of the well known R\\s{ELIEF} algorithm, R\\s{ELIEF-F}, such as it is presented (with one minor exception, see below) in @@Igor Kononenko (1994)|Kononenko (1994)@. Unlike the original R\\s{ELIEF} algorithm, the R\\s{ELIEF-F} algorithm copes with multi class (as in more than 2 classes) data sets. The simple intuition behind the R\\s{ELIEF-F} algorithm is that a good feature is a featur [...]
-NORMAL (L"The computation of the weight vector is done in an iterative fashion, with all weights initially set to 0. All features in the training set are normalized (all values are set within the range [0 ... 1]) and thereafter used to update the weight vector as follows: On each iteration a random instance is chosen. The nearest hit is located, where hit is an instance of the same class as that of the randomly chosen instance. The nearest misses of all the classes but that of the random [...]
-NORMAL (L"The implementation of R\\s{ELIEF-F} found in Praat differs slightly from the algorithm described. Instances are not randomly chosen, instead all instances are used to update the weight vector. This simplification is of no concern unless massive data sets are used, in which case the Praat approach would be no less precise, but needlessly slow.")
+MAN_BEGIN (U"kNN classifiers 1.1.1.1. Filter-based feature weighting", U"Ola Söder", 20080529)
+NORMAL (U"The %%filter-based% %%feature weighting% algorithm implemented in Praat is an extended version of the well known R\\s{ELIEF} algorithm, R\\s{ELIEF-F}, such as it is presented (with one minor exception, see below) in @@Igor Kononenko (1994)|Kononenko (1994)@. Unlike the original R\\s{ELIEF} algorithm, the R\\s{ELIEF-F} algorithm copes with multi class (as in more than 2 classes) data sets. The simple intuition behind the R\\s{ELIEF-F} algorithm is that a good feature is a featur [...]
+NORMAL (U"The computation of the weight vector is done in an iterative fashion, with all weights initially set to 0. All features in the training set are normalized (all values are set within the range [0 ... 1]) and thereafter used to update the weight vector as follows: On each iteration a random instance is chosen. The nearest hit is located, where hit is an instance of the same class as that of the randomly chosen instance. The nearest misses of all the classes but that of the random [...]
+NORMAL (U"The implementation of R\\s{ELIEF-F} found in Praat differs slightly from the algorithm described. Instances are not randomly chosen, instead all instances are used to update the weight vector. This simplification is of no concern unless massive data sets are used, in which case the Praat approach would be no less precise, but needlessly slow.")
 MAN_END
 
-MAN_BEGIN (L"kNN classifiers 1.1.1.2. Wrapper-based feature weighting", L"Ola Söder", 20090123)
-NORMAL (L"The %%wrapper-based% %%feature weighting% algorithm implemented in Praat attempts to find the globally optimal feature weights by means of a greedy local search. The local neighbourhood is defined by a number of random seeds centered around a pivot seed. For each iteration of the algorithm the best performing seed is chosen to be the pivot of the next iteration. At the same time the maximum allowed distance between a seed and the pivot is decreased by a constant factor. Given a [...]
-NORMAL (L"Given reasonable parameter settings, the search algorithm on average gives good results without huge memory and CPU requirements. The strong point of the method, the ability to efficiently do a rather thorough search of the weight space, can, as mentioned in @@kNN classifiers 1.1.1. Feature weighting|section 1.1.1.@, lead to overfitting. One way of minimizing this problem is to constrain the algorithm by means of %%early stopping%. In Praat this is done in a very naive fashion, [...]
+MAN_BEGIN (U"kNN classifiers 1.1.1.2. Wrapper-based feature weighting", U"Ola Söder", 20090123)
+NORMAL (U"The %%wrapper-based% %%feature weighting% algorithm implemented in Praat attempts to find the globally optimal feature weights by means of a greedy local search. The local neighbourhood is defined by a number of random seeds centered around a pivot seed. For each iteration of the algorithm the best performing seed is chosen to be the pivot of the next iteration. At the same time the maximum allowed distance between a seed and the pivot is decreased by a constant factor. Given a [...]
+NORMAL (U"Given reasonable parameter settings, the search algorithm on average gives good results without huge memory and CPU requirements. The strong point of the method, the ability to efficiently do a rather thorough search of the weight space, can, as mentioned in @@kNN classifiers 1.1.1. Feature weighting|section 1.1.1.@, lead to overfitting. One way of minimizing this problem is to constrain the algorithm by means of %%early stopping%. In Praat this is done in a very naive fashion, [...]
 MAN_END
 
-MAN_BEGIN (L"kNN classifiers 1.1.2. Model selection", L"Ola Söder", 20080529)
-NORMAL (L"%%Model selection% is the process of choosing classifier parameters suitable for the classification task at hand. In most cases this is done manually in an experimental fashion.")
-NORMAL (L"The search for the optimal model can also be automated. In Praat this is done by means of the same @@kNN classifiers 1.1.1.2. Wrapper-based feature weighting|greedy local search algorithm@ used to search the weight space for feature weights. The %%model selection% search implementation in Praat lets the user limit the search space with respect to the parameter %k. By setting a maximum allowed value of %k the search space can be shrunk considerably.")
-NORMAL (L"Due to its discrete (%k) and nominal (vote weighting) nature, the size of the search space is normally of no concern, making an experimental/manual search tractable. The %%model selection% feature of Praat becomes an essential tool only when applied to huge instance bases where the expected optimal value of %k is high. In most cases however, manual experimenting will suffice.")
+MAN_BEGIN (U"kNN classifiers 1.1.2. Model selection", U"Ola Söder", 20080529)
+NORMAL (U"%%Model selection% is the process of choosing classifier parameters suitable for the classification task at hand. In most cases this is done manually in an experimental fashion.")
+NORMAL (U"The search for the optimal model can also be automated. In Praat this is done by means of the same @@kNN classifiers 1.1.1.2. Wrapper-based feature weighting|greedy local search algorithm@ used to search the weight space for feature weights. The %%model selection% search implementation in Praat lets the user limit the search space with respect to the parameter %k. By setting a maximum allowed value of %k the search space can be shrunk considerably.")
+NORMAL (U"Due to its discrete (%k) and nominal (vote weighting) nature, the size of the search space is normally of no concern, making an experimental/manual search tractable. The %%model selection% feature of Praat becomes an essential tool only when applied to huge instance bases where the expected optimal value of %k is high. In most cases however, manual experimenting will suffice.")
 MAN_END
 
-MAN_BEGIN (L"kNN classifiers 1.2. Improving resource efficiency", L"Ola Söder", 20080529)
-NORMAL (L"%%Instance-based% learners such as the %%k%NN classifier implemented in Praat are fairly inefficient as far as CPU and memory usage is concerned. The performance can be improved upon by making sure that only those instances that are vital for the accuracy of the classifier are stored and that non-vital instances are disposed of. Praat does give the user the possibility to prune non-vital or harmful instances, making the resulting classifier less memory and CPU hungry and in som [...]
+MAN_BEGIN (U"kNN classifiers 1.2. Improving resource efficiency", U"Ola Söder", 20080529)
+NORMAL (U"%%Instance-based% learners such as the %%k%NN classifier implemented in Praat are fairly inefficient as far as CPU and memory usage is concerned. The performance can be improved upon by making sure that only those instances that are vital for the accuracy of the classifier are stored and that non-vital instances are disposed of. Praat does give the user the possibility to prune non-vital or harmful instances, making the resulting classifier less memory and CPU hungry and in som [...]
 MAN_END
 
-MAN_BEGIN (L"kNN classifiers 1.2.1. Pruning", L"Ola Söder", 20080529)
-NORMAL (L"Pruning is the process of discarding instances that do not improve upon the classification accuracy of the classifier. This group of instances includes noisy instances that, at best, make no difference as far as model accuracy is concerned, at worst, induces classification errors. It also includes instances that are redundant; instances that are implied by the defined neighbourhood.")
+MAN_BEGIN (U"kNN classifiers 1.2.1. Pruning", U"Ola Söder", 20080529)
+NORMAL (U"Pruning is the process of discarding instances that do not improve upon the classification accuracy of the classifier. This group of instances includes noisy instances that, at best, make no difference as far as model accuracy is concerned, at worst, induces classification errors. It also includes instances that are redundant; instances that are implied by the defined neighbourhood.")
 
-ENTRY (L"The C-Pruner algorithm")
+ENTRY (U"The C-Pruner algorithm")
 
-NORMAL (L"The C-Pruner algorithm such as it is presented in @@Ke-Ping Zhao et al. (2003)|Zhao et al. (2003)@ identifies pruning candidates and computes the order in which these candidates shall be removed. The ordering is of vital importance since the removal of one candidate might disqualify other candidates, making them non-prunable. In order to understand how the C-Pruner algorithm operates a few definitions are necessary:")
+NORMAL (U"The C-Pruner algorithm such as it is presented in @@Ke-Ping Zhao et al. (2003)|Zhao et al. (2003)@ identifies pruning candidates and computes the order in which these candidates shall be removed. The ordering is of vital importance since the removal of one candidate might disqualify other candidates, making them non-prunable. In order to understand how the C-Pruner algorithm operates a few definitions are necessary:")
 
-LIST_ITEM (L"\\bu The %k-reachability set of an instance %p consists of the %k nearest neighbours of %p")
+LIST_ITEM (U"\\bu The %k-reachability set of an instance %p consists of the %k nearest neighbours of %p")
 
-LIST_ITEM (L"\\bu The %k-coverage set of an instance %p consists of those instances of the same class as that of %p having %p as one of their %k nearest neighbours.")
+LIST_ITEM (U"\\bu The %k-coverage set of an instance %p consists of those instances of the same class as that of %p having %p as one of their %k nearest neighbours.")
 
-LIST_ITEM (L"\\bu An instance %p is superfluous if it is implied by %k-reachability, that is, if it can be correctly classified using %k-reachability as instance base.")
+LIST_ITEM (U"\\bu An instance %p is superfluous if it is implied by %k-reachability, that is, if it can be correctly classified using %k-reachability as instance base.")
 
-LIST_ITEM (L"\\bu An instance %p is critical if at least one instance in the %k-coverage set of %p is not implied by the %k-reachability set of %p or, after %p is deleted, atleast one instance in the %k-coverage set of %p is not implied by the %k-reachability set of %p.")
+LIST_ITEM (U"\\bu An instance %p is critical if at least one instance in the %k-coverage set of %p is not implied by the %k-reachability set of %p or, after %p is deleted, atleast one instance in the %k-coverage set of %p is not implied by the %k-reachability set of %p.")
 
-LIST_ITEM (L"\\bu An instance %p is noisy if %p isn't superfluous and the %k-reachability set of %p is bigger than the %k-coverage set of %p.")
+LIST_ITEM (U"\\bu An instance %p is noisy if %p isn't superfluous and the %k-reachability set of %p is bigger than the %k-coverage set of %p.")
 
-NORMAL (L"Given these definitions, an instance is tagged for pruning if one of the following conditions hold: It is noisy, or it is superfluous but not critical. This translates to the discarding of instances that are bad class predictors (noise) and of instances that are highly typical of their class and thus are located close to the center of the cluster defining the given class. Instances located close to the class center are very likely implied by the surrounding border instances and [...]
+NORMAL (U"Given these definitions, an instance is tagged for pruning if one of the following conditions hold: It is noisy, or it is superfluous but not critical. This translates to the discarding of instances that are bad class predictors (noise) and of instances that are highly typical of their class and thus are located close to the center of the cluster defining the given class. Instances located close to the class center are very likely implied by the surrounding border instances and [...]
 
-LIST_ITEM (L"\\bu If the %k-reachability set of %p__i_ contains more instances of the same class as that of %p__i_ than the corresponding value for %p__j_ then %p__i_ should be removed before %p__j_.")
+LIST_ITEM (U"\\bu If the %k-reachability set of %p__i_ contains more instances of the same class as that of %p__i_ than the corresponding value for %p__j_ then %p__i_ should be removed before %p__j_.")
 
-LIST_ITEM (L"\\bu If the %k-reachability set of %p__i_ contains the same number of instances of the same class as that of %p__i_ as the corresponding value for %p__j_ and the distance between %p__i_ and the closest instance of a class different from the class of %p__i_ is greater than the corresponding value for %p__j_ then %p__i_ should be removed before %p__j_.")
+LIST_ITEM (U"\\bu If the %k-reachability set of %p__i_ contains the same number of instances of the same class as that of %p__i_ as the corresponding value for %p__j_ and the distance between %p__i_ and the closest instance of a class different from the class of %p__i_ is greater than the corresponding value for %p__j_ then %p__i_ should be removed before %p__j_.")
 
-LIST_ITEM (L"\\bu If the %k-reachability set of %p__i_ contains the same number of instances of the same class as that of %p__i_ as the corresponding value for %p__j_ and the distance between %p__i_ and the closest instance of a class different from the class of %p__i_ equals the corresponding value for %p__j_ then the order of removal is decided randomly.")
+LIST_ITEM (U"\\bu If the %k-reachability set of %p__i_ contains the same number of instances of the same class as that of %p__i_ as the corresponding value for %p__j_ and the distance between %p__i_ and the closest instance of a class different from the class of %p__i_ equals the corresponding value for %p__j_ then the order of removal is decided randomly.")
 
-NORMAL (L"In order to gain control of the degree of pruning the Praat implementation of the C-Pruner algorithm decides whether to prune or not prune a given instance tagged for pruning on a probabilistic basis. This makes it possible for the user to specify the hardness of the pruning process (e.g. 100 percent (exp.) noise, 50 percent (exp.) redundancy) to be able to find a good compromise between model accuracy and resource requirements.")
+NORMAL (U"In order to gain control of the degree of pruning the Praat implementation of the C-Pruner algorithm decides whether to prune or not prune a given instance tagged for pruning on a probabilistic basis. This makes it possible for the user to specify the hardness of the pruning process (e.g. 100 percent (exp.) noise, 50 percent (exp.) redundancy) to be able to find a good compromise between model accuracy and resource requirements.")
 MAN_END
 
-MAN_BEGIN (L"kNN classifiers 2. Quick start", L"Ola Söder", 20080809)
-ENTRY (L"An example: Learning the Iris data set")
-NORMAL (L"In the @@Feedforward neural networks|the feedforward neural networks tutorial@ a description of how the @FFNet classifier in Praat can be applied to @@iris data set|the Iris data set@ can be found.")
-NORMAL (L"The same data can be used to test the %%k%NN feature of Praat. To do so create an example data set using the @@Create iris example...@ command found in the ##Neural nets# submenu. The form prompting for network topology settings can be ignored by selecting OK. Select the newly created @Pattern and @Categories objects and click ##To KNN Classifier...#. A form prompting for a name of the classifier to be created will be shown. The ordering in which instances are to be inserted in [...]
-NORMAL (L"To estimate how well the classifier can be expected to classify new samples of Irises select ##Query -# \\=> ##Get accuracy estimate...#. A form prompting for %%k%NN parameter settings and evaluation method will be shown. Experiment with the parameter settings until satisfactory results are achieved. If everything worked out the estimate will likely end up somewhere in the range of 94-98 percent.")
-NORMAL (L"An alternative to manually experimenting with model parameters is to let the computer do the job. This is done be choosing the @KNN object and thereafter selecting ##Query -# \\=> ##Get optimized parameters...#. The form shown prompts for a selection of parameters controlling the search. The default values will in most cases, including this, be appropriate.")
-NORMAL (L"Another way of improving classification accuracy is to transform the instance space in which the individual instances, in this case Irises, are stored as to maximize the distance between instances of different classes and minimize the distance between instances of the same class. This can be done by means of feature weighting. To do so select the @KNN object and choose ##To FeatureWeights...#. Adjust the %%k%NN settings according to the ones found by the model search algorithm  [...]
+MAN_BEGIN (U"kNN classifiers 2. Quick start", U"Ola Söder", 20080809)
+ENTRY (U"An example: Learning the Iris data set")
+NORMAL (U"In the @@Feedforward neural networks|the feedforward neural networks tutorial@ a description of how the @FFNet classifier in Praat can be applied to @@iris data set|the Iris data set@ can be found.")
+NORMAL (U"The same data can be used to test the %%k%NN feature of Praat. To do so create an example data set using the @@Create iris example...@ command found in the ##Neural nets# submenu. The form prompting for network topology settings can be ignored by selecting OK. Select the newly created @Pattern and @Categories objects and click ##To KNN Classifier...#. A form prompting for a name of the classifier to be created will be shown. The ordering in which instances are to be inserted in [...]
+NORMAL (U"To estimate how well the classifier can be expected to classify new samples of Irises select ##Query -# \\=> ##Get accuracy estimate...#. A form prompting for %%k%NN parameter settings and evaluation method will be shown. Experiment with the parameter settings until satisfactory results are achieved. If everything worked out the estimate will likely end up somewhere in the range of 94-98 percent.")
+NORMAL (U"An alternative to manually experimenting with model parameters is to let the computer do the job. This is done be choosing the @KNN object and thereafter selecting ##Query -# \\=> ##Get optimized parameters...#. The form shown prompts for a selection of parameters controlling the search. The default values will in most cases, including this, be appropriate.")
+NORMAL (U"Another way of improving classification accuracy is to transform the instance space in which the individual instances, in this case Irises, are stored as to maximize the distance between instances of different classes and minimize the distance between instances of the same class. This can be done by means of feature weighting. To do so select the @KNN object and choose ##To FeatureWeights...#. Adjust the %%k%NN settings according to the ones found by the model search algorithm  [...]
 MAN_END
 
-MAN_BEGIN (L"k-means clustering", L"Ola Söder", 20080529)
-INTRO (L"This tutorial describes the use of %%k%-means clustering in Praat. ")
-NORMAL (L"@@k-means clustering 1. How does k-means clustering work?|1. How does k-means clustering work?@")
-NORMAL (L"@@k-means clustering 2. Quick start|2. Quick start@")
+MAN_BEGIN (U"k-means clustering", U"Ola Söder", 20080529)
+INTRO (U"This tutorial describes the use of %%k%-means clustering in Praat. ")
+NORMAL (U"@@k-means clustering 1. How does k-means clustering work?|1. How does k-means clustering work?@")
+NORMAL (U"@@k-means clustering 2. Quick start|2. Quick start@")
 MAN_END
 
-MAN_BEGIN (L"k-means clustering 1. How does k-means clustering work?", L"Ola Söder", 20080529)
-NORMAL (L"The %%k%-means clustering algorithm attempts to split a given anonymous data set (a set containing no information as to class identity) into a fixed number (%k) of clusters.")
-NORMAL (L"Initially %k number of so called %centroids are chosen. A %centroid is a data point (imaginary or real) at the center of a cluster. In Praat each centroid is an existing data point in the given input data set, picked at random, such that all %centroids are unique (that is, for all %centroids %c__%i_ and %c__%j_, %c__%i_ \\=/ %c__%j_). These %centroids are used to train a @@kNN classifiers 1. What is a kNN classifier?|kNN classifier at . The resulting classifier is used to classify [...]
+MAN_BEGIN (U"k-means clustering 1. How does k-means clustering work?", U"Ola Söder", 20080529)
+NORMAL (U"The %%k%-means clustering algorithm attempts to split a given anonymous data set (a set containing no information as to class identity) into a fixed number (%k) of clusters.")
+NORMAL (U"Initially %k number of so called %centroids are chosen. A %centroid is a data point (imaginary or real) at the center of a cluster. In Praat each centroid is an existing data point in the given input data set, picked at random, such that all %centroids are unique (that is, for all %centroids %c__%i_ and %c__%j_, %c__%i_ \\=/ %c__%j_). These %centroids are used to train a @@kNN classifiers 1. What is a kNN classifier?|kNN classifier at . The resulting classifier is used to classify [...]
 MAN_END
 
-MAN_BEGIN (L"k-means clustering 2. Quick start", L"Ola Söder", 20080529)
-NORMAL (L"Clustering using the %%k%-means clustering algorithm in Praat is done by selecting a @Pattern and choosing ##To Categories...#. In the appearing requester the number of sought after clusters (unique categories) can be specified. The cluster size ratio constraint (%z) imposes a constraint on the output such that %cluster size(%x) / %cluster size(%y) > %z for all clusters %x and %y in the resulting set of clusters. Valid values of %z are 0 < %z <= 1 where values near 0 imposes pr [...]
+MAN_BEGIN (U"k-means clustering 2. Quick start", U"Ola Söder", 20080529)
+NORMAL (U"Clustering using the %%k%-means clustering algorithm in Praat is done by selecting a @Pattern and choosing ##To Categories...#. In the appearing requester the number of sought after clusters (unique categories) can be specified. The cluster size ratio constraint (%z) imposes a constraint on the output such that %cluster size(%x) / %cluster size(%y) > %z for all clusters %x and %y in the resulting set of clusters. Valid values of %z are 0 < %z <= 1 where values near 0 imposes pr [...]
 MAN_END
 
-MAN_BEGIN (L"Pattern to Dissimilarity", L"Ola Söder", 20080529)
-NORMAL (L"A @Dissimilarity matrix can be used in conjunction with @@Multidimensional scaling|Multidimensional scaling@ to aid visualization of high-dimensional data. A @Dissimilarity object is a matrix of the distances, according to the chosen @@Euclidean distance|distance function@, between all the data points in the @Pattern object.")
-NORMAL (L"A @Dissimilarity object can be created by selecting a @Pattern object and choosing ##To Dissimilarity#. The dissimilarity matrix can also be computed using feature weights. This is done by selecting a @Pattern object, an @FeatureWeights object and choosing ##To Dissimilarity#.")
+MAN_BEGIN (U"Pattern to Dissimilarity", U"Ola Söder", 20080529)
+NORMAL (U"A @Dissimilarity matrix can be used in conjunction with @@Multidimensional scaling|Multidimensional scaling@ to aid visualization of high-dimensional data. A @Dissimilarity object is a matrix of the distances, according to the chosen @@Euclidean distance|distance function@, between all the data points in the @Pattern object.")
+NORMAL (U"A @Dissimilarity object can be created by selecting a @Pattern object and choosing ##To Dissimilarity#. The dissimilarity matrix can also be computed using feature weights. This is done by selecting a @Pattern object, an @FeatureWeights object and choosing ##To Dissimilarity#.")
 MAN_END
 
-MAN_BEGIN (L"Euclidean distance", L"Ola Söder", 20080529)
-NORMAL (L"The Euclidean distance between the %n-dimensional vectors %a and %b can be calculated as follows:")
-FORMULA (L"\\De__Euclidean_(%x,%y) = \\Vr(\\su__%i=1..%n_(%a__%i_ - %b__%I_)^2)")
+MAN_BEGIN (U"Euclidean distance", U"Ola Söder", 20080529)
+NORMAL (U"The Euclidean distance between the %n-dimensional vectors %a and %b can be calculated as follows:")
+FORMULA (U"\\De__Euclidean_(%x,%y) = \\Vr(\\su__%i=1..%n_(%a__%i_ - %b__%I_)^2)")
 MAN_END
 
-MAN_BEGIN (L"kNN classifiers 3. Command overview", L"Ola Söder", 20080809 )
-INTRO (L"KNN commands")
-ENTRY (L"Creation:")
-LIST_ITEM (L"\\bu @@Pattern & Categories: To KNN classifier...@")
-LIST_ITEM (L"\\bu @@Create KNN...@")
-ENTRY (L"Learning:")
-LIST_ITEM (L"\\bu @@KNN & Pattern & Categories: Learn...@")
-ENTRY (L"Classification:")
-LIST_ITEM (L"\\bu @@KNN & Pattern: To Categories...@")
-LIST_ITEM (L"\\bu @@KNN & Pattern: To TabelOfReal...@")
-LIST_ITEM (L"\\bu @@KNN & Pattern & FeatureWeights: To Categories...@")
-LIST_ITEM (L"\\bu @@KNN & Pattern & FeatureWeights: To TableOfReal...@")
-ENTRY (L"Evaluation:")
-LIST_ITEM (L"\\bu @@KNN & Pattern & Categories: Evaluate...@")
-LIST_ITEM (L"\\bu @@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
-ENTRY (L"Queries")
-LIST_ITEM (L"\\bu @@KNN: Get optimized parameters...@")
-LIST_ITEM (L"\\bu @@KNN: Get accuracy estimate...@")
-LIST_ITEM (L"\\bu @@KNN & FeatureWeights: Get accuracy estimate...@")
-LIST_ITEM (L"\\bu @@KNN: Get size of instance base@")
-ENTRY (L"Extractions")
-LIST_ITEM (L"\\bu @@KNN: Extract input Pattern@")
-LIST_ITEM (L"\\bu @@KNN: Extract output Categories@")
-ENTRY (L"Modification:")
-LIST_ITEM (L"\\bu @@KNN: Shuffle@")
-LIST_ITEM (L"\\bu @@KNN: Prune...@")
-LIST_ITEM (L"\\bu @@KNN: Reset...@")
-ENTRY (L"Miscellaneous:")
-LIST_ITEM (L"\\bu @@KNN: To FeatureWeights...@")
-LIST_ITEM (L"\\bu @@KNN & Pattern & Categories: To FeatureWeights...@") 
-LIST_ITEM (L"\\bu @@Pattern & Categories: To FeatureWeights...@")
-ENTRY (L"Pre/post processing:")
-LIST_ITEM (L"\\bu @@Pattern: To Categories...@")
-LIST_ITEM (L"\\bu @@Pattern & FeatureWeights: To Categories...@")
-LIST_ITEM (L"\\bu @@Pattern: To Dissimilarity...@")
-LIST_ITEM (L"\\bu @@Pattern & FeatureWeights: To Dissimilarity...@")
-MAN_END
-
-MAN_BEGIN (L"Pattern & Categories: To KNN classifier...", L"Ola Söder", 20080726 )
-INTRO (L"Create and train a @KNN classifier using the selected @Pattern and @Categories objects as training data.")
-ENTRY (L"Settings")
-TAG (L"##Name")\
-DEFINITION (L"The name of the @KNN classifier.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-LIST_ITEM (L"@@kNN classifiers 1. What is a kNN classifier?@")
-MAN_END
-
-MAN_BEGIN (L"Create KNN...", L"Ola Söder", 20080718 )
-INTRO (L"Create a new @KNN classifier.")
-ENTRY (L"Settings")
-TAG (L"##Name")
-DEFINITION (L"The name of the classifier.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN & Pattern & Categories: Learn...", L"Ola Söder", 20080726 )
-INTRO (L"Train the selected @KNN classifier using the chosen @Pattern and @Categories objects as training data.")
-ENTRY (L"Settings")
-TAG (L"##Name")
-DEFINITION (L"The name of the classifier.")
-TAG (L"##Ordering")
-DEFINITION (L"The order in which the training instances are to be inserted into the instance base.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-LIST_ITEM (L"@@kNN classifiers 1. What is a kNN classifier?@")
-MAN_END
-
-MAN_BEGIN (L"KNN & Pattern: To Categories...", L"Ola Söder", 20080726 )
-INTRO (L"Use the selected @KNN classifier to classify the chosen @Pattern. A @Categories object containing the result will be created.")
-ENTRY (L"Settings")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood.")
-TAG (L"##Vote weighting")
-DEFINITION (L"The type of vote weighting to be used.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-LIST_ITEM (L"@@kNN classifiers 1. What is a kNN classifier?@")
-MAN_END
-
-MAN_BEGIN (L"KNN & Pattern: To TabelOfReal...", L"Ola Söder", 20080718 )
-INTRO (L"Use the selected @KNN classifier to classify the chosen @Pattern. A @TableOfReal object containing verbose information on the decision process  will be created.")
-ENTRY (L"Settings")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood.")
-TAG (L"##Vote weighting")
-DEFINITION (L"The type of vote weighting to be used.")
-TAG (L"##Output")
-DEFINITION (L"Specifies the degree of verbosity, where %%winners only% generates a @TableOfReal containing information on the instances of the winning category only whereas %%All candidates% results in a @TableOfReal with verbose information on all unique categories in the neighbourhood defined by the parameter %k.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-LIST_ITEM (L"@@kNN classifiers 1. What is a kNN classifier?@")
-MAN_END
-
-MAN_BEGIN (L"KNN & Pattern & FeatureWeights: To Categories...", L"Ola Söder", 20080726 )
-INTRO (L"Use the selected @KNN classifier and @FeatureWeights object to classify the chosen @Pattern. A @Categories object containing the result will be created.")
-ENTRY (L"Settings")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood.")
-TAG (L"##Vote weighting")
-DEFINITION (L"The type of vote weighting to be used.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1.1. Filter-based feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1. Improving classification accuracy@")
-LIST_ITEM (L"@@kNN classifiers 1. What is a kNN classifier?@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN & Pattern & FeatureWeights: To TableOfReal...", L"Ola Söder", 20080718 )
-INTRO (L"Use the selected @KNN classifier and the feature weights, @FeatureWeights, to classify the chosen @Pattern. A @TableOfReal object containing verbose information on the decision process will be created.")
-ENTRY (L"Settings")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood.")
-TAG (L"##Vote weighting")
-DEFINITION (L"The type of vote weighting to be used.")
-TAG (L"##Output")
-DEFINITION (L"Specifies the degree of verbosity, where %%winners only% generates a @TableOfReal containing information on the instances of the winning category only whereas %%All candidates% results in a @TableOfReal with verbose information on all unique categories in the neighbourhood defined by the parameter %k.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1.1. Filter-based feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1. Improving classification accuracy@")
-LIST_ITEM (L"@@kNN classifiers 1. What is a kNN classifier?@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN: Get optimized parameters...", L"Ola Söder", 20080718 )
-INTRO (L"Perform an automated search for the optimal @KNN parameter settings.")
-ENTRY (L"Settings")
-TAG (L"##Evaluation method")
-DEFINITION (L"The method to be used for estimating the classification accuracy, which in turn is used to guide the model search. "
+MAN_BEGIN (U"kNN classifiers 3. Command overview", U"Ola Söder", 20080809 )
+INTRO (U"KNN commands")
+ENTRY (U"Creation:")
+LIST_ITEM (U"\\bu @@Pattern & Categories: To KNN classifier...@")
+LIST_ITEM (U"\\bu @@Create KNN...@")
+ENTRY (U"Learning:")
+LIST_ITEM (U"\\bu @@KNN & Pattern & Categories: Learn...@")
+ENTRY (U"Classification:")
+LIST_ITEM (U"\\bu @@KNN & Pattern: To Categories...@")
+LIST_ITEM (U"\\bu @@KNN & Pattern: To TabelOfReal...@")
+LIST_ITEM (U"\\bu @@KNN & Pattern & FeatureWeights: To Categories...@")
+LIST_ITEM (U"\\bu @@KNN & Pattern & FeatureWeights: To TableOfReal...@")
+ENTRY (U"Evaluation:")
+LIST_ITEM (U"\\bu @@KNN & Pattern & Categories: Evaluate...@")
+LIST_ITEM (U"\\bu @@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
+ENTRY (U"Queries")
+LIST_ITEM (U"\\bu @@KNN: Get optimized parameters...@")
+LIST_ITEM (U"\\bu @@KNN: Get accuracy estimate...@")
+LIST_ITEM (U"\\bu @@KNN & FeatureWeights: Get accuracy estimate...@")
+LIST_ITEM (U"\\bu @@KNN: Get size of instance base@")
+ENTRY (U"Extractions")
+LIST_ITEM (U"\\bu @@KNN: Extract input Pattern@")
+LIST_ITEM (U"\\bu @@KNN: Extract output Categories@")
+ENTRY (U"Modification:")
+LIST_ITEM (U"\\bu @@KNN: Shuffle@")
+LIST_ITEM (U"\\bu @@KNN: Prune...@")
+LIST_ITEM (U"\\bu @@KNN: Reset...@")
+ENTRY (U"Miscellaneous:")
+LIST_ITEM (U"\\bu @@KNN: To FeatureWeights...@")
+LIST_ITEM (U"\\bu @@KNN & Pattern & Categories: To FeatureWeights...@") 
+LIST_ITEM (U"\\bu @@Pattern & Categories: To FeatureWeights...@")
+ENTRY (U"Pre/post processing:")
+LIST_ITEM (U"\\bu @@Pattern: To Categories...@")
+LIST_ITEM (U"\\bu @@Pattern & FeatureWeights: To Categories...@")
+LIST_ITEM (U"\\bu @@Pattern: To Dissimilarity...@")
+LIST_ITEM (U"\\bu @@Pattern & FeatureWeights: To Dissimilarity...@")
+MAN_END
+
+MAN_BEGIN (U"Pattern & Categories: To KNN classifier...", U"Ola Söder", 20080726 )
+INTRO (U"Create and train a @KNN classifier using the selected @Pattern and @Categories objects as training data.")
+ENTRY (U"Settings")
+TAG (U"##Name")\
+DEFINITION (U"The name of the @KNN classifier.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+LIST_ITEM (U"@@kNN classifiers 1. What is a kNN classifier?@")
+MAN_END
+
+MAN_BEGIN (U"Create KNN...", U"Ola Söder", 20080718 )
+INTRO (U"Create a new @KNN classifier.")
+ENTRY (U"Settings")
+TAG (U"##Name")
+DEFINITION (U"The name of the classifier.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN & Pattern & Categories: Learn...", U"Ola Söder", 20080726 )
+INTRO (U"Train the selected @KNN classifier using the chosen @Pattern and @Categories objects as training data.")
+ENTRY (U"Settings")
+TAG (U"##Name")
+DEFINITION (U"The name of the classifier.")
+TAG (U"##Ordering")
+DEFINITION (U"The order in which the training instances are to be inserted into the instance base.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+LIST_ITEM (U"@@kNN classifiers 1. What is a kNN classifier?@")
+MAN_END
+
+MAN_BEGIN (U"KNN & Pattern: To Categories...", U"Ola Söder", 20080726 )
+INTRO (U"Use the selected @KNN classifier to classify the chosen @Pattern. A @Categories object containing the result will be created.")
+ENTRY (U"Settings")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood.")
+TAG (U"##Vote weighting")
+DEFINITION (U"The type of vote weighting to be used.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+LIST_ITEM (U"@@kNN classifiers 1. What is a kNN classifier?@")
+MAN_END
+
+MAN_BEGIN (U"KNN & Pattern: To TabelOfReal...", U"Ola Söder", 20080718 )
+INTRO (U"Use the selected @KNN classifier to classify the chosen @Pattern. A @TableOfReal object containing verbose information on the decision process  will be created.")
+ENTRY (U"Settings")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood.")
+TAG (U"##Vote weighting")
+DEFINITION (U"The type of vote weighting to be used.")
+TAG (U"##Output")
+DEFINITION (U"Specifies the degree of verbosity, where %%winners only% generates a @TableOfReal containing information on the instances of the winning category only whereas %%All candidates% results in a @TableOfReal with verbose information on all unique categories in the neighbourhood defined by the parameter %k.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+LIST_ITEM (U"@@kNN classifiers 1. What is a kNN classifier?@")
+MAN_END
+
+MAN_BEGIN (U"KNN & Pattern & FeatureWeights: To Categories...", U"Ola Söder", 20080726 )
+INTRO (U"Use the selected @KNN classifier and @FeatureWeights object to classify the chosen @Pattern. A @Categories object containing the result will be created.")
+ENTRY (U"Settings")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood.")
+TAG (U"##Vote weighting")
+DEFINITION (U"The type of vote weighting to be used.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1.1. Filter-based feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1. Improving classification accuracy@")
+LIST_ITEM (U"@@kNN classifiers 1. What is a kNN classifier?@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN & Pattern & FeatureWeights: To TableOfReal...", U"Ola Söder", 20080718 )
+INTRO (U"Use the selected @KNN classifier and the feature weights, @FeatureWeights, to classify the chosen @Pattern. A @TableOfReal object containing verbose information on the decision process will be created.")
+ENTRY (U"Settings")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood.")
+TAG (U"##Vote weighting")
+DEFINITION (U"The type of vote weighting to be used.")
+TAG (U"##Output")
+DEFINITION (U"Specifies the degree of verbosity, where %%winners only% generates a @TableOfReal containing information on the instances of the winning category only whereas %%All candidates% results in a @TableOfReal with verbose information on all unique categories in the neighbourhood defined by the parameter %k.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1.1. Filter-based feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1. Improving classification accuracy@")
+LIST_ITEM (U"@@kNN classifiers 1. What is a kNN classifier?@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN: Get optimized parameters...", U"Ola Söder", 20080718 )
+INTRO (U"Perform an automated search for the optimal @KNN parameter settings.")
+ENTRY (U"Settings")
+TAG (U"##Evaluation method")
+DEFINITION (U"The method to be used for estimating the classification accuracy, which in turn is used to guide the model search. "
 	"Supported methods are 10-fold cross-validation and leave-one-out.")
-TAG (L"##k max")
-DEFINITION (L"The maximum value of the parameter %k.")
-TAG (L"##Number of seeds")
-DEFINITION (L"The size of the parameter neighbourhood to be searched.")
-TAG (L"##Learning rate")
-DEFINITION (L"The rate at which the parameter neighbourhood is shrunk (per iteration).")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers 1.1.2. Model selection@")
-LIST_ITEM (L"@@kNN classifiers 1.1. Improving classification accuracy@")
-LIST_ITEM (L"@@kNN classifiers 1. What is a kNN classifier?@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN: Get accuracy estimate...", L"Ola Söder", 20080718 )
-INTRO (L"Estimate the classification accuracy of the selected @KNN classifier.")
-ENTRY (L"Settings")
-TAG (L"##Evaluation method")
-DEFINITION (L"The method to be used for estimating the classification accuracy. Supported methods are 10-fold cross-validation and leave-one-out.")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood.")
-TAG (L"##Vote weighting")
-DEFINITION (L"The type of vote weighting to be used.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@KNN & FeatureWeights: Get accuracy estimate...@")
-LIST_ITEM (L"@@KNN & Pattern & Categories: Evaluate...@")
-LIST_ITEM (L"@@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
-LIST_ITEM (L"@@kNN classifiers 1.1. Improving classification accuracy@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.2. Model selection@")
-LIST_ITEM (L"@@kNN classifiers@")
+TAG (U"##k max")
+DEFINITION (U"The maximum value of the parameter %k.")
+TAG (U"##Number of seeds")
+DEFINITION (U"The size of the parameter neighbourhood to be searched.")
+TAG (U"##Learning rate")
+DEFINITION (U"The rate at which the parameter neighbourhood is shrunk (per iteration).")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers 1.1.2. Model selection@")
+LIST_ITEM (U"@@kNN classifiers 1.1. Improving classification accuracy@")
+LIST_ITEM (U"@@kNN classifiers 1. What is a kNN classifier?@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN: Get accuracy estimate...", U"Ola Söder", 20080718 )
+INTRO (U"Estimate the classification accuracy of the selected @KNN classifier.")
+ENTRY (U"Settings")
+TAG (U"##Evaluation method")
+DEFINITION (U"The method to be used for estimating the classification accuracy. Supported methods are 10-fold cross-validation and leave-one-out.")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood.")
+TAG (U"##Vote weighting")
+DEFINITION (U"The type of vote weighting to be used.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@KNN & FeatureWeights: Get accuracy estimate...@")
+LIST_ITEM (U"@@KNN & Pattern & Categories: Evaluate...@")
+LIST_ITEM (U"@@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
+LIST_ITEM (U"@@kNN classifiers 1.1. Improving classification accuracy@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.2. Model selection@")
+LIST_ITEM (U"@@kNN classifiers@")
 MAN_END  
 
-MAN_BEGIN (L"KNN & FeatureWeights: Get accuracy estimate...", L"Ola Söder", 20080809)
-INTRO (L"Estimate the classification accuracy of the @KNN classifier using the chosen @FeatureWeights.")
-ENTRY (L"Settings")
-TAG (L"##Evaluation method")
-DEFINITION (L"The method to be used for estimating the classification accuracy. "
+MAN_BEGIN (U"KNN & FeatureWeights: Get accuracy estimate...", U"Ola Söder", 20080809)
+INTRO (U"Estimate the classification accuracy of the @KNN classifier using the chosen @FeatureWeights.")
+ENTRY (U"Settings")
+TAG (U"##Evaluation method")
+DEFINITION (U"The method to be used for estimating the classification accuracy. "
 	"Supported methods are 10-fold cross-validation and leave-one-out.")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood.")
-TAG (L"##Vote weighting")
-DEFINITION (L"The type of vote weighting to be used.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@KNN & Pattern & Categories: Evaluate...@")
-LIST_ITEM (L"@@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
-LIST_ITEM (L"@@kNN classifiers 1.1. Improving classification accuracy@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.2. Model selection@")
-LIST_ITEM (L"@@kNN classifiers@")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood.")
+TAG (U"##Vote weighting")
+DEFINITION (U"The type of vote weighting to be used.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@KNN & Pattern & Categories: Evaluate...@")
+LIST_ITEM (U"@@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
+LIST_ITEM (U"@@kNN classifiers 1.1. Improving classification accuracy@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.2. Model selection@")
+LIST_ITEM (U"@@kNN classifiers@")
 MAN_END 
 
-MAN_BEGIN (L"KNN & Pattern & Categories: Evaluate...", L"Ola Söder", 20080718)
-INTRO (L"Estimate the classification accuracy of the chosen @KNN classifier using the selected @Pattern and @Categories objects as test set.")
-ENTRY (L"Settings")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood.")
-TAG (L"##Vote weighting")
-DEFINITION (L"The type of vote weighting to be used.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
-LIST_ITEM (L"@@KNN: Get accuracy estimate...@")
-LIST_ITEM (L"@@kNN classifiers 1.1. Improving classification accuracy@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.2. Model selection@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN & Pattern & Categories & FeatureWeights: Evaluate...", L"Ola Söder", 20080718)
-INTRO (L"Estimate the classification accuracy of the chosen @KNN classifier using the selected @Pattern and @Categories objects as test set. The selected @FeatureWeights object will be used in the classification process.")
-ENTRY (L"Settings")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood.")
-TAG (L"##Vote weighting")
-DEFINITION (L"The type of vote weighting to be used.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@KNN & Pattern & Categories: Evaluate...@")
-LIST_ITEM (L"@@KNN: Get accuracy estimate...@")
-LIST_ITEM (L"@@kNN classifiers 1.1. Improving classification accuracy@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.2. Model selection@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN: Get size of instance base", L"Ola Söder", 20080718)
-INTRO (L"Queries the selected @KNN for the number of instances in the instance base. ")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN: Extract input Pattern", L"Ola Söder", 20080726)
-INTRO (L"Create a new @Pattern object identical to the one in the instance base of the selected @KNN classifier.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN: Extract output Categories", L"Ola Söder", 20080726)
-INTRO (L"Create a new @Categories object identical to the one in the instance base of the selected @KNN classifier.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN: Shuffle", L"Ola Söder", 20080718)
-INTRO (L"Shuffle the instance base of the selected classifier.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN: Prune...", L"Ola Söder", 20080718)
-INTRO (L"Prune the instance base of the selected classifier.")
-ENTRY (L"Settings")
-TAG (L"##Noise pruning degree")
-DEFINITION (L"A value in the range [0 ... 1] specifying the probability that instances tagged as noisy by @@kNN classifiers 1.2.1. Pruning|the C-Pruner algorithm@ will be pruned.")
-TAG (L"##Redundancy pruning degree")
-DEFINITION (L"The probability that instances tagged as redundant by @@kNN classifiers 1.2.1. Pruning|the C-Pruner algorithm@ will be pruned.")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers 1.2.1. Pruning@")
-LIST_ITEM (L"@@kNN classifiers 1.2. Improving resource efficiency@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN: Reset...", L"Ola Söder", 20080718)
-INTRO (L"Empty the instance base of the selected classifier.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN: To FeatureWeights...", L"Ola Söder", 20080728)
-INTRO (L"Wrap the selected @KNN and use its feedback to guide the search for the optimal feature weights. A @FeatureWeights object will be created.")
-ENTRY (L"Settings")
-TAG (L"##Learning rate")
-DEFINITION (L"The rate at which the maximum distance between the pivot and a random seed is decremented.")
-TAG (L"##Number of seeds")
-DEFINITION (L"The size of the feature weight neighbourhood.")
-TAG (L"##Stop at")
-DEFINITION (L"A value specifying a stopping criterion. When feature weights yielding accuracy estimates higher than the specified value the search will stop. A value of 1 imposes no constraints whereas a value of 0.5 will result in the termination of the search algorithm once feature weights resulting in an classification accuracy of 50 percent or better are found.")
-TAG (L"##Optimization")
-DEFINITION (L"Specifies whether to search for all features simultaneously or one at a time.")
-TAG (L"##Evaluation method")
-DEFINITION (L"The method to be used for estimating the classification accuracy. Supported methods are 10-fold cross-validation and leave-one-out.")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood used for feedback classification.")
-TAG (L"##Vote weighting")
-DEFINITION (L"The type of vote weighting to be used.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1. Improving classification accuracy@")
-LIST_ITEM (L"@@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
-LIST_ITEM (L"@@kNN classifiers 1. What is a kNN classifier?@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"KNN & Pattern & Categories: To FeatureWeights...", L"Ola Söder", 20080809)
-INTRO (L"Wrap the selected @KNN and use its classification accuracy on the test set constituted by the @Pattern and @Categories objects as feedback to guide the search for the optimal feature weights. A @FeatureWeights object will be created.")
-ENTRY (L"Settings")
-TAG (L"##Learning rate")
-DEFINITION (L"The rate at which the maximum distance between the pivot and a random seed is decremented.")
-TAG (L"##Number of seeds")
-DEFINITION (L"The size of the feature weight neighbourhood.")
-TAG (L"##Stop at")
-DEFINITION (L"A value specifying a stopping criterion. When feature weights yielding accuracy estimates higher than the specified value the search will stop. A value of 1 imposes no constraints whereas a value of 0.5 will result in the termination of the search algorithm once feature weights resulting in an classification accuracy of 50 percent or better are found.")
-TAG (L"##Optimization")
-DEFINITION (L"Specifies whether to search for all features simultaneously or one at a time.")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood used for feedback classification.")
-TAG (L"##Vote weighting")
-DEFINITION (L"The type of vote weighting to be used.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1. Improving classification accuracy@")
-LIST_ITEM (L"@@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
-LIST_ITEM (L"@@kNN classifiers 1. What is a kNN classifier?@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"Pattern & Categories: To FeatureWeights...", L"Ola Söder", 20080809) 
-INTRO (L"Compute an estimate of the optimal feature weights using the @@kNN classifiers 1.1.1.1. Filter-based feature weighting|RELIEF-F algorithm at .")
-ENTRY (L"Setting")
-TAG (L"##k neighbours")
-DEFINITION (L"The size of the neighbourhood.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers 1.1.1.1. Filter-based feature weighting@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"Pattern: To Categories...", L"Ola Söder", 20080728)
-INTRO (L"Split the given @Pattern into a fixed number of clusters using the @@k-means clustering|%%k%-means clustering algorithm at . A @Categories object containing numbered categories corresponding to the generated clusters will be created.")
-ENTRY (L"Settings")
-TAG (L"##k clusters")
-DEFINITION (L"The number of clusters to be generated.")
-TAG (L"##Cluster size ratio constraint")
-DEFINITION (L"The minimum allowed ratio between the smallest and the biggest cluster.")
-TAG (L"##Maximum number of reseeds")
-DEFINITION (L"The maximum allowed number of reseeds used to enforce the cluster size ratio constraint.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"Pattern & FeatureWeights: To Categories...", L"Ola Söder", 20080728)
-INTRO (L"Split the given @Pattern into a fixed number of clusters using the @@k-means clustering|%%k%-means clustering algorithm@ and the feature weights contained within the selected @FeatureWeights object. A @Categories object containing numbered categories corresponding to the generated clusters will be created.")
-ENTRY (L"Settings")
-TAG (L"##k clusters")
-DEFINITION (L"The number of clusters to be generated.")
-TAG (L"##Cluster size ratio constraint")
-DEFINITION (L"The minimum allowed ratio between the smallest and the biggest cluster.")
-TAG (L"##Maximum number of reseeds")
-DEFINITION (L"The maximum allowed number of reseeds used to enforce the cluster size ratio constraint.")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@kNN classifiers@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting@")
-MAN_END
-
-MAN_BEGIN (L"Pattern: To Dissimilarity...", L"Ola Söder", 20080718)
-INTRO (L"Generate a @Dissimilarity matrix from the selected @Pattern. Dissimilarities are computed using the @@Euclidean distance@")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@Multidimensional scaling@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"Pattern & FeatureWeights: To Dissimilarity...", L"Ola Söder", 20080718)
-INTRO (L"Generate a @Dissimilarity matrix from the selected @Pattern using the feature weights contained within the selected @FeatureWeights object. Dissimilarities are computed using the @@Euclidean distance at .")
-ENTRY (L"See also:")
-LIST_ITEM (L"@@Multidimensional scaling@")
-LIST_ITEM (L"@@kNN classifiers 1.1.1. Feature weighting@")
-LIST_ITEM (L"@@kNN classifiers@")
-MAN_END
-
-MAN_BEGIN (L"Ke-Ping Zhao et al. (2003)", L"Ola Söder", 20080718)
-NORMAL (L"Ke-Ping Zhao et al. (2003): \"C-Pruner: An improved instance pruning algorithm.\" "
+MAN_BEGIN (U"KNN & Pattern & Categories: Evaluate...", U"Ola Söder", 20080718)
+INTRO (U"Estimate the classification accuracy of the chosen @KNN classifier using the selected @Pattern and @Categories objects as test set.")
+ENTRY (U"Settings")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood.")
+TAG (U"##Vote weighting")
+DEFINITION (U"The type of vote weighting to be used.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
+LIST_ITEM (U"@@KNN: Get accuracy estimate...@")
+LIST_ITEM (U"@@kNN classifiers 1.1. Improving classification accuracy@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.2. Model selection@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN & Pattern & Categories & FeatureWeights: Evaluate...", U"Ola Söder", 20080718)
+INTRO (U"Estimate the classification accuracy of the chosen @KNN classifier using the selected @Pattern and @Categories objects as test set. The selected @FeatureWeights object will be used in the classification process.")
+ENTRY (U"Settings")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood.")
+TAG (U"##Vote weighting")
+DEFINITION (U"The type of vote weighting to be used.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@KNN & Pattern & Categories: Evaluate...@")
+LIST_ITEM (U"@@KNN: Get accuracy estimate...@")
+LIST_ITEM (U"@@kNN classifiers 1.1. Improving classification accuracy@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.2. Model selection@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN: Get size of instance base", U"Ola Söder", 20080718)
+INTRO (U"Queries the selected @KNN for the number of instances in the instance base. ")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN: Extract input Pattern", U"Ola Söder", 20080726)
+INTRO (U"Create a new @Pattern object identical to the one in the instance base of the selected @KNN classifier.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN: Extract output Categories", U"Ola Söder", 20080726)
+INTRO (U"Create a new @Categories object identical to the one in the instance base of the selected @KNN classifier.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN: Shuffle", U"Ola Söder", 20080718)
+INTRO (U"Shuffle the instance base of the selected classifier.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN: Prune...", U"Ola Söder", 20080718)
+INTRO (U"Prune the instance base of the selected classifier.")
+ENTRY (U"Settings")
+TAG (U"##Noise pruning degree")
+DEFINITION (U"A value in the range [0 ... 1] specifying the probability that instances tagged as noisy by @@kNN classifiers 1.2.1. Pruning|the C-Pruner algorithm@ will be pruned.")
+TAG (U"##Redundancy pruning degree")
+DEFINITION (U"The probability that instances tagged as redundant by @@kNN classifiers 1.2.1. Pruning|the C-Pruner algorithm@ will be pruned.")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers 1.2.1. Pruning@")
+LIST_ITEM (U"@@kNN classifiers 1.2. Improving resource efficiency@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN: Reset...", U"Ola Söder", 20080718)
+INTRO (U"Empty the instance base of the selected classifier.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN: To FeatureWeights...", U"Ola Söder", 20080728)
+INTRO (U"Wrap the selected @KNN and use its feedback to guide the search for the optimal feature weights. A @FeatureWeights object will be created.")
+ENTRY (U"Settings")
+TAG (U"##Learning rate")
+DEFINITION (U"The rate at which the maximum distance between the pivot and a random seed is decremented.")
+TAG (U"##Number of seeds")
+DEFINITION (U"The size of the feature weight neighbourhood.")
+TAG (U"##Stop at")
+DEFINITION (U"A value specifying a stopping criterion. When feature weights yielding accuracy estimates higher than the specified value the search will stop. A value of 1 imposes no constraints whereas a value of 0.5 will result in the termination of the search algorithm once feature weights resulting in an classification accuracy of 50 percent or better are found.")
+TAG (U"##Optimization")
+DEFINITION (U"Specifies whether to search for all features simultaneously or one at a time.")
+TAG (U"##Evaluation method")
+DEFINITION (U"The method to be used for estimating the classification accuracy. Supported methods are 10-fold cross-validation and leave-one-out.")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood used for feedback classification.")
+TAG (U"##Vote weighting")
+DEFINITION (U"The type of vote weighting to be used.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1. Improving classification accuracy@")
+LIST_ITEM (U"@@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
+LIST_ITEM (U"@@kNN classifiers 1. What is a kNN classifier?@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"KNN & Pattern & Categories: To FeatureWeights...", U"Ola Söder", 20080809)
+INTRO (U"Wrap the selected @KNN and use its classification accuracy on the test set constituted by the @Pattern and @Categories objects as feedback to guide the search for the optimal feature weights. A @FeatureWeights object will be created.")
+ENTRY (U"Settings")
+TAG (U"##Learning rate")
+DEFINITION (U"The rate at which the maximum distance between the pivot and a random seed is decremented.")
+TAG (U"##Number of seeds")
+DEFINITION (U"The size of the feature weight neighbourhood.")
+TAG (U"##Stop at")
+DEFINITION (U"A value specifying a stopping criterion. When feature weights yielding accuracy estimates higher than the specified value the search will stop. A value of 1 imposes no constraints whereas a value of 0.5 will result in the termination of the search algorithm once feature weights resulting in an classification accuracy of 50 percent or better are found.")
+TAG (U"##Optimization")
+DEFINITION (U"Specifies whether to search for all features simultaneously or one at a time.")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood used for feedback classification.")
+TAG (U"##Vote weighting")
+DEFINITION (U"The type of vote weighting to be used.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1. Improving classification accuracy@")
+LIST_ITEM (U"@@KNN & Pattern & Categories & FeatureWeights: Evaluate...@")
+LIST_ITEM (U"@@kNN classifiers 1. What is a kNN classifier?@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"Pattern & Categories: To FeatureWeights...", U"Ola Söder", 20080809) 
+INTRO (U"Compute an estimate of the optimal feature weights using the @@kNN classifiers 1.1.1.1. Filter-based feature weighting|RELIEF-F algorithm at .")
+ENTRY (U"Setting")
+TAG (U"##k neighbours")
+DEFINITION (U"The size of the neighbourhood.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers 1.1.1.1. Filter-based feature weighting@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1.2. Wrapper-based feature weighting@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"Pattern: To Categories...", U"Ola Söder", 20080728)
+INTRO (U"Split the given @Pattern into a fixed number of clusters using the @@k-means clustering|%%k%-means clustering algorithm at . A @Categories object containing numbered categories corresponding to the generated clusters will be created.")
+ENTRY (U"Settings")
+TAG (U"##k clusters")
+DEFINITION (U"The number of clusters to be generated.")
+TAG (U"##Cluster size ratio constraint")
+DEFINITION (U"The minimum allowed ratio between the smallest and the biggest cluster.")
+TAG (U"##Maximum number of reseeds")
+DEFINITION (U"The maximum allowed number of reseeds used to enforce the cluster size ratio constraint.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"Pattern & FeatureWeights: To Categories...", U"Ola Söder", 20080728)
+INTRO (U"Split the given @Pattern into a fixed number of clusters using the @@k-means clustering|%%k%-means clustering algorithm@ and the feature weights contained within the selected @FeatureWeights object. A @Categories object containing numbered categories corresponding to the generated clusters will be created.")
+ENTRY (U"Settings")
+TAG (U"##k clusters")
+DEFINITION (U"The number of clusters to be generated.")
+TAG (U"##Cluster size ratio constraint")
+DEFINITION (U"The minimum allowed ratio between the smallest and the biggest cluster.")
+TAG (U"##Maximum number of reseeds")
+DEFINITION (U"The maximum allowed number of reseeds used to enforce the cluster size ratio constraint.")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@kNN classifiers@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting@")
+MAN_END
+
+MAN_BEGIN (U"Pattern: To Dissimilarity...", U"Ola Söder", 20080718)
+INTRO (U"Generate a @Dissimilarity matrix from the selected @Pattern. Dissimilarities are computed using the @@Euclidean distance@")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@Multidimensional scaling@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"Pattern & FeatureWeights: To Dissimilarity...", U"Ola Söder", 20080718)
+INTRO (U"Generate a @Dissimilarity matrix from the selected @Pattern using the feature weights contained within the selected @FeatureWeights object. Dissimilarities are computed using the @@Euclidean distance at .")
+ENTRY (U"See also:")
+LIST_ITEM (U"@@Multidimensional scaling@")
+LIST_ITEM (U"@@kNN classifiers 1.1.1. Feature weighting@")
+LIST_ITEM (U"@@kNN classifiers@")
+MAN_END
+
+MAN_BEGIN (U"Ke-Ping Zhao et al. (2003)", U"Ola Söder", 20080718)
+NORMAL (U"Ke-Ping Zhao et al. (2003): \"C-Pruner: An improved instance pruning algorithm.\" "
 	"In %%Proceedings of the Second International Conference on Machine Learning and Cybernetics%, November 2003, 94\\--99.")
 MAN_END
 
-MAN_BEGIN (L"Igor Kononenko (1994)", L"Ola Söder", 20080718)
-NORMAL (L"Igor Kononenko (1994): \"Estimating attributes: Analysis and extensions of relief.\" "
+MAN_BEGIN (U"Igor Kononenko (1994)", U"Ola Söder", 20080718)
+NORMAL (U"Igor Kononenko (1994): \"Estimating attributes: Analysis and extensions of relief.\" "
 	"In %%ECML-94: Proceedings of the European Conference on Machine Learning%, Secaucus, NJ, USA, 171\\--182. "
 	"New York: Springer.")
 MAN_END
diff --git a/contrib/ola/praat_contrib_Ola_KNN.cpp b/contrib/ola/praat_contrib_Ola_KNN.cpp
index a3db864..f712d37 100644
--- a/contrib/ola/praat_contrib_Ola_KNN.cpp
+++ b/contrib/ola/praat_contrib_Ola_KNN.cpp
@@ -1,6 +1,6 @@
 /* praat_contrib_Ola_KNN.cpp
  *
- * Copyright (C) 2007-2009 Ola Söder, 2010-2011 Paul Boersma
+ * Copyright (C) 2007-2009 Ola Söder, 2010-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,34 +32,33 @@
 #include "FeatureWeights.h"
 #include "praat.h"
 
-static const wchar_t *QUERY_BUTTON   = L"Query -";
-static const wchar_t *MODIFY_BUTTON  = L"Modify -";
-static const wchar_t *EXTRACT_BUTTON = L"Extract -";
-
+static const char32 *QUERY_BUTTON   = U"Query -";
+static const char32 *MODIFY_BUTTON  = U"Modify -";
+static const char32 *EXTRACT_BUTTON = U"Extract -";
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // KNN creations                                                                      //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-FORM (KNN_create, L"Create kNN Classifier", L"kNN classifiers 1. What is a kNN classifier?")
-    WORD (L"Name", L"Classifier")
-    OK  
+FORM (KNN_create, U"Create kNN Classifier", U"kNN classifiers 1. What is a kNN classifier?") {
+	WORD (U"Name", U"Classifier")
+	OK2
 DO
-    autoKNN knn = KNN_create ();
-    praat_new (knn.transfer(), GET_STRING (L"Name"));
-END
-
-FORM (KNN_Pattern_Categories_to_KNN, L"Create kNN classifier", L"kNN classifiers 1. What is a kNN classifier?" )
-    WORD (L"Name", L"Classifier")
-    RADIO (L"Ordering", 1)
-    RADIOBUTTON (L"Random")
-    RADIOBUTTON (L"Sequential")
-    OK
+	autoKNN knn = KNN_create ();
+	praat_new (knn.transfer(), GET_STRING (U"Name"));
+END2 }
+
+FORM (KNN_Pattern_Categories_to_KNN, U"Create kNN classifier", U"kNN classifiers 1. What is a kNN classifier?") {
+	WORD (U"Name", U"Classifier")
+	RADIO (U"Ordering", 1)
+	RADIOBUTTON (U"Random")
+	RADIOBUTTON (U"Sequential")
+	OK2
 DO
 	iam_ONLY (Pattern);
 	thouart_ONLY (Categories);
-    int ordering = GET_INTEGER (L"Ordering");
-    autoKNN knn = KNN_create ();
+	int ordering = GET_INTEGER (U"Ordering");
+	autoKNN knn = KNN_create ();
 	switch (ordering) {
 		case 1:
 			ordering = kOla_SHUFFLE;
@@ -70,745 +69,702 @@ DO
 	int result = KNN_learn (knn.peek(), me, thee, kOla_REPLACE, ordering);
 	switch (result) {
 		case kOla_PATTERN_CATEGORIES_MISMATCH:
-			Melder_throw ("The number of Categories should be equal to the number of rows in Pattern.");
+			Melder_throw (U"The number of Categories should be equal to the number of rows in Pattern.");
 		case kOla_DIMENSIONALITY_MISMATCH:
-			Melder_throw ("The dimensionality of Pattern should be equal to that of the instance base.");
+			Melder_throw (U"The dimensionality of Pattern should be equal to that of the instance base.");
 		default:
-			praat_new (knn.transfer(), GET_STRING(L"Name"));
+			praat_new (knn.transfer(), GET_STRING(U"Name"));
 	}
-END
-
-
-
-
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // KNN extractions, queries and modifications                                         //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-DIRECT (KNN_getNumberOfInstances)
+DIRECT2 (KNN_getNumberOfInstances) {
     iam_ONLY (KNN);
-    Melder_information (Melder_integer (my nInstances), L" units");
-END
-
-FORM (KNN_getOptimumModel, L"kNN model selection", L"kNN classifiers 1.1.2. Model selection")
-    RADIO (L"Evaluation method", 1)
-    RADIOBUTTON (L"Leave one out")
-    RADIOBUTTON (L"10-fold cross-validation")
-    INTEGER (L"k max", L"50")
-    INTEGER (L"Number of seeds", L"10")
-    POSITIVE (L"Learning rate", L"0.2")
-    OK
+    Melder_information (my nInstances, U" units");
+END2 }
+
+FORM (KNN_getOptimumModel, U"kNN model selection", U"kNN classifiers 1.1.2. Model selection") {
+	RADIO (U"Evaluation method", 1)
+	RADIOBUTTON (U"Leave one out")
+	RADIOBUTTON (U"10-fold cross-validation")
+	INTEGER (U"k max", U"50")
+	INTEGER (U"Number of seeds", U"10")
+	POSITIVE (U"Learning rate", U"0.2")
+	OK2
 DO
-    iam_ONLY (KNN);
-    long k = GET_INTEGER (L"k max");
-    double lrate = GET_REAL (L"Learning rate");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k max such that 0 < k max < ", my nInstances + 1, ".");
-    long nseeds = GET_INTEGER (L"Number of seeds");
-    if (nseeds < 1)
-        Melder_throw ("The number of seeds should exceed 1.");
-    int mode = GET_INTEGER (L"Evaluation method");
-    switch (mode) {
-        case 2:
-            mode = kOla_TEN_FOLD_CROSS_VALIDATION;
-            break;
-        case 1:
-            mode = kOla_LEAVE_ONE_OUT;
-            break;
-    }
-    autoFeatureWeights fws = FeatureWeights_create ((my input) -> nx);
-    int dist;
-    KNN_modelSearch (me, fws.peek(), &k, &dist, mode, lrate, nseeds);
-    switch (dist) {
-        case kOla_SQUARED_DISTANCE_WEIGHTED_VOTING:
-            Melder_information (L"Vote weighting: Inversed squared distance\n", L"k: ", Melder_integer(k));
-            break;
-        case kOla_DISTANCE_WEIGHTED_VOTING:
-            Melder_information (L"Vote weighting: Inversed distance\n", L"k: ", Melder_integer(k));
-            break;
-        case kOla_FLAT_VOTING:
-            Melder_information (L"Vote weighting: Flat\n", L"k: ", Melder_integer(k));
-            break;
-    }
-END
-
-FORM (KNN_evaluate, L"Evaluation", L"KNN: Get accuracy estimate...")
-    RADIO (L"Evaluation method", 1)
-    RADIOBUTTON (L"Leave one out")
-    RADIOBUTTON (L"10-fold cross-validation")
-    INTEGER (L"k neighbours", L"1")
-    RADIO (L"Vote weighting", 1)
-    RADIOBUTTON (L"Inversed squared distance")
-    RADIOBUTTON (L"Inversed distance")
-    RADIOBUTTON (L"Flat")
-    OK
-
+	iam_ONLY (KNN);
+	long k = GET_INTEGER (U"k max");
+	double lrate = GET_REAL (U"Learning rate");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k max such that 0 < k max < ", my nInstances + 1, U".");
+	long nseeds = GET_INTEGER (U"Number of seeds");
+	if (nseeds < 1)
+		Melder_throw (U"The number of seeds should exceed 1.");
+	int mode = GET_INTEGER (U"Evaluation method");
+	switch (mode) {
+		case 2:
+			mode = kOla_TEN_FOLD_CROSS_VALIDATION;
+			break;
+		case 1:
+			mode = kOla_LEAVE_ONE_OUT;
+			break;
+	}
+	autoFeatureWeights fws = FeatureWeights_create ((my input) -> nx);
+	int dist;
+	KNN_modelSearch (me, fws.peek(), &k, &dist, mode, lrate, nseeds);
+	switch (dist) {
+		case kOla_SQUARED_DISTANCE_WEIGHTED_VOTING:
+			Melder_information (U"Vote weighting: Inversed squared distance\n", U"k: ", k);
+			break;
+		case kOla_DISTANCE_WEIGHTED_VOTING:
+			Melder_information (U"Vote weighting: Inversed distance\n", U"k: ", k);
+			break;
+		case kOla_FLAT_VOTING:
+			Melder_information (U"Vote weighting: Flat\n", U"k: ", k);
+			break;
+	}
+END2 }
+
+FORM (KNN_evaluate, U"Evaluation", U"KNN: Get accuracy estimate...") {
+	RADIO (U"Evaluation method", 1)
+	RADIOBUTTON (U"Leave one out")
+	RADIOBUTTON (U"10-fold cross-validation")
+	INTEGER (U"k neighbours", U"1")
+	RADIO (U"Vote weighting", 1)
+	RADIOBUTTON (U"Inversed squared distance")
+	RADIOBUTTON (U"Inversed distance")
+	RADIOBUTTON (U"Flat")
+	OK2
 DO
-    iam_ONLY (KNN);
-    if (my nInstances < 1)
-        Melder_throw ("Instance base is empty.");
-    long k = GET_INTEGER (L"k neighbours");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, ".");
-    int vt = GET_INTEGER (L"Vote weighting");
+	iam_ONLY (KNN);
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty.");
+	long k = GET_INTEGER (U"k neighbours");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U".");
+	int vt = GET_INTEGER (U"Vote weighting");
 	switch (vt) {
-        case 1:
-            vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 2:
-            vt = kOla_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 3:
-            vt = kOla_FLAT_VOTING;
-            break;
-    }
-    int mode = GET_INTEGER (L"Evaluation method");
-    switch (mode) {
-        case 2:
-            mode = kOla_TEN_FOLD_CROSS_VALIDATION;
-            break;
-        case 1: 
-            mode = kOla_LEAVE_ONE_OUT;
-            break;
-    }
-    autoFeatureWeights fws = FeatureWeights_create (my input -> nx);
-    double result = KNN_evaluate (me, fws.peek(), k, vt, mode);
-    if (lround (result) == kOla_FWEIGHTS_MISMATCH)
-		Melder_throw ("The number of feature weights should be equal to the dimensionality of the Pattern.");
-    Melder_information (Melder_double (100 * result), L" percent of the instances correctly classified.");   // BUG: use Melder_percent
-END
-
-FORM (KNN_evaluateWithFeatureWeights, L"Evaluation", L"KNN & FeatureWeights: Get accuracy estimate...")
-    RADIO (L"Evaluation method", 1)
-    RADIOBUTTON (L"Leave one out")
-    RADIOBUTTON (L"10-fold cross-validation")
-    INTEGER (L"k neighbours", L"1")
-    RADIO (L"Vote weighting", 1)
-    RADIOBUTTON (L"Inversed squared distance")
-    RADIOBUTTON (L"Inversed distance")
-    RADIOBUTTON (L"Flat")
-    OK
-
+		case 1:
+			vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 2:
+			vt = kOla_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 3:
+			vt = kOla_FLAT_VOTING;
+			break;
+	}
+	int mode = GET_INTEGER (U"Evaluation method");
+	switch (mode) {
+		case 2:
+			mode = kOla_TEN_FOLD_CROSS_VALIDATION;
+			break;
+		case 1: 
+			mode = kOla_LEAVE_ONE_OUT;
+			break;
+	}
+	autoFeatureWeights fws = FeatureWeights_create (my input -> nx);
+	double result = KNN_evaluate (me, fws.peek(), k, vt, mode);
+	if (lround (result) == kOla_FWEIGHTS_MISMATCH)
+		Melder_throw (U"The number of feature weights should be equal to the dimensionality of the Pattern.");
+	Melder_information (100 * result, U" percent of the instances correctly classified.");   // BUG: use Melder_percent
+END2 }
+
+FORM (KNN_evaluateWithFeatureWeights, U"Evaluation", U"KNN & FeatureWeights: Get accuracy estimate...") {
+	RADIO (U"Evaluation method", 1)
+	RADIOBUTTON (U"Leave one out")
+	RADIOBUTTON (U"10-fold cross-validation")
+	INTEGER (U"k neighbours", U"1")
+	RADIO (U"Vote weighting", 1)
+	RADIOBUTTON (U"Inversed squared distance")
+	RADIOBUTTON (U"Inversed distance")
+	RADIOBUTTON (U"Flat")
+	OK2
 DO
-    iam_ONLY (KNN);
-    if (my nInstances < 1)
-		Melder_throw ("Instance base is empty");
-    thouart_ONLY (FeatureWeights);
-    long k = GET_INTEGER (L"k neighbours");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, ".");
-    int vt = GET_INTEGER (L"Vote weighting");
-    switch (vt) {
-        case 1:
-            vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 2:
-            vt = kOla_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 3:
-            vt = kOla_FLAT_VOTING;
-            break;
-    }   
-	int mode = GET_INTEGER (L"Evaluation method");
-    switch (mode) {
-        case 2:
-            mode = kOla_TEN_FOLD_CROSS_VALIDATION;
-            break;
-        case 1:
-            mode = kOla_LEAVE_ONE_OUT;
-            break;
-    }
-    double result = KNN_evaluate (me, thee, k, vt, mode);
-    if (lround (result) == kOla_FWEIGHTS_MISMATCH)
-        Melder_throw ("The number of feature weights should be equal to the dimensionality of the Pattern.");
-    Melder_information (Melder_double (100 * result), L" percent of the instances correctly classified.");
-END
-
+	iam_ONLY (KNN);
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty");
+	thouart_ONLY (FeatureWeights);
+	long k = GET_INTEGER (U"k neighbours");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U".");
+	int vt = GET_INTEGER (U"Vote weighting");
+	switch (vt) {
+		case 1:
+			vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 2:
+			vt = kOla_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 3:
+			vt = kOla_FLAT_VOTING;
+			break;
+	}   
+	int mode = GET_INTEGER (U"Evaluation method");
+	switch (mode) {
+		case 2:
+			mode = kOla_TEN_FOLD_CROSS_VALIDATION;
+			break;
+		case 1:
+			mode = kOla_LEAVE_ONE_OUT;
+			break;
+	}
+	double result = KNN_evaluate (me, thee, k, vt, mode);
+	if (lround (result) == kOla_FWEIGHTS_MISMATCH)
+		Melder_throw (U"The number of feature weights should be equal to the dimensionality of the Pattern.");
+	Melder_information (100 * result, U" percent of the instances correctly classified.");
+END2 }
 
-DIRECT  (KNN_extractInputPatterns)
-    iam_ONLY (KNN);
-    if (my nInstances > 0) {
-        praat_new (Data_copy (my input), L"Input Patterns");
-    } else {
-        Melder_throw ("Instance base is empty.");
+DIRECT2 (KNN_extractInputPatterns) {
+	iam_ONLY (KNN);
+	if (my nInstances > 0) {
+		praat_new (Data_copy (my input), U"Input Patterns");
+	} else {
+		Melder_throw (U"Instance base is empty.");
 	}
-END
+END2 }
 
-DIRECT  (KNN_extractOutputCategories)
-    iam_ONLY (KNN);
-    if (my nInstances > 0) {
-        praat_new (Data_copy (my output), L"Output Categories");
-    } else {
-        Melder_throw ("Instance base is empty.");
+DIRECT2 (KNN_extractOutputCategories) {
+	iam_ONLY (KNN);
+	if (my nInstances > 0) {
+		praat_new (Data_copy (my output), U"Output Categories");
+	} else {
+		Melder_throw (U"Instance base is empty.");
 	}
-END
+END2 }
 
-FORM (KNN_reset, L"Reset", L"KNN: Reset...")
-    LABEL (L"", L"Warning: this command destroys all previous learning.")
-    OK
+FORM (KNN_reset, U"Reset", U"KNN: Reset...") {
+    LABEL (U"", U"Warning: this command destroys all previous learning.")
+    OK2
 DO
-    iam_ONLY (KNN);
-    forget (my input);
-    forget (my output);
-    my nInstances = 0;
+	iam_ONLY (KNN);
+	forget (my input);
+	forget (my output);
+	my nInstances = 0;
 	praat_dataChanged (me);   // BUG: this should be inserted much more often
-END
-
-DIRECT  (KNN_shuffle)
-    iam_ONLY (KNN);
-    if (my nInstances > 0)  
-        KNN_shuffleInstances (me);
-    else
-        Melder_throw ("Instance base is empty.");
-END
+END2 }
 
-FORM (KNN_prune, L"Pruning", L"KNN: Prune...")
-    POSITIVE (L"Noise pruning degree", L"1")
-    POSITIVE (L"Redundancy pruning degree", L"1")
-    INTEGER (L"k neighbours", L"1")
-    OK
+DIRECT2 (KNN_shuffle) {
+	iam_ONLY (KNN);
+	if (my nInstances > 0)  
+		KNN_shuffleInstances (me);
+	else
+		Melder_throw (U"Instance base is empty.");
+END2 }
+
+FORM (KNN_prune, U"Pruning", U"KNN: Prune...") {
+	POSITIVE (U"Noise pruning degree", U"1")
+	POSITIVE (U"Redundancy pruning degree", U"1")
+	INTEGER (U"k neighbours", U"1")
+	OK2
 DO
-    iam_ONLY (KNN);
-    if (my nInstances < 1)
-        Melder_throw ("Instance base is empty.");
-    long oldn = my nInstances;   // save before it changes!
-    long k = GET_INTEGER (L"k neighbours");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, ".");
-    double n = GET_REAL (L"Noise pruning degree");
-    double r = GET_REAL (L"Redundancy pruning degree");
-    if (n <= 0 || n > 1 || r <= 0 || r > 1)
-        Melder_throw ("Please select a pruning degree d such that 0 < d <= 1.");
-    long npruned = KNN_prune_prune (me, n, r, k);
-    Melder_information (Melder_integer (npruned), L" instances discarded. \n", L"Size of new instance base: ", Melder_integer (oldn - npruned));
-END
-
-
-
-
+	iam_ONLY (KNN);
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty.");
+	long oldn = my nInstances;   // save before it changes!
+	long k = GET_INTEGER (U"k neighbours");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U".");
+	double n = GET_REAL (U"Noise pruning degree");
+	double r = GET_REAL (U"Redundancy pruning degree");
+	if (n <= 0 || n > 1 || r <= 0 || r > 1)
+		Melder_throw (U"Please select a pruning degree d such that 0 < d <= 1.");
+	long npruned = KNN_prune_prune (me, n, r, k);
+	Melder_information (npruned, U" instances discarded. \n", U"Size of new instance base: ", oldn - npruned);
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // Learning                                                                            //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-FORM (KNN_learn, L"Learning", L"kNN classifiers 1. What is a kNN classifier?")
-    RADIO (L"Learning method", 1)
-    RADIOBUTTON (L"Append new information")
-    RADIOBUTTON (L"Replace current intancebase")
-    RADIO (L"Ordering", 1)
-    RADIOBUTTON (L"Random")
-    RADIOBUTTON (L"Sequential")
-    OK
+FORM (KNN_learn, U"Learning", U"kNN classifiers 1. What is a kNN classifier?") {
+	RADIO (U"Learning method", 1)
+	RADIOBUTTON (U"Append new information")
+	RADIOBUTTON (U"Replace current intancebase")
+	RADIO (U"Ordering", 1)
+	RADIOBUTTON (U"Random")
+	RADIOBUTTON (U"Sequential")
+	OK2
 DO
-    iam_ONLY (KNN);
-    thouart_ONLY (Pattern);
-    heis_ONLY (Categories);
-    int ordering = GET_INTEGER (L"Ordering");
-    switch (ordering) {
-        case 1:
-            ordering = kOla_SHUFFLE;
-            break;
-        case 2:
-            ordering = kOla_SEQUENTIAL;
-    }
-    int method = GET_INTEGER (L"Learning method");
-    int result = kOla_ERROR;
-    switch (method) {
-        case 1:
-            result = KNN_learn (me, thee, him, my nInstances == 0 ? kOla_REPLACE : kOla_APPEND, ordering);
-            break;
-        case 2:
-            result = KNN_learn (me, thee, him, kOla_REPLACE, ordering);
-            break;
-    }
-    switch (result) {
-        case kOla_PATTERN_CATEGORIES_MISMATCH:  
-            Melder_throw ("The number of Categories should be equal to the number of rows in Pattern.");
-        case kOla_DIMENSIONALITY_MISMATCH:
-            Melder_throw ("The dimensionality of Pattern should be equal to that of the instance base.");
-    }
-END
-
-
-
+	iam_ONLY (KNN);
+	thouart_ONLY (Pattern);
+	heis_ONLY (Categories);
+	int ordering = GET_INTEGER (U"Ordering");
+	switch (ordering) {
+		case 1:
+			ordering = kOla_SHUFFLE;
+			break;
+		case 2:
+			ordering = kOla_SEQUENTIAL;
+	}
+	int method = GET_INTEGER (U"Learning method");
+	int result = kOla_ERROR;
+	switch (method) {
+		case 1:
+			result = KNN_learn (me, thee, him, my nInstances == 0 ? kOla_REPLACE : kOla_APPEND, ordering);
+			break;
+		case 2:
+			result = KNN_learn (me, thee, him, kOla_REPLACE, ordering);
+			break;
+	}
+	switch (result) {
+		case kOla_PATTERN_CATEGORIES_MISMATCH:  
+			Melder_throw (U"The number of Categories should be equal to the number of rows in Pattern.");
+		case kOla_DIMENSIONALITY_MISMATCH:
+			Melder_throw (U"The dimensionality of Pattern should be equal to that of the instance base.");
+	}
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // Evaluation                                                                          //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-
-FORM (KNN_evaluateWithTestSet, L"Evaluation", L"KNN & Pattern & Categories: Evaluate...")
-    INTEGER (L"k neighbours", L"1")
-    RADIO (L"Vote weighting", 1)
-    RADIOBUTTON (L"Inversed squared distance")
-    RADIOBUTTON (L"Inversed distance")
-    RADIOBUTTON (L"Flat")
-    OK
+FORM (KNN_evaluateWithTestSet, U"Evaluation", U"KNN & Pattern & Categories: Evaluate...") {
+	INTEGER (U"k neighbours", U"1")
+	RADIO (U"Vote weighting", 1)
+	RADIOBUTTON (U"Inversed squared distance")
+	RADIOBUTTON (U"Inversed distance")
+	RADIOBUTTON (U"Flat")
+	OK2
 DO
-    iam_ONLY (KNN);
-    if (my nInstances < 1)
-        Melder_throw ("Instance base is empty");
-    thouart_ONLY (Pattern);
-    heis_ONLY (Categories);
-    long k = GET_INTEGER (L"k neighbours");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, ".");
-    int vt = GET_INTEGER (L"Vote weighting");
-    switch (vt) {
-        case 1:
-            vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 2:
-            vt = kOla_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 3:
-            vt = kOla_FLAT_VOTING;
-            break;
-    }
-    if (thy ny != his size)
-        Melder_throw ("The number of Categories should be equal to the number of rows in Pattern.");
-    if (thy nx != (my input)->nx)
-        Melder_throw ("The dimensionality of Pattern should be equal to that of the instance base.");
-    autoFeatureWeights fws = FeatureWeights_create (thy nx);
-    double result = KNN_evaluateWithTestSet (me, thee, him, fws.peek(), k, vt);
-    Melder_information (Melder_double (100 * result), L" percent of the instances correctly classified.");
-END
-
-FORM (KNN_evaluateWithTestSetAndFeatureWeights, L"Evaluation", L"KNN & Pattern & Categories & FeatureWeights: Evaluate...")
-    INTEGER (L"k neighbours", L"1")
-    RADIO (L"Vote weighting", 1)
-    RADIOBUTTON (L"Inversed squared distance")
-    RADIOBUTTON (L"Inversed distance")
-    RADIOBUTTON (L"Flat")
-    OK
+	iam_ONLY (KNN);
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty");
+	thouart_ONLY (Pattern);
+	heis_ONLY (Categories);
+	long k = GET_INTEGER (U"k neighbours");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U".");
+	int vt = GET_INTEGER (U"Vote weighting");
+	switch (vt) {
+		case 1:
+			vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 2:
+			vt = kOla_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 3:
+			vt = kOla_FLAT_VOTING;
+			break;
+	}
+	if (thy ny != his size)
+		Melder_throw (U"The number of Categories should be equal to the number of rows in Pattern.");
+	if (thy nx != (my input)->nx)
+		Melder_throw (U"The dimensionality of Pattern should be equal to that of the instance base.");
+	autoFeatureWeights fws = FeatureWeights_create (thy nx);
+	double result = KNN_evaluateWithTestSet (me, thee, him, fws.peek(), k, vt);
+	Melder_information (100 * result, U" percent of the instances correctly classified.");
+END2 }
+
+FORM (KNN_evaluateWithTestSetAndFeatureWeights, U"Evaluation", U"KNN & Pattern & Categories & FeatureWeights: Evaluate...") {
+	INTEGER (U"k neighbours", U"1")
+	RADIO (U"Vote weighting", 1)
+	RADIOBUTTON (U"Inversed squared distance")
+	RADIOBUTTON (U"Inversed distance")
+	RADIOBUTTON (U"Flat")
+	OK2
 DO
-    iam_ONLY (KNN);
-    if (my nInstances < 1)
-        Melder_throw ("Instance base is empty");
-    Pattern p = (Pattern) ONLY (classPattern);
-    Categories c = (Categories) ONLY (classCategories);
-    FeatureWeights fws = (FeatureWeights) ONLY (classFeatureWeights);
-    long k = GET_INTEGER (L"k neighbours");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, ".");
-    int vt = GET_INTEGER (L"Vote weighting");
-    switch (vt) {
-        case 1:
-            vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 2:
-            vt = kOla_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 3:
-            vt = kOla_FLAT_VOTING;
-            break;
-    }
-    if (p -> ny != c -> size)
-        Melder_throw ("The number of Categories should be equal to the number of rows in Pattern.");
-    if (p -> nx != my input -> nx)
-        Melder_throw ("The dimensionality of Pattern should be equal to that of the instance base.");
-    if (p->nx != fws -> fweights -> numberOfColumns)
-        Melder_throw ("The number of feature weights should be equal to the dimensionality of the Pattern.");
-    double result = KNN_evaluateWithTestSet (me, p, c, fws, k, vt);
-    Melder_information (Melder_double (100 * result), L" percent of the instances correctly classified.");
-END
-
-
-
+	iam_ONLY (KNN);
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty");
+	Pattern p = (Pattern) ONLY (classPattern);
+	Categories c = (Categories) ONLY (classCategories);
+	FeatureWeights fws = (FeatureWeights) ONLY (classFeatureWeights);
+	long k = GET_INTEGER (U"k neighbours");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U".");
+	int vt = GET_INTEGER (U"Vote weighting");
+	switch (vt) {
+		case 1:
+			vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 2:
+			vt = kOla_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 3:
+			vt = kOla_FLAT_VOTING;
+			break;
+	}
+	if (p -> ny != c -> size)
+		Melder_throw (U"The number of Categories should be equal to the number of rows in Pattern.");
+	if (p -> nx != my input -> nx)
+		Melder_throw (U"The dimensionality of Pattern should be equal to that of the instance base.");
+	if (p->nx != fws -> fweights -> numberOfColumns)
+		Melder_throw (U"The number of feature weights should be equal to the dimensionality of the Pattern.");
+	double result = KNN_evaluateWithTestSet (me, p, c, fws, k, vt);
+	Melder_information (100 * result, U" percent of the instances correctly classified.");
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // Classification                                                                      //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-FORM (KNN_toCategories, L"Classification", L"KNN & Pattern: To Categories...")
-    INTEGER (L"k neighbours", L"1")
-    RADIO (L"Vote weighting", 1)
-    RADIOBUTTON (L"Inversed squared distance")
-    RADIOBUTTON (L"Inversed distance")
-    RADIOBUTTON (L"Flat")
-    OK
+FORM (KNN_toCategories, U"Classification", U"KNN & Pattern: To Categories...") {
+	INTEGER (U"k neighbours", U"1")
+	RADIO (U"Vote weighting", 1)
+	RADIOBUTTON (U"Inversed squared distance")
+	RADIOBUTTON (U"Inversed distance")
+	RADIOBUTTON (U"Flat")
+	OK2
 DO
-    iam_ONLY (KNN);
-    if (my nInstances < 1)
-        Melder_throw ("Instance base is empty.");
-    thouart_ONLY (Pattern);
-    long k = GET_INTEGER (L"k neighbours");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, ".");
-    int vt = GET_INTEGER (L"Vote weighting");
-    switch (vt) {
-        case 1:
-            vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 2:
-            vt = kOla_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 3:
-            vt = kOla_FLAT_VOTING;
-            break;
-    }
-    if (thy nx != my input -> nx)
-        Melder_throw ("The dimensionality of Pattern should match that of the instance base.");
-    autoFeatureWeights fws = FeatureWeights_create (thy nx);
-    praat_new (KNN_classifyToCategories (me, thee, fws.peek(), k, vt), L"Output");
-END
-
-FORM (KNN_toTableOfReal, L"Classification", L"KNN & Pattern: To TabelOfReal...")
-    INTEGER (L"k neighbours", L"1")
-    RADIO (L"Vote weighting", 1)
-    RADIOBUTTON (L"Inversed squared distance")
-    RADIOBUTTON (L"Inversed distance")
-    RADIOBUTTON (L"Flat")
-    OK
+	iam_ONLY (KNN);
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty.");
+	thouart_ONLY (Pattern);
+	long k = GET_INTEGER (U"k neighbours");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U".");
+	int vt = GET_INTEGER (U"Vote weighting");
+	switch (vt) {
+		case 1:
+			vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 2:
+			vt = kOla_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 3:
+			vt = kOla_FLAT_VOTING;
+			break;
+	}
+	if (thy nx != my input -> nx)
+		Melder_throw (U"The dimensionality of Pattern should match that of the instance base.");
+	autoFeatureWeights fws = FeatureWeights_create (thy nx);
+	praat_new (KNN_classifyToCategories (me, thee, fws.peek(), k, vt), U"Output");
+END2 }
+
+FORM (KNN_toTableOfReal, U"Classification", U"KNN & Pattern: To TabelOfReal...") {
+	INTEGER (U"k neighbours", U"1")
+	RADIO (U"Vote weighting", 1)
+	RADIOBUTTON (U"Inversed squared distance")
+	RADIOBUTTON (U"Inversed distance")
+	RADIOBUTTON (U"Flat")
+	OK2
 DO
-    iam_ONLY (KNN);
-    if (my nInstances < 1)
-        Melder_throw ("Instance base is empty.");
-    thouart_ONLY (Pattern);
-    long k = GET_INTEGER (L"k neighbours");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, ".");
-    autoFeatureWeights fws = FeatureWeights_create(thy nx);
-    int vt = GET_INTEGER (L"Vote weighting");
-    switch (vt) {
-        case 1:
-            vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 2:
-            vt = kOla_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 3:
-            vt = kOla_FLAT_VOTING;
-            break;
-    }
-    if (thy nx != my input -> nx)
-        Melder_throw ("The dimensionality of Pattern should match that of the instance base.");
-    praat_new (KNN_classifyToTableOfReal (me, thee, fws.peek(), k, vt), L"Output");
-END
-
-FORM (KNN_toCategoriesWithFeatureWeights, L"Classification", L"KNN & Pattern & FeatureWeights: To Categories...")
-    INTEGER (L"k neighbours", L"KNN & Pattern & FeatureWeights: To Categories...")
-    RADIO (L"Vote weighting", 1)
-    RADIOBUTTON (L"Inversed squared distance")  
-    RADIOBUTTON (L"Inversed distance")
-    RADIOBUTTON (L"Flat")
-    OK
+	iam_ONLY (KNN);
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty.");
+	thouart_ONLY (Pattern);
+	long k = GET_INTEGER (U"k neighbours");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U".");
+	autoFeatureWeights fws = FeatureWeights_create(thy nx);
+	int vt = GET_INTEGER (U"Vote weighting");
+	switch (vt) {
+		case 1:
+			vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 2:
+			vt = kOla_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 3:
+			vt = kOla_FLAT_VOTING;
+			break;
+	}
+	if (thy nx != my input -> nx)
+		Melder_throw (U"The dimensionality of Pattern should match that of the instance base.");
+	praat_new (KNN_classifyToTableOfReal (me, thee, fws.peek(), k, vt), U"Output");
+END2 }
+
+FORM (KNN_toCategoriesWithFeatureWeights, U"Classification", U"KNN & Pattern & FeatureWeights: To Categories...") {
+	INTEGER (U"k neighbours", U"KNN & Pattern & FeatureWeights: To Categories...")
+	RADIO (U"Vote weighting", 1)
+	RADIOBUTTON (U"Inversed squared distance")  
+	RADIOBUTTON (U"Inversed distance")
+	RADIOBUTTON (U"Flat")
+	OK2
 DO
-    iam_ONLY (KNN);
-    if (my nInstances < 1)
-        Melder_throw ("Instance base is empty.");
-    thouart_ONLY (Pattern);
-    heis_ONLY (FeatureWeights);
-    int vt = GET_INTEGER (L"Vote weighting");
-    switch (vt) {
-        case 1:
-            vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 2:
-            vt = kOla_DISTANCE_WEIGHTED_VOTING;  
-            break;
-        case 3:
-            vt = kOla_FLAT_VOTING;
-            break;
-    }
-    long k = GET_INTEGER (L"k neighbours");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, ".");
-    if (thy nx != (my input)->nx)
-        Melder_throw ("The dimensionality of Pattern should be equal to that of the instance base.");
-    if (thy nx != his fweights -> numberOfColumns)
-        Melder_throw ("The number of feature weights should be equal to the dimensionality of the Pattern.");
-	praat_new (KNN_classifyToCategories (me, thee, him, k, vt), L"Output");
-END
-
-FORM (KNN_toTableOfRealWithFeatureWeights, L"Classification", L"KNN & Pattern & FeatureWeights: To TableOfReal...")
-    INTEGER (L"k neighbours", L"1")
-    RADIO (L"Vote weighting", 1)
-    RADIOBUTTON (L"Inversed squared distance")
-    RADIOBUTTON (L"Inversed distance")
-    RADIOBUTTON (L"Flat")
-    OK
+	iam_ONLY (KNN);
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty.");
+	thouart_ONLY (Pattern);
+	heis_ONLY (FeatureWeights);
+	int vt = GET_INTEGER (U"Vote weighting");
+	switch (vt) {
+		case 1:
+			vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 2:
+			vt = kOla_DISTANCE_WEIGHTED_VOTING;  
+			break;
+		case 3:
+			vt = kOla_FLAT_VOTING;
+			break;
+	}
+	long k = GET_INTEGER (U"k neighbours");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U".");
+	if (thy nx != (my input)->nx)
+		Melder_throw (U"The dimensionality of Pattern should be equal to that of the instance base.");
+	if (thy nx != his fweights -> numberOfColumns)
+		Melder_throw (U"The number of feature weights should be equal to the dimensionality of the Pattern.");
+	praat_new (KNN_classifyToCategories (me, thee, him, k, vt), U"Output");
+END2 }
+
+FORM (KNN_toTableOfRealWithFeatureWeights, U"Classification", U"KNN & Pattern & FeatureWeights: To TableOfReal...") {
+	INTEGER (U"k neighbours", U"1")
+	RADIO (U"Vote weighting", 1)
+	RADIOBUTTON (U"Inversed squared distance")
+	RADIOBUTTON (U"Inversed distance")
+	RADIOBUTTON (U"Flat")
+	OK2
 DO
-    iam_ONLY (KNN);
-    if (my nInstances < 1)
-        Melder_throw ("Instance base is empty.");
-    thouart_ONLY (Pattern);
-    heis_ONLY (FeatureWeights);
-    long k = GET_INTEGER (L"k neighbours");
-    int vt = GET_INTEGER (L"Vote weighting");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, "\n");
-    if (thy nx != his fweights -> numberOfColumns)
-        Melder_throw ("The number of features and the number of feature weights should be equal.");
-    switch (vt) {
-        case 1:
-            vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 2:
-            vt = kOla_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 3:
-            vt = kOla_FLAT_VOTING;
-            break;
-    }
-    praat_new (KNN_classifyToTableOfReal (me, thee, him, k, vt), L"Output");
-END
-
-
-
-
-
+	iam_ONLY (KNN);
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty.");
+	thouart_ONLY (Pattern);
+	heis_ONLY (FeatureWeights);
+	long k = GET_INTEGER (U"k neighbours");
+	int vt = GET_INTEGER (U"Vote weighting");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U"\n");
+	if (thy nx != his fweights -> numberOfColumns)
+		Melder_throw (U"The number of features and the number of feature weights should be equal.");
+	switch (vt) {
+		case 1:
+			vt = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 2:
+			vt = kOla_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 3:
+			vt = kOla_FLAT_VOTING;
+			break;
+	}
+	praat_new (KNN_classifyToTableOfReal (me, thee, him, k, vt), U"Output");
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // Clustering                                                                          //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-FORM (Pattern_to_Categories_cluster, L"k-means clustering", L"Pattern: To Categories...")
-    INTEGER (L"k clusters", L"1")
-    POSITIVE (L"Cluster size ratio constraint", L"0.0000001");
-    INTEGER (L"Maximum number of reseeds", L"1000")
-    OK
+FORM (Pattern_to_Categories_cluster, U"k-means clustering", U"Pattern: To Categories...") {
+	INTEGER (U"k clusters", U"1")
+	POSITIVE (U"Cluster size ratio constraint", U"0.0000001");
+	INTEGER (U"Maximum number of reseeds", U"1000")
+	OK2
 DO
-    iam_ONLY (Pattern);
-    if (my nx > 0 && my ny > 0) {
-        long k = GET_INTEGER (L"k clusters");
-        if (k < 1 || k > my ny)
-            Melder_throw ("Please select a value of k such that 0 < k <= ", my ny, ".");
-        long rs =  GET_INTEGER (L"Maximum number of reseeds");
-        if (rs < 0)
-            Melder_throw ("The maximum number of reseeds should not be negative.");
-        double rc =  GET_REAL (L"Cluster size ratio constraint");
+	iam_ONLY (Pattern);
+	if (my nx > 0 && my ny > 0) {
+		long k = GET_INTEGER (U"k clusters");
+		if (k < 1 || k > my ny)
+			Melder_throw (U"Please select a value of k such that 0 < k <= ", my ny, U".");
+		long rs =  GET_INTEGER (U"Maximum number of reseeds");
+		if (rs < 0)
+			Melder_throw (U"The maximum number of reseeds should not be negative.");
+		double rc =  GET_REAL (U"Cluster size ratio constraint");
 		if (rc > 1 || rc <= 0)
-            Melder_throw ("Please select a value of the cluster size ratio constraint c such that 0 < c <= 1.");
-        autoFeatureWeights fws = FeatureWeights_create (my nx);
-        praat_new (Pattern_to_Categories_cluster (me, fws.peek(), k, rc, rs), L"Output");
-    } else {
-        Melder_throw ("Pattern is empty.");
+			Melder_throw (U"Please select a value of the cluster size ratio constraint c such that 0 < c <= 1.");
+		autoFeatureWeights fws = FeatureWeights_create (my nx);
+		praat_new (Pattern_to_Categories_cluster (me, fws.peek(), k, rc, rs), U"Output");
+	} else {
+		Melder_throw (U"Pattern is empty.");
 	}
-END
+END2 }
 
-FORM (Pattern_to_Categories_clusterWithFeatureWeights, L"k-means clustering", L"Pattern & FeatureWeights: To Categories...")
-    INTEGER (L"k clusters", L"1")
-    POSITIVE (L"Cluster size ratio constraint", L"0.0000001");
-    INTEGER (L"Maximum number of reseeds", L"1000")
-    OK
+FORM (Pattern_to_Categories_clusterWithFeatureWeights, U"k-means clustering", U"Pattern & FeatureWeights: To Categories...") {
+	INTEGER (U"k clusters", U"1")
+	POSITIVE (U"Cluster size ratio constraint", U"0.0000001");
+	INTEGER (U"Maximum number of reseeds", U"1000")
+	OK2
 DO
-    iam_ONLY (Pattern);
-    if (my nx > 0 && my ny > 0) {
-        thouart_ONLY (FeatureWeights); 
-        if (my nx != thy fweights -> numberOfColumns)
-            Melder_throw ("The number of features and the number of feature weights should be equal.");
-		long k = GET_INTEGER(L"k clusters");
-        if (k < 1 || k > my ny)
-            Melder_throw ("Please select a value of k such that 0 < k <= ", my ny, ".");
-        long rs =  GET_INTEGER(L"Maximum number of reseeds");
-        if (rs < 0)
-            Melder_throw ("The maximum number of reseeds should not be negative.");
-        double rc =  GET_REAL(L"Cluster size ratio constraint");
+	iam_ONLY (Pattern);
+	if (my nx > 0 && my ny > 0) {
+		thouart_ONLY (FeatureWeights); 
+		if (my nx != thy fweights -> numberOfColumns)
+			Melder_throw (U"The number of features and the number of feature weights should be equal.");
+		long k = GET_INTEGER(U"k clusters");
+		if (k < 1 || k > my ny)
+			Melder_throw (U"Please select a value of k such that 0 < k <= ", my ny, U".");
+		long rs =  GET_INTEGER(U"Maximum number of reseeds");
+		if (rs < 0)
+			Melder_throw (U"The maximum number of reseeds should not be negative.");
+		double rc =  GET_REAL(U"Cluster size ratio constraint");
 		if (rc > 1 || rc <= 0)
-            Melder_throw ("Please select a value of the cluster size ratio constraint c such that 0 < c <= 1.");
-        praat_new (Pattern_to_Categories_cluster (me, thee, k, rc, rs), L"Output");
-    } else {
-        Melder_throw ("Pattern is empty.");
+			Melder_throw (U"Please select a value of the cluster size ratio constraint c such that 0 < c <= 1.");
+		praat_new (Pattern_to_Categories_cluster (me, thee, k, rc, rs), U"Output");
+	} else {
+		Melder_throw (U"Pattern is empty.");
 	}
-END
-
-
-
-
-
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // Dissimilarity computations                                                          //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-DIRECT (KNN_patternToDissimilarity)
-    iam_ONLY (Pattern);
-    autoFeatureWeights fws = FeatureWeights_create (my nx);
-    praat_new (KNN_patternToDissimilarity (me, fws.peek()), L"Output");
-END
-
-DIRECT (KNN_patternToDissimilarityWithFeatureWeights)
-    iam_ONLY (Pattern);
-    thouart_ONLY (FeatureWeights);  
-    if (my nx != thy fweights -> numberOfColumns)
-        Melder_throw ("The number of features and the number of feature weights should be equal.");
-	praat_new (KNN_patternToDissimilarity (me, thee), L"Output");
-END
+DIRECT2 (KNN_patternToDissimilarity) {
+	iam_ONLY (Pattern);
+	autoFeatureWeights fws = FeatureWeights_create (my nx);
+	praat_new (KNN_patternToDissimilarity (me, fws.peek()), U"Output");
+END2 }
 
+DIRECT2 (KNN_patternToDissimilarityWithFeatureWeights) {
+	iam_ONLY (Pattern);
+	thouart_ONLY (FeatureWeights);  
+	if (my nx != thy fweights -> numberOfColumns)
+		Melder_throw (U"The number of features and the number of feature weights should be equal.");
+	praat_new (KNN_patternToDissimilarity (me, thee), U"Output");
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // Computation of permutation                                                          //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-
-FORM (KNN_SA_computePermutation, L"To Permutation...", L"Pattern & Categories: To FeatureWeights...")
-    
-    NATURAL(L"Tries per step", L"200")
-    NATURAL(L"Iterations", L"10")
-    POSITIVE(L"Step size", L"10")
-    POSITIVE(L"Boltzmann constant", L"1.0")
-    POSITIVE(L"Initial temperature", L"0.002")
-    POSITIVE(L"Damping factor", L"1.005")
-    POSITIVE(L"Final temperature", L"0.000002")
-    OK
+FORM (KNN_SA_computePermutation, U"To Permutation...", U"Pattern & Categories: To FeatureWeights...") {
+	NATURAL (U"Tries per step", U"200")
+	NATURAL (U"Iterations", U"10")
+	POSITIVE (U"Step size", U"10")
+	POSITIVE (U"Boltzmann constant", U"1.0")
+	POSITIVE (U"Initial temperature", U"0.002")
+	POSITIVE (U"Damping factor", U"1.005")
+	POSITIVE (U"Final temperature", U"0.000002")
+	OK2
 DO
-    iam_ONLY (KNN);
-    long tries = GET_INTEGER (L"Tries per step");
-    long iterations = GET_INTEGER (L"Iterations");
-    double step_size = GET_REAL (L"Step size");
-    double bolzmann_c = GET_REAL (L"Boltzmann constant");
-    double temp_start = GET_REAL (L"Initial temperature");
-    double temp_damp = GET_REAL (L"Damping factor");
-    double temp_stop = GET_REAL (L"Final temperature");
-	praat_new (KNN_SA_ToPermutation (me, tries, iterations, step_size, bolzmann_c, temp_start, temp_damp, temp_stop), L"Output");
-END
-
-
+	iam_ONLY (KNN);
+	long tries = GET_INTEGER (U"Tries per step");
+	long iterations = GET_INTEGER (U"Iterations");
+	double step_size = GET_REAL (U"Step size");
+	double bolzmann_c = GET_REAL (U"Boltzmann constant");
+	double temp_start = GET_REAL (U"Initial temperature");
+	double temp_damp = GET_REAL (U"Damping factor");
+	double temp_stop = GET_REAL (U"Final temperature");
+	praat_new (KNN_SA_ToPermutation (me, tries, iterations, step_size, bolzmann_c, temp_start, temp_damp, temp_stop), U"Output");
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // Computation of feature weights                                                      //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-
-FORM (FeatureWeights_computeRELIEF, L"Feature weights", L"Pattern & Categories: To FeatureWeights...")
-    INTEGER (L"Number of neighbours", L"1")
-    OK
+FORM (FeatureWeights_computeRELIEF, U"Feature weights", U"Pattern & Categories: To FeatureWeights...") {
+	INTEGER (U"Number of neighbours", U"1")
+	OK2
 DO
-    iam_ONLY (Pattern);
-    thouart_ONLY (Categories);
-    if (my ny < 2)
-        Melder_throw ("The Pattern object should contain at least 2 rows.");
-    if (my ny != thy size)
-        Melder_throw ("The number of rows in the Pattern object should equal the number of categories in the Categories object.");
-    praat_new (FeatureWeights_compute (me, thee, GET_INTEGER (L"Number of neighbours")), L"Output");
-END
-
-FORM (FeatureWeights_computeWrapperExt, L"Feature weights", L"KNN & Pattern & Categories: To FeatureWeights..")
-    POSITIVE(L"Learning rate", L"0.02")
-    NATURAL(L"Number of seeds", L"20")
-    POSITIVE(L"Stop at", L"1")
-    RADIO (L"Optimization", 1)
-    RADIOBUTTON (L"Co-optimization")
-    RADIOBUTTON (L"Single feature")
-
-    NATURAL (L"k neighbours", L"1")
-    RADIO (L"Vote weighting", 3)
-    RADIOBUTTON (L"Inversed squared distance")
-    RADIOBUTTON (L"Inversed distance")  
-    RADIOBUTTON (L"Flat")
-    OK
-
+	iam_ONLY (Pattern);
+	thouart_ONLY (Categories);
+	if (my ny < 2)
+		Melder_throw (U"The Pattern object should contain at least 2 rows.");
+	if (my ny != thy size)
+		Melder_throw (U"The number of rows in the Pattern object should equal the number of categories in the Categories object.");
+	praat_new (FeatureWeights_compute (me, thee, GET_INTEGER (U"Number of neighbours")), U"Output");
+END2 }
+
+FORM (FeatureWeights_computeWrapperExt, U"Feature weights", U"KNN & Pattern & Categories: To FeatureWeights..") {
+	POSITIVE (U"Learning rate", U"0.02")
+	NATURAL (U"Number of seeds", U"20")
+	POSITIVE (U"Stop at", U"1")
+	RADIO (U"Optimization", 1)
+		RADIOBUTTON (U"Co-optimization")
+		RADIOBUTTON (U"Single feature")
+	NATURAL (U"k neighbours", U"1")
+	RADIO (U"Vote weighting", 3)
+		RADIOBUTTON (U"Inversed squared distance")
+		RADIOBUTTON (U"Inversed distance")
+		RADIOBUTTON (U"Flat")
+	OK2
 DO
-    iam_ONLY (KNN);
-    if (my nInstances < 1)
-        Melder_throw ("Instance base is empty");
-    thouart_ONLY (Pattern);
-    heis_ONLY (Categories);
-    int mode = GET_INTEGER (L"Vote weighting");
-    switch (mode) {
-        case 1:
-            mode = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 2:
-            mode = kOla_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 3:
-            mode = kOla_FLAT_VOTING;
-            break;
-    }
-    long k = GET_INTEGER (L"k neighbours");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, ".");
-    if (thy nx != my input -> nx)
-        Melder_throw ("The dimensionality of Pattern should be equal to that of the instance base.");
-    praat_new (FeatureWeights_computeWrapperExt (me, thee, him, k, mode, GET_INTEGER (L"Number of seeds"),
-		GET_REAL (L"Learning rate"), GET_REAL (L"Stop at"), (int) GET_INTEGER (L"Optimization")), L"Output");
-END
-
-FORM (FeatureWeights_computeWrapperInt, L"Feature weights", L"KNN: To FeatureWeights...")
-    POSITIVE(L"Learning rate", L"0.02")
-    NATURAL(L"Number of seeds", L"10")
-    POSITIVE(L"Stop at", L"1")
-    RADIO (L"Optimization", 1)
-    RADIOBUTTON (L"Co-optimization")
-    RADIOBUTTON (L"Single feature")
-    RADIO (L"Evaluation method", 1)
-    RADIOBUTTON (L"Leave one out")
-    RADIOBUTTON (L"10-fold cross-validation")
-    NATURAL (L"k neighbours", L"1")
-    RADIO (L"Vote weighting", 3)
-    RADIOBUTTON (L"Inversed squared distance")
-    RADIOBUTTON (L"Inversed distance")
-    RADIOBUTTON (L"Flat")
-    OK
-
+	iam_ONLY (KNN);
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty");
+	thouart_ONLY (Pattern);
+	heis_ONLY (Categories);
+	int mode = GET_INTEGER (U"Vote weighting");
+	switch (mode) {
+		case 1:
+			mode = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 2:
+			mode = kOla_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 3:
+			mode = kOla_FLAT_VOTING;
+			break;
+	}
+	long k = GET_INTEGER (U"k neighbours");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U".");
+	if (thy nx != my input -> nx)
+		Melder_throw (U"The dimensionality of Pattern should be equal to that of the instance base.");
+	praat_new (FeatureWeights_computeWrapperExt (me, thee, him, k, mode, GET_INTEGER (U"Number of seeds"),
+		GET_REAL (U"Learning rate"), GET_REAL (U"Stop at"), (int) GET_INTEGER (U"Optimization")), U"Output");
+END2 }
+
+FORM (FeatureWeights_computeWrapperInt, U"Feature weights", U"KNN: To FeatureWeights...") {
+	POSITIVE (U"Learning rate", U"0.02")
+	NATURAL (U"Number of seeds", U"10")
+	POSITIVE (U"Stop at", U"1")
+	RADIO (U"Optimization", 1)
+		RADIOBUTTON (U"Co-optimization")
+		RADIOBUTTON (U"Single feature")
+	RADIO (U"Evaluation method", 1)
+		RADIOBUTTON (U"Leave one out")
+		RADIOBUTTON (U"10-fold cross-validation")
+	NATURAL (U"k neighbours", U"1")
+	RADIO (U"Vote weighting", 3)
+		RADIOBUTTON (U"Inversed squared distance")
+		RADIOBUTTON (U"Inversed distance")
+		RADIOBUTTON (U"Flat")
+	OK2
 DO
 	iam_ONLY (KNN);
-    if (my nInstances < 1)
-        Melder_throw ("Instance base is empty");
-    int emode = GET_INTEGER (L"Evaluation method");
-    switch (emode) {
-        case 2:
-            emode = kOla_TEN_FOLD_CROSS_VALIDATION;
-            break;
-        case 1:
-            emode = kOla_LEAVE_ONE_OUT;
-            break;
-    }
-    int mode = GET_INTEGER (L"Vote weighting");
-    switch (mode) {
-        case 1:
-            mode = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 2:
-            mode = kOla_DISTANCE_WEIGHTED_VOTING;
-            break;
-        case 3:
-            mode = kOla_FLAT_VOTING;
-            break;
-    }
-    long k = GET_INTEGER (L"k neighbours");
-    if (k < 1 || k > my nInstances)
-        Melder_throw ("Please select a value of k such that 0 < k < ", my nInstances + 1, ".");
-    praat_new (FeatureWeights_computeWrapperInt (me, k, mode, GET_INTEGER (L"Number of seeds"), GET_REAL (L"Learning rate"),
-		GET_REAL (L"Stop at"), (int) GET_INTEGER (L"Optimization"), emode), L"Output");
-END
-
-
-
-
-
+	if (my nInstances < 1)
+		Melder_throw (U"Instance base is empty");
+	int emode = GET_INTEGER (U"Evaluation method");
+	switch (emode) {
+		case 2:
+			emode = kOla_TEN_FOLD_CROSS_VALIDATION;
+			break;
+		case 1:
+			emode = kOla_LEAVE_ONE_OUT;
+			break;
+	}
+	int mode = GET_INTEGER (U"Vote weighting");
+	switch (mode) {
+		case 1:
+			mode = kOla_SQUARED_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 2:
+			mode = kOla_DISTANCE_WEIGHTED_VOTING;
+			break;
+		case 3:
+			mode = kOla_FLAT_VOTING;
+			break;
+	}
+	long k = GET_INTEGER (U"k neighbours");
+	if (k < 1 || k > my nInstances)
+		Melder_throw (U"Please select a value of k such that 0 < k < ", my nInstances + 1, U".");
+	praat_new (FeatureWeights_computeWrapperInt (me, k, mode, GET_INTEGER (U"Number of seeds"), GET_REAL (U"Learning rate"),
+		GET_REAL (U"Stop at"), (int) GET_INTEGER (U"Optimization"), emode), U"Output");
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // Creation and processing of auxiliary datatypes                                      //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-FORM (Pattern_create, L"Create Pattern", 0)
-    WORD (L"Name", L"1x1")
-    NATURAL (L"Dimension of a pattern", L"1")
-    NATURAL (L"Number of patterns", L"1")
-    OK
+FORM (Pattern_create, U"Create Pattern", 0) {
+	WORD (U"Name", U"1x1")
+	NATURAL (U"Dimension of a pattern", U"1")
+	NATURAL (U"Number of patterns", U"1")
+	OK2
 DO
-    praat_new (Pattern_create (GET_INTEGER (L"Number of patterns"), GET_INTEGER (L"Dimension of a pattern")), GET_STRING (L"Name"));
-END
+	praat_new (Pattern_create (GET_INTEGER (U"Number of patterns"), GET_INTEGER (U"Dimension of a pattern")), GET_STRING (U"Name"));
+END2 }
 
-FORM (Categories_create, L"Create Categories", 0)
-    WORD (L"Name", L"empty")
-    OK
+FORM (Categories_create, U"Create Categories", 0) {
+	WORD (U"Name", U"empty")
+	OK2
 DO
-    praat_new (Categories_create (), GET_STRING (L"Name"));
-END
+	praat_new (Categories_create ().transfer(), GET_STRING (U"Name"));
+END2 }
 
-FORM (FeatureWeights_create, L"Create FeatureWeights", 0)
-    WORD (L"Name", L"empty")
-NATURAL (L"Number of weights", L"1")
-OK
+FORM (FeatureWeights_create, U"Create FeatureWeights", 0) {
+	WORD (U"Name", U"empty")
+	NATURAL (U"Number of weights", U"1")
+	OK2
 DO
-    praat_new (FeatureWeights_create (GET_INTEGER (L"Number of weights")), GET_STRING (L"Name"));
-END
-
+	praat_new (FeatureWeights_create (GET_INTEGER (U"Number of weights")), GET_STRING (U"Name"));
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // DEBUG                                                                               //
@@ -833,12 +789,12 @@ DIRECT (KNN_debug_KNN_SA_partition)
                 ++k;
             }
 
-    praat_new (output, L"Output");
+    praat_new (output, U"Output");
 
 END
 
 DIRECT (KNN_debug_KNN_getNumberOfCPUs)
-    Melder_information (Melder_integer(KNN_getNumberOfCPUs()), L" CPUs available");
+    Melder_information (KNN_getNumberOfCPUs(), U" CPUs available");
 END
 
 DIRECT (KNN_debug_KNN_threadTest)
@@ -848,63 +804,53 @@ END
 #endif
 */
 
-
-
-
 /////////////////////////////////////////////////////////////////////////////////////////
 // Help                                                                                //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-DIRECT (KNN_help)
-    Melder_help (L"KNN classifiers");
-END
+DIRECT2 (KNN_help) {
+	Melder_help (U"KNN classifiers");
+END2 }
 
-DIRECT (hint_KNN_and_FeatureWeights_evaluate)
-    Melder_information (L"The accuracy of a KNN can be estimated by selecting a KNN and a FeatureWeights object and choosing \"Evaluate...\".");
-END
+DIRECT2 (hint_KNN_and_FeatureWeights_evaluate) {
+	Melder_information (U"The accuracy of a KNN can be estimated by selecting a KNN and a FeatureWeights object and choosing \"Evaluate...\".");
+END2 }
 
-DIRECT (hint_KNN_and_Pattern_classify)
-    Melder_information (L"You can use the KNN as a classifier by selecting a KNN and a Pattern and choosing \"To Categories...\" or \"To TableOfReal...\".");
-END
-
-DIRECT (hint_KNN_and_Pattern_and_FeatureWeights_classify)
-    Melder_information (L"You can use the KNN as a classifier by selecting a KNN, a Pattern and an FeatureWeights object and choosing \"To Categories...\" or \"To TableOfReal...\".");
-END
-
-DIRECT (hint_KNN_and_Pattern_and_Categories_learn)
-    Melder_information (L"You can train a KNN by selecting a KNN, a Pattern and a Categories object together and choosing \"Learn...\".");
-END
-
-DIRECT (hint_KNN_and_Pattern_and_Categories_evaluate)
-    Melder_information (L"The accuracy of a KNN can be estimated by selecting a KNN, a test Pattern and the corresponding Categories object and choosing \"Evaluate...\".");
-END
-
-DIRECT (hint_KNN_and_Pattern_and_Categories_and_FeatureWeights_evaluate)
-    Melder_information (L"The accuracy of a KNN can be estimated by selecting a KNN, a test Pattern, an FeatureWeights object, and the corresponding Categories object and choosing \"Evaluate...\".");
-END
-
-DIRECT (hint_Pattern_and_FeatureWeights_to_Categories)
-    Melder_information (L"A Pattern object and a FeatureWeights object can be used to compute a fixed number of clusters using the k-means clustering clustering algorithm.");
-END
-
-DIRECT (hint_Pattern_and_FeatureWeights_to_Dissimilarity)
-    Melder_information (L"A Dissimilarity matrix can be generated from a Pattern and a FeatureWeights object.");
-END
+DIRECT2 (hint_KNN_and_Pattern_classify) {
+	Melder_information (U"You can use the KNN as a classifier by selecting a KNN and a Pattern and choosing \"To Categories...\" or \"To TableOfReal...\".");
+END2 }
 
+DIRECT2 (hint_KNN_and_Pattern_and_FeatureWeights_classify) {
+	Melder_information (U"You can use the KNN as a classifier by selecting a KNN, a Pattern and an FeatureWeights object and choosing \"To Categories...\" or \"To TableOfReal...\".");
+END2 }
 
+DIRECT2 (hint_KNN_and_Pattern_and_Categories_learn) {
+	Melder_information (U"You can train a KNN by selecting a KNN, a Pattern and a Categories object together and choosing \"Learn...\".");
+END2 }
 
+DIRECT2 (hint_KNN_and_Pattern_and_Categories_evaluate) {
+	Melder_information (U"The accuracy of a KNN can be estimated by selecting a KNN, a test Pattern and the corresponding Categories object and choosing \"Evaluate...\".");
+END2 }
 
+DIRECT2 (hint_KNN_and_Pattern_and_Categories_and_FeatureWeights_evaluate) {
+	Melder_information (U"The accuracy of a KNN can be estimated by selecting a KNN, a test Pattern, an FeatureWeights object, and the corresponding Categories object and choosing \"Evaluate...\".");
+END2 }
 
+DIRECT2 (hint_Pattern_and_FeatureWeights_to_Categories) {
+	Melder_information (U"A Pattern object and a FeatureWeights object can be used to compute a fixed number of clusters using the k-means clustering clustering algorithm.");
+END2 }
 
+DIRECT2 (hint_Pattern_and_FeatureWeights_to_Dissimilarity) {
+	Melder_information (U"A Dissimilarity matrix can be generated from a Pattern and a FeatureWeights object.");
+END2 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
 // Setting callbacks                                                                   //
 /////////////////////////////////////////////////////////////////////////////////////////
 
-void praat_contrib_Ola_KNN_init (void);
-void praat_contrib_Ola_KNN_init (void)
+void praat_contrib_Ola_KNN_init ();
+void praat_contrib_Ola_KNN_init ()
 {
-
     Thing_recognizeClassesByName (classKNN, NULL);
     Thing_recognizeClassesByName (classFeatureWeights, NULL);
 
@@ -912,60 +858,59 @@ void praat_contrib_Ola_KNN_init (void)
 // Menu //
 //////////
 
-    praat_addMenuCommand (L"Objects", L"New", L"kNN classifiers", 0, 0, 0);
+    praat_addMenuCommand (U"Objects", U"New", U"kNN classifiers", 0, 0, 0);
 
-    praat_addMenuCommand (L"Objects", L"New", L"kNN classifiers", 0, 1, DO_KNN_help);
-    praat_addMenuCommand (L"Objects", L"New", L"-- KNN --", 0, 1, 0);
+    praat_addMenuCommand (U"Objects", U"New", U"kNN classifiers", 0, 1, DO_KNN_help);
+    praat_addMenuCommand (U"Objects", U"New", U"-- KNN --", 0, 1, 0);
 
-    praat_addMenuCommand (L"Objects", L"New", L"Create kNN classifier...", 0, 1, DO_KNN_create);
-
-    praat_addMenuCommand (L"Objects", L"New", L"Advanced", 0, 1, 0);
-    praat_addMenuCommand (L"Objects", L"New", L"Create Pattern...", 0, 2, DO_Pattern_create);
-    praat_addMenuCommand (L"Objects", L"New", L"Create Categories...", 0, 2, DO_Categories_create);
-    praat_addMenuCommand (L"Objects", L"New", L"Create FeatureWeights...", 0, 2, DO_FeatureWeights_create);
+    praat_addMenuCommand (U"Objects", U"New", U"Create kNN classifier...", 0, 1, DO_KNN_create);
 
+    praat_addMenuCommand (U"Objects", U"New", U"Advanced", 0, 1, 0);
+    praat_addMenuCommand (U"Objects", U"New", U"Create Pattern...", 0, 2, DO_Pattern_create);
+    praat_addMenuCommand (U"Objects", U"New", U"Create Categories...", 0, 2, DO_Categories_create);
+    praat_addMenuCommand (U"Objects", U"New", U"Create FeatureWeights...", 0, 2, DO_FeatureWeights_create);
 
 /////////////
 // Actions //
 /////////////
 
-    praat_addAction1 (classKNN, 0, L"kNN help", 0, 0, DO_KNN_help);
+    praat_addAction1 (classKNN, 0, U"kNN help", 0, 0, DO_KNN_help);
     praat_addAction1 (classKNN, 0, QUERY_BUTTON, 0, 0, 0);
-    praat_addAction1 (classKNN, 1, L"Get optimized parameters...", 0, 2, DO_KNN_getOptimumModel);
-    praat_addAction1 (classKNN, 1, L"Get accuracy estimate...", 0, 2, DO_KNN_evaluate);
-    praat_addAction1 (classKNN, 1, L"Get size of instancebase", 0, 2, DO_KNN_getNumberOfInstances);
+    praat_addAction1 (classKNN, 1, U"Get optimized parameters...", 0, 2, DO_KNN_getOptimumModel);
+    praat_addAction1 (classKNN, 1, U"Get accuracy estimate...", 0, 2, DO_KNN_evaluate);
+    praat_addAction1 (classKNN, 1, U"Get size of instancebase", 0, 2, DO_KNN_getNumberOfInstances);
 
     praat_addAction1 (classKNN, 0, MODIFY_BUTTON, 0, 0, 0);
-    praat_addAction1 (classKNN, 1, L"Shuffle", 0, 1, DO_KNN_shuffle);
-    praat_addAction1 (classKNN, 1, L"Prune...", 0, 1, DO_KNN_prune);
-    praat_addAction1 (classKNN, 1, L"Reset...", 0, 1, DO_KNN_reset);
+    praat_addAction1 (classKNN, 1, U"Shuffle", 0, 1, DO_KNN_shuffle);
+    praat_addAction1 (classKNN, 1, U"Prune...", 0, 1, DO_KNN_prune);
+    praat_addAction1 (classKNN, 1, U"Reset...", 0, 1, DO_KNN_reset);
     praat_addAction1 (classKNN, 0, EXTRACT_BUTTON, 0, 0, 0);
-    praat_addAction1 (classKNN, 0, L"Extract input Patterns", 0, 1, DO_KNN_extractInputPatterns);
-    praat_addAction1 (classKNN, 0, L"Extract output Categories", 0, 1, DO_KNN_extractOutputCategories);
+    praat_addAction1 (classKNN, 0, U"Extract input Patterns", 0, 1, DO_KNN_extractInputPatterns);
+    praat_addAction1 (classKNN, 0, U"Extract output Categories", 0, 1, DO_KNN_extractOutputCategories);
 
-    praat_addAction1 (classKNN, 0, L"To FeatureWeights...", 0, 0, DO_FeatureWeights_computeWrapperInt);
+    praat_addAction1 (classKNN, 0, U"To FeatureWeights...", 0, 0, DO_FeatureWeights_computeWrapperInt);
 
- // praat_addAction1 (classKNN, 0, L"To Permutation...", 0, 0, DO_KNN_SA_computePermutation);
- // praat_addAction2 (classKNN, 1, classFeatureWeights, 1, L"To Permutation...", 0, 0, DO_KNN_evaluateWithFeatureWeights);
+ // praat_addAction1 (classKNN, 0, U"To Permutation...", 0, 0, DO_KNN_SA_computePermutation);
+ // praat_addAction2 (classKNN, 1, classFeatureWeights, 1, U"To Permutation...", 0, 0, DO_KNN_evaluateWithFeatureWeights);
 
-    praat_addAction (classKNN, 1, classPattern, 1, classCategories, 1, L"Learn...", 0, 0, DO_KNN_learn);
-    praat_addAction2 (classKNN, 1, classFeatureWeights, 1, L"Evaluate...", 0, 0, DO_KNN_evaluateWithFeatureWeights);
-    praat_addAction (classKNN, 1, classPattern, 1, classCategories, 1, L"Evaluate...", 0, 0, DO_KNN_evaluateWithTestSet);
-    praat_addAction4 (classKNN, 1, classPattern, 1, classCategories, 1, classFeatureWeights, 1, L"Evaluate...", 0, 0, DO_KNN_evaluateWithTestSetAndFeatureWeights);
-    praat_addAction (classKNN, 1, classPattern, 1, classCategories, 1, L"To FeatureWeights...", 0, 0, DO_FeatureWeights_computeWrapperExt);
-    praat_addAction2 (classKNN, 1, classPattern, 1, L"To Categories...", 0, 0, DO_KNN_toCategories);
-    praat_addAction2 (classKNN, 1, classPattern, 1, L"To TableOfReal...", 0, 0, DO_KNN_toTableOfReal);
+    praat_addAction (classKNN, 1, classPattern, 1, classCategories, 1, U"Learn...", 0, 0, DO_KNN_learn);
+    praat_addAction2 (classKNN, 1, classFeatureWeights, 1, U"Evaluate...", 0, 0, DO_KNN_evaluateWithFeatureWeights);
+    praat_addAction (classKNN, 1, classPattern, 1, classCategories, 1, U"Evaluate...", 0, 0, DO_KNN_evaluateWithTestSet);
+    praat_addAction4 (classKNN, 1, classPattern, 1, classCategories, 1, classFeatureWeights, 1, U"Evaluate...", 0, 0, DO_KNN_evaluateWithTestSetAndFeatureWeights);
+    praat_addAction (classKNN, 1, classPattern, 1, classCategories, 1, U"To FeatureWeights...", 0, 0, DO_FeatureWeights_computeWrapperExt);
+    praat_addAction2 (classKNN, 1, classPattern, 1, U"To Categories...", 0, 0, DO_KNN_toCategories);
+    praat_addAction2 (classKNN, 1, classPattern, 1, U"To TableOfReal...", 0, 0, DO_KNN_toTableOfReal);
 
-    praat_addAction (classKNN, 1, classPattern, 1, classFeatureWeights, 1, L"To Categories...", 0, 0, DO_KNN_toCategoriesWithFeatureWeights);
-    praat_addAction (classKNN, 1, classPattern, 1, classFeatureWeights, 1, L"To TableOfReal...", 0, 0, DO_KNN_toTableOfRealWithFeatureWeights);
+    praat_addAction (classKNN, 1, classPattern, 1, classFeatureWeights, 1, U"To Categories...", 0, 0, DO_KNN_toCategoriesWithFeatureWeights);
+    praat_addAction (classKNN, 1, classPattern, 1, classFeatureWeights, 1, U"To TableOfReal...", 0, 0, DO_KNN_toTableOfRealWithFeatureWeights);
 
-    praat_addAction1 (classPattern, 1, L"To Dissimilarity", 0, 1, DO_KNN_patternToDissimilarity);
-    praat_addAction1 (classPattern, 1, L"To Categories...", 0, 1, DO_Pattern_to_Categories_cluster);
-    praat_addAction2 (classPattern, 1, classFeatureWeights, 1, L"To Dissimilarity", 0, 0, DO_KNN_patternToDissimilarityWithFeatureWeights);
-    praat_addAction2 (classPattern, 1, classFeatureWeights, 1, L"To Categories...", 0, 0, DO_Pattern_to_Categories_clusterWithFeatureWeights);
+    praat_addAction1 (classPattern, 1, U"To Dissimilarity", 0, 1, DO_KNN_patternToDissimilarity);
+    praat_addAction1 (classPattern, 1, U"To Categories...", 0, 1, DO_Pattern_to_Categories_cluster);
+    praat_addAction2 (classPattern, 1, classFeatureWeights, 1, U"To Dissimilarity", 0, 0, DO_KNN_patternToDissimilarityWithFeatureWeights);
+    praat_addAction2 (classPattern, 1, classFeatureWeights, 1, U"To Categories...", 0, 0, DO_Pattern_to_Categories_clusterWithFeatureWeights);
 
-    praat_addAction2 (classPattern, 1, classCategories, 1, L"To FeatureWeights...", 0, 0, DO_FeatureWeights_computeRELIEF);
-    praat_addAction2 (classPattern, 1, classCategories, 1, L"To KNN Classifier...", 0, 0, DO_KNN_Pattern_Categories_to_KNN);
+    praat_addAction2 (classPattern, 1, classCategories, 1, U"To FeatureWeights...", 0, 0, DO_FeatureWeights_computeRELIEF);
+    praat_addAction2 (classPattern, 1, classCategories, 1, U"To KNN Classifier...", 0, 0, DO_KNN_Pattern_Categories_to_KNN);
 
 ///////////
 // DEBUG //
@@ -974,9 +919,9 @@ void praat_contrib_Ola_KNN_init (void)
 /*
 #ifdef _DEBUG
 
-    praat_addAction1 (classKNN, 0, L"_DEBUG: KNN_getNumberOfCPUs", 0, 0, DO_KNN_debug_KNN_getNumberOfCPUs);
-    praat_addAction1 (classKNN, 0, L"_DEBUG: KNN_threadTest", 0, 0, DO_KNN_debug_KNN_threadTest);
-    praat_addAction1 (classPattern, 1, L"_DEBUG: KNN_SA_partition", 0, 1, DO_KNN_debug_KNN_SA_partition);
+    praat_addAction1 (classKNN, 0, U"_DEBUG: KNN_getNumberOfCPUs", 0, 0, DO_KNN_debug_KNN_getNumberOfCPUs);
+    praat_addAction1 (classKNN, 0, U"_DEBUG: KNN_threadTest", 0, 0, DO_KNN_debug_KNN_threadTest);
+    praat_addAction1 (classPattern, 1, U"_DEBUG: KNN_SA_partition", 0, 1, DO_KNN_debug_KNN_SA_partition);
 
 #endif
 */
@@ -985,17 +930,18 @@ void praat_contrib_Ola_KNN_init (void)
 // Hints //
 ///////////
 
-    praat_addAction1 (classPattern, 0, L"& FeatureWeights: To Categories?", 0, 0, DO_hint_Pattern_and_FeatureWeights_to_Categories);
-    praat_addAction1 (classPattern, 0, L"& FeatureWeights: To Dissimilarity?", 0, 0, DO_hint_Pattern_and_FeatureWeights_to_Dissimilarity);
-
-    praat_addAction1 (classKNN, 0, L"& FeatureWeights: Evaluate?", 0, 0, DO_hint_KNN_and_FeatureWeights_evaluate);
-//  praat_addAction1 (classKNN, 0, L"& FeatureWeights: To Permutation?", 0, 0, DO_hint_Pattern_and_FeatureWeights_to_Dissimilarity);
-    praat_addAction1 (classKNN, 0, L"& Pattern: Classify?", 0, 0, DO_hint_KNN_and_Pattern_classify);
-    praat_addAction1 (classKNN, 0, L"& Pattern & FeatureWeights: Classify?", 0, 0, DO_hint_KNN_and_Pattern_and_FeatureWeights_classify);
-    praat_addAction1 (classKNN, 0, L"& Pattern & Categories: Learn?", 0, 0, DO_hint_KNN_and_Pattern_and_Categories_learn);
-    praat_addAction1 (classKNN, 0, L"& Pattern & Categories: Evaluate?", 0, 0, DO_hint_KNN_and_Pattern_and_Categories_evaluate);
-    praat_addAction1 (classKNN, 0, L"& Pattern & Categories & FeatureWeights: Evaluate?", 0, 0, DO_hint_KNN_and_Pattern_and_Categories_and_FeatureWeights_evaluate);
+    praat_addAction1 (classPattern, 0, U"& FeatureWeights: To Categories?", 0, 0, DO_hint_Pattern_and_FeatureWeights_to_Categories);
+    praat_addAction1 (classPattern, 0, U"& FeatureWeights: To Dissimilarity?", 0, 0, DO_hint_Pattern_and_FeatureWeights_to_Dissimilarity);
 
+    praat_addAction1 (classKNN, 0, U"& FeatureWeights: Evaluate?", 0, 0, DO_hint_KNN_and_FeatureWeights_evaluate);
+//  praat_addAction1 (classKNN, 0, U"& FeatureWeights: To Permutation?", 0, 0, DO_hint_Pattern_and_FeatureWeights_to_Dissimilarity);
+    praat_addAction1 (classKNN, 0, U"& Pattern: Classify?", 0, 0, DO_hint_KNN_and_Pattern_classify);
+    praat_addAction1 (classKNN, 0, U"& Pattern & FeatureWeights: Classify?", 0, 0, DO_hint_KNN_and_Pattern_and_FeatureWeights_classify);
+    praat_addAction1 (classKNN, 0, U"& Pattern & Categories: Learn?", 0, 0, DO_hint_KNN_and_Pattern_and_Categories_learn);
+    praat_addAction1 (classKNN, 0, U"& Pattern & Categories: Evaluate?", 0, 0, DO_hint_KNN_and_Pattern_and_Categories_evaluate);
+    praat_addAction1 (classKNN, 0, U"& Pattern & Categories & FeatureWeights: Evaluate?", 0, 0, DO_hint_KNN_and_Pattern_and_Categories_and_FeatureWeights_evaluate);
 
     INCLUDE_MANPAGES (manual_KNN_init)
 }
+
+/* End of file praat_contrib_Ola_KNN.cpp */
diff --git a/dwsys/Collection_extensions.cpp b/dwsys/Collection_extensions.cpp
index ac89b8c..85f3296 100644
--- a/dwsys/Collection_extensions.cpp
+++ b/dwsys/Collection_extensions.cpp
@@ -1,6 +1,6 @@
 /* Collection_extensions.c
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@
 Collection Collection_and_Permutation_permuteItems (Collection me, Permutation him) {
 	try {
 		if (my size != his numberOfElements) {
-			Melder_throw (me, "The number of elements are not equal.");
+			Melder_throw (me, U"The number of elements are not equal.");
 		}
 		autoNUMvector<long> pos (1, my size);
 		autoCollection thee = static_cast<Collection> (Data_copy (me));
@@ -47,7 +47,7 @@ Collection Collection_and_Permutation_permuteItems (Collection me, Permutation h
 		for (long i = 1; i <= my size; i++) {
 			long ti = pos[i], which = Permutation_getValueAtIndex (him, i);
 			long where = pos[which]; /* where >= i */
-			Data tmp =  static_cast<Data> (thy item[i]);
+			Daata tmp =  static_cast<Daata> (thy item[i]);
 			if (i == where) {
 				continue;
 			}
@@ -60,7 +60,7 @@ Collection Collection_and_Permutation_permuteItems (Collection me, Permutation h
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not permuted.");
+		Melder_throw (me, U": not permuted.");
 	}
 }
 
@@ -71,23 +71,22 @@ Collection Collection_permuteItems (Collection me) {
 		autoCollection thee = Collection_and_Permutation_permuteItems (me, p.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": items not permuted.");
+		Melder_throw (me, U": items not permuted.");
 	}
 }
 
 /****************** class OrderedOfString ******************/
 
 void structOrderedOfString :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of strings: ", Melder_integer (size));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of strings: ", size);
 	autoOrderedOfString uStrings = OrderedOfString_selectUniqueItems (this, 1);
-	MelderInfo_writeLine (L"Number of unique categories: ", Melder_integer (uStrings -> size));
+	MelderInfo_writeLine (U"Number of unique categories: ", uStrings -> size);
 }
 
 Thing_implement (OrderedOfString, Ordered, 0);
 
-int OrderedOfString_init (I, long initialCapacity) {
-	iam (OrderedOfString);
+int OrderedOfString_init (OrderedOfString me, long initialCapacity) {
 	Ordered_init (me, classSimpleString, initialCapacity);
 	return 1;
 }
@@ -98,32 +97,27 @@ OrderedOfString OrderedOfString_create () {
 		OrderedOfString_init (me.peek(), 10);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("OrderedOfString not created.");
+		Melder_throw (U"OrderedOfString not created.");
 	}
 }
 
-int OrderedOfString_append (I, wchar_t *append) {
-	iam (OrderedOfString);
+int OrderedOfString_append (OrderedOfString me, char32 *append) {
 	try {
-		if (append == 0) {
+		if (append == nullptr) {
 			return 1;    // BUG: lege string appenden??
 		}
 		autoSimpleString item = SimpleString_create (append);
 		Collection_addItem (me, item.transfer());
 		return 1;
 	} catch (MelderError) {
-		Melder_throw (me, ": text not appended.");
+		Melder_throw (me, U": text not appended.");
 	}
 }
 
-OrderedOfString OrderedOfString_joinItems (I, thou) {
-	iam (OrderedOfString);
-	thouart (OrderedOfString);
+OrderedOfString OrderedOfString_joinItems (OrderedOfString me, OrderedOfString thee) {
 	try {
-
-
 		if (my size != thy size) {
-			Melder_throw ("sizes must be equal.");
+			Melder_throw (U"sizes must be equal.");
 		}
 		autoOrderedOfString him = Data_copy (me);
 
@@ -132,13 +126,12 @@ OrderedOfString OrderedOfString_joinItems (I, thou) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Items not joinmed.");
+		Melder_throw (U"Items not joinmed.");
 	}
 }
 
 
-OrderedOfString OrderedOfString_selectUniqueItems (I, int sort) {
-	iam (OrderedOfString);
+OrderedOfString OrderedOfString_selectUniqueItems (OrderedOfString me, int sort) {
 	try {
 		if (! sort) {
 			autoOrderedOfString him = OrderedOfString_create ();
@@ -155,7 +148,7 @@ OrderedOfString OrderedOfString_selectUniqueItems (I, int sort) {
 		autoSortedSetOfString thee = SortedSetOfString_create ();
 		/* Collection_to_SortedSet (I, int (*compare)(I, thou)) */
 		for (long i = 1; i <= my size; i++) {
-			if (! thy hasItem (my item[i])) {
+			if (! SortedSet_hasItem (thee.peek(), my item[i])) {
 				autoSimpleString item = Data_copy ( (SimpleString) my item[i]);
 				Collection_addItem (thee.peek(), item.transfer());
 			}
@@ -167,17 +160,14 @@ OrderedOfString OrderedOfString_selectUniqueItems (I, int sort) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": unique items not selected.");
+		Melder_throw (me, U": unique items not selected.");
 	}
 }
 
-void OrderedOfString_frequency (I, thou, long *count) {
-	iam (OrderedOfString);
-	thouart (OrderedOfString);
-
+void OrderedOfString_frequency (OrderedOfString me, OrderedOfString thee, long *count) {
 	for (long i = 1; i <= my size; i++) {
 		for (long j = 1; j <= thy size; j++) {
-			if (Data_equal ( (Data) my item[i], (Data) thy item[j])) {
+			if (Data_equal ( (Daata) my item[i], (Daata) thy item[j])) {
 				count[j]++;
 				break;
 			}
@@ -185,9 +175,7 @@ void OrderedOfString_frequency (I, thou, long *count) {
 	}
 }
 
-long OrderedOfString_getNumberOfDifferences (I, thou) {
-	iam (OrderedOfString);
-	thouart (OrderedOfString);
+long OrderedOfString_getNumberOfDifferences (OrderedOfString me, OrderedOfString thee) {
 	long numberOfDifferences = 0;
 
 	if (my size != thy size) {
@@ -201,24 +189,19 @@ long OrderedOfString_getNumberOfDifferences (I, thou) {
 	return numberOfDifferences;
 }
 
-double OrderedOfString_getFractionDifferent (I, thou) {
-	iam (OrderedOfString);
-	thouart (OrderedOfString);
+double OrderedOfString_getFractionDifferent (OrderedOfString me, OrderedOfString thee) {
 	long numberOfDifferences = OrderedOfString_getNumberOfDifferences (me, thee);
 
 	if (numberOfDifferences < 0) {
 		return NUMundefined;
 	}
-	return my size == 0 ? 0 : (0.0 + numberOfDifferences) / my size;
+	return my size == 0 ? 0.0 : (0.0 + numberOfDifferences) / my size;
 }
 
-int OrderedOfString_difference (I, thou, long *ndif, double *fraction) {
-	iam (OrderedOfString);
-	thouart (OrderedOfString);
-
+int OrderedOfString_difference (OrderedOfString me, OrderedOfString thee, long *ndif, double *fraction) {
 	*ndif = 0; *fraction = 1;
 	if (my size != thy size) {
-		Melder_flushError ("OrderedOfString_difference: the number of items differ");
+		Melder_flushError (U"OrderedOfString_difference: the number of items differ");
 		return 0;
 	}
 	for (long i = 1; i <= my size; i++) {
@@ -231,13 +214,12 @@ int OrderedOfString_difference (I, thou, long *ndif, double *fraction) {
 	return 1;
 }
 
-long OrderedOfString_indexOfItem_c (I, const wchar_t *str) {
-	iam (OrderedOfString);
+long OrderedOfString_indexOfItem_c (OrderedOfString me, const char32 *str) {
 	long index = 0;
 	autoSimpleString s = SimpleString_create (str);
 
 	for (long i = 1; i <= my size; i++) {
-		if (Data_equal ( (Data) my item[i], s.peek())) {
+		if (Data_equal ( (Daata) my item[i], s.peek())) {
 			index = i;
 			break;
 		}
@@ -245,50 +227,36 @@ long OrderedOfString_indexOfItem_c (I, const wchar_t *str) {
 	return index;
 }
 
-const wchar_t *OrderedOfString_itemAtIndex_c (I, long index) {
-	iam (OrderedOfString);
-	return index > 0 && index <= my size ? SimpleString_c ( (SimpleString) my item[index]) : NULL;
+const char32 *OrderedOfString_itemAtIndex_c (OrderedOfString me, long index) {
+	return index > 0 && index <= my size ? SimpleString_c ( (SimpleString) my item[index]) : nullptr;
 }
 
-void OrderedOfString_sequentialNumbers (I, long n) {
-	iam (OrderedOfString);
+void OrderedOfString_sequentialNumbers (OrderedOfString me, long n) {
 	Collection_removeAllItems (me);
 	for (long i = 1; i <= n; i++) {
-		wchar_t s[20];
-		swprintf (s, 20, L"%ld", i);
+		char32 s[40];
+		Melder_sprint (s,40, i);
 		autoSimpleString str = SimpleString_create (s);
 		Collection_addItem (me, str.transfer());
 	}
 }
-void OrderedOfString_changeStrings (OrderedOfString me, wchar_t *search, wchar_t *replace,
-                                    int maximumNumberOfReplaces, long *nmatches, long *nstringmatches, int use_regexp) {
-	regexp *compiled_search = NULL;
+void OrderedOfString_changeStrings (OrderedOfString me, char32 *search, char32 *replace, int maximumNumberOfReplaces, long *nmatches, long *nstringmatches, int use_regexp) {
+	regexp *compiled_search = nullptr;
 	try {
-		const wchar_t *compileMsg;
-		wchar_t *r;
-
-		if (search == NULL) {
-			Melder_throw ("Missing search string.");
+		if (! search) {
+			Melder_throw (U"Missing search string.");
 		}
-		if (replace == NULL) {
-			Melder_throw ("Missing replace string.");
+		if (! replace) {
+			Melder_throw (U"Missing replace string.");
 		}
 
 		if (use_regexp) {
-			compiled_search = CompileRE ( (regularExp_CHAR *) search, &compileMsg, 0);
-			if (compiled_search == NULL) {
-				Melder_throw (compileMsg);
-			}
+			compiled_search = CompileRE_throwable (search, 0);
 		}
 		for (long i = 1; i <= my size; i++) {
 			SimpleString ss = (SimpleString) my item[i];
 			long nmatches_sub;
-
-			if (use_regexp) {
-				r = str_replace_regexp (ss -> string, compiled_search,
-				                        replace, maximumNumberOfReplaces, &nmatches_sub);
-			} else r = str_replace_literal (ss -> string, search, replace,
-				                                maximumNumberOfReplaces, &nmatches_sub);
+			char32 *r = use_regexp ? str_replace_regexp (ss -> string, compiled_search, replace, maximumNumberOfReplaces, &nmatches_sub) : str_replace_literal (ss -> string, search, replace, maximumNumberOfReplaces, &nmatches_sub);
 
 			// Change without error:
 			Melder_free (ss -> string);
@@ -305,13 +273,11 @@ void OrderedOfString_changeStrings (OrderedOfString me, wchar_t *search, wchar_t
 		if (use_regexp) {
 			free (compiled_search);
 		}
-		Melder_throw ("Replace not completed.");
+		Melder_throw (U"Replace not completed.");
 	}
 }
 
-long OrderedOfString_isSubsetOf (I, thou, long *translation) { // ?? test and give number
-	iam (OrderedOfString);
-	thouart (OrderedOfString);
+long OrderedOfString_isSubsetOf (OrderedOfString me, OrderedOfString thee, long *translation) { // ?? test and give number
 	long nStrings = 0;
 
 	for (long i = 1; i <= my size; i++) {
@@ -329,27 +295,24 @@ long OrderedOfString_isSubsetOf (I, thou, long *translation) { // ?? test and gi
 	return nStrings;
 }
 
-void OrderedOfString_drawItem (I, Graphics g, long index, double xWC, double yWC) {
-	iam (OrderedOfString);
+void OrderedOfString_drawItem (OrderedOfString me, Graphics g, long index, double xWC, double yWC) {
 	if (index > 0 && index <= my size) {
-		SimpleString_draw ( (SimpleString) my item[index], g, xWC, yWC);
+		SimpleString_draw ((SimpleString) my item[index], g, xWC, yWC);
 	}
 }
 
-long OrderedOfString_getSize (I) {
-	iam (OrderedOfString);
+long OrderedOfString_getSize (OrderedOfString me) {
 	return my size;
 }
 
-void OrderedOfString_removeOccurrences (I, const wchar_t *search, int use_regexp) {
-	iam (OrderedOfString);
-	if (search == NULL) {
+void OrderedOfString_removeOccurrences (OrderedOfString me, const char32 *search, int use_regexp) {
+	if (! search) {
 		return;
 	}
 	for (long i = my size; i >= 1; i--) {
 		SimpleString ss = (SimpleString) my item[i];
 		if ( (use_regexp && strstr_regexp (ss -> string, search)) ||
-		        (!use_regexp && wcsstr (ss -> string, search))) {
+		        (!use_regexp && str32str (ss -> string, search))) {
 			Collection_removeItem (me, i);
 		}
 	}
diff --git a/dwsys/Collection_extensions.h b/dwsys/Collection_extensions.h
index a1c0011..341f8bb 100644
--- a/dwsys/Collection_extensions.h
+++ b/dwsys/Collection_extensions.h
@@ -29,50 +29,50 @@
 #include "Permutation.h"
 
 Collection Collection_and_Permutation_permuteItems (Collection me, Permutation him);
-Collection Collection_permuteItems(Collection me);
+Collection Collection_permuteItems (Collection me);
 /* permute the order of my items */
 
 /****************** class OrderedOfString ******************/
 
 Thing_define (OrderedOfString, Ordered) {
-	// overridden methods:
-		virtual void v_info ();
+	void v_info ()
+		override;
 };
 
 OrderedOfString OrderedOfString_create ();
-int OrderedOfString_init (I, long initialCapacity);
+int OrderedOfString_init (OrderedOfString me, long initialCapacity);
 
-int OrderedOfString_append (I, wchar_t *append);
-OrderedOfString OrderedOfString_joinItems (I, thou);
+int OrderedOfString_append (OrderedOfString me, char32 *append);
+OrderedOfString OrderedOfString_joinItems (OrderedOfString me, OrderedOfString thee);
 /* Join each item */
 
-OrderedOfString OrderedOfString_selectUniqueItems (I, int sort);
+OrderedOfString OrderedOfString_selectUniqueItems (OrderedOfString me, int sort);
 /* Postcondition: thy size <= my size */
 
-void OrderedOfString_frequency (I, thou, long *count);
+void OrderedOfString_frequency (OrderedOfString me, OrderedOfString thee, long *count);
 /* count how often the items in 'thee' occur in 'me' */
 /* Precondition: count[1..thy size] exists */
 
 /* To be removed Praat 4.2.4 2004040427 */
-int OrderedOfString_difference (I, thou, long *ndif, double *fraction);
+int OrderedOfString_difference (OrderedOfString me, OrderedOfString thee, long *ndif, double *fraction);
 
-double OrderedOfString_getFractionDifferent (I, thou);
+double OrderedOfString_getFractionDifferent (OrderedOfString me, OrderedOfString thee);
 
-long OrderedOfString_getNumberOfDifferences (I, thou);
+long OrderedOfString_getNumberOfDifferences (OrderedOfString me, OrderedOfString thee);
 
-const wchar_t *OrderedOfString_itemAtIndex_c (I, long index);
-long OrderedOfString_indexOfItem_c (I, const wchar_t *str);
+const char32 *OrderedOfString_itemAtIndex_c (OrderedOfString me, long index);
+long OrderedOfString_indexOfItem_c (OrderedOfString me, const char32 *str);
 
-void OrderedOfString_drawItem (I, Graphics g, long index, double xWC, double yWC);
+void OrderedOfString_drawItem (OrderedOfString me, Graphics g, long index, double xWC, double yWC);
 
-void OrderedOfString_sequentialNumbers (I, long n);
+void OrderedOfString_sequentialNumbers (OrderedOfString me, long n);
 
-void OrderedOfString_removeOccurrences (I, const wchar_t *search, int user_regexp);
+void OrderedOfString_removeOccurrences (OrderedOfString me, const char32 *search, int user_regexp);
 
-void OrderedOfString_changeStrings (OrderedOfString me, wchar_t *search, wchar_t *replace,
+void OrderedOfString_changeStrings (OrderedOfString me, char32 *search, char32 *replace,
 	int maximumNumberOfReplaces, long *nmatches, long *nstringmatches, int use_regexp);
 
-long OrderedOfString_isSubsetOf (I, thou, long *translation);
+long OrderedOfString_isSubsetOf (OrderedOfString me, OrderedOfString thee, long *translation);
 /* Check whether my items are (a subset of)|(in) thy items.
  * Preconditions:
  *	if (translation) translation[1..my size] exists.
@@ -83,7 +83,7 @@ long OrderedOfString_isSubsetOf (I, thou, long *translation);
  *	else if (translation[i] == 0) my label[i] not in thy labels.
  */
 
-long OrderedOfString_getSize (I);
+long OrderedOfString_getSize (OrderedOfString me);
 /* return my size */
 
 #endif /* _Collection_extensions_h_ */
diff --git a/dwsys/Command.cpp b/dwsys/Command.cpp
index 6f6dab9..08d0ed4 100644
--- a/dwsys/Command.cpp
+++ b/dwsys/Command.cpp
@@ -20,7 +20,7 @@
 /*
  djmw 19950710
  djmw 20020812 GPL header
- djmw 20071007 wchar_t
+ djmw 20071007 wchar
  djmw 20110304 Thing_new
 */
 
@@ -28,7 +28,7 @@
 
 Thing_implement (Command, Thing, 0);
 
-void Command_init (I, const wchar_t *name, Any data, int (*execute) (Any), int (*undo) (Any)) {
+void Command_init (I, const char32 *name, Any data, int (*execute) (Any), int (*undo) (Any)) {
 	iam (Command);
 	Melder_assert (execute && undo);
 	Thing_setName (me, name);
@@ -55,7 +55,7 @@ CommandHistory CommandHistory_create (long maximumCapacity) {
 		Collection_init (me.peek(), classCommand, maximumCapacity);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Command not created.");
+		Melder_throw (U"Command not created.");
 	}
 }
 
@@ -78,7 +78,7 @@ Any CommandHistory_getItem (I) {
 void CommandHistory_insertItem (I, Any data) {
 	iam (CommandHistory);
 
-	Melder_assert (data && (Thing_member ( (Thing) data, my itemClass) || my itemClass == NULL));
+	Melder_assert (data && (Thing_isa ( (Thing) data, my itemClass) || my itemClass == nullptr));
 	if (my current < my size) {
 		for (long i = my current + 1; i <= my size; i++) {
 			forget ( ( (Command *) my item) [i]);
@@ -107,11 +107,11 @@ int CommandHistory_offright (I) {
 	return my size == 0 || my current == my size + 1;
 }
 
-wchar_t *CommandHistory_commandName (I, long offsetFromCurrent) {
+char32 *CommandHistory_commandName (I, long offsetFromCurrent) {
 	iam (CommandHistory);
 	long pos = my current + offsetFromCurrent;
 
-	return pos >= 1 && pos <= my size ? Thing_getName ( (Thing) my item[pos]) : NULL;
+	return pos >= 1 && pos <= my size ? Thing_getName ( (Thing) my item[pos]) : nullptr;
 }
 
 /* End of file Command.cpp */
diff --git a/dwsys/Command.h b/dwsys/Command.h
index 2fe70fa..762aa2a 100644
--- a/dwsys/Command.h
+++ b/dwsys/Command.h
@@ -36,7 +36,7 @@ Thing_define (Command, Thing) {
 		int (*undo) (I);
 };
 
-void Command_init (I, const wchar_t *name, Any data, int (*execute)(Any), int (*undo)(Any));
+void Command_init (I, const char32 *name, Any data, int (*execute)(Any), int (*undo)(Any));
 	
 int Command_do (I);
 
@@ -80,8 +80,8 @@ int CommandHistory_offleft (I);
 int CommandHistory_offright (I);
 /*	return my size == 0 || my current == my size + 1; */
 
-wchar_t *CommandHistory_commandName (I, long offsetFromCurrent);
+char32 *CommandHistory_commandName (I, long offsetFromCurrent);
 /* offsetFromCurrent may be zero, positive or negative. */
-/* References outside the list will return NULL. */
+/* References outside the list will return nullptr. */
 
 #endif /* _Command_h_ */
diff --git a/dwsys/DLL.cpp b/dwsys/DLL.cpp
index 6289511..a97ed32 100644
--- a/dwsys/DLL.cpp
+++ b/dwsys/DLL.cpp
@@ -1,6 +1,6 @@
 /* DLL.cpp
  *
- * Copyright (C) 2011-2013 David Weenink
+ * Copyright (C) 2011-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 #include "DLL.h"
 
-Thing_implement (DLLNode, Data, 0);
+Thing_implement (DLLNode, Daata, 0);
 
 void structDLLNode :: v_destroy () {
 	forget (data);
@@ -28,14 +28,14 @@ void structDLLNode :: v_destroy () {
 
 void structDLLNode :: v_copy (thou) {
 	thouart (DLLNode);
-	thy data = Data_copy (data);
+	thy data = Data_copy (our data);
 }
 
 Thing_implement (DLL, Thing, 0);
 
 void structDLL :: v_destroy () {
 	DLLNode v = front;
-	while (v != 0) {
+	while (v) {
 		DLLNode cur = v;
 		v = v -> next;
 		forget (cur);
@@ -43,56 +43,54 @@ void structDLL :: v_destroy () {
 	DLL_Parent :: v_destroy ();
 }
 
-int structDLL :: s_compare (Any node1, Any node2) {
-	(void) node1;
-	(void) node2;
+int structDLL :: s_compare (Any /* node1 */, Any /* node2 */) {
 	return 0;
 }
 
-DLLNode DLLNode_create (Data data) {
-	DLLNode me = Thing_new (DLLNode);
+DLLNode DLLNode_create (Daata data) {
+	autoDLLNode me = Thing_new (DLLNode);
 	my data = data;
-	return me;
+	return me.transfer();
 }
 
-void DLL_init (I) {
-	iam (DLL);
+void DLL_init (DLL) {
 }
 
 DLL DLL_create() {
 	try {
-		DLL me = Thing_new (DLL);
-		return me;
+		autoDLL me = Thing_new (DLL);
+		DLL_init (me.peek());
+		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("DLL not created.");
+		Melder_throw (U"DLL not created.");
 	}
 
 }
 
 void DLL_addFront (DLL me, DLLNode n) {
-	if (my front == 0) { // empty list
+	if (my front) {
+		DLL_addBefore (me, my front, n);
+	} else {   // empty list
 		my front = n;
 		my back = n;
-		n -> next = 0;
-		n -> prev = 0;
+		n -> next = nullptr;
+		n -> prev = nullptr;
 		my numberOfNodes++;
-	} else {
-		DLL_addBefore (me, my front, n);
 	}
 }
 
 void DLL_addBack (DLL me, DLLNode n) {
-	if (my back == 0) {
-		DLL_addFront (me, n);    // empty list
-	} else {
+	if (my back) {
 		DLL_addAfter (me, my back, n);
+	} else {
+		DLL_addFront (me, n);    // empty list
 	}
 }
 
 void DLL_addBefore (DLL me, DLLNode pos, DLLNode n) {
 	n -> prev = pos -> prev;
 	n -> next = pos;
-	if (pos -> prev == 0) {
+	if (pos -> prev == nullptr) {
 		my front = n;
 	} else {
 		pos -> prev -> next = n;
@@ -104,7 +102,7 @@ void DLL_addBefore (DLL me, DLLNode pos, DLLNode n) {
 void DLL_addAfter (DLL me, DLLNode pos, DLLNode n) {
 	n -> prev = pos;
 	n -> next = pos -> next;
-	if (pos -> next == 0) {
+	if (pos -> next == nullptr) {
 		my back = n;
 	} else {
 		pos -> next -> prev = n;
@@ -119,10 +117,10 @@ void DLL_remove (DLL me, DLLNode n) {
 	}
 	if (n == my front) {
 		my front = my front -> next;
-		my front -> prev = 0;
+		my front -> prev = nullptr;
 	} else if (n == my back) {
 		my back = my back -> prev;
-		my back -> next = 0;
+		my back -> next = nullptr;
 	} else {
 		n -> prev -> next = n -> next;
 		n -> next -> prev = n -> prev;
@@ -137,24 +135,24 @@ void DLL_remove (DLL me, DLLNode n) {
 void DLL_sortPart (DLL me, DLLNode from, DLLNode to) {
 	// Save data
 	if (from == to) {
-		return;    // nothing to do
+		return;   // nothing to do
 	}
 	DLLNode from_prev = from -> prev;
 	DLLNode to_next = to -> next;
 	DLLNode my_front = my front;
 	DLLNode my_back = my back;
 
-	from -> prev = to -> next = 0;
+	from -> prev = to -> next = nullptr;
 	my front = from;
 	my back = to;
 	DLL_sort (me);
 	// restore complete list
 	my front -> prev = from_prev;
-	if (from_prev != 0) {
+	if (from_prev) {
 		from_prev -> next = my front;
 	}
 	my back -> next = to_next;
-	if (to_next != 0) {
+	if (to_next) {
 		to_next -> prev = my back;
 	}
 	if (my_front != from) {
@@ -171,12 +169,12 @@ void DLL_sort (DLL me) {
 	DLLNode front = my front, back;
 	for (;;) {
 		DLLNode n1 = front;
-		front = 0;
-		back = 0;
+		front = nullptr;
+		back = nullptr;
 
 		long numberOfMerges = 0;
 
-		while (n1 != 0) {
+		while (n1) {
 			DLLNode n2 = n1, n;
 			long n1size = 0;
 			numberOfMerges++;
@@ -184,17 +182,17 @@ void DLL_sort (DLL me) {
 			for (long i = 1; i <= increment; i++) {
 				n1size++;
 				n2 = n2 -> next;
-				if (n2 == 0) {
+				if (!n2) {
 					break;
 				}
 			}
 
 			long n2size = increment;
 
-			while (n1size > 0 || (n2size > 0 && n2 != 0)) { // merge n1 and n2
+			while (n1size > 0 || (n2size > 0 && n2)) { // merge n1 and n2
 				if (n1size == 0) {
 					n2size--; n = n2; n2 = n2 -> next;
-				} else if (n2size == 0 || n2 == 0) {
+				} else if (n2size == 0 || !n2) {
 					n1size--; n = n1; n1 = n1 -> next;
 				} else if (compare (n1, n2) <= 0) {
 					n1size--; n = n1; n1 = n1 -> next;
@@ -202,7 +200,7 @@ void DLL_sort (DLL me) {
 					n2size--; n = n2; n2 = n2 -> next;
 				}
 
-				if (back != 0) {
+				if (back) {
 					back -> next = n;
 				} else {
 					front = n;
@@ -212,7 +210,7 @@ void DLL_sort (DLL me) {
 			}
 			n1 = n2;
 		}
-		back -> next = 0;
+		back -> next = nullptr;
 		if (numberOfMerges <= 1) {
 			break;
 		}
diff --git a/dwsys/DLL.h b/dwsys/DLL.h
index 974f9ac..b79135d 100644
--- a/dwsys/DLL.h
+++ b/dwsys/DLL.h
@@ -2,7 +2,7 @@
 #define _DLL_h_
 /* DLL.h
  *
- * Copyright (C) 2011 David Weenink
+ * Copyright (C) 2011 David Weenink, 2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,35 +22,31 @@
 
 #include "Data.h"
 
-Thing_define (DLLNode, Data) {
-	// new data:
-	public:
-		DLLNode next, prev;
-		Data data;
-	// overridden methods:
-	protected:
-		virtual void v_destroy ();
-		virtual void v_copy (Any data_to);
+Thing_define (DLLNode, Daata) {
+	DLLNode next, prev;
+	Daata data;
+
+	void v_destroy ()
+		override;
+	void v_copy (Any data_to)
+		override;
 };
 
 Thing_define (DLL, Thing) {
-	// new data:
-	public:
-		long numberOfNodes;
-		DLLNode front, back;
-	// overridden methods:
-	protected:
-		virtual void v_destroy ();
-	// new methods:
-	public:
-		static int s_compare (Any data1, Any data2);
-		virtual Data_CompareFunction v_getCompareFunction () { return s_compare; }
+	long numberOfNodes;
+	DLLNode front, back;
+
+	void v_destroy ()
+		override;
+
+	static int s_compare (Any data1, Any data2);
+	virtual Data_CompareFunction v_getCompareFunction () { return s_compare; }
 };
 
-DLLNode DLLNode_create (Data data); // DLLNode owns the data
+DLLNode DLLNode_create (Daata data); // DLLNode owns the data
 
-void DLL_init (I);
-DLL DLL_create();
+void DLL_init (DLL me);
+DLL DLL_create ();
 
 void DLL_addFront (DLL me, DLLNode n);
 void DLL_addBack (DLL me, DLLNode n);
diff --git a/dwsys/Eigen.cpp b/dwsys/Eigen.cpp
index c3296cb..d567e00 100644
--- a/dwsys/Eigen.cpp
+++ b/dwsys/Eigen.cpp
@@ -1,6 +1,6 @@
-/* Eigen.c
+/* Eigen.cpp
  *
- * Copyright (C) 1993-2014 David Weenink
+ * Copyright (C) 1993-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -63,31 +63,30 @@
 #include "oo_DESCRIPTION.h"
 #include "Eigen_def.h"
 
-Thing_implement (Eigen, Data, 0);
+Thing_implement (Eigen, Daata, 0);
 
 #define MAX(m,n) ((m) > (n) ? (m) : (n))
 #define MIN(m,n) ((m) < (n) ? (m) : (n))
 #define SWAP(a,b) {temp=(a);(a)=(b);(b)=temp;}
 
-static void Graphics_ticks (Graphics g, double min, double max, int hasNumber,
-                            int hasTick, int hasDottedLine, int integers) {
-	double range = max - min, scale = 1, tick = min, dtick = 1;
+static void Graphics_ticks (Graphics g, double min, double max, bool hasNumber, bool hasTick, bool hasDottedLine, bool integers) {
+	double range = max - min, scale = 1.0, tick = min, dtick = 1.0;
 
-	if (range == 0) {
+	if (range == 0.0) {
 		return;
-	} else if (range > 1) {
-		while (range / scale > 10) {
-			scale *= 10;
+	} else if (range > 1.0) {
+		while (range / scale > 10.0) {
+			scale *= 10.0;
 		}
 		range /= scale;
 	} else {
-		while (range / scale < 10) {
-			scale /= 10;
+		while (range / scale < 10.0) {
+			scale /= 10.0;
 		}
 		range *= scale;
 	}
 
-	if (range < 3) {
+	if (range < 3.0) {
 		dtick = 0.5;
 	}
 	dtick *= scale;
@@ -96,8 +95,8 @@ static void Graphics_ticks (Graphics g, double min, double max, int hasNumber,
 		tick += dtick;
 	}
 	while (tick <= max) {
-		double num = integers ? floor (tick + 0.5) : tick;
-		Graphics_markBottom (g, num, hasNumber, hasTick, hasDottedLine, NULL);
+		double num = integers ? round (tick) : tick;
+		Graphics_markBottom (g, num, hasNumber, hasTick, hasDottedLine, nullptr);
 		tick += dtick;
 	}
 }
@@ -134,7 +133,7 @@ void Eigen_initFromSquareRoot (I, double **a, long numberOfRows, long numberOfCo
 		basis.)
 	*/
 
-	numberOfZeroed = SVD_zeroSmallSingularValues (svd.peek(), 0);
+	numberOfZeroed = SVD_zeroSmallSingularValues (svd.peek(), 0.0);
 
 	numberOfEigenvalues = nsv - numberOfZeroed;
 
@@ -142,7 +141,7 @@ void Eigen_initFromSquareRoot (I, double **a, long numberOfRows, long numberOfCo
 	long k = 0;
 	for (long i = 1; i <= nsv; i++) {
 		double t = svd -> d[i];
-		if (t > 0) {
+		if (t > 0.0) {
 			my eigenvalues[++k] = t * t;
 			for (long j = 1; j <= numberOfColumns; j++) {
 				my eigenvectors[k][j] = svd -> v[j][i];
@@ -155,7 +154,7 @@ void Eigen_initFromSquareRoot (I, double **a, long numberOfRows, long numberOfCo
 void Eigen_initFromSquareRootPair (I, double **a, long numberOfRows,
                                    long numberOfColumns, double **b, long numberOfRows_b) {
 	iam (Eigen);
-	double *u = NULL, *v = NULL, maxsv2 = -10;
+	double *u = nullptr, *v = nullptr, maxsv2 = -10.0;
 	char jobu = 'N', jobv = 'N', jobq = 'Q';
 	long k, ll, m = numberOfRows, n = numberOfColumns, p = numberOfRows_b;
 	long lda = m, ldb = p, ldu = lda, ldv = ldb, ldq = n;
@@ -178,14 +177,12 @@ void Eigen_initFromSquareRootPair (I, double **a, long numberOfRows,
 	    v, &ldv, &q[1][1], &ldq, &work[1], &iwork[1], &info);
 
 	if (info != 0) {
-		Melder_throw ("dggsvd fails.");
+		Melder_throw (U"dggsvd fails.");
 	}
 
-	/*
-		Calculate the eigenvalues (alpha[i]/beta[i])^2 and store in alpha[i].
-	*/
+	// Calculate the eigenvalues (alpha[i]/beta[i])^2 and store in alpha[i].
 
-	maxsv2 = -1;
+	maxsv2 = -1.0;
 	for (long i = k + 1; i <= k + ll; i++) {
 		double t = alpha[i] / beta[i];
 		alpha[i] = t * t;
@@ -194,25 +191,24 @@ void Eigen_initFromSquareRootPair (I, double **a, long numberOfRows,
 		}
 	}
 
-	/*
-		Deselect the eigenvalues < eps * max_eigenvalue.
-	*/
+	// Deselect the eigenvalues < eps * max_eigenvalue.
+
 	n = 0;
 	for (long i = k + 1; i <= k + ll; i++) {
 		if (alpha[i] < NUMfpp -> eps * maxsv2) {
-			n++; alpha[i] = -1;
+			n++; alpha[i] = -1.0;
 		}
 	}
 
 	if (ll - n < 1) {
-		Melder_throw ("No eigenvectors can be found. Matrix too singular.");
+		Melder_throw (U"No eigenvectors can be found. Matrix too singular.");
 	}
 
 	Eigen_init (me, ll - n, numberOfColumns);
 
 	long ii = 0;
 	for (long i = k + 1; i <= k + ll; i++) {
-		if (alpha[i] == -1) {
+		if (alpha[i] == -1.0) {
 			continue;
 		}
 
@@ -247,34 +243,29 @@ void Eigen_initFromSymmetricMatrix (I, double **a, long n) {
 
 	my dimension = my numberOfEigenvalues = n;
 
-	if (my eigenvectors == NULL) {
+	if (! my eigenvectors) {
 		Eigen_init (me, n, n);
 	}
 
 	NUMmatrix_copyElements (a, my eigenvectors, 1, n, 1, n);
 
-	/*
-		Get size of work array
-	*/
+	// Get size of work array
 
 	(void) NUMlapack_dsyev (&jobz, &uplo, &n, &my eigenvectors[1][1], &n,
 	                        &my eigenvalues[1], wt, &lwork, &info);
 	if (info != 0) {
-		Melder_throw ("dsyev initialization fails");
+		Melder_throw (U"dsyev initialization fails");
 	}
 
-	lwork = wt[0];
+	lwork = (long) floor (wt[0]);
 	autoNUMvector<double> work (0L, lwork);
 
-	(void) NUMlapack_dsyev (&jobz, &uplo, &n, &my eigenvectors[1][1], &n,
-	                        &my eigenvalues[1], work.peek(), &lwork, &info);
+	(void) NUMlapack_dsyev (&jobz, &uplo, &n, &my eigenvectors[1][1], &n, &my eigenvalues[1], work.peek(), &lwork, &info);
 	if (info != 0) {
-		Melder_throw ("dsyev fails");
+		Melder_throw (U"dsyev fails");
 	}
 
-	/*
-		We want descending order instead of ascending.
-	*/
+	// We want descending order instead of ascending.
 
 	for (long i = 1; i <= n / 2; i++) {
 		long ilast = n - i + 1;
@@ -292,7 +283,7 @@ Eigen Eigen_create (long numberOfEigenvalues, long dimension) {
 		Eigen_init (me.peek(), numberOfEigenvalues, dimension);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Eigen not created.");
+		Melder_throw (U"Eigen not created.");
 	}
 }
 
@@ -326,7 +317,7 @@ double Eigen_getSumOfEigenvalues (I, long from, long to) {
 	if (to > my numberOfEigenvalues || from > to) {
 		return NUMundefined;
 	}
-	double sum = 0;
+	double sum = 0.0;
 	for (long i = from; i <= to; i++) {
 		sum += my eigenvalues[i];
 	}
@@ -335,7 +326,7 @@ double Eigen_getSumOfEigenvalues (I, long from, long to) {
 
 double Eigen_getCumulativeContributionOfComponents (I, long from, long to) {
 	iam (Eigen);
-	double partial = 0, sum = 0;
+	double partial = 0.0, sum = 0.0;
 
 	if (to == 0) {
 		to = my numberOfEigenvalues;
@@ -348,7 +339,7 @@ double Eigen_getCumulativeContributionOfComponents (I, long from, long to) {
 			}
 		}
 	}
-	return sum > 0 ? partial / sum : 0;
+	return sum > 0.0 ? partial / sum : 0.0;
 
 }
 
@@ -356,7 +347,7 @@ long Eigen_getDimensionOfFraction (I, double fraction) {
 	iam (Eigen);
 	double sum = Eigen_getSumOfEigenvalues (me, 0, 0);
 
-	if (sum == 0) {
+	if (sum == 0.0) {
 		return 1;
 	}
 
@@ -381,9 +372,8 @@ void Eigen_sort (I) {
 			}
 		}
 		if (k != i) {
-			/*
-				Swap eigenvalues and eigenvectors
-			*/
+
+			// Swap eigenvalues and eigenvectors
 
 			SWAP (e[i], e[k])
 			for (long j = 1; j <= my dimension; j++) {
@@ -405,10 +395,9 @@ void Eigen_invertEigenvector (I, long ivec) {
 	}
 }
 
-void Eigen_drawEigenvalues (I, Graphics g, long first, long last, double ymin, double ymax,
-                            int fractionOfTotal, int cumulative, double size_mm, const wchar_t *mark, int garnish) {
+void Eigen_drawEigenvalues (I, Graphics g, long first, long last, double ymin, double ymax, int fractionOfTotal, int cumulative, double size_mm, const char32 *mark, int garnish) {
 	iam (Eigen);
-	double xmin = first, xmax = last, scale = 1, sumOfEigenvalues = 0;
+	double xmin = first, xmax = last, scale = 1.0, sumOfEigenvalues = 0.0;
 	long i;
 
 	if (first < 1) {
@@ -423,8 +412,8 @@ void Eigen_drawEigenvalues (I, Graphics g, long first, long last, double ymin, d
 	xmin = first - 0.5; xmax = last + 0.5;
 	if (fractionOfTotal || cumulative) {
 		sumOfEigenvalues = Eigen_getSumOfEigenvalues (me, 0, 0);
-		if (sumOfEigenvalues <= 0) {
-			sumOfEigenvalues = 1;
+		if (sumOfEigenvalues <= 0.0) {
+			sumOfEigenvalues = 1.0;
 		}
 		scale = sumOfEigenvalues;
 	}
@@ -444,19 +433,17 @@ void Eigen_drawEigenvalues (I, Graphics g, long first, long last, double ymin, d
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textLeft (g, 1, fractionOfTotal ? (cumulative ? L"Cumulative fractional eigenvalue" : L"Fractional eigenvalue") :
-			                   (cumulative ? L"Cumulative eigenvalue" : L"Eigenvalue"));
-		Graphics_ticks (g, first, last, 1, 1, 0, 1);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textBottom (g, 1, L"Index");
+		Graphics_textLeft (g, true, fractionOfTotal ? (cumulative ? U"Cumulative fractional eigenvalue" : U"Fractional eigenvalue") :
+			                   (cumulative ? U"Cumulative eigenvalue" : U"Eigenvalue"));
+		Graphics_ticks (g, first, last, true, true, false, true);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textBottom (g, true, U"Index");
 	}
 }
 
-void Eigen_drawEigenvector (I, Graphics g, long ivec, long first, long last,
-                            double ymin, double ymax, int weigh, double size_mm, const wchar_t *mark,
-                            int connect, wchar_t **rowLabels, int garnish) {
+void Eigen_drawEigenvector (I, Graphics g, long ivec, long first, long last, double ymin, double ymax, int weigh, double size_mm, const char32 *mark, int connect, char32 **rowLabels, int garnish) {
 	iam (Eigen);
-	double xmin = first, xmax = last, *vec, w;
+	double xmin = first, xmax = last;
 
 	if (ivec < 1 || ivec > my numberOfEigenvalues) {
 		return;
@@ -466,11 +453,10 @@ void Eigen_drawEigenvector (I, Graphics g, long ivec, long first, long last,
 		first = 1; last = my dimension;
 		xmin = 0.5; xmax = last + 0.5;
 	}
-	vec = my eigenvectors[ivec];
-	w = weigh ? sqrt (my eigenvalues[ivec]) : 1;
-	/*
-		If ymax < ymin the eigenvector will automatically be drawn inverted.
-	*/
+	double *vec = my eigenvectors[ivec];
+	double w = weigh ? sqrt (my eigenvalues[ivec]) : 1.0;
+
+	// If ymax < ymin the eigenvector will automatically be drawn inverted.
 
 	if (ymax == ymin) {
 		NUMvector_extrema (vec, first, last, &ymin, &ymax);
@@ -482,20 +468,20 @@ void Eigen_drawEigenvector (I, Graphics g, long ivec, long first, long last,
 	for (long i = first; i <= last; i++) {
 		Graphics_mark (g, i, w * vec[i], size_mm, mark);
 		if (connect && i > first) {
-			Graphics_line (g, i - 1, w * vec[i - 1], i, w * vec[i]);
+			Graphics_line (g, i - 1.0, w * vec[i - 1], i, w * vec[i]);
 		}
 	}
 	Graphics_unsetInner (g);
 	if (garnish) {
-		Graphics_markBottom (g, first, 0, 1, 0, rowLabels ? rowLabels[first] : Melder_integer (first));
-		Graphics_markBottom (g, last, 0, 1, 0, rowLabels ? rowLabels[last] : Melder_integer (last));
+		Graphics_markBottom (g, first, false, true, false, rowLabels ? rowLabels[first] : Melder_integer (first));
+		Graphics_markBottom (g, last, false, true, false, rowLabels ? rowLabels[last] : Melder_integer (last));
 		Graphics_drawInnerBox (g);
-		if (ymin * ymax < 0) {
-			Graphics_markLeft (g, 0.0, 1, 1, 1, NULL);
+		if (ymin * ymax < 0.0) {
+			Graphics_markLeft (g, 0.0, true, true, true, nullptr);
 		}
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		if (rowLabels == NULL) {
-			Graphics_textBottom (g, 1, L"Element number");
+		Graphics_marksLeft (g, 2, true, true, false);
+		if (! rowLabels) {
+			Graphics_textBottom (g, true, U"Element number");
 		}
 	}
 }
@@ -513,7 +499,7 @@ void Eigens_alignEigenvectors (Collection me) {
 	for (long i = 2; i <= my size; i++) {
 		Eigen e2 = (Eigen) my item[i];
 		if (e2 -> dimension != dimension) {
-			Melder_throw ("The dimension of the eigenvectors must be equal (offending object is ",  i, ").");
+			Melder_throw (U"The dimension of the eigenvectors must be equal (offending object is ",  i, U").");
 		}
 	}
 
@@ -527,11 +513,11 @@ void Eigens_alignEigenvectors (Collection me) {
 		double **evec2 = e2 -> eigenvectors;
 
 		for (long j = 1; j <= MIN (nev1, e2 -> numberOfEigenvalues); j++) {
-			double ip = 0;
+			double ip = 0.0;
 			for (long k = 1; k <= dimension; k++) {
 				ip += evec1[j][k] * evec2[j][k];
 			}
-			if (ip < 0) {
+			if (ip < 0.0) {
 				for (long k = 1; k <= dimension; k++) {
 					evec2[j][k] = - evec2[j][k];
 				}
@@ -549,10 +535,10 @@ static void Eigens_getAnglesBetweenSubspaces (I, thou, long ivec_from, long ivec
 	long nmin = my numberOfEigenvalues < thy numberOfEigenvalues ? my numberOfEigenvalues : thy numberOfEigenvalues;
 
 	if (my dimension != thy dimension) {
-		Melder_throw ("The eigenvectors must have the same dimension.");
+		Melder_throw (U"The eigenvectors must have the same dimension.");
 	}
 	if (ivec_from > ivec_to || ivec_from < 1 || ivec_to > nmin) {
-		Melder_throw ("Eigenvector range too large.");
+		Melder_throw (U"Eigenvector range too large.");
 	}
 
 	autoNUMmatrix<double> c (1, nvectors, 1, nvectors);
@@ -573,7 +559,7 @@ static void Eigens_getAnglesBetweenSubspaces (I, thou, long ivec_from, long ivec
 	}
 	autoSVD svd = SVD_create_d (c.peek(), nvectors, nvectors);
 	for (long i = 1; i <= nvectors; i++) {
-		angles_degrees[i] = acos (svd -> d[i]) * 180 / NUMpi;
+		angles_degrees[i] = acos (svd -> d[i]) * 180.0 / NUMpi;
 	}
 }
 
@@ -589,4 +575,4 @@ double Eigens_getAngleBetweenEigenplanes_degrees (I, thou) {
 #undef MIN
 #undef SWAP
 
-/* End of file Eigen.c */
+/* End of file Eigen.cpp */
diff --git a/dwsys/Eigen.h b/dwsys/Eigen.h
index f31f782..57604ce 100644
--- a/dwsys/Eigen.h
+++ b/dwsys/Eigen.h
@@ -30,7 +30,7 @@
 
 
 #include "Eigen_def.h"
-oo_CLASS_CREATE (Eigen, Data);
+oo_CLASS_CREATE (Eigen, Daata);
 
 Eigen Eigen_create (long numberOfEigenvalues, long dimension);
 
@@ -78,13 +78,13 @@ void Eigen_sort (I);
 void Eigen_invertEigenvector (I, long ivec);
 
 void Eigen_drawEigenvalues (I, Graphics g, long first, long last, double ymin, double ymax,
-	int fractionOfTotal, int cumulative, double size_mm, const wchar_t *mark, int garnish);
+	int fractionOfTotal, int cumulative, double size_mm, const char32 *mark, int garnish);
 
 void Eigen_drawEigenvector (I, Graphics g, long ivec, long first, long last,
-	double minimum, double maximum, int weigh, double size_mm, const wchar_t *mark,
-	int connect, wchar_t **rowLabels, int garnish);
+	double minimum, double maximum, int weigh, double size_mm, const char32 *mark,
+	int connect, char32 **rowLabels, int garnish);
 /*
-	Draw eigenvector. When rowLabels != NULL, draw row text labels on bottom axis.
+	Draw eigenvector. When rowLabels != nullptr, draw row text labels on bottom axis.
 */
 
 void Eigens_alignEigenvectors (Collection me);
diff --git a/dwsys/Eigen_def.h b/dwsys/Eigen_def.h
index a3c3fdb..0bc638d 100644
--- a/dwsys/Eigen_def.h
+++ b/dwsys/Eigen_def.h
@@ -22,7 +22,7 @@
 */
 
 #define ooSTRUCT Eigen
-oo_DEFINE_CLASS (Eigen, Data)
+oo_DEFINE_CLASS (Eigen, Daata)
 
 	oo_LONG (numberOfEigenvalues)
 	oo_LONG (dimension)
diff --git a/dwsys/FileInMemory.cpp b/dwsys/FileInMemory.cpp
index f2eeba7..97ce4c3 100644
--- a/dwsys/FileInMemory.cpp
+++ b/dwsys/FileInMemory.cpp
@@ -1,6 +1,6 @@
 /* FileInMemory.cpp
  *
- * Copyright (C) 2012-2013 David Weenink
+ * Copyright (C) 2012-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,13 +20,13 @@
 #include "FileInMemory.h"
 #include "Strings_.h"
 
-Thing_implement (FileInMemory, Data, 0);
+Thing_implement (FileInMemory, Daata, 0);
 
 void structFileInMemory :: v_copy (thou) {
 	thouart (FileInMemory);
 	FileInMemory_Parent :: v_copy (thee);
-	thy d_path = Melder_wcsdup (d_path);
-	thy d_id = Melder_wcsdup (d_id);
+	thy d_path = Melder_dup (d_path);
+	thy d_id = Melder_dup (d_id);
 	thy d_numberOfBytes = d_numberOfBytes;
 	thy d_data = NUMvector<char> (0, d_numberOfBytes);
 	memcpy (thy d_data, d_data, d_numberOfBytes+1);
@@ -40,24 +40,24 @@ void structFileInMemory :: v_destroy () {
 }
 
 void structFileInMemory :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"File name: ", d_path);
-	MelderInfo_writeLine (L"Id: ", d_id);
-	MelderInfo_writeLine (L"Number of bytes: ", Melder_integer (d_numberOfBytes));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"File name: ", d_path);
+	MelderInfo_writeLine (U"Id: ", d_id);
+	MelderInfo_writeLine (U"Number of bytes: ", d_numberOfBytes);
 }
 
 FileInMemory FileInMemory_create (MelderFile file) {
 	try {
 		if (! MelderFile_readable (file)) {
-			Melder_throw ("File not readable.");
+			Melder_throw (U"File not readable.");
 		}
 		long length = MelderFile_length (file);
 		if (length <= 0) {
-			Melder_throw ("File is empty.");
+			Melder_throw (U"File is empty.");
 		}
 		autoFileInMemory me = Thing_new (FileInMemory);
-		my d_path = Melder_wcsdup (file -> path);
-		my d_id = Melder_wcsdup (MelderFile_name (file));
+		my d_path = Melder_dup (file -> path);
+		my d_id = Melder_dup (MelderFile_name (file));
 		my d_numberOfBytes = length;
 		my d_data = NUMvector <char> (0, my d_numberOfBytes); // one extra for 0-byte at end if text
 		MelderFile_open (file);
@@ -69,53 +69,53 @@ FileInMemory FileInMemory_create (MelderFile file) {
 		MelderFile_close (file);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("FileInMemory not created from \"", Melder_fileToPath (file), "\".");
+		Melder_throw (U"FileInMemory not created from \"", Melder_fileToPath (file), U"\".");
 	}
 }
 
-FileInMemory FileInMemory_createWithData (long numberOfBytes, const char *data, const wchar_t *path, const wchar_t *id) {
+FileInMemory FileInMemory_createWithData (long numberOfBytes, const char *data, const char32 *path, const char32 *id) {
 	try {
 		autoFileInMemory me = Thing_new (FileInMemory);
-		my d_path = Melder_wcsdup (path);
-		my d_id = Melder_wcsdup (id);
+		my d_path = Melder_dup (path);
+		my d_id = Melder_dup (id);
 		my d_numberOfBytes = numberOfBytes;
 		my d_data = const_cast<char *> (data); // copy pointer to data only
 		return me.transfer ();
 	} catch (MelderError) {
-		Melder_throw ("FileInMemory not create from data.");
+		Melder_throw (U"FileInMemory not create from data.");
 	}
 }
 
-void FileInMemory_setId (FileInMemory me, const wchar_t *newId) {
+void FileInMemory_setId (FileInMemory me, const char32 *newId) {
 	Melder_free (my d_id);
-	my d_id = Melder_wcsdup (newId);
+	my d_id = Melder_dup (newId);
 }
 
-void FileInMemory_showAsCode (FileInMemory me, const wchar_t *name, long numberOfBytesPerLine)
+void FileInMemory_showAsCode (FileInMemory me, const char32 *name, long numberOfBytesPerLine)
 {
 	if (numberOfBytesPerLine <= 0) numberOfBytesPerLine = 20;
 	// autoNUMvector<unsigned char> data (0, my d_numberOfBytes); ????
-	MelderInfo_writeLine (L"\t\tstatic unsigned char ", name, L"_data[", Melder_integer (my d_numberOfBytes+1), L"] = {");
+	MelderInfo_writeLine (U"\t\tstatic unsigned char ", name, U"_data[", my d_numberOfBytes+1, U"] = {");
 	for (long i = 0; i < my d_numberOfBytes; i++) {
 		unsigned char number = my d_data[i];
-		MelderInfo_write ((i % numberOfBytesPerLine == 0 ? L"\t\t\t" : L""), Melder_integer (number), L",",
-			((i % numberOfBytesPerLine  == (numberOfBytesPerLine - 1)) ? L"\n" : L" "));
+		MelderInfo_write ((i % numberOfBytesPerLine == 0 ? U"\t\t\t" : U""), number, U",",
+			((i % numberOfBytesPerLine  == (numberOfBytesPerLine - 1)) ? U"\n" : U" "));
 	}
-	MelderInfo_writeLine ((my d_numberOfBytes - 1) % numberOfBytesPerLine == (numberOfBytesPerLine - 1) ? L"\t\t\t0};" : L"0};");
-	MelderInfo_write (L"\t\tautoFileInMemory ", name, L" = FileInMemory_createWithData (");
-	MelderInfo_writeLine (Melder_integer (my d_numberOfBytes), L", reinterpret_cast<const char *> (&", name, L"_data), \n\t\t\tL\"", my d_path, L"\", \n\t\t\tL\"", my d_id, L"\");");
+	MelderInfo_writeLine ((my d_numberOfBytes - 1) % numberOfBytesPerLine == (numberOfBytesPerLine - 1) ? U"\t\t\t0};" : U"0};");
+	MelderInfo_write (U"\t\tautoFileInMemory ", name, U" = FileInMemory_createWithData (");
+	MelderInfo_writeLine (my d_numberOfBytes, U", reinterpret_cast<const char *> (&", name, U"_data), \n\t\t\tU\"", my d_path, U"\", \n\t\t\tU\"", my d_id, U"\");");
 }
 
 Thing_implement (FilesInMemory, SortedSet, 0);
 
 int structFilesInMemory :: s_compare_name (I, thou) {
 	iam (FileInMemory); thouart (FileInMemory);
-	return Melder_wcscmp (my d_path, thy d_path);
+	return Melder_cmp (my d_path, thy d_path);
 }
 
 int structFilesInMemory :: s_compare_id (I, thou) {
 	iam (FileInMemory); thouart (FileInMemory);
-	return Melder_wcscmp (my d_id, thy d_id);
+	return Melder_cmp (my d_id, thy d_id);
 }
 
 FilesInMemory FilesInMemory_create () {
@@ -124,19 +124,17 @@ FilesInMemory FilesInMemory_create () {
 		Collection_init (me.peek(), classFileInMemory, 30);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("FilesInMemory not created.");
+		Melder_throw (U"FilesInMemory not created.");
 	}
 }
 
-FilesInMemory FilesInMemory_createFromDirectoryContents (const wchar_t *dirpath, const wchar *fileGlobber) {
+FilesInMemory FilesInMemory_createFromDirectoryContents (const char32 *dirpath, const char32 *fileGlobber) {
 	try {
 		structMelderDir parent = { { 0 } };
 		Melder_pathToDir (dirpath, &parent);
-		autoMelderString path;
-		MelderString_append (&path, dirpath, L"/", fileGlobber);
-		autoStrings thee = Strings_createAsFileList (path.string);
+		autoStrings thee = Strings_createAsFileList (Melder_cat (dirpath, U"/", fileGlobber));
 		if (thy numberOfStrings < 1) {
-			Melder_throw ("No files found.");
+			Melder_throw (U"No files found.");
 		}
 		autoFilesInMemory me = FilesInMemory_create ();
 		for (long i = 1; i <= thy numberOfStrings; i++) {
@@ -147,58 +145,56 @@ FilesInMemory FilesInMemory_createFromDirectoryContents (const wchar_t *dirpath,
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("FilesInMemory not created from directory \"", dirpath, "\" for files that match \"",
-		fileGlobber, "\".");
+		Melder_throw (U"FilesInMemory not created from directory \"", dirpath, U"\" for files that match \"",
+		fileGlobber, U"\".");
 	}
 }
 
-void FilesInMemory_showAsCode (FilesInMemory me, const wchar_t *name, long numberOfBytesPerLine) {
+void FilesInMemory_showAsCode (FilesInMemory me, const char32 *name, long numberOfBytesPerLine) {
 	autoMelderString one_fim;
-	autoMelderString all_fims;
-	MelderInfo_writeLine (L"#include \"Collection.h\"");
-	MelderInfo_writeLine (L"#include \"FileInMemory.h\"");
-	MelderInfo_writeLine (L"#include \"melder.h\"\n");
-	MelderInfo_writeLine (L"FilesInMemory create_", name, L" () {");
-	MelderInfo_writeLine (L"\ttry {");
-	MelderInfo_writeLine (L"\t\tautoFilesInMemory me = FilesInMemory_create ();");
+	MelderInfo_writeLine (U"#include \"Collection.h\"");
+	MelderInfo_writeLine (U"#include \"FileInMemory.h\"");
+	MelderInfo_writeLine (U"#include \"melder.h\"\n");
+	MelderInfo_writeLine (U"FilesInMemory create_", name, U" () {");
+	MelderInfo_writeLine (U"\ttry {");
+	MelderInfo_writeLine (U"\t\tautoFilesInMemory me = FilesInMemory_create ();");
 	for (long ifile = 1; ifile <= my size; ifile++) {
 		FileInMemory fim = (FileInMemory) my item[ifile];
-		MelderString_append (&one_fim, name, Melder_integer (ifile));
+		MelderString_copy (&one_fim, name, ifile);
 		FileInMemory_showAsCode (fim, one_fim.string, numberOfBytesPerLine);
-		MelderInfo_writeLine (L"\t\tCollection_addItem (me.peek(), ", one_fim.string, L".transfer());\n");
-		MelderString_empty (&one_fim);
+		MelderInfo_writeLine (U"\t\tCollection_addItem (me.peek(), ", one_fim.string, U".transfer());\n");
 	}
-	MelderInfo_writeLine (L"\t\treturn me.transfer();");
-	MelderInfo_writeLine (L"\t} catch (MelderError) {");
-	MelderInfo_writeLine (L"\t\tMelder_throw (L\"FilesInMemory not created.\");");
-	MelderInfo_writeLine (L"\t}");
-	MelderInfo_writeLine (L"}\n\n");
+	MelderInfo_writeLine (U"\t\treturn me.transfer();");
+	MelderInfo_writeLine (U"\t} catch (MelderError) {");
+	MelderInfo_writeLine (U"\t\tMelder_throw (L\"FilesInMemory not created.\");");
+	MelderInfo_writeLine (U"\t}");
+	MelderInfo_writeLine (U"}\n\n");
 }
 
-void FilesInMemory_showOneFileAsCode (FilesInMemory me, long index, const wchar_t *name, long numberOfBytesPerLine)
+void FilesInMemory_showOneFileAsCode (FilesInMemory me, long index, const char32 *name, long numberOfBytesPerLine)
 {
 	if (index < 1 || index > my size) return;
-	MelderInfo_writeLine (L"#include \"FileInMemory.h\"");
-	MelderInfo_writeLine (L"#include \"melder.h\"\n");
-	MelderInfo_writeLine (L"static FileInMemory create_new_object () {");
-	MelderInfo_writeLine (L"\ttry {");
+	MelderInfo_writeLine (U"#include \"FileInMemory.h\"");
+	MelderInfo_writeLine (U"#include \"melder.h\"\n");
+	MelderInfo_writeLine (U"static FileInMemory create_new_object () {");
+	MelderInfo_writeLine (U"\ttry {");
 	autoMelderString one_fim;
 	FileInMemory fim = (FileInMemory) my item[index];
-	MelderString_append (&one_fim, name, Melder_integer (index));
-	FileInMemory_showAsCode (fim, L"me", numberOfBytesPerLine);
-	MelderInfo_writeLine (L"\t\treturn me.transfer();");
-	MelderInfo_writeLine (L"\t} catch (MelderError) {");
-	MelderInfo_writeLine (L"\t\tMelder_throw (L\"FileInMemory not created.\");");
-	MelderInfo_writeLine (L"\t}");
-	MelderInfo_writeLine (L"}\n\n");
-	MelderInfo_writeLine (L"FileInMemory ", name, L" = create_new_object ();");
+	MelderString_append (&one_fim, name, index);
+	FileInMemory_showAsCode (fim, U"me", numberOfBytesPerLine);
+	MelderInfo_writeLine (U"\t\treturn me.transfer();");
+	MelderInfo_writeLine (U"\t} catch (MelderError) {");
+	MelderInfo_writeLine (U"\t\tMelder_throw (L\"FileInMemory not created.\");");
+	MelderInfo_writeLine (U"\t}");
+	MelderInfo_writeLine (U"}\n\n");
+	MelderInfo_writeLine (U"FileInMemory ", name, U" = create_new_object ();");
 }
 
-long FilesInMemory_getIndexFromId (FilesInMemory me, const wchar_t *id) {
+long FilesInMemory_getIndexFromId (FilesInMemory me, const char32 *id) {
 	long index = 0;
 	for (long i = 1; i <= my size; i++) {
 		FileInMemory fim = (FileInMemory) my item[i];
-		if (Melder_wcscmp (id, fim -> d_id) == 0) {
+		if (Melder_cmp (id, fim -> d_id) == 0) {
 			index = i; break;
 		}
 	}
@@ -208,35 +204,34 @@ long FilesInMemory_getIndexFromId (FilesInMemory me, const wchar_t *id) {
 Strings FilesInMemory_to_Strings_id (FilesInMemory me) {
 	try {
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector <wchar *> (1, my size);
+		thy strings = NUMvector <char32 *> (1, my size);
 		thy numberOfStrings = 0;
 		for (long ifile = 1; ifile <= my size; ifile++) {
 			FileInMemory fim = (FileInMemory) my item[ifile];
-			thy strings[ifile] = Melder_wcsdup_f (fim -> d_id);
+			thy strings[ifile] = Melder_dup_f (fim -> d_id);
 			thy numberOfStrings++;
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No Strings created from FilesinMemory.");
+		Melder_throw (U"No Strings created from FilesinMemory.");
 	}
 }
 
-char * FilesInMemory_getCopyOfData (FilesInMemory me, const wchar_t *id, long *numberOfBytes) {
+char * FilesInMemory_getCopyOfData (FilesInMemory me, const char32 *id, long *numberOfBytes) {
 	*numberOfBytes = 0;
 	long index = FilesInMemory_getIndexFromId (me, id);
 	if (index == 0) return 0;
 	FileInMemory fim = (FileInMemory) my item[index];
 	char *data = (char *) _Melder_malloc (fim -> d_numberOfBytes);
-	if (data == 0 ||
-		(memcpy (data, fim -> d_data, fim -> d_numberOfBytes) == NULL)) {
-		//Melder_error_ (L"No memory for dictionary.");
-		return 0;
+	if (data == 0 || ! memcpy (data, fim -> d_data, fim -> d_numberOfBytes)) {
+		//Melder_appendError (U"No memory for dictionary.");
+		return nullptr;
 	}
 	*numberOfBytes = fim -> d_numberOfBytes;
 	return data;
 }
 
-const char * FilesInMemory_getData (FilesInMemory me, const wchar_t *id, long *numberOfBytes) {
+const char * FilesInMemory_getData (FilesInMemory me, const char32 *id, long *numberOfBytes) {
 	*numberOfBytes = 0;
 	long index = FilesInMemory_getIndexFromId (me, id);
 	if (index == 0) return 0;
diff --git a/dwsys/FileInMemory.h b/dwsys/FileInMemory.h
index 7d36bbd..0b40a8f 100644
--- a/dwsys/FileInMemory.h
+++ b/dwsys/FileInMemory.h
@@ -28,44 +28,46 @@
 #include "melder.h"
 #include "Strings_.h"
 
-Thing_define (FileInMemory, Data) {
-	public:
-		wchar_t *d_path;
-		wchar_t *d_id;
-		long d_numberOfBytes;
-		char *d_data;
-	// overridden methods:
-		void v_copy (Any data_to);
-		void v_destroy ();
-		void v_info ();
+Thing_define (FileInMemory, Daata) {
+	char32 *d_path;
+	char32 *d_id;
+	long d_numberOfBytes;
+	char *d_data;
+
+	void v_copy (Any data_to)
+		override;
+	void v_destroy ()
+		override;
+	void v_info ()
+		override;
 };
 
 FileInMemory FileInMemory_create (MelderFile file);
-FileInMemory FileInMemory_createWithData (long numberOfBytes, const char *data, const wchar_t *path, const wchar_t *id);
+FileInMemory FileInMemory_createWithData (long numberOfBytes, const char *data, const char32 *path, const char32 *id);
 
 void FileInMemory_dontOwnData (FileInMemory me);
-void FileInMemory_setId (FileInMemory me, const wchar_t *newId);
+void FileInMemory_setId (FileInMemory me, const char32 *newId);
 
-void FileInMemory_showAsCode (FileInMemory me, const wchar_t *name, long numberOfBytesPerLine);
+void FileInMemory_showAsCode (FileInMemory me, const char32 *name, long numberOfBytesPerLine);
 
 Thing_define (FilesInMemory, SortedSet) {
-	public:
 	int d_sortKey;
-	// overridden methods:
+
 	static int s_compare_name (Any data1, Any data2);
 	static int s_compare_id (Any data1, Any data2);
-	virtual Data_CompareFunction v_getCompareFunction () { return d_sortKey == 0 ? s_compare_name : s_compare_id; }
+	Data_CompareFunction v_getCompareFunction ()
+		override { return d_sortKey == 0 ? s_compare_name : s_compare_id; }
 };
 
 FilesInMemory FilesInMemory_create ();
-FilesInMemory FilesInMemory_createFromDirectoryContents (const wchar_t *dirpath, const wchar *file);
+FilesInMemory FilesInMemory_createFromDirectoryContents (const char32 *dirpath, const char32 *file);
 
-void FilesInMemory_showAsCode (FilesInMemory me, const wchar_t *name, long numberOfBytesPerLine);
-void FilesInMemory_showOneFileAsCode (FilesInMemory me, long index, const wchar_t *name, long numberOfBytesPerLine);
+void FilesInMemory_showAsCode (FilesInMemory me, const char32 *name, long numberOfBytesPerLine);
+void FilesInMemory_showOneFileAsCode (FilesInMemory me, long index, const char32 *name, long numberOfBytesPerLine);
 
-long FilesInMemory_getIndexFromId (FilesInMemory me, const wchar_t *id);
+long FilesInMemory_getIndexFromId (FilesInMemory me, const char32 *id);
 Strings FilesInMemory_to_Strings_id (FilesInMemory me);
-char * FilesInMemory_getCopyOfData (FilesInMemory me, const wchar_t *id, long *numberOfBytes);
-const char * FilesInMemory_getData (FilesInMemory me, const wchar_t *id, long *numberOfBytes);
+char * FilesInMemory_getCopyOfData (FilesInMemory me, const char32 *id, long *numberOfBytes);
+const char * FilesInMemory_getData (FilesInMemory me, const char32 *id, long *numberOfBytes);
 
 #endif // _FileInMemory_h_
diff --git a/dwsys/Graphics_extensions.cpp b/dwsys/Graphics_extensions.cpp
index 054cced..d4cd8d4 100644
--- a/dwsys/Graphics_extensions.cpp
+++ b/dwsys/Graphics_extensions.cpp
@@ -1,6 +1,6 @@
 /* Graphics_extensions.c
  *
- * Copyright (C) 2012 -2014 David Weenink
+ * Copyright (C) 2012 -2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@
 void Graphics_boxAndWhiskerPlot (Graphics g, double data[], long ndata, double x, double r, double w, double ymin, double ymax) {
 	int lineType = Graphics_inqLineType (g);
 
-	Melder_assert (r > 0 && w > 0);
+	Melder_assert (r > 0.0 && w > 0.0);
 	if (ndata < 3) {
 		return;
 	}
@@ -60,7 +60,7 @@ void Graphics_boxAndWhiskerPlot (Graphics g, double data[], long ndata, double x
 		return;
 	}
 
-	double mean = 0;
+	double mean = 0.0;
 	for (long i = 1; i <= ndata; i++) {
 		mean += data[i];
 	}
@@ -87,10 +87,10 @@ void Graphics_boxAndWhiskerPlot (Graphics g, double data[], long ndata, double x
 	}
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
 	while (i <= ie && data[i] < lowerOuterFence) {
-		Graphics_text (g, x, data[i], L"o"); i++;
+		Graphics_text (g, x, data[i], U"o"); i++;
 	}
 	while (i <= ie && data[i] < lowerInnerFence) {
-		Graphics_text (g, x, data[i], L"*"); i++;
+		Graphics_text (g, x, data[i], U"*"); i++;
 	}
 	double lowerWhisker = data[i] < q25 ? data[i] : lowerInnerFence;
 	if (lowerWhisker > ymax) {
@@ -104,10 +104,10 @@ void Graphics_boxAndWhiskerPlot (Graphics g, double data[], long ndata, double x
 		i--;
 	}
 	while (i >= ie && data[i] > upperOuterFence) {
-		Graphics_text (g, x, data[i], L"o"); i--;
+		Graphics_text (g, x, data[i], U"o"); i--;
 	}
 	while (i >= ie && data[i] > upperInnerFence) {
-		Graphics_text (g, x, data[i], L"*"); i--;
+		Graphics_text (g, x, data[i], U"*"); i--;
 	}
 	double upperWhisker = data[i] > q75 ? data[i] : upperInnerFence;
 	if (upperWhisker < ymin) {
@@ -174,7 +174,7 @@ void Graphics_boxAndWhiskerPlot (Graphics g, double data[], long ndata, double x
 	}
 }
 
-void Graphics_quantileQuantilePlot (Graphics g, long numberOfQuantiles, double xdata[], long xnumberOfData, double ydata[], long ynumberOfData, double xmin, double xmax, double ymin, double ymax, int labelSize, const wchar_t *plotLabel) {
+void Graphics_quantileQuantilePlot (Graphics g, long numberOfQuantiles, double xdata[], long xnumberOfData, double ydata[], long ynumberOfData, double xmin, double xmax, double ymin, double ymax, int labelSize, const char32 *plotLabel) {
 	int fontSize = Graphics_inqFontSize (g);
 
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
@@ -187,7 +187,7 @@ void Graphics_quantileQuantilePlot (Graphics g, long numberOfQuantiles, double x
 	long numberOfData = xnumberOfData < ynumberOfData ? xnumberOfData : ynumberOfData;
 	numberOfQuantiles = numberOfData < numberOfQuantiles ? numberOfData : numberOfQuantiles;
 	double un = pow (0.5, 1.0 / numberOfQuantiles);
-	double u1 = 1 - un;
+	double u1 = 1.0 - un;
 	if (xmin == xmax) {
 		xmin = NUMquantile (xnumberOfData, xsorted.peek(), u1);
 		xmax = NUMquantile (xnumberOfData, xsorted.peek(), un);
@@ -239,7 +239,7 @@ void Graphics_matrixAsSquares (Graphics g, double **matrix, long numberOfRows, l
 		y1 = y1 < y1WC ? y1WC : y1;
 		double y2 = y1WC + ycenter + zweight * 0.5 * dy * cellSizeFactor;
 		y2 = y2 > y2WC ? y2WC : y2;
-		if (z > 0) {
+		if (z > 0.0) {
 			Graphics_setColour (g, Graphics_WHITE);
 		}
 		Graphics_fillRectangle (g, x1, x2, y1, y2);
@@ -248,7 +248,7 @@ void Graphics_matrixAsSquares (Graphics g, double **matrix, long numberOfRows, l
 	}
 }
 
-void Graphics_lagPlot (Graphics g, double data[], long numberOfData, double xmin, double xmax, long lag, int labelSize, const wchar_t *plotLabel) {
+void Graphics_lagPlot (Graphics g, double data[], long numberOfData, double xmin, double xmax, long lag, int labelSize, const char32 *plotLabel) {
 	if (lag < 0 || lag >= numberOfData) {
 		return;
 	}
diff --git a/dwsys/Graphics_extensions.h b/dwsys/Graphics_extensions.h
index cd5d1da..05a4d2a 100644
--- a/dwsys/Graphics_extensions.h
+++ b/dwsys/Graphics_extensions.h
@@ -33,10 +33,10 @@
 
 void Graphics_boxAndWhiskerPlot (Graphics g, double data[], long ndata, double x, double r, double w, double ymin, double ymax);
 
-void Graphics_quantileQuantilePlot (Graphics g, long numberOfQuantiles, double xdata[], long xnumberOfData, double ydata[], long ynumberOfData, double xmin, double xmax, double ymin, double ymax, int labelSize, const wchar_t *plotLabel);
+void Graphics_quantileQuantilePlot (Graphics g, long numberOfQuantiles, double xdata[], long xnumberOfData, double ydata[], long ynumberOfData, double xmin, double xmax, double ymin, double ymax, int labelSize, const char32 *plotLabel);
 
 void Graphics_matrixAsSquares (Graphics g, double **matrix, long numberOfRows, long numberOfColumns, double zmin, double zmax, double cellSizeFactor, int randomFillOrder);
 
-void Graphics_lagPlot (Graphics g, double x[], long numberOfData, double xmin, double xmax, long lag, int labelSize, const wchar_t *plotLabel);
+void Graphics_lagPlot (Graphics g, double x[], long numberOfData, double xmin, double xmax, long lag, int labelSize, const char32 *plotLabel);
 
 #endif /* _Graphics_extensions_h_ */
diff --git a/dwsys/Index.cpp b/dwsys/Index.cpp
index c1962bd..479af9e 100644
--- a/dwsys/Index.cpp
+++ b/dwsys/Index.cpp
@@ -1,6 +1,6 @@
-/* Index.c
+/* Index.cpp
  *
- * Copyright (C) 2005-2011 David Weenink
+ * Copyright (C) 2005-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,17 +49,17 @@
 #include "Index_def.h"
 
 
-Thing_implement (Index, Data, 0);
+Thing_implement (Index, Daata, 0);
 
 void structIndex :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of elements: ", Melder_integer (numberOfElements));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of elements: ", numberOfElements);
 }
 
 void Index_init (I, long numberOfElements) {
 	iam (Index);
 	if (numberOfElements < 1) {
-		Melder_throw ("Cannot create index without elements.");
+		Melder_throw (U"Cannot create index without elements.");
 	}
 	my classes = Ordered_create ();
 	my numberOfElements = numberOfElements;
@@ -75,17 +75,18 @@ Index Index_extractPart (I, long from, long to) {
 		if (to == 0) {
 			to = my numberOfElements;
 		}
-		if (to < from || from < 1 || to > my numberOfElements) Melder_throw
-			("Range should be in interval [1,", my numberOfElements, "].");
+		if (to < from || from < 1 || to > my numberOfElements) {
+			Melder_throw (U"Range should be in interval [1,", my numberOfElements, U"].");
+		}
 		autoIndex thee = Data_copy (me);
 		thy numberOfElements = to - from + 1;
-		/* */
+		
 		for (long i = 1; i <= thy numberOfElements; i++) {
 			thy classIndex[i] = my classIndex[from + i - 1];
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": part not extracted.");
+		Melder_throw (me, U": part not extracted.");
 	}
 }
 
@@ -97,14 +98,14 @@ StringsIndex StringsIndex_create (long numberOfElements) {
 		Index_init (me.peek(), numberOfElements);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("StringsIndex not created.");
+		Melder_throw (U"StringsIndex not created.");
 	}
 }
 
-int StringsIndex_getClass (StringsIndex me, wchar_t *classLabel) {
+int StringsIndex_getClass (StringsIndex me, char32 *klasLabel) {
 	for (long i = 1; i <= my classes -> size; i++) {
 		SimpleString ss = (SimpleString) my classes -> item[i];
-		if (Melder_wcscmp (ss -> string, classLabel) == 0) {
+		if (Melder_cmp (ss -> string, klasLabel) == 0) {
 			return i;
 		}
 	}
@@ -119,4 +120,4 @@ long StringsIndex_countItems (StringsIndex me, int iclass) {
 	return sum;
 }
 
-/* End of Index.c */
+/* End of Index.cpp */
diff --git a/dwsys/Index.h b/dwsys/Index.h
index 9899150..74cd631 100644
--- a/dwsys/Index.h
+++ b/dwsys/Index.h
@@ -22,7 +22,7 @@
 #include "Collection.h"
 
 #include "Index_def.h"
-oo_CLASS_CREATE (Index, Data);
+oo_CLASS_CREATE (Index, Daata);
 oo_CLASS_CREATE (StringsIndex, Index);
 
 void Index_init (I, long numberOfElements);
@@ -31,7 +31,7 @@ Index Index_extractPart (I, long from, long to);
 
 StringsIndex StringsIndex_create (long numberOfElements);
 
-int StringsIndex_getClass (StringsIndex me, wchar_t *classLabel);
+int StringsIndex_getClass (StringsIndex me, char32 *classLabel);
 
 long StringsIndex_countItems (StringsIndex me, int iclas);
 
diff --git a/dwsys/Index_def.h b/dwsys/Index_def.h
index 16c4201..55ef67d 100644
--- a/dwsys/Index_def.h
+++ b/dwsys/Index_def.h
@@ -23,14 +23,14 @@
 */
 
 #define ooSTRUCT Index
-oo_DEFINE_CLASS (Index, Data)
+oo_DEFINE_CLASS (Index, Daata)
 	oo_OBJECT (Ordered, 0, classes)
 	oo_LONG (numberOfElements)
 	oo_LONG_VECTOR (classIndex, numberOfElements)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS(Index)	
diff --git a/dwsys/NUM2.cpp b/dwsys/NUM2.cpp
index 2091c0e..8d673a8 100644
--- a/dwsys/NUM2.cpp
+++ b/dwsys/NUM2.cpp
@@ -123,31 +123,31 @@ int NUMdmatrix_hasInfinities (double **m, long rb, long re, long cb, long ce) {
 	return max >= NUMfpp -> rmax || min <= - NUMfpp -> rmax;
 }
 
-void NUMdmatrix_printMatlabForm (double **m, long nr, long nc, const wchar_t *name) {
+void NUMdmatrix_printMatlabForm (double **m, long nr, long nc, const char32 *name) {
 	long npc = 5;
 	ldiv_t n = ldiv (nc, npc);
 
 	MelderInfo_open ();
-	MelderInfo_write (name, L"=[");
+	MelderInfo_write (name, U"=[");
 	for (long i = 1; i <= nr; i++) {
 		for (long j = 1; j <= n.quot; j++) {
 			for (long k = 1; k <= npc; k++) {
-				MelderInfo_write (Melder_double (m[i][ (j - 1) *npc + k]), (k < npc ? L", " : L""));
+				MelderInfo_write (m[i][ (j - 1) *npc + k], (k < npc ? U", " : U""));
 			}
-			MelderInfo_write (j < n.quot ? L",\n" : L"");
+			MelderInfo_write (j < n.quot ? U",\n" : U"");
 		}
 
 		for (long k = 1; k <= n.rem; k++) {
-			MelderInfo_write (Melder_double (m[i][n.quot * npc + k]), (k < n.rem ? L", " : L""));
+			MelderInfo_write (m[i][n.quot * npc + k], (k < n.rem ? U", " : U""));
 		}
-		MelderInfo_write (i < nr ? L";\n" : L"];\n");
+		MelderInfo_write (i < nr ? U";\n" : U"];\n");
 	}
 	MelderInfo_close ();
 }
 
 void NUMcentreRows (double **a, long rb, long re, long cb, long ce) {
 	for (long i = rb; i <= re; i++) {
-		double rowmean = 0;
+		double rowmean = 0.0;
 		for (long j = cb; j <= ce; j++) {
 			rowmean += a[i][j];
 		}
@@ -160,7 +160,7 @@ void NUMcentreRows (double **a, long rb, long re, long cb, long ce) {
 
 void NUMcentreColumns (double **a, long rb, long re, long cb, long ce, double *centres) {
 	for (long j = cb; j <= ce; j++) {
-		double colmean = 0;
+		double colmean = 0.0;
 		for (long i = rb; i <= re; i++) {
 			colmean += a[i][j];
 		}
@@ -168,7 +168,7 @@ void NUMcentreColumns (double **a, long rb, long re, long cb, long ce, double *c
 		for (long i = rb; i <= re; i++) {
 			a[i][j] -= colmean;
 		}
-		if (centres != NULL) {
+		if (centres) {
 			centres[j - cb + 1] = colmean;
 		}
 	}
@@ -182,11 +182,11 @@ void NUMdoubleCentre (double **a, long rb, long re, long cb, long ce) {
 void NUMnormalizeColumns (double **a, long nr, long nc, double norm) {
 	Melder_assert (norm > 0);
 	for (long j = 1; j <= nc; j++) {
-		double s = 0;
+		double s = 0.0;
 		for (long i = 1; i <= nr; i++) {
 			s += a[i][j] * a[i][j];
 		}
-		if (s <= 0) {
+		if (s <= 0.0) {
 			continue;
 		}
 		s = sqrt (norm / s);
@@ -199,11 +199,11 @@ void NUMnormalizeColumns (double **a, long nr, long nc, double norm) {
 void NUMnormalizeRows (double **a, long nr, long nc, double norm) {
 	Melder_assert (norm > 0);
 	for (long i = 1; i <= nr; i++) {
-		double s = 0;
+		double s = 0.0;
 		for (long j = 1; j <= nc; j++) {
 			s += a[i][j] * a[i][j];
 		}
-		if (s <= 0) {
+		if (s <= 0.0) {
 			continue;
 		}
 		s = sqrt (norm / s);
@@ -215,13 +215,13 @@ void NUMnormalizeRows (double **a, long nr, long nc, double norm) {
 
 void NUMnormalize (double **a, long nr, long nc, double norm) {
 	Melder_assert (norm > 0);
-	double sq = 0;
+	double sq = 0.0;
 	for (long i = 1; i <= nr; i++) {
 		for (long j = 1; j <= nc; j++) {
 			sq += a[i][j] * a[i][j];
 		}
 	}
-	if (sq <= 0) {
+	if (sq <= 0.0) {
 		return;
 	}
 	norm = sqrt (norm / sq);
@@ -238,7 +238,7 @@ void NUMstandardizeColumns (double **a, long rb, long re, long cb, long ce) {
 		return;
 	}
 	for (long j = cb; j <= ce; j++) {
-		double ep = 0, s = 0, sdev, var = 0;
+		double ep = 0.0, s = 0.0, sdev, var = 0.0;
 		for (long i = rb; i <= re; i++) {
 			s += a[i][j];
 		}
@@ -248,12 +248,12 @@ void NUMstandardizeColumns (double **a, long rb, long re, long cb, long ce) {
 			ep += s;
 			var += s * s;
 		}
-		if (ave != 0) {
+		if (ave != 0.0) {
 			for (long i = rb; i <= re; i++) {
 				a[i][j] -= ave;
 			}
 		}
-		if (var > 0) {
+		if (var > 0.0) {
 			var = (var - ep * ep / n) / (n - 1);
 			sdev = sqrt (var);
 			for (long i = rb; i <= re; i++) {
@@ -269,7 +269,7 @@ void NUMstandardizeRows (double **a, long rb, long re, long cb, long ce) {
 		return;
 	}
 	for (long i = rb; i <= re; i++) {
-		double ep = 0, s = 0, sdev, var = 0;
+		double ep = 0.0, s = 0.0, sdev, var = 0.0;
 		for (long j = cb; j <= ce; j++) {
 			s += a[i][j];
 		}
@@ -279,12 +279,12 @@ void NUMstandardizeRows (double **a, long rb, long re, long cb, long ce) {
 			ep += s;
 			var += s * s;
 		}
-		if (ave != 0) {
+		if (ave != 0.0) {
 			for (long j = cb; j <= ce; j++) {
 				a[i][j] -= ave;
 			}
 		}
-		if (var > 0) {
+		if (var > 0.0) {
 			var = (var - ep * ep / n) / (n - 1);
 			sdev = sqrt (var);
 			for (long j = cb; j <= ce; j++) {
@@ -300,7 +300,7 @@ void NUMaverageColumns (double **a, long rb, long re, long cb, long ce) {
 		return;
 	}
 	for (long j = cb; j <= ce; j++) {
-		double ave = 0;
+		double ave = 0.0;
 		for (long i = rb; i <= re; i++) {
 			ave += a[i][j];
 		}
@@ -314,7 +314,7 @@ void NUMaverageColumns (double **a, long rb, long re, long cb, long ce) {
 
 void NUMvector_avevar (double *a, long n, double *average, double *variance) {
 
-	double eps = 0, mean = 0, var = 0;
+	double eps = 0.0, mean = 0.0, var = 0.0;
 
 	for (long i = 1; i <= n; i++) {
 		mean += a[i];
@@ -322,11 +322,11 @@ void NUMvector_avevar (double *a, long n, double *average, double *variance) {
 
 	mean /= n;
 
-	if (average != NULL) {
+	if (average) {
 		*average = mean;
 	}
 
-	if (variance == NULL) {
+	if (! variance) {
 		return;
 	}
 
@@ -346,7 +346,7 @@ void NUMvector_avevar (double *a, long n, double *average, double *variance) {
 
 void NUMcolumn_avevar (double **a, long nr, long nc, long icol, double *average, double *variance) {
 
-	double eps = 0, mean = 0, var = 0;
+	double eps = 0.0, mean = 0.0, var = 0.0;
 
 	Melder_assert (nr > 0 && nc > 0 && icol > 0 && icol <= nc);
 
@@ -356,11 +356,11 @@ void NUMcolumn_avevar (double **a, long nr, long nc, long icol, double *average,
 
 	mean /= nr;
 
-	if (average != NULL) {
+	if (average) {
 		*average = mean;
 	}
 
-	if (variance == NULL) {
+	if (! variance) {
 		return;
 	}
 
@@ -379,11 +379,9 @@ void NUMcolumn_avevar (double **a, long nr, long nc, long icol, double *average,
 	*variance = var;
 }
 
-void NUMcolumn2_avevar (double **a, long nr, long nc, long icol1, long icol2,
-                        double *average1, double *variance1, double *average2, double *variance2,
-                        double *covariance) {
-	double eps1 = 0, eps2 = 0, mean1 = 0, mean2 = 0;
-	double var1 = 0, var2 = 0, covar = 0;
+void NUMcolumn2_avevar (double **a, long nr, long nc, long icol1, long icol2, double *average1, double *variance1, double *average2, double *variance2, double *covariance) {
+	double eps1 = 0.0, eps2 = 0.0, mean1 = 0.0, mean2 = 0.0;
+	double var1 = 0.0, var2 = 0.0, covar = 0.0;
 
 	Melder_assert (icol1 > 0 && icol1 <= nc && icol2 > 0 && icol2 <= nc);
 
@@ -395,14 +393,14 @@ void NUMcolumn2_avevar (double **a, long nr, long nc, long icol1, long icol2,
 	mean1 /= nr;
 	mean2 /= nr;
 
-	if (average1 != NULL) {
+	if (average1) {
 		*average1 = mean1;
 	}
-	if (average2 != NULL) {
+	if (average2) {
 		*average2 = mean2;
 	}
 
-	if (variance1 == NULL && variance2 == NULL && covariance == NULL) {
+	if (! variance1 && ! variance2 && ! covariance) {
 		return;
 	}
 
@@ -425,13 +423,13 @@ void NUMcolumn2_avevar (double **a, long nr, long nc, long icol1, long icol2,
 		covar = NUMundefined;
 	}
 
-	if (variance1 != NULL) {
+	if (variance1) {
 		*variance1 = var1;
 	}
-	if (variance2 != NULL) {
+	if (variance2) {
 		*variance2 = var2;
 	}
-	if (covariance != NULL) {
+	if (covariance) {
 		*covariance = covar;
 	}
 	if (icol1 == icol2) {
@@ -458,11 +456,11 @@ void NUMvector_smoothByMovingAverage (double *xin, long n, long nwindow, double
 
 void NUMcovarianceFromColumnCentredMatrix (double **x, long nrows, long ncols, long ndf, double **covar) {
 	if (ndf < 0 || nrows - ndf < 1 || covar == 0) {
-		Melder_throw ("Invalid arguments.");
+		Melder_throw (U"Invalid arguments.");
 	}
 	for (long i = 1; i <= ncols; i++) {
 		for (long j = i; j <= ncols; j++) {
-			double sum = 0;
+			double sum = 0.0;
 			for (long k = 1; k <= nrows; k++) {
 				sum += x[k][i] * x[k][j];
 			}
@@ -482,18 +480,18 @@ double NUMmultivariateKurtosis (double **x, long nrows, long ncols, int method)
 	NUMcentreColumns (x, 1, nrows, 1, ncols, mean.peek());
 	NUMcovarianceFromColumnCentredMatrix (x, nrows, ncols, 1, covar.peek());
 	if (method == 1) { // Schott (2001, page 33)
-		kurt = 0;
+		kurt = 0.0;
 		for (long l = 1; l <= ncols; l++) {
-			double zl = 0, wl, sll2 = covar[l][l] * covar[l][l];
+			double zl = 0.0, wl, sll2 = covar[l][l] * covar[l][l];
 			for (long j = 1; j <= nrows; j++) {
 				double d = x[j][l] - mean[l], d2 = d * d;
 				zl += d2 * d2;
 			}
-			zl = (zl - 6 * sll2) / (nrows - 4);
+			zl = (zl - 6.0 * sll2) / (nrows - 4);
 			wl = (sll2 - zl / nrows) * nrows / (nrows - 1);
 			kurt += zl / wl;
 		}
-		kurt = kurt / (3 * ncols) - 1;
+		kurt = kurt / (3 * ncols) - 1.0;
 	}
 	return kurt;
 }
@@ -533,14 +531,14 @@ void eigenSort (double d[], double **v, long n, int sort) {
 }
 
 int NUMstrcmp (const char *s1, const char *s2) {
-	if (s1 == NULL || s1[0] == '\0') {
-		if (s2 != NULL && s2[0] != '\0') {
+	if (! s1 || s1[0] == '\0') {
+		if (s2 && s2[0] != '\0') {
 			return -1;
 		} else {
 			return 0;
 		}
 	} else {
-		if (s2 == NULL) {
+		if (! s2) {
 			return +1;
 		} else {
 			return strcmp (s1, s2);
@@ -622,52 +620,46 @@ void NUMmonotoneRegression (const double x[], long n, double xs[]) {
 	}
 }
 
-float NUMfvector_getNorm1 (const float v[], long n);
-float NUMfvector_getNorm1 (const float v[], long n) {
-	float norm = 0; long i;
-	for (i = 1; i <= n; i++) {
+double NUMvector_getNorm1 (const double v[], long n) {
+	double norm = 0;
+	for (long i = 1; i <= n; i++) {
 		norm += fabs (v[i]);
 	}
 	return norm;
 }
 
-float NUMfvector_getNorm2 (const float v[], long n);
-float NUMfvector_getNorm2 (const float v[], long n) {
-	float norm = 0; long i;
-	for (i = 1; i <= n; i++) {
-		norm += v[i] * v[i];
-	}
-	return sqrt (norm);
-}
-
 double NUMvector_getNorm2 (const double v[], long n) {
-	double norm = 0; long i;
-	for (i = 1; i <= n; i++) {
+	double norm = 0.0;
+	for (long i = 1; i <= n; i++) {
 		norm += v[i] * v[i];
 	}
 	return sqrt (norm);
 }
 
 double NUMvector_normalize1 (double v[], long n) {
-	double norm = 0; long i;
-	for (i = 1; i <= n; i++) {
+	double norm = 0.0;
+	for (long i = 1; i <= n; i++) {
 		norm += fabs (v[i]);
 	}
-	if (norm > 0) for (i = 1; i <= n; i++) {
+	if (norm > 0.0) {
+		for (long i = 1; i <= n; i++) {
 			v[i] /= norm;
 		}
+	}
 	return norm;
 }
 
 double NUMvector_normalize2 (double v[], long n) {
-	double norm = 0; long i;
-	for (i = 1; i <= n; i++) {
+	double norm = 0;
+	for (long i = 1; i <= n; i++) {
 		norm += v[i] * v[i];
 	}
 	norm = sqrt (norm);
-	if (norm > 0) for (i = 1; i <= n; i++) {
+	if (norm > 0) {
+		for (long i = 1; i <= n; i++) {
 			v[i] /= norm;
 		}
+	}
 	return norm;
 }
 
@@ -703,16 +695,16 @@ void NUMdeterminant_cholesky (double **a, long n, double *lnd) {
 	long lda = n, info;
 	NUMlapack_dpotf2 (&uplo, &n, &a[1][1], &lda, &info);
 	if (info != 0) {
-		Melder_throw ("Cannot determine Cholesky decomposition.");
+		Melder_throw (U"Cannot determine Cholesky decomposition.");
 	}
 
 	// Determinant from diagonal, restore diagonal
-	*lnd = 0;
+	*lnd = 0.0;
 	for (long i = 1; i <= n; i++) {
 		*lnd += log (a[i][i]);
 		a[i][i] = d[i];
 	}
-	*lnd *= 2; // because A = L . L'
+	*lnd *= 2.0; // because A = L . L' TODO
 
 	// Restore lower from upper */
 
@@ -733,24 +725,24 @@ void NUMlowerCholeskyInverse (double **a, long n, double *lnd) {
 
 	(void) NUMlapack_dpotf2 (&uplo, &n, &a[1][1], &n, &info);
 	if (info != 0) {
-		Melder_throw ("dpotf2 fails.");
+		Melder_throw (U"dpotf2 fails.");
 	}
 
 	// Determinant from diagonal, diagonal is now sqrt (a[i][i]) !
 
 	if (lnd != NULL) {
-		*lnd = 0;
+		*lnd = 0.0;
 		for (long i = 1; i <= n; i++) {
 			*lnd += log (a[i][i]);
 		}
-		*lnd *= 2; /* because A = L . L' */
+		*lnd *= 2.0; /* because A = L . L' */
 	}
 
 	// Get the inverse */
 
 	(void) NUMlapack_dtrtri (&uplo, &diag, &n, &a[1][1], &n, &info);
 	if (info != 0) {
-		Melder_throw ("dtrtri fails.");
+		Melder_throw (U"dtrtri fails.");
 	}
 }
 
@@ -777,7 +769,7 @@ double NUMmahalanobisDistance_chi (double **linv, double *v, double *m, long nr,
 		}
 	} else { // nxn matrix
 		for (long i = n; i > 0; i--) {
-			double t = 0;
+			double t = 0.0;
 			for (long j = 1; j <= i; j++) {
 				t += linv[i][j] * (v[j] - m[j]);
 			}
@@ -788,7 +780,7 @@ double NUMmahalanobisDistance_chi (double **linv, double *v, double *m, long nr,
 }
 
 double NUMtrace (double **a, long n) {
-	double trace = 0;
+	double trace = 0.0;
 	for (long i = 1; i <= n; i++) {
 		trace += a[i][i];
 	}
@@ -796,7 +788,7 @@ double NUMtrace (double **a, long n) {
 }
 
 double NUMtrace2 (double **a1, double **a2, long n) {
-	double trace = 0;
+	double trace = 0.0;
 	for (long i = 1; i <= n; i++) {
 		for (long k = 1; k <= n; k++) {
 			trace += a1[i][k] * a2[k][i];
@@ -819,21 +811,21 @@ void NUMeigensystem (double **a, long n, double **evec, double eval[]) {
 void NUMdominantEigenvector (double **mns, long n, double *q, double *lambda, double tolerance) {
 	autoNUMvector<double> z (1, n);
 
-	double val, cval = 0;
+	double val, cval = 0.0;
 	for (long k = 1; k <= n; k++) {
 		for (long l = 1; l <= n; l++) {
 			cval += q[k] * mns[k][l] * q[l];
 		}
 	}
-	if (cval == 0) {
-		Melder_throw ("Zero matrices ??");
+	if (cval == 0.0) {
+		Melder_throw (U"Zero matrices ??");
 	}
 
 	long iter = 0;
 	do {
-		double znorm2 = 0;
+		double znorm2 = 0.0;
 		for (long l = 1; l <= n; l++) {
-			z[l] = 0;
+			z[l] = 0.0;
 			for (long k = 1; k <= n; k++) {
 				z[l] += mns[l][k] * q[k];
 			}
@@ -848,7 +840,7 @@ void NUMdominantEigenvector (double **mns, long n, double *q, double *lambda, do
 			q[k] = z[k] / znorm2;
 		}
 
-		val = cval; cval = 0;
+		val = cval; cval = 0.0;
 
 		for (long k = 1; k <= n; k++) {
 			for (long l = 1; l <= n; l++) {
@@ -865,7 +857,7 @@ void NUMprincipalComponents (double **a, long n, long nComponents, double **pc)
 	NUMeigensystem (a, n, evec.peek(), NULL);
 	for (long i = 1; i <= n; i++) {
 		for (long j = 1; j <= nComponents; j++) {
-			double s = 0;
+			double s = 0.0;
 			for (long k = 1; k <= n; k++) {
 				s += a[k][i] * evec[k][j]; /* times sqrt(eigenvalue) ?? */
 			}
@@ -882,7 +874,7 @@ void NUMdmatrix_into_principalComponents (double **m, long nrows, long ncols, lo
 	autoSVD svd = SVD_create_d (mc.peek(), nrows, ncols);
 	for (long i = 1; i <= nrows; i++) {
 		for (long j = 1; j <= numberOfComponents; j++) {
-			pc[i][j] = 0;
+			pc[i][j] = 0.0;
 			for (long k = 1; k <= ncols; k++) {
 				pc[i][j] += svd -> v[k][j] * m[i][k];
 			}
@@ -896,9 +888,9 @@ void NUMpseudoInverse (double **y, long nr, long nc, double **yinv, double toler
 	(void) SVD_zeroSmallSingularValues (me.peek(), tolerance);
 	for (long i = 1; i <= nc; i++) {
 		for (long j = 1; j <= nr; j++) {
-			double s = 0;
+			double s = 0.0;
 			for (long k = 1; k <= nc; k++) {
-				if (my d[k] != 0) {
+				if (my d[k] != 0.0) {
 					s += my v[i][k] * my u[j][k] / my d[k];
 				}
 			}
@@ -915,7 +907,7 @@ void NUMsolveEquation (double **a, long nr, long nc, double *b, double tolerance
 	double tol = tolerance > 0 ? tolerance : NUMfpp -> eps * nr;
 
 	if (nr <= 0 || nc <= 0) {
-		Melder_throw ("Negative dimensions");
+		Melder_throw (U"Negative dimensions");
 	}
 
 	autoSVD me = SVD_create_d (a, nr, nc);
@@ -928,7 +920,7 @@ void NUMsolveEquations (double **a, long nr, long nc, double **b, long ncb, doub
 	double tol = tolerance > 0 ? tolerance : NUMfpp -> eps * nr;
 
 	if (nr <= 0 || nc <= 0) {
-		Melder_throw ("Negative dimensions");
+		Melder_throw (U"Negative dimensions");
 	}
 
 	autoSVD me = SVD_create_d (a, nr, nc);
@@ -952,15 +944,14 @@ void NUMsolveEquations (double **a, long nr, long nc, double **b, long ncb, doub
 
 
 void NUMsolveNonNegativeLeastSquaresRegression (double **m, long nr, long nc, double *d, double tol, long itermax, double *b) {
-	double difsq, difsqp = 0;
+	double difsq, difsqp = 0.0;
 
 	for (long iter = 1; iter <= itermax; iter++) {
-		/*
-			Fix all weights except b[j]
-		*/
+
+		// Fix all weights except b[j]
 
 		for (long j = 1; j <= nc; j++) {
-			double mjr = 0, mjmj = 0;
+			double mjr = 0.0, mjmj = 0.0;
 			for (long i = 1; i <= nr; i++) {
 				double ri = d[i], mij = m[i][j];
 				for (long l = 1; l <= nc; l++) {
@@ -972,16 +963,14 @@ void NUMsolveNonNegativeLeastSquaresRegression (double **m, long nr, long nc, do
 				mjmj += mij * mij;
 			}
 			b[j] = mjr / mjmj;
-			if (b[j] < 0) {
-				b[j] = 0;
+			if (b[j] < 0.0) {
+				b[j] = 0.0;
 			}
 		}
 
-		/*
-			Calculate t(b) and compare with previous result.
-		*/
+		// Calculate t(b) and compare with previous result.
 
-		difsq = 0;
+		difsq = 0.0;
 		for (long i = 1; i <= nr; i++) {
 			double dmb = d[i];
 			for (long j = 1; j <= nc; j++) {
@@ -1007,7 +996,7 @@ struct nr_struct {
 
 static void nr_func (double x, double *f, double *df, void *data) {
 	struct nr_struct *me = (struct nr_struct *) data;
-	*f = *df = 0;
+	*f = *df = 0.0;
 	for (long i = 1; i <= 3; i++) {
 		double t1 = (my delta[i] - x);
 		double t2 = my y[i] / t1;
@@ -1051,21 +1040,21 @@ void NUMsolveConstrainedLSQuadraticRegression (double **o, const double d[], lon
 	char uplo = 'U';
 	(void) NUMlapack_dpotf2 (&uplo, &n3, &ftinv[1][1], &n3, &info);
 	if (info != 0) {
-		Melder_throw ("dpotf2 fails.");
+		Melder_throw (U"dpotf2 fails.");
 	}
-	ftinv[1][2] = ftinv[1][3] = ftinv[2][3] = 0;
+	ftinv[1][2] = ftinv[1][3] = ftinv[2][3] = 0.0;
 
 	// Construct G and its eigen-decomposition (eq. (4,5))
 	// Sort eigenvalues (& eigenvectors) ascending.
 
-	b[3][1] = b[1][3] = -0.5; b[2][2] = 1;
+	b[3][1] = b[1][3] = -0.5; b[2][2] = 1.0;
 
 	// G = F^-1 B (F')^-1 (eq. 4)
 
 	for (long i = 1; i <= 3; i++) {
 		for (long j = 1; j <= 3; j++) {
 			for (long k = 1; k <= 3; k++) {
-				if (ftinv[k][i] != 0) {
+				if (ftinv[k][i] != 0.0) {
 					for (long l = 1; l <= 3; l++) {
 						g[i][j] += ftinv[k][i] * b[k][l] * ftinv[l][j];
 					}
@@ -1085,7 +1074,7 @@ void NUMsolveConstrainedLSQuadraticRegression (double **o, const double d[], lon
 
 	for (long i = 1; i <= 3; i++) {
 		for (long j = 1; j <= 3; j++) {
-			if (ftinv[i][j] != 0) {
+			if (ftinv[i][j] != 0.0) {
 				for (long k = 1; k <= 3; k++) {
 					ftinvp[i][k] += ftinv[i][j] * p[3 + 1 - j][k]; /* is sorted desc. */
 				}
@@ -1128,8 +1117,7 @@ void NUMsolveConstrainedLSQuadraticRegression (double **o, const double d[], lon
 		t1 = y[1] / (delta[1] - delta[2]);
 		t3 = y[3] / (delta[3] - delta[2]);
 		w[1] = t1 * delta[1];
-		if ( (delta[2] < delta[3] &&
-		        (t2 = (t1 * t1 * delta[1] + t3 * t3 * delta[3])) < eps)) {
+		if ( (delta[2] < delta[3] && (t2 = (t1 * t1 * delta[1] + t3 * t3 * delta[3])) < eps)) {
 			w[2] = sqrt (- delta[2] * t2); /* +- */
 			w[3] = t3 * delta[3];
 			NUMsolveEquation (ptfinv.peek(), 3, 3, w.peek(), 1e-6, chi.peek());
@@ -1137,8 +1125,7 @@ void NUMsolveConstrainedLSQuadraticRegression (double **o, const double d[], lon
 			if (fabs (chi[3] / chi[1]) < eps) {
 				NUMsolveEquation (ptfinvc.peek(), 3, 3, w.peek(), 1e-6, chi.peek());
 			}
-		} else if ( ( (delta[2] < delta[3] + eps) || (delta[2] > delta[3] - eps))
-		            && fabs (y[3]) < eps) {
+		} else if (((delta[2] < delta[3] + eps) || (delta[2] > delta[3] - eps)) && fabs (y[3]) < eps) {
 			// choose one value for w[2] from an infinite number
 
 			w[2] = w[1];
@@ -1193,12 +1180,12 @@ void NUMsolveWeaklyConstrainedLinearRegression (double **f, long n, long m, doub
 	autoNUMvector<long> indx (1, m);
 
 	for (long j = 1; j <= m; j++) {
-		t[j] = 0;
+		t[j] = 0.0;
 	}
 
 	autoSVD svd = SVD_create_d (f, n, m);
 
-	if (alpha == 0) {
+	if (alpha == 0.0) {
 		SVD_solve (svd.peek(), phi, t);    // standard least squares
 	}
 
@@ -1244,7 +1231,7 @@ void NUMsolveWeaklyConstrainedLinearRegression (double **f, long n, long m, doub
 	me.x = x.peek();
 	me.c = c.peek();
 
-	double xqsq = 0;
+	double xqsq = 0.0;
 	for (long j = m - q + 1; j <= m; j++) {
 		xqsq += x[j] * x[j];
 	}
@@ -1255,7 +1242,7 @@ void NUMsolveWeaklyConstrainedLinearRegression (double **f, long n, long m, doub
 		r = m - q;
 		me.m = r;
 		nr2_func (c[m], &fm, &df, & me);
-		if (fm >= 0) { /* step 3.b1 */
+		if (fm >= 0.0) { /* step 3.b1 */
 			x[r + 1] = sqrt (fm);
 			for (long j = 1; j <= r; j++) {
 				x[j] /= c[j] - c[m];
@@ -1267,16 +1254,16 @@ void NUMsolveWeaklyConstrainedLinearRegression (double **f, long n, long m, doub
 			}
 			return;
 		}
-		/* else continue with r = m - q */
+		// else continue with r = m - q
 	}
 
 	// step 3a & 3b2, determine interval lower bound for Newton-Raphson root finder
 
-	double xCx = 0;
+	double xCx = 0.0;
 	for (long j = 1; j <= r; j++) {
 		xCx += x[j] * x[j] / c[j];
 	}
-	double b0, bmin = delta > 0 ? - xCx / delta : -2 * sqrt (alpha * xCx);
+	double b0, bmin = delta > 0.0 ? - xCx / delta : -2.0 * sqrt (alpha * xCx);
 	double eps = (c[m] - bmin) * tol;
 
 	// find the root of d(psi(b)/db in interval (bmin, c[m])
@@ -1290,8 +1277,8 @@ void NUMsolveWeaklyConstrainedLinearRegression (double **f, long n, long m, doub
 	}
 }
 
-void NUMProcrustes (double **x, double **y, long nPoints, long nDimensions, double **t, double *v, double *s) {
-	int orthogonal = v == 0 || s == 0; /* else similarity transform */
+void NUMProcrustes (double **x, double **y, long nPoints, long nDimensions, double **t, double v[], double *s) {
+	bool orthogonal = ! v || ! s; // else similarity transform
 
 	autoNUMmatrix<double> c (1, nDimensions, 1, nDimensions);
 	autoNUMmatrix<double> yc (1, nPoints, 1, nDimensions);
@@ -1319,20 +1306,20 @@ void NUMProcrustes (double **x, double **y, long nPoints, long nDimensions, doub
 	// 2. Decompose C by SVD:  C = PDQ' (SVD attribute is Q instead of Q'!)
 
 	autoSVD svd = SVD_create_d (c.peek(), nDimensions, nDimensions);
-	double trace = 0;
+	double trace = 0.0;
 	for (long i = 1; i <= nDimensions; i++) {
 		trace += svd -> d[i];
 	}
 
-	if (trace == 0) {
-		Melder_throw ("NUMProcrustes: degenerate configuration(s).");
+	if (trace == 0.0) {
+		Melder_throw (U"NUMProcrustes: degenerate configuration(s).");
 	}
 
 	// 3. T = QP'
 
 	for (long i = 1; i <= nDimensions; i++) {
 		for (long j = 1; j <= nDimensions; j++) {
-			t[i][j] = 0;
+			t[i][j] = 0.0;
 			for (long k = 1; k <= nDimensions; k++) {
 				t[i][j] += svd -> v[i][k] * svd -> u[j][k];
 			}
@@ -1361,13 +1348,13 @@ void NUMProcrustes (double **x, double **y, long nPoints, long nDimensions, doub
 
 		// tr X'J YT == tr xc' yt
 
-		double traceXtJYT = 0;
+		double traceXtJYT = 0.0;
 		for (long i = 1; i <= nDimensions; i++) {
 			for (long j = 1; j <= nPoints; j++) {
 				traceXtJYT += xc[j][i] * yt[j][i];
 			}
 		}
-		double traceYtJY = 0;
+		double traceYtJY = 0.0;
 		for (long i = 1; i <= nDimensions; i++) {
 			for (long j = 1; j <= nPoints; j++) {
 				traceYtJY += y[j][i] * yc[j][i];
@@ -1391,7 +1378,7 @@ void NUMProcrustes (double **x, double **y, long nPoints, long nDimensions, doub
 void NUMmspline (double knot[], long nKnots, long order, long i, double x, double *y) {
 	long jj, nSplines = nKnots - order;
 	if (nSplines <= 0) {
-		Melder_throw ("No splines.");
+		Melder_throw (U"No splines.");
 	}
 
 	// Find the interval where x is located.
@@ -1400,9 +1387,9 @@ void NUMmspline (double knot[], long nKnots, long order, long i, double x, doubl
 	// First and last 'order' knots are equal, i.e.,
 	// knot[1] = ... = knot[order] && knot[nKnots-order+1] = ... knot[nKnots].
 
-	*y = 0;
+	*y = 0.0;
 	if (i > nSplines || order < 1) {
-		Melder_throw ("Combination of order and index not correct.");
+		Melder_throw (U"Combination of order and index not correct.");
 	}
 	for (jj = order; jj <= nKnots - order + 1; jj++) {
 		if (x < knot[jj]) {
@@ -1429,7 +1416,7 @@ void NUMmspline (double knot[], long nKnots, long order, long i, double x, doubl
 		for (long j = i; j <= i + order - k; j++) {
 			double kj = knot[j], kjpk = knot[j + k];
 			if (kjpk > kj) {
-				m[j] = k * ( (x - kj) * m[j] + (kjpk - x) * m[j + 1]) / ( (k - 1) * (kjpk - kj));
+				m[j] = k * ((x - kj) * m[j] + (kjpk - x) * m[j + 1]) / ((k - 1) * (kjpk - kj));
 			}
 		}
 	}
@@ -1439,7 +1426,7 @@ void NUMmspline (double knot[], long nKnots, long order, long i, double x, doubl
 void NUMispline (double aknot[], long nKnots, long order, long i, double x, double *y) {
 	long j, orderp1 = order + 1;
 
-	*y = 0;
+	*y = 0.0;
 
 	for (j = orderp1; j <= nKnots - order; j++) {
 		if (x < aknot[j]) {
@@ -1451,7 +1438,7 @@ void NUMispline (double aknot[], long nKnots, long order, long i, double x, doub
 		return;
 	}
 	if (j > i + order || (j == nKnots - order && x == aknot[j])) {
-		*y = 1; return;
+		*y = 1.0; return;
 	}
 
 	// Equation 5 in Ramsay's article contains some errors!!!
@@ -1468,9 +1455,9 @@ void NUMispline (double aknot[], long nKnots, long order, long i, double x, doub
 }
 
 double NUMwilksLambda (double *lambda, long from, long to) {
-	double result = 1;
+	double result = 1.0;
 	for (long i = from; i <= to; i++) {
-		result /= (1 + lambda[i]);
+		result /= (1.0 + lambda[i]);
 	}
 	return result;
 }
@@ -1483,7 +1470,7 @@ double NUMfactln (int n) {
 	if (n <= 1) {
 		return 0;
 	}
-	return n > 100 ? NUMlnGamma (n + 1.0) : table[n] ? table[n] :
+	return n > 100 ? NUMlnGamma (n + 1.0) : table[n] != 0.0 ? table[n] :
 	       (table[n] = NUMlnGamma (n + 1.0));
 }
 
@@ -1505,7 +1492,7 @@ void NUMnrbis (void (*f) (double x, double *fx, double *dfx, void *closure), dou
 
 	if ( (fl > 0.0 && fh > 0.0) || (fl < 0.0 && fh < 0.0)) {
 		*root = NUMundefined;
-		Melder_throw (L"Root must be bracketed.");
+		Melder_throw (U"Root must be bracketed.");
 	}
 
 	if (fl < 0.0) {
@@ -1538,7 +1525,7 @@ void NUMnrbis (void (*f) (double x, double *fx, double *dfx, void *closure), dou
 				return;
 			}
 		}
-		tol = NUMfpp -> eps	* (*root == 0 ? 1 : fabs (*root));
+		tol = NUMfpp -> eps	* (*root == 0.0 ? 1.0 : fabs (*root));
 		if (fabs (dx) < tol) {
 			return;
 		}
@@ -1551,7 +1538,7 @@ void NUMnrbis (void (*f) (double x, double *fx, double *dfx, void *closure), dou
 			xh = *root;
 		}
 	}
-	Melder_warning (L"NUMnrbis: maximum number of iterations (", Melder_integer (itermax), L") exceeded.");
+	Melder_warning (U"NUMnrbis: maximum number of iterations (", itermax, U") exceeded.");
 }
 
 double NUMridders (double (*f) (double x, void *closure), double x1, double x2, void *closure) {
@@ -1576,8 +1563,8 @@ double NUMridders (double (*f) (double x, void *closure), double x1, double x2,
 	if (f2 == NUMundefined) {
 		return NUMundefined;
 	}
-	if ( (f1 < 0 && f2 < 0) || (f1 > 0 && f2 > 0)) {
-		Melder_warning (L"NUMridders: root must be bracketed.");
+	if ( (f1 < 0.0 && f2 < 0.0) || (f1 > 0.0 && f2 > 0.0)) {
+		Melder_warning (U"NUMridders: root must be bracketed.");
 		return NUMundefined;
 	}
 
@@ -1591,71 +1578,68 @@ double NUMridders (double (*f) (double x, void *closure), double x1, double x2,
 			return NUMundefined;
 		}
 
-		/*
-			New guess:
-			x4 = x3 + (x3 - x1) * sign(f1 - f2) * f3 / sqrt(f3^2 - f1*f2)
-		*/
+		// New guess: x4 = x3 + (x3 - x1) * sign(f1 - f2) * f3 / sqrt(f3^2 - f1*f2)
 
 		d = f3 * f3 - f1 * f2;
 		if (d < 0.0) {
-			Melder_warning (L"d < 0 in ridders (iter = ", Melder_integer (iter), L").");
+			Melder_warning (U"d < 0 in ridders (iter = ", iter, U").");
 			return NUMundefined;
 		}
 
 		if (d == 0.0) {
-			/* pb test added because f1 f2 f3 may be 1e-170 or so */
+			// pb test added because f1 f2 f3 may be 1e-170 or so
 			tol = NUMfpp -> eps * fabs (x3);
 			if (iter > 1 && fabs (x3 - root) < tol) {
 				return root;
 			}
 			root = x3;
-			/*
-			 * Perform bisection.
-			 */
-			if (f1 > 0.0) {
-				/* falling curve: f1 > 0, f2 < 0 */
+
+			// Perform bisection.
+
+			if (f1 > 0.0) { 
+				// falling curve: f1 > 0, f2 < 0 
 				if (f3 > 0.0) {
-					x1 = x3; f1 = f3;   /* retain invariant: f1 > 0, f2 < 0 */
+					x1 = x3; f1 = f3;   // retain invariant: f1 > 0, f2 < 0
 				} else {
-					/* f3 < 0.0 */
-					x2 = x3; f2 = f3;   /* retain invariant: f1 > 0, f2 < 0 */
+					// f3 <= 0.0
+					x2 = x3; f2 = f3;   // retain invariant: f1 > 0, f2 < 0
 				}
 			} else {
-				/* rising curve: f1 < 0, f2 > 0 */
+				// rising curve: f1 < 0, f2 > 0 
 				if (f3 > 0.0) {
-					x2 = x3; f2 = f3;   /* retain invariant: f1 < 0, f2 > 0 */
+					x2 = x3; f2 = f3;   // retain invariant: f1 < 0, f2 > 0
 				} else {
-					/* f3 < 0.0 */
-					x1 = x3; f1 = f3;   /* retain invariant: f1 < 0, f2 > 0 */
+					// f3 < 0.0
+					x1 = x3; f1 = f3;   // retain invariant: f1 < 0, f2 > 0
 				}
 			}
 		} else {
 			d = sqrt (d);
 			if (isnan (d)) {
-				/* pb: square root of denormalized small number fails on some computers */
+				// pb: square root of denormalized small number fails on some computers
 				tol = NUMfpp -> eps * fabs (x3);
 				if (iter > 1 && fabs (x3 - root) < tol) {
 					return root;
 				}
 				root = x3;
-				/*
-				 * Perform bisection.
-				 */
+
+				// Perform bisection.
+
 				if (f1 > 0.0) {
-					/* falling curve: f1 > 0, f2 < 0 */
+					// falling curve: f1 > 0, f2 < 0
 					if (f3 > 0.0) {
-						x1 = x3; f1 = f3;   /* retain invariant: f1 > 0, f2 < 0 */
+						x1 = x3; f1 = f3;   // retain invariant: f1 > 0, f2 < 0
 					} else {
-						/* f3 < 0.0 */
-						x2 = x3; f2 = f3;   /* retain invariant: f1 > 0, f2 < 0 */
+						// f3 <= 0.0
+						x2 = x3; f2 = f3;   // retain invariant: f1 > 0, f2 < 0
 					}
 				} else {
-					/* rising curve: f1 < 0, f2 > 0 */
+					// rising curve: f1 < 0, f2 > 0
 					if (f3 > 0.0) {
-						x2 = x3; f2 = f3;   /* retain invariant: f1 < 0, f2 > 0 */
+						x2 = x3; f2 = f3;   // retain invariant: f1 < 0, f2 > 0
 					} else {
-						/* f3 < 0.0 */
-						x1 = x3; f1 = f3;   /* retain invariant: f1 < 0, f2 > 0 */
+						// f3 < 0.0
+						x1 = x3; f1 = f3;   // retain invariant: f1 < 0, f2 > 0 */
 					}
 				}
 			} else {
@@ -1673,7 +1657,7 @@ double NUMridders (double (*f) (double x, void *closure), double x1, double x2,
 				if (f4 == NUMundefined) {
 					return NUMundefined;
 				}
-				if ( (f1 > f2) == (d > 0.0) /* pb: instead of x3 < x4 */) {
+				if ((f1 > f2) == (d > 0.0) /* pb: instead of x3 < x4 */) {
 					if (SIGN (f3, f4) != f3) {
 						x1 = x3; f1 = f3;
 						x2 = x4; f2 = f4;
@@ -1698,7 +1682,7 @@ double NUMridders (double (*f) (double x, void *closure), double x1, double x2,
 	{
 		static long nwarnings = 0;
 		nwarnings++;
-		Melder_warning (L"NUMridders: maximum number of iterations (", Melder_integer (itermax), L") exceeded.");
+		Melder_warning (U"NUMridders: maximum number of iterations (", itermax, U") exceeded.");
 	}
 	return root;
 }
@@ -1712,7 +1696,7 @@ double NUMlogNormalQ (double x, double zeta, double sigma) {
 }
 
 double NUMstudentP (double t, double df) {
-	if (df < 1) {
+	if (df < 1.0) {
 		return NUMundefined;
 	}
 	double ib = NUMincompleteBeta (0.5 * df, 0.5, df / (df + t * t));
@@ -1720,7 +1704,7 @@ double NUMstudentP (double t, double df) {
 		return NUMundefined;
 	}
 	ib *= 0.5;
-	return t < 0 ? ib : 1 - ib;
+	return t < 0.0 ? ib : 1.0 - ib;
 }
 
 double NUMstudentQ (double t, double df) {
@@ -1732,22 +1716,22 @@ double NUMstudentQ (double t, double df) {
 		return NUMundefined;
 	}
 	ib *= 0.5;
-	return t > 0 ? ib : 1 - ib;
+	return t > 0.0 ? ib : 1.0 - ib;
 }
 
 double NUMfisherP (double f, double df1, double df2) {
-	if (f < 0 || df1 < 1 || df2 < 1) {
+	if (f < 0.0 || df1 < 1.0 || df2 < 1.0) {
 		return NUMundefined;
 	}
 	double ib = NUMincompleteBeta (0.5 * df2, 0.5 * df1, df2 / (df2 + f * df1));
 	if (ib == NUMundefined) {
 		return NUMundefined;
 	}
-	return 1 - ib;
+	return 1.0 - ib;
 }
 
 double NUMfisherQ (double f, double df1, double df2) {
-	if (f < 0 || df1 < 1 || df2 < 1) {
+	if (f < 0.0 || df1 < 1.0 || df2 < 1.0) {
 		return NUMundefined;
 	}
 	if (Melder_debug == 28) {
@@ -1763,11 +1747,11 @@ double NUMfisherQ (double f, double df1, double df2) {
 
 double NUMinvGaussQ (double p) {
 	double pc = p;
-	if (p <= 0 || p >= 1.0) {
+	if (p <= 0.0 || p >= 1.0) {
 		return NUMundefined;
 	}
 	if (p > 0.5) {
-		pc = 1 - p;
+		pc = 1.0 - p;
 	}
 	double t = sqrt (- 2.0 * log (pc));
 	t -= (2.515517 + (0.802853 + 0.010328 * t) * t) /
@@ -1783,15 +1767,15 @@ static double studentQ_func (double x, void *voidParams) {
 
 double NUMinvStudentQ (double p, double df) {
 	struct pdf1_struct params;
-	double pc = p > 0.5 ? 1 - p : p, xmin, xmax = 1, x;
+	double pc = p > 0.5 ? 1.0 - p : p, xmin, xmax = 1.0, x;
 
-	if (p < 0 || p >= 1) {
+	if (p < 0.0 || p >= 1.0) {
 		return NUMundefined;
 	}
 
-	/*
-		Bracket the function f(x) = NUMstudentQ (x, df) - p.
-	*/
+
+	// Bracket the function f(x) = NUMstudentQ (x, df) - p.
+
 	for (;;) {
 		double q = NUMstudentQ (xmax, df);
 		if (q == NUMundefined) {
@@ -1800,14 +1784,13 @@ double NUMinvStudentQ (double p, double df) {
 		if (q < pc) {
 			break;
 		}
-		xmax *= 2;
+		xmax *= 2.0;
 	}
 
-	xmin = xmax > 1 ? xmax / 2 : 0;
+	xmin = xmax > 1.0 ? xmax / 2.0 : 0.0;
+
+	// Find zero of f(x) with Ridders' method.
 
-	/*
-		Find zero of f(x) with Ridders' method.
-	*/
 	params. df = df;
 	params. p = pc;
 	x = NUMridders (studentQ_func, xmin, xmax, & params);
@@ -1828,13 +1811,12 @@ double NUMinvChiSquareQ (double p, double df) {
 	struct pdf1_struct params;
 	double xmin, xmax = 1;
 
-	if (p < 0 || p >= 1) {
+	if (p < 0.0 || p >= 1.0) {
 		return NUMundefined;
 	}
 
-	/*
-		Bracket the function f(x) = NUMchiSquareQ (x, df) - p.
-	*/
+	// Bracket the function f(x) = NUMchiSquareQ (x, df) - p.
+
 	for (;;) {
 		double q = NUMchiSquareQ (xmax, df);
 		if (q == NUMundefined) {
@@ -1843,13 +1825,12 @@ double NUMinvChiSquareQ (double p, double df) {
 		if (q < p) {
 			break;
 		}
-		xmax *= 2;
+		xmax *= 2.0;
 	}
-	xmin = xmax > 1 ? xmax / 2 : 0;
+	xmin = xmax > 1.0 ? xmax / 2.0 : 0.0;
+
+	// Find zero of f(x) with Ridders' method.
 
-	/*
-		Find zero of f(x) with Ridders' method.
-	*/
 	params. df = df;
 	params. p = p;
 	return NUMridders (chiSquareQ_func, xmin, xmax, & params);
@@ -1862,7 +1843,7 @@ static double fisherQ_func (double x, void *voidParams) {
 }
 
 double NUMinvFisherQ (double p, double df1, double df2) {
-	if (p <= 0.0 || p > 1.0 || df1 < 1 || df2 < 1) {
+	if (p <= 0.0 || p > 1.0 || df1 < 1.0 || df2 < 1.0) {
 		return NUMundefined;
 	}
 	if (Melder_debug == 29) {
@@ -1908,12 +1889,12 @@ double NUMlnBeta (double a, double b) {
 
 double NUMnormalityTest_HenzeZirkler (double **data, long n, long p, double *beta, double *tnb, double *lnmu, double *lnvar) {
 	if (*beta <= 0) {
-		*beta = (1.0 / sqrt (2)) * pow ( (1.0 + 2 * p) / 4, 1.0 / (p + 4)) * pow (n, 1.0 / (p + 4));
+		*beta = (1.0 / sqrt (2.0)) * pow ((1.0 + 2 * p) / 4.0, 1.0 / (p + 4)) * pow (n, 1.0 / (p + 4));
 	}
 	double p2 = p / 2.0;
 	double beta2 = *beta * *beta, beta4 = beta2 * beta2, beta8 = beta4 * beta4;
-	double gamma = 1 + 2 * beta2, gamma2 = gamma * gamma, gamma4 = gamma2 * gamma2;
-	double delta = 1.0 + beta2 * (4 + 3 * beta2), delta2 = delta * delta;
+	double gamma = 1.0 + 2.0 * beta2, gamma2 = gamma * gamma, gamma4 = gamma2 * gamma2;
+	double delta = 1.0 + beta2 * (4.0 + 3.0 * beta2), delta2 = delta * delta;
 	double prob = NUMundefined;
 
 	*tnb = *lnmu = *lnvar = NUMundefined;
@@ -1932,8 +1913,8 @@ double NUMnormalityTest_HenzeZirkler (double **data, long n, long p, double *bet
 
 	try {
 		NUMlowerCholeskyInverse (covar.peek(), p, NULL);
-		double djk, djj, sumjk = 0, sumj = 0;
-		double b1 = beta2 / 2, b2 = b1 / (1.0 + beta2);
+		double djk, djj, sumjk = 0.0, sumj = 0.0;
+		double b1 = beta2 / 2.0, b2 = b1 / (1.0 + beta2);
 		/* Heinze & Wagner (1997), page 3
 			We use d[j][k] = ||Y[j]-Y[k]||^2 = (Y[j]-Y[k])'S^(-1)(Y[j]-Y[k])
 			So d[j][k]= d[k][j] and d[j][j] = 0
@@ -1941,22 +1922,22 @@ double NUMnormalityTest_HenzeZirkler (double **data, long n, long p, double *bet
 		for (long j = 1; j <= n; j++) {
 			for (long k = 1; k < j; k++) {
 				djk = NUMmahalanobisDistance_chi (covar.peek(), x[j], x[k], p, p);
-				sumjk += 2 * exp (-b1 * djk); // factor 2 because d[j][k] == d[k][j]
+				sumjk += 2.0 * exp (-b1 * djk); // factor 2 because d[j][k] == d[k][j]
 			}
-			sumjk += 1; // for k == j
+			sumjk += 1.0; // for k == j
 			djj = NUMmahalanobisDistance_chi (covar.peek(), x[j], zero.peek(), p, p);
 			sumj += exp (-b2 * djj);
 		}
 		*tnb = (1.0 / n) * sumjk - 2.0 * pow (1.0 + beta2, - p2) * sumj + n * pow (gamma, - p2); // n *
 	} catch (MelderError) {
 		Melder_clearError ();
-		*tnb = 4 * n;
+		*tnb = 4.0 * n;
 	}
 
-	double mu = 1.0 - pow (gamma, -p2) * (1.0 + p * beta2 / gamma + p * (p + 2) * beta4 / (2 * gamma2));
-	double var = 2.0 * pow (1 + 4 * beta2, -p2)
-	             + 2.0 * pow (gamma,  -p) * (1.0 + 2 * p * beta4 / gamma2  + 3 * p * (p + 2) * beta8 / (4 * gamma4))
-	             - 4.0 * pow (delta, -p2) * (1.0 + 3 * p * beta4 / (2 * delta) + p * (p + 2) * beta8 / (2 * delta2));
+	double mu = 1.0 - pow (gamma, -p2) * (1.0 + p * beta2 / gamma + p * (p + 2) * beta4 / (2.0 * gamma2));
+	double var = 2.0 * pow (1.0 + 4.0 * beta2, -p2)
+	     + 2.0 * pow (gamma,  -p) * (1.0 + 2.0 * p * beta4 / gamma2  + 3.0 * p * (p + 2) * beta8 / (4.0 * gamma4))
+	     - 4.0 * pow (delta, -p2) * (1.0 + 3.0 * p * beta4 / (2.0 * delta) + p * (p + 2) * beta8 / (2.0 * delta2));
 	double mu2 = mu * mu;
 	*lnmu = log (sqrt (mu2 * mu2 / (mu2 + var)));
 	*lnvar = sqrt (log ( (mu2 + var) / mu2));
@@ -1967,45 +1948,45 @@ double NUMnormalityTest_HenzeZirkler (double **data, long n, long p, double *bet
 /*************** Hz <--> other freq reps *********************/
 
 double NUMmelToHertz3 (double mel) {
-	if (mel < 0) {
+	if (mel < 0.0) {
 		return NUMundefined;
 	}
-	return mel < 1000 ? mel : 1000 * (exp (mel * log10 (2) / 1000) - 1);
+	return mel < 1000.0 ? mel : 1000.0 * (exp (mel * log10 (2.0) / 1000.0) - 1.0);
 }
 
 double NUMhertzToMel3 (double hz) {
-	if (hz < 0) {
+	if (hz < 0.0) {
 		return NUMundefined;
 	}
-	return hz < 1000 ? hz : 1000 * log10 (1 + hz / 1000) / log10 (2);
+	return hz < 1000.0 ? hz : 1000.0 * log10 (1.0 + hz / 1000.0) / log10 (2.0);
 }
 
 double NUMmelToHertz2 (double mel) {
-	if (mel < 0) {
+	if (mel < 0.0) {
 		return NUMundefined;
 	}
-	return 700 * (pow (10.0, mel / 2595.0) - 1);
+	return 700.0 * (pow (10.0, mel / 2595.0) - 1.0);
 }
 
 double NUMhertzToMel2 (double hz) {
-	if (hz < 0) {
+	if (hz < 0.0) {
 		return NUMundefined;
 	}
-	return 2595 * log10 (1 + hz / 700);
+	return 2595.0 * log10 (1.0 + hz / 700.0);
 }
 
 double NUMhertzToBark_traunmueller (double hz) {
-	if (hz < 0) {
+	if (hz < 0.0) {
 		return NUMundefined;
 	}
-	return 26.81 * hz / (1960 + hz) - 0.53;
+	return 26.81 * hz / (1960.0 + hz) - 0.53;
 }
 
 double NUMbarkToHertz_traunmueller (double bark) {
-	if (bark < 0 || bark > 26.28) {
+	if (bark < 0.0 || bark > 26.28) {
 		return NUMundefined;
 	}
-	return 1960 * (bark + 0.53) / (26.28 - bark);
+	return 1960.0 * (bark + 0.53) / (26.28 - bark);
 }
 
 double NUMbarkToHertz_schroeder (double bark) {
@@ -2013,23 +1994,22 @@ double NUMbarkToHertz_schroeder (double bark) {
 }
 
 double NUMbarkToHertz_zwickerterhardt (double hz) {
-	if (hz < 0) {
+	if (hz < 0.0) {
 		return NUMundefined;
 	}
-	return 13 * atan (0.00076 * hz) + 3.5 * atan (hz / 7500);
+	return 13.0 * atan (0.00076 * hz) + 3.5 * atan (hz / 7500.0);
 }
 
 double NUMhertzToBark_schroeder (double hz) {
-	double h650;
-	if (hz < 0) {
+	if (hz < 0.0) {
 		return NUMundefined;
 	}
-	h650 = hz / 650;
-	return 7.0 * log (h650 + sqrt (1 + h650 * h650));
+	double h650 = hz / 650.0;
+	return 7.0 * log (h650 + sqrt (1.0 + h650 * h650));
 }
 
 double NUMbarkToHertz2 (double bark) {
-	if (bark < 0) {
+	if (bark < 0.0) {
 		return NUMundefined;
 	}
 	return 650.0 * sinh (bark / 7.0);
@@ -2039,22 +2019,22 @@ double NUMhertzToBark2 (double hz) {
 	if (hz < 0) {
 		return NUMundefined;
 	}
-	double h650 = hz / 650;
-	return 7.0 * log (h650 + sqrt (1 + h650 * h650));
+	double h650 = hz / 650.0;
+	return 7.0 * log (h650 + sqrt (1.0 + h650 * h650));
 }
 
 double NUMbladonlindblomfilter_amplitude (double zc, double z) {
 	double dz = zc - z + 0.474;
-	return pow (10, 1.581 + 0.75 * dz - 1.75 * sqrt (1 + dz * dz));
+	return pow (10.0, 1.581 + 0.75 * dz - 1.75 * sqrt (1.0 + dz * dz));
 }
 
 double NUMsekeyhansonfilter_amplitude (double zc, double z) {
 	double dz = zc - z - 0.215;
-	return pow (10, 0.7 - 0.75 * dz - 1.75 * sqrt (0.196 + dz * dz));
+	return pow (10.0, 0.7 - 0.75 * dz - 1.75 * sqrt (0.196 + dz * dz));
 }
 
 double NUMtriangularfilter_amplitude (double fl, double fc, double fh, double f) {
-	double a = 0;
+	double a = 0.0;
 	if (f > fl && f < fh) {
 		a = f < fc ? (f - fl) / (fc - fl) : (fh - f) / (fh - fc);
 
@@ -2079,7 +2059,7 @@ for (i=1; i<=n+n+n; i++) work[i]=0;
 */
 int NUMburg (double x[], long n, double a[], int m, double *xms) {
 	for (long j = 1; j <= m; j++) {
-		a[j] = 0;
+		a[j] = 0.0;
 	}
 
 	autoNUMvector<double> b1 (1, n);
@@ -2094,7 +2074,7 @@ int NUMburg (double x[], long n, double a[], int m, double *xms) {
 	}
 
 	*xms = p / n;
-	if (*xms <= 0) {
+	if (*xms <= 0.0) {
 		return 0;    // warning empty
 	}
 
@@ -2115,7 +2095,7 @@ int NUMburg (double x[], long n, double a[], int m, double *xms) {
 			denum += b1[j] * b1[j] + b2[j] * b2[j];
 		}
 
-		if (denum <= 0) {
+		if (denum <= 0.0) {
 			return 0;    // warning ill-conditioned
 		}
 
@@ -2148,7 +2128,7 @@ int NUMburg (double x[], long n, double a[], int m, double *xms) {
 }
 
 void NUMdmatrix_to_dBs (double **m, long rb, long re, long cb, long ce, double ref, double factor, double floor) {
-	double ref_db, factor10 = factor * 10;
+	double ref_db, factor10 = factor * 10.0;
 	double max = m[rb][cb], min = max;
 
 	Melder_assert (ref > 0 && factor > 0 && rb <= re && cb <= ce);
@@ -2164,14 +2144,14 @@ void NUMdmatrix_to_dBs (double **m, long rb, long re, long cb, long ce, double r
 	}
 
 	if (max < 0 || min < 0) {
-		Melder_throw ("NUMdmatrix_to_dBs: all matrix elements must be positive.");
+		Melder_throw (U"NUMdmatrix_to_dBs: all matrix elements must be positive.");
 	}
 	ref_db = factor10 * log10 (ref);
 
 	for (long i = rb; i <= re; i++) {
 		for (long j = cb; j <= ce; j++) {
 			double mij = floor;
-			if (m[i][j] > 0) {
+			if (m[i][j] > 0.0) {
 				mij = factor10 * log10 (m[i][j]) - ref_db;
 				if (mij < floor) {
 					mij = floor;
@@ -2194,8 +2174,7 @@ double **NUMcosinesTable (long first, long last, long npoints) {
 	return m.transfer();
 }
 
-void NUMspline (double x[], double y[], long n, double yp1, double ypn,
-                double y2[]) {
+void NUMspline (double x[], double y[], long n, double yp1, double ypn, double y2[]) {
 	autoNUMvector<double> u (1, n - 1);
 
 	if (yp1 > 0.99e30) {
@@ -2239,7 +2218,7 @@ void NUMsplint (double xa[], double ya[], double y2a[], long n, double x, double
 	}
 	double h = xa[khi] - xa[klo];
 	if (h == 0.0) {
-		Melder_throw ("NUMsplint: bad input value.");
+		Melder_throw (U"NUMsplint: bad input value.");
 	}
 	double a = (xa[khi] - x) / h;
 	double b = (x - xa[klo]) / h;
@@ -2266,7 +2245,7 @@ int NUMdoLineSegmentsIntersect (double x1, double y1, double x2, double y2, doub
 	int o12 = NUMgetOrientationOfPoints (x1, y1, x2, y2, x4, y4);
 	int o21 = NUMgetOrientationOfPoints (x3, y3, x4, y4, x1, y1);
 	int o22 = NUMgetOrientationOfPoints (x3, y3, x4, y4, x2, y2);
-	return ( (o11 * o12 < 0) && (o21 * o22 < 0)) || (o11 *o12 *o21 *o22 == 0);
+	return ((o11 * o12 < 0) && (o21 * o22 < 0)) || (o11 *o12 *o21 *o22 == 0);
 }
 
 int NUMgetOrientationOfPoints (double x1, double y1, double x2, double y2, double x3, double y3) {
@@ -2278,9 +2257,9 @@ int NUMgetOrientationOfPoints (double x1, double y1, double x2, double y2, doubl
 	} else if (dx2 * dy3 < dy2 * dx3) {
 		orientation = -1;
 	} else {
-		if ( (dx2 * dx3 < 0) || (dy2 * dy3 < 0)) {
+		if ((dx2 * dx3 < 0) || (dy2 * dy3 < 0)) {
 			orientation = -1;
-		} else if ( (dx2 * dx2 + dy2 * dy2) >= (dx3 * dx3 + dy3 * dy3)) {
+		} else if ((dx2 * dx2 + dy2 * dy2) >= (dx3 * dx3 + dy3 * dy3)) {
 			orientation = 0;
 		} else {
 			orientation = 1;
@@ -2329,7 +2308,7 @@ int NUMgetIntersectionsWithRectangle (double x1, double y1, double x2, double y2
 	for (long i = 1; i <= 4; i++) {
 		double denom = (x[i + 1] - x[i]) * (y2 - y1) - (y[i + 1] - y[i]) * (x2 - x1);
 		double s, t, x3, y3;
-		if (denom == 0) {
+		if (denom == 0.0) {
 			continue;
 		}
 		/* We have an intersection. */
@@ -2351,7 +2330,7 @@ int NUMgetIntersectionsWithRectangle (double x1, double y1, double x2, double y2
 		}
 		ni++;
 		if (ni > 2) {
-			Melder_throw ("Too many intersections.");
+			Melder_throw (U"Too many intersections.");
 		}
 		xi[ni] = x3;
 		yi[ni] = y3;
@@ -2490,7 +2469,7 @@ bool NUMclipLineWithinRectangle (double xl1, double yl1, double xl2, double yl2,
 		}
 		*xo1 = xc[1]; *yo1 = yc[1]; *xo2 = xc[2]; *yo2 = yc[2];
 	} else {
-		Melder_throw ("Too many crossings found.");
+		Melder_throw (U"Too many crossings found.");
 	}
 	return true;
 }
@@ -2500,16 +2479,14 @@ void NUMgetEllipseBoundingBox (double a, double b, double cospsi, double *width,
 	Melder_assert (cospsi >= -1 && cospsi <= 1);
 
 	if (cospsi == 1) {
-		/*
-			a-axis along x-axis
-		*/
+
+		// a-axis along x-axis
 
 		*width = a;
 		*height = b;
 	} else if (cospsi == 0) {
-		/*
-			a-axis along y-axis
-		*/
+
+		// a-axis along y-axis
 
 		*width = b;
 		*height = a;
@@ -2525,8 +2502,7 @@ void NUMgetEllipseBoundingBox (double a, double b, double cospsi, double *width,
 /*
 Closely modelled after the netlib code by Oleg Keselyov.
 */
-double NUMminimize_brent (double (*f) (double x, void *closure), double a, double b,
-                          void *closure, double tol, double *fx) {
+double NUMminimize_brent (double (*f) (double x, void *closure), double a, double b, void *closure, double tol, double *fx) {
 	double x, v, fv, w, fw;
 	const double golden = 1 - NUM_goldenSection;
 	const double sqrt_epsilon = sqrt (NUMfpp -> eps);
@@ -2543,22 +2519,19 @@ double NUMminimize_brent (double (*f) (double x, void *closure), double a, doubl
 
 	for (long iter = 1; iter <= itermax; iter++) {
 		double range = b - a;
-		double middle_range = (a + b) / 2;
-		double tol_act = sqrt_epsilon * fabs (x) + tol / 3;
+		double middle_range = (a + b) / 2.0;
+		double tol_act = sqrt_epsilon * fabs (x) + tol / 3.0;
 		double new_step; /* Step at this iteration */
 
-
-
-		if (fabs (x - middle_range) + range / 2 <= 2 * tol_act) {
+		if (fabs (x - middle_range) + range / 2.0 <= 2.0 * tol_act) {
 			return x;
 		}
 
-		/* Obtain the golden section step */
+		// Obtain the golden section step
 
 		new_step = golden * (x < middle_range ? b - x : a - x);
 
-
-		/* Decide if the parabolic interpolation can be tried	*/
+		// Decide if the parabolic interpolation can be tried
 
 		if (fabs (x - w) >= tol_act) {
 			/*
@@ -2566,14 +2539,12 @@ double NUMminimize_brent (double (*f) (double x, void *closure), double a, doubl
 				division operation is delayed until last moment.
 			*/
 
-			double p, q, t;
-
-			t = (x - w) * (*fx - fv);
-			q = (x - v) * (*fx - fw);
-			p = (x - v) * q - (x - w) * t;
-			q = 2 * (q - t);
+			double t = (x - w) * (*fx - fv);
+			double q = (x - v) * (*fx - fw);
+			double p = (x - v) * q - (x - w) * t;
+			q = 2.0 * (q - t);
 
-			if (q > 0) {
+			if (q > 0.0) {
 				p = -p;
 			} else {
 				q = -q;
@@ -2587,22 +2558,22 @@ double NUMminimize_brent (double (*f) (double x, void *closure), double a, doubl
 			*/
 
 			if (fabs (p) < fabs (new_step * q) &&
-			        p > q * (a - x + 2 * tol_act) &&
-			        p < q * (b - x - 2 * tol_act)) {
+			        p > q * (a - x + 2.0 * tol_act) &&
+			        p < q * (b - x - 2.0 * tol_act)) {
 				new_step = p / q;
 			}
 		}
 
-		/* Adjust the step to be not less than tolerance. */
+		// Adjust the step to be not less than tolerance.
 
 		if (fabs (new_step) < tol_act) {
-			new_step = new_step > 0 ? tol_act : - tol_act;
+			new_step = new_step > 0.0 ? tol_act : - tol_act;
 		}
 
-		/* Obtain the next approximation to min	and reduce the enveloping range */
+		// Obtain the next approximation to min	and reduce the enveloping range
 
 		{
-			double t = x + new_step;	/* Tentative point for the min	*/
+			double t = x + new_step;	// Tentative point for the min
 			double ft = (*f) (t, closure);
 
 			/*
@@ -2637,7 +2608,7 @@ double NUMminimize_brent (double (*f) (double x, void *closure), double a, doubl
 			}
 		}
 	}
-	Melder_warning (L"NUMminimize_brent: maximum number of iterations (", Melder_integer (itermax), L") exceeded.");
+	Melder_warning (U"NUMminimize_brent: maximum number of iterations (", itermax, U") exceeded.");
 	return x;
 }
 
@@ -2702,18 +2673,18 @@ void NUMlineFit_theil (double *x, double *y, long numberOfPoints, double *m, dou
 			*intercept = NUMquantile (numberOfPoints, mbs.peek(), 0.5);
 		}
 	} catch (MelderError) {
-		Melder_throw ("No line fit (Theil's method)");
+		Melder_throw (U"No line fit (Theil's method)");
 	}
 }
 
 void NUMlineFit_LS (double *x, double *y, long numberOfPoints, double *m, double *intercept) {
-	double sx = 0, sy = 0;
+	double sx = 0.0, sy = 0.0;
 	for (long i = 1; i <= numberOfPoints; i++) {
 		sx += x[i];
 		sy += y[i];
 	}
 	double xmean = sx / numberOfPoints;
-	double st2 = 0, a = 0;
+	double st2 = 0.0, a = 0.0;
 	for (long i = 1; i <= numberOfPoints; i++) {
 		double t = x[i] - xmean;
 		st2 += t * t;
@@ -2743,7 +2714,7 @@ void NUMlpc_lpc_to_rc (double *lpc, long p, double *rc) {
 	for (long m = p; m > 0; m--) {
 		rc[m] = a[m];
 		if (fabs (rc[m]) > 1) {
-			Melder_throw ("Relection coefficient [", Melder_integer(m), "] larger 1.");
+			Melder_throw (U"Relection coefficient [", m, U"] larger than 1.");
 		}
 		for (long i = 1; i < m; i++) {
 			b[i] = a[i];
@@ -2794,7 +2765,7 @@ void NUMlpc_lpc_to_rc2 (double *lpc, long m, double *rc) { // klopt nog niet
 		long jb = m + 1 - j;
 		long mh = (jb + 1) / 2;
 		double rct = rc[jb+1];
-		double d = 1 - rct * rct;
+		double d = 1.0 - rct * rct;
 		for (long k = 1; k <= mh; k++) {
 			rc[k] *= (1 - rct) / d;
 		}
@@ -2804,7 +2775,7 @@ void NUMlpc_lpc_to_rc2 (double *lpc, long m, double *rc) { // klopt nog niet
 void NUMlpc_rc_to_area (double *rc, long m, double *area) {
 	area[m+1] = 0.0001; /* 1.0 cm^2 */
 	for (long j = 1; j <= m; j++) {
-		double ar = (1 - rc[m+1-j]) / (1 + rc[m+1-j]);
+		double ar = (1.0 - rc[m+1-j]) / (1.0 + rc[m+1-j]);
 		area[m+1-j] = area[m+2-j] / ar;
 	}
 }
@@ -2813,7 +2784,7 @@ void NUMlpc_rc_to_area (double *rc, long m, double *area) {
 void NUMlpc_area_to_rc (double *area, long m, double *rc) {
 	for (long j = 1; j <= m - 1; j++) {
 		double ar = area[j+1] / area[j];
-		rc[j] = (1 - ar) / (1 + ar);
+		rc[j] = (1.0 - ar) / (1.0 + ar);
 	}
 }
 
@@ -2873,7 +2844,7 @@ inline static double Stirling (double y1)
 // djmw 20121211 replaced calls to gsl_rng_uniform with NUMrandomUniform (0,1)
 
 long NUMrandomBinomial (double p, long n) {
-	if (p < 0 || p > 1 || n < 0) {
+	if (p < 0.0 || p > 1.0 || n < 0) {
 		return -100000000;
 	}
 	long ix;                       /* return value */
@@ -2887,7 +2858,7 @@ long NUMrandomBinomial (double p, long n) {
 		flipped = 1;
 	}
 
-	double q = 1 - p;
+	double q = 1.0 - p;
 	double s = p / q;
 	double np = n * p;
 
@@ -2906,7 +2877,7 @@ long NUMrandomBinomial (double p, long n) {
 			*/
 
 			double f = f0;
-			double u = NUMrandomUniform (0, 1); //djmw gsl_rng_uniform (rng);
+			double u = NUMrandomUniform (0.0, 1.0); //djmw gsl_rng_uniform (rng);
 
 			for (ix = 0; ix <= BINV_CUTOFF; ++ix) {
 				if (u < f) {
@@ -2914,7 +2885,7 @@ long NUMrandomBinomial (double p, long n) {
 				}
 				u -= f;
 				/* Use recursion f(x+1) = f(x)*[(n-x)/(x+1)]*[p/(1-p)] */
-				f *= s * (n - ix) / (ix + 1);
+				f *= s * (n - ix) / (ix + 1.0);
 			}
 
 			/* It should be the case that the 'goto Finish' was encountered
@@ -2982,8 +2953,8 @@ long NUMrandomBinomial (double p, long n) {
 TryAgain:
 
 		/* generate random variates, u specifies which region: Tri, Par, Tail */
-		u = p4 * NUMrandomUniform (0, 1); // djmw gsl_rng_uniform (rng) * p4;
-		v = NUMrandomUniform (0, 1); // djmw gsl_rng_uniform (rng);
+		u = p4 * NUMrandomUniform (0.0, 1.0); // djmw gsl_rng_uniform (rng) * p4;
+		v = NUMrandomUniform (0.0, 1.0); // djmw gsl_rng_uniform (rng);
 
 		if (u <= p1) {
 			/* Triangular region */
@@ -3033,7 +3004,7 @@ TryAgain:
 
 		/* More efficient determination of whether v < f(x)/f(M) */
 
-		long k = abs (ix - m);
+		long k = labs (ix - m);
 
 		if (k <= FAR_FROM_MEAN) {
 			/*
@@ -3130,4 +3101,4 @@ Finish:
   	return (flipped) ? (n - ix) : ix;
 }
 
-/* End of file NUM2.c */
+/* End of file NUM2.cpp */
diff --git a/dwsys/NUM2.h b/dwsys/NUM2.h
index 9387706..af11154 100644
--- a/dwsys/NUM2.h
+++ b/dwsys/NUM2.h
@@ -38,9 +38,9 @@ int NUMstrcmp (const char *s1, const char *s2);
 		(s2 == NULL ? 1 : strcmp (s1, s2));
 */
 
-int NUMstring_containsPrintableCharacter (const wchar_t *s);
-void NUMstring_chopWhiteSpaceAtExtremes_inline (wchar_t *string);
-double *NUMstring_to_numbers (const wchar_t *s, long *numbers_found);
+int NUMstring_containsPrintableCharacter (const char32 *s);
+void NUMstring_chopWhiteSpaceAtExtremes_inline (char32 *string);
+double *NUMstring_to_numbers (const char32 *s, long *numbers_found);
 /* return array with the number of numbers found */
 
 /*
@@ -48,14 +48,14 @@ double *NUMstring_to_numbers (const wchar_t *s, long *numbers_found);
  * 1, 4, 2, 3, 4, 5, 6, 7, 4, 3, 3, 4, 5, 4, 3, 2
  * Overlap is allowed. Ranges can go up and down.
  */
-long *NUMstring_getElementsOfRanges (const wchar_t *ranges, long maximumElement, long *numberOfElements, long *numberOfMultiples, const wchar_t *elementType, bool sortedUniques);
+long *NUMstring_getElementsOfRanges (const char32 *ranges, long maximumElement, long *numberOfElements, long *numberOfMultiples, const char32 *elementType, bool sortedUniques);
 
-wchar_t * NUMstring_timeNoDot (double time);
-int NUMstrings_equal (const wchar_t **s1, const wchar_t **s2, long lo, long hi);
-void NUMstrings_copyElements (wchar_t **from, wchar_t**to, long lo, long hi);
-void NUMstrings_free (wchar_t **s, long lo, long hi);
-int NUMstrings_setSequentialNumbering (wchar_t **s, long lo, long hi,
-	const wchar_t *precursor, long number, long increment, int asArray);
+char32 * NUMstring_timeNoDot (double time);
+int NUMstrings_equal (const char32 **s1, const char32 **s2, long lo, long hi);
+void NUMstrings_copyElements (char32 **from, char32**to, long lo, long hi);
+void NUMstrings_free (char32 **s, long lo, long hi);
+int NUMstrings_setSequentialNumbering (char32 **s, long lo, long hi,
+	const char32 *precursor, long number, long increment, int asArray);
 /*
 	Set s[lo]   = precursor<number>
 	    s[lo+1] = precursor<number+1>
@@ -63,21 +63,21 @@ int NUMstrings_setSequentialNumbering (wchar_t **s, long lo, long hi,
 		s[hi]   = precursor<number+hi-lo>
 */
 
-wchar_t **NUMstrings_copy (wchar_t **from, long lo, long hi);
+char32 **NUMstrings_copy (char32 **from, long lo, long hi);
 
-regexp *NUMregexp_compile (const wchar_t *regexp);
+regexp *NUMregexp_compile (const char32 *regexp);
 /* Compiles a regular expression to a datastructure used by the regexp engine */
 
 
-wchar_t *strstr_regexp (const wchar_t *string, const wchar_t *search_regexp);
+char32 *strstr_regexp (const char32 *string, const char32 *search_regexp);
 /*
 	Returns a pointer to the first occurrence in 'string' of the
 	regular expression 'searchRE'. It returns a null pointer if
 	no match is found.
 */
 
-wchar_t **strs_replace (wchar_t **from, long lo, long hi, const wchar_t *search,
-	const wchar_t *replace, int maximumNumberOfReplaces, long *nmatches,
+char32 **strs_replace (char32 **from, long lo, long hi, const char32 *search,
+	const char32 *replace, int maximumNumberOfReplaces, long *nmatches,
 	long *nstringmatches, int use_regexp);
 /*
 	Searches and replaces in string array of strings.
@@ -92,15 +92,15 @@ wchar_t **strs_replace (wchar_t **from, long lo, long hi, const wchar_t *search,
 	'nstringmatches'.
 */
 
-wchar_t *str_replace_literal (const wchar_t *string, const wchar_t *search,
-	const wchar_t *replace, long maximumNumberOfReplaces, long *nmatches);
+char32 *str_replace_literal (const char32 *string, const char32 *search,
+	const char32 *replace, long maximumNumberOfReplaces, long *nmatches);
 /*
 	Search and replace in 'string'.
 	The maximum number of replaces is limited by 'maximumNumberOfReplaces'.
 */
 
-wchar_t *str_replace_regexp (const wchar_t *string, regexp *search_compiled,
-	const wchar_t *replace_regexp, long maximumNumberOfReplaces, long *nmatches);
+char32 *str_replace_regexp (const char32 *string, regexp *search_compiled,
+	const char32 *replace_regexp, long maximumNumberOfReplaces, long *nmatches);
 /*
 	Searches and replaces 'maximumNumberOfReplaces' times in 'string' on
 	the basis of regular expressions (RE).
@@ -113,7 +113,7 @@ wchar_t *str_replace_regexp (const wchar_t *string, regexp *search_compiled,
 */
 
 
-void NUMdmatrix_printMatlabForm (double **m, long nr, long nc, const wchar_t *name);
+void NUMdmatrix_printMatlabForm (double **m, long nr, long nc, const char32 *name);
 /*
 	Print a matrix in a form that can be used as input for octave/matlab.
 	                      1 2 3
@@ -385,9 +385,8 @@ void NUMsort2 (long n, T1 *a, T2 *b) {
     }
 }
 
-void NUMindexx_f (const float a[], long n, long indx[]);
 void NUMindexx (const double a[], long n, long indx[]);
-void NUMindexx_s (wchar_t *a[], long n, long indx[]);
+void NUMindexx_s (char32 *a[], long n, long indx[]);
 /*
 	Indexes the array a[1..n], i.e., outputs the array indx[1..n] such that
 	a[ indx[i] ] is in ascending order for i=1..n;
@@ -680,7 +679,7 @@ void NUMsolveWeaklyConstrainedLinearRegression (double **f, long n, long m, doub
 */
 
 void NUMProcrustes (double **x, double **y, long nPoints,
-	long nDimensions, double **t, double *v, double *s);
+	long nDimensions, double **t, double v[], double *s);
 /*
 	Given two configurations x and y (nPoints x nDimensions), find the
 	the Procrustes rotation/reflection matrix T, the translation vector v and the scaling
@@ -1118,8 +1117,6 @@ void NUMfft_Table_init (NUMfft_Table table, long n);
 	n : data size
 */
 
-#ifdef __cplusplus
-
 struct autoNUMfft_Table : public structNUMfft_Table {
         autoNUMfft_Table () throw () {
                 n = 0;
@@ -1132,8 +1129,6 @@ struct autoNUMfft_Table : public structNUMfft_Table {
         }
 };
 
-#endif
-
 void NUMfft_forward_f (NUMfft_Table_f table, float *data);
 void NUMfft_forward (NUMfft_Table table, double *data);
 /*
diff --git a/dwsys/NUMcblas.cpp b/dwsys/NUMcblas.cpp
index 9ce8550..d8b0517 100644
--- a/dwsys/NUMcblas.cpp
+++ b/dwsys/NUMcblas.cpp
@@ -292,7 +292,7 @@ int NUMblas_dgemm (const char *transa, const char *transb, long *m, long *n, lon
 		return 0;
 	}
 	/* Quick return if possible. */
-	if (*m == 0 || *n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) {
+	if (*m == 0 || *n == 0 || ((*alpha == 0. || *k == 0) && *beta == 1.)) {
 		return 0;
 	}
 	/* And if alpha.eq.zero. */
@@ -563,7 +563,7 @@ int NUMblas_dgemv (const char *trans, long *m, long *n, double *alpha, double *a
 		return 0;
 	}
 	/* Quick return if possible. */
-	if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) {
+	if (*m == 0 || *n == 0 || (*alpha == 0. && *beta == 1.)) {
 		return 0;
 	}
 	/* Set LENX and LENY, the lengths of the vectors x and y, and set up the
@@ -1110,7 +1110,7 @@ L10:
 			}
 
 		} else if (ngpmin == gpmin && ngnmin == gnmin) {
-			if ( (i__1 = ngpmin - ngnmin, abs (i__1)) == 1) {
+			if ( (i__1 = ngpmin - ngnmin, labs (i__1)) == 1) {
 				lemin = MAX (ngpmin, ngnmin);
 				/* ( Twos-complement machines, no gradual underflow; e.g.,
 				   CYBER 205 ) */
@@ -1120,7 +1120,7 @@ L10:
 				iwarn = TRUE;
 			}
 
-		} else if ( (i__1 = ngpmin - ngnmin, abs (i__1)) == 1 && gpmin == gnmin) {
+		} else if ( (i__1 = ngpmin - ngnmin, labs (i__1)) == 1 && gpmin == gnmin) {
 			if (gpmin - MIN (ngpmin, ngnmin) == 3) {
 				lemin = MAX (ngpmin, ngnmin) - 1 + lt;
 				/* ( Twos-complement machines with gradual underflow; no
@@ -1141,8 +1141,8 @@ L10:
 		/* Comment out this if block if EMIN is ok */
 		if (iwarn) {
 			first = TRUE;
-			Melder_warning (L"\n\n WARNING. The value EMIN may be incorrect:- " "EMIN = ", Melder_integer (lemin),
-			                L"\nIf, after inspection, the value EMIN looks acceptable"
+			Melder_warning (U"\n\n WARNING. The value EMIN may be incorrect:- " "EMIN = ", lemin,
+			                U"\nIf, after inspection, the value EMIN looks acceptable"
 			                "please comment out \n the IF block as marked within the"
 			                "code of routine DLAMC2, \n otherwise supply EMIN" "explicitly.\n");
 		}
@@ -1651,7 +1651,7 @@ int NUMblas_dsymv (const char *uplo, long *n, double *alpha, double *a, long *ld
 		return 0;
 	}
 	/* Quick return if possible. */
-	if (*n == 0 || *alpha == 0. && *beta == 1.) {
+	if (*n == 0 || (*alpha == 0. && *beta == 1.)) {
 		return 0;
 	}
 	/* Set up the start points in X and Y. */
@@ -1981,7 +1981,7 @@ int NUMblas_dsyr2k (const char *uplo, const char *trans, long *n, long *k, doubl
 		return 0;
 	}
 	/* Quick return if possible. */
-	if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) {
+	if (*n == 0 || ((*alpha == 0. || *k == 0) && *beta == 1.)) {
 		return 0;
 	}
 	/* And when alpha.eq.zero. */
diff --git a/dwsys/NUMcblas.h b/dwsys/NUMcblas.h
index 1885d35..0df7232 100644
--- a/dwsys/NUMcblas.h
+++ b/dwsys/NUMcblas.h
@@ -24,11 +24,7 @@
  djmw 20110308 Latest modification
 */
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-#define xerbla_(src,info) Melder_throw (Melder_peekUtf8ToWcs (src), ": parameter ", *info, "not correct!")
+#define xerbla_(src,info) Melder_throw (Melder_peek8to32 (src), U": parameter ", *info, U"not correct!")
 
 int NUMblas_daxpy (long *n, double *da, double *dx,	long *incx, double *dy, long *incy);
 /*     constant times a vector plus a vector.
@@ -777,9 +773,4 @@ int NUMblas_dtrsm (const char *side, const char *uplo, const char *transa, const
 long NUMblas_idamax (long *n, double *dx, long *incx);
 /* finds the index of element having max. absolute value.*/
 
-#ifdef __cplusplus
-	}
-#endif
-
-
 #endif /* _NUMcblas_h_ */
diff --git a/dwsys/NUMclapack.h b/dwsys/NUMclapack.h
index 0472b3e..440f23c 100644
--- a/dwsys/NUMclapack.h
+++ b/dwsys/NUMclapack.h
@@ -38,10 +38,6 @@
 
 */
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 int NUMlapack_dbdsqr(const char *uplo, long *n, long *ncvt, long *nru, long *ncc,
 	double *d, double *e, double *vt, long *ldvt, double *u, long *ldu,
 	double *c, long *ldc, double *work, long *info);
@@ -6613,8 +6609,4 @@ long NUMlapack_ilaenv (long *ispec, const char *name, const char *opts, long *n1
     =====================================================================
 */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _NUMclapack_h_ */
diff --git a/dwsys/NUMf2c.cpp b/dwsys/NUMf2c.cpp
index 7dc8c11..895f3a7 100644
--- a/dwsys/NUMf2c.cpp
+++ b/dwsys/NUMf2c.cpp
@@ -6,8 +6,8 @@
 
 double d_sign (double *a, double *b) {
 	double x;
-	x = (*a >= 0 ? *a : - *a);
-	return (*b >= 0 ? x : -x);
+	x = (*a >= 0.0 ? *a : - *a);
+	return (*b >= 0.0 ? x : -x);
 }
 
 long int lsame_ (const char *ca, const char *cb) {
@@ -28,7 +28,7 @@ double pow_di (double *ap, long *bp) {
 	if (n != 0) {
 		if (n < 0) {
 			n = -n;
-			x = 1 / x;
+			x = 1.0 / x;
 		}
 		for (u = n; ;) {
 			if (u & 01) {
diff --git a/dwsys/NUMf2c.h b/dwsys/NUMf2c.h
index b7d8a6d..78ece39 100644
--- a/dwsys/NUMf2c.h
+++ b/dwsys/NUMf2c.h
@@ -25,10 +25,6 @@
  djmw 20110308 Latest modification
 */
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 double d_sign(double *a, double *b);
 /*
 	returns sign(b)*fabs(a)
@@ -52,8 +48,4 @@ long s_cmp(const char *a0, const char *b0, long la, long lb);
 void s_copy(register char *a, register char *b, long la, long lb);
 /* assign strings:  a = b (when no null byte at end of string)*/
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _NUMf2c_h_ */
diff --git a/dwsys/NUMhuber.cpp b/dwsys/NUMhuber.cpp
index e81e0ab..eef151f 100644
--- a/dwsys/NUMhuber.cpp
+++ b/dwsys/NUMhuber.cpp
@@ -1,6 +1,6 @@
-/* NUMhuber.c
+/* NUMhuber.cpp
 *
-* Copyright (C) 1994-2008 David Weenink
+* Copyright (C) 1994-2008, 2015 David Weenink
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
@@ -29,14 +29,14 @@ void NUMmad (double *x, long n, double *location, int wantlocation, double *mad,
 
 	*mad = NUMundefined;
 	if (n < 1) {
-		Melder_throw ("The dimension must be at least 1");
+		Melder_throw (U"The dimension must be at least 1");
 	}
 	if (n == 1) {
 		*location = x[1];
 		return;
 	}
 	autoNUMvector<double> atmp;
-	if (work == 0)  {
+	if (! work)  {
 		atmp.reset (1, n);
 		tmp = atmp.peek();
 	}
@@ -65,8 +65,8 @@ static double NUMgauss (double x) {
 void NUMstatistics_huber (double *x, long n, double *location, int wantlocation,
                           double *scale, int wantscale, double k, double tol, double *work) {
 	double *tmp = work;
-	double theta = 2 * NUMgaussP (k) - 1;
-	double beta = theta + k * k * (1 - theta) - 2 * k * NUMgauss (k);
+	double theta = 2.0 * NUMgaussP (k) - 1.0;
+	double beta = theta + k * k * (1.0 - theta) - 2.0 * k * NUMgauss (k);
 	long n1 = n;
 
 	autoNUMvector<double> atmp;
@@ -80,7 +80,7 @@ void NUMstatistics_huber (double *x, long n, double *location, int wantlocation,
 		*scale = mad;
 	}
 	if (*scale == 0) {
-		Melder_throw ("Scale is zero.");
+		Melder_throw (U"Scale is zero.");
 	}
 
 	double mu0, mu1 = *location;
@@ -107,14 +107,14 @@ void NUMstatistics_huber (double *x, long n, double *location, int wantlocation,
 			}
 		}
 		if (wantlocation) {
-			mu1 = 0;
+			mu1 = 0.0;
 			for (long i = 1; i <= n; i++) {
 				mu1 += tmp[i];
 			}
 			mu1 /= n;
 		}
 		if (wantscale) {
-			s1 = 0;
+			s1 = 0.0;
 			for (long i = 1; i <= n; i++) {
 				double dx = tmp[i] - mu1;
 				s1 += dx * dx;
diff --git a/dwsys/NUMlapack.cpp b/dwsys/NUMlapack.cpp
index 35a6121..5bd4ebd 100644
--- a/dwsys/NUMlapack.cpp
+++ b/dwsys/NUMlapack.cpp
@@ -1111,7 +1111,7 @@ void NUMgsvdFromUpperTriangulars (double **a, long m, long n, double **b,
 
 	if (iter == MAXIT + 1) {
 		*ncycle = MAXIT;
-		Melder_throw ("No convergence after ", MAXIT, " iterations.");
+		Melder_throw (U"No convergence after ", MAXIT, U" iterations.");
 	}
 
 	*ncycle = iter;
@@ -1376,7 +1376,7 @@ void NUMgsvdcmp (double **a, long m, long n, double **b, long p, int productsvd,
 	double bnorm = NUMfrobeniusnorm (p, n, b);
 
 	if (anorm == 0 || bnorm == 0) {
-		Melder_throw ("NUMgsvdcmp: empty matrix.");
+		Melder_throw (U"NUMgsvdcmp: empty matrix.");
 	}
 
 	double tola = MAX (m, n) * MAX (anorm, NUMfpp -> sfmin) * NUMfpp -> prec;
diff --git a/dwsys/NUMlapack.h b/dwsys/NUMlapack.h
index 21760c0..3fc71c8 100644
--- a/dwsys/NUMlapack.h
+++ b/dwsys/NUMlapack.h
@@ -118,10 +118,6 @@ We have changed the following things:
 	dggsvp	NUMmatricesToUpperTriangularForms
 */
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 void NUMidentity (double **a, long rb, long re, long cb);
 /*
 	Set a[rb:re, cb:cb+re-rb] to identity matrix.
@@ -1116,8 +1112,4 @@ void NUMtriangularInverse (int upper, int unitDiagonal, long n, double **a);
 
 */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _NUMlapack_h_ */
diff --git a/dwsys/NUMmachar.h b/dwsys/NUMmachar.h
index a90f4bc..c9ae513 100644
--- a/dwsys/NUMmachar.h
+++ b/dwsys/NUMmachar.h
@@ -24,10 +24,6 @@
  djmw 20110308 Latest modification
 */
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 struct structmachar_Table
 {
 	int base;		/* Radix in which numbers are presented. */
@@ -48,8 +44,4 @@ extern machar_Table NUMfpp;
 
 void NUMmachar ();
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _NUMmachar_h_ */
diff --git a/dwsys/NUMmathlib.cpp b/dwsys/NUMmathlib.cpp
index 2382c2b..5f6793b 100644
--- a/dwsys/NUMmathlib.cpp
+++ b/dwsys/NUMmathlib.cpp
@@ -427,7 +427,7 @@ static double ptukey(double q, double rr, double cc, double df, int lower_tail,
     }
 
     if(otsum > eps2) { /* not converged */
-		Melder_throw ("Not converged");
+		Melder_throw (U"Not converged");
     }
     if (ans > 1.)
 	ans = 1.;
@@ -612,7 +612,7 @@ static double qtukey(double p, double rr, double cc, double df, int lower_tail,
     }
 
     /* The process did not converge in 'maxiter' iterations */
-	Melder_warning ("Maximum number of iterations exceeded.");
+	Melder_warning (U"Maximum number of iterations exceeded.");
     return ans;
 }
 
diff --git a/dwsys/NUMsort2.cpp b/dwsys/NUMsort2.cpp
index 52fa056..d87f4f8 100644
--- a/dwsys/NUMsort2.cpp
+++ b/dwsys/NUMsort2.cpp
@@ -1,4 +1,4 @@
-/* NUMsort.c
+/* NUMsort.cpp
  *
  * Copyright (C) 1993-2012 David Weenink
  *
@@ -56,6 +56,76 @@ void NUMrankColumns (double **m, long rb, long re, long cb, long ce) {
 	}
 }
 
+template <class T>
+void NUMindexx (const T a[], long n, long index[], int (*compare) (void *, void *)) {
+	long ii, imin;
+	T min;
+	for (long j = 1; j <= n; j++) {
+		index[j] = j;
+	}
+	if (n < 2) return;   // Already sorted
+	if (n == 2) {
+		if (COMPARELT(a[2], a[1])) {
+			index[1] = 2; index[2] = 1;
+		}
+		return;
+	} 
+	if (n <= 12) {
+		for (long i = 1; i < n; i++) {
+			imin = i;
+			min = a[index[imin]];
+			for (long j = i + 1; j <= n; j++) {
+				if (COMPARELT(a[index[j]], min)) {
+					imin = j;
+					min = a[index[j]];
+				}
+			}
+			ii = index[imin]; index[imin] = index[i]; index[i] = ii;
+		}
+		return;
+	}
+	// H1
+	long l = n / 2 + 1, r = n;
+	for (;;) { // H2
+		long k, i;
+		if (l > 1) {
+			l--;
+			k = index[l];
+		} else { // l == 1
+			k = index[r];
+			index[r] = index[1];
+			r--;
+			if (r == 1) {
+				index[1] = k; break;
+			}
+		}
+		// H3 
+		long j = l;
+		for (;;) {
+			// H4
+			i = j;
+			j *= 2;
+			if (j > r) {
+				break;
+			}
+			if (j < r && COMPARELT (a[index[j]], a[index[j + 1]])) {
+				j++; // H5
+			}
+			index[i] = index[j]; // H7
+		}
+		for (;;) { // H8' 
+			j = i;
+			i = j >> 1;
+			// H9'
+			if (j == l || COMPARELT (a[k], a[index[i]])) {
+				index[j] = k; break;
+			}
+			index[j] = index[i];
+		}
+	}
+}
+
+
 #define MACRO_NUMindex(TYPE) \
 { \
 	long l, r, j, i, ii, k, imin; \
@@ -135,110 +205,92 @@ void NUMrankColumns (double **m, long rb, long re, long cb, long ce) {
 
 #define COMPARELT(x,y) ((x) < (y))
 
-void NUMindexx_f (const float a[], long n, long index[])
-MACRO_NUMindex (float)
-
 void NUMindexx (const double a[], long n, long index[])
-MACRO_NUMindex (float)
+MACRO_NUMindex (double)
 
 #undef COMPARELT
-#define COMPARELT(x,y) (Melder_wcscmp (x,y) <  0)
-void NUMindexx_s (wchar_t **a, long n, long index[])
-MACRO_NUMindex (wchar_t *)
+#define COMPARELT(x,y) (Melder_cmp (x,y) <  0)
+void NUMindexx_s (char32 **a, long n, long index[])
+MACRO_NUMindex (char32 *)
 
 #undef COMPARELT
 #undef MACRO_INDEXX
 
-
+template <class T>
+void NUMsort1 (long n, T a[]) {
 /*
 	Knuth's heapsort algorithm (vol. 3, page 145),
 	modified with Floyd's optimization (vol. 3, page 642).
 */
-#define MACRO_NUMsortkf(TYPE)  { \
-	long l, r, j, i, imin; \
-	TYPE k, min; \
-	if (n < 2) return;   /* Already sorted. */ \
-	/* This n<2 step is absent from Press et al.'s implementation, */ \
-	/* which will therefore not terminate on if(--ir==1). */ \
-	/* Knuth's initial assumption is now fulfilled: n >= 2. */ \
-	if (n == 2) \
-	{ \
-		if (a[1] > a[2]) \
-		{\
-			min = a[2]; a[2] = a[1]; a[1] = min; \
-		} \
-		return; \
-	} \
-	if (n <= 12) \
-	{ \
-		for (i = 1; i < n; i++) \
-		{ \
-			min = a[i]; \
-			imin = i; \
-			for (j = i + 1; j <= n; j++) \
-			{\
-				if (a[j] < min)\
-				{ \
-					min = a [j]; \
-					imin = j; \
-				} \
-			} \
-			a[imin] = a[i]; \
-			a[i] = min; \
-		} \
-		return; \
-	} \
-	/* H1 */\
-	l = (n >> 1) + 1; \
-	r = n; \
-	for (;;) /* H2 */\
-	{ \
-		if (l > 1) \
-		{ \
-			l--; \
-			k = a[l]; \
-		} \
-		else /* l == 1 */ \
-		{ \
-			k = a[r]; \
-			a[r] = a[1]; \
-			r--; \
-			if (r == 1) \
-			{ \
-				a[1] = k; return; \
-			} \
-		} \
-		/* H3 */ \
-		j = l; \
-		for (;;) \
-		{ \
-			/* H4 */ \
-			i = j; \
-			j = j << 1; \
-			if (j > r) break; \
-			if (j < r && a[j] < a[j + 1]) j++; /* H5 */\
-			/*if (k >= a[j]) break; */\
-			a[i] = a[j]; /* H7 */\
-		} \
-/*		a[i] = k; H8 */\
-		for (;;)  /*H8' */\
-		{\
-			j = i; \
-			i = j >> 1; \
-			/* H9' */ \
-			if (j == l || k <= a[i]) \
-			{ \
-				a[j] = k; break; \
-			} \
-			a[j] = a[i]; \
-		}\
-	} \
+	T min;
+	if (n < 2) return;   // Already sorted. 
+	/*	
+		This n<2 step is absent from Press et al.'s implementation,
+		which will therefore not terminate on if(--ir==1).
+		Knuth's initial assumption is now fulfilled: n >= 2.
+	*/
+	if (n == 2) {
+		if (a[1] > a[2]) {
+			min = a[2]; a[2] = a[1]; a[1] = min;
+		}
+		return;
+	}
+	if (n <= 12) {
+		long imin;
+		for (long i = 1; i < n; i++) {
+			min = a[i];
+			imin = i;
+			for (long j = i + 1; j <= n; j++) {
+				if (a[j] < min) {
+					min = a [j];
+					imin = j;
+				}
+			}
+			a[imin] = a[i];
+			a[i] = min;
+		}
+		return;
+	}
+	// H1
+	long l = (n >> 1) + 1, r = n;
+	for (;;) { // H2
+		T ak;
+		if (l > 1) {
+			l--;
+			ak = a[l];
+		} else { // l == 1
+			ak = a[r];
+			a[r] = a[1];
+			r--;
+			if (r == 1) {
+				a[1] = ak; return;
+			}
+		}
+		// H3
+		long i, j = l;
+		for (;;) { // H4
+			i = j;
+			j = j << 1;
+			if (j > r) {
+				break;
+			}
+			if (j < r && a[j] < a[j + 1]) {
+				j++; // H5
+			}
+			// if (k >= a[j]) break;
+			a[i] = a[j]; // H7 
+		}
+		//	a[i] = k; H8 
+		for (;;) { // H8'
+			j = i;
+			i = j >> 1;
+			// H9'
+			if (j == l || ak <= a[i]) {
+				a[j] = ak; break;
+			}
+			a[j] = a[i];
+		}
+	}
 }
 
-void NUMsort1_d (long n, double a[]);
-void NUMsort1_d (long n, double a[])
-MACRO_NUMsortkf (double)
-
-#undef MACRO_NUMsortkf
-
-/* End of file NUMsort.c */
+/* End of file NUMsort.cpp */
diff --git a/dwsys/NUMstring.cpp b/dwsys/NUMstring.cpp
index f0d418f..a4bf7ee 100644
--- a/dwsys/NUMstring.cpp
+++ b/dwsys/NUMstring.cpp
@@ -27,90 +27,81 @@
 #include "NUM2.h"
 
 
-int NUMstring_containsPrintableCharacter (const wchar_t *s) {
+int NUMstring_containsPrintableCharacter (const char32 *s) {
 	long len;
-	if (s == NULL || ( (len = wcslen (s)) == 0)) {
+	if (s == NULL || ( (len = str32len (s)) == 0)) {
 		return 0;
 	}
 	for (long i = 0; i < len; i++) {
-		int c = s[i];
-		if (isgraph (c)) {
+		if (isgraph ((int) s[i])) {
 			return 1;
 		}
 	}
 	return 0;
 }
 
-void NUMstring_chopWhiteSpaceAtExtremes_inline (wchar_t *string) {
-	long start = 0;
-	while (iswspace (string[start]) != 0) {
+void NUMstring_chopWhiteSpaceAtExtremes_inline (char32 *string) {
+	int64 start = 0;
+	while (iswspace ((int) string[start]) != 0) {
 		start++;
 	}
-	long end = wcslen (string);
-	while (end != start && iswspace(string[end - 1]) != 0) {
+	int64 end = str32len (string);
+	while (end != start && iswspace((int) string[end - 1]) != 0) {
 		end--;
 	}
-	long n = end - start;
-	memmove (string, string + start, n * sizeof (wchar_t));
+	int64 n = end - start;
+	memmove (string, string + start, (size_t) (n * (int64) sizeof (char32)));
 	string[n] = 0;
 }
 
-double *NUMstring_to_numbers (const wchar_t *s, long *numbers_found) {
+double *NUMstring_to_numbers (const char32 *s, long *numbers_found) {
 	*numbers_found = Melder_countTokens (s);
 	if (*numbers_found < 1) {
-		Melder_throw ("Empty string.");
+		Melder_throw (U"Empty string.");
 	}
 	autoNUMvector<double> numbers (1, *numbers_found);
 	long inum = 1;
-	for (wchar_t *token = Melder_firstToken (s); token != 0; token = Melder_nextToken (), inum++) {
+	for (char32 *token = Melder_firstToken (s); token != 0; token = Melder_nextToken (), inum++) {
 		Interpreter_numericExpression (0, token, &numbers[inum]);
 	}
 	return numbers.transfer();
 }
 
-void NUMstrings_copyElements (wchar_t **from, wchar_t **to, long lo, long hi) {
+void NUMstrings_copyElements (char32 **from, char32 **to, long lo, long hi) {
 	for (long i = lo; i <= hi; i++) {
 		Melder_free (to[i]);
 		if (from[i]) {
-			to[i] = Melder_wcsdup (from[i]);
+			to[i] = Melder_dup (from[i]);
 		}
 	}
 }
 
-void NUMstrings_free (wchar_t **s, long lo, long hi) {
+void NUMstrings_free (char32 **s, long lo, long hi) {
 	if (s == NULL) {
 		return;
 	}
 	for (long i = lo; i <= hi; i++) {
 		Melder_free (s[i]);
 	}
-	NUMvector_free<wchar_t *> (s, lo);
+	NUMvector_free<char32 *> (s, lo);
 }
 
-wchar_t **NUMstrings_copy (wchar_t **from, long lo, long hi) {
-	autoNUMvector<wchar_t *> to (lo, hi);
+char32 **NUMstrings_copy (char32 **from, long lo, long hi) {
+	autoNUMvector<char32 *> to (lo, hi);
 	NUMstrings_copyElements (from, to.peek(), lo, hi);
 	return to.transfer();
 }
 
-static wchar_t *appendNumberToString (const wchar_t *s, long number, int asArray) {
-	wchar_t buf[30];
-	long ncharb, nchars = 0;
-	ncharb = swprintf (buf, 29, (asArray == 0 ? L"%ld" : asArray == 1 ? L"[%ld]" : L"(%ld)"), number);
-	if (s != NULL) {
-		nchars = wcslen (s);
-	}
-	wchar_t *newc = Melder_calloc (wchar_t, nchars + ncharb + 1);
-	if (nchars > 0) {
-		wcsncpy (newc, s, nchars);
-	}
-	wcsncpy (newc + nchars, buf, ncharb + 1);
-	return newc;
+static char32 *appendNumberToString (const char32 *s, long number, int asArray) {
+	return Melder_dup (
+		asArray == 0 ? Melder_cat (s, number) :
+		asArray == 1 ? Melder_cat (s, U"[", number, U"]") :
+		Melder_cat (s, U"(", number, U")"));
 }
 
-int NUMstrings_setSequentialNumbering (wchar_t **s, long lo, long hi, const wchar_t *pre, long number, long increment, int asArray) {
+int NUMstrings_setSequentialNumbering (char32 **s, long lo, long hi, const char32 *pre, long number, long increment, int asArray) {
 	for (long i = lo; i <= hi; i++, number += increment) {
-		wchar_t *newc = appendNumberToString (pre, number, asArray);
+		char32 *newc = appendNumberToString (pre, number, asArray);
 		if (newc == NULL) {
 			return 0;
 		}
@@ -135,35 +126,30 @@ void NUMstring_add (unsigned char *a, unsigned char *b, unsigned char *c, long n
 	}
 }
 
-wchar_t *strstr_regexp (const wchar_t *string, const wchar_t *search_regexp) {
-	wchar_t *charp = 0;
-	const wchar_t *compileMsg;
-	regexp *compiled_regexp = CompileRE ( (regularExp_CHAR *) search_regexp, &compileMsg, 0);
+char32 *strstr_regexp (const char32 *string, const char32 *search_regexp) {
+	char32 *charp = 0;
+	regexp *compiled_regexp = CompileRE_throwable (search_regexp, 0);
 
-	if (compiled_regexp == 0) {
-		Melder_throw ("No regexp");
-	}
-
-	if (ExecRE (compiled_regexp, NULL, (regularExp_CHAR *) string, NULL, 0, '\0', '\0', NULL, NULL, NULL)) {
-		charp = (wchar *) compiled_regexp -> startp[0];
+	if (ExecRE (compiled_regexp, NULL, string, NULL, 0, '\0', '\0', NULL, NULL, NULL)) {
+		charp = compiled_regexp -> startp[0];
 	}
 
 	free (compiled_regexp);
 	return charp;
 }
 
-wchar_t *str_replace_literal (const wchar_t *string, const wchar_t *search, const wchar_t *replace,
+char32 *str_replace_literal (const char32 *string, const char32 *search, const char32 *replace,
                               long maximumNumberOfReplaces, long *nmatches) {
 	if (string == 0 || search == 0 || replace == 0) {
 		return NULL;
 	}
 
 
-	int len_string = wcslen (string);
+	int len_string = str32len (string);
 	if (len_string == 0) {
 		maximumNumberOfReplaces = 1;
 	}
-	int len_search = wcslen (search);
+	int len_search = str32len (search);
 	if (len_search == 0) {
 		maximumNumberOfReplaces = 1;
 	}
@@ -173,7 +159,7 @@ wchar_t *str_replace_literal (const wchar_t *string, const wchar_t *search, cons
 		matches will occur.
 	*/
 
-	const wchar_t *pos = string; //current position / start of current match
+	const char32 *pos = string; //current position / start of current match
 	*nmatches = 0;
 	if (maximumNumberOfReplaces <= 0) {
 		maximumNumberOfReplaces = LONG_MAX;
@@ -185,22 +171,22 @@ wchar_t *str_replace_literal (const wchar_t *string, const wchar_t *search, cons
 		}
 	} else {
 		if (len_string != 0) { /* Because empty string always matches */
-			while ( (pos = wcsstr (pos, search)) && *nmatches < maximumNumberOfReplaces) {
+			while ( (pos = str32str (pos, search)) && *nmatches < maximumNumberOfReplaces) {
 				pos += len_search;
 				(*nmatches) ++;
 			}
 		}
 	}
 
-	int len_replace = wcslen (replace);
-	int len_result = len_string + *nmatches * (len_replace - len_search);
-	wchar_t *result = Melder_malloc (wchar_t, (len_result + 1) * sizeof (wchar_t));
+	int64 len_replace = str32len (replace);
+	int64 len_result = len_string + *nmatches * (len_replace - len_search);
+	char32 *result = Melder_malloc (char32, (len_result + 1) * (int64) sizeof (char32));
 	result[len_result] = '\0';
 
-	const wchar_t *posp = pos = string;
+	const char32 *posp = pos = string;
 	int nchar = 0, result_nchar = 0;
 	for (long i = 1; i <= *nmatches; i++) {
-		pos = wcsstr (pos, search);
+		pos = str32str (pos, search);
 
 		/*
 			Copy gap between end of previous match and start of current.
@@ -208,7 +194,7 @@ wchar_t *str_replace_literal (const wchar_t *string, const wchar_t *search, cons
 
 		nchar = (pos - posp);
 		if (nchar > 0) {
-			wcsncpy (result + result_nchar, posp, nchar);
+			str32ncpy (result + result_nchar, posp, nchar);
 			result_nchar += nchar;
 		}
 
@@ -216,7 +202,7 @@ wchar_t *str_replace_literal (const wchar_t *string, const wchar_t *search, cons
 			Insert the replace string in result.
 		*/
 
-		wcsncpy (result + result_nchar, replace, len_replace);
+		str32ncpy (result + result_nchar, replace, len_replace);
 		result_nchar += len_replace;
 
 		/*
@@ -234,29 +220,29 @@ wchar_t *str_replace_literal (const wchar_t *string, const wchar_t *search, cons
 	pos = string + len_string;
 	nchar = pos - posp;
 	if (nchar > 0) {
-		wcsncpy (result + result_nchar, posp, nchar);
+		str32ncpy (result + result_nchar, posp, nchar);
 	}
 	return result;
 }
 
-wchar_t *str_replace_regexp (const wchar_t *string, regexp *compiledSearchRE,
-                             const wchar_t *replaceRE, long maximumNumberOfReplaces, long *nmatches) {
+char32 *str_replace_regexp (const char32 *string, regexp *compiledSearchRE,
+                             const char32 *replaceRE, long maximumNumberOfReplaces, long *nmatches) {
 	int buf_nchar = 0;				/* # characters in 'buf' */
 	int gap_copied = 0;
 	int nchar, reverse = 0;
 	int errorType;
-	wchar_t prev_char = '\0';
-	const wchar_t *pos; 	/* current position in 'string' / start of current match */
-	const wchar_t *posp; /* end of previous match */
-	autostring buf;
+	char32 prev_char = '\0';
+	const char32 *pos; 	/* current position in 'string' / start of current match */
+	const char32 *posp; /* end of previous match */
+	autostring32 buf;
 
 	*nmatches = 0;
 	if (string == 0 || compiledSearchRE == 0 || replaceRE == 0) {
 		return 0;
 	}
 
-	int string_length = wcslen (string);
-	//int replace_length = wcslen (replaceRE);
+	int string_length = str32len (string);
+	//int replace_length = str32len (replaceRE);
 	if (string_length == 0) {
 		maximumNumberOfReplaces = 1;
 	}
@@ -278,21 +264,21 @@ wchar_t *str_replace_regexp (const wchar_t *string, regexp *compiledSearchRE,
 	buf.resize (buf_size);
 
 	pos = posp = string;
-	while (ExecRE (compiledSearchRE, 0, (regularExp_CHAR *) pos, 0, reverse, prev_char, '\0', 0, 0, 0) && i++ < maximumNumberOfReplaces) {
+	while (ExecRE (compiledSearchRE, 0, pos, 0, reverse, prev_char, '\0', 0, 0, 0) && i++ < maximumNumberOfReplaces) {
 		/*
 			Copy gap between the end of the previous match and the start
 			of the current match.
 			Check buffer overflow. pos == posp ? '\0' : pos[-1],
 		*/
 
-		pos = (wchar_t *) compiledSearchRE -> startp[0];
+		pos = compiledSearchRE -> startp[0];
 		nchar = pos - posp;
 		if (nchar > 0 && ! gap_copied) {
 			if (buf_nchar + nchar + 1 > buf_size) {
 				buf_size *= 2;
 				buf.resize (buf_size);
 			}
-			wcsncpy (buf.peek() + buf_nchar, posp, nchar);
+			str32ncpy (buf.peek() + buf_nchar, posp, nchar);
 			buf_nchar += nchar;
 		}
 
@@ -303,7 +289,7 @@ wchar_t *str_replace_regexp (const wchar_t *string, regexp *compiledSearchRE,
 			overflow. SubstituteRE puts null byte at last replaced position and signals when overflow.
 		*/
 
-		if ( (SubstituteRE (compiledSearchRE, (regularExp_CHAR *) replaceRE, (regularExp_CHAR *) buf.peek() + buf_nchar, buf_size - buf_nchar, &errorType)) == false) {
+		if ( (SubstituteRE (compiledSearchRE, replaceRE, buf.peek() + buf_nchar, buf_size - buf_nchar, &errorType)) == false) {
 			if (errorType == 1) { // not enough memory
 				buf_size *= 2;
 				buf.resize (buf_size);
@@ -311,18 +297,18 @@ wchar_t *str_replace_regexp (const wchar_t *string, regexp *compiledSearchRE,
 				i--; // retry
 				continue;
 			}
-			Melder_throw ("Error during substitution.");
+			Melder_throw (U"Error during substitution.");
 		}
 
 		// Buffer is not full, get number of characters added;
 
-		nchar = wcslen (buf.peek() + buf_nchar);
+		nchar = str32len (buf.peek() + buf_nchar);
 		buf_nchar += nchar;
 
 		// Update next start position in search string.
 
 		posp = pos;
-		pos = (wchar_t *) compiledSearchRE -> endp[0];
+		pos = (char32 *) compiledSearchRE -> endp[0];
 		if (pos != posp) {
 			prev_char = pos[-1];
 		}
@@ -342,72 +328,61 @@ wchar_t *str_replace_regexp (const wchar_t *string, regexp *compiledSearchRE,
 	buf_size = buf_nchar + nchar + 1;
 	buf.resize (buf_size);
 
-	wcsncpy (buf.peek() + buf_nchar, pos, nchar);
+	str32ncpy (buf.peek() + buf_nchar, pos, nchar);
 	buf[buf_size - 1] = '\0';
 	return buf.transfer();
 }
 
-static wchar_t **strs_replace_literal (wchar_t **from, long lo, long hi, const wchar_t *search,
-	const wchar_t *replace, int maximumNumberOfReplaces, long *nmatches, long *nstringmatches) {
+static char32 **strs_replace_literal (char32 **from, long lo, long hi, const char32 *search,
+	const char32 *replace, int maximumNumberOfReplaces, long *nmatches, long *nstringmatches) {
 	if (search == NULL || replace == NULL) {
 		return NULL;
 	}
-	autostringvector result (lo, hi);
-	try {
-		long nmatches_sub = 0;
-		*nmatches = 0; *nstringmatches = 0;
-		for (long i = lo; i <= hi; i++) {
-			/* Treat a NULL as an empty string */
-			const wchar_t *string = from[i] == NULL ? L"" : from[i];
-
-			result[i] = str_replace_literal (string, search, replace, maximumNumberOfReplaces, &nmatches_sub);
-			if (nmatches_sub > 0) {
-				*nmatches += nmatches_sub;
-				(*nstringmatches) ++;
-			}
+	autostring32vector result (lo, hi);
+
+	long nmatches_sub = 0;
+	*nmatches = 0; *nstringmatches = 0;
+	for (long i = lo; i <= hi; i++) {
+		/* Treat a NULL as an empty string */
+		const char32 *string = from[i] == NULL ? U"" : from[i];
+
+		result[i] = str_replace_literal (string, search, replace, maximumNumberOfReplaces, &nmatches_sub);
+		if (nmatches_sub > 0) {
+			*nmatches += nmatches_sub;
+			(*nstringmatches) ++;
 		}
-		return result.transfer();
-	} catch (MelderError) {
-		return 0;
 	}
+	return result.transfer();
 }
 
-static wchar_t **strs_replace_regexp (wchar_t **from, long lo, long hi, const wchar_t *searchRE,
-	const wchar_t *replaceRE, int maximumNumberOfReplaces, long *nmatches, long *nstringmatches) {
+static char32 **strs_replace_regexp (char32 **from, long lo, long hi, const char32 *searchRE,
+	const char32 *replaceRE, int maximumNumberOfReplaces, long *nmatches, long *nstringmatches) {
 	if (searchRE == NULL || replaceRE == NULL) {
 		return NULL;
 	}
-	autostringvector result;
-	try {
-		regexp *compiledRE;
-		const wchar_t *compileMsg;
-		long nmatches_sub = 0;
-
-		compiledRE = CompileRE ( (regularExp_CHAR *) searchRE, &compileMsg, 0);
-		if (compiledRE == NULL) {
-			Melder_throw ("No regexp ");
-		}
+	autostring32vector result;
 
-		result.reset (lo, hi);
-
-		*nmatches = 0; *nstringmatches = 0;
-		for (long i = lo; i <= hi; i++) {
-			/* Treat a NULL as an empty string */
-			const wchar_t *string = from[i] == NULL ? L"" : from[i];
-			result [i] = str_replace_regexp (string, compiledRE, replaceRE,
-			                                 maximumNumberOfReplaces, &nmatches_sub);
-			if (nmatches_sub > 0) {
-				*nmatches += nmatches_sub;
-				(*nstringmatches) ++;
-			}
+	long nmatches_sub = 0;
+
+	regexp *compiledRE = CompileRE_throwable (searchRE, 0);
+
+	result.reset (lo, hi);
+
+	*nmatches = 0; *nstringmatches = 0;
+	for (long i = lo; i <= hi; i++) {
+		/* Treat a NULL as an empty string */
+		const char32 *string = from[i] == NULL ? U"" : from[i];
+		result [i] = str_replace_regexp (string, compiledRE, replaceRE,
+										 maximumNumberOfReplaces, &nmatches_sub);
+		if (nmatches_sub > 0) {
+			*nmatches += nmatches_sub;
+			(*nstringmatches) ++;
 		}
-		return result.transfer();
-	} catch (MelderError) {
-		return 0;
 	}
+	return result.transfer();
 }
 
-wchar_t **strs_replace (wchar_t **from, long lo, long hi, const wchar_t *search, const wchar_t *replace,
+char32 **strs_replace (char32 **from, long lo, long hi, const char32 *search, const char32 *replace,
                         int maximumNumberOfReplaces, long *nmatches, long *nstringmatches, int use_regexp) {
 	if (use_regexp) return strs_replace_regexp (from, lo, hi, search,
 		                       replace, maximumNumberOfReplaces, nmatches, nstringmatches);
@@ -421,47 +396,47 @@ wchar_t **strs_replace (wchar_t **from, long lo, long hi, const wchar_t *search,
  * 1, 4, 2, 3, 4, 5, 6, 7, 4, 3, 3, 4, 5, 4, 3, 2
  * Overlap is allowed. Ranges can go up and down.
  */
-static long *getElementsOfRanges (const wchar_t *ranges, long maximumElement, long *numberOfElements, const wchar_t *elementType) {
+static long *getElementsOfRanges (const char32 *ranges, long maximumElement, long *numberOfElements, const char32 *elementType) {
 	/*
 	 * Count the elements.
 	 */
 	long previousElement = 0;
 	*numberOfElements = 0;
-	const wchar_t *p = & ranges [0];
+	const char32 *p = & ranges [0];
 	for (;;) {
-		while (*p == ' ' || *p == '\t') p ++;
-		if (*p == '\0') break;
-		if (isdigit (*p)) {
-			long currentElement = wcstol (p, NULL, 10);
+		while (*p == U' ' || *p == U'\t') p ++;
+		if (*p == U'\0') break;
+		if (isdigit ((int) *p)) {
+			long currentElement = Melder_atoi (p);
 			if (currentElement == 0)
-				Melder_throw ("No such ", elementType, L": 0 (minimum is 1).");
+				Melder_throw (U"No such ", elementType, U": 0 (minimum is 1).");
 			if (currentElement > maximumElement)
-				Melder_throw ("No such ", elementType, ": ", currentElement, " (maximum is ", maximumElement, ").");
+				Melder_throw (U"No such ", elementType, U": ", currentElement, U" (maximum is ", maximumElement, U").");
 			*numberOfElements += 1;
 			previousElement = currentElement;
-			do { p ++; } while (isdigit (*p));
+			do { p ++; } while (isdigit ((int) *p));
 		} else if (*p == ':') {
 			if (previousElement == 0)
-				Melder_throw ("Cannot start range with colon.");
-			do { p ++; } while (*p == ' ' || *p == '\t');
-			if (*p == '\0')
-				Melder_throw ("Cannot end range with colon.");
-			if (! isdigit (*p))
-				Melder_throw ("End of range should be a positive whole number.");
-			long currentElement = wcstol (p, NULL, 10);
+				Melder_throw (U"Cannot start range with colon.");
+			do { p ++; } while (*p == U' ' || *p == U'\t');
+			if (*p == U'\0')
+				Melder_throw (U"Cannot end range with colon.");
+			if (! isdigit ((int) *p))
+				Melder_throw (U"End of range should be a positive whole number.");
+			long currentElement = Melder_atoi (p);
 			if (currentElement == 0)
-				Melder_throw ("No such ", elementType, ": 0 (minimum is 1).");
+				Melder_throw (U"No such ", elementType, U": 0 (minimum is 1).");
 			if (currentElement > maximumElement)
-				Melder_throw ("No such ", elementType, ": ", currentElement, " (maximum is ", maximumElement, ").");
+				Melder_throw (U"No such ", elementType, U": ", currentElement, U" (maximum is ", maximumElement, U").");
 			if (currentElement > previousElement) {
 				*numberOfElements += currentElement - previousElement;
 			} else {
 				*numberOfElements += previousElement - currentElement;
 			}
 			previousElement = currentElement;
-			do { p ++; } while (isdigit (*p));
+			do { p ++; } while (isdigit ((int) *p));
 		} else {
-			Melder_throw ("Start of range should be a positive whole number.");
+			Melder_throw (U"Start of range should be a positive whole number.");
 		}
 	}
 	/*
@@ -475,16 +450,16 @@ static long *getElementsOfRanges (const wchar_t *ranges, long maximumElement, lo
 	*numberOfElements = 0;
 	p = & ranges [0];
 	for (;;) {
-		while (*p == ' ' || *p == '\t') p ++;
-		if (*p == '\0') break;
-		if (isdigit (*p)) {
-			long currentElement = wcstol (p, NULL, 10);
+		while (*p == U' ' || *p == U'\t') p ++;
+		if (*p == U'\0') break;
+		if (isdigit ((int) *p)) {
+			long currentElement = Melder_atoi (p);
 			elements [++ *numberOfElements] = currentElement;
 			previousElement = currentElement;
-			do { p ++; } while (isdigit (*p));
-		} else if (*p == ':') {
-			do { p ++; } while (*p == ' ' || *p == '\t');
-			long currentElement = wcstol (p, NULL, 10);
+			do { p ++; } while (isdigit ((int) *p));
+		} else if (*p == U':') {
+			do { p ++; } while (*p == U' ' || *p == U'\t');
+			long currentElement = Melder_atoi (p);
 			if (currentElement > previousElement) {
 				for (long ielement = previousElement + 1; ielement <= currentElement; ielement ++) {
 					elements [++ *numberOfElements] = ielement;
@@ -495,7 +470,7 @@ static long *getElementsOfRanges (const wchar_t *ranges, long maximumElement, lo
 				}
 			}
 			previousElement = currentElement;
-			do { p ++; } while (isdigit (*p));
+			do { p ++; } while (isdigit ((int) *p));
 		}
 	}
 	return elements.transfer();
@@ -525,7 +500,7 @@ static void NUMlvector_getUniqueNumbers (long *numbers, long *numberOfElements,
 	*numberOfElements = n;
 }
 
-long *NUMstring_getElementsOfRanges (const wchar_t *ranges, long maximumElement, long *numberOfElements, long *numberOfMultiples, const wchar_t *elementType, bool sortedUniques) {
+long *NUMstring_getElementsOfRanges (const char32 *ranges, long maximumElement, long *numberOfElements, long *numberOfMultiples, const char32 *elementType, bool sortedUniques) {
 	autoNUMvector<long> elements (getElementsOfRanges (ranges, maximumElement, numberOfElements, elementType), 1);
 	if (sortedUniques) {
 		NUMlvector_getUniqueNumbers (elements.peek(), numberOfElements, numberOfMultiples);
@@ -533,11 +508,11 @@ long *NUMstring_getElementsOfRanges (const wchar_t *ranges, long maximumElement,
 	return elements.transfer();
 }
 
-wchar_t * NUMstring_timeNoDot (double time) {
-	static wchar_t string[100];
-	long seconds = time;
-	long ms = round((double)((time - seconds) * 1000.0));
-	swprintf (string, 99, L"_%ld_%ld", seconds, ms);
+char32 * NUMstring_timeNoDot (double time) {
+	static char32 string[100];
+	long seconds = (long) floor (time);
+	long ms = lround ((time - seconds) * 1000.0);
+	Melder_sprint (string,100, U"_", seconds, U"_", ms);
 	return string;
 }
 
diff --git a/dwsys/Permutation.cpp b/dwsys/Permutation.cpp
index 6214010..790036a 100644
--- a/dwsys/Permutation.cpp
+++ b/dwsys/Permutation.cpp
@@ -1,6 +1,6 @@
 /* Permutation.cpp
  *
- * Copyright (C) 2005-2012 David Weenink
+ * Copyright (C) 2005-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -47,11 +47,11 @@
 #include "oo_DESCRIPTION.h"
 #include "Permutation_def.h"
 
-Thing_implement (Permutation, Data, 0);
+Thing_implement (Permutation, Daata, 0);
 
 static long Permutation_checkRange (Permutation me, long *from, long *to) {
 	if ( (*from < 0 || *from > my numberOfElements) || (*to < 0 || *to > my numberOfElements)) {
-		Melder_throw (L"Range must be in [1, ", my numberOfElements, "].");
+		Melder_throw (U"Range must be in [1, ", my numberOfElements, U"].");
 	}
 	if (*from == 0) {
 		*from = 1;
@@ -67,20 +67,20 @@ void Permutation_checkInvariant (Permutation me) {
 	NUMsort_l (thy numberOfElements, thy p);
 	for (long i = 1; i <= my numberOfElements; i++) {
 		if (thy p[i] != i) {
-			Melder_throw (me, ":not a valid permutation.");
+			Melder_throw (me, U":not a valid permutation.");
 		}
 	}
 }
 
 void structPermutation :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of elements: ", Melder_integer (numberOfElements));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of elements: ", numberOfElements);
 }
 
-void structPermutation :: v_readText (MelderReadText text) {
+void structPermutation :: v_readText (MelderReadText text, int /*formatVersion*/) {
 	numberOfElements = texgeti4 (text);
 	if (numberOfElements < 1) {
-		Melder_throw (L"Found a negative mumber of elements during reading.");
+		Melder_throw (U"Found a negative mumber of elements during reading.");
 	}
 	p = NUMvector_readText_i4 (1, numberOfElements, text, "p");
 	Permutation_checkInvariant (this);
@@ -98,7 +98,7 @@ Permutation Permutation_create (long numberOfElements) {
 		Permutation_init (me.peek(), numberOfElements);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Permulation not created.");
+		Melder_throw (U"Permulation not created.");
 	}
 }
 
@@ -111,13 +111,13 @@ void Permutation_sort (Permutation me) {
 void Permutation_swapPositions (Permutation me, long i1, long i2) {
 	try {
 		if (i1 < 1 || i1 > my numberOfElements || i2 < 1 || i2 > my numberOfElements) {
-			Melder_throw ("Invalid positions.");
+			Melder_throw (U"Invalid positions.");
 		}
 		long tmp = my p[i1];
 		my p[i1] = my p[i2];
 		my p[i2] = tmp;
 	} catch (MelderError) {
-		Melder_throw (me, ":positions not swapped.");
+		Melder_throw (me, U":positions not swapped.");
 	}
 }
 
@@ -125,7 +125,7 @@ void Permutation_swapNumbers (Permutation me, long i1, long i2) {
 	try {
 		long ip = 0;
 		if (i1 < 1 || i1 > my numberOfElements || i2 < 1 || i2 > my numberOfElements) {
-			Melder_throw ("");
+			Melder_throw (U"");
 		}
 		if (i1 == i2) {
 			return;
@@ -144,16 +144,16 @@ void Permutation_swapNumbers (Permutation me, long i1, long i2) {
 		}
 		Melder_assert (ip == 2);
 	} catch (MelderError) {
-		Melder_throw (me, ": numbers not swapped.");
+		Melder_throw (me, U": numbers not swapped.");
 	}
 }
 
 void Permutation_swapBlocks (Permutation me, long from, long to, long blocksize) {
 	try {
 		if (blocksize < 1 || blocksize > my numberOfElements) Melder_throw
-			("Blocksize must be in [1, %d] range.", my numberOfElements / 2);
+			(U"Blocksize must be in [1, %d] range.", my numberOfElements / 2);
 		if (from < 0 || from + blocksize - 1 > my numberOfElements || to < 0 || to + blocksize - 1 > my numberOfElements) {
-			Melder_throw (L"Start and finish positions of the two blocks must be in [1,", my numberOfElements, "] range.");
+			Melder_throw (U"Start and finish positions of the two blocks must be in [1,", my numberOfElements, U"] range.");
 		}
 		if (from == to) {
 			return;
@@ -165,7 +165,7 @@ void Permutation_swapBlocks (Permutation me, long from, long to, long blocksize)
 			my p[to + i - 1] = tmp;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": blocks not swapped.");
+		Melder_throw (me, U": blocks not swapped.");
 	}
 }
 
@@ -183,7 +183,7 @@ void Permutation_permuteRandomly_inline (Permutation me, long from, long to) {
 			my p[newpos] = pi;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not permuted randomly.");
+		Melder_throw (me, U": not permuted randomly.");
 	}
 }
 
@@ -193,7 +193,7 @@ Permutation Permutation_permuteRandomly (Permutation me, long from, long to) {
 		Permutation_permuteRandomly_inline (thee.peek(), from, to);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not permuted.");
+		Melder_throw (me, U": not permuted.");
 	}
 }
 
@@ -215,7 +215,7 @@ Permutation Permutation_rotate (Permutation me, long from, long to, long step) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not rotated.");
+		Melder_throw (me, U": not rotated.");
 	}
 }
 
@@ -225,20 +225,19 @@ void Permutation_swapOneFromRange (Permutation me, long from, long to, long pos,
 		long newpos = NUMrandomInteger (from, to);
 		if (newpos == pos && forbidsame) {
 			if (n == 1) {
-				Melder_throw (L"Impossible to satisfy \"forbid same\" constraint within the chosen range.");
+				Melder_throw (U"Impossible to satisfy \"forbid same\" constraint within the chosen range.");
 			}
-			while ( (newpos = NUMrandomInteger (from, to)) == pos) {
+			while ((newpos = NUMrandomInteger (from, to)) == pos) {
 				;
 			}
 		}
 
 		long tmp = my p[pos]; my p[pos] = my p[newpos]; my p[newpos] = tmp;
 	} catch (MelderError) {
-		Melder_throw (me, ": one from range not swapped.");
+		Melder_throw (me, U": one from range not swapped.");
 	}
 }
 
-
 Permutation Permutation_permuteBlocksRandomly (Permutation me, long from, long to, long blocksize,
         int permuteWithinBlocks, int noDoublets) {
 	try {
@@ -253,8 +252,8 @@ Permutation Permutation_permuteBlocksRandomly (Permutation me, long from, long t
 		}
 
 		long nblocks  = n / blocksize, nrest = n % blocksize;
-		if (nrest != 0) Melder_throw ("It is not possible to fit an integer number of blocks "
-			                              "in the range.\n(The last block is only of size ", nrest, ").");
+		if (nrest != 0) Melder_throw (U"It is not possible to fit an integer number of blocks "
+			U"in the range.\n(The last block is only of size ", nrest, U").");
 
 		autoPermutation pblocks = Permutation_create (nblocks);
 
@@ -278,7 +277,7 @@ Permutation Permutation_permuteBlocksRandomly (Permutation me, long from, long t
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not permuted block randomly.");
+		Melder_throw (me, U": not permuted block randomly.");
 	}
 }
 
@@ -287,10 +286,12 @@ Permutation Permutation_interleave (Permutation me, long from, long to, long blo
 		long n = Permutation_checkRange (me, &from, &to);
 		long nblocks = n / blocksize;
 		long nrest = n % blocksize;
-		if (nrest != 0) Melder_throw ("There is not an integer number of blocks in the range.\n"
-			                              "(The last block is only of size ", nrest, L" instead of ", blocksize, ").");
+		if (nrest != 0) {
+			Melder_throw (U"There is not an integer number of blocks in the range.\n"
+				U"(The last block is only of size ", nrest, U" instead of ", blocksize, U").");
+		}
 		if (offset >= blocksize) {
-			Melder_throw (L"Offset must be smaller than blocksize.");
+			Melder_throw (U"Offset must be smaller than blocksize.");
 		}
 
 		autoPermutation thee = Data_copy (me);
@@ -325,7 +326,7 @@ Permutation Permutation_interleave (Permutation me, long from, long to, long blo
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not interleaved.");
+		Melder_throw (me, U": not interleaved.");
 	}
 }
 
@@ -350,7 +351,7 @@ Permutation Permutation_invert (Permutation me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not inverted.");
+		Melder_throw (me, U": not inverted.");
 	}
 }
 
@@ -364,7 +365,7 @@ Permutation Permutation_reverse (Permutation me, long from, long to) {
 		return thee.transfer();
 
 	} catch (MelderError) {
-		Melder_throw (me, ": not reversed.");
+		Melder_throw (me, U": not reversed.");
 	}
 }
 
@@ -376,30 +377,30 @@ void Permutation_next_inline (Permutation me) {
 	long *p = & my p[1];
 
 	if (size < 2) {
-		Melder_throw ("Only one element.");
+		Melder_throw (U"Only one element.");
 	}
 
 	long i = size - 2;
 
-	while ( (p[i] > p[i + 1]) && (i != 0)) {
+	while ((p[i] > p[i + 1]) && (i != 0)) {
 		i--;
 	}
 
-	if ( (i == 0) && (p[0] > p[1])) {
-		Melder_throw ("No next.");
+	if ((i == 0) && (p[0] > p[1])) {
+		Melder_throw (U"No next.");
 	}
 
 	long k = i + 1;
 
 	for (long j = i + 2; j < size; j++) {
-		if ( (p[j] > p[i]) && (p[j] < p[k])) {
+		if ((p[j] > p[i]) && (p[j] < p[k])) {
 			k = j;
 		}
 	}
 
 	long tmp = p[i]; p[i] = p[k]; p[k] = tmp;
 
-	for (long j = i + 1; j <= ( (size + i) / 2); j++) {
+	for (long j = i + 1; j <= (size + i) / 2; j++) {
 		tmp = p[j];
 		p[j] = p[size + i - j];
 		p[size + i - j] = tmp;
@@ -415,23 +416,23 @@ void Permutation_previous_inline (Permutation me) {
 	long *p = & my p[1];
 
 	if (size < 2) {
-		Melder_throw ("Only one element.");
+		Melder_throw (U"Only one element.");
 	}
 
 	long i = size - 2;
 
-	while ( (p[i] < p[i + 1]) && (i != 0)) {
+	while ((p[i] < p[i + 1]) && (i != 0)) {
 		i--;
 	}
 
-	if ( (i == 0) && (p[0] < p[1])) {
-		Melder_throw ("No previous");
+	if ((i == 0) && (p[0] < p[1])) {
+		Melder_throw (U"No previous");
 	}
 
 	long k = i + 1;
 
 	for (long j = i + 2; j < size; j++) {
-		if ( (p[j] < p[i]) && (p[j] > p[k])) {
+		if ((p[j] < p[i]) && (p[j] > p[k])) {
 			k = j;
 		}
 	}
@@ -448,7 +449,7 @@ void Permutation_previous_inline (Permutation me) {
 Permutation Permutations_multiply2 (Permutation me, Permutation thee) {
 	try {
 		if (my numberOfElements != thy numberOfElements) {
-			Melder_throw ("Number of elements must be equal.");
+			Melder_throw (U"Number of elements must be equal.");
 		}
 		autoPermutation him = Data_copy (me);
 		for (long i = 1; i <= my numberOfElements; i++) {
@@ -456,14 +457,14 @@ Permutation Permutations_multiply2 (Permutation me, Permutation thee) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, " not multiplied.");
+		Melder_throw (me, U" & ", thee, U" not multiplied.");
 	}
 }
 
 Permutation Permutations_multiply (Collection me) {
 	try {
 		if (my size < 2) {
-			Melder_throw ("There must be at least 2 Permutations in the set.");
+			Melder_throw (U"There must be at least 2 Permutations in the set.");
 		}
 		autoPermutation thee = Permutations_multiply2 ( (Permutation) my item[1], (Permutation) my item[2]);
 		for (long i = 3; i <= my size; i++) {
@@ -471,8 +472,8 @@ Permutation Permutations_multiply (Collection me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Permutations not multiplied.");
+		Melder_throw (U"Permutations not multiplied.");
 	}
 }
 
-/* End of Permutation.c */
+/* End of Permutation.cpp */
diff --git a/dwsys/Permutation.h b/dwsys/Permutation.h
index 41d8bad..87baef9 100644
--- a/dwsys/Permutation.h
+++ b/dwsys/Permutation.h
@@ -22,7 +22,7 @@
 #include "Collection.h"
 
 #include "Permutation_def.h"
-oo_CLASS_CREATE (Permutation, Data);
+oo_CLASS_CREATE (Permutation, Daata);
 
 /*
 	Class invariant: any permutation equals the identity permutation after all its elements are sorted ascendingly.
diff --git a/dwsys/Permutation_and_Index.cpp b/dwsys/Permutation_and_Index.cpp
index db01714..847b535 100644
--- a/dwsys/Permutation_and_Index.cpp
+++ b/dwsys/Permutation_and_Index.cpp
@@ -25,8 +25,7 @@
 
 #include "Permutation_and_Index.h"
 
-Permutation Index_to_Permutation_permuteRandomly (I, int permuteWithinClasses) {
-	iam (Index);
+Permutation Index_to_Permutation_permuteRandomly (Index me, int permuteWithinClasses) {
 	try {
 		long numberOfClasses = my classes -> size;
 
@@ -64,7 +63,7 @@ Permutation Index_to_Permutation_permuteRandomly (I, int permuteWithinClasses) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": Permutation not created.");
+		Melder_throw (me, U": Permutation not created.");
 	}
 }
 
diff --git a/dwsys/Permutation_and_Index.h b/dwsys/Permutation_and_Index.h
index ab1d0dc..9f1eac8 100644
--- a/dwsys/Permutation_and_Index.h
+++ b/dwsys/Permutation_and_Index.h
@@ -27,14 +27,6 @@
 #include "Permutation.h"
 #include "Index.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-Permutation Index_to_Permutation_permuteRandomly (I, int permuteWithinClass);
-
-#ifdef __cplusplus
-	}
-#endif
+Permutation Index_to_Permutation_permuteRandomly (Index me, int permuteWithinClass);
 
 #endif /* _Permutation_and_Index_h_ */
diff --git a/dwsys/Permutation_def.h b/dwsys/Permutation_def.h
index 61b5787..29077e6 100644
--- a/dwsys/Permutation_def.h
+++ b/dwsys/Permutation_def.h
@@ -19,14 +19,14 @@
 
 
 #define ooSTRUCT Permutation
-oo_DEFINE_CLASS (Permutation, Data)
+oo_DEFINE_CLASS (Permutation, Daata)
 
 	oo_LONG (numberOfElements)
 	oo_LONG_VECTOR (p, numberOfElements)
 			
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS(Permutation)	
diff --git a/dwsys/SVD.cpp b/dwsys/SVD.cpp
index aaf4d40..4cc3a37 100644
--- a/dwsys/SVD.cpp
+++ b/dwsys/SVD.cpp
@@ -64,11 +64,11 @@
 #define MIN(m,n) ((m) < (n) ? (m) : (n))
 
 void structSVD :: v_info () {
-	MelderInfo_writeLine (L"Number of rows: ", Melder_integer (numberOfRows));
-	MelderInfo_writeLine (L"Number of columns: ", Melder_integer (numberOfColumns));
+	MelderInfo_writeLine (U"Number of rows: ", numberOfRows);
+	MelderInfo_writeLine (U"Number of columns: ", numberOfColumns);
 }
 
-Thing_implement (SVD, Data, 0);
+Thing_implement (SVD, Daata, 0);
 
 static void NUMtranspose_d (double **m, long n);
 
@@ -107,7 +107,7 @@ SVD SVD_create (long numberOfRows, long numberOfColumns) {
 		SVD_init (me.peek(), numberOfRows, numberOfColumns);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SVD not created.");
+		Melder_throw (U"SVD not created.");
 	}
 }
 
@@ -117,7 +117,7 @@ SVD SVD_create_d (double **m, long numberOfRows, long numberOfColumns) {
 		SVD_svd_d (me.peek(), m);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SVD not created from vector.");
+		Melder_throw (U"SVD not created from vector.");
 	}
 }
 
@@ -127,20 +127,20 @@ SVD SVD_create_f (float **m, long numberOfRows, long numberOfColumns) {
 		SVD_svd_f (me.peek(), m);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SVD not created from vector.");
+		Melder_throw (U"SVD not created from vector.");
 	}
 }
 
 void SVD_svd_d (SVD me, double **m) {
 	if (my numberOfRows >= my numberOfColumns) {
-		/* Store m in u */
+		// Store m in u
 		for (long i = 1; i <= my numberOfRows; i++) {
 			for (long j = 1; j <= my numberOfColumns; j++) {
 				my u[i][j] = m[i][j];
 			}
 		}
 	} else {
-		/* Store m transposed in v */
+		// Store m transposed in v
 		for (long i = 1; i <= my numberOfRows; i++) {
 			for (long j = 1; j <= my numberOfColumns; j++) {
 				my v[j][i] = m[i][j];
@@ -152,14 +152,14 @@ void SVD_svd_d (SVD me, double **m) {
 
 void SVD_svd_f (SVD me, float **m) {
 	if (my numberOfRows >= my numberOfColumns) {
-		/* Store in u */
+		// Store in u
 		for (long i = 1; i <= my numberOfRows; i++) {
 			for (long j = 1; j <= my numberOfColumns; j++) {
 				my u[j][i] = m[i][j];
 			}
 		}
 	} else {
-		/* Store transposed in v */
+		// Store transposed in v
 		for (long i = 1; i <= my numberOfRows; i++) {
 			for (long j = 1; j <= my numberOfColumns; j++) {
 				my v[i][j] = m[j][i];
@@ -210,7 +210,7 @@ void SVD_compute (SVD me) {
 		double wt[2];
 		int transpose = my numberOfRows < my numberOfColumns;
 
-		/* transpose: if rows < cols then data in v */
+		// Transpose: if rows < cols then data in v
 		if (transpose) {
 			SVD_transpose (me);
 		}
@@ -218,19 +218,17 @@ void SVD_compute (SVD me) {
 		lda = ldu = ldvt = m = my numberOfColumns;
 		long n = my numberOfRows;
 
-		(void) NUMlapack_dgesvd (&jobu, &jobvt, &m, &n, &my u[1][1], &lda, &my d[1], &my v[1][1], &ldu,
-		                         NULL, &ldvt, wt, &lwork, &info);
+		(void) NUMlapack_dgesvd (&jobu, &jobvt, &m, &n, &my u[1][1], &lda, &my d[1], &my v[1][1], &ldu, nullptr, &ldvt, wt, &lwork, &info);
 
 		if (info != 0) {
-			Melder_throw ("SVD not precomputed.");
+			Melder_throw (U"SVD not precomputed.");
 		}
 
 		lwork = wt[0];
 		autoNUMvector<double> work (0L, lwork);
-		(void) NUMlapack_dgesvd (&jobu, &jobvt, &m, &n, &my u[1][1], &lda, &my d[1], &my v[1][1], &ldu,
-		                         NULL, &ldvt, work.peek(), &lwork, &info);
+		(void) NUMlapack_dgesvd (&jobu, &jobvt, &m, &n, &my u[1][1], &lda, &my d[1], &my v[1][1], &ldu, nullptr, &ldvt, work.peek(), &lwork, &info);
 		if (info != 0) {
-			Melder_throw ("SVD not computed.");
+			Melder_throw (U"SVD not computed.");
 		}
 
 		NUMtranspose_d (my v, MIN (m, n));
@@ -238,7 +236,7 @@ void SVD_compute (SVD me) {
 			SVD_transpose (me);
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": SVD could not be computed.");
+		Melder_throw (me, U": SVD could not be computed.");
 	}
 }
 
@@ -246,11 +244,11 @@ void SVD_compute (SVD me) {
 void SVD_getSquared (SVD me, double **m, bool inverse) {
 	for (long i = 1; i <= my numberOfColumns; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			double val = 0;
+			double val = 0.0;
 			for (long k = 1; k <= my numberOfColumns; k++) {
-				if (my d[k] > 0) {
+				if (my d[k] > 0.0) {
 					double dsq = my d[k] * my d[k];
-					double factor = inverse ? 1 / dsq : dsq;
+					double factor = inverse ? 1.0 / dsq : dsq;
 					val += my v[i][k] * my v[j][k] * factor;
 				}
 			}
@@ -269,8 +267,8 @@ void SVD_solve (SVD me, double b[], double x[]) {
 			Solution: x = V D^-1 U' b */
 
 		for (long j = 1; j <= mn_min; j++) {
-			double tmp = 0;
-			if (my d[j] > 0) {
+			double tmp = 0.0;
+			if (my d[j] > 0.0) {
 				for (long i = 1; i <= my numberOfRows; i++) {
 					tmp += my u[i][j] * b[i];
 				}
@@ -280,14 +278,14 @@ void SVD_solve (SVD me, double b[], double x[]) {
 		}
 
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			double tmp = 0;
+			double tmp = 0.0;
 			for (long i = 1; i <= mn_min; i++) {
 				tmp += my v[j][i] * t[i];
 			}
 			x[j] = tmp;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not solved.");
+		Melder_throw (me, U": not solved.");
 	}
 }
 
@@ -310,7 +308,7 @@ void SVD_sort (SVD me) {
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not sorted.");
+		Melder_throw (me, U": not sorted.");
 	}
 }
 
@@ -318,7 +316,7 @@ long SVD_zeroSmallSingularValues (SVD me, double tolerance) {
 	long numberOfZeroed = 0, mn_min = MIN (my numberOfRows, my numberOfColumns);
 	double dmax = my d[1];
 
-	if (tolerance == 0) {
+	if (tolerance == 0.0) {
 		tolerance = my tolerance;
 	}
 	for (long i = 2; i <= mn_min; i++) {
@@ -328,7 +326,7 @@ long SVD_zeroSmallSingularValues (SVD me, double tolerance) {
 	}
 	for (long i = 1; i <= mn_min; i++) {
 		if (my d[i] < dmax * tolerance) {
-			my d[i] = 0; numberOfZeroed++;
+			my d[i] = 0.0; numberOfZeroed++;
 		}
 	}
 	return numberOfZeroed;
@@ -338,7 +336,7 @@ long SVD_zeroSmallSingularValues (SVD me, double tolerance) {
 long SVD_getRank (SVD me) {
 	long rank = 0, mn_min = MIN (my numberOfRows, my numberOfColumns);
 	for (long i = 1; i <= mn_min; i++) {
-		if (my d[i] > 0) {
+		if (my d[i] > 0.0) {
 			rank++;
 		}
 	}
@@ -360,12 +358,12 @@ void SVD_synthesize (SVD me, long sv_from, long sv_to, double **m) {
 		}
 
 		if (sv_from > sv_to || sv_from < 1 || sv_to > mn_min) {
-			Melder_throw ("Indices must be in range [1, ", mn_min, "].");
+			Melder_throw (U"Indices must be in range [1, ", mn_min, U"].");
 		}
 
 		for (long i = 1; i <= my numberOfRows; i++) {
 			for (long j = 1; j <= my numberOfColumns; j++) {
-				m[i][j] = 0;
+				m[i][j] = 0.0;
 			}
 		}
 
@@ -377,14 +375,14 @@ void SVD_synthesize (SVD me, long sv_from, long sv_to, double **m) {
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no synthesis.");
+		Melder_throw (me, U": no synthesis.");
 	}
 }
 
-Thing_implement (GSVD, Data, 0);
+Thing_implement (GSVD, Daata, 0);
 
 void structGSVD :: v_info () {
-	MelderInfo_writeLine (L"Number of columns: ", Melder_integer (numberOfColumns));
+	MelderInfo_writeLine (U"Number of columns: ", numberOfColumns);
 }
 
 GSVD GSVD_create (long numberOfColumns) {
@@ -398,7 +396,7 @@ GSVD GSVD_create (long numberOfColumns) {
 		my d2 = NUMvector<double> (1, numberOfColumns);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("GSVD not created.");
+		Melder_throw (U"GSVD not created.");
 	}
 }
 
@@ -420,10 +418,10 @@ GSVD GSVD_create_d (double **m1, long numberOfRows1, long numberOfColumns, doubl
 		char jobu1 = 'N', jobu2 = 'N', jobq = 'Q';
 		long k, l, info;
 		NUMlapack_dggsvd (&jobu1, &jobu2, &jobq, &m, &n, &p, &k, &l,
-		    &a[1][1], &m, &b[1][1], &p, &alpha[1], &beta[1], NULL, &m,
-		    NULL, &p, &q[1][1], &n, &work[1], &iwork[1], &info);
+		    &a[1][1], &m, &b[1][1], &p, &alpha[1], &beta[1], nullptr, &m,
+		    nullptr, &p, &q[1][1], &n, &work[1], &iwork[1], &info);
 		if (info != 0) {
-			Melder_throw ("dggsvd failed, error = ", info);
+			Melder_throw (U"dggsvd failed, error = ", info);
 		}
 
 
@@ -455,7 +453,7 @@ GSVD GSVD_create_d (double **m1, long numberOfRows1, long numberOfColumns, doubl
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("GSVD not created.");
+		Melder_throw (U"GSVD not created.");
 	}
 }
 
diff --git a/dwsys/SVD.h b/dwsys/SVD.h
index 119cd13..d025f65 100644
--- a/dwsys/SVD.h
+++ b/dwsys/SVD.h
@@ -28,10 +28,10 @@
 #include "Data.h"
 
 #include "SVD_def.h"
-oo_CLASS_CREATE (SVD, Data);
+oo_CLASS_CREATE (SVD, Daata);
 
 #define GSVD__methods(klas) Data__methods(klas)
-oo_CLASS_CREATE (GSVD, Data);
+oo_CLASS_CREATE (GSVD, Daata);
 
 void SVD_init (I, long numberOfRows, long numberOfColumns);
 
diff --git a/dwsys/SVD_def.h b/dwsys/SVD_def.h
index 1910a43..c9ccb31 100644
--- a/dwsys/SVD_def.h
+++ b/dwsys/SVD_def.h
@@ -18,7 +18,7 @@
  */
 
 #define ooSTRUCT SVD
-oo_DEFINE_CLASS (SVD, Data)
+oo_DEFINE_CLASS (SVD, Daata)
 
 	oo_DOUBLE (tolerance)
 	oo_LONG (numberOfRows)
@@ -28,8 +28,8 @@ oo_DEFINE_CLASS (SVD, Data)
 	oo_DOUBLE_VECTOR (d, (numberOfColumns < numberOfRows ? numberOfColumns : numberOfRows))
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (SVD)
@@ -37,7 +37,7 @@ oo_END_CLASS (SVD)
 
 
 #define ooSTRUCT GSVD
-oo_DEFINE_CLASS (GSVD, Data)
+oo_DEFINE_CLASS (GSVD, Daata)
 
 	oo_DOUBLE (tolerance)
 	oo_LONG (numberOfColumns)
@@ -47,8 +47,8 @@ oo_DEFINE_CLASS (GSVD, Data)
 	oo_DOUBLE_VECTOR (d2, numberOfColumns)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (GSVD)
diff --git a/dwsys/SimpleVector.cpp b/dwsys/SimpleVector.cpp
index 87b0417..94b2ca0 100644
--- a/dwsys/SimpleVector.cpp
+++ b/dwsys/SimpleVector.cpp
@@ -43,7 +43,7 @@
 #include "oo_DESCRIPTION.h"
 #include "SimpleVector_def.h"
 
-Thing_implement (DoubleVector, Data, 0);
+Thing_implement (DoubleVector, Daata, 0);
 
 void DoubleVector_init (I, long min, long max) {
 	iam (DoubleVector);
@@ -57,11 +57,11 @@ DoubleVector DoubleVector_create (long min, long max) {
 		DoubleVector_init (me.peek(), min, max);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("DoubleVector not created.");
+		Melder_throw (U"DoubleVector not created.");
 	}
 }
 
-Thing_implement (ComplexVector, Data, 0);
+Thing_implement (ComplexVector, Daata, 0);
 
 void ComplexVector_init (I, long min, long max) {
 	iam (ComplexVector);
@@ -75,7 +75,7 @@ ComplexVector ComplexVector_create (long min, long max) {
 		ComplexVector_init (me.peek(), min, max);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ComplexVector not created.");
+		Melder_throw (U"ComplexVector not created.");
 	}
 }
 
diff --git a/dwsys/SimpleVector.h b/dwsys/SimpleVector.h
index 4e9d5c5..365cee0 100644
--- a/dwsys/SimpleVector.h
+++ b/dwsys/SimpleVector.h
@@ -22,8 +22,8 @@
 #include "Data.h"
 
 #include "SimpleVector_def.h"
-oo_CLASS_CREATE (DoubleVector, Data);
-oo_CLASS_CREATE (ComplexVector, Data);
+oo_CLASS_CREATE (DoubleVector, Daata);
+oo_CLASS_CREATE (ComplexVector, Daata);
 
 void DoubleVector_init (I, long min, long max);
 DoubleVector DoubleVector_create (long min, long max);
diff --git a/dwsys/SimpleVector_def.h b/dwsys/SimpleVector_def.h
index a8738a0..ade0247 100644
--- a/dwsys/SimpleVector_def.h
+++ b/dwsys/SimpleVector_def.h
@@ -22,7 +22,7 @@
 */
 
 #define ooSTRUCT DoubleVector
-oo_DEFINE_CLASS (DoubleVector, Data)
+oo_DEFINE_CLASS (DoubleVector, Daata)
 
 	oo_LONG (min)
 	oo_LONG (max)
@@ -32,7 +32,7 @@ oo_END_CLASS (DoubleVector)
 #undef ooSTRUCT
 
 #define ooSTRUCT ComplexVector
-oo_DEFINE_CLASS (ComplexVector, Data)
+oo_DEFINE_CLASS (ComplexVector, Daata)
 
 	oo_LONG (min)
 	oo_LONG (max)
diff --git a/dwsys/Simple_extensions.cpp b/dwsys/Simple_extensions.cpp
index c2233eb..8af8391 100644
--- a/dwsys/Simple_extensions.cpp
+++ b/dwsys/Simple_extensions.cpp
@@ -1,6 +1,6 @@
 /* Simple_extensions.cpp
  *
- * Copyright (C) 1994-2011 David Weenink
+ * Copyright (C) 1994-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,21 +19,21 @@
 
 /*
  djmw 20020812 GPL header
- djmw & pb wchar_t
+ djmw & pb wchar
 */
 
 #include "Simple_extensions.h"
 #include "longchar.h"
 
-void SimpleString_init (SimpleString me, const wchar_t *string) {
-	my string = Melder_wcsdup (string);
+void SimpleString_init (SimpleString me, const char32 *string) {
+	my string = Melder_dup (string);
 }
 
 int SimpleString_compare (SimpleString me, SimpleString thee) {
-	return wcscmp (my string, thy string);
+	return str32cmp (my string, thy string);
 }
 
-const wchar_t *SimpleString_c (SimpleString me) {
+const char32 *SimpleString_c (SimpleString me) {
 	return my string;
 }
 
@@ -41,13 +41,13 @@ void SimpleString_append (SimpleString me, SimpleString thee) {
 	SimpleString_append_c (me, thy string);
 }
 
-void SimpleString_append_c (SimpleString me, const wchar_t *str) {
-	if (str == 0) {
+void SimpleString_append_c (SimpleString me, const char32 *str) {
+	if (! str) {
 		return;
 	}
-	long myLength = wcslen (my string);
-	my string = (wchar_t *) Melder_realloc (my string, (myLength + wcslen (str) + 1) * sizeof (wchar_t));
-	wcscpy (& my string[myLength], str);
+	long myLength = str32len (my string);
+	my string = (char32 *) Melder_realloc (my string, (myLength + str32len (str) + 1) * (int64) sizeof (char32));
+	str32cpy (& my string[myLength], str);
 }
 
 SimpleString SimpleString_concat (SimpleString me, SimpleString thee) {
@@ -56,36 +56,36 @@ SimpleString SimpleString_concat (SimpleString me, SimpleString thee) {
 	return him.transfer();
 }
 
-SimpleString SimpleString_concat_c (SimpleString me, const wchar_t *str) {
+SimpleString SimpleString_concat_c (SimpleString me, const char32 *str) {
 	autoSimpleString him = Data_copy (me);
 	SimpleString_append_c (him.peek(), str);
 	return him.transfer();
 }
 
-void SimpleString_replace_c (SimpleString me, const wchar_t *str) {
-	wchar_t *ptr = Melder_wcsdup (str);
+void SimpleString_replace_c (SimpleString me, const char32 *str) {
+	char32 *ptr = Melder_dup (str);
 	Melder_free (my string);
 	my string = ptr;
 }
 
 long SimpleString_length (SimpleString me) {
-	return wcslen (my string);
+	return str32len (my string);
 }
 
 void SimpleString_draw (SimpleString me, Graphics g, double xWC, double yWC) {
 	Graphics_text (g, xWC, yWC, my string);
 }
 
-const wchar_t *SimpleString_nativize_c (SimpleString me, int educateQuotes) {
+const char32 *SimpleString_nativize_c (SimpleString me, int educateQuotes) {
 	autoSimpleString thee = Data_copy (me);
-	Longchar_nativizeW (thy string, my string, educateQuotes);
+	Longchar_nativize32 (thy string, my string, educateQuotes);
 	return my string;
 }
 
-const wchar_t *SimpleString_genericize_c (SimpleString me) {
+const char32 *SimpleString_genericize_c (SimpleString me) {
 	autoSimpleString thee = Data_copy (me);
-	my string = (wchar_t *) Melder_realloc (my string, (3 * wcslen (my string) + 1) * sizeof (wchar_t));
-	Longchar_genericizeW (thy string, my string);
+	my string = (char32 *) Melder_realloc (my string, (3 * str32len (my string) + 1) * (int64) sizeof (char32));
+	Longchar_genericize32 (thy string, my string);
 	return my string;
 }
 
diff --git a/dwsys/Simple_extensions.h b/dwsys/Simple_extensions.h
index 2a164d9..2a75a67 100644
--- a/dwsys/Simple_extensions.h
+++ b/dwsys/Simple_extensions.h
@@ -28,23 +28,23 @@
 #include "Graphics.h"
 #include "Simple.h"
 
-void SimpleString_init (SimpleString me, const wchar_t *value);
+void SimpleString_init (SimpleString me, const char32 *value);
 /* return 0 when value == NULL */
 
-const wchar_t *SimpleString_c (SimpleString me);
+const char32 *SimpleString_c (SimpleString me);
 /* return pointer to the string */
 
 int SimpleString_compare (SimpleString me, SimpleString thee);
 
 void SimpleString_append (SimpleString me, SimpleString thee);
-void SimpleString_append_c (SimpleString me, const wchar_t *str);
+void SimpleString_append_c (SimpleString me, const char32 *str);
 /* append string to me */
 
 SimpleString SimpleString_concat (SimpleString me, SimpleString thee);
-SimpleString SimpleString_concat_c (SimpleString me, const wchar_t *str);
+SimpleString SimpleString_concat_c (SimpleString me, const char32 *str);
 /* concatenate two strings */
 
-void SimpleString_replace_c (SimpleString me, const wchar_t *replacement);
+void SimpleString_replace_c (SimpleString me, const char32 *replacement);
 /* replace my value with new string */
 
 long SimpleString_length (SimpleString me);
@@ -53,8 +53,8 @@ long SimpleString_length (SimpleString me);
 void SimpleString_draw (SimpleString me, Graphics g, double xWC, double yWC);
 /* draw the string */
 
-const wchar_t * SimpleString_nativize_c (SimpleString me, int educateQuotes);
-const wchar_t * SimpleString_genericize_c (SimpleString me);
+const char32 * SimpleString_nativize_c (SimpleString me, int educateQuotes);
+const char32 * SimpleString_genericize_c (SimpleString me);
 /* see longchar.h for info */
 
 #endif /* _Simple_extensions_h_ */
diff --git a/dwsys/regularExp.cpp b/dwsys/regularExp.cpp
index f6945f6..f38d767 100644
--- a/dwsys/regularExp.cpp
+++ b/dwsys/regularExp.cpp
@@ -91,13 +91,9 @@
  * djmw 20101119 Changed NULL to '\0' in makeDelimiterTable
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
 #include <ctype.h>
 #include <limits.h>
 #include "regularExp.h"
-#include "melder.h"
 
 /* The first byte of the regexp internal `program' is a magic number to help
    guard against corrupted data; the compiled regex code really begins in the
@@ -399,11 +395,11 @@
 #define LENGTH_SIZE	4
 #define NODE_SIZE       (NEXT_PTR_SIZE + OP_CODE_SIZE)
 
-#define GET_OP_CODE(p)  (*(regularExp_CHAR *)(p))
+#define GET_OP_CODE(p)  (*(char32 *)(p))
 #define OPERAND(p)      ((p) + NODE_SIZE)
 #define GET_OFFSET(p)   ((( *((p) + 1) & 0377) << 8) + (( *((p) + 2)) & 0377))
-#define PUT_OFFSET_L(v) (regularExp_CHAR)(((v) >> 8) & 0377)
-#define PUT_OFFSET_R(v) (regularExp_CHAR) ((v)       & 0377)
+#define PUT_OFFSET_L(v) (char32)(((v) >> 8) & 0377)
+#define PUT_OFFSET_R(v) (char32) ((v)       & 0377)
 #define GET_LOWER(p)    ((( *((p) + NODE_SIZE) & 0377) << 8) + \
                          (( *((p) + NODE_SIZE+1)) & 0377))
 #define GET_UPPER(p)    ((( *((p) + NODE_SIZE+2) & 0377) << 8) + \
@@ -416,7 +412,7 @@
                           (c) == '?' || (c) == Brace_Char)
 #define SET_BIT(i,n)     ((i) |= (1 << ((n) - 1)))
 #define TEST_BIT(i,n)    ((i) &  (1 << ((n) - 1)))
-#define U_CHAR_AT(p)     ((unsigned int) *(regularExp_CHAR *)(p))
+#define U_CHAR_AT(p)     ((unsigned int) *(char32 *)(p))
 
 /* Flags to be passed up and down via function parameters during compile. */
 
@@ -459,9 +455,9 @@ character class */
 #define MAX_COMPILED_SIZE  32767UL  /* Largest size a compiled regex can be.
 	       Probably could be 65535UL. */
 
-       /* Global work variables for `CompileRE'. */
+/* Global work variables for `CompileRE'. */
 
-		       static regularExp_CHAR *Reg_Parse;       /* Input scan ptr (scans user's regex) */
+static char32 *Reg_Parse;       /* Input scan ptr (scans user's regex) */
 static int            Total_Paren;     /* Parentheses, (),  counter. */
 static int            Num_Braces;      /* Number of general {m,n} constructs.
                                           {m,n} quantifiers of SIMPLE atoms are
@@ -469,8 +465,8 @@ static int            Num_Braces;      /* Number of general {m,n} constructs.
 static int            Closed_Parens;   /* Bit flags indicating () closure. */
 static int            Paren_Has_Width; /* Bit flags indicating ()'s that are
                                           known to not match the empty string */
-static regularExp_CHAR  Compute_Size;    /* Address of this used as flag. */
-static regularExp_CHAR *Code_Emit_Ptr;   /* When Code_Emit_Ptr is set to
+static char32  Compute_Size;    /* Address of this used as flag. */
+static char32 *Code_Emit_Ptr;   /* When Code_Emit_Ptr is set to
                                           &Compute_Size no code is emitted.
                                           Instead, the size of code that WOULD
                                           have been generated is accumulated in
@@ -478,25 +474,25 @@ static regularExp_CHAR *Code_Emit_Ptr;   /* When Code_Emit_Ptr is set to
                                           points to where compiled regex code is
                                           to be written. */
 static unsigned long  Reg_Size;        /* Size of compiled regex code. */
-static const wchar         **Error_Ptr;       /* Place to store error messages so
+static const char32         **Error_Ptr;       /* Place to store error messages so
                                           they can be returned by `CompileRE' */
-static wchar           Error_Text [128];/* Sting to build error messages in. */
+static char32           Error_Text [128];/* Sting to build error messages in. */
 
-static regularExp_CHAR  White_Space [WHITE_SPACE_SIZE]; /* Arrays used by       */
-static regularExp_CHAR  Word_Char   [ALNUM_CHAR_SIZE];  /* functions            */
-static regularExp_CHAR  Letter_Char [ALNUM_CHAR_SIZE];  /* init_ansi_classes () */
+static char32  White_Space [WHITE_SPACE_SIZE]; /* Arrays used by       */
+static char32  Word_Char   [ALNUM_CHAR_SIZE];  /* functions            */
+static char32  Letter_Char [ALNUM_CHAR_SIZE];  /* init_ansi_classes () */
 /* and
    shortcut_escape ().  */
 
-static regularExp_CHAR  ASCII_Digits [] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0' }; /* Same for all */
+static char32  ASCII_Digits [] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0' }; /* Same for all */
 /* locales.     */
 static int            Is_Case_Insensitive;
 static int            Match_Newline;
 
 static int            Enable_Counting_Quantifier = 1;
-static regularExp_CHAR  Brace_Char;
-static regularExp_CHAR  Default_Meta_Char [] = { '{', '.', '*', '+', '?', '[', '(', '|', ')', '^', '<', '>', '$', '\0' };
-static regularExp_CHAR *Meta_Char;
+static char32  Brace_Char;
+static char32  Default_Meta_Char [] = { '{', '.', '*', '+', '?', '[', '(', '|', ')', '^', '<', '>', '$', '\0' };
+static char32 *Meta_Char;
 
 typedef struct {
 	long lower;
@@ -505,34 +501,26 @@ typedef struct {
 
 /* Forward declarations for functions used by `CompileRE'. */
 
-static regularExp_CHAR *alternative (int *flag_param, len_range *range_param);
-static regularExp_CHAR *back_ref (regularExp_CHAR *c, int *flag_param,
-                                  int emit);
-static regularExp_CHAR *chunk (int paren, int *flag_param, len_range *range_param);
-static void            emit_byte (regularExp_CHAR c);
-static void            emit_class_byte (regularExp_CHAR c);
-static regularExp_CHAR *emit_node (int op_code);
-static regularExp_CHAR *emit_special (regularExp_CHAR op_code,
-                                      unsigned long test_val,
-                                      int index);
-static regularExp_CHAR   literal_escape (regularExp_CHAR c);
-static regularExp_CHAR   numeric_escape (regularExp_CHAR c, regularExp_CHAR **parse);
-static regularExp_CHAR *atom (int *flag_param, len_range *range_param);
-static void            reg_error (const wchar *str);
-static regularExp_CHAR *insert (regularExp_CHAR op, regularExp_CHAR *opnd,
-                                long min, long max, int index);
-static regularExp_CHAR *next_ptr (regularExp_CHAR *ptr);
-static void            offset_tail (regularExp_CHAR *ptr, int offset,
-                                    regularExp_CHAR *val);
-static void            branch_tail (regularExp_CHAR *ptr, int offset,
-                                    regularExp_CHAR *val);
-static regularExp_CHAR *piece (int *flag_param, len_range *range_param);
-static void            tail (regularExp_CHAR *search_from,
-                             regularExp_CHAR *point_t);
-static regularExp_CHAR *shortcut_escape (regularExp_CHAR c, int *flag_param,
-        int emit);
-
-static int             init_ansi_classes (void);
+static char32 *alternative (int *flag_param, len_range *range_param);
+static char32 *back_ref (char32 *c, int *flag_param, int emit);
+static char32 *chunk (int paren, int *flag_param, len_range *range_param);
+static void emit_byte (char32 c);
+static void emit_class_byte (char32 c);
+static char32 *emit_node (int op_code);
+static char32 *emit_special (char32 op_code, unsigned long test_val, int index);
+static char32 literal_escape (char32 c);
+static char32 numeric_escape (char32 c, char32 **parse);
+static char32 *atom (int *flag_param, len_range *range_param);
+static void reg_error (const char32_t *str);
+static char32 *insert (char32 op, char32 *opnd, long min, long max, int index);
+static char32 *next_ptr (char32 *ptr);
+static void offset_tail (char32 *ptr, int offset, char32 *val);
+static void branch_tail (char32 *ptr, int offset, char32 *val);
+static char32 *piece (int *flag_param, len_range *range_param);
+static void tail (char32 *search_from, char32 *point_t);
+static char32 *shortcut_escape (char32 c, int *flag_param, int emit);
+
+static int             init_ansi_classes ();
 
 /*----------------------------------------------------------------------*
  * CompileRE
@@ -549,10 +537,19 @@ static int             init_ansi_classes (void);
  * some of the structure of the compiled regexp.
  *----------------------------------------------------------------------*/
 
-regexp *CompileRE (const regularExp_CHAR *exp, const wchar **errorText, int defaultFlags) {
+regexp *CompileRE_throwable (const char32 *exp, int defaultFlags) {
+	const char32 *compileMessage;
+	regexp *compiledRE = CompileRE (exp, & compileMessage, defaultFlags);
+	if (compiledRE == NULL) {
+		Melder_throw (U"Regular expression: ", compileMessage, U".");
+	}
+	return compiledRE;
+}
+
+regexp *CompileRE (const char32 *exp, const char32 **errorText, int defaultFlags) {
 
-	register regexp *comp_regex = NULL;
-	register regularExp_CHAR *scan;
+	regexp *comp_regex = NULL;
+	char32 *scan;
 	int flags_local, pass;
 	len_range range_local;
 
@@ -567,16 +564,16 @@ regexp *CompileRE (const regularExp_CHAR *exp, const wchar **errorText, int defa
 	/* Set up errorText to receive failure reports. */
 
 	Error_Ptr = errorText;
-	*Error_Ptr = L"";
+	*Error_Ptr = U"";
 
 	if (exp == NULL) {
-		REG_FAIL (L"NULL argument, `CompileRE\'");
+		REG_FAIL (U"NULL argument, `CompileRE\'");
 	}
 
 	/* Initialize arrays used by function `shortcut_escape'. */
 
 	if (!init_ansi_classes ()) {
-		REG_FAIL (L"internal error #1, `CompileRE\'");
+		REG_FAIL (U"internal error #1, `CompileRE\'");
 	}
 
 	Code_Emit_Ptr = &Compute_Size;
@@ -607,7 +604,7 @@ regexp *CompileRE (const regularExp_CHAR *exp, const wchar **errorText, int defa
 		Match_Newline = 0;  /* ((defaultFlags & REDFLT_MATCH_NEWLINE)   ? 1 : 0);
                              Currently not used. Uncomment if needed. */
 
-		Reg_Parse       = (regularExp_CHAR *) exp;
+		Reg_Parse       = (char32 *) exp;
 		Total_Paren     = 1;
 		Num_Braces      = 0;
 		Closed_Parens   = 0;
@@ -626,24 +623,24 @@ regexp *CompileRE (const regularExp_CHAR *exp, const wchar **errorText, int defa
 				   This is a real issue since the first BRANCH node usually points
 				   to the end of the compiled regex code. */
 
-				swprintf ( (wchar *) Error_Text, 128, L"regexp > %lu bytes", MAX_COMPILED_SIZE);
+				Melder_sprint (Error_Text,128, U"regexp > ", MAX_COMPILED_SIZE, U" bytes");
 				REG_FAIL (Error_Text);
 			}
 
 			/* Allocate memory. */
 
-			comp_regex = (regexp *) malloc (sizeof (regexp) + Reg_Size * sizeof (wchar_t));
+			comp_regex = (regexp *) malloc (sizeof (regexp) + Reg_Size * sizeof (char32));
 
 			if (comp_regex == NULL) {
-				REG_FAIL (L"out of memory in `CompileRE\'");
+				REG_FAIL (U"out of memory in `CompileRE\'");
 			}
 
-			Code_Emit_Ptr = (regularExp_CHAR *) comp_regex->program;
+			Code_Emit_Ptr = (char32 *) comp_regex->program;
 		}
 	}
 
-	comp_regex->program [1] = (regularExp_CHAR) Total_Paren - 1;
-	comp_regex->program [2] = (regularExp_CHAR) Num_Braces;
+	comp_regex->program [1] = (char32) Total_Paren - 1;
+	comp_regex->program [2] = (char32) Num_Braces;
 
 	/*----------------------------------------*
 	 * Dig out information for optimizations. *
@@ -654,7 +651,7 @@ regexp *CompileRE (const regularExp_CHAR *exp, const wchar **errorText, int defa
 
 	/* First BRANCH. */
 
-	scan = (regularExp_CHAR *) (comp_regex->program + REGEX_START_OFFSET);
+	scan = (char32 *) (comp_regex->program + REGEX_START_OFFSET);
 
 	if (GET_OP_CODE (next_ptr (scan)) == END) { /* Only one top-level choice. */
 		scan = OPERAND (scan);
@@ -693,19 +690,18 @@ regexp *CompileRE (const regularExp_CHAR *exp, const wchar **errorText, int defa
  * branches to what follows makes it hard to avoid.                     *
  *----------------------------------------------------------------------*/
 
-static regularExp_CHAR *chunk (int paren, int *flag_param,
-                               len_range *range_param) {
+static char32 *chunk (int paren, int *flag_param, len_range *range_param) {
 
-	register regularExp_CHAR *ret_val = NULL;
-	register regularExp_CHAR *this_branch;
-	register regularExp_CHAR *ender = NULL;
-	register          int   this_paren = 0;
+	char32 *ret_val = NULL;
+	char32 *this_branch;
+	char32 *ender = NULL;
+	int   this_paren = 0;
 	int   flags_local, first = 1, zero_width, i;
 	int   old_sensitive = Is_Case_Insensitive;
 	int   old_newline   = Match_Newline;
 	len_range range_local;
 	int   look_only = 0;
-	regularExp_CHAR *emit_look_behind_bounds = NULL;
+	char32 *emit_look_behind_bounds = NULL;
 
 
 	*flag_param = HAS_WIDTH;  /* Tentatively. */
@@ -716,7 +712,7 @@ static regularExp_CHAR *chunk (int paren, int *flag_param,
 
 	if (paren == PAREN) {
 		if (Total_Paren >= NSUBEXP) {
-			swprintf ( (wchar *) Error_Text, 128, L"number of ()'s > %d", (int) NSUBEXP);
+			Melder_sprint (Error_Text,128, U"number of ()'s > ", NSUBEXP);
 			REG_FAIL (Error_Text);
 		}
 
@@ -819,12 +815,12 @@ static regularExp_CHAR *chunk (int paren, int *flag_param,
 	/* Check for proper termination. */
 
 	if (paren != NO_PAREN && *Reg_Parse++ != ')') {
-		REG_FAIL (L"missing right parenthesis \')\'");
+		REG_FAIL (U"missing right parenthesis \')\'");
 	} else if (paren == NO_PAREN && *Reg_Parse != '\0') {
 		if (*Reg_Parse == ')') {
-			REG_FAIL (L"missing left parenthesis \'(\'");
+			REG_FAIL (U"missing left parenthesis \'(\'");
 		} else {
-			REG_FAIL (L"junk on end");  /* "Can't happen" - NOTREACHED */
+			REG_FAIL (U"junk on end");  /* "Can't happen" - NOTREACHED */
 		}
 	}
 
@@ -832,10 +828,10 @@ static regularExp_CHAR *chunk (int paren, int *flag_param,
 
 	if (emit_look_behind_bounds) {
 		if (range_param->lower < 0) {
-			REG_FAIL (L"look-behind does not have a bounded size");
+			REG_FAIL (U"look-behind does not have a bounded size");
 		}
 		if (range_param->upper > 65535L) {
-			REG_FAIL (L"max. look-behind size is too large (>65535)")
+			REG_FAIL (U"max. look-behind size is too large (>65535)")
 		}
 		if (Code_Emit_Ptr != &Compute_Size) {
 			*emit_look_behind_bounds++ = PUT_OFFSET_L (range_param->lower);
@@ -908,12 +904,12 @@ static regularExp_CHAR *chunk (int paren, int *flag_param,
  * pointers of each regex atom together sequentialy.
  *----------------------------------------------------------------------*/
 
-static regularExp_CHAR *alternative (int *flag_param, len_range *range_param) {
+static char32 *alternative (int *flag_param, len_range *range_param) {
 
-	register regularExp_CHAR *ret_val;
-	register regularExp_CHAR *chain;
-	register regularExp_CHAR *latest;
-	int   flags_local;
+	char32 *ret_val;
+	char32 *chain;
+	char32 *latest;
+	int flags_local;
 	len_range range_local;
 
 	*flag_param = WORST;  /* Tentatively. */
@@ -967,11 +963,11 @@ static regularExp_CHAR *alternative (int *flag_param, len_range *range_param) {
  * dispensed with entirely, but the endmarker role is not redundant.
  *----------------------------------------------------------------------*/
 
-static regularExp_CHAR *piece (int *flag_param, len_range *range_param) {
+static char32 *piece (int *flag_param, len_range *range_param) {
 
-	register regularExp_CHAR *ret_val;
-	register regularExp_CHAR *next;
-	register regularExp_CHAR  op_code;
+	char32 *ret_val;
+	char32 *next;
+	char32 op_code;
 	unsigned long  min_max [2] = {REG_ZERO, REG_INFINITY};
 	int            flags_local, i, brace_present = 0;
 	int            lazy = 0, comma_present = 0;
@@ -1013,7 +1009,7 @@ static regularExp_CHAR *piece (int *flag_param, len_range *range_param) {
 			   value for max and min of 65,535 is due to using 2 bytes to store
 			   each value in the compiled regex code. */
 
-			while (isdigit (*Reg_Parse)) {
+			while (isdigit ((int) *Reg_Parse)) {
 				/* (6553 * 10 + 6) > 65535 (16 bit max) */
 
 				if ( (min_max [i] == 6553UL && (*Reg_Parse - '0') <= 5) ||
@@ -1026,11 +1022,9 @@ static regularExp_CHAR *piece (int *flag_param, len_range *range_param) {
 					digit_present [i]++;
 				} else {
 					if (i == 0) {
-						swprintf ( (wchar *) Error_Text, 128, L"min operand of {%lu%c,???} > 65535",
-						           min_max [0], *Reg_Parse);
+						Melder_sprint (Error_Text,128, U"min operand of {", min_max [0], *Reg_Parse, U",???} > 65535");
 					} else {
-						swprintf ( (wchar *) Error_Text, 128, L"max operand of {%lu,%lu%c} > 65535",
-						           min_max [0], min_max [1], *Reg_Parse);
+						Melder_sprint (Error_Text,128, U"max operand of {", min_max [0], U",", min_max [1], *Reg_Parse, U"} > 65535");
 					}
 
 					REG_FAIL (Error_Text);
@@ -1050,17 +1044,17 @@ static regularExp_CHAR *piece (int *flag_param, len_range *range_param) {
 
 		if (digit_present [0] && (min_max [0] == REG_ZERO) && !comma_present) {
 
-			REG_FAIL (L"{0} is an invalid range");
+			REG_FAIL (U"{0} is an invalid range");
 		} else if (digit_present [0] && (min_max [0] == REG_ZERO) &&
 		           digit_present [1] && (min_max [1] == REG_ZERO)) {
 
-			REG_FAIL (L"{0,0} is an invalid range");
+			REG_FAIL (U"{0,0} is an invalid range");
 		} else if (digit_present [1] && (min_max [1] == REG_ZERO)) {
 			if (digit_present [0]) {
-				swprintf ( (wchar *) Error_Text, 128, L"{%lu,0} is an invalid range", min_max [0]);
+				Melder_sprint (Error_Text,128, U"{", min_max [0], U",0} is an invalid range");
 				REG_FAIL (Error_Text);
 			} else {
-				REG_FAIL (L"{,0} is an invalid range");
+				REG_FAIL (U"{,0} is an invalid range");
 			}
 		}
 
@@ -1069,13 +1063,12 @@ static regularExp_CHAR *piece (int *flag_param, len_range *range_param) {
 		} /* {x} means {x,x} */
 
 		if (*Reg_Parse != '}') {
-			REG_FAIL (L"{m,n} specification missing right \'}\'");
+			REG_FAIL (U"{m,n} specification missing right \'}\'");
 
 		} else if (min_max [1] != REG_INFINITY && min_max [0] > min_max [1]) {
 			/* Disallow a backward range. */
 
-			swprintf ( (wchar *) Error_Text, 128, L"{%lu,%lu} is an invalid range",
-			           min_max [0], min_max [1]);
+			Melder_sprint (Error_Text,128, U"{", min_max [0], U",", min_max [1], U"} is an invalid range");
 			REG_FAIL (Error_Text);
 		}
 	}
@@ -1106,7 +1099,7 @@ static regularExp_CHAR *piece (int *flag_param, len_range *range_param) {
 			*range_param = range_local;
 			return (ret_val);
 		} else if (Num_Braces > (int) UCHAR_MAX) {
-			swprintf ( (wchar *) Error_Text, 128, L"number of {m,n} constructs > %d", UCHAR_MAX);
+			Melder_sprint (Error_Text,128, U"number of {m,n} constructs > ", UCHAR_MAX);
 			REG_FAIL (Error_Text);
 		}
 	}
@@ -1123,10 +1116,9 @@ static regularExp_CHAR *piece (int *flag_param, len_range *range_param) {
 
 	if (! (flags_local & HAS_WIDTH)) {
 		if (brace_present) {
-			swprintf ( (wchar *) Error_Text, 128, L"{%lu,%lu} operand could be empty",
-			           min_max [0], min_max [1]);
+			Melder_sprint (Error_Text,128, U"{", min_max [0], U",", min_max [1], U"} operand could be empty");
 		} else {
-			swprintf ( (wchar *) Error_Text, 128, L"%c operand could be empty", op_code);
+			Melder_sprint (Error_Text,128, op_code, U" operand could be empty");
 		}
 
 		REG_FAIL (Error_Text);
@@ -1494,14 +1486,14 @@ static regularExp_CHAR *piece (int *flag_param, len_range *range_param) {
 		/* We get here if the IS_QUANTIFIER macro is not coordinated properly
 		   with this function. */
 
-		REG_FAIL (L"internal error #2, `piece\'");
+		REG_FAIL (U"internal error #2, `piece\'");
 	}
 
 	if (IS_QUANTIFIER (*Reg_Parse)) {
 		if (op_code == '{') {
-			swprintf ( (wchar *) Error_Text, 128, L"nested quantifiers, {m,n}%c", *Reg_Parse);
+			Melder_sprint (Error_Text,128, U"nested quantifiers, {m,n}", *Reg_Parse);
 		} else {
-			swprintf ( (wchar *) Error_Text, 128, L"nested quantifiers, %c%c", op_code, *Reg_Parse);
+			Melder_sprint (Error_Text,128, U"nested quantifiers, ", op_code, *Reg_Parse);
 		}
 
 		REG_FAIL (Error_Text);
@@ -1520,10 +1512,10 @@ static regularExp_CHAR *piece (int *flag_param, len_range *range_param) {
  * is smaller to store and faster to run.
  *----------------------------------------------------------------------*/
 
-static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
+static char32 *atom (int *flag_param, len_range *range_param) {
 
-	register regularExp_CHAR *ret_val;
-	regularExp_CHAR  test;
+	char32 *ret_val;
+	char32  test;
 	int            flags_local;
 	len_range      range_local;
 
@@ -1627,16 +1619,12 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 						Reg_Parse++;
 						ret_val = chunk (NEG_BEHIND_OPEN, &flags_local, &range_local);
 					} else {
-						swprintf ( (wchar *) Error_Text, 128,
-						           L"invalid look-behind syntax, \"(?<%c...)\"",
-						           *Reg_Parse);
+						Melder_sprint (Error_Text,128, U"invalid look-behind syntax, \"(?<", *Reg_Parse, U"...)\"");
 
 						REG_FAIL (Error_Text);
 					}
 				} else {
-					swprintf ( (wchar *) Error_Text, 128,
-					           L"invalid grouping syntax, \"(?%c...)\"",
-					           *Reg_Parse);
+					Melder_sprint (Error_Text,128, U"invalid grouping syntax, \"(?", *Reg_Parse, U"...)\"");
 
 					REG_FAIL (Error_Text);
 				}
@@ -1658,17 +1646,17 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 		case '\0':
 		case '|':
 		case ')':
-			REG_FAIL (L"internal error #3, `atom\'");  /* Supposed to be  */
+			REG_FAIL (U"internal error #3, `atom\'");  /* Supposed to be  */
 			/* caught earlier. */
 		case '?':
 		case '+':
 		case '*':
-			swprintf ( (wchar *) Error_Text, 128, L"%c follows nothing", * (Reg_Parse - 1));
+			Melder_sprint (Error_Text,128, * (Reg_Parse - 1), U" follows nothing");
 			REG_FAIL (Error_Text);
 
 		case '{':
 			if (Enable_Counting_Quantifier) {
-				REG_FAIL (L"{m,n} follows nothing");
+				REG_FAIL (U"{m,n} follows nothing");
 			} else {
 				ret_val = emit_node (EXACTLY); /* Treat braces as literals. */
 				emit_byte ('{');
@@ -1680,9 +1668,9 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 			break;
 
 		case '[': {
-			register unsigned int  second_value;
-			register unsigned int  last_value;
-			regularExp_CHAR last_emit = 0;
+			unsigned int  second_value;
+			unsigned int  last_value;
+			char32 last_emit = 0;
 
 			/* Handle characters that can only occur at the start of a class. */
 
@@ -1751,16 +1739,11 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 							} else if (shortcut_escape (*Reg_Parse,
 							                            NULL,
 							                            CHECK_CLASS_ESCAPE)) {
-								swprintf ( (wchar *) Error_Text, 128,
-								           L"\\%c is not allowed as range operand",
-								           *Reg_Parse);
+								Melder_sprint (Error_Text, 128, U"\\", *Reg_Parse, U" is not allowed as range operand");
 
 								REG_FAIL (Error_Text);
 							} else {
-								swprintf (
-								    (wchar *) Error_Text, 128,
-								    L"\\%c is an invalid char class escape sequence",
-								    *Reg_Parse);
+								Melder_sprint (Error_Text, 128, U"\\", *Reg_Parse, U" is an invalid char class escape sequence");
 
 								REG_FAIL (Error_Text);
 							}
@@ -1780,7 +1763,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 						   lower case. */
 
 						if (second_value - 1 > last_value) {
-							REG_FAIL (L"invalid [] range");
+							REG_FAIL (U"invalid [] range");
 						}
 
 						/* If only one character in range (e.g [a-a]) then this
@@ -1791,7 +1774,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 							emit_class_byte (second_value);
 						}
 
-						last_emit = (regularExp_CHAR) last_value;
+						last_emit = (char32) last_value;
 
 						Reg_Parse++;
 
@@ -1814,9 +1797,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 							/* Specifically disallow shortcut escapes as the start
 							   of a character class range (see comment above.) */
 
-							swprintf ( (wchar *) Error_Text, 128,
-							           L"\\%c not allowed as range operand",
-							           *Reg_Parse);
+							Melder_sprint (Error_Text,128, U"\\", *Reg_Parse, U" not allowed as range operand");
 
 							REG_FAIL (Error_Text);
 						} else {
@@ -1826,9 +1807,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 							shortcut_escape (*Reg_Parse, NULL, EMIT_CLASS_BYTES);
 						}
 					} else {
-						swprintf ( (wchar *) Error_Text, 128,
-						           L"\\%c is an invalid char class escape sequence",
-						           *Reg_Parse);
+						Melder_sprint (Error_Text,128, U"\\", *Reg_Parse, U" is an invalid char class escape sequence");
 
 						REG_FAIL (Error_Text);
 					}
@@ -1845,7 +1824,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 			} /* End of while (*Reg_Parse != '\0' && *Reg_Parse != ']') */
 
 			if (*Reg_Parse != ']') {
-				REG_FAIL (L"missing right \']\'");
+				REG_FAIL (U"missing right \']\'");
 			}
 
 			emit_byte ('\0');
@@ -1890,7 +1869,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 				break;
 			}
 
-			if (wcslen ( (wchar *) Error_Text) > 0) {
+			if (str32len (Error_Text) > 0) {
 				REG_FAIL (Error_Text);
 			}
 
@@ -1905,7 +1884,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 			Reg_Parse--; /* If we fell through from the above code, we are now
                          pointing at the back slash (\) character. */
 			{
-				regularExp_CHAR *parse_save;
+				char32 *parse_save;
 				int   len = 0;
 
 				if (Is_Case_Insensitive) {
@@ -1917,9 +1896,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 				/* Loop until we find a meta character, shortcut escape, back
 				   reference, or end of regex string. */
 
-				for (; *Reg_Parse != '\0' &&
-				        !wcschr ( (wchar *) Meta_Char, (int) *Reg_Parse);
-				        len++) {
+				for (; *Reg_Parse != '\0' && ! str32chr (Meta_Char, *Reg_Parse); len++) {
 
 					/* Save where we are in case we have to back
 					   this character out. */
@@ -1933,7 +1910,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 
 						if ( (test = numeric_escape (*Reg_Parse, &Reg_Parse))) {
 							if (Is_Case_Insensitive) {
-								emit_byte (tolower (test));
+								emit_byte (tolower ((int) test));
 							} else {
 								emit_byte (test);
 							}
@@ -1948,13 +1925,11 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 
 							Reg_Parse--; break;
 						} else {
-							if (wcslen ( (wchar *) Error_Text) == 0) {
+							if (str32len (Error_Text) == 0) {
 								/* None of the above calls generated an error message
 								   so generate our own here. */
 
-								swprintf ( (wchar *) Error_Text, 128,
-								           L"\\%c is an invalid escape sequence",
-								           *Reg_Parse);
+								Melder_sprint (Error_Text,128, U"\\", *Reg_Parse, U" is an invalid escape sequence");
 							}
 
 							REG_FAIL (Error_Text);
@@ -1965,7 +1940,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 						/* Ordinary character */
 
 						if (Is_Case_Insensitive) {
-							emit_byte (tolower (*Reg_Parse));
+							emit_byte (tolower ((int) *Reg_Parse));
 						} else {
 							emit_byte (*Reg_Parse);
 						}
@@ -1994,7 +1969,7 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
 				}
 
 				if (len <= 0) {
-					REG_FAIL (L"internal error #4, `atom\'");
+					REG_FAIL (U"internal error #4, `atom\'");
 				}
 
 				*flag_param |= HAS_WIDTH;
@@ -2023,10 +1998,10 @@ static regularExp_CHAR *atom (int *flag_param, len_range *range_param) {
  * Returns a pointer to the START of the emitted node.
  *----------------------------------------------------------------------*/
 
-static regularExp_CHAR *emit_node (int op_code) {
+static char32 *emit_node (int op_code) {
 
-	register regularExp_CHAR *ret_val;
-	register regularExp_CHAR *ptr;
+	char32 *ret_val;
+	char32 *ptr;
 
 	ret_val = Code_Emit_Ptr; /* Return address of start of node */
 
@@ -2034,7 +2009,7 @@ static regularExp_CHAR *emit_node (int op_code) {
 		Reg_Size += NODE_SIZE;
 	} else {
 		ptr   = ret_val;
-		*ptr++ = (regularExp_CHAR) op_code;
+		*ptr++ = op_code;
 		*ptr++ = '\0'; /* Null "NEXT" pointer. */
 		*ptr++ = '\0';
 
@@ -2050,7 +2025,7 @@ static regularExp_CHAR *emit_node (int op_code) {
  * Emit (if appropriate) a byte of code (usually part of an operand.)
  *----------------------------------------------------------------------*/
 
-static void emit_byte (regularExp_CHAR c) {
+static void emit_byte (char32 c) {
 
 	if (Code_Emit_Ptr == &Compute_Size) {
 		Reg_Size++;
@@ -2066,20 +2041,20 @@ static void emit_byte (regularExp_CHAR c) {
  * class operand.)
  *----------------------------------------------------------------------*/
 
-static void emit_class_byte (regularExp_CHAR c) {
+static void emit_class_byte (char32 c) {
 
 	if (Code_Emit_Ptr == &Compute_Size) {
 		Reg_Size++;
 
-		if (Is_Case_Insensitive && isalpha (c)) {
+		if (Is_Case_Insensitive && iswalpha ((int) c)) {
 			Reg_Size++;
 		}
-	} else if (Is_Case_Insensitive && isalpha (c)) {
+	} else if (Is_Case_Insensitive && iswalpha ((int) c)) {
 		/* For case insensitive character classes, emit both upper and lower case
 		   versions of alphabetical characters. */
 
-		*Code_Emit_Ptr++ = tolower (c);
-		*Code_Emit_Ptr++ = toupper (c);
+		*Code_Emit_Ptr++ = (char32) towlower ((int) c);
+		*Code_Emit_Ptr++ = (char32) towupper ((int) c);
 	} else {
 		*Code_Emit_Ptr++ = c;
 	}
@@ -2091,13 +2066,13 @@ static void emit_class_byte (regularExp_CHAR c) {
  * Emit nodes that need special processing.
  *----------------------------------------------------------------------*/
 
-static regularExp_CHAR *emit_special (
-    regularExp_CHAR op_code,
+static char32 *emit_special (
+    char32 op_code,
     unsigned long test_val,
-    int  index) {
+    int index) {
 
-	register regularExp_CHAR *ret_val = &Compute_Size;
-	register regularExp_CHAR *ptr;
+	char32 *ret_val = &Compute_Size;
+	char32 *ptr;
 
 	if (Code_Emit_Ptr == &Compute_Size) {
 		switch (op_code) {
@@ -2121,7 +2096,7 @@ static regularExp_CHAR *emit_special (
 		ptr     = Code_Emit_Ptr;
 
 		if (op_code == INC_COUNT || op_code == TEST_COUNT) {
-			*ptr++ = (regularExp_CHAR) index;
+			*ptr++ = (char32) index;
 
 			if (op_code == TEST_COUNT) {
 				*ptr++ = PUT_OFFSET_L (test_val);
@@ -2149,17 +2124,17 @@ static regularExp_CHAR *emit_special (
  * where the new node is to be inserted.
  *----------------------------------------------------------------------*/
 
-static regularExp_CHAR *insert (
-    regularExp_CHAR  op,
-    regularExp_CHAR *insert_pos,
-    long           min,
-    long           max,
-    int            index) {
+static char32 *insert (
+    char32 op,
+    char32 *insert_pos,
+    long min,
+    long max,
+    int index) {
 
-	register regularExp_CHAR *src;
-	register regularExp_CHAR *dst;
-	regularExp_CHAR *place;
-	int   insert_size = NODE_SIZE;
+	char32 *src;
+	char32 *dst;
+	char32 *place;
+	int insert_size = NODE_SIZE;
 
 	if (op == BRACE || op == LAZY_BRACE) {
 		/* Make room for the min and max values. */
@@ -2198,7 +2173,7 @@ static regularExp_CHAR *insert (
 		*place++ = PUT_OFFSET_L (max);
 		*place++ = PUT_OFFSET_R (max);
 	} else if (op == INIT_COUNT) {
-		*place++ = (regularExp_CHAR) index;
+		*place++ = (char32) index;
 	}
 
 	return place; /* Return a pointer to the start of the code moved. */
@@ -2208,11 +2183,11 @@ static regularExp_CHAR *insert (
  * tail - Set the next-pointer at the end of a node chain.
  *----------------------------------------------------------------------*/
 
-static void tail (regularExp_CHAR *search_from, regularExp_CHAR *point_to) {
+static void tail (char32 *search_from, char32 *point_to) {
 
-	register regularExp_CHAR *scan;
-	register regularExp_CHAR *next;
-	register          int   offset;
+	char32 *scan;
+	char32 *next;
+	int offset;
 
 	if (search_from == &Compute_Size) {
 		return;
@@ -2250,7 +2225,7 @@ static void tail (regularExp_CHAR *search_from, regularExp_CHAR *point_to) {
  * Perform a tail operation on (ptr + offset).
  *--------------------------------------------------------------------*/
 
-static void offset_tail (regularExp_CHAR *ptr, int offset, regularExp_CHAR *val) {
+static void offset_tail (char32 *ptr, int offset, char32 *val) {
 
 	if (ptr == &Compute_Size || ptr == NULL) {
 		return;
@@ -2266,7 +2241,7 @@ static void offset_tail (regularExp_CHAR *ptr, int offset, regularExp_CHAR *val)
  * BRANCH node.
  *--------------------------------------------------------------------*/
 
-static void branch_tail (regularExp_CHAR *ptr, int offset, regularExp_CHAR *val) {
+static void branch_tail (char32 *ptr, int offset, char32 *val) {
 
 	if (ptr == &Compute_Size || ptr == NULL || GET_OP_CODE (ptr) != BRANCH) {
 		return;
@@ -2314,15 +2289,15 @@ static void branch_tail (regularExp_CHAR *ptr, int offset, regularExp_CHAR *val)
  *
  *--------------------------------------------------------------------*/
 
-static regularExp_CHAR *shortcut_escape (
-    regularExp_CHAR  c,
+static char32 *shortcut_escape (
+    char32  c,
     int           *flag_param,
     int            emit) {
 
-	register regularExp_CHAR *klas   = NULL;
-	static   regularExp_CHAR *codes   = (regularExp_CHAR *) L"ByYdDlLsSwW";
-	regularExp_CHAR *ret_val = (regularExp_CHAR *) 1; /* Assume success. */
-	regularExp_CHAR *valid_codes;
+	char32 *klas   = NULL;
+	static const char32 *codes = U"ByYdDlLsSwW";
+	char32 *ret_val = (char32 *) 1; /* Assume success. */
+	const char32 *valid_codes;
 
 	if (emit == EMIT_CLASS_BYTES || emit == CHECK_CLASS_ESCAPE) {
 		valid_codes = codes + 3; /* \B, \y and \Y are not allowed in classes */
@@ -2330,7 +2305,7 @@ static regularExp_CHAR *shortcut_escape (
 		valid_codes = codes;
 	}
 
-	if (!wcschr ( (wchar *) valid_codes, (int) c)) {
+	if (! str32chr (valid_codes, c)) {
 		return NULL; /* Not a valid shortcut escape sequence */
 	} else if (emit == CHECK_ESCAPE || emit == CHECK_CLASS_ESCAPE) {
 		return ret_val; /* Just checking if this is a valid shortcut escape. */
@@ -2342,10 +2317,8 @@ static regularExp_CHAR *shortcut_escape (
 			if (emit == EMIT_CLASS_BYTES) {
 				klas = ASCII_Digits;
 			} else if (emit == EMIT_NODE) {
-				ret_val = (islower (c) ? emit_node (DIGIT)
-				           : emit_node (NOT_DIGIT));
+				ret_val = (iswlower ((int) c) ? emit_node (DIGIT) : emit_node (NOT_DIGIT));
 			}
-
 			break;
 
 		case 'l':
@@ -2353,10 +2326,8 @@ static regularExp_CHAR *shortcut_escape (
 			if (emit == EMIT_CLASS_BYTES) {
 				klas = Letter_Char;
 			} else if (emit == EMIT_NODE) {
-				ret_val = (islower (c) ? emit_node (LETTER)
-				           : emit_node (NOT_LETTER));
+				ret_val = (iswlower ((int) c) ? emit_node (LETTER) : emit_node (NOT_LETTER));
 			}
-
 			break;
 
 		case 's':
@@ -2365,18 +2336,14 @@ static regularExp_CHAR *shortcut_escape (
 				if (Match_Newline) {
 					emit_byte ('\n');
 				}
-
 				klas = White_Space;
 			} else if (emit == EMIT_NODE) {
 				if (Match_Newline) {
-					ret_val = (islower (c) ? emit_node (SPACE_NL)
-					           : emit_node (NOT_SPACE_NL));
+					ret_val = (iswlower ((int) c) ? emit_node (SPACE_NL) : emit_node (NOT_SPACE_NL));
 				} else {
-					ret_val = (islower (c) ? emit_node (SPACE)
-					           : emit_node (NOT_SPACE));
+					ret_val = (iswlower ((int) c) ? emit_node (SPACE) : emit_node (NOT_SPACE));
 				}
 			}
-
 			break;
 
 		case 'w':
@@ -2384,10 +2351,8 @@ static regularExp_CHAR *shortcut_escape (
 			if (emit == EMIT_CLASS_BYTES) {
 				klas = Word_Char;
 			} else if (emit == EMIT_NODE) {
-				ret_val = (islower (c) ? emit_node (WORD_CHAR)
-				           : emit_node (NOT_WORD_CHAR));
+				ret_val = (iswlower ((int) c) ? emit_node (WORD_CHAR) : emit_node (NOT_WORD_CHAR));
 			}
-
 			break;
 
 			/* Since the delimiter table is not available at regex compile time \B,
@@ -2395,40 +2360,34 @@ static regularExp_CHAR *shortcut_escape (
 			   will be available for these nodes to use. */
 
 		case 'y':
-
 			if (emit == EMIT_NODE) {
 				ret_val = emit_node (IS_DELIM);
 			} else {
-				REG_FAIL (L"internal error #5 `shortcut_escape\'");
+				REG_FAIL (U"internal error #5 `shortcut_escape\'");
 			}
-
 			break;
 
 		case 'Y':
-
 			if (emit == EMIT_NODE) {
 				ret_val = emit_node (NOT_DELIM);
 			} else {
-				REG_FAIL (L"internal error #6 `shortcut_escape\'");
+				REG_FAIL (U"internal error #6 `shortcut_escape\'");
 			}
-
 			break;
 
 		case 'B':
-
 			if (emit == EMIT_NODE) {
 				ret_val = emit_node (NOT_BOUNDARY);
 			} else {
-				REG_FAIL (L"internal error #7 `shortcut_escape\'");
+				REG_FAIL (U"internal error #7 `shortcut_escape\'");
 			}
-
 			break;
 
 		default:
 			/* We get here if there isn't a case for every character in
 			   the string "codes" */
 
-			REG_FAIL (L"internal error #8 `shortcut_escape\'");
+			REG_FAIL (U"internal error #8 `shortcut_escape\'");
 	}
 
 	if (emit == EMIT_NODE  &&  c != 'B') {
@@ -2460,11 +2419,11 @@ static regularExp_CHAR *shortcut_escape (
  * \0000 is specified.
  *--------------------------------------------------------------------*/
 
-static regularExp_CHAR numeric_escape (
-    regularExp_CHAR    c,
-    regularExp_CHAR  **parse) {
+static char32 numeric_escape (
+    char32 c,
+    char32 **parse) {
 
-	static regularExp_CHAR digits [] = { 'f', 'e', 'd', 'c', 'b', 'a', 'F', 'E', 'D', 'C', 'B', 'A', '9', '8', '7', '6', '5', '4', '3', '2', '1', '0', '\0' };
+	static char32 digits [] = { 'f', 'e', 'd', 'c', 'b', 'a', 'F', 'E', 'D', 'C', 'B', 'A', '9', '8', '7', '6', '5', '4', '3', '2', '1', '0', '\0' };
 
 	static unsigned int digit_val [] = {
 		15, 14, 13, 12, 11, 10,                  /* Lower case Hex digits */
@@ -2472,9 +2431,9 @@ static regularExp_CHAR numeric_escape (
 		9,  8,  7,  6,  5,  4,  3,  2,  1,  0
 	}; /* Decimal Digits */
 
-	regularExp_CHAR *scan;
-	regularExp_CHAR *pos_ptr;
-	regularExp_CHAR *digit_str;
+	char32 *scan;
+	char32 *pos_ptr;
+	char32 *digit_str;
 	unsigned int   value     =  0;
 	unsigned int   radix     =  8;
 	int   width     =  3; /* Can not be bigger than \0377 */
@@ -2502,7 +2461,7 @@ static regularExp_CHAR numeric_escape (
 
 	scan = *parse; scan++; /* Only change *parse on success. */
 
-	pos_ptr = (regularExp_CHAR *) wcschr ( (wchar *) digit_str, (int) * scan);
+	pos_ptr = str32chr (digit_str, *scan);
 
 	for (i = 0; pos_ptr != NULL && (i < width); i++) {
 		pos   = (pos_ptr - digit_str) + pos_delta;
@@ -2526,16 +2485,16 @@ static regularExp_CHAR numeric_escape (
 		}
 
 		scan++;
-		pos_ptr = (regularExp_CHAR *) wcschr ( (wchar *) digit_str, (int) * scan);
+		pos_ptr = str32chr (digit_str, *scan);
 	}
 
 	/* Handle the case of "\0" i.e. trying to specify a NULL character. */
 
 	if (value == 0) {
 		if (c == '0') {
-			swprintf ( (wchar *) Error_Text, 128, L"\\00 is an invalid octal escape");
+			Melder_sprint (Error_Text,128, U"\\00 is an invalid octal escape");
 		} else {
-			swprintf ( (wchar *) Error_Text, 128, L"\\%c0 is an invalid hexadecimal escape", c);
+			Melder_sprint (Error_Text,128, U"\\", c, U"0 is an invalid hexadecimal escape");
 		}
 	} else {
 		/* Point to the last character of the number on success. */
@@ -2544,7 +2503,7 @@ static regularExp_CHAR numeric_escape (
 		*parse = scan;
 	}
 
-	return (regularExp_CHAR) value;
+	return value;
 }
 
 /*--------------------------------------------------------------------*
@@ -2557,9 +2516,9 @@ static regularExp_CHAR numeric_escape (
  * escape.
  *--------------------------------------------------------------------*/
 
-static regularExp_CHAR literal_escape (regularExp_CHAR c) {
+static char32 literal_escape (char32 c) {
 
-	static regularExp_CHAR valid_escape [] =  {
+	static char32 valid_escape [] =  {
 		'a',   'b',
 		'e',
 		'f',   'n',   'r',   't',   'v',   '(',    ')',   '-',   '[',   ']',
@@ -2567,7 +2526,7 @@ static regularExp_CHAR literal_escape (regularExp_CHAR c) {
 		'+',   '?',   '&',   '\0'
 	};
 
-	static regularExp_CHAR value [] = {
+	static char32 value [] = {
 		'\a',  '\b',
 #ifdef EBCDIC_CHARSET
 		0x27,  /* Escape character in IBM's EBCDIC character set. */
@@ -2604,14 +2563,14 @@ static regularExp_CHAR literal_escape (regularExp_CHAR c) {
  * text previously matched by another regex. *** IMPLEMENT LATER ***
  *--------------------------------------------------------------------*/
 
-static regularExp_CHAR *back_ref (
-    regularExp_CHAR *c,
+static char32 *back_ref (
+    char32 *c,
     int           *flag_param,
     int            emit) {
 
 	int  paren_no, c_offset = 0, is_cross_regex = 0;
 
-	regularExp_CHAR *ret_val;
+	char32 *ret_val;
 
 	/* Implement cross regex backreferences later. */
 
@@ -2620,9 +2579,9 @@ static regularExp_CHAR *back_ref (
 	   is_cross_regex++;
 	} */
 
-	paren_no = (int) (* (c + c_offset) - (regularExp_CHAR) ('0'));
+	paren_no = (int) (* (c + c_offset) - (char32) ('0'));
 
-	if (!isdigit (* (c + c_offset)) || /* Only \1, \2, ... \9 are supported.  */
+	if (!iswdigit ((int) * (c + c_offset)) || /* Only \1, \2, ... \9 are supported.  */
 	        paren_no == 0) {              /* Should be caught by numeric_escape. */
 
 		return NULL;
@@ -2631,7 +2590,7 @@ static regularExp_CHAR *back_ref (
 	/* Make sure parentheses for requested back-reference are complete. */
 
 	if (!is_cross_regex && !TEST_BIT (Closed_Parens, paren_no)) {
-		swprintf ( (wchar *) Error_Text, 128, L"\\%d is an illegal back reference", paren_no);
+		Melder_sprint (Error_Text,128, U"\\", paren_no, U" is an illegal back reference");
 		return NULL;
 	}
 
@@ -2653,13 +2612,13 @@ static regularExp_CHAR *back_ref (
 			}
 		}
 
-		emit_byte ( (regularExp_CHAR) paren_no);
+		emit_byte ((char32) paren_no);
 
 		if (is_cross_regex || TEST_BIT (Paren_Has_Width, paren_no)) {
 			*flag_param |= HAS_WIDTH;
 		}
 	} else if (emit == CHECK_ESCAPE) {
-		ret_val = (regularExp_CHAR *) 1;
+		ret_val = (char32 *) 1;
 	} else {
 		ret_val = NULL;
 	}
@@ -2673,19 +2632,17 @@ static regularExp_CHAR *back_ref (
 
 /* Global work variables for `ExecRE'. */
 
-static regularExp_CHAR  *Reg_Input;           /* String-input pointer.         */
-static regularExp_CHAR  *Start_Of_String;     /* Beginning of input, for ^     */
+static char32  *Reg_Input;           /* String-input pointer.         */
+static const char32  *Start_Of_String;     /* Beginning of input, for ^     */
 /* and < checks.                 */
-static regularExp_CHAR  *End_Of_String;       /* Logical end of input (if
-   				               supplied, till \0 otherwise)  */
-static regularExp_CHAR  *Look_Behind_To;      /* Position till were look behind
-                                               can safely check back         */
-static regularExp_CHAR **Start_Ptr_Ptr;       /* Pointer to `startp' array.    */
-static regularExp_CHAR **End_Ptr_Ptr;         /* Ditto for `endp'.             */
-static regularExp_CHAR  *Extent_Ptr_FW;       /* Forward extent pointer        */
-static regularExp_CHAR  *Extent_Ptr_BW;       /* Backward extent pointer       */
-static regularExp_CHAR  *Back_Ref_Start [10]; /* Back_Ref_Start [0] and        */
-static regularExp_CHAR  *Back_Ref_End   [10]; /* Back_Ref_End [0] are not      */
+static const char32  *End_Of_String;       /* Logical end of input (if supplied, till \0 otherwise)  */
+static const char32  *Look_Behind_To;      /* Position till were look behind can safely check back   */
+static char32 **Start_Ptr_Ptr;       /* Pointer to `startp' array.    */
+static char32 **End_Ptr_Ptr;         /* Ditto for `endp'.             */
+static char32  *Extent_Ptr_FW;       /* Forward extent pointer        */
+static char32  *Extent_Ptr_BW;       /* Backward extent pointer       */
+static char32  *Back_Ref_Start [10]; /* Back_Ref_Start [0] and        */
+static char32  *Back_Ref_End   [10]; /* Back_Ref_End [0] are not      */
 /* used. This simplifies         */
 /* indexing.                     */
 /*
@@ -2700,8 +2657,7 @@ static regularExp_CHAR  *Back_Ref_End   [10]; /* Back_Ref_End [0] are not      *
 static int Recursion_Count;          /* Recursion counter */
 static int Recursion_Limit_Exceeded; /* Recursion limit exceeded flag */
 
-#define AT_END_OF_STRING(X) (*(X) == (regularExp_CHAR)'\0' ||\
-                             (End_Of_String != NULL && (X) >= End_Of_String))
+#define AT_END_OF_STRING(X) (*(X) == U'\0' || (End_Of_String != NULL && (X) >= End_Of_String))
 
 /* static regexp *Cross_Regex_Backref; */
 
@@ -2720,17 +2676,17 @@ static struct brace_counts *Brace;
 
 /* Default table for determining whether a character is a word delimiter. */
 
-static regularExp_CHAR  Default_Delimiters [UCHAR_MAX] = {0};
+static char32 Default_Delimiters [UCHAR_MAX] = {0};
 
-static regularExp_CHAR *Current_Delimiters;  /* Current delimiter table */
+static char32 *Current_Delimiters;  /* Current delimiter table */
 
 /* Forward declarations of functions used by `ExecRE' */
 
-static int             attempt (regexp *, regularExp_CHAR *);
-static int             match (regularExp_CHAR *, int *);
-static unsigned long   greedy (regularExp_CHAR *, long);
-static void            adjustcase (regularExp_CHAR *, int, regularExp_CHAR);
-static regularExp_CHAR *makeDelimiterTable (regularExp_CHAR *, regularExp_CHAR *);
+static int             attempt (regexp *, char32 *);
+static int             match (char32 *, int *);
+static unsigned long   greedy (char32 *, long);
+static void            adjustcase (char32 *, int, char32);
+static char32 *        makeDelimiterTable (const char32 *, char32 *);
 
 /*
  * ExecRE - match a `regexp' structure against a string
@@ -2760,37 +2716,37 @@ static regularExp_CHAR *makeDelimiterTable (regularExp_CHAR *, regularExp_CHAR *
 int ExecRE (
     regexp *prog,
     regexp *cross_regex_backref,
-    const regularExp_CHAR   *string,
-    const regularExp_CHAR   *end,
+    const char32   *string,
+    const char32   *end,
     int     reverse,
-    regularExp_CHAR    prev_char,
-    regularExp_CHAR    succ_char,
-    const regularExp_CHAR   *delimiters,
-    const regularExp_CHAR   *look_behind_to,
-    const regularExp_CHAR   *match_to) {
-
-	register regularExp_CHAR  *str;
-	regularExp_CHAR **s_ptr;
-	regularExp_CHAR **e_ptr;
+    char32    prev_char,
+    char32    succ_char,
+    const char32   *delimiters,
+    const char32   *look_behind_to,
+    const char32   *match_to) {
+
+	char32 *str;
+	char32 **s_ptr;
+	char32 **e_ptr;
 	int    ret_val = 0;
-	regularExp_CHAR tempDelimitTable [256];
+	char32 tempDelimitTable [256];
 	int    i;
 	(void) cross_regex_backref;
 
-	s_ptr = (regularExp_CHAR **) prog->startp;
-	e_ptr = (regularExp_CHAR **) prog->endp;
+	s_ptr = (char32 **) prog->startp;
+	e_ptr = (char32 **) prog->endp;
 
 	/* Check for valid parameters. */
 
 	if (prog == NULL || string == NULL) {
-		reg_error (L"NULL parameter to `ExecRE\'");
+		reg_error (U"NULL parameter to `ExecRE\'");
 		goto SINGLE_RETURN;
 	}
 
 	/* Check validity of program. */
 
 	if (U_CHAR_AT (prog->program) != MAGIC) {
-		reg_error (L"corrupted program");
+		reg_error (U"corrupted program");
 		goto SINGLE_RETURN;
 	}
 
@@ -2799,17 +2755,15 @@ int ExecRE (
 	if (delimiters == NULL) {
 		Current_Delimiters = Default_Delimiters;
 	} else {
-		Current_Delimiters = makeDelimiterTable (
-		                         (regularExp_CHAR *) delimiters,
-		                         (regularExp_CHAR *) tempDelimitTable);
+		Current_Delimiters = makeDelimiterTable (delimiters, tempDelimitTable);
 	}
 
 	/* Remember the logical end of the string. */
 
-	End_Of_String = (regularExp_CHAR *) match_to;
+	End_Of_String = match_to;
 
 	if (end == NULL && reverse) {
-		for (end = string; !AT_END_OF_STRING ( (regularExp_CHAR *) end); end++) {
+		for (end = string; !AT_END_OF_STRING (end); end++) {
 			;
 		}
 		succ_char = '\n';
@@ -2825,13 +2779,13 @@ int ExecRE (
 
 	/* Remember the beginning of the string for matching BOL */
 
-	Start_Of_String    = (regularExp_CHAR *) string;
-	Look_Behind_To     = (regularExp_CHAR *) (look_behind_to ? look_behind_to : string);
+	Start_Of_String    = string;
+	Look_Behind_To     = look_behind_to ? look_behind_to : string;
 
 	Prev_Is_BOL        = ( (prev_char == '\n') || (prev_char == '\0') ? 1 : 0);
 	Succ_Is_EOL        = ( (succ_char == '\n') || (succ_char == '\0') ? 1 : 0);
-	Prev_Is_Delim      = (Current_Delimiters [ (regularExp_CHAR) prev_char] ? 1 : 0);
-	Succ_Is_Delim      = (Current_Delimiters [ (regularExp_CHAR) succ_char] ? 1 : 0);
+	Prev_Is_Delim      = (Current_Delimiters [prev_char] ? 1 : 0);
+	Succ_Is_Delim      = (Current_Delimiters [succ_char] ? 1 : 0);
 
 	Total_Paren        = (int) (prog->program [1]);
 	Num_Braces         = (int) (prog->program [2]);
@@ -2848,7 +2802,7 @@ int ExecRE (
 		    (brace_counts *) malloc (sizeof (brace_counts) * (size_t) Num_Braces);
 
 		if (Brace == NULL) {
-			reg_error (L"out of memory in `ExecRE\'");
+			reg_error (U"out of memory in `ExecRE\'");
 			goto SINGLE_RETURN;
 		}
 	} else {
@@ -2862,21 +2816,21 @@ int ExecRE (
 	   can only specify \1, \2, ... \9. */
 
 	for (i = 9; i > 0; i--) {
-		*s_ptr++ = (regularExp_CHAR *) string;
-		*e_ptr++ = (regularExp_CHAR *) string;
+		*s_ptr++ = (char32 *) string;
+		*e_ptr++ = (char32 *) string;
 	}
 
 	if (!reverse) { /* Forward Search */
 		if (prog->anchor) {
 			/* Search is anchored at BOL */
 
-			if (attempt (prog, (regularExp_CHAR *) string)) {
+			if (attempt (prog, (char32 *) string)) {
 				ret_val = 1;
 				goto SINGLE_RETURN;
 			}
 
-			for (str = (regularExp_CHAR *) string;
-			        !AT_END_OF_STRING (str) && str != (regularExp_CHAR *) end && !Recursion_Limit_Exceeded;
+			for (str = (char32 *) string;
+			        !AT_END_OF_STRING (str) && str != (char32 *) end && !Recursion_Limit_Exceeded;
 			        str++) {
 
 				if (*str == '\n') {
@@ -2892,11 +2846,11 @@ int ExecRE (
 		} else if (prog->match_start != '\0') {
 			/* We know what char match must start with. */
 
-			for (str = (regularExp_CHAR *) string;
-			        !AT_END_OF_STRING (str) && str != (regularExp_CHAR *) end && !Recursion_Limit_Exceeded;
+			for (str = (char32 *) string;
+			        !AT_END_OF_STRING (str) && str != (char32 *) end && !Recursion_Limit_Exceeded;
 			        str++) {
 
-				if (*str == (regularExp_CHAR) prog->match_start) {
+				if (*str == (char32) prog->match_start) {
 					if (attempt (prog, str)) {
 						ret_val = 1;
 						break;
@@ -2908,8 +2862,8 @@ int ExecRE (
 		} else {
 			/* General case */
 
-			for (str = (regularExp_CHAR *) string;
-			        !AT_END_OF_STRING (str) && str != (regularExp_CHAR *) end && !Recursion_Limit_Exceeded;
+			for (str = (char32 *) string;
+			        !AT_END_OF_STRING (str) && str != (char32 *) end && !Recursion_Limit_Exceeded;
 			        str++) {
 
 				if (attempt (prog, str)) {
@@ -2919,7 +2873,7 @@ int ExecRE (
 			}
 
 			/* Beware of a single $ matching \0 */
-			if (!Recursion_Limit_Exceeded && !ret_val && AT_END_OF_STRING (str) && str != (regularExp_CHAR *) end) {
+			if (!Recursion_Limit_Exceeded && !ret_val && AT_END_OF_STRING (str) && str != (char32 *) end) {
 				if (attempt (prog, str)) {
 					ret_val = 1;
 				}
@@ -2930,16 +2884,14 @@ int ExecRE (
 	} else { /* Search reverse, same as forward, but loops run backward */
 
 		/* Make sure that we don't start matching beyond the logical end */
-		if (End_Of_String != NULL && (regularExp_CHAR *) end > End_Of_String) {
-			end = (const regularExp_CHAR *) End_Of_String;
+		if (End_Of_String != NULL && (char32 *) end > End_Of_String) {
+			end = (const char32 *) End_Of_String;
 		}
 
 		if (prog->anchor) {
 			/* Search is anchored at BOL */
 
-			for (str = (regularExp_CHAR *) (end - 1);
-			        str >= (regularExp_CHAR *) string && !Recursion_Limit_Exceeded;
-			        str--) {
+			for (str = (char32 *) (end - 1); str >= (char32 *) string && !Recursion_Limit_Exceeded; str--) {
 
 				if (*str == '\n') {
 					if (attempt (prog, str + 1)) {
@@ -2949,7 +2901,7 @@ int ExecRE (
 				}
 			}
 
-			if (!Recursion_Limit_Exceeded && attempt (prog, (regularExp_CHAR *) string)) {
+			if (!Recursion_Limit_Exceeded && attempt (prog, (char32 *) string)) {
 				ret_val = 1;
 				goto SINGLE_RETURN;
 			}
@@ -2958,11 +2910,9 @@ int ExecRE (
 		} else if (prog->match_start != '\0') {
 			/* We know what char match must start with. */
 
-			for (str = (regularExp_CHAR *) end;
-			        str >= (regularExp_CHAR *) string && !Recursion_Limit_Exceeded;
-			        str--) {
+			for (str = (char32 *) end; str >= (char32 *) string && !Recursion_Limit_Exceeded; str--) {
 
-				if (*str == (regularExp_CHAR) prog->match_start) {
+				if (*str == (char32) prog->match_start) {
 					if (attempt (prog, str)) {
 						ret_val = 1;
 						break;
@@ -2974,9 +2924,7 @@ int ExecRE (
 		} else {
 			/* General case */
 
-			for (str = (regularExp_CHAR *) end;
-			        str >= (regularExp_CHAR *) string && !Recursion_Limit_Exceeded;
-			        str--) {
+			for (str = (char32 *) end; str >= (char32 *) string && !Recursion_Limit_Exceeded; str--) {
 
 				if (attempt (prog, str)) {
 					ret_val = 1;
@@ -3004,7 +2952,7 @@ SINGLE_RETURN: if (Brace) {
  *
  *--------------------------------------------------------------------*/
 
-static int init_ansi_classes (void) {
+static int init_ansi_classes () {
 
 	static int initialized = 0;
 	static int underscore = (int) '_';
@@ -3018,11 +2966,11 @@ static int init_ansi_classes (void) {
 
 		for (i = 1; i < (int) UCHAR_MAX; i++) {
 			if (isalnum (i) || i == underscore) {
-				Word_Char [word_count++] = (regularExp_CHAR) i;
+				Word_Char [word_count++] = (char32) i;
 			}
 
 			if (isalpha (i)) {
-				Letter_Char [letter_count++] = (regularExp_CHAR) i;
+				Letter_Char [letter_count++] = (char32) i;
 			}
 
 			/* Note: Whether or not newline is considered to be whitespace is
@@ -3030,7 +2978,7 @@ static int init_ansi_classes (void) {
 			   here. */
 
 			if (isspace (i) && (i != (int) '\n')) {
-				White_Space [space_count++] = (regularExp_CHAR) i;
+				White_Space [space_count++] = (char32) i;
 			}
 
 			/* Make sure arrays are big enough.  ("- 2" because of zero array
@@ -3040,7 +2988,7 @@ static int init_ansi_classes (void) {
 			        space_count  > (WHITE_SPACE_SIZE - 2) ||
 			        letter_count > (ALNUM_CHAR_SIZE  - 2)) {
 
-				reg_error (L"internal error #9 `init_ansi_classes\'");
+				reg_error (U"internal error #9 `init_ansi_classes\'");
 				return (0);
 			}
 		}
@@ -3057,18 +3005,18 @@ static int init_ansi_classes (void) {
  * attempt - try match at specific point, returns: 0 failure, 1 success
  *----------------------------------------------------------------------*/
 
-static int attempt (regexp *prog, regularExp_CHAR *string) {
+static int attempt (regexp *prog, char32 *string) {
 
-	register          int    i;
-	register regularExp_CHAR **s_ptr;
-	register regularExp_CHAR **e_ptr;
+	int    i;
+	char32 **s_ptr;
+	char32 **e_ptr;
 	int    branch_index = 0; /* Must be set to zero ! */
 
 	Reg_Input      = string;
-	Start_Ptr_Ptr  = (regularExp_CHAR **) prog->startp;
-	End_Ptr_Ptr    = (regularExp_CHAR **) prog->endp;
-	s_ptr          = (regularExp_CHAR **) prog->startp;
-	e_ptr          = (regularExp_CHAR **) prog->endp;
+	Start_Ptr_Ptr  = (char32 **) prog->startp;
+	End_Ptr_Ptr    = (char32 **) prog->endp;
+	s_ptr          = (char32 **) prog->startp;
+	e_ptr          = (char32 **) prog->endp;
 
 	/* Reset the recursion counter. */
 	Recursion_Count = 0;
@@ -3083,12 +3031,12 @@ static int attempt (regexp *prog, regularExp_CHAR *string) {
 		*e_ptr++ = NULL;
 	}
 
-	if (match ( (regularExp_CHAR *) (prog->program + REGEX_START_OFFSET),
+	if (match ( (char32 *) (prog->program + REGEX_START_OFFSET),
 	            &branch_index)) {
-		prog->startp [0] = (regularExp_CHAR *) string;
-		prog->endp   [0] = (regularExp_CHAR *) Reg_Input;     /* <-- One char AFTER  */
-		prog->extentpBW  = (regularExp_CHAR *) Extent_Ptr_BW; /*     matched string! */
-		prog->extentpFW  = (regularExp_CHAR *) Extent_Ptr_FW;
+		prog->startp [0] = (char32 *) string;
+		prog->endp   [0] = (char32 *) Reg_Input;     /* <-- One char AFTER  */
+		prog->extentpBW  = (char32 *) Extent_Ptr_BW; /*     matched string! */
+		prog->extentpFW  = (char32 *) Extent_Ptr_FW;
 		prog->top_branch = branch_index;
 
 		return (1);
@@ -3112,15 +3060,15 @@ static int attempt (regexp *prog, regularExp_CHAR *string) {
 #define CHECK_RECURSION_LIMIT\
  if (Recursion_Limit_Exceeded) MATCH_RETURN (0);
 
-static int match (regularExp_CHAR *prog, int *branch_index_param) {
+static int match (char32 *prog, int *branch_index_param) {
 
-	register regularExp_CHAR *scan;  /* Current node. */
-	regularExp_CHAR *next;  /* Next node. */
-	register int next_ptr_offset;  /* Used by the NEXT_PTR () macro */
+	char32 *scan;  /* Current node. */
+	char32 *next;  /* Next node. */
+	int next_ptr_offset;  /* Used by the NEXT_PTR () macro */
 
 	if (++Recursion_Count > REGEX_RECURSION_LIMIT) {
 		if (!Recursion_Limit_Exceeded) { /* Prevent duplicate errors */
-			reg_error (L"recursion limit exceeded, please respecify expression");
+			reg_error (U"recursion limit exceeded, please respecify expression");
 		}
 		Recursion_Limit_Exceeded = 1;
 		MATCH_RETURN (0);
@@ -3134,8 +3082,8 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 
 		switch (GET_OP_CODE (scan)) {
 			case BRANCH: {
-				register regularExp_CHAR *save;
-				register int branch_index_local = 0;
+				char32 *save;
+				int branch_index_local = 0;
 
 				if (GET_OP_CODE (next) != BRANCH) {  /* No choice. */
 					next = OPERAND (scan);   /* Avoid recursion. */
@@ -3165,8 +3113,8 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 			break;
 
 			case EXACTLY: {
-				register int            len;
-				register regularExp_CHAR *opnd;
+				int len;
+				char32 *opnd;
 
 				opnd = OPERAND (scan);
 
@@ -3176,14 +3124,13 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 					MATCH_RETURN (0);
 				}
 
-				len = wcslen ( (wchar *) opnd);
+				len = str32len (opnd);
 
 				if (End_Of_String != NULL && Reg_Input + len > End_Of_String) {
 					MATCH_RETURN (0);
 				}
 
-				if (len > 1  &&
-				        wcsncmp ( (wchar *) opnd, (wchar *) Reg_Input, len) != 0) {
+				if (len > 1  && str32ncmp (opnd, Reg_Input, len) != 0) {
 
 					MATCH_RETURN (0);
 				}
@@ -3194,8 +3141,8 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 			break;
 
 			case SIMILAR: {
-				register regularExp_CHAR *opnd;
-				register regularExp_CHAR  test;
+				char32 *opnd;
+				char32  test;
 
 				opnd = OPERAND (scan);
 
@@ -3204,7 +3151,7 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 
 				while ( (test = *opnd++) != '\0') {
 					if (AT_END_OF_STRING (Reg_Input) ||
-					        tolower (*Reg_Input++) != test) {
+					        towlower ((int) *Reg_Input++) != test) {
 
 						MATCH_RETURN (0);
 					}
@@ -3423,7 +3370,7 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
                                     considers \0 as a member
                                     of the character set. */
 
-				if (wcschr ( (wchar *) OPERAND (scan), (int) *Reg_Input) == NULL) {
+				if (str32chr (OPERAND (scan), *Reg_Input) == NULL) {
 					MATCH_RETURN (0);
 				}
 
@@ -3437,7 +3384,7 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 					MATCH_RETURN (0);    /* See comment for ANY_OF. */
 				}
 
-				if (wcschr ( (wchar *) OPERAND (scan), (int) *Reg_Input) != NULL) {
+				if (str32chr (OPERAND (scan), *Reg_Input) != NULL) {
 					MATCH_RETURN (0);
 				}
 
@@ -3456,11 +3403,11 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 			case LAZY_PLUS:
 			case LAZY_QUESTION:
 			case LAZY_BRACE: {
-				register unsigned long  num_matched = REG_ZERO;
-				register unsigned long  min = ULONG_MAX, max = REG_ZERO;
-				register regularExp_CHAR *save;
-				register regularExp_CHAR  next_char;
-				regularExp_CHAR *next_op;
+				unsigned long  num_matched = REG_ZERO;
+				unsigned long  min = ULONG_MAX, max = REG_ZERO;
+				char32 *save;
+				char32 next_char;
+				char32 *next_op;
 				int            lazy = 0;
 
 				/* Lookahead (when possible) to avoid useless match attempts
@@ -3586,8 +3533,8 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 				/* case X_REGEX_BR:    */
 				/* case X_REGEX_BR_CI: *** IMPLEMENT LATER */
 			{
-				register regularExp_CHAR *captured, *finish;
-				int   paren_no;
+				char32 *captured, *finish;
+				int paren_no;
 
 				paren_no = (int) * OPERAND (scan);
 
@@ -3637,8 +3584,8 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 
 			case POS_AHEAD_OPEN:
 			case NEG_AHEAD_OPEN: {
-				register regularExp_CHAR *save;
-				register regularExp_CHAR *saved_end;
+				char32 *save;
+				const char32 *saved_end;
 				int   answer;
 
 				save      = Reg_Input;
@@ -3689,12 +3636,12 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 
 			case POS_BEHIND_OPEN:
 			case NEG_BEHIND_OPEN: {
-				register regularExp_CHAR *save;
+				char32 *save;
 				int   answer;
-				register 	 int   offset, upper;
+				int   offset, upper;
 				int   lower;
 				int   found = 0;
-				regularExp_CHAR *saved_end;
+				const char32 *saved_end;
 
 				save      = Reg_Input;
 				saved_end = End_Of_String;
@@ -3773,13 +3720,13 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 			case LOOK_BEHIND_CLOSE:
 				MATCH_RETURN (1);  /* We have reached the end of the look-ahead or
 	                    look-behind which implies that we matched it,
-			    so return TRUE. */
+			    so return `true`. */
 			default:
 				if ( (GET_OP_CODE (scan) > OPEN) &&
 				        (GET_OP_CODE (scan) < OPEN + NSUBEXP)) {
 
-					register          int   no;
-					register regularExp_CHAR *save;
+					int no;
+					char32 *save;
 
 					no   = GET_OP_CODE (scan) - OPEN;
 					save = Reg_Input;
@@ -3804,8 +3751,8 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 				} else if ( (GET_OP_CODE (scan) > CLOSE) &&
 				            (GET_OP_CODE (scan) < CLOSE + NSUBEXP)) {
 
-					register          int   no;
-					register regularExp_CHAR *save;
+					int no;
+					char32 *save;
 
 					no   = GET_OP_CODE (scan) - CLOSE;
 					save = Reg_Input;
@@ -3827,7 +3774,7 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 						MATCH_RETURN (0);
 					}
 				} else {
-					reg_error (L"memory corruption, `match\'");
+					reg_error (U"memory corruption, `match\'");
 
 					MATCH_RETURN (0);
 				}
@@ -3841,7 +3788,7 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
 	/* We get here only if there's trouble -- normally "case END" is
 	   the terminating point. */
 
-	reg_error (L"corrupted pointers, `match\'");
+	reg_error (U"corrupted pointers, `match\'");
 
 	MATCH_RETURN (0);
 }
@@ -3860,12 +3807,12 @@ static int match (regularExp_CHAR *prog, int *branch_index_param) {
  * Returns the actual number of matches.
  *----------------------------------------------------------------------*/
 
-static unsigned long greedy (regularExp_CHAR *p, long max) {
+static unsigned long greedy (char32 *p, long max) {
 
-	register regularExp_CHAR *input_str;
-	register regularExp_CHAR *operand;
-	register unsigned long  count = REG_ZERO;
-	register unsigned long  max_cmp;
+	char32 *input_str;
+	char32 *operand;
+	unsigned long  count = REG_ZERO;
+	unsigned long  max_cmp;
 
 	input_str = Reg_Input;
 	operand   = OPERAND (p); /* Literal char or start of class characters. */
@@ -3905,7 +3852,7 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case SIMILAR: /* Case insensitive version of EXACTLY */
 			while (count < max_cmp                  &&
-			        *operand == tolower (*input_str) &&
+			        *operand == (char32) towlower ((int) *input_str) &&
 			        !AT_END_OF_STRING (input_str)) {
 				count++; input_str++;
 			}
@@ -3914,7 +3861,7 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case ANY_OF:  /* [...] character class. */
 			while (count < max_cmp                                      &&
-			        wcschr ( (wchar *) operand, (int) *input_str) != NULL  &&
+			        str32chr (operand, *input_str) != NULL  &&
 			        !AT_END_OF_STRING (input_str)) {
 
 				count++; input_str++;
@@ -3927,7 +3874,7 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
                        time.) */
 
 			while (count < max_cmp                                      &&
-			        wcschr ( (wchar *) operand, (int) *input_str) == NULL  &&
+			        str32chr (operand, *input_str) == NULL  &&
 			        !AT_END_OF_STRING (input_str)) {
 
 				count++; input_str++;
@@ -3959,8 +3906,8 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case WORD_CHAR: /* \w (word character, alpha-numeric or underscore) */
 			while (count < max_cmp                     &&
-			        (isalnum ( (int) *input_str) ||
-			         *input_str == (regularExp_CHAR) '_') &&
+			        (iswalnum ( (int) *input_str) ||
+			         *input_str == U'_') &&
 			        !AT_END_OF_STRING (input_str)) {
 
 				count++; input_str++;
@@ -3970,9 +3917,9 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case NOT_WORD_CHAR:/* \W (NOT a word character) */
 			while (count < max_cmp                      &&
-			        !isalnum ( (int) *input_str)          &&
-			        *input_str != (regularExp_CHAR) '_'    &&
-			        *input_str != (regularExp_CHAR) '\n'   &&
+			        !iswalnum ( (int) *input_str)          &&
+			        *input_str != U'_'    &&
+			        *input_str != U'\n'   &&
 			        !AT_END_OF_STRING (input_str)) {
 
 				count++; input_str++;
@@ -3991,8 +3938,8 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case NOT_DIGIT: /* same as [^0123456789] */
 			while (count < max_cmp              &&
-			        !isdigit ( (int) *input_str)  &&
-			        *input_str != '\n'           &&
+			        !iswdigit ( (int) *input_str)  &&
+			        *input_str != U'\n'           &&
 			        !AT_END_OF_STRING (input_str)) {
 
 				count++; input_str++;
@@ -4002,8 +3949,8 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case SPACE: /* same as [ \t\r\f\v]-- doesn't match newline. */
 			while (count < max_cmp             &&
-			        isspace ( (int) *input_str)  &&
-			        *input_str != '\n'          &&
+			        iswspace ( (int) *input_str)  &&
+			        *input_str != U'\n'          &&
 			        !AT_END_OF_STRING (input_str)) {
 
 				count++; input_str++;
@@ -4013,7 +3960,7 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case SPACE_NL: /* same as [\n \t\r\f\v]-- matches newline. */
 			while (count < max_cmp             &&
-			        isspace ( (int) *input_str)  &&
+			        iswspace ( (int) *input_str)  &&
 			        !AT_END_OF_STRING (input_str)) {
 
 				count++; input_str++;
@@ -4023,7 +3970,7 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case NOT_SPACE: /* same as [^\n \t\r\f\v]-- doesn't match newline. */
 			while (count < max_cmp              &&
-			        !isspace ( (int) *input_str)  &&
+			        !iswspace ( (int) *input_str)  &&
 			        !AT_END_OF_STRING (input_str)) {
 
 				count++; input_str++;
@@ -4033,7 +3980,7 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case NOT_SPACE_NL: /* same as [^ \t\r\f\v]-- matches newline. */
 			while (count < max_cmp                                     &&
-			        (!isspace ( (int) *input_str) || *input_str == '\n')  &&
+			        (!iswspace ( (int) *input_str) || *input_str == '\n')  &&
 			        !AT_END_OF_STRING (input_str)) {
 
 				count++; input_str++;
@@ -4043,7 +3990,7 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case LETTER: /* same as [a-zA-Z] */
 			while (count < max_cmp             &&
-			        isalpha ( (int) *input_str)  &&
+			        iswalpha ( (int) *input_str)  &&
 			        !AT_END_OF_STRING (input_str)) {
 
 				count++; input_str++;
@@ -4053,7 +4000,7 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 
 		case NOT_LETTER: /* same as [^a-zA-Z] */
 			while (count < max_cmp              &&
-			        !isalpha ( (int) *input_str)  &&
+			        !iswalpha ( (int) *input_str)  &&
 			        *input_str != '\n'           &&
 			        !AT_END_OF_STRING (input_str)) {
 
@@ -4067,7 +4014,7 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
 			   generate a call to greedy.  The above cases should cover
 			   all the atoms that are SIMPLE. */
 
-			reg_error (L"internal error #10 `greedy\'");
+			reg_error (U"internal error #10 `greedy\'");
 			count = 0U;  /* Best we can do. */
 	}
 
@@ -4085,9 +4032,9 @@ static unsigned long greedy (regularExp_CHAR *p, long max) {
  *       description of the macro).
  *----------------------------------------------------------------------*/
 
-static regularExp_CHAR *next_ptr (regularExp_CHAR *ptr) {
+static char32 *next_ptr (char32 *ptr) {
 
-	register int offset;
+	int offset;
 
 	if (ptr == &Compute_Size) {
 		return (NULL);
@@ -4113,34 +4060,34 @@ static regularExp_CHAR *next_ptr (regularExp_CHAR *ptr) {
 **  To give the caller a chance to react to this the function returns False
 **  on any error. The substitution will still be executed.
 */
-int SubstituteRE (const regexp *prog, const regularExp_CHAR *source, regularExp_CHAR *dest, int max, int *errorType) {
-
-	register regularExp_CHAR *src;
-	regularExp_CHAR *src_alias;
-	register regularExp_CHAR *dst;
-	register regularExp_CHAR  c;
-	register regularExp_CHAR  test;
-	register          int   paren_no;
-	register          int   len;
-	register regularExp_CHAR  chgcase;
+int SubstituteRE (const regexp *prog, const char32 *source, char32 *dest, int max, int *errorType) {
+
+	const char32 *src;
+	const char32 *src_alias;
+	char32 *dst;
+	char32 c;
+	char32 test;
+	int   paren_no;
+	int   len;
+	char32 chgcase;
 	int anyWarnings = FALSE;
 
 	*errorType = 0;
 	if (prog == NULL || source == NULL || dest == NULL) {
-		reg_error (L"NULL parm to `SubstituteRE\'");
+		reg_error (U"NULL parm to `SubstituteRE\'");
 		*errorType = 2;
 		return FALSE;
 	}
 
 	if (U_CHAR_AT (prog->program) != MAGIC) {
 		*errorType = 3;
-		reg_error (L"damaged regexp passed to `SubstituteRE\'");
+		reg_error (U"damaged regexp passed to `SubstituteRE\'");
 
 		return FALSE;
 	}
 
-	src = (regularExp_CHAR *) source;
-	dst = (regularExp_CHAR *) dest;
+	src = source;
+	dst = dest;
 
 	while ( (c = *src++) != '\0') {
 		chgcase  = '\0';
@@ -4174,7 +4121,7 @@ int SubstituteRE (const regexp *prog, const regularExp_CHAR *source, regularExp_
 			} else if ( (test = literal_escape (*src)) != '\0') {
 				c = test; src++;
 
-			} else if ( (test = numeric_escape (*src, &src_alias)) != '\0') {
+			} else if ( (test = numeric_escape (*src, (char32 **) &src_alias)) != '\0') {
 				c   = test;
 				src = src_alias; src++;
 
@@ -4191,9 +4138,9 @@ int SubstituteRE (const regexp *prog, const regularExp_CHAR *source, regularExp_
 		}                 /* mind set of issuing an error!       */
 
 		if (paren_no < 0) { /* Ordinary character. */
-			if ( ( (regularExp_CHAR *) dst - (regularExp_CHAR *) dest) >= (max - 1)) {
+			if ( (dst - dest) >= (max - 1)) {
 				*errorType = 1;
-				reg_error (L"replacing expression in `SubstituteRE\' too long; truncating");
+				reg_error (U"replacing expression in `SubstituteRE\' too long; truncating");
 				anyWarnings = TRUE;
 				break;
 			} else {
@@ -4204,14 +4151,14 @@ int SubstituteRE (const regexp *prog, const regularExp_CHAR *source, regularExp_
 
 			len = prog->endp [paren_no] - prog->startp [paren_no];
 
-			if ( ( (regularExp_CHAR *) dst + len - (regularExp_CHAR *) dest) >= max - 1) {
+			if ( (dst + len - dest) >= max - 1) {
 				*errorType = 1;
-				reg_error (L"replacing expression in `SubstituteRE\' too long; truncating");
+				reg_error (U"replacing expression in `SubstituteRE\' too long; truncating");
 				anyWarnings = TRUE;
-				len = max - ( (regularExp_CHAR *) dst - (regularExp_CHAR *) dest) - 1;
+				len = max - (dst - dest) - 1;
 			}
 
-			(void) wcsncpy ( (wchar *) dst, (wchar *) prog->startp [paren_no], len);
+			(void) str32ncpy (dst, prog->startp [paren_no], len);
 
 			if (chgcase != '\0') {
 				adjustcase (dst, len, chgcase);
@@ -4221,7 +4168,7 @@ int SubstituteRE (const regexp *prog, const regularExp_CHAR *source, regularExp_
 
 			if (len != 0 && * (dst - 1) == '\0') { /* strncpy hit NUL. */
 				*errorType = 3;
-				reg_error (L"damaged match string in `SubstituteRE\'");
+				reg_error (U"damaged match string in `SubstituteRE\'");
 				anyWarnings = TRUE;
 			}
 		}
@@ -4232,15 +4179,15 @@ int SubstituteRE (const regexp *prog, const regularExp_CHAR *source, regularExp_
 	return !anyWarnings;
 }
 
-static void adjustcase (regularExp_CHAR *str, int len, regularExp_CHAR chgcase) {
+static void adjustcase (char32 *str, int len, char32 chgcase) {
 
-	register regularExp_CHAR *string = str;
-	int            i;
+	char32 *string = str;
+	int i;
 
 	/* The tokens \u and \l only modify the first character while the tokens
 	   \U and \L modify the entire string. */
 
-	if (islower (chgcase) && len > 0) {
+	if (iswlower ((int) chgcase) && len > 0) {
 		len = 1;
 	}
 
@@ -4248,7 +4195,7 @@ static void adjustcase (regularExp_CHAR *str, int len, regularExp_CHAR chgcase)
 		case 'u':
 		case 'U':
 			for (i = 0; i < len; i++) {
-				* (string + i) = toupper ( (int) * (string + i));
+				* (string + i) = (char32) towupper ( (int) * (string + i));
 			}
 
 			break;
@@ -4256,7 +4203,7 @@ static void adjustcase (regularExp_CHAR *str, int len, regularExp_CHAR chgcase)
 		case 'l':
 		case 'L':
 			for (i = 0; i < len; i++) {
-				* (string + i) = tolower ( (int) * (string + i));
+				* (string + i) = (char32) towlower ( (int) * (string + i));
 			}
 
 			break;
@@ -4267,8 +4214,8 @@ static void adjustcase (regularExp_CHAR *str, int len, regularExp_CHAR chgcase)
  * reg_error
  *----------------------------------------------------------------------*/
 
-static void reg_error (const wchar *str) {
-	Melder_error_ ("Internal error processing regular expression: ", str);
+static void reg_error (const char32 *str) {
+	Melder_appendError (U"Internal error processing regular expression: ", str);
 }
 
 /*----------------------------------------------------------------------*
@@ -4283,15 +4230,15 @@ static void reg_error (const wchar *str) {
  * Return value is a pointer to the table.
  *----------------------------------------------------------------------*/
 
-static regularExp_CHAR *makeDelimiterTable (
-    regularExp_CHAR *delimiters,
-    regularExp_CHAR *table) {
+static char32 *makeDelimiterTable (
+    const char32 *delimiters,
+    char32 *table) {
 
-	regularExp_CHAR *c;
+	const char32 *c;
 
 	memset (table, 0, 256);
 
-	for (c = (regularExp_CHAR *) delimiters; *c != '\0'; c++) {
+	for (c = delimiters; *c != '\0'; c++) {
 		table [*c] = 1;
 	}
 
@@ -4309,10 +4256,12 @@ static regularExp_CHAR *makeDelimiterTable (
  * Builds a default delimiter table that persists across `ExecRE' calls.
  *----------------------------------------------------------------------*/
 
-void SetREDefaultWordDelimiters (regularExp_CHAR *delimiters) {
+void SetREDefaultWordDelimiters (char32 *delimiters) {
 	makeDelimiterTable (delimiters, Default_Delimiters);
 }
 
 void EnableCountingQuantifier (int is_enabled) {
 	Enable_Counting_Quantifier = is_enabled;
-}
\ No newline at end of file
+}
+
+/* End of file regularExp.cpp */
diff --git a/dwsys/regularExp.h b/dwsys/regularExp.h
index b8ec4e6..3e24839 100644
--- a/dwsys/regularExp.h
+++ b/dwsys/regularExp.h
@@ -32,36 +32,27 @@
 
 /* Number of text capturing parentheses allowed. */
 
-#include <wchar.h>
-#if defined (macintosh) || defined (linux)
-	#define regularExp_CHAR wchar_t
-#else
-	#define regularExp_CHAR unsigned short
-#endif
+#include "melder.h"
 
 #define NSUBEXP 50
 
 /* Structure to contain the compiled form of a regular expression plus
    pointers to matched text.  `program' is the actual compiled regex code. */
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 typedef struct regexp {
-   regularExp_CHAR *startp [NSUBEXP];  /* Captured text starting locations. */
-   regularExp_CHAR *endp   [NSUBEXP];  /* Captured text ending locations. */
-   regularExp_CHAR *extentpBW;         /* Points to the maximum extent of text scanned by
+   char32 *startp [NSUBEXP];  /* Captured text starting locations. */
+   char32 *endp   [NSUBEXP];  /* Captured text ending locations. */
+   char32 *extentpBW;         /* Points to the maximum extent of text scanned by
                                ExecRE in front of the string to achieve a match
                                (needed because of positive look-behind.) */
-   regularExp_CHAR *extentpFW;         /* Points to the maximum extent of text scanned by
+   char32 *extentpFW;         /* Points to the maximum extent of text scanned by
                                ExecRE to achieve a match (needed because of
                                positive look-ahead.) */
    int   top_branch;        /* Zero-based index of the top branch that matches.
                                Used by syntax highlighting only. */
-   regularExp_CHAR  match_start;       /* Internal use only. */
-   regularExp_CHAR  anchor;            /* Internal use only. */
-   regularExp_CHAR  program [1];       /* Unwarranted chumminess with compiler. */
+   char32  match_start;       /* Internal use only. */
+   char32  anchor;            /* Internal use only. */
+   char32  program [1];       /* Unwarranted chumminess with compiler. */
 } regexp;
 
 /* Flags for CompileRE default settings (Markus Schwarzenberg) */
@@ -75,10 +66,12 @@ typedef enum {
 /* Compiles a regular expression into the internal format used by `ExecRE'. */
 
 regexp * CompileRE (
-   const regularExp_CHAR  *exp,         /* String containing the regex specification. */
-   const wchar_t **errorText,   /* Text of any error message produced. */
+   const char32  *exp,         /* String containing the regex specification. */
+   const char32 **errorText,   /* Text of any error message produced. */
    int  defaultFlags); /* Flags for default RE-operation */
 
+regexp *CompileRE_throwable (const char32 *exp, int defaultFlags);
+
 /* Match a `regexp' structure against a string. */
 
 int ExecRE (
@@ -88,18 +81,18 @@ int ExecRE (
                                    implement back references across regular
                                    expressions for use in syntax
                                    highlighting.*/
-   const regularExp_CHAR   *string,              /* Text to search within. */
-   const regularExp_CHAR   *end,                 /* Pointer to the end of `string'.  If NULL will
+   const char32   *string,              /* Text to search within. */
+   const char32   *end,                 /* Pointer to the end of `string'.  If NULL will
                                    scan from `string' until '\0' is found. */
    int     reverse,             /* Backward search. */
-   regularExp_CHAR    prev_char,           /* Character immediately prior to `string'.  Set
+   char32    prev_char,           /* Character immediately prior to `string'.  Set
                                    to '\n' or '\0' if true beginning of text. */
-   regularExp_CHAR    succ_char,           /* Character immediately after `end'.  Set
+   char32    succ_char,           /* Character immediately after `end'.  Set
                                    to '\n' or '\0' if true beginning of text. */
-   const regularExp_CHAR   *delimiters,    /* Word delimiters to use (NULL for default) */
-   const regularExp_CHAR   *look_behind_to,/* Boundary for look-behind; defaults to
+   const char32   *delimiters,    /* Word delimiters to use (NULL for default) */
+   const char32   *look_behind_to,/* Boundary for look-behind; defaults to
                                    "string" if NULL */
-   const regularExp_CHAR   *match_till);   /* Boundary to where match can extend.
+   const char32   *match_till);   /* Boundary to where match can extend.
                                    \0 is assumed to be the boundary if not
                                    set. Lookahead can cross the boundary. */
 
@@ -108,8 +101,8 @@ int ExecRE (
 
 int SubstituteRE (
    const regexp *prog,
-   const regularExp_CHAR   *source,
-   regularExp_CHAR   *dest,
+   const char32   *source,
+   char32   *dest,
    int     max,
    int *errorType); // djmw 20080110 0: ok; 1: is not enough memory
 
@@ -118,14 +111,10 @@ int SubstituteRE (
    delimiters. */
 
 void SetREDefaultWordDelimiters (
-   regularExp_CHAR *delimiters);
+   char32 *delimiters);
 
 /* Enable (or disable) brace counting quantifiers, e.g. `(foo){0,3}'. */
 
 void EnableCountingQuantifier (int is_enabled);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _regularExp_h_ */
diff --git a/dwtest/runAllTests.praat b/dwtest/runAllTests.praat
index 147f247..27c6825 100644
--- a/dwtest/runAllTests.praat
+++ b/dwtest/runAllTests.praat
@@ -6,6 +6,21 @@ for itest to ntests
 	select tests
 	test$ = Get string... itest
 	printline 'test$'
+	report_before$ = Report memory use
 	execute 'test$'
-	endif
-endfor
\ No newline at end of file
+	@check_memory: report_before$, "   "
+endfor
+
+procedure check_memory: .report_before$, .preprint$
+	.m$[1] = "Strings: "
+	.m$[2] = "Arrays: "
+	.m$[3] = "Things: "
+	.report_after$ = Report memory use
+	appendInfoLine: .preprint$, "Memory:"
+	for .i to 3
+		.nb = extractNumber (.report_before$, .m$[.i])
+		.na = extractNumber (.report_after$, .m$[.i])
+		.post$ = if .nb <> .na then " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" else "" endif
+		appendInfoLine: .preprint$, .m$[.i], .nb, " ", .na, .post$
+	endfor
+endproc
diff --git a/dwtest/test_Confusion.praat b/dwtest/test_Confusion.praat
index 866d2ec..f486166 100644
--- a/dwtest/test_Confusion.praat
+++ b/dwtest/test_Confusion.praat
@@ -1,11 +1,12 @@
 # test_Confusion.praat
-# djmw 20110511
+# djmw 20110511, 20151020
+
+printline test_Confusion.praat
 
 l$[1] = "u"
 l$[2] = "i"
 l$[3] = "e"
 nlabels = 3
-printline Confusion test...
 c1 = Create simple Confusion... test 'l$[1]'  'l$[2]'   'l$[3]' 
 nrows = Get number of rows
 ncols = Get number of columns
@@ -60,4 +61,5 @@ assert v = 8
 
 plus c2
 Remove
-printline Confusion test... ok
+
+printline test_Confusion.praat OK
diff --git a/dwtest/test_KlattGrid.praat b/dwtest/test_KlattGrid.praat
index f0ef799..7f07893 100644
--- a/dwtest/test_KlattGrid.praat
+++ b/dwtest/test_KlattGrid.praat
@@ -1,6 +1,7 @@
 # test_KlattGrid.praat
+# djmw 20151020
 
-printline test_KlattGrid
+printline test_KlattGrid.praat
 
 t = Create Table with column names... t 25 tier min max nf
 Set string value... 1 tier pitch
@@ -155,4 +156,6 @@ for i from nPhonationTiers+1 to 25
 	print 'newline$'
 endfor
 
-printline test_KlattGrid OK
\ No newline at end of file
+removeObject: kg, t
+
+printline test_KlattGrid.praat OK
\ No newline at end of file
diff --git a/dwtest/test_KruskalWallis.praat b/dwtest/test_KruskalWallis.praat
index 76d0dae..d68a358 100644
--- a/dwtest/test_KruskalWallis.praat
+++ b/dwtest/test_KruskalWallis.praat
@@ -1,6 +1,7 @@
 # test_KruskalWallis.praat
 
-printline One-way Kruskal-Wallis test
+printline test_KruskalWallis.praat
+
 table = Read from file... Hayes_table_19.7.1.txt
 report$ = Report one-way Kruskal-Wallis... Data Group
 hprime = extractNumber (report$, "Chi squared:")
@@ -12,6 +13,8 @@ assert abs(hprime-13.8443) < 0.0001
 assert groupI = 139
 assert groupII = 200
 assert groupIII = 327
-printline One-way Kruskal-Wallis test OK
+removeObject: table
+
+printline test_KruskalWallis.praat OK
 
 
diff --git a/dwtest/test_onewayAnova.praat b/dwtest/test_OnewayAnova.praat
similarity index 77%
rename from dwtest/test_onewayAnova.praat
rename to dwtest/test_OnewayAnova.praat
index e5ff87d..444eca9 100644
--- a/dwtest/test_onewayAnova.praat
+++ b/dwtest/test_OnewayAnova.praat
@@ -1,7 +1,7 @@
-# test_onewayAnova.praat
+# test_OnewayAnova.praat
 # djmw 20120625
 
-printline One-way Anova test
+printline test_OnewayAnova.praat
 
 # unequal groups hayes pg 371
 
@@ -14,7 +14,6 @@ total = extractNumber (report$, "Total")
 assert abs (between-22.57) < 0.01
 assert abs (within - 878.93) < 0.01
 assert abs (total - 901.5) < 0.1
-Remove
-printline One-way Anova test OK
-
+removeObject: table
 
+printline test_OnewayAnova.praat OK
diff --git a/dwtest/test_Polygon_simplify.praat b/dwtest/test_Polygon_simplify.praat
index 5fa9240..f5afaaa 100644
--- a/dwtest/test_Polygon_simplify.praat
+++ b/dwtest/test_Polygon_simplify.praat
@@ -2,10 +2,6 @@
 
 printline test_Polygon_simplify
 
-
-p = Create simple Polygon... p 0 0 0 1 0.25 0.75 -0.25 0.75 0.25 0.25 -0.25 0.25
-
-
 for j to 10
 	m = Create simple Matrix... ps 2 100  randomUniform (0,1)
 	p1x = Get value in cell... 1 1
diff --git a/dwtest/test_Procrustes.praat b/dwtest/test_Procrustes.praat
index 210c974..c4a7a8a 100644
--- a/dwtest/test_Procrustes.praat
+++ b/dwtest/test_Procrustes.praat
@@ -10,156 +10,157 @@ printline
 printline ----- succeeded: test_Procrustes.praat (end) -----
 
 procedure test_procrustes_bg_19_4
-  # example Borg&Groenen section 19.4
-  printline   test example in Borg & Groenen section 19.4
-  nr = 4 
-  nc = 2
-  s = 0.5
-  t1 = 1
-  t2 = 2
-  alpha = 30
-  eps = 2.3e-16
+	# example Borg&Groenen section 19.4
+	printline   test example in Borg & Groenen section 19.4
+	nr = 4 
+ 	nc = 2
+	s = 0.5
+	t1 = 1
+ 	t2 = 2
+	alpha = 30
+	eps = 2.3e-16
   
-  Create Configuration... X nr nc 0
-  Set value... 1 1 1
-  Set value... 1 2 2
-  Set value... 2 1 -1
-  Set value... 2 2 2
-  Set value... 3 1 -1
-  Set value... 3 2 -2
-  Set value... 4 1 1
-  Set value... 4 2 -2
+	Create Configuration... X nr nc 0
+	Set value... 1 1 1
+	Set value... 1 2 2
+	Set value... 2 1 -1
+	Set value... 2 2 2
+	Set value... 3 1 -1
+	Set value... 3 2 -2
+	Set value... 4 1 1
+	Set value... 4 2 -2
   
-  for i to 4
-    Set row label (index)... i x_'i'
-  endfor
+	for i to 4
+		Set row label (index)... i x_'i'
+	endfor
   
-  Copy... Y
-  ! Horizontal reflection
-  Invert dimension... 1
-  Rotate... 1 2 alpha
+	Copy... Y
+	! Horizontal reflection
+	Invert dimension... 1
+	Rotate... 1 2 alpha
   
-  Formula...  0.5*self + (if col=1 then t1 else t2 fi)
+	Formula...  0.5*self + (if col=1 then t1 else t2 fi)
   
-  plus Configuration X
-  To Procrustes... 0
-  Rename... X_Y
-  plus Configuration Y
-  To Configuration
-  Rename... Z
-  Formula... self-Configuration_X[]
-  for i to 4
-    for j to 2
-      assert Configuration_Z[i,j] < nr*nc*eps; Configuration_Z['i','j'] < 'nr'*'nc'*'eps'
-    endfor
-  endfor
+	plus Configuration X
+	To Procrustes... 0
+	Rename... X_Y
+	plus Configuration Y
+	To Configuration
+	Rename... Z
+	Formula... self-Configuration_X[]
+	for i to 4
+		for j to 2
+			assert Configuration_Z[i,j] < nr*nc*eps; Configuration_Z['i','j'] < 'nr'*'nc'*'eps'
+		endfor
+	endfor
   
-  select Procrustes X_Y
-  Invert
-  Rename... X_Yi
-  for i to 2
-    tp = Get translation element... i
-    assert t'i' - tp < nr*nc*eps; translation['i']
-  endfor
-  sp = Get scale
-  assert s - tp < nr*nc*eps; scale
+	select Procrustes X_Y
+	Invert
+	Rename... X_Yi
+	for i to 2
+		tp = Get translation element... i
+		assert t'i' - tp < nr*nc*eps; translation['i']
+	endfor
+	sp = Get scale
+	assert s - tp < nr*nc*eps; scale
   
-  select Configuration X
-  plus Configuration Y
-  plus Configuration Z
-  plus Procrustes X_Y
-  plus Procrustes X_Yi
-  Remove
+	select Configuration X
+	plus Configuration Y
+	plus Configuration Z
+	plus Procrustes X_Y
+	plus Procrustes X_Yi
+	Remove
 endproc
 
 procedure test_procrustes_random_configurations numconf
-  printline   'numconf' randomly generated configurations of dimension 2^1 x 2 .. 2^12 x 2
-  nr = 2
-  print     Configuration:
-  for k to numconf
-    print  'k'
-    Create Configuration... X nr nc randomUniform(-1,1)
-    Copy... Y
-    Invert dimension... 1
-    alpha = randomUniform (0,90)
-    Rotate... 1 2 alpha
-    t1 = randomUniform (0,2)
-    t2 = randomUniform (0,2)
-    scale = randomUniform(0.5,2)
-    Formula...  scale*self + (if col=1 then t1 else t2 fi)
+	printline   'numconf' randomly generated configurations of dimension 2^1 x 2 .. 2^12 x 2
+	nr = 2
+	print     Configuration:
+	for k to numconf
+		print  'k'
+		Create Configuration... X nr nc randomUniform(-1,1)
+ 		Copy... Y
+		Invert dimension... 1
+		alpha = randomUniform (0,90)
+		Rotate... 1 2 alpha
+		t1 = randomUniform (0,2)
+ 		t2 = randomUniform (0,2)
+ 		scale = randomUniform(0.5,2)
+		Formula...  scale*self + (if col=1 then t1 else t2 fi)
   
-    plus Configuration X
-    To Procrustes... 0
-    Rename... X_Y
-    plus Configuration Y
-    To Configuration
-    Rename... Z
-    Formula... self-Configuration_X[]
-    for i to nr
-      for j to 2
-        assert Configuration_Z[i,j] < nr*nc*eps; Configuration_Z['i','j'] < 'nr'*'nc'*'eps'
-      endfor
-    endfor
+		plus Configuration X
+		To Procrustes... 0
+		Rename... X_Y
+		plus Configuration Y
+		To Configuration
+		Rename... Z
+		Formula... self-Configuration_X[]
+		.eps = 10 * nr * nc * eps
+		for i to nr
+ 			for j to 2
+ 				assert Configuration_Z[i,j] < .eps; Configuration_Z['i','j'] < '.eps'
+			endfor
+		endfor
   
-    select Procrustes X_Y
-    Invert
-    Rename... X_Yi
-    # no need to test the translations, they need not be equal (see BG page 347)
-    sp = Get scale
-    assert abs(scale - sp) < nr*nc*eps; scale
+		select Procrustes X_Y
+		Invert
+		Rename... X_Yi
+		# no need to test the translations, they need not be equal (see BG page 347)
+		sp = Get scale
+ 		assert abs(scale - sp) < .eps; scale
   
-#   printline o.k.: nr='nr', nc='nc', alpha='alpha' degrees, scale='scale', t=('t1', 't2')
-    nr *= 2
-    select Configuration X
-    plus Configuration Y
-    plus Configuration Z
-    plus Procrustes X_Y
-    plus Procrustes X_Yi
-    Remove
-  endfor
+		#   printline o.k.: nr='nr', nc='nc', alpha='alpha' degrees, scale='scale', t=('t1', 't2')
+ 		nr *= 2
+		select Configuration X
+		plus Configuration Y
+		plus Configuration Z
+		plus Procrustes X_Y
+		plus Procrustes X_Yi
+ 		Remove
+	endfor
 endproc
 
 procedure test_orthogional_procrustes_gvl_12_4_3
-  printline   test orthognal Procrustes transform (example 12.4.1 Golub & van Loan)
-  Create Configuration... a 4 2 0
-  Set value... 1 1 1
-  Set value... 2 1 3
-  Set value... 3 1 5
-  Set value... 4 1 7
-  Set value... 1 2 2
-  Set value... 2 2 4
-  Set value... 3 2 6
-  Set value... 4 2 8
+	printline   test orthognal Procrustes transform (example 12.4.1 Golub & van Loan)
+	Create Configuration... a 4 2 0
+	Set value... 1 1 1
+	Set value... 2 1 3
+	Set value... 3 1 5
+	Set value... 4 1 7
+	Set value... 1 2 2
+	Set value... 2 2 4
+	Set value... 3 2 6
+	Set value... 4 2 8
 
-  Create Configuration... b 4 2 0
-  Set value... 1 1 1.2
-  Set value... 2 1 2.9
-  Set value... 3 1 5.2
-  Set value... 4 1 6.8
-  Set value... 1 2 2.1
-  Set value... 2 2 4.3
-  Set value... 3 2 6.1
-  Set value... 4 2 8.1
+	Create Configuration... b 4 2 0
+	Set value... 1 1 1.2
+	Set value... 2 1 2.9
+	Set value... 3 1 5.2
+	Set value... 4 1 6.8
+	Set value... 1 2 2.1
+	Set value... 2 2 4.3
+	Set value... 3 2 6.1
+	Set value... 4 2 8.1
 
-  plus Configuration a
-  To Procrustes... y
+	plus Configuration a
+	To Procrustes... y
 
-  t2 = Get translation element... 2
-  assert t2 = 0
-  s = Get scale
-  assert s = 1; 
+	t2 = Get translation element... 2
+	assert t2 = 0
+	s = Get scale
+	assert s = 1; 
 
-  eps = 5e-5
-  r11 = Get transformation element... 1 1
-  r22 = Get transformation element... 2 2
-  assert r11-r22 < eps
-  assert r11-0.9999 < eps
-  r12 = Get transformation element... 1 2
-  r21 = Get transformation element... 2 1
-  assert r12+0.0126 < eps
-  assert r21-0.0126 < eps
+	eps = 5e-5
+	r11 = Get transformation element... 1 1
+	r22 = Get transformation element... 2 2
+	assert r11-r22 < eps
+	assert r11-0.9999 < eps
+	r12 = Get transformation element... 1 2
+	r21 = Get transformation element... 2 1
+	assert r12+0.0126 < eps
+	assert r21-0.0126 < eps
 
-  plus Configuration a
-  plus Configuration b
-  Remove
+	plus Configuration a
+	plus Configuration b
+	Remove
 endproc
diff --git a/dwtest/test_Sound_paint_where.praat b/dwtest/test_Sound_paint_where.praat
index 0b8f56b..754a1e1 100644
--- a/dwtest/test_Sound_paint_where.praat
+++ b/dwtest/test_Sound_paint_where.praat
@@ -34,5 +34,5 @@ plus s1
 Select outer viewport... 0 6 9 12
 Paint enclosed... Grey 0 0 -1 1 yes
 Text top... n Paint enclosed: between sine and straight line
-
+removeObject: s1, s3
 
diff --git a/dwtest/test_TableOfReal_extensions.praat b/dwtest/test_TableOfReal_extensions.praat
index 432719a..035f71b 100644
--- a/dwtest/test_TableOfReal_extensions.praat
+++ b/dwtest/test_TableOfReal_extensions.praat
@@ -35,5 +35,6 @@ procedure means_by_row_labels
 			endif
 			assert .dif <= eps
 		endfor
-	endfor		
+	endfor
+	removeObject: 	.tab1, .tabm	
 endproc
diff --git a/dwtest/test_henzeZirklerMultivariateNormalityTest.praat b/dwtest/test_henzeZirklerMultivariateNormalityTest.praat
index 1afdfc0..4e59b57 100644
--- a/dwtest/test_henzeZirklerMultivariateNormalityTest.praat
+++ b/dwtest/test_henzeZirklerMultivariateNormalityTest.praat
@@ -7,9 +7,9 @@ ir50 = Extract row ranges...  1:50
 report$ = Report multivariate normality... 0
 tol = 1e-10
 stat = extractNumber (report$, "statistic:")
-assert abs(stat - 0.958366538697967)<tol
+assert abs(stat - 0.9583666347568522)<tol
 prob = extractNumber (report$, " normality:")
-assert abs (prob - 0.04292525730817163) < tol
+assert abs (prob - 0.042925190989665477) < tol
 lmean = extractNumber (report$, " mean:")
 assert abs (lmean  + 0.27940830765481794)<tol
 lvariance = extractNumber (report$, " variance:")
diff --git a/dwtest/test_regex.praat b/dwtest/test_regex.praat
index 3e14d2a..0caeb79 100644
--- a/dwtest/test_regex.praat
+++ b/dwtest/test_regex.praat
@@ -104,7 +104,6 @@ endfor
 
 printline ----  # special characters # grouping characters ()
 
-match$ = "(ab)"
 call match_index "c" "(ab)" 0
 call match_index "cc" "(ab)" 0
 call match_index "ccc" "(ab)" 0
diff --git a/dwtools/.DTW_def.h.kate-swp b/dwtools/.DTW_def.h.kate-swp
deleted file mode 100644
index 960f8f7..0000000
Binary files a/dwtools/.DTW_def.h.kate-swp and /dev/null differ
diff --git a/dwtools/.KlattGridEditors.cpp.kate-swp b/dwtools/.KlattGridEditors.cpp.kate-swp
deleted file mode 100644
index 5771fc9..0000000
Binary files a/dwtools/.KlattGridEditors.cpp.kate-swp and /dev/null differ
diff --git a/dwtools/.Sound_extensions.cpp.kate-swp b/dwtools/.Sound_extensions.cpp.kate-swp
deleted file mode 100644
index 40ecfdb..0000000
Binary files a/dwtools/.Sound_extensions.cpp.kate-swp and /dev/null differ
diff --git a/dwtools/.SpeechSynthesizer.cpp.kate-swp b/dwtools/.SpeechSynthesizer.cpp.kate-swp
deleted file mode 100644
index 6ea3529..0000000
Binary files a/dwtools/.SpeechSynthesizer.cpp.kate-swp and /dev/null differ
diff --git a/dwtools/.Table_extensions.cpp.kate-swp b/dwtools/.Table_extensions.cpp.kate-swp
deleted file mode 100644
index 6064399..0000000
Binary files a/dwtools/.Table_extensions.cpp.kate-swp and /dev/null differ
diff --git a/dwtools/.manual_dwtools.cpp.kate-swp b/dwtools/.manual_dwtools.cpp.kate-swp
deleted file mode 100644
index 170e97c..0000000
Binary files a/dwtools/.manual_dwtools.cpp.kate-swp and /dev/null differ
diff --git a/dwtools/.praat_David_init.cpp.kate-swp b/dwtools/.praat_David_init.cpp.kate-swp
deleted file mode 100644
index 3f5b460..0000000
Binary files a/dwtools/.praat_David_init.cpp.kate-swp and /dev/null differ
diff --git a/dwtools/Activation.cpp b/dwtools/Activation.cpp
index ee23771..a5cd363 100644
--- a/dwtools/Activation.cpp
+++ b/dwtools/Activation.cpp
@@ -1,6 +1,6 @@
 /* Activation.cpp
  *
- * Copyright (C) 1993-2012 David Weenink
+ * Copyright (C) 1993-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@ Thing_implement (Activation, Matrix, 2);
 int _Activation_checkElements (Activation me) {
 	for (long i = 1; i <= my ny; i++) {
 		for (long j = 1; j <= my nx; j++) {
-			if (my z[i][j] < 0 || my z[i][j] > 1) {
+			if (my z[i][j] < 0.0 || my z[i][j] > 1) {
 				return 0;
 			}
 		}
@@ -39,44 +39,37 @@ int _Activation_checkElements (Activation me) {
 	return 1;
 }
 
-void Activation_init (I, long ny, long nx) {
-	iam (Activation);
-	double xmin = 1, xmax = nx, dx = 1, x1 = 1, ymin = 1, ymax = ny;
-	double dy = 1, y1 = 1;
-	my ny = ny; my nx = nx;
-	Matrix_init (me, xmin, xmax, nx, dx, x1, ymin, ymax, ny, dy, y1);
+void Activation_init (Activation me, long ny, long nx) {
+	Matrix_init (me, 1.0, nx, nx, 1.0, 1.0, 1.0, ny, ny, 1.0, 1.0);
 }
 
-Activation Activation_create (long ny, long nx) {
+autoActivation Activation_create (long ny, long nx) {
 	try {
 		autoActivation me = Thing_new (Activation);
 		Activation_init (me.peek(), ny, nx);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Activation not created.");
+		Melder_throw (U"Activation not created.");
 	}
 }
 
-Activation Matrix_to_Activation (I) {
-	iam (Matrix);
+autoActivation Matrix_to_Activation (Matrix me) {
 	try {
 		autoActivation thee = Activation_create (my ny, my nx);
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Activation.");
+		Melder_throw (me, U": not converted to Activation.");
 	}
 }
 
-Matrix Activation_to_Matrix (I) {
-	iam (Activation);
+autoMatrix Activation_to_Matrix (Activation me) {
 	try {
-		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1,
-		                                 my ymin, my ymax, my ny, my dy, my y1);
+		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1);
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
diff --git a/dwtools/Activation.h b/dwtools/Activation.h
index 2ccb139..f1a6667 100644
--- a/dwtools/Activation.h
+++ b/dwtools/Activation.h
@@ -2,7 +2,7 @@
 #define _Activation_h_
 /* Activation.h
  * 
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  * 
  * This program is free oftware; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,10 +26,6 @@
 
 #include "Matrix.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 Thing_define (Activation, Matrix) {
 };
 
@@ -47,20 +43,16 @@ Thing_define (Activation, Matrix) {
    z[iy][ix]		:the activities
 */
 
-void Activation_init (I, long ny, long nx);
+void Activation_init (Activation me, long ny, long nx);
 
-Activation Activation_create (long ny, long nx);
+autoActivation Activation_create (long ny, long nx);
 
-Activation Matrix_to_Activation (I);
+autoActivation Matrix_to_Activation (Matrix me);
 
-Matrix Activation_to_Matrix (I);
+autoMatrix Activation_to_Matrix (Activation me);
 
 
 int _Activation_checkElements (Activation me);
 /* Return 1 if all elements are in interval [0,1] else 0. */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Activation_h_ */
diff --git a/dwtools/AffineTransform.cpp b/dwtools/AffineTransform.cpp
index cfe3078..b64728e 100644
--- a/dwtools/AffineTransform.cpp
+++ b/dwtools/AffineTransform.cpp
@@ -1,6 +1,6 @@
 /* AffineTransform.cpp
  *
- * Copyright (C) 1993-2013 David Weenink
+ * Copyright (C) 1993-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -67,7 +67,7 @@ Any structAffineTransform :: v_invert () {
 
 	NUMpseudoInverse (r, n, n, thy r, tolerance);
 	for (long i = 1; i <= n; i++) {
-		thy t[i] = 0;
+		thy t[i] = 0.0;
 		for (long j = 1; j <= thy n; j++) {
 			thy t[i] -= thy r[i][j] * t[j];
 		}
@@ -75,61 +75,57 @@ Any structAffineTransform :: v_invert () {
 	return thee.transfer();
 }
 
-Thing_implement (AffineTransform, Data, 0);
+Thing_implement (AffineTransform, Daata, 0);
 
-void AffineTransform_init (I, long n) {
-	iam (AffineTransform);
+void AffineTransform_init (AffineTransform me, long n) {
 	if (n < 1) {
-		Melder_throw ("Dimensionality must be at least 1.");
+		Melder_throw (U"Dimensionality must be at least 1.");
 	}
 	my n = n;
 	my r = NUMmatrix<double> (1, n, 1, n);
 	my t = NUMvector<double> (1, n);
 }
 
-AffineTransform AffineTransform_create (long n) {
+autoAffineTransform AffineTransform_create (long n) {
 	try {
 		autoAffineTransform me = Thing_new (AffineTransform);
 		AffineTransform_init (me.peek(), n);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("AffineTransform not created.");
+		Melder_throw (U"AffineTransform not created.");
 	}
 }
 
-Any AffineTransform_invert (I) {
-	iam (AffineTransform);
+Any AffineTransform_invert (AffineTransform me) {
 	AffineTransform thee = (AffineTransform) my v_invert ();
 	return thee;
 }
 
-TableOfReal AffineTransform_extractMatrix (I) {
-	iam (AffineTransform);
+autoTableOfReal AffineTransform_extractMatrix (AffineTransform me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my n, my n);
 		NUMmatrix_copyElements (my r, thy data, 1, my n, 1, my n);
 		for (long i = 1; i <= my n; i++) {
-			wchar_t label[20];
-			(void) swprintf (label, 20, L"%ld", i);
+			char32 label[40];
+			Melder_sprint (label,40, i);
 			TableOfReal_setRowLabel (thee.peek(), i, label);
 			TableOfReal_setColumnLabel (thee.peek(), i, label);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": transformation matrix not extracted.");
+		Melder_throw (me, U": transformation matrix not extracted.");
 	}
 }
 
-TableOfReal AffineTransform_extractTranslationVector (I) {
-	iam (AffineTransform);
+autoTableOfReal AffineTransform_extractTranslationVector (AffineTransform me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (1, my n);
 		for (long i = 1; i <= my n; i++) {
 			thy data[1][i] = my t[i];
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": translation vector not extracted.");
+		Melder_throw (me, U": translation vector not extracted.");
 	}
 }
 
diff --git a/dwtools/AffineTransform.h b/dwtools/AffineTransform.h
index a5e06b1..1978b7a 100644
--- a/dwtools/AffineTransform.h
+++ b/dwtools/AffineTransform.h
@@ -2,7 +2,7 @@
 #define _AffineTransform_h_
 /* AffineTransform.h
  *
- * Copyright (C) 2001-2011 David Weenink
+ * Copyright (C) 2001-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,20 +23,20 @@
 #include "TableOfReal.h"
 
 #include "AffineTransform_def.h"
-oo_CLASS_CREATE (AffineTransform, Data);
+oo_CLASS_CREATE (AffineTransform, Daata);
 
-void AffineTransform_init (I, long n);
+void AffineTransform_init (AffineTransform me, long n);
 
-AffineTransform AffineTransform_create (long n);
+autoAffineTransform AffineTransform_create (long n);
 
-Any AffineTransform_invert (I);
+Any AffineTransform_invert (AffineTransform me);
 /*
 	Get inverse transform for y = A x + t:
 		x = A^(-1)y - A^(-1) t
 */
 
-TableOfReal AffineTransform_extractMatrix (I);
+autoTableOfReal AffineTransform_extractMatrix (AffineTransform me);
 
-TableOfReal AffineTransform_extractTranslationVector (I);
+autoTableOfReal AffineTransform_extractTranslationVector (AffineTransform me);
 
 #endif /* _AffineTransform_h_ */
diff --git a/dwtools/AffineTransform_def.h b/dwtools/AffineTransform_def.h
index 0dc6be6..74595c0 100644
--- a/dwtools/AffineTransform_def.h
+++ b/dwtools/AffineTransform_def.h
@@ -1,6 +1,6 @@
 /* AffineTransform_def.h
  * 
- * Copyright (C) 1993-2008 David Weenink
+ * Copyright (C) 1993-2008,2015 David Weenink
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 
 #define ooSTRUCT AffineTransform
-oo_DEFINE_CLASS (AffineTransform, Data)
+oo_DEFINE_CLASS (AffineTransform, Daata)
 
 	oo_LONG (n)
 	oo_DOUBLE_VECTOR (t, n)
diff --git a/dwtools/CC.cpp b/dwtools/CC.cpp
index 7dca05a..68dcc73 100644
--- a/dwtools/CC.cpp
+++ b/dwtools/CC.cpp
@@ -51,14 +51,14 @@
 Thing_implement (CC, Sampled, 1);
 
 void structCC :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:", Melder_double (xmin), L" to ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"Number of frames: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"Time step: ", Melder_double (dx), L" seconds");
-	MelderInfo_writeLine (L"First frame at: ", Melder_double (x1), L" seconds");
-	MelderInfo_writeLine (L"Number of coefficients: ", Melder_integer (maximumNumberOfCoefficients));
-	MelderInfo_writeLine (L"Minimum frequency: ", Melder_double (fmin), L" Hz");
-	MelderInfo_writeLine (L"Maximum frequency: ", Melder_double (fmax), L" Hz");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:", xmin, U" to ", xmax, U" seconds");
+	MelderInfo_writeLine (U"Number of frames: ", nx);
+	MelderInfo_writeLine (U"Time step: ", dx, U" seconds");
+	MelderInfo_writeLine (U"First frame at: ", x1, U" seconds");
+	MelderInfo_writeLine (U"Number of coefficients: ", maximumNumberOfCoefficients);
+	MelderInfo_writeLine (U"Minimum frequency: ", fmin, U" Hz");
+	MelderInfo_writeLine (U"Maximum frequency: ", fmax, U" Hz");
 }
 
 void CC_Frame_init (CC_Frame me, long numberOfCoefficients) {
@@ -66,8 +66,7 @@ void CC_Frame_init (CC_Frame me, long numberOfCoefficients) {
 	my numberOfCoefficients = numberOfCoefficients;
 }
 
-void CC_init (I, double tmin, double tmax, long nt, double dt, double t1,
-              long maximumNumberOfCoefficients, double fmin, double fmax) {
+void CC_init (I, double tmin, double tmax, long nt, double dt, double t1, long maximumNumberOfCoefficients, double fmin, double fmax) {
 	iam (CC);
 	my fmin = fmin;
 	my fmax = fmax;
@@ -79,8 +78,7 @@ void CC_init (I, double tmin, double tmax, long nt, double dt, double t1,
 Matrix CC_to_Matrix (I) {
 	iam (CC);
 	try {
-		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1,
-		                                 1, my maximumNumberOfCoefficients, my maximumNumberOfCoefficients, 1, 1);
+		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 1, my maximumNumberOfCoefficients, my maximumNumberOfCoefficients, 1.0, 1.0);
 
 		for (long i = 1; i <= my nx; i++) {
 			CC_Frame cf = & my frame[i];
@@ -90,7 +88,7 @@ Matrix CC_to_Matrix (I) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
@@ -102,10 +100,10 @@ void CC_paint (I, Graphics g, double xmin, double xmax, long cmin,
 	Matrix_paintCells (thee.peek(), g, xmin, xmax, cmin, cmax, minimum, maximum);
 
 	if (garnish) {
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"Coefficients");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Coefficients");
 	}
 }
 
diff --git a/dwtools/CCA.cpp b/dwtools/CCA.cpp
index 105e0ed..65939da 100644
--- a/dwtools/CCA.cpp
+++ b/dwtools/CCA.cpp
@@ -1,6 +1,6 @@
 /* CCA.c
  *
- * Copyright (C) 1993-2012 David Weenink
+ * Copyright (C) 1993-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -57,13 +57,13 @@
 #include "CCA_def.h"
 
 void structCCA :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of coefficients: ", Melder_integer (numberOfCoefficients));
-	MelderInfo_writeLine (L"ny: ", Melder_integer (y -> dimension));
-	MelderInfo_writeLine (L"nx: ", Melder_integer (x -> dimension));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of coefficients: ", numberOfCoefficients);
+	MelderInfo_writeLine (U"ny: ", y -> dimension);
+	MelderInfo_writeLine (U"nx: ", x -> dimension);
 }
 
-Thing_implement (CCA, Data, 0);
+Thing_implement (CCA, Daata, 0);
 
 CCA CCA_create (long numberOfCoefficients, long ny, long nx) {
 	try {
@@ -75,12 +75,12 @@ CCA CCA_create (long numberOfCoefficients, long ny, long nx) {
 		my x = Eigen_create (numberOfCoefficients, nx);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("CCA not created.");
+		Melder_throw (U"CCA not created.");
 	}
 }
 
 void CCA_drawEigenvector (CCA me, Graphics g, int x_or_y, long ivec, long first, long last,
-                          double ymin, double ymax, int weigh, double size_mm, const wchar_t *mark,	int connect, int garnish) {
+                          double ymin, double ymax, int weigh, double size_mm, const char32 *mark,	int connect, int garnish) {
 	Eigen e = my x;
 	Strings labels = my xLabels;
 	if (x_or_y == 1) {
@@ -100,12 +100,14 @@ CCA TableOfReal_to_CCA (TableOfReal me, long ny) {
 		long n = my numberOfRows, nx = my numberOfColumns - ny;
 
 		if (ny < 1 || ny > my numberOfColumns - 1) {
-			Melder_throw ("Dimension of first part not correct.");
+			Melder_throw (U"Dimension of first part not correct.");
+		}
+		if (ny > nx) {
+			Melder_throw (U"The dimension of the dependent part (", ny, U") must be less than or equal to "
+				"the dimension of the independent part (", nx, U").");
 		}
-		if (ny > nx) Melder_throw (L"The dimension of the dependent part (", ny, L") must be less than or equal to "
-			                           "the dimension of the independent part (", nx, L").");
 		if (n < ny) {
-			Melder_throw (L"The number of observations must be larger then ", ny, ".");
+			Melder_throw (U"The number of observations must be larger then ", ny, U".");
 		}
 
 		TableOfReal_areAllCellsDefined (me, 0, 0, 0, 0);
@@ -129,25 +131,21 @@ CCA TableOfReal_to_CCA (TableOfReal me, long ny) {
 		double **vx = svdx -> v;
 		double fnormy = NUMfrobeniusnorm (n, ny, uy);
 		double fnormx = NUMfrobeniusnorm (n, nx, ux);
-		if (fnormy == 0 || fnormx == 0) {
-			Melder_throw ("One of the parts of the table contains only zeros.");
+		if (fnormy == 0.0 || fnormx == 0.0) {
+			Melder_throw (U"One of the parts of the table contains only zeros.");
 		}
 
-		/*
-			Centre the data and svd it.
-		*/
+		// Centre the data and svd it.
 
-		NUMcentreColumns (uy, 1, n, 1, ny, NULL);
-		NUMcentreColumns (ux, 1, n, 1, nx, NULL);
+		NUMcentreColumns (uy, 1, n, 1, ny, nullptr);
+		NUMcentreColumns (ux, 1, n, 1, nx, nullptr);
 
 		SVD_compute (svdy.peek()); SVD_compute (svdx.peek());
 
-		long numberOfZeroedy = SVD_zeroSmallSingularValues (svdy.peek(), 0);
-		long numberOfZeroedx = SVD_zeroSmallSingularValues (svdx.peek(), 0);
+		long numberOfZeroedy = SVD_zeroSmallSingularValues (svdy.peek(), 0.0);
+		long numberOfZeroedx = SVD_zeroSmallSingularValues (svdx.peek(), 0.0);
 
-		/*
-			Form the matrix C = ux' uy (use svd-object storage)
-		*/
+		// Form the matrix C = ux' uy (use svd-object storage)
 
 		autoSVD svdc = SVD_create (nx, ny);
 		double **uc = svdc -> u;
@@ -164,7 +162,7 @@ CCA TableOfReal_to_CCA (TableOfReal me, long ny) {
 		}
 
 		SVD_compute (svdc.peek());
-		long numberOfZeroedc = SVD_zeroSmallSingularValues (svdc.peek(), 0);
+		long numberOfZeroedc = SVD_zeroSmallSingularValues (svdc.peek(), 0.0);
 		long numberOfCoefficients = ny - numberOfZeroedc;
 
 		autoCCA thee = CCA_create (numberOfCoefficients, ny, nx);
@@ -189,14 +187,14 @@ CCA TableOfReal_to_CCA (TableOfReal me, long ny) {
 			double ccc = svdc -> d[i];
 			thy y -> eigenvalues[i] = thy x -> eigenvalues[i] = ccc * ccc;
 			for (long j = 1; j <= ny; j++) {
-				double t = 0;
+				double t = 0.0;
 				for (long q = 1; q <= ny - numberOfZeroedy; q++) {
 					t += vc[q][i] * vy[j][q] / svdy -> d[q];
 				}
 				evecy[i][j] = t;
 			}
 			for (long j = 1; j <= nx; j++) {
-				double t = 0;
+				double t = 0.0;
 				for (long q = 1; q <= nx - numberOfZeroedx; q++) {
 					t += uc[q][i] * vx[j][q] / svdx -> d[q];
 				}
@@ -204,16 +202,15 @@ CCA TableOfReal_to_CCA (TableOfReal me, long ny) {
 			}
 		}
 
-		/*
-			Normalize eigenvectors.
-		*/
+		// Normalize eigenvectors.
+
 		NUMnormalizeRows (thy y -> eigenvectors, numberOfCoefficients, ny, 1);
 		NUMnormalizeRows (thy x -> eigenvectors, numberOfCoefficients, nx, 1);
 		Melder_assert (thy x -> dimension == thy xLabels -> numberOfStrings &&
 		               thy y -> dimension == thy yLabels -> numberOfStrings);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": CCA not created.");
+		Melder_throw (me, U": CCA not created.");
 	}
 }
 
@@ -222,25 +219,26 @@ TableOfReal CCA_and_TableOfReal_scores (CCA me, TableOfReal thee, long numberOfF
 		long n = thy numberOfRows;
 		long nx = my x -> dimension, ny = my y -> dimension;
 
-		if (ny + nx != thy numberOfColumns) Melder_throw ("The number of columns in the table (", thy numberOfColumns,
-			        ") does not agree with the dimensions of the CCA object (ny + nx = ", ny, " + ", nx, ").");
-
+		if (ny + nx != thy numberOfColumns) {
+			Melder_throw (U"The number of columns in the table (", thy numberOfColumns,
+				U") does not agree with the dimensions of the CCA object (ny + nx = ", ny, U" + ", nx, U").");
+		}
 		if (numberOfFactors == 0) {
 			numberOfFactors = my numberOfCoefficients;
 		}
-		if (numberOfFactors < 1 || numberOfFactors > my numberOfCoefficients) Melder_throw
-			("The number of factors must be in interval [1, ", my numberOfCoefficients, L"].");
-
+		if (numberOfFactors < 1 || numberOfFactors > my numberOfCoefficients) {
+			Melder_throw (U"The number of factors must be in interval [1, ", my numberOfCoefficients, U"].");
+		}
 		autoTableOfReal him = TableOfReal_create (n, 2 * numberOfFactors);
 		TableOfReal phim = him.peek();
 		NUMstrings_copyElements (thy rowLabels, his rowLabels, 1, thy numberOfRows);
 		Eigen_and_TableOfReal_project_into (my y, thee, 1, ny, &phim, 1, numberOfFactors);
 		Eigen_and_TableOfReal_project_into (my x, thee, ny + 1, thy numberOfColumns, &phim, numberOfFactors + 1, his numberOfColumns);
-		TableOfReal_setSequentialColumnLabels (him.peek(), 1, numberOfFactors, L"y_", 1, 1);
-		TableOfReal_setSequentialColumnLabels (him.peek(), numberOfFactors + 1, his numberOfColumns, L"x_", 1, 1);
+		TableOfReal_setSequentialColumnLabels (him.peek(), 1, numberOfFactors, U"y_", 1, 1);
+		TableOfReal_setSequentialColumnLabels (him.peek(), numberOfFactors + 1, his numberOfColumns, U"x_", 1, 1);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no TableOfReal with scores created.");
+		Melder_throw (me, U": no TableOfReal with scores created.");
 	}
 }
 
@@ -255,7 +253,7 @@ TableOfReal CCA_and_TableOfReal_predict (CCA me, TableOfReal thee, long from) {
 		*/
 
 		if (ny != nev) {
-			Melder_throw ("There are not enough correlations present for prediction.");
+			Melder_throw (U"There are not enough correlations present for prediction.");
 		}
 
 		if (from == 0) {
@@ -263,7 +261,7 @@ TableOfReal CCA_and_TableOfReal_predict (CCA me, TableOfReal thee, long from) {
 		}
 		long ncols = thy numberOfColumns - from + 1;
 		if (from < 1 || ncols != nx) {
-			Melder_throw ("The number of columns to analyze must be equal to ", nx, ".");
+			Melder_throw (U"The number of columns to analyze must be equal to ", nx, U".");
 		}
 
 		// ???? dimensions if nx .. ny ??
@@ -278,7 +276,7 @@ TableOfReal CCA_and_TableOfReal_predict (CCA me, TableOfReal thee, long from) {
 		for (long i = 1; i <= thy numberOfRows; i++) {
 			NUMvector_copyElements (his data[i], buf.peek(), 1, ny);
 			for (long j = 1; j <= ny; j++) {
-				double t = 0;
+				double t = 0.0;
 				for (long k = 1; k <= ny; k++) {
 					t += sqrt (d[k]) * v[k][j] * buf[k];
 				}
@@ -287,7 +285,7 @@ TableOfReal CCA_and_TableOfReal_predict (CCA me, TableOfReal thee, long from) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no predictions created.");
+		Melder_throw (me, U": no predictions created.");
 	}
 }
 
@@ -297,7 +295,7 @@ TableOfReal CCA_and_TableOfReal_factorLoadings (CCA me, TableOfReal thee) {
 		autoTableOfReal him = CCA_and_Correlation_factorLoadings (me, c.peek());
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no factor loadings created.");
+		Melder_throw (me, U": no factor loadings created.");
 	}
 }
 
@@ -310,7 +308,7 @@ double CCA_getCorrelationCoefficient (CCA me, long index) {
 }
 
 void CCA_getZeroCorrelationProbability (CCA me, long index, double *chisq, long *ndf, double *probability) {
-	double lambda = 1, *ev = my y -> eigenvalues;
+	double lambda = 1.0, *ev = my y -> eigenvalues;
 	long nev = my y -> numberOfEigenvalues;
 	long ny = my y -> dimension, nx = my x -> dimension;
 
@@ -322,10 +320,10 @@ void CCA_getZeroCorrelationProbability (CCA me, long index, double *chisq, long
 	}
 
 	for (long i = index; i <= nev; i++) {
-		lambda *= (1 - ev[i]);
+		lambda *= (1.0 - ev[i]);
 	}
 	*ndf = (ny - index + 1) * (nx - index + 1);
-	*chisq = - (my numberOfObservations - (ny + nx + 3) / 2) * log (lambda);
+	*chisq = - (my numberOfObservations - (ny + nx + 3.0) / 2.0) * log (lambda);
 	*probability = NUMchiSquareQ (*chisq, *ndf);
 }
 
diff --git a/dwtools/CCA.h b/dwtools/CCA.h
index 1cf0306..db75341 100644
--- a/dwtools/CCA.h
+++ b/dwtools/CCA.h
@@ -29,7 +29,7 @@
 #include "TableOfReal.h"
 
 #include "CCA_def.h"
-oo_CLASS_CREATE (CCA, Data);
+oo_CLASS_CREATE (CCA, Daata);
 
 /*
 	Class CCA represents the Canonical Correlation Analysis of two datasets
@@ -53,7 +53,7 @@ oo_CLASS_CREATE (CCA, Data);
 CCA CCA_create (long numberOfCoefficients, long ny, long nx);
 
 void CCA_drawEigenvector (CCA me, Graphics g, int x_or_y, long ivec, long first, long last,
-	double ymin, double ymax, int weigh, double size_mm, const wchar_t *mark, int connect, int garnish);
+	double ymin, double ymax, int weigh, double size_mm, const char32 *mark, int connect, int garnish);
 
 double CCA_getEigenvectorElement (CCA me, int x_or_y, long ivec, long element);
 
diff --git a/dwtools/CCA_and_Correlation.cpp b/dwtools/CCA_and_Correlation.cpp
index af329b4..540c5ea 100644
--- a/dwtools/CCA_and_Correlation.cpp
+++ b/dwtools/CCA_and_Correlation.cpp
@@ -1,6 +1,6 @@
 /* CCA_and_Correlation.cpp
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,27 +31,26 @@ TableOfReal CCA_and_Correlation_factorLoadings (CCA me, Correlation thee) {
 	try {
 		long ny = my y -> dimension, nx = my x -> dimension;
 
-		if (ny + nx != thy numberOfColumns) Melder_throw ("The number of columns in the Correlation "
-			        "must equal the sum of the dimensions in the CCA object");
-
+		if (ny + nx != thy numberOfColumns) {
+			Melder_throw (U"The number of columns in the Correlation must equal the sum of the dimensions in the CCA object");
+		}
 		autoTableOfReal him = TableOfReal_create (2 * my numberOfCoefficients, thy numberOfColumns);
 
 		NUMstrings_copyElements (thy columnLabels, his columnLabels, 1, thy numberOfColumns);
-		TableOfReal_setSequentialRowLabels (him.peek(), 1, my numberOfCoefficients, L"dv", 1, 1);
-		TableOfReal_setSequentialRowLabels (him.peek(), my numberOfCoefficients + 1,
-		                                    2 * my numberOfCoefficients, L"iv", 1, 1);
+		TableOfReal_setSequentialRowLabels (him.peek(), 1, my numberOfCoefficients, U"dv", 1, 1);
+		TableOfReal_setSequentialRowLabels (him.peek(), my numberOfCoefficients + 1, 2 * my numberOfCoefficients, U"iv", 1, 1);
 
 		double **evecy = my y -> eigenvectors, **evecx = my x -> eigenvectors;
 		for (long i = 1; i <= thy numberOfRows; i++) {
 			for (long j = 1; j <= my numberOfCoefficients; j++) {
-				double t = 0;
+				double t = 0.0;
 				for (long k = 1; k <= ny; k++) {
 					t += thy data[i][k] * evecy[j][k];
 				}
 				his data[j][i] = t;
 			}
 			for (long j = 1; j <= my numberOfCoefficients; j++) {
-				double t = 0;
+				double t = 0.0;
 				for (long k = 1; k <= nx; k++) {
 					t += thy data[i][ny + k] * evecx[j][k];
 				}
@@ -60,19 +59,19 @@ TableOfReal CCA_and_Correlation_factorLoadings (CCA me, Correlation thee) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal not created from CCA & Correlation.");
+		Melder_throw (U"TableOfReal not created from CCA & Correlation.");
 	}
 }
 
 static void _CCA_and_Correlation_check (CCA me, Correlation thee, int canonicalVariate_from, int canonicalVariate_to) {
 	if (my y -> dimension + my x -> dimension != thy numberOfColumns) {
-		Melder_throw ("The number of columns in the Correlation object must equal the sum of the dimensions in the CCA object");
+		Melder_throw (U"The number of columns in the Correlation object must equal the sum of the dimensions in the CCA object");
 	}
 	if (canonicalVariate_to < canonicalVariate_from) {
-		Melder_throw ("The second value in the \"Canonical variate range\" must be equal or larger than the first.");
+		Melder_throw (U"The second value in the \"Canonical variate range\" must be equal or larger than the first.");
 	}
 	if (canonicalVariate_from < 1 || canonicalVariate_to > my numberOfCoefficients) {
-		Melder_throw ("The \"Canonical variate range\" must be within the interval [1, ", my numberOfCoefficients, "].");
+		Melder_throw (U"The \"Canonical variate range\" must be within the interval [1, ", my numberOfCoefficients, U"].");
 	}
 }
 
@@ -103,12 +102,12 @@ double CCA_and_Correlation_getVarianceFraction (CCA me, Correlation thee, int x_
 		ioffset = 0;
 	}
 
-	double varianceFraction = 0;
+	double varianceFraction = 0.0;
 	for (long icv = canonicalVariate_from; icv <= canonicalVariate_to; icv++) {
-		double variance = 0, varianceScaling = 0;
+		double variance = 0.0, varianceScaling = 0.0;
 
 		for (long i = 1; i <= n; i++) {
-			double si = 0;
+			double si = 0.0;
 			for (long j = 1; j <= n; j++) {
 				si += thy data[ioffset + i][ioffset + j] * evec[icv][j]; /* Rxx.e */
 			}
@@ -124,7 +123,7 @@ double CCA_and_Correlation_getVarianceFraction (CCA me, Correlation thee, int x_
 double CCA_and_Correlation_getRedundancy_sl (CCA me, Correlation thee, int x_or_y, int canonicalVariate_from, int canonicalVariate_to) {
 	_CCA_and_Correlation_check (me, thee, canonicalVariate_from, canonicalVariate_to);
 
-	double redundancy = 0;
+	double redundancy = 0.0;
 	for (long icv = canonicalVariate_from; icv <= canonicalVariate_to; icv++) {
 		double varianceFraction = CCA_and_Correlation_getVarianceFraction (me, thee, x_or_y, icv, icv);
 		if (varianceFraction == NUMundefined) {
diff --git a/dwtools/CCA_and_Correlation.h b/dwtools/CCA_and_Correlation.h
index 4c44140..44967e6 100644
--- a/dwtools/CCA_and_Correlation.h
+++ b/dwtools/CCA_and_Correlation.h
@@ -25,17 +25,8 @@
  djmw 20110307 Latest modification.
  */
 
-#ifndef _CCA_h_
-	#include "CCA.h"
-#endif
-#ifndef _SSCP_h_
-	#include "SSCP.h"
-#endif
-
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
+#include "CCA.h"
+#include "SSCP.h"
 
 TableOfReal CCA_and_Correlation_factorLoadings (CCA me, Correlation thee);
 /*
@@ -56,8 +47,4 @@ double CCA_and_Correlation_getRedundancy_sl (CCA me, Correlation thee, int x_or_
 	redundancy = VarianceFraction * (canonical correlation)^2
 */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _CCA_and_Correlation_h_ */
diff --git a/dwtools/CCA_def.h b/dwtools/CCA_def.h
index ab99331..37f87ca 100644
--- a/dwtools/CCA_def.h
+++ b/dwtools/CCA_def.h
@@ -26,7 +26,7 @@
  */
 
 #define ooSTRUCT CCA
-oo_DEFINE_CLASS (CCA, Data)
+oo_DEFINE_CLASS (CCA, Daata)
 
 	oo_LONG (numberOfCoefficients)
 	oo_LONG (numberOfObservations)
@@ -36,8 +36,8 @@ oo_DEFINE_CLASS (CCA, Data)
 	oo_OBJECT(Eigen, 0, x)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (CCA)
diff --git a/dwtools/CC_def.h b/dwtools/CC_def.h
index b11af6f..45c49d9 100644
--- a/dwtools/CC_def.h
+++ b/dwtools/CC_def.h
@@ -23,7 +23,7 @@ oo_DEFINE_STRUCT (CC_Frame)
 
 	oo_LONG (numberOfCoefficients)
 	#if oo_READING_BINARY
-		if (localVersion == 0)
+		if (formatVersion == 0)
 		{
 			oo_FLOAT (c0)
 			oo_FLOAT_VECTOR (c, numberOfCoefficients)
@@ -52,8 +52,8 @@ oo_DEFINE_CLASS (CC, Sampled)
 	oo_STRUCT_VECTOR (CC_Frame, frame, nx)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (CC)
diff --git a/dwtools/CCs_to_DTW.cpp b/dwtools/CCs_to_DTW.cpp
index 4033d8b..e5b8a4a 100644
--- a/dwtools/CCs_to_DTW.cpp
+++ b/dwtools/CCs_to_DTW.cpp
@@ -2,7 +2,7 @@
  *
  *	Dynamic Time Warp of two CCs.
  *
- * Copyright (C) 1993-2013 David Weenink
+ * Copyright (C) 1993-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,20 +27,19 @@
 
 #include "CCs_to_DTW.h"
 
-static void regression (I, long frame, double r[], long nr) {
-	iam (CC);
+static void regression (CC me, long frame, double r[], long nr) {
 
 	// sum(i^2;i=-n..n) = 2n^3/3 + n^2 +n/3 = n (n (2n/3 + 1) + 1/3);
 
 	long nrd2 = nr / 2;
-	double sumsq = nrd2 * (nrd2 * (nr / 3 + 1) + 1 / 3);
+	double sumsq = nrd2 * (nrd2 * (nr / 3.0 + 1.0) + 1.0 / 3.0);
 
 	if (frame <= nrd2 || frame >= my nx - nrd2) {
 		return;
 	}
 
 	for (long i = 0; i <= my maximumNumberOfCoefficients; i++) {
-		r[i] = 0;
+		r[i] = 0.0;
 	}
 
 	long nmin = CC_getMinimumNumberOfCoefficients (me, frame - nrd2, frame + nrd2);
@@ -56,23 +55,21 @@ static void regression (I, long frame, double r[], long nr) {
 	}
 }
 
-DTW CCs_to_DTW (I, thou, double wc, double wle, double wr, double wer, double dtr) {
+DTW CCs_to_DTW (CC me, CC thee, double wc, double wle, double wr, double wer, double dtr) {
 	try {
-		iam (CC); thouart (CC);
-
 		if (my maximumNumberOfCoefficients != thy maximumNumberOfCoefficients) {
-			Melder_throw ("CC orders must be equal.");
+			Melder_throw (U"CC orders must be equal.");
 		}
-		long nr = dtr / my dx;
-		if (wr != 0 && nr < 2) {
-			Melder_throw ("Time window for regression is too small.");
+		long nr = (long) floor (dtr / my dx);
+		if (wr != 0.0 && nr < 2) {
+			Melder_throw (U"Time window for regression is too small.");
 		}
 
 		if (nr % 2 == 0) {
 			nr++;
 		}
-		if (wr != 0) {
-			Melder_casual ("%ld frames used for regression coefficients.", nr);
+		if (wr != 0.0) {
+			Melder_casual (nr, U" frames used for regression coefficients.");
 		}
 
 		autoDTW him = DTW_create (my xmin, my xmax, my nx, my dx, my x1, thy xmin, thy xmax, thy nx, thy dx, thy x1);
@@ -81,7 +78,7 @@ DTW CCs_to_DTW (I, thou, double wc, double wle, double wr, double wer, double dt
 
 		// Calculate distance matrix
 
-		autoMelderProgress progess (L"CCs_to_DTW");
+		autoMelderProgress progess (U"CCs_to_DTW");
 		for (long i = 1; i <= my nx; i++) {
 			CC_Frame fi = & my frame[i];
 
@@ -89,11 +86,11 @@ DTW CCs_to_DTW (I, thou, double wc, double wle, double wr, double wer, double dt
 
 			for (long j = 1; j <= thy nx; j++) {
 				CC_Frame fj = & thy frame[j];
-				double dist = 0, distr = 0;
+				double dist = 0.0, distr = 0.0;
 
 				// Cepstral distance
 
-				if (wc != 0) {
+				if (wc != 0.0) {
 					for (long k = 1; k <= fj -> numberOfCoefficients; k++) {
 						double d = fi -> c[k] - fj -> c[k];
 						dist += d * d;
@@ -103,14 +100,14 @@ DTW CCs_to_DTW (I, thou, double wc, double wle, double wr, double wer, double dt
 
 				// Log energy distance
 
-				if (wle != 0) {
+				if (wle != 0.0) {
 					double d = fi -> c0 - fj -> c0;
 					dist += wle * d * d;
 				}
 
 				// Regression distance
 
-				if (wr != 0) {
+				if (wr != 0.0) {
 					regression (thee, j, rj.peek(), nr);
 					for (long k = 1; k <= fj -> numberOfCoefficients; k++) {
 						double d = ri[k] - rj[k];
@@ -121,8 +118,8 @@ DTW CCs_to_DTW (I, thou, double wc, double wle, double wr, double wer, double dt
 
 				// Regression on c[0]: log(energy)
 
-				if (wer != 0) {
-					if (wr == 0) {
+				if (wer != 0.0) {
+					if (wr == 0.0) {
 						regression (thee, j, rj.peek(), nr);
 					}
 					double d = ri[0] - rj[0];
@@ -133,13 +130,13 @@ DTW CCs_to_DTW (I, thou, double wc, double wle, double wr, double wer, double dt
 				his z[i][j] = sqrt (dist);	/* prototype along y-direction */
 			}
 
-			if ( (i % 10) == 1) {
-				Melder_progress (0.999 * i / my nx, L"Calculate distances: frame ", Melder_integer (i), L" from ", Melder_integer (my nx), L".");
+			if ((i % 10) == 1) {
+				Melder_progress (0.999 * i / my nx, U"Calculate distances: frame ", i, U" from ", my nx, U".");
 			}
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("DTW not created from CCs.");
+		Melder_throw (U"DTW not created from CCs.");
 	}
 }
 
diff --git a/dwtools/CCs_to_DTW.h b/dwtools/CCs_to_DTW.h
index ad54ff3..a47f0b6 100644
--- a/dwtools/CCs_to_DTW.h
+++ b/dwtools/CCs_to_DTW.h
@@ -30,7 +30,7 @@
 #include "DTW.h"
 
 
-DTW CCs_to_DTW (I, thou, double wc, double wle, double wr, double wer, double dtr);
+DTW CCs_to_DTW (CC me, CC thee, double wc, double wle, double wr, double wer, double dtr);
 /*
 	1. Calculate distances between CCs:
 		Distance between frame i (from me) and j (from thee) is
diff --git a/dwtools/Categories.cpp b/dwtools/Categories.cpp
index eb6316a..c309b9d 100644
--- a/dwtools/Categories.cpp
+++ b/dwtools/Categories.cpp
@@ -1,6 +1,6 @@
 /* Categories.cpp
  *
- * Copyright (C) 1993-2013 David Weenink
+ * Copyright (C) 1993-2013, 2015 David Weenink, 2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,27 +24,27 @@
 
 #include "Categories.h"
 
-void structCategories :: v_readText (MelderReadText a_text) {
+void structCategories :: v_readText (MelderReadText a_text, int /*formatVersion*/) {
 	long l_size = texgeti4 (a_text);
 	if (l_size == 0) {
 		OrderedOfString_init (this, 1);
 	} else if (l_size < 0) {
-		Melder_throw ("Size cannot be negative.");
+		Melder_throw (U"Size cannot be negative.");
 	} else {
-		OrderedOfString_init (this, l_size);   // David, in je vorige versie kon dit tweemaal aangeroepen worden (en in dat geval crashend): Ja dat was een bug, Ok nu
+		OrderedOfString_init (this, l_size);
 	}
 	for (long i = 1; i <= l_size; i ++) {
 		autoSimpleString itemi = Thing_new (SimpleString);
-		itemi -> v_readText (a_text);
+		itemi -> v_readText (a_text, 0);
 		Ordered_addItemPos (this, itemi.transfer(), i);
 	}
 }
 
 void structCategories :: v_writeText (MelderFile file) {
-	texputi4 (file, size, L"size", 0, 0, 0, 0, 0);
+	texputi4 (file, size, U"size", 0, 0, 0, 0, 0);
 	for (long i = 1; i <= size; i++) {
 		SimpleString data = (SimpleString) item [i];
-		texputintro (file, L"item" " [", Melder_integer (i), L"]:", 0, 0, 0);
+		texputintro (file, U"item" " [", Melder_integer (i), U"]:", nullptr, nullptr, nullptr);
 		data -> structSimpleString :: v_writeText (file);
 		texexdent (file);
 	}
@@ -56,47 +56,45 @@ void Categories_init (Categories me, long size) {
 	OrderedOfString_init (me, size);
 }
 
-Categories Categories_create () {
+autoCategories Categories_create () {
 	try {
 		autoCategories me = Thing_new (Categories);
 		Categories_init (me.peek(), 10);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Categories not created.");
+		Melder_throw (U"Categories not created.");
 	}
 }
 
-Categories Categories_sequentialNumbers (long n) {
+autoCategories Categories_sequentialNumbers (long n) {
 	try {
 		autoCategories me = Thing_new (Categories);
 		OrderedOfString_init (me.peek(), 5);
 		OrderedOfString_sequentialNumbers (me.peek(), n);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Sequential number Categories not created.");
+		Melder_throw (U"Sequential number Categories not created.");
 	}
 }
 
-Categories Categories_selectUniqueItems (Categories me, int sorted) {
+autoCategories Categories_selectUniqueItems (Categories me, int sorted) {
 	try {
 		autoOrderedOfString s = OrderedOfString_selectUniqueItems (me, sorted);
 		autoCategories thee = OrderedOfString_to_Categories (s.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no unique categories created.");
+		Melder_throw (me, U": no unique categories created.");
 	}
 }
 
-void Categories_drawItem (Categories me, Graphics g, long position,
-                          double xWC, double yWC) {
+void Categories_drawItem (Categories me, Graphics g, long position, double xWC, double yWC) {
 	if (position < 1 || position > my size) {
 		return;
 	}
-	SimpleString_draw ( (SimpleString) my item[position], g, xWC, yWC);
+	SimpleString_draw ((SimpleString) my item[position], g, xWC, yWC);
 }
 
-Categories OrderedOfString_to_Categories (I) {
-	iam (OrderedOfString);
+autoCategories OrderedOfString_to_Categories (OrderedOfString me) {
 	try {
 		autoCategories thee = Categories_create();
 
@@ -104,9 +102,9 @@ Categories OrderedOfString_to_Categories (I) {
 			autoSimpleString item = Data_copy ( (SimpleString) my item [i]);
 			Collection_addItem (thee.peek(), item.transfer());
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Categories.");
+		Melder_throw (me, U": not converted to Categories.");
 	}
 }
 
@@ -115,8 +113,7 @@ long Categories_getSize (Categories me) {
 }
 
 /* TableOfReal_Rowlabels_to_Categories  ??? */
-Categories TableOfReal_to_CategoriesRow (I) {
-	iam (TableOfReal);
+autoCategories TableOfReal_to_CategoriesRow (TableOfReal me) {
 	try {
 		autoCategories thee = Categories_create ();
 
@@ -126,14 +123,13 @@ Categories TableOfReal_to_CategoriesRow (I) {
 				Collection_addItem (thee.peek(), s.transfer());
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": row labels not converted to Categories.");
+		Melder_throw (me, U": row labels not converted to Categories.");
 	}
 }
 
-Categories TableOfReal_to_CategoriesColumn (I) {
-	iam (TableOfReal);
+autoCategories TableOfReal_to_CategoriesColumn (TableOfReal me) {
 	try {
 		autoCategories thee = Categories_create ();
 
@@ -143,9 +139,9 @@ Categories TableOfReal_to_CategoriesColumn (I) {
 				Collection_addItem (thee.peek(), s.transfer());
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": columnlabels not converted to Categories.");
+		Melder_throw (me, U": columnlabels not converted to Categories.");
 	}
 }
 
diff --git a/dwtools/Categories.h b/dwtools/Categories.h
index ea72781..f46d062 100644
--- a/dwtools/Categories.h
+++ b/dwtools/Categories.h
@@ -2,7 +2,7 @@
 #define _Categories_h_
 /* Categories.h
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink, 2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,27 +25,29 @@
 #include "Graphics.h"
 
 Thing_define (Categories, OrderedOfString) {
-	// overridden methods:
-	public:
-		virtual void v_readText (MelderReadText text);
-		virtual void v_writeText (MelderFile file);
+	void v_readText (MelderReadText text, int formatVersion)
+		override;
+	void v_writeText (MelderFile file)
+		override;
 };
 
 void Categories_init (Categories me, long size);
 
-Categories Categories_create ();
-Categories Categories_sequentialNumbers (long n);
+autoCategories Categories_create ();
 
-Categories Categories_selectUniqueItems (Categories me, int sorted);
+autoCategories Categories_sequentialNumbers (long n);
+
+autoCategories Categories_selectUniqueItems (Categories me, int sorted);
 
 void Categories_drawItem (Categories me, Graphics g, long position, double xWC, double yWC);
 
-Categories OrderedOfString_to_Categories (I);
+autoCategories OrderedOfString_to_Categories (OrderedOfString me);
 
 long Categories_getSize (Categories me);
 /* return my size */
 
-Categories TableOfReal_to_CategoriesRow (I);
-Categories TableOfReal_to_CategoriesColumn (I);
+autoCategories TableOfReal_to_CategoriesRow (TableOfReal me);
+
+autoCategories TableOfReal_to_CategoriesColumn (TableOfReal me);
 
 #endif /* _Categories_h_ */
diff --git a/dwtools/CategoriesEditor.cpp b/dwtools/CategoriesEditor.cpp
index d47d128..2ae5255 100644
--- a/dwtools/CategoriesEditor.cpp
+++ b/dwtools/CategoriesEditor.cpp
@@ -1,810 +1,801 @@
-/* CategoriesEditor.cpp
- *
- * Copyright (C) 1993-2013 David Weenink
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- djmw 1995
- djmw 19980225 repaired a memory leak, caused by wrong inheritance for
- 	 CategoriesEditorInsert command.
- djmw 20020408 GPL
- djmw 20020408 Modified 'createMenus'
- djmw 20060111 Replaced Resources.h with Preferences.h
- djmw 20060328 Changed last argument to 0 in XtVaSetValues, XtVaGetValues and XtVaCreateManagedWidget
- 	for 64-bit compatibility.
- djmw 20070620 Latest modification.
- pb 20080320 split off Help menu
- pb 20080321 new Editor API
- djmw 20090107 Removed a bug in update that caused editor to crash on replace
- djmw 20090203 Removed potential crashes in CategoriesEditor<command>_create.
- djmw 20110304 Thing_new
- djmw 20111110 Use autostringvector
-*/
-
-#define CategoriesEditor_TEXTMAXLENGTH 100
-
-#include "CategoriesEditor.h"
-//#include "Preferences.h"
-#include "EditorM.h"
-
-Thing_implement (CategoriesEditor, Editor, 0);
-
-/* forward declarations */
-static void update (I, long from, long to, const long *select, long nSelect);
-static void update_dos (I);
-
-const wchar_t *CategoriesEditor_EMPTYLABEL = L"(empty)";
-
-static void menu_cb_help (EDITOR_ARGS) {
-	EDITOR_IAM (CategoriesEditor);
-	Melder_help (L"CategoriesEditor");
-}
-
-/**************** Some methods for Collection  ****************/
-
-/* Preconditions: */
-/*	1 <= (position[i], newpos) <= size; */
-/*	newpos <= position[1] || newpos >= position[npos] */
-static void Ordered_moveItems (I, long position[], long npos, long newpos) {
-	iam (Ordered);
-	long pos, min = position[1], max = position[1];
-
-	for (long i = 2; i <= npos; i++) {
-		if (position[i] > max) {
-			max = position[i];
-		} else if (position[i] < min) {
-			min = position[i];
-		}
-	}
-
-	Melder_assert (min >= 1 && max <= my size && (newpos <= min || newpos >= max));
-
-	autoNUMvector<Data> tmp (1, npos);
-
-	// 'remove'
-
-	for (long i = 1; i <= npos; i++) {
-		tmp[i] = (Data) my item[position[i]];
-		my item[position[i]] = 0;
-	}
-
-	// create a contiguous 'hole'
-
-	if (newpos <= min) {
-		pos = max;
-		for (long i = max; i >= newpos; i--) {
-			if (my item[i]) {
-				my item[pos--] = my item[i];
-			}
-		}
-		pos = newpos;
-	} else {
-		pos = min;
-		for (long i = min; i <= newpos; i++) {
-			if (my item[i]) {
-				my item[pos++] = my item[i];
-			}
-		}
-		pos = newpos - npos + 1;
-	}
-
-	// fill the 'hole'
-
-	for (long i = 1; i <= npos; i++) {
-		my item[pos++] = tmp[i];
-	}
-}
-
-static void Collection_replaceItemPos (I, Any item, long pos) {
-	iam (Collection);
-	if (pos < 1 || pos > my size) {
-		return;
-	}
-	forget ( ( (SimpleString *) my item) [pos]);
-	my item[pos] = item;
-}
-
-/* Remove the item at position 'from' and insert it at position 'to'. */
-static void Ordered_moveItem (I, long from, long to) {
-	iam (Ordered);
-	if (from < 1 || from > my size) {
-		from = my size;
-	}
-	if (to < 1 || to > my size) {
-		to = my size;
-	}
-	if (from == to) {
-		return;
-	}
-	Data tmp = (Data) my item[from];
-	if (from > to) {
-		for (long i = from; i > to; i--) {
-			my item[i] = my item[i - 1];
-		}
-	} else {
-		for (long i = from; i < to; i++) {
-			my item[i] = my item[i + 1];
-		}
-	}
-	my item[to] = tmp;
-}
-
-/********************** General Command **********************/
-
-Thing_define (CategoriesEditorCommand, Command) {
-	// new data:
-public:
-	Categories categories;
-	long *selection; long nSelected, newPos;
-	// overridden methods:
-	virtual void v_destroy ();
-};
-
-Thing_implement (CategoriesEditorCommand, Command, 0);
-
-void structCategoriesEditorCommand :: v_destroy () {
-	NUMvector_free (selection, 1);
-	forget (categories);
-	CategoriesEditorCommand_Parent :: v_destroy ();
-}
-
-static void CategoriesEditorCommand_init (I, const wchar_t *name,  Any data,
-        int (*execute) (Any), int (*undo) (Any), int nCategories, int nSelected) {
-	iam (CategoriesEditorCommand);
-	(void) nCategories;
-
-	my nSelected = nSelected;
-	Command_init (me, name, data, execute, undo);
-	my categories = Categories_create();
-	my selection = NUMvector<long> (1, nSelected);
-}
-
-/*********************** Insert Command ***********************/
-
-Thing_define (CategoriesEditorInsert, CategoriesEditorCommand) {
-};
-
-Thing_implement (CategoriesEditorInsert, CategoriesEditorCommand, 0);
-
-static int CategoriesEditorInsert_execute (I) {
-	iam (CategoriesEditorInsert);
-	CategoriesEditor editor = (CategoriesEditor) my data;
-	Categories categories = (Categories) editor -> data;
-	autoSimpleString str = Data_copy ( (SimpleString) ( (Categories) my categories)->item[1]);
-	Ordered_addItemPos (categories, str.transfer(), my selection[1]);
-	update (editor, my selection[1], 0, my selection, 1);
-	return 1;
-}
-
-static int CategoriesEditorInsert_undo (I) {
-	iam (CategoriesEditorInsert);
-	CategoriesEditor editor = (CategoriesEditor) my data;
-	Categories categories = (Categories) editor -> data;
-	Collection_removeItem (categories, my selection[1]);
-	update (editor, my selection[1], 0, my selection, 1);
-	return 1;
-}
-
-static CategoriesEditorInsert CategoriesEditorInsert_create (Any data, Any str, int position) {
-	try {
-		autoCategoriesEditorInsert me = Thing_new (CategoriesEditorInsert);
-		CategoriesEditorCommand_init (me.peek(), L"Insert", data, CategoriesEditorInsert_execute,
-		                              CategoriesEditorInsert_undo, 1, 1);
-		my selection[1] = position;
-		Collection_addItem (my categories, (SimpleString) str);
-		return me.transfer();
-	} catch (MelderError) {
-		Melder_throw ("CategoriesEditorInsert not created.");
-	}
-}
-
-/*********************** Remove Command ***********************/
-
-Thing_define (CategoriesEditorRemove, CategoriesEditorCommand) {
-};
-
-Thing_implement (CategoriesEditorRemove, CategoriesEditorCommand, 0);
-
-static int CategoriesEditorRemove_execute (I) {
-	iam (CategoriesEditorRemove);
-	CategoriesEditor editor = (CategoriesEditor) my data;
-	Categories l_categories = (Categories) editor -> data;   // David, weer link: tweemaal dezelfde naam (categories): is ok, geen conflict. Naam toch maar aangepast
-
-	for (long i = my nSelected; i >= 1; i--) {
-		Ordered_addItemPos (my categories, (SimpleString) l_categories -> item[my selection[i]], 1);
-		l_categories -> item[my selection[i]] = 0;
-		Collection_removeItem (l_categories, my selection[i]);
-	}
-	update (editor, my selection[1], 0, 0, 0);
-	return 1;
-}
-
-static int CategoriesEditorRemove_undo (I) {
-	iam (CategoriesEditorRemove);
-	CategoriesEditor editor = (CategoriesEditor) my data;
-	Categories categories = (Categories) editor -> data;
-
-	for (long i = 1; i <= my nSelected; i++) {
-		autoSimpleString item = Data_copy ( (SimpleString) my categories -> item[i]);
-		Ordered_addItemPos (categories, item.transfer(), my selection[i]);
-	}
-	update (editor, my selection[1], 0, my selection, my nSelected);
-	return 1;
-}
-
-static CategoriesEditorRemove CategoriesEditorRemove_create (Any data, long *posList, long posCount) {
-	try {
-		autoCategoriesEditorRemove me = Thing_new (CategoriesEditorRemove);
-		CategoriesEditorCommand_init (me.peek(), L"Remove", data, CategoriesEditorRemove_execute,
-		                              CategoriesEditorRemove_undo, posCount, posCount);
-		for (long i = 1; i <= posCount; i++) {
-			my selection[i] = posList[i];
-		}
-		return me.transfer();
-	} catch (MelderError) {
-		Melder_throw ("CategoriesEditorRemove not created.");
-	}
-}
-
-//update (me);
-/*********************** Replace Command ***********************/
-
-Thing_define (CategoriesEditorReplace, CategoriesEditorCommand) {
-};
-
-Thing_implement (CategoriesEditorReplace, CategoriesEditorCommand, 0);
-
-static int CategoriesEditorReplace_execute (I) {
-	iam (CategoriesEditorReplace);
-	CategoriesEditor editor = (CategoriesEditor) my data;
-	Categories categories = (Categories) editor -> data;
-
-	for (long i = my nSelected; i >= 1; i--) {
-		autoSimpleString str = Data_copy ( (SimpleString) my categories -> item[1]);
-		Ordered_addItemPos (my categories, (SimpleString) categories -> item[my selection[i]], 2);
-		categories -> item[my selection[i]] =  str.transfer();
-	}
-	update (editor, my selection[1], my selection[my nSelected], my selection, my nSelected);
-	return 1;
-}
-
-static int CategoriesEditorReplace_undo (I) {
-	iam (CategoriesEditorReplace);
-	CategoriesEditor editor = (CategoriesEditor) my data;
-	Categories categories = (Categories) editor -> data;
-
-	for (long i = 1; i <= my nSelected; i++) {
-		autoSimpleString str = Data_copy ( (SimpleString) my categories -> item[i + 1]);
-		Collection_replaceItemPos (categories, str.transfer(), my selection[i]);
-	}
-	update (editor, my selection[1], my selection[my nSelected], my selection, my nSelected);
-	return 1;
-}
-
-static CategoriesEditorReplace CategoriesEditorReplace_create (Any data, Any str, long *posList, long posCount) {
-	try {
-		autoCategoriesEditorReplace me = Thing_new (CategoriesEditorReplace);
-		CategoriesEditorCommand_init (me.peek(), L"Replace", data, CategoriesEditorReplace_execute,
-		                              CategoriesEditorReplace_undo, posCount + 1, posCount);
-		for (long i = 1; i <= posCount; i++) {
-			my selection[i] = posList[i];
-		}
-		Collection_addItem (my categories, (SimpleString) str);
-		return me.transfer();
-	} catch (MelderError) {
-		Melder_throw ("CategoriesEditorReplace not created.");
-	}
-}
-
-/*********************** MoveUp Command ***********************/
-
-Thing_define (CategoriesEditorMoveUp, CategoriesEditorCommand) {
-};
-
-Thing_implement (CategoriesEditorMoveUp, CategoriesEditorCommand, 0);
-
-static int CategoriesEditorMoveUp_execute (I) {
-	iam (CategoriesEditorMoveUp);
-	CategoriesEditor editor = (CategoriesEditor) my data;
-	Ordered_moveItems (editor->data, my selection, my nSelected, my newPos);
-	autoNUMvector<long> selection (1, my nSelected);
-	for (long i = 1; i <= my nSelected; i++) {
-		selection[i] = my newPos + i - 1;
-	}
-	update (editor, my newPos, my selection[my nSelected], selection.peek(), my nSelected);
-	return 1;
-}
-
-static int CategoriesEditorMoveUp_undo (I) {
-	iam (CategoriesEditorMoveUp);
-	CategoriesEditor editor = (CategoriesEditor) my data;
-
-	for (long i = 1; i <= my nSelected; i++) {
-		Ordered_moveItem (editor->data, my newPos, my selection[my nSelected]);
-	}
-	update (editor, my newPos, my selection[my nSelected], my selection, my nSelected);
-	return 1;
-}
-
-static CategoriesEditorMoveUp CategoriesEditorMoveUp_create (Any data, long *posList,
-        long posCount, long newPos) {
-	try {
-		autoCategoriesEditorMoveUp me = Thing_new (CategoriesEditorMoveUp);
-		CategoriesEditorCommand_init (me.peek(), L"Move up", data, CategoriesEditorMoveUp_execute,
-		                              CategoriesEditorMoveUp_undo, 0, posCount);
-		for (long i = 1; i <= posCount; i++) {
-			my selection[i] = posList[i];
-		}
-		my newPos = newPos;
-		return me.transfer();
-	} catch (MelderError) {
-		Melder_throw ("CategoriesEditorMoveUp not created.");
-	}
-}
-
-/*********************** MoveDown Command ***********************/
-
-Thing_define (CategoriesEditorMoveDown, CategoriesEditorCommand) {
-};
-
-Thing_implement (CategoriesEditorMoveDown, CategoriesEditorCommand, 0);
-
-static int CategoriesEditorMoveDown_execute (I) {
-	iam (CategoriesEditorMoveDown);
-	CategoriesEditor editor = (CategoriesEditor) my data;
-	Ordered_moveItems ( (Ordered) editor -> data, my selection, my nSelected, my newPos);
-	autoNUMvector<long> selection (1, my nSelected);
-	for (long i = 1; i <= my nSelected; i++) {
-		selection[i] = my newPos - my nSelected + i;
-	}
-	update (editor, my selection[1], my newPos, selection.peek(), my nSelected);
-	return 1;
-}
-
-static int CategoriesEditorMoveDown_undo (I) {
-	iam (CategoriesEditorMoveDown);
-	CategoriesEditor editor = (CategoriesEditor) my data;
-	for (long i = 1; i <= my nSelected; i++) {
-		Ordered_moveItem (editor -> data, my newPos, my selection[1]); // TODO 1 or i ??
-	}
-	long from = my selection[1];
-	update (editor, (from > 1 ? from-- : from), my newPos, my selection, my nSelected);
-	return 1;
-}
-
-static CategoriesEditorMoveDown CategoriesEditorMoveDown_create (Any data, long *posList,
-        long posCount, long newPos) {
-	try {
-		autoCategoriesEditorMoveDown me = Thing_new (CategoriesEditorMoveDown);
-		CategoriesEditorCommand_init (me.peek(), L"Move down", data, CategoriesEditorMoveDown_execute,
-		                              CategoriesEditorMoveDown_undo, 0, posCount);
-		for (long i = 1; i <= posCount; i++) {
-			my selection[i] = posList[i];
-		}
-		my newPos = newPos;
-		return me.transfer();
-	} catch (MelderError) {
-		Melder_throw ("CategoriesEditorMoveDown not created.");
-	}
-}
-
-/********************* Commands (End)  *************************************/
-
-static void notifyOutOfView (I) {
-	iam (CategoriesEditor);
-	autoMelderString tmp;
-	long posCount;
-	MelderString_append (&tmp, L"");
-	autoNUMvector<long> posList (my list -> f_getSelectedPositions (& posCount), 1);
-	if (posList.peek() != 0) {
-		long outOfView = 0, top = my list -> f_getTopPosition (), bottom = my list -> f_getBottomPosition ();
-
-		for (long i = posCount; i > 0; i--) {
-			if (posList[i] < top || posList[i] > bottom) {
-				outOfView++;
-			}
-		}
-		if (outOfView > 0) {
-			MelderString_append (&tmp, Melder_integer (outOfView), L" selection(s) out of view");
-		}
-	}
-	my outOfView -> f_setString (tmp.string);
-}
-
-static void update_dos (I) {
-	iam (CategoriesEditor);
-	autoMelderString tmp;
-	bool undoSense = true, redoSense = true;
-
-	// undo
-
-	const wchar_t *name;
-	if (! (name = CommandHistory_commandName (my history, 0))) {
-		name = L"nothing"; undoSense = false;
-	}
-
-	MelderString_append (&tmp, L"Undo ", L"\"", name, L"\"");
-	my undo -> f_setString (tmp.string);
-	my undo -> f_setSensitive (undoSense);
-
-	// redo
-
-	if (! (name = CommandHistory_commandName (my history, 1))) {
-		name = L"nothing"; redoSense = false;
-	}
-	MelderString_empty (&tmp);
-	MelderString_append (&tmp, L"Redo ", L"\"", name, L"\"");
-	my redo -> f_setString (tmp.string);
-	my redo -> f_setSensitive (redoSense);
-}
-
-static void updateWidgets (I) { /*all buttons except undo & redo */
-	iam (CategoriesEditor);
-	long size = ( (Categories) my data)->size;
-	bool insert = false, insertAtEnd = true, replace = false, remove = false;
-	bool moveUp = false, moveDown = false;
-	long posCount;
-	autoNUMvector<long> posList (my list -> f_getSelectedPositions (& posCount), 1);
-	if (posList.peek() != 0) {
-		long firstPos = posList[1], lastPos = posList[posCount];
-		bool contiguous = lastPos - firstPos + 1 == posCount;
-		moveUp = contiguous && firstPos > 1;
-		moveDown = contiguous && lastPos < size;
-		my position = firstPos;
-		remove = true; replace = true; //insertAtEnd = False;
-		if (posCount == 1) {
-			insert = true;
-			//if (posList[1] == size) insertAtEnd = True;
-			if (size == 1 && ! wcscmp (CategoriesEditor_EMPTYLABEL,
-			                           OrderedOfString_itemAtIndex_c (my data, 1))) {
-				remove = false;
-			}
-		}
-	}
-	my insert      -> f_setSensitive (insert);
-	my insertAtEnd -> f_setSensitive (insertAtEnd);
-	my replace     -> f_setSensitive (replace);
-	my remove      -> f_setSensitive (remove);
-	my moveUp      -> f_setSensitive (moveUp);
-	my moveDown    -> f_setSensitive (moveDown);
-	if (my history) {
-		update_dos (me);
-	}
-	notifyOutOfView (me);
-}
-
-static void update (I, long from, long to, const long *select, long nSelect) {
-	iam (CategoriesEditor);
-	long size = ((Categories) my data) -> size;
-
-	if (size == 0) {
-		autoSimpleString str = SimpleString_create (CategoriesEditor_EMPTYLABEL);
-		Collection_addItem ( (Categories) my data, str.transfer());
-		update (me, 0, 0, 0, 0);
-		return;
-	}
-	if (from == 0 && from == to) {
-		from = 1; to = size;
-	}
-	if (from < 1 || from > size) {
-		from = size;
-	}
-	if (to < 1 || to > size) {
-		to = size;
-	}
-	if (from > to) {
-		long ti = from; from = to; to = ti;
-	}
-
-	// Begin optimization: add the items from a table instead of separately.
-	try {
-		autostringvector table (from, to);
-		autoMelderString itemText;
-		long itemCount = my list -> f_getNumberOfItems ();
-		for (long i = from; i <= to; i++) {
-			wchar_t wcindex[20];
-			MelderString_empty (&itemText);
-			swprintf (wcindex, 19, L"%5ld ", i);
-			MelderString_append (&itemText, wcindex, OrderedOfString_itemAtIndex_c (my data, i));
-			table[i] = Melder_wcsdup_f (itemText.string);
-		}
-		if (itemCount > size) { /* some items have been removed from Categories? */
-			for (long j = itemCount; j > size; j --) {
-				my list -> f_deleteItem (j);
-			}
-			itemCount = size;
-		}
-		if (to > itemCount) {
-			for (long j = 1; j <= to - itemCount; j ++) {
-				my list -> f_insertItem (table [itemCount + j], 0);
-			}
-		}
-		if (from <= itemCount) {
-			long n = (to < itemCount ? to : itemCount);
-			for (long j = from; j <= n; j++) {
-				my list -> f_replaceItem (table[j], j);
-			}
-		}
-	} catch (MelderError) {
-		throw;
-	}
-
-	// End of optimization
-
-	// HIGHLIGHT
-
-	my list -> f_deselectAllItems ();
-	if (size == 1) { /* the only item is always selected */
-		const wchar_t *catg = OrderedOfString_itemAtIndex_c (my data, 1);
-		my list -> f_selectItem (1);
-		updateWidgets (me);   // instead of "notify". BUG?
-		my text -> f_setString (catg);
-	} else if (nSelect > 0) {
-		// Select but postpone highlighting
-
-		for (long i = 1; i <= nSelect; i++) {
-			my list -> f_selectItem (select[i] > size ? size : select[i]);
-		}
-	}
-
-	// VIEWPORT
-
-	{
-		long top = my list -> f_getTopPosition (), bottom = my list -> f_getBottomPosition ();
-		long visible = bottom - top + 1;
-		if (nSelect == 0) {
-			top = my position - visible / 2;
-		} else if (select[nSelect] < top) {
-			// selection above visible area
-			top = select[1];
-		} else if (select[1] > bottom) {
-			// selection below visible area
-			top = select[nSelect] - visible + 1;
-		} else {
-			long deltaTopPos = -1, nUpdate = to - from + 1;
-			if ( (from == select[1] && to == select[nSelect]) || // Replace
-			        (nUpdate > 2 && nSelect == 1) /* Inserts */) {
-				deltaTopPos = 0;
-			} else if (nUpdate == nSelect + 1 && select[1] == from + 1) { // down
-				deltaTopPos = 1;
-			}
-			top += deltaTopPos;
-		}
-		if (top + visible > size) {
-			top = size - visible + 1;
-		}
-		if (top < 1) {
-			top = 1;
-		}
-		my list -> f_setTopPosition (top);
-	}
-}
-
-static void gui_button_cb_remove (I, GuiButtonEvent event) {
-	(void) event;
-	iam (CategoriesEditor);
-	long posCount;
-	autoNUMvector<long> posList (my list -> f_getSelectedPositions (& posCount), 1);
-	if (posList.peek() != 0) {
-		autoCategoriesEditorRemove command = CategoriesEditorRemove_create (me, posList.peek(), posCount);
-		if (! Command_do (command.peek())) {
-			return;
-		}
-		if (my history) {
-			CommandHistory_insertItem (my history, command.transfer());
-		}
-		updateWidgets (me);
-	}
-}
-
-static void insert (I, int position) {
-	iam (CategoriesEditor);
-	autostring text = my text -> f_getString ();
-	if (wcslen (text.peek()) != 0) {
-		autoSimpleString str = SimpleString_create (text.peek());
-		autoCategoriesEditorInsert command = CategoriesEditorInsert_create (me, str.transfer(), position);
-		Command_do (command.peek());
-		if (my history) {
-			CommandHistory_insertItem (my history, command.transfer());
-		}
-		updateWidgets (me);
-	}
-}
-
-static void gui_button_cb_insert (I, GuiButtonEvent event) {
-	(void) event;
-	iam (CategoriesEditor);
-	insert (me, my position);
-}
-
-static void gui_button_cb_insertAtEnd (I, GuiButtonEvent event) {
-	(void) event;
-	iam (CategoriesEditor);
-	Categories categories = (Categories) my data;
-	insert (me, categories -> size + 1);
-	my position = categories -> size;
-}
-
-static void gui_button_cb_replace (I, GuiButtonEvent event) {
-	(void) event;
-	iam (CategoriesEditor);
-	long posCount;
-	autoNUMvector<long> posList (my list -> f_getSelectedPositions (& posCount), 1);
-	if (posCount > 0) {
-		autostring text = my text -> f_getString ();
-		if (wcslen (text.peek()) != 0) {
-			autoSimpleString str = SimpleString_create (text.peek());
-			autoCategoriesEditorReplace command = CategoriesEditorReplace_create (me, str.transfer(),
-			                                      posList.peek(), posCount);
-			Command_do (command.peek());
-			if (my history) {
-				CommandHistory_insertItem (my history, command.transfer());
-			}
-			updateWidgets (me);
-		}
-	}
-}
-
-/* Precondition: contiguous selection */
-static void gui_button_cb_moveUp (I, GuiButtonEvent event) {
-	(void) event;
-	iam (CategoriesEditor);
-	long posCount;
-	autoNUMvector<long> posList (my list -> f_getSelectedPositions (& posCount), 1);
-	if (posCount > 0) {
-		autoCategoriesEditorMoveUp command = CategoriesEditorMoveUp_create
-		                                     (me, posList.peek(), posCount, posList[1] - 1);
-		Command_do (command.peek());
-		if (my history) {
-			CommandHistory_insertItem (my history, command.transfer());
-		}
-		updateWidgets (me);
-	}
-}
-
-/* Precondition: contiguous selection */
-static void gui_button_cb_moveDown (I, GuiButtonEvent event) {
-	(void) event;
-	iam (CategoriesEditor);
-	long posCount;
-	autoNUMvector<long> posList (my list -> f_getSelectedPositions (& posCount), 1);
-	if (posCount > 0) {
-		autoCategoriesEditorMoveDown command = CategoriesEditorMoveDown_create
-		                                       (me, posList.peek(), posCount, posList[posCount] + 1);
-		Command_do (command.peek());
-		if (my history) {
-			CommandHistory_insertItem (my history, command.transfer());
-		}
-		updateWidgets (me);
-	}
-}
-
-
-static void gui_cb_scroll (GUI_ARGS) {
-	GUI_IAM (CategoriesEditor);
-	notifyOutOfView (me);
-}
-
-static void gui_list_cb_double_click (void *void_me, GuiListEvent event) {
-	(void) event;
-	iam (CategoriesEditor);
-	const wchar_t *catg = OrderedOfString_itemAtIndex_c (my data, my position);
-	my text -> f_setString (catg);
-}
-
-static void gui_list_cb_extended (void *void_me, GuiListEvent event) {
-	(void) event;
-	iam (CategoriesEditor);
-	updateWidgets (me);
-}
-
-static void gui_button_cb_undo (I, GuiButtonEvent event) {
-	(void) event;
-	iam (CategoriesEditor);
-	if (CommandHistory_offleft (my history)) {
-		return;
-	}
-	Command_undo (CommandHistory_getItem (my history));
-	CommandHistory_back (my history);
-	updateWidgets (me);
-}
-
-static void gui_button_cb_redo (I, GuiButtonEvent event) {
-	(void) event;
-	iam (CategoriesEditor);
-	CommandHistory_forth (my history);
-	if (CommandHistory_offright (my history)) {
-		return;
-	}
-	Command_do (CommandHistory_getItem (my history));
-	updateWidgets (me);
-}
-
-void structCategoriesEditor :: v_destroy () {
-	forget (history); /* !! Editor */
-	CategoriesEditor_Parent :: v_destroy ();
-}
-
-void structCategoriesEditor :: v_createHelpMenuItems (EditorMenu menu) {
-	CategoriesEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"CategoriesEditor help", '?', menu_cb_help);
-}
-
-// origin is at top left.
-void structCategoriesEditor :: v_createChildren () {
-	double menuBarOffset = 40;
-	double button_width = 90, button_height = menuBarOffset, list_width = 260, list_height = 200, list_bottom;
-	double delta_x = 15, delta_y = menuBarOffset / 2, text_button_height = button_height / 2;
-	double left, right, top, bottom, buttons_left, buttons_top;
-
-	left = 5; right = left + button_width; top = 3 + menuBarOffset; bottom = top + text_button_height;
-	GuiLabel_createShown (d_windowForm, left, right, top, bottom, L"Positions:", 0);
-	left = right + delta_x ; right = left + button_width;
-	GuiLabel_createShown (d_windowForm, left, right, top, bottom, L"Values:", 0);
-
-	left = 0; right = left + list_width; buttons_top = (top = bottom + delta_y); list_bottom = bottom = top + list_height;
-	list = GuiList_create (d_windowForm, left, right, top, bottom, true, 0);
-	list -> f_setSelectionChangedCallback (gui_list_cb_extended, this);
-	list -> f_setDoubleClickCallback (gui_list_cb_double_click, this);
-	list -> f_show ();
-
-	buttons_left = left = right + 2 * delta_x; right = left + button_width; bottom = top + button_height;
-	GuiLabel_createShown (d_windowForm, left, right, top, bottom, L"Value:", 0);
-	left = right + delta_x; right = left + button_width;
-	text = GuiText_createShown (d_windowForm, left, right, top, bottom, 0);
-	text -> f_setString (CategoriesEditor_EMPTYLABEL);
-
-	left = buttons_left; right = left + button_width; top = bottom + delta_y; bottom = top + button_height;
-	insert = GuiButton_createShown (d_windowForm, left, right, top, bottom,	L"Insert", gui_button_cb_insert, this, GuiButton_DEFAULT);
-	left = right + delta_x; right = left + button_width;
-	replace = GuiButton_createShown (d_windowForm, left, right, top, bottom, L"Replace", gui_button_cb_replace, this, 0);
-	left = buttons_left; right = left + 1.5 * button_width; top = bottom + delta_y; bottom = top + button_height;
-	insertAtEnd = GuiButton_createShown (d_windowForm, left, right, top, bottom, L"Insert at end", gui_button_cb_insertAtEnd, this, 0);
-	top = bottom + delta_y; bottom = top + button_height;
-	undo = GuiButton_createShown (d_windowForm, left, right, top, bottom, L"Undo", gui_button_cb_undo, this, 0);
-	top = bottom + delta_y; bottom = top + button_height;
-	redo = GuiButton_createShown (d_windowForm, left, right, top, bottom, L"Redo", gui_button_cb_redo, this, 0);
-	top = bottom + delta_y; bottom = top + button_height;
-	remove = GuiButton_createShown (d_windowForm, left, right, top, bottom, L"Remove", gui_button_cb_remove, this, 0);
-	top = bottom + delta_y; bottom = top + button_height;
-	moveUp = GuiButton_createShown (d_windowForm, left, right, top, bottom, L"Move selection up", gui_button_cb_moveUp, this, 0);
-	top = bottom + delta_y; bottom = top + button_height;
-	moveDown = GuiButton_createShown (d_windowForm, left, right, top, bottom, L"Move selection down", gui_button_cb_moveDown, this, 0);
-
-	top = list_bottom + delta_y; bottom = top + button_height; left = 5; right = left + 200;
-	outOfView = GuiLabel_createShown (d_windowForm, left, right, top, bottom, L"", 0);
-}
-
-void structCategoriesEditor :: v_dataChanged () {
-	update (this, 0, 0, 0, 0);
-	updateWidgets (this);
-}
-
-CategoriesEditor CategoriesEditor_create (const wchar_t *title, Categories data) {
-	try {
-		autoCategoriesEditor me = Thing_new (CategoriesEditor);
-		Editor_init (me.peek(), 20, 40, 600, 600, title, data);
-		my history = CommandHistory_create (100);
-		update (me.peek(), 0, 0, 0, 0);
-		updateWidgets (me.peek());
-		return me.transfer();
-	} catch (MelderError) {
-		Melder_throw ("Categories window not created.");
-	}
-}
-
-/* End of file CategoriesEditor.cpp */
+/* CategoriesEditor.cpp
+ *
+ * Copyright (C) 1993-2013 David Weenink, 2008,2015 Paul Boersma
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ djmw 1995
+ djmw 19980225 repaired a memory leak, caused by wrong inheritance for
+ 	 CategoriesEditorInsert command.
+ djmw 20020408 GPL
+ djmw 20020408 Modified 'createMenus'
+ djmw 20060111 Replaced Resources.h with Preferences.h
+ djmw 20060328 Changed last argument to 0 in XtVaSetValues, XtVaGetValues and XtVaCreateManagedWidget
+ 	for 64-bit compatibility.
+ djmw 20070620 Latest modification.
+ pb 20080320 split off Help menu
+ pb 20080321 new Editor API
+ djmw 20090107 Removed a bug in update that caused editor to crash on replace
+ djmw 20090203 Removed potential crashes in CategoriesEditor<command>_create.
+ djmw 20110304 Thing_new
+ djmw 20111110 Use autostringvector
+*/
+
+#define CategoriesEditor_TEXTMAXLENGTH 100
+
+#include "CategoriesEditor.h"
+//#include "Preferences.h"
+#include "EditorM.h"
+
+Thing_implement (CategoriesEditor, Editor, 0);
+
+/* forward declarations */
+static void update (I, long from, long to, const long *select, long nSelect);
+static void update_dos (I);
+
+const char32 *CategoriesEditor_EMPTYLABEL = U"(empty)";
+
+static void menu_cb_help (EDITOR_ARGS) {
+	EDITOR_IAM (CategoriesEditor);
+	Melder_help (U"CategoriesEditor");
+}
+
+/**************** Some methods for Collection  ****************/
+
+/* Preconditions: */
+/*	1 <= (position[i], newpos) <= size; */
+/*	newpos <= position[1] || newpos >= position[npos] */
+static void Ordered_moveItems (I, long position[], long npos, long newpos) {
+	iam (Ordered);
+	long pos, min = position[1], max = position[1];
+
+	for (long i = 2; i <= npos; i++) {
+		if (position[i] > max) {
+			max = position[i];
+		} else if (position[i] < min) {
+			min = position[i];
+		}
+	}
+
+	Melder_assert (min >= 1 && max <= my size && (newpos <= min || newpos >= max));
+
+	autoNUMvector<Daata> tmp (1, npos);
+
+	// 'remove'
+
+	for (long i = 1; i <= npos; i++) {
+		tmp[i] = (Daata) my item[position[i]];
+		my item[position[i]] = 0;
+	}
+
+	// create a contiguous 'hole'
+
+	if (newpos <= min) {
+		pos = max;
+		for (long i = max; i >= newpos; i--) {
+			if (my item[i]) {
+				my item[pos--] = my item[i];
+			}
+		}
+		pos = newpos;
+	} else {
+		pos = min;
+		for (long i = min; i <= newpos; i++) {
+			if (my item[i]) {
+				my item[pos++] = my item[i];
+			}
+		}
+		pos = newpos - npos + 1;
+	}
+
+	// fill the 'hole'
+
+	for (long i = 1; i <= npos; i++) {
+		my item[pos++] = tmp[i];
+	}
+}
+
+static void Collection_replaceItemPos (I, Any item, long pos) {
+	iam (Collection);
+	if (pos < 1 || pos > my size) {
+		return;
+	}
+	forget ( ( (SimpleString *) my item) [pos]);
+	my item[pos] = item;
+}
+
+/* Remove the item at position 'from' and insert it at position 'to'. */
+static void Ordered_moveItem (I, long from, long to) {
+	iam (Ordered);
+	if (from < 1 || from > my size) {
+		from = my size;
+	}
+	if (to < 1 || to > my size) {
+		to = my size;
+	}
+	if (from == to) {
+		return;
+	}
+	Daata tmp = (Daata) my item[from];
+	if (from > to) {
+		for (long i = from; i > to; i--) {
+			my item[i] = my item[i - 1];
+		}
+	} else {
+		for (long i = from; i < to; i++) {
+			my item[i] = my item[i + 1];
+		}
+	}
+	my item[to] = tmp;
+}
+
+/********************** General Command **********************/
+
+Thing_define (CategoriesEditorCommand, Command) {
+	// new data:
+public:
+	autoCategories categories;
+	long *selection; long nSelected, newPos;
+	// overridden methods:
+	virtual void v_destroy ();
+};
+
+Thing_implement (CategoriesEditorCommand, Command, 0);
+
+void structCategoriesEditorCommand :: v_destroy () {
+	NUMvector_free (selection, 1);
+	CategoriesEditorCommand_Parent :: v_destroy ();
+}
+
+static void CategoriesEditorCommand_init (I, const char32 *name,  Any data,
+        int (*execute) (Any), int (*undo) (Any), int nCategories, int nSelected) {
+	iam (CategoriesEditorCommand);
+	(void) nCategories;
+
+	my nSelected = nSelected;
+	Command_init (me, name, data, execute, undo);
+	my categories = Categories_create();
+	my selection = NUMvector<long> (1, nSelected);
+}
+
+/*********************** Insert Command ***********************/
+
+Thing_define (CategoriesEditorInsert, CategoriesEditorCommand) {
+};
+
+Thing_implement (CategoriesEditorInsert, CategoriesEditorCommand, 0);
+
+static int CategoriesEditorInsert_execute (I) {
+	iam (CategoriesEditorInsert);
+	CategoriesEditor editor = (CategoriesEditor) my data;
+	Categories categories = (Categories) editor -> data;
+	autoSimpleString str = Data_copy ((SimpleString) my categories -> item[1]);
+	Ordered_addItemPos (categories, str.transfer(), my selection[1]);
+	update (editor, my selection[1], 0, my selection, 1);
+	return 1;
+}
+
+static int CategoriesEditorInsert_undo (I) {
+	iam (CategoriesEditorInsert);
+	CategoriesEditor editor = (CategoriesEditor) my data;
+	Categories categories = (Categories) editor -> data;
+	Collection_removeItem (categories, my selection[1]);
+	update (editor, my selection[1], 0, my selection, 1);
+	return 1;
+}
+
+static CategoriesEditorInsert CategoriesEditorInsert_create (Any data, Any str, int position) {
+	try {
+		autoCategoriesEditorInsert me = Thing_new (CategoriesEditorInsert);
+		CategoriesEditorCommand_init (me.peek(), U"Insert", data, CategoriesEditorInsert_execute, CategoriesEditorInsert_undo, 1, 1);
+		my selection[1] = position;
+		Collection_addItem (my categories.peek(), (SimpleString) str);
+		return me.transfer();
+	} catch (MelderError) {
+		Melder_throw (U"CategoriesEditorInsert not created.");
+	}
+}
+
+/*********************** Remove Command ***********************/
+
+Thing_define (CategoriesEditorRemove, CategoriesEditorCommand) {
+};
+
+Thing_implement (CategoriesEditorRemove, CategoriesEditorCommand, 0);
+
+static int CategoriesEditorRemove_execute (I) {
+	iam (CategoriesEditorRemove);
+	CategoriesEditor editor = (CategoriesEditor) my data;
+	Categories l_categories = (Categories) editor -> data;   // David, weer link: tweemaal dezelfde naam (categories): is ok, geen conflict. Naam toch maar aangepast
+
+	for (long i = my nSelected; i >= 1; i--) {
+		Ordered_addItemPos (my categories.peek(), (SimpleString) l_categories -> item[my selection[i]], 1);
+		l_categories -> item[my selection[i]] = 0;
+		Collection_removeItem (l_categories, my selection[i]);
+	}
+	update (editor, my selection[1], 0, 0, 0);
+	return 1;
+}
+
+static int CategoriesEditorRemove_undo (I) {
+	iam (CategoriesEditorRemove);
+	CategoriesEditor editor = (CategoriesEditor) my data;
+	Categories categories = (Categories) editor -> data;
+
+	for (long i = 1; i <= my nSelected; i++) {
+		autoSimpleString item = Data_copy ( (SimpleString) my categories -> item[i]);
+		Ordered_addItemPos (categories, item.transfer(), my selection[i]);
+	}
+	update (editor, my selection[1], 0, my selection, my nSelected);
+	return 1;
+}
+
+static CategoriesEditorRemove CategoriesEditorRemove_create (Any data, long *posList, long posCount) {
+	try {
+		autoCategoriesEditorRemove me = Thing_new (CategoriesEditorRemove);
+		CategoriesEditorCommand_init (me.peek(), U"Remove", data, CategoriesEditorRemove_execute,
+		                              CategoriesEditorRemove_undo, posCount, posCount);
+		for (long i = 1; i <= posCount; i++) {
+			my selection[i] = posList[i];
+		}
+		return me.transfer();
+	} catch (MelderError) {
+		Melder_throw (U"CategoriesEditorRemove not created.");
+	}
+}
+
+//update (me);
+/*********************** Replace Command ***********************/
+
+Thing_define (CategoriesEditorReplace, CategoriesEditorCommand) {
+};
+
+Thing_implement (CategoriesEditorReplace, CategoriesEditorCommand, 0);
+
+static int CategoriesEditorReplace_execute (I) {
+	iam (CategoriesEditorReplace);
+	CategoriesEditor editor = (CategoriesEditor) my data;
+	Categories categories = (Categories) editor -> data;
+
+	for (long i = my nSelected; i >= 1; i--) {
+		autoSimpleString str = Data_copy ((SimpleString) my categories -> item[1]);
+		Ordered_addItemPos (my categories.peek(), (SimpleString) categories -> item[my selection[i]], 2);
+		categories -> item[my selection[i]] =  str.transfer();
+	}
+	update (editor, my selection[1], my selection[my nSelected], my selection, my nSelected);
+	return 1;
+}
+
+static int CategoriesEditorReplace_undo (I) {
+	iam (CategoriesEditorReplace);
+	CategoriesEditor editor = (CategoriesEditor) my data;
+	Categories categories = (Categories) editor -> data;
+
+	for (long i = 1; i <= my nSelected; i++) {
+		autoSimpleString str = Data_copy ( (SimpleString) my categories -> item[i + 1]);
+		Collection_replaceItemPos (categories, str.transfer(), my selection[i]);
+	}
+	update (editor, my selection[1], my selection[my nSelected], my selection, my nSelected);
+	return 1;
+}
+
+static CategoriesEditorReplace CategoriesEditorReplace_create (Any data, Any str, long *posList, long posCount) {
+	try {
+		autoCategoriesEditorReplace me = Thing_new (CategoriesEditorReplace);
+		CategoriesEditorCommand_init (me.peek(), U"Replace", data, CategoriesEditorReplace_execute,
+		                              CategoriesEditorReplace_undo, posCount + 1, posCount);
+		for (long i = 1; i <= posCount; i++) {
+			my selection[i] = posList[i];
+		}
+		Collection_addItem (my categories.peek(), (SimpleString) str);
+		return me.transfer();
+	} catch (MelderError) {
+		Melder_throw (U"CategoriesEditorReplace not created.");
+	}
+}
+
+/*********************** MoveUp Command ***********************/
+
+Thing_define (CategoriesEditorMoveUp, CategoriesEditorCommand) {
+};
+
+Thing_implement (CategoriesEditorMoveUp, CategoriesEditorCommand, 0);
+
+static int CategoriesEditorMoveUp_execute (I) {
+	iam (CategoriesEditorMoveUp);
+	CategoriesEditor editor = (CategoriesEditor) my data;
+	Ordered_moveItems (editor->data, my selection, my nSelected, my newPos);
+	autoNUMvector<long> selection (1, my nSelected);
+	for (long i = 1; i <= my nSelected; i++) {
+		selection[i] = my newPos + i - 1;
+	}
+	update (editor, my newPos, my selection[my nSelected], selection.peek(), my nSelected);
+	return 1;
+}
+
+static int CategoriesEditorMoveUp_undo (I) {
+	iam (CategoriesEditorMoveUp);
+	CategoriesEditor editor = (CategoriesEditor) my data;
+
+	for (long i = 1; i <= my nSelected; i++) {
+		Ordered_moveItem (editor->data, my newPos, my selection[my nSelected]);
+	}
+	update (editor, my newPos, my selection[my nSelected], my selection, my nSelected);
+	return 1;
+}
+
+static CategoriesEditorMoveUp CategoriesEditorMoveUp_create (Any data, long *posList,
+        long posCount, long newPos) {
+	try {
+		autoCategoriesEditorMoveUp me = Thing_new (CategoriesEditorMoveUp);
+		CategoriesEditorCommand_init (me.peek(), U"Move up", data, CategoriesEditorMoveUp_execute,
+		                              CategoriesEditorMoveUp_undo, 0, posCount);
+		for (long i = 1; i <= posCount; i++) {
+			my selection[i] = posList[i];
+		}
+		my newPos = newPos;
+		return me.transfer();
+	} catch (MelderError) {
+		Melder_throw (U"CategoriesEditorMoveUp not created.");
+	}
+}
+
+/*********************** MoveDown Command ***********************/
+
+Thing_define (CategoriesEditorMoveDown, CategoriesEditorCommand) {
+};
+
+Thing_implement (CategoriesEditorMoveDown, CategoriesEditorCommand, 0);
+
+static int CategoriesEditorMoveDown_execute (I) {
+	iam (CategoriesEditorMoveDown);
+	CategoriesEditor editor = (CategoriesEditor) my data;
+	Ordered_moveItems ( (Ordered) editor -> data, my selection, my nSelected, my newPos);
+	autoNUMvector<long> selection (1, my nSelected);
+	for (long i = 1; i <= my nSelected; i++) {
+		selection[i] = my newPos - my nSelected + i;
+	}
+	update (editor, my selection[1], my newPos, selection.peek(), my nSelected);
+	return 1;
+}
+
+static int CategoriesEditorMoveDown_undo (I) {
+	iam (CategoriesEditorMoveDown);
+	CategoriesEditor editor = (CategoriesEditor) my data;
+	for (long i = 1; i <= my nSelected; i++) {
+		Ordered_moveItem (editor -> data, my newPos, my selection[1]); // TODO 1 or i ??
+	}
+	long from = my selection[1];
+	update (editor, (from > 1 ? from-- : from), my newPos, my selection, my nSelected);
+	return 1;
+}
+
+static CategoriesEditorMoveDown CategoriesEditorMoveDown_create (Any data, long *posList,
+        long posCount, long newPos) {
+	try {
+		autoCategoriesEditorMoveDown me = Thing_new (CategoriesEditorMoveDown);
+		CategoriesEditorCommand_init (me.peek(), U"Move down", data, CategoriesEditorMoveDown_execute,
+		                              CategoriesEditorMoveDown_undo, 0, posCount);
+		for (long i = 1; i <= posCount; i++) {
+			my selection[i] = posList[i];
+		}
+		my newPos = newPos;
+		return me.transfer();
+	} catch (MelderError) {
+		Melder_throw (U"CategoriesEditorMoveDown not created.");
+	}
+}
+
+/********************* Commands (End)  *************************************/
+
+static void notifyOutOfView (I) {
+	iam (CategoriesEditor);
+	autoMelderString tmp;
+	MelderString_copy (&tmp, U"");
+	long posCount;
+	autoNUMvector<long> posList (GuiList_getSelectedPositions (my list, & posCount), 1);
+	if (posList.peek() != 0) {
+		long outOfView = 0, top = GuiList_getTopPosition (my list), bottom = GuiList_getBottomPosition (my list);
+
+		for (long i = posCount; i > 0; i--) {
+			if (posList[i] < top || posList[i] > bottom) {
+				outOfView++;
+			}
+		}
+		if (outOfView > 0) {
+			MelderString_append (&tmp, outOfView, U" selection(s) out of view");
+		}
+	}
+	GuiLabel_setText (my outOfView, tmp.string);
+}
+
+static void update_dos (I) {
+	iam (CategoriesEditor);
+	bool undoSense = true, redoSense = true;
+
+	// undo
+
+	const char32 *name;
+	if (! (name = CommandHistory_commandName (my history, 0))) {
+		name = U"nothing"; undoSense = false;
+	}
+
+	GuiButton_setText (my undo, Melder_cat (U"Undo ", U"\"", name, U"\""));
+	GuiThing_setSensitive (my undo, undoSense);
+
+	// redo
+
+	if (! (name = CommandHistory_commandName (my history, 1))) {
+		name = U"nothing"; redoSense = false;
+	}
+	GuiButton_setText (my redo, Melder_cat (U"Redo ", U"\"", name, U"\""));
+	GuiThing_setSensitive (my redo, redoSense);
+}
+
+static void updateWidgets (I) { /*all buttons except undo & redo */
+	iam (CategoriesEditor);
+	long size = ( (Categories) my data)->size;
+	bool insert = false, insertAtEnd = true, replace = false, remove = false;
+	bool moveUp = false, moveDown = false;
+	long posCount;
+	autoNUMvector<long> posList (GuiList_getSelectedPositions (my list, & posCount), 1);
+	if (posList.peek() != 0) {
+		long firstPos = posList[1], lastPos = posList[posCount];
+		bool contiguous = lastPos - firstPos + 1 == posCount;
+		moveUp = contiguous && firstPos > 1;
+		moveDown = contiguous && lastPos < size;
+		my position = firstPos;
+		remove = true; replace = true; //insertAtEnd = False;
+		if (posCount == 1) {
+			insert = true;
+			//if (posList[1] == size) insertAtEnd = True;
+			if (size == 1 && ! str32cmp (CategoriesEditor_EMPTYLABEL,
+			                           OrderedOfString_itemAtIndex_c ((OrderedOfString) my data, 1))) {
+				remove = false;
+			}
+		}
+	}
+	GuiThing_setSensitive (my insert,      insert);
+	GuiThing_setSensitive (my insertAtEnd, insertAtEnd);
+	GuiThing_setSensitive (my replace,     replace);
+	GuiThing_setSensitive (my remove,      remove);
+	GuiThing_setSensitive (my moveUp,      moveUp);
+	GuiThing_setSensitive (my moveDown,    moveDown);
+	if (my history) {
+		update_dos (me);
+	}
+	notifyOutOfView (me);
+}
+
+static void update (I, long from, long to, const long *select, long nSelect) {
+	iam (CategoriesEditor);
+	long size = ((Categories) my data) -> size;
+
+	if (size == 0) {
+		autoSimpleString str = SimpleString_create (CategoriesEditor_EMPTYLABEL);
+		Collection_addItem ( (Categories) my data, str.transfer());
+		update (me, 0, 0, 0, 0);
+		return;
+	}
+	if (from == 0 && from == to) {
+		from = 1; to = size;
+	}
+	if (from < 1 || from > size) {
+		from = size;
+	}
+	if (to < 1 || to > size) {
+		to = size;
+	}
+	if (from > to) {
+		long ti = from; from = to; to = ti;
+	}
+
+	// Begin optimization: add the items from a table instead of separately.
+	try {
+		autostring32vector table (from, to);
+		long itemCount = GuiList_getNumberOfItems (my list);
+		for (long i = from; i <= to; i++) {
+			char wcindex[20];
+			snprintf (wcindex,20, "%5ld ", i);
+			table[i] = Melder_dup_f (Melder_cat (Melder_peek8to32 (wcindex), OrderedOfString_itemAtIndex_c ((OrderedOfString) my data, i)));
+		}
+		if (itemCount > size) { // some items have been removed from Categories?
+			for (long j = itemCount; j > size; j --) {
+				GuiList_deleteItem (my list, j);
+			}
+			itemCount = size;
+		}
+		if (to > itemCount) {
+			for (long j = 1; j <= to - itemCount; j ++) {
+				GuiList_insertItem (my list, table [itemCount + j], 0);
+			}
+		}
+		if (from <= itemCount) {
+			long n = (to < itemCount ? to : itemCount);
+			for (long j = from; j <= n; j++) {
+				GuiList_replaceItem (my list, table[j], j);
+			}
+		}
+	} catch (MelderError) {
+		throw;
+	}
+
+	// End of optimization
+
+	// HIGHLIGHT
+
+	GuiList_deselectAllItems (my list);
+	if (size == 1) { /* the only item is always selected */
+		const char32 *catg = OrderedOfString_itemAtIndex_c ((OrderedOfString) my data, 1);
+		GuiList_selectItem (my list, 1);
+		updateWidgets (me);   // instead of "notify". BUG?
+		GuiText_setString (my text, catg);
+	} else if (nSelect > 0) {
+		// Select but postpone highlighting
+
+		for (long i = 1; i <= nSelect; i++) {
+			GuiList_selectItem (my list, select[i] > size ? size : select[i]);
+		}
+	}
+
+	// VIEWPORT
+
+	{
+		long top = GuiList_getTopPosition (my list), bottom = GuiList_getBottomPosition (my list);
+		long visible = bottom - top + 1;
+		if (nSelect == 0) {
+			top = my position - visible / 2;
+		} else if (select[nSelect] < top) {
+			// selection above visible area
+			top = select[1];
+		} else if (select[1] > bottom) {
+			// selection below visible area
+			top = select[nSelect] - visible + 1;
+		} else {
+			long deltaTopPos = -1, nUpdate = to - from + 1;
+			if ( (from == select[1] && to == select[nSelect]) || // Replace
+			        (nUpdate > 2 && nSelect == 1) /* Inserts */) {
+				deltaTopPos = 0;
+			} else if (nUpdate == nSelect + 1 && select[1] == from + 1) { // down
+				deltaTopPos = 1;
+			}
+			top += deltaTopPos;
+		}
+		if (top + visible > size) {
+			top = size - visible + 1;
+		}
+		if (top < 1) {
+			top = 1;
+		}
+		GuiList_setTopPosition (my list, top);
+	}
+}
+
+static void gui_button_cb_remove (I, GuiButtonEvent event) {
+	(void) event;
+	iam (CategoriesEditor);
+	long posCount;
+	autoNUMvector<long> posList (GuiList_getSelectedPositions (my list, & posCount), 1);
+	if (posList.peek() != 0) {
+		autoCategoriesEditorRemove command = CategoriesEditorRemove_create (me, posList.peek(), posCount);
+		if (! Command_do (command.peek())) {
+			return;
+		}
+		if (my history) {
+			CommandHistory_insertItem (my history, command.transfer());
+		}
+		updateWidgets (me);
+	}
+}
+
+static void insert (I, int position) {
+	iam (CategoriesEditor);
+	autostring32 text = GuiText_getString (my text);
+	if (str32len (text.peek()) != 0) {
+		autoSimpleString str = SimpleString_create (text.peek());
+		autoCategoriesEditorInsert command = CategoriesEditorInsert_create (me, str.transfer(), position);
+		Command_do (command.peek());
+		if (my history) {
+			CommandHistory_insertItem (my history, command.transfer());
+		}
+		updateWidgets (me);
+	}
+}
+
+static void gui_button_cb_insert (I, GuiButtonEvent event) {
+	(void) event;
+	iam (CategoriesEditor);
+	insert (me, my position);
+}
+
+static void gui_button_cb_insertAtEnd (I, GuiButtonEvent event) {
+	(void) event;
+	iam (CategoriesEditor);
+	Categories categories = (Categories) my data;
+	insert (me, categories -> size + 1);
+	my position = categories -> size;
+}
+
+static void gui_button_cb_replace (I, GuiButtonEvent event) {
+	(void) event;
+	iam (CategoriesEditor);
+	long posCount;
+	autoNUMvector<long> posList (GuiList_getSelectedPositions (my list, & posCount), 1);
+	if (posCount > 0) {
+		autostring32 text = GuiText_getString (my text);
+		if (str32len (text.peek()) != 0) {
+			autoSimpleString str = SimpleString_create (text.peek());
+			autoCategoriesEditorReplace command = CategoriesEditorReplace_create (me, str.transfer(),
+			                                      posList.peek(), posCount);
+			Command_do (command.peek());
+			if (my history) {
+				CommandHistory_insertItem (my history, command.transfer());
+			}
+			updateWidgets (me);
+		}
+	}
+}
+
+/* Precondition: contiguous selection */
+static void gui_button_cb_moveUp (I, GuiButtonEvent event) {
+	(void) event;
+	iam (CategoriesEditor);
+	long posCount;
+	autoNUMvector<long> posList (GuiList_getSelectedPositions (my list, & posCount), 1);
+	if (posCount > 0) {
+		autoCategoriesEditorMoveUp command = CategoriesEditorMoveUp_create
+		                                     (me, posList.peek(), posCount, posList[1] - 1);
+		Command_do (command.peek());
+		if (my history) {
+			CommandHistory_insertItem (my history, command.transfer());
+		}
+		updateWidgets (me);
+	}
+}
+
+/* Precondition: contiguous selection */
+static void gui_button_cb_moveDown (I, GuiButtonEvent event) {
+	(void) event;
+	iam (CategoriesEditor);
+	long posCount;
+	autoNUMvector<long> posList (GuiList_getSelectedPositions (my list, & posCount), 1);
+	if (posCount > 0) {
+		autoCategoriesEditorMoveDown command = CategoriesEditorMoveDown_create
+		                                       (me, posList.peek(), posCount, posList[posCount] + 1);
+		Command_do (command.peek());
+		if (my history) {
+			CommandHistory_insertItem (my history, command.transfer());
+		}
+		updateWidgets (me);
+	}
+}
+
+
+static void gui_cb_scroll (GUI_ARGS) {
+	GUI_IAM (CategoriesEditor);
+	notifyOutOfView (me);
+}
+
+static void gui_list_cb_double_click (void *void_me, GuiListEvent event) {
+	(void) event;
+	iam (CategoriesEditor);
+	const char32 *catg = OrderedOfString_itemAtIndex_c ((OrderedOfString) my data, my position);
+	GuiText_setString (my text, catg);
+}
+
+static void gui_list_cb_extended (void *void_me, GuiListEvent event) {
+	(void) event;
+	iam (CategoriesEditor);
+	updateWidgets (me);
+}
+
+static void gui_button_cb_undo (I, GuiButtonEvent event) {
+	(void) event;
+	iam (CategoriesEditor);
+	if (CommandHistory_offleft (my history)) {
+		return;
+	}
+	Command_undo (CommandHistory_getItem (my history));
+	CommandHistory_back (my history);
+	updateWidgets (me);
+}
+
+static void gui_button_cb_redo (I, GuiButtonEvent event) {
+	(void) event;
+	iam (CategoriesEditor);
+	CommandHistory_forth (my history);
+	if (CommandHistory_offright (my history)) {
+		return;
+	}
+	Command_do (CommandHistory_getItem (my history));
+	updateWidgets (me);
+}
+
+void structCategoriesEditor :: v_destroy () {
+	forget (history); /* !! Editor */
+	CategoriesEditor_Parent :: v_destroy ();
+}
+
+void structCategoriesEditor :: v_createHelpMenuItems (EditorMenu menu) {
+	CategoriesEditor_Parent :: v_createHelpMenuItems (menu);
+	EditorMenu_addCommand (menu, U"CategoriesEditor help", '?', menu_cb_help);
+}
+
+// origin is at top left.
+void structCategoriesEditor :: v_createChildren () {
+	double menuBarOffset = 40;
+	double button_width = 90, button_height = menuBarOffset, list_width = 260, list_height = 200, list_bottom;
+	double delta_x = 15, delta_y = menuBarOffset / 2, text_button_height = button_height / 2;
+	double left, right, top, bottom, buttons_left, buttons_top;
+
+	left = 5; right = left + button_width; top = 3 + menuBarOffset; bottom = top + text_button_height;
+	GuiLabel_createShown (d_windowForm, left, right, top, bottom, U"Positions:", 0);
+	left = right + delta_x ; right = left + button_width;
+	GuiLabel_createShown (d_windowForm, left, right, top, bottom, U"Values:", 0);
+
+	left = 0; right = left + list_width; buttons_top = (top = bottom + delta_y); list_bottom = bottom = top + list_height;
+	list = GuiList_create (d_windowForm, left, right, top, bottom, true, 0);
+	GuiList_setSelectionChangedCallback (list, gui_list_cb_extended, this);
+	GuiList_setDoubleClickCallback (list, gui_list_cb_double_click, this);
+	GuiThing_show (list);
+
+	buttons_left = left = right + 2 * delta_x; right = left + button_width; bottom = top + button_height;
+	GuiLabel_createShown (d_windowForm, left, right, top, bottom, U"Value:", 0);
+	left = right + delta_x; right = left + button_width;
+	text = GuiText_createShown (d_windowForm, left, right, top, bottom, 0);
+	GuiText_setString (text, CategoriesEditor_EMPTYLABEL);
+
+	left = buttons_left; right = left + button_width; top = bottom + delta_y; bottom = top + button_height;
+	insert = GuiButton_createShown (d_windowForm, left, right, top, bottom,	U"Insert", gui_button_cb_insert, this, GuiButton_DEFAULT);
+	left = right + delta_x; right = left + button_width;
+	replace = GuiButton_createShown (d_windowForm, left, right, top, bottom, U"Replace", gui_button_cb_replace, this, 0);
+	left = buttons_left; right = left + 1.5 * button_width; top = bottom + delta_y; bottom = top + button_height;
+	insertAtEnd = GuiButton_createShown (d_windowForm, left, right, top, bottom, U"Insert at end", gui_button_cb_insertAtEnd, this, 0);
+	top = bottom + delta_y; bottom = top + button_height;
+	undo = GuiButton_createShown (d_windowForm, left, right, top, bottom, U"Undo", gui_button_cb_undo, this, 0);
+	top = bottom + delta_y; bottom = top + button_height;
+	redo = GuiButton_createShown (d_windowForm, left, right, top, bottom, U"Redo", gui_button_cb_redo, this, 0);
+	top = bottom + delta_y; bottom = top + button_height;
+	remove = GuiButton_createShown (d_windowForm, left, right, top, bottom, U"Remove", gui_button_cb_remove, this, 0);
+	top = bottom + delta_y; bottom = top + button_height;
+	moveUp = GuiButton_createShown (d_windowForm, left, right, top, bottom, U"Move selection up", gui_button_cb_moveUp, this, 0);
+	top = bottom + delta_y; bottom = top + button_height;
+	moveDown = GuiButton_createShown (d_windowForm, left, right, top, bottom, U"Move selection down", gui_button_cb_moveDown, this, 0);
+
+	top = list_bottom + delta_y; bottom = top + button_height; left = 5; right = left + 200;
+	outOfView = GuiLabel_createShown (d_windowForm, left, right, top, bottom, U"", 0);
+}
+
+void structCategoriesEditor :: v_dataChanged () {
+	update (this, 0, 0, 0, 0);
+	updateWidgets (this);
+}
+
+CategoriesEditor CategoriesEditor_create (const char32 *title, Categories data) {
+	try {
+		autoCategoriesEditor me = Thing_new (CategoriesEditor);
+		Editor_init (me.peek(), 20, 40, 600, 600, title, data);
+		my history = CommandHistory_create (100);
+		update (me.peek(), 0, 0, 0, 0);
+		updateWidgets (me.peek());
+		return me.transfer();
+	} catch (MelderError) {
+		Melder_throw (U"Categories window not created.");
+	}
+}
+
+/* End of file CategoriesEditor.cpp */
diff --git a/dwtools/CategoriesEditor.h b/dwtools/CategoriesEditor.h
index 81f7827..2c54c31 100644
--- a/dwtools/CategoriesEditor.h
+++ b/dwtools/CategoriesEditor.h
@@ -40,6 +40,6 @@ Thing_define (CategoriesEditor, Editor) {
 		void v_dataChanged ();
 };
 
-CategoriesEditor CategoriesEditor_create (const wchar_t *title, Categories data);
+CategoriesEditor CategoriesEditor_create (const char32 *title, Categories data);
 
 #endif /* _CategoriesEditor_h_ */
\ No newline at end of file
diff --git a/dwtools/Categories_and_Strings.cpp b/dwtools/Categories_and_Strings.cpp
index 03c0d2c..b7337d3 100644
--- a/dwtools/Categories_and_Strings.cpp
+++ b/dwtools/Categories_and_Strings.cpp
@@ -27,26 +27,26 @@
 Strings Categories_to_Strings (Categories me) {
 	try {
 		if (my size < 1) {
-			Melder_throw ("No elements.");
+			Melder_throw (U"No elements.");
 		}
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector<wchar_t *> (1, my size);
+		thy strings = NUMvector<char32 *> (1, my size);
 		thy numberOfStrings = my size;
 
 		for (long i = 1; i <= my size; i++) {
 			SimpleString s = (SimpleString) my item[i];
-			thy strings[i] = Melder_wcsdup (s -> string);
+			thy strings[i] = Melder_dup (s -> string);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Strings.");
+		Melder_throw (me, U": not converted to Strings.");
 	}
 }
 
 Categories Strings_to_Categories (Strings me) {
 	try {
 		if (my numberOfStrings < 1) {
-			Melder_throw ("Empty strings.");
+			Melder_throw (U"Empty strings.");
 		}
 		autoCategories thee = Thing_new (Categories);
 		Categories_init (thee.peek(), my numberOfStrings);
@@ -57,7 +57,7 @@ Categories Strings_to_Categories (Strings me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted.");
+		Melder_throw (me, U": not converted.");
 	}
 }
 
diff --git a/dwtools/ClassificationTable.cpp b/dwtools/ClassificationTable.cpp
index 6d08293..371601a 100644
--- a/dwtools/ClassificationTable.cpp
+++ b/dwtools/ClassificationTable.cpp
@@ -1,6 +1,6 @@
 /* ClassificationTable.cpp
  *
- * Copyright (C) 1993-2011, 2014 David Weenink
+ * Copyright (C) 1993-2011, 2014, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -40,7 +40,7 @@ ClassificationTable ClassificationTable_create (long numberOfRows, long numberOf
 		TableOfReal_init (me.peek(), numberOfRows, numberOfClasses );
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ClassificationTable not created.");
+		Melder_throw (U"ClassificationTable not created.");
 	}
 }
 
@@ -54,13 +54,13 @@ Confusion ClassificationTable_to_Confusion (ClassificationTable me, int onlyClas
 		Confusion_and_ClassificationTable_increase (thee.peek(), me);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": confusions cannot be calculated.");
+		Melder_throw (me, U": confusions cannot be calculated.");
 	}
 }
 
 void Confusion_and_ClassificationTable_increase (Confusion me, ClassificationTable thee) {
 	if (my numberOfColumns != thy numberOfColumns) {
-		Melder_throw ("The number of columns must be equal.");
+		Melder_throw (U"The number of columns must be equal.");
 	}
 	for (long irow = 1; irow <= thy numberOfRows; irow++) {
 		long index = TableOfReal_getColumnIndexAtMaximumInRow (thee, irow);
@@ -86,7 +86,7 @@ Strings ClassificationTable_to_Strings_maximumProbability (ClassificationTable m
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": strings cannot be created.");
+		Melder_throw (me, U": strings cannot be created.");
 	}
 }
 
@@ -105,7 +105,7 @@ Categories ClassificationTable_to_Categories_maximumProbability (ClassificationT
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Categories created.");
+		Melder_throw (me, U": no Categories created.");
 	}
 }
 
@@ -113,22 +113,22 @@ Correlation ClassificationTable_to_Correlation_columns (ClassificationTable me)
 	try {
 		autoCorrelation thee = Correlation_create (my numberOfColumns);
 		for (long icol = 1; icol <= thy numberOfColumns; icol++) {
-			wchar_t *label = my columnLabels[icol];
+			char32 *label = my columnLabels[icol];
 			TableOfReal_setRowLabel (thee.peek(), icol, label);
 			TableOfReal_setColumnLabel (thee.peek(), icol, label);
 		}
 
 		for (long irow = 1; irow <= thy numberOfColumns; irow++) {
-			thy data[irow][irow] = 1;
+			thy data[irow][irow] = 1.0;
 			for (long icol = irow + 1; icol <= thy numberOfColumns; icol++) {
-				double n11 = 0, n22 = 0, n12 = 0;
+				double n11 = 0.0, n22 = 0.0, n12 = 0.0;
 				for (long i = 1; i <= my numberOfRows; i++) {
 					n12 += my data[i][irow] * my data[i][icol];
 					n11 += my data[i][irow] * my data[i][irow];
 					n22 += my data[i][icol] * my data[i][icol];
 				}
 				// probabilities might be very low!
-				if (n12 > 0 && n22 > 0) {
+				if (n12 > 0.0 && n22 > 0.0) {
 					thy data[irow][icol] = thy data[icol][irow] = n12 / sqrt (n11 * n22);
 				}
 			}
@@ -136,7 +136,7 @@ Correlation ClassificationTable_to_Correlation_columns (ClassificationTable me)
 		thy numberOfObservations = my numberOfRows;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no correlation created.");
+		Melder_throw (me, U": no correlation created.");
 	}
 }
 
diff --git a/dwtools/ComplexSpectrogram.cpp b/dwtools/ComplexSpectrogram.cpp
new file mode 100644
index 0000000..e99f16c
--- /dev/null
+++ b/dwtools/ComplexSpectrogram.cpp
@@ -0,0 +1,253 @@
+/* ComplexSpectrogram.cpp
+ * 
+ * Copyright (C) 2014-2015 David Weenink
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "ComplexSpectrogram.h"
+#include "Sound_and_Spectrum.h"
+
+#include "oo_DESTROY.h"
+#include "ComplexSpectrogram_def.h"
+#include "oo_COPY.h"
+#include "ComplexSpectrogram_def.h"
+#include "oo_EQUAL.h"
+#include "ComplexSpectrogram_def.h"
+#include "oo_CAN_WRITE_AS_ENCODING.h"
+#include "ComplexSpectrogram_def.h"
+#include "oo_WRITE_TEXT.h"
+#include "ComplexSpectrogram_def.h"
+#include "oo_WRITE_BINARY.h"
+#include "ComplexSpectrogram_def.h"
+#include "oo_READ_TEXT.h"
+#include "ComplexSpectrogram_def.h"
+#include "oo_READ_BINARY.h"
+#include "ComplexSpectrogram_def.h"
+#include "oo_DESCRIPTION.h"
+#include "ComplexSpectrogram_def.h"
+
+Thing_implement (ComplexSpectrogram, Matrix, 2);
+
+
+autoComplexSpectrogram ComplexSpectrogram_create (double tmin, double tmax, long nt, double dt,
+	double t1, double fmin, double fmax, long nf, double df, double f1) {
+	try {
+		autoComplexSpectrogram me = Thing_new (ComplexSpectrogram);
+		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, fmin, fmax, nf, df, f1);
+		my phase = NUMmatrix <double> (1, my ny, 1, my nx);
+		return me;
+	} catch (MelderError) {
+		Melder_throw (U"ComplexSpectrogram not created.");
+	}
+}
+
+autoComplexSpectrogram Sound_to_ComplexSpectrogram (Sound me, double windowLength, double timeStep) {
+	try {
+		double samplingFrequency = 1.0 / my dx, myDuration = my xmax - my xmin, t1;
+		if (windowLength > myDuration) {
+			Melder_throw (U"Your sound is too short:\nit should be at least as long as one window length.");
+		}
+		
+		long nsamp_window = (long) floor (windowLength / my dx);
+		long halfnsamp_window = nsamp_window / 2 - 1;
+		nsamp_window = halfnsamp_window * 2;
+		
+		if (nsamp_window < 2) {
+			Melder_throw (U"Your analysis window is too short: less than two samples.");
+		}
+		
+		long numberOfFrames;
+		Sampled_shortTermAnalysis (me, windowLength, timeStep, &numberOfFrames, &t1);
+
+		// Compute sampling of the spectrum
+
+		long numberOfFrequencies = halfnsamp_window + 1;
+		double df = samplingFrequency / (numberOfFrequencies - 1);
+		
+		autoComplexSpectrogram thee = ComplexSpectrogram_create (my xmin, my xmax, numberOfFrames, timeStep, t1, 0.0, 0.5 * samplingFrequency, numberOfFrequencies, df, 0.0);
+		// 
+		autoSound analysisWindow = Sound_create (1, 0.0, nsamp_window * my dx, nsamp_window, my dx, 0.5 * my dx);
+		
+		for (long iframe = 1; iframe <= numberOfFrames; iframe++) {
+			double t = Sampled_indexToX (thee.peek(), iframe);
+			long leftSample = Sampled_xToLowIndex (me, t), rightSample = leftSample + 1;
+			long startSample = rightSample - halfnsamp_window;
+			long endSample = leftSample + halfnsamp_window;
+			Melder_assert (startSample >= 1);
+			Melder_assert (endSample <= my nx);
+			
+			for (long j = 1; j <= nsamp_window; j++) {
+				analysisWindow -> z[1][j] = my z[1][startSample - 1 + j];
+			}
+			// window ?
+			autoSpectrum spec = Sound_to_Spectrum (analysisWindow.peek(), 0);
+			
+			thy z[1][iframe] = spec -> z[1][1] * spec -> z[1][1];
+			thy phase[1][iframe] = 0.0;
+			for (long ifreq = 2; ifreq <= numberOfFrequencies - 1; ifreq++) {
+				double x = spec -> z[1][ifreq], y = spec -> z[2][ifreq];
+				thy z[ifreq][iframe] = x * x + y * y; // power
+				thy phase[ifreq][iframe] = atan2 (y, x); // phase [-pi,+pi]
+			}
+			// even number of samples
+			thy z[numberOfFrequencies][iframe] = spec -> z[1][numberOfFrequencies] * spec -> z[1][numberOfFrequencies];
+			thy phase[numberOfFrequencies][iframe] = 0.0;
+		}
+		return thee;
+	} catch (MelderError) {
+		Melder_throw (me, U": no ComplexSpectrogram created.");
+	}
+}
+
+autoSound ComplexSpectrogram_to_Sound (ComplexSpectrogram me, double stretchFactor) {
+	try {
+		/* original number of samples is odd: imaginary part of last spectral value is zero -> 
+		 * phase is either zero or +/-pi
+		 */
+		double pi = atan2 (0.0, - 0.5);
+		double samplingFrequency = 2.0 * my ymax;
+		double lastFrequency = my y1 + (my ny - 1) * my dy, lastPhase = my phase[my ny][1];
+		int originalNumberOfSamplesProbablyOdd = (lastPhase != 0.0 && lastPhase != pi && lastPhase != -pi) || 
+			my ymax - lastFrequency > 0.25 * my dx;
+		if (my y1 != 0.0) {
+			Melder_throw (U"A Fourier-transformable ComplexSpectrogram must have a first frequency of 0 Hz, not ", my y1, U" Hz.");
+		}
+		long nsamp_window = 2 * my ny - (originalNumberOfSamplesProbablyOdd ? 1 : 2 );
+		long halfnsamp_window = nsamp_window / 2;
+		double synthesisWindowDuration = nsamp_window / samplingFrequency;
+		autoSpectrum spectrum = Spectrum_create (my ymax, my ny);
+		autoSound synthesisWindow = Sound_createSimple (1, synthesisWindowDuration, samplingFrequency);
+		double newDuration = (my xmax - my xmin) * stretchFactor;
+		autoSound thee = Sound_createSimple (1, newDuration, samplingFrequency); //TODO
+		double thyStartTime;
+		for (long iframe = 1; iframe <= my nx; iframe++) {
+			// "original" sound :
+			double tmid = Sampled_indexToX (me, iframe);
+			long leftSample = Sampled_xToLowIndex (thee.peek(), tmid);
+			long rightSample = leftSample + 1;
+			long startSample = rightSample - halfnsamp_window;
+			double startTime = Sampled_indexToX (thee.peek(), startSample);
+			if (iframe == 1) {
+				thyStartTime = Sampled_indexToX (thee.peek(), startSample);
+			}
+			//long endSample = leftSample + halfnsamp_window;
+			// New Sound with stretch
+			long thyStartSample = Sampled_xToLowIndex (thee.peek(),thyStartTime);
+			double thyEndTime = thyStartTime + my dx * stretchFactor;
+			long thyEndSample = Sampled_xToLowIndex (thee.peek(), thyEndTime);
+			long stretchedStepSizeSamples = thyEndSample - thyStartSample + 1;
+			//double extraTime = (thyStartSample - startSample + 1) * thy dx;
+			double extraTime = (thyStartTime - startTime);
+			spectrum -> z[1][1] = sqrt (my z[1][iframe]);
+			for (long ifreq = 2; ifreq <= my ny; ifreq++) {
+				double f = my y1 + (ifreq - 1) * my dy;
+				double a = sqrt (my z[ifreq][iframe]);
+				double phi = my phase[ifreq][iframe], intPart;
+				double extraPhase = 2.0 * pi * modf (extraTime * f, &intPart); // fractional part
+				phi += extraPhase;
+				spectrum -> z[1][ifreq] = a * cos (phi);
+				spectrum -> z[2][ifreq] = a * sin (phi);
+			}
+
+			autoSound synthesis = Spectrum_to_Sound (spectrum.peek());
+
+			// Where should the sound be placed?
+
+			long thyEndSampleP = (long) floor (fmin (thyStartSample + synthesis -> nx - 1, thyStartSample + stretchedStepSizeSamples - 1)); // guard against extreme stretches
+			if (iframe == my nx) {
+				thyEndSampleP = (long) floor (fmin (thy nx, thyStartSample + synthesis -> nx - 1));   // ppgb: waarom naar beneden afgerond?
+			}
+			for (long j = thyStartSample; j <= thyEndSampleP; j++) {
+				thy z[1][j] = synthesis -> z[1][j - thyStartSample + 1];
+			}
+			thyStartTime += my dx * stretchFactor;
+		}
+		return thee;
+	} catch (MelderError) {
+		Melder_throw (me, U": no Sound created.");
+	}
+}
+
+static autoSound ComplexSpectrogram_to_Sound2 (ComplexSpectrogram me, double stretchFactor) {
+	try {
+		/* original number of samples is odd: imaginary part of last spectral value is zero -> 
+		 * phase is either zero or pi
+		 */
+		double pi = atan2 (0.0, - 0.5);
+		double samplingFrequency = 2.0 * my ymax;
+		double lastFrequency = my y1 + (my ny - 1) * my dy;
+		int originalNumberOfSamplesProbablyOdd = (my phase [my ny][1] != 0.0 && my phase[my ny][1] != pi) || my ymax - lastFrequency > 0.25 * my dx;
+		if (my y1 != 0.0) {
+			Melder_throw (U"A Fourier-transformable Spectrum must have a first frequency of 0 Hz, not ", my y1, U" Hz.");
+		}
+		long numberOfSamples = 2 * my ny - (originalNumberOfSamplesProbablyOdd ? 1 : 2 );
+		double synthesisWindowDuration = numberOfSamples / samplingFrequency;
+		autoSpectrum spectrum = Spectrum_create (my ymax, my ny);
+		autoSound synthesisWindow = Sound_createSimple (1, synthesisWindowDuration, samplingFrequency);
+		long stepSizeSamples = my dx * samplingFrequency * stretchFactor;
+		double newDuration = (my xmax - my xmin) * stretchFactor + 0.05;
+		autoSound thee = Sound_createSimple (1, newDuration, samplingFrequency); //TODO
+		long istart = 1, iend = istart + stepSizeSamples - 1;
+		for (long iframe = 1; iframe <= my nx; iframe++) {
+			spectrum -> z[1][1] = sqrt (my z[1][iframe]);
+			for (long ifreq = 2; ifreq <= my ny; ifreq++) {
+				double f = my y1 + (ifreq - 1) * my dy;
+				double a = sqrt (my z[ifreq][iframe]);
+				double phi = my phase[ifreq][iframe];
+				double extraPhase = 2.0 * pi * (stretchFactor - 1.0) * my dx * f;
+				phi += extraPhase;
+				spectrum -> z[1][ifreq] = a * cos (phi);
+				spectrum -> z[2][ifreq] = a * sin (phi);
+			}
+			autoSound synthesis = Spectrum_to_Sound (spectrum.peek());
+			for (long j = istart; j <= iend; j++) {
+				thy z[1][j] = synthesis -> z[1][j - istart + 1];
+			}
+			istart = iend + 1; iend = istart + stepSizeSamples - 1;
+		}
+		return thee;
+	} catch (MelderError) {
+		Melder_throw (me, U": no Sound created.");
+	}
+}
+
+autoSpectrogram ComplexSpectrogram_to_Spectrogram (ComplexSpectrogram me) {
+	try {
+		autoSpectrogram thee = Spectrogram_create (my xmin, my xmax, my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1);
+		NUMmatrix_copyElements<double> (my z, thy z, 1, my ny, 1, my nx);
+		return thee;
+	} catch (MelderError) {
+		Melder_throw (me, U": not converted to Spectrogram.");
+	}
+}
+
+autoSpectrum ComplexSpectrogram_to_Spectrum (ComplexSpectrogram me, double time) {
+	try {
+		long iframe = Sampled_xToLowIndex (me, time);   // ppgb: geen Sampled_xToIndex gebruiken voor integers (afrondingen altijd expliciet maken)
+		iframe = iframe < 1 ? 1 : (iframe > my nx ? my nx : iframe);
+		autoSpectrum thee = Spectrum_create (my ymax, my ny);
+		for (long ifreq = 1; ifreq <= my ny; ifreq++) {
+			double a = sqrt (my z[ifreq][iframe]);
+			double phi = my phase[ifreq][iframe];
+			thy z[1][ifreq] = a * cos (phi);
+			thy z[2][ifreq] = a * sin (phi);
+		}
+		return thee;
+	} catch (MelderError) {
+		Melder_throw (me, U": no Spectrum created.");
+	}
+}
+/* End of file ComplexSpectrogram.cpp */
diff --git a/dwtools/ComplexSpectrogram.h b/dwtools/ComplexSpectrogram.h
new file mode 100644
index 0000000..9ae6962
--- /dev/null
+++ b/dwtools/ComplexSpectrogram.h
@@ -0,0 +1,43 @@
+#ifndef _ComplexSpectrogram_h_
+#define _ComplexSpectrogram_h_
+
+/* ComplexSpectrogram.h
+ * 
+ * Copyright (C) 2014 David Weenink
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "Sound.h"
+#include "Spectrum.h"
+#include "Spectrogram.h"
+
+#include "ComplexSpectrogram_def.h"
+oo_CLASS_CREATE (ComplexSpectrogram, Matrix);
+
+
+autoComplexSpectrogram ComplexSpectrogram_create (double tmin, double tmax, long nt, double dt,
+	double t1, double fmin, double fmax, long nf, double df, double f1);
+
+autoComplexSpectrogram Sound_to_ComplexSpectrogram (Sound me, double windowLength, double timeStep);
+/* Hann window because we want to reconstruct */
+
+autoSound ComplexSpectrogram_to_Sound (ComplexSpectrogram me, double stretchFactor);
+
+autoSpectrogram ComplexSpectrogram_to_Spectrogram (ComplexSpectrogram me);
+
+autoSpectrum ComplexSpectrogram_to_Spectrum (ComplexSpectrogram me, double time);
+
+#endif  /* _ComplexSpectrogram_h_ */
diff --git a/dwtools/Vowel_def.h b/dwtools/ComplexSpectrogram_def.h
similarity index 73%
copy from dwtools/Vowel_def.h
copy to dwtools/ComplexSpectrogram_def.h
index 6021ea5..f334468 100644
--- a/dwtools/Vowel_def.h
+++ b/dwtools/ComplexSpectrogram_def.h
@@ -1,6 +1,6 @@
-/* Vowel_def.h
+/* ComplexSpectrogram_def.h
  * 
- * Copyright (C) 2011 David Weenink & Paul Boersma
+ * Copyright (C) 2014 David Weenink
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,12 +18,13 @@
  */
 
 
-#define ooSTRUCT Vowel
-oo_DEFINE_CLASS (Vowel, Function)
-	oo_OBJECT (PitchTier, 0, pt)
-	oo_OBJECT (FormantTier, 0, ft)
-oo_END_CLASS (Vowel)
+#define ooSTRUCT ComplexSpectrogram
+oo_DEFINE_CLASS (ComplexSpectrogram, Matrix)
+
+	oo_DOUBLE_MATRIX (phase, ny, nx)
+
+oo_END_CLASS (ComplexSpectrogram)
 #undef ooSTRUCT
 
 
-/* End of file Vowel_def.h */
+/* End of file ComplexSpectrogram_def.h */
diff --git a/dwtools/Configuration.cpp b/dwtools/Configuration.cpp
index 8bb1756..ce94c95 100644
--- a/dwtools/Configuration.cpp
+++ b/dwtools/Configuration.cpp
@@ -1,6 +1,6 @@
 /* Configuration.cpp
  *
- * Copyright (C) 1993-2012 David Weenink
+ * Copyright (C) 1993-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,10 +24,10 @@
  djmw 20030801 Configuration_drawConcentrationEllipses extra argument
  djmw 20040303 Moved containsPrintableCharacter to NUM2.c
  djmw 20041026 Removed non-used code.
- djmw 20050314 Configuration_draw crashed when rowlabel==NULL
+ djmw 20050314 Configuration_draw crashed when rowlabel==nullptr
  djmw 20061021 printf expects %ld for 'long int'
  djmw 20061212 Changed info to Melder_writeLine<x> format.
- djmw 20071009 wchar_t
+ djmw 20071009 wchar
  djmw 20071012 Added: o_CAN_WRITE_AS_ENCODING.h
  djmw 20100302 Extra test in Configuration_rotate
  djmw 20110304 Thing_new
@@ -63,27 +63,26 @@
 Thing_implement (Configuration, TableOfReal, 0);
 
 void structConfiguration :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of points: ", Melder_integer (numberOfRows));
-	MelderInfo_writeLine (L"Number of dimensions: ", Melder_integer (numberOfColumns));
-	MelderInfo_writeLine (L"Metric: ", Melder_integer (metric));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of points: ", numberOfRows);
+	MelderInfo_writeLine (U"Number of dimensions: ", numberOfColumns);
+	MelderInfo_writeLine (U"Metric: ", metric);
 }
 
-Configuration Configuration_create (long numberOfPoints,
-                                    long numberOfDimensions) {
+autoConfiguration Configuration_create (long numberOfPoints, long numberOfDimensions) {
 	try {
 		autoConfiguration me = Thing_new (Configuration);
 		TableOfReal_init (me.peek(), numberOfPoints, numberOfDimensions);
 		my w = NUMvector<double> (1, numberOfDimensions);
-		TableOfReal_setSequentialRowLabels (me.peek(), 0, 0, NULL, 1, 1);
-		TableOfReal_setSequentialColumnLabels (me.peek(), 0, 0, L"dimension ", 1, 1);
+		TableOfReal_setSequentialRowLabels (me.peek(), 0, 0, nullptr, 1, 1);
+		TableOfReal_setSequentialColumnLabels (me.peek(), 0, 0, U"dimension ", 1, 1);
 
 		my metric = 2;
 		Configuration_setDefaultWeights (me.peek());
 		Configuration_randomize (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Configuration not created.");
+		Melder_throw (U"Configuration not created.");
 	}
 }
 
@@ -106,27 +105,26 @@ void Configuration_setSqWeights (Configuration me, const double weight[]) {
 void Configuration_normalize (Configuration me, double sumsq, int columns) {
 	TableOfReal_centreColumns (me);
 	if (columns) {
-		sumsq = sumsq <= 0 ? 1.0 : sqrt (sumsq);
+		sumsq = sumsq <= 0.0 ? 1.0 : sqrt (sumsq);
 		NUMnormalizeColumns (my data, my numberOfRows, my numberOfColumns, sumsq);
 	} else {
-		if (sumsq <= 0) {
+		if (sumsq <= 0.0) {
 			sumsq = my numberOfRows;
 		}
-		NUMnormalize (my data, my numberOfRows, my numberOfColumns,
-		              sqrt (sumsq));
+		NUMnormalize (my data, my numberOfRows, my numberOfColumns, sqrt (sumsq));
 	}
 }
 
 void Configuration_randomize (Configuration me) {
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			my data[i][j] = NUMrandomUniform (-1, 1);
+			my data[i][j] = NUMrandomUniform (-1.0, 1.0);
 		}
 	}
 }
 
 void Configuration_rotate (Configuration me, long dimension1, long dimension2, double angle_degrees) {
-	double f = NUMpi * (2 - angle_degrees / 180);
+	double f = NUMpi * (2.0 - angle_degrees / 180.0);
 	double cosa = cos (f), sina = sin (f);
 
 	if (dimension1 == dimension2 || angle_degrees == 0) {
@@ -158,10 +156,10 @@ void Configuration_invertDimension (Configuration me, int dimension) {
 
 
 static double NUMsquaredVariance (double **a, long nr, long nc, int rawPowers) {
-	double v4 = 0;
+	double v4 = 0.0;
 
 	for (long j = 1; j <= nc; j++) {
-		double sum4 = 0, mean = 0;
+		double sum4 = 0.0, mean = 0.0;
 		for (long i = 1; i <= nr; i++) {
 			double sq = a[i][j] * a[i][j];
 			sum4 += sq * sq;
@@ -181,8 +179,7 @@ static double NUMsquaredVariance (double **a, long nr, long nc, int rawPowers) {
 		planar rotations: a remedy against nonoptimal varimax rotations",
 		Psychometrika 60, 437-446.
 */
-static void NUMvarimax (double **xm, double **ym, long nr, long nc, int normalizeRows, int quartimax,
-                        long maximumNumberOfIterations, double tolerance) {
+static void NUMvarimax (double **xm, double **ym, long nr, long nc, int normalizeRows, int quartimax, long maximumNumberOfIterations, double tolerance) {
 	Melder_assert (nr > 0 && nc > 0);
 
 	NUMmatrix_copyElements (xm, ym, 1, nr, 1, nc);
@@ -207,7 +204,7 @@ static void NUMvarimax (double **xm, double **ym, long nr, long nc, int normaliz
 			for (long j = 1; j <= nc; j++) {
 				norm[i] += ym[i][j] * ym[i][j];
 			}
-			if (norm[i] <= 0) {
+			if (norm[i] <= 0.0) {
 				continue;
 			}
 			norm[i] = sqrt (norm[i]);
@@ -220,7 +217,7 @@ static void NUMvarimax (double **xm, double **ym, long nr, long nc, int normaliz
 	// Initial squared "variance".
 
 	double varianceSq = NUMsquaredVariance (ym, nr, nc, quartimax);
-	if (varianceSq == 0) {
+	if (varianceSq == 0.0) {
 		return;
 	}
 
@@ -231,17 +228,17 @@ static void NUMvarimax (double **xm, double **ym, long nr, long nc, int normaliz
 	do {
 		for (long c1 = 1; c1 <= nc; c1++) {
 			for (long c2 = c1 + 1; c2 <= nc; c2++) {
-				double um = 0, vm = 0;
+				double um = 0.0, vm = 0.0;
 				for (long i = 1; i <= nr; i++) {
 					double x = ym[i][c1], y = ym[i][c2];
 					u[i] = x * x - y * y;
 					um += u[i];
-					v[i] = 2 * x * y;
+					v[i] = 2.0 * x * y;
 					vm += v[i];
 				}
 				um /= nr; vm /= nr;
 				if (quartimax || nr == 1) {
-					um = vm = 0;
+					um = vm = 0.0;
 				}
 
 				/*
@@ -251,15 +248,15 @@ static void NUMvarimax (double **xm, double **ym, long nr, long nc, int normaliz
 					Tricks: multiplication with n drops out!
 						a's multiplication by 2 outside the loop.
 				*/
-				double a = 0, b = 0;
+				double a = 0.0, b = 0.0;
 				for (long i = 1; i <= nr; i++) {
 					double ui = u[i] - um, vi = v[i] - vm;
 					a += ui * vi;
 					b += ui * ui - vi * vi;
 				}
-				double c = sqrt (4 * a * a + b * b);
-				double w = sqrt ( (c + b) / (2 * c));
-				if (a > 0) {
+				double c = sqrt (4.0 * a * a + b * b);
+				double w = sqrt ( (c + b) / (2.0 * c));
+				if (a > 0.0) {
 					w = -w;
 				}
 				double cost = sqrt (0.5 + 0.5 * w);
@@ -271,7 +268,7 @@ static void NUMvarimax (double **xm, double **ym, long nr, long nc, int normaliz
 
 				// Prevent permutations: when w < 0, i.e., a > 0, swap columns of T:/
 
-				if (w < 0) {
+				if (w < 0.0) {
 					t11 = sint; t12 = t21 = cost; t22 = -sint;
 				}
 
@@ -301,25 +298,24 @@ static void NUMvarimax (double **xm, double **ym, long nr, long nc, int normaliz
 	}
 }
 
-Configuration Configuration_varimax (Configuration me, int normalizeRows,
+autoConfiguration Configuration_varimax (Configuration me, int normalizeRows,
                                      int quartimax, long maximumNumberOfIterations, double tolerance) {
 	try {
 		autoConfiguration thee = Data_copy (me);
-		NUMvarimax (my data, thy data, my numberOfRows, my numberOfColumns, normalizeRows, quartimax,
-		            maximumNumberOfIterations, tolerance);
-		return thee.transfer();
+		NUMvarimax (my data, thy data, my numberOfRows, my numberOfColumns, normalizeRows, quartimax, maximumNumberOfIterations, tolerance);
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": varimax rotation not performed.");
+		Melder_throw (me, U": varimax rotation not performed.");
 	}
 }
 
-Configuration Configuration_congruenceRotation (Configuration me, Configuration thee, long maximumNumberOfIterations, double tolerance) {
+autoConfiguration Configuration_congruenceRotation (Configuration me, Configuration thee, long maximumNumberOfIterations, double tolerance) {
 	try {
 		autoAffineTransform at = Configurations_to_AffineTransform_congruence (me, thee, maximumNumberOfIterations, tolerance);
 		autoConfiguration him = Configuration_and_AffineTransform_to_Configuration (me, at.peek());
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": congruence rotation not performed.");
+		Melder_throw (me, U": congruence rotation not performed.");
 	}
 }
 
@@ -333,16 +329,14 @@ void Configuration_rotateToPrincipalDirections (Configuration me) {
 		NUMvector_free (my data, 1);
 		my data = m.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not rotated to principal directions.");
+		Melder_throw (me, U": not rotated to principal directions.");
 	}
 }
 
-void Configuration_draw (Configuration me, Graphics g, int xCoordinate, int yCoordinate, double xmin, double xmax,
-                         double ymin, double ymax, int labelSize, int useRowLabels, const wchar_t *label, int garnish) {
+void Configuration_draw (Configuration me, Graphics g, int xCoordinate, int yCoordinate, double xmin, double xmax, double ymin, double ymax, int labelSize, int useRowLabels, const char32 *label, int garnish) {
 	long nPoints = my numberOfRows, numberOfDimensions = my numberOfColumns;
 
-	if (numberOfDimensions > 1 && (xCoordinate > numberOfDimensions ||
-	                               yCoordinate > numberOfDimensions)) {
+	if (numberOfDimensions > 1 && (xCoordinate > numberOfDimensions || yCoordinate > numberOfDimensions)) {
 		return;
 	}
 	if (numberOfDimensions == 1) {
@@ -357,21 +351,21 @@ void Configuration_draw (Configuration me, Graphics g, int xCoordinate, int yCoo
 
 	for (long i = 1; i <= nPoints; i++) {
 		x[i] = my data[i][xCoordinate] * my w[xCoordinate];
-		y[i] = numberOfDimensions > 1 ? my data[i][yCoordinate] * my w[yCoordinate] : 0;
+		y[i] = numberOfDimensions > 1 ? my data[i][yCoordinate] * my w[yCoordinate] : 0.0;
 	}
 	if (xmax <= xmin) {
 		NUMvector_extrema (x.peek(), 1, nPoints, &xmin, &xmax);
 	}
 	if (xmax <= xmin) {
-		xmax += 1;
-		xmin -= 1;
+		xmax += 1.0;
+		xmin -= 1.0;
 	}
 	if (ymax <= ymin) {
 		NUMvector_extrema (y.peek(), 1, nPoints, &ymin, &ymax);
 	}
 	if (ymax <= ymin) {
-		ymax += 1;
-		ymin -= 1;
+		ymax += 1.0;
+		ymin -= 1.0;
 	}
 	Graphics_setWindow (g, xmin, xmax, ymin, ymax);
 	Graphics_setInner (g);
@@ -379,7 +373,7 @@ void Configuration_draw (Configuration me, Graphics g, int xCoordinate, int yCoo
 	Graphics_setFontSize (g, labelSize);
 	for (long i = 1; i <= my numberOfRows; i++) {
 		if (x[i] >= xmin && x[i] <= xmax && y[i] >= ymin && y[i] <= ymax) {
-			wchar_t const *plotLabel = useRowLabels ? my rowLabels[i] : label;
+			const char32 *plotLabel = useRowLabels ? my rowLabels[i] : label;
 			if (NUMstring_containsPrintableCharacter (plotLabel)) {
 				Graphics_text (g, x[i], y[i], plotLabel);
 			} else {
@@ -392,44 +386,41 @@ void Configuration_draw (Configuration me, Graphics g, int xCoordinate, int yCoo
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
 		if (numberOfDimensions > 1) {
-			Graphics_marksLeft (g, 2, 1, 1, 0);
+			Graphics_marksLeft (g, 2, true, true, false);
 			if (my columnLabels[xCoordinate]) {
-				Graphics_textBottom (g, 1, my columnLabels[xCoordinate]);
+				Graphics_textBottom (g, true, my columnLabels[xCoordinate]);
 			}
 			if (my columnLabels[yCoordinate]) {
-				Graphics_textLeft (g, 1, my columnLabels[yCoordinate]);
+				Graphics_textLeft (g, true, my columnLabels[yCoordinate]);
 			}
 		}
 	}
 
-	if (noLabel > 0) Melder_warning (L"Configuration_draw: ", Melder_integer (noLabel), L" from ", Melder_integer (my numberOfRows),
-		                                 L" labels are not visible because they are empty or they contain only spaces or they contain only non-printable characters");
+	if (noLabel > 0) {
+		Melder_warning (U"Configuration_draw: ", noLabel, U" from ", my numberOfRows, U" labels are not visible because they are empty or they contain only spaces or they contain only non-printable characters");
+	}
 }
 
-void Configuration_drawConcentrationEllipses (Configuration me, Graphics g,
-        double scale, int confidence, const wchar_t *label, long d1, long d2, double xmin, double xmax,
-        double ymin, double ymax, int fontSize, int garnish) {
+void Configuration_drawConcentrationEllipses (Configuration me, Graphics g, double scale, int confidence, const char32 *label, long d1, long d2, double xmin, double xmax, double ymin, double ymax, int fontSize, int garnish) {
 	autoSSCPs sscps = TableOfReal_to_SSCPs_byLabel (me);
-	SSCPs_drawConcentrationEllipses (sscps.peek(), g, scale, confidence, label,
-	                                 d1, d2, xmin, xmax, ymin, ymax, fontSize, garnish);
+	SSCPs_drawConcentrationEllipses (sscps.peek(), g, scale, confidence, label, d1, d2, xmin, xmax, ymin, ymax, fontSize, garnish);
 }
 
-Configuration TableOfReal_to_Configuration (I) {
-	iam (TableOfReal);
+autoConfiguration TableOfReal_to_Configuration (TableOfReal me) {
 	try {
 		autoConfiguration thee = Configuration_create (my numberOfRows, my numberOfColumns);
 
 		NUMmatrix_copyElements (my data, thy data, 1, my numberOfRows, 1, my numberOfColumns);
 		TableOfReal_copyLabels (me, thee.peek(), 1, 1);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted.");
+		Melder_throw (me, U": not converted.");
 	}
 }
 
-Configuration TableOfReal_to_Configuration_pca (TableOfReal me, long numberOfDimensions) {
+autoConfiguration TableOfReal_to_Configuration_pca (TableOfReal me, long numberOfDimensions) {
 	try {
 		if (numberOfDimensions < 1 || numberOfDimensions > my numberOfColumns) {
 			numberOfDimensions = my numberOfColumns;
@@ -437,78 +428,74 @@ Configuration TableOfReal_to_Configuration_pca (TableOfReal me, long numberOfDim
 
 		autoPCA pca = TableOfReal_to_PCA (me);
 		autoConfiguration thee = PCA_and_TableOfReal_to_Configuration (pca.peek(), me, numberOfDimensions);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": pca not performed.");
+		Melder_throw (me, U": pca not performed.");
 	}
 }
 
 /********************** Examples *********************************************/
 
-Configuration Configuration_createLetterRExample (int choice) {
+autoConfiguration Configuration_createLetterRExample (int choice) {
 	double x1[33] = { 0,
-	                  -5, -5, -5, -5, -5, -5, -5,   -5, -5, -5,
-	                  -5, -4, -3, -2, -1,  0,  1, 2.25,  3,  3,
-	                  2.25,  1,  0, -1, -2, -3, -4,   -1,  0,  1, 2, 3
-	                };
+		-5, -5, -5, -5, -5, -5, -5,   -5, -5, -5,
+		-5, -4, -3, -2, -1,  0,  1, 2.25,  3,  3,
+		2.25,  1,  0, -1, -2, -3, -4,   -1,  0,  1, 2, 3 };
 	double y1[33] = { 0,
-	                  -6, -5, -4, -3, -2, -1, 0,   1,  2,  3,
-	                  4,  4,  4,  4,  4,  4, 4, 3.5,  2,  1,
-	                  -0.5, -1, -1, -1, -1, -1, -1, -2, -3, -4, -5, -6
-	                };
+		-6, -5, -4, -3, -2, -1, 0,   1,  2,  3,
+		4,  4,  4,  4,  4,  4, 4, 3.5,  2,  1,
+		-0.5, -1, -1, -1, -1, -1, -1, -2, -3, -4, -5, -6 };
 	double x2[33] = {0, 0.94756043346272423, 0.73504466902509913,
-	                 0.4528453515175927,    0.46311499024105723,   0.30345454816993439,
-	                 0.075184942115601547, -0.090010071904764719, -0.19630977381424003,
-	                 -0.36341509807865086,  -0.54216996409132612,  -0.68704678013309872,
-	                 -0.67370169194623086,  -0.69336494336440502,  -0.67809065144478664,
-	                 -0.61382610572366281,  -0.68656530656078996,  -0.57704879646736551,
-	                 -0.63417502349009069,  -0.37153350651419026,  -0.091809666009009777,
-	                 0.054833807442559397,  0.1445593164362155,    0.055587230806920782,
-	                 0.18201798315035453,   0.048445620192953162,  0.081595930742961439,
-	                 0.20063623749033621,   0.28546520751183313,   0.39384438699721991,
-	                 0.62832258520372286,   0.78548335015622228,   1.0610707888793069
-	                };
+		0.4528453515175927,    0.46311499024105723,   0.30345454816993439,
+		0.075184942115601547, -0.090010071904764719, -0.19630977381424003,
+		-0.36341509807865086,  -0.54216996409132612,  -0.68704678013309872,
+		-0.67370169194623086,  -0.69336494336440502,  -0.67809065144478664,
+		-0.61382610572366281,  -0.68656530656078996,  -0.57704879646736551,
+		-0.63417502349009069,  -0.37153350651419026,  -0.091809666009009777,
+		0.054833807442559397,  0.1445593164362155,    0.055587230806920782,
+		0.18201798315035453,   0.048445620192953162,  0.081595930742961439,
+		0.20063623749033621,   0.28546520751183313,   0.39384438699721991,
+		0.62832258520372286,   0.78548335015622228,   1.0610707888793069 };
 	double y2[33] = {0, 0.49630791172076621, 0.53320347382055022,
-	                 0.62384637225470441,  0.47592708487655661,  0.50364353255684202,
-	                 0.55311720162084443,  0.55118713773007066,  0.50007736370068601,
-	                 0.40432332354648709,  0.49817059660482677,  0.49803436631629411,
-	                 0.33213829258059019,  0.14585700576425648, -0.022110500334692869,
-	                 -0.1752555003289698,  -0.29448744336706828, -0.45639468287493545,
-	                 -0.59177815505008013, -0.74980550818568981, -0.78095916436791279,
-	                 -0.64447562732895125, -0.49526830813007033, -0.22443396573313243,
-	                 -0.066378148077667398, -0.03498490725857361,  0.16196028200653381,
-	                 0.30633527000982519, -0.14894460651161745, -0.30808798640907431,
-	                 -0.35920781945385832, -0.62766325578928184, -0.60389363590825562
-	                };
+		0.62384637225470441,  0.47592708487655661,  0.50364353255684202,
+		0.55311720162084443,  0.55118713773007066,  0.50007736370068601,
+		0.40432332354648709,  0.49817059660482677,  0.49803436631629411,
+		0.33213829258059019,  0.14585700576425648, -0.022110500334692869,
+		-0.1752555003289698,  -0.29448744336706828, -0.45639468287493545,
+		-0.59177815505008013, -0.74980550818568981, -0.78095916436791279,
+		-0.64447562732895125, -0.49526830813007033, -0.22443396573313243,
+		-0.066378148077667398, -0.03498490725857361,  0.16196028200653381,
+		0.30633527000982519, -0.14894460651161745, -0.30808798640907431,
+		-0.35920781945385832, -0.62766325578928184, -0.60389363590825562 };
 	try {
 		double *x, *y;
 		autoConfiguration me = Configuration_create (32, 2);
 
 		if (choice == 2) {
 			x = x2; y = y2;
-			Thing_setName (me.peek(), L"R_fit");
+			Thing_setName (me.peek(), U"R_fit");
 		} else {
 			x = x1; y = y1;
-			Thing_setName (me.peek(), L"R");
+			Thing_setName (me.peek(), U"R");
 		}
 
 		for (long i = 1; i <= 32; i++) {
-			wchar_t s[20];
-			swprintf (s, 20, L"%ld", i);
+			char32 s[20];
+			Melder_sprint (s,20, i);
 			TableOfReal_setRowLabel (me.peek(), i, s);
 			my data [i][1] = x[i];
 			my data [i][2] = y[i];
 		}
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Letter R Configuration not created.");
+		Melder_throw (U"Letter R Configuration not created.");
 	}
 }
 
-Configuration Configuration_createCarrollWishExample () {
-	double  x[10] = {0, -1, 0, 1, -1, 0, 1, -1,  0,  1};
-	double  y[10] = {0,  1, 1, 1,  0, 0, 0, -1, -1, -1};
-	wchar_t const *label[] = { L"", L"A", L"B", L"C", L"D", L"E", L"F", L"G", L"H", L"I"};
+autoConfiguration Configuration_createCarrollWishExample () {
+	double  x[10] = {0.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, -1.0,  0.0,  1.0};
+	double  y[10] = {0.0,  1.0, 1.0, 1.0,  0.0, 0.0, 0.0, -1.0, -1.0, -1.0};
+	char32 const *label[] = { U"", U"A", U"B", U"C", U"D", U"E", U"F", U"G", U"H", U"I"};
 	try {
 		long nObjects = 9;
 		autoConfiguration me = Configuration_create (nObjects, 2);
@@ -517,9 +504,9 @@ Configuration Configuration_createCarrollWishExample () {
 			my data[i][2] = y[i];
 			TableOfReal_setRowLabel (me.peek(), i, label[i]);
 		}
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Carroll Wish Configuration not created.");
+		Melder_throw (U"Carroll Wish Configuration not created.");
 	}
 }
 
@@ -527,13 +514,13 @@ Configuration Configuration_createCarrollWishExample () {
 
 Thing_implement (Configurations, Ordered, 0);
 
-Configurations Configurations_create () {
+autoConfigurations Configurations_create () {
 	try {
 		autoConfigurations me = Thing_new (Configurations);
 		Ordered_init (me.peek(), classConfiguration, 10);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Configurations not created.");
+		Melder_throw (U"Configurations not created.");
 	}
 }
 
diff --git a/dwtools/Configuration.h b/dwtools/Configuration.h
index c015ecc..c1c1453 100644
--- a/dwtools/Configuration.h
+++ b/dwtools/Configuration.h
@@ -2,7 +2,7 @@
 #define _Configuration_h_
 /* Configuration.h
  *
- * Copyright (C) 1992-2011 David Weenink
+ * Copyright (C) 1992-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 #include "Configuration_def.h"
 oo_CLASS_CREATE (Configuration, TableOfReal);
 
-Configuration Configuration_create (long numberOfPoints, long numberOfDimensions);
+autoConfiguration Configuration_create (long numberOfPoints, long numberOfDimensions);
 
 void Configuration_setMetric (Configuration me, long metric);
 
@@ -64,7 +64,7 @@ void Configuration_invertDimension (Configuration me, int dimension);
 			my data[i][dimension] = - my data[i][dimension];
 */
 
-Configuration Configuration_congruenceRotation (Configuration me, Configuration thee,
+autoConfiguration Configuration_congruenceRotation (Configuration me, Configuration thee,
 	long maximumNumberOfIterations, double tolerance);
 /*
 	Rotate thee for maximum congruence. Algorithm:
@@ -72,8 +72,7 @@ Configuration Configuration_congruenceRotation (Configuration me, Configuration
 		orthogonal congruence rotation", Psychometrika 61, 375-389.
 */
 
-Configuration Configuration_varimax (Configuration me, int normalizeRows,
-	int quartimax, long maximumNumberOfIterations, double tolerance);
+autoConfiguration Configuration_varimax (Configuration me, int normalizeRows, int quartimax, long maximumNumberOfIterations, double tolerance);
 /*
 	Perform varimax rotation. Algorithm with extra security from:
 	Jos Ten Berge (1995), "Suppressing permutations or rigid planar rotations:
@@ -84,16 +83,15 @@ void Configuration_rotateToPrincipalDirections (Configuration me);
 
 void Configuration_draw (Configuration me, Graphics g, int xCoordinate,
 	int yCoordinate, double xmin, double xmax, double ymin, double ymax,
-	int labelSize, int useRowLabels, const wchar_t *label, int garnish);
+	int labelSize, int useRowLabels, const char32 *label, int garnish);
 
 void Configuration_drawConcentrationEllipses (Configuration me, Graphics g,
-	double scale, int confidence, const wchar_t *label, long d1, long d2, double xmin, double xmax,
+	double scale, int confidence, const char32 *label, long d1, long d2, double xmin, double xmax,
 	double ymin, double ymax, int fontSize, int garnish);
 
-Configuration TableOfReal_to_Configuration (I);
+autoConfiguration TableOfReal_to_Configuration (TableOfReal me);
 
-Configuration TableOfReal_to_Configuration_pca (TableOfReal me,
-	long numberOfDimensions);
+autoConfiguration TableOfReal_to_Configuration_pca (TableOfReal me, long numberOfDimensions);
 /*
 	Precondition:
 		numberOfDimensions > 0
@@ -103,14 +101,14 @@ Configuration TableOfReal_to_Configuration_pca (TableOfReal me,
 		(Configuration) numberOfColumns = MIN (my numberOfColumns, numberOfDimensions)
 */
 
-Configuration Configuration_createLetterRExample (int choice);
+autoConfiguration Configuration_createLetterRExample (int choice);
 /*
   	Create a two-dimensional configuartion from the letter R.
   	choice = 1 : undistorted;
   	choice = 2 : result of monotone fit on distorted (d^2 + 5 +32.5*z)
 */
 
-Configuration Configuration_createCarrollWishExample ();
+autoConfiguration Configuration_createCarrollWishExample ();
 
 
 /************************** class Configurations **************************************/
@@ -118,6 +116,6 @@ Configuration Configuration_createCarrollWishExample ();
 Thing_define (Configurations, Ordered) {
 };
 
-Configurations Configurations_create ();
+autoConfigurations Configurations_create ();
 
 #endif /* _Configuration_h_ */
diff --git a/dwtools/Configuration_AffineTransform.cpp b/dwtools/Configuration_AffineTransform.cpp
index 7b5c96c..fa4e016 100644
--- a/dwtools/Configuration_AffineTransform.cpp
+++ b/dwtools/Configuration_AffineTransform.cpp
@@ -1,6 +1,6 @@
 /* Configuration_AffineTransform.cpp
  *
- * Copyright (C) 1993-2012 David Weenink
+ * Copyright (C) 1993-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,11 +33,11 @@ static void do_steps45 (double **w, double **t, double **c, long n, double *f) {
 	// Step 4 || 10: If W'T has negative diagonal elements, multiply corresponding columns in T by -1.
 
 	for (long i = 1; i <= n; i++) {
-		double d = 0;
+		double d = 0.0;
 		for (long k = 1; k <= n; k++) {
 			d += w[k][i] * t[k][i];
 		}
-		if (d < 0) {
+		if (d < 0.0) {
 			for (long k = 1; k <= n; k++) {
 				t[k][i] = -t[k][i];
 			}
@@ -46,23 +46,22 @@ static void do_steps45 (double **w, double **t, double **c, long n, double *f) {
 
 	// Step 5 & 11: f = tr W'T (Diag (T'CT))^-1/2
 
-	*f = 0;
+	*f = 0.0;
 	for (long i = 1; i <= n; i++) {
-		double d = 0, tct = 0;
+		double d = 0.0, tct = 0.0;
 		for (long k = 1; k <= n; k++) {
 			d += w[k][i] * t[k][i];
 			for (long j = 1; j <= n; j++) {
 				tct += t[k][i] * c[k][j] * t[j][i];
 			}
 		}
-		if (tct > 0) {
+		if (tct > 0.0) {
 			*f += d / sqrt (tct);
 		}
 	}
 }
 
-static void NUMmaximizeCongruence (double **b, double **a, long nr, long nc,
-                                   double **t, long maximumNumberOfIterations, double tolerance) {
+static void NUMmaximizeCongruence (double **b, double **a, long nr, long nc, double **t, long maximumNumberOfIterations, double tolerance) {
 	long numberOfIterations = 0;
 	Melder_assert (nr > 0 && nc > 0);
 	Melder_assert (t);
@@ -89,19 +88,19 @@ static void NUMmaximizeCongruence (double **b, double **a, long nr, long nc,
 		}
 	}
 
-	if (checkc == 0 || checkw == 0) {
-		Melder_throw ("NUMmaximizeCongruence: we cannot rotate a zero matrix.");
+	if (checkc == 0.0 || checkw == 0.0) {
+		Melder_throw (U"NUMmaximizeCongruence: we cannot rotate a zero matrix.");
 	}
 
 	// Scale W by (diag(B'B))^-1/2
 
 	for (long j = 1; j <= nc; j++) {
-		double scale = 0;
+		double scale = 0.0;
 		for (long k = 1; k <= nr; k++) {
 			scale += b[k][j] * b[k][j];
 		}
-		if (scale > 0) {
-			scale = 1 / sqrt (scale);
+		if (scale > 0.0) {
+			scale = 1.0 / sqrt (scale);
 		}
 		for (long i = 1; i <= nc; i++) {
 			w[i][j] *= scale;
@@ -110,7 +109,7 @@ static void NUMmaximizeCongruence (double **b, double **a, long nr, long nc,
 
 	// Step 3: largest eigenvalue of C
 
-	evec[1] = 1;
+	evec[1] = 1.0;
 	double rho, f, f_old;
 	NUMdominantEigenvector (c.peek(), nc, evec.peek(), &rho, 1.0e-6);
 
@@ -119,7 +118,7 @@ static void NUMmaximizeCongruence (double **b, double **a, long nr, long nc,
 		for (long j = 1; j <= nc; j++) {
 			// Step 7.a
 
-			double p = 0;
+			double p = 0.0;
 			for (long k = 1; k <= nc; k++) {
 				for (long i = 1; i <= nc; i++) {
 					p += t[k][j] * c[k][i] * t[i][j];
@@ -128,28 +127,28 @@ static void NUMmaximizeCongruence (double **b, double **a, long nr, long nc,
 
 			// Step 7.b
 
-			double q = 0;
+			double q = 0.0;
 			for (long k = 1; k <= nc; k++) {
 				q += w[k][j] * t[k][j];
 			}
 
 			// Step 7.c
 
-			if (q == 0) {
+			if (q == 0.0) {
 				for (long i = 1; i <= nc; i++) {
-					u[i][j] = 0;
+					u[i][j] = 0.0;
 				}
 			} else {
-				double ww = 0;
+				double ww = 0.0;
 				for (long k = 1; k <= nc; k++) {
 					ww += w[k][j] * w[k][j];
 				}
 				for (long i = 1; i <= nc; i++) {
-					double ct = 0;
+					double ct = 0.0;
 					for (long k = 1; k <= nc; k++) {
 						ct += c[i][k] * t[k][j];
 					}
-					u[i][j] = (q * (ct - rho * t[i][j]) / p - 2 * ww * t[i][j] / q - w[i][j]) / sqrt (p);
+					u[i][j] = (q * (ct - rho * t[i][j]) / p - 2.0 * ww * t[i][j] / q - w[i][j]) / sqrt (p);
 				}
 			}
 		}
@@ -162,7 +161,7 @@ static void NUMmaximizeCongruence (double **b, double **a, long nr, long nc,
 
 		for (long i = 1; i <= nc; i++) {
 			for (long j = 1; j <= nc; j++) {
-				t[i][j] = 0;
+				t[i][j] = 0.0;
 				for (long  k = 1; k <= nc; k++) {
 					t[i][j] -= svd -> u[i][k] * svd -> v[j][k];
 				}
@@ -179,29 +178,25 @@ static void NUMmaximizeCongruence (double **b, double **a, long nr, long nc,
 	} while (fabs (f_old - f) / f_old > tolerance && numberOfIterations < maximumNumberOfIterations);
 }
 
-AffineTransform Configurations_to_AffineTransform_congruence (Configuration me,
-        Configuration thee, long maximumNumberOfIterations, double tolerance) {
+AffineTransform Configurations_to_AffineTransform_congruence (Configuration me, Configuration thee, long maximumNumberOfIterations, double tolerance) {
 	try {
 		// Use Procrustes transform to obtain starting configuration.
 		// (We only need the transformation matrix T.)
 		autoProcrustes p = Configurations_to_Procrustes (me, thee, 0);
-		NUMmaximizeCongruence (my data, thy data, my numberOfRows,
-		                       p -> n, p -> r, maximumNumberOfIterations, tolerance);
+		NUMmaximizeCongruence (my data, thy data, my numberOfRows, p -> n, p -> r, maximumNumberOfIterations, tolerance);
 
 		autoAffineTransform at = AffineTransform_create (p -> n);
 		NUMmatrix_copyElements (p -> r, at -> r, 1, p -> n, 1, p -> n);
 		return at.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no congruence transformation created.");
+		Melder_throw (me, U": no congruence transformation created.");
 	}
 }
 
-Configuration Configuration_and_AffineTransform_to_Configuration (Configuration me, thou) {
+Configuration Configuration_and_AffineTransform_to_Configuration (Configuration me, AffineTransform thee) {
 	try {
-		thouart (AffineTransform);
-
 		if (my numberOfColumns != thy n) {
-			Melder_throw ("Dimensions do not agree.");
+			Melder_throw (U"Dimensions do not agree.");
 		}
 		autoConfiguration him = (Configuration) Data_copy (me);
 
@@ -210,7 +205,7 @@ Configuration Configuration_and_AffineTransform_to_Configuration (Configuration
 		thy v_transform (my data, my numberOfRows, his data);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Configuration not created.");
+		Melder_throw (U"Configuration not created.");
 	}
 }
 
diff --git a/dwtools/Configuration_AffineTransform.h b/dwtools/Configuration_AffineTransform.h
index f620581..144d8fa 100644
--- a/dwtools/Configuration_AffineTransform.h
+++ b/dwtools/Configuration_AffineTransform.h
@@ -2,7 +2,7 @@
 #define _Configuration_AffineTransform_h_
 /* Configuration_AffineTransform.c
  * 
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,26 +24,11 @@
  djmw 20110307 Latest modification
  */
 
-#ifndef _Configuration_h_
-	#include "Configuration.h"
-#endif
-#ifndef _AffineTransform_h_
-	#include "AffineTransform.h"
-#endif
+#include "Configuration.h"
+#include "AffineTransform.h"
 
+AffineTransform Configurations_to_AffineTransform_congruence (Configuration me,	Configuration thee, long maximumNumberOfIterations, double tolerance);
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-AffineTransform Configurations_to_AffineTransform_congruence (Configuration me,
-	Configuration thee, long maximumNumberOfIterations, double tolerance);
-
-Configuration Configuration_and_AffineTransform_to_Configuration 
-	(Configuration me, thou);
-
-#ifdef __cplusplus
-	}
-#endif
+Configuration Configuration_and_AffineTransform_to_Configuration (Configuration me, AffineTransform thee);
 
 #endif /* _Configuration_AffineTransform_h_ */
diff --git a/dwtools/Configuration_and_Procrustes.cpp b/dwtools/Configuration_and_Procrustes.cpp
index fb4ceb3..161f503 100644
--- a/dwtools/Configuration_and_Procrustes.cpp
+++ b/dwtools/Configuration_and_Procrustes.cpp
@@ -29,7 +29,7 @@
 Procrustes Configurations_to_Procrustes (Configuration me, Configuration thee, int orthogonal) {
 	try {
 		if (my numberOfRows != thy numberOfRows || my numberOfColumns != thy numberOfColumns) {
-			Melder_throw ("Configurations must have the same number of points and the same dimension.");
+			Melder_throw (U"Configurations must have the same number of points and the same dimension.");
 		}
 
 		autoProcrustes p = Procrustes_create (my numberOfColumns);
@@ -41,7 +41,7 @@ Procrustes Configurations_to_Procrustes (Configuration me, Configuration thee, i
 		NUMProcrustes (my data, thy data, my numberOfRows, my numberOfColumns, p -> r, translation, scale);
 		return p.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Procrustes from two Configurations not created.");
+		Melder_throw (U"Procrustes from two Configurations not created.");
 	}
 }
 
diff --git a/dwtools/Configuration_and_Procrustes.h b/dwtools/Configuration_and_Procrustes.h
index f725179..5cb6a0b 100644
--- a/dwtools/Configuration_and_Procrustes.h
+++ b/dwtools/Configuration_and_Procrustes.h
@@ -31,14 +31,6 @@
 	#include "Procrustes.h"
 #endif
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 Procrustes Configurations_to_Procrustes (Configuration me, Configuration thee, int orthogonal);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Configuration_and_Procrustes_h_ */
diff --git a/dwtools/Configuration_def.h b/dwtools/Configuration_def.h
index eeedab8..93bf3e5 100644
--- a/dwtools/Configuration_def.h
+++ b/dwtools/Configuration_def.h
@@ -25,8 +25,8 @@ oo_DEFINE_CLASS (Configuration, TableOfReal)
 	oo_DOUBLE_VECTOR (w, numberOfColumns)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (Configuration)	
diff --git a/dwtools/Confusion.cpp b/dwtools/Confusion.cpp
index 1cfeab9..70bc49c 100644
--- a/dwtools/Confusion.cpp
+++ b/dwtools/Confusion.cpp
@@ -1,6 +1,6 @@
 /* Confusion.cpp
  *
- * Copyright (C) 1993-2011, 2014 David Weenink
+ * Copyright (C) 1993-2011, 2014, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -41,83 +41,81 @@ void structConfusion :: v_info () {
 	double h, hx, hy, hygx, hxgy, uygx, uxgy, uxy, frac;
 	long nCorrect;
 
-	Confusion_getEntropies (this, & h, & hx, & hy, & hygx, & hxgy, & uygx,
-	                        & uxgy, & uxy);
+	Confusion_getEntropies (this, & h, & hx, & hy, & hygx, & hxgy, & uygx, & uxgy, & uxy);
 	Confusion_getFractionCorrect (this, & frac, & nCorrect);
-	MelderInfo_writeLine (L"Number of rows: ", Melder_integer (numberOfRows));
-	MelderInfo_writeLine (L"Number of colums: ", Melder_integer (numberOfColumns));
-	MelderInfo_writeLine (L"Entropies (y is row variable):");
-	MelderInfo_writeLine (L"  Total: ", Melder_double (h));
-	MelderInfo_writeLine (L"  Y: ", Melder_double (hy));
-	MelderInfo_writeLine (L"  X: ", Melder_double (hx));
-	MelderInfo_writeLine (L"  Y given x: ", Melder_double (hygx));
-	MelderInfo_writeLine (L"  X given y: ", Melder_double (hxgy));
-	MelderInfo_writeLine (L"  Dependency of y on x; ", Melder_double (uygx));
-	MelderInfo_writeLine (L"  Dependency of x on y: ", Melder_double (uxgy));
-	MelderInfo_writeLine (L"  Symmetrical dependency: ", Melder_double (uxy));
-	MelderInfo_writeLine (L"  Total number of entries: ",
-	                       Melder_integer (Confusion_getNumberOfEntries (this)));
-	MelderInfo_writeLine (L" Fraction correct: ", Melder_double (frac));
+	MelderInfo_writeLine (U"Number of rows: ", numberOfRows);
+	MelderInfo_writeLine (U"Number of colums: ", numberOfColumns);
+	MelderInfo_writeLine (U"Entropies (y is row variable):");
+	MelderInfo_writeLine (U"  Total: ", h);
+	MelderInfo_writeLine (U"  Y: ", hy);
+	MelderInfo_writeLine (U"  X: ", hx);
+	MelderInfo_writeLine (U"  Y given x: ", hygx);
+	MelderInfo_writeLine (U"  X given y: ", hxgy);
+	MelderInfo_writeLine (U"  Dependency of y on x; ", uygx);
+	MelderInfo_writeLine (U"  Dependency of x on y: ", uxgy);
+	MelderInfo_writeLine (U"  Symmetrical dependency: ", uxy);
+	MelderInfo_writeLine (U"  Total number of entries: ", Confusion_getNumberOfEntries (this));
+	MelderInfo_writeLine (U" Fraction correct: ", frac);
 }
 
-Confusion Confusion_createFromStringses (Strings me, Strings thee) {
+autoConfusion Confusion_createFromStringses (Strings me, Strings thee) {
 	try {
 		if (my numberOfStrings < 1 || thy numberOfStrings < 1) {
-			Melder_throw ("Empty Strings.");
+			Melder_throw (U"Empty Strings.");
 		}
 		autoConfusion him = Confusion_create (my numberOfStrings, thy numberOfStrings);
 		for (long irow = 1; irow <= my numberOfStrings; irow++) {
-			const wchar_t *label = my strings[irow];
+			const char32 *label = my strings[irow];
 			TableOfReal_setRowLabel (him.peek(), irow, label);
 		}
 		for (long icol = 1; icol <= thy numberOfStrings; icol++) {
-			const wchar_t *label = thy strings[icol];
+			const char32 *label = thy strings[icol];
 			TableOfReal_setColumnLabel (him.peek(), icol, label);
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": could not create Confusion with ", thee);
+		Melder_throw (me, U": could not create Confusion with ", thee);
 	}
 }
 
-Confusion Confusion_create (long numberOfStimuli, long numberOfResponses) {
+autoConfusion Confusion_create (long numberOfStimuli, long numberOfResponses) {
 	try {
 		autoConfusion me = Thing_new (Confusion);
 		TableOfReal_init (me.peek(), numberOfStimuli, numberOfResponses);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Confusion not created.");
+		Melder_throw (U"Confusion not created.");
 	}
 }
 
-Confusion Confusion_createSimple (const wchar_t *labels) {
+autoConfusion Confusion_createSimple (const char32 *labels) {
 	try {
 		long numberOfLabels = Melder_countTokens (labels);
 		if (numberOfLabels < 1) {
-			Melder_throw ("Not enough labels.");
+			Melder_throw (U"Not enough labels.");
 		}
 		autoConfusion me = Confusion_create (numberOfLabels, numberOfLabels);
 		long ilabel = 1;
-		for (wchar_t *token = Melder_firstToken (labels); token != 0; token = Melder_nextToken ()) {
+		for (char32 *token = Melder_firstToken (labels); token != 0; token = Melder_nextToken ()) {
 			for (long i = 1; i <= ilabel - 1; i++) {
-				if (Melder_wcscmp (token, my rowLabels[i]) == 0) {
-					Melder_throw ("Label ", i, "and ", ilabel, "may not be equal.");
+				if (Melder_cmp (token, my rowLabels[i]) == 0) {
+					Melder_throw (U"Label ", i, U"and ", ilabel, U"may not be equal.");
 				}
 			}
 			TableOfReal_setRowLabel (me.peek(), ilabel, token);
 			TableOfReal_setColumnLabel (me.peek(), ilabel, token);
 			ilabel++;
 		}
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Simple Confusion not created.");
+		Melder_throw (U"Simple Confusion not created.");
 	}
 }
 
-Confusion Categories_to_Confusion (Categories me, Categories thee) {
+autoConfusion Categories_to_Confusion (Categories me, Categories thee) {
 	try {
 		if (my size != thy size) {
-			Melder_throw ("Categories_to_Confusion: dimensions do not agree.");
+			Melder_throw (U"Categories_to_Confusion: dimensions do not agree.");
 		}
 
 		autoCategories ul1 = Categories_selectUniqueItems (me, 1);
@@ -136,17 +134,16 @@ Confusion Categories_to_Confusion (Categories me, Categories thee) {
 			SimpleString myi = (SimpleString) my item[i], thyi = (SimpleString) thy item[i];
 			Confusion_increase (him.peek(), SimpleString_c (myi), SimpleString_c (thyi));
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Confusion created.");
+		Melder_throw (me, U": no Confusion created.");
 	}
 }
 
 #define TINY 1.0e-30
 
-void Confusion_getEntropies (Confusion me, double *h, double *hx, double *hy,
-                             double *hygx, double *hxgy, double *uygx, double *uxgy, double *uxy) {
-	*h = *hx = *hy = *hxgy = *hygx = *uygx = *uxgy = *uxy = 0;
+void Confusion_getEntropies (Confusion me, double *h, double *hx, double *hy, double *hygx, double *hxgy, double *uygx, double *uxgy, double *uxy) {
+	*h = *hx = *hy = *hxgy = *hygx = *uygx = *uxgy = *uxy = 0.0;
 
 	autoNUMvector<double> rowSum (1, my numberOfRows);
 	autoNUMvector<double> colSum (1, my numberOfColumns);
@@ -160,18 +157,18 @@ void Confusion_getEntropies (Confusion me, double *h, double *hx, double *hy,
 		}
 	}
 	for (long i = 1; i <= my numberOfRows; i++) {
-		if (rowSum[i] > 0) {
+		if (rowSum[i] > 0.0) {
 			*hy -= rowSum[i] / sum * NUMlog2 (rowSum[i] / sum);
 		}
 	}
 	for (long j = 1; j <= my numberOfColumns; j++) {
-		if (colSum[j] > 0) {
+		if (colSum[j] > 0.0) {
 			*hx -= colSum[j] / sum * NUMlog2 (colSum[j] / sum);
 		}
 	}
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			if (my data[i][j] > 0) {
+			if (my data[i][j] > 0.0) {
 				*h -= my data[i][j] / sum * NUMlog2 (my data[i][j] / sum);
 			}
 		}
@@ -184,31 +181,31 @@ void Confusion_getEntropies (Confusion me, double *h, double *hx, double *hy,
 	*uxy = 2.0 * (*hx + *hy - *h) / (*hx + *hy + TINY);
 }
 
-void Confusion_increase (Confusion me, const wchar_t *stim, const wchar_t *resp) {
+void Confusion_increase (Confusion me, const char32 *stim, const char32 *resp) {
 	try {
 		long stimIndex = TableOfReal_rowLabelToIndex (me, stim);
 		if (stimIndex < 1) {
-			Melder_throw ("Stimulus not valid.");
+			Melder_throw (U"Stimulus not valid.");
 		}
 		long respIndex = TableOfReal_columnLabelToIndex (me, resp);
 		if (respIndex < 1) {
-			Melder_throw ("Response not valid.");
+			Melder_throw (U"Response not valid.");
 		}
 
-		my data[stimIndex][respIndex] += 1;
+		my data[stimIndex][respIndex] += 1.0;
 	} catch (MelderError) {
-		Melder_throw (me, ": not increased.");
+		Melder_throw (me, U": not increased.");
 	}
 }
 
-double Confusion_getValue (Confusion me, const wchar_t *stim, const wchar_t *resp) {
+double Confusion_getValue (Confusion me, const char32 *stim, const char32 *resp) {
 	long stimIndex = TableOfReal_rowLabelToIndex (me, stim);
 	if (stimIndex < 1) {
-		Melder_throw ("Stimulus not valid.");
+		Melder_throw (U"Stimulus not valid.");
 	}
 	long respIndex = TableOfReal_columnLabelToIndex (me, resp);
 	if (respIndex < 1) {
-		Melder_throw ("Response not valid.");
+		Melder_throw (U"Response not valid.");
 	}
 	return my data[stimIndex][respIndex];
 }
@@ -217,57 +214,55 @@ void Confusion_getFractionCorrect (Confusion me, double *fraction, long *numberO
 	*fraction = NUMundefined;
 	*numberOfCorrect = -1;
 
-	double c = 0, ct = 0;
+	double c = 0.0, ct = 0.0;
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			if (my rowLabels[i] == 0 || my columnLabels[j] == 0) {
+			if (! my rowLabels[i] || ! my columnLabels[j]) {
 				return;
 			}
 			ct += my data[i][j];
-			if (wcscmp (my rowLabels[i], my columnLabels[j]) == 0) {
+			if (str32cmp (my rowLabels[i], my columnLabels[j]) == 0) {
 				c += my data[i][j];
 			}
 		}
 	}
 
-	if (ct != 0) {
+	if (ct != 0.0) {
 		*fraction = c / ct;
 	}
-	*numberOfCorrect = c;
+	*numberOfCorrect = (long) floor (c);
 }
 
 /*************** Confusion_Matrix_draw ****************************************/
 
 #define NPOINTS 6
 
-static Polygon Polygon_createPointer () {
+static autoPolygon Polygon_createPointer () {
 	try {
-		double x[NPOINTS + 1] = { 0, 0, 0.9, 1, 0.9, 0, 0 };
-		double y[NPOINTS + 1] = { 0, 0, 0, 0.5,   1, 1, 0 };
+		double x[NPOINTS + 1] = { 0.0, 0.0, 0.9, 1.0, 0.9, 0.0, 0.0 };
+		double y[NPOINTS + 1] = { 0.0, 0.0, 0.0, 0.5, 1.0, 1.0, 0.0 };
 		autoPolygon me = Polygon_create (NPOINTS);
 		for (long i = 1; i <= NPOINTS; i++) {
 			my x[i] = x[i]; my y[i] = y[i];
 		}
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Polygon not created.");
+		Melder_throw (U"Polygon not created.");
 	}
 }
 
-static void Polygon_drawInside (I, Graphics g) {
-	iam (Polygon);
+static void Polygon_drawInside (Polygon me, Graphics g) {
 	Graphics_polyline (g, my numberOfPoints, & my x[1], & my y[1]);
 }
 
-void Confusion_Matrix_draw (Confusion me, Matrix thee, Graphics g, long index, double lowerPercentage,
-                            double xmin, double xmax, double ymin, double ymax, int garnish) {
+void Confusion_Matrix_draw (Confusion me, Matrix thee, Graphics g, long index, double lowerPercentage, double xmin, double xmax, double ymin, double ymax, int garnish) {
 	long ib = 1, ie = my numberOfRows;
 	if (index > 0 && index <= my numberOfColumns) {
 		ib = ie = index;
 	}
 
 	if (thy ny != my numberOfRows) {
-		Melder_throw ("Wrong number of positions.");
+		Melder_throw (U"Wrong number of positions.");
 	}
 
 	if (xmax <= xmin) {
@@ -285,7 +280,7 @@ void Confusion_Matrix_draw (Confusion me, Matrix thee, Graphics g, long index, d
 	if (ymax <= ymin) {
 		return;
 	}
-	double rmax = fabs (xmax - xmin) / 10;
+	double rmax = fabs (xmax - xmin) / 10.0;
 	double rmin = rmax / 10;
 
 	Graphics_setInner (g);
@@ -295,12 +290,12 @@ void Confusion_Matrix_draw (Confusion me, Matrix thee, Graphics g, long index, d
 		Graphics_text (g, thy z[i][1], thy z[i][2], my rowLabels[i]);
 	}
 	for (long i = ib; i <= ie; i++) {
-		double xSum = 0;
+		double xSum = 0.0;
 		for (long j = 1; j <= my numberOfColumns; j++) {
 			xSum += my data[i][j];
 		}
 
-		if (xSum <= 0) {
+		if (xSum <= 0.0) {
 			continue;    /* no confusions */
 		}
 
@@ -312,11 +307,11 @@ void Confusion_Matrix_draw (Confusion me, Matrix thee, Graphics g, long index, d
 
 		for (long j = 1; j <= my numberOfColumns; j++) {
 			double x2 = thy z[j][1], y2 = thy z[j][2];
-			double perc =  100 * my data[i][j] / xSum;
+			double perc =  100.0 * my data[i][j] / xSum;
 			double dx = x2 - x1, dy = y2 - y1;
 			double alpha = atan2 (dy, dx);
 
-			if (perc == 0 || perc < lowerPercentage || j == i) {
+			if (perc == 0.0 || perc < lowerPercentage || j == i) {
 				continue;
 			}
 
@@ -330,10 +325,10 @@ void Confusion_Matrix_draw (Confusion me, Matrix thee, Graphics g, long index, d
 			}
 			autoPolygon p = Polygon_createPointer();
 			double xs = sqrt (dx * dx + dy * dy) - 2.2 * r;
-			if (xs < 0) {
-				xs = 0;
+			if (xs < 0.0) {
+				xs = 0.0;
 			}
-			double ys = perc * rmax / 100;
+			double ys = perc * rmax / 100.0;
 			Polygon_scale (p.peek(), xs, ys);
 			Polygon_translate (p.peek(), x1, y1 - ys / 2);
 			Polygon_rotate (p.peek(), alpha, x1, y1);
@@ -346,52 +341,52 @@ void Confusion_Matrix_draw (Confusion me, Matrix thee, Graphics g, long index, d
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
 		if (ymin * ymax < 0.0) {
-			Graphics_markLeft (g, 0.0, 1, 1, 1, NULL);
+			Graphics_markLeft (g, 0.0, true, true, true, nullptr);
 		}
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksLeft (g, 2, true, true, false);
 		if (xmin * xmax < 0.0) {
-			Graphics_markBottom (g, 0.0, 1, 1, 1, NULL);
+			Graphics_markBottom (g, 0.0, true, true, true, nullptr);
 		}
 	}
 }
 
-Matrix Confusion_difference (Confusion me, Confusion thee) {
+autoMatrix Confusion_difference (Confusion me, Confusion thee) {
 	try {
 		/* categories must be the same too*/
-		if (my numberOfColumns != thy numberOfColumns || my numberOfRows != thy numberOfRows) Melder_throw
-			("Dimensions not equal.");
+		if (my numberOfColumns != thy numberOfColumns || my numberOfRows != thy numberOfRows) {
+			Melder_throw (U"Dimensions not equal.");
+		}
 
-		autoMatrix him = Matrix_create (0.5, my numberOfColumns + 0.5, my numberOfColumns,
-		                                1, 1, 0.5, my numberOfRows + 0.5, my numberOfRows, 1, 1);
+		autoMatrix him = Matrix_create (0.5, my numberOfColumns + 0.5, my numberOfColumns, 1.0, 1.0, 0.5, my numberOfRows + 0.5, my numberOfRows, 1.0, 1.0);
 
 		for (long i = 1; i <= my numberOfRows; i++) {
 			for (long j = 1; j <= my numberOfColumns; j++) {
 				his z[i][j] = my data[i][j] - thy data[i][j];
 			}
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("Matrix not created from two Confusions.");
+		Melder_throw (U"Matrix not created from two Confusions.");
 	}
 }
 
 long Confusion_getNumberOfEntries (Confusion me) {
-	double total = 0;
+	double total = 0.0;
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
 			total += my data[i][j];
 		}
 	}
-	return total;
+	return (long) floor (total);
 }
 
-static void create_index (wchar_t **s, long sb, long se, wchar_t **ref, long rb, long re, long *index) {
+static void create_index (char32 **s, long sb, long se, char32 **ref, long rb, long re, long *index) {
 	for (long i = sb; i <= se; i++) {
 		long indxj = 0;
 		for (long j = rb; j <= re; j++) {
-			if (wcsequ (s[i], ref[j])) {
+			if (str32equ (s[i], ref[j])) {
 				indxj = j; break;
 			}
 		}
@@ -399,18 +394,18 @@ static void create_index (wchar_t **s, long sb, long se, wchar_t **ref, long rb,
 	}
 }
 
-Confusion Confusion_condense (Confusion me, const wchar_t *search, const wchar_t *replace,
+autoConfusion Confusion_condense (Confusion me, const char32 *search, const char32 *replace,
 	long maximumNumberOfReplaces, int use_regexp) {
 	try {
 		long nmatches, nstringmatches;
 
 		if (my rowLabels == 0 || my columnLabels == 0) {
-			Melder_throw ("No row or column labels.");
+			Melder_throw (U"No row or column labels.");
 		}
-		autostringvector rowLabels (strs_replace (my rowLabels, 1, my numberOfRows, search, replace,
+		autostring32vector rowLabels (strs_replace (my rowLabels, 1, my numberOfRows, search, replace,
 			maximumNumberOfReplaces, &nmatches, &nstringmatches, use_regexp), 1, my numberOfRows);
 
-		autostringvector columnLabels (strs_replace (my columnLabels, 1, my numberOfColumns,  search, replace,
+		autostring32vector columnLabels (strs_replace (my columnLabels, 1, my numberOfColumns,  search, replace,
 			 maximumNumberOfReplaces, &nmatches, &nstringmatches, use_regexp), 1, my numberOfColumns);
 
 		autoStrings srow = Thing_new (Strings);
@@ -443,37 +438,36 @@ Confusion Confusion_condense (Confusion me, const wchar_t *search, const wchar_t
 				thy data [rowIndex [i]][columnIndex[j]] += my data[i][j];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not condensed.");
+		Melder_throw (me, U": not condensed.");
 	}
 }
 
-Confusion TableOfReal_to_Confusion (I) {
-	iam (TableOfReal);
+autoConfusion TableOfReal_to_Confusion (TableOfReal me) {
 	try {
 		if (! TableOfReal_checkPositive (me)) {
-			Melder_throw ("Elements may not be less than zero.");
+			Melder_throw (U"Elements may not be less than zero.");
 		}
 		autoConfusion thee = Thing_new (Confusion);
 		my structTableOfReal :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Confusion.");
+		Melder_throw (me, U": not converted to Confusion.");
 	}
 }
 
-Confusion Confusion_group (Confusion me, const wchar_t *labels, const wchar_t *newLabel, long newpos) {
+autoConfusion Confusion_group (Confusion me, const char32 *labels, const char32 *newLabel, long newpos) {
 	try {
 		autoConfusion stim = Confusion_groupStimuli (me, labels, newLabel, newpos);
 		autoConfusion thee = Confusion_groupResponses (stim.peek(), labels, newLabel, newpos);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not grouped.");
+		Melder_throw (me, U": not grouped.");
 	}
 }
 
-Confusion Confusion_groupStimuli (Confusion me, const wchar_t *labels, const wchar_t *newLabel, long newpos) {
+autoConfusion Confusion_groupStimuli (Confusion me, const char32 *labels, const char32 *newLabel, long newpos) {
 	try {
 		long ncondense = Melder_countTokens (labels);
 		autoNUMvector<long> irow (1, my numberOfRows);
@@ -482,9 +476,9 @@ Confusion Confusion_groupStimuli (Confusion me, const wchar_t *labels, const wch
 			irow[i] = i;
 		}
 
-		for (wchar_t *token = Melder_firstToken (labels); token != 0; token = Melder_nextToken ()) {
+		for (char32 *token = Melder_firstToken (labels); token != nullptr; token = Melder_nextToken ()) {
 			for (long i = 1; i <= my numberOfRows; i++) {
-				if (Melder_wcsequ (token, my rowLabels[i])) {
+				if (Melder_equ (token, my rowLabels[i])) {
 					irow[i] = 0;
 					break;
 				}
@@ -497,10 +491,10 @@ Confusion Confusion_groupStimuli (Confusion me, const wchar_t *labels, const wch
 			}
 		}
 		if (nfound == 0) {
-			Melder_throw ("Invalid stimulus labels.");
+			Melder_throw (U"Invalid stimulus labels.");
 		}
 		if (nfound != ncondense) {
-			Melder_warning (L"One or more of the given stimulus labels are suspect.");
+			Melder_warning (U"One or more of the given stimulus labels are suspect.");
 		}
 		long newnstim = my numberOfRows - nfound + 1;
 		if (newpos < 1) {
@@ -528,13 +522,13 @@ Confusion Confusion_groupStimuli (Confusion me, const wchar_t *labels, const wch
 				thy data[rowpos][j] += my data[i][j];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": stimuli not grouped.");
+		Melder_throw (me, U": stimuli not grouped.");
 	}
 }
 
-Confusion Confusion_groupResponses (Confusion me, const wchar_t *labels, const wchar_t *newLabel, long newpos) {
+autoConfusion Confusion_groupResponses (Confusion me, const char32 *labels, const char32 *newLabel, long newpos) {
 	try {
 		long ncondense = Melder_countTokens (labels);
 		autoNUMvector<long> icol (1, my numberOfColumns);
@@ -543,9 +537,9 @@ Confusion Confusion_groupResponses (Confusion me, const wchar_t *labels, const w
 			icol[i] = i;
 		}
 
-		for (wchar_t *token = Melder_firstToken (labels); token != 0; token = Melder_nextToken ()) {
+		for (char32 *token = Melder_firstToken (labels); token != 0; token = Melder_nextToken ()) {
 			for (long i = 1; i <= my numberOfColumns; i++) {
-				if (Melder_wcsequ (token, my columnLabels[i])) {
+				if (Melder_equ (token, my columnLabels[i])) {
 					icol[i] = 0;
 					break;
 				}
@@ -558,10 +552,10 @@ Confusion Confusion_groupResponses (Confusion me, const wchar_t *labels, const w
 			}
 		}
 		if (nfound == 0) {
-			Melder_throw ("Invalid response labels.");
+			Melder_throw (U"Invalid response labels.");
 		}
 		if (nfound != ncondense) {
-			Melder_warning (L"One or more of the given response labels are suspect.");
+			Melder_warning (U"One or more of the given response labels are suspect.");
 		}
 		long newnresp = my numberOfColumns - nfound + 1;
 		if (newpos < 1) {
@@ -588,20 +582,19 @@ Confusion Confusion_groupResponses (Confusion me, const wchar_t *labels, const w
 				thy data[j][colpos] += my data[j][i];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": responses not grouped.");
+		Melder_throw (me, U": responses not grouped.");
 	}
 }
 
-TableOfReal Confusion_to_TableOfReal_marginals (I) {
-	iam (Confusion);
+autoTableOfReal Confusion_to_TableOfReal_marginals (Confusion me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my numberOfRows + 1, my numberOfColumns + 1);
 
-		double total = 0;
+		double total = 0.0;
 		for (long i = 1; i <= my numberOfRows; i++) {
-			double rowsum = 0;
+			double rowsum = 0.0;
 			for (long j = 1; j <= my numberOfColumns; j++) {
 				thy data[i][j] = my data[i][j];
 				rowsum += my data[i][j];
@@ -622,18 +615,17 @@ TableOfReal Confusion_to_TableOfReal_marginals (I) {
 
 		NUMstrings_copyElements (my rowLabels, thy rowLabels, 1, my numberOfRows);
 		NUMstrings_copyElements (my columnLabels, thy columnLabels, 1, my numberOfColumns);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": table with marginals not created.");
+		Melder_throw (me, U": table with marginals not created.");
 	}
 }
 
-void Confusion_drawAsNumbers (I, Graphics g, int marginals, int iformat, int precision) {
-	iam (Confusion);
-	TableOfReal thee = (TableOfReal) me;
-	autoTableOfReal athee = 0;
+void Confusion_drawAsNumbers (Confusion me, Graphics g, int marginals, int iformat, int precision) {
+	TableOfReal thee = me;
+	autoTableOfReal athee;
 	if (marginals) {
-		athee.reset (Confusion_to_TableOfReal_marginals (me));
+		athee = Confusion_to_TableOfReal_marginals (me);
 		thee = athee.peek();
 	}
 	TableOfReal_drawAsNumbers (thee, g, 1, thy numberOfRows, iformat, precision);
diff --git a/dwtools/Confusion.h b/dwtools/Confusion.h
index 3068e57..58acc48 100644
--- a/dwtools/Confusion.h
+++ b/dwtools/Confusion.h
@@ -2,7 +2,7 @@
 #define _Confusion_h_
 /* Confusion.h
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,26 +25,26 @@
 #include "Matrix.h"
 
 Thing_define (Confusion, TableOfReal) {
-	// overridden methods:
-		virtual void v_info ();
+	void v_info ()
+		override;
 };
 
 /*
 	A Confusion matrix has both row and column labels.
 */
 
-Confusion Confusion_create (long numberOfStimuli, long numberOfResponses);
+autoConfusion Confusion_create (long numberOfStimuli, long numberOfResponses);
 
-Confusion Confusion_createSimple (const wchar *labels);
+autoConfusion Confusion_createSimple (const char32 *labels);
 
-Confusion Confusion_createFromStringses (Strings stimulusLabels, Strings responseLabels);
+autoConfusion Confusion_createFromStringses (Strings stimulusLabels, Strings responseLabels);
 
-Confusion Categories_to_Confusion (Categories me, Categories thee);
+autoConfusion Categories_to_Confusion (Categories me, Categories thee);
 
-void Confusion_increase (Confusion me, const wchar_t *stimulus, const wchar_t *response);
+void Confusion_increase (Confusion me, const char32 *stimulus, const char32 *response);
 /* data['stim']['resp'] += 1; */
 
-double Confusion_getValue (Confusion me, const wchar_t *stim, const wchar_t *resp);
+double Confusion_getValue (Confusion me, const char32 *stim, const char32 *resp);
 /* data['stim']['resp'] ; */
 
 void Confusion_getEntropies (Confusion me, double *h, double *hx, double *hy,
@@ -79,30 +79,31 @@ void Confusion_Matrix_draw (Confusion me, Matrix thee, Graphics g,
  *	}
  */
 
-Matrix Confusion_difference (Confusion me, Confusion thee);
+autoMatrix Confusion_difference (Confusion me, Confusion thee);
 /* return matrix with the difference between the two confusion matrices */
 
 long Confusion_getNumberOfEntries (Confusion me);
 
-Confusion Confusion_groupStimuli (Confusion me, const wchar_t *labels, const wchar_t *newLabel, long newpos);
-Confusion Confusion_groupResponses (Confusion me, const wchar_t *labels, const wchar_t *newLabel, long newpos);
-Confusion Confusion_group (Confusion me, const wchar_t *labels, const wchar_t *newLabel, long newpos);
+autoConfusion Confusion_groupStimuli (Confusion me, const char32 *labels, const char32 *newLabel, long newpos);
 
-Confusion Confusion_condense (Confusion me, const wchar_t *search, const wchar_t *replace,
-	long maximumNumberOfReplaces, int use_regexp);
-/*
+autoConfusion Confusion_groupResponses (Confusion me, const char32 *labels, const char32 *newLabel, long newpos);
+
+autoConfusion Confusion_group (Confusion me, const char32 *labels, const char32 *newLabel, long newpos);
+
+autoConfusion Confusion_condense (Confusion me, const char32 *search, const char32 *replace, long maximumNumberOfReplaces, int use_regexp);
+/* 
 	Group row and column labels according to search and replace.
 */
 
-Confusion TableOfReal_to_Confusion (I);
+autoConfusion TableOfReal_to_Confusion (TableOfReal me);
 
-TableOfReal Confusion_to_TableOfReal_marginals (I);
+autoTableOfReal Confusion_to_TableOfReal_marginals (Confusion me);
 /*
 	Create a table with one extra row and one extra column with marginals,
 	i.e., column and row sums.
 */
 
-void Confusion_drawAsNumbers (I, Graphics g, int marginals, int iformat, int precision);
+void Confusion_drawAsNumbers (Confusion me, Graphics g, int marginals, int iformat, int precision);
 // option marginals draw one extra row and column with sums.
 
 #endif /* _Confusion_h_ */
diff --git a/dwtools/ContingencyTable.cpp b/dwtools/ContingencyTable.cpp
index 26596c1..12ee9b3 100644
--- a/dwtools/ContingencyTable.cpp
+++ b/dwtools/ContingencyTable.cpp
@@ -1,6 +1,6 @@
 /* ContingencyTable.cpp
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,55 +26,54 @@ Thing_implement (ContingencyTable, TableOfReal, 0);
 #define TINY 1e-30
 
 void structContingencyTable :: v_info () {
-	structData :: v_info ();
+	structDaata :: v_info ();
 
-	long ndf;
+	double ndf;
 	double h, hx, hy, hygx, hxgy, uygx, uxgy, uxy, chisq;
 	ContingencyTable_entropies (this, &h, &hx, &hy, &hygx, &hxgy, &uygx, &uxgy, &uxy);
 	ContingencyTable_chisq (this, &chisq, &ndf);
 
-	Melder_information (L"Number of rows: ", Melder_integer (numberOfRows));
-	Melder_information (L"Number of columns: ", Melder_integer (numberOfColumns));
-	Melder_information (L"Entropies (y is row variable):");
-	Melder_information (L"  Total: ", Melder_double (h));
-	Melder_information (L"  Y: ", Melder_double (hy));
-	Melder_information (L"  X: ", Melder_double (hx));
-	Melder_information (L"  Y given x: ", Melder_double (hygx));
-	Melder_information (L"  X given y: ", Melder_double (hxgy));
-	Melder_information (L"  Dependency of y on x: ", Melder_double (uygx));
-	Melder_information (L"  Dependency of x on y: ", Melder_double (uxgy));
-	Melder_information (L"  Symmetrical dependency: ", Melder_double (uxy));
-	Melder_information (L"  Chi squared: ", Melder_double (chisq));
-	Melder_information (L"  Degrees of freedom: ", Melder_integer (ndf));
-	Melder_information (L"  Probability: ", Melder_double (ContingencyTable_chisqProbability (this)));
+	MelderInfo_writeLine (U"Number of rows: ", numberOfRows);
+	MelderInfo_writeLine (U"Number of columns: ", numberOfColumns);
+	MelderInfo_writeLine (U"Entropies (y is row variable):");
+	MelderInfo_writeLine (U"  Total: ", h);
+	MelderInfo_writeLine (U"  Y: ", hy);
+	MelderInfo_writeLine (U"  X: ", hx);
+	MelderInfo_writeLine (U"  Y given x: ", hygx);
+	MelderInfo_writeLine (U"  X given y: ", hxgy);
+	MelderInfo_writeLine (U"  Dependency of y on x: ", uygx);
+	MelderInfo_writeLine (U"  Dependency of x on y: ", uxgy);
+	MelderInfo_writeLine (U"  Symmetrical dependency: ", uxy);
+	MelderInfo_writeLine (U"  Chi squared: ", chisq);
+	MelderInfo_writeLine (U"  Degrees of freedom: ", ndf);
+	MelderInfo_writeLine (U"  Probability: ", ContingencyTable_chisqProbability (this));
 }
 
-ContingencyTable ContingencyTable_create (long numberOfRows, long numberOfColumns) {
+autoContingencyTable ContingencyTable_create (long numberOfRows, long numberOfColumns) {
 	try {
 		autoContingencyTable me = Thing_new (ContingencyTable);
 		TableOfReal_init (me.peek(), numberOfRows, numberOfColumns);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("ContingencyTable not created.");
+		Melder_throw (U"ContingencyTable not created.");
 	}
 }
 
 double ContingencyTable_chisqProbability (ContingencyTable me) {
-	double chisq;
-	long df;
+	double chisq, df;
 	ContingencyTable_chisq (me, &chisq, &df);
-	if (chisq == 0 && df == 0) {
-		return 0;
+	if (chisq == 0.0 && df == 0.0) {
+		return 0.0;
 	}
 	return NUMchiSquareQ (chisq, df);
 }
 
 double ContingencyTable_cramersStatistic (ContingencyTable me) {
-	double chisq, sum = 0;
-	long df, nr = my numberOfRows, nc = my numberOfColumns, nmin = nr;
+	double chisq, sum = 0.0, df;
+	long nr = my numberOfRows, nc = my numberOfColumns, nmin = nr;
 
 	if (nr == 1 || nc == 1) {
-		return 0;
+		return 0.0;
 	}
 
 	for (long i = 1; i <= nr; i++) {
@@ -89,15 +88,15 @@ double ContingencyTable_cramersStatistic (ContingencyTable me) {
 	nmin--;
 
 	ContingencyTable_chisq (me, &chisq, &df);
-	if (chisq == 0 && df == 0) {
-		return 0;
+	if (chisq == 0.0 && df == 0.0) {
+		return 0.0;
 	}
 	return sqrt (chisq / (sum * nmin));
 }
 
 double ContingencyTable_contingencyCoefficient (ContingencyTable me) {
-	double chisq, sum = 0;
-	long df, nr = my numberOfRows, nc = my numberOfColumns;
+	double chisq, sum = 0.0, df;
+	long nr = my numberOfRows, nc = my numberOfColumns;
 
 	for (long i = 1; i <= nr; i++) {
 		for (long j = 1; j <= nc; j++) {
@@ -106,25 +105,23 @@ double ContingencyTable_contingencyCoefficient (ContingencyTable me) {
 	}
 
 	ContingencyTable_chisq (me, &chisq, &df);
-	if (chisq == 0 && df == 0) {
-		return 0;
+	if (chisq == 0.0 && df == 0.0) {
+		return 0.0;
 	}
 	return sqrt (chisq / (chisq + sum));
 }
 
-void ContingencyTable_chisq (ContingencyTable me, double *chisq, long *df) {
+void ContingencyTable_chisq (ContingencyTable me, double *chisq, double *df) {
 	long nr = my numberOfRows, nc = my numberOfColumns;
 
-	*chisq = 0; *df = 0;
+	*chisq = 0.0; *df = 0.0;
 
 	autoNUMvector<double> rowsum (1, nr);
 	autoNUMvector<double> colsum (1, nc);
 
-	/*
-		row and column marginals
-	*/
+	// row and column marginals
 
-	double sum = 0;
+	double sum = 0.0;
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
 			rowsum[i] += my data[i][j];
@@ -134,23 +131,23 @@ void ContingencyTable_chisq (ContingencyTable me, double *chisq, long *df) {
 	}
 
 	for (long i = 1; i <= my numberOfRows; i++) {
-		if (rowsum[i] == 0) {
+		if (rowsum[i] == 0.0) {
 			--nr;
 		}
 	}
 	for (long j = 1; j <= my numberOfColumns; j++) {
-		if (colsum[j] == 0) {
+		if (colsum[j] == 0.0) {
 			--nc;
 		}
 	}
 
-	*df = (nr - 1) * (nc - 1);
+	*df = (nr - 1.0) * (nc - 1.0);
 	for (long i = 1; i <= my numberOfRows; i++) {
-		if (rowsum[i] == 0) {
+		if (rowsum[i] == 0.0) {
 			continue;
 		}
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			if (colsum[j] == 0) {
+			if (colsum[j] == 0.0) {
 				continue;
 			}
 			double expt = rowsum[i] * colsum[j] / sum;
@@ -160,16 +157,13 @@ void ContingencyTable_chisq (ContingencyTable me, double *chisq, long *df) {
 	}
 }
 
-void ContingencyTable_entropies (ContingencyTable me, double *h, double *hx, double *hy,
-                                 double *hygx, double *hxgy, double *uygx, double *uxgy, double *uxy) {
+void ContingencyTable_entropies (ContingencyTable me, double *h, double *hx, double *hy, double *hygx, double *hxgy, double *uygx, double *uxgy, double *uxy) {
 	*h = *hx = *hy = *hxgy = *hygx = *uygx = *uxgy = *uxy = 0;
 
 	autoNUMvector<double> rowsum (1, my numberOfRows);
 	autoNUMvector<double> colsum (1, my numberOfColumns);
 
-	/*
-		row and column totals
-	*/
+	// row and column totals
 
 	double sum = 0.0;
 	for (long i = 1; i <= my numberOfRows; i++) {
@@ -180,44 +174,36 @@ void ContingencyTable_entropies (ContingencyTable me, double *h, double *hx, dou
 		sum += rowsum[i];
 	}
 
-	/*
-		Entropy of x distribution
-	*/
+	// Entropy of x distribution
 
 	for (long j = 1; j <= my numberOfColumns; j++) {
-		if (colsum[j] > 0) {
+		if (colsum[j] > 0.0) {
 			double p = colsum[j] / sum;
 			*hx -= p * NUMlog2 (p);
 		}
 	}
 
-	/*
-		Entropy of y distribution
-	*/
+	// Entropy of y distribution
 
 	for (long i = 1; i <= my numberOfRows; i++) {
-		if (rowsum[i] > 0) {
+		if (rowsum[i] > 0.0) {
 			double p = rowsum[i] / sum;
 			*hy -= p * NUMlog2 (p);
 		}
 	}
 
-	/*
-		Total entropy
-	*/
+	// Total entropy
 
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			if (my data[i][j] > 0) {
+			if (my data[i][j] > 0.0) {
 				double p = my data[i][j] / sum;
 				*h -= p * NUMlog2 (p);
 			}
 		}
 	}
 
-	/*
-		Conditional entropies
-	*/
+	// Conditional entropies
 
 	*hygx = *h - *hx;
 	*hxgy = *h - *hy;
@@ -227,25 +213,24 @@ void ContingencyTable_entropies (ContingencyTable me, double *h, double *hx, dou
 }
 
 
-ContingencyTable Confusion_to_ContingencyTable (Confusion me) {
+autoContingencyTable Confusion_to_ContingencyTable (Confusion me) {
 	try {
 		autoContingencyTable thee = Thing_new (ContingencyTable);
 		my structTableOfReal :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to ContingencyTable.");
+		Melder_throw (me, U": not converted to ContingencyTable.");
 	}
 }
 
-ContingencyTable TableOfReal_to_ContingencyTable (I) {
-	iam (TableOfReal);
+autoContingencyTable TableOfReal_to_ContingencyTable (TableOfReal me) {
 	try {
 		TableOfReal_checkPositive (me);
 		autoContingencyTable thee = Thing_new (ContingencyTable);
 		my structTableOfReal :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to ContingencyTable.");
+		Melder_throw (me, U": not converted to ContingencyTable.");
 	}
 }
 
diff --git a/dwtools/ContingencyTable.h b/dwtools/ContingencyTable.h
index 505051d..9ff57e8 100644
--- a/dwtools/ContingencyTable.h
+++ b/dwtools/ContingencyTable.h
@@ -1,25 +1,49 @@
 #ifndef _ContingencyTable_h_
 #define _ContingencyTable_h_
+/* ContingencyTable.h
+ *
+ * Copyright (C) 1993-2011, 2015 David Weenink
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
 
 #include "TableOfReal.h"
 #include "Confusion.h"
 
 Thing_define (ContingencyTable, TableOfReal) {
-	// overridden methods:
-		virtual void v_info ();
+	void v_info ()
+		override;
 };
 
 // entries must be nonnegative numbers
 
-ContingencyTable ContingencyTable_create (long numberOfRows, long numberOfColumns);
+autoContingencyTable ContingencyTable_create (long numberOfRows, long numberOfColumns);
 
 double ContingencyTable_chisqProbability (ContingencyTable me);
+
 double ContingencyTable_cramersStatistic (ContingencyTable me);
+
 double ContingencyTable_contingencyCoefficient (ContingencyTable me);
-void ContingencyTable_chisq (ContingencyTable me, double *chisq, long *df);
+
+void ContingencyTable_chisq (ContingencyTable me, double *chisq, double *df);
+
 void ContingencyTable_entropies (ContingencyTable me, double *h, double *hx, double *hy,
-	double *hygx, double *hxgy, double *uygx, double *uxgy, double *uxy);
-ContingencyTable Confusion_to_ContingencyTable (Confusion me);
-ContingencyTable TableOfReal_to_ContingencyTable (I);
+								 double *hygx, double *hxgy, double *uygx, double *uxgy, double *uxy);
+
+autoContingencyTable Confusion_to_ContingencyTable (Confusion me);
+
+autoContingencyTable TableOfReal_to_ContingencyTable (TableOfReal me);
 
 #endif // _ContingencyTable_h_
diff --git a/dwtools/DTW.cpp b/dwtools/DTW.cpp
index 4252c6f..9170912 100644
--- a/dwtools/DTW.cpp
+++ b/dwtools/DTW.cpp
@@ -1,6 +1,6 @@
 /* DTW.cpp
  *
- * Copyright (C) 1993-2013 David Weenink
+ * Copyright (C) 1993-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -64,34 +64,31 @@
 
 Thing_implement (DTW, Matrix, 2);
 
-#define DTW_BIG 1e38
+#define DTW_BIG 1e308
 
 void structDTW :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Domain prototype:", Melder_double (ymin), L" to ",
-	                       Melder_double (ymax), L" (s).");
-	MelderInfo_writeLine (L"Domain candidate:", Melder_double (xmin), L" to ",
-	                       Melder_double (xmax), L" (s).");
-	MelderInfo_writeLine (L"Number of frames prototype: ", Melder_integer (ny));
-	MelderInfo_writeLine (L"Number of frames candidate: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"Path length (frames): ", Melder_integer (pathLength));
-	MelderInfo_writeLine (L"Global warped distance: ", Melder_double (weightedDistance));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Domain prototype:", ymin, U" to ", ymax, U" (s).");   // ppgb: Wat is een domain prototype?
+	MelderInfo_writeLine (U"Domain candidate:", xmin, U" to ", xmax, U" (s).");   // ppgb: Wat is een domain candidate?
+	MelderInfo_writeLine (U"Number of frames prototype: ", ny);
+	MelderInfo_writeLine (U"Number of frames candidate: ", nx);
+	MelderInfo_writeLine (U"Path length (frames): ", pathLength);
+	MelderInfo_writeLine (U"Global warped distance: ", weightedDistance);
 	if (nx == ny) {
 		double dd = 0;
 		for (long i = 1; i <= nx; i++) {
 			dd += z[i][i];
 		}
-		MelderInfo_writeLine (L"Distance along diagonal: ", Melder_double (dd / nx));
+		MelderInfo_writeLine (U"Distance along diagonal: ", dd / nx);
 	}
 }
 
 static void DTW_drawWarpX_raw (DTW me, Graphics g, double xmin, double xmax, double ymin, double ymax, double tx, int garnish, int inset);
 static void DTW_paintDistances_raw (DTW me, Graphics g, double xmin, double xmax, double ymin,
                                     double ymax, double minimum, double maximum, int garnish, int inset);
-static void DTW_drawPath_raw (DTW me, Graphics g, double xmin, double xmax, double ymin,
-                              double ymax, int garnish, int inset);
+static void DTW_drawPath_raw (DTW me, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish, int inset);
 static double _DTW_and_Sounds_getPartY (Graphics g, double dtw_part_x);
-static void DTW_findPath_special (DTW me, int matchStart, int matchEnd, int slope, Matrix *cummulativeDists);
+static void DTW_findPath_special (DTW me, int matchStart, int matchEnd, int slope, autoMatrix *cummulativeDists);
 /*
 	Two 'slope lines, lh and ll, start in the lower left corner, the upper/lower has the maximum/minimum allowed slope.
 	Two other lines, ru and rl, end in the upper-right corner. The upper/lower line have minimum/maximum slope.
@@ -351,7 +348,7 @@ void DTW_Path_recode (DTW me) {
 			}
 			nx = ny = 1;
 		} else {
-			Melder_throw ("The path goes back in time.");
+			Melder_throw (U"The path goes back in time.");
 		}
 		// update
 		thy xytimes[nxy].x = xright;
@@ -399,17 +396,16 @@ void DTW_pathRemoveRedundantNodes (DTW me) {
 
 /* Prototype must be on y-axis and test on x-axis */
 
-DTW DTW_create (double tminp, double tmaxp, long ntp, double dtp, double t1p,
-                double tminc, double tmaxc, long ntc, double dtc, double t1c) {
+autoDTW DTW_create (double tminp, double tmaxp, long ntp, double dtp, double t1p, double tminc, double tmaxc, long ntc, double dtc, double t1c) {
 	try {
 		autoDTW me = Thing_new (DTW);
 		Matrix_init (me.peek(), tminc, tmaxc, ntc, dtc, t1c, tminp, tmaxp, ntp, dtp, t1p);
 		my path = NUMvector<structDTW_Path> (1, ntc + ntp - 1);
 		DTW_Path_Query_init (& my pathQuery, ntp, ntc);
 		my wx = 1; my wy = 1; my wd = 2;
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("DTW not created.");
+		Melder_throw (U"DTW not created.");
 	}
 }
 
@@ -417,7 +413,7 @@ void DTW_setWeights (DTW me, double wx, double wy, double wd) {
 	my wx = wx; my wy = wy; my wd = wd;
 }
 
-DTW DTW_swapAxes (DTW me) {
+autoDTW DTW_swapAxes (DTW me) {
 	try {
 		autoDTW thee = DTW_create (my xmin, my xmax, my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1);
 
@@ -431,9 +427,9 @@ DTW DTW_swapAxes (DTW me) {
 			thy path[i].x = my path[i].y;
 			thy path[i].y = my path[i].x;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": axes not swapped.");
+		Melder_throw (me, U": axes not swapped.");
 	}
 }
 
@@ -450,7 +446,7 @@ double DTW_getPathY (DTW me, double tx) {
 
 	// Find column in DTW matrix
 
-	long ix = (tx - my x1) / my dx + 1;
+	long ix = (long) floor ((tx - my x1) / my dx) + 1;
 	if (ix < 1) {
 		ix = 1;
 	}
@@ -614,8 +610,8 @@ static void DTW_paintDistances_raw (DTW me, Graphics g, double xmin, double xmax
 		Graphics_unsetInner (g);
 	}
 	if (garnish) {
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
@@ -654,13 +650,12 @@ static void DTW_drawPath_raw (DTW me, Graphics g, double xmin, double xmax, doub
 	}
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
-void DTW_drawPath (DTW me, Graphics g, double xmin, double xmax, double ymin,
-                   double ymax, int garnish) {
+void DTW_drawPath (DTW me, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish) {
 	DTW_drawPath_raw (me, g, xmin, xmax, ymin, ymax, garnish, 1);
 }
 
@@ -696,9 +691,9 @@ static void DTW_drawWarpX_raw (DTW me, Graphics g, double xmin, double xmax, dou
 	}
 
 	if (garnish) {
-		Graphics_markBottom (g, tx, 1, 1, 0, NULL);
+		Graphics_markBottom (g, tx, true, true, false, nullptr);
 		if (ty <= ymax) {
-			Graphics_markLeft (g, ty, 1, 1, 0, 0);
+			Graphics_markLeft (g, ty, true, true, false, nullptr);
 		}
 	}
 }
@@ -710,15 +705,15 @@ void DTW_drawWarpX (DTW me, Graphics g, double xmin, double xmax, double ymin, d
 static void DTW_and_Sounds_checkDomains (DTW me, Sound *y, Sound *x, double *xmin, double *xmax, double *ymin, double *ymax) {
 	if (my ymin == (*y) -> xmin && my ymax == (*y) -> xmax) {
 		if (my xmin != (*x) -> xmin || my xmax != (*x) -> xmax) {
-			Melder_throw ("The domains of the DTW and the sound('s) don't match");
+			Melder_throw (U"The domains of the DTW and the sound(s) don't match");
 		}
 	} else if (my ymin == (*x) -> xmin && my ymax == (*x) -> xmax) {
 		if (my xmin != (*y) -> xmin || my xmax != (*y) -> xmax) {
-			Melder_throw ("The domains of the DTW and the sound('s) don't match");
+			Melder_throw (U"The domains of the DTW and the sound(s) don't match");
 		}
 		Sound tmp = *y; *y = *x; *x = tmp; // swap x and y
 	} else {
-		Melder_throw ("The domains of the DTW and the sound('s) don't match");
+		Melder_throw (U"The domains of the DTW and the sound(s) don't match");
 	}
 
 	if (*xmin >= *xmax) {
@@ -796,11 +791,11 @@ void DTW_and_Sounds_draw (DTW me, Sound y, Sound x, Graphics g, double xmin, dou
 	Graphics_unsetInner (g);
 
 	if (garnish) {
-		Graphics_markLeft (g, ymin, 1, 1, 0, NULL);
-		Graphics_markLeft (g, ymax, 1, 1, 0, NULL);
+		Graphics_markLeft (g, ymin, true, true, false, nullptr);
+		Graphics_markLeft (g, ymax, true, true, false, nullptr);
 
-		Graphics_markBottom (g, xmin, 1, 1, 0, NULL);
-		Graphics_markBottom (g, xmax, 1, 1, 0, NULL);
+		Graphics_markBottom (g, xmin, true, true, false, nullptr);
+		Graphics_markBottom (g, xmax, true, true, false, nullptr);
 	}
 }
 
@@ -830,18 +825,18 @@ void DTW_and_Sounds_drawWarpX (DTW me, Sound yy, Sound xx, Graphics g, double xm
 	Graphics_unsetInner (g);
 
 	if (garnish) {
-		Graphics_markBottom (g, tx, 1, 1, 0, NULL);
-		Graphics_markLeft (g, ty, 1, 1, 0, NULL);
+		Graphics_markBottom (g, tx, true, true, false, nullptr);
+		Graphics_markLeft (g, ty, true, true, false, nullptr);
 	}
 }
 
-Matrix DTW_to_Matrix_distances (DTW me) {
+autoMatrix DTW_to_Matrix_distances (DTW me) {
 	try {
 		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1);
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": distances not converted to Matrix.");
+		Melder_throw (me, U": distances not converted to Matrix.");
 	}
 }
 
@@ -891,25 +886,23 @@ void DTW_drawDistancesAlongPath (DTW me, Graphics g, double xmin, double xmax, d
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textLeft (g, 1, L"distance");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_textLeft (g, true, U"distance");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
 /*
 	metric = 1...n (sum (a_i^n))^(1/n)
 */
-DTW Matrices_to_DTW (I, thou, int matchStart, int matchEnd, int slope, int metric) {
+autoDTW Matrices_to_DTW (Matrix me, Matrix thee, int matchStart, int matchEnd, int slope, double metric) {
 	try {
-		iam (Matrix); thouart (Matrix);
-
 		if (thy ny != my ny) {
-			Melder_throw (L"Columns must have the same dimensions.");
+			Melder_throw (U"Columns must have the same dimensions.");
 		}
 
 		autoDTW him = DTW_create (my xmin, my xmax, my nx, my dx, my x1, thy xmin, thy xmax, thy nx, thy dx, thy x1);
-		autoMelderProgress progess (L"Calculate distances");
+		autoMelderProgress progess (U"Calculate distances");
 		for (long i = 1; i <= my nx; i++) {
 			for (long j = 1; j <= thy nx; j++) {
 				/*
@@ -934,22 +927,20 @@ DTW Matrices_to_DTW (I, thou, int matchStart, int matchEnd, int slope, int metri
 				his z[i][j] = d / my ny; /* == d * dy / ymax */
 			}
 			if ( (i % 10) == 1) {
-				Melder_progress (0.999 * i / my nx, L"Calculate distances: column ",
-				                  Melder_integer (i), L" from ", Melder_integer (my nx), L".");
+				Melder_progress (0.999 * i / my nx, U"Calculate distances: column ", i, U" from ", my nx, U".");
 			}
 		}
 		DTW_findPath (him.peek(), matchStart, matchEnd, slope);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("DTW not created from matrices.");
+		Melder_throw (U"DTW not created from matrices.");
 	}
 }
 
-DTW Spectrograms_to_DTW (Spectrogram me, Spectrogram thee, int matchStart,
-                         int matchEnd, int slope, int metric) {
+autoDTW Spectrograms_to_DTW (Spectrogram me, Spectrogram thee, int matchStart, int matchEnd, int slope, double metric) {
 	try {
 		if (my xmin != thy xmin || my ymax != thy ymax || my ny != thy ny) {
-			Melder_throw (L"The number of frequencies and/or frequency ranges do not match.");
+			Melder_throw (U"The number of frequencies and/or frequency ranges do not match.");
 		}
 
 		autoMatrix m1 = Spectrogram_to_Matrix (me);
@@ -969,9 +960,9 @@ DTW Spectrograms_to_DTW (Spectrogram me, Spectrogram thee, int matchStart,
 		}
 
 		autoDTW him = Matrices_to_DTW (m1.peek(), m2.peek(), matchStart, matchEnd, slope, metric);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("DTW not created from Spectrograms.");
+		Melder_throw (U"DTW not created from Spectrograms.");
 	}
 }
 
@@ -990,20 +981,20 @@ static int Pitch_findFirstAndLastVoicedFrame (Pitch me, long *first, long *last)
 	return *first <= my nx && *last >= 1;
 }
 
-DTW Pitches_to_DTW_sgc (Pitch me, Pitch thee, double vuv_costs, double time_weight, int matchStart, int matchEnd, int slope);
-DTW Pitches_to_DTW_sgc (Pitch me, Pitch thee, double vuv_costs, double time_weight, int matchStart, int matchEnd, int slope) { // vuv_costs=24, time_weight=10 ?
+autoDTW Pitches_to_DTW_sgc (Pitch me, Pitch thee, double vuv_costs, double time_weight, int matchStart, int matchEnd, int slope);
+autoDTW Pitches_to_DTW_sgc (Pitch me, Pitch thee, double vuv_costs, double time_weight, int matchStart, int matchEnd, int slope) { // vuv_costs=24, time_weight=10 ?
 	try {
 		if (vuv_costs < 0) {
-			Melder_throw ("Voiced-unvoiced costs may not be negative.");
+			Melder_throw (U"Voiced-unvoiced costs may not be negative.");
 		}
 		if (time_weight < 0) {
-			Melder_throw ("Time costs weight may not be negative.");
+			Melder_throw (U"Time costs weight may not be negative.");
 		}
 
 		long myfirst, mylast, thyfirst, thylast;
 		if (! Pitch_findFirstAndLastVoicedFrame (me, &myfirst, &mylast) ||
-		        ! Pitch_findFirstAndLastVoicedFrame (thee, &thyfirst, &thylast)) {
-			Melder_throw ("No voiced frames.");
+			! Pitch_findFirstAndLastVoicedFrame (thee, &thyfirst, &thylast)) {
+			Melder_throw (U"No voiced frames.");
 		}
 		/*
 			We do not want the silences before the first voiced frame and after the last voiced frame
@@ -1038,20 +1029,19 @@ DTW Pitches_to_DTW_sgc (Pitch me, Pitch thee, double vuv_costs, double time_weig
 			}
 		}
 		DTW_findPath (him.peek(), matchStart, matchEnd, slope);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("DTW not created from Pitches.");
+		Melder_throw (U"DTW not created from Pitches.");
 	}
 }
 
-DTW Pitches_to_DTW (Pitch me, Pitch thee, double vuv_costs, double time_weight, int matchStart,
-                    int matchEnd, int slope) { // vuv_costs=24, time_weight=10 ?
+autoDTW Pitches_to_DTW (Pitch me, Pitch thee, double vuv_costs, double time_weight, int matchStart, int matchEnd, int slope) { // vuv_costs=24, time_weight=10 ?
 	try {
 		if (vuv_costs < 0) {
-			Melder_throw ("Voiced-unvoiced costs may not be negative.");
+			Melder_throw (U"Voiced-unvoiced costs must not be negative.");
 		}
 		if (time_weight < 0) {
-			Melder_throw ("Time costs weight may not be negative.");
+			Melder_throw (U"Time costs weight must not be negative.");
 		}
 
 		autoDTW him = DTW_create (my xmin, my xmax, my nx, my dx, my x1, thy xmin, thy xmax, thy nx, thy dx, thy x1);
@@ -1082,50 +1072,50 @@ DTW Pitches_to_DTW (Pitch me, Pitch thee, double vuv_costs, double time_weight,
 		}
 
 		DTW_findPath (him.peek(), matchStart, matchEnd, slope);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("DTW not created from Pitches.");
+		Melder_throw (U"DTW not created from Pitches.");
 	}
 }
 
-DurationTier DTW_to_DurationTier (DTW me) {
+autoDurationTier DTW_to_DurationTier (DTW me) {
 	(void) me;
-	DurationTier thee = NULL;
+	DurationTier thee = nullptr;
 	return thee;
 }
 
 void DTW_and_Matrix_replace (DTW me, Matrix thee) {
 	try {
 		if (my xmin != thy xmin || my xmax != thy xmax || my ymin != thy ymin || my ymax != thy ymax) {
-			Melder_throw ("The X and Y domains of the matrix and the DTW must be equal.");
+			Melder_throw (U"The X and Y domains of the matrix and the DTW must be equal.");
 		}
 		if (my nx != thy nx || my dx != thy dx || my ny != thy ny || my dy != thy dy) {
-			Melder_throw ("The sampling of the matrix and the DTW must be equal.");
+			Melder_throw (U"The sampling of the matrix and the DTW must be equal.");
 		}
 		double minimum, maximum;
 		Matrix_getWindowExtrema (me, 0, 0, 0, 0, & minimum, & maximum);
 		if (minimum < 0) {
-			Melder_throw ("Distances cannot be negative.");
+			Melder_throw (U"Distances must not be negative.");
 		}
 		NUMmatrix_copyElements<double> (thy z, my z, 1, my ny, 1, my nx);
 	} catch (MelderError) {
-		Melder_throw (me, ": distances not replaced.");
+		Melder_throw (me, U": distances not replaced.");
 	}
 }
 
 /****************** new implementation ********/
 
 void DTW_findPath (DTW me, int matchStart, int matchEnd, int slope) {
-    DTW_findPath_special (me, matchStart, matchEnd, slope, 0);
+    DTW_findPath_special (me, matchStart, matchEnd, slope, nullptr);
 }
 
-Matrix DTW_to_Matrix_cummulativeDistances (DTW me, double sakoeChibaBand, int slope) {
+autoMatrix DTW_to_Matrix_cummulativeDistances (DTW me, double sakoeChibaBand, int slope) {
     try {
-        Matrix cummulativeDistances;
+        autoMatrix cummulativeDistances;
         DTW_findPath_bandAndSlope (me, sakoeChibaBand, slope, &cummulativeDistances);
         return cummulativeDistances;
     } catch (MelderError) {
-        Melder_throw (me, ": cummulative costs matrix not created.");
+        Melder_throw (me, U": cummulative costs matrix not created.");
     }
 }
 
@@ -1134,21 +1124,21 @@ static void DTW_checkSlopeConstraints (DTW me, double band, int slope) {
         double slopes[5] = { DTW_BIG, DTW_BIG, 3, 2, 1.5 } ;
         double dtw_slope = (my ymax - my ymin - band) / (my xmax - my xmin - band);
         if (slope < 1 || slope > 4) {
-            Melder_throw ("Invalid slope constraint.");
+            Melder_throw (U"Invalid slope constraint.");
         }
         if (dtw_slope <= 0 && slope != 1) {
-            Melder_throw ("Band too wide.");
+            Melder_throw (U"Band too wide.");
         }
         if (dtw_slope < 1) {
             dtw_slope = 1 / dtw_slope;
         }
             if (dtw_slope > slopes[slope]) {
-            Melder_warning (L"There is a conflict between the chosen slope constraint and the relative duration. "
-				"The duration ratio of the longest and the shortest object is ", Melder_double (dtw_slope),
-				L". This implies that the largest slope in the constraint must have a value greater or equal to this ratio.");
+            Melder_warning (U"There is a conflict between the chosen slope constraint and the relative duration. "
+				"The duration ratio of the longest and the shortest object is ", dtw_slope,
+				U". This implies that the largest slope in the constraint must have a value greater or equal to this ratio.");
         }
     } catch (MelderError) {
-        Melder_throw ("Slope constraints can't be met.");
+        Melder_throw (U"Slope constraints cannot be met.");
     }
 }
 
@@ -1161,12 +1151,12 @@ static void DTW_and_Polygon_setUnreachableParts (DTW me, Polygon thee, long **ps
         Polygon_getExtrema (thee, &xmin, &xmax, &ymin, &ymax);
         // if the Polygon and the DTW don't overlap everything is unreachable!
         if (xmax <= my xmin || xmin >= my xmax || ymax <= my ymin || ymin >= my ymax) {
-            Melder_throw ("DTW and Polygon don't overlap.");
+            Melder_throw (U"DTW and Polygon don't overlap.");
         }
         // find border "above" polygon
         for (long ix = 1; ix <= my nx; ix++) {
             double x = my x1 + (ix - 1) * my dx;
-            long iystart = (dtw_slope * ix * (my dx / my dy) + 1.0);
+            long iystart = (long) floor (dtw_slope * ix * (my dx / my dy)) + 1;
             for (long iy = iystart + 1; iy <= my ny; iy++) {
                 double y = my y1 + (iy - 1) * my dy;
                 if (Polygon_getLocationOfPoint (thee, x, y, eps) == Polygon_OUTSIDE) {
@@ -1180,7 +1170,7 @@ static void DTW_and_Polygon_setUnreachableParts (DTW me, Polygon thee, long **ps
         // find border "below" polygon
         for (long ix = 2; ix <= my nx; ix++) {
             double x = my x1 + (ix - 1) * my dx;
-            long iystart = (dtw_slope * ix * (my dx / my dy)); // start 1 lower
+            long iystart = (long) floor (dtw_slope * ix * (my dx / my dy)); // start 1 lower
             if (iystart > my ny) iystart = my ny;
             for (long iy = iystart - 1; iy >= 1; iy--) {
                 double y = my y1 + (iy - 1) * my dy;
@@ -1193,20 +1183,20 @@ static void DTW_and_Polygon_setUnreachableParts (DTW me, Polygon thee, long **ps
             }
         }
     } catch (MelderError) {
-        Melder_throw (me, " can't set unreachable parts.");
+        Melder_throw (me, U" cannot set unreachable parts.");
     }
 
 }
 
 #define DTW_ISREACHABLE(y,x) ((psi[y][x] != DTW_UNREACHABLE) && (psi[y][x] != DTW_FORBIDDEN))
-static void DTW_findPath_special (DTW me, int matchStart, int matchEnd, int slope, Matrix *cummulativeDists) {
+static void DTW_findPath_special (DTW me, int matchStart, int matchEnd, int slope, autoMatrix *cummulativeDists) {
     (void) matchStart;
     (void) matchEnd;
 	try {
        autoPolygon thee = DTW_to_Polygon (me, 0.0, slope);
        DTW_and_Polygon_findPathInside (me, thee.peek(), slope, cummulativeDists);
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot find path.");
+		Melder_throw (me, U": cannot find path.");
 	}
 }
 
@@ -1217,7 +1207,7 @@ static void getIntersectionPoint (double x1, double y1, double x2, double y2, do
     *y3 = a * *x3 + y1 - a * x1;
 }
 
-Polygon DTW_to_Polygon (DTW me, double band, int slope) {
+autoPolygon DTW_to_Polygon (DTW me, double band, int slope) {
     try {
         DTW_checkSlopeConstraints (me, band, slope);
         double slopes[5] = { DTW_BIG, DTW_BIG, 3, 2, 1.5 } ;
@@ -1228,7 +1218,7 @@ Polygon DTW_to_Polygon (DTW me, double band, int slope) {
                 thy x[2] = my xmin; thy y[2] = my ymax;
                 thy x[3] = my xmax; thy y[3] = my ymax;
                 thy x[4] = my xmax; thy y[4] = my ymin;
-                return thee.transfer();
+                return thee;
             } else {
                 autoPolygon thee = Polygon_create (4);
                 thy x[1] = my xmin; thy y[1] = my ymin;
@@ -1248,7 +1238,7 @@ Polygon DTW_to_Polygon (DTW me, double band, int slope) {
                 if (y > my ymax) y = my ymax;
                 thy x[4] = x;
                 thy y[4] = y;
-                return thee.transfer();
+                return thee;
             }
         } else {
             if (slope == 1) {
@@ -1259,7 +1249,7 @@ Polygon DTW_to_Polygon (DTW me, double band, int slope) {
                 thy x[4] = my xmax; thy y[4] = my ymax;
                 thy x[5] = my xmax; thy y[5] = my ymax - band;
                 thy x[6] = my xmin + band; thy y[6] = my ymin;
-                return thee.transfer();
+                return thee;
             } else {
                 autoPolygon thee = Polygon_create (8);
                 double x, y;
@@ -1283,34 +1273,34 @@ Polygon DTW_to_Polygon (DTW me, double band, int slope) {
                 thy x[7] = x;
                 thy y[7] = y;
                 thy x[8] = my xmin + band; thy y[8] = my ymin;
-                return thee.transfer();
+                return thee;
             }
         }
     } catch (MelderError) {
-        Melder_throw (me, " no Polygon created.");
+        Melder_throw (me, U" no Polygon created.");
     }
 }
 
-Matrix DTW_and_Polygon_to_Matrix_cummulativeDistances (DTW me, Polygon thee, int localSlope) {
+autoMatrix DTW_and_Polygon_to_Matrix_cummulativeDistances (DTW me, Polygon thee, int localSlope) {
     try {
-        Matrix cummulativeDistances;
+        autoMatrix cummulativeDistances;
         DTW_and_Polygon_findPathInside (me, thee, localSlope, &cummulativeDistances);
         return cummulativeDistances;
     } catch (MelderError) {
-        Melder_throw (me, ": cummulative costs matrix not created from DTW and Polygon.");
+        Melder_throw (me, U": cummulative costs matrix not created from DTW and Polygon.");
     }
 }
 
-void DTW_findPath_bandAndSlope (DTW me, double sakoeChibaBand, int localSlope, Matrix *cummulativeDists) {
+void DTW_findPath_bandAndSlope (DTW me, double sakoeChibaBand, int localSlope, autoMatrix *cummulativeDists) {
     try {
         autoPolygon thee = DTW_to_Polygon (me, sakoeChibaBand, localSlope);
         DTW_and_Polygon_findPathInside (me, thee.peek(), localSlope, cummulativeDists);
     } catch (MelderError) {
-        Melder_throw (me, L" can't determine the path.");
+        Melder_throw (me, U" cannot determine the path.");
     }
 }
 
-void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, Matrix *cummulativeDists) {
+void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, autoMatrix *cummulativeDists) {
     try {
         double slopes[5] = { DTW_BIG, DTW_BIG, 3, 2, 1.5 };
         long pathIndex = my nx + my ny - 1; /* Maximum path length */
@@ -1318,7 +1308,7 @@ void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, Matri
         long delta_xy = (my nx < my ny ? my nx : my ny) / 10; // if localSlope == 1 start within 10% of
 
         if (localSlope < 1 || localSlope > 4) {
-            Melder_throw ("Local slope parameter is illegal.");
+            Melder_throw (U"Local slope parameter is illegal.");
         }
 
         autoNUMmatrix<double> delta (-2, my ny, -2, my nx);
@@ -1342,7 +1332,7 @@ void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, Matri
 
         // Make begin part of first column reachable
         long rowto = delta_xy;
-        if (localSlope != 1) rowto = slopes[localSlope] + 1.0;
+        if (localSlope != 1) rowto = (long) floor (slopes[localSlope]) + 1;
         for (long iy = 2; iy <= rowto; iy++) {
             if (localSlope != 1) {
                 delta[iy][1] = delta[iy - 1][1] + my z[iy][1];
@@ -1353,7 +1343,7 @@ void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, Matri
         }
         // Make begin part of first row reachable
         long colto = delta_xy;
-        if (localSlope != 1) colto = slopes[localSlope] + 1.0;
+        if (localSlope != 1) colto = (long) floor (slopes[localSlope]) + 1;
         for (long ix = 2; ix <= colto; ix++) {
             if (localSlope != 1) {
                 delta[1][ix] = delta[1][ix -1] + my z[1][ix];
@@ -1368,7 +1358,7 @@ void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, Matri
 
         // Forward pass.
         long numberOfIsolatedPoints = 0;
-        autoMelderProgress progress (L"Find path");
+        autoMelderProgress progress (U"Find path");
         for (long j = 2; j <= my nx; j++) {
             for (long i = 2; i <= my ny; i++) {
                 if (! DTW_ISREACHABLE (i, j)) continue;
@@ -1466,8 +1456,7 @@ void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, Matri
                 delta[i][j] = gmin;
             }
             if ((j % 10) == 2) {
-                Melder_progress (0.999 * j / my nx, L"Calculate time warp: frame ",
-                    Melder_integer (j), L" from ", Melder_integer (my nx), L".");
+                Melder_progress (0.999 * j / my nx, U"Calculate time warp: frame ", j, U" from ", my nx, U".");
             }
         }
 
@@ -1514,7 +1503,7 @@ void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, Matri
         }
 
         DTW_Path_recode (me);
-        if (cummulativeDists != 0) {
+        if (cummulativeDists) {
             autoMatrix him = Matrix_create (my xmin, my xmax, my nx, my dx, my x1,
                 my ymin, my ymax, my ny, my dy, my y1);
             for (long i = 1; i <= my ny; i++) {
@@ -1522,10 +1511,10 @@ void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, Matri
                     his z[i][j] = delta[i][j];
                 }
             }
-            *cummulativeDists = him.transfer();
+            *cummulativeDists = him.move();
         }
     } catch (MelderError) {
-        Melder_throw (me, ": cannot find path.");
+        Melder_throw (me, U": cannot find path.");
     }
 }
 
diff --git a/dwtools/DTW.h b/dwtools/DTW.h
index 72e9468..9f25579 100644
--- a/dwtools/DTW.h
+++ b/dwtools/DTW.h
@@ -2,7 +2,7 @@
 #define _DTW_h_
 /* DTW.h
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,14 +46,15 @@ oo_CLASS_CREATE (DTW, Matrix);
 void DTW_Path_Query_init (DTW_Path_Query me, long ny, long nx);
 
 /* Prototype on y-axis and test on x-axis */
-DTW DTW_create (double tminp, double tmaxp, long ntp, double dtp, double t1p,
+autoDTW DTW_create (double tminp, double tmaxp, long ntp, double dtp, double t1p,
 	double tminc, double tmaxc, long ntc, double dtc, double t1c);
 
 void DTW_setWeights (DTW me, double wx, double wy, double wd);
 
-DTW DTW_swapAxes (DTW me);
+autoDTW DTW_swapAxes (DTW me);
+
+void DTW_findPath_bandAndSlope (DTW me, double sakoeChibaBand, int localSlope, autoMatrix *cummulativeDists);
 
-void DTW_findPath_bandAndSlope (DTW me, double sakoeChibaBand, int localSlope, Matrix *cummulativeDists);
 void DTW_findPath (DTW me, int matchStart, int matchEnd, int slope); // deprecated
 /* Obsolete
 	Function:
@@ -79,7 +80,9 @@ double DTW_getPathY (DTW me, double tx);
 /*
 	Get the time Y-time that corresponds to time t (along X).
 */
+
 double DTW_getYTimeFromXTime (DTW me, double tx);
+
 double DTW_getXTimeFromYTime (DTW me, double ty);
 
 long DTW_getMaximumConsecutiveSteps (DTW me, int direction);
@@ -89,34 +92,38 @@ void DTW_paintDistances (DTW me, Graphics g, double xmin, double xmax, double ym
 
 void DTW_drawPath (DTW me, Graphics g, double xmin, double xmax, double ymin,
 	double ymax, int garnish);
+
 void DTW_drawWarpX (DTW me, Graphics g, double xmin, double xmax, double ymin, double ymax, double tx, int garnish);
+
 void DTW_pathRemoveRedundantNodes (DTW me);
+
 void DTW_pathQueryRecode (DTW me);
 
-void DTW_drawDistancesAlongPath (DTW me, Graphics g, double xmin, double xmax,
-	double dmin, double dmax, int garnish);
+void DTW_drawDistancesAlongPath (DTW me, Graphics g, double xmin, double xmax, double dmin, double dmax, int garnish);
 
 void DTW_and_Sounds_draw (DTW me, Sound yy, Sound xx, Graphics g, double xmin, double xmax,
 	double ymin, double ymax, int garnish);
+
 void DTW_and_Sounds_drawWarpX (DTW me, Sound yy, Sound xx, Graphics g, double xmin, double xmax,
 	double ymin, double ymax, double tx, int garnish);
 
-Polygon DTW_to_Polygon (DTW me, double band, int slope);
+autoPolygon DTW_to_Polygon (DTW me, double band, int slope);
+
+void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, autoMatrix *cummulativeDists);
+
+autoMatrix DTW_to_Matrix_distances(DTW me);
 
-void DTW_and_Polygon_findPathInside (DTW me, Polygon thee, int localSlope, Matrix *cummulativeDists);
+autoMatrix DTW_to_Matrix_cummulativeDistances (DTW me, double sakoeChibaBand, int slope);
 
-Matrix DTW_to_Matrix_distances(DTW me);
-Matrix DTW_to_Matrix_cummulativeDistances (DTW me, double sakoeChibaBand, int slope);
-Matrix DTW_and_Polygon_to_Matrix_cummulativeDistances (DTW me, Polygon thee, int localSlope);
+autoMatrix DTW_and_Polygon_to_Matrix_cummulativeDistances (DTW me, Polygon thee, int localSlope);
 
-DTW Matrices_to_DTW (I, thou, int matchStart, int matchEnd, int slope, int metric);
+autoDTW Matrices_to_DTW (Matrix me, Matrix thee, int matchStart, int matchEnd, int slope, double metric);
 
-DTW Spectrograms_to_DTW (Spectrogram me, Spectrogram thee, int matchStart,
-	int matchEnd, int slope, int metric);
+autoDTW Spectrograms_to_DTW (Spectrogram me, Spectrogram thee, int matchStart, int matchEnd, int slope, double metric);
 
-DTW Pitches_to_DTW (Pitch me, Pitch thee, double vuv_costs, double time_weight, int matchStart, int matchEnd, int slope);
+autoDTW Pitches_to_DTW (Pitch me, Pitch thee, double vuv_costs, double time_weight, int matchStart, int matchEnd, int slope);
 
-DurationTier DTW_to_DurationTier (DTW me);
+autoDurationTier DTW_to_DurationTier (DTW me);
 
 void DTW_and_Matrix_replace (DTW me, Matrix thee);
 
diff --git a/dwtools/DTW_and_TextGrid.cpp b/dwtools/DTW_and_TextGrid.cpp
index cf7d0ac..db0e07e 100644
--- a/dwtools/DTW_and_TextGrid.cpp
+++ b/dwtools/DTW_and_TextGrid.cpp
@@ -55,10 +55,10 @@ TextTier DTW_and_TextTier_to_TextTier (DTW me, TextTier thee, double precision)
 			}
 			return him.transfer();
 		} else {
-			Melder_throw ("The domain of the TextTier and one of the domains of the DTW must be equal.");
+			Melder_throw (U"The domain of the TextTier and one of the domains of the DTW must be equal.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("TextTier not created from DTW & TextTier.");
+		Melder_throw (U"TextTier not created from DTW & TextTier.");
 	}
 }
 
@@ -89,10 +89,10 @@ IntervalTier DTW_and_IntervalTier_to_IntervalTier (DTW me, IntervalTier thee, do
 			}
 			return him.transfer();
 		} else {
-			Melder_throw ("The domain of the IntervalTier and one of the domains of the DTW must be equal.");
+			Melder_throw (U"The domain of the IntervalTier and one of the domains of the DTW must be equal.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("IntervalTier not created from DTW & IntervalTier.");
+		Melder_throw (U"IntervalTier not created from DTW & IntervalTier.");
 	}
 }
 
@@ -106,7 +106,7 @@ TextGrid DTW_and_TextGrid_to_TextGrid (DTW me, TextGrid thee, double precision)
 			tmin = my ymin;
 			tmax = my ymax;
 		} else {
-			Melder_throw ("The domain of the TextGrid must be equal to one of the domains of the DTW.");
+			Melder_throw (U"The domain of the TextGrid must be equal to one of the domains of the DTW.");
 		}
 
 		autoTextGrid him = TextGrid_createWithoutTiers (tmin, tmax);
@@ -116,24 +116,24 @@ TextGrid DTW_and_TextGrid_to_TextGrid (DTW me, TextGrid thee, double precision)
 
 			if (anyTier -> classInfo == classIntervalTier) {
 				autoIntervalTier tier = DTW_and_IntervalTier_to_IntervalTier (me, (IntervalTier) anyTier, precision);
-				TextGrid_addTier (him.peek(), tier.peek());
+				TextGrid_addTier_copy (him.peek(), tier.peek());
 			} else if (anyTier -> classInfo == classTextTier) {
 				autoTextTier tier = DTW_and_TextTier_to_TextTier (me, (TextTier) anyTier, precision);
-				TextGrid_addTier (him.peek(), tier.peek());
+				TextGrid_addTier_copy (him.peek(), tier.peek());
 			} else {
-				Melder_throw ("Unknown tier.");
+				Melder_throw (U"Unknown tier.");
 			}
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrid not created from DTW & TextGrid.");
+		Melder_throw (U"TextGrid not created from DTW & TextGrid.");
 	}
 }
 
 Table DTW_and_IntervalTier_to_Table (DTW me, IntervalTier thee, double precision) {
 	try {
 		long numberOfIntervals = thy intervals -> size;
-		autoTable him = Table_createWithColumnNames (numberOfIntervals, L"tmin tmax label dist");
+		autoTable him = Table_createWithColumnNames (numberOfIntervals, U"tmin tmax label dist");
 		if (fabs (my ymin - thy xmin) <= precision && fabs (my ymax - thy xmax) <= precision) { // map from Y to X
 			long pathIndex = 1;
 			for (long i = 1; i <= numberOfIntervals; i++) {
@@ -171,11 +171,11 @@ Table DTW_and_IntervalTier_to_Table (DTW me, IntervalTier thee, double precision
 				Table_setNumericValue (him.peek(), i, 4, sumOfDistances / numberOfFrames);
 			}
 		} else {
-			Melder_throw ("The domain of the IntervalTier and one of the domains of the DTW must be equal.");
+			Melder_throw (U"The domain of the IntervalTier and one of the domains of the DTW must be equal.");
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Table with distances created.");
+		Melder_throw (me, U": no Table with distances created.");
 	}
 
 
@@ -185,7 +185,7 @@ Table DTW_and_IntervalTier_to_Table (DTW me, IntervalTier thee, double precision
 TextTier DTW_and_TextTier_to_TextTier_old (DTW me, TextTier thee) {
 	try {
 		if (my xmin != thy xmin || my xmax != thy xmax) {
-			Melder_throw ("The domain of the TextTier and the DTW must be equal.");
+			Melder_throw (U"The domain of the TextTier and the DTW must be equal.");
 		}
 		autoTextTier him =  Data_copy (thee);
 		his xmin = my ymin;
@@ -198,14 +198,14 @@ TextTier DTW_and_TextTier_to_TextTier_old (DTW me, TextTier thee) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextTier not created.");
+		Melder_throw (U"TextTier not created.");
 	}
 }
 
 IntervalTier DTW_and_IntervalTier_to_IntervalTier_old (DTW me, IntervalTier thee) {
 	try {
 		if ( (my xmin != thy xmin) || my xmax != thy xmax) Melder_throw
-			("The domain of the IntervalTier and the DTW must be equal.");
+			(U"The domain of the IntervalTier and the DTW must be equal.");
 
 		autoIntervalTier him = Data_copy (thee);
 
@@ -221,7 +221,7 @@ IntervalTier DTW_and_IntervalTier_to_IntervalTier_old (DTW me, IntervalTier thee
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("IntervalTier not created.");
+		Melder_throw (U"IntervalTier not created.");
 	}
 }
 
@@ -229,7 +229,7 @@ TextGrid DTW_and_TextGrid_to_TextGrid_old (DTW me, TextGrid thee) {
 	try {
 		autoTextGrid him = Thing_new (TextGrid);
 		if (my xmin != thy xmin || my xmax != thy xmax) {
-			Melder_throw ("The domain of the TextGrid and the y-domain of the DTW must be equal.");
+			Melder_throw (U"The domain of the TextGrid and the y-domain of the DTW must be equal.");
 		}
 
 		his xmin = my ymin;
@@ -237,22 +237,22 @@ TextGrid DTW_and_TextGrid_to_TextGrid_old (DTW me, TextGrid thee) {
 		his tiers = Ordered_create ();
 
 		for (long i = 1; i <= thy tiers -> size; i++) {
-			Data anyTier = (Data) thy tiers -> item[i];
+			Daata anyTier = (Daata) thy tiers -> item[i];
 
 			if (anyTier -> classInfo == classIntervalTier) {
 
 				autoIntervalTier tier = DTW_and_IntervalTier_to_IntervalTier_old (me, (IntervalTier) anyTier);
-				TextGrid_addTier (him.peek(), tier.peek());
+				TextGrid_addTier_copy (him.peek(), tier.peek());
 			} else if (anyTier -> classInfo == classTextTier) {
 				autoTextTier tier = DTW_and_TextTier_to_TextTier_old (me, (TextTier) anyTier);
-				TextGrid_addTier (him.peek(), tier.peek());
+				TextGrid_addTier_copy (him.peek(), tier.peek());
 			} else {
-				Melder_throw (L"Unknown tier.");
+				Melder_throw (U"Unknown tier.");
 			}
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrid not created.");
+		Melder_throw (U"TextGrid not created.");
 	}
 }
 
diff --git a/dwtools/DTW_def.h b/dwtools/DTW_def.h
index ff7e421..86bcf54 100644
--- a/dwtools/DTW_def.h
+++ b/dwtools/DTW_def.h
@@ -71,8 +71,8 @@ oo_DEFINE_CLASS (DTW, Matrix)
 		DTW_Path_recode (this);
 	#endif
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 oo_END_CLASS (DTW)
 #undef ooSTRUCT
diff --git a/dwtools/DataModeler.cpp b/dwtools/DataModeler.cpp
index 1b8b4c8..c679813 100644
--- a/dwtools/DataModeler.cpp
+++ b/dwtools/DataModeler.cpp
@@ -1,6 +1,6 @@
 /* DataModeler.cpp
  *
- * Copyright (C) 2014 David Weenink
+ * Copyright (C) 2014-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,36 +49,39 @@
 #include "DataModeler_def.h"
 
 extern machar_Table NUMfpp;
+void FormantModeler_getSumOfVariancesBetweenShiftedAndEstimatedTracks (FormantModeler me, int shiftDirection, long *fromFormant, long *toFormant, double var[]);
 
 Thing_implement (DataModeler, Function, 0);
 
 void structDataModeler :: v_info () {
-	MelderInfo_writeLine (L"   Time domain:");
-	MelderInfo_writeLine (L"      Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"      End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"      Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	double ndf, rSquared = DataModeler_getCoefficientOfDetermination (this, NULL, NULL);
+	MelderInfo_writeLine (U"   Time domain:");
+	MelderInfo_writeLine (U"      Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"      End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"      Total duration: ", xmax - xmin, U" seconds");
+	double ndf, rSquared = DataModeler_getCoefficientOfDetermination (this, nullptr, nullptr);
 	double probability, chisq = DataModeler_getChiSquaredQ (this, useSigmaY, &probability, &ndf);
-	MelderInfo_writeLine (L"   Fit:");
-	MelderInfo_writeLine (L"      Number of data points: ", Melder_integer (numberOfDataPoints));
-	MelderInfo_writeLine (L"      Number of parameters: ", Melder_integer (numberOfParameters));
-	MelderInfo_writeLine (L"      Each data point has ", useSigmaY == DataModeler_DATA_WEIGH_EQUAL ? L" the same weight (estimated)." :
-		useSigmaY == DataModeler_DATA_WEIGH_SIGMA ? L"a different weight (sigmaY)." : 
-		useSigmaY == DataModeler_DATA_WEIGH_RELATIVE ? L"a different relative weight (Y_value/sigmaY)." :
-		L"a different weight (SQRT(sigmaY)).");
-	MelderInfo_writeLine (L"      Chi squared: ", Melder_double (chisq));
-	MelderInfo_writeLine (L"      Number of degrees of freedom: ", Melder_double (ndf));
-	MelderInfo_writeLine (L"      Probability: ", Melder_double (probability));
-	MelderInfo_writeLine (L"      R-squared: ", Melder_double (rSquared));
+	MelderInfo_writeLine (U"   Fit:");
+	MelderInfo_writeLine (U"      Number of data points: ", numberOfDataPoints);
+	MelderInfo_writeLine (U"      Number of parameters: ", numberOfParameters);
+	MelderInfo_writeLine (U"      Each data point has ", useSigmaY == DataModeler_DATA_WEIGH_EQUAL ? U" the same weight (estimated)." :
+		useSigmaY == DataModeler_DATA_WEIGH_SIGMA ? U"a different weight (sigmaY)." : 
+		useSigmaY == DataModeler_DATA_WEIGH_RELATIVE ? U"a different relative weight (Y_value/sigmaY)." :
+		U"a different weight (SQRT(sigmaY)).");
+	MelderInfo_writeLine (U"      Chi squared: ", chisq);
+	MelderInfo_writeLine (U"      Number of degrees of freedom: ", ndf);
+	MelderInfo_writeLine (U"      Probability: ", probability);
+	MelderInfo_writeLine (U"      R-squared: ", rSquared);
 	for (long ipar = 1; ipar <= numberOfParameters; ipar++) {
 		double sigma = parameterStatus[ipar] == DataModeler_PARAMETER_FIXED ? 0 : sqrt (parameterCovariances -> data[ipar][ipar]);
-		MelderInfo_writeLine (L"      p[", Melder_integer (ipar), L"] = ", Melder_double (parameter[ipar]), L"; sigma = ", Melder_double (sigma));
+		MelderInfo_writeLine (U"      p[", ipar, U"] = ", parameter[ipar], U"; sigma = ", sigma);
 	}
 }
 
-static double polynome_evaluate (DataModeler me, double x, double p[])
+static double polynomial_evaluate (DataModeler me, double xin, double p[])
 {
 	double xpi = 1, result = p[1];
+	// From domain [xmin, xmax] to domain [-(xmax -xmin)/2, (xmax-xmin)/2]
+	double x = (2.0 * xin - my xmin - my xmax) / 2.0;
 	for (long i = 2; i <= my numberOfParameters; i++) {
 		xpi *= x;
 		result += p[i] * xpi;
@@ -86,23 +89,21 @@ static double polynome_evaluate (DataModeler me, double x, double p[])
 	return result;
 }
 
-static void polynome_evaluateBasisFunctions (DataModeler me, double xin, double term[])
-{
+static void polynomial_evaluateBasisFunctions (DataModeler me, double xin, double term[]) {
 	term[1] = 1;
-	// From domain [xmin, xmax] to domain [-1, 1]
-	double x = (2 * xin - my xmin - my xmax) / (my xmax - my xmin);
+	// From domain [xmin, xmax] to domain [-(xmax -xmin)/2, (xmax-xmin)/2]
+	double x = (2.0 * xin - my xmin - my xmax) / 2.0;
 	for (long i = 2; i <= my numberOfParameters; i++) {
 		term[i] = term[i-1] * x;
 	}
 }
 
-static double legendre_evaluate (DataModeler me, double xin, double p[])
-{
+static double legendre_evaluate (DataModeler me, double xin, double p[]) {
 	// From domain [xmin, xmax] to domain [-1, 1]
-	double x = (2 * xin - my xmin - my xmax) / (my xmax - my xmin);
+	double x = (2.0 * xin - my xmin - my xmax) / (my xmax - my xmin);
 	double pti, ptim1, ptim2 = 1, result = p[1];
 	if (my numberOfParameters > 1) {
-		double twox = 2 * x, f2 = x, d = 1.0;
+		double twox = 2.0 * x, f2 = x, d = 1.0;
 		result += p[2] * (ptim1 = x);
 		for (long i = 3; i <= my numberOfParameters; i++) {
 			double f1 = d++;
@@ -114,13 +115,12 @@ static double legendre_evaluate (DataModeler me, double xin, double p[])
 	return result;
 }
 
-static void legendre_evaluateBasisFunctions (DataModeler me, double xin, double term[])
-{
-	term[1] = 1;
+static void legendre_evaluateBasisFunctions (DataModeler me, double xin, double term[]) {
+	term[1] = 1.0;
 	/* transform x from domain [xmin, xmax] to domain [-1, 1] */
-	double x = ( 2 * xin - my xmin - my xmax) / (my xmax - my xmin);
+	double x = (2.0 * xin - my xmin - my xmax) / (my xmax - my xmin);
 	if (my numberOfParameters > 1) {
-		double twox = 2 * x, f2 = term[2] = x, d = 1.0;
+		double twox = 2.0 * x, f2 = term[2] = x, d = 1.0;
 		for (long i = 3; i <= my numberOfParameters; i++) {
 			double f1 = d++;
 			f2 += twox;
@@ -129,19 +129,37 @@ static void legendre_evaluateBasisFunctions (DataModeler me, double xin, double
 	}
 }
 
-double DataModeler_getDataPointWeight (DataModeler me, long iPoint, int useSigmaY ) {
-	double weight = 1;
+static void chisqFromZScores (double *zscores, long numberOfZScores, double *chisq, long *numberOfValidZScores) {
+	long numberOfValid = numberOfZScores;
+	double chisqt = 0.0;
+	for (long i = 1; i <= numberOfZScores; i++) {
+		if (NUMdefined (zscores[i])) {
+			chisqt += zscores[i] * zscores[i];
+		} else {
+			numberOfValid--;
+		}
+	}
+	if (chisq) {
+		*chisq = chisqt;
+	}
+	if (numberOfValidZScores) {
+		*numberOfValidZScores = numberOfValid;
+	}
+}
+
+static double DataModeler_getDataPointInverseWeight (DataModeler me, long iPoint, int useSigmaY ) {
+	double iweight = 1.0;
 	if (iPoint > 0 && iPoint <= my numberOfDataPoints && my dataPointStatus[iPoint] != DataModeler_DATA_INVALID) {
 		if (useSigmaY == DataModeler_DATA_WEIGH_SIGMA) {
-			weight = my sigmaY[iPoint];
+			iweight = my sigmaY[iPoint];
 		} else if (useSigmaY == DataModeler_DATA_WEIGH_RELATIVE) {
 			double q = my y[iPoint] / my sigmaY[iPoint];
-			weight = 500 / q; //
+			iweight = 500.0 / q; //
 		} else if (useSigmaY == DataModeler_DATA_WEIGH_SQRT) {
-			weight = 7.071 * sqrt (my sigmaY[iPoint]); // .bw = 50 gives 50
+			iweight = 7.071 * sqrt (my sigmaY[iPoint]); // .bw = 50 gives 50
 		}
 	}
-	return weight;
+	return iweight;
 }
 
 double DataModeler_getModelValueAtX (DataModeler me, double x) {
@@ -152,8 +170,16 @@ double DataModeler_getModelValueAtX (DataModeler me, double x) {
 	return f;
 }
 
+double DataModeler_getModelValueAtIndex (DataModeler me, long index) {
+	double f = NUMundefined;
+	if (index > 0 && index <= my numberOfDataPoints) {
+		f = my f_evaluate (me, my x[index], my parameter);
+	}
+	return f;
+}
+
 void DataModeler_getExtremaY (DataModeler me, double *ymin, double *ymax) {
-	double min = 1e38, max = -min;
+	double min = 1e308, max = -min;
 	for (long i = 1; i <= my numberOfDataPoints; i++) {
 		if (my dataPointStatus[i] != DataModeler_DATA_INVALID) {
 			if (my y[i] < min) {
@@ -164,10 +190,10 @@ void DataModeler_getExtremaY (DataModeler me, double *ymin, double *ymax) {
 			}
 		}
 	}
-	if (ymin != NULL) {
+	if (ymin) {
 		*ymin = min;
 	}
-	if (ymax != NULL) {
+	if (ymax) {
 		*ymax = max;
 	}
 }
@@ -211,26 +237,30 @@ int DataModeler_getDataPointStatus (DataModeler me, long index) {
 void DataModeler_setDataPointStatus (DataModeler me, long index, int status) {
 	if (index > 0 && index <= my numberOfDataPoints) {
 		if (status == DataModeler_DATA_VALID && ! NUMdefined (my y[index])) {
-			Melder_throw ("Your data value is undefined. First set the value and then its status.");
+			Melder_throw (U"Your data value is undefined. First set the value and then its status.");
 		}
 		my dataPointStatus[index] = status;
 	}
 }
 
-void DataModeler_setDataPointValueAndStatus (DataModeler me, long index, double value, int dataStatus) {
+static void DataModeler_setDataPointValueAndStatus (DataModeler me, long index, double value, int dataStatus) {
 	if (index > 0 && index <= my numberOfDataPoints) {
 		my y[index] = value;
 		my dataPointStatus[index] = dataStatus;
 	}
 }
 
-void DataModeler_setParameterValueFixed (DataModeler me, long index, double value) {
+void DataModeler_setParameterValue (DataModeler me, long index, double value, int status) {
 	if (index > 0 && index <= my numberOfParameters) {
 		my parameter[index] = value;
-		my parameterStatus[index] = DataModeler_PARAMETER_FIXED;
+		my parameterStatus[index] = status;
 	}
 }
 
+void DataModeler_setParameterValueFixed (DataModeler me, long index, double value) {
+	DataModeler_setParameterValue (me, index, value, DataModeler_PARAMETER_FIXED);
+}
+
 double DataModeler_getParameterValue (DataModeler me, long index) {
 	double value = NUMundefined;
 	if (index > 0 && index <= my numberOfParameters) {
@@ -270,7 +300,7 @@ double DataModeler_getVarianceOfParameters (DataModeler me, long fromIndex, long
 			}
 		}
 	}
-	if (numberOfFreeParameters != NULL) {
+	if (numberOfFreeParameters) {
 		*numberOfFreeParameters = numberOfParameters;
 	}
 	return variance;
@@ -294,7 +324,7 @@ void DataModeler_setParameterValuesToZero (DataModeler me, double numberOfSigmas
 			double value = my parameter[i];
 			double sigmas = numberOfSigmas * DataModeler_getParameterStandardDeviation (me, i);
 			if ((value - sigmas) * (value + sigmas) < 0) {
-				DataModeler_setParameterValueFixed (me, i, 0);
+				DataModeler_setParameterValueFixed (me, i, 0.0);
 				numberOfChangedParameters++;
 			}
 		}
@@ -328,7 +358,7 @@ long DataModeler_getNumberOfInvalidDataPoints (DataModeler me) {
 }
 
 void DataModeler_setTolerance (DataModeler me, double tolerance) {
-	my tolerance = tolerance > 0 ? tolerance : my numberOfDataPoints * NUMfpp -> eps;
+	my tolerance = tolerance > 0.0 ? tolerance : my numberOfDataPoints * NUMfpp -> eps;
 }
 
 double DataModeler_getDegreesOfFreedom (DataModeler me) {
@@ -342,58 +372,78 @@ double DataModeler_getDegreesOfFreedom (DataModeler me) {
 	return ndf;
 }
 
-double *DataModeler_getZScores (DataModeler me, int useSigmaY) {
+void DataModeler_getZScores (DataModeler me, int useSigmaY, double zscores[]) {
 	try {
+		Melder_assert (zscores != nullptr);
 		double estimatedSigmaY;
 		if (useSigmaY == DataModeler_DATA_WEIGH_EQUAL) {
-			estimatedSigmaY = DataModeler_estimateSigmaY (me);
-			if (! NUMdefined (estimatedSigmaY)) {
-				Melder_throw ("Not enough data points to calculate sigma.");
+			long numberOfValidDataPoints;
+			double rss = DataModeler_getResidualSumOfSquares (me, &numberOfValidDataPoints);
+			if (numberOfValidDataPoints < 2) {
+				Melder_throw (U"Not enough data points to calculate sigma.");
 			}
+			estimatedSigmaY = rss / (numberOfValidDataPoints - 1);
 		}
-		autoNUMvector<double> zscores (1, my numberOfDataPoints);
 		for (long i = 1; i <= my numberOfDataPoints; i++) {
 			double value = NUMundefined;
 			if (my dataPointStatus[i] != DataModeler_DATA_INVALID) {
 				double estimate = my f_evaluate (me, my x[i], my parameter);
-				double sigma = useSigmaY == DataModeler_DATA_WEIGH_EQUAL ? estimatedSigmaY : DataModeler_getDataPointWeight (me, i, useSigmaY);
+				double sigma = useSigmaY == DataModeler_DATA_WEIGH_EQUAL ? estimatedSigmaY : DataModeler_getDataPointInverseWeight (me, i, useSigmaY);
 				value = (my y[i] - estimate) / sigma;
 			}
 			zscores[i] = value;
 		}
-		return zscores.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No z-scores calculated.");
+		Melder_throw (U"No z-scores calculated.");
 	}
 }
 
-double DataModeler_getChiSquaredQ (DataModeler me, int useSigmaY, double *probability, double *ndf)
-{
-	double chisq = 0;
-	autoNUMvector<double> zscores (DataModeler_getZScores (me, useSigmaY), 1);
-	for (long idata = 1; idata <= my numberOfDataPoints; idata++)
-	{
-		if (NUMdefined (zscores[idata])) {
-			chisq += zscores[idata] * zscores[idata];
+// chisq and zscores may be the same arrays!
+static void DataModeler_getChisqScoresFromZScores (DataModeler me, double *zscores, bool substituteAverage, double *chisq) {
+	Melder_assert (zscores != nullptr && chisq != nullptr);
+	long numberOfDefined = my numberOfDataPoints;
+	double sumchisq = 0.0;
+	for (long i = 1; i <= my numberOfDataPoints; i++) {
+		if (NUMdefined (zscores[i])) {
+			chisq[i] = zscores[i] * zscores[i];
+			sumchisq += chisq[i];
+		} else {
+			numberOfDefined--;
+			chisq[i] = NUMundefined;
 		}
 	}
-	double dof =  DataModeler_getDegreesOfFreedom (me);
-	dof = useSigmaY == DataModeler_DATA_WEIGH_EQUAL ? dof - 1 : dof; // we loose one dof if sigma is estimated from the data
-	if (probability != NULL) {
+	if (substituteAverage && numberOfDefined != my numberOfDataPoints && numberOfDefined > 0) {
+		for (long i = 1; i <= my numberOfDataPoints; i++) {
+			if (! NUMdefined (chisq[i])) {
+				chisq[i] = sumchisq / numberOfDefined;
+			}
+		}
+	}
+}
+
+double DataModeler_getChiSquaredQ (DataModeler me, int useSigmaY, double *probability, double *ndf)
+{
+	double chisq; long numberOfValidZScores;
+	autoNUMvector<double> zscores (1, my numberOfDataPoints);
+	DataModeler_getZScores (me, useSigmaY, zscores.peek());
+	chisqFromZScores (zscores.peek(), my numberOfDataPoints, & chisq, & numberOfValidZScores);
+	double dof = numberOfValidZScores;
+	dof = useSigmaY == DataModeler_DATA_WEIGH_EQUAL ? dof - 1.0 : dof; // we loose one dof if sigma is estimated from the data
+	if (probability) {
 		*probability = NUMchiSquareQ (chisq, dof);
 	}
-	if (ndf != NULL) {
+	if (ndf) {
 		*ndf = dof;
 	}
 	return chisq;
 }
 
 double DataModeler_getWeightedMean (DataModeler me) {
-	double ysum = 0, wsum = 0;
+	double ysum = 0.0, wsum = 0.0;
 	for (long i = 1; i <= my numberOfDataPoints; i++) {
 		if (my dataPointStatus[i] != DataModeler_DATA_INVALID) {
-			double s = DataModeler_getDataPointWeight (me, i, my useSigmaY);
-			double weight =  1 / (s * s);
+			double s = DataModeler_getDataPointInverseWeight (me, i, my useSigmaY);
+			double weight = 1.0 / (s * s);
 			ysum += my y[i] * weight;
 			wsum += weight;
 		}
@@ -406,14 +456,14 @@ double DataModeler_getCoefficientOfDetermination (DataModeler me, double *ssreg,
 	/* We cannot use the standard expressions for ss_tot, and ss_reg because our data are weighted by 1 / sigma[i].
 	 * We need the weighted mean and we need to weigh all sums-of-squares accordingly;
 	 * if all sigma[i] terms are equal, the formulas reduce to the standard ones.
-	 * Ref: A. Buse (1973): Goodness of Fit in Generalized Least Squares Estimatio, The American Statician, vol 27, 106-108
+	 * Ref: A. Buse (1973): Goodness of Fit in Generalized Least Squares Estimation, The American Statician, vol 27, 106-108
 	 */
 
 	double ymean = DataModeler_getWeightedMean (me);
-	double ss_tot = 0, ss_reg = 0;
+	double ss_tot = 0.0, ss_reg = 0.0;
 	for (long i = 1; i <= my numberOfDataPoints; i++) {
 		if (my dataPointStatus[i] != DataModeler_DATA_INVALID) {
-			double s = DataModeler_getDataPointWeight (me, i, my useSigmaY);
+			double s = DataModeler_getDataPointInverseWeight (me, i, my useSigmaY);
 			double diff = (my y[i] - ymean) / s;
 			ss_tot += diff * diff; // total sum of squares
 			double estimate = my f_evaluate (me, my x[i], my parameter);
@@ -421,18 +471,17 @@ double DataModeler_getCoefficientOfDetermination (DataModeler me, double *ssreg,
 			ss_reg += diff * diff; // regression sum of squares
 		}
 	}
-	double rSquared = ss_tot > 0 ? 1 - ss_reg / ss_tot : 1;
-	if (ssreg != NULL) {
+	double rSquared = ss_tot > 0.0 ? 1.0 - ss_reg / ss_tot : 1.0;
+	if (ssreg) {
 		*ssreg = ss_tot - ss_reg;
 	}
-	if (sstot != NULL) {
+	if (sstot) {
 		*sstot = ss_tot;
 	}
 	return rSquared;
 }
 
-void DataModeler_drawBasisFunction_inside (DataModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax,
- 	long iterm, bool scale, long numberOfPoints) {
+static void DataModeler_drawBasisFunction_inside (DataModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax, long iterm, bool scale, long numberOfPoints) {
 	if (xmax <= xmin) {
 		xmin = my xmin; xmax = my xmax;
 	}
@@ -446,7 +495,7 @@ void DataModeler_drawBasisFunction_inside (DataModeler me, Graphics g, double xm
 		y[i] = scale ? y[i] * my parameter[iterm] : y[i];
 	}
 	if (ymax <= ymin) {
-		ymin = 1e38;ymax = -ymin;
+		ymin = 1e308; ymax = -ymin;
 		for (long i = 1; i <= numberOfPoints; i++) {
 			ymax = y[i] > ymax ? y[i] : ymax;
 			ymin = y[i] < ymin ? y[i] : ymin;
@@ -458,26 +507,29 @@ void DataModeler_drawBasisFunction_inside (DataModeler me, Graphics g, double xm
 	}
 }
 
-void DataModeler_drawOutliersMarked_inside (DataModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax, double numberOfSigmas, int useSigmaY, wchar_t *mark, int marksFontSize, double horizontalOffset_mm) {
-	if (xmax <= xmin) { 
-		xmin = my xmin; xmax = my xmax;
+static long DataModeler_drawingSpecifiers_x (DataModeler me, double *xmin, double *xmax, long *ixmin, long *ixmax) {
+	if (*xmax <= *xmin) {
+		*xmin = my xmin; *xmax = my xmax;
 	}
-	long ixmin = 2;
-	while (my x[ixmin] < xmin && ixmin < my numberOfDataPoints) { 
-		ixmin++;
+	*ixmin = 2;
+	while (my x[*ixmin] < *xmin && *ixmin < my numberOfDataPoints) {
+		(*ixmin)++;
 	}
-	
-	ixmin--;
-	long ixmax = my numberOfDataPoints - 1;
-	while (my x[ixmax] > xmax && ixmax > 1) {
-		ixmax--;
-	}
-	ixmax++;
-	if (ixmin >= ixmax) {
-		return; // nothing to draw
+	(*ixmin)--;
+
+	*ixmax = my numberOfDataPoints - 1;
+	while (my x[*ixmax] > *xmax && *ixmax > 1) {
+		(*ixmax)--;
 	}
-	
-	autoNUMvector<double> zscores (DataModeler_getZScores (me, useSigmaY), 1);
+	(*ixmax)++;
+	return *ixmax - *ixmin + 1;
+}
+
+void DataModeler_drawOutliersMarked_inside (DataModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax, double numberOfSigmas, int useSigmaY, char32 *mark, int marksFontSize, double horizontalOffset_mm) {
+	long ixmin, ixmax;
+	if (DataModeler_drawingSpecifiers_x (me, &xmin, &xmax, &ixmin, &ixmax) < 1) return;
+	autoNUMvector<double> zscores (1, my numberOfDataPoints);
+	DataModeler_getZScores (me, useSigmaY, zscores.peek());
 	double horizontalOffset_wc = Graphics_dxMMtoWC (g, horizontalOffset_mm);
 	
 	Graphics_setWindow (g, xmin, xmax, ymin, ymax);
@@ -524,45 +576,51 @@ void DataModeler_draw_inside (DataModeler me, Graphics g, double xmin, double xm
 	
 	Graphics_setWindow (g, xmin, xmax, ymin, ymax);
 	double horizontalOffset_wc = Graphics_dxMMtoWC (g, horizontalOffset_mm);
-	double barWidth_wc = barWidth_mm <= 0 ? 0 : Graphics_dxMMtoWC (g, barWidth_mm);
+	double barWidth_wc = barWidth_mm <= 0.0 ? 0.0 : Graphics_dxMMtoWC (g, barWidth_mm);
+	double x1, y1, x2, y2;
 	bool x1defined = false, x2defined = false;
 	for (long idata = ixmin; idata <= ixmax; idata++) {
 		if (my dataPointStatus[idata] != DataModeler_DATA_INVALID) {
-			double x1, y1, x2, y2, x = my x[idata], y = my y[idata];
+			double x = my x[idata], y = my y[idata];
 			if (! x1defined) {
 				x1 = x;
 				y1 = estimated ? my f_evaluate (me, x, parameter.peek()) : y;
-				y1 = y1 < ymin ? ymin : y1 > ymax ? ymax : y1;
 				x1defined = true;
 			} else {
 				x2 = x;
 				y2 = estimated ? my f_evaluate (me, x, parameter.peek()) : y;
-				y2 = y2 < ymin ? ymin : y2 > ymax ? ymax : y2;
 				x2defined = true;
 			}
 			if (x1defined && drawDots) {
-				Graphics_speckle (g, x + horizontalOffset_wc, y);
+				if (y >= ymin && y <= ymax) {
+					Graphics_speckle (g, x + horizontalOffset_wc, y);
+				}
 			}
-			if (x1defined && x2defined) {
+			if (x2defined) { // if (x1defined && x2defined)
 				if (connectPoints) {
-					Graphics_line (g, x1 + horizontalOffset_wc, y1, x2 + horizontalOffset_wc, y2);
+					double xo1, yo1, xo2, yo2;
+					if (NUMclipLineWithinRectangle (x1 + horizontalOffset_wc, y1, x2 + horizontalOffset_wc, y2,
+						xmin, ymin, xmax, ymax, &xo1, &yo1, &xo2, &yo2)) {
+						Graphics_line (g, xo1, yo1, xo2, yo2);
+					}
+					// Graphics_line (g, x1 + horizontalOffset_wc, y1, x2 + horizontalOffset_wc, y2);
 				}
 				x1 = x;
 				y1 = y2;
 			}
 			if (x1defined && errorbars != 0) {
-				double sigma = my sigmaY[idata]; // DataModeler_getDataPointWeight ?
+				double sigma = my sigmaY[idata]; // DataModeler_getDataPointInverseWeight ?
 				double ym = y1;
 				double yt = ym + 0.5 * sigma, yb = ym - 0.5 * sigma;
 				if (estimated) {
-					yt = (y - y1) > 0 ? y : y1;
-					yb = (y - y1) > 0 ? y1 : y;
+					yt = (y - y1) > 0.0 ? y : y1;
+					yb = (y - y1) > 0.0 ? y1 : y;
 				}
 				int topOutside = yt > ymax, bottomOutside = yb < ymin;
 				yt = topOutside ? ymax : yt;
 				yb = bottomOutside ? ymin : yb;
 				Graphics_line (g, x1 + horizontalOffset_wc, yb, x1 + horizontalOffset_wc, yt);
-				if (barWidth_wc > 0 && ! estimated) {
+				if (barWidth_wc > 0.0 && ! estimated) {
 					double xl = x1 - 0.5 * barWidth_wc + horizontalOffset_wc;
 					double xr = xl + barWidth_wc;
 					if (! topOutside) {
@@ -592,8 +650,8 @@ void DataModeler_drawTrack (DataModeler me, Graphics g, double xmin, double xmax
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
@@ -612,26 +670,27 @@ void DataModeler_speckle (DataModeler me, Graphics g, double xmin, double xmax,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
-Table DataModeler_to_Table_zscores (DataModeler me, int useSigmaY) {
+autoTable DataModeler_to_Table_zscores (DataModeler me, int useSigmaY) {
 	try {
-		autoTable ztable = Table_createWithColumnNames (my numberOfDataPoints, L"x z");
-		autoNUMvector<double> zscores (DataModeler_getZScores (me, useSigmaY), 1);
+		autoTable ztable = Table_createWithColumnNames (my numberOfDataPoints, U"x z");
+		autoNUMvector<double> zscores (1, my numberOfDataPoints);
+		DataModeler_getZScores (me, useSigmaY, zscores.peek());
 		for (long i = 1; i <= my numberOfDataPoints; i++) {
 			Table_setNumericValue (ztable.peek(), i, 1, my x[i]);
 			Table_setNumericValue (ztable.peek(), i, 2, zscores[i]);
 		}
-		return ztable.transfer();
+		return ztable;
 	} catch (MelderError) {
-		Melder_throw ("Table not created.");
+		Melder_throw (U"Table not created.");
 	}	
 }
 
-void DataModeler_normalProbabilityPlot (DataModeler me, Graphics g, int useSigmaY, long numberOfQuantiles, double numberOfSigmas, int labelSize, const wchar_t *label, int garnish) {
+static void DataModeler_normalProbabilityPlot (DataModeler me, Graphics g, int useSigmaY, long numberOfQuantiles, double numberOfSigmas, int labelSize, const char32 *label, int garnish) {
 	try {
 		autoTable thee = DataModeler_to_Table_zscores (me, useSigmaY);
 		Table_normalProbabilityPlot (thee.peek(), g, 2, numberOfQuantiles, numberOfSigmas, labelSize, label, garnish);
@@ -645,8 +704,8 @@ void DataModeler_setBasisFunctions (DataModeler me, int type) {
 		my f_evaluate = legendre_evaluate;
 		my f_evaluateBasisFunctions = legendre_evaluateBasisFunctions;
 	} else {
-		my f_evaluate = polynome_evaluate;
-		my f_evaluateBasisFunctions = polynome_evaluateBasisFunctions;
+		my f_evaluate = polynomial_evaluate;
+		my f_evaluateBasisFunctions = polynomial_evaluateBasisFunctions;
 	}
 	my type = type;
 }
@@ -661,10 +720,10 @@ void  DataModeler_init (DataModeler me, double xmin, double xmax, long numberOfD
 	my dataPointStatus = NUMvector<int> (1, numberOfDataPoints);
 	my numberOfParameters = numberOfParameters;
 	if (numberOfParameters <= 0) {
-		Melder_throw ("The number of parameters must be greater than zero.");
+		Melder_throw (U"The number of parameters must be greater than zero.");
 	}
 	if (numberOfParameters > numberOfDataPoints) {
-		Melder_throw ("The number of parameters must be smaller than the number of data points");
+		Melder_throw (U"The number of parameters must be smaller than the number of data points");
 	}
 	my parameter = NUMvector<double> (1, numberOfParameters);
 	my parameterStatus = NUMvector<int> (1, numberOfParameters);
@@ -672,14 +731,42 @@ void  DataModeler_init (DataModeler me, double xmin, double xmax, long numberOfD
 	my parameterCovariances = Covariance_create (numberOfParameters);
 }
 
-DataModeler DataModeler_create (double xmin, double xmax, long numberOfDataPoints, long numberOfParameters, int type) {
+autoDataModeler DataModeler_create (double xmin, double xmax, long numberOfDataPoints, long numberOfParameters, int type) {
 	try {
 		autoDataModeler me = Thing_new (DataModeler);
 		DataModeler_init (me.peek(), xmin, xmax, numberOfDataPoints, numberOfParameters, type);
 		my xmin = xmin; my xmax = xmax;
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("DataModeler not created.");
+		Melder_throw (U"DataModeler not created.");
+	}
+}
+
+autoDataModeler DataModeler_createSimple (double xmin, double xmax, long numberOfDataPoints, char32 *parameters, double gaussianNoiseStd, int type) {
+	try {
+		long numberOfParameters;
+		autoNUMvector<double> parameter (NUMstring_to_numbers (parameters, &numberOfParameters), 1);
+		if (numberOfParameters < 1) {
+			Melder_throw (U"At least one parameter must be defined.");
+		}
+		if (xmin >= xmax) {
+			Melder_throw (U"The domain must be defined properly.");
+		}
+		autoDataModeler me = DataModeler_create (xmin, xmax, numberOfDataPoints, numberOfParameters, type);
+		for (long i = 1; i <= numberOfParameters; i++) {
+			my parameter[i] = parameter[i]; // parameter status ok
+		}
+		// generate the data that belong to the parameter values
+		for (long i = 1; i <= numberOfDataPoints; i++) {
+			my x[i] = xmin + (i - 0.5) * (xmax - xmin) / numberOfDataPoints;
+			double modelY = my f_evaluate (me.peek(), my x[i], my parameter);
+			my y[i] = modelY + NUMrandomGauss (0.0, gaussianNoiseStd);
+			my sigmaY[i] = NUMundefined;
+		}
+		my useSigmaY = DataModeler_DATA_WEIGH_EQUAL;
+		return me;
+	} catch (MelderError) {
+		Melder_throw (U"No simple DataModeler created.");
 	}
 }
 
@@ -699,7 +786,7 @@ void DataModeler_fit (DataModeler me)
 		// For function evaluation with only the FIXED parameters
 
 		for (long ipar = 1; ipar <= my numberOfParameters; ipar++) {
-			parameter[ipar] = my parameterStatus[ipar] == DataModeler_PARAMETER_FIXED ? my parameter[ipar] : 0;
+			parameter[ipar] = my parameterStatus[ipar] == DataModeler_PARAMETER_FIXED ? my parameter[ipar] : 0.0;
 		}
 
 		// estimate sigma if we weigh all datapoint equally. 
@@ -712,7 +799,7 @@ void DataModeler_fit (DataModeler me)
 				// function evaluation with only the FIXED parameters
 				double xi = my x[i], yi = my y[i];
 				double yFixed = my f_evaluate (me, xi, parameter.peek());
-				double si = my useSigmaY != DataModeler_DATA_WEIGH_EQUAL ? DataModeler_getDataPointWeight (me, i, my useSigmaY) : sigmaY;
+				double si = my useSigmaY != DataModeler_DATA_WEIGH_EQUAL ? DataModeler_getDataPointInverseWeight (me, i, my useSigmaY) : sigmaY;
 
 				// individual terms of the function
 
@@ -736,7 +823,7 @@ void DataModeler_fit (DataModeler me)
 		if (! NUMfpp) {
 			NUMmachar ();
 		}
-		SVD_zeroSmallSingularValues (thee.peek(), my tolerance > 0 ? my tolerance : numberOfDataPoints * NUMfpp -> eps);
+		SVD_zeroSmallSingularValues (thee.peek(), my tolerance > 0.0 ? my tolerance : numberOfDataPoints * NUMfpp -> eps);
 		SVD_solve (thee.peek(), b.peek(), parameter.peek()); // re-use parameter
 
 		// Put the calculated parameters at the correct position in 'my p'
@@ -756,13 +843,14 @@ void DataModeler_fit (DataModeler me)
 			// Set fixed parameters variances and covariances to zero.
 			for (long i = 1; i <= my numberOfParameters; i++) {
 				for (long j = i; j <= my numberOfParameters; j++) {
-					cov -> data[i][j] = cov -> data[j][i] = 0;
+					cov -> data[i][j] = cov -> data[j][i] = 0.0;
 				}
 			}
-			long ipar = 0, jpar;
+			ipar = 0;
 			for (long i = 1; i <= my numberOfParameters; i++) {
 				if (my parameterStatus[i] != DataModeler_PARAMETER_FIXED) {
-					jpar = 0; ipar++;
+					long jpar = 0;
+					ipar++;
 					for (long j = 1; j <= my numberOfParameters; j++) {
 						if (my parameterStatus[j] != DataModeler_PARAMETER_FIXED) {
 							jpar++;
@@ -775,7 +863,7 @@ void DataModeler_fit (DataModeler me)
 			SVD_getSquared (thee.peek(), cov -> data, true);
 		}
 	} catch (MelderError) {
-		Melder_throw ("DataModeler no fit.");
+		Melder_throw (U"DataModeler no fit.");
 	}
 }
 
@@ -786,16 +874,16 @@ void DataModeler_setDataWeighing (DataModeler me, int useSigmaY) {
 	}
 }
 
-Covariance DataModeler_to_Covariance_parameters (DataModeler me) {
+autoCovariance DataModeler_to_Covariance_parameters (DataModeler me) {
 	try {
 		autoCovariance cov = (Covariance) Data_copy (my parameterCovariances);
-		return cov.transfer();
+		return cov;
 	} catch (MelderError) {
-		Melder_throw ("Covariance not created.");
+		Melder_throw (U"Covariance not created.");
 	}
 }
 
-DataModeler Table_to_DataModeler (Table me, double xmin, double xmax, long xcolumn, long ycolumn, long scolumn, long numberOfParameters, int type) {
+autoDataModeler Table_to_DataModeler (Table me, double xmin, double xmax, long xcolumn, long ycolumn, long scolumn, long numberOfParameters, int type) {
 	try {
 		Table_checkSpecifiedColumnNumberWithinRange (me, xcolumn);
 		Table_checkSpecifiedColumnNumberWithinRange (me, ycolumn);
@@ -811,9 +899,9 @@ DataModeler Table_to_DataModeler (Table me, double xmin, double xmax, long xcolu
 				numberOfData++; x[numberOfData] = val;
 				if (numberOfData > 1) {
 					if (val < x[numberOfData - 1]) {
-						Melder_throw ("Data with x-values must be sorted.");
+						Melder_throw (U"Data with x-values must be sorted.");
 					} else if (val == x[numberOfData - 1]) {
-						Melder_throw ("All x-values must be different.");
+						Melder_throw (U"All x-values must be different.");
 					}
 				}
 				y[numberOfData] = Table_getNumericValue_Assert (me, i, ycolumn);
@@ -824,7 +912,7 @@ DataModeler Table_to_DataModeler (Table me, double xmin, double xmax, long xcolu
 			NUMvector_extrema<double> (x.peek(), 1, numberOfData, &xmin, &xmax);
 		}
 		if (xmin >= xmax) {
-			Melder_throw ("Range of x-values too small.");
+			Melder_throw (U"Range of x-values too small.");
 		}
 		long numberOfDataPoints = 0, validData = 0;
 		for (long i = 1; i <= numberOfData; i++) {
@@ -850,13 +938,13 @@ DataModeler Table_to_DataModeler (Table me, double xmin, double xmax, long xcolu
 		thy numberOfDataPoints = numberOfDataPoints;
 		thy tolerance = 1e-5;
 		if (validData < numberOfParameters) {
-			Melder_throw ("The number of parameters must not exceed the number of data points.");
+			Melder_throw (U"The number of parameters must not exceed the number of data points.");
 		}
 		DataModeler_setDataWeighing (thee.peek(), DataModeler_DATA_WEIGH_SIGMA);
 		DataModeler_fit (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("Datamodeler not created from Table.");
+		Melder_throw (U"Datamodeler not created from Table.");
 	}
 }
 
@@ -864,20 +952,20 @@ Thing_implement (FormantModeler, Function, 0);
 
 void structFormantModeler :: v_info () {
 
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	for (long iformant = 1; iformant <= datamodelers -> size; iformant++) {
-		DataModeler ffi = (DataModeler) datamodelers -> item[iformant];
-		MelderInfo_writeLine (L"Formant ", Melder_integer (iformant));
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
+	for (long iformant = 1; iformant <= trackmodelers -> size; iformant++) {
+		DataModeler ffi = (DataModeler) trackmodelers -> item[iformant];
+		MelderInfo_writeLine (U"Formant ", iformant);
 		ffi -> v_info();
 	}
 }
 
 double DataModeler_getResidualSumOfSquares (DataModeler me, long *numberOfDataPoints) {
 	long n = 0;
-	double rss = 0;
+	double rss = 0.0;
 	for (long i = 1; i <= my numberOfDataPoints; i++) {
 		if (my dataPointStatus[i] != DataModeler_DATA_INVALID) {
 				++n;
@@ -888,7 +976,7 @@ double DataModeler_getResidualSumOfSquares (DataModeler me, long *numberOfDataPo
 	if (numberOfDataPoints) {
 		*numberOfDataPoints = n;
 	}
-	return rss;
+	return n > 0 ? rss : NUMundefined;
 }
 
 double DataModeler_estimateSigmaY (DataModeler me) {
@@ -901,18 +989,18 @@ double DataModeler_estimateSigmaY (DataModeler me) {
 			}
 		}
 		double variance;
-		NUMvector_avevar (y.peek(), numberOfDataPoints, NULL, &variance);
+		NUMvector_avevar (y.peek(), numberOfDataPoints, nullptr, &variance);
 		double sigma = NUMdefined (variance) ? sqrt (variance / (numberOfDataPoints - 1)) : NUMundefined;
 		return sigma;
 	} catch (MelderError) {
-		Melder_throw ("Cannot estimate sigma.");
+		Melder_throw (U"Cannot estimate sigma.");
 	}
 }
 
 double FormantModeler_getStandardDeviation (FormantModeler me, long iformant) {
 	double sigma = NUMundefined;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		sigma = DataModeler_estimateSigmaY (ff);
 	}
 	return sigma;
@@ -920,40 +1008,40 @@ double FormantModeler_getStandardDeviation (FormantModeler me, long iformant) {
 
 double FormantModeler_getDataPointValue (FormantModeler me, long iformant, long index) {
 	double value = NUMundefined;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		value = DataModeler_getDataPointValue (ff, index);
 	}
 	return value;
 }
 
 void FormantModeler_setDataPointValue (FormantModeler me, long iformant, long index, double value) {
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
  		DataModeler_setDataPointValue (ff, index, value);
 	}
 }
 
 double FormantModeler_getDataPointSigma (FormantModeler me, long iformant, long index) {
 	double sigma = NUMundefined;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		sigma = DataModeler_getDataPointSigma (ff, index);
 	}
 	return sigma;
 }
 
 void FormantModeler_setDataPointSigma (FormantModeler me, long iformant, long index, double sigma) {
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
  		DataModeler_setDataPointSigma (ff, index, sigma);
 	}
 }
 
 int FormantModeler_getDataPointStatus (FormantModeler me, long iformant, long index) {
 	int value = DataModeler_DATA_INVALID;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		value = DataModeler_getDataPointStatus (ff, index);
 	}
 	return value;
@@ -961,60 +1049,60 @@ int FormantModeler_getDataPointStatus (FormantModeler me, long iformant, long in
 
 void FormantModeler_setDataPointStatus (FormantModeler me, long iformant, long index, int status)
 {
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		DataModeler_setDataPointStatus (ff, index, status);
 	}
 }
 
-void FormantModeler_setDataPointValueAndStatus (FormantModeler me, long iformant, long index, double value, int dataStatus)
+static void FormantModeler_setDataPointValueAndStatus (FormantModeler me, long iformant, long index, double value, int dataStatus)
 {
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		DataModeler_setDataPointValueAndStatus (ff, index, value, dataStatus);
 	}
 }
 
 void FormantModeler_setParameterValueFixed (FormantModeler me, long iformant, long index, double value) {
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
 		DataModeler_setParameterValueFixed (ffi, index, value);
 	}
 }
 
 void FormantModeler_setParametersFree (FormantModeler me, long fromFormant, long toFormant, long fromIndex, long toIndex) {
-	long numberOfFormants = my datamodelers -> size;
+	long numberOfFormants = my trackmodelers -> size;
 	if (toFormant < fromFormant || (fromFormant == toFormant && fromFormant == 0)) {
 		fromFormant = 1; toFormant= numberOfFormants;
 	}
 	if (! (toFormant >= 1 && toFormant <= numberOfFormants && fromFormant >= 1 && fromFormant <= numberOfFormants &&
 		fromFormant <= toFormant)) {
-		Melder_throw ("Formant number(s) must be in the interval [1, ", Melder_integer (numberOfFormants), "].");
+		Melder_throw (U"Formant number(s) must be in the interval [1, ", numberOfFormants, U"].");
 	}
 	for (long iformant = fromFormant; iformant <= toFormant; iformant++) {
-		DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
+		DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
 		DataModeler_setParametersFree (ffi, fromIndex, toIndex);
 	}
 }
 
 void FormantModeler_setDataWeighing (FormantModeler me, long fromFormant, long toFormant, int useSigmaY) {
-	long numberOfFormants = my datamodelers -> size;
+	long numberOfFormants = my trackmodelers -> size;
 	if (toFormant < fromFormant || (fromFormant == toFormant && fromFormant == 0)) {
 		fromFormant = 1; toFormant= numberOfFormants;
 	}
 	if (! (toFormant >= 1 && toFormant <= numberOfFormants && fromFormant >= 1 && fromFormant <= numberOfFormants &&
 		fromFormant <= toFormant)) {
-		Melder_throw ("Formant number(s) must be in the interval [1, ", Melder_integer (numberOfFormants), "].");
+		Melder_throw (U"Formant number(s) must be in the interval [1, ", numberOfFormants, U"].");
 	}
 	for (long iformant = fromFormant; iformant <= toFormant; iformant++) {
-		DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
+		DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
 		DataModeler_setDataWeighing (ffi, useSigmaY);
 	}
 }
 
 void FormantModeler_fit (FormantModeler me) {
-	for (long iformant = 1; iformant <= my datamodelers -> size; iformant++) {
-		DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
+	for (long iformant = 1; iformant <= my trackmodelers -> size; iformant++) {
+		DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
 		DataModeler_fit (ffi);
 	}
 }
@@ -1024,29 +1112,127 @@ void FormantModeler_drawBasisFunction (FormantModeler me, Graphics g, double tmi
 	if (tmax <= tmin) {
 		tmin = my xmin; tmax = my xmax; 
 	}
-	if (iformant < 1 || iformant > my datamodelers -> size) {
+	if (iformant < 1 || iformant > my trackmodelers -> size) {
 		return;
 	}
 	Graphics_setInner (g);
-	DataModeler ffi =  (DataModeler) my datamodelers -> item[iformant];
+	DataModeler ffi =  (DataModeler) my trackmodelers -> item[iformant];
 	DataModeler_drawBasisFunction_inside (ffi, g, tmin, tmax, fmin, fmax, iterm, scaled, numberOfPoints);
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_inqWindow (g, &tmin, &tmax, &fmin, &fmax);
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_textLeft (g, 1, (scaled ? L"Frequency (Hz)" : L"Amplitude"));
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_markLeft (g, fmin, 1, 1, 0, L"");
-		Graphics_markLeft (g, fmax, 1, 1, 0, L"");
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_textLeft (g, true, (scaled ? U"Frequency (Hz)" : U"Amplitude"));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_markLeft (g, fmin, true, true, false, U"");
+		Graphics_markLeft (g, fmax, true, true, false, U"");
+	}
+}
+
+static long FormantModeler_drawingSpecifiers_x (FormantModeler me, double *xmin, double *xmax, long *ixmin, long *ixmax) {
+	DataModeler fm = (DataModeler) my trackmodelers -> item[1];
+	return DataModeler_drawingSpecifiers_x (fm, xmin, xmax, ixmin, ixmax);
+}
+
+static void FormantModeler_getCumulativeChiScores (FormantModeler me, int useSigmaY, double chisq[]) {
+	try {
+		long numberOfDataPoints = FormantModeler_getNumberOfDataPoints (me);
+		long numberOfFormants = my trackmodelers -> size;
+		autoNUMvector<double> zscores (1, numberOfDataPoints);
+		for (long iformant = 1; iformant <= numberOfFormants; iformant++) {
+			DataModeler fm = (DataModeler) my trackmodelers -> item[iformant];
+			DataModeler_getZScores (fm, useSigmaY, zscores.peek());
+			DataModeler_getChisqScoresFromZScores (fm, zscores.peek(), true, zscores.peek()); // undefined -> average
+			for (long i = 1; i <= numberOfDataPoints; i++) {
+				chisq[i] += zscores[i];
+			}
+		}
+	} catch (MelderError) {
+		Melder_throw (me, U"cannot determine cummulative chi squares.");
+	}
+}
+
+void FormantModeler_drawVariancesOfShiftedTracks (FormantModeler me, Graphics g, double xmin, double xmax,
+	double ymin, double ymax, int shiftDirection, long fromFormant, long toFormant, int garnish) {
+	try {
+		long ixmin, ixmax;
+		if (FormantModeler_drawingSpecifiers_x (me, &xmin, &xmax, &ixmin, &ixmax) < 1) {
+			Melder_throw (me, U" not enough data points in drawing range.");
+		}
+		long numberOfDataPoints = FormantModeler_getNumberOfDataPoints (me);
+		autoNUMvector<double> var (1, numberOfDataPoints);
+		autoNUMvector<double> varShifted (1, numberOfDataPoints);
+		FormantModeler_getSumOfVariancesBetweenShiftedAndEstimatedTracks (me, shiftDirection, &fromFormant, &toFormant, varShifted.peek());
+		FormantModeler_getSumOfVariancesBetweenShiftedAndEstimatedTracks (me, 0, &fromFormant, &toFormant, var.peek());
+		for (long i = ixmin + 1; i <= ixmax; i++) {
+			if (NUMdefined (varShifted[i]) && NUMdefined (var[i])) {
+				var[i] -= varShifted[i];
+			}
+		}
+		if (ymax <= ymin) {
+			NUMvector_extrema<double> (var.peek(), ixmin, ixmax, &ymin, &ymax);
+		}
+		Graphics_setInner (g);
+		Graphics_setWindow (g, xmin, xmax, ymin, ymax);
+		DataModeler thee = (DataModeler) my trackmodelers -> item[1];
+		while (! NUMdefined (var[ixmin]) && ixmin <= ixmax) {
+			ixmin++;
+		}
+		double xp = thy x[ixmin], yp = var[ixmin];
+		for (long i = ixmin + 1; i <= ixmax; i++) {
+			if (NUMdefined (var[i])) {
+				Graphics_line (g, xp, yp, thy x[i], var[i]);
+				xp = thy x[i]; yp = var[i];
+			}
+		}
+		Graphics_unsetInner (g);
+		if (garnish) {
+			Graphics_drawInnerBox (g);
+			Graphics_marksBottom (g, 2, true, true, false);
+			Graphics_marksLeft (g, 2, true, true, false);
+		}
+
+	} catch (MelderError) {
+		Melder_clearError ();
+	}
+}
+
+
+void FormantModeler_drawCumulativeChiScores (FormantModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax, int useSigmaY, int garnish) {
+	try {
+		long ixmin, ixmax;
+		if (FormantModeler_drawingSpecifiers_x (me, &xmin, &xmax, &ixmin, &ixmax) < 1) {
+			Melder_throw (me, U" not enough data points in drawing range.");
+		}
+		long numberOfDataPoints = FormantModeler_getNumberOfDataPoints (me);
+		autoNUMvector<double> chisq (1, numberOfDataPoints);
+		FormantModeler_getCumulativeChiScores (me, useSigmaY, chisq.peek());
+		if (ymax <= ymin) {
+			NUMvector_extrema<double> (chisq.peek(), ixmin, ixmax, &ymin, &ymax);
+		}
+		Graphics_setInner (g);
+		Graphics_setWindow (g, xmin, xmax, ymin, ymax);
+		DataModeler thee = (DataModeler) my trackmodelers -> item[1];
+		for (long i = ixmin + 1; i <= ixmax; i++) {
+			Graphics_line (g, thy x[i-1], chisq[i-1], thy x[i], chisq[i]);
+		}
+		Graphics_unsetInner (g);
+		if (garnish) {
+			Graphics_drawInnerBox (g);
+			Graphics_marksBottom (g, 2, true, true, false);
+			Graphics_marksLeft (g, 2, true, true, false);
+		}
+	} catch (MelderError) {
+		//
 	}
 }
 
-void FormantModeler_drawOutliersMarked (FormantModeler me, Graphics g, double tmin, double tmax, double fmax, long fromTrack, long toTrack, double numberOfSigmas, int useSigmaY, wchar_t *mark, int marksFontSize, double horizontalOffset_mm, int garnish) {
+void FormantModeler_drawOutliersMarked (FormantModeler me, Graphics g, double tmin, double tmax, double fmax, long fromTrack, long toTrack, double numberOfSigmas, int useSigmaY, char32 *mark, int marksFontSize, double horizontalOffset_mm, int garnish) {
 	if (tmax <= tmin) { 
 		tmin = my xmin; tmax = my xmax; 
 	}
-	long maxTrack = my datamodelers -> size;
+	long maxTrack = my trackmodelers -> size;
 	if (toTrack == 0 && fromTrack == 0) {
 		fromTrack = 1; toTrack = maxTrack;
 	}
@@ -1057,7 +1243,7 @@ void FormantModeler_drawOutliersMarked (FormantModeler me, Graphics g, double tm
 	Graphics_setInner (g);
 	int currectFontSize = Graphics_inqFontSize (g);
 	for (long iformant = fromTrack; iformant <= toTrack; iformant++) {
-		DataModeler ffi =  (DataModeler) my datamodelers -> item[iformant];
+		DataModeler ffi =  (DataModeler) my trackmodelers -> item[iformant];
 		double xOffset_mm = (iformant % 2 == 1) ? horizontalOffset_mm : -horizontalOffset_mm;
 		DataModeler_drawOutliersMarked_inside (ffi, g, tmin, tmax, 0, fmax, numberOfSigmas, useSigmaY, mark, marksFontSize, xOffset_mm);
 	}
@@ -1065,24 +1251,24 @@ void FormantModeler_drawOutliersMarked (FormantModeler me, Graphics g, double tm
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_textLeft (g, 1, L"Formant frequency (Hz)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1.0, 1000.0, 1, 1, 1);
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_textLeft (g, true, U"Formant frequency (Hz)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, 1000.0, true, true, true);
 	}
 }
 
-void FormantModeler_normalProbabilityPlot (FormantModeler me, Graphics g, long iformant, int useSigmaY, long numberOfQuantiles, double numberOfSigmas, int labelSize, const wchar_t *label, int garnish) {
-	if (iformant > 0 || iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers ->item[iformant];
+void FormantModeler_normalProbabilityPlot (FormantModeler me, Graphics g, long iformant, int useSigmaY, long numberOfQuantiles, double numberOfSigmas, int labelSize, const char32 *label, int garnish) {
+	if (iformant > 0 || iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers ->item[iformant];
 		DataModeler_normalProbabilityPlot (ff, g, useSigmaY, numberOfQuantiles, numberOfSigmas, labelSize, label, garnish);
 	}
 }
 
-void FormantModeler_drawTracks_inside (FormantModeler me, Graphics g, double xmin, double xmax, double fmax,
+static void FormantModeler_drawTracks_inside (FormantModeler me, Graphics g, double xmin, double xmax, double fmax,
 	long fromTrack, long toTrack, int estimated, long numberOfParameters, double horizontalOffset_mm) {
 	for (long iformant = fromTrack; iformant <= toTrack; iformant++) {
-		DataModeler ffi =  (DataModeler) my datamodelers -> item[iformant];
+		DataModeler ffi =  (DataModeler) my trackmodelers -> item[iformant];
 		double xOffset_mm = (iformant % 2 == 1) ? horizontalOffset_mm : -horizontalOffset_mm;
 		DataModeler_drawTrack_inside (ffi, g, xmin, xmax, 0, fmax, estimated, numberOfParameters, xOffset_mm);
 	}
@@ -1093,7 +1279,7 @@ void FormantModeler_drawTracks (FormantModeler me, Graphics g, double tmin, doub
 	if (tmax <= tmin) { 
 		tmin = my xmin; tmax = my xmax; 
 	}
-	long maxTrack = my datamodelers -> size;
+	long maxTrack = my trackmodelers -> size;
 	if (toTrack == 0 && fromTrack == 0) {
 		fromTrack = 1; toTrack = maxTrack;
 	}
@@ -1106,17 +1292,17 @@ void FormantModeler_drawTracks (FormantModeler me, Graphics g, double tmin, doub
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_textLeft (g, 1, L"Formant frequency (Hz)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1.0, 1000.0, 1, 1, 1);
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_textLeft (g, true, U"Formant frequency (Hz)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, 1000.0, true, true, true);
 	}
 }
 
 void FormantModeler_speckle_inside (FormantModeler me, Graphics g, double xmin, double xmax, double fmax,
 	long fromTrack, long toTrack, int estimated, long numberOfParameters, int errorBars, double barWidth_mm, double horizontalOffset_mm) {
 	for (long iformant = fromTrack; iformant <= toTrack; iformant++) {
-		DataModeler ffi =  (DataModeler) my datamodelers -> item[iformant];
+		DataModeler ffi =  (DataModeler) my trackmodelers -> item[iformant];
 		double xOffset_mm = (iformant % 2 == 1) ? horizontalOffset_mm : -horizontalOffset_mm;
 		DataModeler_speckle_inside (ffi, g, xmin, xmax, 0, fmax, estimated, numberOfParameters, errorBars, barWidth_mm, xOffset_mm);
 	}
@@ -1127,7 +1313,7 @@ void FormantModeler_speckle (FormantModeler me, Graphics g, double tmin, double
 	if (tmax <= tmin) { 
 		tmin = my xmin; tmax = my xmax; 
 	}
-	long maxTrack = my datamodelers -> size;
+	long maxTrack = my trackmodelers -> size;
 	if (toTrack == 0 && fromTrack == 0) {
 		fromTrack = 1; toTrack = maxTrack;
 	}
@@ -1140,41 +1326,50 @@ void FormantModeler_speckle (FormantModeler me, Graphics g, double tmin, double
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_textLeft (g, 1, L"Formant frequency (Hz)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1.0, 1000.0, 1, 1, 1);
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_textLeft (g, true, U"Formant frequency (Hz)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, 1000.0, true, true, true);
 	}
 }
 
-FormantModeler FormantModeler_create (double tmin, double tmax, long numberOfFormants, long numberOfDataPoints, long numberOfParameters) {
+autoFormantModeler FormantModeler_create (double tmin, double tmax, long numberOfFormants, long numberOfDataPoints, long numberOfParameters) {
 	try {
 		autoFormantModeler me = Thing_new (FormantModeler);
 		my xmin = tmin; my xmax = tmax;
-		my datamodelers = Ordered_create ();
+		my trackmodelers = Ordered_create ();
 		for (long itrack = 1; itrack <= numberOfFormants; itrack++) {
 			autoDataModeler ff = DataModeler_create (tmin, tmax, numberOfDataPoints, numberOfParameters,  DataModeler_TYPE_LEGENDRE);
-			Collection_addItem (my datamodelers, ff.transfer());
+			Collection_addItem (my trackmodelers, ff.transfer());
 		}
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("FormantModeler not created.");
+		Melder_throw (U"FormantModeler not created.");
 	}
 }
 
 double FormantModeler_getModelValueAtTime (FormantModeler me, long iformant, double time) {
 	double f = NUMundefined;
-	if (iformant >= 1 && iformant <= my datamodelers -> size) {
-		DataModeler thee =  (DataModeler) my datamodelers -> item[iformant];
+	if (iformant >= 1 && iformant <= my trackmodelers -> size) {
+		DataModeler thee =  (DataModeler) my trackmodelers -> item[iformant];
 		f =  DataModeler_getModelValueAtX (thee, time);
 	}
 	return f;
 }
 
+double FormantModeler_getModelValueAtIndex (FormantModeler me, long iformant, long index) {
+	double f = NUMundefined;
+	if (iformant >= 1 && iformant <= my trackmodelers -> size) {
+		DataModeler thee =  (DataModeler) my trackmodelers -> item[iformant];
+		f =  DataModeler_getModelValueAtIndex (thee, index);
+	}
+	return f;
+}
+
 double FormantModeler_getWeightedMean (FormantModeler me, long iformant) {
 	double f = NUMundefined;
-	if (iformant >= 1 && iformant <= my datamodelers -> size) {
-		DataModeler thee =  (DataModeler) my datamodelers -> item[iformant];
+	if (iformant >= 1 && iformant <= my trackmodelers -> size) {
+		DataModeler thee =  (DataModeler) my trackmodelers -> item[iformant];
 		f =  DataModeler_getWeightedMean (thee);
 	}
 	return f;
@@ -1183,8 +1378,8 @@ double FormantModeler_getWeightedMean (FormantModeler me, long iformant) {
 
 long FormantModeler_getMaximumNumberOfParameters (FormantModeler me) {
 	long maxnum = 1;
-	for (long i = 1; i <= my datamodelers -> size; i++) {
-		DataModeler ffi = (DataModeler) my datamodelers -> item[i];
+	for (long i = 1; i <= my trackmodelers -> size; i++) {
+		DataModeler ffi = (DataModeler) my trackmodelers -> item[i];
 		if (ffi -> numberOfParameters > maxnum) {
 			maxnum = ffi -> numberOfParameters;
 		}
@@ -1193,13 +1388,13 @@ long FormantModeler_getMaximumNumberOfParameters (FormantModeler me) {
 }
 
 long FormantModeler_getNumberOfTracks (FormantModeler me) {
-	return my datamodelers -> size;
+	return my trackmodelers -> size;
 }
 
 long FormantModeler_getNumberOfParameters (FormantModeler me, long iformant) {
 	long numberOfParameters = 0;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		numberOfParameters = ff -> numberOfParameters;
 	}
 	return numberOfParameters;
@@ -1207,28 +1402,19 @@ long FormantModeler_getNumberOfParameters (FormantModeler me, long iformant) {
 
 long FormantModeler_getNumberOfFixedParameters (FormantModeler me, long iformant) {
 	long numberOfParameters = 0;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		numberOfParameters = ff -> numberOfParameters;
 		numberOfParameters -= DataModeler_getNumberOfFreeParameters (ff);
 	}
 	return numberOfParameters;
 }
 
-long FormantModeler_getNumberOfDataPoints (FormantModeler me, long iformant) {
-	long numberOfDataPoints = 0;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
-		numberOfDataPoints = ff -> numberOfDataPoints;
-	}
-	return numberOfDataPoints;
-}
-
 
 long FormantModeler_getNumberOfInvalidDataPoints (FormantModeler me, long iformant) {
 	long numberOfInvalidDataPoints = 0;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		numberOfInvalidDataPoints = DataModeler_getNumberOfInvalidDataPoints (ff);
 	}
 	return numberOfInvalidDataPoints;
@@ -1236,8 +1422,8 @@ long FormantModeler_getNumberOfInvalidDataPoints (FormantModeler me, long iforma
 
 double FormantModeler_getParameterValue (FormantModeler me, long iformant, long iparameter) {
 	double value = NUMundefined;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		value = DataModeler_getParameterValue (ff, iparameter);
 	}
 	return value;
@@ -1245,8 +1431,8 @@ double FormantModeler_getParameterValue (FormantModeler me, long iformant, long
 
 int FormantModeler_getParameterStatus (FormantModeler me, long iformant, long index) {
 	int status = DataModeler_PARAMETER_UNDEFINED;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		status = DataModeler_getParameterStatus (ff, index);
 	}
 	return status;
@@ -1254,17 +1440,17 @@ int FormantModeler_getParameterStatus (FormantModeler me, long iformant, long in
 
 double FormantModeler_getParameterStandardDeviation ( FormantModeler me, long iformant, long index) {
 	double stdev = NUMundefined;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		stdev = DataModeler_getParameterStandardDeviation (ff, index);
 	}
 	return stdev;
 }
 
 double FormantModeler_getDegreesOfFreedom (FormantModeler me, long iformant) {
-	double dof = 0;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	double dof = 0.0;
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		dof = DataModeler_getDegreesOfFreedom (ff);
 	}
 	return dof;
@@ -1272,94 +1458,97 @@ double FormantModeler_getDegreesOfFreedom (FormantModeler me, long iformant) {
 
 double FormantModeler_getVarianceOfParameters (FormantModeler me, long fromFormant, long toFormant, long fromIndex, long toIndex, long *numberOfFreeParameters) {
 	double variance = NUMundefined;
-	long numberOfFormants = my datamodelers -> size, numberOfParameters = 0, nofp;
+	long numberOfFormants = my trackmodelers -> size, numberOfParameters = 0, nofp;
 	if (toFormant < fromFormant || (toFormant == 0 && fromFormant == 0)) {
 		fromFormant = 1; toFormant = numberOfFormants;
 	}
 	if (fromFormant <= toFormant && fromFormant > 0 && toFormant <= numberOfFormants) {
-		variance = 0;
+		variance = 0.0;
 		for (long iformant = fromFormant; iformant <= toFormant; iformant++) {
-			DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+			DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 			variance += DataModeler_getVarianceOfParameters (ff, fromIndex, toIndex, &nofp);
 			numberOfParameters += nofp;
 		}
 	}
-	if (numberOfFreeParameters != NULL) {
+	if (numberOfFreeParameters) {
 		*numberOfFreeParameters = numberOfParameters;
 	}
 	return variance;
 }
 
 long FormantModeler_getNumberOfDataPoints (FormantModeler me) {
-	DataModeler thee = (DataModeler) my datamodelers -> item[1];
+	DataModeler thee = (DataModeler) my trackmodelers -> item[1];
+	// all tracks have the same number of data points
 	return thy numberOfDataPoints;
 }
 
-Table FormantModeler_to_Table_zscores (FormantModeler me, int useSigmaY) {
+autoTable FormantModeler_to_Table_zscores (FormantModeler me, int useSigmaY) {
 	try {
-		long icolt = 1, numberOfFormants = my datamodelers -> size;
+		long icolt = 1, numberOfFormants = my trackmodelers -> size;
 		long numberOfDataPoints = FormantModeler_getNumberOfDataPoints (me);
-		autoMelderString columnLabel;
+		autoNUMvector<double> zscores (1, numberOfDataPoints);
 		autoTable ztable = Table_createWithoutColumnNames (numberOfDataPoints, numberOfFormants + 1);
-		Table_setColumnLabel (ztable.peek(), icolt, L"time");
+		Table_setColumnLabel (ztable.peek(), icolt, U"time");
 		for (long iformant = 1; iformant <= numberOfFormants; iformant++) {
 			long icolz = iformant + 1;
-			MelderString_append (&columnLabel, L"z", Melder_integer(iformant));
-			Table_setColumnLabel (ztable.peek(), icolz, columnLabel.string);
-			MelderString_empty (&columnLabel);
-			DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
+			Table_setColumnLabel (ztable.peek(), icolz, Melder_cat (U"z", iformant));
+			DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
 			if (iformant == 1) {
 				for (long i = 1; i <= numberOfDataPoints; i++) { // only once all tracks have same x-values
 				Table_setNumericValue (ztable.peek(), i, icolt, ffi -> x[i]);
 				}
 			}
-			autoNUMvector<double> zscores (DataModeler_getZScores (ffi, useSigmaY), 1);
+			DataModeler_getZScores (ffi, useSigmaY, zscores.peek());
 			for (long i = 1; i <= numberOfDataPoints; i++) {
 				Table_setNumericValue (ztable.peek(), i, icolz, zscores[i]);
 			}
 		}
-		return ztable.transfer();
+		return ztable;
 	} catch (MelderError) {
-		Melder_throw ("Table not created.");
+		Melder_throw (U"Table not created.");
 	}	
 }
 
-DataModeler FormantModeler_extractDataModeler (FormantModeler me, long iformant) {
+autoDataModeler FormantModeler_extractDataModeler (FormantModeler me, long iformant) {
 	try {
-		if (! (iformant > 0 && iformant <= my datamodelers -> size)) {
-			Melder_throw ("");
+		if (! (iformant > 0 && iformant <= my trackmodelers -> size)) {
+			Melder_throw (U"");
 		}
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		autoDataModeler thee = (DataModeler) Data_copy (ff);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("DataModeler not created.");
+		Melder_throw (U"DataModeler not created.");
 	}	
 }
 
-Covariance FormantModeler_to_Covariance_parameters (FormantModeler me, long iformant) {
+autoCovariance FormantModeler_to_Covariance_parameters (FormantModeler me, long iformant) {
 	try {
-		if (iformant < 1 || iformant > my datamodelers -> size) {
-			Melder_throw (L"The formant should be greater than zero and smaller than or equal to ", 
-				  Melder_integer (my datamodelers -> size));
+		if (iformant < 1 || iformant > my trackmodelers -> size) {
+			Melder_throw (U"The formant should be greater than zero and smaller than or equal to ", my trackmodelers -> size);
 		}
-		DataModeler thee = (DataModeler) my datamodelers -> item[iformant];
+		DataModeler thee = (DataModeler) my trackmodelers -> item[iformant];
 		autoCovariance cov = (Covariance) Data_copy (thy parameterCovariances);
-		return cov.transfer();
+		return cov;
 	} catch (MelderError) {
-		Melder_throw ("Covariance not created.");
+		Melder_throw (U"Covariance not created.");
 	}
 	
 }
 
 void FormantModeler_setTolerance (FormantModeler me, double tolerance) {
-	for (long iformant = 1; iformant <= my datamodelers -> size; iformant++) {
-		DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
+	for (long iformant = 1; iformant <= my trackmodelers -> size; iformant++) {
+		DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
 		DataModeler_setTolerance (ffi, tolerance);
 	}
 }
 
-FormantModeler Formant_to_FormantModeler (Formant me, double tmin, double tmax, long numberOfFormants, long numberOfParametersPerTrack, int bandwidthEstimatesSigma) {
+double FormantModeler_indexToTime (FormantModeler me, long index) {
+	DataModeler thee = (DataModeler) my trackmodelers -> item[1];
+	return index > 0 && index <= thy numberOfDataPoints ? thy x[index] : NUMundefined;
+}
+
+autoFormantModeler Formant_to_FormantModeler (Formant me, double tmin, double tmax, long numberOfFormants, long numberOfParametersPerTrack, int bandwidthEstimatesSigma) {
 	try {
 		long ifmin, ifmax, posInCollection = 0;
 		if (tmax <= tmin) {
@@ -1367,12 +1556,12 @@ FormantModeler Formant_to_FormantModeler (Formant me, double tmin, double tmax,
 		}
 		long numberOfDataPoints = Sampled_getWindowSamples (me, tmin, tmax, &ifmin, &ifmax);
 		if (numberOfDataPoints < numberOfParametersPerTrack) {
-			Melder_throw ("Not enought data points, extend the selection.");
+			Melder_throw (U"Not enought data points, extend the selection.");
 		}
 		autoFormantModeler thee = FormantModeler_create (tmin, tmax, numberOfFormants, numberOfDataPoints, numberOfParametersPerTrack);
 		for (long iformant = 1; iformant <= numberOfFormants; iformant++) {
 			posInCollection++;
-			DataModeler ffi = (DataModeler) thy datamodelers -> item[posInCollection];
+			DataModeler ffi = (DataModeler) thy trackmodelers -> item[posInCollection];
 			long idata = 0, validData = 0;
 			for (long iframe = ifmin; iframe <= ifmax; iframe++) {
 				Formant_Frame curFrame = & my d_frames[iframe];
@@ -1393,24 +1582,24 @@ FormantModeler Formant_to_FormantModeler (Formant me, double tmin, double tmax,
 			ffi -> numberOfDataPoints = idata;
 			ffi -> tolerance = 1e-5;
 			if (validData < numberOfParametersPerTrack) { // remove don't throw exception
-				Collection_removeItem (thy datamodelers, posInCollection);
+				Collection_removeItem (thy trackmodelers, posInCollection);
 				posInCollection--;
 			}
 		}
 		if (posInCollection == 0) {
-			Melder_throw ("Not enought data points in all the formants!");
+			Melder_throw (U"Not enought data points in all the formants!");
 		}
 		FormantModeler_fit (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("FormantModeler not created.");
+		Melder_throw (U"FormantModeler not created.");
 	}
 }
 
-Formant FormantModeler_to_Formant (FormantModeler me, int useEstimates, int estimateUndefineds) {
+autoFormant FormantModeler_to_Formant (FormantModeler me, int useEstimates, int estimateUndefineds) {
 	try {
-		long numberOfFormants = my datamodelers -> size;
-		DataModeler ff = (DataModeler) my datamodelers -> item[1];
+		long numberOfFormants = my trackmodelers -> size;
+		DataModeler ff = (DataModeler) my trackmodelers -> item[1];
 		long numberOfFrames = ff -> numberOfDataPoints;
 		double t1 = ff -> x[1], dt = ff -> x[2] -ff -> x[1];
 		autoFormant thee = Formant_create (my xmin, my xmax, numberOfFrames, dt, t1, numberOfFormants);
@@ -1422,11 +1611,11 @@ Formant FormantModeler_to_Formant (FormantModeler me, int useEstimates, int esti
 		}
 		for (long iframe = 1; iframe <= numberOfFrames; iframe++) {
 			Formant_Frame thyFrame = & thy d_frames [iframe];
-			thyFrame -> intensity = 1; //???
+			thyFrame -> intensity = 1.0; //???
 			thyFrame -> formant = NUMvector <structFormant_Formant> (1, numberOfFormants);
 			
 			for (long iformant = 1; iformant <= numberOfFormants; iformant++) {
-				DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
+				DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
 				double f = NUMundefined, b = f;
 				if (ffi -> dataPointStatus[iframe] != DataModeler_DATA_INVALID) {
 					f = useEstimates ? DataModeler_getModelValueAtX (ffi, ffi -> x[iframe]) : ffi -> y[iframe];
@@ -1441,32 +1630,36 @@ Formant FormantModeler_to_Formant (FormantModeler me, int useEstimates, int esti
 				thyFrame -> formant[iformant].bandwidth = b;
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("Cannot create Formant from FormantModeler.");
+		Melder_throw (U"Cannot create Formant from FormantModeler.");
 	}
 }
 
 double FormantModeler_getChiSquaredQ (FormantModeler me, long fromFormant, long toFormant, int useSigmaY, double *probability, double *ndf) {
-	double chisq = NUMundefined, ndfTotal = 0;
-	if (fromFormant == 0 && toFormant == 0) {
-		fromFormant = 1; toFormant = my datamodelers -> size;
+	double chisq = NUMundefined, ndfTotal = 0.0;
+	if (toFormant < fromFormant || (fromFormant == 0 && toFormant == 0)) {
+		fromFormant = 1; toFormant = my trackmodelers -> size;
 	}
-	if (fromFormant >= 1 && toFormant <= my datamodelers -> size) {
-		chisq = 0;
+	if (fromFormant >= 1 && toFormant <= my trackmodelers -> size) {
+		chisq = 0.0;
 		long numberOfDefined = 0;
 		for (long iformant= fromFormant; iformant <= toFormant; iformant++) {
-			DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
+			DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
 			double p, df, chisqi = DataModeler_getChiSquaredQ (ffi, useSigmaY, &p, &df);
 			if (NUMdefined (chisqi)) {
 				chisq += df * chisqi;
 				ndfTotal += df; numberOfDefined++;
 			}
 		}
-		if (numberOfDefined > 0) {
-			chisq *= numberOfDefined / ndfTotal;
-			if (ndf != NULL) { *ndf = ndfTotal; }
-			if (probability != NULL) { *probability = NUMchiSquareQ (chisq, ndfTotal); }
+		if (numberOfDefined == toFormant - fromFormant + 1) { // chisq of all tracks defined
+			chisq /= ndfTotal;
+			if (ndf) {
+				*ndf = ndfTotal;
+			}
+			if (probability) {
+				*probability = NUMchiSquareQ (chisq, ndfTotal);
+			}
 		}
 	}
 	return chisq;
@@ -1475,24 +1668,24 @@ double FormantModeler_getChiSquaredQ (FormantModeler me, long fromFormant, long
 double FormantModeler_getCoefficientOfDetermination (FormantModeler me, long fromFormant, long toFormant) {
 	double rSquared = NUMundefined;
 	if (fromFormant == 0 && toFormant == 0) {
-		fromFormant = 1; toFormant = my datamodelers -> size;
+		fromFormant = 1; toFormant = my trackmodelers -> size;
 	}
-	if (fromFormant >= 1 && toFormant <= my datamodelers -> size) {
-		double ssreg = 0, sstot = 0, ssregi, sstoti;
+	if (fromFormant >= 1 && toFormant <= my trackmodelers -> size) {
+		double ssreg = 0.0, sstot = 0.0, ssregi, sstoti;
 		for (long iformant= fromFormant; iformant <= toFormant; iformant++) {
-			DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
+			DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
 			DataModeler_getCoefficientOfDetermination (ffi, &ssregi, &sstoti);
 			sstot += sstoti; ssreg += ssregi;
 		}
-		rSquared = sstot > 0 ? ssreg / sstot : 1;
+		rSquared = sstot > 0.0 ? ssreg / sstot : 1.0;
 	}
 	return rSquared;
 }
 
 double FormantModeler_getResidualSumOfSquares (FormantModeler me, long iformant, long *numberOfDataPoints) {
 	double rss = NUMundefined;
-	if (iformant > 0 && iformant <= my datamodelers -> size) {
-		DataModeler ff = (DataModeler) my datamodelers -> item[iformant];
+	if (iformant > 0 && iformant <= my trackmodelers -> size) {
+		DataModeler ff = (DataModeler) my trackmodelers -> item[iformant];
 		rss = DataModeler_getResidualSumOfSquares (ff, numberOfDataPoints);
 	}
 	return rss;
@@ -1500,21 +1693,73 @@ double FormantModeler_getResidualSumOfSquares (FormantModeler me, long iformant,
 
 void FormantModeler_setParameterValuesToZero (FormantModeler me, long fromFormant, long toFormant, double numberOfSigmas) {
 	if (fromFormant == 0 && toFormant == 0) {
-		fromFormant = 1; toFormant = my datamodelers -> size;
+		fromFormant = 1; toFormant = my trackmodelers -> size;
 	}
-	if (fromFormant >= 1 && toFormant <= my datamodelers -> size) {
+	if (fromFormant >= 1 && toFormant <= my trackmodelers -> size) {
 		for (long iformant= fromFormant; iformant <= toFormant; iformant++) {
-			DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
+			DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
 			DataModeler_setParameterValuesToZero (ffi, numberOfSigmas);
 		}
 	}
 }
 
-FormantModeler FormantModeler_processOutliers (FormantModeler me, double numberOfSigmas, int useSigmaY) {
+void FormantModeler_getVariancesBetweenTrackAndEstimatedTrack (FormantModeler me, long iformant, long estimatedFormant, double var[]) {
+	long numberOfDataPoints = FormantModeler_getNumberOfDataPoints (me);
+	long numberOfFormants = my trackmodelers -> size;
+	
+	if (iformant < 1 || iformant > numberOfFormants || estimatedFormant < 1 || estimatedFormant > numberOfFormants) {
+		return;
+	}
+	DataModeler fi = (DataModeler) my trackmodelers -> item[iformant];
+	DataModeler fe = (DataModeler) my trackmodelers -> item[estimatedFormant];
+	for (long i = 1; i <= numberOfDataPoints; i++) {
+		var[i] = NUMundefined;
+		if (fi -> dataPointStatus[i] != DataModeler_DATA_INVALID) {
+			double ye = fe -> f_evaluate (fe, fe -> x[i], fe -> parameter);
+			double diff = ye - fi -> y[i];
+			var[i] = diff * diff;
+		}
+	}
+}
+
+void FormantModeler_getSumOfVariancesBetweenShiftedAndEstimatedTracks (FormantModeler me, int shiftDirection, long *fromFormant, long *toFormant, double var[]) {
 	try {
-		long numberOfFormants = my datamodelers -> size;
+		long numberOfFormants = my trackmodelers -> size;
+		if (*fromFormant < 1 || *fromFormant > numberOfFormants || *toFormant < 1 || *toFormant > numberOfFormants || *toFormant < *fromFormant) {
+			*toFormant = 1; *fromFormant = numberOfFormants;
+		}
+
+		long formantTrack = *fromFormant, estimatedFormantTrack = *fromFormant; // FormantModeler_NOSHIFT_TRACKS
+		if (shiftDirection == FormantModeler_DOWNSHIFT_TRACKS) {
+			estimatedFormantTrack = *fromFormant;
+			formantTrack = *fromFormant + 1;
+			*fromFormant = *fromFormant == 1 ? 2 : *fromFormant;
+		} else if (shiftDirection == FormantModeler_UPSHIFT_TRACKS) {
+			formantTrack = *fromFormant;
+			estimatedFormantTrack = *fromFormant + 1;
+			*toFormant = *toFormant == numberOfFormants ? numberOfFormants - 1 : *toFormant;
+		}
+		long numberOfDataPoints = FormantModeler_getNumberOfDataPoints (me);
+		autoNUMvector<double> vari (1, numberOfDataPoints);
+		for (long iformant = *fromFormant; iformant <= *toFormant; iformant++) {
+			FormantModeler_getVariancesBetweenTrackAndEstimatedTrack (me, formantTrack, estimatedFormantTrack, vari.peek());
+			for (long i = 1; i <= numberOfDataPoints; i++) {
+				if (NUMdefined (vari[i])) {
+					var[i] += vari[i];
+				}
+			}
+			formantTrack++; estimatedFormantTrack++;
+		}
+	} catch (MelderError) {
+		Melder_throw (me, U" cannot get variances.");
+	}
+}
+
+autoFormantModeler FormantModeler_processOutliers (FormantModeler me, double numberOfSigmas, int useSigmaY) {
+	try {
+		long numberOfFormants = my trackmodelers -> size;
 		if (numberOfFormants < 3) {
-			Melder_throw ("We need at least three formants to process outliers.");
+			Melder_throw (U"We need at least three formants to process outliers.");
 		}
 		long numberOfDataPoints = FormantModeler_getNumberOfDataPoints (me);
 		autoNUMvector<double> x (1, numberOfDataPoints); // also store x-values
@@ -1522,12 +1767,11 @@ FormantModeler FormantModeler_processOutliers (FormantModeler me, double numberO
 		// maybe some of the formants had NUMundefind's.
 
 		// 1. calculate z-scores for each formant and sort them in descending order
-		DataModeler ff = (DataModeler) my datamodelers -> item[1];
+		DataModeler ff = (DataModeler) my trackmodelers -> item[1];
 		NUMvector_copyElements<double> (ff -> x, x.peek(), 1, numberOfDataPoints);
 		for (long iformant = 1; iformant <= numberOfFormants; iformant++) {
-			DataModeler ffi = (DataModeler) my datamodelers -> item[iformant];
-			autoNUMvector<double> zscores (DataModeler_getZScores (ffi, useSigmaY), 1);
-			NUMvector_copyElements<double> (zscores.peek(), z[iformant], 1, numberOfDataPoints);
+			DataModeler ffi = (DataModeler) my trackmodelers -> item[iformant];
+			DataModeler_getZScores (ffi, useSigmaY, z[iformant]);
 		}
 		// 2. Do the manipulation in a copy
 		autoFormantModeler thee = (FormantModeler) Data_copy (me);
@@ -1541,27 +1785,27 @@ FormantModeler FormantModeler_processOutliers (FormantModeler me, double numberO
 					double f2 = FormantModeler_getDataPointValue (me, 1, i); // F1
 					double f3 = FormantModeler_getDataPointValue (me, 2, i); // F2
 					FormantModeler_setDataPointStatus (thee.peek(), 1, i, DataModeler_DATA_INVALID);
-					FormantModeler_setDataPointValueAndStatus (thee.peek(), 2, i, f2, FormantModeler_DATA_FROM_LOWER);
-					FormantModeler_setDataPointValueAndStatus (thee.peek(), 3, i, f3, FormantModeler_DATA_FROM_LOWER);
+					FormantModeler_setDataPointValueAndStatus (thee.peek(), 2, i, f2, FormantModeler_UPSHIFT_TRACKS);
+					FormantModeler_setDataPointValueAndStatus (thee.peek(), 3, i, f3, FormantModeler_UPSHIFT_TRACKS);
 				}
 			}
 		}
 		FormantModeler_fit (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("Cannot calculate track discontinuities");
+		Melder_throw (U"Cannot calculate track discontinuities");
 	}
 }
 
 double FormantModeler_getSmoothnessValue (FormantModeler me, long fromFormant, long toFormant, long numberOfParametersPerTrack, double power) {
 	double smoothness = NUMundefined;
-	if (toFormant >= fromFormant) {
-		fromFormant = 1; toFormant = my datamodelers -> size;
+	if (toFormant < fromFormant || (toFormant == 0 && fromFormant == 0)) {
+		fromFormant = 1; toFormant = my trackmodelers -> size;
 	}
-	if (fromFormant > 0 && fromFormant <= toFormant && toFormant <= my datamodelers -> size) {
+	if (fromFormant > 0 && fromFormant <= toFormant && toFormant <= my trackmodelers -> size) {
 		long nofp;
 		double ndof, var = FormantModeler_getVarianceOfParameters (me, fromFormant, toFormant, 1, numberOfParametersPerTrack, &nofp);
-		double chisq = FormantModeler_getChiSquaredQ (me, fromFormant, toFormant, TRUE, NULL, &ndof);
+		double chisq = FormantModeler_getChiSquaredQ (me, fromFormant, toFormant, true, nullptr, &ndof);
 		if (NUMdefined (var) && NUMdefined (chisq) && nofp > 0) {
 			smoothness = log10 (pow (var / nofp, power) * (chisq / ndof));
 		}
@@ -1574,11 +1818,12 @@ double FormantModeler_getAverageDistanceBetweenTracks (FormantModeler me, long t
 	if (track1 == track2) {
 		return 0;
 	}
-	if (track1 <= my datamodelers -> size && track2 <= my datamodelers -> size) {
-		DataModeler fi = (DataModeler) my datamodelers -> item[track1];
-		DataModeler fj = (DataModeler) my datamodelers -> item[track2];
+	if (track1 <= my trackmodelers -> size && track2 <= my trackmodelers -> size) {
+		DataModeler fi = (DataModeler) my trackmodelers -> item[track1];
+		DataModeler fj = (DataModeler) my trackmodelers -> item[track2];
 		// fi and fj have equal number of data points
-		long numberOfDataPoints = 0; diff = 0;
+		long numberOfDataPoints = 0;
+		diff = 0.0;
 		for (long i = 1; i <= fi -> numberOfDataPoints; i++) {
 			if (type != 0) {
 				double fie = fi -> f_evaluate (fi, fi -> x[i], fi -> parameter);
@@ -1596,18 +1841,21 @@ double FormantModeler_getAverageDistanceBetweenTracks (FormantModeler me, long t
 }
 
 double FormantModeler_getFormantsConstraintsFactor (FormantModeler me, double minF1, double maxF1, double minF2, double maxF2, double minF3) {
-	double f1 = FormantModeler_getParameterValue (me, 1, 1); // datamodelers -> item[1] -> parameter[1]
-	double minF1Factor = f1 > minF1 ? 1 : sqrt (minF1 - f1 + 1);
-	double maxF1Factor = f1 < maxF1 ? 1 : sqrt (f1 - maxF1 + 1);
-	double f2 = FormantModeler_getParameterValue (me, 2, 1); // datamodelers -> item[2] -> parameter[1]
-	double minF2Factor = f2 > minF2 ? 1 : sqrt (minF2 - f2 + 1);
-	double maxF2Factor = f2 < maxF2 ? 1 : sqrt (f2 - maxF2 + 1);
-	double f3 = FormantModeler_getParameterValue (me, 3, 1); // datamodelers -> item[3] -> parameter[1]
-	double minF3Factor = f3 > minF3 ? 1 : sqrt (minF3 - f3 + 1);
+	double f1 = FormantModeler_getParameterValue (me, 1, 1); // trackmodelers -> item[1] -> parameter[1]
+	double minF1Factor = f1 > minF1 ? 1 : sqrt (minF1 - f1 + 1.0);
+	double maxF1Factor = f1 < maxF1 ? 1 : sqrt (f1 - maxF1 + 1.0);
+	double f2 = FormantModeler_getParameterValue (me, 2, 1); // trackmodelers -> item[2] -> parameter[1]
+	double minF2Factor = f2 > minF2 ? 1 : sqrt (minF2 - f2 + 1.0);
+	double maxF2Factor = f2 < maxF2 ? 1 : sqrt (f2 - maxF2 + 1.0);
+	double f3 = FormantModeler_getParameterValue (me, 3, 1); // trackmodelers -> item[3] -> parameter[1]
+	double minF3Factor = f3 > minF3 ? 1 : sqrt (minF3 - f3 + 1.0);
 	return minF1Factor * maxF1Factor * minF2Factor * maxF2Factor * minF3Factor;
 }
 
-long Formants_getSmoothestInInterval (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack, int useBandWidthsForTrackEstimation, int useConstraints, double numberOfSigmas, double power, double minF1, double maxF1, double minF2, double maxF2, double minF3) {
+long Formants_getSmoothestInInterval (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack,
+	int useBandWidthsForTrackEstimation, int useConstraints, double numberOfSigmas, double power,
+	double minF1, double maxF1, double minF2, double maxF2, double minF3)
+{
 	try {
 		long numberOfFormantObjects = my size, minNumberOfFormants = 1000000;
 		if (numberOfFormantObjects == 1) {
@@ -1615,14 +1863,14 @@ long Formants_getSmoothestInInterval (Collection me, double tmin, double tmax, l
 		}
 		autoNUMvector<long> numberOfFormants (1, numberOfFormantObjects);
 		autoNUMvector<int> invalid (1, numberOfFormantObjects);
-		double tminf = 0, tmaxf = 0;
+		double tminf = 0.0, tmaxf = 0.0;
 		for (long iobject = 1; iobject <= numberOfFormantObjects; iobject++) {
 			// Check that all Formants have the same domain
 			Formant fi = (Formant) my item[iobject];
 			if (tminf == tmaxf) {
 				tminf = fi -> xmin; tmaxf = fi -> xmax;
 			} else if (fi -> xmin != tminf || fi -> xmax != tmaxf) {
-				Melder_throw ("All Formant objects must have the same starting and finishing times.");
+				Melder_throw (U"All Formant objects must have the same starting and finishing times.");
 			}
 			// Find the one that has least formant tracks
 			numberOfFormants[iobject] = Formant_getMaxNumFormants (fi);
@@ -1643,21 +1891,21 @@ long Formants_getSmoothestInInterval (Collection me, double tmin, double tmax, l
 				}
 			}
 			if (numberOfInvalids == numberOfFormantObjects) {
-				Melder_throw ("None of the Formants has enough formant tracks. Lower your upper formant number.");
+				Melder_throw (U"None of the Formants has enough formant tracks. Lower your upper formant number.");
 			}
 		}
 		if (tmax <= tmin) { // default
 			tmin = tminf; tmax = tmaxf;
 		}
 		if (! (tmin >= tminf && tmax <= tmaxf)) {
-			Melder_throw ("The selected interval needs to be within the Formant object's domain.");
+			Melder_throw (U"The selected interval needs to be within the Formant object's domain.");
 		}
 		/* The chisq is not meaningfull as a the only test whether one model is better than the other because if we have two models 
 		 * 1 & 2 with the same data points (x1[i]=x2[i] and y1[i]= y2[i] but if sigma1[i] < sigma2[i] than chisq1 > chisq2.
 		 * This is not what we want.
 		 * We test therefore the variances of the parameters because if sigma1[i] < sigma2[i] than pvar1 < pvar2.
 		 */
-		double minChiVar = 1e38;
+		double minChiVar = 1e308;
 		long index = 0;
 		for (long iobject = 1; iobject <= numberOfFormantObjects; iobject++) {
 			if (invalid[iobject] != 1) {
@@ -1674,17 +1922,17 @@ long Formants_getSmoothestInInterval (Collection me, double tmin, double tmax, l
 		}
 		return index;
 	} catch (MelderError) {
-		Melder_throw ("No Formant object could be selected.");
+		Melder_throw (U"No Formant object could be selected.");
 	}
 }
 
-Formant Formant_extractPart (Formant me, double tmin, double tmax) {
+autoFormant Formant_extractPart (Formant me, double tmin, double tmax) {
 	try {
 		if (tmin >= tmax) {
 			tmin = my xmin; tmax = my xmax;
 		}
 		if (tmin >= my xmax || tmax <= my xmin) {
-			Melder_throw ("Your start and end time should be between ", Melder_double (my xmin), L" and ", Melder_double (my xmax), ".");
+			Melder_throw (U"Your start and end time should be between ", my xmin, U" and ", my xmax, U".");
 		}
 		long thyindex = 1, ifmin, ifmax;
 		long numberOfFrames = Sampled_getWindowSamples (me, tmin, tmax, &ifmin, &ifmax);
@@ -1695,39 +1943,42 @@ Formant Formant_extractPart (Formant me, double tmin, double tmax) {
 			Formant_Frame thyFrame = & thy d_frames [thyindex];
 			myFrame -> copy (thyFrame);
 		}
-		return thee.transfer();
+		return thee;
 		
 	} catch (MelderError) {
-		Melder_throw ("Formant part could not be extracted.");
+		Melder_throw (U"Formant part could not be extracted.");
 	}
 }
 
-Formant Formants_extractSmoothestPart (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack, int useBandWidthsForTrackEstimation, double numberOfSigmas, double power) {
+autoFormant Formants_extractSmoothestPart (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack, int useBandWidthsForTrackEstimation, double numberOfSigmas, double power)
+{
 	try {
-		long index = Formants_getSmoothestInInterval (me, tmin, tmax, numberOfFormantTracks, numberOfParametersPerTrack, useBandWidthsForTrackEstimation, numberOfSigmas, power, 0, 1, 1, 1, 1, 1); // last four are just fillers
+		long index = Formants_getSmoothestInInterval (me, tmin, tmax, numberOfFormantTracks, numberOfParametersPerTrack,
+			useBandWidthsForTrackEstimation, 0, numberOfSigmas, power, 1.0, 1.0, 1.0, 1.0, 1.0); // last five are just fillers
 		Formant bestfit = (Formant) my item[index];
 		autoFormant thee = Formant_extractPart (bestfit, tmin, tmax);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("Smoothest Formant part could not be extracted.");
+		Melder_throw (U"Smoothest Formant part could not be extracted.");
 	}
 }
 
 
-Formant Formants_extractSmoothestPart_withFormantsConstraints (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack, int useBandWidthsForTrackEstimation, double numberOfSigmas, double power, double minF1, double maxF1, double minF2, double maxF2, double minF3) {
+autoFormant Formants_extractSmoothestPart_withFormantsConstraints (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack,	int useBandWidthsForTrackEstimation, double numberOfSigmas, double power, double minF1, double maxF1, double minF2, double maxF2, double minF3) {
 	try {
-		long index = Formants_getSmoothestInInterval (me, tmin, tmax, numberOfFormantTracks, numberOfParametersPerTrack, useBandWidthsForTrackEstimation, numberOfSigmas, power, 1, minF1, maxF1, minF2, maxF2, minF3);
+		long index = Formants_getSmoothestInInterval (me, tmin, tmax, numberOfFormantTracks, numberOfParametersPerTrack,
+			useBandWidthsForTrackEstimation, 1, numberOfSigmas, power, minF1, maxF1, minF2, maxF2, minF3);
 		Formant bestfit = (Formant) my item[index];
 		autoFormant thee = Formant_extractPart (bestfit, tmin, tmax);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("Smoothest Formant part could not be extracted.");
+		Melder_throw (U"Smoothest Formant part could not be extracted.");
 	}
 }
 
 Thing_implement (PitchModeler, DataModeler, 0);
 
-PitchModeler Pitch_to_PitchModeler (Pitch me, double tmin, double tmax, long numberOfParameters) {
+autoPitchModeler Pitch_to_PitchModeler (Pitch me, double tmin, double tmax, long numberOfParameters) {
 	try {
 		long ifmin, ifmax;
 		if (tmax <= tmin) {
@@ -1735,7 +1986,7 @@ PitchModeler Pitch_to_PitchModeler (Pitch me, double tmin, double tmax, long num
 		}
 		long numberOfDataPoints = Sampled_getWindowSamples (me, tmin, tmax, &ifmin, &ifmax);
 		if (numberOfDataPoints < numberOfParameters) {
-			Melder_throw ("Not enought data points, extend the selection.");
+			Melder_throw (U"Not enough data points, extend the selection.");
 		}
 		autoPitchModeler thee = Thing_new (PitchModeler);
 		DataModeler_init (thee.peek(), tmin, tmax, numberOfDataPoints, numberOfParameters, DataModeler_TYPE_LEGENDRE);
@@ -1751,12 +2002,12 @@ PitchModeler Pitch_to_PitchModeler (Pitch me, double tmin, double tmax, long num
 		}
 		thy numberOfDataPoints = idata;
 		if (validData < numberOfParameters) { // remove don't throw exception
-			Melder_throw ("Not enough valid data in interval.");
+			Melder_throw (U"Not enough valid data in interval.");
 		}
 		DataModeler_fit (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("No PitchModeler could be created.");
+		Melder_throw (U"No PitchModeler could be created.");
 	}
 }
 
@@ -1766,14 +2017,20 @@ void PitchModeler_draw (PitchModeler me, Graphics g, double tmin, double tmax, d
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_textLeft (g, 1, L"Frequency (Hz)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1.0, 100.0, 1, 1, 1);
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_textLeft (g, true, U"Frequency (Hz)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, 100.0, true, true, true);
 	}
 }
 
-Formant Sound_to_Formant_interval (Sound me, double startTime, double endTime, double windowLength, double timeStep, double minFreq, double maxFreq, long numberOfFrequencySteps, double preemphasisFrequency, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power, bool useConstraints, double minF1, double maxF1, double minF2, double maxF2, double minF3, double *optimalCeiling) {
+double Sound_getOptimalFormantCeiling (Sound me, double startTime, double endTime, double windowLength, double timeStep, double minFreq, double maxFreq, long numberOfFrequencySteps, double preemphasisFrequency, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power) {
+	double optimalCeiling;
+	autoFormant thee = Sound_to_Formant_interval (me, startTime, endTime, windowLength, timeStep, minFreq, maxFreq,  numberOfFrequencySteps, preemphasisFrequency, numberOfFormantTracks, numberOfParametersPerTrack, weighData,  numberOfSigmas, power, false, 0.0, 5000.0, 0.0, 5000.0, 0.0, &optimalCeiling);
+	return optimalCeiling;
+}
+
+autoFormant Sound_to_Formant_interval (Sound me, double startTime, double endTime, double windowLength, double timeStep, double minFreq, double maxFreq, long numberOfFrequencySteps, double preemphasisFrequency, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power, bool useConstraints, double minF1, double maxF1, double minF2, double maxF2, double minF3, double *optimalCeiling) {
 	try {
 		// parameter check
 		if (endTime <= startTime) {
@@ -1781,29 +2038,30 @@ Formant Sound_to_Formant_interval (Sound me, double startTime, double endTime, d
 		}
 		double nyquistFrequency = 0.5 / my dx;
 		if (maxFreq > nyquistFrequency) {
-			Melder_throw ("The upper value of the maximum frequency range is higher than the Nyquist frequency of the sound.");
+			Melder_throw (U"The upper value of the maximum frequency range is higher than the Nyquist frequency of the sound.");
 		}
-		double df = 0, ceiling_best, mincriterium = 1e28;
+		double df = 0, mincriterium = 1e28;
 		if (minFreq >= maxFreq) {
 			numberOfFrequencySteps = 1;
 		} else {
 			df = (maxFreq - minFreq) / (numberOfFrequencySteps - 1);
 		}
+		double ceiling_best = minFreq;
 		long i_best = 0;
 		
 		// extract part +- windowLength because of Gaussian windowing in the formant analysis
 		// +timeStep/2 to have the analysis points maximally spread in the new domain.
 		
-		autoSound part = Sound_extractPart (me, startTime - windowLength + timeStep / 2, endTime + windowLength + timeStep / 2, kSound_windowShape_RECTANGULAR, 1, 1);
+		autoSound part = Sound_extractPart (me, startTime - windowLength + timeStep / 2.0, endTime + windowLength + timeStep / 2.0, kSound_windowShape_RECTANGULAR, 1, 1);
 
 		// Resample to 2*maxFreq to reduce resampling load in Sound_to_Formant
 		
-		autoSound resampled = Sound_resample (part.peek(), 2 * maxFreq, 50);
+		autoSound resampled = Sound_resample (part.peek(), 2.0 * maxFreq, 50);
 		autoOrdered formants = Ordered_create ();
 		Melder_progressOff ();
 		for (long i = 1; i <= numberOfFrequencySteps; i++) {
 			double currentCeiling = minFreq + (i - 1) * df;
-			autoFormant formant = Sound_to_Formant_burg (resampled.peek(), timeStep, 5, currentCeiling, windowLength, preemphasisFrequency);
+			autoFormant formant = Sound_to_Formant_burg (resampled.peek(), timeStep, 5.0, currentCeiling, windowLength, preemphasisFrequency);
 			autoFormantModeler fm = Formant_to_FormantModeler (formant.peek(), startTime, endTime, numberOfFormantTracks, numberOfParametersPerTrack, weighData);
 			FormantModeler_setParameterValuesToZero (fm.peek(), 1, numberOfFormantTracks, numberOfSigmas);
 			Collection_addItem (formants.peek(), formant.transfer());
@@ -1821,13 +2079,13 @@ Formant Sound_to_Formant_interval (Sound me, double startTime, double endTime, d
 		if (optimalCeiling) {
 			*optimalCeiling = ceiling_best;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("No Formant object created.");
+		Melder_throw (U"No Formant object created.");
 	}
 }
 
-Formant Sound_to_Formant_interval_robust (Sound me, double startTime, double endTime, double windowLength, double timeStep, double minFreq, double maxFreq, long numberOfFrequencySteps, double preemphasisFrequency, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power, bool useConstraints, double minF1, double maxF1, double minF2, double maxF2, double minF3, double *optimalCeiling) {
+autoFormant Sound_to_Formant_interval_robust (Sound me, double startTime, double endTime, double windowLength, double timeStep, double minFreq, double maxFreq, long numberOfFrequencySteps, double preemphasisFrequency, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power, bool useConstraints, double minF1, double maxF1, double minF2, double maxF2, double minF3, double *optimalCeiling) {
 	try {
 		// parameter check
 		if (endTime <= startTime) {
@@ -1835,16 +2093,16 @@ Formant Sound_to_Formant_interval_robust (Sound me, double startTime, double end
 		}
 		double nyquistFrequency = 0.5 / my dx;
 		if (maxFreq > nyquistFrequency) {
-			Melder_throw ("The upper value of the maximum frequency range is higher than the Nyquist frequency of the sound.");
+			Melder_throw (U"The upper value of the maximum frequency range is higher than the Nyquist frequency of the sound.");
 		}
-		double df = 0, ceiling_best, mincriterium = 1e28;
+		double df = 0, mincriterium = 1e28;
 		if (minFreq >= maxFreq) {
 			numberOfFrequencySteps = 1;
 		} else {
 			df = (maxFreq - minFreq) / (numberOfFrequencySteps - 1);
 		}
 		long i_best = 0;
-		
+		double ceiling_best = minFreq;
 		// extract part +- windowLength because of Gaussian windowing in the formant analysis
 		// +timeStep/2 to have the analysis points maximally spread in the new domain.
 		
@@ -1852,12 +2110,12 @@ Formant Sound_to_Formant_interval_robust (Sound me, double startTime, double end
 
 		// Resample to 2*maxFreq to reduce resampling load in Sound_to_Formant
 		
-		autoSound resampled = Sound_resample (part.peek(), 2 * maxFreq, 50);
+		autoSound resampled = Sound_resample (part.peek(), 2.0 * maxFreq, 50);
 		autoOrdered formants = Ordered_create ();
 		Melder_progressOff ();
 		for (long i = 1; i <= numberOfFrequencySteps; i++) {
 			double currentCeiling = minFreq + (i - 1) * df;
-			autoFormant formant = Sound_to_Formant_robust (resampled.peek(), timeStep, 5, currentCeiling, windowLength, preemphasisFrequency, 50, 1.5, 3, 0.0000001, 1);
+			autoFormant formant = Sound_to_Formant_robust (resampled.peek(), timeStep, 5.0, currentCeiling, windowLength, preemphasisFrequency, 50.0, 1.5, 3, 0.0000001, 1);
 			autoFormantModeler fm = Formant_to_FormantModeler (formant.peek(), startTime, endTime, numberOfFormantTracks, numberOfParametersPerTrack, weighData);
 			FormantModeler_setParameterValuesToZero (fm.peek(), 1, numberOfFormantTracks, numberOfSigmas);
 			Collection_addItem (formants.peek(), formant.transfer());
@@ -1875,9 +2133,56 @@ Formant Sound_to_Formant_interval_robust (Sound me, double startTime, double end
 		if (optimalCeiling) {
 			*optimalCeiling = ceiling_best;
 		}
-		return thee.transfer();
+		return thee;
+	} catch (MelderError) {
+		Melder_throw (U"No Formant object created.");
+	}
+}
+
+void FormantModeler_Formant_correctFormantsProbablyIndexedFalsely (FormantModeler me, Formant thee) {
+	try {
+		(void) thee;
+		autoFormantModeler him = (FormantModeler) Data_copy (me);
+	} catch (MelderError) {
+		Melder_throw (U"Nothing corrected.");
+	}
+}
+
+// If e.g. first formant is obviously "missing" then assign F1 as 
+void FormantModeler_correctFormantsProbablyIndexedFalsely (FormantModeler me) {
+	(void) me;
+	/* if shift down F1 ("correct" F1 missed)
+	 * elsif shift down F2  ("correct" F2 missed)
+	 * else if spurious formant before F1
+	 * else if spurious formant between F1 and F2
+	 * endif
+	 * */
+	
+}
+
+autoOptimalCeilingTier Sound_to_OptimalCeilingTier (Sound me, double windowLength, double timeStep, double minCeiling, double maxCeiling, long numberOfFrequencySteps, double preemphasisFrequency, double smoothingWindow, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power) {
+	try {
+		autoOrdered formants = Ordered_create ();
+		double frequencyStep = numberOfFrequencySteps > 1 ? (maxCeiling - minCeiling) / (numberOfFrequencySteps - 1) : 0;
+		for (long i = 1; i <= numberOfFrequencySteps; i++) {
+			double ceiling = minCeiling + (i - 1) * frequencyStep;
+			autoFormant formant = Sound_to_Formant_burg (me, timeStep, 5, ceiling, windowLength, preemphasisFrequency);
+			Collection_addItem (formants.peek(), formant.transfer());
+		}
+		long numberOfFrames; double firstTime, modelingTimeStep = timeStep;
+		autoOptimalCeilingTier octier = OptimalCeilingTier_create (my xmin, my xmax);
+		Sampled_shortTermAnalysis (me, smoothingWindow, modelingTimeStep, & numberOfFrames, & firstTime);
+		for (long iframe = 1; iframe <= numberOfFrames; iframe++) {
+			double time = firstTime + (iframe - 1) * modelingTimeStep;
+			double tmin = time - smoothingWindow / 2.0;
+			double tmax = tmin + smoothingWindow;
+			long index = Formants_getSmoothestInInterval (formants.peek(), tmin, tmax, numberOfFormantTracks, numberOfParametersPerTrack,	weighData, 0, numberOfSigmas, power, 200.0, 1500.0, 300.0, 3000.0, 1000.0); // min/max values are not used
+			double ceiling = minCeiling + (index - 1) * frequencyStep;
+			RealTier_addPoint (octier.peek(), time, ceiling);
+		}
+		return octier;
 	} catch (MelderError) {
-		Melder_throw ("No Formant object created.");
+		Melder_throw (me, U" no OptimalCeilingTier calculated.");
 	}
 }
 
diff --git a/dwtools/DataModeler.h b/dwtools/DataModeler.h
index 7d326e1..1c3c70c 100644
--- a/dwtools/DataModeler.h
+++ b/dwtools/DataModeler.h
@@ -2,7 +2,7 @@
 #define _DataModeler_h_
 /* DataModeler.h
  *
- * Copyright (C) 2014 David Weenink
+ * Copyright (C) 2014-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -45,11 +45,16 @@
 #define DataModeler_DATA_FROM_COPY3 4
 #define DataModeler_DATA_FROM_COPY4 5
 
-#define FormantModeler_DATA_FROM_LOWER 2
-#define FormantModeler_DATA_FROM_UPPER 3
+#define FormantModeler_NOSHIFT_TRACKS 0
+#define FormantModeler_UPSHIFT_TRACKS 1
+#define FormantModeler_DOWNSHIFT_TRACKS 2
+
+#define FormantModeler_DATA_FROM_LOWER 12
+#define FormantModeler_DATA_FROM_UPPER 13
 
 #include "Collection.h"
 #include "Pitch.h"
+#include "OptimalCeilingTier.h"
 #include "Sound_to_Formant.h"
 #include "SSCP.h"
 #include "Table.h"
@@ -59,13 +64,16 @@ oo_CLASS_CREATE (DataModeler, Function);
 oo_CLASS_CREATE (FormantModeler, Function);
 
 Thing_define (PitchModeler, DataModeler) {
-	// overridden methods:
-	//	virtual void v_info ();
+	// void v_info ()
+	//     override;
 };
 
+
 void  DataModeler_init (DataModeler me, double xmin, double xmax, long numberOfDataPoints, long numberOfParameters, int type);
 
-DataModeler DataModeler_create (double xmin, double xmax, long numberOfDataPoints, long numberOfParameters, int type);
+autoDataModeler DataModeler_create (double xmin, double xmax, long numberOfDataPoints, long numberOfParameters, int type);
+
+autoDataModeler DataModeler_createSimple (double xmin, double xmax, long numberOfDataPoints, char32 *parameters, double gaussianNoiseStd, int type);
 
 void DataModeler_setBasisFunctions (DataModeler me, int type);
 
@@ -79,7 +87,7 @@ void DataModeler_drawTrack (DataModeler me, Graphics g, double xmin, double xmax
 
 void DataModeler_drawTrack_inside (DataModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax, int estimated, long numberOfParameters, double horizontalOffset_mm);
 
-void DataModeler_drawOutliersMarked_inside (DataModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax, int useSigmaY, double numberOfSigmas, wchar_t *mark, int marksFontSize, double horizontalOffset_mm);
+void DataModeler_drawOutliersMarked_inside (DataModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax, double numberOfSigmas, int useSigmaY, char32 *mark, int marksFontSize, double horizontalOffset_mm);
 
 /* Get the y-value of the fitted function at x */
 
@@ -89,48 +97,78 @@ void DataModeler_fit (DataModeler me);
 
 // sigmaY used in fit or not.
 void DataModeler_setDataWeighing (DataModeler me, int useSigmaY);
+
 long DataModeler_getNumberOfFixedParameters (DataModeler me);
+
+void DataModeler_setParameterValue (DataModeler me, long index, double value, int status);
+
 void DataModeler_setParameterValueFixed (DataModeler me, long index, double value);
+
 void DataModeler_setParametersFree (DataModeler me, long fromIndex, long toIndex);
+
 double DataModeler_getParameterValue (DataModeler me, long index);
+
 int DataModeler_getParameterStatus (DataModeler me, long index);
+
 double DataModeler_getParameterStandardDeviation (DataModeler me, long index);
+
 double DataModeler_getVarianceOfParameters (DataModeler me, long fromIndex, long toIndex, long *numberOfFreeParameters);
+
 void DataModeler_setParameterValuesToZero (DataModeler me, double numberOfSigmas);
+
 double DataModeler_estimateSigmaY (DataModeler me);
 
 void DataModeler_getExtremaY (DataModeler me, double *ymin, double *ymax);
+
 double DataModeler_getModelValueAtX (DataModeler me, double x);
+
+double DataModeler_getModelValueAtIndex (DataModeler me, long index);
+
 double DataModeler_getWeightedMean (DataModeler me);
 
 long DataModeler_getNumberOfInvalidDataPoints (DataModeler me);
+
 double DataModeler_getDataPointValue (DataModeler me, long index);
+
 void DataModeler_setDataPointValue (DataModeler me, long index, double value);
+
 int DataModeler_getDataPointStatus (DataModeler me, long index);
+
 void DataModeler_setDataPointStatus (DataModeler me, long index, int status);
+
 void DataModeler_setDataPointSigma (DataModeler me, long index, double sigma);
+
 double DataModeler_getDataPointSigma (DataModeler me, long index);
 double DataModeler_getResidualSumOfSquares (DataModeler me, long *numberOfDataPoints);
 
-double *DataModeler_getZScores (DataModeler me, int useSigmaY);
+void DataModeler_getZScores (DataModeler me, int useSigmaY, double zscores[]);
+
 double DataModeler_getDegreesOfFreedom (DataModeler me);
+
 double DataModeler_getChiSquaredQ (DataModeler me, int useSigmaY, double *probability, double *ndf);
+
 double DataModeler_getCoefficientOfDetermination (DataModeler me, double *ssreg, double *sstot);
 
-Formant Formant_extractPart (Formant me, double tmin, double tmax);
+autoFormant Formant_extractPart (Formant me, double tmin, double tmax);
+
+autoCovariance DataModeler_to_Covariance_parameters (DataModeler me);
+
+autoTable DataModeler_to_Table_zscores (DataModeler me, int useSigmaY);
+
+autoFormantModeler FormantModeler_create (double tmin, double tmax, long numberOfFormants, long numberOfDataPoints, long numberOfParameters);
 
-Covariance DataModeler_to_Covariance_parameters (DataModeler me);
-Table DataModeler_to_Table_zscores (DataModeler me, int useSigmaY);
+double FormantModeler_indexToTime (FormantModeler me, long index);
 
-FormantModeler FormantModeler_create (double tmin, double tmax, long numberOfFormants, long numberOfDataPoints, long numberOfParameters);
 void FormantModeler_fit (FormantModeler me);
-void FormantModeler_drawBasisFunction (FormantModeler me, Graphics g, double tmin, double tmax, double fmin, double fmax,
- 	long iformant, long iterm, bool scaled, long numberOfPoints, int garnish);
+
+void FormantModeler_drawBasisFunction (FormantModeler me, Graphics g, double tmin, double tmax, double fmin, double fmax, long iformant, long iterm, bool scaled, long numberOfPoints, int garnish);
 
 void FormantModeler_setDataWeighing (FormantModeler me, long fromFormant, long toFormant, int useSigmaY);
 
 void FormantModeler_setParameterValueFixed (FormantModeler me, long iformant, long index, double value);
+
 void FormantModeler_setParametersFree (FormantModeler me, long fromFormant, long toFormant, long fromIndex, long toIndex);
+
 void FormantModeler_setParameterValuesToZero (FormantModeler me, long fromFormant, long toFormant, double numberOfSigmas);
 
 void FormantModeler_setTolerance (FormantModeler me, double tolerance);
@@ -138,72 +176,100 @@ void FormantModeler_setTolerance (FormantModeler me, double tolerance);
 void FormantModeler_speckle (FormantModeler me, Graphics g, double tmin, double tmax, double fmax,
 	long fromTrack, long toTrack, int estimated, long numberOfParameters, int errorBars, double barWidth_mm, double horizontalOffset_mm, int garnish);
 
-void FormantModeler_drawTracks (FormantModeler me, Graphics g, double tmin, double tmax, double fmax, long fromTrack, long toTrack, 
-	 int estimated, long numberOfParameters, double horizontalOffset_mm, int garnish);
+void FormantModeler_drawTracks (FormantModeler me, Graphics g, double tmin, double tmax, double fmax, long fromTrack, long toTrack, int estimated, long numberOfParameters, double horizontalOffset_mm, int garnish);
+
+void FormantModeler_drawOutliersMarked (FormantModeler me, Graphics g, double tmin, double tmax, double fmax, long fromTrack, long toTrack, double numberOfSigmas, int useSigmaY, char32 *mark, int marksFontSize, double horizontalOffset_mm, int garnish);
 
-void FormantModeler_drawOutliersMarked (FormantModeler me, Graphics g, double tmin, double tmax, double fmax, long fromTrack, long toTrack, double numberOfSigmas, int useSigmaY, wchar_t *mark, int marksFontSize, double horizontalOffset_mm, int garnish);
+void FormantModeler_drawCumulativeChiScores (FormantModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax, int useSigmaY, int garnish);
 
-void FormantModeler_normalProbabilityPlot (FormantModeler me, Graphics g, long iformant, int useSigmaY, long numberOfQuantiles, double numberOfSigmas, int labelSize, const wchar_t *label, int garnish);
+void FormantModeler_drawVariancesOfShiftedTracks (FormantModeler me, Graphics g, double xmin, double xmax, double ymin, double ymax, int shiftDirection, long fromFormant, long toFormant, int garnish);
 
-Table FormantModeler_to_Table_zscores (FormantModeler me, int useSigmaY);
+void FormantModeler_normalProbabilityPlot (FormantModeler me, Graphics g, long iformant, int useSigmaY, long numberOfQuantiles, double numberOfSigmas, int labelSize, const char32 *label, int garnish);
 
-Covariance FormantModeler_to_Covariance_parameters (FormantModeler me, long iformant);
+autoTable FormantModeler_to_Table_zscores (FormantModeler me, int useSigmaY);
+
+autoCovariance FormantModeler_to_Covariance_parameters (FormantModeler me, long iformant);
 
 double FormantModeler_getChiSquaredQ (FormantModeler me, long fromFormant, long toFormant, int useSigmaY, double *probability, double *ndf);
 
 double FormantModeler_getCoefficientOfDetermination (FormantModeler me, long fromFormant, long toFormant);
+
 double FormantModeler_getStandardDeviation (FormantModeler me, long iformant);
+
 double FormantModeler_getResidualSumOfSquares (FormantModeler me, long iformant, long *numberOfDataPoints);
+
 double FormantModeler_getEstimatedValueAtTime (FormantModeler me, long iformant, double time);
 
 long FormantModeler_getNumberOfParameters (FormantModeler me, long iformant);
+
 long FormantModeler_getNumberOfFixedParameters (FormantModeler me, long iformant);
 
 double FormantModeler_getParameterStandardDeviation ( FormantModeler me, long iformant, long index);
+
 double FormantModeler_getVarianceOfParameters (FormantModeler me, long fromFormant, long toFormant, long fromIndex, long toIndex, long *numberOfFreeParameters);
+
 int FormantModeler_getParameterStatus (FormantModeler me, long iformant, long index);
 
-long FormantModeler_getNumberOfDataPoints (FormantModeler me, long iformant);
+long FormantModeler_getNumberOfDataPoints (FormantModeler me);
+
 long FormantModeler_getNumberOfInvalidDataPoints (FormantModeler me, long iformant);
 
 void FormantModeler_setDataPointStatus (FormantModeler me, long iformant, long index, int status);
+
 int FormantModeler_getDataPointStatus (FormantModeler me, long iformant, long index);
+
 double FormantModeler_getDataPointValue (FormantModeler me, long iformant, long index);
+
 void FormantModeler_setDataPointValue (FormantModeler me, long iformant, long index, double value);
+
 double FormantModeler_getDataPointSigma (FormantModeler me, long iformant, long index);
+
 void FormantModeler_setDataPointSigma (FormantModeler me, long iformant, long index, double sigma);
 
 double FormantModeler_getDegreesOfFreedom (FormantModeler me, long iformant);
+
 long FormantModeler_getNumberOfTracks (FormantModeler me);
 
 double FormantModeler_getModelValueAtTime (FormantModeler me, long iformant, double time);
+
+double FormantModeler_getModelValueAtIndex (FormantModeler me, long iformant, long index);
+
 double FormantModeler_getWeightedMean (FormantModeler me, long iformant);
 
 double FormantModeler_getParameterValue (FormantModeler me, long iformant, long iparameter);
 
-FormantModeler Formant_to_FormantModeler (Formant me, double tmin, double tmax, long numberOfFormants, long numberOfParametersPerTrack, int bandwidthEstimatesSigma);
-Formant FormantModeler_to_Formant (FormantModeler me, int estimate, int estimateUndefined);
+autoFormantModeler Formant_to_FormantModeler (Formant me, double tmin, double tmax, long numberOfFormants, long numberOfParametersPerTrack, int bandwidthEstimatesSigma);
+
+autoFormant FormantModeler_to_Formant (FormantModeler me, int estimate, int estimateUndefined);
+
+autoFormantModeler FormantModeler_processOutliers (FormantModeler me, double numberOfSigmas, int useSigmaY);
 
-FormantModeler FormantModeler_processOutliers (FormantModeler me, double numberOfSigmas, int useSigmaY);
 double FormantModeler_getSmoothnessValue (FormantModeler me, long fromFormant, long toFormant, long numberOfParametersPerTrack, double power);
+
 double FormantModeler_getAverageDistanceBetweenTracks (FormantModeler me, long track1, long track2, int type);
 
 long Formants_getSmoothestInInterval (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack, int useBandWidthsForTrackEstimation, int useConstraints, double numberOfSigmas, double power, double minF1, double maxF1, double minF2, double maxF2, double minF3);
 
 double FormantModeler_getFormantsConstraintsFactor (FormantModeler me, double minF1, double maxF1, double minF2, double maxF2, double minF3);
 
-Formant Formants_extractSmoothestPart (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack, int useBandWidthsForTrackEstimation, double numberOfSigmas, double power);
-Formant Formants_extractSmoothestPart_withFormantsConstraints (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack, int useBandWidthsForTrackEstimation, double numberOfSigmas, double power, double minF1, double maxF1, double minF2, double maxF2, double minF3);
+autoFormant Formants_extractSmoothestPart (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack, int useBandWidthsForTrackEstimation, double numberOfSigmas, double power);
+
+autoFormant Formants_extractSmoothestPart_withFormantsConstraints (Collection me, double tmin, double tmax, long numberOfFormantTracks, long numberOfParametersPerTrack, int useBandWidthsForTrackEstimation, double numberOfSigmas, double power, double minF1, double maxF1, double minF2, double maxF2, double minF3);
 
-DataModeler FormantModeler_extractDataModeler (FormantModeler me, long iformant);
+autoDataModeler FormantModeler_extractDataModeler (FormantModeler me, long iformant);
 
-PitchModeler Pitch_to_PitchModeler (Pitch me, double tmin, double tmax, long numberOfParameters);
+autoPitchModeler Pitch_to_PitchModeler (Pitch me, double tmin, double tmax, long numberOfParameters);
 
 void PitchModeler_draw (PitchModeler me, Graphics g, double tmin, double tmax, double fmin, double fmax, long numberOfParameters, int garnish);
 
-DataModeler Table_to_DataModeler (Table me, double xmin, double xmax, long xcolumn, long ycolumn, long scolumn, long numberOfParameters, int type);
+autoDataModeler Table_to_DataModeler (Table me, double xmin, double xmax, long xcolumn, long ycolumn, long scolumn, long numberOfParameters, int type);
+
+autoFormant Sound_to_Formant_interval (Sound me, double startTime, double endTime, double windowLength, double timeStep, double minFreq, double maxFreq, long numberOfFrequencySteps, double preemphasisFrequency, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power, bool useConstraints, double minF1, double maxF1, double minF2, double maxF2, double minF3, double *optimalCeiling);
+
+autoFormant Sound_to_Formant_interval_robust (Sound me, double startTime, double endTime, double windowLength, double timeStep, double minFreq, double maxFreq, long numberOfFrequencySteps, double preemphasisFrequency, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power, bool useConstraints, double minF1, double maxF1, double minF2, double maxF2, double minF3, double *optimalCeiling);
+
+double Sound_getOptimalFormantCeiling (Sound me, double startTime, double endTime, double windowLength, double timeStep, double minFreq, double maxFreq, long numberOfFrequencySteps, double preemphasisFrequency, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power);
 
-Formant Sound_to_Formant_interval (Sound me, double startTime, double endTime, double windowLength, double timeStep, double minFreq, double maxFreq, long numberOfFrequencySteps, double preemphasisFrequency, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power, bool useConstraints, double minF1, double maxF1, double minF2, double maxF2, double minF3, double *optimalCeiling);
+autoOptimalCeilingTier Sound_to_OptimalCeilingTier (Sound me, double windowLength, double timeStep, double minCeiling, double maxCeiling, long numberOfFrequencySteps, double preemphasisFrequency, double smoothingWindow, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power); 
 
-Formant Sound_to_Formant_interval_robust (Sound me, double startTime, double endTime, double windowLength, double timeStep, double minFreq, double maxFreq, long numberOfFrequencySteps, double preemphasisFrequency, long numberOfFormantTracks, long numberOfParametersPerTrack, int weighData, double numberOfSigmas, double power, bool useConstraints, double minF1, double maxF1, double minF2, double maxF2, double minF3, double *optimalCeiling);
 #endif /* _DataModeler_h_ */
diff --git a/dwtools/DataModeler_def.h b/dwtools/DataModeler_def.h
index 79f5a0d..c62fd66 100644
--- a/dwtools/DataModeler_def.h
+++ b/dwtools/DataModeler_def.h
@@ -17,11 +17,11 @@ oo_DEFINE_CLASS (DataModeler, Function)
 	oo_OBJECT (Strings, 0, parameterNames)
 	oo_OBJECT (Covariance, 0, parameterCovariances)
 	#if oo_DECLARING
-		// overridden methods:
 		double (*f_evaluate) (DataModeler me, double x, double p[]);
 		void (*f_evaluateBasisFunctions) (DataModeler me, double x, double term[]);
-		public:
-			virtual void v_info ();
+
+		void v_info ()
+			override;
 	#endif
 	#if oo_COPYING
 			DataModeler_setBasisFunctions (thee, thy type);
@@ -34,11 +34,10 @@ oo_END_CLASS (DataModeler)
 
 #define ooSTRUCT FormantModeler
 oo_DEFINE_CLASS (FormantModeler, Function)
-	oo_COLLECTION (Ordered, datamodelers, DataModeler, 0)
+	oo_COLLECTION (Ordered, trackmodelers, DataModeler, 0)
 	#if oo_DECLARING
-		// overridden methods:
-		public:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 oo_END_CLASS (FormantModeler)
 #undef ooSTRUCT
diff --git a/dwtools/Discriminant.cpp b/dwtools/Discriminant.cpp
index 9a46f78..f052cf7 100644
--- a/dwtools/Discriminant.cpp
+++ b/dwtools/Discriminant.cpp
@@ -1,6 +1,6 @@
 /* Discriminant.c
  *
- * Copyright (C) 1993-2012 David Weenink
+ * Copyright (C) 1993-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,7 +29,7 @@
  djmw 20050405 Modified column label: eigenvector->Eigenvector
  djmw 20061021 printf expects %ld for 'long int'
  djmw 20061212 Changed info to Melder_writeLine<x> format.
- djmw 20071009 wchar_t
+ djmw 20071009 wchar
  djmw 20071012 Added: o_CAN_WRITE_AS_ENCODING.h
  djmw 20071201 Melder_warning<n>
  djmw 20081119 Check in TableOfReal_to_Discriminant if TableOfReal_areAllCellsDefined
@@ -71,16 +71,14 @@
 Thing_implement (Discriminant, Eigen, 0);
 
 void structDiscriminant :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of groups: ", Melder_integer (numberOfGroups));
-	MelderInfo_writeLine (L"Number of variables: ", Melder_integer (dimension));
-	MelderInfo_writeLine (L"Number of discriminant functions: ",
-	                       Melder_integer (Discriminant_getNumberOfFunctions (this)));
-	MelderInfo_writeLine (L"Number of observations (total): ",
-	                       Melder_integer (Discriminant_getNumberOfObservations (this, 0)));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of groups: ", numberOfGroups);
+	MelderInfo_writeLine (U"Number of variables: ", dimension);
+	MelderInfo_writeLine (U"Number of discriminant functions: ", Discriminant_getNumberOfFunctions (this));
+	MelderInfo_writeLine (U"Number of observations (total): ", Discriminant_getNumberOfObservations (this, 0));
 }
 
-Discriminant Discriminant_create (long numberOfGroups, long numberOfEigenvalues, long dimension) {
+autoDiscriminant Discriminant_create (long numberOfGroups, long numberOfEigenvalues, long dimension) {
 	try {
 		autoDiscriminant me = Thing_new (Discriminant);
 		my numberOfGroups = numberOfGroups;
@@ -89,17 +87,17 @@ Discriminant Discriminant_create (long numberOfGroups, long numberOfEigenvalues,
 		my total = SSCP_create (dimension);
 		my aprioriProbabilities = NUMvector<double> (1, numberOfGroups);
 		my costs = NUMmatrix<double> (1, numberOfGroups, 1, numberOfGroups);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Discriminant not created.");
+		Melder_throw (U"Discriminant not created.");
 	}
 }
 
-long Discriminant_groupLabelToIndex (Discriminant me, const wchar_t *label) {
-	wchar_t *name;
+long Discriminant_groupLabelToIndex (Discriminant me, const char32 *label) {
+	char32 *name;
 
 	for (long i = 1; i <= my numberOfGroups; i++) {
-		if ( (name = Thing_getName ( (Thing) my groups -> item[i])) && wcsequ (name, label)) {
+		if ( (name = Thing_getName ( (Thing) my groups -> item[i])) && str32equ (name, label)) {
 			return i;
 		}
 	}
@@ -113,10 +111,10 @@ long Discriminant_getNumberOfGroups (Discriminant me) {
 long Discriminant_getNumberOfObservations (Discriminant me, long group) {
 	if (group == 0) {
 		SSCP sscp = (SSCP) my total;
-		return sscp -> numberOfObservations;
+		return (long) floor (sscp -> numberOfObservations);
 	} else if (group >= 1 && group <= my numberOfGroups) {
 		SSCP sscp = (SSCP) my groups -> item[group];
-		return sscp -> numberOfObservations;
+		return (long) floor (sscp -> numberOfObservations);
 	} else {
 		return -1;
 	}
@@ -124,10 +122,10 @@ long Discriminant_getNumberOfObservations (Discriminant me, long group) {
 
 void Discriminant_setAprioriProbability (Discriminant me, long group, double p) {
 	if (group < 1 || group > my numberOfGroups) {
-		Melder_throw ("The group number (", group, ") must be in the interval [1, ", my numberOfGroups, "]; the supplied value (", group, ") falls outside it.");
+		Melder_throw (U"The group number (", group, U") must be in the interval [1, ", my numberOfGroups, U"]; the supplied value (", group, U") falls outside it.");
 	}
 	if (p < 0 || p > 1) {
-		Melder_throw ("The probability must be in the interval [0, 1]; the supplied value (", p, ") falls outside it.");
+		Melder_throw (U"The probability must be in the interval [0, 1]; the supplied value (", p, U") falls outside it.");
 	}
 	my aprioriProbabilities[group] = p;
 }
@@ -140,10 +138,10 @@ long Discriminant_getNumberOfFunctions (Discriminant me) {
 
 void Discriminant_setGroupLabels (Discriminant me, Strings thee) {
 	if (my numberOfGroups != thy numberOfStrings) Melder_throw
-		("The number of strings must equal the number of groups.");
+		(U"The number of strings must equal the number of groups.");
 
 	for (long i = 1; i <= my numberOfGroups; i++) {
-		const wchar_t *noname = L"", *name;
+		const char32 *noname = U"", *name;
 		name = thy strings[i];
 		if (name == 0) {
 			name = noname;
@@ -152,22 +150,22 @@ void Discriminant_setGroupLabels (Discriminant me, Strings thee) {
 	}
 }
 
-Strings Discriminant_extractGroupLabels (Discriminant me) {
+autoStrings Discriminant_extractGroupLabels (Discriminant me) {
 	try {
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector<wchar_t *> (1, my numberOfGroups);
+		thy strings = NUMvector<char32 *> (1, my numberOfGroups);
 		thy numberOfStrings = my numberOfGroups;
 		for (long i = 1; i <= my numberOfGroups; i++) {
-			wchar_t *name = Thing_getName ( (Thing) my groups -> item[i]);
-			thy strings[i] = Melder_wcsdup (name);
+			char32 *name = Thing_getName ( (Thing) my groups -> item[i]);
+			thy strings[i] = Melder_dup (name);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": group labels not extracted.");
+		Melder_throw (me, U": group labels not extracted.");
 	}
 }
 
-TableOfReal Discriminant_extractGroupCentroids (Discriminant me) {
+autoTableOfReal Discriminant_extractGroupCentroids (Discriminant me) {
 	try {
 		long m = my groups -> size, n = my dimension;
 		autoTableOfReal thee = TableOfReal_create (m, n);
@@ -178,13 +176,13 @@ TableOfReal Discriminant_extractGroupCentroids (Discriminant me) {
 			NUMvector_copyElements (sscp -> centroid, thy data[i], 1, n);
 		}
 		NUMstrings_copyElements ( ( (SSCP) my groups -> item[m]) -> columnLabels, thy columnLabels, 1, n);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": group centroids not extracted.");
+		Melder_throw (me, U": group centroids not extracted.");
 	}
 }
 
-TableOfReal Discriminant_extractGroupStandardDeviations (Discriminant me) {
+autoTableOfReal Discriminant_extractGroupStandardDeviations (Discriminant me) {
 	try {
 		long m = my groups -> size, n = my dimension;
 		autoTableOfReal thee = TableOfReal_create (m, n);
@@ -192,15 +190,15 @@ TableOfReal Discriminant_extractGroupStandardDeviations (Discriminant me) {
 		for (long i = 1; i <= m; i++) {
 			SSCP sscp = (SSCP) my groups -> item[i];
 			TableOfReal_setRowLabel (thee.peek(), i, Thing_getName (sscp));
-			long numberOfObservationsm1 = sscp -> numberOfObservations - 1;
+			long numberOfObservationsm1 = (long) floor (sscp -> numberOfObservations) - 1;
 			for (long j = 1; j <= n; j++) {
 				thy data[i][j] = numberOfObservationsm1 > 0 ? sqrt (sscp -> data[j][j] / numberOfObservationsm1) : NUMundefined;
 			}
 		}
 		NUMstrings_copyElements ( ( (SSCP) my groups -> item[m]) -> columnLabels, thy columnLabels, 1, n);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": group standard deviations not extracted.");
+		Melder_throw (me, U": group standard deviations not extracted.");
 	}
 }
 
@@ -220,7 +218,7 @@ double Discriminant_getWilksLambda (Discriminant me, long from) {
 	unstandardized u[j]: sqrt(N-g) * r[j]
 	standardized s[j]: u[j] sqrt (w[i][i] / (N-g))
 */
-TableOfReal Discriminant_extractCoefficients (Discriminant me, int choice) {
+autoTableOfReal Discriminant_extractCoefficients (Discriminant me, int choice) {
 	try {
 		int raw = choice == 0, standardized = choice == 2;
 		long nx = my dimension, ny = my numberOfEigenvalues;
@@ -229,18 +227,18 @@ TableOfReal Discriminant_extractCoefficients (Discriminant me, int choice) {
 		autoTableOfReal thee = TableOfReal_create (ny, nx + 1);
 		NUMstrings_copyElements (my total -> columnLabels, thy columnLabels, 1, nx);
 
-		autoSSCP within = 0;
+		autoSSCP within;
 		if (standardized) {
-			within.reset (Discriminant_extractPooledWithinGroupsSSCP (me));
+			within = Discriminant_extractPooledWithinGroupsSSCP (me);
 		}
 
-		TableOfReal_setColumnLabel (thee.peek(), nx + 1, L"constant");
-		TableOfReal_setSequentialRowLabels (thee.peek(), 1, ny, L"function_", 1, 1);
+		TableOfReal_setColumnLabel (thee.peek(), nx + 1, U"constant");
+		TableOfReal_setSequentialRowLabels (thee.peek(), 1, ny, U"function_", 1, 1);
 
 		double scale = sqrt (total -> numberOfObservations - my numberOfGroups);
 		double *centroid = my total -> centroid;
 		for (long i = 1; i <= ny; i++) {
-			double u0 = 0, ui;
+			double u0 = 0.0, ui;
 			for (long j = 1; j <= nx; j++) {
 				if (standardized) {
 					scale = sqrt (within -> data[j][j]);
@@ -248,18 +246,18 @@ TableOfReal Discriminant_extractCoefficients (Discriminant me, int choice) {
 				thy data[i][j] = ui = scale * my eigenvectors[i][j];;
 				u0 += ui * centroid[j];
 			}
-			thy data[i][nx + 1] = raw ? 0 : -u0;
+			thy data[i][nx + 1] = raw ? 0.0 : -u0;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": coefficients not extracted.");
+		Melder_throw (me, U": coefficients not extracted.");
 	}
 }
 
 static long Discriminant_getDegreesOfFreedom (Discriminant me) {
 	long ndf = 0;
 	for (long i = 1; i <= my groups -> size; i++) {
-		ndf += SSCP_getDegreesOfFreedom (my groups -> item[i]);
+		ndf += SSCP_getDegreesOfFreedom ((SSCP) my groups -> item[i]);
 	}
 	return ndf;
 }
@@ -272,7 +270,7 @@ void Discriminant_getPartialDiscriminationProbability (Discriminant me,
 	double degreesOfFreedom = Discriminant_getDegreesOfFreedom (me);
 	double lambda;
 
-	*probability = 1; *chisq = 0; *ndf = 0;
+	*probability = 1.0; *chisq = 0.0; *ndf = 0;
 
 	if (k >= numberOfFunctions) {
 		return;
@@ -280,11 +278,11 @@ void Discriminant_getPartialDiscriminationProbability (Discriminant me,
 
 	lambda = NUMwilksLambda (my eigenvalues, k + 1, numberOfFunctions);
 
-	if (lambda == 1) {
+	if (lambda == 1.0) {
 		return;
 	}
 
-	*chisq = - (degreesOfFreedom + (g - p) / 2 - 1) * log (lambda);
+	*chisq = - (degreesOfFreedom + (g - p) / 2.0 - 1.0) * log (lambda);
 	*ndf = (p - k) * (g - k - 1);
 	*probability =  NUMchiSquareQ (*chisq, *ndf);
 }
@@ -302,7 +300,7 @@ double Discriminant_getConcentrationEllipseArea (Discriminant me, long group,
 		autoSSCP thee = Eigen_and_SSCP_project (me, (SSCP) groups -> item[group]);
 		area = SSCP_getConcentrationEllipseArea (thee.peek(), scale, confidence, d1, d2);
 	} else {
-		area = SSCP_getConcentrationEllipseArea (groups -> item[group], scale, confidence, d1, d2);
+		area = SSCP_getConcentrationEllipseArea ((SSCP) groups -> item[group], scale, confidence, d1, d2);
 	}
 	return area;
 }
@@ -322,22 +320,22 @@ double Discriminant_getLnDeterminant_total (Discriminant me) {
 	return ln_d;
 }
 
-SSCP Discriminant_extractPooledWithinGroupsSSCP (Discriminant me) {
+autoSSCP Discriminant_extractPooledWithinGroupsSSCP (Discriminant me) {
 	return SSCPs_to_SSCP_pool (my groups);
 }
 
-SSCP Discriminant_extractWithinGroupSSCP (Discriminant me, long index) {
+autoSSCP Discriminant_extractWithinGroupSSCP (Discriminant me, long index) {
 	try {
 		if (index < 1 || index > my numberOfGroups) Melder_throw
-			("Index must be in interval [1,", my numberOfGroups, "].");
+			(U"Index must be in interval [1,", my numberOfGroups, U"].");
 		autoSSCP thee = Data_copy ( (SSCP) my groups -> item[index]);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": within group SSCP not created.");
+		Melder_throw (me, U": within group SSCP not created.");
 	}
 }
 
-SSCP Discriminant_extractBetweenGroupsSSCP (Discriminant me) {
+autoSSCP Discriminant_extractBetweenGroupsSSCP (Discriminant me) {
 	try {
 		long n = my total -> numberOfRows;
 		autoSSCP b = Data_copy (my total);
@@ -347,36 +345,30 @@ SSCP Discriminant_extractBetweenGroupsSSCP (Discriminant me) {
 				b -> data[j][i] = (b -> data[i][j] -= w -> data[i][j]);
 			}
 		}
-		return b.transfer();
+		return b;
 	} catch (MelderError) {
-		Melder_throw (me, ": between group SSCP not created.");
+		Melder_throw (me, U": between group SSCP not created.");
 	}
 }
 
-void Discriminant_drawTerritorialMap (Discriminant me, Graphics g,
-                                      int discriminantDirections, long d1, long d2, double xmin, double xmax,
-                                      double ymin, double ymax, int fontSize, int poolCovarianceMatrices,
-                                      int garnish) {
+void Discriminant_drawTerritorialMap (Discriminant me, Graphics g, int discriminantDirections, long d1, long d2, double xmin, double xmax, double ymin, double ymax, int fontSize, int poolCovarianceMatrices, int garnish) {
 	(void) me; (void) g; (void) discriminantDirections; (void) d1; (void) d2;
 	(void) xmin; (void) xmax; (void) ymin;
 	(void) ymax; (void) fontSize; (void) poolCovarianceMatrices; (void) garnish;
 
 }
 
-void Discriminant_drawConcentrationEllipses (Discriminant me, Graphics g,
-        double scale, int confidence, wchar_t *label, int discriminantDirections, long d1, long d2,
-        double xmin, double xmax, double ymin, double ymax, int fontSize, int garnish) {
+void Discriminant_drawConcentrationEllipses (Discriminant me, Graphics g, double scale, int confidence, char32 *label, int discriminantDirections, long d1, long d2, double xmin, double xmax, double ymin, double ymax, int fontSize, int garnish) {
 	long numberOfFunctions = Discriminant_getNumberOfFunctions (me);
 
 	if (! discriminantDirections) {
-		SSCPs_drawConcentrationEllipses (my groups, g, scale, confidence, label,
-		                                 d1, d2, xmin, xmax, ymin, ymax, fontSize, garnish);
+		SSCPs_drawConcentrationEllipses (my groups, g, scale, confidence, label, d1, d2, xmin, xmax, ymin, ymax, fontSize, garnish);
 		return;
 	}
 
 	if (numberOfFunctions <= 1) {
-		Melder_warning (L"Discriminant_drawConcentrationEllipses: Nothing drawn "
-		                "because there is only one dimension in the discriminant space.");
+		Melder_warning (U"Discriminant_drawConcentrationEllipses: Nothing drawn "
+		                U"because there is only one dimension in the discriminant space.");
 		return;
 	}
 
@@ -397,19 +389,18 @@ void Discriminant_drawConcentrationEllipses (Discriminant me, Graphics g,
 	SSCPs_drawConcentrationEllipses (thee.peek(), g, scale, confidence, label, 1, 2, xmin, xmax, ymin, ymax, fontSize, 0);
 
 	if (garnish) {
-		wchar_t llabel[40];
+		char32 llabel[40];
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		swprintf (llabel, 40, L"function %ld", d2);
-		Graphics_textLeft (g, 1, llabel);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		swprintf (llabel, 40, L"function %ld", d1);
-		Graphics_textBottom (g, 1, llabel);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Melder_sprint (llabel,40, U"function ", d2);
+		Graphics_textLeft (g, true, llabel);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Melder_sprint (llabel,40, U"function ", d1);
+		Graphics_textBottom (g, true, llabel);
 	}
 }
 
-Discriminant TableOfReal_to_Discriminant (I) {
-	iam (TableOfReal);
+autoDiscriminant TableOfReal_to_Discriminant (TableOfReal me) {
 	try {
 		autoDiscriminant thee = Thing_new (Discriminant);
 		long dimension = my numberOfColumns;
@@ -417,23 +408,23 @@ Discriminant TableOfReal_to_Discriminant (I) {
 		TableOfReal_areAllCellsDefined (me, 0, 0, 0, 0);
 
 		if (NUMdmatrix_hasInfinities (my data, 1, my numberOfRows, 1, dimension)) {
-			Melder_throw ("Table contains infinities.");
+			Melder_throw (U"Table contains infinities.");
 		}
 
 		if (! TableOfReal_hasRowLabels (me)) {
-			Melder_throw ("At least one of the rows has no label.");
+			Melder_throw (U"At least one of the rows has no label.");
 		}
 
 		autoTableOfReal mew = TableOfReal_sortOnlyByRowLabels (me);
 		if (! TableOfReal_hasColumnLabels (mew.peek())) {
-			TableOfReal_setSequentialColumnLabels (mew.peek(), 0, 0, L"c", 1, 1);
+			TableOfReal_setSequentialColumnLabels (mew.peek(), 0, 0, U"c", 1, 1);
 		}
 
 		thy groups = TableOfReal_to_SSCPs_byLabel (mew.peek());
 		thy total = TableOfReal_to_SSCP (mew.peek(), 0, 0, 0, 0);
 
 		if ( (thy numberOfGroups = thy groups -> size) < 2) {
-			Melder_throw ("Number of groups must be greater than one.");
+			Melder_throw (U"Number of groups must be greater than one.");
 		}
 
 		TableOfReal_centreColumns_byRowLabel (mew.peek());
@@ -480,13 +471,13 @@ Discriminant TableOfReal_to_Discriminant (I) {
 				thy costs[k][j] = thy costs[j][k] = 1;
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": Discriminant not created.");
+		Melder_throw (me, U": Discriminant not created.");
 	}
 }
 
-Configuration Discriminant_and_TableOfReal_to_Configuration (Discriminant me, TableOfReal thee, long numberOfDimensions) {
+autoConfiguration Discriminant_and_TableOfReal_to_Configuration (Discriminant me, TableOfReal thee, long numberOfDimensions) {
 	try {
 		if (numberOfDimensions == 0) {
 			numberOfDimensions = Discriminant_getNumberOfFunctions (me);
@@ -495,10 +486,10 @@ Configuration Discriminant_and_TableOfReal_to_Configuration (Discriminant me, Ta
 		Configuration thim = him.peek();
 		Eigen_and_TableOfReal_project_into (me, thee, 1, thy numberOfColumns, & thim, 1, numberOfDimensions);
 		TableOfReal_copyLabels (thee, thim, 1, 0);
-		TableOfReal_setSequentialColumnLabels (him.peek(), 0, 0, L"Eigenvector ", 1, 1);
-		return him.transfer();
+		TableOfReal_setSequentialColumnLabels (him.peek(), 0, 0, U"Eigenvector ", 1, 1);
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("Configuration not created.");
+		Melder_throw (U"Configuration not created.");
 	}
 }
 
@@ -524,37 +515,37 @@ static double mahalanobisDistanceSq (double **li, long n, double *v, double *m,
 	return chisq;
 }
 
-TableOfReal Discriminant_and_TableOfReal_mahalanobis (Discriminant me, TableOfReal thee, long group, bool poolCovarianceMatrices) {
+autoTableOfReal Discriminant_and_TableOfReal_mahalanobis (Discriminant me, TableOfReal thee, long group, bool poolCovarianceMatrices) {
 	try {
 		if (group < 1 || group > my numberOfGroups) {
-			Melder_throw ("Group does not exist.");
+			Melder_throw (U"Group does not exist.");
 		}
 		autoSSCP pool = SSCPs_to_SSCP_pool (my groups);
 		autoCovariance covg = SSCP_to_Covariance (pool.peek(), my numberOfGroups);
 		autoCovariance cov = SSCP_to_Covariance ( (SSCP) my groups -> item[group], 1);
-		autoTableOfReal him = 0;
+		autoTableOfReal him;
 		if (poolCovarianceMatrices) { // use group mean instead of overall mean!
 			NUMvector_copyElements (cov -> centroid, covg -> centroid, 1, cov -> numberOfColumns);
 			him.reset (Covariance_and_TableOfReal_mahalanobis (covg.peek(), thee, false));
 		} else {
 			him.reset (Covariance_and_TableOfReal_mahalanobis (cov.peek(), thee, false));
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal not created.");
+		Melder_throw (U"TableOfReal not created.");
 	}
 }
 
-ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable (Discriminant me, TableOfReal thee,
+autoClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable (Discriminant me, TableOfReal thee,
         int poolCovarianceMatrices, int useAprioriProbabilities) {
 	try {
 		long g = Discriminant_getNumberOfGroups (me);
 		long p = Eigen_getDimensionOfComponents (me);
 		long m = thy numberOfRows;
 
-		if (p != thy numberOfColumns) Melder_throw
-			("The number of columns does not agree with the dimension of the discriminant.");
-
+		if (p != thy numberOfColumns) {
+			Melder_throw (U"The number of columns does not agree with the dimension of the discriminant.");
+		}
 		autoNUMvector<double> log_p (1, g);
 		autoNUMvector<double> log_apriori (1, g);
 		autoNUMvector<double> ln_determinant (1, g);
@@ -573,7 +564,7 @@ ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable (Discrim
 		}
 
 		double lnd;
-		autoSSCPs agroups = 0; SSCPs groups;
+		autoSSCPs agroups; SSCPs groups;
 		if (poolCovarianceMatrices) {
 			/*
 				Covariance matrix S can be decomposed as S = L.L'. Calculate L^-1.
@@ -591,11 +582,12 @@ ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable (Discrim
 			// Calculate the inverses of all group covariance matrices.
 			// In case of a singular matrix, substitute inverse of pooled.
 
-			agroups.reset (Data_copy ( (SSCPs) my groups)); groups = agroups.peek();
+			agroups = Data_copy ((SSCPs) my groups);
+			groups = agroups.peek();
 			long npool = 0;
 			for (long j = 1; j <= g; j++) {
 				SSCP t = (SSCP) groups -> item[j];
-				long no = SSCP_getNumberOfObservations (t);
+				long no = (long) floor (SSCP_getNumberOfObservations (t));
 				for (long i = 1; i <= p; i++) {
 					for (long k = i; k <= p; k++) {
 						t -> data[k][i] = (t -> data[i][k] /= (no - 1));
@@ -618,16 +610,16 @@ ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable (Discrim
 				}
 			}
 			if (npool > 0) {
-				Melder_warning (Melder_integer (npool), L" groups use pooled covariance matrix.");
+				Melder_warning (npool, U" groups use pooled covariance matrix.");
 			}
 		}
 
 		// Labels for columns in ClassificationTable
 
 		for (long j = 1; j <= g; j++) {
-			const wchar_t *name = Thing_getName ( (Thing) my groups -> item[j]);
+			const char32 *name = Thing_getName ( (Thing) my groups -> item[j]);
 			if (! name) {
-				name = L"?";
+				name = U"?";
 			}
 			TableOfReal_setColumnLabel (him.peek(), j, name);
 		}
@@ -645,7 +637,7 @@ ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable (Discrim
 		// D^2(x) = (x - mu)' S^-1 (x - mu) + ln (determinant(S)) - 2 ln (apriori)
 
 		for (long i = 1; i <= m; i++) {
-			double norm = 0, pt_max = -1e38;
+			double norm = 0, pt_max = -1e308;
 			for (long j = 1; j <= g; j++) {
 				SSCP t = (SSCP) groups -> item[j];
 				double md = mahalanobisDistanceSq (sscpvec[j] -> data, p, thy data[i], t -> centroid, buf.peek());
@@ -662,21 +654,20 @@ ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable (Discrim
 				his data[i][j] = log_p[j] / norm;
 			}
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("ClassificationTable from Discriminant & TableOfReal not created.");
+		Melder_throw (U"ClassificationTable from Discriminant & TableOfReal not created.");
 	}
 }
 
-ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable_dw (Discriminant me, TableOfReal thee,
-        int poolCovarianceMatrices, int useAprioriProbabilities, double alpha, double minProb, TableOfReal *displacements) {
+autoClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable_dw (Discriminant me, TableOfReal thee, int poolCovarianceMatrices, int useAprioriProbabilities, double alpha, double minProb, autoTableOfReal *displacements) {
 	try {
 		long g = Discriminant_getNumberOfGroups (me);
 		long p = Eigen_getDimensionOfComponents (me);
 		long m = thy numberOfRows;
 
 		if (p != thy numberOfColumns) Melder_throw
-			("The number of columns does not agree with the dimension of the discriminant.");
+			(U"The number of columns does not agree with the dimension of the discriminant.");
 
 		autoNUMvector<double> log_p (1, g);
 		autoNUMvector<double> log_apriori (1, g);
@@ -699,7 +690,7 @@ ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable_dw (Disc
 		}
 
 		double lnd;
-		autoSSCPs agroups = 0; SSCPs groups;
+		autoSSCPs agroups; SSCPs groups;
 		if (poolCovarianceMatrices) {
 			// Covariance matrix S can be decomposed as S = L.L'. Calculate L^-1.
 			// L^-1 will be used later in the Mahalanobis distance calculation:
@@ -715,11 +706,12 @@ ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable_dw (Disc
 			//Calculate the inverses of all group covariance matrices.
 			// In case of a singular matrix, substitute inverse of pooled.
 
-			agroups.reset (Data_copy ( (SSCPs) my groups)); groups = agroups.peek();
+			agroups = Data_copy ((SSCPs) my groups); 
+			groups = agroups.peek();
 			long npool = 0;
 			for (long j = 1; j <= g; j++) {
 				SSCP t = (SSCP) groups -> item[j];
-				long no = SSCP_getNumberOfObservations (t);
+				long no = (long) floor (SSCP_getNumberOfObservations (t));
 				for (long i = 1; i <= p; i++) {
 					for (long k = i; k <= p; k++) {
 						t -> data[k][i] = (t -> data[i][k] /= (no - 1));
@@ -742,16 +734,16 @@ ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable_dw (Disc
 				}
 			}
 			if (npool > 0) {
-				Melder_warning (Melder_integer (npool), L" groups use pooled covariance matrix.");
+				Melder_warning (npool, U" groups use pooled covariance matrix.");
 			}
 		}
 
 		// Labels for columns in ClassificationTable
 
 		for (long j = 1; j <= g; j++) {
-			const wchar_t *name = Thing_getName ( (Thing) my groups -> item[j]);
+			const char32 *name = Thing_getName ( (Thing) my groups -> item[j]);
 			if (! name) {
-				name = L"?";
+				name = U"?";
 			}
 			TableOfReal_setColumnLabel (him.peek(), j, name);
 		}
@@ -770,7 +762,7 @@ ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable_dw (Disc
 
 		for (long i = 1; i <= m; i++) {
 			SSCP winner;
-			double norm = 0, pt_max = -1e38;
+			double norm = 0, pt_max = -1e308;
 			long iwinner = 1;
 			for (long k = 1; k <= p; k++) {
 				x[k] = thy data[i][k] + displacement[k];
@@ -803,24 +795,24 @@ ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable_dw (Disc
 				}
 			}
 		}
-		*displacements = adisplacements.transfer();
-		return him.transfer();
+		*displacements = adisplacements.move();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("ClassificationTable for Weenink procedure not created.");
+		Melder_throw (U"ClassificationTable for Weenink procedure not created.");
 	}
 }
 
-Configuration TableOfReal_to_Configuration_lda (TableOfReal me, long numberOfDimensions) {
+autoConfiguration TableOfReal_to_Configuration_lda (TableOfReal me, long numberOfDimensions) {
 	try {
 		autoDiscriminant thee = TableOfReal_to_Discriminant (me);
 		autoConfiguration him = Discriminant_and_TableOfReal_to_Configuration (thee.peek(), me, numberOfDimensions);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": Configuration with lda data not created.");
+		Melder_throw (me, U": Configuration with lda data not created.");
 	}
 }
 
 #undef MAX
 #undef MIN
 
-/* End of file Discriminant.c 1043*/
+/* End of file Discriminant.cpp */
diff --git a/dwtools/Discriminant.h b/dwtools/Discriminant.h
index e7fb8c4..f90714a 100644
--- a/dwtools/Discriminant.h
+++ b/dwtools/Discriminant.h
@@ -2,7 +2,7 @@
 #define _Discriminant_h_
 /* Discriminant.h
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,9 +28,9 @@
 #include "Discriminant_def.h"
 oo_CLASS_CREATE (Discriminant, Eigen);
 
-Discriminant Discriminant_create (long numberOfGroups, long numberOfEigenvalues, long dimension);
+autoDiscriminant Discriminant_create (long numberOfGroups, long numberOfEigenvalues, long dimension);
 
-long Discriminant_groupLabelToIndex (Discriminant me, const wchar_t *label);
+long Discriminant_groupLabelToIndex (Discriminant me, const char32 *label);
 
 void Discriminant_setAprioriProbability (Discriminant me, long group, double p);
 
@@ -49,6 +49,7 @@ double Discriminant_getConcentrationEllipseArea (Discriminant me, long group,
 	double scale, int confidence, int discriminantDirections, long d1, long d2);
 
 double Discriminant_getLnDeterminant_group (Discriminant me, long group);
+
 double Discriminant_getLnDeterminant_total (Discriminant me);
 
 void Discriminant_drawTerritorialMap (Discriminant me, Graphics g, int discriminantDirections,
@@ -56,39 +57,39 @@ void Discriminant_drawTerritorialMap (Discriminant me, Graphics g, int discrimin
 	int poolCovarianceMatrices, int garnish);
 
 void Discriminant_drawConcentrationEllipses (Discriminant me, Graphics g,
-	double scale, int confidence, wchar_t *label, int discriminantDirections,
+	double scale, int confidence, char32 *label, int discriminantDirections,
 	long d1, long d2, double xmin, double xmax, double ymin, double ymax,
 	int fontSize, int garnish);
 
-TableOfReal Discriminant_extractCoefficients (Discriminant me, int choice);
+autoTableOfReal Discriminant_extractCoefficients (Discriminant me, int choice);
+
+autoTableOfReal Discriminant_extractGroupCentroids (Discriminant me);
+
+autoTableOfReal Discriminant_extractGroupStandardDeviations (Discriminant me);
+
+autoSSCP Discriminant_extractPooledWithinGroupsSSCP (Discriminant me);
+
+autoSSCP Discriminant_extractWithinGroupSSCP (Discriminant me, long index);
+
+autoSSCP Discriminant_extractBetweenGroupsSSCP (Discriminant me);
 
-TableOfReal Discriminant_extractGroupCentroids (Discriminant me);
-TableOfReal Discriminant_extractGroupStandardDeviations (Discriminant me);
+autoStrings Discriminant_extractGroupLabels (Discriminant me);
 
-SSCP Discriminant_extractPooledWithinGroupsSSCP (Discriminant me);
-SSCP Discriminant_extractWithinGroupSSCP (Discriminant me, long index);
-SSCP Discriminant_extractBetweenGroupsSSCP (Discriminant me);
-Strings Discriminant_extractGroupLabels (Discriminant me);
 void Discriminant_setGroupLabels (Discriminant me, Strings thee);
 
-Configuration Discriminant_and_TableOfReal_to_Configuration
-	(Discriminant me, TableOfReal thee, long numberOfDimensions);
+autoConfiguration Discriminant_and_TableOfReal_to_Configuration	(Discriminant me, TableOfReal thee, long numberOfDimensions);
 
-ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable
-	(Discriminant me, TableOfReal thee, int poolCovarianceMatrices,
-	int useAprioriProbabilities);
+autoClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable
+	(Discriminant me, TableOfReal thee, int poolCovarianceMatrices,	int useAprioriProbabilities);
 
-ClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable_dw
-	(Discriminant me, TableOfReal thee, int poolCovarianceMatrices,
-	int useAprioriProbabilities, double alpha, double minProb,
-	TableOfReal *displacements);
+autoClassificationTable Discriminant_and_TableOfReal_to_ClassificationTable_dw
+	(Discriminant me, TableOfReal thee, int poolCovarianceMatrices,	int useAprioriProbabilities, double alpha, double minProb, autoTableOfReal *displacements);
 
-TableOfReal Discriminant_and_TableOfReal_mahalanobis (Discriminant me, TableOfReal thee, long group, bool poolCovarianceMatrices);
+autoTableOfReal Discriminant_and_TableOfReal_mahalanobis (Discriminant me, TableOfReal thee, long group, bool poolCovarianceMatrices);
 /* Mahalanobis distance with respect to group mean */
 
-Discriminant TableOfReal_to_Discriminant (I);
+autoDiscriminant TableOfReal_to_Discriminant (TableOfReal me);
 
-Configuration TableOfReal_to_Configuration_lda (TableOfReal me,
-	long numberOfDimensions);
+autoConfiguration TableOfReal_to_Configuration_lda (TableOfReal me, long numberOfDimensions);
 
 #endif /* _Discriminant_h_ */
diff --git a/dwtools/Discriminant_Pattern_Categories.cpp b/dwtools/Discriminant_Pattern_Categories.cpp
index 2121912..75e24bd 100644
--- a/dwtools/Discriminant_Pattern_Categories.cpp
+++ b/dwtools/Discriminant_Pattern_Categories.cpp
@@ -1,6 +1,6 @@
 /* Discriminant_Pattern_Categories.cpp
  *
- * Copyright (C) 2004-2011 David Weenink
+ * Copyright (C) 2004-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,26 +25,24 @@
 #include "TableOfReal.h"
 #include "Matrix_Categories.h"
 
-Discriminant Pattern_and_Categories_to_Discriminant (Pattern me, Categories thee) {
+autoDiscriminant Pattern_and_Categories_to_Discriminant (Pattern me, Categories thee) {
 	try {
 		autoTableOfReal t = Matrix_and_Categories_to_TableOfReal (me, thee);
 		autoDiscriminant him = TableOfReal_to_Discriminant (t.peek());
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("Discriminant not created from Pattern & Categories.");
+		Melder_throw (U"Discriminant not created from Pattern & Categories.");
 	}
 }
 
-Categories Discriminant_and_Pattern_to_Categories (Discriminant me, Pattern thee,
-        int poolCovarianceMatrices, int useAprioriProbabilities) {
+autoCategories Discriminant_and_Pattern_to_Categories (Discriminant me, Pattern thee, int poolCovarianceMatrices, int useAprioriProbabilities) {
 	try {
 		autoTableOfReal t = Matrix_to_TableOfReal (thee);
-		autoClassificationTable ct = Discriminant_and_TableOfReal_to_ClassificationTable (me, t.peek(),
-		                             poolCovarianceMatrices, useAprioriProbabilities);
+		autoClassificationTable ct = Discriminant_and_TableOfReal_to_ClassificationTable (me, t.peek(), poolCovarianceMatrices, useAprioriProbabilities);
 		autoCategories him =  ClassificationTable_to_Categories_maximumProbability (ct.peek());
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw ("Categories not created from Pattern & Discriminant.");
+		Melder_throw (U"Categories not created from Pattern & Discriminant.");
 	}
 }
 
diff --git a/dwtools/Discriminant_Pattern_Categories.h b/dwtools/Discriminant_Pattern_Categories.h
index 01b3b30..38bc093 100644
--- a/dwtools/Discriminant_Pattern_Categories.h
+++ b/dwtools/Discriminant_Pattern_Categories.h
@@ -2,7 +2,7 @@
 #define _Discriminant_Pattern_Categories_h_
 /* Discriminant_Pattern_Categories.h
  *
- * Copyright (C) 2004-2011 David Weenink
+ * Copyright (C) 2004-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,17 +34,8 @@
 	#include "Categories.h"
 #endif
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-Discriminant Pattern_and_Categories_to_Discriminant (Pattern me, Categories thee);
+autoDiscriminant Pattern_and_Categories_to_Discriminant (Pattern me, Categories thee);
 
-Categories Discriminant_and_Pattern_to_Categories (Discriminant me, Pattern thee, 
-	int poolCovarianceMatrices,int useAprioriProbabilities);
-
-#ifdef __cplusplus
-	}
-#endif
+autoCategories Discriminant_and_Pattern_to_Categories (Discriminant me, Pattern thee, int poolCovarianceMatrices, int useAprioriProbabilities);
 
 #endif /* _Discriminant_Pattern_Categories_h_ */
diff --git a/dwtools/Discriminant_def.h b/dwtools/Discriminant_def.h
index 6d4e1ca..6e9d2ef 100644
--- a/dwtools/Discriminant_def.h
+++ b/dwtools/Discriminant_def.h
@@ -28,8 +28,8 @@ oo_DEFINE_CLASS (Discriminant, Eigen)
 	oo_DOUBLE_MATRIX (costs, numberOfGroups, numberOfGroups)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (Discriminant)	
diff --git a/dwtools/Distance.cpp b/dwtools/Distance.cpp
index 2929e4b..6170f87 100644
--- a/dwtools/Distance.cpp
+++ b/dwtools/Distance.cpp
@@ -1,6 +1,6 @@
 /* Distance.cpp
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,13 +26,13 @@
 
 Thing_implement (Distance, Proximity, 0);
 
-Distance Distance_create (long numberOfPoints) {
+autoDistance Distance_create (long numberOfPoints) {
 	try {
 		autoDistance me = Thing_new (Distance);
 		Proximity_init (me.peek(), numberOfPoints);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Distance not created.");
+		Melder_throw (U"Distance not created.");
 	}
 }
 
diff --git a/dwtools/Distance.h b/dwtools/Distance.h
index 727f0a2..8f28abc 100644
--- a/dwtools/Distance.h
+++ b/dwtools/Distance.h
@@ -2,7 +2,7 @@
 #define _Distance_h_
 /* Distance.h
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 Thing_define (Distance, Proximity) {
 };
 
-Distance Distance_create (long numberOfPoints);
+autoDistance Distance_create (long numberOfPoints);
 
 void Distance_drawDendogram (Distance me, Graphics g, int method);
 
diff --git a/dwtools/EEG_extensions.cpp b/dwtools/EEG_extensions.cpp
index 8215ab4..053e95e 100644
--- a/dwtools/EEG_extensions.cpp
+++ b/dwtools/EEG_extensions.cpp
@@ -1,293 +1,292 @@
-/* EEG_extensions.cpp
- *
- * Copyright (C) 2012-2014 David Weenink
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-
-#include "ICA.h"
-#include "EEG_extensions.h"
-#include "NUM2.h"
-#include "Sound_and_PCA.h"
-#include "Sound_extensions.h"
-#include "Spectrum_extensions.h"
-#include "Sound_and_Spectrum.h"
-
-static EEG EEG_copyWithoutSound (EEG me) {
-	try {
- 		autoEEG thee = EEG_create (my xmin, my xmax);
-		thy numberOfChannels = my numberOfChannels;
-		thy textgrid = (TextGrid) Data_copy (my textgrid);
-		autostringvector channelNames (1, my numberOfChannels);
-		for (long i = 1; i <= my numberOfChannels; i++) {
-			channelNames[i] = Melder_wcsdup (my channelNames[i]);
-		}
-		thy channelNames = channelNames.transfer();
-		return thee.transfer();
-	} catch (MelderError) {
-		Melder_throw (me, ": not copied.");
-	}
-}
-
-static long *EEG_channelNames_to_channelNumbers (EEG me, wchar_t **channelNames, long numberOfChannelNames) {
-	try {
-		autoNUMvector<long> channelNumbers (1, numberOfChannelNames);
-		for (long i = 1; i <= numberOfChannelNames; i++) {
-			for (long j = 1; j <= my numberOfChannels; j++) {
-				if (Melder_wcsequ (channelNames[i], my channelNames[j])) {
-					channelNumbers[i] = j;
-				}
-			}
-			if (channelNumbers[i] == 0) {
-				Melder_throw ("Channel name \"", channelNames[i], "\" not found.");
-			}
-		}
-		return channelNumbers.transfer();
-	} catch (MelderError) {
-		Melder_throw (me, ": channelNames not found.");
-	}
-}
-
-static void EEG_setChannelNames_selected (EEG me, const wchar_t *precursor, long *channelNumbers, long numberOfChannels) {
-	autoMelderString name;
-	const wchar_t *zero = L"0";
-	for (long i = 1; i <= numberOfChannels; i++) {
-		MelderString_append (&name, precursor);
-		if (my numberOfChannels > 100) {
-			if (i < 10) {
-				MelderString_append (&name, zero);
-			}
-			if (i < 100) {
-				MelderString_append (&name, zero);
-			}
-		} else if (i < 10) {
-			MelderString_append (&name, zero);
-		}
-		MelderString_append (&name, Melder_integer (i));
-		EEG_setChannelName (me, channelNumbers[i], name.string);
-		MelderString_empty (&name);
-	}
-}
-
-CrossCorrelationTable EEG_to_CrossCorrelationTable (EEG me, double startTime, double endTime, double lagStep, const wchar_t *channelRanges)
-{
-	try {
-		// autowindow
-		if (startTime == endTime) {
-			startTime = my xmin; endTime = my xmax;
-		}
-		// don't allow times outside domain
-		if (startTime < my xmin) {
-			startTime = my xmin;
-		}
-		if (endTime > my xmax) {
-			endTime = my xmax;
-		}
-		autoEEG thee = EEG_extractPart (me, startTime, endTime, true);
-		long numberOfChannels;
-		autoNUMvector <long> channels (NUMstring_getElementsOfRanges (channelRanges, thy numberOfChannels, & numberOfChannels, NULL, L"channel", true), 1);
-		autoSound soundPart = Sound_copyChannelRanges (thy sound, channelRanges);
-		autoCrossCorrelationTable him = Sound_to_CrossCorrelationTable (soundPart.peek(), startTime, endTime, lagStep);
-		// assign channel names
-		for (long i = 1; i <= numberOfChannels; i++) {
-			long ichannel = channels[i];
-			wchar_t *label = my channelNames[ichannel];
-			TableOfReal_setRowLabel (him.peek(), i, label);
-			TableOfReal_setColumnLabel (him.peek(), i, label);
-		}
-		return him.transfer();
-	} catch (MelderError) {
-		Melder_throw (me, ": no CrossCorrelationTable calculated.");
-	}
-}
-
-Covariance EEG_to_Covariance (EEG me, double startTime, double endTime, const wchar_t *channelRanges)
-{
-	try {
-		double lagStep = 0.0;
-		autoCrossCorrelationTable thee = EEG_to_CrossCorrelationTable (me, startTime, endTime, lagStep, channelRanges);
-        autoCovariance him = Thing_new (Covariance);
-        thy structCrossCorrelationTable :: v_copy (him.peek());
-		return him.transfer();
-	} catch (MelderError) {
-		Melder_throw (me, ": no Covariance calculated.");
-	}
-}
-
-CrossCorrelationTables EEG_to_CrossCorrelationTables (EEG me, double startTime, double endTime, double lagStep, long ncovars, const wchar_t *channelRanges) {
-	try {
-		// autowindow
-		if (startTime == endTime) {
-			startTime = my xmin; endTime = my xmax;
-		}
-		// don't allow times outside domain
-		if (startTime < my xmin) {
-			startTime = my xmin;
-		}
-		if (endTime > my xmax) {
-			endTime = my xmax;
-		}
-		autoEEG thee = EEG_extractPart (me, startTime, endTime, true);
-		long numberOfChannels;
-		autoNUMvector <long> channels (NUMstring_getElementsOfRanges (channelRanges, thy numberOfChannels, & numberOfChannels, NULL, L"channel", true), 1);
-		autoSound soundPart = Sound_copyChannelRanges (thy sound, channelRanges);
-		autoCrossCorrelationTables him = Sound_to_CrossCorrelationTables (soundPart.peek(), startTime, endTime, lagStep, ncovars);
-		return him.transfer();
-	} catch (MelderError) {
-		Melder_throw (me, ": no CrossCorrelationTables calculated.");
-	}
-}
-
-PCA EEG_to_PCA (EEG me, double startTime, double endTime, const wchar_t *channelRanges, int fromCorrelation) {
-	try {
-		autoCovariance cov = EEG_to_Covariance (me, startTime, endTime, channelRanges);
-		if (fromCorrelation) {
-			autoCorrelation cor = SSCP_to_Correlation (cov.peek());
-			autoPCA him = SSCP_to_PCA (cor.peek());
-			return him.transfer();
-		} else {
-			autoPCA him = SSCP_to_PCA (cov.peek());
-			return him.transfer();
-		}
-	} catch (MelderError) {
-		Melder_throw (me, ": no PCA calculated.");
-	}
-}
-
-EEG EEG_and_PCA_to_EEG_whiten (EEG me, PCA thee, long numberOfComponents) {
-	try {
-		if (numberOfComponents <= 0 || numberOfComponents > thy numberOfEigenvalues) {
-			numberOfComponents = thy numberOfEigenvalues;
-		}
-		numberOfComponents = numberOfComponents > my numberOfChannels ? my numberOfChannels : numberOfComponents;
-
-		autoNUMvector<long> channelNumbers (EEG_channelNames_to_channelNumbers (me, thy labels, thy dimension), 1);
-
-		autoEEG him = (EEG) Data_copy (me);
-		autoSound white = Sound_and_PCA_whitenSelectedChannels (my sound, thee, numberOfComponents, channelNumbers.peek(), thy dimension);
-		for (long i = 1; i <= thy dimension; i++) {
-			long ichannel = channelNumbers[i];
-			NUMvector_copyElements<double> (white -> z[i], his sound -> z[ichannel], 1, his sound -> nx);
-		}
-		EEG_setChannelNames_selected (him.peek(), L"wh", channelNumbers.peek(), thy dimension);
-		return him.transfer();
-	} catch(MelderError) {
-		Melder_throw (me, ": not whitened with ", thee);
-	}
-}
-
-EEG EEG_and_PCA_to_EEG_principalComponents (EEG me, PCA thee, long numberOfComponents) {
-	try {
-		if (numberOfComponents <= 0 || numberOfComponents > thy numberOfEigenvalues) {
-			numberOfComponents = thy numberOfEigenvalues;
-		}
-		numberOfComponents = numberOfComponents > my numberOfChannels ? my numberOfChannels : numberOfComponents;
-
-		autoNUMvector<long> channelNumbers (EEG_channelNames_to_channelNumbers (me, thy labels, thy dimension), 1);
-		autoEEG him = (EEG) Data_copy (me);
-		autoSound pc = Sound_and_PCA_to_Sound_pc_selectedChannels (my sound, thee, numberOfComponents, channelNumbers.peek(), thy dimension);
-		for (long i = 1; i <= thy dimension; i++) {
-			long ichannel = channelNumbers[i];
-			NUMvector_copyElements<double> (pc -> z[i], his sound -> z[ichannel], 1, his sound -> nx);
-		}
-		EEG_setChannelNames_selected (him.peek(), L"pc", channelNumbers.peek(), thy dimension);
-		return him.transfer();
-	} catch (MelderError) {
-		Melder_throw (me, ": not projected.");
-	}
-}
-
-EEG EEG_to_EEG_bss (EEG me, double startTime, double endTime, long ncovars, double lagStep, const wchar_t *channelRanges, int whiteningMethod, int diagonalizerMethod, long maxNumberOfIterations, double tol) {
-	try {
-		// autowindow
-		if (startTime == endTime) {
-			startTime = my xmin; endTime = my xmax;
-		}
-		// don't allow times outside domain
-		if (startTime < my xmin) {
-			startTime = my xmin;
-		}
-		if (endTime > my xmax) {
-			endTime = my xmax;
-		}
-		long numberOfChannels;
-		autoNUMvector <long> channelNumbers (NUMstring_getElementsOfRanges (channelRanges, my numberOfChannels, & numberOfChannels, NULL, L"channel", true), 1);
-		autoEEG thee = EEG_extractPart (me, startTime, endTime, true);
-		if (whiteningMethod != 0) {
-			bool fromCorrelation = whiteningMethod == 2;
-			autoPCA pca = EEG_to_PCA (thee.peek(), thy xmin, thy xmax, channelRanges, fromCorrelation);
-			autoEEG white = EEG_and_PCA_to_EEG_whiten (thee.peek(), pca.peek(), 0);
-			thee.reset (white.transfer());
-		}
-		autoMixingMatrix mm = Sound_to_MixingMatrix (thy sound, startTime, endTime, ncovars, lagStep, maxNumberOfIterations, tol, diagonalizerMethod);
-
-		autoEEG him = EEG_copyWithoutSound (me);
-		his sound = Sound_and_MixingMatrix_unmix (my sound, mm.peek());
-		EEG_setChannelNames_selected (him.peek(), L"ic", channelNumbers.peek(), numberOfChannels);
-
-		// Calculate the cross-correlations between eye-channels and the ic's
-
-
-		return him.transfer();
-
-	} catch (MelderError) {
-		Melder_throw (me, ": no independent components determined.");
-	}
-}
-
-Sound EEG_to_Sound_modulated (EEG me, double baseFrequency, double channelBandwidth, const wchar_t *channelRanges) {
-	try {
-		long numberOfChannels;
-		autoNUMvector <long> channelNumbers (NUMstring_getElementsOfRanges (channelRanges, my numberOfChannels, & numberOfChannels, NULL, L"channel", true), 1);
-		double maxFreq = baseFrequency + my numberOfChannels * channelBandwidth;
-		double samplingFrequency = 2 * maxFreq;
-		samplingFrequency = samplingFrequency < 44100 ? 44100 : samplingFrequency;
-		autoSound thee = Sound_createSimple (1, my xmax - my xmin, samplingFrequency);
-		for (long i = 1; i <= numberOfChannels; i++) {
-			long ichannel = channelNumbers[i];
-			double fbase = baseFrequency;// + (ichannel - 1) * channelBandwidth;
-			autoSound si = Sound_extractChannel (my sound, ichannel);
-			autoSpectrum spi = Sound_to_Spectrum (si.peek(), 1);
-			Spectrum_passHannBand (spi.peek(), 0.5, channelBandwidth - 0.5, 0.5);
-			autoSpectrum spi_shifted = Spectrum_shiftFrequencies (spi.peek(), fbase, samplingFrequency / 2, 30);
-			autoSound resampled = Spectrum_to_Sound (spi_shifted.peek());
-			long nx = resampled -> nx < thy nx ? resampled -> nx : thy nx;
-			for (long j = 1; j <= nx; j++) {
-				thy z[1][j] += resampled -> z[1][j];
-			}
-		}
-		Vector_scale (thee.peek(), 0.99);
-		return thee.transfer();
-	} catch (MelderError) {
-		Melder_throw (me, ": no playable sound created.");
-	}
-}
-
-Sound EEG_to_Sound_frequencyShifted (EEG me, long channel, double frequencyShift, double samplingFrequency, double maxAmp) {
-	try {
-		autoSound si = Sound_extractChannel (my sound, channel);
-		autoSpectrum spi = Sound_to_Spectrum (si.peek(), 1);
-		autoSpectrum spi_shifted = Spectrum_shiftFrequencies (spi.peek(), frequencyShift, samplingFrequency / 2, 30);
-		autoSound thee = Spectrum_to_Sound (spi_shifted.peek());
-		if (maxAmp > 0) {
-			Vector_scale (thee.peek(), maxAmp);
-		}
-		return thee.transfer();
-	} catch (MelderError) {
-		Melder_throw (me, ": channel not converted to sound.");
-	}
-}
-/* End of file EEG_extensions.cpp */
+/* EEG_extensions.cpp
+ *
+ * Copyright (C) 2012-2014 David Weenink
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "ICA.h"
+#include "EEG_extensions.h"
+#include "NUM2.h"
+#include "Sound_and_PCA.h"
+#include "Sound_extensions.h"
+#include "Spectrum_extensions.h"
+#include "Sound_and_Spectrum.h"
+
+static EEG EEG_copyWithoutSound (EEG me) {
+	try {
+ 		autoEEG thee = EEG_create (my xmin, my xmax);
+		thy numberOfChannels = my numberOfChannels;
+		thy textgrid = (TextGrid) Data_copy (my textgrid);
+		autostring32vector channelNames (1, my numberOfChannels);
+		for (long i = 1; i <= my numberOfChannels; i++) {
+			channelNames[i] = Melder_dup (my channelNames[i]);
+		}
+		thy channelNames = channelNames.transfer();
+		return thee.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, U": not copied.");
+	}
+}
+
+static long *EEG_channelNames_to_channelNumbers (EEG me, char32 **channelNames, long numberOfChannelNames) {
+	try {
+		autoNUMvector<long> channelNumbers (1, numberOfChannelNames);
+		for (long i = 1; i <= numberOfChannelNames; i++) {
+			for (long j = 1; j <= my numberOfChannels; j++) {
+				if (Melder_equ (channelNames[i], my channelNames[j])) {
+					channelNumbers[i] = j;
+				}
+			}
+			if (channelNumbers[i] == 0) {
+				Melder_throw (U"Channel name \"", channelNames[i], U"\" not found.");
+			}
+		}
+		return channelNumbers.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, U": channelNames not found.");
+	}
+}
+
+static void EEG_setChannelNames_selected (EEG me, const char32 *precursor, long *channelNumbers, long numberOfChannels) {
+	autoMelderString name;
+	const char32 *zero = U"0";
+	for (long i = 1; i <= numberOfChannels; i++) {
+		MelderString_copy (&name, precursor);
+		if (my numberOfChannels > 100) {
+			if (i < 10) {
+				MelderString_append (&name, zero);
+			}
+			if (i < 100) {
+				MelderString_append (&name, zero);
+			}
+		} else if (i < 10) {
+			MelderString_append (&name, zero);
+		}
+		MelderString_append (&name, i);
+		EEG_setChannelName (me, channelNumbers[i], name.string);
+	}
+}
+
+CrossCorrelationTable EEG_to_CrossCorrelationTable (EEG me, double startTime, double endTime, double lagStep, const char32 *channelRanges)
+{
+	try {
+		// autowindow
+		if (startTime == endTime) {
+			startTime = my xmin; endTime = my xmax;
+		}
+		// don't allow times outside domain
+		if (startTime < my xmin) {
+			startTime = my xmin;
+		}
+		if (endTime > my xmax) {
+			endTime = my xmax;
+		}
+		autoEEG thee = EEG_extractPart (me, startTime, endTime, true);
+		long numberOfChannels;
+		autoNUMvector <long> channels (NUMstring_getElementsOfRanges (channelRanges, thy numberOfChannels, & numberOfChannels, nullptr, U"channel", true), 1);
+		autoSound soundPart = Sound_copyChannelRanges (thy sound, channelRanges);
+		autoCrossCorrelationTable him = Sound_to_CrossCorrelationTable (soundPart.peek(), startTime, endTime, lagStep);
+		// assign channel names
+		for (long i = 1; i <= numberOfChannels; i++) {
+			long ichannel = channels[i];
+			char32 *label = my channelNames[ichannel];
+			TableOfReal_setRowLabel (him.peek(), i, label);
+			TableOfReal_setColumnLabel (him.peek(), i, label);
+		}
+		return him.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, U": no CrossCorrelationTable calculated.");
+	}
+}
+
+Covariance EEG_to_Covariance (EEG me, double startTime, double endTime, const char32 *channelRanges)
+{
+	try {
+		double lagStep = 0.0;
+		autoCrossCorrelationTable thee = EEG_to_CrossCorrelationTable (me, startTime, endTime, lagStep, channelRanges);
+        autoCovariance him = Thing_new (Covariance);
+        thy structCrossCorrelationTable :: v_copy (him.peek());
+		return him.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, U": no Covariance calculated.");
+	}
+}
+
+CrossCorrelationTables EEG_to_CrossCorrelationTables (EEG me, double startTime, double endTime, double lagStep, long ncovars, const char32 *channelRanges) {
+	try {
+		// autowindow
+		if (startTime == endTime) {
+			startTime = my xmin; endTime = my xmax;
+		}
+		// don't allow times outside domain
+		if (startTime < my xmin) {
+			startTime = my xmin;
+		}
+		if (endTime > my xmax) {
+			endTime = my xmax;
+		}
+		autoEEG thee = EEG_extractPart (me, startTime, endTime, true);
+		long numberOfChannels;
+		autoNUMvector <long> channels (NUMstring_getElementsOfRanges (channelRanges, thy numberOfChannels, & numberOfChannels, nullptr, U"channel", true), 1);
+		autoSound soundPart = Sound_copyChannelRanges (thy sound, channelRanges);
+		autoCrossCorrelationTables him = Sound_to_CrossCorrelationTables (soundPart.peek(), startTime, endTime, lagStep, ncovars);
+		return him.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, U": no CrossCorrelationTables calculated.");
+	}
+}
+
+PCA EEG_to_PCA (EEG me, double startTime, double endTime, const char32 *channelRanges, int fromCorrelation) {
+	try {
+		autoCovariance cov = EEG_to_Covariance (me, startTime, endTime, channelRanges);
+		if (fromCorrelation) {
+			autoCorrelation cor = SSCP_to_Correlation (cov.peek());
+			autoPCA him = SSCP_to_PCA (cor.peek());
+			return him.transfer();
+		} else {
+			autoPCA him = SSCP_to_PCA (cov.peek());
+			return him.transfer();
+		}
+	} catch (MelderError) {
+		Melder_throw (me, U": no PCA calculated.");
+	}
+}
+
+EEG EEG_and_PCA_to_EEG_whiten (EEG me, PCA thee, long numberOfComponents) {
+	try {
+		if (numberOfComponents <= 0 || numberOfComponents > thy numberOfEigenvalues) {
+			numberOfComponents = thy numberOfEigenvalues;
+		}
+		numberOfComponents = numberOfComponents > my numberOfChannels ? my numberOfChannels : numberOfComponents;
+
+		autoNUMvector<long> channelNumbers (EEG_channelNames_to_channelNumbers (me, thy labels, thy dimension), 1);
+
+		autoEEG him = (EEG) Data_copy (me);
+		autoSound white = Sound_and_PCA_whitenSelectedChannels (my sound, thee, numberOfComponents, channelNumbers.peek(), thy dimension);
+		for (long i = 1; i <= thy dimension; i++) {
+			long ichannel = channelNumbers[i];
+			NUMvector_copyElements<double> (white -> z[i], his sound -> z[ichannel], 1, his sound -> nx);
+		}
+		EEG_setChannelNames_selected (him.peek(), U"wh", channelNumbers.peek(), thy dimension);
+		return him.transfer();
+	} catch(MelderError) {
+		Melder_throw (me, U": not whitened with ", thee);
+	}
+}
+
+EEG EEG_and_PCA_to_EEG_principalComponents (EEG me, PCA thee, long numberOfComponents) {
+	try {
+		if (numberOfComponents <= 0 || numberOfComponents > thy numberOfEigenvalues) {
+			numberOfComponents = thy numberOfEigenvalues;
+		}
+		numberOfComponents = numberOfComponents > my numberOfChannels ? my numberOfChannels : numberOfComponents;
+
+		autoNUMvector<long> channelNumbers (EEG_channelNames_to_channelNumbers (me, thy labels, thy dimension), 1);
+		autoEEG him = (EEG) Data_copy (me);
+		autoSound pc = Sound_and_PCA_to_Sound_pc_selectedChannels (my sound, thee, numberOfComponents, channelNumbers.peek(), thy dimension);
+		for (long i = 1; i <= thy dimension; i++) {
+			long ichannel = channelNumbers[i];
+			NUMvector_copyElements<double> (pc -> z[i], his sound -> z[ichannel], 1, his sound -> nx);
+		}
+		EEG_setChannelNames_selected (him.peek(), U"pc", channelNumbers.peek(), thy dimension);
+		return him.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, U": not projected.");
+	}
+}
+
+EEG EEG_to_EEG_bss (EEG me, double startTime, double endTime, long ncovars, double lagStep, const char32 *channelRanges, int whiteningMethod, int diagonalizerMethod, long maxNumberOfIterations, double tol) {
+	try {
+		// autowindow
+		if (startTime == endTime) {
+			startTime = my xmin; endTime = my xmax;
+		}
+		// don't allow times outside domain
+		if (startTime < my xmin) {
+			startTime = my xmin;
+		}
+		if (endTime > my xmax) {
+			endTime = my xmax;
+		}
+		long numberOfChannels;
+		autoNUMvector <long> channelNumbers (NUMstring_getElementsOfRanges (channelRanges, my numberOfChannels, & numberOfChannels, nullptr, U"channel", true), 1);
+		autoEEG thee = EEG_extractPart (me, startTime, endTime, true);
+		if (whiteningMethod != 0) {
+			bool fromCorrelation = whiteningMethod == 2;
+			autoPCA pca = EEG_to_PCA (thee.peek(), thy xmin, thy xmax, channelRanges, fromCorrelation);
+			autoEEG white = EEG_and_PCA_to_EEG_whiten (thee.peek(), pca.peek(), 0);
+			thee.reset (white.transfer());
+		}
+		autoMixingMatrix mm = Sound_to_MixingMatrix (thy sound, startTime, endTime, ncovars, lagStep, maxNumberOfIterations, tol, diagonalizerMethod);
+
+		autoEEG him = EEG_copyWithoutSound (me);
+		his sound = Sound_and_MixingMatrix_unmix (my sound, mm.peek());
+		EEG_setChannelNames_selected (him.peek(), U"ic", channelNumbers.peek(), numberOfChannels);
+
+		// Calculate the cross-correlations between eye-channels and the ic's
+
+
+		return him.transfer();
+
+	} catch (MelderError) {
+		Melder_throw (me, U": no independent components determined.");
+	}
+}
+
+Sound EEG_to_Sound_modulated (EEG me, double baseFrequency, double channelBandwidth, const char32 *channelRanges) {
+	try {
+		long numberOfChannels;
+		autoNUMvector <long> channelNumbers (NUMstring_getElementsOfRanges (channelRanges, my numberOfChannels, & numberOfChannels, nullptr, U"channel", true), 1);
+		double maxFreq = baseFrequency + my numberOfChannels * channelBandwidth;
+		double samplingFrequency = 2 * maxFreq;
+		samplingFrequency = samplingFrequency < 44100 ? 44100 : samplingFrequency;
+		autoSound thee = Sound_createSimple (1, my xmax - my xmin, samplingFrequency);
+		for (long i = 1; i <= numberOfChannels; i++) {
+			long ichannel = channelNumbers[i];
+			double fbase = baseFrequency;// + (ichannel - 1) * channelBandwidth;
+			autoSound si = Sound_extractChannel (my sound, ichannel);
+			autoSpectrum spi = Sound_to_Spectrum (si.peek(), 1);
+			Spectrum_passHannBand (spi.peek(), 0.5, channelBandwidth - 0.5, 0.5);
+			autoSpectrum spi_shifted = Spectrum_shiftFrequencies (spi.peek(), fbase, samplingFrequency / 2, 30);
+			autoSound resampled = Spectrum_to_Sound (spi_shifted.peek());
+			long nx = resampled -> nx < thy nx ? resampled -> nx : thy nx;
+			for (long j = 1; j <= nx; j++) {
+				thy z[1][j] += resampled -> z[1][j];
+			}
+		}
+		Vector_scale (thee.peek(), 0.99);
+		return thee.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, U": no playable sound created.");
+	}
+}
+
+Sound EEG_to_Sound_frequencyShifted (EEG me, long channel, double frequencyShift, double samplingFrequency, double maxAmp) {
+	try {
+		autoSound si = Sound_extractChannel (my sound, channel);
+		autoSpectrum spi = Sound_to_Spectrum (si.peek(), 1);
+		autoSpectrum spi_shifted = Spectrum_shiftFrequencies (spi.peek(), frequencyShift, samplingFrequency / 2, 30);
+		autoSound thee = Spectrum_to_Sound (spi_shifted.peek());
+		if (maxAmp > 0) {
+			Vector_scale (thee.peek(), maxAmp);
+		}
+		return thee.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, U": channel not converted to sound.");
+	}
+}
+/* End of file EEG_extensions.cpp */
diff --git a/dwtools/EEG_extensions.h b/dwtools/EEG_extensions.h
index 07fd358..46987f2 100644
--- a/dwtools/EEG_extensions.h
+++ b/dwtools/EEG_extensions.h
@@ -27,21 +27,21 @@
 #include "ICA.h"
 #include "EEG.h"
 
-CrossCorrelationTable EEG_to_CrossCorrelationTable (EEG me, double startTime, double endTime, double lagTime, const wchar_t *channelRanges);
+CrossCorrelationTable EEG_to_CrossCorrelationTable (EEG me, double startTime, double endTime, double lagTime, const char32 *channelRanges);
 
-Covariance EEG_to_Covariance (EEG me, double startTime, double endTime, const wchar_t *channelRanges);
+Covariance EEG_to_Covariance (EEG me, double startTime, double endTime, const char32 *channelRanges);
 
-CrossCorrelationTables EEG_to_CrossCorrelationTables (EEG me, double startTime, double endTime, double lagTime, long ncovars, const wchar_t *channelRanges);
+CrossCorrelationTables EEG_to_CrossCorrelationTables (EEG me, double startTime, double endTime, double lagTime, long ncovars, const char32 *channelRanges);
 
-PCA EEG_to_PCA (EEG me, double startTime, double endTime, const wchar_t *channelRanges, int fromCorrelation);
+PCA EEG_to_PCA (EEG me, double startTime, double endTime, const char32 *channelRanges, int fromCorrelation);
 
 EEG EEG_and_PCA_to_EEG_whiten (EEG me, PCA thee, long numberOfComponents);
 
 EEG EEG_and_PCA_to_EEG_principalComponents (EEG me, PCA thee, long numberOfComponents);
 
-EEG EEG_to_EEG_bss (EEG me, double startTime, double endTime, long ncovars, double lagTime, const wchar_t *channelRanges, int whiteningMethod, int diagonalizerMethod, long maxNumberOfIterations, double tol);
+EEG EEG_to_EEG_bss (EEG me, double startTime, double endTime, long ncovars, double lagTime, const char32 *channelRanges, int whiteningMethod, int diagonalizerMethod, long maxNumberOfIterations, double tol);
 
 Sound EEG_to_Sound_frequencyShifted (EEG me, long channel, double frequencyShift, double samplingFrequency, double maxAmp);
-Sound EEG_to_Sound_modulated (EEG me, double baseFrequency, double channelBandWidth, const wchar_t *channelRanges);
+Sound EEG_to_Sound_modulated (EEG me, double baseFrequency, double channelBandWidth, const char32 *channelRanges);
 
 #endif /* _EEG_extensions_h_ */
diff --git a/dwtools/EditDistanceTable.cpp b/dwtools/EditDistanceTable.cpp
index a264091..e0210ac 100644
--- a/dwtools/EditDistanceTable.cpp
+++ b/dwtools/EditDistanceTable.cpp
@@ -55,7 +55,7 @@ EditCostsTable EditCostsTable_createDefault ();
  * cell [n][m] if nomatch target != nomatch source
  */
 
-Thing_implement (WarpingPath, Data, 0);
+Thing_implement (WarpingPath, Daata, 0);
 
 WarpingPath WarpingPath_create (long length) {
 	try {
@@ -64,7 +64,7 @@ WarpingPath WarpingPath_create (long length) {
 		my _capacity = my pathLength = length;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("WarpPath not created.");
+		Melder_throw (U"WarpPath not created.");
 	}
 }
 
@@ -146,20 +146,20 @@ Thing_implement (EditCostsTable, TableOfReal, 0);
 
 void structEditCostsTable :: v_info () {
 	EditDistanceTable_Parent :: v_info ();
-	MelderInfo_writeLine (L"Target:", Melder_integer (numberOfRows - 2), L" symbols.");
-	MelderInfo_writeLine (L"Source:", Melder_integer (numberOfColumns - 2), L" symbols.");
+	MelderInfo_writeLine (U"Target:", numberOfRows - 2, U" symbols.");
+	MelderInfo_writeLine (U"Source:", numberOfColumns - 2, U" symbols.");
 }
 
-bool structEditCostsTable :: v_matchTargetSymbol (const wchar_t *targetSymbol, const wchar_t *symbol) {
-	return Melder_wcsequ (targetSymbol, symbol);
+bool structEditCostsTable :: v_matchTargetSymbol (const char32 *targetSymbol, const char32 *symbol) {
+	return Melder_equ (targetSymbol, symbol);
 }
 
-bool structEditCostsTable :: v_matchSourceSymbol (const wchar_t *sourceSymbol, const wchar_t *symbol) {
-	return Melder_wcsequ (sourceSymbol, symbol);
+bool structEditCostsTable :: v_matchSourceSymbol (const char32 *sourceSymbol, const char32 *symbol) {
+	return Melder_equ (sourceSymbol, symbol);
 }
 
-bool structEditCostsTable :: v_matchTargetWithSourceSymbol (const wchar_t *targetSymbol, const wchar_t *sourceSymbol) {
-	return Melder_wcsequ (targetSymbol, sourceSymbol);
+bool structEditCostsTable :: v_matchTargetWithSourceSymbol (const char32 *targetSymbol, const char32 *sourceSymbol) {
+	return Melder_equ (targetSymbol, sourceSymbol);
 }
 
 EditCostsTable EditCostsTable_create (long targetAlphabetSize, long sourceAlphabetSize) {
@@ -168,7 +168,7 @@ EditCostsTable EditCostsTable_create (long targetAlphabetSize, long sourceAlphab
 		TableOfReal_init (me.peek(), targetAlphabetSize + 2, sourceAlphabetSize + 2);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("EditCostsTable not created.");
+		Melder_throw (U"EditCostsTable not created.");
 	}
 }
 
@@ -181,7 +181,7 @@ EditCostsTable EditCostsTable_createDefault () {
 		my data[1][2] = 1; // default deletion cost
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Default EditCostsTable not created.");
+		Melder_throw (U"Default EditCostsTable not created.");
 	}
 }
 
@@ -192,7 +192,7 @@ void EditCostsTable_setDefaultCosts (EditCostsTable me, double insertionCosts, d
 	my data[my numberOfRows - 1][my numberOfColumns] = insertionCosts;
 }
 
-long EditCostsTable_getTargetIndex (EditCostsTable me, const wchar_t *symbol) {
+long EditCostsTable_getTargetIndex (EditCostsTable me, const char32 *symbol) {
 	for (long i = 1; i <= my numberOfRows - 2; i++) {
 		if (my v_matchTargetSymbol (my rowLabels[i], symbol)) {
 			return i;
@@ -201,7 +201,7 @@ long EditCostsTable_getTargetIndex (EditCostsTable me, const wchar_t *symbol) {
 	return 0;
 }
 
-long EditCostsTable_getSourceIndex (EditCostsTable me, const wchar_t *symbol) {
+long EditCostsTable_getSourceIndex (EditCostsTable me, const char32 *symbol) {
 	for (long j = 1; j <= my numberOfColumns - 2; j++) {
 		if (my v_matchSourceSymbol (my columnLabels[j], symbol)) {
 			return j;
@@ -210,16 +210,16 @@ long EditCostsTable_getSourceIndex (EditCostsTable me, const wchar_t *symbol) {
 	return 0;
 }
 
-void EditCostsTable_setInsertionCosts (EditCostsTable me, wchar_t *targets, double cost) {
-	for (wchar_t *token = Melder_firstToken (targets); token != 0; token = Melder_nextToken ()) {
+void EditCostsTable_setInsertionCosts (EditCostsTable me, char32 *targets, double cost) {
+	for (char32 *token = Melder_firstToken (targets); token != 0; token = Melder_nextToken ()) {
 		long irow = EditCostsTable_getTargetIndex (me, token);
 		irow = irow > 0 ? irow : my numberOfRows - 1; // nomatch condition to penultimate row
 		my data[irow][my numberOfColumns] = cost;
 	}
 }
 
-void EditCostsTable_setDeletionCosts (EditCostsTable me, wchar_t *sources, double cost) {
-	for (wchar_t *token = Melder_firstToken (sources); token != 0; token = Melder_nextToken ()) {
+void EditCostsTable_setDeletionCosts (EditCostsTable me, char32 *sources, double cost) {
+	for (char32 *token = Melder_firstToken (sources); token != 0; token = Melder_nextToken ()) {
 		long icol = EditCostsTable_getSourceIndex (me, token);
 		icol = icol > 0 ? icol : my numberOfColumns - 1; // nomatch condition to penultimate column
 		my data[my numberOfRows][icol] = cost;
@@ -240,12 +240,12 @@ double EditCostsTable_getOthersCost (EditCostsTable me, int costType) {
 		 my data[my numberOfRows - 1][my numberOfColumns -1]; // inequality
 }
 
-void EditCostsTable_setSubstitutionCosts (EditCostsTable me, wchar_t *targets, wchar_t *sources, double cost) {
+void EditCostsTable_setSubstitutionCosts (EditCostsTable me, char32 *targets, char32 *sources, double cost) {
 	try {
 		autoNUMvector<long> targetIndex (1, my numberOfRows);
 		autoNUMvector<long> sourceIndex (1, my numberOfRows);
 		long numberOfTargetSymbols = 0;
-		for (wchar_t *token = Melder_firstToken (targets); token != 0; token = Melder_nextToken ()) {
+		for (char32 *token = Melder_firstToken (targets); token != 0; token = Melder_nextToken ()) {
 			long index = EditCostsTable_getTargetIndex (me, token);
 			if (index > 0) {
 				targetIndex[++numberOfTargetSymbols] = index;
@@ -255,7 +255,7 @@ void EditCostsTable_setSubstitutionCosts (EditCostsTable me, wchar_t *targets, w
 			targetIndex[++numberOfTargetSymbols] = my numberOfRows - 1;
 		}
 		long numberOfSourceSymbols = 0;
-		for (wchar_t *token = Melder_firstToken (sources); token != 0; token = Melder_nextToken ()) {
+		for (char32 *token = Melder_firstToken (sources); token != 0; token = Melder_nextToken ()) {
 			long index = EditCostsTable_getSourceIndex (me, token);
 			if (index > 0) {
 				sourceIndex[++numberOfSourceSymbols] = index;
@@ -271,23 +271,23 @@ void EditCostsTable_setSubstitutionCosts (EditCostsTable me, wchar_t *targets, w
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": substitution costs not set.");
+		Melder_throw (me, U": substitution costs not set.");
 	}
 }
 
-double EditCostsTable_getInsertionCost (EditCostsTable me, const wchar_t *symbol) {
+double EditCostsTable_getInsertionCost (EditCostsTable me, const char32 *symbol) {
 	long irow = EditCostsTable_getTargetIndex (me, symbol);
 	irow = irow == 0 ? my numberOfRows - 1 : irow; // others is penultimate row
 	return my data[irow][my numberOfColumns];
 }
 
-double EditCostsTable_getDeletionCost (EditCostsTable me, const wchar_t *sourceSymbol) {
+double EditCostsTable_getDeletionCost (EditCostsTable me, const char32 *sourceSymbol) {
 	long icol = EditCostsTable_getSourceIndex (me, sourceSymbol);
 	icol = icol == 0 ? my numberOfColumns - 1 : icol; // others is penultimate column
 	return my data[my numberOfRows][icol];
 }
 
-double EditCostsTable_getSubstitutionCost (EditCostsTable me, const wchar_t *symbol, const wchar *replacement) {
+double EditCostsTable_getSubstitutionCost (EditCostsTable me, const char32 *symbol, const char32 *replacement) {
 	long irow = EditCostsTable_getTargetIndex (me, symbol);
 	long icol = EditCostsTable_getSourceIndex (me, replacement);
 	if (irow == 0 && icol == 0) { // nomatch
@@ -308,16 +308,16 @@ TableOfReal EditCostsTable_to_TableOfReal (EditCostsTable me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my numberOfRows, my numberOfColumns);
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			thy columnLabels[j] = Melder_wcsdup (my columnLabels[j]);
+			thy columnLabels[j] = Melder_dup (my columnLabels[j]);
 		}
 		for (long i = 1; i <= my numberOfRows; i++) {
-			thy rowLabels[i] = Melder_wcsdup (my rowLabels[i]);
+			thy rowLabels[i] = Melder_dup (my rowLabels[i]);
 		}
 		NUMmatrix_copyElements<double> (my data, thy data, 1, my numberOfRows, 1, my numberOfColumns);
 		return thee.transfer();
 
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TableOfReal.");
+		Melder_throw (me, U": not converted to TableOfReal.");
 	}
 }
 
@@ -325,8 +325,8 @@ Thing_implement (EditDistanceTable, TableOfReal, 0);
 
 void structEditDistanceTable :: v_info () {
 	EditDistanceTable_Parent :: v_info ();
-	MelderInfo_writeLine (L"Target:", Melder_integer (numberOfRows), L" symbols.");
-	MelderInfo_writeLine (L"Source:", Melder_integer (numberOfColumns), L" symbols.");
+	MelderInfo_writeLine (U"Target:", numberOfRows, U" symbols.");
+	MelderInfo_writeLine (U"Source:", numberOfColumns, U" symbols.");
 }
 
 EditDistanceTable EditDistanceTable_create (Strings target, Strings source) {
@@ -334,20 +334,20 @@ EditDistanceTable EditDistanceTable_create (Strings target, Strings source) {
 		autoEditDistanceTable me = Thing_new (EditDistanceTable);
 		long numberOfSourceSymbols = source -> numberOfStrings, numberOfTargetSymbols = target -> numberOfStrings;
 		TableOfReal_init (me.peek(), numberOfTargetSymbols + 1, numberOfSourceSymbols + 1);
-		TableOfReal_setColumnLabel (me.peek(), 1, L"");
+		TableOfReal_setColumnLabel (me.peek(), 1, U"");
 		for (long j = 1; j <= numberOfSourceSymbols; j++) {
-			my columnLabels[j + 1] = Melder_wcsdup (source -> strings[j]);
+			my columnLabels[j + 1] = Melder_dup (source -> strings[j]);
 		}
-		TableOfReal_setRowLabel (me.peek(), 1, L"");
+		TableOfReal_setRowLabel (me.peek(), 1, U"");
 		for (long i = 1; i <= numberOfTargetSymbols; i++) {
-			my rowLabels[i + 1] = Melder_wcsdup (target -> strings[i]);
+			my rowLabels[i + 1] = Melder_dup (target -> strings[i]);
 		}
 		my warpingPath = WarpingPath_create (numberOfTargetSymbols + numberOfSourceSymbols + 1);
 		my editCostsTable = EditCostsTable_createDefault ();
 		EditDistanceTable_findPath (me.peek(), 0);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("EditDistanceTable not created.");
+		Melder_throw (U"EditDistanceTable not created.");
 	}
 }
 
@@ -357,18 +357,18 @@ void EditDistanceTable_setEditCosts (EditDistanceTable me, EditCostsTable thee)
 		autoEditCostsTable ect = (EditCostsTable) Data_copy (thee);
 		my editCostsTable = ect.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": edit costs not set.");
+		Melder_throw (me, U": edit costs not set.");
 	}
 }
 
-EditDistanceTable EditDistanceTable_createFromCharacterStrings (const wchar_t *chars1, const wchar_t *chars2) {
+EditDistanceTable EditDistanceTable_createFromCharacterStrings (const char32 *chars1, const char32 *chars2) {
 	try {
 		autoStrings s1 = Strings_createAsCharacters (chars1);
 		autoStrings s2 = Strings_createAsCharacters (chars2);
 		autoEditDistanceTable me = EditDistanceTable_create (s1.peek(), s2.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("EditDistanceTable not created from character strings.");
+		Melder_throw (U"EditDistanceTable not created from character strings.");
 	}
 }
 
@@ -376,9 +376,9 @@ static void NUMrationalize (double x, long *numerator, long *denominator) {
 	double epsilon = 1e-6;
 	*numerator = 1;
 	for (*denominator = 1; *denominator <= 100000; (*denominator) ++) {
-		double numerator_d = x * *denominator, rounded = floor (numerator_d + 0.5);
+		double numerator_d = x * *denominator, rounded = round (numerator_d);
 		if (fabs (rounded - numerator_d) < epsilon) {
-			*numerator = rounded;
+			*numerator = (long) rounded;
 			return;
 		}
 	}
@@ -391,21 +391,20 @@ static void fixRows (TableOfReal me, long *rowmin, long *rowmax) {
 	else if (*rowmax > my numberOfRows) *rowmax = my numberOfRows;
 }
 
-static void print4 (wchar_t *buffer, double value, int iformat, int width, int precision) {
-	wchar_t formatString [40];
-	if (value == NUMundefined) wcscpy (buffer, L"undefined");
-	else if (iformat == 4) {
+static void print4 (char *buffer, double value, int iformat, int width, int precision) {
+	char formatString [40];
+	if (iformat == 4) {
 		long numerator, denominator;
 		NUMrationalize (value, & numerator, & denominator);
 		if (numerator == 0)
-			swprintf (buffer, 40, L"0");
+			snprintf (buffer, 40, "0");
 		else if (denominator > 1)
-			swprintf (buffer, 40, L"%ld/%ld", numerator, denominator);
+			snprintf (buffer, 40, "%ld/%ld", numerator, denominator);
 		else
-			swprintf (buffer, 40, L"%.7g", value);
+			snprintf (buffer, 40, "%.7g", value);
 	} else {
-		swprintf (formatString, 40, L"%%%d.%d%c", width, precision, iformat == 1 ? 'f' : iformat == 2 ? 'e' : 'g');
-		swprintf (buffer, 40, formatString, value);
+		snprintf (formatString, 40, "%%%d.%d%c", width, precision, iformat == 1 ? 'f' : iformat == 2 ? 'e' : 'g');
+		snprintf (buffer, 40, formatString, value);
 	}
 }
 
@@ -414,7 +413,7 @@ static double getMaxRowLabelWidth (TableOfReal me, Graphics graphics, long rowmi
 	if (! my rowLabels) return 0.0;
 	fixRows (me, & rowmin, & rowmax);
 	for (long irow = rowmin; irow <= rowmax; irow ++) if (my rowLabels [irow] && my rowLabels [irow] [0]) {
-		double textWidth = Graphics_textWidth_ps (graphics, my rowLabels [irow], TRUE);   /* SILIPA is bigger than XIPA */
+		double textWidth = Graphics_textWidth_ps (graphics, my rowLabels [irow], true);   /* SILIPA is bigger than XIPA */
 		if (textWidth > maxWidth) maxWidth = textWidth;
 	}
 	return maxWidth;
@@ -448,10 +447,10 @@ void EditDistanceTable_draw (EditDistanceTable me, Graphics graphics, int iforma
 			Graphics_text (graphics, 0.5 - leftMargin, y, my rowLabels [irow]);
 		Graphics_setTextAlignment (graphics, Graphics_CENTRE, Graphics_HALF);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-			wchar_t text [40];
+			char text [40];
 			print4 (text, my data [irow] [icol], iformat, 0, precision);
 			Graphics_setBold (graphics, onPath[irow][icol]);
-			Graphics_text (graphics, icol, y, text);
+			Graphics_text (graphics, icol, y, Melder_peek8to32 (text));
 			if (onPath[irow][icol]) {
 				Graphics_rectangle (graphics, icol-0.5, icol+0.5, y - 0.5*lineSpacing, y + 0.5*lineSpacing);
 			}
@@ -485,7 +484,7 @@ void EditDistanceTable_draw (EditDistanceTable me, Graphics graphics, int iforma
 }
 
 void EditDistanceTable_drawEditOperations (EditDistanceTable me, Graphics graphics) {
-	const wchar_t *oinsertion = L"i", *insertion = L"*", *odeletion = L"d", *deletion = L"*", *osubstitution = L"s", *oequal = L"";
+	const char32 *oinsertion = U"i", *insertion = U"*", *odeletion = U"d", *deletion = U"*", *osubstitution = U"s", *oequal = U"";
 	Graphics_setWindow (graphics, 0.5, my warpingPath -> pathLength - 0.5, 0, 1); // pathLength-1 symbols
 	double lineSpacing = getLineSpacing (graphics);
 	double ytarget = 1 - lineSpacing, ysource = ytarget - 2 * lineSpacing, yoper = ysource - lineSpacing;
@@ -504,7 +503,7 @@ void EditDistanceTable_drawEditOperations (EditDistanceTable me, Graphics graphi
 		} else { // substitution ?
 			Graphics_text (graphics, x, ytarget, my rowLabels[p.y]);
 			Graphics_text (graphics, x, ysource, my columnLabels[p.x]);
-			Graphics_text (graphics, x, yoper, (Melder_wcsequ (my rowLabels[p.y], my columnLabels[p.x]) ? oequal : osubstitution));
+			Graphics_text (graphics, x, yoper, (Melder_equ (my rowLabels[p.y], my columnLabels[p.x]) ? oequal : osubstitution));
 		}
 		Graphics_line (graphics, x, ysource + lineSpacing, x, ytarget - 0.1 * lineSpacing);
 	}
@@ -582,7 +581,7 @@ void EditDistanceTable_findPath (EditDistanceTable me, TableOfReal *directions)
 			*directions = him.transfer();
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": minimum path not found.");
+		Melder_throw (me, U": minimum path not found.");
 	}
 }
 
@@ -590,15 +589,15 @@ TableOfReal EditDistanceTable_to_TableOfReal (EditDistanceTable me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my numberOfRows, my numberOfColumns);
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			thy columnLabels[j] = Melder_wcsdup (my columnLabels[j]);
+			thy columnLabels[j] = Melder_dup (my columnLabels[j]);
 		}
 		for (long i = 1; i <= my numberOfRows; i++) {
-			thy rowLabels[i] = Melder_wcsdup (my rowLabels[i]);
+			thy rowLabels[i] = Melder_dup (my rowLabels[i]);
 		}
 		NUMmatrix_copyElements<double> (my data, thy data, 1, my numberOfRows, 1, my numberOfColumns);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no TableOfReal created.");
+		Melder_throw (me, U": no TableOfReal created.");
 	}
 }
 
diff --git a/dwtools/EditDistanceTable.h b/dwtools/EditDistanceTable.h
index 7e217e4..ebe7363 100644
--- a/dwtools/EditDistanceTable.h
+++ b/dwtools/EditDistanceTable.h
@@ -2,7 +2,7 @@
 #define _EditDistanceTable_h_
 /* EditDistanceTable.h
  *
- * Copyright (C) 2012 David Weenink
+ * Copyright (C) 2012,2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,14 +27,14 @@
 #define WARPING_fromDiag 4
 
 #include "EditDistanceTable_def.h"
-oo_CLASS_CREATE (WarpingPath, Data);
+oo_CLASS_CREATE (WarpingPath, Daata);
 oo_CLASS_CREATE (EditCostsTable, TableOfReal);
 oo_CLASS_CREATE (EditDistanceTable, TableOfReal);
 
 WarpingPath WarpingPath_create (long length);
 
 // Search the path for the corresponding axis value. If path is horizontal/vertical
-//  ivar1 and ivar2 will not ge eqal. The return value is the length of the path segment (ivar2-ivar1 +1)
+//  ivar1 and ivar2 will not be equal. The return value is the length of the path segment (ivar2-ivar1 +1)
 long WarpingPath_getColumnsFromRowIndex (WarpingPath me, long irow, long *icol1, long *icol2);
 long WarpingPath_getRowsFromColumnIndex (WarpingPath me, long icol, long *irow1, long *irow2);
 
@@ -51,21 +51,21 @@ EditCostsTable EditCostsTable_create (long targetAlphabetSize, long sourceAlphab
  */
 
 void EditCostsTable_setDefaultCosts (EditCostsTable me, double insertionCosts, double deletionCosts, double substitutionCosts);
-long EditCostsTable_getTargetIndex (EditCostsTable me, const wchar_t *symbol);
-long EditCostsTable_getSourceIndex (EditCostsTable me, const wchar_t *symbol);
-double EditCostsTable_getInsertionCost (EditCostsTable me, const wchar_t *symbol);
-void EditCostsTable_setInsertionCosts (EditCostsTable me, wchar_t *targets, double cost);
+long EditCostsTable_getTargetIndex (EditCostsTable me, const char32 *symbol);
+long EditCostsTable_getSourceIndex (EditCostsTable me, const char32 *symbol);
+double EditCostsTable_getInsertionCost (EditCostsTable me, const char32 *symbol);
+void EditCostsTable_setInsertionCosts (EditCostsTable me, char32 *targets, double cost);
 void EditCostsTable_setOthersCosts (EditCostsTable me, double insertionCosts, double deletionCost, double substitutionCost_equal, double substitutionCost_unequal);
 double EditCostsTable_getOthersCost (EditCostsTable me, int type);
-double EditCostsTable_getDeletionCost (EditCostsTable me, const wchar_t *symbol);
-void EditCostsTable_setDeletionCosts (EditCostsTable me, wchar_t *sources, double cost);
-double EditCostsTable_getSubstitutionCost (EditCostsTable me, const wchar_t *symbol, const wchar *replacement);
-void EditCostsTable_setSubstitutionCosts (EditCostsTable me, wchar_t *targets, wchar_t *sources, double cost);
+double EditCostsTable_getDeletionCost (EditCostsTable me, const char32 *symbol);
+void EditCostsTable_setDeletionCosts (EditCostsTable me, char32 *sources, double cost);
+double EditCostsTable_getSubstitutionCost (EditCostsTable me, const char32 *symbol, const char32 *replacement);
+void EditCostsTable_setSubstitutionCosts (EditCostsTable me, char32 *targets, char32 *sources, double cost);
 TableOfReal EditCostsTable_to_TableOfReal (EditCostsTable me);
 
 
 EditDistanceTable EditDistanceTable_create (Strings target, Strings source);
-EditDistanceTable EditDistanceTable_createFromCharacterStrings (const wchar_t *chars1, const wchar_t *chars2);
+EditDistanceTable EditDistanceTable_createFromCharacterStrings (const char32 *chars1, const char32 *chars2);
 void EditDistanceTable_draw (EditDistanceTable me, Graphics graphics, int iformat, int precision, double angle);
 void EditDistanceTable_drawEditOperations (EditDistanceTable me, Graphics graphics);
 void EditDistanceTable_setDefaultCosts (EditDistanceTable me, double insertionCosts, double deletionCosts, double substitutionCosts);
diff --git a/dwtools/EditDistanceTable_def.h b/dwtools/EditDistanceTable_def.h
index 139977e..4bf1664 100644
--- a/dwtools/EditDistanceTable_def.h
+++ b/dwtools/EditDistanceTable_def.h
@@ -29,7 +29,7 @@ oo_END_STRUCT (PairOfInteger)
 #undef ooSTRUCT
 
 #define ooSTRUCT WarpingPath
-oo_DEFINE_CLASS (WarpingPath, Data)
+oo_DEFINE_CLASS (WarpingPath, Daata)
 	oo_LONG (_capacity)
 	oo_LONG (pathLength)
 	oo_STRUCT_VECTOR (PairOfInteger, path, pathLength)
@@ -39,22 +39,24 @@ oo_END_CLASS (WarpingPath)
 #define ooSTRUCT EditCostsTable
 oo_DEFINE_CLASS (EditCostsTable, TableOfReal)
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
-			virtual bool v_matchTargetSymbol (const wchar_t *targetSymbol, const wchar_t *symbol);
-			virtual bool v_matchSourceSymbol (const wchar_t *sourceSymbol, const wchar_t *symbol);
-			virtual bool v_matchTargetWithSourceSymbol (const wchar_t *targetSymbol, const wchar_t *sourceSymbol);
+		void v_info ()
+			override;
+
+		virtual bool v_matchTargetSymbol (const char32 *targetSymbol, const char32 *symbol);
+		virtual bool v_matchSourceSymbol (const char32 *sourceSymbol, const char32 *symbol);
+		virtual bool v_matchTargetWithSourceSymbol (const char32 *targetSymbol, const char32 *sourceSymbol);
 	#endif
 oo_END_CLASS (EditCostsTable)
 #undef ooSTRUCT
 
 #define ooSTRUCT EditDistanceTable
-	oo_DEFINE_CLASS (EditDistanceTable, TableOfReal)
+oo_DEFINE_CLASS (EditDistanceTable, TableOfReal)
 	oo_OBJECT (WarpingPath, 0, warpingPath)
 	#if oo_DECLARING
 		oo_OBJECT (EditCostsTable, 0, editCostsTable)
-		// overridden methods:
-			virtual void v_info ();
+
+		void v_info ()
+			override;
 	#endif
 oo_END_CLASS (EditDistanceTable)
 #undef ooSTRUCT
diff --git a/dwtools/Eigen_and_Matrix.cpp b/dwtools/Eigen_and_Matrix.cpp
index a55929c..75199d7 100644
--- a/dwtools/Eigen_and_Matrix.cpp
+++ b/dwtools/Eigen_and_Matrix.cpp
@@ -24,10 +24,8 @@
 
 #include "Eigen_and_Matrix.h"
 
-Matrix Eigen_and_Matrix_project (I, thou, long numberOfComponents) {
+Matrix Eigen_and_Matrix_project (Eigen me, Matrix thee, long numberOfComponents) {
 	try {
-		iam (Eigen);
-		thouart (Matrix);
 		if (numberOfComponents == 0) {
 			numberOfComponents = my numberOfEigenvalues;
 		}
@@ -38,21 +36,20 @@ Matrix Eigen_and_Matrix_project (I, thou, long numberOfComponents) {
 		Eigen_and_Matrix_project_into (me, thee, &thim);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Projection Matrix not created.");
+		Melder_throw (U"Projection Matrix not created.");
 	}
 }
 
-void Eigen_and_Matrix_project_into (I, thou, Any void_pointer_to_him) {
-	iam (Eigen); thouart (Matrix);
-	Matrix him = * ( (Matrix *) void_pointer_to_him);
+void Eigen_and_Matrix_project_into (Eigen me, Matrix thee, Matrix *pointer_to_him) {
+	Matrix him = *pointer_to_him;
 
 	if (my dimension != thy ny) Melder_throw
-		("The number of rows in the 'from' Matrix must equal the dimension of the eigenvector.");
+		(U"The number of rows in the 'from' Matrix must equal the dimension of the eigenvector.");
 	if (his nx != thy nx) {
-		Melder_throw ("The number of columns in the Matrixes must be equal.");
+		Melder_throw (U"The number of columns in the Matrixes must be equal.");
 	}
 	if (his ny > my numberOfEigenvalues) Melder_throw
-		("The number of rows in the 'to' Matrix cannot exceed the number of eigenvectors.");
+		(U"The number of rows in the 'to' Matrix cannot exceed the number of eigenvectors.");
 
 	for (long i = 1; i <= thy nx; i++) {
 		for (long j = 1; j <= his ny; j++) {
diff --git a/dwtools/Eigen_and_Matrix.h b/dwtools/Eigen_and_Matrix.h
index 2eeadf4..9945640 100644
--- a/dwtools/Eigen_and_Matrix.h
+++ b/dwtools/Eigen_and_Matrix.h
@@ -26,33 +26,20 @@
  djmw 20110307 Latest modification
 */
 
-#ifndef _Eigen_h_
-	#include "Eigen.h"
-#endif
+#include "Eigen.h"
+#include "Matrix.h"
 
-#ifndef _Matrix_h_
-	#include "Matrix.h"
-#endif
-
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-Matrix Eigen_and_Matrix_project (I, thou, long numberOfComponents);
+Matrix Eigen_and_Matrix_project (Eigen me, Matrix thee, long numberOfComponents);
 /*
 	Purpose: project the columns of the matrix (thou) on the 
 	eigenspace (me). 
 */
 
-void Eigen_and_Matrix_project_into (I, thou, Any void_pointer_to_him);
+void Eigen_and_Matrix_project_into (Eigen me, Matrix thee, Matrix *pointer_to_him);
 /*
 	Purpose: project the columns of the Matrix (thou) on the 
 	eigenspace (me). Result in existing Matrix (him). 
 
 */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Eigen_and_Matrix_h_ */
diff --git a/dwtools/Eigen_and_Procrustes.cpp b/dwtools/Eigen_and_Procrustes.cpp
index 29ab94f..7a3389b 100644
--- a/dwtools/Eigen_and_Procrustes.cpp
+++ b/dwtools/Eigen_and_Procrustes.cpp
@@ -29,11 +29,11 @@ Procrustes Eigens_to_Procrustes (I, thou, long evec_from, long evec_to) {
 		long nmin = my numberOfEigenvalues < thy numberOfEigenvalues ? my numberOfEigenvalues : thy numberOfEigenvalues;
 
 		if (my dimension != thy dimension) {
-			Melder_throw ("The eigenvectors must have the same dimension.");
+			Melder_throw (U"The eigenvectors must have the same dimension.");
 		}
 
 		if (evec_from > evec_to || evec_from < 1 || evec_to > nmin) {
-			Melder_throw ("Eigenvector range too large.");
+			Melder_throw (U"Eigenvector range too large.");
 		}
 
 		autoNUMmatrix<double> x (1, my dimension, 1, nvectors);
@@ -48,10 +48,10 @@ Procrustes Eigens_to_Procrustes (I, thou, long evec_from, long evec_to) {
 
 		autoProcrustes him = Procrustes_create (nvectors);
 
-		NUMProcrustes (x.peek(), y.peek(), my dimension, nvectors, his r, NULL, NULL);
+		NUMProcrustes (x.peek(), y.peek(), my dimension, nvectors, his r, nullptr, nullptr);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Procrustes not created from Eigens.");
+		Melder_throw (U"Procrustes not created from Eigens.");
 	}
 }
 
diff --git a/dwtools/Eigen_and_Procrustes.h b/dwtools/Eigen_and_Procrustes.h
index 31327dc..94248b2 100644
--- a/dwtools/Eigen_and_Procrustes.h
+++ b/dwtools/Eigen_and_Procrustes.h
@@ -27,14 +27,6 @@
 #include "Eigen.h"
 #include "Procrustes.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 Procrustes Eigens_to_Procrustes (I, thou, long evec_from, long evec_to);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Eigen_and_Procrustes_h_ */
diff --git a/dwtools/Eigen_and_SSCP.cpp b/dwtools/Eigen_and_SSCP.cpp
index 1463640..09d35d7 100644
--- a/dwtools/Eigen_and_SSCP.cpp
+++ b/dwtools/Eigen_and_SSCP.cpp
@@ -55,13 +55,13 @@ SSCP Eigen_and_SSCP_project (I, SSCP thee) {
 	try {
 		iam (Eigen);
 		if (thy numberOfRows != my dimension) {
-			Melder_throw ("SSCP_and_Eigen_project: dimensions don't agree.");
+			Melder_throw (U"SSCP_and_Eigen_project: dimensions don't agree.");
 		}
 		autoSSCP him = SSCP_create (my numberOfEigenvalues);
 		Eigen_and_SSCP_project_ (me, thee, him.peek());
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SSCP not projected.");
+		Melder_throw (U"SSCP not projected.");
 	}
 }
 
@@ -69,13 +69,13 @@ Covariance Eigen_and_Covariance_project (I, Covariance thee) {
 	try {
 		iam (Eigen);
 		if (thy numberOfRows != my dimension) {
-			Melder_throw ("Covariance_and_Eigen_project: dimensions don't agree.");
+			Melder_throw (U"Covariance_and_Eigen_project: dimensions don't agree.");
 		}
 		autoCovariance him = Covariance_create (my numberOfEigenvalues);
 		Eigen_and_SSCP_project_ (me, thee, him.peek());
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Covariance not projected.");
+		Melder_throw (U"Covariance not projected.");
 	}
 }
 
diff --git a/dwtools/Eigen_and_SSCP.h b/dwtools/Eigen_and_SSCP.h
index 52d0867..38c7f59 100644
--- a/dwtools/Eigen_and_SSCP.h
+++ b/dwtools/Eigen_and_SSCP.h
@@ -24,17 +24,8 @@
  djmw 20040219 GPL header
 */
 
-#ifndef _Eigen_h_
-	#include "Eigen.h"
-#endif
-
-#ifndef _SSCP_h_
-	#include "SSCP.h"
-#endif
-
-#ifdef __cplusplus
-	extern "C" {
-#endif
+#include "Eigen.h"
+#include "SSCP.h"
 
 SSCP Eigen_and_SSCP_project (I, SSCP thee);
 Covariance Eigen_and_Covariance_project (I, Covariance thee);
@@ -43,8 +34,4 @@ Covariance Eigen_and_Covariance_project (I, Covariance thee);
 	Returns SSCP-object with square matrix dimension 'my numberOfEigenvalues'
 */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Eigen_and_SSCP_h_ */
diff --git a/dwtools/Eigen_and_TableOfReal.cpp b/dwtools/Eigen_and_TableOfReal.cpp
index c2d0861..78ffe38 100644
--- a/dwtools/Eigen_and_TableOfReal.cpp
+++ b/dwtools/Eigen_and_TableOfReal.cpp
@@ -28,12 +28,9 @@
 #include "Eigen_and_TableOfReal.h"
 #include "NUM2.h"
 
-TableOfReal Eigen_and_TableOfReal_project (I, thou, long from,
+TableOfReal Eigen_and_TableOfReal_project (Eigen me, TableOfReal thee, long from,
         long numberOfComponents) {
 	try {
-		iam (Eigen);
-		thouart (TableOfReal);
-
 		if (numberOfComponents == 0) {
 			numberOfComponents = my numberOfEigenvalues;
 		}
@@ -44,26 +41,24 @@ TableOfReal Eigen_and_TableOfReal_project (I, thou, long from,
 		NUMstrings_copyElements (thy rowLabels, his rowLabels, 1, thy numberOfRows);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal not created from projection.");
+		Melder_throw (U"TableOfReal not created from projection.");
 	}
 }
 
-void Eigen_and_TableOfReal_project_into (I, thou, long thee_from, long thee_to,
+void Eigen_and_TableOfReal_project_into (Eigen me, TableOfReal thee, long thee_from, long thee_to,
         Any void_pointer_to_him, long his_from, long his_to) {
 	TableOfReal him = * ( (TableOfReal *) void_pointer_to_him);
-	thouart (TableOfReal);
-	iam (Eigen);
 	long thee_ncols = thee_to - thee_from + 1;
 	long his_ncols = his_to - his_from + 1;
 
 	if (thee_from < 1 || thee_to > thy numberOfColumns || his_from < 1 || his_to > his numberOfColumns) {
-		Melder_throw (L"Column selection not correct.");
+		Melder_throw (U"Column selection not correct.");
 	}
 	if (thee_ncols != my dimension) {
-		Melder_throw ("The number of selected columns to project (", thee_ncols, ") must equal the dimension of the eigenvectors (", my dimension, ").");
+		Melder_throw (U"The number of selected columns to project (", thee_ncols, U") must equal the dimension of the eigenvectors (", my dimension, U").");
 	}
 	if (his_ncols > my numberOfEigenvalues) {
-		Melder_throw ("The number of selected columns in the result (", his_ncols, ") cannot exceed the number of eigenvectors (", my numberOfEigenvalues, ").");
+		Melder_throw (U"The number of selected columns in the result (", his_ncols, U") cannot exceed the number of eigenvectors (", my numberOfEigenvalues, U").");
 	}
 
 	for (long i = 1; i <= thy numberOfRows; i++) { /* row */
@@ -83,13 +78,13 @@ void Eigen_and_TableOfReal_project_into (I, thou, long thee_from, long thee_to,
 Eigen TablesOfReal_to_Eigen_gsvd (TableOfReal me, TableOfReal thee) {
 	try {
 		if (my numberOfColumns != thy numberOfColumns) {
-			Melder_throw ("TablesOfReal_to_Eigen: Number of columns must be equal.");
+			Melder_throw (U"TablesOfReal_to_Eigen: Number of columns must be equal.");
 		}
 		autoEigen him = Thing_new (Eigen);
 		Eigen_initFromSquareRootPair (him.peek(), my data, my numberOfRows, my numberOfColumns, thy data, thy numberOfRows);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": Eigen not created.");
+		Melder_throw (me, U": Eigen not created.");
 	}
 }
 
diff --git a/dwtools/Eigen_and_TableOfReal.h b/dwtools/Eigen_and_TableOfReal.h
index ed4fbcf..cae7ad6 100644
--- a/dwtools/Eigen_and_TableOfReal.h
+++ b/dwtools/Eigen_and_TableOfReal.h
@@ -26,26 +26,17 @@
  djmw 20110307 Latest modification
 */
 
-#ifndef _Eigen_h_
-	#include "Eigen.h"
-#endif
+#include "Eigen.h"
+#include "TableOfReal.h"
 
-#ifndef _TableOfReal_h_
-	#include "TableOfReal.h"
-#endif
-
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-TableOfReal Eigen_and_TableOfReal_project (I, thou, long from,
+TableOfReal Eigen_and_TableOfReal_project (Eigen me, TableOfReal thee, long from,
 	long numberOfComponents);
 /*
 	Purpose: project the rows of the TableOfReal (thee) starting at index 'from'
 	on the eigenspace (me).
 */
 
-void Eigen_and_TableOfReal_project_into (I, thou, long thee_from, long thee_to,
+void Eigen_and_TableOfReal_project_into (Eigen me, TableOfReal thee, long thee_from, long thee_to,
 	Any void_pointer_to_him, long his_from, long his_to);
 /*
 	Purpose: project the rows of the TableOfReal (thee) on the
@@ -57,8 +48,4 @@ Eigen TablesOfReal_to_Eigen_gsvd (TableOfReal me, TableOfReal thee);
 	Solve A'A x -lambda B'B x = 0
 */
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Eigen_and_TableOfReal_h_ */
diff --git a/dwtools/Excitations.cpp b/dwtools/Excitations.cpp
index 2e91c01..59cadb0 100644
--- a/dwtools/Excitations.cpp
+++ b/dwtools/Excitations.cpp
@@ -19,7 +19,7 @@
 
 /*
  djmw 20020813 GPL header
- djmw 20071009 wchar_t
+ djmw 20071009 wchar
  djmw 20071017 Melder_error<n>
  djmw 20090914 getItem modified
  djmw 20110304 Thing_new
@@ -51,7 +51,7 @@ Excitations Excitations_create (long initialCapacity) {
 		Ordered_init (me.peek(), classExcitation, initialCapacity);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Excitations not created.");
+		Melder_throw (U"Excitations not created.");
 	}
 }
 
@@ -63,7 +63,7 @@ Pattern Excitations_to_Pattern (Excitations me, long join) {
 			join = 1;
 		}
 		if ( (my size % join) != 0) {
-			Melder_throw ("Number of rows is not a multiple of join.");
+			Melder_throw (U"Number of rows is not a multiple of join.");
 		}
 		autoPattern thee = Pattern_create (my size / join, join * m -> nx);
 		long r = 0, c = 1;
@@ -79,7 +79,7 @@ Pattern Excitations_to_Pattern (Excitations me, long join) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Pattern created.");
+		Melder_throw (me, U": no Pattern created.");
 	}
 }
 
@@ -96,20 +96,20 @@ TableOfReal Excitations_to_TableOfReal (Excitations me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no TableOfReal created.");
+		Melder_throw (me, U": no TableOfReal created.");
 	}
 }
 
 Excitation Excitations_getItem (Excitations me, long item) {
 	try {
 		if (item < 1 || item > my size) {
-			Melder_throw ("Not a valid element number.");
+			Melder_throw (U"Not a valid element number.");
 		}
 		autoExcitation thee = Data_copy ( (Excitation) my item[item]);
 		Thing_setName (thee.peek(), Thing_getName ( (Thing) my item[item]));
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Excitation created.");
+		Melder_throw (me, U": no Excitation created.");
 	}
 }
 
diff --git a/dwtools/FilterBank.cpp b/dwtools/FilterBank.cpp
index 1902606..0d22568 100644
--- a/dwtools/FilterBank.cpp
+++ b/dwtools/FilterBank.cpp
@@ -67,11 +67,11 @@ static double scaleFrequency (double f, int scale_from, int scale_to) {
 	return f;
 }
 
-static wchar_t const *GetFreqScaleText (int scale) {
-	wchar_t const *hertz = L"Frequency (Hz)";
-	wchar_t const *bark = L"Frequency (Bark)";
-	wchar_t const *mel = L"Frequency (mel)";
-	wchar_t const *error = L"Frequency (undefined)";
+static char32 const *GetFreqScaleText (int scale) {
+	char32 const *hertz = U"Frequency (Hz)";
+	char32 const *bark = U"Frequency (Bark)";
+	char32 const *mel = U"Frequency (mel)";
+	char32 const *error = U"Frequency (undefined)";
 	if (scale == FilterBank_HERTZ) {
 		return hertz;
 	} else if (scale == FilterBank_BARK) {
@@ -82,10 +82,9 @@ static wchar_t const *GetFreqScaleText (int scale) {
 	return error;
 }
 
-static int checkLimits (I, int fromFreqScale, int toFreqScale, int *fromFilter,
+static int checkLimits (Matrix me, int fromFreqScale, int toFreqScale, int *fromFilter,
                         int *toFilter, double *zmin, double *zmax, int dbScale,
                         double *ymin, double *ymax) {
-	iam (Matrix);
 
 	if (*fromFilter == 0) {
 		*fromFilter = 1;
@@ -104,12 +103,12 @@ static int checkLimits (I, int fromFreqScale, int toFreqScale, int *fromFilter,
 		*toFilter = my ny;
 	}
 	if (*fromFilter > *toFilter) {
-		Melder_warning (L"Filter numbers must be in range [1, ", Melder_integer (my ny), L"]");
+		Melder_warning (U"Filter numbers must be in range [1, ", my ny, U"]");
 		return 0;
 	}
 
 	if (*zmin < 0 || *zmax < 0) {
-		Melder_warning (L"Frequencies must be positive.");
+		Melder_warning (U"Frequencies must be positive.");
 		return 0;
 	}
 	if (*zmax <= *zmin) {
@@ -169,13 +168,13 @@ Thing_implement (FilterBank, Matrix, 2);
 Thing_implement (BarkFilter, FilterBank, 2);
 
 BarkFilter BarkFilter_create (double tmin, double tmax, long nt, double dt,
-                              double t1, double fmin, double fmax, long nf, double df, long f1) {
+                              double t1, double fmin, double fmax, long nf, double df, double f1) {
 	try {
 		autoBarkFilter me = Thing_new (BarkFilter);
 		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, fmin, fmax, nf, df, f1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("BarkFilter not created.");
+		Melder_throw (U"BarkFilter not created.");
 	}
 }
 
@@ -205,7 +204,7 @@ void FilterBank_drawFrequencyScales (I, Graphics g, int horizontalScale, double
 	int myFreqScale = FilterBank_getFrequencyScale (me);
 
 	if (xmin < 0 || xmax < 0 || ymin < 0 || ymax < 0) {
-		Melder_warning (L"Frequencies must be >= 0.");
+		Melder_warning (U"Frequencies must be >= 0.");
 		return;
 	}
 
@@ -249,10 +248,10 @@ void FilterBank_drawFrequencyScales (I, Graphics g, int horizontalScale, double
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, GetFreqScaleText (verticalScale));
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_textBottom (g, 1, GetFreqScaleText (horizontalScale));
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, GetFreqScaleText (verticalScale));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textBottom (g, true, GetFreqScaleText (horizontalScale));
 	}
 }
 
@@ -285,10 +284,10 @@ void FilterBank_paint (FilterBank me, Graphics g, double xmin, double xmax, doub
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, GetFreqScaleText (my v_getFrequencyScale ()));
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_textBottom (g, 1, L"Time (s)");
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, GetFreqScaleText (my v_getFrequencyScale ()));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textBottom (g, true, U"Time (s)");
 	}
 }
 
@@ -318,9 +317,9 @@ void BarkFilter_drawSekeyHansonFilterFunctions (BarkFilter me, Graphics g,
 				a[i] = NUMundefined;
 			} else {
 				z -= zMid + 0.215;
-				a[i] = 7 - 7.5 * z - 17.5 * sqrt (0.196 + z * z);
+				a[i] = 7.0 - 7.5 * z - 17.5 * sqrt (0.196 + z * z);
 				if (! dbScale) {
-					a[i] = pow (10, a[i]);
+					a[i] = pow (10.0, a[i]);
 				}
 			}
 		}
@@ -338,13 +337,13 @@ void BarkFilter_drawSekeyHansonFilterFunctions (BarkFilter me, Graphics g,
 	Graphics_unsetInner (g);
 
 	if (garnish) {
-		double distance = dbScale ? 10 : 1;
-		wchar_t const *ytext = dbScale ? L"Amplitude (dB)" : L"Amplitude";
+		double distance = dbScale ? 10.0 : 1.0;
+		const char32 *ytext = dbScale ? U"Amplitude (dB)" : U"Amplitude";
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1, distance, 1, 1, 0);
-		Graphics_textLeft (g, 1, ytext);
-		Graphics_textBottom (g, 1, GetFreqScaleText (toFreqScale));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, distance, true, true, false);
+		Graphics_textLeft (g, true, ytext);
+		Graphics_textBottom (g, true, GetFreqScaleText (toFreqScale));
 	}
 }
 
@@ -357,7 +356,7 @@ MelFilter MelFilter_create (double tmin, double tmax, long nt, double dt,
 		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, fmin, fmax, nf, df, f1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("MelFilter not created.");
+		Melder_throw (U"MelFilter not created.");
 	}
 }
 
@@ -373,15 +372,15 @@ void FilterBank_drawFilters (I, Graphics g, long fromf, long tof,
 }*/
 
 void FilterBank_drawTimeSlice (I, Graphics g, double t, double fmin,
-                               double fmax, double min, double max, const wchar_t *xlabel, int garnish) {
+                               double fmax, double min, double max, const char32 *xlabel, int garnish) {
 	iam (Matrix);
 	Matrix_drawSliceY (me, g, t, fmin, fmax, min, max);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 		if (xlabel) {
-			Graphics_textBottom (g, 0, xlabel);
+			Graphics_textBottom (g, false, xlabel);
 		}
 	}
 }
@@ -434,13 +433,13 @@ void MelFilter_drawFilterFunctions (MelFilter me, Graphics g,
 	Graphics_unsetInner (g);
 
 	if (garnish) {
-		double distance = dbScale ? 10 : 1;
-		wchar_t const *ytext = dbScale ? L"Amplitude (dB)" : L"Amplitude";
+		double distance = dbScale ? 10.0 : 1.0;
+		char32 const *ytext = dbScale ? U"Amplitude (dB)" : U"Amplitude";
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1, distance, 1, 1, 0);
-		Graphics_textLeft (g, 1, ytext);
-		Graphics_textBottom (g, 1, GetFreqScaleText (toFreqScale));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, distance, true, true, false);
+		Graphics_textLeft (g, true, ytext);
+		Graphics_textBottom (g, true, GetFreqScaleText (toFreqScale));
 	}
 }
 
@@ -462,7 +461,7 @@ void MelFilter_drawFilters (MelFilter me, Graphics g, long from, long to,
 		from = 1;
 		to = my ny;
 	}
-	Graphics_setWindow (g, my ymin, my ymax, 0, 1);
+	Graphics_setWindow (g, my ymin, my ymax, 0.0, 1.0);
 	Graphics_setInner (g);
 	for (i = from; i <= to; i++)
 	{
@@ -473,8 +472,8 @@ void MelFilter_drawFilters (MelFilter me, Graphics g, long from, long to,
 		*//*
 			Draw triangle
 		*//*
-		Graphics_line (g, fl_hz, 0, fc_hz, 1);
-		Graphics_line (g, fc_hz, 1, fh_hz, 0);
+		Graphics_line (g, fl_hz, 0.0, fc_hz, 1.0);
+		Graphics_line (g, fc_hz, 1.0, fh_hz, 0.0);
 	}
 	Graphics_unsetInner (g);
 }
@@ -487,7 +486,7 @@ Matrix FilterBank_to_Matrix (I) {
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
@@ -499,7 +498,7 @@ BarkFilter Matrix_to_BarkFilter (I) {
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to BarkFilter.");
+		Melder_throw (me, U": not converted to BarkFilter.");
 	}
 }
 
@@ -511,7 +510,7 @@ MelFilter Matrix_to_MelFilter (I) {
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to MelFilter.");
+		Melder_throw (me, U": not converted to MelFilter.");
 	}
 }
 
@@ -524,7 +523,7 @@ FormantFilter FormantFilter_create (double tmin, double tmax, long nt,
 		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, fmin, fmax, nf, df, f1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("FormantFilter not created.");
+		Melder_throw (U"FormantFilter not created.");
 	}
 }
 
@@ -537,7 +536,7 @@ void FormantFilter_drawFilterFunctions (FormantFilter me, Graphics g, double ban
 	}
 
 	if (bandwidth <= 0) {
-		Melder_warning (L"Bandwidth must be greater than zero.");
+		Melder_warning (U"Bandwidth must be greater than zero.");
 	}
 
 	long n = 1000;
@@ -578,12 +577,12 @@ void FormantFilter_drawFilterFunctions (FormantFilter me, Graphics g, double ban
 
 	if (garnish) {
 		double distance = dbScale ? 10 : 1;
-		wchar_t const *ytext = dbScale ? L"Amplitude (dB)" : L"Amplitude";
+		char32 const *ytext = dbScale ? U"Amplitude (dB)" : U"Amplitude";
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1, distance, 1, 1, 0);
-		Graphics_textLeft (g, 1, ytext);
-		Graphics_textBottom (g, 1, GetFreqScaleText (toFreqScale));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, distance, true, true, false);
+		Graphics_textLeft (g, true, ytext);
+		Graphics_textBottom (g, true, GetFreqScaleText (toFreqScale));
 	}
 }
 
@@ -595,7 +594,7 @@ FormantFilter Matrix_to_FormantFilter (I) {
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to FormantFilter.");
+		Melder_throw (me, U": not converted to FormantFilter.");
 	}
 }
 
@@ -610,7 +609,7 @@ Spectrum FormantFilter_to_Spectrum_slice (FormantFilter me, double t) {
 		thy x1 = my y1;
 		thy dx = my dy;   /* Frequency step. */
 
-		long frame = Sampled_xToIndex (me, t);
+		long frame = Sampled_xToNearestIndex (me, t);
 		if (frame < 1) {
 			frame = 1;
 		}
@@ -628,7 +627,7 @@ Spectrum FormantFilter_to_Spectrum_slice (FormantFilter me, double t) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": Spectral slice not created.");
+		Melder_throw (me, U": Spectral slice not created.");
 	}
 }
 
@@ -647,7 +646,7 @@ Intensity FilterBank_to_Intensity (I) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": Intensity not created.");
+		Melder_throw (me, U": Intensity not created.");
 	}
 }
 
@@ -671,7 +670,7 @@ void FilterBank_and_PCA_drawComponent (I, PCA thee, Graphics g, long component,
                                        double frequencyOffset, double scale, double tmin, double tmax, double fmin, double fmax) {
 	iam (FilterBank);
 	if (component < 1 || component > thy numberOfEigenvalues) {
-		Melder_throw ("Component too large.");
+		Melder_throw (U"Component too large.");
 	}
 
 	// Scale Intensity
@@ -697,7 +696,7 @@ MelSpectrogram MelFilter_to_MelSpectrogram (MelFilter me) {
 		}
 		return thee.transfer ();
 	} catch (MelderError) {
-		Melder_throw ("MelSpectrogram not created.");
+		Melder_throw (U"MelSpectrogram not created.");
 	}
 }
 
@@ -711,7 +710,7 @@ BarkSpectrogram BarkFilter_to_BarkSpectrogram (BarkFilter me) {
 		}
 		return thee.transfer ();
 	} catch (MelderError) {
-		Melder_throw ("BarkSpectrogram not created.");
+		Melder_throw (U"BarkSpectrogram not created.");
 	}
 }
 
@@ -725,7 +724,7 @@ Spectrogram FormantFilter_to_Spectrogram (FormantFilter me) {
 		}
 		return thee.transfer ();
 	} catch (MelderError) {
-		Melder_throw ("Spectrogram not created.");
+		Melder_throw (U"Spectrogram not created.");
 	}
 }
 
@@ -762,7 +761,7 @@ static void NUMinverseCosineTransform (double *x, double *y, long n, double **co
 	}
 }
 
-double testCosineTransform (long n) {
+static double testCosineTransform (long n) {
 	try {
 		autoNUMvector<double> x (1, n);
 		autoNUMvector<double> y (1, n);
@@ -781,7 +780,7 @@ double testCosineTransform (long n) {
 		delta = sqrt (delta);
 		return delta;
 	} catch (MelderError) {
-		Melder_throw ("Test cosine transform error");
+		Melder_throw (U"Test cosine transform error");
 	}
 }
 
@@ -791,7 +790,7 @@ MFCC MelFilter_to_MFCC (MelFilter me, long numberOfCoefficients) {
 		autoNUMvector<double> x (1, my ny);
 		autoNUMvector<double> y (1, my ny);
 		
-		double fmax_mel = my y1 + (my ny - 1) * my dy;
+		//double fmax_mel = my y1 + (my ny - 1) * my dy;
 		numberOfCoefficients = numberOfCoefficients > my ny - 1 ? my ny - 1 : numberOfCoefficients;
 		Melder_assert (numberOfCoefficients > 0);
 		// 20130220 new interpretation of maximumNumberOfCoefficients necessary for inverse transform 
@@ -810,7 +809,7 @@ MFCC MelFilter_to_MFCC (MelFilter me, long numberOfCoefficients) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MFCC created.");
+		Melder_throw (me, U": no MFCC created.");
 	}
 }
 
@@ -826,7 +825,7 @@ MelFilter MFCC_to_MelFilter (MFCC me, long first, long last) {
 		}
 
 		if (first < 0 || last > nf - 1) {
-			Melder_throw ("MFCC_to_MelFilter: coefficients must be in interval [0,", my maximumNumberOfCoefficients, "].");
+			Melder_throw (U"MFCC_to_MelFilter: coefficients must be in interval [0,", my maximumNumberOfCoefficients, U"].");
 		}
 		double df = (my fmax - my fmin) / (nf + 1);
 		autoMelFilter thee = MelFilter_create (my xmin, my xmax, my nx, my dx, my x1, my fmin, my fmax, nf, df, df);
@@ -845,20 +844,20 @@ MelFilter MFCC_to_MelFilter (MFCC me, long first, long last) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MelFilter created.");
+		Melder_throw (me, U": no MelFilter created.");
 	}
 }
 
 
-MelFilter MFCC_to_MelFilter2 (MFCC me, long first_cc, long last_cc, double f1_mel, double df_mel) {
+static MelFilter MFCC_to_MelFilter2 (MFCC me, long first_cc, long last_cc, double f1_mel, double df_mel) {
 	try {
 		int use_c0 = 0;
-		long nf = ((my fmax - my fmin) / df_mel + 0.5);
+		long nf = lround ((my fmax - my fmin) / df_mel);
 		double fmin = MAX (f1_mel - df_mel, 0), fmax = f1_mel + (nf + 1) * df_mel;
 
 		if (nf < 1) {
-			Melder_throw ("MFCC_to_MelFilter: the position of the first filter, the distance between the filters, "
-			"and, the maximum do not result in a positive number of filters.");
+			Melder_throw (U"MFCC_to_MelFilter: the position of the first filter, the distance between the filters, "
+			U"and, the maximum do not result in a positive number of filters.");
 		}
 
 		// Default values
@@ -874,10 +873,10 @@ MelFilter MFCC_to_MelFilter2 (MFCC me, long first_cc, long last_cc, double f1_me
 		// Be strict
 
 		if (last_cc < first_cc || first_cc < 1 || last_cc > my maximumNumberOfCoefficients) {
-			Melder_throw ("MFCC_to_MelFilter: coefficients must be in interval [1,", my maximumNumberOfCoefficients, "].");
+			Melder_throw (U"MFCC_to_MelFilter: coefficients must be in interval [1,", my maximumNumberOfCoefficients, U"].");
 		}
 		autoNUMmatrix<double> dct (NUMcosinesTable (first_cc, last_cc, nf), first_cc, 1); // TODO ??
-		//if ((dct = NUMcosinesTable (first_cc, last_cc, nf)) == NULL) return NULL;
+		//if ((dct = NUMcosinesTable (first_cc, last_cc, nf)) == nullptr) return nullptr;
 
 		autoMelFilter thee = MelFilter_create (my xmin, my xmax, my nx, my dx, my x1, fmin, fmax, nf, df_mel, f1_mel);
 
@@ -901,7 +900,7 @@ MelFilter MFCC_to_MelFilter2 (MFCC me, long first_cc, long last_cc, double f1_me
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MelFilter created.");
+		Melder_throw (me, U": no MelFilter created.");
 	}
 }
 
@@ -934,7 +933,7 @@ static double gaussian_window_squared_correction (long n) {
 
 static Matrix Sound_to_spectralpower (Sound me) {
 	try {
-		autoSpectrum s = Sound_to_Spectrum (me, TRUE);
+		autoSpectrum s = Sound_to_Spectrum (me, true);
 		autoMatrix thee = Matrix_create (s -> xmin, s -> xmax, s -> nx, s -> dx, s -> x1, 1, 1, 1, 1, 1);
 		double scale = 2.0 * s -> dx / (my xmax - my xmin);
 
@@ -953,7 +952,7 @@ static Matrix Sound_to_spectralpower (Sound me) {
 		z[s -> nx] *= 0.5;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Matrix with spectral power created.");
+		Melder_throw (me, U": no Matrix with spectral power created.");
 	}
 }
 
@@ -1004,9 +1003,9 @@ BarkFilter Sound_to_BarkFilter (Sound me, double analysisWidth, double dt, doubl
 		}
 
 		fmax_bark = MIN (fmax_bark, zmax);
-		long nf = floor ( (fmax_bark - f1_bark) / df_bark + 0.5);
+		long nf = lround ( (fmax_bark - f1_bark) / df_bark);
 		if (nf <= 0) {
-			Melder_throw ("The combination of filter parameters is not valid.");
+			Melder_throw (U"The combination of filter parameters is not valid.");
 		}
 
 		Sampled_shortTermAnalysis (me, windowDuration, dt, & nt, & t1);
@@ -1015,7 +1014,7 @@ BarkFilter Sound_to_BarkFilter (Sound me, double analysisWidth, double dt, doubl
 		autoBarkFilter thee = BarkFilter_create (my xmin, my xmax, nt, dt, t1,
 		                      fmin_bark, fmax_bark, nf, df_bark, f1_bark);
 
-		autoMelderProgress progess (L"BarkFilter analysis");
+		autoMelderProgress progess (U"BarkFilter analysis");
 
 		for (long i = 1; i <= nt; i++) {
 			double t = Sampled_indexToX (thee.peek(), i);
@@ -1029,14 +1028,14 @@ BarkFilter Sound_to_BarkFilter (Sound me, double analysisWidth, double dt, doubl
 			}
 
 			if ( (i % 10) == 1) {
-				Melder_progress ( (double) i / nt,  L"BarkFilter analysis: frame ",
-					Melder_integer (i), L" from ", Melder_integer (nt), L".");
+				Melder_progress ( (double) i / nt,  U"BarkFilter analysis: frame ",
+					i, U" from ", nt, U".");
 			}
 		}
 
 		if (frameErrorCount > 0) {
-			Melder_warning (L"Analysis results of ", Melder_integer (frameErrorCount), L" frame(s) out of ",
-				Melder_integer (nt), L" will be suspect.");
+			Melder_warning (U"Analysis results of ", frameErrorCount, U" frame(s) out of ",
+				nt, U" will be suspect.");
 		}
 
 		double ref = FilterBank_DBREF * gaussian_window_squared_correction (window -> nx);
@@ -1044,7 +1043,7 @@ BarkFilter Sound_to_BarkFilter (Sound me, double analysisWidth, double dt, doubl
 		NUMdmatrix_to_dBs (thy z, 1, thy ny, 1, thy nx, ref, FilterBank_DBFAC, FilterBank_DBFLOOR);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no BarkFilter created.");
+		Melder_throw (me, U": no BarkFilter created.");
 	}
 }
 
@@ -1099,7 +1098,7 @@ MelFilter Sound_to_MelFilter (Sound me, double analysisWidth, double dt, double
 
 		// Determine the number of filters.
 
-		long nf = floor ((fmax_mel - f1_mel) / df_mel + 0.5);
+		long nf = lround ((fmax_mel - f1_mel) / df_mel);
 		fmax_mel = f1_mel + nf * df_mel;
 
 		Sampled_shortTermAnalysis (me, windowDuration, dt, &nt, &t1);
@@ -1107,7 +1106,7 @@ MelFilter Sound_to_MelFilter (Sound me, double analysisWidth, double dt, double
 		autoSound window = Sound_createGaussian (windowDuration, samplingFrequency);
 		autoMelFilter thee = MelFilter_create (my xmin, my xmax, nt, dt, t1, fmin_mel, fmax_mel, nf, df_mel, f1_mel);
 
-		autoMelderProgress progress (L"MelFilters analysis");
+		autoMelderProgress progress (U"MelFilters analysis");
 
 		for (long i = 1; i <= nt; i++) {
 			double t = Sampled_indexToX (thee.peek(), i);
@@ -1117,13 +1116,13 @@ MelFilter Sound_to_MelFilter (Sound me, double analysisWidth, double dt, double
 				frameErrorCount++;
 			}
 			if ( (i % 10) == 1) {
-				Melder_progress ((double) i / nt, L"Frame ", Melder_integer (i), L" out of ", Melder_integer (nt), L".");
+				Melder_progress ((double) i / nt, U"Frame ", i, U" out of ", nt, U".");
 			}
 		}
 
 		if (frameErrorCount) {
-			Melder_warning (L"Analysis results of ", Melder_integer (frameErrorCount),
-			L" frame(s) out of ", Melder_integer (nt), L" will be suspect.");
+			Melder_warning (U"Analysis results of ", frameErrorCount,
+			U" frame(s) out of ", nt, U" will be suspect.");
 		}
 
 		// Window correction.
@@ -1133,7 +1132,7 @@ MelFilter Sound_to_MelFilter (Sound me, double analysisWidth, double dt, double
 		NUMdmatrix_to_dBs (thy z, 1, thy ny, 1, thy nx, ref, FilterBank_DBFAC, FilterBank_DBFLOOR);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MelFilter created.");
+		Melder_throw (me, U": no MelFilter created.");
 	}
 }
 
@@ -1187,7 +1186,7 @@ FormantFilter Sound_to_FormantFilter (Sound me, double analysisWidth,
 		                       f1_hz, fmax_hz, df_hz, relative_bw);
 		return ff.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no FormantFilter created.");
+		Melder_throw (me, U": no FormantFilter created.");
 	}
 }
 
@@ -1199,13 +1198,13 @@ FormantFilter Sound_and_Pitch_to_FormantFilter (Sound me, Pitch thee, double ana
 		long nt, f0_undefined = 0;
 
 		if (my xmin > thy xmin || my xmax > thy xmax) Melder_throw
-			("The domain of the Sound is not included in the domain of the Pitch.");
+			(U"The domain of the Sound is not included in the domain of the Pitch.");
 
 		double f0_median = Pitch_getQuantile (thee, thy xmin, thy xmax, 0.5, kPitch_unit_HERTZ);
 
 		if (f0_median == NUMundefined || f0_median == 0) {
 			f0_median = 100;
-			Melder_warning (L"Pitch values undefined. Bandwith fixed to 100 Hz. ");
+			Melder_warning (U"Pitch values undefined. Bandwith fixed to 100 Hz. ");
 		}
 
 		if (f1_hz <= 0) {
@@ -1222,7 +1221,7 @@ FormantFilter Sound_and_Pitch_to_FormantFilter (Sound me, Pitch thee, double ana
 		}
 
 		fmax_hz = MIN (fmax_hz, nyquist);
-		long nf = floor ( (fmax_hz - f1_hz) / df_hz + 0.5);
+		long nf = lround ( (fmax_hz - f1_hz) / df_hz);
 
 		Sampled_shortTermAnalysis (me, windowDuration, dt, &nt, &t1);
 		autoFormantFilter him = FormantFilter_create (my xmin, my xmax, nt, dt, t1,
@@ -1232,7 +1231,7 @@ FormantFilter Sound_and_Pitch_to_FormantFilter (Sound me, Pitch thee, double ana
 
 		autoSound sframe = Sound_createSimple (1, windowDuration, samplingFrequency);
 		autoSound window = Sound_createGaussian (windowDuration, samplingFrequency);
-		autoMelderProgress progress (L"Sound & Pitch: To FormantFilter");
+		autoMelderProgress progress (U"Sound & Pitch: To FormantFilter");
 		for (long i = 1; i <= nt; i++) {
 			double t = Sampled_indexToX (him.peek(), i);
 			double b, f0 = Pitch_getValueAtTime (thee, t, kPitch_unit_HERTZ, 0);
@@ -1247,8 +1246,8 @@ FormantFilter Sound_and_Pitch_to_FormantFilter (Sound me, Pitch thee, double ana
 			Sound_into_FormantFilter_frame (sframe.peek(), him.peek(), i, b);
 
 			if ( (i % 10) == 1) {
-				Melder_progress ( (double) i / nt, L"Frame ", Melder_integer (i), L" out of ",
-				                   Melder_integer (nt), L".");
+				Melder_progress ( (double) i / nt, U"Frame ", i, U" out of ",
+				                   nt, U".");
 			}
 		}
 
@@ -1256,7 +1255,7 @@ FormantFilter Sound_and_Pitch_to_FormantFilter (Sound me, Pitch thee, double ana
 		NUMdmatrix_to_dBs (his z, 1, his ny, 1, his nx, ref, FilterBank_DBFAC, FilterBank_DBFLOOR);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("FormantFilter not created from Pitch & FormantFilter.");
+		Melder_throw (U"FormantFilter not created from Pitch & FormantFilter.");
 	}
 }
 
@@ -1269,7 +1268,7 @@ Sound FilterBank_as_Sound (FilterBank me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Sound created.");
+		Melder_throw (me, U": no Sound created.");
 	}
 }
 
@@ -1278,7 +1277,7 @@ Sound FilterBanks_crossCorrelate (FilterBank me, FilterBank thee, enum kSounds_c
 		autoSound cc = Sounds_crossCorrelate ((Sound) me, (Sound) thee, scaling, signalOutsideTimeDomain);
 		return cc.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " and ", thee, " not cross-correlated.");
+		Melder_throw (me, U" and ", thee, U" not cross-correlated.");
 	}
 }
 
@@ -1287,7 +1286,7 @@ Sound FilterBanks_convolve (FilterBank me, FilterBank thee, enum kSounds_convolv
 		autoSound cc = Sounds_convolve ((Sound) me, (Sound) thee, scaling, signalOutsideTimeDomain);
 		return cc.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " and ", thee, " not convolved.");
+		Melder_throw (me, U" and ", thee, U" not convolved.");
 	}
 }
 
diff --git a/dwtools/FilterBank.h b/dwtools/FilterBank.h
index d1db412..14930eb 100644
--- a/dwtools/FilterBank.h
+++ b/dwtools/FilterBank.h
@@ -50,20 +50,22 @@
 #define FilterBank_BARK  2
 #define FilterBank_MEL   3
 
-// FilterBank, BarkFilter, MelFilter are deprecated as op october 2014.
+// FilterBank, BarkFilter, MelFilter are deprecated as of october 2014.
 // New types are BandFilterSpectrogram, BarkSpectrogram and MelSpectrogram.
-// This interface is maintained because older scripts stiil have to work.
+// This interface is maintained because older scripts still have to work.
 
 Thing_define (FilterBank, Matrix) {
-	// new methods:
-	public:
-		virtual int v_getFrequencyScale () { return FilterBank_HERTZ; }
+	virtual int v_getFrequencyScale () 
+		{ return FilterBank_HERTZ; }
+	virtual const char32 *v_getFrequencyUnit () 
+		{ return U"Hz"; } // compatibility with BandFilterSpectrogram
 };
 
 Thing_define (BarkFilter, FilterBank) {
-	// overridden methods:
-	protected:
-		virtual int v_getFrequencyScale () { return FilterBank_BARK; }
+	int v_getFrequencyScale ()
+		override { return FilterBank_BARK; }
+	const char32 *v_getFrequencyUnit ()
+		override { return U"bark"; }
 };
 
 /*
@@ -89,19 +91,20 @@ void BarkFilter_drawSekeyHansonFilterFunctions (BarkFilter me, Graphics g,
 	int dbScale, double ymin, double ymax, int garnish);
 
 void FilterBank_drawTimeSlice (I, Graphics g, double t, double fmin, double fmax,
-	double min, double max, const wchar_t *xlabel, int garnish);
+	double min, double max, const char32 *xlabel, int garnish);
 
 void FilterBank_paint (FilterBank me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum, int garnish);
 
 BarkFilter BarkFilter_create (double tmin, double tmax, long nt, double dt,
-	double t1, double fmin, double fmax, long nf, double df, long f1);
+	double t1, double fmin, double fmax, long nf, double df, double f1);
 
 BarkFilter Matrix_to_BarkFilter (I);
 
 Thing_define (MelFilter, FilterBank) {
-	// overridden methods:
-	protected:
-		virtual int v_getFrequencyScale () { return FilterBank_MEL; }
+	int v_getFrequencyScale ()
+		override { return FilterBank_MEL; }
+	const char32 *v_getFrequencyUnit ()
+		override { return U"mel"; }
 };
 
 /*
@@ -125,12 +128,8 @@ void MelFilter_drawFilterFunctions (MelFilter me, Graphics g,
 MFCC MelFilter_to_MFCC (MelFilter me, long numberOfCoefficients);
 
 Thing_define (FormantFilter, FilterBank) {
-	// overridden methods:
-	protected:
-		//virtual int v_getFrequencyScale ();   // David, is dit correct? ja
-	// new methods:
-	public:
-		//virtual void v_drawFilterFunction (int from, int to, void *dwrawclosure);   // David, is dit correct? ja
+	const char32 *v_getFrequencyUnit ()
+		override { return U"Hz"; }
 };
 
 FormantFilter FormantFilter_create (double tmin, double tmax, long nt,
diff --git a/dwtools/FormantGrid_extensions.cpp b/dwtools/FormantGrid_extensions.cpp
index bc3b1ad..a3bcb5a 100644
--- a/dwtools/FormantGrid_extensions.cpp
+++ b/dwtools/FormantGrid_extensions.cpp
@@ -24,7 +24,7 @@
 #include "FormantGrid_extensions.h"
 #include "NUM2.h"
 
-void FormantGrid_draw (FormantGrid me, Graphics g, double xmin, double xmax, double ymin, double ymax, bool bandwidths, bool garnish, const wchar_t *method) {
+void FormantGrid_draw (FormantGrid me, Graphics g, double xmin, double xmax, double ymin, double ymax, bool bandwidths, bool garnish, const char32 *method) {
 	Ordered tiers = bandwidths ? my bandwidths : my formants;
 
 	if (xmax <= xmin) {
@@ -34,11 +34,11 @@ void FormantGrid_draw (FormantGrid me, Graphics g, double xmin, double xmax, dou
 		ymin = 0; ymax = bandwidths ? 1000 : 8000;
 	}
 	for (long iformant = 1; iformant <= my formants -> size; iformant++) {
-		const wchar_t *quantity = 0;
+		const char32 *quantity = 0;
 		bool garnish2 = false;
 		RealTier tier = (RealTier) tiers -> item[iformant];
 		if (iformant == my formants -> size) {
-			quantity = L"Frequency (Hz)";
+			quantity = U"Frequency (Hz)";
 			if (garnish) {
 				garnish2 = true;
 			}
@@ -85,7 +85,7 @@ static void FormantGrid_addBandwidthTier (FormantGrid me, int position) {
 void FormantGrid_addFormantAndBandwidthTiers (FormantGrid me, int position) {
 	try {
 		if (my formants -> size != my bandwidths -> size) {
-			Melder_throw ("Number of formants and bandwidths must be equal.");
+			Melder_throw (U"Number of formants and bandwidths must be equal.");
 		}
 		if (position > my formants -> size || position < 1) {
 			position = my formants -> size + 1;
@@ -98,7 +98,7 @@ void FormantGrid_addFormantAndBandwidthTiers (FormantGrid me, int position) {
 			throw MelderError ();
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no ties added.");
+		Melder_throw (me, U": no ties added.");
 	}
 }
 
diff --git a/dwtools/FormantGrid_extensions.h b/dwtools/FormantGrid_extensions.h
index 031d032..5f1c42d 100644
--- a/dwtools/FormantGrid_extensions.h
+++ b/dwtools/FormantGrid_extensions.h
@@ -27,17 +27,9 @@
 #include "FormantGrid.h"
 #include "Graphics.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-void FormantGrid_draw (FormantGrid me, Graphics g, double xmin, double xmax, double ymin, double ymax, bool bandwidths, bool garnish, const wchar_t *method);
+void FormantGrid_draw (FormantGrid me, Graphics g, double xmin, double xmax, double ymin, double ymax, bool bandwidths, bool garnish, const char32 *method);
 
 void FormantGrid_removeFormantAndBandwidthTiers (FormantGrid me, int position);
 void FormantGrid_addFormantAndBandwidthTiers (FormantGrid me, int position);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _FormantGrid_extensions_h_ */
diff --git a/dwtools/GaussianMixture.cpp b/dwtools/GaussianMixture.cpp
index e115159..119d746 100644
--- a/dwtools/GaussianMixture.cpp
+++ b/dwtools/GaussianMixture.cpp
@@ -46,11 +46,11 @@
 #include "oo_DESCRIPTION.h"
 #include "GaussianMixture_def.h"
 
-Thing_implement (GaussianMixture, Data, 0);
+Thing_implement (GaussianMixture, Daata, 0);
 
-const wchar_t *GaussianMixture_criterionText (int criterion) {
-	const wchar_t *criterionText[6] =  { L"(1/n)*LLH", L"(1/n)*MML", L"(1/n)*BIC", L"(1/n)*AIC", L"(1/n)*AICc", L"(1/n)*CD_LLH" };
-	return criterion >= 0 && criterion < 7 ? criterionText[criterion] : L"(1/n)*ln(p)";
+const char32 *GaussianMixture_criterionText (int criterion) {
+	const char32 *criterionText[6] =  { U"(1/n)*LLH", U"(1/n)*MML", U"(1/n)*BIC", U"(1/n)*AIC", U"(1/n)*AICc", U"(1/n)*CD_LLH" };
+	return criterion >= 0 && criterion < 7 ? criterionText[criterion] : U"(1/n)*ln(p)";
 }
 
 void GaussianMixture_removeComponent (GaussianMixture me, long component);
@@ -146,18 +146,17 @@ static void GaussianMixture_addCovarianceFraction (GaussianMixture me, long im,
 }
 
 void structGaussianMixture :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of components: ", Melder_integer (numberOfComponents));
-	MelderInfo_writeLine (L"Dimension of component: ", Melder_integer (dimension));
-	MelderInfo_writeLine (L"Mixing probabilities:");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of components: ", numberOfComponents);
+	MelderInfo_writeLine (U"Dimension of component: ", dimension);
+	MelderInfo_writeLine (U"Mixing probabilities:");
 	for (long im = 1; im <= numberOfComponents; im++) {
-		MelderInfo_writeLine (L"  ", Melder_integer (im), L": p = ", Melder_double (mixingProbabilities[im]),
-		                       L"  Name =  \"", Thing_getName ( (Thing) covariances -> item[im]), L"\"");
+		MelderInfo_writeLine (U"  ", im, U": p = ", mixingProbabilities[im],
+		                       U"  Name =  \"", Thing_getName ( (Thing) covariances -> item[im]), U"\"");
 	}
 }
 
-static void GaussianMixture_setLabelsFromTableOfReal (GaussianMixture me, thou) {
-	thouart (TableOfReal);
+static void GaussianMixture_setLabelsFromTableOfReal (GaussianMixture me, TableOfReal thee) {
 	for (long im = 1; im <= my numberOfComponents; im++) {
 		Covariance cov = (Covariance) my covariances -> item[im];
 		for (long j = 1; j <= my dimension; j++) {
@@ -169,7 +168,7 @@ static void GaussianMixture_setLabelsFromTableOfReal (GaussianMixture me, thou)
 // only from big to reduced or same
 static void Covariance_into_Covariance (Covariance me, Covariance thee) {
 	if (my numberOfColumns != thy numberOfColumns) {
-		Melder_throw ("Dimensions must be equal.");
+		Melder_throw (U"Dimensions must be equal.");
 	}
 
 	SSCP_unExpand (thee); // to its original state
@@ -198,12 +197,9 @@ static void Covariance_into_Covariance (Covariance me, Covariance thee) {
 }
 
 static void GaussianMixture_setDefaultMixtureNames (GaussianMixture me) {
-	autoMelderString s;
 	for (long im = 1; im <= my numberOfComponents; im++) {
 		Covariance cov = (Covariance) my covariances -> item[im];
-		MelderString_append (&s, L"m", Melder_integer (im));
-		Thing_setName (cov, s.string);
-		MelderString_empty (&s);
+		Thing_setName (cov, Melder_cat (U"m", im));
 	}
 }
 
@@ -224,12 +220,12 @@ GaussianMixture GaussianMixture_create (long numberOfComponents, long dimension,
 		GaussianMixture_setDefaultMixtureNames (me.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("GaussianMixture not created.");
+		Melder_throw (U"GaussianMixture not created.");
 	}
 }
 
 /* c is double vector 1..dimension !!!!!! */
-int GaussianMixture_generateOneVector (GaussianMixture me, double *c, wchar_t **covname, double *buf) {
+int GaussianMixture_generateOneVector (GaussianMixture me, double *c, char32 **covname, double *buf) {
 	try {
 		double p = NUMrandomUniform (0, 1);
 		long im = NUMgetIndexFromProbability (my mixingProbabilities, my numberOfComponents, p);
@@ -247,12 +243,11 @@ int GaussianMixture_generateOneVector (GaussianMixture me, double *c, wchar_t **
 		}
 		return 1;
 	} catch (MelderError) {
-		Melder_throw (me, ": vector not generated.");
+		Melder_throw (me, U": vector not generated.");
 	}
 }
 
-GaussianMixture TableOfReal_to_GaussianMixture_fromRowLabels (I, long storage) {
-	iam (TableOfReal);
+GaussianMixture TableOfReal_to_GaussianMixture_fromRowLabels (TableOfReal me, long storage) {
 	try {
 		autoStrings rowLabels = TableOfReal_extractRowLabels (me);
 		autoDistributions dist = Strings_to_Distributions (rowLabels.peek());
@@ -273,7 +268,7 @@ GaussianMixture TableOfReal_to_GaussianMixture_fromRowLabels (I, long storage) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no GaussianMixture created.");
+		Melder_throw (me, U": no GaussianMixture created.");
 	}
 }
 
@@ -329,7 +324,7 @@ Covariance GaussianMixture_to_Covariance_between (GaussianMixture me) {
 		thy numberOfObservations = nobs_total;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Covariance (between) created.");
+		Melder_throw (me, U": no Covariance (between) created.");
 	}
 }
 
@@ -356,10 +351,10 @@ Covariance GaussianMixture_to_Covariance_within (GaussianMixture me) {
 
 		// Leave centroid at 0 so we can add the within and between covariance nicely
 		// Copy row labels from columns, because covar might be diagonal
-		TableOfReal_copyLabels (my covariances -> item[1], thee.peek(), -1, 1);
+		TableOfReal_copyLabels ((Covariance) my covariances -> item[1], thee.peek(), -1, 1);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Covariance (within) created.");
+		Melder_throw (me, U": no Covariance (within) created.");
 	}
 }
 
@@ -375,26 +370,26 @@ Covariance GaussianMixture_to_Covariance_total (GaussianMixture me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Covariance (total) created.");
+		Melder_throw (me, U": no Covariance (total) created.");
 	}
 }
 
 Covariance GaussianMixture_extractComponent (GaussianMixture me, long component) {
 	try {
 		if (component < 1 || component > my numberOfComponents) {
-			Melder_throw ("Illegal component.");
+			Melder_throw (U"Illegal component.");
 		}
 		return Data_copy ( (Covariance) my covariances -> item[component]);
 	} catch (MelderError) {
-		Melder_throw (me, ": no component extracted.");
+		Melder_throw (me, U": no component extracted.");
 	}
 }
 
 TableOfReal GaussianMixture_extractMixingProbabilities (GaussianMixture me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my numberOfComponents, 2);
-		TableOfReal_setColumnLabel (thee.peek(), 1, L"p");
-		TableOfReal_setColumnLabel (thee.peek(), 2, L"n");
+		TableOfReal_setColumnLabel (thee.peek(), 1, U"p");
+		TableOfReal_setColumnLabel (thee.peek(), 2, U"n");
 		for (long im = 1; im <= my numberOfComponents; im++) {
 			Covariance cov = (Covariance) my covariances -> item[im];
 			thy data[im][1] = my mixingProbabilities[im];
@@ -403,7 +398,7 @@ TableOfReal GaussianMixture_extractMixingProbabilities (GaussianMixture me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no mixing probabilities extracted.");
+		Melder_throw (me, U": no mixing probabilities extracted.");
 	}
 }
 
@@ -425,7 +420,7 @@ TableOfReal GaussianMixture_extractCentroids (GaussianMixture me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no centroid extracted.");
+		Melder_throw (me, U": no centroid extracted.");
 	}
 }
 
@@ -435,14 +430,14 @@ PCA GaussianMixture_to_PCA (GaussianMixture me) {
 		autoPCA thee = SSCP_to_PCA (him.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no PCA calculated.");
+		Melder_throw (me, U": no PCA calculated.");
 	}
 }
 
 void GaussianMixture_getIntervalsAlongDirections (GaussianMixture me, long d1, long d2, double nsigmas, double *xmin, double *xmax, double *ymin, double *ymax) {
 	*xmin = *xmax = *ymin = *ymax = NUMundefined;
 	if (d1 < 1 || d1 > my dimension || d2 < 1 || d2 > my dimension) {
-		Melder_throw ("Incorrect directions.");
+		Melder_throw (U"Incorrect directions.");
 	}
 	autoSSCPs sscps = SSCPs_extractTwoDimensions ((SSCPs) my covariances, d1, d2);
 	SSCPs_getEllipsesBoundingBoxCoordinates (sscps.peek(), -nsigmas, 0, xmin, xmax, ymin, ymax);
@@ -456,7 +451,7 @@ void GaussianMixture_getIntervalAlongDirection (GaussianMixture me, long d, doub
 void GaussianMixture_and_PCA_getIntervalsAlongDirections (GaussianMixture me, PCA thee, long d1, long d2, double nsigmas, double *xmin, double *xmax, double *ymin, double *ymax) {
 	*xmin = *xmax = *ymin = *ymax = NUMundefined;
 	if (my dimension != thy dimension || d1 < 1 || d1 > my dimension || d2 < 1 || d2 > my dimension) {
-		Melder_throw ("Incorrect directions.");
+		Melder_throw (U"Incorrect directions.");
 	}
 	autoSSCPs sscps = SSCPs_toTwoDimensions ( (SSCPs) my covariances, thy eigenvectors[d1], thy eigenvectors[d2]);
 	SSCPs_getEllipsesBoundingBoxCoordinates (sscps.peek(), -nsigmas, 0, xmin, xmax, ymin, ymax);
@@ -470,7 +465,7 @@ void GaussianMixture_and_PCA_getIntervalAlongDirection (GaussianMixture me, PCA
 
 void GaussianMixture_and_PCA_drawMarginalPdf (GaussianMixture me, PCA thee, Graphics g, long d, double xmin, double xmax, double ymin, double ymax, long npoints, long nbins, int garnish) {
 	if (my dimension != thy dimension || d < 1 || d > my dimension) {
-		Melder_warning (L"Dimensions don't agree.");
+		Melder_warning (U"Dimensions don't agree.");
 		return;
 	}
 
@@ -505,16 +500,16 @@ void GaussianMixture_and_PCA_drawMarginalPdf (GaussianMixture me, PCA thee, Grap
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_markBottom (g, xmin, 1, 1, 0, NULL);
-		Graphics_markBottom (g, xmax, 1, 1, 0, NULL);
-		Graphics_markLeft (g, ymin, 1, 1, 0, NULL);
-		Graphics_markLeft (g, ymax, 1, 1, 0, NULL);
+		Graphics_markBottom (g, xmin, true, true, false, nullptr);
+		Graphics_markBottom (g, xmax, true, true, false, nullptr);
+		Graphics_markLeft (g, ymin, true, true, false, nullptr);
+		Graphics_markLeft (g, ymax, true, true, false, nullptr);
 	}
 }
 
 void GaussianMixture_drawMarginalPdf (GaussianMixture me, Graphics g, long d, double xmin, double xmax, double ymin, double ymax, long npoints, long nbins, int garnish) {
 	if (d < 1 || d > my dimension) {
-		Melder_warning (L"Dimension doesn't agree.");
+		Melder_warning (U"Dimension doesn't agree.");
 		return;
 	}
 	if (npoints <= 1) {
@@ -552,29 +547,29 @@ void GaussianMixture_drawMarginalPdf (GaussianMixture me, Graphics g, long d, do
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_markBottom (g, xmin, 1, 1, 0, NULL);
-		Graphics_markBottom (g, xmax, 1, 1, 0, NULL);
-		Graphics_markLeft (g, ymin, 1, 1, 0, NULL);
-		Graphics_markLeft (g, ymax, 1, 1, 0, NULL);
+		Graphics_markBottom (g, xmin, true, true, false, nullptr);
+		Graphics_markBottom (g, xmax, true, true, false, nullptr);
+		Graphics_markLeft (g, ymin, true, true, false, nullptr);
+		Graphics_markLeft (g, ymax, true, true, false, nullptr);
 	}
 }
 
 void GaussianMixture_and_PCA_drawConcentrationEllipses (GaussianMixture me, PCA him, Graphics g, double scale,
-        int confidence, wchar_t *label, long d1, long d2,
+        int confidence, char32 *label, long d1, long d2,
         double xmin, double xmax, double ymin, double ymax, int fontSize, int garnish) {
 	if (my dimension != his dimension) {
-		Melder_warning (L"Dimensions don't agree.");
+		Melder_warning (U"Dimensions don't agree.");
 		return;
 	}
 	int d1_inverted = 0, d2_inverted = 0;
 
 	if (d1 < 0) {
-		d1 = abs (d1);
+		d1 = labs (d1);
 		Eigen_invertEigenvector (him, d1);
 		d1_inverted = 1;
 	}
 	if (d2 < 0) {
-		d2 = abs (d2);
+		d2 = labs (d2);
 		Eigen_invertEigenvector (him, d2);
 		d2_inverted = 1;
 	}
@@ -592,31 +587,31 @@ void GaussianMixture_and_PCA_drawConcentrationEllipses (GaussianMixture me, PCA
 	                                 xmin, xmax, ymin, ymax, fontSize, 0);
 
 	if (garnish) {
-		wchar_t llabel[40];
+		char32 llabel[40];
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		swprintf (llabel, 40, L"pc %ld", d2);
-		Graphics_textLeft (g, 1, llabel);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		swprintf (llabel, 40, L"pc %ld", d1);
-		Graphics_textBottom (g, 1, llabel);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Melder_sprint (llabel,40, U"pc ", d2);
+		Graphics_textLeft (g, true, llabel);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Melder_sprint (llabel,40, U"pc ", d1);
+		Graphics_textBottom (g, true, llabel);
 	}
 }
 
 void GaussianMixture_drawConcentrationEllipses (GaussianMixture me, Graphics g,
-        double scale, int confidence, wchar_t *label, int pcaDirections, long d1, long d2,
+        double scale, int confidence, char32 *label, int pcaDirections, long d1, long d2,
         double xmin, double xmax, double ymin, double ymax, int fontSize, int garnish) {
 	if (d1 == 0 && d2 == 0) {
 		d1 = 1;
 		d2 = 2;
 	}
-	if (abs (d1) > my dimension || abs (d2) > my dimension) {
+	if (labs (d1) > my dimension || labs (d2) > my dimension) {
 		return;
 	}
 
 	if (! pcaDirections) {
 		SSCPs_drawConcentrationEllipses ( (SSCPs) my covariances, g, -scale, confidence, label,
-		                                  abs (d1), abs (d2), xmin, xmax, ymin, ymax, fontSize, garnish);
+		                                  labs (d1), labs (d2), xmin, xmax, ymin, ymax, fontSize, garnish);
 		return;
 	}
 
@@ -655,8 +650,8 @@ void GaussianMixture_initialGuess (GaussianMixture me, TableOfReal thee, double
 			a = nSigmas * sqrt (a); b = nSigmas * sqrt (b);
 			double angle = 0, angle_inc = NUM2pi / my numberOfComponents;
 			for (long im = 1; im <= my numberOfComponents; im++, angle += angle_inc) {
-				double xc = a * (1 + NUMrandomUniform (-ru_range, ru_range)) * cos (angle);
-				double yc = b * (1 + NUMrandomUniform (-ru_range, ru_range)) * sin (angle);
+				double xc = a * (1.0 + NUMrandomUniform (-ru_range, ru_range)) * cos (angle);
+				double yc = b * (1.0 + NUMrandomUniform (-ru_range, ru_range)) * sin (angle);
 				means2d -> data[im][1] = s2d -> centroid[1] + xc * cs - yc * sn;
 				means2d -> data[im][2] = s2d -> centroid[2] + xc * sn + yc * cs;
 			}
@@ -684,7 +679,7 @@ void GaussianMixture_initialGuess (GaussianMixture me, TableOfReal thee, double
 				for (long im = 1; im <= my numberOfComponents; im++) {
 					Covariance covi = (Covariance) my covariances -> item[im];
 					for (long ic = 1; ic <= my dimension; ic++) {
-						covi -> centroid[ic] -= (1 - scale) * (covi -> centroid[ic] - cov_b -> centroid[ic]);
+						covi -> centroid[ic] -= (1.0 - scale) * (covi -> centroid[ic] - cov_b -> centroid[ic]);
 					}
 				}
 				cov_b.reset (GaussianMixture_to_Covariance_between (me));
@@ -694,7 +689,7 @@ void GaussianMixture_initialGuess (GaussianMixture me, TableOfReal thee, double
 
 			for (long ir = 1; ir <= my dimension; ir++) {
 				for (long ic = ir; ic <= my dimension; ic++) {
-					double scalef = my numberOfComponents == 1 ? 1 : (var_b / var_t) / my numberOfComponents;
+					double scalef = my numberOfComponents == 1 ? 1.0 : (var_b / var_t) / my numberOfComponents;
 					cov_t -> data[ic][ir] = cov_t -> data[ir][ic] *= scalef;
 				}
 			}
@@ -717,7 +712,7 @@ void GaussianMixture_initialGuess (GaussianMixture me, TableOfReal thee, double
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": no initial guess possible.");
+		Melder_throw (me, U" & ", thee, U": no initial guess possible.");
 	}
 }
 
@@ -731,10 +726,10 @@ ClassificationTable GaussianMixture_and_TableOfReal_to_ClassificationTable (Gaus
 			TableOfReal_setColumnLabel (him.peek(), im, Thing_getName (cov));
 		}
 
-		double ln2pid = - 0.5 * my dimension * log (NUM2pi);
+		double ln2pid = -0.5 * my dimension * log (NUM2pi);
 		autoNUMvector<double> lnN (1, my numberOfComponents);
 		for (long i = 1; i <=  thy numberOfRows; i++) {
-			double psum = 0;
+			double psum = 0.0;
 			for (long im = 1; im <= my numberOfComponents; im++) {
 				Covariance cov = (Covariance) my covariances -> item[im];
 				double dsq = NUMmahalanobisDistance_chi (cov -> lowerCholesky, thy data[i], cov -> centroid, cov -> numberOfRows, my dimension);
@@ -757,7 +752,7 @@ ClassificationTable GaussianMixture_and_TableOfReal_to_ClassificationTable (Gaus
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No ClassificationTable created from GaussianMixture & TableOfReal.");
+		Melder_throw (U"No ClassificationTable created from GaussianMixture & TableOfReal.");
 	}
 }
 
@@ -770,14 +765,14 @@ void GaussianMixture_and_TableOfReal_getGammas (GaussianMixture me, TableOfReal
 
 		double *nk = gamma[thy numberOfRows + 1];
 		for (long im = 1; im <= my numberOfComponents; im++) {
-			nk[im] = 0;
+			nk[im] = 0.0;
 		}
 
-		*lnp = 0;
+		*lnp = 0.0;
 		double ln2pid = - 0.5 * my dimension * log (NUM2pi);
 		autoNUMvector<double> lnN (1, my numberOfComponents);
 		for (long i = 1; i <=  thy numberOfRows; i++) {
-			double rowsum = 0;
+			double rowsum = 0.0;
 			for (long im = 1; im <= my numberOfComponents; im++) {
 				Covariance cov = (Covariance) my covariances -> item[im];
 				double dsq = NUMmahalanobisDistance_chi (cov -> lowerCholesky, thy data[i], cov -> centroid, cov -> numberOfRows, my dimension);
@@ -788,7 +783,7 @@ void GaussianMixture_and_TableOfReal_getGammas (GaussianMixture me, TableOfReal
 
 			// If the gamma[i]'s are too small, their sum will be zero and the scaling will overflow
 
-			if (rowsum == 0) {
+			if (rowsum == 0.0) {
 				continue;    // This is ok because gamma[i]'s will all be zero
 			}
 
@@ -801,14 +796,14 @@ void GaussianMixture_and_TableOfReal_getGammas (GaussianMixture me, TableOfReal
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": no gammas.");
+		Melder_throw (me, U" & ", thee, U": no gammas.");
 	}
 }
 
 void GaussianMixture_splitComponent (GaussianMixture me, long component) {
 	try {
 		if (component < 1 || component > my numberOfComponents) {
-			Melder_throw ("Illegal component.");
+			Melder_throw (U"Illegal component.");
 		}
 		Covariance thee = (Covariance) my covariances -> item[component];
 		// Always new PCA because we cannot be sure of data unchanged.
@@ -825,10 +820,10 @@ void GaussianMixture_splitComponent (GaussianMixture me, long component) {
 		}
 		double gamma = 0.5, lambda = 0.5, eta = 0.5, mu = 0.5;
 		mixingProbabilities[component] = gamma * my mixingProbabilities[component];
-		mixingProbabilities[my numberOfComponents + 1] = (1 - gamma) * my mixingProbabilities[component];
+		mixingProbabilities[my numberOfComponents + 1] = (1.0 - gamma) * my mixingProbabilities[component];
 		double mp12 =  mixingProbabilities[component] / mixingProbabilities[my numberOfComponents + 1];
 		double factor1 = (eta - eta * lambda * lambda - 1) / gamma + 1;
-		double factor2 = (eta * lambda * lambda - eta - lambda * lambda) / (1 - gamma) + 1;
+		double factor2 = (eta * lambda * lambda - eta - lambda * lambda) / (1.0 - gamma) + 1.0;
 		double *ev = thy pca -> eigenvectors[1];
 		double d2 = thy pca -> eigenvalues[1];
 
@@ -850,17 +845,17 @@ void GaussianMixture_splitComponent (GaussianMixture me, long component) {
 
 		// Replace cov1 at component + add cov2. If something goes wrong we must be able to restore original!
 		try {
-			Thing_setName (cov2.peek(), Melder_wcscat (Thing_getName (cov2.peek()), L"-", Melder_integer (my numberOfComponents + 1)));
+			Thing_setName (cov2.peek(), Melder_cat (Thing_getName (cov2.peek()), U"-", my numberOfComponents + 1));
 			Collection_addItem (my covariances, cov2.transfer());
 		} catch (MelderError) {
-			Melder_throw (me, " cannot add new component.");
+			Melder_throw (me, U" cannot add new component.");
 		}
 		my covariances -> item[component] = cov1.transfer();
 		my numberOfComponents++;
 		NUMvector_free<double> (my mixingProbabilities, 1);
 		my mixingProbabilities = mixingProbabilities.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": component ", component, " cannot be split.");
+		Melder_throw (me, U": component ", component, U" cannot be split.");
 	}
 }
 
@@ -890,7 +885,7 @@ int GaussianMixture_and_TableOfReal_getProbabilities (GaussianMixture me, TableO
 		GaussianMixture_updateProbabilityMarginals (me, p, thy numberOfRows);
 		return 1;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": no probabilies could be calculated.");
+		Melder_throw (me, U" & ", thee, U": no probabilies could be calculated.");
 	}
 }
 
@@ -898,7 +893,7 @@ void GaussianMixture_expandPCA (GaussianMixture me) {
 	for (long im = 1; im <= my numberOfComponents; im++) {
 		Covariance him = (Covariance) my covariances -> item[im];
 		if (his numberOfRows == 1) {
-			Melder_throw ("Nothing to expand.");
+			Melder_throw (U"Nothing to expand.");
 		}
 		his pca = SSCP_to_PCA (him);
 	}
@@ -906,15 +901,14 @@ void GaussianMixture_expandPCA (GaussianMixture me) {
 
 void GaussianMixture_unExpandPCA (GaussianMixture me) {
 	for (long im = 1; im <= my numberOfComponents; im++) {
-		SSCP_unExpandPCA (my covariances -> item[im]);
+		SSCP_unExpandPCA ((SSCP) my covariances -> item[im]);
 	}
 }
 
-void GaussianMixture_and_TableOfReal_improveLikelihood (GaussianMixture me, thou, double delta_lnp,
-        long maxNumberOfIterations, double lambda, int criterion) {
+void GaussianMixture_and_TableOfReal_improveLikelihood (GaussianMixture me, thou, double delta_lnp, long maxNumberOfIterations, double lambda, int criterion) {
 	thouart (TableOfReal);
 	try {
-		const wchar_t *criterionText = GaussianMixture_criterionText (criterion);
+		const char32 *criterionText = GaussianMixture_criterionText (criterion);
 
 		// The global covariance matrix is added with scaling coefficient lambda during updating the
 		// mixture covariances to prevent numerical instabilities.
@@ -923,11 +917,11 @@ void GaussianMixture_and_TableOfReal_improveLikelihood (GaussianMixture me, thou
 		autoNUMmatrix<double> pp (1, thy numberOfRows + 1, 1, my numberOfComponents + 1);
 		double *nk = pp[thy numberOfRows + 1]; // last row has the column marginals n(k)
 		if (! GaussianMixture_and_TableOfReal_getProbabilities (me, thee, 0, pp.peek())) {
-			Melder_throw ("Iteration not started. Too many components?");
+			Melder_throw (U"Iteration not started. Too many components?");
 		}
 		double lnp = GaussianMixture_getLikelihoodValue (me, pp.peek(), thy numberOfRows, criterion);
 		long iter = 0;
-		autoMelderProgress progress (L"Improve likelihood...");
+		autoMelderProgress progress (U"Improve likelihood...");
 		try {
 			double lnp_prev, lnp_start = lnp / thy numberOfRows;
 			do {
@@ -952,7 +946,7 @@ void GaussianMixture_and_TableOfReal_improveLikelihood (GaussianMixture me, thou
 					break;
 				}
 				lnp = GaussianMixture_getLikelihoodValue (me, pp.peek(), thy numberOfRows, criterion);
-				Melder_progress ((double) iter / double (maxNumberOfIterations), criterionText, L": ", Melder_double (lnp / thy numberOfRows), L", L0: ", Melder_double (lnp_start));
+				Melder_progress ((double) iter / double (maxNumberOfIterations), criterionText, U": ", lnp / thy numberOfRows, U", L0: ", lnp_start);
 			} while (fabs ( (lnp - lnp_prev) / lnp_prev) > delta_lnp && iter < maxNumberOfIterations);
 		} catch (MelderError) {
 			Melder_clearError ();
@@ -970,13 +964,13 @@ void GaussianMixture_and_TableOfReal_improveLikelihood (GaussianMixture me, thou
 				} else {
 					for (long j = 1; j <= thy numberOfColumns; j++)
 						for (long k = j; k <= thy numberOfColumns; k++) {
-							cov -> data[j][k] = cov -> data[k][j] *= cov -> numberOfObservations / (cov -> numberOfObservations - 1);
+							cov -> data[j][k] = cov -> data[k][j] *= cov -> numberOfObservations / (cov -> numberOfObservations - 1.0);
 						}
 				}
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": likelihood cannot be improved.");
+		Melder_throw (me, U" & ", thee, U": likelihood cannot be improved.");
 	}
 }
 
@@ -1017,8 +1011,7 @@ void GaussianMixture_removeComponent_bookkeeping (GaussianMixture me, long compo
 	GaussianMixture_removeComponent (me, component);
 }
 
-double GaussianMixture_and_TableOfReal_getLikelihoodValue (GaussianMixture me, thou, int criterion) {
-	thouart (TableOfReal);
+double GaussianMixture_and_TableOfReal_getLikelihoodValue (GaussianMixture me, TableOfReal thee, int criterion) {
 	double value = NUMundefined;
 	autoNUMmatrix<double> pp (1, thy numberOfRows + 1, 1, my numberOfComponents + 1);
 	if (GaussianMixture_and_TableOfReal_getProbabilities (me, thee, 0, pp.peek())) {
@@ -1031,7 +1024,7 @@ double GaussianMixture_getLikelihoodValue (GaussianMixture me, double **p, long
 	// Because we try to _maximize_ a criterion, all criteria are negative numbers.
 
 	if (criterion == GaussianMixture_CD_LIKELIHOOD) {
-		double lnpcd = 0;
+		double lnpcd = 0.0;
 		for (long i = 1; i <= numberOfRows; i++) {
 			double psum = 0, lnsum = 0;
 			for (long ic = 1; ic <= my numberOfComponents; ic++) {
@@ -1048,13 +1041,13 @@ double GaussianMixture_getLikelihoodValue (GaussianMixture me, double **p, long
 
 	// The common factor for all other criteria is the log(likelihood)
 
-	double lnp = 0;
+	double lnp = 0.0;
 	for (long i = 1; i <= numberOfRows; i++) {
-		double psum = 0;
+		double psum = 0.0;
 		for (long ic = 1; ic <= my numberOfComponents; ic++) {
 			psum += my mixingProbabilities[ic] * p[i][ic];
 		}
-		if (psum > 0) {
+		if (psum > 0.0) {
 			lnp += log (psum);
 		}
 	}
@@ -1072,31 +1065,30 @@ double GaussianMixture_getLikelihoodValue (GaussianMixture me, double **p, long
 			L(theta,Y)= N/2*sum(m=1..k, log(n*alpha[k]/12)) +k/2*ln(n/12) +k(N+1)/2
 				- log (sum(i=1..n, sum(m=1..k, alpha[k]*p(k))))
 		*/
-		double logmpn = 0;
+		double logmpn = 0.0;
 		for (long ic = 1; ic <= my numberOfComponents; ic++) {
 			logmpn += log (my mixingProbabilities[ic]);
 		}
 
 		// a rewritten L(theta,Y) is
 
-		return lnp - 0.5 * my numberOfComponents * (npars + 1) * (log (numberOfRows / 12.0) + 1)
+		return lnp - 0.5 * my numberOfComponents * (npars + 1) * (log (numberOfRows / 12.0) + 1.0)
 		       + 0.5 * npars * logmpn;
 	} else if (criterion == GaussianMixture_BIC) {
-		return 2 * lnp - np * log (numberOfRows);
+		return 2.0 * lnp - np * log (numberOfRows);
 	} else if (criterion == GaussianMixture_AIC) {
-		return 2 * (lnp - np);
+		return 2.0 * (lnp - np);
 	} else if (criterion == GaussianMixture_AICC) {
 		np = npars * my numberOfComponents;
-		return 2 * (lnp - np * (numberOfRows / (numberOfRows - np - 1)));
+		return 2.0 * (lnp - np * (numberOfRows / (numberOfRows - np - 1.0)));
 	}
 	return lnp;
 }
 
-GaussianMixture GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (GaussianMixture gm, thou, long minNumberOfComponents, double delta_l, long maxNumberOfIterations, double lambda, int criterion) {
+GaussianMixture GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (GaussianMixture gm, TableOfReal thee, long minNumberOfComponents, double delta_l, long maxNumberOfIterations, double lambda, int criterion) {
 	try {
-		thouart (TableOfReal);
-		const wchar_t *criterionText = GaussianMixture_criterionText (criterion);
-		int deleteWeakComponents = minNumberOfComponents > 0;
+		const char32 *criterionText = GaussianMixture_criterionText (criterion);
+		bool deleteWeakComponents = ( minNumberOfComponents > 0 );
 		autoGaussianMixture me = Data_copy (gm);
 		autoNUMmatrix<double> p (1, thy numberOfRows + 2, 1, my numberOfComponents + 1);
 
@@ -1105,7 +1097,7 @@ GaussianMixture GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (Gaussia
 		autoCovariance covg = TableOfReal_to_Covariance (thee);
 
 		double npars = GaussianMixture_getNumberOfParametersInComponent (me.peek());
-		double nparsd2 = deleteWeakComponents ? npars / 2 : 0;
+		double nparsd2 = deleteWeakComponents ? npars / 2.0 : 0.0;
 
 		// Initial E-step: Update all p's.
 
@@ -1113,7 +1105,7 @@ GaussianMixture GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (Gaussia
 
 		double lnew = GaussianMixture_getLikelihoodValue (me.peek(), p.peek(), thy numberOfRows, criterion);
 
-		autoMelderProgress progress (L"Gaussian mixture...");
+		autoMelderProgress progress (U"Gaussian mixture...");
 		autoGaussianMixture best = 0;
 		try {
 			double lstart = lnew / thy numberOfRows;
@@ -1139,14 +1131,14 @@ GaussianMixture GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (Gaussia
 								support += support_ic;
 							}
 						}
-						my mixingProbabilities[component] = support_im > 0 ? support_im : 0;
+						my mixingProbabilities[component] = support_im > 0.0 ? support_im : 0.0;
 						if (support > 0) {
 							my mixingProbabilities[component] /= support;
 						}
 
 						NUMdvector_scaleAsProbabilities (my mixingProbabilities, my numberOfComponents);
 
-						if (my mixingProbabilities[component] > 0) { // update p for component
+						if (my mixingProbabilities[component] > 0.0) { // update p for component
 							GaussianMixture_and_TableOfReal_getProbabilities (me.peek(), thee, component, p.peek());
 							component++;
 						} else {
@@ -1155,7 +1147,7 @@ GaussianMixture GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (Gaussia
 							GaussianMixture_removeComponent_bookkeeping (me.peek(), component, p.peek(), thy numberOfRows);
 
 							// Now numberOfComponents is one less!
-							// MelderInfo_writeLine2 (L"Removed component ", Melder_integer (component));
+							// MelderInfo_writeLine (U"Removed component ", component);
 						}
 					}
 
@@ -1164,9 +1156,9 @@ GaussianMixture GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (Gaussia
 
 					lnew = GaussianMixture_getLikelihoodValue (me.peek(), p.peek(), thy numberOfRows, criterion);
 
-					Melder_progress ((double) iter / (double) maxNumberOfIterations, L", ", criterionText, L": ",
-						Melder_double (lnew / thy numberOfRows), L"\nComponents: ", Melder_integer (my numberOfComponents),
-						L"\nL0: ", Melder_double (lstart));
+					Melder_progress ((double) iter / (double) maxNumberOfIterations, U", ", criterionText, U": ",
+						lnew / thy numberOfRows, U"\nComponents: ", my numberOfComponents,
+						U"\nL0: ", lstart);
 				} while (lnew > lprev && fabs ( (lprev - lnew) / lnew) > delta_l && iter < maxNumberOfIterations);
 				if (lnew > lmax) {
 					best.reset (Data_copy (me.peek()));
@@ -1195,7 +1187,7 @@ GaussianMixture GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (Gaussia
 		}
 		return best.transfer();
 	} catch (MelderError) {
-		Melder_throw ("GaussianMixture not improved.");
+		Melder_throw (U"GaussianMixture not improved.");
 	}
 }
 
@@ -1215,16 +1207,15 @@ void GaussianMixture_removeComponent (GaussianMixture me, long component) {
 	NUMdvector_scaleAsProbabilities (my mixingProbabilities, my numberOfComponents);
 }
 
-GaussianMixture TableOfReal_to_GaussianMixture (I, long numberOfComponents, double delta_lnp, long maxNumberOfIterations, double lambda, int storage, int criterion) {
-	iam (TableOfReal);
+GaussianMixture TableOfReal_to_GaussianMixture (TableOfReal me, long numberOfComponents, double delta_lnp, long maxNumberOfIterations, double lambda, int storage, int criterion) {
 	try {
 		if (my numberOfRows < 2 * numberOfComponents) {
-			Melder_throw ("The number of data points must at least be twice the number of components.");
+			Melder_throw (U"The number of data points must at least be twice the number of components.");
 		}
 
 		autoGaussianMixture thee = GaussianMixture_create (numberOfComponents, my numberOfColumns, storage);
 		GaussianMixture_setLabelsFromTableOfReal (thee.peek(), me);
-		GaussianMixture_initialGuess (thee.peek(), me, 1, 0.05);
+		GaussianMixture_initialGuess (thee.peek(), me, 1.0, 0.05);
 		if (maxNumberOfIterations <= 0) {
 			return thee.transfer();
 		}
@@ -1232,7 +1223,7 @@ GaussianMixture TableOfReal_to_GaussianMixture (I, long numberOfComponents, doub
 		GaussianMixture_and_TableOfReal_improveLikelihood (thee.peek(), me, delta_lnp, maxNumberOfIterations, lambda, criterion);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no GaussianMixture created.");
+		Melder_throw (me, U": no GaussianMixture created.");
 	}
 }
 
@@ -1240,21 +1231,21 @@ Correlation GaussianMixture_and_TableOfReal_to_Correlation (GaussianMixture me,
 	try {
 		thouart (TableOfReal);
 		if (my dimension != thy numberOfColumns) {
-			Melder_throw ("Dimensions must be equal.");
+			Melder_throw (U"Dimensions must be equal.");
 		}
 		autoClassificationTable ct = GaussianMixture_and_TableOfReal_to_ClassificationTable (me, thee);
 		autoCorrelation him = ClassificationTable_to_Correlation_columns (ct.peek());
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Correlation not created from GaussianMixture & TableOfReal.");
+		Melder_throw (U"Correlation not created from GaussianMixture & TableOfReal.");
 	}
 }
 
-double GaussianMixture_getProbabilityAtPosition_string (GaussianMixture me, const wchar_t *vector) {
+double GaussianMixture_getProbabilityAtPosition_string (GaussianMixture me, const char32 *vector) {
 	autoNUMvector<double> v (1, my dimension);
 
 	long i = 0;
-	for (wchar_t *token = Melder_firstToken (vector); token != NULL; token = Melder_nextToken ()) {
+	for (char32 *token = Melder_firstToken (vector); token != nullptr; token = Melder_nextToken ()) {
 		v[++i] = Melder_atof (token);
 		if (i == my dimension) {
 			break;
@@ -1274,7 +1265,7 @@ double GaussianMixture_getMarginalProbabilityAtPosition (GaussianMixture me, dou
 }
 
 double GaussianMixture_getProbabilityAtPosition (GaussianMixture me, double *xpos) {
-	double p = 0;
+	double p = 0.0;
 	for (long im = 1; im <= my numberOfComponents; im++) {
 		double pim = Covariance_getProbabilityAtPosition ( (Covariance) my covariances -> item[im], xpos);
 		p += my mixingProbabilities[im] * pim;
@@ -1285,15 +1276,15 @@ double GaussianMixture_getProbabilityAtPosition (GaussianMixture me, double *xpo
 Matrix GaussianMixture_and_PCA_to_Matrix_density (GaussianMixture me, PCA thee, long d1, long d2, double xmin, double xmax, long nx, double ymin, double ymax, long ny) {
 	try {
 		if (my dimension != thy dimension) {
-			Melder_throw ("Dimensions must be equal.");
+			Melder_throw (U"Dimensions must be equal.");
 		}
 		if (d1 > thy numberOfEigenvalues || d2 > thy numberOfEigenvalues) {
-			Melder_throw ("Direction index too high.");
+			Melder_throw (U"Direction index too high.");
 		}
 		autoNUMvector<double> v (1, my dimension);
 
 		if (xmax == xmin || ymax == ymin) {
-			double xmind, xmaxd, ymind, ymaxd, nsigmas = 2;
+			double xmind, xmaxd, ymind, ymaxd, nsigmas = 2.0;
 
 			GaussianMixture_and_PCA_getIntervalsAlongDirections (me, thee, d1, d2, nsigmas, &xmind, &xmaxd, &ymind, &ymaxd);
 			if (xmax == xmin) {
@@ -1324,7 +1315,7 @@ Matrix GaussianMixture_and_PCA_to_Matrix_density (GaussianMixture me, PCA thee,
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": no Matrix density created.");
+		Melder_throw (me, U" & ", thee, U": no Matrix density created.");
 	}
 }
 
@@ -1335,24 +1326,23 @@ TableOfReal GaussianMixture_to_TableOfReal_randomSampling (GaussianMixture me, l
 		autoNUMvector<double> buf (1, my dimension);
 		NUMstrings_copyElements (cov -> columnLabels, thy columnLabels, 1, my dimension);
 		for (long i = 1; i <= numberOfPoints; i++) {
-			wchar_t *covname;
+			char32 *covname;
 			GaussianMixture_generateOneVector (me, thy data[i], &covname, buf.peek());
 			TableOfReal_setRowLabel (thee.peek(), i, covname);
 		}
 		GaussianMixture_unExpandPCA (me);
 		return thee.transfer();
 	} catch (MelderError) {
-		GaussianMixture_unExpandPCA (me); Melder_throw ("TableOfReal with random ssampling not created.");
+		GaussianMixture_unExpandPCA (me); Melder_throw (U"TableOfReal with random ssampling not created.");
 	}
 }
 
-TableOfReal GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests (GaussianMixture me, thou, double h) {
+TableOfReal GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests (GaussianMixture me, TableOfReal thee, double h) {
 	try {
-		thouart (TableOfReal);
 		long n = thy numberOfRows, d = thy numberOfColumns, nocp1 = my numberOfComponents + 1;
 
 		if (d != my dimension) {
-			Melder_throw ("Dimensions do not agree.");
+			Melder_throw (U"Dimensions do not agree.");
 		}
 
 		// We cannot use a classification table because this could weigh a far-off data point with high probability
@@ -1367,7 +1357,7 @@ TableOfReal GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests (G
 		// labels
 
 		long iprob = 1, ih = 2, itnb = 3, ilnmu = 4, ilnvar = 5, indata = 6, id = 7;
-		const wchar_t *label[8] = { L"", L"p", L"h", L"tnb", L"lnmu", L"lnvar", L"ndata", L"d" };
+		const char32 *label[8] = { U"", U"p", U"h", U"tnb", U"lnmu", U"lnvar", U"ndata", U"d" };
 		for (long icol = 1; icol <= 7; icol++) {
 			TableOfReal_setColumnLabel (him.peek(), icol, label[icol]);
 		}
@@ -1384,14 +1374,14 @@ TableOfReal GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests (G
 			Covariance cov = (Covariance) my covariances -> item[im];
 			double mixingP = my mixingProbabilities[im];
 			double nd = his data[im][indata], d2 = d / 2.0;
-			double beta = h > 0 ? NUMsqrt1_2 / h : NUMsqrt1_2 * pow ( (1.0 + 2 * d) / 4, 1.0 / (d + 4)) * pow (nd, 1.0 / (d + 4));
+			double beta = h > 0.0 ? NUMsqrt1_2 / h : NUMsqrt1_2 * pow ( (1.0 + 2.0 * d) / 4.0, 1.0 / (d + 4.0)) * pow (nd, 1.0 / (d + 4.0));
 			double beta2 = beta * beta, beta4 = beta2 * beta2, beta8 = beta4 * beta4;
-			double gamma = 1 + 2 * beta2, gamma2 = gamma * gamma, gamma4 = gamma2 * gamma2;
-			double delta = 1.0 + beta2 * (4 + 3 * beta2), delta2 = delta * delta;
-			double mu = 1.0 - pow (gamma, -d2) * (1.0 + d * beta2 / gamma + d * (d + 2) * beta4 / (2 * gamma2));
-			double var = 2.0 * pow (1 + 4 * beta2, -d2)
-			             + 2.0 * pow (gamma,  -d) * (1.0 + 2 * d * beta4 / gamma2  + 3 * d * (d + 2) * beta8 / (4 * gamma4))
-			             - 4.0 * pow (delta, -d2) * (1.0 + 3 * d * beta4 / (2 * delta) + d * (d + 2) * beta8 / (2 * delta2));
+			double gamma = 1.0 + 2.0 * beta2, gamma2 = gamma * gamma, gamma4 = gamma2 * gamma2;
+			double delta = 1.0 + beta2 * (4.0 + 3.0 * beta2), delta2 = delta * delta;
+			double mu = 1.0 - pow (gamma, -d2) * (1.0 + d * beta2 / gamma + d * (d + 2.0) * beta4 / (2.0 * gamma2));
+			double var = 2.0 * pow (1.0 + 4.0 * beta2, -d2)
+			             + 2.0 * pow (gamma,  -d) * (1.0 + 2.0 * d * beta4 / gamma2  + 3.0 * d * (d + 2.0) * beta8 / (4.0 * gamma4))
+			             - 4.0 * pow (delta, -d2) * (1.0 + 3.0 * d * beta4 / (2.0 * delta) + d * (d + 2.0) * beta8 / (2.0 * delta2));
 			double mu2 = mu * mu;
 
 			double prob = NUMundefined, tnb = NUMundefined, lnmu = NUMundefined, lnvar = NUMundefined;
@@ -1399,22 +1389,22 @@ TableOfReal GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests (G
 			try {
 				SSCP_expandLowerCholesky (cov);
 			} catch (MelderError) {
-				tnb = 4 * nd;
+				tnb = 4.0 * nd;
 			}
 
-			double djk, djj, sumjk = 0, sumj = 0;
-			double b1 = beta2 / 2, b2 = b1 / (1.0 + beta2);
+			double djk, djj, sumjk = 0.0, sumj = 0.0;
+			double b1 = beta2 / 2.0, b2 = b1 / (1.0 + beta2);
 
 			/* Heinze & Wagner (1997), page 3
 				We use d[j][k] = ||Y[j]-Y[k]||^2 = (Y[j]-Y[k])'S^(-1)(Y[j]-Y[k])
 				So d[j][k]= d[k][j] and d[j][j] = 0
 			*/
 			for (long j = 1; j <= n; j++) {
-				double wj = p[j][nocp1] > 0 ? mixingP * p[j][im] / p[j][nocp1] : 0;
+				double wj = p[j][nocp1] > 0.0 ? mixingP * p[j][im] / p[j][nocp1] : 0.0;
 				for (long k = 1; k < j; k++) {
 					djk = NUMmahalanobisDistance_chi (cov -> lowerCholesky, thy data[j], thy data[k], d, d);
-					double w = p[k][nocp1] > 0 ? wj * mixingP * p[k][im] / p[k][nocp1] : 0;
-					sumjk += 2 * w * exp (-b1 * djk); // factor 2 because d[j][k] == d[k][j]
+					double w = p[k][nocp1] > 0.0 ? wj * mixingP * p[k][im] / p[k][nocp1] : 0.0;
+					sumjk += 2.0 * w * exp (-b1 * djk); // factor 2 because d[j][k] == d[k][j]
 				}
 				sumjk += wj * wj; // for k == j. Is this ok now for probability weighing ????
 				djj = NUMmahalanobisDistance_chi (cov -> lowerCholesky, thy data[j], cov -> centroid, d, d);
@@ -1431,7 +1421,7 @@ TableOfReal GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests (G
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal for BHEP not created.");
+		Melder_throw (U"TableOfReal for BHEP not created.");
 	}
 }
 
diff --git a/dwtools/GaussianMixture.h b/dwtools/GaussianMixture.h
index ae627ef..f89dcb5 100644
--- a/dwtools/GaussianMixture.h
+++ b/dwtools/GaussianMixture.h
@@ -30,7 +30,7 @@
 #include "TableOfReal_extensions.h"
 
 #include "GaussianMixture_def.h"
-oo_CLASS_CREATE (GaussianMixture, Data);
+oo_CLASS_CREATE (GaussianMixture, Daata);
 
 /*
 	Constraints for a Gaussian mixture:
@@ -42,15 +42,15 @@ void GaussianMixture_expandPCA (GaussianMixture me);
 void GaussianMixture_unExpandPCA (GaussianMixture me);
 
 void GaussianMixture_drawConcentrationEllipses (GaussianMixture me, Graphics g,
-	double scale, int confidence, wchar_t *label, int pcaDirections, long d1, long d2,
+	double scale, int confidence, char32 *label, int pcaDirections, long d1, long d2,
 	double xmin, double xmax, double ymin, double ymax, int fontSize, int garnish);
 void GaussianMixture_and_PCA_drawConcentrationEllipses (GaussianMixture me, PCA him, Graphics g,
-	double scale, int confidence, wchar_t *label, long d1, long d2,
+	double scale, int confidence, char32 *label, long d1, long d2,
 	double xmin, double xmax, double ymin, double ymax, int fontSize, int garnish);
 void GaussianMixture_drawMarginalPdf (GaussianMixture me, Graphics g, long d, double xmin, double xmax, double ymin, double ymax, long npoints, long nbins, int garnish);
 void GaussianMixture_and_PCA_drawMarginalPdf (GaussianMixture me, PCA him, Graphics g, long d, double xmin, double xmax, double ymin, double ymax, long npoints, long nbins, int garnish);
 
-GaussianMixture TableOfReal_to_GaussianMixture_fromRowLabels (I, long storage);
+GaussianMixture TableOfReal_to_GaussianMixture_fromRowLabels (TableOfReal me, long storage);
 
 void GaussianMixture_initialGuess (GaussianMixture me, TableOfReal thee, double nSigmas, double ru_range);
 /*
@@ -70,23 +70,23 @@ void GaussianMixture_initialGuess (GaussianMixture me, TableOfReal thee, double
 #define GaussianMixture_AICC 4
 #define GaussianMixture_CD_LIKELIHOOD 5
 
-const wchar_t *GaussianMixture_criterionText (int criterion);
+const char32 *GaussianMixture_criterionText (int criterion);
 
-GaussianMixture TableOfReal_to_GaussianMixture (I, long numberOfComponents, double delta_lnp, long maxNumberOfIterations, double lambda, int storage, int criterion);
+GaussianMixture TableOfReal_to_GaussianMixture (TableOfReal me, long numberOfComponents, double delta_lnp, long maxNumberOfIterations, double lambda, int storage, int criterion);
 
 void GaussianMixture_and_TableOfReal_improveLikelihood (GaussianMixture me, thou, double delta_lnp,
 	long maxNumberOfIterations, double lambda, int criterion);
 
-GaussianMixture GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (GaussianMixture me, thou, long minNumberOfComponents, double delta_l, long maxNumberOfIterations, double lambda, int criterion);
+GaussianMixture GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (GaussianMixture me, TableOfReal thee, long minNumberOfComponents, double delta_l, long maxNumberOfIterations, double lambda, int criterion);
 void GaussianMixture_splitComponent (GaussianMixture me, long component);
 
 ClassificationTable GaussianMixture_and_TableOfReal_to_ClassificationTable (GaussianMixture me, TableOfReal thee);
-TableOfReal GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests (GaussianMixture me, thou, double h);
+TableOfReal GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests (GaussianMixture me, TableOfReal thee, double h);
 
-double GaussianMixture_and_TableOfReal_getLikelihoodValue (GaussianMixture me, thou, int criterion);
+double GaussianMixture_and_TableOfReal_getLikelihoodValue (GaussianMixture me, TableOfReal thee, int criterion);
 
 double GaussianMixture_getProbabilityAtPosition (GaussianMixture me, double *vector);
-double GaussianMixture_getProbabilityAtPosition_string (GaussianMixture me, const wchar_t *vector);
+double GaussianMixture_getProbabilityAtPosition_string (GaussianMixture me, const char32 *vector);
 double GaussianMixture_getMarginalProbabilityAtPosition (GaussianMixture me, double *vector, double x);
 
 Correlation GaussianMixture_and_TableOfReal_to_Correlation (GaussianMixture me, thou);
@@ -110,7 +110,7 @@ void GaussianMixture_getIntervalAlongDirection (GaussianMixture me, long d, doub
 void GaussianMixture_getIntervalsAlongDirections (GaussianMixture me, long d1, long d2, double nsigmas, double *xmin, double *xmax, double *ymin, double *ymax);
 
 /* with on demand expand of pca ! */
-int GaussianMixture_generateOneVector (GaussianMixture me, double *c, wchar_t **covname, double *buf);
+int GaussianMixture_generateOneVector (GaussianMixture me, double *c, char32 **covname, double *buf);
 TableOfReal GaussianMixture_to_TableOfReal_randomSampling (GaussianMixture me, long numberOfPoints);
 
 #endif /* _GaussianMixture_h_ */
diff --git a/dwtools/GaussianMixture_def.h b/dwtools/GaussianMixture_def.h
index db3f38e..759b799 100644
--- a/dwtools/GaussianMixture_def.h
+++ b/dwtools/GaussianMixture_def.h
@@ -18,7 +18,7 @@
  */
 
 #define ooSTRUCT GaussianMixture
-oo_DEFINE_CLASS (GaussianMixture, Data)
+oo_DEFINE_CLASS (GaussianMixture, Daata)
 
 	oo_LONG (numberOfComponents)
 	oo_LONG (dimension)
@@ -26,8 +26,8 @@ oo_DEFINE_CLASS (GaussianMixture, Data)
 	oo_COLLECTION (Ordered, covariances, Covariance, 0)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS(GaussianMixture)
diff --git a/dwtools/HMM.cpp b/dwtools/HMM.cpp
index fbd0356..23a8942 100644
--- a/dwtools/HMM.cpp
+++ b/dwtools/HMM.cpp
@@ -1,6 +1,6 @@
 /* HMM.cpp
  *
- * Copyright (C) 2010-2012 David Weenink
+ * Copyright (C) 2010-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -53,20 +53,19 @@
 */
 
 // helpers
-int NUMget_line_intersection_with_circle (double xc, double yc, double r, double a, double b,
-        double *x1, double *y1, double *x2, double *y2);
-void HMM_Observation_init (I, const wchar_t *label, long numberOfComponents, long dimension, long storage);
-HMM_Observation HMM_Observation_create (const wchar_t *label, long numberOfComponents, long dimension, long storage);
+int NUMget_line_intersection_with_circle (double xc, double yc, double r, double a, double b, double *x1, double *y1, double *x2, double *y2);
+void HMM_Observation_init (I, const char32 *label, long numberOfComponents, long dimension, long storage);
+autoHMM_Observation HMM_Observation_create (const char32 *label, long numberOfComponents, long dimension, long storage);
 
 long HMM_and_HMM_ObservationSequence_getLongestSequence (HMM me, HMM_ObservationSequence thee, long symbolNumber);
 long StringsIndex_getLongestSequence (StringsIndex me, long index, long *pos);
-long Strings_getLongestSequence (Strings me, wchar_t *string, long *pos);
-void HMM_State_init (I, const wchar_t *label);
-HMM_State HMM_State_create (const wchar_t *label);
+long Strings_getLongestSequence (Strings me, char32 *string, long *pos);
+void HMM_State_init (I, const char32 *label);
+autoHMM_State HMM_State_create (const char32 *label);
 
-HMM_BaumWelch HMM_BaumWelch_create (long nstates, long nsymbols, long capacity);
+autoHMM_BaumWelch HMM_BaumWelch_create (long nstates, long nsymbols, long capacity);
 void HMM_BaumWelch_getGamma (HMM_BaumWelch me);
-HMM_BaumWelch HMM_forward (HMM me, long *obs, long nt);
+autoHMM_BaumWelch HMM_forward (HMM me, long *obs, long nt);
 void HMM_BaumWelch_reInit (HMM_BaumWelch me);
 void HMM_and_HMM_BaumWelch_getXi (HMM me, HMM_BaumWelch thee, long *obs);
 void HMM_and_HMM_BaumWelch_reestimate (HMM me, HMM_BaumWelch thee);
@@ -75,29 +74,29 @@ void HMM_and_HMM_BaumWelch_forward (HMM me, HMM_BaumWelch thee, long *obs);
 void HMM_and_HMM_BaumWelch_backward (HMM me, HMM_BaumWelch thee, long *obs);
 void HMM_and_HMM_Viterbi_decode (HMM me, HMM_Viterbi thee, long *obs);
 double HMM_getProbabilityOfObservations (HMM me, long *obs, long numberOfTimes);
-TableOfReal StringsIndex_to_TableOfReal_transitions (StringsIndex me, int probabilities);
-StringsIndex HMM_and_HMM_StateSequence_to_StringsIndex (HMM me, HMM_StateSequence thee);
+autoTableOfReal StringsIndex_to_TableOfReal_transitions (StringsIndex me, int probabilities);
+autoStringsIndex HMM_and_HMM_StateSequence_to_StringsIndex (HMM me, HMM_StateSequence thee);
 
 
-HMM_Viterbi HMM_Viterbi_create (long nstates, long ntimes);
-HMM_Viterbi HMM_to_HMM_Viterbi (HMM me, long *obs, long ntimes);
+autoHMM_Viterbi HMM_Viterbi_create (long nstates, long ntimes);
+autoHMM_Viterbi HMM_to_HMM_Viterbi (HMM me, long *obs, long ntimes);
 
 // evaluate the numbers given to probabilities
-static double *NUMwstring_to_probs (wchar_t *s, long nwanted) {
+static double *NUMwstring_to_probs (char32 *s, long nwanted) {
 	long numbers_found;
 	autoNUMvector<double> numbers (NUMstring_to_numbers (s, &numbers_found), 1);
 	if (numbers_found != nwanted) {
-		Melder_throw ("You supplied ", numbers_found, ", while ", nwanted, " numbers needed.");
+		Melder_throw (U"You supplied ", numbers_found, U", while ", nwanted, U" numbers needed.");
 	}
 	double sum = 0;
 	for (long i = 1; i <= numbers_found; i++) {
 		if (numbers[i] < 0) {
-			Melder_throw ("Numbers have to be positive.");
+			Melder_throw (U"Numbers have to be positive.");
 		}
 		sum += numbers[i];
 	}
 	if (sum <= 0) {
-		Melder_throw ("All probabilities cannot be zero.");
+		Melder_throw (U"All probabilities cannot be zero.");
 	}
 	for (long i = 1; i <= numbers_found; i++) {
 		numbers[i] /= sum;
@@ -105,10 +104,9 @@ static double *NUMwstring_to_probs (wchar_t *s, long nwanted) {
 	return numbers.transfer();
 }
 
-int NUMget_line_intersection_with_circle (double xc, double yc, double r, double a, double b,
-        double *x1, double *y1, double *x2, double *y2) {
-	double ca = a * a + 1, bmyc = (b - yc);
-	double cb = 2 * (a * bmyc - xc);
+int NUMget_line_intersection_with_circle (double xc, double yc, double r, double a, double b, double *x1, double *y1, double *x2, double *y2) {
+	double ca = a * a + 1.0, bmyc = (b - yc);
+	double cb = 2.0 * (a * bmyc - xc);
 	double cc = bmyc * bmyc + xc * xc - r * r;
 	long nroots = NUMsolveQuadraticEquation (ca, cb, cc, x1, x2);
 	if (nroots == 1) {
@@ -142,28 +140,27 @@ static double HMM_and_HMM_getCrossEntropy_asym (HMM me, HMM thee, long observati
 
 /**************** HMM_Observation ******************************/
 
-Thing_implement (HMM_Observation, Data, 0);
+Thing_implement (HMM_Observation, Daata, 0);
 
-void HMM_Observation_init (I, const wchar_t *label, long numberOfComponents, long dimension, long storage) {
-	iam (HMM_Observation);
-	my label = Melder_wcsdup (label);
+void HMM_Observation_init (HMM_Observation me, const char32 *label, long numberOfComponents, long dimension, long storage) {
+	my label = Melder_dup (label);
 	my gm = GaussianMixture_create (numberOfComponents, dimension, storage);
 }
 
-HMM_Observation HMM_Observation_create (const wchar_t *label, long numberOfComponents, long dimension, long storage) {
+autoHMM_Observation HMM_Observation_create (const char32 *label, long numberOfComponents, long dimension, long storage) {
 	try {
 		autoHMM_Observation me = Thing_new (HMM_Observation);
 		HMM_Observation_init (me.peek(), label, numberOfComponents, dimension, storage);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("HMM_Observation not created.");
+		Melder_throw (U"HMM_Observation not created.");
 	}
 }
 
-long Strings_getLongestSequence (Strings me, wchar_t *string, long *pos) {
+long Strings_getLongestSequence (Strings me, char32 *string, long *pos) {
 	long length = 0, longest = 0, lpos = 0;
 	for (long i = 1; i <= my numberOfStrings; i++) {
-		if (Melder_wcsequ (my strings[i], string)) {
+		if (Melder_equ (my strings[i], string)) {
 			if (length == 0) {
 				lpos = i;
 			}
@@ -202,31 +199,30 @@ long StringsIndex_getLongestSequence (StringsIndex me, long index, long *pos) {
 
 /**************** HMM_State ******************************/
 
-Thing_implement (HMM_State, Data, 0);
+Thing_implement (HMM_State, Daata, 0);
 
-void HMM_State_init (I, const wchar_t *label) {
-	iam (HMM_State);
-	my label = Melder_wcsdup (label);
+void HMM_State_init (HMM_State me, const char32 *label) {
+	my label = Melder_dup (label);
 }
 
-HMM_State HMM_State_create (const wchar_t *label) {
+autoHMM_State HMM_State_create (const char32 *label) {
 	try {
 		autoHMM_State me = Thing_new (HMM_State);
 		HMM_State_init (me.peek(), label);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("HMM_State not created.");
+		Melder_throw (U"HMM_State not created.");
 	}
 }
 
-void HMM_State_setLabel (HMM_State me, wchar_t *label) {
+void HMM_State_setLabel (HMM_State me, char32 *label) {
 	Melder_free (my label);
-	my label = Melder_wcsdup (label);
+	my label = Melder_dup (label);
 }
 
 /**************** HMM_BaumWelch ******************************/
 
-Thing_implement (HMM_BaumWelch, Data, 0);
+Thing_implement (HMM_BaumWelch, Daata, 0);
 
 void structHMM_BaumWelch :: v_destroy () {
 	for (long it = 1; it <= numberOfTimes; it++) {
@@ -239,7 +235,7 @@ void structHMM_BaumWelch :: v_destroy () {
 	NUMmatrix_free (gamma, 1, 1);
 }
 
-HMM_BaumWelch HMM_BaumWelch_create (long nstates, long nsymbols, long capacity) {
+autoHMM_BaumWelch HMM_BaumWelch_create (long nstates, long nsymbols, long capacity) {
 	try {
 		autoHMM_BaumWelch me = Thing_new (HMM_BaumWelch);
 		my numberOfTimes = my capacity = capacity;
@@ -257,9 +253,9 @@ HMM_BaumWelch HMM_BaumWelch_create (long nstates, long nsymbols, long capacity)
 		for (long it = 1; it <= capacity; it++) {
 			my xi[it] = NUMmatrix<double> (1, nstates, 1, nstates);
 		}
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("HMM_BaumWelch not created.");
+		Melder_throw (U"HMM_BaumWelch not created.");
 	}
 }
 
@@ -279,9 +275,9 @@ void HMM_BaumWelch_getGamma (HMM_BaumWelch me) {
 
 /**************** HMM_Viterbi ******************************/
 
-Thing_implement (HMM_Viterbi, Data, 0);
+Thing_implement (HMM_Viterbi, Daata, 0);
 
-HMM_Viterbi HMM_Viterbi_create (long nstates, long ntimes) {
+autoHMM_Viterbi HMM_Viterbi_create (long nstates, long ntimes) {
 	try {
 		autoHMM_Viterbi me = Thing_new (HMM_Viterbi);
 		my numberOfTimes = ntimes;
@@ -289,9 +285,9 @@ HMM_Viterbi HMM_Viterbi_create (long nstates, long ntimes) {
 		my viterbi = NUMmatrix<double> (1, nstates, 1 , ntimes);
 		my bp = NUMmatrix<long> (1, nstates, 1 , ntimes);
 		my path = NUMvector<long> (1, ntimes);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("HMM_Viterbi not created.");
+		Melder_throw (U"HMM_Viterbi not created.");
 	}
 }
 
@@ -299,13 +295,13 @@ HMM_Viterbi HMM_Viterbi_create (long nstates, long ntimes) {
 
 Thing_implement (HMM_ObservationSequence, Table, 0);
 
-HMM_ObservationSequence HMM_ObservationSequence_create (long numberOfItems, long dataLength) {
+autoHMM_ObservationSequence HMM_ObservationSequence_create (long numberOfItems, long dataLength) {
 	try {
 		autoHMM_ObservationSequence me = Thing_new (HMM_ObservationSequence);
 		Table_initWithoutColumnNames (me.peek(), numberOfItems, dataLength + 1);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("HMM_ObservationSequence not created.");
+		Melder_throw (U"HMM_ObservationSequence not created.");
 	}
 }
 
@@ -317,40 +313,40 @@ void HMM_ObservationSequence_removeObservation (HMM_ObservationSequence me, long
 	Table_removeRow ( (Table) me, index);
 }
 
-Strings HMM_ObservationSequence_to_Strings (HMM_ObservationSequence me) {
+autoStrings HMM_ObservationSequence_to_Strings (HMM_ObservationSequence me) {
 	try {
 		long numberOfStrings = my rows -> size;
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector<wchar_t *> (1, numberOfStrings);
+		thy strings = NUMvector<char32 *> (1, numberOfStrings);
 		for (long i = 1; i <= numberOfStrings; i++) {
-			thy strings[i] = Melder_wcsdup_f (Table_getStringValue_Assert ( (Table) me, i, 1));
+			thy strings[i] = Melder_dup_f (Table_getStringValue_Assert ( (Table) me, i, 1));
 			(thy numberOfStrings) ++;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Strings created.");
+		Melder_throw (me, U": no Strings created.");
 	}
 }
 
-HMM_ObservationSequence Strings_to_HMM_ObservationSequence (Strings me) {
+autoHMM_ObservationSequence Strings_to_HMM_ObservationSequence (Strings me) {
 	try {
 		autoHMM_ObservationSequence thee = HMM_ObservationSequence_create (my numberOfStrings, 0);
 		for (long i = 1; i <= my numberOfStrings; i++) {
 			Table_setStringValue ( (Table) thee.peek(), i, 1, my strings[i]);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no HMM_ObservationSequence created.");
+		Melder_throw (me, U": no HMM_ObservationSequence created.");
 	}
 }
 
-StringsIndex HMM_ObservationSequence_to_StringsIndex (HMM_ObservationSequence me) {
+autoStringsIndex HMM_ObservationSequence_to_StringsIndex (HMM_ObservationSequence me) {
 	try {
 		autoStrings s = HMM_ObservationSequence_to_Strings (me);
 		autoStringsIndex thee = Strings_to_StringsIndex (s.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no StringsIndex created.");
+		Melder_throw (me, U": no StringsIndex created.");
 	}
 }
 
@@ -363,13 +359,13 @@ long HMM_and_HMM_ObservationSequence_getLongestSequence (HMM me, HMM_Observation
 
 Thing_implement (HMM_ObservationSequences, Collection, 0);
 
-HMM_ObservationSequences HMM_ObservationSequences_create () {
+autoHMM_ObservationSequences HMM_ObservationSequences_create () {
 	try {
 		autoHMM_ObservationSequences me = Thing_new (HMM_ObservationSequences);
 		Collection_init (me.peek(), classHMM_ObservationSequence, 1000);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("HMM_ObservationSequences not created.");
+		Melder_throw (U"HMM_ObservationSequences not created.");
 	}
 }
 
@@ -386,42 +382,42 @@ long HMM_ObservationSequences_getLongestSequence (HMM_ObservationSequences me) {
 
 Thing_implement (HMM_StateSequence, Strings, 0);
 
-HMM_StateSequence HMM_StateSequence_create (long numberOfItems) {
+autoHMM_StateSequence HMM_StateSequence_create (long numberOfItems) {
 	try {
 		autoHMM_StateSequence me = Thing_new (HMM_StateSequence);
-		my strings = NUMvector<wchar_t *> (1, numberOfItems);
-		return me.transfer();
+		my strings = NUMvector<char32 *> (1, numberOfItems);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("HMM_StateSequence not created.");
+		Melder_throw (U"HMM_StateSequence not created.");
 	}
 }
 
-Strings HMM_StateSequence_to_Strings (HMM_StateSequence me) {
+autoStrings HMM_StateSequence_to_Strings (HMM_StateSequence me) {
 	try {
 		autoStrings thee = Thing_new (Strings);
 		my structStrings :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Strings created.");
+		Melder_throw (me, U": no Strings created.");
 	}
 }
 
 
 /**************** HMM ******************************/
 
-Thing_implement (HMM, Data, 0);
+Thing_implement (HMM, Daata, 0);
 
 void structHMM :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of states: ", Melder_integer (numberOfStates));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of states: ", numberOfStates);
 	for (long i = 1; i <= numberOfStates; i++) {
 		HMM_State hmms = (HMM_State) states -> item[i];
-		MelderInfo_writeLine (L"  ", hmms -> label);
+		MelderInfo_writeLine (U"  ", hmms -> label);
 	}
-	MelderInfo_writeLine (L"Number of symbols: ", Melder_integer (numberOfObservationSymbols));
+	MelderInfo_writeLine (U"Number of symbols: ", numberOfObservationSymbols);
 	for (long i = 1; i <= numberOfObservationSymbols; i++) {
 		HMM_Observation hmms = (HMM_Observation) observationSymbols -> item[i];
-		MelderInfo_writeLine (L"  ", hmms -> label);
+		MelderInfo_writeLine (U"  ", hmms -> label);
 	}
 }
 
@@ -436,7 +432,7 @@ static void HMM_init (HMM me, long numberOfStates, long numberOfObservationSymbo
 	my emissionProbs = NUMmatrix<double> (1, numberOfStates, 1, numberOfObservationSymbols);
 }
 
-HMM HMM_create (int leftToRight, long numberOfStates, long numberOfObservationSymbols) {
+autoHMM HMM_create (int leftToRight, long numberOfStates, long numberOfObservationSymbols) {
 	try {
 		autoHMM me = Thing_new (HMM);
 		HMM_init (me.peek(), numberOfStates, numberOfObservationSymbols, leftToRight);
@@ -445,75 +441,65 @@ HMM HMM_create (int leftToRight, long numberOfStates, long numberOfObservationSy
 		HMM_setDefaultTransitionProbs (me.peek());
 		HMM_setDefaultStartProbs (me.peek());
 		HMM_setDefaultEmissionProbs (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("HMM not created.");
+		Melder_throw (U"HMM not created.");
 	}
 }
 
 void HMM_setDefaultStates (HMM me) {
-	autoMelderString label;
 	for (long i = 1; i <= my numberOfStates; i++) {
-		MelderString_append (&label, L"S", Melder_integer (i));
-		autoHMM_State hmms = HMM_State_create (label.string);
+		autoHMM_State hmms = HMM_State_create (Melder_cat (U"S", i));
 		HMM_addState (me, hmms.transfer());
-		MelderString_empty (&label);
 	}
 }
 
-HMM HMM_createFullContinuousModel (int leftToRight, long numberOfStates, long numberOfObservationSymbols,
-                                   long numberOfFeatureStreams, long *dimensionOfStream, long *numberOfGaussiansforStream) {
+autoHMM HMM_createFullContinuousModel (int leftToRight, long numberOfStates, long numberOfObservationSymbols, long numberOfFeatureStreams, long *dimensionOfStream, long *numberOfGaussiansforStream) {
 	(void) leftToRight;
 	(void) numberOfStates;
 	(void) numberOfObservationSymbols;
 	(void) numberOfFeatureStreams;
 	(void) dimensionOfStream;
 	(void) numberOfGaussiansforStream;
-	return NULL;
+	return nullptr;
 }
 
-HMM HMM_createContinuousModel (int leftToRight, long numberOfStates, long numberOfObservationSymbols,
-                               long numberOfMixtureComponentsPerSymbol, long componentDimension, long componentStorage) {
+autoHMM HMM_createContinuousModel (int leftToRight, long numberOfStates, long numberOfObservationSymbols, long numberOfMixtureComponentsPerSymbol, long componentDimension, long componentStorage) {
 	try {
-		MelderString label = { 0 };
 		autoHMM me = Thing_new (HMM);
 		HMM_init (me.peek(), numberOfStates, numberOfObservationSymbols, leftToRight);
 		my numberOfMixtureComponents = numberOfMixtureComponentsPerSymbol;
 		my componentDimension = componentDimension;
 		my componentStorage = componentStorage;
 		for (long i = 1; i <= numberOfStates; i++) {
-			MelderString_append (&label, L"S", Melder_integer (i));
-			autoHMM_State state = HMM_State_create (label.string);
+			autoHMM_State state = HMM_State_create (Melder_cat (U"S", i));
 			HMM_addState (me.peek(), state.transfer());
-			MelderString_empty (&label);
 		}
 		for (long j = 1; j <= numberOfObservationSymbols; j++) {
-			MelderString_append (&label, L"s", Melder_integer (j));
-			autoHMM_Observation obs = HMM_Observation_create (label.string, numberOfMixtureComponentsPerSymbol, componentDimension, componentStorage);
+			autoHMM_Observation obs = HMM_Observation_create (Melder_cat (U"s", j), numberOfMixtureComponentsPerSymbol, componentDimension, componentStorage);
 			HMM_addObservation (me.peek(), obs.transfer());
-			MelderString_empty (&label);
 		}
 		HMM_setDefaultTransitionProbs (me.peek());
 		HMM_setDefaultStartProbs (me.peek());
 		HMM_setDefaultEmissionProbs (me.peek());
 		HMM_setDefaultMixingProbabilities (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Continuous model HMM not created.");
+		Melder_throw (U"Continuous model HMM not created.");
 	}
 }
 
 // for a simple non-hidden model leave either states empty or symbols empty !!!
-HMM HMM_createSimple (int leftToRight, const wchar_t *states_string, const wchar_t *symbols_string) {
+autoHMM HMM_createSimple (int leftToRight, const char32 *states_string, const char32 *symbols_string) {
 	try {
 		autoHMM me = Thing_new (HMM);
-		const wchar_t *states = states_string;
-		const wchar_t *symbols = symbols_string;
+		const char32 *states = states_string;
+		const char32 *symbols = symbols_string;
 		long numberOfStates = Melder_countTokens (states_string);
 		long numberOfObservationSymbols = Melder_countTokens (symbols_string);
 
 		if (numberOfStates == 0 and numberOfObservationSymbols == 0) {
-			Melder_throw ("No states and symbols.");
+			Melder_throw (U"No states and symbols.");
 		}
 		if (numberOfStates > 0) {
 			if (numberOfObservationSymbols <= 0) {
@@ -529,39 +515,36 @@ HMM HMM_createSimple (int leftToRight, const wchar_t *states_string, const wchar
 
 		HMM_init (me.peek(), numberOfStates, numberOfObservationSymbols, leftToRight);
 
-		for (wchar_t *token = Melder_firstToken (states); token != 0; token = Melder_nextToken ()) {
+		for (char32 *token = Melder_firstToken (states); token != 0; token = Melder_nextToken ()) {
 			autoHMM_State state = HMM_State_create (token);
 			HMM_addState (me.peek(), state.transfer());
 		}
-		for (wchar_t *token = Melder_firstToken (symbols); token != NULL; token = Melder_nextToken ()) {
+		for (char32 *token = Melder_firstToken (symbols); token != nullptr; token = Melder_nextToken ()) {
 			autoHMM_Observation symbol = HMM_Observation_create (token, 0, 0, 0);
 			HMM_addObservation (me.peek(), symbol.transfer());
 		}
 		HMM_setDefaultTransitionProbs (me.peek());
 		HMM_setDefaultStartProbs (me.peek());
 		HMM_setDefaultEmissionProbs (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Simple HMM not created.");
+		Melder_throw (U"Simple HMM not created.");
 	}
 }
 
 void HMM_setDefaultObservations (HMM me) {
-	autoMelderString symbol;
-	const wchar_t *def = my notHidden ? L"S" : L"s";
+	const char32 *def = my notHidden ? U"S" : U"s";
 	for (long i = 1; i <= my numberOfObservationSymbols; i++) {
-		MelderString_append (&symbol, def, Melder_integer (i));
-		autoHMM_Observation hmms = HMM_Observation_create (symbol.string, 0, 0, 0);
+		autoHMM_Observation hmms = HMM_Observation_create (Melder_cat (def, i), 0, 0, 0);
 		HMM_addObservation (me, hmms.transfer());
-		MelderString_empty (&symbol);
 	}
 }
 
 void HMM_setDefaultTransitionProbs (HMM me) {
 	for (long i = 1; i <= my numberOfStates; i++) {
-		double p = my leftToRight ? 1.0 / (my numberOfStates - i + 1) : 1.0 / my numberOfStates;
+		double p = my leftToRight ? 1.0 / (my numberOfStates - i + 1.0) : 1.0 / my numberOfStates;
 		for (long j = 1; j <= my numberOfStates; j++) {
-			my transitionProbs[i][j] = my leftToRight && j < i ? 0 : p;
+			my transitionProbs[i][j] = my leftToRight && j < i ? 0.0 : p;
 		}
 	}
 	// leftToRight must have end state!
@@ -580,7 +563,7 @@ void HMM_setDefaultEmissionProbs (HMM me) {
 	double p = 1.0 / my numberOfObservationSymbols;
 	for (long i = 1; i <= my numberOfStates; i++)
 		for (long j = 1; j <= my numberOfObservationSymbols; j++) {
-			my emissionProbs[i][j] = my notHidden ? (i == j ? 1 : 0) : p;
+			my emissionProbs[i][j] = my notHidden ? (i == j ? 1.0 : 0.0) : p;
 		}
 }
 
@@ -594,45 +577,45 @@ void HMM_setDefaultMixingProbabilities (HMM me) {
 	}
 }
 
-void HMM_setStartProbabilities (HMM me, wchar_t *probs) {
+void HMM_setStartProbabilities (HMM me, char32 *probs) {
 	try {
 		autoNUMvector<double> p (NUMwstring_to_probs (probs, my numberOfStates), 1);
 		for (long i = 1; i <= my numberOfStates; i++) {
 			my transitionProbs[0][i] = p[i];
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no start probabilities set.");
+		Melder_throw (me, U": no start probabilities set.");
 	}
 }
 
-void HMM_setTransitionProbabilities (HMM me, long state_number, wchar_t *state_probs) {
+void HMM_setTransitionProbabilities (HMM me, long state_number, char32 *state_probs) {
 	try {
 		if (state_number > my states -> size) {
-			Melder_throw (L"State number too large.");
+			Melder_throw (U"State number too large.");
 		}
 		autoNUMvector<double> p (NUMwstring_to_probs (state_probs, my numberOfStates + 1), 1);
 		for (long i = 1; i <= my numberOfStates + 1; i++) {
 			my transitionProbs[state_number][i] = p[i];
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no transition probabilities set.");
+		Melder_throw (me, U": no transition probabilities set.");
 	}
 }
 
-void HMM_setEmissionProbabilities (HMM me, long state_number, wchar_t *emission_probs) {
+void HMM_setEmissionProbabilities (HMM me, long state_number, char32 *emission_probs) {
 	try {
 		if (state_number > my states -> size) {
-			Melder_throw (L"State number too large.");
+			Melder_throw (U"State number too large.");
 		}
 		if (my notHidden) {
-			Melder_throw (L"The emission probs of this model are fixed.");
+			Melder_throw (U"The emission probs of this model are fixed.");
 		}
 		autoNUMvector<double> p (NUMwstring_to_probs (emission_probs, my numberOfObservationSymbols), 1);
 		for (long i = 1; i <= my numberOfObservationSymbols; i++) {
 			my emissionProbs[state_number][i] = p[i];
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no emission probabilities set.");
+		Melder_throw (me, U": no emission probabilities set.");
 	}
 
 }
@@ -641,7 +624,7 @@ void HMM_addObservation (HMM me, thou) {
 	thouart (HMM_Observation);
 	long ns = my observationSymbols -> size + 1;
 	if (ns > my numberOfObservationSymbols) {
-		Melder_throw ("Observation list is full.");
+		Melder_throw (U"Observation list is full.");
 	}
 	Ordered_addItemPos (my observationSymbols, thee, ns);
 }
@@ -650,12 +633,12 @@ void HMM_addState (HMM me, thou) {
 	thouart (HMM_State);
 	long ns = my states -> size + 1;
 	if (ns > my numberOfStates) {
-		Melder_throw ("States list is full.");
+		Melder_throw (U"States list is full.");
 	}
 	Ordered_addItemPos (my states, thee, ns);
 }
 
-TableOfReal HMM_extractTransitionProbabilities (HMM me) {
+autoTableOfReal HMM_extractTransitionProbabilities (HMM me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my numberOfStates + 1, my numberOfStates + 1);
 		for (long is = 1; is <= my numberOfStates; is++) {
@@ -666,19 +649,19 @@ TableOfReal HMM_extractTransitionProbabilities (HMM me) {
 				thy data[is + 1][js] = my transitionProbs[is][js];
 			}
 		}
-		TableOfReal_setRowLabel (thee.peek(), 1, L"START");
-		TableOfReal_setColumnLabel (thee.peek(), my numberOfStates + 1, L"END");
+		TableOfReal_setRowLabel (thee.peek(), 1, U"START");
+		TableOfReal_setColumnLabel (thee.peek(), my numberOfStates + 1, U"END");
 		for (long is = 1; is <= my numberOfStates; is++) {
 			thy data[1][is] = my transitionProbs[0][is];
 			thy data[is + 1][my numberOfStates + 1] = my transitionProbs[is][my numberOfStates + 1];
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no transition probabilities extracted.");
+		Melder_throw (me, U": no transition probabilities extracted.");
 	}
 }
 
-TableOfReal HMM_extractEmissionProbabilities (HMM me) {
+autoTableOfReal HMM_extractEmissionProbabilities (HMM me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my numberOfStates, my numberOfObservationSymbols);
 		for (long js = 1; js <= my numberOfObservationSymbols; js++) {
@@ -692,9 +675,9 @@ TableOfReal HMM_extractEmissionProbabilities (HMM me) {
 				thy data[is][js] = my emissionProbs[is][js];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no emission probabilities extracted.");
+		Melder_throw (me, U": no emission probabilities extracted.");
 	};
 }
 
@@ -709,7 +692,7 @@ double HMM_getProbabilityOfStayingInState (HMM me, long istate, long numberOfTim
 	if (istate < 0 || istate > my numberOfStates) {
 		return NUMundefined;
 	}
-	return pow (my transitionProbs[istate][istate], numberOfTimeUnits - 1) * (1 - my transitionProbs[istate][istate]);
+	return pow (my transitionProbs[istate][istate], numberOfTimeUnits - 1.0) * (1.0 - my transitionProbs[istate][istate]);
 }
 
 double HMM_and_HMM_getCrossEntropy (HMM me, HMM thee, long observationLength, int symmetric) {
@@ -721,7 +704,7 @@ double HMM_and_HMM_getCrossEntropy (HMM me, HMM thee, long observationLength, in
 	if (ce2 == NUMundefined || ce2 == INFINITY) {
 		return ce2;
 	}
-	return (ce1 + ce2) / 2;
+	return (ce1 + ce2) / 2.0;
 }
 
 double HMM_and_HMM_and_HMM_ObservationSequence_getCrossEntropy (HMM me, HMM thee, HMM_ObservationSequence him) {
@@ -733,13 +716,13 @@ double HMM_and_HMM_and_HMM_ObservationSequence_getCrossEntropy (HMM me, HMM thee
 	if (ce2 == NUMundefined || ce2 == INFINITY) {
 		return ce2;
 	}
-	return (ce1 + ce2) / 2;
+	return (ce1 + ce2) / 2.0;
 }
 
 void HMM_draw (HMM me, Graphics g, int garnish) {
 	double xwidth = sqrt (my numberOfStates);
 	double rstate = 0.3 / xwidth, r = xwidth / 3.0;
-	double xmax = 1.2 * xwidth / 2, xmin = -xmax, ymin = xmin, ymax = xmax;
+	double xmax = 1.2 * xwidth / 2.0, xmin = -xmax, ymin = xmin, ymax = xmax;
 
 	autoNUMvector<double> xs (1, my numberOfStates);
 	autoNUMvector<double> ys (1, my numberOfStates);
@@ -749,7 +732,7 @@ void HMM_draw (HMM me, Graphics g, int garnish) {
 	xs[1] = ys[1] = 0;
 	if (my numberOfStates > 1) {
 		for (long is = 1; is <= my numberOfStates; is++) {
-			double alpha = - NUMpi + NUMpi * 2 * (is - 1) / my numberOfStates;
+			double alpha = - NUMpi + NUMpi * 2.0 * (is - 1) / my numberOfStates;
 			xs[is] = r * cos (alpha); ys[is] = r * sin (alpha);
 		}
 	}
@@ -758,18 +741,18 @@ void HMM_draw (HMM me, Graphics g, int garnish) {
 	// ...
 	// find fontsize
 	int fontSize = Graphics_inqFontSize (g);
-	const wchar_t *widest_label = L"";
-	double max_width = 0;
+	const char32 *widest_label = U"";
+	double max_width = 0.0;
 	for (long is = 1; is <= my numberOfStates; is++) {
 		HMM_State hmms = (HMM_State) my states -> item[is];
-		double w = hmms -> label == NULL ? 0 : Graphics_textWidth (g, hmms -> label);
+		double w = ( hmms -> label == nullptr ? 0.0 : Graphics_textWidth (g, hmms -> label) );
 		if (w > max_width) {
 			widest_label = hmms -> label;
 			max_width = w;
 		}
 	}
 	int new_fontSize = fontSize;
-	while (max_width > 2 * rstate && new_fontSize > 4) {
+	while (max_width > 2.0 * rstate && new_fontSize > 4) {
 		new_fontSize --;
 		Graphics_setFontSize (g, new_fontSize);
 		max_width = Graphics_textWidth (g, widest_label);
@@ -785,11 +768,11 @@ void HMM_draw (HMM me, Graphics g, int garnish) {
 	// draw connections from is to js
 	// 1 -> 2 / 2-> : increase / decrease angle between 1 and 2 with pi /10
 	// use cos(a+b) and cos(a -b) rules
-	double cosb = cos (NUMpi / 10), sinb = sin (NUMpi / 10);
+	double cosb = cos (NUMpi / 10.0), sinb = sin (NUMpi / 10.0);
 	for (long is = 1; is <= my numberOfStates; is++) {
 		double x1 = xs[is], y1 = ys[is];
 		for (long js = 1; js <= my numberOfStates; js++) {
-			if (my transitionProbs[is][js] > 0 && is != js) {
+			if (my transitionProbs[is][js] > 0.0 && is != js) {
 				double x2 = xs[js], y2 = ys[js];
 				double dx = x2 - x1, dy = y2 - y1, h = sqrt (dx * dx + dy * dy), cosa = dx / h, sina = dy / h;
 				double cosabp = cosa * cosb - sina * sinb, cosabm = cosa * cosb + sina * sinb;
@@ -817,7 +800,7 @@ void HMM_unExpandPCA (HMM me) {
 	}
 }
 
-HMM_ObservationSequence HMM_to_HMM_ObservationSequence (HMM me, long startState, long numberOfItems) {
+autoHMM_ObservationSequence HMM_to_HMM_ObservationSequence (HMM me, long startState, long numberOfItems) {
 	try {
 		autoHMM_ObservationSequence thee = HMM_ObservationSequence_create (numberOfItems, my componentDimension);
 		autoNUMvector<double> obs;
@@ -826,15 +809,15 @@ HMM_ObservationSequence HMM_to_HMM_ObservationSequence (HMM me, long startState,
 			obs.reset (1, my componentDimension);
 			buf.reset (1, my componentDimension);
 		}
-		long istate = startState == 0 ? NUMgetIndexFromProbability (my transitionProbs[0], my numberOfStates, NUMrandomUniform (0, 1)) : startState;
+		long istate = startState == 0 ? NUMgetIndexFromProbability (my transitionProbs[0], my numberOfStates, NUMrandomUniform (0.0, 1.0)) : startState;
 		for (long i = 1; i <= numberOfItems; i++) {
 			// Emit a symbol from istate
 
-			long isymbol = NUMgetIndexFromProbability (my emissionProbs[istate], my numberOfObservationSymbols, NUMrandomUniform (0, 1));
+			long isymbol = NUMgetIndexFromProbability (my emissionProbs[istate], my numberOfObservationSymbols, NUMrandomUniform (0.0, 1.0));
 			HMM_Observation s = (HMM_Observation) my observationSymbols -> item[isymbol];
 
 			if (my componentDimension > 0) {
-				wchar_t *name;
+				char32 *name;
 				GaussianMixture_generateOneVector (s -> gm, obs.peek(), &name, buf.peek());
 				for (long j = 1; j <= my componentDimension; j++) {
 					Table_setNumericValue ( (Table) thee.peek(), i, 1 + j, obs[j]);
@@ -845,7 +828,7 @@ HMM_ObservationSequence HMM_to_HMM_ObservationSequence (HMM me, long startState,
 
 			// get next state
 
-			istate = NUMgetIndexFromProbability (my transitionProbs[istate], my numberOfStates + 1, NUMrandomUniform (0, 1));
+			istate = NUMgetIndexFromProbability (my transitionProbs[istate], my numberOfStates + 1, NUMrandomUniform (0.0, 1.0));
 			if (istate == my numberOfStates + 1) { // final state
 				for (long j = numberOfItems; j > i; j--) {
 					HMM_ObservationSequence_removeObservation (thee.peek(), j);
@@ -854,30 +837,30 @@ HMM_ObservationSequence HMM_to_HMM_ObservationSequence (HMM me, long startState,
 			}
 		}
 		HMM_unExpandPCA (me);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
 		HMM_unExpandPCA (me);
-		Melder_throw (me, ":no HMM_ObservationSequence created.");
+		Melder_throw (me, U":no HMM_ObservationSequence created.");
 	}
 }
 
-HMM_BaumWelch HMM_forward (HMM me, long *obs, long nt) {
+autoHMM_BaumWelch HMM_forward (HMM me, long *obs, long nt) {
 	try {
 		autoHMM_BaumWelch thee = HMM_BaumWelch_create (my numberOfStates, my numberOfObservationSymbols, nt);
 		HMM_and_HMM_BaumWelch_forward (me, thee.peek(), obs);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no HMM_BaumWelch created.");
+		Melder_throw (me, U": no HMM_BaumWelch created.");
 	}
 }
 
-HMM_Viterbi HMM_to_HMM_Viterbi (HMM me, long *obs, long ntimes) {
+autoHMM_Viterbi HMM_to_HMM_Viterbi (HMM me, long *obs, long ntimes) {
 	try {
 		autoHMM_Viterbi thee = HMM_Viterbi_create (my numberOfStates, ntimes);
 		HMM_and_HMM_Viterbi_decode (me, thee.peek(), obs);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no HMM_Viterbi created.");
+		Melder_throw (me, U": no HMM_Viterbi created.");
 	}
 }
 
@@ -893,14 +876,14 @@ void HMM_BaumWelch_reInit (HMM_BaumWelch me) {
 	*/
 	for (long is = 0; is <= my numberOfStates; is++) {
 		for (long js = 1; js <= my numberOfStates + 1; js++) {
-			my aij_num[is][js] = 0;
-			my aij_denom[is][js] = 0;
+			my aij_num[is][js] = 0.0;
+			my aij_denom[is][js] = 0.0;
 		}
 	}
 	for (long is = 1; is <= my numberOfStates; is++) {
 		for (long js = 1; js <= my numberOfSymbols; js++) {
-			my bik_num[is][js] = 0;
-			my bik_denom[is][js] = 0;
+			my bik_num[is][js] = 0.0;
+			my bik_denom[is][js] = 0.0;
 		}
 	}
 }
@@ -917,7 +900,7 @@ void HMM_and_HMM_ObservationSequences_learn (HMM me, HMM_ObservationSequences th
 			lnp = bw -> lnProb;
 			HMM_BaumWelch_reInit (bw.peek());
 			for (long ios = 1; ios <= thy size; ios++) {
-				MelderInfo_writeLine (L"Observation sequence: ", Melder_integer (ios));
+				MelderInfo_writeLine (U"Observation sequence: ", ios);
 				HMM_ObservationSequence hmm_os = (HMM_ObservationSequence) thy item[ios];
 				autoStringsIndex si = HMM_and_HMM_ObservationSequence_to_StringsIndex (me, hmm_os);
 				long *obs = si -> classIndex, nobs = si -> numberOfElements; // convenience
@@ -939,7 +922,7 @@ void HMM_and_HMM_ObservationSequences_learn (HMM me, HMM_ObservationSequences th
 					iend --;
 					bw -> numberOfTimes = iend - istart + 1;
 					(bw -> totalNumberOfSequences) ++;
-					MelderInfo_writeLine (L"  sub observation: ", Melder_integer (bw -> totalNumberOfSequences));
+					MelderInfo_writeLine (U"  sub observation: ", bw -> totalNumberOfSequences);
 					HMM_and_HMM_BaumWelch_forward (me, bw.peek(), obs + istart - 1); // get new alphas
 					HMM_and_HMM_BaumWelch_backward (me, bw.peek(), obs + istart - 1); // get new betas
 					HMM_BaumWelch_getGamma (bw.peek());
@@ -951,15 +934,15 @@ void HMM_and_HMM_ObservationSequences_learn (HMM me, HMM_ObservationSequences th
 			// we have processed all observation sequences, now it time to estimate new probabilities.
 			iter++;
 			HMM_and_HMM_BaumWelch_reestimate (me, bw.peek());
-			MelderInfo_writeLine (L"Iteration: ", Melder_integer (iter), L" ln(prob): ", Melder_double (bw -> lnProb));
+			MelderInfo_writeLine (U"Iteration: ", iter, U" ln(prob): ", bw -> lnProb);
 		} while (fabs ( (lnp - bw -> lnProb) / bw -> lnProb) > delta_lnp);
 
-		MelderInfo_writeLine (L"******** Learning summary *********");
-		MelderInfo_writeLine (L"  Processed ", Melder_integer (thy size), L" sequences,");
-		MelderInfo_writeLine (L"  consisting of ", Melder_integer (bw -> totalNumberOfSequences), L" observation sequences.");
-		MelderInfo_writeLine (L"  Longest observation sequence had ", Melder_integer (capacity), L" items");
+		MelderInfo_writeLine (U"******** Learning summary *********");
+		MelderInfo_writeLine (U"  Processed ", thy size, U" sequences,");
+		MelderInfo_writeLine (U"  consisting of ", bw -> totalNumberOfSequences, U" observation sequences.");
+		MelderInfo_writeLine (U"  Longest observation sequence had ", capacity, U" items");
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": not learned.");
+		Melder_throw (me, U" & ", thee, U": not learned.");
 	}
 }
 
@@ -968,7 +951,7 @@ void HMM_and_HMM_ObservationSequences_learn (HMM me, HMM_ObservationSequences th
 void HMM_and_HMM_StateSequence_drawTrellis (HMM me, HMM_StateSequence thee, Graphics g, int connect, int garnish) {
 	long numberOfTimes = thy numberOfStrings;
 	autoStringsIndex si = HMM_and_HMM_StateSequence_to_StringsIndex (me, thee);
-	double xmin = 0, xmax = numberOfTimes + 1, ymin = 0.5, ymax = my numberOfStates + 0.5;
+	double xmin = 0.0, xmax = numberOfTimes + 1.0, ymin = 0.5, ymax = my numberOfStates + 0.5;
 
 	Graphics_setInner (g);
 	Graphics_setWindow (g, xmin, xmax, ymin, ymax);
@@ -982,7 +965,7 @@ void HMM_and_HMM_StateSequence_drawTrellis (HMM me, HMM_StateSequence thee, Grap
 			if (it > 1) {
 				for (long is = 1; is <= my numberOfStates; is++) {
 					bool indexedConnection = si -> classIndex[it - 1] == is && si -> classIndex[it] == js;
-					Graphics_setLineWidth (g, indexedConnection ? 2 : 1);
+					Graphics_setLineWidth (g, indexedConnection ? 2.0 : 1.0);
 					Graphics_setLineType (g, indexedConnection ? Graphics_DRAWN : Graphics_DOTTED);
 					double x1 = it - 1, y1 = is;
 					if (connect || indexedConnection) {
@@ -998,25 +981,25 @@ void HMM_and_HMM_StateSequence_drawTrellis (HMM me, HMM_StateSequence thee, Grap
 		}
 	}
 	Graphics_unsetInner (g);
-	Graphics_setLineWidth (g, 1);
+	Graphics_setLineWidth (g, 1.0);
 	Graphics_setLineType (g, Graphics_DRAWN);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
 		for (long js = 1; js <= my numberOfStates; js++) {
 			HMM_State hmms = (HMM_State) my states -> item[js];
-			Graphics_markLeft (g, js, 0, 0, 0, hmms -> label);
+			Graphics_markLeft (g, js, false, false, false, hmms -> label);
 		}
-		Graphics_marksBottomEvery (g, 1, 1, 1, 1, 0);
-		Graphics_textBottom (g, 1, L"Time index");
+		Graphics_marksBottomEvery (g, 1.0, 1.0, true, true, false);
+		Graphics_textBottom (g, true, U"Time index");
 	}
 }
 
 void HMM_drawBackwardProbabilitiesIllustration (Graphics g, bool garnish) {
-	double xmin = 0, xmax = 1, ymin = 0, ymax = 1;
+	double xmin = 0.0, xmax = 1.0, ymin = 0.0, ymax = 1.0;
 	Graphics_setWindow (g, xmin, xmax, ymin, ymax);
 	double xleft  = 0.1, xright = 0.9, r = 0.03;
 	long np = 6;
-	double dy = (1 - 0.3) / (np - 1);
+	double dy = (1.0 - 0.3) / (np - 1);
 	double x0 = xleft, y0 = 0.5;
 	Graphics_setWindow (g, xmin, xmax, ymin, ymax);
 	Graphics_circle (g, x0, y0, r);
@@ -1040,42 +1023,42 @@ void HMM_drawBackwardProbabilitiesIllustration (Graphics g, bool garnish) {
 		double x1 = xright + 1.5 * r, x2 = x1 - 0.2, y1 = 0.9;
 
 		Graphics_setTextAlignment (g, Graphics_LEFT, Graphics_HALF);
-		Graphics_text (g, x1, y1, L"%s__1_");
+		Graphics_text (g, x1, y1, U"%s__1_");
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (g, x2, y1, L"%a__%i1_");
+		Graphics_text (g, x2, y1, U"%a__%i1_");
 
 		y1 = 0.9 - dy;
 		Graphics_setTextAlignment (g, Graphics_LEFT, Graphics_HALF);
-		Graphics_text (g, x1, y1, L"%s__2_");
+		Graphics_text (g, x1, y1, U"%s__2_");
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (g, x2, y1, L"%a__%i2_");
+		Graphics_text (g, x2, y1, U"%a__%i2_");
 
 		y1 = 0.9 - (np - 1) * dy;
 		Graphics_setTextAlignment (g, Graphics_LEFT, Graphics_HALF);
-		Graphics_text (g, x1, y1, L"%s__%N_");
+		Graphics_text (g, x1, y1, U"%s__%N_");
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (g, x2, y1, L"%a__%%iN%_");
+		Graphics_text (g, x2, y1, U"%a__%%iN%_");
 
 		Graphics_setTextAlignment (g, Graphics_RIGHT, Graphics_HALF);
-		Graphics_text (g, x0 - 1.5 * r, y0, L"%s__%i_");
+		Graphics_text (g, x0 - 1.5 * r, y0, U"%s__%i_");
 
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_BOTTOM);
-		Graphics_text (g, x0, 0, L"%t");
-		Graphics_text (g, x, 0, L"%t+1");
+		Graphics_text (g, x0, 0.0, U"%t");
+		Graphics_text (g, x, 0.0, U"%t+1");
 
 		double y3 = 0.10;
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (g, x0, y3, L"%\\be__%t_(%i)%");
-		Graphics_text (g, x, y3, L"%\\be__%t+1_(%j)");
+		Graphics_text (g, x0, y3, U"%\\be__%t_(%i)%");
+		Graphics_text (g, x, y3, U"%\\be__%t+1_(%j)");
 	}
 }
 
 void HMM_drawForwardProbabilitiesIllustration (Graphics g, bool garnish) {
-	double xmin = 0, xmax = 1, ymin = 0, ymax = 1;
+	double xmin = 0.0, xmax = 1.0, ymin = 0.0, ymax = 1.0;
 	Graphics_setWindow (g, xmin, xmax, ymin, ymax);
-	double xleft  = 0.1, xright = 0.9, r = 0.03;
+	double xleft = 0.1, xright = 0.9, r = 0.03;
 	long np = 6;
-	double dy = (1 - 0.3) / (np - 1);
+	double dy = (1.0 - 0.3) / (np - 1);
 	double x0 = xright, y0 = 0.5;
 	Graphics_setWindow (g, xmin, xmax, ymin, ymax);
 	Graphics_circle (g, x0, y0, r);
@@ -1088,7 +1071,7 @@ void HMM_drawForwardProbabilitiesIllustration (Graphics g, bool garnish) {
 			double cosa = xx / c, sina = yy / c;
 			Graphics_line (g, x0 - r * cosa, y0 + r * sina, x + r * cosa, y - r * sina);
 		} else if (i == 4) {
-			double ddy = 3*dy/4;
+			double ddy = 3.0 * dy / 4.0;
 			Graphics_fillCircle (g, x, y + dy - ddy, 0.5 * r);
 			Graphics_fillCircle (g, x, y + dy - 2 * ddy, 0.5 * r);
 			Graphics_fillCircle (g, x, y + dy - 3 * ddy, 0.5 * r);
@@ -1099,69 +1082,69 @@ void HMM_drawForwardProbabilitiesIllustration (Graphics g, bool garnish) {
 		double x1 = xleft - 1.5 * r, x2 = x1 + 0.2, y1 = 0.9;
 
 		Graphics_setTextAlignment (g, Graphics_RIGHT, Graphics_HALF);
-		Graphics_text (g, x1, y1, L"%s__1_");
+		Graphics_text (g, x1, y1, U"%s__1_");
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (g, x2, y1, L"%a__1%j_");
+		Graphics_text (g, x2, y1, U"%a__1%j_");
 
 		y1 = 0.9 - dy;
 		Graphics_setTextAlignment (g, Graphics_RIGHT, Graphics_HALF);
-		Graphics_text (g, x1, y1, L"%s__2_");
+		Graphics_text (g, x1, y1, U"%s__2_");
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (g, x2, y1, L"%a__2%j_");
+		Graphics_text (g, x2, y1, U"%a__2%j_");
 
 		y1 = 0.9 - (np - 1) * dy;
 		Graphics_setTextAlignment (g, Graphics_RIGHT, Graphics_HALF);
-		Graphics_text (g, x1, y1, L"%s__%N_");
+		Graphics_text (g, x1, y1, U"%s__%N_");
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (g, x2, y1, L"%a__%%Nj%_");
+		Graphics_text (g, x2, y1, U"%a__%%Nj%_");
 
 		Graphics_setTextAlignment (g, Graphics_LEFT, Graphics_HALF);
-		Graphics_text (g, x0 + 1.5 * r, y0, L"%s__%j_");
+		Graphics_text (g, x0 + 1.5 * r, y0, U"%s__%j_");
 
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_BOTTOM);
-		Graphics_text (g, x, 0, L"%t");
-		Graphics_text (g, x0, 0, L"%t+1");
+		Graphics_text (g, x, 0.0, U"%t");
+		Graphics_text (g, x0, 0.0, U"%t+1");
 
 		double y3 = 0.10;
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (g, x, y3, L"%\\al__%t_(%i)%");
-		Graphics_text (g, x0, y3, L"%\\al__%t+1_(%j)");
+		Graphics_text (g, x, y3, U"%\\al__%t_(%i)%");
+		Graphics_text (g, x0, y3, U"%\\al__%t+1_(%j)");
 	}
 }
 
 void HMM_drawForwardAndBackwardProbabilitiesIllustration (Graphics g, bool garnish) {
-	double xfrac = 0.1, xs =  1 / (0.5 - xfrac), r = 0.03;
-	Graphics_Viewport vp = Graphics_insetViewport (g, 0, 0.5-xfrac, 0, 1);
+	double xfrac = 0.1, xs = 1.0 / (0.5 - xfrac), r = 0.03;
+	Graphics_Viewport vp = Graphics_insetViewport (g, 0.0, 0.5-xfrac, 0.0, 1.0);
 	HMM_drawForwardProbabilitiesIllustration (g, false);
 	Graphics_resetViewport (g, vp);
-	Graphics_insetViewport (g, 0.5 + xfrac, 1, 0, 1);
+	Graphics_insetViewport (g, 0.5 + xfrac, 1.0, 0.0, 1.0);
 	HMM_drawBackwardProbabilitiesIllustration (g, false);
 	Graphics_resetViewport (g, vp);
-	Graphics_setWindow (g, 0, xs, 0, 1);
+	Graphics_setWindow (g, 0.0, xs, 0.0, 1.0);
 	if (garnish) {
-		double rx1 = 1 + xs * 2 * xfrac + 0.1, rx2 = rx1 + 0.9 - 0.1, y1 = 0.1;
+		double rx1 = 1.0 + xs * 2.0 * xfrac + 0.1, rx2 = rx1 + 0.9 - 0.1, y1 = 0.1;
 		Graphics_line (g, 0.9 + r, 0.5, rx1 - r, 0.5);
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_BOTTOM);
-		Graphics_text (g, 0.9, 0.5 + r, L"%s__%i_");
-		Graphics_text (g, rx1, 0.5 + r, L"%s__%j_");
+		Graphics_text (g, 0.9, 0.5 + r, U"%s__%i_");
+		Graphics_text (g, rx1, 0.5 + r, U"%s__%j_");
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_TOP);
-		Graphics_text (g, 1.0 + xfrac * xs, 0.5, L"%a__%%ij%_%b__%j_(O__%t+1_)");
+		Graphics_text (g, 1.0 + xfrac * xs, 0.5, U"%a__%%ij%_%b__%j_(O__%t+1_)");
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_BOTTOM);
-		Graphics_text (g, 0.1, 0, L"%t-1");
-		Graphics_text (g, 0.9, 0, L"%t");
-		Graphics_text (g, rx1, 0, L"%t+1");
-		Graphics_text (g, rx2, 0, L"%t+2");
+		Graphics_text (g, 0.1, 0.0, U"%t-1");
+		Graphics_text (g, 0.9, 0.0, U"%t");
+		Graphics_text (g, rx1, 0.0, U"%t+1");
+		Graphics_text (g, rx2, 0.0, U"%t+2");
 		Graphics_setLineType (g, Graphics_DASHED);
 		double x4 = rx1 - 0.06, x3 = 0.9 + 0.06;
-		Graphics_line (g, x3, 0.7, x3, 0);
-		Graphics_line (g, x4, 0.7, x4, 0);
+		Graphics_line (g, x3, 0.7, x3, 0.0);
+		Graphics_line (g, x4, 0.7, x4, 0.0);
 		Graphics_setLineType (g, Graphics_DRAWN);
 		Graphics_arrow (g, x4, y1, x4 + 0.2, y1);
 		Graphics_arrow (g, x3, y1, x3 - 0.2, y1);
 		Graphics_setTextAlignment (g, Graphics_RIGHT, Graphics_BOTTOM);
-		Graphics_text (g, x3 - 0.01, y1, L"\\al__%t_(i)");
+		Graphics_text (g, x3 - 0.01, y1, U"\\al__%t_(i)");
 		Graphics_setTextAlignment (g, Graphics_LEFT, Graphics_BOTTOM);
-		Graphics_text (g, x4 + 0.01, y1, L"\\be__%t+1_(j)");
+		Graphics_text (g, x4 + 0.01, y1, U"\\be__%t+1_(j)");
 	}
 }
 
@@ -1176,25 +1159,24 @@ void HMM_and_HMM_BaumWelch_getXi (HMM me, HMM_BaumWelch thee, long *obs) {
 				sum += thy xi[it][is][js];
 			}
 		}
-		for (long is = 1; is <= my numberOfStates; is++)
+		for (long is = 1; is <= my numberOfStates; is++) {
 			for (long js = 1; js <= my numberOfStates; js++) {
-				thy xi[it][is][js]  /= sum;
+				thy xi[it][is][js] /= sum;
 			}
+		}
 	}
 }
 
 void HMM_and_HMM_BaumWelch_addEstimate (HMM me, HMM_BaumWelch thee, long *obs) {
-	long is; // yes, outside
-
-	for (is = 1; is <= my numberOfStates; is++) {
+	for (long is = 1; is <= my numberOfStates; is++) {
 		// only for valid start states with p > 0
-		if (my transitionProbs[0][is] > 0) {
+		if (my transitionProbs[0][is] > 0.0) {
 			thy aij_num[0][is] += thy gamma[is][1];
-			thy aij_denom[0][is] += 1;
+			thy aij_denom[0][is] += 1.0;
 		}
 	}
 
-	for (is = 1; is <= my numberOfStates; is++) {
+	for (long is = 1; is <= my numberOfStates; is++) {
 		double gammasum = 0.0;
 		for (long it = 1; it <= thy numberOfTimes - 1; it++) {
 			gammasum += thy gamma[is][it];
@@ -1206,7 +1188,7 @@ void HMM_and_HMM_BaumWelch_addEstimate (HMM me, HMM_BaumWelch thee, long *obs) {
 				xisum += thy xi[it][is][js];
 			}
 			// zero probs signal invalid connections, don't reestimate
-			if (my transitionProbs[is][js] > 0) {
+			if (my transitionProbs[is][js] > 0.0) {
 				thy aij_num[is][js] += xisum;
 				thy aij_denom[is][js] += gammasum;
 			}
@@ -1226,7 +1208,7 @@ void HMM_and_HMM_BaumWelch_addEstimate (HMM me, HMM_BaumWelch thee, long *obs) {
 					}
 				}
 				// only reestimate probs > 0 !
-				if (my emissionProbs[is][k] > 0) {
+				if (my emissionProbs[is][k] > 0.0) {
 					thy bik_num[is][k] += gammasum_k;
 					thy bik_denom[is][k] += gammasum;
 				}
@@ -1235,7 +1217,7 @@ void HMM_and_HMM_BaumWelch_addEstimate (HMM me, HMM_BaumWelch thee, long *obs) {
 		// For a left-to-right model the final state determines the transition prob to go to the END state
 		if (my leftToRight) {
 			thy aij_num[is][my numberOfStates + 1] += thy gamma[is][thy numberOfTimes];
-			thy aij_denom[is][my numberOfStates + 1] += 1;
+			thy aij_denom[is][my numberOfStates + 1] += 1.0;
 		}
 	}
 }
@@ -1256,34 +1238,34 @@ void HMM_and_HMM_BaumWelch_reestimate (HMM me, HMM_BaumWelch thee) {
 			We can prevent this from happening by asumimg a minimal probability for valid transitions
 			i.e. which have initially p > 0.
 		*/
-		if (my transitionProbs[0][is] > 0) {
+		if (my transitionProbs[0][is] > 0.0) {
 			p = thy aij_num[0][is] / thy aij_denom[0][is];
-			my transitionProbs[0][is] = p > 0 ? p : thy minProb;
+			my transitionProbs[0][is] = p > 0.0 ? p : thy minProb;
 		}
 		for (long js = 1; js <= my numberOfStates; js++) {
-			if (my transitionProbs[is][js] > 0) {
+			if (my transitionProbs[is][js] > 0.0) {
 				p = thy aij_num[is][js] / thy aij_denom[is][js];
-				my transitionProbs[is][js] = p > 0 ? p : thy minProb;
+				my transitionProbs[is][js] = p > 0.0 ? p : thy minProb;
 			}
 		}
 		if (! my notHidden) {
 			for (long k = 1; k <= my numberOfObservationSymbols; k++) {
-				if (my emissionProbs[is][k] > 0) {
+				if (my emissionProbs[is][k] > 0.0) {
 					p = thy bik_num[is][k] / thy bik_denom[is][k];
-					my emissionProbs[is][k] = p > 0 ? p : thy minProb;
+					my emissionProbs[is][k] = p > 0.0 ? p : thy minProb;
 				}
 			}
 		}
-		if (my leftToRight && my transitionProbs[is][my numberOfStates + 1] > 0) {
+		if (my leftToRight && my transitionProbs[is][my numberOfStates + 1] > 0.0) {
 			p = thy aij_num[is][my numberOfStates + 1] / thy aij_denom[is][my numberOfStates + 1];
-			my transitionProbs[is][my numberOfStates + 1] = p > 0 ? p : thy minProb;
+			my transitionProbs[is][my numberOfStates + 1] = p > 0.0 ? p : thy minProb;
 		}
 	}
 }
 
 void HMM_and_HMM_BaumWelch_forward (HMM me, HMM_BaumWelch thee, long *obs) {
 	// initialise at t = 1 & scale
-	thy scale[1] = 0;
+	thy scale[1] = 0.0;
 	for (long js = 1; js <= my numberOfStates; js++) {
 		thy alpha[js][1] = my transitionProbs[0][js] * my emissionProbs[js][ obs[1] ];
 		thy scale[1] += thy alpha[js][1];
@@ -1368,14 +1350,14 @@ void HMM_and_HMM_Viterbi_decode (HMM me, HMM_Viterbi thee, long *obs) {
 	}
 }
 
-HMM_StateSequence HMM_and_HMM_ObservationSequence_to_HMM_StateSequence (HMM me, HMM_ObservationSequence thee) {
+autoHMM_StateSequence HMM_and_HMM_ObservationSequence_to_HMM_StateSequence (HMM me, HMM_ObservationSequence thee) {
 	try {
 		autoStringsIndex si = HMM_and_HMM_ObservationSequence_to_StringsIndex (me, thee);
 		long *obs = si -> classIndex; // convenience
 		long numberOfUnknowns = StringsIndex_countItems (si.peek(), 0);
 
 		if (numberOfUnknowns > 0) {
-			Melder_throw ("Unknown observation symbol(s) (# = ", Melder_integer (numberOfUnknowns), L").");
+			Melder_throw (U"Unknown observation symbol(s) (# = ", numberOfUnknowns, U").");
 		}
 
 
@@ -1385,12 +1367,12 @@ HMM_StateSequence HMM_and_HMM_ObservationSequence_to_HMM_StateSequence (HMM me,
 		// trace the path and get states
 		for (long it = 1; it <= numberOfTimes; it++) {
 			HMM_State hmms = (HMM_State) my states -> item[ v -> path[it] ];
-			his strings [it] = Melder_wcsdup (hmms -> label);
+			his strings [it] = Melder_dup (hmms -> label);
 			his numberOfStrings ++;
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no HMM_StateSequence created.");
+		Melder_throw (me, U": no HMM_StateSequence created.");
 	}
 }
 
@@ -1403,12 +1385,12 @@ double HMM_and_HMM_StateSequence_getProbability (HMM me, HMM_StateSequence thee)
 		return NUMundefined;
 	}
 	if (numberOfUnknowns > 0) {
-		Melder_warning (L"Unknown states (# = ", Melder_integer (numberOfUnknowns), L").");
+		Melder_warning (U"Unknown states (# = ", numberOfUnknowns, U").");
 		return NUMundefined;
 	}
 	double p0 = my transitionProbs [0][ index[1] ];
 	if (p0 == 0) {
-		Melder_throw ("You cannot start with this state.");
+		Melder_throw (U"You cannot start with this state.");
 	}
 	double lnp = log (p0);
 	for (long it = 2; it <= thy numberOfStrings; it++) {
@@ -1482,7 +1464,7 @@ double HMM_getProbabilityOfObservations (HMM me, long *obs, long numberOfTimes)
 		scale[1] += alpha_t[js];
 	}
 	if (scale[1] == 0) {
-		Melder_throw ("The observation sequence starts with a symbol which state has starting probability zero.");
+		Melder_throw (U"The observation sequence starts with a symbol which state has starting probability zero.");
 	}
 	for (long js = 1; js <= my numberOfStates; js++) {
 		alpha_t[js] /= scale[1];
@@ -1523,7 +1505,7 @@ double HMM_and_HMM_ObservationSequence_getProbability (HMM me, HMM_ObservationSe
 	long *index = si -> classIndex;
 	long numberOfUnknowns = StringsIndex_countItems (si.peek(), 0);
 	if (numberOfUnknowns > 0) {
-		Melder_throw ("Unknown observations (# = ", numberOfUnknowns, ").");
+		Melder_throw (U"Unknown observations (# = ", numberOfUnknowns, U").");
 	}
 	return HMM_getProbabilityOfObservations (me, index, thy rows -> size);
 }
@@ -1539,7 +1521,7 @@ double HMM_and_HMM_ObservationSequence_getPerplexity (HMM me, HMM_ObservationSeq
 	return ce == NUMundefined ? NUMundefined : (ce == INFINITY ? INFINITY : pow (2, ce));
 }
 
-HMM HMM_createFromHMM_ObservationSequence (HMM_ObservationSequence me, long numberOfStates, int leftToRight) {
+autoHMM HMM_createFromHMM_ObservationSequence (HMM_ObservationSequence me, long numberOfStates, int leftToRight) {
 	try {
 		autoHMM thee = Thing_new (HMM);
 		autoStrings s = HMM_ObservationSequence_to_Strings (me);
@@ -1552,7 +1534,7 @@ HMM HMM_createFromHMM_ObservationSequence (HMM_ObservationSequence me, long numb
 		HMM_init (thee.peek(), numberOfStates, numberOfObservationSymbols, leftToRight);
 
 		for (long i = 1; i <= numberOfObservationSymbols; i++) {
-			const wchar_t *label = d -> rowLabels[i];
+			const char32 *label = d -> rowLabels[i];
 			autoHMM_Observation hmmo = HMM_Observation_create (label, 0, 0, 0);
 			HMM_addObservation (thee.peek(), hmmo.transfer());
 			if (thy notHidden) {
@@ -1566,77 +1548,77 @@ HMM HMM_createFromHMM_ObservationSequence (HMM_ObservationSequence me, long numb
 		HMM_setDefaultTransitionProbs (thee.peek());
 		HMM_setDefaultStartProbs (thee.peek());
 		HMM_setDefaultEmissionProbs (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no HMM created.");
+		Melder_throw (me, U": no HMM created.");
 	}
 }
 
-TableOfReal HMM_ObservationSequence_to_TableOfReal_transitions (HMM_ObservationSequence me, int probabilities) {
+autoTableOfReal HMM_ObservationSequence_to_TableOfReal_transitions (HMM_ObservationSequence me, int probabilities) {
 	try {
 		autoStrings thee = HMM_ObservationSequence_to_Strings (me);
 		autoTableOfReal him = Strings_to_TableOfReal_transitions (thee.peek(), probabilities);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no transitions created.");
+		Melder_throw (me, U": no transitions created.");
 	}
 }
 
-StringsIndex HMM_and_HMM_ObservationSequence_to_StringsIndex (HMM me, HMM_ObservationSequence thee) {
+autoStringsIndex HMM_and_HMM_ObservationSequence_to_StringsIndex (HMM me, HMM_ObservationSequence thee) {
 	try {
 		autoStrings classes = Thing_new (Strings);
-		classes -> strings = NUMvector<wchar_t *> (1, my numberOfObservationSymbols);
+		classes -> strings = NUMvector<char32 *> (1, my numberOfObservationSymbols);
 		for (long is = 1; is <= my numberOfObservationSymbols; is++) {
 			HMM_Observation hmmo = (HMM_Observation) my observationSymbols -> item[is];
-			classes -> strings[is] = Melder_wcsdup (hmmo -> label);
+			classes -> strings[is] = Melder_dup (hmmo -> label);
 			(classes -> numberOfStrings) ++;
 		}
 		autoStrings obs = HMM_ObservationSequence_to_Strings (thee);
 		autoStringsIndex him = Stringses_to_StringsIndex (obs.peek(), classes.peek());
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no StringsIndex created.");
+		Melder_throw (me, U": no StringsIndex created.");
 	}
 }
 
-StringsIndex HMM_and_HMM_StateSequence_to_StringsIndex (HMM me, HMM_StateSequence thee) {
+autoStringsIndex HMM_and_HMM_StateSequence_to_StringsIndex (HMM me, HMM_StateSequence thee) {
 	try {
 		autoStrings classes = Thing_new (Strings);
-		classes -> strings = NUMvector<wchar_t *> (1, my numberOfObservationSymbols);
+		classes -> strings = NUMvector<char32 *> (1, my numberOfObservationSymbols);
 		for (long is = 1; is <= my numberOfStates; is++) {
 			HMM_State hmms = (HMM_State) my states -> item[is];
-			classes -> strings[is] = Melder_wcsdup (hmms -> label);
+			classes -> strings[is] = Melder_dup (hmms -> label);
 			(classes -> numberOfStrings) ++;
 		}
 		autoStrings sts = HMM_StateSequence_to_Strings (thee);
 		autoStringsIndex him = Stringses_to_StringsIndex (sts.peek(), classes.peek());
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no StringsIndex created.");
+		Melder_throw (me, U": no StringsIndex created.");
 	}
 }
 
-TableOfReal HMM_and_HMM_ObservationSequence_to_TableOfReal_transitions (HMM me, HMM_ObservationSequence thee, int probabilities) {
+autoTableOfReal HMM_and_HMM_ObservationSequence_to_TableOfReal_transitions (HMM me, HMM_ObservationSequence thee, int probabilities) {
 	try {
 		autoStringsIndex si = HMM_and_HMM_ObservationSequence_to_StringsIndex (me, thee);
 		autoTableOfReal him = StringsIndex_to_TableOfReal_transitions (si.peek(), probabilities);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no transition table created for HMM_ObservationSequence.");
+		Melder_throw (me, U": no transition table created for HMM_ObservationSequence.");
 	}
 }
 
-TableOfReal HMM_and_HMM_StateSequence_to_TableOfReal_transitions (HMM me, HMM_StateSequence thee, int probabilities) {
+autoTableOfReal HMM_and_HMM_StateSequence_to_TableOfReal_transitions (HMM me, HMM_StateSequence thee, int probabilities) {
 	try {
 		autoStringsIndex si = HMM_and_HMM_StateSequence_to_StringsIndex (me, thee);
 		autoTableOfReal him = StringsIndex_to_TableOfReal_transitions (si.peek(), probabilities);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no transition table created for HMM_StateSequence.");
+		Melder_throw (me, U": no transition table created for HMM_StateSequence.");
 	}
 }
 
-TableOfReal StringsIndex_to_TableOfReal_transitions (StringsIndex me, int probabilities) {
+autoTableOfReal StringsIndex_to_TableOfReal_transitions (StringsIndex me, int probabilities) {
 	try {
 		long numberOfTypes = my classes -> size;
 
@@ -1678,19 +1660,19 @@ TableOfReal StringsIndex_to_TableOfReal_transitions (StringsIndex me, int probab
 				thy data[numberOfTypes + 1][i] /= sum;
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no transition table created.");
+		Melder_throw (me, U": no transition table created.");
 	}
 }
 
-TableOfReal Strings_to_TableOfReal_transitions (Strings me, int probabilities) {
+autoTableOfReal Strings_to_TableOfReal_transitions (Strings me, int probabilities) {
 	try {
 		autoStringsIndex him = Strings_to_StringsIndex (me);
 		autoTableOfReal thee = StringsIndex_to_TableOfReal_transitions (him.peek(), probabilities);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no transition table created.");
+		Melder_throw (me, U": no transition table created.");
 	}
 }
 
diff --git a/dwtools/HMM.h b/dwtools/HMM.h
index aadb1c4..e049f30 100644
--- a/dwtools/HMM.h
+++ b/dwtools/HMM.h
@@ -2,7 +2,7 @@
 #define _HMM_h_
 /* HMM.h
  *
- * Copyright (C) 2010-2011 David Weenink
+ * Copyright (C) 2010-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,12 +27,12 @@
 #include "Index.h"
 
 #include "HMM_def.h"
-oo_CLASS_CREATE (HMM_State, Data);
-oo_CLASS_CREATE (HMM_Observation, Data);
-oo_CLASS_CREATE (HMM_Viterbi, Data);
-oo_CLASS_CREATE (HMM, Data);
+oo_CLASS_CREATE (HMM_State, Daata);
+oo_CLASS_CREATE (HMM_Observation, Daata);
+oo_CLASS_CREATE (HMM_Viterbi, Daata);
+oo_CLASS_CREATE (HMM, Daata);
 
-Thing_define (HMM_BaumWelch, Data) {
+Thing_define (HMM_BaumWelch, Daata) {
 	// new data:
 	public:
 		long capacity;
@@ -63,45 +63,73 @@ Thing_define (HMM_ObservationSequence, Table) {
 Thing_define (HMM_ObservationSequences, Collection) {
 };
 
-HMM_ObservationSequence HMM_ObservationSequence_create (long numberOfItems, long dataLength);
+autoHMM_ObservationSequence HMM_ObservationSequence_create (long numberOfItems, long dataLength);
+
 void HMM_ObservationSequence_removeObservation (HMM_ObservationSequence me, long index);
-Strings HMM_ObservationSequence_to_Strings (HMM_ObservationSequence me);
-HMM_ObservationSequence Strings_to_HMM_ObservationSequence (Strings me);
-StringsIndex HMM_ObservationSequence_to_StringsIndex (HMM_ObservationSequence me);
-StringsIndex HMM_and_HMM_ObservationSequence_to_StringsIndex (HMM me, HMM_ObservationSequence thee);
-TableOfReal HMM_ObservationSequence_to_TableOfReal_transitions (HMM_ObservationSequence me, int probabilities);
-TableOfReal HMM_and_HMM_ObservationSequence_to_TableOfReal_transitions (HMM me, HMM_ObservationSequence thee, int probabilities);
-
-HMM_ObservationSequences HMM_ObservationSequences_create ();
+
+autoStrings HMM_ObservationSequence_to_Strings (HMM_ObservationSequence me);
+
+autoHMM_ObservationSequence Strings_to_HMM_ObservationSequence (Strings me);
+
+autoStringsIndex HMM_ObservationSequence_to_StringsIndex (HMM_ObservationSequence me);
+
+autoStringsIndex HMM_and_HMM_ObservationSequence_to_StringsIndex (HMM me, HMM_ObservationSequence thee);
+
+autoTableOfReal HMM_ObservationSequence_to_TableOfReal_transitions (HMM_ObservationSequence me, int probabilities);
+
+autoTableOfReal HMM_and_HMM_ObservationSequence_to_TableOfReal_transitions (HMM me, HMM_ObservationSequence thee, int probabilities);
+
+autoHMM_ObservationSequences HMM_ObservationSequences_create ();
+
 long HMM_ObservationSequence_getNumberOfObservations (HMM_ObservationSequence me);
+
 long HMM_ObservationSequences_getLongestSequence (HMM_ObservationSequences me);
 
-TableOfReal HMM_StateSequence_to_TableOfReal_transitions (HMM_StateSequence me);
-TableOfReal HMM_and_HMM_StateSequence_to_TableOfReal_transitions (HMM me, HMM_StateSequence thee, int probabilities);
-HMM_StateSequence HMM_StateSequence_create (long numberOfItems);
-Strings HMM_StateSequence_to_Strings (HMM_StateSequence me);
+autoTableOfReal HMM_StateSequence_to_TableOfReal_transitions (HMM_StateSequence me);
+
+autoTableOfReal HMM_and_HMM_StateSequence_to_TableOfReal_transitions (HMM me, HMM_StateSequence thee, int probabilities);
 
-void HMM_State_setLabel (HMM_State me, wchar_t *label);
+autoHMM_StateSequence HMM_StateSequence_create (long numberOfItems);
 
+autoStrings HMM_StateSequence_to_Strings (HMM_StateSequence me);
 
-HMM HMM_create (int leftToRight, long numberOfStates, long numberOfObservationSymbols);
-HMM HMM_createSimple (int leftToRight, const wchar_t *states_string, const wchar_t *symbols_string);
-HMM HMM_createContinuousModel (int leftToRight, long numberOfStates, long numberOfObservationSymbols,
+void HMM_State_setLabel (HMM_State me, char32 *label);
+
+
+autoHMM HMM_create (int leftToRight, long numberOfStates, long numberOfObservationSymbols);
+
+autoHMM HMM_createSimple (int leftToRight, const char32 *states_string, const char32 *symbols_string);
+
+autoHMM HMM_createContinuousModel (int leftToRight, long numberOfStates, long numberOfObservationSymbols,
 	long numberOfMixtureComponentsPerSymbol, long componentDimension, long componentStorage);
-HMM HMM_createFullContinuousModel (int leftToRight, long numberOfStates, long numberOfObservationSymbols,
+
+autoHMM HMM_createFullContinuousModel (int leftToRight, long numberOfStates, long numberOfObservationSymbols,
 	long numberOfFeatureStreams, long *dimensionOfStream, long *numberOfGaussiansforStream);
-HMM HMM_createFromHMM_ObservationSequence (HMM_ObservationSequence me, long numberOfStates, int leftToRight);
+
+autoHMM HMM_createFromHMM_ObservationSequence (HMM_ObservationSequence me, long numberOfStates, int leftToRight);
+
 void HMM_draw (HMM me, Graphics g, int garnish);
+
 void HMM_drawBackwardProbabilitiesIllustration (Graphics g, bool garnish);
+
 void HMM_drawForwardProbabilitiesIllustration (Graphics g, bool garnish);
+
 void HMM_drawForwardAndBackwardProbabilitiesIllustration (Graphics g, bool garnish);
+
 void HMM_addObservation (HMM me, thou);
+
 void HMM_addState (HMM me, thou);
+
 void HMM_setDefaultStates (HMM me);
+
 void HMM_setDefaultObservations (HMM me);
+
 void HMM_setDefaultTransitionProbs (HMM me);
+
 void HMM_setDefaultStartProbs (HMM me);
+
 void HMM_setDefaultEmissionProbs (HMM me);
+
 void HMM_setDefaultMixingProbabilities (HMM me);
 
 void HMM_unExpandPCA (HMM me);
@@ -112,35 +140,49 @@ void HMM_unExpandPCA (HMM me);
 /*
 	Set the probabilities. A probability zero value indicates that this p cannot be changed during training/learning.
 */
-void HMM_setTransitionProbabilities (HMM me, long state_number, wchar_t *state_probs);
-void HMM_setEmissionProbabilities (HMM me, long state_number, wchar_t *emission_probs);
-void HMM_setStartProbabilities (HMM me, wchar_t *probs);
+void HMM_setTransitionProbabilities (HMM me, long state_number, char32 *state_probs);
+
+void HMM_setEmissionProbabilities (HMM me, long state_number, char32 *emission_probs);
+
+void HMM_setStartProbabilities (HMM me, char32 *probs);
+
 
 double HMM_getProbabilityAtTimeBeingInState (HMM me, long itime, long istate);
+
 double HMM_getProbabilityAtTimeBeingInStateEmittingSymbol (HMM me, long itime, long istate, long isymbol);
+
 double HMM_getExpectedValueOfDurationInState (HMM me, long istate);
+
 double HMM_getProbabilityOfStayingInState (HMM me, long istate, long numberOfTimeUnits);
 
 double HMM_and_HMM_getCrossEntropy (HMM me, HMM thee, long observationLength, int symmetric);
+
 double HMM_and_HMM_and_HMM_ObservationSequence_getCrossEntropy (HMM me, HMM thee, HMM_ObservationSequence him);
 
+autoTableOfReal HMM_extractTransitionProbabilities (HMM me);
 
-TableOfReal HMM_extractTransitionProbabilities (HMM me);
-TableOfReal HMM_extractEmissionProbabilities (HMM me);
+autoTableOfReal HMM_extractEmissionProbabilities (HMM me);
 
 /* HMM & HMM_ObservationSequence ****/
 
-HMM_ObservationSequence HMM_to_HMM_ObservationSequence (HMM me, long initialState, long numberOfItems);
-HMM_StateSequence HMM_and_HMM_ObservationSequence_to_HMM_StateSequence (HMM me, HMM_ObservationSequence thee);
+autoHMM_ObservationSequence HMM_to_HMM_ObservationSequence (HMM me, long initialState, long numberOfItems);
+
+autoHMM_StateSequence HMM_and_HMM_ObservationSequence_to_HMM_StateSequence (HMM me, HMM_ObservationSequence thee);
+
 double HMM_and_HMM_StateSequence_getProbability (HMM me, HMM_StateSequence thee);
+
 void HMM_and_HMM_ObservationSequences_learn (HMM me, HMM_ObservationSequences thee, double delta_lnp, double minProb);
+
 void HMM_and_HMM_StateSequence_drawTrellis (HMM me, HMM_StateSequence thee, Graphics g, int connect, int garnish);
+
 double HMM_and_HMM_ObservationSequence_getProbability (HMM me, HMM_ObservationSequence thee);
+
 double HMM_and_HMM_ObservationSequence_getCrossEntropy (HMM me, HMM_ObservationSequence thee);
+
 double HMM_and_HMM_ObservationSequence_getPerplexity (HMM me, HMM_ObservationSequence thee);
 
 // somewhere else
 void MelderInfo_lnp (double logp);
-TableOfReal Strings_to_TableOfReal_transitions (Strings me, int probabilities);
+autoTableOfReal Strings_to_TableOfReal_transitions (Strings me, int probabilities);
 
 #endif /* _HMM_h_ */
diff --git a/dwtools/HMM_def.h b/dwtools/HMM_def.h
index 31dc083..6d3be79 100644
--- a/dwtools/HMM_def.h
+++ b/dwtools/HMM_def.h
@@ -24,7 +24,7 @@
 
 
 #define ooSTRUCT HMM_State
-oo_DEFINE_CLASS (HMM_State, Data)
+oo_DEFINE_CLASS (HMM_State, Daata)
 
 	oo_STRING(label)
 
@@ -33,7 +33,7 @@ oo_END_CLASS(HMM_State)
 
 
 #define ooSTRUCT HMM_Observation
-oo_DEFINE_CLASS (HMM_Observation, Data)
+oo_DEFINE_CLASS (HMM_Observation, Daata)
 
 	oo_STRING(label)
 	oo_OBJECT (GaussianMixture, 1, gm)
@@ -43,7 +43,7 @@ oo_END_CLASS(HMM_Observation)
 
 
 #define ooSTRUCT HMM
-oo_DEFINE_CLASS (HMM, Data)
+oo_DEFINE_CLASS (HMM, Daata)
 
 	oo_INT (notHidden) // to model a Markov model instead of HMM
 	oo_INT (leftToRight)
@@ -58,8 +58,8 @@ oo_DEFINE_CLASS (HMM, Data)
 	oo_OBJECT (Ordered, 1, observationSymbols)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS(HMM)
@@ -67,7 +67,7 @@ oo_END_CLASS(HMM)
 
 
 #define ooSTRUCT HMM_Viterbi
-oo_DEFINE_CLASS (HMM_Viterbi, Data)
+oo_DEFINE_CLASS (HMM_Viterbi, Daata)
 	oo_LONG (numberOfTimes)
 	oo_LONG (numberOfStates)
 	oo_DOUBLE (prob)
diff --git a/dwtools/ICA.cpp b/dwtools/ICA.cpp
index 15a2d4e..2583507 100644
--- a/dwtools/ICA.cpp
+++ b/dwtools/ICA.cpp
@@ -193,8 +193,8 @@ static void Diagonalizer_and_CrossCorrelationTables_ffdiag (Diagonalizer me, Cro
 			w[i][i] = 1;
 		}
 
-		autoMelderProgress progress (L"Simultaneous diagonalization of many CrossCorrelationTables...");
-		double dm_new = CrossCorrelationTables_getDiagonalityMeasure (ccts.peek(), NULL, 0, 0);
+		autoMelderProgress progress (U"Simultaneous diagonalization of many CrossCorrelationTables...");
+		double dm_new = CrossCorrelationTables_getDiagonalityMeasure (ccts.peek(), nullptr, 0, 0);
 		try {
 			double dm_old, theta = 1, dm_start = dm_new;
 			do {
@@ -256,13 +256,13 @@ static void Diagonalizer_and_CrossCorrelationTables_ffdiag (Diagonalizer me, Cro
 				}
 				dm_new = CrossCorrelationTables_getDiagonalityMeasure (ccts.peek(), 0, 0, 0);
 				iter++;
-				Melder_progress ((double) iter / (double) maxNumberOfIterations, L"Iteration: ", Melder_integer (iter), L", measure: ", Melder_double (dm_new), L"\n fractional measure: ", Melder_double (dm_new / dm_start));
+				Melder_progress ((double) iter / (double) maxNumberOfIterations, U"Iteration: ", iter, U", measure: ", dm_new, U"\n fractional measure: ", dm_new / dm_start);
 			} while (fabs ((dm_old - dm_new) / dm_new) > delta && iter < maxNumberOfIterations);
 		} catch (MelderError) {
 			Melder_clearError ();
 		}
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": no joint diagonalization (ffdiag).");
+		Melder_throw (me, U" & ", thee, U": no joint diagonalization (ffdiag).");
 	}
 }
 
@@ -328,7 +328,7 @@ static void Diagonalizer_and_CrossCorrelationTable_qdiag (Diagonalizer me, Cross
 		Eigen_initFromSymmetricMatrix (eigen.peek(), c0 -> data, dimension);
 		for (long i = 1; i <= dimension; i++) {
 			if (eigen -> eigenvalues[i] < 0) {
-				Melder_throw ("Covariance matrix not positive definite, eigenvalue[", Melder_integer(i), "] is negative.");
+				Melder_throw (U"Covariance matrix not positive definite, eigenvalue[", i, U"] is negative.");
 			}
 			double scalef = 1 / sqrt (eigen -> eigenvalues[i]);
 			for (long j = 1; j <= dimension; j++) {
@@ -363,7 +363,7 @@ static void Diagonalizer_and_CrossCorrelationTable_qdiag (Diagonalizer me, Cross
 		long iter = 0;
 		double delta_w;
 
-		autoMelderProgress progress (L"Simultaneous diagonalization of many CrossCorrelationTables...");
+		autoMelderProgress progress (U"Simultaneous diagonalization of many CrossCorrelationTables...");
 		try {
 			do {
 				// the standard diagonality measure is rather expensive to calculate so we compare the norms of
@@ -405,8 +405,7 @@ static void Diagonalizer_and_CrossCorrelationTable_qdiag (Diagonalizer me, Cross
 				}
 				iter++;
 
-				Melder_progress ((double) iter / (double) (maxNumberOfIterations + 1), L"Iteration: ", Melder_integer (iter), L", norm: ",
-					Melder_double (delta_w));
+				Melder_progress ((double) iter / (double) (maxNumberOfIterations + 1), U"Iteration: ", iter, U", norm: ", delta_w);
 			} while (delta_w > delta && iter < maxNumberOfIterations);
 		} catch (MelderError) {
 			Melder_clearError ();
@@ -422,7 +421,7 @@ static void Diagonalizer_and_CrossCorrelationTable_qdiag (Diagonalizer me, Cross
 	//	double dm = CrossCorrelationTables_and_Diagonalizer_getDiagonalityMeasure (thee, me, cweights, 1, thy size);
 
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": no joint diagonalization (qdiag).");
+		Melder_throw (me, U" & ", thee, U": no joint diagonalization (qdiag).");
 	}
 }
 
@@ -440,7 +439,7 @@ void MixingMatrix_and_CrossCorrelationTables_improveUnmixing (MixingMatrix me, C
  * 	lag >= 0
  */
 static void NUMcrossCorrelate_rows (double **x, long nrows, long icol1, long icol2, long lag, double **cc, double *centroid, double scale) {
-	lag = abs (lag);
+	lag = labs (lag);
 	long nsamples = icol2 - icol1 + 1 + lag;
 	for (long i = 1; i <= nrows; i++) {
 		double sum = 0;
@@ -471,7 +470,7 @@ CrossCorrelationTable Sound_to_CrossCorrelationTable (Sound me, double startTime
 			startTime = my xmin;
 			endTime = my xmax;
 		}
-		long lag = lagStep / my dx;
+		long lag = (long) floor (lagStep / my dx);   // ppgb: voor al dit soort dingen geldt: waarom afronden naar beneden?
 		long i1 = Sampled_xToNearestIndex (me, startTime);
 		if (i1 < 1) {
 			i1 = 1;
@@ -483,7 +482,7 @@ CrossCorrelationTable Sound_to_CrossCorrelationTable (Sound me, double startTime
 		i2 -= lag;
 		long nsamples = i2 - i1 + 1;
 		if (nsamples <= my ny) {
-			Melder_throw ("Not enough samples, choose a longer interval.");
+			Melder_throw (U"Not enough samples, choose a longer interval.");
 		}
 		autoCrossCorrelationTable thee = CrossCorrelationTable_create (my ny);
 
@@ -493,7 +492,7 @@ CrossCorrelationTable Sound_to_CrossCorrelationTable (Sound me, double startTime
 
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": CrossCorrelationTable not created.");
+		Melder_throw (me, U": CrossCorrelationTable not created.");
 	}
 }
 
@@ -504,13 +503,13 @@ CrossCorrelationTable Sound_to_CrossCorrelationTable (Sound me, double startTime
 CrossCorrelationTable Sounds_to_CrossCorrelationTable_combined (Sound me, Sound thee, double relativeStartTime, double relativeEndTime, double lagStep) {
 	try {
 		if (my dx != thy dx) {
-			Melder_throw ("Sampling frequencies must be equal.");
+			Melder_throw (U"Sampling frequencies must be equal.");
 		}
 		if (relativeEndTime <= relativeStartTime) {
 			relativeStartTime = my xmin;
 			relativeEndTime = my xmax;
 		}
-		long ndelta = lagStep / my dx, nchannels = my ny + thy ny;
+		long ndelta = (long) floor (lagStep / my dx), nchannels = my ny + thy ny;
 		long i1 = Sampled_xToNearestIndex (me, relativeStartTime);
 		if (i1 < 1) {
 			i1 = 1;
@@ -522,7 +521,7 @@ CrossCorrelationTable Sounds_to_CrossCorrelationTable_combined (Sound me, Sound
 		i2 -= ndelta;
 		long nsamples = i2 - i1 + 1;
 		if (nsamples <= nchannels) {
-			Melder_throw ("Not enough samples");
+			Melder_throw (U"Not enough samples");
 		}
 		autoCrossCorrelationTable him = CrossCorrelationTable_create (nchannels);
 		autoNUMvector<double *> data (1, nchannels);
@@ -539,7 +538,7 @@ CrossCorrelationTable Sounds_to_CrossCorrelationTable_combined (Sound me, Sound
 
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": CrossCorrelationTable not created.");
+		Melder_throw (me, U": CrossCorrelationTable not created.");
 	}
 }
 
@@ -551,7 +550,7 @@ Covariance Sound_to_Covariance_channels (Sound me, double startTime, double endT
         thy structCrossCorrelationTable :: v_copy (him.peek());
         return him.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": no Covariance created.");
+        Melder_throw (me, U": no Covariance created.");
     }
 }
 
@@ -565,7 +564,7 @@ CrossCorrelationTables Sound_to_CrossCorrelationTables (Sound me, double startTi
 			endTime = my xmax;
 		}
 		if (startTime + ncovars * lagStep >= endTime) {
-			Melder_throw ("Lag time too large.");
+			Melder_throw (U"Lag time too large.");
 		}
 		autoCrossCorrelationTables thee = CrossCorrelationTables_create ();
 		for (long i = 1; i <= ncovars; i++) {
@@ -575,7 +574,7 @@ CrossCorrelationTables Sound_to_CrossCorrelationTables (Sound me, double startTi
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no CrossCorrelationTables created.");
+		Melder_throw (me, U": no CrossCorrelationTables created.");
 	}
 }
 
@@ -585,7 +584,7 @@ Sound Sound_to_Sound_BSS (Sound me, double startTime, double endTime, long ncova
 		autoSound thee = Sound_and_MixingMatrix_unmix (me, him.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not separated.");
+		Melder_throw (me, U": not separated.");
 	}
 }
 
@@ -602,7 +601,7 @@ Diagonalizer Diagonalizer_create (long dimension) {
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Diagonalizer not created.");
+		Melder_throw (U"Diagonalizer not created.");
 	}
 }
 
@@ -618,15 +617,15 @@ MixingMatrix MixingMatrix_create (long numberOfChannels, long numberOfComponents
 		MixingMatrix_initializeRandom (me.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("MixingMatrix not created.");
+		Melder_throw (U"MixingMatrix not created.");
 	}
 }
 
-MixingMatrix MixingMatrix_createSimple (long numberOfChannels, long numberOfComponents, wchar_t *elements) {
+MixingMatrix MixingMatrix_createSimple (long numberOfChannels, long numberOfComponents, char32 *elements) {
 	try {
 		long inum = 1, ntokens = Melder_countTokens (elements);
 		if (ntokens == 0) {
-			Melder_throw ("No matrix elements.");
+			Melder_throw (U"No matrix elements.");
 		}
 		long nwanted = numberOfChannels * numberOfComponents;
 
@@ -634,7 +633,7 @@ MixingMatrix MixingMatrix_createSimple (long numberOfChannels, long numberOfComp
 
 		// Construct the full matrix from the elements
 		double number;
-		for (wchar_t *token = Melder_firstToken (elements); token != NULL && inum <= ntokens; token = Melder_nextToken (), inum++) {
+		for (char32 *token = Melder_firstToken (elements); token != nullptr && inum <= ntokens; token = Melder_nextToken (), inum++) {
 			long irow = (inum - 1) / numberOfComponents + 1;
 			long icol = (inum - 1) % numberOfComponents + 1;
 			Interpreter_numericExpression (0, token, &number);
@@ -650,7 +649,7 @@ MixingMatrix MixingMatrix_createSimple (long numberOfChannels, long numberOfComp
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("MixingMatrix not created.");
+		Melder_throw (U"MixingMatrix not created.");
 	}
 }
 
@@ -668,13 +667,13 @@ void MixingMatrix_initializeRandom (MixingMatrix me) {
 Diagonalizer MixingMatrix_to_Diagonalizer (MixingMatrix me) {
 	try {
 		if (my numberOfRows != my numberOfColumns) {
-			Melder_throw ("The number of channels and the number of components must be equal.");
+			Melder_throw (U"The number of channels and the number of components must be equal.");
 		}
 		autoDiagonalizer thee = Diagonalizer_create (my numberOfRows);
 		NUMpseudoInverse (my data, my numberOfRows, my numberOfColumns, thy data, 0);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Diagonalizer created.");
+		Melder_throw (me, U": no Diagonalizer created.");
 	}
 }
 
@@ -684,7 +683,7 @@ MixingMatrix Diagonalizer_to_MixingMatrix (Diagonalizer me) {
 		NUMpseudoInverse (my data, my numberOfRows, my numberOfColumns, thy data, 0);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MixingMatrix created.");
+		Melder_throw (me, U": no MixingMatrix created.");
 	}
 }
 
@@ -693,7 +692,7 @@ MixingMatrix Diagonalizer_to_MixingMatrix (Diagonalizer me) {
 Sound Sound_and_MixingMatrix_mix (Sound me, MixingMatrix thee) {
 	try {
 		if (my ny != thy numberOfColumns) {
-			Melder_throw ("The number of components in the MixingMatrix and the number of channels in the Sound must be equal.");
+			Melder_throw (U"The number of components in the MixingMatrix and the number of channels in the Sound must be equal.");
 		}
 		autoSound him = Sound_create (thy numberOfRows, my xmin, my xmax, my nx, my dx, my x1);
 		for (long i = 1; i <= thy numberOfRows; i++) {
@@ -707,14 +706,14 @@ Sound Sound_and_MixingMatrix_mix (Sound me, MixingMatrix thee) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not mixed.");
+		Melder_throw (me, U": not mixed.");
 	}
 }
 
 Sound Sound_and_MixingMatrix_unmix (Sound me, MixingMatrix thee) {
 	try {
 		if (my ny != thy numberOfRows) {
-			Melder_throw ("The MixingMatrix and the Sound must have the same number of channels.");
+			Melder_throw (U"The MixingMatrix and the Sound must have the same number of channels.");
 		}
 
 		autoNUMmatrix<double> minv (1, thy numberOfColumns, 1, thy numberOfRows);
@@ -731,7 +730,7 @@ Sound Sound_and_MixingMatrix_unmix (Sound me, MixingMatrix thee) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not unmixed.");
+		Melder_throw (me, U": not unmixed.");
 	}
 }
 
@@ -742,20 +741,20 @@ MixingMatrix Sound_to_MixingMatrix (Sound me, double startTime, double endTime,
 		MixingMatrix_and_CrossCorrelationTables_improveUnmixing (thee.peek(), ccs.peek(), maxNumberOfIterations, tol, method);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MixingMatrix created.");
+		Melder_throw (me, U": no MixingMatrix created.");
 	}
 }
 
 MixingMatrix TableOfReal_to_MixingMatrix (TableOfReal me) {
 	try {
 		if (my numberOfColumns != my numberOfRows) {
-			Melder_throw ("Number of rows and columns must be equal.");
+			Melder_throw (U"Number of rows and columns must be equal.");
 		}
 		autoMixingMatrix thee = Thing_new (MixingMatrix);
 		my structTableOfReal :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to MixingMatrix.");
+		Melder_throw (me, U": not converted to MixingMatrix.");
 	}
 }
 
@@ -766,7 +765,7 @@ Thing_implement (CrossCorrelationTable, SSCP, 0);
 void structCrossCorrelationTable :: v_info () {
 	structSSCP :: v_info ();
 	double dm = CrossCorrelationTable_getDiagonalityMeasure (this);
-	MelderInfo_writeLine (L"Diagonality measure: ", Melder_double (dm));
+	MelderInfo_writeLine (U"Diagonality measure: ", dm);
 }
 
 CrossCorrelationTable CrossCorrelationTable_create (long dimension) {
@@ -775,30 +774,30 @@ CrossCorrelationTable CrossCorrelationTable_create (long dimension) {
 		SSCP_init (me.peek(), dimension, dimension);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("CrossCorrelationTable not created.");
+		Melder_throw (U"CrossCorrelationTable not created.");
 	}
 }
 
-CrossCorrelationTable CrossCorrelationTable_createSimple (wchar_t *covars, wchar_t *centroid, long numberOfSamples) {
+CrossCorrelationTable CrossCorrelationTable_createSimple (char32 *covars, char32 *centroid, long numberOfSamples) {
 	try {
 		long dimension = Melder_countTokens (centroid);
 		long ncovars = Melder_countTokens (covars);
 		long ncovars_wanted = dimension * (dimension + 1) / 2;
-		if (ncovars != ncovars_wanted) Melder_throw ("The number of matrix elements and the number of "
-			        "centroid elements are not in concordance. There should be \"d(d+1)/2\" matrix values and \"d\" centroid values.");
+		if (ncovars != ncovars_wanted) Melder_throw (U"The number of matrix elements and the number of "
+			        U"centroid elements are not in concordance. There should be \"d(d+1)/2\" matrix values and \"d\" centroid values.");
 
 		autoCrossCorrelationTable me = CrossCorrelationTable_create (dimension);
 
 		// Construct the full matrix from the upper-diagonal elements
 
 		long inum = 1, irow = 1;
-		for (wchar_t *token = Melder_firstToken (covars); token != NULL && inum <= ncovars_wanted; token = Melder_nextToken (), inum++) {
+		for (char32 *token = Melder_firstToken (covars); token != nullptr && inum <= ncovars_wanted; token = Melder_nextToken (), inum++) {
 			double number;
 			long nmissing = (irow - 1) * irow / 2;
 			long inumc = inum + nmissing;
 			irow = (inumc - 1) / dimension + 1;
 			long icol = ( (inumc - 1) % dimension) + 1;
-			Interpreter_numericExpression (NULL, token, &number);
+			Interpreter_numericExpression (nullptr, token, &number);
 			my data[irow][icol] = my data[icol][irow] = number;
 			if (icol == dimension) {
 				irow++;
@@ -806,15 +805,15 @@ CrossCorrelationTable CrossCorrelationTable_createSimple (wchar_t *covars, wchar
 		}
 
 		inum = 1;
-		for (wchar_t *token = Melder_firstToken (centroid); token != NULL && inum <= dimension; token = Melder_nextToken (), inum++) {
+		for (char32 *token = Melder_firstToken (centroid); token != nullptr && inum <= dimension; token = Melder_nextToken (), inum++) {
 			double number;
-			Interpreter_numericExpression (NULL, token, &number);
+			Interpreter_numericExpression (nullptr, token, &number);
 			my centroid[inum] = number;
 		}
 		my numberOfObservations = numberOfSamples;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("CrossCorrelationTable not created.");
+		Melder_throw (U"CrossCorrelationTable not created.");
 	}
 }
 
@@ -827,10 +826,10 @@ double CrossCorrelationTable_getDiagonalityMeasure (CrossCorrelationTable me) {
 void structCrossCorrelationTables :: v_info () {
 	structOrdered :: v_info ();
 	CrossCorrelationTable thee = (CrossCorrelationTable) item[1];
-	MelderInfo_writeLine (L"  Number of rows and columns: ", Melder_integer (thy numberOfRows));
+	MelderInfo_writeLine (U"  Number of rows and columns: ", thy numberOfRows);
 	for (long i = 1; i <= size; i++) {
 		double dm = CrossCorrelationTable_getDiagonalityMeasure ( (CrossCorrelationTable) item[i]);
-		MelderInfo_writeLine (L"Diagonality measure for item ", Melder_integer (i), L": ", Melder_double (dm));
+		MelderInfo_writeLine (U"Diagonality measure for item ", i, U": ", dm);
 	}
 }
 
@@ -842,7 +841,7 @@ CrossCorrelationTables CrossCorrelationTables_create () {
 		Ordered_init (me.peek(), classCrossCorrelationTable, 30);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("CrossCorrelationTables not created.");
+		Melder_throw (U"CrossCorrelationTables not created.");
 	}
 }
 
@@ -858,12 +857,12 @@ double CrossCorrelationTables_getDiagonalityMeasure (CrossCorrelationTables me,
 		end = my size;
 	}
 	long ntables = end - start + 1;
-	long dimension = ( (Covariance) (my item[1]))-> numberOfColumns;
+	long dimension = ((Covariance) my item[1]) -> numberOfColumns;
 	double dmsq = 0;
 	for (long k = start; k <= end; k++) {
 		CrossCorrelationTable thee = (CrossCorrelationTable) my item[k];
 		double dmksq = NUMdmatrix_diagonalityMeasure (thy data, dimension);
-		dmsq += w == NULL ? dmksq / ntables : dmksq * w[k];
+		dmsq += ( w ? dmksq * w[k] : dmksq / ntables );
 	}
 	return dmsq;
 }
@@ -879,13 +878,13 @@ double CrossCorrelationTables_and_Diagonalizer_getDiagonalityMeasure (CrossCorre
 CrossCorrelationTable CrossCorrelationTable_and_Diagonalizer_diagonalize (CrossCorrelationTable me, Diagonalizer thee) {
 	try {
 		if (my numberOfRows != thy numberOfRows) {
-			Melder_throw ("The CrossCorrelationTable and the Diagonalizer matrix dimensions must be equal.");
+			Melder_throw (U"The CrossCorrelationTable and the Diagonalizer matrix dimensions must be equal.");
 		}
 		autoCrossCorrelationTable him = CrossCorrelationTable_create (my numberOfColumns);
 		NUMdmatrices_multiply_VCVp (his data, thy data, my numberOfColumns, my numberOfColumns, my data, 1);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("CrossCorrelationTable not diagonalized.");
+		Melder_throw (U"CrossCorrelationTable not diagonalized.");
 	}
 }
 
@@ -899,7 +898,7 @@ CrossCorrelationTables CrossCorrelationTables_and_Diagonalizer_diagonalize (Cros
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("CrossCorrelationTables not diagonalized.");
+		Melder_throw (U"CrossCorrelationTables not diagonalized.");
 	}
 }
 
@@ -910,7 +909,7 @@ Diagonalizer CrossCorrelationTables_to_Diagonalizer (CrossCorrelationTables me,
 		Diagonalizer_and_CrossCorrelationTables_improveDiagonality (thee.peek(), me, maxNumberOfIterations, tol, method);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Diagonalizer not created from CrossCorrelationTables.");
+		Melder_throw (U"Diagonalizer not created from CrossCorrelationTables.");
 	};
 }
 
@@ -932,7 +931,7 @@ Sound Sound_whitenChannels (Sound me, double varianceFraction) {
         autoSound thee = Sound_and_Covariance_whitenChannels (me, cov.peek(), varianceFraction);
         return thee.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": not whitened.");
+        Melder_throw (me, U": not whitened.");
     }
 }
 
@@ -943,7 +942,7 @@ Sound Sound_and_Covariance_whitenChannels (Sound me, Covariance thee, double var
         autoSound him = Sound_and_PCA_whitenChannels (me, pca.peek(), numberOfComponents);
         return him.transfer ();
     } catch (MelderError) {
-        Melder_throw (me, ": not whitened from ", thee);
+        Melder_throw (me, U": not whitened from ", thee);
     }
 }
 
@@ -991,7 +990,7 @@ CrossCorrelationTables CrossCorrelationTables_createTestSet (long dimension, lon
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("CrossCorrelationTables test set not created.");
+		Melder_throw (U"CrossCorrelationTables test set not created.");
 	}
 }
 
@@ -1001,14 +1000,14 @@ static void Sound_and_MixingMatrix_improveUnmixing_fica (Sound me, MixingMatrix
 	try {
 		long iter = 0;
 		if (my ny != thy numberOfColumns) {
-			Melder_throw ("Dimensions do not agree.");
+			Melder_throw (U"Dimensions do not agree.");
 		}
 		autoNUMmatrix<double> x (NUMmatrix_copy (my z, 1, my ny, 1, my nx), 1, 1);
 		do {
 			iter++;
 		} while (/*fabs((dm_old - dm_new) / dm_new) > tol &&*/ iter < maxNumberOfIterations);
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, " .");
+		Melder_throw (me, U" & ", thee, U" .");
 	}
 }
 /* End of file ICA.cpp 987*/
diff --git a/dwtools/ICA.h b/dwtools/ICA.h
index 70b79d2..f0d2f91 100644
--- a/dwtools/ICA.h
+++ b/dwtools/ICA.h
@@ -34,15 +34,13 @@ Thing_define (Diagonalizer, TableOfReal) {
 };
 
 Thing_define (CrossCorrelationTable, SSCP) {
-	// overridden methods:
-	public:
-		virtual void v_info ();
+	void v_info ()
+		override;
 };
 
 Thing_define (CrossCorrelationTables, Ordered) {
-	// overridden methods:
-	public:
-		virtual void v_info ();
+	void v_info ()
+		override;
 };
 
 /*
@@ -58,7 +56,7 @@ Thing_define (CrossCorrelationTables, Ordered) {
 	  in general not the case for cross-correlations.
 */
 CrossCorrelationTable CrossCorrelationTable_create (long dimension);
-CrossCorrelationTable CrossCorrelationTable_createSimple (wchar_t *covars, wchar_t *centroid, long numberOfSamples);
+CrossCorrelationTable CrossCorrelationTable_createSimple (char32 *covars, char32 *centroid, long numberOfSamples);
 
 /* (sum(i,j=1..dimension, i!=j; C[i][j]^2))/(dimension*(dimension-1)) */
 double CrossCorrelationTable_getDiagonalityMeasure (CrossCorrelationTable me);
@@ -70,7 +68,7 @@ double CrossCorrelationTables_and_Diagonalizer_getDiagonalityMeasure (CrossCorre
 CrossCorrelationTables CrossCorrelationTables_createTestSet (long dimension, long n, int firstPositiveDefinite, double sigma);
 
 MixingMatrix MixingMatrix_create (long numberOfChannels, long numberOfComponents);
-MixingMatrix MixingMatrix_createSimple (long numberOfChannels, long numberOfComponents, wchar_t *elements);
+MixingMatrix MixingMatrix_createSimple (long numberOfChannels, long numberOfComponents, char32 *elements);
 void MixingMatrix_initializeRandom (MixingMatrix me);
 
 Diagonalizer Diagonalizer_create (long dimension);
diff --git a/dwtools/Intensity_extensions.cpp b/dwtools/Intensity_extensions.cpp
index e0b8074..e6c4fce 100644
--- a/dwtools/Intensity_extensions.cpp
+++ b/dwtools/Intensity_extensions.cpp
@@ -27,9 +27,9 @@
 #include "Intensity_extensions.h"
 #include "TextGrid_extensions.h"
 
-static void IntervalTier_addBoundaryUnsorted (IntervalTier me, long iinterval, double time, const wchar_t *leftLabel) {
+static void IntervalTier_addBoundaryUnsorted (IntervalTier me, long iinterval, double time, const char32 *leftLabel) {
 	if (time <= my xmin || time >= my xmax) {
-		Melder_throw ("Time is outside interval.");
+		Melder_throw (U"Time is outside interval.");
 	}
 
 	// Find interval to split
@@ -42,20 +42,20 @@ static void IntervalTier_addBoundaryUnsorted (IntervalTier me, long iinterval, d
 	ti -> xmax = time;
 	TextInterval_setText (ti, leftLabel);
 
-	autoTextInterval ti_new = TextInterval_create (time, my xmax, L"");
+	autoTextInterval ti_new = TextInterval_create (time, my xmax, U"");
 	Sorted_addItem_unsorted (my intervals, ti_new.transfer());
 }
 
 TextGrid Intensity_to_TextGrid_detectSilences (Intensity me, double silenceThreshold_dB,
-		double minSilenceDuration, double minSoundingDuration, const wchar_t *silenceLabel, const wchar_t *soundingLabel) {
+		double minSilenceDuration, double minSoundingDuration, const char32 *silenceLabel, const char32 *soundingLabel) {
 	try {
 		double duration = my xmax - my xmin, time;
 
 		if (silenceThreshold_dB >= 0) {
-			Melder_throw ("The silence threshold w.r.t. the maximum intensity should be a negative number.");
+			Melder_throw (U"The silence threshold w.r.t. the maximum intensity should be a negative number.");
 		}
 
-		autoTextGrid thee = TextGrid_create (my xmin, my xmax, L"silences", L"");
+		autoTextGrid thee = TextGrid_create (my xmin, my xmax, U"silences", U"");
 		IntervalTier it = (IntervalTier) thy tiers -> item[1];
 		TextInterval_setText ( (TextInterval) it -> intervals -> item[1], soundingLabel);
 		if (minSilenceDuration > duration) {
@@ -67,8 +67,8 @@ TextGrid Intensity_to_TextGrid_detectSilences (Intensity me, double silenceThres
 		Vector_getMinimumAndX (me, 0, 0, 1, NUM_PEAK_INTERPOLATE_PARABOLIC, &intensity_min_db, &xOfMinimum);
 		double intensity_dbRange = intensity_max_db - intensity_min_db;
 
-		if (intensity_dbRange < 10) Melder_warning (L"The loudest and softest part in your sound only differ by ",
-			        Melder_double (intensity_dbRange), L" dB.");
+		if (intensity_dbRange < 10) Melder_warning (U"The loudest and softest part in your sound only differ by ",
+			        intensity_dbRange, U" dB.");
 
 		double intensityThreshold = intensity_max_db - fabs (silenceThreshold_dB);
 
@@ -78,7 +78,7 @@ TextGrid Intensity_to_TextGrid_detectSilences (Intensity me, double silenceThres
 
 		int inSilenceInterval = my z[1][1] < intensityThreshold;
 		long iinterval = 1;
-		const wchar_t *label;
+		const char32 *label;
 		for (long i = 2; i <= my nx; i++) {
 			int addBoundary = 0;
 			if (my z[1][i] < intensityThreshold) {
@@ -120,13 +120,13 @@ TextGrid Intensity_to_TextGrid_detectSilences (Intensity me, double silenceThres
 
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": TextGrid not created.");
+		Melder_throw (me, U": TextGrid not created.");
 	}
 }
 
 Intensity IntensityTier_to_Intensity (IntensityTier me, double dt) {
 	try {
-		long nt = (my xmax - my xmin) / dt;
+		long nt = (long) floor ((my xmax - my xmin) / dt);
 		double t1 = 0.5 * dt;
 		autoIntensity thee = Intensity_create (my xmin, my xmax, nt, dt, t1);
 		for (long i = 1; i <= nt; i++) {
@@ -135,18 +135,18 @@ Intensity IntensityTier_to_Intensity (IntensityTier me, double dt) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " no Intensity created.");
+		Melder_throw (me, U" no Intensity created.");
 	}
 }
 
 TextGrid IntensityTier_to_TextGrid_detectSilences (IntensityTier me, double dt, double silenceThreshold_dB, double minSilenceDuration,
-	double minSoundingDuration, const wchar_t *silenceLabel, const wchar_t *soundingLabel) {
+	double minSoundingDuration, const char32 *silenceLabel, const char32 *soundingLabel) {
 	try {
 		autoIntensity intensity = IntensityTier_to_Intensity (me, dt);
 		autoTextGrid thee = Intensity_to_TextGrid_detectSilences (intensity.peek(), silenceThreshold_dB, minSilenceDuration, minSoundingDuration, silenceLabel, soundingLabel);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " no TextGrid created.");
+		Melder_throw (me, U" no TextGrid created.");
 	}
 }
 
diff --git a/dwtools/Intensity_extensions.h b/dwtools/Intensity_extensions.h
index 50e4b0b..3a2d99a 100644
--- a/dwtools/Intensity_extensions.h
+++ b/dwtools/Intensity_extensions.h
@@ -30,7 +30,7 @@
 #include "TextGrid.h"
 
 TextGrid Intensity_to_TextGrid_detectSilences (Intensity me, double silenceThreshold_dB, double minSilenceDuration,
-	double minSoundingDuration, const wchar_t *silenceLabel, const wchar_t *soundingLabel);
+	double minSoundingDuration, const char32 *silenceLabel, const char32 *soundingLabel);
 /*
 	Marks "silence" intervals in a sound as intervals in a TextGrid.
 	silenceThreshold_dB: silence-to-speech and speech-to-silence threshold as dB's below maximum intensity
@@ -45,6 +45,6 @@ TextGrid Intensity_to_TextGrid_detectSilences (Intensity me, double silenceThres
 Intensity IntensityTier_to_Intensity (IntensityTier me, double dt);
 
 TextGrid IntensityTier_to_TextGrid_detectSilences (IntensityTier me, double dt, double silenceThreshold_dB, double minSilenceDuration,
-	double minSoundingDuration, const wchar_t *silenceLabel, const wchar_t *soundingLabel);
+	double minSoundingDuration, const char32 *silenceLabel, const char32 *soundingLabel);
 
 #endif /* _Intensity_extensions_h_ */
diff --git a/dwtools/KlattGrid.cpp b/dwtools/KlattGrid.cpp
index db9b269..8f8f718 100644
--- a/dwtools/KlattGrid.cpp
+++ b/dwtools/KlattGrid.cpp
@@ -86,15 +86,15 @@
 
 // Prototypes
 
-PointProcess PitchTier_to_PointProcess_flutter (PitchTier pitch, RealTier flutter, double maximumPeriod);
+autoPointProcess PitchTier_to_PointProcess_flutter (PitchTier pitch, RealTier flutter, double maximumPeriod);
 
 void _Sound_FormantGrid_filterWithOneFormant_inline (Sound me, thou, long iformant, int antiformant);
 
-Sound Sound_VocalTractGrid_CouplingGrid_filter_parallel (Sound me, VocalTractGrid thee, CouplingGrid coupling);
+autoSound Sound_VocalTractGrid_CouplingGrid_filter_parallel (Sound me, VocalTractGrid thee, CouplingGrid coupling);
 
-Sound PhonationGrid_PhonationTier_to_Sound_voiced (PhonationGrid me, PhonationTier thee, double samplingFrequency);
+autoSound PhonationGrid_PhonationTier_to_Sound_voiced (PhonationGrid me, PhonationTier thee, double samplingFrequency);
 
-Sound KlattGrid_to_Sound_aspiration (KlattGrid me, double samplingFrequency);
+autoSound KlattGrid_to_Sound_aspiration (KlattGrid me, double samplingFrequency);
 
 #undef MIN
 #undef MAX
@@ -262,7 +262,7 @@ static RealTier RealTier_updateWithDelta (RealTier me, RealTier delta, Phonation
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not updated with delta.");
+		Melder_throw (me, U": not updated with delta.");
 	}
 }
 
@@ -297,8 +297,8 @@ static void check_formants (long numberOfFormants, long *ifb, long *ife) {
 	}
 }
 
-static Sound Sound_createEmptyMono (double xmin, double xmax, double samplingFrequency) {
-	long nt = ceil ( (xmax - xmin) * samplingFrequency);
+static autoSound Sound_createEmptyMono (double xmin, double xmax, double samplingFrequency) {
+	long nt = (long) ceil ( (xmax - xmin) * samplingFrequency);
 	double dt = 1.0 / samplingFrequency;
 	double tmid = (xmin + xmax) / 2;
 	double t1 = tmid - 0.5 * (nt - 1) * dt;
@@ -312,7 +312,7 @@ static void _Sounds_add_inline (Sound me, Sound thee) {
 	}
 }
 
-static Sound _Sound_diff (Sound me, int scale) {
+static autoSound _Sound_diff (Sound me, int scale) {
 	try {
 		autoSound thee = Data_copy (me);
 
@@ -344,9 +344,9 @@ static Sound _Sound_diff (Sound me, int scale) {
 				thy z[1][i] *= amax1 / amax2;
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not differenced.");
+		Melder_throw (me, U": not differenced.");
 	}
 }
 
@@ -367,7 +367,7 @@ typedef struct structconnections {
 } *connections;
 
 static void connections_free (connections me) {
-	if (me == NULL) {
+	if (! me) {
 		return;
 	}
 	NUMvector_free (my x, 1);
@@ -385,7 +385,7 @@ static connections connections_create (long numberOfConnections) {
 		return me;
 	} catch (MelderError) {
 		connections_free (me);
-		Melder_throw ("Connections not created.");
+		Melder_throw (U"Connections not created.");
 	}
 }
 
@@ -450,7 +450,7 @@ static void alternatingSummer_drawConnections (Graphics g, double x, double y, d
 }
 
 static void draw_oneSection (Graphics g, double xmin, double xmax, double ymin, double ymax,
-                             const wchar_t *line1, const wchar_t *line2, const wchar_t *line3) {
+                             const char32 *line1, const char32 *line2, const char32 *line3) {
 	long numberOfTextLines = 0, iline = 0;
 	Graphics_rectangle (g, xmin, xmax, ymin, ymax);
 	if (line1 != 0) {
@@ -467,17 +467,17 @@ static void draw_oneSection (Graphics g, double xmin, double xmax, double ymin,
 	if (line1 != 0) {
 		iline++;
 		y -= dy - (numberOfTextLines == 2 ? ddy : 0); // extra spacing for two lines
-		Graphics_text1 (g, x, y, line1);
+		Graphics_text (g, x, y, line1);
 	}
 	if (line2 != 0) {
 		iline++;
 		y -= dy - (numberOfTextLines == 2 ? (iline == 1 ? ddy : -iline * ddy) : 0);
-		Graphics_text1 (g, x, y, line2);
+		Graphics_text (g, x, y, line2);
 	}
 	if (line3 != 0) {
 		iline++;
 		y -= dy - (numberOfTextLines == 2 ? -iline * ddy : 0);
-		Graphics_text1 (g, x, y, line3);
+		Graphics_text (g, x, y, line3);
 	}
 }
 
@@ -488,9 +488,9 @@ static void draw_oneSection (Graphics g, double xmin, double xmax, double ymin,
 
 /********************* PhonationTier ************************/
 
-Thing_implement (PhonationPoint, Data, 0);
+Thing_implement (PhonationPoint, Daata, 0);
 
-PhonationPoint PhonationPoint_create (double time, double period, double openPhase, double collisionPhase, double te,
+autoPhonationPoint PhonationPoint_create (double time, double period, double openPhase, double collisionPhase, double te,
                                       double power1, double power2, double pulseScale) {
 	try {
 		autoPhonationPoint me = Thing_new (PhonationPoint);
@@ -501,24 +501,24 @@ PhonationPoint PhonationPoint_create (double time, double period, double openPha
 		my pulseScale = pulseScale;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("PhonationPoint not created.");
+		Melder_throw (U"PhonationPoint not created.");
 	}
 }
 
 Thing_implement (PhonationTier, Function, 0);
 
-PhonationTier PhonationTier_create (double tmin, double tmax) {
+autoPhonationTier PhonationTier_create (double tmin, double tmax) {
 	try {
 		autoPhonationTier me = Thing_new (PhonationTier);
 		Function_init (me.peek(), tmin, tmax);
 		my points = SortedSetOfDouble_create ();
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("PhonationTier not created.");
+		Melder_throw (U"PhonationTier not created.");
 	}
 }
 
-PointProcess PhonationTier_to_PointProcess_closures (PhonationTier me) {
+autoPointProcess PhonationTier_to_PointProcess_closures (PhonationTier me) {
 	try {
 		long nt = my points -> size;
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, nt);
@@ -526,15 +526,15 @@ PointProcess PhonationTier_to_PointProcess_closures (PhonationTier me) {
 			PhonationPoint fp = (PhonationPoint) my points -> item[ip];
 			PointProcess_addPoint (thee.peek(), fp -> time);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no PointProcess with closure times created.");
+		Melder_throw (me, U": no PointProcess with closure times created.");
 	}
 }
 
 /********************** PhonationGridPlayOptions **********************/
 
-Thing_implement (PhonationGridPlayOptions, Data, 0);
+Thing_implement (PhonationGridPlayOptions, Daata, 0);
 
 static void PhonationGridPlayOptions_setDefaults (PhonationGridPlayOptions me) {
 	my flowDerivative = my voicing = 1;
@@ -545,12 +545,12 @@ static void PhonationGridPlayOptions_setDefaults (PhonationGridPlayOptions me) {
 	my maximumPeriod = 0;
 }
 
-PhonationGridPlayOptions PhonationGridPlayOptions_create () {
+autoPhonationGridPlayOptions PhonationGridPlayOptions_create () {
 	try {
 		autoPhonationGridPlayOptions me = Thing_new (PhonationGridPlayOptions);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("PhonationGridPlayOptions not created.");
+		Melder_throw (U"PhonationGridPlayOptions not created.");
 	}
 }
 
@@ -560,60 +560,60 @@ PhonationGridPlayOptions PhonationGridPlayOptions_create () {
 Thing_implement (PhonationGrid, Function, 0);
 
 void structPhonationGrid :: v_info () {
-	structData :: v_info ();
-	const wchar_t *in1 = L"  ", *in2 = L"    ";
-	MelderInfo_writeLine (in1, L"Time domain:");
-	MelderInfo_writeLine (in2, L"Start time:     ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (in2, L"End time:       ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (in2, L"Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (in1, L"\nNumber of points in the PHONATION tiers:");
-	MelderInfo_writeLine (in2, L"pitch:               ", Melder_integer (pitch -> points -> size));
-	MelderInfo_writeLine (in2, L"voicingAmplitude:    ", Melder_integer (voicingAmplitude -> points -> size));
-	MelderInfo_writeLine (in2, L"openPhase:           ", Melder_integer (openPhase -> points -> size));
-	MelderInfo_writeLine (in2, L"collisionPhase:      ", Melder_integer (collisionPhase -> points -> size));
-	MelderInfo_writeLine (in2, L"power1:              ", Melder_integer (power1 -> points -> size));
-	MelderInfo_writeLine (in2, L"power2:              ", Melder_integer (power2 -> points -> size));
-	MelderInfo_writeLine (in2, L"flutter:             ", Melder_integer (flutter -> points -> size));
-	MelderInfo_writeLine (in2, L"doublePulsing:       ", Melder_integer (doublePulsing -> points -> size));
-	MelderInfo_writeLine (in2, L"spectralTilt:        ", Melder_integer (spectralTilt -> points -> size));
-	MelderInfo_writeLine (in2, L"aspirationAmplitude: ", Melder_integer (aspirationAmplitude -> points -> size));
-	MelderInfo_writeLine (in2, L"breathinessAmplitude:", Melder_integer (breathinessAmplitude -> points -> size));
+	structDaata :: v_info ();
+	const char32 *in1 = U"  ", *in2 = U"    ";
+	MelderInfo_writeLine (in1, U"Time domain:");
+	MelderInfo_writeLine (in2, U"Start time:     ", xmin, U" seconds");
+	MelderInfo_writeLine (in2, U"End time:       ", xmax, U" seconds");
+	MelderInfo_writeLine (in2, U"Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (in1, U"\nNumber of points in the PHONATION tiers:");
+	MelderInfo_writeLine (in2, U"pitch:               ", pitch -> points -> size);
+	MelderInfo_writeLine (in2, U"voicingAmplitude:    ", voicingAmplitude -> points -> size);
+	MelderInfo_writeLine (in2, U"openPhase:           ", openPhase -> points -> size);
+	MelderInfo_writeLine (in2, U"collisionPhase:      ", collisionPhase -> points -> size);
+	MelderInfo_writeLine (in2, U"power1:              ", power1 -> points -> size);
+	MelderInfo_writeLine (in2, U"power2:              ", power2 -> points -> size);
+	MelderInfo_writeLine (in2, U"flutter:             ", flutter -> points -> size);
+	MelderInfo_writeLine (in2, U"doublePulsing:       ", doublePulsing -> points -> size);
+	MelderInfo_writeLine (in2, U"spectralTilt:        ", spectralTilt -> points -> size);
+	MelderInfo_writeLine (in2, U"aspirationAmplitude: ", aspirationAmplitude -> points -> size);
+	MelderInfo_writeLine (in2, U"breathinessAmplitude:", breathinessAmplitude -> points -> size);
 }
 
 void PhonationGrid_setNames (PhonationGrid me) {
-	Thing_setName (my pitch, L"pitch");
-	Thing_setName (my voicingAmplitude, L"voicingAmplitude");
-	Thing_setName (my openPhase, L"openPhase");
-	Thing_setName (my collisionPhase, L"collisionPhase");
-	Thing_setName (my power1, L"power1");
-	Thing_setName (my power2, L"power2");
-	Thing_setName (my flutter, L"flutter");
-	Thing_setName (my doublePulsing, L"doublePulsing");
-	Thing_setName (my spectralTilt, L"spectralTilt");
-	Thing_setName (my aspirationAmplitude, L"aspirationAmplitude");
-	Thing_setName (my breathinessAmplitude, L"breathinessAmplitude");
-}
-
-PhonationGrid PhonationGrid_create (double tmin, double tmax) {
+	Thing_setName (my pitch.get(), U"pitch");
+	Thing_setName (my voicingAmplitude.get(), U"voicingAmplitude");
+	Thing_setName (my openPhase.get(), U"openPhase");
+	Thing_setName (my collisionPhase.get(), U"collisionPhase");
+	Thing_setName (my power1.get(), U"power1");
+	Thing_setName (my power2.get(), U"power2");
+	Thing_setName (my flutter.get(), U"flutter");
+	Thing_setName (my doublePulsing.get(), U"doublePulsing");
+	Thing_setName (my spectralTilt.get(), U"spectralTilt");
+	Thing_setName (my aspirationAmplitude.get(), U"aspirationAmplitude");
+	Thing_setName (my breathinessAmplitude.get(), U"breathinessAmplitude");
+}
+
+autoPhonationGrid PhonationGrid_create (double tmin, double tmax) {
 	try {
 		autoPhonationGrid me = Thing_new (PhonationGrid);
 		Function_init (me.peek(), tmin, tmax);
 		my pitch = PitchTier_create (tmin, tmax);
-		my voicingAmplitude = IntensityTier_create (tmin, tmax);
+		my voicingAmplitude = IntensityTier_create (tmin, tmax).transfer();
 		my openPhase = RealTier_create (tmin, tmax);
 		my collisionPhase = RealTier_create (tmin, tmax);
 		my power1 = RealTier_create (tmin, tmax);
 		my power2 = RealTier_create (tmin, tmax);
 		my flutter = RealTier_create (tmin, tmax);
 		my doublePulsing = RealTier_create (tmin, tmax);
-		my spectralTilt = IntensityTier_create (tmin, tmax);
-		my aspirationAmplitude = IntensityTier_create (tmin, tmax);
-		my breathinessAmplitude = IntensityTier_create (tmin, tmax);
+		my spectralTilt = IntensityTier_create (tmin, tmax).transfer();
+		my aspirationAmplitude = IntensityTier_create (tmin, tmax).transfer();
+		my breathinessAmplitude = IntensityTier_create (tmin, tmax).transfer();
 		my options = PhonationGridPlayOptions_create ();
 		PhonationGrid_setNames (me.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("PhonationGrid not created.");
+		Melder_throw (U"PhonationGrid not created.");
 	}
 }
 
@@ -624,19 +624,19 @@ static void PhonationGrid_checkFlowFunction (PhonationGrid me) {
 	long ipoint = 1;
 	do {
 		double time = hasPower1Points ? ( (RealPoint) (my power1 -> points -> item[ipoint])) -> number : 0.5 * (my xmin + my xmax);
-		double power1 = RealTier_getValueAtIndex (my power1, ipoint);
+		double power1 = RealTier_getValueAtIndex (my power1.get(), ipoint);
 		if (power1 == NUMundefined) {
 			power1 = KlattGrid_POWER1_DEFAULT;
 		}
 		if (power1 <= 0) {
-			Melder_throw ("All power1 values must greater than zero.");
+			Melder_throw (U"All power1 values must greater than zero.");
 		}
-		double power2 = RealTier_getValueAtTime (my power2, time);
+		double power2 = RealTier_getValueAtTime (my power2.get(), time);
 		if (power2 == NUMundefined) {
 			power2 = KlattGrid_POWER2_DEFAULT;
 		}
 		if (power2 <= power1) {
-			Melder_throw ("At all times a power1 value must be smaller than the corresponding power2 value.");
+			Melder_throw (U"At all times a power1 value must be smaller than the corresponding power2 value.");
 		}
 	} while (++ipoint < my power1 -> points -> size);
 
@@ -646,16 +646,16 @@ static void PhonationGrid_checkFlowFunction (PhonationGrid me) {
 	ipoint = 1;
 	do {
 		double time = hasPower2Points ? ( (RealPoint) (my power2 -> points -> item[ipoint])) -> number : 0.5 * (my xmin + my xmax);
-		double power2 = RealTier_getValueAtIndex (my power2, ipoint);
+		double power2 = RealTier_getValueAtIndex (my power2.get(), ipoint);
 		if (power2 == NUMundefined) {
 			power2 = KlattGrid_POWER2_DEFAULT;
 		}
-		double power1 = RealTier_getValueAtTime (my power1, time);
+		double power1 = RealTier_getValueAtTime (my power1.get(), time);
 		if (power1 == NUMundefined) {
 			power1 = KlattGrid_POWER1_DEFAULT;
 		}
 		if (power2 <= power1) {
-			Melder_throw ("At all times the power2 value must be greater than the corresponding power1 value.");
+			Melder_throw (U"At all times the power2 value must be greater than the corresponding power1 value.");
 		}
 	} while (++ipoint < my power2 -> points -> size);
 }
@@ -673,20 +673,20 @@ static void PhonationGrid_draw_inside (PhonationGrid me, Graphics g, double xmin
 
 	double x1 = xmin, x2 = x1 + xw[1];
 	double y2 = ymax, y1 = y2 - dy;
-	draw_oneSection (g, x1, x2, y1, y2, NULL, L"Voicing", 0);
+	draw_oneSection (g, x1, x2, y1, y2, nullptr, U"Voicing", 0);
 
 	x1 = x2; x2 = x1 + xw[2];
 	double ymid = (y1 + y2) / 2;
 	Graphics_line (g, x1, ymid, x2, ymid);
 
 	x1 = x2; x2 = x1 + xw[3];
-	draw_oneSection (g, x1, x2, y1, y2, NULL, L"Tilt", 0);
+	draw_oneSection (g, x1, x2, y1, y2, nullptr, U"Tilt", 0);
 
 	thy x[1] = x2; thy y[1] = ymid;
 
 	y2 = y1 - 0.5 * dy; y1 = y2 - dy; ymid = (y1 + y2) / 2;
 	x2 = xmin + xws[3]; x1 = x2 - 1.5 * xw[3]; // some extra space
-	draw_oneSection (g, x1, x2, y1, y2, NULL, L"Aspiration", 0);
+	draw_oneSection (g, x1, x2, y1, y2, nullptr, U"Aspiration", 0);
 
 	thy x[2] = x2; thy y[2] = ymid;
 
@@ -715,11 +715,11 @@ void PhonationGrid_draw (PhonationGrid me, Graphics g) {
 }
 
 double PhonationGrid_getMaximumPeriod (PhonationGrid me) {
-	double minimumPitch = RealTier_getMinimumValue (my pitch);
+	double minimumPitch = RealTier_getMinimumValue (my pitch.get());
 	return 2 / ( (minimumPitch == NUMundefined || minimumPitch == 0) ? (my xmax - my xmin) : minimumPitch);
 }
 
-PointProcess PitchTier_to_PointProcess_flutter (PitchTier pitch, RealTier flutter, double maximumPeriod) {
+autoPointProcess PitchTier_to_PointProcess_flutter (PitchTier pitch, RealTier flutter, double maximumPeriod) {
 	try {
 		autoPointProcess thee = PitchTier_to_PointProcess (pitch);
 		if (flutter == 0) {
@@ -741,11 +741,11 @@ PointProcess PitchTier_to_PointProcess_flutter (PitchTier pitch, RealTier flutte
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (pitch, ": no flutter PointProcess created.");
+		Melder_throw (pitch, U": no flutter PointProcess created.");
 	}
 }
 
-Sound PhonationGrid_to_Sound_aspiration (PhonationGrid me, double samplingFrequency) {
+autoSound PhonationGrid_to_Sound_aspiration (PhonationGrid me, double samplingFrequency) {
 	try {
 		autoSound thee = Sound_createEmptyMono (my xmin, my xmax, samplingFrequency);
 
@@ -756,7 +756,7 @@ Sound PhonationGrid_to_Sound_aspiration (PhonationGrid me, double samplingFreque
 			for (long i = 1; i <= thy nx; i++) {
 				double t = thy x1 + (i - 1) * thy dx;
 				double val = NUMrandomUniform (-1, 1);
-				double a = DBSPL_to_A (RealTier_getValueAtTime (my aspirationAmplitude, t));
+				double a = DBSPL_to_A (RealTier_getValueAtTime (my aspirationAmplitude.get(), t));
 				if (NUMdefined (a)) {
 					thy z[1][i] = lastval = val + 0.75 * lastval;
 					lastval = (val += 0.75 * lastval); // soft low-pass
@@ -764,9 +764,9 @@ Sound PhonationGrid_to_Sound_aspiration (PhonationGrid me, double samplingFreque
 				}
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no aspiration Sound created.");
+		Melder_throw (me, U": no aspiration Sound created.");
 	}
 }
 
@@ -786,7 +786,7 @@ static void Sound_PhonationGrid_spectralTilt_inline (Sound thee, PhonationGrid m
 
 		for (long i = 1; i <= thy nx; i++) {
 			double t = thy x1 + (i - 1) * thy dx;
-			double tilt_db = RealTier_getValueAtTime (my spectralTilt, t);
+			double tilt_db = RealTier_getValueAtTime (my spectralTilt.get(), t);
 
 			if (tilt_db > 0) {
 				double d = pow (10, -tilt_db / 10);
@@ -849,21 +849,21 @@ static double get_collisionPoint_x (double n, double m, double collisionPhase) {
 	return y;
 }
 
-PhonationTier PhonationGrid_to_PhonationTier (PhonationGrid me) {
+autoPhonationTier PhonationGrid_to_PhonationTier (PhonationGrid me) {
 	try {
 		long diplophonicPulseIndex = 0;
-		PhonationGridPlayOptions pp = my options;
+		PhonationGridPlayOptions pp = my options.get();
 
 		PhonationGrid_checkFlowFunction (me);
 		if (my pitch -> points -> size == 0) {
-			Melder_throw ("Pitch tier is empty.");
+			Melder_throw (U"Pitch tier is empty.");
 		}
 
 		if (pp -> maximumPeriod == 0) {
 			pp -> maximumPeriod = PhonationGrid_getMaximumPeriod (me);
 		}
 
-		autoPointProcess point = PitchTier_to_PointProcess_flutter (my pitch, (pp -> flutter ? my flutter : 0), pp -> maximumPeriod);
+		autoPointProcess point = PitchTier_to_PointProcess_flutter (my pitch.get(), (pp -> flutter ? my flutter.get() : nullptr), pp -> maximumPeriod);
 
 		autoPhonationTier thee = PhonationTier_create (my xmin, my xmax);
 
@@ -891,25 +891,25 @@ PhonationTier PhonationGrid_to_PhonationTier (PhonationGrid me) {
 
 			double periodStart = t - period; // point where period starts:
 
-			double collisionPhase = pp -> collisionPhase ? RealTier_getValueAtTime (my collisionPhase, periodStart) : 0;
+			double collisionPhase = pp -> collisionPhase ? RealTier_getValueAtTime (my collisionPhase.get(), periodStart) : 0;
 			if (collisionPhase == NUMundefined) {
 				collisionPhase = 0;
 			}
-			double power1 = pp -> flowFunction == 1 ? RealTier_getValueAtTime (my power1, periodStart) : pp -> flowFunction;
+			double power1 = pp -> flowFunction == 1 ? RealTier_getValueAtTime (my power1.get(), periodStart) : pp -> flowFunction;
 			if (power1 == NUMundefined) {
 				power1 = KlattGrid_POWER1_DEFAULT;
 			}
-			double power2 = pp -> flowFunction == 1 ? RealTier_getValueAtTime (my power2, periodStart) : pp -> flowFunction + 1;
+			double power2 = pp -> flowFunction == 1 ? RealTier_getValueAtTime (my power2.get(), periodStart) : pp -> flowFunction + 1;
 			if (power2 == NUMundefined) {
 				power2 = KlattGrid_POWER2_DEFAULT;
 			}
 			try {
 				re = get_collisionPoint_x (power1, power2, collisionPhase);
 			} catch (MelderError) {
-				Melder_warning (L"Illegal collision point at t = ", Melder_double (t), L" (power1=", Melder_double (power1), L", power2=", Melder_double (power2), L"colPhase=", Melder_double (collisionPhase), L")");
+				Melder_warning (U"Illegal collision point at t = ", t, U" (power1=", power1, U", power2=", power2, U"colPhase=", collisionPhase, U")");
 			}
 
-			double openPhase = RealTier_getValueAtTime (my openPhase, periodStart);
+			double openPhase = RealTier_getValueAtTime (my openPhase.get(), periodStart);
 			if (openPhase == NUMundefined) {
 				openPhase = KlattGrid_OPENPHASE_DEFAULT;
 			}
@@ -921,12 +921,12 @@ PhonationTier PhonationGrid_to_PhonationTier (PhonationGrid me) {
 			// This delay scales to maximally equal the closed phase of the next period.
 			// The doublePulsing scales the amplitudes as well as the delay linearly.
 
-			double doublePulsing = pp -> doublePulsing ? RealTier_getValueAtTime (my doublePulsing, periodStart) : 0;
+			double doublePulsing = pp -> doublePulsing ? RealTier_getValueAtTime (my doublePulsing.get(), periodStart) : 0.0;
 			if (doublePulsing == NUMundefined) {
-				doublePulsing = 0;
+				doublePulsing = 0.0;
 			}
 
-			if (doublePulsing > 0) {
+			if (doublePulsing > 0.0) {
 				diplophonicPulseIndex++;
 				if (diplophonicPulseIndex % 2 == 1) { // the odd one
 					double nextPeriod = PointProcess_getPeriodAtIndex (point.peek(), it + 1, pp -> maximumPeriod);
@@ -935,11 +935,11 @@ PhonationTier PhonationGrid_to_PhonationTier (PhonationGrid me) {
 					}
 					double openPhase2 = KlattGrid_OPENPHASE_DEFAULT;
 					if (my openPhase -> points -> size > 0) {
-						openPhase2 = RealTier_getValueAtTime (my openPhase, t);
+						openPhase2 = RealTier_getValueAtTime (my openPhase.get(), t);
 					}
-					double maxDelay = period * (1 - openPhase2);
+					double maxDelay = period * (1.0 - openPhase2);
 					pulseDelay = maxDelay * doublePulsing;
-					pulseScale *= (1 - doublePulsing);
+					pulseScale *= (1.0 - doublePulsing);
 				}
 			} else {
 				diplophonicPulseIndex = 0;
@@ -949,25 +949,25 @@ PhonationTier PhonationGrid_to_PhonationTier (PhonationGrid me) {
 			autoPhonationPoint phonationPoint = PhonationPoint_create (t, period, openPhase, collisionPhase, te, power1, power2, pulseScale);
 			AnyTier_addPoint (thee.peek(), phonationPoint.transfer());
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no PhonationTier created.");
+		Melder_throw (me, U": no PhonationTier created.");
 	}
 }
 
-Sound PhonationGrid_PhonationTier_to_Sound_voiced (PhonationGrid me, PhonationTier thee, double samplingFrequency) {
+autoSound PhonationGrid_PhonationTier_to_Sound_voiced (PhonationGrid me, PhonationTier thee, double samplingFrequency) {
 	try {
-		PhonationGridPlayOptions p = my options;
+		PhonationGridPlayOptions p = my options.get();
 		double lastVal = NUMundefined;
 
 		if (my voicingAmplitude -> points -> size == 0) {
-			Melder_throw ("Voicing amplitude tier is empty.");
+			Melder_throw (U"Voicing amplitude tier is empty.");
 		}
 
 		autoSound him = Sound_createEmptyMono (my xmin, my xmax, samplingFrequency);
-		autoSound breathy = 0;
+		autoSound breathy;
 		if (p -> breathiness && my breathinessAmplitude -> points -> size > 0) {
-			breathy.reset (Sound_createEmptyMono (my xmin, my xmax, samplingFrequency));
+			breathy = Sound_createEmptyMono (my xmin, my xmax, samplingFrequency);
 		}
 		/*
 			Cycle through the points of the PhonationTier. Each will become a period.
@@ -1002,7 +1002,7 @@ Sound PhonationGrid_PhonationTier_to_Sound_voiced (PhonationGrid me, PhonationTi
 			// Fill in the samples to the left of the current point.
 
 			long midSample = Sampled_xToLowIndex (him.peek(), t), beginSample;
-			beginSample = midSample - floor (te / his dx);
+			beginSample = midSample - (long) floor (te / his dx);
 			if (beginSample < 1) {
 				beginSample = 0;
 			}
@@ -1023,7 +1023,7 @@ Sound PhonationGrid_PhonationTier_to_Sound_voiced (PhonationGrid me, PhonationTi
 					// Breathiness only during open part modulated by the flow
 					if (breathy.peek() != 0) {
 						double val = flow * NUMrandomUniform (-1, 1);
-						double a = RealTier_getValueAtTime (my breathinessAmplitude, t);
+						double a = RealTier_getValueAtTime (my breathinessAmplitude.get(), t);
 						breathy -> z[1][i] += val * DBSPL_to_A (a);
 					}
 				}
@@ -1043,7 +1043,7 @@ Sound PhonationGrid_PhonationTier_to_Sound_voiced (PhonationGrid me, PhonationTi
 				double ta = collisionPhase * (period * openPhase);
 				double factorPerSample = exp (- his dx / ta);
 				double value = flow * exp (- (his x1 + midSample * his dx - t) / ta);
-				long endSample = midSample + floor (20 * ta / his dx);
+				long endSample = midSample + (long) floor (20 * ta / his dx);
 				if (endSample > his nx) {
 					endSample = his nx;
 				}
@@ -1070,14 +1070,14 @@ Sound PhonationGrid_PhonationTier_to_Sound_voiced (PhonationGrid me, PhonationTi
 
 		for (long i = 1; i <= his nx; i++) {
 			double t = his x1 + (i - 1) * his dx;
-			his z[1][i] *= DBSPL_to_A (RealTier_getValueAtTime (my voicingAmplitude, t));
+			his z[1][i] *= DBSPL_to_A (RealTier_getValueAtTime (my voicingAmplitude.get(), t));
 			if (breathy.peek() != 0) {
 				his z[1][i] += breathy -> z[1][i];
 			}
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Sound created.");
+		Melder_throw (me, U": no Sound created.");
 	}
 }
 
@@ -1087,19 +1087,19 @@ static Sound PhonationGrid_to_Sound_voiced (PhonationGrid me, double samplingFre
 		autoSound him = PhonationGrid_PhonationTier_to_Sound_voiced (me, thee.peek(), samplingFrequency);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no voiced Sound created.");
+		Melder_throw (me, U": no voiced Sound created.");
 	}
 }
 
 static Sound PhonationGrid_to_Sound (PhonationGrid me, CouplingGrid him, double samplingFrequency) {
 	try {
-		PhonationGridPlayOptions pp = my options;
-		autoSound thee = 0;
+		PhonationGridPlayOptions pp = my options.get();
+		autoSound thee;
 		if (pp -> voicing) {
-			if (him != 0 && his glottis -> points -> size > 0) {
-				thee.reset (PhonationGrid_PhonationTier_to_Sound_voiced (me, his glottis, samplingFrequency));
+			if (him && his glottis -> points -> size > 0) {
+				thee = PhonationGrid_PhonationTier_to_Sound_voiced (me, his glottis.get(), samplingFrequency);
 			} else {
-				thee.reset (PhonationGrid_to_Sound_voiced (me, samplingFrequency));
+				thee = PhonationGrid_to_Sound_voiced (me, samplingFrequency);
 			}
 			if (pp -> spectralTilt) {
 				Sound_PhonationGrid_spectralTilt_inline (thee.peek(), me);
@@ -1107,18 +1107,18 @@ static Sound PhonationGrid_to_Sound (PhonationGrid me, CouplingGrid him, double
 		}
 		if (pp -> aspiration) {
 			autoSound aspiration = PhonationGrid_to_Sound_aspiration (me, samplingFrequency);
-			if (thee.peek() == 0) {
-				thee.reset (aspiration.transfer());
+			if (! thee.peek()) {
+				thee = aspiration.move();
 			} else {
 				_Sounds_add_inline (thee.peek(), aspiration.peek());
 			}
 		}
-		if (thee.peek() == 0) {
-			thee.reset (Sound_createEmptyMono (my xmin, my xmax, samplingFrequency));
+		if (! thee.peek()) {
+			thee = Sound_createEmptyMono (my xmin, my xmax, samplingFrequency);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Sound created.");
+		Melder_throw (me, U": no Sound created.");
 	}
 }
 
@@ -1131,13 +1131,13 @@ static Ordered formantsAmplitudes_create (double tmin, double tmax, long numberO
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No formants amplitudes created.");
+		Melder_throw (U"No formants amplitudes created.");
 	};
 }
 
 /********************** VocalTractGridPlayOptions **********************/
 
-Thing_implement (VocalTractGridPlayOptions, Data, 0);
+Thing_implement (VocalTractGridPlayOptions, Daata, 0);
 
 static void VocalTractGridPlayOptions_setDefaults (VocalTractGridPlayOptions me, VocalTractGrid thee) {
 	my filterModel = KlattGrid_FILTER_CASCADE;
@@ -1149,12 +1149,12 @@ static void VocalTractGridPlayOptions_setDefaults (VocalTractGridPlayOptions me,
 	my startNasalAntiFormant = 1;
 }
 
-VocalTractGridPlayOptions VocalTractGridPlayOptions_create () {
+autoVocalTractGridPlayOptions VocalTractGridPlayOptions_create () {
 	try {
-		VocalTractGridPlayOptions me = Thing_new (VocalTractGridPlayOptions);
+		autoVocalTractGridPlayOptions me = Thing_new (VocalTractGridPlayOptions);
 		return me;
 	} catch (MelderError) {
-		Melder_throw ("VocalTractGridPlayOptions not created.");
+		Melder_throw (U"VocalTractGridPlayOptions not created.");
 	}
 }
 
@@ -1184,66 +1184,66 @@ static long Ordered_getNumberOfAmplitudePoints (Ordered me, long iformant) {
 	return t -> points -> size;
 }
 
-static void FormantGrid_info (FormantGrid me, Ordered amplitudes, const wchar_t *in1, const wchar_t *in2) {
+static void FormantGrid_info (FormantGrid me, Ordered amplitudes, const char32 *in1, const char32 *in2) {
 	long nformants = my formants -> size;
-	long namplitudes = amplitudes != NULL ? amplitudes -> size : 0;
+	long namplitudes = amplitudes ? amplitudes -> size : 0;
 	long nmax = MAX (nformants, namplitudes);
 
 	for (long iformant = 1; iformant <= nmax; iformant++) {
-		MelderInfo_writeLine (in1, L"Formant ", Melder_integer (iformant), L":");
+		MelderInfo_writeLine (in1, U"Formant ", iformant, U":");
 		if (iformant <= my formants -> size) {
 			long nfp = FormantGrid_getNumberOfFormantPoints (me, iformant);
 			long nbp = FormantGrid_getNumberOfBandwidthPoints (me, iformant);
-			MelderInfo_writeLine (in2, L"formants:   ", (nfp >= 0 ? Melder_integer (nfp) : L"-- undefined --"));
-			MelderInfo_writeLine (in2, L"bandwidths: ", (nbp >= 0 ? Melder_integer (nbp) : L"-- undefined --"));
+			MelderInfo_writeLine (in2, U"formants:   ", (nfp >= 0 ? Melder_integer (nfp) : U"--undefined--"));
+			MelderInfo_writeLine (in2, U"bandwidths: ", (nbp >= 0 ? Melder_integer (nbp) : U"--undefined--"));
 		}
-		if (amplitudes != NULL) {
+		if (amplitudes) {
 			long nap = Ordered_getNumberOfAmplitudePoints (amplitudes, iformant);
-			MelderInfo_writeLine (in2, L"amplitudes: ", (nap >= 0 ? Melder_integer (nap) : L"-- undefined --"));
+			MelderInfo_writeLine (in2, U"amplitudes: ", (nap >= 0 ? Melder_integer (nap) : U"--undefined--"));
 		}
 	}
 }
 
 void structVocalTractGrid :: v_info () {
-	structData :: v_info ();
-	const wchar_t *in1 = L"  ", *in2 = L"    ", *in3 = L"      ";
-	MelderInfo_writeLine (in1, L"Time domain:");
-	MelderInfo_writeLine (in2, L"Start time:     ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (in2, L"End time:       ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (in2, L"Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (in1, L"\nNumber of points in the ORAL FORMANT tiers:");
-	FormantGrid_info (oral_formants, oral_formants_amplitudes, in2, in3);
-	MelderInfo_writeLine (in1, L"\nNumber of points in the NASAL FORMANT tiers:");
-	FormantGrid_info (nasal_formants, nasal_formants_amplitudes, in2, in3);
-	MelderInfo_writeLine (in1, L"\nNumber of points in the NASAL ANTIFORMANT tiers:");
-	FormantGrid_info (nasal_antiformants, NULL, in2, in3);
+	structDaata :: v_info ();
+	const char32 *in1 = U"  ", *in2 = U"    ", *in3 = U"      ";
+	MelderInfo_writeLine (in1, U"Time domain:");
+	MelderInfo_writeLine (in2, U"Start time:     ", xmin, U" seconds");
+	MelderInfo_writeLine (in2, U"End time:       ", xmax, U" seconds");
+	MelderInfo_writeLine (in2, U"Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (in1, U"\nNumber of points in the ORAL FORMANT tiers:");
+	FormantGrid_info (our oral_formants.get(), oral_formants_amplitudes, in2, in3);
+	MelderInfo_writeLine (in1, U"\nNumber of points in the NASAL FORMANT tiers:");
+	FormantGrid_info (our nasal_formants.get(), nasal_formants_amplitudes, in2, in3);
+	MelderInfo_writeLine (in1, U"\nNumber of points in the NASAL ANTIFORMANT tiers:");
+	FormantGrid_info (our nasal_antiformants.get(), nullptr, in2, in3);
 }
 
 Thing_implement (VocalTractGrid, Function, 0);
 
 void VocalTractGrid_setNames (VocalTractGrid me) {
-	Thing_setName (my oral_formants, L"oral_formants");
-	Thing_setName (my nasal_formants, L"nasal_formants");
-	Thing_setName (my nasal_antiformants, L"nasal_antiformants");
-	Thing_setName (my oral_formants_amplitudes, L"oral_formants_amplitudes");
-	Thing_setName (my nasal_formants_amplitudes, L"nasal_formants_amplitudes");
+	Thing_setName (my oral_formants.get(), U"oral_formants");
+	Thing_setName (my nasal_formants.get(), U"nasal_formants");
+	Thing_setName (my nasal_antiformants.get(), U"nasal_antiformants");
+	Thing_setName (my oral_formants_amplitudes, U"oral_formants_amplitudes");
+	Thing_setName (my nasal_formants_amplitudes, U"nasal_formants_amplitudes");
 }
 
-VocalTractGrid VocalTractGrid_create (double tmin, double tmax, long numberOfFormants,
+autoVocalTractGrid VocalTractGrid_create (double tmin, double tmax, long numberOfFormants,
                                       long numberOfNasalFormants,	long numberOfNasalAntiFormants) {
 	try {
 		autoVocalTractGrid me = Thing_new (VocalTractGrid);
 		Function_init (me.peek(), tmin, tmax);
-		my oral_formants = FormantGrid_createEmpty (tmin, tmax, numberOfFormants);
-		my nasal_formants = FormantGrid_createEmpty (tmin, tmax, numberOfNasalFormants);
-		my nasal_antiformants = FormantGrid_createEmpty (tmin, tmax, numberOfNasalAntiFormants);
+		my oral_formants = FormantGrid_createEmpty (tmin, tmax, numberOfFormants).transfer();
+		my nasal_formants = FormantGrid_createEmpty (tmin, tmax, numberOfNasalFormants).transfer();
+		my nasal_antiformants = FormantGrid_createEmpty (tmin, tmax, numberOfNasalAntiFormants).transfer();
 		my oral_formants_amplitudes = formantsAmplitudes_create (tmin, tmax, numberOfFormants);
 		my nasal_formants_amplitudes = formantsAmplitudes_create (tmin, tmax, numberOfNasalFormants);
 		my options = VocalTractGridPlayOptions_create ();
 		VocalTractGrid_setNames (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("VocalTractGrid not created.");
+		Melder_throw (U"VocalTractGrid not created.");
 	}
 }
 
@@ -1251,13 +1251,13 @@ static void VocalTractGrid_CouplingGrid_drawCascade_inline (VocalTractGrid me, C
 	long numberOfOralFormants = my oral_formants -> formants -> size;
 	long numberOfNasalFormants = my nasal_formants -> formants -> size;
 	long numberOfNasalAntiFormants = my nasal_antiformants -> formants -> size;
-	long numberOfTrachealFormants = thee != NULL ? thy tracheal_formants -> formants -> size : 0;
-	long numberOfTrachealAntiFormants = thee != NULL ? thy tracheal_antiformants -> formants -> size : 0;
+	long numberOfTrachealFormants = thee ? thy tracheal_formants -> formants -> size : 0;
+	long numberOfTrachealAntiFormants = thee ? thy tracheal_antiformants -> formants -> size : 0;
 	double x1, y1 = ymin, x2, y2 = ymax, dx, ddx = 0.2, ymid = (y1 + y2) / 2;
-	const wchar_t *text[6] = { 0, L"TF", L"TAF", L"NF", L"NAF", L""};
+	const char32 *text[6] = { 0, U"TF", U"TAF", U"NF", U"NAF", U""};
 	long nf[6] = {0, numberOfTrachealFormants, numberOfTrachealAntiFormants, numberOfNasalFormants, numberOfNasalAntiFormants, numberOfOralFormants};
 	long numberOfXSections = 5, nsx = 0;
-	MelderString ff = { 0 }, fb = { 0 };
+	autoMelderString ff, fb;
 
 	long numberOfFilters = numberOfNasalFormants + numberOfNasalAntiFormants + numberOfTrachealFormants + numberOfTrachealAntiFormants + numberOfOralFormants;
 
@@ -1282,14 +1282,18 @@ static void VocalTractGrid_CouplingGrid_drawCascade_inline (VocalTractGrid me, C
 
 		x2 = x1 + dx;
 		for (long i = 1; i <= numberOfFormants; i++) {
-			MelderString_append (&ff, L"F", Melder_integer (i));
-			MelderString_append (&fb, L"B", Melder_integer (i));
+			MelderString_copy (&ff, U"F", i);
+			MelderString_copy (&fb, U"B", i);
+				// ppgb: met Melder_cat kan het misschien ook,
+				// maar je weet niet of Graphics (in draw_oneSection) niet indirect de cat-buffers gebruikt,
+				// dus deze methode is veiliger (kost bovendien maar 1 heap-allocatie voor de hele loop);
+				// alleen Melder_sprint is nog simpeler, omdat je weet dat 40 chars genoeg is
 			draw_oneSection (g, x1, x2, y1, y2, text[isection], ff.string, fb.string);
+
 			if (i < numberOfFormants) {
 				x1 = x2;
 				x2 = x1 + dx;
 			}
-			MelderString_empty (&ff); MelderString_empty (&fb);
 		}
 
 		if (isection < numberOfXSections) {
@@ -1305,8 +1309,6 @@ end:
 	if (yout != 0) {
 		*yout = ymid;
 	}
-
-	MelderString_free (&ff); MelderString_free (&fb);
 }
 
 static void VocalTractGrid_CouplingGrid_drawParallel_inline (VocalTractGrid me, CouplingGrid thee, Graphics g, double xmin, double xmax, double ymin, double ymax, double dy, double *yin, double *yout) {
@@ -1316,12 +1318,12 @@ static void VocalTractGrid_CouplingGrid_drawParallel_inline (VocalTractGrid me,
 	long numberOfXSections = 8, ic = 0, numberOfYSections = 4;
 	long numberOfNasalFormants = my nasal_formants -> formants -> size;
 	long numberOfOralFormants = my oral_formants -> formants -> size;
-	long numberOfTrachealFormants = thee != NULL ? thy tracheal_formants -> formants -> size : 0;
+	long numberOfTrachealFormants = thee ? thy tracheal_formants -> formants -> size : 0;
 	long numberOfFormants = numberOfNasalFormants + numberOfOralFormants + numberOfTrachealFormants;
 	long numberOfUpperPartFormants = numberOfNasalFormants + (numberOfOralFormants > 0 ? 1 : 0);
 	long numberOfLowerPartFormants = numberOfFormants - numberOfUpperPartFormants;
 	double ddy = dy < 0 ? 0 : dy, x1, y1, x2, y2, x3, r, ymid;
-	const wchar_t *text[5] = { 0, L"Nasal", L"", L"", L"Tracheal"};
+	const char32 *text[5] = { 0, U"Nasal", U"", U"", U"Tracheal"};
 	long nffrom[5] = {0, 1, 1, 2, 1};
 	long nfto[5] = {0, numberOfNasalFormants, (numberOfOralFormants > 0 ? 1 : 0), numberOfOralFormants, numberOfTrachealFormants};
 	autoMelderString fba;
@@ -1331,10 +1333,10 @@ static void VocalTractGrid_CouplingGrid_drawParallel_inline (VocalTractGrid me,
 	if (numberOfFormants == 0) {
 		y1 = y2 = (ymin + ymax) / 2;
 		Graphics_line (g, xmin, y1, xmax, y1);
-		if (yin != NULL) {
+		if (yin) {
 			*yin = y1;
 		}
-		if (yout != NULL) {
+		if (yout) {
 			*yout = y2;
 		}
 		return;
@@ -1355,15 +1357,14 @@ static void VocalTractGrid_CouplingGrid_drawParallel_inline (VocalTractGrid me,
 		}
 		for (long i = ifrom; i <= ito; i++) {
 			y1 = y2 - dy; ymid = (y1 + y2) / 2;
-			const wchar_t *fi = Melder_integer (i);
-			MelderString_append (&fba, L"A", fi, L" F", fi, L" B", fi);
-			draw_oneSection (g, x1, x2, y1, y2, text[isection], fba.string, NULL);
+			const char32 *fi = Melder_integer (i);
+			MelderString_copy (&fba, U"A", fi, U" F", fi, U" B", fi);
+			draw_oneSection (g, x1, x2, y1, y2, text[isection], fba.string, nullptr);
 			Graphics_line (g, x3, ymid, x1, ymid); // to the left
 			ic++;
 			local_in -> x[ic] = x3; local_out -> x[ic] = x2;
 			local_in -> y[ic] = local_out -> y[ic] = ymid;
 			y2 = y1 - 0.5 * dy;
-			MelderString_empty (&fba);
 		}
 	}
 
@@ -1389,7 +1390,7 @@ static void VocalTractGrid_CouplingGrid_drawParallel_inline (VocalTractGrid me,
 		x2 = xmin + xws[3]; // right of diff
 		Graphics_line (g, x1, y1, x2, y1); // from vertical to diff
 		x1 = xmin + xws[2]; // left of diff
-		draw_oneSection (g, x1, x2, y1 + 0.5 * dy, y1 - 0.5 * dy, L"Pre-emphasis", NULL, NULL);
+		draw_oneSection (g, x1, x2, y1 + 0.5 * dy, y1 - 0.5 * dy, U"Pre-emphasis", nullptr, nullptr);
 		x2 = x1;
 		if (numberOfUpperPartFormants > 0) {
 			x2 = xmin + xw[1]; y2 = y1; // at split
@@ -1408,10 +1409,10 @@ static void VocalTractGrid_CouplingGrid_drawParallel_inline (VocalTractGrid me,
 
 	connections_free (local_out); connections_free (local_in);
 
-	if (yin != NULL) {
+	if (yin) {
 		*yin = y1;
 	}
-	if (yout != NULL) {
+	if (yout) {
 		*yout = y2;
 	}
 }
@@ -1435,16 +1436,16 @@ static void VocalTractGrid_CouplingGrid_draw (VocalTractGrid me, CouplingGrid th
 	Graphics_unsetInner (g);
 }
 
-static Sound Sound_VocalTractGrid_CouplingGrid_filter_cascade (Sound me, VocalTractGrid thee, CouplingGrid coupling) {
+static autoSound Sound_VocalTractGrid_CouplingGrid_filter_cascade (Sound me, VocalTractGrid thee, CouplingGrid coupling) {
 	try {
-		VocalTractGridPlayOptions pv = thy options;
-		CouplingGridPlayOptions pc = coupling -> options;
-		int useOpenGlottisInfo = pc -> openglottis && coupling && coupling -> glottis && coupling -> glottis -> points -> size > 0;
-		FormantGrid oral_formants = thy oral_formants;
-		FormantGrid nasal_formants = thy nasal_formants;
-		FormantGrid nasal_antiformants = thy nasal_antiformants;
-		FormantGrid tracheal_formants = coupling -> tracheal_formants;
-		FormantGrid tracheal_antiformants = coupling -> tracheal_antiformants;
+		VocalTractGridPlayOptions pv = thy options.get();
+		CouplingGridPlayOptions pc = coupling -> options.get();
+		bool useOpenGlottisInfo = pc -> openglottis && coupling && coupling -> glottis && coupling -> glottis -> points -> size > 0;
+		FormantGrid oral_formants = thy oral_formants.get();
+		FormantGrid nasal_formants = thy nasal_formants.get();
+		FormantGrid nasal_antiformants = thy nasal_antiformants.get();
+		FormantGrid tracheal_formants = coupling -> tracheal_formants.get();
+		FormantGrid tracheal_antiformants = coupling -> tracheal_antiformants.get();
 
 		int antiformants = 0;
 		long numberOfFormants = oral_formants -> formants -> size;
@@ -1460,9 +1461,9 @@ static Sound Sound_VocalTractGrid_CouplingGrid_filter_cascade (Sound me, VocalTr
 
 		autoSound him = Data_copy (me);
 
-		autoFormantGrid formants = 0;
+		autoFormantGrid formants;
 		if (useOpenGlottisInfo) {
-			formants.reset (Data_copy (thy oral_formants));
+			formants = Data_copy (thy oral_formants.get());
 			FormantGrid_CouplingGrid_updateOpenPhases (formants.peek(), coupling);
 		}
 
@@ -1470,8 +1471,8 @@ static Sound Sound_VocalTractGrid_CouplingGrid_filter_cascade (Sound me, VocalTr
 		if (pv -> endNasalFormant > 0) { // Nasal formants
 			antiformants = 0;
 			for (long iformant = pv -> startNasalFormant; iformant <= pv -> endNasalFormant; iformant++) {
-				if (FormantGrid_isFormantDefined (thy nasal_formants, iformant)) {
-					_Sound_FormantGrid_filterWithOneFormant_inline (him.peek(), thy nasal_formants, iformant, antiformants);
+				if (FormantGrid_isFormantDefined (thy nasal_formants.get(), iformant)) {
+					_Sound_FormantGrid_filterWithOneFormant_inline (him.peek(), thy nasal_formants.get(), iformant, antiformants);
 				} else {
 					// Melder_warning ("Nasal formant", iformant, ": frequency and/or bandwidth missing.");
 					nasal_formant_warning++; any_warning++;
@@ -1483,8 +1484,8 @@ static Sound Sound_VocalTractGrid_CouplingGrid_filter_cascade (Sound me, VocalTr
 		if (pv -> endNasalAntiFormant > 0) { // Nasal anti formants
 			antiformants = 1;
 			for (long iformant = pv -> startNasalAntiFormant; iformant <= pv -> endNasalAntiFormant; iformant++) {
-				if (FormantGrid_isFormantDefined (thy nasal_antiformants, iformant)) {
-					_Sound_FormantGrid_filterWithOneFormant_inline (him.peek(), thy nasal_antiformants, iformant, antiformants);
+				if (FormantGrid_isFormantDefined (thy nasal_antiformants.get(), iformant)) {
+					_Sound_FormantGrid_filterWithOneFormant_inline (him.peek(), thy nasal_antiformants.get(), iformant, antiformants);
 				} else {
 					// Melder_warning ("Nasal antiformant", iformant, ": frequency and/or bandwidth missing.");
 					nasal_antiformant_warning++; any_warning++;
@@ -1521,8 +1522,8 @@ static Sound Sound_VocalTractGrid_CouplingGrid_filter_cascade (Sound me, VocalTr
 		long oral_formant_warning = 0;
 		if (pv -> endOralFormant > 0) { // Oral formants
 			antiformants = 0;
-			if (formants.peek() == 0) {
-				formants.reset (thy oral_formants);
+			if (! formants) {
+				formants = thy oral_formants.get();   // yuck
 			}
 			for (long iformant = pv -> startOralFormant; iformant <= pv -> endOralFormant; iformant++) {
 				if (FormantGrid_isFormantDefined (formants.peek(), iformant)) {
@@ -1537,37 +1538,38 @@ static Sound Sound_VocalTractGrid_CouplingGrid_filter_cascade (Sound me, VocalTr
 		{
 			autoMelderString warning;
 			if (nasal_formant_warning > 0) {
-				MelderString_append (&warning, L"\tNasal formants: one or more are missing.\n");
+				MelderString_append (&warning, U"\tNasal formants: one or more are missing.\n");
 			}
 			if (nasal_antiformant_warning) {
-				MelderString_append (&warning, L"\tNasal antiformants: one or more are missing.\n");
+				MelderString_append (&warning, U"\tNasal antiformants: one or more are missing.\n");
 			}
 			if (tracheal_formant_warning) {
-				MelderString_append (&warning, L"\tTracheal formants: one or more are missing.\n");
+				MelderString_append (&warning, U"\tTracheal formants: one or more are missing.\n");
 			}
 			if (tracheal_antiformant_warning) {
-				MelderString_append (&warning, L"\tTracheal antiformants: one or more are missing.\n");
+				MelderString_append (&warning, U"\tTracheal antiformants: one or more are missing.\n");
 			}
 			if (oral_formant_warning) {
-				MelderString_append (&warning, L"\tOral formants: one or more are missing.\n");
+				MelderString_append (&warning, U"\tOral formants: one or more are missing.\n");
 			}
-			MelderInfo_write (L"\nWarning:\n", warning.string);
+			MelderInfo_write (U"\nWarning:\n", warning.string);
 			MelderInfo_drain ();
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered by vocaltract and coupling grid.");
+		Melder_throw (me, U": not filtered by vocaltract and coupling grid.");
 	}
 }
 
-Sound Sound_VocalTractGrid_CouplingGrid_filter_parallel (Sound me, VocalTractGrid thee, CouplingGrid coupling) {
+autoSound Sound_VocalTractGrid_CouplingGrid_filter_parallel (Sound me, VocalTractGrid thee, CouplingGrid coupling) {
 	try {
-		VocalTractGridPlayOptions pv = thy options;
-		CouplingGridPlayOptions pc = coupling -> options;
-		autoSound him = 0;
-		FormantGrid oral_formants = thy oral_formants; autoFormantGrid aof = 0;
+		VocalTractGridPlayOptions pv = thy options.get();
+		CouplingGridPlayOptions pc = coupling -> options.get();
+		autoSound him;
+		FormantGrid oral_formants = thy oral_formants.get();
+		autoFormantGrid aof;
 		int alternatingSign = 0; // 0: no alternating signs in parallel adding of filter outputs, 1/-1 start sign
-		int useOpenGlottisInfo = pc -> openglottis && coupling -> glottis && coupling -> glottis -> points -> size > 0;
+		bool useOpenGlottisInfo = pc -> openglottis && coupling -> glottis && coupling -> glottis -> points -> size > 0;
 		int scale = 1;
 		long numberOfFormants = thy oral_formants -> formants -> size;
 		long numberOfNasalFormants = thy nasal_formants -> formants -> size;
@@ -1578,13 +1580,14 @@ Sound Sound_VocalTractGrid_CouplingGrid_filter_parallel (Sound me, VocalTractGri
 		check_formants (numberOfTrachealFormants, & (pc -> startTrachealFormant), & (pc -> endTrachealFormant));
 
 		if (useOpenGlottisInfo) {
-			aof.reset (Data_copy (thy oral_formants)); oral_formants = aof.peek();
+			aof = Data_copy (thy oral_formants.get());
+			oral_formants = aof.peek();
 			FormantGrid_CouplingGrid_updateOpenPhases (oral_formants, coupling);
 		}
 
 		if (pv -> endOralFormant > 0) {
 			if (pv -> startOralFormant == 1) {
-				him.reset (Data_copy (me));
+				him = Data_copy (me);
 				if (oral_formants -> formants -> size > 0) {
 					Sound_FormantGrid_Intensities_filterWithOneFormant_inline (him.peek(), oral_formants, thy oral_formants_amplitudes, 1);
 				}
@@ -1593,10 +1596,10 @@ Sound Sound_VocalTractGrid_CouplingGrid_filter_parallel (Sound me, VocalTractGri
 
 		if (pv -> endNasalFormant > 0) {
 			alternatingSign = 0;
-			autoSound nasal =  Sound_FormantGrid_Intensities_filter (me, thy nasal_formants, thy nasal_formants_amplitudes, pv -> startNasalFormant, pv -> endNasalFormant, alternatingSign);
+			autoSound nasal = Sound_FormantGrid_Intensities_filter (me, thy nasal_formants.get(), thy nasal_formants_amplitudes, pv -> startNasalFormant, pv -> endNasalFormant, alternatingSign);
 
-			if (him.peek() == 0) {
-				him.reset (Data_copy (nasal.peek()));
+			if (! him) {
+				him = Data_copy (nasal.peek());
 			} else {
 				_Sounds_add_inline (him.peek(), nasal.peek());
 			}
@@ -1616,8 +1619,8 @@ Sound Sound_VocalTractGrid_CouplingGrid_filter_parallel (Sound me, VocalTractGri
 			if (startOralFormant2 <= oral_formants -> formants -> size) {
 				autoSound vocalTract = Sound_FormantGrid_Intensities_filter (me_diff.peek(), oral_formants, thy oral_formants_amplitudes, startOralFormant2, pv -> endOralFormant, alternatingSign);
 
-				if (him.peek() == 0) {
-					him.reset (Data_copy (vocalTract.peek()));
+				if (! him) {
+					him = Data_copy (vocalTract.peek());
 				} else {
 					_Sounds_add_inline (him.peek(), vocalTract.peek());
 				}
@@ -1626,26 +1629,26 @@ Sound Sound_VocalTractGrid_CouplingGrid_filter_parallel (Sound me, VocalTractGri
 
 		if (pc -> endTrachealFormant > 0) { // Tracheal formants
 			alternatingSign = 0;
-			autoSound trachea =  Sound_FormantGrid_Intensities_filter (me_diff.peek(), coupling -> tracheal_formants, coupling -> tracheal_formants_amplitudes,
-			                     pc -> startTrachealFormant, pc -> endTrachealFormant, alternatingSign);
+			autoSound trachea = Sound_FormantGrid_Intensities_filter (me_diff.peek(), coupling -> tracheal_formants.get(), coupling -> tracheal_formants_amplitudes,
+								pc -> startTrachealFormant, pc -> endTrachealFormant, alternatingSign);
 
-			if (him.peek() == 0) {
-				him.reset (Data_copy (trachea.peek()));
+			if (! him) {
+				him = Data_copy (trachea.peek());
 			} else {
 				_Sounds_add_inline (him.peek(), trachea.peek());
 			}
 		}
 
-		if (him.peek() == 0) {
-			him.reset (Data_copy (me));
+		if (! him) {
+			him = Data_copy (me);
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered in parallel.");
+		Melder_throw (me, U": not filtered in parallel.");
 	}
 }
 
-Sound Sound_VocalTractGrid_CouplingGrid_filter (Sound me, VocalTractGrid thee, CouplingGrid coupling) {
+autoSound Sound_VocalTractGrid_CouplingGrid_filter (Sound me, VocalTractGrid thee, CouplingGrid coupling) {
 	return thy options -> filterModel == KlattGrid_FILTER_CASCADE ?
 	       Sound_VocalTractGrid_CouplingGrid_filter_cascade (me, thee, coupling) :
 	       Sound_VocalTractGrid_CouplingGrid_filter_parallel (me, thee, coupling);
@@ -1653,7 +1656,7 @@ Sound Sound_VocalTractGrid_CouplingGrid_filter (Sound me, VocalTractGrid thee, C
 
 /********************** CouplingGridPlayOptions **********************/
 
-Thing_implement (CouplingGridPlayOptions, Data, 0);
+Thing_implement (CouplingGridPlayOptions, Daata, 0);
 
 static void CouplingGridPlayOptions_setDefaults (CouplingGridPlayOptions me, CouplingGrid thee) {
 	my fadeFraction = 0.1;
@@ -1668,12 +1671,12 @@ static void CouplingGridPlayOptions_setDefaults (CouplingGridPlayOptions me, Cou
 	my endDeltaBandwidth = thy delta_formants -> bandwidths -> size;
 }
 
-CouplingGridPlayOptions CouplingGridPlayOptions_create () {
+autoCouplingGridPlayOptions CouplingGridPlayOptions_create () {
 	try {
-		CouplingGridPlayOptions me = Thing_new (CouplingGridPlayOptions);
+		autoCouplingGridPlayOptions me = Thing_new (CouplingGridPlayOptions);
 		return me;
 	} catch (MelderError) {
-		Melder_throw ("CouplingGridPlayOptions not created.");
+		Melder_throw (U"CouplingGridPlayOptions not created.");
 	}
 }
 
@@ -1682,42 +1685,42 @@ CouplingGridPlayOptions CouplingGridPlayOptions_create () {
 Thing_implement (CouplingGrid, Function, 0);
 
 void structCouplingGrid :: v_info () {
-	structData :: v_info ();
-	const wchar_t *in1 = L"  ", *in2 = L"    ", *in3 = L"      ";
-	MelderInfo_writeLine (in1, L"Time domain:");
-	MelderInfo_writeLine (in2, L"Start time:     ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (in2, L"End time:       ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (in2, L"Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (in1, L"\nNumber of points in the TRACHEAL FORMANT tiers:");
-	FormantGrid_info (tracheal_formants, tracheal_formants_amplitudes, in2, in3);
-	MelderInfo_writeLine (in1, L"\nNumber of points in the TRACHEAL ANTIFORMANT tiers:");
-	FormantGrid_info (tracheal_antiformants, NULL, in2, in3);
-	MelderInfo_writeLine (in1, L"\nNumber of points in the DELTA FORMANT tiers:");
-	FormantGrid_info (delta_formants, NULL, in2, in3);
+	structDaata :: v_info ();
+	const char32 *in1 = U"  ", *in2 = U"    ", *in3 = U"      ";
+	MelderInfo_writeLine (in1, U"Time domain:");
+	MelderInfo_writeLine (in2, U"Start time:     ", xmin, U" seconds");
+	MelderInfo_writeLine (in2, U"End time:       ", xmax, U" seconds");
+	MelderInfo_writeLine (in2, U"Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (in1, U"\nNumber of points in the TRACHEAL FORMANT tiers:");
+	FormantGrid_info (our tracheal_formants.get(), tracheal_formants_amplitudes, in2, in3);
+	MelderInfo_writeLine (in1, U"\nNumber of points in the TRACHEAL ANTIFORMANT tiers:");
+	FormantGrid_info (our tracheal_antiformants.get(), nullptr, in2, in3);
+	MelderInfo_writeLine (in1, U"\nNumber of points in the DELTA FORMANT tiers:");
+	FormantGrid_info (our delta_formants.get(), nullptr, in2, in3);
 }
 
 void CouplingGrid_setNames (CouplingGrid me) {
-	Thing_setName (my tracheal_formants, L"tracheal_formants");
-	Thing_setName (my tracheal_antiformants, L"tracheal_antiformants");
-	Thing_setName (my tracheal_formants_amplitudes, L"tracheal_formants_amplitudes");
-	Thing_setName (my delta_formants, L"delta_formants");
-	Thing_setName (my glottis, L"glottis");
+	Thing_setName (my tracheal_formants.get(), U"tracheal_formants");
+	Thing_setName (my tracheal_antiformants.get(), U"tracheal_antiformants");
+	Thing_setName (my tracheal_formants_amplitudes, U"tracheal_formants_amplitudes");
+	Thing_setName (my delta_formants.get(), U"delta_formants");
+	Thing_setName (my glottis.get(), U"glottis");
 }
 
-CouplingGrid CouplingGrid_create (double tmin, double tmax, long numberOfTrachealFormants, long numberOfTrachealAntiFormants, long numberOfDeltaFormants) {
+autoCouplingGrid CouplingGrid_create (double tmin, double tmax, long numberOfTrachealFormants, long numberOfTrachealAntiFormants, long numberOfDeltaFormants) {
 	try {
 		autoCouplingGrid me = Thing_new (CouplingGrid);
 		Function_init (me.peek(), tmin, tmax);
-		my tracheal_formants = FormantGrid_createEmpty (tmin, tmax, numberOfTrachealFormants);
-		my tracheal_antiformants = FormantGrid_createEmpty (tmin, tmax, numberOfTrachealAntiFormants);
+		my tracheal_formants = FormantGrid_createEmpty (tmin, tmax, numberOfTrachealFormants).transfer();
+		my tracheal_antiformants = FormantGrid_createEmpty (tmin, tmax, numberOfTrachealAntiFormants).transfer();
 		my tracheal_formants_amplitudes = formantsAmplitudes_create (tmin, tmax, numberOfTrachealFormants);
-		my delta_formants = FormantGrid_createEmpty (tmin, tmax, numberOfDeltaFormants);
+		my delta_formants = FormantGrid_createEmpty (tmin, tmax, numberOfDeltaFormants).transfer();
 		my glottis = PhonationTier_create (tmin, tmax);
 		my options = CouplingGridPlayOptions_create ();
 		CouplingGrid_setNames (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("CouplingGrid not created.");
+		Melder_throw (U"CouplingGrid not created.");
 	}
 }
 
@@ -1725,14 +1728,14 @@ CouplingGrid CouplingGrid_create (double tmin, double tmax, long numberOfTrachea
 
 void FormantGrid_CouplingGrid_updateOpenPhases (FormantGrid me, CouplingGrid thee) {
 	try {
-		CouplingGridPlayOptions pc = thy options;
+		CouplingGridPlayOptions pc = thy options.get();
 		for (long itier = 1; itier <= thy delta_formants -> formants -> size; itier++) {
 			RealTier delta = (RealTier) thy delta_formants -> formants -> item[itier];
 			if (itier <= my formants -> size) {
 				if (delta -> points -> size > 0) {
-					autoRealTier rt = RealTier_updateWithDelta ( (RealTier) my formants -> item[itier], delta, thy glottis, pc -> fadeFraction);
+					autoRealTier rt = RealTier_updateWithDelta ( (RealTier) my formants -> item[itier], delta, thy glottis.get(), pc -> fadeFraction);
 					if (! RealTier_valuesInRange (rt.peek(), 0, NUMundefined)) {
-						Melder_throw ("Formant ",  itier, " coupling gives negative values.");
+						Melder_throw (U"Formant ", itier, U" coupling gives negative values.");
 					}
 					forget ( ( (Thing *) my formants -> item) [itier]);
 					my formants -> item[itier] = rt.transfer();
@@ -1741,9 +1744,9 @@ void FormantGrid_CouplingGrid_updateOpenPhases (FormantGrid me, CouplingGrid the
 			delta = (RealTier) thy delta_formants -> bandwidths -> item[itier];
 			if (itier <= my bandwidths -> size) {
 				if (delta -> points -> size > 0) {
-					autoRealTier rt = RealTier_updateWithDelta ( (RealTier) my bandwidths -> item[itier], delta, thy glottis, pc -> fadeFraction);
+					autoRealTier rt = RealTier_updateWithDelta ( (RealTier) my bandwidths -> item[itier], delta, thy glottis.get(), pc -> fadeFraction);
 					if (! RealTier_valuesInRange (rt.peek(), 0, NUMundefined)) {
-						Melder_throw ("Bandwidth ", itier, " coupling gives negative values.");
+						Melder_throw (U"Bandwidth ", itier, U" coupling gives negative values.");
 					}
 					forget ( ( (Thing *) my bandwidths -> item) [itier]);
 					my bandwidths -> item[itier] = rt.transfer();
@@ -1751,7 +1754,7 @@ void FormantGrid_CouplingGrid_updateOpenPhases (FormantGrid me, CouplingGrid the
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not updated with open hase information.");
+		Melder_throw (me, U": not updated with open hase information.");
 	}
 }
 
@@ -1760,7 +1763,7 @@ void FormantGrid_CouplingGrid_updateOpenPhases (FormantGrid me, CouplingGrid the
 void _Sound_FormantGrid_filterWithOneFormant_inline (Sound me, thou, long iformant, int antiformant) {
 	thouart (FormantGrid);
 	if (iformant < 1 || iformant > thy formants -> size) {
-		Melder_warning (L"Formant ", Melder_integer (iformant), L" does not exist.");
+		Melder_warning (U"Formant ", iformant, U" does not exist.");
 		return;
 	}
 
@@ -1770,7 +1773,7 @@ void _Sound_FormantGrid_filterWithOneFormant_inline (Sound me, thou, long iforma
 	if (ftier -> points -> size == 0 && btier -> points -> size == 0) {
 		return;
 	} else if (ftier -> points -> size == 0 || btier -> points -> size == 0) {
-		Melder_throw ("Empty tier");
+		Melder_throw (U"Empty tier");
 	}
 
 	double nyquist = 0.5 / my dx;
@@ -1798,7 +1801,7 @@ void Sound_FormantGrid_filterWithOneFormant_inline (Sound me, FormantGrid thee,
 void Sound_FormantGrid_Intensities_filterWithOneFormant_inline (Sound me, FormantGrid thee, Ordered amplitudes, long iformant) {
 	try {
 		if (iformant < 1 || iformant > thy formants -> size) {
-			Melder_throw ("Formant ",  iformant, " not defined. \nThis formant will not be used.");
+			Melder_throw (U"Formant ", iformant, U" not defined. \nThis formant will not be used.");
 		}
 		double nyquist = 0.5 / my dx;
 
@@ -1827,11 +1830,11 @@ void Sound_FormantGrid_Intensities_filterWithOneFormant_inline (Sound me, Forman
 			my z[1][is] = Filter_getOutput (r.peek(), my z[1][is]);
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered with one formant filter.");
+		Melder_throw (me, U": not filtered with one formant filter.");
 	}
 }
 
-Sound Sound_FormantGrid_Intensities_filter (Sound me, FormantGrid thee, Ordered amplitudes, long iformantb, long iformante, int alternatingSign) {
+autoSound Sound_FormantGrid_Intensities_filter (Sound me, FormantGrid thee, Ordered amplitudes, long iformantb, long iformante, int alternatingSign) {
 	try {
 		if (iformantb > iformante) {
 			iformantb = 1;
@@ -1839,7 +1842,7 @@ Sound Sound_FormantGrid_Intensities_filter (Sound me, FormantGrid thee, Ordered
 		}
 		if (iformantb < 1 || iformantb > thy formants -> size ||
 		        iformante < 1 || iformante > thy formants -> size) {
-			Melder_throw ("No such formant number.");
+			Melder_throw (U"No such formant number.");
 		}
 
 		autoSound him = Sound_create (my ny, my xmin, my xmax, my nx, my dx, my x1);
@@ -1856,15 +1859,15 @@ Sound Sound_FormantGrid_Intensities_filter (Sound me, FormantGrid thee, Ordered
 				}
 			}
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered.");
+		Melder_throw (me, U": not filtered.");
 	}
 }
 
 /********************** FricationGridPlayOptions **********************/
 
-Thing_implement (FricationGridPlayOptions, Data, 0);
+Thing_implement (FricationGridPlayOptions, Daata, 0);
 
 static void FricationGridPlayOptions_setDefaults (FricationGridPlayOptions me, FricationGrid thee) {
 	my endFricationFormant = MIN (thy frication_formants -> formants -> size, thy frication_formants -> bandwidths -> size);
@@ -1872,53 +1875,53 @@ static void FricationGridPlayOptions_setDefaults (FricationGridPlayOptions me, F
 	my bypass = 1;
 }
 
-FricationGridPlayOptions FricationGridPlayOptions_create () {
+autoFricationGridPlayOptions FricationGridPlayOptions_create () {
 	try {
-		FricationGridPlayOptions me = Thing_new (FricationGridPlayOptions);
+		autoFricationGridPlayOptions me = Thing_new (FricationGridPlayOptions);
 		return me;
 	} catch (MelderError) {
-		Melder_throw ("FricationGridPlayOptions not created.");
+		Melder_throw (U"FricationGridPlayOptions not created.");
 	}
 }
 
 /************************ FricationGrid (& Sound) *********************************************/
 
 void structFricationGrid :: v_info () {
-	structData :: v_info ();
-	const static wchar_t *in1 = L"  ", *in2 = L"    ", *in3 = L"      ";
-	MelderInfo_writeLine (in1, L"Time domain:");
-	MelderInfo_writeLine (in2, L"Start time:     ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (in2, L"End time:       ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (in2, L"Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (in1, L"\nNumber of points in the FRICATION tiers:");
-	MelderInfo_writeLine (in2, L"fricationAmplitude:  ", Melder_integer (fricationAmplitude -> points -> size));
-	MelderInfo_writeLine (in2, L"bypass:              ", Melder_integer (bypass -> points -> size));
-	MelderInfo_writeLine (in1, L"\nNumber of points in the FRICATION FORMANT tiers:");
-	FormantGrid_info (frication_formants, frication_formants_amplitudes, in2, in3);
+	structDaata :: v_info ();
+	const static char32 *in1 = U"  ", *in2 = U"    ", *in3 = U"      ";
+	MelderInfo_writeLine (in1, U"Time domain:");
+	MelderInfo_writeLine (in2, U"Start time:     ", xmin, U" seconds");
+	MelderInfo_writeLine (in2, U"End time:       ", xmax, U" seconds");
+	MelderInfo_writeLine (in2, U"Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (in1, U"\nNumber of points in the FRICATION tiers:");
+	MelderInfo_writeLine (in2, U"fricationAmplitude:  ", fricationAmplitude -> points -> size);
+	MelderInfo_writeLine (in2, U"bypass:              ", bypass -> points -> size);
+	MelderInfo_writeLine (in1, U"\nNumber of points in the FRICATION FORMANT tiers:");
+	FormantGrid_info (our frication_formants.get(), frication_formants_amplitudes, in2, in3);
 }
 
 Thing_implement (FricationGrid, Function, 0);
 
 void FricationGrid_setNames (FricationGrid me) {
-	Thing_setName (my fricationAmplitude, L"fricationAmplitude");
-	Thing_setName (my frication_formants, L"frication_formants");
-	Thing_setName (my bypass, L"bypass");
-	Thing_setName (my frication_formants_amplitudes, L"frication_formants_amplitudes");
+	Thing_setName (my fricationAmplitude.get(), U"fricationAmplitude");
+	Thing_setName (my frication_formants.get(), U"frication_formants");
+	Thing_setName (my bypass.get(), U"bypass");
+	Thing_setName (my frication_formants_amplitudes, U"frication_formants_amplitudes");
 }
 
-FricationGrid FricationGrid_create (double tmin, double tmax, long numberOfFormants) {
+autoFricationGrid FricationGrid_create (double tmin, double tmax, long numberOfFormants) {
 	try {
 		autoFricationGrid me = Thing_new (FricationGrid);
 		Function_init (me.peek(), tmin, tmax);
 		my fricationAmplitude = IntensityTier_create (tmin, tmax);
-		my frication_formants = FormantGrid_createEmpty (tmin, tmax, numberOfFormants);
+		my frication_formants = FormantGrid_createEmpty (tmin, tmax, numberOfFormants).transfer();
 		my bypass = IntensityTier_create (tmin, tmax);
 		my frication_formants_amplitudes = formantsAmplitudes_create (tmin, tmax, numberOfFormants);
 		my options = FricationGridPlayOptions_create ();
 		FricationGrid_setNames (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("FricationGrid not created.");
+		Melder_throw (U"FricationGrid not created.");
 	}
 }
 
@@ -1942,7 +1945,7 @@ static void FricationGrid_draw_inside (FricationGrid me, Graphics g, double xmin
 
 	// section 1
 	x1 = xmin; x2 = x1 + xw[1]; y1 = ymid - 0.5 * dy; y2 = y1 + dy;
-	draw_oneSection (g, x1, x2, y1, y2, L"Frication", L"noise", NULL);
+	draw_oneSection (g, x1, x2, y1, y2, U"Frication", U"noise", nullptr);
 
 	// section 2, horizontal line halfway, vertical line
 	x1 = x2; x2 = x1 + xw[2] / 2;
@@ -1951,21 +1954,20 @@ static void FricationGrid_draw_inside (FricationGrid me, Graphics g, double xmin
 	x3 = x2;
 	// final connection to section 2 , filters , connections to adder
 	x1 = xmin + xws[2]; x2 = x1 + xw[3]; y2 = ymax;
-	MelderString fba = { 0 };
+	autoMelderString fba;
 	for (long i = 1; i <= numberOfParts; i++) {
-		const wchar_t *fi = Melder_integer (i + 1);
+		const char32 *fi = Melder_integer (i + 1);
 		y1 = y2 - dy;
 		if (i < numberOfParts) {
-			MelderString_append (&fba, L"A", fi, L" F", fi, L" B", fi);
+			MelderString_copy (&fba, U"A", fi, U" F", fi, U" B", fi);
 		} else {
-			MelderString_append (&fba,  L"Bypass");
+			MelderString_copy (&fba,  U"Bypass");
 		}
-		draw_oneSection (g, x1, x2, y1, y2, NULL, fba.string, NULL);
+		draw_oneSection (g, x1, x2, y1, y2, nullptr, fba.string, nullptr);
 		double ymidi = (y1 + y2) / 2;
 		Graphics_line (g, x3, ymidi, x1, ymidi); // from noise to filter
 		cp -> x[i] = x2; cp -> y[i] = ymidi;
 		y2 = y1 - 0.5 * dy;
-		MelderString_empty (&fba);
 	}
 
 	r = xw[5] / 2;
@@ -1979,10 +1981,9 @@ static void FricationGrid_draw_inside (FricationGrid me, Graphics g, double xmin
 
 	connections_free (cp);
 
-	if (yout != NULL) {
+	if (yout) {
 		*yout = ys;
 	}
-	MelderString_free (&fba);
 }
 
 void FricationGrid_draw (FricationGrid me, Graphics g) {
@@ -1999,7 +2000,7 @@ void FricationGrid_draw (FricationGrid me, Graphics g) {
 	Graphics_unsetInner (g);
 }
 
-Sound FricationGrid_to_Sound (FricationGrid me, double samplingFrequency) {
+autoSound FricationGrid_to_Sound (FricationGrid me, double samplingFrequency) {
 	try {
 		autoSound thee = Sound_createEmptyMono (my xmin, my xmax, samplingFrequency);
 
@@ -2009,7 +2010,7 @@ Sound FricationGrid_to_Sound (FricationGrid me, double samplingFrequency) {
 			double val = NUMrandomUniform (-1, 1);
 			double a = 0;
 			if (my fricationAmplitude -> points -> size > 0) {
-				double dba = RealTier_getValueAtTime (my fricationAmplitude, t);
+				double dba = RealTier_getValueAtTime (my fricationAmplitude.get(), t);
 				a = dba == NUMundefined ? 0 : DBSPL_to_A (dba);
 			}
 			lastval = (val += 0.75 * lastval); // TODO: soft low-pass coefficient must be Fs dependent!
@@ -2017,17 +2018,17 @@ Sound FricationGrid_to_Sound (FricationGrid me, double samplingFrequency) {
 		}
 
 		autoSound him = Sound_FricationGrid_filter (thee.peek(), me);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": no frication Sound created.");
+		Melder_throw (me, U": no frication Sound created.");
 	}
 }
 
 /************************ Sound & FricationGrid *********************************************/
 
-Sound Sound_FricationGrid_filter (Sound me, FricationGrid thee) {
+autoSound Sound_FricationGrid_filter (Sound me, FricationGrid thee) {
 	try {
-		FricationGridPlayOptions pf = thy options;
+		FricationGridPlayOptions pf = thy options.get();
 		autoSound him = 0;
 		long numberOfFricationFormants = thy frication_formants -> formants -> size;
 
@@ -2036,11 +2037,11 @@ Sound Sound_FricationGrid_filter (Sound me, FricationGrid thee) {
 		if (pf -> endFricationFormant > 1) {
 			long startFricationFormant2 = pf -> startFricationFormant > 2 ? pf -> startFricationFormant : 2;
 			int alternatingSign = startFricationFormant2 % 2 == 0 ? 1 : -1; // 2 starts with positive sign
-			him.reset (Sound_FormantGrid_Intensities_filter (me, thy frication_formants, thy frication_formants_amplitudes, startFricationFormant2, pf -> endFricationFormant, alternatingSign));
+			him = Sound_FormantGrid_Intensities_filter (me, thy frication_formants.get(), thy frication_formants_amplitudes, startFricationFormant2, pf -> endFricationFormant, alternatingSign);
 		}
 
-		if (him.peek() == 0) {
-			him.reset (Data_copy (me));
+		if (! him) {
+			him = Data_copy (me);
 		}
 
 		if (pf -> bypass) {
@@ -2048,21 +2049,21 @@ Sound Sound_FricationGrid_filter (Sound me, FricationGrid thee) {
 				double t = his x1 + (is - 1) * his dx;
 				double ab = 0;
 				if (thy bypass -> points -> size > 0) {
-					double val = RealTier_getValueAtTime (thy bypass, t);
+					double val = RealTier_getValueAtTime (thy bypass.get(), t);
 					ab = val == NUMundefined ? 0 : DB_to_A (val);
 				}
 				his z[1][is] += my z[1][is] * ab;
 			}
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered by frication filter.");
+		Melder_throw (me, U": not filtered by frication filter.");
 	}
 }
 
 /********************** KlattGridPlayOptions **********************/
 
-Thing_implement (KlattGridPlayOptions, Data, 0);
+Thing_implement (KlattGridPlayOptions, Daata, 0);
 
 static void KlattGridPlayOptions_setDefaults (KlattGridPlayOptions me, KlattGrid thee) {
 	my samplingFrequency = 44100;
@@ -2071,21 +2072,21 @@ static void KlattGridPlayOptions_setDefaults (KlattGridPlayOptions me, KlattGrid
 	my xmax = thy xmax;
 }
 
-KlattGridPlayOptions KlattGridPlayOptions_create () {
+autoKlattGridPlayOptions KlattGridPlayOptions_create () {
 	try {
-		KlattGridPlayOptions me = Thing_new (KlattGridPlayOptions);
+		autoKlattGridPlayOptions me = Thing_new (KlattGridPlayOptions);
 		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGridPlayOptions not created.");
+		Melder_throw (U"KlattGridPlayOptions not created.");
 	}
 }
 
 void KlattGrid_setDefaultPlayOptions (KlattGrid me) {
-	KlattGridPlayOptions_setDefaults (my options, me);
-	PhonationGridPlayOptions_setDefaults (my phonation -> options);
-	VocalTractGridPlayOptions_setDefaults (my vocalTract -> options, my vocalTract);
-	CouplingGridPlayOptions_setDefaults (my coupling -> options, my coupling);
-	FricationGridPlayOptions_setDefaults (my frication -> options, my frication);
+	KlattGridPlayOptions_setDefaults (my options.get(), me);
+	PhonationGridPlayOptions_setDefaults (my phonation -> options.get());
+	VocalTractGridPlayOptions_setDefaults (my vocalTract -> options.get(), my vocalTract.get());
+	CouplingGridPlayOptions_setDefaults (my coupling -> options.get(), my coupling.get());
+	FricationGridPlayOptions_setDefaults (my frication -> options.get(), my frication.get());
 }
 
 /************************ KlattGrid *********************************************/
@@ -2093,30 +2094,30 @@ void KlattGrid_setDefaultPlayOptions (KlattGrid me) {
 Thing_implement (KlattGrid, Function, 0);
 
 void structKlattGrid :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time:     ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time:       ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"\n--- PhonationGrid ---\n");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time:     ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time:       ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"\n--- PhonationGrid ---\n");
 	phonation -> v_info ();
-	MelderInfo_writeLine (L"\n--- VocalTractGrid ---\n");
+	MelderInfo_writeLine (U"\n--- VocalTractGrid ---\n");
 	vocalTract -> v_info ();
-	MelderInfo_writeLine (L"\n--- CouplingGrid ---\n");
+	MelderInfo_writeLine (U"\n--- CouplingGrid ---\n");
 	coupling -> v_info ();
-	MelderInfo_writeLine (L"\n--- FricationgGrid ---\n");
+	MelderInfo_writeLine (U"\n--- FricationgGrid ---\n");
 	frication -> v_info ();
 }
 
 void KlattGrid_setNames (KlattGrid me) {
-	Thing_setName (my phonation, L"phonation");
-	Thing_setName (my vocalTract, L"vocalTract");
-	Thing_setName (my coupling, L"coupling");
-	Thing_setName (my frication, L"frication");
-	Thing_setName (my gain, L"gain");
+	Thing_setName (my phonation.get(), U"phonation");
+	Thing_setName (my vocalTract.get(), U"vocalTract");
+	Thing_setName (my coupling.get(), U"coupling");
+	Thing_setName (my frication.get(), U"frication");
+	Thing_setName (my gain.get(), U"gain");
 }
 
-KlattGrid KlattGrid_create (double tmin, double tmax, long numberOfFormants,
+autoKlattGrid KlattGrid_create (double tmin, double tmax, long numberOfFormants,
                             long numberOfNasalFormants,	long numberOfNasalAntiFormants,
                             long numberOfTrachealFormants, long numberOfTrachealAntiFormants,
                             long numberOfFricationFormants, long numberOfDeltaFormants) {
@@ -2132,19 +2133,19 @@ KlattGrid KlattGrid_create (double tmin, double tmax, long numberOfFormants,
 
 		KlattGrid_setDefaultPlayOptions (me.peek());
 		KlattGrid_setNames (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid not created.");
+		Melder_throw (U"KlattGrid not created.");
 	}
 }
 
-KlattGrid KlattGrid_createExample () {
+autoKlattGrid KlattGrid_createExample () {
 	try {
 		autoKlattTable thee = KlattTable_createExample ();
 		autoKlattGrid me = KlattTable_to_KlattGrid (thee.peek(), 0.005);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid example not created.");
+		Melder_throw (U"KlattGrid example not created.");
 	};
 }
 
@@ -2220,7 +2221,7 @@ static void getYpositions (double h1, double h2, double h3, double h4, double h5
 }
 
 void KlattGrid_drawVocalTract (KlattGrid me, Graphics g, int filterModel, int withTrachea) {
-	VocalTractGrid_CouplingGrid_draw (my vocalTract, withTrachea ? my coupling : NULL, g, filterModel);
+	VocalTractGrid_CouplingGrid_draw (my vocalTract.get(), withTrachea ? my coupling.get() : nullptr, g, filterModel);
 }
 
 void KlattGrid_draw (KlattGrid me, Graphics g, int filterModel) {
@@ -2266,13 +2267,13 @@ void KlattGrid_draw (KlattGrid me, Graphics g, int filterModel) {
 		dy = height_phonation / yh_phonation;
 
 		xs1 = xmin; xs2 = xs1 + xw[1]; ys2 = ymax; ys1 = ys2 - height_phonation;
-		PhonationGrid_draw_inside (my phonation, g, xs1, xs2, ys1, ys2, dy_phonation, &yout_phonation);
+		PhonationGrid_draw_inside (my phonation.get(), g, xs1, xs2, ys1, ys2, dy_phonation, &yout_phonation);
 
 		// units in cascade have same heigth as units in source part.
 
 		xc1 = xmin + xws[2]; xc2 = xc1 + xw[3];
 		yc2 = yout_phonation + dy / 2; yc1 = yc2 - dy;
-		VocalTractGrid_CouplingGrid_drawCascade_inline (my vocalTract, my coupling, g, xc1, xc2, yc1, yc2, &yin_vocalTract_c, &yout_vocalTract_c);
+		VocalTractGrid_CouplingGrid_drawCascade_inline (my vocalTract.get(), my coupling.get(), g, xc1, xc2, yc1, yc2, &yin_vocalTract_c, &yout_vocalTract_c);
 
 		tf -> x[1] = xc2; tf -> y[1] = yout_vocalTract_c;
 
@@ -2280,7 +2281,7 @@ void KlattGrid_draw (KlattGrid me, Graphics g, int filterModel) {
 
 		xf1 = xmin + xws[2]; xf2 = xf1 + xw[3]; yf2 = ymax - height_phonation; yf1 = 0;
 
-		FricationGrid_draw_inside (my frication, g, xf1, xf2, yf1, yf2, dy_frication, &yout_frication);
+		FricationGrid_draw_inside (my frication.get(), g, xf1, xf2, yf1, yf2, dy_frication, &yout_frication);
 	} else { // Parallel
 		// source connection tract connection, out
 		//     frication
@@ -2304,12 +2305,12 @@ void KlattGrid_draw (KlattGrid me, Graphics g, int filterModel) {
 		if (height_phonation < 0.3) {
 			height_phonation = 0.3;
 		}
-		double yunit = (ymax - ymin) / (yh_parallel + (1 - yh_overlap) * yh_frication); // some overlap
+		//double yunit = (ymax - ymin) / (yh_parallel + (1 - yh_overlap) * yh_frication); // some overlap
 
-		double ycs = ymax - 0.5 * height_phonation; // source output connector
-		double ycp = ymax - yf_parallel * yunit; // parallel input connector
-		double ytrans_phonation = ycs > ycp ? ycp - ycs : 0;
-		double ytrans_parallel = ycp > ycs ? ycs - ycp : 0;
+		//double ycs = ymax - 0.5 * height_phonation; // source output connector
+		//double ycp = ymax - yf_parallel * yunit; // parallel input connector
+		//double ytrans_phonation = ycs > ycp ? ycp - ycs : 0;
+		//double ytrans_parallel = ycp > ycs ? ycs - ycp : 0;
 
 		// source, tract, frication
 		xs1 = xmin; xs2 = xs1 + xw[1];
@@ -2317,10 +2318,10 @@ void KlattGrid_draw (KlattGrid me, Graphics g, int filterModel) {
 		double h1 = yh_phonation / 2, h2 = h1, h3 = yf_parallel, h4 = yh_parallel - h3, h5 = yh_frication;
 		getYpositions (h1, h2, h3, h4, h5, yh_overlap, &dy, &ys1, &ys2, &yp1, &yp2, &yf1, &yf2);
 
-		PhonationGrid_draw_inside (my phonation, g, xs1, xs2, ys1, ys2, dy_phonation, &yout_phonation);
+		PhonationGrid_draw_inside (my phonation.get(), g, xs1, xs2, ys1, ys2, dy_phonation, &yout_phonation);
 
 		xp1 = xmin + xws[2]; xp2 = xp1 + xw[3];
-		VocalTractGrid_CouplingGrid_drawParallel_inline (my vocalTract, my coupling, g, xp1, xp2, yp1, yp2, dy_vocalTract_p, &yin_vocalTract_p, &yout_vocalTract_p);
+		VocalTractGrid_CouplingGrid_drawParallel_inline (my vocalTract.get(), my coupling.get(), g, xp1, xp2, yp1, yp2, dy_vocalTract_p, &yin_vocalTract_p, &yout_vocalTract_p);
 
 		tf -> x[1] = xp2; tf -> y[1] = yout_vocalTract_p;
 
@@ -2328,7 +2329,7 @@ void KlattGrid_draw (KlattGrid me, Graphics g, int filterModel) {
 
 		xf1 = xmin /*+ 0.5 * xws[1]*/; xf2 = xf1 + 0.55 * (xw[2] + xws[3]);
 
-		FricationGrid_draw_inside (my frication, g, xf1, xf2, yf1, yf2, dy_frication, &yout_frication);
+		FricationGrid_draw_inside (my frication.get(), g, xf1, xf2, yf1, yf2, dy_frication, &yout_frication);
 	}
 
 	tf -> x[2] = xf2; tf -> y[2] = yout_frication;
@@ -2346,20 +2347,19 @@ void KlattGrid_draw (KlattGrid me, Graphics g, int filterModel) {
 
 #define PhonationGrid_QUERY_ADD_REMOVE_EXTRACT_REPLACE(Name,name,tierType) \
 double KlattGrid_get##Name##AtTime (KlattGrid me, double t) \
-{ return RealTier_getValueAtTime ((RealTier) my phonation -> name, t); } \
+{ return RealTier_getValueAtTime ((RealTier) my phonation -> name.get(), t); } \
 void KlattGrid_add##Name##Point (KlattGrid me, double t, double value) \
-{ RealTier_addPoint ((RealTier) my phonation -> name, t, value);} \
+{ RealTier_addPoint ((RealTier) my phonation -> name.get(), t, value);} \
 void KlattGrid_remove##Name##Points (KlattGrid me, double t1, double t2) \
-{ AnyTier_removePointsBetween ((RealTier) my phonation -> name, t1, t2); } \
-tierType KlattGrid_extract##Name##Tier (KlattGrid me) \
-{ return Data_copy ((tierType) my phonation -> name); } \
+{ AnyTier_removePointsBetween ((RealTier) my phonation -> name.get(), t1, t2); } \
+auto##tierType KlattGrid_extract##Name##Tier (KlattGrid me) \
+{ return Data_copy ((tierType) my phonation -> name.get()); } \
 void KlattGrid_replace##Name##Tier (KlattGrid me, tierType thee) \
 { try {\
-	if (my xmin != thy xmin || my xmax != thy xmax) Melder_throw ("Domains must be equal"); \
+	if (my xmin != thy xmin || my xmax != thy xmax) Melder_throw (U"Domains must be equal"); \
 	auto##tierType any = Data_copy ((tierType) thee); \
-	forget (my phonation -> name); \
-	my phonation -> name = any.transfer(); \
-	} catch (MelderError) { Melder_throw (me, ": tier not replaced."); } \
+	my phonation -> name = any.move(); \
+	} catch (MelderError) { Melder_throw (me, U": tier not replaced."); } \
 }
 
 // Generate 55 functions
@@ -2375,71 +2375,71 @@ PhonationGrid_QUERY_ADD_REMOVE_EXTRACT_REPLACE (SpectralTilt, spectralTilt, Inte
 PhonationGrid_QUERY_ADD_REMOVE_EXTRACT_REPLACE (AspirationAmplitude, aspirationAmplitude, IntensityTier)
 PhonationGrid_QUERY_ADD_REMOVE_EXTRACT_REPLACE (BreathinessAmplitude, breathinessAmplitude, IntensityTier)
 
-FormantGrid *KlattGrid_getAddressOfFormantGrid (KlattGrid me, int formantType) {
+autoFormantGrid* KlattGrid_getAddressOfFormantGrid (KlattGrid me, int formantType) {
 	return formantType == KlattGrid_ORAL_FORMANTS ? & (my vocalTract -> oral_formants) :
 	       formantType == KlattGrid_NASAL_FORMANTS ? & (my vocalTract -> nasal_formants) :
 	       formantType == KlattGrid_FRICATION_FORMANTS ? & (my frication -> frication_formants) :
 	       formantType == KlattGrid_TRACHEAL_FORMANTS ? & (my coupling -> tracheal_formants) :
 	       formantType == KlattGrid_NASAL_ANTIFORMANTS ? & (my vocalTract -> nasal_antiformants) :
 	       formantType == KlattGrid_TRACHEAL_ANTIFORMANTS ? & (my coupling -> tracheal_antiformants) :
-	       formantType == KlattGrid_DELTA_FORMANTS ? & (my coupling -> delta_formants) : 0;
+	       formantType == KlattGrid_DELTA_FORMANTS ? & (my coupling -> delta_formants) : nullptr;
 }
 
 Ordered *KlattGrid_getAddressOfAmplitudes (KlattGrid me, int formantType) {
 	return formantType == KlattGrid_ORAL_FORMANTS ? & (my vocalTract -> oral_formants_amplitudes) :
 	       formantType == KlattGrid_NASAL_FORMANTS ? & (my vocalTract -> nasal_formants_amplitudes) :
 	       formantType == KlattGrid_FRICATION_FORMANTS ? & (my frication -> frication_formants_amplitudes) :
-	       formantType == KlattGrid_TRACHEAL_FORMANTS ? & (my coupling -> tracheal_formants_amplitudes) : NULL;
+	       formantType == KlattGrid_TRACHEAL_FORMANTS ? & (my coupling -> tracheal_formants_amplitudes) : nullptr;
 }
 
 #define KlattGrid_QUERY_ADD_REMOVE(Name) \
 double KlattGrid_get##Name##AtTime (KlattGrid me, int formantType, long iformant, double t) \
 { \
-	FormantGrid *fg = KlattGrid_getAddressOfFormantGrid (me, formantType); \
-	return FormantGrid_get##Name##AtTime ((FormantGrid) *fg, iformant, t); \
+	autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, formantType); \
+	return FormantGrid_get##Name##AtTime (fg->get(), iformant, t); \
 } \
 void KlattGrid_add##Name##Point (KlattGrid me, int formantType, long iformant, double t, double value) \
 { \
-	FormantGrid *fg = KlattGrid_getAddressOfFormantGrid (me, formantType); \
-	FormantGrid_add##Name##Point ((FormantGrid) *fg, iformant, t, value); \
+	autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, formantType); \
+	FormantGrid_add##Name##Point (fg->get(), iformant, t, value); \
 } \
 void KlattGrid_remove##Name##Points (KlattGrid me, int formantType, long iformant, double t1, double t2) \
 { \
-	FormantGrid *fg = KlattGrid_getAddressOfFormantGrid (me, formantType); \
-	FormantGrid_remove##Name##PointsBetween ((FormantGrid) *fg, iformant, t1, t2); \
+	autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, formantType); \
+	FormantGrid_remove##Name##PointsBetween (fg->get(), iformant, t1, t2); \
 }
 
 // 6 functions
 KlattGrid_QUERY_ADD_REMOVE (Formant)
 KlattGrid_QUERY_ADD_REMOVE (Bandwidth)
 
-void KlattGrid_formula_frequencies (KlattGrid me, int formantType, const wchar_t *expression, Interpreter interpreter) {
-	FormantGrid *fg = KlattGrid_getAddressOfFormantGrid (me, formantType);
-	FormantGrid_formula_frequencies (*fg, expression, interpreter, 0);
+void KlattGrid_formula_frequencies (KlattGrid me, int formantType, const char32 *expression, Interpreter interpreter) {
+	autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, formantType);
+	FormantGrid_formula_frequencies (fg->get(), expression, interpreter, 0);
 }
 
-void KlattGrid_formula_bandwidths (KlattGrid me, int formantType, const wchar_t *expression, Interpreter interpreter) {
-	FormantGrid *fg = KlattGrid_getAddressOfFormantGrid (me, formantType);
-	FormantGrid_formula_bandwidths (*fg, expression, interpreter, 0);
+void KlattGrid_formula_bandwidths (KlattGrid me, int formantType, const char32 *expression, Interpreter interpreter) {
+	autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, formantType);
+	FormantGrid_formula_bandwidths (fg->get(), expression, interpreter, 0);
 }
 
-void KlattGrid_formula_amplitudes (KlattGrid me, int formantType, const wchar_t *expression, Interpreter interpreter) {
+void KlattGrid_formula_amplitudes (KlattGrid me, int formantType, const char32 *expression, Interpreter interpreter) {
 	try {
 		Ordered *ordered = KlattGrid_getAddressOfAmplitudes (me, formantType);
-		Formula_compile (interpreter, *ordered, expression, kFormula_EXPRESSION_TYPE_NUMERIC, TRUE);
+		Formula_compile (interpreter, *ordered, expression, kFormula_EXPRESSION_TYPE_NUMERIC, true);
 		for (long irow = 1; irow <= (*ordered) -> size; irow++) {
 			RealTier amplitudes = (RealTier) (*ordered) -> item[irow];
 			for (long icol = 1; icol <= amplitudes -> points -> size; icol++) {
 				struct Formula_Result result;
 				Formula_run (irow, icol, & result);
 				if (result. result.numericResult == NUMundefined) {
-					Melder_throw ("Cannot put an undefined value into the tier.\nFormula not finished.");
+					Melder_throw (U"Cannot put an undefined value into the tier.\nFormula not finished.");
 				}
 				( (RealPoint) amplitudes -> points -> item [icol]) -> value = result. result.numericResult;
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": formula not finished on amplitudes.");
+		Melder_throw (me, U": formula not finished on amplitudes.");
 	}
 }
 
@@ -2454,7 +2454,7 @@ double KlattGrid_getAmplitudeAtTime (KlattGrid me, int formantType, long iforman
 void KlattGrid_addAmplitudePoint (KlattGrid me, int formantType, long iformant, double t, double value) {
 	Ordered *ordered = KlattGrid_getAddressOfAmplitudes (me, formantType);
 	if (iformant < 0 || iformant > (*ordered) -> size) {
-		Melder_throw (L"Formant amplitude tier ", Melder_integer (iformant), "does not exist.");
+		Melder_throw (U"Formant amplitude tier ", iformant, U"does not exist.");
 	}
 	RealTier_addPoint ( (RealTier) (*ordered) -> item[iformant], t, value);
 }
@@ -2467,64 +2467,62 @@ void KlattGrid_removeAmplitudePoints (KlattGrid me, int formantType, long iforma
 	AnyTier_removePointsBetween ( (*ordered) -> item[iformant], t1, t2);
 }
 
-IntensityTier KlattGrid_extractAmplitudeTier (KlattGrid me, int formantType, long iformant) {
+autoIntensityTier KlattGrid_extractAmplitudeTier (KlattGrid me, int formantType, long iformant) {
 	try {
 		Ordered *ordered = KlattGrid_getAddressOfAmplitudes (me, formantType);
 		if (iformant < 0 || iformant > (*ordered) ->size) {
-			Melder_throw ("Formant amplitude tier ", Melder_integer (iformant), " does not exist.");
+			Melder_throw (U"Formant amplitude tier ", iformant, U" does not exist.");
 		}
 		autoIntensityTier thee = Data_copy ( (IntensityTier) (*ordered) -> item[iformant]);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no IntensityTier extracted.");
+		Melder_throw (me, U": no IntensityTier extracted.");
 	}
 }
 
 void KlattGrid_replaceAmplitudeTier (KlattGrid me, int formantType, long iformant, IntensityTier thee) {
 	try {
 		if (my xmin != thy xmin || my xmax != thy xmax) {
-			Melder_throw ("Domains must be equal");
+			Melder_throw (U"Domains must be equal");
 		}
 		Ordered *ordered = KlattGrid_getAddressOfAmplitudes (me, formantType);
 		if (iformant < 0 || iformant > (*ordered) -> size) {
-			Melder_throw ("Formant amplitude tier ", Melder_integer (iformant)," does not exist.");
+			Melder_throw (U"Formant amplitude tier ", iformant, U" does not exist.");
 		}
 		autoIntensityTier any = Data_copy (thee);
 		forget ( ( (Thing *) (*ordered) -> item) [iformant]);
 		(*ordered) -> item[iformant] = any.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no ampitude tier replaced.");
+		Melder_throw (me, U": no ampitude tier replaced.");
 	}
 }
 
-FormantGrid KlattGrid_extractFormantGrid (KlattGrid me, int formantType) {
+autoFormantGrid KlattGrid_extractFormantGrid (KlattGrid me, int formantType) {
 	try {
-		FormantGrid *fg =  KlattGrid_getAddressOfFormantGrid (me, formantType);
-		autoFormantGrid thee = Data_copy (*fg);
-		return thee.transfer();
+		autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, formantType);
+		autoFormantGrid thee = Data_copy (fg->get());
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no FormantGrid extracted.");
+		Melder_throw (me, U": no FormantGrid extracted.");
 	}
 }
 
 void KlattGrid_replaceFormantGrid (KlattGrid me, int formantType, FormantGrid thee) {
 	try {
 		if (my xmin != thy xmin || my xmax != thy xmax) {
-			Melder_throw ("Domains must be equal");
+			Melder_throw (U"Domains must be equal");
 		}
-		FormantGrid *fg =  KlattGrid_getAddressOfFormantGrid (me, formantType);
-		autoFormantGrid any = Data_copy (thee);
-		forget (*fg);
-		*fg = any.transfer();
+		autoFormantGrid *fg = KlattGrid_getAddressOfFormantGrid (me, formantType);
+		*fg = Data_copy (thee);
 	} catch (MelderError) {
-		Melder_throw (me, ": no FormantGrid replaced.");
+		Melder_throw (me, U": no FormantGrid replaced.");
 	}
 }
 
 void KlattGrid_addFormantAmplitudeTier (KlattGrid me, int formantType, long position) {
 	try {
 		if (formantType == KlattGrid_NASAL_ANTIFORMANTS || formantType == KlattGrid_TRACHEAL_ANTIFORMANTS || formantType == KlattGrid_DELTA_FORMANTS) {
-			Melder_throw (L"Cannot add amplitude tier to this formant type.");
+			Melder_throw (U"Cannot add amplitude tier to this formant type.");
 		}
 		Ordered *ordered = KlattGrid_getAddressOfAmplitudes (me, formantType);
 		long noa = (*ordered) -> size;
@@ -2534,21 +2532,21 @@ void KlattGrid_addFormantAmplitudeTier (KlattGrid me, int formantType, long posi
 		autoIntensityTier it = IntensityTier_create (my xmin, my xmax);
 		Ordered_addItemPos ( (*ordered), it.transfer(), position);
 	} catch (MelderError) {
-		Melder_throw (me, ": no formant amplitude tier added.");
+		Melder_throw (me, U": no formant amplitude tier added.");
 	}
 }
 
 void KlattGrid_removeFormantAmplitudeTier (KlattGrid me, int formantType, long position) {
 	try {
 		if (formantType == KlattGrid_NASAL_ANTIFORMANTS || formantType == KlattGrid_TRACHEAL_ANTIFORMANTS || formantType == KlattGrid_DELTA_FORMANTS) {
-			Melder_throw (L"Cannot remove amplitude tier from this formant type.");
+			Melder_throw (U"Cannot remove amplitude tier from this formant type.");
 		}
 		Ordered *ordered = KlattGrid_getAddressOfAmplitudes (me, formantType);
 		if (position > 0 && position <= (*ordered) -> size) {
 			Collection_removeItem (*ordered, position);
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no formant amplitude tier removed.");
+		Melder_throw (me, U": no formant amplitude tier removed.");
 	}
 }
 
@@ -2556,9 +2554,9 @@ void KlattGrid_removeFormantAmplitudeTier (KlattGrid me, int formantType, long p
 // We do this intwo separate steps now
 void KlattGrid_addFormant (KlattGrid me, int formantType, long position) {
 	try {
-		FormantGrid *fg =  KlattGrid_getAddressOfFormantGrid (me, formantType);
-		if (*fg == 0) {
-			Melder_throw (L"Formant type ",  formantType, " does not exist.");
+		autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, formantType);
+		if (! *fg) {
+			Melder_throw (U"Formant type ", formantType, U" does not exist.");
 		}
 
 		long nof = (*fg) -> formants -> size;
@@ -2568,36 +2566,36 @@ void KlattGrid_addFormant (KlattGrid me, int formantType, long position) {
 
 		if (formantType == KlattGrid_NASAL_ANTIFORMANTS || formantType == KlattGrid_TRACHEAL_ANTIFORMANTS ||
 		        formantType == KlattGrid_DELTA_FORMANTS) {
-			FormantGrid_addFormantAndBandwidthTiers (*fg, position);
+			FormantGrid_addFormantAndBandwidthTiers (fg->get(), position);
 			return;
 		}
 
 		Ordered *ordered = KlattGrid_getAddressOfAmplitudes (me, formantType);
 		long noa = (*ordered) -> size;
 		if (nof != noa) {
-			Melder_throw ("The number of formants (",  nof, ") and the number of amplitudes (", noa, ") must be equal.");
+			Melder_throw (U"The number of formants (",  nof, U") and the number of amplitudes (", noa, U") must be equal.");
 		}
-		FormantGrid_addFormantAndBandwidthTiers (*fg, position);
+		FormantGrid_addFormantAndBandwidthTiers (fg->get(), position);
 		try {
 			autoIntensityTier it = IntensityTier_create (my xmin, my xmax);
 			Ordered_addItemPos ( (*ordered), it.transfer(), position);
 		} catch (MelderError) { // restore original
-			FormantGrid_removeFormantAndBandwidthTiers (*fg, position);
+			FormantGrid_removeFormantAndBandwidthTiers (fg->get(), position);
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no formant added.");
+		Melder_throw (me, U": no formant added.");
 	}
 }
 
 void KlattGrid_removeFormant (KlattGrid me, int formantType, long position) {
-	FormantGrid *fg =  KlattGrid_getAddressOfFormantGrid (me, formantType);
+	autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, formantType);
 	long nof = (*fg) -> formants -> size;
 	if (formantType == KlattGrid_NASAL_ANTIFORMANTS || formantType == KlattGrid_TRACHEAL_ANTIFORMANTS ||
         formantType == KlattGrid_DELTA_FORMANTS) {
 		if (position < 1 || position > nof) {
 			return;
 		}
-		FormantGrid_removeFormantAndBandwidthTiers (*fg, position);
+		FormantGrid_removeFormantAndBandwidthTiers (fg->get(), position);
 	} else { 
 		// oral & nasal & tracheal formants can have amplitudes
 		// only remove a formant and its amplitude tier if number of formants and amplitudes are the same
@@ -2605,184 +2603,178 @@ void KlattGrid_removeFormant (KlattGrid me, int formantType, long position) {
 		long noa = (*ordered) -> size;
 		if (position < 1 || position > nof || position > noa) {
 			if (nof != noa) {
-				Melder_warning ("The number of formant tiers (", Melder_integer (nof), ") and the number of amplitude tiers (", 
-					Melder_integer (noa), ") don't match. Nothing removed.");
+				Melder_warning (U"The number of formant tiers (", nof, U") and the number of amplitude tiers (",
+					noa, U") don't match. Nothing removed.");
 			}
 			return;
 		}
-		FormantGrid_removeFormantAndBandwidthTiers (*fg, position);
+		FormantGrid_removeFormantAndBandwidthTiers (fg->get(), position);
 		Collection_removeItem (*ordered, position);
 	}
 }
 
 void KlattGrid_addFormantFrequencyAndBandwidthTiers (KlattGrid me, int formantType, long position) {
-	FormantGrid *fg =  KlattGrid_getAddressOfFormantGrid (me, formantType);
-	FormantGrid_addFormantAndBandwidthTiers (*fg, position);
+	autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, formantType);
+	FormantGrid_addFormantAndBandwidthTiers (fg->get(), position);
 }
 
 void KlattGrid_removeFormantFrequencyAndBandwidthTiers (KlattGrid me, int formantType, long position) {
-	FormantGrid *fg =  KlattGrid_getAddressOfFormantGrid (me, formantType);
-	FormantGrid_removeFormantAndBandwidthTiers (*fg, position);
+	autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, formantType);
+	FormantGrid_removeFormantAndBandwidthTiers (fg->get(), position);
 }
 
 double KlattGrid_getDeltaFormantAtTime (KlattGrid me, long iformant, double t) {
-	return FormantGrid_getFormantAtTime (my coupling -> delta_formants, iformant, t);
+	return FormantGrid_getFormantAtTime (my coupling -> delta_formants.get(), iformant, t);
 }
 void KlattGrid_addDeltaFormantPoint (KlattGrid me, long iformant, double t, double value) {
-	FormantGrid_addFormantPoint (my coupling -> delta_formants, iformant, t, value);
+	FormantGrid_addFormantPoint (my coupling -> delta_formants.get(), iformant, t, value);
 }
 void KlattGrid_removeDeltaFormantPoints (KlattGrid me, long iformant, double t1, double t2) {
-	FormantGrid_removeFormantPointsBetween (my coupling -> delta_formants, iformant, t1, t2);
+	FormantGrid_removeFormantPointsBetween (my coupling -> delta_formants.get(), iformant, t1, t2);
 }
 double KlattGrid_getDeltaBandwidthAtTime (KlattGrid me, long iformant, double t) {
-	return FormantGrid_getBandwidthAtTime (my coupling -> delta_formants, iformant, t);
+	return FormantGrid_getBandwidthAtTime (my coupling -> delta_formants.get(), iformant, t);
 }
 void KlattGrid_addDeltaBandwidthPoint (KlattGrid me, long iformant, double t, double value) {
-	FormantGrid_addBandwidthPoint (my coupling -> delta_formants, iformant, t, value);
+	FormantGrid_addBandwidthPoint (my coupling -> delta_formants.get(), iformant, t, value);
 }
 void KlattGrid_removeDeltaBandwidthPoints (KlattGrid me, long iformant, double t1, double t2) {
-	FormantGrid_removeBandwidthPointsBetween (my coupling -> delta_formants, iformant, t1, t2);
+	FormantGrid_removeBandwidthPointsBetween (my coupling -> delta_formants.get(), iformant, t1, t2);
 }
 
-FormantGrid KlattGrid_extractDeltaFormantGrid (KlattGrid me) {
+autoFormantGrid KlattGrid_extractDeltaFormantGrid (KlattGrid me) {
 	try {
-		FormantGrid *fg =  KlattGrid_getAddressOfFormantGrid (me, KlattGrid_DELTA_FORMANTS);
-		autoFormantGrid thee = Data_copy (*fg);
-		return thee.transfer();
+		autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, KlattGrid_DELTA_FORMANTS);
+		autoFormantGrid thee = Data_copy (fg->get());
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no delta FormantGrid extracted.");
+		Melder_throw (me, U": no delta FormantGrid extracted.");
 	}
 }
 
 void KlattGrid_replaceDeltaFormantGrid (KlattGrid me, FormantGrid thee) {
 	try {
 		if (my xmin != thy xmin || my xmax != thy xmax) {
-			Melder_throw ("Domains must be equal");
+			Melder_throw (U"Domains must be equal");
 		}
-		FormantGrid *fg =  KlattGrid_getAddressOfFormantGrid (me, KlattGrid_DELTA_FORMANTS);
+		autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (me, KlattGrid_DELTA_FORMANTS);
 		autoFormantGrid him = Data_copy (thee);
-		forget (*fg);
-		*fg = him.transfer();
+		*fg = him.move();
 	} catch (MelderError) {
-		Melder_throw (me, ": no delta FormantGrid replaced.");
+		Melder_throw (me, U": no delta FormantGrid replaced.");
 	}
 }
 
-FormantGrid KlattGrid_to_oralFormantGrid_openPhases (KlattGrid me, double fadeFraction) {
+autoFormantGrid KlattGrid_to_oralFormantGrid_openPhases (KlattGrid me, double fadeFraction) {
 	try {
 		if (my vocalTract -> oral_formants -> formants -> size == 0 && my vocalTract -> oral_formants -> bandwidths -> size == 0) {
-			Melder_throw ("Formant grid is empty.");
+			Melder_throw (U"Formant grid is empty.");
 		}
 		if (fadeFraction < 0) {
 			fadeFraction = 0;
 		}
 		if (fadeFraction >= 0.5) {
-			Melder_throw ("Fade fraction must be smaller than 0.5");
+			Melder_throw (U"Fade fraction must be smaller than 0.5");
 		}
 		my coupling -> options -> fadeFraction = fadeFraction;
-		autoFormantGrid thee = Data_copy ( (FormantGrid) my vocalTract -> oral_formants);
+		autoFormantGrid thee = Data_copy ( (FormantGrid) my vocalTract -> oral_formants.get());
 		KlattGrid_setGlottisCoupling (me);
-		FormantGrid_CouplingGrid_updateOpenPhases (thee.peek(), my coupling);
-		return thee.transfer();
+		FormantGrid_CouplingGrid_updateOpenPhases (thee.peek(), my coupling.get());
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no \"open phase\" oral FormantGrid created.");
+		Melder_throw (me, U": no \"open phase\" oral FormantGrid created.");
 	}
 }
 
-PointProcess KlattGrid_extractPointProcess_glottalClosures (KlattGrid me) {
+autoPointProcess KlattGrid_extractPointProcess_glottalClosures (KlattGrid me) {
 	try {
 		// Update PhonationTier
-		autoPhonationTier pt = PhonationGrid_to_PhonationTier (my phonation);
+		autoPhonationTier pt = PhonationGrid_to_PhonationTier (my phonation.get());
 		autoPointProcess thee = PhonationTier_to_PointProcess_closures (pt.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no glottal closure points extracted.");
+		Melder_throw (me, U": no glottal closure points extracted.");
 	}
 }
 
 double KlattGrid_getFricationAmplitudeAtTime (KlattGrid me, double t) {
-	return RealTier_getValueAtTime (my frication -> fricationAmplitude, t);
+	return RealTier_getValueAtTime (my frication -> fricationAmplitude.get(), t);
 }
 
 void KlattGrid_addFricationAmplitudePoint (KlattGrid me, double t, double value) {
-	RealTier_addPoint (my frication -> fricationAmplitude, t, value);
+	RealTier_addPoint (my frication -> fricationAmplitude.get(), t, value);
 }
 
 void KlattGrid_removeFricationAmplitudePoints (KlattGrid me, double t1, double t2) {
-	AnyTier_removePointsBetween (my frication -> fricationAmplitude, t1, t2);
+	AnyTier_removePointsBetween (my frication -> fricationAmplitude.get(), t1, t2);
 }
 
-IntensityTier KlattGrid_extractFricationAmplitudeTier (KlattGrid me) {
-	return Data_copy (my frication -> fricationAmplitude);
+autoIntensityTier KlattGrid_extractFricationAmplitudeTier (KlattGrid me) {
+	return Data_copy (my frication -> fricationAmplitude.get());
 }
 
 void KlattGrid_replaceFricationAmplitudeTier (KlattGrid me, IntensityTier thee) {
 	try {
 		if (my xmin != thy xmin || my xmax != thy xmax) {
-			Melder_throw ("Domains must be equal");
+			Melder_throw (U"Domains must be equal");
 		}
-		autoIntensityTier him = Data_copy (thee);
-		forget (my frication -> fricationAmplitude);
-		my frication -> fricationAmplitude = him.transfer();
+		my frication -> fricationAmplitude = Data_copy (thee);
 	} catch (MelderError) {
-		Melder_throw (me, ": no frication amplitude tier replaced.");
+		Melder_throw (me, U": no frication amplitude tier replaced.");
 	}
 }
 
 double KlattGrid_getFricationBypassAtTime (KlattGrid me, double t) {
-	return RealTier_getValueAtTime (my frication -> bypass, t);
+	return RealTier_getValueAtTime (my frication -> bypass.get(), t);
 }
 
 void KlattGrid_addFricationBypassPoint (KlattGrid me, double t, double value) {
-	RealTier_addPoint (my frication -> bypass, t, value);
+	RealTier_addPoint (my frication -> bypass.get(), t, value);
 }
 
 void KlattGrid_removeFricationBypassPoints (KlattGrid me, double t1, double t2) {
-	AnyTier_removePointsBetween (my frication -> bypass, t1, t2);
+	AnyTier_removePointsBetween (my frication -> bypass.get(), t1, t2);
 }
 
-IntensityTier KlattGrid_extractFricationBypassTier (KlattGrid me) {
-	return Data_copy (my frication -> bypass);
+autoIntensityTier KlattGrid_extractFricationBypassTier (KlattGrid me) {
+	return Data_copy (my frication -> bypass.get());
 }
 
 void KlattGrid_replaceFricationBypassTier (KlattGrid me, IntensityTier thee) {
 	try {
 		if (my xmin != thy xmin || my xmax != thy xmax) {
-			Melder_throw ("Domains must be equal");
+			Melder_throw (U"Domains must be equal");
 		}
-		autoIntensityTier him = Data_copy (thee);
-		forget (my frication -> bypass);
-		my frication -> bypass = him.transfer();
+		my frication -> bypass = Data_copy (thee);
 	} catch (MelderError) {
-		Melder_throw (me, ": no frication bypass tier replaced.");
+		Melder_throw (me, U": no frication bypass tier replaced.");
 	}
 }
 
 void KlattGrid_setGlottisCoupling (KlattGrid me) {
 	try {
-		forget (my coupling -> glottis);
-		my coupling -> glottis = PhonationGrid_to_PhonationTier (my phonation);
+		my coupling -> glottis = PhonationGrid_to_PhonationTier (my phonation.get());
 		if (my coupling -> glottis == 0) {
-			Melder_throw ("Empty phonation tier.");
+			Melder_throw (U"Empty phonation tier.");
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no coupling could be set.");
+		Melder_throw (me, U": no coupling could be set.");
 	}
 }
 
-Sound KlattGrid_to_Sound_aspiration (KlattGrid me, double samplingFrequency) {
-	return PhonationGrid_to_Sound_aspiration (my phonation, samplingFrequency);
+autoSound KlattGrid_to_Sound_aspiration (KlattGrid me, double samplingFrequency) {
+	return PhonationGrid_to_Sound_aspiration (my phonation.get(), samplingFrequency);
 }
 
-Sound KlattGrid_to_Sound_phonation (KlattGrid me) {
-	return PhonationGrid_to_Sound (my phonation, 0, my options -> samplingFrequency);
+autoSound KlattGrid_to_Sound_phonation (KlattGrid me) {
+	return PhonationGrid_to_Sound (my phonation.get(), 0, my options -> samplingFrequency);
 }
 
-Sound KlattGrid_to_Sound (KlattGrid me) {
+autoSound KlattGrid_to_Sound (KlattGrid me) {
 	try {
-		autoSound thee = 0;
-		PhonationGridPlayOptions pp = my phonation -> options;
-		FricationGridPlayOptions pf = my frication -> options;
+		autoSound thee;
+		PhonationGridPlayOptions pp = my phonation -> options.get();
+		FricationGridPlayOptions pf = my frication -> options.get();
 		double samplingFrequency = my options -> samplingFrequency;
 
 		if (pp -> voicing) {
@@ -2790,35 +2782,34 @@ Sound KlattGrid_to_Sound (KlattGrid me) {
 		}
 
 		if (pp -> aspiration || pp -> voicing) { // No vocal tract filtering if no glottal source signal present
-			autoSound source = PhonationGrid_to_Sound (my phonation, my coupling, samplingFrequency);
-
-			thee.reset (Sound_VocalTractGrid_CouplingGrid_filter (source.peek(), my vocalTract, my coupling));
+			autoSound source = PhonationGrid_to_Sound (my phonation.get(), my coupling.get(), samplingFrequency);
+			thee = Sound_VocalTractGrid_CouplingGrid_filter (source.peek(), my vocalTract.get(), my coupling.get());
 		}
 
 		if (pf -> endFricationFormant > 0 || pf -> bypass) {
-			autoSound frication = FricationGrid_to_Sound (my frication, samplingFrequency);
-			if (thee.peek() != 0) {
+			autoSound frication = FricationGrid_to_Sound (my frication.get(), samplingFrequency);
+			if (thee) {
 				_Sounds_add_inline (thee.peek(), frication.peek());
 			} else {
-				thee.reset (frication.transfer());
+				thee = frication.move();
 			}
 		}
 
-		if (thee.peek() == 0) {
-			thee.reset (Sound_createEmptyMono (my xmin, my xmax, samplingFrequency));
-		} else if (my options -> scalePeak) {
+		if (thee) {
 			Vector_scale (thee.peek(), 0.99);
+		} else if (my options -> scalePeak) {
+			thee = Sound_createEmptyMono (my xmin, my xmax, samplingFrequency);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Sound created.");
+		Melder_throw (me, U": no Sound created.");
 	}
 }
 
 void KlattGrid_playSpecial (KlattGrid me) {
 	try {
 		autoSound thee = KlattGrid_to_Sound (me);
-		KlattGridPlayOptions him = my options;
+		KlattGridPlayOptions him = my options.get();
 		if (his scalePeak) {
 			Vector_scale (thee.peek(), 0.99);
 		}
@@ -2828,7 +2819,7 @@ void KlattGrid_playSpecial (KlattGrid me) {
 		}
 		Sound_playPart (thee.peek(), his xmin, his xmax, 0, 0);
 	} catch (MelderError) {
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
@@ -2839,28 +2830,27 @@ void KlattGrid_play (KlattGrid me) {
 
 /************************* Sound(s) & KlattGrid **************************************************/
 
-Sound Sound_KlattGrid_filter_frication (Sound me, KlattGrid thee) {
-	return Sound_FricationGrid_filter (me, thy frication);
+autoSound Sound_KlattGrid_filter_frication (Sound me, KlattGrid thee) {
+	return Sound_FricationGrid_filter (me, thy frication.get());
 }
 
-Sound Sound_KlattGrid_filterByVocalTract (Sound me, KlattGrid thee, int filterModel) {
+autoSound Sound_KlattGrid_filterByVocalTract (Sound me, KlattGrid thee, int filterModel) {
 	try {
 		if (my xmin != thy xmin || my xmax != thy xmax) {
-			Melder_throw ("Domains must be equal.");
+			Melder_throw (U"Domains must be equal.");
 		}
 		KlattGrid_setDefaultPlayOptions (thee);
 		thy coupling -> options -> openglottis = 0; // don't trust openglottis info!
 		thy vocalTract -> options -> filterModel = filterModel;
-		autoSound him = Sound_VocalTractGrid_CouplingGrid_filter (me, thy vocalTract, thy coupling);
-		return him.transfer();
+		return Sound_VocalTractGrid_CouplingGrid_filter (me, thy vocalTract.get(), thy coupling.get());
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered by KlattGrid.");
+		Melder_throw (me, U": not filtered by KlattGrid.");
 	}
 }
 
 /******************* KlattTable to KlattGrid *********************/
 
-KlattGrid KlattTable_to_KlattGrid (KlattTable me, double frameDuration) {
+autoKlattGrid KlattTable_to_KlattGrid (KlattTable me, double frameDuration) {
 	try {
 		Table kt = (Table) me;
 
@@ -2888,7 +2878,7 @@ KlattGrid KlattTable_to_KlattGrid (KlattTable me, double frameDuration) {
 			long icol = 1;
 			double val = Table_getNumericValue_Assert (kt, irow, icol) / 10; // F0hz10
 			double f0 = val;
-			RealTier_addPoint (thy phonation -> pitch, t, f0);
+			RealTier_addPoint (thy phonation -> pitch.get(), t, f0);
 			icol++; val = Table_getNumericValue_Assert (kt, irow, icol); // AVdb
 			// dB values below 13 were put to zero in the DBtoLIN function
 			val -= 7;
@@ -2921,26 +2911,26 @@ KlattGrid KlattTable_to_KlattGrid (KlattTable me, double frameDuration) {
 			} else {
 				val += 20 * log10 (0.05) + dB_offset_noise;
 			}
-			RealTier_addPoint (thy phonation -> aspirationAmplitude, t, val);
+			RealTier_addPoint (thy phonation -> aspirationAmplitude.get(), t, val);
 			icol++; val = Table_getNumericValue_Assert (kt, irow, icol); // Kopen
 			double openPhase = f0 > 0 ? (val / 16000) * f0 : 0.7;
-			RealTier_addPoint (thy phonation -> openPhase, t, openPhase);
+			RealTier_addPoint (thy phonation -> openPhase.get(), t, openPhase);
 			icol++; val = Table_getNumericValue_Assert (kt, irow, icol); // Aturb breathinessAmplitude during voicing (max is 8192)
 			if (val < 13) {
 				val = dBNul;
 			} else {
 				val += 20 * log10 (0.1) + dB_offset_noise;
 			}
-			RealTier_addPoint (thy phonation -> breathinessAmplitude, t, val);
+			RealTier_addPoint (thy phonation -> breathinessAmplitude.get(), t, val);
 			icol++; val = Table_getNumericValue_Assert (kt, irow, icol); // TLTdb
-			RealTier_addPoint (thy phonation -> spectralTilt, t, val);
+			RealTier_addPoint (thy phonation -> spectralTilt.get(), t, val);
 			icol++; val = Table_getNumericValue_Assert (kt, irow, icol); // AF
 			if (val < 13) {
 				val = dBNul;
 			} else {
 				val += 20 * log10 (0.25) + dB_offset_noise;
 			}
-			RealTier_addPoint (thy frication -> fricationAmplitude, t, val);
+			RealTier_addPoint (thy frication -> fricationAmplitude.get(), t, val);
 			icol++; val = Table_getNumericValue_Assert (kt, irow, icol); // Kskew ???
 			//RealTier_addPoint (, t, val);
 			for (long kf = 1; kf <= 6; kf++) {
@@ -2969,26 +2959,26 @@ KlattGrid KlattTable_to_KlattGrid (KlattTable me, double frameDuration) {
 			} else {
 				val += 20 * log10 (0.05) + dB_offset_noise;
 			}
-			RealTier_addPoint (thy frication -> bypass, t, val);
+			RealTier_addPoint (thy frication -> bypass.get(), t, val);
 
 			icol++; val = Table_getNumericValue_Assert (kt, irow, icol); // AVpdb
-			RealTier_addPoint (thy phonation -> voicingAmplitude, t, val + dB_offset_voicing);
+			RealTier_addPoint (thy phonation -> voicingAmplitude.get(), t, val + dB_offset_voicing);
 			icol++; val = Table_getNumericValue_Assert (kt, irow, icol); // Gain0
 			val -= 3; if (val <= 0) {
 				val = 57;
 			}
-			RealTier_addPoint (thy gain, t, val + dB_offset);
+			RealTier_addPoint (thy gain.get(), t, val + dB_offset);
 		}
 		// We don't need the following low-pass: we do not use oversampling !!
 		//RealTier_addPoint (thy tracheal_formants -> formants -> item[1], 0.5*(tmin+tmax), 0.095*samplingFrequency);
 		//RealTier_addPoint (thy tracheal_formants -> bandwidths -> item[1], 0.5*(tmin+tmax), 0.063*samplingFrequency);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no KlattGrid created.");
+		Melder_throw (me, U": no KlattGrid created.");
 	}
 }
 
-KlattGrid Sound_to_KlattGrid_simple (Sound me, double timeStep, long maximumNumberOfFormants, double maximumFormantFrequency, double windowLength, double preEmphasisFrequency, double minimumPitch, double maximumPitch, double pitchFloorIntensity, int subtractMean) {
+autoKlattGrid Sound_to_KlattGrid_simple (Sound me, double timeStep, long maximumNumberOfFormants, double maximumFormantFrequency, double windowLength, double preEmphasisFrequency, double minimumPitch, double maximumPitch, double pitchFloorIntensity, int subtractMean) {
 	try {
 		long numberOfFormants = maximumNumberOfFormants;
 		long numberOfNasalFormants = 1;
@@ -3012,9 +3002,9 @@ KlattGrid Sound_to_KlattGrid_simple (Sound me, double timeStep, long maximumNumb
 		KlattGrid_replacePitchTier (thee.peek(), ptier.peek());
 		KlattGrid_replaceFormantGrid (thee.peek(), KlattGrid_ORAL_FORMANTS, fgrid.peek());
 		KlattGrid_replaceVoicingAmplitudeTier (thee.peek(), itier.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no simple KlattGrid created.");
+		Melder_throw (me, U": no simple KlattGrid created.");
 	}
 }
 
diff --git a/dwtools/KlattGrid.h b/dwtools/KlattGrid.h
index b5b3de6..cbf54de 100644
--- a/dwtools/KlattGrid.h
+++ b/dwtools/KlattGrid.h
@@ -33,54 +33,55 @@
 #include "KlattTable.h"
 #include "Interpreter_decl.h"
 
+
 #include "KlattGrid_def.h"
-oo_CLASS_CREATE (PhonationPoint, Data);
+oo_CLASS_CREATE (PhonationPoint, Daata);
 oo_CLASS_CREATE (PhonationTier, Function);
-oo_CLASS_CREATE (PhonationGridPlayOptions, Data);
+oo_CLASS_CREATE (PhonationGridPlayOptions, Daata);
 oo_CLASS_CREATE (PhonationGrid, Function);
-oo_CLASS_CREATE (VocalTractGridPlayOptions, Data);
+oo_CLASS_CREATE (VocalTractGridPlayOptions, Daata);
 oo_CLASS_CREATE (VocalTractGrid, Function);
-oo_CLASS_CREATE (CouplingGridPlayOptions, Data);
+oo_CLASS_CREATE (CouplingGridPlayOptions, Daata);
 oo_CLASS_CREATE (CouplingGrid, Function);
-oo_CLASS_CREATE (FricationGridPlayOptions, Data);
+oo_CLASS_CREATE (FricationGridPlayOptions, Daata);
 oo_CLASS_CREATE (FricationGrid, Function);
-oo_CLASS_CREATE (KlattGridPlayOptions, Data);
+oo_CLASS_CREATE (KlattGridPlayOptions, Daata);
 oo_CLASS_CREATE (KlattGrid, Function);
 
 /******************** PhonationPoint & Tier ************************************/
 
-PhonationPoint PhonationPoint_create (double time, double period, double openPhase, double collisionPhase, double te,
+autoPhonationPoint PhonationPoint_create (double time, double period, double openPhase, double collisionPhase, double te,
 	double power1, double power2, double pulseScale);
 
-PhonationTier PhonationTier_create (double tmin, double tmax);
-PointProcess PhonationTier_to_PointProcess_closures (PhonationTier me);
+autoPhonationTier PhonationTier_create (double tmin, double tmax);
+autoPointProcess PhonationTier_to_PointProcess_closures (PhonationTier me);
 
 /************************ PhonationGrid *********************************************/
 
-PhonationGrid PhonationGrid_create (double tmin, double tmax);
-PhonationGridPlayOptions PhonationGridPlayOptions_create ();
+autoPhonationGrid PhonationGrid_create (double tmin, double tmax);
+autoPhonationGridPlayOptions PhonationGridPlayOptions_create ();
 void PhonationGrid_setNames (PhonationGrid me);
 
-Sound PhonationGrid_to_Sound_aspiration (PhonationGrid me, double samplingFrequency);
+autoSound PhonationGrid_to_Sound_aspiration (PhonationGrid me, double samplingFrequency);
 
 void PhonationGrid_draw (PhonationGrid me, Graphics g);
 
 double PhonationGrid_getMaximumPeriod (PhonationGrid me);
 
-PhonationTier PhonationGrid_to_PhonationTier (PhonationGrid me);
+autoPhonationTier PhonationGrid_to_PhonationTier (PhonationGrid me);
 
 /************************ VocalTractGrid *********************************************/
 
-VocalTractGrid VocalTractGrid_create (double tmin, double tmax, long numberOfFormants,
+autoVocalTractGrid VocalTractGrid_create (double tmin, double tmax, long numberOfFormants,
 	long numberOfNasalFormants,	long numberOfNasalAntiFormants);
-VocalTractGridPlayOptions VocalTractGridPlayOptions_create ();
+autoVocalTractGridPlayOptions VocalTractGridPlayOptions_create ();
 void VocalTractGrid_setNames (VocalTractGrid me);
 void VocalTractGrid_draw (VocalTractGrid me, Graphics g, int filterModel);
 
 /************************ CouplingGrid *********************************************/
 
-CouplingGrid CouplingGrid_create (double tmin, double tmax, long numberOfTrachealFormants, long numberOfTrachealAntiFormants, long numberOfDeltaFormants);
-CouplingGridPlayOptions CouplingGridPlayOptions_create ();
+autoCouplingGrid CouplingGrid_create (double tmin, double tmax, long numberOfTrachealFormants, long numberOfTrachealAntiFormants, long numberOfDeltaFormants);
+autoCouplingGridPlayOptions CouplingGridPlayOptions_create ();
 void CouplingGrid_setNames (CouplingGrid me);
 double CouplingGrid_getDeltaFormantAtTime (CouplingGrid me, long iformant, double t);
 double CouplingGrid_getDeltaBandwidthAtTime (CouplingGrid me, long iformant, double t);
@@ -94,34 +95,34 @@ void FormantGrid_CouplingGrid_updateOpenPhases (FormantGrid me, CouplingGrid the
 void Sound_FormantGrid_filterWithOneFormant_inline (Sound me, FormantGrid thee, long iformant);
 void Sound_FormantGrid_filterWithOneAntiFormant_inline (Sound me, FormantGrid thee, long iformant);
 void Sound_FormantGrid_Intensities_filterWithOneFormant_inline (Sound me, FormantGrid thee, Ordered amplitudes, long iformant);
-Sound Sound_FormantGrid_Intensities_filter (Sound me, FormantGrid thee, Ordered amplitudes, long iformantb, long iformante, int alternatingSign);
+autoSound Sound_FormantGrid_Intensities_filter (Sound me, FormantGrid thee, Ordered amplitudes, long iformantb, long iformante, int alternatingSign);
 
 /************************ FricationGrid *********************************************/
 
-FricationGrid FricationGrid_create (double tmin, double tmax, long numberOfFormants);
-FricationGridPlayOptions FricationGridPlayOptions_create ();
+autoFricationGrid FricationGrid_create (double tmin, double tmax, long numberOfFormants);
+autoFricationGridPlayOptions FricationGridPlayOptions_create ();
 void FricationGrid_setNames (FricationGrid me);
 void FricationGrid_draw (FricationGrid me, Graphics g);
 
-Sound FricationGrid_to_Sound (FricationGrid me, double samplingFrequency);
+autoSound FricationGrid_to_Sound (FricationGrid me, double samplingFrequency);
 
-Sound Sound_FricationGrid_filter (Sound me, FricationGrid thee);
+autoSound Sound_FricationGrid_filter (Sound me, FricationGrid thee);
 
 /************************ Sound & VocalTractGrid & CouplingGrid *********************************************/
 
-Sound Sound_VocalTractGrid_CouplingGrid_filter (Sound me, VocalTractGrid thee, CouplingGrid coupling);
+autoSound Sound_VocalTractGrid_CouplingGrid_filter (Sound me, VocalTractGrid thee, CouplingGrid coupling);
 
 /************************ KlattGrid *********************************************/
 
-KlattGrid KlattGrid_create (double tmin, double tmax, long numberOfFormants,
+autoKlattGrid KlattGrid_create (double tmin, double tmax, long numberOfFormants,
 	long numberOfNasalFormants, long numberOfNasalAntiFormants,
 	long numberOfTrachealFormants, long numberOfTrachealAntiFormants,
 	long numberOfFricationFormants, long numberOfDeltaFormants);
 
-KlattGrid KlattGrid_createExample ();
-KlattGridPlayOptions KlattGridPlayOptions_create ();
+autoKlattGrid KlattGrid_createExample ();
+autoKlattGridPlayOptions KlattGridPlayOptions_create ();
 void KlattGrid_setNames (KlattGrid me);
-KlattGrid KlattTable_to_KlattGrid (KlattTable me, double frameDuration);
+autoKlattGrid KlattTable_to_KlattGrid (KlattTable me, double frameDuration);
 
 void KlattGrid_draw (KlattGrid me, Graphics g, int filterModel);
 void klattGrid_drawPhonation (KlattGrid me, Graphics g);
@@ -143,7 +144,7 @@ void KlattGrid_drawVocalTract (KlattGrid me, Graphics g, int filterModel, int wi
 double KlattGrid_get##Name##AtTime (KlattGrid me, double t); \
 void KlattGrid_add##Name##Point (KlattGrid me, double t, double value); \
 void KlattGrid_remove##Name##Points (KlattGrid me, double t1, double t2); \
-tierType KlattGrid_extract##Name##Tier (KlattGrid me); \
+auto##tierType KlattGrid_extract##Name##Tier (KlattGrid me); \
 void KlattGrid_replace##Name##Tier (KlattGrid me, tierType thee);
 
 // Generate 55 prototypes
@@ -171,40 +172,40 @@ void KlattGrid_removeDelta##Name##Points (KlattGrid me, long iformant, double t1
 KlattGrid_QUERY_ADD_REMOVE_PROTO(Formant)
 KlattGrid_QUERY_ADD_REMOVE_PROTO(Bandwidth)
 
-void KlattGrid_formula_frequencies (KlattGrid me, int formantType, const wchar_t *expression, Interpreter interpreter);
-void KlattGrid_formula_bandwidths (KlattGrid me, int formantType, const wchar_t *expression, Interpreter interpreter);
-void KlattGrid_formula_amplitudes (KlattGrid me, int formantType, const wchar_t *expression, Interpreter interpreter);
+void KlattGrid_formula_frequencies (KlattGrid me, int formantType, const char32 *expression, Interpreter interpreter);
+void KlattGrid_formula_bandwidths (KlattGrid me, int formantType, const char32 *expression, Interpreter interpreter);
+void KlattGrid_formula_amplitudes (KlattGrid me, int formantType, const char32 *expression, Interpreter interpreter);
 
-FormantGrid KlattGrid_extractFormantGrid (KlattGrid me, int formantType);
+autoFormantGrid KlattGrid_extractFormantGrid (KlattGrid me, int formantType);
 void KlattGrid_replaceFormantGrid (KlattGrid me, int formantType, FormantGrid thee);
 
-FormantGrid KlattGrid_extractDeltaFormantGrid (KlattGrid me);
+autoFormantGrid KlattGrid_extractDeltaFormantGrid (KlattGrid me);
 void KlattGrid_replaceDeltaFormantGrid (KlattGrid me, FormantGrid thee);
 
-FormantGrid KlattGrid_to_oralFormantGrid_openPhases (KlattGrid me, double fadeFraction);
-PointProcess KlattGrid_extractPointProcess_glottalClosures (KlattGrid me);
+autoFormantGrid KlattGrid_to_oralFormantGrid_openPhases (KlattGrid me, double fadeFraction);
+autoPointProcess KlattGrid_extractPointProcess_glottalClosures (KlattGrid me);
 
 double KlattGrid_getAmplitudeAtTime (KlattGrid me, int formantType, long iformant, double t);
 void KlattGrid_addAmplitudePoint (KlattGrid me, int formantType, long iformant, double t, double value);
 void KlattGrid_removeAmplitudePoints (KlattGrid me, int formantType, long iformant, double t1, double t2);
-IntensityTier KlattGrid_extractAmplitudeTier (KlattGrid me, int formantType, long iformant);
+autoIntensityTier KlattGrid_extractAmplitudeTier (KlattGrid me, int formantType, long iformant);
 void KlattGrid_replaceAmplitudeTier (KlattGrid me, int formantType, long iformant, IntensityTier thee);
 
 double KlattGrid_getFricationAmplitudeAtTime (KlattGrid me, double t);
 void KlattGrid_addFricationAmplitudePoint (KlattGrid me, double t, double value);
 void KlattGrid_removeFricationAmplitudePoints (KlattGrid me, double t1, double t2);
-IntensityTier KlattGrid_extractFricationAmplitudeTier (KlattGrid me);
+autoIntensityTier KlattGrid_extractFricationAmplitudeTier (KlattGrid me);
 void KlattGrid_replaceFricationAmplitudeTier (KlattGrid me, IntensityTier thee);
 
 double KlattGrid_getFricationBypassAtTime (KlattGrid me, double t);
 void KlattGrid_addFricationBypassPoint (KlattGrid me, double t, double value);
 void KlattGrid_removeFricationBypassPoints (KlattGrid me, double t1, double t2);
-IntensityTier KlattGrid_extractFricationBypassTier (KlattGrid me);
+autoIntensityTier KlattGrid_extractFricationBypassTier (KlattGrid me);
 void KlattGrid_replaceFricationBypassTier (KlattGrid me, IntensityTier thee);
 
 void KlattGrid_setGlottisCoupling (KlattGrid me);
 
-FormantGrid * KlattGrid_getAddressOfFormantGrid (KlattGrid me, int formantType);
+autoFormantGrid * KlattGrid_getAddressOfFormantGrid (KlattGrid me, int formantType);
 Ordered * KlattGrid_getAddressOfAmplitudes (KlattGrid me, int formantType);
 
 // add/remove frequency + bandwidth (+amplitude) tiers
@@ -227,9 +228,9 @@ void KlattGrid_playSpecial (KlattGrid me);
 
 void KlattGrid_setDefaultPlayOptions (KlattGrid me);
 
-Sound KlattGrid_to_Sound (KlattGrid me);
+autoSound KlattGrid_to_Sound (KlattGrid me);
 
-Sound KlattGrid_to_Sound_phonation (KlattGrid me);
+autoSound KlattGrid_to_Sound_phonation (KlattGrid me);
 
 int KlattGrid_synthesize (KlattGrid me, double t1, double t2, double samplingFrequency, double maximumPeriod);
 
@@ -238,10 +239,10 @@ int KlattGrid_synthesize (KlattGrid me, double t1, double t2, double samplingFre
 	frication: noise before entering the parallel frication filter section.
 */
 
-Sound Sound_KlattGrid_filterByVocalTract (Sound me, KlattGrid thee, int filterModel);
+autoSound Sound_KlattGrid_filterByVocalTract (Sound me, KlattGrid thee, int filterModel);
 
-Sound Sound_KlattGrid_filter_frication (Sound me, KlattGrid thee);
+autoSound Sound_KlattGrid_filter_frication (Sound me, KlattGrid thee);
 
-KlattGrid Sound_to_KlattGrid_simple (Sound me, double timeStep, long maximumNumberOfFormants, double maximumFormantFrequency, double windowLength, double preEmphasisFrequency, double minimumPitch, double maximumPitch, double minimumPitchIntensity, int subtractMean);
+autoKlattGrid Sound_to_KlattGrid_simple (Sound me, double timeStep, long maximumNumberOfFormants, double maximumFormantFrequency, double windowLength, double preEmphasisFrequency, double minimumPitch, double maximumPitch, double minimumPitchIntensity, int subtractMean);
 
 #endif /* _KlattGrid_h_ */
diff --git a/dwtools/KlattGridEditors.cpp b/dwtools/KlattGridEditors.cpp
index 8186b1d..caac674 100644
--- a/dwtools/KlattGridEditors.cpp
+++ b/dwtools/KlattGridEditors.cpp
@@ -34,299 +34,299 @@ static void KlattGrid_Editor_defaultPlay (KlattGrid me, double tmin, double tmax
 	KlattGrid_playSpecial (me);
 }
 
-/************************** KlattGrid_realTierEditor *********************************/
+/************************** KlattGrid_RealTierEditor *********************************/
 
-Thing_implement (KlattGrid_realTierEditor, RealTierEditor, 0);
+Thing_implement (KlattGrid_RealTierEditor, RealTierEditor, 0);
 
 static void menu_cb_KlattGridHelp (EDITOR_ARGS) {
-	EDITOR_IAM (KlattGrid_realTierEditor);
-	Melder_help (L"KlattGrid");
+	EDITOR_IAM (KlattGrid_RealTierEditor);
+	Melder_help (U"KlattGrid");
 }
 
-void structKlattGrid_realTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
-	KlattGrid_realTierEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"KlattGrid help", 0, menu_cb_KlattGridHelp);
+void structKlattGrid_RealTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
+	KlattGrid_RealTierEditor_Parent :: v_createHelpMenuItems (menu);
+	EditorMenu_addCommand (menu, U"KlattGrid help", 0, menu_cb_KlattGridHelp);
 }
 
-void structKlattGrid_realTierEditor :: v_play (double ltmin, double ltmax) {
+void structKlattGrid_RealTierEditor :: v_play (double ltmin, double ltmax) {
 	KlattGrid_Editor_defaultPlay (klattgrid, ltmin, ltmax);
 }
 
-void KlattGrid_realTierEditor_init (KlattGrid_realTierEditor me, const wchar_t *title, KlattGrid klattgrid, RealTier data) {
+void KlattGrid_RealTierEditor_init (KlattGrid_RealTierEditor me, const char32 *title, KlattGrid klattgrid, RealTier data) {
 	my klattgrid = klattgrid;
 	RealTierEditor_init (me, title, data, 0, 0);
 }
 
-/************************** KlattGrid_pitchTierEditor *********************************/
+/************************** KlattGrid_PitchTierEditor *********************************/
 
-Thing_implement (KlattGrid_pitchTierEditor, KlattGrid_realTierEditor, 0);
+Thing_implement (KlattGrid_PitchTierEditor, KlattGrid_RealTierEditor, 0);
 
-static void menu_cb_KlattGrid_pitchTierEditorHelp (EDITOR_ARGS) {
-	EDITOR_IAM (KlattGrid_pitchTierEditor); Melder_help (L"PitchTierEditor");
+static void menu_cb_KlattGrid_PitchTierEditorHelp (EDITOR_ARGS) {
+	EDITOR_IAM (KlattGrid_PitchTierEditor); Melder_help (U"PitchTierEditor");
 }
 
 static void menu_cb_PitchTierHelp (EDITOR_ARGS) {
-	EDITOR_IAM (KlattGrid_pitchTierEditor); Melder_help (L"PitchTier");
+	EDITOR_IAM (KlattGrid_PitchTierEditor); Melder_help (U"PitchTier");
 }
 
-void structKlattGrid_pitchTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"PitchTierEditor help", 0, menu_cb_KlattGrid_pitchTierEditorHelp);
-	EditorMenu_addCommand (menu, L"PitchTier help", 0, menu_cb_PitchTierHelp);
+void structKlattGrid_PitchTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
+	EditorMenu_addCommand (menu, U"PitchTierEditor help", 0, menu_cb_KlattGrid_PitchTierEditorHelp);
+	EditorMenu_addCommand (menu, U"PitchTier help", 0, menu_cb_PitchTierHelp);
 }
 
-KlattGrid_pitchTierEditor KlattGrid_pitchTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_PitchTierEditor KlattGrid_PitchTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_pitchTierEditor me = Thing_new (KlattGrid_pitchTierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> pitch;
-		KlattGrid_realTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_PitchTierEditor me = Thing_new (KlattGrid_PitchTierEditor);
+		RealTier tier = klattgrid -> phonation -> pitch.get();
+		KlattGrid_RealTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid pitch window not created.");
+		Melder_throw (U"KlattGrid pitch window not created.");
 	}
 }
 
-/************************** KlattGrid_intensityTierEditor *********************************/
+/************************** KlattGrid_IntensityTierEditor *********************************/
 
-Thing_implement (KlattGrid_intensityTierEditor, KlattGrid_realTierEditor, 0);
+Thing_implement (KlattGrid_IntensityTierEditor, KlattGrid_RealTierEditor, 0);
 
 static void menu_cb_IntensityTierHelp (EDITOR_ARGS) {
-	EDITOR_IAM (KlattGrid_intensityTierEditor);
-	Melder_help (L"IntensityTier");
+	EDITOR_IAM (KlattGrid_IntensityTierEditor);
+	Melder_help (U"IntensityTier");
 }
 
-void structKlattGrid_intensityTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
-	KlattGrid_intensityTierEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"IntensityTier help", 0, menu_cb_IntensityTierHelp);
+void structKlattGrid_IntensityTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
+	KlattGrid_IntensityTierEditor_Parent :: v_createHelpMenuItems (menu);
+	EditorMenu_addCommand (menu, U"IntensityTier help", 0, menu_cb_IntensityTierHelp);
 }
 
-void KlattGrid_intensityTierEditor_init (KlattGrid_intensityTierEditor me, const wchar_t *title, KlattGrid klattgrid, RealTier tier) {
-	KlattGrid_realTierEditor_init (me, title, klattgrid, tier);
+void KlattGrid_IntensityTierEditor_init (KlattGrid_IntensityTierEditor me, const char32 *title, KlattGrid klattgrid, RealTier tier) {
+	KlattGrid_RealTierEditor_init (me, title, klattgrid, tier);
 }
 
 
 /************************** KlattGrid_DecibelTierEditor *********************************/
 
-Thing_implement (KlattGrid_decibelTierEditor, KlattGrid_intensityTierEditor, 0);
+Thing_implement (KlattGrid_DecibelTierEditor, KlattGrid_IntensityTierEditor, 0);
 
-KlattGrid_decibelTierEditor KlattGrid_decibelTierEditor_create (const wchar_t *title, KlattGrid klattgrid, RealTier tier) {
+autoKlattGrid_DecibelTierEditor KlattGrid_DecibelTierEditor_create (const char32 *title, KlattGrid klattgrid, RealTier tier) {
 	try {
-		autoKlattGrid_decibelTierEditor me = Thing_new (KlattGrid_decibelTierEditor);
-		KlattGrid_intensityTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_DecibelTierEditor me = Thing_new (KlattGrid_DecibelTierEditor);
+		KlattGrid_IntensityTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid decibel window not created.");
+		Melder_throw (U"KlattGrid decibel window not created.");
 	}
 }
 
-/************************** KlattGrid_voicingAmplitudeTierEditor *********************************/
+/************************** KlattGrid_VoicingAmplitudeTierEditor *********************************/
 
-Thing_implement (KlattGrid_voicingAmplitudeTierEditor, KlattGrid_intensityTierEditor, 0);
+Thing_implement (KlattGrid_VoicingAmplitudeTierEditor, KlattGrid_IntensityTierEditor, 0);
 
-KlattGrid_voicingAmplitudeTierEditor KlattGrid_voicingAmplitudeTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_VoicingAmplitudeTierEditor KlattGrid_VoicingAmplitudeTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_voicingAmplitudeTierEditor me = Thing_new (KlattGrid_voicingAmplitudeTierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> voicingAmplitude;
-		KlattGrid_intensityTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_VoicingAmplitudeTierEditor me = Thing_new (KlattGrid_VoicingAmplitudeTierEditor);
+		RealTier tier = klattgrid -> phonation -> voicingAmplitude.get();
+		KlattGrid_IntensityTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid voicing amplitude window not created.");
+		Melder_throw (U"KlattGrid voicing amplitude window not created.");
 	}
 }
 
-/************************** KlattGrid_aspirationAmplitudeTierEditor *********************************/
+/************************** KlattGrid_AspirationAmplitudeTierEditor *********************************/
 
-Thing_implement (KlattGrid_aspirationAmplitudeTierEditor, KlattGrid_intensityTierEditor, 0);
+Thing_implement (KlattGrid_AspirationAmplitudeTierEditor, KlattGrid_IntensityTierEditor, 0);
 
-KlattGrid_aspirationAmplitudeTierEditor KlattGrid_aspirationAmplitudeTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_AspirationAmplitudeTierEditor KlattGrid_AspirationAmplitudeTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_aspirationAmplitudeTierEditor me = Thing_new (KlattGrid_aspirationAmplitudeTierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> aspirationAmplitude;
-		KlattGrid_intensityTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_AspirationAmplitudeTierEditor me = Thing_new (KlattGrid_AspirationAmplitudeTierEditor);
+		RealTier tier = klattgrid -> phonation -> aspirationAmplitude.get();
+		KlattGrid_IntensityTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid aspiration amplitude window not created.");
+		Melder_throw (U"KlattGrid aspiration amplitude window not created.");
 	}
 }
 
-/************************** KlattGrid_breathinessAmplitudeTierEditor *********************************/
+/************************** KlattGrid_BreathinessAmplitudeTierEditor *********************************/
 
-Thing_implement (KlattGrid_breathinessAmplitudeTierEditor, KlattGrid_intensityTierEditor, 0);
+Thing_implement (KlattGrid_BreathinessAmplitudeTierEditor, KlattGrid_IntensityTierEditor, 0);
 
-KlattGrid_breathinessAmplitudeTierEditor KlattGrid_breathinessAmplitudeTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_BreathinessAmplitudeTierEditor KlattGrid_BreathinessAmplitudeTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_breathinessAmplitudeTierEditor me = Thing_new (KlattGrid_breathinessAmplitudeTierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> breathinessAmplitude;
-		KlattGrid_intensityTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_BreathinessAmplitudeTierEditor me = Thing_new (KlattGrid_BreathinessAmplitudeTierEditor);
+		RealTier tier = klattgrid -> phonation -> breathinessAmplitude.get();
+		KlattGrid_IntensityTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid breathiness amplitude window not created.");
+		Melder_throw (U"KlattGrid breathiness amplitude window not created.");
 	}
 }
 
-/************************** KlattGrid_spectralTiltTierEditor *********************************/
+/************************** KlattGrid_SpectralTiltTierEditor *********************************/
 
-Thing_implement (KlattGrid_spectralTiltTierEditor, KlattGrid_intensityTierEditor, 0);
+Thing_implement (KlattGrid_SpectralTiltTierEditor, KlattGrid_IntensityTierEditor, 0);
 
-KlattGrid_spectralTiltTierEditor KlattGrid_spectralTiltTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_SpectralTiltTierEditor KlattGrid_SpectralTiltTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_spectralTiltTierEditor me = Thing_new (KlattGrid_spectralTiltTierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> spectralTilt;
-		KlattGrid_intensityTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_SpectralTiltTierEditor me = Thing_new (KlattGrid_SpectralTiltTierEditor);
+		RealTier tier = klattgrid -> phonation -> spectralTilt.get();
+		KlattGrid_IntensityTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid spectral tilt window not created.");
+		Melder_throw (U"KlattGrid spectral tilt window not created.");
 	}
 }
 
-/************************** KlattGrid_fricationBypassTierEditor *********************************/
+/************************** KlattGrid_FricationBypassTierEditor *********************************/
 
-Thing_implement (KlattGrid_fricationBypassTierEditor, KlattGrid_intensityTierEditor, 0);
+Thing_implement (KlattGrid_FricationBypassTierEditor, KlattGrid_IntensityTierEditor, 0);
 
-KlattGrid_fricationBypassTierEditor KlattGrid_fricationBypassTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_FricationBypassTierEditor KlattGrid_FricationBypassTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_fricationBypassTierEditor me = Thing_new (KlattGrid_fricationBypassTierEditor);
-		RealTier tier = (RealTier) klattgrid -> frication -> bypass;
-		KlattGrid_intensityTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_FricationBypassTierEditor me = Thing_new (KlattGrid_FricationBypassTierEditor);
+		RealTier tier = klattgrid -> frication -> bypass.get();
+		KlattGrid_IntensityTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid frication bypass window not created.");
+		Melder_throw (U"KlattGrid frication bypass window not created.");
 	}
 }
 
-/************************** KlattGrid_fricationAmplitudeTierEditor *********************************/
+/************************** KlattGrid_FricationAmplitudeTierEditor *********************************/
 
-Thing_implement (KlattGrid_fricationAmplitudeTierEditor, KlattGrid_intensityTierEditor, 0);
+Thing_implement (KlattGrid_FricationAmplitudeTierEditor, KlattGrid_IntensityTierEditor, 0);
 
-KlattGrid_fricationAmplitudeTierEditor KlattGrid_fricationAmplitudeTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_FricationAmplitudeTierEditor KlattGrid_FricationAmplitudeTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_fricationAmplitudeTierEditor me = Thing_new (KlattGrid_fricationAmplitudeTierEditor);
-		RealTier tier = (RealTier) klattgrid -> frication -> fricationAmplitude;
-		KlattGrid_intensityTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_FricationAmplitudeTierEditor me = Thing_new (KlattGrid_FricationAmplitudeTierEditor);
+		RealTier tier = klattgrid -> frication -> fricationAmplitude.get();
+		KlattGrid_IntensityTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid frication amplitude window not created.");
+		Melder_throw (U"KlattGrid frication amplitude window not created.");
 	}
 }
 
-/************************** KlattGrid_openPhaseTierEditor *********************************/
+/************************** KlattGrid_OpenPhaseTierEditor *********************************/
 
-Thing_implement (KlattGrid_openPhaseTierEditor, KlattGrid_realTierEditor, 0);
+Thing_implement (KlattGrid_OpenPhaseTierEditor, KlattGrid_RealTierEditor, 0);
 
-KlattGrid_openPhaseTierEditor KlattGrid_openPhaseTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_OpenPhaseTierEditor KlattGrid_OpenPhaseTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_openPhaseTierEditor me = Thing_new (KlattGrid_openPhaseTierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> openPhase;
-		KlattGrid_realTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_OpenPhaseTierEditor me = Thing_new (KlattGrid_OpenPhaseTierEditor);
+		RealTier tier = klattgrid -> phonation -> openPhase.get();
+		KlattGrid_RealTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid_openPhaseTierEditor not created.");
+		Melder_throw (U"KlattGrid open phase window not created.");
 	}
 }
 
-/************************** KlattGrid_collisionPhaseTierEditor *********************************/
+/************************** KlattGrid_CollisionPhaseTierEditor *********************************/
 
-Thing_implement (KlattGrid_collisionPhaseTierEditor, KlattGrid_realTierEditor, 0);
+Thing_implement (KlattGrid_CollisionPhaseTierEditor, KlattGrid_RealTierEditor, 0);
 
-KlattGrid_collisionPhaseTierEditor KlattGrid_collisionPhaseTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_CollisionPhaseTierEditor KlattGrid_CollisionPhaseTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_collisionPhaseTierEditor me = Thing_new (KlattGrid_collisionPhaseTierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> collisionPhase;
-		KlattGrid_realTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_CollisionPhaseTierEditor me = Thing_new (KlattGrid_CollisionPhaseTierEditor);
+		RealTier tier = klattgrid -> phonation -> collisionPhase.get();
+		KlattGrid_RealTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid collision phase window not created.");
+		Melder_throw (U"KlattGrid collision phase window not created.");
 	}
 }
 
-/************************** KlattGrid_power1TierEditor *********************************/
+/************************** KlattGrid_Power1TierEditor *********************************/
 
-Thing_implement (KlattGrid_power1TierEditor, KlattGrid_realTierEditor, 0);
+Thing_implement (KlattGrid_Power1TierEditor, KlattGrid_RealTierEditor, 0);
 
-KlattGrid_power1TierEditor KlattGrid_power1TierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_Power1TierEditor KlattGrid_Power1TierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_power1TierEditor me = Thing_new (KlattGrid_power1TierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> power1;
-		KlattGrid_realTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_Power1TierEditor me = Thing_new (KlattGrid_Power1TierEditor);
+		RealTier tier = klattgrid -> phonation -> power1.get();
+		KlattGrid_RealTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid power1 window not created.");
+		Melder_throw (U"KlattGrid power1 window not created.");
 	}
 }
 
-/************************** KlattGrid_power2TierEditor *********************************/
+/************************** KlattGrid_Power2TierEditor *********************************/
 
-Thing_implement (KlattGrid_power2TierEditor, KlattGrid_realTierEditor, 0);
+Thing_implement (KlattGrid_Power2TierEditor, KlattGrid_RealTierEditor, 0);
 
-KlattGrid_power2TierEditor KlattGrid_power2TierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_Power2TierEditor KlattGrid_Power2TierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_power2TierEditor me = Thing_new (KlattGrid_power2TierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> power2;
-		KlattGrid_realTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_Power2TierEditor me = Thing_new (KlattGrid_Power2TierEditor);
+		RealTier tier = klattgrid -> phonation -> power2.get();
+		KlattGrid_RealTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid power2 window not created.");
+		Melder_throw (U"KlattGrid power2 window not created.");
 	}
 }
 
-/************************** KlattGrid_flutterTierEditor *********************************/
+/************************** KlattGrid_FlutterTierEditor *********************************/
 
-Thing_implement (KlattGrid_flutterTierEditor, KlattGrid_realTierEditor, 0);
+Thing_implement (KlattGrid_FlutterTierEditor, KlattGrid_RealTierEditor, 0);
 
-KlattGrid_flutterTierEditor KlattGrid_flutterTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_FlutterTierEditor KlattGrid_FlutterTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_flutterTierEditor me = Thing_new (KlattGrid_flutterTierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> flutter;
-		KlattGrid_realTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_FlutterTierEditor me = Thing_new (KlattGrid_FlutterTierEditor);
+		RealTier tier = klattgrid -> phonation -> flutter.get();
+		KlattGrid_RealTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid flutter window not created.");
+		Melder_throw (U"KlattGrid flutter window not created.");
 	}
 }
 
-/************************** KlattGrid_doublePulsingTierEditor *********************************/
+/************************** KlattGrid_DoublePulsingTierEditor *********************************/
 
-Thing_implement (KlattGrid_doublePulsingTierEditor, KlattGrid_realTierEditor, 0);
+Thing_implement (KlattGrid_DoublePulsingTierEditor, KlattGrid_RealTierEditor, 0);
 
-KlattGrid_doublePulsingTierEditor KlattGrid_doublePulsingTierEditor_create (const wchar_t *title, KlattGrid klattgrid) {
+autoKlattGrid_DoublePulsingTierEditor KlattGrid_DoublePulsingTierEditor_create (const char32 *title, KlattGrid klattgrid) {
 	try {
-		autoKlattGrid_doublePulsingTierEditor me = Thing_new (KlattGrid_doublePulsingTierEditor);
-		RealTier tier = (RealTier) klattgrid -> phonation -> doublePulsing;
-		KlattGrid_realTierEditor_init (me.peek(), title, klattgrid, tier);
-		return me.transfer();
+		autoKlattGrid_DoublePulsingTierEditor me = Thing_new (KlattGrid_DoublePulsingTierEditor);
+		RealTier tier = klattgrid -> phonation -> doublePulsing.get();
+		KlattGrid_RealTierEditor_init (me.peek(), title, klattgrid, tier);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid double pulsing window not created.");
+		Melder_throw (U"KlattGrid double pulsing window not created.");
 	}
 }
 
-/************************** KlattGrid_formantGridEditor *********************************/
+/************************** KlattGrid_FormantGridEditor *********************************/
 
-Thing_implement (KlattGrid_formantGridEditor, FormantGridEditor, 0);
+Thing_implement (KlattGrid_FormantGridEditor, FormantGridEditor, 0);
 
 static bool FormantGrid_isEmpty (FormantGrid me) {
 	return my formants -> size == 0 || my bandwidths -> size == 0;
 }
 
-void structKlattGrid_formantGridEditor :: v_play (double ltmin, double ltmax) {
+void structKlattGrid_FormantGridEditor :: v_play (double ltmin, double ltmax) {
 	KlattGrid_Editor_defaultPlay (klattgrid, ltmin, ltmax);
 }
 
-KlattGrid_formantGridEditor KlattGrid_formantGridEditor_create (const wchar_t *title, KlattGrid data, int formantType) {
+autoKlattGrid_FormantGridEditor KlattGrid_FormantGridEditor_create (const char32 *title, KlattGrid data, int formantType) {
 	try {
-		Melder_assert (data != NULL);
-		FormantGrid *fg = KlattGrid_getAddressOfFormantGrid (data, formantType);
-		if (fg == NULL) {
-			Melder_throw ("Formant type unknown.");
+		Melder_assert (data);
+		autoFormantGrid* fg = KlattGrid_getAddressOfFormantGrid (data, formantType);
+		if (fg) {
+			Melder_throw (U"Formant type unknown.");
 		}
-		if (FormantGrid_isEmpty (*fg)) {
-			Melder_throw ("Cannot edit an empty formant grid.");
+		if (FormantGrid_isEmpty (fg->get())) {
+			Melder_throw (U"Cannot edit an empty formant grid.");
 		}
-		autoKlattGrid_formantGridEditor me = Thing_new (KlattGrid_formantGridEditor);
+		autoKlattGrid_FormantGridEditor me = Thing_new (KlattGrid_FormantGridEditor);
 		my klattgrid = data;
-		FormantGridEditor_init (me.peek(), title, *fg);
-		return me.transfer();
+		FormantGridEditor_init (me.peek(), title, fg->get());
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("KlattGrid formant window not created.");
+		Melder_throw (U"KlattGrid formant window not created.");
 	}
 }
 
-/* End of file KlattGridEditors.cpp */
\ No newline at end of file
+/* End of file KlattGridEditors.cpp */
diff --git a/dwtools/KlattGridEditors.h b/dwtools/KlattGridEditors.h
index b197158..b15af99 100644
--- a/dwtools/KlattGridEditors.h
+++ b/dwtools/KlattGridEditors.h
@@ -26,258 +26,376 @@
 #include "FormantGridEditor.h"
 
 
-Thing_define (KlattGrid_realTierEditor, RealTierEditor) {
-	// new data:
-	public:
-		KlattGrid klattgrid;
-	// overridden methods:
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_play (double tmin, double tmax);
+Thing_define (KlattGrid_RealTierEditor, RealTierEditor) {
+	KlattGrid klattgrid;
+
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_play (double tmin, double tmax)
+		override;
 };
 
-void KlattGrid_realTierEditor_init (KlattGrid_realTierEditor me, const wchar_t *title, KlattGrid klattgrid, RealTier data);
-
-
-Thing_define (KlattGrid_openPhaseTierEditor, KlattGrid_realTierEditor) {
-	// overridden methods:
-		virtual double v_minimumLegalValue () { return 0.0; }
-		virtual double v_maximumLegalValue () { return 1.0; }
-		virtual const wchar_t * v_quantityText () { return L"Open phase (0..1)"; }
-		virtual const wchar_t * v_quantityKey () { return L"Open phase"; }
-		virtual const wchar_t * v_rightTickUnits () { return L""; }
-		virtual double v_defaultYmin () { return 0.0; }
-		virtual double v_defaultYmax () { return 1.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set open phase range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"0.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"1.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum (0..1)"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum (0..1)"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum"; }
+void KlattGrid_RealTierEditor_init (KlattGrid_RealTierEditor me, const char32 *title, KlattGrid klattgrid, RealTier data);
+
+
+Thing_define (KlattGrid_OpenPhaseTierEditor, KlattGrid_RealTierEditor) {
+	double v_minimumLegalValue ()
+		override { return 0.0; }
+	double v_maximumLegalValue ()
+		override { return 1.0; }
+	const char32 * v_quantityText ()
+		override { return U"Open phase (0..1)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Open phase"; }
+	const char32 * v_rightTickUnits ()
+		override { return U""; }
+	double v_defaultYmin ()
+		override { return 0.0; }
+	double v_defaultYmax ()
+		override { return 1.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set open phase range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"0.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"1.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum (0..1)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum (0..1)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum"; }
 };
 
-KlattGrid_openPhaseTierEditor KlattGrid_openPhaseTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
-
-
-Thing_define (KlattGrid_collisionPhaseTierEditor, KlattGrid_realTierEditor) {
-	// overridden methods:
-		virtual double v_minimumLegalValue () { return 0.0; }
-		virtual double v_maximumLegalValue () { return 1.0; }
-		virtual const wchar_t * v_quantityText () { return L"Collision phase (0..1)"; }
-		virtual const wchar_t * v_quantityKey () { return L"Collision phase"; }
-		virtual const wchar_t * v_rightTickUnits () { return L""; }
-		virtual double v_defaultYmin () { return 0.0; }
-		virtual double v_defaultYmax () { return 0.1; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set collision phase range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"0.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"0.1"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum (0..1)"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum (0..1)"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum"; }
+autoKlattGrid_OpenPhaseTierEditor KlattGrid_OpenPhaseTierEditor_create (const char32 *title, KlattGrid klattgrid);
+
+
+Thing_define (KlattGrid_CollisionPhaseTierEditor, KlattGrid_RealTierEditor) {
+	double v_minimumLegalValue ()
+		override { return 0.0; }
+	double v_maximumLegalValue ()
+		override { return 1.0; }
+	const char32 * v_quantityText ()
+		override { return U"Collision phase (0..1)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Collision phase"; }
+	const char32 * v_rightTickUnits ()
+		override { return U""; }
+	double v_defaultYmin ()
+		override { return 0.0; }
+	double v_defaultYmax ()
+		override { return 0.1; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set collision phase range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"0.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"0.1"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum (0..1)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum (0..1)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum"; }
 };
 
-KlattGrid_collisionPhaseTierEditor KlattGrid_collisionPhaseTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
-
-
-Thing_define (KlattGrid_power1TierEditor, KlattGrid_realTierEditor) {
-	// overridden methods:
-		virtual double v_minimumLegalValue () { return 0.0; }
-		virtual const wchar_t * v_quantityText () { return L"Power1"; }
-		virtual const wchar_t * v_quantityKey () { return L"Power1"; }
-		virtual const wchar_t * v_rightTickUnits () { return L""; }
-		virtual double v_defaultYmin () { return 0.0; }
-		virtual double v_defaultYmax () { return 4.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set power1 range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"4"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum"; }
+autoKlattGrid_CollisionPhaseTierEditor KlattGrid_CollisionPhaseTierEditor_create (const char32 *title, KlattGrid klattgrid);
+
+
+Thing_define (KlattGrid_Power1TierEditor, KlattGrid_RealTierEditor) {
+	double v_minimumLegalValue ()
+		override { return 0.0; }
+	const char32 * v_quantityText ()
+		override { return U"Power1"; }
+	const char32 * v_quantityKey ()
+		override { return U"Power1"; }
+	const char32 * v_rightTickUnits ()
+		override { return U""; }
+	double v_defaultYmin ()
+		override { return 0.0; }
+	double v_defaultYmax ()
+		override { return 4.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set power1 range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"4"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum"; }
 };
 
-KlattGrid_power1TierEditor KlattGrid_power1TierEditor_create (const wchar_t *title, KlattGrid klattgrid);
-
-
-Thing_define (KlattGrid_power2TierEditor, KlattGrid_realTierEditor) {
-	// overridden methods:
-		virtual double v_minimumLegalValue () { return 0.0; }
-		virtual const wchar_t * v_quantityText () { return L"Power2"; }
-		virtual const wchar_t * v_quantityKey () { return L"Power2"; }
-		virtual const wchar_t * v_rightTickUnits () { return L""; }
-		virtual double v_defaultYmin () { return 0.0; }
-		virtual double v_defaultYmax () { return 5.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set power2 range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"5"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum"; }
+autoKlattGrid_Power1TierEditor KlattGrid_Power1TierEditor_create (const char32 *title, KlattGrid klattgrid);
+
+
+Thing_define (KlattGrid_Power2TierEditor, KlattGrid_RealTierEditor) {
+	double v_minimumLegalValue ()
+		override { return 0.0; }
+	const char32 * v_quantityText ()
+		override { return U"Power2"; }
+	const char32 * v_quantityKey ()
+		override { return U"Power2"; }
+	const char32 * v_rightTickUnits ()
+		override { return U""; }
+	double v_defaultYmin ()
+		override { return 0.0; }
+	double v_defaultYmax ()
+		override { return 5.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set power2 range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"5"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum"; }
 };
 
-KlattGrid_power2TierEditor KlattGrid_power2TierEditor_create (const wchar_t *title, KlattGrid klattgrid);
-
-
-Thing_define (KlattGrid_doublePulsingTierEditor, KlattGrid_realTierEditor) {
-	// overridden methods:
-		virtual double v_minimumLegalValue () { return 0.0; }
-		virtual double v_maximumLegalValue () { return 1.0; }
-		virtual const wchar_t * v_quantityText () { return L"Double pulsing (0..1)"; }
-		virtual const wchar_t * v_quantityKey () { return L"Double pulsing"; }
-		virtual const wchar_t * v_rightTickUnits () { return L""; }
-		virtual double v_defaultYmin () { return 0.0; }
-		virtual double v_defaultYmax () { return 1.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set double pulsing range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"0.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"1.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum (0..1)"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum (0..1)"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum"; }
+autoKlattGrid_Power2TierEditor KlattGrid_Power2TierEditor_create (const char32 *title, KlattGrid klattgrid);
+
+
+Thing_define (KlattGrid_DoublePulsingTierEditor, KlattGrid_RealTierEditor) {
+	double v_minimumLegalValue ()
+		override { return 0.0; }
+	double v_maximumLegalValue ()
+		override { return 1.0; }
+	const char32 * v_quantityText ()
+		override { return U"Double pulsing (0..1)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Double pulsing"; }
+	const char32 * v_rightTickUnits ()
+		override { return U""; }
+	double v_defaultYmin ()
+		override { return 0.0; }
+	double v_defaultYmax ()
+		override { return 1.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set double pulsing range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"0.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"1.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum (0..1)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum (0..1)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum"; }
 };
 
-KlattGrid_doublePulsingTierEditor KlattGrid_doublePulsingTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
-
-
-Thing_define (KlattGrid_pitchTierEditor, KlattGrid_realTierEditor) {
-	// overridden methods:
-		void v_createHelpMenuItems (EditorMenu menu);
-		virtual double v_minimumLegalValue () { return 0.0; }
-		virtual const wchar_t * v_quantityText () { return L"Frequency (Hz)"; }
-		virtual const wchar_t * v_quantityKey () { return L"Frequency"; }
-		virtual const wchar_t * v_rightTickUnits () { return L" Hz"; }
-		virtual double v_defaultYmin () { return 50.0; }
-		virtual double v_defaultYmax () { return 600.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set frequency range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"50.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"600.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum frequency (Hz)"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum frequency (Hz)"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum frequency"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum frequency"; }
+autoKlattGrid_DoublePulsingTierEditor KlattGrid_DoublePulsingTierEditor_create (const char32 *title, KlattGrid klattgrid);
+
+
+Thing_define (KlattGrid_PitchTierEditor, KlattGrid_RealTierEditor) {
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	double v_minimumLegalValue ()
+		override { return 0.0; }
+	const char32 * v_quantityText ()
+		override { return U"Frequency (Hz)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Frequency"; }
+	const char32 * v_rightTickUnits ()
+		override { return U" Hz"; }
+	double v_defaultYmin ()
+		override { return 50.0; }
+	double v_defaultYmax ()
+		override { return 600.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set frequency range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"50.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"600.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum frequency (Hz)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum frequency (Hz)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum frequency"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum frequency"; }
 };
 
-KlattGrid_pitchTierEditor KlattGrid_pitchTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
-
-
-Thing_define (KlattGrid_flutterTierEditor, KlattGrid_realTierEditor) {
-	// overridden methods:
-		virtual double v_minimumLegalValue () { return 0.0; }
-		virtual double v_maximumLegalValue () { return 1.0; }
-		virtual const wchar_t * v_quantityText () { return L"Flutter (0..1)"; }
-		virtual const wchar_t * v_quantityKey () { return L"Flutter"; }
-		virtual const wchar_t * v_rightTickUnits () { return L""; }
-		virtual double v_defaultYmin () { return 0.0; }
-		virtual double v_defaultYmax () { return 1.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set flutter range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"0.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"1.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum (0..1)"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum (0..1)"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum"; }
+autoKlattGrid_PitchTierEditor KlattGrid_PitchTierEditor_create (const char32 *title, KlattGrid klattgrid);
+
+
+Thing_define (KlattGrid_FlutterTierEditor, KlattGrid_RealTierEditor) {
+	double v_minimumLegalValue ()
+		override { return 0.0; }
+	double v_maximumLegalValue ()
+		override { return 1.0; }
+	const char32 * v_quantityText ()
+		override { return U"Flutter (0..1)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Flutter"; }
+	const char32 * v_rightTickUnits ()
+		override { return U""; }
+	double v_defaultYmin ()
+		override { return 0.0; }
+	double v_defaultYmax ()
+		override { return 1.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set flutter range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"0.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"1.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum (0..1)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum (0..1)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum"; }
 };
 
-KlattGrid_flutterTierEditor KlattGrid_flutterTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
-
-
-Thing_define (KlattGrid_intensityTierEditor, KlattGrid_realTierEditor) {
-	// overridden methods:
-		void v_createHelpMenuItems (EditorMenu menu);
-		virtual const wchar_t * v_quantityText () { return L"Intensity (dB)"; }
-		virtual const wchar_t * v_quantityKey () { return L"Intensity"; }
-		virtual const wchar_t * v_rightTickUnits () { return L" dB"; }
-		virtual double v_defaultYmin () { return 50.0; }
-		virtual double v_defaultYmax () { return 100.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set intensity range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"50.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"100.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum intensity (dB)"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum intensity (dB)"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum intensity"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum intensity"; }
+autoKlattGrid_FlutterTierEditor KlattGrid_FlutterTierEditor_create (const char32 *title, KlattGrid klattgrid);
+
+
+Thing_define (KlattGrid_IntensityTierEditor, KlattGrid_RealTierEditor) {
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	const char32 * v_quantityText ()
+		override { return U"Intensity (dB)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Intensity"; }
+	const char32 * v_rightTickUnits ()
+		override { return U" dB"; }
+	double v_defaultYmin ()
+		override { return 50.0; }
+	double v_defaultYmax ()
+		override { return 100.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set intensity range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"50.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"100.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum intensity (dB)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum intensity (dB)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum intensity"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum intensity"; }
 };
 
-void KlattGrid_intensityTierEditor_init (KlattGrid_intensityTierEditor me, const wchar_t *title, KlattGrid klattgrid, RealTier tier);
-
-
-Thing_define (KlattGrid_decibelTierEditor, KlattGrid_intensityTierEditor) {
-	// overridden methods:
-		virtual const wchar_t * v_quantityText () { return L"Amplitude (dB)"; }
-		virtual const wchar_t * v_quantityKey () { return L"Amplitude"; }
-		virtual const wchar_t * v_rightTickUnits () { return L" dB"; }
-		virtual double v_defaultYmin () { return -30.0; }
-		virtual double v_defaultYmax () { return 30.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set amplitude range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"-30.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"30.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum amplitude (dB)"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum amplitude (dB)"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum amplitude"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum amplitude"; }
+void KlattGrid_IntensityTierEditor_init (KlattGrid_IntensityTierEditor me, const char32 *title, KlattGrid klattgrid, RealTier tier);
+
+
+Thing_define (KlattGrid_DecibelTierEditor, KlattGrid_IntensityTierEditor) {
+	const char32 * v_quantityText ()
+		override { return U"Amplitude (dB)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Amplitude"; }
+	const char32 * v_rightTickUnits ()
+		override { return U" dB"; }
+	double v_defaultYmin ()
+		override { return -30.0; }
+	double v_defaultYmax ()
+		override { return 30.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set amplitude range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"-30.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"30.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum amplitude (dB)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum amplitude (dB)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum amplitude"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum amplitude"; }
 };
 
-KlattGrid_decibelTierEditor KlattGrid_decibelTierEditor_create (const wchar_t *title, KlattGrid klattgrid, RealTier data);
+autoKlattGrid_DecibelTierEditor KlattGrid_DecibelTierEditor_create (const char32 *title, KlattGrid klattgrid, RealTier data);
 
 
-Thing_define (KlattGrid_voicingAmplitudeTierEditor, KlattGrid_intensityTierEditor) {
+Thing_define (KlattGrid_VoicingAmplitudeTierEditor, KlattGrid_IntensityTierEditor) {
 };
 
-KlattGrid_voicingAmplitudeTierEditor KlattGrid_voicingAmplitudeTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
+autoKlattGrid_VoicingAmplitudeTierEditor KlattGrid_VoicingAmplitudeTierEditor_create (const char32 *title, KlattGrid klattgrid);
 
 
-Thing_define (KlattGrid_aspirationAmplitudeTierEditor, KlattGrid_intensityTierEditor) {
+Thing_define (KlattGrid_AspirationAmplitudeTierEditor, KlattGrid_IntensityTierEditor) {
 };
 
-KlattGrid_aspirationAmplitudeTierEditor KlattGrid_aspirationAmplitudeTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
+autoKlattGrid_AspirationAmplitudeTierEditor KlattGrid_AspirationAmplitudeTierEditor_create (const char32 *title, KlattGrid klattgrid);
 
 
-Thing_define (KlattGrid_breathinessAmplitudeTierEditor, KlattGrid_intensityTierEditor) {
+Thing_define (KlattGrid_BreathinessAmplitudeTierEditor, KlattGrid_IntensityTierEditor) {
 };
 
-KlattGrid_breathinessAmplitudeTierEditor KlattGrid_breathinessAmplitudeTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
+autoKlattGrid_BreathinessAmplitudeTierEditor KlattGrid_BreathinessAmplitudeTierEditor_create (const char32 *title, KlattGrid klattgrid);
 
 
-Thing_define (KlattGrid_spectralTiltTierEditor, KlattGrid_intensityTierEditor) {
-	// overridden methods:
-		virtual double v_defaultYmin () { return -50.0; }
-		virtual double v_defaultYmax () { return 10.0; }
-		virtual const wchar_t * v_defaultYminText () { return L"-50.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"10.0"; }
+Thing_define (KlattGrid_SpectralTiltTierEditor, KlattGrid_IntensityTierEditor) {
+	double v_defaultYmin ()
+		override { return -50.0; }
+	double v_defaultYmax ()
+		override { return 10.0; }
+	const char32 * v_defaultYminText ()
+		override { return U"-50.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"10.0"; }
 };
 
-KlattGrid_spectralTiltTierEditor KlattGrid_spectralTiltTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
+autoKlattGrid_SpectralTiltTierEditor KlattGrid_SpectralTiltTierEditor_create (const char32 *title, KlattGrid klattgrid);
 
 
-Thing_define (KlattGrid_fricationBypassTierEditor, KlattGrid_intensityTierEditor) {
-	// overridden methods:
-		virtual double v_defaultYmin () { return -50.0; }
-		virtual double v_defaultYmax () { return 10.0; }
-		virtual const wchar_t * v_defaultYminText () { return L"-50.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"10.0"; }
+Thing_define (KlattGrid_FricationBypassTierEditor, KlattGrid_IntensityTierEditor) {
+	double v_defaultYmin ()
+		override { return -50.0; }
+	double v_defaultYmax ()
+		override { return 10.0; }
+	const char32 * v_defaultYminText ()
+		override { return U"-50.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"10.0"; }
 };
 
-KlattGrid_fricationBypassTierEditor KlattGrid_fricationBypassTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
+autoKlattGrid_FricationBypassTierEditor KlattGrid_FricationBypassTierEditor_create (const char32 *title, KlattGrid klattgrid);
 
 
-Thing_define (KlattGrid_fricationAmplitudeTierEditor, KlattGrid_intensityTierEditor) {
+Thing_define (KlattGrid_FricationAmplitudeTierEditor, KlattGrid_IntensityTierEditor) {
 };
 
-KlattGrid_fricationAmplitudeTierEditor KlattGrid_fricationAmplitudeTierEditor_create (const wchar_t *title, KlattGrid klattgrid);
+autoKlattGrid_FricationAmplitudeTierEditor KlattGrid_FricationAmplitudeTierEditor_create (const char32 *title, KlattGrid klattgrid);
 
 
-Thing_define (KlattGrid_formantGridEditor, FormantGridEditor) {
-	// new data:
-	public:
-		KlattGrid klattgrid;
-	// overridden methods:
-		virtual void v_play (double tmin, double tmax);
-		virtual bool v_hasSourceMenu () { return false; }
-};
+Thing_define (KlattGrid_FormantGridEditor, FormantGridEditor) {
+	KlattGrid klattgrid;
 
-KlattGrid_formantGridEditor KlattGrid_formantGridEditor_create (const wchar_t *title, KlattGrid data, int formantType);
+	void v_play (double tmin, double tmax)
+		override;
+	bool v_hasSourceMenu ()
+		override { return false; }
+};
 
+autoKlattGrid_FormantGridEditor KlattGrid_FormantGridEditor_create (const char32 *title, KlattGrid data, int formantType);
 
-#endif // _KlattGridEditors_h_
\ No newline at end of file
+/* End of file KlattGridEditors.h */
+#endif
diff --git a/dwtools/KlattGrid_def.h b/dwtools/KlattGrid_def.h
index 4fbe1fd..43a8a81 100644
--- a/dwtools/KlattGrid_def.h
+++ b/dwtools/KlattGrid_def.h
@@ -18,7 +18,7 @@
  */
 
 #define ooSTRUCT PhonationPoint
-oo_DEFINE_CLASS (PhonationPoint, Data)
+oo_DEFINE_CLASS (PhonationPoint, Daata)
 	oo_DOUBLE (time)  /* AnyPoint : glottis closing time */
 	oo_DOUBLE (period)  /* 1/F0 */
 	oo_DOUBLE (openPhase)
@@ -37,7 +37,7 @@ oo_END_CLASS (PhonationTier)
 #undef ooSTRUCT
 
 #define ooSTRUCT PhonationGridPlayOptions
-oo_DEFINE_CLASS (PhonationGridPlayOptions, Data)
+oo_DEFINE_CLASS (PhonationGridPlayOptions, Daata)
 	oo_INT (voicing)
 	oo_INT (aspiration)
 	oo_INT (breathiness)
@@ -53,34 +53,33 @@ oo_END_CLASS (PhonationGridPlayOptions)
 
 #define ooSTRUCT PhonationGrid
 oo_DEFINE_CLASS (PhonationGrid, Function)
-	oo_OBJECT (PitchTier, 0, pitch)
-	oo_OBJECT (RealTier, 0, flutter) // [0,1]
-	oo_OBJECT (IntensityTier, 0, voicingAmplitude) // dB
-	oo_OBJECT (RealTier, 0, doublePulsing) // [0,1]
-	oo_OBJECT (RealTier, 0, openPhase) // (0,1)
-	oo_OBJECT (RealTier, 0, collisionPhase) //
-	oo_OBJECT (RealTier, 0, power1) // 2,3..
-	oo_OBJECT (RealTier, 0, power2) // 3,4.. power2>power1
-	oo_OBJECT (IntensityTier, 0, spectralTilt) // dB
-	oo_OBJECT (IntensityTier, 0, aspirationAmplitude) // dB
-	oo_OBJECT (IntensityTier, 0, breathinessAmplitude) // dB
+	oo_AUTO_OBJECT (PitchTier, 0, pitch)
+	oo_AUTO_OBJECT (RealTier, 0, flutter) // [0,1]
+	oo_AUTO_OBJECT (IntensityTier, 0, voicingAmplitude) // dB
+	oo_AUTO_OBJECT (RealTier, 0, doublePulsing) // [0,1]
+	oo_AUTO_OBJECT (RealTier, 0, openPhase) // (0,1)
+	oo_AUTO_OBJECT (RealTier, 0, collisionPhase) //
+	oo_AUTO_OBJECT (RealTier, 0, power1) // 2,3..
+	oo_AUTO_OBJECT (RealTier, 0, power2) // 3,4.. power2>power1
+	oo_AUTO_OBJECT (IntensityTier, 0, spectralTilt) // dB
+	oo_AUTO_OBJECT (IntensityTier, 0, aspirationAmplitude) // dB
+	oo_AUTO_OBJECT (IntensityTier, 0, breathinessAmplitude) // dB
 	#if !oo_READING && !oo_WRITING
-		oo_OBJECT (PhonationGridPlayOptions, 0, options)
+		oo_AUTO_OBJECT (PhonationGridPlayOptions, 0, options)
 	#endif
 	#if oo_READING
 		options = PhonationGridPlayOptions_create ();
 		PhonationGrid_setNames (this);
 	#endif
 	#if oo_DECLARING
-		// overridden methods:
-		public:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 oo_END_CLASS (PhonationGrid)
 #undef ooSTRUCT
 
 #define ooSTRUCT VocalTractGridPlayOptions
-oo_DEFINE_CLASS (VocalTractGridPlayOptions, Data)
+oo_DEFINE_CLASS (VocalTractGridPlayOptions, Daata)
 	oo_INT (filterModel)
 	oo_LONG (startOralFormant)
 	oo_LONG (endOralFormant)
@@ -93,29 +92,28 @@ oo_END_CLASS (VocalTractGridPlayOptions)
 
 #define ooSTRUCT VocalTractGrid
 oo_DEFINE_CLASS (VocalTractGrid, Function)
-	oo_OBJECT (FormantGrid, 0, oral_formants)
-	oo_OBJECT (FormantGrid, 0, nasal_formants)
-	oo_OBJECT (FormantGrid, 0, nasal_antiformants)
+	oo_AUTO_OBJECT (FormantGrid, 0, oral_formants)
+	oo_AUTO_OBJECT (FormantGrid, 0, nasal_formants)
+	oo_AUTO_OBJECT (FormantGrid, 0, nasal_antiformants)
 	// for parallel synthesis
 	oo_COLLECTION (Ordered, oral_formants_amplitudes, IntensityTier, 0)
 	oo_COLLECTION (Ordered, nasal_formants_amplitudes, IntensityTier, 0)
 	#if !oo_READING && !oo_WRITING
-		oo_OBJECT (VocalTractGridPlayOptions, 0, options)
+		oo_AUTO_OBJECT (VocalTractGridPlayOptions, 0, options)
 	#endif
 	#if oo_READING
 		options = VocalTractGridPlayOptions_create ();
 		VocalTractGrid_setNames (this);
 	#endif
 	#if oo_DECLARING
-		// overridden methods:
-		public:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 oo_END_CLASS (VocalTractGrid)
 #undef ooSTRUCT
 
 #define ooSTRUCT CouplingGridPlayOptions
-oo_DEFINE_CLASS (CouplingGridPlayOptions, Data)
+oo_DEFINE_CLASS (CouplingGridPlayOptions, Daata)
 	oo_LONG (startTrachealFormant)
 	oo_LONG (endTrachealFormant)
 	oo_LONG (startTrachealAntiFormant)
@@ -131,13 +129,13 @@ oo_END_CLASS (CouplingGridPlayOptions)
 
 #define ooSTRUCT CouplingGrid
 oo_DEFINE_CLASS (CouplingGrid, Function)
-	oo_OBJECT (FormantGrid, 0, tracheal_formants)
-	oo_OBJECT (FormantGrid, 0, tracheal_antiformants)
+	oo_AUTO_OBJECT (FormantGrid, 0, tracheal_formants)
+	oo_AUTO_OBJECT (FormantGrid, 0, tracheal_antiformants)
 	oo_COLLECTION (Ordered, tracheal_formants_amplitudes, IntensityTier, 0)
-	oo_OBJECT (FormantGrid, 0, delta_formants)
+	oo_AUTO_OBJECT (FormantGrid, 0, delta_formants)
 	#if !oo_READING && !oo_WRITING
-		oo_OBJECT (PhonationTier, 0, glottis)
-		oo_OBJECT (CouplingGridPlayOptions, 0, options)
+		oo_AUTO_OBJECT (PhonationTier, 0, glottis)
+		oo_AUTO_OBJECT (CouplingGridPlayOptions, 0, options)
 	#endif
 	#if oo_READING
 		options = CouplingGridPlayOptions_create ();
@@ -145,15 +143,14 @@ oo_DEFINE_CLASS (CouplingGrid, Function)
 		CouplingGrid_setNames (this);
 	#endif
 	#if oo_DECLARING
-		// overridden methods:
-		public:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 oo_END_CLASS (CouplingGrid)
 #undef ooSTRUCT
 
 #define ooSTRUCT FricationGridPlayOptions
-oo_DEFINE_CLASS (FricationGridPlayOptions, Data)
+oo_DEFINE_CLASS (FricationGridPlayOptions, Daata)
 	oo_LONG (startFricationFormant)
 	oo_LONG (endFricationFormant)
 	oo_INT (bypass)
@@ -162,27 +159,26 @@ oo_END_CLASS (FricationGridPlayOptions)
 
 #define ooSTRUCT FricationGrid
 oo_DEFINE_CLASS (FricationGrid, Function)
-	oo_OBJECT (IntensityTier, 0, fricationAmplitude) // dB
-	oo_OBJECT (FormantGrid, 0, frication_formants)
+	oo_AUTO_OBJECT (IntensityTier, 0, fricationAmplitude) // dB
+	oo_AUTO_OBJECT (FormantGrid, 0, frication_formants)
 	oo_COLLECTION (Ordered, frication_formants_amplitudes, RealTier, 0)
-	oo_OBJECT (IntensityTier, 0, bypass) // dB
+	oo_AUTO_OBJECT (IntensityTier, 0, bypass) // dB
 	#if !oo_READING && !oo_WRITING
-		oo_OBJECT (FricationGridPlayOptions, 0, options)
+		oo_AUTO_OBJECT (FricationGridPlayOptions, 0, options)
 	#endif
 	#if oo_READING
 		options = FricationGridPlayOptions_create ();
 		FricationGrid_setNames (this);
 	#endif
 	#if oo_DECLARING
-		// overridden methods:
-		public:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 oo_END_CLASS (FricationGrid)
 #undef ooSTRUCT
 
 #define ooSTRUCT KlattGridPlayOptions
-oo_DEFINE_CLASS (KlattGridPlayOptions, Data)
+oo_DEFINE_CLASS (KlattGridPlayOptions, Daata)
 	oo_DOUBLE (samplingFrequency)
 	oo_INT (scalePeak)
 	oo_DOUBLE (xmin)
@@ -192,22 +188,21 @@ oo_END_CLASS (KlattGridPlayOptions)
 
 #define ooSTRUCT KlattGrid
 oo_DEFINE_CLASS (KlattGrid, Function)
-	oo_OBJECT (PhonationGrid, 0, phonation)   // Glottal source
-	oo_OBJECT (VocalTractGrid, 0, vocalTract) // Filter
-	oo_OBJECT (CouplingGrid, 0, coupling)     // Coupling between source and filter
-	oo_OBJECT (FricationGrid, 0, frication)   // Frication source
-	oo_OBJECT (IntensityTier, 0, gain)        // final scaling
+	oo_AUTO_OBJECT (PhonationGrid, 0, phonation)   // Glottal source
+	oo_AUTO_OBJECT (VocalTractGrid, 0, vocalTract) // Filter
+	oo_AUTO_OBJECT (CouplingGrid, 0, coupling)     // Coupling between source and filter
+	oo_AUTO_OBJECT (FricationGrid, 0, frication)   // Frication source
+	oo_AUTO_OBJECT (IntensityTier, 0, gain)        // final scaling
 	#if !oo_READING && !oo_WRITING
-		oo_OBJECT (KlattGridPlayOptions, 0, options)
+		oo_AUTO_OBJECT (KlattGridPlayOptions, 0, options)
 	#endif
 	#if oo_READING
 		options = KlattGridPlayOptions_create ();
 		KlattGrid_setNames (this);
 	#endif
 	#if oo_DECLARING
-		// overridden methods:
-		protected:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 oo_END_CLASS (KlattGrid)
 #undef ooSTRUCT
diff --git a/dwtools/KlattTable.cpp b/dwtools/KlattTable.cpp
index e17a935..ed77485 100644
--- a/dwtools/KlattTable.cpp
+++ b/dwtools/KlattTable.cpp
@@ -362,8 +362,6 @@ Thing_implement (KlattTable, Table, 0);
 #define ALL_PARALLEL     2
 #define KlattTable_NPAR	40        /* Number of control parameters */
 #define MAX_SAM          20000     /* Maximum sample rate */
-#define TRUE             1
-#define FALSE            0
 #define IMPULSIVE        1         /* Type of voicing source */
 #define NATURAL          2
 #define SAMPLED          3
@@ -395,8 +393,8 @@ typedef struct structKlattFrame {
 	long Gain0;	/* Overall gain, 60 dB is unity,    0 to   60 */
 } *KlattFrame;
 
-static const wchar_t *columnNames = L"f0 av f1 b1 f2 b2 f3 b3 f4 b4 f5 b5 f6 b6 fnz bnz fnp bnp ah kopen aturb tilt af skew a1 b1p a2 b2p a3 b3p a4 b4p a5 b5p a6 b6p anp ab avp gain";
-static const wchar_t *columnNamesA[KlattTable_NPAR + 1] = {L"", L"f0", L"av", L"f1", L"b1", L"f2", L"b2", L"f3", L"b3", L"f4", L"b4", L"f5", L"b5", L"f6", L"b6", L"fnz", L"bnz", L"fnp", L"bnp", L"ah", L"kopen", L"aturb", L"tilt", L"af", L"skew", L"a1", L"b1p", L"a2", L"b2p", L"a3", L"b3p", L"a4", L"b4p", L"a5", L"b5p", L"a6", L"b6p", L"anp", L"ab", L"avp", L"gain"};
+static const char32 *columnNames = U"f0 av f1 b1 f2 b2 f3 b3 f4 b4 f5 b5 f6 b6 fnz bnz fnp bnp ah kopen aturb tilt af skew a1 b1p a2 b2p a3 b3p a4 b4p a5 b5p a6 b6p anp ab avp gain";
+static const char32 *columnNamesA[KlattTable_NPAR + 1] = {U"", U"f0", U"av", U"f1", U"b1", U"f2", U"b2", U"f3", U"b3", U"f4", U"b4", U"f5", U"b5", U"f6", U"b6", U"fnz", U"bnz", U"fnp", U"bnp", U"ah", U"kopen", U"aturb", U"tilt", U"af", U"skew", U"a1", U"b1p", U"a2", U"b2p", U"a3", U"b3p", U"a4", U"b4p", U"a5", U"b5p", U"a6", U"b6p", U"anp", U"ab", U"avp", U"gain"};
 
 static double DBtoLIN (long dB) {
 	static double amptable[88] = {
@@ -463,7 +461,7 @@ KlattTable KlattTable_readFromRawTextFile (MelderFile fs) {
 		autoMatrix thee = Matrix_readFromRawTextFile (fs);
 
 		if (thy nx != KlattTable_NPAR) {
-			Melder_throw ("A KlattTable needs ",  KlattTable_NPAR, " columns.");
+			Melder_throw (U"A KlattTable needs ",  KlattTable_NPAR, U" columns.");
 		}
 
 		autoKlattTable me = Thing_new (KlattTable);
@@ -479,7 +477,7 @@ KlattTable KlattTable_readFromRawTextFile (MelderFile fs) {
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("KlattTable not read from file.");
+		Melder_throw (U"KlattTable not read from file.");
 	}
 }
 
@@ -504,7 +502,7 @@ static KlattGlobal KlattGlobal_create (double samplingFrequency) {
 	try {
 		me = (KlattGlobal) _Melder_calloc_f (1, sizeof (struct structKlattGlobal));
 
-		my samrate = samplingFrequency;
+		my samrate = (long) floor (samplingFrequency);
 		double dT = 1.0 / my samrate;
 
 		for (long i = 1; i <= 8; i++) {
@@ -522,7 +520,7 @@ static KlattGlobal KlattGlobal_create (double samplingFrequency) {
 		return me;
 	} catch (MelderError) {
 		KlattGlobal_free (me);
-		Melder_throw ("KlattGlobal not created.");
+		Melder_throw (U"KlattGlobal not created.");
 	}
 }
 
@@ -538,7 +536,7 @@ static void KlattGlobal_init (KlattGlobal me, int synthesisModel, int numberOfFo
 		-1891, -1045, -1600, -1462, -1384, -1261, -949, -730
 	};
 
-	my nspfr = my samrate * frameDuration; /* average number of samples per frame */
+	my nspfr = (long) floor (my samrate * frameDuration); /* average number of samples per frame */
 	my synthesis_model = synthesisModel;
 	my nfcascade = numberOfFormants;
 	my glsource = glottalSource;
@@ -548,8 +546,8 @@ static void KlattGlobal_init (KlattGlobal me, int synthesisModel, int numberOfFo
 	my outsl = outputType;
 	my f0_flutter = flutter;
 
-	my FLPhz = 0.0950 * my samrate; // depends on samplingFrequency ????
-	my BLPhz = 0.0630 * my samrate;
+	my FLPhz = (long) floor (0.0950 * my samrate); // depends on samplingFrequency ????
+	my BLPhz = (long) floor (0.0630 * my samrate);
 	Filter_setFB (my rlp, my FLPhz, my BLPhz);
 }
 
@@ -564,11 +562,11 @@ static void KlattFrame_free (KlattFrame me) {
 KlattTable KlattTable_create (double frameDuration, double totalDuration) {
 	try {
 		autoKlattTable me = (KlattTable) Thing_new (KlattTable);
-		long nrows = floor (totalDuration / frameDuration) + 1;
+		long nrows = (long) floor (totalDuration / frameDuration) + 1;
 		Table_initWithColumnNames (me.peek(), nrows, columnNames);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("KlattTable not created.");
+		Melder_throw (U"KlattTable not created.");
 	}
 }
 
@@ -654,7 +652,7 @@ static void KlattFrame_flutter (KlattGlobal me) {
   Noise spectrum is tilted down by soft low-pass filter having a pole near
     the origin in the z-plane, i.e. output = input + (0.75 * lastoutput)
 */
-static float KlattGlobal_gen_noise (KlattGlobal me) {
+static double KlattGlobal_gen_noise (KlattGlobal me) {   // ppgb: dit was een float; kan niet goed zijn
 	static double nlast = 0;
 	double noise;
 
@@ -671,7 +669,7 @@ a natural excitation waveform. Low-pass filter the differentiated impulse
 with a critically-damped second-order filter, time constant proportional
 to Kopen.
 */
-static float KlattGlobal_impulsive_source (KlattGlobal me) {
+static double KlattGlobal_impulsive_source (KlattGlobal me) {   // ppgb: dit was een float; kan niet goed zijn
 	static double doublet[] = {0.0, 13000000.0, -13000000.0};
 	static double vwave;
 
@@ -684,7 +682,7 @@ static float KlattGlobal_impulsive_source (KlattGlobal me) {
 Vwave is the differentiated glottal flow waveform, there is a weak
 spectral zero around 800 Hz, magic constants a,b reset pitch synchronously.
 */
-static float KlattGlobal_natural_source (KlattGlobal me) {
+static double KlattGlobal_natural_source (KlattGlobal me) {   // ppgb: dit was een float; kan niet goed zijn
 	static double vwave = 0;
 	double lgtemp = 0;
 
@@ -699,13 +697,13 @@ static float KlattGlobal_natural_source (KlattGlobal me) {
 }
 
 /* Allows the use of a glottal excitation waveform sampled from a real voice. */
-static float KlattGlobal_sampled_source (KlattGlobal me) {
+static double KlattGlobal_sampled_source (KlattGlobal me) {   // ppgb: dit was een float; kan niet goed zijn
 	double result = 0;
 
 	if (my T0 != 0) {
 		double ftemp = my nper;
 		ftemp *= my num_samples / my T0;
-		long itemp = ftemp;
+		long itemp = (long) floor (ftemp);
 
 		double temp_diff = ftemp - itemp;
 
@@ -798,7 +796,7 @@ static void KlattGlobal_pitch_synch_par_reset (KlattGlobal me) {
 		my T0 = (40 * my samrate) / my F0hz10;
 
 
-		my amp_voice = DBtoLIN (my AVdb);
+		my amp_voice = DBtoLIN ((long) floor (my AVdb));
 
 		/* Duration of period before amplitude modulation */
 
@@ -809,7 +807,7 @@ static void KlattGlobal_pitch_synch_par_reset (KlattGlobal me) {
 
 		/* Breathiness of voicing waveform */
 
-		my amp_breth = DBtoLIN (my Aturb) * 0.1;
+		my amp_breth = DBtoLIN ((long) floor (my Aturb)) * 0.1;
 
 		/* Set open phase of glottal period where  40 <= open phase <= 263 */
 
@@ -821,14 +819,14 @@ static void KlattGlobal_pitch_synch_par_reset (KlattGlobal me) {
 
 		if (my nopen >= (my T0 - 1)) {
 			my nopen = my T0 - 2;
-			Melder_warning (L"Glottal open period cannot exceed T0, truncated");
+			Melder_warning (U"Glottal open period cannot exceed T0, truncated");
 		}
 
 		if (my nopen < 40) {
 			/* F0 max = 1000 Hz */
 			my nopen = 40;
-			Melder_warning (L"Warning: minimum glottal open period is 10 samples.\n"
-			                "truncated, nopen = ", Melder_integer (my nopen));
+			Melder_warning (U"Warning: minimum glottal open period is 10 samples.\n"
+			                U"truncated, nopen = ", my nopen);
 		}
 
 
@@ -852,8 +850,8 @@ static void KlattGlobal_pitch_synch_par_reset (KlattGlobal me) {
 
 		temp = my T0 - my nopen;
 		if (my Kskew > temp) {
-			Melder_information (L"Kskew duration=", Melder_integer (my Kskew), L" > glottal closed period=",
-			                    Melder_integer (my T0 - my nopen), L" truncate");
+			Melder_information (U"Kskew duration=", my Kskew, U" > glottal closed period=",
+			                    my T0 - my nopen, U" truncate");
 			my Kskew = temp;
 		}
 		if (skew >= 0) {
@@ -1075,7 +1073,7 @@ static void KlattGlobal_synthesizeFrame (KlattGlobal me, short *output) {
 		if (temp >	32767.0) {
 			temp =  32767.0;
 		}
-		*output++ = temp;
+		*output++ = temp;   // ppgb: truncatie naar 0, dus compressie; is dat de bedoeling?
 	}
 }
 
@@ -1101,7 +1099,7 @@ static int KlattTable_checkLimits (KlattTable me) {
 	long nv = 0;
 	for (long irow = 1; irow <= my rows -> size; irow++) {
 		for (long j = 1; j <= KlattTable_NPAR; j++) {
-			long val = Table_getNumericValue_Assert ( (Table) me, irow, j);
+			long val = Table_getNumericValue_Assert ( (Table) me, irow, j);   // ppgb: truncatie? kan dat kloppen?
 			if (val < lower[j]) {
 				nviolations_lower[j]++; nv++;
 			} else if (val > upper[j]) {
@@ -1111,21 +1109,21 @@ static int KlattTable_checkLimits (KlattTable me) {
 	}
 	if (nv > 0) {
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"Diagnostics for KlattTable \"", Thing_getName (me), L"\":");
-		MelderInfo_writeLine (L"Number of frames: ", Melder_integer (my rows -> size));
+		MelderInfo_writeLine (U"Diagnostics for KlattTable \"", Thing_getName (me), U"\":");
+		MelderInfo_writeLine (U"Number of frames: ", my rows -> size);
 		for (long j = 1; j <= KlattTable_NPAR; j++) {
 			if (nviolations_lower[j] > 0) {
 				if (nviolations_upper[j] > 0) {
-					MelderInfo_writeLine (columnNamesA[j], L": ",
-					                       Melder_integer (nviolations_lower[j]), L" frame(s) < min = ", Melder_integer (nviolations_lower[j]), L"; ",
-					                       Melder_integer (nviolations_upper[j]), L" frame(s) > max = ", Melder_integer (upper[j]));
+					MelderInfo_writeLine (columnNamesA[j], U": ",
+					                       nviolations_lower[j], U" frame(s) < min = ", nviolations_lower[j], U"; ",
+					                       nviolations_upper[j], U" frame(s) > max = ", upper[j]);
 				} else {
-					MelderInfo_writeLine (columnNamesA[j], L": ",
-					                       Melder_integer (nviolations_lower[j]), L" frame(s) < min = ", Melder_integer (lower[j]));
+					MelderInfo_writeLine (columnNamesA[j], U": ",
+					                       nviolations_lower[j], U" frame(s) < min = ", lower[j]);
 				}
 			} else if (nviolations_upper[j] > 0) {
-				MelderInfo_writeLine (columnNamesA[j], L": ",
-				                       Melder_integer (nviolations_upper[j]), L" frame(s) > max = ", Melder_integer (upper[j]));
+				MelderInfo_writeLine (columnNamesA[j], U": ",
+				                       nviolations_upper[j], U" frame(s) > max = ", upper[j]);
 			}
 		}
 		MelderInfo_close ();
@@ -1141,20 +1139,20 @@ Sound KlattTable_to_Sound (KlattTable me, double samplingFrequency, int synthesi
 		long numberOfSamples = 1, par[KlattTable_NPAR + 1];
 
 		if (! KlattTable_checkLimits (me)) {
-			Melder_warning (L"Some values in the KlattTable are outside the limits, the resulting sound may sound weird.");
+			Melder_warning (U"Some values in the KlattTable are outside the limits, the resulting sound may sound weird.");
 		}
 		thee = KlattGlobal_create (samplingFrequency);
 		frame = KlattFrame_create ();
 		autoNUMvector<short> iwave (0L, MAX_SAM);
-		thy samrate = samplingFrequency;
+		thy samrate = (long) floor (samplingFrequency);
 
-		KlattGlobal_init (thee, synthesisModel, numberOfFormants, glottalSource, frameDuration, flutter, outputType);
+		KlattGlobal_init (thee, synthesisModel, numberOfFormants, glottalSource, frameDuration, (long) floor (flutter), outputType);
 
 		autoSound him = Sound_createSimple (1, frameDuration * my rows -> size, samplingFrequency);
 
 		for (long irow = 1 ; irow <= my rows -> size; irow++) {
 			for (long col = 1; col <= KlattTable_NPAR; col++) {
-				par[col] = Table_getNumericValue_Assert ( (Table) me, irow, col);
+				par[col] = Table_getNumericValue_Assert ( (Table) me, irow, col);   // ppgb: truncatie?
 			}
 			long jcol = 1;
 			frame ->  F0hz10 = par[jcol++]; frame ->  AVdb = par[jcol++];
@@ -1193,7 +1191,7 @@ Sound KlattTable_to_Sound (KlattTable me, double samplingFrequency, int synthesi
 	} catch (MelderError) {
 		KlattGlobal_free (thee);
 		KlattFrame_free (frame);
-		Melder_throw (me, ": no Sound created.");
+		Melder_throw (me, U": no Sound created.");
 	}
 }
 
@@ -2594,20 +2592,20 @@ KlattTable KlattTable_createExample () {
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw (" KlattTable example not created.");
+		Melder_throw (U" KlattTable example not created.");
 	}
 }
 
 KlattTable Table_to_KlattTable (Table me) {
 	try {
 		if (my numberOfColumns != KlattTable_NPAR) {
-			Melder_throw ("A KlattTable needs ", KlattTable_NPAR, L" columns.");
+			Melder_throw (U"A KlattTable needs ", KlattTable_NPAR, U" columns.");
 		}
 		autoKlattTable thee = Thing_new (KlattTable);
 		my structTable :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("KlattTable not created from Table.");
+		Melder_throw (U"KlattTable not created from Table.");
 	}
 }
 
@@ -2617,7 +2615,7 @@ Table KlattTable_to_Table (KlattTable me) {
 		my structTable :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Table not created from KlattTable.");
+		Melder_throw (U"Table not created from KlattTable.");
 	}
 }
 
diff --git a/dwtools/LFCC.cpp b/dwtools/LFCC.cpp
index 83c0d03..c1e0f3e 100644
--- a/dwtools/LFCC.cpp
+++ b/dwtools/LFCC.cpp
@@ -36,7 +36,7 @@ LFCC LFCC_create (double tmin, double tmax, long nt, double dt, double t1,
 		CC_init (me.peek(), tmin, tmax, nt, dt, t1, maximumNumberOfCoefficients, fmin, fmax);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("LFCC not created.");
+		Melder_throw (U"LFCC not created.");
 	}
 }
 
diff --git a/dwtools/LongSound_extensions.cpp b/dwtools/LongSound_extensions.cpp
index a8175fa..04b0ba3 100644
--- a/dwtools/LongSound_extensions.cpp
+++ b/dwtools/LongSound_extensions.cpp
@@ -32,7 +32,9 @@
 #include "LongSound_extensions.h"
 
 #if defined (_WIN32)
+#include "winport_on.h"
 #include <windows.h>
+#include "winport_off.h"
 #elif defined(linux)
 #include <unistd.h>
 #include <sys/types.h>
@@ -75,11 +77,11 @@ void LongSounds_writeToStereoAudioFile16 (LongSound me, LongSound thee, int audi
 		long numberOfReads = (nx - 1) / nbuf + 1, numberOfBitsPerSamplePoint = 16;
 
 		if (thy numberOfChannels != my numberOfChannels || my numberOfChannels != 1) {
-			Melder_throw ("LongSounds must be mono.");
+			Melder_throw (U"LongSounds should be mono.");
 		}
 
 		if (my sampleRate != thy sampleRate) {
-			Melder_throw ("Sample rates must be equal.");
+			Melder_throw (U"Sample rates should be equal.");
 		}
 
 		/*
@@ -93,7 +95,7 @@ void LongSounds_writeToStereoAudioFile16 (LongSound me, LongSound thee, int audi
 		autoNUMvector<short> buffer (1, nchannels * nbuf);
 
 		autoMelderFile f  = MelderFile_create (file);
-		MelderFile_writeAudioFileHeader (file, audioFileType, my sampleRate, nx, nchannels, numberOfBitsPerSamplePoint);
+		MelderFile_writeAudioFileHeader (file, audioFileType, (long) floor (my sampleRate), nx, nchannels, numberOfBitsPerSamplePoint);
 
 		for (long i = 1; i <= numberOfReads; i++) {
 			long n_to_write = i == numberOfReads ? (nx - 1) % nbuf + 1 : nbuf;
@@ -102,10 +104,10 @@ void LongSounds_writeToStereoAudioFile16 (LongSound me, LongSound thee, int audi
 			MelderFile_writeShortToAudio (file, nchannels, Melder_defaultAudioFileEncoding (audioFileType,
                 numberOfBitsPerSamplePoint), buffer.peek(), n_to_write);
 		}
-		MelderFile_writeAudioFileTrailer (file, audioFileType, my sampleRate, nx, nchannels, numberOfBitsPerSamplePoint);
+		MelderFile_writeAudioFileTrailer (file, audioFileType, (long) floor (my sampleRate), nx, nchannels, numberOfBitsPerSamplePoint);
 		f.close ();
 	} catch (MelderError) {
-		Melder_throw (me, ": no stereo audio file created.");
+		Melder_throw (me, U": no stereo audio file created.");
 	}
 }
 
@@ -122,16 +124,16 @@ static void MelderFile_truncate (MelderFile me, long size) {
 	HANDLE hFile;
 	DWORD fdwAccess = GENERIC_READ | GENERIC_WRITE, fPos;
 	DWORD fdwShareMode = 0; /* File cannot be shared */
-	LPSECURITY_ATTRIBUTES lpsa = NULL;
+	LPSECURITY_ATTRIBUTES lpsa = nullptr;
 	DWORD fdwCreate = OPEN_EXISTING;
 	LARGE_INTEGER fileSize;
 
 	MelderFile_close (me);
 
-	hFile = CreateFileW (my path, fdwAccess, fdwShareMode, lpsa, fdwCreate,
-	                     FILE_ATTRIBUTE_NORMAL, NULL);
+	hFile = CreateFileW (Melder_peek32toW (my path), fdwAccess, fdwShareMode, lpsa, fdwCreate,
+	                     FILE_ATTRIBUTE_NORMAL, nullptr);
 	if (hFile == INVALID_HANDLE_VALUE) {
-		Melder_throw ("Can't open file ", MelderFile_messageName (me), ".");
+		Melder_throw (U"Can't open file ", me, U".");
 	}
 
 	// Set current file pointer to position 'size'
@@ -140,7 +142,7 @@ static void MelderFile_truncate (MelderFile me, long size) {
 	fileSize.HighPart = 0; /* Limit the file size to 2^32 - 2 bytes */
 	fPos = SetFilePointer (hFile, fileSize.LowPart, &fileSize.HighPart, FILE_BEGIN);
 	if (fPos == 0xFFFFFFFF) {
-		Melder_throw ("Can't set the position at size ", size, "for file ", 	MelderFile_messageName (me), ".");
+		Melder_throw (U"Can't set the position at size ", size, U"for file ", me, U".");
 	}
 
 	// Limit the file size as the current position of the file pointer.
@@ -151,10 +153,10 @@ static void MelderFile_truncate (MelderFile me, long size) {
 #elif defined(linux) || defined(macintosh)
 
 	MelderFile_close (me);
-	if (truncate (Melder_peekWcsToUtf8 (my path), size) == -1) Melder_throw ("Truncating failed for file ",
-		        MelderFile_messageName (me), " (", Melder_peekUtf8ToWcs (strerror (errno)), ").");
+	if (truncate (Melder_peek32to8 (my path), size) == -1) Melder_throw (U"Truncating failed for file ",
+		        MelderFile_messageName (me), U" (", Melder_peek8to32 (strerror (errno)), U").");
 #else
-	Melder_throw ("Don't know what to do.");
+	Melder_throw (U"Don't know what to do.");
 #endif
 }
 
@@ -182,7 +184,7 @@ void LongSounds_appendToExistingSoundFile (Collection me, MelderFile file) {
 	long pre_append_endpos = 0, numberOfBitsPerSamplePoint = 16;
 	try {
 		if (my size < 1) {
-			Melder_throw ("No Sound or LongSound objects to append.");
+			Melder_throw (U"No Sound or LongSound objects to append.");
 		}
 
 		/*
@@ -205,12 +207,12 @@ void LongSounds_appendToExistingSoundFile (Collection me, MelderFile file) {
 		                    &encoding, &sampleRate_d, &startOfData, &numberOfSamples);
 
 		if (audioFileType == 0) {
-			Melder_throw ("Not a sound file.");
+			Melder_throw (U"Not a sound file.");
 		}
 
 		// Check whether all the sample rates and channels match.
 
-		long sampleRate = sampleRate_d;
+		long sampleRate = (long) floor (sampleRate_d);
 		for (long i = 1; i <= my size; i++) {
 			int sampleRatesMatch, numbersOfChannelsMatch;
 			Sampled data = (Sampled) my item [i];
@@ -226,10 +228,10 @@ void LongSounds_appendToExistingSoundFile (Collection me, MelderFile file) {
 				numberOfSamples += longSound -> nx;
 			}
 			if (! sampleRatesMatch) {
-				Melder_throw ("Sample rates do not match.");
+				Melder_throw (U"Sample rates do not match.");
 			}
 			if (! numbersOfChannelsMatch) {
-				Melder_throw ("Cannot mix stereo and mono.");
+				Melder_throw (U"Cannot mix stereo and mono.");
 			}
 		}
 
@@ -251,7 +253,7 @@ void LongSounds_appendToExistingSoundFile (Collection me, MelderFile file) {
 				writePartToOpenFile16 (longSound, audioFileType, 1, longSound -> nx, file);
 			}
 			if (errno != 0) {
-				Melder_throw ("Error during writing.");
+				Melder_throw (U"Error during writing.");
 			}
 		}
 
@@ -267,7 +269,7 @@ void LongSounds_appendToExistingSoundFile (Collection me, MelderFile file) {
 			// Restore file at original size
 			int error = errno;
 			MelderFile_truncate (file, pre_append_endpos);
-			Melder_throw ("File ", MelderFile_messageName (file), L" restored to original size (", strerror (error), ").");
+			Melder_throw (U"File ", MelderFile_messageName (file), U" restored to original size (", Melder_peek8to32 (strerror (error)), U").");
 		} throw;
 	}
 }
diff --git a/dwtools/LongSound_extensions.h b/dwtools/LongSound_extensions.h
index e2c13bf..e57d59c 100644
--- a/dwtools/LongSound_extensions.h
+++ b/dwtools/LongSound_extensions.h
@@ -27,12 +27,6 @@
 
 #include "LongSound.h"
 
-#if defined (_WIN32)
-        #include "winport_on.h"
-        #include <windows.h>
-        #include "winport_off.h"
-#endif
-
 void LongSounds_writeToStereoAudioFile16 (LongSound me, LongSound thee,
 	int audioFileType, MelderFile file);
 
diff --git a/dwtools/Ltas_extensions.cpp b/dwtools/Ltas_extensions.cpp
index e2c1ef8..2d4ea57 100644
--- a/dwtools/Ltas_extensions.cpp
+++ b/dwtools/Ltas_extensions.cpp
@@ -27,7 +27,7 @@ void Ltas_fitTiltLine (Ltas me, double fmin, double fmax, bool lnf, int method,
 		}
 		long ifmin, ifmax, numberOfSamples = Sampled_getWindowSamples (me, fmin, fmax, &ifmin, &ifmax);
 		if (numberOfSamples < 2) {
-			Melder_throw ("There must be at least two data points to fit a line.");
+			Melder_throw (U"There must be at least two data points to fit a line.");
 		}
 		autoNUMvector<double> x (1, numberOfSamples);
 		autoNUMvector<double> y (1, numberOfSamples);
@@ -42,7 +42,7 @@ void Ltas_fitTiltLine (Ltas me, double fmin, double fmax, bool lnf, int method,
 		}
 		NUMlineFit (x.peek(), y.peek(), numberOfSamples, a, b, method);
 	} catch (MelderError) {
-		Melder_throw ("Tilt line not determined.");
+		Melder_throw (U"Tilt line not determined.");
 	}
 }
 
diff --git a/dwtools/MDS.cpp b/dwtools/MDS.cpp
index d85595d..f5af173 100644
--- a/dwtools/MDS.cpp
+++ b/dwtools/MDS.cpp
@@ -1,6 +1,6 @@
 /* MDS.cpp
  *
- * Copyright (C) 1993-2014 David Weenink
+ * Copyright (C) 1993-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,7 +24,7 @@
  djmw 20040309 Extra tests for empty objects.
  djmw 20061218 Changed to Melder_information<x> format.
  djmw 20071022 Removed unused code.
- djmw 20071106 drawSplines: to wchar_t
+ djmw 20071106 drawSplines: to wchar
  djmw 20071201 Melder_warning<n>
  djmw 20071213 Removed Preference.
  djmw 20080724 Thing_classNameW ->Thing_className
@@ -42,8 +42,7 @@
 
 /********************** NUMERICAL STUFF **************************************/
 
-static void NUMdmatrix_into_vector (double **m, double *v, long r1, long r2,
-                                    long c1, long c2) {
+static void NUMdmatrix_into_vector (double **m, double *v, long r1, long r2, long c1, long c2) {
 	long k = 1;
 
 	for (long i = r1; i <= r2; i++) {
@@ -53,8 +52,7 @@ static void NUMdmatrix_into_vector (double **m, double *v, long r1, long r2,
 	}
 }
 
-static void NUMdvector_into_matrix (const double *v, double **m,
-                                    long r1, long r2, long c1, long c2) {
+static void NUMdvector_into_matrix (const double *v, double **m, long r1, long r2, long c1, long c2) {
 	long k = 1;
 
 	for (long i = r1; i <= r2; i++) {
@@ -66,12 +64,12 @@ static void NUMdvector_into_matrix (const double *v, double **m,
 
 static void NUMdmatrix_normalizeRows (double **m, long nr, long nc) {
 	for (long i = 1; i <= nr; i++) {
-		double rowSum = 0;
+		double rowSum = 0.0;
 		for (long j = 1; j <= nc; j++) {
 			rowSum += m[i][j];
 		}
 
-		if (rowSum != 0) {
+		if (rowSum != 0.0) {
 			for (long j = 1; j <= nc; j++) {
 				m[i][j] /= rowSum;
 			}
@@ -94,7 +92,7 @@ static long NUMdmatrix_countZeros (double **m, long nr, long nc) {
 
 static void NUMsort3 (double *data, long *iPoint, long *jPoint, long ifrom, long ito, int ascending) {
 	if (ifrom > ito || ifrom < 1) {
-		Melder_throw ("invalid range.");
+		Melder_throw (U"invalid range.");
 	}
 	long n = ito - ifrom + 1;
 	if (n == 1) {
@@ -148,7 +146,7 @@ Distances Configurations_to_Distances (Configurations me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Distances not created form Configurations.");
+		Melder_throw (U"Distances not created form Configurations.");
 	}
 }
 
@@ -158,21 +156,21 @@ Similarity Configurations_to_Similarity_cc (Configurations me, Weight weight) {
 		autoSimilarity thee = Distances_to_Similarity_cc (d.peek(), weight);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Similarity not created form Configurations.");
+		Melder_throw (U"Similarity not created form Configurations.");
 	}
 }
 
 Similarity Distances_to_Similarity_cc (Distances me, Weight w) {
 	try {
 		if (my size == 0) {
-			Melder_throw ("Distances is empty.");
+			Melder_throw (U"Distances is empty.");
 		}
 		if (! TablesOfReal_checkDimensions (me)) {
-			Melder_throw ("All matrices must have the same dimensions.");
+			Melder_throw (U"All matrices must have the same dimensions.");
 		}
-		autoWeight aw = 0;
-		if (w == 0) {
-			aw.reset (Weight_create ( ( (Distance) (my item[1])) -> numberOfRows));
+		autoWeight aw;
+		if (! w) {
+			aw.reset (Weight_create (((Distance) (my item[1])) -> numberOfRows));
 			w = aw.peek();
 		}
 
@@ -180,7 +178,7 @@ Similarity Distances_to_Similarity_cc (Distances me, Weight w) {
 
 		for (long i = 1; i <= my size; i++) {
 			Distance di = (Distance) (my item[i]);
-			wchar_t *name = Thing_getName (di);
+			char32 *name = Thing_getName (di);
 			TableOfReal_setRowLabel (thee.peek(), i, name);
 			TableOfReal_setColumnLabel (thee.peek(), i, name);
 			thy data[i][i] = 1;
@@ -191,7 +189,7 @@ Similarity Distances_to_Similarity_cc (Distances me, Weight w) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Similarity not created form Distancess.");
+		Melder_throw (U"Similarity not created form Distancess.");
 	}
 }
 
@@ -200,15 +198,13 @@ Similarity Distances_to_Similarity_cc (Distances me, Weight w) {
 
 Thing_implement (Transformator, Thing, 0);
 
-Distance structTransformator :: v_transform (MDSVec vec, Distance dist, Weight w) {
+Distance structTransformator :: v_transform (MDSVec vec, Distance dist, Weight /* w */) {
 	try {
-		(void) w;
-
 		autoDistance thee = Distance_create (numberOfPoints);
 		TableOfReal_copyLabels (dist, thee.peek(), 1, 1);
-		/*
-			Absolute scaling
-		*/
+
+		// Absolute scaling
+
 		for (long i = 1; i <= vec -> nProximities; i++) {
 			long ii = vec -> iPoint[i];
 			long jj = vec -> jPoint[i];
@@ -216,12 +212,11 @@ Distance structTransformator :: v_transform (MDSVec vec, Distance dist, Weight w
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Distance not created.");
+		Melder_throw (U"Distance not created.");
 	}
 }
 
-void Transformator_init (I, long numberOfPoints) {
-	iam (Transformator);
+void Transformator_init (Transformator me, long numberOfPoints) {
 	my numberOfPoints = numberOfPoints;
 	my normalization = 1;
 }
@@ -233,21 +228,20 @@ Transformator Transformator_create (long numberOfPoints) {
 		my normalization = 0;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No Transformator created.");
+		Melder_throw (U"No Transformator created.");
 	}
 }
 
-Distance Transformator_transform (I, MDSVec vec, Distance d, Weight w) {
-	iam (Transformator);
+Distance Transformator_transform (Transformator me, MDSVec vec, Distance d, Weight w) {
 	try {
 		if (my numberOfPoints != vec -> nPoints ||
 		        my numberOfPoints != d -> numberOfRows ||
 		        d -> numberOfRows != w -> numberOfRows) {
-			Melder_throw (L"Dimensions do not agree.");
+			Melder_throw (U"Dimensions do not agree.");
 		}
 		return my v_transform (vec, d, w);
 	} catch (MelderError) {
-		Melder_throw (me, "Distance not created.");
+		Melder_throw (me, U"Distance not created.");
 	}
 }
 
@@ -259,7 +253,7 @@ Distance structRatioTransformator :: v_transform (MDSVec vec, Distance d, Weight
 
 	// Determine ratio (eq. 9.4)
 
-	double etaSq = 0, rho = 0;
+	double etaSq = 0.0, rho = 0.0;
 	for (long i = 1; i <= vec -> nProximities; i++) {
 		long ii = vec -> iPoint[i];
 		long jj = vec -> jPoint[i];
@@ -271,8 +265,8 @@ Distance structRatioTransformator :: v_transform (MDSVec vec, Distance d, Weight
 
 	// transform
 
-	if (etaSq == 0) {
-		Melder_throw ("Eta squared is zero.");
+	if (etaSq == 0.0) {
+		Melder_throw (U"Eta squared is zero.");
 	}
 	this -> ratio = rho / etaSq;
 	for (long i = 1; i <= vec -> nProximities; i++) {
@@ -293,7 +287,7 @@ RatioTransformator RatioTransformator_create (long numberOfPoints) {
 		Transformator_init (me.peek(), numberOfPoints);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("RatioTransformator not created.");
+		Melder_throw (U"RatioTransformator not created.");
 	}
 }
 
@@ -307,7 +301,7 @@ Distance structMonotoneTransformator :: v_transform (MDSVec vec, Distance d, Wei
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Distance not created.");
+		Melder_throw (U"Distance not created.");
 	}
 
 }
@@ -319,12 +313,11 @@ MonotoneTransformator MonotoneTransformator_create (long numberOfPoints) {
 		my tiesProcessing = MDS_PRIMARY_APPROACH;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("MonotoneTransformator not created.");
+		Melder_throw (U"MonotoneTransformator not created.");
 	}
 }
 
-void MonotoneTransformator_setTiesProcessing (MonotoneTransformator me,
-        int tiesProcessing) {
+void MonotoneTransformator_setTiesProcessing (MonotoneTransformator me, int tiesProcessing) {
 	my tiesProcessing = tiesProcessing;
 }
 
@@ -365,30 +358,27 @@ Distance structISplineTransformator :: v_transform (MDSVec vec, Distance dist, W
 		knot [order + 1 + i] = NUMquantile (nx, vec -> proximity, fraction);
 	}
 
-	/*
-		Calculate data matrix m.
-	*/
+	// Calculate data matrix m.
 
 	for (long i = 1; i <= nx; i++) {
 		double y, x = vec -> proximity [i];
-		m [i] [1] = 1;
+		m[i][1] = 1.0;
 		for (long j = 2; j <= numberOfParameters; j++) {
 			try {
 				NUMispline (knot, nKnots, order, j - 1, x, & y);
 			} catch (MelderError) {
-				Melder_throw ("I-spline[", j - 1, "], data[", i, "d] = ", x);
+				Melder_throw (U"I-spline[", j - 1, U"], data[", i, U"d] = ", x);
 			}
-			m [i] [j] = y;
+			m[i][j] = y;
 		}
 	}
 
-	NUMsolveNonNegativeLeastSquaresRegression (m, nx, numberOfParameters,
-	        d.peek(), tol, itermax, b);
+	NUMsolveNonNegativeLeastSquaresRegression (m, nx, numberOfParameters, d.peek(), tol, itermax, b);
 
 	for (long i = 1; i <= nx; i++) {
 		long ii = vec->iPoint[i];
 		long jj = vec->jPoint[i];
-		double r = 0;
+		double r = 0.0;
 
 		for (long j = 1; j <= numberOfParameters; j++) {
 			r += m[i][j] * b[j];
@@ -402,8 +392,7 @@ Distance structISplineTransformator :: v_transform (MDSVec vec, Distance dist, W
 	return thee.transfer();
 }
 
-ISplineTransformator ISplineTransformator_create (long numberOfPoints,
-        long numberOfInteriorKnots, long order) {
+ISplineTransformator ISplineTransformator_create (long numberOfPoints, long numberOfInteriorKnots, long order) {
 	try {
 		autoISplineTransformator me = Thing_new (ISplineTransformator);
 		long nData = (numberOfPoints - 1) * numberOfPoints / 2;
@@ -423,14 +412,14 @@ ISplineTransformator ISplineTransformator_create (long numberOfPoints,
 		my m = NUMmatrix<double> (1, nData, 1, my numberOfParameters);
 
 		for (long i = 1; i <= my numberOfParameters; i++) {
-			my b[i] = NUMrandomUniform (0, 1);
+			my b[i] = NUMrandomUniform (0.0, 1.0);
 		}
 
 		my numberOfInteriorKnots = numberOfInteriorKnots;
 		my order = order;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ISplineTransformator not created.");
+		Melder_throw (U"ISplineTransformator not created.");
 	}
 }
 
@@ -450,38 +439,33 @@ Configuration ContingencyTable_to_Configuration_ca (ContingencyTable me, long nu
 			numberOfDimensions = dimmin - 1;
 		}
 		if (numberOfDimensions >= dimmin) {
-			Melder_throw ("Dimension too high.");
+			Melder_throw (U"Dimension too high.");
 		}
 
-		/*
-			Ref: A. Gifi (1990), Nonlinear Multivariate Analysis, Wiley & Sons,
-				reprinted 1996,
-				Chapter 8, Multidimensional scaling and Correspondence Analysis.
-			Get row and column marginals
-		*/
+		// Ref: A. Gifi (1990), Nonlinear Multivariate Analysis, Wiley & Sons, reprinted 1996,
+		//		Chapter 8, Multidimensional scaling and Correspondence Analysis.
+		// Get row and column marginals
 
-		double sum = 0;
+		double sum = 0.0;
 		for (long i = 1; i <= nr; i++) {
 			for (long j = 1; j <= nc; j++) {
 				rowsum[i] += my data[i][j];
 				colsum[j] += my data[i][j];
 			}
-			if (rowsum[i] <= 0) {
-				Melder_throw ("Empty row: ", i, ".");
+			if (rowsum[i] <= 0.0) {
+				Melder_throw (U"Empty row: ", i, U".");
 			}
 			sum += rowsum[i];
 		}
 
 		for (long j = 1; j <= nc; j++) {
-			if (colsum[j] <= 0) {
-				Melder_throw ("Empty column: ", j, ".");
+			if (colsum[j] <= 0.0) {
+				Melder_throw (U"Empty column: ", j, U".");
 			}
 		}
 
-		/*
-			Remove trivial singular vectors (Eq. 8.24),
-			construct Dr^(-1/2) H Dc^(-1/2) - Dr^(1/2) uu' Dc^(1/2) / N
-		*/
+		// Remove trivial singular vectors (Eq. 8.24),
+		// construct Dr^(-1/2) H Dc^(-1/2) - Dr^(1/2) uu' Dc^(1/2) / N
 
 		for (long i = 1; i <= nr; i++) {
 			for (long j = 1; j <= nc; j++) {
@@ -490,37 +474,31 @@ Configuration ContingencyTable_to_Configuration_ca (ContingencyTable me, long nu
 			}
 		}
 
-		/*
-			Singular value decomposition of h
-		*/
+		// Singular value decomposition of h
 
 		autoSVD svd = SVD_create_d (h.peek(), nr, nc);
 		SVD_zeroSmallSingularValues (svd.peek(), 0);
 
-		/*
-			Scale row vectors and column vectors to configuration.
-		*/
+		// Scale row vectors and column vectors to configuration.
 
 		for (long j = 1; j <= numberOfDimensions; j++) {
 			double rootsum = sqrt (sum), xfactor, yfactor, lambda = svd -> d[j];
 			if (scaling == 1) {
-				/*
-					Scale row points in the centre of gravity of
-					column points (eq 8.5.a)
-				*/
+
+				// Scale row points in the centre of gravity of column points (eq 8.5.a)
+
 				xfactor = rootsum * lambda;
 				yfactor = rootsum;
 			} else if (scaling == 2) {
-				/*
-					Scale column points in the centre of gravity of
-					row points (8.5.b)
-				*/
+
+				// Scale column points in the centre of gravity of row points (8.5.b)
+
 				xfactor = rootsum;
 				yfactor = rootsum * lambda;
 			} else if (scaling == 3) {
-				/*
-					Treat row and columns symmetrically (8.5.c).
-				*/
+
+				// Treat row and columns symmetrically (8.5.c).
+
 				xfactor = yfactor = rootsum * sqrt (lambda);
 			} else {
 				break;
@@ -533,7 +511,7 @@ Configuration ContingencyTable_to_Configuration_ca (ContingencyTable me, long nu
 			}
 		}
 
-		TableOfReal_setSequentialColumnLabels (thee.peek(), 0, 0, NULL, 1, 1);
+		TableOfReal_setSequentialColumnLabels (thee.peek(), 0, 0, nullptr, 1, 1);
 		NUMstrings_copyElements (my rowLabels, thy rowLabels, 1, nr);
 		for (long i = 1; i <= nc; i++) {
 			if (my columnLabels[i]) {
@@ -542,105 +520,98 @@ Configuration ContingencyTable_to_Configuration_ca (ContingencyTable me, long nu
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created.");
+		Melder_throw (me, U": no Configuration created.");
 	}
 }
 
-Dissimilarity TableOfReal_to_Dissimilarity (I) {
-	iam (TableOfReal);
+Dissimilarity TableOfReal_to_Dissimilarity (TableOfReal me) {
 	try {
 		if (my numberOfRows != my numberOfColumns) {
-			Melder_throw ("TableOfReal must be a square tabel.");
+			Melder_throw (U"TableOfReal must be a square tabel.");
 		}
 		TableOfReal_checkPositive (me);
 		autoDissimilarity thee = Thing_new (Dissimilarity);
 		my structTableOfReal :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Dissimilarity.");
+		Melder_throw (me, U": not converted to Dissimilarity.");
 	}
 }
 
-Similarity TableOfReal_to_Similarity (I) {
-	iam (TableOfReal);
+Similarity TableOfReal_to_Similarity (TableOfReal me) {
 	try {
 		if (my numberOfRows != my numberOfColumns) {
-			Melder_throw ("TableOfReal must be a square table.");
+			Melder_throw (U"TableOfReal must be a square table.");
 		}
 		TableOfReal_checkPositive (me);
 		autoSimilarity thee = Thing_new (Similarity);
 		my structTableOfReal :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Similarity.");
+		Melder_throw (me, U": not converted to Similarity.");
 	}
 }
 
-Distance TableOfReal_to_Distance (I) {
-	iam (TableOfReal);
+Distance TableOfReal_to_Distance (TableOfReal me) {
 	try {
 		if (my numberOfRows != my numberOfColumns) {
-			Melder_throw ("TableOfReal must be a square table.");
+			Melder_throw (U"TableOfReal must be a square table.");
 		}
 		TableOfReal_checkPositive (me);
 		autoDistance thee = Thing_new (Distance);
 		my structTableOfReal :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Distance.");
+		Melder_throw (me, U": not converted to Distance.");
 	}
 }
 
-Salience TableOfReal_to_Salience (I) {
-	iam (TableOfReal);
+Salience TableOfReal_to_Salience (TableOfReal me) {
 	try {
 		TableOfReal_checkPositive (me);
 		autoSalience thee = Thing_new (Salience);
 		my structTableOfReal :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Salience.");
+		Melder_throw (me, U": not converted to Salience.");
 	}
 }
 
-Weight TableOfReal_to_Weight (I) {
-	iam (TableOfReal);
+Weight TableOfReal_to_Weight (TableOfReal me) {
 	try {
 		TableOfReal_checkPositive (me);
 		autoWeight thee = Thing_new (Weight);
 		my structTableOfReal :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Weight.");
+		Melder_throw (me, U": not converted to Weight.");
 	}
 }
 
-ScalarProduct TableOfReal_to_ScalarProduct (I) {
-	iam (TableOfReal);
+ScalarProduct TableOfReal_to_ScalarProduct (TableOfReal me) {
 	try {
 		if (my numberOfRows != my numberOfColumns) {
-			Melder_throw ("TableOfReal must be a square table.");
+			Melder_throw (U"TableOfReal must be a square table.");
 		}
 		autoScalarProduct thee = Thing_new (ScalarProduct);
 		my structTableOfReal :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to ScalarProduct.");
+		Melder_throw (me, U": not converted to ScalarProduct.");
 	}
 }
 
 /**************** Covariance & Correlation to Configuration *****************/
 
-Configuration SSCP_to_Configuration (I, long numberOfDimensions) {
-	iam (SSCP);
+Configuration SSCP_to_Configuration (SSCP me, long numberOfDimensions) {
 	try {
 		autoConfiguration thee = Configuration_create (my numberOfRows, numberOfDimensions);
 		autoPCA a = SSCP_to_PCA (me);
-		TableOfReal_setSequentialColumnLabels (thee.peek(), 0, 0, NULL, 1, 1);
+		TableOfReal_setSequentialColumnLabels (thee.peek(), 0, 0, nullptr, 1, 1);
 
 		for (long i = 1; i <= my numberOfRows; i++) {
 			for (long j = 1; j <= numberOfDimensions; j++) {
-				double s = 0;
+				double s = 0.0;
 				for (long k = 1; k <= my numberOfRows; k++) {
 					s += my data[k][i] * a -> eigenvectors[k][j];
 				}
@@ -649,17 +620,15 @@ Configuration SSCP_to_Configuration (I, long numberOfDimensions) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created.");
+		Melder_throw (me, U": no Configuration created.");
 	}
 }
 
-Configuration Covariance_to_Configuration (Covariance me,
-        long numberOfDimensions) {
+Configuration Covariance_to_Configuration (Covariance me, long numberOfDimensions) {
 	return SSCP_to_Configuration (me, numberOfDimensions);
 }
 
-Configuration Correlation_to_Configuration (Correlation me,
-        long numberOfDimensions) {
+Configuration Correlation_to_Configuration (Correlation me, long numberOfDimensions) {
 	return SSCP_to_Configuration (me, numberOfDimensions);
 }
 
@@ -673,12 +642,12 @@ Weight Weight_create (long numberOfPoints) {
 		TableOfReal_init (me.peek(), numberOfPoints, numberOfPoints);
 		for (long i = 1; i <= numberOfPoints; i++) {
 			for (long j = 1; j <= numberOfPoints; j++) {
-				my data[i][j] = 1;
+				my data[i][j] = 1.0;
 			}
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Weight not created.");
+		Melder_throw (U"Weight not created.");
 	}
 }
 
@@ -694,7 +663,7 @@ Salience Salience_create (long numberOfSources, long numberOfDimensions) {
 		Salience_setDefaults (me.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Salience not created.");
+		Melder_throw (U"Salience not created.");
 	}
 }
 
@@ -707,7 +676,7 @@ long Salience_correctNegatives (Salience me) {
 	long nNegatives = 0;
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			if (my data[i][j] < 0) {
+			if (my data[i][j] < 0.0) {
 				nNegatives++;
 				my data[i][j] = - my data[i][j];
 			}
@@ -719,22 +688,19 @@ long Salience_correctNegatives (Salience me) {
 void Salience_setDefaults (Salience me) {
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			my data[i][j] = 1 / sqrt (my numberOfColumns);
+			my data[i][j] = 1.0 / sqrt (my numberOfColumns);
 		}
 	}
 	for (long j = 1; j <= my numberOfColumns; j++) {
-		wchar_t s[40];
-		swprintf (s, 40, L"dimension %ld", j);
-		TableOfReal_setColumnLabel (me, j, s);
+		TableOfReal_setColumnLabel (me, j, Melder_cat (U"dimension ", j));
 	}
 }
 
 void Salience_draw (Salience me, Graphics g, int ix, int iy, int garnish) {
 	long nc2, nc1 = ix < iy ? (nc2 = iy, ix) : (nc2 = ix, iy);
-	double xmin = 0, xmax = 1, ymin = 0, ymax = 1, wmax = 1;
+	double xmin = 0.0, xmax = 1.0, ymin = 0.0, ymax = 1.0, wmax = 1.0;
 
-	if (ix < 1 || ix > my numberOfColumns ||
-	        iy < 1 || iy > my numberOfColumns) {
+	if (ix < 1 || ix > my numberOfColumns || iy < 1 || iy > my numberOfColumns) {
 		return;
 	}
 
@@ -764,17 +730,17 @@ void Salience_draw (Salience me, Graphics g, int ix, int iy, int garnish) {
 
 	if (garnish) {
 		if (my columnLabels[ix]) {
-			Graphics_textBottom (g, 0, my columnLabels[ix]);
+			Graphics_textBottom (g, false, my columnLabels[ix]);
 		}
 		if (my columnLabels[iy]) {
-			Graphics_textLeft (g, 0, my columnLabels[iy]);
+			Graphics_textLeft (g, false, my columnLabels[iy]);
 		}
 	}
 }
 
 /******** MDSVEC *******************************************/
 
-Thing_implement (MDSVec, Data, 0);
+Thing_implement (MDSVec, Daata, 0);
 
 void structMDSVec :: v_destroy () {
 	NUMvector_free<double> (proximity, 1);
@@ -793,7 +759,7 @@ MDSVec MDSVec_create (long nPoints) {
 		my jPoint = NUMvector<long> (1, my nProximities);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("MDSVec not created.");
+		Melder_throw (U"MDSVec not created.");
 	}
 }
 
@@ -805,7 +771,7 @@ MDSVec Dissimilarity_to_MDSVec (Dissimilarity me) {
 		for (long i = 1; i <= my numberOfRows - 1; i++) {
 			for (long j = i + 1; j <= my numberOfColumns; j++) {
 				double f = (my data[i][j] + my data[j][i]) / 2;
-				if (f > 0) {
+				if (f > 0.0) {
 					k++;
 					thy proximity[k] = f;
 					thy iPoint[k] = i;
@@ -817,7 +783,7 @@ MDSVec Dissimilarity_to_MDSVec (Dissimilarity me) {
 		NUMsort3 (thy proximity, thy iPoint, thy jPoint, 1, k, 1);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MDSVec created.");
+		Melder_throw (me, U": no MDSVec created.");
 	}
 }
 
@@ -832,7 +798,7 @@ MDSVecs MDSVecs_create () {
 		Ordered_init (me.peek(), classMDSVec, 10);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("MDSVecs not created.");
+		Melder_throw (U"MDSVecs not created.");
 	}
 }
 
@@ -846,7 +812,7 @@ MDSVecs Dissimilarities_to_MDSVecs (Dissimilarities me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MDSVecs created.");
+		Melder_throw (me, U": no MDSVecs created.");
 	}
 }
 
@@ -861,7 +827,7 @@ Confusions Confusions_create () {
 		Proximities_init (me.peek(), classConfusion);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Confusions not created.");
+		Melder_throw (U"Confusions not created.");
 	}
 }
 
@@ -871,7 +837,7 @@ Confusion Confusions_sum (Confusions me) {
 		autoConfusion thee = TableOfReal_to_Confusion (sum.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not created.");
+		Melder_throw (me, U": sum not created.");
 	}
 }
 
@@ -886,7 +852,7 @@ Distances Distances_create () {
 		Proximities_init (me.peek(), classDistance);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Distances not created.");
+		Melder_throw (U"Distances not created.");
 	}
 }
 
@@ -901,7 +867,7 @@ ScalarProduct ScalarProduct_create (long numberOfPoints) {
 		TableOfReal_init (me.peek(), numberOfPoints, numberOfPoints);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ScalarProduct not created.");
+		Melder_throw (U"ScalarProduct not created.");
 	}
 }
 
@@ -916,7 +882,7 @@ ScalarProducts ScalarProducts_create () {
 		TablesOfReal_init (me.peek(), classScalarProduct);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ScalarProducts not created.");
+		Melder_throw (U"ScalarProducts not created.");
 	}
 }
 
@@ -930,83 +896,79 @@ Dissimilarity Dissimilarity_create (long numberOfPoints) {
 		Proximity_init (me.peek(), numberOfPoints);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Dissimilarity not created.");
+		Melder_throw (U"Dissimilarity not created.");
 	}
 }
 
-int Dissimilarity_getAdditiveConstant (I, double *c) { // Why not: double Diss..(I) ???
-	*c = 0;
+static double Dissimilarity_getAverage (Dissimilarity me) {
+	double sum = 0.0;
+	long numberOfPositives = 0;
+	for (long i = 1; i <= my numberOfRows - 1; i++) {
+		for (long j = i + 1; j <= my numberOfRows; j++) {
+			double proximity = (my data[i][j] + my data[j][i]) / 2.0;
+			if (proximity > 0.0) {
+				numberOfPositives++;
+				sum += proximity;
+			}
+		}
+	}
+	return numberOfPositives > 0 ? sum /= numberOfPositives : NUMundefined;
+}
+
+double Dissimilarity_getAdditiveConstant (Dissimilarity me) {
+	double additiveConstant = NUMundefined;
 	try {
-		iam (Dissimilarity);
-		long nProximities = 0, nPoints = my numberOfRows, nPoints2 = 2 * nPoints;
-		double proximity;
+		long nPoints = my numberOfRows, nPoints2 = 2 * nPoints;
+
+		// Return c = average dissimilarity in case of failure
 
-		/*
-			Return c = average dissimilarity in case of failure
-		*/
 		if (nPoints < 1) {
-			Melder_throw ("Matrix part is empty.");
+			Melder_throw (U"Matrix part is empty.");
 		}
 
-		*c = 0;
-		for (long i = 1; i <= nPoints - 1; i++) {
-			for (long j = i + 1; j <= nPoints; j++) {
-				proximity = (my data[i][j] + my data[j][i]) / 2;
-				if (proximity > 0) {
-					nProximities++;
-					*c += proximity;
-				}
-			}
+		additiveConstant = Dissimilarity_getAverage (me);
+		if (additiveConstant == NUMundefined) {
+			Melder_throw (U"There are no positive dissimilarities.");
 		}
-		if (nProximities < 1) {
-			Melder_throw ("No proximities larger than zero.");
-		}
-		*c /= nProximities;
 
 		autoNUMmatrix<double> wd (1, nPoints, 1, nPoints);
 		autoNUMmatrix<double> wdsqrt (1, nPoints, 1, nPoints);
 		autoNUMmatrix<double> b (1, nPoints2, 1, nPoints2);
 		autoNUMvector<double> eigenvalue (1, nPoints2);
 
-		/*
-			The matrices D & D1/2 with distances (squared and linear)
-		*/
+		// The matrices D & D1/2 with distances (squared and linear)
 
 		for (long i = 1; i <= nPoints - 1; i++) {
 			for (long j = i + 1; j <= nPoints; j++) {
-				proximity = (my data[i][j] + my data[j][i]) / 2;
-				wdsqrt[i][j] = - proximity / 2;
-				wd[i][j] = - proximity * proximity / 2;
+				double proximity = (my data[i][j] + my data[j][i]) / 2.0;
+				wdsqrt[i][j] = - proximity / 2.0;
+				wd[i][j] = - proximity * proximity / 2.0;
 			}
 		}
 
 		NUMdoubleCentre (wdsqrt.peek(), 1, nPoints, 1, nPoints);
 		NUMdoubleCentre (wd.peek(), 1, nPoints, 1, nPoints);
 
-		/*
-			Calculate the B matrix according to eq. 6
-		*/
+		// Calculate the B matrix according to eq. 6
 
 		for (long i = 1; i <= nPoints; i++) {
 			for (long j = 1; j <= nPoints; j++) {
-				b[i][nPoints + j] = 2 * wd[i][j];
-				b[nPoints + i][nPoints + j] = -4 * wdsqrt[i][j];
-				b[nPoints + i][i] = -1;
+				b[i][nPoints + j] = 2.0 * wd[i][j];
+				b[nPoints + i][nPoints + j] = -4.0 * wdsqrt[i][j];
+				b[nPoints + i][i] = -1.0;
 			}
 		}
 
-		/*
-			Get eigenvalues and sort them descending
-		*/
+		// Get eigenvalues and sort them descending
 
-		NUMeigensystem (b.peek(), nPoints2, NULL, eigenvalue.peek());
-		if (eigenvalue[1] <= 0) {
-			Melder_throw ("Negative eigenvalue.");
+		NUMeigensystem (b.peek(), nPoints2, nullptr, eigenvalue.peek());
+		if (eigenvalue[1] <= 0.0) {
+			Melder_throw (U"Negative eigenvalue.");
 		}
-		*c = eigenvalue[1];
-		return 1;
+		additiveConstant = eigenvalue[1];
+		return additiveConstant;
 	} catch (MelderError) {
-		Melder_throw ("Additive constant not calculated.");
+		Melder_throw (U"Additive constant not calculated.");
 	}
 }
 
@@ -1021,7 +983,7 @@ Dissimilarities Dissimilarities_create () {
 		Proximities_init (me.peek(), classDissimilarity);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Dissimilarities not created.");
+		Melder_throw (U"Dissimilarities not created.");
 	}
 }
 
@@ -1036,7 +998,7 @@ Similarity Similarity_create (long numberOfPoints) {
 		Proximity_init (me.peek(), numberOfPoints);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Similarity not created.");
+		Melder_throw (U"Similarity not created.");
 	}
 }
 
@@ -1044,7 +1006,7 @@ Similarity Confusion_to_Similarity (Confusion me, int normalize,
                                     int symmetrizeMethod) {
 	try {
 		if (my numberOfColumns != my numberOfRows) {
-			Melder_throw ("Confusion must be a square table.");
+			Melder_throw (U"Confusion must be a square table.");
 		}
 
 		long nxy = my numberOfColumns;
@@ -1081,7 +1043,7 @@ Similarity Confusion_to_Similarity (Confusion me, int normalize,
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Similarity created.");
+		Melder_throw (me, U": no Similarity created.");
 	}
 }
 
@@ -1107,7 +1069,7 @@ Dissimilarity Similarity_to_Dissimilarity (Similarity me,
 		}
 
 		if (maximumDissimilarity < max) Melder_warning
-			(L"Your maximumDissimilarity is smaller than the maximum similarity. Some data may be lost.");
+			(U"Your maximumDissimilarity is smaller than the maximum similarity. Some data may be lost.");
 
 		for (long i = 1; i <= nxy; i++) {
 			for (long j = 1; j <= nxy; j++) {
@@ -1117,7 +1079,7 @@ Dissimilarity Similarity_to_Dissimilarity (Similarity me,
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Dissimilarity created.");
+		Melder_throw (me, U": no Dissimilarity created.");
 	}
 }
 
@@ -1127,11 +1089,10 @@ Distance Dissimilarity_to_Distance (Dissimilarity me, int scale) {
 
 		autoDistance thee = Distance_create (my numberOfRows);
 		TableOfReal_copyLabels (me, thee.peek(), 1, 1);
-		if (scale == MDS_ORDINAL &&
-		        ! Dissimilarity_getAdditiveConstant (me, &additiveConstant)) {
-			Melder_warning (L"Dissimilarity_to_Distance: could not determine "
-			                "\"additive constant\", the average dissimilarity was used as "
-			                "its value.");
+		if (scale == MDS_ORDINAL) {
+			if ((additiveConstant = Dissimilarity_getAdditiveConstant (me)) == NUMundefined) {
+				Melder_warning (U"Dissimilarity_to_Distance: could not determine \"additive constant\", the average dissimilarity was used as its value.");
+			}
 		}
 		for (long i = 1; i <= my numberOfRows - 1; i++) {
 			for (long j = i + 1; j <= my numberOfColumns; j++) {
@@ -1141,7 +1102,7 @@ Distance Dissimilarity_to_Distance (Dissimilarity me, int scale) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Distance created.");
+		Melder_throw (me, U": no Distance created.");
 	}
 }
 
@@ -1151,15 +1112,15 @@ Weight Dissimilarity_to_Weight (Dissimilarity me) {
 		TableOfReal_copyLabels (me, thee.peek(), 1, 1);
 		for (long i = 1; i <= my numberOfRows; i++) {
 			for (long j = i; j <= my numberOfRows; j++) {
-				if (my data[i][j] > 0) {
-					thy data[i][j] = 1;
+				if (my data[i][j] > 0.0) {
+					thy data[i][j] = 1.0;
 				}
 			}
-			thy data[i][i] = 0;
+			thy data[i][i] = 0.0;
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Weight created.");
+		Melder_throw (me, U": no Weight created.");
 	}
 }
 
@@ -1167,20 +1128,18 @@ Weight Dissimilarity_to_Weight (Dissimilarity me) {
 Dissimilarity Confusion_to_Dissimilarity_pdf (Confusion me, double minimumConfusionLevel) {
 	try {
 		if (my numberOfColumns != my numberOfRows) {
-			Melder_throw ("Confusion must be a square table.");
+			Melder_throw (U"Confusion must be a square table.");
 		}
-		Melder_assert (minimumConfusionLevel > 0);
+		Melder_assert (minimumConfusionLevel > 0.0);
 		autoDissimilarity thee = Dissimilarity_create (my numberOfColumns);
 		TableOfReal_copyLabels (me, thee.peek(), 1, 1);
 		NUMmatrix_copyElements (my data, thy data, 1, my numberOfRows, 1, my numberOfColumns);
 
-		/*
-			Correct "zero" responses.
-		*/
+		// Correct "zero" responses.
 
 		for (long i = 1; i <= my numberOfColumns; i++) {
 			for (long j = 1; j <= my numberOfColumns; j++) {
-				if (thy data[i][j] == 0) {
+				if (thy data[i][j] == 0.0) {
 					thy data[i][j] = minimumConfusionLevel;
 				}
 			}
@@ -1189,8 +1148,7 @@ Dissimilarity Confusion_to_Dissimilarity_pdf (Confusion me, double minimumConfus
 		NUMdmatrix_normalizeRows (thy data, my numberOfColumns, my numberOfColumns);
 
 		/*
-			Consider the fraction as the fraction overlap between two gaussians
-			with unequal sigmas (1 & s).
+			Consider the fraction as the fraction overlap between two gaussians with unequal sigmas (1 & s).
 			We have two matrix elements p[i][j] && p[j][i]
 
 			N (x, m, s) = 1 / (s * sqrt(2 pi)) exp(-((x - m) / s)^2 / 2)
@@ -1226,23 +1184,20 @@ Dissimilarity Confusion_to_Dissimilarity_pdf (Confusion me, double minimumConfus
 				double y = thy data[i][j] > thy data[j][i] ? thy data[i][j] : thy data[j][i];
 				x = NUMinvGaussQ (x);
 				y = NUMinvGaussQ (y);
-				double d = x + y * exp ( (y * y - x * x) / 2);
+				double d = x + y * exp ( (y * y - x * x) / 2.0);
 				/* Melder_info ("i, j, x, y, d: %d %d %.17g %.17g %.17g", i, j, x, y, d); */
 				thy data[i][j] = thy data [j][i] = d;
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Dissimilarity created from pdf.");
+		Melder_throw (me, U": no Dissimilarity created from pdf.");
 	}
 }
 
-void Distance_and_Configuration_drawScatterDiagram (Distance me,
-        Configuration him, Graphics g, double xmin, double xmax, double ymin,
-        double ymax, double size_mm, const wchar_t *mark, int garnish) {
+void Distance_and_Configuration_drawScatterDiagram (Distance me, Configuration him, Graphics g, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish) {
 	autoDistance dist = Configuration_to_Distance (him);
-	Proximity_Distance_drawScatterDiagram (me, dist.peek(), g, xmin, xmax, ymin,
-	                                       ymax, size_mm, mark, garnish);
+	Proximity_Distance_drawScatterDiagram (me, dist.peek(), g, xmin, xmax, ymin, ymax, size_mm, mark, garnish);
 }
 
 Dissimilarity Distance_to_Dissimilarity (Distance me) {
@@ -1252,14 +1207,14 @@ Dissimilarity Distance_to_Dissimilarity (Distance me) {
 		NUMmatrix_copyElements (my data, thy data, 1, my numberOfRows, 1, my numberOfColumns);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Dissimilarity not created from Distance.");
+		Melder_throw (U"Dissimilarity not created from Distance.");
 	}
 }
 
 Configuration Distance_to_Configuration_torsca (Distance me, int numberOfDimensions) {
 	try {
 		if (numberOfDimensions > my numberOfRows) {
-			Melder_throw ("Number of dimensions too high.");
+			Melder_throw (U"Number of dimensions too high.");
 		}
 		autoScalarProduct sp = Distance_to_ScalarProduct (me, 0);
 		autoConfiguration thee = Configuration_create (my numberOfRows, numberOfDimensions);
@@ -1267,7 +1222,7 @@ Configuration Distance_to_Configuration_torsca (Distance me, int numberOfDimensi
 		NUMprincipalComponents (sp -> data, my numberOfRows, numberOfDimensions, thy data);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created (torsca method).");
+		Melder_throw (me, U": no Configuration created (torsca method).");
 	}
 }
 
@@ -1277,9 +1232,9 @@ ScalarProduct Distance_to_ScalarProduct (Distance me, int normalize) {
 		TableOfReal_copyLabels (me, thee.peek(), 1, 1);
 		for (long i = 1; i <= my numberOfRows - 1; i++) {
 			for (long j = i + 1; j <= my numberOfColumns; j++) {
-				/*
-					force symmetry by averaging!
-				*/
+
+				// force symmetry by averaging!
+
 				double d = 0.5 * (my data[i][j] + my data[j][i]);
 				thy data[i][j] = thy data[j][i] = - 0.5 * d * d;
 			}
@@ -1293,7 +1248,7 @@ ScalarProduct Distance_to_ScalarProduct (Distance me, int normalize) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no ScalarProduct created.");
+		Melder_throw (me, U": no ScalarProduct created.");
 	}
 }
 
@@ -1306,7 +1261,7 @@ Distance Configuration_to_Distance (Configuration me) {
 		TableOfReal_copyLabels (me, thee.peek(), 1, -1);
 		for (long i = 1; i <= thy numberOfRows - 1; i++) {
 			for (long j = i + 1; j <= thy numberOfColumns; j++) {
-				double dmax = 0, d = 0;
+				double dmax = 0.0, d = 0.0;
 
 				/*
 					first divide distance by maximum to prevent overflow when metric is a large number.
@@ -1321,7 +1276,7 @@ Distance Configuration_to_Distance (Configuration me) {
 						dmax = dtmp;
 					}
 				}
-				if (dmax > 0) {
+				if (dmax > 0.0) {
 					for (long k = 1; k <= my numberOfColumns; k++) {
 						double arg = fabs (my data[i][k] - my data[j][k]) / dmax;
 						d += my w[k] * pow (arg, my metric);
@@ -1332,13 +1287,11 @@ Distance Configuration_to_Distance (Configuration me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Distance created.");
+		Melder_throw (me, U": no Distance created.");
 	}
 }
 
-void Proximity_Distance_drawScatterDiagram (I, Distance thee, Graphics g,
-        double xmin, double xmax, double ymin, double ymax, double size_mm,
-        const wchar_t *mark, int garnish) {
+void Proximity_Distance_drawScatterDiagram (I, Distance thee, Graphics g, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish) {
 	iam (Proximity);
 	long n = my numberOfRows * (my numberOfRows - 1) / 2;
 	double **x = my data, **y = thy data;
@@ -1347,7 +1300,7 @@ void Proximity_Distance_drawScatterDiagram (I, Distance thee, Graphics g,
 		return;
 	}
 	if (! TableOfReal_equalLabels (me, thee, 1, 1)) {
-		Melder_throw ("Proximity_Distance_drawScatterDiagram: Dimensions and labels must be the same.");
+		Melder_throw (U"Proximity_Distance_drawScatterDiagram: Dimensions and labels must be the same.");
 	}
 	if (xmax <= xmin) {
 		xmin = xmax = x[1][2];
@@ -1377,8 +1330,7 @@ void Proximity_Distance_drawScatterDiagram (I, Distance thee, Graphics g,
 	Graphics_setInner (g);
 	for (long i = 1; i <= thy numberOfRows - 1; i++) {
 		for (long j = i + 1; j <= thy numberOfColumns; j++) {
-			if (x[i][j] >= xmin && x[i][j] <= xmax &&
-			        y[i][j] >= ymin && y[i][j] <= ymax) {
+			if (x[i][j] >= xmin && x[i][j] <= xmax && y[i][j] >= ymin && y[i][j] <= ymax) {
 				Graphics_mark (g, x[i][j], y[i][j], size_mm, mark);
 			}
 		}
@@ -1387,10 +1339,10 @@ void Proximity_Distance_drawScatterDiagram (I, Distance thee, Graphics g,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textLeft (g, 1, L"Distance");
-		Graphics_textBottom (g, 1, L"Dissimilarity");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_textLeft (g, true, U"Distance");
+		Graphics_textBottom (g, true, U"Dissimilarity");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
@@ -1400,14 +1352,14 @@ Distances MDSVecs_Distance_monotoneRegression (MDSVecs me, Distance thee, int ti
 		for (long i = 1; i <= my size; i++) {
 			autoMDSVec vec = (MDSVec) my item[i];
 			if (vec -> nPoints != thy numberOfRows) {
-				Melder_throw ("Dimension of MDSVec and Distance must be equal.");
+				Melder_throw (U"Dimension of MDSVec and Distance must be equal.");
 			}
 			autoDistance fit = MDSVec_Distance_monotoneRegression (vec.peek(), thee, tiesProcessing);
 			Collection_addItem (him.peek(), fit.transfer());
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No Distances created from MDSVecs & Distance.");
+		Melder_throw (U"No Distances created from MDSVecs & Distance.");
 	}
 }
 
@@ -1415,7 +1367,7 @@ Distance MDSVec_Distance_monotoneRegression (MDSVec me, Distance thee, int tiesP
 	try {
 		long nProximities = my nProximities;
 		if (thy numberOfRows != my nPoints) {
-			Melder_throw ("Distance and MDSVVec dimension do not agreee.");
+			Melder_throw (U"Distance and MDSVVec dimension do not agreee.");
 		}
 		autoNUMvector<double> distance (1, nProximities);
 		autoNUMvector<double> fit (1, nProximities);
@@ -1443,7 +1395,7 @@ Distance MDSVec_Distance_monotoneRegression (MDSVec me, Distance thee, int tiesP
 					if (tiesProcessing == MDS_PRIMARY_APPROACH) {
 						NUMsort3 (distance.peek(), iPoint, jPoint, ib, i - 1, 1); // sort ascending
 					} else if (tiesProcessing == MDS_SECONDARY_APPROACH) {
-						double mean = 0;
+						double mean = 0.0;
 						for (long j = ib; j <= i - 1; j++) {
 							mean += distance[j];
 						}
@@ -1459,29 +1411,25 @@ Distance MDSVec_Distance_monotoneRegression (MDSVec me, Distance thee, int tiesP
 
 		NUMmonotoneRegression (distance.peek(), nProximities, fit.peek());
 
-		/*
-			Fill Distance with monotone regressed distances
-		*/
+		// Fill Distance with monotone regressed distances
 
 		for (long i = 1; i <= nProximities; i++) {
 			long ip = iPoint[i], jp = jPoint[i];
 			his data[ip][jp] = his data[jp][ip] = fit[i];
 		}
 
-		/*
-			Make rest of distances equal to the maximum fit.
-		*/
+		// Make rest of distances equal to the maximum fit.
 
 		for (long i = 1; i <= his numberOfRows - 1; i++) {
 			for (long j = i + 1; j <= his numberOfColumns; j++) {
-				if (! his data[i][j]) {
+				if (his data[i][j] == 0.0) {
 					his data[i][j] = his data[j][i] = fit[nProximities];
 				}
 			}
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Distance not created.");
+		Melder_throw (U"Distance not created.");
 	}
 }
 
@@ -1489,13 +1437,13 @@ Distance MDSVec_Distance_monotoneRegression (MDSVec me, Distance thee, int tiesP
 Distance Dissimilarity_Distance_monotoneRegression (Dissimilarity me, Distance thee, int tiesProcessing) {
 	try {
 		if (thy numberOfRows != my numberOfRows) {
-			Melder_throw ("Dimensions do not agree.");
+			Melder_throw (U"Dimensions do not agree.");
 		}
 		autoMDSVec vec = Dissimilarity_to_MDSVec (me);
 		autoDistance him = MDSVec_Distance_monotoneRegression (vec.peek(), thee, tiesProcessing);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Distance not created.");
+		Melder_throw (U"Distance not created.");
 	}
 }
 
@@ -1503,8 +1451,7 @@ Distance Dissimilarity_Distance_monotoneRegression (Dissimilarity me, Distance t
 
 Thing_implement (Proximities, TablesOfReal, 0);
 
-void Proximities_init (I, ClassInfo klas) {
-	iam (Proximities);
+void Proximities_init (Proximities me, ClassInfo klas) {
 	TablesOfReal_init (me, klas);
 }
 
@@ -1514,7 +1461,7 @@ Proximities Proximities_create () {
 		Proximities_init (me.peek(), classProximity);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Proximities not created.");
+		Melder_throw (U"Proximities not created.");
 	}
 }
 
@@ -1522,37 +1469,33 @@ ScalarProducts Distances_to_ScalarProducts (Distances me, int normalize) {
 	try {
 		autoScalarProducts thee = ScalarProducts_create ();
 		for (long i = 1; i <= my size; i++) {
-			autoScalarProduct sp = Distance_to_ScalarProduct ( (Distance) (my item[i]), normalize);
+			autoScalarProduct sp = Distance_to_ScalarProduct ((Distance) (my item[i]), normalize);
 			Collection_addItem (thee.peek(), sp.transfer());
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no ScalarProducts created.");
+		Melder_throw (me, U": no ScalarProducts created.");
 	}
 }
 
-int Distances_to_Configuration_ytl (Distances me, int numberOfDimensions,
-                                    int normalizeScalarProducts, Configuration *out1, Salience *out2) {
+void Distances_to_Configuration_ytl (Distances me, int numberOfDimensions, int normalizeScalarProducts, autoConfiguration *out1, autoSalience *out2) {
 	try {
-		*out1 = NULL; *out2 = NULL;
 		autoScalarProducts sp = Distances_to_ScalarProducts (me, normalizeScalarProducts);
 		ScalarProducts_to_Configuration_ytl (sp.peek(), numberOfDimensions, out1, out2);
-		return 1;
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created (ytl method).");
+		Melder_throw (me, U": no Configuration created (ytl method).");
 	}
 }
 
-void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensions, Configuration *out1, Salience *out2) {
+void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensions, autoConfiguration *out1, autoSalience *out2) {
 	long numberOfSources = my size;
 	autoNUMvector<double **> ci (1, numberOfSources);
 	try {
-		long nPoints = ( (ScalarProduct) my item[1]) -> numberOfRows;
-		double **w;
+		long nPoints = ((ScalarProduct) my item[1]) -> numberOfRows;
 
 		autoConfiguration thee = Configuration_create (nPoints, numberOfDimensions);
 		autoSalience mdsw = Salience_create (numberOfSources, numberOfDimensions);
-		TableOfReal_copyLabels (my item[1], thee.peek(), 1, 0);
+		TableOfReal_copyLabels ((TableOfReal) my item[1], thee.peek(), 1, 0);
 		autoNUMvector<double> eval (1, numberOfSources);
 		autoNUMmatrix<double> cl (1, numberOfDimensions, 1, numberOfDimensions);
 		autoNUMmatrix<double> pmean (1, nPoints, 1, nPoints);
@@ -1562,10 +1505,8 @@ void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensi
 		autoNUMmatrix<double> evec (1, numberOfSources, 1, numberOfSources);
 		autoNUMmatrix<double> K (1, numberOfDimensions, 1, numberOfDimensions);
 
-		*out1 = NULL; *out2 = NULL;
-
-		Thing_setName (mdsw.peek(), L"ytl");
-		Thing_setName (thee.peek(), L"ytl");
+		Thing_setName (mdsw.peek(), U"ytl");
+		Thing_setName (thee.peek(), U"ytl");
 		TableOfReal_labelsFromCollectionItemNames (mdsw.peek(), me, 1, 0);
 
 		// Determine the average scalar product matrix (Pmean) of
@@ -1575,7 +1516,7 @@ void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensi
 			ScalarProduct sp = (ScalarProduct) my item[i];
 			for (long j = 1; j <= nPoints; j++) {
 				for (long k = 1; k <= nPoints; k++) {
-					pmean[j][k] += sp->data[j][k];
+					pmean[j][k] += sp-> data[j][k];
 				}
 			}
 		}
@@ -1597,7 +1538,7 @@ void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensi
 		// We cannot determine weights from only one sp-matrix.
 
 		if (numberOfSources == 1) {
-			Melder_throw ("Only one source.");
+			Melder_throw (U"Only one source.");
 		}
 
 		// Calculate the C[i] matrices [1..numberOfDimensions][1..numberOfDimensions]
@@ -1612,7 +1553,7 @@ void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensi
 			for (long j = 1; j <= numberOfDimensions; j++) {
 				for (long k = 1; k <= numberOfDimensions; k++) {
 					for (long l = 1; l <= nPoints; l++) {
-						if (yinv[j][l] != 0) {
+						if (yinv[j][l] != 0.0) {
 							for (long m = 1; m <= nPoints; m++) {
 								ci[i][j][k] += yinv[j][l] * sp -> data[l][m] * yinv[k][m];
 							}
@@ -1629,7 +1570,7 @@ void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensi
 		for (long i = 1; i <= numberOfSources; i++) {
 			for (long j = i; j <= numberOfSources; j++) {
 				a[j][i] = a[i][j] =  NUMtrace2 (ci[i], ci[j], numberOfDimensions)
-				                     - NUMtrace (ci[i], numberOfDimensions) * NUMtrace (ci[j], numberOfDimensions) / numberOfDimensions;
+					- NUMtrace (ci[i], numberOfDimensions) * NUMtrace (ci[j], numberOfDimensions) / numberOfDimensions;
 			}
 		}
 
@@ -1646,13 +1587,13 @@ void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensi
 		// The rotation K is obtained from the eigenvectors of cl
 		// Is the following still correct??? eigensystem was not sorted??
 
-		NUMeigensystem (cl.peek(), numberOfDimensions, K.peek(), NULL);
+		NUMeigensystem (cl.peek(), numberOfDimensions, K.peek(), nullptr);
 
 		// Now get the configuration: X = Y.K
 
 		for (long i = 1; i <= nPoints; i++) {
 			for (long j = 1; j <= numberOfDimensions; j++) {
-				double x = 0;
+				double x = 0.0;
 				for (long k = 1; k <= numberOfDimensions; k++) {
 					x += y[i][k] * K[k][j];
 				}
@@ -1665,21 +1606,21 @@ void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensi
 		// And finally the weights: W[i] = K' C[i] K   (eq. (5)).
 		// We are only interested in the diagonal of the resulting matrix W[i].
 
-		w = mdsw -> data;
 		for (long i = 1; i <= numberOfSources; i++) {
 			for (long j = 1; j <= numberOfDimensions; j++) {
-				double wt = 0;
+				double wt = 0.0;
 				for (long k = 1; k <= numberOfDimensions; k++) {
-					if (K[k][j] != 0) {
+					if (K[k][j] != 0.0) {
 						for (long l = 1; l <= numberOfDimensions; l++) {
 							wt += K[k][j] * ci[i][k][l] * K[l][j];
 						}
 					}
 				}
-				w[i][j] = wt;
+				mdsw -> data[i][j] = wt;
 			}
 		}
-		*out1 = thee.transfer(); *out2 = mdsw.transfer();
+		
+		*out1 = thee.move(); *out2 = mdsw.move();
 		for (long i = 1; i <= numberOfSources; i++) {
 			NUMmatrix_free<double> (ci[i], 1, 1);
 		}
@@ -1687,7 +1628,7 @@ void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensi
 		for (long i = 1; i <= numberOfSources; i++) {
 			NUMmatrix_free<double> (ci[i], 1, 1);
 		};
-		Melder_throw (me, ": no Configuration (ytl) crerated.");
+		Melder_throw (me, U": no Configuration (ytl) created.");
 	}
 }
 
@@ -1695,14 +1636,14 @@ Dissimilarities Distances_to_Dissimilarities (Distances me) {
 	try {
 		autoDissimilarities thee = Dissimilarities_create ();
 		for (long i = 1; i <= my size; i++) {
-			wchar_t *name = Thing_getName ( (Thing) my item[i]);
+			char32 *name = Thing_getName ( (Thing) my item[i]);
 			autoDissimilarity him = Distance_to_Dissimilarity ( (Distance) (my item[i]));
-			Thing_setName (him.peek(), name ? name : L"untitled");
+			Thing_setName (him.peek(), name ? name : U"untitled");
 			Collection_addItem (thee.peek(), him.transfer());
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Dissimilarities created.");
+		Melder_throw (me, U": no Dissimilarities created.");
 	}
 }
 
@@ -1712,20 +1653,19 @@ Distances Dissimilarities_to_Distances (Dissimilarities me, int measurementLevel
 
 		for (long i = 1; i <= my size; i++) {
 			autoDistance him = Dissimilarity_to_Distance ( (Dissimilarity) my item[i], measurementLevel == MDS_ORDINAL);
-			wchar_t *name = Thing_getName ( (Thing) my item[i]);
-			Thing_setName (him.peek(), name ? name : L"untitled");
+			char32 *name = Thing_getName ( (Thing) my item[i]);
+			Thing_setName (him.peek(), name ? name : U"untitled");
 			Collection_addItem (thee.peek(), him.transfer());
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Distances created.");
+		Melder_throw (me, U": no Distances created.");
 	}
 }
 
 /*****************  Kruskal *****************************************/
 
-static void smacof_guttmanTransform (Configuration cx, Configuration cz,
-                                     Distance disp, Weight weight, double **vplus) {
+static void smacof_guttmanTransform (Configuration cx, Configuration cz, Distance disp, Weight weight, double **vplus) {
 	long nPoints = cx -> numberOfRows, nDimensions = cx -> numberOfColumns;
 	double **z = cz -> data;
 
@@ -1735,10 +1675,10 @@ static void smacof_guttmanTransform (Configuration cx, Configuration cz,
 	// compute B(Z) (eq. 8.25)
 
 	for (long i = 1; i <= nPoints; i++) {
-		double sum = 0;
+		double sum = 0.0;
 		for (long j = 1; j <= nPoints; j++) {
 			double dzij = distZ -> data[i][j];
-			if (i == j || dzij == 0) {
+			if (i == j || dzij == 0.0) {
 				continue;
 			}
 			b[i][j] = - weight -> data[i][j] * disp -> data[i][j] / dzij;
@@ -1751,7 +1691,7 @@ static void smacof_guttmanTransform (Configuration cx, Configuration cz,
 
 	for (long i = 1; i <= nPoints; i++) {
 		for (long j = 1; j <= nDimensions; j++) {
-			double xij = 0;
+			double xij = 0.0;
 			for (long k = 1;  k <= nPoints; k++) {
 				for (long l = 1; l <= nPoints; l++) {
 					xij += vplus[i][k] * b[k][l] * z[l][j];
@@ -1772,19 +1712,19 @@ double Distance_Weight_stress (Distance fit, Distance conf, Weight weight, int t
 
 	if (type == MDS_NORMALIZED_STRESS) {
 		denum = eta_fit * eta_conf;
-		if (denum > 0) {
+		if (denum > 0.0) {
 			stress = 1.0 - rho * rho / denum;
 		}
 	} else if (type == MDS_STRESS_1) {
 		denum = eta_fit * eta_conf;
-		if (denum > 0) {
+		if (denum > 0.0) {
 			tmp = 1.0 - rho * rho / denum;
-			if (tmp > 0) {
+			if (tmp > 0.0) {
 				stress = sqrt (tmp);
 			}
 		}
 	} else if (type == MDS_STRESS_2) {
-		double m = 0, wsum = 0, var = 0, **w = weight -> data;
+		double m = 0.0, wsum = 0.0, var = 0.0, **w = weight -> data;
 		double **c = conf -> data;
 		long nPoints = conf -> numberOfRows;
 
@@ -1797,7 +1737,7 @@ double Distance_Weight_stress (Distance fit, Distance conf, Weight weight, int t
 			}
 		}
 		m /= wsum;
-		if (m > 0) {
+		if (m > 0.0) {
 			// Get variance
 
 			for (long i = 1; i <= nPoints - 1; i++) {
@@ -1807,49 +1747,54 @@ double Distance_Weight_stress (Distance fit, Distance conf, Weight weight, int t
 				}
 			}
 			denum = var * eta_fit;
-			if (denum > 0) {
+			if (denum > 0.0) {
 				stress = sqrt ( (eta_fit * eta_conf - rho * rho) / denum);
 			}
 		}
 	} else if (type == MDS_RAW_STRESS) {
-		stress = eta_fit + eta_conf - 2 * rho ;
+		stress = eta_fit + eta_conf - 2.0 * rho ;
 	}
 	return stress;
 }
 
-void Distance_Weight_rawStressComponents (Distance fit, Distance conf,
-        Weight weight, double *eta_fit, double *eta_conf, double *rho) {
+void Distance_Weight_rawStressComponents (Distance fit, Distance conf, Weight weight,
+	double *p_etafit, double *p_etaconf, double *p_rho)
+{
 	long nPoints = conf -> numberOfRows;
 
-	*eta_fit = *eta_conf = *rho = 0;
+	double etafit = 0.0, etaconf = 0.0, rho = 0.0;
 
-	double wsum = 0;
 	for (long i = 1; i <= nPoints - 1; i++) {
 		double *wi = weight -> data[i];
 		double *fiti = fit -> data[i];
 		double *confi = conf -> data[i];
 
 		for (long j = i + 1; j <= nPoints; j++) {
-			*eta_fit += wi[j] * fiti[j] * fiti[j];
-			*eta_conf += wi[j] * confi[j] * confi[j];
-			*rho += wi[j] * fiti[j] * confi[j];
-			wsum += wi[j];
+			etafit += wi[j] * fiti[j] * fiti[j];
+			etaconf += wi[j] * confi[j] * confi[j];
+			rho += wi[j] * fiti[j] * confi[j];
 		}
 	}
+	if (p_etafit) {
+		*p_etafit = etafit;
+	}
+	if (p_etaconf) {
+		*p_etaconf = etaconf;
+	}
+	if (p_rho) {
+		*p_rho = rho;
+	}
 }
 
-double Dissimilarity_Configuration_Transformator_Weight_stress (Dissimilarity d,
-        Configuration c, Any transformator, Weight w, int type) {
-	Transformator t = (Transformator) transformator;
+double Dissimilarity_Configuration_Transformator_Weight_stress (Dissimilarity d, Configuration c, Transformator t, Weight w, int type) {
 	long nPoints = d -> numberOfRows;
 	double stress = NUMundefined;
 
-	if (nPoints < 1 || nPoints != c -> numberOfRows  || nPoints != t -> numberOfPoints ||
-	        (w && nPoints != w -> numberOfRows)) {
-		Melder_throw ("Incorrect number of points.");
+	if (nPoints < 1 || nPoints != c -> numberOfRows  || nPoints != t -> numberOfPoints || (w && nPoints != w -> numberOfRows)) {
+		Melder_throw (U"Incorrect number of points.");
 	}
-	autoWeight aw = 0;
-	if (w == 0) {
+	autoWeight aw;
+	if (! w) {
 		aw.reset (Weight_create (nPoints));
 		w = aw.peek();
 	}
@@ -1886,15 +1831,14 @@ double Dissimilarity_Configuration_Weight_monotone_stress (Dissimilarity d, Conf
 	return stress;
 }
 
-double Dissimilarity_Configuration_Weight_ispline_stress (Dissimilarity d,
-        Configuration c, Weight w, long numberOfInteriorKnots, long order, int type) {
+double Dissimilarity_Configuration_Weight_ispline_stress (Dissimilarity d, Configuration c, Weight w, long numberOfInteriorKnots, long order, int type) {
 	autoISplineTransformator t = ISplineTransformator_create (d -> numberOfRows, numberOfInteriorKnots, order);
 	double stress = Dissimilarity_Configuration_Transformator_Weight_stress (d, c, t.peek(), w, type);
 	return stress;
 }
 
 void Distance_Weight_smacofNormalize (Distance me, Weight w) {
-	double sumsq = 0;
+	double sumsq = 0.0;
 	for (long i = 1; i <= my numberOfRows - 1; i++) {
 		double *wi = w -> data[i];
 		double *di = my data[i];
@@ -1902,7 +1846,7 @@ void Distance_Weight_smacofNormalize (Distance me, Weight w) {
 			sumsq += wi[j] * di[j] * di[j];
 		}
 	}
-	double scale = sqrt (my numberOfRows * (my numberOfRows - 1) / (2 * sumsq));
+	double scale = sqrt (my numberOfRows * (my numberOfRows - 1) / (2.0 * sumsq));
 	for (long i = 1; i <= my numberOfRows - 1; i++) {
 		for (long j = i + 1; j <= my numberOfRows; j++) {
 			my data[j][i] = (my data[i][j] *= scale);
@@ -1913,10 +1857,10 @@ void Distance_Weight_smacofNormalize (Distance me, Weight w) {
 double Distance_Weight_congruenceCoefficient (Distance x, Distance y, Weight w) {
 	long nPoints = x -> numberOfRows;
 	if (y -> numberOfRows != nPoints || w -> numberOfRows != nPoints) {
-		return 0;
+		return 0.0;
 	}
 
-	double xy = 0, x2 = 0, y2 = 0;
+	double xy = 0.0, x2 = 0.0, y2 = 0.0;
 	for (long i = 1; i <= nPoints - 1; i++) {
 		double *xi = x -> data[i];
 		double *yi = y -> data[i];
@@ -1930,18 +1874,15 @@ double Distance_Weight_congruenceCoefficient (Distance x, Distance y, Weight w)
 	return xy / (sqrt (x2) * sqrt (y2));
 }
 
-Configuration Dissimilarity_Configuration_Weight_Transformator_smacof (Dissimilarity me, Configuration conf,
-        Weight weight, Any transformator, double tolerance, long numberOfIterations, int showProgress, double *stress) {
+Configuration Dissimilarity_Configuration_Weight_Transformator_smacof (Dissimilarity me, Configuration conf, Weight weight, Transformator t, double tolerance, long numberOfIterations, int showProgress, double *stress) {
 	try {
-		Transformator t = (Transformator) transformator;
 		long nPoints = conf -> numberOfRows;
 		long nDimensions = conf -> numberOfColumns;
-		double tol = 1e-6, stressp = 1e38;
-		bool no_weight = weight == 0;
+		double tol = 1e-6, stressp = 1e308, stres;
+		bool no_weight = ! weight;
 
-		if (my numberOfRows != nPoints || (!no_weight && weight -> numberOfRows != nPoints) ||
-		        t -> numberOfPoints != nPoints) {
-			Melder_throw ("Dimensions not in concordance.");
+		if (my numberOfRows != nPoints || (!no_weight && weight -> numberOfRows != nPoints) || t -> numberOfPoints != nPoints) {
+			Melder_throw (U"Dimensions not in concordance.");
 		}
 		autoWeight aw = 0;
 		if (no_weight) {
@@ -1956,7 +1897,7 @@ Configuration Dissimilarity_Configuration_Weight_Transformator_smacof (Dissimila
 		double **w = weight -> data;
 
 		if (showProgress) {
-			Melder_progress (0.0, L"MDS analysis");
+			Melder_progress (0.0, U"MDS analysis");
 		}
 
 		// Get V (eq. 8.19).
@@ -1992,11 +1933,11 @@ Configuration Dissimilarity_Configuration_Weight_Transformator_smacof (Dissimila
 
 			autoDistance cdist = Configuration_to_Distance (conf);
 
-			*stress = Distance_Weight_stress (fit.peek(), cdist.peek(), weight, MDS_NORMALIZED_STRESS);
+			stres = Distance_Weight_stress (fit.peek(), cdist.peek(), weight, MDS_NORMALIZED_STRESS);
 
 			// Check stop criterium
 
-			if (fabs (*stress - stressp) / stressp < tolerance) {
+			if (fabs (stres - stressp) / stressp < tolerance) {
 				break;
 			}
 
@@ -2004,62 +1945,61 @@ Configuration Dissimilarity_Configuration_Weight_Transformator_smacof (Dissimila
 
 			NUMmatrix_copyElements (conf -> data, z -> data, 1, nPoints, 1, nDimensions);
 
-			stressp = *stress;
+			stressp = stres;
 			if (showProgress) {
-				Melder_progress ( (double) iter / (numberOfIterations + 1), L"kruskal: stress ",
-				                   Melder_double (*stress));
+				Melder_progress ((double) iter / (numberOfIterations + 1), U"kruskal: stress ", stres);
 			}
 		}
 		if (showProgress) {
-			Melder_progress (1.0, 0);
+			Melder_progress (1.0);
+		}
+		if (stress) {
+			*stress = stres;
 		}
 		return z.transfer();
 	} catch (MelderError) {
 		if (showProgress) {
-			Melder_progress (1.0, 0);
+			Melder_progress (1.0);
 		}
-		Melder_throw (me, ": no improved Configuration created (smacof method).");
+		Melder_throw (me, U": no improved Configuration created (smacof method).");
 	}
 }
 
-Configuration Dissimilarity_Configuration_Weight_Transformator_multiSmacof (Dissimilarity me, Configuration conf,
-        Weight w, Any transformator, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
+Configuration Dissimilarity_Configuration_Weight_Transformator_multiSmacof (Dissimilarity me, Configuration conf,  Weight w, Transformator t, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	int showMulti = showProgress && numberOfRepetitions > 1;
 	try {
 		int showSingle = showProgress && numberOfRepetitions == 1;
-		double stress, stressmax = 1e38;
+		double stress, stressmax = 1e308;
 
 		autoConfiguration cstart = Data_copy (conf);
 		autoConfiguration  cbest = Data_copy (conf);
 
 		if (showMulti) {
-			Melder_progress (0.0, L"MDS many times");
+			Melder_progress (0.0, U"MDS many times");
 		}
 
 		for (long i = 1; i <= numberOfRepetitions; i++) {
-			autoConfiguration cresult = Dissimilarity_Configuration_Weight_Transformator_smacof
-			                            (me, cstart.peek(), w, transformator, tolerance, numberOfIterations, showSingle, &stress);
+			autoConfiguration cresult = Dissimilarity_Configuration_Weight_Transformator_smacof (me, cstart.peek(), w, t, tolerance, numberOfIterations, showSingle, &stress);
 			if (stress < stressmax) {
 				stressmax = stress;
-				cbest.reset (cresult.transfer());
+				cbest = cresult.move();
 			}
 			Configuration_randomize (cstart.peek());
 			TableOfReal_centreColumns (cstart.peek());
 
 			if (showMulti) {
-				Melder_progress ( (double) i / (numberOfRepetitions + 1), Melder_integer (i),
-				                   L" from ", Melder_integer (numberOfRepetitions));
+				Melder_progress ( (double) i / (numberOfRepetitions + 1), i, U" from ", numberOfRepetitions);
 			}
 		}
 		if (showMulti) {
-			Melder_progress (1.0, NULL);
+			Melder_progress (1.0);
 		}
 		return cbest.transfer();
 	} catch (MelderError) {
 		if (showMulti) {
-			Melder_progress (1.0, NULL);
+			Melder_progress (1.0);
 		}
-		Melder_throw (me, ": no improved Configuration created (smacodf method).");
+		Melder_throw (me, U": no improved Configuration created (smacodf method).");
 	}
 }
 
@@ -2067,140 +2007,119 @@ Configuration Dissimilarity_Configuration_Weight_absolute_mds (Dissimilarity me,
         double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	try {
 		autoTransformator t = Transformator_create (my numberOfRows);
-		autoConfiguration c = Dissimilarity_Configuration_Weight_Transformator_multiSmacof
-		                      (me, cstart, w, t.peek(), tolerance, numberOfIterations, numberOfRepetitions, showProgress);
+		autoConfiguration c = Dissimilarity_Configuration_Weight_Transformator_multiSmacof (me, cstart, w, t.peek(), tolerance, numberOfIterations, numberOfRepetitions, showProgress);
 		return c.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no improved Configuration created (absolute mds method).");
+		Melder_throw (me, U": no improved Configuration created (absolute mds method).");
 	}
 }
 
-Configuration Dissimilarity_Configuration_Weight_ratio_mds (Dissimilarity me, Configuration cstart, Weight w,
-        double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
+Configuration Dissimilarity_Configuration_Weight_ratio_mds (Dissimilarity me, Configuration cstart, Weight w, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	try {
 		autoRatioTransformator t = RatioTransformator_create (my numberOfRows);
-		autoConfiguration c = Dissimilarity_Configuration_Weight_Transformator_multiSmacof
-		                      (me, cstart, w, t.peek(), tolerance, numberOfIterations, numberOfRepetitions, showProgress);
+		autoConfiguration c = Dissimilarity_Configuration_Weight_Transformator_multiSmacof (me, cstart, w, t.peek(), tolerance, numberOfIterations, numberOfRepetitions, showProgress);
 		return c.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no improved Configuration created (ratio mds method).");
+		Melder_throw (me, U": no improved Configuration created (ratio mds method).");
 	}
 }
 
-Configuration Dissimilarity_Configuration_Weight_interval_mds (Dissimilarity me, Configuration cstart, Weight w,
-        double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
+Configuration Dissimilarity_Configuration_Weight_interval_mds (Dissimilarity me, Configuration cstart, Weight w, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	try {
 		autoISplineTransformator t = ISplineTransformator_create (my numberOfRows, 0, 1);
-		autoConfiguration c = Dissimilarity_Configuration_Weight_Transformator_multiSmacof
-		                      (me, cstart, w, t.peek(), tolerance, numberOfIterations, numberOfRepetitions, showProgress);
+		autoConfiguration c = Dissimilarity_Configuration_Weight_Transformator_multiSmacof (me, cstart, w, t.peek(), tolerance, numberOfIterations, numberOfRepetitions, showProgress);
 		return c.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no improved Configuration created (interval mds method).");
+		Melder_throw (me, U": no improved Configuration created (interval mds method).");
 	}
 }
 
-Configuration Dissimilarity_Configuration_Weight_monotone_mds (Dissimilarity me, Configuration cstart, Weight w,
-        int tiesProcessing, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
+Configuration Dissimilarity_Configuration_Weight_monotone_mds (Dissimilarity me, Configuration cstart, Weight w, int tiesProcessing, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	try {
 		autoMonotoneTransformator t = MonotoneTransformator_create (my numberOfRows);
 		MonotoneTransformator_setTiesProcessing (t.peek(), tiesProcessing);
-		autoConfiguration c = Dissimilarity_Configuration_Weight_Transformator_multiSmacof
-		                      (me, cstart, w, t.peek(), tolerance, numberOfIterations, numberOfRepetitions, showProgress);
+		autoConfiguration c = Dissimilarity_Configuration_Weight_Transformator_multiSmacof (me, cstart, w, t.peek(), tolerance, numberOfIterations, numberOfRepetitions, showProgress);
 		return c.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no improved Configuration created (monotone mds method).");
+		Melder_throw (me, U": no improved Configuration created (monotone mds method).");
 	}
 }
 
-Configuration Dissimilarity_Configuration_Weight_ispline_mds (Dissimilarity me, Configuration cstart, Weight w,
-        long numberOfInteriorKnots, long order, double tolerance, long numberOfIterations, long numberOfRepetitions,
-        int showProgress) {
+Configuration Dissimilarity_Configuration_Weight_ispline_mds (Dissimilarity me, Configuration cstart, Weight w, long numberOfInteriorKnots, long order, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	try {
 		autoISplineTransformator t = ISplineTransformator_create (my numberOfRows, numberOfInteriorKnots, order);
-		autoConfiguration c = Dissimilarity_Configuration_Weight_Transformator_multiSmacof (me, cstart, w, t.peek(),
-		                      tolerance, numberOfIterations, numberOfRepetitions, showProgress);
+		autoConfiguration c = Dissimilarity_Configuration_Weight_Transformator_multiSmacof (me, cstart, w, t.peek(), tolerance, numberOfIterations, numberOfRepetitions, showProgress);
 		return c.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no improved Configuration created (ispline mds method).");
+		Melder_throw (me, U": no improved Configuration created (ispline mds method).");
 	}
 }
 
-Configuration Dissimilarity_Weight_absolute_mds (Dissimilarity me, Weight w, long numberOfDimensions,
-        double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
+Configuration Dissimilarity_Weight_absolute_mds (Dissimilarity me, Weight w, long numberOfDimensions, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	try {
 		autoDistance d = Dissimilarity_to_Distance (me, MDS_ABSOLUTE);
 		autoConfiguration cstart = Distance_to_Configuration_torsca (d.peek(), numberOfDimensions);
-		autoConfiguration c = Dissimilarity_Configuration_Weight_absolute_mds
-		                      (me, cstart.peek(), w, tolerance, numberOfIterations, numberOfRepetitions, showProgress);
+		autoConfiguration c = Dissimilarity_Configuration_Weight_absolute_mds (me, cstart.peek(), w, tolerance, numberOfIterations, numberOfRepetitions, showProgress);
 		return c.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created (absolute mds method).");
+		Melder_throw (me, U": no Configuration created (absolute mds method).");
 	}
 }
 
-Configuration Dissimilarity_Weight_interval_mds (Dissimilarity me, Weight w, long numberOfDimensions,
-        double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
+Configuration Dissimilarity_Weight_interval_mds (Dissimilarity me, Weight w, long numberOfDimensions, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	try {
 		autoDistance d = Dissimilarity_to_Distance (me, MDS_RATIO);
 		autoConfiguration cstart = Distance_to_Configuration_torsca (d.peek(), numberOfDimensions);
-		autoConfiguration c = Dissimilarity_Configuration_Weight_interval_mds
-		                      (me, cstart.peek(), w, tolerance, numberOfIterations, numberOfRepetitions, showProgress);
+		autoConfiguration c = Dissimilarity_Configuration_Weight_interval_mds (me, cstart.peek(), w, tolerance, numberOfIterations, numberOfRepetitions, showProgress);
 		return c.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created (interval mds method).");
+		Melder_throw (me, U": no Configuration created (interval mds method).");
 	}
 }
 
-Configuration Dissimilarity_Weight_monotone_mds (Dissimilarity me, Weight w, long numberOfDimensions,
-        int tiesProcessing, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
+Configuration Dissimilarity_Weight_monotone_mds (Dissimilarity me, Weight w, long numberOfDimensions, int tiesProcessing, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	try {
 		autoDistance d = Dissimilarity_to_Distance (me, MDS_ORDINAL);
 		autoConfiguration cstart = Distance_to_Configuration_torsca (d.peek(), numberOfDimensions);
-		autoConfiguration c = Dissimilarity_Configuration_Weight_monotone_mds (me, cstart.peek(), w, tiesProcessing,
-		                      tolerance, numberOfIterations, numberOfRepetitions, showProgress);
+		autoConfiguration c = Dissimilarity_Configuration_Weight_monotone_mds (me, cstart.peek(), w, tiesProcessing, tolerance, numberOfIterations, numberOfRepetitions, showProgress);
 		return c.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created (monotone mds method).");
+		Melder_throw (me, U": no Configuration created (monotone mds method).");
 	}
 }
 
-Configuration Dissimilarity_Weight_ratio_mds (Dissimilarity me, Weight w, long numberOfDimensions, double tolerance,
-        long numberOfIterations, long numberOfRepetitions, int showProgress) {
+Configuration Dissimilarity_Weight_ratio_mds (Dissimilarity me, Weight w, long numberOfDimensions, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	try {
 		autoDistance d = Dissimilarity_to_Distance (me, MDS_RATIO);
 		autoConfiguration cstart = Distance_to_Configuration_torsca (d.peek(), numberOfDimensions);
 		autoConfiguration c = Dissimilarity_Configuration_Weight_ratio_mds (me, cstart.peek(), w, tolerance,
-		                      numberOfIterations, numberOfRepetitions, showProgress);
+		    numberOfIterations, numberOfRepetitions, showProgress);
 		return c.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created (ratio mds method).");
+		Melder_throw (me, U": no Configuration created (ratio mds method).");
 	}
 }
 
-Configuration Dissimilarity_Weight_ispline_mds (Dissimilarity me, Weight w, long numberOfDimensions,
-        long numberOfInteriorKnots, long order, double tolerance, long numberOfIterations, long numberOfRepetitions,
-        int showProgress) {
+Configuration Dissimilarity_Weight_ispline_mds (Dissimilarity me, Weight w, long numberOfDimensions, long numberOfInteriorKnots, long order, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress) {
 	try {
 		autoDistance d = Dissimilarity_to_Distance (me, MDS_ORDINAL);
 		autoConfiguration cstart = Distance_to_Configuration_torsca (d.peek(), numberOfDimensions);
 		autoConfiguration c = Dissimilarity_Configuration_Weight_ispline_mds (me, cstart.peek(), w,
-		                      numberOfInteriorKnots, order, tolerance, numberOfIterations, numberOfRepetitions, showProgress);
+		    numberOfInteriorKnots, order, tolerance, numberOfIterations, numberOfRepetitions, showProgress);
 		return c.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created (ispline mds method).");
+		Melder_throw (me, U": no Configuration created (ispline mds method).");
 	}
 }
 
 /***** classical **/
 
-static void MDSVec_Distances_getStressValues (MDSVec me, Distance ddist,
-        Distance dfit, int stress_formula, double *stress, double *s, double *t,
-        double *dbar) {
+static void MDSVec_Distances_getStressValues (MDSVec me, Distance ddist, Distance dfit, int stress_formula, double *stress, double *s, double *t, double *dbar) {
 	long nProximities = my nProximities;
 	long *iPoint = my iPoint, *jPoint = my jPoint;
 	double **dist = ddist -> data, **fit = dfit -> data;
 
-	*s = *t = *dbar = 0;
+	*s = *t = *dbar = 0.0;
 
 	if (stress_formula == 2) {
 		for (long i = 1; i <= nProximities; i++) {
@@ -2216,10 +2135,10 @@ static void MDSVec_Distances_getStressValues (MDSVec me, Distance ddist,
 		*s += st * st; *t += tt * tt;
 	}
 
-	*stress = *t > 0 ? sqrt (*s / *t) : 0;
+	*stress = *t > 0.0 ? sqrt (*s / *t) : 0.0;
 }
 
-static double func (Data object, const double p[]) {
+static double func (Daata object, const double p[]) {
 	Kruskal me = (Kruskal) object;
 	MDSVec him = my vec;
 	double **x = my configuration -> data, s, t, dbar, stress;
@@ -2235,29 +2154,26 @@ static double func (Data object, const double p[]) {
 
 	// Normalize
 
-	NUMcentreColumns (x, 1, numberOfPoints, 1, numberOfDimensions, NULL);
+	NUMcentreColumns (x, 1, numberOfPoints, 1, numberOfDimensions, nullptr);
 	NUMnormalize (x, numberOfPoints, numberOfDimensions, sqrt (numberOfPoints));
 
 	// Calculate interpoint distances from the configuration
 
-	autoDistance dist = Configuration_to_Distance (my configuration);
-
+	autoDistance dist = Configuration_to_Distance (my configuration.peek());
 
 	// Monotone regression
 
 	autoDistance fit = MDSVec_Distance_monotoneRegression (my vec, dist.peek(), tiesProcessing);
 
-
 	// Get numerator and denominator of stress
 
-
 	MDSVec_Distances_getStressValues (my vec, dist.peek(), fit.peek(), my stress_formula, &stress, &s, &t, &dbar);
 
 	// Gradient calculation.
 
 	for (long i = 1; i <= numberOfPoints; i++) {
 		for (long j = 1; j <= numberOfDimensions; j++) {
-			my dx[i][j] = 0;
+			my dx[i][j] = 0.0;
 		}
 	}
 
@@ -2269,11 +2185,11 @@ static double func (Data object, const double p[]) {
 
 	for (long i = 1; i <= his nProximities; i++) {
 		long ii = my vec -> iPoint[i], jj = my vec -> jPoint[i];
-		double g1 = stress * ( (dist->data[ii][jj] - fit->data[ii][jj]) / s - (dist->data[ii][jj] - dbar) / t);
+		double g1 = stress * ((dist->data[ii][jj] - fit->data[ii][jj]) / s - (dist->data[ii][jj] - dbar) / t);
 		for (long j = 1; j <= numberOfDimensions; j++) {
 			double dj = x[ii][j] - x[jj][j];
-			double g2 = g1 * pow (fabs (dj) / dist->data[ii][jj], metric - 1);
-			if (dj < 0) {
+			double g2 = g1 * pow (fabs (dj) / dist->data[ii][jj], metric - 1.0);
+			if (dj < 0.0) {
 				g2 = -g2;
 			}
 			my dx[ii][j] += g2; my dx[jj][j] -= g2;
@@ -2287,10 +2203,9 @@ static double func (Data object, const double p[]) {
 }
 
 /* Precondition: configuration was not changed since previous call to func */
-static void dfunc (Data object, const double p[], double dp[]) {
+static void dfunc (Daata object, const double * /* p */, double dp[]) {
 	Kruskal me = (Kruskal) object;
-	Configuration thee = my configuration;
-	(void) p;
+	Configuration thee = my configuration.peek();
 
 	long k = 1;
 	for (long i = 1; i <= thy numberOfRows; i++) {
@@ -2304,7 +2219,6 @@ Thing_implement (Kruskal, Thing, 0);
 
 void structKruskal :: v_destroy () {
 	NUMmatrix_free<double> (dx, 1, 1);
-	forget (configuration);
 	forget (proximities);
 	forget (vec);
 	forget (minimizer);
@@ -2319,41 +2233,35 @@ Kruskal Kruskal_create (long numberOfPoints, long numberOfDimensions) {
 		my dx = NUMmatrix<double> (1, numberOfPoints, 1, numberOfDimensions);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Kruskal not created.");
+		Melder_throw (U"Kruskal not created.");
 	}
 }
 
-Configuration Dissimilarity_kruskal (Dissimilarity me, long numberOfDimensions, long metric, int tiesProcessing,
-                                     int stress_formula, double tolerance, long numberOfIterations, long numberOfRepetitions) {
+Configuration Dissimilarity_kruskal (Dissimilarity me, long numberOfDimensions, long /* metric */, int tiesProcessing, int stress_formula, double tolerance, long numberOfIterations, long numberOfRepetitions) {
 	try {
 		int scale = 1;
-		(void) metric;
 		autoDistance d = Dissimilarity_to_Distance (me, scale);
 		autoConfiguration c = Distance_to_Configuration_torsca (d.peek(), numberOfDimensions);
 		Configuration_normalize (c.peek(), 1.0, 0);
-		autoConfiguration thee = Dissimilarity_Configuration_kruskal (me, c.peek(), tiesProcessing,
-		                         stress_formula, tolerance, numberOfIterations, numberOfRepetitions);
+		autoConfiguration thee = Dissimilarity_Configuration_kruskal (me, c.peek(), tiesProcessing, stress_formula, tolerance, numberOfIterations, numberOfRepetitions);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created (kruskal method).");
+		Melder_throw (me, U": no Configuration created (kruskal method).");
 	}
 }
 
-void Dissimilarity_Configuration_drawShepardDiagram (Dissimilarity me,
-        Configuration him, Graphics g, double xmin, double xmax, double ymin,
-        double ymax, double size_mm, const wchar_t *mark, int garnish) {
+void Dissimilarity_Configuration_drawShepardDiagram (Dissimilarity me, Configuration him, Graphics g, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish) {
 	autoDistance dist = Configuration_to_Distance (him);
 	Proximity_Distance_drawScatterDiagram (me, dist.peek(), g, xmin, xmax, ymin, ymax, size_mm, mark, garnish);
 }
 
-Distance Dissimilarity_Configuration_monotoneRegression (Dissimilarity dissimilarity, Configuration configuration,
-        int tiesProcessing) {
+Distance Dissimilarity_Configuration_monotoneRegression (Dissimilarity dissimilarity, Configuration configuration, int tiesProcessing) {
 	try {
 		autoDistance dist = Configuration_to_Distance (configuration);
 		autoDistance result = Dissimilarity_Distance_monotoneRegression (dissimilarity, dist.peek(), tiesProcessing);
 		return result.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No Distance created (monotone regression).");
+		Melder_throw (U"No Distance created (monotone regression).");
 	}
 }
 
@@ -2362,64 +2270,54 @@ Distances Dissimilarities_Configuration_monotoneRegression (Dissimilarities me,
 		autoDistances result = Distances_create ();
 		autoDistance dist = Configuration_to_Distance (configuration);
 		for (long i = 1; i <= my size; i++) {
-			autoDistance d = Dissimilarity_Distance_monotoneRegression ( (Dissimilarity) my item[i], dist.peek(), tiesProcessing);
+			autoDistance d = Dissimilarity_Distance_monotoneRegression ((Dissimilarity) my item[i], dist.peek(), tiesProcessing);
 			Collection_addItem (result.peek(), d.transfer());
 		}
 		return result.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No Distances created (monotone regression).");
+		Melder_throw (U"No Distances created (monotone regression).");
 	}
 }
 
-
-void Dissimilarity_Configuration_drawMonotoneRegression (Dissimilarity me, Configuration him, Graphics g,
-        int tiesProcessing, double xmin, double xmax, double ymin, double ymax, double size_mm,
-        const wchar_t *mark, int garnish) {
+void Dissimilarity_Configuration_drawMonotoneRegression (Dissimilarity me, Configuration him, Graphics g, int tiesProcessing, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish) {
 	/* obsolete replace by transformator */
 	autoDistance fit = Dissimilarity_Configuration_monotoneRegression (me, him, tiesProcessing);
 	Proximity_Distance_drawScatterDiagram (me, fit.peek(), g, xmin, xmax, ymin, ymax, size_mm, mark, garnish);
 }
 
-void Dissimilarity_Configuration_Weight_drawAbsoluteRegression (Dissimilarity d, Configuration c, Weight w, Graphics g,
-        double xmin, double xmax, double ymin, double ymax, double size_mm, const wchar_t *mark, int garnish) {
-	autoTransformator t = Transformator_create (d->numberOfRows);
+void Dissimilarity_Configuration_Weight_drawAbsoluteRegression (Dissimilarity d, Configuration c, Weight w, Graphics g, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish) {
+	autoTransformator t = Transformator_create (d -> numberOfRows);
 	autoDistance fit = Dissimilarity_Configuration_Transformator_Weight_transform (d, c, t.peek(), w);
 	Proximity_Distance_drawScatterDiagram (d, fit.peek(), g, xmin, xmax, ymin, ymax, size_mm, mark, garnish);
 }
 
-void Dissimilarity_Configuration_Weight_drawRatioRegression (Dissimilarity d, Configuration c, Weight w, Graphics g,
-        double xmin, double xmax, double ymin, double ymax, double size_mm, const wchar_t *mark, int garnish) {
+void Dissimilarity_Configuration_Weight_drawRatioRegression (Dissimilarity d, Configuration c, Weight w, Graphics g, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish) {
 	autoRatioTransformator t = RatioTransformator_create (d -> numberOfRows);
 	autoDistance fit = Dissimilarity_Configuration_Transformator_Weight_transform (d, c, t.peek(), w);
 	Proximity_Distance_drawScatterDiagram (d, fit.peek(), g, xmin, xmax, ymin, ymax, size_mm, mark, garnish);
 }
 
-void Dissimilarity_Configuration_Weight_drawIntervalRegression (Dissimilarity d, Configuration c, Weight w, Graphics g,
-        double xmin, double xmax, double ymin, double ymax, double size_mm, const wchar_t *mark, int garnish) {
-	Dissimilarity_Configuration_Weight_drawISplineRegression (d, c, w, g,
-	        0, 1, xmin, xmax, ymin, ymax, size_mm, mark, garnish);
+void Dissimilarity_Configuration_Weight_drawIntervalRegression (Dissimilarity d, Configuration c, Weight w, Graphics g, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish) {
+	Dissimilarity_Configuration_Weight_drawISplineRegression (d, c, w, g, 0.0, 1.0, xmin, xmax, ymin, ymax, size_mm, mark, garnish);
 }
 
-void Dissimilarity_Configuration_Weight_drawMonotoneRegression (Dissimilarity d, Configuration c, Weight w, Graphics g,
-        int tiesProcessing, double xmin, double xmax, double ymin, double ymax, double size_mm, const wchar_t *mark, int garnish) {
+void Dissimilarity_Configuration_Weight_drawMonotoneRegression (Dissimilarity d, Configuration c, Weight w, Graphics g, int tiesProcessing, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish) {
 	autoMonotoneTransformator t = MonotoneTransformator_create (d->numberOfRows);
 	MonotoneTransformator_setTiesProcessing (t.peek(), tiesProcessing);
 	autoDistance fit = Dissimilarity_Configuration_Transformator_Weight_transform (d, c, t.peek(), w);
 	Proximity_Distance_drawScatterDiagram (d, fit.peek(), g, xmin, xmax, ymin, ymax, size_mm, mark, garnish);
 }
 
-void Dissimilarity_Configuration_Weight_drawISplineRegression (Dissimilarity d, Configuration c, Weight w, Graphics g,
-        long numberOfInternalKnots, long order, double xmin, double xmax, double ymin, double ymax, double size_mm,
-        const wchar_t *mark, int garnish) {
+void Dissimilarity_Configuration_Weight_drawISplineRegression (Dissimilarity d, Configuration c, Weight w, Graphics g, long numberOfInternalKnots, long order, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish) {
 	autoISplineTransformator t = ISplineTransformator_create (d->numberOfRows, numberOfInternalKnots, order);
 	autoDistance fit = Dissimilarity_Configuration_Transformator_Weight_transform (d, c, t.peek(), w);
 	Proximity_Distance_drawScatterDiagram (d, fit.peek(), g, xmin, xmax, ymin, ymax, size_mm, mark, garnish);
 }
 
-Distance Dissimilarity_Configuration_Transformator_Weight_transform (Dissimilarity d, Configuration c, Any t, Weight w) {
+Distance Dissimilarity_Configuration_Transformator_Weight_transform (Dissimilarity d, Configuration c, Transformator t, Weight w) {
 	try {
-		autoWeight aw = 0;
-		if (w == 0) {
+		autoWeight aw;
+		if (! w) {
 			aw.reset (Weight_create (d -> numberOfRows));
 			w = aw.peek();
 		}
@@ -2428,12 +2326,11 @@ Distance Dissimilarity_Configuration_Transformator_Weight_transform (Dissimilari
 		autoDistance thee = Transformator_transform (t, v.peek(), cdist.peek(), w);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Distance not created.");
+		Melder_throw (U"Distance not created.");
 	}
 }
 
-double Dissimilarity_Configuration_Weight_Transformator_normalizedStress
-(Dissimilarity me, Configuration conf, Weight weight, Transformator t) {
+double Dissimilarity_Configuration_Weight_Transformator_normalizedStress (Dissimilarity me, Configuration conf, Weight weight, Transformator t) {
 	autoDistance cdist = Configuration_to_Distance (conf);
 	autoMDSVec vec = Dissimilarity_to_MDSVec (me);
 	autoDistance fdist = Transformator_transform (t, vec.peek(), cdist.peek(), weight);
@@ -2441,19 +2338,16 @@ double Dissimilarity_Configuration_Weight_Transformator_normalizedStress
 	return stress;
 }
 
-double Dissimilarity_Configuration_getStress (Dissimilarity me, Configuration him, int tiesProcessing,
-        int stress_formula) {
+double Dissimilarity_Configuration_getStress (Dissimilarity me, Configuration him, int tiesProcessing, int stress_formula) {
 	autoDistance dist = Configuration_to_Distance (him);
 	autoMDSVec vec = Dissimilarity_to_MDSVec (me);
 	autoDistance fit = MDSVec_Distance_monotoneRegression (vec.peek(), dist.peek(), tiesProcessing);
-	double s, t, dbar;
-	double stress;
+	double s, t, dbar, stress;
 	MDSVec_Distances_getStressValues (vec.peek(), dist.peek(), fit.peek(), stress_formula, &stress, &s, &t, &dbar);
 	return stress;
 }
 
-Configuration Dissimilarity_Configuration_kruskal (Dissimilarity me, Configuration him, int tiesProcessing,
-        int stress_formula, double tolerance, long numberOfIterations, long numberOfRepetitions) {
+Configuration Dissimilarity_Configuration_kruskal (Dissimilarity me, Configuration him, int tiesProcessing, int stress_formula, double tolerance, long numberOfIterations, long numberOfRepetitions) {
 	try {
 		// The Configuration is normalized: each dimension centred +
 		//	total variance set
@@ -2463,43 +2357,41 @@ Configuration Dissimilarity_Configuration_kruskal (Dissimilarity me, Configurati
 		long numberOfData = my numberOfRows * (my numberOfRows - 1) / 2;
 
 		if (numberOfData < numberOfParameters) {
-			Melder_throw ("The number of data must be larger than number of parameters in the model.");
+			Melder_throw (U"The number of data must be larger than number of parameters in the model.");
 		}
 
 		autoKruskal thee = Kruskal_create (my numberOfRows, his numberOfColumns);
-		TableOfReal_copyLabels (me, thy configuration, 1, 0);
+		TableOfReal_copyLabels (me, thy configuration.peek(), 1, 0);
 		autoDissimilarity dissimilarity = Data_copy (me);
 		Collection_addItem (thy proximities, dissimilarity.transfer());
 		thy vec = Dissimilarity_to_MDSVec (me);
 
-		thy minimizer = (Minimizer) VDSmagtMinimizer_create (numberOfCoordinates, (Data) thee.peek(), func, dfunc);
+		thy minimizer = (Minimizer) VDSmagtMinimizer_create (numberOfCoordinates, (Daata) thee.peek(), func, dfunc);
 
 		NUMdmatrix_into_vector (his data, thy minimizer -> p, 1, his numberOfRows, 1, his numberOfColumns);
 
 		thy stress_formula = stress_formula;
 		thy process = tiesProcessing;
-		Configuration_setMetric (thy configuration, his metric);
+		Configuration_setMetric (thy configuration.peek(), his metric);
 
 		Minimizer_minimizeManyTimes (thy minimizer, numberOfRepetitions, numberOfIterations, tolerance);
 
-		/* call the function to get the best configuration */
+		// call the function to get the best configuration
 
-		(void) func ( (Data) thee.peek(), ( (Minimizer) (thy minimizer)) -> p);
+		(void) func ((Daata) thee.peek(), ((Minimizer) (thy minimizer)) -> p);
 
-		autoConfiguration result = Data_copy (thy configuration);
+		autoConfiguration result = Data_copy (thy configuration.peek());
 		return result.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Configuration created.");
+		Melder_throw (me, U": no Configuration created.");
 	}
 }
 
 /************************** INDSCAL **************************************/
 
-
 /*
 	Ten Berge, Kiers & Krijnen (1993), Computational Solutions for the
-	Problem of Negative Saliences and Nonsymmetry in INDSCAL,
-	Journal of Classification 10, 115-124.
+	Problem of Negative Saliences and Nonsymmetry in INDSCAL, Journal of Classification 10, 115-124.
 */
 
 static void indscal_iteration_tenBerge (ScalarProducts zc, Configuration xc, Salience weights) {
@@ -2517,7 +2409,7 @@ static void indscal_iteration_tenBerge (ScalarProducts zc, Configuration xc, Sal
 		autoCollection sprc = Data_copy ( (Collection) zc);
 		for (long k = 1; k <= nPoints; k++) {
 			for (long l = 1; l <= nPoints; l++) {
-				wsih[k][l] = 0;
+				wsih[k][l] = 0.0;
 			}
 		}
 
@@ -2557,17 +2449,17 @@ static void indscal_iteration_tenBerge (ScalarProducts zc, Configuration xc, Sal
 
 		// normalize the solution: centre and x'x = 1
 
-		double mean = 0;
+		double mean = 0.0;
 		for (long k = 1; k <= nPoints; k++) {
 			mean += solution[k];
 		}
 		mean /= nPoints;
 
-		if (mean == 0) {
+		if (mean == 0.0) {
 			continue;
 		}
 
-		double scale = 0;
+		double scale = 0.0;
 		for (long k = 1; k <= nPoints; k++) {
 			solution[k] -= mean;
 			scale += solution[k] * solution[k];
@@ -2587,8 +2479,8 @@ static void indscal_iteration_tenBerge (ScalarProducts zc, Configuration xc, Sal
 					wih += x[k][h] * sih[k][l] * x[l][h];
 				}
 			}
-			if (wih < 0) {
-				wih = 0;
+			if (wih < 0.0) {
+				wih = 0.0;
 			}
 			w[i][h] = wih;
 		}
@@ -2596,19 +2488,16 @@ static void indscal_iteration_tenBerge (ScalarProducts zc, Configuration xc, Sal
 }
 
 
-void ScalarProducts_Configuration_Salience_indscal (ScalarProducts sp, Configuration configuration, Salience weights,
-        double tolerance, long numberOfIterations, int showProgress, Configuration *out1, Salience *out2, double *vaf) {
+void ScalarProducts_Configuration_Salience_indscal (ScalarProducts sp, Configuration configuration, Salience weights, double tolerance, long numberOfIterations, int showProgress, autoConfiguration *out1, autoSalience *out2, double *varianceAccountedFor) {
 	try {
-		double tol = 1e-6, vafp = 0;
+		double tol = 1e-6, vafp = 0.0, vaf;
 		long nZeros = 0, nSources = sp -> size, iter;
 
 		autoConfiguration x = Data_copy (configuration);
 		autoSalience w = Data_copy (weights);
 
-		*out1 = 0; *out2 = 0;
-
 		if (showProgress) {
-			Melder_progress (0.0, L"INDSCAL analysis");
+			Melder_progress (0.0, U"INDSCAL analysis");
 		}
 
 		// Solve for X, and W matrix via Alternating Least Squares.
@@ -2618,86 +2507,74 @@ void ScalarProducts_Configuration_Salience_indscal (ScalarProducts sp, Configura
 
 			// Goodness of fit and test criterion.
 
-			ScalarProducts_Configuration_Salience_vaf (sp, x.peek(), w.peek(), vaf);
+			ScalarProducts_Configuration_Salience_vaf (sp, x.peek(), w.peek(), &vaf);
 
-			if (*vaf > 1 - tol || fabs (*vaf - vafp) /  vafp < tolerance) {
+			if (vaf > 1.0 - tol || fabs (vaf - vafp) /  vafp < tolerance) {
 				break;
 			}
-			vafp = *vaf;
+			vafp = vaf;
 			if (showProgress) {
-				Melder_progress ( (double) iter / (numberOfIterations + 1),
-				                   L"indscal: vaf ", Melder_double (*vaf));
+				Melder_progress ( (double) iter / (numberOfIterations + 1), U"indscal: vaf ", vaf);
 			}
 		}
 
 		// Count number of zero weights
 
-		nZeros = NUMdmatrix_countZeros (w->data, w->numberOfRows, w->numberOfColumns);
+		nZeros = NUMdmatrix_countZeros (w -> data, w -> numberOfRows, w -> numberOfColumns);
 
 		// Set labels & names.
 
-		Thing_setName (x.peek(), L"indscal");
-		Thing_setName (w.peek(), L"indscal");
+		Thing_setName (x.peek(), U"indscal");
+		Thing_setName (w.peek(), U"indscal");
 		TableOfReal_labelsFromCollectionItemNames (w.peek(), sp, 1, 0);
 
-		*out1 = x.transfer(); *out2 = w.transfer();
-
+		*out1 = x.move(); *out2 = w.move();
+		if (varianceAccountedFor) {
+			*varianceAccountedFor = vaf;
+		}
 		if (showProgress) {
-			MelderInfo_open ();
-			MelderInfo_writeLine (L"**************** INDSCAL results on Distances "
-			                       "*******************\n\n", Thing_className (sp),
-			                       L"number of objects: ",  Melder_integer (nSources));
+			MelderInfo_writeLine (U"**************** INDSCAL results on Distances *******************\n\n", 
+				Thing_className (sp), U"number of objects: ", nSources);
 			for (long i = 1; i <= nSources; i++) {
-				MelderInfo_writeLine (L"  ", Thing_getName ( (Thing) sp -> item[i]));
+				MelderInfo_writeLine (U"  ", Thing_getName ( (Thing) sp -> item[i]));
 			}
 			if (nZeros > 0) {
-				MelderInfo_writeLine (L"WARNING: ", Melder_integer (nZeros),  L" zero weight",
-				                       (nZeros > 1 ? L"s" : L""), L"!");
+				MelderInfo_writeLine (U"WARNING: ", nZeros,  U" zero weight", (nZeros > 1 ? U"s" : U""), U"!");
 			}
-			MelderInfo_writeLine (L"\n\nVariance Accounted For = ", Melder_double (*vaf),
-			                       L"\nThe optimal configuration was reached in ",
-			                       Melder_integer ( (iter > numberOfIterations ? numberOfIterations : iter)), L" iterations.");
-			MelderInfo_close ();
+			MelderInfo_writeLine (U"\n\nVariance Accounted For = ", vaf, U"\nThe optimal configuration was reached in ",
+				(iter > numberOfIterations ? numberOfIterations : iter), U" iterations.");
+			MelderInfo_drain();
 		}
 		if (showProgress) {
-			Melder_progress (1.0, NULL);
+			Melder_progress (1.0);
 		}
 	} catch (MelderError) {
 		if (showProgress) {
-			Melder_progress (1.0, NULL);
+			Melder_progress (1.0);
 		}
-		Melder_throw ("No indscal configuration calculated.");
+		Melder_throw (U"No indscal configuration calculated.");
 	}
 }
 
-void Distances_Configuration_Salience_indscal (Distances distances, Configuration configuration, Salience weights,
-        int normalizeScalarProducts, double tolerance, long numberOfIterations, int showProgress,
-        Configuration *out1, Salience *out2, double *vaf) {
+void Distances_Configuration_Salience_indscal (Distances distances, Configuration configuration, Salience weights, int normalizeScalarProducts, double tolerance, long numberOfIterations, int showProgress, autoConfiguration *out1, autoSalience *out2, double *vaf) {
 	try {
-		*out1 = 0; *out2 = 0;
 		autoScalarProducts sp = Distances_to_ScalarProducts (distances, normalizeScalarProducts);
-		ScalarProducts_Configuration_Salience_indscal (sp.peek(), configuration, weights, tolerance, numberOfIterations,
-		        showProgress, out1, out2, vaf);
+		ScalarProducts_Configuration_Salience_indscal (sp.peek(), configuration, weights, tolerance, numberOfIterations, showProgress, out1, out2, vaf);
 	} catch (MelderError) {
-		Melder_throw ("No indscal configuration calculated.");
+		Melder_throw (U"No indscal configuration calculated.");
 	}
 }
 
-
-void Dissimilarities_Configuration_Salience_indscal (Dissimilarities dissims, Configuration configuration,
-        Salience weights, int tiesProcessing, int normalizeScalarProducts, double tolerance, long numberOfIterations,
-        int showProgress, Configuration *out1, Salience *out2, double *vaf) {
+void Dissimilarities_Configuration_Salience_indscal (Dissimilarities dissims, Configuration configuration, Salience weights, int tiesProcessing, int normalizeScalarProducts, double tolerance, long numberOfIterations, int showProgress, autoConfiguration *out1, autoSalience *out2, double *varianceAccountedFor) {
 	try {
-		double tol = 1e-6, vafp = 0;
+		double tol = 1e-6, vafp = 0, vaf;
 		long iter, nSources = dissims -> size;;
 		autoConfiguration x = Data_copy (configuration);
 		autoSalience w = Data_copy (weights);
 		autoMDSVecs vecs = Dissimilarities_to_MDSVecs (dissims);
 
-		*out1 = 0; *out2 = 0;
-
 		if (showProgress) {
-			Melder_progress (0.0, L"INDSCAL analysis");
+			Melder_progress (0.0, U"INDSCAL analysis");
 		}
 
 		for (iter = 1; iter <= numberOfIterations; iter++) {
@@ -2708,14 +2585,14 @@ void Dissimilarities_Configuration_Salience_indscal (Dissimilarities dissims, Co
 
 			// Goodness of fit and test criterion.
 
-			Distances_Configuration_Salience_vaf (distances.peek(), x.peek(), w.peek(), normalizeScalarProducts, vaf);
+			Distances_Configuration_Salience_vaf (distances.peek(), x.peek(), w.peek(), normalizeScalarProducts, &vaf);
 
-			if (*vaf > 1 - tol || fabs (*vaf - vafp) /  vafp < tolerance) {
+			if (vaf > 1.0 - tol || fabs (vaf - vafp) / vafp < tolerance) {
 				break;
 			}
-			vafp = *vaf;
+			vafp = vaf;
 			if (showProgress) {
-				Melder_progress ( (double) iter / (numberOfIterations + 1), L"indscal: vaf ", Melder_double (*vaf));
+				Melder_progress ((double) iter / (numberOfIterations + 1), U"indscal: vaf ", vaf);
 			}
 		}
 
@@ -2725,52 +2602,51 @@ void Dissimilarities_Configuration_Salience_indscal (Dissimilarities dissims, Co
 
 		// Set labels & names.
 
-		Thing_setName (x.peek(), L"indscal_mr"); Thing_setName (w.peek(), L"indscal_mr");
+		Thing_setName (x.peek(), U"indscal_mr"); Thing_setName (w.peek(), U"indscal_mr");
 		TableOfReal_labelsFromCollectionItemNames (w.peek(), dissims, 1, 0);
 
-		*out1 = x.transfer(); *out2 = w.transfer();
+		*out1 = x.move(); *out2 = w.move();
+		if (varianceAccountedFor) {
+			*varianceAccountedFor = vaf;
+		}
 
 		if (showProgress) {
-			MelderInfo_open ();
-			MelderInfo_writeLine (L"**************** INDSCAL with monotone regression *******************");
+			MelderInfo_writeLine (U"**************** INDSCAL with monotone regression *******************");
 			MelderInfo_writeLine (Thing_className (dissims));
-			MelderInfo_writeLine (L"Number of objects: ", Melder_integer (nSources));
+			MelderInfo_writeLine (U"Number of objects: ", nSources);
 			for (long i = 1; i <= nSources; i++) {
-				MelderInfo_writeLine (L"  ", Thing_getName ( (Thing) dissims -> item[i]));
+				MelderInfo_writeLine (U"  ", Thing_getName ( (Thing) dissims -> item[i]));
 			}
 			if (nZeros > 0) {
-				MelderInfo_writeLine (L"WARNING: ", Melder_integer (nZeros), L" zero weight", (nZeros > 1 ? L"s" : L""));
+				MelderInfo_writeLine (U"WARNING: ", nZeros, U" zero weight", (nZeros > 1 ? U"s" : U""));
 			}
-			MelderInfo_writeLine (L"Variance Accounted For: ", Melder_double (*vaf));
-			MelderInfo_writeLine (L"Based on MONOTONE REGRESSION");
-			MelderInfo_writeLine (L"number of iterations: ", Melder_integer ( (iter > numberOfIterations ?	numberOfIterations : iter)));
-			MelderInfo_close ();
+			MelderInfo_writeLine (U"Variance Accounted For: ", vaf);
+			MelderInfo_writeLine (U"Based on MONOTONE REGRESSION");
+			MelderInfo_writeLine (U"number of iterations: ", (iter > numberOfIterations ?	numberOfIterations : iter));
+			MelderInfo_drain();
 		}
 		if (showProgress) {
-			Melder_progress (1.0, NULL);
+			Melder_progress (1.0);
 		}
 	} catch (MelderError) {
 		if (showProgress) {
-			Melder_progress (1.0, NULL);
+			Melder_progress (1.0);
 		}
-		Melder_throw ("no inscal configuration calculated.");
+		Melder_throw (U"no inscal configuration calculated.");
 	}
 }
 
-void Distances_Configuration_indscal (Distances dists, Configuration conf, int normalizeScalarProducts, double tolerance,
-                                      long numberOfIterations, int showProgress, Configuration *out1, Salience *out2) {
+void Distances_Configuration_indscal (Distances dists, Configuration conf, int normalizeScalarProducts, double tolerance, long numberOfIterations, int showProgress, autoConfiguration *out1, autoSalience *out2) {
 	try {
 		autoSalience w = Salience_create (dists -> size, conf -> numberOfColumns);
 		double vaf;
-		Distances_Configuration_Salience_indscal (dists, conf, w.peek(), normalizeScalarProducts, tolerance,
-		        numberOfIterations, showProgress, out1, out2, &vaf);
+		Distances_Configuration_Salience_indscal (dists, conf, w.peek(), normalizeScalarProducts, tolerance, numberOfIterations, showProgress, out1, out2, &vaf);
 	} catch (MelderError) {
-		Melder_throw ("No indscal performed.");
+		Melder_throw (U"No indscal performed.");
 	}
 }
 
-Distances MDSVecs_Configuration_Salience_monotoneRegression (MDSVecs vecs,
-        Configuration conf, Salience weights, int tiesProcessing) {
+Distances MDSVecs_Configuration_Salience_monotoneRegression (MDSVecs vecs, Configuration conf, Salience weights, int tiesProcessing) {
 	try {
 		long nDimensions = conf -> numberOfColumns;
 		autoNUMvector<double> w (NUMvector_copy (conf -> w, 1, nDimensions), 1);
@@ -2778,24 +2654,23 @@ Distances MDSVecs_Configuration_Salience_monotoneRegression (MDSVecs vecs,
 		for (long i = 1; i <= vecs -> size; i++) {
 			NUMvector_copyElements (weights -> data[i], conf -> w, 1, nDimensions);
 			autoDistance dc = Configuration_to_Distance (conf);
-			autoDistance dist = MDSVec_Distance_monotoneRegression ( (MDSVec) vecs -> item[i], dc.peek(), tiesProcessing);
+			autoDistance dist = MDSVec_Distance_monotoneRegression ((MDSVec) vecs -> item[i], dc.peek(), tiesProcessing);
 			Collection_addItem (distances.peek(), dist.transfer());
 		}
 		Configuration_setDefaultWeights (conf);
 		return distances.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No Distances created.");
+		Melder_throw (U"No Distances created.");
 	}
 }
 
-
 Salience Distances_Configuration_to_Salience (Distances d, Configuration c, int normalize) {
 	try {
 		autoScalarProducts sp = Distances_to_ScalarProducts (d, normalize);
 		autoSalience w = ScalarProducts_Configuration_to_Salience (sp.peek(), c);
 		return w.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No Salience created.");
+		Melder_throw (U"No Salience created.");
 	}
 }
 
@@ -2806,146 +2681,127 @@ Salience ScalarProducts_Configuration_to_Salience (ScalarProducts me, Configurat
 		indscal_iteration_tenBerge (me, cx.peek(), salience.peek());
 		return salience.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No Salience created.");
+		Melder_throw (U"No Salience created.");
 	}
 }
 
-Salience Dissimilarities_Configuration_to_Salience (Dissimilarities me, Configuration him, int tiesProcessing,
-        int normalizeScalarProducts) {
+Salience Dissimilarities_Configuration_to_Salience (Dissimilarities me, Configuration him, int tiesProcessing, int normalizeScalarProducts) {
 	try {
 		autoDistances distances = Dissimilarities_Configuration_monotoneRegression (me, him, tiesProcessing);
 		autoSalience w = Distances_Configuration_to_Salience (distances.peek(), him, normalizeScalarProducts);
 		return w.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No Salience created.");
+		Melder_throw (U"No Salience created.");
 	}
 }
 
-void Dissimilarities_Configuration_indscal (Dissimilarities dissims, Configuration conf, int tiesProcessing,
-        int normalizeScalarProducts, double tolerance, long numberOfIterations, int showProgress,
-        Configuration *out1, Salience *out2) {
+void Dissimilarities_Configuration_indscal (Dissimilarities dissims, Configuration conf, int tiesProcessing, int normalizeScalarProducts, double tolerance, long numberOfIterations, int showProgress, autoConfiguration *out1, autoSalience *out2) {
 	try {
-		*out1 = 0; *out2 = 0;
 		autoDistances distances = Dissimilarities_Configuration_monotoneRegression (dissims, conf, tiesProcessing);
 		autoSalience weights = Distances_Configuration_to_Salience (distances.peek(), conf, normalizeScalarProducts);
 		double vaf;
-		Dissimilarities_Configuration_Salience_indscal (dissims, conf, weights.peek(), tiesProcessing, normalizeScalarProducts,
-		        tolerance, numberOfIterations, showProgress, out1, out2, &vaf);
+		Dissimilarities_Configuration_Salience_indscal (dissims, conf, weights.peek(), tiesProcessing, normalizeScalarProducts, tolerance, numberOfIterations, showProgress, out1, out2, &vaf);
 	} catch (MelderError) {
-		Melder_throw ("No indscal performed.");
+		Melder_throw (U"No indscal performed.");
 	}
 }
 
-
-void Dissimilarities_indscal (Dissimilarities me, long numberOfDimensions, int tiesProcessing, int normalizeScalarProducts,
-                              double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress, Configuration *out1, Salience *out2) {
+void Dissimilarities_indscal (Dissimilarities me, long numberOfDimensions, int tiesProcessing, int normalizeScalarProducts, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress, autoConfiguration *out1, autoSalience *out2) {
 	int showMulti = showProgress && numberOfRepetitions > 1;
 	try {
 		int showSingle = showProgress && numberOfRepetitions == 1;
-		double vaf, vafmin = 0;
-
-		*out1 = 0; *out2 = 0;
+		double vaf, vafmin = 0.0;
 
 		autoDistances distances = Dissimilarities_to_Distances (me, MDS_ORDINAL);
-		Configuration cstart1 = 0; Salience wstart1 = 0;
-		Distances_to_Configuration_ytl (distances.peek(), numberOfDimensions, normalizeScalarProducts, &cstart1, &wstart1);
-		autoConfiguration cstart = cstart1;
-		autoSalience wstart = wstart1;
-		autoConfiguration cbest = Data_copy ( (Configuration) cstart.peek());
-		autoSalience wbest = Data_copy ( (Salience) wstart.peek());
+		autoConfiguration cstart; autoSalience wstart;
+		Distances_to_Configuration_ytl (distances.peek(), numberOfDimensions, normalizeScalarProducts, &cstart, &wstart);
+		autoConfiguration cbest = Data_copy (cstart.peek());
+		autoSalience wbest = Data_copy (wstart.peek());
 
 		if (showMulti) {
-			Melder_progress (0.0, L"Indscal many times");
+			Melder_progress (0.0, U"Indscal many times");
 		}
 
 		for (long iter = 1; iter <= numberOfRepetitions; iter++) {
-			Configuration cresult1 = 0; Salience wresult1 = 0;
+			autoConfiguration cresult; 
+			autoSalience wresult;
 			Dissimilarities_Configuration_Salience_indscal (me, cstart.peek(), wstart.peek(), tiesProcessing,
-			        normalizeScalarProducts, tolerance, numberOfIterations, showSingle, &cresult1, &wresult1, &vaf);
-			autoConfiguration cresult = cresult1;
-			autoSalience wresult = wresult1;
+				normalizeScalarProducts, tolerance, numberOfIterations, showSingle, &cresult, &wresult, &vaf);
 			if (vaf > vafmin) {
 				vafmin = vaf;
-				cbest.reset (cresult.transfer());
-				wbest.reset (wresult.transfer());
+				cbest = cresult.move();
+				wbest = wresult.move();
 			}
 			Configuration_randomize (cstart.peek());
 			Configuration_normalize (cstart.peek(), 1.0, 1);
 			Salience_setDefaults (wstart.peek());
 
 			if (showMulti) {
-				Melder_progress ( (double) iter / (numberOfRepetitions + 1),
-				                   Melder_integer (iter), L" from ", Melder_integer (numberOfRepetitions));
+				Melder_progress ( (double) iter / (numberOfRepetitions + 1), iter, U" from ", numberOfRepetitions);
 			}
 		}
 
-		*out1 = cbest.transfer(); *out2 = wbest.transfer();
+		*out1 = cbest.move();
+		*out2 = wbest.move();
 		if (showMulti) {
-			Melder_progress (1.0, 0);
+			Melder_progress (1.0);
 		}
 	} catch (MelderError) {
 		if (showMulti) {
-			Melder_progress (1.0, 0);
+			Melder_progress (1.0);
 		}
-		Melder_throw (me, ": no indscal performed.");
+		Melder_throw (me, U": no indscal performed.");
 	}
 }
 
 
-void Distances_indscal (Distances distances, long numberOfDimensions, int normalizeScalarProducts, double tolerance,
-                        long numberOfIterations, long numberOfRepetitions, int showProgress, Configuration *out1, Salience *out2) {
+void Distances_indscal (Distances distances, long numberOfDimensions, int normalizeScalarProducts, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress, autoConfiguration *out1, autoSalience *out2) {
 	int showMulti = showProgress && numberOfRepetitions > 1;
 	try {
 		int showSingle = showProgress && numberOfRepetitions == 1;
 		double vaf, vafmin = 0;
 
-		*out1 = 0; *out2 = 0;
-		Configuration cstart1 = 0; Salience wstart1 = 0;
-		Distances_to_Configuration_ytl (distances, numberOfDimensions, normalizeScalarProducts, &cstart1, &wstart1);
-		autoConfiguration cstart = cstart1;
-		autoSalience wstart = wstart1;
+		autoConfiguration cstart;
+		autoSalience wstart;
+		Distances_to_Configuration_ytl (distances, numberOfDimensions, normalizeScalarProducts, &cstart, &wstart);
 		autoConfiguration cbest = Data_copy (cstart.peek());
 		autoSalience wbest = Data_copy (wstart.peek());
 
 		if (showMulti) {
-			Melder_progress (0.0, L"Indscal many times");
+			Melder_progress (0.0, U"Indscal many times");
 		}
 
 		for (long i = 1; i <= numberOfRepetitions; i++) {
-			Configuration cresult1 = 0; Salience wresult1 = 0;
-			Distances_Configuration_Salience_indscal (distances, cstart.peek(), wstart.peek(), normalizeScalarProducts,
-			        tolerance, numberOfIterations, showSingle, &cresult1, &wresult1, &vaf);
-			autoConfiguration cresult = cresult1;
-			autoSalience wresult = wresult1;
+			autoConfiguration cresult;
+			autoSalience wresult;
+			Distances_Configuration_Salience_indscal (distances, cstart.peek(), wstart.peek(), normalizeScalarProducts,  tolerance, numberOfIterations, showSingle, &cresult, &wresult, &vaf);
 			if (vaf > vafmin) {
 				vafmin = vaf;
-				cbest.reset (cresult.transfer());
-				wbest.reset (wresult.transfer());
+				cbest = cresult.move();
+				wbest = wresult.move();
 			}
 			Configuration_randomize (cstart.peek());
 			Configuration_normalize (cstart.peek(), 1.0, 1);
 			Salience_setDefaults (wstart.peek());
 
 			if (showMulti) {
-				Melder_progress ( (double) i / (numberOfRepetitions + 1),
-				                   Melder_integer (i), L" from ", Melder_integer (numberOfRepetitions));
+				Melder_progress ((double) i / (numberOfRepetitions + 1), i, U" from ", numberOfRepetitions);
 			}
 		}
 
-		*out1 = cbest.transfer(); *out2 = wbest.transfer();
+		*out1 = cbest.move(); *out2 = wbest.move();
 		if (showMulti) {
-			Melder_progress (1.0, NULL);
+			Melder_progress (1.0);
 		}
 	} catch (MelderError) {
 		if (showMulti) {
-			Melder_progress (1.0, NULL);
+			Melder_progress (1.0);
 		}
-		Melder_throw (distances, ": no indscal performed.");
+		Melder_throw (distances, U": no indscal performed.");
 	}
 }
 
-void Dissimilarities_Configuration_Salience_vaf (Dissimilarities me, Configuration thee, Salience him, int tiesProcessing,
-        int normalizeScalarProducts, double *vaf) {
+void Dissimilarities_Configuration_Salience_vaf (Dissimilarities me, Configuration thee, Salience him, int tiesProcessing, int normalizeScalarProducts, double *vaf) {
 	autoDistances distances = Dissimilarities_Configuration_monotoneRegression (me, thee, tiesProcessing);
 	Distances_Configuration_Salience_vaf (distances.peek(), thee, him, normalizeScalarProducts, vaf);
 }
@@ -2961,42 +2817,49 @@ void Dissimilarities_Configuration_vaf (Dissimilarities me, Configuration thee,
 }
 
 void Distances_Configuration_Salience_vaf (Distances me, Configuration thee, Salience him, int normalizeScalarProducts, double *vaf) {
-	if (my size != his numberOfRows || thy numberOfColumns != his numberOfColumns) Melder_throw
-		("Dimensions must conform.");
+	if (my size != his numberOfRows || thy numberOfColumns != his numberOfColumns) {
+		Melder_throw (U"Dimensions must conform.");
+	}
 
 	autoScalarProducts sp = Distances_to_ScalarProducts (me, normalizeScalarProducts);
 	ScalarProducts_Configuration_Salience_vaf (sp.peek(), thee, him, vaf);
 }
 
-void ScalarProduct_Configuration_getVariances (ScalarProduct me,
-        Configuration thee, double *varianceExplained, double *varianceTotal) {
-	*varianceExplained = *varianceTotal = 0;
+void ScalarProduct_Configuration_getVariances (ScalarProduct me, Configuration thee, double *varianceExplained, double *varianceTotal) {
+	double varExplained = 0.0, varTotal = 0.0;
 	autoDistance distance = Configuration_to_Distance (thee);
 	autoScalarProduct fit = Distance_to_ScalarProduct (distance.peek(), 0);
-	/*
-		ScalarProduct is double centred, i.e., mean == 0.
-	*/
+
+	// ScalarProduct is double centred, i.e., mean == 0.
+
 	for (long j = 1; j <= my numberOfRows; j++) {
 		for (long k = 1; k <= my numberOfColumns; k++) {
 			double d2 = my data[j][k] - fit -> data[j][k];
-			*varianceExplained += d2 * d2;
-			*varianceTotal += my data[j][k] * my data[j][k];
+			varExplained += d2 * d2;
+			varTotal += my data[j][k] * my data[j][k];
 		}
 	}
+	if (varianceExplained) {
+		*varianceExplained = varExplained;
+	}
+	if (varianceTotal) {
+		*varianceTotal = varTotal;
+	}
 }
 
 void ScalarProducts_Configuration_Salience_vaf (ScalarProducts me, Configuration thee, Salience him, double *vaf) {
 	autoNUMvector<double> w (NUMvector_copy (thy w, 1, thy numberOfColumns), 1); // save weights
 	try {
-		if (my size != his numberOfRows || thy numberOfColumns != his numberOfColumns) Melder_throw
-			("Dimensions of input objects must conform.");
+		if (my size != his numberOfRows || thy numberOfColumns != his numberOfColumns) {
+			Melder_throw (U"Dimensions of input objects must conform.");
+		}
 
-		double t = 0, n = 0;
+		double t = 0.0, n = 0.0;
 		for (long i = 1; i <= my size; i++) {
 
 			ScalarProduct sp = (ScalarProduct) my item[i];
 			if (sp -> numberOfRows != thy numberOfRows) {
-				Melder_throw ("ScalarProduct ", i, " does not match Configuration.");
+				Melder_throw (U"ScalarProduct ", i, U" does not match Configuration.");
 			}
 
 			// weigh configuration before calculating variances
@@ -3011,15 +2874,16 @@ void ScalarProducts_Configuration_Salience_vaf (ScalarProducts me, Configuration
 			t += vare; n += vart;
 		}
 
-		*vaf = n > 0 ? 1.0 - t / n : 0;
+		if (vaf) {
+			*vaf = n > 0.0 ? 1.0 - t / n : 0.0;
+		}
 		NUMvector_copyElements (w.peek(), thy w, 1, thy numberOfColumns); // restore weights
 	} catch (MelderError) {
 		NUMvector_copyElements (w.peek(), thy w, 1, thy numberOfColumns);
-		Melder_throw ("No vaf calculasted.");
+		Melder_throw (U"No vaf calculasted.");
 	}
 }
 
-
 /********************** Examples *********************************************/
 
 Dissimilarity Dissimilarity_createLetterRExample (double noiseStd) {
@@ -3027,72 +2891,69 @@ Dissimilarity Dissimilarity_createLetterRExample (double noiseStd) {
 		autoConfiguration r = Configuration_createLetterRExample (1);
 		autoDistance d = Configuration_to_Distance (r.peek());
 		autoDissimilarity me = Distance_to_Dissimilarity (d.peek());
-		Thing_setName (me.peek(), L"R");
+		Thing_setName (me.peek(), U"R");
 
 		for (long i = 1; i <= my numberOfRows - 1; i++) {
 			for (long j = i + 1; j <= my numberOfRows; j++) {
 				double dis = my data[i][j];
-				my data[j][i] = my data[i][j] = dis * dis + 5 + NUMrandomUniform (0, noiseStd);
+				my data[j][i] = my data[i][j] = dis * dis + 5.0 + NUMrandomUniform (0.0, noiseStd);
 			}
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Dissimilarity for letter R example not created.");
+		Melder_throw (U"Dissimilarity for letter R example not created.");
 	}
 }
 
 Salience Salience_createCarrollWishExample () {
 	try {
-		long nSources = 8;
-		double wx[9] = {0,   1, 0.866, 0.707, 0.5,   0.1, 0.5, 0.354, 0.1};
+		long numberOfSources = 8;
+		double wx[9] = {0, 1.0, 0.866, 0.707, 0.5,   0.1, 0.5, 0.354, 0.1};
 		double wy[9] = {0, 0.1, 0.5,   0.707, 0.866,   1, 0.1, 0.354, 0.5};
-		wchar_t const *name[] = { L"", L"1", L"2", L"3", L"4", L"5", L"6", L"7", L"8"};
-		autoSalience me = Salience_create (nSources, 2);
+		const char32 *name[] = { U"", U"1", U"2", U"3", U"4", U"5", U"6", U"7", U"8"};
+		autoSalience me = Salience_create (numberOfSources, 2);
 
-		for (long i = 1; i <= nSources; i++) {
+		for (long i = 1; i <= numberOfSources; i++) {
 			my data[i][1] = wx[i];
 			my data[i][2] = wy[i];
 			TableOfReal_setRowLabel (me.peek(), i, name[i]);
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Salience for Carroll Wish example not created.");
+		Melder_throw (U"Salience for Carroll Wish example not created.");
 	}
 }
 
 Collection INDSCAL_createCarrollWishExample (double noiseRange) {
 	try {
 		autoConfiguration c = Configuration_createCarrollWishExample ();
-		long nObjects = c -> numberOfRows, nSources = 8;
+		long numberOfObjects = c -> numberOfRows, numberOfSources = 8;
 		autoSalience s = Salience_createCarrollWishExample ();
-		autoCollection me = Collection_create (classData, nSources);
-		for (long l = 1; l <= nSources; l++) {
+		autoCollection me = Collection_create (classDaata, numberOfSources);
+		for (long l = 1; l <= numberOfSources; l++) {
 			c -> w[1] = s -> data[l][1];
 			c -> w[2] = s -> data[l][2];
 			autoDistance d = Configuration_to_Distance (c.peek());
 			autoDissimilarity dissim = Distance_to_Dissimilarity (d.peek());
-			for (long i = 1; i <= nObjects - 1; i++) {
-				for (long j = i + 1; j <= nObjects; j++) {
-					dissim -> data[i][j] = (dissim -> data[j][i] +=
-					                            NUMrandomUniform (0, noiseRange));
+			for (long i = 1; i <= numberOfObjects - 1; i++) {
+				for (long j = i + 1; j <= numberOfObjects; j++) {
+					dissim -> data[i][j] = (dissim -> data[j][i] += NUMrandomUniform (0.0, noiseRange));
 				}
 			}
 			Thing_setName (dissim.peek(), s -> rowLabels[l]);
 			Collection_addItem (me.peek(), dissim.transfer());
 		}
-		Thing_setName (me.peek(), L"CarrollWish");
+		Thing_setName (me.peek(), U"CarrollWish");
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Collection not created.");
+		Melder_throw (U"Collection not created.");
 	}
 }
 
-void drawSplines (Graphics g, double low, double high, double ymin, double ymax,
-                  int type, long order, wchar_t const *interiorKnots, int garnish) {
+void drawSplines (Graphics g, double low, double high, double ymin, double ymax, int type, long order, const char32 *interiorKnots, int garnish) {
 	long k = order, numberOfKnots, numberOfInteriorKnots = 0;
 	long nSplines, n = 1000;
 	double knot[101], y[1001];
-	wchar_t *start, *end;
 
 	if (type == MDS_ISPLINE) {
 		k++;
@@ -3102,19 +2963,21 @@ void drawSplines (Graphics g, double low, double high, double ymin, double ymax,
 	}
 	numberOfKnots = k;
 
-	start = (wchar_t *) interiorKnots;
-	while (*start) {
-		double value = wcstod (start, &end);
-		start = end;
-		if (value < low || value > high) {
-			Melder_warning (L"drawSplines: knots must be in interval (", Melder_double (low), L", ", Melder_double (high), L")");
-			return;
-		}
-		if (numberOfKnots == 100) {
-			Melder_warning (L"drawSplines: too many knots (101)");
-			return;
+	{ // scope
+		char *start = Melder_peek32to8 (interiorKnots), *end;   // UGLY; because of non-availability of str32tod
+		while (*start) {
+			double value = strtod (start, &end);
+			start = end;
+			if (value < low || value > high) {
+				Melder_warning (U"drawSplines: knots must be in interval (", low, U", ", high, U")");
+				return;
+			}
+			if (numberOfKnots == 100) {
+				Melder_warning (U"drawSplines: too many knots (101)");
+				return;
+			}
+			knot[++numberOfKnots] = value;
 		}
-		knot[++numberOfKnots] = value;
 	}
 
 	numberOfInteriorKnots = numberOfKnots - k;
@@ -3145,57 +3008,51 @@ void drawSplines (Graphics g, double low, double high, double ymin, double ymax,
 	}
 	Graphics_unsetInner (g);
 	if (garnish) {
-		static MelderString ts = { 0 };
+		static MelderString ts { 0 };
 		long lastKnot = type == MDS_ISPLINE ? numberOfKnots - 2 : numberOfKnots;
-		MelderString_empty (&ts);
 		Graphics_drawInnerBox (g);
-		Graphics_textLeft (g, 0, type == MDS_MSPLINE ? L"\\s{M}\\--spline" : L"\\s{I}\\--spline");
-		Graphics_marksTop (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_textLeft (g, false, type == MDS_MSPLINE ? U"\\s{M}\\--spline" : U"\\s{I}\\--spline");
+		Graphics_marksTop (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 		if (low <= knot[order]) {
 			if (order == 1) {
-				MelderString_append (&ts, L"t__1_");
+				MelderString_copy (&ts, U"t__1_");
 			} else if (order == 2) {
-				MelderString_append (&ts,  L"{t__1_, t__2_}");
+				MelderString_copy (&ts,  U"{t__1_, t__2_}");
 			} else {
-				MelderString_append (&ts, L"{t__1_..t__", Melder_integer (order), L"_}");
+				MelderString_copy (&ts, U"{t__1_..t__", order, U"_}");
 			}
-			Graphics_markBottom (g, low, 0, 0, 0, ts.string);
+			Graphics_markBottom (g, low, false, false, false, ts.string);
 		}
 		for (long i = 1; i <= numberOfInteriorKnots; i++) {
 			if (low <= knot[k + i] && knot[k + i] < high) {
-				MelderString_empty (&ts);
-				MelderString_append (&ts, L"t__", Melder_integer (order + i), L"_");
-				Graphics_markBottom (g, knot[k + i], 0, 1, 1, ts.string);
-				Graphics_markTop (g, knot[k + i], 1, 0, 0, 0);
+				MelderString_copy (&ts, U"t__", order + i, U"_");
+				Graphics_markBottom (g, knot[k + i], false, true, true, ts.string);
+				Graphics_markTop (g, knot[k + i], true, false, false, nullptr);
 			}
 		}
 		if (knot[lastKnot - order + 1] <= high) {
-			MelderString_empty (&ts);
 			if (order == 1) {
-				MelderString_append (&ts, L"t__", Melder_integer (lastKnot), L"_");
+				MelderString_copy (&ts, U"t__", lastKnot, U"_");
 			} else {
-				MelderString_append (&ts, L"{t__", Melder_integer (order == 2 ? lastKnot - 1 : lastKnot - order + 1), L"_, t__", Melder_integer (lastKnot), L"_}");
+				MelderString_copy (&ts, U"{t__", (order == 2 ? lastKnot - 1 : lastKnot - order + 1), U"_, t__", lastKnot, U"_}");
 			}
-			Graphics_markBottom (g, high, 0, 0, 0, ts.string);
+			Graphics_markBottom (g, high, false, false, false, ts.string);
 		}
 	}
 }
 
 void drawMDSClassRelations (Graphics g) {
 	long nBoxes = 6;
-	double boxWidth = 0.3, boxWidth2 = boxWidth / 2, boxWidth3 = boxWidth / 3;
-	double boxHeight = 0.1, boxHeight2 = boxHeight / 2;
-	double boxHeight3 = boxHeight / 3;
+	double boxWidth = 0.3, boxWidth2 = boxWidth / 2.0, boxWidth3 = boxWidth / 3.0;
+	double boxHeight = 0.1, boxHeight2 = boxHeight / 2.0;
+	double boxHeight3 = boxHeight / 3.0;
 	double r_mm = 3, dxt = 0.025, dyt = 0.03;
-	double dboxx = 1 - 0.2 - 2 * boxWidth, dboxy = (1 - 4 * boxHeight) / 3;
+	double dboxx = 1.0 - 0.2 - 2.0 * boxWidth, dboxy = (1.0 - 4.0 * boxHeight) / 3.0;
 	double x1, x2, xm, x23, x13, y1, y2, ym, y23, y13;
 	double x[7] = {0.0, 0.2, 0.2, 0.7, 0.2, 0.7, 0.2}; /* left */
 	double y[7] = {0.0, 0.9, 0.6, 0.6, 0.3, 0.3, 0.0}; /* bottom */
-	wchar_t const *text[7] = {L"", L"Confusion", L"Dissimilarity  %\\de__%%ij%_",
-	                          L"Similarity", L"Distance  %d__%%ij%_, %d\\'p__%%ij%_",
-	                          L"ScalarProduct", L"Configuration"
-	                         };
+	const char32 *text[7] = {U"", U"Confusion", U"Dissimilarity  %\\de__%%ij%_",  U"Similarity", U"Distance  %d__%%ij%_, %d\\'p__%%ij%_", U"ScalarProduct", U"Configuration" };
 
 	Graphics_setWindow (g, -0.05, 1.05, -0.05, 1.05);
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
@@ -3214,7 +3071,7 @@ void drawMDSClassRelations (Graphics g) {
 	xm = x[1] + boxWidth2;
 	y2 = y[2] + boxHeight;
 	Graphics_arrow (g, xm, y[1], xm, y2);
-	Graphics_text (g, xm + dxt, y2 + dboxy / 2, L"pdf");
+	Graphics_text (g, xm + dxt, y2 + dboxy / 2, U"pdf");
 
 	// Confusion to Similarity
 
@@ -3225,9 +3082,9 @@ void drawMDSClassRelations (Graphics g) {
 	Graphics_line (g, x1, ym, xm, ym);
 	Graphics_arrow (g, xm, ym, xm, y2);
 	y2 += + dboxy / 2 + dyt / 2;
-	Graphics_text (g, xm + dxt, y2, L"average");
+	Graphics_text (g, xm + dxt, y2, U"average");
 	y2 -= dyt;
-	Graphics_text (g, xm + dxt, y2, L"houtgast");
+	Graphics_text (g, xm + dxt, y2, U"houtgast");
 
 	// Dissimilarity to Similarity
 
@@ -3249,20 +3106,20 @@ void drawMDSClassRelations (Graphics g) {
 	y1 = y[2] - dyt;
 	x2 = 0 + dxt;
 	y1 -= dyt;
-	Graphics_text (g, x1, y1, L"%d\\'p__%%ij%_ = %\\de__%%ij%_");
-	Graphics_text (g, x2, y1, L"absolute");
+	Graphics_text (g, x1, y1, U"%d\\'p__%%ij%_ = %\\de__%%ij%_");
+	Graphics_text (g, x2, y1, U"absolute");
 	y1 -= dyt;
-	Graphics_text (g, x1, y1, L"%d\\'p__%%ij%_ = %b\\.c%\\de__%%ij%_");
-	Graphics_text (g, x2, y1, L"ratio");
+	Graphics_text (g, x1, y1, U"%d\\'p__%%ij%_ = %b\\.c%\\de__%%ij%_");
+	Graphics_text (g, x2, y1, U"ratio");
 	y1 -= dyt;
-	Graphics_text (g, x1, y1, L"%d\\'p__%%ij%_ = %b\\.c%\\de__%%ij%_+%a");
-	Graphics_text (g, x2, y1, L"interval");
+	Graphics_text (g, x1, y1, U"%d\\'p__%%ij%_ = %b\\.c%\\de__%%ij%_+%a");
+	Graphics_text (g, x2, y1, U"interval");
 	y1 -= dyt;
-	Graphics_text (g, x1, y1, L"%d\\'p__%%ij%_ = \\s{I}-spline (%\\de__%%ij%_)");
-	Graphics_text (g, x2, y1, L"\\s{I}\\--spline");
+	Graphics_text (g, x1, y1, U"%d\\'p__%%ij%_ = \\s{I}-spline (%\\de__%%ij%_)");
+	Graphics_text (g, x2, y1, U"\\s{I}\\--spline");
 	y1 -= dyt;
-	Graphics_text (g, x1, y1, L"%d\\'p__%%ij%_ = monotone (%\\de__%%ij%_)");
-	Graphics_text (g, x2, y1, L"monotone");
+	Graphics_text (g, x1, y1, U"%d\\'p__%%ij%_ = monotone (%\\de__%%ij%_)");
+	Graphics_text (g, x2, y1, U"monotone");
 
 	// Distance to ScalarProduct
 
@@ -3285,9 +3142,9 @@ void drawMDSClassRelations (Graphics g) {
 	Graphics_arrow (g, x23, y1, x23, y[6] + boxHeight);
 	x1 = x[6] + boxWidth + dboxx / 2;
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_BOTTOM);
-	Graphics_text (g, x1, y1, L"\\s{TORSCA}");
+	Graphics_text (g, x1, y1, U"\\s{TORSCA}");
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_TOP);
-	Graphics_text (g, x1, y1, L"\\s{YTL}");
+	Graphics_text (g, x1, y1, U"\\s{YTL}");
 
 	Graphics_setLineType (g, Graphics_DOTTED);
 
@@ -3297,7 +3154,7 @@ void drawMDSClassRelations (Graphics g) {
 	Graphics_arrow (g, x23, ym, x[6] + boxWidth, ym);
 	x1 = x[6] + boxWidth + dboxx / 2 + boxWidth3;
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_BOTTOM);
-	Graphics_text (g, x1, ym, L"\\s{INDSCAL}");
+	Graphics_text (g, x1, ym, U"\\s{INDSCAL}");
 
 	// Dissimilarity to Configuration
 
@@ -3310,9 +3167,8 @@ void drawMDSClassRelations (Graphics g) {
 	// Restore settings
 
 	Graphics_setLineType (g, Graphics_DRAWN);
-	Graphics_setLineWidth (g, 1);
+	Graphics_setLineWidth (g, 1.0);
 	Graphics_setTextAlignment (g, Graphics_LEFT, Graphics_BOTTOM);
-
 }
 
 /* End of file MDS.cpp */
diff --git a/dwtools/MDS.h b/dwtools/MDS.h
index 8c9ed13..735c2fd 100644
--- a/dwtools/MDS.h
+++ b/dwtools/MDS.h
@@ -4,7 +4,7 @@
  *
  * Multi Dimensional Scaling
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -90,12 +90,11 @@ void Salience_setDefaults (Salience me);
 
 long Salience_correctNegatives (Salience me);
 
-void Salience_draw (Salience me, Graphics g, int xdimension, int ydimension,
-	int garnish);
+void Salience_draw (Salience me, Graphics g, int xdimension, int ydimension, int garnish);
 
 /************************** class MDSVec ******************************/
 
-Thing_define (MDSVec, Data) {
+Thing_define (MDSVec, Daata) {
 	// new data:
 	public:
 		long nProximities, nPoints;
@@ -116,15 +115,14 @@ Thing_define (MDSVecs, Ordered) {
 MDSVecs MDSVecs_create ();
 
 
-Configuration ContingencyTable_to_Configuration_ca (ContingencyTable me,
-	long numberOfDimensions, int scaling);
+Configuration ContingencyTable_to_Configuration_ca (ContingencyTable me, long numberOfDimensions, int scaling);
 
 /********************* class Proximities *******************************/
 
 Thing_define (Proximities, TablesOfReal) {
 };
 
-void Proximities_init (I, ClassInfo klas);
+void Proximities_init (Proximities me, ClassInfo klas);
 
 Proximities Proximities_create ();
 
@@ -166,13 +164,11 @@ Thing_define (Dissimilarity, Proximity) {
 
 Dissimilarity Dissimilarity_create (long numberOfPoints);
 
-int Dissimilarity_getAdditiveConstant (I, double *c);
+double Dissimilarity_getAdditiveConstant (Dissimilarity me);
 /*
 	Get the best estimate for the additive constant:
 		"distance = dissimilarity + constant"
-	F. Cailliez (1983), The analytical solution of the additive
-		constant problem,
-	Psychometrika 48, 305-308.
+	F. Cailliez (1983), The analytical solution of the additive constant problem, Psychometrika 48, 305-308.
 */
 
 /****************** class Transformator *******************************/
@@ -186,13 +182,13 @@ Thing_define (Transformator, Thing) {
 		virtual Distance v_transform (MDSVec vec, Distance dist, Weight w);
 };
 
-void Transformator_init (I, long numberOfPoints);
+void Transformator_init (Transformator me, long numberOfPoints);
 
 Transformator Transformator_create (long numberOfPoints);
 
-void Transformator_setNormalization (I, int normalization);
+void Transformator_setNormalization (Transformator me, int normalization);
 
-Distance Transformator_transform (I, MDSVec vec, Distance dist, Weight w);
+Distance Transformator_transform (Transformator me, MDSVec vec, Distance dist, Weight w);
 
 Thing_define (ISplineTransformator, Transformator) {
 	// new data:
@@ -204,8 +200,7 @@ Thing_define (ISplineTransformator, Transformator) {
 		virtual Distance v_transform (MDSVec vec, Distance dist, Weight w);
 };
 
-ISplineTransformator ISplineTransformator_create (long numberOfPoints, long numberOfInteriorKnots,
-	long order);
+ISplineTransformator ISplineTransformator_create (long numberOfPoints, long numberOfInteriorKnots, long order);
 
 Thing_define (RatioTransformator, Transformator) {
 	// new data:
@@ -254,7 +249,7 @@ Thing_define (Kruskal, Thing) {
 		int process;
 		int measurementLevel;
 		int conditionality;
-		Configuration configuration;
+		autoConfiguration configuration;
 		Proximities proximities;
 		int stress_formula;
 		MDSVec vec;
@@ -281,8 +276,7 @@ double Distance_Weight_congruenceCoefficient (Distance x, Distance y, Weight w);
 	Congruence coefficient B&G page 350.
 */
 
-void Distance_Weight_rawStressComponents (Distance fit, Distance conf,
-	Weight weight, double *eta_fit, double *eta_conf, double *rho);
+void Distance_Weight_rawStressComponents (Distance fit, Distance conf, Weight weight, double *eta_fit, double *eta_conf, double *rho);
 /*
 	Computes
 		eta_fit = sum (i<j,i=1..n; w[i][j] * dfit[i][j]^2)
@@ -293,54 +287,32 @@ void Distance_Weight_rawStressComponents (Distance fit, Distance conf,
 		conf[i][j] = distance between x[i] and x[j] (in the configuration)
 */
 
-double Dissimilarity_Configuration_Transformator_Weight_stress
-	(Dissimilarity d, Configuration c, Any t, Weight w, int type);
+double Dissimilarity_Configuration_Transformator_Weight_stress (Dissimilarity d, Configuration c, Transformator t, Weight w, int type);
 
-double Dissimilarity_Configuration_Weight_absolute_stress
-	(Dissimilarity d, Configuration c, Weight w, int type);
+double Dissimilarity_Configuration_Weight_absolute_stress (Dissimilarity d, Configuration c, Weight w, int type);
 
-double Dissimilarity_Configuration_Weight_ratio_stress
-	(Dissimilarity d, Configuration c, Weight w, int type);
+double Dissimilarity_Configuration_Weight_ratio_stress (Dissimilarity d, Configuration c, Weight w, int type);
 
-double Dissimilarity_Configuration_Weight_interval_stress
-	(Dissimilarity d, Configuration c, Weight w, int type);
+double Dissimilarity_Configuration_Weight_interval_stress (Dissimilarity d, Configuration c, Weight w, int type);
 
-double Dissimilarity_Configuration_Weight_monotone_stress
-	(Dissimilarity d, Configuration c, Weight w, int tiesProcessing, int type);
+double Dissimilarity_Configuration_Weight_monotone_stress (Dissimilarity d, Configuration c, Weight w, int tiesProcessing, int type);
 
-double Dissimilarity_Configuration_Weight_ispline_stress
-	(Dissimilarity d, Configuration c, Weight w, long numberOfInteriorKnots,
-	long order, int type);
+double Dissimilarity_Configuration_Weight_ispline_stress (Dissimilarity d, Configuration c, Weight w, long numberOfInteriorKnots, long order, int type);
 
 void Distance_Weight_smacofNormalize (Distance d, Weight w);
 
-Configuration Dissimilarity_Configuration_Weight_Transformator_smacof
-	(Dissimilarity me, Configuration conf, Weight weight, Any transformator,
-	double tolerance, long numberOfIterations, int showProgress,
-	double *stress);
+Configuration Dissimilarity_Configuration_Weight_Transformator_smacof (Dissimilarity me, Configuration conf, Weight weight, Transformator t, double tolerance, long numberOfIterations, int showProgress, double *stress);
 
-Configuration Dissimilarity_Configuration_Weight_Transformator_multiSmacof
-	(Dissimilarity me, Configuration conf, Weight w, Any transformator,
-	double tolerance, long numberOfIterations, long numberOfRepetitions,
-	int showProgress);
+Configuration Dissimilarity_Configuration_Weight_Transformator_multiSmacof (Dissimilarity me, Configuration conf, Weight w, Transformator t,	double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress);
 
 
-Configuration Dissimilarity_Configuration_Weight_absolute_mds
-	(Dissimilarity dis, Configuration cstart, Weight w, double tolerance,
-	long numberOfIterations, long numberOfRepetitions, int showProgress);
+Configuration Dissimilarity_Configuration_Weight_absolute_mds (Dissimilarity dis, Configuration cstart, Weight w, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress);
 
-Configuration Dissimilarity_Configuration_Weight_ratio_mds
-	(Dissimilarity dis, Configuration cstart, Weight w, double tolerance,
-	long numberOfIterations, long numberOfRepetitions, int showProgress);
+Configuration Dissimilarity_Configuration_Weight_ratio_mds (Dissimilarity dis, Configuration cstart, Weight w, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress);
 
-Configuration Dissimilarity_Configuration_Weight_interval_mds
-	(Dissimilarity dis, Configuration cstart, Weight w, double tolerance,
-	long numberOfIterations, long numberOfRepetitions, int showProgress);
+Configuration Dissimilarity_Configuration_Weight_interval_mds (Dissimilarity dis, Configuration cstart, Weight w, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress);
 
-Configuration Dissimilarity_Configuration_Weight_monotone_mds
-	(Dissimilarity dis, Configuration cstart, Weight w, int tiesProcessing,
-	double tolerance, long numberOfIterations, long numberOfRepetitions,
-	int showProgress);
+Configuration Dissimilarity_Configuration_Weight_monotone_mds (Dissimilarity dis, Configuration cstart, Weight w, int tiesProcessing, double tolerance, long numberOfIterations, long numberOfRepetitions, int showProgress);
 
 Configuration Dissimilarity_Configuration_Weight_ispline_mds
 	(Dissimilarity me, Configuration cstart, Weight w,
@@ -373,30 +345,28 @@ Configuration Dissimilarity_Weight_ispline_mds
 void Dissimilarity_Configuration_Weight_drawAbsoluteRegression
 	(Dissimilarity d, Configuration c, Weight w, Graphics g, double xmin,
 	double xmax, double ymin, double ymax,
-	double size_mm, const wchar_t *mark, int garnish);
+	double size_mm, const char32 *mark, int garnish);
 
 void Dissimilarity_Configuration_Weight_drawRatioRegression
 	(Dissimilarity d, Configuration c, Weight w, Graphics g,
 	double xmin, double xmax, double ymin, double ymax,
-	double size_mm, const wchar_t *mark, int garnish);
+	double size_mm, const char32 *mark, int garnish);
 
 void Dissimilarity_Configuration_Weight_drawIntervalRegression
 	(Dissimilarity d, Configuration c, Weight w, Graphics g,
 	double xmin, double xmax, double ymin, double ymax,
-	double size_mm, const wchar_t *mark, int garnish);
+	double size_mm, const char32 *mark, int garnish);
 
 void Dissimilarity_Configuration_Weight_drawMonotoneRegression
 	(Dissimilarity d, Configuration c, Weight w, Graphics g,
 	int tiesProcessing, double xmin, double xmax, double ymin, double ymax,
-	double size_mm, const wchar_t *mark, int garnish);
+	double size_mm, const char32 *mark, int garnish);
 
-void Dissimilarity_Configuration_Weight_drawISplineRegression
-	(Dissimilarity d, Configuration c, Weight w, Graphics g,
+void Dissimilarity_Configuration_Weight_drawISplineRegression (Dissimilarity d, Configuration c, Weight w, Graphics g,
 	long numberOfInternalKnots, long order, double xmin, double xmax,
-	double ymin, double ymax, double size_mm, const wchar_t *mark, int garnish);
+	double ymin, double ymax, double size_mm, const char32 *mark, int garnish);
 
-Distance Dissimilarity_Configuration_Transformator_Weight_transform
-	(Dissimilarity d, Configuration c, Any t, Weight w);
+Distance Dissimilarity_Configuration_Transformator_Weight_transform (Dissimilarity d, Configuration c, Transformator t, Weight w);
 
 /******** DISTANCE & SCALARPRODUCT *******************************/
 
@@ -407,23 +377,19 @@ ScalarProduct Distance_to_ScalarProduct (Distance me, int normalize);
 /************** DISTANCE & PROXIMITY ********************************/
 
 
-void Proximity_Distance_drawScatterDiagram (I, Distance thee, Graphics g,
-	double xmin, double xmax, double ymin, double ymax, double size_mm,
-	const wchar_t *mark, int garnish);
+void Proximity_Distance_drawScatterDiagram (I, Distance thee, Graphics g, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish);
 
 
 /********** COVARIANCE & CONFIGURATION ***************************/
 
 
-Configuration Covariance_to_Configuration (Covariance me,
-	long numberOfDimensions);
+Configuration Covariance_to_Configuration (Covariance me, long numberOfDimensions);
 
 
 /************ CORRELATION & CONFIGURATION ************************/
 
 
-Configuration Correlation_to_Configuration (Correlation me,
-	long numberOfDimensions);
+Configuration Correlation_to_Configuration (Correlation me, long numberOfDimensions);
 
 
 /************** DISTANCE & CONFIGURATION **************************/
@@ -432,42 +398,27 @@ Configuration Correlation_to_Configuration (Correlation me,
 Distance Configuration_to_Distance (Configuration me);
 /* Calculates distances between the points */
 
-void Distance_and_Configuration_drawScatterDiagram
-	(Distance me, Configuration him, Graphics g, double xmin, double xmax,
-	double ymin, double ymax, double size_mm, const wchar_t *mark, int garnish);
+void Distance_and_Configuration_drawScatterDiagram (Distance me, Configuration him, Graphics g, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish);
 
-Configuration Distance_to_Configuration_torsca (Distance me,
-	int numberOfDimensions);
+Configuration Distance_to_Configuration_torsca (Distance me, int numberOfDimensions);
 
 
 /************** DISSIMILARITY & CONFIGURATION ************************/
 
 
-Configuration Dissimilarity_kruskal (Dissimilarity me, long numberOfDimensions,
-	long metric, int processTies, int stress_formula, double tolerance,
-	long numberOfIterations, long numberOfRepetitions);
+Configuration Dissimilarity_kruskal (Dissimilarity me, long numberOfDimensions, long metric, int processTies, int stress_formula, double tolerance, long numberOfIterations, long numberOfRepetitions);
 
-Configuration Dissimilarity_Configuration_kruskal
-	(Dissimilarity me, Configuration him, int processTies, int stress_formula,
-	double tolerance, long numberOfIterations, long numberOfRepetitions);
+Configuration Dissimilarity_Configuration_kruskal (Dissimilarity me, Configuration him, int processTies, int stress_formula, double tolerance, long numberOfIterations, long numberOfRepetitions);
 
-double Dissimilarity_Configuration_getStress
-	(Dissimilarity me, Configuration him, int processTies, int stress_formula);
+double Dissimilarity_Configuration_getStress (Dissimilarity me, Configuration him, int processTies, int stress_formula);
 
-void Dissimilarity_Configuration_drawShepardDiagram
-	(Dissimilarity me, Configuration him, Graphics g, double xmin, double xmax,
-	double ymin, double ymax, double size_mm, const wchar_t *mark, int garnish);
+void Dissimilarity_Configuration_drawShepardDiagram (Dissimilarity me, Configuration him, Graphics g, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish);
 
-Distance Dissimilarity_Configuration_monotoneRegression
-	(Dissimilarity dis, Configuration conf, int processTies);
+Distance Dissimilarity_Configuration_monotoneRegression (Dissimilarity dis, Configuration conf, int processTies);
 
-Distances Dissimilarities_Configuration_monotoneRegression
-	(Dissimilarities dissims, Configuration conf, int processTies);
+Distances Dissimilarities_Configuration_monotoneRegression (Dissimilarities dissims, Configuration conf, int processTies);
 
-void Dissimilarity_Configuration_drawMonotoneRegression
-	(Dissimilarity me, Configuration him, Graphics g, int processTies,
-	double xmin, double xmax, double ymin, double ymax,
-	double size_mm, const wchar_t *mark, int garnish);
+void Dissimilarity_Configuration_drawMonotoneRegression	(Dissimilarity me, Configuration him, Graphics g, int processTies, double xmin, double xmax, double ymin, double ymax, double size_mm, const char32 *mark, int garnish);
 
 /************** SIMILARITY & TABLESOFREAL ********************************/
 
@@ -543,8 +494,7 @@ Distances Dissimilarities_to_Distances (Dissimilarities me, int scale);
 /************** DISTANCES & CONFIGURATION ************************************/
 
 
-int Distances_to_Configuration_ytl (Distances me, int numberOfDimensions,
-	int normalizeScalarProducts, Configuration *out1, Salience *out2);
+void Distances_to_Configuration_ytl (Distances me, int numberOfDimensions, int normalizeScalarProducts, autoConfiguration *out1, autoSalience *out2);
 /*
 	F.W. Young, Y. Takane & R. Lewyckyj (1978), Three notes on ALSCAL,
 	Psychometrika 43, 433-435.
@@ -558,30 +508,22 @@ Distances Configurations_to_Distances (Configurations me);
 /************** MDSVEC(S) & DISTANCE(S) **********************************/
 
 
-Distance MDSVec_Distance_monotoneRegression (MDSVec me, Distance thee,
-	int processTies);
+Distance MDSVec_Distance_monotoneRegression (MDSVec me, Distance thee, int processTies);
 
-Distances MDSVecs_Distance_monotoneRegression (MDSVecs me, Distance thee,
-	int processTies);
+Distances MDSVecs_Distance_monotoneRegression (MDSVecs me, Distance thee, int processTies);
 
 
 /************** SCALARPRODUCT(S) & ...... **********************************/
 
-void ScalarProduct_Configuration_getVariances (ScalarProduct me,
-	Configuration thee, double *varianceExplained, double *varianceTotal);
+void ScalarProduct_Configuration_getVariances (ScalarProduct me, Configuration thee, double *varianceExplained, double *varianceTotal);
 
-void ScalarProducts_Configuration_Salience_vaf (ScalarProducts me,
-	Configuration thee, Salience him, double *vaf);
+void ScalarProducts_Configuration_Salience_vaf (ScalarProducts me, Configuration thee, Salience him, double *vaf);
 
 ScalarProducts Distances_to_ScalarProducts (Distances me, int normalize);
 
-void ScalarProducts_to_Configuration_ytl (ScalarProducts me,
-	int numberOfDimensions, Configuration *out1, Salience *out2);
+void ScalarProducts_to_Configuration_ytl (ScalarProducts me, int numberOfDimensions, autoConfiguration *out1, autoSalience *out2);
 
-void ScalarProducts_Configuration_Salience_indscal (ScalarProducts sp,
-	Configuration conf, Salience weights, double tolerance,
-	long numberOfIterations, int showProgress,
-	Configuration *out1, Salience *out2, double *vaf);
+void ScalarProducts_Configuration_Salience_indscal (ScalarProducts sp, Configuration conf, Salience weights, double tolerance, long numberOfIterations, int showProgress, autoConfiguration *out1, autoSalience *out2, double *vaf);
 
 /************** INDSCAL & ....... ***********************************/
 
@@ -589,26 +531,25 @@ void ScalarProducts_Configuration_Salience_indscal (ScalarProducts sp,
 void Dissimilarities_indscal (Dissimilarities me, long numberOfDimensions,
 	int processTies, int normalizeScalarProducts, double tolerance,
 	long numberOfIterations, long numberOfRepetitions, int showProgress,
-	Configuration *out1, Salience *out2);
+	autoConfiguration *out1, autoSalience *out2);
 
 void Distances_indscal (Distances me, long numberOfDimensions,
 	int normalizeScalarProducts, double tolerance, long numberOfIterations,
-	long numberOfRepetitions, int showProgress,
-	Configuration *out1, Salience *out2);
+	long numberOfRepetitions, int showProgress,	autoConfiguration *out1, autoSalience *out2);
 
 void Dissimilarities_Configuration_indscal (Dissimilarities me,
 	Configuration conf, int processTies, int normalizeScalarProducts,
 	double tolerance, long numberOfIterations,
-	int showProgress, Configuration *out1, Salience *out2);
+	int showProgress, autoConfiguration *out1, autoSalience *out2);
 
 void Distances_Configuration_indscal (Distances dists, Configuration conf,
 	int normalizeScalarProducts, double tolerance, long numberOfIterations,
-	int showProgress, Configuration *out1, Salience *out2);
+	int showProgress, autoConfiguration *out1, autoSalience *out2);
 
 void Dissimilarities_Configuration_Salience_indscal (Dissimilarities dissims,
 	Configuration conf, Salience w, int processTies,
 	int normalizeScalarProducts, double tolerance, long numberOfIterations,
-	int showProgress, Configuration *out1, Salience *out2, double *vaf);
+	int showProgress, autoConfiguration *out1, autoSalience *out2, double *vaf);
 
 Distances MDSVecs_Configuration_Salience_monotoneRegression (MDSVecs vecs,
 	Configuration conf, Salience weights, int processTies);
@@ -616,7 +557,7 @@ Distances MDSVecs_Configuration_Salience_monotoneRegression (MDSVecs vecs,
 void Distances_Configuration_Salience_indscal (Distances dists,
 	Configuration conf, Salience weights,
 	int normalizeScalarProducts, double tolerance, long numberOfIterations,
-	int showProgress, Configuration *out1, Salience *out2, double *vaf);
+	int showProgress, autoConfiguration *out1, autoSalience *out2, double *vaf);
 
 void Distances_Configuration_Salience_vaf (Distances me, Configuration thee,
 	Salience him, int normalizeScalarProducts, double *vaf);
@@ -624,35 +565,31 @@ void Distances_Configuration_Salience_vaf (Distances me, Configuration thee,
 void Dissimilarities_Configuration_Salience_vaf (Dissimilarities me, Configuration thee,
 	Salience him, int processTies, int normalizeScalarProducts, double *vaf);
 
-void Distances_Configuration_vaf (Distances me, Configuration thee,
-	int normalizeScalarProducts, double *vaf);
+void Distances_Configuration_vaf (Distances me, Configuration thee, int normalizeScalarProducts, double *vaf);
 
 void Dissimilarities_Configuration_vaf (Dissimilarities me, Configuration thee,
 	int processTies, int normalizeScalarProducts, double *vaf);
 
-Salience ScalarProducts_Configuration_to_Salience (ScalarProducts me,
-	Configuration him);
+Salience ScalarProducts_Configuration_to_Salience (ScalarProducts me, Configuration him);
 
-Salience Distances_Configuration_to_Salience (Distances me, Configuration him,
-	int normalizeScalarProducts);
+Salience Distances_Configuration_to_Salience (Distances me, Configuration him, int normalizeScalarProducts);
 
-Salience Dissimilarities_Configuration_to_Salience (Dissimilarities me,
-	Configuration him, int processTies, int normalizeScalarProducts);
+Salience Dissimilarities_Configuration_to_Salience (Dissimilarities me, Configuration him, int processTies, int normalizeScalarProducts);
 
 
 /********* Casts from & to TableOfReal *****************************/
 
-Dissimilarity TableOfReal_to_Dissimilarity (I);
+Dissimilarity TableOfReal_to_Dissimilarity (TableOfReal me);
 
-Similarity TableOfReal_to_Similarity (I);
+Similarity TableOfReal_to_Similarity (TableOfReal me);
 
-Distance TableOfReal_to_Distance (I);
+Distance TableOfReal_to_Distance (TableOfReal me);
 
-Salience TableOfReal_to_Salience (I);
+Salience TableOfReal_to_Salience (TableOfReal me);
 
-Weight TableOfReal_to_Weight (I);
+Weight TableOfReal_to_Weight (TableOfReal me);
 
-ScalarProduct TableOfReal_to_ScalarProduct (I);
+ScalarProduct TableOfReal_to_ScalarProduct (TableOfReal me);
 
 /**************  EXAMPLES  ***************************************************/
 
@@ -663,8 +600,7 @@ Collection INDSCAL_createCarrollWishExample (double noiseStd);
 
 Salience Salience_createCarrollWishExample ();
 
-void drawSplines (Graphics g, double low, double high, double ymin, double ymax,
-	int type, long order, wchar_t const *interiorKnots, int garnish);
+void drawSplines (Graphics g, double low, double high, double ymin, double ymax, int type, long order, char32 const *interiorKnots, int garnish);
 
 void drawMDSClassRelations (Graphics g);
 
diff --git a/dwtools/MFCC.cpp b/dwtools/MFCC.cpp
index c466e76..e2dd651 100644
--- a/dwtools/MFCC.cpp
+++ b/dwtools/MFCC.cpp
@@ -38,7 +38,7 @@ MFCC MFCC_create (double tmin, double tmax, long nt, double dt, double t1,
 		CC_init (me.peek(), tmin, tmax, nt, dt, t1, maximumNumberOfCoefficients, fmin_mel, fmax_mel);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("MFCC not created.");
+		Melder_throw (U"MFCC not created.");
 	}
 }
 
@@ -57,7 +57,7 @@ void MFCC_lifter (MFCC me, long lifter) {
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not lifted.");
+		Melder_throw (me, U": not lifted.");
 	}
 }
 
@@ -65,11 +65,8 @@ TableOfReal MFCC_to_TableOfReal (MFCC me, bool includeC0) {
 	try {
 		long numberOfColumns = my maximumNumberOfCoefficients + (includeC0 ? 1 : 0);
 		autoTableOfReal thee = TableOfReal_create (my nx, numberOfColumns);
-		autoMelderString columnLabel;
 		for (long i = 1; i <= numberOfColumns; i++) {
-			MelderString_append (&columnLabel, L"c", Melder_integer (includeC0 ? i - 1 : i));
-			TableOfReal_setColumnLabel (thee.peek(), i, columnLabel.string);
-			MelderString_empty (&columnLabel);
+			TableOfReal_setColumnLabel (thee.peek(), i, Melder_cat (U"c", includeC0 ? i - 1 : i));
 		}
 		long offset = includeC0 ? 1 : 0;
 		for (long iframe = 1; iframe <= my nx; iframe++) {
@@ -83,7 +80,7 @@ TableOfReal MFCC_to_TableOfReal (MFCC me, bool includeC0) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TabelOfReal.");
+		Melder_throw (me, U": not converted to TabelOfReal.");
 	}
 }
 
@@ -99,41 +96,41 @@ Sound MFCC_to_Sound (MFCC me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not represented as Sound.");
+		Melder_throw (me, U": not represented as Sound.");
 	}
 }
 
 Sound MFCCs_crossCorrelate (MFCC me, MFCC thee, enum kSounds_convolve_scaling scaling, enum kSounds_convolve_signalOutsideTimeDomain signalOutsideTimeDomain) {
 	try {
 		if (my dx != thy dx) {
-			Melder_throw ("The samplings of the two MFCC's have to be equal.");
+			Melder_throw (U"The samplings of the two MFCC's have to be equal.");
 		}
 		if (my maximumNumberOfCoefficients != thy maximumNumberOfCoefficients) {
-			Melder_throw ("The number of coefficients in the two MFCC's have to be equal.");
+			Melder_throw (U"The number of coefficients in the two MFCC's have to be equal.");
 		}
 		autoSound target = MFCC_to_Sound (me);
 		autoSound source = MFCC_to_Sound (thee);
 		autoSound cc = Sounds_crossCorrelate (target.peek(), source.peek(), scaling, signalOutsideTimeDomain);
 		return cc.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No cross-correlation between ", me, " and ", thee, " calculated.");
+		Melder_throw (U"No cross-correlation between ", me, U" and ", thee, U" calculated.");
 	}
 }
 
 Sound MFCCs_convolve (MFCC me, MFCC thee, enum kSounds_convolve_scaling scaling, enum kSounds_convolve_signalOutsideTimeDomain signalOutsideTimeDomain) {
 	try {
 		if (my dx != thy dx) {
-			Melder_throw ("The samplings of the two MFCC's have to be equal.");
+			Melder_throw (U"The samplings of the two MFCC's have to be equal.");
 		}
 		if (my maximumNumberOfCoefficients != thy maximumNumberOfCoefficients) {
-			Melder_throw ("The number of coefficients in the two MFCC's have to be equal.");
+			Melder_throw (U"The number of coefficients in the two MFCC's have to be equal.");
 		}
 		autoSound target = MFCC_to_Sound (me);
 		autoSound source = MFCC_to_Sound (thee);
 		autoSound cc = Sounds_convolve (target.peek(), source.peek(), scaling, signalOutsideTimeDomain);
 		return cc.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " and ", thee, " not convolved.");
+		Melder_throw (me, U" and ", thee, U" not convolved.");
 	}
 }
 
@@ -157,7 +154,7 @@ static double CC_Frames_distance (CC_Frame me, CC_Frame thee, bool includeEnergy
  */
 Matrix MFCC_to_Matrix_features (MFCC me, double windowLength, bool includeEnergy) {
 	try {
-		long nw = windowLength / my dx / 2;
+		long nw = (long) floor (windowLength / my dx / 2);
 		autoMelSpectrogram him = MFCC_to_MelSpectrogram (me, 0, 0, 1);
 		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 1, 4, 4, 1, 1);
 		thy z[1][1] = thy z[1][my nx] = 0;  // first & last frame
@@ -214,7 +211,7 @@ Matrix MFCC_to_Matrix_features (MFCC me, double windowLength, bool includeEnergy
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no features calculated.");
+		Melder_throw (me, U": no features calculated.");
 	}
 }
 
diff --git a/dwtools/Makefile b/dwtools/Makefile
index f8c3771..caaee23 100644
--- a/dwtools/Makefile
+++ b/dwtools/Makefile
@@ -1,6 +1,6 @@
 # Makefile of the library "dwtools"
 # David Weenink, 22 February 2010
-# djmw 20141019 Latest modification
+# djmw 20150803 Latest modification
 
 include ../makefile.defs
 
@@ -11,7 +11,7 @@ OBJECTS = Activation.o AffineTransform.o \
 	Categories_and_Strings.o CCA.o CCA_and_Correlation.o \
 	CC.o CCs_to_DTW.o \
 	ClassificationTable.o Confusion.o \
-	Configuration.o ContingencyTable.o \
+	ComplexSpectrogram.o Configuration.o ContingencyTable.o \
 	Configuration_AffineTransform.o \
 	Configuration_and_Procrustes.o  DataModeler.o Distance.o \
 	DTW.o DTW_and_TextGrid.o \
@@ -33,6 +33,7 @@ OBJECTS = Activation.o AffineTransform.o \
 	Minimizers.o \
 	Matrix_extensions.o \
 	Matrix_Categories.o MDS.o \
+	OptimalCeilingTier.o OptimalCeilingTierEditor.o \
 	Pattern.o PCA.o \
 	Pitch_extensions.o Polynomial.o \
 	Polygon_extensions.o Procrustes.o \
diff --git a/dwtools/Matrix_Categories.cpp b/dwtools/Matrix_Categories.cpp
index 9459cfd..6c6754d 100644
--- a/dwtools/Matrix_Categories.cpp
+++ b/dwtools/Matrix_Categories.cpp
@@ -24,18 +24,17 @@
 #include "Matrix_Categories.h"
 #include "TableOfReal_extensions.h"
 
-TableOfReal Matrix_and_Categories_to_TableOfReal (I, Categories thee) {
+TableOfReal Matrix_and_Categories_to_TableOfReal (Matrix me, Categories thee) {
 	try {
-		iam (Matrix);
 		if (thy size != my ny) {
-			Melder_throw ("Number of rows and number of categories must be equal.");
+			Melder_throw (U"Number of rows and number of categories must be equal.");
 		}
 
 		autoTableOfReal him = TableOfReal_create (my ny, my nx);
-		TableOfReal_setSequentialColumnLabels (him.peek(), 0, 0, NULL, 1, 1);
+		TableOfReal_setSequentialColumnLabels (him.peek(), 0, 0, nullptr, 1, 1);
 
 		for (long i = 1; i <= my ny; i++) {
-			his rowLabels[i] = Melder_wcsdup (OrderedOfString_itemAtIndex_c (thee, i));
+			his rowLabels[i] = Melder_dup (OrderedOfString_itemAtIndex_c (thee, i));
 		}
 		for (long i = 1; i <= my ny; i++) {
 			for (long j = 1; j <= my nx; j++) {
@@ -44,7 +43,7 @@ TableOfReal Matrix_and_Categories_to_TableOfReal (I, Categories thee) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal not created from Matrix & Categories.");
+		Melder_throw (U"TableOfReal not created from Matrix & Categories.");
 	}
 }
 
diff --git a/dwtools/Matrix_Categories.h b/dwtools/Matrix_Categories.h
index 23c8df7..8c03708 100644
--- a/dwtools/Matrix_Categories.h
+++ b/dwtools/Matrix_Categories.h
@@ -28,14 +28,6 @@
 #include "Categories.h"
 #include "TableOfReal.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-TableOfReal Matrix_and_Categories_to_TableOfReal (I, Categories thee);
-
-#ifdef __cplusplus
-	}
-#endif
+TableOfReal Matrix_and_Categories_to_TableOfReal (Matrix me, Categories thee);
 
 #endif /* _Matrix_Categories_h_ */
diff --git a/dwtools/Matrix_extensions.cpp b/dwtools/Matrix_extensions.cpp
index eb13fe9..1829492 100644
--- a/dwtools/Matrix_extensions.cpp
+++ b/dwtools/Matrix_extensions.cpp
@@ -1,6 +1,6 @@
 /* Matrix_extensions.cpp
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,10 +30,9 @@
 #include "Eigen.h"
 #include "NUM2.h"
 
-void Matrix_scatterPlot (I, Graphics g, long icx, long icy,
-                         double xmin, double xmax, double ymin, double ymax,
-                         double size_mm, const wchar_t *mark, int garnish) {
-	iam (Matrix);
+void Matrix_scatterPlot (Matrix me, Graphics g, long icx, long icy, double xmin, double xmax, double ymin, double ymax,
+	double size_mm, const char32 *mark, int garnish)
+{
 	long ix = labs (icx), iy = labs (icy);
 
 	if (ix < 1 || ix > my nx || iy < 1 || iy > my nx) {
@@ -72,20 +71,18 @@ void Matrix_scatterPlot (I, Graphics g, long icx, long icy,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksLeft (g, 2, true, true, false);
 		if (ymin * ymax < 0.0) {
-			Graphics_markLeft (g, 0.0, 1, 1, 1, NULL);
+			Graphics_markLeft (g, 0.0, true, true, true, nullptr);
 		}
-		Graphics_marksBottom (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
 		if (xmin * xmax < 0.0) {
-			Graphics_markBottom (g, 0.0, 1, 1, 1, NULL);
+			Graphics_markBottom (g, 0.0, true, true, true, nullptr);
 		}
 	}
 }
 
-
-void Matrix_drawAsSquares (I, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish) {
-	iam (Matrix);
+void Matrix_drawAsSquares (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish) {
 	Graphics_Colour colour = Graphics_inqColour (g);
 	long ixmin, ixmax, iymin, iymax;
 
@@ -110,33 +107,35 @@ void Matrix_drawAsSquares (I, Graphics g, double xmin, double xmax, double ymin,
 		for (long j = ixmin; j <= ixmax; j++) {
 			double x = Matrix_columnToX (me, j);
 			double d = 0.95 * sqrt (fabs (my z[i][j]) / wAbsMax);
-			double x1WC = x - d * dx / 2, x2WC = x + d * dx / 2;
-			double y1WC = y - d * dy / 2, y2WC = y + d * dy / 2;
-			if (my z[i][j] > 0) {
-				Graphics_setColour (g, Graphics_WHITE);
+			if (d > 0) {
+				double x1WC = x - d * dx / 2, x2WC = x + d * dx / 2;
+				double y1WC = y - d * dy / 2, y2WC = y + d * dy / 2;
+				if (my z[i][j] > 0) {
+					Graphics_setColour (g, Graphics_WHITE);
+				}
+				Graphics_fillRectangle (g, x1WC, x2WC, y1WC, y2WC);
+				Graphics_setColour (g, colour);
+				Graphics_rectangle (g, x1WC, x2WC , y1WC, y2WC);
 			}
-			Graphics_fillRectangle (g, x1WC, x2WC, y1WC, y2WC);
-			Graphics_setColour (g, colour);
-			Graphics_rectangle (g, x1WC, x2WC , y1WC, y2WC);
 		}
 	}
 	Graphics_setGrey (g, 0.0);
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksLeft (g, 2, true, true, false);
 		if (ymin * ymax < 0.0) {
-			Graphics_markLeft (g, 0.0, 1, 1, 1, NULL);
+			Graphics_markLeft (g, 0.0, true, true, true, nullptr);
 		}
-		Graphics_marksBottom (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
 		if (xmin * xmax < 0.0) {
-			Graphics_markBottom (g, 0.0, 1, 1, 1, NULL);
+			Graphics_markBottom (g, 0.0, true, true, true, nullptr);
 		}
 	}
 }
 
-void Matrix_scale (I, int choice) {
-	iam (Matrix); double min, max, extremum;
+void Matrix_scale (Matrix me, int choice) {
+	double min, max, extremum;
 	long nZero = 0;
 
 	if (choice == 2) { /* by row */
@@ -172,16 +171,15 @@ void Matrix_scale (I, int choice) {
 			}
 		}
 	} else {
-		Melder_flushError ("Matrix_scale: choice must be >= 0 && < 3.");
+		Melder_flushError (U"Matrix_scale: choice must be > 0 && <= 3.");
 		return;
 	}
 	if (nZero) {
-		Melder_warning (L"Matrix_scale: extremum == 0, (part of) matrix unscaled.");
+		Melder_warning (U"Matrix_scale: extremum == 0, (part of) matrix unscaled.");
 	}
 }
 
-Matrix Matrix_transpose (I) {
-	iam (Matrix);
+Matrix Matrix_transpose (Matrix me) {
 	try {
 		autoMatrix thee = Matrix_create (my ymin, my ymax, my ny, my dy, my y1,
 		                                 my xmin, my xmax, my nx, my dx, my x1);
@@ -192,15 +190,13 @@ Matrix Matrix_transpose (I) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not transposed.");
+		Melder_throw (me, U": not transposed.");
 	}
 }
 
-void Matrix_drawDistribution (I, Graphics g, double xmin, double xmax,
+void Matrix_drawDistribution (Matrix me, Graphics g, double xmin, double xmax,
                               double ymin, double ymax, double minimum, double maximum, long nBins,
                               double freqMin, double freqMax, int cumulative, int garnish) {
-	iam (Matrix);
-
 	if (nBins <= 0) {
 		return;
 	}
@@ -233,7 +229,7 @@ void Matrix_drawDistribution (I, Graphics g, double xmin, double xmax,
 	long nxy = 0;
 	for (long i = iymin; i <= iymax; i++) {
 		for (long j = ixmin; j <= ixmax; j++) {
-			long bin = 1 + floor ( (my z[i][j] - minimum) / binWidth);
+			long bin = 1 + (long) floor ( (my z[i][j] - minimum) / binWidth);
 			if (bin <= nBins && bin > 0) {
 				freq[bin]++; nxy ++;
 			}
@@ -246,7 +242,7 @@ void Matrix_drawDistribution (I, Graphics g, double xmin, double xmax,
 		} else {
 			NUMvector_extrema (freq.peek(), 1, nBins, & freqMin, & freqMax);
 			if (freqMax <= freqMin) {
-				freqMin = freqMin > 1 ? freqMin - 1 : 0;
+				freqMin = freqMin > 1.0 ? freqMin - 1.0 : 0.0;
 				freqMax += 1.0;
 			}
 		}
@@ -254,7 +250,7 @@ void Matrix_drawDistribution (I, Graphics g, double xmin, double xmax,
 
 	Graphics_setInner (g);
 	Graphics_setWindow (g, minimum, maximum, freqMin, freqMax);
-	double fi = 0;
+	double fi = 0.0;
 	for (long i = 1; i <= nBins; i++) {
 		double ftmp = freq[i];
 		fi = cumulative ? fi + freq[i] / nxy : freq[i];
@@ -268,17 +264,16 @@ void Matrix_drawDistribution (I, Graphics g, double xmin, double xmax,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 		if (! cumulative) {
-			Graphics_textLeft (g, 1, L"Number/bin");
+			Graphics_textLeft (g, true, U"Number/bin");
 		}
 	}
 }
 
-void Matrix_drawSliceY (I, Graphics g, double x, double ymin, double ymax,
+void Matrix_drawSliceY (Matrix me, Graphics g, double x, double ymin, double ymax,
                         double min, double max) {
-	iam (Matrix);
 
 	if (x < my xmin || x > my xmax) {
 		return;
@@ -315,16 +310,15 @@ void Matrix_drawSliceY (I, Graphics g, double x, double ymin, double ymax,
 	Graphics_unsetInner (g);
 }
 
-Matrix Matrix_solveEquation (I, double tolerance) {
+Matrix Matrix_solveEquation (Matrix me, double tolerance) {
 	try {
-		iam (Matrix);
 		long nr = my ny, nc = my nx - 1;
 
 		if (nc == 0) {
-			Melder_throw ("Matrix_solveEquation: there must be at least 2 columns in the matrix.");
+			Melder_throw (U"Matrix_solveEquation: there must be at least 2 columns in the matrix.");
 		}
 		if (nr < nc) {
-			Melder_warning (L"Matrix_solveEquation: solution is not unique (fewer equations than unknowns).");
+			Melder_warning (U"Matrix_solveEquation: solution is not unique (fewer equations than unknowns).");
 		}
 
 		autoNUMmatrix<double> u (1, nr, 1, nc);
@@ -345,12 +339,11 @@ Matrix Matrix_solveEquation (I, double tolerance) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Matrix equation not solved.");
+		Melder_throw (U"Matrix equation not solved.");
 	}
 }
 
-double Matrix_getMean (I, double xmin, double xmax, double ymin, double ymax) {
-	iam (Matrix);
+double Matrix_getMean (Matrix me, double xmin, double xmax, double ymin, double ymax) {
 	if (xmax <= xmin) {
 		xmin = my xmin; xmax = my xmax;
 	}
@@ -371,8 +364,7 @@ double Matrix_getMean (I, double xmin, double xmax, double ymin, double ymax) {
 	return sum / ((iymax - iymin + 1) * (ixmax - ixmin + 1));
 }
 
-double Matrix_getStandardDeviation (I, double xmin, double xmax, double ymin, double ymax) {
-	iam (Matrix);
+double Matrix_getStandardDeviation (Matrix me, double xmin, double xmax, double ymin, double ymax) {
 	if (xmax <= xmin) {
 		xmin = my xmin; xmax = my xmax;
 	}
diff --git a/dwtools/Matrix_extensions.h b/dwtools/Matrix_extensions.h
index 2c8ed46..86f6c12 100644
--- a/dwtools/Matrix_extensions.h
+++ b/dwtools/Matrix_extensions.h
@@ -27,39 +27,39 @@
 #include "Matrix.h"
 #include "Graphics.h"
 
-void Matrix_scatterPlot (I, Graphics g, long icx, long icy,
+void Matrix_scatterPlot (Matrix me, Graphics g, long icx, long icy,
     double xmin, double xmax, double ymin, double ymax,
-    double size_mm, const wchar_t *mark, int garnish);
+    double size_mm, const char32 *mark, int garnish);
 /* Draw my columns ix and iy as a scatterplot (with squares)				*/
 
-void Matrix_drawAsSquares (I, Graphics graphics, double xmin, double xmax, double ymin, double ymax, int garnished);
+void Matrix_drawAsSquares (Matrix me, Graphics graphics, double xmin, double xmax, double ymin, double ymax, int garnished);
 /* Draw a Matrix as small squares whose area correspond to the matrix element */
 /* The square is filled with black if the weights are negative					*/
 
-void Matrix_drawRowsAsLineSegments (I, Graphics g, double xmin, double xmax, double ymin, double ymax,
+void Matrix_drawRowsAsLineSegments (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax,
 	double minimum, double maximum, int connect);
 /* draw a row as segments */
 
-void Matrix_scale (I, int choice);
+void Matrix_scale (Matrix me, int choice);
 /* choice = 1 :divide each elmnt by the maximum (abs) */
 /* choice = 2 :rows, divide each row elmnt by the maximum (abs) of that row	*/
 /* choice = 3 :columns, divide each col elmnt by the maximum of that col	*/
 
-Matrix Matrix_transpose (I);
+Matrix Matrix_transpose (Matrix me);
 
-void Matrix_drawDistribution (I, Graphics g, double xmin, double xmax,
+void Matrix_drawDistribution (Matrix me, Graphics g, double xmin, double xmax,
 	double ymin, double ymax, double minimum, double maximum, long nBins,
 	double freqMin, double freqmax, int cumulative, int garnish);
 
-void Matrix_drawSliceY (I, Graphics g, double x, double ymin, double ymax,
+void Matrix_drawSliceY (Matrix me, Graphics g, double x, double ymin, double ymax,
 	double min, double max);
 
-int Matrix_fitPolynomial (I, long maxDegree);
+int Matrix_fitPolynomial (Matrix me, long maxDegree);
 
-Matrix Matrix_solveEquation (I, double tolerance);
+Matrix Matrix_solveEquation (Matrix me, double tolerance);
 
-double Matrix_getMean (I, double xmin, double xmax, double ymin, double ymax);
-double Matrix_getStandardDeviation (I, double xmin, double xmax, double ymin, double ymax);
+double Matrix_getMean (Matrix me, double xmin, double xmax, double ymin, double ymax);
+double Matrix_getStandardDeviation (Matrix me, double xmin, double xmax, double ymin, double ymax);
 
 
 #endif /* _Matrix_extensions_h_ */
diff --git a/dwtools/Minimizers.cpp b/dwtools/Minimizers.cpp
index e2e58d3..1a23bac 100644
--- a/dwtools/Minimizers.cpp
+++ b/dwtools/Minimizers.cpp
@@ -1,6 +1,6 @@
 /* Minimizers.cpp
  *
- * Copyright (C) 2001-2013 David Weenink
+ * Copyright (C) 2001-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -48,53 +48,46 @@
 Thing_implement (Minimizer, Thing, 0);
 
 void structMinimizer :: v_destroy () {
-	NUMvector_free (p, 1);
-	NUMvector_free (history, 1);
+	NUMvector_free<double> (p, 1);
+	NUMvector_free<double> (history, 1);
 	Minimizer_Parent :: v_destroy ();
 }
 
-static void classMinimizer_after (I, Any aclosure) {
-	iam (Minimizer);
-	(void) aclosure;
+static void classMinimizer_after (Minimizer me, Any /* aclosure */) {
 
 	if (my success || ! my gmonitor) {
 		return;
 	}
 
 	if (my start == 1) {
-		wchar_t s[35];
-		Minimizer_drawHistory (me, my gmonitor, 0, my maxNumOfIterations, 0, 1.1 * my history[1], 1);
-		swprintf (s, 35, L"Dimension of search space: %6ld", my nParameters);
-		Graphics_textTop (my gmonitor, 0, s);
+		Minimizer_drawHistory (me, my gmonitor, 0, my maxNumOfIterations, 0.0, 1.1 * my history[1], 1);
+		Graphics_textTop (my gmonitor, false, Melder_cat (U"Dimension of search space: ", my nParameters));
 	}
 	Graphics_setInner (my gmonitor);
-	Graphics_line (my gmonitor, my iteration, my history[my iteration],
-	               my iteration, my history[my iteration]);
+	Graphics_line (my gmonitor, my iteration, my history[my iteration], my iteration, my history[my iteration]);
 	Graphics_unsetInner (my gmonitor);
-	Melder_monitor ( (double) (my iteration) / my maxNumOfIterations,
-	                  L"Iterations: ", Melder_integer (my iteration),
-	                  L", Function calls: ", Melder_integer (my funcCalls),
-	                  L", Cost: ", Melder_double (my minimum));
+	Melder_monitor ((double) (my iteration) / my maxNumOfIterations, U"Iterations: ", my iteration, 
+		U", Function calls: ", my funcCalls, U", Cost: ", my minimum);
 }
 
-void Minimizer_init (I, long nParameters, Data object) {
-	iam (Minimizer);
+void Minimizer_init (Minimizer me, long nParameters, Daata object) {
 	my nParameters = nParameters;
 	my p = NUMvector<double> (1, nParameters);
 	my object = object;
 	my minimum = 1.0e30;
 	my after = classMinimizer_after;
-	Minimizer_reset (me, 0); /* added 27/11/97 */
+	Minimizer_reset (me, nullptr); /* added 27/11/97 */
 }
 
 void Minimizer_setParameters (Minimizer me, Any parameters) {
 	my v_setParameters (parameters);
 }
+
 static void monitor_off (Minimizer me) {
-	Melder_monitor (1.1, NULL);
+	Melder_monitor (1.1);
 	if (my gmonitor) {
 		Graphics_clearWs (my gmonitor); // DON'T forget (my gmonitor)
-		my gmonitor = NULL;
+		my gmonitor = nullptr;
 	}
 }
 
@@ -107,26 +100,23 @@ void Minimizer_minimize (Minimizer me, long maxNumOfIterations, double tolerance
 		}
 
 		if (my iteration + maxNumOfIterations > my maxNumOfIterations) {
-			double *history;
 			my maxNumOfIterations += maxNumOfIterations;
-			if (my history) {
-				my history++;    /* arrays start at 1 !! */
+			if (my history) { // clumsy because vector must have been allocated  before one can append
+				NUMvector_append<double> (& my history, 1, & my maxNumOfIterations);
+			} else {
+				my history = NUMvector<double> (1, my maxNumOfIterations);
 			}
-			history = (double *) Melder_realloc (my history, my maxNumOfIterations *
-			                                     sizeof (double));
-			my history = --history; /* arrays start at 1 !! */
 		}
 		if (monitor) {
-			my gmonitor = (Graphics) Melder_monitor (0.0, L"Starting...");
+			my gmonitor = (Graphics) Melder_monitor (0.0, U"Starting...");
 		}
 		my start = 1; /* for my after() */
 		my v_minimize ();
 		if (monitor) {
 			monitor_off (me);
 		}
-		if (my success) Melder_casual ("Minimizer_minimize: minimum %f reached \n"
-			                               "after %ld iterations and %ld function calls.", my minimum,
-			                               my iteration, my funcCalls);
+		if (my success) Melder_casual (U"Minimizer_minimize:", U" minimum ", my minimum, U" reached \nafter ", my iteration,
+			U" iterations and ", my funcCalls, U" function calls.");
 	} catch (MelderError) {
 		if (monitor) {
 			monitor_off (me);    // temporarily until better monitor facilities
@@ -142,34 +132,33 @@ void Minimizer_minimizeManyTimes (Minimizer me, long numberOfTimes, long maxIter
 	autoNUMvector<double> popt (NUMvector_copy<double> (my p, 1, my nParameters), 1);
 
 	if (! monitorSingle) {
-		Melder_progress (0.0, L"Minimize many times");
+		Melder_progress (0.0, U"Minimize many times");
 	}
 	/* on first iteration start with current parameters 27/11/97 */
 	for (long i = 1; i <= numberOfTimes; i++) {
 		Minimizer_minimize (me, maxIterationsPerTime, tolerance, monitorSingle);
-		Melder_casual ("Current %ld: minimum = %.17g", i, my minimum);
+		Melder_casual (U"Current ", i, U": minimum = ", my minimum);
 		if (my minimum < fopt) {
 			NUMvector_copyElements (my p, popt.peek(), 1, my nParameters);
 			fopt = my minimum;
 		}
-		Minimizer_reset (me, 0);
+		Minimizer_reset (me, nullptr);
 		if (! monitorSingle) {
 			try {
-				Melder_progress ( (double) i / numberOfTimes, Melder_integer (i), L" from ",
-				                   Melder_integer (numberOfTimes));
+				Melder_progress ((double) i / numberOfTimes, i, U" from ", numberOfTimes);
 			} catch (MelderError) {
-				Melder_clearError ();   // interrurpt, no error
+				Melder_clearError ();   // interrupted, no error
 				break;
 			}
 		}
 	}
 	if (! monitorSingle) {
-		Melder_progress (1.0, 0);
+		Melder_progress (1.0);
 	}
 	Minimizer_reset (me, popt.peek());
 }
 
-static void Minimizer_setAfterEachIteration (Minimizer me, void (*after) (I, Any aclosure), Any aclosure) {
+void Minimizer_setAfterEachIteration (Minimizer me, void (*after) (Minimizer me, Any aclosure), Any aclosure) {
 	my after = after;
 	my aclosure = aclosure;
 }
@@ -181,30 +170,21 @@ void Minimizer_reset (Minimizer me, const double guess[]) {
 		}
 	} else {
 		for (long i = 1; i <= my nParameters; i++) {
-			my p[i] = NUMrandomUniform (-1, 1);
+			my p[i] = NUMrandomUniform (-1.0, 1.0);
 		}
 	}
-	/*
-		Don't use NUMdvector_free: realloc in Minimizer_minimize
-	*/
-	if (my history != 0) {
-		my history++;
-		Melder_free (my history);
-	}
+
+	NUMvector_free<double> (my history, 1);
+	my history = nullptr;
 	my maxNumOfIterations = my success = my funcCalls = my iteration = 0;
 	my minimum = 1.0e38;
 	my v_reset ();
 }
 
-void Minimizer_drawHistory (Minimizer me, Graphics g, long iFrom, long iTo, double hmin,
-                            double hmax, int garnish) {
-	if (my history == 0) {
+void Minimizer_drawHistory (Minimizer me, Graphics g, long iFrom, long iTo, double hmin, double hmax, int garnish) {
+	if (! my history) {
 		return;
 	}
-	autoNUMvector<double> history (1, my iteration);
-	for (long i = 1; i <= my iteration; i++) {
-		history[i] = my history[i];
-	}
 	if (iTo <= iFrom) {
 		iFrom = 1; iTo = my iteration;
 	}
@@ -216,7 +196,7 @@ void Minimizer_drawHistory (Minimizer me, Graphics g, long iFrom, long iTo, doub
 		itmax = my iteration;
 	}
 	if (hmax <= hmin) {
-		NUMvector_extrema (history.peek(), itmin, itmax, & hmin, & hmax);
+		NUMvector_extrema (my history, itmin, itmax, & hmin, & hmax);
 	}
 	if (hmax <= hmin) {
 		hmin -= 0.5 * fabs (hmin);
@@ -224,13 +204,13 @@ void Minimizer_drawHistory (Minimizer me, Graphics g, long iFrom, long iTo, doub
 	}
 	Graphics_setInner (g);
 	Graphics_setWindow (g, iFrom, iTo, hmin, hmax);
-	Graphics_function (g, history.peek(), itmin, itmax, itmin, itmax);
+	Graphics_function (g, my history, itmin, itmax, itmin, itmax);
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Number of iterations");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_textBottom (g, true, U"Number of iterations");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
@@ -258,7 +238,7 @@ void structSteepestDescentMinimizer :: v_minimize () {
 			try {
 				after (this, aclosure);
 			} catch (MelderError) {
-				Melder_casual ("Interrupted after %ld iterations.", iteration);
+				Melder_casual (U"Interrupted after ", iteration, U" iterations.");
 				Melder_clearError ();
 				break;
 			}
@@ -280,9 +260,7 @@ void structSteepestDescentMinimizer :: v_setParameters (Any parameters) {
 	}
 }
 
-SteepestDescentMinimizer SteepestDescentMinimizer_create (long nParameters, Data object,
-        double (*func) (Data object, const double p[]),
-        void (*dfunc) (Data object, const double p[], double dp[])) {
+SteepestDescentMinimizer SteepestDescentMinimizer_create (long nParameters, Daata object, double (*func) (Daata object, const double p[]), void (*dfunc) (Daata object, const double p[], double dp[])) {
 	try {
 		autoSteepestDescentMinimizer me = Thing_new (SteepestDescentMinimizer);
 		Minimizer_init (me.peek(), nParameters, object);
@@ -290,7 +268,7 @@ SteepestDescentMinimizer SteepestDescentMinimizer_create (long nParameters, Data
 		my dfunc = dfunc;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SteepestDescentMinimizer not created.");
+		Melder_throw (U"SteepestDescentMinimizer not created.");
 	}
 }
 
@@ -300,7 +278,7 @@ Thing_implement (VDSmagtMinimizer, Minimizer, 0);
 
 void structVDSmagtMinimizer :: v_minimize () {
 	int decrease_direction_found = 1;
-	int l_iteration = 1;   // David, dat is gevaarlijk: een locale variabele met dezelfde naam als een member; daarom hernoemd, maar is het correct? yes, we can iterate in steps, therefore local and global counter
+	int l_iteration = 1;   // yes, we can iterate in steps, therefore local and global counter
 	double rtemp, rtemp2;
 
 	// df is estimate of function reduction obtainable during line search
@@ -333,7 +311,7 @@ void structVDSmagtMinimizer :: v_minimize () {
 		}
 		if (flag & 2) {
 			restart = 2; /* flag & 1 ??? */
-		} else if (fabs ( (double) gcg0) > 0.2 * gopt_sq) {
+		} else if (fabs ((double) gcg0) > 0.2 * gopt_sq) {
 			restart = 1;
 		}
 		if (restart == 0) {
@@ -430,11 +408,10 @@ void structVDSmagtMinimizer :: v_minimize () {
 				fch = fc - minimum;
 				gr2s = (grc - gropt) / dalpha;
 				temp = (fch + fch) / dalpha - grc - gropt;
-				if ( (fc < minimum) ||
-				        ( (fc == minimum) && (grc / gropt > -1))) {
+				if ((fc < minimum) || ((fc == minimum) && (grc / gropt > -1))) {
 					double *tmp;
 					gopt_sq = gsq;
-					history [this ->iteration] = minimum = fc;
+					history [this -> iteration] = minimum = fc;
 					tmp = p; p = pc; pc = tmp;
 					tmp = dp; dp = gc; gc = tmp;
 					if (grc *gropt <= 0) {
@@ -448,7 +425,7 @@ void structVDSmagtMinimizer :: v_minimize () {
 						try {
 							after (this, aclosure);
 						} catch (MelderError) {
-							Melder_casual ("Interrupted after %ld iterations.", this -> iteration);
+							Melder_casual (U"Interrupted after ", this -> iteration, U" iterations.");
 							Melder_clearError ();
 							break;
 						}
@@ -462,8 +439,7 @@ void structVDSmagtMinimizer :: v_minimize () {
 				} else {
 					alplim = alpha;
 				}
-			} while (lineSearch_iteration
-			         <= lineSearchMaxNumOfIterations);
+			} while (lineSearch_iteration <= lineSearchMaxNumOfIterations);
 
 			fc = history [this -> iteration] = minimum;
 			rtemp = 0.0;
@@ -499,13 +475,13 @@ void structVDSmagtMinimizer :: v_minimize () {
 }
 
 void structVDSmagtMinimizer :: v_destroy () {
-	NUMvector_free (dp, 1);
-	NUMvector_free (pc, 1);
-	NUMvector_free (gc, 1);
-	NUMvector_free (g0, 1);
-	NUMvector_free (s, 1);
-	NUMvector_free (srst, 1);
-	NUMvector_free (grst, 1);
+	NUMvector_free<double> (dp, 1);
+	NUMvector_free<double> (pc, 1);
+	NUMvector_free<double> (gc, 1);
+	NUMvector_free<double> (g0, 1);
+	NUMvector_free<double> (s, 1);
+	NUMvector_free<double> (srst, 1);
+	NUMvector_free<double> (grst, 1);
 	VDSmagtMinimizer_Parent :: v_destroy ();
 }
 
@@ -515,14 +491,13 @@ void structVDSmagtMinimizer :: v_reset () {
 
 void structVDSmagtMinimizer :: v_setParameters (Any parameters) {
 	if (parameters) {
-		VDSmagtMinimizer_parameters  vdspars = (VDSmagtMinimizer_parameters) parameters;  // David, weer link: dezelfde naam,: Nu niet meer
+		VDSmagtMinimizer_parameters  vdspars = (VDSmagtMinimizer_parameters) parameters;
 		lineSearchGradient = vdspars -> lineSearchGradient;
 		lineSearchMaxNumOfIterations = vdspars -> lineSearchMaxNumOfIterations;
 	}
 }
 
-VDSmagtMinimizer VDSmagtMinimizer_create (long nParameters, Data object, double (*func) (Data object, const double x[]),
-        void (*dfunc) (Data object, const double x[], double dx[])) {
+VDSmagtMinimizer VDSmagtMinimizer_create (long nParameters, Daata object, double (*func) (Daata object, const double x[]), void (*dfunc) (Daata object, const double x[], double dx[])) {
 	try {
 		autoVDSmagtMinimizer me = Thing_new (VDSmagtMinimizer);
 		Minimizer_init (me.peek(), nParameters, object);
@@ -539,7 +514,7 @@ VDSmagtMinimizer VDSmagtMinimizer_create (long nParameters, Data object, double
 		my lineSearchMaxNumOfIterations = 5;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("VDSmagtMinimizer not created.");
+		Melder_throw (U"VDSmagtMinimizer not created.");
 	}
 }
 
@@ -553,7 +528,7 @@ void structLineMinimizer :: v_destroy () {
 
 Thing_implement (LineMinimizer, Minimizer, 0);
 
-void LineMinimizer_init (I, long nParameters, Data object, double (*func) (Data, const double [])) {
+void LineMinimizer_init (I, long nParameters, Daata object, double (*func) (Daata, const double [])) {
 	iam (LineMinimizer);
 	Minimizer_init (me, nParameters, object);
 	my direction = NUMvector<double> (1, nParameters);
diff --git a/dwtools/Minimizers.h b/dwtools/Minimizers.h
index b993ecc..24fd197 100644
--- a/dwtools/Minimizers.h
+++ b/dwtools/Minimizers.h
@@ -31,32 +31,32 @@
 /*********** deferred class Minimizer **********************************/
 
 Thing_define (Minimizer, Thing) {
-	// new data:
-	public:
-		long nParameters;	/* the number of parameters */
-		double *p;			/* the parameters */
-		double minimum;		/* current minimum */
-		double *history;	/* previous minima */
-		double tolerance;	/* stop criterium */
-		Data object;		/* reference to the object that uses this Minimizer */
-		long funcCalls;		/* the number of times 'func' has been called */
-		long success;		/* indicates whether I'm done */
-		long start;			/* start iteration series */
-		long maxNumOfIterations; /* the current maximum number of iterations */
-		long iteration;     /* the total number of iterations */
-		void (*after) (I, Any aclosure); /* to be called after each iteration */
-		Any aclosure;
-		Graphics gmonitor;		/* graphics to monitor the minimization process */
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_info () { }
-	// new methods:
-		virtual void v_minimize () { }  /* does the work */
-		virtual void v_reset () { } /* reset the minimizer */
-		virtual void v_setParameters (Any parameters) { (void) parameters; }
+	long nParameters;	/* the number of parameters */
+	double *p;			/* the parameters */
+	double minimum;		/* current minimum */
+	double *history;	/* previous minima */
+	double tolerance;	/* stop criterium */
+	Daata object;		/* reference to the object that uses this Minimizer */
+	long funcCalls;		/* the number of times 'func' has been called */
+	long success;		/* indicates whether I'm done */
+	long start;			/* start iteration series */
+	long maxNumOfIterations; /* the current maximum number of iterations */
+	long iteration;     /* the total number of iterations */
+	void (*after) (Minimizer me, Any aclosure); /* to be called after each iteration */
+	Any aclosure;
+	Graphics gmonitor;		/* graphics to monitor the minimization process */
+
+	void v_destroy ()
+		override;
+	void v_info ()
+		override { }
+
+	virtual void v_minimize () { }  /* does the work */
+	virtual void v_reset () { } /* reset the minimizer */
+	virtual void v_setParameters (Any parameters) { (void) parameters; }
 };
 
-void Minimizer_init (I, long nParameters, Data object);
+void Minimizer_init (Minimizer me, long nParameters, Daata object);
 /*
 	Preconditions:
 		nParameters > 0;
@@ -75,14 +75,12 @@ void Minimizer_reset (Minimizer me, const double guess[]);
  *    reset (me);
  */
 
-void Minimizer_setAfterEachIteration (Minimizer me, int (*after) (I, Any aclosure),
-	Any aclosure);
+void Minimizer_setAfterEachIteration (Minimizer me, int (*after) (Minimizer me, Any aclosure), Any aclosure);
 /* set the procedure that is executed after each iteration. */
 
 void Minimizer_setParameters (Minimizer me, Any parameters); /* for inheritors */
 
-void Minimizer_minimize (Minimizer me, long maxNumOfIterations, double tolerance,
-	int monitor);
+void Minimizer_minimize (Minimizer me, long maxNumOfIterations, double tolerance, int monitor);
 /* Minimizes during maximally maxNumOfIterations. The gmonitor is initialized
  * before minimization and cleared afterwards.
  * Preconditions:
@@ -94,11 +92,9 @@ void Minimizer_minimize (Minimizer me, long maxNumOfIterations, double tolerance
  *    after each iteration: iteration++
  */
 
-void Minimizer_minimizeManyTimes (Minimizer me, long numberOfTimes, long maxIterationsPerTime,
-	double tolerance);
+void Minimizer_minimizeManyTimes (Minimizer me, long numberOfTimes, long maxIterationsPerTime, double tolerance);
 
-void Minimizer_drawHistory (Minimizer me, Graphics g, long itmin, long itmax,
-    double minimum, double maximum, int garnish);
+void Minimizer_drawHistory (Minimizer me, Graphics g, long itmin, long itmax, double minimum, double maximum, int garnish);
 
 double Minimizer_getMinimum (Minimizer me);
 
@@ -108,7 +104,7 @@ Thing_define (LineMinimizer, Minimizer) {
 	// new data:
 	public:
 		/* the function to be minimized */
-		double (*func) (Data object, const double p[]);
+		double (*func) (Daata object, const double p[]);
 		double maxLineStep;	/*maximum step in line search direction */
 		double *direction;	/* search direction vector */
 		double *ptry;		/* point in search direction */
@@ -118,9 +114,7 @@ Thing_define (LineMinimizer, Minimizer) {
 		//virtual void v_linmin (double p[], double fp, double direction[], double *fret);	 // David, is dit correct? ja
 };
 
-void LineMinimizer_init (I, long nParameters, Data object, double (*func)
-	(Data object, const double p[]));
-
+void LineMinimizer_init (I, long nParameters, Daata object, double (*func) (Daata object, const double p[]));
 
 /******************  class SteepestDescentMinimizer**************************/
 
@@ -132,17 +126,15 @@ Thing_define (SteepestDescentMinimizer, Minimizer) {
 	// new data:
 	public:
 		double eta, momentum;
-		double (*func) (Data object, const double p[]);
-		void  (*dfunc) (Data object, const double p[], double dp[]);
+		double (*func) (Daata object, const double p[]);
+		void  (*dfunc) (Daata object, const double p[], double dp[]);
 		/* calculates gradient at position p */
 	// overridden methods:
 		virtual void v_minimize ();
 		virtual void v_setParameters (Any parameters);
 };
 
-SteepestDescentMinimizer SteepestDescentMinimizer_create (long nParameters, Data object, double (*func)
-	(Data object, const double p[]), void (*dfunc) (Data object, const double p[],
-	double dp[]));
+SteepestDescentMinimizer SteepestDescentMinimizer_create (long nParameters, Daata object, double (*func) (Daata object, const double p[]), void (*dfunc) (Daata object, const double p[], double dp[]));
 
 
 /**********  class VDSmagtMinimizer ********************************/
@@ -155,8 +147,8 @@ typedef struct structVDSmagtMinimizer_parameters {
 Thing_define (VDSmagtMinimizer, Minimizer) {
 	// new data:
 	public:
-		double (*func) (Data object, const double p[]);
-		void  (*dfunc) (Data object, const double p[], double dp[]);
+		double (*func) (Daata object, const double p[]);
+		void  (*dfunc) (Daata object, const double p[], double dp[]);
 		double *dp;
 		double lineSearchGradient;
 		long lineSearchMaxNumOfIterations;
@@ -178,8 +170,6 @@ Thing_define (VDSmagtMinimizer, Minimizer) {
 		virtual void v_setParameters (Any parameters);
 };
 
-VDSmagtMinimizer VDSmagtMinimizer_create (long dimension, Data object, double (*func)
-	(Data object, const double p[]), void (*dfunc) (Data object, const double p[],
-	double dp[]));
+VDSmagtMinimizer VDSmagtMinimizer_create (long dimension, Daata object, double (*func) (Daata object, const double p[]), void (*dfunc) (Daata object, const double p[], double dp[]));
 
 #endif /* _Minimizer_h_ */
diff --git a/dwtools/OptimalCeilingTier.cpp b/dwtools/OptimalCeilingTier.cpp
new file mode 100644
index 0000000..0b96e42
--- /dev/null
+++ b/dwtools/OptimalCeilingTier.cpp
@@ -0,0 +1,44 @@
+/* OptimalCeilingTier.cpp
+ *
+ * Copyright (C) 2015 David Weenink
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "OptimalCeilingTier.h"
+
+Thing_implement (OptimalCeilingTier, RealTier, 0);
+
+OptimalCeilingTier OptimalCeilingTier_create (double tmin, double tmax) {
+	try {
+		autoOptimalCeilingTier me = Thing_new (OptimalCeilingTier);
+		RealTier_init (me.peek(), tmin, tmax);
+		return me.transfer();
+	} catch (MelderError) {
+		Melder_throw (U"OptimalCeilingTier not created.");
+	}
+}
+
+void OptimalCeilingTier_draw (OptimalCeilingTier me, Graphics g, double tmin, double tmax,
+	double ymin, double ymax, const char32 *method, int garnish)
+{
+	RealTier_draw (me, g, tmin, tmax, ymin, ymax, garnish, method, U"Sound pressure (Pa)");
+}
+
+TableOfReal OptimalCeilingTier_downto_TableOfReal (OptimalCeilingTier me) {
+	return RealTier_downto_TableOfReal (me, U"Time (s)", U"Frequency (Hz)");
+}
+
+/* End of file OptimalCeilingTier.cpp */
diff --git a/fon/manual_exampleSound.h b/dwtools/OptimalCeilingTier.h
similarity index 51%
copy from fon/manual_exampleSound.h
copy to dwtools/OptimalCeilingTier.h
index 05ecef6..7cb61b0 100644
--- a/fon/manual_exampleSound.h
+++ b/dwtools/OptimalCeilingTier.h
@@ -1,8 +1,8 @@
-#ifndef _manual_exampleSound_h_
-#define _manual_exampleSound_h_
-/* manual_exampleSound.h
+#ifndef _OptimalCeilingTier_h_
+#define _OptimalCeilingTier_h_
+/* OptimalCeilingTier.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,11 +19,23 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include "IntensityTier.h"
+#include "TableOfReal.h"
 #include "Sound.h"
-#include "Pitch.h"
 
-Sound manual_exampleSound (void);
-Pitch manual_examplePitch (void);
+/********** class OptimalCeilingTier **********/
 
-/* End of file manual_exampleSound.h */
+Thing_define (OptimalCeilingTier, RealTier) {
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
+};
+
+OptimalCeilingTier OptimalCeilingTier_create (double tmin, double tmax);
+
+void OptimalCeilingTier_draw (OptimalCeilingTier me, Graphics g, double tmin, double tmax,
+	double ymin, double ymax, const char32 *method, int garnish);
+
+TableOfReal OptimalCeilingTier_downto_TableOfReal (OptimalCeilingTier me);
+
+/* End of file OptimalCeilingTier.h */
 #endif
diff --git a/dwtools/OptimalCeilingTierEditor.cpp b/dwtools/OptimalCeilingTierEditor.cpp
new file mode 100644
index 0000000..5bb4030
--- /dev/null
+++ b/dwtools/OptimalCeilingTierEditor.cpp
@@ -0,0 +1,50 @@
+/* OptimalCeilingTierEditor.cpp
+ *
+ * Copyright (C) 2015 David Weenink
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "OptimalCeilingTierEditor.h"
+#include "EditorM.h"
+
+Thing_implement (OptimalCeilingTierEditor, RealTierEditor, 0);
+
+static void menu_cb_OptimalCeilingTierHelp (EDITOR_ARGS) { EDITOR_IAM (OptimalCeilingTierEditor); Melder_help (U"OptimalCeilingTier"); }
+
+void structOptimalCeilingTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
+	OptimalCeilingTierEditor_Parent :: v_createHelpMenuItems (menu);
+	EditorMenu_addCommand (menu, U"OptimalCeilingTier help", 0, menu_cb_OptimalCeilingTierHelp);
+}
+
+void structOptimalCeilingTierEditor :: v_play (double fromTime, double toTime) {
+	if (our d_sound.data) {
+		Sound_playPart (our d_sound.data, fromTime, toTime, theFunctionEditor_playCallback, this);
+	} else {
+		//OptimalCeilingTier_playPart (data, fromTime, toTime, false);
+	}
+}
+
+OptimalCeilingTierEditor OptimalCeilingTierEditor_create (const char32 *title, OptimalCeilingTier octier, Sound sound, bool ownSound) {
+	try {
+		autoOptimalCeilingTierEditor me = Thing_new (OptimalCeilingTierEditor);
+		RealTierEditor_init (me.peek(), title, (RealTier) octier, sound, ownSound);
+		return me.transfer();
+	} catch (MelderError) {
+		Melder_throw (U"OptimalCeilingTier window not created.");
+	}
+}
+
+/* End of file OptimalCeilingTierEditor.cpp */
diff --git a/dwtools/OptimalCeilingTierEditor.h b/dwtools/OptimalCeilingTierEditor.h
new file mode 100644
index 0000000..d50f608
--- /dev/null
+++ b/dwtools/OptimalCeilingTierEditor.h
@@ -0,0 +1,63 @@
+#ifndef _AmplitudeTierEditor_h_
+#define _OptimalCeilingTierEditor_h_
+/* OptimalCeilingTierEditor.h
+ *
+ * Copyright (C) 2015 David Weenink
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "RealTierEditor.h"
+#include "OptimalCeilingTier.h"
+#include "Sound.h"
+
+Thing_define (OptimalCeilingTierEditor, RealTierEditor) {
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_play (double fromTime, double toTime)
+		override;
+	const char32 * v_quantityText ()
+		override { return U"Frequency (Hz)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Frequency"; }
+	const char32 * v_rightTickUnits ()
+		override { return U" Hz"; }
+	double v_defaultYmin ()
+		override { return 4000.0; }
+	double v_defaultYmax ()
+		override { return +6000.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set frequency range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"4000.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"6000.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum frequency (Hz)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum frequency (Hz)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum frequency"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum frequency"; }
+};
+
+OptimalCeilingTierEditor OptimalCeilingTierEditor_create (const char32 *title,
+	OptimalCeilingTier amplitude,
+	Sound sound,   // may be null
+	bool ownSound);
+
+/* End of file OptimalCeilingTierEditor.h */
+#endif
diff --git a/dwtools/PCA.cpp b/dwtools/PCA.cpp
index 4bd77bf..06cc7c3 100644
--- a/dwtools/PCA.cpp
+++ b/dwtools/PCA.cpp
@@ -63,21 +63,21 @@
 Thing_implement (PCA, Eigen, 0);
 
 void structPCA :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of components: ", Melder_integer (numberOfEigenvalues));
-	MelderInfo_writeLine (L"Number of dimensions: ", Melder_integer (dimension));
-	MelderInfo_writeLine (L"Number of observations: ", Melder_integer (numberOfObservations));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of components: ", numberOfEigenvalues);
+	MelderInfo_writeLine (U"Number of dimensions: ", dimension);
+	MelderInfo_writeLine (U"Number of observations: ", numberOfObservations);
 }
 
 PCA PCA_create (long numberOfComponents, long dimension) {
 	try {
 		autoPCA me = Thing_new (PCA);
 		Eigen_init (me.peek(), numberOfComponents, dimension);
-		my labels = NUMvector<wchar_t *> (1, dimension);
+		my labels = NUMvector<char32 *> (1, dimension);
 		my centroid = NUMvector<double> (1, dimension);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("PCA not created");
+		Melder_throw (U"PCA not created");
 	}
 }
 
@@ -132,17 +132,17 @@ PCA TableOfReal_to_PCA (I) {
 		long m = my numberOfRows, n = my numberOfColumns;
 
 		if (! TableOfReal_areAllCellsDefined (me, 0, 0, 0, 0)) {
-			Melder_throw ("Undefined cells.");
+			Melder_throw (U"Undefined cells.");
 		}
 
-		if (m < 2) Melder_throw ("There is not enough data to perform a PCA.\n"
+		if (m < 2) Melder_throw (U"There is not enough data to perform a PCA.\n"
 			                         "Your table has less than 2 rows.");
 
-		if (m < n) Melder_warning (L"The number of rows in your table is less than the\n"
+		if (m < n) Melder_warning (U"The number of rows in your table is less than the\n"
 			                           "number of columns. ");
 
 		if (NUMfrobeniusnorm (m, n, my data) == 0) {
-			Melder_throw ("All values in your table are zero.");
+			Melder_throw (U"All values in your table are zero.");
 		}
 		autoPCA thee = Thing_new (PCA);
 		autoNUMmatrix<double> a (NUMmatrix_copy (my data, 1, m, 1, n), 1, 1);
@@ -160,7 +160,7 @@ PCA TableOfReal_to_PCA (I) {
 			thy centroid[j] = colmean;
 		}
 		Eigen_initFromSquareRoot (thee.peek(), a.peek(), m, n);
-		thy labels = NUMvector<wchar_t *> (1, n);
+		thy labels = NUMvector<char32 *> (1, n);
 
 		NUMstrings_copyElements (my columnLabels, thy labels, 1, n);
 
@@ -177,7 +177,7 @@ PCA TableOfReal_to_PCA (I) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": PCA not created.");
+		Melder_throw (me, U": PCA not created.");
 	}
 }
 
@@ -198,11 +198,11 @@ TableOfReal PCA_and_TableOfReal_to_TableOfReal_zscores (PCA me, TableOfReal thee
 			}
 		}
 		NUMstrings_copyElements (thy rowLabels, his rowLabels, 1, thy numberOfRows);
-		TableOfReal_setSequentialColumnLabels (him.peek(), 0, 0, L"pc", 1, 1);
+		TableOfReal_setSequentialColumnLabels (him.peek(), 0, 0, U"pc", 1, 1);
 		return him.transfer();
 
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal (zscores) not created from PCA & TableOfReal.");
+		Melder_throw (U"TableOfReal (zscores) not created from PCA & TableOfReal.");
 	}
 }
 
@@ -217,10 +217,10 @@ Configuration PCA_and_TableOfReal_to_Configuration (PCA me, thou, long numberOfD
 		Configuration thim = him.peek();
 		Eigen_and_TableOfReal_project_into (me, thee, 1, thy numberOfColumns, & thim, 1, numberOfDimensions);
 		NUMstrings_copyElements (thy rowLabels, his rowLabels, 1, thy numberOfRows);
-		TableOfReal_setSequentialColumnLabels (him.peek(), 0, 0, L"pc", 1, 1);
+		TableOfReal_setSequentialColumnLabels (him.peek(), 0, 0, U"pc", 1, 1);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Configuration not created from PCA & TableOfReal.");
+		Melder_throw (U"Configuration not created from PCA & TableOfReal.");
 	}
 }
 
@@ -230,7 +230,7 @@ TableOfReal PCA_and_Configuration_to_TableOfReal_reconstruct (PCA me, thou) {
 		long npc = thy numberOfColumns;
 
 		if (thy numberOfColumns > my dimension) {
-			Melder_throw ("The dimension of the Configuration must be less than or equal to the dimension of the PCA.");
+			Melder_throw (U"The dimension of the Configuration must be less than or equal to the dimension of the PCA.");
 		}
 
 		if (npc > my numberOfEigenvalues) {
@@ -252,7 +252,7 @@ TableOfReal PCA_and_Configuration_to_TableOfReal_reconstruct (PCA me, thou) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal not reconstructed.");
+		Melder_throw (U"TableOfReal not reconstructed.");
 	}
 }
 
@@ -274,7 +274,7 @@ double PCA_and_TableOfReal_getFractionVariance (PCA me, thou, long from, long to
 	}
 }
 
-TableOfReal PCA_to_TableOfReal_reconstruct1 (PCA me, wchar_t *numstring) {
+TableOfReal PCA_to_TableOfReal_reconstruct1 (PCA me, char32 *numstring) {
 	try {
 		long npc;
 		autoNUMvector<double> pc (NUMstring_to_numbers (numstring, & npc), 1);
@@ -286,7 +286,7 @@ TableOfReal PCA_to_TableOfReal_reconstruct1 (PCA me, wchar_t *numstring) {
 		autoTableOfReal him = PCA_and_Configuration_to_TableOfReal_reconstruct (me, c.peek());
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " not reconstructed.");
+		Melder_throw (me, U" not reconstructed.");
 	}
 }
 
diff --git a/dwtools/PCA.h b/dwtools/PCA.h
index 81548a6..e197162 100644
--- a/dwtools/PCA.h
+++ b/dwtools/PCA.h
@@ -58,7 +58,7 @@ double PCA_and_TableOfReal_getFractionVariance (PCA me, thou, long from, long to
 TableOfReal PCA_and_Configuration_to_TableOfReal_reconstruct (PCA me, thou);
 /* Reconstruct the original TableOfReal from the PCA and the Configuration */
 
-TableOfReal PCA_to_TableOfReal_reconstruct1 (PCA me, wchar_t *numstring);
+TableOfReal PCA_to_TableOfReal_reconstruct1 (PCA me, char32 *numstring);
 
 #endif /* _PCA_h_ */
 
diff --git a/dwtools/PCA_def.h b/dwtools/PCA_def.h
index b7c4a5e..055ab5e 100644
--- a/dwtools/PCA_def.h
+++ b/dwtools/PCA_def.h
@@ -29,8 +29,8 @@ oo_DEFINE_CLASS (PCA, Eigen)
 	oo_DOUBLE_VECTOR (centroid, dimension)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (PCA)	
diff --git a/dwtools/Pattern.cpp b/dwtools/Pattern.cpp
index 54b3e9e..d52965e 100644
--- a/dwtools/Pattern.cpp
+++ b/dwtools/Pattern.cpp
@@ -1,4 +1,4 @@
-/* Pattern.c
+/* Pattern.cpp
  *
  * Copyright (C) 1993-2011 David Weenink
  *
@@ -39,8 +39,7 @@ int _Pattern_checkElements (Pattern me) {
 	return 1;
 }
 
-void Pattern_init (I, long ny, long nx) {
-	iam (Pattern);
+void Pattern_init (Pattern me, long ny, long nx) {
 	my ny = ny;
 	my nx = nx;
 	Matrix_init (me, 1, nx, nx, 1, 1, 1, ny, ny, 1, 1);
@@ -52,13 +51,11 @@ Pattern Pattern_create (long ny, long nx) {
 		Pattern_init (me.peek(), ny, nx);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Pattern not created.");
+		Melder_throw (U"Pattern not created.");
 	}
 }
 
-void Pattern_normalize (I, int choice, double pmin, double pmax) {
-	iam (Pattern);
-
+void Pattern_normalize (Pattern me, int choice, double pmin, double pmax) {
 	if (pmin == pmax) {
 		(void) Matrix_getWindowExtrema (me, 1, my nx, 1, my ny, & pmin, & pmax);
 	}
@@ -85,24 +82,22 @@ void Pattern_normalize (I, int choice, double pmin, double pmax) {
 	}
 }
 
-void Pattern_draw (I, Graphics g, long pattern, double xmin, double xmax, double ymin, double ymax, int garnish) {
-	iam (Pattern);
+void Pattern_draw (Pattern me, Graphics g, long pattern, double xmin, double xmax, double ymin, double ymax, int garnish) {
 	Matrix_drawRows (me, g, xmin, xmax, pattern - 0.5, pattern + 0.5, ymin, ymax);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
-Pattern Matrix_to_Pattern (I, int join) {
-	iam (Matrix);
+Pattern Matrix_to_Pattern (Matrix me, int join) {
 	try {
 		if (join < 1) {
 			join = 1;
 		}
 		if ( (my ny % join) != 0) {
-			Melder_throw (L"Number of rows is not a multiple of join factor.");
+			Melder_throw (U"Number of rows is not a multiple of join factor.");
 		}
 
 		autoPattern thee = Pattern_create (my ny / join, join * my nx);
@@ -119,7 +114,7 @@ Pattern Matrix_to_Pattern (I, int join) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Pattern created.");
+		Melder_throw (me, U": no Pattern created.");
 	}
 }
 
@@ -129,7 +124,7 @@ Matrix Pattern_to_Matrix (Pattern me) {
 		my structMatrix :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
diff --git a/dwtools/Pattern.h b/dwtools/Pattern.h
index 4098062..d0c799c 100644
--- a/dwtools/Pattern.h
+++ b/dwtools/Pattern.h
@@ -37,19 +37,19 @@ Thing_define (Pattern, Matrix) {
    z[iy][ix]		:the inputs. All elements in interval [0,1].
 */
 
-void Pattern_init (I, long ny, long nx);
+void Pattern_init (Pattern me, long ny, long nx);
 
 Pattern Pattern_create (long ny, long nx);
 
-void Pattern_normalize (I, int choice, double pmin, double pmax);
+void Pattern_normalize (Pattern me, int choice, double pmin, double pmax);
 /* choice == 1: z[i][j] = (z[i][j]-pmin) / (pmax-pmin);
  * choice == 2: z[i][j] *= 1.0 / sum(j=1,j=nx, z[i][j]-pmin)
  */
 
-void Pattern_draw (I, Graphics g, long pattern, double xmin, double xmax,
+void Pattern_draw (Pattern me, Graphics g, long pattern, double xmin, double xmax,
 	double ymin, double ymax, int garnish);
 
-Pattern Matrix_to_Pattern (I, int join);
+Pattern Matrix_to_Pattern (Matrix me, int join);
 Matrix Pattern_to_Matrix (Pattern me);
 
 int _Pattern_checkElements (Pattern me);
diff --git a/dwtools/Pitch_extensions.cpp b/dwtools/Pitch_extensions.cpp
index b99f88d..b00a278 100644
--- a/dwtools/Pitch_extensions.cpp
+++ b/dwtools/Pitch_extensions.cpp
@@ -28,7 +28,7 @@
 
 void Pitch_Frame_addPitch (Pitch_Frame me, double f, double strength, int maxnCandidates) {
 	long pos = 0;
-	double weakest = 1e38;
+	double weakest = 1e308;
 	if (my nCandidates < maxnCandidates) {
 		pos = ++ my nCandidates;
 	} else {
@@ -110,7 +110,7 @@ Pitch Pitch_scaleTime (Pitch me, double scaleFactor) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not scaled.");
+		Melder_throw (me, U": not scaled.");
 	}
 }
 
@@ -150,11 +150,11 @@ PitchTier PitchTier_normalizePitchRange (PitchTier me, double pitchMin_ref_Hz, d
 		double fmax = HertzToSpecial (pitchMax_Hz, pitchUnit);
 
 		if (fminr == NUMundefined || fmaxr == NUMundefined || fmin == NUMundefined || fmax == NUMundefined) {
-			Melder_throw ("The conversion of a pitch value is not defined. ");
+			Melder_throw (U"The conversion of a pitch value is not defined. ");
 		}
 		double ranger = fmaxr - fminr, range = fmax - fmin;
 		if (ranger < 0.01 || range < 0.01) {
-			Melder_throw ("Pitch range too small.");
+			Melder_throw (U"Pitch range too small.");
 		}
 		double fmidr = fminr + ranger / 2;
 		double factor = ranger / range;
@@ -168,28 +168,28 @@ PitchTier PitchTier_normalizePitchRange (PitchTier me, double pitchMin_ref_Hz, d
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no PitchTier created.");
+		Melder_throw (me, U": no PitchTier created.");
 	}
 }
 
 Pitch PitchTier_to_Pitch (PitchTier me, double dt, double pitchFloor, double pitchCeiling) {
 	try {
 		if (my points -> size < 1) {
-			Melder_throw ("The PitchTier is empty.");
+			Melder_throw (U"The PitchTier is empty.");
 		}
 		if (dt <= 0) {
-			Melder_throw ("The time step should be a positive number.");
+			Melder_throw (U"The time step should be a positive number.");
 		}
 		if (pitchFloor >= pitchCeiling) {
-			Melder_throw ("The pitch ceiling must be a higher number than the pitch floor.");
+			Melder_throw (U"The pitch ceiling must be a higher number than the pitch floor.");
 		}
 		double tmin = my xmin, tmax = my xmax, t1 = my xmin + dt / 2;
-		long nt = (tmax - tmin - t1) / dt;
+		long nt = (long) floor ((tmax - tmin - t1) / dt);
 		if (t1 + nt * dt < tmax) {
 			nt++;
 		}
 		if (nt < 1) {
-			Melder_throw ("Duration is too short.");
+			Melder_throw (U"Duration is too short.");
 		}
 		autoPitch thee = Pitch_create (tmin, tmax, nt, dt, t1, pitchCeiling, 1);
 		for (long i = 1; i <= nt; i++) {
@@ -204,7 +204,7 @@ Pitch PitchTier_to_Pitch (PitchTier me, double dt, double pitchFloor, double pit
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Pitch created.");
+		Melder_throw (me, U": no Pitch created.");
 	}
 }
 
diff --git a/dwtools/Pitch_extensions.h b/dwtools/Pitch_extensions.h
index d4af8ca..e466cd2 100644
--- a/dwtools/Pitch_extensions.h
+++ b/dwtools/Pitch_extensions.h
@@ -25,17 +25,8 @@
  djmw 20110307 Latest modification
 */
 
-#ifndef _Pitch_h_
-	#include "Pitch.h"
-#endif
-
-#ifndef _PitchTier_h_
-	#include "PitchTier.h"
-#endif
-
-#ifdef __cplusplus
-	extern "C" {
-#endif
+#include "Pitch.h"
+#include "PitchTier.h"
 
 void Pitch_Frame_addPitch (Pitch_Frame me, double f, double strength, int maxnCandidates);
 void Pitch_Frame_getPitch (Pitch_Frame me, double *f, double *strength);
@@ -50,8 +41,4 @@ Pitch Pitch_scaleTime (Pitch me, double scaleFactor);
 
 Pitch PitchTier_to_Pitch (PitchTier me, double dt, double pitchFloor, double pitchCeiling);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Pitch_extensions_h_ */
diff --git a/dwtools/Polygon_extensions.cpp b/dwtools/Polygon_extensions.cpp
index bfd4b50..d7e7218 100644
--- a/dwtools/Polygon_extensions.cpp
+++ b/dwtools/Polygon_extensions.cpp
@@ -1,6 +1,6 @@
 /* Polygon_extensions.c
  *
- * Copyright (C) 1993-2012 David Weenink
+ * Copyright (C) 1993-2012, 2014 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,7 +30,17 @@
 #include "Vector.h"
 #include "DLL.h"
 
-//
+// not for self-intesecting polygons!
+static double Polygon_area (Polygon me) {
+	double area = 0;
+	long j = my numberOfPoints;
+	for (long i = 1; i <= my numberOfPoints; i++) {
+		area += (my x[j] + my x[i]) * (my y[j] - my y[i]);
+		j = i;
+	}
+	area *= 0.5;
+	return fabs (area); // area my have negative sign in counter clockwise evaluation of area
+}
 
 void Polygon_getExtrema (Polygon me, double *xmin, double *xmax, double *ymin, double *ymax) {
     *xmin = my x[1]; *xmax = my x[1];
@@ -48,15 +58,15 @@ void Polygon_getExtrema (Polygon me, double *xmin, double *xmax, double *ymin, d
         }
     }
 }
-Polygon Polygon_createSimple (wchar_t *xystring) {
+Polygon Polygon_createSimple (char32 *xystring) {
 	try {
 		long numberOfPoints;
 		autoNUMvector<double> xys (NUMstring_to_numbers (xystring, &numberOfPoints), 1);
 		if (numberOfPoints < 6) {
-			Melder_throw ("There must be at least 3 points (= x,y pairs) in the Polygon");
+			Melder_throw (U"There must be at least 3 points (= x,y pairs) in the Polygon");
 		}
 		if (numberOfPoints % 2 != 0) {
-			Melder_throw ("One value is missing.");
+			Melder_throw (U"One value is missing.");
 		}
 		numberOfPoints /= 2; // x,y pairs
 		autoPolygon me = Polygon_create (numberOfPoints);
@@ -64,12 +74,12 @@ Polygon Polygon_createSimple (wchar_t *xystring) {
 			my x[i] = xys[2 * i - 1];
 			my y[i] = xys[2 * i];
 			if (i > 1 && my x[i] == my x[i - 1] && my y[i] == my y[i - 1]) {
-				Melder_warning ("Two successives vertices are equal.");
+				Melder_warning (U"Two successives vertices are equal.");
 			}
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Polygon not created.");
+		Melder_throw (U"Polygon not created.");
 	}
 }
 
@@ -82,7 +92,7 @@ Polygon Polygon_createFromRandomVertices (long numberOfVertices, double xmin, do
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Polygon not created.");
+		Melder_throw (U"Polygon not created.");
 	}
 }
 
@@ -158,13 +168,13 @@ void Polygon_Categories_draw (Polygon me, thou, Graphics graphics, double xmin,
 	Graphics_unsetInner (graphics);
 	if (garnish) {
 		Graphics_drawInnerBox (graphics);
-		Graphics_marksLeft (graphics, 2, 1, 1, 0);
+		Graphics_marksLeft (graphics, 2, true, true, false);
 		if (ymin * ymax < 0.0) {
-			Graphics_markLeft (graphics, 0.0, 1, 1, 1, NULL);
+			Graphics_markLeft (graphics, 0.0, true, true, true, nullptr);
 		}
-		Graphics_marksBottom (graphics, 2, 1, 1, 0);
+		Graphics_marksBottom (graphics, 2, true, true, false);
 		if (xmin * xmax < 0.0) {
-			Graphics_markBottom (graphics, 0.0, 1, 1, 1, NULL);
+			Graphics_markBottom (graphics, 0.0, true, true, true, nullptr);
 		}
 	}
 }
@@ -207,7 +217,7 @@ static void setWindow (Polygon me, Graphics graphics,
 }
 
 void Polygon_drawMarks (Polygon me, Graphics g, double xmin, double xmax,
-                        double ymin, double ymax, double size_mm, const wchar_t *mark) {
+                        double ymin, double ymax, double size_mm, const char32 *mark) {
 	Graphics_setInner (g);
 	setWindow (me, g, xmin, xmax, ymin, ymax);
 	for (long i = 1; i <= my numberOfPoints; i++) {
@@ -222,7 +232,7 @@ Polygon Sound_to_Polygon (Sound me, int channel, double tmin, double tmax, doubl
 	try {
 		bool clip = ymin < ymax;
 		if (channel < 1 || channel > my ny) {
-			Melder_throw ("Channel does not exist.");
+			Melder_throw (U"Channel does not exist.");
 		}
 		if (tmin >= tmax) {
 			tmin = my xmin;
@@ -235,7 +245,7 @@ Polygon Sound_to_Polygon (Sound me, int channel, double tmin, double tmax, doubl
 			tmax = my xmax;
 		}
 		if (tmin >= my xmax || tmax < my xmin) {
-			Melder_throw ("Invalid domain.");
+			Melder_throw (U"Invalid domain.");
 		}
 		long k = 1, i1 = Sampled_xToHighIndex (me, tmin);
 		long i2 = Sampled_xToLowIndex (me, tmax);
@@ -274,7 +284,7 @@ Polygon Sound_to_Polygon (Sound me, int channel, double tmin, double tmax, doubl
 		his y[k++] = CLIP_Y (level, ymin, ymax);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ":no Polygon created.");
+		Melder_throw (me, U":no Polygon created.");
 	}
 }
 
@@ -284,20 +294,20 @@ Polygon Sounds_to_Polygon_enclosed (Sound me, Sound thee, int channel, double tm
 	try {
 		bool clip = ymin < ymax;
 		if (my ny > 1 && thy ny > 1 && my ny != thy ny) {
-			Melder_throw ("The numbers of channels of the two sounds have to be equal or 1.");
+			Melder_throw (U"The numbers of channels of the two sounds have to be equal or 1.");
 		}
 
 		long numberOfChannels = my ny > thy ny ? my ny : thy ny;
 
 		if (channel < 1 || channel > numberOfChannels) {
-			Melder_throw ("Channel does not exist.");
+			Melder_throw (U"Channel does not exist.");
 		}
 		// find overlap in the domains  with xmin workaround as in Sound_to_Polygon
 		double xmin1 = my x1 - 0.5 * my dx, xmin2 = thy x1 - 0.5 * thy dx ;
 		double xmin = my xmin > thy xmin ? xmin1 : xmin2;
 		double xmax = my xmax < thy xmax ? xmin1 + my nx * my dx : xmin2 + thy nx * thy dx;
 		if (xmax <= xmin) {
-			Melder_throw ("Domains must overlap.");
+			Melder_throw (U"Domains must overlap.");
 		}
 		if (tmin >= tmax) {
 			tmin = xmin;
@@ -310,7 +320,7 @@ Polygon Sounds_to_Polygon_enclosed (Sound me, Sound thee, int channel, double tm
 			tmax = xmax;
 		}
 		if (tmin >= xmax || tmax < xmin) {
-			Melder_throw ("Invalid domain.");
+			Melder_throw (U"Invalid domain.");
 		}
 
 		long k = 1;
@@ -369,7 +379,7 @@ Polygon Sounds_to_Polygon_enclosed (Sound me, Sound thee, int channel, double tm
 		Melder_assert (k == numberOfPoints);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no enclosed Polygon created.");
+		Melder_throw (me, U": no enclosed Polygon created.");
 	}
 }
 
@@ -534,7 +544,7 @@ static int LineSegments_getIntersection (double x1, double y1, double x2, double
 // first node has prev = 0, last node has next = 0;
 // entry marks the entrance of the OTHER polygon
 
-Thing_define (Vertex, Data) {
+Thing_define (Vertex, Daata) {
 	// new data:
 public:
 	double x, y, alpha;
@@ -546,7 +556,7 @@ public:
 	virtual void v_copy (Any data_to);
 };
 
-Thing_implement (Vertex, Data, 0);
+Thing_implement (Vertex, Daata, 0);
 
 void structVertex :: v_copy (thou) {
 	thouart (Vertex);
@@ -567,7 +577,7 @@ Vertex Vertex_create () {
 		autoVertex me = Thing_new (Vertex);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Vertex not created.");
+		Melder_throw (U"Vertex not created.");
 	}
 }
 
@@ -594,7 +604,7 @@ Vertices Vertices_create () {
 		Vertices me = Thing_new (Vertices);
 		return me;
 	} catch (MelderError) {
-		Melder_throw ("Vertices not created.");
+		Melder_throw (U"Vertices not created.");
 	}
 }
 
@@ -604,7 +614,7 @@ void Vertices_addCopyBack (Vertices me, DLLNode n) {
 		autoDLLNode nc = (DLLNode) Data_copy (n);
 		DLL_addBack ( (DLL) me, nc.transfer());
 	} catch (MelderError) {
-		Melder_throw (me, ": no copy added.");
+		Melder_throw (me, U": no copy added.");
 	}
 }
 
@@ -646,7 +656,7 @@ Polygon Polygon_circularPermutation (Polygon me, long nshift) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not circularly permuted.");
+		Melder_throw (me, U": not circularly permuted.");
 	}
 }
 
@@ -689,7 +699,7 @@ Polygon Polygon_simplify (Polygon me) {
 			np--;
 		}
 		if (np < 3) {
-			Melder_throw ("Not enough points left after doublet removal.");
+			Melder_throw (U"Not enough points left after doublet removal.");
 		}
 		p1 -> numberOfPoints = np;
 
@@ -750,13 +760,13 @@ Polygon Polygon_simplify (Polygon me) {
 			p -> y[p -> numberOfPoints] = p1 -> y[endpos + 1];
 		}
 		if (p -> numberOfPoints < 3) {
-			Melder_throw ("Not enough points left after collinear points removal.");
+			Melder_throw (U"Not enough points left after collinear points removal.");
 		}
 
 		autoPolygon thee = Data_copy (p.peek()); //
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not simplified.");
+		Melder_throw (me, U": not simplified.");
 	}
 }
 
@@ -769,7 +779,7 @@ Vertices Polygon_to_Vertices (Polygon me, bool close) {
 		for (long i = 1 ; i <= my numberOfPoints; i++) {
 			autoVertex v = Vertex_create ();
 			v -> x = my x[i]; v -> y = my y[i];
-			autoDLLNode n = DLLNode_create ( (Data) v.transfer());
+			autoDLLNode n = DLLNode_create ( (Daata) v.transfer());
 			DLL_addBack ( (DLL) thee.peek(), n.transfer());
 		}
 		Melder_assert (thy numberOfNodes == my numberOfPoints);
@@ -778,7 +788,7 @@ Vertices Polygon_to_Vertices (Polygon me, bool close) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Vertices created.");
+		Melder_throw (me, U": no Vertices created.");
 	}
 }
 
@@ -790,33 +800,33 @@ void Vertices_print (Vertices me, Vertices thee) {
 	long ns = 0, nc = 0, nt, nt2;
 	//	MelderInfo_open();
 	DLLNode n = my front;
-	MelderInfo_writeLine (L"");
+	MelderInfo_writeLine (U"");
 	while (n != 0) {
 		double x = VERTEX (n) -> x, y = VERTEX (n) -> y, alpha = VERTEX (n) -> alpha;
-		const wchar_t *type = 0, *itype;
+		const char32 *type = 0, *itype;
 		if (VERTEX (n) -> intersect == 0) {
-			type = L"S"; ns++; nt = ns; itype = L"-"; nt2 = 0;
+			type = U"S"; ns++; nt = ns; itype = U"-"; nt2 = 0;
 		} else {
-			type = L"I"; nt = VERTEX (n) -> id; nt2 = VERTEX (VERTEX (n) -> neighbour) -> id;
+			type = U"I"; nt = VERTEX (n) -> id; nt2 = VERTEX (VERTEX (n) -> neighbour) -> id;
 			itype = Melder_integer (VERTEX (n) -> intersect);
 		}
-		MelderInfo_write (type, Melder_integer (nt), L" I", itype, L", (", Melder_double (x), L", ", Melder_double (y), L"), ");
-		MelderInfo_write (Melder_double (alpha), L", E", Melder_integer (VERTEX (n) -> entry), L"(", Melder_integer (nt2), L")\n");
+		MelderInfo_write (type, nt, U" I", itype, U", (", x, U", ", y, U"), ");
+		MelderInfo_write (alpha, U", E", VERTEX (n) -> entry, U"(", nt2, U")\n");
 		n = n -> next;
 	}
-	MelderInfo_writeLine (L"");
+	MelderInfo_writeLine (U"");
 	n = thy front;
 	while (n != 0) {
 		double x = VERTEX (n) -> x, y = VERTEX (n) -> y, alpha = VERTEX (n) -> alpha;
-		const wchar_t *type = 0, *itype;
+		const char32 *type = 0, *itype;
 		if (VERTEX (n) -> intersect == 0) {
-			type = L"C"; nc++; nt = nc; itype = L"-"; nt2 = 0;
+			type = U"C"; nc++; nt = nc; itype = U"-"; nt2 = 0;
 		} else {
-			type = L"I"; nt = VERTEX (n) -> id; nt2 = VERTEX (VERTEX (n) -> neighbour) -> id;
+			type = U"I"; nt = VERTEX (n) -> id; nt2 = VERTEX (VERTEX (n) -> neighbour) -> id;
 			itype = Melder_integer (VERTEX (n) -> intersect);
 		}
-		MelderInfo_write (type, Melder_integer (nt), L" I", itype, L", (", Melder_double (x), L", ", Melder_double (y), L"), ");
-		MelderInfo_write (Melder_double (alpha), L", E", Melder_integer (VERTEX (n) -> entry), L"(", Melder_integer (nt2), L")\n");
+		MelderInfo_write (type, nt, U" I", itype, U", (", x, U", ", y, U"), ");
+		MelderInfo_write (alpha, U", E", VERTEX (n) -> entry, U"(", nt2, U")\n");
 		n = n -> next;
 	}
 	//	MelderInfo_close();
@@ -853,7 +863,7 @@ void Vertices_addIntersections (Vertices me, Vertices thee) {
 		double eps = 1e-15;
 		long id = 0;
 		if (my numberOfNodes < 4 || thy numberOfNodes < 4) {
-			Melder_throw ("We need at least three vertices.");
+			Melder_throw (U"We need at least three vertices.");
 		}
 		DLLNode ni = my front; // the node index  in me (s)
 		while (ni != my back) { // until penultimate
@@ -884,8 +894,8 @@ void Vertices_addIntersections (Vertices me, Vertices thee) {
 					DLLNode njc = ins -> neighbour = nc.peek();
 					DLLNode nic = inc -> neighbour = ns.peek();
 					// 4. transfer the vertices to the nodes
-					ns -> data = (Data) ins.transfer();
-					nc -> data = (Data) inc.transfer();
+					ns -> data = (Daata) ins.transfer();
+					nc -> data = (Daata) inc.transfer();
 					// 5. add the nodes to the list
 					DLL_addAfter ( (DLL) me, ni, ns.transfer());
 					DLL_addAfter ( (DLL) thee, nj, nc.transfer());
@@ -907,7 +917,7 @@ void Vertices_addIntersections (Vertices me, Vertices thee) {
 			Vertices_print (me, thee);
 		}
 	} catch (MelderError) {
-		Melder_throw ("Intersections not calculated.");
+		Melder_throw (U"Intersections not calculated.");
 	}
 }
 
@@ -979,12 +989,12 @@ Vertices Verticeses_connectClippingPathsUnion (Vertices me, Vertices thee) {
 		VERTEX (his front) -> poly_npoints = poly_npoints;
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no clipping path.");
+		Melder_throw (me, U": no clipping path.");
 	}
 }
 
-Vertices Verticeses_connectClippingPaths (Vertices me, bool use_myinterior, Vertices thee, bool use_thyinterior);
-Vertices Verticeses_connectClippingPaths (Vertices me, bool use_myinterior, Vertices thee, bool use_thyinterior) {
+//Vertices Verticeses_connectClippingPaths (Vertices me, bool use_myinterior, Vertices thee, bool use_thyinterior);
+static Vertices Verticeses_connectClippingPaths (Vertices me, bool /* use_myinterior */, Vertices thee, bool /* use_thyinterior */) {
 	try {
 		autoVertices him = Vertices_create ();
 		DLLNode prevPoly;
@@ -1049,18 +1059,18 @@ Vertices Verticeses_connectClippingPaths (Vertices me, bool use_myinterior, Vert
 		VERTEX (prevPoly) -> poly_npoints = poly_npoints;
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no clipping vertices created.");
+		Melder_throw (me, U": no clipping vertices created.");
 	}
 }
 
 //
 Polygon Vertices_to_Polygon (Vertices me, DLLNode *ni);
-Polygon Vertices_to_Polygon (Vertices me, DLLNode *ni) {
+Polygon Vertices_to_Polygon (Vertices /* me */, DLLNode *ni) {
 	DLLNode n = *ni;
 	try {
 		long i = 1, nPoints = VERTEX (n) -> poly_npoints;
 		if (nPoints == 0) {
-			Melder_throw ("No number info.");
+			Melder_throw (U"No number info.");
 		}
 		autoPolygon thee = Polygon_create (nPoints);
 		thy x[i] = VERTEX (n) -> x; thy y[i] = VERTEX (n) -> y;
@@ -1070,7 +1080,7 @@ Polygon Vertices_to_Polygon (Vertices me, DLLNode *ni) {
 		*ni =  n;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Polygon not created.");
+		Melder_throw (U"Polygon not created.");
 	}
 }
 
@@ -1085,7 +1095,7 @@ Collection Vertices_to_Polygons (Vertices me) {
 		} while (ni != 0);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no polygon collection created.");
+		Melder_throw (me, U": no polygon collection created.");
 	}
 }
 
@@ -1095,7 +1105,7 @@ Collection Polygons_findClippings (Polygon me, bool use_myinterior, Polygon thee
 		autoVertices s = Polygon_to_Vertices (me, true); // subject
 		long ns = s -> numberOfNodes;
 		autoVertices c = Polygon_to_Vertices (thee, true); // clip
-		long nc = c -> numberOfNodes;
+		// long nc = c -> numberOfNodes;
 		double eps = 1e-15;
 
 		// phase 1: Get all intersections and add them to both lists
@@ -1123,7 +1133,7 @@ Collection Polygons_findClippings (Polygon me, bool use_myinterior, Polygon thee
 		Vertices_markEntryPoints (c.peek(), firstLocation);
 		if (Melder_debug == -1) {
 			Vertices_print (s.peek(), c.peek()); MelderInfo_close();
-			Melder_throw ("Bail out of Polygons_findClippings.");
+			Melder_throw (U"Bail out of Polygons_findClippings.");
 		}
 
 		// phase 3: Determine the clipping paths
@@ -1143,7 +1153,7 @@ Collection Polygons_findClippings (Polygon me, bool use_myinterior, Polygon thee
 		autoCollection pols = Vertices_to_Polygons (pgs.peek());
 		return pols.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no union Polygon created.");
+		Melder_throw (me, U": no union Polygon created.");
 	}
 }
 
@@ -1152,7 +1162,7 @@ Collection Polygons_clip (Polygon subject, Polygon clipper) {
 		autoCollection him = Polygons_findClippings (subject, true, clipper, true);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (subject, ": no union created.");
+		Melder_throw (subject, U": no union created.");
 	}
 }
 
@@ -1162,10 +1172,9 @@ Polygon Polygons_union (Polygon me, Polygon thee) {
 		autoCollection him = Polygons_findClippings (me, false, thee, false);
 		//Melder_assert (his size == 1);
 		autoPolygon p = (Polygon) Collection_subtractItem (him.peek(), 1);
-		Collection_dontOwnItems (him.peek());
 		return p.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no union created.");
+		Melder_throw (me, U": no union created.");
 	}
 }
 
@@ -1209,4 +1218,58 @@ int Polygon_getLocationOfPoint (Polygon me, double x0, double y0, double eps) {
 	return nup % 2 == 0 ? Polygon_OUTSIDE : Polygon_INSIDE;
 }
 
+static inline double cross (double x1, double y1, double x2, double y2, double x3, double y3) {
+  return (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);
+}
+
+// Code adapted from http://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain#C
+Polygon Polygon_convexHull (Polygon me) {
+	try {
+		if (my numberOfPoints <= 3) {
+			return (Polygon) Data_copy (me);
+		}
+		autoNUMvector<double> x (1, my numberOfPoints), y (1, my numberOfPoints);
+		autoNUMvector<long> hull (1, my numberOfPoints + 2);
+		for (long i = 1; i <= my numberOfPoints; i++) {
+			x[i] = my x[i];
+			y[i] = my y[i];
+		}
+		NUMsort2 <double, double> (my numberOfPoints, x.peek(), y.peek());
+		// lower hull
+		long n = 1;
+		for (long i = 1; i <= my numberOfPoints; i++) {
+			while (n > 2 && cross (x[hull[n - 2]], y[hull[n - 2]], x[hull[n - 1]], y[hull[n - 1]], x[i], y[i]) <= 0) {
+				--n; // counter clockwise turn
+			}
+    		hull[n++] = i;
+		}
+		// upper hull
+		long t = n + 1;
+		for (long i = my numberOfPoints - 1; i >= 1; i--) {
+			while (n >= t && cross (x[hull[n - 2]], y[hull[n - 2]], x[hull[n - 1]], y[hull[n - 1]], x[i], y[i]) <= 0) {
+				--n;
+			}
+    		hull[n++] = i;
+		}
+		autoPolygon thee = Polygon_create (n - 1);
+		for (long i = 1; i <= n - 1; i++) {
+			thy x[i] = x[hull[i]];
+			thy y[i] = y[hull[i]];
+		}
+		return thee.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, U": no convex hull polygon created.");
+	}
+}
+
+double Polygon_getAreaOfConvexHull (Polygon me) {
+	try {
+		autoPolygon thee = Polygon_convexHull (me);
+		return Polygon_area (thee.peek());
+	} catch (MelderError) {
+		Melder_clearError ();
+		return NUMundefined;
+	}
+}
+
 /* End of file Polygon_extensions.cpp */
diff --git a/dwtools/Polygon_extensions.h b/dwtools/Polygon_extensions.h
index 1fd6fd4..cbb9c52 100644
--- a/dwtools/Polygon_extensions.h
+++ b/dwtools/Polygon_extensions.h
@@ -2,7 +2,7 @@
 #define _Polygon_extensions_h_
 /* Polygon_extensions.h
  *
- * Copyright (C) 1993-2012 David Weenink
+ * Copyright (C) 1993-2012, 2014 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -37,7 +37,7 @@
 #define Polygon_VERTEX 5
 
 void Polygon_getExtrema (Polygon me, double *xmin, double *xmax, double *ymin, double *ymax);
-Polygon Polygon_createSimple (wchar_t *xystring);
+Polygon Polygon_createSimple (char32 *xystring);
 Polygon Polygon_createFromRandomVertices (long numberOfVertices, double xmin, double xmax, double ymin, double ymax);
 Polygon Polygon_simplify (Polygon me);
 void Polygon_translate (Polygon me, double xt, double yt);
@@ -55,7 +55,7 @@ void Polygon_Categories_draw (Polygon me, Any categories, Graphics graphics, dou
 /* reverse axis when min > max */
 
 void Polygon_drawMarks (Polygon me, Graphics g, double xmin, double xmax,
-	double ymin, double ymax, double size_mm, const wchar_t *mark);
+	double ymin, double ymax, double size_mm, const char32 *mark);
 
 Polygon Sound_to_Polygon (Sound me, int channel, double tmin, double tmax, double ymin, double ymax, double level);
 /*
@@ -90,4 +90,7 @@ Polygon Polygons_union (Polygon me, Polygon thee);
 
 Collection Polygons_clip (Polygon me, Polygon thee);
 
+Polygon Polygon_convexHull (Polygon me);
+double Polygon_getAreaOfConvexHull (Polygon me);
+
 #endif /* _Polygon_extensions_h_ */
diff --git a/dwtools/Polynomial.cpp b/dwtools/Polynomial.cpp
index d107370..980a7c8 100644
--- a/dwtools/Polynomial.cpp
+++ b/dwtools/Polynomial.cpp
@@ -1,6 +1,6 @@
 /* Polynomial.cpp
  *
- * Copyright (C) 1993-2014 David Weenink
+ * Copyright (C) 1993-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
  djmw 20020813 GPL header
  djmw 20030619 Added SVD_compute before SVD_solve
  djmw 20060510 Polynomial_to_Roots: changed behaviour. All roots found are now saved.
- 	In previous version a NULL pointer was returned. New error messages.
+ 	In previous version a nullptr pointer was returned. New error messages.
  djmw 20061021 printf expects %ld for 'long int'
  djmw 20071012 Added: o_CAN_WRITE_AS_ENCODING.h
  djmw 20071201 Melder_warning<n>
@@ -68,7 +68,7 @@ static void Polynomial_evaluate2 (I, double x, double *f, double *df) {
 		dp = dp * xc + p;
 		p =  p * xc + my coefficients[i];
 	}
-	*f = p; *df = dp;
+	*f = (double) p; *df = (double) dp;
 }
 
 /* Get value and derivative */
@@ -85,8 +85,8 @@ static void Polynomial_evaluate2_z (I, dcomplex *z, dcomplex *p, dcomplex *dp) {
 		pr   =   pr * x -   pi * y + my coefficients[i];
 		pi   =   tr * y +   pi * x;
 	}
-	p -> re =   pr;  p -> im =  pi;
-	dp -> re =  dpr; dp -> im = dpi;
+	p -> re =   (double) pr;  p -> im =  (double) pi;
+	dp -> re =  (double) dpr; dp -> im = (double) dpi;
 }
 
 /*
@@ -125,7 +125,7 @@ static void polynomial_divide (double *u, long m, double *v, long n, double *q,
 
 static void Polynomial_polish_realroot (I, double *x, long maxit) {
 	iam (Polynomial);
-	double xbest = *x, pmin = 1e38;
+	double xbest = *x, pmin = 1e308;
 	if (! NUMfpp) {
 		NUMmachar ();
 	}
@@ -147,13 +147,13 @@ static void Polynomial_polish_realroot (I, double *x, long maxit) {
 		double dx = p / dp; /* Newton -Raphson */
 		*x -= dx;
 	}
-	// Melder_throw ("Maximum number of iterations exceeded.");
+	// Melder_throw (U"Maximum number of iterations exceeded.");
 }
 
 static void Polynomial_polish_complexroot_nr (I, dcomplex *z, long maxit) {
 	iam (Polynomial);
 	dcomplex zbest = *z;
-	double pmin = 1e38;
+	double pmin = 1e308;
 	if (! NUMfpp) {
 		NUMmachar ();
 	}
@@ -175,7 +175,7 @@ static void Polynomial_polish_complexroot_nr (I, dcomplex *z, long maxit) {
 		dcomplex dz = dcomplex_div (p , dp); /* Newton -Raphson */
 		*z = dcomplex_sub (*z, dz);
 	}
-	// Melder_throw ("Maximum number of iterations exceeded.");
+	// Melder_throw (U"Maximum number of iterations exceeded.");
 }
 
 /*
@@ -206,7 +206,7 @@ static void svdcvm (double **v, long mfit, long ma, int *frozen, double *w, doub
 	autoNUMvector<double> wti (1, mfit);
 
 	for (long i = 1; i <= mfit; i++) {
-		if (w[i]) {
+		if (w[i] != 0.0) {
 			wti[i] = 1.0 / (w[i] * w[i]);
 		}
 	}
@@ -297,11 +297,11 @@ FunctionTerms FunctionTerms_create (double xmin, double xmax, long numberOfCoeff
 		FunctionTerms_init (me.peek(), xmin, xmax, numberOfCoefficients);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("FunctionTerms not created.");
+		Melder_throw (U"FunctionTerms not created.");
 	}
 }
 
-void FunctionTerms_initFromString (I, double xmin, double xmax, const wchar_t *s, int allowTrailingZeros) {
+void FunctionTerms_initFromString (I, double xmin, double xmax, const char32 *s, int allowTrailingZeros) {
 	iam (FunctionTerms);
 	long numberOfCoefficients;
 	autoNUMvector<double> numbers (NUMstring_to_numbers (s, &numberOfCoefficients), 1);
@@ -482,8 +482,8 @@ void FunctionTerms_draw (I, Graphics g, double xmin, double xmax, double ymin,
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
@@ -506,10 +506,10 @@ void FunctionTerms_drawBasisFunction (I, Graphics g, long index, double xmin,
 void FunctionTerms_setCoefficient (I, long index, double value) {
 	iam (FunctionTerms);
 	if (index < 1 || index > my numberOfCoefficients) {
-		Melder_throw (L"Idex out of range [1, ", my numberOfCoefficients, L"].");
+		Melder_throw (U"Idex out of range [1, ", my numberOfCoefficients, U"].");
 	}
 	if (index == my numberOfCoefficients && value == 0) {
-		Melder_throw (L"You cannot remove the highest degree term.");
+		Melder_throw (U"You cannot remove the highest degree term.");
 	}
 	my coefficients[index] = value;
 }
@@ -524,7 +524,7 @@ double structPolynomial :: v_evaluate (double x) {
 	for (long i = numberOfCoefficients - 1; i > 0; i--) {
 		p = p * x + coefficients [i];
 	}
-	return p;
+	return (double) p;
 }
 
 void structPolynomial :: v_evaluate_z (dcomplex *z, dcomplex *p) {
@@ -537,7 +537,7 @@ void structPolynomial :: v_evaluate_z (dcomplex *z, dcomplex *p) {
 		pr =  pr * x - pi * y + coefficients[i];
 		pi = prtmp * y + pi * x;
 	}
-	p -> re = pr; p -> im = pi;
+	p -> re = (double) pr; p -> im = (double) pi;
 }
 
 void structPolynomial :: v_evaluateTerms (double x, double terms[]) {
@@ -588,17 +588,17 @@ Polynomial Polynomial_create (double lxmin, double lxmax, long degree) {
 		FunctionTerms_init (me.peek(), lxmin, lxmax, degree + 1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Polynomial not created.");
+		Melder_throw (U"Polynomial not created.");
 	}
 }
 
-Polynomial Polynomial_createFromString (double lxmin, double lxmax, const wchar_t *s) {
+Polynomial Polynomial_createFromString (double lxmin, double lxmax, const char32 *s) {
 	try {
 		autoPolynomial me = Thing_new (Polynomial);
 		FunctionTerms_initFromString (me.peek(), lxmin, lxmax, s, 0);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Polynomial not created from string.");
+		Melder_throw (U"Polynomial not created from string.");
 	}
 }
 
@@ -666,7 +666,7 @@ Polynomial Polynomial_scaleX (Polynomial me, double xmin, double xmax) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("");
+		Melder_throw (U"");
 	}
 }
 
@@ -706,7 +706,7 @@ Polynomial Polynomial_getDerivative (Polynomial me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no derivative created.");
+		Melder_throw (me, U": no derivative created.");
 	}
 }
 
@@ -718,7 +718,7 @@ Polynomial Polynomial_getPrimitive (Polynomial me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no primitive created.");
+		Melder_throw (me, U": no primitive created.");
 	}
 }
 
@@ -736,7 +736,7 @@ Polynomial Polynomials_multiply (Polynomial me, Polynomial thee) {
 		long n1 = my numberOfCoefficients, n2 = thy numberOfCoefficients;
 
 		if (my xmax <= thy xmin || my xmin >= thy xmax) {
-			Melder_throw ("Domains do not overlap.");
+			Melder_throw (U"Domains do not overlap.");
 		}
 		double xmin = my xmin > thy xmin ? my xmin : thy xmin;
 		double xmax = my xmax < thy xmax ? my xmax : thy xmax;
@@ -749,7 +749,7 @@ Polynomial Polynomials_multiply (Polynomial me, Polynomial thee) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Polynomials not multiplied.");
+		Melder_throw (U"Polynomials not multiplied.");
 	}
 }
 
@@ -859,17 +859,17 @@ LegendreSeries LegendreSeries_create (double xmin, double xmax, long numberOfPol
 		FunctionTerms_init (me.peek(), xmin, xmax, numberOfPolynomials);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("LegendreSeries not created.");
+		Melder_throw (U"LegendreSeries not created.");
 	}
 }
 
-LegendreSeries LegendreSeries_createFromString (double xmin, double xmax, const wchar_t *s) {
+LegendreSeries LegendreSeries_createFromString (double xmin, double xmax, const char32 *s) {
 	try {
 		autoLegendreSeries me = Thing_new (LegendreSeries);
 		FunctionTerms_initFromString (me.peek(), xmin, xmax, s, 0);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("LegendreSeries not created from string.");
+		Melder_throw (U"LegendreSeries not created from string.");
 	}
 }
 
@@ -887,7 +887,7 @@ LegendreSeries LegendreSeries_getDerivative (LegendreSeries me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no derivative created.");
+		Melder_throw (me, U": no derivative created.");
 	}
 }
 
@@ -930,7 +930,7 @@ Polynomial LegendreSeries_to_Polynomial (LegendreSeries me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Polynomial.");
+		Melder_throw (me, U": not converted to Polynomial.");
 	}
 }
 
@@ -944,7 +944,7 @@ Roots Roots_create (long numberOfRoots) {
 		ComplexVector_init (me.peek(), 1, numberOfRoots);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Roots not created.");
+		Melder_throw (U"Roots not created.");
 	}
 }
 
@@ -980,7 +980,7 @@ static void NUMdcvector_extrema_im (dcomplex v[], long lo, long hi, double *min,
 }
 
 void Roots_draw (Roots me, Graphics g, double rmin, double rmax, double imin,
-                 double imax, const wchar_t *symbol, int fontSize, int garnish) {
+                 double imax, const char32 *symbol, int fontSize, int garnish) {
 	int oldFontSize = Graphics_inqFontSize (g);
 	double eps = 1e-6;
 
@@ -1019,15 +1019,15 @@ void Roots_draw (Roots me, Graphics g, double rmin, double rmax, double imin,
 	if (garnish) {
 		Graphics_drawInnerBox (g);
 		if (rmin * rmax < 0) {
-			Graphics_markLeft (g, 0, 1, 1, 1, L"0");
+			Graphics_markLeft (g, 0.0, true, true, true, U"0");
 		}
 		if (imin * imax < 0) {
-			Graphics_markBottom (g, 0, 1, 1, 1, L"0");
+			Graphics_markBottom (g, 0.0, true, true, true, U"0");
 		}
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"Imaginary part");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_textBottom (g, 1, L"Real part");
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Imaginary part");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textBottom (g, true, U"Real part");
 	}
 }
 
@@ -1036,7 +1036,7 @@ Roots Polynomial_to_Roots (Polynomial me) {
 		long np1 = my numberOfCoefficients, n = np1 - 1, n2 = n * n;
 
 		if (n < 1) {
-			Melder_throw ("Cannot find roots of a constant function.");
+			Melder_throw (U"Cannot find roots of a constant function.");
 		}
 
 		// Allocate storage for Hessenberg matrix (n * n) plus real and imaginary
@@ -1064,10 +1064,10 @@ Roots Polynomial_to_Roots (Polynomial me) {
 		NUMlapack_dhseqr (&job, &compz, &n, &ilo, &ihi, &hes[1], &ldh, &wr[1], &wi[1], z, &ldz, wt, &lwork, &info);
 		if (info != 0) {
 			if (info < 0) {
-				Melder_throw (L"Programming error. Argument ", info, " in NUMlapack_dhseqr has illegal value.");
+				Melder_throw (U"Programming error. Argument ", info, U" in NUMlapack_dhseqr has illegal value.");
 			}
 		}
-		lwork = wt[0];
+		lwork = (long) floor (wt[0]);
 		autoNUMvector<double> work (1, lwork);
 
 		// Find eigenvalues.
@@ -1080,12 +1080,12 @@ Roots Polynomial_to_Roots (Polynomial me) {
 			// WR and WI contain those eigenvalues which have been successfully computed
 			nrootsfound -= info;
 			if (nrootsfound < 1) {
-				Melder_throw ("No roots found.");
+				Melder_throw (U"No roots found.");
 			}
-			Melder_warning (L"Calculated only ", Melder_integer (nrootsfound), L" roots.");
+			Melder_warning (U"Calculated only ", nrootsfound, U" roots.");
 			ioffset = info;
 		} else if (info < 0) {
-			Melder_throw (L"Programming error. Argument ", info, L" in NUMlapack_dhseqr has illegal value.");
+			Melder_throw (U"Programming error. Argument ", info, U" in NUMlapack_dhseqr has illegal value.");
 		}
 
 		autoRoots thee = Roots_create (nrootsfound);
@@ -1096,7 +1096,7 @@ Roots Polynomial_to_Roots (Polynomial me) {
 		Roots_and_Polynomial_polish (thee.peek(), me);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no roots can be calculated.");
+		Melder_throw (me, U": no roots can be calculated.");
 	}
 }
 
@@ -1129,13 +1129,13 @@ Polynomial Roots_to_Polynomial (Roots me) {
 		(void) me;
 		throw MelderError();
 	} catch (MelderError) {
-		Melder_throw ("Not implemented yet");
+		Melder_throw (U"Not implemented yet");
 	}
 }
 
 void Roots_setRoot (Roots me, long index, double re, double im) {
 	if (index < my min || index > my max) {
-		Melder_throw ("Index must be in interval [1, ", my max, "].");
+		Melder_throw (U"Index must be in interval [1, ", my max, U"].");
 	}
 	my v[index].re = re;
 	my v[index].im = im;
@@ -1153,7 +1153,7 @@ dcomplex Roots_evaluate_z (Roots me, dcomplex z) {
 Spectrum Roots_to_Spectrum (Roots me, double nyquistFrequency, long numberOfFrequencies, double radius) {
 	try {
 		if (numberOfFrequencies < 2) {
-			Melder_throw ("NumberOfFrequencies must be greater or equal 2.");
+			Melder_throw (U"NumberOfFrequencies must be greater or equal 2.");
 		}
 		autoSpectrum thee = Spectrum_create (nyquistFrequency, numberOfFrequencies);
 
@@ -1167,7 +1167,7 @@ Spectrum Roots_to_Spectrum (Roots me, double nyquistFrequency, long numberOfFreq
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Spectrum calculated.");
+		Melder_throw (me, U": no Spectrum calculated.");
 	}
 }
 
@@ -1177,7 +1177,7 @@ long Roots_getNumberOfRoots (Roots me) {
 
 dcomplex Roots_getRoot (Roots me, long index) {
 	if (index < 1 || index > my max) {
-		Melder_throw ("Root index out of range.");
+		Melder_throw (U"Root index out of range.");
 	}
 	return my v [index];
 }
@@ -1186,7 +1186,7 @@ dcomplex Roots_getRoot (Roots me, long index) {
 Spectrum Polynomial_to_Spectrum (Polynomial me, double nyquistFrequency, long numberOfFrequencies, double radius) {
 	try {
 		if (numberOfFrequencies < 2) {
-			Melder_throw (L"NumberOfFrequencies must be greater or equal 2.");
+			Melder_throw (U"NumberOfFrequencies must be greater or equal 2.");
 		}
 		autoSpectrum thee = Spectrum_create (nyquistFrequency, numberOfFrequencies);
 
@@ -1198,7 +1198,7 @@ Spectrum Polynomial_to_Spectrum (Polynomial me, double nyquistFrequency, long nu
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Spectrum calculated.");
+		Melder_throw (me, U": no Spectrum calculated.");
 	}
 }
 
@@ -1262,7 +1262,7 @@ void structChebyshevSeries :: v_getExtrema (double x1, double x2,
 		autoPolynomial p = ChebyshevSeries_to_Polynomial (this);
 		FunctionTerms_getExtrema (p.peek(), x1, x2, lxmin, ymin, lxmax, ymax);
 	} catch (MelderError) {
-		Melder_throw (this, "Extrema cannot be calculated");   // David, dat is fout: er moet een Melder_throw of een Melder_clearError volgen: Klopt
+		Melder_throw (this, U"Extrema cannot be calculated");
 	}
 }
 
@@ -1272,17 +1272,17 @@ ChebyshevSeries ChebyshevSeries_create (double lxmin, double lxmax, long numberO
 		FunctionTerms_init (me.peek(), lxmin, lxmax, numberOfPolynomials);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ChebyshevSeries not created.");
+		Melder_throw (U"ChebyshevSeries not created.");
 	}
 }
 
-ChebyshevSeries ChebyshevSeries_createFromString (double lxmin, double lxmax, const wchar_t *s) {
+ChebyshevSeries ChebyshevSeries_createFromString (double lxmin, double lxmax, const char32 *s) {
 	try {
 		autoChebyshevSeries me = Thing_new (ChebyshevSeries);
 		FunctionTerms_initFromString (me.peek(), lxmin, lxmax, s, 0);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ChebyshevSeries not created from string.");
+		Melder_throw (U"ChebyshevSeries not created from string.");
 	};
 }
 
@@ -1327,7 +1327,7 @@ Polynomial ChebyshevSeries_to_Polynomial (ChebyshevSeries me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, "; not converted to Polynomial.");
+		Melder_throw (me, U"; not converted to Polynomial.");
 	};
 }
 
@@ -1340,7 +1340,7 @@ void FunctionTerms_and_RealTier_fit (I, thou, int *freeze, double tol, int ic, C
 		long numberOfFreeParameters = numberOfParameters;
 
 		if (numberOfData < 2) {
-			Melder_throw ("Not enough data points.");
+			Melder_throw (U"Not enough data points.");
 		}
 
 		autoFunctionTerms frozen = Data_copy (me);
@@ -1363,14 +1363,14 @@ void FunctionTerms_and_RealTier_fit (I, thou, int *freeze, double tol, int ic, C
 		}
 
 		if (numberOfFreeParameters == 0) {
-			Melder_throw ("No free parameters left.");
+			Melder_throw (U"No free parameters left.");
 		}
 
 		autoSVD svd = SVD_create (numberOfData, numberOfFreeParameters);
 
 		double sigma = RealTier_getStandardDeviation_points (thee, my xmin, my xmax);
 		if (sigma == NUMundefined) {
-			Melder_throw ("Not enough data points in fit interval.");
+			Melder_throw (U"Not enough data points in fit interval.");
 		}
 
 		for (long i = 1; i <= numberOfData; i++) {
@@ -1417,7 +1417,7 @@ void FunctionTerms_and_RealTier_fit (I, thou, int *freeze, double tol, int ic, C
 		}
 		*c = ac.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": no fit.");
+		Melder_throw (me, U" & ", thee, U": no fit.");
 	}
 }
 
@@ -1429,29 +1429,29 @@ Polynomial RealTier_to_Polynomial (I, long degree, double tol, int ic, Covarianc
 		FunctionTerms_and_RealTier_fit (thee.peek(), me, 0, tol, ic, cvm);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Polynomial fitted.");
+		Melder_throw (me, U": no Polynomial fitted.");
 	}
 }
 
 LegendreSeries RealTier_to_LegendreSeries (I, long degree, double tol, int ic, Covariance *cvm) {
 	iam (RealTier);
 	try {
-		autoLegendreSeries thee = LegendreSeries_create (degree, my xmin, my xmax);
+		autoLegendreSeries thee = LegendreSeries_create (my xmin, my xmax, degree);
 		FunctionTerms_and_RealTier_fit (thee.peek(), me, 0, tol, ic, cvm);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no LegendreSeries fitted.");
+		Melder_throw (me, U": no LegendreSeries fitted.");
 	}
 }
 
 ChebyshevSeries RealTier_to_ChebyshevSeries (I, long degree, double tol, int ic, Covariance *cvm) {
 	iam (RealTier);
 	try {
-		autoChebyshevSeries thee = ChebyshevSeries_create (degree, my xmin, my xmax);
+		autoChebyshevSeries thee = ChebyshevSeries_create (my xmin, my xmax, degree);
 		FunctionTerms_and_RealTier_fit (thee.peek(), me, 0, tol, ic, cvm);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ":no ChebyshevSeries fitted.");
+		Melder_throw (me, U":no ChebyshevSeries fitted.");
 	};
 }
 
@@ -1581,18 +1581,18 @@ long structSpline :: v_getOrder () {
 }
 
 /* Precondition: FunctionTerms part inited + degree */
-static void Spline_initKnotsFromString (I, long degree, const wchar_t *interiorKnots) {
+static void Spline_initKnotsFromString (I, long degree, const char32 *interiorKnots) {
 	iam (Spline);
 
 	if (degree > Spline_MAXIMUM_DEGREE) {
-		Melder_throw ("Degree must be <= 20.");
+		Melder_throw (U"Degree must be <= 20.");
 	}
 	long numberOfInteriorKnots;
 	autoNUMvector<double> numbers (NUMstring_to_numbers (interiorKnots, &numberOfInteriorKnots), 1);
 	if (numberOfInteriorKnots > 0) {
 		NUMsort_d (numberOfInteriorKnots, numbers.peek());
 		if (numbers[1] <= my xmin || numbers[numberOfInteriorKnots] > my xmax) {
-			Melder_throw ("Knots must be inside domain.");
+			Melder_throw (U"Knots must be inside domain.");
 		}
 	}
 
@@ -1601,7 +1601,7 @@ static void Spline_initKnotsFromString (I, long degree, const wchar_t *interiorK
 	long n = numberOfInteriorKnots + order;
 
 	if (my numberOfCoefficients != n) {
-		Melder_throw ("NumberOfCoefficients must equal ", n, ".");
+		Melder_throw (U"NumberOfCoefficients must equal ", n, U".");
 	}
 
 	my numberOfKnots = numberOfInteriorKnots + 2;
@@ -1618,7 +1618,7 @@ void Spline_init (I, double xmin, double xmax, long degree, long numberOfCoeffic
 	iam (Spline);
 
 	if (degree > Spline_MAXIMUM_DEGREE) {
-		Melder_throw ("Spline_init: degree must be <= 20.");
+		Melder_throw (U"Spline_init: degree must be <= 20.");
 	}
 	FunctionTerms_init (me, xmin, xmax, numberOfCoefficients);
 	my knots = NUMvector<double> (1, numberOfKnots);
@@ -1631,7 +1631,6 @@ void Spline_init (I, double xmin, double xmax, long degree, long numberOfCoeffic
 void Spline_drawKnots (I, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish) {
 	iam (Spline);
 	long order = Spline_getOrder (me);
-	wchar_t ts[20] = L"";
 
 	if (xmax <= xmin) {
 		xmin = my xmin; xmax = my xmax;
@@ -1649,37 +1648,29 @@ void Spline_drawKnots (I, Graphics g, double xmin, double xmax, double ymin, dou
 	Graphics_setWindow (g, xmin, xmax, ymin, ymax);
 
 	if (my knots[1] >= xmin && my knots[1] <= xmax) {
-		if (garnish) {
-			if (order == 1) {
-				swprintf (ts, 20, L"t__1_");
-			} else if (order == 2) {
-				swprintf (ts, 20, L"{t__1_, t__2_}");
-			} else {
-				swprintf (ts, 20, L"{t__1_..t__%ld_}", order);
-			}
-		}
-		Graphics_markTop (g, my knots[1], 0, 1, 1, ts);
+		Graphics_markTop (g, my knots[1], false, true, true,
+				! garnish ? U"" :
+				order == 1 ? U"t__1_" :
+				order == 2 ? U"{t__1_, t__2_}" :
+				Melder_cat (U"{t__1_..t__", order, U"_}")
+			);
 	}
 	for (long i = 2; i <= my numberOfKnots - 1; i++) {
 		if (my knots[i] >= xmin && my knots[i] <= xmax) {
-			if (garnish) {
-				swprintf (ts, 20, L"t__%ld_", i + order - 1);
-			}
-			Graphics_markTop (g, my knots[i], 0, 1, 1, ts);
+			Graphics_markTop (g, my knots[i], false, true, true,
+					! garnish ? U"" :
+					Melder_cat (U"t__", i + order - 1, U"_")
+				);
 		}
 	}
 	if (my knots[my numberOfKnots] >= xmin && my knots[my numberOfKnots] <= xmax) {
-		if (garnish) {
-			long numberOfKnots = my numberOfKnots + 2 * (order - 1);
-			if (order == 1) {
-				swprintf (ts, 20, L"t__%ld_", numberOfKnots);
-			} else if (order == 2) {
-				swprintf (ts, 20, L"{t__%d_, t__%ld_}", numberOfKnots - 1, numberOfKnots);
-			} else {
-				swprintf (ts, 20, L"{t__%d_..t__%ld_}", numberOfKnots - order + 1, numberOfKnots);
-			}
-		}
-		Graphics_markTop (g, my knots[my numberOfKnots], 0, 1, 1, ts);
+		long numberOfKnots = ! garnish ? 0 : my numberOfKnots + 2 * (order - 1);
+		Graphics_markTop (g, my knots[my numberOfKnots], false, true, true,
+				! garnish ? U"" :
+				order == 1 ? Melder_cat (U"t__", numberOfKnots, U"_") :
+				order == 2 ? Melder_cat (U"{t__", numberOfKnots - 1, U"_, t__", numberOfKnots, U"_}") :
+				Melder_cat (U"{t__", numberOfKnots - order + 1, U"_..t__", numberOfKnots, U"_}")
+			);
 	}
 }
 
@@ -1709,7 +1700,7 @@ Spline Spline_scaleX (I, double xmin, double xmax) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Scaled Spline not created.");
+		Melder_throw (U"Scaled Spline not created.");
 	}
 }
 
@@ -1748,21 +1739,21 @@ MSpline MSpline_create (double xmin, double xmax, long degree, long numberOfInte
 		Spline_init (me.peek(), xmin, xmax, degree, numberOfCoefficients, numberOfKnots);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("MSpline not created.");
+		Melder_throw (U"MSpline not created.");
 	}
 }
 
-MSpline MSpline_createFromStrings (double xmin, double xmax, long degree, const wchar_t *coef, const wchar_t *interiorKnots) {
+MSpline MSpline_createFromStrings (double xmin, double xmax, long degree, const char32 *coef, const char32 *interiorKnots) {
 	try {
 		if (degree > Spline_MAXIMUM_DEGREE) {
-			Melder_throw ("Degree must be <= 20.");
+			Melder_throw (U"Degree should be <= 20.");
 		}
 		autoMSpline me = Thing_new (MSpline);
 		FunctionTerms_initFromString (me.peek(), xmin, xmax, coef, 1);
 		Spline_initKnotsFromString (me.peek(), degree, interiorKnots);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("MSpline not created from strings.");
+		Melder_throw (U"MSpline not created from strings.");
 	}
 }
 
@@ -1801,21 +1792,21 @@ ISpline ISpline_create (double xmin, double xmax, long degree, long numberOfInte
 		Spline_init (me.peek(), xmin, xmax, degree, numberOfCoefficients, numberOfKnots);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ISpline not created.");
+		Melder_throw (U"ISpline not created.");
 	}
 }
 
-ISpline ISpline_createFromStrings (double xmin, double xmax, long degree, const wchar_t *coef, const wchar_t *interiorKnots) {
+ISpline ISpline_createFromStrings (double xmin, double xmax, long degree, const char32 *coef, const char32 *interiorKnots) {
 	try {
 		if (degree > Spline_MAXIMUM_DEGREE) {
-			Melder_throw ("Degree must be <= 20.");
+			Melder_throw (U"Degree should be <= 20.");
 		}
 		autoISpline me = Thing_new (ISpline);
 		FunctionTerms_initFromString (me.peek(), xmin, xmax, coef, 1);
 		Spline_initKnotsFromString (me.peek(), degree, interiorKnots);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ISpline not created from strings.");
+		Melder_throw (U"ISpline not created from strings.");
 	};
 }
 
@@ -1854,10 +1845,9 @@ RationalFunction RationalFunction_createFromString (I, double xmin, double xmax,
 // divide out common roots
 RationalFunction RationalFunction_simplify (RationalFunction me)
 {
-	Roots num = NULL, denum = NULL; RationalFunction thee = NULL;
+	Roots num = nullptr, denum = nullptr; RationalFunction thee = nullptr;
 	if (! (num = Polynomial_to_Roots (my num)) ||
 		! (denum = Polynomial_to_Roots (my denum))) goto end;
-
 }
 
 */
diff --git a/dwtools/Polynomial.h b/dwtools/Polynomial.h
index abe6036..161ddc3 100644
--- a/dwtools/Polynomial.h
+++ b/dwtools/Polynomial.h
@@ -43,7 +43,7 @@ oo_CLASS_CREATE (FunctionTerms, Function);
 
 void FunctionTerms_init (I, double xmin, double xmax, long numberOfCoefficients);
 
-void FunctionTerms_initFromString (I, double xmin, double xmax, const wchar_t *s, int allowTrailingZeros);
+void FunctionTerms_initFromString (I, double xmin, double xmax, const char32 *s, int allowTrailingZeros);
 
 FunctionTerms FunctionTerms_create (double xmin, double xmax, long numberOfCoefficients);
 
@@ -98,7 +98,7 @@ Thing_define (Polynomial, FunctionTerms) {
 
 Polynomial Polynomial_create (double xmin, double xmax, long degree);
 
-Polynomial Polynomial_createFromString (double xmin, double xmax, const wchar_t *s);
+Polynomial Polynomial_createFromString (double xmin, double xmax, const char32 *s);
 
 void Polynomial_scaleCoefficients_monic (Polynomial me);
 /* Make coefficent of leading term 1.0 */
@@ -136,7 +136,7 @@ Thing_define (LegendreSeries, FunctionTerms) {
 
 LegendreSeries LegendreSeries_create (double xmin, double xmax, long numberOfPolynomials);
 
-LegendreSeries LegendreSeries_createFromString (double xmin, double xmax, const wchar_t *s);
+LegendreSeries LegendreSeries_createFromString (double xmin, double xmax, const char32 *s);
 
 LegendreSeries LegendreSeries_getDerivative (LegendreSeries me);
 
@@ -159,7 +159,7 @@ Roots Polynomial_to_Roots_ev (Polynomial me);
 long Roots_getNumberOfRoots (Roots me);
 
 void Roots_draw (Roots me, Graphics g, double rmin, double rmax, double imin, double imax,
-	const wchar_t *symbol, int fontSize, int garnish);
+	const char32 *symbol, int fontSize, int garnish);
 
 dcomplex Roots_getRoot (Roots me, long index);
 void Roots_setRoot (Roots me, long index, double re, double im);
@@ -202,7 +202,7 @@ Thing_define (ChebyshevSeries, FunctionTerms) {
 
 ChebyshevSeries ChebyshevSeries_create (double xmin, double xmax, long numberOfPolynomials);
 
-ChebyshevSeries ChebyshevSeries_createFromString (double xmin, double xmax, const wchar_t *s);
+ChebyshevSeries ChebyshevSeries_createFromString (double xmin, double xmax, const char32 *s);
 
 Polynomial ChebyshevSeries_to_Polynomial (ChebyshevSeries me);
 
@@ -226,7 +226,7 @@ Thing_define (MSpline, Spline) {
 
 MSpline MSpline_create (double xmin, double xmax, long degree, long numberOfInteriorKnots);
 
-MSpline MSpline_createFromStrings (double xmin, double xmax, long degree, const wchar_t *coef, const wchar_t *interiorKnots);
+MSpline MSpline_createFromStrings (double xmin, double xmax, long degree, const char32 *coef, const char32 *interiorKnots);
 
 Thing_define (ISpline, Spline) {
 	// overridden methods:
@@ -237,7 +237,7 @@ Thing_define (ISpline, Spline) {
 };
 
 ISpline ISpline_create (double xmin, double xmax, long degree, long numberOfInteriorKnots);
-ISpline ISpline_createFromStrings (double xmin, double xmax, long degree, const wchar_t *coef, const wchar_t *interiorKnots);
+ISpline ISpline_createFromStrings (double xmin, double xmax, long degree, const char32 *coef, const char32 *interiorKnots);
 
 /****************** fit **********************************************/
 
diff --git a/dwtools/Procrustes.cpp b/dwtools/Procrustes.cpp
index 65cc73d..53ef214 100644
--- a/dwtools/Procrustes.cpp
+++ b/dwtools/Procrustes.cpp
@@ -109,7 +109,7 @@ Procrustes Procrustes_create (long n) {
 		Procrustes_setDefaults (me.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Procrustes not created.");
+		Melder_throw (U"Procrustes not created.");
 	}
 }
 
diff --git a/dwtools/Proximity.cpp b/dwtools/Proximity.cpp
index 9acdff8..ff429fb 100644
--- a/dwtools/Proximity.cpp
+++ b/dwtools/Proximity.cpp
@@ -1,6 +1,6 @@
-/* Proximity.c
+/* Proximity.cpp
  *
- * Copyright (C) 1993-2004 David Weenink
+ * Copyright (C) 1993-2004, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,11 +27,10 @@
 
 Thing_implement (Proximity, TableOfReal, 0);
 
-void Proximity_init (I, long numberOfPoints) {
-	iam (Proximity);
+void Proximity_init (Proximity me, long numberOfPoints) {
 	TableOfReal_init (me, numberOfPoints, numberOfPoints);
-	TableOfReal_setSequentialRowLabels (me, 0, 0, NULL, 1, 1);
-	TableOfReal_setSequentialColumnLabels (me, 0, 0, NULL, 1, 1);
+	TableOfReal_setSequentialRowLabels (me, 0, 0, nullptr, 1, 1);
+	TableOfReal_setSequentialColumnLabels (me, 0, 0, nullptr, 1, 1);
 }
 
-/* End of file Proximity.c */
+/* End of file Proximity.cpp */
diff --git a/dwtools/Proximity.h b/dwtools/Proximity.h
index 77e4bcb..a6c5477 100644
--- a/dwtools/Proximity.h
+++ b/dwtools/Proximity.h
@@ -29,6 +29,6 @@
 Thing_define (Proximity, TableOfReal) {
 };
 
-void Proximity_init (I, long numberOfPoints);
+void Proximity_init (Proximity me, long numberOfPoints);
 
 #endif /* _Proximity_h_ */
diff --git a/dwtools/Resonator.cpp b/dwtools/Resonator.cpp
index 9af5e4f..390303f 100644
--- a/dwtools/Resonator.cpp
+++ b/dwtools/Resonator.cpp
@@ -25,7 +25,7 @@
 
 #include "Resonator.h"
 
-Thing_implement (Filter, Data, 0);
+Thing_implement (Filter, Daata, 0);
 
 #define SETBC(f,bw) \
 	double r = exp (-NUMpi * dT * bw); \
@@ -63,7 +63,7 @@ Resonator Resonator_create (double dT, int normalisation) {
 		my normalisation = normalisation;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Resonator not created.");
+		Melder_throw (U"Resonator not created.");
 	}
 }
 
@@ -117,7 +117,7 @@ ConstantGainResonator ConstantGainResonator_create (double dT) {
 		my dT = dT;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ConstantGainResonator not created.");
+		Melder_throw (U"ConstantGainResonator not created.");
 	}
 }
 
@@ -128,22 +128,19 @@ AntiResonator AntiResonator_create (double dT) {
 		my dT = dT;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("AntiResonator not created.");
+		Melder_throw (U"AntiResonator not created.");
 	}
 }
 
-void Filter_setFB (I, double f, double b) {
-	iam (Filter);
+void Filter_setFB (Filter me, double f, double b) {
 	my v_setFB (f, b);
 }
 
-double Filter_getOutput (I, double input) {
-	iam (Filter);
+double Filter_getOutput (Filter me, double input) {
 	return my v_getOutput (input);
 }
 
-void Filter_resetMemory (I) {
-	iam (Filter);
+void Filter_resetMemory (Filter me) {
 	my v_resetMemory ();
 }
 
diff --git a/dwtools/Resonator.h b/dwtools/Resonator.h
index ed1d5bf..6184191 100644
--- a/dwtools/Resonator.h
+++ b/dwtools/Resonator.h
@@ -26,41 +26,40 @@
 	
 #include "Sound.h"
 
-Thing_define (Filter, Data) {
-	// new data:
-	public:
-		double dT;
-		double a, b, c;
-		double p1, p2;
-	// new methods:
-		virtual double v_getOutput (double input);
-		virtual void v_setFB (double f, double b);
-		virtual void v_resetMemory ();
+Thing_define (Filter, Daata) {
+	double dT;
+	double a, b, c;
+	double p1, p2;
+
+	virtual double v_getOutput (double input);
+	virtual void v_setFB (double f, double b);
+	virtual void v_resetMemory ();
 };
 
 Thing_define (Resonator, Filter) {
-	// new data:
-	public:
-		int normalisation;
-	// overridden methods:
-		virtual void v_setFB (double f, double b);
+	int normalisation;
+
+	void v_setFB (double f, double b)
+		override;
 };
 
 Thing_define (AntiResonator, Resonator) {
-	// overridden methods:
-		virtual double v_getOutput (double input);
-		virtual void v_setFB (double f, double b);
+	double v_getOutput (double input)
+		override;
+	void v_setFB (double f, double b)
+		override;
 };
 
 Thing_define (ConstantGainResonator, Filter) {
-	// new data:
-	public:
-		double d;
-		double p3, p4;
-	// overridden methods:
-		virtual double v_getOutput (double input);
-		virtual void v_setFB (double f, double b);
-		virtual void v_resetMemory ();
+	double d;
+	double p3, p4;
+
+	double v_getOutput (double input)
+		override;
+	void v_setFB (double f, double b)
+		override;
+	void v_resetMemory ()
+		override;
 };
 
 #define Resonator_NORMALISATION_H0 0
@@ -78,11 +77,11 @@ AntiResonator AntiResonator_create (double dT);
 	normalisation == 0: H(0) = 1 -> a = 1 -b - c
 	normalisation == 1: H(Fmax) = 1 -> a = (1 + c)sin(2*pi*F*T)
 */
-void Filter_setFB (I, double f, double b);
+void Filter_setFB (Filter me, double f, double b);
 
-double Filter_getOutput (I, double input);
+double Filter_getOutput (Filter me, double input);
 
-void Filter_resetMemory (I);
+void Filter_resetMemory (Filter me);
 
 #endif /* _Resonator_h_ */
 
diff --git a/dwtools/SPINET.cpp b/dwtools/SPINET.cpp
index 48584d2..1455d65 100644
--- a/dwtools/SPINET.cpp
+++ b/dwtools/SPINET.cpp
@@ -51,28 +51,26 @@
 Thing_implement (SPINET, Sampled2, 0);
 
 void structSPINET :: v_info () {
-	structData :: v_info ();
+	structDaata :: v_info ();
 	double miny, maxy, mins, maxs;
 	if (! Sampled2_getWindowExtrema_d (this, y, 1, nx, 1, ny, & miny, & maxy) ||
 	        ! Sampled2_getWindowExtrema_d (this, s, 1, nx, 1, ny, & mins, & maxs)) {
 		return;
 	}
-	MelderInfo_writeLine (L"Minimum power: ", Melder_double (miny));
-	MelderInfo_writeLine (L"Maximum power: ", Melder_double (maxy));
-	MelderInfo_writeLine (L"Minimum power rectified: ", Melder_double (mins));
-	MelderInfo_writeLine (L"Maximum powerrectified: ", Melder_double (maxs));
+	MelderInfo_writeLine (U"Minimum power: ", miny);
+	MelderInfo_writeLine (U"Maximum power: ", maxy);
+	MelderInfo_writeLine (U"Minimum power rectified: ", mins);
+	MelderInfo_writeLine (U"Maximum powerrectified: ", maxs);
 }
 
-SPINET SPINET_create (double tmin, double tmax, long nt, double dt, double t1,
-                      double minimumFrequency, double maximumFrequency, long nFilters,
-                      double excitationErbProportion, double inhibitionErbProportion) {
+SPINET SPINET_create (double tmin, double tmax, long nt, double dt, double t1, double minimumFrequency, double maximumFrequency, long nFilters, double excitationErbProportion, double inhibitionErbProportion) {
 	try {
 		autoSPINET me = Thing_new (SPINET);
 		double minErb = NUMhertzToErb (minimumFrequency);
 		double maxErb = NUMhertzToErb (maximumFrequency);
 		double dErb = (maxErb - minErb) / nFilters;
 		Sampled2_init (me.peek(), tmin, tmax, nt, dt, t1,
-		               minErb - dErb / 2, maxErb + dErb / 2, nFilters, dErb, minErb);
+		               minErb - dErb / 2.0, maxErb + dErb / 2.0, nFilters, dErb, minErb);
 		my y = NUMmatrix<double> (1, nFilters, 1, nt);
 		my s = NUMmatrix<double> (1, nFilters, 1, nt);
 		my gamma = 4;
@@ -80,16 +78,13 @@ SPINET SPINET_create (double tmin, double tmax, long nt, double dt, double t1,
 		my inhibitionErbProportion = inhibitionErbProportion;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SPINET not created.");
+		Melder_throw (U"SPINET not created.");
 	}
 }
 
-void SPINET_spectralRepresentation (SPINET me, Graphics g, double fromTime, double toTime,
-                                    double fromErb, double toErb, double minimum, double maximum, int enhanced,
-                                    int garnish) {
+void SPINET_spectralRepresentation (SPINET me, Graphics g, double fromTime, double toTime, double fromErb, double toErb, double minimum, double maximum, int enhanced, int garnish) {
 	double **z = enhanced ? my s : my y;
-	autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1,
-	                                 my ymin, my ymax, my ny, my dy, my y1);
+	autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1);
 	for (long j = 1; j <= my ny; j++) {
 		for (long i = 1; i <= my nx; i++) {
 			thy z[j][i] = z[j][i];
@@ -98,18 +93,16 @@ void SPINET_spectralRepresentation (SPINET me, Graphics g, double fromTime, doub
 	Matrix_paintCells (thee.peek(), g, fromTime, toTime, fromErb, toErb, minimum, maximum);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"Frequency (ERB)");
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textTop (g, 0, enhanced ? L"Cooperative interaction output" :
-		                  L"Gammatone filterbank output");
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Frequency (ERB)");
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textTop (g, false, enhanced ? U"Cooperative interaction output" : U"Gammatone filterbank output");
 	}
 }
 
-void SPINET_drawSpectrum (SPINET me, Graphics g, double time, double fromErb, double toErb,
-                          double minimum, double maximum, int enhanced, int garnish) {
-	long ifmin, ifmax, icol = Sampled2_xToColumn (me, time);
+void SPINET_drawSpectrum (SPINET me, Graphics g, double time, double fromErb, double toErb, double minimum, double maximum, int enhanced, int garnish) {
+	long ifmin, ifmax, icol = Sampled2_xToLowColumn (me, time);   // ppgb: don't use Sampled2_xToColumn for integer rounding
 	double **z = enhanced ? my s : my y;
 	if (icol < 1 || icol > my nx) {
 		return;
@@ -144,10 +137,10 @@ void SPINET_drawSpectrum (SPINET me, Graphics g, double time, double fromErb, do
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Frequency (ERB)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"strength");
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_textBottom (g, true, U"Frequency (ERB)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"strength");
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
diff --git a/dwtools/SPINET_def.h b/dwtools/SPINET_def.h
index 8f7118d..40706e7 100644
--- a/dwtools/SPINET_def.h
+++ b/dwtools/SPINET_def.h
@@ -12,8 +12,8 @@ oo_DEFINE_CLASS (SPINET, Sampled2)
 	oo_DOUBLE_MATRIX (s, ny, nx)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (SPINET)
diff --git a/dwtools/SPINET_to_Pitch.cpp b/dwtools/SPINET_to_Pitch.cpp
index dab6a1a..3c462af 100644
--- a/dwtools/SPINET_to_Pitch.cpp
+++ b/dwtools/SPINET_to_Pitch.cpp
@@ -1,6 +1,6 @@
 /* SPINET_to_Pitch.cpp
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,15 +39,15 @@ Pitch SPINET_to_Pitch (SPINET me, double harmonicFallOffSlope, double ceiling, i
 		double fminl2 = NUMlog2 (fmin), fmaxl2 = NUMlog2 (fmax);
 		double points = (fmaxl2 - fminl2) * nPointsPerOctave;
 		double dfl2 = (fmaxl2 - fminl2) / (points - 1);
-		long nFrequencyPoints = points;
-		long maxHarmonic = fmax / fmin;
-		double maxStrength = 0, unvoicedCriterium = 0.45, maxPower = 0;
+		long nFrequencyPoints = (long) floor (points);
+		long maxHarmonic = (long) floor (fmax / fmin);
+		double maxStrength = 0.0, unvoicedCriterium = 0.45, maxPower = 0.0;
 
 		if (nFrequencyPoints < 2) {
-			Melder_throw ("Frequency range too small.");
+			Melder_throw (U"Frequency range too small.");
 		}
 		if (ceiling <= fmin) {
-			Melder_throw ("Ceiling is smaller than centre frequency of lowest filter.");
+			Melder_throw (U"Ceiling is smaller than centre frequency of lowest filter.");
 		}
 
 		autoPitch thee = Pitch_create (my xmin, my xmax, my nx, my dx, my x1, ceiling, maxnCandidates);
@@ -68,7 +68,7 @@ Pitch SPINET_to_Pitch (SPINET me, double harmonicFallOffSlope, double ceiling, i
 		// Determine global maximum power in frame
 
 		for (long j = 1; j <= my nx; j++) {
-			double p = 0;
+			double p = 0.0;
 			for (long i = 1; i <= my ny; i++) {
 				p += my s[i][j];
 			}
@@ -77,8 +77,8 @@ Pitch SPINET_to_Pitch (SPINET me, double harmonicFallOffSlope, double ceiling, i
 			}
 			power[j] = p;
 		}
-		if (maxPower == 0) {
-			Melder_throw ("No power");
+		if (maxPower == 0.0) {
+			Melder_throw (U"No power");
 		}
 
 		for (long j = 1; j <= my nx; j++) {
@@ -92,16 +92,16 @@ Pitch SPINET_to_Pitch (SPINET me, double harmonicFallOffSlope, double ceiling, i
 			for (long k = 1; k <= nFrequencyPoints; k++) {
 				double f = fminl2 + (k - 1) * dfl2;
 				NUMsplint (fl2.peek(), y.peek(), yv2.peek(), my ny, f, & pitch[k]);
-				sumspec[k] = 0;
+				sumspec[k] = 0.0;
 			}
 
 			// Formula (8): weighted harmonic summation.
 
 			for (long m = 1; m <= maxHarmonic; m++) {
 				double hm = 1 - harmonicFallOffSlope * NUMlog2 (m);
-				long kb = 1 + floor (nPointsPerOctave * NUMlog2 (m));
+				long kb = 1 + (long) floor (nPointsPerOctave * NUMlog2 (m));
 				for (long k = kb; k <= nFrequencyPoints; k++) {
-					if (pitch[k] > 0) {
+					if (pitch[k] > 0.0) {
 						sumspec[k - kb + 1] += pitch[k] * hm;
 					}
 				}
@@ -116,10 +116,10 @@ Pitch SPINET_to_Pitch (SPINET me, double harmonicFallOffSlope, double ceiling, i
 			for (long k = 2; k <= nFrequencyPoints - 1; k++) {
 				double y1 = sumspec[k - 1], y2 = sumspec[k], y3 = sumspec[k + 1];
 				if (y2 > y1 && y2 >= y3) {
-					double denum = y1 - 2 * y2 + y3, tmp = y3 - 4 * y2;
+					double denum = y1 - 2.0 * y2 + y3, tmp = y3 - 4.0 * y2;
 					double x = dfl2 * (y1 - y3) / (2 * denum);
-					double f = pow (2, fminl2 + (k - 1) * dfl2 + x);
-					double strength = (2 * y1 * (4 * y2 + y3) - y1 * y1 - tmp * tmp) / (8 * denum);
+					double f = pow (2.0, fminl2 + (k - 1) * dfl2 + x);
+					double strength = (2.0 * y1 * (4.0 * y2 + y3) - y1 * y1 - tmp * tmp) / (8.0 * denum);
 					if (strength > maxStrength) {
 						maxStrength = strength;
 					}
@@ -137,7 +137,7 @@ Pitch SPINET_to_Pitch (SPINET me, double harmonicFallOffSlope, double ceiling, i
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Pitch created.");
+		Melder_throw (me, U": no Pitch created.");
 	}
 }
 
diff --git a/dwtools/SPINET_to_Pitch.h b/dwtools/SPINET_to_Pitch.h
index e683406..e198c45 100644
--- a/dwtools/SPINET_to_Pitch.h
+++ b/dwtools/SPINET_to_Pitch.h
@@ -25,19 +25,10 @@
  djmw 20110307 Latest modification
 */
 
-
 #include "SPINET.h"
 #include "Pitch.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 Pitch SPINET_to_Pitch (SPINET me, double harmonicFallOffSlope, double ceiling,
 	int maxnCandidates);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _SPINET_to_Pitch_h_ */
diff --git a/dwtools/SSCP.cpp b/dwtools/SSCP.cpp
index 88e8ae9..071c099 100644
--- a/dwtools/SSCP.cpp
+++ b/dwtools/SSCP.cpp
@@ -1,6 +1,6 @@
 /* SSCP.cpp
  *
- * Copyright (C) 1993-2014 David Weenink
+ * Copyright (C) 1993-2014, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -96,52 +96,49 @@ void structSSCP :: v_info () {
 	structTableOfReal :: v_info ();
 	double zmin, zmax;
 	NUMmatrix_extrema<double> (data, 1, numberOfRows, 1, numberOfColumns, &zmin, &zmax);
-	MelderInfo_writeLine (L"Minimum value: ", Melder_double (zmin));
-	MelderInfo_writeLine (L"Maximum value: ", Melder_double (zmax));
+	MelderInfo_writeLine (U"Minimum value: ", zmin);
+	MelderInfo_writeLine (U"Maximum value: ", zmax);
 }
 
 /*
 	Calculate scale factor by which sqrt(eigenvalue) has to
 	be multiplied to obtain the length of an ellipse axis.
 */
-double SSCP_getEllipseScalefactor (I, double scale, int confidence) {
-	iam (SSCP);
-	long n = SSCP_getNumberOfObservations (me);
+double SSCP_getEllipseScalefactor (SSCP me, double scale, int confidence) {
+	long n = (long) floor (SSCP_getNumberOfObservations (me));
 
 	if (confidence) {
 		long p = my numberOfColumns;
 		double f;
 
 		if (n - p < 1) {
-			return -1;
+			return -1.0;
 		}
 		/* D.E. Johnson (1998), Applied Multivariate methods, page 410 */
-		f = NUMinvFisherQ (1 - scale, p, n - p);
-		scale = 2 * sqrt (f * p * (n - 1) / ( ( (double) n) * (n - p)));
+		f = NUMinvFisherQ (1.0 - scale, p, n - p);
+		scale = 2.0 * sqrt (f * p * (n - 1) / ( ((double) n) * (n - p)));
 	} else {
 		// very ugly, temporary hack
-		scale *= 2 / (scale < 0 ? -1 : sqrt (n - 1));
+		scale *= 2.0 / (scale < 0.0 ? -1.0 : sqrt (n - 1));
 	}
 	return scale;
 }
 
-static void getEllipseBoundingBoxCoordinates (SSCP me, double scale, int confidence,
-        double *xmin, double *xmax, double *ymin, double *ymax) {
+static void getEllipseBoundingBoxCoordinates (SSCP me, double scale, int confidence, double *xmin, double *xmax, double *ymin, double *ymax) {
 	double a, b, cs, sn, width, height;
 	double lscale = SSCP_getEllipseScalefactor (me, scale, confidence);
 
 	NUMeigencmp22 (my data[1][1], my data[1][2], my data[2][2], &a, &b, &cs, &sn);
 	NUMgetEllipseBoundingBox (sqrt (a), sqrt (b), cs, & width, & height);
 
-	*xmin = my centroid[1] - lscale * width / 2;
+	*xmin = my centroid[1] - lscale * width / 2.0;
 	*xmax = *xmin + lscale * width;
-	*ymin = my centroid[2] - lscale * height / 2;
+	*ymin = my centroid[2] - lscale * height / 2.0;
 	*ymax = *ymin + lscale * height;
 }
 
-void SSCPs_getEllipsesBoundingBoxCoordinates (SSCPs me, double scale, int confidence,
-        double *xmin, double *xmax, double *ymin, double *ymax) {
-	*xmin = *ymin = 1e38;
+void SSCPs_getEllipsesBoundingBoxCoordinates (SSCPs me, double scale, int confidence, double *xmin, double *xmax, double *ymin, double *ymax) {
+	*xmin = *ymin = 1e308;
 	*xmax = *ymax = - *xmin;
 
 	for (long i = 1; i <= my size; i++) {
@@ -194,11 +191,11 @@ SSCPs SSCPs_extractTwoDimensions (SSCPs me, long d1, long d2) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot extract two dimensions.");
+		Melder_throw (me, U": cannot extract two dimensions.");
 	}
 }
 
-void SSCP_drawTwoDimensionalEllipse_inside  (SSCP me, Graphics g, double scale, wchar_t * label, int fontSize) {
+void SSCP_drawTwoDimensionalEllipse_inside  (SSCP me, Graphics g, double scale, char32 * label, int fontSize) {
 	try {
 		long nsteps = 100;
 		autoNUMvector<double> x (0L, nsteps);
@@ -211,11 +208,11 @@ void SSCP_drawTwoDimensionalEllipse_inside  (SSCP me, Graphics g, double scale,
 		NUMeigencmp22 (my data[1][1], my data[1][2], my data[2][2], &a, &b, &cs, &sn);
 		// 1. Take sqrt to get units of 'std_dev'
 
-		a = scale * sqrt (a) / 2;
-		b = scale * sqrt (b) / 2;
+		a = scale * sqrt (a) / 2.0;
+		b = scale * sqrt (b) / 2.0;
 		x[nsteps] = x[0] = my centroid[1] + cs * a;
 		y[nsteps] = y[0] = my centroid[2] + sn * a;
-		double angle = 0;
+		double angle = 0.0;
 		double angle_inc = NUM2pi / nsteps;
 		for (long i = 1; i < nsteps; i++, angle += angle_inc) {
 			double xc = a * cos (angle);
@@ -225,7 +222,7 @@ void SSCP_drawTwoDimensionalEllipse_inside  (SSCP me, Graphics g, double scale,
 			x[i] = my centroid[1] + xt;
 		}
 		Graphics_polyline (g, nsteps + 1, x.peek(), y.peek());
-		if (label != NULL) {
+		if (label) {
 			int oldFontSize = Graphics_inqFontSize (g);
 			Graphics_setFontSize (g, fontSize);
 			Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
@@ -233,13 +230,13 @@ void SSCP_drawTwoDimensionalEllipse_inside  (SSCP me, Graphics g, double scale,
 			Graphics_setFontSize (g, oldFontSize);
 		}
 	} catch (MelderError) {
-		//
+		Melder_clearError ();
 	}
 }
 
 static void _SSCP_drawTwoDimensionalEllipse (SSCP me, Graphics g, double scale, int fontSize) {
 	long nsteps = 100;
-	wchar_t *name;
+	char32 *name;
 
 	autoNUMvector<double> x (0L, nsteps);
 	autoNUMvector<double> y (0L, nsteps);
@@ -253,11 +250,11 @@ static void _SSCP_drawTwoDimensionalEllipse (SSCP me, Graphics g, double scale,
 
 	// 1. Take sqrt to get units of 'std_dev'
 
-	a = scale * sqrt (a) / 2;
-	b = scale * sqrt (b) / 2;
+	a = scale * sqrt (a) / 2.0;
+	b = scale * sqrt (b) / 2.0;
 	x[nsteps] = x[0] = my centroid[1] + cs * a;
 	y[nsteps] = y[0] = my centroid[2] + sn * a;
-	double angle = 0;
+	double angle = 0.0;
 	double angle_inc = NUM2pi / nsteps;
 	for (long i = 1; i < nsteps; i++, angle += angle_inc) {
 		double xc = a * cos (angle);
@@ -276,8 +273,7 @@ static void _SSCP_drawTwoDimensionalEllipse (SSCP me, Graphics g, double scale,
 	}
 }
 
-SSCP SSCP_toTwoDimensions (I, double *v1, double *v2) {
-	iam (SSCP);
+SSCP SSCP_toTwoDimensions (SSCP me, double *v1, double *v2) {
 	try {
 		double *vec[3];
 		autoSSCP thee = SSCP_create (2);
@@ -326,12 +322,11 @@ SSCP SSCP_toTwoDimensions (I, double *v1, double *v2) {
 
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot extract two dimensions.");
+		Melder_throw (me, U": cannot extract two dimensions.");
 	}
 }
 
-void SSCP_init (I, long dimension, long storage) {
-	iam (SSCP);
+void SSCP_init (SSCP me, long dimension, long storage) {
 	TableOfReal_init (me, storage, dimension);
 	my centroid = NUMvector<double> (1, dimension);
 }
@@ -342,21 +337,20 @@ SSCP SSCP_create (long dimension) {
 		SSCP_init (me.peek(), dimension, dimension);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SSCP not created.");
+		Melder_throw (U"SSCP not created.");
 	}
 }
 
-double SSCP_getConcentrationEllipseArea (I, double scale, int confidence, long d1, long d2) {
-	iam (SSCP);
+double SSCP_getConcentrationEllipseArea (SSCP me, double scale, int confidence, long d1, long d2) {
 	long p = my numberOfRows;
 
 	if (d1 < 1 || d1 > p || d2 < 1 || d2 > p || d1 == d2) {
-		Melder_throw ("Incorrect axes.");
+		Melder_throw (U"Incorrect axes.");
 	}
 	autoSSCP thee = _SSCP_extractTwoDimensions (me, d1, d2);
 	scale = SSCP_getEllipseScalefactor (thee.peek(), scale, confidence);
-	if (scale < 0) {
-		Melder_throw ("Invalid scale factor.");
+	if (scale < 0.0) {
+		Melder_throw (U"Invalid scale factor.");
 	}
 
 	double a, b, cs, sn;
@@ -364,35 +358,33 @@ double SSCP_getConcentrationEllipseArea (I, double scale, int confidence, long d
 
 	// 1. Take sqrt to get units of 'std_dev'
 
-	a = scale * sqrt (a) / 2; b = scale * sqrt (b) / 2;
+	a = scale * sqrt (a) / 2.0;
+	b = scale * sqrt (b) / 2.0;
 	return NUMpi * a * b;
 }
 
-double SSCP_getFractionVariation (I, long from, long to) {
-	iam (SSCP);
+double SSCP_getFractionVariation (SSCP me, long from, long to) {
 	long n = my numberOfRows;
 
 	if (from < 1 || from > to || to > n) {
 		return NUMundefined;
 	}
 
-	double sum = 0, trace = 0;
+	double sum = 0.0, trace = 0.0;
 	for (long i = 1; i <= n; i++) {
 		trace += my numberOfRows == 1 ? my data[1][i] : my data[i][i];
 		if (i >= from && i <= to) {
 			sum += my numberOfRows == 1 ? my data[1][i] : my data[i][i];
 		}
 	}
-	return trace > 0 ? sum / trace : NUMundefined;
+	return trace > 0.0 ? sum / trace : NUMundefined;
 }
 
-void SSCP_drawConcentrationEllipse (SSCP me, Graphics g, double scale,
-                                    int confidence, long d1, long d2, double xmin, double xmax,
-                                    double ymin, double ymax, int garnish) {
+void SSCP_drawConcentrationEllipse (SSCP me, Graphics g, double scale, int confidence, long d1, long d2, double xmin, double xmax, double ymin, double ymax, int garnish) {
 	long p = my numberOfColumns;
 
 	if (d1 < 1 || d1 > p || d2 < 1 || d2 > p || d1 == d2) {
-		Melder_throw ("Incorrect axes.");
+		Melder_throw (U"Incorrect axes.");
 	}
 
 	autoSSCP thee = _SSCP_extractTwoDimensions (me, d1, d2);
@@ -413,56 +405,50 @@ void SSCP_drawConcentrationEllipse (SSCP me, Graphics g, double scale,
 
 	scale = SSCP_getEllipseScalefactor (thee.peek(), scale, confidence);
 	if (scale < 0) {
-		Melder_throw ("Invalid scale factor.");
+		Melder_throw (U"Invalid scale factor.");
 	}
 	_SSCP_drawTwoDimensionalEllipse (thee.peek(), g, scale, 0);
 
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_marksBottom (g, 2, true, true, false);
 	}
 }
 
-void SSCP_setNumberOfObservations (I, double numberOfObservations) {
-	iam (SSCP);
+void SSCP_setNumberOfObservations (SSCP me, double numberOfObservations) {
 	my numberOfObservations = numberOfObservations;
 }
 
-double SSCP_getNumberOfObservations (I) {
-	iam (SSCP);
+double SSCP_getNumberOfObservations (SSCP me) {
 	return my numberOfObservations;
 }
 
-double SSCP_getDegreesOfFreedom (I) {
-	iam (SSCP);
+double SSCP_getDegreesOfFreedom (SSCP me) {
 	return my numberOfObservations - 1;
 }
 
-double SSCP_getTotalVariance (I) {
-	iam (SSCP);
-	double trace = 0;
+double SSCP_getTotalVariance (SSCP me) {
+	double trace = 0.0;
 	for (long i = 1; i <= my numberOfColumns; i++) {
 		trace += my numberOfRows == 1 ? my data[1][i] : my data[i][i];
 	}
 	return trace;
 }
 
-double SSCP_getCumulativeContributionOfComponents (I, long from, long to) {
-	iam (SSCP);
-
+double SSCP_getCumulativeContributionOfComponents (SSCP me, long from, long to) {
 	double sum = NUMundefined;
 	if (to == 0) {
 		to = my numberOfRows;
 	}
 	if (from > 0 && to <= my numberOfRows && from <= to) {
 		sum = SSCP_getTotalVariance (me);
-		double partial = 0;
+		double partial = 0.0;
 		for (long i = from; i <= to; i++) {
 			partial += my numberOfRows == 1 ? my data[1][i] : my data[i][i];
 		}
-		if (sum > 0) {
+		if (sum > 0.0) {
 			sum = partial / sum;
 		}
 	}
@@ -474,13 +460,13 @@ void Covariance_and_PCA_generateOneVector (Covariance me, PCA thee, double *vec,
 	// Generate the multi-normal vector elements N(0,sigma)
 
 	for (long j = 1; j <= my numberOfColumns; j++) {
-		buf[j] = NUMrandomGauss (0, sqrt (thy eigenvalues[j]));
+		buf[j] = NUMrandomGauss (0.0, sqrt (thy eigenvalues[j]));
 	}
 
 	// Rotate back
 
 	for (long j = 1; j <= my numberOfColumns; j++) {
-		vec[j] = 0;
+		vec[j] = 0.0;
 		for (long k = 1; k <= my numberOfColumns; k++) {
 			vec[j] += buf[k] * thy eigenvectors[k][j];
 		}
@@ -496,7 +482,7 @@ void Covariance_and_PCA_generateOneVector (Covariance me, PCA thee, double *vec,
 TableOfReal Covariance_to_TableOfReal_randomSampling (Covariance me, long numberOfData) {
 	try {
 		if (numberOfData <= 0) {
-			numberOfData = my numberOfObservations;
+			numberOfData = (long) floor (my numberOfObservations);
 		}
 		autoPCA pca = SSCP_to_PCA (me);
 		autoTableOfReal thee = TableOfReal_create (numberOfData, my numberOfColumns);
@@ -509,31 +495,30 @@ TableOfReal Covariance_to_TableOfReal_randomSampling (Covariance me, long number
 		NUMstrings_copyElements (my columnLabels, thy columnLabels, 1, my numberOfColumns);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not random sampled.");
+		Melder_throw (me, U": not random sampled.");
 	}
 }
 
-SSCP TableOfReal_to_SSCP (I, long rowb, long rowe, long colb, long cole) {
-	iam (TableOfReal);
+SSCP TableOfReal_to_SSCP (TableOfReal me, long rowb, long rowe, long colb, long cole) {
 	try {
 		TableOfReal_areAllCellsDefined (me, rowb, rowe, colb, cole);
 
 		if (rowb == 0 && rowe == 0) {
 			rowb = 1; rowe = my numberOfRows;
 		} else if (rowe < rowb || rowb < 1 || rowe > my numberOfRows) {
-			Melder_throw ("Invalid row number.");
+			Melder_throw (U"Invalid row number.");
 		}
 
 		if (colb == 0 && cole == 0) {
 			colb = 1; cole = my numberOfColumns;
 		} else if (cole < colb || colb < 1 || cole > my numberOfColumns) {
-			Melder_throw ("Invalid column number.");
+			Melder_throw (U"Invalid column number.");
 		}
 
 		long m = rowe - rowb + 1; /* # rows */
 		long n = cole - colb + 1; /* # columns */
 
-		if (m < n) Melder_warning (L"The SSCP will not have \n"
+		if (m < n) Melder_warning (U"The SSCP will not have \n"
 			"full dimensionality. This may be a problem in following analysis steps. \n"
 			"(The number of data points was less than the number of variables.)");
 
@@ -556,7 +541,7 @@ SSCP TableOfReal_to_SSCP (I, long rowb, long rowe, long colb, long cole) {
 
 		for (long i = 1; i <= n; i++) {
 			for (long j = i; j <= n; j++) {
-				double t = 0;
+				double t = 0.0;
 				for (long k = 1; k <= m; k++) {
 					t += v[k][i] * v[k][j];
 				}
@@ -564,25 +549,23 @@ SSCP TableOfReal_to_SSCP (I, long rowb, long rowe, long colb, long cole) {
 			}
 		}
 		for (long j = 1; j <= n; j++) {
-			wchar_t *label = my columnLabels[colb + j - 1];
+			char32 *label = my columnLabels[colb + j - 1];
 			TableOfReal_setColumnLabel (thee.peek(), j, label);
 			TableOfReal_setRowLabel (thee.peek(), j, label);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": SSCP not created.");
+		Melder_throw (me, U": SSCP not created.");
 	}
 }
 
-TableOfReal SSCP_and_TableOfReal_extractDistanceQuantileRange (SSCP me, thou,
-        double qlow, double qhigh) {
+TableOfReal SSCP_and_TableOfReal_extractDistanceQuantileRange (SSCP me, TableOfReal thee, double qlow, double qhigh) {
 	try {
-		thouart (TableOfReal);
 		autoCovariance cov = SSCP_to_Covariance (me, 1);
 		autoTableOfReal him = Covariance_and_TableOfReal_extractDistanceQuantileRange (cov.peek(), thee, qlow, qhigh);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no distance quantile ranges created.");
+		Melder_throw (me, U": no distance quantile ranges created.");
 	}
 }
 
@@ -604,7 +587,7 @@ TableOfReal Covariance_and_TableOfReal_mahalanobis (Covariance me, thou, bool us
 
 		if (useTableCentroid) {
 			for (long icol = 1; icol <= thy numberOfColumns; icol++) {
-				double mean = 0;
+				double mean = 0.0;
 				for (long irow = 1; irow <= thy numberOfRows; irow++) {
 					mean += thy data[irow][icol];
 				}
@@ -614,21 +597,20 @@ TableOfReal Covariance_and_TableOfReal_mahalanobis (Covariance me, thou, bool us
 
 		for (long k = 1; k <= thy numberOfRows; k++) {
 			his data[k][1] = sqrt (NUMmahalanobisDistance_chi (covari.peek(), thy data[k], centroid.peek(), my numberOfRows, my numberOfRows));
-			if (thy rowLabels[k] != 0) {
+			if (thy rowLabels[k]) {
 				TableOfReal_setRowLabel (him.peek(), k, thy rowLabels[k]);
 			}
 		}
-		TableOfReal_setColumnLabel (him.peek(), 1, L"d");
+		TableOfReal_setColumnLabel (him.peek(), 1, U"d");
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, "no Mahalanobis distances created.");
+		Melder_throw (me, U"no Mahalanobis distances created.");
 	}
 }
 
 
-TableOfReal Covariance_and_TableOfReal_extractDistanceQuantileRange (Covariance me, thou, double qlow, double qhigh) {
+TableOfReal Covariance_and_TableOfReal_extractDistanceQuantileRange (Covariance me, TableOfReal thee, double qlow, double qhigh) {
 	try {
-		thouart (TableOfReal);
 		autoTableOfReal him = Covariance_and_TableOfReal_mahalanobis (me, thee, false);
 
 		double low = TableOfReal_getColumnQuantile (him.peek(), 1, qlow);
@@ -645,12 +627,12 @@ TableOfReal Covariance_and_TableOfReal_extractDistanceQuantileRange (Covariance
 		}
 
 		if (nsel < 1) {
-			Melder_throw ("Not enough data in quantile interval.");
+			Melder_throw (U"Not enough data in quantile interval.");
 		}
 
 		autoTableOfReal r = TableOfReal_create (nsel, thy numberOfColumns);
 		NUMstrings_copyElements (thy columnLabels, r -> columnLabels, 1, thy numberOfColumns);
-		//((r -> columnLabels = NUMstrings_copy (thy columnLabels, 1, thy numberOfColumns)) == NULL)) goto end;
+		//((r -> columnLabels = NUMstrings_copy (thy columnLabels, 1, thy numberOfColumns)) == nullptr)) goto end;
 
 		long k = 0;
 		for (long i = 1; i <= thy numberOfRows; i++) {
@@ -661,58 +643,54 @@ TableOfReal Covariance_and_TableOfReal_extractDistanceQuantileRange (Covariance
 		}
 		return r.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal with distancequantile range not created.");
+		Melder_throw (U"TableOfReal with distancequantile range not created.");
 	}
 }
 
 
-Covariance TableOfReal_to_Covariance (I) {
-	iam (TableOfReal);
+Covariance TableOfReal_to_Covariance (TableOfReal me) {
 	try {
 		autoSSCP sscp = TableOfReal_to_SSCP (me, 0, 0, 0, 0);
 		autoCovariance thee = SSCP_to_Covariance (sscp.peek(), 1);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": covariances not created.");
+		Melder_throw (me, U": covariances not created.");
 	}
 }
 
-Correlation TableOfReal_to_Correlation (I) {
-	iam (TableOfReal);
+Correlation TableOfReal_to_Correlation (TableOfReal me) {
 	try {
 		autoSSCP sscp = TableOfReal_to_SSCP (me, 0, 0, 0, 0);
 		autoCorrelation thee = SSCP_to_Correlation (sscp.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": correlations not created.");
+		Melder_throw (me, U": correlations not created.");
 	}
 }
 
-Correlation TableOfReal_to_Correlation_rank (I) {
-	iam (TableOfReal);
+Correlation TableOfReal_to_Correlation_rank (TableOfReal me) {
 	try {
 		autoTableOfReal t = TableOfReal_rankColumns (me);
 		autoCorrelation thee = TableOfReal_to_Correlation (t.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": rank correlations not created.");
+		Melder_throw (me, U": rank correlations not created.");
 	}
 }
 
-SSCPs TableOfReal_to_SSCPs_byLabel (I) {
-	iam (TableOfReal);
+SSCPs TableOfReal_to_SSCPs_byLabel (TableOfReal me) {
 	try {
 		autoSSCPs thee = SSCPs_create ();
 		autoTableOfReal mew = TableOfReal_sortOnlyByRowLabels (me);
 
-		const wchar_t *label = mew -> rowLabels[1];
+		const char32 *label = mew -> rowLabels[1];
 		Melder_warningOff ();
 		long numberOfCases = my numberOfRows, ncols = my numberOfColumns;
 		long lastrow = 0, ngroups = 0, nsingular = 0, index = 1;
 		for (long i = 2; i <= numberOfCases; i++) {
 			long nrows = 0;
-			const wchar_t *li = mew -> rowLabels[i];
-			if (Melder_wcscmp (li, label) != 0) {
+			const char32 *li = mew -> rowLabels[i];
+			if (Melder_cmp (li, label) != 0) {
 				// current label different from previous one(s)
 				nrows = i - index; lastrow = i - 1;
 			} else if (i == numberOfCases) {
@@ -730,7 +708,7 @@ SSCPs TableOfReal_to_SSCPs_byLabel (I) {
 				}
 				autoSSCP t = TableOfReal_to_SSCP (mew.peek(), index, lastrow, 0, 0);
 				if (! (label = mew -> rowLabels[index])) {
-					label = L"?";
+					label = U"?";
 				}
 				Thing_setName (t.peek(), label);
 				Collection_addItem (thee.peek(), t.transfer());
@@ -743,17 +721,16 @@ SSCPs TableOfReal_to_SSCPs_byLabel (I) {
 		Melder_warningOn ();
 		if (nsingular > 0 || thy size != ngroups) {
 			long notIncluded = ngroups - thy size;
-			Melder_warning (Melder_integer (ngroups), L" different groups detected: ", Melder_integer (nsingular + notIncluded),
-			                L" group(s) with less rows than columns (of which ", Melder_integer (notIncluded), L" with only one row).");
+			Melder_warning (ngroups, U" different groups detected: ", nsingular + notIncluded,
+			                U" group(s) with less rows than columns (of which ", notIncluded, U" with only one row).");
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": SSCP not created from labels.");
+		Melder_throw (me, U": SSCP not created from labels.");
 	}
 }
 
-PCA SSCP_to_PCA (I) {
-	iam (SSCP);
+PCA SSCP_to_PCA (SSCP me) {
 	try {
 		double **data = my data;
 		autoNUMmatrix<double> adata;
@@ -770,55 +747,52 @@ PCA SSCP_to_PCA (I) {
 		NUMstrings_copyElements (my columnLabels, thy labels, 1, my numberOfColumns);
 		Eigen_initFromSymmetricMatrix (thee.peek(), data, my numberOfColumns);
 		NUMvector_copyElements (my centroid, thy centroid, 1, my numberOfColumns);
-		PCA_setNumberOfObservations (thee.peek(), my numberOfObservations);
+		PCA_setNumberOfObservations (thee.peek(), (long) floor (my numberOfObservations));
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": PCA not created.");
+		Melder_throw (me, U": PCA not created.");
 	}
 }
 
-void SSCP_setValue (I, long row, long col, double value) {
-	iam (SSCP);
+void SSCP_setValue (SSCP me, long row, long col, double value) {
 	if (col < 0 || col > my numberOfColumns) {
-		Melder_throw ("Illegal column number.");
+		Melder_throw (U"Illegal column number.");
 	}
 	if (row < 0 || row > my numberOfColumns) {
-		Melder_throw ("Illegal row number.");    // ! yes numberOfColumns
+		Melder_throw (U"Illegal row number.");    // ! yes numberOfColumns
 	}
 	if (row == col && value <= 0) {
-		Melder_throw ("Diagonal element must always be a positive number.");
+		Melder_throw (U"Diagonal element must always be a positive number.");
 	}
 	if (my numberOfRows == 1) { // diagonal
 		if (row != col) {
-			Melder_throw ("Row and column number must be equal for a diagonal matrix.");
+			Melder_throw (U"Row and column number must be equal for a diagonal matrix.");
 		}
 		my data[1][row] = value;
 	} else {
 		if (row != col && (fabs (value) > my data[row][row] || fabs (value) > my data[row][row])) Melder_throw
-			("The off-diagonal cannot be larger than the diagonal values. Input diagonal elements first, or change this value.");
+			(U"The off-diagonal cannot be larger than the diagonal values. Input diagonal elements first, or change this value.");
 		my data[row][col] = my data[col][row] = value;
 	}
 }
 
-void SSCP_setCentroid (I, long component, double value) {
-	iam (SSCP);
+void SSCP_setCentroid (SSCP me, long component, double value) {
 	if (component < 1 || component > my numberOfColumns) {
-		Melder_throw ("Illegal component number.");
+		Melder_throw (U"Illegal component number.");
 	}
 	my centroid[component] = value;
 }
 
-CCA SSCP_to_CCA (I, long ny) {
-	iam (SSCP);
+CCA SSCP_to_CCA (SSCP me, long ny) {
 	try {
 		char upper = 'L', diag = 'N';
 		long info;
 
 		if (ny < 1 || ny >= my numberOfRows) {
-			Melder_throw ("ny < 1 || ny >= my numberOfRows");
+			Melder_throw (U"ny < 1 || ny >= my numberOfRows");
 		}
 		if (my numberOfRows == 1) {
-			Melder_throw ("Matrix is diagonal.");
+			Melder_throw (U"Matrix is diagonal.");
 		}
 
 		long m = my numberOfRows, nx = m - ny, xy_interchanged = nx < ny, yof = 0, xof = ny;
@@ -855,12 +829,12 @@ CCA SSCP_to_CCA (I, long ny) {
 		// (Pretend as if colum-major storage)
 
 		(void) NUMlapack_dpotf2 (&upper, &ny, &syy[1][1], &ny, &info);
-		if (info != 0) Melder_throw ("The leading minor of order ", info, " is not positive definite, and the "
-			                             "factorization of Syy could not be completed.");
+		if (info != 0) Melder_throw (U"The leading minor of order ", info, U" is not positive definite, and the "
+			                             U"factorization of Syy could not be completed.");
 
 		(void) NUMlapack_dpotf2 (&upper, &nx, &sxx[1][1], &nx, &info);
-		if (info != 0) Melder_throw ("The leading minor of order ", info, " is not positive definite, and the "
-			                             "factorization of Sxx could not be completed.");
+		if (info != 0) Melder_throw (U"The leading minor of order ", info, U" is not positive definite, and the "
+			                             U"factorization of Sxx could not be completed.");
 
 		/*
 			With Cholesky decomps Sxx = Ux'* Ux, Syy = Uy * Uy'
@@ -895,14 +869,14 @@ CCA SSCP_to_CCA (I, long ny) {
 
 		(void) NUMlapack_dtrti2 (&upper, &diag, &nx, &sxx[1][1], &nx, &info);
 		if (info != 0) {
-			Melder_throw ("Error in inverse for Sxx.");
+			Melder_throw (U"Error in inverse for Sxx.");
 		}
 
 		// Prepare Uxi' * Syx' = (Syx * Uxi)'
 
 		for (long i = 1; i <= ny; i++) {
 			for (long j = 1; j <= nx; j++) {
-				double t = 0;
+				double t = 0.0;
 				for (long k = 1; k <= j; k++) {
 					t += syx[i][k] * sxx[k][j];
 				}
@@ -919,14 +893,14 @@ CCA SSCP_to_CCA (I, long ny) {
 
 		(void) NUMlapack_dtrti2 (&upper, &diag, &gsvd -> numberOfColumns, &ri[1][1], &gsvd -> numberOfColumns, &info);
 		if (info != 0) {
-			Melder_throw ("Error in inverse for R.");
+			Melder_throw (U"Error in inverse for R.");
 		}
 
 		for (long i = 1; i <= gsvd -> numberOfColumns; i++) {
 			double t = gsvd -> d1[i] / gsvd -> d2[i];
 			thy y -> eigenvalues[i] = t * t;
 			for (long j = 1; j <= gsvd -> numberOfColumns; j++) {
-				t = 0;
+				t = 0.0;
 				for (long k = 1; k <= j; k++) {
 					t += gsvd -> q[i][k] * ri[k][j];
 				}
@@ -937,7 +911,7 @@ CCA SSCP_to_CCA (I, long ny) {
 		NUMnormalizeRows (thy y -> eigenvectors, thy y -> numberOfEigenvalues, thy y -> numberOfEigenvalues, 1);
 
 		thy numberOfCoefficients = thy y -> numberOfEigenvalues;
-		thy numberOfObservations = my numberOfObservations;
+		thy numberOfObservations = (long) floor (my numberOfObservations);
 
 		// x = Sxx**-1 * Syx' * y
 
@@ -945,7 +919,7 @@ CCA SSCP_to_CCA (I, long ny) {
 			double *evecy = thy y -> eigenvectors[i];
 			double *evecx = thy x -> eigenvectors[i];
 			for (long j = 1; j <= nx; j++) {
-				double t = 0;
+				double t = 0.0;
 				for (long k = j; k <= nx; k++) {
 					for (long l = 1; l <= nx; l++) {
 						for (long n = 1; n <= ny; n++) {
@@ -965,7 +939,7 @@ CCA SSCP_to_CCA (I, long ny) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": CCA not created.");
+		Melder_throw (me, U": CCA not created.");
 	}
 }
 
@@ -979,7 +953,7 @@ SSCPs SSCPs_create () {
 		Ordered_init (me.peek(), classSSCP, 10);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SSCPs not created.");
+		Melder_throw (U"SSCPs not created.");
 	}
 }
 
@@ -989,9 +963,9 @@ SSCP SSCPs_to_SSCP_pool (SSCPs me) {
 
 		for (long k = 2; k <= my size; k++) {
 			SSCP t = (SSCP) my item[k];
-			long no = t -> numberOfObservations;
+			long no = (long) floor (t -> numberOfObservations);
 			if (t -> numberOfRows != thy numberOfRows) {
-				Melder_throw ("Unequal dimensions (", k, ").");
+				Melder_throw (U"Unequal dimensions (", k, U").");
 			}
 
 			thy numberOfObservations += no;
@@ -1015,16 +989,16 @@ SSCP SSCPs_to_SSCP_pool (SSCPs me) {
 
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not pooled.");
+		Melder_throw (me, U": not pooled.");
 	}
 }
 
 void SSCPs_getHomegeneityOfCovariances_box (SSCPs me, double *probability, double *chisq, long *ndf) {
-	*probability = 0; *chisq = 0; *ndf = 0;
+	*probability = 0.0; *chisq = 0.0; *ndf = 0;
 
 	autoSSCP pooled = SSCPs_to_SSCP_pool (me);
 	long p = pooled -> numberOfColumns;
-	double ln_determinant, inv = 0, sum = 0, g = my size;
+	double ln_determinant, inv = 0.0, sum = 0.0, g = my size;
 	for (long i = 1; i <= g; i++) {
 		SSCP t = (SSCP) my item[i];
 		double ni = t -> numberOfObservations - 1;
@@ -1033,7 +1007,7 @@ void SSCPs_getHomegeneityOfCovariances_box (SSCPs me, double *probability, doubl
 		// Box-test is for covariance matrices -> scale determinant.
 
 		ln_determinant -= p * log (ni);
-		sum += ni; inv += 1 / ni;
+		sum += ni; inv += 1.0 / ni;
 		*chisq -= ni * ln_determinant;
 	}
 
@@ -1041,8 +1015,8 @@ void SSCPs_getHomegeneityOfCovariances_box (SSCPs me, double *probability, doubl
 	ln_determinant -= p * log (pooled -> numberOfObservations - g);
 	*chisq += sum * ln_determinant;
 
-	*chisq *= 1.0 - (inv - 1 / sum) * (2 * p * p + 3 * p - 1) / (6 * (p + 1) * (g - 1));
-	*ndf = (g - 1) * p * (p + 1) / 2;
+	*chisq *= 1.0 - (inv - 1.0 / sum) * (2.0 * p * p + 3.0 * p - 1.0) / (6.0 * (p + 1) * (g - 1.0));
+	*ndf = (long) floor ((g - 1.0) * p * (p + 1) / 2.0);
 	*probability =  NUMchiSquareQ (*chisq, *ndf);
 }
 
@@ -1051,24 +1025,23 @@ SSCPs SSCPs_toTwoDimensions (SSCPs me, double *v1, double *v2) {
 	try {
 		autoSSCPs thee = SSCPs_create ();
 		for (long i = 1; i <= my size; i++) {
-			autoSSCP t = (SSCP) SSCP_toTwoDimensions (my item[i], v1, v2);
+			autoSSCP t = (SSCP) SSCP_toTwoDimensions ((SSCP) my item[i], v1, v2);
 			Thing_setName (t.peek(), Thing_getName ( (Thing) my item[i]));
 			Collection_addItem (thee.peek(), t.transfer());
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not reduced to two dimensions.");
+		Melder_throw (me, U": not reduced to two dimensions.");
 	}
 }
 
 
-void SSCPs_drawConcentrationEllipses (SSCPs me, Graphics g, double scale, int confidence, const wchar_t *label,
-                                      long d1, long d2, double xmin, double xmax, double ymin, double ymax, int fontSize, int garnish) {
+void SSCPs_drawConcentrationEllipses (SSCPs me, Graphics g, double scale, int confidence, const char32 *label, long d1, long d2, double xmin, double xmax, double ymin, double ymax, int fontSize, int garnish) {
 	SSCP t = (SSCP) my item[1];
 	long p = t -> numberOfColumns;
 
 	if (d1 < 1 || d1 > p || d2 < 1 || d2 > p || d1 == d2) {
-		Melder_throw ("Incorrect axes.");
+		Melder_throw (U"Incorrect axes.");
 	}
 
 	autoSSCPs thee = SSCPs_extractTwoDimensions (me, d1, d2);
@@ -1090,25 +1063,22 @@ void SSCPs_drawConcentrationEllipses (SSCPs me, Graphics g, double scale, int co
 	for (long i = 1; i <= thy size; i++) {
 		t = (SSCP) thy item[i];
 		double lscale = SSCP_getEllipseScalefactor (t, scale, confidence);
-		if (lscale < 0) {
+		if (lscale < 0.0) {
 			continue;
 		}
-		if (label == 0 || Melder_wcscmp (label, Thing_getName (t)) == 0) {
+		if (! label || Melder_cmp (label, Thing_getName (t)) == 0) {
 			_SSCP_drawTwoDimensionalEllipse (t, g, lscale, fontSize);
 		}
 	}
 
 	Graphics_unsetInner (g);
 	if (garnish) {
-		wchar_t text[20];
 		t = (SSCP) my item[1];
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		swprintf (text, 20, L"Dimension %ld", d2);
-		Graphics_textLeft (g, 1, t -> columnLabels[d2] ? t -> columnLabels[d2] : text);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		swprintf (text, 20, L"Dimension %ld", d1);
-		Graphics_textBottom (g, 1, t -> columnLabels[d1] ? t -> columnLabels[d1] : text);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, t -> columnLabels[d2] ? t -> columnLabels[d2] : Melder_cat (U"Dimension ", d2));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textBottom (g, true, t -> columnLabels[d1] ? t -> columnLabels[d1] : Melder_cat (U"Dimension ", d1));
 	}
 }
 
@@ -1118,12 +1088,11 @@ TableOfReal SSCP_to_TableOfReal (SSCP me) {
 		my structTableOfReal :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not copied.");
+		Melder_throw (me, U": not copied.");
 	}
 }
 
-TableOfReal SSCP_extractCentroid (I) {
-	iam (SSCP);
+TableOfReal SSCP_extractCentroid (SSCP me) {
 	try {
 		long n = my numberOfColumns;
 
@@ -1132,7 +1101,7 @@ TableOfReal SSCP_extractCentroid (I) {
 		thy columnLabels = NUMstrings_copy (my columnLabels, 1, n);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": centroid not extracted.");
+		Melder_throw (me, U": centroid not extracted.");
 	}
 }
 
@@ -1146,7 +1115,7 @@ Covariance Covariance_create (long dimension) {
 		SSCP_init (me.peek(), dimension, dimension);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Covariance not created.");
+		Melder_throw (U"Covariance not created.");
 	}
 }
 
@@ -1159,18 +1128,18 @@ Covariance Covariance_create_reduceStorage (long dimension, long storage) {
 		SSCP_init (me.peek(), dimension, storage);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Reduced storage covariance not created.");
+		Melder_throw (U"Reduced storage covariance not created.");
 	}
 }
 
-Covariance Covariance_createSimple (wchar_t *covariances, wchar_t *centroid, long numberOfObservations) {
+Covariance Covariance_createSimple (char32 *covariances, char32 *centroid, long numberOfObservations) {
 	try {
 		long dimension, ncovars;
 		autoNUMvector<double> centroids (NUMstring_to_numbers (centroid, &dimension), 1);
 		autoNUMvector<double> covars (NUMstring_to_numbers (covariances, &ncovars), 1);
 		long ncovars_wanted = dimension * (dimension + 1) / 2;
-		if (ncovars != ncovars_wanted) Melder_throw ("The number of covariance matrix elements and the number of "
-			        "centroid elements are not in concordance. There should be d(d+1)/2 covariance values and d centroid values.");
+		if (ncovars != ncovars_wanted) Melder_throw (U"The number of covariance matrix elements and the number of "
+			U"centroid elements are not in concordance. There should be d(d+1)/2 covariance values and d centroid values.");
 
 		autoCovariance me = Covariance_create (dimension);
 
@@ -1192,7 +1161,7 @@ Covariance Covariance_createSimple (wchar_t *covariances, wchar_t *centroid, lon
 
 		for (long irow = 1; irow <= dimension; irow++) {
 			if (my data[irow][irow] <= 0) {
-				Melder_throw ("The variances, i.e. the diagonal matrix elements, must all be positive numbers.");
+				Melder_throw (U"The variances, i.e. the diagonal matrix elements, must all be positive numbers.");
 			}
 		}
 		for (long irow = 1; irow <= dimension; irow++) {
@@ -1200,7 +1169,7 @@ Covariance Covariance_createSimple (wchar_t *covariances, wchar_t *centroid, lon
 				if (fabs (my data[irow][icol] / sqrt (my data[irow][irow] * my data[icol][icol])) > 1) {
 					long nmissing = (irow - 1) * irow / 2;
 					long inum = (irow - 1) * dimension + icol - nmissing;
-					Melder_throw (L"The covariance in cell [", irow, L",", icol, L"], i.e. input item ", inum, L" is too large.");
+					Melder_throw (U"The covariance in cell [", irow, U",", icol, U"], i.e. input item ", inum, U" is too large.");
 				}
 			}
 		}
@@ -1210,7 +1179,7 @@ Covariance Covariance_createSimple (wchar_t *covariances, wchar_t *centroid, lon
 		my numberOfObservations = numberOfObservations;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Simple Covariance not created.");
+		Melder_throw (U"Simple Covariance not created.");
 	}
 }
 
@@ -1220,7 +1189,7 @@ Correlation Correlation_create (long dimension) {
 		SSCP_init (me.peek(), dimension, dimension);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Correlation not created.");
+		Melder_throw (U"Correlation not created.");
 	}
 }
 
@@ -1237,7 +1206,7 @@ Covariance SSCP_to_Covariance (SSCP me, long numberOfConstraints) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, "; Covariance not created.");
+		Melder_throw (me, U"; Covariance not created.");
 	}
 }
 
@@ -1252,12 +1221,11 @@ SSCP Covariance_to_SSCP (Covariance me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": SSCP not created.");
+		Melder_throw (me, U": SSCP not created.");
 	}
 }
 
-Correlation SSCP_to_Correlation (I) {
-	iam (SSCP);
+Correlation SSCP_to_Correlation (SSCP me) {
 	try {
 		autoCorrelation thee = Thing_new (Correlation);
 		my structSSCP :: v_copy (thee.peek());
@@ -1268,13 +1236,12 @@ Correlation SSCP_to_Correlation (I) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": Correlation not created.");
+		Melder_throw (me, U": Correlation not created.");
 	}
 }
 
-double SSCP_getLnDeterminant (I) {
+double SSCP_getLnDeterminant (SSCP me) {
 	try {
-		iam (SSCP);
 		double ln_d;
 		NUMdeterminant_cholesky (my data, my numberOfRows, &ln_d);
 		return ln_d;
@@ -1286,7 +1253,7 @@ double SSCP_getLnDeterminant (I) {
 static Covariance Covariances_pool (Covariance me, Covariance thee) {
 	try {
 		if (my numberOfRows != thy numberOfRows || my numberOfColumns != thy numberOfColumns)  Melder_throw
-			("Matrices must have equal dimensions.");
+			(U"Matrices must have equal dimensions.");
 		autoSSCPs sscps = SSCPs_create ();
 		autoSSCP sscp1 = Covariance_to_SSCP (me);
 		Collection_addItem (sscps.peek(), sscp1.transfer());
@@ -1296,7 +1263,7 @@ static Covariance Covariances_pool (Covariance me, Covariance thee) {
 		autoCovariance him = SSCP_to_Covariance (pool.peek(), 2);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, "not pooled.");
+		Melder_throw (me, U"not pooled.");
 	}
 }
 
@@ -1321,10 +1288,10 @@ static double traceOfSquaredMatrixProduct (double **s1, double **s2, long n) {
 	return trace2;
 }
 
-double Covariance_getProbabilityAtPosition_string (Covariance me, wchar_t *vector) {
+double Covariance_getProbabilityAtPosition_string (Covariance me, char32 *vector) {
 	autoNUMvector<double> v (1, my numberOfColumns);
 	long i = 0;
-	for (wchar_t *token = Melder_firstToken (vector); token != NULL; token = Melder_nextToken ()) {
+	for (char32 *token = Melder_firstToken (vector); token != nullptr; token = Melder_nextToken ()) {
 		v[++i] = Melder_atof (token);
 		if (i == my numberOfColumns) {
 			break;
@@ -1374,18 +1341,18 @@ void Covariance_getMarginalDensityParameters (Covariance me, double *v, double *
 }
 
 double Covariances_getMultivariateCentroidDifference (Covariance me, Covariance thee, int equalCovariances, double *prob, double *fisher, double *df1, double *df2) {
-	long p = my numberOfRows, N = my numberOfObservations + thy numberOfObservations;
-	long N1 = my numberOfObservations, n1 = N1 - 1;
-	long N2 = thy numberOfObservations, n2 = N2 - 1;
+	long p = my numberOfRows, N = (long) floor (my numberOfObservations + thy numberOfObservations);
+	long N1 = (long) floor (my numberOfObservations), n1 = N1 - 1;
+	long N2 = (long) floor (thy numberOfObservations), n2 = N2 - 1;
 
 	double dif = *prob = *fisher = NUMundefined;
 	*df1 = p;
 	*df2 = N - p - 1;
 	if (*df2 < 1) {
-		Melder_throw ("Not enough observations (", N, ") for this test.");
+		Melder_throw (U"Not enough observations (", N, U") for this test.");
 	}
 	if (N1 < p || N2 < p) {
-		Melder_throw ("At least one of the covariances has less observations than variables.");
+		Melder_throw (U"At least one of the covariances has less observations than variables.");
 	}
 
 	dif = 0;
@@ -1450,12 +1417,12 @@ double Covariances_getMultivariateCentroidDifference (Covariance me, Covariance
 void Covariances_equality (Collection me, int method, double *prob, double *chisq, double *df) {
 	try {
 		long nc = my size;
-		double  nsi = 0;
+		double  nsi = 0.0;
 
 		*prob = *chisq = *df = NUMundefined;
 
 		if (nc < 2) {
-			Melder_throw ("We need at least two matrices");
+			Melder_throw (U"We need at least two matrices");
 		}
 
 		long p = 1, ns = 0;
@@ -1466,10 +1433,10 @@ void Covariances_equality (Collection me, int method, double *prob, double *chis
 				p = ci -> numberOfRows;
 			}
 			if (ci -> numberOfRows != p) {
-				Melder_throw ("The dimensions of matrix ", i, " differ from the previous one(s).");
+				Melder_throw (U"The dimensions of matrix ", i, U" differ from the previous one(s).");
 			}
 			if (ni < p) {
-				Melder_throw ("The number of observations in matrix ", i, " is less than the number of variables. ");
+				Melder_throw (U"The number of observations in matrix ", i, U" is less than the number of variables. ");
 			}
 			ns += ni; nsi += 1.0 / ni;
 		}
@@ -1486,12 +1453,12 @@ void Covariances_equality (Collection me, int method, double *prob, double *chis
 			}
 		}
 
-		if (method == 1) { // bartlett
+		if (method == 1) { // bartlett (see Morrison page 297)
 			double lnd;
 			try {
 				NUMdeterminant_cholesky (s.peek(), p, &lnd);
 			} catch (MelderError) {
-				Melder_throw ("Pooled covariance matrix is singular.");
+				Melder_throw (U"Pooled covariance matrix is singular.");
 			}
 
 			double m = ns * lnd;
@@ -1500,14 +1467,14 @@ void Covariances_equality (Collection me, int method, double *prob, double *chis
 				try {
 					NUMdeterminant_cholesky (ci -> data, p, &lnd);
 				} catch (MelderError) {
-					Melder_throw ("Covariance matrix ", i, " is singular.");
+					Melder_throw (U"Covariance matrix ", i, U" is singular.");
 				}
 				m -= (ci -> numberOfObservations - 1) * lnd;
 			}
 
-			double c1 = 1.0 - (2.0 * p * p - 3 * p - 1) / (6.0 * (p + 1) * (nc - 1)) * (nsi - 1 / ns);
+			double c1 = 1.0 - (2.0 * p * p + 3.0 * p - 1.0) / (6.0 * (p + 1) * (nc - 1)) * (nsi - 1 / ns);
 
-			*df = (nc - 1) * p * (p + 1) / 2;
+			*df = (nc - 1.0) * p * (p + 1) / 2.0;
 			*chisq = m * c1;
 		} else if (method == 2) { // Schott (2001) Wald 1
 			// sum(i, ni/n *tr((si*s^-1)^2)- sum(i,sum(j, (ni/n)*(nj/n) *tr(si*s^-1*sj*s^-1))) =
@@ -1515,7 +1482,7 @@ void Covariances_equality (Collection me, int method, double *prob, double *chis
 			//	- 2 * sum (i=1..k, sum(j=1..i-1, (ni/n)*(nj/n) *tr(si*s^-1*sj*s^-1)))
 
 			double trace = 0;
-			NUMlowerCholeskyInverse (s.peek(), p, NULL);
+			NUMlowerCholeskyInverse (s.peek(), p, nullptr);
 			autoNUMmatrix<double> si (NUMinverseFromLowerCholesky (s.peek(), p), 1, 1);
 			for (long i = 1; i <= nc; i++) {
 				Covariance ci = (Covariance) my item[i];
@@ -1528,36 +1495,36 @@ void Covariances_equality (Collection me, int method, double *prob, double *chis
 					double nj = cj -> numberOfObservations - 1;
 					autoNUMmatrix<double> s2 (productOfSquareMatrices (cj -> data, si.peek(), p), 1, 1);
 					double trace_ij = NUMtrace2 (s1.peek(), s2.peek(), p);
-					trace -= 2 * (ni / ns) * (nj / ns) * trace_ij;
+					trace -= 2.0 * (ni / ns) * (nj / ns) * trace_ij;
 				}
 			}
-			*df = (nc - 1) * p * (p + 1) / 2;
-			*chisq = (ns / 2) * trace;
+			*df = (nc - 1) * p * (p + 1) / 2.0;
+			*chisq = (ns / 2.0) * trace;
 		} else {
 			return;
 		}
 		*prob = NUMchiSquareQ (*chisq, *df);
 	} catch (MelderError) {
-		Melder_throw ("Equality coud not be tested.");
+		Melder_throw (U"Equality coud not be tested.");
 	}
 }
 
 void Covariance_difference (Covariance me, Covariance thee, double *prob, double *chisq, long *ndf) {
 	long p = my numberOfRows;
-	long numberOfObservations = my numberOfObservations;
+	long numberOfObservations = (long) floor (my numberOfObservations);
 	double  ln_me, ln_thee;
 
 	if (my numberOfRows != thy numberOfRows) {
-		Melder_throw ("Matrices must have equal dimensions.");
+		Melder_throw (U"Matrices must have equal dimensions.");
 	}
 	if (my numberOfObservations != thy numberOfObservations) {
-		numberOfObservations = (my numberOfObservations > thy numberOfObservations ?
+		numberOfObservations = (long) floor (my numberOfObservations > thy numberOfObservations ?
 		                        thy numberOfObservations : my numberOfObservations) - 1;
-		Melder_warning (L"Covariance_difference: number of observations of matrices do not agree.\n"
-		                " The minimum  size (", Melder_integer (numberOfObservations), L") of the two is used.");
+		Melder_warning (U"Covariance_difference: number of observations of matrices do not agree.\n"
+		                U" The minimum  size (", numberOfObservations, U") of the two is used.");
 	}
 	if (numberOfObservations < 2) {
-		Melder_throw ("Number of observations too small.");
+		Melder_throw (U"Number of observations too small.");
 	}
 
 	autoNUMmatrix<double> linv (NUMmatrix_copy (thy data, 1, p, 1, p), 1, 1);
@@ -1573,7 +1540,7 @@ void Covariance_difference (Covariance me, Covariance thee, double *prob, double
 		where Lm = L^(-1)
 	*/
 
-	double trace = 0;
+	double trace = 0.0;
 	for (long i = 1; i <= p; i++) {
 		for (long j = 1; j <= p; j++) {
 			long lp = MAX (j, i);
@@ -1584,23 +1551,23 @@ void Covariance_difference (Covariance me, Covariance thee, double *prob, double
 	}
 
 	double l = (numberOfObservations - 1) * fabs (ln_thee - ln_me + trace - p);
-	*chisq = l * fabs (1 - (2 * p + 1 - 2 / (p + 1)) / (numberOfObservations - 1) / 6);
+	*chisq = l * fabs (1.0 - (2.0 * p + 1.0 - 2.0 / (p + 1)) / (numberOfObservations - 1) / 6.0);
 	*ndf = p * (p + 1) / 2;
 	*prob = NUMchiSquareQ (*chisq, *ndf);
 }
 
 static void checkOneIndex (TableOfReal me, long index) {
 	if (index < 1 || index > my numberOfColumns) {
-		Melder_throw ("Index must be in interval [1, ", my numberOfColumns, "].");
+		Melder_throw (U"Index must be in interval [1, ", my numberOfColumns, U"].");
 	}
 }
 
 static void checkTwoIndices (TableOfReal me, long index1, long index2) {
 	if (index1 < 1 || index1 > my numberOfColumns || index2 < 1 || index2 > my numberOfColumns) {
-		Melder_throw ("Index must be in interval [1, ", my numberOfColumns, "].");
+		Melder_throw (U"Index must be in interval [1, ", my numberOfColumns, U"].");
 	}
 	if (index1 == index2) {
-		Melder_throw ("Indices must be different.");
+		Melder_throw (U"Indices must be different.");
 	}
 }
 
@@ -1612,22 +1579,22 @@ void Covariance_getSignificanceOfOneMean (Covariance me, long index, double mu,
 
 	checkOneIndex (me, index);
 
-	if ( (var = my data[index][index]) == 0) {
+	if ( (var = my data[index][index]) == 0.0) {
 		return;
 	}
 
 	*t = (my centroid[index] - mu) / sqrt (var / my numberOfObservations);
-	*probability = 2 * NUMstudentQ (fabs (*t), *ndf);
+	*probability = 2.0 * NUMstudentQ (fabs (*t), *ndf);
 }
 
 void Covariance_getSignificanceOfMeansDifference (Covariance me,
         long index1, long index2, double mu, int paired, int equalVariances,
         double *probability, double *t, double *ndf) {
-	long n = my numberOfObservations;
+	long n = (long) floor (my numberOfObservations);
 	double df, var1, var2, var_pooled;
 
 	*probability = *t = NUMundefined;
-	*ndf = 2 * (n - 1);
+	*ndf = 2.0 * (n - 1);
 
 	checkTwoIndices (me, index1, index2);
 
@@ -1636,17 +1603,17 @@ void Covariance_getSignificanceOfMeansDifference (Covariance me,
 
 	var_pooled = var1 + var2;
 	if (var_pooled == 0) {
-		Melder_warning (L"The pooled variance turned out to be zero. Check your data. ");
+		Melder_warning (U"The pooled variance turned out to be zero. Check your data. ");
 		return;
 	}
 	if (paired) {
-		var_pooled -= 2 * my data[index1][index2];
-		*ndf /= 2;
+		var_pooled -= 2.0 * my data[index1][index2];
+		*ndf /= 2.0;
 	}
 
-	if (var_pooled == 0) {
-		Melder_warning (L"The pooled variance with the paired correction turned out to be zero. ");
-		*probability = 0;
+	if (var_pooled == 0.0) {
+		Melder_warning (U"The pooled variance with the paired correction turned out to be zero. ");
+		*probability = 0.0;
 		return;
 	}
 
@@ -1657,37 +1624,34 @@ void Covariance_getSignificanceOfMeansDifference (Covariance me,
 	*/
 
 	if (equalVariances) {
-		*probability = 2 * NUMstudentQ (fabs (*t), *ndf);
+		*probability = 2.0 * NUMstudentQ (fabs (*t), *ndf);
 	} else {
-		df = (1 + 2 * var1 * var2 / (var1 * var1 + var2 * var2)) * (n - 1);
-		*probability = NUMincompleteBeta (df / 2, 0.5, df / (df + (*t) * (*t)));
+		df = (1.0 + 2.0 * var1 * var2 / (var1 * var1 + var2 * var2)) * (n - 1);
+		*probability = NUMincompleteBeta (df / 2.0, 0.5, df / (df + (*t) * (*t)));
 		*ndf = df;
 	}
 }
 
-void Covariance_getSignificanceOfOneVariance (Covariance me, long index,
-        double sigmasq, double *probability, double *chisq, long *ndf) {
+void Covariance_getSignificanceOfOneVariance (Covariance me, long index, double sigmasq, double *probability, double *chisq, long *ndf) {
 	double var;
 	*probability = *chisq = NUMundefined;
-	*ndf = my numberOfObservations - 1;
+	*ndf = (long) floor (my numberOfObservations) - 1;
 
 	checkOneIndex (me, index);
 
-	if ( (var = my data[index][index]) == 0) {
+	if ((var = my data[index][index]) == 0.0) {
 		return;
 	}
 
 	*chisq = *ndf;
-	if (sigmasq != 0) {
+	if (sigmasq != 0.0) {
 		*chisq = *ndf * var / sigmasq;
 	}
 	*probability = NUMchiSquareQ (*chisq, *ndf);
 }
 
-void Covariance_getSignificanceOfVariancesRatio (Covariance me,
-        long index1, long index2, double ratio, double *probability,
-        double *f, long *ndf) {
-	long n = my numberOfObservations;
+void Covariance_getSignificanceOfVariancesRatio (Covariance me, long index1, long index2, double ratio, double *probability, double *f, long *ndf) {
+	long n = (long) floor (my numberOfObservations);
 	double var1, var2, ratio2;
 
 	*ndf = n - 1; *probability = *f = NUMundefined;
@@ -1696,7 +1660,7 @@ void Covariance_getSignificanceOfVariancesRatio (Covariance me,
 	var1 = my data[index1][index1];
 	var2 = my data[index2][index2];
 
-	if (var1 == 0 || var2 == 0) {
+	if (var1 == 0.0 || var2 == 0.0) {
 		return;
 	}
 
@@ -1705,9 +1669,9 @@ void Covariance_getSignificanceOfVariancesRatio (Covariance me,
 		ratio2 = (var2 / var1) * ratio;
 	}
 
-	*probability = 2 * NUMfisherQ (ratio2, *ndf, *ndf);
-	if (*probability > 1) {
-		*probability = 2 - *probability;
+	*probability = 2.0 * NUMfisherQ (ratio2, *ndf, *ndf);
+	if (*probability > 1.0) {
+		*probability = 2.0 - *probability;
 	}
 }
 
@@ -1715,22 +1679,22 @@ TableOfReal Correlation_confidenceIntervals (Correlation me, double confidenceLe
 	try {
 		long m_bonferroni = my numberOfRows * (my numberOfRows - 1) / 2;
 
-		if (confidenceLevel <= 0 || confidenceLevel > 1) {
-			Melder_throw ("Confidence level must be in interval (0-1).");
+		if (confidenceLevel <= 0 || confidenceLevel > 1.0) {
+			Melder_throw (U"Confidence level must be in interval (0-1).");
 		}
 
 		if (my numberOfObservations < 5) {
-			Melder_throw ("The number of observations must be greater than 4.");
+			Melder_throw (U"The number of observations must be greater than 4.");
 		}
 
 		if (numberOfTests < 0) {
-			Melder_throw ("The \"number of tests\" cannot be less than zero.");
+			Melder_throw (U"The \"number of tests\" cannot be less than zero.");
 		} else if (numberOfTests == 0) {
 			numberOfTests = m_bonferroni;
 		}
 
 		if (numberOfTests > m_bonferroni) {
-			Melder_warning (L"The \"number of tests\" exceeds the number of elements in the Correlation object.");
+			Melder_warning (U"The \"number of tests\" exceeds the number of elements in the Correlation object.");
 		}
 
 		autoTableOfReal thee = TableOfReal_create (my numberOfRows, my numberOfRows);
@@ -1744,9 +1708,9 @@ TableOfReal Correlation_confidenceIntervals (Correlation me, double confidenceLe
 		// values of confidence intervals in lower part of resulting table.
 
 
-		double z = NUMinvGaussQ ( (1 - confidenceLevel) / (2 * numberOfTests));
-		double zf = z / sqrt (my numberOfObservations - 3);
-		double  two_n = 2 * my numberOfObservations;
+		double z = NUMinvGaussQ ( (1 - confidenceLevel) / (2.0 * numberOfTests));
+		double zf = z / sqrt (my numberOfObservations - 3.0);
+		double  two_n = 2.0 * my numberOfObservations;
 
 		for (long i = 1; i <= my numberOfRows; i++) {
 			for (long j = i + 1; j <= my numberOfRows; j++) {
@@ -1760,10 +1724,10 @@ TableOfReal Correlation_confidenceIntervals (Correlation me, double confidenceLe
 				} else if (method == 1) {
 					// Ruben's approximation
 
-					double rs = rij / sqrt (1 - rij * rij);
-					double a = two_n - 3 - z * z;
-					double b = rs * sqrt ( (two_n - 3) * (two_n - 5));
-					double c = (a - 2) * rs * rs - 2 * z * z;
+					double rs = rij / sqrt (1.0 - rij * rij);
+					double a = two_n - 3.0 - z * z;
+					double b = rs * sqrt ( (two_n - 3.0) * (two_n - 5.0));
+					double c = (a - 2.0) * rs * rs - 2.0 * z * z;
 
 					// Solve:  a y^2 - 2b y + c = 0
 					// q = -0.5((-2b) + sgn(-2b) sqrt((-2b)^2 - 4ac))
@@ -1775,8 +1739,8 @@ TableOfReal Correlation_confidenceIntervals (Correlation me, double confidenceLe
 						d = - d;
 					}
 					q = b - d;
-					rmin = q / a; rmin /= sqrt (1 + rmin * rmin);
-					rmax = c / q; rmax /= sqrt (1 + rmax * rmax);
+					rmin = q / a; rmin /= sqrt (1.0 + rmin * rmin);
+					rmax = c / q; rmax /= sqrt (1.0 + rmax * rmax);
 					if (rmin > rmax) {
 						double t = rmin; rmin = rmax; rmax = t;
 					}
@@ -1790,7 +1754,7 @@ TableOfReal Correlation_confidenceIntervals (Correlation me, double confidenceLe
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": confidence intervals not created.");
+		Melder_throw (me, U": confidence intervals not created.");
 	}
 }
 
@@ -1808,19 +1772,18 @@ void Correlation_testDiagonality_bartlett (Correlation me, long numberOfContrain
 		numberOfContraints = 1;
 	}
 	if (numberOfContraints > my numberOfObservations) {
-		Melder_warning (L"Correlation_testDiagonality_bartlett: number of constraints cannot exceed the number of observations.");
+		Melder_warning (U"Correlation_testDiagonality_bartlett: number of constraints cannot exceed the number of observations.");
 		return;
 	}
 	long p = my numberOfRows;
 	double ln_determinant;
 	NUMdeterminant_cholesky (my data, p, &ln_determinant);
 
-	*chisq = - ln_determinant * (my numberOfObservations - numberOfContraints - (2 * p + 5) / 6);
-	*probability = NUMchiSquareQ (*chisq, p * (p - 1) / 2);
+	*chisq = - ln_determinant * (my numberOfObservations - numberOfContraints - (2.0 * p + 5.0) / 6.0);
+	*probability = NUMchiSquareQ (*chisq, p * (p - 1) / 2.0);
 }
 
-void SSCP_expand (I) {
-	iam (SSCP);
+void SSCP_expand (SSCP me) {
 
 	// A reduced matrix has my numberOfRows < my numberOfColumns.
 	// After expansion:
@@ -1830,7 +1793,7 @@ void SSCP_expand (I) {
 	// my expansion = my data (before)
 	// No expansion for a standard matrix or if already expanded and data has not changed!
 
-	if ( (my expansionNumberOfRows == 0 && my numberOfRows == my numberOfColumns) ||
+	if ((my expansionNumberOfRows == 0 && my numberOfRows == my numberOfColumns) ||
 	        (my expansionNumberOfRows > 0 && ! my dataChanged)) {
 		return;
 	}
@@ -1839,8 +1802,8 @@ void SSCP_expand (I) {
 	}
 	for (long ir = 1; ir <= my numberOfColumns; ir++) {
 		for (long ic = ir; ic <= my numberOfColumns; ic++) {
-			long dij = abs (ir - ic);
-			my expansion[ir][ic] = my expansion[ic][ir] = dij < my numberOfRows ? my data[dij + 1][ic] : 0;
+			long dij = labs (ir - ic);
+			my expansion[ir][ic] = my expansion[ic][ir] = dij < my numberOfRows ? my data[dij + 1][ic] : 0.0;
 		}
 	}
 	// Now make 'my data' point to 'my expansion'
@@ -1850,28 +1813,26 @@ void SSCP_expand (I) {
 	my dataChanged = 0;
 }
 
-void SSCP_unExpand (I) {
-	iam (SSCP);
+void SSCP_unExpand (SSCP me) {
 	if (my expansionNumberOfRows == 0) {
 		return;
 	}
 	NUMmatrix_free (my data, 1, 1);
 	my data = my expansion;
-	my expansion = 0;
+	my expansion = nullptr;
 	my numberOfRows = my expansionNumberOfRows;
 	my expansionNumberOfRows = 0;
 	my dataChanged = 0;
 }
 
-void SSCP_expandLowerCholesky (I) {
-	iam (SSCP);
-	if (my lowerCholesky == 0) {
+void SSCP_expandLowerCholesky (SSCP me) {
+	if (! my lowerCholesky) {
 		my lowerCholesky = NUMmatrix<double> (1, my numberOfRows, 1, my numberOfColumns);
 	}
 	if (my numberOfRows == 1) { // diagonal
-		my lnd = 0;
+		my lnd = 0.0;
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			my lowerCholesky[1][j] = 1 / sqrt (my data[1][j]); // inverse is 1/stddev
+			my lowerCholesky[1][j] = 1.0 / sqrt (my data[1][j]); // inverse is 1/stddev
 			my lnd += log (my data[1][j]); // diagonal elmnt is variance
 		}
 	} else {
@@ -1884,34 +1845,31 @@ void SSCP_expandLowerCholesky (I) {
 			NUMlowerCholeskyInverse (my lowerCholesky, my numberOfColumns, & (my lnd));
 		} catch (MelderError) {
 			// singular matrix: arrange a diagonal only inverse.
-			my lnd = 0;
+			my lnd = 0.0;
 			for (long i = 1; i <= my numberOfRows; i++) {
 				for (long j = i; j <= my numberOfColumns; j++) {
-					my lowerCholesky[i][j] =  my lowerCholesky[j][i] = i == j ? 1. / sqrt (my data[i][i]) : 0;
+					my lowerCholesky[i][j] =  my lowerCholesky[j][i] = i == j ? 1.0 / sqrt (my data[i][i]) : 0.0;
 				}
 				my lnd += log (my data[i][i]);
 			}
-			my lnd *= 2;
+			my lnd *= 2.0;
 		}
 	}
 }
 
-void SSCP_unExpandLowerCholesky (I) {
-	iam (SSCP);
+void SSCP_unExpandLowerCholesky (SSCP me) {
 	NUMmatrix_free (my lowerCholesky, 1, 1);
-	my lnd = 0;
+	my lnd = 0.0;
 }
 
-void SSCP_expandPCA (I) {
-	iam (SSCP);
-	if (my pca != 0) {
+void SSCP_expandPCA (SSCP me) {
+	if (my pca) {
 		forget (my pca);
 	}
 	my pca = SSCP_to_PCA (me);
 }
 
-void SSCP_unExpandPCA (I) {
-	iam (SSCP);
+void SSCP_unExpandPCA (SSCP me) {
 	forget (my pca);
 }
 
@@ -1919,4 +1877,4 @@ void SSCP_unExpandPCA (I) {
 #undef MAX
 #undef MIN
 
-/* End of file SSCP.c 2148*/
+/* End of file SSCP.c */
diff --git a/dwtools/SSCP.h b/dwtools/SSCP.h
index 0c1c244..9dcc5e1 100644
--- a/dwtools/SSCP.h
+++ b/dwtools/SSCP.h
@@ -39,32 +39,32 @@ Thing_define (Correlation, SSCP) {
 Thing_define (SSCPs, Ordered) {
 };
 
-void SSCP_init (I, long dimension, long storage);
+void SSCP_init (SSCP me, long dimension, long storage);
 
 SSCP SSCP_create (long dimension);
 
-void SSCP_drawTwoDimensionalEllipse_inside  (SSCP me, Graphics g, double scale, wchar_t * label, int fontSize);
-double SSCP_getEllipseScalefactor (I, double scale, int confidence);
+void SSCP_drawTwoDimensionalEllipse_inside  (SSCP me, Graphics g, double scale, char32 * label, int fontSize);
+double SSCP_getEllipseScalefactor (SSCP me, double scale, int confidence);
 void SSCP_drawConcentrationEllipse (SSCP me, Graphics g, double scale, int confidence,
 	long d1, long d2, double xmin, double xmax, double ymin, double ymax, int garnish);
 
-void SSCP_setNumberOfObservations (I, double numberOfObservations);
-void SSCP_setCentroid (I, long component, double value); // only SSCP & Covariance
-void SSCP_setValue (I, long row, long col, double value); // only SSCP & Covariance
+void SSCP_setNumberOfObservations (SSCP me, double numberOfObservations);
+void SSCP_setCentroid (SSCP me, long component, double value); // only SSCP & Covariance
+void SSCP_setValue (SSCP me, long row, long col, double value); // only SSCP & Covariance
 
-double SSCP_getNumberOfObservations (I);
-double SSCP_getDegreesOfFreedom (I);
-double SSCP_getTotalVariance (I);
-double SSCP_getCumulativeContributionOfComponents (I, long from, long to);
-double SSCP_getLnDeterminant (I);
-double SSCP_getConcentrationEllipseArea(I, double scale, int confidence, long d1, long d2);
-double SSCP_getFractionVariation (I, long from, long to);
+double SSCP_getNumberOfObservations (SSCP me);
+double SSCP_getDegreesOfFreedom (SSCP me);
+double SSCP_getTotalVariance (SSCP me);
+double SSCP_getCumulativeContributionOfComponents (SSCP me, long from, long to);
+double SSCP_getLnDeterminant (SSCP me);
+double SSCP_getConcentrationEllipseArea(SSCP me, double scale, int confidence, long d1, long d2);
+double SSCP_getFractionVariation (SSCP me, long from, long to);
 
-SSCP TableOfReal_to_SSCP (I, long rowb, long rowe, long colb, long cole);
+SSCP TableOfReal_to_SSCP (TableOfReal me, long rowb, long rowe, long colb, long cole);
 
-TableOfReal SSCP_and_TableOfReal_extractDistanceQuantileRange (SSCP me, thou,
+TableOfReal SSCP_and_TableOfReal_extractDistanceQuantileRange (SSCP me, TableOfReal thee,
 	double qlow, double qhigh);
-TableOfReal Covariance_and_TableOfReal_extractDistanceQuantileRange (Covariance me, thou,
+TableOfReal Covariance_and_TableOfReal_extractDistanceQuantileRange (Covariance me, TableOfReal thee,
 	double qlow, double qhigh);
 /*
 	Select from a TableOfReal the rows whose Mahalanobis distance to the centroid
@@ -78,13 +78,13 @@ TableOfReal Covariance_and_TableOfReal_mahalanobis (Covariance me, thou, bool us
 */
 
 
-Covariance TableOfReal_to_Covariance (I);
+Covariance TableOfReal_to_Covariance (TableOfReal me);
 
-Correlation TableOfReal_to_Correlation (I);
-Correlation TableOfReal_to_Correlation_rank (I);
+Correlation TableOfReal_to_Correlation (TableOfReal me);
+Correlation TableOfReal_to_Correlation_rank (TableOfReal me);
 
 TableOfReal SSCP_to_TableOfReal (SSCP me);
-TableOfReal SSCP_extractCentroid (I);
+TableOfReal SSCP_extractCentroid (SSCP me);
 
 TableOfReal Covariance_to_TableOfReal_randomSampling (Covariance me, long numberOfData);
 /* Generate a table with data based on the covariance matrix */
@@ -102,17 +102,17 @@ void Covariance_and_PCA_generateOneVector (Covariance me, PCA thee, double *vec,
 		4. buf, a vector of length my numberOfColumns, is needed so the routine cannot fail
 */
 
-SSCPs TableOfReal_to_SSCPs_byLabel (I);
+SSCPs TableOfReal_to_SSCPs_byLabel (TableOfReal me);
 
-PCA SSCP_to_PCA (I);
+PCA SSCP_to_PCA (SSCP me);
 
-void SSCP_expandPCA (I);
-void SSCP_unExpandPCA (I);
+void SSCP_expandPCA (SSCP me);
+void SSCP_unExpandPCA (SSCP me);
 
-CCA SSCP_to_CCA (I, long ny);
+CCA SSCP_to_CCA (SSCP me, long ny);
 
 Covariance Covariance_create (long dimension);
-Covariance Covariance_createSimple (wchar_t *covars, wchar_t *centroid, long numberOfObservations);
+Covariance Covariance_createSimple (char32 *covars, char32 *centroid, long numberOfObservations);
 Covariance Covariance_create_reduceStorage (long dimension, long storage);
 /*
 	storage 0 or >= dimension: complete matrix
@@ -144,7 +144,7 @@ TableOfReal Correlation_confidenceIntervals (Correlation me,
 void Covariance_getMarginalDensityParameters (Covariance me, double *vector, double *mu, double *stdev);
 double Covariance_getMarginalProbabilityAtPosition (Covariance me, double *vector, double x);
 
-double Covariance_getProbabilityAtPosition_string (Covariance me, wchar_t *xpos);
+double Covariance_getProbabilityAtPosition_string (Covariance me, char32 *xpos);
 double Covariance_getProbabilityAtPosition (Covariance me, double *x);
 /* evaluate the pdf(x,mu,Sigma) at x */
 
@@ -158,9 +158,9 @@ void Correlation_testDiagonality_bartlett (Correlation me,
 	long numberOfContraints, double *chisq, double *probability);
 /* Test whether matrices are diagonal matrices, Morrison, page 118 */
 
-Correlation SSCP_to_Correlation (I);
+Correlation SSCP_to_Correlation (SSCP me);
 
-Configuration SSCP_to_Configuration (I, long numberOfDimensions);
+Configuration SSCP_to_Configuration (SSCP me, long numberOfDimensions);
 
 Configuration Covariance_to_Configuration (Covariance me, long numberOfDimensions);
 
@@ -200,7 +200,7 @@ void Covariances_equality (Collection me, int method, double *prob, double *chis
 
 SSCPs SSCPs_create ();
 
-SSCPs TableOfReal_to_SSCPs_byLabel (I);
+SSCPs TableOfReal_to_SSCPs_byLabel (TableOfReal me);
 
 SSCP SSCPs_to_SSCP_sum (SSCPs me);
 /* Sum the sscp's and weigh each means with it's numberOfObservations. */
@@ -210,20 +210,20 @@ SSCP SSCPs_to_SSCP_pool (SSCPs me);
 void SSCPs_getHomegeneityOfCovariances_box (SSCPs me, double *probability,
 	double *chisq, long *ndf);
 
-SSCP SSCP_toTwoDimensions (I, double *v1, double *v2);
+SSCP SSCP_toTwoDimensions (SSCP me, double *v1, double *v2);
 SSCPs SSCPs_toTwoDimensions (SSCPs me, double *v1, double *v2);
 SSCPs SSCPs_extractTwoDimensions (SSCPs me, long d1, long d2);
 
 /* For inheritors */
 
 void SSCPs_drawConcentrationEllipses (SSCPs me, Graphics g, double scale,
-	int confidence, const wchar_t *label, long d1, long d2, double xmin, double xmax,
+	int confidence, const char32 *label, long d1, long d2, double xmin, double xmax,
 	double ymin, double ymax, int fontSize, int garnish);
 
 void SSCPs_getEllipsesBoundingBoxCoordinates (SSCPs me, double scale, int confidence,
 	double *xmin, double *xmax, double *ymin, double *ymax);
 
-void SSCP_expand (I);
+void SSCP_expand (SSCP me);
 /*
 	Expand a reduced storage SSCP. For efficiency reasons, the expanded matrix is kept in memory.
 	Successive calls to SSCP_expand don't change anything unless
@@ -236,10 +236,10 @@ void SSCP_expand (I);
 	PCA thee = SSCP_to_PCA (me);
 */
 
-void SSCP_unExpand (I);
+void SSCP_unExpand (SSCP me);
 /* Use only if the memory is really needed! */
 
-void SSCP_expandLowerCholesky (I); // create lower square root of covariance matrix
-void SSCP_unExpandLowerCholesky (I);
+void SSCP_expandLowerCholesky (SSCP me); // create lower square root of covariance matrix
+void SSCP_unExpandLowerCholesky (SSCP me);
 
 #endif /* _SSCP_h_ */
diff --git a/dwtools/SSCP_def.h b/dwtools/SSCP_def.h
index 7a14ed0..3c1a1e0 100644
--- a/dwtools/SSCP_def.h
+++ b/dwtools/SSCP_def.h
@@ -37,8 +37,8 @@ oo_DEFINE_CLASS (SSCP, TableOfReal)
 		oo_OBJECT (PCA, 0, pca)
 	#endif
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (SSCP)
diff --git a/dwtools/Sampled2.cpp b/dwtools/Sampled2.cpp
index 837f692..1cc83e9 100644
--- a/dwtools/Sampled2.cpp
+++ b/dwtools/Sampled2.cpp
@@ -39,7 +39,7 @@
 
 Thing_implement (Sampled2, Sampled, 0);
 
-void structSampled2 :: v_readText (MelderReadText text) {
+void structSampled2 :: v_readText (MelderReadText text, int /*formatVersion*/) {
 	xmin = texgetr8 (text);
 	xmax = texgetr8 (text);
 	nx = texgeti4 (text);
@@ -51,13 +51,13 @@ void structSampled2 :: v_readText (MelderReadText text) {
 	dy = texgetr8 (text);
 	y1 = texgetr8 (text);
 	if (xmin > xmax || ymin > ymax) {
-		Melder_throw ("xmax should be greater than xmax and ymax should be greater than ymin.");
+		Melder_throw (U"xmax should be greater than xmax and ymax should be greater than ymin.");
 	}
 	if (nx < 1 || ny < 1) {
-		Melder_throw ("nx and ny should be at least 1.");
+		Melder_throw (U"nx and ny should be at least 1.");
 	}
 	if (dx <= 0 || dy <= 0) {
-		Melder_throw ("dx and dy should be positive.");
+		Melder_throw (U"dx and dy should be positive.");
 	}
 }
 
diff --git a/dwtools/Sound_and_FilterBank.cpp b/dwtools/Sound_and_FilterBank.cpp
new file mode 100644
index 0000000..0bd004a
--- /dev/null
+++ b/dwtools/Sound_and_FilterBank.cpp
@@ -0,0 +1,421 @@
+/* Sound_and_FilterBank.cpp
+ *
+ * Copyright (C) 1993-2013 David Weenink
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ djmw 20010718
+ djmw 20020813 GPL header.
+ djmw 20041124 Changed call to Sound_to_Spectrum.
+ djmw 20070103 Sound interface changes
+ djmw 20071107 Errors/warnings text changes
+ djmw 20071202 Melder_warning<n>
+*/
+
+#include "Sound_and_FilterBank.h"
+#include "Sound_extensions.h"
+#include "Sound_and_Spectrum.h"
+#include "Sound_to_Pitch.h"
+#include "Vector.h"
+#include "NUM2.h"
+
+#define MIN(m,n) ((m) < (n) ? (m) : (n))
+// prototypes
+Sound FilterBank_as_Sound (FilterBank me);
+
+/*
+	The gaussian(x) = (exp(-48*((i-(n+1)/2)/(n+1))^2)-exp(-12))/(1-exp(-12));
+	For power we need the area under the square of this window:
+		Integrate (gaussian(i)^2,i=1..n) =
+
+	(sqrt(Pi)*sqrt(3)*sqrt(2)*erf(2*(n-1)*sqrt(3)*sqrt(2)/(n+1))*(n+1)+
+		24*exp(-24)*(n-1)+
+	-4*sqrt(Pi)*sqrt(3)*exp(-12)*erf(2*(n-1)*sqrt(3)/(n+1))*(n+1))/
+	(24 * (-1+exp(-12))^2)
+	To compare with the rectangular window we need to divide this by the
+	window width (n-1) x 1^2.
+*/
+static double gaussian_window_squared_correction (long n) {
+	double e12 = exp (-12), denum = (e12 - 1) * (e12 - 1) * 24 * (n - 1);
+	double sqrt3 = sqrt (3), sqrt2 = sqrt (2), sqrtpi = sqrt (NUMpi);
+	double arg1 = 2 * sqrt3 * (n - 1) / (n + 1), arg2 = arg1 * sqrt2;
+	double p2 = sqrtpi * sqrt3 * sqrt2 * (1 - NUMerfcc (arg2)) * (n + 1);
+	double p1 = 4 * sqrtpi * sqrt3 * e12 * (1 - NUMerfcc (arg1)) * (n + 1);
+
+	return (p2 - p1 + 24 * (n - 1) * e12 * e12) / denum;
+}
+
+static Matrix Sound_to_spectralpower (Sound me) {
+	try {
+		autoSpectrum s = Sound_to_Spectrum (me, TRUE);
+		autoMatrix thee = Matrix_create (s -> xmin, s -> xmax, s -> nx, s -> dx, s -> x1, 1, 1, 1, 1, 1);
+		double scale = 2.0 * s -> dx / (my xmax - my xmin);
+
+		// factor '2' because of positive and negative frequencies
+		// s -> dx : width of frequency bin
+		// my xmax - my xmin : duration of sound
+
+		double *z = thy z[1], *re = s -> z[1], *im = s -> z[2];
+		for (long i = 1; i <= s -> nx; i++) {
+			z[i] = scale * (re[i] * re[i] + im[i] * im [i]);
+		}
+
+		// Frequency bins at 0 Hz and nyquist don't count for two.
+
+		z[1] *= 0.5;
+		z[s -> nx] *= 0.5;
+		return thee.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, ": no Matrix with spectral power created.");
+	}
+}
+
+static int Sound_into_BarkFilter_frame (Sound me, BarkFilter thee, long frame) {
+	autoMatrix pv = Sound_to_spectralpower (me);
+	long nf = pv -> nx;
+	autoNUMvector<double> z (1, nf);
+
+	for (long j = 1; j <= nf; j++) {
+		z[j] = HZTOBARK (pv -> x1 + (j - 1) * pv -> dx);
+	}
+
+	for (long i = 1; i <= thy ny; i++) {
+		double p = 0;
+		double z0 = thy y1 + (i - 1) * thy dy;
+		double *pow = pv -> z[1]; // TODO ??
+		for (long j = 1; j <= nf; j++) {
+			// Sekey & Hanson filter is defined in the power domain.
+			// We therefore multiply the power with a (and not a^2).
+			// integral (F(z),z=0..25) = 1.58/9
+
+			double a = NUMsekeyhansonfilter_amplitude (z0, z[j]);
+			p += a * pow[j] ;
+		}
+		thy z[i][frame] = p;
+	}
+	return 1;
+}
+
+BarkFilter Sound_to_BarkFilter (Sound me, double analysisWidth, double dt, double f1_bark, double fmax_bark, double df_bark) {
+	try {
+		double t1, nyquist = 0.5 / my dx, samplingFrequency = 2 * nyquist;
+		double windowDuration = 2 * analysisWidth; /* gaussian window */
+		double zmax = NUMhertzToBark2 (nyquist);
+		double fmin_bark = 0;
+		long nt, frameErrorCount = 0;
+
+		// Check defaults.
+
+		if (f1_bark <= 0) {
+			f1_bark = 1;
+		}
+		if (fmax_bark <= 0) {
+			fmax_bark = zmax;
+		}
+		if (df_bark <= 0) {
+			df_bark = 1;
+		}
+
+		fmax_bark = MIN (fmax_bark, zmax);
+		long nf = floor ( (fmax_bark - f1_bark) / df_bark + 0.5);
+		if (nf <= 0) {
+			Melder_throw ("The combination of filter parameters is not valid.");
+		}
+
+		Sampled_shortTermAnalysis (me, windowDuration, dt, & nt, & t1);
+		autoSound sframe = Sound_createSimple (1, windowDuration, samplingFrequency);
+		autoSound window = Sound_createGaussian (windowDuration, samplingFrequency);
+		autoBarkFilter thee = BarkFilter_create (my xmin, my xmax, nt, dt, t1,
+		                      fmin_bark, fmax_bark, nf, df_bark, f1_bark);
+
+		autoMelderProgress progess (L"BarkFilter analysis");
+
+		for (long i = 1; i <= nt; i++) {
+			double t = Sampled_indexToX (thee.peek(), i);
+
+			Sound_into_Sound (me, sframe.peek(), t - windowDuration / 2);
+
+			Sounds_multiply (sframe.peek(), window.peek());
+
+			if (! Sound_into_BarkFilter_frame (sframe.peek(), thee.peek(), i)) {
+				frameErrorCount++;
+			}
+
+			if ( (i % 10) == 1) {
+				Melder_progress ( (double) i / nt,  L"BarkFilter analysis: frame ",
+					Melder_integer (i), L" from ", Melder_integer (nt), L".");
+			}
+		}
+
+		if (frameErrorCount > 0) {
+			Melder_warning (L"Analysis results of ", Melder_integer (frameErrorCount), L" frame(s) out of ",
+				Melder_integer (nt), L" will be suspect.");
+		}
+
+		double ref = FilterBank_DBREF * gaussian_window_squared_correction (window -> nx);
+
+		NUMdmatrix_to_dBs (thy z, 1, thy ny, 1, thy nx, ref, FilterBank_DBFAC, FilterBank_DBFLOOR);
+		return thee.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, ": no BarkFilter created.");
+	}
+}
+
+static int Sound_into_MelFilter_frame (Sound me, MelFilter thee, long frame) {
+	autoMatrix pv = Sound_to_spectralpower (me);
+
+	double z1 = pv -> x1;
+	double dz = pv -> dx;
+	long nf = pv -> nx;
+	double df = thy dy;
+	for (long i = 1; i <= thy ny; i++) {
+		double p = 0;
+		double fc_mel = thy y1 + (i - 1) * df;
+		double fc_hz = MELTOHZ (fc_mel);
+		double fl_hz = MELTOHZ (fc_mel - df);
+		double fh_hz =  MELTOHZ (fc_mel + df);
+		double *pow = pv -> z[1];
+		for (long j = 1; j <= nf; j++) {
+			// Bin with a triangular filter the power (=amplitude-squared)
+
+			double f = z1 + (j - 1) * dz;
+			double a = NUMtriangularfilter_amplitude (fl_hz, fc_hz, fh_hz, f);
+			p += a * pow[j];
+		}
+		thy z[i][frame] = p;
+	}
+	return 1;
+}
+
+MelFilter Sound_to_MelFilter (Sound me, double analysisWidth, double dt, double f1_mel, double fmax_mel, double df_mel) {
+	try {
+		double t1, samplingFrequency = 1 / my dx, nyquist = 0.5 * samplingFrequency;
+		double windowDuration = 2 * analysisWidth; /* gaussian window */
+		double fmin_mel = 0;
+		double fbottom = HZTOMEL (100.0), fceiling = HZTOMEL (nyquist);
+		long nt, frameErrorCount = 0;
+
+		// Check defaults.
+
+		if (fmax_mel <= 0 || fmax_mel > fceiling) {
+			fmax_mel = fceiling;
+		}
+		if (fmax_mel <= f1_mel) {
+			f1_mel = fbottom; fmax_mel = fceiling;
+		}
+		if (f1_mel <= 0) {
+			f1_mel = fbottom;
+		}
+		if (df_mel <= 0) {
+			df_mel = 100.0;
+		}
+
+		// Determine the number of filters.
+
+		long nf = floor ((fmax_mel - f1_mel) / df_mel + 0.5);
+		fmax_mel = f1_mel + nf * df_mel;
+
+		Sampled_shortTermAnalysis (me, windowDuration, dt, &nt, &t1);
+		autoSound sframe = Sound_createSimple (1, windowDuration, samplingFrequency);
+		autoSound window = Sound_createGaussian (windowDuration, samplingFrequency);
+		autoMelFilter thee = MelFilter_create (my xmin, my xmax, nt, dt, t1, fmin_mel, fmax_mel, nf, df_mel, f1_mel);
+
+		autoMelderProgress progress (L"MelFilters analysis");
+
+		for (long i = 1; i <= nt; i++) {
+			double t = Sampled_indexToX (thee.peek(), i);
+			Sound_into_Sound (me, sframe.peek(), t - windowDuration / 2);
+			Sounds_multiply (sframe.peek(), window.peek());
+			if (! Sound_into_MelFilter_frame (sframe.peek(), thee.peek(), i)) {
+				frameErrorCount++;
+			}
+			if ( (i % 10) == 1) {
+				Melder_progress ((double) i / nt, L"Frame ", Melder_integer (i), L" out of ", Melder_integer (nt), L".");
+			}
+		}
+
+		if (frameErrorCount) {
+			Melder_warning (L"Analysis results of ", Melder_integer (frameErrorCount),
+			L" frame(s) out of ", Melder_integer (nt), L" will be suspect.");
+		}
+
+		// Window correction.
+
+		double ref = FilterBank_DBREF * gaussian_window_squared_correction (window -> nx);
+
+		NUMdmatrix_to_dBs (thy z, 1, thy ny, 1, thy nx, ref, FilterBank_DBFAC, FilterBank_DBFLOOR);
+		return thee.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, ": no MelFilter created.");
+	}
+}
+
+/*
+	Analog formant filter response :
+	H(f) = i f B / (f1^2 - f^2 + i f B)
+*/
+static int Sound_into_FormantFilter_frame (Sound me, FormantFilter thee, long frame, double bw) {
+	Melder_assert (bw > 0);
+	autoMatrix pv = Sound_to_spectralpower (me);
+	double z1 = pv -> x1;
+	double dz = pv -> dx;
+	long nf = pv -> nx;
+
+	for (long i = 1; i <= thy ny; i++) {
+		double p = 0;
+		double fc = thy y1 + (i - 1) * thy dy;
+		double *pow = pv -> z[1];
+		for (long j = 1; j <= nf; j++) {
+			// H(f) = ifB / (fc^2 - f^2 + ifB)
+			// H(f)| = fB / sqrt ((fc^2 - f^2)^2 + f^2B^2)
+			//|H(f)|^2 = f^2B^2 / ((fc^2 - f^2)^2 + f^2B^2)
+			//         = 1 / (((fc^2 - f^2) /fB)^2 + 1)
+
+			double f = z1 + (j - 1) * dz;
+			double a = NUMformantfilter_amplitude (fc, bw, f);
+			p += a * pow[j];
+		}
+		thy z[i][frame] = p;
+	}
+	return 1;
+}
+
+FormantFilter Sound_to_FormantFilter (Sound me, double analysisWidth,
+                                      double dt, double f1_hz, double fmax_hz, double df_hz, double relative_bw,
+                                      double minimumPitch, double maximumPitch) {
+	try {
+		double floor = 80, ceiling = 600;
+		if (minimumPitch >= maximumPitch) {
+			minimumPitch = floor; maximumPitch = ceiling;
+		}
+		if (minimumPitch <= 0) {
+			minimumPitch = floor;
+		}
+		if (maximumPitch <= 0) {
+			maximumPitch = ceiling;
+		}
+
+		autoPitch thee = Sound_to_Pitch (me, dt, minimumPitch, maximumPitch);
+		autoFormantFilter ff = Sound_and_Pitch_to_FormantFilter (me, thee.peek(), analysisWidth, dt,
+		                       f1_hz, fmax_hz, df_hz, relative_bw);
+		return ff.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, ": no FormantFilter created.");
+	}
+}
+
+FormantFilter Sound_and_Pitch_to_FormantFilter (Sound me, Pitch thee, double analysisWidth, double dt,
+        double f1_hz, double fmax_hz, double df_hz, double relative_bw) {
+	try {
+		double t1, windowDuration = 2 * analysisWidth; /* gaussian window */
+		double nyquist = 0.5 / my dx, samplingFrequency = 2 * nyquist, fmin_hz = 0;
+		long nt, f0_undefined = 0;
+
+		if (my xmin > thy xmin || my xmax > thy xmax) Melder_throw
+			("The domain of the Sound is not included in the domain of the Pitch.");
+
+		double f0_median = Pitch_getQuantile (thee, thy xmin, thy xmax, 0.5, kPitch_unit_HERTZ);
+
+		if (f0_median == NUMundefined || f0_median == 0) {
+			f0_median = 100;
+			Melder_warning (L"Pitch values undefined. Bandwith fixed to 100 Hz. ");
+		}
+
+		if (f1_hz <= 0) {
+			f1_hz = 100;
+		}
+		if (fmax_hz <= 0) {
+			fmax_hz = nyquist;
+		}
+		if (df_hz <= 0) {
+			df_hz = f0_median / 2;
+		}
+		if (relative_bw <= 0) {
+			relative_bw = 1.1;
+		}
+
+		fmax_hz = MIN (fmax_hz, nyquist);
+		long nf = floor ( (fmax_hz - f1_hz) / df_hz + 0.5);
+
+		Sampled_shortTermAnalysis (me, windowDuration, dt, &nt, &t1);
+		autoFormantFilter him = FormantFilter_create (my xmin, my xmax, nt, dt, t1,
+		                        fmin_hz, fmax_hz, nf, df_hz, f1_hz);
+
+		// Temporary objects
+
+		autoSound sframe = Sound_createSimple (1, windowDuration, samplingFrequency);
+		autoSound window = Sound_createGaussian (windowDuration, samplingFrequency);
+		autoMelderProgress progress (L"Sound & Pitch: To FormantFilter");
+		for (long i = 1; i <= nt; i++) {
+			double t = Sampled_indexToX (him.peek(), i);
+			double b, f0 = Pitch_getValueAtTime (thee, t, kPitch_unit_HERTZ, 0);
+
+			if (f0 == NUMundefined || f0 == 0) {
+				f0_undefined++; f0 = f0_median;
+			}
+			b = relative_bw * f0;
+			Sound_into_Sound (me, sframe.peek(), t - windowDuration / 2);
+			Sounds_multiply (sframe.peek(), window.peek());
+
+			Sound_into_FormantFilter_frame (sframe.peek(), him.peek(), i, b);
+
+			if ( (i % 10) == 1) {
+				Melder_progress ( (double) i / nt, L"Frame ", Melder_integer (i), L" out of ",
+				                   Melder_integer (nt), L".");
+			}
+		}
+
+		double ref = FilterBank_DBREF * gaussian_window_squared_correction (window -> nx);
+		NUMdmatrix_to_dBs (his z, 1, his ny, 1, his nx, ref, FilterBank_DBFAC, FilterBank_DBFLOOR);
+		return him.transfer();
+	} catch (MelderError) {
+		Melder_throw ("FormantFilter not created from Pitch & FormantFilter.");
+	}
+}
+
+Sound FilterBank_as_Sound (FilterBank me) {
+	try {
+		autoSound thee = Sound_create (my ny, my xmin, my xmax, my nx, my dx, my x1);
+		for (long i = 1; i <= my ny; i++) {
+			for (long j = 1; j <= my nx; j++)
+				thy z[i][j] = my z[i][j];
+		}
+		return thee.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, ": no Sound created.");
+	}
+}
+
+Sound FilterBanks_crossCorrelate (FilterBank me, FilterBank thee, enum kSounds_convolve_scaling scaling, enum kSounds_convolve_signalOutsideTimeDomain signalOutsideTimeDomain) {
+	try {
+		autoSound cc = Sounds_crossCorrelate ((Sound) me, (Sound) thee, scaling, signalOutsideTimeDomain);
+		return cc.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, " and ", thee, " not cross-correlated.");
+	}
+}
+
+Sound FilterBanks_convolve (FilterBank me, FilterBank thee, enum kSounds_convolve_scaling scaling, enum kSounds_convolve_signalOutsideTimeDomain signalOutsideTimeDomain) {
+	try {
+		autoSound cc = Sounds_convolve ((Sound) me, (Sound) thee, scaling, signalOutsideTimeDomain);
+		return cc.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, " and ", thee, " not convolved.");
+	}
+}
+
+/* End of file Sound_and_FilterBank.cpp */
diff --git a/dwtools/Sound_and_FilterBank.h b/dwtools/Sound_and_FilterBank.h
new file mode 100644
index 0000000..9e19bdc
--- /dev/null
+++ b/dwtools/Sound_and_FilterBank.h
@@ -0,0 +1,58 @@
+#ifndef _Sound_and_FilterBank_h_
+#define _Sound_and_FilterBank_h_
+/* Sound_and_FilterBank.h
+ *
+ * Copyright (C) 1993-2012 David Weenink
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ djmw 20010404
+ djmw 20020813 GPL header
+ djmw 20120508 Latest modification
+*/
+
+#include "FilterBank.h"
+#include "Pitch.h"
+#include "Sound.h"
+
+BarkFilter Sound_to_BarkFilter (Sound me, double analysisWidth, double dt,
+	double f1_bark, double fmax_bark, double df_bark);
+/*
+	Filtering with filters on a Bark scale as defined by
+		Andrew Sekey & Brian Hanson (1984), "Improved 1-Bark bandwidth
+		"auditory filter", Jasa 75, 1902-1904.
+	Although not explicitely stated the filter function is defined in the
+	power domain.
+	10 log F(z) = 15.8 + 7.5(z + 0.5) - 17.5 * sqrt(1 + (z + 0.5)^2)
+*/
+
+MelFilter Sound_to_MelFilter (Sound me, double analysisWidth, double dt,
+	double f1_mel, double fmax_mel, double df_mel);
+
+FormantFilter Sound_to_FormantFilter (Sound me, double analysisWidth,
+	double dt, double f1_hz, double fmax_hz, double df_hz, double relative_bw,
+	double minimumPitch, double maximumPitch);
+
+FormantFilter Sound_and_Pitch_to_FormantFilter (Sound me, Pitch thee,
+	double analysisWidth, double dt, double f1_hz, double fmax_hz,
+	double df_hz, double relative_bw);
+
+Sound FilterBanks_crossCorrelate (FilterBank me, FilterBank thee, enum kSounds_convolve_scaling scaling, enum kSounds_convolve_signalOutsideTimeDomain signalOutsideTimeDomain);
+Sound FilterBanks_convolve (FilterBank me, FilterBank thee, enum kSounds_convolve_scaling scaling, enum kSounds_convolve_signalOutsideTimeDomain signalOutsideTimeDomain);
+
+
+#endif /* _Sound_and_FilterBank_h_ */
diff --git a/dwtools/Sound_and_PCA.cpp b/dwtools/Sound_and_PCA.cpp
index e9ec661..86d155d 100644
--- a/dwtools/Sound_and_PCA.cpp
+++ b/dwtools/Sound_and_PCA.cpp
@@ -1,6 +1,6 @@
 /* Sound_and_PCA.cpp
  *
- * Copyright (C) 2012 David Weenink
+ * Copyright (C) 2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,7 +29,7 @@
 static void checkChannelsWithinRange (long *channels, long n, long min, long max) {
 	for (long i = 1; i <= n; i++) {
 		if (channels[i] < min || channels[i] > max) {
-			Melder_throw ("Channel ", Melder_integer (channels[i]), " is not within range [", Melder_integer (min), ", ", Melder_integer (max), "].");
+			Melder_throw (U"Channel ", channels[i], U" is not within range [", min, U", ", max, U"].");
 		}
 	}
 }
@@ -41,7 +41,7 @@ PCA Sound_to_PCA_channels (Sound me, double startTime, double endTime) {
 		autoPCA him = SSCP_to_PCA (thee.peek());
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no PCA created.");
+		Melder_throw (me, U": no PCA created.");
 	}
 }
 
@@ -70,12 +70,12 @@ Sound Sound_and_PCA_to_Sound_pc_selectedChannels (Sound me, PCA thee, long numbe
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no principal components calculated with ", thee);
+		Melder_throw (me, U": no principal components calculated with ", thee);
 	}
 }
 
 Sound Sound_and_PCA_principalComponents (Sound me, PCA thee, long numberOfComponents) {
-	return Sound_and_PCA_to_Sound_pc_selectedChannels (me, thee, numberOfComponents, NULL, 0);
+	return Sound_and_PCA_to_Sound_pc_selectedChannels (me, thee, numberOfComponents, nullptr, 0);
 }
 
 Sound Sound_and_PCA_whitenSelectedChannels (Sound me, PCA thee, long numberOfComponents, long *channels, long numberOfChannels) {
@@ -111,12 +111,12 @@ Sound Sound_and_PCA_whitenSelectedChannels (Sound me, PCA thee, long numberOfCom
         }
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created.");
+		Melder_throw (U"Sound not created.");
 	}
 }
 
 Sound Sound_and_PCA_whitenChannels (Sound me, PCA thee, long numberOfComponents) {
-	return Sound_and_PCA_whitenSelectedChannels (me, thee, numberOfComponents, NULL, 0);
+	return Sound_and_PCA_whitenSelectedChannels (me, thee, numberOfComponents, nullptr, 0);
 }
 
 /* End of file Sound_and_PCA.cpp */
diff --git a/dwtools/Sound_and_Spectrogram_extensions.cpp b/dwtools/Sound_and_Spectrogram_extensions.cpp
index 6208c3e..89b8f38 100644
--- a/dwtools/Sound_and_Spectrogram_extensions.cpp
+++ b/dwtools/Sound_and_Spectrogram_extensions.cpp
@@ -66,7 +66,7 @@ static void _Spectrogram_windowCorrection (Spectrogram me, long numberOfSamples_
 
 static Spectrum Sound_to_Spectrum_power (Sound me) {
 	try {
-		autoSpectrum thee = Sound_to_Spectrum (me, TRUE);
+		autoSpectrum thee = Sound_to_Spectrum (me, true);
 		double scale = 2.0 * thy dx / (my xmax - my xmin);
 
 		// factor '2' because we combine positive and negative frequencies
@@ -84,7 +84,7 @@ static Spectrum Sound_to_Spectrum_power (Sound me) {
 		re[1] *= 0.5; re[thy nx] *= 0.5;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Spectrum with spectral power created.");
+		Melder_throw (me, U": no Spectrum with spectral power created.");
 	}
 }
 
@@ -134,9 +134,9 @@ BarkSpectrogram Sound_to_BarkSpectrogram (Sound me, double analysisWidth, double
 		}
 
 		fmax_bark = MIN (fmax_bark, zmax);
-		long numberOfFilters = floor ( (fmax_bark - f1_bark) / df_bark + 0.5);
+		long numberOfFilters = lround ( (fmax_bark - f1_bark) / df_bark);
 		if (numberOfFilters <= 0) {
-			Melder_throw ("The combination of filter parameters is not valid.");
+			Melder_throw (U"The combination of filter parameters is not valid.");
 		}
 
 		long numberOfFrames; double t1;
@@ -145,7 +145,7 @@ BarkSpectrogram Sound_to_BarkSpectrogram (Sound me, double analysisWidth, double
 		autoSound window = Sound_createGaussian (windowDuration, samplingFrequency);
 		autoBarkSpectrogram thee = BarkSpectrogram_create (my xmin, my xmax, numberOfFrames, dt, t1, fmin_bark, fmax_bark, numberOfFilters, df_bark, f1_bark);
 
-		autoMelderProgress progess (L"BarkSpectrogram analysis");
+		autoMelderProgress progess (U"BarkSpectrogram analysis");
 
 		for (long iframe = 1; iframe <= numberOfFrames; iframe++) {
 			double t = Sampled_indexToX (thee.peek(), iframe);
@@ -155,8 +155,8 @@ BarkSpectrogram Sound_to_BarkSpectrogram (Sound me, double analysisWidth, double
 			Sound_into_BarkSpectrogram_frame (sframe.peek(), thee.peek(), iframe);
 
 			if ((iframe % 10) == 1) {
-				Melder_progress ( (double) iframe / numberOfFrames,  L"BarkSpectrogram analysis: frame ",
-					Melder_integer (iframe), L" from ", Melder_integer (numberOfFrames), L".");
+				Melder_progress ( (double) iframe / numberOfFrames,  U"BarkSpectrogram analysis: frame ",
+					iframe, U" from ", numberOfFrames, U".");
 			}
 		}
 		
@@ -164,7 +164,7 @@ BarkSpectrogram Sound_to_BarkSpectrogram (Sound me, double analysisWidth, double
 
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no BarkSpectrogram created.");
+		Melder_throw (me, U": no BarkSpectrogram created.");
 	}
 }
 
@@ -215,7 +215,7 @@ MelSpectrogram Sound_to_MelSpectrogram (Sound me, double analysisWidth, double d
 
 		// Determine the number of filters.
 
-		long numberOfFilters = floor ((fmax_mel - f1_mel) / df_mel + 0.5);
+		long numberOfFilters = lround ((fmax_mel - f1_mel) / df_mel);
 		fmax_mel = f1_mel + numberOfFilters * df_mel;
 
 		Sampled_shortTermAnalysis (me, windowDuration, dt, &numberOfFrames, &t1);
@@ -223,7 +223,7 @@ MelSpectrogram Sound_to_MelSpectrogram (Sound me, double analysisWidth, double d
 		autoSound window = Sound_createGaussian (windowDuration, samplingFrequency);
 		autoMelSpectrogram thee = MelSpectrogram_create (my xmin, my xmax, numberOfFrames, dt, t1, fmin_mel, fmax_mel, numberOfFilters, df_mel, f1_mel);
 
-		autoMelderProgress progress (L"MelSpectrograms analysis");
+		autoMelderProgress progress (U"MelSpectrograms analysis");
 
 		for (long iframe = 1; iframe <= numberOfFrames; iframe++) {
 			double t = Sampled_indexToX (thee.peek(), iframe);
@@ -232,7 +232,7 @@ MelSpectrogram Sound_to_MelSpectrogram (Sound me, double analysisWidth, double d
 			Sound_into_MelSpectrogram_frame (sframe.peek(), thee.peek(), iframe);
 			
 			if ((iframe % 10) == 1) {
-				Melder_progress ((double) iframe / numberOfFrames, L"Frame ", Melder_integer (iframe), L" out of ", Melder_integer (numberOfFrames), L".");
+				Melder_progress ((double) iframe / numberOfFrames, U"Frame ", iframe, U" out of ", numberOfFrames, U".");
 			}
 		}
 		
@@ -240,7 +240,7 @@ MelSpectrogram Sound_to_MelSpectrogram (Sound me, double analysisWidth, double d
 
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MelSpectrogram created.");
+		Melder_throw (me, U": no MelSpectrogram created.");
 	}
 }
 
@@ -288,7 +288,7 @@ Spectrogram Sound_to_Spectrogram_pitchDependent (Sound me, double analysisWidth,
 		autoSpectrogram ff = Sound_and_Pitch_to_Spectrogram (me, thee.peek(), analysisWidth, dt, f1_hz, fmax_hz, df_hz, relative_bw);
 		return ff.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Spectrogram created.");
+		Melder_throw (me, U": no Spectrogram created.");
 	}
 }
 
@@ -299,13 +299,13 @@ Spectrogram Sound_and_Pitch_to_Spectrogram (Sound me, Pitch thee, double analysi
 		long numberOfFrames, f0_undefined = 0;
 
 		if (my xmin > thy xmin || my xmax > thy xmax) Melder_throw
-			("The domain of the Sound is not included in the domain of the Pitch.");
+			(U"The domain of the Sound is not included in the domain of the Pitch.");
 
 		double f0_median = Pitch_getQuantile (thee, thy xmin, thy xmax, 0.5, kPitch_unit_HERTZ);
 
 		if (f0_median == NUMundefined || f0_median == 0) {
 			f0_median = 100;
-			Melder_warning (L"Pitch values undefined. Bandwith fixed to 100 Hz. ");
+			Melder_warning (U"Pitch values undefined. Bandwith fixed to 100 Hz. ");
 		}
 
 		if (f1_hz <= 0) {
@@ -322,7 +322,7 @@ Spectrogram Sound_and_Pitch_to_Spectrogram (Sound me, Pitch thee, double analysi
 		}
 
 		fmax_hz = MIN (fmax_hz, nyquist);
-		long numberOfFilters = floor ( (fmax_hz - f1_hz) / df_hz + 0.5);
+		long numberOfFilters = lround ( (fmax_hz - f1_hz) / df_hz);
 
 		Sampled_shortTermAnalysis (me, windowDuration, dt, &numberOfFrames, &t1);
 		autoSpectrogram him = Spectrogram_create (my xmin, my xmax, numberOfFrames, dt, t1, fmin_hz, fmax_hz, numberOfFilters, df_hz, f1_hz);
@@ -331,7 +331,7 @@ Spectrogram Sound_and_Pitch_to_Spectrogram (Sound me, Pitch thee, double analysi
 
 		autoSound sframe = Sound_createSimple (1, windowDuration, samplingFrequency);
 		autoSound window = Sound_createGaussian (windowDuration, samplingFrequency);
-		autoMelderProgress progress (L"Sound & Pitch: To FormantFilter");
+		autoMelderProgress progress (U"Sound & Pitch: To FormantFilter");
 		for (long iframe = 1; iframe <= numberOfFrames; iframe++) {
 			double t = Sampled_indexToX (him.peek(), iframe);
 			double b, f0 = Pitch_getValueAtTime (thee, t, kPitch_unit_HERTZ, 0);
@@ -346,8 +346,8 @@ Spectrogram Sound_and_Pitch_to_Spectrogram (Sound me, Pitch thee, double analysi
 			Sound_into_Spectrogram_frame (sframe.peek(), him.peek(), iframe, b);
 
 			if ((iframe % 10) == 1) {
-				Melder_progress ( (double) iframe / numberOfFrames, L"Frame ", Melder_integer (iframe), L" out of ", 
-					Melder_integer (numberOfFrames), L".");
+				Melder_progress ( (double) iframe / numberOfFrames, U"Frame ", iframe, U" out of ",
+					numberOfFrames, U".");
 			}
 		}
 		
@@ -355,7 +355,7 @@ Spectrogram Sound_and_Pitch_to_Spectrogram (Sound me, Pitch thee, double analysi
 
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("FormantFilter not created from Pitch & FormantFilter.");
+		Melder_throw (U"FormantFilter not created from Pitch & FormantFilter.");
 	}
 }
 
@@ -368,7 +368,7 @@ Sound BandFilterSpectrogram_as_Sound (BandFilterSpectrogram me, int unit) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Sound created.");
+		Melder_throw (me, U": no Sound created.");
 	}
 }
 
@@ -379,7 +379,7 @@ Sound BandFilterSpectrograms_crossCorrelate (BandFilterSpectrogram me, BandFilte
 		autoSound cc = Sounds_crossCorrelate (sme.peek(), sthee.peek(), scaling, signalOutsideTimeDomain);
 		return cc.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " and ", thee, " not cross-correlated.");
+		Melder_throw (me, U" and ", thee, U" not cross-correlated.");
 	}
 }
 
@@ -390,7 +390,7 @@ Sound BandFilterSpectrograms_convolve (BandFilterSpectrogram me, BandFilterSpect
 		autoSound cc = Sounds_convolve (sme.peek(), sthee.peek(), scaling, signalOutsideTimeDomain);
 		return cc.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " and ", thee, " not convolved.");
+		Melder_throw (me, U" and ", thee, U" not convolved.");
 	}
 }
 
diff --git a/dwtools/Sound_extensions.cpp b/dwtools/Sound_extensions.cpp
index 8d174d5..14b018e 100644
--- a/dwtools/Sound_extensions.cpp
+++ b/dwtools/Sound_extensions.cpp
@@ -1,6 +1,6 @@
 /* Sound_extensions.cpp
  *
- * Copyright (C) 1993-2011 David Weenink
+ * Copyright (C) 1993-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -69,6 +69,7 @@
 #include "Manipulation.h"
 #include "NUM2.h"
 
+
 #define MAX_T  0.02000000001   /* Maximum interval between two voice pulses (otherwise voiceless). */
 
 static void PitchTier_modifyExcursionRange (PitchTier me, double tmin, double tmax, double multiplier, double fref_Hz) {
@@ -114,7 +115,7 @@ static void i1write (Sound me, FILE *f, long *nClip) {
 	double *s = my z[1], min = -128, max = 127;
 	*nClip = 0;
 	for (long i = 1; i <= my nx; i++) {
-		double sample = floor (s[i] * 128 + 0.5);
+		double sample = round (s[i] * 128);
 		if (sample > max) {
 			sample = max;
 			(*nClip) ++;
@@ -122,7 +123,7 @@ static void i1write (Sound me, FILE *f, long *nClip) {
 			sample = min;
 			(*nClip) ++;
 		}
-		binputi1 (sample, f);
+		binputi1 ((int) sample, f);
 	}
 }
 
@@ -137,7 +138,7 @@ static void u1write (Sound me, FILE *f, long *nClip) {
 	double *s = my z[1], min = 0, max = 255;
 	*nClip = 0;
 	for (long i = 1; i <= my nx; i++) {
-		double sample = floor ( (s[i] + 1) * 255 / 2 + 0.5);
+		double sample = round ( (s[i] + 1) * 255 / 2);
 		if (sample > max) {
 			sample = max;
 			(*nClip) ++;
@@ -145,7 +146,7 @@ static void u1write (Sound me, FILE *f, long *nClip) {
 			sample = min;
 			(*nClip) ++;
 		}
-		binputu1 (sample, f);
+		binputu1 ((unsigned int) sample, f);
 	}
 }
 
@@ -161,7 +162,7 @@ static void i2write (Sound me, FILE *f, int littleEndian, long *nClip) {
 	void (*put) (int16_t, FILE *) = littleEndian ? binputi2LE : binputi2;
 	*nClip = 0;
 	for (long i = 1; i <= my nx; i++) {
-		double sample = floor (s[i] * 32768 + 0.5);
+		double sample = round (s[i] * 32768);
 		if (sample > max) {
 			sample = max;
 			(*nClip) ++;
@@ -169,7 +170,7 @@ static void i2write (Sound me, FILE *f, int littleEndian, long *nClip) {
 			sample = min;
 			(*nClip) ++;
 		}
-		put (sample, f);
+		put ((int16) sample, f);
 	}
 }
 
@@ -186,7 +187,7 @@ static void u2write (Sound me, FILE *f, int littleEndian, long *nClip) {
 	void (*put) (uint16_t, FILE *) = littleEndian ? binputu2LE : binputu2;
 	*nClip = 0;
 	for (long i = 1; i <= my nx; i++) {
-		double sample = floor ( (s[i] + 1) * 65535 / 2 + 0.5);
+		double sample = round ( (s[i] + 1) * 65535 / 2);
 		if (sample > max) {
 			sample = max;
 			(*nClip) ++;
@@ -194,7 +195,7 @@ static void u2write (Sound me, FILE *f, int littleEndian, long *nClip) {
 			sample = min;
 			(*nClip) ++;
 		}
-		put (sample, f);
+		put ((uint16) sample, f);
 	}
 }
 
@@ -211,7 +212,7 @@ static void i4write (Sound me, FILE *f, int littleEndian, long *nClip) {
 	void (*put) (int32_t, FILE *) = littleEndian ? binputi4LE : binputi4;
 	*nClip = 0;
 	for (long i = 1; i <= my nx; i++) {
-		double sample = floor (s[i] * 2147483648.0 + 0.5);
+		double sample = round (s[i] * 2147483648.0);
 		if (sample > max) {
 			sample = max;
 			(*nClip) ++;
@@ -219,7 +220,7 @@ static void i4write (Sound me, FILE *f, int littleEndian, long *nClip) {
 			sample = min;
 			(*nClip) ++;
 		}
-		put (sample, f);
+		put ((int32) sample, f);
 	}
 }
 
@@ -245,7 +246,7 @@ static void u4write (Sound me, FILE *f, int littleEndian, long *nClip) {
 			sample = min;
 			(*nClip) ++;
 		}
-		put (sample, f);
+		put ((uint32) sample, f);
 	}
 }
 
@@ -289,29 +290,29 @@ Sound Sound_readFromCmuAudioFile (MelderFile file) {
 		int littleEndian = 1;
 		autofile f = Melder_fopen (file, "rb");
 		if (bingeti2LE (f) != 6) {
-			Melder_throw ("Incorrect header size.");
+			Melder_throw (U"Incorrect header size.");
 		}
 		bingeti2LE (f);
 		short nChannels = bingeti2LE (f);
 		if (nChannels < 1) {
-			Melder_throw ("Incorrect number of channels.");
+			Melder_throw (U"Incorrect number of channels.");
 		}
 		if (nChannels > 1) {
-			Melder_throw ("File has multiple channels: cannot read.");
+			Melder_throw (U"File has multiple channels: cannot read.");
 		}
 		if (bingeti2LE (f) < 1) {
-			Melder_throw ("Incorrect sampling frequency.");
+			Melder_throw (U"Incorrect sampling frequency.");
 		}
 		long nSamples = bingeti4LE (f);
 		if (nSamples < 1) {
-			Melder_throw ("Incorrect number of samples.");
+			Melder_throw (U"Incorrect number of samples.");
 		}
 		autoSound me = Sound_createSimple (1, nSamples / 16000., 16000);
 		i2read (me.peek(), f, littleEndian);
 		f.close (file);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not read from CMU audio file ", MelderFile_messageName (file), ".");
+		Melder_throw (U"Sound not read from CMU audio file ", MelderFile_messageName (file), U".");
 	}
 }
 
@@ -330,14 +331,14 @@ Sound Sound_readFromRawFile (MelderFile file, const char *format, int nBitsCodin
 			nBytesPerSample = 4;
 		}
 		if (nBytesPerSample == 3 || nBytesPerSample > 4) {
-			Melder_throw ("Number of bytes per sample should be 1, 2 or 4.");
+			Melder_throw (U"Number of bytes per sample should be 1, 2 or 4.");
 		}
 		if (skipNBytes <= 0) {
 			skipNBytes = 0;
 		}
 		long nSamples = (fileLengthBytes (f) - skipNBytes) / nBytesPerSample;
 		if (nSamples < 1) {
-			Melder_throw ("No samples left to read");
+			Melder_throw (U"No samples left to read");
 		}
 		autoSound me = Sound_createSimple (1, nSamples / samplingFrequency, samplingFrequency);
 		fseek (f, skipNBytes, SEEK_SET);
@@ -359,7 +360,7 @@ Sound Sound_readFromRawFile (MelderFile file, const char *format, int nBitsCodin
 		f.close (file);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not read from raw audio file ", MelderFile_messageName (file), ".");
+		Melder_throw (U"Sound not read from raw audio file ", MelderFile_messageName (file), U".");
 	}
 }
 
@@ -378,7 +379,7 @@ void Sound_writeToRawFile (Sound me, MelderFile file, const char *format, int li
 			nBytesPerSample = 4;
 		}
 		if (nBytesPerSample == 3 || nBytesPerSample > 4) {
-			Melder_throw (L"number of bytes per sample should be 1, 2 or 4.");
+			Melder_throw (U"number of bytes per sample should be 1, 2 or 4.");
 		}
 		if (nBytesPerSample == 1 &&   unSigned) {
 			u1write (me, f, & nClip);
@@ -395,14 +396,14 @@ void Sound_writeToRawFile (Sound me, MelderFile file, const char *format, int li
 		} else if (nBytesPerSample == 4 && strequ (format, "float")) {
 			r4write (me, f);
 		}
-		if (nClip > 0) Melder_warning (Melder_integer (nClip), L" from ", Melder_integer (my nx),
-			                               L" samples have been clipped.\nAdvice: you could scale the amplitudes or save as a binary file.");
-		if (feof (f) || ferror (f)) {
-			Melder_throw ("Sound_writeToRawFile: not completed");
+		if (nClip > 0) Melder_warning (nClip, U" from ", my nx,
+			                               U" samples have been clipped.\nAdvice: you could scale the amplitudes or save as a binary file.");
+		if (feof ((FILE *) f) || ferror ((FILE *) f)) {
+			Melder_throw (U"Sound_writeToRawFile: not completed");
 		}
 		f.close (file);
 	} catch (MelderError) {
-		Melder_throw (me, ": saving as raw file not performed.");
+		Melder_throw (me, U": saving as raw file not performed.");
 	}
 }
 
@@ -491,14 +492,14 @@ Sound Sound_readFromDialogicADPCMFile (MelderFile file, double sampleRate) {
 
 		long filelength = MelderFile_length (file);
 		if (filelength <= 0) {
-			Melder_throw ("File is empty.");
+			Melder_throw (U"File is empty.");
 		}
 
 		// Two samples in each byte
 
 		long numberOfSamples = 2 * filelength;
 		if (numberOfSamples <= 0) {
-			Melder_throw ("File too long");
+			Melder_throw (U"File too long");
 		}
 		autoSound me = Sound_createSimple (1, numberOfSamples / sampleRate, sampleRate);
 
@@ -519,7 +520,7 @@ Sound Sound_readFromDialogicADPCMFile (MelderFile file, double sampleRate) {
 		f.close (file);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not read from Dialogic ADPCM file", MelderFile_messageName (file), ".");
+		Melder_throw (U"Sound not read from Dialogic ADPCM file", MelderFile_messageName (file), U".");
 	}
 }
 
@@ -558,7 +559,7 @@ Sound Sound_createGaussian (double windowDuration, double samplingFrequency) {
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from Gaussian function.");
+		Melder_throw (U"Sound not created from Gaussian function.");
 	}
 }
 
@@ -566,18 +567,18 @@ Sound Sound_createHamming (double windowDuration, double samplingFrequency) {
 	try {
 		autoSound me = Sound_createSimple (1, windowDuration, samplingFrequency);
 		double *s = my z[1];
-		double p = 2 * NUMpi / (my nx - 1);
+		double p = 2.0 * NUMpi / (my nx - 1);
 		for (long i = 1; i <= my nx; i++) {
 			s[i] = 0.54 - 0.46 * cos ( (i - 1) * p);
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from Hamming function.");
+		Melder_throw (U"Sound not created from Hamming function.");
 	};
 }
 
-static Sound Sound_create2 (double minimumTime, double maximumTime, double samplingFrequency) {
-	return Sound_create (1, minimumTime, maximumTime, floor ( (maximumTime - minimumTime) * samplingFrequency + 0.5),
+static autoSound Sound_create2 (double minimumTime, double maximumTime, double samplingFrequency) {
+	return Sound_create (1, minimumTime, maximumTime, lround ( (maximumTime - minimumTime) * samplingFrequency),
 	                     1.0 / samplingFrequency, minimumTime + 0.5 / samplingFrequency);
 }
 
@@ -619,7 +620,7 @@ static Sound Sound_createToneComplex (double minimumTime, double maximumTime, do
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from tone complex.");
+		Melder_throw (U"Sound not created from tone complex.");
 	}
 }
 
@@ -627,8 +628,8 @@ static Sound Sound_createToneComplex (double minimumTime, double maximumTime, do
 Sound Sound_createSimpleToneComplex (double minimumTime, double maximumTime, double samplingFrequency,
                                      double firstFrequency, long numberOfComponents, double frequencyDistance, int scaleAmplitudes) {
 	if (firstFrequency + (numberOfComponents - 1) * frequencyDistance > samplingFrequency / 2) {
-		Melder_warning (L"Sound_createSimpleToneComplex: frequency of (some) components too high.");
-		numberOfComponents = 1.0 + (samplingFrequency / 2 - firstFrequency) / frequencyDistance;
+		Melder_warning (U"Sound_createSimpleToneComplex: frequency of (some) components too high.");
+		numberOfComponents = (long) floor (1.0 + (samplingFrequency / 2 - firstFrequency) / frequencyDistance);
 	}
 	return Sound_createToneComplex (minimumTime, maximumTime, samplingFrequency,
 	                                firstFrequency, numberOfComponents, frequencyDistance, 0, 0, scaleAmplitudes);
@@ -638,11 +639,11 @@ Sound Sound_createMistunedHarmonicComplex (double minimumTime, double maximumTim
         double firstFrequency, long numberOfComponents, long mistunedComponent,
         double mistuningFraction, int scaleAmplitudes) {
 	if (firstFrequency + (numberOfComponents - 1) * firstFrequency > samplingFrequency / 2) {
-		Melder_warning (L"Sound_createMistunedHarmonicComplex: frequency of (some) components too high.");
-		numberOfComponents = 1.0 + (samplingFrequency / 2 - firstFrequency) / firstFrequency;
+		Melder_warning (U"Sound_createMistunedHarmonicComplex: frequency of (some) components too high.");
+		numberOfComponents = (long) floor (1.0 + (samplingFrequency / 2 - firstFrequency) / firstFrequency);
 	}
 	if (mistunedComponent > numberOfComponents) {
-		Melder_warning (L"Sound_createMistunedHarmonicComplex: mistuned component too high.");
+		Melder_warning (U"Sound_createMistunedHarmonicComplex: mistuned component too high.");
 	}
 	return Sound_createToneComplex (minimumTime, maximumTime, samplingFrequency,
 	                                firstFrequency, numberOfComponents, firstFrequency, mistunedComponent,
@@ -673,7 +674,7 @@ Sound Sound_createGammaTone (double minimumTime, double maximumTime, double samp
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from gammatone function.");
+		Melder_throw (U"Sound not created from gammatone function.");
 	}
 }
 
@@ -742,14 +743,17 @@ static void NUMgammatoneFilter4 (double *x, double *y, long n, double centre_fre
 	}
 
 	if (Melder_debug == -1) {
-		Melder_casual ("--gammatonefilter4--\nF = %ls, B = %ls, T = %ls\nGain = %ls",
-		               Melder_double (centre_frequency), Melder_double (bandwidth),
-		               Melder_double (dt), Melder_double (gain));
+		Melder_casual (
+			U"--gammatonefilter4--\nF = ", centre_frequency,
+			U", B = ", bandwidth,
+			U", T = ", dt,
+			U"\nGain = ", gain
+		);
 		for (long i = 0; i <= 4; i++) {
-			Melder_casual ("a[%ld] = %ls", i, Melder_double (a[i]));
+			Melder_casual (U"a[", i, U"] = ", a[i]);
 		}
 		for (long i = 0; i <= 8; i++) {
-			Melder_casual ("b[%ld] = %ls", i, Melder_double (b[i]));
+			Melder_casual (U"b[", i, U"] = ", b[i]);
 		}
 	}
 	/*
@@ -810,10 +814,10 @@ static void NUMgammatoneFilter4 (double *x, double *y, long n, double centre_fre
 Sound Sound_filterByGammaToneFilter4 (Sound me, double centre_frequency, double bandwidth) {
 	try {
 		if (centre_frequency <= 0) {
-			Melder_throw ("Centre frequency must be positive.");
+			Melder_throw (U"Centre frequency must be positive.");
 		}
 		if (bandwidth < 0) {
-			Melder_throw ("Bandwidth must be positive.");
+			Melder_throw (U"Bandwidth must be positive.");
 		}
 
 		autoSound thee = Sound_create (my ny, my xmin, my xmax, my nx, my dx, my x1);
@@ -834,7 +838,7 @@ Sound Sound_filterByGammaToneFilter4 (Sound me, double centre_frequency, double
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not filtered by gammatone filter4.");
+		Melder_throw (U"Sound not filtered by gammatone filter4.");
 	}
 }
 
@@ -845,9 +849,9 @@ Sound Sound_createShepardTone (double minimumTime, double maximumTime, double sa
 	Sound me; long i, j, nComponents = 1 + log2 (maximumFrequency / 2 / baseFrequency);
 	double lmin = pow (10, - amplitudeRange / 10);
 	double twoPi = 2.0 * NUMpi, f = baseFrequency * (1 + frequencyShiftFraction);
-	if (nComponents < 2) Melder_warning (L"Sound_createShepardTone: only 1 component.");
-	Melder_casual ("Sound_createShepardTone: %ld components.", nComponents);
-	if (! (me = Sound_create2 (minimumTime, maximumTime, samplingFrequency))) return NULL;
+	if (nComponents < 2) Melder_warning (U"Sound_createShepardTone: only 1 component.");
+	Melder_casual (U"Sound_createShepardTone: ", nComponents, U" components.");
+	if (! (me = Sound_create2 (minimumTime, maximumTime, samplingFrequency))) return nullptr;
 
 	for (j=1; j <= nComponents; j++)
 	{
@@ -871,17 +875,17 @@ Sound Sound_createShepardToneComplex (double minimumTime, double maximumTime,
 		double highestFrequency = lowestFrequency * pow (2, numberOfComponents);
 		double lmax_db = 0, lmin_db = lmax_db - fabs (amplitudeRange);
 
-		if (highestFrequency > samplingFrequency / 2) Melder_throw ("The highest frequency you want to generate is "
-			        "above the Nyquist frequency. Choose a larger value for \"Sampling frequency\", or lower values for "
-			        "\"Number of components\" or \"Lowest frequency\".");
-		if (octaveShiftFraction < 0 || octaveShiftFraction >= 1) Melder_throw ("Octave offset fraction "
-			        "must be greater or equal zero and smaller than one.");
+		if (highestFrequency > samplingFrequency / 2) Melder_throw (U"The highest frequency you want to generate is "
+			        U"above the Nyquist frequency. Choose a larger value for \"Sampling frequency\", or lower values for "
+			        U"\"Number of components\" or \"Lowest frequency\".");
+		if (octaveShiftFraction < 0 || octaveShiftFraction >= 1) Melder_throw (U"Octave offset fraction "
+			        U"must be greater or equal zero and smaller than one.");
 		double octaveTime, sweeptime;
 		if (frequencyChange_st != 0) {
 			octaveTime = 12 / fabs (frequencyChange_st);
 			sweeptime = numberOfComponents * octaveTime;
 		} else {
-			octaveTime = sweeptime = 1e38;
+			octaveTime = sweeptime = 1e308;
 		}
 		autoSound me = Sound_create2 (minimumTime, maximumTime, samplingFrequency);
 
@@ -936,7 +940,7 @@ Sound Sound_createShepardToneComplex (double minimumTime, double maximumTime,
 		Vector_scale (me.peek(), 0.99996948);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from Shepard tone complex.");
+		Melder_throw (U"Sound not created from Shepard tone complex.");
 	}
 }
 
@@ -955,9 +959,9 @@ Sound Sound_createShepardTone (double minimumTime, double maximumTime,
 		                               (lowestFrequency + 1));
 
 		if (lowestFrequency > samplingFrequency / 2) Melder_throw
-			("Sound_createShepardTone: lowest frequency too high.");
+			(U"Sound_createShepardTone: lowest frequency too high.");
 		if (maximumFrequency > samplingFrequency / 2) Melder_throw
-			("Sound_createShepardTone: frequency of highest component too high.");
+			(U"Sound_createShepardTone: frequency of highest component too high.");
 		autoSound me = Sound_create2 (minimumTime, maximumTime, samplingFrequency);
 
 		for (long i = 1; i <= my nx; i++) {
@@ -983,7 +987,7 @@ Sound Sound_createShepardTone (double minimumTime, double maximumTime,
 		Vector_scale (me.peek(), 0.99996948);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from Shepard tone.");
+		Melder_throw (U"Sound not created from Shepard tone.");
 	}
 }
 
@@ -991,7 +995,7 @@ Sound Sound_createPattersonWightmanTone (double minimumTime, double maximumTime,
         double baseFrequency, double frequencyShiftRatio, long numberOfComponents) {
 	try {
 		if ( (numberOfComponents - 1 + frequencyShiftRatio) * baseFrequency >  samplingFrequency / 2) Melder_throw
-			("Frequency of one or more components too large.");
+			(U"Frequency of one or more components too large.");
 		autoSound me = Sound_create2 (minimumTime, maximumTime, samplingFrequency);
 		double w0 = NUM2pi * baseFrequency;
 		for (long i = 1; i <= my nx; i++) {
@@ -1004,7 +1008,7 @@ Sound Sound_createPattersonWightmanTone (double minimumTime, double maximumTime,
 		Vector_scale (me.peek(), 0.99996948);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from Patterson Wightman tone.");
+		Melder_throw (U"Sound not created from Patterson Wightman tone.");
 	}
 }
 
@@ -1014,7 +1018,7 @@ Sound Sound_createPlompTone (double minimumTime, double maximumTime, double samp
 		double w1 = NUM2pi * (1 - frequencyFraction) * baseFrequency;
 		double w2 = NUM2pi * (1 + frequencyFraction) * baseFrequency;
 		if (12 * (1 + frequencyFraction) * baseFrequency >  samplingFrequency / 2) Melder_throw
-			("Sound_createPlompTone: frequency of one or more components too large.");
+			(U"Sound_createPlompTone: frequency of one or more components too large.");
 		autoSound me = Sound_create2 (minimumTime, maximumTime, samplingFrequency);
 		for (long i = 1; i <= my nx; i++) {
 			double a = 0, t = (i - 0.5) * my dx;
@@ -1029,7 +1033,7 @@ Sound Sound_createPlompTone (double minimumTime, double maximumTime, double samp
 		Vector_scale (me.peek(), 0.99996948);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from Plomp tone.");
+		Melder_throw (U"Sound not created from Plomp tone.");
 	}
 }
 
@@ -1068,7 +1072,7 @@ double Sound_correlateParts (Sound me, double tx, double ty, double duration) {
 		decrement = ney - my nx;
 	}
 
-	long ns = duration / my dx - increment - decrement;
+	long ns = (long) floor (duration / my dx) - increment - decrement;
 	if (ns < 1) {
 		return 0;
 	}
@@ -1114,7 +1118,7 @@ void Sound_localPeak (Sound me, double fromTime, double toTime, double ref, doub
 	long n1 = Sampled_xToNearestIndex (me, fromTime);
 	long n2 = Sampled_xToNearestIndex (me, toTime);
 	double *s = my z[1];
-	*peak = -1e38;
+	*peak = -1e308;
 	if (fromTime > toTime) {
 		return;
 	}
@@ -1150,15 +1154,14 @@ IntervalTier Sound_PointProcess_to_IntervalTier (Sound me, PointProcess thee, do
 	long i;
 
 	him = IntervalTier_create (my xmin, my xmax);
-	if (him == NULL) return NULL;
+	if (!him) return nullptr;
 
 	t1 = thy t[1] - window2;
 	if (t1 < my xmin) t1 = my xmin;
 	t2 = t1 + window2;
 	if (t2 > my xmax) t2 = my xmax;
 	interval = TextInterval_create (t1, t2, "yes");
-	if (interval == NULL ||
-		! Collection_addItem (his intervals, interval)) goto end;
+	if (!interval || ! Collection_addItem (his intervals, interval)) goto end;
 
 	for (i = 2; i <= thy nt; i++)
 	{
@@ -1188,7 +1191,7 @@ end:
 
 void Sound_overwritePart (Sound me, double t1, double t2, Sound thee, double t3) {
 	if (my dx != thy dx) {
-		Melder_throw ("Sample rates must be equal.");
+		Melder_throw (U"Sample rates must be equal.");
 	}
 
 	if (t1 == 0) {
@@ -1201,7 +1204,7 @@ void Sound_overwritePart (Sound me, double t1, double t2, Sound thee, double t3)
 	long i1 = Sampled_xToHighIndex (me, t1);
 	long i2 = Sampled_xToLowIndex (me, t2);
 	if (i1 > i2 || i2 > my nx || i1 < 1) Melder_throw
-		("Times of part to be overwritten must be within the sound.");
+		(U"Times of part to be overwritten must be within the sound.");
 
 	if (t3 == 0) {
 		t3 = thy xmin;
@@ -1209,10 +1212,10 @@ void Sound_overwritePart (Sound me, double t1, double t2, Sound thee, double t3)
 	long i3 = Sampled_xToHighIndex (thee, t3);
 	long i4 = Sampled_xToLowIndex (thee, t3 + t2 - t1);
 	if (i4 > thy nx || i3 < 1) {
-		Melder_throw ("Not enough samples to be copied.");
+		Melder_throw (U"Not enough samples to be copied.");
 	}
 	if (i4 - i3 != i2 - i1) {
-		Melder_throw ("Error i4 - i3 != i2 - i1.");
+		Melder_throw (U"Error i4 - i3 != i2 - i1.");
 	}
 
 	for (long i = i1; i <= i2; i++) {
@@ -1220,10 +1223,10 @@ void Sound_overwritePart (Sound me, double t1, double t2, Sound thee, double t3)
 	}
 }
 
-void Sound_filter_part_formula (Sound me, double t1, double t2, const wchar_t *formula, Interpreter interpreter) {
+void Sound_filter_part_formula (Sound me, double t1, double t2, const char32 *formula, Interpreter interpreter) {
 	try {
 		autoSound part = Sound_extractPart (me, t1, t2, kSound_windowShape_RECTANGULAR, 1, 1);
-		autoSpectrum spec = Sound_to_Spectrum (part.peek(), TRUE);
+		autoSpectrum spec = Sound_to_Spectrum (part.peek(), true);
 		Matrix_formula ( (Matrix) spec.peek(), formula, interpreter, 0);
 		autoSound filtered = Spectrum_to_Sound (spec.peek());
 
@@ -1231,7 +1234,7 @@ void Sound_filter_part_formula (Sound me, double t1, double t2, const wchar_t *f
 
 		Sound_overwritePart (me, t1, t2, filtered.peek(), 0);
 	} catch (MelderError) {
-		Melder_throw (me, ": part not filtered by formula.");
+		Melder_throw (me, U": part not filtered by formula.");
 	}
 }
 
@@ -1243,7 +1246,7 @@ void Sound_filter_part_formula (Sound me, double t1, double t2, const wchar_t *f
 PointProcess Sound_to_PointProcess_getJumps (Sound me, double minimumJump, double dt) {
 	try {
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		long i = 1, dtn = dt / my dx;
+		long i = 1, dtn = (long) floor (dt / my dx);
 		if (dtn < 1) {
 			dtn = 1;
 		}
@@ -1262,7 +1265,7 @@ PointProcess Sound_to_PointProcess_getJumps (Sound me, double minimumJump, doubl
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no PointProcess created.");
+		Melder_throw (me, U": no PointProcess created.");
 	}
 }
 
@@ -1276,7 +1279,7 @@ Sound Sound_and_Pitch_changeSpeaker (Sound me, Pitch him,
 		double samplingFrequency_old = 1 / my dx;
 
 		if (my xmin != his xmin || my xmax != his xmax) Melder_throw
-			("The Pitch and the Sound object must have the same start and end times.");
+			(U"The Pitch and the Sound object must have the same start and end times.");
 
 		autoSound sound = Data_copy (me);
 		Vector_subtractMean (sound.peek());
@@ -1299,7 +1302,7 @@ Sound Sound_and_Pitch_changeSpeaker (Sound me, Pitch him,
 			PitchTier_multiplyFrequencies (pitchTier.peek(), sound -> xmin, sound -> xmax, pitchMultiplier / formantMultiplier);
 			PitchTier_modifyExcursionRange (pitchTier.peek(), sound -> xmin, sound -> xmax, pitchRangeMultiplier, median);
 		} else if (pitchMultiplier != 1) {
-			Melder_warning (L"Pitch has not been changed because the sound was entirely voiceless.");
+			Melder_warning (U"Pitch has not been changed because the sound was entirely voiceless.");
 		}
 		autoDurationTier duration = DurationTier_create (my xmin, my xmax);
 		RealTier_addPoint (duration.peek(), (my xmin + my xmax) / 2, formantMultiplier * durationMultiplier);
@@ -1313,7 +1316,7 @@ Sound Sound_and_Pitch_changeSpeaker (Sound me, Pitch him,
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from Pitch & Sound.");
+		Melder_throw (U"Sound not created from Pitch & Sound.");
 	}
 }
 
@@ -1327,53 +1330,53 @@ Sound Sound_changeSpeaker (Sound me, double pitchMin, double pitchMax,
 		autoSound thee = Sound_and_Pitch_changeSpeaker (me, pitch.peek(), formantMultiplier, pitchMultiplier, pitchRangeMultiplier, durationMultiplier);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": speaker not changed.");
+		Melder_throw (me, U": speaker not changed.");
 	}
 }
 
 TextGrid Sound_to_TextGrid_detectSilences (Sound me, double minPitch, double timeStep,
 	double silenceThreshold, double minSilenceDuration, double minSoundingDuration,
-	const wchar_t *silentLabel, const wchar_t *soundingLabel) {
+	const char32 *silentLabel, const char32 *soundingLabel) {
 	try {
 		int subtractMeanPressure = 1;
 		autoIntensity thee = Sound_to_Intensity (me, minPitch, timeStep, subtractMeanPressure);
 		autoTextGrid him = Intensity_to_TextGrid_detectSilences (thee.peek(), silenceThreshold, minSilenceDuration, minSoundingDuration, silentLabel, soundingLabel);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no TextGrid with silences created.");
+		Melder_throw (me, U": no TextGrid with silences created.");
 	}
 }
 
 void Sound_getStartAndEndTimesOfSounding (Sound me, double minPitch, double timeStep,
 	double silenceThreshold, double minSilenceDuration, double minSoundingDuration, double *t1, double *t2) {
 	try {
-		const wchar_t *silentLabel = L"-", *soundingLabel = L"+";
+		const char32 *silentLabel = U"-", *soundingLabel = U"+";
 		autoTextGrid dbs = Sound_to_TextGrid_detectSilences (me, minPitch, timeStep, silenceThreshold,
 			minSilenceDuration, minSoundingDuration, silentLabel, soundingLabel);
 		IntervalTier itier = (IntervalTier) dbs -> tiers -> item[1];
 		TextInterval ti = (TextInterval) itier -> intervals -> item[1];
 		*t1 = my xmin;
-		if (Melder_wcsequ (ti -> text, silentLabel)) {
+		if (Melder_equ (ti -> text, silentLabel)) {
 			*t1 = ti -> xmax;
 		}
 		*t2 = my xmax;
 		ti = (TextInterval) itier -> intervals -> item[itier -> intervals -> size];
-		if (Melder_wcsequ (ti -> text, silentLabel)) {
+		if (Melder_equ (ti -> text, silentLabel)) {
 			*t2 = ti -> xmin;
 		}
 	} catch (MelderError) {
-		Melder_throw ("Sounding times not found.");
+		Melder_throw (U"Sounding times not found.");
 	}
 }
 
-Sound Sound_and_IntervalTier_cutPartsMatchingLabel (Sound me, IntervalTier thee, const wchar_t *match) {
+Sound Sound_and_IntervalTier_cutPartsMatchingLabel (Sound me, IntervalTier thee, const char32 *match) {
     try {
         // count samples of the trimmed sound
         long ixmin, ixmax, numberOfSamples = 0, previous_ixmax = 0;
 		double xmin = my xmin; // start time of output sound is start time of input sound
         for (long iint = 1; iint <= thy intervals -> size; iint++) {
             TextInterval ti = (TextInterval) thy intervals -> item[iint];
-            if (! Melder_wcsequ (ti -> text, match)) {
+            if (! Melder_equ (ti -> text, match)) {
                 numberOfSamples += Sampled_getWindowSamples (me, ti -> xmin, ti -> xmax, &ixmin, &ixmax);
                 // if two contiguous intervals have to be copied then the last sample of previous interval
                 // and first sample of current interval might sometimes be equal
@@ -1392,7 +1395,7 @@ Sound Sound_and_IntervalTier_cutPartsMatchingLabel (Sound me, IntervalTier thee,
         numberOfSamples = 0; previous_ixmax = 0;
         for (long iint = 1; iint <= thy intervals -> size; iint++) {
             TextInterval ti = (TextInterval) thy intervals -> item[iint];
-            if (! Melder_wcsequ (ti -> text, match)) {
+            if (! Melder_equ (ti -> text, match)) {
 				long ipos;
                 Sampled_getWindowSamples (me, ti -> xmin, ti -> xmax, &ixmin, &ixmax);
 				if (ixmin == previous_ixmax) {
@@ -1411,17 +1414,17 @@ Sound Sound_and_IntervalTier_cutPartsMatchingLabel (Sound me, IntervalTier thee,
         Melder_assert (numberOfSamples == his nx);
         return him.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": intervals not trimmed.");
+        Melder_throw (me, U": intervals not trimmed.");
     }
 }
 
-Sound Sound_trimSilences (Sound me, double trimDuration, bool onlyAtStartAndEnd, double minPitch, double timeStep, double silenceThreshold, double minSilenceDuration, double minSoundingDuration, TextGrid *tg, const wchar_t *trimLabel) {
+Sound Sound_trimSilences (Sound me, double trimDuration, bool onlyAtStartAndEnd, double minPitch, double timeStep, double silenceThreshold, double minSilenceDuration, double minSoundingDuration, TextGrid *tg, const char32 *trimLabel) {
     try {
         if (my ny > 1) {
-            Melder_throw ("The sound must be a mono sound.");
+            Melder_throw (U"The sound must be a mono sound.");
         }
-        const wchar_t *silentLabel = L"silent", *soundingLabel = L"sounding";
-        const wchar_t *copyLabel = L"";
+        const char32 *silentLabel = U"silent", *soundingLabel = U"sounding";
+        const char32 *copyLabel = U"";
         autoTextGrid dbs = Sound_to_TextGrid_detectSilences (me, minPitch, timeStep, silenceThreshold,
             minSilenceDuration, minSoundingDuration, silentLabel, soundingLabel);
         autoIntervalTier itg = (IntervalTier) Data_copy ((IntervalTier) dbs -> tiers -> item[1]);
@@ -1430,8 +1433,8 @@ Sound Sound_trimSilences (Sound me, double trimDuration, bool onlyAtStartAndEnd,
             TextInterval ti = (TextInterval) itier -> intervals -> item[iint];
             TextInterval ati = (TextInterval) itg -> intervals -> item[iint];
             double duration = ti -> xmax - ti -> xmin;
-            if (duration > trimDuration && Melder_wcsequ (ti -> text, silentLabel)) { // silent
-				const wchar_t * label = trimLabel;
+            if (duration > trimDuration && Melder_equ (ti -> text, silentLabel)) { // silent
+				const char32 * label = trimLabel;
                 if (iint == 1) { // first is special
                     double trim_t = ti -> xmax - trimDuration;
                     IntervalTier_moveBoundary (itg.peek(), iint, false, trim_t);
@@ -1454,13 +1457,13 @@ Sound Sound_trimSilences (Sound me, double trimDuration, bool onlyAtStartAndEnd,
             }
         }
         autoSound thee = Sound_and_IntervalTier_cutPartsMatchingLabel (me, itg.peek(), trimLabel);
-        if (tg != NULL) {
-			TextGrid_addTier (dbs.peek(), itg.transfer());
+        if (tg) {
+			TextGrid_addTier_copy (dbs.peek(), itg.peek());
             *tg = dbs.transfer();
         }
         return thee.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": silences not trimmed.");
+        Melder_throw (me, U": silences not trimmed.");
     }
 }
 
@@ -1468,22 +1471,22 @@ Sound Sound_trimSilencesAtStartAndEnd (Sound me, double trimDuration, double min
 	double silenceThreshold, double minSilenceDuration, double minSoundingDuration, double *t1, double *t2) {
 	try {
 		TextGrid tg;
-		autoSound thee = Sound_trimSilences (me, trimDuration, true, minPitch, timeStep, silenceThreshold, minSilenceDuration, minSoundingDuration, &tg, L"trimmed");
+		autoSound thee = Sound_trimSilences (me, trimDuration, true, minPitch, timeStep, silenceThreshold, minSilenceDuration, minSoundingDuration, &tg, U"trimmed");
 		autoTextGrid atg = tg;
 		IntervalTier trim = (IntervalTier) tg -> tiers -> item[2];
 		TextInterval ti1 = (TextInterval) trim -> intervals -> item[1];
 		*t1 = my xmin;
-		if (Melder_wcsequ (ti1 -> text, L"trimmed")) {
+		if (Melder_equ (ti1 -> text, U"trimmed")) {
 			*t1 = ti1 -> xmax;
 		}
 		TextInterval ti2 = (TextInterval) trim -> intervals -> item[trim -> intervals -> size];
 		*t2 = my xmax;
-		if (Melder_wcsequ (ti2 -> text, L"trimmed")) {
+		if (Melder_equ (ti2 -> text, U"trimmed")) {
 			*t2 = ti2 -> xmin;
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": silences not trimmed.");
+		Melder_throw (me, U": silences not trimmed.");
 	}
 }
 
@@ -1521,7 +1524,7 @@ static Pitch Pitch_scaleTime_old (Pitch me, double scaleFactor) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Pitch not scaled.");
+		Melder_throw (U"Pitch not scaled.");
 	}
 }
 
@@ -1530,12 +1533,12 @@ Sound Sound_and_Pitch_changeGender_old (Sound me, Pitch him, double formantRatio
 		double samplingFrequency_old = 1 / my dx;
 
 		if (my ny > 1) {
-			Melder_throw ("Change Gender works only on mono sounds.");
+			Melder_throw (U"Change Gender works only on mono sounds.");
 		}
 		if (my xmin != his xmin || my xmax != his xmax) Melder_throw
-			("The Pitch and the Sound object must have the same starting times and finishing times.");
+			(U"The Pitch and the Sound object must have the same starting times and finishing times.");
 		if (new_pitch < 0) {
-			Melder_throw ("The new pitch median must not be negative.");
+			Melder_throw (U"The new pitch median must not be negative.");
 		}
 
 		autoSound sound = Data_copy (me);
@@ -1560,7 +1563,7 @@ Sound Sound_and_Pitch_changeGender_old (Sound me, Pitch him, double formantRatio
 			PitchTier_multiplyFrequencies (pitchTier.peek(), sound -> xmin, sound -> xmax, factor);
 			PitchTier_modifyRange_old (pitchTier.peek(), sound -> xmin, sound -> xmax, pitchRangeFactor, new_pitch);
 		} else {
-			Melder_warning (L"There were no voiced segments found.");
+			Melder_warning (U"There were no voiced segments found.");
 		}
 		autoDurationTier duration = DurationTier_create (my xmin, my xmax);
 		RealTier_addPoint (duration.peek(), (my xmin + my xmax) / 2, formantRatio * durationFactor);
@@ -1575,7 +1578,7 @@ Sound Sound_and_Pitch_changeGender_old (Sound me, Pitch him, double formantRatio
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from Pitch & Sound.");
+		Melder_throw (U"Sound not created from Pitch & Sound.");
 	}
 }
 
@@ -1587,7 +1590,7 @@ Sound Sound_changeGender_old (Sound me, double fmin, double fmax, double formant
 		                 new_pitch, pitchRangeFactor, durationFactor);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created for gender change.");
+		Melder_throw (U"Sound not created for gender change.");
 	}
 }
 
@@ -1633,20 +1636,20 @@ void Sound_draw_btlr (Sound me, Graphics g, double tmin, double tmax, double ami
 	}
 	if (garnish) {
 		if (direction == FROM_BOTTOM_TO_TOP) {
-			if (amin * amax < 0) {
-				Graphics_markBottom (g, 0, 0, 1, 1, NULL);
+			if (amin * amax < 0.0) {
+				Graphics_markBottom (g, 0.0, false, true, true, nullptr);
 			}
 		} else if (direction == FROM_TOP_TO_BOTTOM) {
-			if (amin * amax < 0) {
-				Graphics_markTop (g, 0, 0, 1, 1, NULL);
+			if (amin * amax < 0.0) {
+				Graphics_markTop (g, 0.0, false, true, true, nullptr);
 			}
 		} else if (direction == FROM_RIGHT_TO_LEFT) {
-			if (amin * amax < 0) {
-				Graphics_markRight (g, 0, 0, 1, 1, NULL);
+			if (amin * amax < 0.0) {
+				Graphics_markRight (g, 0.0, false, true, true, nullptr);
 			}
 		} else { //if (direction == FROM_LEFT_TO_RIGHT)
-			if (amin * amax < 0) {
-				Graphics_markLeft (g, 0, 0, 1, 1, NULL);
+			if (amin * amax < 0.0) {
+				Graphics_markLeft (g, 0.0, false, true, true, nullptr);
 			}
 		}
 		Graphics_rectangle (g, xmin, xmax, ymin, ymax);
@@ -1654,22 +1657,22 @@ void Sound_draw_btlr (Sound me, Graphics g, double tmin, double tmax, double ami
 }
 
 void Sound_fade (Sound me, int channel, double t, double fadeTime, int inout, int fadeGlobal) {
-	long numberOfSamples = fabs (fadeTime) / my dx;
+	long numberOfSamples = (long) floor (fabs (fadeTime) / my dx);
 	double t1 = t, t2 = t1 + fadeTime;
-	const wchar_t *fade_inout = inout > 0 ? L"out" : L"in";
+	const char32 *fade_inout = inout > 0 ? U"out" : U"in";
 	if (channel < 0 || channel > my ny) {
-		Melder_throw ("Invalid channel number.");
+		Melder_throw (U"Invalid channel number.");
 	}
 	if (t > my xmax) {
 		t = my xmax;
 		if (inout <= 0) { // fade in
-			Melder_warning (L"The start time of the fade-in is after the end time of the sound. The fade-in will not happen.");
+			Melder_warning (U"The start time of the fade-in is after the end time of the sound. The fade-in will not happen.");
 			return;
 		}
 	} else if (t < my xmin) {
 		t = my xmin;
 		if (inout > 0) { // fade  out
-			Melder_warning (L"The start time of the fade-out is before the start time of the sound. The fade-out will not happen.");
+			Melder_warning (U"The start time of the fade-out is before the start time of the sound. The fade-out will not happen.");
 			return;
 		}
 	}
@@ -1678,8 +1681,8 @@ void Sound_fade (Sound me, int channel, double t, double fadeTime, int inout, in
 	} else if (fadeTime > 0) {
 		t1 = t; t2 = t + fadeTime;
 	} else {
-		Melder_warning (L"You have given a \"Fade time\" of zero seconds. The fade-", fade_inout,
-		                L"will not happen.");
+		Melder_warning (U"You have given a \"Fade time\" of zero seconds. The fade-", fade_inout,
+		                U"will not happen.");
 		return;
 	}
 	long i0 = 0, iystart, iyend;
@@ -1694,12 +1697,12 @@ void Sound_fade (Sound me, int channel, double t, double fadeTime, int inout, in
 		istart = 1;
 	}
 	if (istart >= my nx) {
-		Melder_warning (L"The part to fade ", fade_inout, L" lies after the end time of the sound. The fade-",  fade_inout, L" will not happen.");
+		Melder_warning (U"The part to fade ", fade_inout, U" lies after the end time of the sound. The fade-",  fade_inout, U" will not happen.");
 		return;
 	}
 	long iend = Sampled_xToNearestIndex (me, t2);
 	if (iend <= 1) {
-		Melder_warning (L"The part to fade ", fade_inout, L" lies before the start time of the sound. Fade-", fade_inout, L" will be incomplete.");
+		Melder_warning (U"The part to fade ", fade_inout, U" lies before the start time of the sound. Fade-", fade_inout, U" will be incomplete.");
 		return;
 	}
 	if (iend > my nx) {
@@ -1713,7 +1716,7 @@ void Sound_fade (Sound me, int channel, double t, double fadeTime, int inout, in
 		if (fadeTime < 0) {
 			i0 = numberOfSamples - (iend - istart + 1);
 		}
-		Melder_warning (L"The fade time is larger than the part of the sound to fade ", fade_inout, L". Fade-", fade_inout, L" will be incomplete.");
+		Melder_warning (U"The fade time is larger than the part of the sound to fade ", fade_inout, U". Fade-", fade_inout, U" will be incomplete.");
 	}
 	for (long ichannel = iystart; ichannel <= iyend; ichannel++) {
 		for (long i = istart; i <= iend; i++) {
@@ -1721,16 +1724,16 @@ void Sound_fade (Sound me, int channel, double t, double fadeTime, int inout, in
 			if (inout <= 0) {
 				cosp = -cosp;    // fade-in
 			}
-			my z[ichannel][i] *= 0.5 * (1 + cosp);
+			my z[ichannel][i] *= 0.5 * (1.0 + cosp);
 		}
 		if (fadeGlobal) {
 			if (inout <= 0) {
 				for (long i = 1; i < istart; i++) {
-					my z[ichannel][i] = 0;
+					my z[ichannel][i] = 0.0;
 				}
 			} else {
 				for (long i = iend; i < my nx; i++) {
-					my z[ichannel][i] = 0;
+					my z[ichannel][i] = 0.0;
 				}
 			}
 		}
@@ -1775,7 +1778,7 @@ Sound Sound_createFromWindowFunction (double windowDuration, double samplingFreq
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from window function.");
+		Melder_throw (U"Sound not created from window function.");
 	}
 }
 
@@ -1808,26 +1811,26 @@ Sound Sound_localAverage (Sound me, double averagingInterval, int windowType) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Sound (local average) created.");
+		Melder_throw (me, U": no Sound (local average) created.");
 	}
 }
 
 static void _Sound_garnish (Sound me, Graphics g, double tmin, double tmax, double minimum, double maximum) {
 	Graphics_drawInnerBox (g);
-	Graphics_textBottom (g, 1, L"Time (s)");
-	Graphics_marksBottom (g, 2, 1, 1, 0);
+	Graphics_textBottom (g, true, U"Time (s)");
+	Graphics_marksBottom (g, 2, true, true, false);
 	Graphics_setWindow (g, tmin, tmax, minimum - (my ny - 1) * (maximum - minimum), maximum);
-	Graphics_markLeft (g, minimum, 1, 1, 0, NULL);
-	Graphics_markLeft (g, maximum, 1, 1, 0, NULL);
+	Graphics_markLeft (g, minimum, true, true, false, nullptr);
+	Graphics_markLeft (g, maximum, true, true, false, nullptr);
 	if (minimum != 0.0 && maximum != 0.0 && (minimum > 0.0) != (maximum > 0.0)) {
-		Graphics_markLeft (g, 0.0, 1, 1, 1, NULL);
+		Graphics_markLeft (g, 0.0, true, true, true, nullptr);
 	}
 	if (my ny == 2) {
 		Graphics_setWindow (g, tmin, tmax, minimum, maximum + (my ny - 1) * (maximum - minimum));
-		Graphics_markRight (g, minimum, 1, 1, 0, NULL);
-		Graphics_markRight (g, maximum, 1, 1, 0, NULL);
+		Graphics_markRight (g, minimum, true, true, false, nullptr);
+		Graphics_markRight (g, maximum, true, true, false, nullptr);
 		if (minimum != 0.0 && maximum != 0.0 && (minimum > 0.0) != (maximum > 0.0)) {
-			Graphics_markRight (g, 0.0, 1, 1, 1, NULL);
+			Graphics_markRight (g, 0.0, true, true, true, nullptr);
 		}
 	}
 }
@@ -1857,7 +1860,7 @@ static void _Sound_getWindowExtrema (Sound me, double *tmin, double *tmax, doubl
 	 We cannot use a sinc-interpolation because at strong amplitude changes high-frequency oscilations may occur.
 	 (may be leave out the interpolation and just use Vector_VALUE_INTERPOLATION_LINEAR only?)
 */
-static void Sound_findIntermediatePoint_bs (Sound me, long ichannel, long isample, bool left, bool right, const wchar_t *formula,
+static void Sound_findIntermediatePoint_bs (Sound me, long ichannel, long isample, bool left, bool right, const char32 *formula,
         Interpreter interpreter, int interpolation, long numberOfBisections, double *x, double *y) {
 	if (left) {
 		*x = Matrix_columnToX (me, isample);
@@ -1867,7 +1870,7 @@ static void Sound_findIntermediatePoint_bs (Sound me, long ichannel, long isampl
 		*y = my z[ichannel][isample + 1];
 	}
 	if ( (left && right) || (!left && !right)) {
-		Melder_throw ("Invalid situation.");
+		Melder_throw (U"Invalid situation.");
 	}
 
 	if (numberOfBisections < 1) {
@@ -1898,17 +1901,17 @@ static void Sound_findIntermediatePoint_bs (Sound me, long ichannel, long isampl
 		// Only thy x1 and thy dx have changed; It seems we don't have to recompile.
 		struct Formula_Result result;
 		Formula_run (ichannel, 2, & result);
-		bool current = result.result.numericResult;
+		bool current = (result.result.numericResult != 0.0);
 
 		dx /= 2;
-		if ( (left && current) || (! left && ! current)) {
+		if ((left && current) || (! left && ! current)) {
 			xleft = xmid;
 			left = current;
 			for (long channel = 1; channel <= my ny; channel++) {
 				thy z[channel][1] = thy z[channel][2];
 			}
 			thy x1 = xleft;
-		} else if ( (left && ! current) || (!left && current)) {
+		} else if ((left && ! current) || (!left && current)) {
 			xright = xmid;
 			right = current;
 			for (long channel = 1; channel <= my ny; channel++) {
@@ -1930,7 +1933,7 @@ static void Sound_findIntermediatePoint_bs (Sound me, long ichannel, long isampl
 }
 
 void Sound_drawWhere (Sound me, Graphics g, double tmin, double tmax, double minimum, double maximum,
-	bool garnish, const wchar_t *method, long numberOfBisections, const wchar_t *formula, Interpreter interpreter) {
+	bool garnish, const char32 *method, long numberOfBisections, const char32 *formula, Interpreter interpreter) {
 	Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_NUMERIC, true);
 
 	long ixmin, ixmax;
@@ -1943,10 +1946,10 @@ void Sound_drawWhere (Sound me, Graphics g, double tmin, double tmax, double min
 	for (long channel = 1; channel <= my ny; channel ++) {
 		Graphics_setWindow (g, tmin, tmax, minimum - (my ny - channel) * (maximum - minimum),
 			maximum + (channel - 1) * (maximum - minimum));
-		if (wcsstr (method, L"bars") || wcsstr (method, L"Bars")) {
+		if (str32str (method, U"bars") || str32str (method, U"Bars")) {
 			for (long ix = ixmin; ix <= ixmax; ix ++) {
 				Formula_run (channel, ix, & result);
-				if (result.result.numericResult) {
+				if (result.result.numericResult != 0.0) {
 					double x = Sampled_indexToX (me, ix);
 					double y = my z [channel] [ix];
 					double left = x - 0.5 * my dx, right = x + 0.5 * my dx;
@@ -1964,10 +1967,10 @@ void Sound_drawWhere (Sound me, Graphics g, double tmin, double tmax, double min
 					Graphics_line (g, right, y, right, minimum);
 				}
 			}
-		} else if (wcsstr (method, L"poles") || wcsstr (method, L"Poles")) {
+		} else if (str32str (method, U"poles") || str32str (method, U"Poles")) {
 			for (long ix = ixmin; ix <= ixmax; ix ++) {
 				Formula_run (channel, ix, & result);
-				if (result.result.numericResult) {
+				if (result.result.numericResult != 0.0) {
 					double x = Sampled_indexToX (me, ix);
 					double y = my z[channel][ix];
 					if (y > maximum) {
@@ -1979,10 +1982,10 @@ void Sound_drawWhere (Sound me, Graphics g, double tmin, double tmax, double min
 					Graphics_line (g, x, 0, x, y);
 				}
 			}
-		} else if (wcsstr (method, L"speckles") || wcsstr (method, L"Speckles")) {
+		} else if (str32str (method, U"speckles") || str32str (method, U"Speckles")) {
 			for (long ix = ixmin; ix <= ixmax; ix ++) {
 				Formula_run (channel, ix, & result);
-				if (result.result.numericResult) {
+				if (result.result.numericResult != 0.0) {
 					double x = Sampled_indexToX (me, ix);
 					Graphics_speckle (g, x, my z [channel] [ix]);
 				}
@@ -1995,7 +1998,7 @@ void Sound_drawWhere (Sound me, Graphics g, double tmin, double tmax, double min
 			double xb = Sampled_indexToX (me, ixmin), yb = my z[channel][ixmin], xe, ye;
 			for (long ix = ixmin; ix <= ixmax; ix++) {
 				Formula_run (channel, ix, & result);
-				current = result.result.numericResult; // true means draw
+				current = (result.result.numericResult != 0.0 ); // true means draw
 				if (previous && not current) { // leaving drawing segment
 					if (ix != ixmin) {
 						if (ix - istart > 1) {
@@ -2042,7 +2045,7 @@ void Sound_drawWhere (Sound me, Graphics g, double tmin, double tmax, double min
 }
 
 void Sound_paintWhere (Sound me, Graphics g, Graphics_Colour colour, double tmin, double tmax,
-                       double minimum, double maximum, double level, bool garnish, long numberOfBisections, const wchar_t *formula, Interpreter interpreter) {
+                       double minimum, double maximum, double level, bool garnish, long numberOfBisections, const char32 *formula, Interpreter interpreter) {
 	try {
 		long ixmin, ixmax;
 		struct Formula_Result result;
@@ -2062,7 +2065,7 @@ void Sound_paintWhere (Sound me, Graphics g, Graphics_Colour colour, double tmin
 			long ix = ixmin;
 			do {
 				Formula_run (channel, ix, & result);
-				current = result.result.numericResult;
+				current = ( result.result.numericResult != 0.0 );
 				if (ix == ixmin) {
 					previous = current;
 				}
@@ -2143,10 +2146,10 @@ void Sounds_paintEnclosed (Sound me, Sound thee, Graphics g, Graphics_Colour col
 	}
 }
 
-Sound Sound_copyChannelRanges (Sound me, const wchar_t *ranges) {
+Sound Sound_copyChannelRanges (Sound me, const char32 *ranges) {
 	try {
 		long numberOfChannels;
-		autoNUMvector <long> channels (NUMstring_getElementsOfRanges (ranges, my ny, & numberOfChannels, NULL, L"channel", true), 1);
+		autoNUMvector <long> channels (NUMstring_getElementsOfRanges (ranges, my ny, & numberOfChannels, nullptr, U"channel", true), 1);
 		autoSound thee = Sound_create (numberOfChannels, my xmin, my xmax, my nx, my dx, my x1);
 		for (long i = 1; i <= numberOfChannels; i++) {
 			double *from = my z[channels[i]], *to = thy z[i];
@@ -2154,18 +2157,18 @@ Sound Sound_copyChannelRanges (Sound me, const wchar_t *ranges) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": could not extract channels.");
+		Melder_throw (me, U": could not extract channels.");
 	}
 }
 
 /* After a script by Ton Wempe */
-Sound Sound_removeNoiseBySpectralSubtraction_mono (Sound me, Sound noise, double windowLength) {
+static Sound Sound_removeNoiseBySpectralSubtraction_mono (Sound me, Sound noise, double windowLength) {
 	try {
 		if (my dx != noise -> dx) {
-			Melder_throw ("The sound and the noise must have the same sampling frequency.");
+			Melder_throw (U"The sound and the noise must have the same sampling frequency.");
 		}
 		if (noise -> ny != 1 || noise -> ny != 1) {
-			Melder_throw ("The number of channels in the noise and the sound should equal 1.");
+			Melder_throw (U"The number of channels in the noise and the sound should equal 1.");
 		}
 		double samplingFrequency = 1.0 / my dx;
 		autoSound denoised = Sound_create (1, my xmin, my xmax, my nx, my dx, my x1);
@@ -2213,7 +2216,7 @@ Sound Sound_removeNoiseBySpectralSubtraction_mono (Sound me, Sound noise, double
 		}
 		return denoised.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": noise not subtracted.");
+		Melder_throw (me, U": noise not subtracted.");
 	}
 }
 
@@ -2230,11 +2233,11 @@ static void Sound_findNoise (Sound me, double minimumNoiseDuration, double *nois
 			tmax = my xmax; tmin = tmax - minimumNoiseDuration;
 		}
 		if (tmin < my xmin) {
-			Melder_throw ("Sound too short, or window length too long.");
+			Melder_throw (U"Sound too short, or window length too long.");
 		}
 		*noiseStart = tmin; *noiseEnd = tmax;
 	} catch (MelderError) {
-		Melder_throw (me, ": noise not found.");
+		Melder_throw (me, U": noise not found.");
 	}
 }
 
@@ -2257,7 +2260,7 @@ Sound Sound_removeNoise (Sound me, double noiseStart, double noiseEnd, double wi
 		}
 		return denoised.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not denoised.");
+		Melder_throw (me, U": not denoised.");
 	}
 }
 
@@ -2266,9 +2269,9 @@ void Sound_playAsFrequencyShifted (Sound me, double shiftBy, double newSamplingF
 		autoSpectrum spectrum = Sound_to_Spectrum (me, 1);
 		autoSpectrum shifted = Spectrum_shiftFrequencies (spectrum.peek(), shiftBy, newSamplingFrequency / 2, precision);
 		autoSound thee = Spectrum_to_Sound (shifted.peek());
-		Sound_playPart (thee.peek(), my xmin, my xmax, NULL, NULL);
+		Sound_playPart (thee.peek(), my xmin, my xmax, nullptr, nullptr);
 	} catch (MelderError) {
-		Melder_throw (me, " not played with frequencies shifted.");
+		Melder_throw (me, U" not played with frequencies shifted.");
 	}
 }
 
diff --git a/dwtools/Sound_extensions.h b/dwtools/Sound_extensions.h
index 52730a6..09d8354 100644
--- a/dwtools/Sound_extensions.h
+++ b/dwtools/Sound_extensions.h
@@ -146,10 +146,10 @@ void Sound_draw_btlr (Sound me, Graphics g, double tmin, double tmax, double ami
 /* direction is one of the macros's FROM_LEFT_TO_RIGHT... */
 
 void Sound_drawWhere (Sound me, Graphics g, double tmin, double tmax, double minimum, double maximum,
-	bool garnish, const wchar_t *method, long numberOfBisections, const wchar_t *formula, Interpreter interpreter);
+	bool garnish, const char32 *method, long numberOfBisections, const char32 *formula, Interpreter interpreter);
 
 void Sound_paintWhere (Sound me, Graphics g, Graphics_Colour colour, double tmin, double tmax,
-	double minimum, double maximum, double level, bool garnish, long numberOfBisections, const wchar_t *formula, Interpreter interpreter);
+	double minimum, double maximum, double level, bool garnish, long numberOfBisections, const char32 *formula, Interpreter interpreter);
 void Sounds_paintEnclosed (Sound me, Sound thee, Graphics g, Graphics_Colour colour, double tmin, double tmax,
 	double minimum, double maximum, bool garnish);
 
@@ -170,7 +170,7 @@ PointProcess Sound_to_PointProcess_getJumps (Sound me, double minimumJump, doubl
 	within time dt
 */
 
-void Sound_filter_part_formula (Sound me, double t1, double t2, const wchar_t *formula, Interpreter interpreter);
+void Sound_filter_part_formula (Sound me, double t1, double t2, const char32 *formula, Interpreter interpreter);
 
 Sound Sound_changeSpeaker (Sound me, double pitchMin, double pitchMax,
 	double formantMultiplier, // > 0
@@ -190,11 +190,11 @@ Sound Sound_changeGender_old (Sound me, double fmin, double fmax, double formant
 
 TextGrid Sound_to_TextGrid_detectSilences (Sound me, double minPitch, double timeStep,
 	double silenceThreshold, double minSilenceDuration, double minSoundingDuration,
-	const wchar_t *silentLabel, const wchar_t *soundingLabel);
+	const char32 *silentLabel, const char32 *soundingLabel);
 void Sound_getStartAndEndTimesOfSounding (Sound me, double minPitch, double timeStep,
 	double silenceThreshold, double minSilenceDuration, double minSoundingDuration, double *t1, double *t2);
 
-Sound Sound_and_IntervalTier_cutPartsMatchingLabel (Sound me, IntervalTier thee, const wchar_t *match);
+Sound Sound_and_IntervalTier_cutPartsMatchingLabel (Sound me, IntervalTier thee, const char32 *match);
 /* Cut intervals that match the label from the sound. The starting time of the new sound is
  * (1) my xmin if the first interval is not matching
  * (2) the end time of the first interval if matching
@@ -203,9 +203,9 @@ Sound Sound_and_IntervalTier_cutPartsMatchingLabel (Sound me, IntervalTier thee,
 Sound Sound_trimSilencesAtStartAndEnd (Sound me, double trimDuration, double minPitch, double timeStep,
 	double silenceThreshold, double minSilenceDuration, double minSoundingDuration, double *t1, double *t2);
 Sound Sound_trimSilences (Sound me, double trimDuration, bool onlyAtStartAndEnd, double minPitch, double timeStep,
-    double silenceThreshold, double minSilenceDuration, double minSoundingDuration, TextGrid *tg, const wchar_t *trimLabel);
+    double silenceThreshold, double minSilenceDuration, double minSoundingDuration, TextGrid *tg, const char32 *trimLabel);
 
-Sound Sound_copyChannelRanges (Sound me, const wchar_t *ranges);
+Sound Sound_copyChannelRanges (Sound me, const char32 *ranges);
 
 Sound Sound_removeNoise (Sound me, double noiseStart, double noiseEnd, double windowLength, double minBandFilterFrequency, double maxBandFilterFrequency, double smoothing, int method);
 
diff --git a/dwtools/Sound_to_DTW.h b/dwtools/Sound_to_DTW.h
index 7ef7463..f664be8 100644
--- a/dwtools/Sound_to_DTW.h
+++ b/dwtools/Sound_to_DTW.h
@@ -28,15 +28,7 @@
 #include "MFCC.h"
 #include "Sound.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 MFCC Sound_to_MFCC (Sound me, long numberOfCoefficients, double analysisWidth,
 	double dt, double f1_mel, double fmax_mel, double df_mel);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Sound_to_MFCC_h_ */
diff --git a/dwtools/Sound_to_MFCC.cpp b/dwtools/Sound_to_MFCC.cpp
index 81f0aa9..efd038c 100644
--- a/dwtools/Sound_to_MFCC.cpp
+++ b/dwtools/Sound_to_MFCC.cpp
@@ -31,7 +31,7 @@ MFCC Sound_to_MFCC (Sound me, long numberOfCoefficients, double analysisWidth, d
 		autoMFCC mfcc = MelSpectrogram_to_MFCC (mf.peek(), numberOfCoefficients);
 		return mfcc.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no MFCC created.");
+		Melder_throw (me, U": no MFCC created.");
 	}
 }
 
diff --git a/dwtools/Sound_to_MFCC.h b/dwtools/Sound_to_MFCC.h
index 7ef7463..f664be8 100644
--- a/dwtools/Sound_to_MFCC.h
+++ b/dwtools/Sound_to_MFCC.h
@@ -28,15 +28,7 @@
 #include "MFCC.h"
 #include "Sound.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 MFCC Sound_to_MFCC (Sound me, long numberOfCoefficients, double analysisWidth,
 	double dt, double f1_mel, double fmax_mel, double df_mel);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Sound_to_MFCC_h_ */
diff --git a/dwtools/Sound_to_Pitch2.cpp b/dwtools/Sound_to_Pitch2.cpp
index 340883a..c790d30 100644
--- a/dwtools/Sound_to_Pitch2.cpp
+++ b/dwtools/Sound_to_Pitch2.cpp
@@ -79,7 +79,7 @@ Pitch Sound_to_Pitch_shs (Sound me, double timeStep, double minimumPitch,
 		double atans = nPointsPerOctave * NUMlog2 (65.0 / 50.0) - 1;
 		// Number of speech samples in the downsampled signal in each frame:
 		// 100 for windowDuration == 0.04 and newSamplingFrequency == 2500
-		long nx = floor (windowDuration * newSamplingFrequency + 0.5);
+		long nx = lround (windowDuration * newSamplingFrequency);
 
 		// The minimum number of points for the fft is 256.
 		long nfft = 1;
@@ -93,7 +93,7 @@ Pitch Sound_to_Pitch_shs (Sound me, double timeStep, double minimumPitch,
 		// The number of points on the octave scale
 
 		double fminl2 = NUMlog2 (minimumPitch), fmaxl2 = NUMlog2 (maximumFrequency);
-		long nFrequencyPoints = (fmaxl2 - fminl2) * nPointsPerOctave;
+		long nFrequencyPoints = (long) floor ((fmaxl2 - fminl2) * nPointsPerOctave);
 		double dfl2 = (fmaxl2 - fminl2) / (nFrequencyPoints - 1);
 
 		autoSound sound = Sound_resample (me, newSamplingFrequency, 50);
@@ -198,7 +198,7 @@ Pitch Sound_to_Pitch_shs (Sound me, double timeStep, double minimumPitch,
 			pitchFrame -> nCandidates = 0; /* !!!!! */
 
 			for (long m = 1; m <= maxnSubharmonics + 1; m++) {
-				long kb = 1 + floor (nPointsPerOctave * NUMlog2 (m));
+				long kb = 1 + (long) floor (nPointsPerOctave * NUMlog2 (m));
 				for (long k = kb; k <= nFrequencyPoints; k++) {
 					sumspec[k - kb + 1] += al2[k] * hm;
 				}
@@ -258,7 +258,7 @@ Pitch Sound_to_Pitch_shs (Sound me, double timeStep, double minimumPitch,
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Pitch (shs) created.");
+		Melder_throw (me, U": no Pitch (shs) created.");
 	}
 }
 
@@ -271,7 +271,7 @@ Pitch Sound_to_Pitch_SPINET (Sound me, double timeStep, double windowDuration,
 		autoPitch thee = SPINET_to_Pitch (him.peek(), 0.15, ceiling, maxnCandidates);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Pitch (SPINET) created.");
+		Melder_throw (me, U": no Pitch (SPINET) created.");
 	}
 }
 
diff --git a/dwtools/Sound_to_Pitch2.h b/dwtools/Sound_to_Pitch2.h
index 22fe52f..c4d2117 100644
--- a/dwtools/Sound_to_Pitch2.h
+++ b/dwtools/Sound_to_Pitch2.h
@@ -28,10 +28,6 @@
 #include "Sound_extensions.h"
 #include "Pitch.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 Pitch Sound_to_Pitch_shs (Sound me, double timeStep, double minimumPitch,
 	double maximumFrequency, double ceiling, long maxnSubharmonics, long maxnCandidates,
 	double compressionFactor, long nDivisionsPerOctave);
@@ -40,8 +36,4 @@ Pitch Sound_to_Pitch_SPINET (Sound me, double timeStep, double windowDuration,
 	double minimumFrequencyHz, double maximumFrequencyHz, long nFilters,
 	double ceiling, int maxnCandidates);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Sound_to_Pitch2_h_ */
diff --git a/dwtools/Sound_to_SPINET.cpp b/dwtools/Sound_to_SPINET.cpp
index 3e24769..f38a275 100644
--- a/dwtools/Sound_to_SPINET.cpp
+++ b/dwtools/Sound_to_SPINET.cpp
@@ -69,7 +69,7 @@ SPINET Sound_to_SPINET (Sound me, double timeStep, double windowDuration,
 			bw[i] = 2 * NUMpi * b * (f[i] * (6.23e-6 * f[i] + 93.39e-3) + 28.52);
 		}
 
-		autoMelderProgress progress (L"SPINET analysis");
+		autoMelderProgress progress (U"SPINET analysis");
 
 		for (long i = 1; i <= nFilters; i++) {
 			double bb = (f[i] / 1000) * exp (- f[i] / 1000); // outer & middle ear and phase locking
@@ -88,8 +88,7 @@ SPINET Sound_to_SPINET (Sound me, double timeStep, double windowDuration,
 				Sounds_multiply (frame.peek(), window.peek());
 				thy y[i][j] = Sound_power (frame.peek()) * bb / gammaMaxAmplitude;
 			}
-			Melder_progress ( (double) i / nFilters, L"SPINET: filter ", Melder_integer (i), L" from ",
-			                   Melder_integer (nFilters), L".");
+			Melder_progress ( (double) i / nFilters, U"SPINET: filter ", i, U" from ", nFilters, U".");
 		}
 
 		// Excitatory and inhibitory area functions
@@ -117,7 +116,7 @@ SPINET Sound_to_SPINET (Sound me, double timeStep, double windowDuration,
 			}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ":  no SPINET created.");
+		Melder_throw (me, U":  no SPINET created.");
 	}
 }
 
diff --git a/dwtools/Sound_to_SPINET.h b/dwtools/Sound_to_SPINET.h
index fd78bcc..0e8bca4 100644
--- a/dwtools/Sound_to_SPINET.h
+++ b/dwtools/Sound_to_SPINET.h
@@ -28,16 +28,8 @@
 #include "SPINET.h"
 #include "Sound_extensions.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
 SPINET Sound_to_SPINET (Sound me, double timeStep, double windowDuration,
 	double minimumFrequencyHz, double maximumFrequencyHz, long nFilters,
 	double excitationErbProportion, double inhibitionErbProportion);
 
-#ifdef __cplusplus
-	}
-#endif
-
 #endif /* _Sound_to_SPINET_h_ */
diff --git a/dwtools/Sounds_to_DTW.cpp b/dwtools/Sounds_to_DTW.cpp
index aec915e..5f10a73 100644
--- a/dwtools/Sounds_to_DTW.cpp
+++ b/dwtools/Sounds_to_DTW.cpp
@@ -37,7 +37,7 @@ DTW Sounds_to_DTW (Sound me, Sound thee, double analysisWidth, double dt, double
         DTW_and_Polygon_findPathInside (him.peek(), p.peek(), slope, 0);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no DTW created.");
+		Melder_throw (me, U": no DTW created.");
 	}
 }
 
diff --git a/dwtools/Spectrogram_extensions.cpp b/dwtools/Spectrogram_extensions.cpp
index 3e391c7..ae4ea69 100644
--- a/dwtools/Spectrogram_extensions.cpp
+++ b/dwtools/Spectrogram_extensions.cpp
@@ -29,39 +29,39 @@
 Thing_implement (BandFilterSpectrogram, Matrix, 2);
 
 void structBandFilterSpectrogram :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"Time sampling:");
-	MelderInfo_writeLine (L"   Number of time slices (frames): ", Melder_integer (nx));
-	MelderInfo_writeLine (L"   Time step (frame distance): ", Melder_double (dx), L" seconds");
-	MelderInfo_writeLine (L"   First time slice (frame centre) at: ", Melder_double (x1), L" seconds");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"Time sampling:");
+	MelderInfo_writeLine (U"   Number of time slices (frames): ", nx);
+	MelderInfo_writeLine (U"   Time step (frame distance): ", dx, U" seconds");
+	MelderInfo_writeLine (U"   First time slice (frame centre) at: ", x1, U" seconds");
 }
 
 void structBarkSpectrogram :: v_info () {
 	structBandFilterSpectrogram :: v_info ();
-	MelderInfo_writeLine (L"Frequency domain:");
-	MelderInfo_writeLine (L"   Lowest frequency: ", Melder_double (ymin), L" ", v_getFrequencyUnit ());
-	MelderInfo_writeLine (L"   Highest frequency: ", Melder_double (ymax), L" ", v_getFrequencyUnit ());
-	MelderInfo_writeLine (L"   Total bandwidth: ", Melder_double (ymax - ymin), L" ", v_getFrequencyUnit ());
-	MelderInfo_writeLine (L"Frequency sampling:");
-	MelderInfo_writeLine (L"   Number of frequency bands (bins): ", Melder_integer (ny));
-	MelderInfo_writeLine (L"   Frequency step (bin width): ", Melder_double (dy), L" ", v_getFrequencyUnit ());
-	MelderInfo_writeLine (L"   First frequency band around (bin centre at): ", Melder_double (y1), L" ", v_getFrequencyUnit ());
+	MelderInfo_writeLine (U"Frequency domain:");
+	MelderInfo_writeLine (U"   Lowest frequency: ", ymin, U" ", v_getFrequencyUnit ());
+	MelderInfo_writeLine (U"   Highest frequency: ", ymax, U" ", v_getFrequencyUnit ());
+	MelderInfo_writeLine (U"   Total bandwidth: ", ymax - ymin, U" ", v_getFrequencyUnit ());
+	MelderInfo_writeLine (U"Frequency sampling:");
+	MelderInfo_writeLine (U"   Number of frequency bands (bins): ", ny);
+	MelderInfo_writeLine (U"   Frequency step (bin width): ", dy, U" ", v_getFrequencyUnit ());
+	MelderInfo_writeLine (U"   First frequency band around (bin centre at): ", y1, U" ", v_getFrequencyUnit ());
 }
 
 void structMelSpectrogram :: v_info () {
 	structBandFilterSpectrogram :: v_info ();
-	MelderInfo_writeLine (L"Frequency domain:");
-	MelderInfo_writeLine (L"   Lowest frequency: ", Melder_double (ymin), L" ", v_getFrequencyUnit ());
-	MelderInfo_writeLine (L"   Highest frequency: ", Melder_double (ymax), L" ", v_getFrequencyUnit ());
-	MelderInfo_writeLine (L"   Total bandwidth: ", Melder_double (ymax - ymin), L" ", v_getFrequencyUnit ());
-	MelderInfo_writeLine (L"Frequency sampling:");
-	MelderInfo_writeLine (L"   Number of frequency bands (bins): ", Melder_integer (ny));
-	MelderInfo_writeLine (L"   Frequency step (bin width): ", Melder_double (dy), L" ", v_getFrequencyUnit ());
-	MelderInfo_writeLine (L"   First frequency band around (bin centre at): ", Melder_double (y1), L" ", v_getFrequencyUnit ());
+	MelderInfo_writeLine (U"Frequency domain:");
+	MelderInfo_writeLine (U"   Lowest frequency: ", ymin, U" ", v_getFrequencyUnit ());
+	MelderInfo_writeLine (U"   Highest frequency: ", ymax, U" ", v_getFrequencyUnit ());
+	MelderInfo_writeLine (U"   Total bandwidth: ", ymax - ymin, U" ", v_getFrequencyUnit ());
+	MelderInfo_writeLine (U"Frequency sampling:");
+	MelderInfo_writeLine (U"   Number of frequency bands (bins): ", ny);
+	MelderInfo_writeLine (U"   Frequency step (bin width): ", dy, U" ", v_getFrequencyUnit ());
+	MelderInfo_writeLine (U"   First frequency band around (bin centre at): ", y1, U" ", v_getFrequencyUnit ());
 }
 
 // Preconditions: 1 <= iframe <= nx; 1 <= irow <= ny
@@ -88,7 +88,7 @@ Matrix Spectrogram_to_Matrix_dB (Spectrogram me, double reference, double scaleF
 				if (my z[i][j] > 0) {
 					val = scaleFactor * log10 (my z[i][j] / reference);
 				} else if (my z[i][j] < 0) {
-					Melder_throw ("Negative power in Spectrogram.");
+					Melder_throw (U"Negative power in Spectrogram.");
 				}
 				if (val < floor_dB) {
 					val = floor_dB;
@@ -98,7 +98,7 @@ Matrix Spectrogram_to_Matrix_dB (Spectrogram me, double reference, double scaleF
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Matrix with dB values not created.");
+		Melder_throw (U"Matrix with dB values not created.");
 	}
 }
 
@@ -135,8 +135,8 @@ static void NUMinverseCosineTransform (double *x, double *y, long n, double **co
 	}
 }
 
-/* Precondition: 1. CC object has been created but individual frames not yest initialized
- *              2. Domains and number of frames conform
+/* Precondition: 1. CC object has been created but individual frames not yet initialized
+ *               2. Domains and number of frames conform
  * Steps:
  * 1. transform power-spectra to dB-spectra
  * 2. cosine transform of dB-spectrum
@@ -202,7 +202,7 @@ MelSpectrogram MFCC_to_MelSpectrogram (MFCC me, long first, long last, bool c0)
 		CC_into_BandFilterSpectrogram (me, thee.peek(), first, last, c0);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, "MelSpectrogram not created.");
+		Melder_throw (me, U"MelSpectrogram not created.");
 	}
 }
 
@@ -212,21 +212,22 @@ MFCC MelSpectrogram_to_MFCC (MelSpectrogram me, long numberOfCoefficients) {
 			numberOfCoefficients = my ny - 1;
 		}
 		numberOfCoefficients = numberOfCoefficients > my ny - 1 ? my ny - 1 : numberOfCoefficients;
+		// 20130220 new interpretation of maximumNumberOfCoefficients necessary for inverse transform 
 		autoMFCC thee = MFCC_create (my xmin, my xmax, my nx, my dx, my x1, my ny - 1, my ymin, my ymax);
 		BandFilterSpectrogram_into_CC (me, thee.peek(), numberOfCoefficients);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": MFCC not created.");
+		Melder_throw (me, U": MFCC not created.");
 	}
 }
 
-BarkSpectrogram BarkSpectrogram_create (double tmin, double tmax, long nt, double dt, double t1, double fmin, double fmax, long nf, double df, long f1) {
+BarkSpectrogram BarkSpectrogram_create (double tmin, double tmax, long nt, double dt, double t1, double fmin, double fmax, long nf, double df, double f1) {
 	try {
 		autoBarkSpectrogram me = Thing_new (BarkSpectrogram);
 		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, fmin, fmax, nf, df, f1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("BarkSpectrogram not created.");
+		Melder_throw (U"BarkSpectrogram not created.");
 	}
 }
 
@@ -237,7 +238,7 @@ double BandFilterSpectrogram_getFrequencyInHertz (BandFilterSpectrogram me, doub
 // xmin, xmax in hz versus bark/mel or lin
 void BandFilterSpectrogram_drawFrequencyScale (BandFilterSpectrogram me, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish) {
 	if (xmin < 0 || xmax < 0 || ymin < 0 || ymax < 0) {
-		Melder_warning (L"Frequencies must be >= 0.");
+		Melder_warning (U"Frequencies must be >= 0.");
 		return;
 	}
 
@@ -273,12 +274,10 @@ void BandFilterSpectrogram_drawFrequencyScale (BandFilterSpectrogram me, Graphic
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		autoMelderString verticalText;
-		MelderString_append (&verticalText, L"Frequency (", my v_getFrequencyUnit (), L")");
-		Graphics_textLeft (g, 1, verticalText.string);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_textBottom (g, 1, L"Frequency (Hz)");
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, Melder_cat (U"Frequency (", my v_getFrequencyUnit (), U")"));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textBottom (g, true, U"Frequency (Hz)");
 	}
 }
 
@@ -312,12 +311,10 @@ void BandFilterSpectrogram_paintImage (BandFilterSpectrogram me, Graphics g, dou
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		autoMelderString yText;
-		MelderString_append (&yText, L"Frequency (", my v_getFrequencyUnit (), L")");
-		Graphics_textLeft (g, 1, yText.string);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_textBottom (g, 1, L"Time (s)");
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, Melder_cat (U"Frequency (", my v_getFrequencyUnit (), U")"));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textBottom (g, true, U"Time (s)");
 	}
 }
 
@@ -370,12 +367,10 @@ void BandFilterSpectrogram_drawSpectrumAtNearestTimeSlice (BandFilterSpectrogram
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"Power (dB)");
-		autoMelderString xText;
-		MelderString_append (&xText, L"Frequency (", my v_getFrequencyUnit (), L")");
-		Graphics_textBottom (g, 1, xText.string);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Power (dB)");
+		Graphics_textBottom (g, true, Melder_cat (U"Frequency (", my v_getFrequencyUnit (), U")"));
 	}
 }
 
@@ -390,8 +385,8 @@ void BarkSpectrogram_drawSekeyHansonFilterFunctions (BarkSpectrogram me, Graphic
 		zmin = my v_hertzToFrequency (xmin); zmax = my v_hertzToFrequency (xmax);
 	}
 	if (ymin >= ymax) {
-		ymin = yscale_dB ? -60 : 0;
-		ymax = yscale_dB ? 0 : 1;
+		ymin = yscale_dB ? -60 : 0.0;
+		ymax = yscale_dB ? 0.0 : 1.0;
 	}
 	fromFilter = fromFilter <= 0 ? 1 : fromFilter;
 	toFilter = toFilter <= 0 || toFilter > my ny ? my ny : toFilter;
@@ -414,8 +409,8 @@ void BarkSpectrogram_drawSekeyHansonFilterFunctions (BarkSpectrogram me, Graphic
 		double zMid = Matrix_rowToY (me, ifilter);
 		for (long iz = 1; iz <= n; iz++) {
 			double z = xz[iz] - (zMid - 0.215);
-			double amp = 7 - 7.5 * z - 17.5 * sqrt (0.196 + z * z);
-			y[iz] = yscale_dB ? amp : pow (10, amp / 10);
+			double amp = 7.0 - 7.5 * z - 17.5 * sqrt (0.196 + z * z);
+			y[iz] = yscale_dB ? amp : pow (10.0, amp / 10.0);
 		}
 		// the drawing
 		double x1 = xIsHertz ? xhz[1] : xz[1], y1 = y[1];
@@ -433,14 +428,12 @@ void BarkSpectrogram_drawSekeyHansonFilterFunctions (BarkSpectrogram me, Graphic
 	Graphics_unsetInner (g);
 
 	if (garnish) {
-		double distance = yscale_dB ? 10 : 0.5;
+		double distance = yscale_dB ? 10.0 : 0.5;
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1, distance, 1, 1, 0);
-		Graphics_textLeft (g, 1, yscale_dB ? L"Amplitude (dB)" : L"Amplitude");
-		autoMelderString xText;
-		MelderString_append (&xText, L"Frequency (", xIsHertz ? L"Hz" : my v_getFrequencyUnit (), L")");
-		Graphics_textBottom (g, 1, xText.string);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, distance, true, true, false);
+		Graphics_textLeft (g, true, yscale_dB ? U"Amplitude (dB)" : U"Amplitude");
+		Graphics_textBottom (g, true, Melder_cat (U"Frequency (", xIsHertz ? U"Hz" : my v_getFrequencyUnit (), U")"));
 	}
 }
 
@@ -452,20 +445,20 @@ MelSpectrogram MelSpectrogram_create (double tmin, double tmax, long nt, double
 		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, fmin, fmax, nf, df, f1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("MelSpectrogram not created.");
+		Melder_throw (U"MelSpectrogram not created.");
 	}
 }
 
 void BandFilterSpectrogram_drawTimeSlice (I, Graphics g, double t, double fmin,
-                               double fmax, double min, double max, const wchar_t *xlabel, int garnish) {
+                               double fmax, double min, double max, const char32 *xlabel, int garnish) {
 	iam (Matrix);
 	Matrix_drawSliceY (me, g, t, fmin, fmax, min, max);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 		if (xlabel) {
-			Graphics_textBottom (g, 0, xlabel);
+			Graphics_textBottom (g, false, xlabel);
 		}
 	}
 }
@@ -482,8 +475,8 @@ void MelSpectrogram_drawTriangularFilterFunctions (MelSpectrogram me, Graphics g
 	}
 
 	if (ymin >= ymax) {
-		ymin = yscale_dB ? -60 : 0;
-		ymax = yscale_dB ? 0 : 1;
+		ymin = yscale_dB ? -60.0 : 0.0;
+		ymax = yscale_dB ? 0.0 : 1.0;
 	}
 	fromFilter = fromFilter <= 0 ? 1 : fromFilter;
 	toFilter = toFilter <= 0 || toFilter > my ny ? my ny : toFilter;
@@ -511,7 +504,7 @@ void MelSpectrogram_drawTriangularFilterFunctions (MelSpectrogram me, Graphics g
 			for (long iz = 1; iz <= n; iz++) {
 				double z = xz[iz];
 				double amp = NUMtriangularfilter_amplitude (zl, zc, zh, z);
-				y[iz] = yscale_dB ? (amp > 0 ? 20 * log10 (amp) : ymin - 10) : amp;
+				y[iz] = yscale_dB ? (amp > 0.0 ? 20.0 * log10 (amp) : ymin - 10.0) : amp;
 			}
 			double x1 = xIsHertz ? xhz[1] : xz[1], y1 = y[1];
 			if (NUMdefined (y1)) {
@@ -542,12 +535,10 @@ void MelSpectrogram_drawTriangularFilterFunctions (MelSpectrogram me, Graphics g
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1, yscale_dB ? 10 : 0.5, 1, 1, 0);
-		Graphics_textLeft (g, 1, yscale_dB ? L"Amplitude (dB)" : L"Amplitude");
-		autoMelderString bottomText;
-		MelderString_append (&bottomText, L"Frequency (", (xIsHertz ? L"Hz" : my v_getFrequencyUnit ()), L")");
-		Graphics_textBottom (g, 1, bottomText.string);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, yscale_dB ? 10.0 : 0.5, true, true, false);
+		Graphics_textLeft (g, true, yscale_dB ? U"Amplitude (dB)" : U"Amplitude");
+		Graphics_textBottom (g, true, Melder_cat (U"Frequency (", ( xIsHertz ? U"Hz" : my v_getFrequencyUnit () ), U")"));
 	}
 }
 
@@ -562,19 +553,18 @@ Matrix BandFilterSpectrogram_to_Matrix (BandFilterSpectrogram me, int to_dB) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
-BarkSpectrogram Matrix_to_BarkSpectrogram (I) {
-	iam (Matrix);
+BarkSpectrogram Matrix_to_BarkSpectrogram (Matrix me) {
 	try {
 		autoBarkSpectrogram thee = BarkSpectrogram_create (my xmin, my xmax, my nx, my dx, my x1,
 			my ymin, my ymax, my ny, my dy, my y1);
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to BarkSpectrogram.");
+		Melder_throw (me, U": not converted to BarkSpectrogram.");
 	}
 }
 
@@ -584,7 +574,7 @@ MelSpectrogram Matrix_to_MelSpectrogram (Matrix me) {
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to MelSpectrogram.");
+		Melder_throw (me, U": not converted to MelSpectrogram.");
 	}
 }
 
@@ -600,7 +590,7 @@ Intensity BandFilterSpectrogram_to_Intensity (BandFilterSpectrogram me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": Intensity not created.");
+		Melder_throw (me, U": Intensity not created.");
 	}
 }
 
@@ -621,7 +611,7 @@ void BandFilterSpectrogram_equalizeIntensities (BandFilterSpectrogram me, double
 void BandFilterSpectrogram_and_PCA_drawComponent (BandFilterSpectrogram me, PCA thee, Graphics g, long component, double dblevel,
                                        double frequencyOffset, double scale, double tmin, double tmax, double fmin, double fmax) {
 	if (component < 1 || component > thy numberOfEigenvalues) {
-		Melder_throw ("Component too large.");
+		Melder_throw (U"Component too large.");
 	}
 
 	// Scale Intensity
@@ -636,4 +626,12 @@ void BandFilterSpectrogram_and_PCA_drawComponent (BandFilterSpectrogram me, PCA
 	Matrix_drawRows (him.peek(), g, tmin, tmax, component - 0.5, component + 0.5, fmin, fmax);
 }
 
+/*
+ * MelSpectrograms_to_DTW (MelSpectrogram me, MelSpectrogram thee, dtw-params);
+ * comparison on the basis of mfcc
+ * BarkSpectrograms_to_DTW (BarkSpectrogram me, BarkSpectrogram thee, dtw-params);
+ * comparison on the basis of bfcc!
+ */
+
+
 /* End of file Spectrogram_extensions.cpp */
diff --git a/dwtools/Spectrogram_extensions.h b/dwtools/Spectrogram_extensions.h
index c294148..20f4556 100644
--- a/dwtools/Spectrogram_extensions.h
+++ b/dwtools/Spectrogram_extensions.h
@@ -48,31 +48,36 @@
 #define BandFilterSpectrogram_MEL   3
 
 Thing_define (BandFilterSpectrogram, Matrix) {
-	// new methods:
-	public:
-		virtual void v_info ();
-		virtual double v_getValueAtSample (long icol, long irow, int units);
-		virtual double v_frequencyToHertz (double f) { return f; }
-		virtual double v_hertzToFrequency (double hertz) { return hertz; }
-		virtual const wchar_t *v_getFrequencyUnit () { return L"Hz"; }
+	void v_info ()
+		override;
+	double v_getValueAtSample (long icol, long irow, int units)
+		override;
+
+	virtual double v_frequencyToHertz (double f) { return f; }
+	virtual double v_hertzToFrequency (double hertz) { return hertz; }
+	virtual const char32 *v_getFrequencyUnit () { return U"Hz"; }
 };
 
 Thing_define (BarkSpectrogram, BandFilterSpectrogram) {
-	// overridden methods:
-	public:
-		virtual void v_info ();
-		virtual double v_frequencyToHertz (double f) { return NUMbarkToHertz2 (f); }
-		virtual double v_hertzToFrequency (double hertz) { return NUMhertzToBark2 (hertz); }
-		virtual const wchar_t *v_getFrequencyUnit () { return L"bark"; }
+	void v_info ()
+		override;
+	double v_frequencyToHertz (double f)
+		override { return NUMbarkToHertz2 (f); }
+	double v_hertzToFrequency (double hertz)
+		override { return NUMhertzToBark2 (hertz); }
+	const char32 *v_getFrequencyUnit ()
+		override { return U"bark"; }
 };
 
 Thing_define (MelSpectrogram, BandFilterSpectrogram) {
-	// overridden methods:
-	public:
-		virtual void v_info ();
-		virtual double v_frequencyToHertz (double f) { return NUMmelToHertz2 (f); }
-		virtual double v_hertzToFrequency (double hertz) { return NUMhertzToMel2 (hertz); }
-		virtual const wchar_t *v_getFrequencyUnit () { return L"mel"; }
+	void v_info ()
+		override;
+	double v_frequencyToHertz (double f)
+		override { return NUMmelToHertz2 (f); }
+	double v_hertzToFrequency (double hertz)
+		override { return NUMhertzToMel2 (hertz); }
+	const char32 *v_getFrequencyUnit ()
+		override { return U"mel"; }
 };
 
 /*
@@ -94,6 +99,9 @@ Intensity BandFilterSpectrogram_to_Intensity (BandFilterSpectrogram me);
 
 void BandFilterSpectrogram_drawFrequencyScale (BandFilterSpectrogram me, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish);
 
+void BandFilterSpectrogram_drawTimeSlice (I, Graphics g, double t, double fmin,
+                               double fmax, double min, double max, const char32 *xlabel, int garnish);
+
 void BarkSpectrogram_drawSekeyHansonFilterFunctions (BarkSpectrogram me, Graphics g, bool xIsHertz, int fromFilter, int toFilter, double zmin, double zmax, bool yscale_dB, double ymin, double ymax, int garnish);
 
 void BandFilterSpectrogram_drawSpectrumAtNearestTimeSlice (BandFilterSpectrogram me, Graphics g, double time, double fmin, double fmax, double dBmin, double dBmax, int garnish);
@@ -101,7 +109,7 @@ void BandFilterSpectrogram_drawSpectrumAtNearestTimeSlice (BandFilterSpectrogram
 void BandFilterSpectrogram_paintImage (BandFilterSpectrogram me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum, int garnish);
 
 BarkSpectrogram BarkSpectrogram_create (double tmin, double tmax, long nt, double dt,
-	double t1, double fmin, double fmax, long nf, double df, long f1);
+	double t1, double fmin, double fmax, long nf, double df, double f1);
 
 BarkSpectrogram Matrix_to_BarkSpectrogram (Matrix me);
 
@@ -131,4 +139,8 @@ Matrix Spectrogram_to_Matrix_dB (Spectrogram me, double reference, double scaleF
 // dbs = scaleFactor * log10 (value/reference);
 // if (dbs < floor_db) { dbs = floor_dB }
 
+void BandFilterSpectrogram_into_CC (BandFilterSpectrogram me, CC thee, long numberOfCoefficients);
+
+void CC_into_BandFilterSpectrogram (CC me, BandFilterSpectrogram thee, long first, long last, bool use_c0);
+
 #endif /* _Spectrogram_extensions_h_ */
diff --git a/dwtools/Spectrum_extensions.cpp b/dwtools/Spectrum_extensions.cpp
index bffdac9..013a9d8 100644
--- a/dwtools/Spectrum_extensions.cpp
+++ b/dwtools/Spectrum_extensions.cpp
@@ -27,7 +27,7 @@
  djmw 20061218 Introduction of Melder_information<12...9>
  djmw 20071022 phase_unwrap initialize phase = 0.
  djmw 20080122 float -> double
- djmw 20080202 Warning in Spectrum_drawPhases to wchar_t
+ djmw 20080202 Warning in Spectrum_drawPhases to wchar
  djmw 20080411 Removed define NUM2pi
 */
 
@@ -102,7 +102,7 @@ static void getSpectralValues (struct tribolet_struct *tbs, double freq_rad,
 */
 static int phase_check (double pv, double *phase, double thlcon) {
 	double a0 = (*phase - pv) / NUM2pi;
-	long k = a0;
+	long k = (long) floor (a0);   // ppgb: instead of truncation toward zero
 	double a1 = pv + k * NUM2pi;
 	double a2 = a1 + SIGN (NUM2pi, a0);
 	double a3 = fabs (a1 - *phase);
@@ -207,7 +207,7 @@ Matrix Spectrum_unwrap (Spectrum me) {
 		nfft *= 2;
 
 		if (nfft / 2 != my nx - 1) {
-			Melder_throw ("Dimension of Spectrum is not (power of 2 - 1).");
+			Melder_throw (U"Dimension of Spectrum is not (power of 2 - 1).");
 		}
 
 		autoSound x = Spectrum_to_Sound (me);
@@ -225,7 +225,7 @@ Matrix Spectrum_unwrap (Spectrum me) {
 		tbs.thlcon = THLCON;
 		tbs.x = x -> z[1];
 		tbs.nx = x -> nx;
-		tbs.l = (pow (2, EXP2) + 0.1);
+		tbs.l = (long) floor (pow (2, EXP2) + 0.1);
 		tbs.ddf = NUM2pi / ( (tbs.l) * nfft);
 		tbs.reverse_sign = my z[1][1] < 0;
 		tbs.count = 0;
@@ -245,7 +245,7 @@ Matrix Spectrum_unwrap (Spectrum me) {
 
 		tbs.dvtmn2 = (2 * tbs.dvtmn2 - snx -> z[2][1] - snx -> z[2][my nx]) / (my nx - 1);
 
-		autoMelderProgress progress (L"Phase unwrapping");
+		autoMelderProgress progress (U"Phase unwrapping");
 
 		double pphase = 0, phase = 0;
 		double ppdvt = snx -> z[2][1];
@@ -257,11 +257,11 @@ Matrix Spectrum_unwrap (Spectrum me) {
 			phase = phase_unwrap (&tbs, pfreq, ppv, pdvt, &pphase, &ppdvt);
 			ppdvt = pdvt;
 			thy z[2][i] = pphase = phase;
-			Melder_progress ( (double) i / my nx, Melder_integer (i),
-			                   L" unwrapped phases from ", Melder_integer (my nx), L".");
+			Melder_progress ( (double) i / my nx, i,
+			                   U" unwrapped phases from ", my nx, U".");
 		}
 
-		long iphase = (phase / NUMpi + 0.1);
+		long iphase = (long) floor (phase / NUMpi + 0.1);   // ppgb: better than truncation toward zero
 
 		if (remove_linear_part) {
 			phase /= my nx - 1;
@@ -269,23 +269,23 @@ Matrix Spectrum_unwrap (Spectrum me) {
 				thy z[2][i] -= phase * (i - 1);
 			}
 		}
-		Melder_information (L"Number of spectral values: ", Melder_integer (tbs.count));
-		Melder_information (L" iphase = ", Melder_integer (iphase));
+		Melder_information (U"Number of spectral values: ", tbs.count);
+		Melder_information (U" iphase = ", iphase);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not unwrapped.");
+		Melder_throw (me, U": not unwrapped.");
 	}
 }
 
 void Spectrum_drawPhases (Spectrum me, Graphics g, double fmin, double fmax,
                           double phase_min, double phase_max, int unwrap, int garnish) {
-	autoMatrix thee = 0;
+	autoMatrix thee;
 	int reverse_sign = my z[1][1] < 0;
 
 	if (unwrap) {
-		thee.reset (Spectrum_unwrap (me));
+		thee = Spectrum_unwrap (me);
 	} else {
-		thee.reset (Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 1, 2, 2, 1, 1));
+		thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 1.0, 2.0, 2, 1.0, 1.0);
 		for (long i = 1; i <= my nx; i ++) {
 			thy z[2][i] = PPVPHA (my z[1][i], my z[2][i], reverse_sign);
 		}
@@ -301,7 +301,7 @@ Spectrum Spectra_multiply (Spectrum me, Spectrum thee) {
 	try {
 		if (my nx != thy nx || my x1 != thy x1 || my xmax != thy xmax ||
 		        my dx != thy dx) {
-			Melder_throw ("Dimensions of both spectra do not conform.");
+			Melder_throw (U"Dimensions of both spectra do not conform.");
 		}
 		autoSpectrum him = Data_copy (me);
 
@@ -311,7 +311,7 @@ Spectrum Spectra_multiply (Spectrum me, Spectrum thee) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not multiplied.");
+		Melder_throw (me, U": not multiplied.");
 	}
 }
 
@@ -330,11 +330,11 @@ Spectrum Spectrum_resample (Spectrum me, long numberOfFrequencies) {
 		NUMmatrix_copyElements<double> (thy z, his z, 1, 2, 1, numberOfFrequencies);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not resampled.");
+		Melder_throw (me, U": not resampled.");
 	}
 }
 
-Spectrum Spectrum_shiftFrequencies2 (Spectrum me, double shiftBy, bool changeMaximumFrequency) {
+static Spectrum Spectrum_shiftFrequencies2 (Spectrum me, double shiftBy, bool changeMaximumFrequency) {
 	try {
 		double xmax = my xmax;
 		long numberOfFrequencies = my nx, interpolationDepth = 50;
@@ -355,7 +355,7 @@ Spectrum Spectrum_shiftFrequencies2 (Spectrum me, double shiftBy, bool changeMax
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not shifted.");
+		Melder_throw (me, U": not shifted.");
 	}
 }
 
@@ -364,7 +364,7 @@ Spectrum Spectrum_shiftFrequencies (Spectrum me, double shiftBy, double newMaxim
 		double xmax = my xmax;
 		long numberOfFrequencies = my nx;
 		if (newMaximumFrequency != 0) {
-			numberOfFrequencies = newMaximumFrequency / my dx + 1;
+			numberOfFrequencies = (long) floor (newMaximumFrequency / my dx) + 1;
 			xmax = newMaximumFrequency;
 		}
 		autoSpectrum thee = Spectrum_create (xmax, numberOfFrequencies);
@@ -386,7 +386,7 @@ Spectrum Spectrum_shiftFrequencies (Spectrum me, double shiftBy, double newMaxim
 		thy z[1][thy nx] = amp; thy z[2][thy nx] = 0;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not shifted.");
+		Melder_throw (me, U": not shifted.");
 	}
 }
 
@@ -395,7 +395,7 @@ Spectrum Spectrum_compressFrequencyDomain (Spectrum me, double fmax, long interp
 		double fdomain = my xmax - my xmin, factor = fdomain / fmax ;
 		//long numberOfFrequencies = 1.0 + fmax / my dx; // keep dx the same, otherwise the "duration" changes
 		double xmax = my xmax / factor;
-		long numberOfFrequencies = my nx / factor; // keep dx the same, otherwise the "duration" changes
+		long numberOfFrequencies = (long) floor (my nx / factor); // keep dx the same, otherwise the "duration" changes
 		autoSpectrum thee = Spectrum_create (xmax, numberOfFrequencies);
 		thy z[1][1] = my z[1][1]; thy z[2][1] = my z[2][1];
 		double df = freqscale == 1 ? factor * my dx : log10 (fdomain) / (numberOfFrequencies - 1);
@@ -409,20 +409,22 @@ Spectrum Spectrum_compressFrequencyDomain (Spectrum me, double fmax, long interp
 				x = NUM_interpolate_sinc (my z[1], my nx, index, interpolationDepth);
 				y = NUM_interpolate_sinc (my z[2], my nx, index, interpolationDepth);
 			} else {
+				x = NUMundefined;   // ppgb: better than data from random memory
+				y = NUMundefined;
 			}
 			thy z[1][i] = x; thy z[2][i] = y;
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not compressed.");
+		Melder_throw (me, U": not compressed.");
 	}
 }
 
-void Spectrum_fitTiltLine (Spectrum me, double fmin, double fmax, bool logf, double bandwidth, double *a, double *intercept, int method) {
+static void Spectrum_fitTiltLine (Spectrum me, double fmin, double fmax, bool logf, double bandwidth, double *a, double *intercept, int method) {
 	(void) me; (void) fmin; (void) fmax; (void) logf; (void) bandwidth; (void) a; (void) intercept; (void) method;
 	try {
 	} catch (MelderError) {
-		Melder_throw ("Tilt line not fitted.");
+		Melder_throw (U"Tilt line not fitted.");
 	}
 }
 
diff --git a/dwtools/SpeechSynthesizer.cpp b/dwtools/SpeechSynthesizer.cpp
index 96866e6..759d111 100644
--- a/dwtools/SpeechSynthesizer.cpp
+++ b/dwtools/SpeechSynthesizer.cpp
@@ -1,6 +1,6 @@
 /* SpeechSynthesizer.cpp
  *
-//  * Copyright (C) 2011-2013 David Weenink
+//  * Copyright (C) 2011-2013, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -50,7 +50,7 @@
 extern structMelderDir praatDir;
 extern int option_phoneme_events;
 
-Thing_implement (SpeechSynthesizerVoice, Data, 0);
+Thing_implement (SpeechSynthesizerVoice, Daata, 0);
 
 SpeechSynthesizerVoice SpeechSynthesizerVoice_create (long numberOfFormants) {
 	try {
@@ -71,7 +71,7 @@ SpeechSynthesizerVoice SpeechSynthesizerVoice_create (long numberOfFormants) {
 		SpeechSynthesizerVoice_setDefaults (me.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SpeechSynthesizerVoice not created.");
+		Melder_throw (U"SpeechSynthesizerVoice not created.");
 	}
 }
 
@@ -80,7 +80,7 @@ void SpeechSynthesizerVoice_setDefaults (SpeechSynthesizerVoice me) {
 }
 
 void SpeechSynthesizerVoice_initFromEspeakVoice (SpeechSynthesizerVoice me, voice_t *voice) {
-	my d_v_name = Melder_wcsdup (Melder_peekUtf8ToWcs (voice -> v_name));
+	my d_v_name = Melder_dup (Melder_peek8to32 (voice -> v_name));
 
 	my d_phoneme_tab_ix = voice -> phoneme_tab_ix;
 	my d_pitch_base = voice -> pitch_base;
@@ -118,28 +118,28 @@ void SpeechSynthesizerVoice_initFromEspeakVoice (SpeechSynthesizerVoice me, voic
 	}
 }
 
-Thing_implement (SpeechSynthesizer, Data, 0);
+Thing_implement (SpeechSynthesizer, Daata, 0);
 
 void structSpeechSynthesizer :: v_info () {
 	SpeechSynthesizer_Parent :: v_info ();
-	MelderInfo_writeLine (L"Voice language: ", d_voiceLanguageName);
-	MelderInfo_writeLine (L"Voice variant: ", d_voiceVariantName);
-	MelderInfo_writeLine (L"Input text format: ", (d_inputTextFormat == SpeechSynthesizer_INPUT_TEXTONLY ? L"text only" :
-		d_inputTextFormat == SpeechSynthesizer_INPUT_PHONEMESONLY ? L"phonemes only" : L"tagged text"));
-	MelderInfo_writeLine (L"Input phoneme coding: ", (d_inputPhonemeCoding == SpeechSynthesizer_PHONEMECODINGS_KIRSHENBAUM ? L"Kirshenbaum" : L"???"));
-	MelderInfo_writeLine (L"Sampling frequency: ", Melder_double (d_samplingFrequency), L" Hz");
-	MelderInfo_writeLine (L"Word gap: ", Melder_double (d_wordgap), L" s");
-	MelderInfo_writeLine (L"Pitch adjustment value: ", Melder_integer (d_pitchAdjustment), L" (0-100)");
-	MelderInfo_writeLine (L"Speeking rate: ", Melder_integer (d_wordsPerMinute), L" words per minute", (d_estimateWordsPerMinute ? L" (but estimated from data if possible)" : L" (fixed)"));
-
-	MelderInfo_writeLine (L"Output phoneme coding: ", (d_inputPhonemeCoding == SpeechSynthesizer_PHONEMECODINGS_KIRSHENBAUM ? L"Kirshenbaum" : d_inputPhonemeCoding == SpeechSynthesizer_PHONEMECODINGS_IPA ? L"IPA" : L"???"));
+	MelderInfo_writeLine (U"Voice language: ", d_voiceLanguageName);
+	MelderInfo_writeLine (U"Voice variant: ", d_voiceVariantName);
+	MelderInfo_writeLine (U"Input text format: ", (d_inputTextFormat == SpeechSynthesizer_INPUT_TEXTONLY ? U"text only" :
+		d_inputTextFormat == SpeechSynthesizer_INPUT_PHONEMESONLY ? U"phonemes only" : U"tagged text"));
+	MelderInfo_writeLine (U"Input phoneme coding: ", (d_inputPhonemeCoding == SpeechSynthesizer_PHONEMECODINGS_KIRSHENBAUM ? U"Kirshenbaum" : U"???"));
+	MelderInfo_writeLine (U"Sampling frequency: ", d_samplingFrequency, U" Hz");
+	MelderInfo_writeLine (U"Word gap: ", d_wordgap, U" s");
+	MelderInfo_writeLine (U"Pitch adjustment value: ", d_pitchAdjustment, U" (0-100)");
+	MelderInfo_writeLine (U"Speeking rate: ", d_wordsPerMinute, U" words per minute", (d_estimateWordsPerMinute ? U" (but estimated from data if possible)" : U" (fixed)"));
+
+	MelderInfo_writeLine (U"Output phoneme coding: ", (d_inputPhonemeCoding == SpeechSynthesizer_PHONEMECODINGS_KIRSHENBAUM ? U"Kirshenbaum" : d_inputPhonemeCoding == SpeechSynthesizer_PHONEMECODINGS_IPA ? U"IPA" : U"???"));
 }
 
 static void NUMvector_extendNumberOfElements (long elementSize, void **v, long lo, long *hi, long extraDemand)
 {
 	try {
 		char *result;
-		if (*v == NULL) {
+		if (! *v) {
 			long newhi = lo + extraDemand - 1;
 			result = reinterpret_cast <char *> (NUMvector (elementSize, lo, newhi));
 			*hi = newhi;
@@ -147,7 +147,7 @@ static void NUMvector_extendNumberOfElements (long elementSize, void **v, long l
 			long offset = lo * elementSize;
 			for (;;) {   // not very infinite: 99.999 % of the time once, 0.001 % twice
 				result = reinterpret_cast <char *> (Melder_realloc ((char *) *v + offset, (*hi - lo + 1 + extraDemand) * elementSize));
-				if ((result -= offset) != NULL) break;   // this will normally succeed at the first try
+				if ((result -= offset)) break;   // this will normally succeed at the first try
 				(void) Melder_realloc_f (result + offset, 1);   // ??make "sure" that the second try will succeed
 			}
 			(*hi) += extraDemand;
@@ -155,7 +155,7 @@ static void NUMvector_extendNumberOfElements (long elementSize, void **v, long l
 		}
 		*v = result;
 	} catch (MelderError) {
-		Melder_throw ("Vector: size not extended.");
+		Melder_throw (U"Vector: size not extended.");
 	}
 }
 
@@ -197,12 +197,12 @@ static int synthCallback (short *wav, int numsamples, espeak_EVENT *events)
 			Table_setNumericValue (my d_events, irow, 6, events -> audio_position);
 			Table_setNumericValue (my d_events, irow, 7, events -> sample);
 			if (events -> type == espeakEVENT_MARK || events -> type == espeakEVENT_PLAY) {
-				Table_setStringValue (my d_events, irow, 8, Melder_peekUtf8ToWcs (events -> id.name));
+				Table_setStringValue (my d_events, irow, 8, Melder_peek8to32 (events -> id.name));
 			} else {
 				// Ugly hack because id.string is not 0-terminated if 8 chars long!
 				memcpy (phoneme_name, events -> id.string, 8);
 				phoneme_name[8] = 0;
-				Table_setStringValue (my d_events, irow, 8, Melder_peekUtf8ToWcs (phoneme_name));
+				Table_setStringValue (my d_events, irow, 8, Melder_peek8to32 (phoneme_name));
 			}
 			Table_setNumericValue (my d_events, irow, 9, events -> unique_identifier);
 		}
@@ -218,28 +218,28 @@ static int synthCallback (short *wav, int numsamples, espeak_EVENT *events)
 	return 0;
 }
 
-const wchar_t *SpeechSynthesizer_getVoiceLanguageCodeFromName (SpeechSynthesizer me, const wchar_t *voiceLanguageName) {
+const char32 *SpeechSynthesizer_getVoiceLanguageCodeFromName (SpeechSynthesizer me, const char32 *voiceLanguageName) {
 	try {
 		(void) me;
 		long voiceLanguageNameIndex = Strings_findString (espeakdata_voices_names, voiceLanguageName);
 		if (voiceLanguageNameIndex == 0) {
-			Melder_throw ("Cannot find language \"", voiceLanguageName, "\".");
+			Melder_throw (U"Cannot find language \"", voiceLanguageName, U"\".");
 		}
 		FileInMemory fim = (FileInMemory) espeakdata_voices -> item[voiceLanguageNameIndex];
 		return fim -> d_id;
 	} catch (MelderError) {
-		Melder_throw ("Cannot find language code.");
+		Melder_throw (U"Cannot find language code.");
 	}
 }
 
-const wchar_t *SpeechSynthesizer_getVoiceVariantCodeFromName (SpeechSynthesizer me, const wchar_t *voiceVariantName) {
+const char32 *SpeechSynthesizer_getVoiceVariantCodeFromName (SpeechSynthesizer me, const char32 *voiceVariantName) {
 	try {
 		(void) me;
-		static const wchar_t * defaultVariantCode = L"default";
+		static const char32 * defaultVariantCode = U"default";
 		// Strings espeakdata_variants_names is one longer than the actual list of variants
 		long voiceVariantIndex = Strings_findString (espeakdata_variants_names, voiceVariantName);
 		if (voiceVariantIndex == 0) {
-			Melder_throw ("Cannot find voice variant \"", voiceVariantName, "\".");
+			Melder_throw (U"Cannot find voice variant \"", voiceVariantName, U"\".");
 		}
 		// ... we have to decrease the index
 		if (voiceVariantIndex != 1) { // 1 is default, i.e. no variant
@@ -250,33 +250,33 @@ const wchar_t *SpeechSynthesizer_getVoiceVariantCodeFromName (SpeechSynthesizer
 			return defaultVariantCode; // TODO what is the default?
 		}
 	} catch (MelderError) {
-		Melder_throw ("Cannot find voice variant code.");
+		Melder_throw (U"Cannot find voice variant code.");
 	}
 }
 
 void SpeechSynthesizer_initSoundBuffer (SpeechSynthesizer me) {
 	my d_wavCapacity = 2 * 22050; // 2 seconds
 	my d_wav = NUMvector<int> (1, my d_wavCapacity);
-	int fsamp = espeak_Initialize (AUDIO_OUTPUT_SYNCHRONOUS, 0, NULL, espeakINITIALIZE_PHONEME_EVENTS); // 4000 ms
+	int fsamp = espeak_Initialize (AUDIO_OUTPUT_SYNCHRONOUS, 0, nullptr, espeakINITIALIZE_PHONEME_EVENTS); // 4000 ms
 	if (fsamp == -1) {
-		Melder_throw ("Internal espeak error.");
+		Melder_throw (U"Internal espeak error.");
 	}
 }
 
-SpeechSynthesizer SpeechSynthesizer_create (const wchar_t *voiceLanguageName, const wchar_t *voiceVariantName) {
+SpeechSynthesizer SpeechSynthesizer_create (const char32 *voiceLanguageName, const char32 *voiceVariantName) {
 	try {
 		autoSpeechSynthesizer me = Thing_new (SpeechSynthesizer);
 		// check the languange and voice variant
 		(void) SpeechSynthesizer_getVoiceLanguageCodeFromName (me.peek(), voiceLanguageName);
 		(void) SpeechSynthesizer_getVoiceVariantCodeFromName (me.peek(), voiceVariantName);
-		my d_voiceLanguageName = Melder_wcsdup (voiceLanguageName);
-		my d_voiceVariantName = Melder_wcsdup (voiceVariantName);
+		my d_voiceLanguageName = Melder_dup (voiceLanguageName);
+		my d_voiceVariantName = Melder_dup (voiceVariantName);
 		SpeechSynthesizer_setTextInputSettings (me.peek(), SpeechSynthesizer_INPUT_TEXTONLY, SpeechSynthesizer_PHONEMECODINGS_KIRSHENBAUM);
 		SpeechSynthesizer_setSpeechOutputSettings (me.peek(), 44100, 0.01, 50, 50, 175, true, SpeechSynthesizer_PHONEMECODINGS_IPA);
 		SpeechSynthesizer_initSoundBuffer (me.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SpeechSynthesizer not created.");
+		Melder_throw (U"SpeechSynthesizer not created.");
 	}
 }
 
@@ -299,7 +299,7 @@ void SpeechSynthesizer_setSpeechOutputSettings (SpeechSynthesizer me, double sam
 	my d_outputPhonemeCoding = outputPhonemeCoding;
 }
 
-void SpeechSynthesizer_playText (SpeechSynthesizer me, const wchar_t *text) {
+void SpeechSynthesizer_playText (SpeechSynthesizer me, const char32 *text) {
 	autoSound thee= SpeechSynthesizer_to_Sound (me, text, 0, 0);
 	Sound_playPart (thee.peek(), thy xmin, thy xmax, 0, 0);
 }
@@ -315,13 +315,13 @@ static Sound buffer_to_Sound (int *wav, long numberOfSamples, double samplingFre
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from synthesizer data.");
+		Melder_throw (U"Sound not created from synthesizer data.");
 	}
 }
 
-static void IntervalTier_addBoundaryUnsorted (IntervalTier me, long iinterval, double time, const wchar_t *newLabel, bool isNewleftLabel) {
+static void IntervalTier_addBoundaryUnsorted (IntervalTier me, long iinterval, double time, const char32 *newLabel, bool isNewleftLabel) {
 	if (time <= my xmin || time >= my xmax) {
-		Melder_throw ("Time is outside interval.");
+		Melder_throw (U"Time is outside interval.");
 	}
 
 	// Find interval to split
@@ -334,7 +334,7 @@ static void IntervalTier_addBoundaryUnsorted (IntervalTier me, long iinterval, d
 	ti -> xmax = time;
 	if (isNewleftLabel) TextInterval_setText (ti, newLabel);
 
-	autoTextInterval ti_new = TextInterval_create (time, my xmax, (! isNewleftLabel ? newLabel : L""));
+	autoTextInterval ti_new = TextInterval_create (time, my xmax, (! isNewleftLabel ? newLabel : U""));
 	Sorted_addItem_unsorted (my intervals, ti_new.transfer());
 }
 
@@ -342,46 +342,46 @@ static void Table_setEventTypeString (Table me) {
 	try {
 		for (long i = 1; i <= my rows -> size; i++) {
 			int type = Table_getNumericValue_Assert (me, i, 2);
-			const wchar_t *label = L"0";
+			const char32 *label = U"0";
 			if (type == espeakEVENT_WORD) {
-				label = L"word";
+				label = U"word";
 			} else if (type == espeakEVENT_SENTENCE) {
-				label = L"sent";
+				label = U"sent";
 			} else if (type == espeakEVENT_MARK) {
-				label = L"mark";
+				label = U"mark";
 			} else if (type == espeakEVENT_PLAY) {
-				label = L"play";
+				label = U"play";
 			} else if (type == espeakEVENT_END) {
-				label = L"s-end";
+				label = U"s-end";
 			} else if (type == espeakEVENT_MSG_TERMINATED) {
-				label = L"msg_term";
+				label = U"msg_term";
 			} else if (type == espeakEVENT_PHONEME) {
-				label = L"phoneme";
+				label = U"phoneme";
 			}
 			Table_setStringValue (me, i, 3, label);
 		}
 	} catch (MelderError) {
-		Melder_throw ("Event types not set.");
+		Melder_throw (U"Event types not set.");
 	}
 }
 
 static void MelderString_trimWhiteSpaceAtEnd (MelderString *me) {
-	while (my length > 1 && (my string[my length - 1] == ' ' or my string[my length - 1] == '\t' 
-		or my string[my length - 1] == '\r' or my string[my length - 1] == '\n')) {
-		my string[my length - 1] = '\0'; my length--;
+	while (my length > 1 && (my string[my length - 1] == U' ' || my string[my length - 1] == U'\t'
+		|| my string[my length - 1] == U'\r' || my string[my length - 1] == U'\n')) {
+		my string[my length - 1] = U'\0'; my length--;
 	}
 }
 
-static TextGrid Table_to_TextGrid (Table me, const wchar_t *text, double xmin, double xmax) {
+static TextGrid Table_to_TextGrid (Table me, const char32 *text, double xmin, double xmax) {
 	//Table_createWithColumnNames (0, L"time type type-t t-pos length a-pos sample id uniq");
 	try {
-		long length, textLength = wcslen (text);
+		long length, textLength = str32len (text);
 		long numberOfRows = my rows -> size;
-		long timeColumnIndex = Table_getColumnIndexFromColumnLabel (me, L"time");
-		long typeColumnIndex = Table_getColumnIndexFromColumnLabel (me, L"type");
-		long tposColumnIndex = Table_getColumnIndexFromColumnLabel (me, L"t-pos");
-		long   idColumnIndex = Table_getColumnIndexFromColumnLabel (me, L"id");
-		autoTextGrid thee = TextGrid_create (xmin, xmax, L"sentence clause word phoneme", L"");
+		long timeColumnIndex = Table_getColumnIndexFromColumnLabel (me, U"time");
+		long typeColumnIndex = Table_getColumnIndexFromColumnLabel (me, U"type");
+		long tposColumnIndex = Table_getColumnIndexFromColumnLabel (me, U"t-pos");
+		long   idColumnIndex = Table_getColumnIndexFromColumnLabel (me, U"id");
+		autoTextGrid thee = TextGrid_create (xmin, xmax, U"sentence clause word phoneme", U"");
 
 		TextGrid_setIntervalText (thee.peek(), 1, 1, text);
 
@@ -402,7 +402,7 @@ static TextGrid Table_to_TextGrid (Table me, const wchar_t *text, double xmin, d
 				// Only insert a new boundary, no text
 				// text will be inserted at end sentence event
 				if (time > xmin and time < xmax) {
-					IntervalTier_addBoundaryUnsorted (itc, itc -> intervals -> size, time, L"", true);
+					IntervalTier_addBoundaryUnsorted (itc, itc -> intervals -> size, time, U"", true);
 				}
 				p1c = pos;
 			} else if (type == espeakEVENT_END) {
@@ -415,7 +415,6 @@ static TextGrid Table_to_TextGrid (Table me, const wchar_t *text, double xmin, d
 				} else {
 					TextGrid_setIntervalText (thee.peek(), 2, itc -> intervals -> size, mark.string);
 				}
-				MelderString_empty (&mark);
 				p1c = pos;
 
 				// End of clause always signals "end of a word"
@@ -429,7 +428,6 @@ static TextGrid Table_to_TextGrid (Table me, const wchar_t *text, double xmin, d
 					} else {
 						TextGrid_setIntervalText (thee.peek(), 3, itw -> intervals -> size, mark.string);
 					}
-					MelderString_empty (&mark);
 					// now the next word event should not trigger setting the left interval text
 					wordEnd = false;
 				}
@@ -440,13 +438,12 @@ static TextGrid Table_to_TextGrid (Table me, const wchar_t *text, double xmin, d
 					if (pos == textLength) length++;
 					MelderString_ncopy (&mark, text + p1w - 1, length);
 					MelderString_trimWhiteSpaceAtEnd (&mark);
-					IntervalTier_addBoundaryUnsorted (itw, itw -> intervals -> size, time, (wordEnd ? mark.string : L""), true);
-					MelderString_empty (&mark);
+					IntervalTier_addBoundaryUnsorted (itw, itw -> intervals -> size, time, (wordEnd ? mark.string : U""), true);
 				}
 				wordEnd = true;
 				p1w = pos;
 			} else if (type == espeakEVENT_PHONEME) {
-				const wchar_t *id = Table_getStringValue_Assert (me, i, idColumnIndex);
+				const char32 *id = Table_getStringValue_Assert (me, i, idColumnIndex);
 				if (time > t1p) {
 					// Insert new boudary and label interval with the id
 					// TODO: Translate the id to the correct notation
@@ -466,7 +463,7 @@ static TextGrid Table_to_TextGrid (Table me, const wchar_t *text, double xmin, d
 		Sorted_sort (itp -> intervals);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrid not created from Table with events.");
+		Melder_throw (U"TextGrid not created from Table with events.");
 	}
 }
 
@@ -475,12 +472,9 @@ static void espeakdata_SetVoiceByName (const char *name, const char *variantName
 	espeak_VOICE voice_selector;
 
 	memset(&voice_selector, 0, sizeof(voice_selector));
-	MelderString npv = { 0 };
-	MelderString_append (&npv, Melder_peekUtf8ToWcs (name), L"+", Melder_peekUtf8ToWcs (variantName));
+	voice_selector.name = Melder_peek32to8 (Melder_cat (Melder_peek8to32 (name), U"+", Melder_peek8to32 (variantName)));  // include variant name in voice stack ??
 
-	voice_selector.name = (char *) Melder_peekWcsToUtf8 (npv.string);  // include variant name in voice stack ??
-
-	if (LoadVoice (name,1) != NULL)
+	if (LoadVoice (name,1))
 	{
 		LoadVoice(variantName, 2);
 		DoVoiceChange(voice);
@@ -488,11 +482,11 @@ static void espeakdata_SetVoiceByName (const char *name, const char *variantName
 	}
 }
 
-Sound SpeechSynthesizer_to_Sound (SpeechSynthesizer me, const wchar_t *text, TextGrid *tg, Table *events) {
+Sound SpeechSynthesizer_to_Sound (SpeechSynthesizer me, const char32 *text, TextGrid *tg, Table *events) {
 	try {
-		int fsamp = espeak_Initialize (AUDIO_OUTPUT_SYNCHRONOUS, 0, NULL, // 5000ms
+		int fsamp = espeak_Initialize (AUDIO_OUTPUT_SYNCHRONOUS, 0, nullptr, // 5000ms
 			espeakINITIALIZE_PHONEME_EVENTS|espeakINITIALIZE_PHONEME_IPA);
-		if (fsamp == -1) Melder_throw ("Internal espeak error.");
+		if (fsamp == -1) Melder_throw (U"Internal espeak error.");
 		int synth_flags = espeakCHARS_WCHAR;
 		if (my d_inputTextFormat == SpeechSynthesizer_INPUT_TAGGEDTEXT) synth_flags |= espeakSSML;
 		if (my d_inputTextFormat != SpeechSynthesizer_INPUT_TEXTONLY) synth_flags |= espeakPHONEMES;
@@ -504,10 +498,10 @@ Sound SpeechSynthesizer_to_Sound (SpeechSynthesizer me, const wchar_t *text, Tex
 		espeak_SetParameter (espeakRATE, my d_wordsPerMinute, 0);
 		espeak_SetParameter (espeakPITCH, my d_pitchAdjustment, 0);
 		espeak_SetParameter (espeakRANGE, my d_pitchRange, 0);
-		const wchar_t *voiceLanguageCode = SpeechSynthesizer_getVoiceLanguageCodeFromName (me, my d_voiceLanguageName);
-		const wchar_t *voiceVariantCode = SpeechSynthesizer_getVoiceVariantCodeFromName (me, my d_voiceVariantName);
-		espeakdata_SetVoiceByName ((const char *) Melder_peekWcsToUtf8 (voiceLanguageCode),
-			(const char *) Melder_peekWcsToUtf8 (voiceVariantCode));
+		const char32 *voiceLanguageCode = SpeechSynthesizer_getVoiceLanguageCodeFromName (me, my d_voiceLanguageName);
+		const char32 *voiceVariantCode = SpeechSynthesizer_getVoiceVariantCodeFromName (me, my d_voiceVariantName);
+		espeakdata_SetVoiceByName ((const char *) Melder_peek32to8 (voiceLanguageCode),
+			(const char *) Melder_peek32to8 (voiceVariantCode));
 
 		espeak_SetParameter (espeakWORDGAP, my d_wordgap * 100, 0); // espeak wordgap is in units of 10 ms
 		espeak_SetParameter (espeakCAPITALS, 0, 0);
@@ -515,11 +509,15 @@ Sound SpeechSynthesizer_to_Sound (SpeechSynthesizer me, const wchar_t *text, Tex
 
 		espeak_SetSynthCallback (synthCallback);
 
-		my d_events = Table_createWithColumnNames (0, L"time type type-t t-pos length a-pos sample id uniq");
-
-		long textLength = wcslen (text);
+		my d_events = Table_createWithColumnNames (0, U"time type type-t t-pos length a-pos sample id uniq");
+		
+		#ifdef _WIN32
+                wchar_t *textW = Melder_peek32toW (text);
+                espeak_Synth (textW, wcslen (textW) + 1, 0, POS_CHARACTER, 0, synth_flags, nullptr, me);
+		#else
+                espeak_Synth (text, str32len (text) + 1, 0, POS_CHARACTER, 0, synth_flags, nullptr, me);
+		#endif
 
-		espeak_Synth (text, textLength + 1, 0, POS_CHARACTER, 0, synth_flags, NULL, me);
 		espeak_Terminate ();
 		autoSound thee = buffer_to_Sound (my d_wav, my d_numberOfSamples, my d_internalSamplingFrequency);
 
@@ -527,7 +525,7 @@ Sound SpeechSynthesizer_to_Sound (SpeechSynthesizer me, const wchar_t *text, Tex
 			thee.reset (Sound_resample (thee.peek(), my d_samplingFrequency, 50));
 		}
 		my d_numberOfSamples = 0; // re-use the wav-buffer
-		if (tg != NULL) {
+		if (tg) {
 			double xmin = Table_getNumericValue_Assert (my d_events, 1, 1);
 			if (xmin > thy xmin) xmin = thy xmin;
 			double xmax = Table_getNumericValue_Assert (my d_events, my d_events -> rows -> size, 1);
@@ -536,16 +534,16 @@ Sound SpeechSynthesizer_to_Sound (SpeechSynthesizer me, const wchar_t *text, Tex
 			autoTextGrid atg2 =  TextGrid_extractPart (atg1.peek(), thy xmin, thy xmax, 0);
 			*tg = atg2.transfer();
 		}
-		if (events != NULL) {
+		if (events) {
 			Table_setEventTypeString (my d_events);
 			*events = my d_events;
-			my d_events = 0;
+			my d_events = nullptr;
 		}
 		forget (my d_events);
 		return thee.transfer();
 	} catch (MelderError) {
 		espeak_Terminate ();
-		Melder_throw ("Text not played.");
+		Melder_throw (U"Text not played.");
 	}
 }
 
diff --git a/dwtools/SpeechSynthesizer.h b/dwtools/SpeechSynthesizer.h
index 03a625e..9f8ae25 100644
--- a/dwtools/SpeechSynthesizer.h
+++ b/dwtools/SpeechSynthesizer.h
@@ -38,8 +38,8 @@
 #define SpeechSynthesizer_INPUT_TAGGEDTEXT 3
 
 #include "SpeechSynthesizer_def.h"
-oo_CLASS_CREATE (SpeechSynthesizerVoice, Data);
-oo_CLASS_CREATE (SpeechSynthesizer, Data);
+oo_CLASS_CREATE (SpeechSynthesizerVoice, Daata);
+oo_CLASS_CREATE (SpeechSynthesizer, Daata);
 
 SpeechSynthesizerVoice SpeechSynthesizerVoice_create (long numberOfFormants);
 void SpeechSynthesizerVoice_setDefaults (SpeechSynthesizerVoice me);
@@ -47,17 +47,17 @@ void SpeechSynthesizerVoice_initFromEspeakVoice (SpeechSynthesizerVoice me, voic
 
 
 void SpeechSynthesizer_initSoundBuffer (SpeechSynthesizer me);
-SpeechSynthesizer SpeechSynthesizer_create (const wchar_t *voiceLanguageName, const wchar_t *voiceVariantName);
+SpeechSynthesizer SpeechSynthesizer_create (const char32 *voiceLanguageName, const char32 *voiceVariantName);
 
-const wchar_t *SpeechSynthesizer_getVoiceLanguageCodeFromName (SpeechSynthesizer me, const wchar_t *voiceLanguageName);
-const wchar_t *SpeechSynthesizer_getVoiceVariantCodeFromName (SpeechSynthesizer me, const wchar_t *voiceVariantName);
+const char32 *SpeechSynthesizer_getVoiceLanguageCodeFromName (SpeechSynthesizer me, const char32 *voiceLanguageName);
+const char32 *SpeechSynthesizer_getVoiceVariantCodeFromName (SpeechSynthesizer me, const char32 *voiceVariantName);
 
 void SpeechSynthesizer_setTextInputSettings (SpeechSynthesizer me, int inputTextFormat, int inputPhonemeCoding);
 void SpeechSynthesizer_setSpeechOutputSettings (SpeechSynthesizer me, double samplingFrequency, double wordgap, long pitchAdjustment, long pitchRange, long wordsPerMinute, bool estimateWordsPerMinute, int outputPhonemeCodes);
 
-Sound SpeechSynthesizer_to_Sound (SpeechSynthesizer me, const wchar_t *text, TextGrid *tg, Table *events);
+Sound SpeechSynthesizer_to_Sound (SpeechSynthesizer me, const char32 *text, TextGrid *tg, Table *events);
 
-void SpeechSynthesizer_playText (SpeechSynthesizer me, const wchar_t *text);
+void SpeechSynthesizer_playText (SpeechSynthesizer me, const char32 *text);
 
 
 /* End of file SpeechSynthesizer.h */
diff --git a/dwtools/SpeechSynthesizer_and_TextGrid.cpp b/dwtools/SpeechSynthesizer_and_TextGrid.cpp
index 8b8d410..a8fb214 100644
--- a/dwtools/SpeechSynthesizer_and_TextGrid.cpp
+++ b/dwtools/SpeechSynthesizer_and_TextGrid.cpp
@@ -1,6 +1,6 @@
 /* SpeechSynthesizer_and_TextGrid.cpp
  *
- * Copyright (C) 2011-2012 David Weenink
+ * Copyright (C) 2011-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,22 +31,22 @@
 #include "NUMmachar.h"
 
 // prototypes
-void IntervalTier_splitInterval (IntervalTier me, double time, const wchar_t *leftLabel, long interval, double precision);
-IntervalTier IntervalTier_and_IntervalTier_cutPartsMatchingLabel (IntervalTier me, IntervalTier thee, const wchar_t *label, double precision);
-IntervalTier IntervalTiers_patch_noBoundaries (IntervalTier me, IntervalTier thee, const wchar_t *patchLabel, double precision);
-TextGrid SpeechSynthesizer_and_Sound_and_IntervalTier_align2 (SpeechSynthesizer me, Sound thee, IntervalTier him, long istart, long iend, double silenceThreshold, double minSilenceDuration, double minSoundingDuration, double trimDuration);
-Table IntervalTiers_to_Table_textAlignmentment (IntervalTier target, IntervalTier source, EditCostsTable costs);
+static void IntervalTier_splitInterval (IntervalTier me, double time, const char32 *leftLabel, long interval, double precision);
+static IntervalTier IntervalTier_and_IntervalTier_cutPartsMatchingLabel (IntervalTier me, IntervalTier thee, const char32 *label, double precision);
+static IntervalTier IntervalTiers_patch_noBoundaries (IntervalTier me, IntervalTier thee, const char32 *patchLabel, double precision);
+static TextGrid SpeechSynthesizer_and_Sound_and_IntervalTier_align2 (SpeechSynthesizer me, Sound thee, IntervalTier him, long istart, long iend, double silenceThreshold, double minSilenceDuration, double minSoundingDuration, double trimDuration);
+static Table IntervalTiers_to_Table_textAlignmentment (IntervalTier target, IntervalTier source, EditCostsTable costs);
 
 Sound SpeechSynthesizer_and_TextInterval_to_Sound (SpeechSynthesizer me, TextInterval thee, TextGrid *tg)
 {
 	try {
-		if (thy text == NULL || thy text[0] == '\0') {
-			Melder_throw ("No text in TextInterval.");
+		if (! thy text || thy text[0] == '\0') {
+			Melder_throw (U"No text in TextInterval.");
 		}
-		autoSound him = SpeechSynthesizer_to_Sound (me, thy text, tg, NULL);
+		autoSound him = SpeechSynthesizer_to_Sound (me, thy text, tg, nullptr);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from TextInterval.");
+		Melder_throw (U"Sound not created from TextInterval.");
 	}
 }
 
@@ -55,27 +55,27 @@ Sound SpeechSynthesizer_and_TextGrid_to_Sound (SpeechSynthesizer me, TextGrid th
 		TextGrid_checkSpecifiedTierNumberWithinRange (thee, tierNumber);
 		IntervalTier intervalTier = (IntervalTier) thy tiers -> item [tierNumber];
 		if (intervalTier -> classInfo != classIntervalTier) {
-			Melder_throw ("Tier ", tierNumber, " is not an interval tier.");
+			Melder_throw (U"Tier ", tierNumber, U" is not an interval tier.");
 		}
 		if (iinterval < 1 || iinterval > intervalTier -> intervals -> size) {
-			Melder_throw ("Interval ", iinterval, " does not exist on tier ", tierNumber, ".");
+			Melder_throw (U"Interval ", iinterval, U" does not exist on tier ", tierNumber, U".");
 		}
 		return SpeechSynthesizer_and_TextInterval_to_Sound (me, (TextInterval) intervalTier -> intervals -> item[iinterval], tg);
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from textGrid.");
+		Melder_throw (U"Sound not created from textGrid.");
 	}
 }
 
-static double TextGrid_getStartTimeOfFirstOccurence (TextGrid thee, long tierNumber, const wchar_t *label) {
+static double TextGrid_getStartTimeOfFirstOccurence (TextGrid thee, long tierNumber, const char32 *label) {
 	TextGrid_checkSpecifiedTierNumberWithinRange (thee, tierNumber);
 	IntervalTier intervalTier = (IntervalTier) thy tiers -> item [tierNumber];
 	if (intervalTier -> classInfo != classIntervalTier) {
-			Melder_throw ("Tier ", tierNumber, " is not an interval tier.");
+			Melder_throw (U"Tier ", tierNumber, U" is not an interval tier.");
 	}
 	double start = NUMundefined;
 	for (long iint = 1; iint <= intervalTier -> intervals -> size; iint++) {
 		TextInterval ti = (TextInterval) intervalTier -> intervals -> item[iint];
-		if (Melder_wcscmp (ti -> text, label) == 0) {
+		if (Melder_cmp (ti -> text, label) == 0) {
 			start = ti -> xmin;
 			break;
 		}
@@ -83,16 +83,16 @@ static double TextGrid_getStartTimeOfFirstOccurence (TextGrid thee, long tierNum
 	return start;
 }
 
-static double TextGrid_getEndTimeOfLastOccurence (TextGrid thee, long tierNumber, const wchar_t *label) {
+static double TextGrid_getEndTimeOfLastOccurence (TextGrid thee, long tierNumber, const char32 *label) {
 	TextGrid_checkSpecifiedTierNumberWithinRange (thee, tierNumber);
 	IntervalTier intervalTier = (IntervalTier) thy tiers -> item [tierNumber];
 	if (intervalTier -> classInfo != classIntervalTier) {
-			Melder_throw ("Tier ", tierNumber, " is not an interval tier.");
+			Melder_throw (U"Tier ", tierNumber, U" is not an interval tier.");
 	}
 	double end = NUMundefined;
 	for (long iint = intervalTier -> intervals -> size; iint > 0; iint--) {
 		TextInterval ti = (TextInterval) intervalTier -> intervals -> item[iint];
-		if (Melder_wcscmp (ti -> text, label) == 0) {
+		if (Melder_cmp (ti -> text, label) == 0) {
 			end = ti -> xmax;
 			break;
 		}
@@ -100,12 +100,12 @@ static double TextGrid_getEndTimeOfLastOccurence (TextGrid thee, long tierNumber
 	return end;
 }
 
-static void IntervalTier_getLabelInfo (IntervalTier me, const wchar_t *label, double *labelDurations, long *numberOfOccurences) {
+static void IntervalTier_getLabelInfo (IntervalTier me, const char32 *label, double *labelDurations, long *numberOfOccurences) {
     *labelDurations = 0;
     *numberOfOccurences = 0;
     for (long i = 1; i <= my intervals -> size; i++) {
         TextInterval ti = (TextInterval) my intervals -> item[i];
-        if (Melder_wcsequ (ti -> text, label)) {
+        if (Melder_equ (ti -> text, label)) {
             *labelDurations += ti -> xmax - ti -> xmin;
             (*numberOfOccurences)++;
         }
@@ -113,10 +113,10 @@ static void IntervalTier_getLabelInfo (IntervalTier me, const wchar_t *label, do
 }
 
 #define TIMES_ARE_CLOSE(x,y) (fabs((x)-(y)) < precision)
-void IntervalTier_splitInterval (IntervalTier me, double time, const wchar_t *leftLabel, long interval, double precision) {
+void IntervalTier_splitInterval (IntervalTier me, double time, const char32 *leftLabel, long interval, double precision) {
     try {
-
-        long index = 0; TextInterval ti = NULL;
+        TextInterval ti = nullptr;
+		long index = 0; 
         for (long i = interval; i <= my intervals -> size; i++) { // interval > 0
             ti = (TextInterval) my intervals -> item[i];
             if (time < ti -> xmax + precision && time > ti -> xmin - precision) {
@@ -132,21 +132,21 @@ void IntervalTier_splitInterval (IntervalTier me, double time, const wchar_t *le
         ti -> xmin = time;
         Collection_addItem (my intervals, newInterval.transfer());
     } catch (MelderError) {
-        Melder_throw ("Boundary not inserted.");
+        Melder_throw (U"Boundary not inserted.");
     }
 
 }
 
-TextTier TextTier_and_IntervalTier_cutPartsMatchingLabel (TextTier me, IntervalTier thee, const wchar_t *label, double precision) {
+static TextTier TextTier_and_IntervalTier_cutPartsMatchingLabel (TextTier me, IntervalTier thee, const char32 *label, double precision) {
     try {
         if (my xmin != thy xmin || my xmax != thy xmax) {
-            Melder_throw ("Domains must be equal.");
+            Melder_throw (U"Domains must be equal.");
         }
         long myIndex = 1; double timeCut = 0;
         autoTextTier him = TextTier_create (0, my xmax - my xmin);
         for (long j = 1; j <= thy intervals -> size; j++) {
             TextInterval cut = (TextInterval) thy intervals -> item[j];
-            if (Melder_wcsequ (cut -> text, label)) {
+            if (Melder_equ (cut -> text, label)) {
                 timeCut += cut -> xmax - cut -> xmin;
             } else {
                  while (myIndex <= my points -> size) {
@@ -168,16 +168,16 @@ TextTier TextTier_and_IntervalTier_cutPartsMatchingLabel (TextTier me, IntervalT
         his xmax -= timeCut;
         return him.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": parts not cut.");
+        Melder_throw (me, U": parts not cut.");
     }
 }
 
 
 // Cut parts from me marked by labels in thee
-IntervalTier IntervalTier_and_IntervalTier_cutPartsMatchingLabel (IntervalTier me, IntervalTier thee, const wchar_t *label, double precision) {
+IntervalTier IntervalTier_and_IntervalTier_cutPartsMatchingLabel (IntervalTier me, IntervalTier thee, const char32 *label, double precision) {
     try {
         if (my xmin != thy xmin || my xmax != thy xmax) {
-            Melder_throw ("Domains must be equal.");
+            Melder_throw (U"Domains must be equal.");
         }
         autoNUMvector<double> durations (1, my intervals -> size);
         for (long i = 1; i <= my intervals -> size; i++) {
@@ -187,7 +187,7 @@ IntervalTier IntervalTier_and_IntervalTier_cutPartsMatchingLabel (IntervalTier m
         long myInterval = 1;
         for (long j = 1; j <= thy intervals -> size; j++) {
             TextInterval cut = (TextInterval) thy intervals -> item[j];
-            if (Melder_wcsequ (cut -> text, label)) { // trim
+            if (Melder_equ (cut -> text, label)) { // trim
                 while (myInterval <= my intervals -> size) {
                     TextInterval ti = (TextInterval) my intervals -> item[myInterval];
                     if (ti -> xmin > cut -> xmin - precision && ti -> xmax < cut -> xmax + precision) {
@@ -238,19 +238,19 @@ IntervalTier IntervalTier_and_IntervalTier_cutPartsMatchingLabel (IntervalTier m
         }
         return him.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": parts not cut.");
+        Melder_throw (me, U": parts not cut.");
     }
 }
 
-TextGrid TextGrid_and_IntervalTier_cutPartsMatchingLabel (TextGrid me, IntervalTier thee, const wchar_t *label, double precision) {
+TextGrid TextGrid_and_IntervalTier_cutPartsMatchingLabel (TextGrid me, IntervalTier thee, const char32 *label, double precision) {
     try {
         if (my xmin != thy xmin || my xmax != thy xmax) {
-            Melder_throw ("Domains must be equal.");
+            Melder_throw (U"Domains must be equal.");
         }
         double cutDurations = 0;
         for (long i = 1; i <= thy intervals -> size; i++) {
             TextInterval cut = (TextInterval) thy intervals -> item[i];
-            if (Melder_wcsequ (cut -> text, label)) {
+            if (Melder_equ (cut -> text, label)) {
                 cutDurations += cut -> xmax - cut -> xmin;
             }
         }
@@ -270,13 +270,13 @@ TextGrid TextGrid_and_IntervalTier_cutPartsMatchingLabel (TextGrid me, IntervalT
         }
         return him.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": no parts cut.");
+        Melder_throw (me, U": no parts cut.");
     }
 }
 
 // Patch thy intervals that match patchLabel into my intervals
 // The resulting IntervalTier has thy xmin as starting time and thy xmax as end time
-IntervalTier IntervalTiers_patch_noBoundaries (IntervalTier me, IntervalTier thee, const wchar_t *patchLabel, double precision) {
+IntervalTier IntervalTiers_patch_noBoundaries (IntervalTier me, IntervalTier thee, const char32 *patchLabel, double precision) {
     try {
 		autoNUMvector<double> durations (0L, my intervals -> size + 1);
 		for (long i = 1; i <= my intervals -> size; i++) {
@@ -286,7 +286,7 @@ IntervalTier IntervalTiers_patch_noBoundaries (IntervalTier me, IntervalTier the
 		long myInterval = 1; double xShift = thy xmin - my xmin;
         for (long j = 1; j <= thy intervals -> size; j++) {
             TextInterval patch = (TextInterval) thy intervals -> item[j];
-            if (Melder_wcsequ (patch -> text, patchLabel)) {
+            if (Melder_equ (patch -> text, patchLabel)) {
 				if (j == 1) {
 					xShift += durations[0] = patch -> xmax - patch -> xmin;
 				} else if (j == thy intervals -> size) {
@@ -320,7 +320,7 @@ IntervalTier IntervalTiers_patch_noBoundaries (IntervalTier me, IntervalTier the
 		double time = thy xmin + durations[0];
 		long hisInterval = 1;
 		if (durations[0] > 0) {
-			IntervalTier_splitInterval (him.peek(), time , L"", hisInterval, precision);
+			IntervalTier_splitInterval (him.peek(), time , U"", hisInterval, precision);
 			hisInterval++;
 		}
 		for (long i = 1; i <= my intervals -> size; i++) {
@@ -331,22 +331,22 @@ IntervalTier IntervalTiers_patch_noBoundaries (IntervalTier me, IntervalTier the
 		}
 		if (durations[my intervals -> size + 1] > 0) {
 			time += durations[my intervals -> size + 1];
-			IntervalTier_splitInterval (him.peek(), time , L"", hisInterval, precision);
+			IntervalTier_splitInterval (him.peek(), time , U"", hisInterval, precision);
 		}
         return him.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": not patched.");
+        Melder_throw (me, U": not patched.");
     }
 }
 
-IntervalTier IntervalTiers_patch (IntervalTier me, IntervalTier thee, const wchar_t *patchLabel, double precision) {
+static IntervalTier IntervalTiers_patch (IntervalTier me, IntervalTier thee, const char32 *patchLabel, double precision) {
     try {
         autoIntervalTier him = IntervalTier_create (thy xmin, thy xmax);
         long myInterval = 1, hisInterval = 1;
         double xmax = thy xmin;
         for (long i = 1; i <= thy intervals -> size; i++) {
             TextInterval myti, ti = (TextInterval) thy intervals -> item[i];
-            if (Melder_wcsequ (ti -> text, patchLabel)) {
+            if (Melder_equ (ti -> text, patchLabel)) {
                 bool splitInterval = false; double endtime, split = 0;
                 if (i > 0) {
                     while (myInterval <= my intervals -> size) {
@@ -370,7 +370,7 @@ IntervalTier IntervalTiers_patch (IntervalTier me, IntervalTier thee, const wcha
                     }
                 }
                 xmax += ti -> xmax - ti -> xmin;
-                IntervalTier_splitInterval (him.peek(), xmax, L"", hisInterval, precision);
+                IntervalTier_splitInterval (him.peek(), xmax, U"", hisInterval, precision);
                 hisInterval++;
                 if (splitInterval) {
                     xmax += split;
@@ -389,18 +389,18 @@ IntervalTier IntervalTiers_patch (IntervalTier me, IntervalTier thee, const wcha
         }
         return him.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": not patched.");
+        Melder_throw (me, U": not patched.");
     }
 }
 
-TextTier TextTier_and_IntervalTier_patch (TextTier me, IntervalTier thee, const wchar_t *patchLabel, double precision) {
+static TextTier TextTier_and_IntervalTier_patch (TextTier me, IntervalTier thee, const char32 *patchLabel, double precision) {
     try {
         long myIndex = 1;
         autoTextTier him = TextTier_create (thy xmin, thy xmax);
         double xShift = thy xmin - my xmin;
         for (long i = 1; i <= thy intervals -> size; i++) {
             TextInterval ti = (TextInterval) thy intervals -> item[i];
-            if (Melder_wcsequ (ti -> text, patchLabel)) {
+            if (Melder_equ (ti -> text, patchLabel)) {
                 if (i > 1) {
                     while (myIndex <= my points -> size) {
                         TextPoint tp = (TextPoint) my points -> item[myIndex];
@@ -429,11 +429,11 @@ TextTier TextTier_and_IntervalTier_patch (TextTier me, IntervalTier thee, const
         }
         return him.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": cannot patch TextTier.");
+        Melder_throw (me, U": cannot patch TextTier.");
     }
 }
 
-TextGrid TextGrid_and_IntervalTier_patch (TextGrid me, IntervalTier thee, const wchar_t *patchLabel, double precision) {
+TextGrid TextGrid_and_IntervalTier_patch (TextGrid me, IntervalTier thee, const char32 *patchLabel, double precision) {
     try {
         double patchDurations;
         long numberOfPatches;
@@ -455,7 +455,7 @@ TextGrid TextGrid_and_IntervalTier_patch (TextGrid me, IntervalTier thee, const
         }
         return him.transfer();
     } catch (MelderError) {
-        Melder_throw (me, ": not patched.");
+        Melder_throw (me, U": not patched.");
     }
 }
 
@@ -464,14 +464,14 @@ TextGrid TextGrid_and_IntervalTier_patch (TextGrid me, IntervalTier thee, const
 TextGrid SpeechSynthesizer_and_Sound_and_TextInterval_align (SpeechSynthesizer me, Sound thee, TextInterval him, double silenceThreshold, double minSilenceDuration, double minSoundingDuration) {
 	try {
 		if (thy xmin != his xmin || thy xmax != his xmax) {
-			Melder_throw ("Domains of Sound and TextGrid must be equal.");
+			Melder_throw (U"Domains of Sound and TextGrid must be equal.");
 		}
 		if (fabs (1.0 / thy dx - my d_samplingFrequency) > NUMfpp -> eps) {
-			Melder_throw ("The sampling frequencies of the SpeechSynthesizer and the Sound must be equal.");
+			Melder_throw (U"The sampling frequencies of the SpeechSynthesizer and the Sound must be equal.");
 		}
 		long numberOfTokens = Melder_countTokens (his text);
 		if (numberOfTokens == 0) {
-			Melder_throw ("The interval has no text.");
+			Melder_throw (U"The interval has no text.");
 		}
 		// Remove silent intervals from start and end of sounds
 		double minPitch = 200, timeStep = 0.005, precision = thy dx;
@@ -485,8 +485,8 @@ TextGrid SpeechSynthesizer_and_Sound_and_TextInterval_align (SpeechSynthesizer m
 			// estimate speaking rate with the number of words per minute from the text
 			double wordsPerMinute_rawTokens = 60.0 * numberOfTokens / s_thee_duration;
 			// compensation for long words: 5 characters / word
-			double wordsPerMinute_rawText = 60.0 * (wcslen (his text) / 5.0) / s_thee_duration;
-			my d_wordsPerMinute =  0.5 * (wordsPerMinute_rawTokens + wordsPerMinute_rawText);
+			double wordsPerMinute_rawText = 60.0 * (str32len (his text) / 5.0) / s_thee_duration;
+			my d_wordsPerMinute =  (long) floor (0.5 * (wordsPerMinute_rawTokens + wordsPerMinute_rawText));
 		}
 		TextGrid tg2 = 0;
 		autoSound s2 = SpeechSynthesizer_and_TextInterval_to_Sound (me, him, &tg2);
@@ -524,15 +524,15 @@ TextGrid SpeechSynthesizer_and_Sound_and_TextInterval_align (SpeechSynthesizer m
 			(hasSilence_s2 ? s_atg2.peek() : atg2.peek()), precision);
 		if (hasSilence_thee) {
 			if (t1_thee > thy xmin) {
-				TextGrid_setEarlierStartTime (result.peek(), thy xmin, L"", L"");
+				TextGrid_setEarlierStartTime (result.peek(), thy xmin, U"", U"");
 			}
 			if (t2_thee < thy xmax) {
-				TextGrid_setLaterEndTime (result.peek(), thy xmax, L"", L"");
+				TextGrid_setLaterEndTime (result.peek(), thy xmax, U"", U"");
 			}
 		}
 		return result.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound and TextInterval not aligned.");
+		Melder_throw (U"Sound and TextInterval not aligned.");
 	}
 }
 /*
@@ -554,12 +554,12 @@ TextGrid SpeechSynthesizer_and_Sound_and_TextInterval_align2 (SpeechSynthesizer
 TextGrid SpeechSynthesizer_and_Sound_and_TextInterval_align2 (SpeechSynthesizer me, Sound thee, TextInterval him, double silenceThreshold, double minSilenceDuration, double minSoundingDuration, double trimDuration) {
     try {
         if (thy xmin != his xmin || thy xmax != his xmax) {
-            Melder_throw ("Domains of Sound and TextGrid must be equal.");
+            Melder_throw (U"Domains of Sound and TextGrid must be equal.");
         }
         if (fabs (1.0 / thy dx - my d_samplingFrequency) > NUMfpp -> eps) {
-            Melder_throw ("The sampling frequencies of the SpeechSynthesizer and the Sound must be equal.");
+            Melder_throw (U"The sampling frequencies of the SpeechSynthesizer and the Sound must be equal.");
         }
-        const wchar_t *trimLabel = L"trim";
+        const char32 *trimLabel = U"trim";
         // 1. trim the silences of the sound
         /*
          * For the synthesizer the silence threshold has to be < -30 dB, otherwise fricatives will not
@@ -592,65 +592,65 @@ TextGrid SpeechSynthesizer_and_Sound_and_TextInterval_align2 (SpeechSynthesizer
         autoTextGrid warp = DTW_and_TextGrid_to_TextGrid (dtw.peek(), tg_syn.peek(), precision);
 
         // 7. Patch the trimmed intervals back into the warped TextGrid
-        autoTextGrid result = TextGrid_and_IntervalTier_patch (warp.peek(), (IntervalTier) thee_trimmer -> tiers ->item[1], L"trim", 2 * thy dx);
+        autoTextGrid result = TextGrid_and_IntervalTier_patch (warp.peek(), (IntervalTier) thee_trimmer -> tiers ->item[1], U"trim", 2 * thy dx);
 
         return result.transfer();
     } catch (MelderError) {
-        Melder_throw (thee, ": sound and TextInterval not aligned.");
+        Melder_throw (thee, U": sound and TextInterval not aligned.");
     }
 }
 
 TextGrid SpeechSynthesizer_and_Sound_and_IntervalTier_align (SpeechSynthesizer me, Sound thee, IntervalTier him, long istart, long iend, double silenceThreshold, double minSilenceDuration, double minSoundingDuration) {
     try {
         if (istart < 1 || iend < istart || iend > his intervals -> size) {
-            Melder_throw ("Not avalid interval range.");
+            Melder_throw (U"Not avalid interval range.");
         }
         autoCollection textgrids = Ordered_create ();
         TextInterval tb = (TextInterval) his intervals -> item[istart];
         TextInterval te = (TextInterval) his intervals -> item[iend];
-        autoTextGrid result = TextGrid_create (tb -> xmin, te -> xmax, L"sentence clause word phoneme", L"");
+        autoTextGrid result = TextGrid_create (tb -> xmin, te -> xmax, U"sentence clause word phoneme", U"");
         for (long iint = istart; iint <= iend; iint ++) {
             TextInterval ti = (TextInterval) his intervals -> item[iint];
-            if (ti -> text != NULL && wcslen (ti -> text) > 0) {
+            if (ti -> text && str32len (ti -> text) > 0) {
                 autoSound sound = Sound_extractPart (thee, ti -> xmin, ti -> xmax,  kSound_windowShape_RECTANGULAR, 1, true);
                 autoTextGrid atg = SpeechSynthesizer_and_Sound_and_TextInterval_align (me, sound.peek(), ti, silenceThreshold, minSilenceDuration, minSoundingDuration);
                 Collection_addItem (textgrids.peek(), atg.transfer());
             }
         }
         if (textgrids -> size == 0) {
-            Melder_throw ("Nothing could be aligned. Was your IntervalTier empty?");
+            Melder_throw (U"Nothing could be aligned. Was your IntervalTier empty?");
         }
         autoTextGrid aligned = TextGrids_to_TextGrid_appendContinuous (textgrids.peek(), true);
         return aligned.transfer();
     } catch (MelderError) {
-        Melder_throw ("No aligned TextGrid created.");
+        Melder_throw (U"No aligned TextGrid created.");
     }
 }
 
 TextGrid SpeechSynthesizer_and_Sound_and_IntervalTier_align2 (SpeechSynthesizer me, Sound thee, IntervalTier him, long istart, long iend, double silenceThreshold, double minSilenceDuration, double minSoundingDuration, double trimDuration) {
     try {
         if (istart < 1 || iend < istart || iend > his intervals -> size) {
-            Melder_throw ("Not avalid interval range.");
+            Melder_throw (U"Not avalid interval range.");
         }
         autoCollection textgrids = Ordered_create ();
         TextInterval tb = (TextInterval) his intervals -> item[istart];
         TextInterval te = (TextInterval) his intervals -> item[iend];
-        autoTextGrid result = TextGrid_create (tb -> xmin, te -> xmax, L"sentence clause word phoneme", L"");
+        autoTextGrid result = TextGrid_create (tb -> xmin, te -> xmax, U"sentence clause word phoneme", U"");
         for (long iint = istart; iint <= iend; iint ++) {
             TextInterval ti = (TextInterval) his intervals -> item[iint];
-            if (ti -> text != NULL && wcslen (ti -> text) > 0) {
+            if (ti -> text && str32len (ti -> text) > 0) {
                 autoSound sound = Sound_extractPart (thee, ti -> xmin, ti -> xmax,  kSound_windowShape_RECTANGULAR, 1, true);
                 autoTextGrid atg = SpeechSynthesizer_and_Sound_and_TextInterval_align2 (me, sound.peek(), ti, silenceThreshold, minSilenceDuration, minSoundingDuration, trimDuration);
                 Collection_addItem (textgrids.peek(), atg.transfer());
             }
         }
         if (textgrids -> size == 0) {
-            Melder_throw ("Nothing could be aligned. Was your IntervalTier empty?");
+            Melder_throw (U"Nothing could be aligned. Was your IntervalTier empty?");
         }
         autoTextGrid aligned = TextGrids_to_TextGrid_appendContinuous (textgrids.peek(), true);
         return aligned.transfer();
     } catch (MelderError) {
-        Melder_throw ("No aligned TextGrid created.");
+        Melder_throw (U"No aligned TextGrid created.");
     }
 }
 
@@ -660,7 +660,7 @@ TextGrid SpeechSynthesizer_and_Sound_and_TextGrid_align (SpeechSynthesizer me, S
 		autoTextGrid tg = SpeechSynthesizer_and_Sound_and_IntervalTier_align (me, thee, iTier, istart, iend, silenceThreshold, minSilenceDuration, minSoundingDuration);
 		return tg.transfer();
 	} catch (MelderError) {
-		Melder_throw ("");
+		Melder_throw (U"");
 	}
 }
 
@@ -671,24 +671,24 @@ TextGrid SpeechSynthesizer_and_Sound_and_TextGrid_align2 (SpeechSynthesizer me,
         autoTextGrid tg = SpeechSynthesizer_and_Sound_and_IntervalTier_align2 (me, thee, iTier, istart, iend, silenceThreshold, minSilenceDuration, minSoundingDuration, trimDuration);
         return tg.transfer();
     } catch (MelderError) {
-        Melder_throw ("");
+        Melder_throw (U"");
     }
 }
 
 static Strings IntervalTier_to_Strings_withOriginData (IntervalTier me, long *from) {
 	try {
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector<wchar_t *> (1, my intervals -> size);
+		thy strings = NUMvector<char32 *> (1, my intervals -> size);
 		for (long i = 1; i <= my intervals -> size; i++) {
 			TextInterval ti = (TextInterval) my intervals -> item[i];
 			if (ti -> text != 0 && ti -> text[0] != '\0') {
-				thy strings [++(thy numberOfStrings)] = Melder_wcsdup (ti -> text);
+				thy strings [++(thy numberOfStrings)] = Melder_dup (ti -> text);
 				from[thy numberOfStrings] = i;
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Strings created.");
+		Melder_throw (me, U": no Strings created.");
 	}
 }
 
@@ -703,16 +703,16 @@ Table IntervalTiers_to_Table_textAlignmentment (IntervalTier target, IntervalTie
 		autoEditDistanceTable edit = EditDistanceTable_create (targets.peek(), sources.peek());
 		if (costs != 0) {
 			EditDistanceTable_setEditCosts (edit.peek(), costs);
-			EditDistanceTable_findPath (edit.peek(), NULL);
+			EditDistanceTable_findPath (edit.peek(), nullptr);
 		}
 		long pathLength = edit -> warpingPath -> pathLength;
-		autoTable thee = Table_createWithColumnNames (pathLength - 1, L"targetInterval targetText targetStart targetEnd sourceInterval sourceText sourceStart sourceEnd operation");
+		autoTable thee = Table_createWithColumnNames (pathLength - 1, U"targetInterval targetText targetStart targetEnd sourceInterval sourceText sourceStart sourceEnd operation");
 		for (long i = 2; i <= pathLength; i++) {
 			structPairOfInteger p = edit -> warpingPath -> path[i];
 			structPairOfInteger p1 = edit -> warpingPath -> path[i - 1];
 			double targetStart = NUMundefined, targetEnd =  NUMundefined;
 			double sourceStart = NUMundefined, sourceEnd =  NUMundefined;
-			const wchar_t * targetText = L"", *sourceText = L"";
+			const char32 * targetText = U"", *sourceText = U"";
 			long targetInterval = p.y > 1 ? targetOrigin[p.y - 1] : 0;
 			long sourceInterval = p.x > 1 ? sourceOrigin[p.x - 1] : 0;
 			if (targetInterval > 0) {
@@ -730,24 +730,24 @@ Table IntervalTiers_to_Table_textAlignmentment (IntervalTier target, IntervalTie
 			long irow = i - 1;
 			if (p.y == p1.y) { // deletion
 				Table_setNumericValue (thee.peek(), irow, 1, 0);
-				Table_setStringValue  (thee.peek(), irow, 2, L"");
+				Table_setStringValue  (thee.peek(), irow, 2, U"");
 				Table_setNumericValue (thee.peek(), irow, 3, NUMundefined);
 				Table_setNumericValue (thee.peek(), irow, 4, NUMundefined);
 				Table_setNumericValue (thee.peek(), irow, 5, sourceInterval);
 				Table_setStringValue  (thee.peek(), irow, 6, sourceText);
 				Table_setNumericValue (thee.peek(), irow, 7, sourceStart);
 				Table_setNumericValue (thee.peek(), irow, 8, sourceEnd);
-				Table_setStringValue  (thee.peek(), irow, 9, L"d");
+				Table_setStringValue  (thee.peek(), irow, 9, U"d");
 			} else if (p.x == p1.x) { // insertion
 				Table_setNumericValue (thee.peek(), irow, 1, targetInterval);
 				Table_setStringValue  (thee.peek(), irow, 2, targetText);
 				Table_setNumericValue (thee.peek(), irow, 3, targetStart);
 				Table_setNumericValue (thee.peek(), irow, 4, targetEnd);
 				Table_setNumericValue (thee.peek(), irow, 5, 0);
-				Table_setStringValue  (thee.peek(), irow, 6, L"");
+				Table_setStringValue  (thee.peek(), irow, 6, U"");
 				Table_setNumericValue (thee.peek(), irow, 7, NUMundefined);
 				Table_setNumericValue (thee.peek(), irow, 8, NUMundefined);
-				Table_setStringValue  (thee.peek(), irow, 9,  L"i");
+				Table_setStringValue  (thee.peek(), irow, 9, U"i");
 			} else { // substitution ?
 				Table_setNumericValue (thee.peek(), irow, 1, targetInterval);
 				Table_setStringValue  (thee.peek(), irow, 2, targetText);
@@ -757,12 +757,12 @@ Table IntervalTiers_to_Table_textAlignmentment (IntervalTier target, IntervalTie
 				Table_setStringValue  (thee.peek(), irow, 6, sourceText);
 				Table_setNumericValue (thee.peek(), irow, 7, sourceStart);
 				Table_setNumericValue (thee.peek(), irow, 8, sourceEnd);
-				Table_setStringValue  (thee.peek(), irow, 9, Melder_wcsequ (targetText, sourceText) ? L" " : L"s");
+				Table_setStringValue  (thee.peek(), irow, 9, Melder_equ (targetText, sourceText) ? U" " : U"s");
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (target, " and ", source, " not aligned.");
+		Melder_throw (target, U" and ", source, U" not aligned.");
 	}
 }
 
@@ -772,7 +772,7 @@ Table TextGrids_to_Table_textAlignmentment (TextGrid target, long ttier, TextGri
 		IntervalTier sourceTier = TextGrid_checkSpecifiedTierIsIntervalTier (source, stier);
 		return IntervalTiers_to_Table_textAlignmentment (targetTier, sourceTier, costs);
 	} catch (MelderError) {
-		Melder_throw (L"No text alignment table created from TextGrids ", target, " and ", source, L".");
+		Melder_throw (U"No text alignment table created from TextGrids ", target, U" and ", source, U".");
 	}
 }
 
diff --git a/dwtools/SpeechSynthesizer_and_TextGrid.h b/dwtools/SpeechSynthesizer_and_TextGrid.h
index f9d0d31..ccf35ad 100644
--- a/dwtools/SpeechSynthesizer_and_TextGrid.h
+++ b/dwtools/SpeechSynthesizer_and_TextGrid.h
@@ -43,7 +43,7 @@ Table IntervalTiers__to_Table_textAlignmentment (IntervalTier target, IntervalTi
 Table TextGrids_to_Table_textAlignmentment (TextGrid target, long ttier, TextGrid source, long stier, EditCostsTable costs);
 
 /* For testing purposes only */
-TextGrid TextGrid_and_IntervalTier_patch (TextGrid me, IntervalTier thee, const wchar_t *patchLabel, double precision);
-TextGrid TextGrid_and_IntervalTier_cutPartsMatchingLabel (TextGrid me, IntervalTier thee, const wchar_t *label, double precision);
+TextGrid TextGrid_and_IntervalTier_patch (TextGrid me, IntervalTier thee, const char32 *patchLabel, double precision);
+TextGrid TextGrid_and_IntervalTier_cutPartsMatchingLabel (TextGrid me, IntervalTier thee, const char32 *label, double precision);
 
 #endif // _SpeechSynthesizer_and_TextGrid_h_
diff --git a/dwtools/SpeechSynthesizer_def.h b/dwtools/SpeechSynthesizer_def.h
index 5bf2165..a17c740 100644
--- a/dwtools/SpeechSynthesizer_def.h
+++ b/dwtools/SpeechSynthesizer_def.h
@@ -18,7 +18,7 @@
  */
 
 #define ooSTRUCT SpeechSynthesizerVoice
-oo_DEFINE_CLASS (SpeechSynthesizerVoice, Data)
+oo_DEFINE_CLASS (SpeechSynthesizerVoice, Daata)
 	oo_STRING (d_v_name)
 
 	oo_LONG (d_phoneme_tab_ix)  // phoneme table number
@@ -63,7 +63,7 @@ oo_END_CLASS (SpeechSynthesizerVoice)
 
 
 #define ooSTRUCT SpeechSynthesizer
-oo_DEFINE_CLASS (SpeechSynthesizer, Data)
+oo_DEFINE_CLASS (SpeechSynthesizer, Daata)
 
 	// sythesizers language /voice
 	oo_STRING (d_voiceLanguageName)
diff --git a/dwtools/Strings_extensions.cpp b/dwtools/Strings_extensions.cpp
index 74aeeb0..5c45b5f 100644
--- a/dwtools/Strings_extensions.cpp
+++ b/dwtools/Strings_extensions.cpp
@@ -1,6 +1,6 @@
 /* Strings_extensions.cpp
  *
- * Copyright (C) 1993-2012 David Weenink
+ * Copyright (C) 1993-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,52 +39,49 @@
 Strings Strings_createFixedLength (long numberOfStrings) {
 	try {
 		if (numberOfStrings <= 0) {
-			Melder_throw ("The number of strings must be positive.");
+			Melder_throw (U"The number of strings must be positive.");
 		}
 		autoStrings me = Thing_new (Strings);
-		my strings = NUMvector<wchar_t *> (1, numberOfStrings);
+		my strings = NUMvector<char32 *> (1, numberOfStrings);
 		my numberOfStrings = numberOfStrings;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Strings not created.");
+		Melder_throw (U"Strings not created.");
 	}
 }
 
-Strings Strings_createAsCharacters (const wchar_t *string) {
+Strings Strings_createAsCharacters (const char32 *string) {
 	try {
 		autoStrings me = Thing_new (Strings);
-		my numberOfStrings = wcslen (string);
-		my strings = NUMvector<wchar_t *> (1, my numberOfStrings);
-		autoMelderString s;
+		my numberOfStrings = str32len (string);
+		my strings = NUMvector<char32 *> (1, my numberOfStrings);
 		for (long i = 1; i <= my numberOfStrings; i++) {
-			MelderString_appendCharacter (&s, *string++);
-			my strings[i] = Melder_wcsdup (s.string);
-			MelderString_empty (&s);
+			my strings[i] = Melder_dup (Melder_character (*string++));
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Strings from characters not created.");
+		Melder_throw (U"Strings from characters not created.");
 	}
 }
 
-Strings Strings_createAsTokens (const wchar_t *string) {
+Strings Strings_createAsTokens (const char32 *string) {
 	try {
 		autoStrings me = Thing_new (Strings);
 		my numberOfStrings =  Melder_countTokens (string);
-		my strings = NUMvector<wchar_t *> (1, my numberOfStrings);
+		my strings = NUMvector<char32 *> (1, my numberOfStrings);
 		long i = 1;
-		for (wchar_t *token = Melder_firstToken (string); token != 0; token = Melder_nextToken ()) {
-			my strings[i++] = Melder_wcsdup (token);
+		for (char32 *token = Melder_firstToken (string); token != 0; token = Melder_nextToken ()) {
+			my strings[i++] = Melder_dup (token);
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Strings from characters not created.");
+		Melder_throw (U"Strings from characters not created.");
 	}
 }
 
-long Strings_findString (Strings me, const wchar_t *string) {
+long Strings_findString (Strings me, const char32 *string) {
 	for (long i = 1; i <= my numberOfStrings; i++) {
-		if (Melder_wcsequ (my strings[i], string)) {
+		if (Melder_equ (my strings[i], string)) {
 			return i;
 		}
 	}
@@ -108,52 +105,52 @@ Strings Strings_append (Collection me) {
 				if (s -> strings[j] == 0) {
 					continue;
 				}
-				thy strings [index] = Melder_wcsdup (s -> strings[j]);
+				thy strings [index] = Melder_dup (s -> strings[j]);
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not appended.");
+		Melder_throw (me, U": not appended.");
 	}
 }
 
-Strings Strings_change (Strings me, const wchar_t *search, const wchar_t *replace, int maximumNumberOfReplaces,
+Strings Strings_change (Strings me, const char32 *search, const char32 *replace, int maximumNumberOfReplaces,
                         long *nmatches, long *nstringmatches, int use_regexp) {
 	try {
 		autoStrings thee = Thing_new (Strings);
-		wchar_t **strings = strs_replace (my strings, 1, my numberOfStrings, search, replace, maximumNumberOfReplaces,
+		char32 **strings = strs_replace (my strings, 1, my numberOfStrings, search, replace, maximumNumberOfReplaces,
 		                                  nmatches, nstringmatches, use_regexp);
 		thy numberOfStrings = my numberOfStrings;
 		thy strings = strings;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not changed.");
+		Melder_throw (me, U": not changed.");
 	}
 }
 
-Strings strings_to_Strings (wchar_t **strings, long from, long to) {
+Strings strings_to_Strings (char32 **strings, long from, long to) {
 	try {
 		autoStrings thee = Strings_createFixedLength (to - from + 1);
 		for (long i = from; i <= to; i++) {
-			thy strings[i - from + 1]  = Melder_wcsdup (strings[i]);
+			thy strings[i - from + 1]  = Melder_dup (strings[i]);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Strings not created.");
+		Melder_throw (U"Strings not created.");
 	}
 }
 
 Strings Strings_extractPart (Strings me, long from, long to) {
 	try {
 		if (from < 1 || to > my numberOfStrings || from > to) Melder_throw
-			("Strings_extractPart: begin and end must be in interval [1, ", my numberOfStrings, L"].");
+			(U"Strings_extractPart: begin and end must be in interval [1, ", my numberOfStrings, U"].");
 		return strings_to_Strings (my strings, from, to);
 	} catch (MelderError) {
-		Melder_throw (me, ": no part extracted.");
+		Melder_throw (me, U": no part extracted.");
 	}
 }
 
-Strings strings_to_Strings_link (wchar_t **strings, long n) {
+Strings strings_to_Strings_link (char32 **strings, long n) {
 	try {
 		autoStrings me = Strings_createFixedLength (n);
 		for (long i = 1; i <= n; i++) {
@@ -161,7 +158,7 @@ Strings strings_to_Strings_link (wchar_t **strings, long n) {
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Strings not linked.");
+		Melder_throw (U"Strings not linked.");
 	}
 }
 
@@ -179,22 +176,22 @@ Permutation Strings_to_Permutation (Strings me, int sort) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Permutation created.");
+		Melder_throw (me, U": no Permutation created.");
 	}
 }
 
 Strings Strings_and_Permutation_permuteStrings (Strings me, Permutation thee) {
 	try {
-		if (my numberOfStrings != thy numberOfElements) Melder_throw ("Strings_and_Permutation_permuteStrings: "
-			        "The number of strings and the number of elements in the Permutation must be equal.");
+		if (my numberOfStrings != thy numberOfElements) Melder_throw (U"Strings_and_Permutation_permuteStrings: "
+			        U"The number of strings and the number of elements in the Permutation must be equal.");
 		autoStrings him = Strings_createFixedLength (my numberOfStrings);
 		for (long i = 1; i <= thy numberOfElements; i++) {
 			long index = thy p[i];
-			his strings[i] = Melder_wcsdup (my strings[index]);
+			his strings[i] = Melder_dup (my strings[index]);
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no permuted Strings created.");
+		Melder_throw (me, U": no permuted Strings created.");
 	}
 }
 
@@ -211,10 +208,10 @@ StringsIndex Stringses_to_StringsIndex (Strings me, Strings classes) {
 		}
 		for (long j = 1; j <= my numberOfStrings; j++) {
 			long index = 0;
-			wchar_t *stringsj = my strings[j];
+			char32 *stringsj = my strings[j];
 			for (long i = 1; i <= numberOfClasses; i++) {
 				SimpleString ss = (SimpleString) his classes -> item[i];
-				if (Melder_wcscmp (stringsj, ss -> string) == 0) {
+				if (Melder_cmp (stringsj, ss -> string) == 0) {
 					index = i;
 					break;
 				}
@@ -223,7 +220,7 @@ StringsIndex Stringses_to_StringsIndex (Strings me, Strings classes) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no StringsIndex created.");
+		Melder_throw (me, U": no StringsIndex created.");
 	}
 }
 
@@ -232,11 +229,11 @@ StringsIndex Strings_to_StringsIndex (Strings me) {
 		autoStringsIndex thee = StringsIndex_create (my numberOfStrings);
 		autoPermutation sorted = Strings_to_Permutation (me, 1);
 		long numberOfClasses = 0;
-		wchar_t *strings = NULL;
+		char32 *strings = nullptr;
 		for (long i = 1; i <= sorted -> numberOfElements; i++) {
 			long index = sorted -> p[i];
-			wchar_t *stringsi = my strings[index];
-			if (i == 1 || Melder_wcscmp (strings, stringsi) != 0) {
+			char32 *stringsi = my strings[index];
+			if (i == 1 || Melder_cmp (strings, stringsi) != 0) {
 				numberOfClasses++;
 				autoSimpleString him = SimpleString_create (stringsi);
 				Collection_addItem (thy classes, him.transfer());
@@ -246,7 +243,7 @@ StringsIndex Strings_to_StringsIndex (Strings me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no StringsIndex created.");
+		Melder_throw (me, U": no StringsIndex created.");
 	}
 }
 
@@ -255,22 +252,22 @@ Strings StringsIndex_to_Strings (StringsIndex me) {
 		autoStrings thee = Strings_createFixedLength (my numberOfElements);
 		for (long i = 1; i <= thy numberOfStrings; i++) {
 			SimpleString s = (SimpleString) my classes -> item[my classIndex[i]];
-			thy strings[i] = Melder_wcsdup (s -> string);
+			thy strings[i] = Melder_dup (s -> string);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Strings created.");
+		Melder_throw (me, U": no Strings created.");
 	}
 }
 
 StringsIndex Table_to_StringsIndex_column (Table me, long column) {
 	try {
 		if (column < 1 || column > my numberOfColumns) {
-			Melder_throw ("Invalid column number.");
+			Melder_throw (U"Invalid column number.");
 		}
 		long numberOfRows = my rows -> size;
 		Table_numericize_Assert (me, column);
-		autoNUMvector<wchar_t *> groupLabels (1, numberOfRows);
+		autoNUMvector<char32 *> groupLabels (1, numberOfRows);
 		for (long irow = 1; irow <= numberOfRows; irow++) {
 			groupLabels[irow] = ((TableRow) my rows -> item [irow]) -> cells [column] .string;
 		}
@@ -278,7 +275,7 @@ StringsIndex Table_to_StringsIndex_column (Table me, long column) {
 		autoStringsIndex him = Strings_to_StringsIndex (thee.peek());
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, "no StringsIndex created from column ", Melder_integer (column));
+		Melder_throw (me, U"No StringsIndex created from column ", column, U".");
 	}
 }
 
diff --git a/dwtools/Strings_extensions.h b/dwtools/Strings_extensions.h
index 2656968..9447a37 100644
--- a/dwtools/Strings_extensions.h
+++ b/dwtools/Strings_extensions.h
@@ -36,20 +36,20 @@
 
 
 Strings Strings_createFixedLength (long numberOfStrings);
-Strings Strings_createAsCharacters (const wchar_t *string);
-Strings Strings_createAsTokens (const wchar_t *string);
+Strings Strings_createAsCharacters (const char32 *string);
+Strings Strings_createAsTokens (const char32 *string);
 
-long Strings_findString (Strings me, const wchar_t *string);
+long Strings_findString (Strings me, const char32 *string);
 Strings Strings_append (Collection me);
 
-Strings Strings_change (Strings me, const wchar_t *search, const wchar_t *replace,
+Strings Strings_change (Strings me, const char32 *search, const char32 *replace,
 	int maximumNumberOfReplaces, long *nmatches, long *nstringmatches,
 	int use_regexp);
 
-Strings strings_to_Strings (wchar_t **strings, long from, long to);
+Strings strings_to_Strings (char32 **strings, long from, long to);
 
 // If the Strings is only an intermediate object to achieve other goals, use the following two routines to avoid copying.
-Strings strings_to_Strings_link (wchar_t** strings, long n);
+Strings strings_to_Strings_link (char32** strings, long n);
 // for (i=1; i<= n; i++) my strings[i] = strings[i];
 void Strings_unlink (Strings me);
 // for (i=1; i<= my numberOfStrings; i++) my strings[i] = NULL;
diff --git a/dwtools/TableOfReal_and_Permutation.cpp b/dwtools/TableOfReal_and_Permutation.cpp
index 58cd661..b4a9e12 100644
--- a/dwtools/TableOfReal_and_Permutation.cpp
+++ b/dwtools/TableOfReal_and_Permutation.cpp
@@ -25,11 +25,10 @@
 #include "TableOfReal_extensions.h"
 #include "NUM2.h"
 
-TableOfReal TableOfReal_and_Permutation_permuteRows (I, Permutation thee) {
-	iam (TableOfReal);
+TableOfReal TableOfReal_and_Permutation_permuteRows (TableOfReal me, Permutation thee) {
 	try {
 		if (my numberOfRows != thy numberOfElements) {
-			Melder_throw (L"The number of rows in the table and the number of elements in the Permutation must be equal.");
+			Melder_throw (U"The number of rows in the table and the number of elements in the Permutation must be equal.");
 		}
 		autoTableOfReal him = TableOfReal_create (my numberOfRows, my numberOfColumns);
 
@@ -41,18 +40,17 @@ TableOfReal TableOfReal_and_Permutation_permuteRows (I, Permutation thee) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not permuted.");
+		Melder_throw (me, U": not permuted.");
 	}
 }
 
-Permutation TableOfReal_to_Permutation_sortRowLabels (I) {
-	iam (TableOfReal);
+Permutation TableOfReal_to_Permutation_sortRowLabels (TableOfReal me) {
 	try {
 		autoPermutation thee = Permutation_create (my numberOfRows);
 		NUMindexx_s (my rowLabels, my numberOfRows, thy p);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Permutation created.");
+		Melder_throw (me, U": no Permutation created.");
 	}
 }
 
diff --git a/dwtools/TableOfReal_and_Permutation.h b/dwtools/TableOfReal_and_Permutation.h
index 549b326..5c14387 100644
--- a/dwtools/TableOfReal_and_Permutation.h
+++ b/dwtools/TableOfReal_and_Permutation.h
@@ -27,18 +27,10 @@
 #include "Permutation.h"
 #include "TableOfReal.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-TableOfReal TableOfReal_and_Permutation_permuteRows (I, Permutation thee);
+TableOfReal TableOfReal_and_Permutation_permuteRows (TableOfReal me, Permutation thee);
 /*
 	Permutation (n1,n2,..nn) new his z[1] = my z[n1], his z[2] = my z[n2], ..*/
 
-Permutation TableOfReal_to_Permutation_sortRowLabels (I);
-
-#ifdef __cplusplus
-	}
-#endif
+Permutation TableOfReal_to_Permutation_sortRowLabels (TableOfReal me);
 
 #endif /* _TableOfReal_and_Permutation_h_ */
diff --git a/dwtools/TableOfReal_and_SVD.cpp b/dwtools/TableOfReal_and_SVD.cpp
index 75bc033..127b1f4 100644
--- a/dwtools/TableOfReal_and_SVD.cpp
+++ b/dwtools/TableOfReal_and_SVD.cpp
@@ -33,67 +33,61 @@ TableOfReal SVD_to_TableOfReal (SVD me, long from, long to) {
 		SVD_synthesize (me, from, to, thy data);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no TableOfReal synthesized.");
+		Melder_throw (me, U": no TableOfReal synthesized.");
 	}
 }
 
-SVD TableOfReal_to_SVD (I) {
-	iam (TableOfReal);
+SVD TableOfReal_to_SVD (TableOfReal me) {
 	try {
 		autoSVD thee = SVD_create_d (my data, my numberOfRows, my numberOfColumns);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no SVD created.");
+		Melder_throw (me, U": no SVD created.");
 	}
 }
 
-TableOfReal SVD_extractLeftSingularVectors (I) {
-	iam (SVD);
+TableOfReal SVD_extractLeftSingularVectors (SVD me) {
 	try {
 		long mn_min = MIN (my numberOfRows, my numberOfColumns);
 		autoTableOfReal thee = TableOfReal_create (my numberOfRows, mn_min);
 		NUMmatrix_copyElements (my u, thy data, 1, my numberOfRows, 1, mn_min);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": left singular vector not extracted.");
+		Melder_throw (me, U": left singular vector not extracted.");
 	}
 }
 
-TableOfReal SVD_extractRightSingularVectors (I) {
-	iam (SVD);
+TableOfReal SVD_extractRightSingularVectors (SVD me) {
 	try {
 		long mn_min = MIN (my numberOfRows, my numberOfColumns);
 		autoTableOfReal thee = TableOfReal_create (my numberOfColumns, mn_min);
 		NUMmatrix_copyElements (my v, thy data, 1, my numberOfColumns, 1, mn_min);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": right singular vector not extracted.");
+		Melder_throw (me, U": right singular vector not extracted.");
 	}
 }
 
-TableOfReal SVD_extractSingularValues (I) {
-	iam (SVD);
+TableOfReal SVD_extractSingularValues (SVD me) {
 	try {
 		long mn_min = MIN (my numberOfRows, my numberOfColumns);
 		autoTableOfReal thee = TableOfReal_create (1, mn_min);
 		NUMvector_copyElements (my d, thy data[1], 1, mn_min);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": singular values not extracted.");
+		Melder_throw (me, U": singular values not extracted.");
 	}
 }
 
-GSVD TablesOfReal_to_GSVD (I, thou) {
-	iam (TableOfReal);
-	thouart (TableOfReal);
+GSVD TablesOfReal_to_GSVD (TableOfReal me, TableOfReal thee) {
 	try {
 		if (my numberOfColumns != thy numberOfColumns) {
-			Melder_throw ("Both tables must have the same number of columns.");
+			Melder_throw (U"Both tables must have the same number of columns.");
 		}
 		autoGSVD him = GSVD_create_d (my data, my numberOfRows, my numberOfColumns, thy data, thy numberOfRows);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("GSVD not constructed from TablesOfReal.");
+		Melder_throw (U"GSVD not constructed from TablesOfReal.");
 	}
 }
 
diff --git a/dwtools/TableOfReal_and_SVD.h b/dwtools/TableOfReal_and_SVD.h
index 40f2061..eebb0da 100644
--- a/dwtools/TableOfReal_and_SVD.h
+++ b/dwtools/TableOfReal_and_SVD.h
@@ -27,20 +27,12 @@
 #include "SVD.h"
 #include "TableOfReal.h"
 
-#ifdef __cplusplus
-	extern "C" {
-#endif
-
-SVD TableOfReal_to_SVD (I);
-GSVD TablesOfReal_to_GSVD (I, thou);
+SVD TableOfReal_to_SVD (TableOfReal me);
+GSVD TablesOfReal_to_GSVD (TableOfReal me, TableOfReal thee);
 
 TableOfReal SVD_to_TableOfReal (SVD me, long from, long to);
-TableOfReal SVD_extractLeftSingularVectors (I);
-TableOfReal SVD_extractRightSingularVectors (I);
-TableOfReal SVD_extractSingularValues (I);
-
-#ifdef __cplusplus
-	}
-#endif
+TableOfReal SVD_extractLeftSingularVectors (SVD me);
+TableOfReal SVD_extractRightSingularVectors (SVD me);
+TableOfReal SVD_extractSingularValues (SVD me);
 
 #endif // _TableOfReal_and_SVD_h_
diff --git a/dwtools/TableOfReal_extensions.cpp b/dwtools/TableOfReal_extensions.cpp
index 5e78281..7fa4e64 100644
--- a/dwtools/TableOfReal_extensions.cpp
+++ b/dwtools/TableOfReal_extensions.cpp
@@ -1,6 +1,6 @@
 /* TableOfReal_extensions.cpp
  *
- * Copyright (C) 1993-2012, 2014 David Weenink
+ * Copyright (C) 1993-2012, 2014, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,7 +36,7 @@
  djmw 20060301 TableOfReal_meansByRowLabels extra medianize
  djmw 20060626 Extra NULL argument for ExecRE.
  djmw 20061021 printf expects %ld for 'long int'
- djmw 20070822 wchar_t
+ djmw 20070822 wchar
  djmw 20070902 Better error messages (object type and name feedback)
  djmw 20070614 updated to version 1.30 of regular expressions.
  djmw 20071202 Melder_warning<n>
@@ -63,7 +63,7 @@
 #include "regularExp.h"
 #include "Formula.h"
 
-#define EMPTY_STRING(s) ((s) == NULL || s[0] == '\0')
+#define EMPTY_STRING(s) (! (s) || s[0] == '\0')
 #define MAX(m,n) ((m) > (n) ? (m) : (n))
 #define MIN(m,n) ((m) < (n) ? (m) : (n))
 
@@ -71,8 +71,8 @@
 #define Graphics_TWOWAYARROW 2
 #define Graphics_LINE 3
 
-TableOfReal TableOfReal_and_TableOfReal_columnCorrelations (I, thou, int center, int normalize);
-TableOfReal TableOfReal_and_TableOfReal_rowCorrelations (I, thou, int center, int normalize);
+static TableOfReal TableOfReal_and_TableOfReal_columnCorrelations (TableOfReal me, TableOfReal thee, int center, int normalize);
+static TableOfReal TableOfReal_and_TableOfReal_rowCorrelations (TableOfReal me, TableOfReal thee, int center, int normalize);
 
 long TableOfReal_getColumnIndexAtMaximumInRow (TableOfReal me, long rowNumber) {
 	long columnNumber = 0;
@@ -88,15 +88,13 @@ long TableOfReal_getColumnIndexAtMaximumInRow (TableOfReal me, long rowNumber) {
 	return columnNumber;
 }
 
-const wchar_t *TableOfReal_getColumnLabelAtMaximumInRow (TableOfReal me, long rowNumber) {
+const char32 *TableOfReal_getColumnLabelAtMaximumInRow (TableOfReal me, long rowNumber) {
 	long columnNumber = TableOfReal_getColumnIndexAtMaximumInRow (me, rowNumber);
 	return my v_getColStr (columnNumber);
 }
 
 
-int TableOfReal_areAllCellsDefined (I, long rb, long re, long cb, long ce) {
-	iam (TableOfReal);
-
+int TableOfReal_areAllCellsDefined (TableOfReal me, long rb, long re, long cb, long ce) {
 	if (re <= rb || rb < 1 || re > my numberOfRows) {
 		rb = 1; re = my numberOfRows;
 	}
@@ -125,38 +123,35 @@ int TableOfReal_areAllCellsDefined (I, long rb, long re, long cb, long ce) {
 				numberOfInvalidColumns++;
 			}
 		}
-		Melder_throw (numberOfInvalidRows == 1 ? "One row contains invalid data." : (numberOfInvalidColumns == 1 ?  "One column contains invalid data." :
-		              "Several rows and columns contain invalid data."));
+		Melder_throw (numberOfInvalidRows == 1 ? U"One row contains invalid data." : (numberOfInvalidColumns == 1 ?  U"One column contains invalid data." :
+		              U"Several rows and columns contain invalid data."));
 	}
 	return numberOfInvalidRows == 0 ? 1 : 0;
 }
 
-void TableOfReal_copyOneRowWithLabel (I, thou, long myrow, long thyrow) {
-	iam (TableOfReal); thouart (TableOfReal);
+void TableOfReal_copyOneRowWithLabel (TableOfReal me, TableOfReal thee, long myrow, long thyrow) {
 	try {
 		if (me == thee && myrow == thyrow) {
 			return;
 		}
 
 		if (myrow < 1 ||  myrow > my  numberOfRows || thyrow < 1 || thyrow > thy numberOfRows || my numberOfColumns != thy numberOfColumns) {
-			Melder_throw ("The dimensions do not fit.");
+			Melder_throw (U"The dimensions do not fit.");
 		}
 
 		Melder_free (thy rowLabels[thyrow]);
-		thy rowLabels[thyrow] = Melder_wcsdup (my rowLabels[myrow]);
+		thy rowLabels[thyrow] = Melder_dup (my rowLabels[myrow]);
 
 		if (my data[myrow] != thy data[thyrow]) {
 			NUMvector_copyElements (my data[myrow], thy data[thyrow], 1, my numberOfColumns);
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": row ", myrow, " not copied to ", thee);
+		Melder_throw (me, U": row ", myrow, U" not copied to ", thee);
 	}
 }
 
-int TableOfReal_hasRowLabels (I) {
-	iam (TableOfReal);
-
-	if (my rowLabels == NULL) {
+int TableOfReal_hasRowLabels (TableOfReal me) {
+	if (! my rowLabels) {
 		return 0;
 	}
 	for (long i = 1; i <= my numberOfRows; i++) {
@@ -167,10 +162,8 @@ int TableOfReal_hasRowLabels (I) {
 	return 1;
 }
 
-int TableOfReal_hasColumnLabels (I) {
-	iam (TableOfReal);
-
-	if (my columnLabels == NULL) {
+int TableOfReal_hasColumnLabels (TableOfReal me) {
+	if (! my columnLabels) {
 		return 0;
 	}
 	for (long i = 1; i <= my numberOfColumns; i++) {
@@ -182,7 +175,7 @@ int TableOfReal_hasColumnLabels (I) {
 }
 
 TableOfReal TableOfReal_createIrisDataset () {
-	float iris[150][4] = {
+	double iris[150][4] = {
 		{5.1, 3.5, 1.4, 0.2}, {4.9, 3.0, 1.4, 0.2}, {4.7, 3.2, 1.3, 0.2}, {4.6, 3.1, 1.5, 0.2}, {5.0, 3.6, 1.4, 0.2},
 		{5.4, 3.9, 1.7, 0.4}, {4.6, 3.4, 1.4, 0.3}, {5.0, 3.4, 1.5, 0.2}, {4.4, 2.9, 1.4, 0.2}, {4.9, 3.1, 1.5, 0.1},
 		{5.4, 3.7, 1.5, 0.2}, {4.8, 3.4, 1.6, 0.2}, {4.8, 3.0, 1.4, 0.1}, {4.3, 3.0, 1.1, 0.1}, {5.8, 4.0, 1.2, 0.2},
@@ -218,68 +211,65 @@ TableOfReal TableOfReal_createIrisDataset () {
 	try {
 		autoTableOfReal me = TableOfReal_create (150, 4);
 
-		TableOfReal_setColumnLabel (me.peek(), 1, L"sl");
-		TableOfReal_setColumnLabel (me.peek(), 2, L"sw");
-		TableOfReal_setColumnLabel (me.peek(), 3, L"pl");
-		TableOfReal_setColumnLabel (me.peek(), 4, L"pw");
+		TableOfReal_setColumnLabel (me.peek(), 1, U"sl");
+		TableOfReal_setColumnLabel (me.peek(), 2, U"sw");
+		TableOfReal_setColumnLabel (me.peek(), 3, U"pl");
+		TableOfReal_setColumnLabel (me.peek(), 4, U"pw");
 		for (long i = 1; i <= 150; i++) {
 			int kind = (i - 1) / 50 + 1;
-			wchar_t const *label = kind == 1 ? L"1" : kind == 2 ? L"2" : L"3";
+			char32 const *label = kind == 1 ? U"1" : kind == 2 ? U"2" : U"3";
 			for (long j = 1; j <= 4; j++) {
 				my data[i][j] = iris[i - 1][j - 1];
 			}
 			TableOfReal_setRowLabel (me.peek(), i, label);
 		}
-		Thing_setName (me.peek(), L"iris");
+		Thing_setName (me.peek(), U"iris");
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal from iris data not created.");
+		Melder_throw (U"TableOfReal from iris data not created.");
 	}
 }
 
-Strings TableOfReal_extractRowLabels (I) {
-	iam (TableOfReal);
+Strings TableOfReal_extractRowLabels (TableOfReal me) {
 	try {
 		autoStrings thee = Thing_new (Strings);
 
 		if (my numberOfRows > 0) {
-			thy strings = NUMvector<wchar_t *> (1, my numberOfRows);
+			thy strings = NUMvector<char32 *> (1, my numberOfRows);
 
 			thy numberOfStrings = my numberOfRows;
 
 			for (long i = 1; i <= my numberOfRows; i++) {
-				wchar_t const *label = my rowLabels[i] ? my rowLabels[i] : L"?";
-				thy strings[i] = Melder_wcsdup (label);
+				const char32 *label = my rowLabels[i] ? my rowLabels[i] : U"?";
+				thy strings[i] = Melder_dup (label);
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": row labels not extracted.");
+		Melder_throw (me, U": row labels not extracted.");
 	}
 }
 
-Strings TableOfReal_extractColumnLabels (I) {
-	iam (TableOfReal);
+Strings TableOfReal_extractColumnLabels (TableOfReal me) {
 	try {
 		autoStrings thee = Thing_new (Strings);
 
 		if (my numberOfColumns > 0) {
-			thy strings = NUMvector<wchar_t *> (1, my numberOfColumns);
+			thy strings = NUMvector<char32 *> (1, my numberOfColumns);
 			thy numberOfStrings = my numberOfColumns;
 
 			for (long i = 1; i <= my numberOfColumns; i++) {
-				wchar_t const *label = my columnLabels[i] ? my columnLabels[i] : L"?";
-				thy strings[i] = Melder_wcsdup (label);
+				char32 const *label = my columnLabels[i] ? my columnLabels[i] : U"?";
+				thy strings[i] = Melder_dup (label);
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": column labels not extracted.");
+		Melder_throw (me, U": column labels not extracted.");
 	}
 }
 
-TableOfReal TableOfReal_transpose (I) {
-	iam (TableOfReal);
+TableOfReal TableOfReal_transpose (TableOfReal me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my numberOfColumns, my numberOfRows);
 
@@ -292,15 +282,13 @@ TableOfReal TableOfReal_transpose (I) {
 		NUMstrings_copyElements (my columnLabels, thy rowLabels, 1, my numberOfColumns);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not transposed.");
+		Melder_throw (me, U": not transposed.");
 	}
 }
 
-int TableOfReal_to_Pattern_and_Categories (I, long fromrow, long torow, long fromcol, long tocol,
-        Pattern *p, Categories *c) {
-	*p = 0; *c = 0;
+int TableOfReal_to_Pattern_and_Categories (TableOfReal me, long fromrow, long torow, long fromcol, long tocol, Pattern *p, Categories *c) {
+	*p = nullptr; *c = nullptr;
 	try {
-		iam (TableOfReal);
 		long ncol = my numberOfColumns, nrow = my numberOfRows;
 
 		if (fromrow == torow && fromrow == 0) {
@@ -308,14 +296,14 @@ int TableOfReal_to_Pattern_and_Categories (I, long fromrow, long torow, long fro
 		} else if (fromrow > 0 && fromrow <= nrow && torow == 0) {
 			torow = nrow;
 		} else if (! (fromrow > 0 && torow <= nrow && fromrow <= torow)) {
-			Melder_throw ("Invalid row selection.");
+			Melder_throw (U"Invalid row selection.");
 		}
 		if (fromcol == tocol && fromcol == 0) {
 			fromcol = 1; tocol = ncol;
 		} else if (fromcol > 0 && fromcol <= ncol && tocol == 0) {
 			tocol = ncol;
 		} else if (! (fromcol > 0 && tocol <= ncol && fromcol <= tocol)) {
-			Melder_throw ("Invalid column selection.");
+			Melder_throw (U"Invalid column selection.");
 		}
 
 		nrow = torow - fromrow + 1;
@@ -325,7 +313,7 @@ int TableOfReal_to_Pattern_and_Categories (I, long fromrow, long torow, long fro
 
 		long row = 1;
 		for (long i = fromrow; i <= torow; i++, row++) {
-			wchar_t const *s = my rowLabels[i] ? my rowLabels[i] : L"?";
+			char32 const *s = my rowLabels[i] ? my rowLabels[i] : U"?";
 			autoSimpleString item = SimpleString_create (s);
 			Collection_addItem (ac.peek(), item.transfer());
 			long col = 1;
@@ -337,15 +325,14 @@ int TableOfReal_to_Pattern_and_Categories (I, long fromrow, long torow, long fro
 		*c = ac.transfer();
 		return 1;
 	} catch (MelderError) {
-		Melder_throw ("Pattern and Categories not created from TableOfReal.");
+		Melder_throw (U"Pattern and Categories not created from TableOfReal.");
 	}
 }
 
-void TableOfReal_getColumnExtrema (I, long col, double *min, double *max) {
+void TableOfReal_getColumnExtrema (TableOfReal me, long col, double *min, double *max) {
 	*min = NUMundefined; *max = NUMundefined;
-	iam (TableOfReal);
 	if (col < 1 || col > my numberOfColumns) {
-		Melder_throw ("Invalid column number.");
+		Melder_throw (U"Invalid column number.");
 	}
 	*min = *max = my data[1][col];
 	for (long i = 2; i <= my numberOfRows; i++) {
@@ -357,23 +344,21 @@ void TableOfReal_getColumnExtrema (I, long col, double *min, double *max) {
 	}
 }
 
-void TableOfReal_drawRowsAsHistogram (I, Graphics g, const wchar_t *rows, long colb, long cole, double ymin,
-                                      double ymax, double xoffsetFraction, double interbarFraction, double interbarsFraction, const wchar_t *greys, int garnish) {
-	iam (TableOfReal);
-
+void TableOfReal_drawRowsAsHistogram (TableOfReal me, Graphics g, const char32 *rows, long colb, long cole, double ymin,
+	double ymax, double xoffsetFraction, double interbarFraction, double interbarsFraction, const char32 *greys, int garnish) {
 	if (colb >= cole) {
 		colb = 1; cole = my numberOfColumns;
 	}
 	if (colb <= cole && (colb < 1 || cole > my numberOfColumns)) {
-		Melder_throw ("Invalid columns");
+		Melder_throw (U"Invalid columns");
 	}
 
 	long nrows;
 	autoNUMvector<double> irows (NUMstring_to_numbers (rows, &nrows), 1);
 	for (long i = 1; i <= nrows; i++) {
-		long irow = irows[i];
+		long irow = (long) floor (irows[i]);
 		if (irow < 0 || irow > my numberOfRows) {
-			Melder_throw ("Invalid row (", irow, ").");
+			Melder_throw (U"Invalid row (", irow, U").");
 		}
 		if (ymin >= ymax) {
 			double min, max;
@@ -393,16 +378,16 @@ void TableOfReal_drawRowsAsHistogram (I, Graphics g, const wchar_t *rows, long c
 	long ngreys;
 	autoNUMvector<double> igreys (NUMstring_to_numbers (greys, &ngreys), 1);
 
-	Graphics_setWindow (g, 0, 1, ymin, ymax);
+	Graphics_setWindow (g, 0.0, 1.0, ymin, ymax);
 	Graphics_setInner (g);
 
 	long ncols = cole - colb + 1;
-	double bar_width = 1 / (ncols * nrows + 2 * xoffsetFraction + (ncols - 1) * interbarsFraction + ncols * (nrows - 1) * interbarFraction);
+	double bar_width = 1.0 / (ncols * nrows + 2.0 * xoffsetFraction + (ncols - 1) * interbarsFraction + ncols * (nrows - 1) * interbarFraction);
 	double dx = (interbarsFraction + nrows + (nrows - 1) * interbarFraction) * bar_width;
 
 	for (long i = 1; i <= nrows; i++) {
-		long irow = irows[i];
-		double xb = xoffsetFraction * bar_width + (i - 1) * (1 + interbarFraction) * bar_width;
+		long irow = (long) floor (irows[i]);
+		double xb = xoffsetFraction * bar_width + (i - 1) * (1.0 + interbarFraction) * bar_width;
 
 		double x1 = xb;
 		double grey = i <= ngreys ? igreys[i] : igreys[ngreys];
@@ -428,31 +413,30 @@ void TableOfReal_drawRowsAsHistogram (I, Graphics g, const wchar_t *rows, long c
 		double xb = (xoffsetFraction + 0.5 * (nrows + (nrows - 1) * interbarFraction)) * bar_width;
 		for (long j = colb; j <= cole; j++) {
 			if (my columnLabels[j]) {
-				Graphics_markBottom (g, xb, 0, 0, 0, my columnLabels[j]);
+				Graphics_markBottom (g, xb, false, false, false, my columnLabels[j]);
 			}
 			xb += dx;
 		}
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
-void TableOfReal_drawBiplot (I, Graphics g, double xmin, double xmax, double ymin, double ymax, double sv_splitfactor, int labelsize, int garnish) {
-	iam (TableOfReal);
+void TableOfReal_drawBiplot (TableOfReal me, Graphics g, double xmin, double xmax, double ymin, double ymax, double sv_splitfactor, int labelsize, int garnish) {
 	long nr = my numberOfRows, nc = my numberOfColumns, nPoints = nr + nc;
 	int fontsize = Graphics_inqFontSize (g);
 
 	autoSVD svd = SVD_create (nr, nc);
 
 	NUMmatrix_copyElements (my data, svd -> u, 1, nr, 1, nc);
-	NUMcentreColumns (svd -> u, 1, nr, 1, nc, 0);
+	NUMcentreColumns (svd -> u, 1, nr, 1, nc, nullptr);
 
 	SVD_compute (svd.peek());
-	long numberOfZeroed = SVD_zeroSmallSingularValues (svd.peek(), 0);
+	long numberOfZeroed = SVD_zeroSmallSingularValues (svd.peek(), 0.0);
 
 	long nmin = MIN (nr, nc) - numberOfZeroed;
 	if (nmin < 2) {
-		Melder_throw ("There must be at least two (independent) columns in the table.");
+		Melder_throw (U"There must be at least two (independent) columns in the table.");
 	}
 	autoNUMvector<double> x (1, nPoints);
 	autoNUMvector<double> y (1, nPoints);
@@ -480,8 +464,8 @@ void TableOfReal_drawBiplot (I, Graphics g, double xmin, double xmax, double ymi
 		NUMvector_extrema (y.peek(), 1, nPoints, &ymin, &ymax);
 	}
 	if (ymax <= ymin) {
-		ymax += 1;
-		ymin -= 1;
+		ymax += 1.0;
+		ymin -= 1.0;
 	}
 
 	Graphics_setWindow (g, xmin, xmax, ymin, ymax);
@@ -492,16 +476,16 @@ void TableOfReal_drawBiplot (I, Graphics g, double xmin, double xmax, double ymi
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
 
 	for (long i = 1; i <= nPoints; i++) {
-		wchar_t const *label;
+		char32 const *label;
 		if (i <= nr) {
 			label = my rowLabels[i];
-			if (label == NULL) {
-				label = L"?__r_";
+			if (! label) {
+				label = U"?__r_";
 			}
 		} else {
 			label = my columnLabels[i - nr];
-			if (label == NULL) {
-				label = L"?__c_";
+			if (! label) {
+				label = U"?__c_";
 			}
 		}
 		Graphics_text (g, x[i], y[i], label);
@@ -511,8 +495,8 @@ void TableOfReal_drawBiplot (I, Graphics g, double xmin, double xmax, double ymi
 
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_marksBottom (g, 2, true, true, false);
 	}
 
 	if (labelsize > 0) {
@@ -520,9 +504,7 @@ void TableOfReal_drawBiplot (I, Graphics g, double xmin, double xmax, double ymi
 	}
 }
 
-void TableOfReal_drawBoxPlots (I, Graphics g, long rowmin, long rowmax, long colmin, long colmax, double ymin, double ymax, int garnish) {
-	iam (TableOfReal);
-
+void TableOfReal_drawBoxPlots (TableOfReal me, Graphics g, long rowmin, long rowmax, long colmin, long colmax, double ymin, double ymax, int garnish) {
 	if (rowmax < rowmin || rowmax < 1) {
 		rowmin = 1; rowmax = my numberOfRows;
 	}
@@ -566,15 +548,14 @@ void TableOfReal_drawBoxPlots (I, Graphics g, long rowmin, long rowmax, long col
 		Graphics_drawInnerBox (g);
 		for (long j = colmin; j <= colmax; j++) {
 			if (my columnLabels && my columnLabels[j] && my columnLabels[j][0]) {
-				Graphics_markBottom (g, j, 0, 1, 0, my columnLabels [j]);
+				Graphics_markBottom (g, j, false, true, false, my columnLabels [j]);
 			}
 		}
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
-int TableOfReal_equalLabels (I, thou, int rowLabels, int columnLabels) {
-	iam (TableOfReal); thouart (TableOfReal);
+int TableOfReal_equalLabels (TableOfReal me, TableOfReal thee, int rowLabels, int columnLabels) {
 	Melder_assert (rowLabels || columnLabels);
 	if (rowLabels) {
 		if (my numberOfRows != thy numberOfRows) {
@@ -584,7 +565,7 @@ int TableOfReal_equalLabels (I, thou, int rowLabels, int columnLabels) {
 			return 1;
 		}
 		for (long i = 1; i <= my numberOfRows; i++) {
-			if (Melder_wcscmp (my rowLabels[i], thy rowLabels[i])) {
+			if (Melder_cmp (my rowLabels[i], thy rowLabels[i])) {
 				return 0;
 			}
 		}
@@ -597,7 +578,7 @@ int TableOfReal_equalLabels (I, thou, int rowLabels, int columnLabels) {
 			return 1;
 		}
 		for (long i = 1; i <= my numberOfColumns; i++) {
-			if (Melder_wcscmp (my columnLabels[i], thy columnLabels[i]) != 0) {
+			if (Melder_cmp (my columnLabels[i], thy columnLabels[i]) != 0) {
 				return 0;
 			}
 		}
@@ -605,69 +586,61 @@ int TableOfReal_equalLabels (I, thou, int rowLabels, int columnLabels) {
 	return 1;
 }
 
-void TableOfReal_copyLabels (I, thou, int rowOrigin, int columnOrigin) {
-	iam (TableOfReal);
-	thouart (TableOfReal);
-
+void TableOfReal_copyLabels (TableOfReal me, TableOfReal thee, int rowOrigin, int columnOrigin) {
 	if (rowOrigin == 1) {
 		if (my numberOfRows != thy numberOfRows) {
-			Melder_throw ("#rows1 must equal #rows2");
+			Melder_throw (U"#rows1 must equal #rows2");
 		}
 		NUMstrings_copyElements (my rowLabels, thy rowLabels, 1, thy numberOfRows);
 	} else if (rowOrigin == -1) {
 		if (my numberOfColumns != thy numberOfRows) {
-			Melder_throw ("#columns1 must equal #rows2.");
+			Melder_throw (U"#columns1 must equal #rows2.");
 		}
 		NUMstrings_copyElements (my columnLabels, thy rowLabels, 1, thy numberOfRows);
 	}
 	if (columnOrigin == 1) {
 		if (my numberOfColumns != thy numberOfColumns) {
-			Melder_throw ("#columns1 must equal #columns2.");
+			Melder_throw (U"#columns1 must equal #columns2.");
 		}
 		NUMstrings_copyElements (my columnLabels, thy columnLabels, 1, thy numberOfColumns);
 	} else if (columnOrigin == -1) {
 		if (my numberOfRows != thy numberOfColumns) {
-			Melder_throw ("#rows1 must equal #columns2");
+			Melder_throw (U"#rows1 must equal #columns2");
 		}
 		NUMstrings_copyElements (my rowLabels, thy columnLabels, 1, thy numberOfColumns);
 	}
 }
 
-void TableOfReal_labelsFromCollectionItemNames (I, thou, int row, int column) {
-	iam (TableOfReal);
+void TableOfReal_labelsFromCollectionItemNames (TableOfReal me, Collection thee, int row, int column) {
 	try {
-		thouart (Collection);
-
 		if (row) {
 			Melder_assert (my numberOfRows == thy size);
 			for (long i = 1; i <= my numberOfRows; i++) {
-				wchar_t const *name = Thing_getName ( (Thing) thy item[i]);
+				const char32 *name = Thing_getName ( (Thing) thy item[i]);
 				TableOfReal_setRowLabel (me, i, name);
 			}
 		}
 		if (column) {
 			Melder_assert (my numberOfColumns == thy size);
 			for (long i = 1; i <= my numberOfColumns; i++) {
-				wchar_t const *name = Thing_getName ( (Thing) thy item[i]);
+				const char32 *name = Thing_getName ( (Thing) thy item[i]);
 				TableOfReal_setColumnLabel (me, i, name);
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": labels not changed.");
+		Melder_throw (me, U": labels not changed.");
 	}
 }
 
-void TableOfReal_centreColumns (I) {
-	iam (TableOfReal);
-	NUMcentreColumns (my data, 1, my numberOfRows, 1, my numberOfColumns, NULL);
+void TableOfReal_centreColumns (TableOfReal me) {
+	NUMcentreColumns (my data, 1, my numberOfRows, 1, my numberOfColumns, nullptr);
 }
 
-void TableOfReal_and_Categories_setRowLabels (I, Categories thee) {
-	iam (TableOfReal);
+void TableOfReal_and_Categories_setRowLabels (TableOfReal me, Categories thee) {
 	try {
 
 		if (my numberOfRows != thy size) {
-			Melder_throw ("The number of items in both objects must be equal.");
+			Melder_throw (U"The number of items in both objects must be equal.");
 		}
 
 		/*
@@ -679,79 +652,71 @@ void TableOfReal_and_Categories_setRowLabels (I, Categories thee) {
 
 		for (long i = 1; i <= my numberOfRows; i++) {
 			SimpleString s = (SimpleString) c -> item[i];
-			wchar_t *t = s -> string;
+			char32 *t = s -> string;
 			s -> string = my rowLabels[i];
 			my rowLabels[i] = t;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": row labels not set from categories.");
+		Melder_throw (me, U": row labels not set from categories.");
 	}
 }
 
-void TableOfReal_centreColumns_byRowLabel (I) {
-	iam (TableOfReal);
-	wchar_t *label = my rowLabels[1];
+void TableOfReal_centreColumns_byRowLabel (TableOfReal me) {
+	char32 *label = my rowLabels[1];
 	long index = 1;
 
 	for (long i = 2; i <= my numberOfRows; i++) {
-		wchar_t *li = my rowLabels[i];
-		if (Melder_wcscmp (li, label) != 0) {
+		char32 *li = my rowLabels[i];
+		if (Melder_cmp (li, label) != 0) {
 			NUMcentreColumns (my data, index, i - 1, 1, my numberOfColumns, 0);
 			label = li; index = i;
 		}
 	}
-	NUMcentreColumns (my data, index, my numberOfRows, 1, my numberOfColumns, NULL);
+	NUMcentreColumns (my data, index, my numberOfRows, 1, my numberOfColumns, nullptr);
 }
 
-double TableOfReal_getRowSum (I, long index) {
-	iam (TableOfReal);
-
+double TableOfReal_getRowSum (TableOfReal me, long index) {
 	if (index < 1 || index > my numberOfRows) {
 		return NUMundefined;
 	}
 
-	double sum = 0;
+	double sum = 0.0;
 	for (long j = 1; j <= my numberOfColumns; j++) {
 		sum += my data[index][j];
 	}
 	return sum;
 }
 
-double TableOfReal_getColumnSumByLabel (I, const wchar_t *label) {
-	iam (TableOfReal);
+double TableOfReal_getColumnSumByLabel (TableOfReal me, const char32 *label) {
 	long index = TableOfReal_columnLabelToIndex (me, label);
 	if (index < 1) {
-		Melder_throw ("There is no \"", label, "\" column label.");
+		Melder_throw (U"There is no \"", label, U"\" column label.");
 	}
 	return TableOfReal_getColumnSum (me, index);
 }
 
-double TableOfReal_getRowSumByLabel (I, const wchar_t *label) {
-	iam (TableOfReal);
+double TableOfReal_getRowSumByLabel (TableOfReal me, const char32 *label) {
 	long index = TableOfReal_rowLabelToIndex (me, label);
 	if (index < 1) {
-		Melder_throw ("There is no \"", label, "\" row label.");
+		Melder_throw (U"There is no \"", label, U"\" row label.");
 	}
 	return TableOfReal_getRowSum (me, index);
 }
 
-double TableOfReal_getColumnSum (I, long index) {
-	iam (TableOfReal);
-
+double TableOfReal_getColumnSum (TableOfReal me, long index) {
 	if (index < 1 || index > my numberOfColumns) {
 		return NUMundefined;
 	}
 
-	double sum = 0;
+	double sum = 0.0;
 	for (long i = 1; i <= my numberOfRows; i++) {
 		sum += my data[i][index];
 	}
 	return sum;
 }
 
-double TableOfReal_getGrandSum (I) {
-	iam (TableOfReal);
-	double sum = 0;
+double TableOfReal_getGrandSum (TableOfReal me) {
+	double sum = 0.0;
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
 			sum += my data[i][j];
@@ -760,44 +725,36 @@ double TableOfReal_getGrandSum (I) {
 	return sum;
 }
 
-void TableOfReal_centreRows (I) {
-	iam (TableOfReal);
+void TableOfReal_centreRows (TableOfReal me) {
 	NUMcentreRows (my data, 1, my numberOfRows, 1, my numberOfColumns);
 }
 
-void TableOfReal_doubleCentre (I) {
-	iam (TableOfReal);
+void TableOfReal_doubleCentre (TableOfReal me) {
 	NUMdoubleCentre (my data, 1, my numberOfRows, 1, my numberOfColumns);
 }
 
-void TableOfReal_normalizeColumns (I, double norm) {
-	iam (TableOfReal);
+void TableOfReal_normalizeColumns (TableOfReal me, double norm) {
 	NUMnormalizeColumns (my data, my numberOfRows, my numberOfColumns, norm);
 }
 
-void TableOfReal_normalizeRows (I, double norm) {
-	iam (TableOfReal);
+void TableOfReal_normalizeRows (TableOfReal me, double norm) {
 	NUMnormalizeRows (my data, my numberOfRows, my numberOfColumns, norm);
 }
 
-void TableOfReal_standardizeColumns (I) {
-	iam (TableOfReal);
+void TableOfReal_standardizeColumns (TableOfReal me) {
 	NUMstandardizeColumns (my data, 1, my numberOfRows, 1, my numberOfColumns);
 }
 
-void TableOfReal_standardizeRows (I) {
-	iam (TableOfReal);
+void TableOfReal_standardizeRows (TableOfReal me) {
 	NUMstandardizeRows (my data, 1, my numberOfRows, 1, my numberOfColumns);
 }
 
-void TableOfReal_normalizeTable (I, double norm) {
-	iam (TableOfReal);
+void TableOfReal_normalizeTable (TableOfReal me, double norm) {
 	NUMnormalize (my data, my numberOfRows, my numberOfColumns, norm);
 }
 
-double TableOfReal_getTableNorm (I) {
-	iam (TableOfReal);
-	double sumsq = 0;
+double TableOfReal_getTableNorm (TableOfReal me) {
+	double sumsq = 0.0;
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
 			sumsq += my data[i][j] * my data[i][j];
@@ -806,13 +763,12 @@ double TableOfReal_getTableNorm (I) {
 	return sqrt (sumsq);
 }
 
-int TableOfReal_checkPositive (I) {
-	iam (TableOfReal);
+int TableOfReal_checkPositive (TableOfReal me) {
 	long negative = 0;
 
 	for (long i = 1; i <= my numberOfRows; i++) {
 		for (long j = 1; j <= my numberOfColumns; j++) {
-			if (my data[i][j] < 0) {
+			if (my data[i][j] < 0.0) {
 				negative ++; break;
 			}
 		}
@@ -834,8 +790,7 @@ void NUMdmatrix_getColumnExtrema (double **a, long rowb, long rowe, long icol, d
 	}
 }
 
-void TableOfReal_drawScatterPlotMatrix (I, Graphics g, long colb, long cole, double fractionWhite) {
-	iam (TableOfReal);
+void TableOfReal_drawScatterPlotMatrix (TableOfReal me, Graphics g, long colb, long cole, double fractionWhite) {
 	long m = my numberOfRows;
 
 	if (colb == 0 && cole == 0) {
@@ -871,31 +826,32 @@ void TableOfReal_drawScatterPlotMatrix (I, Graphics g, long colb, long cole, dou
 		xmin[j] -= extra; xmax[j] += extra;
 	}
 
-	Graphics_setWindow (g, 0, n, 0, n);
+	Graphics_setWindow (g, 0.0, n, 0.0, n);
 	Graphics_setInner (g);
-	Graphics_line (g, 0, n, n, n);
-	Graphics_line (g, 0, 0, 0, n);
+	Graphics_line (g, 0.0, n, n, n);
+	Graphics_line (g, 0.0, 0.0, 0.0, n);
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
 
 	for (long i = 1; i <= n; i++) {
 		long xcol, ycol = colb + i - 1;
-		wchar_t const  *mark;
-		wchar label[20];
-		Graphics_line (g, 0, n - i, n, n - i);
-		Graphics_line (g, i, n, i, 0);
+		const char32 *mark;
+		char32 label[40];
+		Graphics_line (g, 0.0, n - i, n, n - i);
+		Graphics_line (g, i, n, i, 0.0);
 		for (long j = 1; j <= n; j++) {
 			xcol = colb + j - 1;
 			if (i == j) {
 				mark = my columnLabels[xcol];
 				if (! mark) {
-					swprintf (label, 20, L"Column %ld", xcol); mark = label;
+					Melder_sprint (label,40, U"Column ", xcol);   // ppgb: 20 chars is niet genoeg voor een long
+					mark = label;
 				}
 				Graphics_text (g, j - 0.5, n - i + 0.5, mark);
 			} else {
 				for (long k = 1; k <= m; k++) {
 					double x = j - 1 + (my data[k][xcol] - xmin[xcol]) / (xmax[xcol] - xmin[xcol]);
 					double y = n - i + (my data[k][ycol] - xmin[ycol]) / (xmax[ycol] - xmin[ycol]);
-					mark = EMPTY_STRING (my rowLabels[k]) ? L"+" : my rowLabels[k];
+					mark = EMPTY_STRING (my rowLabels[k]) ? U"+" : my rowLabels[k];
 					Graphics_text (g, x, y, mark);
 				}
 			}
@@ -906,27 +862,26 @@ void TableOfReal_drawScatterPlotMatrix (I, Graphics g, long colb, long cole, dou
 
 void TableOfReal_drawAsSquares_area (TableOfReal me, Graphics g, double zmin, double zmax, double cellSizeFactor, int randomFillOrder, int garnish) {
 	try {
-		cellSizeFactor = cellSizeFactor <= 0 ? 1 : cellSizeFactor;
+		cellSizeFactor = cellSizeFactor <= 0.0 ? 1.0 : cellSizeFactor;
 		if (zmin == 0 && zmax == 0) {
 			NUMmatrix_extrema<double> (my data, 1, my numberOfRows, 1, my numberOfColumns, &zmin, &zmax);
 		}
-		double xmin = 0, xmax = my numberOfColumns + 1, ymin = 0, ymax = my numberOfRows + 1;
+		double xmin = 0.0, xmax = my numberOfColumns + 1.0, ymin = 0.0, ymax = my numberOfRows + 1.0;
 		Graphics_setWindow (g, xmin, xmax, ymin, ymax);
 		Graphics_setInner (g);
 		Graphics_matrixAsSquares (g, my data, my numberOfRows, my numberOfColumns, zmin, zmax, cellSizeFactor, randomFillOrder);
 		Graphics_unsetInner (g);
 		if (garnish) {
 			Graphics_drawInnerBox (g);
-			Graphics_marksBottomEvery (g, 1, 1, false, true, false);
-			Graphics_marksLeftEvery (g, 1, 1, false, true, false);
+			Graphics_marksBottomEvery (g, 1.0, 1.0, false, true, false);
+			Graphics_marksLeftEvery (g, 1.0, 1.0, false, true, false);
 		}
 	} catch (MelderError) {
 		Melder_clearError ();   // drawing errors shall be ignored
 	}
 }
 
-void TableOfReal_drawScatterPlot (I, Graphics g, long icx, long icy, long rowb, long rowe, double xmin, double xmax, double ymin, double ymax, int labelSize, int useRowLabels, const wchar_t *label, int garnish) {
-	iam (TableOfReal);
+void TableOfReal_drawScatterPlot (TableOfReal me, Graphics g, long icx, long icy, long rowb, long rowe, double xmin, double xmax, double ymin, double ymax, int labelSize, int useRowLabels, const char32 *label, int garnish) {
 	double m = my numberOfRows, n = my numberOfColumns;
 	int fontSize = Graphics_inqFontSize (g);
 
@@ -937,20 +892,20 @@ void TableOfReal_drawScatterPlot (I, Graphics g, long icx, long icy, long rowb,
 		rowb = 1;
 	}
 	if (rowe > m) {
-		rowe = m;
+		rowe = (long) floor (m);
 	}
 	if (rowe <= rowb) {
-		rowb = 1; rowe = m;
+		rowb = 1; rowe = (long) floor (m);
 	}
 
 	if (xmax == xmin) {
 		NUMdmatrix_getColumnExtrema (my data, rowb, rowe, icx, & xmin, & xmax);
-		double tmp = xmax - xmin == 0 ? 0.5 : 0.0;
+		double tmp = xmax - xmin == 0.0 ? 0.5 : 0.0;
 		xmin -= tmp; xmax += tmp;
 	}
 	if (ymax == ymin) {
 		NUMdmatrix_getColumnExtrema (my data, rowb, rowe, icy, & ymin, & ymax);
-		double tmp = ymax - ymin == 0 ? 0.5 : 0.0;
+		double tmp = ymax - ymin == 0.0 ? 0.5 : 0.0;
 		ymin -= tmp; ymax += tmp;
 	}
 
@@ -963,9 +918,9 @@ void TableOfReal_drawScatterPlot (I, Graphics g, long icx, long icy, long rowb,
 	for (long i = rowb; i <= rowe; i++) {
 		double x = my data[i][icx], y = my data[i][icy];
 
-		if ( ( (xmin < xmax && x >= xmin && x <= xmax) || (xmin > xmax && x <= xmin && x >= xmax)) &&
-		        ( (ymin < ymax && y >= ymin && y <= ymax) || (ymin > ymax && y <= ymin && y >= ymax))) {
-			const wchar_t *plotLabel = useRowLabels ? my rowLabels[i] : label;
+		if (((xmin < xmax && x >= xmin && x <= xmax) || (xmin > xmax && x <= xmin && x >= xmax)) &&
+		        ((ymin < ymax && y >= ymin && y <= ymax) || (ymin > ymax && y <= ymin && y >= ymax))) {
+			const char32 *plotLabel = useRowLabels ? my rowLabels[i] : label;
 			if (! NUMstring_containsPrintableCharacter (plotLabel)) {
 				noLabel++;
 				continue;
@@ -981,30 +936,30 @@ void TableOfReal_drawScatterPlot (I, Graphics g, long icx, long icy, long rowb,
 		Graphics_drawInnerBox (g);
 		if (ymin < ymax) {
 			if (my columnLabels[icx]) {
-				Graphics_textBottom (g, 1, my columnLabels[icx]);
+				Graphics_textBottom (g, true, my columnLabels[icx]);
 			}
-			Graphics_marksBottom (g, 2, 1, 1, 0);
+			Graphics_marksBottom (g, 2, true, true, false);
 		} else {
 			if (my columnLabels[icx]) {
-				Graphics_textTop (g, 1, my columnLabels[icx]);
+				Graphics_textTop (g, true, my columnLabels[icx]);
 			}
-			Graphics_marksTop (g, 2, 1, 1, 0);
+			Graphics_marksTop (g, 2, true, true, false);
 		}
 		if (xmin < xmax) {
 			if (my columnLabels[icy]) {
-				Graphics_textLeft (g, 1, my columnLabels[icy]);
+				Graphics_textLeft (g, true, my columnLabels[icy]);
 			}
-			Graphics_marksLeft (g, 2, 1, 1, 0);
+			Graphics_marksLeft (g, 2, true, true, false);
 		} else {
 			if (my columnLabels[icy]) {
-				Graphics_textRight (g, 1, my columnLabels[icy]);
+				Graphics_textRight (g, true, my columnLabels[icy]);
 			}
-			Graphics_marksRight (g, 2, 1, 1, 0);
+			Graphics_marksRight (g, 2, true, true, false);
 		}
 	}
 	if (noLabel > 0) {
-		Melder_warning (Melder_integer (noLabel), L" from ", Melder_integer (my numberOfRows), L" labels are "
-		                "not visible because they are empty or they contain only spaces or non-printable characters");
+		Melder_warning (noLabel, U" from ", my numberOfRows, U" labels are "
+		                U"not visible because they are empty or they contain only spaces or non-printable characters");
 	}
 }
 
@@ -1012,8 +967,7 @@ void TableOfReal_drawScatterPlot (I, Graphics g, long icx, long icy, long rowb,
 
 Thing_implement (TablesOfReal, Ordered, 0);
 
-void TablesOfReal_init (I, ClassInfo klas) {
-	iam (TablesOfReal);
+void TablesOfReal_init (TablesOfReal me, ClassInfo klas) {
 	Ordered_init (me, klas, 10);
 }
 
@@ -1023,22 +977,21 @@ TablesOfReal TablesOfReal_create () {
 		TablesOfReal_init (me.peek(), classTableOfReal);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TablesOfReal not created.");
+		Melder_throw (U"TablesOfReal not created.");
 	}
 }
 
-TableOfReal TablesOfReal_sum (I) {
-	iam (TablesOfReal);
+TableOfReal TablesOfReal_sum (TablesOfReal me) {
 	try {
 		if (my size <= 0) {
-			return 0;
+			return nullptr;
 		}
-		autoTableOfReal thee = Data_copy ( (TableOfReal) my item[1]);
+		autoTableOfReal thee = Data_copy ((TableOfReal) my item[1]);
 
 		for (long i = 2; i <= my size; i++) {
 			TableOfReal him = (TableOfReal) my item[i];
 			if (thy numberOfRows != his numberOfRows || thy numberOfColumns != his numberOfColumns || ! TableOfReal_equalLabels (thee.peek(), him, 1, 1)) {
-				Melder_throw ("Dimensions or labels differ for table 1 and ", i, ".");
+				Melder_throw (U"Dimensions or labels differ for table 1 and ", i, U".");
 			}
 			for (long j = 1; j <= thy numberOfRows; j++) {
 				for (long k = 1; k <= thy numberOfColumns; k++) {
@@ -1048,12 +1001,11 @@ TableOfReal TablesOfReal_sum (I) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": sum not created.");
+		Melder_throw (me, U": sum not created.");
 	}
 }
 
-int TablesOfReal_checkDimensions (I) {
-	iam (TablesOfReal);
+int TablesOfReal_checkDimensions (TablesOfReal me) {
 	if (my size < 2) {
 		return 1;
 	}
@@ -1068,10 +1020,8 @@ int TablesOfReal_checkDimensions (I) {
 	return 1;
 }
 
-double TableOfReal_getColumnQuantile (I, long col, double quantile) {
+double TableOfReal_getColumnQuantile (TableOfReal me, long col, double quantile) {
 	try {
-		iam (TableOfReal);
-
 		if (col < 1 || col > my numberOfColumns) {
 			return NUMundefined;
 		}
@@ -1117,7 +1067,7 @@ static TableOfReal TableOfReal_createPolsVanNieropData (int choice, int include_
 			}
 		}
 		for (long j = 1; j <= 3; j++) {
-			wchar_t const *label = table -> columnHeaders[4 + j].label;
+			const char32 *label = table -> columnHeaders[4 + j].label;
 			TableOfReal_setColumnLabel (thee.peek(), j, label);
 			if (include_levels) {
 				label = table -> columnHeaders[7 + j].label;
@@ -1126,7 +1076,7 @@ static TableOfReal TableOfReal_createPolsVanNieropData (int choice, int include_
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal from Pols & Van Nierop data not created.");
+		Melder_throw (U"TableOfReal from Pols & Van Nierop data not created.");
 	}
 }
 
@@ -1157,12 +1107,12 @@ TableOfReal TableOfReal_createFromWeeninkData (int option) {
 			}
 		}
 		for (long j = 1; j <= 3; j++)  {
-			wchar_t const *label = table -> columnHeaders[6 + j].label;
+			const char32 *label = table -> columnHeaders[6 + j].label;
 			TableOfReal_setColumnLabel (thee.peek(), j, label);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal from Weenink data not created.");
+		Melder_throw (U"TableOfReal from Weenink data not created.");
 	}
 }
 
@@ -1173,7 +1123,7 @@ TableOfReal TableOfReal_randomizeRows (TableOfReal me) {
 		autoTableOfReal thee = TableOfReal_and_Permutation_permuteRows (me, p.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": randomized rows not created");
+		Melder_throw (me, U": randomized rows not created");
 	}
 }
 
@@ -1204,39 +1154,36 @@ TableOfReal TableOfReal_bootstrap (TableOfReal me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": bootstrapped data not created.");
+		Melder_throw (me, U": bootstrapped data not created.");
 	}
 }
 
-void TableOfReal_changeRowLabels (I, const wchar_t *search, const wchar_t *replace, int maximumNumberOfReplaces, long *nmatches, long *nstringmatches, int use_regexp) {
-	iam (TableOfReal);
+void TableOfReal_changeRowLabels (TableOfReal me, const char32 *search, const char32 *replace, int maximumNumberOfReplaces, long *nmatches, long *nstringmatches, int use_regexp) {
 	try {
-		autostringvector rowLabels (strs_replace (my rowLabels, 1, my numberOfRows, search, replace, maximumNumberOfReplaces, nmatches, nstringmatches, use_regexp), 1, my numberOfRows);
+		autostring32vector rowLabels (strs_replace (my rowLabels, 1, my numberOfRows, search, replace, maximumNumberOfReplaces, nmatches, nstringmatches, use_regexp), 1, my numberOfRows);
 		NUMstrings_free (my rowLabels, 1, my numberOfRows);
 		my rowLabels = rowLabels.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": row labels not changed.");
+		Melder_throw (me, U": row labels not changed.");
 	}
 }
 
-void TableOfReal_changeColumnLabels (I, const wchar_t *search, const wchar_t *replace, int maximumNumberOfReplaces, long *nmatches, long *nstringmatches, int use_regexp) {
-	iam (TableOfReal);
+void TableOfReal_changeColumnLabels (TableOfReal me, const char32 *search, const char32 *replace, int maximumNumberOfReplaces, long *nmatches, long *nstringmatches, int use_regexp) {
 	try {
-		autostringvector columnLabels (strs_replace (my columnLabels, 1, my numberOfColumns, search, replace, maximumNumberOfReplaces, nmatches, nstringmatches, use_regexp), 1, my numberOfColumns);
+		autostring32vector columnLabels (strs_replace (my columnLabels, 1, my numberOfColumns, search, replace, maximumNumberOfReplaces, nmatches, nstringmatches, use_regexp), 1, my numberOfColumns);
 		NUMstrings_free (my columnLabels, 1, my numberOfColumns);
 		my columnLabels = columnLabels.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": column labels not changed.");
+		Melder_throw (me, U": column labels not changed.");
 	}
 }
 
-long TableOfReal_getNumberOfLabelMatches (I, const wchar_t *search, int columnLabels, int use_regexp) {
-	iam (TableOfReal);
+long TableOfReal_getNumberOfLabelMatches (TableOfReal me, const char32 *search, int columnLabels, int use_regexp) {
 	long nmatches = 0, numberOfLabels = my numberOfRows;
-	wchar_t **labels = my rowLabels;
-	regexp *compiled_regexp = 0;
+	char32 **labels = my rowLabels;
+	regexp *compiled_regexp = nullptr;
 
-	if (search == 0 || wcslen (search) == 0) {
+	if (! search || str32len (search) == 0) {
 		return 0;
 	}
 	if (columnLabels) {
@@ -1244,21 +1191,17 @@ long TableOfReal_getNumberOfLabelMatches (I, const wchar_t *search, int columnLa
 		labels = my columnLabels;
 	}
 	if (use_regexp) {
-		const wchar_t *compileMsg;
-		compiled_regexp = CompileRE ( (regularExp_CHAR *) search, &compileMsg, 0);
-		if (compiled_regexp == 0) {
-			Melder_throw (compileMsg);
-		}
+		compiled_regexp = CompileRE_throwable (search, 0);
 	}
 	for (long i = 1; i <= numberOfLabels; i++) {
-		if (labels[i] == 0) {
+		if (! labels[i]) {
 			continue;
 		}
 		if (use_regexp) {
-			if (ExecRE (compiled_regexp, 0, (regularExp_CHAR *) labels[i], NULL, 0, '\0', '\0', 0, 0, 0)) {
+			if (ExecRE (compiled_regexp, 0, labels[i], nullptr, 0, U'\0', U'\0', 0, 0, 0)) {
 				nmatches++;
 			}
-		} else if (wcsequ (labels[i], search)) {
+		} else if (str32equ (labels[i], search)) {
 			nmatches++;
 		}
 	}
@@ -1268,18 +1211,16 @@ long TableOfReal_getNumberOfLabelMatches (I, const wchar_t *search, int columnLa
 	return nmatches;
 }
 
-void TableOfReal_drawVectors (I, Graphics g, long colx1, long coly1, long colx2, long coly2, double xmin, double xmax,
-                              double ymin, double ymax, int vectype, int labelsize, int garnish) {
-	iam (TableOfReal);
+void TableOfReal_drawVectors (TableOfReal me, Graphics g, long colx1, long coly1, long colx2, long coly2, double xmin, double xmax, double ymin, double ymax, int vectype, int labelsize, int garnish) {
 	long nx = my numberOfColumns, ny = my numberOfRows;
 	int fontsize = Graphics_inqFontSize (g);
 
 	if (colx1 < 1 || colx1 > nx || coly1 < 1 || coly1 > nx) {
-		Melder_warning (L"The index in the \"From\" column(s) must be in range [1, ", Melder_integer (nx), L"].");
+		Melder_warning (U"The index in the \"From\" column(s) must be in range [1, ", nx, U"].");
 		return;
 	}
 	if (colx2 < 1 || colx2 > nx || coly2 < 1 || coly2 > nx) {
-		Melder_warning (L"The index in the \"To\" column(s) must be in range [1, ", Melder_integer (nx), L"].");
+		Melder_warning (U"The index in the \"To\" column(s) must be in range [1, ", nx, U"].");
 		return;
 	}
 
@@ -1328,7 +1269,7 @@ void TableOfReal_drawVectors (I, Graphics g, long colx1, long coly1, long colx2,
 		double y1 = my data[i][coly1];
 		double x2 = my data[i][colx2];
 		double y2 = my data[i][coly2];
-		wchar_t const *mark = EMPTY_STRING (my rowLabels[i]) ? L"" : my rowLabels[i];
+		const char32 *mark = EMPTY_STRING (my rowLabels[i]) ? U"" : my rowLabels[i];
 		if (vectype == Graphics_LINE) {
 			Graphics_line (g, x1, y1, x2, y2);
 		} else if (vectype == Graphics_TWOWAYARROW) {
@@ -1347,48 +1288,45 @@ void TableOfReal_drawVectors (I, Graphics g, long colx1, long coly1, long colx2,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_marksBottom (g, 2, true, true, false);
 	}
 }
 
-void TableOfReal_drawColumnAsDistribution (I, Graphics g, int column, double minimum, double maximum, long nBins,
-        double freqMin, double freqMax, int cumulative, int garnish) {
-	iam (TableOfReal);
+void TableOfReal_drawColumnAsDistribution (TableOfReal me, Graphics g, int column, double minimum, double maximum, long nBins, double freqMin, double freqMax, int cumulative, int garnish) {
 	if (column < 1 || column > my numberOfColumns) {
 		return;
 	}
 	autoMatrix thee = TableOfReal_to_Matrix (me);
-	Matrix_drawDistribution (thee.peek(), g,  column - 0.5, column + 0.5, 0, 0, minimum, maximum, nBins, freqMin,  freqMax,  cumulative,  garnish);
+	Matrix_drawDistribution (thee.peek(), g, column - 0.5, column + 0.5, 0.0, 0.0, minimum, maximum, nBins, freqMin, freqMax, cumulative, garnish);
 	if (garnish && my columnLabels[column] != 0) {
-		Graphics_textBottom (g, 1, my columnLabels[column]);
+		Graphics_textBottom (g, true, my columnLabels[column]);
 	}
 }
 
-TableOfReal TableOfReal_sortRowsByIndex (I, long *index, int reverse) {
-	iam (TableOfReal);
+TableOfReal TableOfReal_sortRowsByIndex (TableOfReal me, long *index, int reverse) {
 	try {
 		if (my rowLabels == 0) {
-			Melder_throw ("No labels to sort");
+			Melder_throw (U"No labels to sort");
 		}
 
 		double min, max;
 		NUMvector_extrema (index, 1, my numberOfRows, &min, &max);
 		if (min < 1 || max > my numberOfRows) {
-			Melder_throw ("One or more indices out of range [1, ", my numberOfRows, "].");
+			Melder_throw (U"One or more indices out of range [1, ", my numberOfRows, U"].");
 		}
 		autoTableOfReal thee = TableOfReal_create (my numberOfRows, my numberOfColumns);
 
 		for (long i = 1; i <= my numberOfRows; i++) {
-			long    myindex = reverse ? i : index[i];
-			long   thyindex = reverse ? index[i] : i;
-			wchar_t   *mylabel = my rowLabels[myindex];
-			double  *mydata = my data[myindex];
+			long myindex = reverse ? i : index[i];
+			long thyindex = reverse ? index[i] : i;
+			const char32 *mylabel = my rowLabels[myindex];
+			double *mydata = my data[myindex];
 			double *thydata = thy data[thyindex];
 
 			// Copy the row label
 
-			thy rowLabels[i] = Melder_wcsdup (mylabel);
+			thy rowLabels[i] = Melder_dup (mylabel);
 
 			// Copy the row values
 
@@ -1402,29 +1340,27 @@ TableOfReal TableOfReal_sortRowsByIndex (I, long *index, int reverse) {
 		NUMstrings_copyElements (my columnLabels, thy columnLabels, 1, my numberOfColumns);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not sorted by row index.");
+		Melder_throw (me, U": not sorted by row index.");
 	}
 }
 
-long *TableOfReal_getSortedIndexFromRowLabels (I) {
-	iam (TableOfReal);
+long *TableOfReal_getSortedIndexFromRowLabels (TableOfReal me) {
 	try {
 		autoNUMvector<long> index (1, my numberOfRows);
 		NUMindexx_s (my rowLabels, my numberOfRows, index.peek());
 		return index.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no sorted index created.");
+		Melder_throw (me, U": no sorted index created.");
 	}
 }
 
-TableOfReal TableOfReal_sortOnlyByRowLabels (I) {
-	iam (TableOfReal);
+TableOfReal TableOfReal_sortOnlyByRowLabels (TableOfReal me) {
 	try {
 		autoPermutation index = TableOfReal_to_Permutation_sortRowLabels (me);
 		autoTableOfReal thee = TableOfReal_and_Permutation_permuteRows (me, index.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not sorted by row labels.");
+		Melder_throw (me, U": not sorted by row labels.");
 	}
 }
 
@@ -1456,18 +1392,17 @@ static void NUMstatsColumns (double **a, long rb, long re, long cb, long ce, int
 	}
 }
 
-TableOfReal TableOfReal_meansByRowLabels (I, int expand, int stats) {
-	iam (TableOfReal);
+TableOfReal TableOfReal_meansByRowLabels (TableOfReal me, int expand, int stats) {
 	try {
-		autoTableOfReal thee = 0;
+		autoTableOfReal thee;
 		autoNUMvector<long> index (TableOfReal_getSortedIndexFromRowLabels (me), 1);
 		autoTableOfReal sorted = TableOfReal_sortRowsByIndex (me, index.peek(), 0);
 
 		long indexi = 1, indexr = 0;
-		wchar_t const *label = sorted -> rowLabels[1];
+		const char32 *label = sorted -> rowLabels[1];
 		for (long i = 2; i <= my numberOfRows; i++) {
-			wchar_t const *li = sorted -> rowLabels[i];
-			if (Melder_wcscmp (li, label) != 0) {
+			const char32 *li = sorted -> rowLabels[i];
+			if (Melder_cmp (li, label) != 0) {
 				NUMstatsColumns (sorted -> data, indexi, i - 1, 1, my numberOfColumns, stats);
 
 				if (expand == 0) {
@@ -1483,7 +1418,7 @@ TableOfReal TableOfReal_meansByRowLabels (I, int expand, int stats) {
 		if (expand != 0) {
 			// Now invert the table.
 
-			wchar_t **tmp = sorted -> rowLabels; sorted -> rowLabels = my rowLabels;
+			char32 **tmp = sorted -> rowLabels; sorted -> rowLabels = my rowLabels;
 			thee.reset (TableOfReal_sortRowsByIndex (sorted.peek(), index.peek(), 1));
 			sorted -> rowLabels = tmp;
 		} else {
@@ -1497,23 +1432,21 @@ TableOfReal TableOfReal_meansByRowLabels (I, int expand, int stats) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": means by row labels not created.");
+		Melder_throw (me, U": means by row labels not created.");
 	}
 }
 
-TableOfReal TableOfReal_rankColumns (I) {
-	iam (TableOfReal);
+TableOfReal TableOfReal_rankColumns (TableOfReal me) {
 	try {
 		autoTableOfReal thee = Data_copy (me);
 		NUMrankColumns (thy data, 1, thy numberOfRows, 1, thy numberOfColumns);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": column ranks not created.");
+		Melder_throw (me, U": column ranks not created.");
 	}
 }
 
-void TableOfReal_setSequentialColumnLabels (I, long from, long to, const wchar_t *precursor, long number, long increment) {
-	iam (TableOfReal);
+void TableOfReal_setSequentialColumnLabels (TableOfReal me, long from, long to, const char32 *precursor, long number, long increment) {
 	if (from == 0) {
 		from = 1;
 	}
@@ -1521,13 +1454,12 @@ void TableOfReal_setSequentialColumnLabels (I, long from, long to, const wchar_t
 		to = my numberOfColumns;
 	}
 	if (from < 1 || from > my numberOfColumns || to < from || to > my numberOfColumns) {
-		Melder_throw ("Wrong column indices.");
+		Melder_throw (U"Wrong column indices.");
 	}
 	NUMstrings_setSequentialNumbering (my columnLabels, from, to, precursor, number, increment, (int) 0);
 }
 
-void TableOfReal_setSequentialRowLabels (I, long from, long to, const wchar_t *precursor, long number, long increment) {
-	iam (TableOfReal);
+void TableOfReal_setSequentialRowLabels (TableOfReal me, long from, long to, const char32 *precursor, long number, long increment) {
 	if (from == 0) {
 		from = 1;
 	}
@@ -1535,102 +1467,99 @@ void TableOfReal_setSequentialRowLabels (I, long from, long to, const wchar_t *p
 		to = my numberOfRows;
 	}
 	if (from < 1 || from > my numberOfRows || to < from || to > my numberOfRows) {
-		Melder_throw ("Wrong row indices.");
+		Melder_throw (U"Wrong row indices.");
 	}
 	NUMstrings_setSequentialNumbering (my rowLabels, from, to, precursor, number, increment, (int) 0);
 }
 
 /* For the inheritors */
-TableOfReal TableOfReal_to_TableOfReal (I) {
-	iam (TableOfReal);
+TableOfReal TableOfReal_to_TableOfReal (TableOfReal me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my numberOfRows, my numberOfColumns);
 		NUMmatrix_copyElements (my data, thy data, 1, my numberOfRows, 1, my numberOfColumns);
 		TableOfReal_copyLabels (me, thee.peek(), 1, 1);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not copied.");
+		Melder_throw (me, U": not copied.");
 	}
 }
 
-TableOfReal TableOfReal_choleskyDecomposition (I, int upper, int inverse) {
-	iam (TableOfReal);
+TableOfReal TableOfReal_choleskyDecomposition (TableOfReal me, int upper, int inverse) {
 	try {
 		char diag = 'N';
 		long n = my numberOfColumns, lda = my numberOfRows, info;
 
 		if (n != lda) {
-			Melder_throw ("The table must be a square symmetric table.");
+			Melder_throw (U"The table must be a square symmetric table.");
 		}
 		autoTableOfReal thee = Data_copy (me);
 
 		if (upper) {
 			for (long i = 2; i <= n; i++) for (long j = 1; j < i; j++) {
-					thy data[i][j] = 0;
+					thy data[i][j] = 0.0;
 				}
 		} else {
 			for (long i = 1; i < n; i++) for (long j = i + 1; j <= n; j++) {
-					thy data[i][j] = 0;
+					thy data[i][j] = 0.0;
 				}
 		}
 		char uplo = upper ? 'L' : 'U';
 		NUMlapack_dpotf2 (&uplo, &n, &thy data[1][1], &lda, &info);
 		if (info != 0) {
-			Melder_throw ("dpotf2 fails");
+			Melder_throw (U"dpotf2 fails");
 		}
 
 		if (inverse) {
 			NUMlapack_dtrtri (&uplo, &diag, &n, &thy data[1][1], &lda, &info);
 			if (info != 0) {
-				Melder_throw ("dtrtri fails");
+				Melder_throw (U"dtrtri fails");
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": Cholesky decomposition not performed.");
+		Melder_throw (me, U": Cholesky decomposition not performed.");
 	}
 }
 
-TableOfReal TableOfReal_appendColumns (I, thou) {
+TableOfReal TableOfReal_appendColumns (TableOfReal me, TableOfReal thee) {
 	try {
-		iam (TableOfReal); thouart (TableOfReal);
 		long ncols = my numberOfColumns + thy numberOfColumns;
 		long labeldiffs = 0;
 
 		if (my numberOfRows != thy numberOfRows) {
-			Melder_throw ("Number of rows must be equal.");
+			Melder_throw (U"Number of rows must be equal.");
 		}
 		/* Stricter label checking???
 			append only if
 			(my rowLabels[i] == thy rowlabels[i], i=1..my numberOfRows) or
 			(my rowLabels[i] == 'empty', i=1..my numberOfRows)  or
 			(thy rowLabels[i] == 'empty', i=1..my numberOfRows);
-			'empty':  NULL or \w*
+			'empty':  nullptr or \w*
 		*/
 		autoTableOfReal him = TableOfReal_create (my numberOfRows, ncols);
 		NUMstrings_copyElements (my rowLabels, his rowLabels, 1, my numberOfRows);
 		NUMstrings_copyElements (my columnLabels, his columnLabels,  1, my numberOfColumns);
 		NUMstrings_copyElements (thy columnLabels, &his columnLabels[my numberOfColumns], 1, thy numberOfColumns);
 		for (long i = 1; i <= my numberOfRows; i++) {
-			if (Melder_wcscmp (my rowLabels[i], thy rowLabels[i]) != 0) {
+			if (Melder_cmp (my rowLabels[i], thy rowLabels[i]) != 0) {
 				labeldiffs++;
 			}
 			NUMvector_copyElements (my data[i], his data[i], 1, my numberOfColumns);
 			NUMvector_copyElements (thy data[i], &his data[i][my numberOfColumns], 1, thy numberOfColumns);
 		}
 		if (labeldiffs > 0) {
-			Melder_warning (Melder_integer (labeldiffs), L" row labels differed.");
+			Melder_warning (labeldiffs, U" row labels differed.");
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal with appended columns not created.");
+		Melder_throw (U"TableOfReal with appended columns not created.");
 	}
 }
 
 TableOfReal TableOfReal_appendColumnsMany (Collection me) {
 	try {
 		if (my size == 0) {
-			Melder_throw ("No tables selected.");
+			Melder_throw (U"No tables selected.");
 		}
 		TableOfReal thee = (TableOfReal) my item [1];
 		long nrow = thy numberOfRows;
@@ -1639,11 +1568,10 @@ TableOfReal TableOfReal_appendColumnsMany (Collection me) {
 			thee = (TableOfReal) my item [itab];
 			ncol += thy numberOfColumns;
 			if (thy numberOfRows != nrow) {
-				Melder_throw ("Numbers of rows in item ", itab, " differs from previous.");
+				Melder_throw (U"Numbers of rows in item ", itab, U" differs from previous.");
 			}
 		}
-		autoTableOfReal him = Thing_new (TableOfReal);
-		TableOfReal_init (him.peek(), nrow, ncol);
+		autoTableOfReal him = TableOfReal_create (nrow, ncol);
 		/* Unsafe: new attributes not initialized. */
 		for (long irow = 1; irow <= nrow; irow++) {
 			TableOfReal_setRowLabel (him.peek(), irow, thy rowLabels [irow]);
@@ -1662,12 +1590,11 @@ TableOfReal TableOfReal_appendColumnsMany (Collection me) {
 		Melder_assert (ncol == his numberOfColumns);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal with appended columns not created.");
+		Melder_throw (U"TableOfReal with appended columns not created.");
 	}
 }
 
-double TableOfReal_normalityTest_BHEP (I, double *h, double *tnb, double *lnmu, double *lnvar) {
-	iam (TableOfReal);
+double TableOfReal_normalityTest_BHEP (TableOfReal me, double *h, double *tnb, double *lnmu, double *lnvar) {
 	try {
 		long n = my numberOfRows, p = my numberOfColumns;
 		double beta = *h > 0 ? NUMsqrt1_2 / *h : NUMsqrt1_2 * pow ( (1.0 + 2 * p) / 4, 1.0 / (p + 4)) * pow (n, 1.0 / (p + 4));
@@ -1694,8 +1621,8 @@ double TableOfReal_normalityTest_BHEP (I, double *h, double *tnb, double *lnmu,
 			*tnb = 4 * n;
 		}
 		{
-			double djk, djj, sumjk = 0, sumj = 0;
-			double b1 = beta2 / 2, b2 = b1 / (1.0 + beta2);
+			double djk, djj, sumjk = 0.0, sumj = 0.0;
+			double b1 = beta2 / 2.0, b2 = b1 / (1.0 + beta2);
 			/* Heinze & Wagner (1997), page 3
 				We use d[j][k] = ||Y[j]-Y[k]||^2 = (Y[j]-Y[k])'S^(-1)(Y[j]-Y[k])
 				So d[j][k]= d[k][j] and d[j][j] = 0
@@ -1703,7 +1630,7 @@ double TableOfReal_normalityTest_BHEP (I, double *h, double *tnb, double *lnmu,
 			for (long j = 1; j <= n; j++) {
 				for (long k = 1; k < j; k++) {
 					djk = NUMmahalanobisDistance_chi (thy lowerCholesky, my data[j], my data[k], p, p);
-					sumjk += 2 * exp (-b1 * djk); // factor 2 because d[j][k] == d[k][j]
+					sumjk += 2.0 * exp (-b1 * djk); // factor 2 because d[j][k] == d[k][j]
 				}
 				sumjk += 1; // for k == j
 				djj = NUMmahalanobisDistance_chi (thy lowerCholesky, my data[j], thy centroid, p, p);
@@ -1711,31 +1638,29 @@ double TableOfReal_normalityTest_BHEP (I, double *h, double *tnb, double *lnmu,
 			}
 			*tnb = (1.0 / n) * sumjk - 2.0 * pow (1.0 + beta2, - p2) * sumj + n * pow (gamma, - p2); // n *
 		}
-		double mu = 1.0 - pow (gamma, -p2) * (1.0 + p * beta2 / gamma + p * (p + 2) * beta4 / (2 * gamma2));
+		double mu = 1.0 - pow (gamma, -p2) * (1.0 + p * beta2 / gamma + p * (p + 2) * beta4 / (2.0 * gamma2));
 		double var = 2.0 * pow (1 + 4 * beta2, -p2)
-		             + 2.0 * pow (gamma,  -p) * (1.0 + 2 * p * beta4 / gamma2  + 3 * p * (p + 2) * beta8 / (4 * gamma4))
-		             - 4.0 * pow (delta, -p2) * (1.0 + 3 * p * beta4 / (2 * delta) + p * (p + 2) * beta8 / (2 * delta2));
+		             + 2.0 * pow (gamma,  -p) * (1.0 + 2 * p * beta4 / gamma2  + 3 * p * (p + 2) * beta8 / (4.0 * gamma4))
+		             - 4.0 * pow (delta, -p2) * (1.0 + 3 * p * beta4 / (2 * delta) + p * (p + 2) * beta8 / (2.0 * delta2));
 		double mu2 = mu * mu;
 		*lnmu = 0.5 * log (mu2 * mu2 / (mu2 + var)); //log (sqrt (mu2 * mu2 /(mu2 + var)));
 		*lnvar = sqrt (log ( (mu2 + var) / mu2));
 		prob = NUMlogNormalQ (*tnb, *lnmu, *lnvar);
 		return prob;
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot determine normality.");
+		Melder_throw (me, U": cannot determine normality.");
 	}
 }
 
-TableOfReal TableOfReal_and_TableOfReal_crossCorrelations (I, thou, int by_columns, int center, int normalize) {
-	iam (TableOfReal); thouart (TableOfReal);
+TableOfReal TableOfReal_and_TableOfReal_crossCorrelations (TableOfReal me, TableOfReal thee, int by_columns, int center, int normalize) {
 	return by_columns ? TableOfReal_and_TableOfReal_columnCorrelations (me, thee, center, normalize) :
 	       TableOfReal_and_TableOfReal_rowCorrelations (me, thee, center, normalize);
 }
 
-TableOfReal TableOfReal_and_TableOfReal_rowCorrelations (I, thou, int center, int normalize) {
+TableOfReal TableOfReal_and_TableOfReal_rowCorrelations (TableOfReal me, TableOfReal thee, int center, int normalize) {
 	try {
-		iam (TableOfReal); thouart (TableOfReal);
 		if (my numberOfColumns != thy numberOfColumns) {
-			Melder_throw (L"Both tables must have the same number of columns.");
+			Melder_throw (U"Both tables must have the same number of columns.");
 		}
 
 		autoTableOfReal him = TableOfReal_create (my numberOfRows, thy numberOfRows);
@@ -1762,23 +1687,22 @@ TableOfReal TableOfReal_and_TableOfReal_rowCorrelations (I, thou, int center, in
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal with row correlations not created.");
+		Melder_throw (U"TableOfReal with row correlations not created.");
 	}
 }
 
-TableOfReal TableOfReal_and_TableOfReal_columnCorrelations (I, thou, int center, int normalize) {
+TableOfReal TableOfReal_and_TableOfReal_columnCorrelations (TableOfReal me, TableOfReal thee, int center, int normalize) {
 	try {
-		iam (TableOfReal); thouart (TableOfReal);
 		if (my numberOfRows != thy numberOfRows) {
-			Melder_throw (L"Both tables must have the same number of rows.");
+			Melder_throw (U"Both tables must have the same number of rows.");
 		}
 
 		autoTableOfReal him = TableOfReal_create (my numberOfColumns, thy numberOfColumns);
 		autoNUMmatrix<double> my_data (NUMmatrix_copy (my data, 1, my numberOfRows, 1, my numberOfColumns), 1, 1);
 		autoNUMmatrix<double> thy_data (NUMmatrix_copy (thy data, 1, thy numberOfRows, 1, thy numberOfColumns), 1, 1);
 		if (center) {
-			NUMcentreColumns (my_data.peek(), 1, my numberOfRows, 1, my numberOfColumns, NULL);
-			NUMcentreColumns (thy_data.peek(), 1, thy numberOfRows, 1, thy numberOfColumns, NULL);
+			NUMcentreColumns (my_data.peek(), 1, my numberOfRows, 1, my numberOfColumns, nullptr);
+			NUMcentreColumns (thy_data.peek(), 1, thy numberOfRows, 1, thy numberOfColumns, nullptr);
 		}
 		if (normalize) {
 			NUMnormalizeColumns (my_data.peek(), my numberOfRows, my numberOfColumns, 1);
@@ -1789,7 +1713,7 @@ TableOfReal TableOfReal_and_TableOfReal_columnCorrelations (I, thou, int center,
 
 		for (long j = 1; j <= my numberOfColumns; j++) {
 			for (long k = 1; k <= thy numberOfColumns; k++) {
-				double ctmp = 0;
+				double ctmp = 0.0;
 				for (long i = 1; i <= my numberOfRows; i++) {
 					ctmp += my_data[i][j] * thy_data[i][k];
 				}
@@ -1798,7 +1722,7 @@ TableOfReal TableOfReal_and_TableOfReal_columnCorrelations (I, thou, int center,
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal with column correlations not created.");
+		Melder_throw (U"TableOfReal with column correlations not created.");
 	}
 }
 
diff --git a/dwtools/TableOfReal_extensions.h b/dwtools/TableOfReal_extensions.h
index 332f1e5..1216e03 100644
--- a/dwtools/TableOfReal_extensions.h
+++ b/dwtools/TableOfReal_extensions.h
@@ -31,75 +31,75 @@
 #include "Strings_.h"
 #include "SSCP.h"
 
-int TableOfReal_to_Pattern_and_Categories(I, long fromrow, long torow, long fromcol, long tocol,
+int TableOfReal_to_Pattern_and_Categories(TableOfReal me, long fromrow, long torow, long fromcol, long tocol,
 	Pattern *p, Categories *c);
 
-TableOfReal TableOfReal_transpose (I);
+TableOfReal TableOfReal_transpose (TableOfReal me);
 
-Strings TableOfReal_extractRowLabels (I);
+Strings TableOfReal_extractRowLabels (TableOfReal me);
 
-Strings TableOfReal_extractColumnLabels (I);
+Strings TableOfReal_extractColumnLabels (TableOfReal me);
 
-void TableOfReal_and_Categories_setRowLabels (I, Categories thee);
+void TableOfReal_and_Categories_setRowLabels (TableOfReal me, Categories thee);
 /* !!! Set rowlabels from categories
   Because we need a Table-object with string-columns.
 */
 
-TableOfReal TableOfReal_sortOnlyByRowLabels (I);
+TableOfReal TableOfReal_sortOnlyByRowLabels (TableOfReal me);
 
-long *TableOfReal_getSortedIndexFromRowLabels (I);
+long *TableOfReal_getSortedIndexFromRowLabels (TableOfReal me);
 
-TableOfReal TableOfReal_sortRowsByIndex (I, long *index, int reverse);
+TableOfReal TableOfReal_sortRowsByIndex (TableOfReal me, long *index, int reverse);
 /*
 	thy data[reverse ? i : index[i]][j] = my data[reverse ? index[i] : i]
 */
 
 TableOfReal TableOfReal_createIrisDataset ();
-int TableOfReal_areAllCellsDefined (I, long rb, long re, long cb, long ce);
+int TableOfReal_areAllCellsDefined (TableOfReal me, long rb, long re, long cb, long ce);
 TableOfReal TableOfReal_createFromPolsData_50males (int include_levels);
 TableOfReal TableOfReal_createFromVanNieropData_25females (int include_levels);
 TableOfReal TableOfReal_createFromWeeninkData (int option); /* M W C */
 
-void TableOfReal_getColumnExtrema (I, long col, double *min, double *max);
+void TableOfReal_getColumnExtrema (TableOfReal me, long col, double *min, double *max);
 long TableOfReal_getColumnIndexAtMaximumInRow (TableOfReal me, long rowNumber);
-const wchar_t *TableOfReal_getColumnLabelAtMaximumInRow (TableOfReal me, long rowNumber);
+const char32 *TableOfReal_getColumnLabelAtMaximumInRow (TableOfReal me, long rowNumber);
 
-void TableOfReal_drawRowsAsHistogram (I, Graphics g, const wchar_t *rows, long colb, long cole,
+void TableOfReal_drawRowsAsHistogram (TableOfReal me, Graphics g, const char32 *rows, long colb, long cole,
 	double ymin, double ymax, double xoffsetFraction, double interbarFraction,
-	double interbarsFraction, const wchar_t *greys, int garnish);
+	double interbarsFraction, const char32 *greys, int garnish);
 
-void TableOfReal_drawScatterPlot (I, Graphics g, long icx, long icy, long rowb,
+void TableOfReal_drawScatterPlot (TableOfReal me, Graphics g, long icx, long icy, long rowb,
 	long rowe, double xmin, double xmax, double ymin, double ymax,
-	int labelSize, int useRowLabels, const wchar_t *label, int garnish);
+	int labelSize, int useRowLabels, const char32 *label, int garnish);
 
 void TableOfReal_drawAsSquares_area (TableOfReal me, Graphics g, double zmin, double zmax, double cellSizeFactor, int randomFillOrder, int garnish);
 
-void TableOfReal_drawScatterPlotMatrix (I, Graphics g, long colb, long cole, double fractionWhite);
+void TableOfReal_drawScatterPlotMatrix (TableOfReal me, Graphics g, long colb, long cole, double fractionWhite);
 
-void TableOfReal_drawBoxPlots (I, Graphics g, long rowmin, long rowmax, long colmin, long colmax,
+void TableOfReal_drawBoxPlots (TableOfReal me, Graphics g, long rowmin, long rowmax, long colmin, long colmax,
 	double ymin, double ymax, int garnish);
 
-void TableOfReal_drawVectors (I, Graphics g, long colx1, long coly1,
+void TableOfReal_drawVectors (TableOfReal me, Graphics g, long colx1, long coly1,
 	long colx2, long coly2, double xmin, double xmax,
 	double ymin, double ymax, int vectype, int labelsize, int garnish);
 
-void TableOfReal_drawBiplot (I, Graphics g, double xmin, double xmax,
+void TableOfReal_drawBiplot (TableOfReal me, Graphics g, double xmin, double xmax,
 	double ymin, double ymax, double sv_splitfactor, int labelsize,
 	int garnish);
 
-void TableOfReal_drawColumnAsDistribution (I, Graphics g, int column, double minimum, double maximum, long nBins,
+void TableOfReal_drawColumnAsDistribution (TableOfReal me, Graphics g, int column, double minimum, double maximum, long nBins,
 	double freqMin, double freqMax, int cumulative, int garnish);
 
-long TableOfReal_getNumberOfLabelMatches (I, const wchar_t *search, int columnLabels,
+long TableOfReal_getNumberOfLabelMatches (TableOfReal me, const char32 *search, int columnLabels,
 	int use_regexp);
 /*
 	Find number of labels that match search description.
 */
 
-int TableOfReal_equalLabels (I, thou, int rowLabels, int columnLabels);
+int TableOfReal_equalLabels (TableOfReal me, TableOfReal thee, int rowLabels, int columnLabels);
 /* return 1 when labels are equal else 0 */
 
-void TableOfReal_copyLabels (I, thou, int rowOrigin, int columnOrigin);
+void TableOfReal_copyLabels (TableOfReal me, TableOfReal thee, int rowOrigin, int columnOrigin);
 /*
 	rowOrigin ==  1 copy from row
 	rowOrigin ==  0 do nothing
@@ -110,20 +110,20 @@ void TableOfReal_copyLabels (I, thou, int rowOrigin, int columnOrigin);
 	columnOrigin == -1 copy from row
 */
 
-void TableOfReal_labelsFromCollectionItemNames (I, thou, int row, int column);
+void TableOfReal_labelsFromCollectionItemNames (TableOfReal me, Collection thee, int row, int column);
 
-void TableOfReal_setSequentialColumnLabels (I, long from, long to,
-	const wchar_t *precursor, long number, long increment);
-void TableOfReal_setSequentialRowLabels (I, long from, long to,
-	const wchar_t *precursor, long number, long increment);
+void TableOfReal_setSequentialColumnLabels (TableOfReal me, long from, long to,
+	const char32 *precursor, long number, long increment);
+void TableOfReal_setSequentialRowLabels (TableOfReal me, long from, long to,
+	const char32 *precursor, long number, long increment);
 
-int TableOfReal_hasRowLabels (I);
-int TableOfReal_hasColumnLabels (I);
+int TableOfReal_hasRowLabels (TableOfReal me);
+int TableOfReal_hasColumnLabels (TableOfReal me);
 
-void TableOfReal_changeRowLabels (I, const wchar_t *search, const wchar_t *replace,
+void TableOfReal_changeRowLabels (TableOfReal me, const char32 *search, const char32 *replace,
 	int maximumNumberOfReplaces, long *nmatches, long *nstringmatches,
 	int use_regexp);
-void TableOfReal_changeColumnLabels (I, const wchar_t *search, const wchar_t *replace,
+void TableOfReal_changeColumnLabels (TableOfReal me, const char32 *search, const char32 *replace,
 	int maximumNumberOfReplaces, long *nmatches, long *nstringmatches,
 	int use_regexp);
 /*
@@ -137,36 +137,36 @@ void TableOfReal_changeColumnLabels (I, const wchar_t *search, const wchar_t *re
 	'nstringmatches'.
 */
 
-void TableOfReal_centreColumns (I);
-void TableOfReal_centreColumns_byRowLabel (I);
+void TableOfReal_centreColumns (TableOfReal me);
+void TableOfReal_centreColumns_byRowLabel (TableOfReal me);
 /* PRECONDITION: Table must be sorted by row labels !! */
 
-double TableOfReal_getColumnQuantile (I, long col, double quantile);
+double TableOfReal_getColumnQuantile (TableOfReal me, long col, double quantile);
 
-double TableOfReal_getRowSumByLabel (I, const wchar_t *label);
-double TableOfReal_getRowSum (I, long index);
-double TableOfReal_getColumnSumByLabel (I, const wchar_t *label);
-double TableOfReal_getColumnSum (I, long index);
-double TableOfReal_getGrandSum (I);
+double TableOfReal_getRowSumByLabel (TableOfReal me, const char32 *label);
+double TableOfReal_getRowSum (TableOfReal me, long index);
+double TableOfReal_getColumnSumByLabel (TableOfReal me, const char32 *label);
+double TableOfReal_getColumnSum (TableOfReal me, long index);
+double TableOfReal_getGrandSum (TableOfReal me);
 
-void TableOfReal_centreRows (I);
+void TableOfReal_centreRows (TableOfReal me);
 
-void TableOfReal_doubleCentre (I);
+void TableOfReal_doubleCentre (TableOfReal me);
 
-int TableOfReal_checkPositive (I);
+int TableOfReal_checkPositive (TableOfReal me);
 
-double TableOfReal_getTableNorm (I);
+double TableOfReal_getTableNorm (TableOfReal me);
 
-void TableOfReal_normalizeTable (I, double norm);
-void TableOfReal_normalizeColumns (I, double norm);
-void TableOfReal_normalizeRows (I, double norm);
+void TableOfReal_normalizeTable (TableOfReal me, double norm);
+void TableOfReal_normalizeColumns (TableOfReal me, double norm);
+void TableOfReal_normalizeRows (TableOfReal me, double norm);
 
-void TableOfReal_standardizeColumns (I);
-void TableOfReal_standardizeRows (I);
+void TableOfReal_standardizeColumns (TableOfReal me);
+void TableOfReal_standardizeRows (TableOfReal me);
 
-TableOfReal TableOfReal_rankColumns (I);
+TableOfReal TableOfReal_rankColumns (TableOfReal me);
 
-TableOfReal TableOfReal_meansByRowLabels (I, int expand, int stats);
+TableOfReal TableOfReal_meansByRowLabels (TableOfReal me, int expand, int stats);
 /*
 	stats == 0? averages : medians
 	For a table with n rows and m different labels (m <= n):
@@ -181,30 +181,30 @@ TableOfReal TableOfReal_randomizeRows (TableOfReal me);
 /* Produce new table with randomized rows */
 
 /* For the inheritors */
-TableOfReal TableOfReal_to_TableOfReal (I);
+TableOfReal TableOfReal_to_TableOfReal (TableOfReal me);
 
-TableOfReal TableOfReal_choleskyDecomposition (I, int upper, int inverse);
+TableOfReal TableOfReal_choleskyDecomposition (TableOfReal me, int upper, int inverse);
 
-TableOfReal TableOfReal_appendColumns (I, thou);
+TableOfReal TableOfReal_appendColumns (TableOfReal me, TableOfReal thee);
 TableOfReal TableOfReal_appendColumnsMany (Collection me);
 
-void TableOfReal_copyOneRowWithLabel (I, thou, long myrow, long thyrow);
+void TableOfReal_copyOneRowWithLabel (TableOfReal me, TableOfReal thee, long myrow, long thyrow);
 
-double TableOfReal_normalityTest_BHEP (I, double *beta, double *tnb, double *lnmu, double *lnvar);
+double TableOfReal_normalityTest_BHEP (TableOfReal me, double *beta, double *tnb, double *lnmu, double *lnvar);
 
-TableOfReal TableOfReal_and_TableOfReal_crossCorrelations (I, thou, int by_columns, int center, int normalize);
+TableOfReal TableOfReal_and_TableOfReal_crossCorrelations (TableOfReal me, TableOfReal thee, int by_columns, int center, int normalize);
 
 /********************* class TablesOfReal ******************************/
 
 Thing_define (TablesOfReal, Ordered) {
 };
 
-void TablesOfReal_init (I, ClassInfo klas);
+void TablesOfReal_init (TablesOfReal me, ClassInfo klas);
 
 TablesOfReal TablesOfReal_create ();
 
-TableOfReal TablesOfReal_sum (I);
+TableOfReal TablesOfReal_sum (TablesOfReal me);
 
-int TablesOfReal_checkDimensions (I);
+int TablesOfReal_checkDimensions (TablesOfReal me);
 
 #endif /* _TableOfReal_extensions_h_ */
diff --git a/dwtools/Table_extensions.cpp b/dwtools/Table_extensions.cpp
index a9f2a77..5dd57da 100644
--- a/dwtools/Table_extensions.cpp
+++ b/dwtools/Table_extensions.cpp
@@ -1,6 +1,6 @@
 /* Table_extensions.cpp
 	 *
- * Copyright (C) 1997-2014 David Weenink
+ * Copyright (C) 1997-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -53,7 +53,7 @@ static bool Table_selectedColumnPartIsNumeric (Table me, long column, long *sele
 
 // column and selectedRows are valid; *min & *max must be intialized
 static void Table_columnExtremesFromSelectedRows (Table me, long column, long *selectedRows, long numberOfSelectedRows, double *min, double *max) {
-	double cmin = 1e38, cmax = - cmin;
+	double cmin = 1e308, cmax = - cmin;
 	for (long irow = 1; irow <= numberOfSelectedRows; irow++) {
 		double val = Table_getNumericValue_Assert (me, selectedRows[irow], column);
 		if (val < cmin) { cmin = val; }
@@ -91,19 +91,19 @@ are type 1 (men), type 2 (women) and type 3 (children)."
 
 Table Table_createFromPetersonBarneyData () {
 	long nrows = 1520, ncols = 9;
-	const wchar_t *columnLabels[9] =
-	{L"Type", L"Sex", L"Speaker", L"Vowel", L"IPA", L"F0", L"F1", L"F2", L"F3"};
-	const wchar_t *type[3] = {L"m", L"w", L"c"};
+	const char32 *columnLabels[9] =
+	{U"Type", U"Sex", U"Speaker", U"Vowel", U"IPA", U"F0", U"F1", U"F2", U"F3"};
+	const char32 *type[3] = {U"m", U"w", U"c"};
 	// Wrong order before 20080125
-	//	wchar_t *vowel[10] = {L"iy", L"ih", L"eh", L"ae", L"aa", L"ao", L"uh", L"uw", L"ah", L"er"};
-	//	wchar_t *ipa[10] = {L"i", L"\\ic", L"\\ep", L"\\ae", L"\\as", L"\\ct", L"\\hs", L"u",
-	//		L"\\vt", L"\\er\\hr"};
-	const wchar_t *vowel[10] = {L"iy", L"ih", L"eh", L"ae", L"ah", L"aa", L"ao", L"uh", L"uw", L"er"};
+	//	char32 *vowel[10] = {U"iy", U"ih", U"eh", U"ae", U"aa", U"ao", U"uh", U"uw", U"ah", U"er"};
+	//	char32 *ipa[10] = {U"i", U"\\ic", U"\\ep", U"\\ae", U"\\as", U"\\ct", U"\\hs", U"u",
+	//		U"\\vt", U"\\er\\hr"};
+	const char32 *vowel[10] = {U"iy", U"ih", U"eh", U"ae", U"ah", U"aa", U"ao", U"uh", U"uw", U"er"};
 	// Watrous IPA symbols
-	//	wchar_t *ipa[10] = {L"i", L"\\ic", L"e", L"\\ae", L"\\vt", L"\\as", L"o", L"\\hs", L"u", L"\\er"};
+	//	char32 *ipa[10] = {U"i", U"\\ic", U"e", U"\\ae", U"\\vt", U"\\as", U"o", U"\\hs", U"u", U"\\er"};
 	// P&B IPA symbols
-	const wchar_t *ipa[10] = {L"i", L"\\ic", L"\\ef", L"\\ae", L"\\vt", L"\\as", L"\\ct", L"\\hs", L"u", L"\\er\\hr"};
-	const wchar_t *sex[2] = {L"m", L"f"};
+	const char32 *ipa[10] = {U"i", U"\\ic", U"\\ef", U"\\ae", U"\\vt", U"\\as", U"\\ct", U"\\hs", U"u", U"\\er\\hr"};
+	const char32 *sex[2] = {U"m", U"f"};
 	struct pbdatum {
 		short star; /* was there a * in front of the vowel-type? */
 		short f[4];	/* f0, f1, f2, f3 */
@@ -1652,34 +1652,34 @@ Table Table_createFromPetersonBarneyData () {
 				}
 			}
 
-			row -> cells [1]. string = Melder_wcsdup_f (type [speaker_type]);
-			row -> cells [2]. string = Melder_wcsdup_f (sex [speaker_sex]);
-			row -> cells [3]. string = Melder_wcsdup_f (Melder_integer (speaker_id));
-			row -> cells [4]. string = Melder_wcsdup_f (vowel [vowel_id - 1]);
-			row -> cells [5]. string = Melder_wcsdup_f (ipa [vowel_id - 1]);
+			row -> cells [1]. string = Melder_dup_f (type [speaker_type]);
+			row -> cells [2]. string = Melder_dup_f (sex [speaker_sex]);
+			row -> cells [3]. string = Melder_dup_f (Melder_integer (speaker_id));
+			row -> cells [4]. string = Melder_dup_f (vowel [vowel_id - 1]);
+			row -> cells [5]. string = Melder_dup_f (ipa [vowel_id - 1]);
 			for (long j = 0; j <= 3; j++) {
-				row -> cells [j + 6].string = Melder_wcsdup_f (Melder_integer (pbdata[i - 1].f[j]));
+				row -> cells [j + 6].string = Melder_dup_f (Melder_integer (pbdata[i - 1].f[j]));
 			}
 		}
 		for (long j = 1; j <= ncols; j++) {
 			Table_setColumnLabel (me.peek(), j, columnLabels[j - 1]);
-			my columnHeaders [j]. numericized = FALSE;
+			my columnHeaders [j]. numericized = false;
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Table not created from Peterson & Barney data.");
+		Melder_throw (U"Table not created from Peterson & Barney data.");
 	}
 }
 
 Table Table_createFromPolsVanNieropData () {
 	long nrows = 900, ncols = 10;
-	const wchar_t *columnLabels[10] =
-	{L"Sex", L"Speaker", L"Vowel", L"IPA", L"F1", L"F2", L"F3", L"L1", L"L2", L"L3"};
-	const wchar_t *vowel[12] = {L"oe", L"aa", L"oo", L"a", L"eu", L"ie", L"uu", L"ee", L"u",
-	                            L"e", L"o", L"i"
+	const char32 *columnLabels[10] =
+	{U"Sex", U"Speaker", U"Vowel", U"IPA", U"F1", U"F2", U"F3", U"L1", U"L2", U"L3"};
+	const char32 *vowel[12] = {U"oe", U"aa", U"oo", U"a", U"eu", U"ie", U"uu", U"ee", U"u",
+	                            U"e", U"o", U"i"
 	                           };
-	const wchar_t *ipa[12] = {L"u", L"a", L"o", L"\\as", L"\\o/", L"i", L"y", L"e", L"\\yc", L"\\ep", L"\\ct", L"\\ic"};
-	const wchar_t *sex[2] = {L"m", L"f"};
+	const char32 *ipa[12] = {U"u", U"a", U"o", U"\\as", U"\\o/", U"i", U"y", U"e", U"\\yc", U"\\ep", U"\\ct", U"\\ic"};
+	const char32 *sex[2] = {U"m", U"f"};
 	struct polsdatum {
 		short f[3]; /* frequency F1, F2, F3 */
 		short l[3];	/* level f1, f2, f3 */
@@ -2671,13 +2671,13 @@ Table Table_createFromPolsVanNieropData () {
 			int speaker_id = (i - 1) / 12 + 1;  /* 1 - 75 */
 			int speaker_sex = speaker_id <= 50 ? 0 : 1;
 
-			row -> cells [1]. string = Melder_wcsdup_f (sex [speaker_sex]);
-			row -> cells [2]. string = Melder_wcsdup_f (Melder_integer (speaker_id));
-			row -> cells [3]. string = Melder_wcsdup_f (vowel [vowel_id - 1]);
-			row -> cells [4]. string = Melder_wcsdup_f (ipa [vowel_id - 1]);
+			row -> cells [1]. string = Melder_dup_f (sex [speaker_sex]);
+			row -> cells [2]. string = Melder_dup_f (Melder_integer (speaker_id));
+			row -> cells [3]. string = Melder_dup_f (vowel [vowel_id - 1]);
+			row -> cells [4]. string = Melder_dup_f (ipa [vowel_id - 1]);
 			for (long j = 0; j <= 2; j++) {
-				row -> cells [j + 5]. string = Melder_wcsdup_f (Melder_integer (polsdata[i - 1].f[j]));
-				row -> cells [j + 8]. string = Melder_wcsdup_f (Melder_integer (polsdata[i - 1].l[j]));
+				row -> cells [j + 5]. string = Melder_dup_f (Melder_integer (polsdata[i - 1].f[j]));
+				row -> cells [j + 8]. string = Melder_dup_f (Melder_integer (polsdata[i - 1].l[j]));
 			}
 		}
 		for (long j = 1; j <= ncols; j++) {
@@ -2686,21 +2686,21 @@ Table Table_createFromPolsVanNieropData () {
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Table not created from Pols & van Nierop data.");
+		Melder_throw (U"Table not created from Pols & van Nierop data.");
 	}
 }
 
 Table Table_createFromWeeninkData () {
 	long nrows = 360, ncols = 9;
-	const wchar_t *columnLabels[9] =
-	{L"Type", L"Sex", L"Speaker", L"Vowel", L"IPA", L"F0", L"F1", L"F2", L"F3"};
-	const wchar_t *type[3] = {L"m", L"w", L"c"};
+	const char32 *columnLabels[9] =
+	{U"Type", U"Sex", U"Speaker", U"Vowel", U"IPA", U"F0", U"F1", U"F2", U"F3"};
+	const char32 *type[3] = {U"m", U"w", U"c"};
 	/* Our order: "oe", "o", "oo", "a", "aa", "u", "eu", "uu", "ie", "i", "ee", "e"
 		to Pols & van Nierop order */
 	int order[13] = { 0, 1, 5, 3, 4, 7, 9, 8, 11, 6, 12, 2, 10};
-	const wchar_t *vowel[13] = {L"", L"oe", L"aa", L"oo", L"a", L"eu", L"ie", L"uu", L"ee", L"u", L"e", L"o", L"i"};
-	const wchar_t *ipa[13] = {L"", L"u", L"a", L"o", L"\\as", L"\\o/", L"i", L"y", L"e", L"\\yc", L"\\ep", L"\\ct", L"\\ic"};
-	const wchar_t *sex[2] = {L"m", L"f"};
+	const char32 *vowel[13] = {U"", U"oe", U"aa", U"oo", U"a", U"eu", U"ie", U"uu", U"ee", U"u", U"e", U"o", U"i"};
+	const char32 *ipa[13] = {U"", U"u", U"a", U"o", U"\\as", U"\\o/", U"i", U"y", U"e", U"\\yc", U"\\ep", U"\\ct", U"\\ic"};
+	const char32 *sex[2] = {U"m", U"f"};
 	struct weeninkdatum {
 		short f[4];	/* f0, f1, f2, f3 */
 	} weeninkdata [] = {
@@ -3114,14 +3114,14 @@ Table Table_createFromWeeninkData () {
 				//  Which children were m/f ?
 			}
 
-			row -> cells [1]. string = Melder_wcsdup_f (type [speaker_type]);
-			row -> cells [2]. string = Melder_wcsdup_f (sex [speaker_sex]);
-			row -> cells [3]. string = Melder_wcsdup_f (Melder_integer (speaker_id));
-			row -> cells [4]. string = Melder_wcsdup_f (vowel [vowel_id]);
-			row -> cells [5]. string = Melder_wcsdup_f (ipa [vowel_id]);
+			row -> cells [1]. string = Melder_dup_f (type [speaker_type]);
+			row -> cells [2]. string = Melder_dup_f (sex [speaker_sex]);
+			row -> cells [3]. string = Melder_dup_f (Melder_integer (speaker_id));
+			row -> cells [4]. string = Melder_dup_f (vowel [vowel_id]);
+			row -> cells [5]. string = Melder_dup_f (ipa [vowel_id]);
 
 			for (long j = 0; j <= 3; j++) {
-				row -> cells [j + 6]. string = Melder_wcsdup_f (Melder_integer (weeninkdata[index_in_data].f[j]));
+				row -> cells [j + 6]. string = Melder_dup_f (Melder_integer (weeninkdata[index_in_data].f[j]));
 			}
 		}
 		for (long j = 1; j <= ncols; j++) {
@@ -3130,33 +3130,33 @@ Table Table_createFromWeeninkData () {
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Table not created from Weenink data.");
+		Melder_throw (U"Table not created from Weenink data.");
 	}
 }
 
 // Keating&Esposito (2006), 
 Table Table_createFromEspositoData () {
 	try {
-		autoTable me = Table_createWithColumnNames (10, L"Language Modal Breathy");
-		Table_setStringValue (me.peek(), 1, 1, L"Chong");Table_setNumericValue (me.peek(), 1, 2, -1.5);Table_setNumericValue (me.peek(), 1, 3, 5);
-		Table_setStringValue (me.peek(), 2, 1, L"Fuzhou");Table_setNumericValue (me.peek(), 2, 2, -1.5);Table_setNumericValue (me.peek(), 2, 3, 5);
-		Table_setStringValue (me.peek(), 3, 1, L"Green Hmong");Table_setNumericValue (me.peek(), 3, 2, 3);Table_setNumericValue (me.peek(), 3, 3, 12);
-		Table_setStringValue (me.peek(), 4, 1, L"White Hmong");Table_setNumericValue (me.peek(), 4, 2, 2);Table_setNumericValue (me.peek(), 4, 3, 11);
-		Table_setStringValue (me.peek(), 5, 1, L"Mon");Table_setNumericValue (me.peek(), 5, 2, -1.5);Table_setNumericValue (me.peek(), 5, 3, 0);
-		Table_setStringValue (me.peek(), 6, 1, L"SADV Zapotec");Table_setNumericValue (me.peek(), 6, 2, -6);Table_setNumericValue (me.peek(), 6, 3, -4);
-		Table_setStringValue (me.peek(), 7, 1, L"SLQ Zapotec");Table_setNumericValue (me.peek(), 7, 2, 3.5);Table_setNumericValue (me.peek(), 7, 3, 14);
-		Table_setStringValue (me.peek(), 8, 1, L"Tlacolula Zapotec");Table_setNumericValue (me.peek(), 8, 2, 3);Table_setNumericValue (me.peek(), 8, 3, 13);
-		Table_setStringValue (me.peek(), 9, 1, L"Tamang");Table_setNumericValue (me.peek(), 9, 2, 1);Table_setNumericValue (me.peek(), 9, 3, 1);
-		Table_setStringValue (me.peek(), 10, 1, L"!Xoo");Table_setNumericValue (me.peek(), 10, 2, 1);Table_setNumericValue (me.peek(), 10, 3, 14);
+		autoTable me = Table_createWithColumnNames (10, U"Language Modal Breathy");
+		Table_setStringValue (me.peek(), 1, 1, U"Chong");Table_setNumericValue (me.peek(), 1, 2, -1.5);Table_setNumericValue (me.peek(), 1, 3, 5);
+		Table_setStringValue (me.peek(), 2, 1, U"Fuzhou");Table_setNumericValue (me.peek(), 2, 2, -1.5);Table_setNumericValue (me.peek(), 2, 3, 5);
+		Table_setStringValue (me.peek(), 3, 1, U"Green Hmong");Table_setNumericValue (me.peek(), 3, 2, 3);Table_setNumericValue (me.peek(), 3, 3, 12);
+		Table_setStringValue (me.peek(), 4, 1, U"White Hmong");Table_setNumericValue (me.peek(), 4, 2, 2);Table_setNumericValue (me.peek(), 4, 3, 11);
+		Table_setStringValue (me.peek(), 5, 1, U"Mon");Table_setNumericValue (me.peek(), 5, 2, -1.5);Table_setNumericValue (me.peek(), 5, 3, 0);
+		Table_setStringValue (me.peek(), 6, 1, U"SADV Zapotec");Table_setNumericValue (me.peek(), 6, 2, -6);Table_setNumericValue (me.peek(), 6, 3, -4);
+		Table_setStringValue (me.peek(), 7, 1, U"SLQ Zapotec");Table_setNumericValue (me.peek(), 7, 2, 3.5);Table_setNumericValue (me.peek(), 7, 3, 14);
+		Table_setStringValue (me.peek(), 8, 1, U"Tlacolula Zapotec");Table_setNumericValue (me.peek(), 8, 2, 3);Table_setNumericValue (me.peek(), 8, 3, 13);
+		Table_setStringValue (me.peek(), 9, 1, U"Tamang");Table_setNumericValue (me.peek(), 9, 2, 1);Table_setNumericValue (me.peek(), 9, 3, 1);
+		Table_setStringValue (me.peek(), 10, 1, U"!Xoo");Table_setNumericValue (me.peek(), 10, 2, 1);Table_setNumericValue (me.peek(), 10, 3, 14);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Keating-Esposito table not created.");
+		Melder_throw (U"Keating-Esposito table not created.");
 	}
 }
 
 Table Table_createFromGanongData () {
 	try {
-		autoTable me = Table_createWithColumnNames (6, L"VOT dash-tash dask-task");
+		autoTable me = Table_createWithColumnNames (6, U"VOT dash-tash dask-task");
 		Table_setNumericValue (me.peek(), 1, 1, -17.5);Table_setNumericValue (me.peek(), 1, 2, 0.98);Table_setNumericValue (me.peek(), 1, 3, 0.92);
 		Table_setNumericValue (me.peek(), 2, 1, -7.5);Table_setNumericValue (me.peek(), 2, 2, 0.95);Table_setNumericValue (me.peek(), 2, 3, 0.83);
 		Table_setNumericValue (me.peek(), 3, 1, -2.5);Table_setNumericValue (me.peek(), 3, 2, 0.71);Table_setNumericValue (me.peek(), 3, 3, 0.33);
@@ -3165,7 +3165,7 @@ Table Table_createFromGanongData () {
 		Table_setNumericValue (me.peek(), 6, 1, 17.5);Table_setNumericValue (me.peek(), 6, 2, 0.10);Table_setNumericValue (me.peek(), 6, 3, 0.02);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Ganong table not created.");
+		Melder_throw (U"Ganong table not created.");
 	}
 }
 
@@ -3190,7 +3190,7 @@ static bool intervalsIntersect (double x1, double x2, double xmin, double xmax,
 }
 
 void Table_horizontalErrorBarsPlotWhere (Table me, Graphics g, long xcolumn, long ycolumn, double xmin, double xmax, 
-	double ymin, double ymax, long xci_min, long xci_max, double bar_mm, int garnish, const wchar_t *formula, Interpreter interpreter) {
+	double ymin, double ymax, long xci_min, long xci_max, double bar_mm, int garnish, const char32 *formula, Interpreter interpreter) {
 	try {
 		long nrows = my rows -> size;
 		if (xcolumn < 1 || xcolumn > nrows || ycolumn < 1 || ycolumn > nrows ||
@@ -3249,16 +3249,16 @@ void Table_horizontalErrorBarsPlotWhere (Table me, Graphics g, long xcolumn, lon
 
 		if (garnish) {
 			Graphics_drawInnerBox (g);
-			Graphics_marksLeft (g, 2, 1, 1, 0);
-			Graphics_marksBottom (g, 2, 1, 1, 0);
+			Graphics_marksLeft (g, 2, true, true, false);
+			Graphics_marksBottom (g, 2, true, true, false);
 		}
 	} catch (MelderError) {
-		//
+		Melder_clearError ();
 	}
 }
 
 void Table_verticalErrorBarsPlotWhere (Table me, Graphics g, long xcolumn, long ycolumn, double xmin, double xmax, 
-	double ymin, double ymax, long yci_min, long yci_max, double bar_mm, int garnish, const wchar_t *formula, Interpreter interpreter) {
+	double ymin, double ymax, long yci_min, long yci_max, double bar_mm, int garnish, const char32 *formula, Interpreter interpreter) {
 	try {
 		long nrows = my rows -> size;
 		if (xcolumn < 1 || xcolumn > nrows || ycolumn < 1 || ycolumn > nrows ||
@@ -3270,7 +3270,7 @@ void Table_verticalErrorBarsPlotWhere (Table me, Graphics g, long xcolumn, long
 		if (xmin >= xmax) {
 			Table_columnExtremesFromSelectedRows (me, ycolumn, selectedRows.peek(), numberOfSelectedRows, &ymin, &ymax);
 			if (xmin >= xmax) {
-				xmin -= 1; xmax += 1;
+				xmin -= 1.0; xmax += 1.0;
 			}
 		}
 		double y1min, y1max;
@@ -3285,7 +3285,7 @@ void Table_verticalErrorBarsPlotWhere (Table me, Graphics g, long xcolumn, long
 				ymax += y1max;
 			}
 			if (ymin >= ymax) {
-				ymin -= 1; ymax += 1;
+				ymin -= 1.0; ymax += 1.0;
 			}
 		}
 		Graphics_setWindow (g, xmin, xmax, ymin, ymax);
@@ -3294,19 +3294,19 @@ void Table_verticalErrorBarsPlotWhere (Table me, Graphics g, long xcolumn, long
 		for (long row = 1; row <= numberOfSelectedRows; row++) {
 			double x  = Table_getNumericValue_Assert (me, selectedRows[row], xcolumn);
 			double y  = Table_getNumericValue_Assert (me, selectedRows[row], ycolumn);
-			double dy1 = yci_min > 0 ? Table_getNumericValue_Assert (me, selectedRows[row], yci_min) : 0;
-			double dy2 = yci_max > 0 ? Table_getNumericValue_Assert (me, selectedRows[row], yci_max) : 0;
+			double dy1 = yci_min > 0 ? Table_getNumericValue_Assert (me, selectedRows[row], yci_min) : 0.0;
+			double dy2 = yci_max > 0 ? Table_getNumericValue_Assert (me, selectedRows[row], yci_max) : 0.0;
 			double y1 = y - dy1, y2 = y + dy2, xc1, yc1, xc2, yc2;
 
 			if (x <= xmax && x >= xmin && y <= ymax && y >= ymin) {
 				// vertical confidence interval
 				if (intervalsIntersect (y1, y2, ymin, ymax, &yc1, &yc2)) {
 					Graphics_line (g, x, yc1, x, yc2);
-					if (dx > 0 && intervalsIntersect (x - dx / 2, x + dx / 2, xmin, xmax, &xc1, &xc2)) {
-						if (yc1 >= ymin && dy1 > 0) {
+					if (dx > 0 && intervalsIntersect (x - dx / 2.0, x + dx / 2.0, xmin, xmax, &xc1, &xc2)) {
+						if (yc1 >= ymin && dy1 > 0.0) {
 							Graphics_line (g, xc1, yc1, xc2, yc1);
 						}
-						if (yc2 <= ymax && dy2 > 0) {
+						if (yc2 <= ymax && dy2 > 0.0) {
 							Graphics_line (g, xc1, yc2, xc2, yc2);
 						}
 					}
@@ -3317,11 +3317,11 @@ void Table_verticalErrorBarsPlotWhere (Table me, Graphics g, long xcolumn, long
 
 		if (garnish) {
 			Graphics_drawInnerBox (g);
-			Graphics_marksLeft (g, 2, 1, 1, 0);
-			Graphics_marksBottom (g, 2, 1, 1, 0);
+			Graphics_marksLeft (g, 2, true, true, false);
+			Graphics_marksBottom (g, 2, true, true, false);
 		}
 	} catch (MelderError) {
-		//
+		Melder_clearError ();
 	}
 }
 
@@ -3337,24 +3337,24 @@ double Table_getMedianAbsoluteDeviation (Table me, long columnNumber)
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 			data[irow] = row -> cells[columnNumber].number;
 			if (data[irow] == NUMundefined) {
-				Melder_throw (me, ": the cell in row ", irow, " of column \"",
-					my columnHeaders[columnNumber].label ? my columnHeaders[columnNumber].label : Melder_integer (columnNumber), " is undefined.");
+				Melder_throw (me, U": the cell in row ", irow, U" of column \"",
+					my columnHeaders[columnNumber].label ? my columnHeaders[columnNumber].label : Melder_integer (columnNumber), U" is undefined.");
 			}
 		}
 		double mad, location;
-		NUMmad (data.peek(), my rows -> size, &location, 1, &mad, 0);
+		NUMmad (data.peek(), my rows -> size, &location, 1, &mad, nullptr);
 		return mad;
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot compute median absolute deviation of column ", columnNumber, ".");
+		Melder_throw (me, U": cannot compute median absolute deviation of column ", columnNumber, U".");
 	}
 
 Table Table_getOneWayKruskalWallis (Table me, long column, long factorColumn, double *degreesOfFreedom, double *kruskalWallis, double *probability) {
 	try {
 		if (column < 1 || column > my numberOfColumns) {
-			Melder_throw ("Invalid column number.");
+			Melder_throw (U"Invalid column number.");
 		}
 		if (factorColumn < 1 || factorColumn > my numberOfColumns || factorColumn == column) {
-			Melder_throw ("Invalid group column number.");
+			Melder_throw (U"Invalid group column number.");
 		}
 		long numberOfData = my rows -> size;
 		Table_numericize_Assert (me, column);
@@ -3362,7 +3362,7 @@ Table Table_getOneWayKruskalWallis (Table me, long column, long factorColumn, do
 		autoStringsIndex levels = Table_to_StringsIndex_column (me, factorColumn);
 		long numberOfLevels = levels -> classes -> size;
 		if (numberOfLevels < 2) {
-			Melder_throw ("There must be at least two levels.");
+			Melder_throw (U"There must be at least two levels.");
 		}
 
 		for (long irow = 1; irow <= numberOfData; irow++) {
@@ -3373,7 +3373,7 @@ Table Table_getOneWayKruskalWallis (Table me, long column, long factorColumn, do
 
 		// Get correctionfactor for ties
 		// Hayes pg. 831
-		double c = 0;
+		double c = 0.0;
 		long jt, j = 1;
 		while (j < numberOfData) {
         	for (jt = j + 1; jt <= numberOfData && data[jt] == data[j]; jt++) {}
@@ -3395,16 +3395,16 @@ Table Table_getOneWayKruskalWallis (Table me, long column, long factorColumn, do
 		}
 
 		double h = 0;
-		for (long j = 1; j <= numberOfLevels; j++) {
+		for (j = 1; j <= numberOfLevels; j++) {
 			if (factorLevelSizes[j] < 2) {
 				SimpleString ss = (SimpleString) levels -> classes -> item[j];
-				Melder_throw ("Group ", ss -> string, " has less then two cases.");
+				Melder_throw (U"Group ", ss -> string, U" has fewer than two cases.");
 			}
 			h += factorLevelSums[j] * factorLevelSums[j] / factorLevelSizes[j]; // = factorLevelMeans * groupMean * factorLevelSizes
 		}
-		h = (12.0 / (numberOfData * (numberOfData + 1))) * h - 3 * (numberOfData + 1);
+		h = (12.0 / (numberOfData * (numberOfData + 1.0))) * h - 3.0 * (numberOfData + 1);
 		h /= tiesCorrection;
-		double dof = numberOfLevels - 1;
+		double dof = numberOfLevels - 1.0;
 		if (degreesOfFreedom) {
 			*degreesOfFreedom = dof;
 		}
@@ -3415,7 +3415,7 @@ Table Table_getOneWayKruskalWallis (Table me, long column, long factorColumn, do
 		if (probability) {
 			*probability = p;
 		}
-		autoTable him = Table_createWithColumnNames (numberOfLevels, L"Group(R) Sums(R) Cases");
+		autoTable him = Table_createWithColumnNames (numberOfLevels, U"Group(R) Sums(R) Cases");
 		for (long irow = 1; irow <= numberOfLevels; irow++) {
 			SimpleString ss = (SimpleString) levels -> classes -> item[irow];
 			Table_setStringValue (him.peek(), irow, 1, ss -> string);
@@ -3426,12 +3426,12 @@ Table Table_getOneWayKruskalWallis (Table me, long column, long factorColumn, do
 		Table_numericize_Assert (him.peek(), 3);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no one-way Kruskal-Wallis performed.");
+		Melder_throw (me, U": no one-way Kruskal-Wallis performed.");
 	}
 }
 
 // Table with Group Means Cases
-static void _Table_postHocTukeyHSD (Table me, double sumOfSquaresWithin, double degreesOfFreedomWithin, Table *meansDiff, Table *meansDiffProbabilities) {
+static void _Table_postHocTukeyHSD (Table me, double sumOfSquaresWithin, double degreesOfFreedomWithin, autoTable *meansDiff, autoTable *meansDiffProbabilities) {
 	try {
 		Table_numericize_Assert (me, 2);
 		Table_numericize_Assert (me, 3);
@@ -3459,91 +3459,93 @@ static void _Table_postHocTukeyHSD (Table me, double sumOfSquaresWithin, double
 		for (long irow = 1; irow <= numberOfMeans - 1; irow++) {
 			for (long icol = irow + 1; icol <= numberOfMeans; icol++) {
 				// Tukey-Kramer correction for unequal sample sizes
-				double oneOverNstar =  0.5 * (1 / cases[icol] + 1 / cases[irow]);
+				double oneOverNstar =  0.5 * (1.0 / cases[icol] + 1.0 / cases[irow]);
 				double s = sqrt (sumOfSquaresWithin * oneOverNstar);
 				double q = fabs (means[irow] - means[icol]) / s;
 				double p = NUMtukeyQ (q, numberOfMeans, degreesOfFreedomWithin, 1);
 				Table_setNumericValue (meansP.peek(), irow, icol, p);
 			}
 		}
-		if (meansDiff != NULL) {
-			*meansDiff = meansD.transfer();
+		if (meansDiff) {
+			*meansDiff = meansD.move();
 		}
-		if (meansDiffProbabilities != NULL) {
-			*meansDiffProbabilities = meansP.transfer();
+		if (meansDiffProbabilities) {
+			*meansDiffProbabilities = meansP.move();
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no post-hoc performed.");
+		Melder_throw (me, U": no post-hoc performed.");
 	}
 }
 
 // expect 6 columns, first text others numeric
 void Table_printAsAnovaTable (Table me) {
 	autoMelderString s;
-	wchar_t stmp[200];
 	int width[7] = { 0, 25, 15, 10, 15, 10, 10 };
 	if (my numberOfColumns < 6) return;
-	swprintf (stmp, 199, L"%25ls\t%15ls\t%10ls\t%15ls\t%10ls\t%10ls", L"Source", L"SS", L"Df", L"MS", L"F", L"P");
-	MelderInfo_writeLine (stmp);
+	MelderInfo_writeLine (
+		Melder_pad (width[1], U"Source"), U"\t",
+		Melder_pad (width[2], U"SS"), U"\t",
+		Melder_pad (width[3], U"Df"), U"\t",
+		Melder_pad (width[4], U"MS"), U"\t",
+		Melder_pad (width[5], U"F"), U"\t",
+		Melder_pad (width[6], U"P")
+	);
 	for (long icol = 2; icol <= 6; icol++) {
 		Table_numericize_Assert (me, icol);
 	}
 
 	for (long i = 1; i <= my rows -> size; i++) {
 		TableRow row = (TableRow) my rows -> item[i];
-		swprintf (stmp, 99, L"%*ls\t", width[1], row -> cells[1].string);
-		MelderString_append (&s, stmp);
+		MelderString_copy (&s, Melder_padOrTruncate (width[1], row -> cells[1].string), U"\t");
 		for (long j = 2; j <= 6; j++) {
 			double value = row -> cells[j].number;
-			if (value != NUMundefined) {
-				swprintf (stmp, 99, L"%*g\t", width[j], value);
+			if (NUMdefined (value)) {
+				MelderString_append (&s, Melder_pad (width[j], Melder_single (value)), j == 6 ? U"" : U"\t");
 			} else {
-				swprintf (stmp, 99, L"%*ls\t", width[j], L"                  ");
+				MelderString_append (&s, Melder_pad (width[j], U""), j == 6 ? U"" : U"\t");
 			}
-			MelderString_append (&s, stmp);
 		}
 		MelderInfo_writeLine (s.string);
-		MelderString_empty (&s);
 	}
 }
 
 void Table_printAsMeansTable (Table me) {
 	autoMelderString s;
-	wchar_t stmp[200];
 	for (long icol = 2; icol <= my numberOfColumns; icol++) {
 		Table_numericize_Assert (me, icol);
 	}
 	for (long j = 1; j <= my numberOfColumns; j++) {
-		swprintf (stmp, 99, L"%10ls\t", (my columnHeaders[j].label == NULL ? L"          " : my columnHeaders[j].label));
-		MelderString_append (&s, stmp);
+		MelderString_append (&s,
+			Melder_padOrTruncate (10, ! my columnHeaders[j].label ? U"" : my columnHeaders[j].label),
+			j == my numberOfColumns ? U"" : U"\t");
 	}
 	MelderInfo_writeLine (s.string);
-	MelderString_empty (&s);
 	for (long i = 1; i <= my rows -> size; i++) {
 		TableRow row = (TableRow) my rows -> item[i];
-		swprintf (stmp, 99, L"%10ls\t", row -> cells[1].string);
-		MelderString_append (&s, stmp);
+		MelderString_copy (&s, Melder_padOrTruncate (10, row -> cells[1].string), U"\t");
 		for (long j = 2; j <= my numberOfColumns; j++) {
 			double value = row -> cells[j].number;
 			if (value != NUMundefined) {
-				swprintf (stmp, 99, L"%10.3g\t", value);
+				MelderString_append (&s,
+					Melder_pad (10, Melder_half (value)),
+					j == my numberOfColumns ? U"" : U"\t");
 			} else {
-				swprintf (stmp, 99, L"%10ls\t", L"                  ");
+				MelderString_append (&s,
+					Melder_pad (10, U""),
+					j == my numberOfColumns ? U"" : U"\t");
 			}
-			MelderString_append (&s, stmp);
 		}
 		MelderInfo_writeLine (s.string);
-		MelderString_empty (&s);
 	}
 }
 
-Table Table_getOneWayAnalysisOfVarianceF (Table me, long column, long factorColumn, Table *means, Table *meansDiff, Table *meansDiffProbabilities) {
+autoTable Table_getOneWayAnalysisOfVarianceF (Table me, long column, long factorColumn, autoTable *means, autoTable *meansDiff, autoTable *meansDiffProbabilities) {
 	try {
 		if (column < 1 || column > my numberOfColumns) {
-			Melder_throw ("Invalid column number.");
+			Melder_throw (U"Invalid column number.");
 		}
 		if (factorColumn < 1 || factorColumn > my numberOfColumns || factorColumn == column) {
-			Melder_throw ("Invalid group column number.");
+			Melder_throw (U"Invalid group column number.");
 		}
 		long numberOfData = my rows -> size;
 		Table_numericize_Assert (me, column);
@@ -3555,14 +3557,14 @@ Table Table_getOneWayAnalysisOfVarianceF (Table me, long column, long factorColu
 		}
 		long numberOfLevels = levels -> classes -> size;
 		if (numberOfLevels < 2) {
-			Melder_throw ("There must be at least two levels.");
+			Melder_throw (U"There must be at least two levels.");
 		}
 		autoNUMvector<long> factorLevelSizes (1, numberOfLevels);
 		autoNUMvector<double> factorLevelMeans (1, numberOfLevels);
 
 		// a, ty, c according to schem of Hayes, 10.14 pg 363
 
-		double a = 0, ty = 0;
+		double a = 0.0, ty = 0.0;
 		for (long i = 1; i <= numberOfData; i++) {
 			long index = levels -> classIndex[i];
 			factorLevelSizes[index] ++;
@@ -3571,11 +3573,11 @@ Table Table_getOneWayAnalysisOfVarianceF (Table me, long column, long factorColu
 			ty += data[i];
 		}
 
-		double c = 0;
+		double c = 0.0;
 		for (long j = 1; j <= numberOfLevels; j++) {
 			if (factorLevelSizes[j] < 2) {
 				SimpleString ss = (SimpleString) levels -> classes -> item[j];
-				Melder_throw ("Level \"", ss -> string, "\" has less then two members.");
+				Melder_throw (U"Level \"", ss -> string, U"\" has less then two members.");
 			}
 			c += factorLevelMeans[j] * factorLevelMeans[j] / factorLevelSizes[j]; // order of these two is important!
 			factorLevelMeans[j] /= factorLevelSizes[j];
@@ -3587,12 +3589,12 @@ Table Table_getOneWayAnalysisOfVarianceF (Table me, long column, long factorColu
 		double dof_w = numberOfData - numberOfLevels;
 		double dof_b = numberOfLevels - 1;
 
-		autoTable anova = Table_createWithColumnNames (3, L"Source SS Df MS F P");
+		autoTable anova = Table_createWithColumnNames (3, U"Source SS Df MS F P");
 		long col_s = 1, col_ss = 2, col_df = 3, col_ms = 4, col_f = 5, col_p = 6;
 		long row_b = 1, row_w = 2, row_t = 3;
-		Table_setStringValue (anova.peek(), row_b, col_s, L"Between");
-		Table_setStringValue (anova.peek(), row_w, col_s, L"Within");
-		Table_setStringValue (anova.peek(), row_t, col_s, L"Total");
+		Table_setStringValue (anova.peek(), row_b, col_s, U"Between");
+		Table_setStringValue (anova.peek(), row_w, col_s, U"Within");
+		Table_setStringValue (anova.peek(), row_t, col_s, U"Total");
 
 		Table_setNumericValue (anova.peek(), row_b, col_ss, ss_b);
 		Table_setNumericValue (anova.peek(), row_b, col_df, dof_b);
@@ -3612,7 +3614,7 @@ Table Table_getOneWayAnalysisOfVarianceF (Table me, long column, long factorColu
 		Table_setNumericValue (anova.peek(), row_t, col_ss, ss_t);
 		Table_setNumericValue (anova.peek(), row_t, col_df, dof_w + dof_b);
 
-		autoTable ameans = Table_createWithColumnNames (numberOfLevels, L"Group Mean Cases");
+		autoTable ameans = Table_createWithColumnNames (numberOfLevels, U"Group Mean Cases");
 		for (long irow = 1; irow <= numberOfLevels; irow++) {
 			SimpleString name = (SimpleString) levels -> classes -> item[irow];
 			Table_setStringValue (ameans.peek(), irow, 1, name -> string);
@@ -3623,27 +3625,27 @@ Table Table_getOneWayAnalysisOfVarianceF (Table me, long column, long factorColu
 		Table_sortRows_Assert (ameans.peek(), columns, 1);
 		_Table_postHocTukeyHSD (ameans.peek(), ms_w, dof_w, meansDiff, meansDiffProbabilities);
 		if (means) {
-			*means = ameans.transfer();
+			*means = ameans.move();
 		}
-		return anova.transfer();
+		return anova;
 	} catch (MelderError) {
-		Melder_throw (me, ": no one-way anova performed.");
+		Melder_throw (me, U": no one-way anova performed.");
 	}
 }
 
 Table Table_getTwoWayAnalysisOfVarianceF (Table me, long column, long factorColumnA, long factorColumnB, Table *means, Table *levelSizes) {
 	try {
 		if (column < 1 || column > my numberOfColumns) {
-			Melder_throw ("Invalid column number.");
+			Melder_throw (U"Invalid column number.");
 		}
 		if (factorColumnA < 1 || factorColumnA > my numberOfColumns || factorColumnA == column) {
-			Melder_throw ("Invalid A group column number.");
+			Melder_throw (U"Invalid A group column number.");
 		}
 		if (factorColumnB < 1 || factorColumnB > my numberOfColumns || factorColumnB == column || factorColumnA == factorColumnB) {
-			Melder_throw ("Invalid B group column number.");
+			Melder_throw (U"Invalid B group column number.");
 		}
-		wchar_t *label_A = my columnHeaders[factorColumnA].label;
-		wchar_t *label_B = my columnHeaders[factorColumnB].label;
+		char32 *label_A = my columnHeaders[factorColumnA].label;
+		char32 *label_B = my columnHeaders[factorColumnB].label;
 
 		long numberOfData = my rows -> size;
 		Table_numericize_Assert (me, column);
@@ -3657,10 +3659,10 @@ Table Table_getTwoWayAnalysisOfVarianceF (Table me, long column, long factorColu
 		long numberOfLevelsA = levelsA -> classes -> size;
 		long numberOfLevelsB = levelsB -> classes -> size;
 		if (numberOfLevelsA < 2) {
-			Melder_throw ("There must be at least two levels in \"", label_A, "\".");
+			Melder_throw (U"There must be at least two levels in \"", label_A, U"\".");
 		}
 		if (numberOfLevelsB < 2) {
-			Melder_throw ("There must be at least two levels in \"", label_B, "\".");
+			Melder_throw (U"There must be at least two levels in \"", label_B, U"\".");
 		}
 
 		/* Formula's according to A. Khuri (1998), Unweighted sums of squares
@@ -3705,7 +3707,7 @@ Table Table_getTwoWayAnalysisOfVarianceF (Table me, long column, long factorColu
 				if (factorLevelSizes[i][j] < 1) {
 					SimpleString li = (SimpleString) levelsA -> classes -> item[i];
 					SimpleString lj = (SimpleString) levelsA -> classes -> item[j];
-					Melder_throw ("Level ", li, " of ", lj, " has no data.");
+					Melder_throw (U"Level ", li, U" of ", lj, U" has no data.");
 				}
 				factorLevelMeans[i][j] /= factorLevelSizes[i][j];
 				nh += 1.0 / factorLevelSizes[i][j];
@@ -3785,12 +3787,12 @@ Table Table_getTwoWayAnalysisOfVarianceF (Table me, long column, long factorColu
 			SimpleString name = (SimpleString) levelsB -> classes -> item[k - 1];
 			Table_setColumnLabel (ameans.peek(), k, name -> string);
 		}
-		Table_setColumnLabel (ameans.peek(), numberOfLevelsB + 1 + 1, L"Mean");
+		Table_setColumnLabel (ameans.peek(), numberOfLevelsB + 1 + 1, U"Mean");
 		for (long j = 1; j <= numberOfLevelsA; j++) {
 			SimpleString name = (SimpleString) levelsA -> classes -> item[j];
 			Table_setStringValue (ameans.peek(), j, 1, name -> string);
 		}
-		Table_setStringValue (ameans.peek(), numberOfLevelsA + 1, 1, L"Mean");
+		Table_setStringValue (ameans.peek(), numberOfLevelsA + 1, 1, U"Mean");
 
 		for (long i = 1; i <= numberOfLevelsA + 1; i++) {
 			for (long j = 1; j <= numberOfLevelsB + 1; j++) {
@@ -3800,8 +3802,8 @@ Table Table_getTwoWayAnalysisOfVarianceF (Table me, long column, long factorColu
 
 		if (levelSizes) {
 			autoTable asizes = (Table) Data_copy (ameans.peek());
-			Table_setColumnLabel (asizes.peek(), numberOfLevelsB + 1 + 1, L"Total");
-			Table_setStringValue (asizes.peek(), numberOfLevelsA + 1, 1, L"Total");
+			Table_setColumnLabel (asizes.peek(), numberOfLevelsB + 1 + 1, U"Total");
+			Table_setStringValue (asizes.peek(), numberOfLevelsA + 1, 1, U"Total");
 			for (long i = 1; i <= numberOfLevelsA + 1; i++) {
 				for (long j = 1; j <= numberOfLevelsB + 1; j++) {
 					Table_setNumericValue (asizes.peek(), i, j + 1, factorLevelSizes[i][j]);
@@ -3810,18 +3812,16 @@ Table Table_getTwoWayAnalysisOfVarianceF (Table me, long column, long factorColu
 			*levelSizes = asizes.transfer();
 		}
 
-		autoTable anova = Table_createWithColumnNames (replications ? 5 : 4, L"Source SS Df MS F P");
+		autoTable anova = Table_createWithColumnNames (replications ? 5 : 4, U"Source SS Df MS F P");
 		long col_s = 1, col_ss = 2, col_df = 3, col_ms = 4, col_f = 5, col_p = 6;
 		long row_A = 1, row_B = 2, row_AB = 3, row_E = replications ? 4 : 3, row_t = replications ? 5 : 4;
 		Table_setStringValue (anova.peek(), row_A, col_s, label_A);
 		Table_setStringValue (anova.peek(), row_B, col_s, label_B);
-		autoMelderString s;
-		MelderString_append (&s, label_A, L" x ", label_B);
-		Table_setStringValue (anova.peek(), row_AB, col_s, s.string);
+		Table_setStringValue (anova.peek(), row_AB, col_s, Melder_cat (label_A, U" x ", label_B));
 		if (replications) {
-			Table_setStringValue (anova.peek(), row_E, col_s, L"Error");
+			Table_setStringValue (anova.peek(), row_E, col_s, U"Error");
 		}
-		Table_setStringValue (anova.peek(), row_t, col_s, L"Total");
+		Table_setStringValue (anova.peek(), row_t, col_s, U"Total");
 
 		double dof_A = numberOfLevelsA - 1, ms_A = ss_A / dof_A;
 		Table_setNumericValue (anova.peek(), row_A, col_ss, ss_A);
@@ -3871,11 +3871,11 @@ Table Table_getTwoWayAnalysisOfVarianceF (Table me, long column, long factorColu
 		}
 		return anova.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": two-way anova not created.");
+		Melder_throw (me, U": two-way anova not created.");
 	}
 }
 
-void Table_normalProbabilityPlot (Table me, Graphics g, long column, long numberOfQuantiles, double numberOfSigmas, int labelSize, const wchar_t *label, int garnish)
+void Table_normalProbabilityPlot (Table me, Graphics g, long column, long numberOfQuantiles, double numberOfSigmas, int labelSize, const char32 *label, int garnish)
 {
 	try {
 		if (column < 1 || column > my numberOfColumns) return;
@@ -3887,7 +3887,7 @@ void Table_normalProbabilityPlot (Table me, Graphics g, long column, long number
 		}
 		double mean, var;
 		NUMvector_avevar (data.peek(), numberOfData, &mean, &var);
-		double xmin = 100, xmax = -xmin, ymin = 1e38, ymax = -ymin, stdev = sqrt (var / (numberOfData - 1));
+		double xmin = 100, xmax = -xmin, ymin = 1e308, ymax = -ymin, stdev = sqrt (var / (numberOfData - 1));
 		if (numberOfSigmas != 0) {
 			xmin = -numberOfSigmas; 
 			xmax =  numberOfSigmas;
@@ -3897,11 +3897,11 @@ void Table_normalProbabilityPlot (Table me, Graphics g, long column, long number
 		NUMsort_d (numberOfData, data.peek());
 		numberOfQuantiles = numberOfData < numberOfQuantiles ? numberOfData : numberOfQuantiles;
 		autoTableOfReal thee = TableOfReal_create (numberOfQuantiles, 2);
-		TableOfReal_setColumnLabel (thee.peek(), 1, L"Normal distribution quantiles");
+		TableOfReal_setColumnLabel (thee.peek(), 1, U"Normal distribution quantiles");
 		TableOfReal_setColumnLabel (thee.peek(), 2, my columnHeaders[column].label);
 		double un = pow (0.5, 1.0 / numberOfQuantiles);
 		for (long irow = 1; irow <= numberOfQuantiles; irow++) {
-			double ui = irow == 1 ? 1 - un : (irow == numberOfQuantiles ? un : (irow - 0.3175) / (numberOfQuantiles + 0.365));
+			double ui = irow == 1 ? 1.0 - un : (irow == numberOfQuantiles ? un : (irow - 0.3175) / (numberOfQuantiles + 0.365));
 			double q = NUMquantile (numberOfData, data.peek(), ui);
 			double zq = - NUMinvGaussQ (ui);
 			thy data[irow][1] = zq; // along x
@@ -3927,7 +3927,7 @@ void Table_normalProbabilityPlot (Table me, Graphics g, long column, long number
 	}
 }
 
-void Table_quantileQuantilePlot_betweenLevels (Table me, Graphics g, long dataColumn, long factorColumn, wchar_t *xlevel, wchar_t *ylevel, long numberOfQuantiles, double xmin, double xmax, double ymin, double ymax, int labelSize, const wchar_t *plotLabel, int garnish) {
+void Table_quantileQuantilePlot_betweenLevels (Table me, Graphics g, long dataColumn, long factorColumn, const char32 *xlevel, const char32 *ylevel, long numberOfQuantiles, double xmin, double xmax, double ymin, double ymax, int labelSize, const char32 *plotLabel, int garnish) {
 	try {
 		if (dataColumn < 1 || dataColumn > my numberOfColumns || factorColumn < 1 || factorColumn > my numberOfColumns) return;
 		Table_numericize_Assert (me, dataColumn);
@@ -3936,24 +3936,24 @@ void Table_quantileQuantilePlot_betweenLevels (Table me, Graphics g, long dataCo
 		autoNUMvector<double> ydata (1, numberOfData);
 		long xnumberOfData = 0, ynumberOfData = 0;
 		for (long irow = 1; irow <= numberOfData; irow++) {
-			wchar_t *label = ((TableRow) my rows -> item [irow]) -> cells [factorColumn] . string;
+			char32 *label = ((TableRow) my rows -> item [irow]) -> cells [factorColumn] . string;
 			double val = ((TableRow) my rows -> item [irow]) -> cells [dataColumn] . number;
-			if (Melder_wcsequ (label, xlevel)) {
+			if (Melder_equ (label, xlevel)) {
 				xdata[++xnumberOfData] = val;
-			} else if (Melder_wcsequ (label, ylevel)) {
+			} else if (Melder_equ (label, ylevel)) {
 				ydata[++ynumberOfData] = val;
 			}
 		}
 		if (xmin == xmax) {
 			NUMvector_extrema<double> (xdata.peek(), 1, xnumberOfData, &xmin, &xmax);
 			if (xmin == xmax) {
-				xmin -= 1; xmax += 1;
+				xmin -= 1.0; xmax += 1.0;
 			}
 		}
 		if (ymin == ymax) {
 			NUMvector_extrema<double> (ydata.peek(), 1, ynumberOfData, &ymin, &ymax);
 			if (ymin == ymax) {
-				ymin -= 1; ymax += 1;
+				ymin -= 1.0; ymax += 1.0;
 			}
 		}
 		Graphics_setWindow (g, xmin, xmax, ymin, ymax);
@@ -3964,22 +3964,18 @@ void Table_quantileQuantilePlot_betweenLevels (Table me, Graphics g, long dataCo
 		if (garnish) {
 			Graphics_drawInnerBox (g);
 
-			autoMelderString marginText;
-			MelderString_append (&marginText, my columnHeaders [dataColumn].label, L" (", xlevel, L")");
-			Graphics_textBottom (g, 1, marginText.string);
-			Graphics_marksBottom (g, 2, 1, 1, 0);
+			Graphics_textBottom (g, true, Melder_cat (my columnHeaders [dataColumn].label, U" (", xlevel, U")"));
+			Graphics_marksBottom (g, 2, true, true, false);
 
-			MelderString_empty (&marginText);
-			MelderString_append (&marginText, my columnHeaders [dataColumn].label, L" (", ylevel, L")");
-			Graphics_textLeft (g, 1, marginText.string);
-			Graphics_marksLeft (g, 2, 1, 1, 0);
+			Graphics_textLeft (g, true, Melder_cat (my columnHeaders [dataColumn].label, U" (", ylevel, U")"));
+			Graphics_marksLeft (g, 2, true, true, false);
 		}
 	} catch (MelderError) {
 		Melder_clearError ();   // drawing errors shall be ignored
 	}
 }
 
-void Table_quantileQuantilePlot (Table me, Graphics g, long xcolumn, long ycolumn, long numberOfQuantiles, double xmin, double xmax, double ymin, double ymax, int labelSize, const wchar_t *plotLabel, int garnish) {
+void Table_quantileQuantilePlot (Table me, Graphics g, long xcolumn, long ycolumn, long numberOfQuantiles, double xmin, double xmax, double ymin, double ymax, int labelSize, const char32 *plotLabel, int garnish) {
 	try {
 		if (xcolumn < 1 || xcolumn > my numberOfColumns || ycolumn < 1 || ycolumn > my numberOfColumns) return;
 		Table_numericize_Assert (me, xcolumn);
@@ -3994,13 +3990,13 @@ void Table_quantileQuantilePlot (Table me, Graphics g, long xcolumn, long ycolum
 		if (xmin == xmax) {
 			NUMvector_extrema<double> (xdata.peek(), 1, numberOfData, &xmin, &xmax);
 			if (xmin == xmax) {
-				xmin -= 1; xmax += 1;
+				xmin -= 1.0; xmax += 1.0;
 			}
 		}
 		if (ymin == ymax) {
 			NUMvector_extrema<double> (ydata.peek(), 1, numberOfData, &ymin, &ymax);
 			if (ymin == ymax) {
-				ymin -= 1; ymax += 1;
+				ymin -= 1.0; ymax += 1.0;
 			}
 		}
 		Graphics_setWindow (g, xmin, xmax, ymin, ymax);
@@ -4010,14 +4006,14 @@ void Table_quantileQuantilePlot (Table me, Graphics g, long xcolumn, long ycolum
 		Graphics_unsetInner (g);
 		if (garnish) {
 			Graphics_drawInnerBox (g);
-			if (my columnHeaders [xcolumn].label != NULL) {
-				Graphics_textBottom (g, 1, my columnHeaders [xcolumn].label);
+			if (my columnHeaders [xcolumn].label) {
+				Graphics_textBottom (g, true, my columnHeaders [xcolumn].label);
 			}
-			Graphics_marksBottom (g, 2, 1, 1, 0);
-			if (my columnHeaders [ycolumn].label != NULL) {
-				Graphics_textLeft (g, 1, my columnHeaders [ycolumn].label);
+			Graphics_marksBottom (g, 2, true, true, false);
+			if (my columnHeaders [ycolumn].label) {
+				Graphics_textLeft (g, true, my columnHeaders [ycolumn].label);
 			}
-			Graphics_marksLeft (g, 2, 1, 1, 0);
+			Graphics_marksLeft (g, 2, true, true, false);
 		}
 	} catch (MelderError) {
 		Melder_clearError ();   // drawing errors shall be ignored
@@ -4035,10 +4031,10 @@ void Table_boxPlots (Table me, Graphics g, long dataColumn, long factorColumn, d
 			ymax = Table_getMaximum (me, dataColumn);
 			ymin = Table_getMinimum (me, dataColumn);
 			if (ymax == ymin) {
-				ymax += 1; ymin -= 1;
+				ymax += 1.0; ymin -= 1.0;
 			}
 		}
-		Graphics_setWindow (g, 1 - 0.5, numberOfLevels + 0.5, ymin, ymax);
+		Graphics_setWindow (g, 1.0 - 0.5, numberOfLevels + 0.5, ymin, ymax);
 		Graphics_setInner (g);
 		autoNUMvector<double> data (1, numberOfData);
 		for (long ilevel = 1; ilevel <= numberOfLevels; ilevel++) {
@@ -4055,28 +4051,28 @@ void Table_boxPlots (Table me, Graphics g, long dataColumn, long factorColumn, d
 			Graphics_drawInnerBox (g);
 			for (long ilevel = 1; ilevel <= numberOfLevels; ilevel++) {
 				SimpleString ss = (SimpleString) si -> classes -> item[ilevel];
-				Graphics_markBottom (g, ilevel, 0, 1, 0, ss -> string);
+				Graphics_markBottom (g, ilevel, false, true, false, ss -> string);
 			}
-			Graphics_marksLeft (g, 2, 1, 1, 0);
+			Graphics_marksLeft (g, 2, true, true, false);
 		}
 	} catch (MelderError) {
 		Melder_clearError ();   // drawing errors shall be ignored
 	}
 }
 
-void Table_boxPlotsWhere (Table me, Graphics g, wchar_t *dataColumns_string, long factorColumn, double ymin, double ymax, int garnish, const wchar_t *formula, Interpreter interpreter) {
+void Table_boxPlotsWhere (Table me, Graphics g, char32 *dataColumns_string, long factorColumn, double ymin, double ymax, int garnish, const char32 *formula, Interpreter interpreter) {
 	try {
 		long numberOfSelectedColumns;
 		autoNUMvector<long> dataColumns (Table_getColumnIndicesFromColumnLabelString (me, dataColumns_string,  &numberOfSelectedColumns), 1);
 		if (factorColumn < 1 || factorColumn > my numberOfColumns) {
 			return;
 		}
-		Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_UNKNOWN, TRUE);
+		Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_UNKNOWN, true);
 		long numberOfData = my rows -> size;
 		autoStringsIndex si = Table_to_StringsIndex_column (me, factorColumn);
 		long numberOfLevels = si -> classes -> size;
 		if (ymin == ymax) {
-			ymin = 1e38, ymax = -ymin;
+			ymin = 1e308, ymax = -ymin;
 			for (long icol = 1; icol <= numberOfSelectedColumns; icol++) {
 				double ymaxi = Table_getMaximum (me, dataColumns[icol]);
 				double ymini = Table_getMinimum (me, dataColumns[icol]);
@@ -4084,13 +4080,13 @@ void Table_boxPlotsWhere (Table me, Graphics g, wchar_t *dataColumns_string, lon
 				ymin = ymini < ymin ? ymini : ymin;
 			}
 			if (ymax == ymin) {
-				ymax += 1; ymin -= 1;
+				ymax += 1.0; ymin -= 1.0;
 			}
 		}
-		Graphics_setWindow (g, 1 - 0.5, numberOfLevels + 0.5, ymin, ymax);
+		Graphics_setWindow (g, 1.0 - 0.5, numberOfLevels + 0.5, ymin, ymax);
 		Graphics_setInner (g);
-		double boxWidth = 4, spaceBetweenBoxesInGroup = 1, barWidth = boxWidth / 3;
-		double spaceBetweenGroupsdiv2 = 3.0 / 2; 
+		double boxWidth = 4.0, spaceBetweenBoxesInGroup = 1.0, barWidth = boxWidth / 3.0;
+		double spaceBetweenGroupsdiv2 = 3.0 / 2.0;
 		double widthUnit = 1.0 / (numberOfSelectedColumns * boxWidth + (numberOfSelectedColumns - 1) * spaceBetweenBoxesInGroup + spaceBetweenGroupsdiv2 + spaceBetweenGroupsdiv2);
 		autoNUMvector<double> data (1, numberOfData);
 		for (long ilevel = 1; ilevel <= numberOfLevels; ilevel++) {
@@ -4101,7 +4097,7 @@ void Table_boxPlotsWhere (Table me, Graphics g, wchar_t *dataColumns_string, lon
 					if (si -> classIndex[irow] == ilevel) {
 						struct Formula_Result result;
 						Formula_run (irow, dataColumns[icol], & result);
-						if (result.result.numericResult) {
+						if (result.result.numericResult != 0.0) {
 							data[++numberOfDataInLevelColumn] = Table_getNumericValue_Assert (me, irow, dataColumns[icol]);
 						}
 					}
@@ -4118,26 +4114,26 @@ void Table_boxPlotsWhere (Table me, Graphics g, wchar_t *dataColumns_string, lon
 			Graphics_drawInnerBox (g);
 			for (long ilevel = 1; ilevel <= numberOfLevels; ilevel++) {
 				SimpleString ss = (SimpleString) si -> classes -> item[ilevel];
-				Graphics_markBottom (g, ilevel, 0, 1, 0, ss -> string);
+				Graphics_markBottom (g, ilevel, false, true, false, ss -> string);
 			}
-			Graphics_marksLeft (g, 2, 1, 1, 0);
+			Graphics_marksLeft (g, 2, true, true, false);
 		}
 	} catch (MelderError) {
 		Melder_clearError ();   // drawing errors shall be ignored
 	}
 }
 
-void Table_distributionPlotWhere (Table me, Graphics g, long dataColumn, double minimum, double maximum, long nBins, double freqMin, double freqMax, int garnish, const wchar_t *formula, Interpreter interpreter) {
+void Table_distributionPlotWhere (Table me, Graphics g, long dataColumn, double minimum, double maximum, long nBins, double freqMin, double freqMax, int garnish, const char32 *formula, Interpreter interpreter) {
 	try {
 		if (dataColumn < 1 || dataColumn > my numberOfColumns) return;
-		Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_UNKNOWN, TRUE);
+		Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_UNKNOWN, true);
 		Table_numericize_Assert (me, dataColumn);
 		long n = my rows -> size, mrow = 0;
 		autoMatrix thee = Matrix_create (1, 1, 1, 1, 1, 0, n + 1, n, 1, 1);
 		for (long irow = 1; irow <= n; irow++) {
 			struct Formula_Result result;
 			Formula_run (irow, dataColumn, & result);
-			if (result.result.numericResult) {
+			if (result.result.numericResult != 0.0) {
 				thy z[1][++mrow] = Table_getNumericValue_Assert (me, irow, dataColumn);
 			}
 		}
@@ -4147,57 +4143,53 @@ void Table_distributionPlotWhere (Table me, Graphics g, long dataColumn, double
 	}
 }
 
-static Strings itemizeColourString (const wchar_t *colourString) {
+static Strings itemizeColourString (const char32 *colourString) {
 	// remove all spaces within { } so each {1,2,3} can be itemized
-	const wchar_t *compileMsg;
 	long nmatches_sub = 0;
-	const wchar_t *searchRE = L"\\{\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*\\}";
-	regexp *compiledRE = CompileRE ((regularExp_CHAR *) searchRE, &compileMsg, 0);
-	if (compiledRE == NULL) {
-			Melder_throw ("No valid regexp");
-	}
+	const char32 *searchRE = U"\\{\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*,\\s*([0-9.]+)\\s*\\}";
+	regexp *compiledRE = CompileRE_throwable (searchRE, 0);
 	autoMelderString colour;
-	MelderString_append (&colour, str_replace_regexp (colourString, compiledRE, L"{\\1,\\2,\\3}", 0, &nmatches_sub));
+	MelderString_append (&colour, str_replace_regexp (colourString, compiledRE, U"{\\1,\\2,\\3}", 0, &nmatches_sub));
 	autoStrings thee = Strings_createAsTokens (colour.string);
 	return thee.transfer();
 }
 
-Graphics_Colour Strings_colourToValue  (Strings me, long index) {
+static Graphics_Colour Strings_colourToValue  (Strings me, long index) {
 	if (index < 0 || index > my numberOfStrings) {
 		return Graphics_GREY;
 	}
 	Graphics_Colour colourValue;
-	wchar_t *p = my strings[index];
-	while (*p == ' ' || *p == '\t') p ++;
-	*p = tolower (*p);
-	int first = *p;
-	if (first == '{') {
+	char32 *p = my strings[index];
+	while (*p == U' ' || *p == U'\t') p ++;
+	*p = (char32) tolower ((int) *p);
+	char32 first = *p;
+	if (first == U'{') {
 		colourValue.red = Melder_atof (++ p);
-		p = (wchar_t *) wcschr (p, ',');
-		if (p == NULL) return Graphics_GREY;
+		p = (char32 *) str32chr (p, U',');
+		if (! p) return Graphics_GREY;
 		colourValue.green = Melder_atof (++ p);
-		p = (wchar_t *) wcschr (p, ',');
-		if (p == NULL) return Graphics_GREY;
+		p = (char32 *) str32chr (p, U',');
+		if (! p) return Graphics_GREY;
 		colourValue.blue = Melder_atof (++ p);
 	} else {
-		*p = tolower (*p);
-		if (wcsequ (p, L"black")) colourValue = Graphics_BLACK;
-		else if (wcsequ (p, L"white")) colourValue = Graphics_WHITE;
-		else if (wcsequ (p, L"red")) colourValue = Graphics_RED;
-		else if (wcsequ (p, L"green")) colourValue = Graphics_GREEN;
-		else if (wcsequ (p, L"blue")) colourValue = Graphics_BLUE;
-		else if (wcsequ (p, L"yellow")) colourValue = Graphics_YELLOW;
-		else if (wcsequ (p, L"cyan")) colourValue = Graphics_CYAN;
-		else if (wcsequ (p, L"magenta")) colourValue = Graphics_MAGENTA;
-		else if (wcsequ (p, L"maroon")) colourValue = Graphics_MAROON;
-		else if (wcsequ (p, L"lime")) colourValue = Graphics_LIME;
-		else if (wcsequ (p, L"navy")) colourValue = Graphics_NAVY;
-		else if (wcsequ (p, L"teal")) colourValue = Graphics_TEAL;
-		else if (wcsequ (p, L"purple")) colourValue = Graphics_PURPLE;
-		else if (wcsequ (p, L"olive")) colourValue = Graphics_OLIVE;
-		else if (wcsequ (p, L"pink")) colourValue = Graphics_PINK;
-		else if (wcsequ (p, L"silver")) colourValue = Graphics_SILVER;
-		else if (wcsequ (p, L"grey")) colourValue = Graphics_GREY;
+		*p = (char32) tolower ((int) *p);
+		if (str32equ (p, U"black")) colourValue = Graphics_BLACK;
+		else if (str32equ (p, U"white")) colourValue = Graphics_WHITE;
+		else if (str32equ (p, U"red")) colourValue = Graphics_RED;
+		else if (str32equ (p, U"green")) colourValue = Graphics_GREEN;
+		else if (str32equ (p, U"blue")) colourValue = Graphics_BLUE;
+		else if (str32equ (p, U"yellow")) colourValue = Graphics_YELLOW;
+		else if (str32equ (p, U"cyan")) colourValue = Graphics_CYAN;
+		else if (str32equ (p, U"magenta")) colourValue = Graphics_MAGENTA;
+		else if (str32equ (p, U"maroon")) colourValue = Graphics_MAROON;
+		else if (str32equ (p, U"lime")) colourValue = Graphics_LIME;
+		else if (str32equ (p, U"navy")) colourValue = Graphics_NAVY;
+		else if (str32equ (p, U"teal")) colourValue = Graphics_TEAL;
+		else if (str32equ (p, U"purple")) colourValue = Graphics_PURPLE;
+		else if (str32equ (p, U"olive")) colourValue = Graphics_OLIVE;
+		else if (str32equ (p, U"pink")) colourValue = Graphics_PINK;
+		else if (str32equ (p, U"silver")) colourValue = Graphics_SILVER;
+		else if (str32equ (p, U"grey")) colourValue = Graphics_GREY;
 		else { 
 			double grey = Melder_atof (p);
 			grey = grey < 0 ? 0 : (grey > 1 ? 1 : grey);
@@ -4207,44 +4199,44 @@ Graphics_Colour Strings_colourToValue  (Strings me, long index) {
 	return colourValue;
 }
 
-long Table_getNumberOfRowsWhere (Table me, const wchar_t *formula, Interpreter interpreter) {
+long Table_getNumberOfRowsWhere (Table me, const char32 *formula, Interpreter interpreter) {
 	long numberOfRows = 0;
-	Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_UNKNOWN, TRUE);
+	Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_UNKNOWN, true);
 	for (long irow = 1; irow <= my rows -> size; irow ++) {
 		struct Formula_Result result;
 		Formula_run (irow, 1, & result);
-		if (result.result.numericResult) {
+		if (result.result.numericResult != 0.0) {
 			numberOfRows++;
 		}
 	}
 	return numberOfRows;
 }
 
-long *Table_findRowsMatchingCriterion (Table me, const wchar_t *formula, Interpreter interpreter, long *numberOfMatches) {
+long *Table_findRowsMatchingCriterion (Table me, const char32 *formula, Interpreter interpreter, long *numberOfMatches) {
 	try {
 		*numberOfMatches = Table_getNumberOfRowsWhere (me, formula, interpreter);
 		if (*numberOfMatches < 1) {
-			Melder_throw ("No rows selected.");
+			Melder_throw (U"No rows selected.");
 		}
-		Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_UNKNOWN, TRUE); // again?
+		Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_UNKNOWN, true);   // again?
 		autoNUMvector<long> selectedRows (1, *numberOfMatches);
 		long n = 0;
 		for (long irow =1; irow <= my rows -> size; irow++) {
 			struct Formula_Result result;
 			Formula_run (irow, 1, & result);
-			if (result.result.numericResult) {
+			if (result.result.numericResult != 0.0) {
 				selectedRows[++n] = irow;
 			}
 		}
 		Melder_assert (n == *numberOfMatches);
 		return selectedRows.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot find matches.");
+		Melder_throw (me, U": cannot find matches.");
 	}
 }
 
 
-void Table_barPlotWhere (Table me, Graphics g, const wchar_t *columnLabels, double ymin, double ymax, const wchar_t *factorColumn, double xoffsetFraction, double interbarFraction, double interbarsFraction, const wchar_t *colours, double angle, int garnish, const wchar_t *formula, Interpreter interpreter) {
+void Table_barPlotWhere (Table me, Graphics g, const char32 *columnLabels, double ymin, double ymax, const char32 *factorColumn, double xoffsetFraction, double interbarFraction, double interbarsFraction, const char32 *colours, double angle, int garnish, const char32 *formula, Interpreter interpreter) {
 	try {
 		long numberOfColumns, numberOfRowMatches = 0;
 		autoNUMvector<long> columnIndex (Table_getColumnIndicesFromColumnLabelString (me, columnLabels, &numberOfColumns), 1);
@@ -4253,7 +4245,7 @@ void Table_barPlotWhere (Table me, Graphics g, const wchar_t *columnLabels, doub
 		
 		autoNUMvector<long> selectedRows (Table_findRowsMatchingCriterion (me, formula, interpreter, &numberOfRowMatches), 1);
 		if (ymax <= ymin) { // autoscaling
-			ymin = 1e38; ymax= - ymin;
+			ymin = 1e308; ymax= - ymin;
 			for (long icol = 1; icol <= numberOfColumns; icol++) {
 				double cmin, cmax;
 				Table_columnExtremesFromSelectedRows (me, columnIndex[icol], selectedRows.peek(), numberOfRowMatches, &cmin, &cmax);
@@ -4312,9 +4304,9 @@ void Table_barPlotWhere (Table me, Graphics g, const wchar_t *columnLabels, doub
 					Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_TOP);
 				}
 				for (long irow = 1; irow <= numberOfGroups; irow++) {
-					const wchar_t *label = Table_getStringValue_Assert (me, selectedRows[irow], labelIndex);
+					const char32 *label = Table_getStringValue_Assert (me, selectedRows[irow], labelIndex);
 					if (label) {
-						//Graphics_markBottom (g, xb, 0, 0, 0, label);
+						//Graphics_markBottom (g, xb, false, false, false, label);
 						Graphics_text (g, xb, ymin - g -> vertTick, label); // was y
 					}
 					xb += dx;
@@ -4326,26 +4318,26 @@ void Table_barPlotWhere (Table me, Graphics g, const wchar_t *columnLabels, doub
 		Graphics_unsetInner (g);
 		if (garnish) {
 			if (ymin * ymax < 0) {
-				Graphics_markLeft (g, 0, TRUE,TRUE, TRUE, NULL);
+				Graphics_markLeft (g, 0.0, true, true, true, nullptr);
 			}
 
 			Graphics_drawInnerBox (g);
-			Graphics_marksLeft (g, 2, 1, 1, 0);
+			Graphics_marksLeft (g, 2, true, true, false);
 		}
 	} catch (MelderError) {
 		Melder_clearError ();   // drawing errors shall be ignored
 	}
 }
 
-static int Graphics_getConnectingLine (Graphics g, const wchar_t *text1, double x1, double y1, const wchar_t *text2, double x2, double y2, double *x3, double *y3, double *x4, double *y4) {
+static int Graphics_getConnectingLine (Graphics g, const char32 *text1, double x1, double y1, const char32 *text2, double x2, double y2, double *x3, double *y3, double *x4, double *y4) {
 	int drawLine = 0;
 	double width1 = Graphics_textWidth (g, text1), width2 = Graphics_textWidth (g, text2);
 	double h = Graphics_dyMMtoWC (g, 1.5 * Graphics_inqFontSize (g) * 25.4 / 72) / 1.5;
 	double xi[3], yi[3], xleft = x1 < x2 ? x1 : x2, xright = x2 > x1 ? x2 : x1;
-	int numberOfIntersections = NUMgetIntersectionsWithRectangle (x1, y1, x2, y2, xleft - width1 / 2, y1 - h/2, xleft +width1 / 2, y1 + h/2, xi, yi);
+	int numberOfIntersections = NUMgetIntersectionsWithRectangle (x1, y1, x2, y2, xleft - width1 / 2.0, y1 - h/2, xleft + width1 / 2.0, y1 + h/2, xi, yi);
 	if (numberOfIntersections == 1) {
 		*x3 = xi[1]; *y3 = yi[1];
-		numberOfIntersections = NUMgetIntersectionsWithRectangle (x1, y1, x2, y2, xright - width2 / 2, y2 - h/2, xright + width2 / 2, y2 + h/2, xi, yi);
+		numberOfIntersections = NUMgetIntersectionsWithRectangle (x1, y1, x2, y2, xright - width2 / 2.0, y2 - h/2, xright + width2 / 2.0, y2 + h/2, xi, yi);
 		if (numberOfIntersections == 1) {
 			*x4 = xi[1]; *y4 = yi[1];
 			drawLine = 1;
@@ -4355,9 +4347,9 @@ static int Graphics_getConnectingLine (Graphics g, const wchar_t *text1, double
 }
 
 // take the xcolumn as labels if non-numeric column else as numbers and arrange distances accordingly.
-void Table_lineGraphWhere (Table me, Graphics g, long xcolumn, double xmin, double xmax, long ycolumn, double ymin, double ymax, const wchar_t *symbol, double angle, int garnish, const wchar_t *formula, Interpreter interpreter) {
+void Table_lineGraphWhere (Table me, Graphics g, long xcolumn, double xmin, double xmax, long ycolumn, double ymin, double ymax, const char32 *symbol, double angle, int garnish, const char32 *formula, Interpreter interpreter) {
 	try {
-		if (ycolumn < 1 || ycolumn > my rows -> size) return;
+		if (ycolumn < 1 || ycolumn > my numberOfColumns) return;
 		long numberOfSelectedRows = 0;
 		autoNUMvector<long> selectedRows (Table_findRowsMatchingCriterion (me, formula, interpreter, &numberOfSelectedRows), 1);	
 		if (ymax <= ymin) { // autoscaling
@@ -4376,7 +4368,7 @@ void Table_lineGraphWhere (Table me, Graphics g, long xcolumn, double xmin, doub
 		Graphics_setWindow (g, xmin, xmax, ymin, ymax);
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
 		double x1, y1;
-		double lineSpacing = Graphics_dyMMtoWC (g, 1.5 * Graphics_inqFontSize (g) * 25.4 / 72);
+		double lineSpacing = Graphics_dyMMtoWC (g, 1.5 * Graphics_inqFontSize (g) * 25.4 / 72.0);
 		//double symbolHeight = lineSpacing / 1.5;
 		for (long i = 1; i <= numberOfSelectedRows; i++) {
 			double y2 = Table_getNumericValue_Assert (me, selectedRows[i], ycolumn);
@@ -4421,9 +4413,9 @@ void Table_lineGraphWhere (Table me, Graphics g, long xcolumn, double xmin, doub
 			for (long i = 1; i <= numberOfSelectedRows; i++) {
 				double x2 = i;
 				if (x2 >= xmin && x2 <= xmax) {
-					const wchar_t *label = Table_getStringValue_Assert (me, selectedRows[i], xcolumn);
+					const char32 *label = Table_getStringValue_Assert (me, selectedRows[i], xcolumn);
 					if (label) {
-						//Graphics_markBottom (g, xb, 0, 0, 0, label);
+						//Graphics_markBottom (g, xb, false, false, false, label);
 						Graphics_text (g, x2 + dx, ymin - g -> vertTick, label); // was y
 					}
 				}
@@ -4435,9 +4427,9 @@ void Table_lineGraphWhere (Table me, Graphics g, long xcolumn, double xmin, doub
 
 		if (garnish) {
 			Graphics_drawInnerBox (g);
-			Graphics_marksLeft (g, 2, 1, 1, 0);
+			Graphics_marksLeft (g, 2, true, true, false);
 			if (xIsNumeric) {
-				Graphics_marksBottom (g, 2, 1, 1, 0);
+				Graphics_marksBottom (g, 2, true, true, false);
 			}
 		}
 	} catch (MelderError) {
@@ -4445,7 +4437,7 @@ void Table_lineGraphWhere (Table me, Graphics g, long xcolumn, double xmin, doub
 	}
 }
 
-void Table_lagPlotWhere (Table me, Graphics g, long column, long lag, double xmin, double xmax, const wchar_t *symbol, int labelSize, int garnish, const wchar_t *formula, Interpreter interpreter) {
+void Table_lagPlotWhere (Table me, Graphics g, long column, long lag, double xmin, double xmax, const char32 *symbol, int labelSize, int garnish, const char32 *formula, Interpreter interpreter) {
 	try {
 		if (column < 1 || column > my rows -> size) {
 			return;
@@ -4465,13 +4457,11 @@ void Table_lagPlotWhere (Table me, Graphics g, long column, long lag, double xmi
 		Graphics_unsetInner (g);
 		if (garnish) {
 			Graphics_drawInnerBox (g);
-			Graphics_marksBottom (g, 2, TRUE, TRUE, FALSE);
-			Graphics_marksLeft (g, 2, TRUE, TRUE, FALSE);
+			Graphics_marksBottom (g, 2, true, true, false);
+			Graphics_marksLeft (g, 2, true, true, false);
 			if (my columnHeaders [column]. label) {
-				Graphics_textLeft (g, TRUE, my columnHeaders[column].label);
-				autoMelderString textbottom;
-				MelderString_append (&textbottom, my columnHeaders[column].label, L" (lag = ", Melder_integer (lag), L")");
-				Graphics_textBottom (g, TRUE, textbottom.string);
+				Graphics_textLeft (g, true, my columnHeaders[column].label);
+				Graphics_textBottom (g, true, Melder_cat (my columnHeaders[column].label, U" (lag = ", lag, U")"));
 			}
 		}
 	} catch (MelderError) {
@@ -4479,33 +4469,33 @@ void Table_lagPlotWhere (Table me, Graphics g, long column, long lag, double xmi
 	}
 }
 
-Table Table_extractRowsWhere (Table me, const wchar_t *formula, Interpreter interpreter) {
+Table Table_extractRowsWhere (Table me, const char32 *formula, Interpreter interpreter) {
 	try {
-		Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_UNKNOWN, TRUE);
+		Formula_compile (interpreter, me, formula, kFormula_EXPRESSION_TYPE_UNKNOWN, true);
 		autoTable thee = Table_create (0, my numberOfColumns);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-			autostring newLabel = Melder_wcsdup (my columnHeaders [icol]. label);
+			autostring32 newLabel = Melder_dup (my columnHeaders [icol]. label);
 			thy columnHeaders [icol]. label = newLabel.transfer();
 		}
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			struct Formula_Result result;
 			Formula_run (irow, 1, & result);
-			if (result.result.numericResult) {
+			if (result.result.numericResult != 0.0) {
 				TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 				autoTableRow newRow = Data_copy (row);
 				Collection_addItem (thy rows, newRow.transfer());
 			}
 		}
 		if (thy rows -> size == 0) {
-			Melder_warning (L"No row matches criterion.");
+			Melder_warning (U"No row matches criterion.");
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": no Table could be extracted.");
+		Melder_throw (me, U": no Table could be extracted.");
 	}
 }
 
-TableOfReal Table_to_TableOfRealWhere (Table me, const wchar_t *columnLabels, const wchar_t *factorColumn, const wchar_t *formula, Interpreter interpreter) {
+static TableOfReal Table_to_TableOfRealWhere (Table me, const char32 *columnLabels, const char32 *factorColumn, const char32 *formula, Interpreter interpreter) {
 	try {
 		long numberOfColumns, numberOfSelectedRows = 0;
 		long factorColIndex = Table_findColumnIndexFromColumnLabel (me, factorColumn);
@@ -4518,7 +4508,7 @@ TableOfReal Table_to_TableOfRealWhere (Table me, const wchar_t *columnLabels, co
 				thy data[i][icol] = value;
 			}
 			if (factorColIndex > 0) { // if no factorColumn given labels may be empty
-				const wchar_t *label = Table_getStringValue_Assert (me, selectedRows[i], factorColIndex);
+				const char32 *label = Table_getStringValue_Assert (me, selectedRows[i], factorColIndex);
 				TableOfReal_setRowLabel (thee.peek(), i, label);
 			}
 		}
@@ -4527,30 +4517,30 @@ TableOfReal Table_to_TableOfRealWhere (Table me, const wchar_t *columnLabels, co
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, "No TableOfReal created from Table.");
+		Melder_throw (me, U"No TableOfReal created from Table.");
 	}
 }
 
-SSCPs Table_to_SSCPsWhere (Table me, const wchar_t *columnLabels, const wchar_t *factorColumn, const wchar_t *formula, Interpreter interpreter) {
+static SSCPs Table_to_SSCPsWhere (Table me, const char32 *columnLabels, const char32 *factorColumn, const char32 *formula, Interpreter interpreter) {
 	try {
 		autoTableOfReal thee = Table_to_TableOfRealWhere (me, columnLabels, factorColumn, formula, interpreter);
 		autoSSCPs him = TableOfReal_to_SSCPs_byLabel (thee.peek());
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, "No Discriminant created from Table.");
+		Melder_throw (me, U"No Discriminant created from Table.");
 	}
 }
 
-static long SSCPs_findIndexOfGroupLabel (SSCPs me, const wchar_t *label) {
+static long SSCPs_findIndexOfGroupLabel (SSCPs me, const char32 *label) {
 	for (long i = 1; i <= my size; i++) {
-		if (Melder_wcscmp (Thing_getName ((SSCP) my item[i]), label) == 0) {
+		if (Melder_cmp (Thing_getName ((SSCP) my item[i]), label) == 0) {
 			return i;
 		}
 	}
 	return 0;
 }
 
-Table Table_and_SSCPs_extractMahalanobisWhere (Table me, SSCPs thee, double numberOfSigmas, int which_Melder_NUMBER, const wchar_t *factorColumn, const wchar_t *formula, Interpreter interpreter) {
+static Table Table_and_SSCPs_extractMahalanobisWhere (Table me, SSCPs thee, double numberOfSigmas, int which_Melder_NUMBER, const char32 *factorColumn, const char32 *formula, Interpreter interpreter) {
 	try {
 		SSCP sscp = (SSCP) thy item[1];
 		long numberOfColumns = sscp -> numberOfColumns, numberOfSelectedRows = 0;
@@ -4564,7 +4554,7 @@ Table Table_and_SSCPs_extractMahalanobisWhere (Table me, SSCPs thee, double numb
 		long numberOfGroups = thy size;
 		autoTable him = Table_create (0, my numberOfColumns);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-			autostring newLabel = Melder_wcsdup (my columnHeaders[icol].label);
+			autostring32 newLabel = Melder_dup (my columnHeaders[icol].label);
 			his columnHeaders[icol].label = newLabel.transfer();
 		}
 		autoOrdered covs = Ordered_create ();
@@ -4577,10 +4567,10 @@ Table Table_and_SSCPs_extractMahalanobisWhere (Table me, SSCPs thee, double numb
 			long irow = selectedRows[i];
 			long igroup = 1; // if factorColIndex == 0 we don't need labels
 			if (factorColIndex > 0) {
-				const wchar_t *label = Table_getStringValue_Assert (me, irow, factorColIndex);
+				const char32 *label = Table_getStringValue_Assert (me, irow, factorColIndex);
 				igroup = SSCPs_findIndexOfGroupLabel (thee, label);
 				if (igroup == 0) {
-					Melder_throw ("The label \"", label, "\" in row ", Melder_integer (irow), " is not valid in this context.");
+					Melder_throw (U"The label \"", label, U"\" in row ", irow, U" is not valid in this context.");
 				}
 			}
 			Covariance covi = (Covariance) covs -> item[igroup];
@@ -4596,21 +4586,21 @@ Table Table_and_SSCPs_extractMahalanobisWhere (Table me, SSCPs thee, double numb
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, "Table (mahalanobis) not extracted.");
+		Melder_throw (me, U"Table (mahalanobis) not extracted.");
 	}
 }
 
-Table Table_extractMahalanobisWhere(Table me, const wchar_t *columnLabels, const wchar_t *factorColumn, double numberOfSigmas, int which_Melder_NUMBER, const wchar_t *formula, Interpreter interpreter) {
+Table Table_extractMahalanobisWhere(Table me, const char32 *columnLabels, const char32 *factorColumn, double numberOfSigmas, int which_Melder_NUMBER, const char32 *formula, Interpreter interpreter) {
 	try {
 		autoSSCPs thee = Table_to_SSCPsWhere (me, columnLabels, factorColumn, formula, interpreter);
 		autoTable him = Table_and_SSCPs_extractMahalanobisWhere (me, thee.peek(), numberOfSigmas, which_Melder_NUMBER, factorColumn, formula, interpreter);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, "Table not extracted.");
+		Melder_throw (me, U"Table not extracted.");
 	}
 }
 
-void Table_drawEllipsesWhere (Table me, Graphics g, long xcolumn, long ycolumn, long factorColumn, double xmin, double xmax, double ymin, double ymax, double numberOfSigmas, long labelSize, int garnish, const wchar_t *formula, Interpreter interpreter) {
+void Table_drawEllipsesWhere (Table me, Graphics g, long xcolumn, long ycolumn, long factorColumn, double xmin, double xmax, double ymin, double ymax, double numberOfSigmas, long labelSize, int garnish, const char32 *formula, Interpreter interpreter) {
 	try {
 		long numberOfSelectedRows = 0;
 		autoNUMvector<long> selectedRows (Table_findRowsMatchingCriterion (me, formula, interpreter, &numberOfSelectedRows), 1);	
@@ -4618,7 +4608,7 @@ void Table_drawEllipsesWhere (Table me, Graphics g, long xcolumn, long ycolumn,
 		for (long i = 1; i <= numberOfSelectedRows; i++) {
 			double x = Table_getNumericValue_Assert (me, selectedRows[i], xcolumn);
 			double y = Table_getNumericValue_Assert (me, selectedRows[i], ycolumn);
-			const wchar_t *label = Table_getStringValue_Assert (me, selectedRows[i], factorColumn);
+			const char32 *label = Table_getStringValue_Assert (me, selectedRows[i], factorColumn);
 			thy data[i][1] = x; thy data[i][2] = y;
 			TableOfReal_setRowLabel (thee.peek(), i, label);
 		}
@@ -4640,17 +4630,39 @@ void Table_drawEllipsesWhere (Table me, Graphics g, long xcolumn, long ycolumn,
 
 		if (garnish) {
 			Graphics_drawInnerBox (g);
-			Graphics_marksBottom (g, 2, TRUE, TRUE, FALSE);
-			Graphics_marksLeft (g, 2, TRUE, TRUE, FALSE);
+			Graphics_marksBottom (g, 2, true, true, false);
+			Graphics_marksLeft (g, 2, true, true, false);
 			if (my columnHeaders [xcolumn]. label) {
-				Graphics_textBottom (g, TRUE, my columnHeaders[xcolumn].label);
+				Graphics_textBottom (g, true, my columnHeaders[xcolumn].label);
 			}
 			if (my columnHeaders [ycolumn]. label) {
-				Graphics_textLeft (g, TRUE, my columnHeaders[ycolumn].label);
+				Graphics_textLeft (g, true, my columnHeaders[ycolumn].label);
 			}
 		}
 	} catch (MelderError) {
 		Melder_clearError ();   // drawing errors shall be ignored
 	}
 }
+
+Table Table_extractColumnRanges (Table me, char32 *ranges) {
+	try {
+		long numberOfSelectedColumns, numberOfRows = my rows -> size;
+		autoNUMvector<long> columnRanges (NUMstring_getElementsOfRanges (ranges, my numberOfColumns, & numberOfSelectedColumns, nullptr, U"columnn number", true), 1);
+		autoTable thee = Table_createWithoutColumnNames (numberOfRows, numberOfSelectedColumns); 
+		for (long icol = 1; icol <= numberOfSelectedColumns; icol++) {
+			Table_setColumnLabel (thee.peek(), icol, my v_getColStr (columnRanges[icol]));
+		}
+		for (long irow = 1; irow <= numberOfRows; irow++) {
+			//TableRow row = (TableRow)  thy rows -> item[irow];
+			for (long icol = 1; icol <= numberOfSelectedColumns; icol++) {
+				const char32 *value = Table_getStringValue_Assert (me, irow, columnRanges[icol]);
+				Table_setStringValue (thee.peek(), irow, icol, value);
+			}
+		}
+		return thee.transfer();
+	} catch (MelderError) {
+		Melder_throw (me, U": no column range extracted.");
+	}
+}
+
 /* End of file Table_extensions.cpp */
diff --git a/dwtools/Table_extensions.h b/dwtools/Table_extensions.h
index 9a87237..8787f07 100644
--- a/dwtools/Table_extensions.h
+++ b/dwtools/Table_extensions.h
@@ -2,7 +2,7 @@
 #define _Table_extensions_h_
 /* Table_extensions.h
  *
- * Copyright (C) 1993-2014 David Weenink
+ * Copyright (C) 1993-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,8 +32,8 @@
 #include "SSCP.h"
 #include "Table.h"
 
-long Table_getNumberOfRowsWhere (Table me, const wchar_t *formula, Interpreter interpreter);
-long *Table_findRowsMatchingCriterion (Table me, const wchar_t *formula, Interpreter interpreter, long *numberOfMatches);
+long Table_getNumberOfRowsWhere (Table me, const char32 *formula, Interpreter interpreter);
+long *Table_findRowsMatchingCriterion (Table me, const char32 *formula, Interpreter interpreter, long *numberOfMatches);
 Table Table_createFromPetersonBarneyData ();
 Table Table_createFromPolsVanNieropData ();
 Table Table_createFromWeeninkData ();
@@ -43,39 +43,40 @@ Table Table_createFromGanongData ();
 double Table_getMedianAbsoluteDeviation (Table me, long columnNumber);
 
 // Two one-way tests for normal and non-normally distributed data, respectively.
-Table Table_getOneWayAnalysisOfVarianceF (Table me, long column, long groupColumn, Table *means, Table *meansDiff, Table *meansDiffProbabilities);
+autoTable Table_getOneWayAnalysisOfVarianceF (Table me, long column, long groupColumn, autoTable *means, autoTable *meansDiff, autoTable *meansDiffProbabilities);
+
 Table Table_getOneWayKruskalWallis (Table me, long column, long groupColumn, double *degreesOfFreedom, double *kruskalWallis, double *probability);
 
 Table Table_getTwoWayAnalysisOfVarianceF (Table me, long column, long groupColumnA, long groupColumnB, Table *means, Table *factorLevelSizes);
 
 void Table_verticalErrorBarsPlotWhere (Table me, Graphics g, long xcolumn, long ycolumn, double xmin, double xmax, 
-	double ymin, double ymax, long yci_min, long yci_max, double bar_mm, int garnish, const wchar_t *formula, Interpreter interpreter);
+	double ymin, double ymax, long yci_min, long yci_max, double bar_mm, int garnish, const char32 *formula, Interpreter interpreter);
 void Table_horizontalErrorBarsPlotWhere (Table me, Graphics g, long xcolumn, long ycolumn, double xmin, double xmax, 
-	double ymin, double ymax, long xci_min, long xci_max, double bar_mm, int garnish, const wchar_t *formula, Interpreter interpreter);
+	double ymin, double ymax, long xci_min, long xci_max, double bar_mm, int garnish, const char32 *formula, Interpreter interpreter);
 
 
-void Table_normalProbabilityPlot (Table me, Graphics g, long column, long numberOfQuantiles, double numberOfSigmas, int labelSize, const wchar_t *label, int garnish);
+void Table_normalProbabilityPlot (Table me, Graphics g, long column, long numberOfQuantiles, double numberOfSigmas, int labelSize, const char32 *label, int garnish);
 
-void Table_quantileQuantilePlot (Table me, Graphics g, long xcolumn, long ycolumn, long numberOfQuantiles, double xmin, double xmax, double ymin, double ymax, int labelSize, const wchar_t *label, int garnish);
+void Table_quantileQuantilePlot (Table me, Graphics g, long xcolumn, long ycolumn, long numberOfQuantiles, double xmin, double xmax, double ymin, double ymax, int labelSize, const char32 *label, int garnish);
 
-void Table_quantileQuantilePlot_betweenLevels (Table me, Graphics g, long dataColumn, long factorColumn, wchar_t *xlevel, wchar_t *ylevel, long numberOfQuantiles, double xmin, double xmax, double ymin, double ymax, int labelSize, const wchar_t *label, int garnish);
+void Table_quantileQuantilePlot_betweenLevels (Table me, Graphics g, long dataColumn, long factorColumn, const char32 *xlevel, const char32 *ylevel, long numberOfQuantiles, double xmin, double xmax, double ymin, double ymax, int labelSize, const char32 *label, int garnish);
 
 void Table_boxPlots (Table me, Graphics g, long dataColumn, long factorColumn, double ymin, double ymax, int garnish);
-void Table_boxPlotsWhere (Table me, Graphics g, wchar_t *dataColumns_string, long factorColumn, double ymin, double ymax, int garnish, const wchar_t *formula, Interpreter interpreter);
-
-Table Table_extractRowsWhere (Table me, const wchar_t *formula, Interpreter interpreter);
+void Table_boxPlotsWhere (Table me, Graphics g, char32 *dataColumns_string, long factorColumn, double ymin, double ymax, int garnish, const char32 *formula, Interpreter interpreter);
 
-Table Table_extractMahalanobisWhere (Table me, const wchar_t *columnLabels, const wchar_t *factorColumn, double numberOfSigmas, int which_Melder_NUMBER, const wchar_t *formula, Interpreter interpreter);
+Table Table_extractRowsWhere (Table me, const char32 *formula, Interpreter interpreter);
+Table Table_extractColumnRanges (Table me, char32 *ranges);
+Table Table_extractMahalanobisWhere (Table me, const char32 *columnLabels, const char32 *factorColumn, double numberOfSigmas, int which_Melder_NUMBER, const char32 *formula, Interpreter interpreter);
 
-void Table_distributionPlotWhere (Table me, Graphics g, long dataColumn, double minimum, double maximum, long nBins, double freqMin, double freqMax, int garnish, const wchar_t *formula, Interpreter interpreter);
+void Table_distributionPlotWhere (Table me, Graphics g, long dataColumn, double minimum, double maximum, long nBins, double freqMin, double freqMax, int garnish, const char32 *formula, Interpreter interpreter);
 
-void Table_barPlotWhere (Table me, Graphics g, const wchar_t *columnLabels, double ymin, double ymax, const wchar_t *labelColumn, double xoffsetFraction, double interbarFraction, double interbarsFraction, const wchar_t *colours, double angle, int garnish, const wchar_t *formula, Interpreter interpreter);
+void Table_barPlotWhere (Table me, Graphics g, const char32 *columnLabels, double ymin, double ymax, const char32 *labelColumn, double xoffsetFraction, double interbarFraction, double interbarsFraction, const char32 *colours, double angle, int garnish, const char32 *formula, Interpreter interpreter);
 
-void Table_lineGraphWhere (Table me, Graphics g, long xcolumn, double xmin, double xmax, long ycolumn, double ymin, double ymax, const wchar_t *symbol, double angle, int garnish, const wchar_t *formula, Interpreter interpreter);
+void Table_lineGraphWhere (Table me, Graphics g, long xcolumn, double xmin, double xmax, long ycolumn, double ymin, double ymax, const char32 *symbol, double angle, int garnish, const char32 *formula, Interpreter interpreter);
 
-void Table_lagPlotWhere (Table me, Graphics g, long column, long lag, double xmin, double xmax, const wchar_t *symbol, int labelSize, int garnish, const wchar_t *formula, Interpreter interpreter);
+void Table_lagPlotWhere (Table me, Graphics g, long column, long lag, double xmin, double xmax, const char32 *symbol, int labelSize, int garnish, const char32 *formula, Interpreter interpreter);
 
-void Table_drawEllipsesWhere (Table me, Graphics g, long xcolumn, long ycolumn, long labelcolumn, double xmin, double xmax, double ymin, double ymax, double numberOfSigmas, long labelSize, int garnish, const wchar_t *formula, Interpreter interpreter);
+void Table_drawEllipsesWhere (Table me, Graphics g, long xcolumn, long ycolumn, long labelcolumn, double xmin, double xmax, double ymin, double ymax, double numberOfSigmas, long labelSize, int garnish, const char32 *formula, Interpreter interpreter);
 
 void Table_printAsAnovaTable (Table me);
 void Table_printAsMeansTable (Table me);
diff --git a/dwtools/TextGrid_extensions.cpp b/dwtools/TextGrid_extensions.cpp
index d3c2cf2..5cb4d60 100644
--- a/dwtools/TextGrid_extensions.cpp
+++ b/dwtools/TextGrid_extensions.cpp
@@ -1,6 +1,6 @@
 /* TextGrid_extensions.cpp
  *
- * Copyright (C) 1993-2014 David Weenink
+ * Copyright (C) 1993-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -147,7 +147,9 @@ static int isTimitWord (const char label[]) {
 }
 
 Any TextGrid_TIMITLabelFileRecognizer (int nread, const char *header, MelderFile file) {
-	long it[5]; int length, phnFile = 0; char hkruis[3] = "h#", label1[512], label2[512];
+	char hkruis[3] = "h#", label1[512], label2[512];
+	int length, phnFile = 0;
+	long it[5]; 
 	if (nread < 12 ||
 	        sscanf (header, "%ld%ld%s%n\n", &it[1], &it[2], label1, &length) != 3 ||
 	        it[1] < 0 || it[2] <= it[1] ||
@@ -168,17 +170,17 @@ Any TextGrid_TIMITLabelFileRecognizer (int nread, const char *header, MelderFile
 	return TextGrid_readFromTIMITLabelFile (file, phnFile);
 }
 
-static void IntervalTier_add (IntervalTier me, double xmin, double xmax, const wchar_t *label) {
+static void IntervalTier_add (IntervalTier me, double xmin, double xmax, const char32 *label) {
 	long i = IntervalTier_timeToIndex (me, xmin); // xmin is in interval i
 	if (i < 1) {
-		Melder_throw ("Index too low.");
+		Melder_throw (U"Index too low.");
 	}
 
 	autoTextInterval newti = TextInterval_create (xmin, xmax, label);
 	TextInterval interval = (TextInterval) my intervals -> item[i];
 	double xmaxi = interval -> xmax;
 	if (xmax > xmaxi) {
-		Melder_throw ("Don't know what to do");    // Don't know what to do
+		Melder_throw (U"Don't know what to do");    // Don't know what to do
 	}
 	if (xmin == interval -> xmin) {
 		if (xmax == interval -> xmax) { // interval already present
@@ -208,7 +210,7 @@ TextGrid TextGrid_readFromTIMITLabelFile (MelderFile file, int phnFile) {
 		// Ending time will only be known after all labels have been read.
 		// We start with a sufficiently long duration (one hour) and correct this later.
 
-		autoTextGrid me = TextGrid_create (0, 3600, L"wrd", 0);
+		autoTextGrid me = TextGrid_create (0.0, 3600.0, U"wrd", 0);
 		IntervalTier timit = (IntervalTier) my tiers -> item[1];
 		long linesRead = 0;
 		char line[200], label[200];
@@ -216,10 +218,10 @@ TextGrid TextGrid_readFromTIMITLabelFile (MelderFile file, int phnFile) {
 			long it1, it2;
 			linesRead++;
 			if (sscanf (line, "%ld%ld%s", &it1, &it2, label) != 3) {
-				Melder_throw ("Incorrect number of items.");
+				Melder_throw (U"Incorrect number of items.");
 			}
 			if (it1 < 0 || it2 <= it1) {
-				Melder_throw (L"Incorrect time at line ", linesRead);
+				Melder_throw (U"Incorrect time at line ", linesRead);
 			}
 			xmax = it2 * dt;
 			double xmin = it1 * dt;
@@ -230,26 +232,26 @@ TextGrid TextGrid_readFromTIMITLabelFile (MelderFile file, int phnFile) {
 				// Instead they start with "<number1> <number2> h#", where number1 > 0.
 				// We override number1 with 0. */
 
-				if (xmin > 0 && phnFile) {
-					xmin = 0;
+				if (xmin > 0.0 && phnFile) {
+					xmin = 0.0;
 				}
 			}
 			TextInterval interval = (TextInterval) timit -> intervals -> item[ni];
 			if (xmin < interval -> xmax && linesRead > 1) {
 				xmin = interval -> xmax;
-				Melder_warning (L"File \"", MelderFile_messageName (file), L"\": Start time set to previous end "
-				                 "time for label at line ", Melder_integer (linesRead), L".");
+				Melder_warning (U"File \"", MelderFile_messageName (file), U"\": Start time set to previous end "
+				                 U"time for label at line ", linesRead, U".");
 			}
 			// standard: new TextInterval
 			const char *labelstring = (strncmp (label, "h#", 2) ? label : TIMIT_DELIMITER);
-			IntervalTier_add (timit, xmin, xmax, Melder_peekUtf8ToWcs (labelstring));
+			IntervalTier_add (timit, xmin, xmax, Melder_peek8to32 (labelstring));
 		}
 
 		// Now correct the end times, based on last read interval.
 		// (end time was set to large value!)
 
 		if (timit -> intervals -> size < 2) {
-			Melder_throw ("Empty TextGrid");
+			Melder_throw (U"Empty TextGrid");
 		}
 		Collection_removeItem (timit -> intervals, timit -> intervals -> size);
 		TextInterval interval = (TextInterval) timit -> intervals -> item[timit -> intervals -> size];
@@ -257,21 +259,21 @@ TextGrid TextGrid_readFromTIMITLabelFile (MelderFile file, int phnFile) {
 		my xmax = xmax;
 		if (phnFile) { // Create tier 2 with IPA symbols
 			autoIntervalTier ipa = Data_copy (timit);
-			Thing_setName (ipa.peek(), L"ipa");
+			Thing_setName (ipa.peek(), U"ipa");
 			// First change the data in ipa
 			for (long i = 1; i <= ipa -> intervals -> size; i++) {
 				interval = (TextInterval) timit -> intervals -> item[i];
 
-				TextInterval_setText ( (TextInterval) ipa -> intervals -> item[i],
-				                       Melder_peekUtf8ToWcs (timitLabelToIpaLabel (Melder_peekWcsToUtf8 (interval -> text))));
+				TextInterval_setText ((TextInterval) ipa -> intervals -> item[i],
+					Melder_peek8to32 (timitLabelToIpaLabel (Melder_peek32to8 (interval -> text))));
 			}
 			Collection_addItem (my tiers, ipa.transfer()); // Then: add to collection
-			Thing_setName (timit, L"phn");  // rename wrd
+			Thing_setName (timit, U"phn");  // rename wrd
 		}
 		f.close (file);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrid not read from file ", file, ".");
+		Melder_throw (U"TextGrid not read from file ", file, U".");
 	}
 }
 
@@ -307,16 +309,16 @@ TextGrid TextGrids_merge (TextGrid me, TextGrid thee) {
 		}
 		return g1.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": not merged.");
+		Melder_throw (me, U" & ", thee, U": not merged.");
 	}
 }
 
-void IntervalTier_setLaterEndTime (IntervalTier me, double xmax, const wchar_t *mark) {
+void IntervalTier_setLaterEndTime (IntervalTier me, double xmax, const char32 *mark) {
 	try {
 		if (xmax <= my xmax) return; // nothing to be done
 		TextInterval ti = (TextInterval) my intervals -> item[my intervals -> size];
 		Melder_assert (xmax > ti -> xmax);
-		if (mark != NULL) {
+		if (mark) {
 			autoTextInterval interval = TextInterval_create (ti -> xmax, xmax, mark);
 			Collection_addItem (my intervals, interval.transfer());
 		} else {
@@ -325,16 +327,16 @@ void IntervalTier_setLaterEndTime (IntervalTier me, double xmax, const wchar_t *
 		}
 		my xmax = xmax;
 	} catch (MelderError) {
-		Melder_throw (L"Larger end time of IntervalTier not set.");
+		Melder_throw (U"Larger end time of IntervalTier not set.");
 	}
 }
 
-void IntervalTier_setEarlierStartTime (IntervalTier me, double xmin, const wchar_t *mark) {
+void IntervalTier_setEarlierStartTime (IntervalTier me, double xmin, const char32 *mark) {
 	try {
 		if (xmin >= my xmin) return; // nothing to be done
 		TextInterval ti = (TextInterval) my intervals -> item[1];
 		Melder_assert (xmin < ti -> xmin);
-		if (mark != NULL) {
+		if (mark) {
 			autoTextInterval interval = TextInterval_create (xmin, ti -> xmin, mark);
 			Collection_addItem (my intervals, interval.transfer());
 		} else {
@@ -343,83 +345,84 @@ void IntervalTier_setEarlierStartTime (IntervalTier me, double xmin, const wchar
 		}
 		my xmin = xmin;
 	} catch (MelderError) {
-		Melder_throw (L"Earlier start time of IntervalTier not set.");
+		Melder_throw (U"Earlier start time of IntervalTier not set.");
 	}
 }
 
 void IntervalTier_moveBoundary (IntervalTier me, long iint, bool atStart, double newTime) {
     try {
         if (iint < 1 or iint > my intervals -> size) {
-            Melder_throw ("Interval out of range.");
+            Melder_throw (U"Interval out of range.");
         }
         if ((iint == 1 && atStart) or ((iint == my intervals -> size && not atStart))) {
-            Melder_throw ("Cannot change the domain.");
+            Melder_throw (U"Cannot change the domain.");
         }
         TextInterval interval = (TextInterval) my intervals -> item[iint];
         if (atStart) {
             TextInterval pinterval = (TextInterval) my intervals -> item[iint-1];
             if (newTime <= pinterval -> xmin) {
-                Melder_throw ("Cannot move past the start of previous interval.");
+                Melder_throw (U"Cannot move past the start of previous interval.");
             }
             pinterval -> xmax = interval -> xmin = newTime;
         } else {
             TextInterval ninterval = (TextInterval) my intervals -> item[iint+1];
             if (newTime >= ninterval -> xmax) {
-                Melder_throw ("Cannot move past the end of next interval.");
+                Melder_throw (U"Cannot move past the end of next interval.");
             }
             ninterval -> xmin = interval -> xmax = newTime;
         }
     } catch (MelderError) {
-        Melder_throw (me, ": boundary not moved.");
+        Melder_throw (me, U": boundary not moved.");
     }
 }
 
 
-void TextTier_setLaterEndTime (TextTier me, double xmax, const wchar_t *mark) {
+void TextTier_setLaterEndTime (TextTier me, double xmax, const char32 *mark) {
 	try {
 		if (xmax <= my xmax) return; // nothing to be done
-		if (mark != NULL) {
+		if (mark) {
 			autoTextPoint textpoint = TextPoint_create (my xmax, mark);
 			Collection_addItem (my points, textpoint.transfer());
 		}
 		my xmax = xmax;
 	} catch (MelderError) {
-		Melder_throw (L"Larger end time of TextTier not set.");
+		Melder_throw (U"Larger end time of TextTier not set.");
 	}
 }
 
-void TextTier_setEarlierStartTime (TextTier me, double xmin, const wchar_t *mark) {
+void TextTier_setEarlierStartTime (TextTier me, double xmin, const char32 *mark) {
 	try {
 		if (xmin >= my xmin) return; // nothing to be done
-		if (mark != NULL) {
+		if (mark) {
 			autoTextPoint textpoint = TextPoint_create (my xmin, mark);
 			Collection_addItem (my points, textpoint.transfer());
 		}
 		my xmin = xmin;
 	} catch (MelderError) {
-		Melder_throw (L"Earlier start time of TextTier not set.");
+		Melder_throw (U"Earlier start time of TextTier not set.");
 	}
 }
 
-void TextGrid_setEarlierStartTime (TextGrid me, double xmin, const wchar_t *imark, const wchar_t *pmark) {
+void TextGrid_setEarlierStartTime (TextGrid me, double xmin, const char32 *imark, const char32 *pmark) {
 	try {
-		if (xmin >= my xmin) return;
+		if (xmin >= my xmin) {
+			return;
+		}
 		for (long tierNumber = 1 ; tierNumber <= my tiers -> size; tierNumber++) {
 			Function tier = (Function) my tiers -> item [tierNumber];
 			if (tier -> classInfo == classIntervalTier) {
 				IntervalTier_setEarlierStartTime ((IntervalTier) tier, xmin, imark);
-
 			} else {
 				TextTier_setEarlierStartTime ((TextTier) tier, xmin, pmark);
 			}
 		}
 		my xmin = xmin;
 	} catch (MelderError) {
-		Melder_throw (L"Earlier start time of TextGrid not set.");
+		Melder_throw (U"Earlier start time of TextGrid not set.");
 	}
 }
 
-void TextGrid_setLaterEndTime (TextGrid me, double xmax, const wchar_t *imark, const wchar_t *pmark) {
+void TextGrid_setLaterEndTime (TextGrid me, double xmax, const char32 *imark, const char32 *pmark) {
 	try {
 		if (xmax <= my xmax) return;
 		for (long tierNumber =1 ; tierNumber <= my tiers -> size; tierNumber++) {
@@ -433,7 +436,7 @@ void TextGrid_setLaterEndTime (TextGrid me, double xmax, const wchar_t *imark, c
 		}
 		my xmax = xmax;
 	} catch (MelderError) {
-		Melder_throw (L"Larger end time of TextGrid not set.");
+		Melder_throw (U"Larger end time of TextGrid not set.");
 	}
 }
 
@@ -470,26 +473,26 @@ void TextGrid_extendTime (TextGrid me, double extra_time, int position) {
 			}
 			if (anyTier -> classInfo == classIntervalTier) {
 				IntervalTier tier = (IntervalTier) anyTier;
-				autoTextInterval interval = TextInterval_create (tmin, tmax, L"");
+				autoTextInterval interval = TextInterval_create (tmin, tmax, U"");
 				Collection_addItem (tier -> intervals, interval.transfer());
 			}
 		}
 		my xmin = xmin;
 		my xmax = xmax;
 	} catch (MelderError) {
-		Melder_throw (me, ": time not extended.");
+		Melder_throw (me, U": time not extended.");
 	}
 }
 
-void TextGrid_setTierName (TextGrid me, long itier, const wchar_t *newName) {
+void TextGrid_setTierName (TextGrid me, long itier, const char32 *newName) {
 	try {
 		long ntiers = my tiers -> size;
 
-		if (itier < 1 || itier > ntiers) Melder_throw ("Tier number (", itier, ") should not be "
-			        "larger than the number of tiers (", ntiers, L").");
+		if (itier < 1 || itier > ntiers) Melder_throw (U"Tier number (", itier, U") should not be "
+			        U"larger than the number of tiers (", ntiers, U").");
 		Thing_setName ( (Thing) my tiers -> item [itier], newName);
 	} catch (MelderError) {
-		Melder_throw (me, ": tier name not set.");
+		Melder_throw (me, U": tier name not set.");
 	}
 }
 
@@ -522,28 +525,28 @@ static void IntervalTier_cutInterval (IntervalTier me, long index, int extend_op
 	}
 }
 
-void IntervalTier_removeBoundariesBetweenIdenticallyLabeledIntervals (IntervalTier me, const wchar_t *label) {
+void IntervalTier_removeBoundariesBetweenIdenticallyLabeledIntervals (IntervalTier me, const char32 *label) {
     try {
         for (long iint = my intervals -> size; iint > 1; iint--) {
             TextInterval ti = (TextInterval) my intervals -> item[iint];
-            if (Melder_wcsequ (ti -> text, label)) {
+            if (Melder_equ (ti -> text, label)) {
                 TextInterval tim1 = (TextInterval) my intervals -> item[iint - 1];
-                if (Melder_wcsequ (tim1 -> text, label)) {
+                if (Melder_equ (tim1 -> text, label)) {
                     Melder_free (tim1 -> text);
                     IntervalTier_removeLeftBoundary (me, iint);
                 }
             }
         }
     } catch (MelderError) {
-        Melder_throw (me, ": boundaries not removed.");
+        Melder_throw (me, U": boundaries not removed.");
     }
 }
 
-void IntervalTier_cutIntervals_minimumDuration (IntervalTier me, const wchar_t *label, double minimumDuration) {
+void IntervalTier_cutIntervals_minimumDuration (IntervalTier me, const char32 *label, double minimumDuration) {
 	long i = 1;
 	while (i <= my intervals -> size) {
 		TextInterval ti = (TextInterval) my intervals -> item[i];
-		if ( (label == 0 || (ti -> text != 0 && wcsequ (ti -> text, label))) &&
+		if ( (! label || (ti -> text && str32equ (ti -> text, label))) &&
 		        ti -> xmax - ti -> xmin < minimumDuration) {
 			IntervalTier_cutInterval (me, i, 0);
 		} else {
@@ -552,13 +555,13 @@ void IntervalTier_cutIntervals_minimumDuration (IntervalTier me, const wchar_t *
 	}
 }
 
-void IntervalTier_cutIntervalsOnLabelMatch (IntervalTier me, const wchar_t *label) {
+void IntervalTier_cutIntervalsOnLabelMatch (IntervalTier me, const char32 *label) {
 	long i = 1;
 	while (i < my intervals -> size) {
 		TextInterval ti = (TextInterval) my intervals -> item[i];
 		TextInterval tip1 = (TextInterval) my intervals -> item[i + 1];
-		if ( (label == 0 || (ti -> text != 0 && wcsequ (ti -> text, label))) &&
-		        (Melder_wcscmp (ti -> text, tip1 -> text) == 0)) {
+		if ( (! label || (ti -> text && str32equ (ti -> text, label))) &&
+		        (Melder_cmp (ti -> text, tip1 -> text) == 0)) {
 
 			IntervalTier_cutInterval (me, i, 1);
 		} else {
@@ -567,7 +570,7 @@ void IntervalTier_cutIntervalsOnLabelMatch (IntervalTier me, const wchar_t *labe
 	}
 }
 
-void IntervalTier_changeLabels (I, long from, long to, const wchar_t *search, const wchar_t *replace, int use_regexp, long *nmatches, long *nstringmatches) {
+void IntervalTier_changeLabels (I, long from, long to, const char32 *search, const char32 *replace, int use_regexp, long *nmatches, long *nstringmatches) {
 	iam (IntervalTier);
 	try {
 		if (from == 0) {
@@ -577,32 +580,33 @@ void IntervalTier_changeLabels (I, long from, long to, const wchar_t *search, co
 			to = my intervals -> size;
 		}
 		if (from > to || from < 1 || to > my intervals -> size) {
-			Melder_throw ("Incorrect specification of where to act.");
+			Melder_throw (U"Incorrect specification of where to act.");
+		}
+		if (use_regexp && str32len (search) == 0) {
+			Melder_throw (U"The regex search string cannot be empty.\nYou may search for an empty string with the expression \"^$\"");
 		}
-		if (use_regexp && wcslen (search) == 0) Melder_throw ("The regex search string cannot be empty.\n"
-			        "You may search for an empty string with the expression \"^$\"");
 
 		long nlabels = to - from + 1;
-		autoNUMvector<wchar_t *> labels (1, nlabels);
+		autoNUMvector<char32 *> labels (1, nlabels);
 
 		for (long i = from; i <= to; i++) {
 			TextInterval interval = (TextInterval) my intervals -> item[i];
 			labels[i - from + 1] = interval -> text;   // Shallow copy.
 		}
-		autostringvector newlabels (strs_replace (labels.peek(), 1, nlabels, search, replace, 0, nmatches, nstringmatches, use_regexp), 1, nlabels);
+		autostring32vector newlabels (strs_replace (labels.peek(), 1, nlabels, search, replace, 0, nmatches, nstringmatches, use_regexp), 1, nlabels);
 
 		for (long i = from; i <= to; i++) {
 			TextInterval interval = (TextInterval) my intervals -> item[i];
 			Melder_free (interval -> text);
 			interval -> text = newlabels[i - from + 1];   // Transfer of ownership.
-			newlabels[i - from + 1] = 0;
+			newlabels[i - from + 1] = nullptr;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": labels not changed.");
+		Melder_throw (me, U": labels not changed.");
 	}
 }
 
-void TextTier_changeLabels (I, long from, long to, const wchar_t *search, const wchar_t *replace, int use_regexp, long *nmatches, long *nstringmatches) {
+void TextTier_changeLabels (I, long from, long to, const char32 *search, const char32 *replace, int use_regexp, long *nmatches, long *nstringmatches) {
 	iam (TextTier);
 	try {
 		if (from == 0) {
@@ -612,19 +616,19 @@ void TextTier_changeLabels (I, long from, long to, const wchar_t *search, const
 			to = my points -> size;
 		}
 		if (from > to || from < 1 || to > my points -> size) {
-			Melder_throw ("Incorrect specification of where to act.");
+			Melder_throw (U"Incorrect specification of where to act.");
+		}
+		if (use_regexp && str32len (search) == 0) {
+			Melder_throw (U"The regex search string cannot be empty.\nYou may search for an empty string with the expression \"^$\"");
 		}
-		if (use_regexp && wcslen (search) == 0) Melder_throw ("The regex search string cannot be empty.\n"
-			        "You may search for an empty string with the expression \"^$\"");
-
 		long nmarks = to - from + 1;
-		autoNUMvector<wchar_t *> marks (1, nmarks);
+		autoNUMvector<char32 *> marks (1, nmarks);
 
 		for (long i = from; i <= to; i++) {
 			TextPoint point = (TextPoint) my points -> item[i];
 			marks[i - from + 1] = point -> mark;   // Shallow copy.
 		}
-		autostringvector newmarks (strs_replace (marks.peek(), 1, nmarks, search, replace, 0, nmatches, nstringmatches, use_regexp), 1, nmarks);
+		autostring32vector newmarks (strs_replace (marks.peek(), 1, nmarks, search, replace, 0, nmatches, nstringmatches, use_regexp), 1, nmarks);
 
 		for (long i = from; i <= to; i++) {
 			TextPoint point = (TextPoint) my points -> item[i];
@@ -633,37 +637,39 @@ void TextTier_changeLabels (I, long from, long to, const wchar_t *search, const
 			newmarks[i - from + 1] = 0;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": no labels changed.");
+		Melder_throw (me, U": no labels changed.");
 	}
 }
 
-void TextGrid_changeLabels (TextGrid me, int tier, long from, long to, const wchar_t *search, const wchar_t *replace, int use_regexp, long *nmatches, long *nstringmatches) {
+void TextGrid_changeLabels (TextGrid me, int tier, long from, long to, const char32 *search, const char32 *replace, int use_regexp, long *nmatches, long *nstringmatches) {
 	try {
 		long ntiers = my tiers -> size;
 
-		if (tier < 1 || tier > ntiers) Melder_throw ("The tier number (", tier, ") should not be "
-			        "larger than the number of tiers (", ntiers, ").");
-		if (use_regexp && wcslen (search) == 0) Melder_throw ("The regex search string cannot be empty.\n"
-			        "You may search for an empty string with the expression \"^$\"");
-		Data anyTier = (Data) my tiers -> item [tier];
+		if (tier < 1 || tier > ntiers) {
+			Melder_throw (U"The tier number (", tier, U") should not be larger than the number of tiers (", ntiers, U").");
+		}
+		if (use_regexp && str32len (search) == 0) {
+			Melder_throw (U"The regex search string cannot be empty.\nYou may search for an empty string with the expression \"^$\"");
+		}
+		Daata anyTier = (Daata) my tiers -> item [tier];
 		if (anyTier -> classInfo == classIntervalTier) {
 			IntervalTier_changeLabels (anyTier, from, to, search, replace, use_regexp, nmatches, nstringmatches);
 		} else {
 			TextTier_changeLabels (anyTier, from, to, search, replace, use_regexp, nmatches, nstringmatches);
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": labels not changed");
+		Melder_throw (me, U": labels not changed.");
 	}
 }
 
 static void IntervalTier_checkStartAndEndTime (IntervalTier me) {
 	TextInterval ti = (TextInterval) my intervals -> item[1];
 	if (my xmin != ti -> xmin) {
-		Melder_throw (me, ": start time of first interval doesn't match start time of the tier.");
+		Melder_throw (me, U": start time of first interval doesn't match start time of the tier.");
 	}
 	ti = (TextInterval) my intervals -> item[my intervals -> size];
 	if (my xmax != ti -> xmax) {
-		Melder_throw (me, ": end time of last interval doesn't match end time of the tier.");
+		Melder_throw (me, U": end time of last interval doesn't match end time of the tier.");
 	}
 }
 
@@ -675,12 +681,12 @@ void IntervalTiers_append_inline (IntervalTier me, IntervalTier thee, bool prese
 		IntervalTier_checkStartAndEndTime (thee);
         double xmax_previous = my xmax, time_shift = my xmax - thy xmin;
 		if (preserveTimes && my xmax < thy xmin) {
-			autoTextInterval connection = TextInterval_create (my xmax, thy xmin, L"");
+			autoTextInterval connection = TextInterval_create (my xmax, thy xmin, U"");
             xmax_previous = thy xmin;
 			Collection_addItem (my intervals, connection.transfer());
 		}
 		for (long iint = 1; iint <= thy intervals -> size; iint++) {
-			autoTextInterval ti = (TextInterval) Data_copy ((Data) thy intervals -> item[iint]);
+			autoTextInterval ti = (TextInterval) Data_copy ((Daata) thy intervals -> item[iint]);
 			if (preserveTimes) {
 				Collection_addItem (my intervals, ti.transfer());
 			} else {
@@ -702,7 +708,7 @@ void IntervalTiers_append_inline (IntervalTier me, IntervalTier thee, bool prese
 		}
 		my xmax = preserveTimes ? thy xmax : xmax_previous;
 	} catch (MelderError) {
-		Melder_throw ("IntervalTiers not appended.");
+		Melder_throw (U"IntervalTiers not appended.");
 	}
 }
 
@@ -710,7 +716,7 @@ void IntervalTiers_append_inline (IntervalTier me, IntervalTier thee, bool prese
 void TextTiers_append_inline (TextTier me, TextTier thee, bool preserveTimes) {
 	try {
 		for (long iint = 1; iint <= thy points -> size; iint++) {
-			autoTextPoint tp = (TextPoint) Data_copy ((Data) thy points -> item[iint]);
+			autoTextPoint tp = (TextPoint) Data_copy ((Daata) thy points -> item[iint]);
 			if (not preserveTimes) {
 				tp -> number += my xmax - thy xmin;
 			}
@@ -718,7 +724,7 @@ void TextTiers_append_inline (TextTier me, TextTier thee, bool preserveTimes) {
 		}
 		my xmax = preserveTimes ? thy xmax : my xmax + (thy xmax - thy xmin);
 	} catch (MelderError) {
-		Melder_throw ("TextTiers not appended.");
+		Melder_throw (U"TextTiers not appended.");
 	}
 }
 
@@ -726,9 +732,9 @@ static void TextGrid_checkStartAndEndTimesOfTiers (TextGrid me) {
 	for (long itier = 1; itier <= my tiers -> size; itier++) {
 		Function tier = (Function) my tiers -> item[itier];
 		if (tier -> xmin != my xmin) {
-			Melder_throw (me, ": the start time of tier ", Melder_integer (itier), " does not match the start time of its TextGrid.");
+			Melder_throw (me, U": the start time of tier ", itier, U" does not match the start time of its TextGrid.");
 		} else if (tier -> xmax != my xmax) {
-			Melder_throw (me, ": the end time of tier ", Melder_integer (itier), " does not match the end time of its TextGrid.");
+			Melder_throw (me, U": the end time of tier ", itier, U" does not match the end time of its TextGrid.");
 		}
 	}
 }
@@ -737,10 +743,10 @@ void TextGrids_append_inline (TextGrid me, TextGrid thee, bool preserveTimes)
 {
 	try {
 		if (my tiers -> size != thy tiers -> size) {
-			Melder_throw ("The number of tiers must be equal.");
+			Melder_throw (U"The number of tiers must be equal.");
 		}
 		if (preserveTimes && thy xmin < my xmax) {
-			Melder_throw ("The start time of the second TextGrid can't be earlier than the end time of the first one if you want to preserve times.");
+			Melder_throw (U"The start time of the second TextGrid can't be earlier than the end time of the first one if you want to preserve times.");
 		}
 		
 		TextGrid_checkStartAndEndTimesOfTiers (me); // all tiers must have the same start/end time as textgrid
@@ -748,42 +754,43 @@ void TextGrids_append_inline (TextGrid me, TextGrid thee, bool preserveTimes)
 		// last intervals must have the same end time
 		double xmax = preserveTimes ? thy xmax : my xmax + (thy xmax - thy xmin);
 		for (long itier = 1; itier <= my tiers -> size; itier++) {
-			Function myTier = (Function) my tiers -> item[itier], thyTier = (Function) thy tiers -> item[itier];
-			
+			Function myTier = my tier (itier), thyTier = thy tier (itier);
 			if (myTier -> classInfo == classIntervalTier && thyTier -> classInfo == classIntervalTier) {
-                IntervalTier ti = (IntervalTier) myTier;
-				IntervalTiers_append_inline (ti, (IntervalTier) thy tiers -> item[itier], preserveTimes);
-                // make sure last interval has correct end tTime
-                TextInterval last = (TextInterval) ti -> intervals -> item [ti -> intervals -> size];
-                last -> xmax = xmax;
-                Melder_assert (last -> xmax > last -> xmin);
+				IntervalTier  myIntervalTier = static_cast <IntervalTier>  (myTier);
+				IntervalTier thyIntervalTier = static_cast <IntervalTier> (thyTier);
+				IntervalTiers_append_inline (myIntervalTier, thyIntervalTier, preserveTimes);
+                // make sure last interval has correct end time
+                TextInterval lastInterval = myIntervalTier -> interval (myIntervalTier -> numberOfIntervals());
+                lastInterval -> xmax = xmax;
+                Melder_assert (lastInterval -> xmax > lastInterval -> xmin);
 			} else if (myTier -> classInfo == classTextTier && thyTier -> classInfo == classTextTier) {
-                TextTier ti = (TextTier) myTier;
-				TextTiers_append_inline (ti, (TextTier) thy tiers -> item [itier], preserveTimes);
-                ti -> xmax = xmax;
+				TextTier  myTextTier = static_cast <TextTier>  (myTier);
+				TextTier thyTextTier = static_cast <TextTier> (thyTier);
+				TextTiers_append_inline (myTextTier, thyTextTier, preserveTimes);
+                myTextTier -> xmax = xmax;
 			} else {
-				Melder_throw ("Tier number ", Melder_integer (itier), " in the second TextGrid is of different type as the corresponding tier in the first TextGrid.");
+				Melder_throw (U"Tier ", itier, U" in the second TextGrid is of a different type "
+					"than tier ", itier, U" in the first TextGrid.");
 			}
 		}
 		my xmax = xmax;
 	} catch (MelderError) {
-		Melder_throw ("TextGrids not appended.");
+		Melder_throw (U"TextGrids not appended.");
 	}
 }
 
 TextGrid TextGrids_to_TextGrid_appendContinuous (Collection me, bool preserveTimes) {
 	try {
-		if (my size == 1) {
-			return Data_copy ((TextGrid) my item[1]);
-		}
 		autoTextGrid thee = Data_copy ((TextGrid) my item[1]);
 		for (long igrid = 2; igrid <= my size; igrid++) {
 			TextGrids_append_inline (thee.peek(), (TextGrid) my item[igrid], preserveTimes);
 		}
-		if (not preserveTimes) Function_shiftXBy (thee.peek(), -thy xmin);
+		if (! preserveTimes) {
+			Function_shiftXBy (thee.peek(), -thy xmin);
+		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("No aligned TextGrid created from Collection.");
+		Melder_throw (U"No aligned TextGrid created from Collection.");
 	}
 }
 
diff --git a/dwtools/TextGrid_extensions.h b/dwtools/TextGrid_extensions.h
index c4f4873..7bc953e 100644
--- a/dwtools/TextGrid_extensions.h
+++ b/dwtools/TextGrid_extensions.h
@@ -77,18 +77,18 @@ void TextGrid_extendTime (TextGrid me, double delta_time, int position);
 	Interval tiers will have a new (empty) interval at the start or the end.
 */
 
-void TextGrid_setTierName (TextGrid me, long itier, const wchar_t *newName);
+void TextGrid_setTierName (TextGrid me, long itier, const char32 *newName);
 
-void TextTier_changeLabels (I, long from, long to, const wchar_t *search, const wchar_t *replace, int use_regexp, long *nmatches, long *nstringmatches);
+void TextTier_changeLabels (I, long from, long to, const char32 *search, const char32 *replace, int use_regexp, long *nmatches, long *nstringmatches);
 
-void IntervalTier_changeLabels (I, long from, long to, const wchar_t *search, const wchar_t *replace, int use_regexp, long *nmatches, long *nstringmatches);
+void IntervalTier_changeLabels (I, long from, long to, const char32 *search, const char32 *replace, int use_regexp, long *nmatches, long *nstringmatches);
 
-void IntervalTier_removeBoundariesBetweenIdenticallyLabeledIntervals (IntervalTier me, const wchar_t *label);
+void IntervalTier_removeBoundariesBetweenIdenticallyLabeledIntervals (IntervalTier me, const char32 *label);
 
-void IntervalTier_cutIntervalsOnLabelMatch (IntervalTier me, const wchar_t *label);
-void IntervalTier_cutIntervals_minimumDuration (IntervalTier me, const wchar_t *label, double minimumDuration);
+void IntervalTier_cutIntervalsOnLabelMatch (IntervalTier me, const char32 *label);
+void IntervalTier_cutIntervals_minimumDuration (IntervalTier me, const char32 *label, double minimumDuration);
 
-void TextGrid_changeLabels (TextGrid me, int tier, long from, long to, const wchar_t *search, const wchar_t *replace, int use_regexp, long *nmatches, long *nstringmatches);
+void TextGrid_changeLabels (TextGrid me, int tier, long from, long to, const char32 *search, const char32 *replace, int use_regexp, long *nmatches, long *nstringmatches);
 
 /* Set the start/end time to a smaller/larger value.
  * If mark is NULL, only times are changed
@@ -96,14 +96,14 @@ void TextGrid_changeLabels (TextGrid me, int tier, long from, long to, const wch
  *    For a TextTier this involves adding a point with the marker
  *    For an IntervalTier this involves adding a new interval
  */
-void IntervalTier_setLaterEndTime (IntervalTier me, double xmax, const wchar_t *mark);
-void IntervalTier_setEarlierStartTime (IntervalTier me, double xmin, const wchar_t *mark);
+void IntervalTier_setLaterEndTime (IntervalTier me, double xmax, const char32 *mark);
+void IntervalTier_setEarlierStartTime (IntervalTier me, double xmin, const char32 *mark);
 
 void IntervalTier_moveBoundary (IntervalTier me, long interval, bool atStart, double newTime);
-void TextTier_setLaterEndTime (TextTier me, double xmax, const wchar_t *mark);
-void TextTier_setEarlierStartTime (TextTier me, double xmin, const wchar_t *mark);
-void TextGrid_setEarlierStartTime (TextGrid me, double xmin, const wchar_t *imark, const wchar_t *pmark);
-void TextGrid_setLaterEndTime (TextGrid me, double xmax, const wchar_t *imark, const wchar_t *pmark);
+void TextTier_setLaterEndTime (TextTier me, double xmax, const char32 *mark);
+void TextTier_setEarlierStartTime (TextTier me, double xmin, const char32 *mark);
+void TextGrid_setEarlierStartTime (TextGrid me, double xmin, const char32 *imark, const char32 *pmark);
+void TextGrid_setLaterEndTime (TextGrid me, double xmax, const char32 *imark, const char32 *pmark);
 
 
 // Precondition: if (preserveTimes) { my xmax <= thy xmin }
diff --git a/dwtools/VowelEditor.cpp b/dwtools/VowelEditor.cpp
index 7703695..e1c2d52 100644
--- a/dwtools/VowelEditor.cpp
+++ b/dwtools/VowelEditor.cpp
@@ -1,6 +1,6 @@
-/* VowelEditor.c
+/* VowelEditor.cpp
  *
- * Copyright (C) 2008-2013 David Weenink
+ * Copyright (C) 2008-2013, 2015 David Weenink, 2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -93,9 +93,9 @@ Thing_implement (VowelEditor, Editor, 0);
 #define BUFFER_SIZE_SEC 4
 #define SAMPLING_FREQUENCY 44100
 
-#define STATUSINFO_STARTINTR0 L"Start (F1,F2,F0) = ("
-#define STATUSINFO_ENDINTR0 L"End (F1,F2,F0) = ("
-#define STATUSINFO_ENDING L")"
+#define STATUSINFO_STARTINTR0 U"Start (F1,F2,F0) = ("
+#define STATUSINFO_ENDINTR0 U"End (F1,F2,F0) = ("
+#define STATUSINFO_ENDING U")"
 #define MICROSECPRECISION(x) (round((x)*1000000)/1000000)
 
 // To prevent the generation of inaudible short Sounds we set a minimum duration
@@ -123,8 +123,8 @@ static void Sound_fadeOut (Sound me, double duration);
 static void PitchTier_newDuration (PitchTier me, structVowelEditor_F0 *f0p, double newDuration);
 static void FormantTier_newDuration (FormantTier me, double newDuration);
 static void FormantTier_drawF1F2Trajectory (FormantTier me, Graphics g, double f1min, double f1max, double f2min, double f2max, double markTraceEvery, double width);
-static FormantGrid FormantTier_to_FormantGrid (FormantTier me);
-static PitchTier VowelEditor_to_PitchTier (VowelEditor me, double duration);
+static autoFormantGrid FormantTier_to_FormantGrid (FormantTier me);
+static autoPitchTier VowelEditor_to_PitchTier (VowelEditor me, double duration);
 static void VowelEditor_updateF0Info (VowelEditor me);
 static void VowelEditor_updateExtendDuration (VowelEditor me);
 static double VowelEditor_updateDurationInfo (VowelEditor me);
@@ -133,10 +133,9 @@ static void VowelEditor_Vowel_addData (VowelEditor me, Vowel thee, double time,
 static void VowelEditor_getXYFromF1F2 (VowelEditor me, double f1, double f2, double *x, double *y);
 static void VowelEditor_getF1F2FromXY (VowelEditor me, double x, double y, double *f1, double *f2);
 static void VowelEditor_updateVowel (VowelEditor me);
-static Sound VowelEditor_createTarget (VowelEditor me);
+static autoSound VowelEditor_createTarget (VowelEditor me);
 static void VowelEditor_Vowel_reverseFormantTier (VowelEditor me);
 static void VowelEditor_shiftF1F2 (VowelEditor me, double f1_st, double f2_st);
-static void VowelEditor_setSource (VowelEditor me);
 static void VowelEditor_setMarks (VowelEditor me, int marksDataset, int speakerType, int fontSize);
 static void VowelEditor_setF3F4 (VowelEditor me, double f3, double b3, double f4, double b4);
 static void VowelEditor_getF3F4 (VowelEditor me, double f1, double f2, double *f3, double *b3, double *f4, double *b4);
@@ -147,10 +146,10 @@ static double Matrix_getValue (Matrix me, double x, double y);
 static void VowelEditor_drawBackground (VowelEditor me, Graphics g);
 static void createPersistentVowelMarks ();
 static void copyVowelMarksInPreferences_volatile (Table me);
-static Vowel Vowel_create (double duration);
-static Vowel Vowel_create_twoFormantSchwa (double duration);
+static autoVowel Vowel_create (double duration);
+static autoVowel Vowel_create_twoFormantSchwa (double duration);
 static void Vowel_newDuration (Vowel me, structVowelEditor_F0 *f0p, double newDuration);
-static Sound Vowel_to_Sound_pulses (Vowel me, double samplingFrequency, double adaptFactor, double adaptTime, long interpolationDepth);
+static autoSound Vowel_to_Sound_pulses (Vowel me, double samplingFrequency, double adaptFactor, double adaptTime, long interpolationDepth);
 // forward declarations end
 
 static struct structVowelEditor_F0 f0default = { 140.0, 0.0, 40.0, 2000.0, SAMPLING_FREQUENCY, 1, 0.0, 2000 };
@@ -180,74 +179,74 @@ static struct structVowelEditor_F1F2Grid griddefault = { 200, 500, 0, 1, 0, 1, 0
 struct markInfo {
 	double f1, f2;
 	int size;
-	wchar_t vowel [Preferences_STRING_BUFFER_SIZE];
+	char32 vowel [Preferences_STRING_BUFFER_SIZE];
 };
 
 static struct {
 	int shellWidth, shellHeight;
-	int soundFollowsMouse;
+	bool soundFollowsMouse;
 	double f1min, f1max, f2min, f2max;
 	double f3, b3, f4, b4;
 	double markTraceEvery, extendDuration;
 	int frequencyScale;
 	int axisOrientation;
 	int speakerType, marksDataset, numberOfMarks, marksFontSize;
-	wchar_t mark[VowelEditor_MAXIMUM_MARKERS][Preferences_STRING_BUFFER_SIZE];
+	char32 mark[VowelEditor_MAXIMUM_MARKERS][Preferences_STRING_BUFFER_SIZE];
 } prefs;
 
 
 Thing_implement (Vowel, Function, 0);
 
-static Vowel Vowel_create (double duration) {
+static autoVowel Vowel_create (double duration) {
 	try {
 		autoVowel me = Thing_new (Vowel);
-		Function_init (me.peek(), 0, duration);
-		my ft = FormantTier_create (0, duration);
-		my pt = PitchTier_create (0, duration);
-		return me.transfer();
+		Function_init (me.get(), 0.0, duration);
+		my ft = FormantTier_create (0.0, duration);
+		my pt = PitchTier_create (0.0, duration);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Vowel not created.");
+		Melder_throw (U"Vowel not created.");
 	}
 }
 
-static Vowel Vowel_create_twoFormantSchwa (double duration) {
+static autoVowel Vowel_create_twoFormantSchwa (double duration) {
 	try {
 		autoVowel me = Vowel_create (duration);
-		autoFormantPoint fp =  FormantPoint_create (0);
-		fp -> formant [0] = 500;
-		fp -> bandwidth[0] = 50;
-		fp -> formant [1] = 1500;
-		fp -> bandwidth[1] = 150;
+		autoFormantPoint fp = FormantPoint_create (0.0);
+		fp -> formant [0] = 500.0;
+		fp -> bandwidth[0] = 50.0;
+		fp -> formant [1] = 1500.0;
+		fp -> bandwidth[1] = 150.0;
 		fp -> numberOfFormants = 2;
 		Collection_addItem (my ft -> points, fp.transfer());
-		RealTier_addPoint (my pt, 0, 140);
+		RealTier_addPoint (my pt.get(), 0.0, 140.0);
 
-		fp.reset (FormantPoint_create (duration));
-		fp -> formant [0] = 500;
-		fp -> bandwidth[0] = 50;
-		fp -> formant [1] = 1500;
-		fp -> bandwidth[1] = 150;
+		fp = FormantPoint_create (duration);
+		fp -> formant [0] = 500.0;
+		fp -> bandwidth[0] = 50.0;
+		fp -> formant [1] = 1500.0;
+		fp -> bandwidth[1] = 150.0;
 		fp -> numberOfFormants = 2;
 		Collection_addItem (my ft -> points, fp.transfer());
-		RealTier_addPoint (my pt, duration, 140);
-		return me.transfer();
+		RealTier_addPoint (my pt.get(), duration, 140.0);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Schwa Vowel not created");
+		Melder_throw (U"Schwa Vowel not created");
 	}
 }
 
-static Sound Vowel_to_Sound_pulses (Vowel me, double samplingFrequency, double adaptFactor, double adaptTime, long interpolationDepth) {
+static autoSound Vowel_to_Sound_pulses (Vowel me, double samplingFrequency, double adaptFactor, double adaptTime, long interpolationDepth) {
 	try {
-		autoPointProcess pp = PitchTier_to_PointProcess (my pt);
+		autoPointProcess pp = PitchTier_to_PointProcess (my pt.get());
 		autoSound thee = PointProcess_to_Sound_pulseTrain (pp.peek(), samplingFrequency, adaptFactor, adaptTime, interpolationDepth);
-		Sound_FormantTier_filter_inline (thee.peek(), my ft);
-		return thee.transfer();
+		Sound_FormantTier_filter_inline (thee.peek(), my ft.get());
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": Sound with pulses not created.");
+		Melder_throw (me, U": Sound with pulses not created.");
 	}
 }
 
-static FormantGrid FormantTier_to_FormantGrid (FormantTier me) {
+static autoFormantGrid FormantTier_to_FormantGrid (FormantTier me) {
 	try {
 		long numberOfFormants = FormantTier_getMaxNumFormants (me);
 		autoFormantGrid thee = FormantGrid_createEmpty (my xmin, my xmax, numberOfFormants);
@@ -259,9 +258,9 @@ static FormantGrid FormantTier_to_FormantGrid (FormantTier me) {
 				FormantGrid_addBandwidthPoint (thee.peek(), iformant, t, fp -> bandwidth[iformant - 1]);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no FormantGrod created.");
+		Melder_throw (me, U": no FormantGrod created.");
 	}
 }
 
@@ -272,22 +271,20 @@ static void VowelEditor_getXYFromF1F2 (VowelEditor me, double f1, double f2, dou
 
 //Graphics_DCtoWC ????
 static void VowelEditor_getF1F2FromXY (VowelEditor me, double x, double y, double *f1, double *f2) {
-	*f2 = my f2min * pow (my f2max / my f2min, 1 - x);
-	*f1 = my f1min * pow (my f1max / my f1min, 1 - y);
+	*f2 = my f2min * pow (my f2max / my f2min, 1.0 - x);
+	*f1 = my f1min * pow (my f1max / my f1min, 1.0 - y);
 }
 
-#define REPRESENTNUMBER(x,i) (((x) == NUMundefined) ? L" undef" : ((swprintf(buffer[i], 7, L"%6.1f",x)), buffer[i]))
-static void appendF1F2F0 (MelderString *statusInfo, const wchar_t *intro, double f1, double f2, double f0, const wchar_t *ending) {
-	const wchar_t *komma = L", ";
-	wchar_t buffer[4][10];
-	MelderString_append (statusInfo, intro, REPRESENTNUMBER (f1, 1), komma, REPRESENTNUMBER (f2, 2), komma, REPRESENTNUMBER (f0, 3), ending);
+#define REPRESENTNUMBER(x,i) (((x) == NUMundefined) ? U" undef" : Melder_pad (6, Melder_fixed (x, 1)))
+static void appendF1F2F0 (MelderString *statusInfo, const char32 *intro, double f1, double f2, double f0, const char32 *ending) {
+	MelderString_append (statusInfo, intro, REPRESENTNUMBER (f1, 1), U", ", REPRESENTNUMBER (f2, 2), U", ", REPRESENTNUMBER (f0, 3), ending);
 }
 
 static double getRealFromTextWidget (GuiText me) {
 	double value = NUMundefined;
-	wchar_t *dirty = my f_getString ();
+	char32 *dirty = GuiText_getString (me);
 	try {
-		Interpreter_numericExpression (NULL, dirty, & value);
+		Interpreter_numericExpression (nullptr, dirty, & value);
 	} catch (MelderError) {
 		Melder_clearError (); value = NUMundefined;
 	}
@@ -298,36 +295,36 @@ static double getRealFromTextWidget (GuiText me) {
 static void VowelEditor_updateF0Info (VowelEditor me) {
 	double f0 = getRealFromTextWidget (my f0TextField);
 	checkF0 (&my f0, &f0);
-	my f0TextField -> f_setString (Melder_double (f0));
+	GuiText_setString (my f0TextField, Melder_double (f0));
 	my f0.start = f0;
 	double slopeOctPerSec = getRealFromTextWidget (my f0SlopeTextField);
-	if (slopeOctPerSec == NUMundefined) {
+	if (! NUMdefined (slopeOctPerSec)) {
 		slopeOctPerSec = f0default.slopeOctPerSec;
 	}
 	my f0.slopeOctPerSec = slopeOctPerSec;
-	my f0SlopeTextField -> f_setString (Melder_double (my f0.slopeOctPerSec));
+	GuiText_setString (my f0SlopeTextField, Melder_double (my f0.slopeOctPerSec));
 }
 
 static void VowelEditor_updateExtendDuration (VowelEditor me) {
 	double extend = getRealFromTextWidget (my extendTextField);
-	if (extend == NUMundefined || extend <= MINIMUM_SOUND_DURATION || extend > my maximumDuration) {
+	if (! NUMdefined (extend) || extend <= MINIMUM_SOUND_DURATION || extend > my maximumDuration) {
 		extend = MINIMUM_SOUND_DURATION;
 	}
-	my extendTextField -> f_setString (Melder_double (extend));
+	GuiText_setString (my extendTextField, Melder_double (extend));
 	my extendDuration = prefs.extendDuration = extend;
 }
 
 static double VowelEditor_updateDurationInfo (VowelEditor me) {
 	double duration = getRealFromTextWidget (my durationTextField);
-	if (duration == NUMundefined || duration < MINIMUM_SOUND_DURATION) {
+	if (! NUMdefined (duration) || duration < MINIMUM_SOUND_DURATION) {
 		duration = MINIMUM_SOUND_DURATION;
 	}
-	my durationTextField -> f_setString (Melder_double (MICROSECPRECISION (duration)));
+	GuiText_setString (my durationTextField, Melder_double (MICROSECPRECISION (duration)));
 	return duration;
 }
 
 static void Sound_fadeIn (Sound me, double duration, int fromFirstNonZeroSample) {
-	long istart = 1, numberOfSamples = duration / my dx;
+	long istart = 1, numberOfSamples = (long) floor (duration / my dx);   // ppgb: waarom afronden naar beneden?
 
 	if (numberOfSamples < 2) {
 		return;
@@ -339,9 +336,9 @@ static void Sound_fadeIn (Sound me, double duration, int fromFirstNonZeroSample)
 		// 1. They have no offset
 		// 2. They are already scaled to a maximum amplitude of 0.99
 		// 3. For 16 bit precision
-		double zmin = 0.5 / pow (2, 16);
+		double zmin = 0.5 / pow (2.0, 16.0);
 		while (fabs (my z[1][istart]) < zmin && istart < my nx) {
-			my z[1][istart] = 0; // To make sure
+			my z[1][istart] = 0.0; // To make sure
 			istart++;
 		}
 	}
@@ -352,12 +349,12 @@ static void Sound_fadeIn (Sound me, double duration, int fromFirstNonZeroSample)
 	for (long i = 1; i <= numberOfSamples; i++) {
 		double phase = NUMpi * (i - 1) / (numberOfSamples - 1);
 
-		my z[1][istart + i - 1] *= 0.5 * (1 - cos (phase));
+		my z[1][istart + i - 1] *= 0.5 * (1.0 - cos (phase));
 	}
 }
 
 static void Sound_fadeOut (Sound me, double duration) {
-	long istart, numberOfSamples = duration / my dx;
+	long istart, numberOfSamples = (long) floor (duration / my dx);
 
 	if (numberOfSamples < 2) {
 		return;
@@ -370,12 +367,12 @@ static void Sound_fadeOut (Sound me, double duration) {
 	for (long i = 1; i <= numberOfSamples; i++) {
 		double phase = NUMpi * (i - 1) / (numberOfSamples - 1);
 
-		my z[1][istart + i] *= 0.5 * (1 + cos (phase));
+		my z[1][istart + i] *= 0.5 * (1.0 + cos (phase));
 	}
 }
 
 static double getF0 (structVowelEditor_F0 *f0p, double time) {
-	double f0 = f0p -> start * pow (2, f0p -> slopeOctPerSec * time);
+	double f0 = f0p -> start * pow (2.0, f0p -> slopeOctPerSec * time);
 	if (f0 < f0p -> minimum) {
 		f0 = f0p -> minimum;
 	} else if (f0 > f0p -> maximum) {
@@ -385,7 +382,7 @@ static double getF0 (structVowelEditor_F0 *f0p, double time) {
 }
 
 static void VowelEditor_Vowel_reverseFormantTier (VowelEditor me) {
-	FormantTier ft = (FormantTier) my vowel -> ft;
+	FormantTier ft = my vowel -> ft.get();
 	double duration = ft -> xmax;
 	long np = ft -> points -> size, np_2 = np / 2;
 
@@ -405,7 +402,7 @@ static void VowelEditor_Vowel_reverseFormantTier (VowelEditor me) {
 }
 
 static void VowelEditor_shiftF1F2 (VowelEditor me, double f1_st, double f2_st) {
-	FormantTier ft = my vowel -> ft;
+	FormantTier ft = my vowel -> ft.get();
 	for (long i = 1; i <= ft -> points -> size; i++) {
 		FormantPoint fp = (FormantPoint) ft -> points -> item[i];
 		double f1 = fp -> formant[0], f2 = fp -> formant[1];
@@ -441,10 +438,10 @@ static void VowelEditor_shiftF1F2 (VowelEditor me, double f1_st, double f2_st) {
 static void Vowel_newDuration (Vowel me, structVowelEditor_F0 *f0p, double newDuration) {
 	if (newDuration != my xmax) {
 		double multiplier = newDuration / my xmax;
-		FormantTier_newDuration (my ft, newDuration);
+		FormantTier_newDuration (my ft.get(), newDuration);
 		my xmax *= multiplier;
 	}
-	PitchTier_newDuration (my pt, f0p, newDuration); // always update
+	PitchTier_newDuration (my pt.get(), f0p, newDuration); // always update
 
 }
 
@@ -474,7 +471,7 @@ static void PitchTier_newDuration (PitchTier me, structVowelEditor_F0 *f0p, doub
 static void VowelEditor_updateVowel (VowelEditor me) {
 	double newDuration = VowelEditor_updateDurationInfo (me); // Get new duration from TextWidget
 	VowelEditor_updateF0Info (me); // Get new pitch and slope values from TextWidgets
-	Vowel_newDuration (my vowel, & my f0, newDuration);
+	Vowel_newDuration (my vowel.get(), & my f0, newDuration);
 }
 
 static double getCoordinate (double fmin, double fmax, double f) {
@@ -489,13 +486,13 @@ static void FormantTier_drawF1F2Trajectory (FormantTier me, Graphics g, double f
 	double glw = Graphics_inqLineWidth (g), x1, x1p, y1, y1p, t1;
 	Graphics_Colour colour = Graphics_inqColour (g);
 	long nfp = my points -> size;
-	trace ("number of points %ld", nfp);
+	trace (U"number of points ", nfp);
 	FormantPoint fp = (FormantPoint) my points -> item[1];
 	FormantPoint fpn = (FormantPoint) my points -> item[nfp];
 	double tm, markLength = 0.01;
 
 	Graphics_setInner (g);
-	Graphics_setWindow (g, 0, 1, 0, 1);
+	Graphics_setWindow (g, 0.0, 1.0, 0.0, 1.0);
 	Graphics_setLineType (g, Graphics_DRAWN);
 	// Too short too hear ?
 	if ( (my xmax - my xmin) < 0.005) {
@@ -529,7 +526,7 @@ static void FormantTier_drawF1F2Trajectory (FormantTier me, Graphics g, double f
 					xl2 = fabs (xl1); yl2 = fabs (yl1);
 				}
 				Graphics_setLineWidth (g, 1);
-				trace ("%.17g %.17g %.17g %.17g %.17g %.17g", xm, ym, xl1, xl2, yl1, yl2);
+				trace (xm, U" ", ym, U" ", xl1, U" ", xl2, U" ", yl1, U" ", yl2);
 				Graphics_line (g, xm + xl1, ym + yl1, xm + xl2, ym + yl2);
 			}
 			imark++;
@@ -539,7 +536,7 @@ static void FormantTier_drawF1F2Trajectory (FormantTier me, Graphics g, double f
 	}
 	// Arrow at end
 	{
-		double gas = Graphics_inqArrowSize (g), arrowSize = 1;
+		double gas = Graphics_inqArrowSize (g), arrowSize = 1.0;
 		double size = 10.0 * arrowSize * Graphics_getResolution (g) / 75.0 / width, size2 = size * size;
 		Graphics_setArrowSize (g, arrowSize);
 		it = 1;
@@ -564,90 +561,62 @@ static void FormantTier_drawF1F2Trajectory (FormantTier me, Graphics g, double f
 #undef GETX
 #undef GETY
 
-static PitchTier VowelEditor_to_PitchTier (VowelEditor me, double duration) {
-	try {
-		double t_end = duration;
-		double f0_end = my f0.start * pow (2, my f0.slopeOctPerSec * t_end);
-		autoPitchTier thee = PitchTier_create (0, t_end);
-
-		RealTier_addPoint (thee.peek(), 0, my f0.start);
-		if (my f0.slopeOctPerSec < 0) {
-			if (f0_end < my f0.minimum) {
-				t_end = log2 (my f0.minimum / my f0.start) / my f0.slopeOctPerSec;
-				f0_end = my f0.minimum;
-			}
-		} else if (my f0.slopeOctPerSec > 0) {
-			if (f0_end > my f0.maximum) {
-				t_end = log2 (my f0.maximum / my f0.start) / my f0.slopeOctPerSec;
-				f0_end = my f0.maximum;
-			}
-		}
-		RealTier_addPoint (thee.peek(), t_end, f0_end);
-		return thee.transfer();
-	} catch (MelderError) {
-		Melder_throw (me, ": no PitchTier created.");
-	}
-}
-
 void VowelEditor_prefs () {
-	Preferences_addInt (L"VowelEditor.shellWidth", &prefs.shellWidth, 500);
-	Preferences_addInt (L"VowelEditor.shellHeight", &prefs.shellHeight, 500);
-	Preferences_addInt (L"VowelEditor.soundFollowsMouse", &prefs.soundFollowsMouse, 1);
-	Preferences_addDouble (L"VowelEditor.f1min", &prefs.f1min, 200);
-	Preferences_addDouble (L"VowelEditor.f1max", &prefs.f1max, 1200);
-	Preferences_addDouble (L"VowelEditor.f2min", &prefs.f2min, 500);
-	Preferences_addDouble (L"VowelEditor.f2max", &prefs.f2max, 3500);
-	Preferences_addDouble (L"VowelEditor.f3", &prefs.f3, 2500);
-	Preferences_addDouble (L"VowelEditor.b3", &prefs.b3, 250);
-	Preferences_addDouble (L"VowelEditor.f4", &prefs.f4, 3500);
-	Preferences_addDouble (L"VowelEditor.b4", &prefs.b4, 350);
-	Preferences_addDouble (L"VowelEditor.markTraceEvery", &prefs.markTraceEvery, 0.05);
-	Preferences_addDouble (L"VowelEditor.extendDuration", &prefs.extendDuration, 0.05);
-	Preferences_addInt (L"VowelEditor.frequencyScale", &prefs.frequencyScale, 0);
-	Preferences_addInt (L"VowelEditor.axisOrientation", &prefs.axisOrientation, 0);
-	Preferences_addInt (L"VowelEditor.speakerType", &prefs.speakerType, 1);
-	Preferences_addInt (L"VowelEditor.marksDataset", &prefs.marksDataset, 2);
-	Preferences_addInt (L"VowelEditor.marksFontsize", &prefs.marksFontSize, 14);
+	Preferences_addInt (U"VowelEditor.shellWidth", &prefs.shellWidth, 500);
+	Preferences_addInt (U"VowelEditor.shellHeight", &prefs.shellHeight, 500);
+	Preferences_addBool (U"VowelEditor.soundFollowsMouse", &prefs.soundFollowsMouse, true);
+	Preferences_addDouble (U"VowelEditor.f1min", &prefs.f1min, 200.0);
+	Preferences_addDouble (U"VowelEditor.f1max", &prefs.f1max, 1200.0);
+	Preferences_addDouble (U"VowelEditor.f2min", &prefs.f2min, 500.0);
+	Preferences_addDouble (U"VowelEditor.f2max", &prefs.f2max, 3500.0);
+	Preferences_addDouble (U"VowelEditor.f3", &prefs.f3, 2500.0);
+	Preferences_addDouble (U"VowelEditor.b3", &prefs.b3, 250.0);
+	Preferences_addDouble (U"VowelEditor.f4", &prefs.f4, 3500.0);
+	Preferences_addDouble (U"VowelEditor.b4", &prefs.b4, 350.0);
+	Preferences_addDouble (U"VowelEditor.markTraceEvery", &prefs.markTraceEvery, 0.05);
+	Preferences_addDouble (U"VowelEditor.extendDuration", &prefs.extendDuration, 0.05);
+	Preferences_addInt (U"VowelEditor.frequencyScale", &prefs.frequencyScale, 0);
+	Preferences_addInt (U"VowelEditor.axisOrientation", &prefs.axisOrientation, 0);
+	Preferences_addInt (U"VowelEditor.speakerType", &prefs.speakerType, 1);
+	Preferences_addInt (U"VowelEditor.marksDataset", &prefs.marksDataset, 2);
+	Preferences_addInt (U"VowelEditor.marksFontsize", &prefs.marksFontSize, 14);
 	createPersistentVowelMarks ();
 }
 
 static void copyVowelMarksInPreferences_volatile (Table me) {
 	long numberOfRows = prefs.numberOfMarks = my rows -> size;
 	if (numberOfRows > 0) {
-		long col_vowel = Table_getColumnIndexFromColumnLabel (me, L"Vowel");
-		long col_f1 = Table_getColumnIndexFromColumnLabel (me, L"F1");
-		long col_f2 = Table_getColumnIndexFromColumnLabel (me, L"F2");
-		long col_size = Table_getColumnIndexFromColumnLabel (me, L"Size");
-		autoMelderString mark, markID;
+		long col_vowel = Table_getColumnIndexFromColumnLabel (me, U"Vowel");
+		long col_f1 = Table_getColumnIndexFromColumnLabel (me, U"F1");
+		long col_f2 = Table_getColumnIndexFromColumnLabel (me, U"F2");
+		long col_size = Table_getColumnIndexFromColumnLabel (me, U"Size");
+		autoMelderString mark;
 		for (long i = 1; i <= VowelEditor_MAXIMUM_MARKERS; i++) {
 			if (i <= numberOfRows) {
-				MelderString_append (&mark, Table_getStringValue_Assert (me, i, col_vowel), L"\t",
-					Table_getStringValue_Assert (me, i, col_f1), L"\t",
-					Table_getStringValue_Assert (me, i, col_f2), L"\t",
+				MelderString_copy (&mark, Table_getStringValue_Assert (me, i, col_vowel), U"\t",
+					Table_getStringValue_Assert (me, i, col_f1), U"\t",
+					Table_getStringValue_Assert (me, i, col_f2), U"\t",
 					Table_getStringValue_Assert (me, i, col_size));
-				long length = wcslen (mark.string);
-				if (length > Preferences_STRING_BUFFER_SIZE) Melder_throw ("Preference mark", i, "too many characters");
-				wcscpy (prefs.mark[i-1], mark.string);
-				MelderString_empty (&mark);
+				long length = str32len (mark.string);
+				if (length > Preferences_STRING_BUFFER_SIZE) Melder_throw (U"Preference mark", i, U"too many characters");
+				str32cpy (prefs.mark[i-1], mark.string);
 			} else {
-				wcscpy (prefs.mark[i-1], L"x");
+				str32cpy (prefs.mark[i-1], U"x");
 			}
 		}
 		// The following code removes the superfluous mark preferences,
 		// *if* we had access to the thePreferences set (but we don't)
-		//	autoMelderString markID;
+		// autoMelderString markID;
 		// for (long i = VowelEditor_MAXIMUM_MARKERS; i > numberOfRows; i--) {
-		//		MelderString_append (&markID, L"VowelEditor.mark", (i < 10 ? L"0" : L""), Melder_integer (i));
+		//		MelderString_copy (&markID, U"VowelEditor.mark", (i < 10 ? U"0" : U""), i);
 		//		long index = SortedSetOfString_lookUp (thePreferences, markID.string);
 		//		Collection_removeItem (thePreferences, index);
-		//		MelderString_empty (&markID);
 		// }
 	}
 }
 
 static void createPersistentVowelMarks ()
 {
-	autoMelderString markID;
 	// Deadlock:
 	// This function is executed before the preferences are read from file and before we know how
 	// many vowel marks the user wants.
@@ -655,11 +624,9 @@ static void createPersistentVowelMarks ()
 	// they will not be assigned a value.
 	// We therefore create fake names first and later fill them with data.
 	long numberOfMarks = VowelEditor_MAXIMUM_MARKERS;
-	Preferences_addInt (L"VowelEditor.numberOfMarks", &prefs.numberOfMarks, numberOfMarks);
+	Preferences_addInt (U"VowelEditor.numberOfMarks", &prefs.numberOfMarks, numberOfMarks);
 	for (long i = 1; i <= numberOfMarks; i++) {
-		MelderString_append (&markID, L"VowelEditor.mark", (i < 10 ? L"0" : L""), Melder_integer (i));
-		Preferences_addString (markID.string, & prefs.mark[i-1][0], L"x");
-		MelderString_empty (&markID);
+		Preferences_addString (Melder_cat (U"VowelEditor.mark", (i < 10 ? U"0" : U""), i), & prefs.mark[i-1][0], U"x");
 	}
 }
 
@@ -667,7 +634,7 @@ void VowelEditor_createTableFromVowelMarksInPreferences (VowelEditor me)
 {
 	long numberOfRows = VowelEditor_MAXIMUM_MARKERS;
 	try {
-		autoTable marks = Table_createWithColumnNames (0, L"Vowel F1 F2 Size");
+		autoTable newMarks = Table_createWithColumnNames (0, U"Vowel F1 F2 Size");
 		long nmarksFound = 0;
 		for (long i = 1; i <= numberOfRows; i++) {
 			long numberOfTokens;
@@ -675,9 +642,9 @@ void VowelEditor_createTableFromVowelMarksInPreferences (VowelEditor me)
 			if (numberOfTokens < 4) { // we are done
 				break;
 			}
-			Table_appendRow (marks.peek());
+			Table_appendRow (newMarks.peek());
 			for (long j = 1; j <= 4; j++) {
-				Table_setStringValue (marks.peek(), i, j, rowi[j]);
+				Table_setStringValue (newMarks.peek(), i, j, rowi[j]);
 			}
 			nmarksFound++;
 		}
@@ -686,10 +653,10 @@ void VowelEditor_createTableFromVowelMarksInPreferences (VowelEditor me)
 			my marksDataset = prefs.marksDataset = 1;
 			VowelEditor_setMarks (me, my marksDataset, my speakerType, prefs.marksFontSize);
 		} else {
-			my marks = marks.transfer(); // my marks == NULL;
+			my marks = newMarks.move();
 		}
 	} catch (MelderError) {
-		Melder_throw (L"Cannot create Table from preferences. Default marks set.");
+		Melder_throw (U"Cannot create Table from preferences. Default marks set.");
 		my speakerType = prefs.speakerType = 1;
 		my marksDataset = prefs.marksDataset = 1;
 		VowelEditor_setMarks (me, my marksDataset, my speakerType, prefs.marksFontSize);
@@ -697,9 +664,9 @@ void VowelEditor_createTableFromVowelMarksInPreferences (VowelEditor me)
 }
 
 static void Table_addColumn_size (Table me, int size) {
-	long col_size = Table_findColumnIndexFromColumnLabel (me, L"Size");
+	long col_size = Table_findColumnIndexFromColumnLabel (me, U"Size");
 	if (col_size == 0) {
-		Table_appendColumn (me, L"Size");
+		Table_appendColumn (me, U"Size");
 		for (long i = 1; i <= my rows -> size; i++) {
 			Table_setNumericValue (me, i, my numberOfColumns, size);
 		}
@@ -707,9 +674,9 @@ static void Table_addColumn_size (Table me, int size) {
 }
 
 static void VowelEditor_setMarks (VowelEditor me, int marksDataset, int speakerType, int fontSize) {
-	autoTable te = 0;
-	const wchar_t *Type[4] = { L"", L"m", L"w", L"c" };
-	const wchar_t *Sex[3] = { L"", L"m", L"f"};
+	autoTable te;
+	const char32 *Type[4] = { U"", U"m", U"w", U"c" };
+	const char32 *Sex[3] = { U"", U"m", U"f"};
 	if (marksDataset == 1) { // American-English
 		autoTable thee = Table_createFromPetersonBarneyData ();
 		te.reset (Table_extractRowsWhereColumn_string (thee.peek(), 1, kMelder_string_EQUAL_TO, Type[speakerType]));
@@ -722,38 +689,38 @@ static void VowelEditor_setMarks (VowelEditor me, int marksDataset, int speakerT
 			te.reset (Table_extractRowsWhereColumn_string (thee.peek(), 1, kMelder_string_EQUAL_TO, Type[speakerType]));
 		}
 	} else if (marksDataset == 3) { // None
-		forget (my marks);
+		my marks.reset();
 		return;
 	} else { // Leave as is
 		return;
 	}
-	autoTable thee = Table_collapseRows (te.peek(), L"IPA", L"", L"F1 F2", L"", L"", L"");
-	long col_ipa = Table_findColumnIndexFromColumnLabel (thee.peek(), L"IPA");
-	Table_setColumnLabel (thee.peek(), col_ipa, L"Vowel");
-	Table_addColumn_size (thee.peek(), fontSize);
-	forget (my marks);
-	my marks = thee.transfer();
-	copyVowelMarksInPreferences_volatile (my marks);
+	autoTable newMarks = Table_collapseRows (te.peek(), U"IPA", U"", U"F1 F2", U"", U"", U"");
+	long col_ipa = Table_findColumnIndexFromColumnLabel (newMarks.peek(), U"IPA");
+	Table_setColumnLabel (newMarks.get(), col_ipa, U"Vowel");
+	Table_addColumn_size (newMarks.get(), fontSize);
+	my marks = newMarks.move();
+	copyVowelMarksInPreferences_volatile (my marks.get());
 }
 
 static void VowelEditor_getVowelMarksFromTableFile (VowelEditor me, MelderFile file)
 {
 	try {
-		autoData data =  (Data) Data_readFromFile (file);
-		if (! Thing_member ((Thing) data.peek(), classTable)) Melder_throw (L"\"", MelderFile_name (file), L"\" is not a Table file");
-		autoTable marks = (Table) data.transfer();
+		autoDaata data = Data_readFromFile (file);
+		if (! Thing_isa (data.get(), classTable)) {
+			Melder_throw (U"\"", MelderFile_name (file), U"\" is not a Table file");
+		}
+		autoTable newMarks = (Table) data.transfer();
 		// check if columns Vowel F1 & F2 are present
-		Table_getColumnIndexFromColumnLabel (marks.peek(), L"Vowel");
-		Table_getColumnIndexFromColumnLabel (marks.peek(), L"F1");
-		Table_getColumnIndexFromColumnLabel (marks.peek(), L"F2");
-		Table_addColumn_size (marks.peek(), prefs.marksFontSize);
-		forget (my marks);
-		my marks = marks.transfer();
+		Table_getColumnIndexFromColumnLabel (newMarks.get(), U"Vowel");
+		Table_getColumnIndexFromColumnLabel (newMarks.get(), U"F1");
+		Table_getColumnIndexFromColumnLabel (newMarks.get(), U"F2");
+		Table_addColumn_size (newMarks.peek(), prefs.marksFontSize);
+		my marks = newMarks.move();
 		my marksDataset = prefs.marksDataset = 9999;
-		copyVowelMarksInPreferences_volatile (my marks);
+		copyVowelMarksInPreferences_volatile (my marks.get());
 		// our marks preferences are dynamic, save each time
 	} catch (MelderError) {
-		Melder_throw ("Vowel marks from Table not shown.");
+		Melder_throw (U"Vowel marks from Table not shown.");
 	}
 }
 
@@ -784,39 +751,39 @@ static double Matrix_getValue (Matrix me, double x, double y) {
 }
 
 static void VowelEditor_getF3F4 (VowelEditor me, double f1, double f2, double *f3, double *b3, double *f4, double *b4) {
-	*f3 = Matrix_getValue (my f3, f2, f1);
-	*b3 = Matrix_getValue (my b3, f2, f1);
-	*f4 = Matrix_getValue (my f4, f2, f1);
-	*b4 = Matrix_getValue (my b4, f2, f1);
+	*f3 = Matrix_getValue (my f3.get(), f2, f1);
+	*b3 = Matrix_getValue (my b3.get(), f2, f1);
+	*f4 = Matrix_getValue (my f4.get(), f2, f1);
+	*b4 = Matrix_getValue (my b4.get(), f2, f1);
 }
 
 static void VowelEditor_drawBackground (VowelEditor me, Graphics g) {
 	double x1, y1, x2, y2, f1, f2;
 
 	Graphics_setInner (g);
-	Graphics_setWindow (g, 0, 1, 0, 1);
-	Graphics_setGrey (g, 0);
+	Graphics_setWindow (g, 0.0, 1.0, 0.0, 1.0);
+	Graphics_setGrey (g, 0.0);
 	Graphics_setLineType (g, Graphics_DRAWN);
-	Graphics_setLineWidth (g, 2);
-	Graphics_rectangle (g, 0, 1, 0, 1);
-	Graphics_setLineWidth (g, 1);
+	Graphics_setLineWidth (g, 2.0);
+	Graphics_rectangle (g, 0.0, 1.0, 0.0, 1.0);
+	Graphics_setLineWidth (g, 1.0);
 	Graphics_setGrey (g, 0.5);
 	int fontSize = Graphics_inqFontSize (g);
 	// draw the marks
-	if (my marks != 0) {
-		long col_vowel = Table_getColumnIndexFromColumnLabel (my marks, L"Vowel");
-		long col_f1 = Table_getColumnIndexFromColumnLabel (my marks, L"F1");
-		long col_f2 = Table_getColumnIndexFromColumnLabel (my marks, L"F2");
-		long col_fs = Table_findColumnIndexFromColumnLabel (my marks, L"Size");
+	if (my marks) {
+		long col_vowel = Table_getColumnIndexFromColumnLabel (my marks.get(), U"Vowel");
+		long col_f1 = Table_getColumnIndexFromColumnLabel (my marks.get(), U"F1");
+		long col_f2 = Table_getColumnIndexFromColumnLabel (my marks.get(), U"F2");
+		long col_fs = Table_findColumnIndexFromColumnLabel (my marks.get(), U"Size");
 		for (long i = 1; i <= my marks -> rows -> size; i++) {
-			const wchar_t *label = Table_getStringValue_Assert (my marks, i, col_vowel);
-			f1 = Table_getNumericValue_Assert (my marks, i, col_f1);
-			f2 = Table_getNumericValue_Assert (my marks, i, col_f2);
+			const char32 *label = Table_getStringValue_Assert (my marks.get(), i, col_vowel);
+			f1 = Table_getNumericValue_Assert (my marks.get(), i, col_f1);
+			f2 = Table_getNumericValue_Assert (my marks.get(), i, col_f2);
 			if (f1 >= my f1min && f1 <= my f1max && f2 >= my f2min && f2 <= my f2max) {
 				VowelEditor_getXYFromF1F2 (me, f1, f2, &x1, &y1);
 				int size = prefs.marksFontSize;
 				if (col_fs != 0) {
-					size = Table_getNumericValue_Assert (my marks, i, col_fs);
+					size = (int) floor (Table_getNumericValue_Assert (my marks.get(), i, col_fs));
 				}
 				Graphics_setFontSize (g, size);
 				Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
@@ -828,22 +795,21 @@ static void VowelEditor_drawBackground (VowelEditor me, Graphics g) {
 	// Draw the line F1=F2
 	//
 	VowelEditor_getXYFromF1F2 (me, my f2min, my f2min, &x1, &y1);
-	if (y1 >= 0 && y1 <= 1) {
+	if (y1 >= 0.0 && y1 <= 1.0) {
 		VowelEditor_getXYFromF1F2 (me, my f1max, my f1max, &x2, &y2);
-		if (x2 >= 0 && x2 <= 1) {
-			Polygon p = Polygon_create (3);
+		if (x2 >= 0.0 && x2 <= 1.0) {
+			autoPolygon p = Polygon_create (3);
 			p -> x[1] = x1; p -> y[1] = y1;
 			p -> x[2] = x2; p -> y[2] = y2;
 			p -> x[3] =  1; p -> y[3] =  0;
 			Graphics_fillArea (g, p -> numberOfPoints, & p -> x[1], & p -> y[1]);
 			// Polygon_paint does not work because of use of Graphics_setInner.
-			forget (p);
 			Graphics_line (g, x1, y1, x2, y2);
 		}
 	}
 	// Draw the grid
 	if (my grid.df1 < (my f1max - my f1min)) { // Horizontal lines
-		long iline = (my f1min + my grid.df1) / my grid.df1;
+		long iline = (my f1min + my grid.df1) / my grid.df1;   // FIXME: if truncating down is deliberate, then do `floor`
 		Graphics_setGrey (g, 0.5);
 		Graphics_setLineType (g, Graphics_DOTTED);
 		while ( (f1 = iline * my grid.df1) < my f1max) {
@@ -855,10 +821,10 @@ static void VowelEditor_drawBackground (VowelEditor me, Graphics g) {
 			iline++;
 		}
 		Graphics_setLineType (g, Graphics_DRAWN);
-		Graphics_setGrey (g, 0); // black
+		Graphics_setGrey (g, 0.0); // black
 	}
 	if (my grid.df2 < (my f2max - my f2min)) {
-		long iline = (my f2min + my grid.df2) / my grid.df2;
+		long iline = (my f2min + my grid.df2) / my grid.df2;   // FIXME: if truncating down is deliberate, then do `floor`
 		Graphics_setGrey (g, 0.5);
 		Graphics_setLineType (g, Graphics_DOTTED);
 		while ( (f2 = iline * my grid.df2) < my f2max) { // vert line
@@ -870,14 +836,14 @@ static void VowelEditor_drawBackground (VowelEditor me, Graphics g) {
 			iline++;
 		}
 		Graphics_setLineType (g, Graphics_DRAWN);
-		Graphics_setGrey (g, 0); // black
+		Graphics_setGrey (g, 0.0); // black
 	}
 	Graphics_unsetInner (g);
-	Graphics_setGrey (g, 0); // black
-	Graphics_markLeft (g, 0, 0, 1, 0, Melder_double (my f1max));
-	Graphics_markLeft (g, 1, 0, 1, 0, Melder_double (my f1min));
-	Graphics_markTop (g, 0, 0, 1, 0, Melder_double (my f2max));
-	Graphics_markTop (g, 1, 0, 1, 0, Melder_double (my f2min));
+	Graphics_setGrey (g, 0.0); // black
+	Graphics_markLeft (g, 0.0, false, true, false, Melder_double (my f1max));
+	Graphics_markLeft (g, 1.0, false, true, false, Melder_double (my f1min));
+	Graphics_markTop (g, 0.0, false, true, false, Melder_double (my f2max));
+	Graphics_markTop (g, 1.0, false, true, false, Melder_double (my f2min));
 
 }
 
@@ -891,16 +857,12 @@ typedef struct {
 ** that could mess up the system like calling malloc() or free().
 */
 
-static int paCallback (const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer,
-                       const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, I) {
+static int paCallback (const void* /*inputBuffer*/, void* outputBuffer, unsigned long framesPerBuffer,
+                       const PaStreamCallbackTimeInfo* /*timeInfo*/, PaStreamCallbackFlags /*statusFlags*/, I) {
 	iam (paVowelData);
-	float *out = (float *) outputBuffer;
-	unsigned int i;
-	(void) inputBuffer; /* Prevent unused variable warning. */
-	(void) timeInfo;
-	(void) statusFlags;
+	float* out = (float*) outputBuffer;
 
-	for (i = 0; i < framesPerBuffer; i++) {
+	for (unsigned int i = 0; i < framesPerBuffer; i++) {
 		*out++ = my z[my istart + i]; /* left */
 		*out++ = my z[my istart + i]; /* right */
 	}
@@ -913,42 +875,42 @@ static int paCallback (const void *inputBuffer, void *outputBuffer, unsigned lon
 static void menu_cb_help (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
 	(void) me;
-	Melder_help (L"VowelEditor");
+	Melder_help (U"VowelEditor");
 }
 
 static void menu_cb_prefs (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"Preferences", 0);
-		BOOLEAN (L"Sound-follows-mouse", 1)
+	EDITOR_FORM (U"Preferences", 0);
+		BOOLEAN (U"Sound-follows-mouse", true)
 	EDITOR_OK
-		SET_INTEGER (L"Sound-follows-mouse", prefs.soundFollowsMouse)
+		SET_INTEGER (U"Sound-follows-mouse", prefs.soundFollowsMouse)
 	EDITOR_DO
 		my frequencyScale = prefs.frequencyScale;
 		my axisOrientation = prefs.axisOrientation;
-		my soundFollowsMouse = prefs.soundFollowsMouse = GET_INTEGER (L"Sound-follows-mouse");
+		my soundFollowsMouse = prefs.soundFollowsMouse = GET_INTEGER (U"Sound-follows-mouse");
 		Graphics_updateWs (my g);
 	EDITOR_END
 }
 
 static void menu_cb_ranges_f1f2 (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"F1 (vert) and F2 (hor) view ranges", 0);
-		POSITIVE (L"left F1 range (Hz)", L"200.0")
-		POSITIVE (L"right F1 range (Hz)", L"1000.0")
-		POSITIVE (L"left F2 range (Hz)", L"500.0")
-		POSITIVE (L"right F2 range (Hz)", L"2500.0")
+	EDITOR_FORM (U"F1 (vert) and F2 (hor) view ranges", 0);
+		POSITIVE (U"left F1 range (Hz)", U"200.0")
+		POSITIVE (U"right F1 range (Hz)", U"1000.0")
+		POSITIVE (U"left F2 range (Hz)", U"500.0")
+		POSITIVE (U"right F2 range (Hz)", U"2500.0")
 	EDITOR_OK
-		SET_REAL (L"left F1 range", prefs.f1min)
-		SET_REAL (L"right F1 range", prefs.f1max)
-		SET_REAL (L"left F2 range", prefs.f2min)
-		SET_REAL (L"right F2 range", prefs.f2max)
+		SET_REAL (U"left F1 range", prefs.f1min)
+		SET_REAL (U"right F1 range", prefs.f1max)
+		SET_REAL (U"left F2 range", prefs.f2min)
+		SET_REAL (U"right F2 range", prefs.f2max)
 	EDITOR_DO
 		my frequencyScale = prefs.frequencyScale;
 		my axisOrientation = prefs.axisOrientation;
-		my f1min = prefs.f1min = GET_REAL (L"left F1 range");
-		my f1max = prefs.f1max = GET_REAL (L"right F1 range");
-		my f2min = prefs.f2min = GET_REAL (L"left F2 range");
-		my f2max = prefs.f2max = GET_REAL (L"right F2 range");
+		my f1min = prefs.f1min = GET_REAL (U"left F1 range");
+		my f1max = prefs.f1max = GET_REAL (U"right F1 range");
+		my f2min = prefs.f2min = GET_REAL (U"left F2 range");
+		my f2max = prefs.f2max = GET_REAL (U"right F2 range");
 		Graphics_updateWs (my g);
 	EDITOR_END
 }
@@ -956,75 +918,75 @@ static void menu_cb_ranges_f1f2 (EDITOR_ARGS) {
 static void menu_cb_publishSound (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
 	autoSound publish = VowelEditor_createTarget (me);
-	my broadcastPublication (publish.transfer());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_extract_FormantGrid (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
 	VowelEditor_updateVowel (me);
-	autoFormantGrid publish = FormantTier_to_FormantGrid (my vowel -> ft);
-	my broadcastPublication (publish.transfer());
+	autoFormantGrid publish = FormantTier_to_FormantGrid (my vowel -> ft.get());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_extract_KlattGrid (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
 	VowelEditor_updateVowel (me);
-	autoFormantGrid fg = FormantTier_to_FormantGrid (my vowel -> ft);
+	autoFormantGrid fg = FormantTier_to_FormantGrid (my vowel -> ft.get());
 	autoKlattGrid publish = KlattGrid_create (fg -> xmin, fg -> xmax, fg -> formants -> size, 0, 0, 0, 0, 0, 0);
-	KlattGrid_addVoicingAmplitudePoint (publish.peek(), fg -> xmin, 90);
-	KlattGrid_replacePitchTier (publish.peek(), my vowel -> pt);
+	KlattGrid_addVoicingAmplitudePoint (publish.peek(), fg -> xmin, 90.0);
+	KlattGrid_replacePitchTier (publish.peek(), my vowel -> pt.get());
 	KlattGrid_replaceFormantGrid (publish.peek(), KlattGrid_ORAL_FORMANTS, fg.peek());
-	my broadcastPublication (publish.transfer());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_extract_PitchTier (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
 	VowelEditor_updateVowel (me);
-	autoPitchTier publish = Data_copy (my vowel -> pt);
-	my broadcastPublication (publish.transfer());
+	autoPitchTier publish = Data_copy (my vowel -> pt.get());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_drawTrajectory (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"Draw trajectory", 0)
+	EDITOR_FORM (U"Draw trajectory", 0)
 		my v_form_pictureWindow (cmd);
-		BOOLEAN (L"Garnish", 1)
+		BOOLEAN (U"Garnish", 1)
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
 	EDITOR_DO
-		int garnish = GET_INTEGER (L"Garnish");
+		int garnish = GET_INTEGER (U"Garnish");
 		my v_do_pictureWindow (cmd);
 		Editor_openPraatPicture (me);
 		if (garnish) {
 			VowelEditor_drawBackground (me, my pictureGraphics);
 		}
-		FormantTier_drawF1F2Trajectory (my vowel -> ft, my pictureGraphics, my f1min, my f1max, my f2min, my f2max, my markTraceEvery, my width);
+		FormantTier_drawF1F2Trajectory (my vowel -> ft.get(), my pictureGraphics, my f1min, my f1max, my f2min, my f2max, my markTraceEvery, my width);
 		Editor_closePraatPicture (me);
 	EDITOR_END
 }
 
 static void menu_cb_showOneVowelMark (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"Show one vowel mark", 0);
-		POSITIVE (L"F1 (Hz)", L"300.0")
-		POSITIVE (L"F2 (Hz)", L"600.0")
-		WORD (L"Mark", L"u")
+	EDITOR_FORM (U"Show one vowel mark", 0);
+		POSITIVE (U"F1 (Hz)", U"300.0")
+		POSITIVE (U"F2 (Hz)", U"600.0")
+		WORD (U"Mark", U"u")
 	EDITOR_OK
 	EDITOR_DO
-		double f1 = GET_REAL (L"F1");
-		double f2 = GET_REAL (L"F2");
-		wchar_t *label = GET_STRING (L"Mark");
+		double f1 = GET_REAL (U"F1");
+		double f2 = GET_REAL (U"F2");
+		char32 *label = GET_STRING (U"Mark");
 		if (f1 >= my f1min && f1 <= my f1max && f2 >= my f2min && f2 <= my f2max) {
 			long irow = 1;
-			if (my marks == NULL) {
-				my marks = Table_createWithColumnNames (1, L"IPA F1 F2 Colour");
+			if (! my marks) {
+				my marks = Table_createWithColumnNames (1, U"IPA F1 F2 Colour");
 			} else {
-				Table_appendRow (my marks);
+				Table_appendRow (my marks.get());
 			}
 			irow = my marks -> rows -> size;
-			Table_setStringValue (my marks, irow, 1, label);
-			Table_setNumericValue (my marks, irow, 2, f1);
-			Table_setNumericValue (my marks, irow, 3, f2);
+			Table_setStringValue (my marks.get(), irow, 1, label);
+			Table_setNumericValue (my marks.get(), irow, 2, f1);
+			Table_setNumericValue (my marks.get(), irow, 3, f2);
 			Graphics_updateWs (my g);
 		}
 	EDITOR_END
@@ -1032,26 +994,26 @@ static void menu_cb_showOneVowelMark (EDITOR_ARGS) {
 
 static void menu_cb_showVowelMarks (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"Show vowel marks", 0);
-		LABEL (L"note", L"")
-		OPTIONMENU (L"Data set", 1)
-			OPTION (L"American English")
-			OPTION (L"Dutch")
-			OPTION (L"None")
-		OPTIONMENU (L"Speaker", 1)
-			OPTION (L"Man")
-			OPTION (L"Woman")
-			OPTION (L"Child")
-		NATURAL (L"Font size (points)", L"14")
+	EDITOR_FORM (U"Show vowel marks", 0);
+		LABEL (U"note", U"")
+		OPTIONMENU (U"Data set", 1)
+			OPTION (U"American English")
+			OPTION (U"Dutch")
+			OPTION (U"None")
+		OPTIONMENU (U"Speaker", 1)
+			OPTION (U"Man")
+			OPTION (U"Woman")
+			OPTION (U"Child")
+		NATURAL (U"Font size (points)", U"14")
 	EDITOR_OK
-		if (my marksDataset == 9999) SET_STRING (L"note", L"(Warning: current vowel marks are not from one of these data sets.)")
-		SET_INTEGER (L"Data set", my marksDataset);
-		SET_INTEGER (L"Speaker", my speakerType);
-		SET_INTEGER (L"Font size", my marksFontSize);
+		if (my marksDataset == 9999) SET_STRING (U"note", U"(Warning: current vowel marks are not from one of these data sets.)")
+		SET_INTEGER (U"Data set", my marksDataset);
+		SET_INTEGER (U"Speaker", my speakerType);
+		SET_INTEGER (U"Font size", my marksFontSize);
 	EDITOR_DO
-		my marksDataset = prefs.marksDataset = GET_INTEGER (L"Data set");
-		my speakerType = prefs.speakerType = GET_INTEGER (L"Speaker");
-		my marksFontSize = prefs.marksFontSize = GET_INTEGER (L"Font size");
+		my marksDataset = prefs.marksDataset = GET_INTEGER (U"Data set");
+		my speakerType = prefs.speakerType = GET_INTEGER (U"Speaker");
+		my marksFontSize = prefs.marksFontSize = GET_INTEGER (U"Font size");
 		VowelEditor_setMarks (me, my marksDataset, my speakerType, my marksFontSize);
 		Graphics_updateWs (my g);
 	EDITOR_END
@@ -1059,7 +1021,7 @@ static void menu_cb_showVowelMarks (EDITOR_ARGS) {
 
 static void menu_cb_showVowelMarksFromTableFile (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM_READ (L"VowelEditor: Show vowel marks from Table file", L"VowelEditor: Show vowel marks from Table file...");
+	EDITOR_FORM_READ (U"VowelEditor: Show vowel marks from Table file", U"VowelEditor: Show vowel marks from Table file...");
 	EDITOR_DO_READ
 		VowelEditor_getVowelMarksFromTableFile (me, file);
 		Graphics_updateWs (my g);
@@ -1068,34 +1030,33 @@ static void menu_cb_showVowelMarksFromTableFile (EDITOR_ARGS) {
 
 static void menu_cb_setF0 (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"Set F0", 0);
-		POSITIVE (L"Start F0 (Hz)", L"150.0")
-		REAL (L"Slope (oct/s)", L"0.0")
+	EDITOR_FORM (U"Set F0", 0);
+		POSITIVE (U"Start F0 (Hz)", U"150.0")
+		REAL (U"Slope (oct/s)", U"0.0")
 	EDITOR_OK
 	EDITOR_DO
-		double f0 = GET_REAL (L"Start F0");
+		double f0 = GET_REAL (U"Start F0");
 		checkF0 (&my f0, &f0);
 		my f0.start = f0;
-		my f0.slopeOctPerSec = GET_REAL (L"Slope");
-		VowelEditor_setSource (me);
-		my f0TextField -> f_setString (Melder_double (my f0.start));
-		my f0SlopeTextField -> f_setString (Melder_double (my f0.slopeOctPerSec));
+		my f0.slopeOctPerSec = GET_REAL (U"Slope");
+		GuiText_setString (my f0TextField, Melder_double (my f0.start));
+		GuiText_setString (my f0SlopeTextField, Melder_double (my f0.slopeOctPerSec));
 	EDITOR_END
 }
 
 static void menu_cb_setF3F4 (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"Set F3 & F4", 0);
-		POSITIVE (L"F3 (Hz)", L"2500.0")
-		POSITIVE (L"B3 (Hz)", L"250.0")
-		POSITIVE (L"F4 (Hz)", L"3500.0")
-		POSITIVE (L"B4 (Hz)", L"350.0")
+	EDITOR_FORM (U"Set F3 & F4", 0);
+		POSITIVE (U"F3 (Hz)", U"2500.0")
+		POSITIVE (U"B3 (Hz)", U"250.0")
+		POSITIVE (U"F4 (Hz)", U"3500.0")
+		POSITIVE (U"B4 (Hz)", U"350.0")
 	EDITOR_OK
 	EDITOR_DO
-		double f3 = GET_REAL (L"F3"), b3 = GET_REAL (L"B3");
-		double f4 = GET_REAL (L"F4"), b4 = GET_REAL (L"B4");
+		double f3 = GET_REAL (U"F3"), b3 = GET_REAL (U"B3");
+		double f4 = GET_REAL (U"F4"), b4 = GET_REAL (U"B4");
 		if (f3 >= f4) {
-			Melder_throw ("F4 must be larger than F3.");
+			Melder_throw (U"F4 must be larger than F3.");
 		}
 		VowelEditor_setF3F4 (me, f3, b3, f4, b4);
 	EDITOR_END
@@ -1121,7 +1082,7 @@ static void VowelEditor_Vowel_addData (VowelEditor me, Vowel thee, double time,
 	fp -> numberOfFormants = 4;
 
 	Collection_addItem (thy ft -> points, fp.transfer());
-	RealTier_addPoint (thy pt, time, f0);
+	RealTier_addPoint (thy pt.get(), time, f0);
 }
 
 static void checkF1F2 (VowelEditor me, double *f1, double *f2) {
@@ -1140,7 +1101,7 @@ static void checkF1F2 (VowelEditor me, double *f1, double *f2) {
 }
 
 static void checkF0 (structVowelEditor_F0 *f0p, double *f0) {
-	if (*f0 == NUMundefined) {
+	if (! NUMdefined (*f0)) {
 		*f0 = f0p -> start;
 	}
 	if (*f0 > f0p -> maximum) {
@@ -1152,46 +1113,45 @@ static void checkF0 (structVowelEditor_F0 *f0p, double *f0) {
 }
 
 static void	checkXY (double *x, double *y) {
-	if (*x < 0) {
-		*x = 0;
-	} else if (*x > 1) {
-		*x = 1;
+	if (*x < 0.0) {
+		*x = 0.0;
+	} else if (*x > 1.0) {
+		*x = 1.0;
 	}
-	if (*y < 0) {
-		*y = 0;
-	} else if (*y > 1) {
-		*y = 1;
+	if (*y < 0.0) {
+		*y = 0.0;
+	} else if (*y > 1.0) {
+		*y = 1.0;
 	}
 }
 
 static void menu_cb_newTrajectory (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"New Trajectory", 0);
-		POSITIVE (L"Start F1 (Hz)", L"700.0")
-		POSITIVE (L"Start F2 (Hz)", L"1200.0")
-		POSITIVE (L"End F1 (Hz)", L"350.0")
-		POSITIVE (L"End F2 (Hz)", L"800.0")
-		POSITIVE (L"Duration (s)", L"0.25")
+	EDITOR_FORM (U"New Trajectory", 0);
+		POSITIVE (U"Start F1 (Hz)", U"700.0")
+		POSITIVE (U"Start F2 (Hz)", U"1200.0")
+		POSITIVE (U"End F1 (Hz)", U"350.0")
+		POSITIVE (U"End F2 (Hz)", U"800.0")
+		POSITIVE (U"Duration (s)", U"0.25")
 	EDITOR_OK
 	EDITOR_DO
-		double f0, f1, f2, time, duration = GET_REAL (L"Duration");
-		autoVowel vowel = Vowel_create (duration);
-		time = 0;
-		f0 =  getF0 (&my f0, time);
-		f1 = GET_REAL (L"Start F1");
-		f2 = GET_REAL (L"Start F2");
+		double duration = GET_REAL (U"Duration");
+		autoVowel newVowel = Vowel_create (duration);
+		double time = 0.0;
+		double f0 = getF0 (&my f0, time);
+		double f1 = GET_REAL (U"Start F1");
+		double f2 = GET_REAL (U"Start F2");
 		checkF1F2 (me, &f1, &f2);
-		VowelEditor_Vowel_addData (me, vowel.peek(), time, f1, f2, f0);
+		VowelEditor_Vowel_addData (me, newVowel.peek(), time, f1, f2, f0);
 		time = duration;
-		f0 =  getF0 (&my f0, time);
-		f1 = GET_REAL (L"End F1");
-		f2 = GET_REAL (L"End F2");
+		f0 = getF0 (&my f0, time);
+		f1 = GET_REAL (U"End F1");
+		f2 = GET_REAL (U"End F2");
 		checkF1F2 (me, &f1, &f2);
-		VowelEditor_Vowel_addData (me, vowel.peek(), time, f1, f2, f0);
+		VowelEditor_Vowel_addData (me, newVowel.peek(), time, f1, f2, f0);
 
-		my durationTextField -> f_setString (Melder_double (MICROSECPRECISION (duration)));
-		forget (my vowel);
-		my vowel = vowel.transfer();
+		GuiText_setString (my durationTextField, Melder_double (MICROSECPRECISION (duration)));
+		my vowel = newVowel.move();
 
 		Graphics_updateWs (my g);
 	EDITOR_END
@@ -1199,56 +1159,56 @@ static void menu_cb_newTrajectory (EDITOR_ARGS) {
 
 static void menu_cb_extendTrajectory (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"Extend Trajectory", 0);
-		POSITIVE (L"To F1 (Hz)", L"500.0")
-		POSITIVE (L"To F2 (Hz)", L"1500.0")
-		POSITIVE (L"Extra duration (s)", L"0.1")
+	EDITOR_FORM (U"Extend Trajectory", 0);
+		POSITIVE (U"To F1 (Hz)", U"500.0")
+		POSITIVE (U"To F2 (Hz)", U"1500.0")
+		POSITIVE (U"Extra duration (s)", U"0.1")
 	EDITOR_OK
 	EDITOR_DO
-		Vowel thee = my vowel;
-		double newDuration = thy xmax + GET_REAL (L"Extra duration");
+		Vowel thee = my vowel.get();
+		double newDuration = thy xmax + GET_REAL (U"Extra duration");
 		double f0 =  getF0 (&my f0, newDuration);
-		double f1 = GET_REAL (L"To F1");
-		double f2 = GET_REAL (L"To F2");
+		double f1 = GET_REAL (U"To F1");
+		double f2 = GET_REAL (U"To F2");
 		thy xmax = thy pt -> xmax = thy ft -> xmax = newDuration;
 		checkF1F2 (me, &f1, &f2);
 		VowelEditor_Vowel_addData (me, thee, newDuration, f1, f2, f0);
 
-		my durationTextField -> f_setString (Melder_double (MICROSECPRECISION (newDuration)));
+		GuiText_setString (my durationTextField, Melder_double (MICROSECPRECISION (newDuration)));
 		Graphics_updateWs (my g);
 	EDITOR_END
 }
 
 static void menu_cb_modifyTrajectoryDuration (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"Modify duration", 0);
-		POSITIVE (L"New duration (s)", L"0.5")
+	EDITOR_FORM (U"Modify duration", 0);
+		POSITIVE (U"New duration (s)", U"0.5")
 	EDITOR_OK
 	EDITOR_DO
-		my durationTextField -> f_setString (Melder_double (MICROSECPRECISION (GET_REAL (L"New duration"))));
+		GuiText_setString (my durationTextField, Melder_double (MICROSECPRECISION (GET_REAL (U"New duration"))));
 	EDITOR_END
 }
 
 static void menu_cb_shiftTrajectory (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"Shift trajectory", 0);
-		REAL (L"F1 (semitones)", L"0.5")
-		REAL (L"F2 (semitones)", L"0.5")
+	EDITOR_FORM (U"Shift trajectory", 0);
+		REAL (U"F1 (semitones)", U"0.5")
+		REAL (U"F2 (semitones)", U"0.5")
 	EDITOR_OK
 	EDITOR_DO
-		VowelEditor_shiftF1F2 (me, GET_REAL (L"F1"), GET_REAL (L"F2"));
+		VowelEditor_shiftF1F2 (me, GET_REAL (U"F1"), GET_REAL (U"F2"));
 		Graphics_updateWs (my g);
 	EDITOR_END
 }
 
 static void menu_cb_showTrajectoryTimeMarksEvery (EDITOR_ARGS) {
 	EDITOR_IAM (VowelEditor);
-	EDITOR_FORM (L"Show trajectory time marks every", 0);
-		REAL (L"Distance (s)", L"0.05")
+	EDITOR_FORM (U"Show trajectory time marks every", 0);
+		REAL (U"Distance (s)", U"0.05")
 	EDITOR_OK
-		SET_REAL (L"Distance", my markTraceEvery)
+		SET_REAL (U"Distance", my markTraceEvery)
 	EDITOR_DO
-		my markTraceEvery = GET_REAL (L"Distance");
+		my markTraceEvery = GET_REAL (U"Distance");
 		if (my markTraceEvery < 0) {
 			my markTraceEvery = 0;
 		}
@@ -1258,19 +1218,17 @@ static void menu_cb_showTrajectoryTimeMarksEvery (EDITOR_ARGS) {
 
 /********** BUTTON METHODS **********/
 
-static void gui_button_cb_play (I, GuiButtonEvent event) {
-	(void) event;
+static void gui_button_cb_play (I, GuiButtonEvent /*event*/) {
 	iam (VowelEditor);
 	autoSound thee = VowelEditor_createTarget (me);
-	Sound_play (thee.peek(), 0, 0);
+	Sound_play (thee.peek(), nullptr, nullptr);
 	Graphics_updateWs (my g);
 }
 
-static void gui_button_cb_publish (I, GuiButtonEvent event) {
-	(void) event;
+static void gui_button_cb_publish (I, GuiButtonEvent /*event*/) {
 	iam (VowelEditor);
 	autoSound publish = VowelEditor_createTarget (me);
-	my broadcastPublication (publish.transfer());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void gui_button_cb_reverse (I, GuiButtonEvent event) {
@@ -1283,82 +1241,65 @@ static void gui_button_cb_reverse (I, GuiButtonEvent event) {
 }
 
 /* Main drawing routine: it's been called after every call to Graphics_updateWs (g) */
-static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
+static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent /*event*/) {
 	iam (VowelEditor);
-	Melder_assert (me != NULL);
-	(void) event;
-	Melder_assert (my vowel != NULL);
+	Melder_assert (me);
+	Melder_assert (my vowel);
 	double ts = my vowel -> xmin, te = my vowel -> xmax;
-	FormantTier ft = (FormantTier) my vowel -> ft;
-	Melder_assert (ft != NULL);
-	static MelderString statusInfo = { 0 };
-	if (my g == 0) {
-		return;    // Could be the case in the very beginning.
+	FormantTier ft = my vowel -> ft.get();
+	Melder_assert (ft);
+	static MelderString statusInfo { 0 };
+	if (! my g) {
+		return;   // could be the case in the very beginning
 	}
 	Graphics_clearWs (my g);
 
 	appendF1F2F0 (&statusInfo, STATUSINFO_STARTINTR0, FormantTier_getValueAtTime (ft, 1, ts),
 	              FormantTier_getValueAtTime (ft, 2, ts), getF0 (&my f0, ts), STATUSINFO_ENDING);
-	my startInfo -> f_setString (statusInfo.string);
+	GuiLabel_setText (my startInfo, statusInfo.string);
 	MelderString_empty (&statusInfo);
 
 	appendF1F2F0 (&statusInfo, STATUSINFO_ENDINTR0, FormantTier_getValueAtTime (ft, 1, te),
 	              FormantTier_getValueAtTime (ft, 2, te), getF0 (&my f0, te), STATUSINFO_ENDING);
-	my endInfo -> f_setString (statusInfo.string);
+	GuiLabel_setText (my endInfo, statusInfo.string);
 	MelderString_empty (&statusInfo);
 
 	Graphics_setGrey (my g, 0.9);
-	Graphics_fillRectangle (my g, 0, 1, 0, 1);
+	Graphics_fillRectangle (my g, 0.0, 1.0, 0.0, 1.0);
 	Graphics_setInner (my g);
-	Graphics_setWindow (my g, 0, 1, 0, 1);
-	Graphics_setGrey (my g, 1);
-	Graphics_fillRectangle (my g, 0, 1, 0, 1);
+	Graphics_setWindow (my g, 0.0, 1.0, 0.0, 1.0);
+	Graphics_setGrey (my g, 1.0);
+	Graphics_fillRectangle (my g, 0.0, 1.0, 0.0, 1.0);
 	Graphics_unsetInner (my g);
-	Graphics_setGrey (my g, 0);
+	Graphics_setGrey (my g, 0.0);
 
 	VowelEditor_drawBackground (me, my g);
-	Melder_assert (me != NULL);
-	Melder_assert (my vowel != NULL);
-	Melder_assert (my vowel -> ft != NULL);
-	FormantTier_drawF1F2Trajectory (my vowel -> ft, my g, my f1min, my f1max, my f2min, my f2max, my markTraceEvery, my width);
-}
-
-static void gui_drawingarea_cb_resize__ (I, GuiDrawingAreaResizeEvent event) {
-	iam (VowelEditor);
-	(void) me;
-	(void) event;
-	if (me == NULL || my g == NULL) {
-		return;
-	}
-	my height = my drawingArea -> f_getHeight ();
-	my width = my drawingArea -> f_getWidth ();
-	Graphics_setWsViewport (my g, 0, my width , 0, my height);
-	Graphics_setWsWindow (my g, 0, my width, 0, my height);
-	Graphics_setViewport (my g, 0, my width, 0, my height);
-	Graphics_updateWs (my g);
+	Melder_assert (me);
+	Melder_assert (my vowel);
+	Melder_assert (my vowel -> ft);
+	FormantTier_drawF1F2Trajectory (my vowel -> ft.get(), my g, my f1min, my f1max, my f2min, my f2max, my markTraceEvery, my width);
 }
 
 static void gui_drawingarea_cb_resize (I, GuiDrawingAreaResizeEvent event) {
 	iam (VowelEditor);
-	Melder_assert (me != NULL);
-	if (my g == NULL) {
-		return;    // Could be the case in the very beginning.
+	Melder_assert (me);
+	if (! my g) {
+		return;   // could be the case in the very beginning
 	}
-	Graphics_setWsViewport (my g, 0, event -> width, 0, event -> height);
+	Graphics_setWsViewport (my g, 0.0, event -> width, 0.0, event -> height);
 	my width = event -> width;
 	my height = event -> height;
-	Graphics_setWsWindow (my g, 0, my width, 0, my height);
-	Graphics_setViewport (my g, 0, my width, 0, my height);
+	Graphics_setWsWindow (my g, 0.0, my width, 0.0, my height);
+	Graphics_setViewport (my g, 0.0, my width, 0.0, my height);
 	Graphics_updateWs (my g);
 
-	/* Save the current shell size as the user's preference for a new FunctionEditor. */
+	/* Save the current shell size as the user's preference for a new VowelEditor. */
 
-	prefs.shellWidth = my d_windowForm -> f_getShellWidth ();
-	prefs.shellHeight = my d_windowForm -> f_getShellHeight ();
+	prefs.shellWidth  = GuiShell_getShellWidth  (my d_windowForm);
+	prefs.shellHeight = GuiShell_getShellHeight (my d_windowForm);
 }
 
 static void VowelEditor_Vowel_updateTiers (VowelEditor me, Vowel thee, double time, double x, double y) {
-	double f3, b3, f4, b4;
 	if (time > thy xmax) {
 		thy xmax = time;
 		thy ft -> xmax = time;
@@ -1368,6 +1309,7 @@ static void VowelEditor_Vowel_updateTiers (VowelEditor me, Vowel thee, double ti
 	autoFormantPoint point = FormantPoint_create (time);
 
 	VowelEditor_getF1F2FromXY (me, x, y, &f1, &f2);
+	double f3, b3, f4, b4;
 	VowelEditor_getF3F4 (me, f1, f2, &f3, &b3, &f4, &b4);
 
 	point -> formant[0] = f1;
@@ -1380,16 +1322,15 @@ static void VowelEditor_Vowel_updateTiers (VowelEditor me, Vowel thee, double ti
 	point -> bandwidth[3] = b4;
 	point -> numberOfFormants = 4;
 	Collection_addItem (thy ft -> points, point.transfer());
-	RealTier_addPoint (thy pt, time, f0);
+	RealTier_addPoint (thy pt.get(), time, f0);
 }
 
 // shift key always extends what already is.
 // Special case : !soundFollowsMouse. The first click just defines the vowel's first f1f2-position,
 static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 	iam (VowelEditor);
-	(void) event;
-	Vowel thee = 0; autoVowel athee = 0;
-	double x, y, xb, yb, tb, t, dt = 0;
+	Vowel thee = nullptr; autoVowel athee;
+	double x, y, xb, yb, tb, t, dt = 0.0;
 	double t0 = Melder_clock ();
 	long iskipped = 0;
 	struct structGuiButtonEvent gb_event = { 0 };
@@ -1401,21 +1342,21 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 	if (event -> shiftKeyPressed) {
 		VowelEditor_updateExtendDuration (me);
 		(my shiftKeyPressed) ++;
-		thee = my vowel;
+		thee = my vowel.get();
 		dt = thy xmax + my extendDuration;
-		t = 0 + dt;
+		t = 0.0 + dt;
 		VowelEditor_Vowel_updateTiers (me, thee, t, x, y);
-		my durationTextField -> f_setString (Melder_double (t));
+		GuiText_setString (my durationTextField, Melder_double (t));
 		if (! my soundFollowsMouse) {
 			goto end;
 		}
 	} else {
-		t = 0;
+		t = 0.0;
 		my shiftKeyPressed = 0;
-		athee.reset (Vowel_create (MINIMUM_SOUND_DURATION));
+		athee = Vowel_create (MINIMUM_SOUND_DURATION);
 		thee = athee.peek();
 		VowelEditor_Vowel_updateTiers (me, thee, t, x, y);
-		my durationTextField -> f_setString (Melder_double (t));
+		GuiText_setString (my durationTextField, Melder_double (t));
 		if (! my soundFollowsMouse) {
 			VowelEditor_Vowel_updateTiers (me, thee, MINIMUM_SOUND_DURATION, x, y);
 			goto end;
@@ -1441,7 +1382,7 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 		Graphics_line (my g, xb, yb, x, y);
 
 		VowelEditor_Vowel_updateTiers (me, thee, t, x, y);
-		my durationTextField -> f_setString (Melder_double (MICROSECPRECISION (t)));
+		GuiText_setString (my durationTextField, Melder_double (MICROSECPRECISION (t)));
 	}
 	t = Melder_clock () - t0;
 	// To prevent ultra short clicks we set a minimum of 0.01 s duration
@@ -1449,7 +1390,7 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 		t = MINIMUM_SOUND_DURATION;
 	}
 	t += dt;
-	my durationTextField -> f_setString (Melder_double (MICROSECPRECISION (t)));
+	GuiText_setString (my durationTextField, Melder_double (MICROSECPRECISION (t)));
 	VowelEditor_Vowel_updateTiers (me, thee, t, x, y);
 
 	Graphics_xorOff (my g);
@@ -1457,10 +1398,10 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 end:
 	Graphics_unsetInner (my g);
 
-	if (my shiftKeyPressed == 0) {
-		forget (my vowel);
-		my vowel = athee.transfer();
+	if (! my shiftKeyPressed) {
+		my vowel = athee.move();
 	}
+	Melder_assert (! athee);
 	gui_button_cb_play (me, & gb_event);
 }
 
@@ -1470,14 +1411,12 @@ static void gui_drawingarea_cb_key (I, GuiDrawingAreaKeyEvent event) {
 	(void) event;
 }
 
-static void cb_publish (Editor editor, void *closure, Data publish) {
-	(void) editor;
-	(void) closure;
+static void cb_publish (Editor /*editor*/, void* /*closure*/, Daata publish) {
 	try {
-		praat_new (publish, 0);
+		praat_new (publish, U"");
 		praat_updateSelection ();
 	} catch (MelderError) {
-		Melder_flushError (0);
+		Melder_flushError ();
 	}
 }
 
@@ -1488,50 +1427,44 @@ static void updateWidgets (I) {
 
 void structVowelEditor :: v_destroy () {
 	forget (g);
-	forget (marks);
-	forget (source);
-	forget (target);
-	forget (vowel);
-	forget (f3); forget (b3);
-	forget (f4); forget (b4);
 	VowelEditor_Parent :: v_destroy ();
 }
 
 void structVowelEditor :: v_createMenus () {
 	VowelEditor_Parent :: v_createMenus ();
 
-	Editor_addMenu (this, L"View", 0);
-	Editor_addCommand (this, L"File", L"Preferences...", 0, menu_cb_prefs);
-	Editor_addCommand (this, L"File", L"-- publish data --", 0, NULL);
-	Editor_addCommand (this, L"File", L"Publish Sound", 0, menu_cb_publishSound);
-	Editor_addCommand (this, L"File", L"Extract KlattGrid", 0, menu_cb_extract_KlattGrid);
-	Editor_addCommand (this, L"File", L"Extract FormantGrid", 0, menu_cb_extract_FormantGrid);
-	Editor_addCommand (this, L"File", L"Extract PitchTier", 0, menu_cb_extract_PitchTier);
-	Editor_addCommand (this, L"File", L"-- drawing --", 0, NULL);
-	Editor_addCommand (this, L"File", L"Draw trajectory...", 0, menu_cb_drawTrajectory);
-	Editor_addCommand (this, L"File", L"-- scripting --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"-- f0 --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Set F0...", 0, menu_cb_setF0);
-	Editor_addCommand (this, L"Edit", L"Set F3 & F4...", 0, menu_cb_setF3F4);
-	Editor_addCommand (this, L"Edit", L"-- trajectory commands --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Reverse trajectory", 0, menu_cb_reverseTrajectory);
-	Editor_addCommand (this, L"Edit", L"Modify trajectory duration...", 0, menu_cb_modifyTrajectoryDuration);
-	Editor_addCommand (this, L"Edit", L"New trajectory...", 0, menu_cb_newTrajectory);
-	Editor_addCommand (this, L"Edit", L"Extend trajectory...", 0, menu_cb_extendTrajectory);
-	Editor_addCommand (this, L"Edit", L"Shift trajectory...", 0, menu_cb_shiftTrajectory);
-	Editor_addCommand (this, L"View", L"F1 & F2 range...", 0, menu_cb_ranges_f1f2);
-	Editor_addCommand (this, L"View", L"--show vowel marks--", 0, NULL);
-	Editor_addCommand (this, L"View", L"Show one vowel mark...", Editor_HIDDEN, menu_cb_showOneVowelMark);
-	Editor_addCommand (this, L"View", L"Show vowel marks...", Editor_HIDDEN, menu_cb_showVowelMarks);
-	Editor_addCommand (this, L"View", L"Show vowel marks from fixed set...", 0, menu_cb_showVowelMarks);
-	Editor_addCommand (this, L"View", L"Show vowel marks from Table file...", 0, menu_cb_showVowelMarksFromTableFile);
-	Editor_addCommand (this, L"View", L"--show trajectory time marks--", 0, NULL);
-	Editor_addCommand (this, L"View", L"Show trajectory time marks every...", 0, menu_cb_showTrajectoryTimeMarksEvery);
+	Editor_addMenu (this, U"View", 0);
+	Editor_addCommand (this, U"File", U"Preferences...", 0, menu_cb_prefs);
+	Editor_addCommand (this, U"File", U"-- publish data --", 0, nullptr);
+	Editor_addCommand (this, U"File", U"Publish Sound", 0, menu_cb_publishSound);
+	Editor_addCommand (this, U"File", U"Extract KlattGrid", 0, menu_cb_extract_KlattGrid);
+	Editor_addCommand (this, U"File", U"Extract FormantGrid", 0, menu_cb_extract_FormantGrid);
+	Editor_addCommand (this, U"File", U"Extract PitchTier", 0, menu_cb_extract_PitchTier);
+	Editor_addCommand (this, U"File", U"-- drawing --", 0, nullptr);
+	Editor_addCommand (this, U"File", U"Draw trajectory...", 0, menu_cb_drawTrajectory);
+	Editor_addCommand (this, U"File", U"-- scripting --", 0, nullptr);
+	Editor_addCommand (this, U"Edit", U"-- f0 --", 0, nullptr);
+	Editor_addCommand (this, U"Edit", U"Set F0...", 0, menu_cb_setF0);
+	Editor_addCommand (this, U"Edit", U"Set F3 & F4...", 0, menu_cb_setF3F4);
+	Editor_addCommand (this, U"Edit", U"-- trajectory commands --", 0, nullptr);
+	Editor_addCommand (this, U"Edit", U"Reverse trajectory", 0, menu_cb_reverseTrajectory);
+	Editor_addCommand (this, U"Edit", U"Modify trajectory duration...", 0, menu_cb_modifyTrajectoryDuration);
+	Editor_addCommand (this, U"Edit", U"New trajectory...", 0, menu_cb_newTrajectory);
+	Editor_addCommand (this, U"Edit", U"Extend trajectory...", 0, menu_cb_extendTrajectory);
+	Editor_addCommand (this, U"Edit", U"Shift trajectory...", 0, menu_cb_shiftTrajectory);
+	Editor_addCommand (this, U"View", U"F1 & F2 range...", 0, menu_cb_ranges_f1f2);
+	Editor_addCommand (this, U"View", U"--show vowel marks--", 0, nullptr);
+	Editor_addCommand (this, U"View", U"Show one vowel mark...", Editor_HIDDEN, menu_cb_showOneVowelMark);
+	Editor_addCommand (this, U"View", U"Show vowel marks...", Editor_HIDDEN, menu_cb_showVowelMarks);
+	Editor_addCommand (this, U"View", U"Show vowel marks from fixed set...", 0, menu_cb_showVowelMarks);
+	Editor_addCommand (this, U"View", U"Show vowel marks from Table file...", 0, menu_cb_showVowelMarksFromTableFile);
+	Editor_addCommand (this, U"View", U"--show trajectory time marks--", 0, nullptr);
+	Editor_addCommand (this, U"View", U"Show trajectory time marks every...", 0, menu_cb_showTrajectoryTimeMarksEvery);
 }
 
 void structVowelEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	VowelEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"VowelEditor help", '?', menu_cb_help);
+	EditorMenu_addCommand (menu, U"VowelEditor help", '?', menu_cb_help);
 }
 
 void structVowelEditor :: v_createChildren ()
@@ -1542,42 +1475,42 @@ void structVowelEditor :: v_createChildren ()
 	// Three buttons on a row: Play, Reverse, Publish
 	left = 10; right = left + button_width;
 	bottom_widgets_top = top = -MARGIN_BOTTOM + 10; bottom_widgets_bottom = bottom = -STATUS_INFO;
-	playButton = GuiButton_createShown (d_windowForm, left, right, top, bottom, L"Play", gui_button_cb_play, this, 0);
+	playButton = GuiButton_createShown (d_windowForm, left, right, top, bottom, U"Play", gui_button_cb_play, this, 0);
 	left = right + 10; right = left + button_width;
-	reverseButton = GuiButton_createShown (d_windowForm, left, right, top, bottom, L"Reverse", gui_button_cb_reverse, this, 0);
+	reverseButton = GuiButton_createShown (d_windowForm, left, right, top, bottom, U"Reverse", gui_button_cb_reverse, this, 0);
 	left = right + 10; right = left + button_width;
-	publishButton = GuiButton_createShown (d_windowForm, left, right, top, bottom, L"Publish", gui_button_cb_publish, this, 0);
+	publishButton = GuiButton_createShown (d_windowForm, left, right, top, bottom, U"Publish", gui_button_cb_publish, this, 0);
 	// Four Text widgets with the label on top: Duration, Extend, F0, Slope
 	// Make the F0 slope button 10 wider to accomodate the text
 	// We wil not use a callback from a Text widget. It will get called multiple times during the editing
 	// of the text. Better to have all editing done and then query the widget for its value!
 	left = right + 10; right = left + text_width; bottom_widgets_halfway = bottom = (top + bottom) / 2; top = bottom_widgets_top;
-	GuiLabel_createShown (d_windowForm, left, right, top , bottom, L"Duration (s):", 0);
+	GuiLabel_createShown (d_windowForm, left, right, top , bottom, U"Duration (s):", 0);
 	top = bottom; bottom = bottom_widgets_bottom;
 	durationTextField = GuiText_createShown (d_windowForm, left, right, top, bottom, 0);
 
 	left = right + 10; right = left + text_width; top = bottom_widgets_top; bottom = bottom_widgets_halfway;
-	GuiLabel_createShown (d_windowForm, left, right, top, bottom, L"Extend (s):", 0);
+	GuiLabel_createShown (d_windowForm, left, right, top, bottom, U"Extend (s):", 0);
 	top = bottom; bottom = bottom_widgets_bottom;
 	extendTextField = GuiText_createShown (d_windowForm, left, right, top, bottom, 0);
 
 	left = right + 10; right = left + text_width; top = bottom_widgets_top; bottom = bottom_widgets_halfway;
-	GuiLabel_createShown (d_windowForm, left, right, top, bottom, L"Start F0 (Hz):", 0);
+	GuiLabel_createShown (d_windowForm, left, right, top, bottom, U"Start F0 (Hz):", 0);
 	top = bottom; bottom = bottom_widgets_bottom;
 	f0TextField = GuiText_createShown (d_windowForm, left, right, top, bottom, 0);
 
 	left = right + 10; right = left + text_width + 10; top = bottom_widgets_top; bottom = bottom_widgets_halfway;
-	GuiLabel_createShown (d_windowForm, left, right, top, bottom, L"F0 slope (oct/s):", 0);
+	GuiLabel_createShown (d_windowForm, left, right, top, bottom, U"F0 slope (oct/s):", 0);
 	top = bottom; bottom = bottom_widgets_bottom;
 	f0SlopeTextField = GuiText_createShown (d_windowForm, left, right, top, bottom, 0);
 
 	// The status startInfo and endInfo widget at the bottom:
 
 	bottom = - (STATUS_INFO - Gui_LABEL_HEIGHT) / 2; top = bottom - Gui_LABEL_HEIGHT; left = MARGIN_LEFT; right = left + status_info_width;
-	startInfo = GuiLabel_createShown (d_windowForm, left, right, top, bottom, L"", 0);
+	startInfo = GuiLabel_createShown (d_windowForm, left, right, top, bottom, U"", 0);
 
 	left = right; right = left + status_info_width;
-	endInfo = GuiLabel_createShown (d_windowForm, left, right, top, bottom, L"", 0);
+	endInfo = GuiLabel_createShown (d_windowForm, left, right, top, bottom, U"", 0);
 
 	/***** Create drawing area. *****/
 	// Approximately square because for our defaults: f1min=200, f1max=1000 and f2min = 500, f2mx = 2500,
@@ -1585,46 +1518,37 @@ void structVowelEditor :: v_createChildren ()
 	//drawingArea = GuiDrawingArea_createShown (d_windowForm, 0, 0, Machine_getMenuBarHeight (), -MARGIN_BOTTOM,
 	//	gui_drawingarea_cb_expose, gui_drawingarea_cb_click, gui_drawingarea_cb_key, gui_drawingarea_cb_resize, this, 0);
 	drawingArea = GuiDrawingArea_createShown (d_windowForm, 0, 0, Machine_getMenuBarHeight (), -MARGIN_BOTTOM,
-		gui_drawingarea_cb_expose, gui_drawingarea_cb_click, NULL, gui_drawingarea_cb_resize, this, 0);
-	height = drawingArea -> f_getHeight ();
-	width = drawingArea -> f_getWidth ();
+		gui_drawingarea_cb_expose, gui_drawingarea_cb_click, nullptr, gui_drawingarea_cb_resize, this, 0);
+	width  = GuiControl_getWidth  (drawingArea);
+	height = GuiControl_getHeight (drawingArea);
 }
 
-static void VowelEditor_setSource (VowelEditor me) {
-	autoPitchTier pt = VowelEditor_to_PitchTier (me, my maximumDuration);
-	autoSound thee = PitchTier_to_Sound_pulseTrain (pt.peek(), my f0.samplingFrequency, my f0.adaptFactor, my f0.adaptTime, my f0.interpolationDepth, 0);
-	if (my source != 0) {
-		forget (my source);
-	}
-	my source = thee.transfer();
-}
-//
-static Sound VowelEditor_createTarget (VowelEditor me) {
+static autoSound VowelEditor_createTarget (VowelEditor me) {
 	try {
 		VowelEditor_updateVowel (me); // update pitch and duration
-		autoSound thee = Vowel_to_Sound_pulses (my vowel, 44100, 0.7, 0.05, 30);
+		autoSound thee = Vowel_to_Sound_pulses (my vowel.get(), 44100.0, 0.7, 0.05, 30);
 		Vector_scale (thee.peek(), 0.99);
 		Sound_fadeIn (thee.peek(), 0.005, 1);
 		Sound_fadeOut (thee.peek(), 0.005);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("Target Sound not created.");
+		Melder_throw (U"Target Sound not created.");
 	}
 }
 
-VowelEditor VowelEditor_create (const wchar_t *title, Data data) {
+autoVowelEditor VowelEditor_create (const char32 *title, Daata data) {
 	try {
-		trace ("enter");
+		trace (U"enter");
 		autoVowelEditor me = Thing_new (VowelEditor);
-		Melder_assert (me.peek() != NULL);
+		Melder_assert (me.peek());
 		Editor_init (me.peek(), 0, 0, prefs.shellWidth, prefs.shellHeight, title, data);
 #if motif
 		Melder_assert (XtWindow (my drawingArea -> d_widget));
 #endif
 		my g = Graphics_create_xmdrawingarea (my drawingArea);
-		Melder_assert (my g != NULL);
+		Melder_assert (my g);
 		Graphics_setFontSize (my g, 12);
-		my setPublicationCallback (cb_publish, NULL);
+		Editor_setPublicationCallback (me.peek(), cb_publish, nullptr);
 
 		my f1min = prefs.f1min;
 		my f1max = prefs.f1max;
@@ -1644,35 +1568,33 @@ VowelEditor VowelEditor_create (const wchar_t *title, Data data) {
 		VowelEditor_setF3F4 (me.peek(), prefs.f3, prefs.b3, prefs.f4, prefs.b4);
 		my maximumDuration = BUFFER_SIZE_SEC;
 		my extendDuration = prefs.extendDuration;
-		if (my data != 0) {
-			my vowel = Data_copy ( (Vowel) data);
+		if (my data) {
+			my vowel = Data_copy (static_cast<Vowel> (data));
 		} else {
 			my vowel = Vowel_create_twoFormantSchwa (0.2);
 		}
 		my markTraceEvery = prefs.markTraceEvery;
 		my f0 = f0default;
-		VowelEditor_setSource (me.peek());
-		my target = Sound_createSimple (1, my maximumDuration, my f0.samplingFrequency);
-		my f0TextField -> f_setString (Melder_double (my f0.start));
-		my f0SlopeTextField -> f_setString (Melder_double (my f0.slopeOctPerSec));
-		my durationTextField -> f_setString (L"0.2"); // Source has been created
-		my extendTextField -> f_setString (Melder_double (my extendDuration));
+		GuiText_setString (my f0TextField, Melder_double (my f0.start));
+		GuiText_setString (my f0SlopeTextField, Melder_double (my f0.slopeOctPerSec));
+		GuiText_setString (my durationTextField, U"0.2"); // Source has been created
+		GuiText_setString (my extendTextField, Melder_double (my extendDuration));
 		my grid = griddefault;
-		{
-			// This exdents because it's a hack:
-			struct structGuiDrawingAreaResizeEvent event = { my drawingArea, 0 };
-			event. width = my drawingArea -> f_getWidth ();
-			event. height = my drawingArea -> f_getHeight ();
-			gui_drawingarea_cb_resize (me.peek(), & event);
-		}
+{
+	// This exdents because it's a hack:
+	struct structGuiDrawingAreaResizeEvent event = { my drawingArea, 0 };
+	event. width  = GuiControl_getWidth  (my drawingArea);
+	event. height = GuiControl_getHeight (my drawingArea);
+	gui_drawingarea_cb_resize (me.peek(), & event);
+}
 		//struct structGuiDrawingAreaResizeEvent event = { 0 };
 		//event.widget = my drawingArea;
 		//gui_drawingarea_cb_resize (me, & event);
 		updateWidgets (me.peek());
-		trace ("exit");
-		return me.transfer();
+		trace (U"exit");
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("VowelEditor not created.");
+		Melder_throw (U"VowelEditor not created.");
 	}
 }
 
diff --git a/dwtools/VowelEditor.h b/dwtools/VowelEditor.h
index 4fe9b74..9ded620 100644
--- a/dwtools/VowelEditor.h
+++ b/dwtools/VowelEditor.h
@@ -2,7 +2,7 @@
 #define _VowelEditor_h_
 /* VowelEditor.h
  *
- * Copyright (C) 2008-2011 David Weenink
+ * Copyright (C) 2008-2011, 2014 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,8 +32,7 @@
 #include "Vowel_def.h"
 oo_CLASS_CREATE (Vowel, Function);
 
-struct structVowelEditor_F0
-{
+struct structVowelEditor_F0 {
 	double start;
 	double slopeOctPerSec;
 	double minimum, maximum;
@@ -41,46 +40,47 @@ struct structVowelEditor_F0
 	long interpolationDepth;
 };
 
-struct structVowelEditor_F1F2Grid
-{
+struct structVowelEditor_F1F2Grid {
 	double df1, df2;
 	int text_left, text_right, text_bottom, text_top;
 	double grey;
 };
 
 Thing_define (VowelEditor, Editor) {
-	// new data:
-	public:
-		int soundFollowsMouse, shiftKeyPressed;
-		double f1min, f1max, f2min, f2max;   // domain of graphics F1-F2 area
-		Matrix f3, b3, f4, b4;
-		int frequencyScale;   // 0: lin, 1: log, 2: bark, 3: mel
-		int axisOrientation;  // 0: origin topright + f1 down + f2 to left, 0: origin lb + f1 right +f2 up
-		int marksDataset, speakerType;   // 1 = male, 2 = female, 3 = child
-		int marksFontSize;
-		Graphics g;   // the drawing
-		short width, height;  // size of drawing area in pixels
-		Table marks;   // Vowel, F1, F2, Colour...
-		Vowel vowel;
-		double markTraceEvery;
-		structVowelEditor_F0 f0;
-		double maximumDuration, extendDuration;
-		Sound source, target;
-		GuiDrawingArea drawingArea;
-		GuiButton playButton, reverseButton, publishButton;
-		GuiText f0TextField, f0SlopeTextField, durationTextField, extendTextField;
-		GuiLabel startInfo, endInfo;
-		structVowelEditor_F1F2Grid grid;
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual bool v_scriptable () { return false; }
-		virtual void v_createChildren ();
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
+	int soundFollowsMouse, shiftKeyPressed;
+	double f1min, f1max, f2min, f2max;   // domain of graphics F1-F2 area
+	autoMatrix f3, b3, f4, b4;
+	int frequencyScale;   // 0: lin, 1: log, 2: bark, 3: mel
+	int axisOrientation;  // 0: origin topright + f1 down + f2 to left, 0: origin lb + f1 right +f2 up
+	int marksDataset, speakerType;   // 1 = male, 2 = female, 3 = child
+	int marksFontSize;
+	Graphics g;   // the drawing
+	short width, height;  // size of drawing area in pixels
+	autoTable marks;   // Vowel, F1, F2, Colour...
+	autoVowel vowel;
+	double markTraceEvery;
+	structVowelEditor_F0 f0;
+	double maximumDuration, extendDuration;
+	GuiDrawingArea drawingArea;
+	GuiButton playButton, reverseButton, publishButton;
+	GuiText f0TextField, f0SlopeTextField, durationTextField, extendTextField;
+	GuiLabel startInfo, endInfo;
+	structVowelEditor_F1F2Grid grid;
+
+	void v_destroy ()
+		override;
+	bool v_scriptable ()
+		override { return false; }
+	void v_createChildren ()
+		override;
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
 };
 
-VowelEditor VowelEditor_create (const wchar_t *title, Data data);
+autoVowelEditor VowelEditor_create (const char32 *title, Daata data);
 
 void VowelEditor_prefs ();
 
-#endif /* _VowelEditor_h_ */
\ No newline at end of file
+#endif /* _VowelEditor_h_ */
diff --git a/dwtools/Vowel_def.h b/dwtools/Vowel_def.h
index 6021ea5..f1e6f3a 100644
--- a/dwtools/Vowel_def.h
+++ b/dwtools/Vowel_def.h
@@ -1,6 +1,6 @@
 /* Vowel_def.h
  * 
- * Copyright (C) 2011 David Weenink & Paul Boersma
+ * Copyright (C) 2011,2015 David Weenink & Paul Boersma
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,8 +20,8 @@
 
 #define ooSTRUCT Vowel
 oo_DEFINE_CLASS (Vowel, Function)
-	oo_OBJECT (PitchTier, 0, pt)
-	oo_OBJECT (FormantTier, 0, ft)
+	oo_AUTO_OBJECT (PitchTier, 0, pt)
+	oo_AUTO_OBJECT (FormantTier, 0, ft)
 oo_END_CLASS (Vowel)
 #undef ooSTRUCT
 
diff --git a/dwtools/manual_BSS.cpp b/dwtools/manual_BSS.cpp
index 21413a1..04fa2fc 100644
--- a/dwtools/manual_BSS.cpp
+++ b/dwtools/manual_BSS.cpp
@@ -26,87 +26,87 @@
 void manual_BSS (ManPages me);
 void manual_BSS (ManPages me)
 {
-MAN_BEGIN (L"CrossCorrelationTable", L"djmw", 20110105)
-INTRO (L"One of the types of objects in Praat. A CrossCorrelationTable represents the cross-correlations between "
+MAN_BEGIN (U"CrossCorrelationTable", U"djmw", 20110105)
+INTRO (U"One of the types of objects in Praat. A CrossCorrelationTable represents the cross-correlations between "
 	"a number of signals. Cell [%i,%j] of a CrossCorrelationTable contains the cross-correlation between the %i-th "
 	"and the %j-th signal. For example, the CrossCorrelationTable of an %n-channel sound is a %n\\xx%n table where "
 	"the number in cell [%i,%j] is the cross-correlation of channel %i with channel %j (for a particular lag time %\\ta).")
-NORMAL (L"A CrossCorrelationTable has a square matrix whose cells contain the cross-correlations between "
+NORMAL (U"A CrossCorrelationTable has a square matrix whose cells contain the cross-correlations between "
 	"the signals and a centroid vector with the average value of each signal.")
-ENTRY (L"Remarks")
-NORMAL (L"Sometimes in the statistical literature, the cross-correlation between signals is also called "
+ENTRY (U"Remarks")
+NORMAL (U"Sometimes in the statistical literature, the cross-correlation between signals is also called "
 	"\"covariance\". However, the only thing a @@Covariance@ has in common with a CrossCorrelationTable is that "
 	"both are symmetric matrices. The differences between a CrossCorrelationTable and a Covariance are:")
-TAG (L"1. a Covariance matrix is always positive-definite; for a cross-correlation table this is only guaranteed if "
+TAG (U"1. a Covariance matrix is always positive-definite; for a cross-correlation table this is only guaranteed if "
 	"the lag time %\\ta = 0.")
-TAG (L"2. The elements %%c__ij_% in a Covariance always satisfy |%%c__ij_%/\\Vr(%%c__ii_%\\.c%%c__jj_%)| \\<_ 1; this is "
+TAG (U"2. The elements %%c__ij_% in a Covariance always satisfy |%%c__ij_%/\\Vr(%%c__ii_%\\.c%%c__jj_%)| \\<_ 1; this is "
 	"generally not the case for cross-correlations.")
 MAN_END
 
-MAN_BEGIN (L"CrossCorrelationTables", L"djmw", 20101227)
-INTRO (L"One of the types of objects in Praat. A CrossCorrelationTables represents a collection of @@CrossCorrelationTable@ objects.")
+MAN_BEGIN (U"CrossCorrelationTables", U"djmw", 20101227)
+INTRO (U"One of the types of objects in Praat. A CrossCorrelationTables represents a collection of @@CrossCorrelationTable@ objects.")
 MAN_END
 
-MAN_BEGIN (L"CrossCorrelationTables: Create test set...", L"djmw", 20110212)
-INTRO (L"Create a collection of @@CrossCorrelationTable at s that are all derived from different diagonal matrices by the same transformation matrix.")
-ENTRY (L"Settings")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), L""
+MAN_BEGIN (U"CrossCorrelationTables: Create test set...", U"djmw", 20110212)
+INTRO (U"Create a collection of @@CrossCorrelationTable at s that are all derived from different diagonal matrices by the same transformation matrix.")
+ENTRY (U"Settings")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), U""
 	Manual_DRAW_SETTINGS_WINDOW ("CrossCorrelationTables: Create test set", 4)
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Matrix dimension", "5")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Number of matrices", "20")
 	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN("First is positive-definite",1)
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Sigma", "0.02")
 )
-TAG (L"##Matrix dimension")
-DEFINITION (L"determines the size of the square matrix with cross-correlations.")
-TAG (L"##Number of matrices")
-DEFINITION (L"determines the number of matrices that have to be generated.")
-TAG (L"##First is positive-definite")
-DEFINITION (L"guarantees that the first matrix of the series is positive definite.")
-TAG (L"##Sigma")
-DEFINITION (L"the standard deviation of the noise that is added to each transformation matrix element. A value "
+TAG (U"##Matrix dimension")
+DEFINITION (U"determines the size of the square matrix with cross-correlations.")
+TAG (U"##Number of matrices")
+DEFINITION (U"determines the number of matrices that have to be generated.")
+TAG (U"##First is positive-definite")
+DEFINITION (U"guarantees that the first matrix of the series is positive definite.")
+TAG (U"##Sigma")
+DEFINITION (U"the standard deviation of the noise that is added to each transformation matrix element. A value "
 	"of zero makes all the cross-correlation matrices jointly diagonalizable. A value greater than zero "
 	"makes each transformation matrix a little different and the collection not jointly "
 	"diagonalizable anymore.")
-ENTRY (L"Algorithm")
-NORMAL (L"All the CrossCorrelationTable matrices are generated as #V\\'p\\.c#D__%k_\\.c #V, where #D__%k_ is a diagonal matrix "
+ENTRY (U"Algorithm")
+NORMAL (U"All the CrossCorrelationTable matrices are generated as #V\\'p\\.c#D__%k_\\.c #V, where #D__%k_ is a diagonal matrix "
 	"with entries randomly choosen from the [-1,1] interval. The matrix #V is a \"random\" orthogonal matrix "
 	"obtained from the singular value decomposition of a matrix #M = #U\\.c#D\\.c#V\\'p, where the cells of the "
 	"matrix #M are random Gaussian numbers with mean 0 and standard deviation 1.")
-NORMAL (L"If the first matrix has to be positive definite, the numbers on the diagonal of #D__1_ are randomly "
+NORMAL (U"If the first matrix has to be positive definite, the numbers on the diagonal of #D__1_ are randomly "
 	"chosen from the [0.1,1] interval.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To CrossCorrelationTable...", L"djmw", 20110212)
-INTRO (L"A command that creates a @@CrossCorrelationTable@ form every selected @@Sound@ object.")
-ENTRY (L"Settings")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (2), L""
+MAN_BEGIN (U"Sound: To CrossCorrelationTable...", U"djmw", 20110212)
+INTRO (U"A command that creates a @@CrossCorrelationTable@ form every selected @@Sound@ object.")
+ENTRY (U"Settings")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (2), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Sound: To CrossCorrelationTable", 2)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE("Time range", "0.0", "10.0")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Lag time", "0.0")
 )
-TAG (L"##Time range (s)#,")
-DEFINITION (L"determines the time range over which the table is calculated.")
-TAG (L"##Lag time (s)#,")
-DEFINITION (L"determines the lag time.")
-ENTRY (L"Algorithm")
-NORMAL (L"The cross-correlation between channel %i and channel %j for lag time \\ta is defined as the "
+TAG (U"##Time range (s)#,")
+DEFINITION (U"determines the time range over which the table is calculated.")
+TAG (U"##Lag time (s)#,")
+DEFINITION (U"determines the lag time.")
+ENTRY (U"Algorithm")
+NORMAL (U"The cross-correlation between channel %i and channel %j for lag time \\ta is defined as the "
 	"discretized #integral")
-FORMULA (L"cross-corr (%c__%i_, %c__%j_) [%\\ta] \\=3 \\su__%t_ %c__%i_[%t] %c__%j_[%t+%\\ta] %%\\Det%,")
-NORMAL (L"where %t and %t+%\\ta are discrete times and %%\\Det% is the @@sampling period at . ")
+FORMULA (U"cross-corr (%c__%i_, %c__%j_) [%\\ta] \\=3 \\su__%t_ %c__%i_[%t] %c__%j_[%t+%\\ta] %%\\Det%,")
+NORMAL (U"where %t and %t+%\\ta are discrete times and %%\\Det% is the @@sampling period at . ")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Covariance (channels)...", L"djmw", 20120303)
-INTRO (L"Detemines the @@Covariance|covariances@ between the channels of a selected @Sound.")
-NORMAL (L"The covariance of a sound is determined by calculating the @@CrossCorrelationTable@ of a multichannel sound for a lag time equal to zero.")
+MAN_BEGIN (U"Sound: To Covariance (channels)...", U"djmw", 20120303)
+INTRO (U"Detemines the @@Covariance|covariances@ between the channels of a selected @Sound.")
+NORMAL (U"The covariance of a sound is determined by calculating the @@CrossCorrelationTable@ of a multichannel sound for a lag time equal to zero.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Sound (blind source separation)...", L"djmw", 20140224)
-INTRO (L"Analyze the selected multi-channel sound into its independent components by an iterative method.")
-NORMAL (L"The @@blind source separation@ method to find the independent components tries to simultaneously diagonalize a number of "
+MAN_BEGIN (U"Sound: To Sound (blind source separation)...", U"djmw", 20140224)
+INTRO (U"Analyze the selected multi-channel sound into its independent components by an iterative method.")
+NORMAL (U"The @@blind source separation@ method to find the independent components tries to simultaneously diagonalize a number of "
 	"@@CrossCorrelationTable at s that are calculated from the multi-channel sound at different lag times.")
-ENTRY (L"Settings")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6), L""
+ENTRY (U"Settings")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Sound: To Sound (blind source separation)", 6)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE("Time range (s)", "0.0", "10.0")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Number of cross-correlations", "20")
@@ -115,80 +115,80 @@ SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6), L""
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Tolerance", "0.001")
 	Manual_DRAW_SETTINGS_WINDOW_OPTIONMENU("Diagonalization method", "ffdiag")
 )
-TAG (L"##Time range (s)")
-DEFINITION (L"defines the time range over which the ##CrossCorrelationTable#s of the sound will be calculated.")
-TAG (L"##Number of cross-correlations")
-DEFINITION (L"defines the number of ##CrossCorrelationTable#s to be calculated.")
-TAG (L"##Lag times")
-DEFINITION (L"defines the lag time %\\ta__0_ for the ##CrossCorrelationTable#s. These tables "
+TAG (U"##Time range (s)")
+DEFINITION (U"defines the time range over which the ##CrossCorrelationTable#s of the sound will be calculated.")
+TAG (U"##Number of cross-correlations")
+DEFINITION (U"defines the number of ##CrossCorrelationTable#s to be calculated.")
+TAG (U"##Lag times")
+DEFINITION (U"defines the lag time %\\ta__0_ for the ##CrossCorrelationTable#s. These tables "
 	"are calculated at lag times %\\ta__k_=(%k - 1)%\\ta__0_, where %k runs from 1 to %%numberOfCrosscorrelations%.")
-TAG (L"##Maximum number of iterations")
-DEFINITION (L"defines a stopping criterion for the iteration. The iteration will stops when this number is reached.")
-TAG (L"##Tolerance")
-DEFINITION (L"defines another stopping criterion that depends on the method used.")
-TAG (L"##Diagonalization method")
-DEFINITION (L"defines the method to determine the independent components.")
-ENTRY (L"Algorithm")
-NORMAL (L"This method tries to decompose the sound according to the %%instantaneous% mixing model")
-FORMULA (L"#Y=#A\\.c#X.")
-NORMAL (L"In this model #Y is a matrix with the selected multi-channel sound, #A is a so-called "
+TAG (U"##Maximum number of iterations")
+DEFINITION (U"defines a stopping criterion for the iteration. The iteration will stops when this number is reached.")
+TAG (U"##Tolerance")
+DEFINITION (U"defines another stopping criterion that depends on the method used.")
+TAG (U"##Diagonalization method")
+DEFINITION (U"defines the method to determine the independent components.")
+ENTRY (U"Algorithm")
+NORMAL (U"This method tries to decompose the sound according to the %%instantaneous% mixing model")
+FORMULA (U"#Y=#A\\.c#X.")
+NORMAL (U"In this model #Y is a matrix with the selected multi-channel sound, #A is a so-called "
 	"%%mixing matrix% and #X is a matrix with the independent components. "
 	"Essentially the model says that each channel in the multi-channel sound is a linear combination of the "
 	"independent sound components in #X. "
 	"If we would know the mixing matrix #A we could easily solve the model above for #X by standard means. "
 	"However, if we don't know #A and we don't know #X, the decomposition of #Y is underdetermined.  This means there "
 	"are an infinite number of possible combinations of #A and #X that result in the same #Y. ")
-NORMAL (L"One approach to solve the equation above is to make assumptions about the statistical properties "
+NORMAL (U"One approach to solve the equation above is to make assumptions about the statistical properties "
 	"of the components in the matrix #X: it turns out that a sufficient assumption is to assume that the "
 	"components in #X at each time instant are %%statistically independent%. This is not an unrealistic "
 	"assumption in many cases, although in practice it need not be exactly the case. Another assumption is "
 	"that the mixing matrix is constant, which means that the mixing conditions did not change during the recoding of the sound." )
-NORMAL (L"The theory says that statistically independent signals are not correlated (although the reverse "
+NORMAL (U"The theory says that statistically independent signals are not correlated (although the reverse "
 	"is not always true: signals that are not correlated don't have to be statistically independent). "
 	"The methods implemented here all follow this lead as follows. If we calculate the @@CrossCorrelationTable@ "
 	"for the left and the right side signals of the equation above, then, "
 	"for the multi-channel sound #Y this will result in a cross-correlation matrix #C. For the right side we "
 	"obtain #A\\.c#D\\.c#A\\'p, where #D is a diagonal matrix because all the cross-correlations between "
 	"different independent components are zero by definition. This results in the following identity: ")
-FORMULA (L"#C(\\ta)=#A\\.c#D(\\ta)\\.c#A\\'p, for all values of the lag time \\ta.")
-NORMAL (L"This equation says that, given the model, the cross-correlation matrix can be diagonalized for "
+FORMULA (U"#C(\\ta)=#A\\.c#D(\\ta)\\.c#A\\'p, for all values of the lag time \\ta.")
+NORMAL (U"This equation says that, given the model, the cross-correlation matrix can be diagonalized for "
 	"all values of the lag time %%by the same transformation matrix% #A.")
-NORMAL (L"If we calculate the cross-correlation matrices for a number of different lag times, say 20, we "
+NORMAL (U"If we calculate the cross-correlation matrices for a number of different lag times, say 20, we "
 	"then have to obtain the matrix #A that diagonalizes them all. Unfortunately there is no closed form solution "
 	"that diagonalizes more than two matrices at the same time and we have to resort to iterative "
 	"algorithms for joint diagonalization. ")
-NORMAL (L"Two of these algorithms are the ##qdiag# method as described in @@Vollgraf & Obermayer (2006)@ "
+NORMAL (U"Two of these algorithms are the ##qdiag# method as described in @@Vollgraf & Obermayer (2006)@ "
 	"and the ##ffdiag# method as described in @@Ziehe et al. (2004)@. ")
-NORMAL (L"Unfortunately the convergence criteria of these two algorithms cannot easily be compared as "
+NORMAL (U"Unfortunately the convergence criteria of these two algorithms cannot easily be compared as "
 	"the criterion for the ##ffdiag# algorithm is the relative change of the square root of the sum of the "
 	"squared off-diagonal "
 	"elements of the transformed cross-correlation matrices and the criterion for ##qdiag# is the largest "
 	"change in the eigenvectors norm during an iteration.")
-ENTRY (L"Example")
-NORMAL (L"We start by creating a speech synthesizer that need to create two sounds. We will mix the two sounds and finally our blind source separation software will try to undo our mixing by extracting the two original sounds as well as possible from the two mixtures.")
-CODE(L"synth = Create SpeechSynthesizer: \"English\", \"default\"")
-CODE(L"s1 = To Sound: \"This is some text\", \"no\"")
-NORMAL (L"The first speech sound was created from the text \"This is some text\" at a speed of 175 words per minute.")
-CODE(L"selectObject: synth")
-CODE(L"Set speech output settings: 44100, 0.01, 80, 50, 145, \"no\", \"IPA\"")
-CODE(L"s2 = To Sound.: \"Abracadabra, abra\", 0.01, 80, 50, 145, \"yes\", \"no\", \"no\", \"yes\"")
-NORMAL (L"The second sound \"Abracadabra, abra\" was synthesized at 145 words per minute with a somewhat larger pitch excursion (80) than the previous sound (50).")
-CODE(L"plusObject: s1")
-CODE(L"stereo = Combine to stereo")
-NORMAL (L"We combine the two separate sounds into one stereo sound because our blind source separation works on multichannel sounds only.")
-CODE(L"mm = Create simple MixingMatrix: \"mm\", 2, 2, \"1.0 2.0 2.0 1.0\"")
-NORMAL (L"A two by two MixingMatrix is created.")
-CODE(L"plusObject: stereo")
-CODE(L"Mix")
-NORMAL (L"The last command, Mix, creates a new two-channel sound where each channel is a linear mixture of the two "
+ENTRY (U"Example")
+NORMAL (U"We start by creating a speech synthesizer that need to create two sounds. We will mix the two sounds and finally our blind source separation software will try to undo our mixing by extracting the two original sounds as well as possible from the two mixtures.")
+CODE(U"synth = Create SpeechSynthesizer: \"English\", \"default\"")
+CODE(U"s1 = To Sound: \"This is some text\", \"no\"")
+NORMAL (U"The first speech sound was created from the text \"This is some text\" at a speed of 175 words per minute.")
+CODE(U"selectObject: synth")
+CODE(U"Set speech output settings: 44100, 0.01, 80, 50, 145, \"no\", \"IPA\"")
+CODE(U"s2 = To Sound.: \"Abracadabra, abra\", 0.01, 80, 50, 145, \"yes\", \"no\", \"no\", \"yes\"")
+NORMAL (U"The second sound \"Abracadabra, abra\" was synthesized at 145 words per minute with a somewhat larger pitch excursion (80) than the previous sound (50).")
+CODE(U"plusObject: s1")
+CODE(U"stereo = Combine to stereo")
+NORMAL (U"We combine the two separate sounds into one stereo sound because our blind source separation works on multichannel sounds only.")
+CODE(U"mm = Create simple MixingMatrix: \"mm\", 2, 2, \"1.0 2.0 2.0 1.0\"")
+NORMAL (U"A two by two MixingMatrix is created.")
+CODE(U"plusObject: stereo")
+CODE(U"Mix")
+NORMAL (U"The last command, Mix, creates a new two-channel sound where each channel is a linear mixture of the two "
     "channels in the stereo sound, i.e. channel 1 is the sum of s1 and s2 with mixture strengths of 1 and 2, respectively. "
     "The second channel is also the sum of s1 and s2 but now with mixture strengths 2 and 1, respectively.")
-CODE (L"To Sound (blind source separation): 0.1, 1, 20, 0.0002, 100, 0.001, \"ffdiag\"")
-NORMAL (L"The two channels in the new sound that results from this command contain a reasonable approximation of "
+CODE (U"To Sound (blind source separation): 0.1, 1, 20, 0.0002, 100, 0.001, \"ffdiag\"")
+NORMAL (U"The two channels in the new sound that results from this command contain a reasonable approximation of "
     "the two originating sounds.")
-NORMAL (L"In the top panel the two speech sounds \"This is some text\" and \"abracadabra, abra\". "
+NORMAL (U"In the top panel the two speech sounds \"This is some text\" and \"abracadabra, abra\". "
     "The middle panel shows the two mixed sounds while the lower panel shows the two sounds after unmixing.")
-SCRIPT (6, 6, L" "
+SCRIPT (6, 6, U" "
 	"syn = Create SpeechSynthesizer: \"English\", \"default\"\n"
 	"s1 = To Sound: \"This is some text\", \"no\"\n"
     "selectObject: syn\n"
@@ -211,60 +211,60 @@ SCRIPT (6, 6, L" "
 	"Draw inner box\n"
 	"removeObject: unmixed, syn, stereo, s1, s2, mixed, mm\n"
 )
-NORMAL (L"The first two panels will not change between different sessions of praat. The last panel, which shows "
+NORMAL (U"The first two panels will not change between different sessions of praat. The last panel, which shows "
     "the result of the blind source separation, i.e. unmixing, will not always be the same because of two things. In the first place the unmixing always starts with an initialisation with random values of the parameters that "
     "we have to determine for the blind source separation. Therefore the iteration sequence will never be the same and the final outcomes might differ. In the second place, as was explained in the @@blind source separation@ manual, the unmixing is only "
     "unique up to a scale factor and a permutation. Therefore the channels in the unmixed sound do not necessarily correspond to the corresponding channel in our \"original\" stereo sound.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Sound (whiten channels)...", L"djmw", 20120303)
-INTRO (L"Transforms the channels of the selected @Sound linearly to make them white, i.e. the new channels will be uncorrelated and their variances equal unity.")
-ENTRY (L"Settings")
-TAG (L"##Variance fraction to keep#,")
-DEFINITION (L"determines, indirectly, how many channels the final sound will have.")
-ENTRY (L"Algorithm")
-NORMAL (L"We start by determining the @@Sound: To Covariance (channels)...|covariance@ of the selected sound. "
+MAN_BEGIN (U"Sound: To Sound (whiten channels)...", U"djmw", 20120303)
+INTRO (U"Transforms the channels of the selected @Sound linearly to make them white, i.e. the new channels will be uncorrelated and their variances equal unity.")
+ENTRY (U"Settings")
+TAG (U"##Variance fraction to keep#,")
+DEFINITION (U"determines, indirectly, how many channels the final sound will have.")
+ENTRY (U"Algorithm")
+NORMAL (U"We start by determining the @@Sound: To Covariance (channels)...|covariance@ of the selected sound. "
    "Next a @@Principal component analysis|principal component analysis@ determines the eigenvalues and eigenvectors of the covariance matrix. The settings of the variance fraction to keep determines how many eigenvalues and eigenvectors we use for the whitening. This number, %p, will also be equal to the number of channels of the resulting whitened sound.")
-NORMAL (L"In mathematical terms. For an %n-channel sound, if #E is the matrix with the eigenvectors and #D=diag (%d__1_, %d__2_,..., %d__n_) is the diagonal matrix with the "
+NORMAL (U"In mathematical terms. For an %n-channel sound, if #E is the matrix with the eigenvectors and #D=diag (%d__1_, %d__2_,..., %d__n_) is the diagonal matrix with the "
     "eigenvalues of the covariance matrix, then the whitening matrix is #W = #E#D^^-1/2^#E\\'p, where #D^^-1/2^=diag (%d__1_^^-1/2^, ..., %d__p_^^-1/2^, 0, ..., 0). Only the %p most important eigenvalues have been retained, where %p was determined as the smallest integer for which (%d__1_+%d__2_+...%d__%p_)/(%d__1_+%d__2_+ ... + %d__%n_) >= %%varianceFractionToKeep%.")
-NORMAL (L"The resulting sound samples of the whitened sound, %w__%ij_, are then calculated from the samples of the "
+NORMAL (U"The resulting sound samples of the whitened sound, %w__%ij_, are then calculated from the samples of the "
     "original sound, %s__%kj_, as %w__%ij_ = \\Si__%k_ W__%ik_ %s__%kj_, where 1 \\<_ %i \\<_%p, 1 \\<_ %j \\<_ numberOfSamples and 1 \\<_ %k \\<_ %n.")
 MAN_END
 
-MAN_BEGIN (L"blind source separation", L"djmw", 20120907)
-INTRO (L"Blind source separation (BSS) is a technique for estimating individual source components from their mixtures "
+MAN_BEGIN (U"blind source separation", U"djmw", 20120907)
+INTRO (U"Blind source separation (BSS) is a technique for estimating individual source components from their mixtures "
 	"at multiple sensors. It is called %blind because we don't use any other information besides the mixtures. ")
-NORMAL (L"For example, imagine a room with a number of persons present and a number of microphones for recording. "
+NORMAL (U"For example, imagine a room with a number of persons present and a number of microphones for recording. "
 	"When one or more persons are speaking at the same time, each microphone registers a different %mixture of individual speaker's audio signals. It is the task of BSS to untangle these mixtures into their sources, i.e. the individual speaker's audio signals. "
 	"In general, this is a difficult problem because of several complicating factors. ")
-LIST_ITEM (L"\\bu Different locations of speakers and microphones in the room: the individual speaker's audio signals do not reach all microphones at the same time. ")
-LIST_ITEM (L"\\bu Room acoustics: the signal that reaches a microphone is composed of the signal that %directly travels to the microphone and parts that come from room reverberations and echos. ")
-LIST_ITEM (L"\\bu Varying distances to microphones: one or more speakers might be moving. This makes the mixing time dependent.")
-NORMAL (L"If the number of sensors is %larger than the number of sources we speak of an %overdetermined problem. If the number of sensors and the number of sources are %equal we speak of a %determined problem. The more difficult problem is the %underdetermined one where the number of sensors is %less than the number of sources.")
-ENTRY (L"Typology of mixtures")
-NORMAL (L"In general two different types of mixtures are considered in the literature: %%instantaneous "
+LIST_ITEM (U"\\bu Different locations of speakers and microphones in the room: the individual speaker's audio signals do not reach all microphones at the same time. ")
+LIST_ITEM (U"\\bu Room acoustics: the signal that reaches a microphone is composed of the signal that %directly travels to the microphone and parts that come from room reverberations and echos. ")
+LIST_ITEM (U"\\bu Varying distances to microphones: one or more speakers might be moving. This makes the mixing time dependent.")
+NORMAL (U"If the number of sensors is %larger than the number of sources we speak of an %overdetermined problem. If the number of sensors and the number of sources are %equal we speak of a %determined problem. The more difficult problem is the %underdetermined one where the number of sensors is %less than the number of sources.")
+ENTRY (U"Typology of mixtures")
+NORMAL (U"In general two different types of mixtures are considered in the literature: %%instantaneous "
 	"mixtures% and %%convolutive mixtures%. ")
-TAG (L"%%Instantaneous mixtures%")
-DEFINITION (L"where the mixing is instantaneous, corresponds to the model #Y=#A\\.c#X. In this model #Y is a matrix with the recorded microphone sounds, #A is a so-called "
+TAG (U"%%Instantaneous mixtures%")
+DEFINITION (U"where the mixing is instantaneous, corresponds to the model #Y=#A\\.c#X. In this model #Y is a matrix with the recorded microphone sounds, #A is a so-called "
 	"%%mixing matrix% and #X is a matrix with the independent source signals. "
 	"Essentially the model says that the signal that each microphone records is a (possibly different) linear combination of the %same source signals.  "
 	"If we would know the mixing matrix #A we could easily solve the model above for #X by standard means. "
 	"However, in general we don't know #A and #X and there are an infinite number of possible decompositions for #Y. The problem is however solvable by making some (mild) assumptions about #A and #X. ")
-TAG (L"%%Convolutive mixtures%")
-DEFINITION (L"are mixtures where the mixing is of convolutive nature, i.e. the model is ")
-FORMULA (L"%%y__i_ (n)% = \\Si__%j_^^%d^\\Si__%\\ta_^^M__%ij_-1^ %%h__ij_(\\ta)x__j_(n-\\ta) + N__i_(n)%, for %i=1..m.")
-DEFINITION (L"Here %%y__i_ (n) is the %n-th sample of the %i-th microphone signal, %m is the number of microphones, %%h__ij_(\\ta)% is the multi-input multi-output linear filter with the source-microphone impulse responses that characterize the propagation of the sound in the room and %%N__i_% is a noise source. This model is typically much harder to solve than the previous one because of the %%h__ij_(\\ta)% filter term that can have thousands of coefficients. For example, the typical @@ [...]
-ENTRY (L"Solving the blind source separation for instantaneous mixtures")
-NORMAL (L"Various techniques exist for solving the blind source separation problem for %instantaneous mixtures. Very popular ones make make use of second order statistics (SOS) by trying to "
+TAG (U"%%Convolutive mixtures%")
+DEFINITION (U"are mixtures where the mixing is of convolutive nature, i.e. the model is ")
+FORMULA (U"%%y__i_ (n)% = \\Si__%j_^^%d^\\Si__%\\ta_^^M__%ij_-1^ %%h__ij_(\\ta)x__j_(n-\\ta) + N__i_(n)%, for %i=1..m.")
+DEFINITION (U"Here %%y__i_ (n) is the %n-th sample of the %i-th microphone signal, %m is the number of microphones, %%h__ij_(\\ta)% is the multi-input multi-output linear filter with the source-microphone impulse responses that characterize the propagation of the sound in the room and %%N__i_% is a noise source. This model is typically much harder to solve than the previous one because of the %%h__ij_(\\ta)% filter term that can have thousands of coefficients. For example, the typical @@ [...]
+ENTRY (U"Solving the blind source separation for instantaneous mixtures")
+NORMAL (U"Various techniques exist for solving the blind source separation problem for %instantaneous mixtures. Very popular ones make make use of second order statistics (SOS) by trying to "
 	"simultaneously diagonalize a large number of cross-correlation matrices. Other techniques like independent component analysis use higher order statistics (HOS) to find the independent components, i.e. the sources.")
-NORMAL (L"Given the decomposition problem #Y=#A\\.c#X, we can see that the solution is determined "
+NORMAL (U"Given the decomposition problem #Y=#A\\.c#X, we can see that the solution is determined "
 	"only upto a permutation and a scaling of the components. This is called the %%indeterminancy "
 	"problem% of BSS. This can be seen as follows: given a permutation matrix #P, i.e. a matrix which "
 	"contains only zeros except for one 1 in every row and column, and a diagonal scaling matrix #D, any "
 	"scaling and permutation of the independent components #X__%n_=(#D\\.c#P)\\.c#X can be compensated "
 	"by the reversed scaling of the mixing matrix #A__%n_=#A\\.c(#D\\.c#P)^^-1^ because #A\\.c(#D\\.c#P)^^-1^\\.c(#D\\.c#P)\\.c#X = #A\\.c#X = #Y. ")
-ENTRY (L"Solving the blind source separation for convolutive mixtures")
-NORMAL (L"Solutions for %convolutive mixture problems are much harder to achieve. "
+ENTRY (U"Solving the blind source separation for convolutive mixtures")
+NORMAL (U"Solutions for %convolutive mixture problems are much harder to achieve. "
 	"One normally starts by transforming the problem to the frequency domain where the "
 	"convolution is turned into a multiplication. The problem then translates into a separate "
 	"%%instantaneous% mixing problem for %%each% frequency in the frequency domain. It is here that "
@@ -272,21 +272,21 @@ NORMAL (L"Solutions for %convolutive mixture problems are much harder to achieve
 	"independent components of each frequency bin.")
 MAN_END
 
-MAN_BEGIN (L"reverberation time", L"djmw", 20110107)
-NORMAL (L"Reverberation is the persistence of sound in a room after the sound source has silenced. ")
-NORMAL (L"The %%reverberation time% is normally defined as the time required for the persistence of a direct sound "
+MAN_BEGIN (U"reverberation time", U"djmw", 20110107)
+NORMAL (U"Reverberation is the persistence of sound in a room after the sound source has silenced. ")
+NORMAL (U"The %%reverberation time% is normally defined as the time required for the persistence of a direct sound "
     "to decay by 60 dB after the direct sound has silenced. Sometimes this dB level is indicated with a subscript "
     "and the reverberation time is given by the symbol %T__60_. "
 	"The reverberation time depends mainly on a room's volume and area and on the absorption at the walls. Generally absorption is frequency dependent and therefore the reverberation time of a room varies with frequency. ")
 MAN_END
 
-MAN_BEGIN (L"Vollgraf & Obermayer (2006)", L"djmw", 20110105)
-NORMAL (L"Roland Vollgraf & Klaus Obermayer (2006): \"Quadratic optimization for simultaneous matrix "
+MAN_BEGIN (U"Vollgraf & Obermayer (2006)", U"djmw", 20110105)
+NORMAL (U"Roland Vollgraf & Klaus Obermayer (2006): \"Quadratic optimization for simultaneous matrix "
 	"diagonalization.\" %%IEEE Transactions On Signal Processing% #54: 3270\\--3278.")
 MAN_END
 
-MAN_BEGIN (L"Ziehe et al. (2004)", L"djmw", 20110105)
-NORMAL (L"Andreas Ziehe, Pavel Laskov, Guido Nolte & Klaus-Robert M\\u\"ller (2004): \"A fast algorithm for joint "
+MAN_BEGIN (U"Ziehe et al. (2004)", U"djmw", 20110105)
+NORMAL (U"Andreas Ziehe, Pavel Laskov, Guido Nolte & Klaus-Robert M\\u\"ller (2004): \"A fast algorithm for joint "
 	"diagonalization with non-orthogonal transformations and its application to blind source separation\", "
 	"%%Journal of Machine Learning Research% #5: 777\\--800.")
 MAN_END
diff --git a/dwtools/manual_DataModeler.cpp b/dwtools/manual_DataModeler.cpp
index 93af1f4..b25f184 100644
--- a/dwtools/manual_DataModeler.cpp
+++ b/dwtools/manual_DataModeler.cpp
@@ -27,31 +27,31 @@ void manual_DataModeler (ManPages me);
 void manual_DataModeler (ManPages me)
 {
 
-MAN_BEGIN (L"FormantModeler: Get residual sum of squares...", L"djmw", 20140421)
-INTRO (L"Get the residual sum of squares for a formant in the selected FormantModeler.")
-NORMAL (L"The residual sum of squares, RSS,  is defined as follows")
-FORMULA (L"RSS = \\su__i=1_^^n^ (%f__%i_ - %F__%i_)^^2^,")
-NORMAL (L"where %f__%i_ is the frequency value of the %i-ith data point, %F__%i_ is the frequency at the i-data point as estimated by the model and %n is the number of data points.")
+MAN_BEGIN (U"FormantModeler: Get residual sum of squares...", U"djmw", 20140421)
+INTRO (U"Get the residual sum of squares for a formant in the selected FormantModeler.")
+NORMAL (U"The residual sum of squares, RSS,  is defined as follows")
+FORMULA (U"RSS = \\su__i=1_^^n^ (%f__%i_ - %F__%i_)^^2^,")
+NORMAL (U"where %f__%i_ is the frequency value of the %i-ith data point, %F__%i_ is the frequency at the i-data point as estimated by the model and %n is the number of data points.")
 MAN_END
 
-MAN_BEGIN (L"Formants: Extract smoothest part (constrained)...", L"djmw", 20140424)
-NORMAL (L"Extracts the best matching part from the slected @@formant|Formant at s.")
-ENTRY (L"Settings")
-TAG (L"##Minimum F1 (Hz)")
-DEFINITION (L"suppresses models whose average first formant frequency, %f1, is below %%minimumF1% by a factor sqrt (%minimumF1 - %f1 + 1). You can use this constraint to disfavour models with a low average first formant. Sometimes due to the generally high frequency of the /a/ a lower harmonic of the fundamental frequency is taken as a candidate for the first formant. You can suppress these models with this constraint.")
-TAG (L"##Maximum F1 (Hz)")
-DEFINITION (L"suppresses models whose average first formant frequency, %f1, is above %%maximumF1% by a factor sqrt (%f1 - %%maximumF1% + 1).You can use this constraint to disfavour models in which the first formant is missing. ")
-TAG (L"##Minimum F2 (Hz)")
-DEFINITION (L"suppresses models whose average second formant frequency, %f2, is below %%minimumF2% by a factor sqrt (%minimumF2 - %f2 + 1). This constraint might be used for high front vowels that normally have a large distance between the first and second formant. ")
-TAG (L"##Maximum F2 (Hz)")
-DEFINITION (L"suppresses models whose average second formant frequency, %f2, is above %%maximumF2% by a factor sqrt (%f2 - %%maximumF2% + 1). This factor is sometimes necessary to suppress models for high back vowels where the second formant is \"missing\", i.e. where the third formant is playing the role of the second. ")
-TAG (L"##Minimum F3 (Hz)")
-DEFINITION (L"suppress models whose average third formant frequency, %%f3%, is below %%minimumF3% by a factor sqrt (%%minimumF3% - %%f3% + 1). This constraint might sometimes be usefull to suppress low lying third formants that can occur for /a/-like vowels.")
+MAN_BEGIN (U"Formants: Extract smoothest part (constrained)...", U"djmw", 20140424)
+NORMAL (U"Extracts the best matching part from the slected @@formant|Formant at s.")
+ENTRY (U"Settings")
+TAG (U"##Minimum F1 (Hz)")
+DEFINITION (U"suppresses models whose average first formant frequency, %f1, is below %%minimumF1% by a factor sqrt (%minimumF1 - %f1 + 1). You can use this constraint to disfavour models with a low average first formant. Sometimes due to the generally high frequency of the /a/ a lower harmonic of the fundamental frequency is taken as a candidate for the first formant. You can suppress these models with this constraint.")
+TAG (U"##Maximum F1 (Hz)")
+DEFINITION (U"suppresses models whose average first formant frequency, %f1, is above %%maximumF1% by a factor sqrt (%f1 - %%maximumF1% + 1).You can use this constraint to disfavour models in which the first formant is missing. ")
+TAG (U"##Minimum F2 (Hz)")
+DEFINITION (U"suppresses models whose average second formant frequency, %f2, is below %%minimumF2% by a factor sqrt (%minimumF2 - %f2 + 1). This constraint might be used for high front vowels that normally have a large distance between the first and second formant. ")
+TAG (U"##Maximum F2 (Hz)")
+DEFINITION (U"suppresses models whose average second formant frequency, %f2, is above %%maximumF2% by a factor sqrt (%f2 - %%maximumF2% + 1). This factor is sometimes necessary to suppress models for high back vowels where the second formant is \"missing\", i.e. where the third formant is playing the role of the second. ")
+TAG (U"##Minimum F3 (Hz)")
+DEFINITION (U"suppress models whose average third formant frequency, %%f3%, is below %%minimumF3% by a factor sqrt (%%minimumF3% - %%f3% + 1). This constraint might sometimes be usefull to suppress low lying third formants that can occur for /a/-like vowels.")
 MAN_END
 
 
-MAN_BEGIN (L"Buse (1973)", L"djmw", 20140328)
-NORMAL (L"A. Buse (1973): \"Goodness of fit in generalized least squares estimation.\", %%The American Statistician% #27: 106\\--108.")
+MAN_BEGIN (U"Buse (1973)", U"djmw", 20140328)
+NORMAL (U"A. Buse (1973): \"Goodness of fit in generalized least squares estimation.\", %%The American Statistician% #27: 106\\--108.")
 MAN_END
 
 }
diff --git a/dwtools/manual_HMM.cpp b/dwtools/manual_HMM.cpp
index c4c637d..950b3e4 100644
--- a/dwtools/manual_HMM.cpp
+++ b/dwtools/manual_HMM.cpp
@@ -27,8 +27,8 @@ void manual_HMM (ManPages me);
 void manual_HMM (ManPages me)
 {
 
-MAN_BEGIN (L"expectation-maximization", L"djmw", 20111130)
-NORMAL (L"Expectation-maximization (EM) is an iterative method used to find maximum "
+MAN_BEGIN (U"expectation-maximization", U"djmw", 20111130)
+NORMAL (U"Expectation-maximization (EM) is an iterative method used to find maximum "
 	"likelihood estimates of parameters in probabilistic models, where the model depends on "
 	"unobserved, also called %%latent%, variables. EM alternates between performing an expectation (E) step, "
 	"which computes an expectation of the likelihood by including the latent variables as if they "
@@ -39,408 +39,410 @@ NORMAL (L"Expectation-maximization (EM) is an iterative method used to find maxi
 	"@@TableOfReal: To GaussianMixture...|Gaussian mixtures@ or in the @@HMM & HMM_ObservationSequences: Learn...|Baum-Welch training@ of a Hidden Markov Model.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture", L"djmw", 20101026)
-INTRO (L"A Gaussian mixture is a probability density function (p.d.f.). It is a combination of several Gaussian densities.")
-NORMAL (L"The GaussianMixture's p.d.f. is defined as the weighted sum of %K multivariate Gaussian p.d.f's:")
-FORMULA (L"pdf(x) = \\Si__%%i%=1_^^%K^ p__%i_ %N(%x;\\mu__%i_,\\Si__%i_),")
-NORMAL (L"where each %N(%x;\\mu__%i_,\\Si__%i_) is a multivariate p.d.f. with mean  \\mu__%i_ and covariance matrix  \\Si__%i_. The coefficients %p__%i_ sum to 1. ")
-NORMAL (L"For an introduction to Gaussian mixtures see for example  @@Bishop (2006)@.")
+MAN_BEGIN (U"GaussianMixture", U"djmw", 20101026)
+INTRO (U"A Gaussian mixture is a probability density function (p.d.f.). It is a combination of several Gaussian densities.")
+NORMAL (U"The GaussianMixture's p.d.f. is defined as the weighted sum of %K multivariate Gaussian p.d.f's:")
+FORMULA (U"pdf(x) = \\Si__%%i%=1_^^%K^ p__%i_ %N(%x;\\mu__%i_,\\Si__%i_),")
+NORMAL (U"where each %N(%x;\\mu__%i_,\\Si__%i_) is a multivariate p.d.f. with mean  \\mu__%i_ and covariance matrix  \\Si__%i_. The coefficients %p__%i_ sum to 1. ")
+NORMAL (U"For an introduction to Gaussian mixtures see for example  @@Bishop (2006)@.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture: Draw concentration ellipses...", L"djmw", 20101101)
-INTRO (L"Draws the concentration ellipse for each component in the @@GaussianMixture at . ")
-NORMAL (L"The principal component plane will be determined from @@GaussianMixture: To PCA at .")
-NORMAL (L"You might also use another  @PCA and to combine it with a GaussianMixture for drawing  (@@GaussianMixture & PCA: Draw concentration ellipses...@).")
-ENTRY (L"Settings")
-TAG (L"##Number of sigmas")
-DEFINITION (L"determines the @@concentration ellipse|data coverage at .")
-TAG (L"##Principal component plane")
-DEFINITION (L"determines whether the principal component plane is used or not for drawing.")
+MAN_BEGIN (U"GaussianMixture: Draw concentration ellipses...", U"djmw", 20101101)
+INTRO (U"Draws the concentration ellipse for each component in the @@GaussianMixture at . ")
+NORMAL (U"The principal component plane will be determined from @@GaussianMixture: To PCA at .")
+NORMAL (U"You might also use another  @PCA and to combine it with a GaussianMixture for drawing  (@@GaussianMixture & PCA: Draw concentration ellipses...@).")
+ENTRY (U"Settings")
+TAG (U"##Number of sigmas")
+DEFINITION (U"determines the @@concentration ellipse|data coverage at .")
+TAG (U"##Principal component plane")
+DEFINITION (U"determines whether the principal component plane is used or not for drawing.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture: Get probability at position", L"djmw",20101103)
-INTRO (L"Evaluate the pdf of the @@GaussianMixture@ at the given position.")
+MAN_BEGIN (U"GaussianMixture: Get probability at position", U"djmw",20101103)
+INTRO (U"Evaluate the pdf of the @@GaussianMixture@ at the given position.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture & PCA: Draw concentration ellipses...", L"djmw", 20101101)
-INTRO (L"Draws the concentration ellipse for each component in the  @@GaussianMixture@ in the plane spanned by the selected  @PCA.")
-ENTRY (L"Settings")
-TAG (L"##Number of sigmas")
-DEFINITION (L"determines the @@concentration ellipse|data coverage at .")
+MAN_BEGIN (U"GaussianMixture & PCA: Draw concentration ellipses...", U"djmw", 20101101)
+INTRO (U"Draws the concentration ellipse for each component in the  @@GaussianMixture@ in the plane spanned by the selected  @PCA.")
+ENTRY (U"Settings")
+TAG (U"##Number of sigmas")
+DEFINITION (U"determines the @@concentration ellipse|data coverage at .")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture: Draw marginal pdf...", L"djmw", 20101122)
-INTRO (L"A command to draw the marginal p.d.f. (probability density function) of the selected  @GaussianMixture.")
-NORMAL (L"A marginal distribution is the projection of the (multivariate) p.d.f. on one dimension or direction. "
+MAN_BEGIN (U"GaussianMixture: Draw marginal pdf...", U"djmw", 20101122)
+INTRO (U"A command to draw the marginal p.d.f. (probability density function) of the selected  @GaussianMixture.")
+NORMAL (U"A marginal distribution is the projection of the (multivariate) p.d.f. on one dimension or direction. "
 	"This direction may also be externally defined by selecting a @PCA and a GaussianMixture together.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture: Split component...", L"djmw", 20101122)
-INTRO (L"Splits one component of the selected  @GaussianMixture into two components.")
-NORMAL (L"The selected component is split based on a @PCA analysis of its covariance matrix. The new means are situated "
+MAN_BEGIN (U"GaussianMixture: Split component...", U"djmw", 20101122)
+INTRO (U"Splits one component of the selected  @GaussianMixture into two components.")
+NORMAL (U"The selected component is split based on a @PCA analysis of its covariance matrix. The new means are situated "
 	"around the old components mean, 1\\si apart in the first principal components direction, and the new covariances are "
 	"constructed with information from the old covariance matrix. ")
-NORMAL (L"The details of the algorith are described in @@Zhang et al. (2003)@.")
+NORMAL (U"The details of the algorith are described in @@Zhang et al. (2003)@.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture: To PCA", L"djmw", 20101030)
-INTRO (L"Creates a  @PCA from the selected  @GaussianMixture.")
-NORMAL (L"The PCA is calculated from the  @@GaussianMixture: To Covariance (total)|total covariance matrix@ of the GaussianMixture.")
+MAN_BEGIN (U"GaussianMixture: To PCA", U"djmw", 20101030)
+INTRO (U"Creates a  @PCA from the selected  @GaussianMixture.")
+NORMAL (U"The PCA is calculated from the  @@GaussianMixture: To Covariance (total)|total covariance matrix@ of the GaussianMixture.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture & PCA: To Matrix (density)...", L"djmw", 20101101)
-INTRO (L"Represent the @@GaussianMixture@ p.d.f. on the plane spanned by @@PCA at . This makes it possible to draw "
+MAN_BEGIN (U"GaussianMixture & PCA: To Matrix (density)...", U"djmw", 20101101)
+INTRO (U"Represent the @@GaussianMixture@ p.d.f. on the plane spanned by @@PCA at . This makes it possible to draw "
 	"the p.d.f. as grey values with one of the special @@Matrix@ image drawing methods.")
-NORMAL (L"For each cell in the matrix of dimension  %%numberOfRows% \\xx %%numberOfColumns%, the p.d.f. will be evaluated.")
+NORMAL (U"For each cell in the matrix of dimension  %%numberOfRows% \\xx %%numberOfColumns%, the p.d.f. will be evaluated.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture: To Covariance (between)", L"djmw", 20101030)
-INTRO (L"The covariance between the centers of the components of the @@GaussianMixture@ is calculated; "
+MAN_BEGIN (U"GaussianMixture: To Covariance (between)", U"djmw", 20101030)
+INTRO (U"The covariance between the centers of the components of the @@GaussianMixture@ is calculated; "
 	"each center is weighted according to its mixing probability.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture: To Covariance (within)", L"djmw", 20101120)
-INTRO (L"The covariances of the components of the @@GaussianMixture@ are pooled.")
+MAN_BEGIN (U"GaussianMixture: To Covariance (within)", U"djmw", 20101120)
+INTRO (U"The covariances of the components of the @@GaussianMixture@ are pooled.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture: To Covariance (total)", L"djmw", 20101030)
-INTRO (L"The sum of the @@GaussianMixture: To Covariance (within)|within@ and @@GaussianMixture: To Covariance (between)|between@ covariances of the @@GaussianMixture@ is calculated.")
+MAN_BEGIN (U"GaussianMixture: To Covariance (total)", U"djmw", 20101030)
+INTRO (U"The sum of the @@GaussianMixture: To Covariance (within)|within@ and @@GaussianMixture: To Covariance (between)|between@ covariances of the @@GaussianMixture@ is calculated.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture: To TableOfReal (random sampling)...", L"djmw", 20101030)
-INTRO (L"The selected @@GaussianMixture@ is used as a generator of data.")
-ENTRY (L"Setting")
-TAG (L"##Number of data points")
-DEFINITION (L"determines how many random data point have to be generated.")
-ENTRY (L"Algorithm")
-NORMAL (L"For each data point to be generated:")
-NORMAL (L"1. A random number decides to which component in the mixture the data point will belong.")
-NORMAL (L"2. According to the procedure described in @@Covariance: To TableOfReal (random sampling)...@, one "
+MAN_BEGIN (U"GaussianMixture: To TableOfReal (random sampling)...", U"djmw", 20101030)
+INTRO (U"The selected @@GaussianMixture@ is used as a generator of data.")
+ENTRY (U"Setting")
+TAG (U"##Number of data points")
+DEFINITION (U"determines how many random data point have to be generated.")
+ENTRY (U"Algorithm")
+NORMAL (U"For each data point to be generated:")
+NORMAL (U"1. A random number decides to which component in the mixture the data point will belong.")
+NORMAL (U"2. According to the procedure described in @@Covariance: To TableOfReal (random sampling)...@, one "
 	"data point will be generated.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To GaussianMixture...", L"djmw", 20111130)
-INTRO (L"Creates a  @@GaussianMixture@ from the selected  @@TableOfReal@ by an @@expectation-maximization|"
+MAN_BEGIN (U"TableOfReal: To GaussianMixture...", U"djmw", 20150930)
+INTRO (U"Creates a  @@GaussianMixture@ from the selected @@TableOfReal@ by an @@expectation-maximization|"
 	"expectation-maximization@ procedure.")
-ENTRY (L"Settings")
-TAG (L"##Number of components")
-DEFINITION (L"defines the number of Gaussians in the mixture.")
-TAG (L"##Tolerance of minimizer")
-DEFINITION (L"defines when to stop optimizing. If the relative difference between the likelihoods at two successive "
+ENTRY (U"Settings")
+TAG (U"##Number of components")
+DEFINITION (U"defines the number of Gaussians in the mixture.")
+TAG (U"##Tolerance of minimizer")
+DEFINITION (U"defines when to stop optimizing. If the relative difference between the likelihoods at two successive "
 	"iteration steps differs by less then the tolerance we stop, i.e. when |(%L(%i-1)-%L(%i))/%L(%i)| < %%tolerance%. ")
-TAG (L"##Maximum number of iterations")
-DEFINITION (L"defines another stopping criterion. The EM iteration will stop when either the tolerance "
+TAG (U"##Maximum number of iterations")
+DEFINITION (U"defines another stopping criterion. The EM iteration will stop when either the tolerance "
 	"is reached or the maximum number of iterations. If zero is chosen, no iteration will be performed and the "
 	"GaussianMixture will be initialized with the initial guess.")
-TAG (L"##Stability coefficient lambda")
-DEFINITION (L"defines the fraction of the total covariance that will be added to the each of the mixture "
+TAG (U"##Stability coefficient lambda")
+DEFINITION (U"defines the fraction of the total covariance that will be added to the each of the mixture "
 	"covariance matrices during the EM iteration. This may prevent one or more of these matrices to become singular.")
-TAG (L"##Covariance matrices are")
-DEFINITION (L"defines whether the complete covariance matrices in the mixture have to be calculated or only the diagonal.")
-ENTRY (L"Expectation\\--Maximization Algorithm")
-NORMAL (L"The Expectation\\--Maximization (EM) algorithm is an iterative procedure to maximize the likelihood of the data given a model. For a "
+TAG (U"##Covariance matrices are")
+DEFINITION (U"defines whether the complete covariance matrices in the mixture have to be calculated or only the diagonal.")
+TAG (U"##Criterion based on")
+DEFINITION (U"defines how the @@GaussianMixture & TableOfReal: Get likelihood value...|likelihood of the data given the model is calculated at .")
+ENTRY (U"Expectation\\--Maximization Algorithm")
+NORMAL (U"The Expectation\\--Maximization (EM) algorithm is an iterative procedure to maximize the likelihood of the data given a model. For a "
 	"GaussianMixture, the parameters in the model are the centers and the covariances of all components in the mixture "
 	"and their mixing probabilities.")
-NORMAL (L"The number of parameters depends on the number of components in the mixture and the dimension of the data. "
+NORMAL (U"The number of parameters depends on the number of components in the mixture and the dimension of the data. "
 	"For a full covariance matrix we have to find  %dimension%(%dimension%+1)/2 matrix elements and another "
 	" %dimension vector elements for its center. This makes the total number of parameters that have to be estimated "
 	"for a mixture with ##Number of components# components equal to "
 	"%numberOfComponents \\.c %dimension%(%dimension%+3)/2 + %numberOfComponents.")
-NORMAL (L"For diagonal covariance matrices the number of parameters reduces considerably.")
-NORMAL (L"The EM iteration has to start with a sensible initial guess for all the parameters. For the initial guess, "
+NORMAL (U"For diagonal covariance matrices the number of parameters reduces considerably.")
+NORMAL (U"The EM iteration has to start with a sensible initial guess for all the parameters. For the initial guess, "
 	"we derive our centers from positions on the 1-\\si ellipse in the plane spanned by the first two principal "
 	"components. We then make all covariance matrices equal to a scaled down version of the total covariance matrix "
 	"where the scaling factor depends on the number of components and the quotient of the between and within variance. "
 	"Initialy all mixing probabilities will be chosen equal.")
-NORMAL (L"How to proceed from the initial guess with the EM to find the optimal values for all the parameters "
+NORMAL (U"How to proceed from the initial guess with the EM to find the optimal values for all the parameters "
 	"in the Gaussian mixture is explained in great detail by  @@Bishop (2006)@.")
 MAN_END
 
 #define GaussianMixture_OPTION_MENU_CRITERIA \
-	OPTIONMENU (L"Criterion based on", 1) \
-	OPTION (L"Maximum likelihood") \
-	OPTION (L"Minimum message length") \
-	OPTION (L"Bayes information") \
-	OPTION (L"Akaike information") \
-	OPTION (L"Akaike corrected") \
-	OPTION (L"Complete-data ML")
-
-MAN_BEGIN (L"GaussianMixture & TableOfReal: Get likelihood value...", L"djmw", 20101125)
-INTRO (L"Calculates how well the @GaussianMixture model fits the data according to a criterion.")
-ENTRY (L"Settings")
-TAG (L"##Maximum likelihood")
-FORMULA (L"ML = \\Si__%i=1..%n_ log (\\Si__%m=1..%k_ \\al__%k_ %p__%%ik%_)")
-TAG (L"##Minimum message length")
-FORMULA (L"DL = ML - 0.5(N\\.c\\Si__%m=1..%k_ log(%n\\al__%m_/12) -%k\\.clog(%n/12) -%k(%N+1))")
-TAG (L"##Bayes information")
-FORMULA (L"BIC = 2\\.cML - k\\.cN\\.clog(n)")
-TAG (L"##Akaike information")
-FORMULA (L"AIC = 2(ML - k\\.cN) ")
-TAG (L"##Akaike corrected")
-FORMULA (L"AICc = 2(ML - k\\.cN\\.cn/(n-k\\.cN-1))")
-TAG (L"##Complete-data ML")
-FORMULA (L"\\Si__%i=1..%n_\\Si__%m=1..%k_ \\ga__%%im%_ log (\\ga__%%im%_)")
-NORMAL (L"In the formulas above %n is the number of data points, %k is the number of mixture components, %N is the "
+	OPTIONMENU (U"Criterion based on", 1) \
+	OPTION (U"Maximum likelihood") \
+	OPTION (U"Minimum message length") \
+	OPTION (U"Bayes information") \
+	OPTION (U"Akaike information") \
+	OPTION (U"Akaike corrected") \
+	OPTION (U"Complete-data ML")
+
+MAN_BEGIN (U"GaussianMixture & TableOfReal: Get likelihood value...", U"djmw", 20101125)
+INTRO (U"Calculates how well the @GaussianMixture model fits the data according to a criterion.")
+ENTRY (U"Settings")
+TAG (U"##Maximum likelihood")
+FORMULA (U"ML = \\Si__%i=1..%n_ log (\\Si__%m=1..%k_ \\al__%k_ %p__%%ik%_)")
+TAG (U"##Minimum message length")
+FORMULA (U"DL = ML - 0.5(N\\.c\\Si__%m=1..%k_ log(%n\\al__%m_/12) -%k\\.clog(%n/12) -%k(%N+1))")
+TAG (U"##Bayes information")
+FORMULA (U"BIC = 2\\.cML - k\\.cN\\.clog(n)")
+TAG (U"##Akaike information")
+FORMULA (U"AIC = 2(ML - k\\.cN) ")
+TAG (U"##Akaike corrected")
+FORMULA (U"AICc = 2(ML - k\\.cN\\.cn/(n-k\\.cN-1))")
+TAG (U"##Complete-data ML")
+FORMULA (U"\\Si__%i=1..%n_\\Si__%m=1..%k_ \\ga__%%im%_ log (\\ga__%%im%_)")
+NORMAL (U"In the formulas above %n is the number of data points, %k is the number of mixture components, %N is the "
 	"number of parameters in one component, i.e. %d + %d(%d+1)/2 for a full covariance matrix of "
 	"dimension %d with means. The \\al__%k_ are the mixing probabilities, the %p__%%ik%_ are the probabilities for the %i-th data vector in the %k-th component. The \\ga__%%ik%_ are defined as ")
-FORMULA (L"\\ga__%%im%_= \\al__%m_\\.c%p__%%im%_ /(\\Si__%j=1..%k_ \\al__%j_\\.c%p__%%ij%_).")
+FORMULA (U"\\ga__%%im%_= \\al__%m_\\.c%p__%%im%_ /(\\Si__%j=1..%k_ \\al__%j_\\.c%p__%%ij%_).")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture & TableOfReal: Improve likelihood...", L"djmw", 20111130)
-INTRO (L"Try to improve the likelihood of the parameters in the  @@GaussianMixture@ by an @@expectation-maximization@ algorithm.")
-ENTRY (L"Settings & EM Algorithm")
-NORMAL (L"As decribed in  @@TableOfReal: To GaussianMixture... at .")
+MAN_BEGIN (U"GaussianMixture & TableOfReal: Improve likelihood...", U"djmw", 20111130)
+INTRO (U"Try to improve the likelihood of the parameters in the  @@GaussianMixture@ by an @@expectation-maximization@ algorithm.")
+ENTRY (U"Settings & EM Algorithm")
+NORMAL (U"As decribed in  @@TableOfReal: To GaussianMixture... at .")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture & TableOfReal: To Correlation (columns)", L"djmw", 20101111)
-INTRO (L"Create a @Correlation matrix from the selected @TableOfReal and the @GaussianMixture.")
-NORMAL (L"We start by calculating the ClassificationTable @@GaussianMixture & TableOfReal: To ClassificationTable|from "
+MAN_BEGIN (U"GaussianMixture & TableOfReal: To Correlation (columns)", U"djmw", 20101111)
+INTRO (U"Create a @Correlation matrix from the selected @TableOfReal and the @GaussianMixture.")
+NORMAL (U"We start by calculating the ClassificationTable @@GaussianMixture & TableOfReal: To ClassificationTable|from "
 	"the data and the GaussianMixture at .")
-NORMAL (L"Nex we calculate correlations between the %%columns% of the ClassificationTable: cell [%i,%j] of the "
+NORMAL (U"Nex we calculate correlations between the %%columns% of the ClassificationTable: cell [%i,%j] of the "
 	"correlation matrix will then contain the value:")
-FORMULA (L"%p[%i] \\.c %p[%j] / (||%p[%i]||\\.c ||%p[%j]||), ")
-NORMAL (L"where %p[%i] is the data in the %i-th column of the classification table and ||%p[%i]|| is its Euclidean norm. "
+FORMULA (U"%p[%i] \\.c %p[%j] / (||%p[%i]||\\.c ||%p[%j]||), ")
+NORMAL (U"where %p[%i] is the data in the %i-th column of the classification table and ||%p[%i]|| is its Euclidean norm. "
 	"The index %i runs from 1 to the number of components in the mixture.")
-NORMAL (L"Because all the elements in a column are positive numbers, i.e. probabilities, all correlations will be positive numbers too.")
+NORMAL (U"Because all the elements in a column are positive numbers, i.e. probabilities, all correlations will be positive numbers too.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture & TableOfReal: To ClassificationTable", L"djmw", 20101122)
-INTRO (L"Create a @ClassificationTable from the selected @TableOfReal and the @GaussianMixture.")
-NORMAL (L"The classification table is a matrix with the same number of rows as the selected #TableOfReal "
+MAN_BEGIN (U"GaussianMixture & TableOfReal: To ClassificationTable", U"djmw", 20101122)
+INTRO (U"Create a @ClassificationTable from the selected @TableOfReal and the @GaussianMixture.")
+NORMAL (U"The classification table is a matrix with the same number of rows as the selected #TableOfReal "
 	"object. The number of columns equals the number of components in the mixture. "
 	"Cell [%i,%j] of the classification table contains the probability "
 	"that the data in row %i of the TableOfReal belongs to component %j of the mixture.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture & TableOfReal: To GaussianMixture (CEMM)...", L"djmw", 20101120)
-INTRO (L"Find the best @@GaussianMixture@ from the data according to a iterative component-wise optimization algorithm by which components may be deleted.")
-ENTRY (L"Settings")
-TAG (L"##Minimum number of components")
-DEFINITION (L"defines the minimum number of components that have to survive the minimization process. If a value of zero is chosen all components will survive and no deletions will take place.")
-TAG (L"##Tolerance of minimizer")
-DEFINITION (L"defines when to stop optimizing. If the relative difference between the likelihoods at two successive "
+MAN_BEGIN (U"GaussianMixture & TableOfReal: To GaussianMixture (CEMM)...", U"djmw", 20101120)
+INTRO (U"Find the best @@GaussianMixture@ from the data according to a iterative component-wise optimization algorithm by which components may be deleted.")
+ENTRY (U"Settings")
+TAG (U"##Minimum number of components")
+DEFINITION (U"defines the minimum number of components that have to survive the minimization process. If a value of zero is chosen all components will survive and no deletions will take place.")
+TAG (U"##Tolerance of minimizer")
+DEFINITION (U"defines when to stop optimizing. If the relative difference between the likelihoods at two successive "
 	"iteration steps differs by less then the tolerance we stop, i.e. when |(%L(%i-1)-%L(%i))/%L(%i)| < %%tolerance%. ")
-TAG (L"##Maximum number of iterations")
-DEFINITION (L"defines another stop criterion. Iteration stops whenever the number of iterations reaches this value.")
-TAG (L"##Stability coefficient lambda")
-DEFINITION (L"defines the fraction of the totat covariance that is added to the covariance of each component to "
+TAG (U"##Maximum number of iterations")
+DEFINITION (U"defines another stop criterion. Iteration stops whenever the number of iterations reaches this value.")
+TAG (U"##Stability coefficient lambda")
+DEFINITION (U"defines the fraction of the totat covariance that is added to the covariance of each component to "
 	"prevent these matrices from becoming singular.")
-TAG (L"##Criterion based on")
-DEFINITION (L"defines whether the function to be optimized is the log likelihood or the related miminum description length.")
-ENTRY (L"Algorithm")
-NORMAL (L"The component-wise optimization algorithm is described in @@Figueiredo & Jain (2002)@ where the function to be optimized "
+TAG (U"##Criterion based on")
+DEFINITION (U"defines whether the function to be optimized is the log likelihood or the related miminum description length.")
+ENTRY (U"Algorithm")
+NORMAL (U"The component-wise optimization algorithm is described in @@Figueiredo & Jain (2002)@ where the function to be optimized "
 	"is the minimum description length defined as:")
-FORMULA (L"%L(\\te,%Y) = %N/2 \\Si__%m=1_^^%k^ ln(%n\\al__%k_/12) + %k/2 ln(%n/12) + %k(%N+1)/2 - ln %p(%Y|\\te),")
-NORMAL (L"where %k is the number of components,  %N is the number of parameters of one component, "
+FORMULA (U"%L(\\te,%Y) = %N/2 \\Si__%m=1_^^%k^ ln(%n\\al__%k_/12) + %k/2 ln(%n/12) + %k(%N+1)/2 - ln %p(%Y|\\te),")
+NORMAL (U"where %k is the number of components,  %N is the number of parameters of one component, "
 	"i.e. %d+%d(%d+1)/2 for a full covariance matrix of dimension %d with means and %d+%d for a diagonal "
 	"matrix with means;  %n is the number of data vectors. The term ln %p(%Y|\\te) is the log likelihood of the data "
 	"given the model.")
-NORMAL (L"For the optimization we either optimize the complete function %L(\\te,%Y) or only the likelihood ln %p(%Y|\\te) term.")
+NORMAL (U"For the optimization we either optimize the complete function %L(\\te,%Y) or only the likelihood ln %p(%Y|\\te) term.")
 MAN_END
 
-MAN_BEGIN (L"GaussianMixture & TableOfReal: To TableOfReal (BHEP normality tests)...", L"djmw", 20101113)
-INTRO (L"Tests the data in the @TableOfReal that belong to the components of the @GaussianMixture for normality "
+MAN_BEGIN (U"GaussianMixture & TableOfReal: To TableOfReal (BHEP normality tests)...", U"djmw", 20101113)
+INTRO (U"Tests the data in the @TableOfReal that belong to the components of the @GaussianMixture for normality "
 	"according to an adapted version of the @@BHEP multivariate normality test at .")
-ENTRY (L"Setting")
-TAG (L"##Beta")
-DEFINITION (L"determines the smoothing parameter of the data. If %beta equals zero the smoothing is determined "
+ENTRY (U"Setting")
+TAG (U"##Beta")
+DEFINITION (U"determines the smoothing parameter of the data. If %beta equals zero the smoothing is determined "
 	"automatically for each component of the mixture separately as: ")
-FORMULA (L"%beta = 1/(\\Vr2) (2%p+1)^^1/(%p+4)^ n^^1/(%p+4)^,")
-NORMAL (L"where %n is the effective number of elements in the component and %p the dimension of the data.")
+FORMULA (U"%beta = 1/(\\Vr2) (2%p+1)^^1/(%p+4)^ n^^1/(%p+4)^,")
+NORMAL (U"where %n is the effective number of elements in the component and %p the dimension of the data.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To GaussianMixture (row labels)...", L"djmw", 20101101)
-INTRO (L"Creates a  @@GaussianMixture@ from the selected  @TableOfReal. The number of mixture components is determined by the number of different row labels.")
-ENTRY (L"Setting")
-TAG (L"##Covariance matrices are")
-DEFINITION (L"defines whether the complete covariance matrices in the mixture have to be calculated or only the diagonal.")
+MAN_BEGIN (U"TableOfReal: To GaussianMixture (row labels)...", U"djmw", 20101101)
+INTRO (U"Creates a  @@GaussianMixture@ from the selected  @TableOfReal. The number of mixture components is determined by the number of different row labels.")
+ENTRY (U"Setting")
+TAG (U"##Covariance matrices are")
+DEFINITION (U"defines whether the complete covariance matrices in the mixture have to be calculated or only the diagonal.")
 MAN_END
 
-MAN_BEGIN (L"HMM_ObservationSequence", L"djmw", 20140117)
-INTRO (L"An HMM_ObservationSequence models a sequence of observations. The observation sequence can be generated "
+MAN_BEGIN (U"HMM_ObservationSequence", U"djmw", 20140117)
+INTRO (U"An HMM_ObservationSequence models a sequence of observations. The observation sequence can be generated "
 	"by the @HMM or it can be used to train a model.")
 MAN_END
 
-MAN_BEGIN (L"HMM_StateSequence", L"djmw", 20101010)
-INTRO (L"An HMM_StateSequence models the sequence of states that an @HMM has traversed.")
+MAN_BEGIN (U"HMM_StateSequence", U"djmw", 20101010)
+INTRO (U"An HMM_StateSequence models the sequence of states that an @HMM has traversed.")
 MAN_END
 
-MAN_BEGIN (L"HMM", L"djmw", 20130410)
-INTRO (L"A HMM is a Hidden Markov Model. Markov models are often used to model observation sequences. "
+MAN_BEGIN (U"HMM", U"djmw", 20130410)
+INTRO (U"A HMM is a Hidden Markov Model. Markov models are often used to model observation sequences. "
 	"The fundamental assumption in a markov model is that the probability of an observation (event) can only "
 	"depend on the previous observation. "
 	"A HMM can be visualised as a graph with a number of %%states%. If states are connected they have line connecting them. The following picture shows a HMM with two states, labeled \"Rainy\" and \"Sunny\". Each state can emit three symbols (these are not visible in the graph).   ")
 SCRIPT (5, 5,
-	L"Create simple HMM: \"wheather\", \"no\", \"Rainy Sunny\", \"Walk Shop Clean\"\n"
+	U"Create simple HMM: \"wheather\", \"no\", \"Rainy Sunny\", \"Walk Shop Clean\"\n"
 	"Draw: \"no\"\n"
 	"Remove\n")
-INTRO (L"For an introduction into HMM's see @@Rabiner (1989)@.")
+INTRO (U"For an introduction into HMM's see @@Rabiner (1989)@.")
 MAN_END
 
-MAN_BEGIN (L"HMM: Create simple HMM...", L"djmw", 20101009)
-INTRO (L"Creates a @@HMM|Hidden Markov Model@ from given states and observation symbols.")
-ENTRY (L"Settings")
-TAG (L"##Name")
-DEFINITION (L"determines the name (for the list of objects).")
-TAG (L"##States")
-DEFINITION (L"determines the number of and the names of the states.")
-TAG (L"##Symbols")
-DEFINITION (L"determines the number and the names of the observation symbols.")
-NORMAL (L"You can define a (not hidden) Markov model by leaving either the States or the Symbols field empty.")
-NORMAL (L"The model is initialised with equal probabilities for all the transitions and emissions.")
+MAN_BEGIN (U"HMM: Create simple HMM...", U"djmw", 20101009)
+INTRO (U"Creates a @@HMM|Hidden Markov Model@ from given states and observation symbols.")
+ENTRY (U"Settings")
+TAG (U"##Name")
+DEFINITION (U"determines the name (for the list of objects).")
+TAG (U"##States")
+DEFINITION (U"determines the number of and the names of the states.")
+TAG (U"##Symbols")
+DEFINITION (U"determines the number and the names of the observation symbols.")
+NORMAL (U"You can define a (not hidden) Markov model by leaving either the States or the Symbols field empty.")
+NORMAL (U"The model is initialised with equal probabilities for all the transitions and emissions.")
 MAN_END
 
-MAN_BEGIN (L"HMM: Extract transition probabilities", L"djmw", 20101020)
-INTRO (L"Extract the transition probabilities of the selected @@HMM@ as a @@TableOfReal at .")
-NORMAL (L"The row label shows the %%from% state and the column label the %%to% state, therefore the cell element "
+MAN_BEGIN (U"HMM: Extract transition probabilities", U"djmw", 20101020)
+INTRO (U"Extract the transition probabilities of the selected @@HMM@ as a @@TableOfReal at .")
+NORMAL (U"The row label shows the %%from% state and the column label the %%to% state, therefore the cell element "
 	"in row  %i and column  %j shows the probability of making a transition from state  %i to state  %j.")
 MAN_END
 
-MAN_BEGIN (L"HMM: Extract emission probabilities", L"djmw", 20101020)
-INTRO (L"Extract the emission probabilities of the selected @@HMM@ as a @@TableOfReal at .")
-NORMAL (L"The row label shows the %%from% state and the column label the %%to% symbol, therefore the cell element "
+MAN_BEGIN (U"HMM: Extract emission probabilities", U"djmw", 20101020)
+INTRO (U"Extract the emission probabilities of the selected @@HMM@ as a @@TableOfReal at .")
+NORMAL (U"The row label shows the %%from% state and the column label the %%to% symbol, therefore the cell element "
 	"in row  %i and column  %j shows the probability of emitting symbol  %j from state  %i.")
 MAN_END
 
-MAN_BEGIN (L"HMM & HMM: Get cross-entropy...", L"djmw", 20101017)
-INTRO (L"Calculates the cross-entropy between the two selected @@HMM@ models based on observation sequences.")
-ENTRY (L"Settings")
-TAG (L"##Observation length")
-DEFINITION (L"defines the number of observations that have to generated.")
-TAG (L"##Symmetric")
-DEFINITION (L"defines whether the symmetric formula is used in the calculation.")
-ENTRY (L"Algorithm")
-NORMAL (L"The cross-entropy is a measure of the distance between two models  \\la__1_ and \\la__2_. It is defined as")
-FORMULA (L"%D(\\la__1_,\\la__2_) = 1/%N (log %p(%O__2_|\\la__1_) - log %p(%O__2_|\\la__2_)),")
-NORMAL (L"where %O__2_ is an observation sequence of length  %N generated by model  \\la__2_.")
-NORMAL (L"The symmetrized version is:")
-FORMULA (L"%D__%s_(\\la__1_,\\la__2_) = (%D(\\la__1_,\\la__2_) + %D(\\la__2_,\\la__1_))/2.")
+MAN_BEGIN (U"HMM & HMM: Get cross-entropy...", U"djmw", 20101017)
+INTRO (U"Calculates the cross-entropy between the two selected @@HMM@ models based on observation sequences.")
+ENTRY (U"Settings")
+TAG (U"##Observation length")
+DEFINITION (U"defines the number of observations that have to generated.")
+TAG (U"##Symmetric")
+DEFINITION (U"defines whether the symmetric formula is used in the calculation.")
+ENTRY (U"Algorithm")
+NORMAL (U"The cross-entropy is a measure of the distance between two models  \\la__1_ and \\la__2_. It is defined as")
+FORMULA (U"%D(\\la__1_,\\la__2_) = 1/%N (log %p(%O__2_|\\la__1_) - log %p(%O__2_|\\la__2_)),")
+NORMAL (U"where %O__2_ is an observation sequence of length  %N generated by model  \\la__2_.")
+NORMAL (U"The symmetrized version is:")
+FORMULA (U"%D__%s_(\\la__1_,\\la__2_) = (%D(\\la__1_,\\la__2_) + %D(\\la__2_,\\la__1_))/2.")
 MAN_END
 
-MAN_BEGIN (L"HMM & HMM_ObservationSequence: Get cross-entropy", L"djmw", 20101017)
-INTRO (L"Calculates the cross-entropy between the selected @@HMM@ model and the @@HMM_ObservationSequence at .")
-NORMAL (L"The cross-entropy is a useful upper bound for the entropy of a model. An approximation to the cross-entropy for a model on a observation sequence  %O of length %N is: ")
-FORMULA (L"%H(%O) = -1/%N log %p(%O),")
-NORMAL (L"where %p(%O) is the probability of the observation sequence given the model.")
+MAN_BEGIN (U"HMM & HMM_ObservationSequence: Get cross-entropy", U"djmw", 20101017)
+INTRO (U"Calculates the cross-entropy between the selected @@HMM@ model and the @@HMM_ObservationSequence at .")
+NORMAL (U"The cross-entropy is a useful upper bound for the entropy of a model. An approximation to the cross-entropy for a model on a observation sequence  %O of length %N is: ")
+FORMULA (U"%H(%O) = -1/%N log %p(%O),")
+NORMAL (U"where %p(%O) is the probability of the observation sequence given the model.")
 MAN_END
 
-MAN_BEGIN (L"HMM & HMM & HMM_ObservationSequence: Get cross-entropy", L"djmw", 20101017)
-INTRO (L"Get the (symmetric) cross-entropy for the two selected @HMM models and an observation sequence.")
-NORMAL (L"See @@HMM & HMM: Get cross-entropy... at .")
+MAN_BEGIN (U"HMM & HMM & HMM_ObservationSequence: Get cross-entropy", U"djmw", 20101017)
+INTRO (U"Get the (symmetric) cross-entropy for the two selected @HMM models and an observation sequence.")
+NORMAL (U"See @@HMM & HMM: Get cross-entropy... at .")
 MAN_END
 
-MAN_BEGIN (L"HMM: To HMM_ObservationSequence...", L"djmw", 20101010)
-INTRO (L"Use the selected @HMM as a generator for an observation sequence.")
-ENTRY (L"Settings")
-TAG (L"##Start state")
-DEFINITION (L"defines the state in which the HMM starts. If a zero is given the start state is randomly chosen according to the start probabilities.")
-TAG (L"##Number of observations")
-DEFINITION (L"defines the number of observations to generate. For models of %%finite% duration such as left-to-right models, the HMM generator may stop before this number is reached.")
+MAN_BEGIN (U"HMM: To HMM_ObservationSequence...", U"djmw", 20101010)
+INTRO (U"Use the selected @HMM as a generator for an observation sequence.")
+ENTRY (U"Settings")
+TAG (U"##Start state")
+DEFINITION (U"defines the state in which the HMM starts. If a zero is given the start state is randomly chosen according to the start probabilities.")
+TAG (U"##Number of observations")
+DEFINITION (U"defines the number of observations to generate. For models of %%finite% duration such as left-to-right models, the HMM generator may stop before this number is reached.")
 MAN_END
 
-MAN_BEGIN (L"HMM: Get transition probability...", L"djmw", 20101010)
-INTRO (L"For the selected @HMM get the probability to make a transition from one state to the other.")
+MAN_BEGIN (U"HMM: Get transition probability...", U"djmw", 20101010)
+INTRO (U"For the selected @HMM get the probability to make a transition from one state to the other.")
 MAN_END
 
-MAN_BEGIN (L"HMM: Get emission probability...", L"djmw", 20101010)
-INTRO (L"For the selected @HMM get the probability that in a given state a particular symbol will be emitted.")
+MAN_BEGIN (U"HMM: Get emission probability...", U"djmw", 20101010)
+INTRO (U"For the selected @HMM get the probability that in a given state a particular symbol will be emitted.")
 MAN_END
 
-MAN_BEGIN (L"HMM: Get start probability...", L"djmw", 20101010)
-INTRO (L"For the selected @HMM get the probabilities that the model will start in a particular state.")
+MAN_BEGIN (U"HMM: Get start probability...", U"djmw", 20101010)
+INTRO (U"For the selected @HMM get the probabilities that the model will start in a particular state.")
 MAN_END
 
-MAN_BEGIN (L"HMM: Get p (time, state)...", L"djmw", 20101010)
-INTRO (L"For the selected @HMM get the probability that after a given number of time steps the HMM will be in "
+MAN_BEGIN (U"HMM: Get p (time, state)...", U"djmw", 20101010)
+INTRO (U"For the selected @HMM get the probability that after a given number of time steps the HMM will be in "
 	"a particular state.")
 MAN_END
 
-MAN_BEGIN (L"HMM: Get p (time, state, symbol)...", L"djmw", 20101010)
-INTRO (L"For the selected @HMM get the probability that after a given number of time steps the HMM will be in "
+MAN_BEGIN (U"HMM: Get p (time, state, symbol)...", U"djmw", 20101010)
+INTRO (U"For the selected @HMM get the probability that after a given number of time steps the HMM will be in "
 	"a particular state and emits a certain symbol.")
-NORMAL (L"This probability is the product of the %%probability being in particular state at that time (index)% and the %%probability of emitting a certain symbol in that state%.")
+NORMAL (U"This probability is the product of the %%probability being in particular state at that time (index)% and the %%probability of emitting a certain symbol in that state%.")
 MAN_END
 
-MAN_BEGIN (L"HMM: Get probability staying in state...", L"djmw", 20101010)
-INTRO (L"For the selected @HMM get the probability that it stays exactly the given number of times in that state.")
-NORMAL (L"This probability is %\\al__%%ii%_^^numberOfTimes-1^(1 - %\\al__%%ii%_),\n"
+MAN_BEGIN (U"HMM: Get probability staying in state...", U"djmw", 20101010)
+INTRO (U"For the selected @HMM get the probability that it stays exactly the given number of times in that state.")
+NORMAL (U"This probability is %\\al__%%ii%_^^numberOfTimes-1^(1 - %\\al__%%ii%_),\n"
 	"where \\al__%%ii%_ is the probability of staying in state %i.")
 MAN_END
 
-MAN_BEGIN (L"HMM: Get expected duration in state...", L"djmw", 20101010)
-INTRO (L"For the selected @HMM get the number of time units that the system is expected to stay in that state.")
+MAN_BEGIN (U"HMM: Get expected duration in state...", U"djmw", 20101010)
+INTRO (U"For the selected @HMM get the number of time units that the system is expected to stay in that state.")
 MAN_END
 
-MAN_BEGIN (L"HMM & HMM_StateSequence: Get probability", L"djmw", 20101010)
-INTRO (L"Get the natural logarithm of the probability that the selected @@HMM_StateSequence|state sequence@ was generated by the selected @HMM.")
+MAN_BEGIN (U"HMM & HMM_StateSequence: Get probability", U"djmw", 20101010)
+INTRO (U"Get the natural logarithm of the probability that the selected @@HMM_StateSequence|state sequence@ was generated by the selected @HMM.")
 MAN_END
 
-MAN_BEGIN (L"HMM & HMM_ObservationSequence: Get probability", L"djmw", 20101010)
-INTRO (L"Get the natural logarithm of the probability that the selected @@HMM_ObservationSequence|state sequence@ was generated by the selected @HMM.")
-ENTRY (L"Algorithm")
-NORMAL (L"Viterbi")
+MAN_BEGIN (U"HMM & HMM_ObservationSequence: Get probability", U"djmw", 20101010)
+INTRO (U"Get the natural logarithm of the probability that the selected @@HMM_ObservationSequence|state sequence@ was generated by the selected @HMM.")
+ENTRY (U"Algorithm")
+NORMAL (U"Viterbi")
 MAN_END
 
-MAN_BEGIN (L"HMM: Set transition probabilities...", L"djmw", 20101010)
-INTRO (L"Sets the probabilities for making a transition from one state to all other states.")
-ENTRY (L"Settings")
-TAG (L"##Probabilities")
-DEFINITION (L"the list of transition probabilities from the given state. "
+MAN_BEGIN (U"HMM: Set transition probabilities...", U"djmw", 20101010)
+INTRO (U"Sets the probabilities for making a transition from one state to all other states.")
+ENTRY (U"Settings")
+TAG (U"##Probabilities")
+DEFINITION (U"the list of transition probabilities from the given state. "
 	"The values given will be scaled as probabilities. A zero is used to mark a transition that will never occur. ")
-ENTRY (L"Examples")
-NORMAL (L"For a three state model the input \"1 3 7\" will result in the same probabilities as the input \"0.1 0.3 0.7\".")
+ENTRY (U"Examples")
+NORMAL (U"For a three state model the input \"1 3 7\" will result in the same probabilities as the input \"0.1 0.3 0.7\".")
 MAN_END
 
-MAN_BEGIN (L"HMM: Set emission probabilities...", L"djmw", 20101010)
-INTRO (L"Sets the probabilities for emitting the symbols from the state.")
-NORMAL (L"The values given will be scaled as probabilities. ")
-ENTRY (L"Examples")
-NORMAL (L"For an HMM with four symbols the input \"1 3 3 3\" will result in the same probabilities as the input \"0.1 0.3 0.3 0.3\".")
+MAN_BEGIN (U"HMM: Set emission probabilities...", U"djmw", 20101010)
+INTRO (U"Sets the probabilities for emitting the symbols from the state.")
+NORMAL (U"The values given will be scaled as probabilities. ")
+ENTRY (U"Examples")
+NORMAL (U"For an HMM with four symbols the input \"1 3 3 3\" will result in the same probabilities as the input \"0.1 0.3 0.3 0.3\".")
 MAN_END
 
-MAN_BEGIN (L"HMM: Set start probabilities...", L"djmw", 20101010)
-INTRO (L"Sets the probabilities that the model starts in the particular states.")
-NORMAL (L"The values given will be scaled as probabilities. ")
+MAN_BEGIN (U"HMM: Set start probabilities...", U"djmw", 20101010)
+INTRO (U"Sets the probabilities that the model starts in the particular states.")
+NORMAL (U"The values given will be scaled as probabilities. ")
 MAN_END
 
-MAN_BEGIN (L"HMM & HMM_ObservationSequence: To TableOfReal (bigrams)...", L"djmw", 20101019)
-INTRO (L"Get a table with bigrams and marginals form the selected @HMM_ObservationSequence and the @HMM.")
-NORMAL (L"The entry at row %i and column %j shows how often the %j-th symbol follows the %i-th symbol in the observation sequence.")
-ENTRY (L"Remark")
-NORMAL (L"The row and colum marginals for the first and the last element in the obsevation sequence will not be equal because there is no transition to the first and no transition from the last one.")
+MAN_BEGIN (U"HMM & HMM_ObservationSequence: To TableOfReal (bigrams)...", U"djmw", 20101019)
+INTRO (U"Get a table with bigrams and marginals form the selected @HMM_ObservationSequence and the @HMM.")
+NORMAL (U"The entry at row %i and column %j shows how often the %j-th symbol follows the %i-th symbol in the observation sequence.")
+ENTRY (U"Remark")
+NORMAL (U"The row and colum marginals for the first and the last element in the obsevation sequence will not be equal because there is no transition to the first and no transition from the last one.")
 MAN_END
 
-MAN_BEGIN (L"HMM_ObservationSequence: To TableOfReal (bigrams)...", L"djmw", 20101019)
-INTRO (L"Get a table with bigrams form the selected @HMM_ObservationSequence.")
-NORMAL (L"See also @@HMM & HMM_ObservationSequence: To TableOfReal (bigrams)... at .")
+MAN_BEGIN (U"HMM_ObservationSequence: To TableOfReal (bigrams)...", U"djmw", 20101019)
+INTRO (U"Get a table with bigrams form the selected @HMM_ObservationSequence.")
+NORMAL (U"See also @@HMM & HMM_ObservationSequence: To TableOfReal (bigrams)... at .")
 MAN_END
 
-MAN_BEGIN (L"HMM & HMM_ObservationSequences: Learn...", L"djmw", 20111130)
-INTRO (L"Train the transition and emission probabilities of the @HMM from the observations.")
-ENTRY (L"Algorithm")
-NORMAL (L"The Baum-Welch @@expectation-maximization@ procedure. It uses the forward and backward procedures to (re)estimate the parameters until convergence is reached.")
+MAN_BEGIN (U"HMM & HMM_ObservationSequences: Learn...", U"djmw", 20111130)
+INTRO (U"Train the transition and emission probabilities of the @HMM from the observations.")
+ENTRY (U"Algorithm")
+NORMAL (U"The Baum-Welch @@expectation-maximization@ procedure. It uses the forward and backward procedures to (re)estimate the parameters until convergence is reached.")
 MAN_END
 
-MAN_BEGIN (L"Bishop (2006)", L"djmw", 20101026)
-NORMAL (L"C.M. Bishop (2006): %%Pattern recognition and machine learning%. Springer.")
+MAN_BEGIN (U"Bishop (2006)", U"djmw", 20101026)
+NORMAL (U"C.M. Bishop (2006): %%Pattern recognition and machine learning%. Springer.")
 MAN_END
 
-MAN_BEGIN (L"Figueiredo & Jain (2002)",L"djmw", 20101229)
-NORMAL (L"Mario A.T. Figueiredo & Anil K. Jain (2002): \"Unsupervised learning of finite mixture models.\" "
+MAN_BEGIN (U"Figueiredo & Jain (2002)", U"djmw", 20101229)
+NORMAL (U"Mario A.T. Figueiredo & Anil K. Jain (2002): \"Unsupervised learning of finite mixture models.\" "
 	"%%IEEE Transactions on Pattern Analysis and Machine Intelligence% ##24(3)#: 381\\--396.")
 MAN_END
 
-MAN_BEGIN (L"Rabiner (1989)", L"djmw", 20101017)
-NORMAL (L"L.R. Rabiner (1989): \"A tutorial on Hidden Markov Models and selected applications in speech recognition.\" %%Proceedings of the IEEE% #77: 257\\--286.")
+MAN_BEGIN (U"Rabiner (1989)", U"djmw", 20101017)
+NORMAL (U"L.R. Rabiner (1989): \"A tutorial on Hidden Markov Models and selected applications in speech recognition.\" %%Proceedings of the IEEE% #77: 257\\--286.")
 MAN_END
 
-MAN_BEGIN (L"Tenreiro (2009)", L"djmw", 20101113)
-NORMAL (L"C. Tenreiro (2009): \"On the choice of the smoothing parameter for the BHEP goodness-of-fit test.\" "
+MAN_BEGIN (U"Tenreiro (2009)", U"djmw", 20101113)
+NORMAL (U"C. Tenreiro (2009): \"On the choice of the smoothing parameter for the BHEP goodness-of-fit test.\" "
 	"%%Computational Statistics and Data Analysis% #53: 1038\\--1053.")
 MAN_END
 
-MAN_BEGIN (L"Zhang et al. (2003)", L"djmw", 20101122)
-NORMAL (L"Zhihua Zhang & Chibiao Chen & Jian Sun & Kap Luk Chan (2003): \"EM algorithms for Gaussian mixtures with "
+MAN_BEGIN (U"Zhang et al. (2003)", U"djmw", 20101122)
+NORMAL (U"Zhihua Zhang & Chibiao Chen & Jian Sun & Kap Luk Chan (2003): \"EM algorithms for Gaussian mixtures with "
 	"split-and-merge operation.\" %%Pattern Recognition% #36: 1973\\--1983.")
 MAN_END
 
diff --git a/dwtools/manual_KlattGrid.cpp b/dwtools/manual_KlattGrid.cpp
index 961fb24..213fc24 100644
--- a/dwtools/manual_KlattGrid.cpp
+++ b/dwtools/manual_KlattGrid.cpp
@@ -23,186 +23,186 @@ void manual_KlattGrid (ManPages me);
 void manual_KlattGrid (ManPages me)
 {
 
-MAN_BEGIN (L"KlattGrid", L"djmw", 20140117)
-INTRO (L"A KlattGrid represents the source-filter model as a function of time. It consists of a number of tiers that model aspects of the source and the filter, and the interaction between source and filter. The KlattGrid implements a superset of the speech synthesizer described in figure 14 in the @@Klatt & Klatt (1990)@ article.")
-NORMAL (L"The following drawing represents a cascade synthesizer with six oral formants, one nasal formant, "
+MAN_BEGIN (U"KlattGrid", U"djmw", 20140117)
+INTRO (U"A KlattGrid represents the source-filter model as a function of time. It consists of a number of tiers that model aspects of the source and the filter, and the interaction between source and filter. The KlattGrid implements a superset of the speech synthesizer described in figure 14 in the @@Klatt & Klatt (1990)@ article.")
+NORMAL (U"The following drawing represents a cascade synthesizer with six oral formants, one nasal formant, "
 	"one nasal antiformant, one tracheal formant, one tracheal antiformant and six frication formants. ")
 SCRIPT (7.0, 6.5,
-	L"Create KlattGrid: \"kg\", 0, 1, 6, 1, 1, 6, 1, 1, 1\n"
+	U"Create KlattGrid: \"kg\", 0, 1, 6, 1, 1, 6, 1, 1, 1\n"
 	"Draw synthesizer: \"Cascade\"\n"
 	"Remove\n")
-NORMAL (L"In the next picture a parallel synthesizer branch is used instead of the cascade one.")
+NORMAL (U"In the next picture a parallel synthesizer branch is used instead of the cascade one.")
 SCRIPT (7.0, 6.5,
-	L"Create KlattGrid: \"kg\", 0, 1, 6, 1, 1, 6, 1, 1, 1\n"
+	U"Create KlattGrid: \"kg\", 0, 1, 6, 1, 1, 6, 1, 1, 1\n"
 	"Draw synthesizer... Parallel\n"
 	"Remove\n")
-NORMAL (L"All parameters in the synthesizer are represented by separate tiers.")
-ENTRY (L"The source")
-NORMAL (L"The source is modelled by the following tiers:")
-TAG (L"##Pitch")
-DEFINITION (L"models fundamental frequency (in Hertz).")
-TAG (L"##Flutter")
-DEFINITION (L"models a kind of \"random\" variation of the pitch (with a number between zero and one). ")
-TAG (L"##Voicing amplitude")
-DEFINITION (L"models the maximum amplitude of the glottal flow (in dB SPL).")
-TAG (L"##Open phase")
-DEFINITION (L"models the open phase of the glottis (with a number between zero and one). If the tier is empty a default of 0.7 "
+NORMAL (U"All parameters in the synthesizer are represented by separate tiers.")
+ENTRY (U"The source")
+NORMAL (U"The source is modelled by the following tiers:")
+TAG (U"##Pitch")
+DEFINITION (U"models fundamental frequency (in Hertz).")
+TAG (U"##Flutter")
+DEFINITION (U"models a kind of \"random\" variation of the pitch (with a number between zero and one). ")
+TAG (U"##Voicing amplitude")
+DEFINITION (U"models the maximum amplitude of the glottal flow (in dB SPL).")
+TAG (U"##Open phase")
+DEFINITION (U"models the open phase of the glottis (with a number between zero and one). If the tier is empty a default of 0.7 "
 	"will be used.")
-TAG (L"##Power1#, ##Power2#")
-DEFINITION (L"model the form of the glottal flow function flow(%t)=%t^^%%power1%^-%t^^%%power2%^ for 0\\<_ t \\<_ 1. "
+TAG (U"##Power1#, ##Power2#")
+DEFINITION (U"model the form of the glottal flow function flow(%t)=%t^^%%power1%^-%t^^%%power2%^ for 0\\<_ t \\<_ 1. "
 	"To make glottal closure possible, %power2 has to be larger than %power1. If the power1 tier is empty, a default "
 	"value of 3 will be used. If the power2 tier is empty, a default of 4 will be used.")
-TAG (L"##Collision phase")
-DEFINITION (L"models the last part of the flow function with an exponential decay function instead of a polynomial one. "
+TAG (U"##Collision phase")
+DEFINITION (U"models the last part of the flow function with an exponential decay function instead of a polynomial one. "
 	"More information about #Power1, #Power2, ##Open phase# and ##Collision phase# can be found in the @@PointProcess: To Sound (phonation)...@ manual.")
-TAG (L"##Spectral tilt")
-DEFINITION (L"models the extra number of dB the voicing spectrum should be down at 3000 Hertz.")
-TAG (L"##Aspiration amplitude")
-DEFINITION (L"models the (maximum) amplitude of the noise generated at the glottis (in dB SPL). ")
-TAG (L"##Breathiness amplitude")
-DEFINITION (L"models the maximum breathiness noise amplitude during the open phase of the glottis (in dB SPL). "
+TAG (U"##Spectral tilt")
+DEFINITION (U"models the extra number of dB the voicing spectrum should be down at 3000 Hertz.")
+TAG (U"##Aspiration amplitude")
+DEFINITION (U"models the (maximum) amplitude of the noise generated at the glottis (in dB SPL). ")
+TAG (U"##Breathiness amplitude")
+DEFINITION (U"models the maximum breathiness noise amplitude during the open phase of the glottis (in dB SPL). "
 	"The amplitude of the breathiness noise is modulated by the glottal flow.")
-TAG (L"##Double pulsing")
-DEFINITION (L"models diplophonia (by a fraction between zero and one). Whenever this parameter is greater than zero, "
+TAG (U"##Double pulsing")
+DEFINITION (U"models diplophonia (by a fraction between zero and one). Whenever this parameter is greater than zero, "
 	"alternate pulses are modified. A pulse is modified with this %%single% parameter in %%two% ways: it is %%delayed "
 	"in time% and its amplitude is %%attenuated%.  If the double pulsing value is a maximum and equals one, the time of "
 	"closure of the first peak coincides with the opening time of the second one. ")
-ENTRY (L"The vocal tract filter")
-NORMAL (L"The filter is modelled by a number of @@FormantGrid@'s. For parallel synthesis the formant grids that normally "
+ENTRY (U"The vocal tract filter")
+NORMAL (U"The filter is modelled by a number of @@FormantGrid@'s. For parallel synthesis the formant grids that normally "
 	"only contain formant frequency and formant bandwidth tiers, have been extended with amplitude tiers. Amplitudes values are in dB. The following formant grids can be used:")
-TAG (L"##Oral formants")
-DEFINITION (L"represent the \"standard\" oral resonances of the vocal tract. ")
-TAG (L"##Nasal formants")
-DEFINITION (L"model resonances in the nasal tract. Because the form of the nasal tract does not vary much during the course of an utterance, nasal formants tend to be constant. ")
-TAG (L"##Nasal antiformants")
-DEFINITION (L"model dips in the spectrum caused by leakage to the nasal tract.")
-ENTRY (L"Interaction between source and filter")
-NORMAL (L"The interaction between source and filter is modeled by two formant grids.")
-TAG (L"##Tracheal formants")
-DEFINITION (L"model one aspect of the coupling of the trachea with the vocal tract transfer function, namely, by the "
+TAG (U"##Oral formants")
+DEFINITION (U"represent the \"standard\" oral resonances of the vocal tract. ")
+TAG (U"##Nasal formants")
+DEFINITION (U"model resonances in the nasal tract. Because the form of the nasal tract does not vary much during the course of an utterance, nasal formants tend to be constant. ")
+TAG (U"##Nasal antiformants")
+DEFINITION (U"model dips in the spectrum caused by leakage to the nasal tract.")
+ENTRY (U"Interaction between source and filter")
+NORMAL (U"The interaction between source and filter is modeled by two formant grids.")
+TAG (U"##Tracheal formants")
+DEFINITION (U"model one aspect of the coupling of the trachea with the vocal tract transfer function, namely, by the "
 	"introduction of extra formants (and antiformants) that sometimes distort vowel spectra to a varying degrees. "
 	"According to @@Klatt & Klatt (1990)@, the other effect being increased losses at glottal termination which primarily affect first-formant bandwidths.")
-TAG (L"##Tracheal antiformants")
-DEFINITION (L"model dips in the spectrum caused by the trachea.")
-TAG (L"##Delta formants")
-DEFINITION (L"The values in this grid model the number of hertz that the oral formants and/or bandwidths change during the open phase "
+TAG (U"##Tracheal antiformants")
+DEFINITION (U"model dips in the spectrum caused by the trachea.")
+TAG (U"##Delta formants")
+DEFINITION (U"The values in this grid model the number of hertz that the oral formants and/or bandwidths change during the open phase "
 	"of the glottis. @@Klatt & Klatt (1990)@ distinguish four types of source-filter interactions: an F1 ripple in the "
 	"source waveform, a non-linear interaction between the first formant and the fundamental frequency, a truncation of "
 	"the first formant and tracheal formants and antiformants. ")
-ENTRY (L"The frication section")
-NORMAL (L"The frication section is modeled with a frication formant grid, with formant frequencies, bandwidths and (separate) "
+ENTRY (U"The frication section")
+NORMAL (U"The frication section is modeled with a frication formant grid, with formant frequencies, bandwidths and (separate) "
 	"amplitudes (dB), a frication by-pass tier (dB) and an amplitude tier (dB SPL) that governs the frication noise source.")
-ENTRY (L"A minimal synthesizer")
-NORMAL (L"The following script produces a minimal voiced sound. The first line creates the standard KlattGrid."
+ENTRY (U"A minimal synthesizer")
+NORMAL (U"The following script produces a minimal voiced sound. The first line creates the standard KlattGrid."
 	"The next two lines define a pitch point, in Hz, and the voicing amplitude, in dB. The last line "
 	"creates the sound.")
-CODE (L"Create KlattGrid: \"kg\", 0, 1, 6, 1, 1, 6, 1, 1, 1")
-CODE (L"Add pitch point: 0.5, 100")
-CODE (L"Add voicing amplitude point: 0.5, 90")
-CODE (L"To Sound")
-NORMAL (L"The following script will produce raw frication noise. Because we do not specify formant amplitudes, "
+CODE (U"Create KlattGrid: \"kg\", 0, 1, 6, 1, 1, 6, 1, 1, 1")
+CODE (U"Add pitch point: 0.5, 100")
+CODE (U"Add voicing amplitude point: 0.5, 90")
+CODE (U"To Sound")
+NORMAL (U"The following script will produce raw frication noise. Because we do not specify formant amplitudes, "
 	"we turn off the formants in the parallel section.")
-CODE (L"Create KlattGrid: \"kg\", 0, 1, 6, 1, 1, 6, 1, 1, 1")
-CODE (L"Add frication amplitude point: 0.5 ,80")
-CODE (L"Add frication bypass point: 0.5, 0")
-CODE (L"To Sound (special): 0, 0, 44100, \"yes\", \"no\", \"yes\", \"yes\", \"yes\", \"yes\",")
-CODE (L"... \"Powers in tiers\", \"yes\", \"yes\", \"yes\",")
-CODE (L"... \"Cascade\", 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, \"yes\"")
-ENTRY (L"Changes")
-NORMAL (L"In praat versions before 5.1.05 the values for the %%oral / nasal / tracheal formant amplitudes% and"
+CODE (U"Create KlattGrid: \"kg\", 0, 1, 6, 1, 1, 6, 1, 1, 1")
+CODE (U"Add frication amplitude point: 0.5 ,80")
+CODE (U"Add frication bypass point: 0.5, 0")
+CODE (U"To Sound (special): 0, 0, 44100, \"yes\", \"no\", \"yes\", \"yes\", \"yes\", \"yes\",")
+CODE (U"... \"Powers in tiers\", \"yes\", \"yes\", \"yes\",")
+CODE (U"... \"Cascade\", 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, \"yes\"")
+ENTRY (U"Changes")
+NORMAL (U"In praat versions before 5.1.05 the values for the %%oral / nasal / tracheal formant amplitudes% and"
 	" %%frication bypass amplitude% had to be given in dB SPL; "
 	" now they are in real dB's, i.e."
 	" 0 dB means no change in amplitude. You can calculate new values from old values as:\n"
 	"new_value = old_value + 20*log10(2e-5). This means that you have to subtract approximately 94 dB from the old values.")
 MAN_END
 
-MAN_BEGIN (L"Create KlattGrid...", L"djmw", 20081224)
-INTRO (L"A command to create a multitier @@KlattGrid@ speech synthesizer.")
+MAN_BEGIN (U"Create KlattGrid...", U"djmw", 20081224)
+INTRO (U"A command to create a multitier @@KlattGrid@ speech synthesizer.")
 MAN_END
 
 #define PhonationGrid_to_Sound_COMMON_PARAMETERS_HELP \
-TAG (L"##Sampling frequency (Hz)") \
-DEFINITION (L"the @@sampling frequency@ of the resulting sound.") \
-TAG (L"##Voicing") \
-DEFINITION (L"switches voicing on or off.") \
-TAG (L"##Flutter") \
-DEFINITION (L"switches the flutter tier on or off. This will, of course, only have effect if at least one flutter point has been defined in the flutter tier.") \
-TAG (L"##Double pulsing") \
-DEFINITION (L"switches the double pulsing tier on or off.") \
-TAG (L"##Collision phase") \
-DEFINITION (L"switches the collision phase tier on or off.") \
-TAG (L"##Spectral tilt") \
-DEFINITION (L"switches the spectral tilt tier on or off.") \
-TAG (L"##Flow function") \
-DEFINITION (L"determines which flow function will be used. The flow function is determined by two parameters, %%power1% and %%power2% as %%flow(t)=x^^power1^-x^^power2^%. " \
+TAG (U"##Sampling frequency (Hz)") \
+DEFINITION (U"the @@sampling frequency@ of the resulting sound.") \
+TAG (U"##Voicing") \
+DEFINITION (U"switches voicing on or off.") \
+TAG (U"##Flutter") \
+DEFINITION (U"switches the flutter tier on or off. This will, of course, only have effect if at least one flutter point has been defined in the flutter tier.") \
+TAG (U"##Double pulsing") \
+DEFINITION (U"switches the double pulsing tier on or off.") \
+TAG (U"##Collision phase") \
+DEFINITION (U"switches the collision phase tier on or off.") \
+TAG (U"##Spectral tilt") \
+DEFINITION (U"switches the spectral tilt tier on or off.") \
+TAG (U"##Flow function") \
+DEFINITION (U"determines which flow function will be used. The flow function is determined by two parameters, %%power1% and %%power2% as %%flow(t)=x^^power1^-x^^power2^%. " \
 	"If the option \"Powers in tier\" is chosen the power1 and power2 tiers will be used for the values of %%power1% and %%power2%. The other choices switch the two tiers off and instead fixed values will be used for %%power1% and %%power2%.") \
-TAG (L"##Flow derivative") \
-DEFINITION (L"determines whether the flow or the flow derivative is used for phonation. ") \
-TAG (L"##Aspiration") \
-DEFINITION (L"determines whether aspiration is included in the synthesis.") \
-TAG (L"##Breathiness") \
-DEFINITION (L"determines whether breathiness is included in the synthesis.")
+TAG (U"##Flow derivative") \
+DEFINITION (U"determines whether the flow or the flow derivative is used for phonation. ") \
+TAG (U"##Aspiration") \
+DEFINITION (U"determines whether aspiration is included in the synthesis.") \
+TAG (U"##Breathiness") \
+DEFINITION (U"determines whether breathiness is included in the synthesis.")
 
-MAN_BEGIN (L"KlattGrid: To Sound (phonation)...", L"djmw", 20090122)
-INTRO (L"A command to synthesize a Sound from the selected @@KlattGrid at .")
-ENTRY (L"Settings")
+MAN_BEGIN (U"KlattGrid: To Sound (phonation)...", U"djmw", 20090122)
+INTRO (U"A command to synthesize a Sound from the selected @@KlattGrid at .")
+ENTRY (U"Settings")
 PhonationGrid_to_Sound_COMMON_PARAMETERS_HELP
 MAN_END
 
-MAN_BEGIN (L"KlattGrid: Play special...", L"djmw", 20090421)
-INTRO (L"A command to play part of a @@KlattGrid at .")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"determines the part of the sound's domain that you want to hear. If both argument equal zero the complete sound is played. ")
-TAG (L"##Sampling frequency (Hz)")
-DEFINITION (L"determines the @@sampling frequency@ of the resulting sound.")
-TAG (L"##Scale peak")
-DEFINITION (L"determines whether the peak value of the sound will be set to 0.99. In this way the sound will always play well.")
+MAN_BEGIN (U"KlattGrid: Play special...", U"djmw", 20090421)
+INTRO (U"A command to play part of a @@KlattGrid at .")
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"determines the part of the sound's domain that you want to hear. If both argument equal zero the complete sound is played. ")
+TAG (U"##Sampling frequency (Hz)")
+DEFINITION (U"determines the @@sampling frequency@ of the resulting sound.")
+TAG (U"##Scale peak")
+DEFINITION (U"determines whether the peak value of the sound will be set to 0.99. In this way the sound will always play well.")
 PhonationGrid_to_Sound_COMMON_PARAMETERS_HELP
-TAG (L"##Model")
-DEFINITION (L"switches on either the cascade or the parallel section of the synthesizer.")
-TAG (L"##Oral formant range#, ##Nasal formant range# ...")
-DEFINITION (L"selects the formants to use in the synthesis. Choosing the end of a range smaller than the start of the range switches off the formants. ")
-TAG (L"##Frication bypass")
-DEFINITION (L"switches the frication bypass of the frication section on or off. "
+TAG (U"##Model")
+DEFINITION (U"switches on either the cascade or the parallel section of the synthesizer.")
+TAG (U"##Oral formant range#, ##Nasal formant range# ...")
+DEFINITION (U"selects the formants to use in the synthesis. Choosing the end of a range smaller than the start of the range switches off the formants. ")
+TAG (U"##Frication bypass")
+DEFINITION (U"switches the frication bypass of the frication section on or off. "
 	"The complete frication section can be turned off by also switching off the frication formants.")
 MAN_END
 
-MAN_BEGIN (L"KlattGrid: To Sound (special)...", L"djmw", 20090415)
-INTRO (L"A command to synthesize a Sound from the selected @@KlattGrid at .")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"determines the part of the domain that you want to save as a sound. If both argument equal zero the complete sound is created. ")
-TAG (L"##Sampling frequency (Hz)")
-DEFINITION (L"determines the @@sampling frequency@ of the resulting sound.")
-TAG (L"##Scale peak")
-DEFINITION (L"determines whether the peak value of the sound will be set to 0.99. In this way the sound will always play well and can be saved to a file with minimal loss of resolution.")
+MAN_BEGIN (U"KlattGrid: To Sound (special)...", U"djmw", 20090415)
+INTRO (U"A command to synthesize a Sound from the selected @@KlattGrid at .")
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"determines the part of the domain that you want to save as a sound. If both argument equal zero the complete sound is created. ")
+TAG (U"##Sampling frequency (Hz)")
+DEFINITION (U"determines the @@sampling frequency@ of the resulting sound.")
+TAG (U"##Scale peak")
+DEFINITION (U"determines whether the peak value of the sound will be set to 0.99. In this way the sound will always play well and can be saved to a file with minimal loss of resolution.")
 PhonationGrid_to_Sound_COMMON_PARAMETERS_HELP
-TAG (L"##Model")
-DEFINITION (L"switches on either the cascade or the parallel section of the synthesizer.")
-TAG (L"##Oral formant range#, ##Nasal formant range# ...")
-DEFINITION (L"selects the formants to use in the synthesis. Choosing the end of a range smaller than the start of the range switches off the formants. ")
-TAG (L"##Frication bypass")
-DEFINITION (L"switches the frication bypass of the frication section on or off. "
+TAG (U"##Model")
+DEFINITION (U"switches on either the cascade or the parallel section of the synthesizer.")
+TAG (U"##Oral formant range#, ##Nasal formant range# ...")
+DEFINITION (U"selects the formants to use in the synthesis. Choosing the end of a range smaller than the start of the range switches off the formants. ")
+TAG (U"##Frication bypass")
+DEFINITION (U"switches the frication bypass of the frication section on or off. "
 	"The complete frication section can be turned off by also switching off the frication formants.")
 MAN_END
 
-MAN_BEGIN (L"KlattGrid: Extract oral formant grid (open phases)...", L"djmw", 20090421)
-INTRO (L"Extracts the oral formant grid as used in the synthesis, i.e. the resulting grid contains the informantion from the oral formant grid and the delta formant grid combined during the open phase of the glottis. ")
+MAN_BEGIN (U"KlattGrid: Extract oral formant grid (open phases)...", U"djmw", 20090421)
+INTRO (U"Extracts the oral formant grid as used in the synthesis, i.e. the resulting grid contains the informantion from the oral formant grid and the delta formant grid combined during the open phase of the glottis. ")
 MAN_END
 
-MAN_BEGIN (L"Sound: To KlattGrid (simple)...", L"djmw", 20090415)
-INTRO (L"Create a @@KlattGrid@ from a @@Sound at .")
-ENTRY (L"Algorithm")
-NORMAL (L"Oral formants are determined by the @@Sound: To Formant (burg)...@ method and transformed to a @@FormantGrid at . "
+MAN_BEGIN (U"Sound: To KlattGrid (simple)...", U"djmw", 20090415)
+INTRO (U"Create a @@KlattGrid@ from a @@Sound at .")
+ENTRY (U"Algorithm")
+NORMAL (U"Oral formants are determined by the @@Sound: To Formant (burg)...@ method and transformed to a @@FormantGrid at . "
 	"Pitch is determined by the @@Sound: To Pitch...@ method and transformed to a @@PitchTier at . "
 	"With @@Sound: To Intensity...@ we determine intensity and convert it to an @@IntensityTier at .")
-NORMAL (L"Next a KlattGrid is created whose time domain conforms to the sound. Its pitch tier, normal formant grid "
+NORMAL (U"Next a KlattGrid is created whose time domain conforms to the sound. Its pitch tier, normal formant grid "
 	"and its voicing amplitude are replaced by the results from the analyses.")
 MAN_END
 
-MAN_BEGIN (L"Sound & KlattGrid: Filter by vocal tract...", L"djmw", 20090108)
-INTRO (L"Filters the selected sound with the vocal tract part of the selected @@KlattGrid at . During this filtering the delta formants and bandwidths are %%not% used. ")
+MAN_BEGIN (U"Sound & KlattGrid: Filter by vocal tract...", U"djmw", 20090108)
+INTRO (U"Filters the selected sound with the vocal tract part of the selected @@KlattGrid at . During this filtering the delta formants and bandwidths are %%not% used. ")
 MAN_END
 
 }
diff --git a/dwtools/manual_MDS.cpp b/dwtools/manual_MDS.cpp
index d0d4a7b..b7515a3 100644
--- a/dwtools/manual_MDS.cpp
+++ b/dwtools/manual_MDS.cpp
@@ -1,6 +1,6 @@
 /* manual_MDS.cpp
  *
- * Copyright (C) 1993-2014 David Weenink
+ * Copyright (C) 1993-2014, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,34 +35,34 @@ static void drawLetterRConfigurationExample (Graphics g)
 {
 	autoConfiguration me = Configuration_createLetterRExample (1);
 	Graphics_setWindow (g, -6, 4, -7, 5);
-	Configuration_draw (me.peek(), g, 1, 2, -6, 4, -7, 5, 0, 1, L"", 1);
+	Configuration_draw (me.peek(), g, 1, 2, -6, 4, -7, 5, 0, 1, U"", 1);
 }
 
 static void drawLetterRConfigurationExample2 (Graphics g)
 {
 	autoConfiguration me = Configuration_createLetterRExample (2);
-	Configuration_draw (me.peek(), g, 1, 2, -0.8, 1.2, -0.8, 0.7, 0, 1, L"", 1);
+	Configuration_draw (me.peek(), g, 1, 2, -0.8, 1.2, -0.8, 0.7, 0, 1, U"", 1);
 }
 
 static void drawLetterRShepard (Graphics g)
 {
 	autoDissimilarity d = Dissimilarity_createLetterRExample (32.5);
 	autoConfiguration c = Configuration_createLetterRExample (2);
-	Dissimilarity_Configuration_drawShepardDiagram (d.peek(), c.peek(), g, 0, 200, 0, 2.2, 1, L"+", 1);
+	Dissimilarity_Configuration_drawShepardDiagram (d.peek(), c.peek(), g, 0, 200, 0, 2.2, 1, U"+", 1);
 }
 
 static void drawLetterRRegression (Graphics g)
 {
 	autoDissimilarity d = Dissimilarity_createLetterRExample (32.5);
 	autoConfiguration c = Configuration_createLetterRExample (2);
-	Dissimilarity_Configuration_drawMonotoneRegression (d.peek(), c.peek(), g, MDS_PRIMARY_APPROACH, 0, 200, 0, 2.2, 1, L"+", 1);
+	Dissimilarity_Configuration_drawMonotoneRegression (d.peek(), c.peek(), g, MDS_PRIMARY_APPROACH, 0, 200, 0, 2.2, 1, U"+", 1);
 }
 
 static void drawCarrollWishConfigurationExample (Graphics g)
 {
 	autoConfiguration me = Configuration_createCarrollWishExample ();
 	Graphics_setWindow (g, -2, 2, -2, 2);
-	Configuration_draw (me.peek(), g, 1, 2, -2, 2, -2, 2, 0, 1, L"", 1);
+	Configuration_draw (me.peek(), g, 1, 2, -2, 2, -2, 2, 0, 1, U"", 1);
 }
 
 static void drawCarrollWishSalienceExample (Graphics g)
@@ -73,220 +73,220 @@ static void drawCarrollWishSalienceExample (Graphics g)
 
 static void drawMsplineExample (Graphics g)
 {
-	drawSplines (g, 0, 1, 0, 10, 1, 3, L"0.3 0.5 0.6", 1);
+	drawSplines (g, 0, 1, 0, 10, 1, 3, U"0.3 0.5 0.6", 1);
 }
 
 static void drawIsplineExample (Graphics g)
 {
-	drawSplines (g, 0, 1, 0, 1.5, 2, 3, L"0.3 0.5 0.6", 1);
+	drawSplines (g, 0, 1, 0, 1.5, 2, 3, U"0.3 0.5 0.6", 1);
 }
 
 void manual_MDS_init (ManPages me);
 void manual_MDS_init (ManPages me)
 {
 
-MAN_BEGIN (L"CANDECOMP", L"djmw", 19971201)
-ENTRY (L"An algorithm to solve the INDSCAL problem.")
-NORMAL (L"In the analysis of the INDSCAL three-way data matrix (%numberOfPoints "
+MAN_BEGIN (U"CANDECOMP", U"djmw", 19971201)
+ENTRY (U"An algorithm to solve the INDSCAL problem.")
+NORMAL (U"In the analysis of the INDSCAL three-way data matrix (%numberOfPoints "
 	"\\xx %numberOfDimensions \\xx %numberOfSources) we seek to minimize the "
 	"function: ")
-FORMULA (L"%f(%X, %W__1_,..., %W__%numberOfSources_) = "
+FORMULA (U"%f(%X, %W__1_,..., %W__%numberOfSources_) = "
 	"\\su__%i=1..%numberOfSources_ | %S__%i_ \\-- %X%W__%i_%X\\'p |^2")
-NORMAL (L"where %S__%i_ is a known symmetric %numberOfPoints \\xx %numberOfPoints "
+NORMAL (U"where %S__%i_ is a known symmetric %numberOfPoints \\xx %numberOfPoints "
 	"matrix with scalar products of distances for source %i, %X is the unknown configuration "
 	"%numberOfPoints \\xx %numberOfDimensions matrix, %X\\'p its transpose, and, %W__%i_ is "
 	"the diagonal %numberOfDimensions \\xx %numberOfDimensions weight matrix for source %i. The function "
 	"above has no analytical solution for %X and the %W__%i_. It can be solved, however, "
 	"by an iterative procedure which Carroll & Chang have christened CANDECOMP "
-	"(CANonical DECOMPosition).  This method minimizes, instead of the function "
+	"(CANonical DECOMPosition). This method minimizes, instead of the function "
 	"given above, the following function:")
-LIST_ITEM (L"%g(%X, %Y, %W__1_,..., %W__%numberOfSources_) = \\su__%i=1..%numberOfSources_ "
+LIST_ITEM (U"%g(%X, %Y, %W__1_,..., %W__%numberOfSources_) = \\su__%i=1..%numberOfSources_ "
 	"| %S__%i_ \\-- %X%W__%i_%Y\\'p |^2")
-NORMAL (L"where %X and %Y are both %numberOfPoints \\xx %numberOfDimensions configuration matrices.")
-NORMAL (L"The algorithm proceeds as follows:")
-NORMAL (L"1. Initialize the $W matrices and the configuration matrix %X. This can for example be "
+NORMAL (U"where %X and %Y are both %numberOfPoints \\xx %numberOfDimensions configuration matrices.")
+NORMAL (U"The algorithm proceeds as follows:")
+NORMAL (U"1. Initialize the $W matrices and the configuration matrix %X. This can for example be "
 	"done according to a procedure given in @@Young, Takane & Lewyckyj (1978)@.")
-NORMAL (L"2. An alternating least squares minimization process is started as described that "
+NORMAL (U"2. An alternating least squares minimization process is started as described that "
 	"sequentially updates %Y, %X an %W (@@Carroll & Chang (1970)@):")
-LIST_ITEM (L"2.1. Solve for a new %Y given %X and the %W__%i_")
-LIST_ITEM (L"2.2. Solve for a new %X given the %W__%i_ and the new %Y.")
-LIST_ITEM (L"2.3. Solve for the %W__%i_ given the new %X and %Y.")
-NORMAL (L"Evaluate the goodness-of-fit criterion and either repeat the minimization sequence "
+LIST_ITEM (U"2.1. Solve for a new %Y given %X and the %W__%i_")
+LIST_ITEM (U"2.2. Solve for a new %X given the %W__%i_ and the new %Y.")
+LIST_ITEM (U"2.3. Solve for the %W__%i_ given the new %X and %Y.")
+NORMAL (U"Evaluate the goodness-of-fit criterion and either repeat the minimization sequence "
 	"(2.1\\--2.3) or continue.")
-NORMAL (L"3. Done: make %Y equal to %X and solve a last time for the %W__%i_.")
-NORMAL (L"Note: during the minimization the following constraints are effective:")
-LIST_ITEM (L"The configuration must be centered.")
-LIST_ITEM (L"The sum of squared coordinates in the configuration space is one for "
+NORMAL (U"3. Done: make %Y equal to %X and solve a last time for the %W__%i_.")
+NORMAL (U"Note: during the minimization the following constraints are effective:")
+LIST_ITEM (U"The configuration must be centered.")
+LIST_ITEM (U"The sum of squared coordinates in the configuration space is one for "
 	"each dimension, i.e., the configuration always has unit variance in each dimension.")
 MAN_END
 
-MAN_BEGIN (L"Configuration", L"djmw", 20101102)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type Configuration represents the positions of a number "
+MAN_BEGIN (U"Configuration", U"djmw", 20101102)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type Configuration represents the positions of a number "
 	"of labelled points in a multidimensional space.")
-ENTRY (L"How to create a Configuration")
-NORMAL (L"From the New menu:")
-LIST_ITEM (L"  \\bu @@Create Configuration...")
-NORMAL (L"By multidimensional scaling:")
-LIST_ITEM (L"  \\bu @@Dissimilarity: To Configuration (monotone mds)...")
-LIST_ITEM (L"  \\bu @@Dissimilarity: To Configuration (i-spline mds)...")
-LIST_ITEM (L"  \\bu @@Dissimilarity: To Configuration (interval mds)...")
-LIST_ITEM (L"  \\bu @@Dissimilarity: To Configuration (ratio mds)...")
-LIST_ITEM (L"  \\bu @@Dissimilarity: To Configuration (absolute mds)...")
-NORMAL (L"By multidimensional scaling with weights (@@Dissimilarity & Weight: To Configuration...@):")
-LIST_ITEM (L"  \\bu ##Dissimilarity & Weight: To Configuration (monotone mds)...")
-LIST_ITEM (L"  \\bu ##Dissimilarity & Weight: To Configuration (i-spline mds)...")
-LIST_ITEM (L"  \\bu ##Dissimilarity & Weight: To Configuration (interval mds)...")
-LIST_ITEM (L"  \\bu ##Dissimilarity & Weight: To Configuration (ratio mds)...")
-LIST_ITEM (L"  \\bu ##Dissimilarity & Weight: To Configuration (absolute mds)...")
-NORMAL (L"By multidimensional scaling with a start Configuration:")
-LIST_ITEM (L"  \\bu @@Dissimilarity & Configuration: To Configuration (monotone mds)...")
-LIST_ITEM (L"  \\bu @@Dissimilarity & Configuration: To Configuration (i-spline mds)...")
-LIST_ITEM (L"  \\bu @@Dissimilarity & Configuration: To Configuration (interval mds)...")
-LIST_ITEM (L"  \\bu @@Dissimilarity & Configuration: To Configuration (ratio mds)...")
-LIST_ITEM (L"  \\bu @@Dissimilarity & Configuration: To Configuration (absolute mds)...")
-NORMAL (L"By transforming an existing Configuration:")
-LIST_ITEM (L"  \\bu @@Configuration: To Configuration (varimax)...")
-LIST_ITEM (L"  \\bu @@Configuration & AffineTransform: To Configuration")
-LIST_ITEM (L"  \\bu @@Configuration & Procrustes: To Configuration")
-NORMAL (L"From @@Principal component analysis@:")
-LIST_ITEM (L"  \\bu @@TableOfReal: To Configuration (pca)...")
-LIST_ITEM (L"  \\bu @@PCA & TableOfReal: To Configuration...")
-NORMAL (L"From @@Discriminant analysis@:")
-LIST_ITEM (L"@@TableOfReal: To Configuration (lda)...")
-LIST_ITEM (L"  \\bu @@Discriminant & TableOfReal: To Configuration...")
-ENTRY (L"How to draw a Configuration")
-LIST_ITEM (L"\\bu @@Configuration: Draw...")
-LIST_ITEM (L"\\bu ##Configuration: Draw as numbers...")
-LIST_ITEM (L"\\bu ##Configuration: Draw as squares...")
-ENTRY (L"How to modify a Configuration")
-LIST_ITEM (L"\\bu @@Configuration: Randomize")
-LIST_ITEM (L"\\bu @@Configuration: Rotate (pc)@ (to principal directions)")
-LIST_ITEM (L"\\bu @@Configuration: Rotate...@ (in a plane around the origin)")
-LIST_ITEM (L"\\bu @@Configuration: Invert dimension...")
-LIST_ITEM (L"\\bu @@Configuration: Normalize...")
-ENTRY (L"Inside a Configuration")
-NORMAL (L"With @Inspect you will see the following attributes:")
-TAG (L"%numberOfRows")
-DEFINITION (L"the number of points (%numberOfPoints\\>_1).")
-TAG (L"%numberOfColumns")
-DEFINITION (L"the dimension of the space (%numberOfDimensions\\>_1).")
-TAG (L"%rowLabels")
-DEFINITION (L"the names associated with the points.")
-TAG (L"%columnLabels")
-DEFINITION (L"the names for the dimensions.")
-TAG (L"%data [1..%numberOfPoints][1..%numberOfDimensions]")
-DEFINITION (L"the coordinates of the points.")
-TAG (L"%metric")
-DEFINITION (L"determines the way distances between points are measured. In general "
+ENTRY (U"How to create a Configuration")
+NORMAL (U"From the New menu:")
+LIST_ITEM (U"  \\bu @@Create Configuration...")
+NORMAL (U"By multidimensional scaling:")
+LIST_ITEM (U"  \\bu @@Dissimilarity: To Configuration (monotone mds)...")
+LIST_ITEM (U"  \\bu @@Dissimilarity: To Configuration (i-spline mds)...")
+LIST_ITEM (U"  \\bu @@Dissimilarity: To Configuration (interval mds)...")
+LIST_ITEM (U"  \\bu @@Dissimilarity: To Configuration (ratio mds)...")
+LIST_ITEM (U"  \\bu @@Dissimilarity: To Configuration (absolute mds)...")
+NORMAL (U"By multidimensional scaling with weights (@@Dissimilarity & Weight: To Configuration...@):")
+LIST_ITEM (U"  \\bu ##Dissimilarity & Weight: To Configuration (monotone mds)...")
+LIST_ITEM (U"  \\bu ##Dissimilarity & Weight: To Configuration (i-spline mds)...")
+LIST_ITEM (U"  \\bu ##Dissimilarity & Weight: To Configuration (interval mds)...")
+LIST_ITEM (U"  \\bu ##Dissimilarity & Weight: To Configuration (ratio mds)...")
+LIST_ITEM (U"  \\bu ##Dissimilarity & Weight: To Configuration (absolute mds)...")
+NORMAL (U"By multidimensional scaling with a start Configuration:")
+LIST_ITEM (U"  \\bu @@Dissimilarity & Configuration: To Configuration (monotone mds)...")
+LIST_ITEM (U"  \\bu @@Dissimilarity & Configuration: To Configuration (i-spline mds)...")
+LIST_ITEM (U"  \\bu @@Dissimilarity & Configuration: To Configuration (interval mds)...")
+LIST_ITEM (U"  \\bu @@Dissimilarity & Configuration: To Configuration (ratio mds)...")
+LIST_ITEM (U"  \\bu @@Dissimilarity & Configuration: To Configuration (absolute mds)...")
+NORMAL (U"By transforming an existing Configuration:")
+LIST_ITEM (U"  \\bu @@Configuration: To Configuration (varimax)...")
+LIST_ITEM (U"  \\bu @@Configuration & AffineTransform: To Configuration")
+LIST_ITEM (U"  \\bu @@Configuration & Procrustes: To Configuration")
+NORMAL (U"From @@Principal component analysis@:")
+LIST_ITEM (U"  \\bu @@TableOfReal: To Configuration (pca)...")
+LIST_ITEM (U"  \\bu @@PCA & TableOfReal: To Configuration...")
+NORMAL (U"From @@Discriminant analysis@:")
+LIST_ITEM (U"@@TableOfReal: To Configuration (lda)...")
+LIST_ITEM (U"  \\bu @@Discriminant & TableOfReal: To Configuration...")
+ENTRY (U"How to draw a Configuration")
+LIST_ITEM (U"\\bu @@Configuration: Draw...")
+LIST_ITEM (U"\\bu ##Configuration: Draw as numbers...")
+LIST_ITEM (U"\\bu ##Configuration: Draw as squares...")
+ENTRY (U"How to modify a Configuration")
+LIST_ITEM (U"\\bu @@Configuration: Randomize")
+LIST_ITEM (U"\\bu @@Configuration: Rotate (pc)@ (to principal directions)")
+LIST_ITEM (U"\\bu @@Configuration: Rotate...@ (in a plane around the origin)")
+LIST_ITEM (U"\\bu @@Configuration: Invert dimension...")
+LIST_ITEM (U"\\bu @@Configuration: Normalize...")
+ENTRY (U"Inside a Configuration")
+NORMAL (U"With @Inspect you will see the following attributes:")
+TAG (U"%numberOfRows")
+DEFINITION (U"the number of points (%numberOfPoints\\>_1).")
+TAG (U"%numberOfColumns")
+DEFINITION (U"the dimension of the space (%numberOfDimensions\\>_1).")
+TAG (U"%rowLabels")
+DEFINITION (U"the names associated with the points.")
+TAG (U"%columnLabels")
+DEFINITION (U"the names for the dimensions.")
+TAG (U"%data [1..%numberOfPoints][1..%numberOfDimensions]")
+DEFINITION (U"the coordinates of the points.")
+TAG (U"%metric")
+DEFINITION (U"determines the way distances between points are measured. In general "
 	"the distance between points #x__%i_ and #x__%j_ is:")
-FORMULA (L"%d__%ij_ = "
+FORMULA (U"%d__%ij_ = "
 	"(\\su__%k=1..%numberOfDimensions_ %w__%k_ |%x__%ik_ \\-- "
 	"%x__%jk_|^^%metric^)^^1/%metric^")
-DEFINITION (L"For Euclidean distances %metric is 2.")
-TAG (L"%w [1..%numberOfDimensions]")
-DEFINITION (L"weight given to each dimension in the distance calculation.")
-MAN_END
-
-MAN_BEGIN (L"Configuration: Centralize", L"djmw", 19980413)
-INTRO (L"Makes the centre of the selected @Configuration equal to the origin.")
-NORMAL (L"")
-MAN_END
-
-MAN_BEGIN (L"Configuration: Draw...", L"djmw", 20040407)
-INTRO (L"Draws a projection of the selected @Configuration on a coordinate plane.")
-ENTRY (L"Settings")
-TAG (L"##X-coordinate#, ##Y-coordinate#")
-DEFINITION (L"control the dimensions that will show in the plot.")
-TAG (L"##xmin#, ##xmax#; ##ymin#, ##ymax#")
-DEFINITION (L"range for horizontal and vertical axes, respectively.")
-TAG (L"##Garnish")
-DEFINITION (L"when on, draws a bounding box with decoration.")
-MAN_END
-
-MAN_BEGIN (L"Configuration: Invert dimension...", L"djmw", 20040407)
-INTRO (L"Inverts one dimension of a @Configuration.")
-NORMAL (L"Setting")
-TAG (L"##Dimension")
-DEFINITION (L"the dimensions that has to be inverted.")
-ENTRY (L"Behaviour")
-NORMAL (L"For all points %i=1..%numberOfPoints: if %j == %dimension then %x__%ij_ "
+DEFINITION (U"For Euclidean distances %metric is 2.")
+TAG (U"%w [1..%numberOfDimensions]")
+DEFINITION (U"weight given to each dimension in the distance calculation.")
+MAN_END
+
+MAN_BEGIN (U"Configuration: Centralize", U"djmw", 19980413)
+INTRO (U"Makes the centre of the selected @Configuration equal to the origin.")
+NORMAL (U"")
+MAN_END
+
+MAN_BEGIN (U"Configuration: Draw...", U"djmw", 20040407)
+INTRO (U"Draws a projection of the selected @Configuration on a coordinate plane.")
+ENTRY (U"Settings")
+TAG (U"##X-coordinate#, ##Y-coordinate#")
+DEFINITION (U"control the dimensions that will show in the plot.")
+TAG (U"##xmin#, ##xmax#; ##ymin#, ##ymax#")
+DEFINITION (U"range for horizontal and vertical axes, respectively.")
+TAG (U"##Garnish")
+DEFINITION (U"when on, draws a bounding box with decoration.")
+MAN_END
+
+MAN_BEGIN (U"Configuration: Invert dimension...", U"djmw", 20040407)
+INTRO (U"Inverts one dimension of a @Configuration.")
+NORMAL (U"Setting")
+TAG (U"##Dimension")
+DEFINITION (U"the dimensions that has to be inverted.")
+ENTRY (U"Behaviour")
+NORMAL (U"For all points %i=1..%numberOfPoints: if %j == %dimension then %x__%ij_ "
 	"= \\--%x__%ij_.")
 MAN_END
 
-MAN_BEGIN (L"Configuration: Normalize...", L"djmw", 20040407)
-INTRO (L"Normalizes the selected @Configuration.")
-ENTRY (L"Settings")
-TAG (L"##Sum of squares# (standard value: 0.0)")
-DEFINITION (L"The desired value for the variance.")
-TAG (L"##Each dimension separately")
-DEFINITION (L"When on, the sum of squares in each dimension (column) will be scaled to %sumOfSquares "
+MAN_BEGIN (U"Configuration: Normalize...", U"djmw", 20040407)
+INTRO (U"Normalizes the selected @Configuration.")
+ENTRY (U"Settings")
+TAG (U"##Sum of squares# (standard value: 0.0)")
+DEFINITION (U"The desired value for the variance.")
+TAG (U"##Each dimension separately")
+DEFINITION (U"When on, the sum of squares in each dimension (column) will be scaled to %sumOfSquares "
 	"When off, the sum of squares of all the matrix elements will equal %sumOfSquares.")
-NORMAL (L"With the default value (0.0) for %sumOfSquares, and %eachDimensionSeparately chosen, "
+NORMAL (U"With the default value (0.0) for %sumOfSquares, and %eachDimensionSeparately chosen, "
 	"an INDSCAL-like normalization is applied: the sum of squares for each column is scaled to "
 	"equal 1.0. When %eachDimensionSeparately is off, a Kruskal-like normalization is applied: "
 	"the sum of squares of the whole matrix is scaled equal to %numberOfRows.")
-ENTRY (L"Behaviour")
-NORMAL (L"Before the normalization will be applied, however, we first translate the centre of the "
+ENTRY (U"Behaviour")
+NORMAL (U"Before the normalization will be applied, however, we first translate the centre of the "
 	"configuration to the origin by subtracting the mean for each dimension. "
 	"The sum of squares than equals variance.")
 MAN_END
 
-MAN_BEGIN (L"Configuration: Randomize", L"djmw", 19971201)
-INTRO (L"Changes all coordinates of the points #%x__%i_ in the @Configuration according to:")
-LIST_ITEM (L"%x__%ij_ = randomUniform (-1, 1)")
+MAN_BEGIN (U"Configuration: Randomize", U"djmw", 19971201)
+INTRO (U"Changes all coordinates of the points #%x__%i_ in the @Configuration according to:")
+LIST_ITEM (U"%x__%ij_ = randomUniform (-1, 1)")
 MAN_END
 
-MAN_BEGIN (L"Configuration: Rotate...", L"djmw", 20100303)
-INTRO (L"Rotates the @Configuration in a plane around the origin.")
-NORMAL (L"Settings")
-TAG (L"##Dimension 1#, ##Dimension 2#")
-DEFINITION (L"the dimensions that span the plane. The order of dimension 1 and dimension 2 is not important: "
+MAN_BEGIN (U"Configuration: Rotate...", U"djmw", 20100303)
+INTRO (U"Rotates the @Configuration in a plane around the origin.")
+NORMAL (U"Settings")
+TAG (U"##Dimension 1#, ##Dimension 2#")
+DEFINITION (U"the dimensions that span the plane. The order of dimension 1 and dimension 2 is not important: "
 	"the lowest number always determines the first dimension.")
-TAG (L"##Angle")
-DEFINITION (L"the counter-clockwise rotation angle in degrees.")
+TAG (U"##Angle")
+DEFINITION (U"the counter-clockwise rotation angle in degrees.")
 MAN_END
 
-MAN_BEGIN (L"Configuration: Rotate (pc)", L"djmw", 19971201)
-INTRO (L"Rotates the @Configuration to principal directions. The principal directions "
+MAN_BEGIN (U"Configuration: Rotate (pc)", U"djmw", 19971201)
+INTRO (U"Rotates the @Configuration to principal directions. The principal directions "
 	"correspond to the principal components.")
 MAN_END
 
-MAN_BEGIN (L"Configuration: To Configuration (procrustes)", L"djmw", 19971219)
-INTRO (L"A command that transforms the second selected @Configuration object "
+MAN_BEGIN (U"Configuration: To Configuration (procrustes)", U"djmw", 19971219)
+INTRO (U"A command that transforms the second selected @Configuration object "
 	"to match the first selected Configuration object as closely as possible."
 	"This problem of fitting one configuration (testee) to another (target) "
 	"as closely as possible is called the Procrustes problem. We use a "
 	"special @@Procrustes transform@ algorithm that does not "
 	"mutilate or distort the testee configuration.")
-NORMAL (L"Both Configuration objects must have the same dimensions.")
+NORMAL (U"Both Configuration objects must have the same dimensions.")
 MAN_END
 
-MAN_BEGIN (L"Configuration: To Configuration (varimax)...", L"djmw", 20040407)
-INTRO (L"A command that rotates the selected @Configuration object to a new "
+MAN_BEGIN (U"Configuration: To Configuration (varimax)...", U"djmw", 20040407)
+INTRO (U"A command that rotates the selected @Configuration object to a new "
 	"Configuration object whose coordinates have maximum %squared variance. ")
-ENTRY (L"Settings")
-TAG (L"##Normalize rows")
-DEFINITION (L"when selected, the distances of all points to the origin will "
+ENTRY (U"Settings")
+TAG (U"##Normalize rows")
+DEFINITION (U"when selected, the distances of all points to the origin will "
 	"be made equal before iteration starts. We remember these scale factors "
 	"and restore the original distances after the iteration process has "
 	"stopped.")
-TAG (L"##Quartimax")
-DEFINITION (L"when selected, the sum of fourth powers, normalized or raw, "
+TAG (U"##Quartimax")
+DEFINITION (U"when selected, the sum of fourth powers, normalized or raw, "
 	"will be maximized. ")
-TAG (L"##Maximum number of iterations")
-DEFINITION (L"sets a limit to the number of iterations. One iteration consists "
+TAG (U"##Maximum number of iterations")
+DEFINITION (U"sets a limit to the number of iterations. One iteration consists "
 	"of %numberOfDimensions\\.c (%numberOfDimensions\\--1)/2 planar rotations "
 	"of all pairs of dimensions.")
-TAG (L"##Tolerance")
-DEFINITION (L"also determines when the iteration stops. This happens if "
+TAG (U"##Tolerance")
+DEFINITION (U"also determines when the iteration stops. This happens if "
 	"|%v__%i_\\--%v__%i+1_| < %tolerance \\.c %v__%i_, where %v__%i_ is the "
 	"squared variance for the %i^^th^ iteration.")
-NORMAL (L"The iteration process stops when either the %%maximum number of "
+NORMAL (U"The iteration process stops when either the %%maximum number of "
 	"iterations% is reached or the %tolerance criterion is met, which ever "
 	"one is first.")
-ENTRY (L"Algorithm")
-NORMAL (L"The Varimax rotation procedure was first proposed by @@Kaiser "
+ENTRY (U"Algorithm")
+NORMAL (U"The Varimax rotation procedure was first proposed by @@Kaiser "
 	"(1958)@. Given a %numberOfPoints \\xx %numberOfDimensions configuration "
 	"#A, the procedure tries to find an orthonormal rotation matrix #T such "
 	"that the sum of variances of the columns of #B*#B is a maximum, where #B "
@@ -295,132 +295,132 @@ NORMAL (L"The Varimax rotation procedure was first proposed by @@Kaiser "
 	"%numberOfDimensions equals two. Kaiser suggested an iterative "
 	"algorithm based on planar rotations, i.e., alternate rotations of all "
 	"pairs of columns of #A.")
-NORMAL (L"However, this procedure is not without problems: the varimax function "
+NORMAL (U"However, this procedure is not without problems: the varimax function "
 	"may have stationary points that are not even local maxima. We have "
 	"incorporated an algorithm of @@Ten Berge (1995)@ "
 	"that prevents this unpleasant situation from happening.")
 MAN_END
 
-MAN_BEGIN (L"Configuration: To Distance", L"djmw", 19971207)
-INTRO (L"A command that computes a @Distance object for each selected "
+MAN_BEGIN (U"Configuration: To Distance", U"djmw", 19971207)
+INTRO (U"A command that computes a @Distance object for each selected "
 	"@Configuration.")
-ENTRY (L"Algorithm")
-NORMAL (L"The distance %d__%ij_ between objects %i and %j is calculated as:")
-FORMULA (L"%d__%ij_ = %d__%ji_ = (\\su__%k=1..%numberOfDimensions_ |%x__%ik_ "
+ENTRY (U"Algorithm")
+NORMAL (U"The distance %d__%ij_ between objects %i and %j is calculated as:")
+FORMULA (U"%d__%ij_ = %d__%ji_ = (\\su__%k=1..%numberOfDimensions_ |%x__%ik_ "
 	"\\-- %x__%jk_|^2)^^1/2^")
 MAN_END
 
-MAN_BEGIN (L"Configuration: To Similarity (cc)", L"djmw", 19980130)
-INTRO (L"A command that create one @Similarity object from the selected "
+MAN_BEGIN (U"Configuration: To Similarity (cc)", U"djmw", 19980130)
+INTRO (U"A command that create one @Similarity object from the selected "
 	"@Configuration objects.")
-NORMAL (L"In the Similarity object entry %s__%ij_ equals the @@congruence "
+NORMAL (U"In the Similarity object entry %s__%ij_ equals the @@congruence "
 	"coefficient@ for the %i-th and %j-th selected Configuration object.")
-NORMAL (L"All Configuration objects must have the same number of points and "
+NORMAL (U"All Configuration objects must have the same number of points and "
 	"the same dimensions.")
 MAN_END
 
-MAN_BEGIN (L"Configuration & AffineTransform: To Configuration", L"djmw", 20011008)
-INTRO (L"A command that transforms the selected @Configuration to a new "
+MAN_BEGIN (U"Configuration & AffineTransform: To Configuration", U"djmw", 20011008)
+INTRO (U"A command that transforms the selected @Configuration to a new "
 	"Configuration object according to the specifications in the selected "
 	"@AffineTransform object.")
 MAN_END
 
-MAN_BEGIN (L"Configuration & Procrustes: To Configuration", L"djmw", 20011008)
-INTRO (L"A command that transforms the selected @Configuration to a new "
+MAN_BEGIN (U"Configuration & Procrustes: To Configuration", U"djmw", 20011008)
+INTRO (U"A command that transforms the selected @Configuration to a new "
 	"Configuration object according to the specifications in the selected "
 	"@Procrustes object.")
 MAN_END
 
-MAN_BEGIN (L"Configurations: To AffineTransform (congruence)...", L"djmw", 20040407)
-INTRO (L"A command that creates an @AffineTransform object from two selected "
+MAN_BEGIN (U"Configurations: To AffineTransform (congruence)...", U"djmw", 20040407)
+INTRO (U"A command that creates an @AffineTransform object from two selected "
 	"@Configuration objects.")
-NORMAL (L"We calculate the affine transform that transforms the second "
+NORMAL (U"We calculate the affine transform that transforms the second "
 	"selected Configuration object to match the first selected Configuration "
 	"object as closely as possible. "
 	"The degree of proportionality is the congruence between corresponding "
 	"dimensions.")
-ENTRY (L"Settings")
-TAG (L"##Maximum number of iterations")
-DEFINITION (L"sets a limit to the number of iterations.")
-TAG (L"##Tolerance")
-DEFINITION (L"also determines when the iteration stops. This happens if "
+ENTRY (U"Settings")
+TAG (U"##Maximum number of iterations")
+DEFINITION (U"sets a limit to the number of iterations.")
+TAG (U"##Tolerance")
+DEFINITION (U"also determines when the iteration stops. This happens if "
 	"|%f(#T__%i_)\\--%f(#T__%i+1_)| < %tolerance \\.c %f(#T__%i_), where "
 	"%f(#T__%i_) is the sum of the congruences for the %i^^th^ "
 	"iteration (see below).")
-NORMAL (L"The iteration process stops when either the %%maximum number of "
+NORMAL (U"The iteration process stops when either the %%maximum number of "
 	"iterations% is reached or the %tolerance criterion is met, which ever "
 	"one is first.")
-ENTRY (L"Algorithm")
-NORMAL (L"Sometimes the criterion used in a @@Procrustes transform@ is too "
+ENTRY (U"Algorithm")
+NORMAL (U"Sometimes the criterion used in a @@Procrustes transform@ is too "
 	"restrictive for comparing two configurations. This criterion is only "
 	"zero when the positions in the rotated configuration (#A#T) equal the "
 	"positions in the other configuration (#B). @@Brokken (1983)@ proposed an "
 	"algorithm to maximize instead the sum of congruences between "
 	"corresponding dimensions of #AT and #B. "
 	"Specifically he proposed to maximize")
-FORMULA (L"%f(#T) = \\su__%i=1..%numberOfDimensions_ #t\\'p__%i_#A\\'p#b__%i_ /"
+FORMULA (U"%f(#T) = \\su__%i=1..%numberOfDimensions_ #t\\'p__%i_#A\\'p#b__%i_ /"
 	" ((#t\\'p__%i_#A\\'p#A#t__%i_)^^1/2^(#b\\'p__%i_#b__%i_)^^1/2^),")
-NORMAL (L"where #t\\'p__%i_ and #b\\'p__%i_ are the %i^^th^ column of #T and "
-	"#B, respectively.  A direct solution for #T is not available, it can only "
+NORMAL (U"where #t\\'p__%i_ and #b\\'p__%i_ are the %i^^th^ column of #T and "
+	"#B, respectively. A direct solution for #T is not available, it can only "
 	"be obtained by an iterative procedure. The implemented algorithm is from "
 	"@@Kiers & Groenen (1996)@ and shows excellent convergence properties.")
 MAN_END
 
-MAN_BEGIN (L"Configuration & Configuration: To Procrustes...", L"djmw", 20011008)
-INTRO (L"A command that creates a @Procrustes object from two selected "
+MAN_BEGIN (U"Configuration & Configuration: To Procrustes...", U"djmw", 20011008)
+INTRO (U"A command that creates a @Procrustes object from two selected "
 	"@Configuration objects.")
-ENTRY (L"Setting")
-TAG (L"##Orthogonal transform")
-DEFINITION (L"determines whether or not a translation and a scaling are allowed in the transform.")
-NORMAL (L"We calculate the @@Procrustes transform@ that transforms the second "
+ENTRY (U"Setting")
+TAG (U"##Orthogonal transform")
+DEFINITION (U"determines whether or not a translation and a scaling are allowed in the transform.")
+NORMAL (U"We calculate the @@Procrustes transform@ that transforms the second "
 	"selected Configuration object to match the first selected Configuration "
 	"object as closely as possible.")
 MAN_END
 
-MAN_BEGIN (L"Confusion: To Dissimilarity...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Dissimilarity from every selected "
+MAN_BEGIN (U"Confusion: To Dissimilarity...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Dissimilarity from every selected "
 	"@Confusion.")
-ENTRY (L"Settings")
-TAG (L"##Normalize")
-DEFINITION (L"when on, normalize rows by dividing each row element by the row "
+ENTRY (U"Settings")
+TAG (U"##Normalize")
+DEFINITION (U"when on, normalize rows by dividing each row element by the row "
 	"sum. In this way you correct for unequal stimulus numbers.")
-TAG (L"##No symmetrization#, #Average, #Houtgast")
-DEFINITION (L"determine the symmetrization procedure. See "
+TAG (U"##No symmetrization#, #Average, #Houtgast")
+DEFINITION (U"determine the symmetrization procedure. See "
 	"@@Confusion: To Similarity...")
-TAG (L"##Maximum dissimilarity")
-DEFINITION (L"determines the maximum dissimilarity possible. When the default "
+TAG (U"##Maximum dissimilarity")
+DEFINITION (U"determines the maximum dissimilarity possible. When the default "
 	"value, 0.0, is chosen, %maximumDissimilarity "
 	"is calculated as the maximum element in the Similarity object.")
-ENTRY (L"Algorithm")
-NORMAL (L"We first transform the Confusion to a Similarity. See "
+ENTRY (U"Algorithm")
+NORMAL (U"We first transform the Confusion to a Similarity. See "
 	"@@Confusion: To Similarity...")
-NORMAL (L"To obtain dissimilarities from similarities we \"reverse\" the "
+NORMAL (U"To obtain dissimilarities from similarities we \"reverse\" the "
 	"latter:")
-FORMULA (L"%%dissimilarity__%ij_ = %maximumDissimilarity \\-- %similarity__%ij_")
+FORMULA (U"%%dissimilarity__%ij_ = %maximumDissimilarity \\-- %similarity__%ij_")
 MAN_END
 
-MAN_BEGIN (L"Confusion: To Dissimilarity (pdf)...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Dissimilarity from every selected "
+MAN_BEGIN (U"Confusion: To Dissimilarity (pdf)...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Dissimilarity from every selected "
 	"@Confusion.")
-ENTRY (L"Settings")
-TAG (L"##Symmetrize first")
-DEFINITION (L"when on, the confusion matrix is symmetrized before we calculate "
+ENTRY (U"Settings")
+TAG (U"##Symmetrize first")
+DEFINITION (U"when on, the confusion matrix is symmetrized before we calculate "
 	"dissimilarities.")
-TAG (L"##Maximum dissimilarity (units of sigma)")
-DEFINITION (L"specifies the dissimilarity from confusion matrix elements that "
+TAG (U"##Maximum dissimilarity (units of sigma)")
+DEFINITION (U"specifies the dissimilarity from confusion matrix elements that "
 	"are zero.")
-ENTRY (L"Algorithm")
-TAG (L"1. Normalize rows by dividing each row element by the row sum (optional).")
-TAG (L"2. Symmetrize the matrix by averaging %f__%ij_ and %f__%ji_.")
-TAG (L"3. Transformation of the confusion measure which is a sort of "
+ENTRY (U"Algorithm")
+TAG (U"1. Normalize rows by dividing each row element by the row sum (optional).")
+TAG (U"2. Symmetrize the matrix by averaging %f__%ij_ and %f__%ji_.")
+TAG (U"3. Transformation of the confusion measure which is a sort of "
 	"%similarity measure to the %dissimilarity measure.")
-NORMAL (L"Similarity and dissimilarity have an inverse relationship: the "
+NORMAL (U"Similarity and dissimilarity have an inverse relationship: the "
 	"greater the similarity, the smaller the dissimilarity and vice versa. "
 	"Both have a monotonic relationship with distance. "
 	"The most simple way to transform the similarities %f__%ij_ into "
 	"dissimilarities is:")
-FORMULA (L"%dissimilarity__%ij_ = %maximumSimilarity \\-- %similarity__%ij_")
-NORMAL (L"For ordinal analyses like Kruskal this transformation is fine because "
+FORMULA (U"%dissimilarity__%ij_ = %maximumSimilarity \\-- %similarity__%ij_")
+NORMAL (U"For ordinal analyses like Kruskal this transformation is fine because "
 	"only order relations are important in this analysis. However, for "
 	"metrical analyses like INDSCAL this is not optimal. "
 	"In INDSCAL, distance is a linear function of dissimilarity. This means "
@@ -428,7 +428,7 @@ NORMAL (L"For ordinal analyses like Kruskal this transformation is fine because
 	"above, you ultimately fit an INDSCAL model in which the distance "
 	"between object %i and %j will be linearly related to the confusion "
 	"between %i and %j.")
-NORMAL (L"For the relation between confusion and dissimilarity, the model "
+NORMAL (U"For the relation between confusion and dissimilarity, the model "
 	"implemented here, makes the assumption that the amount of confusion "
 	"between objects %i and %j is related to the amount that their "
 	"probability density functions, pdf's, overlap. Because we do not know "
@@ -437,52 +437,52 @@ NORMAL (L"For the relation between confusion and dissimilarity, the model "
 	"distance between the centres of both pdf's. "
 	"According to formula 26.2.23 in @@Abramowitz & Stegun (1970)@, for each "
 	"fraction %f__%ij_, we have to find an %x that solves:")
-FORMULA (L"%f__%ij_ = 1 / \\Vr(2%\\pi) \\in__%x_^^\\oo^ e^^-%t\\.c%t/2^ %dt")
-NORMAL (L"This %x will be used as the dissimilarity between %i and %j. The "
+FORMULA (U"%f__%ij_ = 1 / \\Vr(2%\\pi) \\in__%x_^^\\oo^ e^^-%t\\.c%t/2^ %dt")
+NORMAL (U"This %x will be used as the dissimilarity between %i and %j. The "
 	"relation between %x and %f__%ij_ is monotonic. This means that the "
 	"results for a Kruskal analysis will not change much. For INDSCAL, in "
 	"general, you will note a significantly better fit.")
 MAN_END
 
-MAN_BEGIN (L"Confusion: To Similarity...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Similarity from every selected @Confusion.")
-ENTRY (L"Settings")
-TAG (L"##Normalize")
-DEFINITION (L"when on, normalize rows by dividing each row element by the row "
+MAN_BEGIN (U"Confusion: To Similarity...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Similarity from every selected @Confusion.")
+ENTRY (U"Settings")
+TAG (U"##Normalize")
+DEFINITION (U"when on, normalize rows by dividing each row element by the row "
 	"sum. In this way you correct for unequal stimulus numbers.")
-TAG (L"##No symmetrization#, #Average, #Houtgast")
-DEFINITION (L"determine the symmetrization procedure.")
-ENTRY (L"Algorithm")
-NORMAL (L"The %Average procedure averages:")
-FORMULA (L"%similarity__%ij_= %similarity__%ji_ = (%confusion__%ij_ + "
+TAG (U"##No symmetrization#, #Average, #Houtgast")
+DEFINITION (U"determine the symmetrization procedure.")
+ENTRY (U"Algorithm")
+NORMAL (U"The %Average procedure averages:")
+FORMULA (U"%similarity__%ij_= %similarity__%ji_ = (%confusion__%ij_ + "
 	"%confusion__%ji_) / 2")
-NORMAL (L"The %Houtgast procedure as described in the paper by @@Klein, Plomp "
+NORMAL (U"The %Houtgast procedure as described in the paper by @@Klein, Plomp "
 	"& Pols (1970)@, expresses similarity between stimuli %i and %j by the "
 	"number of times that stimulus %i and %j have "
 	"resulted in the same response, summated over all response categories.")
-NORMAL (L"We use the following formula to calculate the %Houtgast "
+NORMAL (U"We use the following formula to calculate the %Houtgast "
 	"dissimilarities:")
-FORMULA (L"%similarity__%ij_ = \\su__%k=1..%numberOfColumns_ min "
+FORMULA (U"%similarity__%ij_ = \\su__%k=1..%numberOfColumns_ min "
 	"(%confusion__%ik_, %confusion__%jk_)")
-NORMAL (L"which is equivalent to the formula in the Klein et al. paper:")
-FORMULA (L"%similarity__%ij_ = \\su__%k=1..%numberOfColumns_ (%confusion__%ik_ "
+NORMAL (U"which is equivalent to the formula in the Klein et al. paper:")
+FORMULA (U"%similarity__%ij_ = \\su__%k=1..%numberOfColumns_ (%confusion__%ik_ "
 	"+ %confusion__%jk_ \\-- |%confusion__%ik_ \\-- %confusion__%jk_|)")
 MAN_END
 
-MAN_BEGIN (L"congruence coefficient", L"djmw", 20040407)
-INTRO (L"The %%congruence coefficient% is a measure of similarity between two "
+MAN_BEGIN (U"congruence coefficient", U"djmw", 20040407)
+INTRO (U"The %%congruence coefficient% is a measure of similarity between two "
 	"@@Configuration at s.")
-NORMAL (L"The congruence coefficient %c(#X, #Y) for the configurations #X and "
+NORMAL (U"The congruence coefficient %c(#X, #Y) for the configurations #X and "
 	"#Y is defined as:")
-FORMULA (L"%c(%X, %Y) = \\su__%i<%j_ %w__%ij_ %d__%ij_(#X) %d__%ij_(#Y) / "
+FORMULA (U"%c(%X, %Y) = \\su__%i<%j_ %w__%ij_ %d__%ij_(#X) %d__%ij_(#Y) / "
 	"([\\su__%i<%j_ %w__%ij_ %d^2__%ij_(#X)]^^1/2^ [\\su__%i<%j_ %w__%ij_ "
 	"%d^2__%ij_(#Y)]^^1/2^),")
-NORMAL (L"where %d__%ij_(#X) is the distance between the points %i and %j in "
+NORMAL (U"where %d__%ij_(#X) is the distance between the points %i and %j in "
 	"configuration #X and %w__%ij_ are nonnegative weights (default: %w__%ij_"
 	" = 1).")
-NORMAL (L"Since distances are nonnegative, the congruence coefficient has a "
+NORMAL (U"Since distances are nonnegative, the congruence coefficient has a "
 	"value between 0 and 1.")
-NORMAL (L"The %%congruence coefficient% is a better measure of the similarity "
+NORMAL (U"The %%congruence coefficient% is a better measure of the similarity "
 	"between configurations than the %%correlation coefficient% of the "
 	"distances. @@Borg & Groenen (1997)@ give a simple example where things "
 	"go wrong with correlation coefficients: two configurations #X and #Y with three points each, have "
@@ -498,76 +498,76 @@ NORMAL (L"The %%congruence coefficient% is a better measure of the similarity "
 	"In fact, the congruence coefficient is exactly this correlation "
 	"coefficient calculated with respect to the origin and "
 	"not with respect to the centroid position (the \"mean\").")
-NORMAL (L"For further information on how well one number can assess the "
+NORMAL (U"For further information on how well one number can assess the "
 	"similarity between two configurations see @@Borg & Groenen (1997)@ "
 	"section 19.7.")
 MAN_END
 
-MAN_BEGIN (L"ContingencyTable", L"djmw", 19971216)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"In a two-way contingency table, cell %f__%ij_ contains the frequency "
+MAN_BEGIN (U"ContingencyTable", U"djmw", 19971216)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"In a two-way contingency table, cell %f__%ij_ contains the frequency "
 	"with which row category %i co-occurs with column category %j. "
 	"Necessarily, all %f__%ij_ \\>_ 0.")
-ENTRY (L"Commands")
-NORMAL (L"Creation")
-LIST_ITEM (L"\\bu ##TableOfReal: To ##ContingencyTable")
-NORMAL (L"Query")
-LIST_ITEM (L"\\bu ##ContingencyTable: Get chi squared probability")
-LIST_ITEM (L"\\bu ##ContingencyTable: Get Cramer's statistic")
-LIST_ITEM (L"\\bu ##ContingencyTable: Get contingency coefficient")
-NORMAL (L"Analysis")
-LIST_ITEM (L"\\bu @@ContingencyTable: To Configuration (ca)...")
-MAN_END
-
-MAN_BEGIN (L"ContingencyTable: To Configuration (ca)...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Configuration object from the selected "
+ENTRY (U"Commands")
+NORMAL (U"Creation")
+LIST_ITEM (U"\\bu ##TableOfReal: To ##ContingencyTable")
+NORMAL (U"Query")
+LIST_ITEM (U"\\bu ##ContingencyTable: Get chi squared probability")
+LIST_ITEM (U"\\bu ##ContingencyTable: Get Cramer's statistic")
+LIST_ITEM (U"\\bu ##ContingencyTable: Get contingency coefficient")
+NORMAL (U"Analysis")
+LIST_ITEM (U"\\bu @@ContingencyTable: To Configuration (ca)...")
+MAN_END
+
+MAN_BEGIN (U"ContingencyTable: To Configuration (ca)...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Configuration object from the selected "
 	"@ContingencyTable object by means of @@Correspondence analysis at .")
-ENTRY (L"Settings")
-TAG (L"##Number of dimensions")
-DEFINITION (L"The dimensionality of the Configuration.")
-TAG (L"##Scaling of the final configuration")
-DEFINITION (L"determines whether row points are in the centre of gravity of "
+ENTRY (U"Settings")
+TAG (U"##Number of dimensions")
+DEFINITION (U"The dimensionality of the Configuration.")
+TAG (U"##Scaling of the final configuration")
+DEFINITION (U"determines whether row points are in the centre of gravity of "
 	"column points, or, column points are in the centre of gravity of row "
 	"points, or, whether roes and columns are treated symmetrically.")
-ENTRY (L"Algorithm")
-NORMAL (L"1. We start with the following transformation of the entries "
+ENTRY (U"Algorithm")
+NORMAL (U"1. We start with the following transformation of the entries "
 	"%f__%ij_:")
-FORMULA (L"%h__%ij_ = %f__%ij_ / \\Vr (%f__%i+_%f__+%j_) - \\Vr "
+FORMULA (U"%h__%ij_ = %f__%ij_ / \\Vr (%f__%i+_%f__+%j_) - \\Vr "
 	"(%f__%i+_%f__+%j_) / %N,")
-NORMAL (L"where %h__%ij_ is the entry for a cell in the matrix #H with "
+NORMAL (U"where %h__%ij_ is the entry for a cell in the matrix #H with "
 	"transformed data, %f__%i+_ "
 	"is the total count for row %i, %f__+%j_ is the total count for column %j "
 	"and %N is the grand total. "
 	"This can be written in matrix form as:")
-FORMULA (L"#H = #R^^\\--1/2^#F#C^^\\--1/2^ \\-- #R^^1/2^#uu\\'p#C^^1/2^ / %N,")
-NORMAL (L"where #R and #C are diagonal matrices with the row and column totals, "
+FORMULA (U"#H = #R^^\\--1/2^#F#C^^\\--1/2^ \\-- #R^^1/2^#uu\\'p#C^^1/2^ / %N,")
+NORMAL (U"where #R and #C are diagonal matrices with the row and column totals, "
 	"respectively and #u a column vector with all elements equal to 1. ")
-NORMAL (L"2. Next the singular value decomposition of matrix #H is performed:")
-FORMULA (L"#H = #K #\\La #L\\'p,")
-NORMAL (L"where #K\\'p#K = #I, #L\\'p#L = #I, and #\\La is a diagonal matrix "
+NORMAL (U"2. Next the singular value decomposition of matrix #H is performed:")
+FORMULA (U"#H = #K #\\La #L\\'p,")
+NORMAL (U"where #K\\'p#K = #I, #L\\'p#L = #I, and #\\La is a diagonal matrix "
 	"with singular values.")
-NORMAL (L"3. Now the row (#X) and column points (#Y) can be determined. "
+NORMAL (U"3. Now the row (#X) and column points (#Y) can be determined. "
 	"Three normalizations are possible:")
-TAG (L"\\bu Scale row points in the centre of gravity of column points")
-DEFINITION (L"#X = \\Vr%N #R^^\\--1/2^#K#\\La")
-DEFINITION (L"#Y = \\Vr%N #C^^\\--1/2^#L")
-TAG (L"\\bu Scale column points in the centre of gravity of row points")
-DEFINITION (L"#X = \\Vr%N #R^^\\--1/2^#K")
-DEFINITION (L"#Y = \\Vr%N #C^^\\--1/2^#L#\\La")
-TAG (L"\\bu Treat row points and column points symmetrically")
-DEFINITION (L"#X = \\Vr%N #R^^\\--1/2^#K#\\La^^\\--1/2^")
-DEFINITION (L"#Y = \\Vr%N #C^^\\--1/2^#L\\La^^\\--1/2^")
-NORMAL (L"For more details see @@Gifi (1990)@, chapter 8.")
-MAN_END
-
-MAN_BEGIN (L"Correspondence analysis", L"djmw", 19971216)
-INTRO (L"Correspondence analysis provides a method for representing data in "
+TAG (U"\\bu Scale row points in the centre of gravity of column points")
+DEFINITION (U"#X = \\Vr%N #R^^\\--1/2^#K#\\La")
+DEFINITION (U"#Y = \\Vr%N #C^^\\--1/2^#U")
+TAG (U"\\bu Scale column points in the centre of gravity of row points")
+DEFINITION (U"#X = \\Vr%N #R^^\\--1/2^#K")
+DEFINITION (U"#Y = \\Vr%N #C^^\\--1/2^#L#\\La")
+TAG (U"\\bu Treat row points and column points symmetrically")
+DEFINITION (U"#X = \\Vr%N #R^^\\--1/2^#K#\\La^^\\--1/2^")
+DEFINITION (U"#Y = \\Vr%N #C^^\\--1/2^#L\\La^^\\--1/2^")
+NORMAL (U"For more details see @@Gifi (1990)@, chapter 8.")
+MAN_END
+
+MAN_BEGIN (U"Correspondence analysis", U"djmw", 19971216)
+INTRO (U"Correspondence analysis provides a method for representing data in "
 	"an Euclidean space so that the results can be visually examined for "
 	"structure. For data in a typical two-way @ContingencyTable both the row "
 	"variables and the column variables are represented in the same space. "
 	"This means that one can examine relations not only among row "
 	"or column variables but also between row and column variables.")
-NORMAL (L"In correspondence analysis the data matrix is first transformed by "
+NORMAL (U"In correspondence analysis the data matrix is first transformed by "
 	"dividing each cell by the square root of the corresponding row and column "
 	"totals. "
 	"The transformed matrix is then decomposed with singular value "
@@ -577,224 +577,224 @@ NORMAL (L"In correspondence analysis the data matrix is first transformed by "
 	"frequencies to obtain optimal scores. "
 	"These optimal scores are weighted by the square root of the singular "
 	"values and become the coordinates of the points in the @Configuration.")
-NORMAL (L"Examples can be found in the books by @@Weller & Romney (1990)@ and "
+NORMAL (U"Examples can be found in the books by @@Weller & Romney (1990)@ and "
 	"@@Gifi (1990)@.")
 MAN_END
 
-MAN_BEGIN (L"Create Configuration...", L"djmw", 19980413)
-INTRO (L"A command to create a @Configuration with the specified number of "
+MAN_BEGIN (U"Create Configuration...", U"djmw", 19980413)
+INTRO (U"A command to create a @Configuration with the specified number of "
 	"points and number of dimensions. The location of the points will be "
 	"determined by the formula (see @@Formulas@ for more "
 	"information about possible formulas).")
 MAN_END
 
-MAN_BEGIN (L"Create INDSCAL Carroll & Wish example...", L"djmw", 19971201)
-INTRO (L"Creates eight @Dissimilarity objects that bear names \"1\" ... \"8\".")
-NORMAL (L"These objects contain the interpoint distances for a twodimensional "
+MAN_BEGIN (U"Create INDSCAL Carroll & Wish example...", U"djmw", 19971201)
+INTRO (U"Creates eight @Dissimilarity objects that bear names \"1\" ... \"8\".")
+NORMAL (U"These objects contain the interpoint distances for a twodimensional "
 	"3\\xx3 @Configuration of points, labelled A, B, C, ... I. "
 	"All Dissimilarity objects are based on the following underlying configuration.")
 PICTURE (4.0, 4.0, drawCarrollWishConfigurationExample)
-NORMAL (L"The eight sources weigh this configuration in the following manner:")
+NORMAL (U"The eight sources weigh this configuration in the following manner:")
 PICTURE (4.0, 4.0, drawCarrollWishSalienceExample)
-NORMAL (L"For each source, the distances were subjected to the transformation: ")
-FORMULA (L"%dissimilarity__%ij_ = %distance__%ij_ + %noiseRange \\.c #u, ")
-NORMAL (L"where #u is a uniform random variable between 0 and 1.")
-NORMAL (L"Now you can do the following for example:")
-TAG (L"Select all the Dissimilarity objects and choose @@Dissimilarity: To Distance...|"
+NORMAL (U"For each source, the distances were subjected to the transformation: ")
+FORMULA (U"%dissimilarity__%ij_ = %distance__%ij_ + %noiseRange \\.c #u, ")
+NORMAL (U"where #u is a uniform random variable between 0 and 1.")
+NORMAL (U"Now you can do the following for example:")
+TAG (U"Select all the Dissimilarity objects and choose @@Dissimilarity: To Distance...|"
 	"To Distance... at .")
-DEFINITION (L"Uncheck scale (add \"additive constant\").")
-TAG (L"Select all the Distance objects and choose @@Distance: To Configuration (indscal)...|"
+DEFINITION (U"Uncheck scale (add \"additive constant\").")
+TAG (U"Select all the Distance objects and choose @@Distance: To Configuration (indscal)...|"
 	"To Configuration (indscal)... at .")
-DEFINITION (L"and an @@INDSCAL analysis@ will be performed. In order to reproduce the saliences, "
+DEFINITION (U"and an @@INDSCAL analysis@ will be performed. In order to reproduce the saliences, "
 	"you have to uncheck the \"Normalize scalar products\" option.")
-NORMAL (L"This example was adapted from @@Carroll & Wish (1974)@.")
+NORMAL (U"This example was adapted from @@Carroll & Wish (1974)@.")
 MAN_END
 
-MAN_BEGIN (L"Create letter R example...", L"djmw", 19971201)
-INTRO (L"Creates a @Dissimilarity object that bears the name %R. The "
+MAN_BEGIN (U"Create letter R example...", U"djmw", 19971201)
+INTRO (U"Creates a @Dissimilarity object that bears the name %R. The "
 	"dissimilarities in this object were chosen to be a monotone "
 	"transformation of the distances between the 32 two-dimensional points "
 	"that make up the capital letter #R.")
 PICTURE (4.0, 4.0, drawLetterRConfigurationExample)
-NORMAL (L"All 32 \\.c (32-1)/2 interpoint distances  were subjected to the "
+NORMAL (U"All 32 \\.c (32-1)/2 interpoint distances were subjected to the "
 	"transformation: ")
-FORMULA (L"%dissimilarity__%ij_^ = %distance__%ij_^2 + 5 + %noiseRange \\.c #u, ")
-NORMAL (L"where #u is a uniform random variable between 0 and 1.")
-NORMAL (L"This example was chosen from @@Green, Carmone & Smith (1989)@.")
+FORMULA (U"%dissimilarity__%ij_^ = %distance__%ij_^2 + 5 + %noiseRange \\.c #u, ")
+NORMAL (U"where #u is a uniform random variable between 0 and 1.")
+NORMAL (U"This example was chosen from @@Green, Carmone & Smith (1989)@.")
 MAN_END
 
-MAN_BEGIN (L"disparities", L"djmw", 19980111)
-INTRO (L"The numbers %d\\'p__%ij_ that result from applying an admissible "
+MAN_BEGIN (U"disparities", U"djmw", 19980111)
+INTRO (U"The numbers %d\\'p__%ij_ that result from applying an admissible "
 	"transformation %f on the dissimilarities %\\de__%ij_, i.e., %d\\'p__%ij_ "
 	"= %f (%\\de__%ij_). Disparities have the same dimension as distances. "
 	"Other names for disparities are %%pseudo distances% and %%target "
 	"distances%.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity", L"djmw", 20010327)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"It represents a one-way table with "
+MAN_BEGIN (U"Dissimilarity", U"djmw", 20010327)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"It represents a one-way table with "
 	"dissimilarities between \"objects\".")
-ENTRY (L"Creating a Dissimilarity from data in a text file")
-NORMAL (L"Suppose you have three objects A, B and C. "
+ENTRY (U"Creating a Dissimilarity from data in a text file")
+NORMAL (U"Suppose you have three objects A, B and C. "
 	"In one way or another, you have acquired the following (symmetric) "
 	"dissimilarities: %\\de__%AB_ = 2 (= %\\de__%BA_) , %\\de__%AC_ = 1 "
 	"(= %\\de__%CA_), and %\\de__%BC_ = 1.4 (= %\\de__CB_), where %\\de__%AB_"
 	" represents the dissimilarity between object A and object B.")
-NORMAL (L"You can create a simple text file like the following:")
-CODE (L"\"ooTextFile\"  ! The line by which Praat can recognize your file")
-CODE (L"\"Dissimilarity\" ! The line that tells Praat about the contents")
-CODE (L"3     \"A\"  \"B\"  \"C\"   ! Number of columns, and column labels")
-CODE (L"3                     ! Number of rows")
-CODE (L"\"A\"    0    2    1    ! Row label (A), A-B value, A-C value")
-CODE (L"\"B\"    2    0  1.4    ! Row label (B), B-A value, B-C value")
-CODE (L"\"C\"    1    1.4  0    ! Row label (C), C-A value, C-B value")
-NORMAL (L"Notice that:")
-LIST_ITEM (L"\\bu the row and column labels are identical.")
-LIST_ITEM (L"\\bu the matrix elements on the diagonal are zero.")
-LIST_ITEM (L"\\bu the matrix is symmetrical.")
-NORMAL (L"This text file can be read with the @@Read from file...@ command. "
+NORMAL (U"You can create a simple text file like the following:")
+CODE (U"\"ooTextFile\"  ! The line by which Praat can recognize your file")
+CODE (U"\"Dissimilarity\" ! The line that tells Praat about the contents")
+CODE (U"3     \"A\"  \"B\"  \"C\"   ! Number of columns, and column labels")
+CODE (U"3                     ! Number of rows")
+CODE (U"\"A\"    0    2    1    ! Row label (A), A-B value, A-C value")
+CODE (U"\"B\"    2    0  1.4    ! Row label (B), B-A value, B-C value")
+CODE (U"\"C\"    1    1.4  0    ! Row label (C), C-A value, C-B value")
+NORMAL (U"Notice that:")
+LIST_ITEM (U"\\bu the row and column labels are identical.")
+LIST_ITEM (U"\\bu the matrix elements on the diagonal are zero.")
+LIST_ITEM (U"\\bu the matrix is symmetrical.")
+NORMAL (U"This text file can be read with the @@Read from file...@ command. "
 	"Since a Dissimilarity object has the data structure of a square "
 	"symmetrical TableOfReal, you could also start from an appropriate "
 	"@TableOfReal object and cast it to a Dissimilarity object.")
-ENTRY (L"Commands")
-NORMAL (L"Creation")
-LIST_ITEM (L"\\bu @@Confusion: To Dissimilarity...")
-NORMAL (L"Drawing")
-LIST_ITEM (L"\\bu ##Draw as numbers...")
-LIST_ITEM (L"\\bu ##Draw as squares...")
-NORMAL (L"Query")
-LIST_ITEM (L"\\bu ##Get column mean (index)...")
-LIST_ITEM (L"\\bu ##Get column mean (label)...")
-LIST_ITEM (L"\\bu ##Get column stdev (index)...")
-LIST_ITEM (L"\\bu ##Get column stdev (label)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: Get additive constant")
-NORMAL (L"Modification")
-LIST_ITEM (L"\\bu @@Formula...")
-LIST_ITEM (L"\\bu ##Set value...")
-LIST_ITEM (L"\\bu ##Remove column (index)...")
-LIST_ITEM (L"\\bu ##Insert column (index)...")
-LIST_ITEM (L"\\bu ##Set row label (index)...")
-LIST_ITEM (L"\\bu ##Set row label (label)...")
-LIST_ITEM (L"\\bu ##Set column label (index)...")
-LIST_ITEM (L"\\bu ##Set column label (label)...")
-NORMAL (L"Multidimensional scaling analysis")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (monotone mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (i-spline mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (interval mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (ratio mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (absolute mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (kruskal)...")
-LIST_ITEM (L"Transformations")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Distance...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Weight")
-MAN_END
-
-MAN_BEGIN (L"Dissimilarity: Get additive constant", L"djmw", 19971201)
-INTRO (L"A command that calculates the \"additive constant\" from the selected @Dissimilarity.")
-NORMAL (L"Distances %d__%ij_ will be obtained from dissimilarities %\\de__%ij_ according to:")
-FORMULA (L" %distance__%ij_ = %dissimilarity__%ij_ + %additiveConstant")
-NORMAL (L"We use a procedure by @@Cailliez (1983)@ to solve the \"additive constant problem\", i.e. "
+ENTRY (U"Commands")
+NORMAL (U"Creation")
+LIST_ITEM (U"\\bu @@Confusion: To Dissimilarity...")
+NORMAL (U"Drawing")
+LIST_ITEM (U"\\bu ##Draw as numbers...")
+LIST_ITEM (U"\\bu ##Draw as squares...")
+NORMAL (U"Query")
+LIST_ITEM (U"\\bu ##Get column mean (index)...")
+LIST_ITEM (U"\\bu ##Get column mean (label)...")
+LIST_ITEM (U"\\bu ##Get column stdev (index)...")
+LIST_ITEM (U"\\bu ##Get column stdev (label)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: Get additive constant")
+NORMAL (U"Modification")
+LIST_ITEM (U"\\bu @@Formula...")
+LIST_ITEM (U"\\bu ##Set value...")
+LIST_ITEM (U"\\bu ##Remove column (index)...")
+LIST_ITEM (U"\\bu ##Insert column (index)...")
+LIST_ITEM (U"\\bu ##Set row label (index)...")
+LIST_ITEM (U"\\bu ##Set row label (label)...")
+LIST_ITEM (U"\\bu ##Set column label (index)...")
+LIST_ITEM (U"\\bu ##Set column label (label)...")
+NORMAL (U"Multidimensional scaling analysis")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (monotone mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (i-spline mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (interval mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (ratio mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (absolute mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (kruskal)...")
+LIST_ITEM (U"Transformations")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Distance...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Weight")
+MAN_END
+
+MAN_BEGIN (U"Dissimilarity: Get additive constant", U"djmw", 19971201)
+INTRO (U"A command that calculates the \"additive constant\" from the selected @Dissimilarity.")
+NORMAL (U"Distances %d__%ij_ will be obtained from dissimilarities %\\de__%ij_ according to:")
+FORMULA (U" %distance__%ij_ = %dissimilarity__%ij_ + %additiveConstant")
+NORMAL (U"We use a procedure by @@Cailliez (1983)@ to solve the \"additive constant problem\", i.e. "
 	"find the smallest %additiveConstant such that all %distance__%ij_ in the above equation "
 	" have a Euclidean representation.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity: To Configuration (absolute mds)...", L"djmw", 19980105)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity object.")
-NORMAL (L"The @disparities %d\\'p__%ij_ will be obtained from dissimilarities %\\de__%ij_ according to:")
-FORMULA (L"%d\\'p__%ij_ = %\\de__%ij_")
+MAN_BEGIN (U"Dissimilarity: To Configuration (absolute mds)...", U"djmw", 19980105)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity object.")
+NORMAL (U"The @disparities %d\\'p__%ij_ will be obtained from dissimilarities %\\de__%ij_ according to:")
+FORMULA (U"%d\\'p__%ij_ = %\\de__%ij_")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity: To Configuration (interval mds)...", L"djmw", 19980105)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity object.")
-NORMAL (L"The @disparities %d\\'p__%ij_ will be obtained from dissimilarities %\\de__%ij_ according to:")
-FORMULA (L"%d\\'p__%ij_ = %a + %b \\.c %\\de__%ij_")
+MAN_BEGIN (U"Dissimilarity: To Configuration (interval mds)...", U"djmw", 19980105)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity object.")
+NORMAL (U"The @disparities %d\\'p__%ij_ will be obtained from dissimilarities %\\de__%ij_ according to:")
+FORMULA (U"%d\\'p__%ij_ = %a + %b \\.c %\\de__%ij_")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity: To Configuration (i-spline mds)...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity object.")
-NORMAL (L"Dissimilarities %\\de__%ij_ and @disparities %d\\'p__%ij_ will be related by a @spline function:")
-FORMULA (L"%d\\'p__%ij_ = \\su__%k=1..(%%numberOfInteriorKnots%+%order)_ spline__%k_ (%knots, %order, %\\de__%ij_),")
-NORMAL (L"where spline__%k_ (\\.c) is the value of the %k^^th^ I-spline of order %order and knot sequence "
+MAN_BEGIN (U"Dissimilarity: To Configuration (i-spline mds)...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity object.")
+NORMAL (U"Dissimilarities %\\de__%ij_ and @disparities %d\\'p__%ij_ will be related by a @spline function:")
+FORMULA (U"%d\\'p__%ij_ = \\su__%k=1..(%%numberOfInteriorKnots%+%order)_ spline__%k_ (%knots, %order, %\\de__%ij_),")
+NORMAL (U"where spline__%k_ (\\.c) is the value of the %k^^th^ I-spline of order %order and knot sequence "
 	"%knot evaluated at %\\de__%ij_.")
-ENTRY (L"Settings")
-TAG (L"##Number of dimensions")
-DEFINITION (L"determines the dimensionality of the configuration.")
-TAG (L"##Number of interior knots")
-DEFINITION (L"determines the number of segment boundaries. Each interior knot "
+ENTRY (U"Settings")
+TAG (U"##Number of dimensions")
+DEFINITION (U"determines the dimensionality of the configuration.")
+TAG (U"##Number of interior knots")
+DEFINITION (U"determines the number of segment boundaries. Each interior knot "
 	"is the boundary between two segments. The splines in each segment will "
 	"be joined as continuously as possible.")
-TAG (L"##Order of I-spline")
-DEFINITION (L"The order of the polynomial basis of the I-spline.")
-NORMAL (L"Finding the optimal Configuration involves a minimization process:")
-TAG (L"##Tolerance")
-DEFINITION (L"When successive values for the stress differ by less than "
+TAG (U"##Order of I-spline")
+DEFINITION (U"The order of the polynomial basis of the I-spline.")
+NORMAL (U"Finding the optimal Configuration involves a minimization process:")
+TAG (U"##Tolerance")
+DEFINITION (U"When successive values for the stress differ by less than "
 	"#Tolerance, the minimization process stops.")
-TAG (L"##Maximum number of iterations")
-DEFINITION (L"Minimization stops after this number of iterations has been "
+TAG (U"##Maximum number of iterations")
+DEFINITION (U"Minimization stops after this number of iterations has been "
 	"reached.")
-TAG (L"##Number of repetitions")
-DEFINITION (L"If chosen larger than 1, the minimization process will be "
+TAG (U"##Number of repetitions")
+DEFINITION (U"If chosen larger than 1, the minimization process will be "
 	"repeated, each time with another random start configuration. "
 	"The configuration that results in minimum stress, will be saved.")
-ENTRY (L"Hints")
-NORMAL (L"If %numberOfInteriorKnots is zero, polynomial regression will be "
+ENTRY (U"Hints")
+NORMAL (U"If %numberOfInteriorKnots is zero, polynomial regression will be "
 	"performed. Therefore , the combination %numberOfInteriorKnots = 0 and "
 	"%order = 1 also gives interval "
 	"scaling (in fact, it is the implementation in this program).")
-NORMAL (L"In the limit when %order = 0 and %numberOfInteriorKnots = "
+NORMAL (U"In the limit when %order = 0 and %numberOfInteriorKnots = "
 	"%numberOfDissimilarities, monotone regression is performed.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity: To Configuration (kruskal)...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity: To Configuration (kruskal)...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object.")
-ENTRY (L"Settings")
-TAG (L"##Number of dimensions# (standard value: 2)")
-DEFINITION (L"The dimensionality of the Configuration.")
-TAG (L"##Distance metric% (standard value: 2, i.e. Euclidean)")
-DEFINITION (L"the general distance between points #x__%i_ and #x__%j_ (%i,%j "
+ENTRY (U"Settings")
+TAG (U"##Number of dimensions# (standard value: 2)")
+DEFINITION (U"The dimensionality of the Configuration.")
+TAG (U"##Distance metric% (standard value: 2, i.e. Euclidean)")
+DEFINITION (U"the general distance between points #x__%i_ and #x__%j_ (%i,%j "
 	"= 1..%numberOfPoints) is:")
-DEFINITION (L"(\\su__%k=1..%numberOfDimensions_ |%x__%ik_ \\--%x__%jk_|"
+DEFINITION (U"(\\su__%k=1..%numberOfDimensions_ |%x__%ik_ \\--%x__%jk_|"
 	"^^%metric^)^^1/%metric^")
-TAG (L"##Sort distances")
-DEFINITION (L"determines the handling of ties in the data. When off, whenever "
+TAG (U"##Sort distances")
+DEFINITION (U"determines the handling of ties in the data. When off, whenever "
 	"two or more dissimilarities are equal we do not care whether the fitted "
 	"distances are equal or not. "
 	"Consequently, no constraints are imposed on the fitted distances. "
 	"When on, however, we impose the constaint that the fitted distances be "
 	"equal whenever the dissimilarities are equal.")
-NORMAL (L"For the calculation of stress:")
-TAG (L"##Formula1 (default)")   // ??
-FORMULA (L"%stress = \\Vr(\\su(%distance__%k_ \\-- %fittedDistance__%k_)^2 / "
+NORMAL (U"For the calculation of stress:")
+TAG (U"##Formula1 (default)")   // ??
+FORMULA (U"%stress = \\Vr(\\su(%distance__%k_ \\-- %fittedDistance__%k_)^2 / "
 	"\\su %distance__%k_^2)")
-TAG (L"##Formula2")
-FORMULA (L"%stress = \\Vr(\\su(%distance__%k_ \\-- %fittedDistance__%k_)^2 / "
+TAG (U"##Formula2")
+FORMULA (U"%stress = \\Vr(\\su(%distance__%k_ \\-- %fittedDistance__%k_)^2 / "
 	"\\su (%distance__%k_ \\-- %averageDistance)^2)")
-DEFINITION (L"Note that values of stress 2 are generally more than double those "
+DEFINITION (U"Note that values of stress 2 are generally more than double those "
 	"of stress 1 for the same degree of fit.")
-NORMAL (L"Finding the optimal Configuration involves a minimization process:")
-TAG (L"##Tolerance")
-DEFINITION (L"When successive values for the stress differ less than %Tolerance "
+NORMAL (U"Finding the optimal Configuration involves a minimization process:")
+TAG (U"##Tolerance")
+DEFINITION (U"When successive values for the stress differ less than %Tolerance "
 	"the minimization process stops.")
-TAG (L"##Maximum number of iterations")
-DEFINITION (L"Minimization stops after this number of iterations has been "
+TAG (U"##Maximum number of iterations")
+DEFINITION (U"Minimization stops after this number of iterations has been "
 	"reached.")
-TAG (L"##Number of repetitions")
-DEFINITION (L"When chosen larger than 1, the minimalization process will be "
+TAG (U"##Number of repetitions")
+DEFINITION (U"When chosen larger than 1, the minimalization process will be "
 	"repeated, each time with another random start configuration. "
 	"The configuration that results in minimum stress will be saved.")
-ENTRY (L"Precautions")
-NORMAL (L"When there are few objects it is impossible to recover many "
+ENTRY (U"Precautions")
+NORMAL (U"When there are few objects it is impossible to recover many "
 	"dimensions. A rough rule of thumb is that there should be at least twice "
 	"as many number of observations, i.e. the %numberOfPoints \\.c "
 	"(%numberOfPoints - 1) / 2 (dis)similarities, than parameters "
 	"to be estimated, i.e. the %numberOfPoints \\.c %numberOfDimensions "
 	"position coordinates. A practical guide is:")
-	LIST_ITEM (L"for %numberOfDimensions = 1 you need \\>_ 5 objects")
-	LIST_ITEM (L"for %numberOfDimensions = 2 you need \\>_ 9 objects")
-	LIST_ITEM (L"for %numberOfDimensions = 3 you need \\>_ 13 objects")
-NORMAL (L"There is no feasible way to be certain that you have found the "
+	LIST_ITEM (U"for %numberOfDimensions = 1 you need \\>_ 5 objects")
+	LIST_ITEM (U"for %numberOfDimensions = 2 you need \\>_ 9 objects")
+	LIST_ITEM (U"for %numberOfDimensions = 3 you need \\>_ 13 objects")
+NORMAL (U"There is no feasible way to be certain that you have found the "
 	"true global minimum. However, by using a great number of different "
 	"random starting configurations to scale the same data it is often "
 	"possible to obtain practical certainty. "
@@ -802,537 +802,537 @@ NORMAL (L"There is no feasible way to be certain that you have found the "
 	"on a %linear relation between distance and (dis)similarity, it gives a "
 	"very good approximation of the optimal #Configuration and "
 	"the #Minimizer practically always finds the global minimum from it "
-	"(I guess...).  A way to find out is to try the %numberOfRepetitions "
+	"(I guess...). A way to find out is to try the %numberOfRepetitions "
 	"parameter which gives you the possibility to fit many times and each "
 	"time start with another random initial configuration.")
-ENTRY (L"Algorithm")
-LIST_ITEM (L"1. The Dissimilarity object is converted to a Distance object in "
+ENTRY (U"Algorithm")
+LIST_ITEM (U"1. The Dissimilarity object is converted to a Distance object in "
 	"the same way as in @@Dissimilarity: To Distance... at .)")
-LIST_ITEM (L"2. From the Distance object an initial Configuration is found by "
+LIST_ITEM (U"2. From the Distance object an initial Configuration is found by "
 	"first transforming the Distance object to a matrix with scalar products "
 	"of distances and subsequently solving for the first %numberOfDimensions "
 	"eigenvectors of this matrix.")
-LIST_ITEM (L"3. A minimalization algorithm is started that tries to minimize a "
+LIST_ITEM (U"3. A minimalization algorithm is started that tries to minimize a "
 	"function. In this function:")
-LIST_ITEM (L"\\bu 3.1 We normalize the current Configuration from the minimizer")
-LIST_ITEM (L"\\bu 3.2 Calculate a new Distance object from the configuration")
-LIST_ITEM (L"\\bu 3.3 Do a monotone regression of this Distance on the "
+LIST_ITEM (U"\\bu 3.1 We normalize the current Configuration from the minimizer")
+LIST_ITEM (U"\\bu 3.2 Calculate a new Distance object from the configuration")
+LIST_ITEM (U"\\bu 3.3 Do a monotone regression of this Distance on the "
 	"Dissimilarity. This results in a new Distance object.")
-LIST_ITEM (L"\\bu 3.4 Calculate stress from this Distance and the Distance "
+LIST_ITEM (U"\\bu 3.4 Calculate stress from this Distance and the Distance "
 	"obtained from Dissimilarity.")
-NORMAL (L"The optimization process is ccontrolledby a conjugate gradient "
+NORMAL (U"The optimization process is ccontrolledby a conjugate gradient "
 	"minimization algorithm that tries to minimize the %stress function. "
 	"In @@Kruskal (1964)@, a steepest descent "
 	"algorithm is used wwhichis less efficient. ")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity: To Configuration (monotone mds)...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity: To Configuration (monotone mds)...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object.")
-NORMAL (L"Dissimilarities %\\de__%ij_ and @disparities %d\\'p__%ij_ are "
+NORMAL (U"Dissimilarities %\\de__%ij_ and @disparities %d\\'p__%ij_ are "
 	"related by:")
-FORMULA (L"%d\\'p__%ij_ \\<_ %d\\'p__%kl_ if %\\de__%ij_ \\<_ %\\de__%kl_")
-ENTRY (L"Settings")
-TAG (L"##Number of dimensions")
-DEFINITION (L"determines the number of dimensions of the configuration.")
-TAG (L"##Primary or secondary approach to ties")
-DEFINITION (L"When dissimilarities are equal, i.e., %\\de__%ij_ = %\\de__%kl_, "
+FORMULA (U"%d\\'p__%ij_ \\<_ %d\\'p__%kl_ if %\\de__%ij_ \\<_ %\\de__%kl_")
+ENTRY (U"Settings")
+TAG (U"##Number of dimensions")
+DEFINITION (U"determines the number of dimensions of the configuration.")
+TAG (U"##Primary or secondary approach to ties")
+DEFINITION (U"When dissimilarities are equal, i.e., %\\de__%ij_ = %\\de__%kl_, "
 	"the primary approach imposes no conditions on the corresponding "
 	"@disparities %d\\'p__%ij_ and %d\\'p__%kl_, while the %secondary "
 	"approach demands that also %d\\'p__%ij_ = %d\\'p__%kl_.")
-NORMAL (L"Finding the optimal Configuration involves a minimization process:")
-TAG (L"##Tolerance")
-DEFINITION (L"When successive values for the stress differ less than %Tolerance "
+NORMAL (U"Finding the optimal Configuration involves a minimization process:")
+TAG (U"##Tolerance")
+DEFINITION (U"When successive values for the stress differ less than %Tolerance "
 	"the minimization process stops.")
-TAG (L"##Maximum number of iterations")
-DEFINITION (L"Minimization stops after this number of iterations has been reached.")
-TAG (L"##Number of repetitions")
-DEFINITION (L"When chosen larger than 1, the minimalization process will be "
+TAG (U"##Maximum number of iterations")
+DEFINITION (U"Minimization stops after this number of iterations has been reached.")
+TAG (U"##Number of repetitions")
+DEFINITION (U"When chosen larger than 1, the minimalization process will be "
 	"repeated, each time with another random start configuration. "
 	"The configuration that results in minimum stress will be saved.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity: To Configuration (ratio mds)...", L"djmw", 19980105)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity: To Configuration (ratio mds)...", U"djmw", 19980105)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object.")
-NORMAL (L"The @disparities %d\\'p__%ij_ will be obtained from dissimilarities "
+NORMAL (U"The @disparities %d\\'p__%ij_ will be obtained from dissimilarities "
 	"%\\de__%ij_ according to:")
-FORMULA (L"%d\\'p__%ij_ = %b \\.c %\\de__%ij_")
+FORMULA (U"%d\\'p__%ij_ = %b \\.c %\\de__%ij_")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity: To Distance...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Distance object from a selected "
+MAN_BEGIN (U"Dissimilarity: To Distance...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Distance object from a selected "
 	"@Dissimilarity object.")
-ENTRY (L"Settings")
-TAG (L"##Scale")
-DEFINITION (L"when on, the @@Dissimilarity: Get additive constant|"
+ENTRY (U"Settings")
+TAG (U"##Scale")
+DEFINITION (U"when on, the @@Dissimilarity: Get additive constant|"
 	"additiveConstant@ is determined, when off the %additiveConstant = 0.")
-NORMAL (L"dissimilarities are transformed to distances according to:")
-FORMULA (L" %distance__%ij_ = %dissimilarity__%ij_ + %additiveConstant.")
+NORMAL (U"dissimilarities are transformed to distances according to:")
+FORMULA (U" %distance__%ij_ = %dissimilarity__%ij_ + %additiveConstant.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity: To Weight", L"djmw", 19980108)
-INTRO (L"Creates an object of type @Weight for each selected @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity: To Weight", U"djmw", 19980108)
+INTRO (U"Creates an object of type @Weight for each selected @Dissimilarity "
 	"object.")
-NORMAL (L"The values in the weight matrix will be:")
-LIST_ITEM (L"%w__%ii_ = 0")
-LIST_ITEM (L"%w__%ij_ = 1 if %\\de__%ij_ > 0")
+NORMAL (U"The values in the weight matrix will be:")
+LIST_ITEM (U"%w__%ii_ = 0")
+LIST_ITEM (U"%w__%ij_ = 1 if %\\de__%ij_ > 0")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: Draw regression (absolute mds)...",
-	L"djmw", 20040407)
-INTRO (L"Draws a scatterplot of the dissimilarities %\\de__%ij_ from the "
+MAN_BEGIN (U"Dissimilarity & Configuration: Draw regression (absolute mds)...",
+	U"djmw", 20040407)
+INTRO (U"Draws a scatterplot of the dissimilarities %\\de__%ij_ from the "
 	"selected @Dissimilarity object versus @disparities %d\\'p__%ij_ obtained "
 	"from the \"regression\" of distances %d__%ij_ "
 	"from @Configuration on the dissimilarities %\\de__%ij_.")
-FORMULA (L"%d\\'p__%ij_ = %\\de__%ij_")
-ENTRY (L"Settings")
-TAG (L"##Minimum proximity#, ##Maximum proximity#")
-DEFINITION (L"minimum and maximum values for the proximities (horizontal axis).")
-TAG (L"##Minimum distance#, ##Maximum distance#")
-DEFINITION (L"minimum and maximum values for the distances (vertical axis).")
-TAG (L"##Mark size (mm)#, ##Mark string#")
-DEFINITION (L"size and kind of the marks in the plot.")
-TAG (L"##Garnish")
-DEFINITION (L"when on, draws a bounding box with decoration.")
-MAN_END
-
-MAN_BEGIN (L"Dissimilarity & Configuration: Draw regression (interval mds)...",
-	L"djmw", 20040407)
-INTRO (L"Draws a scatterplot of the dissimilarities %\\de__%ij_ from the "
+FORMULA (U"%d\\'p__%ij_ = %\\de__%ij_")
+ENTRY (U"Settings")
+TAG (U"##Minimum proximity#, ##Maximum proximity#")
+DEFINITION (U"minimum and maximum values for the proximities (horizontal axis).")
+TAG (U"##Minimum distance#, ##Maximum distance#")
+DEFINITION (U"minimum and maximum values for the distances (vertical axis).")
+TAG (U"##Mark size (mm)#, ##Mark string#")
+DEFINITION (U"size and kind of the marks in the plot.")
+TAG (U"##Garnish")
+DEFINITION (U"when on, draws a bounding box with decoration.")
+MAN_END
+
+MAN_BEGIN (U"Dissimilarity & Configuration: Draw regression (interval mds)...",
+	U"djmw", 20040407)
+INTRO (U"Draws a scatterplot of the dissimilarities %\\de__%ij_ from the "
 	"selected @Dissimilarity versus @disparities %d\\'p__%ij_ obtained "
 	"from the regression of distances %d__%ij_ "
 	"from @Configuration on the dissimilarities %\\de__%ij_.")
-FORMULA (L"%d\\'p__%ij_ = %a + %b \\.c %\\de__%ij_,")
-NORMAL (L"where the values of %a and %b are determined by regression.")
-ENTRY (L"Settings")
-TAG (L"##Minimum proximity#, ##Maximum proximity#")
-DEFINITION (L"minimum and maximum values for the proximities (horizontal axis).")
-TAG (L"##Minimum distance#, ##Maximum distance#")
-DEFINITION (L"minimum and maximum values for the distances (vertical axis).")
-TAG (L"##Mark size (mm)#, ##Mark string#")
-DEFINITION (L"size and kind of the marks in the plot.")
-TAG (L"##Garnish")
-DEFINITION (L"when on, draws a bounding box with decoration.")
-MAN_END
-
-MAN_BEGIN (L"Dissimilarity & Configuration: Draw regression (i-spline mds)...", L"djmw", 20040407)
-INTRO (L"Draws a scatterplot of the dissimilarities %\\de__%ij_ from the "
+FORMULA (U"%d\\'p__%ij_ = %a + %b \\.c %\\de__%ij_,")
+NORMAL (U"where the values of %a and %b are determined by regression.")
+ENTRY (U"Settings")
+TAG (U"##Minimum proximity#, ##Maximum proximity#")
+DEFINITION (U"minimum and maximum values for the proximities (horizontal axis).")
+TAG (U"##Minimum distance#, ##Maximum distance#")
+DEFINITION (U"minimum and maximum values for the distances (vertical axis).")
+TAG (U"##Mark size (mm)#, ##Mark string#")
+DEFINITION (U"size and kind of the marks in the plot.")
+TAG (U"##Garnish")
+DEFINITION (U"when on, draws a bounding box with decoration.")
+MAN_END
+
+MAN_BEGIN (U"Dissimilarity & Configuration: Draw regression (i-spline mds)...", U"djmw", 20040407)
+INTRO (U"Draws a scatterplot of the dissimilarities %\\de__%ij_ from the "
 	"selected @Dissimilarity versus @disparities %d\\'p__%ij_ obtained "
 	"from the regression of distances %d__%ij_ from @Configuration on the "
 	"@spline transformed dissimilarities %\\de__%ij_.")
-ENTRY (L"Settings")
-TAG (L"##Number of interior knots")
-DEFINITION (L"determines the number of segments.")
-TAG (L"##Order of I-spline")
-DEFINITION (L"The order of the polynomial basis of the I-spline.")
-TAG (L"##Minimum proximity#, ##Maximum proximity#")
-DEFINITION (L"minimum and maximum values for the proximities (horizontal axis).")
-TAG (L"##Minimum distance#, ##Maximum distance#")
-DEFINITION (L"minimum and maximum values for the distances (vertical axis).")
-TAG (L"##Mark size (mm)#, ##Mark string#")
-DEFINITION (L"size and kind of the marks in the plot.")
-TAG (L"##Garnish")
-DEFINITION (L"when on, draws a bounding box with decoration.")
-MAN_END
-
-MAN_BEGIN (L"Dissimilarity & Configuration: Draw regression (monotone mds)...", L"djmw", 20040407)
-INTRO (L"Draws a scatterplot of the dissimilarities %\\de__%ij_ from the "
+ENTRY (U"Settings")
+TAG (U"##Number of interior knots")
+DEFINITION (U"determines the number of segments.")
+TAG (U"##Order of I-spline")
+DEFINITION (U"The order of the polynomial basis of the I-spline.")
+TAG (U"##Minimum proximity#, ##Maximum proximity#")
+DEFINITION (U"minimum and maximum values for the proximities (horizontal axis).")
+TAG (U"##Minimum distance#, ##Maximum distance#")
+DEFINITION (U"minimum and maximum values for the distances (vertical axis).")
+TAG (U"##Mark size (mm)#, ##Mark string#")
+DEFINITION (U"size and kind of the marks in the plot.")
+TAG (U"##Garnish")
+DEFINITION (U"when on, draws a bounding box with decoration.")
+MAN_END
+
+MAN_BEGIN (U"Dissimilarity & Configuration: Draw regression (monotone mds)...", U"djmw", 20040407)
+INTRO (U"Draws a scatterplot of the dissimilarities %\\de__%ij_ from the "
 	"selected @Dissimilarity versus @disparities %d\\'p__%ij_ obtained "
 	"from the monotone regression of distances %d__%ij_ "
 	"from @Configuration on the dissimilarities %\\de__%ij_.")
-ENTRY (L"Settings")
-TAG (L"##Primary or secondary approach to ties")
-DEFINITION (L"When dissimilarities are equal, i.e., %\\de__%ij_ = %\\de__%kl_ "
+ENTRY (U"Settings")
+TAG (U"##Primary or secondary approach to ties")
+DEFINITION (U"When dissimilarities are equal, i.e., %\\de__%ij_ = %\\de__%kl_ "
 	"the primary approach imposes no conditions on the corresponding distances "
 	"%d__%ij_ and %d__%kl_, while the %secondary approach demands that also "
 	"%d__%ij_ = %d__%kl_.")
-TAG (L"##Minimum proximity#, ##Maximum proximity#")
-DEFINITION (L"minimum and maximum values for the proximities (horizontal axis).")
-TAG (L"##Minimum distance#, ##Maximum distance#")
-DEFINITION (L"minimum and maximum values for the distances (vertical axis).")
-TAG (L"##Mark size (mm)#, ##Mark string#")
-DEFINITION (L"size and kind of the marks in the plot.")
-TAG (L"##Garnish")
-DEFINITION (L"when on, draws a bounding box with decoration.")
-MAN_END
-
-MAN_BEGIN (L"Dissimilarity & Configuration: Draw regression (ratio mds)...", L"djmw", 20040407)
-INTRO (L"Draws a scatterplot of the dissimilarities %\\de__%ij_ from the "
+TAG (U"##Minimum proximity#, ##Maximum proximity#")
+DEFINITION (U"minimum and maximum values for the proximities (horizontal axis).")
+TAG (U"##Minimum distance#, ##Maximum distance#")
+DEFINITION (U"minimum and maximum values for the distances (vertical axis).")
+TAG (U"##Mark size (mm)#, ##Mark string#")
+DEFINITION (U"size and kind of the marks in the plot.")
+TAG (U"##Garnish")
+DEFINITION (U"when on, draws a bounding box with decoration.")
+MAN_END
+
+MAN_BEGIN (U"Dissimilarity & Configuration: Draw regression (ratio mds)...", U"djmw", 20040407)
+INTRO (U"Draws a scatterplot of the dissimilarities %\\de__%ij_ from the "
 	"selected @Dissimilarity versus @disparities %d\\'p__%ij_ obtained "
 	"from the \"regression\" of distances %d__%ij_ "
 	"from @Configuration on the dissimilarities %\\de__%ij_.")
-FORMULA (L"%d\\'p__%ij_ = %b \\.c %\\de__%ij_,")
-NORMAL (L"where the value of %b is determined by regression.")
-ENTRY (L"Settings")
-TAG (L"##Minimum proximity#, ##Maximum proximity#")
-DEFINITION (L"minimum and maximum values for the proximities (horizontal axis).")
-TAG (L"##Minimum distance#, ##Maximum distance#")
-DEFINITION (L"minimum and maximum values for the distances (vertical axis).")
-TAG (L"##Mark size (mm)#, ##Mark string#")
-DEFINITION (L"size and kind of the marks in the plot.")
-TAG (L"##Garnish")
-DEFINITION (L"when on, draws a bounding box with decoration.")
-MAN_END
-
-MAN_BEGIN (L"Dissimilarity & Configuration: Draw Shepard diagram...", L"djmw", 20040407)
-INTRO (L"Draws the Shepard diagram. This is a scatterplot of the "
+FORMULA (U"%d\\'p__%ij_ = %b \\.c %\\de__%ij_,")
+NORMAL (U"where the value of %b is determined by regression.")
+ENTRY (U"Settings")
+TAG (U"##Minimum proximity#, ##Maximum proximity#")
+DEFINITION (U"minimum and maximum values for the proximities (horizontal axis).")
+TAG (U"##Minimum distance#, ##Maximum distance#")
+DEFINITION (U"minimum and maximum values for the distances (vertical axis).")
+TAG (U"##Mark size (mm)#, ##Mark string#")
+DEFINITION (U"size and kind of the marks in the plot.")
+TAG (U"##Garnish")
+DEFINITION (U"when on, draws a bounding box with decoration.")
+MAN_END
+
+MAN_BEGIN (U"Dissimilarity & Configuration: Draw Shepard diagram...", U"djmw", 20040407)
+INTRO (U"Draws the Shepard diagram. This is a scatterplot of the "
 	"dissimilarities from the @Dissimilarity object versus distances (as "
 	"calculated from the @Configuration).")
-ENTRY (L"Settings")
-TAG (L"##Minimum proximity#, ##Maximum proximity#")
-DEFINITION (L"minimum and maximum values for the proximities (horizontal axis).")
-TAG (L"##Minimum distance#, ##Maximum distance#")
-DEFINITION (L"minimum and maximum values for the distances (vertical axis).")
-TAG (L"##Mark size (mm)#, ##Mark string#")
-DEFINITION (L"size and kind of the marks in the plot.")
-TAG (L"##Garnish")
-DEFINITION (L"when on, draws a bounding box with decoration.")
-MAN_END
-
-MAN_BEGIN (L"Dissimilarity & Configuration: Get stress (absolute mds)...",
-	L"djmw", 19980119)
-INTRO (L"A command to obtain the @stress value for the selected @Dissimilarity "
+ENTRY (U"Settings")
+TAG (U"##Minimum proximity#, ##Maximum proximity#")
+DEFINITION (U"minimum and maximum values for the proximities (horizontal axis).")
+TAG (U"##Minimum distance#, ##Maximum distance#")
+DEFINITION (U"minimum and maximum values for the distances (vertical axis).")
+TAG (U"##Mark size (mm)#, ##Mark string#")
+DEFINITION (U"size and kind of the marks in the plot.")
+TAG (U"##Garnish")
+DEFINITION (U"when on, draws a bounding box with decoration.")
+MAN_END
+
+MAN_BEGIN (U"Dissimilarity & Configuration: Get stress (absolute mds)...",
+	U"djmw", 19980119)
+INTRO (U"A command to obtain the @stress value for the selected @Dissimilarity "
 	"and @Configuration object.")
-ENTRY (L"Behaviour")
-NORMAL (L"Stress formula's are #dependent of the scale of the Configuration: "
+ENTRY (U"Behaviour")
+NORMAL (U"Stress formula's are #dependent of the scale of the Configuration: "
 	"you will get #another stress value if you had pre-multiplied the "
 	"selected Configuration with any number greater than zero.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: Get stress (interval mds)...",
-	L"djmw", 19980119)
-INTRO (L"A command to obtain the @stress value for the selected @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Configuration: Get stress (interval mds)...",
+	U"djmw", 19980119)
+INTRO (U"A command to obtain the @stress value for the selected @Dissimilarity "
 	"and @Configuration object.")
-ENTRY (L"Behaviour")
-NORMAL (L"We use stress formula's that are independent of the scale of the "
+ENTRY (U"Behaviour")
+NORMAL (U"We use stress formula's that are independent of the scale of the "
 	"Configuration: you would have got the same stress value if you had "
 	"pre-multiplied the selected Configuration with any number greater "
 	"than zero.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: Get stress (i-spline mds)...",
-	L"djmw", 19980119)
-INTRO (L"A command to obtain the @stress value for the selected @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Configuration: Get stress (i-spline mds)...",
+	U"djmw", 19980119)
+INTRO (U"A command to obtain the @stress value for the selected @Dissimilarity "
 	"and @Configuration object.")
-ENTRY (L"Behaviour")
-NORMAL (L"We use stress formula's that are independent of the scale "
+ENTRY (U"Behaviour")
+NORMAL (U"We use stress formula's that are independent of the scale "
 	"of the Configuration: you would have got the same stress value if "
 	"you had pre-multiplied the selected Configuration with any number "
 	"greater than zero.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: Get stress (monotone mds)...",
-	L"djmw", 19980119)
-INTRO (L"A command to obtain the @stress value for the selected @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Configuration: Get stress (monotone mds)...",
+	U"djmw", 19980119)
+INTRO (U"A command to obtain the @stress value for the selected @Dissimilarity "
 	"and @Configuration object.")
-ENTRY (L"Behaviour")
-NORMAL (L"We use stress formula's that are independent of the scale "
+ENTRY (U"Behaviour")
+NORMAL (U"We use stress formula's that are independent of the scale "
 	"of the Configuration: you would have got the same stress value if "
 	"you had pre-multiplied the selected Configuration with any number "
 	"greater than zero.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: Get stress (ratio mds)...",
-	L"djmw", 19980119)
-INTRO (L"A command to obtain the @stress value for the selected @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Configuration: Get stress (ratio mds)...",
+	U"djmw", 19980119)
+INTRO (U"A command to obtain the @stress value for the selected @Dissimilarity "
 	"and @Configuration object.")
-ENTRY (L"Behaviour")
-NORMAL (L"We use stress formula's that are independent of the scale "
+ENTRY (U"Behaviour")
+NORMAL (U"We use stress formula's that are independent of the scale "
 	"of the Configuration: you would have got the same stress value if "
 	"you had pre-multiplied the selected Configuration with any number "
 	"greater than zero.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: To Configuration (absolute mds)...",
-	L"djmw", 19980119)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Configuration: To Configuration (absolute mds)...",
+	U"djmw", 19980119)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object. The selected Configuration object serves as a starting "
 	"configuration for the minimization process.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: To Configuration (interval mds)...",
-	L"djmw", 19980119)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Configuration: To Configuration (interval mds)...",
+	U"djmw", 19980119)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object. The selected Configuration object serves as a starting "
 	"configuration for the minimization process.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: To Configuration (i-spline mds)...",
-	L"djmw", 19980119)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Configuration: To Configuration (i-spline mds)...",
+	U"djmw", 19980119)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object. The selected Configuration object serves as a starting "
 	"configuration for the minimization process.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: To Configuration (kruskal)...",
-	L"djmw", 19971201)
-INTRO (L"A command to fit an optimal @Configuration for the selected "
+MAN_BEGIN (U"Dissimilarity & Configuration: To Configuration (kruskal)...",
+	U"djmw", 19971201)
+INTRO (U"A command to fit an optimal @Configuration for the selected "
 	"@Dissimilarity object. The selected @Configuration will be used as the "
 	"starting configuration in the kruskal analysis.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: To Configuration (monotone mds)...",
-	L"djmw", 19980119)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Configuration: To Configuration (monotone mds)...",
+	U"djmw", 19980119)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object. The selected Configuration object serves as a starting "
 	"configuration for the minimization process.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration: To Configuration (ratio mds)...",
-	L"djmw", 19980119)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Configuration: To Configuration (ratio mds)...",
+	U"djmw", 19980119)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object. The selected Configuration object serves as a starting "
 	"configuration for the minimization process.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration & Weight: Get stress...", L"djmw", 20040407)
-INTRO (L"A command that calculates the @stress between distances %d__%ij_ "
+MAN_BEGIN (U"Dissimilarity & Configuration & Weight: Get stress...", U"djmw", 20040407)
+INTRO (U"A command that calculates the @stress between distances %d__%ij_ "
 	"derived from the selected @Configuration object and @disparities "
 	"%d\\'p__%ij_ derived from the selected @Dissimilarity object. "
 	"With the selected @Weight object the evaluation of the influence "
 	"of each dissimilarity on stress can be influenced.")
-ENTRY (L"Settings")
-LIST_ITEM (L"%%Normalized stress%, %%Kruskal's stress-1%, %%Kruskal's "
+ENTRY (U"Settings")
+LIST_ITEM (U"%%Normalized stress%, %%Kruskal's stress-1%, %%Kruskal's "
 	"stress-2% or %Raw stress%")
-ENTRY (L"Behaviour")
-NORMAL (L"Except for %absolute %mds, we us stress formula's that are "
+ENTRY (U"Behaviour")
+NORMAL (U"Except for %absolute %mds, we us stress formula's that are "
 	"independent of the scale of the Configuration (see @stress): you would "
 	"have got the same stress value if you had pre-multiplied the selected "
 	"Configuration with any number greater than zero.")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Configuration & Weight: To Configuration...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Configuration & Weight: To Configuration...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object. With the selected @Weight object the influence of each "
 	"dissimilarity on @stress can be influenced. The selected Configuration "
 	"object serves as a starting configuration for the minimization process.")
-ENTRY (L"Settings")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (monotone mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (i-spline mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (interval mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (ratio mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (absolute mds)...")
+ENTRY (U"Settings")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (monotone mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (i-spline mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (interval mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (ratio mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (absolute mds)...")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Weight: To Configuration...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Weight: To Configuration...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object. With the selected @Weight object the influence of each "
 	"dissimilarity on @stress can be influenced.")
-ENTRY (L"Settings")
-NORMAL (L"May be different and depend on the representation function, i.e. "
+ENTRY (U"Settings")
+NORMAL (U"May be different and depend on the representation function, i.e. "
 	"the scale of measurement.")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (monotone mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (i-spline mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (interval mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (ratio mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (absolute mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (monotone mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (i-spline mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (interval mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (ratio mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (absolute mds)...")
 MAN_END
 
-MAN_BEGIN (L"Dissimilarity & Weight: To Configuration...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Configuration object from a @Dissimilarity "
+MAN_BEGIN (U"Dissimilarity & Weight: To Configuration...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Configuration object from a @Dissimilarity "
 	"object. With the selected @Weight object the influence of each "
 	"dissimilarity on @stress can be influenced.")
-ENTRY (L"Settings")
-NORMAL (L"May be different and depend on the representation function, i.e. the scale of measurement.")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (monotone mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (i-spline mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (interval mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (ratio mds)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (absolute mds)...")
+ENTRY (U"Settings")
+NORMAL (U"May be different and depend on the representation function, i.e. the scale of measurement.")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (monotone mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (i-spline mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (interval mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (ratio mds)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (absolute mds)...")
 MAN_END
 
-MAN_BEGIN (L"Distance", L"djmw", 19971124)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type Distance represents distances between objects in a metrical space.")
-NORMAL (L"Creation")
-LIST_ITEM (L"\\bu @@Confusion: To Dissimilarity (pdf)...")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Distance...")
+MAN_BEGIN (U"Distance", U"djmw", 19971124)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type Distance represents distances between objects in a metrical space.")
+NORMAL (U"Creation")
+LIST_ITEM (U"\\bu @@Confusion: To Dissimilarity (pdf)...")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Distance...")
 MAN_END
 
-MAN_BEGIN (L"Distance: To Configuration (indscal)...", L"djmw", 19971124)
-INTRO (L"Perform an @@INDSCAL analysis@ on the selected object(s) of type @Distance that "
+MAN_BEGIN (U"Distance: To Configuration (indscal)...", U"djmw", 19971124)
+INTRO (U"Perform an @@INDSCAL analysis@ on the selected object(s) of type @Distance that "
 	"results in a @Configuration and a @Salience object.")
 MAN_END
 
-MAN_BEGIN (L"Distance: To Configuration (ytl)...", L"djmw", 19971124)
-INTRO (L"A command that creates one @Configuration and one @Salience object "
+MAN_BEGIN (U"Distance: To Configuration (ytl)...", U"djmw", 19971124)
+INTRO (U"A command that creates one @Configuration and one @Salience object "
 	"from a collection of one or more @Distance objects.")
-NORMAL (L"This Configuration and Salience object normally serve as starting points "
+NORMAL (U"This Configuration and Salience object normally serve as starting points "
 	"for an @@individual difference scaling@ such as an @@INDSCAL analysis at .")
-NORMAL (L"The algorithm is ddescribedin @@Young, Takane & Lewyckyj (1978)@.")
+NORMAL (U"The algorithm is ddescribedin @@Young, Takane & Lewyckyj (1978)@.")
 MAN_END
 
-MAN_BEGIN (L"Distance: To ScalarProduct...", L"djmw", 20040407)
-INTRO (L"A command that creates a @ScalarProduct for each selected @Distance.")
-ENTRY (L"Setting")
-TAG (L"##Make sum of squares equal 1.0")
-DEFINITION (L"when selected, the elements in the resulting matrix part will be scaled such that "
+MAN_BEGIN (U"Distance: To ScalarProduct...", U"djmw", 20040407)
+INTRO (U"A command that creates a @ScalarProduct for each selected @Distance.")
+ENTRY (U"Setting")
+TAG (U"##Make sum of squares equal 1.0")
+DEFINITION (U"when selected, the elements in the resulting matrix part will be scaled such that "
 	"the sum of all the squared elements in the matrix equals 1.0.")
-ENTRY (L"Algorithm")
-NORMAL (L"ScalarProduct entries %b__%ij_ are created from distances %d__%ij_ bij double centering "
+ENTRY (U"Algorithm")
+NORMAL (U"ScalarProduct entries %b__%ij_ are created from distances %d__%ij_ bij double centering "
 	"the matrix with elements \\--1/2 %d__%ij_^2, i.e.,")
-FORMULA (L"%b__%ij_= \\--1/2(%d__%ij_^2 \\-- %d__%\\.cj_^2 \\-- %d__%i\\.c_^2 + %d__%\\.c\\.c_^2),")
-NORMAL (L"where the dot (\\.c) means averaging over that dimension.")
+FORMULA (U"%b__%ij_= \\--1/2(%d__%ij_^2 \\-- %d__%\\.cj_^2 \\-- %d__%i\\.c_^2 + %d__%\\.c\\.c_^2),")
+NORMAL (U"where the dot (\\.c) means averaging over that dimension.")
 MAN_END
 
-MAN_BEGIN (L"Distance & Configuration: Draw scatter diagram...", L"djmw", 19971201)
+MAN_BEGIN (U"Distance & Configuration: Draw scatter diagram...", U"djmw", 19971201)
 MAN_END
 
-MAN_BEGIN (L"Distance & Configuration: Get VAF...", L"djmw", 19971201)
-INTRO (L"Calculates the \"%%variance accounted for%\" from the selected collection of @Distance objects and the "
+MAN_BEGIN (U"Distance & Configuration: Get VAF...", U"djmw", 19971201)
+INTRO (U"Calculates the \"%%variance accounted for%\" from the selected collection of @Distance objects and the "
 	"selected @Configuration. The optimal @Salience necessary for the calculation "
 	"will be inferred from the selected Distance and Configuration objects.")
 MAN_END
 
-MAN_BEGIN (L"Distance & Configuration: To Configuration (indscal)...", L"djmw", 19971201)
-INTRO (L"Performs an @@INDSCAL analysis@ on the selected objects of type @Distance and calculates "
+MAN_BEGIN (U"Distance & Configuration: To Configuration (indscal)...", U"djmw", 19971201)
+INTRO (U"Performs an @@INDSCAL analysis@ on the selected objects of type @Distance and calculates "
 	"a @Configuration from them. Uses the selected Configuration object as the initial Configuration in "
 	"the iteration process.")
 MAN_END
 
-MAN_BEGIN (L"Distance & Configuration & Salience: Get VAF...", L"djmw", 19971201)
-INTRO (L"Calculates the \"variance accounted for\" from the selected collection "
+MAN_BEGIN (U"Distance & Configuration & Salience: Get VAF...", U"djmw", 19971201)
+INTRO (U"Calculates the \"variance accounted for\" from the selected collection "
 	"of @Distance objects, the "
 	"selected @Configuration and the selected #Salience.")
 MAN_END
 
-MAN_BEGIN (L"Distance & Configuration & Salience: To Configuration "
-	"(indscal)...", L"djmw", 19971201)
-INTRO (L"A command that creates a new @Configuration from the selected "
+MAN_BEGIN (U"Distance & Configuration & Salience: To Configuration "
+	"(indscal)...", U"djmw", 19971201)
+INTRO (U"A command that creates a new @Configuration from the selected "
 	"collection of @Distance objects, the selected @Configuration and the "
 	"selected #Salience. The selected Configuration and Salience "
 	"serve as start values for the @@INDSCAL analysis at .")
 MAN_END
 
-MAN_BEGIN (L"individual difference scaling", L"djmw", 19970502)
-INTRO (L"The purpose of individual difference scaling is to represent objects, "
+MAN_BEGIN (U"individual difference scaling", U"djmw", 19970502)
+INTRO (U"The purpose of individual difference scaling is to represent objects, "
 	"whose dissimilarities are given, as points in a metrical space. "
 	"The distances in the space should be in accordance with the "
 	"dissimilarities as well as is possible. Besides the configuration a "
 	"@Salience matrix is calculated.")
-NORMAL (L"The basic Euclidean model is:")
-LIST_ITEM (L"%\\de__%ijk_ \\~~ (\\su__%s=1..%r_ %w__%ks_(%x__%is_ \\-- "
+NORMAL (U"The basic Euclidean model is:")
+LIST_ITEM (U"%\\de__%ijk_ \\~~ (\\su__%s=1..%r_ %w__%ks_(%x__%is_ \\-- "
 	"%x__%js_)^2)^^1/2^")
-NORMAL (L"Here \\de__%ijk_ is the (known) dissimilarity between %objects %i and "
+NORMAL (U"Here \\de__%ijk_ is the (known) dissimilarity between %objects %i and "
 	"%j, as measured on %data %source %k. The %x's are the %coordinates of "
 	"the objects in an %r-dimensional space and the %w's are weights or "
 	"saliences. Because straight minimization of the expression above "
 	"is difficult, one applies transformations on this expression. "
 	"Squaring both sides gives the model:")
-LIST_ITEM (L"%\\de^2__%ijk_ \\~~ \\su__%s=1..%r_ %w__%ks_(%x__%is_ \\-- "
+LIST_ITEM (U"%\\de^2__%ijk_ \\~~ \\su__%s=1..%r_ %w__%ks_(%x__%is_ \\-- "
 	"%x__%js_)^2")
-NORMAL (L"and the corresponding least squares loss function:")
-LIST_ITEM (L"\\su__%k=1..%numberOfSources_ \\su__%i=1..%numberOfPoints_ "
+NORMAL (U"and the corresponding least squares loss function:")
+LIST_ITEM (U"\\su__%k=1..%numberOfSources_ \\su__%i=1..%numberOfPoints_ "
 	"\\su__%j=1..%numberOfPoints_ (%\\de^2__%ijk_ \\-- %d^2__%ijk_)^2")
-NORMAL (L"This loss function is minimized in the (ratio scale option of the) "
+NORMAL (U"This loss function is minimized in the (ratio scale option of the) "
 	"#ALSCAL program of @@Takane, Young & de Leeuw (1976)@.")
-NORMAL (L"The transformation used by @@Carroll & Chang (1970)@ in the INDSCAL "
+NORMAL (U"The transformation used by @@Carroll & Chang (1970)@ in the INDSCAL "
 	"model, transforms the data from each source into scalar products "
 	"of vectors. For the dissimilarities:")
-LIST_ITEM (L"%\\be__%ijk_ = \\--{ %\\de^2__%ijk_ \\-- %\\de^2__%i.%k_ \\-- "
+LIST_ITEM (U"%\\be__%ijk_ = \\--{ %\\de^2__%ijk_ \\-- %\\de^2__%i.%k_ \\-- "
 	"%\\de^2__.%jk_ + %\\de^2__..%k_ } / 2,")
-NORMAL (L"where dots replacing indices indicate averaging over the range of "
+NORMAL (U"where dots replacing indices indicate averaging over the range of "
 	"that index. In the same way for the distances:")
-LIST_ITEM (L"%z__%ijk_ = \\--{ %d^2__%ijk_ \\--  %d^2__%i.%k_ \\--  %d"
+LIST_ITEM (U"%z__%ijk_ = \\--{ %d^2__%ijk_ \\--  %d^2__%i.%k_ \\--  %d"
 	"^2__%.%jk_ +  %d^2__%..%k_ } / 2.")
-LIST_ITEM (L"%\\be__%ijk_ \\~~ %z__%ijk_ = \\su__%s=1..%numberOfDimensions_ "
+LIST_ITEM (U"%\\be__%ijk_ \\~~ %z__%ijk_ = \\su__%s=1..%numberOfDimensions_ "
 	"%w__%ks_ %x__%is_ %x__%js_")
-NORMAL (L"Translated into matrix algebra, the equation above translates to:")
-LIST_ITEM (L"%B__%k_ \\~~ %Z__%k_ = %X %W__%k_ %X\\'p,")
-NORMAL (L"where %X is a %numberOfPoints \\xx %numberOfDimensions configuration "
+NORMAL (U"Translated into matrix algebra, the equation above translates to:")
+LIST_ITEM (U"%B__%k_ \\~~ %Z__%k_ = %X %W__%k_ %X\\'p,")
+NORMAL (U"where %X is a %numberOfPoints \\xx %numberOfDimensions configuration "
 	"matrix, %W__%k_, a non-negative %numberOfDimensions \\xx "
 	"%numberOfDimensions matrix with weights, and %B__%k_ "
 	"the %k^^th^ slab of %\\be__%ijk_.")
-NORMAL (L"This translates to the following INDSCAL loss function:")
-FORMULA (L"%f(%X, %W__1_,..., %W__%numberOfSources_) = "
+NORMAL (U"This translates to the following INDSCAL loss function:")
+FORMULA (U"%f(%X, %W__1_,..., %W__%numberOfSources_) = "
 	"\\su__%k=1..%numberOfSources_ | %B__%k_ \\-- %X%W__%k_%X\\'p |^2")
-NORMAL (L"")
+NORMAL (U"")
 MAN_END
 
-MAN_BEGIN (L"INDSCAL analysis", L"djmw", 20120306)
-INTRO (L"A method for @@individual difference scaling@ analysis in P\\s{RAAT}.")
-NORMAL (L"An INDSCAL analysis can be performed on objects of type Distance.")
-NORMAL (L"If you start with @Dissimilarity objects you first have to transform "
+MAN_BEGIN (U"INDSCAL analysis", U"djmw", 20120306)
+INTRO (U"A method for @@individual difference scaling@ analysis in P\\s{RAAT}.")
+NORMAL (U"An INDSCAL analysis can be performed on objects of type Distance.")
+NORMAL (U"If you start with @Dissimilarity objects you first have to transform "
 	"them to Distance objects.")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Distance...@")
-NORMAL (L"If you start with a @Confusion you can use:")
-LIST_ITEM (L"\\bu @@Confusion: To Dissimilarity (pdf)...@")
-ENTRY (L"Examples")
-LIST_ITEM (L"\\bu @@Distance: To Configuration (indscal)...@")
-DEFINITION (L"Perform an INDSCAL analysis on one or more objects of type "
+LIST_ITEM (U"\\bu @@Dissimilarity: To Distance...@")
+NORMAL (U"If you start with a @Confusion you can use:")
+LIST_ITEM (U"\\bu @@Confusion: To Dissimilarity (pdf)...@")
+ENTRY (U"Examples")
+LIST_ITEM (U"\\bu @@Distance: To Configuration (indscal)...@")
+DEFINITION (U"Perform an INDSCAL analysis on one or more objects of type "
 	"@Distance to calculate a @Configuration.")
-LIST_ITEM (L"\\bu @@Distance & Configuration: To Configuration (indscal)...@")
-DEFINITION (L"Perform an INDSCAL analysis on one or more objects of type "
+LIST_ITEM (U"\\bu @@Distance & Configuration: To Configuration (indscal)...@")
+DEFINITION (U"Perform an INDSCAL analysis on one or more objects of type "
 	"@Distance to calculate a @Configuration. Use the selected Configuration "
 	"object as the initial Configuration in the iteration process.")
-ENTRY (L"Algorithm")
-NORMAL (L"The function to be minimized in INDSCAL is the following:")
-FORMULA (L"%f(%X, %W__1_,..., %W__%numberOfSources_) = "
+ENTRY (U"Algorithm")
+NORMAL (U"The function to be minimized in INDSCAL is the following:")
+FORMULA (U"%f(%X, %W__1_,..., %W__%numberOfSources_) = "
 	"\\su__%i=1..%numberOfSources_ |%S__%i_ \\-- %XW__%i_%X\\'p|^2")
-NORMAL (L"where %X an unknown %numberOfPoints x %numberOfDimensions "
+NORMAL (U"where %X an unknown %numberOfPoints x %numberOfDimensions "
 	"configuration matrix, the %W__%i_ are %numberOfSources unknown "
 	"diagonal %numberOfDimensions x %numberOfDimensions matrices with weights, "
 	"often called saliences, and the %S__%i_ are known symmetric "
 	"matrices with scalar products of dimension %numberOfPoints x "
 	"%numberOfPoints.")
-NORMAL (L"In the absence of an algorithm that minimizes %f, @@Carroll & "
+NORMAL (U"In the absence of an algorithm that minimizes %f, @@Carroll & "
 	"Chang (1970)@ resorted to the @CANDECOMP algorithm, which instead of the "
 	"function given above minimizes the following function:")
-FORMULA (L"%g(%X, %Y, %W__1_,..., %W__%numberOfSources_) = "
+FORMULA (U"%g(%X, %Y, %W__1_,..., %W__%numberOfSources_) = "
 	"\\su__%i=1..%numberOfSources_ |%S__%i_ \\-- %XW__%i_%Y\\'p|^2.")
-NORMAL (L"Carroll & Chang claimed that for most practical circumstances %X "
+NORMAL (U"Carroll & Chang claimed that for most practical circumstances %X "
 	"and %Y converge to matrices that will be columnwise proportional. "
 	"However, INDSCAL does not only require symmetry of the solution, "
 	"but also non-negativity of the weights. Both these aspects cannot be "
 	"guaranteed with the CANDECOMP algorithm.")
-NORMAL (L"@@Ten Berge, Kiers & Krijnen (1993)@ describe an algorithm that "
+NORMAL (U"@@Ten Berge, Kiers & Krijnen (1993)@ describe an algorithm that "
 	"automatically satisfies symmetry because it solves %f directly, and, "
 	"also, can guarantee non-negativity of the weights. "
 	"This algorithm proceeds as follows:")
-NORMAL (L"Let #%x__%h_ be the %h-th column of %X. We then write the function %f above as:")
-FORMULA (L"%f(#%x__%h_, %w__1%h_, ..., %w__%numberOfSources %h_) = \\su__%i=1.."
+NORMAL (U"Let #%x__%h_ be the %h-th column of %X. We then write the function %f above as:")
+FORMULA (U"%f(#%x__%h_, %w__1%h_, ..., %w__%numberOfSources %h_) = \\su__%i=1.."
 	"%numberOfSources_ |%S__%ih_ \\-- #%x__%h_%w__%ih_#%x\\'p__%h_|^2,")
-NORMAL (L"with %S__%ih_ defined as:")
-FORMULA (L"%S__%ih_ = (%S__%i_ - \\su__%j\\=/%h, %j=1..%numberOfDimensions_ "
+NORMAL (U"with %S__%ih_ defined as:")
+FORMULA (U"%S__%ih_ = (%S__%i_ - \\su__%j\\=/%h, %j=1..%numberOfDimensions_ "
 	"#%x__%j_%w__%ij_#%x\\'p__%j_).")
-NORMAL (L"Without loss of generality we may require that")
-FORMULA (L"#%x\\'p__%h_#%x__%h_ = 1")
-NORMAL (L"Minimizing %f over #%x__%h_ is equivalent to minimizing")
-FORMULA (L"\\su__%i=1..%numberOfSources_ |%S__%ih_|^2 \\-- 2tr \\su "
+NORMAL (U"Without loss of generality we may require that")
+FORMULA (U"#%x\\'p__%h_#%x__%h_ = 1")
+NORMAL (U"Minimizing %f over #%x__%h_ is equivalent to minimizing")
+FORMULA (U"\\su__%i=1..%numberOfSources_ |%S__%ih_|^2 \\-- 2tr \\su "
 	"%S__%ih_#%x__%h_%w__%ih_#%x\\'p__%h_ + \\su %w^2__%ih_")
-NORMAL (L"This amounts to maximizing")
-FORMULA (L"%g(#%x__%h_) = #%x\\'p__%h_(\\su %w__%ih_%S__%ih_)#%x__%h_")
-NORMAL (L"subject to #%x\\'p__%h_#%x__%h_ = 1. The solution for #%x__%h_ is "
+NORMAL (U"This amounts to maximizing")
+FORMULA (U"%g(#%x__%h_) = #%x\\'p__%h_(\\su %w__%ih_%S__%ih_)#%x__%h_")
+NORMAL (U"subject to #%x\\'p__%h_#%x__%h_ = 1. The solution for #%x__%h_ is "
 	"the dominant eigenvector of (\\su %w__%ih_%S__%ih_), "
 	"which can be determined with the power method (see @@Golub & van Loan "
 	"(1996)@). The optimal value "
 	"for the %w__%ih_, given that all other parameters are fixed:")
-FORMULA (L"%w__%ih_ = #%x\\'p__%h_%S__%ih_#%x__%h_")
-NORMAL (L"In an alternating least squares procedure we may update columns of "
+FORMULA (U"%w__%ih_ = #%x\\'p__%h_%S__%ih_#%x__%h_")
+NORMAL (U"In an alternating least squares procedure we may update columns of "
 	"%X and the diagonals of the %W matrices in any sensible order.")
 MAN_END
 
-MAN_BEGIN (L"Kruskal analysis", L"djmw", 19971201)
-INTRO (L"One of the @@MDS models@ in P\\s{RAAT}.")
-NORMAL (L"You can perform a Kruskal-type multidimensional scaling only on "
+MAN_BEGIN (U"Kruskal analysis", U"djmw", 19971201)
+INTRO (U"One of the @@MDS models@ in P\\s{RAAT}.")
+NORMAL (U"You can perform a Kruskal-type multidimensional scaling only on "
 	"objects of type @Dissimilarity. Objects of other types first have to "
 	"be converted to objects of Dissimilarity type.")
-ENTRY (L"Example")
-NORMAL (L"Convert a @Dissimilarity object into a @Configuration object.")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Configuration (monotone mds)...@")
-DEFINITION (L"choose appropriate parameters")
-LIST_ITEM (L"\\bu @@Dissimilarity & Configuration: Get stress (monotone mds)...@")
-DEFINITION (L"choose stress-1 to obtain the value for the @stress according "
+ENTRY (U"Example")
+NORMAL (U"Convert a @Dissimilarity object into a @Configuration object.")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Configuration (monotone mds)...@")
+DEFINITION (U"choose appropriate parameters")
+LIST_ITEM (U"\\bu @@Dissimilarity & Configuration: Get stress (monotone mds)...@")
+DEFINITION (U"choose stress-1 to obtain the value for the @stress according "
 	"to Kruskal.")
-ENTRY (L"How to get started")
-NORMAL (L"You can create an example @Dissimilarity object with the @@Create "
+ENTRY (U"How to get started")
+NORMAL (U"You can create an example @Dissimilarity object with the @@Create "
 	"letter R example...@ button which you can find under the "
 	"##Multidimensional scaling# option in the #New menu.")
 MAN_END
 
-MAN_BEGIN (L"MDS models", L"djmw", 20101109)
-INTRO (L"Multidimensional scaling (MDS) models are defined by specifying "
+MAN_BEGIN (U"MDS models", U"djmw", 20101109)
+INTRO (U"Multidimensional scaling (MDS) models are defined by specifying "
 	"how given @Dissimilarity data, %\\de__%ij_, are "
 	"mapped into distances of an %m-dimensional MDS @Configuration %#X. "
 	"The mapping is specified by a %%representation function%, %f : "
@@ -1342,11 +1342,11 @@ INTRO (L"Multidimensional scaling (MDS) models are defined by specifying "
 	"distances satisfy %f as closely as possible. "
 	"This closeness is quantified by a badness-of-fit measure which is often "
 	"called @stress.")
-ENTRY (L"Representation functions")
-NORMAL (L"In the application of MDS we try to find a configuration #X such that "
+ENTRY (U"Representation functions")
+NORMAL (U"In the application of MDS we try to find a configuration #X such that "
 	"the following relations are satisfied as well as possible:")
-FORMULA (L"%f(%\\de__%ij_) \\~~ %d__%ij_(#X)")
-NORMAL (L"The numbers that result from applying  %f on  %\\de__%ij_ are sometimes "
+FORMULA (U"%f(%\\de__%ij_) \\~~ %d__%ij_(#X)")
+NORMAL (U"The numbers that result from applying %f on %\\de__%ij_ are sometimes "
 	"called @disparities %d\\'p__%ij_. In most applications of MDS, besides "
 	"the configuration #X, also the function %f is not "
 	"completely specified, i.e., the exact parameters of %f are unknown and "
@@ -1356,282 +1356,281 @@ NORMAL (L"The numbers that result from applying  %f on  %\\de__%ij_ are sometime
 	"data. If the disparities are related to the proximities by a specific "
 	"parametric function we speak of %metric MDS otherwise we speak of "
 	"%ordinal or %%non-metric% MDS.")
-LIST_ITEM (L"\\bu %absolute mds: %d\\'p__%ij_ = \\de__%ij_")
-DEFINITION (L"No parameters need to be estimated.")
-LIST_ITEM (L"\\bu %ratio mds: %d\\'p__%ij_ = %b \\.c \\de__%ij_,")
-DEFINITION (L"where the value of %b can be estimated by a linear regression of "
+LIST_ITEM (U"\\bu %absolute mds: %d\\'p__%ij_ = \\de__%ij_")
+DEFINITION (U"No parameters need to be estimated.")
+LIST_ITEM (U"\\bu %ratio mds: %d\\'p__%ij_ = %b \\.c \\de__%ij_,")
+DEFINITION (U"where the value of %b can be estimated by a linear regression of "
 	"%d__%ij_ on %\\de__%ij_.")
-LIST_ITEM (L"\\bu %interval mds: %d\\'p__%ij_ = %a + %b \\.c %\\de__%ij_,")
-DEFINITION (L"where the values of %a and %b can be estimated by a linear "
+LIST_ITEM (U"\\bu %interval mds: %d\\'p__%ij_ = %a + %b \\.c %\\de__%ij_,")
+DEFINITION (U"where the values of %a and %b can be estimated by a linear "
 	"regression of %d__%ij_ on %\\de__%ij_.")
-LIST_ITEM (L"\\bu %i-spline mds: %d\\'p__%ij_ = %i-spline(%\\de__%ij_),")
-DEFINITION (L"where %i-spline(\\.c) is a smooth monotonically increasing "
+LIST_ITEM (U"\\bu %i-spline mds: %d\\'p__%ij_ = %i-spline(%\\de__%ij_),")
+DEFINITION (U"where %i-spline(\\.c) is a smooth monotonically increasing "
 	"@spline curve. The conceptual idea is that it is not possible to map "
 	"all dissimilarities into disparities by one simple function.")
-LIST_ITEM (L"\\bu %monotone mds: %d\\'p__%ij_ = %monotone(\\de__%ij_),")
-DEFINITION (L"where %monotone(\\.c) is restricted to be a monotonic function "
+LIST_ITEM (U"\\bu %monotone mds: %d\\'p__%ij_ = %monotone(\\de__%ij_),")
+DEFINITION (U"where %monotone(\\.c) is restricted to be a monotonic function "
 	"that preserves the order of the dissimilarities:")
-FORMULA (L"if %\\de__%ij_ < %\\de__%kl_, then %d__%ij_(#X) < %d__%kl_(#X)")
-DEFINITION (L"If %\\de__%ij_ = %\\de__%kl_ and no particular constraint is involved for %d__%ij_(#X) "
+FORMULA (U"if %\\de__%ij_ < %\\de__%kl_, then %d__%ij_(#X) < %d__%kl_(#X)")
+DEFINITION (U"If %\\de__%ij_ = %\\de__%kl_ and no particular constraint is involved for %d__%ij_(#X) "
 	"and %d__%kl_(#X) this is referred to as the %%primary approach% to ties. The %%secondary "
 	"approach% to ties requires that if %\\de__%ij_ = %\\de__%kl_, then also %d__%ij_(#X) = %d__%kl_(#X).")
-NORMAL (L"More information on all aspects of multidimensional scaling can be found in: "
+NORMAL (U"More information on all aspects of multidimensional scaling can be found in: "
 	"@@Borg & Groenen (1997)@ and @@Ramsay (1988)@.")
-NORMAL (L"The most important object types used in Praat for MDS and the conversions between these types are "
+NORMAL (U"The most important object types used in Praat for MDS and the conversions between these types are "
 	"shown in the following figure.")
 PICTURE (6, 6, drawMDSClassRelations)
 MAN_END
 
-MAN_BEGIN (L"Measurement levels", L"djmw", 19970502)
-INTRO (L"According to the measurement theory of @@Stevens (1951)@, there are four measurement levels, namely "
+MAN_BEGIN (U"Measurement levels", U"djmw", 20151014)
+INTRO (U"According to the measurement theory of @@Stevens (1951)@, there are four measurement levels, namely "
 	"#Nominal, #Ordinal, #Interval and #Ratio. In the light of multidimensional scaling, the first "
 	"two levels, Nominal and Ordinal, are often called %non-%metric. The last two are %metric.")
 MAN_END
 
-MAN_BEGIN (L"Multidimensional scaling", L"djmw", 20140117)
-INTRO (L"This tutorial describes how you can use P\\s{RAAT} to "
-	"perform ##M#ulti##D#imensional ##S#caling (MDS) analysis.")
-NORMAL (L"MDS helps us to represent %dissimilarities between objects as "
+MAN_BEGIN (U"Multidimensional scaling", U"djmw", 20140117)
+INTRO (U"This tutorial describes how you can use P\\s{RAAT} to "
+	"perform ##M#ulti ##D#imensional ##S#caling (MDS) analysis.")
+NORMAL (U"MDS helps us to represent %dissimilarities between objects as "
 	"%distances in a %%Euclidean space%. In effect, the more dissimilar two "
 	"objects are, the larger the distance between the objects in the Euclidean "
 	"space should be. The data types in P\\s{RAAT} that "
 	"incorporate these notions are @Dissimilarity, @Distance and "
 	"@Configuration.")
-NORMAL (L"In essence, an MDS-analysis is performed when you select a "
+NORMAL (U"In essence, an MDS-analysis is performed when you select a "
 	"Dissimilarity object and choose one of the ##To Configuration (xxx)...# "
 	"commands to obtain a Configuration object. In the above, method (xxx) "
 	"represents on of the possible @@MDS models|multidimensional scaling "
 	"models at .")
-ENTRY (L"MDS-analysis")
-NORMAL (L"Let us first create a Dissimilarity object. You can for example "
+ENTRY (U"MDS-analysis")
+NORMAL (U"Let us first create a Dissimilarity object. You can for example "
 	"@@Dissimilarity|create a Dissimilarity object from a file at . Here we "
 	"will the use the Dissimilarity object from @@Create letter R example...|"
 	"the letter R example at . We have chosen the default value (32.5) for the "
 	"(uniform) noise range. Note that this may result in substantial "
 	"distortions between the dissimilarities and the distances.")
-NORMAL (L"Now you can do the following, for example:")
-NORMAL (L"Select the Dissimilarity and choose @@Dissimilarity: To Configuration "
-	"(monotone mds)...|To Configuration (monotone mds)...@, and  you perform "
+NORMAL (U"Now you can do the following, for example:")
+NORMAL (U"Select the Dissimilarity and choose @@Dissimilarity: To Configuration "
+	"(monotone mds)...|To Configuration (monotone mds)...@, and you perform "
 	"a @@Kruskal analysis|kruskal at -like multidimensional scaling which "
 	"results in a new "
 	"Configuration object. (This Configuration could subsequently be used as "
 	"the starting Configuration for a new MDS-analysis!).")
-NORMAL (L"Select the Configuration and choose @@Configuration: Draw...|Draw...@ "
-	"and the following picture will result")
+NORMAL (U"Select the Configuration and choose @@Configuration: Draw...|Draw...@ "
+	"and the following picture might result.")
 PICTURE (4.0, 4.0, drawLetterRConfigurationExample2)
-NORMAL (L"The following script summarizes:")
-CODE (L"dissimilarity = Create letter R example: 32.5")
-CODE (L"configuration = To Configuration (monotone mds): 2, \"Primary approach\", 0.00001, 50, 1")
-CODE (L"Draw: 1, 2, -0.8, 1.2, -0.8, 0.7, \"yes\"")
-ENTRY (L"Obtaining the stress value")
-NORMAL (L"Select the Dissimilarity and the Configuration together and query for "
+NORMAL (U"The following script summarizes:")
+CODE (U"dissimilarity = Create letter R example: 32.5")
+CODE (U"configuration = To Configuration (monotone mds): 2, \"Primary approach\", 0.00001, 50, 1")
+CODE (U"Draw: 1, 2, -0.8, 1.2, -0.8, 0.7, \"yes\"")
+ENTRY (U"Obtaining the stress value")
+NORMAL (U"Select the Dissimilarity and the Configuration together and query for "
 	"the @stress value with: "
 	"@@Dissimilarity & Configuration: Get stress (monotone mds)...|"
 	"Get stress (monotone mds)... at . ")
-NORMAL (L"The following script summarizes:")
-CODE (L"selectObject (dissimilarity, configuration)")
-CODE (L"Get stress (monotone mds): \"Primary approach\", \"Kruskals's "
+NORMAL (U"The following script summarizes:")
+CODE (U"selectObject: dissimilarity, configuration")
+CODE (U"Get stress (monotone mds): \"Primary approach\", \"Kruskals's "
 	"stress-1\"")
-ENTRY (L"The Shepard diagram")
-NORMAL (L"Select the Dissimilarity and the Configuration together to "
+ENTRY (U"The Shepard diagram")
+NORMAL (U"Select the Dissimilarity and the Configuration together to "
 	"@@Dissimilarity & Configuration: Draw Shepard diagram...|"
 	"draw the Shepard diagram at .")
 PICTURE (4.0, 4.0, drawLetterRShepard)
-NORMAL (L"The following script summarizes:")
-CODE (L"selectObject (dissimilarity, configuration)")
-CODE (L"Draw Shepard diagram: 0, 200, 0, 2.2, 1, \"+\", \"yes\"")
-ENTRY (L"The (monotone) regression")
-NORMAL (L"Select the Dissimilarity and the Configuration together to "
+NORMAL (U"The following script summarizes:")
+CODE (U"selectObject: dissimilarity, configuration")
+CODE (U"Draw Shepard diagram: 0, 200, 0, 2.2, 1, \"+\", \"yes\"")
+ENTRY (U"The (monotone) regression")
+NORMAL (U"Select the Dissimilarity and the Configuration together to "
 	"@@Dissimilarity & Configuration: Draw regression (monotone mds)...|"
 	"draw the monotone regression@ of distances on dissimilarities.")
 PICTURE (4.0, 4.0, drawLetterRRegression)
-NORMAL (L"The following script summarizes:")
-CODE (L"selectObject (dissimilarity, configuration)")
-CODE (L"Draw monotone regresion: \"Primary approach\", 0, 200, 0, 2.2, 1, \"+\", \"yes\"")
-NORMAL (L"When you enter %noiseRange = 0 in the form for the letter #R, perfect "
+NORMAL (U"The following script summarizes:")
+CODE (U"selectObject: dissimilarity, configuration")
+CODE (U"Draw monotone regresion: \"Primary approach\", 0, 200, 0, 2.2, 1, \"+\", \"yes\"")
+NORMAL (U"When you enter %noiseRange = 0 in the form for the letter #R, perfect "
 	"reconstruction is possible. The Shepard diagram then will show "
 	"a perfectly smooth monotonically increasing function.")
-ENTRY (L"Weighing the dissimilarities")
-NORMAL (L"When you can't have equal confidence in all the number in the "
+ENTRY (U"Weighing the dissimilarities")
+NORMAL (U"When you can't have equal confidence in all the number in the "
 	"Dissimilarity object, you can give different weights to these numbers by "
 	"associating a @Weight object with the Dissimilarity object. "
 	"An easy way to do this is to select the Dissimilarity object and first "
 	"choose @@Dissimilarity: To Weight|To Weight at . Then you might change the "
 	"individual weights in the Weight object with the @@TableOfReal: Set "
 	"value...| Set value...@ command (remember: make %w__%ij_ = %w__%ji_).")
-NORMAL (L"The following script summarizes:")
-CODE (L"selectObject (dissimilarity)")
-CODE (L"weight = To Weight")
-CODE (L"! Change [i][j] and [j][i] cells in the Weight object")
-CODE (L"Set value: i, j, val")
-CODE (L"Set value: j, i, val")
-CODE (L"...")
-CODE (L"! now we can do a weighed analysis.")
-CODE (L"selectObject (dissimilarity, weight)")
-CODE (L"To Configuration (monotone mds): 2, \"Primary approach\", 0.00001, 50, 1)")
-NORMAL (L"You can also query the @stress values with three objects selected. "
+NORMAL (U"The following script summarizes:")
+CODE (U"selectObject: dissimilarity")
+CODE (U"weight = To Weight")
+CODE (U"! Change [i][j] and [j][i] cells in the Weight object")
+CODE (U"Set value: i, j, val")
+CODE (U"Set value: j, i, val")
+CODE (U"...")
+CODE (U"! now we can do a weighed analysis.")
+CODE (U"selectObject: dissimilarity, weight")
+CODE (U"To Configuration (monotone mds): 2, \"Primary approach\", 0.00001, 50, 1)")
+NORMAL (U"You can also query the @stress values with three objects selected. "
 	"The following script summarizes:")
-CODE (L"selectObject (dissimilarity, weight, configuration)")
-CODE (L"Get stress (monotone mds): \"Primary approach\", \"Kruskals's "
-	"stress-1\"")
-ENTRY (L"Using a start Configuration")
-NORMAL (L"You could also use a Configuration object as a starting "
+CODE (U"selectObject: dissimilarity, weight, configuration")
+CODE (U"Get stress (monotone mds): \"Primary approach\", \"Kruskals's stress-1\"")
+ENTRY (U"Using a start Configuration")
+NORMAL (U"You could also use a Configuration object as a starting "
 	"configuration in the minimization process. "
-	"Lets assume that you are not satisfied with the stress value from the "
+	"Let's assume that you are not satisfied with the stress value from the "
 	"Configuration object that you obtained in the previous analysis. "
 	"You can than use this Configuration object as a "
 	"starting point for further analysis:")
-NORMAL (L"The following script summarizes:")
-CODE (L"selectObject (dissimilarity, configuration, weight)")
-CODE (L"To Configuration (monotone mds): 2, \"Primary approach\", 0.00001, 50, 1")
-ENTRY (L"Multiple Dissimilarity's (INDSCAL)")
-NORMAL (L"When you have multiple Dissimilarity objects you can also perform "
+NORMAL (U"The following script summarizes:")
+CODE (U"selectObject: dissimilarity, configuration, weight")
+CODE (U"To Configuration (monotone mds): 2, \"Primary approach\", 0.00001, 50, 1")
+ENTRY (U"Multiple Dissimilarity's (INDSCAL)")
+NORMAL (U"When you have multiple Dissimilarity objects you can also perform "
 	"@@individual difference scaling@ (often called @@INDSCAL analysis@). ")
-NORMAL (L"As an example we can use an @@Create INDSCAL Carroll & Wish "
+NORMAL (U"As an example we can use an @@Create INDSCAL Carroll & Wish "
 	"example...| example taken from Carrol & Wish at . "
 	"Because INDSCAL only works on metrical data, we cannot use Dissimilarity "
 	"objects directly. We have to transform them first @@Dissimilarity: To "
 	"Distance...|to Distance@ objects.")
-NORMAL (L"This type of analysis on multiple objects results in two new objects: "
+NORMAL (U"This type of analysis on multiple objects results in two new objects: "
 	"a Configuration and a @Salience.")
 MAN_END
 
-MAN_BEGIN (L"Procrustes", L"djmw", 20010927)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type Procrustes represents the special @@AffineTransform|"
+MAN_BEGIN (U"Procrustes", U"djmw", 20010927)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type Procrustes represents the special @@AffineTransform|"
 	"affine transform@ that consists of a "
 	"combination of a translation, a shape preserving transformation and a scaling (this scaling is often called %dilation). "
 	"Because the transformation has to be shape preserving, only a combination of a rotation and a reflection is allowed. "
 	"A configuration matrix #%X is transformed in the following way to a new configuration matrix #%Y: ")
-FORMULA (L"#%Y = %s #%X #%T+ #1#%t',")
-NORMAL (L"where %s is the scaling factor, #%T is the shape preserving transformation matrix, #%t is the translation vector, "
+FORMULA (U"#%Y = %s #%X #%T+ #1#%t',")
+NORMAL (U"where %s is the scaling factor, #%T is the shape preserving transformation matrix, #%t is the translation vector, "
 	"and #1 is the vector with only ones as its elements.")
-NORMAL (L"For more information about the Procrustes transform and its algorithm "
+NORMAL (U"For more information about the Procrustes transform and its algorithm "
 	"see chapter 19 in @@Borg & Groenen (1997)@.")
 MAN_END
 
-MAN_BEGIN (L"Procrustes transform", L"djmw", 19980119)
-INTRO (L"A transformation that only uses a combination of a translation, "
+MAN_BEGIN (U"Procrustes transform", U"djmw", 19980119)
+INTRO (U"A transformation that only uses a combination of a translation, "
 	"a scaling and a rigid transformation to transform one Configuration such that it "
 	"matches as closely as possible another Configuration. ")
-NORMAL (L"We speak of %%orthogonal Procrustes transform% when only the rigid "
+NORMAL (U"We speak of %%orthogonal Procrustes transform% when only the rigid "
 	"transformation is allowed but no scaling or translation.")
-NORMAL (L"For more information about the Procrustes transform and its algorithm "
+NORMAL (U"For more information about the Procrustes transform and its algorithm "
 	"see chapter 19 in @@Borg & Groenen (1997)@.")
 MAN_END
 
-MAN_BEGIN (L"Proximity", L"djmw", 19961008)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type #Proximity represents proximities between objects.")
-ENTRY (L"Inside a Proximity")
-NORMAL (L"With @Inspect you will see the following attributes:")
-TAG (L"%numberOfRows, %numberOfColumns")
-DEFINITION (L"the number of objects (%numberOfRows and %numberOfColumns are "
+MAN_BEGIN (U"Proximity", U"djmw", 19961008)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type #Proximity represents proximities between objects.")
+ENTRY (U"Inside a Proximity")
+NORMAL (U"With @Inspect you will see the following attributes:")
+TAG (U"%numberOfRows, %numberOfColumns")
+DEFINITION (U"the number of objects (%numberOfRows and %numberOfColumns are "
 	"equal and \\>_1).")
-TAG (L"%rowLabels, %columnLabels")
-DEFINITION (L"the names associated with the objects (%rowLabels and "
+TAG (U"%rowLabels, %columnLabels")
+DEFINITION (U"the names associated with the objects (%rowLabels and "
 	"%columnLabels are equal.")
-TAG (L"%data [1..%numberOfRows][1..%numberOfColumns]")
-DEFINITION (L"the proximities between the objects.")
+TAG (U"%data [1..%numberOfRows][1..%numberOfColumns]")
+DEFINITION (U"the proximities between the objects.")
 MAN_END
 
-MAN_BEGIN (L"Salience", L"djmw", 19980112)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"Elements %s__%ij_ in the "
+MAN_BEGIN (U"Salience", U"djmw", 19980112)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"Elements %s__%ij_ in the "
 	"Salience matrix represent the importance of dimension %j (in the "
 	"@Configuration) for data source %i.")
-ENTRY (L"Commands")
-NORMAL (L"Creation, as a by-product of:")
-LIST_ITEM (L"\\bu @@Distance: To Configuration (indscal)...")
-LIST_ITEM (L"\\bu @@Distance: To Configuration (ytl)...")
+ENTRY (U"Commands")
+NORMAL (U"Creation, as a by-product of:")
+LIST_ITEM (U"\\bu @@Distance: To Configuration (indscal)...")
+LIST_ITEM (U"\\bu @@Distance: To Configuration (ytl)...")
 MAN_END
 
-MAN_BEGIN (L"ScalarProduct", L"djmw", 19980125)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type ScalarProduct represents scalar products %b__%ij_ "
+MAN_BEGIN (U"ScalarProduct", U"djmw", 19980125)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type ScalarProduct represents scalar products %b__%ij_ "
 	"between objects %i and %j in a metrical space.")
-FORMULA (L"%b__%ij_ = \\su__%k=1..%numberOfDimensions_ %x__%ik_%x__%jk_,")
-NORMAL (L"where %x__%ik_ and %x__%jk_ are the coordinates of the %k-th "
+FORMULA (U"%b__%ij_ = \\su__%k=1..%numberOfDimensions_ %x__%ik_%x__%jk_,")
+NORMAL (U"where %x__%ik_ and %x__%jk_ are the coordinates of the %k-th "
 	"dimension of points %i and %j, respectively. From this definition one "
 	"can see that scalar products, in contrast to distances, "
 	"do change when the origin is shifted.")
-NORMAL (L"Creation")
-LIST_ITEM (L"\\bu @@Distance: To ScalarProduct...@")
+NORMAL (U"Creation")
+LIST_ITEM (U"\\bu @@Distance: To ScalarProduct...@")
 MAN_END
 
-MAN_BEGIN (L"Similarity", L"djmw", 19961008)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type Similarity represent a one-way "
+MAN_BEGIN (U"Similarity", U"djmw", 19961008)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type Similarity represent a one-way "
 	"table of similarities between \"objects\".")
-ENTRY (L"Commands")
-NORMAL (L"Creation")
-LIST_ITEM (L"\\bu @@Confusion: To Similarity...")
-NORMAL (L"Drawing")
-LIST_ITEM (L"\\bu ##Draw as numbers...")
-LIST_ITEM (L"\\bu ##Draw as squares...")
-NORMAL (L"Query")
-LIST_ITEM (L"\\bu ##Get column mean (index)...")
-LIST_ITEM (L"\\bu ##Get column mean (label)...")
-LIST_ITEM (L"\\bu ##Get column stdev (index)...")
-LIST_ITEM (L"\\bu ##Get column stdev (label)...")
-NORMAL (L"Modification")
-LIST_ITEM (L"\\bu ##Formula...")
-LIST_ITEM (L"\\bu ##Remove column (index)...")
-LIST_ITEM (L"\\bu ##Insert column (index)...")
-LIST_ITEM (L"\\bu ##Set row label (index)...")
-LIST_ITEM (L"\\bu ##Set row label (label)...")
-LIST_ITEM (L"\\bu ##Set column label (index)...")
-LIST_ITEM (L"\\bu ##Set column label (label)...")
-NORMAL (L"Analysis")
-LIST_ITEM (L"\\bu @@Similarity: To Dissimilarity...")
-MAN_END
-
-MAN_BEGIN (L"Similarity: To Dissimilarity...", L"djmw", 20040407)
-INTRO (L"A command that creates a @Dissimilarity from every selected "
+ENTRY (U"Commands")
+NORMAL (U"Creation")
+LIST_ITEM (U"\\bu @@Confusion: To Similarity...")
+NORMAL (U"Drawing")
+LIST_ITEM (U"\\bu ##Draw as numbers...")
+LIST_ITEM (U"\\bu ##Draw as squares...")
+NORMAL (U"Query")
+LIST_ITEM (U"\\bu ##Get column mean (index)...")
+LIST_ITEM (U"\\bu ##Get column mean (label)...")
+LIST_ITEM (U"\\bu ##Get column stdev (index)...")
+LIST_ITEM (U"\\bu ##Get column stdev (label)...")
+NORMAL (U"Modification")
+LIST_ITEM (U"\\bu ##Formula...")
+LIST_ITEM (U"\\bu ##Remove column (index)...")
+LIST_ITEM (U"\\bu ##Insert column (index)...")
+LIST_ITEM (U"\\bu ##Set row label (index)...")
+LIST_ITEM (U"\\bu ##Set row label (label)...")
+LIST_ITEM (U"\\bu ##Set column label (index)...")
+LIST_ITEM (U"\\bu ##Set column label (label)...")
+NORMAL (U"Analysis")
+LIST_ITEM (U"\\bu @@Similarity: To Dissimilarity...")
+MAN_END
+
+MAN_BEGIN (U"Similarity: To Dissimilarity...", U"djmw", 20040407)
+INTRO (U"A command that creates a @Dissimilarity from every selected "
 	"@Similarity.")
-ENTRY (L"Setting")
-TAG (L"##Maximum dissimilarity")
-DEFINITION (L"determines the maximum dissimilarity possible. When the default "
+ENTRY (U"Setting")
+TAG (U"##Maximum dissimilarity")
+DEFINITION (U"determines the maximum dissimilarity possible. When the default "
 	"value, 0.0, is chchosen%maximumDissimilarity "
 	"is calculated as the maximum element in the Similarity object.")
-ENTRY (L"Algorithm")
-NORMAL (L"To obtain dissimilarities we 'reverse' similarities:")
-FORMULA (L"%%dissimilarity__%ij_ = %maximumDissimilarity \\-- %similarity__%ij_")
-NORMAL (L"In this way the order of dissimilarities is the reverse of the order "
+ENTRY (U"Algorithm")
+NORMAL (U"To obtain dissimilarities we 'reverse' similarities:")
+FORMULA (U"%%dissimilarity__%ij_ = %maximumDissimilarity \\-- %similarity__%ij_")
+NORMAL (U"In this way the order of dissimilarities is the reverse of the order "
 	"of the similarities.")
 MAN_END
 
-MAN_BEGIN (L"smacof", L"djmw", 19980119)
-INTRO (L"Scaling by Majorizing a Complicated Function, the iterative algorithm "
+MAN_BEGIN (U"smacof", U"djmw", 19980119)
+INTRO (U"Scaling by Majorizing a Complicated Function, the iterative algorithm "
 	"to find an optimal Configuration.")
-LIST_ITEM (L"1.  Initialize")
-LIST_ITEM (L"   1.a. Get initial Configuration #Z")
-LIST_ITEM (L"   1.b. Set stress %\\si__%n_^^[0]^ to a very large value.")
-LIST_ITEM (L"   1.c. Set iteration counter %k = 0")
-LIST_ITEM (L"2.  Increase iteration counter by one: %k = %k + 1")
-LIST_ITEM (L"3.  Calculate distances %d__%ij_(#Z).")
-LIST_ITEM (L"4.  Transform dissimilarities %\\de__%ij_ into disparities "
+LIST_ITEM (U"1.  Initialize")
+LIST_ITEM (U"   1.a. Get initial Configuration #Z")
+LIST_ITEM (U"   1.b. Set stress %\\si__%n_^^[0]^ to a very large value.")
+LIST_ITEM (U"   1.c. Set iteration counter %k = 0")
+LIST_ITEM (U"2.  Increase iteration counter by one: %k = %k + 1")
+LIST_ITEM (U"3.  Calculate distances %d__%ij_(#Z).")
+LIST_ITEM (U"4.  Transform dissimilarities %\\de__%ij_ into disparities "
 	"%d\\'p__%ij_.")
-LIST_ITEM (L"5.  Standardize the disparities so that %\\et__%d\\'p_^2 = "
+LIST_ITEM (U"5.  Standardize the disparities so that %\\et__%d\\'p_^2 = "
 	"%n(%n\\--1)/2.")
-LIST_ITEM (L"6.  Compute the Guttman transform #X^^[%k]^ of #Z.")
-LIST_ITEM (L"7.  Compute new distances %d__%ij_(#X^^[%k]^).")
-LIST_ITEM (L"8.  Compute normalized stress %\\si__%n_ (#d\\'p, #X^^[%k]^)")
-LIST_ITEM (L"9.  If |%\\si__%n_^^[%k]^ \\-- %\\si__%n_^^[%k\\--1]^| / %\\si__%n_"
+LIST_ITEM (U"6.  Compute the Guttman transform #X^^[%k]^ of #Z.")
+LIST_ITEM (U"7.  Compute new distances %d__%ij_(#X^^[%k]^).")
+LIST_ITEM (U"8.  Compute normalized stress %\\si__%n_ (#d\\'p, #X^^[%k]^)")
+LIST_ITEM (U"9.  If |%\\si__%n_^^[%k]^ \\-- %\\si__%n_^^[%k\\--1]^| / %\\si__%n_"
 	"^^[%k\\--1]^ < %\\ep or %k > %maximumNumberOfIterations, then stop")
-LIST_ITEM (L"10. Set #Z = #X^^[%k]^, and go to 2.")
-NORMAL (L"This algorithm goes back to @@De Leeuw (1977)@.")
+LIST_ITEM (U"10. Set #Z = #X^^[%k]^, and go to 2.")
+NORMAL (U"This algorithm goes back to @@De Leeuw (1977)@.")
 MAN_END
 
-MAN_BEGIN (L"spline", L"djmw", 20121101)
-INTRO (L"A spline function %f is a piecewise polynomial function defined on "
+MAN_BEGIN (U"spline", U"djmw", 20121101)
+INTRO (U"A spline function %f is a piecewise polynomial function defined on "
 	"an interval [%x__%min_, %x__%max_] "
 	"with specified continuity constraints, i.e., when the interval [%x__%min_,"
 	" %x__%max_] is subdivided by points %\\xi__%i_ such that %x__%min_ = "
 	"%\\xi__%1_ < ... < %\\xi__%q_ = %%x__%max_, then within each subinterval "
 	"[%\\xi__%j_, %\\xi__%j+1_) the function is a polynomial %P__%j_ of "
 	"specified degree %k.")
-NORMAL (L"A %%knot sequence% %t = {%t__1_, ..., %t__%n+%k_}, where %n is the "
+NORMAL (U"A %%knot sequence% %t = {%t__1_, ..., %t__%n+%k_}, where %n is the "
 	"number of free parameters that specify the spline function, is derived "
 	"from the %\\xi__%i_ by placing knots at the boundary values %\\xi__%i_ "
 	"according to the order of continuity at that boundary. The most common "
@@ -1644,75 +1643,75 @@ NORMAL (L"A %%knot sequence% %t = {%t__1_, ..., %t__%n+%k_}, where %n is the "
 	"This is called a %simple knot sequence, because all interior knots are "
 	"simple. The number of free parameters %n for this case obeys a simple "
 	"formula:")
-FORMULA (L"%n = %numberOfInteriorKnots + %order.")
-NORMAL (L"With suitable basis functions, for example, the M-spline family "
+FORMULA (U"%n = %numberOfInteriorKnots + %order.")
+NORMAL (U"With suitable basis functions, for example, the M-spline family "
 	"%M__%i_(%x|%k, %t), %i=1..%n, we can write any spline %f in the form:")
-FORMULA (L"%f = \\su__%i=1..%n_ %a__%i_%M__%i_,")
-NORMAL (L"where the %M__%i_ are defined by the following recursive formula's:")
-FORMULA (L"%M__%i_(%x|1,%t) = 1 / (%t__%i+1_ \\-- %t__%i_),           %t__%i_ "
+FORMULA (U"%f = \\su__%i=1..%n_ %a__%i_%M__%i_,")
+NORMAL (U"where the %M__%i_ are defined by the following recursive formula's:")
+FORMULA (U"%M__%i_(%x|1,%t) = 1 / (%t__%i+1_ \\-- %t__%i_),           %t__%i_ "
 	"\\<_ %x < %t__%i+1_, 0 otherwise")
-FORMULA (L"%M__%i_(%x|%k,%t) = %k [(%x\\--%t__%i_)%M__%i_(%x|%k\\--1,%t) + "
+FORMULA (U"%M__%i_(%x|%k,%t) = %k [(%x\\--%t__%i_)%M__%i_(%x|%k\\--1,%t) + "
 	"(%t__%i+%k_\\--%x)%M__%i+1_(%x|%k\\--1,%t)] / "
 	"((%k\\--1)(%t__%i+%k_\\--%t__%i_))")
-NORMAL (L"These %M__%i_ are localized because %M__%i_(%x|%k,%t) > 0 only when "
+NORMAL (U"These %M__%i_ are localized because %M__%i_(%x|%k,%t) > 0 only when "
 	"%t__%i_ \\<_ %x < %t__%i+%k_ and zero otherwise. Also, we have \\in"
 	" M__%i_(%x)%dx = 1. Because of this localization a change in coefficient "
 	"%a__%i_ will only effect %f within this interval.")
-NORMAL (L"The following picture shows an M-spline of order 3 on the interval "
+NORMAL (U"The following picture shows an M-spline of order 3 on the interval "
 	"[0, 1], with three interior knots at 0.3, 0.5 and 0.6.")
 PICTURE (5.0, 5.0, drawMsplineExample)
-NORMAL (L"Because the M-splines are nonnegative, %monotone splines% can be "
+NORMAL (U"Because the M-splines are nonnegative, %monotone splines% can be "
 	"derived from them by %integration:")
-FORMULA (L"%I__%i_(%x|%k,%t) = \\in__%xmin_^%x %M__%i_(%u|%k,%t) %du")
-NORMAL (L"Because each %M__%i_(%x|%k, %t) is a piecewise polynomial of degree"
+FORMULA (U"%I__%i_(%x|%k,%t) = \\in__%xmin_^%x %M__%i_(%u|%k,%t) %du")
+NORMAL (U"Because each %M__%i_(%x|%k, %t) is a piecewise polynomial of degree"
 	" %k\\--1, each %I__%i_ will be of degree %k. Now we can write:")
-FORMULA (L"%f = \\su__%i=1..%n_ %b__%i_%I__%i_(%x|%k,%t)")
-NORMAL (L"We can use an M-spline of order %k+1 with a simple knot sequence %t, "
+FORMULA (U"%f = \\su__%i=1..%n_ %b__%i_%I__%i_(%x|%k,%t)")
+NORMAL (U"We can use an M-spline of order %k+1 with a simple knot sequence %t, "
 	"for which %t__%j_ \\<_ x < %t__%j+1_, to put "
 	"the I-spline of order %k into a more convenient form:")
-FORMULA (L"%I__%i_(%x|%k,%t) = 0,     %i > %j")
-FORMULA (L"%I__%i_(%x|%k,%t) = \\su__%m=%i+1..%j_ (%t__%m+%k+1_\\--"
+FORMULA (U"%I__%i_(%x|%k,%t) = 0,     %i > %j")
+FORMULA (U"%I__%i_(%x|%k,%t) = \\su__%m=%i+1..%j_ (%t__%m+%k+1_\\--"
 	"%t__%m_)%M__%m_(%x|%k+1,%t)/(%k+1),     %j\\--%k \\<_ %i \\<_ %j")
-FORMULA (L"%I__%i_(%x|%k,%t) = 1,     %i < %j\\--%k")
-NORMAL (L"The following figure shows the I-splines that were derived from "
+FORMULA (U"%I__%i_(%x|%k,%t) = 1,     %i < %j\\--%k")
+NORMAL (U"The following figure shows the I-splines that were derived from "
 	"the M-splines above.")
 PICTURE (5.0, 5.0, drawIsplineExample)
-NORMAL (L"These spline formula's were taken from @@Ramsay (1988)@ and the "
+NORMAL (U"These spline formula's were taken from @@Ramsay (1988)@ and the "
 	"errors in his I-spline formulas were corrected.")
 MAN_END
 
-MAN_BEGIN (L"stress", L"djmw", 19980108)
-INTRO (L"A badness-of-fit measure for the entire MDS representation.")
-NORMAL (L"Several measures exist.")
-ENTRY (L"Raw stress")
-FORMULA (L"%\\si__%r_ (#d\\'p, #X) = \\su__%i<%j_ %w__%ij_(%d\\'p__%ij_ \\-- "
+MAN_BEGIN (U"stress", U"djmw", 19980108)
+INTRO (U"A badness-of-fit measure for the entire MDS representation.")
+NORMAL (U"Several measures exist.")
+ENTRY (U"Raw stress")
+FORMULA (U"%\\si__%r_ (#d\\'p, #X) = \\su__%i<%j_ %w__%ij_(%d\\'p__%ij_ \\-- "
 	"%d__%ij_(#X))^2")
-FORMULA (L"= \\su__%i<%j_ %w__%ij_%d\\'p__%ij_^2 + \\su__%i<%j_ "
+FORMULA (U"= \\su__%i<%j_ %w__%ij_%d\\'p__%ij_^2 + \\su__%i<%j_ "
 	"%w__%ij_%d__%ij_^2(#X) \\-- "
 	"2 \\su__%i<%j_ %w__%ij_%d\\'p__%ij_%d__%ij_(#X)")
-FORMULA (L"= %\\et__%d\\'p_^2 + %\\et^2(#X) \\-- 2%\\ro(#d\\'p, #X)")
-NORMAL (L"where the %d\\'p__%ij_ are the @disparities that are the result "
+FORMULA (U"= %\\et__%d\\'p_^2 + %\\et^2(#X) \\-- 2%\\ro(#d\\'p, #X)")
+NORMAL (U"where the %d\\'p__%ij_ are the @disparities that are the result "
 	"from the transformation of the dissimilarities, i.e., %f(%\\de__%ij_). "
 	"Raw stress can be misleading because it is dependent on the normalization "
 	"of the disparities. The following measure tries to circumvent this "
 	"inconvenience.")
-ENTRY (L"Normalized stress")
-FORMULA (L"%\\si__%n_ = \\si__%r_ / %\\et__%d\\'p_^2")
-NORMAL (L"This is the stress function that we minimize by iterative "
+ENTRY (U"Normalized stress")
+FORMULA (U"%\\si__%n_ = \\si__%r_ / %\\et__%d\\'p_^2")
+NORMAL (U"This is the stress function that we minimize by iterative "
 	"majorization. It goes back to @@De Leeuw (1977)@.")
-ENTRY (L"Kruskal's stress-1")
-FORMULA (L"%\\si__1_ = \\Vr (\\su__%i<%j_ %w__%ij_(%d\\'p__%ij_ \\-- "
+ENTRY (U"Kruskal's stress-1")
+FORMULA (U"%\\si__1_ = \\Vr (\\su__%i<%j_ %w__%ij_(%d\\'p__%ij_ \\-- "
 	"%d__%ij_(#X))^2 / \\su__%i<%j_ %w__%ij_%d__%ij_^2(#X))^^1/2^")
-NORMAL (L"In this measure, which is due to @@Kruskal (1964)@, stress is "
+NORMAL (U"In this measure, which is due to @@Kruskal (1964)@, stress is "
 	"expressed in relation to the size of #X.")
-ENTRY (L"Kruskal's stress-2")
-FORMULA (L"%\\si__2_ = \\Vr (\\su__%i<%j_ %w__%ij_(%d\\'p__%ij_ \\-- "
+ENTRY (U"Kruskal's stress-2")
+FORMULA (U"%\\si__2_ = \\Vr (\\su__%i<%j_ %w__%ij_(%d\\'p__%ij_ \\-- "
 	"%d__%ij_(#X))^2 / \\su__%i<%j_ %w__%ij_(%d__%ij_(#X) - "
 	"%averageDistance)^2)^^1/2^.")
-NORMAL (L"In general, this measure results in a stress value that is "
+NORMAL (U"In general, this measure results in a stress value that is "
 	"approximately twice the value for stress-1.")
-ENTRY (L"Relation between %\\si__1_ and %\\si__n_")
-NORMAL (L"When we have calculated %\\si__%n_ for Configuration #X, "
+ENTRY (U"Relation between %\\si__1_ and %\\si__n_")
+NORMAL (U"When we have calculated %\\si__%n_ for Configuration #X, "
 	"disparities #d\\'p and Weight #W we cannot "
 	"directly use #X, #d\\'p and #W to calculate %\\si__1_ because the "
 	"scale of #X is not necessarily optimal "
@@ -1720,249 +1719,249 @@ NORMAL (L"When we have calculated %\\si__%n_ for Configuration #X, "
 	"try to calculate  %\\si__1_ (#d\\'p, %b #X). We minimize the resulting "
 	"expression for %b and substitute "
 	"the result back into the formula for stress, i.e.,")
-FORMULA (L"%\\si__1_^2 (#d\\'p, %b #X) = (%\\et__%d\\'p_^2 + %b^2 %\\et^2(#X) "
+FORMULA (U"%\\si__1_^2 (#d\\'p, %b #X) = (%\\et__%d\\'p_^2 + %b^2 %\\et^2(#X) "
 	"\\-- 2 %b %\\ro(#d\\'p, #X)) / %b^2 %\\et^2(#X)")
-FORMULA (L"d%\\si__1_^2 (%b) / d%b == 0, gives")
-FORMULA (L"%b = %\\et__%d\\'p_^2 / %\\ro")
-FORMULA (L"%\\si__1_^2 =  (1 - %\\ro^2 / (%\\et__%d\\'p_^2\\.c%\\et^2(#X)))")
-NORMAL (L"This means that %\\si__1_ = \\Vr %\\si__%n_.")
-ENTRY (L"Relation between %\\si__2_ and %\\si__n_")
-NORMAL (L"We can do the same trick as before for %\\si__2_:")
-FORMULA (L"%\\si__2_^2 (#d\\'p, %b #X) = (%\\et__%d\\'p_^2 + %b^2 %\\et^2(#X) "
+FORMULA (U"d%\\si__1_^2 (%b) / d%b == 0, gives")
+FORMULA (U"%b = %\\et__%d\\'p_^2 / %\\ro")
+FORMULA (U"%\\si__1_^2 =  (1 - %\\ro^2 / (%\\et__%d\\'p_^2\\.c%\\et^2(#X)))")
+NORMAL (U"This means that %\\si__1_ = \\Vr %\\si__%n_.")
+ENTRY (U"Relation between %\\si__2_ and %\\si__n_")
+NORMAL (U"We can do the same trick as before for %\\si__2_:")
+FORMULA (U"%\\si__2_^2 (#d\\'p, %b #X) = (%\\et__%d\\'p_^2 + %b^2 %\\et^2(#X) "
 	"\\-- 2 %b %\\ro(#d\\'p, #X)) / "
 	"(%b^2 \\su__%i<%j_ %w__%ij_(%d__%ij_(#X) - %averageDistance)^2)")
-NORMAL (L"From which we derive:")
-FORMULA (L"%\\si__2_ = \\Vr ((%\\et__%d\\'p_^2 \\.c %\\et^2(#X) - "
+NORMAL (U"From which we derive:")
+FORMULA (U"%\\si__2_ = \\Vr ((%\\et__%d\\'p_^2 \\.c %\\et^2(#X) - "
 	"%\\ro^2(#d\\'p, #X)) / (%\\et__%d\\'p_^2 \\.c \\su__%i<%j_ "
 	"%w__%ij_(%d__%ij_(#X) - %averageDistance)^2))")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Centre columns", L"djmw", 19980422)
-INTRO (L"A command that centres the columns in the selected @TableOfReal "
+MAN_BEGIN (U"TableOfReal: Centre columns", U"djmw", 19980422)
+INTRO (U"A command that centres the columns in the selected @TableOfReal "
 	"objects.")
-ENTRY (L"Algorithm")
-NORMAL (L"The new values in the table, %x\\'p__%ij_, will be:")
-FORMULA (L"%x\\'p__%ij_ = %x__%ij_ \\-- %x__\\.c%j_,")
-NORMAL (L"where")
-FORMULA (L"%x__\\.c%j_ = \\su__%i=1..%numberOfRows_ %x__%ij_ / %numberOfRows,")
-NORMAL (L"the average of column %j.")
-MAN_END
-
-MAN_BEGIN (L"TableOfReal: Centre rows", L"djmw", 19980422)
-INTRO (L"A command that centres the rows in the selected @TableOfReal objects.")
-ENTRY (L"Algorithm")
-NORMAL (L"The new values in the table, %x\\'p__%ij_, will be:")
-FORMULA (L"%x\\'p__%ij_ = %x__%ij_ \\-- %x__%i\\.c_,")
-NORMAL (L"where")
-FORMULA (L"%x__%i\\.c_ = \\su__%j=1..%numberOfColumns_ %x__%ij_ / "
+ENTRY (U"Algorithm")
+NORMAL (U"The new values in the table, %x\\'p__%ij_, will be:")
+FORMULA (U"%x\\'p__%ij_ = %x__%ij_ \\-- %x__\\.c%j_,")
+NORMAL (U"where")
+FORMULA (U"%x__\\.c%j_ = \\su__%i=1..%numberOfRows_ %x__%ij_ / %numberOfRows,")
+NORMAL (U"the average of column %j.")
+MAN_END
+
+MAN_BEGIN (U"TableOfReal: Centre rows", U"djmw", 19980422)
+INTRO (U"A command that centres the rows in the selected @TableOfReal objects.")
+ENTRY (U"Algorithm")
+NORMAL (U"The new values in the table, %x\\'p__%ij_, will be:")
+FORMULA (U"%x\\'p__%ij_ = %x__%ij_ \\-- %x__%i\\.c_,")
+NORMAL (U"where")
+FORMULA (U"%x__%i\\.c_ = \\su__%j=1..%numberOfColumns_ %x__%ij_ / "
 	"%numberOfColumns,")
-NORMAL (L"the average of row %i.")
+NORMAL (U"the average of row %i.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Get table norm", L"djmw", 19980422)
-INTRO (L"A command that returns the norm of the selected @TableOfReal object.")
-ENTRY (L"Algorithm")
-NORMAL (L"Returns: sqrt (\\su__%i=1..%numberOfRows_ \\su__%j=1..%numberOfColumns"
+MAN_BEGIN (U"TableOfReal: Get table norm", U"djmw", 19980422)
+INTRO (U"A command that returns the norm of the selected @TableOfReal object.")
+ENTRY (U"Algorithm")
+NORMAL (U"Returns: sqrt (\\su__%i=1..%numberOfRows_ \\su__%j=1..%numberOfColumns"
 	"_ %x__%ij_^2).")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Normalize columns...", L"djmw", 19980422)
-INTRO (L"A command that normalizes the columns in the selected @TableOfReal "
+MAN_BEGIN (U"TableOfReal: Normalize columns...", U"djmw", 19980422)
+INTRO (U"A command that normalizes the columns in the selected @TableOfReal "
 	"objects.")
-ENTRY (L"Setting")
-TAG (L"##Norm")
-DEFINITION (L"determines the sum of the squared elements in each column after "
+ENTRY (U"Setting")
+TAG (U"##Norm")
+DEFINITION (U"determines the sum of the squared elements in each column after "
 	"normalization.")
-ENTRY (L"Algorithm")
-NORMAL (L"All elements %x__%ij_ in each column %j=1..%numberOfColumns will be "
+ENTRY (U"Algorithm")
+NORMAL (U"All elements %x__%ij_ in each column %j=1..%numberOfColumns will be "
 	"multiplied by sqrt (%norm / \\su__%i=1..%numberOfRows_ %x__%ij_^2).")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Normalize rows...", L"djmw", 19980422)
-INTRO (L"A command that normalizes the rows in the selected @TableOfReal "
+MAN_BEGIN (U"TableOfReal: Normalize rows...", U"djmw", 19980422)
+INTRO (U"A command that normalizes the rows in the selected @TableOfReal "
 	"objects.")
-ENTRY (L"Setting")
-TAG (L"##Norm")
-DEFINITION (L"determines the sum of the squared elements in each row after "
+ENTRY (U"Setting")
+TAG (U"##Norm")
+DEFINITION (U"determines the sum of the squared elements in each row after "
 	"normalization.")
-ENTRY (L"Algorithm")
-NORMAL (L"All elements %x__%ij_ in each row %i=1..%numberOfRows will be "
+ENTRY (U"Algorithm")
+NORMAL (U"All elements %x__%ij_ in each row %i=1..%numberOfRows will be "
 	"multiplied by sqrt (%norm / \\su__%j=1..%numberOfColumns_ %x__%ij_^2).")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Normalize table...", L"djmw", 19980422)
-INTRO (L"A command that normalizes the elements in the selected @TableOfReal "
+MAN_BEGIN (U"TableOfReal: Normalize table...", U"djmw", 19980422)
+INTRO (U"A command that normalizes the elements in the selected @TableOfReal "
 	"objects.")
-ENTRY (L"Setting")
-TAG (L"##Norm")
-DEFINITION (L"determines the sum of the squared elements after normalization.")
-ENTRY (L"Algorithm")
-NORMAL (L"All elements %x__%ij_ will be multiplied by "
+ENTRY (U"Setting")
+TAG (U"##Norm")
+DEFINITION (U"determines the sum of the squared elements after normalization.")
+ENTRY (U"Algorithm")
+NORMAL (U"All elements %x__%ij_ will be multiplied by "
 	"sqrt (%norm / \\su__%i=1..%numberOfRows_ \\su__%j=1..%numberOfColumns_"
 	" %x__%ij_^2.")
 MAN_END
 
-MAN_BEGIN (L"Weight", L"djmw", 19980108)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type Weight represents a matrix "
+MAN_BEGIN (U"Weight", U"djmw", 19980108)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type Weight represents a matrix "
 	"with weights %w__%ij_.")
-NORMAL (L"An object of type Weight selected together with an onject of type"
+NORMAL (U"An object of type Weight selected together with an onject of type"
 	" @Dissimilarity can be used to make distinctions in the importance of the"
 	" contribution of each individual dissimilarity %\\de__%ij_ to "
 	"@stress and therefore to the final configuration. Weights can be "
 	"used for instance to code for missing values, i.e., take %w__%ij_ = 0 if "
 	"dissimilarity %\\de__%ij_ is missing and %w__%ij_ = 1 if %\\de__%ij_ is"
 	" known.")
-ENTRY (L"Commands")
-NORMAL (L"Creation")
-LIST_ITEM (L"\\bu @@Dissimilarity: To Weight")
-NORMAL (L"Analysis")
-NORMAL (L"See @@Dissimilarity & Weight: To Configuration...@ for help on the "
+ENTRY (U"Commands")
+NORMAL (U"Creation")
+LIST_ITEM (U"\\bu @@Dissimilarity: To Weight")
+NORMAL (U"Analysis")
+NORMAL (U"See @@Dissimilarity & Weight: To Configuration...@ for help on the "
 	"following analysis items: ")
-LIST_ITEM (L"\\bu ##Dissimilarity & Weight: To Configuration (monotone mds)...")
-LIST_ITEM (L"\\bu ##Dissimilarity & Weight: To Configuration (i-spline mds)...")
-LIST_ITEM (L"\\bu ##Dissimilarity & Weight: To Configuration (interval mds)...")
-LIST_ITEM (L"\\bu ##Dissimilarity & Weight: To Configuration (ratio mds)...")
-LIST_ITEM (L"\\bu ##Dissimilarity & Weight: To Configuration (absolute mds)...")
-NORMAL (L"Query")
-NORMAL (L"See @@Dissimilarity & Configuration & Weight: Get stress...@ for help "
+LIST_ITEM (U"\\bu ##Dissimilarity & Weight: To Configuration (monotone mds)...")
+LIST_ITEM (U"\\bu ##Dissimilarity & Weight: To Configuration (i-spline mds)...")
+LIST_ITEM (U"\\bu ##Dissimilarity & Weight: To Configuration (interval mds)...")
+LIST_ITEM (U"\\bu ##Dissimilarity & Weight: To Configuration (ratio mds)...")
+LIST_ITEM (U"\\bu ##Dissimilarity & Weight: To Configuration (absolute mds)...")
+NORMAL (U"Query")
+NORMAL (U"See @@Dissimilarity & Configuration & Weight: Get stress...@ for help "
 	"on the following query items: ")
-LIST_ITEM (L"\\bu ##Dissimilarity & Configuration & Weight: Get stress "
+LIST_ITEM (U"\\bu ##Dissimilarity & Configuration & Weight: Get stress "
 	"(monotone mds)...")
-LIST_ITEM (L"\\bu ##Dissimilarity & Configuration & Weight: Get stress "
+LIST_ITEM (U"\\bu ##Dissimilarity & Configuration & Weight: Get stress "
 	"(i-spline mds)...")
-LIST_ITEM (L"\\bu ##Dissimilarity & Configuration & Weight: Get stress "
+LIST_ITEM (U"\\bu ##Dissimilarity & Configuration & Weight: Get stress "
 	"(interval mds)...")
-LIST_ITEM (L"\\bu ##Dissimilarity & Configuration & Weight: Get stress "
+LIST_ITEM (U"\\bu ##Dissimilarity & Configuration & Weight: Get stress "
 	"(ratio mds)...")
-LIST_ITEM (L"\\bu ##Dissimilarity & Configuration & Weight: Get stress "
+LIST_ITEM (U"\\bu ##Dissimilarity & Configuration & Weight: Get stress "
 	"(absolute mds)...")
 MAN_END
 
 /************ references ***********************************************/
 
-MAN_BEGIN (L"Abramowitz & Stegun (1970)", L"djmw", 19971201)
-NORMAL (L"M. Abramowitz & I. Stegun (1970): %%Handbook of mathematical "
+MAN_BEGIN (U"Abramowitz & Stegun (1970)", U"djmw", 19971201)
+NORMAL (U"M. Abramowitz & I. Stegun (1970): %%Handbook of mathematical "
 	"functions%. New York: Dover Publications.")
 MAN_END
 
-MAN_BEGIN (L"Borg & Groenen (1997)", L"djmw", 19971219)
-NORMAL (L"I. Borg & P. Groenen (1997): %%Modern multidimensional scaling: "
+MAN_BEGIN (U"Borg & Groenen (1997)", U"djmw", 19971219)
+NORMAL (U"I. Borg & P. Groenen (1997): %%Modern multidimensional scaling: "
 	"theory and applications%. Springer.")
 MAN_END
 
-MAN_BEGIN (L"Brokken (1983)", L"djmw", 19980406)
-NORMAL (L" F.B. Brokken (1983): \"Orthogonal Procrustes rotation maximizing "
+MAN_BEGIN (U"Brokken (1983)", U"djmw", 19980406)
+NORMAL (U" F.B. Brokken (1983): \"Orthogonal Procrustes rotation maximizing "
 	"congruence.\" %Psychometrika #48: 343\\--352.")
 MAN_END
 
-MAN_BEGIN (L"Cailliez (1983)", L"djmw", 19971201)
-NORMAL (L" F. Cailliez (1983): \"The analytical solution of the additive "
+MAN_BEGIN (U"Cailliez (1983)", U"djmw", 19971201)
+NORMAL (U" F. Cailliez (1983): \"The analytical solution of the additive "
 	"constant problem.\" %Psychometrika #48, 305-308.")
 MAN_END
 
-MAN_BEGIN (L"Carroll & Chang (1970)", L"djmw", 19971201)
-NORMAL (L"J.D. Carroll & J.-J. Chang, (1970): \"Analysis of Individual "
+MAN_BEGIN (U"Carroll & Chang (1970)", U"djmw", 19971201)
+NORMAL (U"J.D. Carroll & J.-J. Chang, (1970): \"Analysis of Individual "
 	"Differences in Multidimensional scaling via an N-way generalization of "
 	"\"Eckart-Young\" Decomposition.\" %Psychometrika #35: 283\\--319.")
 MAN_END
 
-MAN_BEGIN (L"Carroll & Wish (1974)", L"djmw", 19971201)
-NORMAL (L"J.D. Carroll & M. Wish, (1974): \"Models and methods for three-way "
+MAN_BEGIN (U"Carroll & Wish (1974)", U"djmw", 19971201)
+NORMAL (U"J.D. Carroll & M. Wish, (1974): \"Models and methods for three-way "
 	"multidimensional scaling.\" In D.H. Krantz, R.C. Atkinson, R.D. Luce & "
 	"P. Suppes (eds.): %%Contemporary developments in mathematical psychology: "
 	"Vol. 2 Measurement, psychophysics, and neural "
 	"information processing%, 283\\--319. New York: Academic Press.")
 MAN_END
 
-MAN_BEGIN (L"De Leeuw (1977)", L"djmw", 19971201)
-NORMAL (L"J. de Leeuw (1977): \"Applications of convex analysis to "
+MAN_BEGIN (U"De Leeuw (1977)", U"djmw", 19971201)
+NORMAL (U"J. de Leeuw (1977): \"Applications of convex analysis to "
 	"multidimensional scaling.\" In J.R. Barra, F. Brodeau, G. Romier & "
 	"B. van Cutsem (eds.): %%Recent developments in statistics%. Amsterdam: "
 	"North-Holland. 133\\--145.")
 MAN_END
 
-MAN_BEGIN (L"De Leeuw & Pruzansky (1978)", L"djmw", 19971201)
-NORMAL (L"J. de Leeuw & S. Pruzansky (1978): \"A new computational method to "
+MAN_BEGIN (U"De Leeuw & Pruzansky (1978)", U"djmw", 19971201)
+NORMAL (U"J. de Leeuw & S. Pruzansky (1978): \"A new computational method to "
 	"fit the weighted Euclidean distance model.\" %Psychometrika #43: 479\\--490.")
 MAN_END
 
-MAN_BEGIN (L"Gifi (1990)", L"djmw", 19971207)
-NORMAL (L"A. Gifi (1990): %%Nonlinear multivariate analysis%. John Wiley & "
+MAN_BEGIN (U"Gifi (1990)", U"djmw", 19971207)
+NORMAL (U"A. Gifi (1990): %%Nonlinear multivariate analysis%. John Wiley & "
 	"Sons Ltd., reprint 1996.")
 MAN_END
 
-MAN_BEGIN (L"Golub & van Loan (1996)", L"djmw", 19971207)
-NORMAL (L"G. Golub & C. van Loan (1996): %%Matrix computations%. Third edition. "
+MAN_BEGIN (U"Golub & van Loan (1996)", U"djmw", 19971207)
+NORMAL (U"G. Golub & C. van Loan (1996): %%Matrix computations%. Third edition. "
 	"London: The Johns Hopkins University Press.")   // ??
 MAN_END
 
-MAN_BEGIN (L"Green, Carmone & Smith (1989)", L"djmw", 19971201)
-NORMAL (L"P. Green, F. Carmone, S. Smith (1989): "
+MAN_BEGIN (U"Green, Carmone & Smith (1989)", U"djmw", 19971201)
+NORMAL (U"P. Green, F. Carmone, S. Smith (1989): "
 	"%%Multidimensional scaling: concepts and applications%. Section 3. Allyn and Bacon.")
 MAN_END
 
-MAN_BEGIN (L"Kaiser (1958)", L"djmw", 19980404)
-NORMAL (L" H.F. Kaiser (1958): \"The varimax criterion for analytic rotation "
+MAN_BEGIN (U"Kaiser (1958)", U"djmw", 19980404)
+NORMAL (U" H.F. Kaiser (1958): \"The varimax criterion for analytic rotation "
 	"in factor analysis.\" %Psychometrika #23: 187\\--200.")
 MAN_END
 
-MAN_BEGIN (L"Kiers & Groenen (1996)", L"djmw", 19971219)
-NORMAL (L"H.A.L. Kiers & P. Groenen (1996): \"A monotonically convergent "
+MAN_BEGIN (U"Kiers & Groenen (1996)", U"djmw", 19971219)
+NORMAL (U"H.A.L. Kiers & P. Groenen (1996): \"A monotonically convergent "
 	"algorithm for orthogonal congruence rotation.\" %Psychometrika #61: "
 	"375\\--389.")
 MAN_END
 
-MAN_BEGIN (L"Klein, Plomp & Pols (1970)", L"djmw", 19971201)
-NORMAL (L" W. Klein, R. Plomp, & L.C.W. Pols (1970): \"Vowel Spectra, "
+MAN_BEGIN (U"Klein, Plomp & Pols (1970)", U"djmw", 19971201)
+NORMAL (U" W. Klein, R. Plomp, & L.C.W. Pols (1970): \"Vowel Spectra, "
 	"Vowel Spaces, and Vowel Identification.\" %%Journal of the Acoustical Society of America% #48: 999\\--1009.")
 MAN_END
 
-MAN_BEGIN (L"Kruskal (1964)", L"djmw", 19971201)
-NORMAL (L"J.B. Kruskal (1964): \"Nonmetric multidimensional scaling: a "
+MAN_BEGIN (U"Kruskal (1964)", U"djmw", 19971201)
+NORMAL (U"J.B. Kruskal (1964): \"Nonmetric multidimensional scaling: a "
 	"numerical method.\" %Psychometrika #29: 115\\--129.")
 MAN_END
 
-MAN_BEGIN (L"Ramsay (1988)", L"djmw", 19980106)
-NORMAL (L"J.O. Ramsay (1988): \"Monotone regression splines in action.\" "
+MAN_BEGIN (U"Ramsay (1988)", U"djmw", 19980106)
+NORMAL (U"J.O. Ramsay (1988): \"Monotone regression splines in action.\" "
 	"%%Statistical Science% #3: 425\\--461.")
 MAN_END
 
-MAN_BEGIN (L"Stevens (1951)", L"djmw", 19971201)
-NORMAL (L"S.S. Stevens (1951): \"Mathematics, measurement, and psychophysics.\" "
+MAN_BEGIN (U"Stevens (1951)", U"djmw", 19971201)
+NORMAL (U"S.S. Stevens (1951): \"Mathematics, measurement, and psychophysics.\" "
 	"In S.S. Stevens (ed.): %%Handbook of experimental psychology%. New York: "
 	"Wiley.")
 MAN_END
 
-MAN_BEGIN (L"Takane, Young & de Leeuw (1976)", L"djmw", 19971201)
-NORMAL (L"Y. Takane, F. Young, J. de Leeuw (1976): \"Non-metric individual "
+MAN_BEGIN (U"Takane, Young & de Leeuw (1976)", U"djmw", 19971201)
+NORMAL (U"Y. Takane, F. Young, J. de Leeuw (1976): \"Non-metric individual "
 	"differences multidimensional scaling: an alternating least squares method "
 	"with optimal scaling features.\" %Psychometrika #42: 7\\--67.")
 MAN_END
 
-MAN_BEGIN (L"Ten Berge (1995)", L"djmw", 19980404)
-NORMAL (L"J.M.F. ten Berge (1995): \"Suppressing permutations or rigid planar "
+MAN_BEGIN (U"Ten Berge (1995)", U"djmw", 19980404)
+NORMAL (U"J.M.F. ten Berge (1995): \"Suppressing permutations or rigid planar "
 	"rotations: a remedy against nonoptimal varimax rotations.\" "
 	"%Psychometrika #60, 437\\--446.")
 MAN_END
 
-MAN_BEGIN (L"Ten Berge, Kiers & Krijnen (1993)", L"djmw", 19971207)
-NORMAL (L"J.M.F. ten Berge, H.A.L. Kiers & W.P. Krijnen (1993): \"Computational "
+MAN_BEGIN (U"Ten Berge, Kiers & Krijnen (1993)", U"djmw", 19971207)
+NORMAL (U"J.M.F. ten Berge, H.A.L. Kiers & W.P. Krijnen (1993): \"Computational "
 	"solutions for the problem of negative saliences and nonsymmetry in "
 	"INDSCAL.\" %%Journal of Classification% #10: 115\\--124.")
 MAN_END
 
-MAN_BEGIN (L"Torgerson (1958)", L"djmw", 19971201)
-NORMAL (L"W.S. Torgerson (1958): %%Theory and methods of scaling%. New York: Wiley.")
+MAN_BEGIN (U"Torgerson (1958)", U"djmw", 19971201)
+NORMAL (U"W.S. Torgerson (1958): %%Theory and methods of scaling%. New York: Wiley.")
 MAN_END
 
-MAN_BEGIN (L"Young, Takane & Lewyckyj (1978)", L"djmw", 19971201)
-NORMAL (L"F.W. Young, Y. Takane & R. Lewyckyj (1978): "
+MAN_BEGIN (U"Young, Takane & Lewyckyj (1978)", U"djmw", 19971201)
+NORMAL (U"F.W. Young, Y. Takane & R. Lewyckyj (1978): "
 	"\"Three notes on ALSCAL.\" %Psychometrika #43: 433\\--435.")
 MAN_END
 
-MAN_BEGIN (L"Weller & Romney (1990)", L"djmw", 19971216)
-NORMAL (L"S.C. Weller & A.K. Romney (1990): %%Metric Scaling: "
+MAN_BEGIN (U"Weller & Romney (1990)", U"djmw", 19971216)
+NORMAL (U"S.C. Weller & A.K. Romney (1990): %%Metric Scaling: "
 	"correspondence analysis%. Sage University Paper Series on Quantitative "
 	"Applications in the Social Sciences 07-075. Newbury Park, CA: Sage.")
 MAN_END
diff --git a/dwtools/manual_Permutation.cpp b/dwtools/manual_Permutation.cpp
index 119b436..d304b7d 100644
--- a/dwtools/manual_Permutation.cpp
+++ b/dwtools/manual_Permutation.cpp
@@ -27,280 +27,280 @@ void manual_Permutation_init (ManPages me);
 void manual_Permutation_init (ManPages me)
 {
 
-MAN_BEGIN (L"Permutation", L"djmw", 20050721)
-INTRO (L"One of the @@types of objects@ in Praat. A Permutation object with %n elements consists of some ordering of "
+MAN_BEGIN (U"Permutation", U"djmw", 20050721)
+INTRO (U"One of the @@types of objects@ in Praat. A Permutation object with %n elements consists of some ordering of "
 	"the numbers 1,2...%n.")
-ENTRY (L"Interpretation")
-NORMAL (L"A permutation like for example (2,3,5,4,1) is an %arrangement of the five objects 1, 2, 3, 4, and 5. "
+ENTRY (U"Interpretation")
+NORMAL (U"A permutation like for example (2,3,5,4,1) is an %arrangement of the five objects 1, 2, 3, 4, and 5. "
 	"It tells us that the second object is in the first position, the third object is in the second position, "
 	"the fifth object in the third position and so on.")
-NORMAL (L"If we combine a Permutation together with an other object, like a Strings for example, we may force a  "
+NORMAL (U"If we combine a Permutation together with an other object, like a Strings for example, we may force a  "
 	"new arrangement of the strings, according to the specification in the Permutation (see @@Strings & Permutation: Permute strings@)." )
-ENTRY (L"Commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@Create Permutation...@")
-NORMAL (L"Query:")
-LIST_ITEM (L"\\bu ##Get number of elements#")
-LIST_ITEM (L"\\bu @@Permutation: Get value...|Get value...@")
-LIST_ITEM (L"\\bu @@Permutation: Get index...|Get index...@")
-NORMAL (L"Modification:")
-LIST_ITEM (L"\\bu @@Permutation: Sort|Sort@")
-LIST_ITEM (L"\\bu @@Permutation: Swap blocks...|Swap blocks...@")
-LIST_ITEM (L"\\bu @@Permutation: Swap positions...|Swap positions...@")
-LIST_ITEM (L"\\bu @@Permutation: Swap numbers...|Swap numbers...@")
-LIST_ITEM (L"\\bu @@Permutation: Swap one from range...|Swap one from range...@")
-NORMAL (L"Permutations:")
-LIST_ITEM (L"\\bu @@Permutation: Permute randomly...|Permute randomly...@")
-LIST_ITEM (L"\\bu @@Permutation: Permute randomly (blocks)...|Permute randomly (blocks)...@")
-LIST_ITEM (L"\\bu @@Permutation: Interleave...|Interleave...@")
-LIST_ITEM (L"\\bu @@Permutation: Rotate...|Rotate...@")
-LIST_ITEM (L"\\bu @@Permutation: Reverse...|Reverse...@")
-LIST_ITEM (L"\\bu @@Permutation: Invert|Invert@")
-NORMAL (L"Successive permutations:")
-LIST_ITEM (L"\\bu @@Permutations: Multiply|Multiply@")
-ENTRY (L"Usage")
-LIST_ITEM (L"@@Strings & Permutation: Permute strings@ to rearrange the strings in a Strings object.")
-LIST_ITEM (L"@@TableOfReal & Permutation: Permute rows@ to rearrange the rows in a TableOfReal object.")
+ENTRY (U"Commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@Create Permutation...@")
+NORMAL (U"Query:")
+LIST_ITEM (U"\\bu ##Get number of elements#")
+LIST_ITEM (U"\\bu @@Permutation: Get value...|Get value...@")
+LIST_ITEM (U"\\bu @@Permutation: Get index...|Get index...@")
+NORMAL (U"Modification:")
+LIST_ITEM (U"\\bu @@Permutation: Sort|Sort@")
+LIST_ITEM (U"\\bu @@Permutation: Swap blocks...|Swap blocks...@")
+LIST_ITEM (U"\\bu @@Permutation: Swap positions...|Swap positions...@")
+LIST_ITEM (U"\\bu @@Permutation: Swap numbers...|Swap numbers...@")
+LIST_ITEM (U"\\bu @@Permutation: Swap one from range...|Swap one from range...@")
+NORMAL (U"Permutations:")
+LIST_ITEM (U"\\bu @@Permutation: Permute randomly...|Permute randomly...@")
+LIST_ITEM (U"\\bu @@Permutation: Permute randomly (blocks)...|Permute randomly (blocks)...@")
+LIST_ITEM (U"\\bu @@Permutation: Interleave...|Interleave...@")
+LIST_ITEM (U"\\bu @@Permutation: Rotate...|Rotate...@")
+LIST_ITEM (U"\\bu @@Permutation: Reverse...|Reverse...@")
+LIST_ITEM (U"\\bu @@Permutation: Invert|Invert@")
+NORMAL (U"Successive permutations:")
+LIST_ITEM (U"\\bu @@Permutations: Multiply|Multiply@")
+ENTRY (U"Usage")
+LIST_ITEM (U"@@Strings & Permutation: Permute strings@ to rearrange the strings in a Strings object.")
+LIST_ITEM (U"@@TableOfReal & Permutation: Permute rows@ to rearrange the rows in a TableOfReal object.")
 MAN_END
 
-MAN_BEGIN (L"Create Permutation...", L"djmw", 20050709)
-INTRO (L"A command to create a @Permutation of the numbers 1,2, ..., %numberOfElements.")
-ENTRY (L"Settings")
-TAG (L"##Name")
-DEFINITION (L"the name of the new permutation.")
-TAG (L"##Number of elements%")
-DEFINITION (L"the number of elements in the permutation.")
-TAG (L"##Identity permutation")
-DEFINITION (L"determines whether the permution will be a randomly chosen one, or the @@identity permutation at .")
+MAN_BEGIN (U"Create Permutation...", U"djmw", 20050709)
+INTRO (U"A command to create a @Permutation of the numbers 1,2, ..., %numberOfElements.")
+ENTRY (U"Settings")
+TAG (U"##Name")
+DEFINITION (U"the name of the new permutation.")
+TAG (U"##Number of elements%")
+DEFINITION (U"the number of elements in the permutation.")
+TAG (U"##Identity permutation")
+DEFINITION (U"determines whether the permution will be a randomly chosen one, or the @@identity permutation at .")
 MAN_END
 
-MAN_BEGIN (L"identity permutation", L"djmw", 20050713)
-INTRO (L"The identity permutation is (1,2,3,...,%numberOfElements), i.e. the numbers 1 to "
+MAN_BEGIN (U"identity permutation", U"djmw", 20050713)
+INTRO (U"The identity permutation is (1,2,3,...,%numberOfElements), i.e. the numbers 1 to "
 	"%numberOfElements in their natural order. ")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Get value...", L"djmw", 20050709)
-INTRO (L"Get the value at the index position.")
-ENTRY (L"Example")
-NORMAL (L"The query for the value at index 3 for the permutation (3,2,4,5,1) gives 4.")
+MAN_BEGIN (U"Permutation: Get value...", U"djmw", 20050709)
+INTRO (U"Get the value at the index position.")
+ENTRY (U"Example")
+NORMAL (U"The query for the value at index 3 for the permutation (3,2,4,5,1) gives 4.")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Get index...", L"djmw", 20050714)
-INTRO (L"Get the index position of the value. ")
-ENTRY (L"Example")
-NORMAL (L"The query for the index of value 3 for the permutation (3,2,4,5,1) gives 1.")
+MAN_BEGIN (U"Permutation: Get index...", U"djmw", 20050714)
+INTRO (U"Get the index position of the value. ")
+ENTRY (U"Example")
+NORMAL (U"The query for the index of value 3 for the permutation (3,2,4,5,1) gives 1.")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Reverse...", L"djmw", 20110105)
-INTRO (L"Reverse the elements in the given range.")
-ENTRY (L"Setting")
-TAG (L"##Index range#")
-DEFINITION (L"defines the range of indices that will be reversed.")
-ENTRY (L"Examples")
-NORMAL (L"1. With ##Index range# = [0,0], the permutation (1,2,3,4,5) is turned into (5,4,3,2,1). ")
-NORMAL (L"2. With ##Index range# = [3,0], the permutation (1,2,3,4,5) is turned into (1,2,5,4,3). ")
+MAN_BEGIN (U"Permutation: Reverse...", U"djmw", 20110105)
+INTRO (U"Reverse the elements in the given range.")
+ENTRY (U"Setting")
+TAG (U"##Index range#")
+DEFINITION (U"defines the range of indices that will be reversed.")
+ENTRY (U"Examples")
+NORMAL (U"1. With ##Index range# = [0,0], the permutation (1,2,3,4,5) is turned into (5,4,3,2,1). ")
+NORMAL (U"2. With ##Index range# = [3,0], the permutation (1,2,3,4,5) is turned into (1,2,5,4,3). ")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Swap one from range...", L"djmw", 20110105)
-INTRO (L"An element at an index, randomly chosen from a range, will be permuted with an element at a prescribed index position.")
-ENTRY (L"Settings")
-TAG (L"##Index range#")
-DEFINITION (L"defines the range of indices from which one will be randomly chosen.")
-TAG (L"##Index#")
-DEFINITION (L"defines the special index position whose element will be interchanged with the one chosen from the range.")
-TAG (L"##Forbid same")
-DEFINITION (L"when %on, forbids the randomly chosen position and the index position to be the same. "
+MAN_BEGIN (U"Permutation: Swap one from range...", U"djmw", 20110105)
+INTRO (U"An element at an index, randomly chosen from a range, will be permuted with an element at a prescribed index position.")
+ENTRY (U"Settings")
+TAG (U"##Index range#")
+DEFINITION (U"defines the range of indices from which one will be randomly chosen.")
+TAG (U"##Index#")
+DEFINITION (U"defines the special index position whose element will be interchanged with the one chosen from the range.")
+TAG (U"##Forbid same")
+DEFINITION (U"when %on, forbids the randomly chosen position and the index position to be the same. "
 	"This switch is only of relevance when the chosen range happens to overlap the index position.")
-ENTRY (L"Examples")
-NORMAL (L"With ##Index range# = [0,0], ##Index# = 3, ##Forbid same# is %off and (1,2,3,4,5) as the starting permutation, the outcome might be one of "
+ENTRY (U"Examples")
+NORMAL (U"With ##Index range# = [0,0], ##Index# = 3, ##Forbid same# is %off and (1,2,3,4,5) as the starting permutation, the outcome might be one of "
 	"the five permutations (3,2,1,4,5), (1,3,2,4,5), (1,2,3,4,5), (1,2,4,3,5), (1,2,5,4,3). If ##Forbid same# were chosen as %on, the "
 	"(1,2,3,4,5) permutation is forbidden and the outcome could only be one of the four remaining permutations.")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Permute randomly...", L"djmw", 20111123)
-INTRO (L"Generates a new @@Permutation@ by randomly permuting a range of elements in the selected Permutation object.")
-ENTRY (L"Setting")
-TAG (L"##Index range#")
-DEFINITION (L"defines the range of elements that will be permuted. The elements outside this range will be kept intact.")
-ENTRY (L"Example")
-NORMAL (L"If we start with the permutation (4,6,3,1,5,2,7) and a chosen ##Index range# that runs from 3 to 6, a new permutation will be generated as follows:")
-LIST_ITEM (L"1. A new permutation of the same dimension as the selected one will be created. ")
-LIST_ITEM (L"2. Because the index range starts at 3, the first two elements of the selected permutation will be copied "
+MAN_BEGIN (U"Permutation: Permute randomly...", U"djmw", 20111123)
+INTRO (U"Generates a new @@Permutation@ by randomly permuting a range of elements in the selected Permutation object.")
+ENTRY (U"Setting")
+TAG (U"##Index range#")
+DEFINITION (U"defines the range of elements that will be permuted. The elements outside this range will be kept intact.")
+ENTRY (U"Example")
+NORMAL (U"If we start with the permutation (4,6,3,1,5,2,7) and a chosen ##Index range# that runs from 3 to 6, a new permutation will be generated as follows:")
+LIST_ITEM (U"1. A new permutation of the same dimension as the selected one will be created. ")
+LIST_ITEM (U"2. Because the index range starts at 3, the first two elements of the selected permutation will be copied "
 	"to the first two locations in the newly created permutation. The new permutation is now (4,6,.,.,.,.,.), where a "
 	"dot (.) means that the element is unspecified.")
-LIST_ITEM (L"3. The elements 3 to 6 of the selected permutation, i.e. the numbers (3,1,5,2) will be randomly permuted. "
+LIST_ITEM (U"3. The elements 3 to 6 of the selected permutation, i.e. the numbers (3,1,5,2) will be randomly permuted. "
 	"There are 24 possible permutations of these 4 numbers. Say the outcome happens to be (5,1,3,2). The new permutation is now (4,6,5,1,3,2,.).")
-LIST_ITEM (L"4. The remaining element (7) is copied to the new permutation. Finally, this results "
+LIST_ITEM (U"4. The remaining element (7) is copied to the new permutation. Finally, this results "
 	"in the new permutation being (4,6,5,1,3,2,7).")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Permute randomly (blocks)...", L"djmw", 20110105)
-INTRO (L"Generates a new @Permutation by randomly permuting blocks of size %blocksize.")
-ENTRY (L"Settings")
-TAG (L"##Index range#")
-DEFINITION (L"the range of elements whose blocks will be permuted.")
-TAG (L"##Block size#")
-DEFINITION (L"the size of the blocks that will be permuted. There must fit an integer number of blocks "
+MAN_BEGIN (U"Permutation: Permute randomly (blocks)...", U"djmw", 20110105)
+INTRO (U"Generates a new @Permutation by randomly permuting blocks of size %blocksize.")
+ENTRY (U"Settings")
+TAG (U"##Index range#")
+DEFINITION (U"the range of elements whose blocks will be permuted.")
+TAG (U"##Block size#")
+DEFINITION (U"the size of the blocks that will be permuted. There must fit an integer number of blocks "
 	"in the chosen range.")
-TAG (L"##Permute within blocks#")
-DEFINITION (L"when %on, the elements in each block are also randomly permuted.")
-TAG (L"##No doublets#")
-DEFINITION (L"guarantees that the first element in each block does not equal the last element of the previous block modulo "
+TAG (U"##Permute within blocks#")
+DEFINITION (U"when %on, the elements in each block are also randomly permuted.")
+TAG (U"##No doublets#")
+DEFINITION (U"guarantees that the first element in each block does not equal the last element of the previous block modulo "
 	"the block size. E.g. the numbers 3, 6, 9 are all equal modulo 3. "
 	"This parameter only has effect when ##Permute within blocks# is %on.")
-ENTRY (L"Examples")
-NORMAL (L"1. With ##Index range# = [0,0], ##Block size# = 3 and ##Permute within blocks# is %off, the permutation ((1,2,3),(4,5,6),(7,8,9)) "
+ENTRY (U"Examples")
+NORMAL (U"1. With ##Index range# = [0,0], ##Block size# = 3 and ##Permute within blocks# is %off, the permutation ((1,2,3),(4,5,6),(7,8,9)) "
 	"is turned into one of six possible permutations, for example into ((4,5,6),(7,8,9),(1,2,3)). (The option ##No doublets# will be ignored and the parentheses are only there to indicate the blocks.)")
-NORMAL (L"2. With ##Index range# = [0,0], ##Block size# = 3, ##Permute within blocks# is %on and ##No doublets# is %off, "
+NORMAL (U"2. With ##Index range# = [0,0], ##Block size# = 3, ##Permute within blocks# is %on and ##No doublets# is %off, "
 	"the permutation ((1,2,3),(4,5,6),(7,8,9)) might turn into ((5,4,6),(9,8,7),(3,1,2)).")
-NORMAL (L"3. With the same options as 2 but ##No doublets# is %on, the previously given outcome is forbidden because "
+NORMAL (U"3. With the same options as 2 but ##No doublets# is %on, the previously given outcome is forbidden because "
 	"the last element of the first block (6) and the first element of the next block (9) are equal modulo 3 (the "
 	"blocksize). A valid outcome might then be ((5,4,6),(8,9,7),(3,1,2)).")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Swap blocks...", L"djmw", 20110105)
-INTRO (L"A command to swap the contents of two index ranges in the selected @Permutation.")
-ENTRY (L"Settings")
-TAG (L"##From index#, ##To index#")
-DEFINITION (L"the two starting positions from where elements are to be swapped. The blocks may overlap.")
-TAG (L"##Block size#")
-DEFINITION (L"determines the number of pairs to swap. ")
-ENTRY (L"Behaviour")
-NORMAL (L"If the ##Block size# equals one, only the elements at the ##From index# and ##To index# position are swapped. If blocksize is greater than one, the two elements at ##From index#+1 and ##To index#+1 will be swapped too. This goes on until the last two elements in each block have been swapped.")
-ENTRY (L"Examples")
-NORMAL (L"1. Swap two blocks: with ##From index# = 1, ##To index# = 4, and ##Block size# = 2, the permutation (1,2,3,4,5) is turned into (4,5,3,1,2).")
-NORMAL (L"2. Swap two elements: with ##From index# = 1, ##To index# = 4, and ##Block size# = 1, the permutation (1,2,3,4,5) is turned into (4,2,3,1,5).")
-NORMAL (L"3. Swap two overlapping blocks: with ##From index# = 1, ##To index# = 3, and ##Block size# = 3, the permutation (1,2,3,4,5) is turned into "
+MAN_BEGIN (U"Permutation: Swap blocks...", U"djmw", 20110105)
+INTRO (U"A command to swap the contents of two index ranges in the selected @Permutation.")
+ENTRY (U"Settings")
+TAG (U"##From index#, ##To index#")
+DEFINITION (U"the two starting positions from where elements are to be swapped. The blocks may overlap.")
+TAG (U"##Block size#")
+DEFINITION (U"determines the number of pairs to swap. ")
+ENTRY (U"Behaviour")
+NORMAL (U"If the ##Block size# equals one, only the elements at the ##From index# and ##To index# position are swapped. If blocksize is greater than one, the two elements at ##From index#+1 and ##To index#+1 will be swapped too. This goes on until the last two elements in each block have been swapped.")
+ENTRY (U"Examples")
+NORMAL (U"1. Swap two blocks: with ##From index# = 1, ##To index# = 4, and ##Block size# = 2, the permutation (1,2,3,4,5) is turned into (4,5,3,1,2).")
+NORMAL (U"2. Swap two elements: with ##From index# = 1, ##To index# = 4, and ##Block size# = 1, the permutation (1,2,3,4,5) is turned into (4,2,3,1,5).")
+NORMAL (U"3. Swap two overlapping blocks: with ##From index# = 1, ##To index# = 3, and ##Block size# = 3, the permutation (1,2,3,4,5) is turned into "
 	"(3,4,5,2,1).")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Swap positions...", L"djmw", 20110105)
-INTRO (L"Swaps the contents at two indices in the selected @@Permutation at .")
-ENTRY (L"Settings")
-TAG (L"##First index#, ##Second index#")
-DEFINITION (L"the two indices from where elements have to be swapped. The order of these indices is not important.")
-ENTRY (L"Example")
-NORMAL (L"With ##First index# = 1 and ##Second index# = 3, the permutation (1,3,4,2,5) is turned into (4,3,1,2,5).")
+MAN_BEGIN (U"Permutation: Swap positions...", U"djmw", 20110105)
+INTRO (U"Swaps the contents at two indices in the selected @@Permutation at .")
+ENTRY (U"Settings")
+TAG (U"##First index#, ##Second index#")
+DEFINITION (U"the two indices from where elements have to be swapped. The order of these indices is not important.")
+ENTRY (U"Example")
+NORMAL (U"With ##First index# = 1 and ##Second index# = 3, the permutation (1,3,4,2,5) is turned into (4,3,1,2,5).")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Swap numbers...", L"djmw", 20110105)
-INTRO (L"Swaps two numbers in the selected @@Permutation at .")
-ENTRY (L"Settings")
-TAG (L"##First number#, ##Second number#")
-DEFINITION (L"the two numbers that have to be swapped. The order of these numbers is not important.")
-ENTRY (L"Example")
-NORMAL (L"With ##First number# = 1 and ##Second number# = 3, the permutation (1,3,4,2,5) is turned into (3,1,4,2,5).")
+MAN_BEGIN (U"Permutation: Swap numbers...", U"djmw", 20110105)
+INTRO (U"Swaps two numbers in the selected @@Permutation at .")
+ENTRY (U"Settings")
+TAG (U"##First number#, ##Second number#")
+DEFINITION (U"the two numbers that have to be swapped. The order of these numbers is not important.")
+ENTRY (U"Example")
+NORMAL (U"With ##First number# = 1 and ##Second number# = 3, the permutation (1,3,4,2,5) is turned into (3,1,4,2,5).")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Interleave...", L"djmw", 20110105)
-INTRO (L"Generates a new @Permutation by interleaving elements from successive blocks. ")
-NORMAL (L"We always start with the first element in the first block. When the offset is zero, the next element will be the first "
+MAN_BEGIN (U"Permutation: Interleave...", U"djmw", 20110105)
+INTRO (U"Generates a new @Permutation by interleaving elements from successive blocks. ")
+NORMAL (U"We always start with the first element in the first block. When the offset is zero, the next element will be the first "
 	"element of the second block, then the first element of the third block. After the first element of the last block, we start again "
 	"with the second elements in each block. And so on. (In card playing, with two blocks of 26 cards each, this is called a faro "
 	"shuffle and eight successive faro shuffles will return the deck to precisely the order in which you began.)")
-NORMAL (L"If the offset differs from zero and equals 1 for example, we start with the first element in the first block, then the "
+NORMAL (U"If the offset differs from zero and equals 1 for example, we start with the first element in the first block, then the "
 	"second element in the second block, the third element in the third block and so on. When the last element of a block is reached "
 	"and the number of blocks is not exhausted the next element will be the first from the next block. When the last block is reached, "
 	"we start the same cycle again with the next lower element in the first block (which by the way need not be the second element, "
 	"see also example 4).")
-ENTRY (L"Settings")
-TAG (L"##Index range#")
-DEFINITION (L"the range of elements that will be permuted.")
-TAG (L"##Block size#")
-DEFINITION (L"the size of a block. An integer number of blocks must fit "
+ENTRY (U"Settings")
+TAG (U"##Index range#")
+DEFINITION (U"the range of elements that will be permuted.")
+TAG (U"##Block size#")
+DEFINITION (U"the size of a block. An integer number of blocks must fit "
 	"in the chosen ##Index range#.")
-TAG (L"##Offset#")
-DEFINITION (L"determines the relative positions of selected elements in successive blocks.")
-ENTRY (L"Examples")
-NORMAL (L"1. With ##Index range# = [0,0], ##Block size# = 3, and ##Offset# = 0, the permutation ((1,2,3),(4,5,6),(7,8,9)) is turned into (1,4,7,2,5,8,3,6,9).")
-NORMAL (L"2. With ##Index range# = [0,0], ##Block size# = 3, and ##Offset# = 1, the permutation ((1,2,3),(4,5,6),(7,8,9)) is turned into (1,5,9,2,6,7,3,4,8).")
-NORMAL (L"3. With ##Index range# = [0,0], ##Block size# = 3, and ##Offset# = 2, the permutation ((1,2,3),(4,5,6),(7,8,9)) is turned into (1,6,8,2,4,9,3,5,7).")
-NORMAL (L"4. With ##Index range# = [0,0], ##Block size# = 4, and ##Offset# = 1, the permutation ((1,2,3,4),(5,6,7,8)) is turned into (1,6,3,8,2,7,4,5).")
+TAG (U"##Offset#")
+DEFINITION (U"determines the relative positions of selected elements in successive blocks.")
+ENTRY (U"Examples")
+NORMAL (U"1. With ##Index range# = [0,0], ##Block size# = 3, and ##Offset# = 0, the permutation ((1,2,3),(4,5,6),(7,8,9)) is turned into (1,4,7,2,5,8,3,6,9).")
+NORMAL (U"2. With ##Index range# = [0,0], ##Block size# = 3, and ##Offset# = 1, the permutation ((1,2,3),(4,5,6),(7,8,9)) is turned into (1,5,9,2,6,7,3,4,8).")
+NORMAL (U"3. With ##Index range# = [0,0], ##Block size# = 3, and ##Offset# = 2, the permutation ((1,2,3),(4,5,6),(7,8,9)) is turned into (1,6,8,2,4,9,3,5,7).")
+NORMAL (U"4. With ##Index range# = [0,0], ##Block size# = 4, and ##Offset# = 1, the permutation ((1,2,3,4),(5,6,7,8)) is turned into (1,6,3,8,2,7,4,5).")
 MAN_END
 
-MAN_BEGIN (L"lexicographic permutation order", L"djmw", 20140131)
-INTRO (L"We can order the %n numbers 1, 2, 3,..., n in %n! different ways. Each of these n! orderings represents a different permutation of "
+MAN_BEGIN (U"lexicographic permutation order", U"djmw", 20140131)
+INTRO (U"We can order the %n numbers 1, 2, 3,..., n in %n! different ways. Each of these n! orderings represents a different permutation of "
 	"the numbers 1, 2, 3,..., n. For example, if %n equals 3 we have 6 (=3\\.c2\\.c1) possible orderings: (1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2) and (3,2,1). "
 	"The %%lexicographic permutation order% starts from the identity permutation (1,2,..., n). By successively swapping only two numbers one "
 	"obtains all possible permutations. The last permutation in lexicographic order will be the permutation with all numbers in reversed order, "
 	"i.e. (n,n-1,...,2,1). The example given above has all 6 permutations in lexicographic permutation order.")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Next", L"djmw", 20140131)
-INTRO (L"Get the next @@Permutation|permutation@ in @@lexicographic permutation order at . ")
-NORMAL (L"The next permutation is obtained from the selected permutation "
+MAN_BEGIN (U"Permutation: Next", U"djmw", 20140131)
+INTRO (U"Get the next @@Permutation|permutation@ in @@lexicographic permutation order at . ")
+NORMAL (U"The next permutation is obtained from the selected permutation "
 	"by swapping values %%at only two positions%. Starting with the identity permutation and "
 	"repeatedly applying this function will iterate through all possible permutations. If no further permutation "
 	"is available, i.e. the selected permutation is at the lexicographic end position (n, n-1, ..., 3, 2, 1), the current permutation will not change anymore. ")
-ENTRY (L"Examples")
-NORMAL (L"If we start with (1,2,3,4) successively applying ##Next# will generate the following sequence (1,2,4,3), (1,3,2,4), (1,3,4,2), (1,4,2,3), (1,4,3,2), etc.")
+ENTRY (U"Examples")
+NORMAL (U"If we start with (1,2,3,4) successively applying ##Next# will generate the following sequence (1,2,4,3), (1,3,2,4), (1,3,4,2), (1,4,2,3), (1,4,3,2), etc.")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Previous", L"djmw", 20140131)
-NORMAL (L"Get the previous @@Permutation|permutation@ in @@lexicographic permutation order at . The previous permutation is obtained "
+MAN_BEGIN (U"Permutation: Previous", U"djmw", 20140131)
+NORMAL (U"Get the previous @@Permutation|permutation@ in @@lexicographic permutation order at . The previous permutation is obtained "
 	"from the selected permutation by swapping values %%at only two positions%. If no further permutation "
 	"is available, i.e. the current permutation is at the lexicographic start position (1, 2, 3, ..., n-1, n), the current permutation will not change anymore. ")
-NORMAL (L"The ##Previous# operation follows the opposite order of @@Permutation: Next at .")
+NORMAL (U"The ##Previous# operation follows the opposite order of @@Permutation: Next at .")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Rotate...", L"djmw", 20110105)
-INTRO (L"A circular shift of all elements within the given range.")
-ENTRY (L"Settings")
-TAG (L"##Index range#")
-DEFINITION (L"the range of elements that will be circularly permuted.")   // ambiguous; are these the positions or the numbers?
-TAG (L"##Step size#")
-DEFINITION (L"define how many positions each element will be shifted.")
-ENTRY (L"Examples")
-NORMAL (L"1. With ##Step size# = 2 and ##Index range# = [1,5], the permutation (1,2,3,4,5) is turned into (4,5,1,2,3). ")
-NORMAL (L"2. With ##Step size# = 2 and ##Index range# = [2,5], the permutation ((1),(2,3,4,5)) is turned into ((1),(4,5,2,3))")
-NORMAL (L"3. With ##Step size# = -1 and ##Index range# = [0,0], the permutation (1,2,3,4,5) is turned into (2,3,4,5,1).")
+MAN_BEGIN (U"Permutation: Rotate...", U"djmw", 20110105)
+INTRO (U"A circular shift of all elements within the given range.")
+ENTRY (U"Settings")
+TAG (U"##Index range#")
+DEFINITION (U"the range of elements that will be circularly permuted.")   // ambiguous; are these the positions or the numbers?
+TAG (U"##Step size#")
+DEFINITION (U"define how many positions each element will be shifted.")
+ENTRY (U"Examples")
+NORMAL (U"1. With ##Step size# = 2 and ##Index range# = [1,5], the permutation (1,2,3,4,5) is turned into (4,5,1,2,3). ")
+NORMAL (U"2. With ##Step size# = 2 and ##Index range# = [2,5], the permutation ((1),(2,3,4,5)) is turned into ((1),(4,5,2,3))")
+NORMAL (U"3. With ##Step size# = -1 and ##Index range# = [0,0], the permutation (1,2,3,4,5) is turned into (2,3,4,5,1).")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Invert", L"djmw", 20050709)
-INTRO (L"Generates the inverse of the selected @Permutation.")
-ENTRY (L"Example")
-NORMAL (L"If the permutation is (1,5,3,2,4) the inverse will be (1,4,3,5,2). If we @@Permutations: Multiply|multiply@ these two permutations the result will be the identity permutation (1,2,3,4,5).")
+MAN_BEGIN (U"Permutation: Invert", U"djmw", 20050709)
+INTRO (U"Generates the inverse of the selected @Permutation.")
+ENTRY (U"Example")
+NORMAL (U"If the permutation is (1,5,3,2,4) the inverse will be (1,4,3,5,2). If we @@Permutations: Multiply|multiply@ these two permutations the result will be the identity permutation (1,2,3,4,5).")
 MAN_END
 
-MAN_BEGIN (L"Permutations: Multiply", L"djmw", 20050717)
-INTRO (L"Apply the selected @@Permutation at s one after the other. ")
-NORMAL (L"Permutations are %not commutative, i.e. applying permutation %p__1_ after %p__2_ might not give the same outcome as applying "
+MAN_BEGIN (U"Permutations: Multiply", U"djmw", 20050717)
+INTRO (U"Apply the selected @@Permutation at s one after the other. ")
+NORMAL (U"Permutations are %not commutative, i.e. applying permutation %p__1_ after %p__2_ might not give the same outcome as applying "
 	"%p__2_ after %p__1_.")
 MAN_END
 
-MAN_BEGIN (L"Permutation: Sort", L"djmw", 20050709)
-INTRO (L"Sorts the elements ascending, i.e. set the selected @@Permutation@ to the @@identity permutation at .")
+MAN_BEGIN (U"Permutation: Sort", U"djmw", 20050709)
+INTRO (U"Sorts the elements ascending, i.e. set the selected @@Permutation@ to the @@identity permutation at .")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal & Permutation: Permute rows", L"djmw", 20050709)
-INTRO (L"Generate a new @TableOfReal with a row ordering determined by the @Permutation.")
-ENTRY (L"Example")
-NORMAL (L"If the selected TableOfReal has 5 rows and the permutation is (5,4,3,2,1) the first row of the new TableOfReal equals the fifth row of the selected, the second row of new equals the fourth row of the selected and so on.")
+MAN_BEGIN (U"TableOfReal & Permutation: Permute rows", U"djmw", 20050709)
+INTRO (U"Generate a new @TableOfReal with a row ordering determined by the @Permutation.")
+ENTRY (U"Example")
+NORMAL (U"If the selected TableOfReal has 5 rows and the permutation is (5,4,3,2,1) the first row of the new TableOfReal equals the fifth row of the selected, the second row of new equals the fourth row of the selected and so on.")
 MAN_END
 
-MAN_BEGIN (L"Strings & Permutation: Permute strings", L"djmw", 20140130)
-INTRO (L"Generate a new @Strings with a strings ordering determined by the @Permutation.")
-NORMAL (L"The number of strings in the #Strings and the number of elements in the #Permutation have to be equal.")
-ENTRY (L"Examples")
-NORMAL (L"1. If the selected Strings has the 4 strings ordered as \"heed\", \"hid\", \"hood\", \"hud\", and the permutation is "
+MAN_BEGIN (U"Strings & Permutation: Permute strings", U"djmw", 20140130)
+INTRO (U"Generate a new @Strings with a strings ordering determined by the @Permutation.")
+NORMAL (U"The number of strings in the #Strings and the number of elements in the #Permutation have to be equal.")
+ENTRY (U"Examples")
+NORMAL (U"1. If the selected Strings has the 4 strings ordered as \"heed\", \"hid\", \"hood\", \"hud\", and the permutation is "
 	"(4,3,2,1), the new Strings has the ordering \"hud\", \"hood\", \"hid\", \"heed\".")
-NORMAL (L"2. In the example that is discussed in the @@ExperimentMFC|listening experiment@ section, we have four stimuli \"heed.wav\", "
+NORMAL (U"2. In the example that is discussed in the @@ExperimentMFC|listening experiment@ section, we have four stimuli \"heed.wav\", "
 	"\"hid.wav\", \"hood.wav\", \"hud.wav\" that we want to present three times to each subject with a <PermuteBalancedNoDoublets> "
 	"randomization strategy, i.e. stimuli presented in blocks of four, randomized, and no two successive stimuli equal. "
 	"This type of randomization can easily be accomplished with a Permutation object and a Strings." )
-LIST_ITEM (L"1. Fill the Strings object with 12 strings, i.e. three repetitions of the four stimuli. ")
-LIST_ITEM (L"2. Create a Permutation object with 12 elements and perform  ##@@Permutation: Permute randomly (blocks)...|Permute randomly (blocks):@ 0, 0, 4, \"yes\", \"yes\"#. We randomly permute blocks of size 4 and permute randomly within these blocks and make sure that on the transition from on block to the other no two stimuli are equal. (Of course, the random permutation of the blocks makes no difference here since all the blocks have the same content.)")
-LIST_ITEM (L"3. Select the Strings and the Permutation together and choose ##Permute strings#. "
+LIST_ITEM (U"1. Fill the Strings object with 12 strings, i.e. three repetitions of the four stimuli. ")
+LIST_ITEM (U"2. Create a Permutation object with 12 elements and perform  ##@@Permutation: Permute randomly (blocks)...|Permute randomly (blocks):@ 0, 0, 4, \"yes\", \"yes\"#. We randomly permute blocks of size 4 and permute randomly within these blocks and make sure that on the transition from on block to the other no two stimuli are equal. (Of course, the random permutation of the blocks makes no difference here since all the blocks have the same content.)")
+LIST_ITEM (U"3. Select the Strings and the Permutation together and choose ##Permute strings#. "
 	"Now the new Strings will contain the new ordering of the stimuli.")
 MAN_END
 
-MAN_BEGIN (L"Strings: To Permutation...", L"djmw", 20050721)
-INTRO (L"Generates a @Permutation with the same number of elements as the @Strings.")
-ENTRY (L"Setting")
-TAG (L"##Sort")
-DEFINITION (L"determines whether the Permutation will have an element ordering that can be used to sort the Strings alphabetically.")
-ENTRY (L"Example")
-NORMAL (L"If \"Sort\" is %on, and the selected Strings contains 4 strings ordered as \"hud\", \"hid\", \"hood\", "
+MAN_BEGIN (U"Strings: To Permutation...", U"djmw", 20050721)
+INTRO (U"Generates a @Permutation with the same number of elements as the @Strings.")
+ENTRY (U"Setting")
+TAG (U"##Sort")
+DEFINITION (U"determines whether the Permutation will have an element ordering that can be used to sort the Strings alphabetically.")
+ENTRY (U"Example")
+NORMAL (U"If \"Sort\" is %on, and the selected Strings contains 4 strings ordered as \"hud\", \"hid\", \"hood\", "
 	"\"heed\", the generated Permutation will be (4,2,3,1). If you now select the String and the Permutation "
 	"together and choose @@Strings & Permutation: Permute strings|Permute strings@, the new Strings will have "
 	"the strings ordered alphabetically as \"heed\", \"hid\", \"hood\", \"hud\". "
@@ -308,99 +308,99 @@ NORMAL (L"If \"Sort\" is %on, and the selected Strings contains 4 strings ordere
 	"the elements in the Permutation before you select the Permutation and the Strings together. ")
 MAN_END
 
-MAN_BEGIN (L"Index", L"djmw", 20050725)
-INTRO (L"One of the @@Types of objects|types of objects@ in the P\\s{RAAT} program.")
+MAN_BEGIN (U"Index", U"djmw", 20050725)
+INTRO (U"One of the @@Types of objects|types of objects@ in the P\\s{RAAT} program.")
 MAN_END
 
-MAN_BEGIN (L"Strings: To Index", L"djmw", 20050721)
-INTRO (L"Generates an @Index from the selected @Strings.")
-ENTRY (L"Example")
-NORMAL (L"We start from the following #Strings:")
-CODE (L"6 (number of strings)")
-CODE (L"\"hallo\"")
-CODE (L"\"dag allemaal\"")
-CODE (L"\"hallo\"")
-CODE (L"\"tot morgen\"")
-CODE (L"\"hallo\"")
-CODE (L"\"tot morgen\"")
-NORMAL (L"This will give us the following #Index:")
-CODE (L"1 (number of columns) \"\" (no column name)")
-CODE (L"\"dag allemaal\"")
-CODE (L"\"hallo\"")
-CODE (L"\"tot morgen\"")
-CODE (L"6 (number of elements)")
-CODE (L"2")
-CODE (L"1")
-CODE (L"2")
-CODE (L"3")
-CODE (L"2")
-CODE (L"3")
+MAN_BEGIN (U"Strings: To Index", U"djmw", 20050721)
+INTRO (U"Generates an @Index from the selected @Strings.")
+ENTRY (U"Example")
+NORMAL (U"We start from the following #Strings:")
+CODE (U"6 (number of strings)")
+CODE (U"\"hallo\"")
+CODE (U"\"dag allemaal\"")
+CODE (U"\"hallo\"")
+CODE (U"\"tot morgen\"")
+CODE (U"\"hallo\"")
+CODE (U"\"tot morgen\"")
+NORMAL (U"This will give us the following #Index:")
+CODE (U"1 (number of columns) \"\" (no column name)")
+CODE (U"\"dag allemaal\"")
+CODE (U"\"hallo\"")
+CODE (U"\"tot morgen\"")
+CODE (U"6 (number of elements)")
+CODE (U"2")
+CODE (U"1")
+CODE (U"2")
+CODE (U"3")
+CODE (U"2")
+CODE (U"3")
 MAN_END
 
-MAN_BEGIN (L"Index: To Permutation...", L"djmw", 20050725)
-INTRO (L"Generates a @Permutation from the selected @Index by randomly permuting blocks of equivalent elements.")
-NORMAL (L"Suppose your data consists of groups of equivalent elements and the number of elements in the groups are not equal. You want to make random ordering of your data such that the elements in a group stay together. The following example shows you how.")
-ENTRY (L"Setting")
-TAG (L"##Permute within classes")
-DEFINITION (L"determines whether the elements within a class will be randomly permuted.")
-ENTRY (L"Example")
-NORMAL (L"Suppose your data, for example a @Strings, consists of groups of equivalent elements and the number of elements in the groups are not equal. You want to make a random ordering of your data such that the elements in a group stay together. The following example shows you how.")
-NORMAL (L"We start from the following Strings:")
-CODE (L"6 (number of strings)")
-CODE (L"\"hallo\"")
-CODE (L"\"dag allemaal\"")
-CODE (L"\"hallo\"")
-CODE (L"\"tot morgen\"")
-CODE (L"\"hallo\"")
-CODE (L"\"tot morgen\"")
-NORMAL (L"We choose @@Strings: To Index|To Index@ which will give us the following #Index:")
-CODE (L"1 (number of columns) \"\" (no column name)")
-CODE (L"\"dag allemaal\"")
-CODE (L"\"hallo\"")
-CODE (L"\"tot morgen\"")
-CODE (L"6 (number of elements)")
-CODE (L"2")
-CODE (L"1")
-CODE (L"2")
-CODE (L"3")
-CODE (L"2")
-CODE (L"3")
-NORMAL (L"We choose ##To Permutation# and with ##Permute within classes# %off, this might generate the permutation (2,4,6,1,3,5).")
-NORMAL (L"Selecting the Permutation and the Strings together and choosing @@Strings & Permutation: "
+MAN_BEGIN (U"Index: To Permutation...", U"djmw", 20050725)
+INTRO (U"Generates a @Permutation from the selected @Index by randomly permuting blocks of equivalent elements.")
+NORMAL (U"Suppose your data consists of groups of equivalent elements and the number of elements in the groups are not equal. You want to make random ordering of your data such that the elements in a group stay together. The following example shows you how.")
+ENTRY (U"Setting")
+TAG (U"##Permute within classes")
+DEFINITION (U"determines whether the elements within a class will be randomly permuted.")
+ENTRY (U"Example")
+NORMAL (U"Suppose your data, for example a @Strings, consists of groups of equivalent elements and the number of elements in the groups are not equal. You want to make a random ordering of your data such that the elements in a group stay together. The following example shows you how.")
+NORMAL (U"We start from the following Strings:")
+CODE (U"6 (number of strings)")
+CODE (U"\"hallo\"")
+CODE (U"\"dag allemaal\"")
+CODE (U"\"hallo\"")
+CODE (U"\"tot morgen\"")
+CODE (U"\"hallo\"")
+CODE (U"\"tot morgen\"")
+NORMAL (U"We choose @@Strings: To Index|To Index@ which will give us the following #Index:")
+CODE (U"1 (number of columns) \"\" (no column name)")
+CODE (U"\"dag allemaal\"")
+CODE (U"\"hallo\"")
+CODE (U"\"tot morgen\"")
+CODE (U"6 (number of elements)")
+CODE (U"2")
+CODE (U"1")
+CODE (U"2")
+CODE (U"3")
+CODE (U"2")
+CODE (U"3")
+NORMAL (U"We choose ##To Permutation# and with ##Permute within classes# %off, this might generate the permutation (2,4,6,1,3,5).")
+NORMAL (U"Selecting the Permutation and the Strings together and choosing @@Strings & Permutation: "
 	"Permute strings|Permute strings@ will generate the following Strings:")
-CODE (L"\"dag allemaal\"")
-CODE (L"\"tot morgen\"")
-CODE (L"\"tot morgen\"")
-CODE (L"\"hallo\"")
-CODE (L"\"hallo\"")
-CODE (L"\"hallo\"")
-NORMAL (L"We see that the permutation always keeps identical strings together.")
+CODE (U"\"dag allemaal\"")
+CODE (U"\"tot morgen\"")
+CODE (U"\"tot morgen\"")
+CODE (U"\"hallo\"")
+CODE (U"\"hallo\"")
+CODE (U"\"hallo\"")
+NORMAL (U"We see that the permutation always keeps identical strings together.")
 MAN_END
 
-MAN_BEGIN (L"Index: Extract part...", L"djmw", 20050725)
-INTRO (L"Creates a new @Index by copying a part of selected Index.")
-ENTRY (L"Example")
-NORMAL (L"Given the following Index:")
-CODE (L"1 (number of columns) \"\" (no column name)")
-CODE (L"\"dag allemaal\"")
-CODE (L"\"hallo\"")
-CODE (L"\"tot morgen\"")
-CODE (L"6 (number of elements)")
-CODE (L"2")
-CODE (L"1")
-CODE (L"2")
-CODE (L"3")
-CODE (L"2")
-CODE (L"3")
-NORMAL (L"The command ##Extract part... 1 2# gives you the new Index:")
-CODE (L"1 (number of columns) \"\" (no column name)")
-CODE (L"\"dag allemaal\"")
-CODE (L"\"hallo\"")
-CODE (L"\"tot morgen\"")
-CODE (L"6 (number of elements)")
-CODE (L"2")
-CODE (L"1")
-NORMAL (L"Note that all classes stay intact and may have zero references like for example the \"tot morgen\" class. ")
+MAN_BEGIN (U"Index: Extract part...", U"djmw", 20050725)
+INTRO (U"Creates a new @Index by copying a part of selected Index.")
+ENTRY (U"Example")
+NORMAL (U"Given the following Index:")
+CODE (U"1 (number of columns) \"\" (no column name)")
+CODE (U"\"dag allemaal\"")
+CODE (U"\"hallo\"")
+CODE (U"\"tot morgen\"")
+CODE (U"6 (number of elements)")
+CODE (U"2")
+CODE (U"1")
+CODE (U"2")
+CODE (U"3")
+CODE (U"2")
+CODE (U"3")
+NORMAL (U"The command ##Extract part... 1 2# gives you the new Index:")
+CODE (U"1 (number of columns) \"\" (no column name)")
+CODE (U"\"dag allemaal\"")
+CODE (U"\"hallo\"")
+CODE (U"\"tot morgen\"")
+CODE (U"6 (number of elements)")
+CODE (U"2")
+CODE (U"1")
+NORMAL (U"Note that all classes stay intact and may have zero references like for example the \"tot morgen\" class. ")
 MAN_END
 }
 
diff --git a/dwtools/manual_dwtools.cpp b/dwtools/manual_dwtools.cpp
index 5d7d0b4..8904922 100644
--- a/dwtools/manual_dwtools.cpp
+++ b/dwtools/manual_dwtools.cpp
@@ -38,13 +38,13 @@ static TableOfReal getStandardizedLogFrequencyPolsData (int includeLevels) {
 		}
 	}
 	TableOfReal_standardizeColumns (me.peek());
-	TableOfReal_setColumnLabel (me.peek(), 1, L"standardized log (%F__1_)");
-	TableOfReal_setColumnLabel (me.peek(), 2, L"standardized log (%F__2_)");
-	TableOfReal_setColumnLabel (me.peek(), 3, L"standardized log (%F__3_)");
+	TableOfReal_setColumnLabel (me.peek(), 1, U"standardized log (%F__1_)");
+	TableOfReal_setColumnLabel (me.peek(), 2, U"standardized log (%F__2_)");
+	TableOfReal_setColumnLabel (me.peek(), 3, U"standardized log (%F__3_)");
 	if (includeLevels) {
-		TableOfReal_setColumnLabel (me.peek(), 4, L"standardized %L__1_");
-		TableOfReal_setColumnLabel (me.peek(), 5, L"standardized %L__1_");
-		TableOfReal_setColumnLabel (me.peek(), 6, L"standardized %L__3_");
+		TableOfReal_setColumnLabel (me.peek(), 4, U"standardized %L__1_");
+		TableOfReal_setColumnLabel (me.peek(), 5, U"standardized %L__1_");
+		TableOfReal_setColumnLabel (me.peek(), 6, U"standardized %L__3_");
 	}
 	return me.transfer();
 }
@@ -52,20 +52,20 @@ static TableOfReal getStandardizedLogFrequencyPolsData (int includeLevels) {
 static void drawPolsF1F2_log (Graphics g) {
 	autoTableOfReal me = getStandardizedLogFrequencyPolsData (0);
 	Graphics_setWindow (g, -2.9, 2.9, -2.9, 2.9);
-	TableOfReal_drawScatterPlot (me.peek(), g, 1, 2, 0, 0, -2.9, 2.9, -2.9, 2.9, 10, 1, L"+", 1);
+	TableOfReal_drawScatterPlot (me.peek(), g, 1, 2, 0, 0, -2.9, 2.9, -2.9, 2.9, 10, 1, U"+", 1);
 }
 
 static void drawPolsF1F2ConcentrationEllipses (Graphics g) {
 	autoTableOfReal me = getStandardizedLogFrequencyPolsData (0);
 	autoDiscriminant d = TableOfReal_to_Discriminant (me.peek());
-	Discriminant_drawConcentrationEllipses (d.peek(), g, 1, 0, NULL, 0, 1, 2, -2.9, 2.9, -2.9, 2.9, 12, 1);
+	Discriminant_drawConcentrationEllipses (d.peek(), g, 1, 0, nullptr, 0, 1, 2, -2.9, 2.9, -2.9, 2.9, 12, 1);
 }
 
 static void drawPolsDiscriminantConfiguration (Graphics g) {
 	autoTableOfReal me = getStandardizedLogFrequencyPolsData (0);
 	autoDiscriminant d = TableOfReal_to_Discriminant (me.peek());
 	autoConfiguration c = Discriminant_and_TableOfReal_to_Configuration (d.peek(), me.peek(), 2);
-	Configuration_draw (c.peek(), g, 1, 2, -2.9, 2.9, -2.9, 2.9, 0, 1, L"", 1);
+	Configuration_draw (c.peek(), g, 1, 2, -2.9, 2.9, -2.9, 2.9, 0, 1, U"", 1);
 }
 
 static void drawBoxPlot (Graphics g) {
@@ -95,41 +95,41 @@ static void drawBoxPlot (Graphics g) {
 	Graphics_line (g, x - r, upperWhisker, x + r, upperWhisker);
 
 	y = q75 + 2.5 * hspread;
-	Graphics_text (g, x, y, L"*");
+	Graphics_text (g, x, y, U"*");
 	Graphics_arrow (g, xar, y, xal1, y);
-	Graphics_text (g, xtl, y, L"outlier > %%upperInnerFence%");
+	Graphics_text (g, xtl, y, U"outlier > %%upperInnerFence%");
 	y = q75 + 3.5 * hspread;
-	Graphics_text (g, x, y, L"o");
+	Graphics_text (g, x, y, U"o");
 	Graphics_arrow (g, xar, y, xal1, y);
-	Graphics_text (g, xtl, y, L"outlier > %%upperOuterFence%");
+	Graphics_text (g, xtl, y, U"outlier > %%upperOuterFence%");
 	y = upperOuterFence;
 	Graphics_setLineType (g, Graphics_DOTTED);
 	Graphics_line (g, -xtl, y, xtl, y);
-	Graphics_text (g, xtl, y, L"%%upperOuterFence%");
+	Graphics_text (g, xtl, y, U"%%upperOuterFence%");
 	y = upperInnerFence;
 	Graphics_line (g, -xtl, y, xtl, y);
-	Graphics_text (g, xtl, y, L"%%upperInnerFence%");
+	Graphics_text (g, xtl, y, U"%%upperInnerFence%");
 	Graphics_line (g, x - w, mean, x + w, mean);
 	Graphics_setLineType (g, Graphics_DRAWN);
 	y = upperWhisker;
 	Graphics_arrow (g, xar, y, xal2, y);
-	Graphics_text (g, xtl, y, L"%%upperWhisker%");
+	Graphics_text (g, xtl, y, U"%%upperWhisker%");
 	y = lowerWhisker;
 	Graphics_arrow (g, xar, y, xal2, y);
-	Graphics_text (g, xtl, y, L"%%lowerWhisker%");
+	Graphics_text (g, xtl, y, U"%%lowerWhisker%");
 
 	y = q75;
 	Graphics_arrow (g, xar, y, xal2, y);
-	Graphics_text (g, xtl, y, L"%%q75%");
+	Graphics_text (g, xtl, y, U"%%q75%");
 	y = q25;
 	Graphics_arrow (g, xar, y, xal2, y);
-	Graphics_text (g, xtl, y, L"%%q25%");
+	Graphics_text (g, xtl, y, U"%%q25%");
 	y = q50;
 	Graphics_arrow (g, xar, y, xal2, y);
-	Graphics_text (g, xtl, y, L"%%q50%");
+	Graphics_text (g, xtl, y, U"%%q50%");
 	y = mean;
 	Graphics_arrow (g, xar, y, xal2, y);
-	Graphics_text (g, xtl, y, L"%%mean%");
+	Graphics_text (g, xtl, y, U"%%mean%");
 	Graphics_unsetInner (g);
 }
 
@@ -145,63 +145,63 @@ static void drawPartionedMatrix (Graphics g) {
 	x1 = 1.5; y1 = 7+3/2;
 	Graphics_setFontSize (g, 14);
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-	Graphics_text (g, x1, y1, L"##S__yy_#");
+	Graphics_text (g, x1, y1, U"##S__yy_#");
 	x1 = 3 + 7/2;
-	Graphics_text (g, x1, y1, L"##S__yx_#");
+	Graphics_text (g, x1, y1, U"##S__yx_#");
 	y1 = 7/2;
-	Graphics_text (g, x1, y1, L"##S__xx_#");
+	Graphics_text (g, x1, y1, U"##S__xx_#");
 	x1 = 1.5;
-	Graphics_text (g, x1, y1, L"##S__xy_#");
+	Graphics_text (g, x1, y1, U"##S__xy_#");
 }
 
 void manual_dwtools_init (ManPages me);
 void manual_dwtools_init (ManPages me) {
 
-MAN_BEGIN (L"AffineTransform", L"djmw", 20010927)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An affine transform is a combination of a linear transformation #%A "
+MAN_BEGIN (U"AffineTransform", U"djmw", 20010927)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An affine transform is a combination of a linear transformation #%A "
 	"and a translation #%t that transforms a vector #%x to a new vector #%y "
 	"in the following way:")
-FORMULA (L"#%y = #%A x + #%t")
+FORMULA (U"#%y = #%A x + #%t")
 MAN_END
 
-MAN_BEGIN (L"AffineTransform: Invert", L"djmw", 20011008)
-INTRO (L"Get the inverse of the selected @AffineTransform object.")
-NORMAL (L"The inverse from")
-FORMULA (L"#%y = #%A x + #%t")
-NORMAL (L"is:")
-FORMULA (L"#%x = #%A^^-1^ - #%A^^-1^#%t.")
+MAN_BEGIN (U"AffineTransform: Invert", U"djmw", 20011008)
+INTRO (U"Get the inverse of the selected @AffineTransform object.")
+NORMAL (U"The inverse from")
+FORMULA (U"#%y = #%A x + #%t")
+NORMAL (U"is:")
+FORMULA (U"#%x = #%A^^-1^ - #%A^^-1^#%t.")
 MAN_END
 
-MAN_BEGIN (L"band filtering in the frequency domain", L"djmw", 20010404)
-INTRO (L"We describe how band filtering in the frequency domain is performed.")
-NORMAL (L"We start with a @Sound and end with a filter bank representation of "
+MAN_BEGIN (U"band filtering in the frequency domain", U"djmw", 20010404)
+INTRO (U"We describe how band filtering in the frequency domain is performed.")
+NORMAL (U"We start with a @Sound and end with a filter bank representation of "
 	"this sound. We assume a standard analysis context: a sound divided into "
 	"frames according to a certain %%window length% and %%time step%. We will "
 	"simulate a filterbank with %N filters.")
-NORMAL (L"The algorithm for each sound frame proceeds in the following way:")
-LIST_ITEM (L"1. Apply a Gaussian window to the sound frame.")
-LIST_ITEM (L"2. Convert the windowed frame into a @Spectrum object.")
-LIST_ITEM (L"3. Convert the spectral amplitudes to %energy values by squaring "
+NORMAL (U"The algorithm for each sound frame proceeds in the following way:")
+LIST_ITEM (U"1. Apply a Gaussian window to the sound frame.")
+LIST_ITEM (U"2. Convert the windowed frame into a @Spectrum object.")
+LIST_ITEM (U"3. Convert the spectral amplitudes to %energy values by squaring "
 	"the real and imaginary parts and multiplying by %df, the frequency "
 	"distance between two successive frequency points in the spectrum. "
 	"Since the Spectrum object only contains positive frequencies, "
 	"we have to multiply all energy values, except the first and the last "
 	"frequency, by another factor of 2 to compensate for negative frequencies.")
-LIST_ITEM (L"4. For each of the %N filters in the filter bank: determine the "
+LIST_ITEM (U"4. For each of the %N filters in the filter bank: determine the "
 	"inner product of its filter function with the energies as determined in "
 	"the previous step. The result of each inner product is the energy in the "
 	"corresponding filter.")
-LIST_ITEM (L"5. Convert the energies in each filter to power by dividing by "
+LIST_ITEM (U"5. Convert the energies in each filter to power by dividing by "
 	"the %%window length%.")
-LIST_ITEM (L"6. Correct the power, due to the windowing of the frame, by dividing "
+LIST_ITEM (U"6. Correct the power, due to the windowing of the frame, by dividing "
 	"by the integral of the %squared windowing function.")
-LIST_ITEM (L"7. Convert all power values to %dB's according to 10 * log10 "
+LIST_ITEM (U"7. Convert all power values to %dB's according to 10 * log10 "
 	"(%power / 4 10^^-10^).")
 MAN_END
 
-MAN_BEGIN (L"Bonferroni correction", L"djmw", 20011107)
-NORMAL (L"In general, if we have %k independent significance tests "
+MAN_BEGIN (U"Bonferroni correction", U"djmw", 20011107)
+NORMAL (U"In general, if we have %k independent significance tests "
 	"at the %\\al level, the probability %p that we will get no significant "
 	"differences in all these tests is simply the product of the individual "
 	"probabilities: (1 - %\\al)^^%k^. "
@@ -212,300 +212,300 @@ NORMAL (L"In general, if we have %k independent significance tests "
 	"In order to guarantee that the overall significance test is still at the "
 	"%\\al level, we have to adapt the significance level %\\al\\'p of the "
 	"individual test. ")
-NORMAL (L"This results in the following relation between the overall and the "
+NORMAL (U"This results in the following relation between the overall and the "
 	"individual significance level:")
-FORMULA (L"(1 - %\\al\\'p)^^%k%^ = 1 - %\\al.")
-NORMAL (L"This equation can easily be solved for %\\al\\'p:")
-FORMULA (L"%\\al\\'p = 1 - (1-%\\al)^^1/%k^,")
-NORMAL (L"which for small %\\al reduces to:")
-FORMULA (L"%\\al\\'p = %\\al / %k")
-NORMAL (L"This is a very simple recipe: If you want an overall significance "
+FORMULA (U"(1 - %\\al\\'p)^^%k%^ = 1 - %\\al.")
+NORMAL (U"This equation can easily be solved for %\\al\\'p:")
+FORMULA (U"%\\al\\'p = 1 - (1-%\\al)^^1/%k^,")
+NORMAL (U"which for small %\\al reduces to:")
+FORMULA (U"%\\al\\'p = %\\al / %k")
+NORMAL (U"This is a very simple recipe: If you want an overall significance "
 	"level %\\al and you perform %k individual tests, simply divide %\\al "
 	"by %k to obtain the significance level for the individual tests.")
 MAN_END
 
-MAN_BEGIN (L"box plot", L"djmw", 20111010)
-INTRO (L"A box plot provides a simple graphical summary of data. These plots "
+MAN_BEGIN (U"box plot", U"djmw", 20111010)
+INTRO (U"A box plot provides a simple graphical summary of data. These plots "
 	"originate from the work of @@Tukey (1977)@.")
-ENTRY (L"Definitions")
-NORMAL (L"The following figure shows an annotated box plot.")
+ENTRY (U"Definitions")
+NORMAL (U"The following figure shows an annotated box plot.")
 PICTURE (5.0, 5.0, drawBoxPlot)
-NORMAL (L"To understand the box plot we need the following definitions:")
-LIST_ITEM (L"%%q25% = lower quartile, 25\\%  of the data lie below this value")
-LIST_ITEM (L"%%q50% = median, 50\\%  of the data lie below this value")
-LIST_ITEM (L"%%q75% = upper quartile, 25\\%  of the data lie above this value")
-NORMAL (L"The following definitions all depend on these quantiles:")
-LIST_ITEM (L"%%hspread% = |%%q75% \\-- %%q25%| (50\\%  interval)")
-LIST_ITEM (L"%%lowerOuterFence% = %%q25% \\-- 3.0 * %%hspread% (not in figure)")
-LIST_ITEM (L"%%lowerInnerFence% = %%q25% \\-- 1.5 * %%hspread% (not in figure)")
-LIST_ITEM (L"%%upperInnerFence% = %%q75% + 1.5 * %%hspread%")
-LIST_ITEM (L"%%upperOuterFence% = %%q75% + 3.0 * %%hspread%")
-LIST_ITEM (L"%%lowerWhisker% = smallest data value larger then %%lowerInnerFence%")
-LIST_ITEM (L"%%upperWhisker% = largest data value smaller then %%upperInnerFence%")
-NORMAL (L"The box plot is a summary of the data in which:")
-LIST_ITEM (L"\\bu the horizontal lines of the rectangle correspond to "
+NORMAL (U"To understand the box plot we need the following definitions:")
+LIST_ITEM (U"%%q25% = lower quartile, 25\\%  of the data lie below this value")
+LIST_ITEM (U"%%q50% = median, 50\\%  of the data lie below this value")
+LIST_ITEM (U"%%q75% = upper quartile, 25\\%  of the data lie above this value")
+NORMAL (U"The following definitions all depend on these quantiles:")
+LIST_ITEM (U"%%hspread% = |%%q75% \\-- %%q25%| (50\\%  interval)")
+LIST_ITEM (U"%%lowerOuterFence% = %%q25% \\-- 3.0 * %%hspread% (not in figure)")
+LIST_ITEM (U"%%lowerInnerFence% = %%q25% \\-- 1.5 * %%hspread% (not in figure)")
+LIST_ITEM (U"%%upperInnerFence% = %%q75% + 1.5 * %%hspread%")
+LIST_ITEM (U"%%upperOuterFence% = %%q75% + 3.0 * %%hspread%")
+LIST_ITEM (U"%%lowerWhisker% = smallest data value larger then %%lowerInnerFence%")
+LIST_ITEM (U"%%upperWhisker% = largest data value smaller then %%upperInnerFence%")
+NORMAL (U"The box plot is a summary of the data in which:")
+LIST_ITEM (U"\\bu the horizontal lines of the rectangle correspond to "
 	" %%q25%, %%q50% and %%q75%, respectively.")
-LIST_ITEM (L"\\bu the dotted line corresponds to the mean.")
-LIST_ITEM (L"\\bu the outliers outside the %%outerFences% are drawn with an 'o'.")
-LIST_ITEM (L"\\bu the outliers in the intervals (%%lowerOuterFence%, %%lowerInnerFence%) "
+LIST_ITEM (U"\\bu the dotted line corresponds to the mean.")
+LIST_ITEM (U"\\bu the outliers outside the %%outerFences% are drawn with an 'o'.")
+LIST_ITEM (U"\\bu the outliers in the intervals (%%lowerOuterFence%, %%lowerInnerFence%) "
 	"and (%%upperInnerFence%, %%upperOuterFence%) are drawn with an '*'.")
-LIST_ITEM (L"\\bu the whisker lines outside the rectangle connect %%q25% with %%lowerWhisker%, and, "
+LIST_ITEM (U"\\bu the whisker lines outside the rectangle connect %%q25% with %%lowerWhisker%, and, "
 	"%%q75% with %%upperWhisker%, respectively. With no outliers present, the "
 	"whiskers mark minimum and/or maximum of the data.")
 MAN_END
 
 
-MAN_BEGIN (L"BarkFilter", L"djmw", 20141023)
-INTRO (L"A #deprecated @@types of objects|type of object@ in P\\s{RAAT}. It is replaced by @@BarkSpectrogram at .")
-NORMAL (L"An object of type BarkFilter represents an acoustic time-frequency "
+MAN_BEGIN (U"BarkFilter", U"djmw", 20141023)
+INTRO (U"A #deprecated @@types of objects|type of object@ in P\\s{RAAT}. It is replaced by @@BarkSpectrogram at .")
+NORMAL (U"An object of type BarkFilter represents an acoustic time-frequency "
 	"representation of a sound: the power spectral density %P(%z, %t), expressed "
 	"in dB's as 10*log10(power/4e-10)). In the now preferred BarkSpectrogram the power is represented instead of its dB value."
 	"It is sampled into a number of points around equally spaced times %t__%i_ "
 	"and frequencies %z__%j_ (on a Bark scale).")
-ENTRY (L"Inside a BarkFilter")
-NORMAL (L"With @Inspect you will see that this type contains the same attributes a @Matrix object.")
+ENTRY (U"Inside a BarkFilter")
+NORMAL (U"With @Inspect you will see that this type contains the same attributes a @Matrix object.")
 MAN_END
 
 
-MAN_BEGIN (L"BarkSpectrogram", L"djmw", 20141023)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type BarkSpectrogram represents an acoustic time-frequency "
+MAN_BEGIN (U"BarkSpectrogram", U"djmw", 20141023)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type BarkSpectrogram represents an acoustic time-frequency "
 	"representation of a sound: the power spectral density %P(%z, %t). "
 	"It is sampled into a number of points around equally spaced times %t__%i_ "
 	"and frequencies %z__%j_ (on a Bark scale).")
-NORMAL (L" The bark to hertz transformation is defined as:")
-FORMULA (L"hertz = 650.0 * sinh (bark / 7.0),")
-NORMAL (L"while its inverse is defined as:")
-FORMULA (L"bark = 7.0 * log (hertz/650 + sqrt (1 + (hertz/650)^^2^).")
-ENTRY (L"Inside a BarkSpectrogram")
-NORMAL (L"With @Inspect you will see that this type contains the same attributes a @Matrix object.")
+NORMAL (U" The bark to hertz transformation is defined as:")
+FORMULA (U"hertz = 650.0 * sinh (bark / 7.0),")
+NORMAL (U"while its inverse is defined as:")
+FORMULA (U"bark = 7.0 * log (hertz/650 + sqrt (1 + (hertz/650)^^2^).")
+ENTRY (U"Inside a BarkSpectrogram")
+NORMAL (U"With @Inspect you will see that this type contains the same attributes a @Matrix object.")
 MAN_END
 
-MAN_BEGIN (L"BarkSpectrogram: Draw Sekey-Hanson auditory filters...", L"djmw", 20141023)
-INTRO (L"A command to draw the auditory filters defined in @@Sekey & Hanson (1984)@.")
+MAN_BEGIN (U"BarkSpectrogram: Draw Sekey-Hanson auditory filters...", U"djmw", 20141023)
+INTRO (U"A command to draw the auditory filters defined in @@Sekey & Hanson (1984)@.")
 MAN_END
 
-MAN_BEGIN (L"BarkSpectrogram: Paint image...", L"djmw", 20141023)
-INTRO (L"A command to draw the selected @BarkSpectrogram into the @@Picture window@ in shades of grey.")
+MAN_BEGIN (U"BarkSpectrogram: Paint image...", U"djmw", 20141023)
+INTRO (U"A command to draw the selected @BarkSpectrogram into the @@Picture window@ in shades of grey.")
 MAN_END
 
-MAN_BEGIN (L"bootstrap", L"djmw", 20141101)
-INTRO (L"The bootstrap data set is a random sample of size %n "
+MAN_BEGIN (U"bootstrap", U"djmw", 20141101)
+INTRO (U"The bootstrap data set is a random sample of size %n "
 	"drawn %%with% replacement from the sample (%x__1_,...%x__n_). This "
 	"means that the bootstrap data set consists of members of the original "
 	"data set, some appearing zero times, some appearing once, some appearing "
 	"twice, etc.")
-NORMAL (L"More information can be found in @@Efron & Tibshirani (1993)@.")
+NORMAL (U"More information can be found in @@Efron & Tibshirani (1993)@.")
 MAN_END
 
-MAN_BEGIN (L"canonical variate", L"djmw", 20060328)
-NORMAL (L"A ##canonical variate# is a new variable (variate) formed by making a linear combination of two "
+MAN_BEGIN (U"canonical variate", U"djmw", 20060328)
+NORMAL (U"A ##canonical variate# is a new variable (variate) formed by making a linear combination of two "
 	"or more variates (variables) from a data set. "
 	"A linear combination of variables is the same as a weighted sum of variables. "
 	"Because we can in infinitely many ways choose combinations of weights between variables in a data set, "
 	"there are also infinitely many canonical variates possible. ")
-NORMAL (L"In general additional constraints must be satisfied by the weights to get a meaningful canonical variate. "
+NORMAL (U"In general additional constraints must be satisfied by the weights to get a meaningful canonical variate. "
 	"For example, in @@Canonical correlation analysis|canonical correlation analyis@ a data set is split up into two parts, a %%dependent% and an %%independent% part. "
 	"In both parts we can form a canonical variate and we choose weights that maximize the correlation between these canonical variates "
 	"(there is an @@TableOfReal: To CCA...|algorithm@ that calculates these weights).")
 MAN_END
 
-MAN_BEGIN (L"Categories", L"djmw", 19960918)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type Categories represents an ordered collection of categories. Each "
+MAN_BEGIN (U"Categories", U"djmw", 19960918)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type Categories represents an ordered collection of categories. Each "
 	"category is a simple text string.")
-ENTRY (L"Categories commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu ##Create an empty Categories#")
-LIST_ITEM (L"\\bu @@FFNet & Pattern: To Categories...@")
-NORMAL (L"Viewing and editing:")
-LIST_ITEM (L"\\bu @CategoriesEditor")
-NORMAL (L"Analysis:")
-LIST_ITEM (L"\\bu @@Categories: To Confusion@")
-LIST_ITEM (L"\\bu @@Categories: Difference@")
-NORMAL (L"Synthesis")
-LIST_ITEM (L"\\bu @@Categories: Append@")
-LIST_ITEM (L"\\bu ##Categories: Permute...#")
-LIST_ITEM (L"\\bu ##Categories: To unique Categories#")
-ENTRY (L"Inside a Categories")
-NORMAL (L"With @Inspect you will see the following attributes:")
-TAG (L"%size")
-DEFINITION (L"the number of simple categories.")
-TAG (L"%item[]")
-DEFINITION (L"the categories. Each category is an object of type #SimpleString.")
-MAN_END
-
-MAN_BEGIN (L"Categories: Difference", L"djmw", 19960918)
-INTRO (L"A command to compute the difference between two selected @Categories objects.")
-ENTRY (L"Behaviour")
-NORMAL (L"Each element in the first object is compared with the corresponding "
+ENTRY (U"Categories commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu ##Create an empty Categories#")
+LIST_ITEM (U"\\bu @@FFNet & Pattern: To Categories...@")
+NORMAL (U"Viewing and editing:")
+LIST_ITEM (U"\\bu @CategoriesEditor")
+NORMAL (U"Analysis:")
+LIST_ITEM (U"\\bu @@Categories: To Confusion@")
+LIST_ITEM (U"\\bu @@Categories: Difference@")
+NORMAL (U"Synthesis")
+LIST_ITEM (U"\\bu @@Categories: Append@")
+LIST_ITEM (U"\\bu ##Categories: Permute...#")
+LIST_ITEM (U"\\bu ##Categories: To unique Categories#")
+ENTRY (U"Inside a Categories")
+NORMAL (U"With @Inspect you will see the following attributes:")
+TAG (U"%size")
+DEFINITION (U"the number of simple categories.")
+TAG (U"%item[]")
+DEFINITION (U"the categories. Each category is an object of type #SimpleString.")
+MAN_END
+
+MAN_BEGIN (U"Categories: Difference", U"djmw", 19960918)
+INTRO (U"A command to compute the difference between two selected @Categories objects.")
+ENTRY (U"Behaviour")
+NORMAL (U"Each element in the first object is compared with the corresponding "
 	"object in the second object according to its compare method. "
 	"The number of different %categories will be shown in the @@Info window at .")
 MAN_END
 
-MAN_BEGIN (L"Categories: To Confusion", L"djmw", 19960918)
-INTRO (L"A command to compute the @Confusion matrix from two selected "
+MAN_BEGIN (U"Categories: To Confusion", U"djmw", 19960918)
+INTRO (U"A command to compute the @Confusion matrix from two selected "
 	"@Categories objects.")
-ENTRY (L"Algorithm")
-NORMAL (L"A confusion matrix is constructed from both #Categories objects in "
+ENTRY (U"Algorithm")
+NORMAL (U"A confusion matrix is constructed from both #Categories objects in "
 	"the following way: The first Categories object is considered the stimulus "
 	"Categories and its unique (sorted) categories "
 	"form the row indices of the confusion matrix, the unique (sorted) "
 	"categories of the second object form the column indices of this matrix.")
-NORMAL (L"Next, each element in the first #Categories object is compared with "
+NORMAL (U"Next, each element in the first #Categories object is compared with "
 	"the corresponding object in the second object and the element in the "
 	"confusion matrix addressed by this pair is incremented by 1.")
 MAN_END
 
-MAN_BEGIN (L"Categories: Append", L"djmw", 19960918)
-INTRO (L"You can choose this command after selecting 2 objects of type @Categories. "
+MAN_BEGIN (U"Categories: Append", U"djmw", 19960918)
+INTRO (U"You can choose this command after selecting 2 objects of type @Categories. "
 	"A new object is created that contains the second object appended after the first.")
 MAN_END
 
-MAN_BEGIN (L"Categories: Edit", L"djmw", 19960918)
-INTRO (L"You can choose this command after selecting one #Categories. "
+MAN_BEGIN (U"Categories: Edit", U"djmw", 19960918)
+INTRO (U"You can choose this command after selecting one #Categories. "
 	"A @CategoriesEditor will appear on the screen, with the selected #Categories in it.")
 MAN_END
 
-MAN_BEGIN (L"CategoriesEditor", L"djmw", 19960918)
-ENTRY (L"An editor for manipulating @Categories.")
-NORMAL (L"To make a selection, use the left mouse button.")
-NORMAL (L"The Ctrl key extends a selection (discontinuously).")
-NORMAL (L"The Shift key extends a selection contiguously.")
+MAN_BEGIN (U"CategoriesEditor", U"djmw", 19960918)
+ENTRY (U"An editor for manipulating @Categories.")
+NORMAL (U"To make a selection, use the left mouse button.")
+NORMAL (U"The Ctrl key extends a selection (discontinuously).")
+NORMAL (U"The Shift key extends a selection contiguously.")
 MAN_END
 
-MAN_BEGIN (L"CC", L"djmw", 20010219)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"Any object that represents cepstral coefficients as a function of "
+MAN_BEGIN (U"CC", U"djmw", 20010219)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"Any object that represents cepstral coefficients as a function of "
 	"time.")
 MAN_END
 
-MAN_BEGIN (L"CC: Get value in frame...", L"djmw", 20140926)
-INTRO (L"Get the cepstral coefficient value at a specified position in a specified frame.")
+MAN_BEGIN (U"CC: Get value in frame...", U"djmw", 20140926)
+INTRO (U"Get the cepstral coefficient value at a specified position in a specified frame.")
 MAN_END
 
-MAN_BEGIN (L"CC: Get c0 value in frame...", L"djmw", 20140926)
-INTRO (L"Get the zeroth cepstral coefficient value in the specified frame. For a @MFCC object this value relates to energy.")
+MAN_BEGIN (U"CC: Get c0 value in frame...", U"djmw", 20140926)
+INTRO (U"Get the zeroth cepstral coefficient value in the specified frame. For a @MFCC object this value relates to energy.")
 MAN_END
 
-MAN_BEGIN (L"CCA", L"djmw", 20020323)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}. ")
-NORMAL (L"An object of type CCA represents the @@Canonical correlation "
+MAN_BEGIN (U"CCA", U"djmw", 20020323)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}. ")
+NORMAL (U"An object of type CCA represents the @@Canonical correlation "
 	"analysis@ of two multivariate datasets.")
-ENTRY (L"Commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@TableOfReal: To CCA...@")
+ENTRY (U"Commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@TableOfReal: To CCA...@")
 MAN_END
 
-MAN_BEGIN (L"CCA: Get zero correlation probability...", L"djmw", 20040407)
-INTRO (L"Get the probability that for the selected @CCA object the chosen "
+MAN_BEGIN (U"CCA: Get zero correlation probability...", U"djmw", 20040407)
+INTRO (U"Get the probability that for the selected @CCA object the chosen "
 	"canonical correlation coefficient is different from zero.")
-ENTRY (L"Setting")
-TAG (L"##Index")
-DEFINITION (L"is the index of the canonical correlation coefficient that "
+ENTRY (U"Setting")
+TAG (U"##Index")
+DEFINITION (U"is the index of the canonical correlation coefficient that "
 	"you want to test.")
-ENTRY (L"Algorithm")
-NORMAL (L"Wilks' statistic: the probability that coefficient \\ro__%index_ "
+ENTRY (U"Algorithm")
+NORMAL (U"Wilks' statistic: the probability that coefficient \\ro__%index_ "
 	"differs from zero is ")
-FORMULA (L" %probability = chiSquareQ (\\ci^2, %ndf),")
-NORMAL (L"where the %%number of degrees of freedom% parameter equals")
-FORMULA (L"%ndf = (%n__y_ - %index +1)(%n__x_ - %index +1)")
-NORMAL (L"and the chi-squared parameter is")
-FORMULA (L"\\ci^2 = \\--(%numberOfObservations - (%n__y_ + %n__x_ +3)/2) "
+FORMULA (U" %probability = chiSquareQ (\\ci^2, %ndf),")
+NORMAL (U"where the %%number of degrees of freedom% parameter equals")
+FORMULA (U"%ndf = (%n__y_ - %index +1)(%n__x_ - %index +1)")
+NORMAL (U"and the chi-squared parameter is")
+FORMULA (U"\\ci^2 = \\--(%numberOfObservations - (%n__y_ + %n__x_ +3)/2) "
 	"log (\\La__%index_),")
-NORMAL (L"In the formulas above the variables %n__y_ and %n__x_ are the "
+NORMAL (U"In the formulas above the variables %n__y_ and %n__x_ are the "
 	"dimensions of the dependent and the independent data sets whose "
 	"canonical correlations have been "
 	"obtained, and Wilks' lambda is:")
-FORMULA (L"\\La__index_ = \\Pi__%i=%index..min(%ny,%nx)_ (1 \\-- \\ro__%i_^^2^)")
+FORMULA (U"\\La__index_ = \\Pi__%i=%index..min(%ny,%nx)_ (1 \\-- \\ro__%i_^^2^)")
 MAN_END
 
-MAN_BEGIN (L"CCA & Correlation: To TableOfReal (loadings)", L"djmw", 20020525)
-INTRO (L"Determine from the selected @CCA and @Correlation objects the correlations "
+MAN_BEGIN (U"CCA & Correlation: To TableOfReal (loadings)", U"djmw", 20020525)
+INTRO (U"Determine from the selected @CCA and @Correlation objects the correlations "
 	"of the canonical variables with the original variables. These correlations are "
 	"called %%canonical factor loadings%, or also %%structure correlation "
 	"coefficients%.")
 MAN_END
 
-MAN_BEGIN (L"CCA & Correlation: Get variance fraction...", L"djmw", 20060323)
-INTRO (L"Determine from the selected @CCA and @Correlation objects the fraction of the variance "
+MAN_BEGIN (U"CCA & Correlation: Get variance fraction...", U"djmw", 20060323)
+INTRO (U"Determine from the selected @CCA and @Correlation objects the fraction of the variance "
 	"explained by the selected @@canonical variate@ range.")
-ENTRY (L"Settings")
-TAG (L"##%X or Y")
-DEFINITION (L"determines whether you select the dependent (y) or the independent (x) set.")
-TAG (L"##Canonical variate range")
-DEFINITION (L"determines the canonical variates (or canonical variables).")
-ENTRY (L"Remarks")
-NORMAL (L"1. In general the variance fractions for a particular canonical variate in the "
+ENTRY (U"Settings")
+TAG (U"##%X or Y")
+DEFINITION (U"determines whether you select the dependent (y) or the independent (x) set.")
+TAG (U"##Canonical variate range")
+DEFINITION (U"determines the canonical variates (or canonical variables).")
+ENTRY (U"Remarks")
+NORMAL (U"1. In general the variance fractions for a particular canonical variate in the "
 	"dependent and in the independent set are not the same.")
-NORMAL (L"2. In general, the variance fractions for all canonical variates do not sum to 1.")
-ENTRY (L"Algorithm")
-NORMAL (L"The formula's can be found on page 170 of @@Cooley & Lohnes (1971)@.")
-NORMAL (L"For example, the fraction of the variance explained by the %i^^th^ canonical "
+NORMAL (U"2. In general, the variance fractions for all canonical variates do not sum to 1.")
+ENTRY (U"Algorithm")
+NORMAL (U"The formula's can be found on page 170 of @@Cooley & Lohnes (1971)@.")
+NORMAL (U"For example, the fraction of the variance explained by the %i^^th^ canonical "
 	"variable in the dependent set is:")
-FORMULA (L"%%fractionVariance% = ((#y__i_\\'p #R__yy_\\'p #R__yy_ #y__i_) / (#y__i_\\'p #R__yy_ #y__i_)) / %n__%y_,")
-NORMAL (L"where #y__%i_ is the eigenvector for dependent canonical variable %i and #R__%%yy%_ is the correlation matrix for the %n__%y_ variables in the dependent set.")
+FORMULA (U"%%fractionVariance% = ((#y__i_\\'p #R__yy_\\'p #R__yy_ #y__i_) / (#y__i_\\'p #R__yy_ #y__i_)) / %n__%y_,")
+NORMAL (U"where #y__%i_ is the eigenvector for dependent canonical variable %i and #R__%%yy%_ is the correlation matrix for the %n__%y_ variables in the dependent set.")
 MAN_END
 
-MAN_BEGIN (L"CCA & Correlation: Get redundancy (sl)...", L"djmw", 20060323)
-INTRO (L"Determine from the selected @CCA and @Correlation objects the Stewart-Love redundancy for the "
+MAN_BEGIN (U"CCA & Correlation: Get redundancy (sl)...", U"djmw", 20060323)
+INTRO (U"Determine from the selected @CCA and @Correlation objects the Stewart-Love redundancy for the "
 	"selected canonical variates.")
-NORMAL (L"The Stewart-Love redundancy for a single @@canonical variate@ is the fraction of variance explained by the selected "
+NORMAL (U"The Stewart-Love redundancy for a single @@canonical variate@ is the fraction of variance explained by the selected "
 	"canonical variate in a set times the fraction of shared variance between the corresponding canonical variates in the two sets.")
-NORMAL (L"The Stewart-Love redundancy for a canonical variate range is the sum of the individual redundancies.")
-ENTRY (L"Settings")
-TAG (L"##X or Y")
-DEFINITION (L"determines whether you select the dependent (y) or the independent (x) set.")
-TAG (L"##Canonical variate range")
-DEFINITION (L"determines the canonical variates (or canonical variables).")
-ENTRY (L"Algorithm")
-NORMAL (L"The formula's can be found on page 170 of @@Cooley & Lohnes (1971)@.")
-NORMAL (L"For example, the redundancy of the dependent set (y) given the independent set (x) for the %i^^%%th%^ canonical "
+NORMAL (U"The Stewart-Love redundancy for a canonical variate range is the sum of the individual redundancies.")
+ENTRY (U"Settings")
+TAG (U"##X or Y")
+DEFINITION (U"determines whether you select the dependent (y) or the independent (x) set.")
+TAG (U"##Canonical variate range")
+DEFINITION (U"determines the canonical variates (or canonical variables).")
+ENTRY (U"Algorithm")
+NORMAL (U"The formula's can be found on page 170 of @@Cooley & Lohnes (1971)@.")
+NORMAL (U"For example, the redundancy of the dependent set (y) given the independent set (x) for the %i^^%%th%^ canonical "
 	"variate can be expressed as:")
-FORMULA (L"%R__%i_(y) = %%varianceFraction%__%i_(y) * \\ro__%i_^2, ")
-NORMAL (L"where %%varianceFraction%__%i_(y) is the @@CCA & Correlation: Get variance fraction...|variance fraction@ explained "
+FORMULA (U"%R__%i_(y) = %%varianceFraction%__%i_(y) * \\ro__%i_^2, ")
+NORMAL (U"where %%varianceFraction%__%i_(y) is the @@CCA & Correlation: Get variance fraction...|variance fraction@ explained "
 	"by the %i^^%%th%^ canonical variate of the dependent set, and \\ro__%i_ is the %i^^%%th%^ canonical correlation coefficient.")
-NORMAL (L"The redundancy for the selected canonical variate in the dependent set shows what "
+NORMAL (U"The redundancy for the selected canonical variate in the dependent set shows what "
 	"fraction of the variance in the %%dependent% set is already \"explained\" by "
 	"the variance in the %%independent% set, i.e. this fraction could be considered as redundant.")
-NORMAL (L"In the same way we can measure the redundancy of the independent (x) set giving the dependent set (y).")
-ENTRY (L"Remark")
-NORMAL (L"In general %R__%i_(y) \\=/ %R__%i_(x).")
+NORMAL (U"In the same way we can measure the redundancy of the independent (x) set giving the dependent set (y).")
+ENTRY (U"Remark")
+NORMAL (U"In general %R__%i_(y) \\=/ %R__%i_(x).")
 MAN_END
 
-MAN_BEGIN (L"CCA & TableOfReal: To TableOfReal (loadings)", L"djmw", 20020525)
-INTRO (L"Determine from the selected @CCA and @TableOfReal objects the correlations "
+MAN_BEGIN (U"CCA & TableOfReal: To TableOfReal (loadings)", U"djmw", 20020525)
+INTRO (U"Determine from the selected @CCA and @TableOfReal objects the correlations "
 	"of the canonical variables with the original variables. These correlations are "
 	"called %%canonical factor loadings%, or also %%structure correlation "
 	"coefficients%.")
 MAN_END
 
-MAN_BEGIN (L"CCA & TableOfReal: To TableOfReal (scores)...", L"djmw", 20040407)
-INTRO (L"Determines the scores on the dependent and the independent canonical "
+MAN_BEGIN (U"CCA & TableOfReal: To TableOfReal (scores)...", U"djmw", 20040407)
+INTRO (U"Determines the scores on the dependent and the independent canonical "
 	"variates from the selected @CCA and @TableOfReal objects.")
-ENTRY (L"Settings")
-TAG (L"##Number of canonical correlations")
-DEFINITION (L"determines the dimension, i.e., the number of elements of the resulting "
+ENTRY (U"Settings")
+TAG (U"##Number of canonical correlations")
+DEFINITION (U"determines the dimension, i.e., the number of elements of the resulting "
 	"canonical score vectors. The newly created table will have twice this number of "
 	"columns because we have calculated score vectors for the dependent and the "
 	"independent variates.")
-ENTRY (L"Behaviour")
-NORMAL (L"The scores on the dependent set are determined as #T__%y_ #Y, where "
+ENTRY (U"Behaviour")
+NORMAL (U"The scores on the dependent set are determined as #T__%y_ #Y, where "
 	"#T__%y_ is the dependent part in the table and #Y is a matrix with "
 	"%numberOfCanonicalCorrelations eigenvectors for the dependent variate.")
-NORMAL (L"The scores for the independent variates are then determined in an analogous "
+NORMAL (U"The scores for the independent variates are then determined in an analogous "
 	"way as #T__%x_ #X.")
-NORMAL (L"The scores for the dependent data will be in the lower numbered columns, "
+NORMAL (U"The scores for the dependent data will be in the lower numbered columns, "
 	"the scores for the independent part will be in the higher numbered columns of "
 	"the newly created object.")
 MAN_END
 
 
-MAN_BEGIN (L"Canonical correlation analysis", L"djmw", 20140509)
-INTRO (L"This tutorial will show you how to perform canonical correlation "
+MAN_BEGIN (U"Canonical correlation analysis", U"djmw", 20140509)
+INTRO (U"This tutorial will show you how to perform canonical correlation "
        "analysis with  P\\s{RAAT}.")
-ENTRY (L"1. Objective of canonical correlation analysis")
-NORMAL (L"In canonical correlation analysis we try to find the correlations between "
+ENTRY (U"1. Objective of canonical correlation analysis")
+NORMAL (U"In canonical correlation analysis we try to find the correlations between "
 	"two data sets. One data set is called the %dependent set, the other the "
 	"%independent set. In P\\s{RAAT} these two sets must reside into one "
 	"@TableOfReal object. The lower numbered columns of this table will then be "
@@ -513,7 +513,7 @@ NORMAL (L"In canonical correlation analysis we try to find the correlations betw
 	"independent part. "
 	"The dimension of, i.e., the number of columns in, the dependent part may not "
 	"exceed the dimension of the independent part.")
-NORMAL (L"As an example, we will use the dataset from @@Pols et al. (1973)@ "
+NORMAL (U"As an example, we will use the dataset from @@Pols et al. (1973)@ "
 	"with the frequencies and levels of the first three formants from the 12 "
 	"Dutch monophthongal vowels as spoken in /h_t/ context by 50 male speakers. "
 	"We will try to find the canonical correlation between formant frequencies "
@@ -523,27 +523,27 @@ NORMAL (L"As an example, we will use the dataset from @@Pols et al. (1973)@ "
 	"@@discriminant analysis@ tutorial you can find how to get these data, "
 	"how to take the logarithm of the formant frequency values and how to "
 	"standardize them. The following script summarizes:")
-CODE (L"pols50m = Create TableOfReal (Pols 1973): \"yes\"")
-CODE (L"Formula: \"if col < 4 then log10 (self) else self endif\"")
-CODE (L"Standardize columns")
-NORMAL (L"Before we start with the %canonical correlation analysis we will first have "
+CODE (U"pols50m = Create TableOfReal (Pols 1973): \"yes\"")
+CODE (U"Formula: \"if col < 4 then log10 (self) else self endif\"")
+CODE (U"Standardize columns")
+NORMAL (U"Before we start with the %canonical correlation analysis we will first have "
 	"a look at the %Pearson correlations of this table and  "
 	"calculate the @Correlation matrix. It is given by:")
-CODE (L"       F1     F2     F3     L1     L2     L3")
-CODE (L"F1   1     -0.338  0.191  0.384 -0.505 -0.014")
-CODE (L"F2  -0.338  1      0.190 -0.106  0.526 -0.568")
-CODE (L"F3   0.191  0.190  1      0.113 -0.038  0.019")
-CODE (L"L1   0.384 -0.106  0.113  1     -0.038  0.085")
-CODE (L"L2  -0.505  0.526 -0.038 -0.038  1      0.128")
-CODE (L"L3  -0.014 -0.568  0.019  0.085  0.128  1")
-NORMAL (L"The following script summarizes:")
-CODE (L"selectObject: pols50m")
-CODE (L"To Correlation")
-CODE (L"Draw as numbers: 1, 0, \"decimal\", 3")
-NORMAL (L"The correlation matrix shows that high correlations exist between some "
+CODE (U"       F1     F2     F3     L1     L2     L3")
+CODE (U"F1   1     -0.338  0.191  0.384 -0.505 -0.014")
+CODE (U"F2  -0.338  1      0.190 -0.106  0.526 -0.568")
+CODE (U"F3   0.191  0.190  1      0.113 -0.038  0.019")
+CODE (U"L1   0.384 -0.106  0.113  1     -0.038  0.085")
+CODE (U"L2  -0.505  0.526 -0.038 -0.038  1      0.128")
+CODE (U"L3  -0.014 -0.568  0.019  0.085  0.128  1")
+NORMAL (U"The following script summarizes:")
+CODE (U"selectObject: pols50m")
+CODE (U"To Correlation")
+CODE (U"Draw as numbers: 1, 0, \"decimal\", 3")
+NORMAL (U"The correlation matrix shows that high correlations exist between some "
 	"formant frequencies and some levels. For example, the correlation "
 	"coefficient between F2 and L2 equals 0.526.")
-NORMAL (L"In a canonical correlation analysis of the dataset above, we try "
+NORMAL (U"In a canonical correlation analysis of the dataset above, we try "
 	"to find the linear "
 	"combination %u__1_ of %F__1_, %F__2_ and %F__3_ that correlates maximally "
 	"with the linear combination %v__1_ of %L__1_, %L__2_ and %L__3_. "
@@ -552,1051 +552,1051 @@ NORMAL (L"In a canonical correlation analysis of the dataset above, we try "
 	"%v__2_ of the levels that have maximum correlation. These %u__2_ and "
 	"%v__2_ must be uncorrelated with %u__1_ and %v__1_. "
 	"When we express the above with formulas we have:")
-FORMULA (L"%u__1_ = %y__11_%F__1_+%y__12_%F__2_ + %y__13_%F__3_")
-FORMULA (L"%v__1_ = %x__11_%L__1_+%x__12_%L__2_ + %x__13_%L__3_")
-FORMULA (L"\\ro(%u__1_, %v__1_) = maximum, \\ro(%u__2_, %v__2_) = submaximum, ")
-FORMULA (L"\\ro(%u__2_, %u__1_) = \\ro (%u__2_, %v__1_) = \\ro (%v__2_, %v__1_) "
+FORMULA (U"%u__1_ = %y__11_%F__1_+%y__12_%F__2_ + %y__13_%F__3_")
+FORMULA (U"%v__1_ = %x__11_%L__1_+%x__12_%L__2_ + %x__13_%L__3_")
+FORMULA (U"\\ro(%u__1_, %v__1_) = maximum, \\ro(%u__2_, %v__2_) = submaximum, ")
+FORMULA (U"\\ro(%u__2_, %u__1_) = \\ro (%u__2_, %v__1_) = \\ro (%v__2_, %v__1_) "
 	"= \\ro (%v__2_, %u__1_) = 0,")
-NORMAL (L"where the \\ro(%u__i_, %v__i_) are the correlations between the "
+NORMAL (U"where the \\ro(%u__i_, %v__i_) are the correlations between the "
 	"@@canonical variate at s %u__i_ and %v__i_ and the %y__%ij_'s and %x__%ij_'s are"
 	" the ##canonical coefficients# for the dependent and the independent "
 	"variates, respectively.")
-ENTRY (L"2. How to perform a canonical correlation analysis")
-NORMAL (L"Select the TableOfReal and choose from the dynamic menu the option "
+ENTRY (U"2. How to perform a canonical correlation analysis")
+NORMAL (U"Select the TableOfReal and choose from the dynamic menu the option "
 	"@@TableOfReal: To CCA...|To CCA... at . This command is available in the "
 	"\"Multivariate statistics\" action button. We fill out the form and supply "
 	"3 for %%Dimension of dependent variate%. The resulting CCA object will bear "
 	"the same name as the TableOfReal object. The following script summarizes:")
-CODE (L"selectObject: pols50m")
-CODE (L"cca = To CCA: 3")
-ENTRY (L"3. How to get the canonical correlation coefficients")
-NORMAL (L"You can get the canonical correlation coefficients by queries of the CCA "
+CODE (U"selectObject: pols50m")
+CODE (U"cca = To CCA: 3")
+ENTRY (U"3. How to get the canonical correlation coefficients")
+NORMAL (U"You can get the canonical correlation coefficients by queries of the CCA "
 	"object. You will find that the three canonical correlation coefficients, "
 	"\\ro(%u__1_, %v__1_), \\ro(%u__2_, %v__2_) and \\ro(%u__3_, %v__3_) are "
 	" approximately 0.86, 0.53 and 0.07, respectively. "
 	"The following script summarizes:")
-CODE (L"cc1 = Get correlation: 1")
-CODE (L"cc2 = Get correlation: 2")
-CODE (L"cc3 = Get correlation: 3")
-CODE (L"writeInfoLine: \"cc1 = \", cc1, \", cc2 = \", cc2, \", cc3 = \", cc3")
-ENTRY (L"4. How to obtain canonical scores")
-NORMAL (L"Canonical #scores, also named @@canonical variate at s, are the linear combinations:")
-FORMULA (L"%u__%i_ = %y__%i1_%F__1_+%y__%i2_%F__2_ + %y__%i3_%F__3_, and,")
-FORMULA (L"%v__%i_ = %x__%i1_%L__1_+%x__%i2_%L__2_ + %x__%i3_%L__3_,")
-NORMAL (L"where the index %i runs from 1 to the number of correlation coefficients.")
-NORMAL (L"You can get the canonical scores by selecting a CCA object together with "
+CODE (U"cc1 = Get correlation: 1")
+CODE (U"cc2 = Get correlation: 2")
+CODE (U"cc3 = Get correlation: 3")
+CODE (U"writeInfoLine: \"cc1 = \", cc1, \", cc2 = \", cc2, \", cc3 = \", cc3")
+ENTRY (U"4. How to obtain canonical scores")
+NORMAL (U"Canonical #scores, also named @@canonical variate at s, are the linear combinations:")
+FORMULA (U"%u__%i_ = %y__%i1_%F__1_+%y__%i2_%F__2_ + %y__%i3_%F__3_, and,")
+FORMULA (U"%v__%i_ = %x__%i1_%L__1_+%x__%i2_%L__2_ + %x__%i3_%L__3_,")
+NORMAL (U"where the index %i runs from 1 to the number of correlation coefficients.")
+NORMAL (U"You can get the canonical scores by selecting a CCA object together with "
 	"the TableOfReal object and choose "
 	"@@CCA & TableOfReal: To TableOfReal (scores)...|To TableOfReal (scores)...@")
-NORMAL (L"When we now calculate the ##Correlation# matrix of these canonical variates we "
+NORMAL (U"When we now calculate the ##Correlation# matrix of these canonical variates we "
 	"get the following table:")
-CODE (L"       u1     u2     u3     v1     v2     v3")
-CODE (L"u1     1      .      .     0.860   .      .")
-CODE (L"u2     .      1      .      .     0.531   .")
-CODE (L"u3     .      .      1      .      .     0.070")
-CODE (L"v1    0.860   .      .      1      .      .")
-CODE (L"v2     .     0.1     .      .      1      .")
-CODE (L"v3     .      .     0.070   .      .      1")
-NORMAL (L"The scores with a dot are zero to numerical precision. In this table the "
+CODE (U"       u1     u2     u3     v1     v2     v3")
+CODE (U"u1     1      .      .     0.860   .      .")
+CODE (U"u2     .      1      .      .     0.531   .")
+CODE (U"u3     .      .      1      .      .     0.070")
+CODE (U"v1    0.860   .      .      1      .      .")
+CODE (U"v2     .     0.1     .      .      1      .")
+CODE (U"v3     .      .     0.070   .      .      1")
+NORMAL (U"The scores with a dot are zero to numerical precision. In this table the "
 	"only correlations that differ from zero are the canonical correlations. "
 	"The following script summarizes:")
-CODE (L"selectObject: cca, pols50m")
-CODE (L"To TableOfReal (scores): 3)")
-CODE (L"To Correlation")
-CODE (L"Draw as numbers if: 1, 0, \"decimal\", 2, \"abs(self) > 1e-14")
-ENTRY (L"5. How to predict one dataset from the other")
-NORMAL (L"@@CCA & TableOfReal: Predict...@")
-NORMAL (L"Additional information can be found in @@Weenink (2003)@.")
+CODE (U"selectObject: cca, pols50m")
+CODE (U"To TableOfReal (scores): 3)")
+CODE (U"To Correlation")
+CODE (U"Draw as numbers if: 1, 0, \"decimal\", 2, \"abs(self) > 1e-14")
+ENTRY (U"5. How to predict one dataset from the other")
+NORMAL (U"@@CCA & TableOfReal: Predict...@")
+NORMAL (U"Additional information can be found in @@Weenink (2003)@.")
 MAN_END
 
-MAN_BEGIN (L"CCA & TableOfReal: Predict...", L"djmw", 20020503)
-INTRO (L"")
+MAN_BEGIN (U"CCA & TableOfReal: Predict...", U"djmw", 20020503)
+INTRO (U"")
 MAN_END
 
-MAN_BEGIN (L"Chebyshev polynomials", L"djmw", 19990620)
-INTRO (L"The Chebyshev polynomials %T__%n_(%x) of degree %n are special orthogonal polynomial functions "
+MAN_BEGIN (U"Chebyshev polynomials", U"djmw", 19990620)
+INTRO (U"The Chebyshev polynomials %T__%n_(%x) of degree %n are special orthogonal polynomial functions "
 	"defined on the domain [-1, 1].")
-NORMAL (L"Orthogonality:")
-FORMULA (L"__-1_\\in^^1^ %W(%x) %T__%i_(%x) %T__%j_(%x) %dx = \\de__%ij_")
-FORMULA (L"%W(%x) = (1 \\-- %x^^2^)^^\\--1/2^   (-1 < x < 1)")
-NORMAL (L"They obey certain recurrence relations:")
-FORMULA (L"%T__%n_(%x) = 2 %x %T__%n-1_(%x) \\-- %T__%n-2_(%x)")
-FORMULA (L"%T__0_(%x) = 1")
-FORMULA (L"%T__1_(%x) = %x")
-MAN_END
-
-MAN_BEGIN (L"ChebyshevSeries", L"djmw", 19990620)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type ChebyshevSeries represents a linear combination of @@Chebyshev polynomials@ "
+NORMAL (U"Orthogonality:")
+FORMULA (U"__-1_\\in^^1^ %W(%x) %T__%i_(%x) %T__%j_(%x) %dx = \\de__%ij_")
+FORMULA (U"%W(%x) = (1 \\-- %x^^2^)^^\\--1/2^   (-1 < x < 1)")
+NORMAL (U"They obey certain recurrence relations:")
+FORMULA (U"%T__%n_(%x) = 2 %x %T__%n-1_(%x) \\-- %T__%n-2_(%x)")
+FORMULA (U"%T__0_(%x) = 1")
+FORMULA (U"%T__1_(%x) = %x")
+MAN_END
+
+MAN_BEGIN (U"ChebyshevSeries", U"djmw", 19990620)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type ChebyshevSeries represents a linear combination of @@Chebyshev polynomials@ "
 	"%T__%k_(%x).")
-FORMULA (L"ChebyshevSeries (%x) = \\Si__%k=1..%numberOfCoefficients_ %c__%k_ %T__%k_(%x)")
+FORMULA (U"ChebyshevSeries (%x) = \\Si__%k=1..%numberOfCoefficients_ %c__%k_ %T__%k_(%x)")
 MAN_END
 
-MAN_BEGIN (L"ChebyshevSeries: To Polynomial", L"djmw", 19990620)
-INTRO (L"A command to transform the selected @ChebyshevSeries object into a @@Polynomial@ object.")
-NORMAL (L"We find polynomial coefficients %c__%k_ such that")
-FORMULA (L"\\Si__%k=1..%numberOfCoefficients_ %c__%k_ %x^^%k^ = \\Si__%k=1.."
+MAN_BEGIN (U"ChebyshevSeries: To Polynomial", U"djmw", 19990620)
+INTRO (U"A command to transform the selected @ChebyshevSeries object into a @@Polynomial@ object.")
+NORMAL (U"We find polynomial coefficients %c__%k_ such that")
+FORMULA (U"\\Si__%k=1..%numberOfCoefficients_ %c__%k_ %x^^%k^ = \\Si__%k=1.."
 	"%numberOfCoefficients_ %l__%k_ %T__%k_(%x)")
-NORMAL (L"We use the recurrence relation for @@Chebyshev polynomials@ to calculate these coefficients.")
+NORMAL (U"We use the recurrence relation for @@Chebyshev polynomials@ to calculate these coefficients.")
 MAN_END
 
-MAN_BEGIN (L"ClassificationTable: To Confusion...", L"djmw", 20141030)
-INTRO (L"A command to create a @Confusion object from the selected @ClassificationTable object.")
-ENTRY (L"Settings")
-TAG (L"##Only class labels#")
-DEFINITION (L"defines whether the class labels from the ClassificationTable object will be used not only as response labels but also as stimulus labels. If checked the resulting Confusion will always have equal stimulus and response labels. If not checked the stimulus labels will be determined from the row labels of the ClassificationTable object. ")
-ENTRY (L"Behaviour")
-NORMAL (L"In obtaining a Confusion object from a ClassificationTable we explicitly use its row labels as stimulus labels.")
+MAN_BEGIN (U"ClassificationTable: To Confusion...", U"djmw", 20141030)
+INTRO (U"A command to create a @Confusion object from the selected @ClassificationTable object.")
+ENTRY (U"Settings")
+TAG (U"##Only class labels#")
+DEFINITION (U"defines whether the class labels from the ClassificationTable object will be used not only as response labels but also as stimulus labels. If checked the resulting Confusion will always have equal stimulus and response labels. If not checked the stimulus labels will be determined from the row labels of the ClassificationTable object. ")
+ENTRY (U"Behaviour")
+NORMAL (U"In obtaining a Confusion object from a ClassificationTable we explicitly use its row labels as stimulus labels.")
 MAN_END
 
-MAN_BEGIN (L"ClassificationTable", L"djmw", 19990525)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"An object of type ClassificationTable represents the result of a classification experiment. "
+MAN_BEGIN (U"ClassificationTable", U"djmw", 19990525)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"An object of type ClassificationTable represents the result of a classification experiment. "
 	"The numbers in a row show how well a particular input matches the classes represented by the "
 	"column labels. The higher the number the better the match.")
 MAN_END
 
-MAN_BEGIN (L"concentration ellipse", L"djmw", 20071113)
-INTRO (L"The percentage of bivariate normally distributed data covered by an ellipse "
+MAN_BEGIN (U"concentration ellipse", U"djmw", 20071113)
+INTRO (U"The percentage of bivariate normally distributed data covered by an ellipse "
 	"whose axes have a length of %numberOfSigmas\\.c\\si can be obtained by integration of the p.d.f. "
 	"over an elliptical area. This results in the following equation as can be "
 	"verified from equation 26.3.21 in @@Abramowitz & Stegun (1970)@:")
-FORMULA (L"%percentage = (1 - exp (-%numberOfSigmas^^2^/2))\\.c 100\\% ,")
-NORMAL (L"where the %numberOfSigmas is the radius of the \"ellipse\":")
-FORMULA (L"(%x/%\\si__x_)^2 + (%y/%\\si__y_)^2 = %numberOfSigmas^2.")
-NORMAL (L"The %numberOfSigmas = 1 ellipse covers 39.3\\% , "
+FORMULA (U"%percentage = (1 - exp (-%numberOfSigmas^^2^/2))\\.c 100\\% ,")
+NORMAL (U"where the %numberOfSigmas is the radius of the \"ellipse\":")
+FORMULA (U"(%x/%\\si__x_)^2 + (%y/%\\si__y_)^2 = %numberOfSigmas^2.")
+NORMAL (U"The %numberOfSigmas = 1 ellipse covers 39.3\\% , "
 	"the %numberOfSigmas = 2 ellipse covers 86.5\\%  and "
 	"the %numberOfSigmas = 3 ellipse covers 98.9\\%  of the data.")
-NORMAL (L"From the formula above we can show that if we want to cover %p percent of the data, we have to "		"chose %numberOfSigmas as:")
-FORMULA (L"%numberOfSigmas = \\Vr(-2 ln(1-%p/100)).")
-NORMAL (L"For covering 95\\% of the data we calculate %numberOfSigmas = 2.45.")
+NORMAL (U"From the formula above we can show that if we want to cover %p percent of the data, we have to "		"chose %numberOfSigmas as:")
+FORMULA (U"%numberOfSigmas = \\Vr(-2 ln(1-%p/100)).")
+NORMAL (U"For covering 95\\% of the data we calculate %numberOfSigmas = 2.45.")
 MAN_END
 
-MAN_BEGIN (L"confidence interval", L"djmw", 20011105)
-INTRO (L"The confidence interval gives an estimated range of values which "
+MAN_BEGIN (U"confidence interval", U"djmw", 20011105)
+INTRO (U"The confidence interval gives an estimated range of values which "
 	"is likely to include an unknown population parameter. "
 	"The estimated range is calculated from a given set of observations.")
-ENTRY (L"Examples")
-NORMAL (L"At the \\al level of significance a two sided confidence interval "
+ENTRY (U"Examples")
+NORMAL (U"At the \\al level of significance a two sided confidence interval "
 	"for the true mean \\mu for normally distributed data with mean %%mean% and "
 	"known standard deviation %\\si can be constructed as:")
-FORMULA (L"%%mean% - %z__\\al/2_ \\si / \\Vr%N \\<_ \\mu \\<_ "
+FORMULA (U"%%mean% - %z__\\al/2_ \\si / \\Vr%N \\<_ \\mu \\<_ "
 	"%%mean% + %z__\\al/2_ \\si / \\Vr%N,")
-NORMAL (L"where %z__\\al/2_ = invGaussQ (\\al/2) and %N is the number of observations.")
-NORMAL (L"If the standard deviation is %not known, we have to estimate its value (%s) "
+NORMAL (U"where %z__\\al/2_ = invGaussQ (\\al/2) and %N is the number of observations.")
+NORMAL (U"If the standard deviation is %not known, we have to estimate its value (%s) "
 	"from the data and the formula above becomes:")
-FORMULA (L"%%mean% - %t__%%\\al/2;N%_ %s / \\Vr%N \\<_ \\mu \\<_ "
+FORMULA (U"%%mean% - %t__%%\\al/2;N%_ %s / \\Vr%N \\<_ \\mu \\<_ "
 	"%%mean% + %t__%%\\al/2;N%_ %s / \\Vr%N,")
-NORMAL (L"where %t__%%\\al/2;N%_ = invStudentQ (%\\al/2, %N-1).")
-NORMAL (L"For %\\al=0.05 and %N=20 we get %z__0.025_=1.96 and %t__0.025;20_=2.039. "
+NORMAL (U"where %t__%%\\al/2;N%_ = invStudentQ (%\\al/2, %N-1).")
+NORMAL (U"For %\\al=0.05 and %N=20 we get %z__0.025_=1.96 and %t__0.025;20_=2.039. "
 	"This shows that when we have to estimate the standard deviation from the data, "
 	"the confidence interval is wider than when the standard deviation is known "
 	"beforehand.")
 MAN_END
 
-MAN_BEGIN (L"confidence level", L"djmw", 20011105)
-NORMAL (L"The confidence level is the probability value 1-\\al associated "
+MAN_BEGIN (U"confidence level", U"djmw", 20011105)
+NORMAL (U"The confidence level is the probability value 1-\\al associated "
 	"with a @@confidence interval@, where \\al is the level of significance. "
 	"It can also be expressed as a percentage 100(1-\\al)\\%  and is than "
 	"sometimes called the %%confidence coefficient%.")
 MAN_END
 
-MAN_BEGIN (L"Confusion", L"djmw", 20110517)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"An object of type Confusions represents a confusion matrix, with "
+MAN_BEGIN (U"Confusion", U"djmw", 20110517)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"An object of type Confusions represents a confusion matrix, with "
 	"stimuli as row labels and responses as column labels. The entry at "
 	"position [%i][%j] represents the number of times response %j "
 	"was given to the stimulus %i.")
-ENTRY (L"Creating a Confusion from data in a text file")
-NORMAL (L"Suppose you have two objects A and B. "
+ENTRY (U"Creating a Confusion from data in a text file")
+NORMAL (U"Suppose you have two objects A and B. "
 	"In one way or another, you have acquired the following  "
 	"confusions: %\\de__%AA_ = 6, %\\de__%AB_ = 2 , %\\de__%BA_ = 1, "
 	"and %\\de__%BB_ = 7.")
-NORMAL (L"You can create a simple text file like the following:")
-CODE (L"\"ooTextFile\"  ! to make Praat recognize your file")
-CODE (L"\"Confusion\" ! The line that tells Praat about the contents")
-CODE (L"2     \"A\"  \"B\"  ! Number of columns, and column labels")
-CODE (L"2                   ! Number of rows")
-CODE (L"\"A\"    6    2     ! Row label A, A-A value, A-B value")
-CODE (L"\"B\"    1    7     ! Row label B, B-A value, B-B value")
-NORMAL (L"This text file can be read with the @@Read from file...@ command. ")
-ENTRY (L"Commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@Categories: To Confusion")
-LIST_ITEM (L"\\bu @@Create simple Confusion...")
-NORMAL (L"Drawing")
-LIST_ITEM (L"\\bu ##Draw as numbers...")
-LIST_ITEM (L"\\bu ##Draw as squares...")
-NORMAL (L"Query")
-LIST_ITEM (L"\\bu @@Confusion: Get fraction correct|Get fraction correct")
-LIST_ITEM (L"\\bu @@Confusion: Get stimulus sum...")
-LIST_ITEM (L"\\bu @@Confusion: Get response sum...")
-LIST_ITEM (L"\\bu ##Get grand sum")
-NORMAL (L"Modification")
-LIST_ITEM (L"\\bu ##Formula...")
-LIST_ITEM (L"\\bu @@Confusion: Increase...")
-NORMAL (L"Grouping")
-LIST_ITEM (L"\\bu @@Confusion: Group stimuli...@")
-LIST_ITEM (L"\\bu @@Confusion: Group responses...@")
-NORMAL (L"Analysis:")
-LIST_ITEM (L"\\bu @@Confusion: To Similarity...@")
-LIST_ITEM (L"\\bu @@Confusion: To Dissimilarity (pdf)...@")
-ENTRY (L"Inside a Confusion")
-NORMAL (L"With @Inspect you will see the following attributes:")
-TAG (L"%numberOfRows")
-DEFINITION (L"the number of stimuli.")
-TAG (L"%numberOfColumns")
-DEFINITION (L"the number of responses.")
-TAG (L"%rowLabels")
-DEFINITION (L"the names of the stimuli.")
-TAG (L"columnLabels")
-DEFINITION (L"the names of the responses.")
-MAN_END
-
-MAN_BEGIN (L"Create simple Confusion...", L"djmw", 20140117)
-INTRO (L"Creates a square @@Confusion|confusion matrix@ with equal stimulus labels and response labels.")
-ENTRY (L"Example")
-NORMAL (L"The command ##Create simple Confusion: \"simple\", \"u i a\"# results in the following Confusion:")
-CODE (L"     u    i    a   ! The response labels")
-CODE (L"u    0    0    0   ! Responses on stimulus  u,")
-CODE (L"i    0    0    0   ! Responses on stimulus  i")
-CODE (L"a    0    0    0   ! Responses on stimulus  a")
-MAN_END
-
-MAN_BEGIN (L"Confusion: Increase...", L"djmw", 20140117)
-INTRO (L"Increases the contents of the corresponding cell in the selected @@Confusion@ by one.")
-ENTRY (L"Settings")
-TAG (L"##Stimulus# and ##Response#")
-DEFINITION (L"define the cell whose value will be increased by one.")
-ENTRY (L"Example")
-NORMAL (L"Given the following Confusion:")
-CODE (L"       u    i    a   ! The response labels")
-CODE (L" u     6    2    1   ! Responses on stimulus  u,")
-CODE (L" i     3    4    2   ! Responses on stimulus  i")
-CODE (L" a     1    4    4   ! Responses on stimulus  a")
-NORMAL (L"The command  ##Increase: \"u\", \"i\"#  results in:")
-CODE (L"       u    i    a   ! The responses")
-CODE (L" u     6    3    1   ! Responses on stimulus  u,")
-CODE (L" i     3    4    2   ! Responses on stimulus  i")
-CODE (L" a     1    4    4   ! Responses on stimulus  a")
-MAN_END
-
-MAN_BEGIN (L"Confusion: Group...", L"djmw", 20140117)
-INTRO (L"Groups a number of stimuli and responses into one new category.")
-ENTRY (L"Settings")
-TAG (L"##Stimuli & Responses")
-DEFINITION (L"defines the labels that will be grouped.")
-TAG (L"##New label")
-DEFINITION (L"defines the new label for the grouped labels.")
-TAG (L"##New label position")
-DEFINITION (L"the row/column number for the new group label.")
-ENTRY (L"Example")
-NORMAL (L"Given the following selected Confusion:")
-CODE (L"       u    i    a   ! The response labels")
-CODE (L" u     6    2    1   ! Responses on stimulus  u,")
-CODE (L" i     3    4    2   ! Responses on stimulus  i")
-CODE (L" a     1    4    4   ! Responses on stimulus  a")
-NORMAL (L"After the command ##Group stimuli: \"u i\", \"high\", 0#, the new Confusion will be:")
-CODE (L"         high   a   ! The new response labels")
-CODE (L" high     15    3   ! Responses on group %%high%")
-CODE (L" a         5    4   ! Responses on stimulus  a")
-NORMAL (L"Instead after the command ##Group stimuli: \"u i\", \"high\", 2#, the new Confusion will be:")
-CODE (L"        a   high  ! The new response labels")
-CODE (L" a      4     5   ! Responses on stimulus  a")
-CODE (L" high   3    15   ! Responses on group %%high%")
-MAN_END
-
-MAN_BEGIN (L"Confusion: Group stimuli...", L"djmw", 20140117)
-INTRO (L"Groups a number of stimuli into one new category.")
-ENTRY (L"Settings")
-TAG (L"##Stimuli")
-DEFINITION (L"defines the stimuli that will be grouped.")
-TAG (L"##New label")
-DEFINITION (L"defines the new label for the grouped stimuli.")
-TAG (L"##New label position")
-DEFINITION (L"the row number for the new group label.")
-ENTRY (L"Example")
-NORMAL (L"Given the following selected Confusion:")
-CODE (L"       u    i    a   ! The response labels")
-CODE (L" u     6    2    1   ! Responses on stimulus  u,")
-CODE (L" i     3    4    2   ! Responses on stimulus  i")
-CODE (L" a     1    4    4   ! Responses on stimulus  a")
-NORMAL (L"After the command ##Group stimuli: \"u i\", \"high\", 1#, the new Confusion will be:")
-CODE (L"          u    i    a   ! The response labels")
-CODE (L" high     9    6    3   ! Responses on stimulus group %%high%,")
-CODE (L" a        1    4    4   ! Responses on stimulus  a")
-MAN_END
-
-MAN_BEGIN (L"Confusion: Group responses...", L"djmw", 20140117)
-INTRO (L"Groups a number of responses into one new category.")
-ENTRY (L"Settings")
-TAG (L"##Responses")
-DEFINITION (L"defines the responses that will be grouped.")
-TAG (L"##New label")
-DEFINITION (L"defines the new label for the grouped responses.")
-TAG (L"##New label position")
-DEFINITION (L"the column number for the new group label.")
-ENTRY (L"Example")
-NORMAL (L"Given the following selected Confusion:")
-CODE (L"       u    i    a   ! The response labels")
-CODE (L" u     6    2    1   ! Responses on stimulus  u,")
-CODE (L" i     3    4    2   ! Responses on stimulus  i")
-CODE (L" a     1    4    4   ! Responses on stimulus  a")
-NORMAL (L"After the command ##Group responses: \"a i\", \"front\", 1#, the new Confusion will be:")
-CODE (L"   front    i    ! The new response labels")
-CODE (L" u     7    2    ! Responses on stimulus  u,")
-CODE (L" i     5    4    ! Responses on stimulus  i")
-CODE (L" a     5    4    ! Responses on stimulus  a")
-MAN_END
-
-MAN_BEGIN (L"Confusion: Get stimulus sum...", L"djmw", 20140117)
-INTRO (L"Returns the number of responses for the chosen stimulus (the sum of all the numbers in the row with this stimulus label). ")
-ENTRY (L"Example")
-NORMAL (L"Given the following selected Confusion:")
-CODE (L"       u    i    a   ! The response labels")
-CODE (L" u     6    2    1   ! Responses on stimulus  u,")
-CODE (L" i     3    4    2   ! Responses on stimulus  i")
-CODE (L" a     1    4    4   ! Responses on stimulus  a")
-NORMAL (L"The command ##Get stimulus sum: \"a\"# will return the number 9.")
-MAN_END
-
-MAN_BEGIN (L"Confusion: Get response sum...", L"djmw", 20140117)
-INTRO (L"Returns the number of times the chosen response was given (the sum of all the numbers in the column with this response label).")
-ENTRY (L"Example")
-NORMAL (L"Given the following selected Confusion:")
-CODE (L"       u    i    a   ! The response labelss")
-CODE (L" u     6    2    1   ! Responses on stimulus  u,")
-CODE (L" i     3    4    2   ! Responses on stimulus  i")
-CODE (L" a     1    4    4   ! Responses on stimulus  a")
-NORMAL (L"The command ##Get response sum: \"a\"# will return the number 7.")
-MAN_END
-
-MAN_BEGIN (L"Confusion: Condense...", L"djmw", 20130410)
-INTRO (L"Groups row and column labels of the selected @Confusion object in "
+NORMAL (U"You can create a simple text file like the following:")
+CODE (U"\"ooTextFile\"  ! to make Praat recognize your file")
+CODE (U"\"Confusion\" ! The line that tells Praat about the contents")
+CODE (U"2     \"A\"  \"B\"  ! Number of columns, and column labels")
+CODE (U"2                   ! Number of rows")
+CODE (U"\"A\"    6    2     ! Row label A, A-A value, A-B value")
+CODE (U"\"B\"    1    7     ! Row label B, B-A value, B-B value")
+NORMAL (U"This text file can be read with the @@Read from file...@ command. ")
+ENTRY (U"Commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@Categories: To Confusion")
+LIST_ITEM (U"\\bu @@Create simple Confusion...")
+NORMAL (U"Drawing")
+LIST_ITEM (U"\\bu ##Draw as numbers...")
+LIST_ITEM (U"\\bu ##Draw as squares...")
+NORMAL (U"Query")
+LIST_ITEM (U"\\bu @@Confusion: Get fraction correct|Get fraction correct")
+LIST_ITEM (U"\\bu @@Confusion: Get stimulus sum...")
+LIST_ITEM (U"\\bu @@Confusion: Get response sum...")
+LIST_ITEM (U"\\bu ##Get grand sum")
+NORMAL (U"Modification")
+LIST_ITEM (U"\\bu ##Formula...")
+LIST_ITEM (U"\\bu @@Confusion: Increase...")
+NORMAL (U"Grouping")
+LIST_ITEM (U"\\bu @@Confusion: Group stimuli...@")
+LIST_ITEM (U"\\bu @@Confusion: Group responses...@")
+NORMAL (U"Analysis:")
+LIST_ITEM (U"\\bu @@Confusion: To Similarity...@")
+LIST_ITEM (U"\\bu @@Confusion: To Dissimilarity (pdf)...@")
+ENTRY (U"Inside a Confusion")
+NORMAL (U"With @Inspect you will see the following attributes:")
+TAG (U"%numberOfRows")
+DEFINITION (U"the number of stimuli.")
+TAG (U"%numberOfColumns")
+DEFINITION (U"the number of responses.")
+TAG (U"%rowLabels")
+DEFINITION (U"the names of the stimuli.")
+TAG (U"columnLabels")
+DEFINITION (U"the names of the responses.")
+MAN_END
+
+MAN_BEGIN (U"Create simple Confusion...", U"djmw", 20140117)
+INTRO (U"Creates a square @@Confusion|confusion matrix@ with equal stimulus labels and response labels.")
+ENTRY (U"Example")
+NORMAL (U"The command ##Create simple Confusion: \"simple\", \"u i a\"# results in the following Confusion:")
+CODE (U"     u    i    a   ! The response labels")
+CODE (U"u    0    0    0   ! Responses on stimulus  u,")
+CODE (U"i    0    0    0   ! Responses on stimulus  i")
+CODE (U"a    0    0    0   ! Responses on stimulus  a")
+MAN_END
+
+MAN_BEGIN (U"Confusion: Increase...", U"djmw", 20140117)
+INTRO (U"Increases the contents of the corresponding cell in the selected @@Confusion@ by one.")
+ENTRY (U"Settings")
+TAG (U"##Stimulus# and ##Response#")
+DEFINITION (U"define the cell whose value will be increased by one.")
+ENTRY (U"Example")
+NORMAL (U"Given the following Confusion:")
+CODE (U"       u    i    a   ! The response labels")
+CODE (U" u     6    2    1   ! Responses on stimulus  u,")
+CODE (U" i     3    4    2   ! Responses on stimulus  i")
+CODE (U" a     1    4    4   ! Responses on stimulus  a")
+NORMAL (U"The command  ##Increase: \"u\", \"i\"#  results in:")
+CODE (U"       u    i    a   ! The responses")
+CODE (U" u     6    3    1   ! Responses on stimulus  u,")
+CODE (U" i     3    4    2   ! Responses on stimulus  i")
+CODE (U" a     1    4    4   ! Responses on stimulus  a")
+MAN_END
+
+MAN_BEGIN (U"Confusion: Group...", U"djmw", 20140117)
+INTRO (U"Groups a number of stimuli and responses into one new category.")
+ENTRY (U"Settings")
+TAG (U"##Stimuli & Responses")
+DEFINITION (U"defines the labels that will be grouped.")
+TAG (U"##New label")
+DEFINITION (U"defines the new label for the grouped labels.")
+TAG (U"##New label position")
+DEFINITION (U"the row/column number for the new group label.")
+ENTRY (U"Example")
+NORMAL (U"Given the following selected Confusion:")
+CODE (U"       u    i    a   ! The response labels")
+CODE (U" u     6    2    1   ! Responses on stimulus  u,")
+CODE (U" i     3    4    2   ! Responses on stimulus  i")
+CODE (U" a     1    4    4   ! Responses on stimulus  a")
+NORMAL (U"After the command ##Group stimuli: \"u i\", \"high\", 0#, the new Confusion will be:")
+CODE (U"         high   a   ! The new response labels")
+CODE (U" high     15    3   ! Responses on group %%high%")
+CODE (U" a         5    4   ! Responses on stimulus  a")
+NORMAL (U"Instead after the command ##Group stimuli: \"u i\", \"high\", 2#, the new Confusion will be:")
+CODE (U"        a   high  ! The new response labels")
+CODE (U" a      4     5   ! Responses on stimulus  a")
+CODE (U" high   3    15   ! Responses on group %%high%")
+MAN_END
+
+MAN_BEGIN (U"Confusion: Group stimuli...", U"djmw", 20140117)
+INTRO (U"Groups a number of stimuli into one new category.")
+ENTRY (U"Settings")
+TAG (U"##Stimuli")
+DEFINITION (U"defines the stimuli that will be grouped.")
+TAG (U"##New label")
+DEFINITION (U"defines the new label for the grouped stimuli.")
+TAG (U"##New label position")
+DEFINITION (U"the row number for the new group label.")
+ENTRY (U"Example")
+NORMAL (U"Given the following selected Confusion:")
+CODE (U"       u    i    a   ! The response labels")
+CODE (U" u     6    2    1   ! Responses on stimulus  u,")
+CODE (U" i     3    4    2   ! Responses on stimulus  i")
+CODE (U" a     1    4    4   ! Responses on stimulus  a")
+NORMAL (U"After the command ##Group stimuli: \"u i\", \"high\", 1#, the new Confusion will be:")
+CODE (U"          u    i    a   ! The response labels")
+CODE (U" high     9    6    3   ! Responses on stimulus group %%high%,")
+CODE (U" a        1    4    4   ! Responses on stimulus  a")
+MAN_END
+
+MAN_BEGIN (U"Confusion: Group responses...", U"djmw", 20140117)
+INTRO (U"Groups a number of responses into one new category.")
+ENTRY (U"Settings")
+TAG (U"##Responses")
+DEFINITION (U"defines the responses that will be grouped.")
+TAG (U"##New label")
+DEFINITION (U"defines the new label for the grouped responses.")
+TAG (U"##New label position")
+DEFINITION (U"the column number for the new group label.")
+ENTRY (U"Example")
+NORMAL (U"Given the following selected Confusion:")
+CODE (U"       u    i    a   ! The response labels")
+CODE (U" u     6    2    1   ! Responses on stimulus  u,")
+CODE (U" i     3    4    2   ! Responses on stimulus  i")
+CODE (U" a     1    4    4   ! Responses on stimulus  a")
+NORMAL (U"After the command ##Group responses: \"a i\", \"front\", 1#, the new Confusion will be:")
+CODE (U"   front    i    ! The new response labels")
+CODE (U" u     7    2    ! Responses on stimulus  u,")
+CODE (U" i     5    4    ! Responses on stimulus  i")
+CODE (U" a     5    4    ! Responses on stimulus  a")
+MAN_END
+
+MAN_BEGIN (U"Confusion: Get stimulus sum...", U"djmw", 20140117)
+INTRO (U"Returns the number of responses for the chosen stimulus (the sum of all the numbers in the row with this stimulus label). ")
+ENTRY (U"Example")
+NORMAL (U"Given the following selected Confusion:")
+CODE (U"       u    i    a   ! The response labels")
+CODE (U" u     6    2    1   ! Responses on stimulus  u,")
+CODE (U" i     3    4    2   ! Responses on stimulus  i")
+CODE (U" a     1    4    4   ! Responses on stimulus  a")
+NORMAL (U"The command ##Get stimulus sum: \"a\"# will return the number 9.")
+MAN_END
+
+MAN_BEGIN (U"Confusion: Get response sum...", U"djmw", 20140117)
+INTRO (U"Returns the number of times the chosen response was given (the sum of all the numbers in the column with this response label).")
+ENTRY (U"Example")
+NORMAL (U"Given the following selected Confusion:")
+CODE (U"       u    i    a   ! The response labelss")
+CODE (U" u     6    2    1   ! Responses on stimulus  u,")
+CODE (U" i     3    4    2   ! Responses on stimulus  i")
+CODE (U" a     1    4    4   ! Responses on stimulus  a")
+NORMAL (U"The command ##Get response sum: \"a\"# will return the number 7.")
+MAN_END
+
+MAN_BEGIN (U"Confusion: Condense...", U"djmw", 20130410)
+INTRO (U"Groups row and column labels of the selected @Confusion object in "
 	"order to reduce its dimension. ")
-ENTRY (L"Settings")
-TAG (L"##Search")
-DEFINITION (L"the pattern to match.")
-TAG (L"##Replace")
-DEFINITION (L"the pattern that replaces the match(es).")
-TAG (L"##Replace limit")
-DEFINITION (L"limits the maximum number of times that a match/replace cycle "
+ENTRY (U"Settings")
+TAG (U"##Search")
+DEFINITION (U"the pattern to match.")
+TAG (U"##Replace")
+DEFINITION (U"the pattern that replaces the match(es).")
+TAG (U"##Replace limit")
+DEFINITION (U"limits the maximum number of times that a match/replace cycle "
 	"may occur within each label.")
-TAG (L"##Search and replace are")
-DEFINITION (L"defines whether the search and replace strings are taken "
+TAG (U"##Search and replace are")
+DEFINITION (U"defines whether the search and replace strings are taken "
 	"literally or as a @@Regular expressions|regular expression at .")
-ENTRY (L"Behaviour")
-NORMAL (L"First all row and column labels are changed according to the search "
+ENTRY (U"Behaviour")
+NORMAL (U"First all row and column labels are changed according to the search "
 	"and replace specification. Next all rows or columns that have the same "
 	"labels are summed. ")
 MAN_END
 
-MAN_BEGIN (L"Confusion: Get fraction correct", L"djmw", 20000225)
-INTRO (L"A @@query@ to ask the selected @Confusion matrix for the fraction of "
+MAN_BEGIN (U"Confusion: Get fraction correct", U"djmw", 20000225)
+INTRO (U"A @@query@ to ask the selected @Confusion matrix for the fraction of "
 	"correct classifications.")
-NORMAL (L"The \"fraction correct\" is defined as the quotient of the number "
+NORMAL (U"The \"fraction correct\" is defined as the quotient of the number "
 	"of correct classifications and the sum of the entries in the matrix.")
-NORMAL (L"Correct classifications have identical row and column labels.")
+NORMAL (U"Correct classifications have identical row and column labels.")
 MAN_END
 
-MAN_BEGIN (L"Confusion & ClassificationTable: Increase confusion count", L"djmw", 201411101)
-INTRO (L"Increases the contents of cell(s) in the selected @@Confusion at . The cells to increase are determined by the selected "
+MAN_BEGIN (U"Confusion & ClassificationTable: Increase confusion count", U"djmw", 201411101)
+INTRO (U"Increases the contents of cell(s) in the selected @@Confusion at . The cells to increase are determined by the selected "
 	"@ClassificationTable.")
-ENTRY (L"Behaviour")
-NORMAL (L"For each row in the ClassificationTable object the contents of one cell in the Confusion we be increased by one. "
+ENTRY (U"Behaviour")
+NORMAL (U"For each row in the ClassificationTable object the contents of one cell in the Confusion we be increased by one. "
 	"This cell is determined as follows: we start by finding the label of the column wich the largest number in it. "
 	"This label is defined as the ##response label#. We use the corresponding row label as the ##stimulus label#. The content "
 	"of the cell in the Confusion object whose row and column are labeled with ##stimulus label# and ##response label#, "
 	"respectively, is increased by one.")
 MAN_END
 
-MAN_BEGIN (L"Confusion: To TableOfReal (marginals)", L"djmw", 20011031)
-INTRO (L"A new @TableOfReal object is created from the selected @Confusion "
+MAN_BEGIN (U"Confusion: To TableOfReal (marginals)", U"djmw", 20011031)
+INTRO (U"A new @TableOfReal object is created from the selected @Confusion "
 	"object with one extra row and column. ")
-NORMAL (L"The first element of the extra row will contain the sum of the "
+NORMAL (U"The first element of the extra row will contain the sum of the "
 	"confusions in the the first %column, the first element of the extra "
 	"column will contain the sum of the confusions in the the first %row, "
 	"etc... The bottom-right element will contain the sum of all confusions.")
 MAN_END
 
-MAN_BEGIN (L"Correlation", L"djmw", 19990105)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type Correlation represents the correlation coefficients "
+MAN_BEGIN (U"Correlation", U"djmw", 19990105)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type Correlation represents the correlation coefficients "
 	"of a multivariate data set.")
 MAN_END
 
-MAN_BEGIN (L"Correlation: Confidence intervals...", L"djmw", 20040407)
-INTRO (L"Calculates @@confidence interval at s for the correlation coefficients "
+MAN_BEGIN (U"Correlation: Confidence intervals...", U"djmw", 20040407)
+INTRO (U"Calculates @@confidence interval at s for the correlation coefficients "
 	"from the selected @Correlation object(s) and saves these intervals in a "
 	"new @TableOfReal object.")
-ENTRY (L"Settings")
-TAG (L"##Confidence level")
-DEFINITION (L"the @@confidence level@ you want for the confidence intervals.")
-TAG (L"##Number of tests")
-DEFINITION (L"determines the @@Bonferroni correction@ for the significance "
+ENTRY (U"Settings")
+TAG (U"##Confidence level")
+DEFINITION (U"the @@confidence level@ you want for the confidence intervals.")
+TAG (U"##Number of tests")
+DEFINITION (U"determines the @@Bonferroni correction@ for the significance "
 	"level. If the default value (zero) is chosen, it will be set equal "
 	"to the number of correlations involved (a matrix of dimension %n "
 	"has %n\\.c(%n-1)/2 correlations).")
-TAG (L"##Approximation")
-DEFINITION (L"defines the approximation that will be used to calculate the "
+TAG (U"##Approximation")
+DEFINITION (U"defines the approximation that will be used to calculate the "
 	"confidence intervals. It is either Fisher's z transformation or Ruben's "
 	"transformation. According to @@Boomsma (1977)@, Ruben's approximation is "
 	"more accurate than Fisher's.")
-ENTRY (L"Algorithm")
-NORMAL (L"We obtain intervals by the large-sample conservative multiple tests "
+ENTRY (U"Algorithm")
+NORMAL (U"We obtain intervals by the large-sample conservative multiple tests "
 	"with Bonferroni inequality and the Fisher or Ruben transformation. "
 	"We put the upper values of the confidence intervals in the upper "
 	"triangular part of the matrix and the lower values of the confidence "
 	"intervals in lower triangular part of the resulting TableOfReal object.")
-NORMAL (L"In %%Fisher's approximation%, for each element %r__%ij_ of the "
+NORMAL (U"In %%Fisher's approximation%, for each element %r__%ij_ of the "
 	"correlation matrix the confidence interval is:")
-FORMULA (L"#[ tanh (%z__%ij_ - %z__%\\al\\'p_ / \\Vr(%N - 3)) , "
+FORMULA (U"#[ tanh (%z__%ij_ - %z__%\\al\\'p_ / \\Vr(%N - 3)) , "
 	"tanh (%z__%ij_ + %z__%\\al\\'p_ / \\Vr(%N - 3)) #],")
-NORMAL (L"where %z__%ij_ is the Fisher z-transform of the correlation %r__%ij_:")
-FORMULA (L"%z__%ij_ = 1/2 ln ((1 + %r__%ij_) / (1 - %r__%ij_)), ")
-NORMAL (L"%z__%\\al\\'p_ the Bonferroni corrected %z-value "
+NORMAL (U"where %z__%ij_ is the Fisher z-transform of the correlation %r__%ij_:")
+FORMULA (U"%z__%ij_ = 1/2 ln ((1 + %r__%ij_) / (1 - %r__%ij_)), ")
+NORMAL (U"%z__%\\al\\'p_ the Bonferroni corrected %z-value "
 	"%z__%\\al/(2\\.c%numberOfTests)_, ")
-FORMULA (L"%\\al = 1 - %confidenceLevel,")
-NORMAL (L"and %N the number of observations that the correlation matrix is "
+FORMULA (U"%\\al = 1 - %confidenceLevel,")
+NORMAL (U"and %N the number of observations that the correlation matrix is "
 	"based on.")
-NORMAL (L"In %%Ruben's approximation% the confidence interval for element %r__%ij_ "
+NORMAL (U"In %%Ruben's approximation% the confidence interval for element %r__%ij_ "
 	"is:")
-FORMULA (L"#[ %x__1_ / \\Vr(1 - %x__1_^2), %x__2_ / \\Vr(1 - %x__2_^2) #]")
-NORMAL (L"in which %x__1_ and %x__2_ are the smallest and the largest root from")
-FORMULA (L"%a %x^^2^ + %b %x + %c = 0, with")
-FORMULA (L"%a = 2%N - 3 - %z__%\\al\\'p_^^2^")
-FORMULA (L"%b = - 2 %r\\'p \\Vr((2%N - 3)(2%N - 5))")
-FORMULA (L"%c = (2%N - 5 - %z__%\\al\\'p_^^2^) %r\\'p^^2^ - 2%z__%\\al\\'p_^^2^, and")
-FORMULA (L"%r\\'p = %r__%ij_ / \\Vr(1 - %r__%ij_^2),")
-MAN_END
-
-MAN_BEGIN (L"Covariance", L"djmw", 19990105)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type Covariance represents the sums of squares and cross "
+FORMULA (U"#[ %x__1_ / \\Vr(1 - %x__1_^2), %x__2_ / \\Vr(1 - %x__2_^2) #]")
+NORMAL (U"in which %x__1_ and %x__2_ are the smallest and the largest root from")
+FORMULA (U"%a %x^^2^ + %b %x + %c = 0, with")
+FORMULA (U"%a = 2%N - 3 - %z__%\\al\\'p_^^2^")
+FORMULA (U"%b = - 2 %r\\'p \\Vr((2%N - 3)(2%N - 5))")
+FORMULA (U"%c = (2%N - 5 - %z__%\\al\\'p_^^2^) %r\\'p^^2^ - 2%z__%\\al\\'p_^^2^, and")
+FORMULA (U"%r\\'p = %r__%ij_ / \\Vr(1 - %r__%ij_^2),")
+MAN_END
+
+MAN_BEGIN (U"Covariance", U"djmw", 19990105)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type Covariance represents the sums of squares and cross "
 	"products of a multivariate data set divided by the number of observations.")
-NORMAL (L"An object of type Covariance contains the same attributes as an object of "
+NORMAL (U"An object of type Covariance contains the same attributes as an object of "
 	"type @SSCP.")
-NORMAL (L"Since an object of type Covariance contains the mean values (the "
+NORMAL (U"Since an object of type Covariance contains the mean values (the "
 	"centroids), the covariances as well as the number of observations it has "
 	"all the information necessary to be the subject of all kinds of statistical "
 	"tests on means and variances.")
 MAN_END
 
-MAN_BEGIN (L"Create simple Covariance...", L"djmw", 20101125)
-INTRO (L"Create a @@Covariance@ matrix with its centroid.")
-ENTRY (L"Settings")
-TAG (L"##Covariances")
-DEFINITION (L"define the covariances. Because a covariance matrix is a symmetric matrix, only the upper triangular "
+MAN_BEGIN (U"Create simple Covariance...", U"djmw", 20101125)
+INTRO (U"Create a @@Covariance@ matrix with its centroid.")
+ENTRY (U"Settings")
+TAG (U"##Covariances")
+DEFINITION (U"define the covariances. Because a covariance matrix is a symmetric matrix, only the upper triangular "
 	"part of the matrix has to be input (row-wise). If your covariance matrix is "
 	"of dimension %d, your input needs %d(%d+1)/2 elements. The first %d input elements are the elements of the first "
 	"row of the covariance matrix, the next %d-1 input elements are for the second row, then %d-2 for the third row, etc.")
-TAG (L"##Centroid")
-DEFINITION (L"defines the centroid. ")
-TAG (L"##Number of observations")
-DEFINITION (L"defines the number of observations. ")
+TAG (U"##Centroid")
+DEFINITION (U"defines the centroid. ")
+TAG (U"##Number of observations")
+DEFINITION (U"defines the number of observations. ")
 MAN_END
 
-MAN_BEGIN (L"Covariance: Set value...", L"djmw", 20101124)
-INTRO (L"Input @@Covariance@ matrix cell values.")
-ENTRY (L"Constraints on input values")
-TAG (L"A covariance matrix is a %%symmetric% matrix: values input at cell [%i,%j] will be automatically input at "
+MAN_BEGIN (U"Covariance: Set value...", U"djmw", 20101124)
+INTRO (U"Input @@Covariance@ matrix cell values.")
+ENTRY (U"Constraints on input values")
+TAG (U"A covariance matrix is a %%symmetric% matrix: values input at cell [%i,%j] will be automatically input at "
 	"cell [%j,%i] too.")
-TAG (L"All values on the diagonal must be positive numbers.")
-TAG (L"The absolute value of an off-diagonal element at cell [%i,%j] must be smaller than the corresponding diagonal "
+TAG (U"All values on the diagonal must be positive numbers.")
+TAG (U"The absolute value of an off-diagonal element at cell [%i,%j] must be smaller than the corresponding diagonal "
 	"elements at cells [%i,%i] and [%j,%j].")
 MAN_END
 
-MAN_BEGIN (L"Covariance: Difference", L"djmw", 20090624)
-INTRO (L"You can choose this command after selecting two objects of type @Covariance. ")
-NORMAL (L"We test the hypothesis that the samples that gave rise to the two "
+MAN_BEGIN (U"Covariance: Difference", U"djmw", 20090624)
+INTRO (U"You can choose this command after selecting two objects of type @Covariance. ")
+NORMAL (U"We test the hypothesis that the samples that gave rise to the two "
 	"covariance matrices #%M__1_ and #%M__2_, have equal covariances. "
 	"The test statistic is %L\\'p which is distributed as "
 	"a \\ci^2 variate with %p(%p+1)/2 degrees of freedom.")
-FORMULA (L"%L\\'p = %L \\.c (1 \\-- (2%p + 1 \\-- 2 / (%p + 1)) / (6 \\.c ( %N \\-- 1))),")
-NORMAL (L"where, ")
-FORMULA (L"%L = (%N \\-- 1) \\.c (ln determinant (#%M__1_) \\-- ln determinant "
+FORMULA (U"%L\\'p = %L \\.c (1 \\-- (2%p + 1 \\-- 2 / (%p + 1)) / (6 \\.c ( %N \\-- 1))),")
+NORMAL (U"where, ")
+FORMULA (U"%L = (%N \\-- 1) \\.c (ln determinant (#%M__1_) \\-- ln determinant "
 	"(#%M__2_)) + trace (#%M__2_ \\.c #%M__1_^^\\--1^) \\-- %p), ")
-NORMAL (L"%p is dimension of covariance matrix and "
+NORMAL (U"%p is dimension of covariance matrix and "
 	"%N is the number of observations underlying the covariance matrix. ")
-NORMAL (L"For more details on this test, see e.g. page 292 of @@Morrison (1990)@.")
+NORMAL (U"For more details on this test, see e.g. page 292 of @@Morrison (1990)@.")
 MAN_END
 
-MAN_BEGIN (L"Covariance: Get significance of one mean...", L"djmw", 20040407)
-INTRO (L"Gets the level of significance for one mean from the selected "
+MAN_BEGIN (U"Covariance: Get significance of one mean...", U"djmw", 20040407)
+INTRO (U"Gets the level of significance for one mean from the selected "
 	"@Covariance object being different from a hypothesized mean.")
-ENTRY (L"Settings")
-TAG (L"##Index")
-DEFINITION (L"the position of the element in the means vector (centroid) that "
+ENTRY (U"Settings")
+TAG (U"##Index")
+DEFINITION (U"the position of the element in the means vector (centroid) that "
 	"you want to test. ")
-TAG (L"##Value")
-DEFINITION (L"the hypothesized mean %\\mu (see below).")
-ENTRY (L"Behaviour")
-NORMAL (L"This is the standard test on means when the variance is unknown. "
+TAG (U"##Value")
+DEFINITION (U"the hypothesized mean %\\mu (see below).")
+ENTRY (U"Behaviour")
+NORMAL (U"This is the standard test on means when the variance is unknown. "
 	"The test statistic is")
-FORMULA (L"%t = (%mean - %\\mu) \\Vr%(N / %s^2),")
-NORMAL (L"which has the Student %t distribution with %ndf = %N-1 degrees of freedom.")
-NORMAL (L"In the formulas above, %mean is the element of the mean vector at "
+FORMULA (U"%t = (%mean - %\\mu) \\Vr%(N / %s^2),")
+NORMAL (U"which has the Student %t distribution with %ndf = %N-1 degrees of freedom.")
+NORMAL (U"In the formulas above, %mean is the element of the mean vector at "
 	"position %index, %\\mu is the hypothesized mean, "
 	"%N is the number of observations, %s^2 "
 	"is the variance at position [%index][%index] in the covariance matrix.")
-NORMAL (L"The returned probability %p is the %%two-sided% probability")
-FORMULA (L"%p = 2 * studentQ (%t, %ndf)")
-NORMAL (L"A low probability %p means that the difference is significant.")
+NORMAL (U"The returned probability %p is the %%two-sided% probability")
+FORMULA (U"%p = 2 * studentQ (%t, %ndf)")
+NORMAL (U"A low probability %p means that the difference is significant.")
 MAN_END
 
-MAN_BEGIN (L"Covariance: Get fraction variance...", L"djmw", 20040407)
-INTRO (L"A command to ask the selected @Covariance object for the fraction "
+MAN_BEGIN (U"Covariance: Get fraction variance...", U"djmw", 20040407)
+INTRO (U"A command to ask the selected @Covariance object for the fraction "
 	"of the total variance that is accounted for by the selected dimension(s).")
-ENTRY (L"Settings")
-TAG (L"##From dimension#, ##To dimension#")
-DEFINITION (L"define the range of components. By choosing both numbers equal, "
+ENTRY (U"Settings")
+TAG (U"##From dimension#, ##To dimension#")
+DEFINITION (U"define the range of components. By choosing both numbers equal, "
 	"you get the fraction of the variance \"explained\" by that dimension.")
-ENTRY (L"Details")
-NORMAL (L"The total variance is the sum of the diagonal elements of the covariance "
+ENTRY (U"Details")
+NORMAL (U"The total variance is the sum of the diagonal elements of the covariance "
 	"matrix #C, i.e., its trace. "
 	"The fraction is defined as:")
-FORMULA (L"\\Si__%i=%from..%to_ %%C__ii_% / \\Si__%i=1..%numberOfRows_ %%C__ii_%")
+FORMULA (U"\\Si__%i=%from..%to_ %%C__ii_% / \\Si__%i=1..%numberOfRows_ %%C__ii_%")
 MAN_END
 
-MAN_BEGIN (L"Covariance: Get significance of means difference...", L"djmw", 20040407)
-INTRO (L"Gets the level of significance for the %difference of two means "
+MAN_BEGIN (U"Covariance: Get significance of means difference...", U"djmw", 20040407)
+INTRO (U"Gets the level of significance for the %difference of two means "
 	"from the selected @Covariance object being different from a hypothesized "
 	"value.")
-ENTRY (L"Settings")
-TAG (L"##Index1#, ##Index2#")
-DEFINITION (L"the positions of the two elements of the means vector whose "
+ENTRY (U"Settings")
+TAG (U"##Index1#, ##Index2#")
+DEFINITION (U"the positions of the two elements of the means vector whose "
 	"difference is compared to the hypothesized difference.")
-TAG (L"##Value")
-DEFINITION (L"the hypothesized difference (%\\mu).")
-TAG (L"##Paired samples")
-DEFINITION (L"determines whether we treat the two means as being dependent. ")
-TAG (L"##Equal variances")
-DEFINITION (L"determines whether the distribution of the difference of the means "
+TAG (U"##Value")
+DEFINITION (U"the hypothesized difference (%\\mu).")
+TAG (U"##Paired samples")
+DEFINITION (U"determines whether we treat the two means as being dependent. ")
+TAG (U"##Equal variances")
+DEFINITION (U"determines whether the distribution of the difference of the means "
 	"is a Student t-distribution (see below).")
-ENTRY (L"Behaviour")
-NORMAL (L"This is Student's t-test for the significance of a difference of means. "
+ENTRY (U"Behaviour")
+NORMAL (U"This is Student's t-test for the significance of a difference of means. "
 	"The test statistic is:")
-FORMULA (L"%t = (%mean__1_ - %mean__2_ - %\\mu) \\Vr (%N / %s^2) with %ndf "
+FORMULA (U"%t = (%mean__1_ - %mean__2_ - %\\mu) \\Vr (%N / %s^2) with %ndf "
 	"degrees of freedom.")
-NORMAL (L"In the formula above %mean__1_ and %mean__2_ are the elements of the "
+NORMAL (U"In the formula above %mean__1_ and %mean__2_ are the elements of the "
 	"means vector, %\\mu is the hypothesized difference and %N is the number of "
 	"observations. The value that we use for the (combined) variance %s^2 is:")
-FORMULA (L"%s^2 = %var__1_ + %var__2_ - 2 * %covar__12_,")
-NORMAL (L"when the samples are %paired, and ")
-FORMULA (L"%s^2 = %var__1_ + %var__2_ ")
-NORMAL (L"when they are not.")
-NORMAL (L"The %var__1_ and %var__2_ are the variance components for "
+FORMULA (U"%s^2 = %var__1_ + %var__2_ - 2 * %covar__12_,")
+NORMAL (U"when the samples are %paired, and ")
+FORMULA (U"%s^2 = %var__1_ + %var__2_ ")
+NORMAL (U"when they are not.")
+NORMAL (U"The %var__1_ and %var__2_ are the variance components for "
 	"%mean__1_ and %mean__2_, respectively, and %covar__12_ is their covariance."
 	" When we have %%paired samples% we assume that the two variances are "
 	"not independent and their covariance is subtracted, otherwise their "
 	"covariance is not taken into account. Degrees of freedom parameter %ndf "
 	"usually equals 2(%N-1). ")
-NORMAL (L"If the two variances are significantly different, the statistic %t "
+NORMAL (U"If the two variances are significantly different, the statistic %t "
 	"above is only %approximately distributed as Student's %t with "
 	"degrees of freedom equal to:")
-FORMULA (L"%ndf = (%N-1) \\.c (%var__1_ + %var__2_)^2 / (%var__1_^2 + "
+FORMULA (U"%ndf = (%N-1) \\.c (%var__1_ + %var__2_)^2 / (%var__1_^2 + "
 	"%var__2_^2).")
-NORMAL (L"The returned probability %p will be the %%two-sided% probability")
-FORMULA (L"%p = 2 * studentQ (%t, %ndf)")
-NORMAL (L"A low probability %p means that the difference is significant.")
+NORMAL (U"The returned probability %p will be the %%two-sided% probability")
+FORMULA (U"%p = 2 * studentQ (%t, %ndf)")
+NORMAL (U"A low probability %p means that the difference is significant.")
 MAN_END
 
-MAN_BEGIN (L"Covariance: Get significance of one variance...", L"djmw", 20040407)
-INTRO (L"Gets the probability for one variance from the selected "
+MAN_BEGIN (U"Covariance: Get significance of one variance...", U"djmw", 20040407)
+INTRO (U"Gets the probability for one variance from the selected "
 	"@Covariance object being different from a hypothesized variance.")
-ENTRY (L"Settings")
-TAG (L"##Index")
-DEFINITION (L"the position of the variance element.")
-TAG (L"##Hypothesized variance")
-DEFINITION (L"the hypothesized variance %\\si^2")
-ENTRY (L"Behaviour")
-NORMAL (L"The test statistic")
-FORMULA (L"%\\ci^2 = (%N-1)%s^2 / %\\si^2,")
-NORMAL (L"is distributed as a chi-squared variate with %ndf = %N-1 degrees of freedom.")
-NORMAL (L"The returned probability %p will be ")
-FORMULA (L"%p = chiSquareQ (%\\ci^2, %ndf)")
-MAN_END
-
-MAN_BEGIN (L"Covariance: Get significance of variance ratio...", L"djmw", 20040407)
-INTRO (L"Gets the probability for the ratio of two variances "
+ENTRY (U"Settings")
+TAG (U"##Index")
+DEFINITION (U"the position of the variance element.")
+TAG (U"##Hypothesized variance")
+DEFINITION (U"the hypothesized variance %\\si^2")
+ENTRY (U"Behaviour")
+NORMAL (U"The test statistic")
+FORMULA (U"%\\ci^2 = (%N-1)%s^2 / %\\si^2,")
+NORMAL (U"is distributed as a chi-squared variate with %ndf = %N-1 degrees of freedom.")
+NORMAL (U"The returned probability %p will be ")
+FORMULA (U"%p = chiSquareQ (%\\ci^2, %ndf)")
+MAN_END
+
+MAN_BEGIN (U"Covariance: Get significance of variance ratio...", U"djmw", 20040407)
+INTRO (U"Gets the probability for the ratio of two variances "
 	"from the selected @Covariance object being different from a hypothesized "
 	"ratio.")
-ENTRY (L"Settings")
-TAG (L"##Index1#, ##Index2#")
-DEFINITION (L"determine the variances.")
-TAG (L"##Hypothesized ratio")
-DEFINITION (L"the hypothesized ratio %F.")
-ENTRY (L"Behaviour")
-NORMAL (L"The test statistic")
-FORMULA (L"%f = %s__1_^2 / %s__2_^2 / %ratio")
-NORMAL (L"is distributed as Fisher's F distribution with %ndf__1_ = %N-1 and "
+ENTRY (U"Settings")
+TAG (U"##Index1#, ##Index2#")
+DEFINITION (U"determine the variances.")
+TAG (U"##Hypothesized ratio")
+DEFINITION (U"the hypothesized ratio %F.")
+ENTRY (U"Behaviour")
+NORMAL (U"The test statistic")
+FORMULA (U"%f = %s__1_^2 / %s__2_^2 / %ratio")
+NORMAL (U"is distributed as Fisher's F distribution with %ndf__1_ = %N-1 and "
 	"%ndf__2_ = %N-1 degrees of freedom for the numerator and denominator terms, "
 	"respectively.")
-NORMAL (L"The returned probability %p will be the %%two-sided% probability")
-FORMULA (L"%p = 2 * fisherQ (%f, %ndf__1_, %ndf__2_)")
-NORMAL (L"If %s__2_^2 > %s__1_^2 we use 1/%f to determine the probability.")
-MAN_END
-
-MAN_BEGIN (L"Covariances: Report multivariate mean difference...", L"djmw", 20090627)
-INTRO (L"Reports the probability that the two multivariate means of the selected @@Covariance at s are equal.")
-ENTRY (L"Settings")
-TAG (L"##Covariances are equal")
-DEFINITION (L"determines whether the test is performed as if the two covariance matrices are equal or not.")
-ENTRY (L"Algorithm")
-NORMAL (L"For equal covariance matrices the test is via Hotelling's T^^2^ as described in @@Morrison (1990)|Morrison (1990,@ page 141). "
+NORMAL (U"The returned probability %p will be the %%two-sided% probability")
+FORMULA (U"%p = 2 * fisherQ (%f, %ndf__1_, %ndf__2_)")
+NORMAL (U"If %s__2_^2 > %s__1_^2 we use 1/%f to determine the probability.")
+MAN_END
+
+MAN_BEGIN (U"Covariances: Report multivariate mean difference...", U"djmw", 20090627)
+INTRO (U"Reports the probability that the two multivariate means of the selected @@Covariance at s are equal.")
+ENTRY (U"Settings")
+TAG (U"##Covariances are equal")
+DEFINITION (U"determines whether the test is performed as if the two covariance matrices are equal or not.")
+ENTRY (U"Algorithm")
+NORMAL (U"For equal covariance matrices the test is via Hotelling's T^^2^ as described in @@Morrison (1990)|Morrison (1990,@ page 141). "
 	"The test statistic is %F = (%N__1_+%N__2_-%p-1)/((%N__1_+%N__2_-2)%p)\\.c T^^2^, with %p and %N__1_+%N__2_-%p-1 degrees of freedom.")
-NORMAL (L"If the covariance matrices are not equal, we apply a correction on the number of degrees of freedom as "
+NORMAL (U"If the covariance matrices are not equal, we apply a correction on the number of degrees of freedom as "
 	"proposed by @@Krishnamoorthy & Yu (2004)@. The test statistic in this case is %F = (\\nu-%p+1)/(%p\\nu)\\.c T^^2^, "
 	"with %p and \\nu degrees of freedom. Here \\nu is a corrected number of degrees of freedom. ")
-NORMAL (L"(The test for unequal covariances simplifies to Welch's approximate solution for the univariate t-test with unequal variances.) ")
+NORMAL (U"(The test for unequal covariances simplifies to Welch's approximate solution for the univariate t-test with unequal variances.) ")
 MAN_END
 
-MAN_BEGIN (L"Covariances: Report equality", L"djmw", 20090701)
-INTRO (L"Reports the probability that the selected @@Covariance@ matrices are equal.")
-NORMAL (L"We use the Bartlett test and the Wald test. According to @@Schott (2001)@, "
+MAN_BEGIN (U"Covariances: Report equality", U"djmw", 20090701)
+INTRO (U"Reports the probability that the selected @@Covariance@ matrices are equal.")
+NORMAL (U"We use the Bartlett test and the Wald test. According to @@Schott (2001)@, "
 	"both tests are overly sensitive to violations of normality.")
 MAN_END
 
-MAN_BEGIN (L"Covariance: To TableOfReal (random sampling)...", L"djmw", 20101101)
-INTRO (L"Generate a @TableOfReal object by random sampling from a multi-variate "
+MAN_BEGIN (U"Covariance: To TableOfReal (random sampling)...", U"djmw", 20101101)
+INTRO (U"Generate a @TableOfReal object by random sampling from a multi-variate "
 	"normal distribution whose @Covariance matrix is the selected object.")
-ENTRY (L"Setting")
-TAG (L"##Number of data points")
-DEFINITION (L"determines the number of data points that will be generated. Each "
+ENTRY (U"Setting")
+TAG (U"##Number of data points")
+DEFINITION (U"determines the number of data points that will be generated. Each "
 	"data point occupies one row in the generated table.")
-ENTRY (L"Algorithm")
-NORMAL (L"The algorithm proceeds as follows:")
-LIST_ITEM (L"1. Diagonalize the covariance matrix: calculate the eigenvalues $v__%i_ and "
+ENTRY (U"Algorithm")
+NORMAL (U"The algorithm proceeds as follows:")
+LIST_ITEM (U"1. Diagonalize the covariance matrix: calculate the eigenvalues $v__%i_ and "
 	"eigenvectors %#e__%i_ of the %m \\xx %m Covariance matrix. "
 	"In general there will also be %m of these. Let #%E be the %m \\xx %m matrix "
 	"with eigenvector %#e__%j_ in column %j (%j=1..%m).")
-LIST_ITEM (L"2. Generate a vector #x whose elements %x__%k_ equal %x__%k_ = "
+LIST_ITEM (U"2. Generate a vector #x whose elements %x__%k_ equal %x__%k_ = "
 	"randomGauss (0, \\Vr (%v__%k_)). "
 	"Each  %x__%k_ is a random deviate drawn from a Gaussian distribution with "
 	"mean zero and standard deviation equal to the square root of the corresponding "
 	"eigenvalue %v__%k_.")
-LIST_ITEM (L"3. Rotate back: calculate the vector #y = #%E #x, obtained by multiplying the vector "
+LIST_ITEM (U"3. Rotate back: calculate the vector #y = #%E #x, obtained by multiplying the vector "
 	"#x with the matrix #%E.")
-LIST_ITEM (L"4. Add the centroid to #y and copy the elements of #y to the corresponding row of "
+LIST_ITEM (U"4. Add the centroid to #y and copy the elements of #y to the corresponding row of "
 	"the TableOfReal object.")
-LIST_ITEM (L"5. Repeat steps 2, 3 and 4 until the desired number of data points "
+LIST_ITEM (U"5. Repeat steps 2, 3 and 4 until the desired number of data points "
 	"has been reached.")
-LIST_ITEM (L"6. Copy the column labels from the Covariance object to the "
+LIST_ITEM (U"6. Copy the column labels from the Covariance object to the "
 	"TableOfReal object.")
-NORMAL (L"In case the covariance matrix is diagonal, the algorithm is much simpler: we can skip "
+NORMAL (U"In case the covariance matrix is diagonal, the algorithm is much simpler: we can skip "
 	"the first and third step.")
 MAN_END
 
-MAN_BEGIN (L"Covariance & TableOfReal: Extract quantile range...", L"djmw", 20040225)
-INTRO (L"Extract those rows from the selected @TableOfReal object whose Mahalanobis "
+MAN_BEGIN (U"Covariance & TableOfReal: Extract quantile range...", U"djmw", 20040225)
+INTRO (U"Extract those rows from the selected @TableOfReal object whose Mahalanobis "
 	"distance, with respect to the selected @Covariance object, are within the "
 	"quantile range.")
 MAN_END
 
-MAN_BEGIN (L"Covariance & TableOfReal: To TableOfReal (mahalanobis)...", L"djmw", 20140509)
-INTRO (L"Calculate Mahalanobis distance for the selected @TableOfReal with respect to the "
+MAN_BEGIN (U"Covariance & TableOfReal: To TableOfReal (mahalanobis)...", U"djmw", 20140509)
+INTRO (U"Calculate Mahalanobis distance for the selected @TableOfReal with respect to the "
 	"selected @Covariance object.")
-ENTRY (L"Setting")
-TAG (L"##Use table centroid")
-DEFINITION (L"Use the mean vector calculated from the columns in the selected TableOfReal instead of the means in the selected Covariance.")
-ENTRY (L"Explanation")
-NORMAL (L"The Mahalanobis distance is defined as")
-FORMULA (L"%d = \\Vr((#%x - #mean)\\'p #S^^-1^ (#%x - #mean)),")
-NORMAL (L"where #%x is a vector, #mean is the average and #S is the covariance matrix. ")
-NORMAL (L"It is the multivariate form of the distance measured in units of standard deviation.")
-ENTRY (L"Example")
-NORMAL (L"Count the number of items that are within 1, 2, 3, 4 and 5 standard deviations from the mean.")
-NORMAL (L"We first create a table with only one column and 10000 rows and fill it with numbers drawn from "
+ENTRY (U"Setting")
+TAG (U"##Use table centroid")
+DEFINITION (U"Use the mean vector calculated from the columns in the selected TableOfReal instead of the means in the selected Covariance.")
+ENTRY (U"Explanation")
+NORMAL (U"The Mahalanobis distance is defined as")
+FORMULA (U"%d = \\Vr((#%x - #mean)\\'p #S^^-1^ (#%x - #mean)),")
+NORMAL (U"where #%x is a vector, #mean is the average and #S is the covariance matrix. ")
+NORMAL (U"It is the multivariate form of the distance measured in units of standard deviation.")
+ENTRY (U"Example")
+NORMAL (U"Count the number of items that are within 1, 2, 3, 4 and 5 standard deviations from the mean.")
+NORMAL (U"We first create a table with only one column and 10000 rows and fill it with numbers drawn from "
 	"a normal distribution with mean zero and standard deviation one. Its covariance matrix, of course, is "
 	"one dimensional. We next create a table with Mahalanobis distances.")
-CODE (L"n = 100000")
-CODE (L"t0 = Create TableOfReal: \"table\", n, 1")
-CODE (L"Formula:  \"randomGauss(0,1)\"")
-CODE (L"c = To Covariance")
-CODE (L"selectObject: c, t0")
-CODE (L"ts = To TableOfReal (mahalanobis): \"no\"")
-CODE (L"")
-CODE (L"for nsigma to 5")
-CODE1 (L"  selectObject: ts")
-CODE1 (L"  extraction = Extract rows where:  \"self < nsigma\"")
-CODE1 (L"  nr = Get number of rows")
-CODE1 (L"  nrp = nr / n * 100")
-CODE1 (L"  expect = (1 - 2 * gaussQ (nsigma)) * 100")
-CODE1 (L"  writeInfoLine: nsigma, \"-sigma: \", nrp, \"%, \", expect, \"%\"")
-CODE1 (L"  removeObject: extraction")
-CODE (L"endfor")
-MAN_END
-
-MAN_BEGIN (L"Create ChebyshevSeries...", L"djmw", 20040407)
-INTRO (L"A command to create a @ChebyshevSeries from a list of coefficients.")
-ENTRY (L"Settings")
-TAG (L"##Xmin# and ##Xmax#")
-DEFINITION (L"define the domain of the polynomials.")
-TAG (L"%Coefficients")
-DEFINITION (L"define the coefficients of each @@Chebyshev polynomials|Chebyshev polynomial at . "
+CODE (U"n = 100000")
+CODE (U"t0 = Create TableOfReal: \"table\", n, 1")
+CODE (U"Formula:  \"randomGauss(0,1)\"")
+CODE (U"c = To Covariance")
+CODE (U"selectObject: c, t0")
+CODE (U"ts = To TableOfReal (mahalanobis): \"no\"")
+CODE (U"")
+CODE (U"for nsigma to 5")
+CODE1 (U"  selectObject: ts")
+CODE1 (U"  extraction = Extract rows where:  \"self < nsigma\"")
+CODE1 (U"  nr = Get number of rows")
+CODE1 (U"  nrp = nr / n * 100")
+CODE1 (U"  expect = (1 - 2 * gaussQ (nsigma)) * 100")
+CODE1 (U"  writeInfoLine: nsigma, \"-sigma: \", nrp, \"%, \", expect, \"%\"")
+CODE1 (U"  removeObject: extraction")
+CODE (U"endfor")
+MAN_END
+
+MAN_BEGIN (U"Create ChebyshevSeries...", U"djmw", 20040407)
+INTRO (U"A command to create a @ChebyshevSeries from a list of coefficients.")
+ENTRY (U"Settings")
+TAG (U"##Xmin# and ##Xmax#")
+DEFINITION (U"define the domain of the polynomials.")
+TAG (U"%Coefficients")
+DEFINITION (U"define the coefficients of each @@Chebyshev polynomials|Chebyshev polynomial at . "
 	"The coefficient of the polynomial with the highest degree comes last.")
 MAN_END
 
-MAN_BEGIN (L"Create ISpline...", L"djmw", 20040407)
-INTRO (L"A command to create an @ISpline from a list of coefficients.")
-ENTRY (L"Settings")
-TAG (L"##Xmin# and ##Xmax#")
-DEFINITION (L"define the domain of the polynomial @spline.")
-TAG (L"%Degree")
-DEFINITION (L"defines the degree of the polynomial @spline.")
-TAG (L"%Coefficients")
-DEFINITION (L"define the coefficients of the basis polynomials.")
-TAG (L"%%Interior knots")
-DEFINITION (L"define the positions in the domain where continuity conditions are defined.")
-ENTRY (L"Behaviour")
-NORMAL (L"The number of coefficients and the number of interior knots must satisfy "
+MAN_BEGIN (U"Create ISpline...", U"djmw", 20040407)
+INTRO (U"A command to create an @ISpline from a list of coefficients.")
+ENTRY (U"Settings")
+TAG (U"##Xmin# and ##Xmax#")
+DEFINITION (U"define the domain of the polynomial @spline.")
+TAG (U"%Degree")
+DEFINITION (U"defines the degree of the polynomial @spline.")
+TAG (U"%Coefficients")
+DEFINITION (U"define the coefficients of the basis polynomials.")
+TAG (U"%%Interior knots")
+DEFINITION (U"define the positions in the domain where continuity conditions are defined.")
+ENTRY (U"Behaviour")
+NORMAL (U"The number of coefficients and the number of interior knots must satisfy "
 	"the following relation:")
-FORMULA (L"%numberOfCoefficients = %numberOfInteriorKnots + %degree")
-NORMAL (L"")
-MAN_END
-
-MAN_BEGIN (L"Create MSpline...", L"djmw", 20040407)
-INTRO (L"A command to create an @MSpline from a list of coefficients.")
-ENTRY (L"Settings")
-TAG (L"##Xmin# and ##Xmax#")
-DEFINITION (L"define the domain of the polynomial @spline.")
-TAG (L"##Degree")
-DEFINITION (L"defines the degree of the polynomial @spline.")
-TAG (L"##Coefficients")
-DEFINITION (L"define the coefficients of the basis polynomials.")
-TAG (L"##Interior knots")
-DEFINITION (L"define the positions in the domain where continuity conditions are defined.")
-ENTRY (L"Behaviour")
-NORMAL (L"The number of coefficients and the number of interior knots must satisfy "
+FORMULA (U"%numberOfCoefficients = %numberOfInteriorKnots + %degree")
+NORMAL (U"")
+MAN_END
+
+MAN_BEGIN (U"Create MSpline...", U"djmw", 20040407)
+INTRO (U"A command to create an @MSpline from a list of coefficients.")
+ENTRY (U"Settings")
+TAG (U"##Xmin# and ##Xmax#")
+DEFINITION (U"define the domain of the polynomial @spline.")
+TAG (U"##Degree")
+DEFINITION (U"defines the degree of the polynomial @spline.")
+TAG (U"##Coefficients")
+DEFINITION (U"define the coefficients of the basis polynomials.")
+TAG (U"##Interior knots")
+DEFINITION (U"define the positions in the domain where continuity conditions are defined.")
+ENTRY (U"Behaviour")
+NORMAL (U"The number of coefficients and the number of interior knots must satisfy "
 	"the following relation:")
-FORMULA (L"%numberOfCoefficients = %numberOfInteriorKnots + %degree + 1")
-NORMAL (L"")
-MAN_END
-
-MAN_BEGIN (L"Create Polynomial...", L"djmw", 20040407)
-INTRO (L"A command to create an @Polynomial from a list of coefficients.")
-ENTRY (L"Settings")
-TAG (L"##Xmin# and ##Xmax#")
-DEFINITION (L"define the domain of the polynomial.")
-TAG (L"##Degree")
-DEFINITION (L"defines the degree of the basis polynomials.")
-TAG (L"##Coefficients")
-DEFINITION (L"define the coefficients of the polynomial. The coefficient of the "
+FORMULA (U"%numberOfCoefficients = %numberOfInteriorKnots + %degree + 1")
+NORMAL (U"")
+MAN_END
+
+MAN_BEGIN (U"Create Polynomial...", U"djmw", 20040407)
+INTRO (U"A command to create an @Polynomial from a list of coefficients.")
+ENTRY (U"Settings")
+TAG (U"##Xmin# and ##Xmax#")
+DEFINITION (U"define the domain of the polynomial.")
+TAG (U"##Degree")
+DEFINITION (U"defines the degree of the basis polynomials.")
+TAG (U"##Coefficients")
+DEFINITION (U"define the coefficients of the polynomial. The coefficient of the "
 	"highest power of %x comes last.")
 MAN_END
 
-MAN_BEGIN (L"Create LegendreSeries...", L"djmw", 20040407)
-INTRO (L"A command to create a @LegendreSeries from a list of coefficients.")
-ENTRY (L"Settings")
-TAG (L"##Xmin# and ##Xmax#")
-DEFINITION (L"define the domain of the polynomials.")
-TAG (L"##Coefficients")
-DEFINITION (L"define the coefficients of each @@Legendre polynomials|Legendre polynomial at . "
+MAN_BEGIN (U"Create LegendreSeries...", U"djmw", 20040407)
+INTRO (U"A command to create a @LegendreSeries from a list of coefficients.")
+ENTRY (U"Settings")
+TAG (U"##Xmin# and ##Xmax#")
+DEFINITION (U"define the domain of the polynomials.")
+TAG (U"##Coefficients")
+DEFINITION (U"define the coefficients of each @@Legendre polynomials|Legendre polynomial at . "
 	"The coefficient of the polynomial with the highest degree comes last.")
 MAN_END
 
-MAN_BEGIN (L"Create Sound from gammatone...", L"djmw", 20100517)
-INTRO (L"A command to create a @Sound as a @@gammatone at .")
-ENTRY (L"Settings")
-TAG (L"##Name")
-DEFINITION (L"the name of the resulting Sound object.")
-TAG (L"##Minimum time (s)# and ##Maximum time (s)#")
-DEFINITION (L"the start and end time of the resulting Sound.")
-TAG (L"##Sampling frequency (Hz)")
-DEFINITION (L"the @@sampling frequency@ of the resulting Sound.")
-TAG (L"##Gamma")
-DEFINITION (L"determines the exponent of the polynomial.")
-TAG (L"##Frequency (Hz)# and ##Bandwidth (Hz)#")
-DEFINITION (L"determine the frequency and damping of the cosine wave in the gammatone.")
-TAG (L"##Initial phase (radians)")
-DEFINITION (L"the initial phase of the cosine wave.")
-TAG (L"##Addition factor# (standard value: 0)")
-DEFINITION (L"determines the degree of asymmetry in the spectrum of the gammatone. "
+MAN_BEGIN (U"Create Sound from gammatone...", U"djmw", 20100517)
+INTRO (U"A command to create a @Sound as a @@gammatone at .")
+ENTRY (U"Settings")
+TAG (U"##Name")
+DEFINITION (U"the name of the resulting Sound object.")
+TAG (U"##Minimum time (s)# and ##Maximum time (s)#")
+DEFINITION (U"the start and end time of the resulting Sound.")
+TAG (U"##Sampling frequency (Hz)")
+DEFINITION (U"the @@sampling frequency@ of the resulting Sound.")
+TAG (U"##Gamma")
+DEFINITION (U"determines the exponent of the polynomial.")
+TAG (U"##Frequency (Hz)# and ##Bandwidth (Hz)#")
+DEFINITION (U"determine the frequency and damping of the cosine wave in the gammatone.")
+TAG (U"##Initial phase (radians)")
+DEFINITION (U"the initial phase of the cosine wave.")
+TAG (U"##Addition factor# (standard value: 0)")
+DEFINITION (U"determines the degree of asymmetry in the spectrum of the gammatone. "
 	"The zero default value gives a gammatone. A value unequal to zero results in a "
 	"so called %gammachirp. A negative value is used in auditory filter modeling to "
 	"guarantee the usual direction of filter asymmetry, which corresponds to an upward "
 	"glide in instantaneous frequency.")
-TAG (L"##Scale amplitudes")
-DEFINITION (L"determines whether the amplitudes will be scaled to fit in the range (-1, 1).")
-ENTRY (L"Purpose")
-NORMAL (L"to create a Sound according to the following formula:")
-FORMULA (L"%t^^%\\ga\\--1^ e^^\\--2%\\pi\\.c%bandwidth\\.c%t^ "
+TAG (U"##Scale amplitudes")
+DEFINITION (U"determines whether the amplitudes will be scaled to fit in the range (-1, 1).")
+ENTRY (U"Purpose")
+NORMAL (U"to create a Sound according to the following formula:")
+FORMULA (U"%t^^%\\ga\\--1^ e^^\\--2%\\pi\\.c%bandwidth\\.c%t^ "
 	"cos (2%%\\pi\\.cfrequency\\.ct% + %additionFactor\\.cln(%t) + %initialPhase),")
-NORMAL (L"The %gammachirp function has a monotonically frequency-modulated carrier (the chirp) with "
+NORMAL (U"The %gammachirp function has a monotonically frequency-modulated carrier (the chirp) with "
 	"instantaneous frequency ")
-FORMULA (L"%instantaneousFrequency(%t) = %frequency + %additionFactor / (2\\.c\\pi\\.c%t)")
-NORMAL (L"and an envelope that is a gamma distribution function. It is a theoretically optimum "
+FORMULA (U"%instantaneousFrequency(%t) = %frequency + %additionFactor / (2\\.c\\pi\\.c%t)")
+NORMAL (U"and an envelope that is a gamma distribution function. It is a theoretically optimum "
 	"auditory filter, in the sense that it leads to minimal uncertainty in the joint time and "
 	"scale representation of auditory signal analysis.")
-NORMAL (L"For faithful modelling of the inner ear, "
+NORMAL (U"For faithful modelling of the inner ear, "
 	"@@Irino & Patterson (1997)@ conclude that a value of approximately 1.5 * ERB (%frequency) "
 	"is appropriate for %bandwidth. "
 	"ERB stands for @@equivalent rectangular bandwidth at . Their formula for ERB is:")
-FORMULA (L"ERB(%f) = 6.23 10^^\\--6^ %f^2 + 93.39 10^^\\--3^ %f + 28.52.")
-NORMAL (L"To avoid @aliasing in the chirp sound, a sound is only generated during times where the "
+FORMULA (U"ERB(%f) = 6.23 10^^\\--6^ %f^2 + 93.39 10^^\\--3^ %f + 28.52.")
+NORMAL (U"To avoid @aliasing in the chirp sound, a sound is only generated during times where the "
 	"instantaneous frequency is greater than zero and smaller than the @@Nyquist frequency at .")
 MAN_END
 
-MAN_BEGIN (L"Create Sound from Shepard tone...", L"djmw", 20140117)
-INTRO (L"One of the commands that create a @Sound.")
-ENTRY (L"Settings")
-TAG (L"##Name")
-DEFINITION (L"the name of the resulting Sound object.")
-TAG (L"##Minimum time (s)# and ##Maximum time (s)")
-DEFINITION (L"the start and end time of the resulting Sound.")
-TAG (L"##Sampling frequency (Hz)")
-DEFINITION (L"the @@sampling frequency@ of the resulting Sound.")
-TAG (L"##Lowest frequency (Hz)")
-DEFINITION (L"the frequency of the lowest component in the tone complex.")
-TAG (L"##Number of components")
-DEFINITION (L"the number of frequency components in the tone complex.")
-TAG (L"##Frequency change (semitones/s)")
-DEFINITION (L"determines how many semitones the frequency of each component will change in one second. "
+MAN_BEGIN (U"Create Sound from Shepard tone...", U"djmw", 20140117)
+INTRO (U"One of the commands that create a @Sound.")
+ENTRY (U"Settings")
+TAG (U"##Name")
+DEFINITION (U"the name of the resulting Sound object.")
+TAG (U"##Minimum time (s)# and ##Maximum time (s)")
+DEFINITION (U"the start and end time of the resulting Sound.")
+TAG (U"##Sampling frequency (Hz)")
+DEFINITION (U"the @@sampling frequency@ of the resulting Sound.")
+TAG (U"##Lowest frequency (Hz)")
+DEFINITION (U"the frequency of the lowest component in the tone complex.")
+TAG (U"##Number of components")
+DEFINITION (U"the number of frequency components in the tone complex.")
+TAG (U"##Frequency change (semitones/s)")
+DEFINITION (U"determines how many semitones the frequency of each component will change in one second. "
 	"The number of seconds needed to change one octave will then be 12 divided by ##Frequency change#. "
 	"You can make rising, falling and monotonous tone complexes by chosing a positive, negative or zero value.")
-TAG (L"##Amplitude range% (dB)")
-DEFINITION (L"determines the relative size in decibels of the maximum and the minimum amplitude of the components in a tone complex. These relative amplitudes will then be 10^^\\--%amplitudeRange/20^. ")
-TAG (L"##Octave shift fraction (0-1)")
-DEFINITION (L"shifts all frequency components by this fraction at the start. You will probably only need this "
+TAG (U"##Amplitude range% (dB)")
+DEFINITION (U"determines the relative size in decibels of the maximum and the minimum amplitude of the components in a tone complex. These relative amplitudes will then be 10^^\\--%amplitudeRange/20^. ")
+TAG (U"##Octave shift fraction (0-1)")
+DEFINITION (U"shifts all frequency components by this fraction at the start. You will probably only need this "
 	"if you want to generate static tone complexes as the example script below shows.")
-ENTRY (L"Purpose")
-NORMAL (L"To create a Sound that is a continuous variant of the sound sequences "
+ENTRY (U"Purpose")
+NORMAL (U"To create a Sound that is a continuous variant of the sound sequences "
 	"used by @@Shepard (1964)@ in his "
 	"experiment about the circularity in judgments of relative pitch.")
-NORMAL (L"The tone consists of many sinusoidal components whose frequencies "
+NORMAL (U"The tone consists of many sinusoidal components whose frequencies "
 	"might increase exponentially in time. "
 	"All frequencies are always at successive intervals of an octave and sounded simultaneously. "
 	"Thus the frequency of each component above the lowest is at each moment in time exactly twice "
 	"the frequency of the one just below. The amplitudes are large for the components of intermediate "
 	"frequency only, and tapered off gradually to subthreshold levels for the components at the "
 	"highest and lowest extremes of frequency.")
-NORMAL (L"For a rising tone complex, the Sound is generated according to the following specification:")
-FORMULA (L"%s(%t) = \\su__%i=1..%numberOfComponents_ %A__%i_(%t) sin (arg__%i_(%t)), where")
-FORMULA (L"arg__%i_(%t) = \\in 2%\\pi f__%i_(%\\ta) %d\\ta , and")
-FORMULA (L"f__%i_(%t) = %lowestFrequency \\.c 2^^(%i \\-- 1 + octaveShiftFraction + %t/(12/%frequencyChange_st)^, with")
-FORMULA (L"%A__%i_(%t) = 10^^((%L__min_ + (%L__max_ \\-- %L__min_) (1 \\-- cos 2%\\pi%\\te__%i_(%t)) / 2) / 20)^, where,")
-FORMULA (L"%L__max_ = 0, %L__min_ = 10^^\\--%amplitudeRange/20^, and,")
-FORMULA (L"%\\te__%i_(%t) = 2\\pi log2 (%f(%t) / %lowestFrequency) / %numberOfComponents.")
-NORMAL (L"The maximum frequency that can be reached during a sweep by any single tone is:")
-FORMULA (L"%maximumFrequency = %lowestFrequency\\.c2^^%numberOfComponents^.")
-NORMAL (L"A component that reaches the maximum frequency falls instantaneously to the lowest frequency and then starts rising again.")
-NORMAL (L"The absolute @@sound pressure level@ of the resulting sound will not be set, it is only guaranteed that the peak value "
+NORMAL (U"For a rising tone complex, the Sound is generated according to the following specification:")
+FORMULA (U"%s(%t) = \\su__%i=1..%numberOfComponents_ %A__%i_(%t) sin (arg__%i_(%t)), where")
+FORMULA (U"arg__%i_(%t) = \\in 2%\\pi f__%i_(%\\ta) %d\\ta , and")
+FORMULA (U"f__%i_(%t) = %lowestFrequency \\.c 2^^(%i \\-- 1 + octaveShiftFraction + %t/(12/%frequencyChange_st)^, with")
+FORMULA (U"%A__%i_(%t) = 10^^((%L__min_ + (%L__max_ \\-- %L__min_) (1 \\-- cos 2%\\pi%\\te__%i_(%t)) / 2) / 20)^, where,")
+FORMULA (U"%L__max_ = 0, %L__min_ = 10^^\\--%amplitudeRange/20^, and,")
+FORMULA (U"%\\te__%i_(%t) = 2\\pi log2 (%f(%t) / %lowestFrequency) / %numberOfComponents.")
+NORMAL (U"The maximum frequency that can be reached during a sweep by any single tone is:")
+FORMULA (U"%maximumFrequency = %lowestFrequency\\.c2^^%numberOfComponents^.")
+NORMAL (U"A component that reaches the maximum frequency falls instantaneously to the lowest frequency and then starts rising again.")
+NORMAL (U"The absolute @@sound pressure level@ of the resulting sound will not be set, it is only guaranteed that the peak value "
 	"is just below 1. You can always scale the intensity with the ##Scale Intensity...# command.")
-ENTRY (L"Example")
-NORMAL (L"The following script generates 12 static Shepard tone complexes, 1 semitone 'apart', "
+ENTRY (U"Example")
+NORMAL (U"The following script generates 12 static Shepard tone complexes, 1 semitone 'apart', "
 	"with a cosine window to temper the abrupt start and finish.")
-CODE (L"fadeTime = 0.010")
-CODE (L"for i to 12")
-CODE1 (L"fraction = (i-1)/12")
-CODE1 (L"Create Sound from Shepard tone: \"s\" + string\\$  (i), 0, 0.1, 22050, 4.863, 10, 0, 34, fraction")
-CODE1 (L"Fade in: 0, 0, fadeTime, \"no\"")
-CODE1 (L"Fade out: 0, 0.1, -fadeTime, \"no\"")
-CODE (L"endfor")
+CODE (U"fadeTime = 0.010")
+CODE (U"for i to 12")
+CODE1 (U"fraction = (i-1)/12")
+CODE1 (U"Create Sound from Shepard tone: \"s\" + string\\$  (i), 0, 0.1, 22050, 4.863, 10, 0, 34, fraction")
+CODE1 (U"Fade in: 0, 0, fadeTime, \"no\"")
+CODE1 (U"Fade out: 0, 0.1, -fadeTime, \"no\"")
+CODE (U"endfor")
 MAN_END
 
-MAN_BEGIN (L"Create formant table (Peterson & Barney 1952)", L"djmw", 20080509)
-INTRO (L"A command to create a @Table object filled with the "
+MAN_BEGIN (U"Create formant table (Peterson & Barney 1952)", U"djmw", 20080509)
+INTRO (U"A command to create a @Table object filled with the "
 	"fundamental frequency and the first three formant frequency values from 10 "
 	"American-English monophthongal vowels as spoken in a /h_d/ context by 76 speakers "
 	"(33 men, 28 women and 15 children). Every vowel was pronounced twice, so that there are "
 	"1520 recorded vowels in total.")
-ENTRY (L"Table layout")
-NORMAL (L"The created table will contain 9 columns:")
-TAG (L"Column 1, labelled as %Type")
-DEFINITION (L"speaker type: \"m\", \"w\" or \"c\" (for %man, %women or %child).")
-TAG (L"Column 2, labelled as %Sex")
-DEFINITION (L"speaker sex: either \"m\" or \"f\" (for %male or %female).")
-TAG (L"Column 3, labelled as %Speaker")
-DEFINITION (L"speaker id: a number from 1 to 76.")
-TAG (L"Column 4, labelled as %Vowel")
-DEFINITION (L"the vowel name. The following list gives the vowel in a %h_d context word "
+ENTRY (U"Table layout")
+NORMAL (U"The created table will contain 9 columns:")
+TAG (U"Column 1, labelled as %Type")
+DEFINITION (U"speaker type: \"m\", \"w\" or \"c\" (for %man, %women or %child).")
+TAG (U"Column 2, labelled as %Sex")
+DEFINITION (U"speaker sex: either \"m\" or \"f\" (for %male or %female).")
+TAG (U"Column 3, labelled as %Speaker")
+DEFINITION (U"speaker id: a number from 1 to 76.")
+TAG (U"Column 4, labelled as %Vowel")
+DEFINITION (U"the vowel name. The following list gives the vowel in a %h_d context word "
 	"together with its representation in this column: (%heed, iy), (%hid, ih), "
 	"(%head, eh), (%had, ae), (%hod, aa), (%hawed, ao), (%hood, uh), (%%who'd%, uw), "
 	"(%hud, ah), (%heard, er).")
-TAG (L"Column 5, labelled as %IPA")
-DEFINITION (L"the IPA notation for the vowels as defined in @@Peterson & Barney (1952)@. ")
-TAG (L"Column 6, labelled as %F0")
-DEFINITION (L"the fundamental frequency in Hertz.")
-TAG (L"Column 7, 8 and 9, labelled as %F1, %F2 and %F3")
-DEFINITION (L"the frequencies in Hertz of the first three formants.")
-ENTRY (L"Remarks")
-NORMAL (L"We originally downloaded the data from the University of Pennsylvania FTP site, "
+TAG (U"Column 5, labelled as %IPA")
+DEFINITION (U"the IPA notation for the vowels as defined in @@Peterson & Barney (1952)@. ")
+TAG (U"Column 6, labelled as %F0")
+DEFINITION (U"the fundamental frequency in Hertz.")
+TAG (U"Column 7, 8 and 9, labelled as %F1, %F2 and %F3")
+DEFINITION (U"the frequencies in Hertz of the first three formants.")
+ENTRY (U"Remarks")
+NORMAL (U"We originally downloaded the data from the University of Pennsylvania FTP site, "
 	"where they were reportedly based on a printed version supplied by Ignatius Mattingly. ")
-NORMAL (L"About the IPA notation. We used the original notation from the Peterson & Barney article. "
+NORMAL (U"About the IPA notation. We used the original notation from the Peterson & Barney article. "
 	"The notation in @@Watrous (1991)@ differs for three vowels: Watrous uses /e, o, \\er/ where Peterson & Barney use /\\ef, \\ct, \\er\\hr/.")
-NORMAL (L"More details about these data and how they were measured can be found in the articles"
+NORMAL (U"More details about these data and how they were measured can be found in the articles"
 	"@@Watrous (1991)@ and in @@Peterson & Barney (1952)@.")
 MAN_END
 
-MAN_BEGIN (L"Create formant table (Pols & Van Nierop 1973)", L"djmw", 20020620)
-INTRO (L"A command to create a @Table object filled with the frequencies and the levels "
+MAN_BEGIN (U"Create formant table (Pols & Van Nierop 1973)", U"djmw", 20020620)
+INTRO (U"A command to create a @Table object filled with the frequencies and the levels "
 	"of the first three formants from the 12 Dutch monophthong "
 	"vowels as spoken in /h_t/ context by 50 male and 25 female speakers.")
-ENTRY (L"Table layout")
-NORMAL (L"The created table will contain 10 columns")
-TAG (L"Column 1, labeled as %Sex")
-DEFINITION (L"speaker sex: Either \"m\" or \"f\" (for %male or %female).")
-TAG (L"Column 2, labeled as %Speaker")
-DEFINITION (L"speaker id: a number from 1 to 75.")
-TAG (L"Column 3, labeled as %Vowel")
-DEFINITION (L"the vowel name. The following list gives the vowel in p_t context word "
+ENTRY (U"Table layout")
+NORMAL (U"The created table will contain 10 columns")
+TAG (U"Column 1, labeled as %Sex")
+DEFINITION (U"speaker sex: Either \"m\" or \"f\" (for %male or %female).")
+TAG (U"Column 2, labeled as %Speaker")
+DEFINITION (U"speaker id: a number from 1 to 75.")
+TAG (U"Column 3, labeled as %Vowel")
+DEFINITION (U"the vowel name. The following list gives the vowel in p_t context word "
 	"together with its representation in this column: (%poet, oe), (%paat, aa), "
 	"(%poot, oo), (%pat, a), (%peut, eu), (%piet, ie), (%puut, uu), (%peet, ee), "
 	"(%put, u), (%pet, e), (%pot, o), (%pit, i).")
-TAG (L"Column 4, labeled as %IPA")
-DEFINITION (L"the IPA-notation for the vowels")
-TAG (L"Column 5, 6 and 7, labeled as %F1, %F2 and %F3")
-DEFINITION (L"the frequencies in Hertz of the first three formants.")
-TAG (L"Column 8, 9 and 10, labeled as %L1, %L2 and %L3")
-DEFINITION (L"the levels in decibel below overall SPL of the first three formants.")
-NORMAL (L"More details about these data and how they were measured can be found "
+TAG (U"Column 4, labeled as %IPA")
+DEFINITION (U"the IPA-notation for the vowels")
+TAG (U"Column 5, 6 and 7, labeled as %F1, %F2 and %F3")
+DEFINITION (U"the frequencies in Hertz of the first three formants.")
+TAG (U"Column 8, 9 and 10, labeled as %L1, %L2 and %L3")
+DEFINITION (U"the levels in decibel below overall SPL of the first three formants.")
+NORMAL (U"More details about these data and how they were measured can be found "
 	"in @@Pols et al. (1973)@ and @@Van Nierop et al. (1973)@.")
 MAN_END
 
-MAN_BEGIN (L"Create formant table (Weenink 1985)", L"djmw", 20041217)
-INTRO (L"A command to create a @Table object filled with the "
+MAN_BEGIN (U"Create formant table (Weenink 1985)", U"djmw", 20041217)
+INTRO (U"A command to create a @Table object filled with the "
 	"fundamental frequency and the first three formant frequency values from 12 "
 	"Dutch monophthongal vowels as spoken in isolation by 30 speakers "
 	"(10 men, 10 women and 10 children). Every vowel was pronounced only once, so that there are "
 	"360 recorded vowels in total. A reduced form, with only the formant frequecy values, is also available "
 	"as a @@Create TableOfReal (Weenink 1985)...|TableOfReal at .")
-ENTRY (L"Table layout")
-NORMAL (L"The created table will contain 9 columns:")
-TAG (L"Column 1, labelled as %Type")
-DEFINITION (L"speaker type: \"m\", \"w\" or \"c\" (for %man, %women or %child).")
-TAG (L"Column 2, labelled as %Sex")
-DEFINITION (L"speaker sex: either \"m\" or \"f\" (for %male or %female).")
-TAG (L"Column 3, labelled as %Speaker")
-DEFINITION (L"speaker id: a number from 1 to 76.")
-TAG (L"Column 4, labelled as %Vowel")
-DEFINITION (L"the vowel name. The following list gives the vowel in Dutch p_t context words "
+ENTRY (U"Table layout")
+NORMAL (U"The created table will contain 9 columns:")
+TAG (U"Column 1, labelled as %Type")
+DEFINITION (U"speaker type: \"m\", \"w\" or \"c\" (for %man, %women or %child).")
+TAG (U"Column 2, labelled as %Sex")
+DEFINITION (U"speaker sex: either \"m\" or \"f\" (for %male or %female).")
+TAG (U"Column 3, labelled as %Speaker")
+DEFINITION (U"speaker id: a number from 1 to 76.")
+TAG (U"Column 4, labelled as %Vowel")
+DEFINITION (U"the vowel name. The following list gives the vowel in Dutch p_t context words "
 	"together with its representation in this column: (%poet, oe), (%paat, aa), "
 	"(%poot, oo), (%pat, a), (%peut, eu), (%piet, ie), (%puut, uu), (%peet, ee), "
 	"(%put, u), (%pet, e), (%pot, o), (%pit, i).")
-TAG (L"Column 5, labelled as %IPA")
-DEFINITION (L"the IPA notation for the vowels.")
-TAG (L"Column 6, labelled as %F0")
-DEFINITION (L"the fundamental frequency in Hertz.")
-TAG (L"Column 7, 8 and 9, labelled as %F1, %F2 and %F3")
-DEFINITION (L"the frequencies in Hertz of the first three formants. ")
-NORMAL (L"The formant frequency values have been determined by means of LPC analysis with a "
+TAG (U"Column 5, labelled as %IPA")
+DEFINITION (U"the IPA notation for the vowels.")
+TAG (U"Column 6, labelled as %F0")
+DEFINITION (U"the fundamental frequency in Hertz.")
+TAG (U"Column 7, 8 and 9, labelled as %F1, %F2 and %F3")
+DEFINITION (U"the frequencies in Hertz of the first three formants. ")
+NORMAL (U"The formant frequency values have been determined by means of LPC analysis with a "
 	"varying prediction order. See @@Weenink (1985)@.")
 MAN_END
 
-MAN_BEGIN (L"Create TableOfReal (Pols 1973)...", L"djmw", 19990426)
-INTRO (L"A command to create a @TableOfReal filled with the first three formant "
+MAN_BEGIN (U"Create TableOfReal (Pols 1973)...", U"djmw", 19990426)
+INTRO (U"A command to create a @TableOfReal filled with the first three formant "
 	"frequency values and (optionally) the levels from the 12 Dutch monophthongal "
 	"vowels as spoken in /h_t/ context by 50 male speakers.")
-NORMAL (L"The first three columns will contain the frequencies in Hz, the next three columns "
+NORMAL (U"The first three columns will contain the frequencies in Hz, the next three columns "
 	"the levels in decibels below the overall SPL of the measured vowel segment. Each row will "
 	"be labelled with its corresponding vowel symbol.")
-NORMAL (L"More details about these data and how they were measured can be found in the paper of "
+NORMAL (U"More details about these data and how they were measured can be found in the paper of "
 	"@@Pols et al. (1973)@.")
 MAN_END
 
-MAN_BEGIN (L"Create TableOfReal (Van Nierop 1973)...", L"djmw", 20041217)
-INTRO (L"A command to create a @TableOfReal filled with the first three formant "
+MAN_BEGIN (U"Create TableOfReal (Van Nierop 1973)...", U"djmw", 20041217)
+INTRO (U"A command to create a @TableOfReal filled with the first three formant "
 	"frequency values and (optionally) the levels from the 12 Dutch monophthongal "
 	"vowels as spoken in /h_t/ context by 25 female speakers.")
-NORMAL (L"The first three columns will contain the frequencies in Hz, the next three columns "
+NORMAL (U"The first three columns will contain the frequencies in Hz, the next three columns "
 	"the levels in decibels below the overall SPL of the measured vowel segment. Each row will "
 	"be labelled with its corresponding vowel symbol.")
-NORMAL (L"More details about these data and how they were measured can be found in the paper of "
+NORMAL (U"More details about these data and how they were measured can be found in the paper of "
 	"@@Van Nierop et al. (1973)@.")
 MAN_END
 
-MAN_BEGIN (L"Create TableOfReal (Weenink 1985)...", L"djmw", 19990426)
-INTRO (L"A command to create a @TableOfReal filled with the first three formant "
+MAN_BEGIN (U"Create TableOfReal (Weenink 1985)...", U"djmw", 19990426)
+INTRO (U"A command to create a @TableOfReal filled with the first three formant "
 	"frequency values from the 12 Dutch monophthongal "
 	"vowels as spoken in isolation by either 10 men or 10 women or 10 children.")
-NORMAL (L"The three columns will contain the formant frequencies in Hz. Each row will "
+NORMAL (U"The three columns will contain the formant frequencies in Hz. Each row will "
 	"be labelled with its corresponding vowel symbol.")
-NORMAL (L"More details about these data and how they were measured can be found in the paper of "
+NORMAL (U"More details about these data and how they were measured can be found in the paper of "
 	"@@Weenink (1985)@.")
 MAN_END
 
-MAN_BEGIN (L"Discriminant", L"djmw", 19981103)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type Discriminant represents the discriminant structure of a multivariate "
+MAN_BEGIN (U"Discriminant", U"djmw", 19981103)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type Discriminant represents the discriminant structure of a multivariate "
 	"data set with several groups. This discriminant structure consists of a number of orthogonal "
 	"directions in space, along which maximum separability of the groups can occur.")
-ENTRY (L"Commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@Discriminant analysis@ tutorial")
-LIST_ITEM (L"\\bu @@TableOfReal: To Discriminant@")
-NORMAL (L"Drawing")
-LIST_ITEM (L"\\bu Draw eigenvalues...")
-LIST_ITEM (L"\\bu Draw eigenvector...")
-LIST_ITEM (L"\\bu @@Discriminant: Draw sigma ellipses...|Draw sigma ellipses...@")
-MAN_END
-
-MAN_BEGIN (L"Discriminant analysis", L"djmw", 20141101)
-INTRO (L"This tutorial will show you how to perform discriminant analysis with P\\s{RAAT}")
-NORMAL (L"As an example, we will use the dataset from @@Pols et al. (1973)@ "
+ENTRY (U"Commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@Discriminant analysis@ tutorial")
+LIST_ITEM (U"\\bu @@TableOfReal: To Discriminant@")
+NORMAL (U"Drawing")
+LIST_ITEM (U"\\bu Draw eigenvalues...")
+LIST_ITEM (U"\\bu Draw eigenvector...")
+LIST_ITEM (U"\\bu @@Discriminant: Draw sigma ellipses...|Draw sigma ellipses...@")
+MAN_END
+
+MAN_BEGIN (U"Discriminant analysis", U"djmw", 20150902)
+INTRO (U"This tutorial will show you how to perform discriminant analysis with P\\s{RAAT}")
+NORMAL (U"As an example, we will use the dataset from @@Pols et al. (1973)@ "
 	"with the frequencies and levels of the first three formants from the 12 "
 	"Dutch monophthongal vowels as spoken in /h_t/ context by 50 male speakers. "
 	"This data set has been incorporated into "
 	"Praat and can be called into play with the @@Create TableOfReal "
 	"(Pols 1973)...@ command that can be found in the \"New / "
 	"TableOfReal\" menu.")
-NORMAL (L"In the list of objects a new TableOfReal object will appear with 6 "
+NORMAL (U"In the list of objects a new TableOfReal object will appear with 6 "
 	"columns and 600 rows "
 	"(50 speakers \\xx 12 vowels). The first three columns contain "
 	"the formant frequencies in Hz, the last three columns contain the levels "
 	"of the first three formants "
 	"given in decibels below the overall sound pressure level of the measured "
 	"vowel segment. Each row is labelled with a vowel label.")
-NORMAL (L"Pols et al. use logarithms of frequency values, we will too. Because "
+NORMAL (U"Pols et al. use logarithms of frequency values, we will too. Because "
 	"the measurement units in the first three columns are in Hz and in the last "
 	"three columns in dB, it is probably better to standardize the columns. "
 	"The following script summarizes our achievements up till now:")
-CODE (L"table = Create TableOfReal (Pols 1973): \"yes\"")
-CODE (L"Formula: \"if col < 4 then log10 (self) else self fi\"")
-CODE (L"Standardize columns\"")
-CODE (L"\\#  change the column labels too, for nice plot labels.")
-CODE (L"Set column label (index): 1, \"standardized log (\\% F\\_ \\_ 1\\_ )\"")
-CODE (L"Set column label (index): 2, \"standardized log (\\% F\\_ \\_ 2\\_ )\"")
-CODE (L"Set column label (index): 3, \"standardized log (\\% F\\_ \\_ 3\\_ )\"")
-CODE (L"Set column label (index): 4, \"standardized \\% L\\_ \\_ 1\\_ \"")
-CODE (L"Set column label (index): 5, \"standardized \\% L\\_ \\_ 2\\_ \"")
-CODE (L"Set column label (index): 6, \"standardized \\% L\\_ \\_ 3\\_ \"")
-NORMAL (L"To get an indication of what these data look like, we make a scatter "
+CODE (U"table = Create TableOfReal (Pols 1973): \"yes\"")
+CODE (U"Formula: \"if col < 4 then log10 (self) else self fi\"")
+CODE (U"Standardize columns")
+CODE (U"\\#  change the column labels too, for nice plot labels.")
+CODE (U"Set column label (index): 1, \"standardized log (\\% F\\_ \\_ 1\\_ )\"")
+CODE (U"Set column label (index): 2, \"standardized log (\\% F\\_ \\_ 2\\_ )\"")
+CODE (U"Set column label (index): 3, \"standardized log (\\% F\\_ \\_ 3\\_ )\"")
+CODE (U"Set column label (index): 4, \"standardized \\% L\\_ \\_ 1\\_ \"")
+CODE (U"Set column label (index): 5, \"standardized \\% L\\_ \\_ 2\\_ \"")
+CODE (U"Set column label (index): 6, \"standardized \\% L\\_ \\_ 3\\_ \"")
+NORMAL (U"To get an indication of what these data look like, we make a scatter "
 	"plot of the "
 	"first standardized log-formant-frequency against the second standardized "
 	"log-formant-frequency. With the next script fragment you can reproduce the "
 	"following picture.")
-CODE (L"Viewport: 0, 5, 0, 5")
-CODE (L"selectObject: table")
-CODE (L"Draw scatter plot: 1, 2, 0, 0, -2.9, 2.9, -2.9, 2.9, 10, \"yes\", \"+\", \"yes\"")
+CODE (U"Viewport: 0, 5, 0, 5")
+CODE (U"selectObject: table")
+CODE (U"Draw scatter plot: 1, 2, 0, 0, -2.9, 2.9, -2.9, 2.9, 10, \"yes\", \"+\", \"yes\"")
 PICTURE (5, 5, drawPolsF1F2_log)
-NORMAL (L"Apart from a difference in scale this plot is the same as fig. 3 in the "
+NORMAL (U"Apart from a difference in scale this plot is the same as fig. 3 in the "
 	"Pols et al. article.")
-ENTRY (L"1. How to perform a discriminant analysis")
-NORMAL (L"Select the TableOfReal and choose from the dynamic menu the option "
+ENTRY (U"1. How to perform a discriminant analysis")
+NORMAL (U"Select the TableOfReal and choose from the dynamic menu the option "
 	"@@TableOfReal: To Discriminant|To Discriminant at . This command is available "
 	"in the \"Multivariate statistics\" action button. The resulting Discriminant "
 	"object will bear the same name as the TableOfReal object. The following "
 	"script summarizes:")
-CODE (L"selectObject: table")
-CODE (L"discrimimant = To Discriminant\"")
-ENTRY (L"2. How to project data on the discriminant space")
-NORMAL (L"You select a TableOfReal and a Discriminant object together and choose: "
+CODE (U"selectObject: table")
+CODE (U"discrimimant = To Discriminant")
+ENTRY (U"2. How to project data on the discriminant space")
+NORMAL (U"You select a TableOfReal and a Discriminant object together and choose: "
 	"@@Discriminant & TableOfReal: To Configuration...|To Configuration... at . "
 	"One of the options of the newly created Configuration object is to draw it. "
 	"The following picture shows how the data look in the plane spanned by the "
 	"first two dimensions of this Configuration. The directions in this "
 	"configuration are the eigenvectors from the Discriminant.")
 PICTURE (5, 5, drawPolsDiscriminantConfiguration)
-NORMAL (L"The following script summarizes:")
-CODE (L"selectObject: table, discriminant")
-CODE (L"To Configuration: 0")
-CODE (L"Viewport: 0, 5, 0, 5")
-CODE (L"Draw: 1, 2, -2.9, 2.9, -2.9, 2.9, 12, \"yes\", \"+\", \"yes\"")
-NORMAL (L"If you are only interested in this projection, there also is a short cut "
+NORMAL (U"The following script summarizes:")
+CODE (U"selectObject: table, discriminant")
+CODE (U"To Configuration: 0")
+CODE (U"Viewport: 0, 5, 0, 5")
+CODE (U"Draw: 1, 2, -2.9, 2.9, -2.9, 2.9, 12, \"yes\", \"+\", \"yes\"")
+NORMAL (U"If you are only interested in this projection, there also is a short cut "
 	"without an intermediate Discriminant object:  "
 	"select the TableOfReal object and choose @@TableOfReal: To Configuration "
 	"(lda)...|To Configuration (lda)... at .")
-ENTRY (L"3. How to draw concentration ellipses")
-NORMAL (L"Select the Discriminant object and choose @@Discriminant: Draw sigma "
+ENTRY (U"3. How to draw concentration ellipses")
+NORMAL (U"Select the Discriminant object and choose @@Discriminant: Draw sigma "
 	"ellipses...|Draw sigma ellipses... at . In the form you can fill out the "
 	"coverage of the ellipse by way of the %%Number of sigmas% parameter. "
 	"You can also select the projection "
@@ -1604,445 +1604,445 @@ NORMAL (L"Select the Discriminant object and choose @@Discriminant: Draw sigma "
 	"standardized log %F__1_ vs log %F__2_ plane. When the data are multinormally distributed, "
 	"a 1-%\\si ellipse will cover approximately 39.3\\%  of the data. "
 	"The following code summarizes:")
-CODE (L"selectObject: discriminant")
-CODE (L"Draw sigma ellipses: 1.0, \"no\", 1, 2, -2.9, 2.9, -2.9, 2.9, 12, \"yes\"")
+CODE (U"selectObject: discriminant")
+CODE (U"Draw sigma ellipses: 1.0, \"no\", 1, 2, -2.9, 2.9, -2.9, 2.9, 12, \"yes\"")
 PICTURE (5, 5, drawPolsF1F2ConcentrationEllipses)
-ENTRY (L"4. How to classify")
-NORMAL (L"Select together the Discriminant object (the classifier), and "
+ENTRY (U"4. How to classify")
+NORMAL (U"Select together the Discriminant object (the classifier), and "
 	"a TableOfReal object (the data to be classified). Next you choose "
 	"@@Discriminant & TableOfReal: To ClassificationTable...|To "
 	"ClassificationTable at . "
 	"Normally you will enable the option %%Pool covariance matrices% and "
 	"the pooled covariance matrix will be used for classification.")
-NORMAL (L"The ClassificationTable can be converted to a @Confusion object "
+NORMAL (U"The ClassificationTable can be converted to a @Confusion object "
 	"and its fraction correct can be queried with: "
 	"@@Confusion: Get fraction correct at .")
-NORMAL (L"In general you would separate your data into two independent sets, "
+NORMAL (U"In general you would separate your data into two independent sets, "
 	"\\s{TRAIN} and \\s{TEST}. You would use \\s{TRAIN} to train the "
 	"discriminant classifier and \\s{TEST} to test how well it classifies. "
 	"Several possibilities for splitting a dataset into two sets exist. "
 	"We mention the @@jackknife@ (\"leave-one-out\") and the "
 	"@@bootstrap@ methods (\"resampling\").")
-ENTRY (L"5.1 Jacknife classification")
-NORMAL (L"The following script summarizes #jackknife classification of the dataset:")
-CODE (L"selectObject: table")
-CODE (L"numberOfRows = Get number of rows")
-CODE (L"for irow to numberOfRows")
-CODE (L"  selectObject: table")
-CODE (L"  rowi = Extract rows where: \"row = irow\"")
-CODE (L"  selectObject: table")
-CODE (L"  rest = Extract rows where: \"row <> .irow\"")
-CODE (L"  discriminant = To Discriminant")
-CODE (L"  plusObject: rowi")
-CODE (L"  classification = To ClassificationTable: \"yes\", \"yes\"")
-CODE (L"    if irow = 1")
-CODE (L"    confusion = To Confusion: \"yes\"")
-CODE (L"  else")
-CODE (L"    plusObject: confusion")
-CODE (L"    Increase confusion count")
-CODE (L"  endif")
-CODE (L"  removeObject: rowi, rest, discriminant, classification")
-CODE (L"endfor")
-CODE (L"selectObject: confusion")
-CODE (L"fractionCorrect = Get fraction correct")
-CODE (L"appendInfoLine: fractionCorrect, \" (= fraction correct, jackknifed \", numberOfRows, \" times).\"")
-CODE (L"removeObject: confusion")
-ENTRY (L"5.2 Bootstrap classification")
-NORMAL (L"The following script summarizes bootstrap classification.")
-CODE (L"fractionCorrect = 0")
-CODE (L"for i to numberOfBootstraps")
-CODE (L"  selectObject: table")
-CODE (L"  resampled = To TableOfReal (bootstrap)")
-CODE (L"  discriminant = To Discriminant")
-CODE (L"  plusObject: resampled")
-CODE (L"  classification = To ClassificationTable: \"yes\", \"yes\"")
-CODE (L"  confusion = To Confusion: \"yes\"")
-CODE (L"  fc = Get fraction correct")
-CODE (L"  fractionCorrect += fc")
-CODE (L"  removeObject: resampled, discriminant, classification, confusion")
-CODE (L"endfor")
-CODE (L"fractionCorrect /= numberOfBootstraps")
-CODE (L"appendInfoLine: fractionCorrect, \" (= fraction correct, bootstrapped \", numberOfBootstraps, \" times).\"")
-MAN_END
-
-MAN_BEGIN (L"Discriminant: Draw sigma ellipses...", L"djmw", 20040407)
-INTRO (L"A command to draw for each group from the selected @Discriminant an ellipse "
+ENTRY (U"5.1 Jacknife classification")
+NORMAL (U"The following script summarizes #jackknife classification of the dataset:")
+CODE (U"selectObject: table")
+CODE (U"numberOfRows = Get number of rows")
+CODE (U"for irow to numberOfRows")
+CODE (U"  selectObject: table")
+CODE (U"  rowi = Extract rows where: \"row = irow\"")
+CODE (U"  selectObject: table")
+CODE (U"  rest = Extract rows where: \"row <> irow\"")
+CODE (U"  discriminant = To Discriminant")
+CODE (U"  plusObject: rowi")
+CODE (U"  classification = To ClassificationTable: \"yes\", \"yes\"")
+CODE (U"    if irow = 1")
+CODE (U"    confusion = To Confusion: \"yes\"")
+CODE (U"  else")
+CODE (U"    plusObject: confusion")
+CODE (U"    Increase confusion count")
+CODE (U"  endif")
+CODE (U"  removeObject: rowi, rest, discriminant, classification")
+CODE (U"endfor")
+CODE (U"selectObject: confusion")
+CODE (U"fractionCorrect = Get fraction correct")
+CODE (U"appendInfoLine: fractionCorrect, \" (= fraction correct, jackknifed \", numberOfRows, \" times).\"")
+CODE (U"removeObject: confusion")
+ENTRY (U"5.2 Bootstrap classification")
+NORMAL (U"The following script summarizes bootstrap classification.")
+CODE (U"fractionCorrect = 0")
+CODE (U"for i to numberOfBootstraps")
+CODE (U"  selectObject: table")
+CODE (U"  resampled = To TableOfReal (bootstrap)")
+CODE (U"  discriminant = To Discriminant")
+CODE (U"  plusObject: resampled")
+CODE (U"  classification = To ClassificationTable: \"yes\", \"yes\"")
+CODE (U"  confusion = To Confusion: \"yes\"")
+CODE (U"  fc = Get fraction correct")
+CODE (U"  fractionCorrect += fc")
+CODE (U"  removeObject: resampled, discriminant, classification, confusion")
+CODE (U"endfor")
+CODE (U"fractionCorrect /= numberOfBootstraps")
+CODE (U"appendInfoLine: fractionCorrect, \" (= fraction correct, bootstrapped \", numberOfBootstraps, \" times).\"")
+MAN_END
+
+MAN_BEGIN (U"Discriminant: Draw sigma ellipses...", U"djmw", 20040407)
+INTRO (U"A command to draw for each group from the selected @Discriminant an ellipse "
 	"that covers part of the multivariate data.")
-ENTRY (L"Settings")
-TAG (L"##Number of sigmas")
-DEFINITION (L"determines the @@concentration ellipse|data coverage at .")
-TAG (L"##Discriminant plane")
-DEFINITION (L"When on, the selected %X and %Y-dimension will refer to the eigenvectors "
+ENTRY (U"Settings")
+TAG (U"##Number of sigmas")
+DEFINITION (U"determines the @@concentration ellipse|data coverage at .")
+TAG (U"##Discriminant plane")
+DEFINITION (U"When on, the selected %X and %Y-dimension will refer to the eigenvectors "
 	"of the discriminant space, and, consequently, the projection of the hyper ellipsoid "
 	"onto the space spanned by these eigenvectors will be drawn. When off, the selected "
 	"%X and Y-dimension will refer to the original dimensions.")
-TAG (L"##Xmin#, ##Xmax#, ##Ymin#, ##Ymax#")
-DEFINITION (L"determine the limits of the drawing area.")
-TAG (L"##Label size")
-DEFINITION (L"determines the size of the labels at the centre of the ellipse. No "
+TAG (U"##Xmin#, ##Xmax#, ##Ymin#, ##Ymax#")
+DEFINITION (U"determine the limits of the drawing area.")
+TAG (U"##Label size")
+DEFINITION (U"determines the size of the labels at the centre of the ellipse. No "
 	"labels will be drawn when a value less than or equal to zero is chosen.")
 MAN_END
 
-MAN_BEGIN (L"Discriminant: Extract within-group SSCP...", L"djmw", 20020314)
-INTRO (L"Extract the @SSCP for group %%index% from the selected @Discriminant "
+MAN_BEGIN (U"Discriminant: Extract within-group SSCP...", U"djmw", 20020314)
+INTRO (U"Extract the @SSCP for group %%index% from the selected @Discriminant "
 	"object.")
 MAN_END
 
-MAN_BEGIN (L"Discriminant: Extract pooled within-groups SSCP", L"djmw", 20020314)
-INTRO (L"Extract the pooled within-group @SSCP from the selected @Discriminant "
+MAN_BEGIN (U"Discriminant: Extract pooled within-groups SSCP", U"djmw", 20020314)
+INTRO (U"Extract the pooled within-group @SSCP from the selected @Discriminant "
 	"object.")
 MAN_END
 
-MAN_BEGIN (L"Discriminant: Get partial discrimination probability...", L"djmw", 19981102)
-INTRO (L"A command to test the selected @Discriminant for the significance of "
+MAN_BEGIN (U"Discriminant: Get partial discrimination probability...", U"djmw", 19981102)
+INTRO (U"A command to test the selected @Discriminant for the significance of "
 	"discrimination afforded by the remaining %n\\--%k eigenvectors after the acceptance of "
 	"the first %k eigenvectors.")
-ENTRY (L"Details")
-NORMAL (L"The test statistic is:")
-FORMULA (L"%\\ci^2 = \\--(%degreesOfFreedom\\--(%numberOfGroups+%dimension)/2) ln \\La\\'p, where")
-FORMULA (L"%degreesOfFreedom = (%dimension\\--%k)(%numberOfGroups\\--%k\\--1), and, ")
-FORMULA (L"\\La\\'p = \\Pi__%j=%k+1..%numberOfEigenvalues_ 1 / (1 + %%eigenvalue[j]%)")
+ENTRY (U"Details")
+NORMAL (U"The test statistic is:")
+FORMULA (U"%\\ci^2 = \\--(%degreesOfFreedom\\--(%numberOfGroups+%dimension)/2) ln \\La\\'p, where")
+FORMULA (U"%degreesOfFreedom = (%dimension\\--%k)(%numberOfGroups\\--%k\\--1), and, ")
+FORMULA (U"\\La\\'p = \\Pi__%j=%k+1..%numberOfEigenvalues_ 1 / (1 + %%eigenvalue[j]%)")
 MAN_END
 
-MAN_BEGIN (L"Discriminant: Get contribution of component...", L"djmw", 19981106)
-INTRO (L"A command to ask the selected @Discriminant for the contribution of the %j^^th^ "
+MAN_BEGIN (U"Discriminant: Get contribution of component...", U"djmw", 19981106)
+INTRO (U"A command to ask the selected @Discriminant for the contribution of the %j^^th^ "
 	"discriminant function (component) to the total variance.")
-ENTRY (L"Details")
-NORMAL (L"The contribution is defined as:")
-FORMULA (L"%%eigenvalue[j]% / \\Si__%i=1..%numberOfEigenvalues_ %%eigenvalue[i]%")
+ENTRY (U"Details")
+NORMAL (U"The contribution is defined as:")
+FORMULA (U"%%eigenvalue[j]% / \\Si__%i=1..%numberOfEigenvalues_ %%eigenvalue[i]%")
 MAN_END
 
-MAN_BEGIN (L"Discriminant: Get Wilks' lambda...", L"djmw", 20040407)
-INTRO (L"A command to ask the selected @Discriminant for the value of Wilks' lamda (a "
+MAN_BEGIN (U"Discriminant: Get Wilks' lambda...", U"djmw", 20040407)
+INTRO (U"A command to ask the selected @Discriminant for the value of Wilks' lamda (a "
 	"multivariate measure of group differences over several variables).")
-ENTRY (L"Settings")
-TAG (L"##From")
-DEFINITION (L"the first eigenvalue number from which the value for lambda has to be calculated.")
-ENTRY (L"Details")
-NORMAL (L"Wilks' lambda is defined as:")
-FORMULA (L"%\\La = \\Pi__%i=%from..%numberOfEigenvalues_ 1 / (1 + %eigenvalue[%i])")
-NORMAL (L"Because lambda is a kind of %inverse measure, values of lambda which are near zero "
+ENTRY (U"Settings")
+TAG (U"##From")
+DEFINITION (U"the first eigenvalue number from which the value for lambda has to be calculated.")
+ENTRY (U"Details")
+NORMAL (U"Wilks' lambda is defined as:")
+FORMULA (U"%\\La = \\Pi__%i=%from..%numberOfEigenvalues_ 1 / (1 + %eigenvalue[%i])")
+NORMAL (U"Because lambda is a kind of %inverse measure, values of lambda which are near zero "
 	"denote high discrimination between groups.")
 MAN_END
 
-MAN_BEGIN (L"Discriminant: Get concentration ellipse area...", L"djmw", 20040407)
-INTRO (L"A command to query the @Discriminant object for the area of the concentration "
+MAN_BEGIN (U"Discriminant: Get concentration ellipse area...", U"djmw", 20040407)
+INTRO (U"A command to query the @Discriminant object for the area of the concentration "
 	"ellipse of one of its groups.")
-ENTRY (L"Settings")
-TAG (L"##Number of sigmas")
-DEFINITION (L"determines the @@concentration ellipse|data coverage at .")
-TAG (L"##Discriminant plane")
-DEFINITION (L"When on, the selected %X and %Y-dimension will refer to the eigenvectors "
+ENTRY (U"Settings")
+TAG (U"##Number of sigmas")
+DEFINITION (U"determines the @@concentration ellipse|data coverage at .")
+TAG (U"##Discriminant plane")
+DEFINITION (U"When on, the selected %X and %Y-dimension will refer to the eigenvectors "
 	"of the discriminant space, and, consequently, the area of the projection of the hyper ellipsoid "
 	"onto the space spanned by these eigenvectors will be calculated. When off, the selected "
 	"%X and Y-dimension will refer to the original dimensions.")
-ENTRY (L"Algorithm")
-NORMAL (L"See @@SSCP: Get sigma ellipse area...")
+ENTRY (U"Algorithm")
+NORMAL (U"See @@SSCP: Get sigma ellipse area...")
 MAN_END
 
-MAN_BEGIN (L"Discriminant: Get confidence ellipse area...", L"djmw", 20040407)
-INTRO (L"A command to query the @Discriminant object for the area of the confidence "
+MAN_BEGIN (U"Discriminant: Get confidence ellipse area...", U"djmw", 20040407)
+INTRO (U"A command to query the @Discriminant object for the area of the confidence "
 	"ellipse of one of its groups.")
-ENTRY (L"Settings")
-TAG (L"##Discriminant plane")
-DEFINITION (L"When on, the selected %X and %Y-dimension will refer to the eigenvectors "
+ENTRY (U"Settings")
+TAG (U"##Discriminant plane")
+DEFINITION (U"When on, the selected %X and %Y-dimension will refer to the eigenvectors "
 	"of the discriminant space, and, consequently, the area of the projection of the hyper ellipsoid "
 	"onto the space spanned by these eigenvectors will be calculated. When off, the selected "
 	"%X and Y-dimension will refer to the original dimensions.")
-ENTRY (L"Algorithm")
-NORMAL (L"See @@SSCP: Get confidence ellipse area...")
+ENTRY (U"Algorithm")
+NORMAL (U"See @@SSCP: Get confidence ellipse area...")
 MAN_END
 
-MAN_BEGIN (L"Discriminant & Pattern: To Categories...", L"djmw", 20040422)
-INTRO (L"A command to use the selected @Discriminant to classify each pattern from the "
+MAN_BEGIN (U"Discriminant & Pattern: To Categories...", U"djmw", 20040422)
+INTRO (U"A command to use the selected @Discriminant to classify each pattern from the "
 	"selected @Pattern into a category.")
-NORMAL (L"Arguments as in @@Discriminant & TableOfReal: To ClassificationTable... at .")
+NORMAL (U"Arguments as in @@Discriminant & TableOfReal: To ClassificationTable... at .")
 MAN_END
 
-MAN_BEGIN (L"Discriminant & SSCP: Project", L"djmw", 20020313)
-INTRO (L"A command to project the selected @SSCP object on the eigenspace "
+MAN_BEGIN (U"Discriminant & SSCP: Project", U"djmw", 20020313)
+INTRO (U"A command to project the selected @SSCP object on the eigenspace "
 	"defined by the selected @Discriminant object.")
-NORMAL (L"Further details can be found in @@Eigen & SSCP: Project@")
+NORMAL (U"Further details can be found in @@Eigen & SSCP: Project@")
 MAN_END
 
-MAN_BEGIN (L"Discriminant & TableOfReal: To ClassificationTable...", L"djmw", 20040407)
-INTRO (L"A command to use the selected @Discriminant to classify each row from the "
+MAN_BEGIN (U"Discriminant & TableOfReal: To ClassificationTable...", U"djmw", 20040407)
+INTRO (U"A command to use the selected @Discriminant to classify each row from the "
 	"selected @TableOfReal. The newly created @ClassificationTable will then contain the posterior "
 	"probabilities of group membership.")
-ENTRY (L"Settings")
-TAG (L"##Pool covariance matrices")
-DEFINITION (L"when on, all group covariance matrices are pooled and distances will be determined "
+ENTRY (U"Settings")
+TAG (U"##Pool covariance matrices")
+DEFINITION (U"when on, all group covariance matrices are pooled and distances will be determined "
 	"on the basis of only this pooled covariance matrix (see below).")
-ENTRY (L"Details")
-NORMAL (L"The posterior probabilities of group membership %p__%j_ for a vector #x are defined as:")
-FORMULA (L"%p__%j_ = %p(%j\\| #%x) = exp (\\--%d__%j_^^2^(#%x) / 2) / "
+ENTRY (U"Details")
+NORMAL (U"The posterior probabilities of group membership %p__%j_ for a vector #x are defined as:")
+FORMULA (U"%p__%j_ = %p(%j\\| #%x) = exp (\\--%d__%j_^^2^(#%x) / 2) / "
 	"\\su__%k=1..%numberOfGroups_ exp (\\--%d__%k_^^2^(#%x) / 2),")
-NORMAL (L"where %d__%i_^^2^ is the generalized squared distance function:")
-FORMULA (L"%d__%i_^^2^(#%x) = ((#%x\\--#%\\mu__%i_)\\'p #\\Si__%i_^^-1^ (#%x\\--#%\\mu__%i_) + "
+NORMAL (U"where %d__%i_^^2^ is the generalized squared distance function:")
+FORMULA (U"%d__%i_^^2^(#%x) = ((#%x\\--#%\\mu__%i_)\\'p #\\Si__%i_^^-1^ (#%x\\--#%\\mu__%i_) + "
 	"ln determinant (#\\Si__%i_)) / 2 \\-- ln %aprioriProbability__%i_")
-NORMAL (L"that depends on the individual covariance matrix #\\Si__%i_ and the mean "
+NORMAL (U"that depends on the individual covariance matrix #\\Si__%i_ and the mean "
 	"#%\\mu__%i_ for group %i.")
-NORMAL (L"When the covariances matrices are %pooled, the squared distance function can be reduced to:")
-FORMULA (L"%d__%i_^^2^(#%x) = ((#%x\\--#%\\mu__%i_)\\'p #\\Si^^-1^ (#%x\\--#%\\mu__%i_) "
+NORMAL (U"When the covariances matrices are %pooled, the squared distance function can be reduced to:")
+FORMULA (U"%d__%i_^^2^(#%x) = ((#%x\\--#%\\mu__%i_)\\'p #\\Si^^-1^ (#%x\\--#%\\mu__%i_) "
 	"\\-- ln %aprioriProbability__%i_,")
-NORMAL (L"and #\\Si is now the pooled covariance matrix.")
-NORMAL (L"The a priori probabilities normally will have values that are related to the number of "
+NORMAL (U"and #\\Si is now the pooled covariance matrix.")
+NORMAL (U"The a priori probabilities normally will have values that are related to the number of "
 	"%training vectors %n__%i_ in each group:")
-FORMULA (L"%aprioriProbability__%i_ = %n__%i_ / \\Si__%k=1..%numberOfGroups_ %n__%k_")
+FORMULA (U"%aprioriProbability__%i_ = %n__%i_ / \\Si__%k=1..%numberOfGroups_ %n__%k_")
 MAN_END
 
-MAN_BEGIN (L"Discriminant & TableOfReal: To Configuration...", L"djmw", 20040407)
-INTRO (L"A command to project each row in the selected @TableOfReal onto "
+MAN_BEGIN (U"Discriminant & TableOfReal: To Configuration...", U"djmw", 20040407)
+INTRO (U"A command to project each row in the selected @TableOfReal onto "
 	"a space spanned by the eigenvectors of the selected @Discriminant. ")
-ENTRY (L"Settings")
-TAG (L"##Number of dimensions")
-DEFINITION (L"specifies the number of eigenvectors taken into account, i.e., determines "
+ENTRY (U"Settings")
+TAG (U"##Number of dimensions")
+DEFINITION (U"specifies the number of eigenvectors taken into account, i.e., determines "
 	"the dimension of the resulting @Configuration. When the default value (0) is "
 	"given the resulting Configuration will have the maximum dimension as allowed by "
 	"the number of eigenvectors in the selected Discriminant.")
-ENTRY (L"Precondition")
-NORMAL (L"The number of columns in the TableOfReal must equal the dimension of the "
+ENTRY (U"Precondition")
+NORMAL (U"The number of columns in the TableOfReal must equal the dimension of the "
 	"eigenvectors in the Discriminant.")
-NORMAL (L"See also @@Eigen & TableOfReal: Project... at .")
+NORMAL (U"See also @@Eigen & TableOfReal: Project... at .")
 MAN_END
 
-MAN_BEGIN (L"Discriminant & TableOfReal: To TableOfReal (mahalanobis)...", L"djmw", 20140509)
-INTRO (L"Calculate Mahalanobis distances for the selected @TableOfReal with respect to one group in the "
+MAN_BEGIN (U"Discriminant & TableOfReal: To TableOfReal (mahalanobis)...", U"djmw", 20140509)
+INTRO (U"Calculate Mahalanobis distances for the selected @TableOfReal with respect to one group in the "
 	"selected @Discriminant object.")
-ENTRY (L"Settings")
-TAG (L"##Group label")
-DEFINITION (L"defines which group mean to use for the distance calculation.")
-TAG (L"##Pool covariance matrices")
-DEFINITION (L"when on use a pooled covariance matrix instead of the group covariance matrix.")
-ENTRY (L"Algorithm")
-NORMAL (L"See @@Covariance & TableOfReal: To TableOfReal (mahalanobis)... at .")
-ENTRY (L"Example")
-NORMAL (L"Calculate the number of datapoints that are within the one-sigma elipses of two different groups, i.e. "
+ENTRY (U"Settings")
+TAG (U"##Group label")
+DEFINITION (U"defines which group mean to use for the distance calculation.")
+TAG (U"##Pool covariance matrices")
+DEFINITION (U"when on use a pooled covariance matrix instead of the group covariance matrix.")
+ENTRY (U"Algorithm")
+NORMAL (U"See @@Covariance & TableOfReal: To TableOfReal (mahalanobis)... at .")
+ENTRY (U"Example")
+NORMAL (U"Calculate the number of datapoints that are within the one-sigma elipses of two different groups, i.e. "
 	"the number of data points that are in the overlapping area. ")
-NORMAL (L"Suppose the group labels are \\o/ and \\yc.")
-CODE (L"pols50m = Create TableOfReal (Pols 1973): \"no\"")
-CODE (L"Formula: \"log10(self)\"")
-CODE (L"discriminant = To Discriminant")
-CODE (L"selectObject: pols50m, discriminant")
-CODE (L"t1 = To TableOfReal (mahalanobis): \"\\bso/\", \"no\"")
-CODE (L"selectObject: pols50m, discriminant")
-CODE (L"t2 = To TableOfReal (mahalanobis): \"\\bsyc\", \"no\"")
-NORMAL (L"Now we count when both the t1 and t2 values are smaller than 1 (sigma):")
-CODE (L"Copy: \"tr\"")
-CODE (L"Formula: \"Object_'t1'[] < 1 and Object_'t2'[] < 1\"")
-CODE (L"Extract rows where column: 1, \"equal to\", 1")
-CODE (L"no = Get number of rows\"")
-MAN_END
-
-MAN_BEGIN (L"DTW", L"djmw", 20110603)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type DTW represents the dynamic time warp structure of "
+NORMAL (U"Suppose the group labels are \\o/ and \\yc.")
+CODE (U"pols50m = Create TableOfReal (Pols 1973): \"no\"")
+CODE (U"Formula: \"log10(self)\"")
+CODE (U"discriminant = To Discriminant")
+CODE (U"selectObject: pols50m, discriminant")
+CODE (U"t1 = To TableOfReal (mahalanobis): \"\\bso/\", \"no\"")
+CODE (U"selectObject: pols50m, discriminant")
+CODE (U"t2 = To TableOfReal (mahalanobis): \"\\bsyc\", \"no\"")
+NORMAL (U"Now we count when both the t1 and t2 values are smaller than 1 (sigma):")
+CODE (U"Copy: \"tr\"")
+CODE (U"Formula: \"Object_'t1'[] < 1 and Object_'t2'[] < 1\"")
+CODE (U"Extract rows where column: 1, \"equal to\", 1")
+CODE (U"no = Get number of rows\"")
+MAN_END
+
+MAN_BEGIN (U"DTW", U"djmw", 20110603)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type DTW represents the dynamic time warp structure of "
 	"two objects.")
-ENTRY (L"Commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@CC: To DTW...@ (from 2 objects with cepstral coefficients)")
-LIST_ITEM (L"\\bu ##Spectrogram: To DTW...# (from 2 Spectrogram objects)")
-NORMAL (L"Query:")
-LIST_ITEM (L"\\bu @@DTW: Get y time from x time...@")
-LIST_ITEM (L"\\bu @@DTW: Get x time from y time...@")
-MAN_END
-
-MAN_BEGIN (L"DTW: Draw warp (x)...", L"djmw", 20071204)
-INTRO (L"Draws the warp given a time on the \"x-direction\"")
-MAN_END
-
-MAN_BEGIN (L"DTW: Find path (band & slope)...", L"djmw", 20120223)
-INTRO (L"Finds the optimal path for the selected @DTW that lies within the union of the sakoe-chiba band and local slope limits.")
-ENTRY (L"Settings")
-TAG (L"##Sakoe-Chiba band (s)#,")
-DEFINITION (L"The maximum distance from the start/end of the sound where a path may start/finish.")
-TAG (L"##Slope constraint#,")
-DEFINITION (L"determines the maximum and minimum local slopes in the optimal path. For example, the constraint "
+ENTRY (U"Commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@CC: To DTW...@ (from 2 objects with cepstral coefficients)")
+LIST_ITEM (U"\\bu ##Spectrogram: To DTW...# (from 2 Spectrogram objects)")
+NORMAL (U"Query:")
+LIST_ITEM (U"\\bu @@DTW: Get y time from x time...@")
+LIST_ITEM (U"\\bu @@DTW: Get x time from y time...@")
+MAN_END
+
+MAN_BEGIN (U"DTW: Draw warp (x)...", U"djmw", 20071204)
+INTRO (U"Draws the warp given a time on the \"x-direction\"")
+MAN_END
+
+MAN_BEGIN (U"DTW: Find path (band & slope)...", U"djmw", 20120223)
+INTRO (U"Finds the optimal path for the selected @DTW that lies within the union of the sakoe-chiba band and local slope limits.")
+ENTRY (U"Settings")
+TAG (U"##Sakoe-Chiba band (s)#,")
+DEFINITION (U"The maximum distance from the start/end of the sound where a path may start/finish.")
+TAG (U"##Slope constraint#,")
+DEFINITION (U"determines the maximum and minimum local slopes in the optimal path. For example, the constraint "
     "1/3 < slope < 3 forces the path locally after having taken three steps in the same direction direction to take the next step in the other direction, or after having taken two steps in the same direction to take the next step in the diagonal direction. At the same time the global consequences of the \"1/3 < slope < 3\" constraint mandates that the durations of the two domains do not differ by more than a factor of three. ")
-NORMAL (L"For more information see the article of @@Sakoe & Chiba (1978)@.")
+NORMAL (U"For more information see the article of @@Sakoe & Chiba (1978)@.")
 MAN_END
 
-MAN_BEGIN (L"DTW: Get maximum consecutive steps...", L"djmw", 20050307)
-INTRO (L"Get the maximum number of consecutive steps in the chosen direction along the optimal path from the selected @DTW.")
+MAN_BEGIN (U"DTW: Get maximum consecutive steps...", U"djmw", 20050307)
+INTRO (U"Get the maximum number of consecutive steps in the chosen direction along the optimal path from the selected @DTW.")
 MAN_END
 
-MAN_BEGIN (L"DTW: Get distance (weighted)", L"djmw", 20100628)
-INTRO (L"Queries the selected @DTW object for the weighted distance along the minimum path.")
-ENTRY (L"Algorithm")
-NORMAL (L"If the distance matrix has %%nx% cells along the %%x%-direction, %%ny% cells along the %%y%-direction and the "
+MAN_BEGIN (U"DTW: Get distance (weighted)", U"djmw", 20100628)
+INTRO (U"Queries the selected @DTW object for the weighted distance along the minimum path.")
+ENTRY (U"Algorithm")
+NORMAL (U"If the distance matrix has %%nx% cells along the %%x%-direction, %%ny% cells along the %%y%-direction and the "
 	"sum of the distances along the minimum path is %%S%, the weighted distance is given by %%S%/(%nx+%ny). ")
 MAN_END
 
-MAN_BEGIN (L"DTW: Get time along path...", L"djmw", 20110603)
-INTRO (L"Queries the selected @DTW object for the time along the minimal path "
+MAN_BEGIN (U"DTW: Get time along path...", U"djmw", 20110603)
+INTRO (U"Queries the selected @DTW object for the time along the minimal path "
 	"given the time along the \"%x-direction\". This command is deprecated, the new commands for querying are "
 	"@@DTW: Get y time from x time...@ and @@DTW: Get x time from y time... at .")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time along the %x-direction.")
-ENTRY (L"Behaviour")
-NORMAL (L"When the %input time is in the interval [%xmin, %xmax], the %returned "
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time along the %x-direction.")
+ENTRY (U"Behaviour")
+NORMAL (U"When the %input time is in the interval [%xmin, %xmax], the %returned "
 	"time will be in the interval [%ymin, %ymax], where [%xmin, %xmax] and "
 	"[%ymin, %ymax] are the domains of the two \"objects\" from which the "
 	"DTW-object was constructed."
 	"For all other input times we assume that the two object are aligned.")
-NORMAL (L"We like to have a \"continuous\" interpretation of time for the quantized times in the %x and "
+NORMAL (U"We like to have a \"continuous\" interpretation of time for the quantized times in the %x and "
 	"%y direction; we make the path piecewise linear. There are two special cases:")
-NORMAL (L"1. The local path is horizontal. We calculate the %y-time from the line that connects the "
+NORMAL (U"1. The local path is horizontal. We calculate the %y-time from the line that connects the "
 	"lower-left position of the leftmost horizontal time block to the upper-right position of the "
 	"rightmost horizontal  time block.")
-NORMAL (L"2. The local path is vertical. We calculate the %y-time from the line that connects the "
+NORMAL (U"2. The local path is vertical. We calculate the %y-time from the line that connects the "
 	"lower-left position of the bottommost vertical time block to the upper-right position of the "
 	"topmost horizontal time block.")
 MAN_END
 
-MAN_BEGIN (L"DTW: Get y time from x time...", L"djmw", 20110603)
-INTRO (L"Queries the selected @DTW object for the time along the %y-direction "
+MAN_BEGIN (U"DTW: Get y time from x time...", U"djmw", 20110603)
+INTRO (U"Queries the selected @DTW object for the time along the %y-direction "
 	"given the time along the \"%x-direction\". ")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time along the %x-direction.")
-ENTRY (L"Behaviour")
-NORMAL (L"When the %input time is in the interval [%xmin, %xmax], the %returned "
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time along the %x-direction.")
+ENTRY (U"Behaviour")
+NORMAL (U"When the %input time is in the interval [%xmin, %xmax], the %returned "
 	"time will be in the interval [%ymin, %ymax], where [%xmin, %xmax] and "
 	"[%ymin, %ymax] are the domains of the two \"objects\" from which the "
 	"DTW-object was constructed."
 	"For input times outside the domain we assume that the two object were aligned.")
-NORMAL (L"We like to have a \"continuous\" interpretation of time for the quantized times in the %x and "
+NORMAL (U"We like to have a \"continuous\" interpretation of time for the quantized times in the %x and "
 	"%y direction; we make the path a piecewise linear monotonically increasing function. "
 	"There are special cases:")
-NORMAL (L"1. The local path is in the %x-direction only. We calculate the %y-time from the line "
+NORMAL (U"1. The local path is in the %x-direction only. We calculate the %y-time from the line "
 	"that connects the lower-left position of the begin cell of this path to the "
 	"upper-right position of the last cell.")
-NORMAL (L"2. The local path is in the x-direction only. We calculate the %y-time from the line "
+NORMAL (U"2. The local path is in the x-direction only. We calculate the %y-time from the line "
 	"that connects the lower-left position of lowest cell to the upper-right position of the "
 	"highest cell.")
-NORMAL (L"3. A cell is both part of a path in the %x- and the %y-direction. "
+NORMAL (U"3. A cell is both part of a path in the %x- and the %y-direction. "
 	"We then calculate the intersection point of the paths in the %x- and the %y-directions. "
 	"The %y-times in this cell are now calculated from the two line segments that originate "
 	"from this intersection point.")
 MAN_END
 
-MAN_BEGIN (L"DTW: Get x time from y time...", L"djmw", 20110603)
-INTRO (L"Queries the selected @DTW object for the time along the %x-direction "
+MAN_BEGIN (U"DTW: Get x time from y time...", U"djmw", 20110603)
+INTRO (U"Queries the selected @DTW object for the time along the %x-direction "
 	"given the time along the \"%y-direction\". ")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time along the %y-direction.")
-ENTRY (L"Behaviour")
-NORMAL (L"The behaviour is like @@DTW: Get y time from x time...@")
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time along the %y-direction.")
+ENTRY (U"Behaviour")
+NORMAL (U"The behaviour is like @@DTW: Get y time from x time...@")
 MAN_END
 
-MAN_BEGIN (L"DTW: Swap axes", L"djmw", 20050306)
-INTRO (L"Swap the x and y-axes of the selected @DTW.")
+MAN_BEGIN (U"DTW: Swap axes", U"djmw", 20050306)
+INTRO (U"Swap the x and y-axes of the selected @DTW.")
 MAN_END
 
-MAN_BEGIN (L"DTW: To Polygon...", L"djmw", 20120223)
-INTRO (L"A command to convert for a selected @DTW the Sakoe-Chiba band and the local slope constraint "
+MAN_BEGIN (U"DTW: To Polygon...", U"djmw", 20120223)
+INTRO (U"A command to convert for a selected @DTW the Sakoe-Chiba band and the local slope constraint "
 	"to a @Polygon object. The polygon will show the boundaries of the search domain for the optimal path.")
 MAN_END
 
-MAN_BEGIN (L"DTW & TextGrid: To TextGrid (warp times)", L"djmw", 20110603)
-INTRO (L"Create a new TextGrid from the selected @DTW and @TextGrid by warping the "
+MAN_BEGIN (U"DTW & TextGrid: To TextGrid (warp times)", U"djmw", 20110603)
+INTRO (U"Create a new TextGrid from the selected @DTW and @TextGrid by warping the "
 	"times from the selected TextGrid to the newly created TextGrid.")
-ENTRY (L"Algorithm")
-NORMAL (L"First we check whether the y-domain of the DTW and the domain of the TextGrid are "
+ENTRY (U"Algorithm")
+NORMAL (U"First we check whether the y-domain of the DTW and the domain of the TextGrid are "
 	"equal. If they are, a new TextGrid is created by copying the selected one. "
 	"We then change its domain and make it equal to the x-domain of the DTW. "
 	"Then for each tier we change the domain and @@DTW: Get x time from y time...|calculate new times@ by using the path.")
 MAN_END
 
-MAN_BEGIN (L"DTW & Sounds: Draw...", L"djmw", 20071204)
-INTRO (L"Draws the distances, the path and the sounds for the selected @DTW and the two selected @@Sound|Sounds at .")
+MAN_BEGIN (U"DTW & Sounds: Draw...", U"djmw", 20071204)
+INTRO (U"Draws the distances, the path and the sounds for the selected @DTW and the two selected @@Sound|Sounds at .")
 MAN_END
 
-MAN_BEGIN (L"DTW & Sounds: Draw warp (x)...", L"djmw", 20071204)
-INTRO (L"Draws the warp given a time on the \"x-direction\" for the selected @DTW and the two selected @@Sound|Sounds at .")
+MAN_BEGIN (U"DTW & Sounds: Draw warp (x)...", U"djmw", 20071204)
+INTRO (U"Draws the warp given a time on the \"x-direction\" for the selected @DTW and the two selected @@Sound|Sounds at .")
 MAN_END
 
-MAN_BEGIN (L"Create empty EditCostsTable...", L"djmw", 20120524)
-INTRO (L"Creates an empty @@EditCostsTable at .")
-ENTRY (L"Settings")
-TAG (L"##Name#")
-DEFINITION (L"the name of the resulting EditCostsTable object.")
-TAG (L"##Number of target symbols#")
-DEFINITION (L"the number of different symbols in the target symbol set that you want to give special edit cost values in the EditCostTable. "
+MAN_BEGIN (U"Create empty EditCostsTable...", U"djmw", 20120524)
+INTRO (U"Creates an empty @@EditCostsTable at .")
+ENTRY (U"Settings")
+TAG (U"##Name#")
+DEFINITION (U"the name of the resulting EditCostsTable object.")
+TAG (U"##Number of target symbols#")
+DEFINITION (U"the number of different symbols in the target symbol set that you want to give special edit cost values in the EditCostTable. "
 	"The number you specify may be smaller than the actual target symbol set size because the EditCostTable has an entry for target symbols "
 	"that fall in a %%rest% category. If you don't want to treat any target symbol is a special way you may set this value to 0.")
-TAG (L"##Number of source symbols#")
-DEFINITION (L"the number of different symbols in the source symbol set that you want to give special edit cost values in the EditCostTable. "
+TAG (U"##Number of source symbols#")
+DEFINITION (U"the number of different symbols in the source symbol set that you want to give special edit cost values in the EditCostTable. "
 	"The number you specify may be smaller than the actual source symbol set size because the EditCostTable has an entry for source symbols "
 	"that fall in a %rest% category. If you don't want to treat any source symbol is a special way you may set this value 0.")
 MAN_END
 
-MAN_BEGIN (L"EditCostsTable", L"djmw", 20140509)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"The EditCostsTable determines the %%string edit costs%, i.e. the costs involved in changing one string of "
+MAN_BEGIN (U"EditCostsTable", U"djmw", 20140509)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"The EditCostsTable determines the %%string edit costs%, i.e. the costs involved in changing one string of "
 	"symbols (the %%source%) into another one (the %%target%). "
 	"String edit costs are generally divided into %%insertion%, %%deletion% and %%substitution% costs. "
 	"The latter terms refer to the operations that may be performed on a source string to transform it to a target "
 	"string. For example, to change the source string \"execution\" to the target string \"intention\" we would need "
 	"one insertion (i), one deletion (d) and three substitutions (s) as the following figure shows.")
-SCRIPT (4, 1.0,  L"target = Create Strings as characters: \"intention\"\n"
+SCRIPT (4, 1.0,  U"target = Create Strings as characters: \"intention\"\n"
 "source = Create Strings as characters: \"execution\"\n"
 	"selectObject: source, target\n"
 	"edt = To EditDistanceTable\n"
 	"Draw edit operations\n"
 	"removeObject: edt, target, source\n")
-NORMAL (L"The figure above was produced with default values for the costs, i.e. the insertion and deletion costs were 1.0 while the "
+NORMAL (U"The figure above was produced with default values for the costs, i.e. the insertion and deletion costs were 1.0 while the "
 	"substitution cost was 2.0. The actual edit distance between the target and source strings is calculated by the @@EditDistanceTable@ "
 	"which uses an EditCostsTable to access the specific string edit costs. The figure above was produced by the following commands:")
-CODE (L"target = Create Strings as characters: \"intention\"")
-CODE (L"source = Create Strings as characters: \"execution\"")
-CODE (L"plusObject: target")
-CODE (L"edt = To EditDistanceTable")
-CODE (L"Draw edit operations")
-NORMAL (L"The default EditCostsTable which is in every new EditDistanceTable object has only two rows and two columns, "
+CODE (U"target = Create Strings as characters: \"intention\"")
+CODE (U"source = Create Strings as characters: \"execution\"")
+CODE (U"plusObject: target")
+CODE (U"edt = To EditDistanceTable")
+CODE (U"Draw edit operations")
+NORMAL (U"The default EditCostsTable which is in every new EditDistanceTable object has only two rows and two columns, "
 	"where the cells in this EditCostsTable have the following interpretation:\n")
-TAG (L"Cell [1][2]:")
-DEFINITION (L"defines the cost for the insertion of a target symbol in the source string. The default insertion cost is 1.0.")
-TAG (L"Cell [2][1]:")
-DEFINITION (L"defines the cost of the deletion of a source symbol. The default value is 1.0.")
-TAG (L"Cell [1][1]:")
-DEFINITION (L"defines the cost of substituting a target symbol for a source symbol where the target and source symbols don't match. The default substitution cost is 2.0.")
-TAG (L"Cell [2][2]:")
-DEFINITION (L"defines the cost of substituting a target symbol for a source symbol where the target and source symbols do match. The deault value is 0.0.")
-ENTRY (L"How to create a non-default EditCostsTable")
-NORMAL (L"In general we can define a table for %%numberOfTargets% target symbols and %%numberOfSources% source symbols. These numbers "
+TAG (U"Cell [1][2]:")
+DEFINITION (U"defines the cost for the insertion of a target symbol in the source string. The default insertion cost is 1.0.")
+TAG (U"Cell [2][1]:")
+DEFINITION (U"defines the cost of the deletion of a source symbol. The default value is 1.0.")
+TAG (U"Cell [1][1]:")
+DEFINITION (U"defines the cost of substituting a target symbol for a source symbol where the target and source symbols don't match. The default substitution cost is 2.0.")
+TAG (U"Cell [2][2]:")
+DEFINITION (U"defines the cost of substituting a target symbol for a source symbol where the target and source symbols do match. The deault value is 0.0.")
+ENTRY (U"How to create a non-default EditCostsTable")
+NORMAL (U"In general we can define a table for %%numberOfTargets% target symbols and %%numberOfSources% source symbols. These numbers "
 	"do not necessarily have to be equal to the number of different symbols that may occur in the target and source strings. They only represent the number of symbols that you like to give special edit costs. "
 	"The EditCostTable will provide one extra dimension to accommodate target symbol insertion costs and source symbol deletion costs and another extra dimension to represent other target and source symbols that don't have separate entries and can therefore be treated as one group. "
 	"The actual dimension of the table will therefore be (%%numberOfTargets% + 2) \\xx (%%numberOfSources% + 2). This is what the cells in the non-default table mean: ")
-LIST_ITEM (L"\\bu The upper matrix part of dimension %%numberOfTargets% \\xx %%numberOfSources% will show at cell [%i][%j] the costs "
+LIST_ITEM (U"\\bu The upper matrix part of dimension %%numberOfTargets% \\xx %%numberOfSources% will show at cell [%i][%j] the costs "
 	"of substituting the %i-th target symbol for the %j-th source symbol.")
-LIST_ITEM (L"\\bu The first %%numberOfSources% values in row (%%numberOfTargets% + 1) represent the costs of substituting one of the target "
+LIST_ITEM (U"\\bu The first %%numberOfSources% values in row (%%numberOfTargets% + 1) represent the costs of substituting one of the target "
 	"symbols from the target %%rest% category for the source symbol in the corresponding column.  The target rest category is the group of "
 	"targets that do not belong to the %%numberOfTargets% targets represented in the upper part of the matrix.")
-LIST_ITEM (L"\\bu The first %%numberOfTargets% values in the column (%%numberOfSources% + 1) represent the costs of substituting the target "
+LIST_ITEM (U"\\bu The first %%numberOfTargets% values in the column (%%numberOfSources% + 1) represent the costs of substituting the target "
 	"symbol in the corresponding row for one of the source symbols from the source %%rest% category.  The source rest category is the group "
 	"of source symbols that do not belong to the %%numberOfSources% source symbols represented in the upper part of the matrix.")
-LIST_ITEM (L"\\bu The first %%numberOfSources% cells in the last row represent the deletion cost of the corresponding source symbols.")
-LIST_ITEM (L"\\bu The first %%numberOfTargets% cells in the last column represent the insertion costs of the corresponding target symbols.")
-LIST_ITEM (L"\\bu Finally the four numbers in the cells at the bottom-right corner have an interpretation analogous to the four numbers in "
+LIST_ITEM (U"\\bu The first %%numberOfSources% cells in the last row represent the deletion cost of the corresponding source symbols.")
+LIST_ITEM (U"\\bu The first %%numberOfTargets% cells in the last column represent the insertion costs of the corresponding target symbols.")
+LIST_ITEM (U"\\bu Finally the four numbers in the cells at the bottom-right corner have an interpretation analogous to the four numbers in "
 	"the basic EditCostTable we discussed above (but now for the %%rest% symbols).")
-ENTRY (L"Example")
-NORMAL (L"If we extend the basic table with one extra target and one extra source symbol, then the EditCostTable will "
+ENTRY (U"Example")
+NORMAL (U"If we extend the basic table with one extra target and one extra source symbol, then the EditCostTable will "
 	"be a 3 by 3 table. The numbers in the following table have been chosen to be distinctive and therefore probably "
 	"will not correspond to any practical situation.")
-CODE (L"   s         ")
-CODE (L"t 1.1 1.2 1.3")
-CODE (L"  1.4 1.5 1.6")
-CODE (L"  1.7 1.8 0.0")
-NORMAL (L"By issuing the following series of commands this particular table can be created:")
-CODE (L"Create empty EditCostsTable: \"editCosts\", 1, 1")
-CODE (L"Set target symbol (index): 1, \"t\"")
-CODE (L"Set source symbol (index): 1, \"s\"")
-CODE (L"Set insertion costs: \"t\", 1.3")
-CODE (L"Set deletion costs: \"s\", 1.7")
-CODE (L"Set substitution costs: \"t\", \"s\", 1.1")
-CODE (L"Set substitution costs: \"\", \"s\", 1.4")
-CODE (L"Set substitution costs: \"t\", \"\", 1.2")
-CODE (L"Set costs (others): 1.6, 1.8, 0, 1.5")
-NORMAL (L"In the first line we create the (empty) table, we name it %%editCosts% and it creates space for one target "
+CODE (U"   s         ")
+CODE (U"t 1.1 1.2 1.3")
+CODE (U"  1.4 1.5 1.6")
+CODE (U"  1.7 1.8 0.0")
+NORMAL (U"By issuing the following series of commands this particular table can be created:")
+CODE (U"Create empty EditCostsTable: \"editCosts\", 1, 1")
+CODE (U"Set target symbol (index): 1, \"t\"")
+CODE (U"Set source symbol (index): 1, \"s\"")
+CODE (U"Set insertion costs: \"t\", 1.3")
+CODE (U"Set deletion costs: \"s\", 1.7")
+CODE (U"Set substitution costs: \"t\", \"s\", 1.1")
+CODE (U"Set substitution costs: \"\", \"s\", 1.4")
+CODE (U"Set substitution costs: \"t\", \"\", 1.2")
+CODE (U"Set costs (others): 1.6, 1.8, 0, 1.5")
+NORMAL (U"In the first line we create the (empty) table, we name it %%editCosts% and it creates space for one target "
 	"and one source symbol. The next line defines the target symbol which becomes the label of the first row of the table. "
 	"Line 3 defines the source symbol which will become the label of the first column of the table. "
 	"We next define the insertion and deletion costs, they fill cells [1][3] and [3][1], respectively. "
@@ -2055,198 +2055,198 @@ NORMAL (L"In the first line we create the (empty) table, we name it %%editCosts%
 	"defines the costs when they do match. "
 	"Cell [3][2] defines the cost of the deletion of a source symbol unequal \"s\", while cell [2][3] defines the cost "
 	"for  the insertion of a target symbol unequal \"t\" in the source string. ")
-ENTRY (L"How to use a special EditCostsTable")
-NORMAL (L"After creating the special EditCostsTable you select it together with the EditDistanceTable and issue the command @@EditDistanceTable & EditCostsTable: Set new edit costs|Set new edit costs at . The EditDistanceTable will then find the minimum edit distance based on the new cost values.")
+ENTRY (U"How to use a special EditCostsTable")
+NORMAL (U"After creating the special EditCostsTable you select it together with the EditDistanceTable and issue the command @@EditDistanceTable & EditCostsTable: Set new edit costs|Set new edit costs at . The EditDistanceTable will then find the minimum edit distance based on the new cost values.")
 MAN_END
 
-MAN_BEGIN (L"EditDistanceTable", L"djmw", 20140509)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"An EditDistanceTable shows the accumulated distances between a target string and a source string. "
+MAN_BEGIN (U"EditDistanceTable", U"djmw", 20140509)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"An EditDistanceTable shows the accumulated distances between a target string and a source string. "
 	"For example, the accumulated distances between the target string \"intention\" and the source string "
 	"\"execution\" can be expressed by the following EditDistanceTable:")
-SCRIPT (5, 3.5, L"target = Create Strings as characters: \"intention\"\n"
+SCRIPT (5, 3.5, U"target = Create Strings as characters: \"intention\"\n"
 	"source = Create Strings as characters: \"execution\"\n"
 	"selectObject: source, target\n"
 	"edt = To EditDistanceTable\n"
 	"Draw: \"decimal\", 1, 0\n"
 	"removeObject: edt, target, source\n")
-NORMAL (L"This figure was created by issuing the following commands:")
-CODE (L"target = Create Strings as characters: \"intention\"")
-CODE (L"source = Create Strings as characters: \"execution\"")
-CODE (L"plusObject: target")
-CODE (L"edt = To EditDistanceTable")
-CODE (L"Draw: \"decimal\", 1, 0")
-NORMAL (L"The target string is always displayed vertically while the source string is displayed horizontally and the origin is at the bottom-left corner of the table. "
+NORMAL (U"This figure was created by issuing the following commands:")
+CODE (U"target = Create Strings as characters: \"intention\"")
+CODE (U"source = Create Strings as characters: \"execution\"")
+CODE (U"plusObject: target")
+CODE (U"edt = To EditDistanceTable")
+CODE (U"Draw: \"decimal\", 1, 0")
+NORMAL (U"The target string is always displayed vertically while the source string is displayed horizontally and the origin is at the bottom-left corner of the table. "
 	"Each cell of this table, dist[%i, %j], contains the accumulated distance between the first %i characters of the target and the first %j characters of the source. The cells on the path through this table which have the "
 	"minimum accumulated cost are shown with boxes around them. Below we will explain how this path is calculated.")
-NORMAL (L"The local directional steps in this path show which %%edit operations% we have to perform on the source string symbols to obtain the target string symbols. "
+NORMAL (U"The local directional steps in this path show which %%edit operations% we have to perform on the source string symbols to obtain the target string symbols. "
 	"Three edit operations exist: (1) %%insertion% of a target symbol in the source string. This happens each time we take a step in the vertical direction along the path. (2) %%deletion% of a symbol in the source string. This happens each time we take a step in horizontal direction along the path. (3) %%substitution% of a source symbol by a target symbol happens at each diagonal step along the path.")
-NORMAL (L"If we trace the path from its start at the origin to its end, we see that it first moves up, indicating the insertion of an \"i\" symbol in the source string. "
+NORMAL (U"If we trace the path from its start at the origin to its end, we see that it first moves up, indicating the insertion of an \"i\" symbol in the source string. "
 	"In the next step which is in the diagonal direction, the \"n\" target is substituted for the \"e\" source symbol. Next follows another substitution, \"t\" for \"x\". "
 	"The next diagonal step substitutes \"e\" for an identical \"e\". This step is followed by a horizontal step in which the source symbol \"c\" is deleted. "
 	"The next diagonal step substitutes an \"n\" for a \"u\". The path now continues in the diagonal direction until the end point and only identical substitutions occur in the last part. The following figure shows these operations more explicitly.")
-SCRIPT (4, 1.5,  L"target = Create Strings as characters: \"intention\"\n"
+SCRIPT (4, 1.5,  U"target = Create Strings as characters: \"intention\"\n"
 	"source = Create Strings as characters: \"execution\"\n"
 	"plusObject: target\n"
 	"edt = To EditDistanceTable\n"
 	"Draw edit operations\n"
 	"removeObject: edt, target, source\n")
-NORMAL (L"The value of the accumulated costs in a cell of the table is computed by taking the minimum of the accumulated distances from three possible paths that end in the current cell, i.e. the paths that come from the %%left%, from the %%diagonal% and from %%below%.")
-CODE (L"dist[i,j] = min (d__left_, d__diag_, d__below_), ")
-NORMAL (L"where ")
-CODE (L" d__left _ = dist[i-1,j]   + insertionCost(target[i])")
-CODE (L" d__diag _ = dist[i-1,j-1] + substitutionCost(source[j],target[i])")
-CODE (L" d__below_ = dist[i,j-1]   + deletionCost(source[j])")
-NORMAL (L"Since the calculation is recursive we start at the origin. After calculating the accumulative distances for each cell in the table as based on the algorithm above, the cell at the top-right position will contain the accumulated edit distance. "
+NORMAL (U"The value of the accumulated costs in a cell of the table is computed by taking the minimum of the accumulated distances from three possible paths that end in the current cell, i.e. the paths that come from the %%left%, from the %%diagonal% and from %%below%.")
+CODE (U"dist[i,j] = min (d__left_, d__diag_, d__below_), ")
+NORMAL (U"where ")
+CODE (U" d__left _ = dist[i-1,j]   + insertionCost(target[i])")
+CODE (U" d__diag _ = dist[i-1,j-1] + substitutionCost(source[j],target[i])")
+CODE (U" d__below_ = dist[i,j-1]   + deletionCost(source[j])")
+NORMAL (U"Since the calculation is recursive we start at the origin. After calculating the accumulative distances for each cell in the table as based on the algorithm above, the cell at the top-right position will contain the accumulated edit distance. "
 	"This distance happens to be 8 for the given example. The value 8 results from using the target-indepent value of 1.0 for the insertion cost, the source-independent value of 1.0 for the deletion costs and a constant value of 2.0 for the substitution costs. "
 	"If target and source symbol happen to be equal no costs are assigned, or, equivalently the substitution costs are zero if target and source symbol match. If you want more control over these costs you can create an @@EditCostsTable@ and specify your special costs and then @@EditDistanceTable & EditCostsTable: Set new edit costs|set the new edit costs at .")
-NORMAL (L"If during the calculations we also keep track of which of the three cells resulted in the local minimum accumulated distance, we can use this directional "
+NORMAL (U"If during the calculations we also keep track of which of the three cells resulted in the local minimum accumulated distance, we can use this directional "
 	"information to backtrack from the cell at the top-right position to the cell at the bottom-right position and obtain the minimum path.")
 MAN_END
 
-MAN_BEGIN (L"EditDistanceTable & EditCostsTable: Set new edit costs", L"djmw", 20120522)
-INTRO (L"A command available in the dynamic menu if an @@EditDistanceTable@ and an @@EditCostsTable@ are chosen together.")
-NORMAL (L"New accumulated cost values will be calculated and a new path based on these values will be calculated.")
+MAN_BEGIN (U"EditDistanceTable & EditCostsTable: Set new edit costs", U"djmw", 20120522)
+INTRO (U"A command available in the dynamic menu if an @@EditDistanceTable@ and an @@EditCostsTable@ are chosen together.")
+NORMAL (U"New accumulated cost values will be calculated and a new path based on these values will be calculated.")
 MAN_END
 
-MAN_BEGIN (L"Eigen", L"djmw", 19981102)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"An object of type Eigen represents the eigen structure of "
+MAN_BEGIN (U"Eigen", U"djmw", 19981102)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"An object of type Eigen represents the eigen structure of "
 	"a matrix whose eigenvalues and eigenvectors are real.")
-ENTRY (L"Inside an Eigen")
-NORMAL (L"With @Inspect you will see the following attributes:")
-TAG (L"%numberOfEigenvalues")
-DEFINITION (L"the number of eigenvalues and eigenvectors")
-TAG (L"%dimension")
-DEFINITION (L"the dimension of an eigenvector.")
-TAG (L"%eigenvalues[1..%numberOfEigenvalues]")
-DEFINITION (L"the real eigenvalues.")
-TAG (L"%eigenvectors[1..%numberOfEigenvalues][1..%dimension]")
-DEFINITION (L"the real eigenvectors, stored by row.")
-MAN_END
-
-MAN_BEGIN (L"Eigen: Draw eigenvalues...", L"djmw", 20040407)
-INTRO (L"A command to draw the eigenvalues of the selected @Eigen object(s).")
-ENTRY (L"Settings")
-TAG (L"##Fraction of eigenvalues summed")
-DEFINITION (L"defines whether or not fractions are plotted. Fractions %f__%i_ "
+ENTRY (U"Inside an Eigen")
+NORMAL (U"With @Inspect you will see the following attributes:")
+TAG (U"%numberOfEigenvalues")
+DEFINITION (U"the number of eigenvalues and eigenvectors")
+TAG (U"%dimension")
+DEFINITION (U"the dimension of an eigenvector.")
+TAG (U"%eigenvalues[1..%numberOfEigenvalues]")
+DEFINITION (U"the real eigenvalues.")
+TAG (U"%eigenvectors[1..%numberOfEigenvalues][1..%dimension]")
+DEFINITION (U"the real eigenvectors, stored by row.")
+MAN_END
+
+MAN_BEGIN (U"Eigen: Draw eigenvalues...", U"djmw", 20040407)
+INTRO (U"A command to draw the eigenvalues of the selected @Eigen object(s).")
+ENTRY (U"Settings")
+TAG (U"##Fraction of eigenvalues summed")
+DEFINITION (U"defines whether or not fractions are plotted. Fractions %f__%i_ "
 	"will be calculated for each number %e__%i_ by dividing this number by the sum of all "
 	"numbers %e__%j_: %f__%i_ = %e__%i_ / \\su__%j=1..%numberOfEigenvalues_ %e__%j_.")
-TAG (L"##Cumulative")
-DEFINITION (L"defines whether or not cumulative values are plotted. Cumulative "
+TAG (U"##Cumulative")
+DEFINITION (U"defines whether or not cumulative values are plotted. Cumulative "
 	"values %c__%i_ will be calculated for each number %e__%i_ by summing the first %i "
 	"numbers %e__%j_: %c__%i_ = \\su__%j=1..%i_ %e__%j_).")
-NORMAL (L"A @@Scree plot|scree@ plot can be obtained if both %%Fraction of eigenvalues summed% "
+NORMAL (U"A @@Scree plot|scree@ plot can be obtained if both %%Fraction of eigenvalues summed% "
 	"and %%Cumulative% are unchecked.")
 MAN_END
 
-MAN_BEGIN (L"Eigen: Draw eigenvector...", L"djmw", 20040407)
-INTRO (L"A command to draw an eigenvector from the selected @Eigen.")
-ENTRY (L"Settings")
-TAG (L"##Eigenvector number")
-DEFINITION (L"determines the eigenvector to be drawn.")
-TAG (L"%Component %loadings")
-DEFINITION (L"when on, the eigenvector is multiplied with the square root of the corresponding "
+MAN_BEGIN (U"Eigen: Draw eigenvector...", U"djmw", 20040407)
+INTRO (U"A command to draw an eigenvector from the selected @Eigen.")
+ENTRY (U"Settings")
+TAG (U"##Eigenvector number")
+DEFINITION (U"determines the eigenvector to be drawn.")
+TAG (U"%Component %loadings")
+DEFINITION (U"when on, the eigenvector is multiplied with the square root of the corresponding "
 	"eigenvalue. (For @@PCA at -analysis this means that you will draw the so called "
 	"%%component loading vector%. You will be able to compare "
 	"quantitatively the elements in different component loading vectors because "
 	"the %i-th element in the %j-th component loading vector gives the covariance between the %i-th "
 	"original variable and the %j-th principal component.)")
-TAG (L"##Element rang%")
-DEFINITION (L"determine the first and last element of the vector that must be drawn.")
-TAG (L"##Minimum# and ##Maximum#")
-DEFINITION (L"determine the lower and upper bounds of the plot (choosing #Maximum smaller than #Minimum "
+TAG (U"##Element rang%")
+DEFINITION (U"determine the first and last element of the vector that must be drawn.")
+TAG (U"##Minimum# and ##Maximum#")
+DEFINITION (U"determine the lower and upper bounds of the plot (choosing #Maximum smaller than #Minimum "
 	"will draw the %%inverted% eigenvector). ")
-TAG (L"##Mark size#, ##Mark string#")
-DEFINITION (L"determine size and type of the marks that will be drawn.")
-TAG (L"##Garnish")
-DEFINITION (L"determines whether a bounding box and margins will be drawn.")
+TAG (U"##Mark size#, ##Mark string#")
+DEFINITION (U"determine size and type of the marks that will be drawn.")
+TAG (U"##Garnish")
+DEFINITION (U"determines whether a bounding box and margins will be drawn.")
 MAN_END
 
-MAN_BEGIN (L"Eigen: Get contribution of component...", L"djmw", 19981109)
-INTRO (L"A command to ask the selected @Eigen for the contribution of the %j^^th^ "
+MAN_BEGIN (U"Eigen: Get contribution of component...", U"djmw", 19981109)
+INTRO (U"A command to ask the selected @Eigen for the contribution of the %j^^th^ "
 	"eigenvalue to the total sum of eigenvalues.")
-ENTRY (L"Details")
-NORMAL (L"The contribution is defined as:")
-FORMULA (L"%%eigenvalue[j]% / \\Si__%i=1..%numberOfEigenvalues_ %%eigenvalue[i]%")
+ENTRY (U"Details")
+NORMAL (U"The contribution is defined as:")
+FORMULA (U"%%eigenvalue[j]% / \\Si__%i=1..%numberOfEigenvalues_ %%eigenvalue[i]%")
 MAN_END
 
-MAN_BEGIN (L"Eigen: Get cumulative contribution of components...", L"djmw", 19981109)
-INTRO (L"A command to ask the selected @Eigen for the contribution of the sum of the "
+MAN_BEGIN (U"Eigen: Get cumulative contribution of components...", U"djmw", 19981109)
+INTRO (U"A command to ask the selected @Eigen for the contribution of the sum of the "
 	"eigenvalues[%from..%to] to the total sum of eigenvalues.")
-ENTRY (L"Details")
-NORMAL (L"The contribution is defined as:")
-FORMULA (L"\\Si__%i=%from..%to_ %%eigenvalue[i]% / \\Si__%i=1..%numberOfEigenvalues_ %%eigenvalue[i]%")
+ENTRY (U"Details")
+NORMAL (U"The contribution is defined as:")
+FORMULA (U"\\Si__%i=%from..%to_ %%eigenvalue[i]% / \\Si__%i=1..%numberOfEigenvalues_ %%eigenvalue[i]%")
 MAN_END
 
-MAN_BEGIN (L"Eigen: Get eigenvalue...", L"djmw", 20040225)
-INTRO (L"A command to query the selected @Eigen for the %i^^th^ "
+MAN_BEGIN (U"Eigen: Get eigenvalue...", U"djmw", 20040225)
+INTRO (U"A command to query the selected @Eigen for the %i^^th^ "
 	"eigenvalue.")
 MAN_END
 
-MAN_BEGIN (L"Eigen: Get eigenvector element...", L"djmw", 20040225)
-INTRO (L"A command to query the selected @Eigen for the %j^^th^ element of the "
+MAN_BEGIN (U"Eigen: Get eigenvector element...", U"djmw", 20040225)
+INTRO (U"A command to query the selected @Eigen for the %j^^th^ element of the "
 	"%i^^th^ eigenvector.")
 MAN_END
 
-MAN_BEGIN (L"Eigen & Matrix: Project...", L"djmw", 20040407)
-INTRO (L"A command to project the columns of the @Matrix object onto the "
+MAN_BEGIN (U"Eigen & Matrix: Project...", U"djmw", 20040407)
+INTRO (U"A command to project the columns of the @Matrix object onto the "
 	"eigenspace of the @Eigen object.")
-ENTRY (L"Setting")
-TAG (L"##Number of dimensions")
-DEFINITION (L"defines the dimension, i.e., the number of rows, of the "
+ENTRY (U"Setting")
+TAG (U"##Number of dimensions")
+DEFINITION (U"defines the dimension, i.e., the number of rows, of the "
 	"resulting object.")
-ENTRY (L"Algorithm")
-NORMAL (L"Project each column of the Matrix on the coordinate "
+ENTRY (U"Algorithm")
+NORMAL (U"Project each column of the Matrix on the coordinate "
 	"system given by the eigenvectors of the Eigen object. This can be done "
 	"as follows:")
-FORMULA (L"%y__%ji_ = \\Si__%k=1..%numberOfColums_ %e__jk_ %x__%ki_, where")
-NORMAL (L"%y__%ji_ is the %j-th element of the %i-th column of the resulting "
+FORMULA (U"%y__%ji_ = \\Si__%k=1..%numberOfColums_ %e__jk_ %x__%ki_, where")
+NORMAL (U"%y__%ji_ is the %j-th element of the %i-th column of the resulting "
 	"(matrix) object, %e__%jk_ is the %k-th element of the %j-th eigenvector "
 	"and, %x__%ki_ is the %k-th element of the %i-th column of the selected "
 	"matrix object.")
 MAN_END
 
-MAN_BEGIN (L"Eigen & SSCP: Project", L"djmw", 20020328)
-INTRO (L"A command to project the @SSCP object onto the eigenspace of "
+MAN_BEGIN (U"Eigen & SSCP: Project", U"djmw", 20020328)
+INTRO (U"A command to project the @SSCP object onto the eigenspace of "
 	"the @Eigen object.")
-ENTRY (L"Behaviour")
-NORMAL (L"Transform the SSCP object as if it was calculated in a coordinate "
+ENTRY (U"Behaviour")
+NORMAL (U"Transform the SSCP object as if it was calculated in a coordinate "
 	"system given by the eigenvectors of the Eigen object. This can be done "
 	"as follows:")
-FORMULA (L"#%S__%t_ = #%E\\'p #%S #%E, where")
-NORMAL (L"where #%E\\'p is the transpose of the matrix with eigenvectors #%E, "
+FORMULA (U"#%S__%t_ = #%E\\'p #%S #%E, where")
+NORMAL (U"where #%E\\'p is the transpose of the matrix with eigenvectors #%E, "
 	"#%S is the square matrix with sums of squares and crossproducts, and "
 	"#%S__%t_ the newly created square matrix. The dimension of #%S__%t_ may "
 	"be smaller than the dimension of #%S.")
 MAN_END
 
-MAN_BEGIN (L"Eigen & TableOfReal: Project...", L"djmw", 20040407)
-INTRO (L"A command to project the rows of the @TableOfReal object onto the "
+MAN_BEGIN (U"Eigen & TableOfReal: Project...", U"djmw", 20040407)
+INTRO (U"A command to project the rows of the @TableOfReal object onto the "
 	"eigenspace of the @Eigen object.")
-ENTRY (L"Setting")
-TAG (L"##Number of dimensions")
-DEFINITION (L"defines the number of dimensions, i.e., the number of columns, of the "
+ENTRY (U"Setting")
+TAG (U"##Number of dimensions")
+DEFINITION (U"defines the number of dimensions, i.e., the number of columns, of the "
 	"resulting object.")
-ENTRY (L"Algorithm")
-NORMAL (L"Project each row of the TableOfReal on the coordinate "
+ENTRY (U"Algorithm")
+NORMAL (U"Project each row of the TableOfReal on the coordinate "
 	"system given by the eigenvectors of the Eigen object. This can be done "
 	"as follows:")
-FORMULA (L"%y__%ij_ = \\Si__%k=1..%numberOfColums_ %e__jk_ %x__%ik_, where")
-NORMAL (L"%e__%jk_ is the %k-th element of the %j-th eigenvector, %x__%ik_ is "
+FORMULA (U"%y__%ij_ = \\Si__%k=1..%numberOfColums_ %e__jk_ %x__%ik_, where")
+NORMAL (U"%e__%jk_ is the %k-th element of the %j-th eigenvector, %x__%ik_ is "
 	"the %k-th element of the %i-th row and %y__%ij_ is the %j-th element at "
 	"the %i-th row of the matrix part of the resulting object.")
 MAN_END
 
-MAN_BEGIN (L"equivalent rectangular bandwidth", L"djmw", 19980713)
-INTRO (L"The %%equivalent rectangular bandwidth% (ERB) of a filter is defined "
+MAN_BEGIN (U"equivalent rectangular bandwidth", U"djmw", 19980713)
+INTRO (U"The %%equivalent rectangular bandwidth% (ERB) of a filter is defined "
 	"as the width of a rectangular filter whose height equals the peak gain of "
 	"the filter and which passes the same total power as the filter (given a flat "
 	"spectrum input such as white noise or an impulse).")
 MAN_END
 
-MAN_BEGIN (L"Excitations", L"djmw", 19960918)
-INTRO (L"A collection of objects of type @Excitation. "
+MAN_BEGIN (U"Excitations", U"djmw", 19960918)
+INTRO (U"A collection of objects of type @Excitation. "
 	"You can create an #Excitations by selecting one or more #Excitation's and "
 	"selecting ##To Excitations#. You can add one or more #Excitation's to an "
 	"#Excitations by selecting one #Excitations and one or more "
@@ -2254,61 +2254,61 @@ INTRO (L"A collection of objects of type @Excitation. "
 	"be removed from the list of objects).")
 MAN_END
 
-MAN_BEGIN (L"Excitations: Append", L"djmw", 19960918)
-INTRO (L"You can choose this command after selecting two objects of type @Excitations. ")
-NORMAL (L"A new object is created that contains the second object appended after the first.")
+MAN_BEGIN (U"Excitations: Append", U"djmw", 19960918)
+INTRO (U"You can choose this command after selecting two objects of type @Excitations. ")
+NORMAL (U"A new object is created that contains the second object appended after the first.")
 MAN_END
 
-MAN_BEGIN (L"Excitations: To Pattern...", L"djmw", 19960918)
-INTRO (L"A command to convert every selected @Excitations to a @Pattern object.")
-ENTRY (L"Setting")
-TAG (L"##Join")
-DEFINITION (L"the number of subsequent @Excitation objects to combine into one row of @Pattern. "
+MAN_BEGIN (U"Excitations: To Pattern...", U"djmw", 19960918)
+INTRO (U"A command to convert every selected @Excitations to a @Pattern object.")
+ENTRY (U"Setting")
+TAG (U"##Join")
+DEFINITION (U"the number of subsequent @Excitation objects to combine into one row of @Pattern. "
 	"E.g. if an #Excitation has length 26 and %join = 2 then each row of #Pattern "
 	"contains 52 elements. The number of rows in #Pattern will be %%my size% / 2. "
 	"In the conversion process the elements of an #Excitation will be divided by 100.0 in order "
 	"to guarantee that all patterns have values between 0 and 1.")
 MAN_END
 
-MAN_BEGIN (L"FilterBank: Draw filter functions...", L"djmw", 20030901)
-INTRO (L"")
+MAN_BEGIN (U"FilterBank: Draw filter functions...", U"djmw", 20030901)
+INTRO (U"")
 MAN_END
 
-MAN_BEGIN (L"FilterBank: Draw frequency scales...", L"djmw", 20030901)
+MAN_BEGIN (U"FilterBank: Draw frequency scales...", U"djmw", 20030901)
 MAN_END
 
-MAN_BEGIN (L"FilterBank: Get frequency in Hertz...", L"djmw", 20030901)
-INTRO (L"A @query to the selected FilterBank object.")
-ENTRY (L"Return value")
-NORMAL (L"a frequency value in Hertz.")
+MAN_BEGIN (U"FilterBank: Get frequency in Hertz...", U"djmw", 20030901)
+INTRO (U"A @query to the selected FilterBank object.")
+ENTRY (U"Return value")
+NORMAL (U"a frequency value in Hertz.")
 MAN_END
 
-MAN_BEGIN (L"FilterBank: Get frequency in Bark...", L"djmw", 20030901)
+MAN_BEGIN (U"FilterBank: Get frequency in Bark...", U"djmw", 20030901)
 MAN_END
 
-MAN_BEGIN (L"FilterBank: Get frequency in mel...", L"djmw", 20030901)
+MAN_BEGIN (U"FilterBank: Get frequency in mel...", U"djmw", 20030901)
 MAN_END
 
-MAN_BEGIN (L"FormantFilter", L"djmw", 20141022)
-INTRO (L"A #deprecated @@types of objects|type of object@ in P\\s{RAAT}. It is replaced by @@Spectrogram at .")
-NORMAL (L"An object of type FormantFilter represents an acoustic time-frequency "
+MAN_BEGIN (U"FormantFilter", U"djmw", 20141022)
+INTRO (U"A #deprecated @@types of objects|type of object@ in P\\s{RAAT}. It is replaced by @@Spectrogram at .")
+NORMAL (U"An object of type FormantFilter represents an acoustic time-frequency "
 	"representation of a sound: the power spectral density %P(%f, %t), expressed "
 	"in dB as 10*log10(power/4e-10)). In the now preferred Spectrogram the power is represented instead of its dB value. "
 	"It is sampled into a number of points around equally spaced times %t__%i_ "
 	"and frequencies %f__%j_ (on a linear frequency scale).")
-ENTRY (L"Inside a FormantFilter")
-NORMAL (L"With @Inspect you will see that this type contains the same "
+ENTRY (U"Inside a FormantFilter")
+NORMAL (U"With @Inspect you will see that this type contains the same "
 	"attributes a @Matrix.")
 MAN_END
 
-MAN_BEGIN (L"gammatone", L"djmw", 20100517)
-INTRO (L"A gammatone is the product of a rising polynomial, a decaying exponential function, and a "
+MAN_BEGIN (U"gammatone", U"djmw", 20100517)
+INTRO (U"A gammatone is the product of a rising polynomial, a decaying exponential function, and a "
 	"cosine wave.")
-NORMAL (L"It can be described with the following formula:")
-FORMULA (L"gammaTone (%t) = %a %t^^%\\ga\\--1^ e^^\\--2%\\pi\\.c%bandwidth\\.c%t^ "
+NORMAL (U"It can be described with the following formula:")
+FORMULA (U"gammaTone (%t) = %a %t^^%\\ga\\--1^ e^^\\--2%\\pi\\.c%bandwidth\\.c%t^ "
 	"cos (2%%\\pi\\.cfrequency\\.ct% + %initialPhase),")
-NORMAL (L"where %\\ga determines the order of the gammatone.")
-NORMAL (L"The gammatone function has a monotone carrier (the tone) with an "
+NORMAL (U"where %\\ga determines the order of the gammatone.")
+NORMAL (U"The gammatone function has a monotone carrier (the tone) with an "
 	"envelope that is a gamma distribution function. The amplitude spectrum is essentially "
 	"symmetric on a linear frequency scale. This function is used in some time-domain "
 	"auditory models to simulate the spectral analysis performed by the basilar membrane. "
@@ -2316,417 +2316,417 @@ NORMAL (L"The gammatone function has a monotone carrier (the tone) with an "
 	"already used it to model basilar membrane motion.")
 MAN_END
 
-MAN_BEGIN (L"generalized singular value decomposition", L"djmw", 19981007)
-INTRO (L"For %m > %n, the %%generalized singular value decomposition% (gsvd) of an %m \\xx %n matrix #%A and "
+MAN_BEGIN (U"generalized singular value decomposition", U"djmw", 19981007)
+INTRO (U"For %m > %n, the %%generalized singular value decomposition% (gsvd) of an %m \\xx %n matrix #%A and "
 	"a %p \\xx %n matrix #%B is given by the pair of factorizations")
-FORMULA (L"#%A = #%U #%\\Si__1_ [#%0, #%R] #%Q\\'p and #%B = #%V #%\\Si__2_ [#%0, #%R] #%Q\\'p")
-NORMAL (L"The matrices in these factorizations have the following properties:")
-TAG (L"\\bu #%U [%m \\xx %m], #%V [%p \\xx %p] and #%Q [%n \\xx %n]")
-DEFINITION (L" are orthogonal matrices. In the reconstruction formula's above we maximally need "
+FORMULA (U"#%A = #%U #%\\Si__1_ [#%0, #%R] #%Q\\'p and #%B = #%V #%\\Si__2_ [#%0, #%R] #%Q\\'p")
+NORMAL (U"The matrices in these factorizations have the following properties:")
+TAG (U"\\bu #%U [%m \\xx %m], #%V [%p \\xx %p] and #%Q [%n \\xx %n]")
+DEFINITION (U" are orthogonal matrices. In the reconstruction formula's above we maximally need "
 	"only the first %n columns of matrices #%U and #%V (when %m and/or %p are greater than %n).")
-TAG (L"\\bu #%R [%r \\xx %r],")
-DEFINITION (L"is an upper triangular nonsingular matrix. %r is the rank of [#%A\\'p, #%B\\'p]\\'p "
+TAG (U"\\bu #%R [%r \\xx %r],")
+DEFINITION (U"is an upper triangular nonsingular matrix. %r is the rank of [#%A\\'p, #%B\\'p]\\'p "
 	"and %r \\<_ %n. The matrix [#%0, #%R] is %r \\xx %n and its first %n \\xx (%n \\-- %r) part "
 	"is a zero matrix.")
-TAG (L"\\bu #%\\Si__1_ [%m \\xx %r] and #%\\Si__2_ [%p \\xx %r]")
-DEFINITION (L"are real, nonnegative and \"diagonal\".")
-NORMAL (L"In practice, the matrices #%\\Si__1_ and #%\\Si__2_ are never used. Instead a shorter "
+TAG (U"\\bu #%\\Si__1_ [%m \\xx %r] and #%\\Si__2_ [%p \\xx %r]")
+DEFINITION (U"are real, nonnegative and \"diagonal\".")
+NORMAL (U"In practice, the matrices #%\\Si__1_ and #%\\Si__2_ are never used. Instead a shorter "
 	"representation with numbers %\\al__%i_ and %\\be__%i_ is used. These numbers obey "
 	"0 \\<_ \\al__%i_ \\<_ 1 and \\al__%i_^^2^ + \\be__%i_^^2^ = 1. The following relations exist:")
-FORMULA (L"#%\\Si__1_\\'p #%\\Si__1_ + #%\\Si__2_\\'p #%\\Si__2_ = #%I, ")
-FORMULA (L"#%\\Si__1_\\'p #%\\Si__1_ = #diag (%\\al__1_^^2^, ..., %\\al__%r_^^2^), and, ")
-FORMULA (L"#%\\Si__2_\\'p #%\\Si__2_ = #diag (%\\be__1_^^2^, ..., %\\be__%r_^^2^).")
-NORMAL (L"The ratios \\al__%i_ / \\be__%i_ are called the %%generalized singular values% of the "
+FORMULA (U"#%\\Si__1_\\'p #%\\Si__1_ + #%\\Si__2_\\'p #%\\Si__2_ = #%I, ")
+FORMULA (U"#%\\Si__1_\\'p #%\\Si__1_ = #diag (%\\al__1_^^2^, ..., %\\al__%r_^^2^), and, ")
+FORMULA (U"#%\\Si__2_\\'p #%\\Si__2_ = #diag (%\\be__1_^^2^, ..., %\\be__%r_^^2^).")
+NORMAL (U"The ratios \\al__%i_ / \\be__%i_ are called the %%generalized singular values% of the "
 	"pair #%A, #%B. Let %l be the rank of #%B and %k + %l (= %r) the rank of [#%A\\'p, #%B\\'p]\\'p. "
 	"Then the first %k generalized singular values are infinite and the remaining %l are finite. "
 	"(When %#B is of full rank then, of course, %k = 0).")
-ENTRY (L"Special cases")
-NORMAL (L"\\bu If #%B is a square nonsingular matrix, the gsvd of #%A and #%B is equivalent to the "
+ENTRY (U"Special cases")
+NORMAL (U"\\bu If #%B is a square nonsingular matrix, the gsvd of #%A and #%B is equivalent to the "
 	"singular value decomposition of #%A #%B^^\\--1^.")
-NORMAL (L"\\bu The generalized eigenvalues and eigenvectors of #%A\\'p #%A - %\\la  #%B\\'p #%B "
+NORMAL (U"\\bu The generalized eigenvalues and eigenvectors of #%A\\'p #%A - %\\la  #%B\\'p #%B "
 	"can be expressed in terms of the gsvd. The columns of the matrix #%X, constructed as")
-CODE (L"X = Q*( I   0    )")
-CODE (L"      ( 0 inv(R) ),")
-NORMAL (L"form the eigenvectors. The important eigenvectors, of course, correspond "
+CODE (U"X = Q*( I   0    )")
+CODE (U"      ( 0 inv(R) ),")
+NORMAL (U"form the eigenvectors. The important eigenvectors, of course, correspond "
 	"to the positions where the %l eigenvalues are not infinite.")
 MAN_END
 
-MAN_BEGIN (L"invFisherQ", L"djmw", 20000525)
-INTRO (L"$$invFisherQ$ (%q, %df1, %df2) returns the value %f for which "
+MAN_BEGIN (U"invFisherQ", U"djmw", 20000525)
+INTRO (U"$$invFisherQ$ (%q, %df1, %df2) returns the value %f for which "
 	"$$@fisherQ (%f, %df1, %df2) = %q.")
 MAN_END
 
-MAN_BEGIN (L"fisherQ", L"djmw", 20000525)
-INTRO (L"$$fisherQ$ (%f, %df1, %df2) returns the area under Fisher's F-distribution "
+MAN_BEGIN (U"fisherQ", U"djmw", 20000525)
+INTRO (U"$$fisherQ$ (%f, %df1, %df2) returns the area under Fisher's F-distribution "
 	"from %f to +\\oo.")
 MAN_END
 
-MAN_BEGIN (L"ISpline", L"djmw", 19990627)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}. ")
-NORMAL (L"An object of type ISpline represents a linear combination of basis "
+MAN_BEGIN (U"ISpline", U"djmw", 19990627)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}. ")
+NORMAL (U"An object of type ISpline represents a linear combination of basis "
 	"i at spline functions. Each basis %ispline is a monotonically increasing "
 	"polynomial function of degree %p.")
-FORMULA (L"ISpline (%x) = \\Si__%k=1..%numberOfCoefficients_ %c__%k_ %ispline__%k_(%x)")
+FORMULA (U"ISpline (%x) = \\Si__%k=1..%numberOfCoefficients_ %c__%k_ %ispline__%k_(%x)")
 MAN_END
 
-MAN_BEGIN (L"jackknife", L"djmw", 20141101)
-INTRO (L"A technique for estimating the bias and standard deviation of an estimate.")
-NORMAL (L"Suppose we have a sample #%x = (%x__1_, %x__2_,...%x__n_) and wish to estimate "
+MAN_BEGIN (U"jackknife", U"djmw", 20141101)
+INTRO (U"A technique for estimating the bias and standard deviation of an estimate.")
+NORMAL (U"Suppose we have a sample #%x = (%x__1_, %x__2_,...%x__n_) and wish to estimate "
 	"the bias and standard error of an estimator \\Te. The jackknife "
 	"focuses on the samples that leave out one observation at a time: "
 	"the %i-th jackknife sample consists of the data with the %i-th observation "
 	"removed.")
 MAN_END
 
-MAN_BEGIN (L"Kirshenbaum phonetic encoding", L"djmw", 20120413)
-INTRO (L"The Kirshenbaum phonetic encoding represents International Phonetic Alphabet symbols using ascii characters. See: http://www.kirshenbaum.net/IPA/ascii-ipa.pdf. The @@espeak@ speech synthesizer on which our synthesizer is based accepts this encoding as text input. ")
+MAN_BEGIN (U"Kirshenbaum phonetic encoding", U"djmw", 20120413)
+INTRO (U"The Kirshenbaum phonetic encoding represents International Phonetic Alphabet symbols using ascii characters. See: http://www.kirshenbaum.net/IPA/ascii-ipa.pdf. The @@espeak@ speech synthesizer on which our synthesizer is based accepts this encoding as text input. ")
 MAN_END
 
-MAN_BEGIN (L"Legendre polynomials", L"djmw", 19990620)
-INTRO (L"The Legendre polynomials %P__%n_(%x) of degree %n are special "
+MAN_BEGIN (U"Legendre polynomials", U"djmw", 19990620)
+INTRO (U"The Legendre polynomials %P__%n_(%x) of degree %n are special "
 	"orthogonal polynomial functions defined on the domain [-1, 1].")
-NORMAL (L"Orthogonality:")
-FORMULA (L"__-1_\\in^^1^ %W(%x) %P__%i_(%x) %P__%j_(%x) %dx = \\de__%ij_")
-FORMULA (L"%W(%x) = 1    (-1 < x < 1)")
-NORMAL (L"They obey certain recurrence relations:")
-FORMULA (L"%n %P__%n_(%x) = (2%n \\-- 1) %x %P__%n-1_(%x) \\-- (%n \\-- 1) %P__%n-2_(%x)")
-FORMULA (L"%P__0_(%x) = 1")
-FORMULA (L"%P__1_(%x) = %x")
-NORMAL (L"We may %change the domain of these polynomials to [%xmin, %xmax] by "
+NORMAL (U"Orthogonality:")
+FORMULA (U"__-1_\\in^^1^ %W(%x) %P__%i_(%x) %P__%j_(%x) %dx = \\de__%ij_")
+FORMULA (U"%W(%x) = 1    (-1 < x < 1)")
+NORMAL (U"They obey certain recurrence relations:")
+FORMULA (U"%n %P__%n_(%x) = (2%n \\-- 1) %x %P__%n-1_(%x) \\-- (%n \\-- 1) %P__%n-2_(%x)")
+FORMULA (U"%P__0_(%x) = 1")
+FORMULA (U"%P__1_(%x) = %x")
+NORMAL (U"We may %change the domain of these polynomials to [%xmin, %xmax] by "
 	"using the following transformation:")
-FORMULA (L"%x\\'p = (2%x \\-- (%xmax + %xmin)) / (%xmax - %xmin).")
-NORMAL (L"We subsequently use %P__%k_(%x\\'p) instead of %P__%k_(%x).")
+FORMULA (U"%x\\'p = (2%x \\-- (%xmax + %xmin)) / (%xmax - %xmin).")
+NORMAL (U"We subsequently use %P__%k_(%x\\'p) instead of %P__%k_(%x).")
 MAN_END
 
-MAN_BEGIN (L"LegendreSeries", L"djmw", 19990620)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type LegendreSeries represents a linear combination of @@Legendre polynomials@ "
+MAN_BEGIN (U"LegendreSeries", U"djmw", 19990620)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type LegendreSeries represents a linear combination of @@Legendre polynomials@ "
 	"%P__%k_(%x).")
-FORMULA (L"LegendreSeries (%x) = \\Si__%k=1..%numberOfCoefficients_ %c__%k_ %P__%k_(%x)")
+FORMULA (U"LegendreSeries (%x) = \\Si__%k=1..%numberOfCoefficients_ %c__%k_ %P__%k_(%x)")
 MAN_END
 
-MAN_BEGIN (L"LegendreSeries: To Polynomial", L"djmw", 19990620)
-INTRO (L"A command to transform the selected @LegendreSeries object into a @@Polynomial@ object.")
-NORMAL (L"We find polynomial coefficients %c__%k_ such that")
-FORMULA (L"\\Si__%k=1..%numberOfCoefficients_ %c__%k_ %x^^%k^ = "
+MAN_BEGIN (U"LegendreSeries: To Polynomial", U"djmw", 19990620)
+INTRO (U"A command to transform the selected @LegendreSeries object into a @@Polynomial@ object.")
+NORMAL (U"We find polynomial coefficients %c__%k_ such that")
+FORMULA (U"\\Si__%k=1..%numberOfCoefficients_ %c__%k_ %x^^%k^ = "
 	"\\Si__%k=1..%numberOfCoefficients_ %l__%k_ %P__%k_(%x)")
-NORMAL (L"We use the recurrence relation for @@Legendre polynomials@ to calculate these coefficients.")
+NORMAL (U"We use the recurrence relation for @@Legendre polynomials@ to calculate these coefficients.")
 MAN_END
 
-MAN_BEGIN (L"Matrix: Draw distribution...", L"djmw", 20041110)
-INTRO (L"A command to draw the distribution histogram of the values in the selected part of a @Matrix.")
-ENTRY (L"Settings")
-TAG (L"##Horizontal range#, ##Vertical range#")
-DEFINITION (L"determine the part of the matrix whose distribution will be drawn.")
-TAG (L"##Minimum value#, ##Maximum value#")
-DEFINITION (L"determine the range of values that will be considered in the distribution. "
+MAN_BEGIN (U"Matrix: Draw distribution...", U"djmw", 20041110)
+INTRO (U"A command to draw the distribution histogram of the values in the selected part of a @Matrix.")
+ENTRY (U"Settings")
+TAG (U"##Horizontal range#, ##Vertical range#")
+DEFINITION (U"determine the part of the matrix whose distribution will be drawn.")
+TAG (U"##Minimum value#, ##Maximum value#")
+DEFINITION (U"determine the range of values that will be considered in the distribution. "
 	"To treat all bin widths equally, the range will include the %%Minimum value% and exclude the "
 	"%%Maximum value% (see below).")
-TAG (L"##Number of bins")
-DEFINITION (L"determines the number of bars in the distribution histogram.")
-TAG (L"##Minimum frequency#, ##Maximum frequency#")
-DEFINITION (L"determine the limits of the vertical axis.")
-ENTRY (L"Algorithm")
-NORMAL (L"For a particular matrix element %z, the histogram bin number %%i% that will be incremented obeys the following relation:")
-FORMULA (L"%%lowerBinBorder%__%i_ \\<_ %z <  %%lowerBinBorder%__%i_+ %%binWidth%,")
-NORMAL (L"where")
-FORMULA (L"%%binWidth% = (%%maximumValue% - %%minimumValue%)/%%numberOfBins%,")
-NORMAL (L"and")
-FORMULA (L"%%lowerBinBorder%__%i_ = %%minimumValue% + (%i - 1)\\.c%%binWidth%.")
-NORMAL (L"In this way all bins will be based on exactly the same width, as each binning interval includes its lower border "
+TAG (U"##Number of bins")
+DEFINITION (U"determines the number of bars in the distribution histogram.")
+TAG (U"##Minimum frequency#, ##Maximum frequency#")
+DEFINITION (U"determine the limits of the vertical axis.")
+ENTRY (U"Algorithm")
+NORMAL (U"For a particular matrix element %z, the histogram bin number %%i% that will be incremented obeys the following relation:")
+FORMULA (U"%%lowerBinBorder%__%i_ \\<_ %z <  %%lowerBinBorder%__%i_+ %%binWidth%,")
+NORMAL (U"where")
+FORMULA (U"%%binWidth% = (%%maximumValue% - %%minimumValue%)/%%numberOfBins%,")
+NORMAL (U"and")
+FORMULA (U"%%lowerBinBorder%__%i_ = %%minimumValue% + (%i - 1)\\.c%%binWidth%.")
+NORMAL (U"In this way all bins will be based on exactly the same width, as each binning interval includes its lower border "
 	"and excludes its upper border "
 	"(i.e., each interval is closed to the left and open to the right). ")
 MAN_END
 
-MAN_BEGIN (L"Matrix: Solve equation...", L"djmw", 19961006)
-INTRO (L"Solve the general matrix equation #A #x = #b for #x.")
-NORMAL (L"The matrix #A can be any general %m \\xx %n matrix, #b is a %m-dimensional "
+MAN_BEGIN (U"Matrix: Solve equation...", U"djmw", 19961006)
+INTRO (U"Solve the general matrix equation #A #x = #b for #x.")
+NORMAL (U"The matrix #A can be any general %m \\xx %n matrix, #b is a %m-dimensional "
 	"and #x a %n-dimensional vector. The @Matrix contains #A as its first %n columns "
 	"and #b as its last column. The %n-dimensional solution is returned as a #Matrix "
 	"with %n columns.")
-NORMAL (L"When the number of equations (%m) is %greater than the number of unknowns (%n) the "
+NORMAL (U"When the number of equations (%m) is %greater than the number of unknowns (%n) the "
 	"algorithm gives the best least-squares solution. If on the contrary you "
 	"have %fewer equations than unknowns the solution will not be unique.")
-ENTRY (L"Method")
-NORMAL (L"Singular value decomposition with backsubstitution. "
+ENTRY (U"Method")
+NORMAL (U"Singular value decomposition with backsubstitution. "
 	"Zero will be substituted for eigenvalues smaller than %tolerance \\.c "
 	"%%maximum_eigenvalue% (when the user-supplied %tolerance equals 0.0 a "
 	"value of 2.2 \\.c 10^^-16^ \\.c %%number_of_unknowns% "
 	"will be used as %tolerance).")
-NORMAL (L"See for more details: @@Golub & van Loan (1996)@ chapters 2 and 3.")
+NORMAL (U"See for more details: @@Golub & van Loan (1996)@ chapters 2 and 3.")
 MAN_END
 
-MAN_BEGIN (L"MelFilter", L"djmw", 20141022)
-INTRO (L"A #deprecated @@types of objects|type of object@ in P\\s{RAAT}. It is replaced by the @@MelSpectrogram at .")
-NORMAL (L"An object of type MelFilter represents an acoustic time-frequency "
+MAN_BEGIN (U"MelFilter", U"djmw", 20141022)
+INTRO (U"A #deprecated @@types of objects|type of object@ in P\\s{RAAT}. It is replaced by the @@MelSpectrogram at .")
+NORMAL (U"An object of type MelFilter represents an acoustic time-frequency "
 	"representation of a sound: the power spectral density %P(%f, %t), "
 	"expressed in dB's. "
 	"It is sampled into a number of points around equally spaced times %t__%i_ "
 	"and frequencies %f__%j_ (on a Mel frequency scale).")
-NORMAL (L"The frequency in mels is:")
-FORMULA (L"mels = 2595 * log10 (1 + hertz / 700),")
-NORMAL (L"and its inverse is:")
-FORMULA (L"hertz = 700 * (10.0^^mel / 2595.0^ - 1).")
+NORMAL (U"The frequency in mels is:")
+FORMULA (U"mels = 2595 * log10 (1 + hertz / 700),")
+NORMAL (U"and its inverse is:")
+FORMULA (U"hertz = 700 * (10.0^^mel / 2595.0^ - 1).")
 MAN_END
 
-MAN_BEGIN (L"MelSpectrogram", L"djmw", 20141022)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type MelSpectrogram represents an acoustic time-frequency "
+MAN_BEGIN (U"MelSpectrogram", U"djmw", 20141209)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type MelSpectrogram represents an acoustic time-frequency "
 	"representation of a sound: the power spectral density %P(%f, %t)."
 	"It is sampled into a number of points around equally spaced times %t__%i_ "
 	"and frequencies %f__%j_ (on a Mel frequency scale).")
-NORMAL (L"The mel frequency scale is defined as:")
-FORMULA (L"mels = 2595 * log10 (1 + hertz / 700),")
-NORMAL (L"and its inverse is:")
-FORMULA (L"hertz = 700 * (10.0^^mel / 2595.0^ - 1).")
-ENTRY (L"Inside a MelSpectrogram")
-NORMAL (L"With @Inspect you will see that this type contains the same "
+NORMAL (U"The mel frequency scale is defined as:")
+FORMULA (U"mel = 2595 * log10 (1 + hertz / 700),")
+NORMAL (U"and its inverse is:")
+FORMULA (U"hertz = 700 * (10.0^^mel / 2595.0^ - 1).")
+ENTRY (U"Inside a MelSpectrogram")
+NORMAL (U"With @Inspect you will see that this type contains the same "
 	"attributes a @Matrix.")
 MAN_END
 
-MAN_BEGIN (L"MelSpectrogram: Paint image...", L"djmw", 20141023)
-INTRO (L"A command to draw the selected @MelSpectrogram into the @@Picture window@ in shades of grey.")
+MAN_BEGIN (U"MelSpectrogram: Paint image...", U"djmw", 20141023)
+INTRO (U"A command to draw the selected @MelSpectrogram into the @@Picture window@ in shades of grey.")
 MAN_END
 
-MAN_BEGIN (L"MelSpectrogram: To MFCC...", L"djmw", 20141023)
-INTRO (L"A command to create a @MFCC object from each selected @MelSpectrogram "
+MAN_BEGIN (U"MelSpectrogram: To MFCC...", U"djmw", 20141023)
+INTRO (U"A command to create a @MFCC object from each selected @MelSpectrogram "
 	"object.")
-NORMAL (L"Mel frequency cepstral coefficients %c__%k_ in each frame of the MFCC object result from the output of a Discrete Cosine "
+NORMAL (U"Mel frequency cepstral coefficients %c__%k_ in each frame of the MFCC object result from the output of a Discrete Cosine "
 	"Transform on spectral values %P__%j_ in the corresponding frame of the MelSpectrogram. The following formula "
 	"shows the relation between the values in each frame:")
-FORMULA (L"%c__%k-1_ = \\Si__%j=1_^^%N^ %P__%j_ cos (\\pi(%k-1)(%j-0.5)/%N)),")
-NORMAL (L"where %N represents the number of spectral values and %P__%j_ the power in dB "
+FORMULA (U"%c__%k-1_ = \\Si__%j=1_^^%N^ %P__%j_ cos (\\pi(%k-1)(%j-0.5)/%N)),")
+NORMAL (U"where %N represents the number of spectral values and %P__%j_ the power in dB "
 	"of the %j^^%th^ spectral value (%k runs from 1 to %N).")
-NORMAL (L"This transformation was first used by @@Davis & Mermelstein (1980)@.")
+NORMAL (U"This transformation was first used by @@Davis & Mermelstein (1980)@.")
 MAN_END
 
-MAN_BEGIN (L"MFCC: To TableOfReal...", L"djmw", 20120504)
-INTRO (L"Convert the selected @@MFCC@ object to a @@TableOfReal@ object. Each MFCC frame results "
+MAN_BEGIN (U"MFCC: To TableOfReal...", U"djmw", 20120504)
+INTRO (U"Convert the selected @@MFCC@ object to a @@TableOfReal@ object. Each MFCC frame results "
 	"in one row in the TableOfReal. If the \"Include energy\" option is chosen, the zeroth MFCC "
 	"coefficient will be saved in the first column.")
 MAN_END
 
-MAN_BEGIN (L"MSpline", L"djmw", 19990627)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}. ")
-NORMAL (L"An object of type MSpline represents a linear combination of basis "
+MAN_BEGIN (U"MSpline", U"djmw", 19990627)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}. ")
+NORMAL (U"An object of type MSpline represents a linear combination of basis "
 	"m at spline functions. Each basis %mspline is a positive polynomial function "
 	"of degree %p.")
-FORMULA (L"MSpline (%x) = \\Si__%k=1..%numberOfCoefficients_ %c__%k_ %mspline__%k_(%x)")
+FORMULA (U"MSpline (%x) = \\Si__%k=1..%numberOfCoefficients_ %c__%k_ %mspline__%k_(%x)")
 MAN_END
 
-MAN_BEGIN (L"Pattern", L"djmw", 20041201)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-INTRO (L"An object of type Pattern represents a sequence of patterns that can serve as "
+MAN_BEGIN (U"Pattern", U"djmw", 20041201)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+INTRO (U"An object of type Pattern represents a sequence of patterns that can serve as "
 	"inputs for a neural net. All elements in a Pattern have to be in the interval [0,1].")
-ENTRY (L"Pattern commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu ##Create Pattern with zeroes...#")
-LIST_ITEM (L"\\bu @@TableOfReal: To Pattern and Categories...@")
-NORMAL (L"Synthesis:")
-LIST_ITEM (L"\\bu @@FFNet & Pattern: To Categories...@")
-LIST_ITEM (L"\\bu @@Pattern & Categories: To FFNet...@")
-ENTRY (L"Inside a Pattern")
-NORMAL (L"With @Inspect you will see that this type contains the same "
+ENTRY (U"Pattern commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu ##Create Pattern with zeroes...#")
+LIST_ITEM (U"\\bu @@TableOfReal: To Pattern and Categories...@")
+NORMAL (U"Synthesis:")
+LIST_ITEM (U"\\bu @@FFNet & Pattern: To Categories...@")
+LIST_ITEM (U"\\bu @@Pattern & Categories: To FFNet...@")
+ENTRY (U"Inside a Pattern")
+NORMAL (U"With @Inspect you will see that this type contains the same "
 	"attributes as a @Matrix.")
 MAN_END
 
-MAN_BEGIN (L"PCA", L"djmw", 19990323)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}. "
+MAN_BEGIN (U"PCA", U"djmw", 19990323)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}. "
 	"See the @@Principal component analysis@ tutorial.")
-NORMAL (L"An object of type PCA represents the principal components analysis "
+NORMAL (U"An object of type PCA represents the principal components analysis "
 	"of a multivariate dataset.")
-ENTRY (L"Commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@Principal component analysis@ tutorial")
-LIST_ITEM (L"\\bu @@TableOfReal: To PCA@")
-ENTRY (L"Inside a PCA")
-NORMAL (L"With @Inspect you will see that this type contains the same "
+ENTRY (U"Commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@Principal component analysis@ tutorial")
+LIST_ITEM (U"\\bu @@TableOfReal: To PCA@")
+ENTRY (U"Inside a PCA")
+NORMAL (U"With @Inspect you will see that this type contains the same "
 	"attributes as an @Eigen with the following extras:")
-TAG (L"%numberOfObservations")
-DEFINITION (L"the number of observations in the multivariate dataset that originated the PCA, "
+TAG (U"%numberOfObservations")
+DEFINITION (U"the number of observations in the multivariate dataset that originated the PCA, "
 	"usually equal to the dataset's number of rows.")
-TAG (L"%labels[1..%dimension]")
-DEFINITION (L"the label that corresponds to each dimension.")
-TAG (L"%centroid")
-DEFINITION (L"the centroids of the originating multivariate data set.")
+TAG (U"%labels[1..%dimension]")
+DEFINITION (U"the label that corresponds to each dimension.")
+TAG (U"%centroid")
+DEFINITION (U"the centroids of the originating multivariate data set.")
 MAN_END
 
-MAN_BEGIN (L"PCA: Get fraction variance accounted for...", L"djmw", 19990106)
-INTRO (L"A command to query the selected @PCA for the fraction %%variance "
+MAN_BEGIN (U"PCA: Get fraction variance accounted for...", U"djmw", 19990106)
+INTRO (U"A command to query the selected @PCA for the fraction %%variance "
 	"accounted for% by the selected components.")
-ENTRY (L"Setting")
-TAG (L"##Principal component range")
-DEFINITION (L"defines the range of the principal components. If you choose both numbers equal, "
+ENTRY (U"Setting")
+TAG (U"##Principal component range")
+DEFINITION (U"defines the range of the principal components. If you choose both numbers equal, "
 	"you get the fraction of the \"variance\" explained by that one component.")
-ENTRY (L"Details")
-NORMAL (L"The contribution is defined as:")
-FORMULA (L"\\Si__%i=%from..%to_ %%eigenvalue[i]% / \\Si__%i=1..%numberOfEigenvalues_ %%eigenvalue[i]%")
+ENTRY (U"Details")
+NORMAL (U"The contribution is defined as:")
+FORMULA (U"\\Si__%i=%from..%to_ %%eigenvalue[i]% / \\Si__%i=1..%numberOfEigenvalues_ %%eigenvalue[i]%")
 MAN_END
 
-MAN_BEGIN (L"PCA: Get eigenvalue...", L"djmw", 20040225)
-INTRO (L"A command to query the selected @PCA for the %i^^th^ "
+MAN_BEGIN (U"PCA: Get eigenvalue...", U"djmw", 20040225)
+INTRO (U"A command to query the selected @PCA for the %i^^th^ "
 	"eigenvalue.")
 MAN_END
 
-MAN_BEGIN (L"PCA: Get eigenvector element...", L"djmw", 20040225)
-INTRO (L"A command to query the selected @PCA for the %j^^th^ element of the "
+MAN_BEGIN (U"PCA: Get eigenvector element...", U"djmw", 20040225)
+INTRO (U"A command to query the selected @PCA for the %j^^th^ element of the "
 	"%i^^th^ eigenvector.")
 MAN_END
 
-MAN_BEGIN (L"PCA: Get equality of eigenvalues...",L"djmw", 19981102)
-INTRO (L"A command to get the probability that some of the eigenvalues of the "
+MAN_BEGIN (U"PCA: Get equality of eigenvalues...", U"djmw", 19981102)
+INTRO (U"A command to get the probability that some of the eigenvalues of the "
 	"selected @PCA object are equal. A low probability means that it is not "
 	"very likely that that these numbers are equal.")
-NORMAL (L"We test the hypothesis %H__0_: %\\la__%from_ = ... = %\\la__%to_ "
+NORMAL (U"We test the hypothesis %H__0_: %\\la__%from_ = ... = %\\la__%to_ "
 	"that %r (= %to\\--%from+1) of the eigenvalues \\la of the covariance "
 	"matrix are equal. The remaining eigenvalues are unrestricted as to their "
 	"values and multiplicities. The alternative hypothesis to %H__0_ is that "
 	"some of the eigenvalues in the set are distinct.")
-ENTRY (L"Settings")
-TAG (L"##Eigenvalue range")
-DEFINITION (L"define the range of eigenvalues to be tested for equality.")
-TAG (L"##Conservative test")
-DEFINITION (L"when on, a more conservative estimate for %n is chosen (see below).")
-ENTRY (L"Details")
-NORMAL (L"The test statistic is:")
-FORMULA (L"\\ci^2 = \\--%n \\Si__%j=%from..%to_ ln %eigenvalue[%j] + %n %r "
+ENTRY (U"Settings")
+TAG (U"##Eigenvalue range")
+DEFINITION (U"define the range of eigenvalues to be tested for equality.")
+TAG (U"##Conservative test")
+DEFINITION (U"when on, a more conservative estimate for %n is chosen (see below).")
+ENTRY (U"Details")
+NORMAL (U"The test statistic is:")
+FORMULA (U"\\ci^2 = \\--%n \\Si__%j=%from..%to_ ln %eigenvalue[%j] + %n %r "
 	"ln (\\Si__%j=%from..%to_ %eigenvalue[%j] / %r),")
-NORMAL (L"with %r(%r+1)/2 \\--1 degrees of freedom. Here %n = %totalNumberOfCases \\-- 1.")
-NORMAL (L"A special case occurs when the variation in the last %r dimensions is spherical. In a "
+NORMAL (U"with %r(%r+1)/2 \\--1 degrees of freedom. Here %n = %totalNumberOfCases \\-- 1.")
+NORMAL (U"A special case occurs when the variation in the last %r dimensions is spherical. In a "
 	"slightly more conservative test we may replace %n by %n\\--%from\\--(2%r^2+%r+2)/6%r.")
-NORMAL (L"Also see @@Morrison (1990)@, page 336.")
+NORMAL (U"Also see @@Morrison (1990)@, page 336.")
 MAN_END
 
-MAN_BEGIN (L"PCA: Get number of components (VAF)...", L"djmw", 19990111)
-INTRO (L"A command to ask the selected @PCA for the minimum number of "
+MAN_BEGIN (U"PCA: Get number of components (VAF)...", U"djmw", 19990111)
+INTRO (U"A command to ask the selected @PCA for the minimum number of "
 	"components that are necessary "
 	"to explain the given fraction %%variance accounted for%.")
-ENTRY (L"Setting")
-TAG (L"##Variance accounted for (fraction)")
-DEFINITION (L"the fraction variance accounted for that must be explained.")
+ENTRY (U"Setting")
+TAG (U"##Variance accounted for (fraction)")
+DEFINITION (U"the fraction variance accounted for that must be explained.")
 MAN_END
 
-MAN_BEGIN (L"PCA: To TableOfReal (reconstruct 1)...", L"djmw", 20030108)
-INTRO (L"A command to reconstruct a single data item. The result is stored as "
+MAN_BEGIN (U"PCA: To TableOfReal (reconstruct 1)...", U"djmw", 20030108)
+INTRO (U"A command to reconstruct a single data item. The result is stored as "
 	"a @TableOfReal with only one row.")
-ENTRY (L"Settings")
-TAG (L"##Coefficients")
-DEFINITION (L"the weight for the eigenvectors.")
-NORMAL (L"The algorithm is explained in @@PCA & Configuration: To TableOfReal "
+ENTRY (U"Settings")
+TAG (U"##Coefficients")
+DEFINITION (U"the weight for the eigenvectors.")
+NORMAL (U"The algorithm is explained in @@PCA & Configuration: To TableOfReal "
 	"(reconstruct)@.")
 MAN_END
 
-MAN_BEGIN (L"PCA & Configuration: To TableOfReal (reconstruct)", L"djmw", 20030108)
-INTRO (L"A command to reconstruct a @TableOfReal from the selected @Configuration"
+MAN_BEGIN (U"PCA & Configuration: To TableOfReal (reconstruct)", U"djmw", 20030108)
+INTRO (U"A command to reconstruct a @TableOfReal from the selected @Configuration"
 	" and @PCA.")
-NORMAL (L"The TableOfReal is reconstructed from the eigenvectors of the PCA and "
+NORMAL (U"The TableOfReal is reconstructed from the eigenvectors of the PCA and "
 	"elements of the Configuration are the weight factors: ")
-FORMULA (L"%#t__%i_ = \\Si__%k_ %c__%ik_ #%e__%k_,")
-NORMAL (L"where %#t__%i_ is the %i-th row in the resulting TableOfReal object, %c__%ik_ is "
+FORMULA (U"%#t__%i_ = \\Si__%k_ %c__%ik_ #%e__%k_,")
+NORMAL (U"where %#t__%i_ is the %i-th row in the resulting TableOfReal object, %c__%ik_ is "
 	"the element at row %i and column %k in the Configuration object and #%e__%k_ "
 	"the %k-th eigenvector from the PCA object.")
 MAN_END
 
-MAN_BEGIN (L"PCA & PCA: Get angle between pc1-pc2 planes", L"djmw", 20041028)
-INTRO (L"A command to calculate the angle between two planes. Each plane is spanned by the first "
+MAN_BEGIN (U"PCA & PCA: Get angle between pc1-pc2 planes", U"djmw", 20041028)
+INTRO (U"A command to calculate the angle between two planes. Each plane is spanned by the first "
 	"two eigenvectors from the corresponding @@PCA at .")
-ENTRY (L"Algorithm")
-NORMAL (L"The algorithm is described in section 12.4.3 of @@Golub & van Loan (1996)@:")
-NORMAL (L"First we form the projection of one set of eigenvectors on the other set. "
+ENTRY (U"Algorithm")
+NORMAL (U"The algorithm is described in section 12.4.3 of @@Golub & van Loan (1996)@:")
+NORMAL (U"First we form the projection of one set of eigenvectors on the other set. "
 	"This results in a 2\\xx2 matrix #C:")
-FORMULA (L"#C = #E__1_\\'p #E__2_,")
-NORMAL (L"where #E__1_ and #E__2_ are 2\\xx%%dimension% and %%dimension%\\xx2 matrices "
+FORMULA (U"#C = #E__1_\\'p #E__2_,")
+NORMAL (U"where #E__1_ and #E__2_ are 2\\xx%%dimension% and %%dimension%\\xx2 matrices "
 	"that contain the first two eigenvectors of the PCA's, respectively.")
-NORMAL (L"Next, we compute the @@singular value decomposition@ of #C:")
-FORMULA (L"#C = #U #\\Si #V\\'p")
-NORMAL (L"Now the cosine of the angle between the two planes is given by \\si__2_ and "
+NORMAL (U"Next, we compute the @@singular value decomposition@ of #C:")
+FORMULA (U"#C = #U #\\Si #V\\'p")
+NORMAL (U"Now the cosine of the angle between the two planes is given by \\si__2_ and "
 	"the angle in degrees is therefore:")
-FORMULA (L"arccos (\\si__2_)\\.c180/\\pi")
+FORMULA (U"arccos (\\si__2_)\\.c180/\\pi")
 MAN_END
 
-MAN_BEGIN (L"PCA & PCA: To Procrustes...", L"djmw", 20041028)
-INTRO (L"A command to calculate a @Procrustes from the two selected @@PCA@'s.")
-NORMAL (L"Determines the orthogonal @@Procrustes transform at .")
-NORMAL (L"Algorithm 12.4.1 in @@Golub & van Loan (1996)@.")
+MAN_BEGIN (U"PCA & PCA: To Procrustes...", U"djmw", 20041028)
+INTRO (U"A command to calculate a @Procrustes from the two selected @@PCA@'s.")
+NORMAL (U"Determines the orthogonal @@Procrustes transform at .")
+NORMAL (U"Algorithm 12.4.1 in @@Golub & van Loan (1996)@.")
 MAN_END
 
-MAN_BEGIN (L"PCA & TableOfReal: To Configuration...", L"djmw", 19990111)
-INTRO (L"A command to construct a @Configuration from the selected @TableOfReal"
+MAN_BEGIN (U"PCA & TableOfReal: To Configuration...", U"djmw", 19990111)
+INTRO (U"A command to construct a @Configuration from the selected @TableOfReal"
 	" and @PCA.")
-ENTRY (L"Setting")
-TAG (L"##Number of dimensions")
-DEFINITION (L"determines the number of dimensions of the resulting Configuration.")
-ENTRY (L"Algorithm")
-NORMAL (L"The TableOfReal is projected on the eigenspace of the PCA, i.e., "
+ENTRY (U"Setting")
+TAG (U"##Number of dimensions")
+DEFINITION (U"determines the number of dimensions of the resulting Configuration.")
+ENTRY (U"Algorithm")
+NORMAL (U"The TableOfReal is projected on the eigenspace of the PCA, i.e., "
 	"each row of the TableOfReal is treated as a vector, and the inner product "
 	"with the eigenvectors of the PCA determine its coordinates in the Configuration.")
-NORMAL (L"Because the algorithm performs a projection, the resulting Configuration will "
+NORMAL (U"Because the algorithm performs a projection, the resulting Configuration will "
 	"##only be centered#, i.e., its centroid will be at ##0#, if the data in the "
 	"TableOfReal object are centered too. ")
-NORMAL (L"See also @@Eigen & TableOfReal: Project... at .")
+NORMAL (U"See also @@Eigen & TableOfReal: Project... at .")
 MAN_END
 
-MAN_BEGIN (L"PCA & TableOfReal: To TableOfReal (z-scores)...", L"djmw", 20120510)
-INTRO (L"A command to construct a @TableOfReal with z-scores from the selected @TableOfReal"
+MAN_BEGIN (U"PCA & TableOfReal: To TableOfReal (z-scores)...", U"djmw", 20120510)
+INTRO (U"A command to construct a @TableOfReal with z-scores from the selected @TableOfReal"
 	" and @PCA.")
-ENTRY (L"Setting")
-TAG (L"##Number of dimensions")
-DEFINITION (L"determines the number of dimensions of the resulting Configuration.")
-ENTRY (L"Algorithm")
-NORMAL (L"The values %d__%ij_ in the new TableOfReal are calculated as")
-FORMULA (L"%d__%ij_ = ##eigenvector#__j_\\.c ##z#__%i_,")
-NORMAL (L"which is the inproduct of the %j-th eigenvector and the z-score vector ##z#__%i_ of the %i-th row whose elements %z__%ij_ are defined as")
-FORMULA (L"%z__%ij_ = (data__%ij_ - mean__%j_) / sqrt (eigenvalue__%j_),")
-NORMAL (L"in which data__%ij_ is the data value at row %i and column %j of the selected TableOfReal and mean__%j_ is the "
+ENTRY (U"Setting")
+TAG (U"##Number of dimensions")
+DEFINITION (U"determines the number of dimensions of the resulting Configuration.")
+ENTRY (U"Algorithm")
+NORMAL (U"The values %d__%ij_ in the new TableOfReal are calculated as")
+FORMULA (U"%d__%ij_ = ##eigenvector#__j_\\.c ##z#__%i_,")
+NORMAL (U"which is the inproduct of the %j-th eigenvector and the z-score vector ##z#__%i_ of the %i-th row whose elements %z__%ij_ are defined as")
+FORMULA (U"%z__%ij_ = (data__%ij_ - mean__%j_) / sqrt (eigenvalue__%j_),")
+NORMAL (U"in which data__%ij_ is the data value at row %i and column %j of the selected TableOfReal and mean__%j_ is the "
 	"%j-th centroid value of the PCA. The square root of the %j-th eigenvalue is the standard deviation in "
 	" the %j-th principal direction.")
 MAN_END
 
-MAN_BEGIN (L"PCA & TableOfReal: Get fraction variance...", L"djmw", 20040324)
-INTRO (L"A command to query the selected @PCA and @TableOfReal object for the explained "
+MAN_BEGIN (U"PCA & TableOfReal: Get fraction variance...", U"djmw", 20040324)
+INTRO (U"A command to query the selected @PCA and @TableOfReal object for the explained "
 	"fraction of the variance if the TableOfReal object were projected onto the PCA space.")
-ENTRY (L"Algorithm")
-LIST_ITEM (L"1. The TableOfReal is @@TableOfReal: To Covariance|converted@ to a "
+ENTRY (U"Algorithm")
+LIST_ITEM (U"1. The TableOfReal is @@TableOfReal: To Covariance|converted@ to a "
 	"Covariance object.")
-LIST_ITEM (L"2. The Covariance object is @@PCA & Covariance: Project|projected@ on "
+LIST_ITEM (U"2. The Covariance object is @@PCA & Covariance: Project|projected@ on "
 	"the PCA eigenspace and the newly obtained projected Covariance object is "
 	"@@Covariance: Get fraction variance...|queried@ for the fraction variance.")
 MAN_END
 
-MAN_BEGIN (L"PitchTier: To Pitch...", L"djmw", 20061128)
-INTRO (L"Synthesizes a new @Pitch from the selected @PitchTier.")
+MAN_BEGIN (U"PitchTier: To Pitch...", U"djmw", 20061128)
+INTRO (U"Synthesizes a new @Pitch from the selected @PitchTier.")
 MAN_END
 
-MAN_BEGIN (L"Polygon: Rotate...", L"djmw", 20100418)
-INTRO (L"Rotates the selected @@Polygon@ counterclockwise with respect to the given coordinates.")
+MAN_BEGIN (U"Polygon: Rotate...", U"djmw", 20100418)
+INTRO (U"Rotates the selected @@Polygon@ counterclockwise with respect to the given coordinates.")
 MAN_END
 
-MAN_BEGIN (L"Create simple Polygon...", L"djmw", 20140117)
-INTRO (L"Creates a @@Polygon@ from user  supplied x/y pairs.")
-ENTRY (L"Settings")
-TAG (L"##Name")
-DEFINITION (L"defines the name of the resulting Polygon.")
-TAG (L"##Vertices as X-Y pairs#,")
-DEFINITION (L"defines the x-y values of the vertices of the Polygon. The Polygon will be automatically closed, i.e., the first and the last point will be connected.")
-ENTRY (L"Example")
-NORMAL (L"The command ##Create simple Polygon: \"p\", \"0.0 0.0 0.0 1.0 1.0 0.0\"# defines  a Polygon with three points. In the figure the three points are indicated with open circles while the Polygon is drawn as a closed figure.")
-SCRIPT (4,4, L"Create simple Polygon: \"p\", \"0.0 0.0 0.0 1.0 1.0 0.0\"\n"
+MAN_BEGIN (U"Create simple Polygon...", U"djmw", 20140117)
+INTRO (U"Creates a @@Polygon@ from user  supplied x/y pairs.")
+ENTRY (U"Settings")
+TAG (U"##Name")
+DEFINITION (U"defines the name of the resulting Polygon.")
+TAG (U"##Vertices as X-Y pairs#,")
+DEFINITION (U"defines the x-y values of the vertices of the Polygon. The Polygon will be automatically closed, i.e., the first and the last point will be connected.")
+ENTRY (U"Example")
+NORMAL (U"The command ##Create simple Polygon: \"p\", \"0.0 0.0 0.0 1.0 1.0 0.0\"# defines  a Polygon with three points. In the figure the three points are indicated with open circles while the Polygon is drawn as a closed figure.")
+SCRIPT (4,4, U"Create simple Polygon: \"p\", \"0.0 0.0 0.0 1.0 1.0 0.0\"\n"
 	"Draw circles: 0, 1, 0, 1, 3\n"
 	"Draw closed: 0, 1, 0, 1\n"
 	"Remove\n")
 MAN_END
 
-MAN_BEGIN (L"Polygon: Get location of point...", L"djmw", 20120220)
-INTRO (L"Determines whether a given point is on the ##I#nside, the ##O#utside, on an ##E#dge or on a ##V#ertex of the selected Polygon.")
-ENTRY (L"Algorithm")
-NORMAL (L"We determine how often a horizontal line extending from the point crosses the polygon. If the number of crossings is even, the point is on the outside, else on the inside. Special care is taken to be able to detect if a point is on the boundary of the polygon. The used algorithm is from @@Hormann & Agathos (2001)@")
+MAN_BEGIN (U"Polygon: Get location of point...", U"djmw", 20120220)
+INTRO (U"Determines whether a given point is on the ##I#nside, the ##O#utside, on an ##E#dge or on a ##V#ertex of the selected Polygon.")
+ENTRY (U"Algorithm")
+NORMAL (U"We determine how often a horizontal line extending from the point crosses the polygon. If the number of crossings is even, the point is on the outside, else on the inside. Special care is taken to be able to detect if a point is on the boundary of the polygon. The used algorithm is from @@Hormann & Agathos (2001)@")
 MAN_END
 
-MAN_BEGIN (L"Polygon: Simplify", L"djmw", 20140509)
-INTRO (L"Removes collinear vertices from a @@Polygon at .")
-ENTRY (L"Example")
+MAN_BEGIN (U"Polygon: Simplify", U"djmw", 20140509)
+INTRO (U"Removes collinear vertices from a @@Polygon at .")
+ENTRY (U"Example")
 SCRIPT (4, 4,
-	L"p1 = Create simple Polygon: \"p\", \"0.0 0.0 0.0 1.0 0.5 0.5 1.0 0.0 0.5 0 0 -0.5 0 -0.25\"\n"
+	U"p1 = Create simple Polygon: \"p\", \"0.0 0.0 0.0 1.0 0.5 0.5 1.0 0.0 0.5 0 0 -0.5 0 -0.25\"\n"
 	"Draw closed: 0, 0, 0, 0\n"
 	"Colour: \"Red\"\n"
 	"Draw circles: 0, 0, 0, 0, 3\n"
@@ -2735,151 +2735,151 @@ SCRIPT (4, 4,
 	"Paint circles: 0, 0, 0, 0, 1.5\n"
 	"removeObject: p1, p2\n"
 )
-NORMAL (L"Given the Polygon with the seven vertices indicated by the red open circles, the Simplify action results in the Polygon with four vertices indicated by the filled black circles.")
+NORMAL (U"Given the Polygon with the seven vertices indicated by the red open circles, the Simplify action results in the Polygon with four vertices indicated by the filled black circles.")
 MAN_END
 
-MAN_BEGIN (L"Polygon: Translate...", L"djmw", 20100418)
-INTRO (L"Translates the selected @@Polygon@ over the given vector.")
-NORMAL (L"Given the old coordinates (x__i_, y__i_) and the translation (x__t_,y__t_), the new coordinates are:")
-FORMULA (L"x__i_\\'p = x__i_ + x__t_")
-FORMULA (L"y__i_\\'p = y__i_ + y__t_")
+MAN_BEGIN (U"Polygon: Translate...", U"djmw", 20100418)
+INTRO (U"Translates the selected @@Polygon@ over the given vector.")
+NORMAL (U"Given the old coordinates (x__i_, y__i_) and the translation (x__t_,y__t_), the new coordinates are:")
+FORMULA (U"x__i_\\'p = x__i_ + x__t_")
+FORMULA (U"y__i_\\'p = y__i_ + y__t_")
 MAN_END
 
-MAN_BEGIN (L"Polynomial", L"djmw", 19990608)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type "
+MAN_BEGIN (U"Polynomial", U"djmw", 19990608)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type "
 	"Polynomial represents a polynomial function on a domain.")
-NORMAL (L"A polynomial of degree %n is defined as:")
-FORMULA (L"%p(%x) = %c__1_ + %c__2_ %x + %c__3_ %x^^2^ + ... c__%n+1_ %x^^%n^.")
-NORMAL (L"The real numbers %c__%k_ are called the polynomial %coefficients.")
-ENTRY (L"Commands")
-NORMAL (L"Creation")
-LIST_ITEM (L"\\bu @@Create Polynomial...@ (in the ##New menu#)")
-LIST_ITEM (L"\\bu @@LPC: To Polynomial (slice)...@ (from prediction coefficients)")
-LIST_ITEM (L"\\bu @@LegendreSeries: To Polynomial@")
-LIST_ITEM (L"\\bu @@ChebyshevSeries: To Polynomial@")
-NORMAL (L"Drawing")
-LIST_ITEM (L"\\bu ##Draw...#")
-NORMAL (L"Queries")
-LIST_ITEM (L"\\bu @@Polynomial: Get function value...|Get function value...@: get %p(%x)")
-LIST_ITEM (L"\\bu ##Get coefficient value...#: get %c__%i_")
-LIST_ITEM (L"\\bu @@Polynomial: Get minimum...|Get minimum...@: minimum of %p(%x) on an interval")
-LIST_ITEM (L"\\bu @@Polynomial: Get x of minimum...|Get x of minimum...@")
-LIST_ITEM (L"\\bu @@Polynomial: Get maximum...|Get maximum...@: maximum of %p(%x) on an interval")
-LIST_ITEM (L"\\bu @@Polynomial: Get x of maximum...|Get x of maximum...@")
-LIST_ITEM (L"\\bu @@Polynomial: Get area...|Get area...@")
-NORMAL (L"Modification")
-LIST_ITEM (L"\\bu ##Set domain...#: new domain")
-LIST_ITEM (L"\\bu ##Set coefficient value...#: change one coefficient")
-NORMAL (L"Conversion")
-LIST_ITEM (L"\\bu @@Polynomial: To Spectrum...|To Spectrum...@ (evaluation over unit-circle)")
-LIST_ITEM (L"\\bu @@Polynomial: To Polynomial (derivative)|To Polynomial (derivative)@")
-LIST_ITEM (L"\\bu @@Polynomial: To Polynomial (primitive)|To Polynomial (primitive)@")
-LIST_ITEM (L"\\bu @@Polynomial: To Roots|To Roots@: roots of polynomial")
-MAN_END
-
-MAN_BEGIN (L"Polynomial: Get area...", L"djmw", 19990610)
-INTRO (L"A command to compute the area below the selected @Polynomial object.")
-ENTRY (L"Settings")
-TAG (L"##Xmin#, ##Xmax#")
-DEFINITION (L"define the interval.")
-NORMAL (L"The area is defined as __%xmin_\\in^^xmax^ %p(%x) %dx.")
-MAN_END
-
-MAN_BEGIN (L"Polynomial: Get function value...", L"djmw", 19990610)
-INTRO (L"A command to compute %p(%x) for the selected @Polynomial object.")
-MAN_END
-
-MAN_BEGIN (L"Polynomial: Get maximum...", L"djmw", 19990610)
-INTRO (L"A command to compute, on a specified interval, the maximum value of the selected "
+NORMAL (U"A polynomial of degree %n is defined as:")
+FORMULA (U"%p(%x) = %c__1_ + %c__2_ %x + %c__3_ %x^^2^ + ... c__%n+1_ %x^^%n^.")
+NORMAL (U"The real numbers %c__%k_ are called the polynomial %coefficients.")
+ENTRY (U"Commands")
+NORMAL (U"Creation")
+LIST_ITEM (U"\\bu @@Create Polynomial...@ (in the ##New menu#)")
+LIST_ITEM (U"\\bu @@LPC: To Polynomial (slice)...@ (from prediction coefficients)")
+LIST_ITEM (U"\\bu @@LegendreSeries: To Polynomial@")
+LIST_ITEM (U"\\bu @@ChebyshevSeries: To Polynomial@")
+NORMAL (U"Drawing")
+LIST_ITEM (U"\\bu ##Draw...#")
+NORMAL (U"Queries")
+LIST_ITEM (U"\\bu @@Polynomial: Get function value...|Get function value...@: get %p(%x)")
+LIST_ITEM (U"\\bu ##Get coefficient value...#: get %c__%i_")
+LIST_ITEM (U"\\bu @@Polynomial: Get minimum...|Get minimum...@: minimum of %p(%x) on an interval")
+LIST_ITEM (U"\\bu @@Polynomial: Get x of minimum...|Get x of minimum...@")
+LIST_ITEM (U"\\bu @@Polynomial: Get maximum...|Get maximum...@: maximum of %p(%x) on an interval")
+LIST_ITEM (U"\\bu @@Polynomial: Get x of maximum...|Get x of maximum...@")
+LIST_ITEM (U"\\bu @@Polynomial: Get area...|Get area...@")
+NORMAL (U"Modification")
+LIST_ITEM (U"\\bu ##Set domain...#: new domain")
+LIST_ITEM (U"\\bu ##Set coefficient value...#: change one coefficient")
+NORMAL (U"Conversion")
+LIST_ITEM (U"\\bu @@Polynomial: To Spectrum...|To Spectrum...@ (evaluation over unit-circle)")
+LIST_ITEM (U"\\bu @@Polynomial: To Polynomial (derivative)|To Polynomial (derivative)@")
+LIST_ITEM (U"\\bu @@Polynomial: To Polynomial (primitive)|To Polynomial (primitive)@")
+LIST_ITEM (U"\\bu @@Polynomial: To Roots|To Roots@: roots of polynomial")
+MAN_END
+
+MAN_BEGIN (U"Polynomial: Get area...", U"djmw", 19990610)
+INTRO (U"A command to compute the area below the selected @Polynomial object.")
+ENTRY (U"Settings")
+TAG (U"##Xmin#, ##Xmax#")
+DEFINITION (U"define the interval.")
+NORMAL (U"The area is defined as __%xmin_\\in^^xmax^ %p(%x) %dx.")
+MAN_END
+
+MAN_BEGIN (U"Polynomial: Get function value...", U"djmw", 19990610)
+INTRO (U"A command to compute %p(%x) for the selected @Polynomial object.")
+MAN_END
+
+MAN_BEGIN (U"Polynomial: Get maximum...", U"djmw", 19990610)
+INTRO (U"A command to compute, on a specified interval, the maximum value of the selected "
 	"@Polynomial object.")
 MAN_END
 
-MAN_BEGIN (L"Polynomial: Get x of maximum...", L"djmw", 19990610)
-INTRO (L"A command to compute, on a specified interval, the location of the maximum of the "
+MAN_BEGIN (U"Polynomial: Get x of maximum...", U"djmw", 19990610)
+INTRO (U"A command to compute, on a specified interval, the location of the maximum of the "
 	"selected @Polynomial object.")
 MAN_END
 
-MAN_BEGIN (L"Polynomial: Get minimum...", L"djmw", 19990610)
-INTRO (L"A command to compute, on a specified interval, the minimum value of the selected "
+MAN_BEGIN (U"Polynomial: Get minimum...", U"djmw", 19990610)
+INTRO (U"A command to compute, on a specified interval, the minimum value of the selected "
 	"@Polynomial object.")
 MAN_END
 
-MAN_BEGIN (L"Polynomial: Get x of minimum...", L"djmw", 19990610)
-INTRO (L"A command to compute, on a specified interval, the location of the minimum of the "
+MAN_BEGIN (U"Polynomial: Get x of minimum...", U"djmw", 19990610)
+INTRO (U"A command to compute, on a specified interval, the location of the minimum of the "
 	"selected @Polynomial object.")
 MAN_END
 
-MAN_BEGIN (L"Polynomials: Multiply", L"djmw", 19990616)
-INTRO (L"A command to multiply two @@Polynomial|polynomials@ with each other.")
-NORMAL (L"The result of multiplying 1 + 2 %x and 2 \\-- %x^2 will be the polynomial:")
-FORMULA (L"2 + 4 %x \\-- %x^2 \\-- 2 %x^3.")
+MAN_BEGIN (U"Polynomials: Multiply", U"djmw", 19990616)
+INTRO (U"A command to multiply two @@Polynomial|polynomials@ with each other.")
+NORMAL (U"The result of multiplying 1 + 2 %x and 2 \\-- %x^2 will be the polynomial:")
+FORMULA (U"2 + 4 %x \\-- %x^2 \\-- 2 %x^3.")
 MAN_END
 
-MAN_BEGIN (L"Polynomial: To Polynomial (derivative)", L"djmw", 19990610)
-INTRO (L"A command to compute the derivative of the selected @Polynomial object.")
+MAN_BEGIN (U"Polynomial: To Polynomial (derivative)", U"djmw", 19990610)
+INTRO (U"A command to compute the derivative of the selected @Polynomial object.")
 MAN_END
 
-MAN_BEGIN (L"Polynomial: To Polynomial (primitive)", L"djmw", 19990610)
-INTRO (L"A command to compute the primitive of the selected @Polynomial object.")
+MAN_BEGIN (U"Polynomial: To Polynomial (primitive)", U"djmw", 19990610)
+INTRO (U"A command to compute the primitive of the selected @Polynomial object.")
 MAN_END
 
-MAN_BEGIN (L"Polynomial: Scale x...", L"djmw", 19990610)
-INTRO (L"A command to transform the selected @Polynomial object to a new domain.")
-TAG (L"##Xmin# and ##Xmax#")
-DEFINITION (L"define the new domain.")
-ENTRY (L"Behaviour")
-NORMAL (L"The polynomial is transformed from domain [%x__min_, %x__max_] to "
+MAN_BEGIN (U"Polynomial: Scale x...", U"djmw", 19990610)
+INTRO (U"A command to transform the selected @Polynomial object to a new domain.")
+TAG (U"##Xmin# and ##Xmax#")
+DEFINITION (U"define the new domain.")
+ENTRY (U"Behaviour")
+NORMAL (U"The polynomial is transformed from domain [%x__min_, %x__max_] to "
 	"domain [%Xmin, %Xmax] in such a way that its form stays the same. "
 	"This is accomplished by first calculating:")
-FORMULA (L"%f(%x\\'p) = \\Si__%k=1..%numberOfCoefficients_ %c__%k_ %x\\'p^^%k^, where")
-FORMULA (L"%x\\'p = %a %x + %b,")
-NORMAL (L"and then collecting terms of equal degree. The %a and %b are defined as")
-FORMULA (L"%a = (%x__min_ \\-- %x__max_) / (%Xmin \\-- %Xmax)")
-FORMULA (L"%b = %x__min_ \\-- %a %Xmin")
+FORMULA (U"%f(%x\\'p) = \\Si__%k=1..%numberOfCoefficients_ %c__%k_ %x\\'p^^%k^, where")
+FORMULA (U"%x\\'p = %a %x + %b,")
+NORMAL (U"and then collecting terms of equal degree. The %a and %b are defined as")
+FORMULA (U"%a = (%x__min_ \\-- %x__max_) / (%Xmin \\-- %Xmax)")
+FORMULA (U"%b = %x__min_ \\-- %a %Xmin")
 MAN_END
 
-MAN_BEGIN (L"Polynomial: To Roots", L"djmw", 19990608)
-INTRO (L"A command to compute the @@Roots|roots@ of the selected @Polynomial objects.")
-ENTRY (L"Algorithm")
-NORMAL (L"The roots are found from the polished eigenvalues of a special companion matrix. "
+MAN_BEGIN (U"Polynomial: To Roots", U"djmw", 19990608)
+INTRO (U"A command to compute the @@Roots|roots@ of the selected @Polynomial objects.")
+ENTRY (U"Algorithm")
+NORMAL (U"The roots are found from the polished eigenvalues of a special companion matrix. "
 	"For further explanation on these methods see @@Press et al. (1992)@.")
 MAN_END
 
-MAN_BEGIN (L"Polynomial: To Spectrum...", L"djmw", 19990616)
-INTRO (L"A command to compute the @@Spectrum|spectrum@ of the selected @Polynomial objects.")
-ENTRY (L"Settings")
-TAG (L"##Nyquist frequency (Hz)")
-DEFINITION (L"defines the highest frequency in the spectrum. The lowest frequency of the spectrum "
+MAN_BEGIN (U"Polynomial: To Spectrum...", U"djmw", 19990616)
+INTRO (U"A command to compute the @@Spectrum|spectrum@ of the selected @Polynomial objects.")
+ENTRY (U"Settings")
+TAG (U"##Nyquist frequency (Hz)")
+DEFINITION (U"defines the highest frequency in the spectrum. The lowest frequency of the spectrum "
 	"will be 0 Hz.")
-TAG (L"##Number of frequencies")
-DEFINITION (L"defines the number of frequencies in the spectrum.")
-ENTRY (L"Algorithm")
-NORMAL (L"We calculate the spectrum by evaluating the polynomial at regularly spaced points %z__%k_ "
+TAG (U"##Number of frequencies")
+DEFINITION (U"defines the number of frequencies in the spectrum.")
+ENTRY (U"Algorithm")
+NORMAL (U"We calculate the spectrum by evaluating the polynomial at regularly spaced points %z__%k_ "
 	"on the upper half of a circle with radius %r = 1 in the complex plane. The upperhalf of the "
 	"unit circle, where %k\\.c%\\fi is in the interval [0, %\\pi], will be mapped to frequencies "
 	"[0, @@Nyquist frequency@] in the spectrum. ")
-NORMAL (L"The complex values %z__%k_ (%k=1..%numberOfFrequencies) are defined as:")
-FORMULA (L"%z__%k_ = %r e^^%i %k %\\fi^, where,")
-FORMULA (L"%\\fi = \\pi / (%numberOfFrequencies \\-- 1) and %r = 1.")
+NORMAL (U"The complex values %z__%k_ (%k=1..%numberOfFrequencies) are defined as:")
+FORMULA (U"%z__%k_ = %r e^^%i %k %\\fi^, where,")
+FORMULA (U"%\\fi = \\pi / (%numberOfFrequencies \\-- 1) and %r = 1.")
 MAN_END
 
-MAN_BEGIN (L"Principal component analysis", L"djmw", 20120510)
-INTRO (L"This tutorial describes how you can perform principal component "
+MAN_BEGIN (U"Principal component analysis", U"djmw", 20120510)
+INTRO (U"This tutorial describes how you can perform principal component "
        "analysis with P\\s{RAAT}.")
-NORMAL (L"Principal component analysis (PCA) involves a mathematical procedure "
+NORMAL (U"Principal component analysis (PCA) involves a mathematical procedure "
 	"that transforms a number of (possibly) correlated variables into a "
 	"(smaller) number of uncorrelated variables called %%principal "
 	"components%. The first principal component accounts for as much of the "
 	"variability in the data as possible, and each succeeding component "
 	"accounts for as much of the remaining variability as possible.")
-ENTRY (L"1. Objectives of principal component analysis")
-LIST_ITEM (L"\\bu To discover or to reduce the dimensionality of the data set.")
-LIST_ITEM (L"\\bu To identify new meaningful underlying variables.")
-ENTRY (L"2. How to start")
-NORMAL (L"We assume that the multi-dimensional data have been collected in a @TableOfReal data matrix, "
+ENTRY (U"1. Objectives of principal component analysis")
+LIST_ITEM (U"\\bu To discover or to reduce the dimensionality of the data set.")
+LIST_ITEM (U"\\bu To identify new meaningful underlying variables.")
+ENTRY (U"2. How to start")
+NORMAL (U"We assume that the multi-dimensional data have been collected in a @TableOfReal data matrix, "
 	"in which the rows are associated with the cases and the columns with the variables.")
-NORMAL (L"Traditionally, principal component analysis is performed on the "
+NORMAL (U"Traditionally, principal component analysis is performed on the "
 	"symmetric @@Covariance|Covariance@ matrix or on the symmetric @@correlation|Correlation@ matrix. "
 	"These matrices can be calculated from the data matrix. "
 	"The covariance matrix contains scaled @@SSCP|sums of squares and cross products at . "
@@ -2887,10 +2887,10 @@ NORMAL (L"Traditionally, principal component analysis is performed on the "
 	"We will have to standardize the data first if the variances of "
 	"variables differ much, or if the units of measurement of the "
 	"variables differ. You can standardize the data in the TableOfReal by choosing @@TableOfReal: Standardize columns|Standardize columns at .")
-NORMAL (L"To perform the analysis, we select the TabelOfReal data matrix in the list of objects and choose "
+NORMAL (U"To perform the analysis, we select the TabelOfReal data matrix in the list of objects and choose "
 	"@@TableOfReal: To PCA|To PCA at . This results in a new PCA object in the "
 	"list of objects.")
-NORMAL (L"We can now make a @@Scree plot|scree@ plot of the eigenvalues, @@Eigen: Draw "
+NORMAL (U"We can now make a @@Scree plot|scree@ plot of the eigenvalues, @@Eigen: Draw "
 	"eigenvalues...|Draw eigenvalues...@ "
 	"to get an indication of the importance of each eigenvalue. The exact "
 	"contribution of each eigenvalue (or a range of eigenvalues) to the "
@@ -2899,27 +2899,27 @@ NORMAL (L"We can now make a @@Scree plot|scree@ plot of the eigenvalues, @@Eigen
 	"accounted for... at . You might also check for the equality of a "
 	"number of eigenvalues: @@PCA: Get equality of eigenvalues...|Get equality "
 	"of eigenvalues... at .")
-ENTRY (L"3. Determining the number of components")
-NORMAL (L"There are two methods to help you to choose the number of components. "
+ENTRY (U"3. Determining the number of components")
+NORMAL (U"There are two methods to help you to choose the number of components. "
 	"Both methods are based on relations between the eigenvalues.")
-LIST_ITEM (L"\\bu Plot the eigenvalues, @@Eigen: Draw eigenvalues...|"
+LIST_ITEM (U"\\bu Plot the eigenvalues, @@Eigen: Draw eigenvalues...|"
 	"Draw eigenvalues... at . If the points on the graph tend to level out (show an \"elbow\"), "
 	"these eigenvalues are usually close enough to zero that they can be "
 	"ignored.")
-LIST_ITEM (L"\\bu Limit the number of components to that number that accounts for a certain fraction of the total variance. For example, if you are satisfied with 95% of the total variance explained then use the number you get by the query ##Get number of components (VAF)... 0.95#.")
-ENTRY (L"4. Getting the principal components")
-NORMAL (L"Principal components are obtained by projecting the multivariate "
+LIST_ITEM (U"\\bu Limit the number of components to that number that accounts for a certain fraction of the total variance. For example, if you are satisfied with 95% of the total variance explained then use the number you get by the query ##Get number of components (VAF)... 0.95#.")
+ENTRY (U"4. Getting the principal components")
+NORMAL (U"Principal components are obtained by projecting the multivariate "
 	"datavectors on the space spanned by the eigenvectors. This can be done "
 	"in two ways:")
-LIST_ITEM (L"1. Directly from the TableOfReal without first forming a "
+LIST_ITEM (U"1. Directly from the TableOfReal without first forming a "
 	"@PCA object: "
 	"@@TableOfReal: To Configuration (pca)...|To Configuration (pca)... at . "
 	"You can then draw the Configuration or display its numbers. ")
-LIST_ITEM (L"2. Select a PCA and a TableOfReal object together and choose "
+LIST_ITEM (U"2. Select a PCA and a TableOfReal object together and choose "
 	"@@PCA & TableOfReal: To Configuration...|To Configuration... at . "
 	"In this way you project the TableOfReal onto the PCA's eigenspace.")
-ENTRY (L"5. Mathematical background on principal component analysis")
-NORMAL (L"The mathematical technique used in PCA is called eigen analysis: "
+ENTRY (U"5. Mathematical background on principal component analysis")
+NORMAL (U"The mathematical technique used in PCA is called eigen analysis: "
 	"we solve for the eigenvalues and eigenvectors of a square symmetric "
 	"matrix with sums of squares and cross products. "
 	"The eigenvector associated with the largest eigenvalue has the same "
@@ -2929,12 +2929,12 @@ NORMAL (L"The mathematical technique used in PCA is called eigen analysis: "
 	"The sum of the eigenvalues equals the trace of the square matrix and the "
 	"maximum number of eigenvectors equals the number of rows (or columns) of "
 	"this matrix.")
-ENTRY (L"6. Algorithms")
-NORMAL (L"If our starting point happens to be a symmetric matrix like the covariance matrix, "
+ENTRY (U"6. Algorithms")
+NORMAL (U"If our starting point happens to be a symmetric matrix like the covariance matrix, "
 	"we solve for the eigenvalue and eigenvectors "
 	"by first performing a Householder reduction to tridiagonal form, followed"
 	" by the QL algorithm with implicit shifts.")
-NORMAL (L"If, conversely, our starting point is the data matrix #%A , "
+NORMAL (U"If, conversely, our starting point is the data matrix #%A , "
 	"we do not have to form explicitly the matrix with sums of squares and "
 	"cross products, #%A\\'p#%A. Instead, we proceed by a numerically more "
 	"stable method, and form the @@singular value decomposition@ of #%A, "
@@ -2942,26 +2942,26 @@ NORMAL (L"If, conversely, our starting point is the data matrix #%A , "
 	"and the squared diagonal elements of #%\\Si contain the eigenvalues.")
 MAN_END
 
-MAN_BEGIN (L"PCA & Covariance: Project", L"djmw", 20040225)
-INTRO (L"A command to project the @Covariance object onto the eigenspace of "
+MAN_BEGIN (U"PCA & Covariance: Project", U"djmw", 20040225)
+INTRO (U"A command to project the @Covariance object onto the eigenspace of "
 	"the @PCA object. ")
-NORMAL (L"Further details can be found in @@Eigen & SSCP: Project at .")
+NORMAL (U"Further details can be found in @@Eigen & SSCP: Project at .")
 MAN_END
 
-MAN_BEGIN (L"PCA & SSCP: Project", L"djmw", 20040225)
-INTRO (L"A command to project the @SSCP object onto the eigenspace of "
+MAN_BEGIN (U"PCA & SSCP: Project", U"djmw", 20040225)
+INTRO (U"A command to project the @SSCP object onto the eigenspace of "
 	"the @PCA object. ")
-NORMAL (L"Further details can be found in @@Eigen & SSCP: Project at .")
+NORMAL (U"Further details can be found in @@Eigen & SSCP: Project at .")
 MAN_END
 
-MAN_BEGIN (L"Regular expressions", L"djmw", 20010706)
-INTRO (L"This tutorial describes the %syntax of regular expressions in P\\s{RAAT} ")
-ENTRY (L"Introduction")
-NORMAL (L"A %%regular expression% is a text string that describes a %set "
+MAN_BEGIN (U"Regular expressions", U"djmw", 20010706)
+INTRO (U"This tutorial describes the %syntax of regular expressions in P\\s{RAAT} ")
+ENTRY (U"Introduction")
+NORMAL (U"A %%regular expression% is a text string that describes a %set "
 	"of strings. Regular expressions (regex) are useful as a way to search "
 	"for patterns in text strings and, optionally, replace them by another "
 	"pattern.")
-NORMAL (L"Some regex match only one string, i.e., the set they describe has "
+NORMAL (U"Some regex match only one string, i.e., the set they describe has "
 	"only one member. For example, the regex \"ab\" matches the string \"ab\" "
 	"and no others. Other regex match more than one string, i.e., the set "
 	"they describe has more than one member. For example, the regex \"a*\" "
@@ -2972,34 +2972,34 @@ NORMAL (L"Some regex match only one string, i.e., the set they describe has "
 	"%special characters or %meta characters. Many special characters are only "
 	"special characters in the %search regex and are ordinary characters in "
 	"the substitution regex. ")
-NORMAL (L"You can read the rest of this tutorial sequentially with the help of "
+NORMAL (U"You can read the rest of this tutorial sequentially with the help of "
 	"the \"<1\" and \">1\" buttons.")
-LIST_ITEM (L"1. @@Regular expressions 1. Special characters|Special characters@ "
+LIST_ITEM (U"1. @@Regular expressions 1. Special characters|Special characters@ "
 	"(\\bs \\^  \\$ { } [ ] ( ) . + ? \\|  - &)")
-LIST_ITEM (L"2. @@Regular expressions 2. Quantifiers|Quantifiers@ "
+LIST_ITEM (U"2. @@Regular expressions 2. Quantifiers|Quantifiers@ "
 	"(how often do we match).")
-LIST_ITEM (L"3. @@Regular expressions 3. Anchors|Anchors@ (where do we match)")
-LIST_ITEM (L"4. @@Regular expressions 4. Special constructs with parenthesis|"
+LIST_ITEM (U"3. @@Regular expressions 3. Anchors|Anchors@ (where do we match)")
+LIST_ITEM (U"4. @@Regular expressions 4. Special constructs with parenthesis|"
 	"Special constructs with parenthesis@ (grouping constructs)")
-LIST_ITEM (L"5. @@Regular expressions 5. Special control characters|"
+LIST_ITEM (U"5. @@Regular expressions 5. Special control characters|"
 	"Special control characters@ (difficult-to-type characters like \\bsn)")
-LIST_ITEM (L"6. @@Regular expressions 6. Convenience escape sequences|"
+LIST_ITEM (U"6. @@Regular expressions 6. Convenience escape sequences|"
 	"Convenience escape sequences@ "
 	"(\\bsd \\bsD \\bsl \\bsL \\bss \\bsS \\bsw \\bsW \\bsB)")
-LIST_ITEM (L"7. @@Regular expressions 7. Octal and hexadecimal escapes|"
+LIST_ITEM (U"7. @@Regular expressions 7. Octal and hexadecimal escapes|"
 	"Octal and hexadecimal escapes@ (things like \\bs053 or \\bsX2B)")
-LIST_ITEM (L"8. @@Regular expressions 8. Substitution special characters|"
+LIST_ITEM (U"8. @@Regular expressions 8. Substitution special characters|"
 	"Substitution special characters@ (\\bs1..\\bs9 \\bsU \\bsu \\bsL \\bsl &)")
-NORMAL (L"More in depth coverage of regular expressions can be found in "
+NORMAL (U"More in depth coverage of regular expressions can be found in "
 	"@@Friedl (1997)@.")
 
 MAN_END
 
-MAN_BEGIN (L"Regular expressions 1. Special characters", L"djmw", 20010718)
-INTRO (L"The following characters are the %meta characters that give special "
+MAN_BEGIN (U"Regular expressions 1. Special characters", U"djmw", 20010718)
+INTRO (U"The following characters are the %meta characters that give special "
 	"meaning to the regular expression search syntax:")
-TAG (L"#\\bs#   the backslash %escape character.")
-DEFINITION (L"The backslash gives special meaning to the character "
+TAG (U"#\\bs#   the backslash %escape character.")
+DEFINITION (U"The backslash gives special meaning to the character "
 	"following it. For example, the combination \"\\bsn\" stands for the "
 	"%newline, one of the @@Regular expressions 5. Special control characters"
 	"|control characters at . The combination \"\\bsw\" stands for a \"word\" "
@@ -3008,367 +3008,367 @@ DEFINITION (L"The backslash gives special meaning to the character "
 	"convenience escape sequences@ while \"\\bs1\" is one of the @@Regular "
 	"expressions 8. Substitution special characters|substitution special "
 	"characters at .")
-LIST_ITEM1 (L"Example: The regex \"aa\\bsn\" tries to match two consecutive "
+LIST_ITEM1 (U"Example: The regex \"aa\\bsn\" tries to match two consecutive "
 	"\"a\"s at the end of a line, inclusive the newline character itself.")
-LIST_ITEM1 (L"Example: \"a\\bs+\" matches \"a+\" and not a series of one or "
+LIST_ITEM1 (U"Example: \"a\\bs+\" matches \"a+\" and not a series of one or "
 	"\"a\"s.")
-TAG (L"##\\^ #    the caret is the start of line @@Regular expressions 3. "
+TAG (U"##\\^ #    the caret is the start of line @@Regular expressions 3. "
 	"Anchors|anchor@ or the negate symbol.")
-LIST_ITEM1 (L"Example: \"\\^ a\" matches \"a\" at the start of a line.")
-LIST_ITEM1 (L"Example: \"[\\^ 0-9]\" matches any non digit.")
-TAG (L"##\\$ #    the dollar is the end of line @@Regular expressions 3. "
+LIST_ITEM1 (U"Example: \"\\^ a\" matches \"a\" at the start of a line.")
+LIST_ITEM1 (U"Example: \"[\\^ 0-9]\" matches any non digit.")
+TAG (U"##\\$ #    the dollar is the end of line @@Regular expressions 3. "
 	"Anchors|anchor at .")
-LIST_ITEM1 (L"Example: \"b\\$ \" matches a \"b\" at the end of a line.")
-LIST_ITEM1 (L"Example: \"\\^ b\\$ \" matches the empty line.")
-TAG (L"##{ }#    the open and close curly bracket are used as range @@Regular "
+LIST_ITEM1 (U"Example: \"b\\$ \" matches a \"b\" at the end of a line.")
+LIST_ITEM1 (U"Example: \"\\^ b\\$ \" matches the empty line.")
+TAG (U"##{ }#    the open and close curly bracket are used as range @@Regular "
 	"expressions 2. Quantifiers|quantifiers at .")
-LIST_ITEM1 (L"Example: \"a{2,3}\" matches \"aa\" or \"aaa\".")
-TAG (L"##[ ]#    the open and close square bracket define a character class to "
+LIST_ITEM1 (U"Example: \"a{2,3}\" matches \"aa\" or \"aaa\".")
+TAG (U"##[ ]#    the open and close square bracket define a character class to "
 	"match a %single character.")
-DEFINITION (L"The \"\\^ \" as the first character following the \"[\" negates "
+DEFINITION (U"The \"\\^ \" as the first character following the \"[\" negates "
 	"and the match is for the characters %not listed. "
 	"The \"-\" denotes a range of characters. Inside a \"[  ]\" character "
 	"class construction most special characters are interpreted as ordinary "
 	"characters. ")
-LIST_ITEM1 (L"Example: \"[d-f]\" is the same as \"[def]\" and matches \"d\", "
+LIST_ITEM1 (U"Example: \"[d-f]\" is the same as \"[def]\" and matches \"d\", "
 	"\"e\" or \"f\".")
-LIST_ITEM1 (L"Example: \"[a-z]\" matches any lowercase characters in the "
+LIST_ITEM1 (U"Example: \"[a-z]\" matches any lowercase characters in the "
 	"alfabet.")
-LIST_ITEM1 (L"Example: \"[\\^ 0-9]\" matches any character that is not a digit.")
-LIST_ITEM1 (L"Example: A search for \"[][()?<>$^.*?^]\" in the string "
+LIST_ITEM1 (U"Example: \"[\\^ 0-9]\" matches any character that is not a digit.")
+LIST_ITEM1 (U"Example: A search for \"[][()?<>$^.*?^]\" in the string "
 	"\"[]()?<>$^.*?^\" followed by a replace string \"r\" has the result "
 	"\"rrrrrrrrrrrrr\". Here the search string is %one character class and "
 	"all the meta characters are interpreted as ordinary characters without "
 	"the need to escape them.")
-TAG (L"##( )#    the open and close parenthesis are used for grouping "
+TAG (U"##( )#    the open and close parenthesis are used for grouping "
 	"characters (or other regex).")
-DEFINITION (L"The groups can be referenced in "
+DEFINITION (U"The groups can be referenced in "
 	"both the search and the @@Regular expressions 8. Substitution special "
 	"characters|substitution@ phase. There also exist some @@Regular "
 	"expressions 4. Special constructs with parenthesis|special constructs "
 	"with parenthesis at .")
-LIST_ITEM1 (L"Example: \"(ab)\\bs1\" matches \"abab\".")
-TAG (L"##.#    the dot matches any character except the newline.")
-LIST_ITEM1 (L"Example: \".a\" matches two consecutive characters where "
+LIST_ITEM1 (U"Example: \"(ab)\\bs1\" matches \"abab\".")
+TAG (U"##.#    the dot matches any character except the newline.")
+LIST_ITEM1 (U"Example: \".a\" matches two consecutive characters where "
 	"the last one is \"a\".")
-LIST_ITEM1 (L"Example: \".*\\bs.txt\\$ \" matches all strings that end in "
+LIST_ITEM1 (U"Example: \".*\\bs.txt\\$ \" matches all strings that end in "
 	"\".txt\".")
-TAG (L"##*#    the star is the match-zero-or-more @@Regular expressions 2. "
+TAG (U"##*#    the star is the match-zero-or-more @@Regular expressions 2. "
 	"Quantifiers|quantifier at .")
-LIST_ITEM1 (L"Example: \"\\^ .*\\$ \" matches an entire line. ")
-TAG (L"##+#    the plus is the match-one-or-more quantifier.")
-TAG (L"##?#    the question mark is the match-zero-or-one "
+LIST_ITEM1 (U"Example: \"\\^ .*\\$ \" matches an entire line. ")
+TAG (U"##+#    the plus is the match-one-or-more quantifier.")
+TAG (U"##?#    the question mark is the match-zero-or-one "
 	"quantifier. The question mark is also used in  "
 	"@@Regular expressions 4. Special constructs with parenthesis|special "
 	"constructs with parenthesis@ and in @@Regular expressions 2. "
 	"Quantifiers|changing match behaviour at .")
-TAG (L"##\\| #    the vertical pipe separates a series of alternatives.")
-LIST_ITEM1 (L"Example: \"(a|b|c)a\" matches \"aa\" or \"ba\" or \"ca\".")
-TAG (L"##< >#    the smaller and greater signs are @@Regular expressions 3. "
+TAG (U"##\\| #    the vertical pipe separates a series of alternatives.")
+LIST_ITEM1 (U"Example: \"(a|b|c)a\" matches \"aa\" or \"ba\" or \"ca\".")
+TAG (U"##< >#    the smaller and greater signs are @@Regular expressions 3. "
 	"Anchors|anchors@ that specify a left or right word boundary.")
-TAG (L"##-#    the minus indicates a range in a character class (when it is "
+TAG (U"##-#    the minus indicates a range in a character class (when it is "
 	"not at the first position after the \"[\" opening bracket or the last "
 	"position before the \"]\" closing bracket.")
-LIST_ITEM1 (L"Example: \"[A-Z]\" matches any uppercase character.")
-LIST_ITEM1 (L"Example: \"[A-Z-]\" or \"[-A-Z]\" match any uppercase character "
+LIST_ITEM1 (U"Example: \"[A-Z]\" matches any uppercase character.")
+LIST_ITEM1 (U"Example: \"[A-Z-]\" or \"[-A-Z]\" match any uppercase character "
 	"or \"-\".")
-TAG (L"##&#    the and is the \"substitute complete match\" symbol.")
+TAG (U"##&#    the and is the \"substitute complete match\" symbol.")
 MAN_END
 
-MAN_BEGIN (L"Regular expressions 2. Quantifiers", L"djmw", 20010708)
-INTRO (L"Quantifiers specify how often the preceding @@Regular expressions|"
+MAN_BEGIN (U"Regular expressions 2. Quantifiers", U"djmw", 20010708)
+INTRO (U"Quantifiers specify how often the preceding @@Regular expressions|"
 	"regular expression@ should match.")
-TAG (L"##*#   Try to match the preceding regular expression zero or more times.")
-LIST_ITEM1 (L"Example: \"(ab)c*\" matches \"ab\" followed by zero or more "
+TAG (U"##*#   Try to match the preceding regular expression zero or more times.")
+LIST_ITEM1 (U"Example: \"(ab)c*\" matches \"ab\" followed by zero or more "
 	"\"c\"s, i.e., \"ab\", \"abc\", \"abcc\", \"abccc\" ...")
-TAG (L"##+#   Try to match the preceding regular expression one or more times.")
-LIST_ITEM1 (L"Example: \"(ab)c+\" matches \"ab\" followed by one or more "
+TAG (U"##+#   Try to match the preceding regular expression one or more times.")
+LIST_ITEM1 (U"Example: \"(ab)c+\" matches \"ab\" followed by one or more "
 	"\"c\"s, i.e., \"abc\", \"abcc\", \"abccc\" ...")
-TAG (L"##{%m, %n}#   Try to match the preceding regular expression between %m "
+TAG (U"##{%m, %n}#   Try to match the preceding regular expression between %m "
 	"and %n times.")
-DEFINITION (L"If you leave %m out, it is assumed to be zero. If you leave "
+DEFINITION (U"If you leave %m out, it is assumed to be zero. If you leave "
 	"%n out it is assumed to be infinity. I.e., \"{,%n}\" matches from %zero "
 	"to %n times, \"{%m,}\" matches a minimum of %m times, \"{,}\" matches "
 	"the same as \"*\" and \"{n}\" is shorthand for \"{n, n\"} and matches "
 	"exactly %n times.")
-LIST_ITEM1 (L"Example: \"(ab){1,2}\" matches \"ab\" and \"abab\".")
-TAG (L"##?#   Try to match zero or one time.")
-ENTRY (L"Changing match behaviour")
-NORMAL (L"Default the quantifiers above try to match as much as possible, they "
+LIST_ITEM1 (U"Example: \"(ab){1,2}\" matches \"ab\" and \"abab\".")
+TAG (U"##?#   Try to match zero or one time.")
+ENTRY (U"Changing match behaviour")
+NORMAL (U"Default the quantifiers above try to match as much as possible, they "
 	"are %greedy. "
 	"You can change greedy behaviour to %lazy behaviour by adding an "
 	"extra \"?\" after the quantifier.")
-LIST_ITEM1 (L"Example: In the string \"cabddde\", the search \"abd{1,2}\" "
+LIST_ITEM1 (U"Example: In the string \"cabddde\", the search \"abd{1,2}\" "
 	"matches \"abdd\", while the search for \"abd{1,2}?\" matches \"abd\".")
-LIST_ITEM1 (L"Example: In the string \"cabddde\", the search \"abd+\" "
+LIST_ITEM1 (U"Example: In the string \"cabddde\", the search \"abd+\" "
 	"matches \"abddd\", while the search for \"abd+?\" matches \"abd\".")
 MAN_END
 
-MAN_BEGIN (L"Regular expressions 3. Anchors", L"djmw", 20010708)
-INTRO (L"Anchors let you specify a very specific position within the search "
+MAN_BEGIN (U"Regular expressions 3. Anchors", U"djmw", 20010708)
+INTRO (U"Anchors let you specify a very specific position within the search "
 	"text.")
-TAG (L"##\\^ #   Try to match the (following) regex at the beginning of a line.")
-LIST_ITEM1 (L"Example: \"\\^ ab\" matches \"ab\" only at the beginning of a "
+TAG (U"##\\^ #   Try to match the (following) regex at the beginning of a line.")
+LIST_ITEM1 (U"Example: \"\\^ ab\" matches \"ab\" only at the beginning of a "
 	"line and not, for example, in the line \"cab\".")
-TAG (L"##\\$ #   Try to match the (following) regex at the end of a line.")
-TAG (L"##<#    Try to match the regex at the %start of a word.")
-DEFINITION (L"The character class that defines a %word can be found at the "
+TAG (U"##\\$ #   Try to match the (following) regex at the end of a line.")
+TAG (U"##<#    Try to match the regex at the %start of a word.")
+DEFINITION (U"The character class that defines a %word can be found at the "
 	"@@Regular expressions 6. Convenience escape sequences|convenience escape "
 	"sequences@ page.")
-TAG (L"##>#    Try to match the regex at the %end of a word.")
-TAG (L"##\\bsB#   Not a word boundary")
-DEFINITION (L"")
+TAG (U"##>#    Try to match the regex at the %end of a word.")
+TAG (U"##\\bsB#   Not a word boundary")
+DEFINITION (U"")
 MAN_END
 
-MAN_BEGIN (L"Regular expressions 4. Special constructs with parenthesis", L"djmw",
+MAN_BEGIN (U"Regular expressions 4. Special constructs with parenthesis", U"djmw",
 	20010710)
-INTRO (L"Some special constructs exist with parenthesis. ")
-TAG (L"##(?:#%regex#)#   is a grouping-only construct.")
-DEFINITION (L"They exist merely for efficiency reasons and facilitate grouping.")
-TAG (L"##(?=#%regex#)#   is a positive look-ahead.")
-DEFINITION (L"A match of the regular expression contained in the positive "
+INTRO (U"Some special constructs exist with parenthesis. ")
+TAG (U"##(?:#%regex#)#   is a grouping-only construct.")
+DEFINITION (U"They exist merely for efficiency reasons and facilitate grouping.")
+TAG (U"##(?=#%regex#)#   is a positive look-ahead.")
+DEFINITION (U"A match of the regular expression contained in the positive "
 	"look-ahead construct is attempted. If the match succeeds, control is "
 	"passed to the regex following this construct and the text consumed by "
 	"this look-ahead construct is first unmatched. ")
-TAG (L"##(?!#%regex#)#   is a negative look-ahead.")
-DEFINITION (L"Functions like a positive look-ahead, only the "
+TAG (U"##(?!#%regex#)#   is a negative look-ahead.")
+DEFINITION (U"Functions like a positive look-ahead, only the "
 	"%regex must %not match.")
-LIST_ITEM (L"Example: \"abc(?!.*abc.*)\" searches for the %last "
+LIST_ITEM (U"Example: \"abc(?!.*abc.*)\" searches for the %last "
 	"occurrence of \"abc\" in a string.")
-TAG (L"##(?i#%regex#)#   is a case insensitive regex.")
-TAG (L"##(?I#%regex#)#   is a case sensitive regex.")
-DEFINITION (L"Default a regex is case sensitive. ")
-LIST_ITEM1 (L"Example: \"(?iaa)\" matches \"aa\", \"aA\", \"Aa\" and \"AA\".")
-TAG (L"##(?n#%regex#)#   matches newlines.")
-TAG (L"##(?N#%regex#)#   doesn't match newlines.")
-NORMAL (L"All the constructs above do not capture text and cannot be "
+TAG (U"##(?i#%regex#)#   is a case insensitive regex.")
+TAG (U"##(?I#%regex#)#   is a case sensitive regex.")
+DEFINITION (U"Default a regex is case sensitive. ")
+LIST_ITEM1 (U"Example: \"(?iaa)\" matches \"aa\", \"aA\", \"Aa\" and \"AA\".")
+TAG (U"##(?n#%regex#)#   matches newlines.")
+TAG (U"##(?N#%regex#)#   doesn't match newlines.")
+NORMAL (U"All the constructs above do not capture text and cannot be "
 	"referenced, i.e., the parenthesis are not counted. However, you "
 	"can make them capture text by surrounding them with %ordinary "
 	"parenthesis.")
 MAN_END
 
-MAN_BEGIN (L"Regular expressions 5. Special control characters", L"djmw", 20010708)
-INTRO (L"Special control characters in a @@Regular expressions|regular "
+MAN_BEGIN (U"Regular expressions 5. Special control characters", U"djmw", 20010708)
+INTRO (U"Special control characters in a @@Regular expressions|regular "
 	"expression@ specify characters that are difficult to type.")
-TAG (L"#\\bsa  alert (bell).")
-TAG (L"#\\bsb  backspace.")
-TAG (L"#\\bse  ASCII escape character.")
-TAG (L"#\\bsf  form feed (new page).")
-TAG (L"#\\bsn  newline.")
-TAG (L"#\\bsr  carriage return.")
-LIST_ITEM1 (L"Example : a search for \"\\bsr\\bsn\" followed by a replace "
+TAG (U"#\\bsa  alert (bell).")
+TAG (U"#\\bsb  backspace.")
+TAG (U"#\\bse  ASCII escape character.")
+TAG (U"#\\bsf  form feed (new page).")
+TAG (U"#\\bsn  newline.")
+TAG (U"#\\bsr  carriage return.")
+LIST_ITEM1 (U"Example : a search for \"\\bsr\\bsn\" followed by a replace "
 	"\"\\bsr\" changes Windows text files to Macintosh text files.")
-LIST_ITEM1 (L"Example : a search for \"\\bsr\" followed by a replace "
+LIST_ITEM1 (U"Example : a search for \"\\bsr\" followed by a replace "
 	"\"\\bsn\" changes Macintosh text files to Unix text files.")
-LIST_ITEM1 (L"Example : a search for \"\\bsr\\bsn\" followed by a replace "
+LIST_ITEM1 (U"Example : a search for \"\\bsr\\bsn\" followed by a replace "
 	"\"\\bsn\" changes Windows text files to Unix text files.")
-TAG (L"#\\bst  horizontal tab.")
-TAG (L"#\\bsv  vertical tab.")
+TAG (U"#\\bst  horizontal tab.")
+TAG (U"#\\bsv  vertical tab.")
 MAN_END
 
-MAN_BEGIN (L"Regular expressions 6. Convenience escape sequences", L"djmw", 20010708)
-INTRO (L"Convenience escape sequences in a @@Regular expressions|regular "
+MAN_BEGIN (U"Regular expressions 6. Convenience escape sequences", U"djmw", 20010708)
+INTRO (U"Convenience escape sequences in a @@Regular expressions|regular "
 	"expression@ present a shorthand for some character classes.")
-TAG (L"#\\bsd  matches a digit: [0-9].")
-LIST_ITEM1 (L"Example: \"-?\\bsd+\" matches any integer.")
-TAG (L"#\\bsD  %not a digit: [\\^ 0-9].")
-TAG (L"#\\bsl  a letter: [a-zA-Z].")
-TAG (L"#\\bsL  %not a letter: [\\^ a-zA-Z].")
-TAG (L"#\\bss  whitespace: [ \\bst\\bsn\\bsr\\bsf\\bsv].")
-TAG (L"#\\bsS  %not whitespace: [\\^  \\bst\\bsn\\bsr\\bsf\\bsv].")
-TAG (L"#\\bsw  \"word\" character: [a-zA-Z0-9\\_ ].")
-LIST_ITEM1 (L"Example: \"\\bsw+\" matches a \"word\", i.e., a string of one "
+TAG (U"#\\bsd  matches a digit: [0-9].")
+LIST_ITEM1 (U"Example: \"-?\\bsd+\" matches any integer.")
+TAG (U"#\\bsD  %not a digit: [\\^ 0-9].")
+TAG (U"#\\bsl  a letter: [a-zA-Z].")
+TAG (U"#\\bsL  %not a letter: [\\^ a-zA-Z].")
+TAG (U"#\\bss  whitespace: [ \\bst\\bsn\\bsr\\bsf\\bsv].")
+TAG (U"#\\bsS  %not whitespace: [\\^  \\bst\\bsn\\bsr\\bsf\\bsv].")
+TAG (U"#\\bsw  \"word\" character: [a-zA-Z0-9\\_ ].")
+LIST_ITEM1 (U"Example: \"\\bsw+\" matches a \"word\", i.e., a string of one "
 	"or more characters that may consist of letters, digits and underscores.")
-TAG (L"#\\bsW  %not a \"word\" character: [\\^ a-zA-Z0-9\\_ ].")
-TAG (L"#\\bsB  any character that is %not a word-delimiter.")
+TAG (U"#\\bsW  %not a \"word\" character: [\\^ a-zA-Z0-9\\_ ].")
+TAG (U"#\\bsB  any character that is %not a word-delimiter.")
 MAN_END
 
-MAN_BEGIN (L"Regular expressions 7. Octal and hexadecimal escapes", L"djmw", 20010709)
-INTRO (L"An octal number can be represented by the octal escape \"\\bs0\" "
+MAN_BEGIN (U"Regular expressions 7. Octal and hexadecimal escapes", U"djmw", 20010709)
+INTRO (U"An octal number can be represented by the octal escape \"\\bs0\" "
 	"and maximally three digits from the digit class [0-7]. "
 	"The octal number should not exceed \\bs0377. ")
-NORMAL (L"A hexadecimal number can be represented by the octal escape "
+NORMAL (U"A hexadecimal number can be represented by the octal escape "
 	"\"\\bsx\" or \"\\bsX\"and maximally two characters from the class "
 	"[0-9A-F]. The maximum hexadecimal number should not exceed \\bsxFF. ")
-LIST_ITEM1 (L"Example: \\bs053 and \\bsX2B both specify the \"+\" character.")
+LIST_ITEM1 (U"Example: \\bs053 and \\bsX2B both specify the \"+\" character.")
 MAN_END
 
-MAN_BEGIN (L"Regular expressions 8. Substitution special characters", L"djmw", 20010708)
-INTRO (L"The substitution string is mostly interpreted as ordinary text except "
+MAN_BEGIN (U"Regular expressions 8. Substitution special characters", U"djmw", 20010708)
+INTRO (U"The substitution string is mostly interpreted as ordinary text except "
 	"for the @@Regular expressions 5. Special control characters|"
 	"special control characters@, the @@Regular expressions 7. Octal and "
 	"hexadecimal escapes|octal and hexadecimal escapes@ and the following "
 	"character combinations:")
-TAG (L"#\\bs1 ... #\\bs9    are backreferences at sub-expressions 1 ... 9 in the match.")
-DEFINITION (L"Any of the first nine sub-expressions of the match string can "
+TAG (U"#\\bs1 ... #\\bs9    are backreferences at sub-expressions 1 ... 9 in the match.")
+DEFINITION (U"Any of the first nine sub-expressions of the match string can "
 	"be inserted into the replacement string by inserting a `\\bs' followed "
 	"by a digit from 1 to 9 that represents the string matched by a "
 	"parenthesized expression within the regular expression. The numbering "
 	"is left to right.")
-LIST_ITEM1 (L"Example: A search for \"(a)(b)\" in the string \"abc\", "
+LIST_ITEM1 (U"Example: A search for \"(a)(b)\" in the string \"abc\", "
 	"followed by a replace \"\\bs2\\bs1\" results in \"bac\".")
-TAG (L"#&    reference at entire match.")
-DEFINITION (L"The entire string that was matched by the search operation will "
+TAG (U"#&    reference at entire match.")
+DEFINITION (U"The entire string that was matched by the search operation will "
 	"be substituted.")
-LIST_ITEM1 (L"Example: a search for \".\" in the string \"abcd\" followed by "
+LIST_ITEM1 (U"Example: a search for \".\" in the string \"abcd\" followed by "
 	"the replace \"&&\" doubles every character in the result "
 	"\"aabbccdd\".")
-TAG (L"#\\bsU #\\bsu    to uppercase.")
-DEFINITION (L"The text inserted by \"&\" or \"\\bs1\" ... \"\\bs9\" is "
+TAG (U"#\\bsU #\\bsu    to uppercase.")
+DEFINITION (U"The text inserted by \"&\" or \"\\bs1\" ... \"\\bs9\" is "
 	"converted to %uppercase (\"\\bsu\" only changes the %first character to "
 	"uppercase).")
-LIST_ITEM1 (L"Example: A search for \"(aa)\" in the string \"aabb\", "
+LIST_ITEM1 (U"Example: A search for \"(aa)\" in the string \"aabb\", "
 	"followed by a replace \"\\bsU\\bs1bc\" results in the string \"AAbcbb\".")
-TAG (L"#\\bsL #\\bsl    to lowercase.")
-DEFINITION (L"The text inserted by \"&\" or \"\\bs1\" ... \"\\bs9\" is "
+TAG (U"#\\bsL #\\bsl    to lowercase.")
+DEFINITION (U"The text inserted by \"&\" or \"\\bs1\" ... \"\\bs9\" is "
 	"converted to %lowercase (\"\\bsl\" only changes the %first character to "
 	"lowercase).")
-LIST_ITEM1 (L"Example: A search for \"(AA)\" with a replace \"\\bsl\\bs1bc\" "
+LIST_ITEM1 (U"Example: A search for \"(AA)\" with a replace \"\\bsl\\bs1bc\" "
 	"in the string \"AAbb\" results in the string \"aAbcbb\".")
 MAN_END
 
-MAN_BEGIN (L"Roots", L"djmw", 19990608)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type Roots "
+MAN_BEGIN (U"Roots", U"djmw", 19990608)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type Roots "
 	"represents the (complex) roots of a @@Polynomial|polynomial@ function.")
-ENTRY (L"Commands")
-NORMAL (L"Creation")
-LIST_ITEM (L"\\bu @@Polynomial: To Roots@")
-NORMAL (L"Drawing")
-LIST_ITEM (L"\\bu ##Draw...# (in the complex plane)")
-NORMAL (L"Queries")
-LIST_ITEM (L"\\bu ##Get root...#: get complex root")
-LIST_ITEM (L"\\bu ##Get real part of root...#")
-LIST_ITEM (L"\\bu ##Get imaginary part of root...#")
-MAN_END
-
-MAN_BEGIN (L"Scree plot", L"djmw", 20040331)
-NORMAL (L"A scree plot shows the sorted eigenvalues, from large to "
+ENTRY (U"Commands")
+NORMAL (U"Creation")
+LIST_ITEM (U"\\bu @@Polynomial: To Roots@")
+NORMAL (U"Drawing")
+LIST_ITEM (U"\\bu ##Draw...# (in the complex plane)")
+NORMAL (U"Queries")
+LIST_ITEM (U"\\bu ##Get root...#: get complex root")
+LIST_ITEM (U"\\bu ##Get real part of root...#")
+LIST_ITEM (U"\\bu ##Get imaginary part of root...#")
+MAN_END
+
+MAN_BEGIN (U"Scree plot", U"djmw", 20040331)
+NORMAL (U"A scree plot shows the sorted eigenvalues, from large to "
 	"small, as a function of the eigenvalue index.")
 MAN_END
 
-MAN_BEGIN (L"singular value decomposition", L"djmw", 20120510)
-INTRO (L"The %%singular value decomposition% (SVD) is a matrix factorization algorithm.")
-NORMAL (L"For %m > %n, the singular value decomposition of a real %m \\xx %n matrix #A is the "
+MAN_BEGIN (U"singular value decomposition", U"djmw", 20120510)
+INTRO (U"The %%singular value decomposition% (SVD) is a matrix factorization algorithm.")
+NORMAL (U"For %m > %n, the singular value decomposition of a real %m \\xx %n matrix #A is the "
 	"factorization")
-FORMULA (L"#A = #U #\\Si #V\\'p,")
-NORMAL (L"The matrices in this factorization have the following properties:")
-TAG (L"#U [%m \\xx %n] and #V [%n \\xx %n]")
-DEFINITION (L"are orthogonal matrices. The columns #u__%i_ of #U =[#u__1_, ..., #u__%n_] "
+FORMULA (U"#A = #U #\\Si #V\\'p,")
+NORMAL (U"The matrices in this factorization have the following properties:")
+TAG (U"#U [%m \\xx %n] and #V [%n \\xx %n]")
+DEFINITION (U"are orthogonal matrices. The columns #u__%i_ of #U =[#u__1_, ..., #u__%n_] "
 	"are the %%left singular vectors%, and the columns #v__%i_ of #V [#v__1_, ..., #v__%n_] "
 	"are the %%right singular vectors%.")
-TAG (L"#\\Si [%n \\xx %n] = diag (%\\si__1_, ..., %\\si__%n_)")
-DEFINITION (L"is a real, nonnegative, and diagonal matrix. Its diagonal contains the so called "
+TAG (U"#\\Si [%n \\xx %n] = diag (%\\si__1_, ..., %\\si__%n_)")
+DEFINITION (U"is a real, nonnegative, and diagonal matrix. Its diagonal contains the so called "
 	"%%singular values% %\\si__%i_, where %\\si__1_ \\>_ ... \\>_ %\\si__%n_ \\>_ 0.")
-NORMAL (L"If %m < %n, the decomposition results in #U [%m \\xx %m] and #V [%n \\xx %m].")
+NORMAL (U"If %m < %n, the decomposition results in #U [%m \\xx %m] and #V [%n \\xx %m].")
 MAN_END
 
-MAN_BEGIN (L"Sound & Pitch: Change speaker...", L"djmw", 20070722)
-INTRO (L"A command to create a new Sound object with manipulated characteristics "
+MAN_BEGIN (U"Sound & Pitch: Change speaker...", U"djmw", 20070722)
+INTRO (U"A command to create a new Sound object with manipulated characteristics "
 	"from the selected @Sound and @Pitch.")
-NORMAL (L"With this command you can have finer grained control over the "
+NORMAL (U"With this command you can have finer grained control over the "
 	"pitch than with the @@Sound: Change speaker...@ command. "
 	"Accurate pitch measurement determines the quality of the "
 	"@@overlap-add@ synthesis." )
-ENTRY (L"Settings")
-NORMAL (L"The settings are described in @@Sound: Change speaker... at . ")
+ENTRY (U"Settings")
+NORMAL (U"The settings are described in @@Sound: Change speaker... at . ")
 MAN_END
 
-MAN_BEGIN (L"Sound & Pitch: Change gender...", L"djmw", 20070722)
-/* INTRO (L"Deprecated: use @@Sound & Pitch: Change speaker...@") */
-NORMAL (L"A command to create a new Sound object with manipulated characteristics "
+MAN_BEGIN (U"Sound & Pitch: Change gender...", U"djmw", 20070722)
+/* INTRO (U"Deprecated: use @@Sound & Pitch: Change speaker...@") */
+NORMAL (U"A command to create a new Sound object with manipulated characteristics "
 	"from the selected @Sound and @Pitch.")
-NORMAL (L"With this command you can have finer grained control over the "
+NORMAL (U"With this command you can have finer grained control over the "
 	"pitch than with the @@Sound: Change gender...@ command. "
 	"Accurate pitch measurement determines the quality of the "
 	"@@overlap-add@ synthesis." )
-ENTRY (L"Settings")
-NORMAL (L"The settings are described in @@Sound: Change gender... at . ")
-MAN_END
-
-MAN_BEGIN (L"Sound: Change gender...", L"djmw", 20030205)
-/* INTRO (L"Deprecated: use @@Sound: Change speaker...@") */
-NORMAL (L"A command to create a new @Sound with manipulated characteristics.")
-ENTRY (L"Settings")
-NORMAL (L"The quality of the @@overlap-add|manipulation@ depends on the pitch measurement.")
-NORMAL (L"The arguments that control the pitch measurement are:")
-TAG (L"##Minimum pitch (Hz)# (standard value: 75 Hz)")
-DEFINITION (L"pitch candidates below this frequency will not be considered.")
-TAG (L"##%Maximum pitch (Hz)# (standard value: 600 Hz)")
-DEFINITION (L"pitch candidates above this frequency will be ignored.")
-NORMAL (L"The arguments that control the manipulation are:")
-TAG (L"##Formant shift ratio")
-DEFINITION (L"determines the frequencies of the formants in the newly created "
+ENTRY (U"Settings")
+NORMAL (U"The settings are described in @@Sound: Change gender... at . ")
+MAN_END
+
+MAN_BEGIN (U"Sound: Change gender...", U"djmw", 20030205)
+/* INTRO (U"Deprecated: use @@Sound: Change speaker...@") */
+NORMAL (U"A command to create a new @Sound with manipulated characteristics.")
+ENTRY (U"Settings")
+NORMAL (U"The quality of the @@overlap-add|manipulation@ depends on the pitch measurement.")
+NORMAL (U"The arguments that control the pitch measurement are:")
+TAG (U"##Minimum pitch (Hz)# (standard value: 75 Hz)")
+DEFINITION (U"pitch candidates below this frequency will not be considered.")
+TAG (U"##%Maximum pitch (Hz)# (standard value: 600 Hz)")
+DEFINITION (U"pitch candidates above this frequency will be ignored.")
+NORMAL (U"The arguments that control the manipulation are:")
+TAG (U"##Formant shift ratio")
+DEFINITION (U"determines the frequencies of the formants in the newly created "
 	"Sound. If this ratio equals 1 no frequency shift will occur and "
 	"the formant frequencies will not change. A ratio of 1.1 will change "
 	"a male voice to a voice with approximate female formant characteristics. "
 	"A ratio of 1/1.1 will change a female voice to a voice with approximate male formant "
 	"characteristics.")
-TAG (L"##New pitch median (Hz)# (standard value: 0.0 Hz, i.e. same as original)")
-DEFINITION (L"determines what the median pitch of the new Sound will be. "
+TAG (U"##New pitch median (Hz)# (standard value: 0.0 Hz, i.e. same as original)")
+DEFINITION (U"determines what the median pitch of the new Sound will be. "
 	"The pitch values in the newly created Sound will be calculated from the pitch "
 	"values in the selected Sound by multiplying them by a factor "
 	"%%newPitchMedian / oldPitchMedian%. This factor equals 1.0 if the default "
 	"value for the new pitch median (0.0) is chosen. ")
-TAG (L"##Pitch range factor# (standard value: 1.0)")
-DEFINITION (L"determines an %extra% scaling of the new pitch values around the %new% "
+TAG (U"##Pitch range factor# (standard value: 1.0)")
+DEFINITION (U"determines an %extra% scaling of the new pitch values around the %new% "
 	"pitch median. A factor of 1.0 means that no additional pitch modification will occur "
 	"(except the obvious one described above). A factor of 0.0 monotonizes the new "
 	"sound to the new pitch median.")
-TAG (L"##Duration factor# (standard value: 1.0)")
-DEFINITION (L"The factor with which the sound will be lengthened. The default is 1.0. "
+TAG (U"##Duration factor# (standard value: 1.0)")
+DEFINITION (U"The factor with which the sound will be lengthened. The default is 1.0. "
 	"If you take a value less than 1.0, the resulting sound will be shorter than "
 	"the original. A value larger than 3.0 will not work.")
-NORMAL (L"If you want more control over the synthesis you can supply your own "
+NORMAL (U"If you want more control over the synthesis you can supply your own "
 	"Pitch object and use the @@Sound & Pitch: Change gender...@ command. ")
-ENTRY (L"Algorithm")
-NORMAL (L"The shifting of frequencies is done via manipulation of the sampling frequency. "
+ENTRY (U"Algorithm")
+NORMAL (U"The shifting of frequencies is done via manipulation of the sampling frequency. "
 	"Pitch and duration changes are generated with @@overlap-add@ synthesis.")
-NORMAL (L"The new pitch values are calculated in a two step process. We first multiply all "
+NORMAL (U"The new pitch values are calculated in a two step process. We first multiply all "
 	"the pitches with the factor %%newPitchMedian / oldPitchMedian% according to:")
-FORMULA (L"%newPitch = %pitch * %newPitchMedian  / %oldPitchMedian.")
-NORMAL (L"It follows that if the %newPitchMedian equals the %oldPitchMedian no "
+FORMULA (U"%newPitch = %pitch * %newPitchMedian  / %oldPitchMedian.")
+NORMAL (U"It follows that if the %newPitchMedian equals the %oldPitchMedian no "
 	"change in pitch values will occur in the first step.")
-NORMAL (L"Subsequently, the pitch range scale factor determines the final pitch values "
+NORMAL (U"Subsequently, the pitch range scale factor determines the final pitch values "
 	"in the following linear manner:")
-FORMULA (L"%finalPitch = %newPitchMedian + (%newPitch \\-- %newPitchMedian) * %pitchRangeScaleFactor")
-NORMAL (L"Hence, it follows that no further scaling occurs if %pitchRangeScaleFactor "
+FORMULA (U"%finalPitch = %newPitchMedian + (%newPitch \\-- %newPitchMedian) * %pitchRangeScaleFactor")
+NORMAL (U"Hence, it follows that no further scaling occurs if %pitchRangeScaleFactor "
 	"equals 1.0.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Change speaker...", L"djmw", 20080515)
-INTRO (L"A command to create a new @Sound with manipulated characteristics.")
-ENTRY (L"Settings")
-NORMAL (L"The quality of the @@overlap-add|manipulation@ depends on the pitch measurement.")
-NORMAL (L"The arguments that control the pitch measurement are:")
-TAG (L"##Pitch floor (Hz)# (standard value: 75 Hz)")
-DEFINITION (L"pitch candidates below this frequency will not be considered.")
-TAG (L"##Pitch ceiling (Hz)# (standard value: 600 Hz)")
-DEFINITION (L"pitch candidates above this frequency will be ignored.")
-NORMAL (L"The arguments that control the manipulation are:")
-TAG (L"##Multiply formants by")
-DEFINITION (L"determines the formant frequencies of the newly created sound. "
+MAN_BEGIN (U"Sound: Change speaker...", U"djmw", 20080515)
+INTRO (U"A command to create a new @Sound with manipulated characteristics.")
+ENTRY (U"Settings")
+NORMAL (U"The quality of the @@overlap-add|manipulation@ depends on the pitch measurement.")
+NORMAL (U"The arguments that control the pitch measurement are:")
+TAG (U"##Pitch floor (Hz)# (standard value: 75 Hz)")
+DEFINITION (U"pitch candidates below this frequency will not be considered.")
+TAG (U"##Pitch ceiling (Hz)# (standard value: 600 Hz)")
+DEFINITION (U"pitch candidates above this frequency will be ignored.")
+NORMAL (U"The arguments that control the manipulation are:")
+TAG (U"##Multiply formants by")
+DEFINITION (U"determines the formant frequencies of the newly created sound. "
 	"The formant frequency of the new sound will equal the formant frequencies of the selected sound multiplied by this number. "
 	"If this number equals 1, formant frequencies will not change. A number of 1.1 will change "
 	"a male voice to a voice with approximate female formant characteristics. "
 	"A ratio of 1/1.1 will change a female voice to a voice with approximate male formant "
 	"characteristics.")
-TAG (L"##Multiply pitch by")
-DEFINITION (L"determines what the pitch of the new Sound will be. "
+TAG (U"##Multiply pitch by")
+DEFINITION (U"determines what the pitch of the new Sound will be. "
 	"The pitch values of the new sound will equal the pitch values of the selected sound multiplied by this number. A value of 1.8 will  approximately change a male's pitch to a female's pitch.")
-TAG (L"##Multiply pitch range by# (standard value: 1.0)")
-DEFINITION (L"determines the pitch range of the newly created sound. "
+TAG (U"##Multiply pitch range by# (standard value: 1.0)")
+DEFINITION (U"determines the pitch range of the newly created sound. "
 	"A factor of 1.0 means that no additional pitch modification will occur "
 	"(except the obvious one described above). A factor of 0.0 monotonizes the new "
 	"sound to the new pitch median. A negative number inverses the pitch range with respect to the median.")
-TAG (L"##Multiply duration by# (standard value: 1.0)")
-DEFINITION (L"determines how to modify the duration of the newly created sound. "
+TAG (U"##Multiply duration by# (standard value: 1.0)")
+DEFINITION (U"determines how to modify the duration of the newly created sound. "
 	"A value of 1.0 means that the new sound will have the same duration as the selected sound. "
 	"A value less than 1.0 will result in a shortened new sound. A value larger than 2.5 will not work.")
-NORMAL (L"If you want more control over the synthesis you can supply your own "
+NORMAL (U"If you want more control over the synthesis you can supply your own "
 	"Pitch object and use the @@Sound & Pitch: Change speaker...@ command. ")
-ENTRY (L"Algorithm")
-NORMAL (L"The shifting of formant frequencies is done via manipulation of the sampling frequency. "
+ENTRY (U"Algorithm")
+NORMAL (U"The shifting of formant frequencies is done via manipulation of the sampling frequency. "
 	"To multiply all formants by a factor of 1.10 (i.e. raising them by 10 percent), a sampling "
 	"frequency of 44100 Hz is first raised to 48510 Hz (without changing "
 	"the samples). After this, the sound is lengthened by a factor of 1.10 "
@@ -3378,35 +3378,35 @@ NORMAL (L"The shifting of formant frequencies is done via manipulation of the sa
 	"Pitch and duration changes are generated with @@overlap-add@ synthesis.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Remove noise...", L"djmw", 20121122)
-INTRO (L"A command to suppress noise in the selected @Sound.")
-ENTRY (L"Settings")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (5), L""
+MAN_BEGIN (U"Sound: Remove noise...", U"djmw", 20121122)
+INTRO (U"A command to suppress noise in the selected @Sound.")
+ENTRY (U"Settings")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (5), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Sound: Remove noise...", 5)
-	Manual_DRAW_SETTINGS_WINDOW_RANGE(L"Noise time range (s)", L"0.0", L"0.0")
-	Manual_DRAW_SETTINGS_WINDOW_FIELD(L"Window length (s)", L"0.025")
-	Manual_DRAW_SETTINGS_WINDOW_RANGE(L"Filter frequency range (Hz)", L"80.0", L"10000.0")
-	Manual_DRAW_SETTINGS_WINDOW_FIELD(L"Smoothing (Hz)", L"40.0")
-	Manual_DRAW_SETTINGS_WINDOW_OPTIONMENU(L"Noise reduction method", L"Spectral subtraction")
+	Manual_DRAW_SETTINGS_WINDOW_RANGE(U"Noise time range (s)", U"0.0", U"0.0")
+	Manual_DRAW_SETTINGS_WINDOW_FIELD(U"Window length (s)", U"0.025")
+	Manual_DRAW_SETTINGS_WINDOW_RANGE(U"Filter frequency range (Hz)", U"80.0", U"10000.0")
+	Manual_DRAW_SETTINGS_WINDOW_FIELD(U"Smoothing (Hz)", U"40.0")
+	Manual_DRAW_SETTINGS_WINDOW_OPTIONMENU(U"Noise reduction method", U"Spectral subtraction")
 )
-TAG (L"##Noise time range (s)")
-DEFINITION (L"the start and end time of a noise part in the sound whose characteristics will be used in the denoising. "
+TAG (U"##Noise time range (s)")
+DEFINITION (U"the start and end time of a noise part in the sound whose characteristics will be used in the denoising. "
 	"If the end time is chosen before the start time, the noise fragment will be chosen automatically around a position "
 	"where the intensity is minimal. For good noise suppression it is important that the noise fragment's duration is chosen "
 	"several times the length of the window.")
-TAG (L"##Window length (s)")
-DEFINITION (L"denoising takes place in (overlapping) windows of this length.")
-TAG (L"##Filter frequency range (Hz)")
-DEFINITION (L"before denoising the sound will be @@Sound: Filter (pass Hann band)...|band-pass filtered at . ")
-TAG (L"##Noise reduction method")
-DEFINITION (L"The method of %%spectral subtraction% was defined in @@Boll (1979)@. The variant implemented is modeled "
+TAG (U"##Window length (s)")
+DEFINITION (U"denoising takes place in (overlapping) windows of this length.")
+TAG (U"##Filter frequency range (Hz)")
+DEFINITION (U"before denoising the sound will be @@Sound: Filter (pass Hann band)...|band-pass filtered at . ")
+TAG (U"##Noise reduction method")
+DEFINITION (U"The method of %%spectral subtraction% was defined in @@Boll (1979)@. The variant implemented is modeled "
 	"after a script by Ton Wempe.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Draw where...", L"djmw", 20140509)
-INTRO (L"A command to draw only those parts of a @Sound where a condition holds.")
-ENTRY (L"Settings")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (5), L""
+MAN_BEGIN (U"Sound: Draw where...", U"djmw", 20140509)
+INTRO (U"A command to draw only those parts of a @Sound where a condition holds.")
+ENTRY (U"Settings")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (5), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Sound: Draw where...", 5)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE("Time range (s)", "0.0", "0.0 (=all)")
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Vertical range", "0.0", "0.0 (=all)")
@@ -3415,154 +3415,154 @@ SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (5), L""
 	Manual_DRAW_SETTINGS_WINDOW_TEXT ("Draw only those parts where the following condition holds",
 		"x < xmin + (xmax - xmin) / 2; first half")
 )
-TAG (L"##Time range (s)")
-DEFINITION (L"selects the time domain for the drawing.")
-TAG (L"##Vertical range")
-DEFINITION (L"defines the vertical limits; larger amplitudes will be clipped.")
-TAG (L"##Draw only those parts where the following condition holds#")
-DEFINITION (L"determines the part of the sound that will be drawn. All parts where the formula evaluates to true will be drawn. "
+TAG (U"##Time range (s)")
+DEFINITION (U"selects the time domain for the drawing.")
+TAG (U"##Vertical range")
+DEFINITION (U"defines the vertical limits; larger amplitudes will be clipped.")
+TAG (U"##Draw only those parts where the following condition holds#")
+DEFINITION (U"determines the part of the sound that will be drawn. All parts where the formula evaluates to true will be drawn. "
 	"This formula may ##not# contain references to the sampling of the sound, i.e. don't use 'col', 'x1', 'dx' and 'ncol' in it.")
-ENTRY (L"Example 1")
-NORMAL (L"The following script draws all amplitudes larger than one in red.")
-CODE (L"Create Sound from formula: \"s\", \"Mono\", 0, 1, 2000, \"1.8*sin(2*pi*5*x)+randomGauss(0,0.1)\"")
-CODE (L"Colour: \"Red\"")
-CODE (L"Draw where: 0, 0, -2, 2, \"no\", \"Curve\", \"abs(self)>1\"")
-CODE (L"Colour: \"Black\"")
-CODE (L"Draw where: 0, 0, -2, 2, \"yes\", \"Curve\", \"not (abs(self)>1)\"")
+ENTRY (U"Example 1")
+NORMAL (U"The following script draws all amplitudes larger than one in red.")
+CODE (U"Create Sound from formula: \"s\", \"Mono\", 0, 1, 2000, \"1.8*sin(2*pi*5*x)+randomGauss(0,0.1)\"")
+CODE (U"Colour: \"Red\"")
+CODE (U"Draw where: 0, 0, -2, 2, \"no\", \"Curve\", \"abs(self)>1\"")
+CODE (U"Colour: \"Black\"")
+CODE (U"Draw where: 0, 0, -2, 2, \"yes\", \"Curve\", \"not (abs(self)>1)\"")
 SCRIPT (8, 3,
-	L"Create Sound from formula: \"s\", \"Mono\", 0, 1, 2000, \"1.8*sin(2*pi*5*x)+randomGauss(0,0.1)\"\n"
+	U"Create Sound from formula: \"s\", \"Mono\", 0, 1, 2000, \"1.8*sin(2*pi*5*x)+randomGauss(0,0.1)\"\n"
 	"Colour: \"Red\"\n"
 	"Draw where: 0, 0, -2, 2, \"no\", \"Curve\", \"abs(self)>1\"\n"
 	"Colour: \"Black\"\n"
 	"Draw where:  0, 0, -2, 2, \"yes\", \"Curve\", \"not (abs(self)>1)\"\n"
 	"Remove\n"
 )
-ENTRY (L"Example 2")
-NORMAL (L"Draw the second half of a sound:")
-CODE (L"Draw where: 0, 0, -1, 1, \"no\", \"Curve\", \"x > xmin + (xmax - xmin) / 2\"")
-ENTRY (L"Example 3")
-NORMAL (L"Draw only positive amplitudes:")
-CODE (L"Draw where: 0, 0, -1, 1, \"no\", \"Curve\", \"self>0\"")
-ENTRY (L"Example 4")
-NORMAL (L"Draw parts where pitch is larger than 300 Hz in red:")
-CODE (L"s = selected (\"Sound\")")
-CODE (L"p = To Pitch: 0, 75, 600")
-CODE (L"pt = Down to PitchTier\"")
-CODE (L"selectObject: s")
-CODE (L"Colour: \"Red\"")
-CODE (L"Draw where: 0, 0, -1, 1, \"yes\", \"Curve\", \"Object_'pt'(x) > 300\"")
-CODE (L"Colour: \"Black\"")
-CODE (L"Draw where: 0, 0, -1, 1, \"yes\", \"Curve\", \"not (Object_'pt'(x) > 300)\"")
-MAN_END
-
-MAN_BEGIN (L"Sound: Fade in...", L"djmw", 20140117)
-INTRO (L"A command to gradually increase the amplitude of a selected @Sound.")
-ENTRY (L"Settings")
-TAG (L"##Channel")
-DEFINITION (L"determines whether you want to fade all channels or only a selected channel.")
-TAG (L"##Time (s)")
-DEFINITION (L"determines where the fade-in will take place. If %time is earlier than the start time of the sound, the start time of the sound wil be used.")
-TAG (L"##Fade time (s)")
-DEFINITION (L"determines the start point and the endpoint of the fade-in with respect to the %time argument. Depending on the sign of %%fadeTime%, %time is either the start or the end position of the fade-in. If %%fadeTime% is positive, fade-in will take place between %%time% and %%time+fadeTime%. If %%fadeTime% is negative, fade-in wil take place between %%time+fadeTime% and %time.")
-TAG (L"##Silent from start")
-DEFINITION (L"when on, makes the sound silent before the fade-in starts. "
+ENTRY (U"Example 2")
+NORMAL (U"Draw the second half of a sound:")
+CODE (U"Draw where: 0, 0, -1, 1, \"no\", \"Curve\", \"x > xmin + (xmax - xmin) / 2\"")
+ENTRY (U"Example 3")
+NORMAL (U"Draw only positive amplitudes:")
+CODE (U"Draw where: 0, 0, -1, 1, \"no\", \"Curve\", \"self>0\"")
+ENTRY (U"Example 4")
+NORMAL (U"Draw parts where pitch is larger than 300 Hz in red:")
+CODE (U"s = selected (\"Sound\")")
+CODE (U"p = To Pitch: 0, 75, 600")
+CODE (U"pt = Down to PitchTier\"")
+CODE (U"selectObject: s")
+CODE (U"Colour: \"Red\"")
+CODE (U"Draw where: 0, 0, -1, 1, \"yes\", \"Curve\", \"Object_'pt'(x) > 300\"")
+CODE (U"Colour: \"Black\"")
+CODE (U"Draw where: 0, 0, -1, 1, \"yes\", \"Curve\", \"not (Object_'pt'(x) > 300)\"")
+MAN_END
+
+MAN_BEGIN (U"Sound: Fade in...", U"djmw", 20140117)
+INTRO (U"A command to gradually increase the amplitude of a selected @Sound.")
+ENTRY (U"Settings")
+TAG (U"##Channel")
+DEFINITION (U"determines whether you want to fade all channels or only a selected channel.")
+TAG (U"##Time (s)")
+DEFINITION (U"determines where the fade-in will take place. If %time is earlier than the start time of the sound, the start time of the sound wil be used.")
+TAG (U"##Fade time (s)")
+DEFINITION (U"determines the start point and the endpoint of the fade-in with respect to the %time argument. Depending on the sign of %%fadeTime%, %time is either the start or the end position of the fade-in. If %%fadeTime% is positive, fade-in will take place between %%time% and %%time+fadeTime%. If %%fadeTime% is negative, fade-in wil take place between %%time+fadeTime% and %time.")
+TAG (U"##Silent from start")
+DEFINITION (U"when on, makes the sound silent before the fade-in starts. "
 	"When off, the sound before the fade-in starts will not be changed. ")
-ENTRY (L"Algorithm")
-NORMAL (L"Multiplication with the first half period of a (1-cos(x))/2 function. ")
-ENTRY (L"Cross-fading two sounds")
-NORMAL (L"The following script cross-fades two sounds s1 and s2 at time 1 second and leaves the result in s2.")
-CODE1 (L"crossFTime = 0.5")
-CODE1 (L"t = 1")
-CODE1 (L"Create Sound from formula: \"s1\", 1, 0, 2, 44100, \"sin(2*pi*500*x)\"")
-CODE1 (L"Fade out: 0, t-crossFTime/2, crossFTime, \"yes\"")
-CODE1 (L"Create Sound from formula: \"s2\", 1, 0, 2, 44100, \"sin(2*pi*1000*x)\"")
-CODE1 (L"Fade in.: 0, t-crossFTime/2, crossFTime, \"yes\"")
-CODE1 (L"Formula: \"self+Sound_s1[]\"")
-MAN_END
-
-MAN_BEGIN (L"Sound: Fade out...", L"djmw", 20121010)
-INTRO (L"A command to gradually decrease the amplitude of a selected @Sound.")
-ENTRY (L"Settings")
-TAG (L"##Channel")
-DEFINITION (L"determines whether you want to fade all channels or only a selected channel.")
-TAG (L"##Time (s)")
-DEFINITION (L"determines where the fade-out will take place. If %time is later than the end time of the sound, the end time of the sound wil be used.")
-TAG (L"##Fade time (s)")
-DEFINITION (L"determines the start point and the endpoint of the fade-out with respect to the %time argument. Depending on the sign of %%fadeTime%, %time is either the start or the end position of the fade-out. If %%fadeTime% is positive, fade-out will take place between %%time% and %%time+fadeTime%. If %%fadeTime% is negative, fade-out wil take place between %%time+fadeTime% and %time.")
-TAG (L"##Silent to end")
-DEFINITION (L"Make the sound silent after the fade-out finishes. ")
-ENTRY (L"Algorithm")
-NORMAL (L"Multiplication with the first half period of a (1+cos(%%x%))/2 function.")
-MAN_END
-
-MAN_BEGIN (L"Sound: Filter (gammatone)...", L"djmw", 19980712)
-INTRO (L"A command to filter a Sound by a fourth order gammatone bandpass filter.")
-ENTRY (L"Settings")
-TAG (L"##Centre frequency (Hz)#, ##Bandwidth (Hz)#")
-DEFINITION (L"determine the passband of the filter.")
-ENTRY (L"Algorithm")
-NORMAL (L"The impulse response of the filter is a 4-th order @@gammatone at . This "
+ENTRY (U"Algorithm")
+NORMAL (U"Multiplication with the first half period of a (1-cos(x))/2 function. ")
+ENTRY (U"Cross-fading two sounds")
+NORMAL (U"The following script cross-fades two sounds s1 and s2 at time 1 second and leaves the result in s2.")
+CODE1 (U"crossFTime = 0.5")
+CODE1 (U"t = 1")
+CODE1 (U"Create Sound from formula: \"s1\", 1, 0, 2, 44100, \"sin(2*pi*500*x)\"")
+CODE1 (U"Fade out: 0, t-crossFTime/2, crossFTime, \"yes\"")
+CODE1 (U"Create Sound from formula: \"s2\", 1, 0, 2, 44100, \"sin(2*pi*1000*x)\"")
+CODE1 (U"Fade in.: 0, t-crossFTime/2, crossFTime, \"yes\"")
+CODE1 (U"Formula: \"self+Sound_s1[]\"")
+MAN_END
+
+MAN_BEGIN (U"Sound: Fade out...", U"djmw", 20121010)
+INTRO (U"A command to gradually decrease the amplitude of a selected @Sound.")
+ENTRY (U"Settings")
+TAG (U"##Channel")
+DEFINITION (U"determines whether you want to fade all channels or only a selected channel.")
+TAG (U"##Time (s)")
+DEFINITION (U"determines where the fade-out will take place. If %time is later than the end time of the sound, the end time of the sound wil be used.")
+TAG (U"##Fade time (s)")
+DEFINITION (U"determines the start point and the endpoint of the fade-out with respect to the %time argument. Depending on the sign of %%fadeTime%, %time is either the start or the end position of the fade-out. If %%fadeTime% is positive, fade-out will take place between %%time% and %%time+fadeTime%. If %%fadeTime% is negative, fade-out wil take place between %%time+fadeTime% and %time.")
+TAG (U"##Silent to end")
+DEFINITION (U"Make the sound silent after the fade-out finishes. ")
+ENTRY (U"Algorithm")
+NORMAL (U"Multiplication with the first half period of a (1+cos(%%x%))/2 function.")
+MAN_END
+
+MAN_BEGIN (U"Sound: Filter (gammatone)...", U"djmw", 19980712)
+INTRO (U"A command to filter a Sound by a fourth order gammatone bandpass filter.")
+ENTRY (U"Settings")
+TAG (U"##Centre frequency (Hz)#, ##Bandwidth (Hz)#")
+DEFINITION (U"determine the passband of the filter.")
+ENTRY (U"Algorithm")
+NORMAL (U"The impulse response of the filter is a 4-th order @@gammatone at . This "
 	"filter is implemented as a simple 8-th order recursive digital filter with "
 	"4 zeros and 8 poles (these 8 poles consist of one conjugate pole pair to the "
 	"4-th power). In the Z-domain its formula is: ")
-FORMULA (L"%#H (%z) = (1 + \\su__%i=1..4_ %a__%i_%z^^%\\--i^) / "
+FORMULA (U"%#H (%z) = (1 + \\su__%i=1..4_ %a__%i_%z^^%\\--i^) / "
 	"(1 + \\su__%j=1..8_ %b__%j_%z^^%\\--j^)")
-NORMAL (L"The derivation of the filter coefficients %a__%i_ and %b__%j_ is "
+NORMAL (U"The derivation of the filter coefficients %a__%i_ and %b__%j_ is "
 	"according to @@Slaney (1993)@. "
 	"The gain of the filter is scaled to unity at the centre frequency.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Play as frequency shifted...", L"djmw", 20140106)
-INTRO (L"Plays the selected @Sound with all frequencies shifted by the same amount. This trick can be used to make "
+MAN_BEGIN (U"Sound: Play as frequency shifted...", U"djmw", 20140106)
+INTRO (U"Plays the selected @Sound with all frequencies shifted by the same amount. This trick can be used to make "
 	"audible those sounds that are normally not audible at all by human beings, like for example ultrasounds or infrasounds.")
-ENTRY (L"Settings")
-TAG (L"##Shift by (Hz)")
-DEFINITION (L"the amount by which frequencies are shifted. A positive number shifts frequencies up, a negative number "
+ENTRY (U"Settings")
+TAG (U"##Shift by (Hz)")
+DEFINITION (U"the amount by which frequencies are shifted. A positive number shifts frequencies up, a negative number "
 	"shifts frequencies down. ")
-ENTRY (L"##Example")
-NORMAL (L"Rodents produce sounds with frequencies far outside the human audible range. Some meaningfull sqeeks of these animals "
+ENTRY (U"##Example")
+NORMAL (U"Rodents produce sounds with frequencies far outside the human audible range. Some meaningfull sqeeks of these animals "
 	"are present in the frequency range from 54 kHz up to sometimes 100kHz. By choosing a shift value of -54000 Hz and a sampling "
 	"frequency of 44100 Hz, all frequencies between 54000 Hz and (54000+22050=) 76050 Hz  will be shifted down by 54000 Hz. The "
 	"rodents frequencies in the interval from 54000 Hz to 76050 Hz will theredore be mapped to the frequency interval between 0 and 22050 Hz. ")
 MAN_END
 
-MAN_BEGIN (L"Sound: To BarkSpectrogram...", L"djmw", 20141023)
-INTRO (L"A command that creates a @BarkSpectrogram object from every selected "
+MAN_BEGIN (U"Sound: To BarkSpectrogram...", U"djmw", 20141023)
+INTRO (U"A command that creates a @BarkSpectrogram object from every selected "
 	"@Sound object by @@band filtering in the frequency domain@ with a "
 	"bank of filters.")
-NORMAL (L"The auditory filter functions used are defined as:")
-FORMULA (L"10 log %#H(%z) = 7 - 7.5 * (%z__%c_ - %z - 0.215) - 17.5 * \\Vr "
+NORMAL (U"The auditory filter functions used are defined as:")
+FORMULA (U"10 log %#H(%z) = 7 - 7.5 * (%z__%c_ - %z - 0.215) - 17.5 * \\Vr "
 	"(0.196 + (%z__%c_ - %z - 0.215)^2)")
-NORMAL (L"where %z__%c_ is the central (resonance) frequency of the filter in Bark. "
+NORMAL (U"where %z__%c_ is the central (resonance) frequency of the filter in Bark. "
 	"The bandwidths of these filters are constant and equal 1 Bark. ")
-NORMAL (L"The auditory filters are defined in @@Sekey & Hanson (1984)@. You can draw these filters from "
+NORMAL (U"The auditory filters are defined in @@Sekey & Hanson (1984)@. You can draw these filters from "
 	"a BarkSpectrogram object by selecting @@BarkSpectrogram: Draw Sekey-Hanson auditory filters... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: To FormantFilter...", L"djmw", 20141024)
-INTRO (L"A #deprecated command that creates a @FormantFilter object from every selected @Sound object by "
+MAN_BEGIN (U"Sound: To FormantFilter...", U"djmw", 20141024)
+INTRO (U"A #deprecated command that creates a @FormantFilter object from every selected @Sound object by "
 	"@@band filtering in the frequency domain@ with a bank of filters whose bandwidths depend on the pitch of the signal.")
-NORMAL (L"The analysis proceeds in two steps:")
-LIST_ITEM (L"1. We perform a pitch analysis (see @@Sound: To Pitch...@ for details).")
-LIST_ITEM (L"2. We perform a filter bank analysis on a linear frequency scale. The bandwidth of the filters depends on "
+NORMAL (U"The analysis proceeds in two steps:")
+LIST_ITEM (U"1. We perform a pitch analysis (see @@Sound: To Pitch...@ for details).")
+LIST_ITEM (U"2. We perform a filter bank analysis on a linear frequency scale. The bandwidth of the filters depends on "
 	"the measured pitch (see @@Sound & Pitch: To Spectrogram...@ for details).")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Spectrogram (pitch-dependent)...", L"djmw", 20141024)
-INTRO (L"A command that creates a @Spectrogram object from every selected "
+MAN_BEGIN (U"Sound: To Spectrogram (pitch-dependent)...", U"djmw", 20141024)
+INTRO (U"A command that creates a @Spectrogram object from every selected "
 	"@Sound object by @@band filtering in the frequency domain@ with a "
 	"bank of formant filters whose bandwidths vary with the local pitch of the signal.")
-NORMAL (L"The analysis proceeds in two steps:")
-LIST_ITEM (L"1. We perform a pitch analysis (see @@Sound: To Pitch...@ for details).")
-LIST_ITEM (L"2. We perform a filter bank analysis on a linear frequency scale. "
+NORMAL (U"The analysis proceeds in two steps:")
+LIST_ITEM (U"1. We perform a pitch analysis (see @@Sound: To Pitch...@ for details).")
+LIST_ITEM (U"2. We perform a filter bank analysis on a linear frequency scale. "
 	"The bandwidth of the filters depends on the measured pitch (see @@Sound & Pitch: To Spectrogram...@ for details).")
 MAN_END
 
-MAN_BEGIN (L"Sound: Paint where...", L"djmw", 20140509)
-INTRO (L"A command to paint only those parts of a @Sound where a condition holds. The painted area is the area "
+MAN_BEGIN (U"Sound: Paint where...", U"djmw", 20140509)
+INTRO (U"A command to paint only those parts of a @Sound where a condition holds. The painted area is the area "
 	"between the Sound and a horizontal line at a certain level.")
-ENTRY (L"Settings")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6), L""
+ENTRY (U"Settings")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Sound: Paint where...", 6)
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Colour (0-1, name, {r,g,b})", "0.5")
 	Manual_DRAW_SETTINGS_WINDOW_RANGE("Time range (s)", "0.0", "0.0 (=all)")
@@ -3572,52 +3572,52 @@ SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6), L""
 	Manual_DRAW_SETTINGS_WINDOW_TEXT ("Paint only those parts where the following condition holds",
 		"1; always")
 )
-TAG (L"##Colour")
-DEFINITION (L"defines the @@Colour|colour@ of the paint.")
-TAG (L"##Time range (s)")
-DEFINITION (L"selects the time domain for the drawing.")
-TAG (L"##Vertical range")
-DEFINITION (L"defines the vertical limits; larger amplitudes will be clipped.")
-TAG (L"##Fill from level")
-DEFINITION (L"defines the level of the horizontal line. ")
-TAG (L"##Formula")
-DEFINITION (L"determines the part of the sound that will be painted. All parts where the formula evaluates to true will be painted. "
+TAG (U"##Colour")
+DEFINITION (U"defines the @@Colour|colour@ of the paint.")
+TAG (U"##Time range (s)")
+DEFINITION (U"selects the time domain for the drawing.")
+TAG (U"##Vertical range")
+DEFINITION (U"defines the vertical limits; larger amplitudes will be clipped.")
+TAG (U"##Fill from level")
+DEFINITION (U"defines the level of the horizontal line. ")
+TAG (U"##Formula")
+DEFINITION (U"determines the part of the sound that will be painted. All parts where the formula evaluates to true will be painted. "
 "This formula may ##not# contain references to the sampling of the sound, i.e. don't use 'col', 'x1', 'dx' and 'ncol' in it.")
-ENTRY (L"Example 1")
-NORMAL (L"The following script paints the area under a sine curve in red and the area above in green."
+ENTRY (U"Example 1")
+NORMAL (U"The following script paints the area under a sine curve in red and the area above in green."
 	"For the first paint the horizontal line is at y=-1, for the second paint the line is at y=+1. "
 	"The formula always evaluates to true.")
-CODE (L"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"")
-CODE (L"Paint where: \"Red\", 0, 0, -1, 1, -1, \"yes\", \"1\"")
-CODE (L"Paint where: \"Green\", 0, 0, -1, 1, 1, \"no\", \"1\"")
+CODE (U"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"")
+CODE (U"Paint where: \"Red\", 0, 0, -1, 1, -1, \"yes\", \"1\"")
+CODE (U"Paint where: \"Green\", 0, 0, -1, 1, 1, \"no\", \"1\"")
 SCRIPT (8, 5,
-	L"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"\n"
+	U"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"\n"
 	"Paint where: \"Red\", 0, 0, -1, 1, -1, \"no\", \"1\"\n"
 	"Paint where: \"Green\", 0, 0, -1, 1, 1, \"yes\", \"1\"\n"
 	"Remove\n")
-ENTRY (L"Example 2")
-NORMAL (L"The following script paints the area below zero in red and the area above in green."
+ENTRY (U"Example 2")
+NORMAL (U"The following script paints the area below zero in red and the area above in green."
 	"The horizontal line is now always at y=0 and we use the formula to differentiate the areas.")
-CODE (L"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"")
-CODE (L"Paint where: \"Red\", 0, 0, -1, 1, 0, \"no\", \"self>0\"")
-CODE (L"Paint where: \"Green\", 0, 0, -1, 1, 0, \"yes\", \"self<0\"")
+CODE (U"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"")
+CODE (U"Paint where: \"Red\", 0, 0, -1, 1, 0, \"no\", \"self>0\"")
+CODE (U"Paint where: \"Green\", 0, 0, -1, 1, 0, \"yes\", \"self<0\"")
 SCRIPT (8, 5,
-	L"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"\n"
+	U"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"\n"
 	"Paint where: \"Red\", 0, 0, -1, 1, 0, \"no\", \"self<0\"\n"
 	"Paint where: \"Green\", 0, 0, -1, 1, 0, \"yes\", \"self>0\"\n"
 	"removeObject: s\n")
-ENTRY (L"Example 3")
-NORMAL (L"To give an indication that the area under a 1/x curve between the points %a and %b and the area "
+ENTRY (U"Example 3")
+NORMAL (U"To give an indication that the area under a 1/x curve between the points %a and %b and the area "
 	"between %c and %d are equal if %b/%a = %d/%c. For example, for %a=1, %b=2, %c=4 and %d=8: ")
-CODE (L"Create Sound from formula: \"1dx\", \"Mono\", 0, 20, 100, \"1/x\"")
-CODE (L"Draw: 0, 20, 0, 1.5, \"yes\", \"Curve\"")
-CODE (L"Paint where: \"Grey\", 0, 20, 0, 1.5, 0, \"yes\", \"(x >= 1 and x <2) or (x>=4 and x<8)\"")
-CODE (L"One mark bottom: 1, \"yes\", \"yes\", \"no\", \"\"")
-CODE (L"One mark bottom: 2, \"yes\", \"yes\", \"no\", \"\"")
-CODE (L"One mark bottom: 4, \"yes\", \"yes\", \"no\", \"\"")
-CODE (L"One mark bottom: 8, \"yes\", \"yes\", \"no\", \"\"")
+CODE (U"Create Sound from formula: \"1dx\", \"Mono\", 0, 20, 100, \"1/x\"")
+CODE (U"Draw: 0, 20, 0, 1.5, \"yes\", \"Curve\"")
+CODE (U"Paint where: \"Grey\", 0, 20, 0, 1.5, 0, \"yes\", \"(x >= 1 and x <2) or (x>=4 and x<8)\"")
+CODE (U"One mark bottom: 1, \"yes\", \"yes\", \"no\", \"\"")
+CODE (U"One mark bottom: 2, \"yes\", \"yes\", \"no\", \"\"")
+CODE (U"One mark bottom: 4, \"yes\", \"yes\", \"no\", \"\"")
+CODE (U"One mark bottom: 8, \"yes\", \"yes\", \"no\", \"\"")
 SCRIPT (8, 5,
-	L"s = Create Sound from formula: \"1dx\", \"Mono\", 0, 20, 100, \"1/x\"\n"
+	U"s = Create Sound from formula: \"1dx\", \"Mono\", 0, 20, 100, \"1/x\"\n"
 	"Draw: 0, 20, 0, 1.5, \"yes\", \"Curve\"\n"
 	"Paint where: \"Grey\", 0, 20, 0, 1.5, 0, \"yes\", \"(x >= 1 and x <2) or (x>=4 and x<8)\"\n"
 	"One mark bottom: 1, \"yes\", \"yes\", \"no\", \"\"\n"
@@ -3627,61 +3627,61 @@ SCRIPT (8, 5,
 	"removeObject: s\n")
 MAN_END
 
-MAN_BEGIN (L"Sounds: Paint enclosed...", L"djmw", 20140509)
-INTRO (L"Paints the area between the two selected @@Sound at s. ")
-ENTRY (L"Settings")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), L""
+MAN_BEGIN (U"Sounds: Paint enclosed...", U"djmw", 20140509)
+INTRO (U"Paints the area between the two selected @@Sound at s. ")
+ENTRY (U"Settings")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Sounds: Paint enclosed", 4)
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Colour (0-1, name, {r,g,b})", "0.5")
 	Manual_DRAW_SETTINGS_WINDOW_RANGE("Time range (s)", "0.0", "0.0 (=all)")
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Vertical range", "0.0", "0.0 (=all)")
 	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN("Garnish", 1)
 )
-TAG (L"##Colour")
-DEFINITION (L"defines the @@Colour|colour@ of the paint.")
-TAG (L"##Time range (s)")
-DEFINITION (L"selects the time domain for the drawing.")
-TAG (L"##Vertical range")
-DEFINITION (L"defines the vertical limits, larger amplitudes will be clipped.")
-ENTRY (L"Example")
-NORMAL (L"The following script paints the area enclosed between a sine tone of 5 Hz and the straight line %y = %x/2.")
-CODE (L"s1 = Create Sound from formula: \"sine\", \"Mono\", 0, 1, 10000, \"1/2 * sin(2*pi*5*x)\"")
-CODE (L"s2 = Create Sound from formula: \"line\", \"Mono\", 0, 1, 10000, \"x / 2\"")
-CODE (L"plusObject (s1)")
-CODE (L"Paint enclosed: \"Grey\", 0, 0, -1, 1, \"yes\"")
+TAG (U"##Colour")
+DEFINITION (U"defines the @@Colour|colour@ of the paint.")
+TAG (U"##Time range (s)")
+DEFINITION (U"selects the time domain for the drawing.")
+TAG (U"##Vertical range")
+DEFINITION (U"defines the vertical limits, larger amplitudes will be clipped.")
+ENTRY (U"Example")
+NORMAL (U"The following script paints the area enclosed between a sine tone of 5 Hz and the straight line %y = %x/2.")
+CODE (U"s1 = Create Sound from formula: \"sine\", \"Mono\", 0, 1, 10000, \"1/2 * sin(2*pi*5*x)\"")
+CODE (U"s2 = Create Sound from formula: \"line\", \"Mono\", 0, 1, 10000, \"x / 2\"")
+CODE (U"plusObject (s1)")
+CODE (U"Paint enclosed: \"Grey\", 0, 0, -1, 1, \"yes\"")
 SCRIPT ( 4, 2,
-	 L"s1 = Create Sound from formula: \"sine\", \"Mono\", 0, 1, 10000, \"1/2 * sin(2*pi*5*x)\"\n"
+	 U"s1 = Create Sound from formula: \"sine\", \"Mono\", 0, 1, 10000, \"1/2 * sin(2*pi*5*x)\"\n"
 	"s2 = Create Sound from formula: \"line\", \"Mono\", 0, 1, 10000, \"x / 2\"\n"
 	"selectObject: s1, s2\n"
 	"Paint enclosed: \"Grey\", 0, 0, -1, 1, \"yes\"\n"
 	"removeObject: s1, s2\n")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Polygon...", L"djmw", 20140509)
-INTRO (L"A command that creates a @@Polygon@ from a selected @@Sound@, where the Polygon's "
+MAN_BEGIN (U"Sound: To Polygon...", U"djmw", 20140509)
+INTRO (U"A command that creates a @@Polygon@ from a selected @@Sound@, where the Polygon's "
 	" points are defined by the (%time, %amplitude) pairs of the sound. ")
-ENTRY (L"Settings")
-TAG (L"##Channel")
-DEFINITION (L"defines which channel of the sound is used.")
-TAG (L"##Time range (s)")
-DEFINITION (L"defines the part of the sound whose (%time, %amplitude) pairs have to be included.")
-TAG (L"##Vertical range")
-DEFINITION (L"defines the vertical limits, larger amplitudes will be clipped.")
-TAG (L"##Connection y-value")
-DEFINITION (L"defines the y-value of the first and last point of the Polygon. This gives the opportunity to "
+ENTRY (U"Settings")
+TAG (U"##Channel")
+DEFINITION (U"defines which channel of the sound is used.")
+TAG (U"##Time range (s)")
+DEFINITION (U"defines the part of the sound whose (%time, %amplitude) pairs have to be included.")
+TAG (U"##Vertical range")
+DEFINITION (U"defines the vertical limits, larger amplitudes will be clipped.")
+TAG (U"##Connection y-value")
+DEFINITION (U"defines the y-value of the first and last point of the Polygon. This gives the opportunity to "
 	" draw a closed Polygon with the horizontal connection line at any position you like. ")
-ENTRY (L"Example")
-NORMAL (L"The following script paints the area under a sound curve in red and the area above in green.")
-CODE (L"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"")
-CODE (L"\\# Connection y-value is at amplitude -1: area under the curve.")
-CODE (L"p1 = To Polygon: 1, 0, 0, -1, 1, -1")
-CODE (L"Paint: \"{1,0,0}\", 0, 0, -1, 1")
-CODE (L"selectObject: s")
-CODE (L"\\# Connection y-value is now at amplitude 1: area above the curve.")
-CODE (L"p2 = To Polygon: 1, 0, 0, -1, 1, 1")
-CODE (L"Paint: \"{0,1,0}\", 0, 0, -1, 1")
+ENTRY (U"Example")
+NORMAL (U"The following script paints the area under a sound curve in red and the area above in green.")
+CODE (U"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"")
+CODE (U"\\# Connection y-value is at amplitude -1: area under the curve.")
+CODE (U"p1 = To Polygon: 1, 0, 0, -1, 1, -1")
+CODE (U"Paint: \"{1,0,0}\", 0, 0, -1, 1")
+CODE (U"selectObject: s")
+CODE (U"\\# Connection y-value is now at amplitude 1: area above the curve.")
+CODE (U"p2 = To Polygon: 1, 0, 0, -1, 1, 1")
+CODE (U"Paint: \"{0,1,0}\", 0, 0, -1, 1")
 SCRIPT (4.5, 2,
-	L"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"\n"
+	U"s = Create Sound from formula: \"s\", 1, 0, 1, 10000, \"0.5*sin(2*pi*5*x)\"\n"
 	"p1 = To Polygon: 1, 0, 0, -1, 1, -1\n"
 	"Paint: \"{1,0,0}\", 0, 0, -1, 1\n"
 	"selectObject: s\n"
@@ -3692,103 +3692,103 @@ SCRIPT (4.5, 2,
 MAN_END
 
 #define xxx_to_TextGrid_detectSilences_COMMON_PARAMETERS_HELP \
-TAG (L"##Silence threshold (dB)") \
-DEFINITION (L"determines the maximum silence intensity value in dB with respect to the maximum " \
+TAG (U"##Silence threshold (dB)") \
+DEFINITION (U"determines the maximum silence intensity value in dB with respect to the maximum " \
 	"intensity. For example, if %imax is the maximum intensity in dB then the maximum silence " \
 	"intensity is calculated as %%imax - silenceThreshold%; intervals with an intensity smaller " \
 	"than this value are considered as silent intervals.") \
-TAG (L"##Minimum silent interval duration (s)") \
-DEFINITION (L"determines the minimum duration for an interval to be considered as silent. " \
+TAG (U"##Minimum silent interval duration (s)") \
+DEFINITION (U"determines the minimum duration for an interval to be considered as silent. " \
 	"If you don't want the closure for a plosive to count as silent then use a large enough value.") \
-TAG (L"##Minimum sounding interval duration (s)") \
-DEFINITION (L"determines the minimum duration for an interval to be ##not# considered as silent. " \
+TAG (U"##Minimum sounding interval duration (s)") \
+DEFINITION (U"determines the minimum duration for an interval to be ##not# considered as silent. " \
 	"This offers the possibility to filter out small intense bursts of relatively short duration.") \
-TAG (L"##Silent interval label") \
-DEFINITION (L"determines the label for a silent interval in the TextGrid.") \
-TAG (L"##Sounding interval label") \
-DEFINITION (L"determines the label for a sounding interval in the TextGrid.")
-
-MAN_BEGIN (L"Sound: To TextGrid (silences)...", L"djmw", 20061205)
-INTRO (L"A command that creates a @TextGrid in which the silent and sounding intervals of the selected @Sound are marked.")
-ENTRY (L"Settings")
+TAG (U"##Silent interval label") \
+DEFINITION (U"determines the label for a silent interval in the TextGrid.") \
+TAG (U"##Sounding interval label") \
+DEFINITION (U"determines the label for a sounding interval in the TextGrid.")
+
+MAN_BEGIN (U"Sound: To TextGrid (silences)...", U"djmw", 20061205)
+INTRO (U"A command that creates a @TextGrid in which the silent and sounding intervals of the selected @Sound are marked.")
+ENTRY (U"Settings")
 xxx_to_TextGrid_detectSilences_COMMON_PARAMETERS_HELP
-ENTRY (L"Algorithm")
-NORMAL (L"First the intensity is determined according to the @@Sound: To Intensity...@ command. "
+ENTRY (U"Algorithm")
+NORMAL (U"First the intensity is determined according to the @@Sound: To Intensity...@ command. "
 	"Next the silent and sounding intervas are determined as in the @@Intensity: To TextGrid (silences)...@ command.")
 MAN_END
 
-MAN_BEGIN (L"Intensity: To TextGrid (silences)...", L"djmw", 20061201)
-INTRO (L"A command that creates a @TextGrid in which the silent and sounding intervals of the selected @Intensity are marked.")
-ENTRY (L"Settings")
+MAN_BEGIN (U"Intensity: To TextGrid (silences)...", U"djmw", 20061201)
+INTRO (U"A command that creates a @TextGrid in which the silent and sounding intervals of the selected @Intensity are marked.")
+ENTRY (U"Settings")
 xxx_to_TextGrid_detectSilences_COMMON_PARAMETERS_HELP
-ENTRY (L"Algorithm")
-NORMAL (L"First the intensity contour is evaluated and the intervals above and below the silence threshold are marked as "
+ENTRY (U"Algorithm")
+NORMAL (U"First the intensity contour is evaluated and the intervals above and below the silence threshold are marked as "
 	"%sounding and %silent. "
 	"We then remove sounding intervals with a duration smaller than the %%Minimum sounding interval duration%. "
 	"This step is followed by joining the neighbouring silent intervals that resulted because of this removal. "
 	"Finally we remove silent intervals with a duration smaller than the %%Minimum silent interval duration%. "
 	"This is followed by joining the neighbouring sounding intervals that resulted because of this removal.")
-NORMAL (L"Experience showed that first removing short intensity bursts instead of short silences gave better results than doing it the other way around.")
-ENTRY (L"Important")
-NORMAL (L"The effectiveness of the %%Minimum silent interval duration% and %%Minimum sounding interval duration% "
+NORMAL (U"Experience showed that first removing short intensity bursts instead of short silences gave better results than doing it the other way around.")
+ENTRY (U"Important")
+NORMAL (U"The effectiveness of the %%Minimum silent interval duration% and %%Minimum sounding interval duration% "
 	"depends on the effective analysis window duration that was used to determine the intensity contour. "
 	"For example, if you have chosen 100 Hz for the \"Minimum pitch\" parameter in the @@Sound: To Intensity...@ analysis, "
 	"the effective analysis window duration was 32 ms. Don't expect to find sounding "
 	"or silent intervals with a duration smaller than this effective analysis window duration.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Trim silences...", L"djmw", 20120323)
-INTRO (L"A command that creates from the selected @Sound a new sound in which all silence durations are not longer than a specified value.")
-ENTRY (L"Settings")
-TAG (L"%%Trim duration (s)%,")
-DEFINITION (L"specifies the maximum allowed silence duration.")
-TAG (L"%%Minimum pitch (Hz)%, and, %Time step (s)%,")
-DEFINITION (L"determine how we measure the intensities on which the determination of silent intervals is based. See @@Sound: To Intensity...@ for more info.")
-TAG (L"%%Silence threshold (dB)%, %%Minimum silent interval duration (s)%, and %%Minimum sounding interval duration%,")
-DEFINITION (L"determine how the silent intervals will be determined. See @@Intensity: To TextGrid (silences)...@ for more info.")
-TAG (L"%%Save trimming info as TextGrid%,")
-DEFINITION (L"determines if a TextGrid with trimming information will also be created. The TextGrid will have one tier where interval of the %%originating% sound that were trimmed have been labeled. ")
-TAG (L"%%Trim label%,")
-DEFINITION (L"determines the label that the trimmed intervals in the TextGrid will get.")
+MAN_BEGIN (U"Sound: Trim silences...", U"djmw", 20120323)
+INTRO (U"A command that creates from the selected @Sound a new sound in which all silence durations are not longer than a specified value.")
+ENTRY (U"Settings")
+TAG (U"%%Trim duration (s)%,")
+DEFINITION (U"specifies the maximum allowed silence duration.")
+TAG (U"%%Minimum pitch (Hz)%, and, %Time step (s)%,")
+DEFINITION (U"determine how we measure the intensities on which the determination of silent intervals is based. See @@Sound: To Intensity...@ for more info.")
+TAG (U"%%Silence threshold (dB)%, %%Minimum silent interval duration (s)%, and %%Minimum sounding interval duration%,")
+DEFINITION (U"determine how the silent intervals will be determined. See @@Intensity: To TextGrid (silences)...@ for more info.")
+TAG (U"%%Save trimming info as TextGrid%,")
+DEFINITION (U"determines if a TextGrid with trimming information will also be created. The TextGrid will have one tier where interval of the %%originating% sound that were trimmed have been labeled. ")
+TAG (U"%%Trim label%,")
+DEFINITION (U"determines the label that the trimmed intervals in the TextGrid will get.")
 MAN_END
 
-MAN_BEGIN (L"Sound & Pitch: To Spectrogram...", L"djmw", 20141024)
-INTRO (L"A command that creates a @Spectrogram object from the selected "
+MAN_BEGIN (U"Sound & Pitch: To Spectrogram...", U"djmw", 20141024)
+INTRO (U"A command that creates a @Spectrogram object from the selected "
 	"@Sound and @Pitch objects by @@band filtering in the frequency domain@ with a "
 	"bank of filters whose bandwidths depend on the local pitch.")
-NORMAL (L"The filter functions used are:")
-FORMULA (L"%#H(%f, %F__0_) = 1 / (((%f__%c_^^2^ - %f^2) /%f\\.c%B(%F__0_)))^2 + 1),")
-NORMAL (L"where %f__%c_ is the central (resonance) frequency of the filter. "
+NORMAL (U"The filter functions used are:")
+FORMULA (U"%#H(%f, %F__0_) = 1 / (((%f__%c_^^2^ - %f^2) /%f\\.c%B(%F__0_)))^2 + 1),")
+NORMAL (U"where %f__%c_ is the central (resonance) frequency of the filter. "
 	"%B(%F__0_) is the bandwidth in Hz and determined as")
-FORMULA (L"%B(%F__0_) = %relativeBandwidth\\.c%F__0_, ")
-NORMAL (L"where %F__0_ is the fundamental frequency as determined from the Pitch "
+FORMULA (U"%B(%F__0_) = %relativeBandwidth\\.c%F__0_, ")
+NORMAL (U"where %F__0_ is the fundamental frequency as determined from the Pitch "
 	"object. Whenever the value of %F__0_ is undefined, a value of 100 Hz is taken.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To MelFilter...", L"djmw", 20141022)
-INTRO (L"A deprecated command. Use @@Sound: To MelSpectrogram...@ instead.")
+MAN_BEGIN (U"Sound: To MelFilter...", U"djmw", 20141022)
+INTRO (U"A deprecated command. Use @@Sound: To MelSpectrogram...@ instead.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To MelSpectrogram...", L"djmw", 20141022)
-INTRO (L"A command that creates a @MelSpectrogram object from every selected "
+MAN_BEGIN (U"Sound: To MelSpectrogram...", U"djmw", 20141022)
+INTRO (U"A command that creates a @MelSpectrogram object from every selected "
 	"@Sound object by @@band filtering in the frequency domain@ with a "
 	"set of triangular filters.")
-NORMAL (L"The filter functions used are all triangular in shape on a %mel "
+NORMAL (U"The filter functions used are all triangular in shape on a %mel "
 	"frequency scale. Each filter function depends on three parameters, the "
 	"lower frequency %f__%l_, the central frequency %f__%c_ and the higher "
 	"frequency %f__%h_. "
 	"On a %mel scale, the distances %f__%c_-%f__%l_ and %f__%h_-%f__%c_ "
 	"are equal for each filter. The filter function is as follows:" )
-FORMULA (L"%#H(%f) = 0 for %f \\<_ %f__%l_ and %f \\>_ %f__%h_")
-FORMULA (L"%#H(%f) = (%f - %f__%l_) / (%f__%c_ - %f__%l_) for %f__%l_ \\<_ %f \\<_ %f__%c_")
-FORMULA (L"%#H(%f) = (%f__%h_ - %f) / (%f__%h_ - %f__%c_) for %f__%c_ \\<_ %f \\<_ %f__%h_")
-NORMAL (L"In general the number of filter values stored in each frame of the MelSpectrogram is an order of magnitude smaller than the number of sound samples in the corresponding analysis frame.")
+FORMULA (U"%#H(%f) = 0 for %f \\<_ %f__%l_ and %f \\>_ %f__%h_")
+FORMULA (U"%#H(%f) = (%f - %f__%l_) / (%f__%c_ - %f__%l_) for %f__%l_ \\<_ %f \\<_ %f__%c_")
+FORMULA (U"%#H(%f) = (%f__%h_ - %f) / (%f__%h_ - %f__%c_) for %f__%c_ \\<_ %f \\<_ %f__%h_")
+NORMAL (U"In general the number of filter values stored in each frame of the MelSpectrogram is an order of magnitude smaller than the number of sound samples in the corresponding analysis frame.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Pitch (shs)...", L"djmw", 19970402)
-INTRO (L"A command that creates a @Pitch object from every selected @Sound object.")
-ENTRY (L"Purpose")
-NORMAL (L"to perform a pitch analysis based on a spectral compression model. "
+MAN_BEGIN (U"Sound: To Pitch (shs)...", U"djmw", 19970402)
+INTRO (U"A command that creates a @Pitch object from every selected @Sound object.")
+ENTRY (U"Purpose")
+NORMAL (U"to perform a pitch analysis based on a spectral compression model. "
 	"The concept of this model is that each spectral component not only activates "
 	"those elements of the central pitch processor that are most sensitive to the "
 	"component's frequency, but also elements that have a lower harmonic "
@@ -3796,328 +3796,328 @@ NORMAL (L"to perform a pitch analysis based on a spectral compression model. "
 	"central pitch processor is most sensitive at a frequency %f__0_, it receives "
 	"contributions from spectral components in the "
 	"signal at integral multiples of %f__0_.")
-ENTRY (L"Algorithm")
-NORMAL (L"The spectral compression consists of the summation of a sequence of "
+ENTRY (U"Algorithm")
+NORMAL (U"The spectral compression consists of the summation of a sequence of "
 	"harmonically compressed spectra. "
 	"The abscissa of these spectra is compressed by an integral factor, the rank "
 	"of the compression. The maximum of the resulting sum spectrum is the "
 	"estimate of the pitch. Details of the algorithm can be "
 	"found in @@Hermes (1988)@")
-ENTRY (L"Settings")
-TAG (L"##Time step (s)# (standard value: 0.01 s)")
-DEFINITION (L"the measurement interval (frame duration), in seconds.")
-TAG (L"##Minimum pitch (Hz)# (standard value: 50 Hz)")
-DEFINITION (L"candidates below this frequency will not be recruited. This parameter "
+ENTRY (U"Settings")
+TAG (U"##Time step (s)# (standard value: 0.01 s)")
+DEFINITION (U"the measurement interval (frame duration), in seconds.")
+TAG (U"##Minimum pitch (Hz)# (standard value: 50 Hz)")
+DEFINITION (U"candidates below this frequency will not be recruited. This parameter "
 	"determines the length of the analysis window.")
-TAG (L"##Max. number of candidates# (standard value: 15)")
-DEFINITION (L"The maximum number of candidates that will be recruited.")
-TAG (L"##Maximum frequency (Hz)# (standard value: 1250 Hz)")
-DEFINITION (L"higher frequencies will not be considered.")
-TAG (L"##Max. number of subharmonics# (standard value: 15)")
-DEFINITION (L"the maximum number of harmonics that add up to the pitch.")
-TAG (L"##Compression factor# (standard value: 0.84)")
-DEFINITION (L"the factor by which successive compressed spectra are multiplied before the summation.")
-TAG (L"##Number of points per octave# (standard value: 48)")
-DEFINITION (L"determines the sampling of the logarithmic frequency scale.")
-TAG (L"##Ceiling (Hz)# (standard value: 500 Hz)")
-DEFINITION (L"candidates above this frequency will be ignored.")
-MAN_END
-
-MAN_BEGIN (L"Spectra: Multiply", L"djmw", 20100318)
-INTRO (L"Returns a new Spectrum object that is the product of the two selected "
+TAG (U"##Max. number of candidates# (standard value: 15)")
+DEFINITION (U"The maximum number of candidates that will be recruited.")
+TAG (U"##Maximum frequency (Hz)# (standard value: 1250 Hz)")
+DEFINITION (U"higher frequencies will not be considered.")
+TAG (U"##Max. number of subharmonics# (standard value: 15)")
+DEFINITION (U"the maximum number of harmonics that add up to the pitch.")
+TAG (U"##Compression factor# (standard value: 0.84)")
+DEFINITION (U"the factor by which successive compressed spectra are multiplied before the summation.")
+TAG (U"##Number of points per octave# (standard value: 48)")
+DEFINITION (U"determines the sampling of the logarithmic frequency scale.")
+TAG (U"##Ceiling (Hz)# (standard value: 500 Hz)")
+DEFINITION (U"candidates above this frequency will be ignored.")
+MAN_END
+
+MAN_BEGIN (U"Spectra: Multiply", U"djmw", 20100318)
+INTRO (U"Returns a new Spectrum object that is the product of the two selected "
 	"@Spectrum objects.")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: Conjugate", L"djmw", 20031023)
-INTRO (L"Reverses the sign of the complex part of the selected @Spectrum object(s).")
-NORMAL (L"For real signals, conjugation in the spectral domain amounts to time-inversion in the time domain.")
+MAN_BEGIN (U"Spectrum: Conjugate", U"djmw", 20031023)
+INTRO (U"Reverses the sign of the complex part of the selected @Spectrum object(s).")
+NORMAL (U"For real signals, conjugation in the spectral domain amounts to time-inversion in the time domain.")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: Shift frequencies...", L"djmw", 20121028)
-INTRO (L"Creates a new @Spectrum by shifting all frequencies of the selected Spectrum upwards or downwards.")
-ENTRY (L"Settings")
-TAG (L"##Shift by (Hz)")
-DEFINITION (L"a positive value shifts the spectrum towards higher frequencies, a negative value shifts the spectrum "
+MAN_BEGIN (U"Spectrum: Shift frequencies...", U"djmw", 20121028)
+INTRO (U"Creates a new @Spectrum by shifting all frequencies of the selected Spectrum upwards or downwards.")
+ENTRY (U"Settings")
+TAG (U"##Shift by (Hz)")
+DEFINITION (U"a positive value shifts the spectrum towards higher frequencies, a negative value shifts the spectrum "
 	"towards lower frequencies.")
-TAG (L"##New maximum frequency (Hz)")
-DEFINITION (L"the maximum frequency in the new Spectrum.")
-TAG (L"##Precision")
-DEFINITION (L"the number of neighbouring frequency points that are used in the calculation of the new frequency points. "
+TAG (U"##New maximum frequency (Hz)")
+DEFINITION (U"the maximum frequency in the new Spectrum.")
+TAG (U"##Precision")
+DEFINITION (U"the number of neighbouring frequency points that are used in the calculation of the new frequency points. "
 	"The precision relates linearly to the amount of computing time needed to get the new shifted spectrum.")
 MAN_END
 
-MAN_BEGIN (L"SpeechSynthesizer", L"djmw", 20120413)
-INTRO (L"The SpeechSynthesizer is one of the @@types of objects@ in Praat. It creates a speech sound from text. The actual text-to-speech synthesis is performed by the @@Espeak@ speech synthsizer and therefore our SpeechSynthsizer is merely an interface to Espeak.")
-ENTRY (L"Commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@Create SpeechSynthesizer...@")
-NORMAL (L"Playing:")
-LIST_ITEM (L"\\bu @@SpeechSynthesizer: Play text...|Play text...@")
-LIST_ITEM (L"\\bu @@SpeechSynthesizer: To Sound...|To Sound...@")
-NORMAL (L"Modification:")
-LIST_ITEM (L"\\bu @@SpeechSynthesizer: Set text input settings...|Set text input settings...@")
-LIST_ITEM (L"\\bu @@SpeechSynthesizer: Set speech output settings...|Set speech output settings...@")
-MAN_END
-
-MAN_BEGIN (L"Create SpeechSynthesizer...", L"djmw", 20120221)
-INTRO (L"Creates the @@Espeak@ speech synthesizer.")
-ENTRY (L"Settings")
-TAG (L"##Language#")
-DEFINITION (L"determines the language of the synthesizer.")
-TAG (L"##Voice variant#")
-DEFINITION (L"determines which voice type the synthesizer uses (male, female or whispered voices).")
-MAN_END
-
-MAN_BEGIN (L"SpeechSynthesizer: Play text...", L"djmw", 20120413)
-INTRO (L"The selected @@SpeechSynthesizer@ plays a text")
-ENTRY (L"Settings")
-TAG (L"##Text#")
-DEFINITION (L"is the text to be played. Text within [[ ]] is treated as phonemes codes in @@Kirshenbaum phonetic encoding at . For example, besides a text like \"This is text\", you might also input \"This [[Iz]] text\".")
-MAN_END
-
-MAN_BEGIN (L"SpeechSynthesizer: To Sound...", L"djmw", 20120414)
-INTRO (L"The selected @@SpeechSynthesizer@ converts a text to the corresponding speech sound.")
-ENTRY (L"Settings")
-TAG (L"##Text#")
-DEFINITION (L"is the text to be played. Text within [[ ]] is treated as phonemes codes in @@Kirshenbaum phonetic encoding at . For example, besides a text like \"This is text\", you might also input \"This [[Iz]] text\".")
-TAG (L"##Create TextGrid with annotations#")
-DEFINITION (L"determines whether, besides the sound, a TextGrid with multiple-tier annotations will appear.")
-MAN_END
-
-MAN_BEGIN (L"SpeechSynthesizer: Set text input settings...", L"djmw", 20120414)
-INTRO (L"A command available in the ##Modify# menu when you select a @@SpeechSynthesizer at .")
-ENTRY (L"Settings")
-TAG (L"##Input text format is#")
-DEFINITION (L"determines how the input text will be synthesized.")
-TAG (L"##Input phoneme codes are#")
-DEFINITION (L"")
-MAN_END
-
-MAN_BEGIN (L"SpeechSynthesizer: Set speech output settings...", L"djmw", 20120414)
-INTRO (L"A command available in the ##Modify# menu when you select a @@SpeechSynthesizer at .")
-ENTRY (L"Settings")
-TAG (L"##Sampling frequency#")
-DEFINITION (L"determines how the sampling frequency of the sound.")
-TAG (L"##Gap between words#")
-DEFINITION (L"determines the amount of silence between words.")
-TAG (L"##Pitch adjustment#")
-DEFINITION (L"")
-TAG (L"##Pitch range#")
-DEFINITION (L"")
-TAG (L"##Words per minute#")
-DEFINITION (L"determines the speaking rate in words per minute.")
-TAG (L"##estimate words per minute from data#")
-DEFINITION (L"")
-TAG (L"##Output phoneme codes are#")
-MAN_END
-
-MAN_BEGIN (L"SSCP", L"djmw", 19981103)
-INTRO (L"One of the @@types of objects@ in P\\s{RAAT}.")
-NORMAL (L"An object of type SSCP represents the sums of squares and cross products of "
+MAN_BEGIN (U"SpeechSynthesizer", U"djmw", 20120413)
+INTRO (U"The SpeechSynthesizer is one of the @@types of objects@ in Praat. It creates a speech sound from text. The actual text-to-speech synthesis is performed by the @@Espeak@ speech synthsizer and therefore our SpeechSynthsizer is merely an interface to Espeak.")
+ENTRY (U"Commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@Create SpeechSynthesizer...@")
+NORMAL (U"Playing:")
+LIST_ITEM (U"\\bu @@SpeechSynthesizer: Play text...|Play text...@")
+LIST_ITEM (U"\\bu @@SpeechSynthesizer: To Sound...|To Sound...@")
+NORMAL (U"Modification:")
+LIST_ITEM (U"\\bu @@SpeechSynthesizer: Set text input settings...|Set text input settings...@")
+LIST_ITEM (U"\\bu @@SpeechSynthesizer: Set speech output settings...|Set speech output settings...@")
+MAN_END
+
+MAN_BEGIN (U"Create SpeechSynthesizer...", U"djmw", 20120221)
+INTRO (U"Creates the @@Espeak@ speech synthesizer.")
+ENTRY (U"Settings")
+TAG (U"##Language#")
+DEFINITION (U"determines the language of the synthesizer.")
+TAG (U"##Voice variant#")
+DEFINITION (U"determines which voice type the synthesizer uses (male, female or whispered voices).")
+MAN_END
+
+MAN_BEGIN (U"SpeechSynthesizer: Play text...", U"djmw", 20120413)
+INTRO (U"The selected @@SpeechSynthesizer@ plays a text")
+ENTRY (U"Settings")
+TAG (U"##Text#")
+DEFINITION (U"is the text to be played. Text within [[ ]] is treated as phonemes codes in @@Kirshenbaum phonetic encoding at . For example, besides a text like \"This is text\", you might also input \"This [[Iz]] text\".")
+MAN_END
+
+MAN_BEGIN (U"SpeechSynthesizer: To Sound...", U"djmw", 20120414)
+INTRO (U"The selected @@SpeechSynthesizer@ converts a text to the corresponding speech sound.")
+ENTRY (U"Settings")
+TAG (U"##Text#")
+DEFINITION (U"is the text to be played. Text within [[ ]] is treated as phonemes codes in @@Kirshenbaum phonetic encoding at . For example, besides a text like \"This is text\", you might also input \"This [[Iz]] text\".")
+TAG (U"##Create TextGrid with annotations#")
+DEFINITION (U"determines whether, besides the sound, a TextGrid with multiple-tier annotations will appear.")
+MAN_END
+
+MAN_BEGIN (U"SpeechSynthesizer: Set text input settings...", U"djmw", 20120414)
+INTRO (U"A command available in the ##Modify# menu when you select a @@SpeechSynthesizer at .")
+ENTRY (U"Settings")
+TAG (U"##Input text format is#")
+DEFINITION (U"determines how the input text will be synthesized.")
+TAG (U"##Input phoneme codes are#")
+DEFINITION (U"")
+MAN_END
+
+MAN_BEGIN (U"SpeechSynthesizer: Set speech output settings...", U"djmw", 20120414)
+INTRO (U"A command available in the ##Modify# menu when you select a @@SpeechSynthesizer at .")
+ENTRY (U"Settings")
+TAG (U"##Sampling frequency#")
+DEFINITION (U"determines how the sampling frequency of the sound.")
+TAG (U"##Gap between words#")
+DEFINITION (U"determines the amount of silence between words.")
+TAG (U"##Pitch adjustment#")
+DEFINITION (U"")
+TAG (U"##Pitch range#")
+DEFINITION (U"")
+TAG (U"##Words per minute#")
+DEFINITION (U"determines the speaking rate in words per minute.")
+TAG (U"##estimate words per minute from data#")
+DEFINITION (U"")
+TAG (U"##Output phoneme codes are#")
+MAN_END
+
+MAN_BEGIN (U"SSCP", U"djmw", 19981103)
+INTRO (U"One of the @@types of objects@ in P\\s{RAAT}.")
+NORMAL (U"An object of type SSCP represents the sums of squares and cross products of "
 	"a multivariate data set.")
-NORMAL (L"Besides the matrix part, an object of type SSCP also contains a "
+NORMAL (U"Besides the matrix part, an object of type SSCP also contains a "
 	"vector with centroids.")
-ENTRY (L"Inside a SSCP")
-NORMAL (L"With @Inspect you will see that this type contains the same "
+ENTRY (U"Inside a SSCP")
+NORMAL (U"With @Inspect you will see that this type contains the same "
 	"attributes as a @TableOfReal with the following extras:")
-TAG (L"%numberOfObservations")
-TAG (L"%centroid")
+TAG (U"%numberOfObservations")
+TAG (U"%centroid")
 MAN_END
 
-MAN_BEGIN (L"SSCP: Draw sigma ellipse...", L"djmw", 19990222)
-INTRO (L"A command to draw for the selected @SSCP an ellipse that "
+MAN_BEGIN (U"SSCP: Draw sigma ellipse...", U"djmw", 19990222)
+INTRO (U"A command to draw for the selected @SSCP an ellipse that "
 	"covers a part of the multivariate data.")
-ENTRY (L"Setting")
-TAG (L"##Number of sigmas")
-DEFINITION (L"determines the @@concentration ellipse|data coverage at .")
+ENTRY (U"Setting")
+TAG (U"##Number of sigmas")
+DEFINITION (U"determines the @@concentration ellipse|data coverage at .")
 MAN_END
 
-MAN_BEGIN (L"SSCP: Get sigma ellipse area...", L"djmw", 20000525)
-INTRO (L"A command to query the selected @SSCP object for the area of a "
+MAN_BEGIN (U"SSCP: Get sigma ellipse area...", U"djmw", 20000525)
+INTRO (U"A command to query the selected @SSCP object for the area of a "
 	"sigma ellipse.")
-ENTRY (L"Algorithm")
-NORMAL (L"The algorithm proceeds as follows:")
-LIST_ITEM (L"1. The four array elements in the SSCP-matrix that correspond to the chosen dimensions "
+ENTRY (U"Algorithm")
+NORMAL (U"The algorithm proceeds as follows:")
+LIST_ITEM (U"1. The four array elements in the SSCP-matrix that correspond to the chosen dimensions "
 	"are copied into a two-dimensional matrix #%S (symmetric of course).")
-LIST_ITEM (L"2. The eigenvalues of #%S are determined, call them %s__1_ and %s__2_.")
-LIST_ITEM (L"3. The lengths %l__%i_  of the axes of the ellipse can be obtained as the  "
+LIST_ITEM (U"2. The eigenvalues of #%S are determined, call them %s__1_ and %s__2_.")
+LIST_ITEM (U"3. The lengths %l__%i_  of the axes of the ellipse can be obtained as the  "
 	"square root of the %s__i_ multiplied by a scale factor: %l__%i_ = %scaleFactor \\.c "
 	"\\Vr (%s__%i_ ), "
 	"where %scaleFactor = %numberOfSigmas / \\Vr(%numberOfObservations \\-- 1).")
-LIST_ITEM (L"4. The area of the ellipse will be %\\pi\\.c%l__1_\\.c%l__2_.")
+LIST_ITEM (U"4. The area of the ellipse will be %\\pi\\.c%l__1_\\.c%l__2_.")
 MAN_END
 
-MAN_BEGIN (L"SSCP: Get confidence ellipse area...", L"djmw", 20000525)
-INTRO (L"A command to query the selected @SSCP object for the area of a "
+MAN_BEGIN (U"SSCP: Get confidence ellipse area...", U"djmw", 20000525)
+INTRO (U"A command to query the selected @SSCP object for the area of a "
 	"confidence ellipse.")
-ENTRY (L"Algorithm")
-NORMAL (L"The algorithm proceeds as follows:")
-LIST_ITEM (L"1. The four array elements in the SSCP-matrix that correspond to the chosen dimensions "
+ENTRY (U"Algorithm")
+NORMAL (U"The algorithm proceeds as follows:")
+LIST_ITEM (U"1. The four array elements in the SSCP-matrix that correspond to the chosen dimensions "
 	"are copied into a two-dimensional matrix #%S (symmetric of course).")
-LIST_ITEM (L"2. The eigenvalues of #%S are determined, call them %s__1_ and %s__2_.")
-LIST_ITEM (L"3. The lengths %l__1_ and %l__2_ of the two axes of the ellipse can be obtained as "
+LIST_ITEM (U"2. The eigenvalues of #%S are determined, call them %s__1_ and %s__2_.")
+LIST_ITEM (U"3. The lengths %l__1_ and %l__2_ of the two axes of the ellipse can be obtained as "
 	"(see for example @@Johnson (1998)@, page 410): ")
-FORMULA (L"    %l__%i_ = %scaleFactor \\.c \\Vr (%s__%i_ ),")
-LIST_ITEM (L"     where")
-FORMULA (L"%scaleFactor = \\Vr (%f \\.c %p \\.c (%n \\-- 1) / (%n \\.c (%n \\-- %p))),")
-LIST_ITEM (L"     in which %f = $$@@invFisherQ@$ (1 \\-- %confidenceLevel, %p, %n \\-- %p), "
+FORMULA (U"    %l__%i_ = %scaleFactor \\.c \\Vr (%s__%i_ ),")
+LIST_ITEM (U"     where")
+FORMULA (U"%scaleFactor = \\Vr (%f \\.c %p \\.c (%n \\-- 1) / (%n \\.c (%n \\-- %p))),")
+LIST_ITEM (U"     in which %f = $$@@invFisherQ@$ (1 \\-- %confidenceLevel, %p, %n \\-- %p), "
 	"where %p is the numberOfRows from the SSCP object and %n the %numberOfObservations.")
-LIST_ITEM (L"4. The area of the ellipse will be %\\pi\\.c%l__1_\\.c%l__2_.")
+LIST_ITEM (U"4. The area of the ellipse will be %\\pi\\.c%l__1_\\.c%l__2_.")
 MAN_END
 
-MAN_BEGIN (L"SSCP: Get diagonality (bartlett)...", L"djmw", 20011111)
-INTRO (L"Tests the hypothesis that the selected @SSCP matrix object is "
+MAN_BEGIN (U"SSCP: Get diagonality (bartlett)...", U"djmw", 20011111)
+INTRO (U"Tests the hypothesis that the selected @SSCP matrix object is "
 	"diagonal.")
-ENTRY (L"Setting")
-TAG (L"##Number of constraints")
-DEFINITION (L"modifies the number of independent observations. "
+ENTRY (U"Setting")
+TAG (U"##Number of constraints")
+DEFINITION (U"modifies the number of independent observations. "
 	"The default value is 1.")
-ENTRY (L"Algorithm")
-NORMAL (L"The test statistic is |#R|^^N/2^, the N/2-th power of the determinant"
+ENTRY (U"Algorithm")
+NORMAL (U"The test statistic is |#R|^^N/2^, the N/2-th power of the determinant"
 	" of the correlation matrix. @@Bartlett (1954)@ developed the following "
 	"approximation to the limiting distribution:")
-FORMULA (L"\\ci^2 = -(%N - %numberOfConstraints - (2%p + 5) /6) ln |#R|")
-NORMAL (L"In the formula's above, %p is the dimension of the correlation "
+FORMULA (U"\\ci^2 = -(%N - %numberOfConstraints - (2%p + 5) /6) ln |#R|")
+NORMAL (U"In the formula's above, %p is the dimension of the correlation "
 	"matrix, %N-%numberOfConstraints is the number of independent "
 	"observations. Normally %numberOfConstraints would "
 	"equal 1, however, if the matrix has been computed in some other way, "
 	"e.g., from within-group sums of squares and cross-products of %k "
 	"independent groups, %numberOfConstraints would equal %k.")
-NORMAL (L"We return the probability %\\al as ")
-FORMULA (L"%\\al = chiSquareQ (\\ci^2 , %p(%p-1)/2).")
-NORMAL (L"A very low %\\al indicates that it is very improbable that the "
+NORMAL (U"We return the probability %\\al as ")
+FORMULA (U"%\\al = chiSquareQ (\\ci^2 , %p(%p-1)/2).")
+NORMAL (U"A very low %\\al indicates that it is very improbable that the "
 	"matrix is diagonal.")
 MAN_END
 
-MAN_BEGIN (L"SSCP: Get fraction variation...", L"djmw", 20040210)
-INTRO (L"A command to ask the selected @SSCP object for the fraction "
+MAN_BEGIN (U"SSCP: Get fraction variation...", U"djmw", 20040210)
+INTRO (U"A command to ask the selected @SSCP object for the fraction "
 	"of the total variation that is accounted for by the selected dimension(s).")
-NORMAL (L"Further details can be found in @@Covariance: Get fraction variance... at .")
+NORMAL (U"Further details can be found in @@Covariance: Get fraction variance... at .")
 MAN_END
 
-MAN_BEGIN (L"SSCP: To CCA...", L"djmw", 20031103)
-INTRO (L"A command that creates a @@CCA|canonical correlation@ object from the "
+MAN_BEGIN (U"SSCP: To CCA...", U"djmw", 20031103)
+INTRO (U"A command that creates a @@CCA|canonical correlation@ object from the "
 	"selected @SSCP object.")
-ENTRY (L"Setting")
-TAG (L"##Dimension of dependent variate (ny)")
-DEFINITION (L"defines a partition of the square %n x %n SSCP matrix S into the parts S__yy_ of "
+ENTRY (U"Setting")
+TAG (U"##Dimension of dependent variate (ny)")
+DEFINITION (U"defines a partition of the square %n x %n SSCP matrix S into the parts S__yy_ of "
 	"dimension %ny x %ny, S__xx_ of dimension %nx x %nx, and the parts "
 	"S__xy_ and S__yx_ of dimensions %nx x %ny and %ny x %nx, respectively.")
-ENTRY (L"Algorithm")
-NORMAL (L"The partition for the square SSCP-matrix is as follows:")
+ENTRY (U"Algorithm")
+NORMAL (U"The partition for the square SSCP-matrix is as follows:")
 PICTURE (2.0, 2.0, drawPartionedMatrix)
-NORMAL (L"The canonical correlation equations we have to solve are:")
-FORMULA (L"(1)    (#S__%yx_ #S__%xx_^^-1^ #S__%yx_\\'p -\\la #S__%yy_)#y = #0")
-FORMULA (L"(2)    (#S__%yx_\\'p #S__%yy_^^-1^ #S__%yx_ -\\la #S__%xx_)#x = #0")
-NORMAL (L"where #S__%yy_ [%ny \\xx %ny] and #S__%xx_ [%nx \\xx %nx] are "
+NORMAL (U"The canonical correlation equations we have to solve are:")
+FORMULA (U"(1)    (#S__%yx_ #S__%xx_^^-1^ #S__%yx_\\'p -\\la #S__%yy_)#y = #0")
+FORMULA (U"(2)    (#S__%yx_\\'p #S__%yy_^^-1^ #S__%yx_ -\\la #S__%xx_)#x = #0")
+NORMAL (U"where #S__%yy_ [%ny \\xx %ny] and #S__%xx_ [%nx \\xx %nx] are "
 	"symmetric, positive definite matrices belonging to the dependent and the "
 	"independent variables, respectively. ")
-NORMAL (L"These two equations are not independent and we will show that both "
+NORMAL (U"These two equations are not independent and we will show that both "
 	"equations have the same eigenvalues and that the eigenvectors #x for "
 	"equation (2) can be obtained from the eigenvectors #y of equation (1).")
-NORMAL (L"We can solve equation (1) in several ways, however, the numerically "
+NORMAL (U"We can solve equation (1) in several ways, however, the numerically "
 	"stablest algorithm is probably by performing first a Cholesky decomposition "
 	"of #S__xx_ and #S__yy_, followed by a @@generalized singular value "
 	"decomposition at . The algorithm goes as follows:")
-NORMAL (L"The Cholesky decompositions (\"square roots\") of #S__yy_ and #S__xx_ are:")
-FORMULA (L"#S__yy_ = #U\\'p #U and #S__xx_ = #H\\'p #H,")
-NORMAL (L"where #U and H are upper triangular matrices. From these decompositions, "
+NORMAL (U"The Cholesky decompositions (\"square roots\") of #S__yy_ and #S__xx_ are:")
+FORMULA (U"#S__yy_ = #U\\'p #U and #S__xx_ = #H\\'p #H,")
+NORMAL (U"where #U and H are upper triangular matrices. From these decompositions, "
 	"the inverse for #S__xx_^^-1^ is easily computed. Let #K be the inverse of #H, "
 	"then we can write: ")
-FORMULA (L"#S__xx_^^-1^ = #K #K\\'p.")
-NORMAL (L"We next substitute in equation (1) and rewrite as:")
-FORMULA (L"((#K\\'p#S__yx_\\'p)\\'p (#K\\'p#S__yx_\\'p) - \\la #U\\'p #U)#x = 0")
-NORMAL (L"This equation can be solved for eigenvalues and eigenvectors by the "
+FORMULA (U"#S__xx_^^-1^ = #K #K\\'p.")
+NORMAL (U"We next substitute in equation (1) and rewrite as:")
+FORMULA (U"((#K\\'p#S__yx_\\'p)\\'p (#K\\'p#S__yx_\\'p) - \\la #U\\'p #U)#x = 0")
+NORMAL (U"This equation can be solved for eigenvalues and eigenvectors by the "
 	"generalized singular value decomposition because it is of the form "
 	"#A\\'p#A -\\la #B\\'p#B.")
-NORMAL (L"Now, given the solution for equation (1) we can find the solution "
+NORMAL (U"Now, given the solution for equation (1) we can find the solution "
 	"for equation (2) by first multiplying (1) from the left with "
 	"#S__yx_\\'p#S__yy_^^-1^, resulting in:")
-FORMULA (L"(#S__yx_\\'p#S__yy_^^-1^#S__yx_#S__xx_^^-1^#S__yx_\\'p -\\la #S__yx_\\'p) #y = 0")
-NORMAL (L"Now we split of the term #S__xx_^^-1^#S__yx_\\'p and obtain:")
-FORMULA (L"(#S__yx_\\'p#S__yy_^^-1^#S__yx_ - \\la #S__xx_) #S__xx_^^-1^#S__yx_\\'p #y = 0")
-NORMAL (L"This equation is like equation (2) and it has therefore the same eigenvalues "
+FORMULA (U"(#S__yx_\\'p#S__yy_^^-1^#S__yx_#S__xx_^^-1^#S__yx_\\'p -\\la #S__yx_\\'p) #y = 0")
+NORMAL (U"Now we split of the term #S__xx_^^-1^#S__yx_\\'p and obtain:")
+FORMULA (U"(#S__yx_\\'p#S__yy_^^-1^#S__yx_ - \\la #S__xx_) #S__xx_^^-1^#S__yx_\\'p #y = 0")
+NORMAL (U"This equation is like equation (2) and it has therefore the same eigenvalues "
 	"and eigenvectors. (We also proved this fact in the algorithmic section of "
 	"@@TableOfReal: To CCA... at .)")
-NORMAL (L"The eigenvectors #x is now")
-FORMULA (L"#x = #S__xx_^^-1^#S__yx_\\'p #y.")
+NORMAL (U"The eigenvectors #x is now")
+FORMULA (U"#x = #S__xx_^^-1^#S__yx_\\'p #y.")
 MAN_END
 
-MAN_BEGIN (L"SSCP: To Covariance...", L"djmw", 20090624)
-INTRO (L"A command that creates a @Covariance object from each selected @SSCP object.")
-ENTRY (L"Setting")
-TAG (L"##Number of constraints")
-DEFINITION (L"determines the factor by which each entry in the "
+MAN_BEGIN (U"SSCP: To Covariance...", U"djmw", 20090624)
+INTRO (U"A command that creates a @Covariance object from each selected @SSCP object.")
+ENTRY (U"Setting")
+TAG (U"##Number of constraints")
+DEFINITION (U"determines the factor by which each entry in the "
 	"SSCP-matrix is scaled to obtain the Covariance matrix.")
-ENTRY (L"Details")
-NORMAL (L"The relation between the numbers %c__%ij_ in the covariance matrix and the numbers %s__%ij_ in "
+ENTRY (U"Details")
+NORMAL (U"The relation between the numbers %c__%ij_ in the covariance matrix and the numbers %s__%ij_ in "
 	"the originating SSCP matrix is:")
-FORMULA (L"%c__%ij_ = %s__%ij_ / (%numberOfObservations - %numberOfConstraints)")
-NORMAL (L"Normally %numberOfConstraints will equal 1. However, when the SSCP was the "
+FORMULA (U"%c__%ij_ = %s__%ij_ / (%numberOfObservations - %numberOfConstraints)")
+NORMAL (U"Normally %numberOfConstraints will equal 1. However, when the SSCP was the "
 	"result of summing %g SSCP objects, as is, for example, the case when you obtained the total "
 	"within-groups SSCP from pooling the individual group SSCP's, %numberOfConstraints will equal the number of pooled SSCP's,  %g.")
 MAN_END
 
-MAN_BEGIN (L"SSCP & TableOfReal: Extract quantile range...", L"djmw", 20040225)
-INTRO (L"Extract those rows from the selected @TableOfReal object whose Mahalanobis "
+MAN_BEGIN (U"SSCP & TableOfReal: Extract quantile range...", U"djmw", 20040225)
+INTRO (U"Extract those rows from the selected @TableOfReal object whose Mahalanobis "
 	"distance, with respect to the selected @SSCP object, are within the "
 	"quantile range.")
 MAN_END
 
-MAN_BEGIN (L"T-test", L"djmw", 20020117)
-INTRO (L"A test on the mean of a normal variate when the variance is unknown.")
-NORMAL (L"In Praat, the t-test is used to query a @Covariance object and:")
-LIST_ITEM (L"1. get the significance of one mean. See @@Covariance: Get "
+MAN_BEGIN (U"T-test", U"djmw", 20020117)
+INTRO (U"A test on the mean of a normal variate when the variance is unknown.")
+NORMAL (U"In Praat, the t-test is used to query a @Covariance object and:")
+LIST_ITEM (U"1. get the significance of one mean. See @@Covariance: Get "
 	"significance of one mean... at .")
-LIST_ITEM (L"2. get the significance of the %difference between two means. "
+LIST_ITEM (U"2. get the significance of the %difference between two means. "
 	"See @@Covariance: Get significance of means difference... at .")
-NORMAL (L"You should use a t-test when you want to test a hypothesis about "
+NORMAL (U"You should use a t-test when you want to test a hypothesis about "
 	"the mean of one column in a @TableOfReal object, or, if you want to test "
 	"a hypothesis about the difference between the means of two columns in "
 	"this object.")
-NORMAL (L"You can perform these t-tests in Praat by first transforming the "
+NORMAL (U"You can perform these t-tests in Praat by first transforming the "
 	"TableOfReal object into a Covariance object (see @@TableOfReal: To "
 	"Covariance@) and then choosing the appropriate query method on the "
 	"latter object.")
 MAN_END
 
-MAN_BEGIN (L"BHEP multivariate normality test", L"djmw", 20101124)
-INTRO (L"The Baringhaus–Henze–Epps–Pulley multivariate normality test.")
-NORMAL (L"According to @@Henze & Wagner (1997)@ the test has:")
-LIST_ITEM (L"\\bu affine invariance,")
-LIST_ITEM (L"\\bu consistency against each fixed nonnormal alternative distribution,")
-LIST_ITEM (L"\\bu asymptotic power against contiguous alternatives of order \\Vr (%n),")
-LIST_ITEM (L"\\bu feasibility for any dimension and any sample size.")
-NORMAL (L"The test depends on a smoothing parameter %%h% that can be chosen in various ways:")
-NORMAL (L"@@Henze & Wagner (1997)@ recommend %h = 1.41, while")
-NORMAL (L"@@Tenreiro (2009)@ recommends  %h__%%s% _= 0.448 + 0.026\\.c%d for short tailed alternatives and "
+MAN_BEGIN (U"BHEP multivariate normality test", U"djmw", 20101124)
+INTRO (U"The Baringhaus–Henze–Epps–Pulley multivariate normality test.")
+NORMAL (U"According to @@Henze & Wagner (1997)@ the test has:")
+LIST_ITEM (U"\\bu affine invariance,")
+LIST_ITEM (U"\\bu consistency against each fixed nonnormal alternative distribution,")
+LIST_ITEM (U"\\bu asymptotic power against contiguous alternatives of order \\Vr (%n),")
+LIST_ITEM (U"\\bu feasibility for any dimension and any sample size.")
+NORMAL (U"The test depends on a smoothing parameter %%h% that can be chosen in various ways:")
+NORMAL (U"@@Henze & Wagner (1997)@ recommend %h = 1.41, while")
+NORMAL (U"@@Tenreiro (2009)@ recommends  %h__%%s% _= 0.448 + 0.026\\.c%d for short tailed alternatives and "
 " %h__%%l%_ = 0.928 + 0.049\\.c%d for long tailed alternatives.")
 MAN_END
 
-MAN_BEGIN (L"Table: Normal probability plot...", L"djmw", 20130619)
-NORMAL (L"In a normal probability plot, the data in the selected column of the @Table are plotted "
+MAN_BEGIN (U"Table: Normal probability plot...", U"djmw", 20130619)
+NORMAL (U"In a normal probability plot, the data in the selected column of the @Table are plotted "
 	"against a normal distribution in such a way that the points should form approximately a straight line. "
 	"Departures from a straight line indicate departures from normality.")
-ENTRY (L"Settings")
-TAG (L"##Number of quantiles#")
-DEFINITION (L"the number of quantile points, %n, in the plot. From this number %n, the quantile points are "
+ENTRY (U"Settings")
+TAG (U"##Number of quantiles#")
+DEFINITION (U"the number of quantile points, %n, in the plot. From this number %n, the quantile points are "
 	"determined as follows: the last quantile point is %q__%n_ = 0.5^^1/%n^ and the first quantile point is "
 	"%q__1_=1\\--%q__%n_. The intermediate quantile points %q__%i_ are determined according to "
 	"%q__%i_=(%i \\-- 0.3175)/(%n + 0.365), where %i runs from 2 to %n\\--1.")
-TAG (L"##Number of sigmas#")
-DEFINITION (L"determines the horizontal and vertical drawing ranges in units of standard deviations. ")
+TAG (U"##Number of sigmas#")
+DEFINITION (U"determines the horizontal and vertical drawing ranges in units of standard deviations. ")
 MAN_END
 
-MAN_BEGIN (L"Table: Quantile-quantile plot...", L"djmw", 20130619)
-NORMAL (L"In a quantile-quantile plot the quantiles of the data in the first selected column of the @Table are plotted against "
+MAN_BEGIN (U"Table: Quantile-quantile plot...", U"djmw", 20130619)
+NORMAL (U"In a quantile-quantile plot the quantiles of the data in the first selected column of the @Table are plotted against "
 	"the quantiles of the data in the second selected column.  If the two sets come from a population with the "
 	"same distribution, the points should fall approximately along the reference line.")
 MAN_END
 
-MAN_BEGIN (L"Table: Bar plot where...", L"djmw", 20140509)
-INTRO (L"Draws a bar plot from data in one or more columns of the selected @Table. In a bar plot the horizontal axis has nominal values (labels). ")
-ENTRY (L"Settings")
-SCRIPT (6, Manual_SETTINGS_WINDOW_HEIGHT (10), L""
+MAN_BEGIN (U"Table: Bar plot where...", U"djmw", 20140509)
+INTRO (U"Draws a bar plot from data in one or more columns of the selected @Table. In a bar plot the horizontal axis has nominal values (labels). ")
+ENTRY (U"Settings")
+SCRIPT (6, Manual_SETTINGS_WINDOW_HEIGHT (10), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Table: Bar plot where", 10)
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Vertical column(s)", "")
 	Manual_DRAW_SETTINGS_WINDOW_RANGE("Vertical range", "0.0", "0.0 (=autoscaling)")
@@ -4130,61 +4130,61 @@ SCRIPT (6, Manual_SETTINGS_WINDOW_HEIGHT (10), L""
 	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN("Garnish", 1)
 	Manual_DRAW_SETTINGS_WINDOW_TEXT("Formula:", "row>1 and row < 10")
 )
-TAG (L"##Vertical column(s)")
-DEFINITION (L"you list the table columns that you want to represent in the bar plot. The number of selected columns is the group size.")
-TAG (L"##Vertical range")
-DEFINITION (L"determine the lower and upper limit of the display.")
-TAG (L"##Column with labels")
-DEFINITION (L"determines the column whose labels will be put at the bottom of the plot.")
-TAG (L"##Distance of first bar from border")
-DEFINITION (L"determines how far the first (and last) bar wil be positioned from the borders (in units of the width of one bar).")
-TAG (L"##Distance between bar groups")
-DEFINITION (L"determines how far groups of bars are from each other. ")
-TAG (L"##Distance between bars within group")
-DEFINITION (L"determines the distance between the bars within each group.")
-TAG (L"##Colours")
-DEFINITION (L"determines the colours of the bars in a group.")
-TAG (L"##Label text angle (degrees)")
-DEFINITION (L"determines the angle of the labels written below the plot. If you have very long label texts you can prevent the label texts from overlapping.")
-TAG (L"##Formula:")
-DEFINITION (L"can be used to supply an expression to select only those rows for plotting where the expression evaluates to %%true%. A 1 value always evaluates to %%true%.")
-ENTRY (L"Examples")
-NORMAL (L"@@Keating & Esposito (2006)@ present a bar plot in their fig. 3 from which we estimate the following data table")
-CODE (L"Language        Modal  Breathy")
-CODE (L"Chong            -1.5    5")
-CODE (L"Fuzhou            2     10")
-CODE (L"Green Hmong       3     12")
-CODE (L"White Hmong       2     11")
-CODE (L"Mon              -1.5    0")
-CODE (L"SADV Zapotec     -6     -4")
-CODE (L"SLQ Zapotec       3.5   14")
-CODE (L"Tlacolula Zapotec 3     13")
-CODE (L"Tamang            1      1")
-CODE (L"!Xoo              1     14")
-NORMAL (L"Given that we have these data in a Table with the three columns labeled \"Language\", \"Modal\" and \"Breathy\", "
+TAG (U"##Vertical column(s)")
+DEFINITION (U"you list the table columns that you want to represent in the bar plot. The number of selected columns is the group size.")
+TAG (U"##Vertical range")
+DEFINITION (U"determine the lower and upper limit of the display.")
+TAG (U"##Column with labels")
+DEFINITION (U"determines the column whose labels will be put at the bottom of the plot.")
+TAG (U"##Distance of first bar from border")
+DEFINITION (U"determines how far the first (and last) bar wil be positioned from the borders (in units of the width of one bar).")
+TAG (U"##Distance between bar groups")
+DEFINITION (U"determines how far groups of bars are from each other. ")
+TAG (U"##Distance between bars within group")
+DEFINITION (U"determines the distance between the bars within each group.")
+TAG (U"##Colours")
+DEFINITION (U"determines the colours of the bars in a group.")
+TAG (U"##Label text angle (degrees)")
+DEFINITION (U"determines the angle of the labels written below the plot. If you have very long label texts you can prevent the label texts from overlapping.")
+TAG (U"##Formula:")
+DEFINITION (U"can be used to supply an expression to select only those rows for plotting where the expression evaluates to %%true%. A 1 value always evaluates to %%true%.")
+ENTRY (U"Examples")
+NORMAL (U"@@Keating & Esposito (2006)@ present a bar plot in their fig. 3 from which we estimate the following data table")
+CODE (U"Language        Modal  Breathy")
+CODE (U"Chong            -1.5    5")
+CODE (U"Fuzhou            2     10")
+CODE (U"Green Hmong       3     12")
+CODE (U"White Hmong       2     11")
+CODE (U"Mon              -1.5    0")
+CODE (U"SADV Zapotec     -6     -4")
+CODE (U"SLQ Zapotec       3.5   14")
+CODE (U"Tlacolula Zapotec 3     13")
+CODE (U"Tamang            1      1")
+CODE (U"!Xoo              1     14")
+NORMAL (U"Given that we have these data in a Table with the three columns labeled \"Language\", \"Modal\" and \"Breathy\", "
 	"respectively, we can first try to reproduce their figure 3 (a bar plot with both Modal and Breathy columns displayed) ")
-NORMAL (L"As you can see the labels in the first column are very long texts and they will surely overlap if "
+NORMAL (U"As you can see the labels in the first column are very long texts and they will surely overlap if "
 	"plotted at the bottom of a plot. We therefore use a value of 15 degrees for the \"Label text angle\" " "parameter. This "
 	"will make the label texts nonoverlapping. We cannot make this angle much larger because then the label texts will run out of "
 	"the viewport. ")
-NORMAL (L"Sometimes you need to plot only a part of the Table and for the selection of this part, the \"Formula\" field can be "
+NORMAL (U"Sometimes you need to plot only a part of the Table and for the selection of this part, the \"Formula\" field can be "
 	"used. Since we only have a small table we put a \"1\" in this field which always evaluates to true. In effect, all the rows will be selected. The following script line will produce the picture below.")
-CODE (L"Bar plot where: \"Modal Breathy\", -10, 20, \"Language\", 1.0, 1.0, 0.0, \"0.9 0.5\", 15.0, \"yes\", \"1\"")
-SCRIPT (5, 3,  L"h1h2 = Create H1H2 table (Esposito 2006)\n"
+CODE (U"Bar plot where: \"Modal Breathy\", -10, 20, \"Language\", 1.0, 1.0, 0.0, \"0.9 0.5\", 15.0, \"yes\", \"1\"")
+SCRIPT (5, 3,  U"h1h2 = Create H1H2 table (Esposito 2006)\n"
 	"Font size: 10\n"
 	"Bar plot where: \"Modal Breathy\", -10, 20, \"Language\", 1.0, 1.0, 0.0, \"0.9 0.5\", 15.0, \"yes\", \"1\"\n"
 	"removeObject: h1h2\n")
-NORMAL (L"The essentials of the bart plot in their paper are perfectly reproduced in the figure above. If you want the bars within a group to be placed somewhat more apart say 0.2 (times the bar width) you can set the \"Distance between bars in a group\" to a value of 0.2:")
-CODE (L"Bar plot where: \"Modal Breathy\", -10, 20, \"Language\", 1.0, 1.0, 0.2, \"0.9 0.5\", 15.0, \"yes\", \"1\"")
-SCRIPT (5, 3,  L"h1h2 = Create H1H2 table (Esposito 2006)\n"
+NORMAL (U"The essentials of the bart plot in their paper are perfectly reproduced in the figure above. If you want the bars within a group to be placed somewhat more apart say 0.2 (times the bar width) you can set the \"Distance between bars in a group\" to a value of 0.2:")
+CODE (U"Bar plot where: \"Modal Breathy\", -10, 20, \"Language\", 1.0, 1.0, 0.2, \"0.9 0.5\", 15.0, \"yes\", \"1\"")
+SCRIPT (5, 3,  U"h1h2 = Create H1H2 table (Esposito 2006)\n"
 	"Font size: 10\n"
 	"Bar plot where: \"Modal Breathy\", -10, 20, \"Language\", 1.0, 1.0, 0.2, \"0.9 0.5\", 15.0, \"yes\", \"1\"\n"
 	"removeObject: h1h2\n")
-NORMAL (L"Of course we can also work with colours and we can add vertical marks as the following sriptlet shows")
-CODE (L"Bar plot where: \"Modal Breathy\", -10, 20, \"Language\", 1.0, 1.0, 0.0, \"Green Red\", 15.0, \"yes\", \"1\"")
-CODE (L"Marks left every: 1, 5, 1, 1, 1")
-CODE (L"Text left: 1, \"H__1_-H__2_ (dB)\"")
-SCRIPT (5, 3,  L"h1h2 = Create H1H2 table (Esposito 2006)\n"
+NORMAL (U"Of course we can also work with colours and we can add vertical marks as the following sriptlet shows")
+CODE (U"Bar plot where: \"Modal Breathy\", -10, 20, \"Language\", 1.0, 1.0, 0.0, \"Green Red\", 15.0, \"yes\", \"1\"")
+CODE (U"Marks left every: 1, 5, 1, 1, 1")
+CODE (U"Text left: 1, \"H__1_-H__2_ (dB)\"")
+SCRIPT (5, 3,  U"h1h2 = Create H1H2 table (Esposito 2006)\n"
 	"Font size: 10\n"
 	"Bar plot where: \"Modal Breathy\", -10, 20, \"Language\", 1.0, 1.0, 0.0, \"Green Red\", 15.0, \"yes\", \"1\"\n"
 	"Marks left every: 1, 5, 1, 1, 1\n"
@@ -4192,24 +4192,24 @@ SCRIPT (5, 3,  L"h1h2 = Create H1H2 table (Esposito 2006)\n"
 	"removeObject: h1h2\n")
 MAN_END
 
-MAN_BEGIN (L"Table: Box plots where...", L"djmw", 20140509)
-INTRO (L"A command to draw @@box plot at s from the data in a column of the selected @Table object.")
-ENTRY (L"Example")
-NORMAL (L"To draw separate box plots for the male, female and children F0 for the @@Peterson & Barney (1952)@ data: ")
-CODE (L"Create formant table (Peterson & Barney 1952)")
-CODE (L"Box plots where: \"F0\", \"Type\", 70, 400, \"1\"")
-CODE (L"Text left: \"yes\", \"F0 (Hz)\"")
-SCRIPT (5,3, L"pb = Create formant table (Peterson & Barney 1952)\n"
+MAN_BEGIN (U"Table: Box plots where...", U"djmw", 20140509)
+INTRO (U"A command to draw @@box plot at s from the data in a column of the selected @Table object.")
+ENTRY (U"Example")
+NORMAL (U"To draw separate box plots for the male, female and children F0 for the @@Peterson & Barney (1952)@ data: ")
+CODE (U"Create formant table (Peterson & Barney 1952)")
+CODE (U"Box plots where: \"F0\", \"Type\", 70, 400, \"1\"")
+CODE (U"Text left: \"yes\", \"F0 (Hz)\"")
+SCRIPT (5,3, U"pb = Create formant table (Peterson & Barney 1952)\n"
 	"Box plots where: \"F0\", \"Type\", 70, 400, \"yes\", \"1\"\n"
 	"Text left: \"yes\", \"F0 (Hz)\"\n"
 	"removeObject: pb\n"
 )
 MAN_END
 
-MAN_BEGIN (L"Table: Line graph where...", L"djmw", 20140509)
-INTRO (L"Draws a line graph from the data in a column of the selected @Table. In a line plot the horizontal axis can have a nominal scale or a numeric scale. The data point are connected by line segments.")
-ENTRY (L"Settings")
-SCRIPT (7, Manual_SETTINGS_WINDOW_HEIGHT (8), L""
+MAN_BEGIN (U"Table: Line graph where...", U"djmw", 20140509)
+INTRO (U"Draws a line graph from the data in a column of the selected @Table. In a line plot the horizontal axis can have a nominal scale or a numeric scale. The data point are connected by line segments.")
+ENTRY (U"Settings")
+SCRIPT (7, Manual_SETTINGS_WINDOW_HEIGHT (8), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Table: Line graph where", 8)
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Vertical column", "")
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Vertical range", "0.0", "0.0 (=autoscaling)")
@@ -4220,51 +4220,51 @@ SCRIPT (7, Manual_SETTINGS_WINDOW_HEIGHT (8), L""
 	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN("Garnish", 1)
 	Manual_DRAW_SETTINGS_WINDOW_TEXT("Formula:", "1; (=everything)")
 )
-TAG (L"##Vertical column")
-DEFINITION (L"The column whose data points you want to plot.")
-TAG (L"##Vertical range")
-DEFINITION (L"determine the lower and upper limits of the plot.")
-TAG (L"##Horizontal column")
-DEFINITION (L"determines the horizontal scale. If you leave it empty, or, if the (selected part of the) selected column contains nominal values, i.e. the values are not numeric but text, the horizontal "
+TAG (U"##Vertical column")
+DEFINITION (U"The column whose data points you want to plot.")
+TAG (U"##Vertical range")
+DEFINITION (U"determine the lower and upper limits of the plot.")
+TAG (U"##Horizontal column")
+DEFINITION (U"determines the horizontal scale. If you leave it empty, or, if the (selected part of the) selected column contains nominal values, i.e. the values are not numeric but text, the horizontal "
 	"distance between the data points will be constant (i.e. 1) and the nominal values (texts) will be put as labels at the bottom of the horizontal axis. "
 	"On the other hand, if this column contains only numerical values, the horizontal position of the data points will be determined by the values in this column.")
-TAG (L"##Horizontal range")
-DEFINITION (L"determines the left and right limit of the plot.")
-TAG (L"##Text")
-DEFINITION (L"The text to put at the position of the data point in the plot.")
-TAG (L"##Label text angle (degrees)")
-DEFINITION (L"determines the angle of the labels written %%below% the plot. If you have very long label texts in the \"Horizontal column\", you can prevent the label texts from overlapping. This only has effect for a horizontal column with nominal values.")
-TAG (L"##Formula")
-DEFINITION (L"can be used to supply an expression to select only those rows for plotting where the expression evaluates to %%true%. A 1 value always evaluates to %%true%.")
-ENTRY (L"Examples")
-NORMAL (L"The following table was estimated from fig. 3 in @@Ganong (1980)@ and represents the fraction /d/ responses as a function of a "
+TAG (U"##Horizontal range")
+DEFINITION (U"determines the left and right limit of the plot.")
+TAG (U"##Text")
+DEFINITION (U"The text to put at the position of the data point in the plot.")
+TAG (U"##Label text angle (degrees)")
+DEFINITION (U"determines the angle of the labels written %%below% the plot. If you have very long label texts in the \"Horizontal column\", you can prevent the label texts from overlapping. This only has effect for a horizontal column with nominal values.")
+TAG (U"##Formula")
+DEFINITION (U"can be used to supply an expression to select only those rows for plotting where the expression evaluates to %%true%. A 1 value always evaluates to %%true%.")
+ENTRY (U"Examples")
+NORMAL (U"The following table was estimated from fig. 3 in @@Ganong (1980)@ and represents the fraction /d/ responses as a function of a "
 	"voice onset time (VOT) continuum. The second column shows the responses in a word - nonword continuum, while the third column shows "
 	"the responses to a nonword - word continuum.")
-CODE (L"VOT dash-tash dask-task")
-CODE (L"-17.5   0.98      0.92")
-CODE (L" -7.5   0.95      0.83")
-CODE (L" -2.5   0.71      0.33")
-CODE (L"  2.5   0.29      0.10")
-CODE (L"  7.5   0.12      0.02")
-CODE (L" 17.5   0.10      0.02")
-NORMAL (L"We can reproduce fig. 3 from Ganong (1980) with the following script, where we labeled the word - nonword curve with \"wn\" and the nonword - word curve with \"nw\". We deselect \"Garnish\" because we want to put special marks at the bottom.")
-CODE (L"Dotted line\n")
-CODE (L"Line graph where: \"dash-tash\", 0, 1, \"VOT\", -20, 20, \"wn\", 0, 0, \"1\"")
-CODE (L"Dashed line\n")
-CODE (L"Line graph where: \"dask-task\", 0, 1, \"VOT\", -20, 20, \"nw\", 0, 0, \"1\"")
-CODE (L"Draw inner box")
-CODE (L"One mark bottom: 2.5, 0, 1, 0, \"+2.5\"")
-CODE (L"One mark bottom: -2.5, 1, 1, 0, \"\"")
-CODE (L"One mark bottom: -7.5,1, 1, 0, \"\"")
-CODE (L"One mark bottom: 7.5, 0, 1, 0, \"+7.5\"")
-CODE (L"One mark bottom: 2.5, 0, 0, 0, \"+2.5\"")
-CODE (L"One mark bottom: -20, 0, 0, 0, \"Short VOT\"")
-CODE (L"One mark bottom: 20, 0, 0, 0, \"Long VOT\"")
-CODE (L"Text bottom: 1, \"VOT (ms)\"")
-CODE (L"Marks left every: 1, 0.2, 1, 1, 0")
-CODE (L"Text left: 1, \"Prop. of voiced responses\"")
-
-SCRIPT (5,3, L"ganong = Create Table (Ganong 1980)\n"
+CODE (U"VOT dash-tash dask-task")
+CODE (U"-17.5   0.98      0.92")
+CODE (U" -7.5   0.95      0.83")
+CODE (U" -2.5   0.71      0.33")
+CODE (U"  2.5   0.29      0.10")
+CODE (U"  7.5   0.12      0.02")
+CODE (U" 17.5   0.10      0.02")
+NORMAL (U"We can reproduce fig. 3 from Ganong (1980) with the following script, where we labeled the word - nonword curve with \"wn\" and the nonword - word curve with \"nw\". We deselect \"Garnish\" because we want to put special marks at the bottom.")
+CODE (U"Dotted line\n")
+CODE (U"Line graph where: \"dash-tash\", 0, 1, \"VOT\", -20, 20, \"wn\", 0, 0, \"1\"")
+CODE (U"Dashed line\n")
+CODE (U"Line graph where: \"dask-task\", 0, 1, \"VOT\", -20, 20, \"nw\", 0, 0, \"1\"")
+CODE (U"Draw inner box")
+CODE (U"One mark bottom: 2.5, 0, 1, 0, \"+2.5\"")
+CODE (U"One mark bottom: -2.5, 1, 1, 0, \"\"")
+CODE (U"One mark bottom: -7.5,1, 1, 0, \"\"")
+CODE (U"One mark bottom: 7.5, 0, 1, 0, \"+7.5\"")
+CODE (U"One mark bottom: 2.5, 0, 0, 0, \"+2.5\"")
+CODE (U"One mark bottom: -20, 0, 0, 0, \"Short VOT\"")
+CODE (U"One mark bottom: 20, 0, 0, 0, \"Long VOT\"")
+CODE (U"Text bottom: 1, \"VOT (ms)\"")
+CODE (U"Marks left every: 1, 0.2, 1, 1, 0")
+CODE (U"Text left: 1, \"Prop. of voiced responses\"")
+
+SCRIPT (5,3, U"ganong = Create Table (Ganong 1980)\n"
 	"Dotted line\n"
 	"Line graph where: \"dash-tash\", 0, 1, \"VOT\", -20, 20, \"wn\", 0, 0, \"1\"\n"
 	"Dashed line\n"
@@ -4282,11 +4282,11 @@ SCRIPT (5,3, L"ganong = Create Table (Ganong 1980)\n"
 	"Text left: 1, \"Prop. of voiced responses\"\n"
 	"removeObject: ganong\n"
 )
-NORMAL (L"As an example of what happens if you don't supply an argument for the \"Horizontal column\" we will use the same table as for the previous plot. However the resulting plot may not be as meaningful (note that the horizontal nominal scale makes all points equidistant in the horizontal direction.)")
-CODE (L"Dotted line\")\n")
-CODE (L"Line graph where: \"dash-tash\", 0, 1, \"\", 0, 0, \"wn\", 0, 1, \"1\"")
-CODE (L"One mark bottom: 1, 0, 1, 0, \"Short VOT\"")
-SCRIPT (5,3, L"ganong = Create Table (Ganong 1980)\n"
+NORMAL (U"As an example of what happens if you don't supply an argument for the \"Horizontal column\" we will use the same table as for the previous plot. However the resulting plot may not be as meaningful (note that the horizontal nominal scale makes all points equidistant in the horizontal direction.)")
+CODE (U"Dotted line\")\n")
+CODE (U"Line graph where: \"dash-tash\", 0, 1, \"\", 0, 0, \"wn\", 0, 1, \"1\"")
+CODE (U"One mark bottom: 1, 0, 1, 0, \"Short VOT\"")
+SCRIPT (5,3, U"ganong = Create Table (Ganong 1980)\n"
 	"Dotted line\n"
 	"Line graph where: \"dash-tash\", 0, 1, \"\", 0, 0, \"wn\", 0, 1, \"1\"\n"
 	"One mark bottom: 1, 0, 1, 0, \"Short VOT\"\n"
@@ -4294,25 +4294,25 @@ SCRIPT (5,3, L"ganong = Create Table (Ganong 1980)\n"
 )
 MAN_END
 
-MAN_BEGIN (L"Table: Horizontal error bars plot where...", L"djmw", 20131220)
-INTRO (L"Draws horizontal lines that represent the error intervals of a data column from the selected @@Table at .")
-NORMAL (L"This command behaves analogous to @@Table: Vertical error bars plot where... at .")
+MAN_BEGIN (U"Table: Horizontal error bars plot where...", U"djmw", 20131220)
+INTRO (U"Draws horizontal lines that represent the error intervals of a data column from the selected @@Table at .")
+NORMAL (U"This command behaves analogous to @@Table: Vertical error bars plot where... at .")
 MAN_END
 
-MAN_BEGIN (L"Table: Horizontal error bars plot...", L"djmw", 20131220)
-INTRO (L"Draws horizontal lines that represent the error intervals of a data column from the selected @@Table at .")
-NORMAL (L"This command behaves analogous to @@Table: Vertical error bars plot where... at .")
+MAN_BEGIN (U"Table: Horizontal error bars plot...", U"djmw", 20131220)
+INTRO (U"Draws horizontal lines that represent the error intervals of a data column from the selected @@Table at .")
+NORMAL (U"This command behaves analogous to @@Table: Vertical error bars plot where... at .")
 MAN_END
 
-MAN_BEGIN (L"Table: Vertical error bars plot...", L"djmw", 20131223)
-INTRO (L"Draws vertical lines that represent the error intervals of a data column from the selected @@Table at .")
-NORMAL (L"For more info see @@Table: Vertical error bars plot where...@")
+MAN_BEGIN (U"Table: Vertical error bars plot...", U"djmw", 20131223)
+INTRO (U"Draws vertical lines that represent the error intervals of a data column from the selected @@Table at .")
+NORMAL (U"For more info see @@Table: Vertical error bars plot where...@")
 MAN_END
 
-MAN_BEGIN (L"Table: Vertical error bars plot where...", L"djmw", 20131223)
-INTRO (L"Draws vertical lines that represent the error intervals of a data column from the selected @@Table at .")
-ENTRY (L"Settings")
-SCRIPT (6, Manual_SETTINGS_WINDOW_HEIGHT (9), L""
+MAN_BEGIN (U"Table: Vertical error bars plot where...", U"djmw", 20131223)
+INTRO (U"Draws vertical lines that represent the error intervals of a data column from the selected @@Table at .")
+ENTRY (U"Settings")
+SCRIPT (6, Manual_SETTINGS_WINDOW_HEIGHT (9), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Table: Vertical confidence intervals plot where", 9)
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Horizontal column", "")
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Horizontal range", "0.0", "0.0 (=autoscaling)")
@@ -4324,32 +4324,32 @@ SCRIPT (6, Manual_SETTINGS_WINDOW_HEIGHT (9), L""
 	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN("Garnish", 1)
 	Manual_DRAW_SETTINGS_WINDOW_TEXT("Formula", "1; (=everything)")
 )
-TAG (L"##Horizontal column")
-DEFINITION (L"determines the data along the horizontal axis.")
-TAG (L"##Horizontal range")
-DEFINITION (L"determines the lower and upper limits of the plot.")
-TAG (L"##Vertical column")
-DEFINITION (L"determines the data along the horizontal axis.")
-TAG (L"##Vertical range")
-DEFINITION (L"determines the lower and upper limits of the plot.")
-TAG (L"##Lower error value column, Upper error value column")
-DEFINITION (L"determine the size of the vertical lines that will be drawn. These lines are drawn between the points (%x,%y-%low) and (%x, %y+%up), "
+TAG (U"##Horizontal column")
+DEFINITION (U"determines the data along the horizontal axis.")
+TAG (U"##Horizontal range")
+DEFINITION (U"determines the lower and upper limits of the plot.")
+TAG (U"##Vertical column")
+DEFINITION (U"determines the data along the horizontal axis.")
+TAG (U"##Vertical range")
+DEFINITION (U"determines the lower and upper limits of the plot.")
+TAG (U"##Lower error value column, Upper error value column")
+DEFINITION (U"determine the size of the vertical lines that will be drawn. These lines are drawn between the points (%x,%y-%low) and (%x, %y+%up), "
 	"where %x and %y are the values from the %%horizontal column% and the %%vertical column%, respectively, and, %low and %up are the corresponding values "
 	"in the %%lower error value column% and the %%upper error value column%, respectively. If either of these column names is not given the corresponding values (%low and/or %up) will taken as zero. This makes it possible to draw one-sided and two-sided error bars. If your "
 	"errors are symmetric around the y-position, your table only needs one column and you can supply the name of this column in both fields.")
-TAG (L"##Bar size (mm)")
-DEFINITION (L"determines the width of the horizontal bars or whishers at the lower an postion of the drawn line. ")
-TAG (L"##Garnish")
-DEFINITION (L"determines whether or not some decoration is drawn.")
-TAG (L"##Formula")
-DEFINITION (L"can be used to supply an expression to select only those rows for plotting where the expression evaluates to %%true%. A 1 value always evaluates to %%true%.")
+TAG (U"##Bar size (mm)")
+DEFINITION (U"determines the width of the horizontal bars or whishers at the lower an postion of the drawn line. ")
+TAG (U"##Garnish")
+DEFINITION (U"determines whether or not some decoration is drawn.")
+TAG (U"##Formula")
+DEFINITION (U"can be used to supply an expression to select only those rows for plotting where the expression evaluates to %%true%. A 1 value always evaluates to %%true%.")
 
 MAN_END
 
-MAN_BEGIN (L"Table: Get median absolute deviation...", L"djmw", 20120405)
-INTRO (L"Get the median absolute deviation (MAD) of the column in the selected @@Table@ (adjusted by a scale factor).")
-ENTRY (L"Algorithm")
-NORMAL (L"From the %n numbers %x__1_, %x__2_, ..., %x__%n_ in the selected column we first calculate the @@quantile algorithm|median@ "
+MAN_BEGIN (U"Table: Get median absolute deviation...", U"djmw", 20120405)
+INTRO (U"Get the median absolute deviation (MAD) of the column in the selected @@Table@ (adjusted by a scale factor).")
+ENTRY (U"Algorithm")
+NORMAL (U"From the %n numbers %x__1_, %x__2_, ..., %x__%n_ in the selected column we first calculate the @@quantile algorithm|median@ "
 	"value %x__median_. Next we calculate the %n absolute deviations from this median: %d__1_, %d__2_, ..., %d__%n_, "
 	"where %d__%j_=|%x__%j_ - %x__median_|. "
 	"Then we calculate the MAD value, which is the median of the %n values %d__1_, %d__2_, ..., %d__%n_. Finally we multiply the MAD "
@@ -4357,364 +4357,364 @@ NORMAL (L"From the %n numbers %x__1_, %x__2_, ..., %x__%n_ in the selected colum
 	"the %x values are normally distributed.")
 MAN_END
 
-MAN_BEGIN (L"Table: Report one-way anova...", L"djmw", 20120617)
-INTRO (L"Performs a one-way analysis of variance on the data in one column of a selected @@Table@ and reports the fixed-effects anova table results in the info window.")
-ENTRY (L"Settings")
-TAG (L"##Column with data#")
-DEFINITION (L"the label of the column who's data will be analyzed.")
-TAG (L"##Factor")
-DEFINITION (L"the label of the column with the names of the levels.")
-TAG (L"##Table with means")
-DEFINITION (L"if checked, a Table with the mean values of the levels will be created.")
-TAG (L"##Table with differences between means")
-DEFINITION (L"if checked, a Table with the differences between the mean values of the levels will be created.")
-TAG (L"##Table with Tukey's post-hoc test")
-DEFINITION (L"if checked, a Table with Tukey's HSD tests will be created. Each value in this Table measures the probability that the corresponding difference between the level means happened by chance. The test compares all possible level means and is based on the studentized range distribution.")
-MAN_END
-
-MAN_BEGIN (L"Table: Report two-way anova...", L"djmw", 20140117)
-INTRO (L"Performs a two-way analysis of variance on the data in one column of a selected %%fully factorial% @@Table@ and reports the fixed-effects anova table in the info window. ")
-ENTRY (L"Settings")
-TAG (L"##Column with data#")
-DEFINITION (L"the label of the column who's data will be analyzed.")
-TAG (L"##First factor")
-DEFINITION (L"the label of the column with the names of the levels for the first factor.")
-TAG (L"##Second factor")
-DEFINITION (L"the label of the column with the names of the levels for the second factor.")
-TAG (L"##Table with means")
-DEFINITION (L"if checked, a Table with the mean values of all the levels will be created.")
-ENTRY (L"Example")
-NORMAL (L"Suppose you want to check if fundamental frequency depends on the type of vowel and speaker type. We will use the "
+MAN_BEGIN (U"Table: Report one-way anova...", U"djmw", 20120617)
+INTRO (U"Performs a one-way analysis of variance on the data in one column of a selected @@Table@ and reports the fixed-effects anova table results in the info window.")
+ENTRY (U"Settings")
+TAG (U"##Column with data#")
+DEFINITION (U"the label of the column who's data will be analyzed.")
+TAG (U"##Factor")
+DEFINITION (U"the label of the column with the names of the levels.")
+TAG (U"##Table with means")
+DEFINITION (U"if checked, a Table with the mean values of the levels will be created.")
+TAG (U"##Table with differences between means")
+DEFINITION (U"if checked, a Table with the differences between the mean values of the levels will be created.")
+TAG (U"##Table with Tukey's post-hoc test")
+DEFINITION (U"if checked, a Table with Tukey's HSD tests will be created. Each value in this Table measures the probability that the corresponding difference between the level means happened by chance. The test compares all possible level means and is based on the studentized range distribution.")
+MAN_END
+
+MAN_BEGIN (U"Table: Report two-way anova...", U"djmw", 20140117)
+INTRO (U"Performs a two-way analysis of variance on the data in one column of a selected %%fully factorial% @@Table@ and reports the fixed-effects anova table in the info window. ")
+ENTRY (U"Settings")
+TAG (U"##Column with data#")
+DEFINITION (U"the label of the column who's data will be analyzed.")
+TAG (U"##First factor")
+DEFINITION (U"the label of the column with the names of the levels for the first factor.")
+TAG (U"##Second factor")
+DEFINITION (U"the label of the column with the names of the levels for the second factor.")
+TAG (U"##Table with means")
+DEFINITION (U"if checked, a Table with the mean values of all the levels will be created.")
+ENTRY (U"Example")
+NORMAL (U"Suppose you want to check if fundamental frequency depends on the type of vowel and speaker type. We will use the "
 	"@@Create formant table (Peterson & Barney 1952)|Peterson & Barney@ vowel data set to illustrate this. "
 	"The following script will first create the data set and then produce the two-way anova report." )
-CODE (L"Create formant table (Peterson & Barney 1952)")
-CODE (L"Report two-way anova: \"F0\", \"Vowel\", \"Type\"")
-NORMAL (L"This will produce the following anova table in the info window:")
-CODE (L"Two-way analysis of \"F0\" by \"Vowel\" and \"Type\".")
-CODE (L"")
-CODE (L"      Source             SS        Df             MS         F         P")
-CODE (L"       Vowel        73719.4         9        8191.05    7.62537    5.25258e-11")
-CODE (L"        Type    4.18943e+06         2    2.09471e+06    1950.05              0")
-CODE (L"Vowel x Type        6714.34        18        373.019   0.347258       0.994969")
-CODE (L"       Error    1.60053e+06      1490        1074.18")
-CODE (L"       Total    5.87039e+06      1519")
-NORMAL (L"The analysis shows that F0 strongly depends on the vowel and also on the speaker type and, luckily, we do not have any "
+CODE (U"Create formant table (Peterson & Barney 1952)")
+CODE (U"Report two-way anova: \"F0\", \"Vowel\", \"Type\"")
+NORMAL (U"This will produce the following anova table in the info window:")
+CODE (U"Two-way analysis of \"F0\" by \"Vowel\" and \"Type\".")
+CODE (U"")
+CODE (U"      Source             SS        Df             MS         F         P")
+CODE (U"       Vowel        73719.4         9        8191.05    7.62537    5.25258e-11")
+CODE (U"        Type    4.18943e+06         2    2.09471e+06    1950.05              0")
+CODE (U"Vowel x Type        6714.34        18        373.019   0.347258       0.994969")
+CODE (U"       Error    1.60053e+06      1490        1074.18")
+CODE (U"       Total    5.87039e+06      1519")
+NORMAL (U"The analysis shows that F0 strongly depends on the vowel and also on the speaker type and, luckily, we do not have any "
 	"interaction between the vowel and the speaker type. Besides the anova table there is also shown a table with the mean F0 "
 	"values for each Vowel-Type combination which looks like:")
-CODE (L"                   c         m         w      Mean")
-CODE (L"        aa       258       124       212       198")
-CODE (L"        ae       248       125       208       194")
-CODE (L"        ah       263       129       223       205")
-CODE (L"        ao       259       127       217       201")
-CODE (L"        eh       259       128       220       202")
-CODE (L"        er       264       133       219       205")
-CODE (L"        ih       270       136       232       213")
-CODE (L"        iy       270       136       231       212")
-CODE (L"        uh       273       136       234       214")
-CODE (L"        uw       278       139       235       218")
-CODE (L"      Mean       264       131       223       206")
-NORMAL (L"The first column of this table shows the vowel codes while the first row shows the speaker types (child, man, women). "
+CODE (U"                   c         m         w      Mean")
+CODE (U"        aa       258       124       212       198")
+CODE (U"        ae       248       125       208       194")
+CODE (U"        ah       263       129       223       205")
+CODE (U"        ao       259       127       217       201")
+CODE (U"        eh       259       128       220       202")
+CODE (U"        er       264       133       219       205")
+CODE (U"        ih       270       136       232       213")
+CODE (U"        iy       270       136       231       212")
+CODE (U"        uh       273       136       234       214")
+CODE (U"        uw       278       139       235       218")
+CODE (U"      Mean       264       131       223       206")
+NORMAL (U"The first column of this table shows the vowel codes while the first row shows the speaker types (child, man, women). "
 	"The last row and the last column of the table shows the averages for the factors Type and Vowel, respectively. The actual "
 	"data are unbalanced because we have 300, 660 and 560 replications per column respectively (for each speaker we have two replcations of the data).")
-ENTRY (L"Algorithm")
-NORMAL (L"The formula's to handle unbalanced designs come from @@Khuri (1998)@.")
-MAN_END
-
-MAN_BEGIN (L"Table: Report one-way Kruskal-Wallis...", L"djmw", 20120617)
-INTRO (L"Performs a one-way Kruskal-Wallis analysis on the data in one column of a selected @@Table@ and reports the results in the info window. This test is sometimes refered to as a one-way analysis of variance for %%non-normally distributed% data.")
-ENTRY (L"Settings")
-TAG (L"##Column with data#")
-DEFINITION (L"the label of the column who's data will be analyzed.")
-TAG (L"##Factor")
-DEFINITION (L"the label of the column with the names of the levels.")
-ENTRY (L"Algorithm")
-NORMAL (L"The analysis is done on the ranked data and consists of the following steps:")
-LIST_ITEM (L"1. Rank all the %N data points together, i.e. rank the data from 1 to %N.")
-LIST_ITEM (L"2. The test statistic is:")
-FORMULA (L"%K = (12 / (%N(%N+1)) \\Si__%i=1_^^%g^ %n__%i_ (meanRank__%i_)^^2^ - 3(%N+1),")
-DEFINITION (L"where %g is the number of levels, %n__%i_ the number of data in %i-th level and meanRank__%i_ "
+ENTRY (U"Algorithm")
+NORMAL (U"The formula's to handle unbalanced designs come from @@Khuri (1998)@.")
+MAN_END
+
+MAN_BEGIN (U"Table: Report one-way Kruskal-Wallis...", U"djmw", 20120617)
+INTRO (U"Performs a one-way Kruskal-Wallis analysis on the data in one column of a selected @@Table@ and reports the results in the info window. This test is sometimes refered to as a one-way analysis of variance for %%non-normally distributed% data.")
+ENTRY (U"Settings")
+TAG (U"##Column with data#")
+DEFINITION (U"the label of the column who's data will be analyzed.")
+TAG (U"##Factor")
+DEFINITION (U"the label of the column with the names of the levels.")
+ENTRY (U"Algorithm")
+NORMAL (U"The analysis is done on the ranked data and consists of the following steps:")
+LIST_ITEM (U"1. Rank all the %N data points together, i.e. rank the data from 1 to %N.")
+LIST_ITEM (U"2. The test statistic is:")
+FORMULA (U"%K = (12 / (%N(%N+1)) \\Si__%i=1_^^%g^ %n__%i_ (meanRank__%i_)^^2^ - 3(%N+1),")
+DEFINITION (U"where %g is the number of levels, %n__%i_ the number of data in %i-th level and meanRank__%i_ "
 	"the average rank of the %i-th level.")
-LIST_ITEM (L"3. The %p value is %%approximated by the \\ci^^2^ (%K, %g - 1) distribution.")
+LIST_ITEM (U"3. The %p value is %%approximated by the \\ci^^2^ (%K, %g - 1) distribution.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Report multivariate normality (BHEP)...", L"djmw", 20090701)
-INTRO (L"Report about multivariate normality according to the @@BHEP multivariate normality test at .")
-ENTRY (L"Settings")
-TAG (L"##Smoothing parameter")
-DEFINITION (L"determines the smoothing parameter %h.")
+MAN_BEGIN (U"TableOfReal: Report multivariate normality (BHEP)...", U"djmw", 20090701)
+INTRO (U"Report about multivariate normality according to the @@BHEP multivariate normality test at .")
+ENTRY (U"Settings")
+TAG (U"##Smoothing parameter")
+DEFINITION (U"determines the smoothing parameter %h.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Change row labels...", L"djmw", 20010822)
-INTRO (L"Changes the row labels of the selected @TableOfReal object according "
+MAN_BEGIN (U"TableOfReal: Change row labels...", U"djmw", 20010822)
+INTRO (U"Changes the row labels of the selected @TableOfReal object according "
 	"to the specification in the search and replace fields.")
-NORMAL (L"Both search and replace fields may contain @@regular expressions|"
+NORMAL (U"Both search and replace fields may contain @@regular expressions|"
 	"Regular expressions at . The ##Replace limit# parameter limits the number of "
 	"replaces that may occur within each label.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Change column labels...", L"djmw", 20010822)
-INTRO (L"Changes the column labels of the selected @TableOfReal object according "
+MAN_BEGIN (U"TableOfReal: Change column labels...", U"djmw", 20010822)
+INTRO (U"Changes the column labels of the selected @TableOfReal object according "
 	"to the specification in the search and replace fields.")
-NORMAL (L"Both search and replace fields may contain @@regular expressions|"
+NORMAL (U"Both search and replace fields may contain @@regular expressions|"
 	"Regular expressions at . The %%Replace limit% parameter limits the number of "
 	"replaces that may occur within each label.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Draw biplot...", L"djmw", 20020603)
-INTRO (L"A command to draw a biplot for each column in the selected "
+MAN_BEGIN (U"TableOfReal: Draw biplot...", U"djmw", 20020603)
+INTRO (U"A command to draw a biplot for each column in the selected "
 	"@TableOfReal object.")
-ENTRY (L"Settings")
-TAG (L"##Xmin#, ##Xmax#, ##Ymin#, ##Ymax#")
-DEFINITION (L"determine the drawing boundaries.")
-TAG (L"##Split factor")
-DEFINITION (L"determines the weighing of the row and column structure "
+ENTRY (U"Settings")
+TAG (U"##Xmin#, ##Xmax#, ##Ymin#, ##Ymax#")
+DEFINITION (U"determine the drawing boundaries.")
+TAG (U"##Split factor")
+DEFINITION (U"determines the weighing of the row and column structure "
 	"(see below).")
-ENTRY (L"Behaviour")
-LIST_ITEM (L"1. Get the @@singular value decomposition@ #U #\\Si #V\\'p of the "
+ENTRY (U"Behaviour")
+LIST_ITEM (U"1. Get the @@singular value decomposition@ #U #\\Si #V\\'p of the "
 	"table.")
-LIST_ITEM (L"2. Calculate weighing factors %\\la for row and columns")
-FORMULA (L"%\\la__r,1_ = %\\si__1_^^%splitFactor^")
-FORMULA (L"%\\la__c,1_ = %\\si__1_^^1-%splitFactor^")
-FORMULA (L"%\\la__r,2_ = %\\si__2_^^%splitFactor^")
-FORMULA (L"%\\la__c,2_ = %\\si__2_^^1-%splitFactor^")
-DEFINITION (L"where %\\si__1_ and %\\si__2_ are the first and the second singular values")
-LIST_ITEM (L"3. For the rows (%i from 1..%numberOfRows) form:")
-FORMULA (L"%xr__%i_ = %U__%i1_  %\\la__%r,1_")
-FORMULA (L"%yr__%i_ = %U__%i2_  %\\la__%r,2_")
-LIST_ITEM (L"4. For the columns (%i from 1..%numberOfColumns) form:")
-FORMULA (L"%xc__%i_ = %V__%i1_  %\\la__%c,1_")
-FORMULA (L"%yc__%i_ = %V__%i2_  %\\la__%c,2_")
-LIST_ITEM (L"5. Plot the points (%xr__%i_, yr__%i_) and (%xc__%i_, yc__%i_) in the "
+LIST_ITEM (U"2. Calculate weighing factors %\\la for row and columns")
+FORMULA (U"%\\la__r,1_ = %\\si__1_^^%splitFactor^")
+FORMULA (U"%\\la__c,1_ = %\\si__1_^^1-%splitFactor^")
+FORMULA (U"%\\la__r,2_ = %\\si__2_^^%splitFactor^")
+FORMULA (U"%\\la__c,2_ = %\\si__2_^^1-%splitFactor^")
+DEFINITION (U"where %\\si__1_ and %\\si__2_ are the first and the second singular values")
+LIST_ITEM (U"3. For the rows (%i from 1..%numberOfRows) form:")
+FORMULA (U"%xr__%i_ = %U__%i1_  %\\la__%r,1_")
+FORMULA (U"%yr__%i_ = %U__%i2_  %\\la__%r,2_")
+LIST_ITEM (U"4. For the columns (%i from 1..%numberOfColumns) form:")
+FORMULA (U"%xc__%i_ = %V__%i1_  %\\la__%c,1_")
+FORMULA (U"%yc__%i_ = %V__%i2_  %\\la__%c,2_")
+LIST_ITEM (U"5. Plot the points (%xr__%i_, yr__%i_) and (%xc__%i_, yc__%i_) in the "
 	"same figure with the corresponding row and column labels.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Draw box plots...", L"djmw", 20000523)
-INTRO (L"A command to draw a @@box plot@ for each column in the selected "
+MAN_BEGIN (U"TableOfReal: Draw box plots...", U"djmw", 20000523)
+INTRO (U"A command to draw a @@box plot@ for each column in the selected "
 	"@TableOfReal object.")
-ENTRY (L"Settings")
-TAG (L"##From row#, ##To row#, ##From column#, ##To column#")
-DEFINITION (L"determine the part of the table that you want to analyse.")
-TAG (L"%Ymin and %Ymax")
-DEFINITION (L"determine the drawing boundaries.")
+ENTRY (U"Settings")
+TAG (U"##From row#, ##To row#, ##From column#, ##To column#")
+DEFINITION (U"determine the part of the table that you want to analyse.")
+TAG (U"%Ymin and %Ymax")
+DEFINITION (U"determine the drawing boundaries.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Draw rows as histogram...", L"djmw", 20030619)
-INTRO (L"A command to draw a histogram from the rows in the selected "
+MAN_BEGIN (U"TableOfReal: Draw rows as histogram...", U"djmw", 20030619)
+INTRO (U"A command to draw a histogram from the rows in the selected "
 	"@TableOfReal object.")
-NORMAL (L"The histogram will consist of %groups of bars. The number of groups will "
+NORMAL (U"The histogram will consist of %groups of bars. The number of groups will "
 	"be determined by the number of selected columns from the table, while the "
 	"number of bars within each group will be determined from the number of "
 	"selected rows.")
-ENTRY (L"Settings")
-TAG (L"##Row numbers# and ##Column range#")
-DEFINITION (L"determine the part of the table that you want to draw. "
+ENTRY (U"Settings")
+TAG (U"##Row numbers# and ##Column range#")
+DEFINITION (U"determine the part of the table that you want to draw. "
 	"The column range determines the number of bars that you want to draw for "
 	"each row selected by the %%Row numbers% argument.")
-TAG (L"##Ymin# and ##Ymax#")
-DEFINITION (L"the drawing boundaries.")
-NORMAL (L"The following arguments are all relative to the width of a bar "
+TAG (U"##Ymin# and ##Ymax#")
+DEFINITION (U"the drawing boundaries.")
+NORMAL (U"The following arguments are all relative to the width of a bar "
 	"in the histogram. ")
-TAG (L"##Horizontal offset")
-DEFINITION (L"the offset from the left and right margin.")
-TAG (L"##Distance between bar groups")
-DEFINITION (L"the distance between each group, i.e., the distance "
+TAG (U"##Horizontal offset")
+DEFINITION (U"the offset from the left and right margin.")
+TAG (U"##Distance between bar groups")
+DEFINITION (U"the distance between each group, i.e., the distance "
 	"between the right side of the last bar in a group to the left side of "
 	"the first bar in the next group.")
-TAG (L"##Distance between bars")
-DEFINITION (L"the distance between the bars in a group.")
-TAG (L"##Grey values")
-DEFINITION (L"the grey values of the bars in a group.")
-ENTRY (L"Bar positioning")
-NORMAL (L"If you want to put the labels yourself you will need the following information.")
-NORMAL (L"The width of a bar is determined as follows:")
-FORMULA (L"%width = 1 / (%nc \\.c %nr + 2 \\.c %hoffset + (%nc - 1)\\.c %intergroup +"
+TAG (U"##Distance between bars")
+DEFINITION (U"the distance between the bars in a group.")
+TAG (U"##Grey values")
+DEFINITION (U"the grey values of the bars in a group.")
+ENTRY (U"Bar positioning")
+NORMAL (U"If you want to put the labels yourself you will need the following information.")
+NORMAL (U"The width of a bar is determined as follows:")
+FORMULA (U"%width = 1 / (%nc \\.c %nr + 2 \\.c %hoffset + (%nc - 1)\\.c %intergroup +"
 		"%nc\\.c(%nr -1)\\.c %interbar),")
-NORMAL (L"where %nc is the number of columns (groups) to draw, %nr is the number of "
+NORMAL (U"where %nc is the number of columns (groups) to draw, %nr is the number of "
 	"rows to draw (the number of bars within a group), %hoffset is the horizontal "
 	"offset, %intergroup the distance between each group and %interbar "
 	"the distance between the bars within a group.")
-NORMAL (L"The spacing between the bars drawn from a row:")
-FORMULA (L"%dx = (%intergroup + %nr + (%nr -1) \\.c %interbar) *% width")
-NORMAL (L"The first bar for the %k-th row starts at:")
-FORMULA (L"%x1 = %hoffset \\.c %width + (%k - 1) \\.c (1 + %interbar) \\.c %width")
+NORMAL (U"The spacing between the bars drawn from a row:")
+FORMULA (U"%dx = (%intergroup + %nr + (%nr -1) \\.c %interbar) *% width")
+NORMAL (U"The first bar for the %k-th row starts at:")
+FORMULA (U"%x1 = %hoffset \\.c %width + (%k - 1) \\.c (1 + %interbar) \\.c %width")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Select columns where row...", L"djmw", 20140117)
-INTRO (L"Copy columns from the selected @TableOfReal object to a new "
+MAN_BEGIN (U"TableOfReal: Select columns where row...", U"djmw", 20140117)
+INTRO (U"Copy columns from the selected @TableOfReal object to a new "
 	"TableOfReal object.")
-ENTRY (L"Settings")
-TAG (L"##Columns")
-DEFINITION (L"defines the indices of the columns to be selected. Ranges can be "
+ENTRY (U"Settings")
+TAG (U"##Columns")
+DEFINITION (U"defines the indices of the columns to be selected. Ranges can be "
 	"defined with a colon \":\". Columns will be selected in the specified "
 	"order.")
-TAG (L"##Row condition")
-DEFINITION (L"specifies a condition for the selection of rows. If the "
+TAG (U"##Row condition")
+DEFINITION (U"specifies a condition for the selection of rows. If the "
 	"condition evaluates as %true for a particular row, the selected elements "
 	"in this row will be copied. See @@Matrix: Formula...@ for the kind of "
 	"expressions that can be used here.")
-ENTRY (L"Examples")
-CODE (L"Select columns where row: \"1 2 3\", \"1\"")
-CODE (L"Select columns where row: \"1 : 3\", \"1\"")
-NORMAL (L"Two alternative expressions to copy the first three columns to a new table "
+ENTRY (U"Examples")
+CODE (U"Select columns where row: \"1 2 3\", \"1\"")
+CODE (U"Select columns where row: \"1 : 3\", \"1\"")
+NORMAL (U"Two alternative expressions to copy the first three columns to a new table "
 	"with the same number of rows.")
-CODE (L"Select columns where row: \"3 : 1\", \"1\"")
-NORMAL (L"Copy the first three columns to a new table with the same number of "
+CODE (U"Select columns where row: \"3 : 1\", \"1\"")
+NORMAL (U"Copy the first three columns to a new table with the same number of "
 	"rows. The new table will have the 3 columns reversed.")
-CODE (L"Select columns where row: \"1:6 9:11\", \"self[row,8]>0\"")
-NORMAL (L"Copy the first six columns and columns 9, 10, and 11 to a new table. "
+CODE (U"Select columns where row: \"1:6 9:11\", \"self[row,8]>0\"")
+NORMAL (U"Copy the first six columns and columns 9, 10, and 11 to a new table. "
 	"Copy only elements from rows where the element in column 8 is greater "
 	"than zero.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Standardize columns", L"djmw", 19990428)
-INTRO (L"Standardizes each column of the selected @TableOfReal.")
-NORMAL (L"The entries %x__%ij_ in the TableOfReal will change to:")
-FORMULA (L"(%x__%ij_ \\-- %\\mu__%j_) / %\\si__%j_, ")
-NORMAL (L"where %\\mu__%j_ and %\\si__%j_ are the mean and the standard deviation as calculated "
+MAN_BEGIN (U"TableOfReal: Standardize columns", U"djmw", 19990428)
+INTRO (U"Standardizes each column of the selected @TableOfReal.")
+NORMAL (U"The entries %x__%ij_ in the TableOfReal will change to:")
+FORMULA (U"(%x__%ij_ \\-- %\\mu__%j_) / %\\si__%j_, ")
+NORMAL (U"where %\\mu__%j_ and %\\si__%j_ are the mean and the standard deviation as calculated "
 	"from the %j^^th^ column, respectively. After standardization all column means will equal zero "
 	"and all column standard deviations will equal one.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To Configuration (lda)...", L"djmw", 19981103)
-INTRO (L"Calculates a @Configuration based on the @Discriminant scores obtained "
+MAN_BEGIN (U"TableOfReal: To Configuration (lda)...", U"djmw", 19981103)
+INTRO (U"Calculates a @Configuration based on the @Discriminant scores obtained "
 	"from the selected @TableOfReal. Row labels in the table indicate group membership.")
-ENTRY (L"Setting")
-TAG (L"##Number of dimensions")
-DEFINITION (L"determines the number of dimensions of the resulting Configuration.")
-ENTRY (L"Algorithm")
-NORMAL (L"First we calculate the Discriminant from the data in the TableOfReal. "
+ENTRY (U"Setting")
+TAG (U"##Number of dimensions")
+DEFINITION (U"determines the number of dimensions of the resulting Configuration.")
+ENTRY (U"Algorithm")
+NORMAL (U"First we calculate the Discriminant from the data in the TableOfReal. "
 	"See @@TableOfReal: To Discriminant@ for details.")
-NORMAL (L"The eigenvectors of the Discriminant determine the directions that "
+NORMAL (U"The eigenvectors of the Discriminant determine the directions that "
 	"the data in the TableOfReal will be projected unto.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To Configuration (pca)...", L"djmw", 19980909)
-INTRO (L"Calculates a @Configuration based on the principal components from the "
+MAN_BEGIN (U"TableOfReal: To Configuration (pca)...", U"djmw", 19980909)
+INTRO (U"Calculates a @Configuration based on the principal components from the "
 	"selected @TableOfReal.")
-ENTRY (L"Setting")
-TAG (L"##Number of dimensions")
-DEFINITION (L"determines the number of dimensions of the resulting Configuration.")
-ENTRY (L"Algorithm")
-NORMAL (L"We form principal components without explicitly calculating the covariance matrix "
+ENTRY (U"Setting")
+TAG (U"##Number of dimensions")
+DEFINITION (U"determines the number of dimensions of the resulting Configuration.")
+ENTRY (U"Algorithm")
+NORMAL (U"We form principal components without explicitly calculating the covariance matrix "
 	"#C = #M\\'p\\.c#M, where #M is the matrix part of the TableOfReal. ")
-LIST_ITEM (L"1. Make the singular value decomposition of #M. This results in "
+LIST_ITEM (U"1. Make the singular value decomposition of #M. This results in "
 	"#M = #U\\.c#d\\.c#V\\'p.")
-LIST_ITEM (L"2. Sort singular values #d and corresponding row vectors in #V (descending).")
-LIST_ITEM (L"3. The principalComponent__%ij_ = \\su__%k=1..%numberOfColumns_ %M__%ik_ \\.c %V__%jk_.")
-ENTRY (L"Remark")
-NORMAL (L"The resulting configuration is unique up to reflections along the new principal directions.")
+LIST_ITEM (U"2. Sort singular values #d and corresponding row vectors in #V (descending).")
+LIST_ITEM (U"3. The principalComponent__%ij_ = \\su__%k=1..%numberOfColumns_ %M__%ik_ \\.c %V__%jk_.")
+ENTRY (U"Remark")
+NORMAL (U"The resulting configuration is unique up to reflections along the new principal directions.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To Correlation", L"djmw", 20020105)
-INTRO (L"A command that creates a (%Pearson) @Correlation object from every "
+MAN_BEGIN (U"TableOfReal: To Correlation", U"djmw", 20020105)
+INTRO (U"A command that creates a (%Pearson) @Correlation object from every "
 	"selected @TableOfReal object. The correlations are calculated between "
 	"columns.")
-ENTRY (L"Algorithm")
-NORMAL (L"The linear correlation coefficient %r__%ij_ (also called the %%product"
+ENTRY (U"Algorithm")
+NORMAL (U"The linear correlation coefficient %r__%ij_ (also called the %%product"
 	" moment correlation coefficient% or %%Pearson's correlation coefficient%) "
 	" between the elements of columns %i and %j is calculated as:")
-FORMULA (L"%r__%ij_ = \\Si__%k_ (%x__%ki_ - %mean__%i_)(%x__%kj_ - %mean__%j_)/"
+FORMULA (U"%r__%ij_ = \\Si__%k_ (%x__%ki_ - %mean__%i_)(%x__%kj_ - %mean__%j_)/"
 	"(\\Vr (\\Si__%k_(%x__%ki_ - %mean__%i_)^2) \\Vr (\\Si__%k_(%x__%kj_ -"
 	" %mean__%j_)^2)),")
-NORMAL (L"where %x__%mn_ is the element %m in column %n, and %mean__%n_ "
+NORMAL (U"where %x__%mn_ is the element %m in column %n, and %mean__%n_ "
 	"is the mean of column %n.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To Correlation (rank)", L"djmw", 20020105)
-INTRO (L"A command that creates a (%%Spearman rank-order%) @Correlation object "
+MAN_BEGIN (U"TableOfReal: To Correlation (rank)", U"djmw", 20020105)
+INTRO (U"A command that creates a (%%Spearman rank-order%) @Correlation object "
 	"from every selected @TableOfReal object. The correlations are calculated "
 	"between columns.")
-ENTRY (L"Algorithm")
-NORMAL (L"The Spearman rank-order correlation coefficient %r__%ij_ between "
+ENTRY (U"Algorithm")
+NORMAL (U"The Spearman rank-order correlation coefficient %r__%ij_ between "
 	"the elements of columns %i and %j is calculated as the linear correlation"
 	" of the ranks:")
-FORMULA (L"%r__%ij_ = \\Si__%k_ (%R__%ki_ - %Rmean__%i_) "
+FORMULA (U"%r__%ij_ = \\Si__%k_ (%R__%ki_ - %Rmean__%i_) "
 	"(%R__%kj_ - %Rmean__%j_) / (\\Vr (\\Si__%k_(%R__%ki_ - %Rmean__%i_)^2) "
 	"\\Vr (\\Si__%k_(%R__%kj_ - %Rmean__%j_)^2)),")
-NORMAL (L"where %R__%mn_ is the rank of element %m in column %n, "
+NORMAL (U"where %R__%mn_ is the rank of element %m in column %n, "
 	"and %Rmean__%n_ is the mean of the ranks in column %n.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To Covariance", L"djmw", 20020117)
-INTRO (L"A command that creates a @Covariance object from every "
+MAN_BEGIN (U"TableOfReal: To Covariance", U"djmw", 20020117)
+INTRO (U"A command that creates a @Covariance object from every "
 	"selected @TableOfReal object. The covariances are calculated between "
 	"columns.")
-ENTRY (L"Algorithm")
-NORMAL (L"The covariance coefficients %s__%ij_ "
+ENTRY (U"Algorithm")
+NORMAL (U"The covariance coefficients %s__%ij_ "
 	" between the elements of columns %i and %j are defined as:")
-FORMULA (L"%s__%ij_ = \\Si__%k_ (%x__%ki_ - %mean__%i_)(%x__%kj_ - %mean__%j_)/"
+FORMULA (U"%s__%ij_ = \\Si__%k_ (%x__%ki_ - %mean__%i_)(%x__%kj_ - %mean__%j_)/"
 	"(%numberOfObservations - %numberOfConstraints),")
-NORMAL (L"where %x__%ki_ is the element %k in column %i, %mean__%i_ "
+NORMAL (U"where %x__%ki_ is the element %k in column %i, %mean__%i_ "
 	"is the mean of column %i, %numberOfObservations equals the number of rows in "
 	"the table, and %numberOfConstraints equals 1.")
-NORMAL (L"The actual calculation goes as follows")
-LIST_ITEM (L"1. Centralize each column (subtract the mean).")
-LIST_ITEM (L"2. Get its @@singular value decomposition@ #U #\\Si #V\\'p.")
-LIST_ITEM (L"3. Form #S = #V #\\Si #V\\'p.")
-LIST_ITEM (L"4. Divide all elements in #S by (%numberOfObservations - 1).")
+NORMAL (U"The actual calculation goes as follows")
+LIST_ITEM (U"1. Centralize each column (subtract the mean).")
+LIST_ITEM (U"2. Get its @@singular value decomposition@ #U #\\Si #V\\'p.")
+LIST_ITEM (U"3. Form #S = #V #\\Si #V\\'p.")
+LIST_ITEM (U"4. Divide all elements in #S by (%numberOfObservations - 1).")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To Discriminant", L"djmw", 19990104)
-INTRO (L"A command that creates a @Discriminant object from every selected "
+MAN_BEGIN (U"TableOfReal: To Discriminant", U"djmw", 19990104)
+INTRO (U"A command that creates a @Discriminant object from every selected "
 	"@TableOfReal object. Row labels in the table indicate group membership.")
-ENTRY (L"Algorithm")
-NORMAL (L"We solve for directions #x that are eigenvectors of the generalized "
+ENTRY (U"Algorithm")
+NORMAL (U"We solve for directions #x that are eigenvectors of the generalized "
 	"eigenvalue equation:")
-FORMULA (L"#%B #x - %\\la #%W #x = 0,")
-NORMAL (L"where #%B and #%W are the between-groups and the within-groups sums of "
+FORMULA (U"#%B #x - %\\la #%W #x = 0,")
+NORMAL (U"where #%B and #%W are the between-groups and the within-groups sums of "
 	"squares and cross-products matrices, respectively. Both #%B and #%W are symmetric "
 	"matrices. Standard formula show that both matrices can also "
 	"be written as a matrix product. The formula above then transforms to:")
-FORMULA (L"#%B__1_\\'p#%B__1_ #x - %\\la #%W__1_\\'p#%W__1_ #x = 0")
-NORMAL (L"The equation can be solved with the @@generalized singular value decomposition at . "
+FORMULA (U"#%B__1_\\'p#%B__1_ #x - %\\la #%W__1_\\'p#%W__1_ #x = 0")
+NORMAL (U"The equation can be solved with the @@generalized singular value decomposition at . "
 	"This procedure is numerically very stable and can even cope with cases when both "
 	"matrices are singular.")
-NORMAL (L"The a priori probabilities in the Discriminant will be calculated from the number of "
+NORMAL (U"The a priori probabilities in the Discriminant will be calculated from the number of "
 	"%training vectors %n__%i_ in each group:")
-FORMULA (L"%aprioriProbability__%i_ = %n__%i_ / \\Si__%k=1..%numberOfGroups_ %n__%k_")
+FORMULA (U"%aprioriProbability__%i_ = %n__%i_ / \\Si__%k=1..%numberOfGroups_ %n__%k_")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To PCA", L"djmw", 19980106)
-INTRO (L"A command that creates a @PCA object from every selected "
+MAN_BEGIN (U"TableOfReal: To PCA", U"djmw", 19980106)
+INTRO (U"A command that creates a @PCA object from every selected "
 	"@TableOfReal object.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To SSCP...", L"djmw", 19990218)
-INTRO (L"Calculates Sums of Squares and Cross Products (@SSCP) from the selected @TableOfReal.")
-ENTRY (L"Algorithm")
-NORMAL (L"The sums of squares and cross products %s__%ij_ "
+MAN_BEGIN (U"TableOfReal: To SSCP...", U"djmw", 19990218)
+INTRO (U"Calculates Sums of Squares and Cross Products (@SSCP) from the selected @TableOfReal.")
+ENTRY (U"Algorithm")
+NORMAL (U"The sums of squares and cross products %s__%ij_ "
 	" between the elements of columns %i and %j are calculated as:")
-FORMULA (L"%s__%ij_ = \\Si__%k_ (%x__%ki_ - %mean__%i_)(%x__%kj_ - %mean__%j_),")
-NORMAL (L"where %x__%mn_ is the element %m in column %n and %mean__%n_ "
+FORMULA (U"%s__%ij_ = \\Si__%k_ (%x__%ki_ - %mean__%i_)(%x__%kj_ - %mean__%j_),")
+NORMAL (U"where %x__%mn_ is the element %m in column %n and %mean__%n_ "
 	"is the mean of column %n.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To Pattern and Categories...", L"djmw", 20040429)
-INTRO (L"Extracts a @Pattern and a @Categories from the selected @TableOfReal.")
-NORMAL (L"The selected rows and columns are copied into the Pattern and "
+MAN_BEGIN (U"TableOfReal: To Pattern and Categories...", U"djmw", 20040429)
+INTRO (U"Extracts a @Pattern and a @Categories from the selected @TableOfReal.")
+NORMAL (U"The selected rows and columns are copied into the Pattern and "
 	"the corresponding row labels are copied into a Categories. ")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To CCA...", L"djmw", 20020424)
-INTRO (L"A command that creates a @CCA object from the selected "
+MAN_BEGIN (U"TableOfReal: To CCA...", U"djmw", 20020424)
+INTRO (U"A command that creates a @CCA object from the selected "
 	"@TableOfReal object.")
-ENTRY (L"Settings")
-TAG (L"%%Dimension of dependent variate (ny)")
-DEFINITION (L"defines the partition of the table into the two parts whose "
+ENTRY (U"Settings")
+TAG (U"%%Dimension of dependent variate (ny)")
+DEFINITION (U"defines the partition of the table into the two parts whose "
 	"correlations will be determined. The first %ny columns must be the "
 	"dependent part, the rest of the columns will be interpreted as the "
 	"independent part (%nx columns). In general %nx must be larger than or "
 	"equal to %ny.")
-ENTRY (L"Behaviour")
-NORMAL (L"Calculates canonical correlations between the %dependent and the "
+ENTRY (U"Behaviour")
+NORMAL (U"Calculates canonical correlations between the %dependent and the "
 	"%independent parts of the table. The corresponding "
 	"canonical coefficients are also determined.")
-ENTRY (L"Algorithm")
-NORMAL (L"The canonical correlation equations for two data sets #T__%y_ "
+ENTRY (U"Algorithm")
+NORMAL (U"The canonical correlation equations for two data sets #T__%y_ "
 	"[%n \\xx %p] and #T__%x_ [n \\xx %q] are:")
-FORMULA (L"(1)    (#S__%yx_ #S__%xx_^^-1^ #S__%yx_\\'p -\\la #S__%yy_)#y = #0")
-FORMULA (L"(2)    (#S__%yx_\\'p #S__%yy_^^-1^ #S__%yx_ -\\la #S__%xx_)#x = #0")
-NORMAL (L"where #S__%yy_ [%p \\xx %p] and #S__%xx_ [%q \\xx %q] are the "
+FORMULA (U"(1)    (#S__%yx_ #S__%xx_^^-1^ #S__%yx_\\'p -\\la #S__%yy_)#y = #0")
+FORMULA (U"(2)    (#S__%yx_\\'p #S__%yy_^^-1^ #S__%yx_ -\\la #S__%xx_)#x = #0")
+NORMAL (U"where #S__%yy_ [%p \\xx %p] and #S__%xx_ [%q \\xx %q] are the "
 	"covariance matrices of data sets #T__%y_ and  #T__%x_, respectively, "
 	"#S__%yx_ [%p \\xx %q] is the matrix of covariances between data sets "
 	"#T__%y_ and #T__%x_, and the vectors #y and #x are the %%canonical "
@@ -4722,34 +4722,34 @@ NORMAL (L"where #S__%yy_ [%p \\xx %p] and #S__%xx_ [%q \\xx %q] are the "
 	"the independent data, respectively. "
 	"In terms of the (dependent) data set #T__%y_ and the (independent) data set "
 	"#T__%x_, these covariances can be written as:")
-FORMULA (L"#S__%yy_ =  #T__%y_\\'p #T__%y_,  #S__%yx_ = #T__%y_\\'p #T__%x_ and "
+FORMULA (U"#S__%yy_ =  #T__%y_\\'p #T__%y_,  #S__%yx_ = #T__%y_\\'p #T__%x_ and "
 	"#S__%xx_ =  #T__%x_\\'p #T__%x_.")
-NORMAL (L"The following @@singular value decomposition at s ")
-FORMULA (L"#T__%y_ = #U__%y_ #D__%y_ #V__%y_\\'p and #T__%x_ = #U__%x_ #D__%x_ "
+NORMAL (U"The following @@singular value decomposition at s ")
+FORMULA (U"#T__%y_ = #U__%y_ #D__%y_ #V__%y_\\'p and #T__%x_ = #U__%x_ #D__%x_ "
 	"#V__%x_\\'p ")
-NORMAL (L"transform equation (1) above into:")
-FORMULA (L"(3)    (#V__%y_ #D__%y_ #U__%y_\\'p#U__%x_ #U__%x_\\'p #U__%y_ #D__%y_ "
+NORMAL (U"transform equation (1) above into:")
+FORMULA (U"(3)    (#V__%y_ #D__%y_ #U__%y_\\'p#U__%x_ #U__%x_\\'p #U__%y_ #D__%y_ "
 	"#V__%y_\\'p - \\la #V__%y_ #D__%y_ #D__%y_ #V__%y_\\'p)#y = 0 ")
-NORMAL (L"where we used the fact that:")
-FORMULA (L"#S__%xx_^^-1^ = #V__%x_ #D__%x_^^-2^ #V__%x_\\'p.")
-NORMAL (L"Equation (3) can be simplified by multiplication from the left by "
+NORMAL (U"where we used the fact that:")
+FORMULA (U"#S__%xx_^^-1^ = #V__%x_ #D__%x_^^-2^ #V__%x_\\'p.")
+NORMAL (U"Equation (3) can be simplified by multiplication from the left by "
 	"#D__%y_^^-1^ #V__%y_' to:")
-FORMULA (L" (4)   ((#U__%x_\\'p #U__%y_)\\'p (#U__%x_\\'p #U__%y_) - \\la #I)#D__%y_ "
+FORMULA (U" (4)   ((#U__%x_\\'p #U__%y_)\\'p (#U__%x_\\'p #U__%y_) - \\la #I)#D__%y_ "
 	"#V__%y_\\'p #y = #0")
-NORMAL (L"This equation can, finally, be solved by a substitution of the s.v.d "
+NORMAL (U"This equation can, finally, be solved by a substitution of the s.v.d "
 	"of  #U__%x_\\'p #U__%y_ = #U #D #V\\'p  into (4). This results in")
-FORMULA (L"(5)  (#D^^2^ - \\la #I) #V\\'p #D__%y_ #V__%y_\\'p #y = #0")
-NORMAL (L"In an analogous way we can reduce eigenequation (2) to:")
-FORMULA (L"(6)  (#D^^2^ - \\la #I) #U\\'p #D__%x_ #V__%x_\\'p #x = #0")
-NORMAL (L"From (5) and (6) we deduce that the eigenvalues in both equations "
+FORMULA (U"(5)  (#D^^2^ - \\la #I) #V\\'p #D__%y_ #V__%y_\\'p #y = #0")
+NORMAL (U"In an analogous way we can reduce eigenequation (2) to:")
+FORMULA (U"(6)  (#D^^2^ - \\la #I) #U\\'p #D__%x_ #V__%x_\\'p #x = #0")
+NORMAL (U"From (5) and (6) we deduce that the eigenvalues in both equations "
 	"are equal to the squared singular values of the product matrix "
 	"#U__%x_\\'p#U__%y_. "
 	"These singular values are also called %%canonical "
 	"correlation coefficients%. The eigenvectors #y and #x can be obtained "
 	"from the columns of the following matrices #Y and #X:")
-FORMULA (L"#Y = #V__%y_ #D__%y_^^-1^ #V")
-FORMULA (L"#X = #V__%x_ #D__%x_^^-1^ #U")
-NORMAL (L"For example, when the vector #y equals the first column of #Y and "
+FORMULA (U"#Y = #V__%y_ #D__%y_^^-1^ #V")
+FORMULA (U"#X = #V__%x_ #D__%x_^^-1^ #U")
+NORMAL (U"For example, when the vector #y equals the first column of #Y and "
 	"the vector #x equals "
 	"the first column of #X, then the vectors #u = #T__%y_#y and #v = #T__%x_#x "
 	"are the linear combinations from #T__%y_ and #T__%x_ that have maximum "
@@ -4757,131 +4757,131 @@ NORMAL (L"For example, when the vector #y equals the first column of #Y and "
 	"correlation coefficient.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: To TableOfReal (means by row labels)...", L"djmw", 20140117)
-INTRO (L"A command that appears in the ##Multivariate statistics# menu if you select a @@TableOfReal at . "
+MAN_BEGIN (U"TableOfReal: To TableOfReal (means by row labels)...", U"djmw", 20140117)
+INTRO (U"A command that appears in the ##Multivariate statistics# menu if you select a @@TableOfReal at . "
 	"It calculates the multivariate means for the different row labels from the selected TableOfReal.")
-ENTRY (L"Setting")
-TAG (L"##Expand")
-DEFINITION (L"when %off, then for a table with %n rows and %m different labels (%m\\<_%n), the resulting table will have %m rows. "
+ENTRY (U"Setting")
+TAG (U"##Expand")
+DEFINITION (U"when %off, then for a table with %n rows and %m different labels (%m\\<_%n), the resulting table will have %m rows. "
 	"When %on, the dimensions of the resulting table will be the same as the originating, and corresponding means substituded "
 	"in each row.")
-ENTRY (L"Example")
-NORMAL (L"The following commands")
-CODE (L"@@Create TableOfReal (Pols 1973)...|Create TableOfReal (Pols 1973)@: \"no\"")
-CODE (L"To TableOfReal (means by row labels): 0")
-NORMAL (L"will result in a new TableOfReal that has 12 rows. Each row will contain the mean F1, F2 and F3 values for a particular vowel. These means "
+ENTRY (U"Example")
+NORMAL (U"The following commands")
+CODE (U"@@Create TableOfReal (Pols 1973)...|Create TableOfReal (Pols 1973)@: \"no\"")
+CODE (U"To TableOfReal (means by row labels): 0")
+NORMAL (U"will result in a new TableOfReal that has 12 rows. Each row will contain the mean F1, F2 and F3 values for a particular vowel. These means "
 	" were obtained from 50 representations of that vowel.")
-NORMAL (L"If we had chosen the %expansion:")
-CODE (L"To TableOfReal (means by row labels): \"yes\"")
-NORMAL (L"the resulting TableOfReal would have had 600 rows. This representation  comes in handy when, for example, you have to calculate deviations from the mean.")
-MAN_END
-
-MAN_BEGIN (L"TextGrid: Extend time...", L"djmw", 20020702)
-INTRO (L"Extends the domain of the selected @TextGrid object.")
-ENTRY (L"Settings")
-TAG (L"##Extend domain by")
-DEFINITION (L"defines the amount of time by which the domain will be extended.")
-TAG (L"##At")
-DEFINITION (L"defines whether starting times or finishing times will be "
+NORMAL (U"If we had chosen the %expansion:")
+CODE (U"To TableOfReal (means by row labels): \"yes\"")
+NORMAL (U"the resulting TableOfReal would have had 600 rows. This representation  comes in handy when, for example, you have to calculate deviations from the mean.")
+MAN_END
+
+MAN_BEGIN (U"TextGrid: Extend time...", U"djmw", 20020702)
+INTRO (U"Extends the domain of the selected @TextGrid object.")
+ENTRY (U"Settings")
+TAG (U"##Extend domain by")
+DEFINITION (U"defines the amount of time by which the domain will be extended.")
+TAG (U"##At")
+DEFINITION (U"defines whether starting times or finishing times will be "
 	"modified.")
-ENTRY (L"Behaviour")
-NORMAL (L"We add an extra (empty) interval into each %%interval tier%. "
+ENTRY (U"Behaviour")
+NORMAL (U"We add an extra (empty) interval into each %%interval tier%. "
 	"This is necessary to keep original intervals intact. According to the "
 	"value of the second argument, the new interval will be added at the "
 	"beginning or at the end of the tier.")
-NORMAL (L"For %%point tiers% only the domain will be changed.")
+NORMAL (U"For %%point tiers% only the domain will be changed.")
 MAN_END
 
-MAN_BEGIN (L"TIMIT acoustic-phonetic speech corpus", L"djmw", 19970320)
-INTRO (L"A large American-English speech corpus that resulted from the joint efforts "
+MAN_BEGIN (U"TIMIT acoustic-phonetic speech corpus", U"djmw", 19970320)
+INTRO (U"A large American-English speech corpus that resulted from the joint efforts "
 	"of several American research sites.")
-NORMAL (L"The TIMIT corpus contains a total of 6300 sentences, 10 sentences spoken by "
+NORMAL (U"The TIMIT corpus contains a total of 6300 sentences, 10 sentences spoken by "
 	"630 speakers selected from 8 major dialect regions of the USA. 70\\%  of "
 	"the speakers are male, 30\\%  are female.")
-NORMAL (L"The text corpus design was done by the Massachusetts Institute of "
+NORMAL (U"The text corpus design was done by the Massachusetts Institute of "
 	"Technology (MIT), Stanford Research Institute and Texas Instruments (TI). "
 	"The speech was recorded at TI, transcribed at MIT, and has been maintained, "
 	"verified and prepared for CDROM production by the American National Institute "
 	"of Standards and Technology (NIST) (@@Lamel et al. (1986)@).")
 MAN_END
 
-MAN_BEGIN (L"VowelEditor", L"djmw", 20111124)
-INTRO (L"An Editor for generating vowel-like @@sound|Sound at s from mouse movements.")
-ENTRY (L"How to get a sound")
-NORMAL (L"With the mouse button down, you can move the mouse cursor around in the plane "
+MAN_BEGIN (U"VowelEditor", U"djmw", 20111124)
+INTRO (U"An Editor for generating vowel-like @@sound|Sound at s from mouse movements.")
+ENTRY (U"How to get a sound")
+NORMAL (U"With the mouse button down, you can move the mouse cursor around in the plane "
 	"spanned by the first two formants. While you move the cursor around, the positions you trace will be "
 	"indicated by blue dots. After you release the mouse button, the color of the trajectory will change "
 	"to black. Next you will hear the vowel-like sound whose "
 	"first two formants follow this trajectory. (The small bars on the trajectory are time markers. With "
 	"default settings, time markers are at 50 milliseconds apart and they may give you an indication of the speed by which you traversed the trajectory.)")
-ENTRY (L"The interface")
-NORMAL (L"In the lower part of the editor a number of buttons and fields are displayed.")
-TAG (L"##Play")
-DEFINITION (L"will play the trajectory.")
-TAG (L"##Reverse")
-DEFINITION (L"will reverse the trajectory and play it.")
-TAG (L"##Publish")
-DEFINITION (L"will publish the sound in the list of objects.")
-TAG (L"##Duration (s)")
-DEFINITION (L"allows to modify the duration of the current trajectory. ")
-TAG (L"##Extend (s)")
-DEFINITION (L"determines the duration of the straight line trajectory that connects the endpoint of the current trajectory with the startpoint of a new trajectory. You may extend the current trajectory by starting a new trajectory with the shift button pressed. After you finished the new trajectory, three trajectories will be appended: the current one, the straight line one and the new one.")
-TAG (L"##Start F0 (Hz)")
-DEFINITION (L"determines the fundamental frequency at the start of the trajectory.")
-TAG (L"##F0 slope (oct/s)")
-DEFINITION (L"determines how many octaves the pitch will changes during the course of the trajectory.")
-NORMAL (L"The bottom line in the Editor displays the first and second formant frequency and the fundamental frequency at the start point and the endpoint of the trajectory.")
-ENTRY (L"Edit menu")
-TAG (L"##Set F0...")
-DEFINITION (L"Set pitch and slope.")
-TAG (L"##Set F3 & F4...")
-DEFINITION (L"Set the frequencies and bandwidths for the third and fourth formant.")
-TAG (L"##Reverse trajectory")
-DEFINITION (L"Reverses the trajectory (like editor button).")   // ??
-TAG (L"##Modify trajectory duration...")
-DEFINITION (L"Modifies trajectory duration (like editor field).")   // ??
-TAG (L"##New trajectory...")
-DEFINITION (L"Set startpoint, endpoint and duration of a new trajectory.")
-TAG (L"##Extend trajectory...")
-DEFINITION (L"Extend current trajectory to...")
-TAG (L"##Shift trajectory...")
-DEFINITION (L"Shift current trajectory.")
-ENTRY (L"View menu")
-TAG (L"##F1 & F2 range...#")
-DEFINITION (L"Modify the horizontal and vertical scales.")
-TAG (L"##Show vowel marks from fixed set...#")
-DEFINITION (L"Show the vowel marks in the editor from a fixed set of vowel inventories.")
-TAG (L"##Show vowel marks from Table file...#")
-DEFINITION (L"Put your own marks in the editor. The Table needs to have at least three mandatory columns "
+ENTRY (U"The interface")
+NORMAL (U"In the lower part of the editor a number of buttons and fields are displayed.")
+TAG (U"##Play")
+DEFINITION (U"will play the trajectory.")
+TAG (U"##Reverse")
+DEFINITION (U"will reverse the trajectory and play it.")
+TAG (U"##Publish")
+DEFINITION (U"will publish the sound in the list of objects.")
+TAG (U"##Duration (s)")
+DEFINITION (U"allows to modify the duration of the current trajectory. ")
+TAG (U"##Extend (s)")
+DEFINITION (U"determines the duration of the straight line trajectory that connects the endpoint of the current trajectory with the startpoint of a new trajectory. You may extend the current trajectory by starting a new trajectory with the shift button pressed. After you finished the new trajectory, three trajectories will be appended: the current one, the straight line one and the new one.")
+TAG (U"##Start F0 (Hz)")
+DEFINITION (U"determines the fundamental frequency at the start of the trajectory.")
+TAG (U"##F0 slope (oct/s)")
+DEFINITION (U"determines how many octaves the pitch will changes during the course of the trajectory.")
+NORMAL (U"The bottom line in the Editor displays the first and second formant frequency and the fundamental frequency at the start point and the endpoint of the trajectory.")
+ENTRY (U"Edit menu")
+TAG (U"##Set F0...")
+DEFINITION (U"Set pitch and slope.")
+TAG (U"##Set F3 & F4...")
+DEFINITION (U"Set the frequencies and bandwidths for the third and fourth formant.")
+TAG (U"##Reverse trajectory")
+DEFINITION (U"Reverses the trajectory (like editor button).")   // ??
+TAG (U"##Modify trajectory duration...")
+DEFINITION (U"Modifies trajectory duration (like editor field).")   // ??
+TAG (U"##New trajectory...")
+DEFINITION (U"Set startpoint, endpoint and duration of a new trajectory.")
+TAG (U"##Extend trajectory...")
+DEFINITION (U"Extend current trajectory to...")
+TAG (U"##Shift trajectory...")
+DEFINITION (U"Shift current trajectory.")
+ENTRY (U"View menu")
+TAG (U"##F1 & F2 range...#")
+DEFINITION (U"Modify the horizontal and vertical scales.")
+TAG (U"##Show vowel marks from fixed set...#")
+DEFINITION (U"Show the vowel marks in the editor from a fixed set of vowel inventories.")
+TAG (U"##Show vowel marks from Table file...#")
+DEFINITION (U"Put your own marks in the editor. The Table needs to have at least three mandatory columns "
 	"labeled \"Vowel\", \"F1\" and  \"F2\" and "
 	"one optional column labeled \"Size\". The Vowel column contains the vowel marker labels, the F1 and "
 	"F2 columns have the first and second formant frequencies in Hertz. The optional Size column contains "
 	"the font size of the vowel markers.")
-TAG (L"##Show trajectory time markers every...")
-DEFINITION (L"Shows time markers as small bars orthogonal to the trajectory. ")
-ENTRY (L"Publishing")
-TAG (L"##Publish Sound")
-TAG (L"##Extract FormantTier")
-TAG (L"##Extract PitchTier")
-DEFINITION (L"Publish the Sound, the PitchTier and the FormantTier from the trajectory.")
-TAG (L"##Draw trajectory...")
-DEFINITION (L"Draws the trajectory in the picture window")
-MAN_END
-
-MAN_BEGIN (L"VowelEditor: Show vowel marks from Table file...", L"djmw", 20111124)
-INTRO (L"A command in the @@VowelEditor@ that lets you set your own vowel marks. ")
-ENTRY (L"Layout of the Table")
-NORMAL (L"The Table needs at least three mandatory columns labeled \"Vowel\", \"F1\" and  \"F2\" and "
+TAG (U"##Show trajectory time markers every...")
+DEFINITION (U"Shows time markers as small bars orthogonal to the trajectory. ")
+ENTRY (U"Publishing")
+TAG (U"##Publish Sound")
+TAG (U"##Extract FormantTier")
+TAG (U"##Extract PitchTier")
+DEFINITION (U"Publish the Sound, the PitchTier and the FormantTier from the trajectory.")
+TAG (U"##Draw trajectory...")
+DEFINITION (U"Draws the trajectory in the picture window")
+MAN_END
+
+MAN_BEGIN (U"VowelEditor: Show vowel marks from Table file...", U"djmw", 20111124)
+INTRO (U"A command in the @@VowelEditor@ that lets you set your own vowel marks. ")
+ENTRY (U"Layout of the Table")
+NORMAL (U"The Table needs at least three mandatory columns labeled \"Vowel\", \"F1\" and  \"F2\" and "
 	"one optional column labeled \"Size\". The Vowel column contains the vowel marker labels, the F1 and "
 	"F2 columns have the first and second formant frequencies in Hertz. The optional Size column contains "
 	"the font size of the vowel markers.")
 MAN_END
 
 /********************** GSL ********************************************/
-MAN_BEGIN (L"incompleteBeta", L"djmw", 20071024)
-TAG (L"##incompleteBeta (%a, %b, %x)")
-DEFINITION (L"I__x_(%a,%b) = 1/beta(%a,%b)\\in__0_^%x %t^^%a-1^(1-%t)^^%b-1^ dt,")
-NORMAL (L"for 0 \\<_ %x \\<_ 1 and %a and %b and %a+%b not equal to a negative integer.")
+MAN_BEGIN (U"incompleteBeta", U"djmw", 20071024)
+TAG (U"##incompleteBeta (%a, %b, %x)")
+DEFINITION (U"I__x_(%a,%b) = 1/beta(%a,%b)\\in__0_^%x %t^^%a-1^(1-%t)^^%b-1^ dt,")
+NORMAL (U"for 0 \\<_ %x \\<_ 1 and %a and %b and %a+%b not equal to a negative integer.")
 //double incompleteBeta (double a, double b, double x);
 //Pre: 0<= x <= 1; a> 0, b>0
 //Def: $I_x(a,b)=B_x(a,b)/B(a,b)=1/B(a,b) \int_0^x t^{a-1}(1-t)^{b-1)dt$
@@ -4889,224 +4889,224 @@ NORMAL (L"for 0 \\<_ %x \\<_ 1 and %a and %b and %a+%b not equal to a negative i
 //Symmetry: $I_x(a,b) = 1 - I_{1-x}(b,a)$
 MAN_END
 
-MAN_BEGIN (L"incompleteGammaP", L"djmw", 20071024)
-TAG (L"##incompleteGammaP (%a, %x)")
-DEFINITION (L"incompleteGammaP = 1/\\Ga(%a)\\in__0_^%x e^^-%t^%t^^%a-1^ dt,")
-NORMAL (L"For %x\\>_ 0 and %a not a negative integer.")
+MAN_BEGIN (U"incompleteGammaP", U"djmw", 20071024)
+TAG (U"##incompleteGammaP (%a, %x)")
+DEFINITION (U"incompleteGammaP = 1/\\Ga(%a)\\in__0_^%x e^^-%t^%t^^%a-1^ dt,")
+NORMAL (U"For %x\\>_ 0 and %a not a negative integer.")
 MAN_END
 
-MAN_BEGIN (L"lnBeta", L"djmw", 20071024)
-TAG (L"##lnBeta (%a, %b)")
-DEFINITION (L"Computes the logarithm of the #beta function, subject to %a and %b and %a+%b not being negative integers.")
+MAN_BEGIN (U"lnBeta", U"djmw", 20071024)
+TAG (U"##lnBeta (%a, %b)")
+DEFINITION (U"Computes the logarithm of the #beta function, subject to %a and %b and %a+%b not being negative integers.")
 MAN_END
 
 /********************* References **************************************/
 
-MAN_BEGIN (L"Bai & Demmel (1993)", L"djmw", 19981007)
-NORMAL (L"Z. Bai & J. Demmel (1993): \"Computing the generalized singular value "
+MAN_BEGIN (U"Bai & Demmel (1993)", U"djmw", 19981007)
+NORMAL (U"Z. Bai & J. Demmel (1993): \"Computing the generalized singular value "
 	"decomposition.\" %%SIAM J. Sci. Comput.% #14: 1464\\--1486.")
 MAN_END
 
-MAN_BEGIN (L"Bartlett (1954)", L"djmw", 20011111)
-NORMAL (L"M.S. Bartlett (1954): \"A note on multiplying factors for various "
+MAN_BEGIN (U"Bartlett (1954)", U"djmw", 20011111)
+NORMAL (U"M.S. Bartlett (1954): \"A note on multiplying factors for various "
 	"chi-squared approximations.\", %%Joural of the Royal Statistical Society, "
 	"Series B% #16: 296\\--298")
 MAN_END
 
-MAN_BEGIN (L"Boll (1979)", L"djmw", 20121021)
-NORMAL (L"S.F. Boll (1979): \"Suppression of acoustic noise in speech using spectral subtraction.\""
+MAN_BEGIN (U"Boll (1979)", U"djmw", 20121021)
+NORMAL (U"S.F. Boll (1979): \"Suppression of acoustic noise in speech using spectral subtraction.\""
 	"%%IEEE Transactions on ASSP% #27: 113\\--120.")
 MAN_END
 
-MAN_BEGIN (L"Boomsma (1977)", L"djmw", 20020524)
-NORMAL (L"A. Boomsma (1977): \"Comparing approximations of confidence intervals "
+MAN_BEGIN (U"Boomsma (1977)", U"djmw", 20020524)
+NORMAL (U"A. Boomsma (1977): \"Comparing approximations of confidence intervals "
 	"for the product-moment correlation coefficient.\" %%Statistica Neerlandica% "
 	"#31: 179-186.")
 MAN_END
 
-MAN_BEGIN (L"Cooley & Lohnes (1971)", L"djmw", 20060322)
-NORMAL (L"W.W. Colley & P.R. Lohnes (1971): %%Multivariate data analysis%. "
+MAN_BEGIN (U"Cooley & Lohnes (1971)", U"djmw", 20060322)
+NORMAL (U"W.W. Colley & P.R. Lohnes (1971): %%Multivariate data analysis%. "
 	"John Wiley & Sons.")
 MAN_END
 
-MAN_BEGIN (L"Davis & Mermelstein (1980)", L"djmw", 20010419)
-NORMAL (L"S.B. Davis & P. Mermelstein (1980), \"Comparison of parametric "
+MAN_BEGIN (U"Davis & Mermelstein (1980)", U"djmw", 20010419)
+NORMAL (U"S.B. Davis & P. Mermelstein (1980), \"Comparison of parametric "
 	"representations for monosyllabic word recognition in continuously "
 	"spoken sentences.\" "
 	"%%IEEE Transactions on ASSP% #28: 357\\--366.")
 MAN_END
 
-MAN_BEGIN (L"Efron & Tibshirani (1993)", L"djmw", 20031103)
-NORMAL (L"B. Efron & R.J. Tibshirani (1993): %%An introduction "
+MAN_BEGIN (U"Efron & Tibshirani (1993)", U"djmw", 20031103)
+NORMAL (U"B. Efron & R.J. Tibshirani (1993): %%An introduction "
 	"to the bootstrap%. Chapman & Hall.")
 MAN_END
 
-MAN_BEGIN (L"Espeak", L"djmw", 20111217)
-NORMAL (L"Jonathan Duddington's Espeak speech synthesizer, available via http://espeak.sourceforge.net/")
+MAN_BEGIN (U"Espeak", U"djmw", 20111217)
+NORMAL (U"Jonathan Duddington's Espeak speech synthesizer, available via http://espeak.sourceforge.net/")
 MAN_END
 
-MAN_BEGIN (L"Flanagan (1960)", L"djmw", 19980713)
-NORMAL (L"J.L. Flanagan (1960): \"Models for approximating basilar membrane "
+MAN_BEGIN (U"Flanagan (1960)", U"djmw", 19980713)
+NORMAL (U"J.L. Flanagan (1960): \"Models for approximating basilar membrane "
 	"displacement.\" %%Bell System Technical Journal% #39: 1163\\--1191.")
 MAN_END
 
-MAN_BEGIN (L"Friedl (1997)", L"djmw", 20010710)
-NORMAL (L"J.E.F. Friedl (1997): %%Mastering Regular Expressions%. "
+MAN_BEGIN (U"Friedl (1997)", U"djmw", 20010710)
+NORMAL (U"J.E.F. Friedl (1997): %%Mastering Regular Expressions%. "
 	"O'Reilly & Associates.")
 MAN_END
 
-MAN_BEGIN (L"Ganong (1980)", L"djmw", 20130622)
-NORMAL (L"W.F. Ganong III (1980): \"Phonetic categorization in auditory word perception.\" %%Journal of Experimental Psychology: Human Perception and Performance% #6: 110\\--125.") 
+MAN_BEGIN (U"Ganong (1980)", U"djmw", 20130622)
+NORMAL (U"W.F. Ganong III (1980): \"Phonetic categorization in auditory word perception.\" %%Journal of Experimental Psychology: Human Perception and Performance% #6: 110\\--125.") 
 MAN_END
 
-MAN_BEGIN (L"Greiner & Hormann (1998)", L"djmw", 20110617)
-NORMAL (L"G. Greiner & K. Hormann (1998): \"Efficient clipping of arbitrary polygons.\" %%ACM Transactions on Graphics% #17: 71\\--83.")
+MAN_BEGIN (U"Greiner & Hormann (1998)", U"djmw", 20110617)
+NORMAL (U"G. Greiner & K. Hormann (1998): \"Efficient clipping of arbitrary polygons.\" %%ACM Transactions on Graphics% #17: 71\\--83.")
 MAN_END
 
-MAN_BEGIN (L"Heath et al. (1986)", L"djmw", 19981007)
-NORMAL (L"M.T. Heath, J.A. Laub, C.C. Paige & R.C. Ward (1986): \"Computing the "
+MAN_BEGIN (U"Heath et al. (1986)", U"djmw", 19981007)
+NORMAL (U"M.T. Heath, J.A. Laub, C.C. Paige & R.C. Ward (1986): \"Computing the "
 	"singular value decomposition of a product of two matrices.\" "
 	"%%SIAM J. Sci. Statist. Comput.% #7: 1147\\--1159.")
 MAN_END
 
-MAN_BEGIN (L"Hermes (1988)", L"djmw", 19980123)
-NORMAL (L"D.J. Hermes (1988): \"Measurement of pitch by subharmonic "
+MAN_BEGIN (U"Hermes (1988)", U"djmw", 19980123)
+NORMAL (U"D.J. Hermes (1988): \"Measurement of pitch by subharmonic "
 	"summation.\" %%Journal of the Acoustical Society of America% #83: 257\\--264.")
 MAN_END
 
-MAN_BEGIN (L"Henze & Wagner (1997)", L"djmw", 20090630)
-NORMAL (L"N. Henze & T. Wagner (1997): \"A new npproach to the BHEP Tests for Multivariate Normality.\" "
+MAN_BEGIN (U"Henze & Wagner (1997)", U"djmw", 20090630)
+NORMAL (U"N. Henze & T. Wagner (1997): \"A new npproach to the BHEP Tests for Multivariate Normality.\" "
 	"%%Journal of Multivariate Analysis% #62: 1\\--23.")
 MAN_END
 
-MAN_BEGIN (L"Hormann & Agathos (2001)", L"djmw", 20110617)
-NORMAL (L"K. Hormann & A. Agathos (2001): \"The point in polygon problem for arbitrary polygons.\" "
+MAN_BEGIN (U"Hormann & Agathos (2001)", U"djmw", 20110617)
+NORMAL (U"K. Hormann & A. Agathos (2001): \"The point in polygon problem for arbitrary polygons.\" "
 	"%%Computational Geometry% #20: 131\\--144.")
 MAN_END
 
-MAN_BEGIN (L"Irino & Patterson (1997)", L"djmw", 20100517)
-NORMAL (L"T. Irino & R.D. Patterson (1997): \"A time-domain, level-dependent "
+MAN_BEGIN (U"Irino & Patterson (1997)", U"djmw", 20100517)
+NORMAL (U"T. Irino & R.D. Patterson (1997): \"A time-domain, level-dependent "
 	"auditory filter: The gammachirp.\" %%Journal of the Acoustical Society of America% #101: 412\\--419.")
 MAN_END
 
-MAN_BEGIN (L"Johannesma (1972)", L"djmw", 19980123)
-NORMAL (L"P.I.M. Johannesma (1972): \"The pre-response stimulus ensemble of "
+MAN_BEGIN (U"Johannesma (1972)", U"djmw", 19980123)
+NORMAL (U"P.I.M. Johannesma (1972): \"The pre-response stimulus ensemble of "
 	"neurons in the cochlear nucleus.\" In %%Symposium on Hearing Theory% "
 	"(IPO, Eindhoven, Holland), 58\\--69.")
 MAN_END
 
-MAN_BEGIN (L"Johnson (1998)", L"djmw", 20000525)
-NORMAL (L"D.E. Johnson (1998): %%Applied Multivariate methods%.")
+MAN_BEGIN (U"Johnson (1998)", U"djmw", 20000525)
+NORMAL (U"D.E. Johnson (1998): %%Applied Multivariate methods%.")
 MAN_END
 
-MAN_BEGIN (L"Keating & Esposito (2006)", L"djmw", 20130620)
-NORMAL (L"P.A. Keating & C. Esposito (2006): \"Linguistic voice quality.\" %%UCLA Working Papers in Phonetics% #105: 85\\--91.")
+MAN_BEGIN (U"Keating & Esposito (2006)", U"djmw", 20130620)
+NORMAL (U"P.A. Keating & C. Esposito (2006): \"Linguistic voice quality.\" %%UCLA Working Papers in Phonetics% #105: 85\\--91.")
 MAN_END
 
-MAN_BEGIN (L"Khuri (1998)", L"djmw", 20120702)
-NORMAL (L"A. Khuri (1998): \"Unweighted sums of squares in unbalanced analysis of variance.\", %%Journal of Statistical Planning "
+MAN_BEGIN (U"Khuri (1998)", U"djmw", 20120702)
+NORMAL (U"A. Khuri (1998): \"Unweighted sums of squares in unbalanced analysis of variance.\", %%Journal of Statistical Planning "
 	"and Inference% #74: 135\\--147.")
 MAN_END
 
-MAN_BEGIN (L"Kim & Kim (2006)", L"djmw", 20110617)
-NORMAL (L"D.H. Kim & M.-J. Kim (2006): \"An extension of polygon clipping to resolve degenerate cases.\" %%Computer-Aided Design & Applications% #3: 447\\--456.")
+MAN_BEGIN (U"Kim & Kim (2006)", U"djmw", 20110617)
+NORMAL (U"D.H. Kim & M.-J. Kim (2006): \"An extension of polygon clipping to resolve degenerate cases.\" %%Computer-Aided Design & Applications% #3: 447\\--456.")
 MAN_END
 
-MAN_BEGIN (L"Krishnamoorthy & Yu (2004)", L"djmw", 20090813)
-NORMAL (L"K. Krishnamoortht & J. Yu (2004): \"Modified Nel and Van der Merwe test for multivariate "
+MAN_BEGIN (U"Krishnamoorthy & Yu (2004)", U"djmw", 20090813)
+NORMAL (U"K. Krishnamoortht & J. Yu (2004): \"Modified Nel and Van der Merwe test for multivariate "
 	"Behrens-Fisher problem.\" %%Statistics & Probability Letters% #66: 161\\--169.")
 MAN_END
 
-MAN_BEGIN (L"Lamel et al. (1986)", L"djmw", 19980123)
-NORMAL (L"L.F. Lamel, R.H. Kassel & S. Sennef (1986): \"Speech Database "
+MAN_BEGIN (U"Lamel et al. (1986)", U"djmw", 19980123)
+NORMAL (U"L.F. Lamel, R.H. Kassel & S. Sennef (1986): \"Speech Database "
 	"Development: Design and Analysis of the Acoustic-Phonetic Corpus.\" "
 	"%%Proc. DARPA Speech Recognition Workshop%, Report No. SAIC-86/1546, "
 	"100\\--119.")
 MAN_END
 
-MAN_BEGIN (L"Morrison (1990)", L"djmw", 19980123)
-NORMAL (L"D.F. Morrison (1990): %%Multivariate Statistical Methods%. "
+MAN_BEGIN (U"Morrison (1990)", U"djmw", 19980123)
+NORMAL (U"D.F. Morrison (1990): %%Multivariate Statistical Methods%. "
 	"New York: McGraw-Hill.")
 MAN_END
 
-MAN_BEGIN (L"Peterson & Barney (1952)", L"djmw", 20020620)
-NORMAL (L"G.E. Peterson & H.L. Barney (1952): \"Control methods used in a study "
+MAN_BEGIN (U"Peterson & Barney (1952)", U"djmw", 20020620)
+NORMAL (U"G.E. Peterson & H.L. Barney (1952): \"Control methods used in a study "
 	"of the vowels.\" %%Journal of the Acoustical Society of America% #24: 175\\--184")
 MAN_END
 
-MAN_BEGIN (L"Pols et al. (1973)", L"djmw", 19990426)
-NORMAL (L"L.C.W. Pols, H.R.C. Tromp & R. Plomp (1973): "
+MAN_BEGIN (U"Pols et al. (1973)", U"djmw", 19990426)
+NORMAL (U"L.C.W. Pols, H.R.C. Tromp & R. Plomp (1973): "
 	"\"Frequency analysis of Dutch vowels from 50 male speakers.\" "
 	"%%Journal of the Acoustical Society of America% #53: 1093\\--1101.")
 MAN_END
 
-MAN_BEGIN (L"Press et al. (1992)", L"djmw", 19980114)
-NORMAL (L"W.H. Press, S.A. Teukolsky, W.T. Vetterling & B.P. Flannery (1992): "
+MAN_BEGIN (U"Press et al. (1992)", U"djmw", 19980114)
+NORMAL (U"W.H. Press, S.A. Teukolsky, W.T. Vetterling & B.P. Flannery (1992): "
 	"%%Numerical recipes in C: The art of scientific computing%. "
 	"Second Edition. Cambridge University Press.")
 MAN_END
 
-MAN_BEGIN (L"Sakoe & Chiba (1978)", L"djmw", 20050302)
-NORMAL (L"H. Sakoe & S. Chiba (1978): \"Dynamic programming algorithm optimization for spoken word recognition.\" "
+MAN_BEGIN (U"Sakoe & Chiba (1978)", U"djmw", 20050302)
+NORMAL (U"H. Sakoe & S. Chiba (1978): \"Dynamic programming algorithm optimization for spoken word recognition.\" "
 	"%%Transactions on ASSP% #26: 43\\--49.")
 MAN_END
 
-MAN_BEGIN (L"Sekey & Hanson (1984)", L"djmw", 20050302)
-NORMAL (L"A. Sekey & B.A. Hanson (1984): \"Improved 1-Bark bandwidth auditory filter.\" "
+MAN_BEGIN (U"Sekey & Hanson (1984)", U"djmw", 20050302)
+NORMAL (U"A. Sekey & B.A. Hanson (1984): \"Improved 1-Bark bandwidth auditory filter.\" "
 	"%%Journal of the Acoustical Society of America% #75: 1902\\--1904.")
 MAN_END
 
-MAN_BEGIN (L"Schott (2001)", L"djmw", 20090629)
-NORMAL (L"J. R. Schott (2001): \"Some tests for the equality of covariance matrices.\" "
+MAN_BEGIN (U"Schott (2001)", U"djmw", 20090629)
+NORMAL (U"J. R. Schott (2001): \"Some tests for the equality of covariance matrices.\" "
 	"%%Journal of Statistical Planning and Inference% #94: 25\\-–36.")
 MAN_END
 
-MAN_BEGIN (L"Shepard (1964)", L"djmw", 19980114)
-NORMAL (L"R.N. Shepard (1964): \"Circularity in judgments of relative pitch.\" "
+MAN_BEGIN (U"Shepard (1964)", U"djmw", 19980114)
+NORMAL (U"R.N. Shepard (1964): \"Circularity in judgments of relative pitch.\" "
 	"%%Journal of the Acoustical Society of America% #36: 2346\\--2353.")
 MAN_END
 
-MAN_BEGIN (L"Slaney (1993)", L"djmw", 19980712)
-NORMAL (L"M. Slaney (1993): \"An efficient implementation of the "
+MAN_BEGIN (U"Slaney (1993)", U"djmw", 19980712)
+NORMAL (U"M. Slaney (1993): \"An efficient implementation of the "
 	"Patterson-Holdsworth auditory filterbank.\" "
 	"%%Apple Computer Technical Report% #35, 41 pages.")
 MAN_END
 
-MAN_BEGIN (L"Tribolet et al. (1979)", L"djmw", 20010114)
-NORMAL (L"J.M. Tribolet & T.F. Quatieri (1979): \"Computation of the Complex "
+MAN_BEGIN (U"Tribolet et al. (1979)", U"djmw", 20010114)
+NORMAL (U"J.M. Tribolet & T.F. Quatieri (1979): \"Computation of the Complex "
 	"Cepstrum.\" In %%Programs for Digital Signal Processing%, "
 	"Digital Signal Processing Committee (eds.), IEEE Press.")
 MAN_END
 
-MAN_BEGIN (L"Tukey (1977)", L"djmw", 20000524)
-NORMAL (L"J.W. Tukey (1977): %%Exploratory data analysis%. Reading, MA: Addison-Wesley.")
+MAN_BEGIN (U"Tukey (1977)", U"djmw", 20000524)
+NORMAL (U"J.W. Tukey (1977): %%Exploratory data analysis%. Reading, MA: Addison-Wesley.")
 MAN_END
 
-MAN_BEGIN (L"Van Nierop et al. (1973)", L"djmw", 20020620)
-NORMAL (L"D.J.P.J. Van Nierop, L.C.W. Pols & R. Plomp (1973): \"Frequency "
+MAN_BEGIN (U"Van Nierop et al. (1973)", U"djmw", 20020620)
+NORMAL (U"D.J.P.J. Van Nierop, L.C.W. Pols & R. Plomp (1973): \"Frequency "
 	"analysis of Dutch vowels from 25 female speakers.\" %%Acustica% #29: 110\\--118")
 MAN_END
 
-MAN_BEGIN (L"Weenink (1985)", L"djmw", 20111010)
-NORMAL (L"D.J.M. Weenink (1985), \"Formant analysis of Dutch vowels from 10 children\", "
+MAN_BEGIN (U"Weenink (1985)", U"djmw", 20111010)
+NORMAL (U"D.J.M. Weenink (1985), \"Formant analysis of Dutch vowels from 10 children\", "
 		"%%Proceedings of the Institute of Phonetic Sciences of the "
 		"University of Amsterdam% #9, 45\\--52.")
 MAN_END
 
-MAN_BEGIN (L"Watrous (1991)", L"djmw", 20080125)
-NORMAL (L"R.L. Watrous (1991): \"Current status of Peterson-Barney vowel formant data.\" "
+MAN_BEGIN (U"Watrous (1991)", U"djmw", 20080125)
+NORMAL (U"R.L. Watrous (1991): \"Current status of Peterson-Barney vowel formant data.\" "
 	"%%Journal of the Acoustical Society of America% #89: 2459\\--2460.")
 MAN_END
 
-MAN_BEGIN (L"Weenink (1999)", L"djmw", 20041217)
-NORMAL (L"D.J.M. Weenink (1999): \"Accurate algorithms for performing "
+MAN_BEGIN (U"Weenink (1999)", U"djmw", 20041217)
+NORMAL (U"D.J.M. Weenink (1999): \"Accurate algorithms for performing "
  		"principal component analysis and discriminant analysis.\" "
 		"%%Proceedings of the Institute of Phonetic Sciences of the "
 		"University of Amsterdam% #23: 77\\--89.")
 MAN_END
 
-MAN_BEGIN (L"Weenink (2003)", L"djmw", 20040225)
-NORMAL (L"D.J.M. Weenink (2003): \"Canonical correlation analysis.\" "
+MAN_BEGIN (U"Weenink (2003)", U"djmw", 20040225)
+NORMAL (U"D.J.M. Weenink (2003): \"Canonical correlation analysis.\" "
 		"%%Proceedings of the Institute of Phonetic Sciences of the "
 		"University of Amsterdam% #25: 81\\--99.")
 MAN_END
diff --git a/dwtools/octave-workspace b/dwtools/octave-workspace
deleted file mode 100644
index 8823136..0000000
Binary files a/dwtools/octave-workspace and /dev/null differ
diff --git a/dwtools/praat_BSS_init.cpp b/dwtools/praat_BSS_init.cpp
index 75798a9..31b49c6 100644
--- a/dwtools/praat_BSS_init.cpp
+++ b/dwtools/praat_BSS_init.cpp
@@ -1,6 +1,6 @@
 /* praat_BSS_init.c
  *
- * Copyright (C) 2010-2014 David Weenink
+ * Copyright (C) 2010-2014, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,33 +38,33 @@ void praat_TableOfReal_init3 (ClassInfo klas);
 
 /******************** EEG ********************************************/
 
-FORM (EEG_to_CrossCorrelationTable, L"EEG: To CrossCorrelationTable", L"EEG: To CrossCorrelationTable...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
-	REAL (L"Lag step (s)", L"0.05")
-	TEXTFIELD (L"Channel ranges", L"1:64")
-	LABEL (L"", L"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
+FORM (EEG_to_CrossCorrelationTable, U"EEG: To CrossCorrelationTable", U"EEG: To CrossCorrelationTable...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
+	REAL (U"Lag step (s)", U"0.05")
+	TEXTFIELD (U"Channel ranges", U"1:64")
+	LABEL (U"", U"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
 	OK
 DO
-	double startTime = GET_REAL (L"left Time range"), endTime = GET_REAL (L"right Time range");
-	double lagTime = GET_REAL (L"Lag step");
-	const wchar_t *channelRanges = GET_STRING (L"Channel ranges");
+	double startTime = GET_REAL (U"left Time range"), endTime = GET_REAL (U"right Time range");
+	double lagTime = GET_REAL (U"Lag step");
+	const char32 *channelRanges = GET_STRING (U"Channel ranges");
 	LOOP {
 		iam (EEG);
 		autoCrossCorrelationTable cct = EEG_to_CrossCorrelationTable (me, startTime, endTime, lagTime, channelRanges);
-		praat_new (cct.transfer(), my name, L"_", Melder_integer (lagTime*1000)); // lagTime to ms
+		praat_new (cct.transfer(), my name, U"_", (long) floor (lagTime*1000)); // lagTime to ms   ppgb: geeft afrondingsfouten; waarom niet round?
 	}
 END
 
-FORM (EEG_to_Covariance, L"EEG: To Covariance", L"EEG: To Covariance...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
-	TEXTFIELD (L"Channel ranges", L"1:64")
-	LABEL (L"", L"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
+FORM (EEG_to_Covariance, U"EEG: To Covariance", U"EEG: To Covariance...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
+	TEXTFIELD (U"Channel ranges", U"1:64")
+	LABEL (U"", U"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
 	OK
 DO
-	double startTime = GET_REAL (L"left Time range"), endTime = GET_REAL (L"right Time range");
-	const wchar_t *channelRanges = GET_STRING (L"Channel ranges");
+	double startTime = GET_REAL (U"left Time range"), endTime = GET_REAL (U"right Time range");
+	const char32 *channelRanges = GET_STRING (U"Channel ranges");
 	LOOP {
 		iam (EEG);
 		autoCovariance cov = EEG_to_Covariance (me, startTime, endTime, channelRanges);
@@ -72,67 +72,67 @@ DO
 	}
 END
 
-FORM (EEG_to_CrossCorrelationTables, L"EEG: To CrossCorrelationTables", L"EEG: To CrossCorrelationTables...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
-	POSITIVE (L"Lag step (s)", L"0.02")
-	NATURAL (L"Number of cross-correlations", L"40")
-	LABEL (L"", L"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
-	TEXTFIELD (L"Channel ranges", L"1:64")
+FORM (EEG_to_CrossCorrelationTables, U"EEG: To CrossCorrelationTables", U"EEG: To CrossCorrelationTables...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
+	POSITIVE (U"Lag step (s)", U"0.02")
+	NATURAL (U"Number of cross-correlations", U"40")
+	LABEL (U"", U"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
+	TEXTFIELD (U"Channel ranges", U"1:64")
 	OK
 DO
 	LOOP {
 		iam (EEG);
-		autoCrossCorrelationTables thee = EEG_to_CrossCorrelationTables (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"Lag step"), GET_INTEGER (L"Number of cross-correlations"), GET_STRING (L"Channel ranges"));
+		autoCrossCorrelationTables thee = EEG_to_CrossCorrelationTables (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"Lag step"), GET_INTEGER (U"Number of cross-correlations"), GET_STRING (U"Channel ranges"));
 		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (EEG_to_EEG_bss, L"EEG: To EEG (bss)", L"EEG: To EEG (bss)...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
-	NATURAL (L"Number of cross-correlations", L"40")
-	POSITIVE (L"Lag step (s)", L"0.002")
-	LABEL (L"", L"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
-	TEXTFIELD (L"Channel ranges", L"1:64")
-	LABEL (L"", L"Pre-whitening parameters")
-	OPTIONMENU (L"Whitening method", 1)
-		OPTION (L"No whitening")
-		OPTION (L"Covariance")
-		OPTION (L"Correlation")
-	LABEL (L"", L"Iteration parameters")
-	NATURAL (L"Maximum number of iterations", L"100")
-	POSITIVE (L"Tolerance", L"0.001")
-	OPTIONMENU (L"Diagonalization method", 2)
-	OPTION (L"qdiag")
-	OPTION (L"ffdiag")
+FORM (EEG_to_EEG_bss, U"EEG: To EEG (bss)", U"EEG: To EEG (bss)...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
+	NATURAL (U"Number of cross-correlations", U"40")
+	POSITIVE (U"Lag step (s)", U"0.002")
+	LABEL (U"", U"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
+	TEXTFIELD (U"Channel ranges", U"1:64")
+	LABEL (U"", U"Pre-whitening parameters")
+	OPTIONMENU (U"Whitening method", 1)
+		OPTION (U"No whitening")
+		OPTION (U"Covariance")
+		OPTION (U"Correlation")
+	LABEL (U"", U"Iteration parameters")
+	NATURAL (U"Maximum number of iterations", U"100")
+	POSITIVE (U"Tolerance", U"0.001")
+	OPTIONMENU (U"Diagonalization method", 2)
+	OPTION (U"qdiag")
+	OPTION (U"ffdiag")
 	OK
 DO
-	int whiteningMethod = GET_INTEGER (L"Whitening method") - 1;
+	int whiteningMethod = GET_INTEGER (U"Whitening method") - 1;
 	LOOP {
 		iam (EEG);
-		autoEEG thee = EEG_to_EEG_bss (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_INTEGER (L"Number of cross-correlations"), GET_REAL (L"Lag step"), GET_STRING (L"Channel ranges"),
-			whiteningMethod, GET_INTEGER (L"Diagonalization method"),
-			GET_INTEGER (L"Maximum number of iterations"), GET_REAL (L"Tolerance"));
-		praat_new (thee.transfer(), my name, L"_bss");
+		autoEEG thee = EEG_to_EEG_bss (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_INTEGER (U"Number of cross-correlations"), GET_REAL (U"Lag step"), GET_STRING (U"Channel ranges"),
+			whiteningMethod, GET_INTEGER (U"Diagonalization method"),
+			GET_INTEGER (U"Maximum number of iterations"), GET_REAL (U"Tolerance"));
+		praat_new (thee.transfer(), my name, U"_bss");
 	}
 END
 
-FORM (EEG_to_PCA, L"EEG: To PCA", L"EEG: To PCA...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
-	TEXTFIELD (L"Channel ranges", L"1:64")
-	LABEL (L"", L"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
-	OPTIONMENU (L"Use", 1)
-		OPTION (L"Covariance")
-		OPTION (L"Correlation")
+FORM (EEG_to_PCA, U"EEG: To PCA", U"EEG: To PCA...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
+	TEXTFIELD (U"Channel ranges", U"1:64")
+	LABEL (U"", U"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
+	OPTIONMENU (U"Use", 1)
+		OPTION (U"Covariance")
+		OPTION (U"Correlation")
 	OK
 DO
-	double startTime = GET_REAL (L"left Time range"), endTime = GET_REAL (L"right Time range");
-	const wchar_t *channelRanges = GET_STRING (L"Channel ranges");
-	bool useCorrelation = GET_INTEGER (L"Use") == 2;
+	double startTime = GET_REAL (U"left Time range"), endTime = GET_REAL (U"right Time range");
+	const char32 *channelRanges = GET_STRING (U"Channel ranges");
+	bool useCorrelation = GET_INTEGER (U"Use") == 2;
 	LOOP {
 		iam (EEG);
 		autoPCA pca = EEG_to_PCA (me, startTime, endTime, channelRanges, useCorrelation);
@@ -140,113 +140,113 @@ DO
 	}
 END
 
-FORM (EEG_and_PCA_to_EEG_principalComponents, L"EEG & PCA: To EEG (principal components)", L"EEG & PCA: To EEG (principal components)...")
-	INTEGER (L"Number of components", L"0 (=all)")
+FORM (EEG_and_PCA_to_EEG_principalComponents, U"EEG & PCA: To EEG (principal components)", U"EEG & PCA: To EEG (principal components)...")
+	INTEGER (U"Number of components", U"0 (=all)")
 	OK
 DO
 	EEG me = FIRST (EEG);
 	PCA thee = FIRST (PCA);
-	autoEEG him = EEG_and_PCA_to_EEG_principalComponents (me, thee, GET_INTEGER (L"Number of components"));
-	praat_new (him.transfer(), my name, L"_pc");
+	autoEEG him = EEG_and_PCA_to_EEG_principalComponents (me, thee, GET_INTEGER (U"Number of components"));
+	praat_new (him.transfer(), my name, U"_pc");
 END
 
-FORM (EEG_and_PCA_to_EEG_whiten, L"EEG & PCA: To EEG (whiten)", L"EEG & PCA: To EEG (whiten)...")
-	INTEGER (L"Number of components", L"0 (=all)")
+FORM (EEG_and_PCA_to_EEG_whiten, U"EEG & PCA: To EEG (whiten)", U"EEG & PCA: To EEG (whiten)...")
+	INTEGER (U"Number of components", U"0 (=all)")
 	OK
 DO
 	EEG me = FIRST (EEG);
 	PCA thee = FIRST (PCA);
-	autoEEG him = EEG_and_PCA_to_EEG_whiten (me, thee, GET_INTEGER (L"Number of components"));
-	praat_new (him.transfer(), my name, L"_white");
+	autoEEG him = EEG_and_PCA_to_EEG_whiten (me, thee, GET_INTEGER (U"Number of components"));
+	praat_new (him.transfer(), my name, U"_white");
 END
 
-FORM (EEG_to_Sound_modulated, L"EEG: To Sound (modulated)", 0)
-	POSITIVE (L"Start frequency (Hz)", L"100.0")
-	POSITIVE (L"Channel bandwidth (Hz)", L"100.0")
-	TEXTFIELD (L"Channel ranges", L"1:64")
-	LABEL (L"", L"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
+FORM (EEG_to_Sound_modulated, U"EEG: To Sound (modulated)", 0)
+	POSITIVE (U"Start frequency (Hz)", U"100.0")
+	POSITIVE (U"Channel bandwidth (Hz)", U"100.0")
+	TEXTFIELD (U"Channel ranges", U"1:64")
+	LABEL (U"", U"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
 	OK
 DO
 	LOOP {
 		iam (EEG);
-		autoSound thee = EEG_to_Sound_modulated (me, GET_REAL (L"Start frequency"), GET_REAL (L"Channel bandwidth"),
-			GET_STRING (L"Channel ranges"));
+		autoSound thee = EEG_to_Sound_modulated (me, GET_REAL (U"Start frequency"), GET_REAL (U"Channel bandwidth"),
+			GET_STRING (U"Channel ranges"));
 		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (EEG_to_Sound_frequencyShifted, L"EEG: To Sound (frequency shifted)", 0)
-	NATURAL (L"Channel", L"1")
-	POSITIVE (L"Frequency shift (Hz)", L"100.0")
-	POSITIVE (L"Sampling frequecy (Hz)", L"11025.0")
-	REAL (L"Maximum amplitude", L"0.99")
+FORM (EEG_to_Sound_frequencyShifted, U"EEG: To Sound (frequency shifted)", 0)
+	NATURAL (U"Channel", U"1")
+	POSITIVE (U"Frequency shift (Hz)", U"100.0")
+	POSITIVE (U"Sampling frequecy (Hz)", U"11025.0")
+	REAL (U"Maximum amplitude", U"0.99")
 	OK
 DO
-	long channel = GET_INTEGER (L"Channel");
+	long channel = GET_INTEGER (U"Channel");
 	LOOP {
 		iam (EEG);
-		autoSound thee = EEG_to_Sound_frequencyShifted (me, channel, GET_REAL (L"Frequency shift"),
-			GET_REAL (L"Sampling frequecy"), GET_REAL (L"Maximum amplitude"));
-		praat_new (thee.transfer(), my name, L"_ch", Melder_integer (channel));
+		autoSound thee = EEG_to_Sound_frequencyShifted (me, channel, GET_REAL (U"Frequency shift"),
+			GET_REAL (U"Sampling frequecy"), GET_REAL (U"Maximum amplitude"));
+		praat_new (thee.transfer(), my name, U"_ch", channel);
 	}
 END
 
 /********************** CrossCorrelationTable(s) ******************/
 
-FORM (CrossCorrelationTables_createTestSet, L"CrossCorrelationTables: Create test set", L"CrossCorrelationTables: Create test set...")
-	WORD (L"Name", L"5x5")
-	NATURAL (L"Matrix dimension", L"5")
-	NATURAL (L"Number of matrices", L"20")
-	BOOLEAN (L"First is positive definite", 1)
-	REAL (L"Sigma", L"0.02")
+FORM (CrossCorrelationTables_createTestSet, U"CrossCorrelationTables: Create test set", U"CrossCorrelationTables: Create test set...")
+	WORD (U"Name", U"5x5")
+	NATURAL (U"Matrix dimension", U"5")
+	NATURAL (U"Number of matrices", U"20")
+	BOOLEAN (U"First is positive definite", 1)
+	REAL (U"Sigma", U"0.02")
 	OK
 DO
-	praat_new (CrossCorrelationTables_createTestSet (GET_INTEGER (L"Matrix dimension"),
-		GET_INTEGER (L"Number of matrices"), GET_INTEGER (L"First is positive definite"), GET_REAL (L"Sigma")), GET_STRING (L"Name"));
+	praat_new (CrossCorrelationTables_createTestSet (GET_INTEGER (U"Matrix dimension"),
+		GET_INTEGER (U"Number of matrices"), GET_INTEGER (U"First is positive definite"), GET_REAL (U"Sigma")), GET_STRING (U"Name"));
 END
 
-FORM (CrossCorrelationTable_createSimple, L"Create simple CrossCorrelationTable", 0)
-	WORD (L"Name", L"ct")
-	SENTENCE (L"Cross correlations", L"1.0 0.0 1.0")
-	SENTENCE (L"Centroid", L"0.0 0.0")
-	POSITIVE (L"Number of samples", L"100.0")
+FORM (CrossCorrelationTable_createSimple, U"Create simple CrossCorrelationTable", 0)
+	WORD (U"Name", U"ct")
+	SENTENCE (U"Cross correlations", U"1.0 0.0 1.0")
+	SENTENCE (U"Centroid", U"0.0 0.0")
+	NATURAL (U"Number of samples", U"100")
 	OK
 DO
-	praat_new (CrossCorrelationTable_createSimple (GET_STRING (L"Cross correlations"), GET_STRING (L"Centroid"),
-		GET_REAL (L"Number of samples")), GET_STRING (L"Name"));
+	praat_new (CrossCorrelationTable_createSimple (GET_STRING (U"Cross correlations"), GET_STRING (U"Centroid"),
+		GET_INTEGER (U"Number of samples")), GET_STRING (U"Name"));
 END
 
-FORM (MixingMatrix_createSimple, L"Create simple MixingMatrix", 0)
-	WORD (L"Name", L"mm")
-	NATURAL (L"Number of channels", L"2")
-	NATURAL (L"Number of components", L"2")
-	SENTENCE (L"Mixing coefficients", L"1.0 1.0 1.0 1.0")
+FORM (MixingMatrix_createSimple, U"Create simple MixingMatrix", 0)
+	WORD (U"Name", U"mm")
+	NATURAL (U"Number of channels", U"2")
+	NATURAL (U"Number of components", U"2")
+	SENTENCE (U"Mixing coefficients", U"1.0 1.0 1.0 1.0")
 	OK
 DO
-	praat_new (MixingMatrix_createSimple (GET_INTEGER (L"Number of channels"), GET_INTEGER (L"Number of components"),
-		GET_STRING (L"Mixing coefficients")), GET_STRING (L"Name"));
+	praat_new (MixingMatrix_createSimple (GET_INTEGER (U"Number of channels"), GET_INTEGER (U"Number of components"),
+		GET_STRING (U"Mixing coefficients")), GET_STRING (U"Name"));
 END
 
 DIRECT (CrossCorrelationTable_help)
-	Melder_help (L"CrossCorrelationTable");
+	Melder_help (U"CrossCorrelationTable");
 END
 
-FORM (Sound_and_PCA_principalComponents, L"Sound & PCA: To Sound (principal components)", 0)
-	NATURAL (L"Number of components", L"10")
+FORM (Sound_and_PCA_principalComponents, U"Sound & PCA: To Sound (principal components)", 0)
+	NATURAL (U"Number of components", U"10")
 	OK
 DO
 	Sound me = FIRST (Sound);
 	PCA thee = FIRST (PCA);
-	praat_new (Sound_and_PCA_principalComponents (me, thee, GET_INTEGER (L"Number of components")), Thing_getName (me), L"_pc");
+	praat_new (Sound_and_PCA_principalComponents (me, thee, GET_INTEGER (U"Number of components")), Thing_getName (me), U"_pc");
 END
 
-FORM (Sound_and_PCA_whitenChannels, L"Sound & PCA: To Sound (white channels)", 0)
-	NATURAL (L"Number of components", L"10")
+FORM (Sound_and_PCA_whitenChannels, U"Sound & PCA: To Sound (white channels)", 0)
+	NATURAL (U"Number of components", U"10")
 	OK
 DO
 	Sound me = FIRST (Sound);
 	PCA thee = FIRST (PCA);
-	praat_new (Sound_and_PCA_whitenChannels (me, thee, GET_INTEGER (L"Number of components")), Thing_getName (me), L"_white");
+	praat_new (Sound_and_PCA_whitenChannels (me, thee, GET_INTEGER (U"Number of components")), Thing_getName (me), U"_white");
 END
 
 DIRECT (CrossCorrelationTable_to_CrossCorrelationTables)
@@ -258,154 +258,155 @@ DIRECT (CrossCorrelationTable_to_CrossCorrelationTables)
 			nrows = my numberOfRows;
 			ncols = my numberOfColumns;
 		}
-		if (my numberOfRows != nrows || my numberOfColumns != ncols) Melder_throw ("Dimensions of table ",
-			IOBJECT, " differs from the rest.");
+		if (my numberOfRows != nrows || my numberOfColumns != ncols) {
+			Melder_throw (U"Dimensions of table ", IOBJECT, U" differs from the rest.");
+		}
 		autoCrossCorrelationTable myc = Data_copy (me);
 		Collection_addItem (thee.peek(), myc.transfer());
 	}
-	praat_new (thee.transfer(), L"ct_", Melder_integer (nselected));
+	praat_new (thee.transfer(), U"ct_", nselected);
 END
 
-FORM (Sound_to_Covariance_channels, L"Sound: To Covariance (channels)", L"Sound: To Covariance (channels)...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
+FORM (Sound_to_Covariance_channels, U"Sound: To Covariance (channels)", U"Sound: To Covariance (channels)...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_Covariance_channels (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range")), my name);
+		praat_new (Sound_to_Covariance_channels (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range")), my name);
 	}
 END
 
-FORM (Sound_to_CrossCorrelationTable, L"Sound: To CrossCorrelationTable", L"Sound: To CrossCorrelationTable...")
-    REAL (L"left Time range (s)", L"0.0")
-    REAL (L"right Time range (s)", L"10.0")
-    REAL (L"Lag step (s)", L"0.0")
+FORM (Sound_to_CrossCorrelationTable, U"Sound: To CrossCorrelationTable", U"Sound: To CrossCorrelationTable...")
+    REAL (U"left Time range (s)", U"0.0")
+    REAL (U"right Time range (s)", U"10.0")
+    REAL (U"Lag step (s)", U"0.0")
     OK
 DO
-	double lagTime = fabs (GET_REAL (L"Lag step"));
+	double lagTime = fabs (GET_REAL (U"Lag step"));
     LOOP {
         iam (Sound);
-        praat_new (Sound_to_CrossCorrelationTable (me, GET_REAL (L"left Time range"),
-        GET_REAL (L"right Time range"), lagTime), my name);
+        praat_new (Sound_to_CrossCorrelationTable (me, GET_REAL (U"left Time range"),
+        GET_REAL (U"right Time range"), lagTime), my name);
     }
 END
 
-FORM (Sounds_to_CrossCorrelationTable_combined, L"Sound: To CrossCorrelationTable (combined)", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
-	REAL (L"Lag step (s)", L"0.0")
+FORM (Sounds_to_CrossCorrelationTable_combined, U"Sound: To CrossCorrelationTable (combined)", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
+	REAL (U"Lag step (s)", U"0.0")
 	OK
 DO
-	Sound s1 = NULL, s2 = NULL;
+	Sound s1 = nullptr, s2 = nullptr;
 	LOOP {
 		iam (Sound);
 		(s1 ? s2 : s1) = me;
 	}
-	Melder_assert (s1 != NULL && s2 != NULL);
-	autoCrossCorrelationTable thee = Sounds_to_CrossCorrelationTable_combined (s1, s2, GET_REAL (L"left Time range"),
-		GET_REAL (L"right Time range"), GET_REAL (L"Lag step"));
-	praat_new (thee.transfer(), s1 -> name, L"_", s2 -> name, L"_cc");
+	Melder_assert (s1 && s2);
+	autoCrossCorrelationTable thee = Sounds_to_CrossCorrelationTable_combined (s1, s2, GET_REAL (U"left Time range"),
+		GET_REAL (U"right Time range"), GET_REAL (U"Lag step"));
+	praat_new (thee.transfer(), s1 -> name, U"_", s2 -> name, U"_cc");
 END
 
 DIRECT (CrossCorrelationTables_help)
-Melder_help (L"CrossCorrelationTables");
+Melder_help (U"CrossCorrelationTables");
 	END
 
-FORM (CrossCorrelationTables_getDiagonalityMeasure, L"CrossCorrelationTables: Get diagonality measure", L"CrossCorrelationTables: Get diagonality measure...")
-	NATURAL (L"First table", L"1")
-	NATURAL (L"Last table", L"100")
+FORM (CrossCorrelationTables_getDiagonalityMeasure, U"CrossCorrelationTables: Get diagonality measure", U"CrossCorrelationTables: Get diagonality measure...")
+	NATURAL (U"First table", U"1")
+	NATURAL (U"Last table", U"100")
 	OK
 DO
 	LOOP {
 		iam (CrossCorrelationTables);
-		double dm = CrossCorrelationTables_getDiagonalityMeasure (me, 0, GET_INTEGER (L"First table"),
-		GET_INTEGER (L"Last table"));
-		Melder_information (Melder_double (dm), L" (= average sum of squared off-diagonal elements)");
+		double dm = CrossCorrelationTables_getDiagonalityMeasure (me, 0, GET_INTEGER (U"First table"),
+		GET_INTEGER (U"Last table"));
+		Melder_information (dm, U" (= average sum of squared off-diagonal elements)");
 	}
 END
 
-FORM (CrossCorrelationTables_extractCrossCorrelationTable, L"CrossCorrelationTables: Extract one CrossCorrelationTable", 0)
-	NATURAL (L"Index", L"1")
+FORM (CrossCorrelationTables_extractCrossCorrelationTable, U"CrossCorrelationTables: Extract one CrossCorrelationTable", 0)
+	NATURAL (U"Index", U"1")
 	OK
 DO
-	long index = GET_INTEGER (L"Index");
+	long index = GET_INTEGER (U"Index");
 	LOOP {
 		iam (CrossCorrelationTables);
 		if (index > my size) {
-			Melder_throw (L"Index too large.");
+			Melder_throw (U"Index too large.");
 		}
 		autoCrossCorrelationTable thee = Data_copy ( (CrossCorrelationTable) my item[index]);
-		praat_new (thee.transfer(), Thing_getName (me), L"_", Melder_integer (index));
+		praat_new (thee.transfer(), Thing_getName (me), U"_", index);
 	}
 END
 
-FORM (CrossCorrelationTables_to_Diagonalizer, L"CrossCorrelationTables: To Diagonalizer", 0)
-	NATURAL (L"Maximum number of iterations", L"100")
-	POSITIVE (L"Tolerance", L"0.001")
-	OPTIONMENU (L"Diagonalization method", 2)
-	OPTION (L"qdiag")
-	OPTION (L"ffdiag")
+FORM (CrossCorrelationTables_to_Diagonalizer, U"CrossCorrelationTables: To Diagonalizer", 0)
+	NATURAL (U"Maximum number of iterations", U"100")
+	POSITIVE (U"Tolerance", U"0.001")
+	OPTIONMENU (U"Diagonalization method", 2)
+	OPTION (U"qdiag")
+	OPTION (U"ffdiag")
 	OK
 DO
 	LOOP {
 		iam (CrossCorrelationTables);
-		praat_new (CrossCorrelationTables_to_Diagonalizer (me, GET_INTEGER (L"Maximum number of iterations"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Diagonalization method")), my name);
+		praat_new (CrossCorrelationTables_to_Diagonalizer (me, GET_INTEGER (U"Maximum number of iterations"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Diagonalization method")), my name);
 	}
 END
 
-FORM (Diagonalizer_and_CrossCorrelationTables_improveDiagonality, L"Diagonalizer & CrossCorrelationTables: Improve diagonality", 0)
-	NATURAL (L"Maximum number of iterations", L"100")
-	POSITIVE (L"Tolerance", L"0.001")
-	OPTIONMENU (L"Diagonalization method", 2)
-	OPTION (L"qdiag")
-	OPTION (L"ffdiag")
+FORM (Diagonalizer_and_CrossCorrelationTables_improveDiagonality, U"Diagonalizer & CrossCorrelationTables: Improve diagonality", 0)
+	NATURAL (U"Maximum number of iterations", U"100")
+	POSITIVE (U"Tolerance", U"0.001")
+	OPTIONMENU (U"Diagonalization method", 2)
+	OPTION (U"qdiag")
+	OPTION (U"ffdiag")
 	OK
 DO
 	Diagonalizer d = FIRST (Diagonalizer);
 	CrossCorrelationTables ccts = FIRST (CrossCorrelationTables);
-	Diagonalizer_and_CrossCorrelationTables_improveDiagonality (d, ccts, GET_INTEGER (L"Maximum number of iterations"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Diagonalization method"));
+	Diagonalizer_and_CrossCorrelationTables_improveDiagonality (d, ccts, GET_INTEGER (U"Maximum number of iterations"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Diagonalization method"));
 END
 
-FORM (CrossCorrelationTables_and_Diagonalizer_getDiagonalityMeasure, L"CrossCorrelationTables & Diagonalizer: Get diagonality measure", 0)
-	NATURAL (L"First table", L"1")
-	NATURAL (L"Last table", L"100")
+FORM (CrossCorrelationTables_and_Diagonalizer_getDiagonalityMeasure, U"CrossCorrelationTables & Diagonalizer: Get diagonality measure", 0)
+	NATURAL (U"First table", U"1")
+	NATURAL (U"Last table", U"100")
 	OK
 DO
 	CrossCorrelationTables ccts = FIRST (CrossCorrelationTables);
 	Diagonalizer d = FIRST (Diagonalizer);
-	double dm = CrossCorrelationTables_and_Diagonalizer_getDiagonalityMeasure (ccts, d, 0, GET_INTEGER (L"First table"),
-		GET_INTEGER (L"Last table"));
-	Melder_information (Melder_double (dm), L" (= average sum of squared off-diagonal elements)");
+	double dm = CrossCorrelationTables_and_Diagonalizer_getDiagonalityMeasure (ccts, d, 0, GET_INTEGER (U"First table"),
+		GET_INTEGER (U"Last table"));
+	Melder_information (dm, U" (= average sum of squared off-diagonal elements)");
 END
 
 DIRECT (CrossCorrelationTable_and_Diagonalizer_diagonalize)
 	CrossCorrelationTable cct = FIRST (CrossCorrelationTable);
 	Diagonalizer d = FIRST (Diagonalizer);
-	praat_new (CrossCorrelationTable_and_Diagonalizer_diagonalize (cct, d), cct->name, L"_", d->name);
+	praat_new (CrossCorrelationTable_and_Diagonalizer_diagonalize (cct, d), cct->name, U"_", d->name);
 END
 
 DIRECT (CrossCorrelationTables_and_Diagonalizer_diagonalize)
 	CrossCorrelationTables ccts = FIRST (CrossCorrelationTables);
 	Diagonalizer d = FIRST (Diagonalizer);
-	praat_new (CrossCorrelationTables_and_Diagonalizer_diagonalize (ccts, d), ccts->name, L"_", d->name);
+	praat_new (CrossCorrelationTables_and_Diagonalizer_diagonalize (ccts, d), ccts->name, U"_", d->name);
 END
 
-FORM (CrossCorrelationTables_and_MixingMatrix_improveUnmixing, L"", 0)
-	LABEL (L"", L"Iteration parameters")
-	NATURAL (L"Maximum number of iterations", L"100")
-	POSITIVE (L"Tolerance", L"0.001")
-	OPTIONMENU (L"Diagonalization method", 2)
-	OPTION (L"qdiag")
-	OPTION (L"ffdiag")
+FORM (CrossCorrelationTables_and_MixingMatrix_improveUnmixing, U"", 0)
+	LABEL (U"", U"Iteration parameters")
+	NATURAL (U"Maximum number of iterations", U"100")
+	POSITIVE (U"Tolerance", U"0.001")
+	OPTIONMENU (U"Diagonalization method", 2)
+	OPTION (U"qdiag")
+	OPTION (U"ffdiag")
 	OK
 DO
 	MixingMatrix mm = FIRST (MixingMatrix);
 	CrossCorrelationTables ccts = FIRST (CrossCorrelationTables);
 	MixingMatrix_and_CrossCorrelationTables_improveUnmixing (mm, ccts,
-		GET_INTEGER (L"Maximum number of iterations"), GET_REAL (L"Tolerance"), GET_INTEGER (L"Diagonalization method"));
+		GET_INTEGER (U"Maximum number of iterations"), GET_REAL (U"Tolerance"), GET_INTEGER (U"Diagonalization method"));
 END
 
 DIRECT (Diagonalizer_to_MixingMatrix)
@@ -415,86 +416,86 @@ DIRECT (Diagonalizer_to_MixingMatrix)
 	}
 END
 
-FORM (Sound_to_MixingMatrix, L"Sound: To MixingMatrix", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
-	NATURAL (L"Number of cross-correlations", L"40")
-	POSITIVE (L"Lag step (s)", L"0.002")
-	LABEL (L"", L"Iteration parameters")
-	NATURAL (L"Maximum number of iterations", L"100")
-	POSITIVE (L"Tolerance", L"0.001")
-	OPTIONMENU (L"Diagonalization method", 2)
-	OPTION (L"qdiag")
-	OPTION (L"ffdiag")
+FORM (Sound_to_MixingMatrix, U"Sound: To MixingMatrix", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
+	NATURAL (U"Number of cross-correlations", U"40")
+	POSITIVE (U"Lag step (s)", U"0.002")
+	LABEL (U"", U"Iteration parameters")
+	NATURAL (U"Maximum number of iterations", U"100")
+	POSITIVE (U"Tolerance", U"0.001")
+	OPTIONMENU (U"Diagonalization method", 2)
+	OPTION (U"qdiag")
+	OPTION (U"ffdiag")
 	OK
 DO
 	LOOP {
 		iam (Sound);
 		praat_new (Sound_to_MixingMatrix (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Number of cross-correlations"),
-			GET_REAL (L"Lag step"), GET_INTEGER (L"Maximum number of iterations"), GET_REAL (L"Tolerance"),
-			GET_INTEGER (L"Diagonalization method")), my name);
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Number of cross-correlations"),
+			GET_REAL (U"Lag step"), GET_INTEGER (U"Maximum number of iterations"), GET_REAL (U"Tolerance"),
+			GET_INTEGER (U"Diagonalization method")), my name);
 	}
 END
 
-FORM (Sound_to_CrossCorrelationTables, L"Sound: To CrossCorrelationTables", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
-	NATURAL (L"Number of cross-correlations", L"40")
-	POSITIVE (L"Lag step (s)", L"0.002")
+FORM (Sound_to_CrossCorrelationTables, U"Sound: To CrossCorrelationTables", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
+	NATURAL (U"Number of cross-correlations", U"40")
+	POSITIVE (U"Lag step (s)", U"0.002")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_CrossCorrelationTables (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_REAL (L"Lag step"), GET_INTEGER (L"Number of cross-correlations")), my name);
+		praat_new (Sound_to_CrossCorrelationTables (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_REAL (U"Lag step"), GET_INTEGER (U"Number of cross-correlations")), my name);
 	}
 END
 
-FORM (Sound_to_Sound_bss, L"Sound: To Sound (blind source separation)", L"Sound: To Sound (blind source separation)...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
-	NATURAL (L"Number of cross-correlations", L"40")
-	POSITIVE (L"Lag step (s)", L"0.002")
-	LABEL (L"", L"Iteration parameters")
-	NATURAL (L"Maximum number of iterations", L"100")
-	POSITIVE (L"Tolerance", L"0.001")
-	OPTIONMENU (L"Diagonalization method", 2)
-	OPTION (L"qdiag")
-	OPTION (L"ffdiag")
+FORM (Sound_to_Sound_bss, U"Sound: To Sound (blind source separation)", U"Sound: To Sound (blind source separation)...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
+	NATURAL (U"Number of cross-correlations", U"40")
+	POSITIVE (U"Lag step (s)", U"0.002")
+	LABEL (U"", U"Iteration parameters")
+	NATURAL (U"Maximum number of iterations", U"100")
+	POSITIVE (U"Tolerance", U"0.001")
+	OPTIONMENU (U"Diagonalization method", 2)
+	OPTION (U"qdiag")
+	OPTION (U"ffdiag")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_Sound_BSS (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_INTEGER (L"Number of cross-correlations"), GET_REAL (L"Lag step"),
-			GET_INTEGER (L"Maximum number of iterations"), GET_REAL (L"Tolerance"),
-			GET_INTEGER (L"Diagonalization method")), my name, L"_bss");
+		praat_new (Sound_to_Sound_BSS (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_INTEGER (U"Number of cross-correlations"), GET_REAL (U"Lag step"),
+			GET_INTEGER (U"Maximum number of iterations"), GET_REAL (U"Tolerance"),
+			GET_INTEGER (U"Diagonalization method")), my name, U"_bss");
 	}
 END
 
-FORM (Sound_to_Sound_whiteChannels, L"Sound: To Sound (white channels)", L"Sound: To Sound (white channels)...")
-    POSITIVE (L"Variance fraction to keep", L"0.99")
+FORM (Sound_to_Sound_whiteChannels, U"Sound: To Sound (white channels)", U"Sound: To Sound (white channels)...")
+    POSITIVE (U"Variance fraction to keep", U"0.99")
     OK
 DO
-    double varianceFraction = GET_REAL (L"Variance fraction to keep");
+    double varianceFraction = GET_REAL (U"Variance fraction to keep");
     if (varianceFraction > 1) varianceFraction = 1;
-    long permille = varianceFraction * 1000.0;
+    long permille = (long) floor (varianceFraction * 1000.0);
     LOOP {
         iam (Sound);
-        praat_new (Sound_whitenChannels (me, varianceFraction), my name, L"_", Melder_integer (permille));
+        praat_new (Sound_whitenChannels (me, varianceFraction), my name, U"_", permille);
     }
 END
 
 DIRECT (Sound_and_MixingMatrix_mix)
 	Sound s = FIRST (Sound);
 	MixingMatrix mm = FIRST (MixingMatrix);
-	praat_new (Sound_and_MixingMatrix_mix (s, mm), Thing_getName (s), L"_mixed");
+	praat_new (Sound_and_MixingMatrix_mix (s, mm), Thing_getName (s), U"_mixed");
 END
 
 DIRECT (Sound_and_MixingMatrix_unmix)
 	Sound s = FIRST (Sound);
 	MixingMatrix mm = FIRST (MixingMatrix);
-	praat_new (Sound_and_MixingMatrix_unmix (s, mm), Thing_getName (s), L"_unmixed");
+	praat_new (Sound_and_MixingMatrix_unmix (s, mm), Thing_getName (s), U"_unmixed");
 END
 
 DIRECT (TableOfReal_to_MixingMatrix)
@@ -504,91 +505,91 @@ DIRECT (TableOfReal_to_MixingMatrix)
 	}
 END
 
-FORM (TableOfReal_and_TableOfReal_crossCorrelations, L"TableOfReal & TableOfReal: Cross-correlations", 0)
-	OPTIONMENU (L"Correlations between", 1)
-	OPTION (L"Rows")
-	OPTION (L"Columns")
-	BOOLEAN (L"Center", 0)
-	BOOLEAN (L"Normalize", 0)
+FORM (TableOfReal_and_TableOfReal_crossCorrelations, U"TableOfReal & TableOfReal: Cross-correlations", 0)
+	OPTIONMENU (U"Correlations between", 1)
+	OPTION (U"Rows")
+	OPTION (U"Columns")
+	BOOLEAN (U"Center", 0)
+	BOOLEAN (U"Normalize", 0)
 	OK
 DO
-	TableOfReal t1 = 0, t2 = 0;
+	TableOfReal t1 = nullptr, t2 = nullptr;
 	LOOP {
 		iam (TableOfReal);
 		(t1 ? t2 : t1) = me;
 	}
-	Melder_assert (t1 != NULL && t2 != NULL);
-	int by_columns = GET_INTEGER (L"Correlations between") - 1;
+	Melder_assert (t1 && t2);
+	int by_columns = GET_INTEGER (U"Correlations between") - 1;
 	praat_new (TableOfReal_and_TableOfReal_crossCorrelations (t1, t2, by_columns,
-		GET_INTEGER (L"Center"), GET_INTEGER (L"Normalize")),
-		(by_columns ? L"by_columns" : L"by_rows"));
+		GET_INTEGER (U"Center"), GET_INTEGER (U"Normalize")),
+		(by_columns ? U"by_columns" : U"by_rows"));
 END
 
 void praat_TableOfReal_init3 (ClassInfo klas) {
 	praat_TableOfReal_init (klas);
-	praat_addAction1 (klas, 2, L"To TableOfReal (cross-correlations)...", 0, 0, DO_TableOfReal_and_TableOfReal_crossCorrelations);
+	praat_addAction1 (klas, 2, U"To TableOfReal (cross-correlations)...", 0, 0, DO_TableOfReal_and_TableOfReal_crossCorrelations);
 }
 
-void praat_BSS_init (void);
-void praat_BSS_init (void) {
-	Thing_recognizeClassesByName (classDiagonalizer, classMixingMatrix, classCrossCorrelationTable, classCrossCorrelationTables, NULL);
+void praat_BSS_init ();
+void praat_BSS_init () {
+	Thing_recognizeClassesByName (classDiagonalizer, classMixingMatrix, classCrossCorrelationTable, classCrossCorrelationTables, nullptr);
 
-	praat_addMenuCommand (L"Objects", L"New", L"Create simple CrossCorrelationTable...", L"Create simple Covariance...", praat_HIDDEN + praat_DEPTH_1, DO_CrossCorrelationTable_createSimple);
-	praat_addMenuCommand (L"Objects", L"New", L"Create test CrossCorrelationTables...", L"Create simple CrossCorrelationTable...", praat_HIDDEN + praat_DEPTH_1, DO_CrossCorrelationTables_createTestSet);
-	praat_addMenuCommand (L"Objects", L"New", L"Create simple MixingMatrix...", L"Create test CrossCorrelationTables...", praat_HIDDEN + praat_DEPTH_1, DO_MixingMatrix_createSimple);
+	praat_addMenuCommand (U"Objects", U"New", U"Create simple CrossCorrelationTable...", U"Create simple Covariance...", praat_HIDDEN + praat_DEPTH_1, DO_CrossCorrelationTable_createSimple);
+	praat_addMenuCommand (U"Objects", U"New", U"Create test CrossCorrelationTables...", U"Create simple CrossCorrelationTable...", praat_HIDDEN + praat_DEPTH_1, DO_CrossCorrelationTables_createTestSet);
+	praat_addMenuCommand (U"Objects", U"New", U"Create simple MixingMatrix...", U"Create test CrossCorrelationTables...", praat_HIDDEN + praat_DEPTH_1, DO_MixingMatrix_createSimple);
 
-	praat_addAction1 (classCrossCorrelationTable, 0, L"CrossCorrelationTable help", 0, 0, DO_CrossCorrelationTable_help);
+	praat_addAction1 (classCrossCorrelationTable, 0, U"CrossCorrelationTable help", 0, 0, DO_CrossCorrelationTable_help);
 	praat_SSCP_as_TableOfReal_init (classCrossCorrelationTable);
 
-	praat_addAction1 (classCrossCorrelationTable, 0, L"To CrossCorrelationTables", 0, 0, DO_CrossCorrelationTable_to_CrossCorrelationTables);
+	praat_addAction1 (classCrossCorrelationTable, 0, U"To CrossCorrelationTables", 0, 0, DO_CrossCorrelationTable_to_CrossCorrelationTables);
 
-	praat_addAction1 (classCrossCorrelationTables, 0, L"CrossCorrelationTables help", 0, 0, DO_CrossCorrelationTables_help);
-	praat_addAction1 (classCrossCorrelationTables, 1, L"Extract CrossCorrelationTable...", 0, 0, DO_CrossCorrelationTables_extractCrossCorrelationTable);
-	praat_addAction1 (classCrossCorrelationTables, 1, L"Get diagonality measure...", 0, 0, DO_CrossCorrelationTables_getDiagonalityMeasure);
-	praat_addAction1 (classCrossCorrelationTables, 0, L"To Diagonalizer...", 0, 0, DO_CrossCorrelationTables_to_Diagonalizer);
+	praat_addAction1 (classCrossCorrelationTables, 0, U"CrossCorrelationTables help", 0, 0, DO_CrossCorrelationTables_help);
+	praat_addAction1 (classCrossCorrelationTables, 1, U"Extract CrossCorrelationTable...", 0, 0, DO_CrossCorrelationTables_extractCrossCorrelationTable);
+	praat_addAction1 (classCrossCorrelationTables, 1, U"Get diagonality measure...", 0, 0, DO_CrossCorrelationTables_getDiagonalityMeasure);
+	praat_addAction1 (classCrossCorrelationTables, 0, U"To Diagonalizer...", 0, 0, DO_CrossCorrelationTables_to_Diagonalizer);
 
 	praat_TableOfReal_init3 (classDiagonalizer);
-	praat_addAction1 (classDiagonalizer, 0, L"To MixingMatrix", 0, 0, DO_Diagonalizer_to_MixingMatrix);
+	praat_addAction1 (classDiagonalizer, 0, U"To MixingMatrix", 0, 0, DO_Diagonalizer_to_MixingMatrix);
 
-	praat_addAction1 (classEEG, 0, L"To Sound (mc modulated)...", L"To ERPTier...", praat_HIDDEN, DO_EEG_to_Sound_modulated);
-	praat_addAction1 (classEEG, 0, L"To Sound (frequency shifted)...", L"To ERPTier...", 0, DO_EEG_to_Sound_frequencyShifted);
-	praat_addAction1 (classEEG, 0, L"To PCA...", L"To ERPTier...", 0, DO_EEG_to_PCA);
-	praat_addAction1 (classEEG, 0, L"To CrossCorrelationTable...", L"To PCA...", praat_HIDDEN, DO_EEG_to_CrossCorrelationTable);
-	praat_addAction1 (classEEG, 0, L"To CrossCorrelationTables...", L"To PCA...", praat_HIDDEN, DO_EEG_to_CrossCorrelationTables);
+	praat_addAction1 (classEEG, 0, U"To Sound (mc modulated)...", U"To ERPTier...", praat_HIDDEN, DO_EEG_to_Sound_modulated);
+	praat_addAction1 (classEEG, 0, U"To Sound (frequency shifted)...", U"To ERPTier...", 0, DO_EEG_to_Sound_frequencyShifted);
+	praat_addAction1 (classEEG, 0, U"To PCA...", U"To ERPTier...", 0, DO_EEG_to_PCA);
+	praat_addAction1 (classEEG, 0, U"To CrossCorrelationTable...", U"To PCA...", praat_HIDDEN, DO_EEG_to_CrossCorrelationTable);
+	praat_addAction1 (classEEG, 0, U"To CrossCorrelationTables...", U"To PCA...", praat_HIDDEN, DO_EEG_to_CrossCorrelationTables);
 
-	praat_addAction1 (classEEG, 0, L"To Covariance...", L"To CrossCorrelationTable...", praat_HIDDEN, DO_EEG_to_Covariance);
-	praat_addAction1 (classEEG, 0, L"To EEG (bss)...", L"To CrossCorrelationTable...", praat_HIDDEN, DO_EEG_to_EEG_bss);
+	praat_addAction1 (classEEG, 0, U"To Covariance...", U"To CrossCorrelationTable...", praat_HIDDEN, DO_EEG_to_Covariance);
+	praat_addAction1 (classEEG, 0, U"To EEG (bss)...", U"To CrossCorrelationTable...", praat_HIDDEN, DO_EEG_to_EEG_bss);
 
-	praat_addAction2 (classEEG, 1, classPCA, 1, L"To EEG (principal components)...", 0, 0, DO_EEG_and_PCA_to_EEG_principalComponents);
-	praat_addAction2 (classEEG, 1, classPCA, 1, L"To EEG (whiten)...", 0, 0, DO_EEG_and_PCA_to_EEG_whiten);
+	praat_addAction2 (classEEG, 1, classPCA, 1, U"To EEG (principal components)...", 0, 0, DO_EEG_and_PCA_to_EEG_principalComponents);
+	praat_addAction2 (classEEG, 1, classPCA, 1, U"To EEG (whiten)...", 0, 0, DO_EEG_and_PCA_to_EEG_whiten);
 
 
 	praat_TableOfReal_init3 (classMixingMatrix);
 
-	praat_addAction1 (classSound, 0, L"To MixingMatrix...",  L"Resample...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_MixingMatrix);
-    praat_addAction1 (classSound, 0, L"To CrossCorrelationTable...",  L"Resample...", 1, DO_Sound_to_CrossCorrelationTable);
-    praat_addAction1 (classSound, 0, L"To Covariance (channels)...",  L"Resample...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_Covariance_channels);
-	praat_addAction1 (classSound, 0, L"To CrossCorrelationTables...",  L"Resample...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_CrossCorrelationTables);
+	praat_addAction1 (classSound, 0, U"To MixingMatrix...",  U"Resample...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_MixingMatrix);
+    praat_addAction1 (classSound, 0, U"To CrossCorrelationTable...",  U"Resample...", 1, DO_Sound_to_CrossCorrelationTable);
+    praat_addAction1 (classSound, 0, U"To Covariance (channels)...",  U"Resample...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_Covariance_channels);
+	praat_addAction1 (classSound, 0, U"To CrossCorrelationTables...",  U"Resample...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_CrossCorrelationTables);
 
-	praat_addAction1 (classSound, 0, L"To Sound (bss)...", L"Resample...", 1, DO_Sound_to_Sound_bss);
-    praat_addAction1 (classSound, 0, L"To Sound (white channels)...", L"Resample...", 1, DO_Sound_to_Sound_whiteChannels);
-    praat_addAction1 (classSound, 2, L"To CrossCorrelationTable (combined)...",  L"Cross-correlate...", 1, DO_Sounds_to_CrossCorrelationTable_combined);
+	praat_addAction1 (classSound, 0, U"To Sound (bss)...", U"Resample...", 1, DO_Sound_to_Sound_bss);
+    praat_addAction1 (classSound, 0, U"To Sound (white channels)...", U"Resample...", 1, DO_Sound_to_Sound_whiteChannels);
+    praat_addAction1 (classSound, 2, U"To CrossCorrelationTable (combined)...",  U"Cross-correlate...", 1, DO_Sounds_to_CrossCorrelationTable_combined);
 
-	praat_addAction1 (classTableOfReal, 0, L"To MixingMatrix", L"To Configuration", praat_HIDDEN, DO_TableOfReal_to_MixingMatrix);
+	praat_addAction1 (classTableOfReal, 0, U"To MixingMatrix", U"To Configuration", praat_HIDDEN, DO_TableOfReal_to_MixingMatrix);
 
-	praat_addAction2 (classSound, 1, classMixingMatrix, 1, L"Mix", 0, 0, DO_Sound_and_MixingMatrix_mix);
-	praat_addAction2 (classSound, 1, classMixingMatrix, 1, L"Unmix", 0, 0, DO_Sound_and_MixingMatrix_unmix);
+	praat_addAction2 (classSound, 1, classMixingMatrix, 1, U"Mix", 0, 0, DO_Sound_and_MixingMatrix_mix);
+	praat_addAction2 (classSound, 1, classMixingMatrix, 1, U"Unmix", 0, 0, DO_Sound_and_MixingMatrix_unmix);
 
-	praat_addAction2 (classSound, 1, classPCA, 1, L"To Sound (white channels)...", 0 , 0, DO_Sound_and_PCA_whitenChannels);
-	praat_addAction2 (classSound, 1, classPCA, 1, L"To Sound (principal components)...", 0 , 0, DO_Sound_and_PCA_principalComponents);
+	praat_addAction2 (classSound, 1, classPCA, 1, U"To Sound (white channels)...", 0 , 0, DO_Sound_and_PCA_whitenChannels);
+	praat_addAction2 (classSound, 1, classPCA, 1, U"To Sound (principal components)...", 0 , 0, DO_Sound_and_PCA_principalComponents);
 
-	praat_addAction2 (classCrossCorrelationTable, 1, classDiagonalizer, 1, L"Diagonalize", 0 , 0, DO_CrossCorrelationTable_and_Diagonalizer_diagonalize);
+	praat_addAction2 (classCrossCorrelationTable, 1, classDiagonalizer, 1, U"Diagonalize", 0 , 0, DO_CrossCorrelationTable_and_Diagonalizer_diagonalize);
 
-	praat_addAction2 (classCrossCorrelationTables, 1, classDiagonalizer, 1, L"Get diagonality measure...", 0 , 0, DO_CrossCorrelationTables_and_Diagonalizer_getDiagonalityMeasure);
-	praat_addAction2 (classCrossCorrelationTables, 1, classDiagonalizer, 1, L"Diagonalize", 0 , 0, DO_CrossCorrelationTables_and_Diagonalizer_diagonalize);
-	praat_addAction2 (classCrossCorrelationTables, 1, classDiagonalizer, 1, L"Improve diagonality...", 0 , 0, DO_Diagonalizer_and_CrossCorrelationTables_improveDiagonality);
+	praat_addAction2 (classCrossCorrelationTables, 1, classDiagonalizer, 1, U"Get diagonality measure...", 0 , 0, DO_CrossCorrelationTables_and_Diagonalizer_getDiagonalityMeasure);
+	praat_addAction2 (classCrossCorrelationTables, 1, classDiagonalizer, 1, U"Diagonalize", 0 , 0, DO_CrossCorrelationTables_and_Diagonalizer_diagonalize);
+	praat_addAction2 (classCrossCorrelationTables, 1, classDiagonalizer, 1, U"Improve diagonality...", 0 , 0, DO_Diagonalizer_and_CrossCorrelationTables_improveDiagonality);
 
-	praat_addAction2 (classCrossCorrelationTables, 1, classMixingMatrix, 1, L"Improve unmixing...", 0 , 0, DO_CrossCorrelationTables_and_MixingMatrix_improveUnmixing);
+	praat_addAction2 (classCrossCorrelationTables, 1, classMixingMatrix, 1, U"Improve unmixing...", 0 , 0, DO_CrossCorrelationTables_and_MixingMatrix_improveUnmixing);
 
 	INCLUDE_MANPAGES (manual_BSS)
 }
diff --git a/dwtools/praat_DataModeler_init.cpp b/dwtools/praat_DataModeler_init.cpp
index 93c85db..997d51b 100644
--- a/dwtools/praat_DataModeler_init.cpp
+++ b/dwtools/praat_DataModeler_init.cpp
@@ -17,145 +17,167 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <math.h>
 #include "praatP.h"
 #include "DataModeler.h"
 #include "Formant_extensions.h"
+#include "OptimalCeilingTierEditor.h"
 #include "Pitch.h"
 #include "Table_extensions.h"
+#include <math.h>
 
 #undef iam
 #define iam iam_LOOP
 
-FORM (DataModeler_speckle, L"DataModeler: Speckle", 0)
-	REAL (L"left X range", L"0.0")
-	REAL (L"right X range", L"0.0")
-	REAL (L"left Y range", L"0.0")
-	REAL (L"right Y range", L"0.0")
-	BOOLEAN (L"Draw error bars", 1)
-	REAL (L"Bar width (mm)", L"1.0")
-	REAL (L"Horizontal offset (mm)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+/* DataModeler */
+
+FORM (DataModeler_createSimple, U"Create simple DataModeler", 0)
+	WORD (U"Name", U"dm")
+	REAL (U"left X range", U"0.0")
+	REAL (U"right X range", U"1.0")
+	NATURAL (U"Number of data points", U"20")
+	SENTENCE (U"Parameters", U"0.0 1.0 1.0")
+	POSITIVE (U"Gaussian noise stdev", U"0.2")
+	OPTIONMENU (U"Basis functions", 2)
+		OPTION (U"Polynomial")
+		OPTION (U"Legendre")
+		
+	OK
+DO
+	autoDataModeler thee = DataModeler_createSimple (GET_REAL (U"left X range"), GET_REAL (U"right X range"),
+		GET_INTEGER (U"Number of data points"), GET_STRING (U"Parameters"), GET_REAL (U"Gaussian noise stdev"),
+		GET_INTEGER (U"Basis functions") - 1);
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
+END
+
+FORM (DataModeler_speckle, U"DataModeler: Speckle", 0)
+	REAL (U"left X range", U"0.0")
+	REAL (U"right X range", U"0.0")
+	REAL (U"left Y range", U"0.0")
+	REAL (U"right Y range", U"0.0")
+	BOOLEAN (U"Draw error bars", 1)
+	REAL (U"Bar width (mm)", U"1.0")
+	REAL (U"Horizontal offset (mm)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	long order = 6;
 	LOOP {
 		iam (DataModeler);
-		DataModeler_speckle (me, GRAPHICS, GET_REAL (L"left X range"), GET_REAL (L"right X range"),
-			GET_REAL (L"left Y range"), GET_REAL (L"right Y range"),
-			0, order + 1, GET_INTEGER (L"Draw error bars"), GET_REAL (L"Bar width"), GET_REAL (L"Horizontal offset"),
-			GET_INTEGER (L"Garnish"));
+		DataModeler_speckle (me, GRAPHICS, GET_REAL (U"left X range"), GET_REAL (U"right X range"),
+			GET_REAL (U"left Y range"), GET_REAL (U"right Y range"),
+			0, order + 1, GET_INTEGER (U"Draw error bars"), GET_REAL (U"Bar width"), GET_REAL (U"Horizontal offset"),
+			GET_INTEGER (U"Garnish"));
 	}
 END
 
 
-FORM (DataModeler_drawEstimatedTrack, L"DataModeler: Draw estimated track", 0)
-	REAL (L"left X range", L"0.0")
-	REAL (L"right X range", L"0.0")
-	REAL (L"left Y range", L"0.0")
-	REAL (L"right Y range", L"0.0")
-	INTEGER (L"Order of polynomials for estimation", L"3")
-	REAL (L"Horizontal offset (mm)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (DataModeler_drawEstimatedTrack, U"DataModeler: Draw estimated track", 0)
+	REAL (U"left X range", U"0.0")
+	REAL (U"right X range", U"0.0")
+	REAL (U"left Y range", U"0.0")
+	REAL (U"right Y range", U"0.0")
+	INTEGER (U"Order of polynomials for estimation", U"3")
+	REAL (U"Horizontal offset (mm)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
-	long order = GET_INTEGER (L"Order of polynomials for estimation");
-	REQUIRE (order >= 0, L"The order must be greater than or equal to zero.")
+	long order = GET_INTEGER (U"Order of polynomials for estimation");
+	REQUIRE (order >= 0, U"The order must be greater than or equal to zero.")
 	LOOP {
 		iam (DataModeler);
-		DataModeler_drawTrack (me, GRAPHICS, GET_REAL (L"left X range"), GET_REAL (L"right X range"),
-			GET_REAL (L"left Y range"), GET_REAL (L"right Y range"), 1, order + 1, GET_REAL (L"Horizontal offset"), GET_INTEGER (L"Garnish"));
+		DataModeler_drawTrack (me, GRAPHICS, GET_REAL (U"left X range"), GET_REAL (U"right X range"),
+			GET_REAL (U"left Y range"), GET_REAL (U"right Y range"), 1, order + 1, GET_REAL (U"Horizontal offset"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (DataModeler_getNumberOfParameters)
 	LOOP {
 		iam (DataModeler);
-		Melder_information (Melder_integer (my numberOfParameters), L" (= number of parameters)");
+		Melder_information (my numberOfParameters, U" (= number of parameters)");
 	}
 END
 
 DIRECT (DataModeler_getNumberOfFixedParameters)
 	LOOP {
 		iam (DataModeler);
-		Melder_information (Melder_integer (DataModeler_getNumberOfFixedParameters (me)), L" (= number of parameters)");
+		Melder_information (DataModeler_getNumberOfFixedParameters (me), U" (= number of parameters)");
 	}
 END
 
-FORM (DataModeler_getParameterValue, L"DataModeler: Get parameter value", 0)
-	NATURAL (L"Parameter number", L"1")
+FORM (DataModeler_getParameterValue, U"DataModeler: Get parameter value", 0)
+	NATURAL (U"Parameter number", U"1")
 	OK
 DO
-	long iparameter = GET_INTEGER (L"Parameter number");
+	long iparameter = GET_INTEGER (U"Parameter number");
 	LOOP {
 		iam (DataModeler);
 		double parameter = DataModeler_getParameterValue (me, iparameter);
-		Melder_information (Melder_double (parameter), L" (= parameter[", Melder_integer (iparameter), L"])");
+		Melder_information (parameter, U" (= parameter[", iparameter, U"])");
 	}
 END
 
-FORM (DataModeler_getParameterStatus, L"DataModeler: Get parameter status", 0)
-	NATURAL (L"Parameter number", L"1")
+FORM (DataModeler_getParameterStatus, U"DataModeler: Get parameter status", 0)
+	NATURAL (U"Parameter number", U"1")
 	OK
 DO
-	long iparameter = GET_INTEGER (L"Parameter number");
+	long iparameter = GET_INTEGER (U"Parameter number");
 	LOOP {
 		iam (DataModeler);
 		int status = DataModeler_getParameterStatus (me, iparameter);
-		Melder_information (status == DataModeler_PARAMETER_FREE ? L"Free" : (status == DataModeler_PARAMETER_FIXED ? L"Fixed" :
-			L"Undefined"), L" (= parameter[", Melder_integer (iparameter), L"])");
+		Melder_information (status == DataModeler_PARAMETER_FREE ? U"Free" : (status == DataModeler_PARAMETER_FIXED ? U"Fixed" :
+			U"Undefined"), U" (= parameter[", iparameter, U"])");
 	}
 END
 
-FORM (DataModeler_getParameterStandardDeviation, L"DataModeler: Get parameter standard deviatio", 0)
-	NATURAL (L"Parameter number", L"1")
+FORM (DataModeler_getParameterStandardDeviation, U"DataModeler: Get parameter standard deviation", 0)
+	NATURAL (U"Parameter number", U"1")
 	OK
 DO
-	long iparameter = GET_INTEGER (L"Parameter number");
+	long iparameter = GET_INTEGER (U"Parameter number");
 	LOOP {
 		iam (DataModeler);
 		double sigma = DataModeler_getParameterStandardDeviation (me, iparameter);
-		Melder_information (Melder_double (sigma), L" (= parameter[", Melder_integer (iparameter), L"])");
+		Melder_information (sigma, U" (= parameter[", iparameter, U"])");
 	}
 END
 
-FORM (DataModeler_getVarianceOfParameters, L"DataModeler: Get variance of parameters", 0)
-	INTEGER (L"left Parameter range", L"0")
-	INTEGER (L"right Parameter range", L"0")
+FORM (DataModeler_getVarianceOfParameters, U"DataModeler: Get variance of parameters", 0)
+	INTEGER (U"left Parameter range", U"0")
+	INTEGER (U"right Parameter range", U"0")
 	OK
 DO
 	long nofp;
 	LOOP {
 		iam (DataModeler);
-		double var = DataModeler_getVarianceOfParameters (me, GET_INTEGER (L"left Parameter range"), GET_INTEGER (L"right Parameter range"), &nofp);
-		Melder_information (Melder_double (var), L" (for ", Melder_integer(nofp), L" free parameters.)");
+		double var = DataModeler_getVarianceOfParameters (me, GET_INTEGER (U"left Parameter range"), GET_INTEGER (U"right Parameter range"), &nofp);
+		Melder_information (var, U" (for ", nofp, U" free parameters)");
 	}
 END
 
 DIRECT (DataModeler_getNumberOfDataPoints)
 	LOOP {
 		iam (DataModeler);
-		Melder_information (Melder_integer (my numberOfDataPoints), L" (= number of data points)");
+		Melder_information (my numberOfDataPoints, U" (= number of data points)");
 	}
 END
 
 DIRECT (DataModeler_getNumberOfInvalidDataPoints)
 	LOOP {
 		iam (DataModeler);
-		Melder_information (Melder_integer (DataModeler_getNumberOfInvalidDataPoints (me)), L" (= number of invalid data points)");
+		Melder_information (DataModeler_getNumberOfInvalidDataPoints (me), U" (= number of invalid data points)");
 	}
 END
 
-FORM (DataModeler_getModelValueAtX, L"DataModeler: Get model value at x", 0)
-	REAL (L"X", L"0.1")
+FORM (DataModeler_getModelValueAtX, U"DataModeler: Get model value at x", 0)
+	REAL (U"X", U"0.1")
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		double y = DataModeler_getModelValueAtX (me, GET_REAL (L"X"));
-		Melder_informationReal (y, NULL);
+		double y = DataModeler_getModelValueAtX (me, GET_REAL (U"X"));
+		Melder_informationReal (y, nullptr);
 	}
 END
 
@@ -165,7 +187,7 @@ DIRECT (DataModeler_getResidualSumOfSquares)
 		long n;
 		iam (DataModeler);
 		double rss = DataModeler_getResidualSumOfSquares (me, &n);
-		Melder_information (Melder_double (rss), L"  (for ", Melder_integer (n), L" datapoints)");
+		Melder_information (rss, U"  (for ", n, U" datapoints)");
 	}
 END
 
@@ -173,74 +195,74 @@ DIRECT (DataModeler_getStandardDeviation)
 	LOOP {
 		iam (DataModeler);
 		double sigma = DataModeler_estimateSigmaY (me);
-		Melder_information (Melder_double (sigma), NULL);
+		Melder_information (sigma);
 	}
 END
 
-FORM (DataModeler_getDataPointValue, L"DataModeler: Get data point value", 0)
-	NATURAL (L"Index", L"1")
+FORM (DataModeler_getDataPointValue, U"DataModeler: Get data point value", 0)
+	NATURAL (U"Index", U"1")
 	OK
 DO
-	long index = GET_INTEGER (L"Index");
+	long index = GET_INTEGER (U"Index");
 	LOOP {
 		iam (DataModeler);
 		double value = DataModeler_getDataPointValue (me, index);
-		Melder_information (Melder_double (value), L" (= value at point ", Melder_integer (index), L")");
+		Melder_information (value, U" (= value at point ", index, U")");
 	}
 END
 
-FORM (DataModeler_getDataPointSigma, L"DataModeler: Get data point sigma", 0)
-	NATURAL (L"Index", L"1")
+FORM (DataModeler_getDataPointSigma, U"DataModeler: Get data point sigma", 0)
+	NATURAL (U"Index", U"1")
 	OK
 DO
-	long index = GET_INTEGER (L"Index");
+	long index = GET_INTEGER (U"Index");
 	LOOP {
 		iam (DataModeler);
 		double sigma = DataModeler_getDataPointSigma (me, index);
-		Melder_information (Melder_double (sigma), L" (= sigma at point ", Melder_integer (index), L")");
+		Melder_information (sigma, U" (= sigma at point ", index, U")");
 	}
 END
 
-FORM (DataModeler_getDataPointStatus, L"DataModeler: Get data point status", 0)
-	NATURAL (L"Index", L"1")
+FORM (DataModeler_getDataPointStatus, U"DataModeler: Get data point status", 0)
+	NATURAL (U"Index", U"1")
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		int status = DataModeler_getDataPointStatus (me, GET_INTEGER (L"Index"));
-		Melder_information (status == DataModeler_DATA_INVALID ? L"Invalid" : L"Valid");
+		int status = DataModeler_getDataPointStatus (me, GET_INTEGER (U"Index"));
+		Melder_information (status == DataModeler_DATA_INVALID ? U"Invalid" : U"Valid");
 	}
 END
 
 DIRECT (DataModeler_getCoefficientOfDetermination)
 	LOOP {
 		iam (DataModeler);
-		double rSquared = DataModeler_getCoefficientOfDetermination (me, NULL, NULL);
-		Melder_informationReal (rSquared, L" (= R^2)");
+		double rSquared = DataModeler_getCoefficientOfDetermination (me, nullptr, nullptr);
+		Melder_informationReal (rSquared, U" (= R^2)");
 	}
 END
 
-FORM (DataModeler_reportChiSquared, L"DataModeler: Report chi squared", 0)
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Sigma")
-		OPTION (L"Relative")
-		OPTION (L"Sqrt sigma")
+FORM (DataModeler_reportChiSquared, U"DataModeler: Report chi squared", 0)
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Sigma")
+		OPTION (U"Relative")
+		OPTION (U"Sqrt sigma")
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		int useSigmaY = GET_INTEGER (L"Weigh data") - 1;
+		int useSigmaY = GET_INTEGER (U"Weigh data") - 1;
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"Chi squared test:");
-		MelderInfo_writeLine (useSigmaY == DataModeler_DATA_WEIGH_EQUAL ? L"Standard deviation is estimated from the data." :
-			useSigmaY == DataModeler_DATA_WEIGH_SIGMA ? L"Sigmas are used as estimate for local standard deviations." : 
-			useSigmaY == DataModeler_DATA_WEIGH_RELATIVE ? L"1/Q's are used as estimate for local standard deviations." :
-			L"Sqrt sigmas are used as estimate for local standard deviations.");
-		double  ndf, probability, chisq = DataModeler_getChiSquaredQ (me, useSigmaY, &probability, &ndf);
-		MelderInfo_writeLine (L"Chi squared = ", Melder_double (chisq));
-		MelderInfo_writeLine (L"Probability = ", Melder_double (probability));
-		MelderInfo_writeLine (L"Number of degrees of freedom = ", Melder_double (ndf));
+		MelderInfo_writeLine (U"Chi squared test:");
+		MelderInfo_writeLine (useSigmaY == DataModeler_DATA_WEIGH_EQUAL ? U"Standard deviation is estimated from the data." :
+			useSigmaY == DataModeler_DATA_WEIGH_SIGMA ? U"Sigmas are used as estimate for local standard deviations." : 
+			useSigmaY == DataModeler_DATA_WEIGH_RELATIVE ? U"1/Q's are used as estimate for local standard deviations." :
+			U"Sqrt sigmas are used as estimate for local standard deviations.");
+		double ndf, probability, chisq = DataModeler_getChiSquaredQ (me, useSigmaY, &probability, &ndf);
+		MelderInfo_writeLine (U"Chi squared = ", chisq);
+		MelderInfo_writeLine (U"Probability = ", probability);
+		MelderInfo_writeLine (U"Number of degrees of freedom = ", ndf);
 		MelderInfo_close ();
 	}
 END
@@ -249,100 +271,103 @@ DIRECT (DataModeler_getDegreesOfFreedom)
 	LOOP {
 		iam (DataModeler);
 		double dof = DataModeler_getDegreesOfFreedom (me);
-		Melder_informationReal (dof, L" (= degrees of freedom)");
+		Melder_informationReal (dof, U" (= degrees of freedom)");
 	}
 END
 
-FORM (DataModeler_setDataWeighing, L"DataModeler: Set data weighing", 0)
-	OPTIONMENU (L"Weigh data", 1)
-		OPTION (L"Equally")
-		OPTION (L"Sigma")
-		OPTION (L"Relative")
-		OPTION (L"Sqrt sigma")
+FORM (DataModeler_setDataWeighing, U"DataModeler: Set data weighing", 0)
+	OPTIONMENU (U"Weigh data", 1)
+		OPTION (U"Equally")
+		OPTION (U"Sigma")
+		OPTION (U"Relative")
+		OPTION (U"Sqrt sigma")
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		DataModeler_setDataWeighing (me, GET_INTEGER (L"Weigh data") - 1);
+		DataModeler_setDataWeighing (me, GET_INTEGER (U"Weigh data") - 1);
 	}
 END
 
-FORM (DataModeler_setTolerance, L"DataModeler: Set tolerance", 0)
-	REAL (L"Tolerance", L"1e-5")
+FORM (DataModeler_setTolerance, U"DataModeler: Set tolerance", 0)
+	REAL (U"Tolerance", U"1e-5")
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		DataModeler_setTolerance (me, GET_REAL (L"Tolerance"));
+		DataModeler_setTolerance (me, GET_REAL (U"Tolerance"));
 	}
 END
 
-FORM (DataModeler_setParameterValueFixed, L"DataModeler: Set parameter value fixed", 0)
-	NATURAL (L"Parameter number", L"1")
-	REAL (L"Value", L"0.0")
+FORM (DataModeler_setParameterValue, U"DataModeler: Set parameter value", 0)
+	NATURAL (U"Parameter number", U"1")
+	REAL (U"Value", U"0.0")
+	OPTIONMENU (U"Status", 1)
+		OPTION (U"Free")
+		OPTION (U"Fixed")
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		DataModeler_setParameterValueFixed (me, GET_INTEGER (L"Parameter number"), GET_REAL (L"Value"));
+		DataModeler_setParameterValue (me, GET_INTEGER (U"Parameter number"), GET_REAL (U"Value"), GET_INTEGER (U"Status") - 1);
 	}
 END
 
-FORM (DataModeler_setParameterFree, L"DataModeler: Set parameter free", 0)
-	INTEGER (L"left Parameter range", L"0")
-	INTEGER (L"right Parameter range", L"0")
+FORM (DataModeler_setParameterFree, U"DataModeler: Set parameter free", 0)
+	INTEGER (U"left Parameter range", U"0")
+	INTEGER (U"right Parameter range", U"0")
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		DataModeler_setParametersFree (me, GET_INTEGER (L"left Parameter range"), GET_INTEGER (L"right Parameter range"));
+		DataModeler_setParametersFree (me, GET_INTEGER (U"left Parameter range"), GET_INTEGER (U"right Parameter range"));
 	}
 END
 
-FORM (DataModeler_setParameterValuesToZero, L"DataModeler: Set parameter values to zero", 0)
-	REAL (L"Number of sigmas", L"1.0")
+FORM (DataModeler_setParameterValuesToZero, U"DataModeler: Set parameter values to zero", 0)
+	REAL (U"Number of sigmas", U"1.0")
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		DataModeler_setParameterValuesToZero (me, GET_REAL (L"Number of sigmas"));
+		DataModeler_setParameterValuesToZero (me, GET_REAL (U"Number of sigmas"));
 	}
 END
 
-FORM (DataModeler_setDataPointStatus, L"DataModeler: Set data point status", 0)
-	NATURAL (L"Index", L"1")
-	OPTIONMENU (L"Status", 1)
-		OPTION (L"Valid")
-		OPTION (L"Invalid")
+FORM (DataModeler_setDataPointStatus, U"DataModeler: Set data point status", 0)
+	NATURAL (U"Index", U"1")
+	OPTIONMENU (U"Status", 1)
+		OPTION (U"Valid")
+		OPTION (U"Invalid")
 	OK
 DO
-	int menustatus = GET_INTEGER (L"Status");
+	int menustatus = GET_INTEGER (U"Status");
 	int status = menustatus == 2 ? DataModeler_DATA_INVALID : DataModeler_DATA_VALID;
 	LOOP {
 		iam (DataModeler);
-		DataModeler_setDataPointStatus (me, GET_INTEGER (L"Index"), status);
+		DataModeler_setDataPointStatus (me, GET_INTEGER (U"Index"), status);
 	}
 END
 
-FORM (DataModeler_setDataPointValue, L"DataModeler: Set data point value", 0)
-	NATURAL (L"Index", L"1")
-	REAL (L"Value", L"0.0")
+FORM (DataModeler_setDataPointValue, U"DataModeler: Set data point value", 0)
+	NATURAL (U"Index", U"1")
+	REAL (U"Value", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		DataModeler_setDataPointValue (me, GET_INTEGER (L"Index"), GET_REAL (L"Value"));
+		DataModeler_setDataPointValue (me, GET_INTEGER (U"Index"), GET_REAL (U"Value"));
 	}
 END
 
-FORM (DataModeler_setDataPointSigma, L"DataModeler: Set data point sigma", 0)
-	NATURAL (L"Index", L"1")
-	REAL (L"Sigma", L"10.0")
+FORM (DataModeler_setDataPointSigma, U"DataModeler: Set data point sigma", 0)
+	NATURAL (U"Index", U"1")
+	REAL (U"Sigma", U"10.0")
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		DataModeler_setDataPointSigma (me, GET_INTEGER (L"Index"), GET_REAL (L"Sigma"));
+		DataModeler_setDataPointSigma (me, GET_INTEGER (U"Index"), GET_REAL (U"Sigma"));
 	}
 END
 
@@ -361,668 +386,700 @@ DIRECT (DataModeler_to_Covariance_parameters)
 	}
 END
 
-FORM (DataModeler_to_Table_zscores, L"DataModeler: To Table (z-scores)", 0)
-	BOOLEAN (L"Use sigmas on y-values", 1)
+FORM (DataModeler_to_Table_zscores, U"DataModeler: To Table (z-scores)", 0)
+	BOOLEAN (U"Use sigmas on y-values", 1)
 	OK
 DO
 	LOOP {
 		iam (DataModeler);
-		autoTable thee = DataModeler_to_Table_zscores (me, GET_INTEGER (L"Use sigmas on y-values"));
-		praat_new (thee.transfer(), my name, L"_z");
+		autoTable thee = DataModeler_to_Table_zscores (me, GET_INTEGER (U"Use sigmas on y-values"));
+		praat_new (thee.transfer(), my name, U"_z");
 	}
 END
 
-FORM (Formant_to_FormantModeler, L"Formant: To FormantModeler", 0)
+FORM (Formant_to_FormantModeler, U"Formant: To FormantModeler", 0)
 //double tmin, double tmax, long numberOfFormants, long numberOfParametersPerTrack
-	REAL (L"left Start time", L"0.0")
-	REAL (L"right End time", L"0.1")
-	NATURAL (L"Number of formants", L"3")
-	INTEGER (L"Order of polynomials", L"3")
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Bandwidth")
-		OPTION (L"Bandwidth / frequency")
-		OPTION (L"Sqrt bandwidth")
+	REAL (U"left Start time", U"0.0")
+	REAL (U"right End time", U"0.1")
+	NATURAL (U"Number of formants", U"3")
+	INTEGER (U"Order of polynomials", U"3")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
 	OK
 DO
-	long order = GET_INTEGER (L"Order of polynomials");
-	REQUIRE (order >= 0, L"The order must be greater than or equal to zero.")
+	long order = GET_INTEGER (U"Order of polynomials");
+	REQUIRE (order >= 0, U"The order must be greater than or equal to zero.")
 	LOOP {
 		iam (Formant);
-		autoFormantModeler thee = Formant_to_FormantModeler (me, GET_REAL (L"left Start time"), GET_REAL (L"right End time"),
-			GET_INTEGER (L"Number of formants"), order + 1, GET_INTEGER (L"Weigh data") - 1);
-		praat_new (thee.transfer(), my name, L"_o", Melder_integer (order));
+		autoFormantModeler thee = Formant_to_FormantModeler (me, GET_REAL (U"left Start time"), 
+			GET_REAL (U"right End time"), GET_INTEGER (U"Number of formants"), order + 1, GET_INTEGER (U"Weigh data") - 1);
+		praat_new (thee.transfer(), my name, U"_o", order);
 	}
 END
 
-FORM (Formants_extractSmoothestPart, L"Formants: Extract smoothest part", L"Formants: Extract smoothest part")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	NATURAL (L"Number of formant tracks", L"4")
-	INTEGER (L"Order of polynomials", L"3")
-	LABEL (L"", L"Use bandwidths to model the formant tracks")
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Bandwidth")
-		OPTION (L"Bandwidth / frequency")
-		OPTION (L"Sqrt bandwidth")
-	LABEL (L"", L"Zero parameter values whose range include zero.")
-	REAL (L"Number of sigmas", L"1.0")
-	POSITIVE (L"Parameter variance power", L"1.5")
+FORM (Formants_extractSmoothestPart, U"Formants: Extract smoothest part", U"Formants: Extract smoothest part")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	NATURAL (U"Number of formant tracks", U"4")
+	INTEGER (U"Order of polynomials", U"3")
+	LABEL (U"", U"Use bandwidths to model the formant tracks:")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
+	LABEL (U"", U"Zero parameter values whose range include zero:")
+	REAL (U"Number of sigmas", U"1.0")
+	REAL (U"Parameter variance power", U"1.5")
 	OK
 DO
 	autoCollection set = praat_getSelectedObjects ();
-	double tmin = GET_REAL (L"left Time range"), tmax = GET_REAL (L"right Time range");
-	long index = Formants_getSmoothestInInterval (set.peek(), tmin, tmax, GET_INTEGER (L"Number of formant tracks"),
-		GET_INTEGER (L"Order of polynomials") + 1,
-		GET_INTEGER (L"Weigh data") - 1, GET_REAL (L"Number of sigmas"), GET_REAL (L"Parameter variance power"), 0, 1, 1, 1, 1, 1);
+	double tmin = GET_REAL (U"left Time range"), tmax = GET_REAL (U"right Time range");
+	long index = Formants_getSmoothestInInterval (set.peek(), tmin, tmax, GET_INTEGER (U"Number of formant tracks"), GET_INTEGER (U"Order of polynomials") + 1,
+		GET_INTEGER (U"Weigh data") - 1, 0, GET_REAL (U"Number of sigmas"), GET_REAL (U"Parameter variance power"), 1, 1, 1, 1, 1);
 	// next code is necessary to get the Formant at postion index selected and to get its name
 	long iselected = 0;
-	Formant him = NULL;
+	Formant him = nullptr;
 	LOOP {
 		iselected ++;
-		if (iselected != index) {
-			praat_deselect (IOBJECT);
-		} else {
+		if (iselected == index) {
 			him = static_cast<Formant> (OBJECT);
 		}
 	}
-	Melder_assert (him != NULL);
+	Melder_assert (him);
 	autoFormant thee = Formant_extractPart (him, tmin, tmax);
-	praat_new (thee.transfer(), his name, L"_part");
-END
-
-
-FORM (Formants_extractSmoothestPart_constrained, L"Formants: Extract smoothest part (constrained)", L"Formants: Extract smoothest part (constrained)...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	NATURAL (L"Number of formant tracks", L"4")
-	INTEGER (L"Order of polynomials", L"3")
-	LABEL (L"", L"Use bandwidths to model the formant tracks")
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Bandwidth")
-		OPTION (L"Bandwidth / frequency")
-		OPTION (L"Sqrt bandwidth")
-	LABEL (L"", L"Zero parameter values whose range include zero.")
-	REAL (L"Number of sigmas", L"1.0")
-	POSITIVE (L"Parameter variance power", L"1.5")
-	LABEL (L"", L"The constraints on the formants")
-	REAL (L"Minimum F1 (Hz)", L"100.0")
-	REAL (L"Maximum F1 (Hz)", L"1200.0")
-	REAL (L"Minimum F2 (Hz)", L"0.0")
-	POSITIVE (L"Maximum F2 (Hz)", L"5000.0")
-	POSITIVE (L"Minimum F3 (Hz)", L"1500.0")
+	praat_new (thee.transfer(), his name, U"_part");
+END
+
+
+FORM (Formants_extractSmoothestPart_constrained, U"Formants: Extract smoothest part (constrained)", U"Formants: Extract smoothest part (constrained)...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	NATURAL (U"Number of formant tracks", U"4")
+	INTEGER (U"Order of polynomials", U"3")
+	LABEL (U"", U"Use bandwidths to model the formant tracks:")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
+	LABEL (U"", U"Zero parameter values whose range include zero:")
+	REAL (U"Number of sigmas", U"1.0")
+	REAL (U"Parameter variance power", U"1.5")
+	LABEL (U"", U"The constraints on the formants:")
+	REAL (U"Minimum F1 (Hz)", U"100.0")
+	REAL (U"Maximum F1 (Hz)", U"1200.0")
+	REAL (U"Minimum F2 (Hz)", U"0.0")
+	POSITIVE (U"Maximum F2 (Hz)", U"5000.0")
+	POSITIVE (U"Minimum F3 (Hz)", U"1500.0")
 	OK
 DO
 	autoCollection set = praat_getSelectedObjects ();
-	double tmin = GET_REAL (L"left Time range"), tmax = GET_REAL (L"right Time range");
-	long index = Formants_getSmoothestInInterval (set.peek(), tmin, tmax, 
-		GET_INTEGER (L"Number of formant tracks"), 
-	 	GET_INTEGER (L"Order of polynomials") + 1, GET_INTEGER (L"Weigh data") - 1, 
-		GET_REAL (L"Number of sigmas"), GET_REAL (L"Parameter variance power"), 1, GET_REAL (L"Minimum F1"), GET_REAL (L"Maximum F1"),
-		GET_REAL (L"Minimum F2"), GET_REAL (L"Maximum F2"), GET_REAL (L"Minimum F3"));
+	double tmin = GET_REAL (U"left Time range"), tmax = GET_REAL (U"right Time range");
+	long index = Formants_getSmoothestInInterval (set.peek(), tmin, tmax, GET_INTEGER (U"Number of formant tracks"), GET_INTEGER (U"Order of polynomials") + 1,
+		GET_INTEGER (U"Weigh data") - 1, 1, GET_REAL (U"Number of sigmas"), GET_REAL (U"Parameter variance power"),
+		GET_REAL (U"Minimum F1"), GET_REAL (U"Maximum F1"), GET_REAL (U"Minimum F2"), GET_REAL (U"Maximum F2"), GET_REAL (U"Minimum F3"));
 	// next code is necessary to get the Formant at postion index selected and to get its name
 	long iselected = 0;
-	Formant him = NULL;
+	Formant him = nullptr;
 	LOOP {
 		iselected ++;
-		if (iselected != index) {
-			praat_deselect (IOBJECT);
-		} else {
+		if (iselected == index) {
 			him = static_cast<Formant> (OBJECT);
 		}
 	}
-	Melder_assert (him != NULL);
+	Melder_assert (him);
 	autoFormant thee = Formant_extractPart (him, tmin, tmax);
-	praat_new (thee.transfer(), his name, L"_part");
+	praat_new (thee.transfer(), his name, U"_part");
 END
 
 /********************** FormantModeler ******************************/
 
-FORM (FormantModeler_drawEstimatedTracks, L"FormantModeler: Draw estimated tracks", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"Maximum frequency (Hz)", L"5500.0")
-	NATURAL (L"left Formant range", L"1")
-	NATURAL (L"right Formant range", L"3")
-	INTEGER (L"Order of polynomials for estimation", L"3")
-	REAL (L"Horizontal offset (mm)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (FormantModeler_drawEstimatedTracks, U"FormantModeler: Draw estimated tracks", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"Maximum frequency (Hz)", U"5500.0")
+	NATURAL (U"left Formant range", U"1")
+	NATURAL (U"right Formant range", U"3")
+	INTEGER (U"Order of polynomials for estimation", U"3")
+	REAL (U"Horizontal offset (mm)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
-	long order = GET_INTEGER (L"Order of polynomials for estimation");
-	REQUIRE (order >= 0, L"The order must be greater than or equal to zero.")
+	long order = GET_INTEGER (U"Order of polynomials for estimation");
+	REQUIRE (order >= 0, U"The order must be greater than or equal to zero.")
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_drawTracks (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), 
-			GET_REAL (L"Maximum frequency"), GET_INTEGER (L"left Formant range"), GET_INTEGER (L"right Formant range"), 1, order + 1, 
-			GET_REAL (L"Horizontal offset"), GET_INTEGER (L"Garnish"));
+		FormantModeler_drawTracks (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), 
+			GET_REAL (U"Maximum frequency"), GET_INTEGER (U"left Formant range"), GET_INTEGER (U"right Formant range"), 1, order + 1, 
+			GET_REAL (U"Horizontal offset"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FormantModeler_drawTracks, L"FormantModeler: Draw tracks", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"Maximum frequency (Hz)", L"5500.0")
-	NATURAL (L"left Formant range", L"1")
-	NATURAL (L"right Formant range", L"3")
-	REAL (L"Horizontal offset (mm)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (FormantModeler_drawTracks, U"FormantModeler: Draw tracks", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"Maximum frequency (Hz)", U"5500.0")
+	NATURAL (U"left Formant range", U"1")
+	NATURAL (U"right Formant range", U"3")
+	REAL (U"Horizontal offset (mm)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	long order = 6;
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_drawTracks (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), 
-			GET_REAL (L"Maximum frequency"), GET_INTEGER (L"left Formant range"), GET_INTEGER (L"right Formant range"),
-			0, order + 1, GET_REAL (L"Horizontal offset"), GET_INTEGER (L"Garnish"));
+		FormantModeler_drawTracks (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), 
+			GET_REAL (U"Maximum frequency"), GET_INTEGER (U"left Formant range"), GET_INTEGER (U"right Formant range"),
+			0, order + 1, GET_REAL (U"Horizontal offset"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FormantModeler_speckle, L"FormantModeler: Speckle", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"Maximum frequency (Hz)", L"5500.0")
-	NATURAL (L"left Formant range", L"1")
-	NATURAL (L"right Formant range", L"3")
-	BOOLEAN (L"Draw error bars", 1)
-	REAL (L"Bar width (mm)", L"1.0")
-	REAL (L"Horizontal offset (mm)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (FormantModeler_speckle, U"FormantModeler: Speckle", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"Maximum frequency (Hz)", U"5500.0")
+	NATURAL (U"left Formant range", U"1")
+	NATURAL (U"right Formant range", U"3")
+	BOOLEAN (U"Draw error bars", 1)
+	REAL (U"Bar width (mm)", U"1.0")
+	REAL (U"Horizontal offset (mm)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	long order = 6;
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_speckle (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), 
-			GET_REAL (L"Maximum frequency"), GET_INTEGER (L"left Formant range"), GET_INTEGER (L"right Formant range"),
-			0, order + 1, GET_INTEGER (L"Draw error bars"), GET_REAL (L"Bar width"), GET_REAL (L"Horizontal offset"), GET_INTEGER (L"Garnish"));
-	}
-END
-
-FORM (FormantModeler_drawOutliersMarked, L"FormantModeler: Draw outliers marked", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"Maximum frequency (Hz)", L"5500.0")
-	NATURAL (L"left Formant range", L"1")
-	NATURAL (L"right Formant range", L"3")
-	POSITIVE (L"Number of sigmas", L"3.0")
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Bandwidth")
-		OPTION (L"Bandwidth / frequency")
-		OPTION (L"Sqrt bandwidth")
-	WORD (L"Mark", L"o")
-	NATURAL (L"Mark font size", L"12")
-	REAL (L"Horizontal offset (mm)", L"0.0")
-	BOOLEAN (L"Garnish", 0)
+		FormantModeler_speckle (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), 
+			GET_REAL (U"Maximum frequency"), GET_INTEGER (U"left Formant range"), GET_INTEGER (U"right Formant range"),
+			0, order + 1, GET_INTEGER (U"Draw error bars"), GET_REAL (U"Bar width"), GET_REAL (U"Horizontal offset"), GET_INTEGER (U"Garnish"));
+	}
+END
+
+FORM (FormantModeler_drawOutliersMarked, U"FormantModeler: Draw outliers marked", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"Maximum frequency (Hz)", U"5500.0")
+	NATURAL (U"left Formant range", U"1")
+	NATURAL (U"right Formant range", U"3")
+	POSITIVE (U"Number of sigmas", U"3.0")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
+	WORD (U"Mark", U"o")
+	NATURAL (U"Mark font size", U"12")
+	REAL (U"Horizontal offset (mm)", U"0.0")
+	BOOLEAN (U"Garnish", 0)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_drawOutliersMarked (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"Maximum frequency"), GET_INTEGER (L"left Formant range"), GET_INTEGER (L"right Formant range"),
-			GET_REAL (L"Number of sigmas"), GET_INTEGER (L"Weigh data") - 1, GET_STRING (L"Mark"),
-			GET_INTEGER (L"Mark font size"), GET_REAL (L"Horizontal offset"), GET_INTEGER (L"Garnish"));
+		FormantModeler_drawOutliersMarked (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"Maximum frequency"), GET_INTEGER (U"left Formant range"), GET_INTEGER (U"right Formant range"),
+			GET_REAL (U"Number of sigmas"), GET_INTEGER (U"Weigh data") - 1, GET_STRING (U"Mark"),
+			GET_INTEGER (U"Mark font size"), GET_REAL (U"Horizontal offset"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-//(FormantModeler me, Graphics g, long iformant, long numberOfQuantiles, double numberOfSigmas, int labelSize, const wchar_t *label, int garnish)
-FORM (FormantModeler_normalProbabilityPlot, L"FormantModeler: Normal probability plot", 0)
-	NATURAL (L"Formant number", L"1")
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Bandwidth")
-		OPTION (L"Bandwidth / frequency")
-		OPTION (L"Sqrt bandwidth")
-	NATURAL (L"Number of quantiles", L"100")
-	REAL (L"Number of sigmas", L"0.0")
-	NATURAL (L"Label size", L"12")
-	WORD (L"Label", L"+")
-	BOOLEAN (L"Garnish", 1);
+FORM (FormantModeler_drawVariancesOfShiftedTracks, U"FormantModeler: Draw variances of shifted tracks", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range", U"0.0")
+	REAL (U"left Variance range", U"0.0")
+	REAL (U"right Variance range", U"0.0")
+	OPTIONMENU (U"Shift tracks", 1)
+		OPTION (U"No")
+		OPTION (U"Up")
+		OPTION (U"Down")
+	NATURAL (U"left Formant range", U"1")
+	NATURAL (U"right Formant range", U"4")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_normalProbabilityPlot (me, GRAPHICS, GET_INTEGER (L"Formant number"), GET_INTEGER (L"Weigh data") - 1,
-			GET_INTEGER (L"Number of quantiles"),
-			GET_REAL (L"Number of sigmas"), GET_INTEGER (L"Label size"), GET_STRING (L"Label"), GET_INTEGER (L"Garnish"));
+		FormantModeler_drawVariancesOfShiftedTracks (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Variance range"), GET_REAL (U"right Variance range"), GET_INTEGER (U"Shift tracks"), 
+			GET_INTEGER (U"left Formant range"), GET_INTEGER (U"right Formant range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FormantModeler_drawBasisFunction, L"FormantModeler: Draw basis function", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Amplitude range (Hz)", L"0.0")
-	REAL (L"right Amplitude range (Hz)", L"5500.0")
+FORM (FormantModeler_drawCumulativeChiScores, U"FormantModeler: Draw cumulative chi scores", 0)
+	REAL (U"left Time range", U"0.0")
+	REAL (U"right Time range", U"0.0")
+	REAL (U"left Chisq range", U"0.0")
+	REAL (U"right Chisq range", U"0.0")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
+	BOOLEAN (U"Garnish", 1)
+	OK
+DO
+	autoPraatPicture picture;
+	LOOP {
+		iam (FormantModeler);
+		FormantModeler_drawCumulativeChiScores (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), 
+			GET_REAL (U"left Chisq range"), GET_REAL (U"right Chisq range"), GET_INTEGER (U"Weigh data"), GET_INTEGER (U"Garnish"));
+	}
+END
+
+
+FORM (FormantModeler_normalProbabilityPlot, U"FormantModeler: Normal probability plot", 0)
+	NATURAL (U"Formant number", U"1")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
+	NATURAL (U"Number of quantiles", U"100")
+	REAL (U"Number of sigmas", U"0.0")
+	NATURAL (U"Label size", U"12")
+	WORD (U"Label", U"+")
+	BOOLEAN (U"Garnish", 1);
+	OK
+DO
+	autoPraatPicture picture;
+	LOOP {
+		iam (FormantModeler);
+		FormantModeler_normalProbabilityPlot (me, GRAPHICS, GET_INTEGER (U"Formant number"), GET_INTEGER (U"Weigh data") - 1,
+			GET_INTEGER (U"Number of quantiles"),
+			GET_REAL (U"Number of sigmas"), GET_INTEGER (U"Label size"), GET_STRING (U"Label"), GET_INTEGER (U"Garnish"));
+	}
+END
+
+FORM (FormantModeler_drawBasisFunction, U"FormantModeler: Draw basis function", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Amplitude range (Hz)", U"0.0")
+	REAL (U"right Amplitude range (Hz)", U"5500.0")
 	//long iterm, bool scaled, long numberOfPoints, int garnish
-	NATURAL (L"Formant number", L"1")
-	NATURAL (L"Basis function", L"2")
-	BOOLEAN (L"Scale function with parameter value", 0)
-	NATURAL (L"Number of points", L"200")
-	BOOLEAN (L"Garnish", 1)
+	NATURAL (U"Formant number", U"1")
+	NATURAL (U"Basis function", U"2")
+	BOOLEAN (U"Scale function with parameter value", 0)
+	NATURAL (U"Number of points", U"200")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_drawBasisFunction (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"),GET_INTEGER (L"Formant number"),
- 			GET_INTEGER (L"Basis function"), GET_INTEGER (L"Scale function with parameter value"),
-			GET_INTEGER (L"Number of points"), GET_INTEGER (L"Garnish"));
+		FormantModeler_drawBasisFunction (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"),GET_INTEGER (U"Formant number"),
+ 			GET_INTEGER (U"Basis function"), GET_INTEGER (U"Scale function with parameter value"),
+			GET_INTEGER (U"Number of points"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FormantModeler_getModelValueAtTime, L"", 0)
-	NATURAL (L"Formant number", L"1")
-	REAL (L"Time (s)", L"0.1")
+FORM (FormantModeler_getModelValueAtTime, U"", 0)
+	NATURAL (U"Formant number", U"1")
+	REAL (U"Time (s)", U"0.1")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		double y = FormantModeler_getModelValueAtTime (me, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"));
-		Melder_informationReal (y, L"Hertz");
+		double y = FormantModeler_getModelValueAtTime (me, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"));
+		Melder_informationReal (y, U"Hertz");
 	}
 END
 
-FORM (FormantModeler_getDataPointValue, L"FormantModeler: Get data point value", 0)
-	NATURAL (L"Formant number", L"1")
-	NATURAL (L"Index", L"1")
+FORM (FormantModeler_getDataPointValue, U"FormantModeler: Get data point value", 0)
+	NATURAL (U"Formant number", U"1")
+	NATURAL (U"Index", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number");
-	long index = GET_INTEGER (L"Index");
+	long iformant = GET_INTEGER (U"Formant number");
+	long index = GET_INTEGER (U"Index");
 	LOOP {
 		iam (FormantModeler);
 		double value = FormantModeler_getDataPointValue (me, iformant, index);
-		Melder_information (Melder_double (value), L" (= value of point ", Melder_integer (index), L" in track F", Melder_integer (iformant), L")");
+		Melder_information (value, U" (= value of point ", index, U" in track F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_getDataPointSigma, L"FormantModeler: Get data point sigma", 0)
-	NATURAL (L"Formant number", L"1")
-	NATURAL (L"Index", L"1")
+FORM (FormantModeler_getDataPointSigma, U"FormantModeler: Get data point sigma", 0)
+	NATURAL (U"Formant number", U"1")
+	NATURAL (U"Index", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number");
-	long index = GET_INTEGER (L"Index");
+	long iformant = GET_INTEGER (U"Formant number");
+	long index = GET_INTEGER (U"Index");
 	LOOP {
 		iam (FormantModeler);
 		double value = FormantModeler_getDataPointSigma (me, iformant, index);
-		Melder_information (Melder_double (value), L" (= sigma of point ", Melder_integer (index), L" in track F", Melder_integer (iformant), L")");
+		Melder_information (value, U" (= sigma of point ", index, U" in track F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_getDataPointStatus, L"FormantModeler: Get data point status", 0)
-	NATURAL (L"Formant number", L"1")
-	NATURAL (L"Index", L"1")
+FORM (FormantModeler_getDataPointStatus, U"FormantModeler: Get data point status", 0)
+	NATURAL (U"Formant number", U"1")
+	NATURAL (U"Index", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number");
-	long index = GET_INTEGER (L"Index");
+	long iformant = GET_INTEGER (U"Formant number");
+	long index = GET_INTEGER (U"Index");
 	LOOP {
 		iam (FormantModeler);
 		int status = FormantModeler_getDataPointStatus (me, iformant, index);
-		Melder_information (status == DataModeler_DATA_INVALID ? L"Invalid" : L"Valid");
+		Melder_information (status == DataModeler_DATA_INVALID ? U"Invalid" : U"Valid");
 	}
 END
 
 DIRECT (FormantModeler_getNumberOfTracks)
 	LOOP {
 		iam (FormantModeler);
-		double nop = FormantModeler_getNumberOfTracks (me);
-		Melder_information (Melder_integer (nop), L" (= number of formants)");
+		long nop = FormantModeler_getNumberOfTracks (me);
+		Melder_information (nop, U" (= number of formants)");
 	}
 END
 
-FORM (FormantModeler_getNumberOfParameters, L"FormantModeler: Get number of parameters", 0)
-	NATURAL (L"Formant number", L"1")
+FORM (FormantModeler_getNumberOfParameters, U"FormantModeler: Get number of parameters", 0)
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number");
+	long iformant = GET_INTEGER (U"Formant number");
 	LOOP {
 		iam (FormantModeler);
-		double nop = FormantModeler_getNumberOfParameters (me, iformant);
-		Melder_information (Melder_integer (nop), L" (= number of parameters for F", Melder_integer (iformant), L")");
+		long nop = FormantModeler_getNumberOfParameters (me, iformant);
+		Melder_information (nop, U" (= number of parameters for F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_getNumberOfFixedParameters, L"FormantModeler: Get number of fixed parameters", 0)
-	NATURAL (L"Formant number", L"1")
+FORM (FormantModeler_getNumberOfFixedParameters, U"FormantModeler: Get number of fixed parameters", 0)
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number");
+	long iformant = GET_INTEGER (U"Formant number");
 	LOOP {
 		iam (FormantModeler);
-		double nop = FormantModeler_getNumberOfFixedParameters (me, iformant);
-		Melder_information (Melder_integer (nop), L" (= number of fixed parameters for F", Melder_integer (iformant), L")");
+		long nop = FormantModeler_getNumberOfFixedParameters (me, iformant);
+		Melder_information (nop, U" (= number of fixed parameters for F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_getNumberOfDataPoints, L"FormantModeler: Get number of data points", 0)
-	NATURAL (L"Formant number", L"1")
-	OK
-DO
-	long iformant = GET_INTEGER (L"Formant number");
+DIRECT (FormantModeler_getNumberOfDataPoints)
 	LOOP {
 		iam (FormantModeler);
-		double numberOfDataPoints = FormantModeler_getNumberOfDataPoints (me, iformant);
-		Melder_information (Melder_integer (numberOfDataPoints), L" (= number of data points for F", Melder_integer (iformant), L")");
+		long numberOfDataPoints = FormantModeler_getNumberOfDataPoints (me);
+		Melder_information (numberOfDataPoints);
 	}
 END
 
-FORM (FormantModeler_getNumberOfInvalidDataPoints, L"FormantModeler: Get number of invalid data points", 0)
-	NATURAL (L"Formant number", L"1")
+FORM (FormantModeler_getNumberOfInvalidDataPoints, U"FormantModeler: Get number of invalid data points", 0)
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number");
+	long iformant = GET_INTEGER (U"Formant number");
 	LOOP {
 		iam (FormantModeler);
-		double numberOfDataPoints = FormantModeler_getNumberOfInvalidDataPoints (me, iformant);
-		Melder_information (Melder_integer (numberOfDataPoints), L" (= number of invalid data points for F", Melder_integer (iformant), L")");
+		long numberOfInvalidDataPoints = FormantModeler_getNumberOfInvalidDataPoints (me, iformant);
+		Melder_information (numberOfInvalidDataPoints, U" (= number of invalid data points for F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_getParameterValue, L"FormantModeler: Get parameter value", 0)
-	NATURAL (L"Formant number", L"1")
-	NATURAL (L"Parameter number", L"1")
+FORM (FormantModeler_getParameterValue, U"FormantModeler: Get parameter value", 0)
+	NATURAL (U"Formant number", U"1")
+	NATURAL (U"Parameter number", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number"), iparameter = GET_INTEGER (L"Parameter number");
+	long iformant = GET_INTEGER (U"Formant number"), iparameter = GET_INTEGER (U"Parameter number");
 	LOOP {
 		iam (FormantModeler);
 		double parameter = FormantModeler_getParameterValue (me, iformant, iparameter);
-		Melder_information (Melder_double (parameter), L" (= parameter[", Melder_integer (iparameter), L"] for F", 
-			Melder_integer (iformant), L")");
+		Melder_information (parameter, U" (= parameter[", iparameter, U"] for F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_getParameterStatus, L"FormantModeler: Get parameter status", 0)
-	NATURAL (L"Formant number", L"1")
-	NATURAL (L"Parameter number", L"1")
+FORM (FormantModeler_getParameterStatus, U"FormantModeler: Get parameter status", 0)
+	NATURAL (U"Formant number", U"1")
+	NATURAL (U"Parameter number", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number"), iparameter = GET_INTEGER (L"Parameter number");
+	long iformant = GET_INTEGER (U"Formant number"), iparameter = GET_INTEGER (U"Parameter number");
 	LOOP {
 		iam (FormantModeler);
 		int status = FormantModeler_getParameterStatus (me, iformant, iparameter);
-		Melder_information (status == DataModeler_PARAMETER_FREE ? L"Free" : (status == DataModeler_PARAMETER_FIXED ? L"Fixed" :
-			L"Undefined"), L" (= parameter[", Melder_integer (iparameter), L"] for F", Melder_integer (iformant), L")");
+		Melder_information (status == DataModeler_PARAMETER_FREE ? U"Free" : (status == DataModeler_PARAMETER_FIXED ? U"Fixed" :
+			U"Undefined"), U" (= parameter[", iparameter, U"] for F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_getParameterStandardDeviation, L"FormantModeler: Get parameter standard deviatio", 0)
-	NATURAL (L"Formant number", L"1")
-	NATURAL (L"Parameter number", L"1")
+FORM (FormantModeler_getParameterStandardDeviation, U"FormantModeler: Get parameter standard deviatio", 0)
+	NATURAL (U"Formant number", U"1")
+	NATURAL (U"Parameter number", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number"), iparameter = GET_INTEGER (L"Parameter number");
+	long iformant = GET_INTEGER (U"Formant number"), iparameter = GET_INTEGER (U"Parameter number");
 	LOOP {
 		iam (FormantModeler);
 		double sigma = FormantModeler_getParameterStandardDeviation (me, iformant, iparameter);
-		Melder_information (Melder_double (sigma), L" (= parameter[", Melder_integer (iparameter), L"] for F", Melder_integer (iformant), L")");
+		Melder_information (sigma, U" (= parameter[", iparameter, U"] for F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_getVarianceOfParameters, L"FormantModeler: Get variance of parameters", 0)
-	INTEGER (L"left Formant range", L"0")
-	INTEGER (L"right Formant range", L"0")
-	INTEGER (L"left Parameter range", L"0")
-	INTEGER (L"right Parameter range", L"0")
+FORM (FormantModeler_getVarianceOfParameters, U"FormantModeler: Get variance of parameters", 0)
+	INTEGER (U"left Formant range", U"0")
+	INTEGER (U"right Formant range", U"0")
+	INTEGER (U"left Parameter range", U"0")
+	INTEGER (U"right Parameter range", U"0")
 	OK
 DO
 	long nofp;
 	LOOP {
 		iam (FormantModeler);
-		double var = FormantModeler_getVarianceOfParameters (me, GET_INTEGER (L"left Formant range"), 
-			GET_INTEGER (L"right Formant range"), GET_INTEGER (L"left Parameter range"), GET_INTEGER (L"right Parameter range"), &nofp);
-		Melder_information (Melder_double (var), L" (for ", Melder_integer(nofp), L" free parameters.)");
+		double var = FormantModeler_getVarianceOfParameters (me, GET_INTEGER (U"left Formant range"), 
+			GET_INTEGER (U"right Formant range"), GET_INTEGER (U"left Parameter range"), GET_INTEGER (U"right Parameter range"), &nofp);
+		Melder_information (var, U" (for ", nofp, U" free parameters.)");
 	}
 END
 
-FORM (FormantModeler_getCoefficientOfDetermination, L"FormantModeler: Get coefficient of determination", 0)
-	INTEGER (L"left Formant range", L"0")
-	INTEGER (L"right Formant range", L"0")
+FORM (FormantModeler_getCoefficientOfDetermination, U"FormantModeler: Get coefficient of determination", 0)
+	INTEGER (U"left Formant range", U"0")
+	INTEGER (U"right Formant range", U"0")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		double rSquared = FormantModeler_getCoefficientOfDetermination (me, GET_INTEGER (L"left Formant range"), 
-			GET_INTEGER (L"right Formant range"));
-		Melder_informationReal (rSquared, L" (= R^2)");
+		double rSquared = FormantModeler_getCoefficientOfDetermination (me, GET_INTEGER (U"left Formant range"), 
+			GET_INTEGER (U"right Formant range"));
+		Melder_informationReal (rSquared, U" (= R^2)");
 	}
 END
 
-FORM (FormantModeler_getResidualSumOfSquares, L"FormantModeler: Get residual sum of squares", L"FormantModeler: Get residual sum of squares...")
-	NATURAL (L"Formant number", L"1")
+FORM (FormantModeler_getResidualSumOfSquares, U"FormantModeler: Get residual sum of squares", U"FormantModeler: Get residual sum of squares...")
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
-	long n, iformant = GET_INTEGER (L"Formant number");
+	long n, iformant = GET_INTEGER (U"Formant number");
 	LOOP {
 		iam (FormantModeler);
 		double rss = FormantModeler_getResidualSumOfSquares (me, iformant, &n);
-		Melder_information (Melder_double (rss), L" Hz^2,  (= RSS of F", Melder_integer (iformant), L")");
+		Melder_information (rss, U" Hz^2,  (= RSS of F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_getStandardDeviation, L"FormantModeler: Get formant standard deviation", 0)
-	NATURAL (L"Formant number", L"1")
+FORM (FormantModeler_getStandardDeviation, U"FormantModeler: Get formant standard deviation", 0)
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number");
+	long iformant = GET_INTEGER (U"Formant number");
 	LOOP {
 		iam (FormantModeler);
 		double sigma = FormantModeler_getStandardDeviation (me, iformant);
-		Melder_information (Melder_double (sigma), L" Hz (= std. dev. of F", Melder_integer (iformant), L")");
+		Melder_information (sigma, U" Hz (= std. dev. of F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_reportChiSquared, L"FormantModeler: Report chi squared", 0)
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Bandwidth")
-		OPTION (L"Bandwidth / frequency")
-		OPTION (L"Sqrt bandwidth")
+FORM (FormantModeler_reportChiSquared, U"FormantModeler: Report chi squared", 0)
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		long numberOfFormants = my datamodelers -> size;
-		int useSigmaY = GET_INTEGER (L"Weigh data") - 1;
+		long numberOfFormants = my trackmodelers -> size;
+		int useSigmaY = GET_INTEGER (U"Weigh data") - 1;
 		double chisq = 0, ndf = 0, probability;
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"Chi squared tests for individual models of each ", Melder_integer (numberOfFormants), L" formant track:");
-		MelderInfo_writeLine (useSigmaY == DataModeler_DATA_WEIGH_EQUAL ? L"Standard deviation is estimated from the data." :
-			useSigmaY == DataModeler_DATA_WEIGH_SIGMA ? L"\tBandwidths are used as estimate for local standard deviations." : 
-			useSigmaY == DataModeler_DATA_WEIGH_RELATIVE ? L"\t1/Q's are used as estimate for local standard deviations." :
-			L"\tSqrt bandwidths are used as estimate for local standard deviations.");
+		MelderInfo_writeLine (U"Chi squared tests for individual models of each of ", numberOfFormants, U" formant track:");
+		MelderInfo_writeLine (useSigmaY == DataModeler_DATA_WEIGH_EQUAL ? U"Standard deviation is estimated from the data." :
+			useSigmaY == DataModeler_DATA_WEIGH_SIGMA ? U"\tBandwidths are used as estimate for local standard deviations." : 
+			useSigmaY == DataModeler_DATA_WEIGH_RELATIVE ? U"\t1/Q's are used as estimate for local standard deviations." :
+			U"\tSqrt bandwidths are used as estimate for local standard deviations.");
 		for (long iformant = 1; iformant <= numberOfFormants; iformant++) {
 			chisq = FormantModeler_getChiSquaredQ (me, iformant, iformant, useSigmaY, &probability, &ndf);
-			MelderInfo_writeLine (L"Formant track ", Melder_integer (iformant), L":");
-			MelderInfo_writeLine (L"\tChi squared (F", Melder_integer (iformant), L") = ", Melder_double (chisq));
-			MelderInfo_writeLine (L"\tProbability (F", Melder_integer (iformant), L") = ", Melder_double (probability));
-			MelderInfo_writeLine (L"\tNumber of degrees of freedom (F", Melder_integer (iformant), L") = ", Melder_double (ndf));
+			MelderInfo_writeLine (U"Formant track ", iformant, U":");
+			MelderInfo_writeLine (U"\tChi squared (F", iformant, U") = ", chisq);
+			MelderInfo_writeLine (U"\tProbability (F", iformant, U") = ", probability);
+			MelderInfo_writeLine (U"\tNumber of degrees of freedom (F", iformant, U") = ", ndf);
 		}
 		chisq = FormantModeler_getChiSquaredQ (me, 1, numberOfFormants, useSigmaY, &probability, &ndf);
-		MelderInfo_writeLine (L"Chi squared test for the complete model with ", Melder_integer (numberOfFormants), L" formants:");
-		MelderInfo_writeLine (L"\tChi squared = ", Melder_double (chisq));
-		MelderInfo_writeLine (L"\tProbability = ", Melder_double (probability));
-		MelderInfo_writeLine (L"\tNumber of degrees of freedom = ", Melder_double (ndf));
+		MelderInfo_writeLine (U"Chi squared test for the complete model with ", numberOfFormants, U" formants:");
+		MelderInfo_writeLine (U"\tChi squared = ", chisq);
+		MelderInfo_writeLine (U"\tProbability = ", probability);
+		MelderInfo_writeLine (U"\tNumber of degrees of freedom = ", ndf);
 		MelderInfo_close ();
 	}
 END
 
-FORM (FormantModeler_getDegreesOfFreedom, L"FormantModeler: Get degrees of freedom", 0)
-	NATURAL (L"Formant number", L"1")
+FORM (FormantModeler_getDegreesOfFreedom, U"FormantModeler: Get degrees of freedom", 0)
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number");
+	long iformant = GET_INTEGER (U"Formant number");
 	LOOP {
 		iam (FormantModeler);
 		double sigma = FormantModeler_getDegreesOfFreedom (me, iformant);
-		Melder_information (Melder_double (sigma), L" (= degrees of freedom of F", Melder_integer (iformant), L")");
+		Melder_information (sigma, U" (= degrees of freedom of F", iformant, U")");
 	}
 END
 
-FORM (FormantModeler_getSmoothnessValue, L"FormantModeler: Get smoothness value", 0)
-	INTEGER (L"left Formant range", L"0")
-	INTEGER (L"right Formant range", L"0")
-	INTEGER (L"Order of polynomials", L"3")
-	POSITIVE (L"Parameter variance power", L"1.5")
+FORM (FormantModeler_getSmoothnessValue, U"FormantModeler: Get smoothness value", 0)
+	INTEGER (U"left Formant range", U"0")
+	INTEGER (U"right Formant range", U"0")
+	INTEGER (U"Order of polynomials", U"3")
+	REAL (U"Parameter variance power", U"1.5")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		double smoothness = FormantModeler_getSmoothnessValue (me, GET_INTEGER (L"left Formant range"), 
-			GET_INTEGER (L"right Formant range"), GET_INTEGER (L"Order of polynomials"), GET_REAL (L"Parameter variance power"));
-		Melder_information (Melder_double (smoothness), L" (= smoothness)");
+		double smoothness = FormantModeler_getSmoothnessValue (me, GET_INTEGER (U"left Formant range"), 
+			GET_INTEGER (U"right Formant range"), GET_INTEGER (U"Order of polynomials"), GET_REAL (U"Parameter variance power"));
+		Melder_information (smoothness, U" (= smoothness)");
 	}
 END
 
-FORM (FormantModeler_getAverageDistanceBetweenTracks, L"FormantModeler: Get average distance between tracks", 0)
-	NATURAL (L"Track 1", L"2")
-	NATURAL (L"Track 2", L"3")
-	OPTIONMENU (L"Type of data", 1)
-		OPTION (L"Data points")
-		OPTION (L"Modeled")
+FORM (FormantModeler_getAverageDistanceBetweenTracks, U"FormantModeler: Get average distance between tracks", 0)
+	NATURAL (U"Track 1", U"2")
+	NATURAL (U"Track 2", U"3")
+	OPTIONMENU (U"Type of data", 1)
+		OPTION (U"Data points")
+		OPTION (U"Modeled")
 	OK
 DO
-	long track1 = GET_INTEGER (L"Track 1"), track2 = GET_INTEGER (L"Track 2");
+	long track1 = GET_INTEGER (U"Track 1"), track2 = GET_INTEGER (U"Track 2");
 	LOOP {
 		iam (FormantModeler);
-		double distance = FormantModeler_getAverageDistanceBetweenTracks (me, track1, track2, GET_INTEGER (L"Type of data") - 1);
-		Melder_information (Melder_double (distance), L" (= average |F", Melder_integer(track1), L" - F", Melder_integer (track2), L"|)");
+		double distance = FormantModeler_getAverageDistanceBetweenTracks (me, track1, track2, GET_INTEGER (U"Type of data") - 1);
+		Melder_information (distance, U" (= average |F", track1, U" - F", track2, U"|)");
 	}
 END
 
-FORM (FormantModeler_getFormantsConstraintsFactor, L"FormantModeler: Get formants constraints factor", 0)
-	REAL (L"Minimum F1 (Hz)", L"100.0")
-	REAL (L"Maximum F1 (Hz)", L"1200.0")
-	REAL (L"Minimum F2 (Hz)", L"0.0")
-	POSITIVE (L"Maximum F2 (Hz)", L"5000.0")
-	POSITIVE (L"Minimum F3 (Hz)", L"1500.0")
+FORM (FormantModeler_getFormantsConstraintsFactor, U"FormantModeler: Get formants constraints factor", 0)
+	REAL (U"Minimum F1 (Hz)", U"100.0")
+	REAL (U"Maximum F1 (Hz)", U"1200.0")
+	REAL (U"Minimum F2 (Hz)", U"0.0")
+	POSITIVE (U"Maximum F2 (Hz)", U"5000.0")
+	POSITIVE (U"Minimum F3 (Hz)", U"1500.0")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		double fc = FormantModeler_getFormantsConstraintsFactor (me, GET_REAL (L"Minimum F1"), GET_REAL (L"Maximum F1"),
-		GET_REAL (L"Minimum F2"), GET_REAL (L"Maximum F2"), GET_REAL (L"Minimum F3"));
-		Melder_information (Melder_double (fc), L" (= formants constraints factor)");
+		double fc = FormantModeler_getFormantsConstraintsFactor (me, GET_REAL (U"Minimum F1"), GET_REAL (U"Maximum F1"),
+		GET_REAL (U"Minimum F2"), GET_REAL (U"Maximum F2"), GET_REAL (U"Minimum F3"));
+		Melder_information (fc, U" (= formants constraints factor)");
 	}
 END
 
-FORM (FormantModeler_setDataWeighing, L"FormantModeler: Set data weighing", 0)
-	INTEGER (L"left Formant range", L"0")
-	INTEGER (L"right Formant range", L"0")
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Bandwidth")
-		OPTION (L"Bandwidth / frequency")
-		OPTION (L"Sqrt bandwidth")
+FORM (FormantModeler_setDataWeighing, U"FormantModeler: Set data weighing", 0)
+	INTEGER (U"left Formant range", U"0")
+	INTEGER (U"right Formant range", U"0")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_setDataWeighing (me, GET_INTEGER (L"left Formant range"), GET_INTEGER (L"right Formant range"), 
-			GET_INTEGER (L"Weigh data") - 1);
+		FormantModeler_setDataWeighing (me, GET_INTEGER (U"left Formant range"), GET_INTEGER (U"right Formant range"), 
+			GET_INTEGER (U"Weigh data") - 1);
 	}
 END
 
-FORM (FormantModeler_setTolerance, L"FormantModeler: Set tolerance", 0)
-	REAL (L"Tolerance", L"1e-5")
+FORM (FormantModeler_setTolerance, U"FormantModeler: Set tolerance", 0)
+	REAL (U"Tolerance", U"1e-5")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_setTolerance (me, GET_REAL (L"Tolerance"));
+		FormantModeler_setTolerance (me, GET_REAL (U"Tolerance"));
 	}
 END
 
-FORM (FormantModeler_setParameterValueFixed, L"FormantModeler: Set parameter value fixed", 0)
-	NATURAL (L"Formant number", L"1")
-	NATURAL (L"Parameter number", L"1")
-	REAL (L"Value", L"0.0")
+FORM (FormantModeler_setParameterValueFixed, U"FormantModeler: Set parameter value fixed", 0)
+	NATURAL (U"Formant number", U"1")
+	NATURAL (U"Parameter number", U"1")
+	REAL (U"Value", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_setParameterValueFixed (me, GET_INTEGER (L"Formant number"), GET_INTEGER (L"Parameter number"), GET_REAL (L"Value"));
+		FormantModeler_setParameterValueFixed (me, GET_INTEGER (U"Formant number"), GET_INTEGER (U"Parameter number"), GET_REAL (U"Value"));
 	}
 END
 
 
-FORM (FormantModeler_setParameterFree, L"FormantModeler: Set parameter free", 0)
-	INTEGER (L"left Formant range", L"0")
-	INTEGER (L"right Formant range", L"0")
-	INTEGER (L"left Parameter range", L"0")
-	INTEGER (L"right Parameter range", L"0")
+FORM (FormantModeler_setParameterFree, U"FormantModeler: Set parameter free", 0)
+	INTEGER (U"left Formant range", U"0")
+	INTEGER (U"right Formant range", U"0")
+	INTEGER (U"left Parameter range", U"0")
+	INTEGER (U"right Parameter range", U"0")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_setParametersFree (me, GET_INTEGER (L"left Formant range"), GET_INTEGER (L"right Formant range"),
-			GET_INTEGER (L"left Parameter range"), GET_INTEGER (L"right Parameter range"));
+		FormantModeler_setParametersFree (me, GET_INTEGER (U"left Formant range"), GET_INTEGER (U"right Formant range"),
+			GET_INTEGER (U"left Parameter range"), GET_INTEGER (U"right Parameter range"));
 	}
 END
 
-FORM (FormantModeler_setParameterValuesToZero, L"FormantModeler: Set parameter values to zero", 0)
-	INTEGER (L"left Formant range", L"0")
-	INTEGER (L"right Formant range", L"0")
-	REAL (L"Number of sigmas", L"1.0")
+FORM (FormantModeler_setParameterValuesToZero, U"FormantModeler: Set parameter values to zero", 0)
+	INTEGER (U"left Formant range", U"0")
+	INTEGER (U"right Formant range", U"0")
+	REAL (U"Number of sigmas", U"1.0")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_setParameterValuesToZero (me, GET_INTEGER (L"left Formant range"),  GET_INTEGER (L"right Formant range"),
-			 GET_REAL (L"Number of sigmas"));
+		FormantModeler_setParameterValuesToZero (me, GET_INTEGER (U"left Formant range"),  GET_INTEGER (U"right Formant range"),
+			 GET_REAL (U"Number of sigmas"));
 	}
 END
 
-FORM (FormantModeler_setDataPointValue, L"FormantModeler: Set data point value", 0)
-	NATURAL (L"Formant index", L"1")
-	NATURAL (L"Data index", L"1")
-	REAL (L"Value", L"1.0")
+FORM (FormantModeler_setDataPointValue, U"FormantModeler: Set data point value", 0)
+	NATURAL (U"Formant index", U"1")
+	NATURAL (U"Data index", U"1")
+	REAL (U"Value", U"1.0")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_setDataPointValue (me, GET_INTEGER (L"Formant index"),  GET_INTEGER (L"Data index"),
-			 GET_REAL (L"Value"));
+		FormantModeler_setDataPointValue (me, GET_INTEGER (U"Formant index"),  GET_INTEGER (U"Data index"),
+			 GET_REAL (U"Value"));
 	}
 END
 
-FORM (FormantModeler_setDataPointSigma, L"FormantModeler: Set data point sigma", 0)
-	NATURAL (L"Formant index", L"1")
-	NATURAL (L"Data index", L"1")
-	REAL (L"Sigma", L"10.0")
+FORM (FormantModeler_setDataPointSigma, U"FormantModeler: Set data point sigma", 0)
+	NATURAL (U"Formant index", U"1")
+	NATURAL (U"Data index", U"1")
+	REAL (U"Sigma", U"10.0")
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_setDataPointSigma (me, GET_INTEGER (L"Formant index"),  GET_INTEGER (L"Data index"),
-			 GET_REAL (L"Sigma"));
+		FormantModeler_setDataPointSigma (me, GET_INTEGER (U"Formant index"),  GET_INTEGER (U"Data index"),
+			 GET_REAL (U"Sigma"));
 	}
 END
 
-FORM (FormantModeler_setDataPointStatus, L"FormantModeler: Set data point status", 0)
-	NATURAL (L"Formant index", L"1")
-	NATURAL (L"Data index", L"1")
-	OPTIONMENU (L"Status", 1)
-		OPTION (L"Valid")
-		OPTION (L"Invalid")
+FORM (FormantModeler_setDataPointStatus, U"FormantModeler: Set data point status", 0)
+	NATURAL (U"Formant index", U"1")
+	NATURAL (U"Data index", U"1")
+	OPTIONMENU (U"Status", 1)
+		OPTION (U"Valid")
+		OPTION (U"Invalid")
 	OK
 DO
-	int menustatus = GET_INTEGER (L"Status");
+	int menustatus = GET_INTEGER (U"Status");
 	int status = menustatus == 2 ? DataModeler_DATA_INVALID : DataModeler_DATA_VALID;
 	LOOP {
 		iam (FormantModeler);
-		FormantModeler_setDataPointStatus (me, GET_INTEGER (L"Formant index"),  GET_INTEGER (L"Data index"), status);
+		FormantModeler_setDataPointStatus (me, GET_INTEGER (U"Formant index"),  GET_INTEGER (U"Data index"), status);
 	}
 END
 
@@ -1033,340 +1090,433 @@ DIRECT (FormantModeler_fitModel)
 	}
 END
 
-FORM (FormantModeler_to_Covariance_parameters, L"", 0)
-	NATURAL (L"Formant number", L"1")
+FORM (FormantModeler_to_Covariance_parameters, U"", 0)
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number");
+	long iformant = GET_INTEGER (U"Formant number");
 	LOOP {
 		iam (FormantModeler);
 		autoCovariance thee = FormantModeler_to_Covariance_parameters (me, iformant);
-		praat_new (thee.transfer(), my name, L"_", Melder_integer (iformant));
+		praat_new (thee.transfer(), my name, U"_", iformant);
 	}
 END
 
-FORM (FormantModeler_extractDataModeler, L"FormantModeler: Extract DataModeler", 0)
-	NATURAL (L"Formant number", L"1")
+FORM (FormantModeler_extractDataModeler, U"FormantModeler: Extract DataModeler", 0)
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
-	long iformant = GET_INTEGER (L"Formant number");
+	long iformant = GET_INTEGER (U"Formant number");
 	LOOP {
 		iam (FormantModeler);
 		autoDataModeler thee = FormantModeler_extractDataModeler (me, iformant);
-		praat_new (thee.transfer(), my name, L"_", Melder_integer (iformant));
+		praat_new (thee.transfer(), my name, U"_", iformant);
 	}
 END
 
-FORM (FormantModeler_to_Table_zscores, L"", 0)
-	BOOLEAN (L"Bandwidths as standard deviation", 1)
+FORM (FormantModeler_to_Table_zscores, U"", 0)
+	BOOLEAN (U"Bandwidths as standard deviation", 1)
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		autoTable thee = FormantModeler_to_Table_zscores (me, GET_INTEGER (L"Bandwidths as standard deviation"));
-		praat_new (thee.transfer(), my name, L"_z");
+		autoTable thee = FormantModeler_to_Table_zscores (me, GET_INTEGER (U"Bandwidths as standard deviation"));
+		praat_new (thee.transfer(), my name, U"_z");
 	}
 END
 
-FORM (FormantModeler_processOutliers, L"", 0)
-	POSITIVE (L"Number of sigmas", L"3.0")
-	BOOLEAN (L"Bandwidths as standard deviation", 1)
+FORM (FormantModeler_processOutliers, U"", 0)
+	POSITIVE (U"Number of sigmas", U"3.0")
+	BOOLEAN (U"Bandwidths as standard deviation", 1)
 	OK
 DO
 	LOOP {
 		iam (FormantModeler);
-		autoFormantModeler thee = FormantModeler_processOutliers (me, GET_REAL (L"Number of sigmas"), GET_INTEGER (L"Bandwidths as standard deviation"));
-		praat_new (thee.transfer(), my name, L"_outliers");
+		autoFormantModeler thee = FormantModeler_processOutliers (me, GET_REAL (U"Number of sigmas"), GET_INTEGER (U"Bandwidths as standard deviation"));
+		praat_new (thee.transfer(), my name, U"_outliers");
 	}
 END
 
+
+DIRECT (OptimalCeilingTier_edit)
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit an OptimalCeilingTier from batch.");
+	Sound sound = nullptr;
+	LOOP {
+		if (CLASS == classSound) {
+			sound = (Sound) OBJECT;   // may stay nullptr
+		}
+	}
+	LOOP if (CLASS == classOptimalCeilingTier) {
+		iam (OptimalCeilingTier);
+		autoOptimalCeilingTierEditor editor = OptimalCeilingTierEditor_create (ID_AND_FULL_NAME, me, sound, true);
+		praat_installEditor (editor.transfer(), IOBJECT);
+	}
+END
+
+
 /*************************** PitchModeler *************************************/
 
-FORM (Pitch_to_PitchModeler, L"Pitch: To PitchModeler", 0)
-	REAL (L"left Start time (s)", L"0.0")
-	REAL (L"right End time (s)", L"0.1")
-	INTEGER (L"Order of polynomials", L"2")
+FORM (Pitch_to_PitchModeler, U"Pitch: To PitchModeler", 0)
+	REAL (U"left Start time (s)", U"0.0")
+	REAL (U"right End time (s)", U"0.1")
+	INTEGER (U"Order of polynomials", U"2")
 	OK
 DO
 	LOOP {
 		iam (Pitch);
-		autoPitchModeler thee = Pitch_to_PitchModeler (me, GET_REAL (L"left Start time"), GET_REAL (L"right End time"), 
-			GET_INTEGER (L"Order of polynomials") + 1);
+		autoPitchModeler thee = Pitch_to_PitchModeler (me, GET_REAL (U"left Start time"), GET_REAL (U"right End time"), 
+			GET_INTEGER (U"Order of polynomials") + 1);
 		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (PitchModeler_draw, L"PitchModeler: Draw", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range (Hz)", L"0.0")
-	REAL (L"right Frequency range (Hz)", L"500.0")
-	INTEGER (L"Order of polynomial for estimation", L"2")
-	BOOLEAN (L"Garnish", 1)
+FORM (PitchModeler_draw, U"PitchModeler: Draw", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range (Hz)", U"0.0")
+	REAL (U"right Frequency range (Hz)", U"500.0")
+	INTEGER (U"Order of polynomial for estimation", U"2")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (PitchModeler);
-		PitchModeler_draw (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), 
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"), GET_INTEGER (L"Order of polynomial for estimation") + 1,  GET_INTEGER (L"Garnish"));
+		PitchModeler_draw (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), 
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"), GET_INTEGER (U"Order of polynomial for estimation") + 1,  GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Sound_to_Formant_interval, L"Sound: To Formant (interval)", 0)
-	REAL (L"left Time range (s)", L"0.1")
-	REAL (L"right Time range (s)", L"0.15")
-	POSITIVE (L"Window length (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.0025")
-	POSITIVE (L"left Maximum frequency range (Hz)", L"4500.0")
-	POSITIVE (L"right Maximum frequency range (Hz)", L"6500.0")
-	NATURAL (L"Number of frequency steps", L"11")
-	POSITIVE (L"Pre-emphasis from (Hz)", L"50.0")
-	NATURAL (L"Number of formant tracks in model", L"4")
-	INTEGER (L"Order of polynomials", L"3")
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Bandwidth")
-		OPTION (L"Bandwidth / frequency")
-		OPTION (L"Sqrt bandwidth")
-	LABEL (L"", L"Make parameters that include zero in their confidence region zero")
-	REAL (L"Number of sigmas", L"1.0")
-	POSITIVE (L"Parameter variance power", L"1.5")
+FORM (Sound_getOptimalFormantCeiling, U"Sound: Get optimal formant ceiling", 0)
+	REAL (U"left Time range (s)", U"0.1")
+	REAL (U"right Time range (s)", U"0.15")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.0025")
+	POSITIVE (U"left Maximum frequency range (Hz)", U"4500.0")
+	POSITIVE (U"right Maximum frequency range (Hz)", U"6500.0")
+	NATURAL (U"Number of frequency steps", U"11")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50.0")
+	NATURAL (U"Number of formant tracks in model", U"4")
+	INTEGER (U"Order of polynomials", U"3")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
+	LABEL (U"", U"Make parameters that include zero in their confidence region zero")
+	REAL (U"Number of sigmas", U"1.0")
+	REAL (U"Parameter variance power", U"1.5")
+	OK
+DO
+	LOOP {
+		iam (Sound);
+		double ceiling = Sound_getOptimalFormantCeiling (me, 
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"Window length"), GET_REAL (U"Time step"), GET_REAL (U"left Maximum frequency range"), 
+			GET_REAL (U"right Maximum frequency range"), GET_INTEGER (U"Number of frequency steps"), 
+			GET_REAL (U"Pre-emphasis from"), 
+			GET_INTEGER (U"Number of formant tracks in model"), GET_INTEGER (U"Order of polynomials") + 1,
+			GET_INTEGER (U"Weigh data") - 1, GET_REAL (U"Number of sigmas"), GET_REAL (U"Parameter variance power"));
+	Melder_informationReal (ceiling, U" Hz");
+	}
+END
+
+FORM (Sound_to_Formant_interval, U"Sound: To Formant (interval)", 0)
+	REAL (U"left Time range (s)", U"0.1")
+	REAL (U"right Time range (s)", U"0.15")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.0025")
+	POSITIVE (U"left Maximum frequency range (Hz)", U"4500.0")
+	POSITIVE (U"right Maximum frequency range (Hz)", U"6500.0")
+	NATURAL (U"Number of frequency steps", U"11")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50.0")
+	NATURAL (U"Number of formant tracks in model", U"4")
+	INTEGER (U"Order of polynomials", U"3")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
+	LABEL (U"", U"Make parameters that include zero in their confidence region zero")
+	REAL (U"Number of sigmas", U"1.0")
+	REAL (U"Parameter variance power", U"1.5")
 	OK
 DO
 	LOOP {
 		iam (Sound);
 		double ceiling;
-		autoFormant formant = Sound_to_Formant_interval (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"Window length"), GET_REAL (L"Time step"), GET_REAL (L"left Maximum frequency range"), 
-			GET_REAL (L"right Maximum frequency range"), GET_INTEGER (L"Number of frequency steps"), 
-			GET_REAL (L"Pre-emphasis from"), 
-			GET_INTEGER (L"Number of formant tracks in model"), GET_INTEGER (L"Order of polynomials") + 1,
-			GET_INTEGER (L"Weigh data") - 1, GET_REAL (L"Number of sigmas"), GET_REAL (L"Parameter variance power"),
+		autoFormant formant = Sound_to_Formant_interval (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"Window length"), GET_REAL (U"Time step"), GET_REAL (U"left Maximum frequency range"), 
+			GET_REAL (U"right Maximum frequency range"), GET_INTEGER (U"Number of frequency steps"), 
+			GET_REAL (U"Pre-emphasis from"), 
+			GET_INTEGER (U"Number of formant tracks in model"), GET_INTEGER (U"Order of polynomials") + 1,
+			GET_INTEGER (U"Weigh data") - 1, GET_REAL (U"Number of sigmas"), GET_REAL (U"Parameter variance power"),
 			0, 1, 1, 1, 1, 1, &ceiling);
-		praat_new (formant.transfer(), my name, L"_", Melder_fixed (ceiling, 0));
-	}
-END
-
-FORM (Sound_to_Formant_interval_constrained, L"Sound: To Formant (interval, constrained)", 0)
-	REAL (L"left Time range (s)", L"0.1")
-	REAL (L"right Time range (s)", L"0.15")
-	POSITIVE (L"Window length (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.0025")
-	POSITIVE (L"left Maximum frequency range (Hz)", L"4500.0")
-	POSITIVE (L"right Maximum frequency range (Hz)", L"6500.0")
-	NATURAL (L"Number of frequency steps", L"11")
-	POSITIVE (L"Pre-emphasis from (Hz)", L"50.0")
-	NATURAL (L"Number of formant tracks in model", L"4")
-	INTEGER (L"Order of polynomials", L"3")
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Bandwidth")
-		OPTION (L"Bandwidth / frequency")
-		OPTION (L"Sqrt bandwidth")
-	LABEL (L"", L"Make parameters that include zero in their confidence region zero")
-	REAL (L"Number of sigmas", L"1.0")
-	POSITIVE (L"Parameter variance power", L"1.5")
-	LABEL (L"", L"Formant frequency constraints")
-	REAL (L"Minimum F1 (Hz)", L"100.0")
-	REAL (L"Maximum F1 (Hz)", L"1200.0")
-	REAL (L"Minimum F2 (Hz)", L"0.0")
-	POSITIVE (L"Maximum F2 (Hz)", L"5000.0")
-	POSITIVE (L"Minimum F3 (Hz)", L"1000.0")
+		praat_new (formant.transfer(), my name, U"_", Melder_fixed (ceiling, 0));
+	}
+END
+
+FORM (Sound_to_Formant_interval_constrained, U"Sound: To Formant (interval, constrained)", 0)
+	REAL (U"left Time range (s)", U"0.1")
+	REAL (U"right Time range (s)", U"0.15")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.0025")
+	POSITIVE (U"left Maximum frequency range (Hz)", U"4500.0")
+	POSITIVE (U"right Maximum frequency range (Hz)", U"6500.0")
+	NATURAL (U"Number of frequency steps", U"11")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50.0")
+	NATURAL (U"Number of formant tracks in model", U"4")
+	INTEGER (U"Order of polynomials", U"3")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
+	LABEL (U"", U"Make parameters that include zero in their confidence region zero")
+	REAL (U"Number of sigmas", U"1.0")
+	REAL (U"Parameter variance power", U"1.5")
+	LABEL (U"", U"Formant frequency constraints")
+	REAL (U"Minimum F1 (Hz)", U"100.0")
+	REAL (U"Maximum F1 (Hz)", U"1200.0")
+	REAL (U"Minimum F2 (Hz)", U"0.0")
+	POSITIVE (U"Maximum F2 (Hz)", U"5000.0")
+	POSITIVE (U"Minimum F3 (Hz)", U"1000.0")
 	OK
 DO
 	LOOP {
 		iam (Sound);
 		double ceiling;
-		autoFormant formant = Sound_to_Formant_interval (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"Window length"), GET_REAL (L"Time step"), GET_REAL (L"left Maximum frequency range"), 
-			GET_REAL (L"right Maximum frequency range"), GET_INTEGER (L"Number of frequency steps"),
-			GET_REAL (L"Pre-emphasis from"), GET_INTEGER (L"Number of formant tracks in model"), 
-			GET_INTEGER (L"Order of polynomials") + 1, GET_INTEGER (L"Weigh data") - 1, GET_REAL (L"Number of sigmas"),
-			GET_REAL (L"Parameter variance power"), 1,
-			GET_REAL (L"Minimum F1"), GET_REAL (L"Maximum F1"), GET_REAL (L"Minimum F2"), 
-			GET_REAL (L"Maximum F2"), GET_REAL (L"Minimum F3"), &ceiling);
-		praat_new (formant.transfer(), my name, L"_", Melder_fixed (ceiling, 0));
-	}
-END
-
-FORM (Sound_to_Formant_interval_constrained_robust, L"Sound: To Formant (interval, constrained, robust)", 0)
-	REAL (L"left Time range (s)", L"0.1")
-	REAL (L"right Time range (s)", L"0.15")
-	POSITIVE (L"Window length (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.0025")
-	POSITIVE (L"left Maximum frequency range (Hz)", L"4500.0")
-	POSITIVE (L"right Maximum frequency range (Hz)", L"6500.0")
-	NATURAL (L"Number of frequency steps", L"11")
-	POSITIVE (L"Pre-emphasis from (Hz)", L"50.0")
-	NATURAL (L"Number of formant tracks in model", L"4")
-	INTEGER (L"Order of polynomials", L"3")
-	OPTIONMENU (L"Weigh data", 2)
-		OPTION (L"Equally")
-		OPTION (L"Bandwidth")
-		OPTION (L"Bandwidth / frequency")
-		OPTION (L"Sqrt bandwidth")
-	LABEL (L"", L"Make parameters that include zero in their confidence region zero")
-	REAL (L"Number of sigmas", L"1.0")
-	POSITIVE (L"Parameter variance power", L"1.5")
-	LABEL (L"", L"Formant frequency constraints")
-	REAL (L"Minimum F1 (Hz)", L"100.0")
-	REAL (L"Maximum F1 (Hz)", L"1200.0")
-	REAL (L"Minimum F2 (Hz)", L"0.0")
-	POSITIVE (L"Maximum F2 (Hz)", L"5000.0")
-	POSITIVE (L"Minimum F3 (Hz)", L"1000.0")
+		autoFormant formant = Sound_to_Formant_interval (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"Window length"), GET_REAL (U"Time step"), GET_REAL (U"left Maximum frequency range"), 
+			GET_REAL (U"right Maximum frequency range"), GET_INTEGER (U"Number of frequency steps"),
+			GET_REAL (U"Pre-emphasis from"), GET_INTEGER (U"Number of formant tracks in model"), 
+			GET_INTEGER (U"Order of polynomials") + 1, GET_INTEGER (U"Weigh data") - 1, GET_REAL (U"Number of sigmas"),
+			GET_REAL (U"Parameter variance power"), 1,
+			GET_REAL (U"Minimum F1"), GET_REAL (U"Maximum F1"), GET_REAL (U"Minimum F2"), 
+			GET_REAL (U"Maximum F2"), GET_REAL (U"Minimum F3"), &ceiling);
+		praat_new (formant.transfer(), my name, U"_", Melder_fixed (ceiling, 0));
+	}
+END
+
+FORM (Sound_to_Formant_interval_constrained_robust, U"Sound: To Formant (interval, constrained, robust)", 0)
+	REAL (U"left Time range (s)", U"0.1")
+	REAL (U"right Time range (s)", U"0.15")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.0025")
+	POSITIVE (U"left Maximum frequency range (Hz)", U"4500.0")
+	POSITIVE (U"right Maximum frequency range (Hz)", U"6500.0")
+	NATURAL (U"Number of frequency steps", U"11")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50.0")
+	NATURAL (U"Number of formant tracks in model", U"4")
+	INTEGER (U"Order of polynomials", U"3")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
+	LABEL (U"", U"Make parameters that include zero in their confidence region zero")
+	REAL (U"Number of sigmas", U"1.0")
+	REAL (U"Parameter variance power", U"1.5")
+	LABEL (U"", U"Formant frequency constraints")
+	REAL (U"Minimum F1 (Hz)", U"100.0")
+	REAL (U"Maximum F1 (Hz)", U"1200.0")
+	REAL (U"Minimum F2 (Hz)", U"0.0")
+	POSITIVE (U"Maximum F2 (Hz)", U"5000.0")
+	POSITIVE (U"Minimum F3 (Hz)", U"1000.0")
 	OK
 DO
 	LOOP {
 		iam (Sound);
 		double ceiling;
-		autoFormant formant = Sound_to_Formant_interval_robust (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"Window length"), GET_REAL (L"Time step"), GET_REAL (L"left Maximum frequency range"), 
-			GET_REAL (L"right Maximum frequency range"), GET_INTEGER (L"Number of frequency steps"),
-			GET_REAL (L"Pre-emphasis from"), GET_INTEGER (L"Number of formant tracks in model"), 
-			GET_INTEGER (L"Order of polynomials") + 1, GET_INTEGER (L"Weigh data") - 1, GET_REAL (L"Number of sigmas"),
-			GET_REAL (L"Parameter variance power"), 1,
-			GET_REAL (L"Minimum F1"), GET_REAL (L"Maximum F1"), GET_REAL (L"Minimum F2"), 
-			GET_REAL (L"Maximum F2"), GET_REAL (L"Minimum F3"), &ceiling);
-		praat_new (formant.transfer(), my name, L"_", Melder_fixed (ceiling, 0));
+		autoFormant formant = Sound_to_Formant_interval_robust (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"Window length"), GET_REAL (U"Time step"), GET_REAL (U"left Maximum frequency range"), 
+			GET_REAL (U"right Maximum frequency range"), GET_INTEGER (U"Number of frequency steps"),
+			GET_REAL (U"Pre-emphasis from"), GET_INTEGER (U"Number of formant tracks in model"), 
+			GET_INTEGER (U"Order of polynomials") + 1, GET_INTEGER (U"Weigh data") - 1, GET_REAL (U"Number of sigmas"),
+			GET_REAL (U"Parameter variance power"), 1,
+			GET_REAL (U"Minimum F1"), GET_REAL (U"Maximum F1"), GET_REAL (U"Minimum F2"), 
+			GET_REAL (U"Maximum F2"), GET_REAL (U"Minimum F3"), &ceiling);
+		praat_new (formant.transfer(), my name, U"_", Melder_fixed (ceiling, 0));
+	}
+END
+
+FORM (Sound_to_OptimalCeilingTier, U"", 0)
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.0025")
+	POSITIVE (U"left Maximum frequency range (Hz)", U"4500.0")
+	POSITIVE (U"right Maximum frequency range (Hz)", U"6500.0")
+	NATURAL (U"Number of frequency steps", U"11")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50.0")
+	REAL (U"Formant smoothing window (s)", U"0.05")
+	NATURAL (U"Number of formant tracks in model", U"4")
+	INTEGER (U"Order of polynomials", U"2")
+	OPTIONMENU (U"Weigh data", 2)
+		OPTION (U"Equally")
+		OPTION (U"Bandwidth")
+		OPTION (U"Bandwidth / frequency")
+		OPTION (U"Sqrt bandwidth")
+	LABEL (U"", U"Make parameters that include zero in their confidence region zero")
+	REAL (U"Number of sigmas", U"1.0")
+	REAL (U"Parameter variance power", U"1.5")
+	OK
+DO
+	LOOP {
+		iam (Sound);
+		autoOptimalCeilingTier octier = Sound_to_OptimalCeilingTier (me, GET_REAL (U"Window length"), GET_REAL (U"Time step"), 
+			GET_REAL (U"left Maximum frequency range"), GET_REAL (U"right Maximum frequency range"), GET_INTEGER (U"Number of frequency steps"),
+			GET_REAL (U"Pre-emphasis from"), GET_REAL (U"Formant smoothing window"), GET_INTEGER (U"Number of formant tracks in model"),
+			GET_INTEGER (U"Order of polynomials") + 1, GET_INTEGER (U"Weigh data") - 1, GET_REAL (U"Number of sigmas"), GET_REAL (U"Parameter variance power"));
+		praat_new (octier.transfer(), my name);
 	}
 END
 
-FORM (Table_to_DataModeler, L"", 0)
-	REAL (L"left X range", L"0.0")
-	REAL (L"right X range", L"0.0 (=auto)")
-	WORD (L"Column with X data", L"")
-	WORD (L"Column with Y data", L"")
-	WORD (L"Column with sigmas", L"")
-	OPTIONMENU (L"Model functions", 1)
-	OPTION (L"Legendre polynomials")
-	INTEGER (L"Maximum order", L"3")
+FORM (Table_to_DataModeler, U"", 0)
+	REAL (U"left X range", U"0.0")
+	REAL (U"right X range", U"0.0 (=auto)")
+	WORD (U"Column with X data", U"")
+	WORD (U"Column with Y data", U"")
+	WORD (U"Column with sigmas", U"")
+	OPTIONMENU (U"Model functions", 1)
+	OPTION (U"Legendre polynomials")
+	INTEGER (U"Maximum order", U"3")
 	OK
 DO
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column with X data"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column with Y data"));
-		long scolumn = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Column with sigmas"));
-		autoDataModeler thee = Table_to_DataModeler (me, GET_REAL (L"left X range"), GET_REAL (L"right X range"),
-			xcolumn, ycolumn, scolumn, GET_INTEGER (L"Maximum order") + 1, GET_INTEGER (L"Model functions"));
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column with X data"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column with Y data"));
+		long scolumn = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Column with sigmas"));
+		autoDataModeler thee = Table_to_DataModeler (me, GET_REAL (U"left X range"), GET_REAL (U"right X range"),
+			xcolumn, ycolumn, scolumn, GET_INTEGER (U"Maximum order") + 1, GET_INTEGER (U"Model functions"));
 		praat_new (thee.transfer(), my name);
 	}
 END
 
-void praat_DataModeler_init (void);
-void praat_DataModeler_init (void) {
-	Thing_recognizeClassesByName (classDataModeler, classFormantModeler, classPitchModeler, NULL);
-	
-	praat_addAction1 (classDataModeler, 0, L"Speckle...", 0, 0, DO_DataModeler_speckle);
-	praat_addAction1 (classDataModeler, 0, L"Draw estimated track...", 0, 0, DO_DataModeler_drawEstimatedTrack);
-
-	praat_addAction1 (classDataModeler, 1, L"Query -", 0, 0, 0);
-		praat_addAction1 (classDataModeler, 0, L"Get number of parameters", 0, 1, DO_DataModeler_getNumberOfParameters);
-		praat_addAction1 (classDataModeler, 0, L"Get number of fixed parameters", 0, 1, DO_DataModeler_getNumberOfFixedParameters);
-		praat_addAction1 (classDataModeler, 0, L"Get parameter value...", 0, 1, DO_DataModeler_getParameterValue);
-		praat_addAction1 (classDataModeler, 0, L"Get parameter status...", 0, 1, DO_DataModeler_getParameterStatus);
-		praat_addAction1 (classDataModeler, 0, L"Get parameter standard deviation...", 0, 1, DO_DataModeler_getParameterStandardDeviation);
-		praat_addAction1 (classDataModeler, 0, L"Get variance of parameters...", 0, 1, DO_DataModeler_getVarianceOfParameters);
-		praat_addAction1 (classDataModeler, 1, L"-- get data points info --", 0, 1, 0);
-		praat_addAction1 (classDataModeler, 0, L"Get model value at x...", 0, 1, DO_DataModeler_getModelValueAtX);
-		praat_addAction1 (classDataModeler, 0, L"Get number of data points...", 0, 1, DO_DataModeler_getNumberOfDataPoints);
-		praat_addAction1 (classDataModeler, 0, L"Get number of invalid data points...", 0, 1, DO_DataModeler_getNumberOfInvalidDataPoints);
-		praat_addAction1 (classDataModeler, 0, L"Get data point value...", 0, 1, DO_DataModeler_getDataPointValue);
-		praat_addAction1 (classDataModeler, 0, L"Get data point sigma...", 0, 1, DO_DataModeler_getDataPointSigma);
-		praat_addAction1 (classDataModeler, 0, L"Get data point status...", 0, 1, DO_DataModeler_getDataPointStatus);
-		praat_addAction1 (classDataModeler, 1, L"-- get statistics info --", 0, 1, 0);
+void praat_DataModeler_init ();
+void praat_DataModeler_init () {
+	Thing_recognizeClassesByName (classDataModeler, classFormantModeler, classOptimalCeilingTier, classOptimalCeilingTierEditor, classPitchModeler, nullptr);
+
+	praat_addMenuCommand (U"Objects", U"New", U"Create simple DataModeler...", U"Create ISpline...", praat_HIDDEN + praat_DEPTH_1, DO_DataModeler_createSimple);
+
+	praat_addAction1 (classDataModeler, 0, U"Speckle...", 0, 0, DO_DataModeler_speckle);
+	praat_addAction1 (classDataModeler, 0, U"Draw estimated track...", 0, 0, DO_DataModeler_drawEstimatedTrack);
+
+	praat_addAction1 (classDataModeler, 1, U"Query -", 0, 0, 0);
+		praat_addAction1 (classDataModeler, 0, U"Get number of parameters", 0, 1, DO_DataModeler_getNumberOfParameters);
+		praat_addAction1 (classDataModeler, 0, U"Get number of fixed parameters", 0, 1, DO_DataModeler_getNumberOfFixedParameters);
+		praat_addAction1 (classDataModeler, 0, U"Get parameter value...", 0, 1, DO_DataModeler_getParameterValue);
+		praat_addAction1 (classDataModeler, 0, U"Get parameter status...", 0, 1, DO_DataModeler_getParameterStatus);
+		praat_addAction1 (classDataModeler, 0, U"Get parameter standard deviation...", 0, 1, DO_DataModeler_getParameterStandardDeviation);
+		praat_addAction1 (classDataModeler, 0, U"Get variance of parameters...", 0, 1, DO_DataModeler_getVarianceOfParameters);
+		praat_addAction1 (classDataModeler, 1, U"-- get data points info --", 0, 1, 0);
+		praat_addAction1 (classDataModeler, 0, U"Get model value at x...", 0, 1, DO_DataModeler_getModelValueAtX);
+		praat_addAction1 (classDataModeler, 0, U"Get number of data points", 0, 1, DO_DataModeler_getNumberOfDataPoints);
+		praat_addAction1 (classDataModeler, 0, U"Get number of invalid data points", 0, 1, DO_DataModeler_getNumberOfInvalidDataPoints);
+		praat_addAction1 (classDataModeler, 0, U"Get data point value...", 0, 1, DO_DataModeler_getDataPointValue);
+		praat_addAction1 (classDataModeler, 0, U"Get data point sigma...", 0, 1, DO_DataModeler_getDataPointSigma);
+		praat_addAction1 (classDataModeler, 0, U"Get data point status...", 0, 1, DO_DataModeler_getDataPointStatus);
+		praat_addAction1 (classDataModeler, 1, U"-- get statistics info --", 0, 1, 0);
 		
-		praat_addAction1 (classDataModeler, 0, L"Get residual sum of squares", 0, 1, DO_DataModeler_getResidualSumOfSquares);
-		praat_addAction1 (classDataModeler, 0, L"Get data standard deviation...", 0, 1, DO_DataModeler_getStandardDeviation);
-		praat_addAction1 (classDataModeler, 0, L"Get coefficient of determination", 0, 1, DO_DataModeler_getCoefficientOfDetermination);
-		praat_addAction1 (classDataModeler, 0, L"Report chi squared...", 0, 1, DO_DataModeler_reportChiSquared);
-		praat_addAction1 (classDataModeler, 0, L"Get degrees of freedom...", 0, 1, DO_DataModeler_getDegreesOfFreedom);
-
-	praat_addAction1 (classDataModeler, 1, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classDataModeler, 0, L"Set data weighing...", 0, 1, DO_DataModeler_setDataWeighing);
-		praat_addAction1 (classDataModeler, 0, L"Set tolerance...", 0, 1, DO_DataModeler_setTolerance);
-		praat_addAction1 (classDataModeler, 1, L"-- set parameter values --", 0, 1, 0);
-		praat_addAction1 (classDataModeler, 0, L"Set parameter value fixed...", 0, 1, DO_DataModeler_setParameterValueFixed);
-		praat_addAction1 (classDataModeler, 0, L"Set parameter free...", 0, 1, DO_DataModeler_setParameterFree);
-		praat_addAction1 (classDataModeler, 0, L"Set parameter values to zero...", 0, 1, DO_DataModeler_setParameterValuesToZero);
-		praat_addAction1 (classDataModeler, 1, L"-- set data values --", 0, 1, 0);
-		praat_addAction1 (classDataModeler, 0, L"Set data point status...", 0, 1, DO_DataModeler_setDataPointStatus);
-		praat_addAction1 (classDataModeler, 0, L"Set data point value...", 0, 1, DO_DataModeler_setDataPointValue);
-		praat_addAction1 (classDataModeler, 0, L"Set data point sigma...", 0, 1, DO_DataModeler_setDataPointSigma);
+		praat_addAction1 (classDataModeler, 0, U"Get residual sum of squares", 0, 1, DO_DataModeler_getResidualSumOfSquares);
+		praat_addAction1 (classDataModeler, 0, U"Get data standard deviation", 0, 1, DO_DataModeler_getStandardDeviation);
+		praat_addAction1 (classDataModeler, 0, U"Get coefficient of determination", 0, 1, DO_DataModeler_getCoefficientOfDetermination);
+		praat_addAction1 (classDataModeler, 0, U"Report chi squared...", 0, 1, DO_DataModeler_reportChiSquared);
+		praat_addAction1 (classDataModeler, 0, U"Get degrees of freedom", 0, 1, DO_DataModeler_getDegreesOfFreedom);
+
+	praat_addAction1 (classDataModeler, 1, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classDataModeler, 0, U"Set data weighing...", 0, 1, DO_DataModeler_setDataWeighing);
+		praat_addAction1 (classDataModeler, 0, U"Set tolerance...", 0, 1, DO_DataModeler_setTolerance);
+		praat_addAction1 (classDataModeler, 1, U"-- set parameter values --", 0, 1, 0);
+		praat_addAction1 (classDataModeler, 0, U"Set parameter value...", 0, 1, DO_DataModeler_setParameterValue);
+		praat_addAction1 (classDataModeler, 0, U"Set parameter free...", 0, 1, DO_DataModeler_setParameterFree);
+		praat_addAction1 (classDataModeler, 0, U"Set parameter values to zero...", 0, 1, DO_DataModeler_setParameterValuesToZero);
+		praat_addAction1 (classDataModeler, 1, U"-- set data values --", 0, 1, 0);
+		praat_addAction1 (classDataModeler, 0, U"Set data point status...", 0, 1, DO_DataModeler_setDataPointStatus);
+		praat_addAction1 (classDataModeler, 0, U"Set data point value...", 0, 1, DO_DataModeler_setDataPointValue);
+		praat_addAction1 (classDataModeler, 0, U"Set data point sigma...", 0, 1, DO_DataModeler_setDataPointSigma);
 		
-	praat_addAction1 (classDataModeler, 0, L"Fit model", 0, 0, DO_DataModeler_fitModel);
+	praat_addAction1 (classDataModeler, 0, U"Fit model", 0, 0, DO_DataModeler_fitModel);
 	
-	praat_addAction1 (classDataModeler, 0, L"To Covariance (parameters)...", 0, 0, DO_DataModeler_to_Covariance_parameters);
-	praat_addAction1 (classDataModeler, 0, L"To Table (z-scores)...", 0, 0, DO_DataModeler_to_Table_zscores);
-
-	praat_addAction1 (classFormant, 0, L"To FormantModeler...", L"To LPC...", 0, DO_Formant_to_FormantModeler);
-	praat_addAction1 (classFormant, 0, L"Extract smoothest part...", 0, 0, DO_Formants_extractSmoothestPart);
-	praat_addAction1 (classFormant, 0, L"Extract smoothest part (constrained)...", 0, 0, DO_Formants_extractSmoothestPart_constrained);
-
-	praat_addAction1 (classFormantModeler, 0, L"Speckle...", 0, 0, DO_FormantModeler_speckle);
-	praat_addAction1 (classFormantModeler, 0, L"Draw tracks...", 0, 0, DO_FormantModeler_drawTracks);
-	praat_addAction1 (classFormantModeler, 0, L"Draw estimated tracks...", 0, 0, DO_FormantModeler_drawEstimatedTracks);
-	praat_addAction1 (classFormantModeler, 0, L"Draw outliers marked...", 0, 0, DO_FormantModeler_drawOutliersMarked);
-	praat_addAction1 (classFormantModeler, 0, L"Normal probability plot...", 0, 0, DO_FormantModeler_normalProbabilityPlot);
-	praat_addAction1 (classFormantModeler, 0, L"Draw basis function...", 0, 0, DO_FormantModeler_drawBasisFunction);
+	praat_addAction1 (classDataModeler, 0, U"To Covariance (parameters)...", 0, 0, DO_DataModeler_to_Covariance_parameters);
+	praat_addAction1 (classDataModeler, 0, U"To Table (z-scores)...", 0, 0, DO_DataModeler_to_Table_zscores);
+
+	praat_addAction1 (classFormant, 0, U"To FormantModeler...", U"To LPC...", praat_HIDDEN, DO_Formant_to_FormantModeler);
+	praat_addAction1 (classFormant, 0, U"Extract smoothest part...", 0, praat_HIDDEN, DO_Formants_extractSmoothestPart);
+	praat_addAction1 (classFormant, 0, U"Extract smoothest part (constrained)...", 0, praat_HIDDEN, DO_Formants_extractSmoothestPart_constrained);
+
+	praat_addAction1 (classFormantModeler, 0, U"Draw -", 0, 0, 0);
+	praat_addAction1 (classFormantModeler, 0, U"Speckle...", 0, 1, DO_FormantModeler_speckle);
+	praat_addAction1 (classFormantModeler, 0, U"Draw tracks...", 0, 1, DO_FormantModeler_drawTracks);
+	praat_addAction1 (classFormantModeler, 0, U"Draw estimated tracks...", 0, 1, DO_FormantModeler_drawEstimatedTracks);
+	praat_addAction1 (classFormantModeler, 0, U"Draw variances of shifted tracks...", 0, 1, DO_FormantModeler_drawVariancesOfShiftedTracks);
+	praat_addAction1 (classFormantModeler, 0, U"Draw outliers marked...", 0, 1, DO_FormantModeler_drawOutliersMarked);
+	praat_addAction1 (classFormantModeler, 0, U"Draw cumulative chisq scores...", 0, 1, DO_FormantModeler_drawCumulativeChiScores);
+	praat_addAction1 (classFormantModeler, 0, U"Normal probability plot...", 0, 1, DO_FormantModeler_normalProbabilityPlot);
+	praat_addAction1 (classFormantModeler, 0, U"Draw basis function...", 0, 1, DO_FormantModeler_drawBasisFunction);
 	
-	praat_addAction1 (classFormantModeler, 1, L"Query -", 0, 0, 0);
-		praat_addAction1 (classFormantModeler, 0, L"Get number of tracks...", 0, 1, DO_FormantModeler_getNumberOfTracks);
-		praat_addAction1 (classFormantModeler, 1, L"-- get parameter info --", 0, 1, 0);
-		praat_addAction1 (classFormantModeler, 0, L"Get number of parameters...", 0, 1, DO_FormantModeler_getNumberOfParameters);
-		praat_addAction1 (classFormantModeler, 0, L"Get number of fixed parameters...", 0, 1, DO_FormantModeler_getNumberOfFixedParameters);
-		praat_addAction1 (classFormantModeler, 0, L"Get parameter value...", 0, 1, DO_FormantModeler_getParameterValue);
-		praat_addAction1 (classFormantModeler, 0, L"Get parameter status...", 0, 1, DO_FormantModeler_getParameterStatus);
-		praat_addAction1 (classFormantModeler, 0, L"Get parameter standard deviation...", 0, 1, DO_FormantModeler_getParameterStandardDeviation);
-		praat_addAction1 (classFormantModeler, 0, L"Get variance of parameters...", 0, 1, DO_FormantModeler_getVarianceOfParameters);
-		praat_addAction1 (classFormantModeler, 1, L"-- get data points info --", 0, 1, 0);
-		praat_addAction1 (classFormantModeler, 0, L"Get number of data points...", 0, 1, DO_FormantModeler_getNumberOfDataPoints);
-		praat_addAction1 (classFormantModeler, 0, L"Get number of invalid data points...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FormantModeler_getNumberOfInvalidDataPoints);
-		praat_addAction1 (classFormantModeler, 0, L"Get model value at time...", 0, 1, DO_FormantModeler_getModelValueAtTime);
-		praat_addAction1 (classFormantModeler, 0, L"Get data point value...", 0, 1, DO_FormantModeler_getDataPointValue);
-		praat_addAction1 (classFormantModeler, 0, L"Get data point sigma...", 0, 1, DO_FormantModeler_getDataPointSigma);
-		praat_addAction1 (classFormantModeler, 0, L"Get data point status...", 0, 1, DO_FormantModeler_getDataPointStatus);
-
-		praat_addAction1 (classFormantModeler, 1, L"-- get statistics info --", 0, 1, 0);
-		praat_addAction1 (classFormantModeler, 0, L"Get residual sum of squares...", 0, 1, DO_FormantModeler_getResidualSumOfSquares);
-		praat_addAction1 (classFormantModeler, 0, L"Get formant standard deviation...", 0, 1, DO_FormantModeler_getStandardDeviation);
-		praat_addAction1 (classFormantModeler, 0, L"Get coefficient of determination...", 0, 1, DO_FormantModeler_getCoefficientOfDetermination);
-		praat_addAction1 (classFormantModeler, 0, L"Report chi squared...", 0, 1, DO_FormantModeler_reportChiSquared);
-		praat_addAction1 (classFormantModeler, 0, L"Get degrees of freedom...", 0, 1, DO_FormantModeler_getDegreesOfFreedom);
-		praat_addAction1 (classFormantModeler, 0, L"Get smoothness value...", 0, 1, DO_FormantModeler_getSmoothnessValue);
-		praat_addAction1 (classFormantModeler, 0, L"Get average distance between tracks...", 0, 1, DO_FormantModeler_getAverageDistanceBetweenTracks);
-		praat_addAction1 (classFormantModeler, 0, L"Get formants constraints factor...", 0, 1, DO_FormantModeler_getFormantsConstraintsFactor);
-
-	praat_addAction1 (classFormantModeler, 1, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classFormantModeler, 0, L"Set data weighing...", 0, 1, DO_FormantModeler_setDataWeighing);
-		praat_addAction1 (classFormantModeler, 0, L"Set tolerance...", 0, 1, DO_FormantModeler_setTolerance);
-		praat_addAction1 (classFormantModeler, 1, L"-- set parameter values --", 0, 1, 0);
-		praat_addAction1 (classFormantModeler, 0, L"Set parameter value fixed...", 0, 1, DO_FormantModeler_setParameterValueFixed);
-		praat_addAction1 (classFormantModeler, 0, L"Set parameter free...", 0, 1, DO_FormantModeler_setParameterFree);
-		praat_addAction1 (classFormantModeler, 0, L"Set parameter values to zero...", 0, 1, DO_FormantModeler_setParameterValuesToZero);
-		praat_addAction1 (classFormantModeler, 1, L"-- set data points --", 0, 1, 0);
-		praat_addAction1 (classFormantModeler, 0, L"Set data point value...", 0, 1, DO_FormantModeler_setDataPointValue);
-		praat_addAction1 (classFormantModeler, 0, L"Set data point sigma...", 0, 1, DO_FormantModeler_setDataPointSigma);
-		praat_addAction1 (classFormantModeler, 0, L"Set data point status...", 0, 1, DO_FormantModeler_setDataPointStatus);
+	praat_addAction1 (classFormantModeler, 1, U"Query -", 0, 0, 0);
+		praat_addAction1 (classFormantModeler, 0, U"Get number of tracks", 0, 1, DO_FormantModeler_getNumberOfTracks);
+		praat_addAction1 (classFormantModeler, 1, U"-- get parameter info --", 0, 1, 0);
+		praat_addAction1 (classFormantModeler, 0, U"Get number of parameters...", 0, 1, DO_FormantModeler_getNumberOfParameters);
+		praat_addAction1 (classFormantModeler, 0, U"Get number of fixed parameters...", 0, 1, DO_FormantModeler_getNumberOfFixedParameters);
+		praat_addAction1 (classFormantModeler, 0, U"Get parameter value...", 0, 1, DO_FormantModeler_getParameterValue);
+		praat_addAction1 (classFormantModeler, 0, U"Get parameter status...", 0, 1, DO_FormantModeler_getParameterStatus);
+		praat_addAction1 (classFormantModeler, 0, U"Get parameter standard deviation...", 0, 1, DO_FormantModeler_getParameterStandardDeviation);
+		praat_addAction1 (classFormantModeler, 0, U"Get variance of parameters...", 0, 1, DO_FormantModeler_getVarianceOfParameters);
+		praat_addAction1 (classFormantModeler, 1, U"-- get data points info --", 0, 1, 0);
+		praat_addAction1 (classFormantModeler, 0, U"Get number of data points", 0, 1, DO_FormantModeler_getNumberOfDataPoints);
+		praat_addAction1 (classFormantModeler, 0, U"Get number of invalid data points...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FormantModeler_getNumberOfInvalidDataPoints);
+		praat_addAction1 (classFormantModeler, 0, U"Get model value at time...", 0, 1, DO_FormantModeler_getModelValueAtTime);
+		praat_addAction1 (classFormantModeler, 0, U"Get data point value...", 0, 1, DO_FormantModeler_getDataPointValue);
+		praat_addAction1 (classFormantModeler, 0, U"Get data point sigma...", 0, 1, DO_FormantModeler_getDataPointSigma);
+		praat_addAction1 (classFormantModeler, 0, U"Get data point status...", 0, 1, DO_FormantModeler_getDataPointStatus);
+
+		praat_addAction1 (classFormantModeler, 1, U"-- get statistics info --", 0, 1, 0);
+		praat_addAction1 (classFormantModeler, 0, U"Get residual sum of squares...", 0, 1, DO_FormantModeler_getResidualSumOfSquares);
+		praat_addAction1 (classFormantModeler, 0, U"Get formant standard deviation...", 0, 1, DO_FormantModeler_getStandardDeviation);
+		praat_addAction1 (classFormantModeler, 0, U"Get coefficient of determination...", 0, 1, DO_FormantModeler_getCoefficientOfDetermination);
+		praat_addAction1 (classFormantModeler, 0, U"Report chi squared...", 0, 1, DO_FormantModeler_reportChiSquared);
+		praat_addAction1 (classFormantModeler, 0, U"Get degrees of freedom...", 0, 1, DO_FormantModeler_getDegreesOfFreedom);
+		praat_addAction1 (classFormantModeler, 0, U"Get smoothness value...", 0, 1, DO_FormantModeler_getSmoothnessValue);
+		praat_addAction1 (classFormantModeler, 0, U"Get average distance between tracks...", 0, 1, DO_FormantModeler_getAverageDistanceBetweenTracks);
+		praat_addAction1 (classFormantModeler, 0, U"Get formants constraints factor...", 0, 1, DO_FormantModeler_getFormantsConstraintsFactor);
+
+	praat_addAction1 (classFormantModeler, 1, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classFormantModeler, 0, U"Set data weighing...", 0, 1, DO_FormantModeler_setDataWeighing);
+		praat_addAction1 (classFormantModeler, 0, U"Set tolerance...", 0, 1, DO_FormantModeler_setTolerance);
+		praat_addAction1 (classFormantModeler, 1, U"-- set parameter values --", 0, 1, 0);
+		praat_addAction1 (classFormantModeler, 0, U"Set parameter value fixed...", 0, 1, DO_FormantModeler_setParameterValueFixed);
+		praat_addAction1 (classFormantModeler, 0, U"Set parameter free...", 0, 1, DO_FormantModeler_setParameterFree);
+		praat_addAction1 (classFormantModeler, 0, U"Set parameter values to zero...", 0, 1, DO_FormantModeler_setParameterValuesToZero);
+		praat_addAction1 (classFormantModeler, 1, U"-- set data points --", 0, 1, 0);
+		praat_addAction1 (classFormantModeler, 0, U"Set data point value...", 0, 1, DO_FormantModeler_setDataPointValue);
+		praat_addAction1 (classFormantModeler, 0, U"Set data point sigma...", 0, 1, DO_FormantModeler_setDataPointSigma);
+		praat_addAction1 (classFormantModeler, 0, U"Set data point status...", 0, 1, DO_FormantModeler_setDataPointStatus);
 			
-	praat_addAction1 (classFormantModeler, 0, L"Fit model", 0, 0, DO_FormantModeler_fitModel);
+	praat_addAction1 (classFormantModeler, 0, U"Fit model", 0, 0, DO_FormantModeler_fitModel);
+	
 	
-	praat_addAction1 (classFormantModeler, 0, L"To Covariance (parameters)...", 0, 0, DO_FormantModeler_to_Covariance_parameters);
-	praat_addAction1 (classFormantModeler, 0, L"To Table (z-scores)...", 0, 0, DO_FormantModeler_to_Table_zscores);
-	praat_addAction1 (classFormantModeler, 0, L"To FormantModeler (process outliers)...", 0, 0, DO_FormantModeler_processOutliers);
-	praat_addAction1 (classFormantModeler, 0, L"Extract DataModeler...", 0, 0, DO_FormantModeler_extractDataModeler);
+	praat_addAction1 (classFormantModeler, 0, U"To Covariance (parameters)...", 0, 0, DO_FormantModeler_to_Covariance_parameters);
+	praat_addAction1 (classFormantModeler, 0, U"To Table (z-scores)...", 0, 0, DO_FormantModeler_to_Table_zscores);
+	praat_addAction1 (classFormantModeler, 0, U"To FormantModeler (process outliers)...", 0, 0, DO_FormantModeler_processOutliers);
+	praat_addAction1 (classFormantModeler, 0, U"Extract DataModeler...", 0, 0, DO_FormantModeler_extractDataModeler);
+
+	praat_addAction1 (classOptimalCeilingTier, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_OptimalCeilingTier_edit);
 	
-	praat_addAction1 (classPitch, 0, L"To PitchModeler...", L"To PointProcess", praat_HIDDEN, DO_Pitch_to_PitchModeler);
+	praat_addAction1 (classPitch, 0, U"To PitchModeler...", U"To PointProcess", praat_HIDDEN, DO_Pitch_to_PitchModeler);
 
-	praat_addAction1 (classPitchModeler, 0, L"Draw...", 0, 0, DO_PitchModeler_draw);
+	praat_addAction1 (classPitchModeler, 0, U"Draw...", 0, 0, DO_PitchModeler_draw);
 
-	praat_addAction1 (classSound, 0, L"To Formant (interval)...", L"To Formant (robust)...", praat_DEPTH_2 | praat_HIDDEN, DO_Sound_to_Formant_interval);
-	praat_addAction1 (classSound, 0, L"To Formant (interval, constrained)...", L"To Formant (interval)...",
+	praat_addAction1 (classSound, 0, U"Get optimal formant ceiling...", U"Get intensity (dB)", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_getOptimalFormantCeiling);
+	praat_addAction1 (classSound, 0, U"To Formant (interval)...", U"To Formant (robust)...", praat_DEPTH_2 | praat_HIDDEN, DO_Sound_to_Formant_interval);
+	praat_addAction1 (classSound, 0, U"To Formant (interval, constrained)...", U"To Formant (interval)...",
 		praat_DEPTH_2 | praat_HIDDEN, DO_Sound_to_Formant_interval_constrained);
-	praat_addAction1 (classSound, 0, L"To Formant (interval, constrained, robust)...", L"To Formant (interval, constrained)...", 
+
+	praat_addAction1 (classSound, 0, U"To OptimalCeilingTier...", U"To Formant (interval, constrained)...", praat_DEPTH_2 | praat_HIDDEN, DO_Sound_to_OptimalCeilingTier);
+	
+	praat_addAction1 (classSound, 0, U"To Formant (interval, constrained, robust)...", U"To Formant (interval, constrained)...", 
 		praat_DEPTH_2 | praat_HIDDEN, DO_Sound_to_Formant_interval_constrained_robust);
-	praat_addAction1 (classTable, 0, L"To DataModeler...", L"To logistic regression...", praat_DEPTH_1 + praat_HIDDEN, DO_Table_to_DataModeler);
+	praat_addAction1 (classTable, 0, U"To DataModeler...", U"To logistic regression...", praat_DEPTH_1 + praat_HIDDEN, DO_Table_to_DataModeler);
 }
 
-/* End of file praat_DataModeler_init.c */
+/* End of file praat_DataModeler_init.cpp */
diff --git a/dwtools/praat_David_init.cpp b/dwtools/praat_David_init.cpp
index ca5c19b..96284ee 100644
--- a/dwtools/praat_David_init.cpp
+++ b/dwtools/praat_David_init.cpp
@@ -1,6 +1,6 @@
 /* praat_David_init.cpp
  *
- * Copyright (C) 1993-2014 David Weenink
+ * Copyright (C) 1993-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,13 +49,13 @@
  djmw 20070206 Sound_changeGender: pitch range factor must be >= 0
  djmw 20070304 Latest modification.
  djmw 20070903 Melder_new<1...>
- djmw 20071011 REQUIRE requires L"".
+ djmw 20071011 REQUIRE requires U"".
  djmw 20071202 Melder_warning<n>
  djmw 20080521 Confusion_drawAsnumbers
  djmw 20090109 KlattGrid formulas for formant
  djmw 20090708 KlattTable <-> Table
  djmw 20090822 Thing_recognizeClassesByName: added classCepstrum, classIndex, classKlattTable
- djmw 20090914 Excitation to Excitations crashed because of NULL reference
+ djmw 20090914 Excitation to Excitations crashed because of nullptr reference
  djmw 20090927 TableOfReal_drawRow(s)asHistogram
  djmw 20091023 Sound_draw_selectedIntervals
  djmw 20091230 Covariance_and_TableOfReal_mahalanobis
@@ -74,6 +74,7 @@
 #include "CategoriesEditor.h"
 #include "ClassificationTable.h"
 #include "Collection_extensions.h"
+#include "ComplexSpectrogram.h"
 #include "Confusion.h"
 #include "Discriminant.h"
 #include "EditDistanceTable.h"
@@ -135,10 +136,10 @@
 #undef iam
 #define iam iam_LOOP
 
-static const wchar_t *QUERY_BUTTON   = L"Query -";
-static const wchar_t *DRAW_BUTTON    = L"Draw -";
-static const wchar_t *MODIFY_BUTTON  = L"Modify -";
-static const wchar_t *EXTRACT_BUTTON = L"Extract -";
+static const char32 *QUERY_BUTTON   = U"Query -";
+static const char32 *DRAW_BUTTON    = U"Draw -";
+static const char32 *MODIFY_BUTTON  = U"Modify -";
+static const char32 *EXTRACT_BUTTON = U"Extract -";
 
 void praat_TimeFunction_query_init (ClassInfo klas);
 void praat_TimeFrameSampled_query_init (ClassInfo klas);
@@ -147,8 +148,8 @@ void praat_TableOfReal_init2 (ClassInfo klas);
 void praat_SSCP_as_TableOfReal_init (ClassInfo klas);
 
 void praat_CC_init (ClassInfo klas);
-void DTW_constraints_addCommonFields (void *dia);
-void DTW_constraints_getCommonFields (void *dia, int *begin, int *end, int *slope);
+void DTW_constraints_addCommonFields (UiForm dia);
+void DTW_constraints_getCommonFields (UiForm dia, int *begin, int *end, int *slope);
 void praat_BandFilterSpectrogram_query_init (ClassInfo klas);
 int praat_Fon_formula (UiForm dia, Interpreter interpreter);
 void praat_EditDistanceTable_as_TableOfReal_init (ClassInfo klas);
@@ -157,9 +158,9 @@ void praat_EditDistanceTable_as_TableOfReal_init (ClassInfo klas);
 
 /********************** Activation *******************************************/
 
-FORM (Activation_formula, L"Activation: Formula", 0)
-	LABEL (L"label", L"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + dx } y := y + dy }}")
-	TEXTFIELD (L"formula", L"self")
+FORM (Activation_formula, U"Activation: Formula", 0)
+	LABEL (U"label", U"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + dx } y := y + dy }}")
+	TEXTFIELD (U"formula", U"self")
 	OK
 DO
 	praat_Fon_formula (dia, interpreter);
@@ -168,126 +169,127 @@ END
 DIRECT (Activation_to_Matrix)
 	LOOP {
 		iam (Activation);
-		praat_new (Activation_to_Matrix (me), my name);
+		autoMatrix thee = Activation_to_Matrix (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 /********************** BandFilterSpectrogram *******************************************/
 
-FORM (BandFilterSpectrogram_drawFrequencyScale, L"", L"")
-	REAL (L"left Horizontal frequency range (Hz)", L"0.0")
-	REAL (L"right Horizontal frequency range (Hz)", L"0.0")
-	REAL (L"left Vertical frequency range (mel)", L"0.0")
-	REAL (L"right Vertical frequency range (mel)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (BandFilterSpectrogram_drawFrequencyScale, U"", U"")
+	REAL (U"left Horizontal frequency range (Hz)", U"0.0")
+	REAL (U"right Horizontal frequency range (Hz)", U"0.0")
+	REAL (U"left Vertical frequency range (mel)", U"0.0")
+	REAL (U"right Vertical frequency range (mel)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (BandFilterSpectrogram);
-		BandFilterSpectrogram_drawFrequencyScale (me, GRAPHICS, GET_REAL (L"left Horizontal frequency range"), 
-			GET_REAL (L"right Horizontal frequency range"),
-			GET_REAL (L"left Vertical frequency range"), GET_REAL (L"right Vertical frequency range"),
-			GET_INTEGER (L"Garnish"));
+		BandFilterSpectrogram_drawFrequencyScale (me, GRAPHICS, GET_REAL (U"left Horizontal frequency range"), 
+			GET_REAL (U"right Horizontal frequency range"),
+			GET_REAL (U"left Vertical frequency range"), GET_REAL (U"right Vertical frequency range"),
+			GET_INTEGER (U"Garnish"));
 	}
 END
 
 /********************** BarkFilter *******************************************/
 
 DIRECT (BarkFilter_help)
-	Melder_help (L"BarkFilter");
+	Melder_help (U"BarkFilter");
 END
 
 DIRECT (BarkSpectrogram_help)
-	Melder_help (L"BarkSpectrogram");
+	Melder_help (U"BarkSpectrogram");
 END
 
-FORM (BarkFilter_drawSpectrum, L"BarkFilter: Draw spectrum (slice)", L"FilterBank: Draw spectrum (slice)...")
-	POSITIVE (L"Time (s)", L"0.1")
-	REAL (L"left Frequency range (Bark)", L"0.0")
-	REAL (L"right Frequency range (Bark)", L"0.0")
-	REAL (L"left Amplitude range (dB)", L"0.0")
-	REAL (L"right Amplitude range (dB)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (BarkFilter_drawSpectrum, U"BarkFilter: Draw spectrum (slice)", U"FilterBank: Draw spectrum (slice)...")
+	POSITIVE (U"Time (s)", U"0.1")
+	REAL (U"left Frequency range (Bark)", U"0.0")
+	REAL (U"right Frequency range (Bark)", U"0.0")
+	REAL (U"left Amplitude range (dB)", U"0.0")
+	REAL (U"right Amplitude range (dB)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (BarkFilter);
-		FilterBank_drawTimeSlice (me, GRAPHICS, GET_REAL (L"Time"), GET_REAL (L"left Frequency range"),
-			GET_REAL (L"right Frequency range"), GET_REAL (L"left Amplitude range"),
-			GET_REAL (L"right Amplitude range"), L"Barks", GET_INTEGER (L"Garnish"));
+		FilterBank_drawTimeSlice (me, GRAPHICS, GET_REAL (U"Time"), GET_REAL (U"left Frequency range"),
+			GET_REAL (U"right Frequency range"), GET_REAL (U"left Amplitude range"),
+			GET_REAL (U"right Amplitude range"), U"Barks", GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (BarkFilter_drawSekeyHansonFilterFunctions, L"BarkFilter: Draw filter functions", L"FilterBank: Draw filter functions...")
-	INTEGER (L"left Filter range", L"0")
-	INTEGER (L"right Filter range", L"0")
-	RADIO (L"Frequency scale", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIOBUTTON (L"mel")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	BOOLEAN (L"Amplitude scale in dB", 1)
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (BarkFilter_drawSekeyHansonFilterFunctions, U"BarkFilter: Draw filter functions", U"FilterBank: Draw filter functions...")
+	INTEGER (U"left Filter range", U"0")
+	INTEGER (U"right Filter range", U"0")
+	RADIO (U"Frequency scale", 1)
+	RADIOBUTTON (U"Hertz")
+	RADIOBUTTON (U"Bark")
+	RADIOBUTTON (U"mel")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	BOOLEAN (U"Amplitude scale in dB", 1)
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (BarkFilter);
-		BarkFilter_drawSekeyHansonFilterFunctions (me, GRAPHICS, GET_INTEGER (L"Frequency scale"),
-			GET_INTEGER (L"left Filter range"), GET_INTEGER (L"right Filter range"),
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_INTEGER (L"Amplitude scale in dB"), GET_REAL (L"left Amplitude range"),
-			GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Garnish"));
+		BarkFilter_drawSekeyHansonFilterFunctions (me, GRAPHICS, GET_INTEGER (U"Frequency scale"),
+			GET_INTEGER (U"left Filter range"), GET_INTEGER (U"right Filter range"),
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_INTEGER (U"Amplitude scale in dB"), GET_REAL (U"left Amplitude range"),
+			GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (BarkSpectrogram_drawSekeyHansonAuditoryFilters, L"BarkSpectrogram: Draw Sekey-Hanson auditory filters", L"BarkSpectrogram: Draw Sekey-Hanson auditory filters...")
-	INTEGER (L"left Filter range", L"0")
-	INTEGER (L"right Filter range", L"0")
-	RADIO (L"Frequency scale", 2)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	BOOLEAN (L"Amplitude scale in dB", 1)
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (BarkSpectrogram_drawSekeyHansonAuditoryFilters, U"BarkSpectrogram: Draw Sekey-Hanson auditory filters", U"BarkSpectrogram: Draw Sekey-Hanson auditory filters...")
+	INTEGER (U"left Filter range", U"0")
+	INTEGER (U"right Filter range", U"0")
+	RADIO (U"Frequency scale", 2)
+	RADIOBUTTON (U"Hertz")
+	RADIOBUTTON (U"Bark")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	BOOLEAN (U"Amplitude scale in dB", 1)
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (BarkSpectrogram);
-		bool xIsHertz = GET_INTEGER (L"Frequency scale") == 1;
+		bool xIsHertz = GET_INTEGER (U"Frequency scale") == 1;
 		BarkSpectrogram_drawSekeyHansonFilterFunctions (me, GRAPHICS, xIsHertz,
-			GET_INTEGER (L"left Filter range"), GET_INTEGER (L"right Filter range"),
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_INTEGER (L"Amplitude scale in dB"), GET_REAL (L"left Amplitude range"),
-			GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Garnish"));
+			GET_INTEGER (U"left Filter range"), GET_INTEGER (U"right Filter range"),
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_INTEGER (U"Amplitude scale in dB"), GET_REAL (U"left Amplitude range"),
+			GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (BarkFilter_paint, L"FilterBank: Paint", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range (bark)", L"0.0")
-	REAL (L"right Frequency range (bark)", L"0.0")
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
-	BOOLEAN (L"Garnish", 0)
+FORM (BarkFilter_paint, U"FilterBank: Paint", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range (bark)", U"0.0")
+	REAL (U"right Frequency range (bark)", U"0.0")
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
+	BOOLEAN (U"Garnish", 0)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		FilterBank_paint ((FilterBank) me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-		GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Garnish"));
+		FilterBank_paint ((FilterBank) me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+		GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
@@ -314,19 +316,19 @@ END
 
 /********************** Categories  ****************************************/
 
-FORM (Categories_append, L"Categories: Append 1 category", L"Categories: Append 1 category...")
-	SENTENCE (L"Category", L"")
+FORM (Categories_append, U"Categories: Append 1 category", U"Categories: Append 1 category...")
+	SENTENCE (U"Category", U"")
 	OK
 DO
 	LOOP {
 		iam (Categories);
-		OrderedOfString_append (me, GET_STRING (L"Category"));
+		OrderedOfString_append (me, GET_STRING (U"Category"));
 	}
 END
 
 DIRECT (Categories_edit)
 	if (theCurrentPraatApplication -> batch) {
-		Melder_throw ("Cannot edit a Categories from batch.");
+		Melder_throw (U"Cannot edit a Categories from batch.");
 	} else {
 		LOOP {
 			iam (Categories);
@@ -339,7 +341,7 @@ END
 DIRECT (Categories_getNumberOfCategories)
 	LOOP {
 		iam (Categories);
-		Melder_information (Melder_integer (my size), L" categories");
+		Melder_information (my size, U" categories");
 	}
 END
 
@@ -351,11 +353,11 @@ DIRECT (Categories_getNumberOfDifferences)
 	}
 	Melder_assert (c1 && c2);
 
-	long NumberOfDifferences = OrderedOfString_getNumberOfDifferences (c1, c2);
-	if (NumberOfDifferences < 0) {
-		Melder_information (L"-1 (undefined: number of elements differ!)");
+	long numberOfDifferences = OrderedOfString_getNumberOfDifferences (c1, c2);
+	if (numberOfDifferences < 0) {
+		Melder_information (U"-1 (undefined: number of elements differ!)");
 	} else {
-		Melder_information (Melder_integer (NumberOfDifferences), L" differences");
+		Melder_information (numberOfDifferences, U" differences");
 	}
 END
 
@@ -366,7 +368,7 @@ DIRECT (Categories_getFractionDifferent)
 		(c1 ? c2 : c1) = me;
 	}
 	Melder_assert (c1 && c2);
-	Melder_information (Melder_double (OrderedOfString_getFractionDifferent (c1, c2)));
+	Melder_information (OrderedOfString_getFractionDifferent (c1, c2));
 END
 
 DIRECT (Categories_difference)
@@ -378,13 +380,14 @@ DIRECT (Categories_difference)
 	Melder_assert (c1 && c2);
 	double fraction; long n;
 	OrderedOfString_difference (c1, c2, &n, &fraction);
-	Melder_information (Melder_integer (n), L" differences");
+	Melder_information (n, U" differences");
 END
 
 DIRECT (Categories_selectUniqueItems)
 	LOOP {
 		iam (Categories);
-		praat_new (Categories_selectUniqueItems (me, 1), my name, L"_uniq");
+		autoCategories thee = Categories_selectUniqueItems (me, 1);
+		praat_new (thee.transfer(), my name, U"_uniq");
 	}
 END
 
@@ -395,7 +398,8 @@ DIRECT (Categories_to_Confusion)
 		(c1 ? c2 : c1) = me;
 	}
 	Melder_assert (c1 && c2);
-	praat_new (Categories_to_Confusion (c1, c2), Thing_getName (c1), L"_", Thing_getName (c2));
+	autoConfusion thee = Categories_to_Confusion (c1, c2);
+	praat_new (thee.transfer(), Thing_getName (c1), U"_", Thing_getName (c2));
 END
 
 DIRECT (Categories_to_Strings)
@@ -418,97 +422,97 @@ END
 DIRECT (Categories_permuteItems)
 	LOOP {
 		iam (Collection);
-		praat_new (Collection_permuteItems (me), my name, L"_perm");
+		praat_new (Collection_permuteItems (me), my name, U"_perm");
 	}
 END
 
 /***************** CC ****************************************/
 
-FORM (CC_getNumberOfCoefficients, L"Get number of coefficients", 0)
-	NATURAL (L"Frame number", L"1")
+FORM (CC_getNumberOfCoefficients, U"Get number of coefficients", 0)
+	NATURAL (U"Frame number", U"1")
 	OK
 DO
 	LOOP {
 		iam (CC);
-		long numberOfCoefficients = CC_getNumberOfCoefficients (me, GET_INTEGER (L"Frame number"));
-		Melder_information (Melder_integer (numberOfCoefficients));
+		long numberOfCoefficients = CC_getNumberOfCoefficients (me, GET_INTEGER (U"Frame number"));
+		Melder_information (numberOfCoefficients);
 	}
 END
 
-FORM (CC_getValue, L"CC: Get value", L"CC: Get value...")
-	REAL (L"Time (s)", L"0.1")
-	NATURAL (L"Index", L"1")
+FORM (CC_getValue, U"CC: Get value", U"CC: Get value...")
+	REAL (U"Time (s)", U"0.1")
+	NATURAL (U"Index", U"1")
 	OK
 DO
 	LOOP {
 		iam (CC); // ?? generic
-		Melder_informationReal (CC_getValue (me, GET_REAL (L"Time"), GET_INTEGER (L"Index")), 0);
+		Melder_informationReal (CC_getValue (me, GET_REAL (U"Time"), GET_INTEGER (U"Index")), 0);
 	}
 END
 
-FORM (CC_getValueInFrame, L"CC: Get value in frame", L"CC: Get value in frame...")
-	NATURAL (L"Frame number", L"1")
-	NATURAL (L"Index", L"1")
+FORM (CC_getValueInFrame, U"CC: Get value in frame", U"CC: Get value in frame...")
+	NATURAL (U"Frame number", U"1")
+	NATURAL (U"Index", U"1")
 	OK
 DO
 	LOOP {
 		iam (CC); // ?? generic
-		Melder_informationReal (CC_getValueInFrame (me, GET_INTEGER (L"Frame number"), GET_INTEGER (L"Index")), 0);
+		Melder_informationReal (CC_getValueInFrame (me, GET_INTEGER (U"Frame number"), GET_INTEGER (U"Index")), 0);
 	}
 END
 
-FORM (CC_getC0ValueInFrame, L"CC: Get c0 value in frame", L"CC: Get c0 value in frame...")
-	NATURAL (L"Frame number", L"1")
+FORM (CC_getC0ValueInFrame, U"CC: Get c0 value in frame", U"CC: Get c0 value in frame...")
+	NATURAL (U"Frame number", U"1")
 	OK
 DO
 	LOOP {
 		iam (CC); // ?? generic
-		Melder_informationReal (CC_getC0ValueInFrame (me, GET_INTEGER (L"Frame number")), 0);
+		Melder_informationReal (CC_getC0ValueInFrame (me, GET_INTEGER (U"Frame number")), 0);
 	}
 END
 
-FORM (CC_paint, L"CC: Paint", L"CC: Paint...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	INTEGER (L"From coefficient", L"0")
-	INTEGER (L"To coefficient", L"0")
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (CC_paint, U"CC: Paint", U"CC: Paint...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	INTEGER (U"From coefficient", U"0")
+	INTEGER (U"To coefficient", U"0")
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (CC);
-		CC_paint (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_INTEGER (L"From coefficient"), GET_INTEGER (L"To coefficient"),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"), GET_INTEGER (L"Garnish"));
+		CC_paint (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_INTEGER (U"From coefficient"), GET_INTEGER (U"To coefficient"),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (CC_drawC0, L"CC: Draw c0", L"CC: Draw c0...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (CC_drawC0, U"CC: Draw c0", U"CC: Draw c0...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (CC);
-		CC_drawC0 (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Garnish"));
+		CC_drawC0 (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (CCs_to_DTW, L"CC: To DTW", L"CC: To DTW...")
-	LABEL (L"", L"Distance  between cepstral coefficients")
-	REAL (L"Cepstral weight", L"1.0")
-	REAL (L"Log energy weight", L"0.0")
-	REAL (L"Regression weight", L"0.0")
-	REAL (L"Regression weight log energy", L"0.0")
-	REAL (L"Regression coefficients window (s)", L"0.056")
+FORM (CCs_to_DTW, U"CC: To DTW", U"CC: To DTW...")
+	LABEL (U"", U"Distance  between cepstral coefficients")
+	REAL (U"Cepstral weight", U"1.0")
+	REAL (U"Log energy weight", U"0.0")
+	REAL (U"Regression weight", U"0.0")
+	REAL (U"Regression weight log energy", U"0.0")
+	REAL (U"Regression coefficients window (s)", U"0.056")
 	DTW_constraints_addCommonFields (dia);
 	OK
 DO
@@ -520,11 +524,11 @@ DO
 	Melder_assert (c1 && c2);
 	int begin, end, slope;
 	DTW_constraints_getCommonFields (dia, &begin, &end, &slope);
-    autoDTW thee = CCs_to_DTW (c1, c2, GET_REAL (L"Cepstral weight"), GET_REAL (L"Log energy weight"),
-        GET_REAL (L"Regression weight"), GET_REAL (L"Regression weight log energy"),
-        GET_REAL (L"Regression coefficients window"));
+    autoDTW thee = CCs_to_DTW (c1, c2, GET_REAL (U"Cepstral weight"), GET_REAL (U"Log energy weight"),
+        GET_REAL (U"Regression weight"), GET_REAL (U"Regression weight log energy"),
+        GET_REAL (U"Regression coefficients window"));
     DTW_findPath (thee.peek(), begin, end, slope);
-	praat_new (thee.transfer(), 0);
+	praat_new (thee.transfer(), U"");
 END
 
 DIRECT (CC_to_Matrix)
@@ -536,172 +540,172 @@ END
 
 /******************* class CCA ********************************/
 
-FORM (CCA_drawEigenvector, L"CCA: Draw eigenvector", L"Eigen: Draw eigenvector...")
-	OPTIONMENU (L"X or Y", 1)
-	OPTION (L"y")
-	OPTION (L"x")
-	INTEGER (L"Eigenvector number", L"1")
-	LABEL (L"", L"Multiply by eigenvalue?")
-	BOOLEAN (L"Component loadings", 0)
-	LABEL (L"", L"Select part of the eigenvector:")
-	INTEGER (L"left Element range", L"0")
-	INTEGER (L"right Element range", L"0")
-	REAL (L"left Amplitude range", L"-1.0")
-	REAL (L"right Amplitude range", L"1.0")
-	POSITIVE (L"Mark size (mm)", L"1.0")
-	SENTENCE (L"Mark string (+xo.)", L"+")
-	BOOLEAN (L"Connect points", 1)
-	BOOLEAN (L"Garnish", 1)
+FORM (CCA_drawEigenvector, U"CCA: Draw eigenvector", U"Eigen: Draw eigenvector...")
+	OPTIONMENU (U"X or Y", 1)
+	OPTION (U"y")
+	OPTION (U"x")
+	INTEGER (U"Eigenvector number", U"1")
+	LABEL (U"", U"Multiply by eigenvalue?")
+	BOOLEAN (U"Component loadings", 0)
+	LABEL (U"", U"Select part of the eigenvector:")
+	INTEGER (U"left Element range", U"0")
+	INTEGER (U"right Element range", U"0")
+	REAL (U"left Amplitude range", U"-1.0")
+	REAL (U"right Amplitude range", U"1.0")
+	POSITIVE (U"Mark size (mm)", U"1.0")
+	SENTENCE (U"Mark string (+xo.)", U"+")
+	BOOLEAN (U"Connect points", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (CCA);
-		CCA_drawEigenvector (me, GRAPHICS, GET_INTEGER (L"X or Y"), GET_INTEGER (L"Eigenvector number"),
-			GET_INTEGER (L"left Element range"), GET_INTEGER (L"right Element range"),
-			GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"),
-			GET_INTEGER (L"Component loadings"), GET_REAL (L"Mark size"),
-			GET_STRING (L"Mark string"), GET_INTEGER (L"Connect points"), GET_INTEGER (L"Garnish"));
+		CCA_drawEigenvector (me, GRAPHICS, GET_INTEGER (U"X or Y"), GET_INTEGER (U"Eigenvector number"),
+			GET_INTEGER (U"left Element range"), GET_INTEGER (U"right Element range"),
+			GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"),
+			GET_INTEGER (U"Component loadings"), GET_REAL (U"Mark size"),
+			GET_STRING (U"Mark string"), GET_INTEGER (U"Connect points"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (CCA_getNumberOfCorrelations)
 	LOOP {
 		iam (CCA);
-		Melder_information (Melder_double (my numberOfCoefficients));
+		Melder_information (my numberOfCoefficients);
 	}
 END
 
-FORM (CCA_getCorrelationCoefficient, L"CCA: Get canonical correlation coefficient", L"CCA: Get canonical correlation coefficient")
-	NATURAL (L"Coefficient number", L"1")
+FORM (CCA_getCorrelationCoefficient, U"CCA: Get canonical correlation coefficient", U"CCA: Get canonical correlation coefficient")
+	NATURAL (U"Coefficient number", U"1")
 	OK
 DO
 	LOOP {
 		iam (CCA);
-		Melder_information (Melder_double (CCA_getCorrelationCoefficient (me, GET_INTEGER (L"Coefficient number"))));
+		Melder_information (CCA_getCorrelationCoefficient (me, GET_INTEGER (U"Coefficient number")));
 	}
 END
 
-FORM (CCA_getEigenvectorElement, L"CCA: Get eigenvector element", L"Eigen: Get eigenvector element...")
-	OPTIONMENU (L"X or Y", 1)
-	OPTION (L"y")
-	OPTION (L"x")
-	NATURAL (L"Eigenvector number", L"1")
-	NATURAL (L"Element number", L"1")
+FORM (CCA_getEigenvectorElement, U"CCA: Get eigenvector element", U"Eigen: Get eigenvector element...")
+	OPTIONMENU (U"X or Y", 1)
+	OPTION (U"y")
+	OPTION (U"x")
+	NATURAL (U"Eigenvector number", U"1")
+	NATURAL (U"Element number", U"1")
 	OK
 DO
 	LOOP {
 		iam (CCA);
-		Melder_information (Melder_double (CCA_getEigenvectorElement (me, GET_INTEGER (L"X or Y"),
-		GET_INTEGER (L"Eigenvector number"), GET_INTEGER (L"Element number"))));
+		Melder_information (CCA_getEigenvectorElement (me, GET_INTEGER (U"X or Y"),
+		GET_INTEGER (U"Eigenvector number"), GET_INTEGER (U"Element number")));
 	}
 END
 
-FORM (CCA_getZeroCorrelationProbability, L"CCA: Get zero correlation probability", L"CCA: Get zero correlation probability...")
-	NATURAL (L"Coefficient number", L"1")
+FORM (CCA_getZeroCorrelationProbability, U"CCA: Get zero correlation probability", U"CCA: Get zero correlation probability...")
+	NATURAL (U"Coefficient number", U"1")
 	OK
 DO
 	LOOP {
 		iam (CCA);
 		double p, chisq; long ndf;
-		CCA_getZeroCorrelationProbability (me, GET_INTEGER (L"Coefficient number"), &chisq, &ndf, &p);
-		Melder_information (Melder_double (p), L" (=probability for chisq = ", Melder_double (chisq),
-		L" and ndf = ", Melder_integer (ndf), L")");
+		CCA_getZeroCorrelationProbability (me, GET_INTEGER (U"Coefficient number"), &chisq, &ndf, &p);
+		Melder_information (p, U" (=probability for chisq = ", chisq,
+		U" and ndf = ", ndf, U")");
 	}
 END
 
 DIRECT (CCA_and_Correlation_factorLoadings)
 	CCA cca = FIRST (CCA);
 	Correlation c = FIRST (Correlation);
-	praat_new (CCA_and_Correlation_factorLoadings (cca, c), Thing_getName (cca), L"_loadings");
+	praat_new (CCA_and_Correlation_factorLoadings (cca, c), Thing_getName (cca), U"_loadings");
 END
 
-FORM (CCA_and_Correlation_getVarianceFraction, L"CCA & Correlation: Get variance fraction", L"CCA & Correlation: Get variance fraction...")
-	LABEL (L"", L"Get the fraction of variance from the data in set...")
-	OPTIONMENU (L"X or Y", 1)
-	OPTION (L"y")
-	OPTION (L"x")
-	LABEL (L"", L"extracted by...")
-	NATURAL (L"left Canonical variate range", L"1")
-	NATURAL (L"right Canonical variate range", L"1")
+FORM (CCA_and_Correlation_getVarianceFraction, U"CCA & Correlation: Get variance fraction", U"CCA & Correlation: Get variance fraction...")
+	LABEL (U"", U"Get the fraction of variance from the data in set...")
+	OPTIONMENU (U"X or Y", 1)
+	OPTION (U"y")
+	OPTION (U"x")
+	LABEL (U"", U"extracted by...")
+	NATURAL (U"left Canonical variate range", U"1")
+	NATURAL (U"right Canonical variate range", U"1")
 	OK
 DO
 	CCA cca = FIRST (CCA);
 	Correlation c = FIRST (Correlation);
-	int x_or_y = GET_INTEGER (L"X or Y");
-	int cv_from = GET_INTEGER (L"left Canonical variate range");
-	int cv_to = GET_INTEGER (L"right Canonical variate range");
-	Melder_information (Melder_double (CCA_and_Correlation_getVarianceFraction (cca, c, x_or_y, cv_from, cv_to)),
-		L" (fraction variance from ", (x_or_y == 1 ? L"y" : L"x"), L", extracted by canonical variates ",
-		Melder_integer (cv_from), L" to ", Melder_integer (cv_to), L")");
+	int x_or_y = GET_INTEGER (U"X or Y");
+	int cv_from = GET_INTEGER (U"left Canonical variate range");
+	int cv_to = GET_INTEGER (U"right Canonical variate range");
+	Melder_information (CCA_and_Correlation_getVarianceFraction (cca, c, x_or_y, cv_from, cv_to),
+		U" (fraction variance from ", (x_or_y == 1 ? U"y" : U"x"), U", extracted by canonical variates ",
+		cv_from, U" to ", cv_to, U")");
 END
 
-FORM (CCA_and_Correlation_getRedundancy_sl, L"CCA & Correlation: Get Stewart-Love redundancy", L"CCA & Correlation: Get redundancy (sl)...")
-	LABEL (L"", L"Get the redundancy of the data in set...")
-	OPTIONMENU (L"X or Y", 1)
-	OPTION (L"y")
-	OPTION (L"x")
-	LABEL (L"", L"extracted by...")
-	NATURAL (L"left Canonical variate range", L"1")
-	NATURAL (L"right Canonical variate range", L"1")
-	LABEL (L"", L"...given the availability of the data in the other set.")
+FORM (CCA_and_Correlation_getRedundancy_sl, U"CCA & Correlation: Get Stewart-Love redundancy", U"CCA & Correlation: Get redundancy (sl)...")
+	LABEL (U"", U"Get the redundancy of the data in set...")
+	OPTIONMENU (U"X or Y", 1)
+	OPTION (U"y")
+	OPTION (U"x")
+	LABEL (U"", U"extracted by...")
+	NATURAL (U"left Canonical variate range", U"1")
+	NATURAL (U"right Canonical variate range", U"1")
+	LABEL (U"", U"...given the availability of the data in the other set.")
 	OK
 DO
 	CCA cca = FIRST (CCA);
 	Correlation c = FIRST (Correlation);
-	int x_or_y = GET_INTEGER (L"X or Y");
-	int cv_from = GET_INTEGER (L"left Canonical variate range");
-	int cv_to = GET_INTEGER (L"right Canonical variate range");
-	Melder_information (Melder_double (CCA_and_Correlation_getRedundancy_sl (cca, c, x_or_y, cv_from, cv_to)),
-		L" (redundancy from ", (x_or_y == 1 ? L"y" : L"x"), L" extracted by canonical variates ",
-		Melder_integer (cv_from), L" to ", Melder_integer (cv_to), L")");
+	int x_or_y = GET_INTEGER (U"X or Y");
+	int cv_from = GET_INTEGER (U"left Canonical variate range");
+	int cv_to = GET_INTEGER (U"right Canonical variate range");
+	Melder_information (CCA_and_Correlation_getRedundancy_sl (cca, c, x_or_y, cv_from, cv_to),
+		U" (redundancy from ", (x_or_y == 1 ? U"y" : U"x"), U" extracted by canonical variates ",
+		cv_from, U" to ", cv_to, U")");
 END
 
 DIRECT (CCA_and_TableOfReal_factorLoadings)
 	CCA cca = FIRST (CCA);
 	TableOfReal tr = FIRST (TableOfReal);
-	praat_new (CCA_and_TableOfReal_factorLoadings (cca, tr), Thing_getName (cca), L"_loadings");
+	praat_new (CCA_and_TableOfReal_factorLoadings (cca, tr), Thing_getName (cca), U"_loadings");
 END
 
-FORM (CCA_and_TableOfReal_scores, L"CCA & TableOfReal: To TableOfReal (scores)", L"CCA & TableOfReal: To TableOfReal (scores)...")
-	INTEGER (L"Number of canonical correlations", L"0 (=all)")
+FORM (CCA_and_TableOfReal_scores, U"CCA & TableOfReal: To TableOfReal (scores)", U"CCA & TableOfReal: To TableOfReal (scores)...")
+	INTEGER (U"Number of canonical correlations", U"0 (=all)")
 	OK
 DO
 	CCA cca = FIRST (CCA);
 	TableOfReal tr = FIRST (TableOfReal);
-	praat_new (CCA_and_TableOfReal_scores (cca, tr, GET_INTEGER (L"Number of canonical correlations")),
-		Thing_getName (cca), L"_scores");
+	praat_new (CCA_and_TableOfReal_scores (cca, tr, GET_INTEGER (U"Number of canonical correlations")),
+		Thing_getName (cca), U"_scores");
 END
 
-FORM (CCA_and_TableOfReal_predict, L"CCA & TableOfReal: Predict", L"CCA & TableOfReal: Predict...")
-	LABEL (L"", L"The data set from which to predict starts at...")
-	INTEGER (L"Column number", L"1")
+FORM (CCA_and_TableOfReal_predict, U"CCA & TableOfReal: Predict", U"CCA & TableOfReal: Predict...")
+	LABEL (U"", U"The data set from which to predict starts at...")
+	INTEGER (U"Column number", U"1")
 	OK
 DO
 	CCA cca = FIRST (CCA);
 	TableOfReal tr = FIRST (TableOfReal);
-	praat_new (CCA_and_TableOfReal_predict (cca, tr, GET_INTEGER (L"Column number")), tr->name, L"_", cca->name);
+	praat_new (CCA_and_TableOfReal_predict (cca, tr, GET_INTEGER (U"Column number")), tr->name, U"_", cca->name);
 END
 
 /***************** ChebyshevSeries ****************************************/
 
 DIRECT (ChebyshevSeries_help)
-	Melder_help (L"ChebyshevSeries");
+	Melder_help (U"ChebyshevSeries");
 END
 
-FORM (ChebyshevSeries_create, L"Create ChebyshevSeries", L"Create ChebyshevSeries...")
-	WORD (L"Name", L"cs")
-	LABEL (L"", L"Domain")
-	REAL (L"Xmin", L"-1")
-	REAL (L"Xmax", L"1")
-	LABEL (L"", L"ChebyshevSeries(x) = c[1] T[0](x) + c[2] T[1](x) + ... c[n+1] T[n](x)")
-	LABEL (L"", L"T[k] is a Chebyshev polynomial of degree k")
-	SENTENCE (L"Coefficients (c[k])", L"0 0 1.0")
+FORM (ChebyshevSeries_create, U"Create ChebyshevSeries", U"Create ChebyshevSeries...")
+	WORD (U"Name", U"cs")
+	LABEL (U"", U"Domain")
+	REAL (U"Xmin", U"-1")
+	REAL (U"Xmax", U"1")
+	LABEL (U"", U"ChebyshevSeries(x) = c[1] T[0](x) + c[2] T[1](x) + ... c[n+1] T[n](x)")
+	LABEL (U"", U"T[k] is a Chebyshev polynomial of degree k")
+	SENTENCE (U"Coefficients (c[k])", U"0 0 1.0")
 	OK
 DO
-	double xmin = GET_REAL (L"Xmin"), xmax = GET_REAL (L"Xmax");
-	REQUIRE (xmin < xmax, L"Xmin must be smaller than Xmax.")
-	praat_new (ChebyshevSeries_createFromString (xmin, xmax, GET_STRING (L"Coefficients")), GET_STRING (L"Name"));
+	double xmin = GET_REAL (U"Xmin"), xmax = GET_REAL (U"Xmax");
+	REQUIRE (xmin < xmax, U"Xmin must be smaller than Xmax.")
+	praat_new (ChebyshevSeries_createFromString (xmin, xmax, GET_STRING (U"Coefficients")), GET_STRING (U"Name"));
 END
 
 DIRECT (ChebyshevSeries_to_Polynomial)
@@ -714,28 +718,28 @@ END
 /***************** ClassificationTable ****************************************/
 
 DIRECT (ClassificationTable_help)
-	Melder_help (L"ClassificationTable");
+	Melder_help (U"ClassificationTable");
 END
 
-FORM (ClassificationTable_getClassIndexAtMaximumInRow, L"ClassificationTable: Get class index at maximum in row", 0)
-	NATURAL (L"Row number", L"1")
+FORM (ClassificationTable_getClassIndexAtMaximumInRow, U"ClassificationTable: Get class index at maximum in row", 0)
+	NATURAL (U"Row number", U"1")
 	OK
 DO
 	LOOP {
 		iam (ClassificationTable);
-		long classIndex = TableOfReal_getColumnIndexAtMaximumInRow (me, GET_INTEGER (L"Row number"));
-		Melder_information (Melder_integer (classIndex));
+		long klasIndex = TableOfReal_getColumnIndexAtMaximumInRow (me, GET_INTEGER (U"Row number"));
+		Melder_information (klasIndex);
 	}
 END
 
-FORM (ClassificationTable_getClassLabelAtMaximumInRow, L"ClassificationTable: Get class label at maximum in row", 0)
-	NATURAL (L"Row number", L"1")
+FORM (ClassificationTable_getClassLabelAtMaximumInRow, U"ClassificationTable: Get class label at maximum in row", 0)
+	NATURAL (U"Row number", U"1")
 	OK
 DO
 	LOOP {
 		iam (ClassificationTable);
-		const wchar_t *classLabel = TableOfReal_getColumnLabelAtMaximumInRow (me, GET_INTEGER (L"Row number"));
-		Melder_information (classLabel);
+		const char32 *klasLabel = TableOfReal_getColumnLabelAtMaximumInRow (me, GET_INTEGER (U"Row number"));
+		Melder_information (klasLabel);
 	}
 END
 
@@ -747,20 +751,20 @@ DIRECT (ClassificationTable_to_Confusion_old)
 	}
 END
 
-FORM (ClassificationTable_to_Confusion, L"ClassificationTable: To Confusion", L"ClassificationTable: To Confusion...")
-	BOOLEAN (L"Only class labels", 1)
+FORM (ClassificationTable_to_Confusion, U"ClassificationTable: To Confusion", U"ClassificationTable: To Confusion...")
+	BOOLEAN (U"Only class labels", 1)
 	OK
 DO
 	LOOP {
 		iam (ClassificationTable);
-		praat_new (ClassificationTable_to_Confusion (me, GET_INTEGER (L"Only class labels")), my name);
+		praat_new (ClassificationTable_to_Confusion (me, GET_INTEGER (U"Only class labels")), my name);
 	}
 END
 
 DIRECT (ClassificationTable_to_Correlation_columns)
 	LOOP {
 		iam (ClassificationTable);
-		praat_new (ClassificationTable_to_Correlation_columns (me), my name, L"_col");
+		praat_new (ClassificationTable_to_Correlation_columns (me), my name, U"_col");
 	}
 END
 
@@ -774,153 +778,160 @@ END
 /********************** Confusion *******************************************/
 
 DIRECT (Confusion_help)
-	Melder_help (L"Confusion");
+	Melder_help (U"Confusion");
 END
 
-FORM (Confusion_createSimple, L"Create simple Confusion", L"Create simple Confusion...")
-	WORD (L"Name", L"simple")
-	SENTENCE (L"Labels", L"u i a")
+FORM (Confusion_createSimple, U"Create simple Confusion", U"Create simple Confusion...")
+	WORD (U"Name", U"simple")
+	SENTENCE (U"Labels", U"u i a")
 	OK
 DO
-	praat_new (Confusion_createSimple (GET_STRING (L"Labels")), GET_STRING (L"Name"));
+	autoConfusion thee = Confusion_createSimple (GET_STRING (U"Labels"));
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
 END
 
-FORM (Confusion_increase, L"Confusion: Increase", L"Confusion: Increase...")
-	WORD (L"Stimulus", L"u")
-	WORD (L"Response", L"i")
+FORM (Confusion_increase, U"Confusion: Increase", U"Confusion: Increase...")
+	WORD (U"Stimulus", U"u")
+	WORD (U"Response", U"i")
 	OK
 DO
 	LOOP {
 		iam (Confusion);
-		Confusion_increase (me, GET_STRING (L"Stimulus"), GET_STRING (L"Response"));
+		Confusion_increase (me, GET_STRING (U"Stimulus"), GET_STRING (U"Response"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Confusion_getValue, L"Confusion: Get value", 0)
-	WORD (L"Stimulus", L"u")
-	WORD (L"Response", L"i")
+FORM (Confusion_getValue, U"Confusion: Get value", 0)
+	WORD (U"Stimulus", U"u")
+	WORD (U"Response", U"i")
 	OK
 DO
-	wchar_t *stim = GET_STRING (L"Stimulus");
-	wchar_t *resp = GET_STRING (L"Response");
+	char32 *stim = GET_STRING (U"Stimulus");
+	char32 *resp = GET_STRING (U"Response");
 	LOOP {
 		iam (Confusion);
-		Melder_information (Melder_double (Confusion_getValue (me, stim, resp)),
-		L" ( [\"", stim, L"\", \"",  resp, L"\"] )");
+		Melder_information (Confusion_getValue (me, stim, resp),
+		U" ( [\"", stim, U"\", \"",  resp, U"\"] )");
 	}
 END
 
-FORM (Confusion_getResponseSum, L"Confusion: Get response sum", L"Confusion: Get response sum...")
-	WORD (L"Response", L"u")
+FORM (Confusion_getResponseSum, U"Confusion: Get response sum", U"Confusion: Get response sum...")
+	WORD (U"Response", U"u")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		Melder_information (Melder_double (TableOfReal_getColumnSumByLabel (me, GET_STRING (L"Response"))));
+		Melder_information (TableOfReal_getColumnSumByLabel (me, GET_STRING (U"Response")));
 	}
 END
 
-FORM (Confusion_getStimulusSum, L"Confusion: Get stimulus sum", L"Confusion: Get stimulus sum...")
-	WORD (L"Stimulus", L"u")
+FORM (Confusion_getStimulusSum, U"Confusion: Get stimulus sum", U"Confusion: Get stimulus sum...")
+	WORD (U"Stimulus", U"u")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		Melder_information (Melder_double (TableOfReal_getRowSumByLabel (me, GET_STRING (L"Stimulus"))));
+		Melder_information (TableOfReal_getRowSumByLabel (me, GET_STRING (U"Stimulus")));
 	}
 END
 
 DIRECT (Confusion_to_TableOfReal_marginals)
 	LOOP {
-		iam (TableOfReal);
-		praat_new (Confusion_to_TableOfReal_marginals (me), my name);
+		iam (Confusion);
+		autoTableOfReal thee = Confusion_to_TableOfReal_marginals (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 DIRECT (Confusion_difference)
-	Confusion c1 = 0, c2 = 0;
+	Confusion c1 = nullptr, c2 = nullptr;
 	LOOP {
 		iam (Confusion);
 		(c1 ? c2 : c1) = me;
 	}
 	Melder_assert (c1 && c2);
-	praat_new (Confusion_difference (c1, c2), L"diffs");
+	autoMatrix thee = Confusion_difference (c1, c2);
+	praat_new (thee.transfer(), U"diffs");
 END
 
-FORM (Confusion_condense, L"Confusion: Condense", L"Confusion: Condense...")
-	SENTENCE (L"Search", L"^(u|i)$")
-	SENTENCE (L"Replace", L"high")
-	INTEGER (L"Replace limit", L"0 (=unlimited)")
-	RADIO (L"Search and replace are", 2)
-	RADIOBUTTON (L"Literals")
-	RADIOBUTTON (L"Regular Expressions")
+FORM (Confusion_condense, U"Confusion: Condense", U"Confusion: Condense...")
+	SENTENCE (U"Search", U"^(u|i)$")
+	SENTENCE (U"Replace", U"high")
+	INTEGER (U"Replace limit", U"0 (=unlimited)")
+	RADIO (U"Search and replace are", 2)
+	RADIOBUTTON (U"Literals")
+	RADIOBUTTON (U"Regular Expressions")
 	OK
 DO
 	LOOP {
 		iam (Confusion);
-		praat_new (Confusion_condense (me, GET_STRING (L"Search"), GET_STRING (L"Replace"),
-		GET_INTEGER (L"Replace limit"), GET_INTEGER (L"Search and replace are") - 1), my name, L"_cnd");
+		autoConfusion thee = Confusion_condense (me, GET_STRING (U"Search"), GET_STRING (U"Replace"),
+		GET_INTEGER (U"Replace limit"), GET_INTEGER (U"Search and replace are") - 1);
+		praat_new (thee.transfer(), my name, U"_cnd");
 	}
 END
 
-FORM (Confusion_group, L"Confusion: Group stimuli & responses", L"Confusion: Group...")
-	SENTENCE (L"Stimuli & Responses", L"u i")
-	SENTENCE (L"New label", L"high")
-	INTEGER (L"New label position", L"0 (=at start)")
+FORM (Confusion_group, U"Confusion: Group stimuli & responses", U"Confusion: Group...")
+	SENTENCE (U"Stimuli & Responses", U"u i")
+	SENTENCE (U"New label", U"high")
+	INTEGER (U"New label position", U"0 (=at start)")
 	OK
 DO
-	const wchar_t *newlabel = GET_STRING (L"New label");
+	const char32 *newlabel = GET_STRING (U"New label");
 	LOOP {
 		iam (Confusion);
-		praat_new (Confusion_group (me, GET_STRING (L"Stimuli & Responses"), newlabel,
-		GET_INTEGER (L"New label position")), Thing_getName (me), L"_sr", newlabel);
+		autoConfusion thee = Confusion_group (me, GET_STRING (U"Stimuli & Responses"), newlabel,
+		GET_INTEGER (U"New label position"));
+		praat_new (thee.transfer(), my name, U"_sr", newlabel);
 	}
 END
 
-FORM (Confusion_groupStimuli, L"Confusion: Group stimuli", L"Confusion: Group stimuli...")
-	SENTENCE (L"Stimuli", L"u i")
-	SENTENCE (L"New label", L"high")
-	INTEGER (L"New label position", L"0")
+FORM (Confusion_groupStimuli, U"Confusion: Group stimuli", U"Confusion: Group stimuli...")
+	SENTENCE (U"Stimuli", U"u i")
+	SENTENCE (U"New label", U"high")
+	INTEGER (U"New label position", U"0")
 	OK
 DO
-	const wchar_t *newlabel = GET_STRING (L"New label");
+	const char32 *newlabel = GET_STRING (U"New label");
 	LOOP {
 		iam (Confusion);
-		praat_new (Confusion_groupStimuli (me, GET_STRING (L"Stimuli"), newlabel,
-		GET_INTEGER (L"New label position")), Thing_getName (me), L"_s", newlabel);
+		autoConfusion thee = Confusion_groupStimuli (me, GET_STRING (U"Stimuli"), newlabel,
+		GET_INTEGER (U"New label position"));
+		praat_new (thee.transfer(), my name, U"_s", newlabel);
 	}
 END
 
-FORM (Confusion_groupResponses, L"Confusion: Group responses", L"Confusion: Group responses...")
-	SENTENCE (L"Responses", L"a i")
-	SENTENCE (L"New label", L"front")
-	INTEGER (L"New label position", L"0")
+FORM (Confusion_groupResponses, U"Confusion: Group responses", U"Confusion: Group responses...")
+	SENTENCE (U"Responses", U"a i")
+	SENTENCE (U"New label", U"front")
+	INTEGER (U"New label position", U"0")
 	OK
 DO
-	const wchar_t *newlabel = GET_STRING (L"New label");
+	const char32 *newlabel = GET_STRING (U"New label");
 	LOOP {
 		iam (Confusion);
-		praat_new (Confusion_groupResponses (me, GET_STRING (L"Responses"), newlabel,
-		GET_INTEGER (L"New label position")), Thing_getName (me), L"_s", newlabel);
+		autoConfusion thee = Confusion_groupResponses (me, GET_STRING (U"Responses"), newlabel,
+		GET_INTEGER (U"New label position"));
+		praat_new (thee.transfer(), my name, U"_s", newlabel);
 	}
 END
 
-FORM (Confusion_drawAsNumbers, L"", L"")
-	BOOLEAN (L"Draw marginals", 1)
-	RADIO (L"Format", 3)
-	RADIOBUTTON (L"decimal")
-	RADIOBUTTON (L"exponential")
-	RADIOBUTTON (L"free")
-	RADIOBUTTON (L"rational")
-	NATURAL (L"Precision", L"5")
+FORM (Confusion_drawAsNumbers, U"", U"")
+	BOOLEAN (U"Draw marginals", 1)
+	RADIO (U"Format", 3)
+	RADIOBUTTON (U"decimal")
+	RADIOBUTTON (U"exponential")
+	RADIOBUTTON (U"free")
+	RADIOBUTTON (U"rational")
+	NATURAL (U"Precision", U"5")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Confusion);
-		Confusion_drawAsNumbers (me, GRAPHICS, GET_INTEGER (L"Draw marginals"),
-		GET_INTEGER (L"Format"), GET_INTEGER (L"Precision"));
+		Confusion_drawAsNumbers (me, GRAPHICS, GET_INTEGER (U"Draw marginals"),
+		GET_INTEGER (U"Format"), GET_INTEGER (U"Precision"));
 	}
 END
 
@@ -929,7 +940,7 @@ DIRECT (Confusion_getFractionCorrect)
 		iam (Confusion);
 		double f; long n;
 		Confusion_getFractionCorrect (me, &f, &n);
-		Melder_information (Melder_double (f), L" (fraction correct)");
+		Melder_information (f, U" (fraction correct)");
 	}
 END
 
@@ -941,58 +952,94 @@ END
 
 /******************* Confusion & Matrix *************************************/
 
-FORM (Confusion_Matrix_draw, L"Confusion & Matrix: Draw confusions with arrows", 0)
-	INTEGER (L"Category position", L"0 (=all)")
-	REAL (L"Lower level (%)", L"0")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (Confusion_Matrix_draw, U"Confusion & Matrix: Draw confusions with arrows", 0)
+	INTEGER (U"Category position", U"0 (=all)")
+	REAL (U"Lower level (%)", U"0")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
-	long categoryPosition = GET_INTEGER (L"Category position");
-	REQUIRE (categoryPosition >= 0, L"Category position must be >= 0")
+	long categoryPosition = GET_INTEGER (U"Category position");
+	REQUIRE (categoryPosition >= 0, U"Category position must be >= 0")
 	Confusion conf = FIRST (Confusion);
 	Matrix mat = FIRST (Matrix);
-	Confusion_Matrix_draw (conf, mat, GRAPHICS, categoryPosition, GET_REAL (L"Lower level"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"));
+	Confusion_Matrix_draw (conf, mat, GRAPHICS, categoryPosition, GET_REAL (U"Lower level"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"));
+END
+
+/**********************ComplexSpectrogram *******************************************/
+
+DIRECT (ComplexSpectrogram_help)
+	Melder_help (U"ComplexSpectrogram_help");
+END
+
+FORM (ComplexSpectrogram_to_Sound, U"ComplexSpectrogram: To Sound", 0)
+	POSITIVE (U"Duration factor", U"1.0")
+	OK
+DO
+	LOOP {
+		iam (ComplexSpectrogram);
+		autoSound thee = ComplexSpectrogram_to_Sound (me, GET_REAL (U"Duration factor"));
+		praat_new (thee.transfer(), my name);
+	}
+END
+
+DIRECT (ComplexSpectrogram_to_Spectrogram)
+	LOOP {
+		iam (ComplexSpectrogram);
+		autoSpectrogram thee = ComplexSpectrogram_to_Spectrogram (me);
+		praat_new (thee.transfer(), my name);
+	}
+END
+
+FORM (ComplexSpectrogram_to_Spectrum, U"ComplexSpectrogram: To Spectrum (slice)", 0)
+	REAL (U"Time (s)", U"0.0")
+	OK
+DO
+	LOOP {
+		iam (ComplexSpectrogram);
+		autoSpectrum thee = ComplexSpectrogram_to_Spectrum (me, GET_REAL (U"Time"));
+		praat_new (thee.transfer(), my name);
+	}
 END
 
 /**********************Correlation *******************************************/
 
 DIRECT (Correlation_help)
-	Melder_help (L"Correlation");
+	Melder_help (U"Correlation");
 END
 
-FORM (Correlation_confidenceIntervals, L"Correlation: Confidence intervals...", L"Correlation: Confidence intervals...")
-	POSITIVE (L"Confidence level (0-1)", L"0.95")
-	INTEGER (L"Number of tests (Bonferroni correction)", L"0")
-	RADIO (L"Approximation", 1)
-	RADIOBUTTON (L"Ruben")
-	RADIOBUTTON (L"Fisher")
+FORM (Correlation_confidenceIntervals, U"Correlation: Confidence intervals...", U"Correlation: Confidence intervals...")
+	POSITIVE (U"Confidence level (0-1)", U"0.95")
+	INTEGER (U"Number of tests (Bonferroni correction)", U"0")
+	RADIO (U"Approximation", 1)
+	RADIOBUTTON (U"Ruben")
+	RADIOBUTTON (U"Fisher")
 	OK
 DO
-	double cl = GET_REAL (L"Confidence level");
-	double numberOfTests = GET_INTEGER (L"Number of tests");
+	double cl = GET_REAL (U"Confidence level");
+	long numberOfTests = GET_INTEGER (U"Number of tests");
 	LOOP {
 		iam (Correlation);
-		praat_new (Correlation_confidenceIntervals (me, cl, numberOfTests, GET_INTEGER (L"Approximation")), L"conf_intervals");
+		praat_new (Correlation_confidenceIntervals (me, cl, numberOfTests, GET_INTEGER (U"Approximation")), U"conf_intervals");
 	}
 END
 
-FORM (Correlation_testDiagonality_bartlett, L"Correlation: Get diagonality (bartlett)", L"SSCP: Get diagonality (bartlett)...")
-	NATURAL (L"Number of contraints", L"1")
+FORM (Correlation_testDiagonality_bartlett, U"Correlation: Get diagonality (bartlett)", U"SSCP: Get diagonality (bartlett)...")
+	NATURAL (U"Number of contraints", U"1")
 	OK
 DO
 	double chisq, p;
-	long nc = GET_INTEGER (L"Number of contraints");
+	long nc = GET_INTEGER (U"Number of contraints");
 	LOOP {
 		iam (Correlation);
 		Correlation_testDiagonality_bartlett (me, nc, &chisq, &p);
-		Melder_information (Melder_double (p), L" (=probability, based on chisq = ",
-		Melder_double (chisq), L"and ndf = ", Melder_integer (my numberOfRows * (my numberOfRows - 1) / 2));
+		Melder_information (p, U" (=probability, based on chisq = ",
+			chisq, U"and ndf = ", my numberOfRows * (my numberOfRows - 1) / 2);
 	}
 END
 
@@ -1006,116 +1053,116 @@ END
 /**********************Covariance *******************************************/
 
 DIRECT (Covariance_help)
-	Melder_help (L"Covariance");
+	Melder_help (U"Covariance");
 END
 
-FORM (Covariance_createSimple, L"Create simple Covariance", L"Create simple Covariance...")
-	WORD (L"Name", L"c")
-	SENTENCE (L"Covariances", L"1.0 0.0 1.0")
-	SENTENCE (L"Centroid", L"0.0 0.0")
-	POSITIVE (L"Number of observations", L"100.0")
+FORM (Covariance_createSimple, U"Create simple Covariance", U"Create simple Covariance...")
+	WORD (U"Name", U"c")
+	SENTENCE (U"Covariances", U"1.0 0.0 1.0")
+	SENTENCE (U"Centroid", U"0.0 0.0")
+	NATURAL (U"Number of observations", U"100")
 	OK
 DO
-	praat_new (Covariance_createSimple (GET_STRING (L"Covariances"), GET_STRING (L"Centroid"),
-		GET_REAL (L"Number of observations")), GET_STRING (L"Name"));
+	praat_new (Covariance_createSimple (GET_STRING (U"Covariances"), GET_STRING (U"Centroid"),
+		GET_INTEGER (U"Number of observations")), GET_STRING (U"Name"));
 END
 
-FORM (Covariance_getProbabilityAtPosition, L"Covariance: Get probability at position", 0)
-	SENTENCE (L"Position", L"10.0 20.0")
+FORM (Covariance_getProbabilityAtPosition, U"Covariance: Get probability at position", 0)
+	SENTENCE (U"Position", U"10.0 20.0")
 	OK
 DO
-	wchar_t *position = GET_STRING (L"Position");
+	char32 *position = GET_STRING (U"Position");
 	LOOP {
 		iam (Covariance);
 		double p = Covariance_getProbabilityAtPosition_string (me, position);
-		Melder_information (Melder_double (p), L" (= probability at position ", position, L")");
+		Melder_information (p, U" (= probability at position ", position, U")");
 	}
 END
 
-FORM (Covariance_getSignificanceOfOneMean, L"Covariance: Get significance of one mean", L"Covariance: Get significance of one mean...")
-	LABEL (L"", L"Get probability that the mean with")
-	NATURAL (L"Index", L"1")
-	LABEL (L"", L"differs from")
-	REAL (L"Value", L"0.0")
-	LABEL (L"", L"(Null hypothesis: the observed difference is due to chance.)")
+FORM (Covariance_getSignificanceOfOneMean, U"Covariance: Get significance of one mean", U"Covariance: Get significance of one mean...")
+	LABEL (U"", U"Get probability that the mean with")
+	NATURAL (U"Index", U"1")
+	LABEL (U"", U"differs from")
+	REAL (U"Value", U"0.0")
+	LABEL (U"", U"(Null hypothesis: the observed difference is due to chance.)")
 	OK
 DO
 	LOOP {
 		iam (Covariance);
 		double t, p; double ndf;
-		Covariance_getSignificanceOfOneMean (me, GET_INTEGER (L"Index"), GET_REAL (L"Value"), &p, &t , &ndf);
-		Melder_information (Melder_double (p), L" (=probability, based on t = ", Melder_double (t), L" and ndf = ", Melder_integer (ndf));
+		Covariance_getSignificanceOfOneMean (me, GET_INTEGER (U"Index"), GET_REAL (U"Value"), &p, &t , &ndf);
+		Melder_information (p, U" (=probability, based on t = ", t, U" and ndf = ", ndf);
 	}
 END
 
-FORM (Covariance_getSignificanceOfMeansDifference, L"Covariance: Get significance of means difference", L"Covariance: Get significance of means difference...")
-	LABEL (L"", L"Get probability that the difference between means")
-	NATURAL (L"Index1", L"1")
-	NATURAL (L"Index2", L"2")
-	LABEL (L"", L"differs from")
-	REAL (L"Value", L"0.0")
-	LABEL (L"", L"when the means are")
-	BOOLEAN (L"Paired", 1)
-	LABEL (L"", L"and have")
-	BOOLEAN (L"Equal variances", 1)
+FORM (Covariance_getSignificanceOfMeansDifference, U"Covariance: Get significance of means difference", U"Covariance: Get significance of means difference...")
+	LABEL (U"", U"Get probability that the difference between means")
+	NATURAL (U"Index1", U"1")
+	NATURAL (U"Index2", U"2")
+	LABEL (U"", U"differs from")
+	REAL (U"Value", U"0.0")
+	LABEL (U"", U"when the means are")
+	BOOLEAN (U"Paired", 1)
+	LABEL (U"", U"and have")
+	BOOLEAN (U"Equal variances", 1)
 	OK
 DO
 	LOOP {
 		iam (Covariance);
 		double t, p; double ndf;
-		Covariance_getSignificanceOfMeansDifference (me, GET_INTEGER (L"Index1"), GET_INTEGER (L"Index2"),
-		GET_REAL (L"Value"), GET_INTEGER (L"Paired"), GET_INTEGER (L"Equal variances"), &p, &t , &ndf);
-		Melder_information (Melder_double (p), L" (=probability, based on t = ",
-		Melder_double (t), L"and ndf = ", Melder_integer (ndf), L")");
+		Covariance_getSignificanceOfMeansDifference (me, GET_INTEGER (U"Index1"), GET_INTEGER (U"Index2"),
+		GET_REAL (U"Value"), GET_INTEGER (U"Paired"), GET_INTEGER (U"Equal variances"), &p, &t , &ndf);
+		Melder_information (p, U" (=probability, based on t = ",
+			t, U"and ndf = ", ndf, U")");
 	}
 END
 
-FORM (Covariance_getSignificanceOfOneVariance, L"Covariance: Get significance of one variance", L"Covariance: Get significance of one variance...")
-	LABEL (L"", L"Get probability that the variance with")
-	NATURAL (L"Index", L"1")
-	LABEL (L"", L"differs from")
-	REAL (L"Value", L"0.0")
-	LABEL (L"", L"(Null hypothesis: the observed difference is due to chance.)")
+FORM (Covariance_getSignificanceOfOneVariance, U"Covariance: Get significance of one variance", U"Covariance: Get significance of one variance...")
+	LABEL (U"", U"Get probability that the variance with")
+	NATURAL (U"Index", U"1")
+	LABEL (U"", U"differs from")
+	REAL (U"Value", U"0.0")
+	LABEL (U"", U"(Null hypothesis: the observed difference is due to chance.)")
 	OK
 DO
 	LOOP {
 		iam (Covariance);
 		double chisq, p; long ndf;
-		Covariance_getSignificanceOfOneVariance (me, GET_INTEGER (L"Index"), GET_REAL (L"Value"), &p, &chisq , &ndf);
-		Melder_information (Melder_double (p), L" (=probability, based on chisq = ", Melder_double (chisq), L"and ndf = ", Melder_integer (ndf));
+		Covariance_getSignificanceOfOneVariance (me, GET_INTEGER (U"Index"), GET_REAL (U"Value"), &p, &chisq , &ndf);
+		Melder_information (p, U" (=probability, based on chisq = ", chisq, U"and ndf = ", ndf);
 	}
 END
 
-FORM (Covariance_getSignificanceOfVariancesRatio, L"Covariance: Get significance of variances ratio", L"Covariance: Get significance of variances ratio...")
-	NATURAL (L"Index1", L"1")
-	NATURAL (L"Index2", L"2")
-	REAL (L"Hypothesized ratio", L"1.0")
+FORM (Covariance_getSignificanceOfVariancesRatio, U"Covariance: Get significance of variances ratio", U"Covariance: Get significance of variances ratio...")
+	NATURAL (U"Index1", U"1")
+	NATURAL (U"Index2", U"2")
+	REAL (U"Hypothesized ratio", U"1.0")
 	OK
 DO
 	LOOP {
 		iam (Covariance);
 		double f, p; long ndf;
-		Covariance_getSignificanceOfVariancesRatio (me, GET_INTEGER (L"Index1"), GET_INTEGER (L"Index2"),
-		GET_REAL (L"Hypothesized ratio"), &p, &f , &ndf);
-		Melder_information (Melder_double (p), L" (=probability, based on F = ", Melder_double (f),
-		L"and ndf1 = ", Melder_integer (ndf), L" and ndf2 = ", Melder_integer (ndf));
+		Covariance_getSignificanceOfVariancesRatio (me, GET_INTEGER (U"Index1"), GET_INTEGER (U"Index2"),
+		GET_REAL (U"Hypothesized ratio"), &p, &f , &ndf);
+		Melder_information (p, U" (=probability, based on F = ", f,
+		U"and ndf1 = ", ndf, U" and ndf2 = ", ndf);
 	}
 END
 
-FORM (Covariance_getFractionVariance, L"Covariance: Get fraction variance", L"Covariance: Get fraction variance...")
-	NATURAL (L"From dimension", L"1")
-	NATURAL (L"To dimension", L"1")
+FORM (Covariance_getFractionVariance, U"Covariance: Get fraction variance", U"Covariance: Get fraction variance...")
+	NATURAL (U"From dimension", U"1")
+	NATURAL (U"To dimension", U"1")
 	OK
 DO
 	LOOP {
 		iam (Covariance);
-		Melder_information (Melder_double (SSCP_getFractionVariation (me, GET_INTEGER (L"From dimension"), GET_INTEGER (L"To dimension"))));
+		Melder_information (SSCP_getFractionVariation (me, GET_INTEGER (U"From dimension"), GET_INTEGER (U"To dimension")));
 	}
 END
 
-FORM (Covariances_reportMultivariateMeanDifference, L"Covariances: Report multivariate mean difference",
-      L"Covariances: Report multivariate mean difference...")
-	BOOLEAN (L"Covariances are equal", 1)
+FORM (Covariances_reportMultivariateMeanDifference, U"Covariances: Report multivariate mean difference",
+      U"Covariances: Report multivariate mean difference...")
+	BOOLEAN (U"Covariances are equal", 1)
 	OK
 DO
 	Covariance c1 = 0, c2 = 0;
@@ -1125,27 +1172,27 @@ DO
 	}
 	Melder_assert (c1 && c2);
 	double prob, fisher, df1, df2, difference;
-	int equalCovariances = GET_INTEGER (L"Covariances are equal");
+	int equalCovariances = GET_INTEGER (U"Covariances are equal");
 	MelderInfo_open ();
 	difference = Covariances_getMultivariateCentroidDifference (c1, c2, equalCovariances, &prob, &fisher, &df1, &df2);
-	MelderInfo_writeLine (L"Under the assumption that the two covariances are", (equalCovariances ? L" " : L" not "), L"equal:");
-	MelderInfo_writeLine (L"Difference between multivariate means = ", Melder_double (difference));
-	MelderInfo_writeLine (L"Fisher's F = ", Melder_double (fisher));
-	MelderInfo_writeLine (L"Significance from zero = ", Melder_double (prob));
-	MelderInfo_writeLine (L"Degrees of freedom = ", Melder_double (df1), L", ", Melder_double (df2));
-	MelderInfo_writeLine (L"(Number of observations = ", Melder_integer (c1->numberOfObservations), L", ",
-		Melder_integer (c2->numberOfObservations));
-	MelderInfo_writeLine (L"Dimension of covariance matrices = ", Melder_integer (c1-> numberOfRows), L")");
+	MelderInfo_writeLine (U"Under the assumption that the two covariances are", (equalCovariances ? U" " : U" not "), U"equal:");
+	MelderInfo_writeLine (U"Difference between multivariate means = ", difference);
+	MelderInfo_writeLine (U"Fisher's F = ", fisher);
+	MelderInfo_writeLine (U"Significance from zero = ", prob);
+	MelderInfo_writeLine (U"Degrees of freedom = ", df1, U", ", df2);
+	MelderInfo_writeLine (U"(Number of observations = ", c1->numberOfObservations, U", ",
+		c2->numberOfObservations);
+	MelderInfo_writeLine (U"Dimension of covariance matrices = ", c1-> numberOfRows, U")");
 	MelderInfo_close ();
 END
 
-FORM (Covariance_to_TableOfReal_randomSampling, L"Covariance: To TableOfReal (random sampling)", L"Covariance: To TableOfReal (random sampling)...")
-	INTEGER (L"Number of data points", L"0")
+FORM (Covariance_to_TableOfReal_randomSampling, U"Covariance: To TableOfReal (random sampling)", U"Covariance: To TableOfReal (random sampling)...")
+	INTEGER (U"Number of data points", U"0")
 	OK
 DO
 	LOOP {
 		iam (Covariance);
-		praat_new (Covariance_to_TableOfReal_randomSampling (me, GET_INTEGER (L"Number of data points")), my name);
+		praat_new (Covariance_to_TableOfReal_randomSampling (me, GET_INTEGER (U"Number of data points")), my name);
 	}
 END
 
@@ -1155,14 +1202,14 @@ DIRECT (Covariances_reportEquality)
 	{
 		double chisq, p, df;
 		Covariances_equality (set.peek(), 1, &p, &chisq, &df);
-		MelderInfo_writeLine (L"Difference between covariance matrices:");
-		MelderInfo_writeLine (L"Significance of difference (bartlett) = ", Melder_double (p));
-		MelderInfo_writeLine (L"Chi-squared = ", Melder_double (chisq));
-		MelderInfo_writeLine (L"Degrees of freedom = ", Melder_double (df));
+		MelderInfo_writeLine (U"Difference between covariance matrices:");
+		MelderInfo_writeLine (U"Significance of difference (bartlett) = ", p);
+		MelderInfo_writeLine (U"Chi-squared = ", chisq);
+		MelderInfo_writeLine (U"Degrees of freedom = ", df);
 		Covariances_equality (set.peek(), 2, &p, &chisq, &df);
-		MelderInfo_writeLine (L"Significance of difference (wald) = ", Melder_double (p));
-		MelderInfo_writeLine (L"Chi-squared = ", Melder_double (chisq));
-		MelderInfo_writeLine (L"Degrees of freedom = ", Melder_double (df));
+		MelderInfo_writeLine (U"Significance of difference (wald) = ", p);
+		MelderInfo_writeLine (U"Chi-squared = ", chisq);
+		MelderInfo_writeLine (U"Degrees of freedom = ", df);
 	}
 	MelderInfo_close ();
 END
@@ -1181,19 +1228,19 @@ DIRECT (Covariance_to_PCA)
 	}
 END
 
-FORM (Covariance_and_TableOfReal_mahalanobis, L"Covariance & TableOfReal: To TableOfReal (mahalanobis)", L"Covariance & TableOfReal: To TableOfReal (mahalanobis)...")
-	BOOLEAN (L"Centroid from table", 0)
+FORM (Covariance_and_TableOfReal_mahalanobis, U"Covariance & TableOfReal: To TableOfReal (mahalanobis)", U"Covariance & TableOfReal: To TableOfReal (mahalanobis)...")
+	BOOLEAN (U"Centroid from table", 0)
 	OK
 DO
 	Covariance cov = FIRST (Covariance);
 	TableOfReal tr = FIRST (TableOfReal);
-	praat_new (Covariance_and_TableOfReal_mahalanobis (cov, tr, GET_INTEGER (L"Centroid from table")), L"mahalanobis");
+	praat_new (Covariance_and_TableOfReal_mahalanobis (cov, tr, GET_INTEGER (U"Centroid from table")), U"mahalanobis");
 END
 
 /********************** Discriminant **********************************/
 
 DIRECT (Discriminant_help)
-	Melder_help (L"Discriminant");
+	Melder_help (U"Discriminant");
 END
 
 DIRECT (Discriminant_setGroupLabels)
@@ -1203,93 +1250,95 @@ DIRECT (Discriminant_setGroupLabels)
 	praat_dataChanged (me);
 END
 
-FORM (Discriminant_and_Pattern_to_Categories, L"Discriminant & Pattern: To Categories", L"Discriminant & Pattern: To Categories...")
-	BOOLEAN (L"Pool covariance matrices", 1)
-	BOOLEAN (L"Use apriori probabilities", 1)
+FORM (Discriminant_and_Pattern_to_Categories, U"Discriminant & Pattern: To Categories", U"Discriminant & Pattern: To Categories...")
+	BOOLEAN (U"Pool covariance matrices", 1)
+	BOOLEAN (U"Use apriori probabilities", 1)
 	OK
 DO
 	Discriminant me = FIRST (Discriminant);
 	Pattern pat = FIRST (Pattern);
-	praat_new (Discriminant_and_Pattern_to_Categories (me, pat, GET_INTEGER (L"Pool covariance matrices"),
-		GET_INTEGER (L"Use apriori probabilities")), my name, L"_", pat->name);
+	autoCategories thee = Discriminant_and_Pattern_to_Categories (me, pat, GET_INTEGER (U"Pool covariance matrices"), GET_INTEGER (U"Use apriori probabilities"));
+	praat_new (thee.transfer(), my name, U"_", pat->name);
 END
 
-FORM (Discriminant_and_TableOfReal_to_Configuration, L"Discriminant & TableOfReal: To Configuration", L"Discriminant & TableOfReal: To Configuration...")
-		INTEGER (L"Number of dimensions", L"0")
+FORM (Discriminant_and_TableOfReal_to_Configuration, U"Discriminant & TableOfReal: To Configuration", U"Discriminant & TableOfReal: To Configuration...")
+		INTEGER (U"Number of dimensions", U"0")
 		OK
 DO
-	long dimension = GET_INTEGER (L"Number of dimensions");
-	REQUIRE (dimension >= 0, L"Number of dimensions must be greater equal zero.")
+	long dimension = GET_INTEGER (U"Number of dimensions");
+	REQUIRE (dimension >= 0, U"Number of dimensions must be greater equal zero.")
 	Discriminant me = FIRST (Discriminant);
 	TableOfReal tr = FIRST_GENERIC (TableOfReal);
-	praat_new (Discriminant_and_TableOfReal_to_Configuration (me, tr, dimension), my name, L"_", tr->name);
+	autoConfiguration thee = Discriminant_and_TableOfReal_to_Configuration (me, tr, dimension);
+	praat_new (thee.transfer(), my name, U"_", tr->name);
 END
 
 DIRECT (hint_Discriminant_and_TableOfReal_to_ClassificationTable)
-	Melder_information (L"You can use the Discriminant as a classifier by \nselecting a Discriminant and a TableOfReal object together.");
+	Melder_information (U"You can use the Discriminant as a classifier by \nselecting a Discriminant and a TableOfReal object together.");
 END
 
-FORM (Discriminant_and_TableOfReal_to_ClassificationTable, L"Discriminant & TableOfReal: To ClassificationTable", L"Discriminant & TableOfReal: To ClassificationTable...")
-	BOOLEAN (L"Pool covariance matrices", 1)
-	BOOLEAN (L"Use apriori probabilities", 1)
+FORM (Discriminant_and_TableOfReal_to_ClassificationTable, U"Discriminant & TableOfReal: To ClassificationTable", U"Discriminant & TableOfReal: To ClassificationTable...")
+	BOOLEAN (U"Pool covariance matrices", 1)
+	BOOLEAN (U"Use apriori probabilities", 1)
 	OK
 DO
 	Discriminant me = FIRST (Discriminant);
 	TableOfReal tr = FIRST_GENERIC (TableOfReal);
-	praat_new (Discriminant_and_TableOfReal_to_ClassificationTable (me, tr,
-		GET_INTEGER (L"Pool covariance matrices"), GET_INTEGER (L"Use apriori probabilities")),
-		my name, L"_", tr->name);
+	autoClassificationTable thee = Discriminant_and_TableOfReal_to_ClassificationTable (me, tr,
+		GET_INTEGER (U"Pool covariance matrices"), GET_INTEGER (U"Use apriori probabilities"));
+	praat_new (thee.transfer(), my name, U"_", tr->name);
 END
 
-FORM (Discriminant_and_TableOfReal_mahalanobis, L"Discriminant & TableOfReal: To TableOfReal (mahalanobis)", L"Discriminant & TableOfReal: To TableOfReal (mahalanobis)...")
-	SENTENCE (L"Group label", L"")
-	BOOLEAN (L"Pool covariance matrices", 0)
+FORM (Discriminant_and_TableOfReal_mahalanobis, U"Discriminant & TableOfReal: To TableOfReal (mahalanobis)", U"Discriminant & TableOfReal: To TableOfReal (mahalanobis)...")
+	SENTENCE (U"Group label", U"")
+	BOOLEAN (U"Pool covariance matrices", 0)
 	OK
 DO
 	Discriminant me = FIRST (Discriminant);
 	TableOfReal tr = FIRST (TableOfReal);
-	long group = Discriminant_groupLabelToIndex (me, GET_STRING (L"Group label"));
-	REQUIRE (group > 0, L"Group label does not exist.")
-	praat_new (Discriminant_and_TableOfReal_mahalanobis (me, tr, group, GET_INTEGER (L"Pool covariance matrices")), L"mahalanobis");
+	long group = Discriminant_groupLabelToIndex (me, GET_STRING (U"Group label"));
+	REQUIRE (group > 0, U"Group label does not exist.")
+	autoTableOfReal thee = Discriminant_and_TableOfReal_mahalanobis (me, tr, group, GET_INTEGER (U"Pool covariance matrices"));
+	praat_new (thee.transfer(), U"mahalanobis");
 END
 
-FORM (Discriminant_getWilksLambda, L"Discriminant: Get Wilks' lambda", L"Discriminant: Get Wilks' lambda...")
-	LABEL (L"", L"Product (i=from..numberOfEigenvalues, 1 / (1 + eigenvalue[i]))")
-	INTEGER (L"From", L"1")
+FORM (Discriminant_getWilksLambda, U"Discriminant: Get Wilks' lambda", U"Discriminant: Get Wilks' lambda...")
+	LABEL (U"", U"Product (i=from..numberOfEigenvalues, 1 / (1 + eigenvalue[i]))")
+	INTEGER (U"From", U"1")
 	OK
 DO
-	long from = GET_INTEGER (L"From");
-	REQUIRE (from >= 1, L"Number must be greater than or equal to one.")
+	long from = GET_INTEGER (U"From");
+	REQUIRE (from >= 1, U"Number must be greater than or equal to one.")
 	LOOP {
 		iam (Discriminant);
-		Melder_information (Melder_double (Discriminant_getWilksLambda (me, from)));
+		Melder_information (Discriminant_getWilksLambda (me, from));
 	}
 END
 
-FORM (Discriminant_getCumulativeContributionOfComponents, L"Discriminant: Get cumulative contribution of components", L"Eigen: Get cumulative contribution of components...")
-	NATURAL (L"From component", L"1")
-	NATURAL (L"To component", L"1")
+FORM (Discriminant_getCumulativeContributionOfComponents, U"Discriminant: Get cumulative contribution of components", U"Eigen: Get cumulative contribution of components...")
+	NATURAL (U"From component", U"1")
+	NATURAL (U"To component", U"1")
 	OK
 DO
 	LOOP {
 		iam (Discriminant);
-		Melder_information (Melder_double (Eigen_getCumulativeContributionOfComponents (me,
-		GET_INTEGER (L"From component"), GET_INTEGER (L"To component"))));
+		Melder_information (Eigen_getCumulativeContributionOfComponents (me,
+		GET_INTEGER (U"From component"), GET_INTEGER (U"To component")));
 	}
 END
 
 
-FORM (Discriminant_getPartialDiscriminationProbability, L"Discriminant: Get partial discrimination probability", L"Discriminant: Get partial discrimination probability...")
-	INTEGER (L"Number of dimensions", L"1")
+FORM (Discriminant_getPartialDiscriminationProbability, U"Discriminant: Get partial discrimination probability", U"Discriminant: Get partial discrimination probability...")
+	INTEGER (U"Number of dimensions", U"1")
 	OK
 DO
-	long ndf, n = GET_INTEGER (L"Number of dimensions");
+	long ndf, n = GET_INTEGER (U"Number of dimensions");
 	double chisq, p;
-	REQUIRE (n >= 0, L"Number of dimensions must be greater than or equal to zero.")
+	REQUIRE (n >= 0, U"Number of dimensions must be greater than or equal to zero.")
 	LOOP {
 		iam (Discriminant);
 		Discriminant_getPartialDiscriminationProbability (me, n, &p, &chisq, &ndf);
-		Melder_information (Melder_double (p), L" (=probability, based on chisq = ", Melder_double (chisq), L"and ndf = ", Melder_integer (ndf));
+		Melder_information (p, U" (=probability, based on chisq = ", chisq, U"and ndf = ", ndf);
 	}
 END
 
@@ -1298,8 +1347,8 @@ DIRECT (Discriminant_getHomegeneityOfCovariances_box)
 		iam (Discriminant);
 		double chisq, p; long ndf;
 		SSCPs_getHomegeneityOfCovariances_box ( (SSCPs) my groups, &p, &chisq, &ndf);
-		Melder_information (Melder_double (p), L" (=probability, based on chisq = ",
-		Melder_double (chisq), L"and ndf = ", Melder_integer (ndf));
+		Melder_information (p, U" (=probability, based on chisq = ",
+		chisq, U"and ndf = ", ndf);
 	}
 END
 
@@ -1309,304 +1358,310 @@ DIRECT (Discriminant_reportEqualityOfCovariances_wald)
 		iam (Discriminant);
 		double chisq, prob, df;
 		Covariances_equality ( (Collection) my groups, 2, &prob, &chisq, &df);
-		MelderInfo_writeLine (L"Wald test for equality of covariance matrices:");
-		MelderInfo_writeLine (L"Chi squared: ", Melder_double (chisq));
-		MelderInfo_writeLine (L"Significance: ", Melder_double (prob));
-		MelderInfo_writeLine (L"Degrees of freedom: ", Melder_double (df));
-		MelderInfo_writeLine (L"Number of matrices: ", Melder_integer (my groups -> size));
+		MelderInfo_writeLine (U"Wald test for equality of covariance matrices:");
+		MelderInfo_writeLine (U"Chi squared: ", chisq);
+		MelderInfo_writeLine (U"Significance: ", prob);
+		MelderInfo_writeLine (U"Degrees of freedom: ", df);
+		MelderInfo_writeLine (U"Number of matrices: ", my groups -> size);
 	}
 	MelderInfo_close ();
 END
 
-FORM (Discriminant_getConcentrationEllipseArea, L"Discriminant: Get concentration ellipse area", L"Discriminant: Get concentration ellipse area...")
-	SENTENCE (L"Group label", L"")
-	POSITIVE (L"Number of sigmas", L"1.0")
-	BOOLEAN (L"Discriminant plane", 1)
-	INTEGER (L"X-dimension", L"1")
-	INTEGER (L"Y-dimension", L"2")
+FORM (Discriminant_getConcentrationEllipseArea, U"Discriminant: Get concentration ellipse area", U"Discriminant: Get concentration ellipse area...")
+	SENTENCE (U"Group label", U"")
+	POSITIVE (U"Number of sigmas", U"1.0")
+	BOOLEAN (U"Discriminant plane", 1)
+	INTEGER (U"X-dimension", U"1")
+	INTEGER (U"Y-dimension", U"2")
 	OK
 DO
 	LOOP {
 		iam (Discriminant);
-		long group = Discriminant_groupLabelToIndex (me, GET_STRING (L"Group label"));
-		REQUIRE (group > 0, L"Group label does not exist.")
-		Melder_information (Melder_double (Discriminant_getConcentrationEllipseArea (me, group,
-		GET_REAL (L"Number of sigmas"), 0, GET_INTEGER (L"Discriminant plane"),
-		GET_INTEGER (L"X-dimension"), GET_INTEGER (L"Y-dimension"))));
+		long group = Discriminant_groupLabelToIndex (me, GET_STRING (U"Group label"));
+		REQUIRE (group > 0, U"Group label does not exist.")
+		Melder_information (Discriminant_getConcentrationEllipseArea (me, group,
+		GET_REAL (U"Number of sigmas"), 0, GET_INTEGER (U"Discriminant plane"),
+		GET_INTEGER (U"X-dimension"), GET_INTEGER (U"Y-dimension")));
 	}
 END
 
-FORM (Discriminant_getConfidenceEllipseArea, L"Discriminant: Get confidence ellipse area", L"Discriminant: Get confidence ellipse area...")
-	SENTENCE (L"Group label", L"")
-	POSITIVE (L"Confidence level (0-1)", L"0.95")
-	BOOLEAN (L"Discriminant plane", 1)
-	INTEGER (L"X-dimension", L"1")
-	INTEGER (L"Y-dimension", L"2")
+FORM (Discriminant_getConfidenceEllipseArea, U"Discriminant: Get confidence ellipse area", U"Discriminant: Get confidence ellipse area...")
+	SENTENCE (U"Group label", U"")
+	POSITIVE (U"Confidence level (0-1)", U"0.95")
+	BOOLEAN (U"Discriminant plane", 1)
+	INTEGER (U"X-dimension", U"1")
+	INTEGER (U"Y-dimension", U"2")
 	OK
 DO
 	LOOP {
 		iam (Discriminant);
-		long group = Discriminant_groupLabelToIndex (me, GET_STRING (L"Group label"));
-		REQUIRE (group > 0, L"Group label does not exist.")
-		Melder_information (Melder_double (Discriminant_getConcentrationEllipseArea (me, group,
-		GET_REAL (L"Confidence level"), 1, GET_INTEGER (L"Discriminant plane"),
-		GET_INTEGER (L"X-dimension"), GET_INTEGER (L"Y-dimension"))));
+		long group = Discriminant_groupLabelToIndex (me, GET_STRING (U"Group label"));
+		REQUIRE (group > 0, U"Group label does not exist.")
+		Melder_information (Discriminant_getConcentrationEllipseArea (me, group,
+		GET_REAL (U"Confidence level"), 1, GET_INTEGER (U"Discriminant plane"),
+		GET_INTEGER (U"X-dimension"), GET_INTEGER (U"Y-dimension")));
 	}
 END
 
-FORM (Discriminant_getLnDeterminant_group, L"Discriminant: Get determinant (group)", L"Discriminant: Get determinant (group)...")
-	SENTENCE (L"Group label", L"")
+FORM (Discriminant_getLnDeterminant_group, U"Discriminant: Get determinant (group)", U"Discriminant: Get determinant (group)...")
+	SENTENCE (U"Group label", U"")
 	OK
 DO
 	LOOP {
 		iam (Discriminant);
-		long group = Discriminant_groupLabelToIndex (me, GET_STRING (L"Group label"));
-		REQUIRE (group > 0, L"Group label does not exist.")
-		Melder_information (Melder_double (Discriminant_getLnDeterminant_group (me, group)));
+		long group = Discriminant_groupLabelToIndex (me, GET_STRING (U"Group label"));
+		REQUIRE (group > 0, U"Group label does not exist.")
+		Melder_information (Discriminant_getLnDeterminant_group (me, group));
 	}
 END
 
 DIRECT (Discriminant_getLnDeterminant_total)
 	LOOP {
 		iam (Discriminant);
-		Melder_information (Melder_double (Discriminant_getLnDeterminant_total (me)));
+		Melder_information (Discriminant_getLnDeterminant_total (me));
 	}
 END
 
-FORM (Discriminant_invertEigenvector, L"Discriminant: Invert eigenvector", 0)
-	NATURAL (L"Index of eigenvector", L"1")
+FORM (Discriminant_invertEigenvector, U"Discriminant: Invert eigenvector", 0)
+	NATURAL (U"Index of eigenvector", U"1")
 	OK
 DO
 	LOOP {
 		iam (Discriminant);
-		Eigen_invertEigenvector (me, GET_INTEGER (L"Index of eigenvector"));
+		Eigen_invertEigenvector (me, GET_INTEGER (U"Index of eigenvector"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Discriminant_drawSigmaEllipses, L"Discriminant: Draw sigma ellipses", L"Discriminant: Draw sigma ellipses...")
-	POSITIVE (L"Number of sigmas", L"1.0")
-	BOOLEAN (L"Discriminant plane", 1)
-	INTEGER (L"X-dimension", L"1")
-	INTEGER (L"Y-dimension", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	INTEGER (L"Label size", L"12")
-	BOOLEAN (L"Garnish", 1)
+FORM (Discriminant_drawSigmaEllipses, U"Discriminant: Draw sigma ellipses", U"Discriminant: Draw sigma ellipses...")
+	POSITIVE (U"Number of sigmas", U"1.0")
+	BOOLEAN (U"Discriminant plane", 1)
+	INTEGER (U"X-dimension", U"1")
+	INTEGER (U"Y-dimension", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	INTEGER (U"Label size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Discriminant);
-		Discriminant_drawConcentrationEllipses (me, GRAPHICS, GET_REAL (L"Number of sigmas"), 0, 0,
-		GET_INTEGER (L"Discriminant plane"), GET_INTEGER (L"X-dimension"), GET_INTEGER (L"Y-dimension"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
+		Discriminant_drawConcentrationEllipses (me, GRAPHICS, GET_REAL (U"Number of sigmas"), 0, 0,
+		GET_INTEGER (U"Discriminant plane"), GET_INTEGER (U"X-dimension"), GET_INTEGER (U"Y-dimension"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Discriminant_drawOneSigmaEllipse, L"Discriminant: Draw one sigma ellipse", L"Discriminant: Draw one sigma ellipse...")
-	SENTENCE (L"Label", L"")
-	POSITIVE (L"Number of sigmas", L"1.0")
-	BOOLEAN (L"Discriminant plane", 1)
-	INTEGER (L"X-dimension", L"1")
-	INTEGER (L"Y-dimension", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	INTEGER (L"Label size", L"12")
-	BOOLEAN (L"Garnish", 1)
+FORM (Discriminant_drawOneSigmaEllipse, U"Discriminant: Draw one sigma ellipse", U"Discriminant: Draw one sigma ellipse...")
+	SENTENCE (U"Label", U"")
+	POSITIVE (U"Number of sigmas", U"1.0")
+	BOOLEAN (U"Discriminant plane", 1)
+	INTEGER (U"X-dimension", U"1")
+	INTEGER (U"Y-dimension", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	INTEGER (U"Label size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Discriminant);
-		Discriminant_drawConcentrationEllipses (me, GRAPHICS, GET_REAL (L"Number of sigmas"), 0,
-		GET_STRING (L"Label"), GET_INTEGER (L"Discriminant plane"),
-		GET_INTEGER (L"X-dimension"), GET_INTEGER (L"Y-dimension"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
+		Discriminant_drawConcentrationEllipses (me, GRAPHICS, GET_REAL (U"Number of sigmas"), 0,
+		GET_STRING (U"Label"), GET_INTEGER (U"Discriminant plane"),
+		GET_INTEGER (U"X-dimension"), GET_INTEGER (U"Y-dimension"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Discriminant_drawConfidenceEllipses, L"Discriminant: Draw confidence ellipses", 0)
-	POSITIVE (L"Confidence level (0-1)", L"0.95")
-	BOOLEAN (L"Discriminant plane", 1)
-	INTEGER (L"X-dimension", L"1")
-	INTEGER (L"Y-dimension", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	INTEGER (L"Label size", L"12")
-	BOOLEAN (L"Garnish", 1)
+FORM (Discriminant_drawConfidenceEllipses, U"Discriminant: Draw confidence ellipses", 0)
+	POSITIVE (U"Confidence level (0-1)", U"0.95")
+	BOOLEAN (U"Discriminant plane", 1)
+	INTEGER (U"X-dimension", U"1")
+	INTEGER (U"Y-dimension", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	INTEGER (U"Label size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Discriminant);
 		Discriminant_drawConcentrationEllipses (me, GRAPHICS,
-		GET_REAL (L"Confidence level"), 1, NULL, GET_INTEGER (L"Discriminant plane"),
-		GET_INTEGER (L"X-dimension"), GET_INTEGER (L"Y-dimension"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
+		GET_REAL (U"Confidence level"), 1, nullptr, GET_INTEGER (U"Discriminant plane"),
+		GET_INTEGER (U"X-dimension"), GET_INTEGER (U"Y-dimension"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 
-FORM (Discriminant_drawOneConfidenceEllipse, L"Discriminant: Draw one confidence ellipse", 0)
-	SENTENCE (L"Label", L"")
-	POSITIVE (L"Confidence level (0-1)", L"0.95")
-	BOOLEAN (L"Discriminant plane", 1)
-	INTEGER (L"X-dimension", L"1")
-	INTEGER (L"Y-dimension", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	INTEGER (L"Label size", L"12")
-	BOOLEAN (L"Garnish", 1)
+FORM (Discriminant_drawOneConfidenceEllipse, U"Discriminant: Draw one confidence ellipse", 0)
+	SENTENCE (U"Label", U"")
+	POSITIVE (U"Confidence level (0-1)", U"0.95")
+	BOOLEAN (U"Discriminant plane", 1)
+	INTEGER (U"X-dimension", U"1")
+	INTEGER (U"Y-dimension", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	INTEGER (U"Label size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Discriminant);
 		Discriminant_drawConcentrationEllipses (me, GRAPHICS,
-		GET_REAL (L"Confidence level"), 1, GET_STRING (L"Label"), GET_INTEGER (L"Discriminant plane"),
-		GET_INTEGER (L"X-dimension"), GET_INTEGER (L"Y-dimension"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
+		GET_REAL (U"Confidence level"), 1, GET_STRING (U"Label"), GET_INTEGER (U"Discriminant plane"),
+		GET_INTEGER (U"X-dimension"), GET_INTEGER (U"Y-dimension"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (Discriminant_extractBetweenGroupsSSCP)
 	LOOP {
 		iam (Discriminant);
-		praat_new (Discriminant_extractBetweenGroupsSSCP (me), 0);
+		autoSSCP thee = Discriminant_extractBetweenGroupsSSCP (me);
+		praat_new (thee.transfer());
 	}
 END
 
 DIRECT (Discriminant_extractGroupCentroids)
 	LOOP {
 		iam (Discriminant);
-		praat_new (Discriminant_extractGroupCentroids (me), L"centroids");
+		autoTableOfReal thee = Discriminant_extractGroupCentroids (me);
+		praat_new (thee.transfer(), U"centroids");
 	}
 END
 
 DIRECT (Discriminant_extractGroupStandardDeviations)
 	LOOP {
 		iam (Discriminant);
-		praat_new (Discriminant_extractGroupStandardDeviations (me), L"group_stddevs");
+		autoTableOfReal thee = Discriminant_extractGroupStandardDeviations (me);
+		praat_new (thee.transfer(), U"group_stddevs");
 	}
 END
 
 DIRECT (Discriminant_extractGroupLabels)
 	LOOP {
 		iam (Discriminant);
-		praat_new (Discriminant_extractGroupLabels (me), L"group_labels");
+		autoStrings thee = Discriminant_extractGroupLabels (me);
+		praat_new (thee.transfer(), U"group_labels");
 	}
 END
 
 DIRECT (Discriminant_extractPooledWithinGroupsSSCP)
 	LOOP {
 		iam (Discriminant);
-		praat_new (Discriminant_extractPooledWithinGroupsSSCP (me), L"pooled_within");
+		autoSSCP thee = Discriminant_extractPooledWithinGroupsSSCP (me);
+		praat_new (thee.transfer(), U"pooled_within");
 	}
 END
 
-FORM (Discriminant_extractWithinGroupSSCP, L"Discriminant: Extract within-group SSCP", L"Discriminant: Extract within-group SSCP...")
-	NATURAL (L"Group index", L"1")
+FORM (Discriminant_extractWithinGroupSSCP, U"Discriminant: Extract within-group SSCP", U"Discriminant: Extract within-group SSCP...")
+	NATURAL (U"Group index", U"1")
 	OK
 DO
-	long index = GET_INTEGER (L"Group index");
+	long index = GET_INTEGER (U"Group index");
 	LOOP {
 		iam (Discriminant);
-		praat_new (Discriminant_extractWithinGroupSSCP (me, index), my name, L"_g", Melder_integer (index));
+		autoSSCP thee = Discriminant_extractWithinGroupSSCP (me, index);
+		praat_new (thee.transfer(), my name, U"_g", index);
 	}
 END
 
 DIRECT (Discriminant_getNumberOfFunctions)
 	LOOP {
 		iam (Discriminant);
-		Melder_information (Melder_integer (Discriminant_getNumberOfFunctions (me)));
+		Melder_information (Discriminant_getNumberOfFunctions (me));
 	}
 END
 
 DIRECT (Discriminant_getDimensionOfFunctions)
 	LOOP {
 		iam (Discriminant);
-		Melder_information (Melder_integer (Eigen_getDimensionOfComponents (me)));
+		Melder_information (Eigen_getDimensionOfComponents (me));
 	}
 END
 
 DIRECT (Discriminant_getNumberOfGroups)
 	LOOP {
 		iam (Discriminant);
-		Melder_information (Melder_integer (Discriminant_getNumberOfGroups (me)));
+		Melder_information (Discriminant_getNumberOfGroups (me));
 	}
 END
 
-FORM (Discriminant_getNumberOfObservations, L"Discriminant: Get number of observations", L"Discriminant: Get number of observations...")
-	INTEGER (L"Group", L"0 (=total)")
+FORM (Discriminant_getNumberOfObservations, U"Discriminant: Get number of observations", U"Discriminant: Get number of observations...")
+	INTEGER (U"Group", U"0 (=total)")
 	OK
 DO
 	LOOP {
 		iam (Discriminant);
-		Melder_information (Melder_integer (Discriminant_getNumberOfObservations (me, GET_INTEGER (L"Group"))));
+		Melder_information (Discriminant_getNumberOfObservations (me, GET_INTEGER (U"Group")));
 	}
 END
 
 
 /********************** DTW *******************************************/
 
-FORM (DTW_and_Polygon_findPathInside, L"DTW & Polygon: Find path inside", 0)
-    RADIO (L"Slope constraint", 1)
-    RADIOBUTTON (L"no restriction")
-    RADIOBUTTON (L"1/3 < slope < 3")
-    RADIOBUTTON (L"1/2 < slope < 2")
-    RADIOBUTTON (L"2/3 < slope < 3/2")
+FORM (DTW_and_Polygon_findPathInside, U"DTW & Polygon: Find path inside", 0)
+    RADIO (U"Slope constraint", 1)
+    RADIOBUTTON (U"no restriction")
+    RADIOBUTTON (U"1/3 < slope < 3")
+    RADIOBUTTON (U"1/2 < slope < 2")
+    RADIOBUTTON (U"2/3 < slope < 3/2")
     OK
 DO
-    int localSlope = GET_INTEGER (L"Slope constraint");
+    int localSlope = GET_INTEGER (U"Slope constraint");
     DTW me = FIRST (DTW);
     Polygon thee = FIRST (Polygon);
     DTW_and_Polygon_findPathInside (me, thee, localSlope, 0);
 
 END
 
-FORM (DTW_and_Polygon_to_Matrix_cummulativeDistances, L"DTW & Polygon: To Matrix (cumm. distances)", 0)
-    RADIO (L"Slope constraint", 1)
-    RADIOBUTTON (L"no restriction")
-    RADIOBUTTON (L"1/3 < slope < 3")
-    RADIOBUTTON (L"1/2 < slope < 2")
-    RADIOBUTTON (L"2/3 < slope < 3/2")
+FORM (DTW_and_Polygon_to_Matrix_cummulativeDistances, U"DTW & Polygon: To Matrix (cumm. distances)", 0)
+    RADIO (U"Slope constraint", 1)
+    RADIOBUTTON (U"no restriction")
+    RADIOBUTTON (U"1/3 < slope < 3")
+    RADIOBUTTON (U"1/2 < slope < 2")
+    RADIOBUTTON (U"2/3 < slope < 3/2")
     OK
 DO
-    int localSlope = GET_INTEGER (L"Slope constraint");
+    int localSlope = GET_INTEGER (U"Slope constraint");
     DTW me = FIRST (DTW);
     Polygon thee = FIRST (Polygon);
     autoMatrix him = DTW_and_Polygon_to_Matrix_cummulativeDistances (me, thee, localSlope);
-    praat_new (him.transfer(), my name, L"_", Melder_integer (localSlope));
+    praat_new (him.transfer(), my name, U"_", localSlope);
 END
 
-FORM (DTW_and_Sounds_draw, L"DTW & Sounds: Draw", L"DTW & Sounds: Draw...")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (DTW_and_Sounds_draw, U"DTW & Sounds: Draw", U"DTW & Sounds: Draw...")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	Sound s1 = 0, s2 = 0; DTW dtw = 0;
 	LOOP {
-		iam (Data);
+		iam (Daata);
 		if (CLASS == classSound) {
 			(s1 ? s2 : s1) = (Sound) me;
 		} else if (CLASS == classDTW) {
@@ -1615,18 +1670,18 @@ DO
 	}
 	Melder_assert (s1 && s2 && dtw);
 	autoPraatPicture picture;
-	DTW_and_Sounds_draw (dtw, s2, s1, GRAPHICS, GET_REAL (L"left Horizontal range"),
-		GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Garnish"));
+	DTW_and_Sounds_draw (dtw, s2, s1, GRAPHICS, GET_REAL (U"left Horizontal range"),
+		GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Garnish"));
 END
 
-FORM (DTW_and_Sounds_drawWarpX, L"DTW & Sounds: Draw warp (x)", L"DTW & Sounds: Draw warp (x)...")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	REAL (L"Time (s)", L"0.1")
-	BOOLEAN (L"Garnish", 1)
+FORM (DTW_and_Sounds_drawWarpX, U"DTW & Sounds: Draw warp (x)", U"DTW & Sounds: Draw warp (x)...")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	REAL (U"Time (s)", U"0.1")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	Sound s1 = 0, s2 = 0;
@@ -1638,286 +1693,286 @@ DO
 	DTW dtw = FIRST (DTW);
 	autoPraatPicture picture;
 	DTW_and_Sounds_drawWarpX (dtw, s2, s1, GRAPHICS,
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_REAL (L"Time"), GET_INTEGER (L"Garnish"));
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_REAL (U"Time"), GET_INTEGER (U"Garnish"));
 END
 
-void DTW_constraints_addCommonFields (void *dia) {
+void DTW_constraints_addCommonFields (UiForm dia) {
 	Any radio;
-	LABEL (L"", L"Boundary conditions")
-	BOOLEAN (L"Match begin positions", 0)
-	BOOLEAN (L"Match end positions", 0)
-	RADIO (L"Slope constraint", 1)
-	RADIOBUTTON (L"no restriction")
-	RADIOBUTTON (L"1/3 < slope < 3")
-	RADIOBUTTON (L"1/2 < slope < 2")
-	RADIOBUTTON (L"2/3 < slope < 3/2")
+	LABEL (U"", U"Boundary conditions")
+	BOOLEAN (U"Match begin positions", 0)
+	BOOLEAN (U"Match end positions", 0)
+	RADIO (U"Slope constraint", 1)
+	RADIOBUTTON (U"no restriction")
+	RADIOBUTTON (U"1/3 < slope < 3")
+	RADIOBUTTON (U"1/2 < slope < 2")
+	RADIOBUTTON (U"2/3 < slope < 3/2")
 }
 
-void DTW_constraints_getCommonFields (void *dia, int *begin, int *end, int *slope) {
-	*begin = GET_INTEGER (L"Match begin positions");
-	*end = GET_INTEGER (L"Match end positions");
-	*slope = GET_INTEGER (L"Slope constraint");
+void DTW_constraints_getCommonFields (UiForm dia, int *begin, int *end, int *slope) {
+	*begin = GET_INTEGER (U"Match begin positions");
+	*end = GET_INTEGER (U"Match end positions");
+	*slope = GET_INTEGER (U"Slope constraint");
 }
 
-DIRECT (DTW_help) Melder_help (L"DTW"); END
+DIRECT (DTW_help) Melder_help (U"DTW"); END
 
-FORM (DTW_drawPath, L"DTW: Draw path", 0)
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 0);
+FORM (DTW_drawPath, U"DTW: Draw path", 0)
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 0);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (DTW);
-		DTW_drawPath (me, GRAPHICS, GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"));
+		DTW_drawPath (me, GRAPHICS, GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (DTW_drawDistancesAlongPath, L"DTW: Draw distances along path", 0)
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 0);
+FORM (DTW_drawDistancesAlongPath, U"DTW: Draw distances along path", 0)
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 0);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (DTW);
-		DTW_drawDistancesAlongPath (me, GRAPHICS, GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"));
+		DTW_drawDistancesAlongPath (me, GRAPHICS, GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (DTW_paintDistances, L"DTW: Paint distances", 0)
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0")
-	BOOLEAN (L"Garnish", 0);
+FORM (DTW_paintDistances, U"DTW: Paint distances", 0)
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0")
+	BOOLEAN (U"Garnish", 0);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (DTW);
-		DTW_paintDistances (me, GRAPHICS, GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_REAL (L"Minimum"), GET_REAL (L"Maximum"), GET_INTEGER (L"Garnish"));
+		DTW_paintDistances (me, GRAPHICS, GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_REAL (U"Minimum"), GET_REAL (U"Maximum"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (DTW_drawWarpX, L"DTW: Draw warp (x)", L"DTW: Draw warp (x)...")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	REAL (L"Time (s)", L"0.1")
-	BOOLEAN (L"Garnish", 0);
+FORM (DTW_drawWarpX, U"DTW: Draw warp (x)", U"DTW: Draw warp (x)...")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	REAL (U"Time (s)", U"0.1")
+	BOOLEAN (U"Garnish", 0);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (DTW);
-		DTW_drawWarpX (me, GRAPHICS, GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_REAL (L"Time"), GET_INTEGER (L"Garnish"));
+		DTW_drawWarpX (me, GRAPHICS, GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_REAL (U"Time"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (DTW_getStartTimeX)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (my xmin), L" s (= start time along x)");
+		Melder_information (my xmin, U" s (= start time along x)");
 	}
 END
 
 DIRECT (DTW_getEndTimeX)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (my xmax), L" s (= end time along x)");
+		Melder_information (my xmax, U" s (= end time along x)");
 	}
 END
 
 DIRECT (DTW_getTotalDurationX)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (my xmax - my xmin), L" s (= total duration along x)");
+		Melder_information (my xmax - my xmin, U" s (= total duration along x)");
 	}
 END
 
 DIRECT (DTW_getStartTimeY)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (my ymin), L" s (= start time along y)");
+		Melder_information (my ymin, U" s (= start time along y)");
 	}
 END
 
 DIRECT (DTW_getEndTimeY)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (my ymax), L" s (= end time along y)");
+		Melder_information (my ymax, U" s (= end time along y)");
 	}
 END
 
 DIRECT (DTW_getTotalDurationY)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (my ymax - my ymin), L" s (= total duration along y)");
+		Melder_information (my ymax - my ymin, U" s (= total duration along y)");
 	}
 END
 
 DIRECT (DTW_getNumberOfFramesX)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_integer (my nx), L" (= number of frames along x)");
+		Melder_information (my nx, U" (= number of frames along x)");
 	}
 END
 
 DIRECT (DTW_getTimeStepX)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (my dx), L" s (= time step along x)");
+		Melder_information (my dx, U" s (= time step along x)");
 	}
 END
 
-FORM (DTW_getTimeFromFrameNumberX, L"DTW: Get time from frame number (x)", 0)
-	NATURAL (L"Frame number (x)", L"1")
+FORM (DTW_getTimeFromFrameNumberX, U"DTW: Get time from frame number (x)", 0)
+	NATURAL (U"Frame number (x)", U"1")
 	OK
 DO
-	double column = GET_INTEGER (L"Frame number");
+	long column = GET_INTEGER (U"Frame number");
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (Matrix_columnToX (me, column)), L" s (= y time at x frame ", Melder_integer (column), L")");
+		Melder_information (Matrix_columnToX (me, column), U" s (= y time at x frame ", column, U")");
 	}
 END
 
-FORM (DTW_getFrameNumberFromTimeX, L"DTW: Get frame number from time (x)", 0)
-	REAL (L"Time along x (s)", L"0.1")
+FORM (DTW_getFrameNumberFromTimeX, U"DTW: Get frame number from time (x)", 0)
+	REAL (U"Time along x (s)", U"0.1")
 	OK
 DO
-	double time = GET_REAL (L"Time along x");
+	double time = GET_REAL (U"Time along x");
 	LOOP {
 		iam (DTW);
 		if (time < my xmin || time > my xmax) {
-			Melder_throw (me, "Time outside x domain.");
+			Melder_throw (me, U"Time outside x domain.");
 		}
-		long iframe = floor (Matrix_xToColumn (me, time) + 0.5);
-		Melder_information (Melder_integer (iframe), L" (= x frame at y time ", Melder_double (time), L")");
+		long iframe = lround (Matrix_xToColumn (me, time));
+		Melder_information (iframe, U" (= x frame at y time ", time, U")");
 	}
 END
 
 DIRECT (DTW_getNumberOfFramesY)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_integer (my ny), L" (= number of frames along y)");
+		Melder_information (my ny, U" (= number of frames along y)");
 	}
 END
 
 DIRECT (DTW_getTimeStepY)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (my dy), L" s (= time step along y)");
+		Melder_information (my dy, U" s (= time step along y)");
 	}
 END
 
-FORM (DTW_getTimeFromFrameNumberY, L"DTW: Get time from frame number (y)", 0)
-	NATURAL (L"Frame number (y)", L"1")
+FORM (DTW_getTimeFromFrameNumberY, U"DTW: Get time from frame number (y)", 0)
+	NATURAL (U"Frame number (y)", U"1")
 	OK
 DO
-	double row = GET_INTEGER (L"Frame number");
+	long row = GET_INTEGER (U"Frame number");
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (Matrix_rowToY (me, row)), L" s (= x time at y frame ", Melder_integer (row), L")");
+		Melder_information (Matrix_rowToY (me, row), U" s (= x time at y frame ", row, U")");
 	}
 END
 
-FORM (DTW_getFrameNumberFromTimeY, L"DTW: Get frame number from time (y)", 0)
-	REAL (L"Time along y (s)", L"0.1")
+FORM (DTW_getFrameNumberFromTimeY, U"DTW: Get frame number from time (y)", 0)
+	REAL (U"Time along y (s)", U"0.1")
 	OK
 DO
-	double time = GET_REAL (L"Time along y");
+	double time = GET_REAL (U"Time along y");
 	LOOP {
 		iam (DTW);
 		if (time < my ymin || time > my ymax) {
-			Melder_throw (me, "Time outside y domain.");
+			Melder_throw (me, U"Time outside y domain.");
 		}
-		long iframe = floor (Matrix_yToRow (me, time) + 0.5);
-		Melder_information (Melder_integer (iframe), L" (= y frame at x time ", Melder_double (time), L")");
+		long iframe = lround (Matrix_yToRow (me, time));
+		Melder_information (iframe, U" (= y frame at x time ", time, U")");
 	}
 END
 
 
-FORM (DTW_getPathY, L"DTW: Get time along path", L"DTW: Get time along path...")
-	REAL (L"Time (s)", L"0.0")
+FORM (DTW_getPathY, U"DTW: Get time along path", U"DTW: Get time along path...")
+	REAL (U"Time (s)", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (DTW_getPathY (me, GET_REAL (L"Time"))));
+		Melder_information (DTW_getPathY (me, GET_REAL (U"Time")));
 	}
 END
 
-FORM (DTW_getYTimeFromXTime, L"DTW: Get y time from x time", L"DTW: Get y time from x time...")
-	REAL (L"Time at x (s)", L"0.0")
+FORM (DTW_getYTimeFromXTime, U"DTW: Get y time from x time", U"DTW: Get y time from x time...")
+	REAL (U"Time at x (s)", U"0.0")
 	OK
 DO
-	double time = GET_REAL (L"Time at x");
+	double time = GET_REAL (U"Time at x");
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (DTW_getYTimeFromXTime (me, time)), L" s (= y time at z time ", Melder_double (time), L")");
+		Melder_information (DTW_getYTimeFromXTime (me, time), U" s (= y time at z time ", time, U")");
 	}
 END
 
-FORM (DTW_getXTimeFromYTime, L"DTW: Get x time from y time", L"DTW: Get x time from y time...")
-	REAL (L"Time at y (s)", L"0.0")
+FORM (DTW_getXTimeFromYTime, U"DTW: Get x time from y time", U"DTW: Get x time from y time...")
+	REAL (U"Time at y (s)", U"0.0")
 	OK
 DO
-	double time = GET_REAL (L"Time at y");
+	double time = GET_REAL (U"Time at y");
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (DTW_getXTimeFromYTime (me, time)), L" s (= x time at y time ", Melder_double (time), L")");
+		Melder_information (DTW_getXTimeFromYTime (me, time), U" s (= x time at y time ", time, U")");
 	}
 END
 
-FORM (DTW_getMaximumConsecutiveSteps, L"DTW: Get maximum consecutive steps", L"DTW: Get maximum consecutive steps...")
-	OPTIONMENU (L"Direction", 1)
-	OPTION (L"X")
-	OPTION (L"Y")
-	OPTION (L"Diagonaal")
+FORM (DTW_getMaximumConsecutiveSteps, U"DTW: Get maximum consecutive steps", U"DTW: Get maximum consecutive steps...")
+	OPTIONMENU (U"Direction", 1)
+	OPTION (U"X")
+	OPTION (U"Y")
+	OPTION (U"Diagonaal")
 	OK
 DO
 	int direction[] = {DTW_START, DTW_X, DTW_Y, DTW_XANDY};
-	const wchar_t *string[] = {L"", L"x", L"y", L"diagonal"};
-	int d = GET_INTEGER (L"Direction");
+	const char32 *string[] = {U"", U"x", U"y", U"diagonal"};
+	int d = GET_INTEGER (U"Direction");
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_integer (DTW_getMaximumConsecutiveSteps (me, direction[d])),
-		L" (= maximum number of consecutive steps in ", string[d], L" direction)");
+		Melder_information (DTW_getMaximumConsecutiveSteps (me, direction[d]),
+		U" (= maximum number of consecutive steps in ", string[d], U" direction)");
 	}
 END
 
 DIRECT (DTW_getWeightedDistance)
 	LOOP {
 		iam (DTW);
-		Melder_information (Melder_double (my weightedDistance));
+		Melder_information (my weightedDistance);
 	}
 END
 
-FORM (DTW_getDistanceValue, L"DTW: Get distance value", 0)
-	REAL (L"Time at x (s)", L"0.1")
-	REAL (L"Time at y (s)", L"0.1")
+FORM (DTW_getDistanceValue, U"DTW: Get distance value", 0)
+	REAL (U"Time at x (s)", U"0.1")
+	REAL (U"Time at y (s)", U"0.1")
 	OK
 DO
-	double xtime = GET_REAL (L"Time at x");
-	double ytime = GET_REAL (L"Time at y");
+	double xtime = GET_REAL (U"Time at x");
+	double ytime = GET_REAL (U"Time at y");
 	double dist;
 	LOOP {
 		iam (DTW);
@@ -1929,7 +1984,7 @@ DO
 			long icol = Matrix_xToNearestColumn (me, xtime);
 			dist = my z[irow][icol];
 		}
-		Melder_information (Melder_double (dist), L" (= distance at (", Melder_double (xtime), L", ", Melder_double (ytime), L"))");
+		Melder_information (dist, U" (= distance at (", xtime, U", ", ytime, U"))");
 	}
 END
 
@@ -1951,22 +2006,22 @@ DIRECT (DTW_getMaximumDistance)
 	}
 END
 
-FORM (DTW_formulaDistances, L"DTW: Formula (distances)", 0)
-	LABEL (L"label", L"y := y1; for row := 1 to nrow do { x := x1; "
+FORM (DTW_formulaDistances, U"DTW: Formula (distances)", 0)
+	LABEL (U"label", U"y := y1; for row := 1 to nrow do { x := x1; "
 		"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + dx } y := y + dy }")
-	TEXTFIELD (L"formula", L"self")
+	TEXTFIELD (U"formula", U"self")
 	OK
 DO
 	LOOP {
 		iam (DTW);
 		autoMatrix cp = DTW_to_Matrix_distances (me);
 		try {
-			Matrix_formula (reinterpret_cast <Matrix> (me), GET_STRING (L"formula"), interpreter, 0);
+			Matrix_formula (reinterpret_cast <Matrix> (me), GET_STRING (U"formula"), interpreter, 0);
 			double minimum, maximum;
 			Matrix_getWindowExtrema (me, 0, 0, 0, 0, & minimum, & maximum);
 			if (minimum < 0) {
 				DTW_and_Matrix_replace (me, cp.peek()); // restore original
-				Melder_throw ("Execution of the formula has made some distance(s) negative which is not allowed.");
+				Melder_throw (U"Execution of the formula has made some distance(s) negative which is not allowed.");
 			}
 			praat_dataChanged (me);
 		} catch (MelderError) {
@@ -1976,34 +2031,34 @@ DO
 	}
 END
 
-FORM (DTW_setDistanceValue, L"DTW: Set distance value", 0)
-	REAL (L"Time at x (s)", L"0.1")
-	REAL (L"Time at y (s)", L"0.1")
-	REAL (L"New value", L"0.0")
+FORM (DTW_setDistanceValue, U"DTW: Set distance value", 0)
+	REAL (U"Time at x (s)", U"0.1")
+	REAL (U"Time at y (s)", U"0.1")
+	REAL (U"New value", U"0.0")
 	OK
 DO
-	double xtime = GET_REAL (L"Time at x");
-	double ytime = GET_REAL (L"Time at y");
-	double val = GET_REAL (L"New value");
+	double xtime = GET_REAL (U"Time at x");
+	double ytime = GET_REAL (U"Time at y");
+	double val = GET_REAL (U"New value");
 	if (val < 0) {
-		Melder_throw ("Distances cannot be negative.");
+		Melder_throw (U"Distances cannot be negative.");
 	}
 	LOOP {
 		iam (DTW);
 		if (xtime < my xmin || xtime > my xmax) {
-			Melder_throw ("Time at x outside domain.");
+			Melder_throw (U"Time at x outside domain.");
 		}
 		if (ytime < my ymin || ytime > my ymax) {
-			Melder_throw ("Time at y outside domain.");
+			Melder_throw (U"Time at y outside domain.");
 		}
 		long irow = Matrix_yToNearestRow (me, ytime);
 		long icol = Matrix_xToNearestColumn (me, xtime);
-		my z[irow][icol] = GET_REAL (L"New value");
+		my z[irow][icol] = GET_REAL (U"New value");
 		praat_dataChanged (me);
 	}
 END
 
-FORM (DTW_findPath, L"DTW: Find path", 0)
+FORM (DTW_findPath, U"DTW: Find path", 0)
 	DTW_constraints_addCommonFields (dia);
 	OK
 DO
@@ -2015,52 +2070,52 @@ DO
 	}
 END
 
-FORM (DTW_findPath_bandAndSlope, L"DTW: find path (band & slope)", 0)
-    REAL (L"Sakoe-Chiba band (s)", L"0.05")
-    RADIO (L"Slope constraint", 1)
-    RADIOBUTTON (L"no restriction")
-    RADIOBUTTON (L"1/3 < slope < 3")
-    RADIOBUTTON (L"1/2 < slope < 2")
-    RADIOBUTTON (L"2/3 < slope < 3/2")
+FORM (DTW_findPath_bandAndSlope, U"DTW: find path (band & slope)", 0)
+    REAL (U"Sakoe-Chiba band (s)", U"0.05")
+    RADIO (U"Slope constraint", 1)
+    RADIOBUTTON (U"no restriction")
+    RADIOBUTTON (U"1/3 < slope < 3")
+    RADIOBUTTON (U"1/2 < slope < 2")
+    RADIOBUTTON (U"2/3 < slope < 3/2")
     OK
 DO
-    double band = GET_REAL (L"Sakoe-Chiba band");
-    int slope = GET_INTEGER (L"Slope constraint");
+    double band = GET_REAL (U"Sakoe-Chiba band");
+    int slope = GET_INTEGER (U"Slope constraint");
     LOOP {
         iam (DTW);
         DTW_findPath_bandAndSlope (me, band, slope, 0);
     }
 END
 
-FORM (DTW_to_Matrix_cummulativeDistances, L"DTW: To Matrix", 0)
-    REAL (L"Sakoe-Chiba band (s)", L"0.05")
-    RADIO (L"Slope constraint", 1)
-    RADIOBUTTON (L"no restriction")
-    RADIOBUTTON (L"1/3 < slope < 3")
-    RADIOBUTTON (L"1/2 < slope < 2")
-    RADIOBUTTON (L"2/3 < slope < 3/2")
+FORM (DTW_to_Matrix_cummulativeDistances, U"DTW: To Matrix", 0)
+    REAL (U"Sakoe-Chiba band (s)", U"0.05")
+    RADIO (U"Slope constraint", 1)
+    RADIOBUTTON (U"no restriction")
+    RADIOBUTTON (U"1/3 < slope < 3")
+    RADIOBUTTON (U"1/2 < slope < 2")
+    RADIOBUTTON (U"2/3 < slope < 3/2")
     OK
 DO
-    double band = GET_REAL (L"Sakoe-Chiba band");
-    int slope = GET_INTEGER (L"Slope constraint");
+    double band = GET_REAL (U"Sakoe-Chiba band");
+    int slope = GET_INTEGER (U"Slope constraint");
     LOOP {
         iam (DTW);
         autoMatrix thee = DTW_to_Matrix_cummulativeDistances (me, band, slope);
-        praat_new (thee.transfer(), my name, L"_cd");
+        praat_new (thee.transfer(), my name, U"_cd");
     }
 END
 
-FORM (DTW_to_Polygon, L"DTW: To Polygon...", 0)
-    REAL (L"Sakoe-Chiba band (s)", L"0.1")
-    RADIO (L"Slope constraint", 1)
-    RADIOBUTTON (L"no restriction")
-    RADIOBUTTON (L"1/3 < slope < 3")
-    RADIOBUTTON (L"1/2 < slope < 2")
-    RADIOBUTTON (L"2/3 < slope < 3/2")
+FORM (DTW_to_Polygon, U"DTW: To Polygon...", 0)
+    REAL (U"Sakoe-Chiba band (s)", U"0.1")
+    RADIO (U"Slope constraint", 1)
+    RADIOBUTTON (U"no restriction")
+    RADIOBUTTON (U"1/3 < slope < 3")
+    RADIOBUTTON (U"1/2 < slope < 2")
+    RADIOBUTTON (U"2/3 < slope < 3/2")
     OK
 DO
-    double band = GET_REAL (L"Sakoe-Chiba band");
-    int slope = GET_INTEGER (L"Slope constraint");
+    double band = GET_REAL (U"Sakoe-Chiba band");
+    int slope = GET_INTEGER (U"Slope constraint");
     LOOP {
         iam (DTW);
         autoPolygon thee = DTW_to_Polygon (me, band, slope);
@@ -2071,14 +2126,16 @@ END
 DIRECT (DTW_to_Matrix_distances)
 	LOOP {
 		iam (DTW);
-		praat_new (DTW_to_Matrix_distances (me), my name);
+		autoMatrix thee = DTW_to_Matrix_distances (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 DIRECT (DTW_swapAxes)
 	LOOP {
 		iam (DTW);
-		praat_new (DTW_swapAxes (me), my name, L"_axesSwapped");
+		autoDTW thee = DTW_swapAxes (me);
+		praat_new (thee.transfer(), my name, U"_axesSwapped");
 	}
 END
 
@@ -2104,7 +2161,7 @@ END
 /******************** EditDistanceTable & EditCostsTable ********************************************/
 
 DIRECT (EditDistanceTable_help)
-	Melder_help (L"EditDistanceTable");
+	Melder_help (U"EditDistanceTable");
 END
 
 DIRECT (EditDistanceTable_to_TableOfReal_directions)
@@ -2120,23 +2177,23 @@ DIRECT (EditDistanceTable_setEditCosts)
 	EditDistanceTable_setEditCosts (me, thee);
 END
 
-FORM (EditDistanceTable_setDefaultCosts, L"", 0)
-	REAL (L"Insertion costs", L"1.0")
-	REAL (L"Deletion costs", L"1.0")
-	REAL (L"Substitution costs", L"2.0")
+FORM (EditDistanceTable_setDefaultCosts, U"", 0)
+	REAL (U"Insertion costs", U"1.0")
+	REAL (U"Deletion costs", U"1.0")
+	REAL (U"Substitution costs", U"2.0")
 	OK
 DO
-	double insertionCosts = GET_REAL (L"Insertion costs");
+	double insertionCosts = GET_REAL (U"Insertion costs");
 	if (insertionCosts < 0) {
-		Melder_throw ("Insertion costs cannot be negative.");
+		Melder_throw (U"Insertion costs cannot be negative.");
 	}
-	double deletionCosts = GET_REAL (L"Deletion costs");
+	double deletionCosts = GET_REAL (U"Deletion costs");
 	if (deletionCosts < 0) {
-		Melder_throw ("Deletion costs cannot be negative.");
+		Melder_throw (U"Deletion costs cannot be negative.");
 	}
-	double substitutionCosts = GET_REAL (L"Substitution costs");
+	double substitutionCosts = GET_REAL (U"Substitution costs");
 	if (substitutionCosts < 0) {
-		Melder_throw ("Substitution costs cannot be negative.");
+		Melder_throw (U"Substitution costs cannot be negative.");
 	}
 	LOOP {
 		iam (EditDistanceTable);
@@ -2144,20 +2201,20 @@ DO
 	}
 END
 
-FORM (EditDistanceTable_draw, L"EditDistanceTable_draw", 0)
-	RADIO (L"Format", 3)
-		RADIOBUTTON (L"decimal")
-		RADIOBUTTON (L"exponential")
-		RADIOBUTTON (L"free")
-		RADIOBUTTON (L"rational")
-	NATURAL (L"Precision", L"1")
-	REAL (L"Rotate source labels by (degrees)", L"0.0")
+FORM (EditDistanceTable_draw, U"EditDistanceTable_draw", 0)
+	RADIO (U"Format", 3)
+		RADIOBUTTON (U"decimal")
+		RADIOBUTTON (U"exponential")
+		RADIOBUTTON (U"free")
+		RADIOBUTTON (U"rational")
+	NATURAL (U"Precision", U"1")
+	REAL (U"Rotate source labels by (degrees)", U"0.0")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (EditDistanceTable);
-		EditDistanceTable_draw (me, GRAPHICS, GET_INTEGER (L"Format"), GET_INTEGER (L"Precision"), GET_REAL (L"Rotate source labels by"));
+		EditDistanceTable_draw (me, GRAPHICS, GET_INTEGER (U"Format"), GET_INTEGER (U"Precision"), GET_REAL (U"Rotate source labels by"));
 	}
 END
 
@@ -2170,142 +2227,142 @@ DIRECT (EditDistanceTable_drawEditOperations)
 END
 
 DIRECT (EditCostsTable_help)
-	Melder_help (L"EditCostsTable");
+	Melder_help (U"EditCostsTable");
 END
 
-FORM (EditCostsTable_getTargetIndex, L"EditCostsTable: Get target index", 0)
-	SENTENCE (L"Target", L"")
+FORM (EditCostsTable_getTargetIndex, U"EditCostsTable: Get target index", 0)
+	SENTENCE (U"Target", U"")
 	OK
 DO
 	LOOP {
 		iam (EditCostsTable);
-		Melder_informationReal (EditCostsTable_getTargetIndex (me, GET_STRING (L"Target")), NULL);
+		Melder_informationReal (EditCostsTable_getTargetIndex (me, GET_STRING (U"Target")), nullptr);
 	}
 END
 
-FORM (EditCostsTable_getSourceIndex, L"EditCostsTable: Get source index", 0)
-	SENTENCE (L"Source", L"")
+FORM (EditCostsTable_getSourceIndex, U"EditCostsTable: Get source index", 0)
+	SENTENCE (U"Source", U"")
 	OK
 DO
 	LOOP {
 		iam (EditCostsTable);
-		Melder_informationReal (EditCostsTable_getSourceIndex (me, GET_STRING (L"Source")), NULL);
+		Melder_informationReal (EditCostsTable_getSourceIndex (me, GET_STRING (U"Source")), nullptr);
 	}
 END
 
-FORM (EditCostsTable_getInsertionCost, L"EditCostsTable: Get insertion cost", 0)
-	SENTENCE (L"Target", L"")
+FORM (EditCostsTable_getInsertionCost, U"EditCostsTable: Get insertion cost", 0)
+	SENTENCE (U"Target", U"")
 	OK
 DO
 	LOOP {
 		iam (EditCostsTable);
-		Melder_informationReal (EditCostsTable_getInsertionCost (me, GET_STRING (L"Target")), NULL);
+		Melder_informationReal (EditCostsTable_getInsertionCost (me, GET_STRING (U"Target")), nullptr);
 	}
 END
 
-FORM (EditCostsTable_getDeletionCost, L"EditCostsTable: Get deletion cost", 0)
-	SENTENCE (L"Source", L"")
+FORM (EditCostsTable_getDeletionCost, U"EditCostsTable: Get deletion cost", 0)
+	SENTENCE (U"Source", U"")
 	OK
 DO
 	LOOP {
 		iam (EditCostsTable);
-		Melder_informationReal (EditCostsTable_getDeletionCost (me, GET_STRING (L"Source")), NULL);
+		Melder_informationReal (EditCostsTable_getDeletionCost (me, GET_STRING (U"Source")), nullptr);
 	}
 END
 
-FORM (EditCostsTable_getSubstitutionCost, L"EditCostsTable: Get substitution cost", 0)
-	SENTENCE (L"Target", L"")
-	SENTENCE (L"Source", L"")
+FORM (EditCostsTable_getSubstitutionCost, U"EditCostsTable: Get substitution cost", 0)
+	SENTENCE (U"Target", U"")
+	SENTENCE (U"Source", U"")
 	OK
 DO
 	LOOP {
 		iam (EditCostsTable);
-		Melder_informationReal (EditCostsTable_getSubstitutionCost (me, GET_STRING (L"Target"), GET_STRING (L"Source")), NULL);
+		Melder_informationReal (EditCostsTable_getSubstitutionCost (me, GET_STRING (U"Target"), GET_STRING (U"Source")), nullptr);
 	}
 END
 
-FORM (EditCostsTable_getOthersCost, L"EditCostsTable: Get cost (others)", 0)
-	RADIO (L"Others cost type", 1)
-	RADIOBUTTON (L"Insertion")
-	RADIOBUTTON (L"Deletion")
-	RADIOBUTTON (L"Equality")
-	RADIOBUTTON (L"Inequality")
+FORM (EditCostsTable_getOthersCost, U"EditCostsTable: Get cost (others)", 0)
+	RADIO (U"Others cost type", 1)
+	RADIOBUTTON (U"Insertion")
+	RADIOBUTTON (U"Deletion")
+	RADIOBUTTON (U"Equality")
+	RADIOBUTTON (U"Inequality")
 	OK
 DO
 	LOOP {
 		iam (EditCostsTable);
-		Melder_informationReal (EditCostsTable_getOthersCost (me, GET_INTEGER (L"Others cost type")), NULL);
+		Melder_informationReal (EditCostsTable_getOthersCost (me, GET_INTEGER (U"Others cost type")), nullptr);
 	}
 END
 
-FORM (EditCostsTable_setTargetSymbol_index, L"EditCostsTable: Set target symbol (index)", 0)
-	NATURAL (L"Index", L"1")
-	SENTENCE (L"Target", L"a")
+FORM (EditCostsTable_setTargetSymbol_index, U"EditCostsTable: Set target symbol (index)", 0)
+	NATURAL (U"Index", U"1")
+	SENTENCE (U"Target", U"a")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_setRowLabel (me, GET_INTEGER (L"Index"), GET_STRING (L"Target"));
+		TableOfReal_setRowLabel (me, GET_INTEGER (U"Index"), GET_STRING (U"Target"));
 	}
 END
 
-FORM (EditCostsTable_setSourceSymbol_index, L"EditCostsTable: Set source symbol (index)", 0)
-	NATURAL (L"Index", L"1")
-	SENTENCE (L"Source", L"a")
+FORM (EditCostsTable_setSourceSymbol_index, U"EditCostsTable: Set source symbol (index)", 0)
+	NATURAL (U"Index", U"1")
+	SENTENCE (U"Source", U"a")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_setColumnLabel (me, GET_INTEGER (L"Index"), GET_STRING (L"Source"));
+		TableOfReal_setColumnLabel (me, GET_INTEGER (U"Index"), GET_STRING (U"Source"));
 	}
 END
 
-FORM (EditCostsTable_setInsertionCosts, L"EditCostsTable: Set insertion costs", 0)
-	SENTENCE (L"Targets", L"")
-	REAL (L"Cost", L"2.0")
+FORM (EditCostsTable_setInsertionCosts, U"EditCostsTable: Set insertion costs", 0)
+	SENTENCE (U"Targets", U"")
+	REAL (U"Cost", U"2.0")
 	OK
 DO
 	LOOP {
 		iam (EditCostsTable);
-		EditCostsTable_setInsertionCosts (me, GET_STRING (L"Targets"), GET_REAL (L"Cost"));
+		EditCostsTable_setInsertionCosts (me, GET_STRING (U"Targets"), GET_REAL (U"Cost"));
 	}
 END
 
-FORM (EditCostsTable_setDeletionCosts, L"EditCostsTable: Set deletion costs", 0)
-	SENTENCE (L"Sources", L"")
-	REAL (L"Cost", L"2.0")
+FORM (EditCostsTable_setDeletionCosts, U"EditCostsTable: Set deletion costs", 0)
+	SENTENCE (U"Sources", U"")
+	REAL (U"Cost", U"2.0")
 	OK
 DO
 	LOOP {
 		iam (EditCostsTable);
-		EditCostsTable_setDeletionCosts (me, GET_STRING (L"Sources"), GET_REAL (L"Cost"));
+		EditCostsTable_setDeletionCosts (me, GET_STRING (U"Sources"), GET_REAL (U"Cost"));
 	}
 END
 
-FORM (EditCostsTable_setSubstitutionCosts, L"EditCostsTable: Set substitution costs", 0)
-	SENTENCE (L"Targets", L"a i u")
-	SENTENCE (L"Sources", L"a i u")
-	REAL (L"Cost", L"2.0")
+FORM (EditCostsTable_setSubstitutionCosts, U"EditCostsTable: Set substitution costs", 0)
+	SENTENCE (U"Targets", U"a i u")
+	SENTENCE (U"Sources", U"a i u")
+	REAL (U"Cost", U"2.0")
 	OK
 DO
 	LOOP {
 		iam (EditCostsTable);
-		EditCostsTable_setSubstitutionCosts (me, GET_STRING (L"Targets"), GET_STRING (L"Sources"), GET_REAL (L"Cost"));
+		EditCostsTable_setSubstitutionCosts (me, GET_STRING (U"Targets"), GET_STRING (U"Sources"), GET_REAL (U"Cost"));
 	}
 END
 
-FORM (EditCostsTable_setOthersCosts, L"EditCostsTable: Set costs (others)", 0)
-	LABEL (L"", L"Others costs")
-	REAL (L"Insertion", L"1.0")
-	REAL (L"Deletion", L"1.0")
-	LABEL (L"", L"Substitution costs")
-	REAL (L"Equality", L"0.0")
-	REAL (L"Inequality", L"2.0")
+FORM (EditCostsTable_setOthersCosts, U"EditCostsTable: Set costs (others)", 0)
+	LABEL (U"", U"Others costs")
+	REAL (U"Insertion", U"1.0")
+	REAL (U"Deletion", U"1.0")
+	LABEL (U"", U"Substitution costs")
+	REAL (U"Equality", U"0.0")
+	REAL (U"Inequality", U"2.0")
 	OK
 DO
 	LOOP {
 		iam (EditCostsTable);
-		EditCostsTable_setOthersCosts (me, GET_REAL (L"Insertion"), GET_REAL (L"Deletion"), GET_REAL (L"Equality"), GET_REAL (L"Inequality"));
+		EditCostsTable_setOthersCosts (me, GET_REAL (U"Insertion"), GET_REAL (U"Deletion"), GET_REAL (U"Equality"), GET_REAL (U"Inequality"));
 	}
 END
 
@@ -2316,121 +2373,121 @@ DIRECT (EditCostsTable_to_TableOfReal)
 	}
 END
 
-FORM (EditCostsTable_createEmpty, L"Create empty EditCostsTable", L"Create empty EditCostsTable...")
-	SENTENCE (L"Name", L"editCosts")
-	INTEGER (L"Number of target symbols", L"0")
-	INTEGER (L"Number of source symbols", L"0")
+FORM (EditCostsTable_createEmpty, U"Create empty EditCostsTable", U"Create empty EditCostsTable...")
+	SENTENCE (U"Name", U"editCosts")
+	INTEGER (U"Number of target symbols", U"0")
+	INTEGER (U"Number of source symbols", U"0")
 	OK
 DO
-	long numberOfTargetSymbols = GET_INTEGER (L"Number of target symbols");
+	long numberOfTargetSymbols = GET_INTEGER (U"Number of target symbols");
 	numberOfTargetSymbols = numberOfTargetSymbols < 0 ? 0 : numberOfTargetSymbols;
-	long numberOfSourceSymbols = GET_INTEGER (L"Number of source symbols");
+	long numberOfSourceSymbols = GET_INTEGER (U"Number of source symbols");
 	numberOfSourceSymbols = numberOfSourceSymbols < 0 ? 0 : numberOfSourceSymbols;
-	praat_new (EditCostsTable_create (numberOfTargetSymbols, numberOfSourceSymbols), GET_STRING (L"Name"));
+	praat_new (EditCostsTable_create (numberOfTargetSymbols, numberOfSourceSymbols), GET_STRING (U"Name"));
 END
 
 /******************** Eigen ********************************************/
 
 DIRECT (Eigen_drawEigenvalues_scree)
-	Melder_warning (L"The command \"Draw eigenvalues (scree)...\" has been "
+	Melder_warning (U"The command \"Draw eigenvalues (scree)...\" has been "
 		"removed.\n To get a scree plot use \"Draw eigenvalues...\" with the "
 		"arguments\n 'Fraction of eigenvalues summed' and 'Cumulative' unchecked.");
 END
 
-FORM (Eigen_drawEigenvalues, L"Eigen: Draw eigenvalues", L"Eigen: Draw eigenvalues...")
-	INTEGER (L"left Eigenvalue range", L"0")
-	INTEGER (L"right Eigenvalue range", L"0")
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
-	BOOLEAN (L"Fraction of eigenvalues summed", 0)
-	BOOLEAN (L"Cumulative", 0)
-	POSITIVE (L"Mark size (mm)", L"1.0")
-	SENTENCE (L"Mark string (+xo.)", L"+")
-	BOOLEAN (L"Garnish", 1)
+FORM (Eigen_drawEigenvalues, U"Eigen: Draw eigenvalues", U"Eigen: Draw eigenvalues...")
+	INTEGER (U"left Eigenvalue range", U"0")
+	INTEGER (U"right Eigenvalue range", U"0")
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
+	BOOLEAN (U"Fraction of eigenvalues summed", 0)
+	BOOLEAN (U"Cumulative", 0)
+	POSITIVE (U"Mark size (mm)", U"1.0")
+	SENTENCE (U"Mark string (+xo.)", U"+")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Eigen);
-		Eigen_drawEigenvalues (me, GRAPHICS, GET_INTEGER (L"left Eigenvalue range"),
-		GET_INTEGER (L"right Eigenvalue range"), GET_REAL (L"left Amplitude range"),
-		GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Fraction of eigenvalues summed"),
-		GET_INTEGER (L"Cumulative"), GET_REAL (L"Mark size"), GET_STRING (L"Mark string"),
-		GET_INTEGER (L"Garnish"));
+		Eigen_drawEigenvalues (me, GRAPHICS, GET_INTEGER (U"left Eigenvalue range"),
+		GET_INTEGER (U"right Eigenvalue range"), GET_REAL (U"left Amplitude range"),
+		GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Fraction of eigenvalues summed"),
+		GET_INTEGER (U"Cumulative"), GET_REAL (U"Mark size"), GET_STRING (U"Mark string"),
+		GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Eigen_drawEigenvector, L"Eigen: Draw eigenvector", L"Eigen: Draw eigenvector...")
-	INTEGER (L"Eigenvector number", L"1")
-	BOOLEAN (L"Component loadings", 0)
-	INTEGER (L"left Element range", L"0")
-	INTEGER (L"right Element range", L"0")
-	REAL (L"left Amplitude range", L"-1.0")
-	REAL (L"right Amplitude range", L"1.0")
-	POSITIVE (L"Mark size (mm)", L"1.0")
-	SENTENCE (L"Mark string (+xo.)", L"+")
-	BOOLEAN (L"Connect points", 1)
-	BOOLEAN (L"Garnish", 1)
+FORM (Eigen_drawEigenvector, U"Eigen: Draw eigenvector", U"Eigen: Draw eigenvector...")
+	INTEGER (U"Eigenvector number", U"1")
+	BOOLEAN (U"Component loadings", 0)
+	INTEGER (U"left Element range", U"0")
+	INTEGER (U"right Element range", U"0")
+	REAL (U"left Amplitude range", U"-1.0")
+	REAL (U"right Amplitude range", U"1.0")
+	POSITIVE (U"Mark size (mm)", U"1.0")
+	SENTENCE (U"Mark string (+xo.)", U"+")
+	BOOLEAN (U"Connect points", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Eigen);
-		Eigen_drawEigenvector (me, GRAPHICS, GET_INTEGER (L"Eigenvector number"),
-		GET_INTEGER (L"left Element range"), GET_INTEGER (L"right Element range"),
-		GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"),
-		GET_INTEGER (L"Component loadings"), GET_REAL (L"Mark size"),
-		GET_STRING (L"Mark string"), GET_INTEGER (L"Connect points"), 0, GET_INTEGER (L"Garnish"));
+		Eigen_drawEigenvector (me, GRAPHICS, GET_INTEGER (U"Eigenvector number"),
+		GET_INTEGER (U"left Element range"), GET_INTEGER (U"right Element range"),
+		GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"),
+		GET_INTEGER (U"Component loadings"), GET_REAL (U"Mark size"),
+		GET_STRING (U"Mark string"), GET_INTEGER (U"Connect points"), 0, GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (Eigen_getNumberOfEigenvalues)
 	LOOP {
 		iam (Eigen);
-		Melder_information (Melder_integer (my numberOfEigenvalues));
+		Melder_information (my numberOfEigenvalues);
 	}
 END
 
 DIRECT (Eigen_getDimension)
 	LOOP {
 		iam (Eigen);
-		Melder_information (Melder_integer (my dimension));
+		Melder_information (my dimension);
 	}
 END
 
-FORM (Eigen_getEigenvalue, L"Eigen: Get eigenvalue", L"Eigen: Get eigenvalue...")
-	NATURAL (L"Eigenvalue number", L"1")
+FORM (Eigen_getEigenvalue, U"Eigen: Get eigenvalue", U"Eigen: Get eigenvalue...")
+	NATURAL (U"Eigenvalue number", U"1")
 	OK
 DO
 	LOOP {
 		iam (Eigen);
-		long number = GET_INTEGER (L"Eigenvalue number");
+		long number = GET_INTEGER (U"Eigenvalue number");
 		if (number > my numberOfEigenvalues) {
-			Melder_throw ("Eigenvalue number must be smaller than ", my numberOfEigenvalues + 1);
+			Melder_throw (U"Eigenvalue number must be smaller than ", my numberOfEigenvalues + 1);
 		}
-		Melder_information (Melder_double (my eigenvalues[number]));
+		Melder_information (my eigenvalues[number]);
 	}
 END
 
-FORM (Eigen_getSumOfEigenvalues, L"Eigen:Get sum of eigenvalues", L"Eigen: Get sum of eigenvalues...")
-	INTEGER (L"left Eigenvalue range",  L"0")
-	INTEGER (L"right Eigenvalue range", L"0")
+FORM (Eigen_getSumOfEigenvalues, U"Eigen:Get sum of eigenvalues", U"Eigen: Get sum of eigenvalues...")
+	INTEGER (U"left Eigenvalue range",  U"0")
+	INTEGER (U"right Eigenvalue range", U"0")
 	OK
 DO
 	LOOP {
 		iam (Eigen);
-		Melder_information (Melder_double (Eigen_getSumOfEigenvalues (me, GET_INTEGER (L"left Eigenvalue range"), GET_INTEGER (L"right Eigenvalue range"))));
+		Melder_information (Eigen_getSumOfEigenvalues (me, GET_INTEGER (U"left Eigenvalue range"), GET_INTEGER (U"right Eigenvalue range")));
 	}
 END
 
-FORM (Eigen_getEigenvectorElement, L"Eigen: Get eigenvector element", L"Eigen: Get eigenvector element...")
-	NATURAL (L"Eigenvector number", L"1")
-	NATURAL (L"Element number", L"1")
+FORM (Eigen_getEigenvectorElement, U"Eigen: Get eigenvector element", U"Eigen: Get eigenvector element...")
+	NATURAL (U"Eigenvector number", U"1")
+	NATURAL (U"Element number", U"1")
 	OK
 DO
 	LOOP {
 		iam (Eigen);
-		Melder_information (Melder_double (Eigen_getEigenvectorElement (me, GET_INTEGER (L"Eigenvector number"), GET_INTEGER (L"Element number"))));
+		Melder_information (Eigen_getEigenvectorElement (me, GET_INTEGER (U"Eigenvector number"), GET_INTEGER (U"Element number")));
 	}
 END
 
@@ -2439,65 +2496,65 @@ DIRECT (Eigens_alignEigenvectors)
 	Eigens_alignEigenvectors (set.peek());
 END
 
-FORM (Eigen_and_Matrix_project, L"Eigen & Matrix: Project", L"Eigen & Matrix: Project...")
-	INTEGER (L"Number of dimensions", L"0")
+FORM (Eigen_and_Matrix_project, U"Eigen & Matrix: Project", U"Eigen & Matrix: Project...")
+	INTEGER (U"Number of dimensions", U"0")
 	OK
 DO
 	Eigen me = FIRST_GENERIC (Eigen);
 	Matrix thee = FIRST_GENERIC (Matrix);
-	praat_new (Eigen_and_Matrix_project (me, thee, GET_INTEGER (L"Number of dimensions")), my name, L"_", thy name);
+	praat_new (Eigen_and_Matrix_project (me, thee, GET_INTEGER (U"Number of dimensions")), my name, U"_", thy name);
 END
 
 DIRECT (Eigen_and_SSCP_project)
 	Eigen me = FIRST_GENERIC (Eigen);
 	SSCP cp = FIRST (SSCP);
-	praat_new (Eigen_and_SSCP_project (me, cp), my name, L"_", cp->name);
+	praat_new (Eigen_and_SSCP_project (me, cp), my name, U"_", cp->name);
 END
 
 DIRECT (Eigen_and_Covariance_project)
 	Eigen me = FIRST_GENERIC (Eigen);
 	Covariance cv = FIRST (Covariance);
-	praat_new (Eigen_and_Covariance_project (me, cv), my name, L"_", cv->name);
+	praat_new (Eigen_and_Covariance_project (me, cv), my name, U"_", cv->name);
 END
 
 /******************** Index ********************************************/
 
 DIRECT (Index_help)
-	Melder_help (L"Index");
+	Melder_help (U"Index");
 END
 
 DIRECT (Index_getNumberOfClasses)
 	LOOP {
 		iam (Index);
-		Melder_information (Melder_integer (my classes -> size));
+		Melder_information (my classes -> size);
 	}
 END
 
-FORM (StringsIndex_getClassLabel, L"StringsIndex: Get class label", L"StringsIndex: Get class label...")
-	NATURAL (L"Class index", L"1")
+FORM (StringsIndex_getClassLabel, U"StringsIndex: Get class label", U"StringsIndex: Get class label...")
+	NATURAL (U"Class index", U"1")
 	OK
 DO
-	long klas = GET_INTEGER (L"Class index");
+	long klas = GET_INTEGER (U"Class index");
 	LOOP {
 		iam (StringsIndex);
 		long numberOfClasses = my classes -> size;
 		if (klas > numberOfClasses) {
-			Melder_throw ("Index must be less than or equal ", numberOfClasses, L".");
+			Melder_throw (U"Index must be less than or equal ", numberOfClasses, U".");
 		}
 		SimpleString ss = (SimpleString) my classes -> item[klas];
 		Melder_information (ss -> string);
 	}
 END
 
-FORM (StringsIndex_getLabel, L"StringsIndex: Get label", L"StringsIndex: Get label...")
-	NATURAL (L"Element index", L"1")
+FORM (StringsIndex_getLabel, U"StringsIndex: Get label", U"StringsIndex: Get label...")
+	NATURAL (U"Element index", U"1")
 	OK
 DO
-	long index = GET_INTEGER (L"Element index");
+	long index = GET_INTEGER (U"Element index");
 	LOOP {
 		iam (StringsIndex);
 		if (index > my numberOfElements) {
-			Melder_throw ("Index must be less than or equal ", my numberOfElements, L".");
+			Melder_throw (U"Index must be less than or equal ", my numberOfElements, U".");
 		}
 		long klas = my classIndex[index];
 		SimpleString ss = (SimpleString) my classes -> item [klas];
@@ -2505,51 +2562,51 @@ DO
 	}
 END
 
-FORM (Index_getIndex, L"Index: Get index", L"Index: Get index...")
-	NATURAL (L"Element index", L"1")
+FORM (Index_getIndex, U"Index: Get index", U"Index: Get index...")
+	NATURAL (U"Element index", U"1")
 	OK
 DO
-	long index = GET_INTEGER (L"Element index");
+	long index = GET_INTEGER (U"Element index");
 	LOOP {
 		iam (Index);
 		if (index > my numberOfElements) {
-			Melder_throw ("Index must be less than or equal ", my numberOfElements, L".");
+			Melder_throw (U"Index must be less than or equal ", my numberOfElements, U".");
 		}
-		Melder_information (Melder_integer (my classIndex[index]));
+		Melder_information (my classIndex[index]);
 	}
 END
 
-FORM (StringsIndex_getClassIndex, L"StringsIndex: Get class index", L"StringsIndex: Get class index...")
-	WORD (L"Class label", L"label")
+FORM (StringsIndex_getClassIndex, U"StringsIndex: Get class index", U"StringsIndex: Get class index...")
+	WORD (U"Class label", U"label")
 	OK
 DO
-	wchar_t *klasLabel = GET_STRING (L"Class label");
+	char32 *klasLabel = GET_STRING (U"Class label");
 	LOOP {
 		iam (StringsIndex);
 		long index = StringsIndex_getClass (me, klasLabel);
-		Melder_information (Melder_integer (index));
+		Melder_information (index);
 	}
 END
 
-FORM (Index_extractPart, L"Index: Extract part", L"Index: Extract part...")
-	INTEGER (L"left Range", L"0")
-	INTEGER (L"right Range", L"0")
+FORM (Index_extractPart, U"Index: Extract part", U"Index: Extract part...")
+	INTEGER (U"left Range", U"0")
+	INTEGER (U"right Range", U"0")
 	OK
 DO
 	LOOP {
 		iam (Index);
-		praat_new (Index_extractPart (me, GET_INTEGER (L"left Range"), GET_INTEGER (L"right Range")),
-		Thing_getName (me), L"_part");
+		praat_new (Index_extractPart (me, GET_INTEGER (U"left Range"), GET_INTEGER (U"right Range")),
+		Thing_getName (me), U"_part");
 	}
 END
 
-FORM (Index_to_Permutation, L"Index: To Permutation", L"Index: To Permutation...")
-	BOOLEAN (L"Permute within classes", 1)
+FORM (Index_to_Permutation, U"Index: To Permutation", U"Index: To Permutation...")
+	BOOLEAN (U"Permute within classes", 1)
 	OK
 DO
 	LOOP {
 		iam (Index);
-		praat_new (Index_to_Permutation_permuteRandomly (me, GET_INTEGER (L"Permute within classes")), my name);
+		praat_new (Index_to_Permutation_permuteRandomly (me, GET_INTEGER (U"Permute within classes")), my name);
 	}
 END
 
@@ -2569,20 +2626,20 @@ DIRECT (Excitation_to_Excitations)
 		autoExcitation thee = Data_copy (me);
 		Collection_addItem (e.peek(), thee.transfer());
 	}
-	praat_new (e.transfer(), L"appended");
+	praat_new (e.transfer(), U"appended");
 END
 
 /******************** Excitations ********************************************/
 
-FORM (Excitations_formula, L"Excitations: Formula", 0)
-	LABEL (L"label", L"for all objects in Excitations do { for col := 1 to ncol do { self [col] := `formula' ; x := x + dx } }")
-	TEXTFIELD (L"formula", L"self")
+FORM (Excitations_formula, U"Excitations: Formula", 0)
+	LABEL (U"label", U"for all objects in Excitations do { for col := 1 to ncol do { self [col] := `formula' ; x := x + dx } }")
+	TEXTFIELD (U"formula", U"self")
 	OK
 DO
 	LOOP {
 		iam (Excitations);
 		for (long j = 1; j <= my size; j++) {
-			Matrix_formula ( (Matrix) my item[j], GET_STRING (L"formula"), interpreter, 0);
+			Matrix_formula ( (Matrix) my item[j], GET_STRING (U"formula"), interpreter, 0);
 		}
 		praat_dataChanged (me);
 	}
@@ -2597,13 +2654,13 @@ DIRECT (Excitations_addItem)
 	}
 END
 
-FORM (Excitations_getItem, L"Excitations: Get item", 0)
-	NATURAL (L"Item number", L"1")
+FORM (Excitations_getItem, U"Excitations: Get item", 0)
+	NATURAL (U"Item number", U"1")
 	OK
 DO
 	LOOP {
 		iam (Excitations);
-		praat_new (Excitations_getItem (me, GET_INTEGER (L"Item number")), my name, L"_item");
+		praat_new (Excitations_getItem (me, GET_INTEGER (U"Item number")), my name, U"_item");
 	}
 END
 
@@ -2614,16 +2671,16 @@ DIRECT (Excitations_append)
 		(e1 ? e2 : e1) = me;
 	}
 	Melder_assert (e1 && e2);
-	praat_new ( (Excitations) Collections_merge (e1, e2), L"appended");
+	praat_new ( (Excitations) Collections_merge (e1, e2), U"appended");
 END
 
-FORM (Excitations_to_Pattern, L"Excitations: To Pattern", 0)
-	NATURAL (L"Join", L"1")
+FORM (Excitations_to_Pattern, U"Excitations: To Pattern", 0)
+	NATURAL (U"Join", U"1")
 	OK
 DO
 	LOOP {
 		iam (Excitations);
-		praat_new (Excitations_to_Pattern (me, GET_INTEGER (L"Join")), my name);
+		praat_new (Excitations_to_Pattern (me, GET_INTEGER (U"Join")), my name);
 	}
 END
 
@@ -2638,109 +2695,109 @@ END
 /************************* FileInMemory ***********************************/
 
 
-FORM_READ (FileInMemory_create, L"Create file in memory", 0, true)
+FORM_READ2 (FileInMemory_create, U"Create file in memory", 0, true) {
 	autoFileInMemory me = FileInMemory_create (file);
 	praat_new (me.transfer(), MelderFile_name (file));
-END
+END2 }
 
-FORM (FileInMemory_setId, L"FileInMemory: Set id", 0)
-	SENTENCE (L"New id", L"New id")
+FORM (FileInMemory_setId, U"FileInMemory: Set id", 0)
+	SENTENCE (U"New id", U"New id")
 	OK
 DO
 	LOOP {
 		iam (FileInMemory);
-		FileInMemory_setId (me, GET_STRING (L"New id"));
+		FileInMemory_setId (me, GET_STRING (U"New id"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (FileInMemory_showAsCode, L"FileInMemory: Show as code", 0)
-	WORD (L"Name", L"example")
-	INTEGER (L"Number of bytes per line", L"20")
+FORM (FileInMemory_showAsCode, U"FileInMemory: Show as code", 0)
+	WORD (U"Name", U"example")
+	INTEGER (U"Number of bytes per line", U"20")
 	OK
 DO
-	const wchar_t *name = GET_STRING (L"Name");
+	const char32 *name = GET_STRING (U"Name");
 	LOOP {
 		iam (FileInMemory);
 		MelderInfo_open ();
-		FileInMemory_showAsCode (me, name, GET_INTEGER (L"Number of bytes per line"));
+		FileInMemory_showAsCode (me, name, GET_INTEGER (U"Number of bytes per line"));
 		MelderInfo_close ();
 	}
 END
 
 /************************* FilesInMemory ***********************************/
 
-FORM (FilesInMemory_createFromDirectoryContents, L"Create files in memory from directory contents", 0)
-	SENTENCE (L"Name", L"list")
-	LABEL (L"", L"Directory:")
-	TEXTFIELD (L"Directory", L"/home/david/praat/src/espeak-work/espeak-1.46.13/espeak-data")
-	WORD (L"Only files that match pattern", L"*.txt")
+FORM (FilesInMemory_createFromDirectoryContents, U"Create files in memory from directory contents", 0)
+	SENTENCE (U"Name", U"list")
+	LABEL (U"", U"Directory:")
+	TEXTFIELD (U"Directory", U"/home/david/praat/src/espeak-work/espeak-1.46.13/espeak-data")
+	WORD (U"Only files that match pattern", U"*.txt")
 	OK
 DO
-	autoFilesInMemory me = FilesInMemory_createFromDirectoryContents (GET_STRING (L"Directory"), GET_STRING (L"Only files that match pattern"));
-	praat_new (me.transfer(), GET_STRING (L"Name"));
+	autoFilesInMemory me = FilesInMemory_createFromDirectoryContents (GET_STRING (U"Directory"), GET_STRING (U"Only files that match pattern"));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
 END
 
-FORM (FilesInMemory_createCopyFromFilesInMemory, L"", 0)
-	OPTIONMENU (L"Espeakdata", 5)
-	OPTION (L"phons")
-	OPTION (L"dicts")
-	OPTION (L"voices")
-	OPTION (L"variants")
-	OPTION (L"voices_names")
-	OPTION (L"variants_names")
+FORM (FilesInMemory_createCopyFromFilesInMemory, U"", 0)
+	OPTIONMENU (U"Espeakdata", 5)
+	OPTION (U"phons")
+	OPTION (U"dicts")
+	OPTION (U"voices")
+	OPTION (U"variants")
+	OPTION (U"voices_names")
+	OPTION (U"variants_names")
 	OK
 DO
-	long choice = GET_INTEGER (L"Espeakdata");
+	long choice = GET_INTEGER (U"Espeakdata");
 	if (choice == 1) {
 		autoFilesInMemory f = (FilesInMemory) Data_copy (espeakdata_phons);
-		praat_new (f.transfer(), L"espeakdata_phons");
+		praat_new (f.transfer(), U"espeakdata_phons");
 	}
 	else if (choice == 2) {
 		autoFilesInMemory f = (FilesInMemory) Data_copy (espeakdata_dicts);
-		praat_new (f.transfer(), L"espeakdata_dicts");
+		praat_new (f.transfer(), U"espeakdata_dicts");
 	}
 	else if (choice == 3) {
 		autoFilesInMemory f = (FilesInMemory) Data_copy (espeakdata_voices);
-		praat_new (f.transfer(), L"espeakdata_voices");
+		praat_new (f.transfer(), U"espeakdata_voices");
 	}
 	else if (choice == 4) {
 		autoFilesInMemory f = (FilesInMemory) Data_copy (espeakdata_variants);
-		praat_new (f.transfer(), L"espeakdata_variants");
+		praat_new (f.transfer(), U"espeakdata_variants");
 	}
 	else if (choice == 5) {
 		autoStrings s = (Strings) Data_copy (espeakdata_voices_names);
-		praat_new (s.transfer(), L"espeakdata_voices_names");
+		praat_new (s.transfer(), U"espeakdata_voices_names");
 	}
 	else if (choice == 6) {
 		autoStrings s = (Strings) Data_copy (espeakdata_variants_names);
-		praat_new (s.transfer(), L"espeakdata_variants_names");
+		praat_new (s.transfer(), U"espeakdata_variants_names");
 	}
 END
 
-FORM (FilesInMemory_showAsCode, L"FilesInMemory: Show as code", 0)
-	WORD (L"Name", L"example")
-	INTEGER (L"Number of bytes per line", L"20")
+FORM (FilesInMemory_showAsCode, U"FilesInMemory: Show as code", 0)
+	WORD (U"Name", U"example")
+	INTEGER (U"Number of bytes per line", U"20")
 	OK
 DO
 	LOOP {
 		iam (FilesInMemory);
 		MelderInfo_open ();
-		FilesInMemory_showAsCode (me, GET_STRING (L"Name"), GET_INTEGER (L"Number of bytes per line"));
+		FilesInMemory_showAsCode (me, GET_STRING (U"Name"), GET_INTEGER (U"Number of bytes per line"));
 		MelderInfo_close ();
 	}
 END
 
-FORM (FilesInMemory_showOneFileAsCode, L"FilesInMemory: Show one file as code", 0)
-	NATURAL (L"Index", L"1")
-	WORD (L"Name", L"example")
-	INTEGER (L"Number of bytes per line", L"20")
+FORM (FilesInMemory_showOneFileAsCode, U"FilesInMemory: Show one file as code", 0)
+	NATURAL (U"Index", U"1")
+	WORD (U"Name", U"example")
+	INTEGER (U"Number of bytes per line", U"20")
 	OK
 DO
 	LOOP {
 		iam (FilesInMemory);
 		MelderInfo_open ();
-		FilesInMemory_showOneFileAsCode (me, GET_INTEGER (L"Index"), GET_STRING (L"Name"), GET_INTEGER (L"Number of bytes per line"));
+		FilesInMemory_showOneFileAsCode (me, GET_INTEGER (U"Index"), GET_STRING (U"Name"), GET_INTEGER (U"Number of bytes per line"));
 		MelderInfo_close ();
 	}
 END
@@ -2752,13 +2809,13 @@ DIRECT (FileInMemory_to_FilesInMemory)
 		FileInMemory him = Data_copy (me);
 		Collection_addItem (thee.peek(), him);
 	}
-	praat_new (thee.transfer(), L"files");
+	praat_new (thee.transfer(), U"files");
 END
 
 DIRECT (FilesInMemory_addItems)
 	FilesInMemory thee = FIRST (FilesInMemory);
 	LOOP {
-		iam (Data);
+		iam (Daata);
 		if (CLASS == classFileInMemory) {
 			FileInMemory t1 = (FileInMemory) Data_copy (me);
 			Collection_addItem (thee, t1);
@@ -2771,7 +2828,7 @@ DIRECT (FilesInMemory_merge)
 	LOOP { iam (FilesInMemory); (f1 ? f2 : f1) = me; }
 	Melder_assert (f1 != 0 && f2 != 0);
 	autoFilesInMemory fim = (FilesInMemory) Collections_merge (f1, f2);
-	praat_new (fim.transfer(), f1 -> name, L"_", f2 -> name);
+	praat_new (fim.transfer(), f1 -> name, U"_", f2 -> name);
 END
 
 DIRECT (FilesInMemory_to_Strings_id)
@@ -2783,258 +2840,258 @@ END
 
 /************************* FilterBank ***********************************/
 
-FORM (FilterBank_drawFilters, L"FilterBank: Draw filters", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
+FORM (FilterBank_drawFilters, U"FilterBank: Draw filters", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		Matrix_drawRows (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-		GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"));
+		Matrix_drawRows (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+		GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"));
 	}
 END
 
-FORM (FilterBank_drawOneContour, L"FilterBank: Draw one contour", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	REAL (L"Height (dB)", L"40.0")
+FORM (FilterBank_drawOneContour, U"FilterBank: Draw one contour", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	REAL (U"Height (dB)", U"40.0")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		Matrix_drawOneContour (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"), GET_REAL (L"Height"));
+		Matrix_drawOneContour (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"), GET_REAL (U"Height"));
 	}
 END
 
-FORM (FilterBank_drawContours, L"FilterBank: Draw contours", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
+FORM (FilterBank_drawContours, U"FilterBank: Draw contours", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		Matrix_drawContours (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-		GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"));
+		Matrix_drawContours (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+		GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"));
 	}
 END
 
-FORM (FilterBank_drawFrequencyScales, L"FilterBank: Draw frequency scales", L"FilterBank: Draw frequency scales...")
-	RADIO (L"Horizontal frequency scale", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIOBUTTON (L"mel")
-	REAL (L"left Horizontal frequency range", L"0.0")
-	REAL (L"right Horizontal frequency range", L"0.0")
-	RADIO (L"Vertical frequency scale", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIOBUTTON (L"mel")
-	REAL (L"left Vertical frequency range", L"0.0")
-	REAL (L"right Vertical frequency range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (FilterBank_drawFrequencyScales, U"FilterBank: Draw frequency scales", U"FilterBank: Draw frequency scales...")
+	RADIO (U"Horizontal frequency scale", 1)
+	RADIOBUTTON (U"Hertz")
+	RADIOBUTTON (U"Bark")
+	RADIOBUTTON (U"mel")
+	REAL (U"left Horizontal frequency range", U"0.0")
+	REAL (U"right Horizontal frequency range", U"0.0")
+	RADIO (U"Vertical frequency scale", 1)
+	RADIOBUTTON (U"Hertz")
+	RADIOBUTTON (U"Bark")
+	RADIOBUTTON (U"mel")
+	REAL (U"left Vertical frequency range", U"0.0")
+	REAL (U"right Vertical frequency range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FilterBank);
-		FilterBank_drawFrequencyScales (me, GRAPHICS, GET_INTEGER (L"Horizontal frequency scale"),
-		GET_REAL (L"left Horizontal frequency range"), GET_REAL (L"right Horizontal frequency range"),
-		GET_INTEGER (L"Vertical frequency scale"), GET_REAL (L"left Vertical frequency range"),
-		GET_REAL (L"right Vertical frequency range"), GET_INTEGER (L"Garnish"));
+		FilterBank_drawFrequencyScales (me, GRAPHICS, GET_INTEGER (U"Horizontal frequency scale"),
+		GET_REAL (U"left Horizontal frequency range"), GET_REAL (U"right Horizontal frequency range"),
+		GET_INTEGER (U"Vertical frequency scale"), GET_REAL (U"left Vertical frequency range"),
+		GET_REAL (U"right Vertical frequency range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (MelSpectrogram_paintImage, L"MelSpectrogram: Paint image", L"MelSpectrogram: Paint image...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range (mel)", L"0.0")
-	REAL (L"right Frequency range (mel)", L"0.0")
-	REAL (L"left Amplitude range (dB)", L"0.0")
-	REAL (L"right Amplitude range (dB)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (MelSpectrogram_paintImage, U"MelSpectrogram: Paint image", U"MelSpectrogram: Paint image...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range (mel)", U"0.0")
+	REAL (U"right Frequency range (mel)", U"0.0")
+	REAL (U"left Amplitude range (dB)", U"0.0")
+	REAL (U"right Amplitude range (dB)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (MelSpectrogram);
-		BandFilterSpectrogram_paintImage (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-		GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Garnish"));
+		BandFilterSpectrogram_paintImage (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+		GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (BarkSpectrogram_paintImage, L"BarkSpectrogram: Paint image", L"BarkSpectrogram: Paint image...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range (bark)", L"0.0")
-	REAL (L"right Frequency range (bark)", L"0.0")
-	REAL (L"left Amplitude range (dB)", L"0.0")
-	REAL (L"right Amplitude range (dB)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (BarkSpectrogram_paintImage, U"BarkSpectrogram: Paint image", U"BarkSpectrogram: Paint image...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range (bark)", U"0.0")
+	REAL (U"right Frequency range (bark)", U"0.0")
+	REAL (U"left Amplitude range (dB)", U"0.0")
+	REAL (U"right Amplitude range (dB)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (BarkSpectrogram);
-		BandFilterSpectrogram_paintImage (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-		GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Garnish"));
+		BandFilterSpectrogram_paintImage (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+		GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FilterBank_paintImage, L"FilterBank: Paint image", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
+FORM (FilterBank_paintImage, U"FilterBank: Paint image", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		Matrix_paintImage (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-		GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"));
+		Matrix_paintImage (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+		GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"));
 	}
 END
 
-FORM (FilterBank_paintContours, L"FilterBank: Paint contours", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
+FORM (FilterBank_paintContours, U"FilterBank: Paint contours", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		Matrix_paintContours (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-		GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"));
+		Matrix_paintContours (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+		GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"));
 	}
 END
 
 
-FORM (FilterBank_paintCells, L"FilterBank: Paint cells", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
+FORM (FilterBank_paintCells, U"FilterBank: Paint cells", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		Matrix_paintCells (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-		GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"));
+		Matrix_paintCells (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+		GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"));
 	}
 END
 
-FORM (FilterBank_paintSurface, L"FilterBank: Paint surface", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
+FORM (FilterBank_paintSurface, U"FilterBank: Paint surface", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		Matrix_paintSurface (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"), 30, 45);
+		Matrix_paintSurface (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"), 30, 45);
 	}
 END
 
-FORM (FilterBank_getFrequencyInHertz, L"FilterBank: Get frequency in Hertz", L"FilterBank: Get frequency in Hertz...")
-	REAL (L"Frequency", L"10.0")
-	RADIO (L"Unit", 2)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIOBUTTON (L"mel")
+FORM (FilterBank_getFrequencyInHertz, U"FilterBank: Get frequency in Hertz", U"FilterBank: Get frequency in Hertz...")
+	REAL (U"Frequency", U"10.0")
+	RADIO (U"Unit", 2)
+	RADIOBUTTON (U"Hertz")
+	RADIOBUTTON (U"Bark")
+	RADIOBUTTON (U"mel")
 	OK
 DO
 	LOOP {
 		iam (FilterBank);
-		double f = FilterBank_getFrequencyInHertz (me, GET_REAL (L"Frequency"), GET_INTEGER (L"Unit"));
-		Melder_informationReal (f, L"Hertz");
+		double f = FilterBank_getFrequencyInHertz (me, GET_REAL (U"Frequency"), GET_INTEGER (U"Unit"));
+		Melder_informationReal (f, U"Hertz");
 	}
 END
 
-FORM (FilterBank_getFrequencyInBark, L"FilterBank: Get frequency in Bark", L"FilterBank: Get frequency in Bark...")
-	REAL (L"Frequency", L"93.17")
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIOBUTTON (L"mel")
+FORM (FilterBank_getFrequencyInBark, U"FilterBank: Get frequency in Bark", U"FilterBank: Get frequency in Bark...")
+	REAL (U"Frequency", U"93.17")
+	RADIO (U"Unit", 1)
+	RADIOBUTTON (U"Hertz")
+	RADIOBUTTON (U"Bark")
+	RADIOBUTTON (U"mel")
 	OK
 DO
 	LOOP {
 		iam (FilterBank);
-		double f = FilterBank_getFrequencyInBark (me, GET_REAL (L"Frequency"), GET_INTEGER (L"Unit"));
-		Melder_informationReal (f, L"Bark");
+		double f = FilterBank_getFrequencyInBark (me, GET_REAL (U"Frequency"), GET_INTEGER (U"Unit"));
+		Melder_informationReal (f, U"Bark");
 	}
 END
 
-FORM (FilterBank_getFrequencyInMel, L"FilterBank: Get frequency in mel", L"FilterBank: Get frequency in mel...")
-	REAL (L"Frequency", L"1000.0")
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIOBUTTON (L"mel")
+FORM (FilterBank_getFrequencyInMel, U"FilterBank: Get frequency in mel", U"FilterBank: Get frequency in mel...")
+	REAL (U"Frequency", U"1000.0")
+	RADIO (U"Unit", 1)
+	RADIOBUTTON (U"Hertz")
+	RADIOBUTTON (U"Bark")
+	RADIOBUTTON (U"mel")
 	OK
 DO
 	LOOP {
 		iam (FilterBank);
-		double f = FilterBank_getFrequencyInMel (me, GET_REAL (L"Frequency"), GET_INTEGER (L"Unit"));
-		Melder_informationReal (f, L"mel");
+		double f = FilterBank_getFrequencyInMel (me, GET_REAL (U"Frequency"), GET_INTEGER (U"Unit"));
+		Melder_informationReal (f, U"mel");
 	}
 END
 
-FORM (FilterBank_equalizeIntensities, L"FilterBank: Equalize intensities", L"")
-	REAL (L"Intensity (dB)", L"80.0")
+FORM (FilterBank_equalizeIntensities, U"FilterBank: Equalize intensities", U"")
+	REAL (U"Intensity (dB)", U"80.0")
 	OK
 DO
 	LOOP {
 		iam (FilterBank);
-		FilterBank_equalizeIntensities (me, GET_REAL (L"Intensity"));
+		FilterBank_equalizeIntensities (me, GET_REAL (U"Intensity"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (BandFilterSpectrogram_equalizeIntensities, L"BandFilterSpectrogram: Equalize intensities", L"")
-	REAL (L"Intensity (dB)", L"80.0")
+FORM (BandFilterSpectrogram_equalizeIntensities, U"BandFilterSpectrogram: Equalize intensities", U"")
+	REAL (U"Intensity (dB)", U"80.0")
 	OK
 DO
 	LOOP {
 		iam (BandFilterSpectrogram);
-		BandFilterSpectrogram_equalizeIntensities (me, GET_REAL (L"Intensity"));
+		BandFilterSpectrogram_equalizeIntensities (me, GET_REAL (U"Intensity"));
 		praat_dataChanged (me);
 	}
 END
@@ -3046,32 +3103,32 @@ DIRECT (FilterBank_to_Matrix)
 	}
 END
 
-FORM (BandFilterSpectrogram_to_Matrix, L"(BandFilterSpectrogram: To Matrix", 0)
-	BOOLEAN (L"Convert to dB values", 1)
+FORM (BandFilterSpectrogram_to_Matrix, U"(BandFilterSpectrogram: To Matrix", 0)
+	BOOLEAN (U"Convert to dB values", 1)
 	OK
 DO
 	LOOP {
 		iam (BandFilterSpectrogram);
-		praat_new (BandFilterSpectrogram_to_Matrix (me, GET_INTEGER (L"Convert to dB values")), my name);
+		praat_new (BandFilterSpectrogram_to_Matrix (me, GET_INTEGER (U"Convert to dB values")), my name);
 	}
 END
 
-FORM (FilterBanks_crossCorrelate, L"FilterBanks: Cross-correlate", 0)
-	RADIO_ENUM (L"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
-	RADIO_ENUM (L"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
+FORM (FilterBanks_crossCorrelate, U"FilterBanks: Cross-correlate", 0)
+	RADIO_ENUM (U"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
+	RADIO_ENUM (U"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
 	OK
 DO
 	FilterBank f1 = 0, f2 = 0;
 	LOOP { iam (FilterBank); (f1 ? f2 : f1) = me; }
 	Melder_assert (f1 != 0 && f2 != 0);
-	praat_new (FilterBanks_crossCorrelate (f1, f2, GET_ENUM (kSounds_convolve_scaling, L"Amplitude scaling"),
-		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, L"Signal outside time domain is...")),
-		f1 -> name, L"_", f2 -> name);
+	praat_new (FilterBanks_crossCorrelate (f1, f2, GET_ENUM (kSounds_convolve_scaling, U"Amplitude scaling"),
+		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, U"Signal outside time domain is...")),
+		f1 -> name, U"_", f2 -> name);
 END
 
-FORM (BandFilterSpectrograms_crossCorrelate, L"BandFilterSpectrograms: Cross-correlate", 0)
-	RADIO_ENUM (L"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
-	RADIO_ENUM (L"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
+FORM (BandFilterSpectrograms_crossCorrelate, U"BandFilterSpectrograms: Cross-correlate", 0)
+	RADIO_ENUM (U"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
+	RADIO_ENUM (U"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
 	OK
 DO
 	BandFilterSpectrogram f1 = 0, f2 = 0;
@@ -3080,27 +3137,27 @@ DO
 		(f1 ? f2 : f1) = me;
 	}
 	Melder_assert (f1 != 0 && f2 != 0);
-	praat_new (BandFilterSpectrograms_crossCorrelate (f1, f2, GET_ENUM (kSounds_convolve_scaling, L"Amplitude scaling"),
-		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, L"Signal outside time domain is...")),
-		f1 -> name, L"_", f2 -> name);
+	praat_new (BandFilterSpectrograms_crossCorrelate (f1, f2, GET_ENUM (kSounds_convolve_scaling, U"Amplitude scaling"),
+		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, U"Signal outside time domain is...")),
+		f1 -> name, U"_", f2 -> name);
 END
 
-FORM (FilterBanks_convolve, L"FilterBanks: Convolve", 0)
-	RADIO_ENUM (L"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
-	RADIO_ENUM (L"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
+FORM (FilterBanks_convolve, U"FilterBanks: Convolve", 0)
+	RADIO_ENUM (U"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
+	RADIO_ENUM (U"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
 	OK
 DO
 	FilterBank f1 = 0, f2 = 0;
 	LOOP { iam (FilterBank); (f1 ? f2 : f1) = me; }
 	Melder_assert (f1 != 0 && f2 != 0);
-	praat_new (FilterBanks_convolve (f1, f2, GET_ENUM (kSounds_convolve_scaling, L"Amplitude scaling"),
-		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, L"Signal outside time domain is...")),
-		f1 -> name, L"_", f2 -> name);
+	praat_new (FilterBanks_convolve (f1, f2, GET_ENUM (kSounds_convolve_scaling, U"Amplitude scaling"),
+		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, U"Signal outside time domain is...")),
+		f1 -> name, U"_", f2 -> name);
 END
 
-FORM (BandFilterSpectrograms_convolve, L"BandFilterSpectrograms: Convolve", 0)
-	RADIO_ENUM (L"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
-	RADIO_ENUM (L"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
+FORM (BandFilterSpectrograms_convolve, U"BandFilterSpectrograms: Convolve", 0)
+	RADIO_ENUM (U"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
+	RADIO_ENUM (U"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
 	OK
 DO
 	BandFilterSpectrogram f1 = 0, f2 = 0;
@@ -3109,9 +3166,9 @@ DO
 		(f1 ? f2 : f1) = me;
 	}
 	Melder_assert (f1 != 0 && f2 != 0);
-	praat_new (BandFilterSpectrograms_convolve (f1, f2, GET_ENUM (kSounds_convolve_scaling, L"Amplitude scaling"),
-		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, L"Signal outside time domain is...")),
-		f1 -> name, L"_", f2 -> name);
+	praat_new (BandFilterSpectrograms_convolve (f1, f2, GET_ENUM (kSounds_convolve_scaling, U"Amplitude scaling"),
+		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, U"Signal outside time domain is...")),
+		f1 -> name, U"_", f2 -> name);
 END
 
 DIRECT (FilterBank_to_Intensity)
@@ -3131,250 +3188,250 @@ END
 /*********** FormantFilter *******************************************/
 
 DIRECT (FormantFilter_help)
-	Melder_help (L"FormantFilter");
+	Melder_help (U"FormantFilter");
 END
 
-FORM (FormantFilter_drawFilterFunctions, L"FormantFilter: Draw filter functions", L"FilterBank: Draw filter functions...")
-	INTEGER (L"left Filter range", L"0")
-	INTEGER (L"right Filter range", L"0")
-	POSITIVE (L"Bandwidth (Hz)", L"100.0")
-	RADIO (L"Frequency scale", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIOBUTTON (L"mel")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	BOOLEAN (L"Amplitude scale in dB", 1)
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (FormantFilter_drawFilterFunctions, U"FormantFilter: Draw filter functions", U"FilterBank: Draw filter functions...")
+	INTEGER (U"left Filter range", U"0")
+	INTEGER (U"right Filter range", U"0")
+	POSITIVE (U"Bandwidth (Hz)", U"100.0")
+	RADIO (U"Frequency scale", 1)
+	RADIOBUTTON (U"Hertz")
+	RADIOBUTTON (U"Bark")
+	RADIOBUTTON (U"mel")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	BOOLEAN (U"Amplitude scale in dB", 1)
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FormantFilter);
-		FormantFilter_drawFilterFunctions (me, GRAPHICS, GET_REAL (L"Bandwidth"), GET_INTEGER (L"Frequency scale"),
-			GET_INTEGER (L"left Filter range"), GET_INTEGER (L"right Filter range"),
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_INTEGER (L"Amplitude scale in dB"),
-			GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Garnish"));
+		FormantFilter_drawFilterFunctions (me, GRAPHICS, GET_REAL (U"Bandwidth"), GET_INTEGER (U"Frequency scale"),
+			GET_INTEGER (U"left Filter range"), GET_INTEGER (U"right Filter range"),
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_INTEGER (U"Amplitude scale in dB"),
+			GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FormantFilter_drawSpectrum, L"FormantFilter: Draw spectrum (slice)", L"FilterBank: Draw spectrum (slice)...")
-	POSITIVE (L"Time (s)", L"0.1")
-	REAL (L"left Frequency range (Hz)", L"0.0")
-	REAL (L"right Frequency range (Hz)", L"0.0")
-	REAL (L"left Amplitude range (dB)", L"0.0")
-	REAL (L"right Amplitude range (dB)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (FormantFilter_drawSpectrum, U"FormantFilter: Draw spectrum (slice)", U"FilterBank: Draw spectrum (slice)...")
+	POSITIVE (U"Time (s)", U"0.1")
+	REAL (U"left Frequency range (Hz)", U"0.0")
+	REAL (U"right Frequency range (Hz)", U"0.0")
+	REAL (U"left Amplitude range (dB)", U"0.0")
+	REAL (U"right Amplitude range (dB)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FilterBank);
-		FilterBank_drawTimeSlice (me, GRAPHICS, GET_REAL (L"Time"), GET_REAL (L"left Frequency range"),
-			GET_REAL (L"right Frequency range"), GET_REAL (L"left Amplitude range"),
-			GET_REAL (L"right Amplitude range"), L"Hz", GET_INTEGER (L"Garnish"));
+		FilterBank_drawTimeSlice (me, GRAPHICS, GET_REAL (U"Time"), GET_REAL (U"left Frequency range"),
+			GET_REAL (U"right Frequency range"), GET_REAL (U"left Amplitude range"),
+			GET_REAL (U"right Amplitude range"), U"Hz", GET_INTEGER (U"Garnish"));
 	}
 END
 
 /****************** FormantGrid  *********************************/
 
-FORM (old_FormantGrid_draw, L"FormantGrid: Draw", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (=all)")
-	REAL (L"left Frequency range (Hz)", L"0.0")
-	REAL (L"right Frequency range (Hz)", L"0.0 (=auto)")
-	BOOLEAN (L"Bandwidths", false)
-	BOOLEAN (L"Garnish", true)
+FORM (old_FormantGrid_draw, U"FormantGrid: Draw", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (=all)")
+	REAL (U"left Frequency range (Hz)", U"0.0")
+	REAL (U"right Frequency range (Hz)", U"0.0 (=auto)")
+	BOOLEAN (U"Bandwidths", false)
+	BOOLEAN (U"Garnish", true)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FormantGrid);
-		FormantGrid_draw (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_INTEGER (L"Bandwidths"), GET_INTEGER (L"Garnish"), L"lines and speckles");
+		FormantGrid_draw (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_INTEGER (U"Bandwidths"), GET_INTEGER (U"Garnish"), U"lines and speckles");
 	}
 END
 
-FORM (FormantGrid_draw, L"FormantGrid: Draw", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (=all)")
-	REAL (L"left Frequency range (Hz)", L"0.0")
-	REAL (L"right Frequency range (Hz)", L"0.0 (=auto)")
-	BOOLEAN (L"Bandwidths", false)
-	BOOLEAN (L"Garnish", true)
-	LABEL (L"", L"")
-	OPTIONMENU (L"Drawing method", 1)
-	OPTION (L"lines")
-	OPTION (L"speckles")
-	OPTION (L"lines and speckles")
+FORM (FormantGrid_draw, U"FormantGrid: Draw", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (=all)")
+	REAL (U"left Frequency range (Hz)", U"0.0")
+	REAL (U"right Frequency range (Hz)", U"0.0 (=auto)")
+	BOOLEAN (U"Bandwidths", false)
+	BOOLEAN (U"Garnish", true)
+	LABEL (U"", U"")
+	OPTIONMENU (U"Drawing method", 1)
+	OPTION (U"lines")
+	OPTION (U"speckles")
+	OPTION (U"lines and speckles")
 	OK
 DO_ALTERNATIVE (old_FormantGrid_draw)
 	autoPraatPicture picture;
 	LOOP {
 		iam (FormantGrid);
-		FormantGrid_draw (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_INTEGER (L"Bandwidths"), GET_INTEGER (L"Garnish"), GET_STRING (L"Drawing method"));
+		FormantGrid_draw (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_INTEGER (U"Bandwidths"), GET_INTEGER (U"Garnish"), GET_STRING (U"Drawing method"));
 	}
 END
 
 /****************** FunctionTerms  *********************************/
 
-FORM (FunctionTerms_draw, L"FunctionTerms: Draw", 0)
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Extrapolate", 0)
-	BOOLEAN (L"Garnish", 1)
+FORM (FunctionTerms_draw, U"FunctionTerms: Draw", 0)
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Extrapolate", 0)
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FunctionTerms);
-		FunctionTerms_draw (me, GRAPHICS, GET_REAL (L"Xmin"), GET_REAL (L"Xmax"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_INTEGER (L"Extrapolate"), GET_INTEGER (L"Garnish"));
+		FunctionTerms_draw (me, GRAPHICS, GET_REAL (U"Xmin"), GET_REAL (U"Xmax"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_INTEGER (U"Extrapolate"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FunctionTerms_drawBasisFunction, L"FunctionTerms: Draw basis function", 0)
-	NATURAL (L"Index", L"1")
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Extrapolate", 0)
-	BOOLEAN (L"Garnish", 1)
+FORM (FunctionTerms_drawBasisFunction, U"FunctionTerms: Draw basis function", 0)
+	NATURAL (U"Index", U"1")
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Extrapolate", 0)
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FunctionTerms);
-		FunctionTerms_drawBasisFunction (me, GRAPHICS, GET_INTEGER (L"Index"), GET_REAL (L"Xmin"),
-			GET_REAL (L"Xmax"), GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_INTEGER (L"Extrapolate"), GET_INTEGER (L"Garnish"));
+		FunctionTerms_drawBasisFunction (me, GRAPHICS, GET_INTEGER (U"Index"), GET_REAL (U"Xmin"),
+			GET_REAL (U"Xmax"), GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_INTEGER (U"Extrapolate"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (FunctionTerms_evaluate, L"FunctionTerms: Evaluate", 0)
-	REAL (L"X", L"0.0")
+FORM (FunctionTerms_evaluate, U"FunctionTerms: Evaluate", 0)
+	REAL (U"X", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (FunctionTerms);
-		Melder_information (Melder_double (FunctionTerms_evaluate (me, GET_REAL (L"X"))));
+		Melder_information (FunctionTerms_evaluate (me, GET_REAL (U"X")));
 	}
 END
 
 DIRECT (FunctionTerms_getNumberOfCoefficients)
 	LOOP {
 		iam (FunctionTerms);
-		Melder_information (Melder_integer (my numberOfCoefficients));
+		Melder_information (my numberOfCoefficients);
 	}
 END
 
-FORM (FunctionTerms_getCoefficient, L"FunctionTerms: Get coefficient", 0)
-	LABEL (L"", L"p(x) = c[1] + c[2] x + ... c[n+1] x^n")
-	NATURAL (L"Index", L"1")
+FORM (FunctionTerms_getCoefficient, U"FunctionTerms: Get coefficient", 0)
+	LABEL (U"", U"p(x) = c[1] + c[2] x + ... c[n+1] x^n")
+	NATURAL (U"Index", U"1")
 	OK
 DO
-	long index = GET_INTEGER (L"Index");
+	long index = GET_INTEGER (U"Index");
 	LOOP {
 		iam (FunctionTerms);
 		if (index > my numberOfCoefficients) {
-			Melder_throw ("Index too large.");
+			Melder_throw (U"Index too large.");
 		}
-		Melder_information (Melder_double (my coefficients[index]));
+		Melder_information (my coefficients[index]);
 	}
 END
 
 DIRECT (FunctionTerms_getDegree)
 	LOOP {
 		iam (FunctionTerms);
-		Melder_information (Melder_integer (FunctionTerms_getDegree (me)));
+		Melder_information (FunctionTerms_getDegree (me));
 	}
 END
 
-FORM (FunctionTerms_getMaximum, L"FunctionTerms: Get maximum", L"Polynomial: Get maximum...")
-	LABEL (L"", L"Interval")
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
+FORM (FunctionTerms_getMaximum, U"FunctionTerms: Get maximum", U"Polynomial: Get maximum...")
+	LABEL (U"", U"Interval")
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (FunctionTerms);
-		double x = FunctionTerms_getMaximum (me, GET_REAL (L"Xmin"), GET_REAL (L"Xmax"));
-		Melder_information (Melder_double (x));
+		double x = FunctionTerms_getMaximum (me, GET_REAL (U"Xmin"), GET_REAL (U"Xmax"));
+		Melder_information (x);
 	}
 END
 
-FORM (FunctionTerms_getMinimum, L"FunctionTerms: Get minimum", L"Polynomial: Get minimum...")
-	LABEL (L"", L"Interval")
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
+FORM (FunctionTerms_getMinimum, U"FunctionTerms: Get minimum", U"Polynomial: Get minimum...")
+	LABEL (U"", U"Interval")
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (FunctionTerms);
-		double x = FunctionTerms_getMinimum (me, GET_REAL (L"Xmin"), GET_REAL (L"Xmax"));
-		Melder_information (Melder_double (x));
+		double x = FunctionTerms_getMinimum (me, GET_REAL (U"Xmin"), GET_REAL (U"Xmax"));
+		Melder_information (x);
 	}
 END
 
-FORM (FunctionTerms_getXOfMaximum, L"FunctionTerms: Get x of maximum", L"Polynomial: Get x of maximum...")
-	LABEL (L"", L"Interval")
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
+FORM (FunctionTerms_getXOfMaximum, U"FunctionTerms: Get x of maximum", U"Polynomial: Get x of maximum...")
+	LABEL (U"", U"Interval")
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (FunctionTerms);
-		double x = FunctionTerms_getXOfMaximum (me, GET_REAL (L"Xmin"), GET_REAL (L"Xmax"));
-		Melder_information (Melder_double (x));
+		double x = FunctionTerms_getXOfMaximum (me, GET_REAL (U"Xmin"), GET_REAL (U"Xmax"));
+		Melder_information (x);
 	}
 END
 
-FORM (FunctionTerms_getXOfMinimum, L"FunctionTerms: Get x of minimum", L"Polynomial: Get x of minimum...")
-	LABEL (L"", L"Interval")
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
+FORM (FunctionTerms_getXOfMinimum, U"FunctionTerms: Get x of minimum", U"Polynomial: Get x of minimum...")
+	LABEL (U"", U"Interval")
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (FunctionTerms);
-		double x = FunctionTerms_getXOfMinimum (me, GET_REAL (L"Xmin"), GET_REAL (L"Xmax"));
-		Melder_information (Melder_double (x));
+		double x = FunctionTerms_getXOfMinimum (me, GET_REAL (U"Xmin"), GET_REAL (U"Xmax"));
+		Melder_information (x);
 	}
 END
 
-FORM (FunctionTerms_setCoefficient, L"FunctionTerms: Set coefficient", 0)
-	LABEL (L"", L"p(x) = c[1]F[0] + c[2]F[1] + ... c[n+1]F[n]")
-	LABEL (L"", L"F[k] is of degree k")
-	NATURAL (L"Index", L"1")
-	REAL (L"Value", L"0.0")
+FORM (FunctionTerms_setCoefficient, U"FunctionTerms: Set coefficient", 0)
+	LABEL (U"", U"p(x) = c[1]F[0] + c[2]F[1] + ... c[n+1]F[n]")
+	LABEL (U"", U"F[k] is of degree k")
+	NATURAL (U"Index", U"1")
+	REAL (U"Value", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (FunctionTerms);
-		FunctionTerms_setCoefficient (me, GET_INTEGER (L"Index"), GET_REAL (L"Value"));
+		FunctionTerms_setCoefficient (me, GET_INTEGER (U"Index"), GET_REAL (U"Value"));
 	}
 END
 
-FORM (FunctionTerms_setDomain, L"FunctionTerms: Set domain", 0)
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"2.0")
+FORM (FunctionTerms_setDomain, U"FunctionTerms: Set domain", 0)
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"2.0")
 	OK
 DO
-	double xmin = GET_REAL (L"Xmin"), xmax = GET_REAL (L"Xmax");
+	double xmin = GET_REAL (U"Xmin"), xmax = GET_REAL (U"Xmax");
 	LOOP {
 		iam (FunctionTerms);
 		if (xmax <= xmin) {
-			Melder_throw ("Xmax must be larger than Xmin.");
+			Melder_throw (U"Xmax should be larger than Xmin.");
 		}
 		FunctionTerms_setDomain (me, xmin, xmax);
 	}
@@ -3382,128 +3439,128 @@ END
 
 /***************** Intensity ***************************************************/
 
-FORM (Intensity_to_TextGrid_detectSilences, L"Intensity: To TextGrid (silences)", L"Intensity: To TextGrid (silences)...")
-	REAL (L"Silence threshold (dB)", L"-25.0")
-	POSITIVE (L"Minimum silent interval duration (s)", L"0.1")
-	POSITIVE (L"Minimum sounding interval duration (s)", L"0.05")
-	WORD (L"Silent interval label", L"silent")
-	WORD (L"Sounding interval label", L"sounding")
+FORM (Intensity_to_TextGrid_detectSilences, U"Intensity: To TextGrid (silences)", U"Intensity: To TextGrid (silences)...")
+	REAL (U"Silence threshold (dB)", U"-25.0")
+	POSITIVE (U"Minimum silent interval duration (s)", U"0.1")
+	POSITIVE (U"Minimum sounding interval duration (s)", U"0.05")
+	WORD (U"Silent interval label", U"silent")
+	WORD (U"Sounding interval label", U"sounding")
 	OK
 DO
 	LOOP {
 		iam (Intensity);
-		praat_new (Intensity_to_TextGrid_detectSilences (me, GET_REAL (L"Silence threshold"),
-			GET_REAL (L"Minimum silent interval duration"), GET_REAL (L"Minimum sounding interval duration"),
-			GET_STRING (L"Silent interval label"), GET_STRING (L"Sounding interval label")), my name);
+		praat_new (Intensity_to_TextGrid_detectSilences (me, GET_REAL (U"Silence threshold"),
+			GET_REAL (U"Minimum silent interval duration"), GET_REAL (U"Minimum sounding interval duration"),
+			GET_STRING (U"Silent interval label"), GET_STRING (U"Sounding interval label")), my name);
 	}
 END
 
 /***************** IntensityTier ***************************************************/
 
-FORM (IntensityTier_to_TextGrid_detectSilences, L"IntensityTier: To TextGrid (silences)", L"Intensity: To TextGrid (silences)...")
-	REAL (L"Silence threshold (dB)", L"-25.0")
-	POSITIVE (L"Minimum silent interval duration (s)", L"0.1")
-	POSITIVE (L"Minimum sounding interval duration (s)", L"0.05")
-	WORD (L"Silent interval label", L"silent")
-	WORD (L"Sounding interval label", L"sounding")
-	POSITIVE (L"Time step (s)", L"0.001")
+FORM (IntensityTier_to_TextGrid_detectSilences, U"IntensityTier: To TextGrid (silences)", U"Intensity: To TextGrid (silences)...")
+	REAL (U"Silence threshold (dB)", U"-25.0")
+	POSITIVE (U"Minimum silent interval duration (s)", U"0.1")
+	POSITIVE (U"Minimum sounding interval duration (s)", U"0.05")
+	WORD (U"Silent interval label", U"silent")
+	WORD (U"Sounding interval label", U"sounding")
+	POSITIVE (U"Time step (s)", U"0.001")
 	OK
 DO
 	LOOP {
 		iam (IntensityTier);
-		praat_new (IntensityTier_to_TextGrid_detectSilences (me, GET_REAL (L"Time step"), GET_REAL (L"Silence threshold"),
-			GET_REAL (L"Minimum silent interval duration"), GET_REAL (L"Minimum sounding interval duration"),
-			GET_STRING (L"Silent interval label"), GET_STRING (L"Sounding interval label")), my name);
+		praat_new (IntensityTier_to_TextGrid_detectSilences (me, GET_REAL (U"Time step"), GET_REAL (U"Silence threshold"),
+			GET_REAL (U"Minimum silent interval duration"), GET_REAL (U"Minimum sounding interval duration"),
+			GET_STRING (U"Silent interval label"), GET_STRING (U"Sounding interval label")), my name);
 	}
 END
 
-FORM (IntensityTier_to_Intensity, L"", 0)
-	POSITIVE (L"Time step (s)", L"0.001")
+FORM (IntensityTier_to_Intensity, U"", 0)
+	POSITIVE (U"Time step (s)", U"0.001")
 	OK
 DO
 	LOOP {
 		iam (IntensityTier);
-		autoIntensity thee = IntensityTier_to_Intensity (me, GET_REAL (L"Time step"));
+		autoIntensity thee = IntensityTier_to_Intensity (me, GET_REAL (U"Time step"));
 		praat_new (thee.transfer(), my name);
 	}
 END
 
 /***************** ISpline ***************************************************/
 
-DIRECT (ISpline_help) Melder_help (L"ISpline"); END
+DIRECT (ISpline_help) Melder_help (U"ISpline"); END
 
-FORM (ISpline_create, L"Create ISpline", L"Create ISpline...")
-	WORD (L"Name", L"ispline")
-	LABEL (L"", L"Domain")
-	REAL (L"Xmin", L"0")
-	REAL (L"Xmax", L"1")
-	LABEL (L"", L"ISpline(x) = c[1] I[1](x) + c[2] I[1](x) + ... c[n] I[n](x)")
-	LABEL (L"", L"all I[k] are polynomials of degree \"Degree\"")
-	LABEL (L"", L"Relation: numberOfCoefficients == numberOfInteriorKnots + degree")
-	INTEGER (L"Degree", L"3")
-	SENTENCE (L"Coefficients (c[k])", L"1.2 2.0 1.2 1.2 3.0 0.0")
-	SENTENCE (L"Interior knots" , L"0.3 0.5 0.6")
+FORM (ISpline_create, U"Create ISpline", U"Create ISpline...")
+	WORD (U"Name", U"ispline")
+	LABEL (U"", U"Domain")
+	REAL (U"Xmin", U"0")
+	REAL (U"Xmax", U"1")
+	LABEL (U"", U"ISpline(x) = c[1] I[1](x) + c[2] I[1](x) + ... c[n] I[n](x)")
+	LABEL (U"", U"all I[k] are polynomials of degree \"Degree\"")
+	LABEL (U"", U"Relation: numberOfCoefficients == numberOfInteriorKnots + degree")
+	INTEGER (U"Degree", U"3")
+	SENTENCE (U"Coefficients (c[k])", U"1.2 2.0 1.2 1.2 3.0 0.0")
+	SENTENCE (U"Interior knots" , U"0.3 0.5 0.6")
 	OK
 DO
-	double xmin = GET_REAL (L"Xmin"), xmax = GET_REAL (L"Xmax");
-	long degree = GET_INTEGER (L"Degree");
+	double xmin = GET_REAL (U"Xmin"), xmax = GET_REAL (U"Xmax");
+	long degree = GET_INTEGER (U"Degree");
 	if (xmax <= xmin) {
-		Melder_throw ("Xmin must be smaller than Xmax.");
+		Melder_throw (U"Xmin should be smaller than Xmax.");
 	}
 	praat_new (ISpline_createFromStrings (xmin, xmax, degree,
-		GET_STRING (L"Coefficients"), GET_STRING (L"Interior knots")), GET_STRING (L"Name"));
+		GET_STRING (U"Coefficients"), GET_STRING (U"Interior knots")), GET_STRING (U"Name"));
 END
 
 /******************* KlattTable  *********************************/
 
-DIRECT (KlattTable_help) Melder_help (L"KlattTable"); END
+DIRECT (KlattTable_help) Melder_help (U"KlattTable"); END
 
 DIRECT (KlattTable_createExample)
-	praat_new (KlattTable_createExample (), L"example");
-END
-
-FORM (KlattTable_to_Sound, L"KlattTable: To Sound", L"KlattTable: To Sound...")
-	POSITIVE (L"Sampling frequency", L"16000")
-	RADIO (L"Synthesis model", 1)
-	RADIOBUTTON (L"Cascade")
-	RADIOBUTTON (L"Parallel")
-	NATURAL (L"Number of formants", L"5")
-	POSITIVE (L"Frame duration (s)", L"0.005")
-	REAL (L"Flutter percentage (%)", L"0.0")
-	OPTIONMENU (L"Voicing source", 1)
-	OPTION (L"Impulsive")
-	OPTION (L"Natural")
-	OPTIONMENU (L"Output type", 1)
-	OPTION (L"Sound")
-	OPTION (L"Voicing")
-	OPTION (L"Aspiration")
-	OPTION (L"Frication")
-	OPTION (L"Cascade-glottal-output")
-	OPTION (L"Parallel-glottal-output")
-	OPTION (L"Bypass-output")
-	OPTION (L"All-excitations")
-	OK
-DO
-	double flutter = GET_REAL (L"Flutter percentage");
-	int outputType = GET_INTEGER (L"Output type") - 1;
+	praat_new (KlattTable_createExample (), U"example");
+END
+
+FORM (KlattTable_to_Sound, U"KlattTable: To Sound", U"KlattTable: To Sound...")
+	POSITIVE (U"Sampling frequency", U"16000")
+	RADIO (U"Synthesis model", 1)
+	RADIOBUTTON (U"Cascade")
+	RADIOBUTTON (U"Parallel")
+	NATURAL (U"Number of formants", U"5")
+	POSITIVE (U"Frame duration (s)", U"0.005")
+	REAL (U"Flutter percentage (%)", U"0.0")   // ppgb: foutgevoelig
+	OPTIONMENU (U"Voicing source", 1)
+	OPTION (U"Impulsive")
+	OPTION (U"Natural")
+	OPTIONMENU (U"Output type", 1)
+	OPTION (U"Sound")
+	OPTION (U"Voicing")
+	OPTION (U"Aspiration")
+	OPTION (U"Frication")
+	OPTION (U"Cascade-glottal-output")
+	OPTION (U"Parallel-glottal-output")
+	OPTION (U"Bypass-output")
+	OPTION (U"All-excitations")
+	OK
+DO
+	double flutter = GET_REAL (U"Flutter percentage");
+	int outputType = GET_INTEGER (U"Output type") - 1;
 	if (flutter < 0 || flutter > 100) {
-		Melder_throw ("Flutter must be between 0 and 100%.");
+		Melder_throw (U"Flutter should be between 0 and 100%.");
 	}
 	LOOP {
 		iam (KlattTable);
-		praat_new (KlattTable_to_Sound (me, GET_REAL (L"Sampling frequency"), GET_INTEGER (L"Synthesis model"),
-			GET_INTEGER (L"Number of formants"), GET_REAL (L"Frame duration"), GET_INTEGER (L"Voicing source"),
-			GET_REAL (L"Flutter percentage"), outputType), my name);
+		praat_new (KlattTable_to_Sound (me, GET_REAL (U"Sampling frequency"), GET_INTEGER (U"Synthesis model"),
+			GET_INTEGER (U"Number of formants"), GET_REAL (U"Frame duration"), GET_INTEGER (U"Voicing source"),
+			GET_REAL (U"Flutter percentage"), outputType), my name);
 	}
 END
 
-FORM (KlattTable_to_KlattGrid, L"KlattTable: To KlattGrid", 0)
-	POSITIVE (L"Frame duration (s)", L"0.002")
+FORM (KlattTable_to_KlattGrid, U"KlattTable: To KlattGrid", 0)
+	POSITIVE (U"Frame duration (s)", U"0.002")
 	OK
 DO
 	LOOP {
 		iam (KlattTable);
-		praat_new (KlattTable_to_KlattGrid (me, GET_REAL (L"Frame duration")), my name);
+		praat_new (KlattTable_to_KlattGrid (me, GET_REAL (U"Frame duration")).transfer(), my name);
 	}
 END
 
@@ -3521,98 +3578,99 @@ DIRECT (Table_to_KlattTable)
 	}
 END
 
-FORM (Table_getMedianAbsoluteDeviation, L"Table: Get median absolute deviation", L"Table: Get median absolute deviation...")
-	SENTENCE (L"Column label", L"")
+FORM (Table_getMedianAbsoluteDeviation, U"Table: Get median absolute deviation", U"Table: Get median absolute deviation...")
+	SENTENCE (U"Column label", U"")
 	OK
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
 		double mad = Table_getMedianAbsoluteDeviation (me, icol);
-		Melder_information (Melder_double (mad));
+		Melder_information (mad);
 	}
 END
 
 static void print_means (Table me);
 static void print_means (Table me) {
-	wchar_t s[200];
 	Table_numericize_Assert (me, 2);
 	Table_numericize_Assert (me, 3);
 	if (my numberOfColumns < 3) {
-		MelderInfo_writeLine (L"Table has not the right format.");
+		MelderInfo_writeLine (U"Table does not have the right format.");
 		return;
 	}
-	swprintf (s, 199, L"%15ls\t%15ls\t%15ls", my columnHeaders[1].label, my columnHeaders[2].label, my columnHeaders[3].label);
-	MelderInfo_writeLine (s);
+	MelderInfo_writeLine (
+		Melder_padOrTruncate (15, my columnHeaders[1].label), U"\t",
+		Melder_padOrTruncate (15, my columnHeaders[2].label), U"\t",
+		Melder_padOrTruncate (15, my columnHeaders[3].label));
 	for (long irow = 1; irow <= my rows -> size; irow++) {
 		TableRow row = (TableRow) my rows -> item [irow];
-		swprintf (s, 199, L"%15ls\t%15g\t%15g", row -> cells[1].string, row -> cells[2].number, row -> cells[3].number);
-		MelderInfo_writeLine (s);
+		MelderInfo_writeLine (
+			Melder_padOrTruncate (15, row -> cells[1].string), U"\t",
+			Melder_padOrTruncate (15, Melder_double (row -> cells[2].number)), U"\t",
+			Melder_padOrTruncate (15, Melder_double (row -> cells[3].number)));
 	}
 }
 
-FORM (Table_getNumberOfRowsWhere, L"", 0)
-	LABEL (L"", L"Count only rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"M\"")
+FORM (Table_getNumberOfRowsWhere, U"", 0)
+	LABEL (U"", U"Count only rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"M\"")
 	OK
 DO
 	LOOP {
 		iam (Table);
-		long numberOfRows = Table_getNumberOfRowsWhere (me, GET_STRING (L"Formula"), interpreter);
-		Melder_information (Melder_integer (numberOfRows));
+		long numberOfRows = Table_getNumberOfRowsWhere (me, GET_STRING (U"Formula"), interpreter);
+		Melder_information (numberOfRows);
 	}
 END
 
-FORM (Table_reportOneWayAnova, L"Table: Report one-way anova",  L"Table: Report one-way anova...")
-	SENTENCE (L"Column with data", L"F0")
-	SENTENCE (L"Factor", L"Vowel")
-	BOOLEAN (L"Table with means", 0);
-	BOOLEAN (L"Table with differences between means", 0)
-	BOOLEAN (L"Table with Tukey's post-hoc HSD test", 0)
+FORM (Table_reportOneWayAnova, U"Table: Report one-way anova",  U"Table: Report one-way anova...")
+	SENTENCE (U"Column with data", U"F0")
+	SENTENCE (U"Factor", U"Vowel")
+	BOOLEAN (U"Table with means", 0);
+	BOOLEAN (U"Table with differences between means", 0)
+	BOOLEAN (U"Table with Tukey's post-hoc HSD test", 0)
 	OK
 DO
-	wchar_t *factor = GET_STRING (L"Factor");
-	wchar_t *dataLabel = GET_STRING (L"Column with data");
-	bool getMeans = GET_INTEGER (L"Table with means");
-	bool getMeansDiff = GET_INTEGER (L"Table with differences between means");
-	bool getMeansDiffProbabilities = GET_INTEGER (L"Table with Tukey's post-hoc HSD test");
+	char32 *factor = GET_STRING (U"Factor");
+	char32 *dataLabel = GET_STRING (U"Column with data");
+	bool getMeans = GET_INTEGER (U"Table with means");
+	bool getMeansDiff = GET_INTEGER (U"Table with differences between means");
+	bool getMeansDiffProbabilities = GET_INTEGER (U"Table with Tukey's post-hoc HSD test");
 	LOOP {
 		iam (Table);
 		long factorColumn = Table_getColumnIndexFromColumnLabel (me, factor);
 		long dataColumn = Table_getColumnIndexFromColumnLabel (me, dataLabel);
-		Table tmeans = 0, tmeansDiff = 0, tmeansDiffProbabilities = 0;
-		autoTable anova = Table_getOneWayAnalysisOfVarianceF (me, dataColumn, factorColumn, &tmeans,
-			&tmeansDiff, & tmeansDiffProbabilities);
-		autoTable means = tmeans, meansDiff = tmeansDiff, meansDiffProbabilities = tmeansDiffProbabilities;
+		autoTable means, meansDiff, meansDiffProbabilities;
+		autoTable anova = Table_getOneWayAnalysisOfVarianceF (me, dataColumn, factorColumn, &means, &meansDiff, & meansDiffProbabilities);
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"One-way analysis of \"", dataLabel, L"\" by \"", factor, L"\".\n");
+		MelderInfo_writeLine (U"One-way analysis of \"", dataLabel, U"\" by \"", factor, U"\".\n");
 		Table_printAsAnovaTable (anova.peek());
-		MelderInfo_writeLine (L"\nMeans:\n");
+		MelderInfo_writeLine (U"\nMeans:\n");
 		print_means (means.peek());
 		MelderInfo_close ();
 		if (getMeans) {
-			praat_new (means.transfer(), my name, L"_groupMeans");
+			praat_new (means.transfer(), my name, U"_groupMeans");
 		}
 		if (getMeansDiff) {
-			praat_new (meansDiff.transfer(), my name, L"_meansDiff");
+			praat_new (meansDiff.transfer(), my name, U"_meansDiff");
 		}
 		if (getMeansDiffProbabilities) {
-			praat_new (meansDiffProbabilities.transfer(), my name, L"_meansDiffP");
+			praat_new (meansDiffProbabilities.transfer(), my name, U"_meansDiffP");
 		}
 	}
 END
 
-FORM (Table_reportTwoWayAnova, L"Table: Report two-way anova", L"Table: Report two-way anova...")
-	SENTENCE (L"Column with data", L"Data")
-	SENTENCE (L"First factor", L"A")
-	SENTENCE (L"Second factor", L"B")
-	BOOLEAN (L"Table with means", 0);
+FORM (Table_reportTwoWayAnova, U"Table: Report two-way anova", U"Table: Report two-way anova...")
+	SENTENCE (U"Column with data", U"Data")
+	SENTENCE (U"First factor", U"A")
+	SENTENCE (U"Second factor", U"B")
+	BOOLEAN (U"Table with means", 0);
 	OK
 DO
-	wchar_t *factorA = GET_STRING (L"First factor");
-	wchar_t *factorB = GET_STRING (L"Second factor");
-	wchar_t *dataLabel = GET_STRING (L"Column with data");
-	bool getMeans = GET_INTEGER (L"Table with means");
+	char32 *factorA = GET_STRING (U"First factor");
+	char32 *factorB = GET_STRING (U"Second factor");
+	char32 *dataLabel = GET_STRING (U"Column with data");
+	bool getMeans = GET_INTEGER (U"Table with means");
 	LOOP {
 		iam (Table);
 		long factorColumnA = Table_getColumnIndexFromColumnLabel (me, factorA);
@@ -3622,26 +3680,26 @@ DO
 		autoTable anova = Table_getTwoWayAnalysisOfVarianceF (me, dataColumn, factorColumnA, factorColumnB, &tmeans, &tsizes);
 		autoTable means = tmeans, sizes = tsizes;
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"Two-way analysis of \"", dataLabel, L"\" by \"", factorA, L"\" and \"", factorB, L".\n");
+		MelderInfo_writeLine (U"Two-way analysis of \"", dataLabel, U"\" by \"", factorA, U"\" and \"", factorB, U".\n");
 		Table_printAsAnovaTable (anova.peek());
-		MelderInfo_writeLine (L"\nMeans:\n");
+		MelderInfo_writeLine (U"\nMeans:\n");
 		Table_printAsMeansTable (means.peek());
-		MelderInfo_writeLine (L"\nCell sizes:\n");
+		MelderInfo_writeLine (U"\nCell sizes:\n");
 		Table_printAsMeansTable (sizes.peek());
 		MelderInfo_close ();
 		if (getMeans) {
-			praat_new (means.transfer(), my name, L"_groupMeans");
+			praat_new (means.transfer(), my name, U"_groupMeans");
 		}
 	}
 END
 
-FORM (Table_reportOneWayKruskalWallis, L"Table: Report one-way Kruskal-Wallis", L"Table: Report one-way Kruskal-Wallis...")
-	SENTENCE (L"Column with data", L"Data")
-	SENTENCE (L"Factor", L"Group")
+FORM (Table_reportOneWayKruskalWallis, U"Table: Report one-way Kruskal-Wallis", U"Table: Report one-way Kruskal-Wallis...")
+	SENTENCE (U"Column with data", U"Data")
+	SENTENCE (U"Factor", U"Group")
 	OK
 DO
-	wchar_t *factor = GET_STRING (L"Factor");
-	wchar_t *dataLabel = GET_STRING (L"Column with data");
+	char32 *factor = GET_STRING (U"Factor");
+	char32 *dataLabel = GET_STRING (U"Column with data");
 	LOOP {
 		iam (Table);
 		long factorColumn = Table_getColumnIndexFromColumnLabel (me, factor);
@@ -3649,50 +3707,50 @@ DO
 		double degreesOfFreedom, kruskalWallis, probability;
 		autoTable thee = Table_getOneWayKruskalWallis (me, dataColumn, factorColumn, &degreesOfFreedom, &kruskalWallis, &probability);
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"One-way Kruskal-Wallis of \"", dataLabel, L"\" by \"", factor, L"\".\n");
-		MelderInfo_writeLine (L"Chi squared: ", Melder_double (kruskalWallis));
-		MelderInfo_writeLine (L"Degrees of freedom: ", Melder_double (degreesOfFreedom));
-		MelderInfo_writeLine (L"Probability: ", Melder_double (probability));
-		MelderInfo_writeLine (L"\nMeans:\n");
+		MelderInfo_writeLine (U"One-way Kruskal-Wallis of \"", dataLabel, U"\" by \"", factor, U"\".\n");
+		MelderInfo_writeLine (U"Chi squared: ", kruskalWallis);
+		MelderInfo_writeLine (U"Degrees of freedom: ", degreesOfFreedom);
+		MelderInfo_writeLine (U"Probability: ", probability);
+		MelderInfo_writeLine (U"\nMeans:\n");
 		print_means (thee.peek());
 		MelderInfo_close ();
-		//praat_new (thee.transfer(), my name, L"_groupMeans");
+		//praat_new (thee.transfer(), my name, U"_groupMeans");
 	}
 END
 
-FORM (Table_to_StringsIndex_column, L"Table: To StringsIndex (column)", 0)
-	SENTENCE (L"Column label", L"")
+FORM (Table_to_StringsIndex_column, U"Table: To StringsIndex (column)", 0)
+	SENTENCE (U"Column label", U"")
 	OK
 DO
-	wchar *columnLabel = GET_STRING (L"Column label");
+	char32 *columnLabel = GET_STRING (U"Column label");
 	LOOP {
 		iam (Table);
 		long icol = Table_getColumnIndexFromColumnLabel (me, columnLabel);
 		autoStringsIndex thee = Table_to_StringsIndex_column (me, icol);
-		praat_new (thee.transfer(), my name, L"_", columnLabel);
+		praat_new (thee.transfer(), my name, U"_", columnLabel);
 	}
 END
 
 /******************* LegendreSeries *********************************/
 
-FORM (LegendreSeries_create, L"Create LegendreSeries", L"Create LegendreSeries...")
-	WORD (L"Name", L"ls")
-	LABEL (L"", L"Domain")
-	REAL (L"Xmin", L"-1")
-	REAL (L"Xmax", L"1")
-	LABEL (L"", L"LegendreSeries(x) = c[1] P[0](x) + c[2] P[1](x) + ... c[n+1] P[n](x)")
-	LABEL (L"", L"P[k] is a Legendre polynomial of degree k")
-	SENTENCE (L"Coefficients", L"0 0 1.0")
+FORM (LegendreSeries_create, U"Create LegendreSeries", U"Create LegendreSeries...")
+	WORD (U"Name", U"ls")
+	LABEL (U"", U"Domain")
+	REAL (U"Xmin", U"-1")
+	REAL (U"Xmax", U"1")
+	LABEL (U"", U"LegendreSeries(x) = c[1] P[0](x) + c[2] P[1](x) + ... c[n+1] P[n](x)")
+	LABEL (U"", U"P[k] is a Legendre polynomial of degree k")
+	SENTENCE (U"Coefficients", U"0 0 1.0")
 	OK
 DO
-	double xmin = GET_REAL (L"Xmin"), xmax = GET_REAL (L"Xmax");
+	double xmin = GET_REAL (U"Xmin"), xmax = GET_REAL (U"Xmax");
 	if (xmin >= xmax) {
-		Melder_throw ("Xmin must be smaller than Xmax.");
+		Melder_throw (U"Xmin must be smaller than Xmax.");
 	}
-	praat_new (LegendreSeries_createFromString (xmin, xmax, GET_STRING (L"Coefficients")), GET_STRING (L"Name"));
+	praat_new (LegendreSeries_createFromString (xmin, xmax, GET_STRING (U"Coefficients")), GET_STRING (U"Name"));
 END
 
-DIRECT (LegendreSeries_help) Melder_help (L"LegendreSeries"); END
+DIRECT (LegendreSeries_help) Melder_help (U"LegendreSeries"); END
 
 DIRECT (LegendreSeries_to_Polynomial)
 	LOOP {
@@ -3702,40 +3760,40 @@ DIRECT (LegendreSeries_to_Polynomial)
 END
 /********************* LongSound **************************************/
 
-FORM_READ (LongSounds_appendToExistingSoundFile, L"LongSound: Append to existing sound file", 0, false)
+FORM_READ2 (LongSounds_appendToExistingSoundFile, U"LongSound: Append to existing sound file", 0, false) {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSounds_appendToExistingSoundFile (set.peek(), file);
-END
+END2 }
 
-FORM_WRITE (LongSounds_writeToStereoAiffFile, L"LongSound: Save as AIFF file", 0, L"aiff")
+FORM_WRITE (LongSounds_writeToStereoAiffFile, U"LongSound: Save as AIFF file", 0, U"aiff")
 	LongSound s1 = 0, s2 = 0;
 	LOOP { iam (LongSound); (s1 ? s2 : s1) = me; }
 	Melder_assert (s1 != 0 && s2 != 0);
 	LongSounds_writeToStereoAudioFile16 (s1, s2, Melder_AIFF, file);
 END
 
-FORM_WRITE (LongSounds_writeToStereoAifcFile, L"LongSound: Save as AIFC file", 0, L"aifc")
+FORM_WRITE (LongSounds_writeToStereoAifcFile, U"LongSound: Save as AIFC file", 0, U"aifc")
 	LongSound s1 = 0, s2 = 0;
 	LOOP { iam (LongSound); (s1 ? s2 : s1) = me; }
 	Melder_assert (s1 != 0 && s2 != 0);
 	LongSounds_writeToStereoAudioFile16 (s1, s2, Melder_AIFC, file);
 END
 
-FORM_WRITE (LongSounds_writeToStereoWavFile, L"LongSound: Save as WAV file", 0, L"wav")
+FORM_WRITE (LongSounds_writeToStereoWavFile, U"LongSound: Save as WAV file", 0, U"wav")
 	LongSound s1 = 0, s2 = 0;
 	LOOP { iam (LongSound); (s1 ? s2 : s1) = me; }
 	Melder_assert (s1 != 0 && s2 != 0);
 	LongSounds_writeToStereoAudioFile16 (s1, s2, Melder_WAV, file);
 END
 
-FORM_WRITE (LongSounds_writeToStereoNextSunFile, L"LongSound: Save as NeXT/Sun file", 0, L"au")
+FORM_WRITE (LongSounds_writeToStereoNextSunFile, U"LongSound: Save as NeXT/Sun file", 0, U"au")
 	LongSound s1 = 0, s2 = 0;
 	LOOP { iam (LongSound); (s1 ? s2 : s1) = me; }
 	Melder_assert (s1 != 0 && s2 != 0);
 	LongSounds_writeToStereoAudioFile16 (s1, s2, Melder_NEXT_SUN, file);
 END
 
-FORM_WRITE (LongSounds_writeToStereoNistFile, L"LongSound: Save as NIST file", 0, L"nist")
+FORM_WRITE (LongSounds_writeToStereoNistFile, U"LongSound: Save as NIST file", 0, U"nist")
 	LongSound s1 = 0, s2 = 0;
 	LOOP { iam (LongSound); (s1 ? s2 : s1) = me; }
 	Melder_assert (s1 != 0 && s2 != 0);
@@ -3744,113 +3802,113 @@ END
 
 /******************* Matrix **************************************************/
 
-FORM (Matrix_drawAsSquares, L"Matrix: Draw as squares", L"Matrix: Draw as squares...")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (Matrix_drawAsSquares, U"Matrix: Draw as squares", U"Matrix: Draw as squares...")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		Matrix_drawAsSquares (me, GRAPHICS, GET_REAL (L"left Horizontal range"),
-			GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"),
-			GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"));
+		Matrix_drawAsSquares (me, GRAPHICS, GET_REAL (U"left Horizontal range"),
+			GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"),
+			GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Matrix_drawDistribution, L"Matrix: Draw distribution", L"Matrix: Draw distribution...")
-	LABEL (L"", L"Selection of (part of) Matrix")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	LABEL (L"", L"Selection of Matrix values")
-	REAL (L"Minimum value", L"0.0")
-	REAL (L"Maximum value", L"0.0")
-	LABEL (L"", L"Display of the distribution")
-	NATURAL (L"Number of bins", L"10")
-	REAL (L"Minimum frequency", L"0.0")
-	REAL (L"Maximum frequency", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (Matrix_drawDistribution, U"Matrix: Draw distribution", U"Matrix: Draw distribution...")
+	LABEL (U"", U"Selection of (part of) Matrix")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	LABEL (U"", U"Selection of Matrix values")
+	REAL (U"Minimum value", U"0.0")
+	REAL (U"Maximum value", U"0.0")
+	LABEL (U"", U"Display of the distribution")
+	NATURAL (U"Number of bins", U"10")
+	REAL (U"Minimum frequency", U"0.0")
+	REAL (U"Maximum frequency", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		Matrix_drawDistribution (me, GRAPHICS, GET_REAL (L"left Horizontal range"),
-			GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"),
-			GET_REAL (L"right Vertical range"), GET_REAL (L"Minimum value"), GET_REAL (L"Maximum value"),
-			GET_INTEGER (L"Number of bins"), GET_REAL (L"Minimum frequency"), GET_REAL (L"Maximum frequency"), 0,
-			GET_INTEGER (L"Garnish"));
-	}
-END
-
-FORM (Matrix_drawCumulativeDistribution, L"Matrix: Draw cumulative distribution", L"")
-	LABEL (L"", L"Selection of (part of) Matrix")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	LABEL (L"", L"Selection of Matrix values")
-	REAL (L"Minimum value", L"0.0")
-	REAL (L"Maximum value", L"0.0")
-	LABEL (L"", L"Display of the distribution")
-	NATURAL (L"Number of bins", L"10")
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+		Matrix_drawDistribution (me, GRAPHICS, GET_REAL (U"left Horizontal range"),
+			GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"),
+			GET_REAL (U"right Vertical range"), GET_REAL (U"Minimum value"), GET_REAL (U"Maximum value"),
+			GET_INTEGER (U"Number of bins"), GET_REAL (U"Minimum frequency"), GET_REAL (U"Maximum frequency"), 0,
+			GET_INTEGER (U"Garnish"));
+	}
+END
+
+FORM (Matrix_drawCumulativeDistribution, U"Matrix: Draw cumulative distribution", U"")
+	LABEL (U"", U"Selection of (part of) Matrix")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	LABEL (U"", U"Selection of Matrix values")
+	REAL (U"Minimum value", U"0.0")
+	REAL (U"Maximum value", U"0.0")
+	LABEL (U"", U"Display of the distribution")
+	NATURAL (U"Number of bins", U"10")
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		Matrix_drawDistribution (me, GRAPHICS, GET_REAL (L"left Horizontal range"),
-			GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_REAL (L"Minimum value"), GET_REAL (L"Maximum value"), GET_INTEGER (L"Number of bins"),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"), 1, GET_INTEGER (L"Garnish"));
+		Matrix_drawDistribution (me, GRAPHICS, GET_REAL (U"left Horizontal range"),
+			GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_REAL (U"Minimum value"), GET_REAL (U"Maximum value"), GET_INTEGER (U"Number of bins"),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"), 1, GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Matrix_getMean, L"Matrix: Get mean", 0)
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
+FORM (Matrix_getMean, U"Matrix: Get mean", 0)
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
 	OK
 DO
 	Matrix me = FIRST_ANY (Matrix);
-	double mean = Matrix_getMean (me, GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"));
-	Melder_informationReal (mean, NULL);
+	double mean = Matrix_getMean (me, GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"));
+	Melder_informationReal (mean, nullptr);
 END
 
-FORM (Matrix_getStandardDeviation, L"Matrix: Get standard deviation", 0)
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
+FORM (Matrix_getStandardDeviation, U"Matrix: Get standard deviation", 0)
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
 	OK
 DO
 	Matrix me = FIRST_ANY (Matrix);
-	double stdev = Matrix_getStandardDeviation (me, GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"));
-	Melder_informationReal (stdev, NULL);
+	double stdev = Matrix_getStandardDeviation (me, GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"));
+	Melder_informationReal (stdev, nullptr);
 END
 
-FORM (Matrix_scale, L"Matrix: Scale", 0)
-	LABEL (L"", L"self[row, col] := self[row, col] / `Scale factor'")
-	RADIO (L"Scale factor", 1)
-	RADIOBUTTON (L"Extremum in matrix")
-	RADIOBUTTON (L"Extremum in each row")
-	RADIOBUTTON (L"Extremum in each column")
+FORM (Matrix_scale, U"Matrix: Scale", 0)
+	LABEL (U"", U"self[row, col] := self[row, col] / `Scale factor'")
+	RADIO (U"Scale factor", 1)
+	RADIOBUTTON (U"Extremum in matrix")
+	RADIOBUTTON (U"Extremum in each row")
+	RADIOBUTTON (U"Extremum in each column")
 	OK
 DO
-	int scale = GET_INTEGER (L"Scale factor");
-	if (scale < 1 || scale > 4) {
-		Melder_throw ("Scale must be in (0,4) interval.");
+	int scale = GET_INTEGER (U"Scale factor");
+	if (scale < 1 || scale > 3) {
+		Melder_throw (U"Scale must be in (1,3) interval.");
 	}
 	autoPraatPicture picture;
 	LOOP {
@@ -3863,62 +3921,63 @@ END
 DIRECT (Matrix_transpose)
 	LOOP {
 		iam (Matrix);
-		praat_new (Matrix_transpose (me), my name, L"_transposed");
+		praat_new (Matrix_transpose (me), my name, U"_transposed");
 	}
 END
 
-FORM (Matrix_solveEquation, L"Matrix: Solve equation", L"Matrix: Solve equation...")
-	REAL (L"Tolerance", L"1.19e-7")
+FORM (Matrix_solveEquation, U"Matrix: Solve equation", U"Matrix: Solve equation...")
+	REAL (U"Tolerance", U"1.19e-7")
 	OK
 DO
 	LOOP {
 		iam (Matrix);
-		praat_new (Matrix_solveEquation (me, GET_REAL (L"Tolerance")), Thing_getName (me), L"_solution");
+		praat_new (Matrix_solveEquation (me, GET_REAL (U"Tolerance")), Thing_getName (me), U"_solution");
 	}
 END
 
 DIRECT (Matrix_Categories_to_TableOfReal)
 	Matrix me = FIRST (Matrix);
 	Categories cat = FIRST (Categories);
-	praat_new (Matrix_and_Categories_to_TableOfReal (me, cat), my name, L"_", cat->name);
+	praat_new (Matrix_and_Categories_to_TableOfReal (me, cat), my name, U"_", cat->name);
 END
 
-FORM (Matrix_scatterPlot, L"Matrix: Scatter plot", 0)
-	NATURAL (L"Column for X-axis", L"1")
-	NATURAL (L"Column for Y-axis", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	POSITIVE (L"Mark size (mm)", L"1.0")
-	SENTENCE (L"Mark string (+xo.)", L"+")
-	BOOLEAN (L"Garnish", 1)
+FORM (Matrix_scatterPlot, U"Matrix: Scatter plot", 0)
+	NATURAL (U"Column for X-axis", U"1")
+	NATURAL (U"Column for Y-axis", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	POSITIVE (U"Mark size (mm)", U"1.0")
+	SENTENCE (U"Mark string (+xo.)", U"+")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
-	long x = GET_INTEGER (L"Column for X-axis");
-	long y = GET_INTEGER (L"Column for Y-axis");
+	long x = GET_INTEGER (U"Column for X-axis");
+	long y = GET_INTEGER (U"Column for Y-axis");
 	if (x == 0 || y == 0) {
-		Melder_throw ("X and Y component must differ from 0.");
+		Melder_throw (U"X and Y component must differ from 0.");
 	}
 	LOOP {
 		iam (Matrix);
-		Matrix_scatterPlot (me, GRAPHICS, x, y, GET_REAL (L"left Horizontal range"),
-			GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"),
-			GET_REAL (L"right Vertical range"), GET_REAL (L"Mark size"), GET_STRING (L"Mark string"),
-			GET_INTEGER (L"Garnish"));
+		Matrix_scatterPlot (me, GRAPHICS, x, y, GET_REAL (U"left Horizontal range"),
+			GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"),
+			GET_REAL (U"right Vertical range"), GET_REAL (U"Mark size"), GET_STRING (U"Mark string"),
+			GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (Matrix_to_Activation)
 	LOOP {
 		iam (Matrix);
-		praat_new (Matrix_to_Activation (me), my name);
+		autoActivation thee = Matrix_to_Activation (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (Matrices_to_DTW, L"Matrices: To DTW", L"Matrix: To DTW...")
-	LABEL (L"", L"Distance  between cepstral coefficients")
-	REAL (L"Distance metric", L"2.0")
+FORM (Matrices_to_DTW, U"Matrices: To DTW", U"Matrix: To DTW...")
+	LABEL (U"", U"Distance  between cepstral coefficients")
+	REAL (U"Distance metric", U"2.0")
 	DTW_constraints_addCommonFields (dia);
 	OK
 DO
@@ -3930,16 +3989,103 @@ DO
 		(m1 ? m2 : m1) = me;
 	}
 	Melder_assert (m1 && m2);
-	praat_new (Matrices_to_DTW (m1, m2, begin, end, slope, GET_REAL (L"Distance metric")), m1->name, L"_", m2->name);
+	autoDTW thee = Matrices_to_DTW (m1, m2, begin, end, slope, GET_REAL (U"Distance metric"));
+	praat_new (thee.transfer(), m1->name, U"_", m2->name);
 END
 
-FORM (Matrix_to_Pattern, L"Matrix: To Pattern", 0)
-	NATURAL (L"Join", L"1")
+FORM (Matrix_to_Pattern, U"Matrix: To Pattern", 0)
+	NATURAL (U"Join", U"1")
 	OK
 DO
 	LOOP {
 		iam (Matrix);
-		praat_new (Matrix_to_Pattern (me, GET_INTEGER (L"Join")), my name);
+		praat_new (Matrix_to_Pattern (me, GET_INTEGER (U"Join")), my name);
+	}
+END
+
+/**** Filterbank (deprecated) *******/
+
+DIRECT (FilterBank_getHighestFrequency)
+	LOOP {
+		iam (FilterBank);
+		Melder_information (my ymax, U" ", my v_getFrequencyUnit ());
+	}
+END
+
+DIRECT (FilterBank_getLowestFrequency)
+	LOOP {
+		iam (FilterBank);
+		Melder_information (my ymin, U" ", my v_getFrequencyUnit ());
+	}
+END
+
+DIRECT (FilterBank_getNumberOfFrequencies)
+	LOOP {
+		iam (FilterBank);
+		Melder_information (my ny);
+	}
+END
+
+DIRECT (FilterBank_getFrequencyDistance)
+	LOOP {
+		iam (FilterBank);
+		Melder_information (my dy, U" ", my v_getFrequencyUnit ());
+	}
+END
+
+FORM (FilterBank_getXofColumn, U"Get time of column", 0)
+	NATURAL (U"Column number", U"1")
+	OK
+DO
+	LOOP {
+		iam (FilterBank);
+		Melder_information (Matrix_columnToX (me, GET_INTEGER (U"Column number")));
+	}
+END
+
+FORM (FilterBank_getFrequencyOfRow, U"Get frequency of row", 0)
+	NATURAL (U"Row number", U"1")
+	OK
+DO
+	LOOP {
+		iam (FilterBank);
+		Melder_information (Matrix_rowToY (me, GET_INTEGER (U"Row number")), U" ", my v_getFrequencyUnit ());
+	}
+END
+
+FORM (FilterBank_getValueInCell, U"Get value in cell", 0)
+	POSITIVE (U"Time (s)", U"0.5")
+	POSITIVE (U"Frequency", U"1")
+	OK
+DO
+	double t = GET_REAL (U"Time");
+	double f = GET_REAL (U"Frequency");
+	LOOP {
+		iam (FilterBank);
+		if (f < my ymin || f > my ymax) {
+			Melder_throw (U"Frequency out of range.");
+		}
+		if (t < my xmin || t > my xmax) {
+			Melder_throw (U"Time out of range.");
+		}
+		long col = Matrix_xToNearestColumn (me, t);
+		if (col < 1) {
+			col = 1;
+		}
+		if (col > my nx) {
+			col = my nx;
+		}
+		long row = Matrix_yToNearestRow (me, f);
+		if (row < 1) {
+			row = 1;
+		}
+		if (row > my ny) {
+			row = my ny;
+		}
+		double ta = Matrix_columnToX (me, col);
+		double fa = Matrix_rowToY (me, row);
+		Melder_information (my z[row][col], U" (delta t: ", ta - t, U" f: ",
+		fa - f, U")");
 	}
 END
 
@@ -3948,65 +4094,65 @@ END
 DIRECT (BandFilterSpectrogram_getHighestFrequency)
 	LOOP {
 		iam (BandFilterSpectrogram);
-		Melder_information (Melder_double (my ymax), L" ", my v_getFrequencyUnit ());
+		Melder_information (my ymax, U" ", my v_getFrequencyUnit ());
 	}
 END
 
 DIRECT (BandFilterSpectrogram_getLowestFrequency)
 	LOOP {
 		iam (BandFilterSpectrogram);
-		Melder_information (Melder_double (my ymin), L" ", my v_getFrequencyUnit ());
+		Melder_information (my ymin, U" ", my v_getFrequencyUnit ());
 	}
 END
 
 DIRECT (BandFilterSpectrogram_getNumberOfFrequencies)
 	LOOP {
 		iam (BandFilterSpectrogram);
-		Melder_information (Melder_double (my ny));
+		Melder_information (my ny);
 	}
 END
 
 DIRECT (BandFilterSpectrogram_getFrequencyDistance)
 	LOOP {
 		iam (BandFilterSpectrogram);
-		Melder_information (Melder_double (my dy), L" ", my v_getFrequencyUnit ());
+		Melder_information (my dy, U" ", my v_getFrequencyUnit ());
 	}
 END
 
-FORM (BandFilterSpectrogram_getFrequencyOfRow, L"Get frequency of row", 0)
-	NATURAL (L"Row number", L"1")
+FORM (BandFilterSpectrogram_getFrequencyOfRow, U"Get frequency of row", 0)
+	NATURAL (U"Row number", U"1")
 	OK
 DO
 	LOOP {
 		iam (BandFilterSpectrogram);
-		Melder_information (Melder_double (Matrix_rowToY (me, GET_INTEGER (L"Row number"))), L" ", my v_getFrequencyUnit ());
+		Melder_information (Matrix_rowToY (me, GET_INTEGER (U"Row number")), U" ", my v_getFrequencyUnit ());
 	}
 END
 
-FORM (BandFilterSpectrogram_getXofColumn, L"Get time of column", 0)
-	NATURAL (L"Column number", L"1")
+FORM (BandFilterSpectrogram_getXofColumn, U"Get time of column", 0)
+	NATURAL (U"Column number", U"1")
 	OK
 DO
 	LOOP {
 		iam (BandFilterSpectrogram);
-		Melder_information (Melder_double (Matrix_columnToX (me, GET_INTEGER (L"Column number"))));
+		Melder_information (Matrix_columnToX (me, GET_INTEGER (U"Column number")));
 	}
 END
 
-FORM (BandFilterSpectrogram_getValueInCell, L"Get value in cell", 0)
-	POSITIVE (L"Time (s)", L"0.5")
-	POSITIVE (L"Frequency", L"1")
+FORM (BandFilterSpectrogram_getValueInCell, U"Get value in cell", 0)
+	POSITIVE (U"Time (s)", U"0.5")
+	POSITIVE (U"Frequency", U"1")
 	OK
 DO
-	double t = GET_REAL (L"Time");
-	double f = GET_REAL (L"Frequency");
+	double t = GET_REAL (U"Time");
+	double f = GET_REAL (U"Frequency");
 	LOOP {
 		iam (BandFilterSpectrogram);
 		if (f < my ymin || f > my ymax) {
-			Melder_throw ("Frequency out of range.");
+			Melder_throw (U"Frequency out of range.");
 		}
 		if (t < my xmin || t > my xmax) {
-			Melder_throw ("Time out of range.");
+			Melder_throw (U"Time out of range.");
 		}
 		long col = Matrix_xToNearestColumn (me, t);
 		if (col < 1) {
@@ -4024,192 +4170,192 @@ DO
 		}
 		double ta = Matrix_columnToX (me, col);
 		double fa = Matrix_rowToY (me, row);
-		Melder_information (Melder_single (my z[row][col]), L" (delta t: ", Melder_double (ta - t), L" f: ",
-		Melder_double (fa - f), L")");
+		Melder_information (Melder_single (my z[row][col]), U" (delta t: ", ta - t, U" f: ",
+		fa - f, U")");
 	}
 END
 
 /**************** MelFilter *******************************************/
 
 DIRECT (MelFilter_help)
-	Melder_help (L"MelFilter");
+	Melder_help (U"MelFilter");
 END
 
 DIRECT (MelSpectrogram_help)
-	Melder_help (L"MelSpectrogram");
+	Melder_help (U"MelSpectrogram");
 END
 
-FORM (MelFilter_drawFilterFunctions, L"MelFilter: Draw filter functions", L"FilterBank: Draw filter functions...")
-	INTEGER (L"left Filter range", L"0")
-	INTEGER (L"right Filter range", L"0")
-	RADIO (L"Frequency scale", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIOBUTTON (L"Mel")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	BOOLEAN (L"Amplitude scale in dB", 0)
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (MelFilter_drawFilterFunctions, U"MelFilter: Draw filter functions", U"FilterBank: Draw filter functions...")
+	INTEGER (U"left Filter range", U"0")
+	INTEGER (U"right Filter range", U"0")
+	RADIO (U"Frequency scale", 1)
+	RADIOBUTTON (U"Hertz")
+	RADIOBUTTON (U"Bark")
+	RADIOBUTTON (U"Mel")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	BOOLEAN (U"Amplitude scale in dB", 0)
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (MelFilter);
-		MelFilter_drawFilterFunctions (me, GRAPHICS, GET_INTEGER (L"Frequency scale"),
-			GET_INTEGER (L"left Filter range"), GET_INTEGER (L"right Filter range"),
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_INTEGER (L"Amplitude scale in dB"),
-			GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"),
-			GET_INTEGER (L"Garnish"));
+		MelFilter_drawFilterFunctions (me, GRAPHICS, GET_INTEGER (U"Frequency scale"),
+			GET_INTEGER (U"left Filter range"), GET_INTEGER (U"right Filter range"),
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_INTEGER (U"Amplitude scale in dB"),
+			GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"),
+			GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (MelSpectrogram_drawTriangularFilterFunctions, L"MelSpectrogram: Draw triangulat filter functions", L"MelSpectrogram: Draw filter functions...")
-	INTEGER (L"left Filter range", L"0")
-	INTEGER (L"right Filter range", L"0")
-	RADIO (L"Frequency scale", 1)
-	RADIOBUTTON (L"Mel")
-	RADIOBUTTON (L"Hertz")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right Frequency range", L"0.0")
-	BOOLEAN (L"Amplitude scale in dB", 0)
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (MelSpectrogram_drawTriangularFilterFunctions, U"MelSpectrogram: Draw triangulat filter functions", U"MelSpectrogram: Draw filter functions...")
+	INTEGER (U"left Filter range", U"0")
+	INTEGER (U"right Filter range", U"0")
+	RADIO (U"Frequency scale", 1)
+	RADIOBUTTON (U"Mel")
+	RADIOBUTTON (U"Hertz")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right Frequency range", U"0.0")
+	BOOLEAN (U"Amplitude scale in dB", 0)
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (MelSpectrogram);
-		MelSpectrogram_drawTriangularFilterFunctions (me, GRAPHICS, GET_INTEGER (L"Frequency scale") - 1,
-			GET_INTEGER (L"left Filter range"), GET_INTEGER (L"right Filter range"),
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_INTEGER (L"Amplitude scale in dB"),
-			GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"),
-			GET_INTEGER (L"Garnish"));
+		MelSpectrogram_drawTriangularFilterFunctions (me, GRAPHICS, GET_INTEGER (U"Frequency scale") - 1,
+			GET_INTEGER (U"left Filter range"), GET_INTEGER (U"right Filter range"),
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_INTEGER (U"Amplitude scale in dB"),
+			GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"),
+			GET_INTEGER (U"Garnish"));
 	}
 END
 
 
-FORM (MelFilter_drawSpectrum, L"MelFilter: Draw spectrum (slice)", L"FilterBank: Draw spectrum (slice)...")
-	POSITIVE (L"Time (s)", L"0.1")
-	REAL (L"left Frequency range (mel)", L"0.0")
-	REAL (L"right Frequency range (mel)", L"0.0")
-	REAL (L"left Amplitude range (dB)", L"0.0")
-	REAL (L"right Amplitude range (dB)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (MelFilter_drawSpectrum, U"MelFilter: Draw spectrum (slice)", U"FilterBank: Draw spectrum (slice)...")
+	POSITIVE (U"Time (s)", U"0.1")
+	REAL (U"left Frequency range (mel)", U"0.0")
+	REAL (U"right Frequency range (mel)", U"0.0")
+	REAL (U"left Amplitude range (dB)", U"0.0")
+	REAL (U"right Amplitude range (dB)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (FilterBank);
-		FilterBank_drawTimeSlice (me, GRAPHICS, GET_REAL (L"Time"), GET_REAL (L"left Frequency range"),
-			GET_REAL (L"right Frequency range"), GET_REAL (L"left Amplitude range"),
-			GET_REAL (L"right Amplitude range"), L"Mels", GET_INTEGER (L"Garnish"));
+		FilterBank_drawTimeSlice (me, GRAPHICS, GET_REAL (U"Time"), GET_REAL (U"left Frequency range"),
+			GET_REAL (U"right Frequency range"), GET_REAL (U"left Amplitude range"),
+			GET_REAL (U"right Amplitude range"), U"Mels", GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (MelSpectrogram_drawSpectrumAtNearestTimeSlice, L"MelSpectrogram: Draw spectrum at nearest time slice", L"BandFilterSpectrogram: Draw spectrum at nearest time slice...")
-	REAL (L"Time (s)", L"0.1")
-	REAL (L"left Frequency range (mel)", L"0.0")
-	REAL (L"right Frequency range (mel)", L"0.0")
-	REAL (L"left Amplitude range (dB)", L"0.0")
-	REAL (L"right Amplitude range (dB)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (MelSpectrogram_drawSpectrumAtNearestTimeSlice, U"MelSpectrogram: Draw spectrum at nearest time slice", U"BandFilterSpectrogram: Draw spectrum at nearest time slice...")
+	REAL (U"Time (s)", U"0.1")
+	REAL (U"left Frequency range (mel)", U"0.0")
+	REAL (U"right Frequency range (mel)", U"0.0")
+	REAL (U"left Amplitude range (dB)", U"0.0")
+	REAL (U"right Amplitude range (dB)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (MelSpectrogram);
-		BandFilterSpectrogram_drawSpectrumAtNearestTimeSlice (me, GRAPHICS, GET_REAL (L"Time"), GET_REAL (L"left Frequency range"),
-			GET_REAL (L"right Frequency range"), GET_REAL (L"left Amplitude range"),
-			GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Garnish"));
+		BandFilterSpectrogram_drawSpectrumAtNearestTimeSlice (me, GRAPHICS, GET_REAL (U"Time"), GET_REAL (U"left Frequency range"),
+			GET_REAL (U"right Frequency range"), GET_REAL (U"left Amplitude range"),
+			GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (BarkSpectrogram_drawSpectrumAtNearestTimeSlice, L"BarkSpectrogram: Draw spectrum at nearest time slice", L"BandFilterSpectrogram: Draw spectrum at nearest time slice...")
-	REAL (L"Time (s)", L"0.1")
-	REAL (L"left Frequency range (bark)", L"0.0")
-	REAL (L"right Frequency range (bark)", L"0.0")
-	REAL (L"left Amplitude range (dB)", L"0.0")
-	REAL (L"right Amplitude range (dB)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (BarkSpectrogram_drawSpectrumAtNearestTimeSlice, U"BarkSpectrogram: Draw spectrum at nearest time slice", U"BandFilterSpectrogram: Draw spectrum at nearest time slice...")
+	REAL (U"Time (s)", U"0.1")
+	REAL (U"left Frequency range (bark)", U"0.0")
+	REAL (U"right Frequency range (bark)", U"0.0")
+	REAL (U"left Amplitude range (dB)", U"0.0")
+	REAL (U"right Amplitude range (dB)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (MelSpectrogram);
-		BandFilterSpectrogram_drawSpectrumAtNearestTimeSlice (me, GRAPHICS, GET_REAL (L"Time"), GET_REAL (L"left Frequency range"),
-			GET_REAL (L"right Frequency range"), GET_REAL (L"left Amplitude range"),
-			GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Garnish"));
+		BandFilterSpectrogram_drawSpectrumAtNearestTimeSlice (me, GRAPHICS, GET_REAL (U"Time"), GET_REAL (U"left Frequency range"),
+			GET_REAL (U"right Frequency range"), GET_REAL (U"left Amplitude range"),
+			GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (MelFilter_paint, L"FilterBank: Paint", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Frequency range (mel)", L"0.0")
-	REAL (L"right Frequency range (mel)", L"0.0")
-	REAL (L"left Amplitude range", L"0.0")
-	REAL (L"right Amplitude range", L"0.0")
-	BOOLEAN (L"Garnish", 0)
+FORM (MelFilter_paint, U"FilterBank: Paint", 0)
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Frequency range (mel)", U"0.0")
+	REAL (U"right Frequency range (mel)", U"0.0")
+	REAL (U"left Amplitude range", U"0.0")
+	REAL (U"right Amplitude range", U"0.0")
+	BOOLEAN (U"Garnish", 0)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Matrix);
-		FilterBank_paint ((FilterBank) me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-		GET_REAL (L"left Amplitude range"), GET_REAL (L"right Amplitude range"), GET_INTEGER (L"Garnish"));
+		FilterBank_paint ((FilterBank) me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+		GET_REAL (U"left Amplitude range"), GET_REAL (U"right Amplitude range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (MelFilter_to_MFCC, L"MelFilter: To MFCC", L"MelSpectrogram: To MFCC...")
-	NATURAL (L"Number of coefficients", L"12")
+FORM (MelFilter_to_MFCC, U"MelFilter: To MFCC", U"MelSpectrogram: To MFCC...")
+	NATURAL (U"Number of coefficients", U"12")
 	OK
 DO
 	LOOP {
 		iam (MelFilter);
-		praat_new (MelFilter_to_MFCC (me, GET_INTEGER (L"Number of coefficients")), my name);
+		praat_new (MelFilter_to_MFCC (me, GET_INTEGER (U"Number of coefficients")), my name);
 	}
 END
 
-FORM (MelSpectrogram_to_MFCC, L"MelSpectrogram: To MFCC", L"MelSpectrogram: To MFCC...")
-	NATURAL (L"Number of coefficients", L"12")
+FORM (MelSpectrogram_to_MFCC, U"MelSpectrogram: To MFCC", U"MelSpectrogram: To MFCC...")
+	NATURAL (U"Number of coefficients", U"12")
 	OK
 DO
 	LOOP {
 		iam (MelSpectrogram);
-		praat_new (MelSpectrogram_to_MFCC (me, GET_INTEGER (L"Number of coefficients")), my name);
+		praat_new (MelSpectrogram_to_MFCC (me, GET_INTEGER (U"Number of coefficients")), my name);
 	}
 END
 
 /**************** Ltas *******************************************/
 
 #include "UnicodeData.h"
-FORM (Ltas_reportSpectralTilt, L"Ltas: Report spectral tilt", 0)
-	POSITIVE (L"left Frequency range (Hz)", L"100.0")
-	POSITIVE (L"right Frequency range (Hz)", L"5000.0")
-	OPTIONMENU (L"Frequency scale", 1)
-	OPTION (L"Linear")
-	OPTION (L"Logarithmic")
-	OPTIONMENU (L"Fit method", 2)
-	OPTION (L"Least squares")
-	OPTION (L"Robust")
+FORM (Ltas_reportSpectralTilt, U"Ltas: Report spectral tilt", 0)
+	POSITIVE (U"left Frequency range (Hz)", U"100.0")
+	POSITIVE (U"right Frequency range (Hz)", U"5000.0")
+	OPTIONMENU (U"Frequency scale", 1)
+	OPTION (U"Linear")
+	OPTION (U"Logarithmic")
+	OPTIONMENU (U"Fit method", 2)
+	OPTION (U"Least squares")
+	OPTION (U"Robust")
 	OK
 DO
-	bool logScale = GET_INTEGER (L"Frequency scale") == 2;
+	bool logScale = GET_INTEGER (U"Frequency scale") == 2;
 	LOOP {
 		iam (Ltas);
 		double a, b;
-		Ltas_fitTiltLine (me, GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			logScale, GET_INTEGER (L"Fit method"), &a, &b);
+		Ltas_fitTiltLine (me, GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			logScale, GET_INTEGER (U"Fit method"), &a, &b);
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"Spectral model: amplitude_dB(frequency_Hz) " UNITEXT_ALMOST_EQUAL_TO " ", logScale ? L"offset + slope * log (frequency_Hz)" : L"offset + slope * frequency_Hz");
-		MelderInfo_writeLine (L"Slope: ", Melder_double (a), logScale ? L" dB/decade" : L" dB/Hz");
-		MelderInfo_writeLine (L"Offset: ", Melder_double (b), L" dB");
+		MelderInfo_writeLine (U"Spectral model: amplitude_dB(frequency_Hz) " UNITEXT_ALMOST_EQUAL_TO " ", logScale ? U"offset + slope * log (frequency_Hz)" : U"offset + slope * frequency_Hz");
+		MelderInfo_writeLine (U"Slope: ", a, logScale ? U" dB/decade" : U" dB/Hz");
+		MelderInfo_writeLine (U"Offset: ", b, U" dB");
 		MelderInfo_close ();
 	}
 END
@@ -4218,57 +4364,57 @@ END
 /**************** MFCC *******************************************/
 
 DIRECT (MFCC_help)
-	Melder_help (L"MFCC");
+	Melder_help (U"MFCC");
 END
 
-FORM (MFCC_to_MelFilter, L"MFCC: To MelFilter", 0)
-	INTEGER (L"From coefficient", L"0")
-	INTEGER (L"To coefficient", L"0")
+FORM (MFCC_to_MelFilter, U"MFCC: To MelFilter", 0)
+	INTEGER (U"From coefficient", U"0")
+	INTEGER (U"To coefficient", U"0")
 	OK
 DO
 	LOOP {
 		iam (MFCC);
-		praat_new (MFCC_to_MelFilter (me, GET_INTEGER (L"From coefficient"), GET_INTEGER (L"To coefficient")), my name);
+		praat_new (MFCC_to_MelFilter (me, GET_INTEGER (U"From coefficient"), GET_INTEGER (U"To coefficient")), my name);
 	}
 END
 
-FORM (MFCC_to_MelSpectrogram, L"MFCC: MelSpectrogram", L"MFCC: To MelSpectrogram...")
-	INTEGER (L"From coefficient", L"0")
-	INTEGER (L"To coefficient", L"0")
-	BOOLEAN (L"Include constant term", 1)
+FORM (MFCC_to_MelSpectrogram, U"MFCC: MelSpectrogram", U"MFCC: To MelSpectrogram...")
+	INTEGER (U"From coefficient", U"0")
+	INTEGER (U"To coefficient", U"0")
+	BOOLEAN (U"Include constant term", 1)
 	OK
 DO
 	LOOP {
 		iam (MFCC);
-		praat_new (MFCC_to_MelSpectrogram (me, GET_INTEGER (L"From coefficient"), GET_INTEGER (L"To coefficient"),
-			GET_INTEGER (L"Include constant term")), my name);
+		praat_new (MFCC_to_MelSpectrogram (me, GET_INTEGER (U"From coefficient"), GET_INTEGER (U"To coefficient"),
+			GET_INTEGER (U"Include constant term")), my name);
 	}
 END
 
-FORM (MFCC_to_TableOfReal, L"MFCC: To TableOfReal", L"MFCC: To TableOfReal...")
-	BOOLEAN (L"Include energy", 0)
+FORM (MFCC_to_TableOfReal, U"MFCC: To TableOfReal", U"MFCC: To TableOfReal...")
+	BOOLEAN (U"Include energy", 0)
 	OK
 DO
 	LOOP {
 		iam (MFCC);
-		praat_new (MFCC_to_TableOfReal (me, GET_INTEGER (L"Include energy")), my name);
+		praat_new (MFCC_to_TableOfReal (me, GET_INTEGER (U"Include energy")), my name);
 	}
 END
 
-FORM (MFCC_to_Matrix_features, L"MFCC: To Matrix (features)", L"")
-	POSITIVE (L"Window length (s)", L"0.025")
-	BOOLEAN (L"Include energy", 0)
+FORM (MFCC_to_Matrix_features, U"MFCC: To Matrix (features)", U"")
+	POSITIVE (U"Window length (s)", U"0.025")
+	BOOLEAN (U"Include energy", 0)
 	OK
 DO
 	LOOP {
 		iam (MFCC);
-		praat_new (MFCC_to_Matrix_features (me, GET_REAL (L"Window length"), GET_INTEGER (L"Include energy")), my name);
+		praat_new (MFCC_to_Matrix_features (me, GET_REAL (U"Window length"), GET_INTEGER (U"Include energy")), my name);
 	}
 END
 
-FORM (MFCCs_crossCorrelate, L"MFCC & MFCC: Cross-correlate", 0)
-	RADIO_ENUM (L"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
-	RADIO_ENUM (L"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
+FORM (MFCCs_crossCorrelate, U"MFCC & MFCC: Cross-correlate", 0)
+	RADIO_ENUM (U"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
+	RADIO_ENUM (U"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
 	OK
 DO
 	MFCC m1 = 0, m2 = 0;
@@ -4278,14 +4424,14 @@ DO
 	}
 	Melder_assert (m1 && m2);
 	praat_new (MFCCs_crossCorrelate (m1, m2,
-		GET_ENUM (kSounds_convolve_scaling, L"Amplitude scaling"),
-		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, L"Signal outside time domain is...")),
-		m1 -> name, L"_", m2 -> name);
+		GET_ENUM (kSounds_convolve_scaling, U"Amplitude scaling"),
+		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, U"Signal outside time domain is...")),
+		m1 -> name, U"_", m2 -> name);
 END
 
-FORM (MFCCs_convolve, L"MFCC & MFCC: Convolve", 0)
-	RADIO_ENUM (L"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
-	RADIO_ENUM (L"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
+FORM (MFCCs_convolve, U"MFCC & MFCC: Convolve", 0)
+	RADIO_ENUM (U"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
+	RADIO_ENUM (U"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
 	OK
 DO
 	MFCC m1 = 0, m2 = 0;
@@ -4295,9 +4441,9 @@ DO
 	}
 	Melder_assert (m1 && m2);
 	praat_new (MFCCs_convolve (m1, m2,
-		GET_ENUM (kSounds_convolve_scaling, L"Amplitude scaling"),
-		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, L"Signal outside time domain is...")),
-		m1 -> name, L"_", m2 -> name);
+		GET_ENUM (kSounds_convolve_scaling, U"Amplitude scaling"),
+		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, U"Signal outside time domain is...")),
+		m1 -> name, U"_", m2 -> name);
 END
 
 DIRECT (MFCC_to_Sound)
@@ -4309,82 +4455,83 @@ END
 
 /**************** MSpline *******************************************/
 
-FORM (MSpline_create, L"Create MSpline", L"Create MSpline...")
-	WORD (L"Name", L"mspline")
-	LABEL (L"", L"Domain")
-	REAL (L"Xmin", L"0")
-	REAL (L"Xmax", L"1")
-	LABEL (L"", L"MSpline(x) = c[1] M[1](x) + c[2] M[1](x) + ... c[n] M[n](x)")
-	LABEL (L"", L"all M[k] are polynomials of degree \"Degree\"")
-	LABEL (L"", L"Relation: numberOfCoefficients == numberOfInteriorKnots + degree + 1")
-	INTEGER (L"Degree", L"2")
-	SENTENCE (L"Coefficients (c[k])", L"1.2 2.0 1.2 1.2 3.0 0.0")
-	SENTENCE (L"Interior knots" , L"0.3 0.5 0.6")
-	OK
-DO
-	double xmin = GET_REAL (L"Xmin"), xmax = GET_REAL (L"Xmax");
-	long degree = GET_INTEGER (L"Degree");
+FORM (MSpline_create, U"Create MSpline", U"Create MSpline...")
+	WORD (U"Name", U"mspline")
+	LABEL (U"", U"Domain")
+	REAL (U"Xmin", U"0")
+	REAL (U"Xmax", U"1")
+	LABEL (U"", U"MSpline(x) = c[1] M[1](x) + c[2] M[1](x) + ... c[n] M[n](x)")
+	LABEL (U"", U"all M[k] are polynomials of degree \"Degree\"")
+	LABEL (U"", U"Relation: numberOfCoefficients == numberOfInteriorKnots + degree + 1")
+	INTEGER (U"Degree", U"2")
+	SENTENCE (U"Coefficients (c[k])", U"1.2 2.0 1.2 1.2 3.0 0.0")
+	SENTENCE (U"Interior knots" , U"0.3 0.5 0.6")
+	OK
+DO
+	double xmin = GET_REAL (U"Xmin"), xmax = GET_REAL (U"Xmax");
+	long degree = GET_INTEGER (U"Degree");
 	if (xmin >= xmax) {
-		Melder_throw ("Xmin must be smaller than Xmax.");
+		Melder_throw (U"Xmin must be smaller than Xmax.");
 	}
 	praat_new (MSpline_createFromStrings (xmin, xmax, degree,
-		GET_STRING (L"Coefficients"), GET_STRING (L"Interior knots")), GET_STRING (L"Name"));
+		GET_STRING (U"Coefficients"), GET_STRING (U"Interior knots")), GET_STRING (U"Name"));
 END
 
-DIRECT (MSpline_help) Melder_help (L"MSpline"); END
+DIRECT (MSpline_help) Melder_help (U"MSpline"); END
 
 /********************** Pattern *******************************************/
 
 DIRECT (Pattern_and_Categories_to_Discriminant)
 	Pattern me = FIRST (Pattern);
 	Categories cat = FIRST (Categories);
-	praat_new (Pattern_and_Categories_to_Discriminant (me, cat), Thing_getName (me), L"_", Thing_getName (cat));
-	END
+	autoDiscriminant thee = Pattern_and_Categories_to_Discriminant (me, cat);
+	praat_new (thee.transfer(), my name, U"_", cat -> name);
+END
 
-	FORM (Pattern_draw, L"Pattern: Draw", 0)
-	NATURAL (L"Pattern number", L"1")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (Pattern_draw, U"Pattern: Draw", 0)
+	NATURAL (U"Pattern number", U"1")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Pattern);
-		Pattern_draw (me, GRAPHICS, GET_INTEGER (L"Pattern number"),
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"));
+		Pattern_draw (me, GRAPHICS, GET_INTEGER (U"Pattern number"),
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Pattern_formula, L"Pattern: Formula", 0)
-	LABEL (L"label", L"        y := 1; for row := 1 to nrow do { x := 1; "
+FORM (Pattern_formula, U"Pattern: Formula", 0)
+	LABEL (U"label", U"        y := 1; for row := 1 to nrow do { x := 1; "
 		"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + 1 } "
 		"y := y + 1 }}")
-	TEXTFIELD (L"formula", L"self")
+	TEXTFIELD (U"formula", U"self")
 	OK
 DO
 	praat_Fon_formula (dia, interpreter);
 END
 
-FORM (Pattern_setValue, L"Pattern: Set value", L"Pattern: Set value...")
-	NATURAL (L"Row number", L"1")
-	NATURAL (L"Column number", L"1")
-	REAL (L"New value", L"0.0")
+FORM (Pattern_setValue, U"Pattern: Set value", U"Pattern: Set value...")
+	NATURAL (U"Row number", U"1")
+	NATURAL (U"Column number", U"1")
+	REAL (U"New value", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (Pattern);
-		long row = GET_INTEGER (L"Row number"), column = GET_INTEGER (L"Column number");
+		long row = GET_INTEGER (U"Row number"), column = GET_INTEGER (U"Column number");
 		if (row > my ny) {
-			Melder_throw ("Row number must not be greater than number of rows.");
+			Melder_throw (U"Row number must not be greater than number of rows.");
 		}
 		if (column > my nx) {
-			Melder_throw ("Column number must not be greater than number of columns.");
+			Melder_throw (U"Column number must not be greater than number of columns.");
 		}
-		my z [row] [column] = GET_REAL (L"New value");
+		my z [row] [column] = GET_REAL (U"New value");
 		praat_dataChanged (me);
 	}
 END
@@ -4399,165 +4546,165 @@ END
 /******************* PCA ******************************/
 
 DIRECT (PCA_help)
-	Melder_help (L"PCA");
+	Melder_help (U"PCA");
 END
 
 DIRECT (hint_PCA_and_TableOfReal_to_Configuration)
-	Melder_information (L"You can get principal components by selecting a PCA and a TableOfReal\n"
+	Melder_information (U"You can get principal components by selecting a PCA and a TableOfReal\n"
 		"together and choosing \"To Configuration...\".");
 END
 
 DIRECT (hint_PCA_and_Covariance_Project)
-	Melder_information (L"You can get a new Covariance object rotated to the directions of the direction vectors\n"
+	Melder_information (U"You can get a new Covariance object rotated to the directions of the direction vectors\n"
 		" in the PCA object by selecting a PCA and a Covariance object together.");
 END
 
 DIRECT (hint_PCA_and_Configuration_to_TableOfReal_reconstruct)
-	Melder_information (L"You can reconstruct the original TableOfReal as well as possible from\n"
+	Melder_information (U"You can reconstruct the original TableOfReal as well as possible from\n"
 		" the principal components in the Configuration and the direction vectors in the PCA object.");
 END
 
-FORM (PCA_and_TableOfReal_getFractionVariance, L"PCA & TableOfReal: Get fraction variance", L"PCA & TableOfReal: Get fraction variance...")
-	NATURAL (L"left Principal component range", L"1")
-	NATURAL (L"right Principal component range", L"1")
+FORM (PCA_and_TableOfReal_getFractionVariance, U"PCA & TableOfReal: Get fraction variance", U"PCA & TableOfReal: Get fraction variance...")
+	NATURAL (U"left Principal component range", U"1")
+	NATURAL (U"right Principal component range", U"1")
 	OK
 DO
 	PCA me = FIRST (PCA);
 	TableOfReal tab = FIRST (TableOfReal);
-	Melder_information (Melder_double (PCA_and_TableOfReal_getFractionVariance (me, tab,
-		GET_INTEGER (L"left Principal component range"), GET_INTEGER (L"right Principal component range"))));
+	Melder_information (PCA_and_TableOfReal_getFractionVariance (me, tab,
+		GET_INTEGER (U"left Principal component range"), GET_INTEGER (U"right Principal component range")));
 END
 
 DIRECT (PCA_and_Configuration_to_TableOfReal_reconstruct)
 	PCA me = FIRST (PCA);
 	Configuration conf = FIRST (Configuration);
-	praat_new (PCA_and_Configuration_to_TableOfReal_reconstruct (me, conf), my name, L"_", conf->name);
+	praat_new (PCA_and_Configuration_to_TableOfReal_reconstruct (me, conf), my name, U"_", conf->name);
 END
 
-FORM (PCA_and_TableOfReal_to_Configuration, L"PCA & TableOfReal: To Configuration", L"PCA & TableOfReal: To Configuration...")
-	INTEGER (L"Number of dimensions", L"0 (=all)")
+FORM (PCA_and_TableOfReal_to_Configuration, U"PCA & TableOfReal: To Configuration", U"PCA & TableOfReal: To Configuration...")
+	INTEGER (U"Number of dimensions", U"0 (=all)")
 	OK
 DO
-	long dimension = GET_INTEGER (L"Number of dimensions");
+	long dimension = GET_INTEGER (U"Number of dimensions");
 	if (dimension < 0) {
-		Melder_throw ("Number of dimensions must be greater equal zero.");
+		Melder_throw (U"Number of dimensions must be greater equal zero.");
 	}
 	PCA me = FIRST (PCA);
 	TableOfReal tab = FIRST_GENERIC (TableOfReal);
-	praat_new (PCA_and_TableOfReal_to_Configuration (me, tab, dimension), my name, L"_", tab->name);
+	praat_new (PCA_and_TableOfReal_to_Configuration (me, tab, dimension), my name, U"_", tab->name);
 END
 
-FORM (PCA_and_TableOfReal_to_TableOfReal_zscores, L"PCA & TableOfReal: To TableOfReal (z-scores)", L"PCA & TableOfReal: To TableOfReal (z-scores)...")
-	INTEGER (L"Number of dimensions", L"0 (=all)")
+FORM (PCA_and_TableOfReal_to_TableOfReal_zscores, U"PCA & TableOfReal: To TableOfReal (z-scores)", U"PCA & TableOfReal: To TableOfReal (z-scores)...")
+	INTEGER (U"Number of dimensions", U"0 (=all)")
 	OK
 DO
-	long dimension = GET_INTEGER (L"Number of dimensions");
+	long dimension = GET_INTEGER (U"Number of dimensions");
 	if (dimension < 0) {
-		Melder_throw ("Number of dimensions must be greater than or equal to zero.");
+		Melder_throw (U"Number of dimensions must be greater than or equal to zero.");
 	}
 	PCA me = FIRST (PCA);
 	TableOfReal thee = FIRST_GENERIC (TableOfReal);
-	praat_new (PCA_and_TableOfReal_to_TableOfReal_zscores (me, thee, dimension), my name, L"_", thy name, L"_zscores");
+	praat_new (PCA_and_TableOfReal_to_TableOfReal_zscores (me, thee, dimension), my name, U"_", thy name, U"_zscores");
 END
 
-FORM (PCA_getCentroidElement, L"PCA: Get centroid element...", 0)
-	NATURAL (L"Number", L"1")
+FORM (PCA_getCentroidElement, U"PCA: Get centroid element...", 0)
+	NATURAL (U"Number", U"1")
 	OK
 DO
-	long number = GET_INTEGER (L"Number");
+	long number = GET_INTEGER (U"Number");
 	LOOP {
 		iam (PCA);
 		if (number > my dimension) {
-			Melder_throw ("Number may not be larger than ", my dimension, ".");
+			Melder_throw (U"Number may not be larger than ", my dimension, U".");
 		}
-		Melder_information (Melder_double (my centroid[number]), L" (element ", Melder_integer (number), L")");
+		Melder_information (my centroid[number], U" (element ", number, U")");
 	}
 END
 
-FORM (PCA_getEqualityOfEigenvalues, L"PCA: Get equality of eigenvalues", L"PCA: Get equality of eigenvalues...")
-	INTEGER (L"left Eigenvalue range", L"0")
-	INTEGER (L"right Eigenvalue range", L"0")
-	BOOLEAN (L"Conservative test", 0)
+FORM (PCA_getEqualityOfEigenvalues, U"PCA: Get equality of eigenvalues", U"PCA: Get equality of eigenvalues...")
+	INTEGER (U"left Eigenvalue range", U"0")
+	INTEGER (U"right Eigenvalue range", U"0")
+	BOOLEAN (U"Conservative test", 0)
 	OK
 DO
 	LOOP {
 		iam (PCA);
 		long ndf; double p, chisq;
-		PCA_getEqualityOfEigenvalues (me, GET_INTEGER (L"left Eigenvalue range"),
-		GET_INTEGER (L"right Eigenvalue range"), GET_INTEGER (L"Conservative test"), &p, &chisq, &ndf);
-		Melder_information (Melder_double (p), L" (=probability, based on chisq = ",
-		Melder_double (chisq), L"and ndf = ", Melder_integer (ndf));
+		PCA_getEqualityOfEigenvalues (me, GET_INTEGER (U"left Eigenvalue range"),
+		GET_INTEGER (U"right Eigenvalue range"), GET_INTEGER (U"Conservative test"), &p, &chisq, &ndf);
+		Melder_information (p, U" (=probability, based on chisq = ",
+		chisq, U"and ndf = ", ndf);
 	}
 END
 
-FORM (PCA_getNumberOfComponentsVAF, L"PCA: Get number of components (VAF)", L"PCA: Get number of components (VAF)...")
-	POSITIVE (L"Variance fraction (0-1)", L"0.95")
+FORM (PCA_getNumberOfComponentsVAF, U"PCA: Get number of components (VAF)", U"PCA: Get number of components (VAF)...")
+	POSITIVE (U"Variance fraction (0-1)", U"0.95")
 	OK
 DO
-	double f = GET_REAL (L"Variance fraction");
+	double f = GET_REAL (U"Variance fraction");
 	LOOP {
 		iam (Eigen);
 		if (f <= 0 || f > 1) {
-			Melder_throw ("The variance fraction must be in interval (0-1).");
+			Melder_throw (U"The variance fraction must be in interval (0-1).");
 		}
-		Melder_information (Melder_integer (Eigen_getDimensionOfFraction (me, f)));
+		Melder_information (Eigen_getDimensionOfFraction (me, f));
 	}
 END
 
-FORM (PCA_getFractionVAF, L"PCA: Get fraction variance accounted for", L"PCA: Get fraction variance accounted for...")
-	NATURAL (L"left Principal component range", L"1")
-	NATURAL (L"right Principal component range", L"1")
+FORM (PCA_getFractionVAF, U"PCA: Get fraction variance accounted for", U"PCA: Get fraction variance accounted for...")
+	NATURAL (U"left Principal component range", U"1")
+	NATURAL (U"right Principal component range", U"1")
 	OK
 DO
-	long from = GET_INTEGER (L"left Principal component range");
-	long to = GET_INTEGER (L"right Principal component range");
+	long from = GET_INTEGER (U"left Principal component range");
+	long to = GET_INTEGER (U"right Principal component range");
 	if (from > to) {
-		Melder_throw ("The second component must be greater than or equal to the first component.");
+		Melder_throw (U"The second component must be greater than or equal to the first component.");
 	}
 	LOOP {
 		iam (Eigen);
 		if (from > to) {
-			Melder_throw ("The second component must be greater than or equal to the first component.");
+			Melder_throw (U"The second component must be greater than or equal to the first component.");
 		}
-		Melder_information (Melder_double (Eigen_getCumulativeContributionOfComponents (me, from, to)));
+		Melder_information (Eigen_getCumulativeContributionOfComponents (me, from, to));
 	}
 END
 
-FORM (PCA_invertEigenvector, L"PCA: Invert eigenvector", 0)
-	NATURAL (L"Eigenvector number", L"1")
+FORM (PCA_invertEigenvector, U"PCA: Invert eigenvector", 0)
+	NATURAL (U"Eigenvector number", U"1")
 	OK
 DO
 	LOOP {
 		iam (Eigen);
-		Eigen_invertEigenvector (me, GET_INTEGER (L"Eigenvector number"));
+		Eigen_invertEigenvector (me, GET_INTEGER (U"Eigenvector number"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (PCA_to_TableOfReal_reconstruct1, L"PCA: To TableOfReal (reconstruct)", L"PCA: To TableOfReal (reconstruct 1)...")
-	SENTENCE (L"Coefficients", L"1.0 1.0")
+FORM (PCA_to_TableOfReal_reconstruct1, U"PCA: To TableOfReal (reconstruct)", U"PCA: To TableOfReal (reconstruct 1)...")
+	SENTENCE (U"Coefficients", U"1.0 1.0")
 	OK
 DO
 	LOOP {
 		iam (PCA);
-		praat_new (PCA_to_TableOfReal_reconstruct1 (me, GET_STRING (L"Coefficients")), my name, L"_reconstructed");
+		praat_new (PCA_to_TableOfReal_reconstruct1 (me, GET_STRING (U"Coefficients")), my name, U"_reconstructed");
 	}
 END
 
-FORM (PCAs_to_Procrustes, L"PCA & PCA: To Procrustes", L"PCA & PCA: To Procrustes...")
-	NATURAL (L"left Eigenvector range", L"1")
-	NATURAL (L"right Eigenvector range", L"2")
+FORM (PCAs_to_Procrustes, U"PCA & PCA: To Procrustes", U"PCA & PCA: To Procrustes...")
+	NATURAL (U"left Eigenvector range", U"1")
+	NATURAL (U"right Eigenvector range", U"2")
 	OK
 DO
-	long from = GET_INTEGER (L"left Eigenvector range");
-	long to = GET_INTEGER (L"right Eigenvector range");
+	long from = GET_INTEGER (U"left Eigenvector range");
+	long to = GET_INTEGER (U"right Eigenvector range");
 	PCA p1 = 0, p2 = 0;
 	LOOP {
 		iam (PCA);
 		(p1 ? p2 : p1) = me;
 	}
 	Melder_assert (p1 && p2);
-	praat_new (Eigens_to_Procrustes (p1, p2, from, to), Thing_getName (p1), L"_", Thing_getName (p2));
+	praat_new (Eigens_to_Procrustes (p1, p2, from, to), Thing_getName (p1), U"_", Thing_getName (p2));
 END
 
 
@@ -4568,58 +4715,58 @@ DIRECT (PCAs_getAngleBetweenPc1Pc2Plane_degrees)
 		(p1 ? p2 : p1) = me;
 	}
 	Melder_assert (p1 && p2);
-	Melder_information (Melder_double (Eigens_getAngleBetweenEigenplanes_degrees (p1, p2)),
-		L" degrees (=angle of intersection between the two pc1-pc2 eigenplanes)");
+	Melder_information (Eigens_getAngleBetweenEigenplanes_degrees (p1, p2),
+		U" degrees (=angle of intersection between the two pc1-pc2 eigenplanes)");
 END
 
 /******************* Permutation **************************************/
 
 DIRECT (Permutation_help)
-	Melder_help (L"Permutation");
+	Melder_help (U"Permutation");
 END
 
-FORM (Permutation_create, L"Create Permutation", L"Create Permutation...")
-	WORD (L"Name", L"p")
-	NATURAL (L"Number of elements", L"10")
-	BOOLEAN (L"Identity Permutation", 1)
+FORM (Permutation_create, U"Create Permutation", U"Create Permutation...")
+	WORD (U"Name", U"p")
+	NATURAL (U"Number of elements", U"10")
+	BOOLEAN (U"Identity Permutation", 1)
 	OK
 DO
-	Permutation p = Permutation_create (GET_INTEGER (L"Number of elements"));
-	int identity = GET_INTEGER (L"Identity Permutation");
+	Permutation p = Permutation_create (GET_INTEGER (U"Number of elements"));
+	int identity = GET_INTEGER (U"Identity Permutation");
 	if (! identity) {
 		Permutation_permuteRandomly_inline (p, 0, 0);
 	}
-	praat_new (p, GET_STRING (L"Name"));
+	praat_new (p, GET_STRING (U"Name"));
 END
 
 DIRECT (Permutation_getNumberOfElements)
 	LOOP {
 		iam (Permutation);
-		Melder_information (Melder_integer (my numberOfElements));
+		Melder_information (my numberOfElements);
 	}
 END
 
-FORM (Permutation_getValueAtIndex, L"Permutation: Get value", L"Permutation: Get value...")
-	NATURAL (L"Index", L"1")
+FORM (Permutation_getValueAtIndex, U"Permutation: Get value", U"Permutation: Get value...")
+	NATURAL (U"Index", U"1")
 	OK
 DO
-	long index = GET_INTEGER (L"Index");
+	long index = GET_INTEGER (U"Index");
 	LOOP {
 		iam (Permutation);
-		Melder_information (Melder_integer (Permutation_getValueAtIndex (me, index)), L" (value, at index = ",
-			Melder_integer (index), L")");
+		Melder_information (Permutation_getValueAtIndex (me, index), U" (value, at index = ",
+			index, U")");
 	}
 END
 
-FORM (Permutation_getIndexAtValue, L"Permutation: Get index", L"Permutation: Get index...")
-	NATURAL (L"Value", L"1")
+FORM (Permutation_getIndexAtValue, U"Permutation: Get index", U"Permutation: Get index...")
+	NATURAL (U"Value", U"1")
 	OK
 DO
-	long value = GET_INTEGER (L"Value");
+	long value = GET_INTEGER (U"Value");
 	LOOP {
 		iam (Permutation);
-		Melder_information (Melder_integer (Permutation_getIndexAtValue (me, value)), L" (index, at value = ",
-			Melder_integer (value), L")");
+		Melder_information (Permutation_getIndexAtValue (me, value), U" (index, at value = ",
+			value, U")");
 	}
 END
 
@@ -4631,138 +4778,138 @@ DIRECT (Permutation_sort)
 	}
 END
 
-FORM (Permutation_swapBlocks, L"Permutation: Swap blocks", L"Permutation: Swap blocks...")
-	NATURAL (L"From index", L"1")
-	NATURAL (L"To index", L"2")
-	NATURAL (L"Block size", L"1")
+FORM (Permutation_swapBlocks, U"Permutation: Swap blocks", U"Permutation: Swap blocks...")
+	NATURAL (U"From index", U"1")
+	NATURAL (U"To index", U"2")
+	NATURAL (U"Block size", U"1")
 	OK
 DO
 	LOOP {
 		iam (Permutation);
-		Permutation_swapBlocks (me, GET_INTEGER (L"From index"), GET_INTEGER (L"To index"), GET_INTEGER (L"Block size"));
+		Permutation_swapBlocks (me, GET_INTEGER (U"From index"), GET_INTEGER (U"To index"), GET_INTEGER (U"Block size"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Permutation_swapPositions, L"Permutation: Swap positions", L"Permutation: Swap positions...")
-	NATURAL (L"First index", L"1")
-	NATURAL (L"Second index", L"2")
+FORM (Permutation_swapPositions, U"Permutation: Swap positions", U"Permutation: Swap positions...")
+	NATURAL (U"First index", U"1")
+	NATURAL (U"Second index", U"2")
 	OK
 DO
 	LOOP {
 		iam (Permutation);
-		Permutation_swapPositions (me, GET_INTEGER (L"First index"), GET_INTEGER (L"Second index"));
+		Permutation_swapPositions (me, GET_INTEGER (U"First index"), GET_INTEGER (U"Second index"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Permutation_swapNumbers, L"Permutation: Swap numbers", L"Permutation: Swap numbers...")
-	NATURAL (L"First number", L"1")
-	NATURAL (L"Second number", L"2")
+FORM (Permutation_swapNumbers, U"Permutation: Swap numbers", U"Permutation: Swap numbers...")
+	NATURAL (U"First number", U"1")
+	NATURAL (U"Second number", U"2")
 	OK
 DO
 	LOOP {
 		iam (Permutation);
-		Permutation_swapNumbers (me, GET_INTEGER (L"First number"), GET_INTEGER (L"Second number"));
+		Permutation_swapNumbers (me, GET_INTEGER (U"First number"), GET_INTEGER (U"Second number"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Permutation_swapOneFromRange, L"Permutation: Swap one from range", L"Permutation: Swap one from range...")
-	LABEL (L"", L"A randomly chosen element from ")
-	INTEGER (L"left Index range", L"0")
-	INTEGER (L"right Index range", L"0")
-	LABEL (L"", L"is swapped with the element at")
-	NATURAL (L"Index", L"1")
-	BOOLEAN (L"Forbid same", 1)
+FORM (Permutation_swapOneFromRange, U"Permutation: Swap one from range", U"Permutation: Swap one from range...")
+	LABEL (U"", U"A randomly chosen element from ")
+	INTEGER (U"left Index range", U"0")
+	INTEGER (U"right Index range", U"0")
+	LABEL (U"", U"is swapped with the element at")
+	NATURAL (U"Index", U"1")
+	BOOLEAN (U"Forbid same", 1)
 	OK
 DO
 	LOOP {
 		iam (Permutation);
-		Permutation_swapOneFromRange (me, GET_INTEGER (L"left Index range"), GET_INTEGER (L"right Index range"),
-			GET_INTEGER (L"Index"), GET_INTEGER (L"Forbid same"));
+		Permutation_swapOneFromRange (me, GET_INTEGER (U"left Index range"), GET_INTEGER (U"right Index range"),
+			GET_INTEGER (U"Index"), GET_INTEGER (U"Forbid same"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Permutation_permuteRandomly, L"Permutation: Permute randomly", L"Permutation: Permute randomly...")
-	INTEGER (L"left Index range", L"0")
-	INTEGER (L"right Index range", L"0")
+FORM (Permutation_permuteRandomly, U"Permutation: Permute randomly", U"Permutation: Permute randomly...")
+	INTEGER (U"left Index range", U"0")
+	INTEGER (U"right Index range", U"0")
 	OK
 DO
 	LOOP {
 		iam (Permutation);
-		praat_new (Permutation_permuteRandomly (me, GET_INTEGER (L"left Index range"),
-		GET_INTEGER (L"right Index range")), Thing_getName (me), L"_rdm");
+		praat_new (Permutation_permuteRandomly (me, GET_INTEGER (U"left Index range"),
+		GET_INTEGER (U"right Index range")), Thing_getName (me), U"_rdm");
 	}
 END
 
-FORM (Permutation_rotate, L"Permutation: Rotate", L"Permutation: Rotate...")
-	INTEGER (L"left Index range", L"0")
-	INTEGER (L"right Index range", L"0")
-	INTEGER (L"Step size", L"1")
+FORM (Permutation_rotate, U"Permutation: Rotate", U"Permutation: Rotate...")
+	INTEGER (U"left Index range", U"0")
+	INTEGER (U"right Index range", U"0")
+	INTEGER (U"Step size", U"1")
 	OK
 DO
-	long step = GET_INTEGER (L"Step size");
+	long step = GET_INTEGER (U"Step size");
 	LOOP {
 		iam (Permutation);
-		praat_new (Permutation_rotate (me, GET_INTEGER (L"left Index range"), GET_INTEGER (L"right Index range"), step),
-			Thing_getName (me), L"_rot", Melder_integer (step));
+		praat_new (Permutation_rotate (me, GET_INTEGER (U"left Index range"), GET_INTEGER (U"right Index range"), step),
+			Thing_getName (me), U"_rot", step);
 	}
 END
 
-FORM (Permutation_reverse, L"Permutation: Reverse", L"Permutation: Reverse...")
-	INTEGER (L"left Index range", L"0")
-	INTEGER (L"right Index range", L"0")
+FORM (Permutation_reverse, U"Permutation: Reverse", U"Permutation: Reverse...")
+	INTEGER (U"left Index range", U"0")
+	INTEGER (U"right Index range", U"0")
 	OK
 DO
 	LOOP {
 		iam (Permutation);
-		praat_new (Permutation_reverse (me, GET_INTEGER (L"left Index range"), GET_INTEGER (L"right Index range")),
-			Thing_getName (me), L"_rev");
+		praat_new (Permutation_reverse (me, GET_INTEGER (U"left Index range"), GET_INTEGER (U"right Index range")),
+			Thing_getName (me), U"_rev");
 	}
 END
 
-FORM (Permutation_permuteBlocksRandomly, L"Permutation: Permute blocks randomly", L"Permutation: Permute randomly (blocks)...")
-	INTEGER (L"left Index range", L"0")
-	INTEGER (L"right Index range", L"0")
-	NATURAL (L"Block size", L"12")
-	BOOLEAN (L"Permute within blocks", 1)
-	BOOLEAN (L"No doublets", 0)
+FORM (Permutation_permuteBlocksRandomly, U"Permutation: Permute blocks randomly", U"Permutation: Permute randomly (blocks)...")
+	INTEGER (U"left Index range", U"0")
+	INTEGER (U"right Index range", U"0")
+	NATURAL (U"Block size", U"12")
+	BOOLEAN (U"Permute within blocks", 1)
+	BOOLEAN (U"No doublets", 0)
 	OK
 DO
-	long blocksize = GET_INTEGER (L"Block size");
+	long blocksize = GET_INTEGER (U"Block size");
 	LOOP {
 		iam (Permutation);
-		praat_new (Permutation_permuteBlocksRandomly (me, GET_INTEGER (L"left Index range"),
-			GET_INTEGER (L"right Index range"), blocksize, GET_INTEGER (L"Permute within blocks"),
-			GET_INTEGER (L"No doublets")), Thing_getName (me), L"_pbr", Melder_integer (blocksize));
+		praat_new (Permutation_permuteBlocksRandomly (me, GET_INTEGER (U"left Index range"),
+			GET_INTEGER (U"right Index range"), blocksize, GET_INTEGER (U"Permute within blocks"),
+			GET_INTEGER (U"No doublets")), Thing_getName (me), U"_pbr", blocksize);
 	}
 END
 
-FORM (Permutation_interleave, L"Permutation: Interleave", L"Permutation: Interleave...")
-	INTEGER (L"left Index range", L"0")
-	INTEGER (L"right Index range", L"0")
-	NATURAL (L"Block size", L"12")
-	INTEGER (L"Offset", L"0")
+FORM (Permutation_interleave, U"Permutation: Interleave", U"Permutation: Interleave...")
+	INTEGER (U"left Index range", U"0")
+	INTEGER (U"right Index range", U"0")
+	NATURAL (U"Block size", U"12")
+	INTEGER (U"Offset", U"0")
 	OK
 DO
 	LOOP {
 		iam (Permutation);
-		praat_new (Permutation_interleave (me, GET_INTEGER (L"left Index range"), GET_INTEGER (L"right Index range"),
-			GET_INTEGER (L"Block size"), GET_INTEGER (L"Offset")), Thing_getName (me), L"_itl");
+		praat_new (Permutation_interleave (me, GET_INTEGER (U"left Index range"), GET_INTEGER (U"right Index range"),
+			GET_INTEGER (U"Block size"), GET_INTEGER (U"Offset")), Thing_getName (me), U"_itl");
 	}
 END
 
 DIRECT (Permutation_invert)
 	LOOP {
 		iam (Permutation);
-		praat_new (Permutation_invert (me), Thing_getName (me), L"_inv");
+		praat_new (Permutation_invert (me), Thing_getName (me), U"_inv");
 	}
 END
 DIRECT (Permutations_multiply)
 	autoCollection set = praat_getSelectedObjects ();
-	praat_new (Permutations_multiply (set.peek()), L"mul_", Melder_integer (set -> size));
+	praat_new (Permutations_multiply (set.peek()), U"mul_", set -> size);
 END
 
 DIRECT (Permutations_next)
@@ -4781,9 +4928,9 @@ DIRECT (Permutations_previous)
 	}
 END
 
-FORM (Pitches_to_DTW, L"Pitches: To DTW", L"Pitches: To DTW...")
-	REAL (L"Voiced-unvoiced costs", L"24.0")
-	REAL (L"Time costs weight", L"10.0")
+FORM (Pitches_to_DTW, U"Pitches: To DTW", U"Pitches: To DTW...")
+	REAL (U"Voiced-unvoiced costs", U"24.0")
+	REAL (U"Time costs weight", U"10.0")
 	DTW_constraints_addCommonFields (dia);
 	OK
 DO
@@ -4795,167 +4942,182 @@ DO
 		(p1 ? p2 : p1) = me;
 	}
 	Melder_assert (p1 && p2);
-	praat_new (Pitches_to_DTW (p1, p2, GET_REAL (L"Voiced-unvoiced costs"), GET_REAL (L"Time costs weight"), begin, end, slope), L"dtw_", Thing_getName (p1), L"_", Thing_getName (p2));
+	autoDTW thee = Pitches_to_DTW (p1, p2, GET_REAL (U"Voiced-unvoiced costs"), GET_REAL (U"Time costs weight"), begin, end, slope);
+	praat_new (thee.transfer(), U"dtw_", Thing_getName (p1), U"_", Thing_getName (p2));
 END
 
-FORM (PitchTier_to_Pitch, L"PitchTier: To Pitch", L"PitchTier: To Pitch...")
-	POSITIVE (L"Step size", L"0.02")
-	POSITIVE (L"Pitch floor", L"60.0")
-	POSITIVE (L"Pitch ceiling", L"400.0")
+FORM (PitchTier_to_Pitch, U"PitchTier: To Pitch", U"PitchTier: To Pitch...")
+	POSITIVE (U"Step size", U"0.02")
+	POSITIVE (U"Pitch floor", U"60.0")
+	POSITIVE (U"Pitch ceiling", U"400.0")
 	OK
 DO
 	LOOP {
 		iam (PitchTier);
-		praat_new (PitchTier_to_Pitch (me, GET_REAL (L"Step size"),
-		GET_REAL (L"Pitch floor"), GET_REAL (L"Pitch ceiling")), my name);
+		praat_new (PitchTier_to_Pitch (me, GET_REAL (U"Step size"),
+		GET_REAL (U"Pitch floor"), GET_REAL (U"Pitch ceiling")), my name);
 	}
 END
 
 /******************* Polygon & Categories *************************************/
 
-FORM (Polygon_createSimple, L"Create simple Polygon", L"Create simple Polygon...")
-	WORD (L"Name", L"p")
-	SENTENCE (L"Vertices as X-Y pairs", L"0.0 0.0  0.0 1.0  1.0 0.0")
+FORM (Polygon_createSimple, U"Create simple Polygon", U"Create simple Polygon...")
+	WORD (U"Name", U"p")
+	SENTENCE (U"Vertices as X-Y pairs", U"0.0 0.0  0.0 1.0  1.0 0.0")
 	OK
 DO
-	praat_new (Polygon_createSimple (GET_STRING (L"Vertices as X-Y pairs")), GET_STRING (L"Name"));
+	praat_new (Polygon_createSimple (GET_STRING (U"Vertices as X-Y pairs")), GET_STRING (U"Name"));
 END
 
-FORM (Polygon_createFromRandomVertices, L"", 0)
-	WORD (L"Name", L"p")
-	NATURAL (L"Number of vertices", L"10")
-	REAL (L"left X range", L"0.0")
-	REAL (L"right X range", L"1.0")
-	REAL (L"left Y range", L"0.0")
-	REAL (L"right Y range", L"1.0")
+FORM (Polygon_createFromRandomVertices, U"", 0)
+	WORD (U"Name", U"p")
+	NATURAL (U"Number of vertices", U"10")
+	REAL (U"left X range", U"0.0")
+	REAL (U"right X range", U"1.0")
+	REAL (U"left Y range", U"0.0")
+	REAL (U"right Y range", U"1.0")
 	OK
 DO
-	praat_new (Polygon_createFromRandomVertices (GET_INTEGER (L"Number of vertices"),
-		GET_REAL (L"left X range"), GET_REAL (L"right X range"),
-		GET_REAL (L"left Y range"), GET_REAL (L"right Y range")), GET_STRING (L"Name"));
+	praat_new (Polygon_createFromRandomVertices (GET_INTEGER (U"Number of vertices"),
+		GET_REAL (U"left X range"), GET_REAL (U"right X range"),
+		GET_REAL (U"left Y range"), GET_REAL (U"right Y range")), GET_STRING (U"Name"));
 END
 
 DIRECT (Polygon_getNumberOfPoints)
 	LOOP {
 		iam (Polygon);
-		Melder_information (Melder_integer (my numberOfPoints));
+		Melder_information (my numberOfPoints);
 	}
 END
 
-FORM (Polygon_getPointX, L"Polygon: Get point (x)", 0)
-	NATURAL (L"Point number", L"1")
+FORM (Polygon_getPointX, U"Polygon: Get point (x)", 0)
+	NATURAL (U"Point number", U"1")
 	OK
 DO
-	long point = GET_INTEGER (L"Point number");
+	long point = GET_INTEGER (U"Point number");
 	LOOP {
 		iam (Polygon);
 		if (point > my numberOfPoints) {
-			Melder_throw ("Point cannot be larger than ", my numberOfPoints, ".");
+			Melder_throw (U"Point cannot be larger than ", my numberOfPoints, U".");
 		}
-		Melder_information (Melder_double (my x[point]));
+		Melder_information (my x[point]);
 	}
 END
 
-FORM (Polygon_getPointY, L"Polygon: Get point (y)", 0)
-	NATURAL (L"Point number", L"1")
+FORM (Polygon_getPointY, U"Polygon: Get point (y)", 0)
+	NATURAL (U"Point number", U"1")
 	OK
 DO
-	long point = GET_INTEGER (L"Point number");
+	long point = GET_INTEGER (U"Point number");
 	LOOP {
 		iam (Polygon);
 		if (point > my numberOfPoints) {
-			Melder_throw ("Vertex cannot be larger than ", my numberOfPoints, ".");
+			Melder_throw (U"Vertex cannot be larger than ", my numberOfPoints, U".");
 		}
-		Melder_information (Melder_double (my y[point]));
+		Melder_information (my y[point]);
 	}
 END
 
-FORM (Polygon_getLocationOfPoint, L"Get location of point", L"Polygon: Get location of point...")
-	LABEL (L"", L"Point is (I)n, (O)ut, (E)dge or (V)ertex?")
-	REAL (L"X", L"0.0")
-	REAL (L"Y", L"0.0")
-	REAL (L"Precision", L"1.64e-15")
+FORM (Polygon_getLocationOfPoint, U"Get location of point", U"Polygon: Get location of point...")
+	LABEL (U"", U"Point is (I)n, (O)ut, (E)dge or (V)ertex?")
+	REAL (U"X", U"0.0")
+	REAL (U"Y", U"0.0")
+	REAL (U"Precision", U"1.64e-15")
 	OK
 DO
-	double eps = GET_REAL (L"Precision");
-	REQUIRE (eps >= 0, L"The precision cannot be negative.")
+	double eps = GET_REAL (U"Precision");
+	REQUIRE (eps >= 0, U"The precision cannot be negative.")
+	LOOP {
+		iam (Polygon);
+		int loc = Polygon_getLocationOfPoint (me, GET_REAL (U"X"), GET_REAL (U"Y"), eps);
+		Melder_information (loc == Polygon_INSIDE ? U"I" : loc == Polygon_OUTSIDE ? U"O" :
+		loc == Polygon_EDGE ? U"E" : U"V");
+	}
+END
+
+DIRECT (Polygon_getAreaOfConvexHull)
 	LOOP {
 		iam (Polygon);
-		int loc = Polygon_getLocationOfPoint (me, GET_REAL (L"X"), GET_REAL (L"Y"), eps);
-		Melder_information (loc == Polygon_INSIDE ? L"I" : loc == Polygon_OUTSIDE ? L"O" :
-		loc == Polygon_EDGE ? L"E" : L"V");
+		Melder_informationReal (Polygon_getAreaOfConvexHull (me), nullptr);
 	}
 END
 
-FORM (Polygon_circularPermutation, L"Polygon: Circular permutation", 0)
-	INTEGER (L"Shift", L"1")
+FORM (Polygon_circularPermutation, U"Polygon: Circular permutation", 0)
+	INTEGER (U"Shift", U"1")
 	OK
 DO
-	long shift = GET_INTEGER (L"Shift");
+	long shift = GET_INTEGER (U"Shift");
 	LOOP {
 		iam (Polygon);
-		praat_new (Polygon_circularPermutation (me, shift), my name, L"_", Melder_integer (shift));
+		praat_new (Polygon_circularPermutation (me, shift), my name, U"_", shift);
 	}
 END
 
 DIRECT (Polygon_simplify)
 	LOOP {
 		iam (Polygon);
-		praat_new (Polygon_simplify (me), my name, L"_s");
+		praat_new (Polygon_simplify (me), my name, U"_s");
 	}
 END
 
-FORM (Polygon_translate, L"Polygon: Translate", L"Polygon: Translate...")
-	REAL (L"X", L"0.0")
-	REAL (L"Y", L"0.0")
+DIRECT (Polygon_convexHull)
+	LOOP {
+		iam (Polygon);
+		praat_new (Polygon_convexHull (me), my name, U"_hull");
+	}
+END
+
+FORM (Polygon_translate, U"Polygon: Translate", U"Polygon: Translate...")
+	REAL (U"X", U"0.0")
+	REAL (U"Y", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (Polygon);
-		Polygon_translate (me, GET_REAL (L"X"), GET_REAL (L"Y"));
+		Polygon_translate (me, GET_REAL (U"X"), GET_REAL (U"Y"));
 	}
 END
 
-FORM (Polygon_rotate, L"Polygon: Rotate", L"Polygon: Rotate...")
-	LABEL (L"", L"Rotate counterclockwise over the")
-	REAL (L"Angle (degrees)", L"0.0")
-	LABEL (L"", L"With respect to the point")
-	REAL (L"X", L"0.0")
-	REAL (L"Y", L"0.0")
+FORM (Polygon_rotate, U"Polygon: Rotate", U"Polygon: Rotate...")
+	LABEL (U"", U"Rotate counterclockwise over the")
+	REAL (U"Angle (degrees)", U"0.0")
+	LABEL (U"", U"With respect to the point")
+	REAL (U"X", U"0.0")
+	REAL (U"Y", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (Polygon);
-		Polygon_rotate (me, GET_REAL (L"Angle"), GET_REAL (L"X"), GET_REAL (L"Y"));
+		Polygon_rotate (me, GET_REAL (U"Angle"), GET_REAL (U"X"), GET_REAL (U"Y"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Polygon_scale, L"Polygon: Scale polygon", 0)
-	REAL (L"X", L"0.0")
-	REAL (L"Y", L"0.0")
+FORM (Polygon_scale, U"Polygon: Scale polygon", 0)
+	REAL (U"X", U"0.0")
+	REAL (U"Y", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (Polygon);
-		Polygon_scale (me, GET_REAL (L"X"), GET_REAL (L"Y"));
+		Polygon_scale (me, GET_REAL (U"X"), GET_REAL (U"Y"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Polygon_Categories_draw, L"Polygon & Categories: Draw", 0)
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (Polygon_Categories_draw, U"Polygon & Categories: Draw", 0)
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	Polygon me = FIRST (Polygon);
 	Categories cat = FIRST (Categories);
-	Polygon_Categories_draw (me, cat, GRAPHICS, GET_REAL (L"left Horizontal range"),
-		GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Garnish"));
+	Polygon_Categories_draw (me, cat, GRAPHICS, GET_REAL (U"left Horizontal range"),
+		GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Garnish"));
 END
 
 DIRECT (Polygon_reverseX)
@@ -4976,64 +5138,64 @@ END
 
 /***************** Polynomial *******************/
 
-DIRECT (Polynomial_help) Melder_help (L"Polynomial"); END
+DIRECT (Polynomial_help) Melder_help (U"Polynomial"); END
 
-FORM (Polynomial_create, L"Create Polynomial", L"Create Polynomial...")
-	WORD (L"Name", L"p")
-	LABEL (L"", L"Domain of polynomial")
-	REAL (L"Xmin", L"-3")
-	REAL (L"Xmax", L"4")
-	LABEL (L"", L"p(x) = c[1] + c[2] x + ... c[n+1] x^n")
-	SENTENCE (L"Coefficients", L"2.0 -1.0 -2.0 1.0")
+FORM (Polynomial_create, U"Create Polynomial", U"Create Polynomial...")
+	WORD (U"Name", U"p")
+	LABEL (U"", U"Domain of polynomial")
+	REAL (U"Xmin", U"-3")
+	REAL (U"Xmax", U"4")
+	LABEL (U"", U"p(x) = c[1] + c[2] x + ... c[n+1] x^n")
+	SENTENCE (U"Coefficients", U"2.0 -1.0 -2.0 1.0")
 	OK
 DO
-	double xmin = GET_REAL (L"Xmin"), xmax = GET_REAL (L"Xmax");
+	double xmin = GET_REAL (U"Xmin"), xmax = GET_REAL (U"Xmax");
 	if (xmin >= xmax) {
-		Melder_throw ("Xmin must be smaller than Xmax.");
+		Melder_throw (U"Xmin must be smaller than Xmax.");
 	}
-	praat_new (Polynomial_createFromString (xmin, xmax, GET_STRING (L"Coefficients")), GET_STRING (L"Name"));
+	praat_new (Polynomial_createFromString (xmin, xmax, GET_STRING (U"Coefficients")), GET_STRING (U"Name"));
 END
 
-FORM (Polynomial_getArea, L"Polynomial: Get area", L"Polynomial: Get area...")
-	LABEL (L"", L"Interval")
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
+FORM (Polynomial_getArea, U"Polynomial: Get area", U"Polynomial: Get area...")
+	LABEL (U"", U"Interval")
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
 	OK
 DO
 	LOOP {
 		iam (Polynomial);
-		double area = Polynomial_getArea (me, GET_REAL (L"Xmin"), GET_REAL (L"Xmax"));
-		Melder_information (Melder_double (area));
+		double area = Polynomial_getArea (me, GET_REAL (U"Xmin"), GET_REAL (U"Xmax"));
+		Melder_information (area);
 	}
 END
 
 DIRECT (Polynomial_getDerivative)
 	LOOP {
 		iam (Polynomial);
-		praat_new (Polynomial_getDerivative (me), my name, L"_derivative");
+		praat_new (Polynomial_getDerivative (me), my name, U"_derivative");
 	}
 END
 
 DIRECT (Polynomial_getPrimitive)
 	LOOP {
 		iam (Polynomial);
-		praat_new (Polynomial_getPrimitive (me), my name, L"_primitive");
+		praat_new (Polynomial_getPrimitive (me), my name, U"_primitive");
 	}
 END
 
-FORM (Polynomial_scaleX, L"Polynomial: Scale x", L"Polynomial: Scale x...")
-	LABEL (L"", L"New domain")
-	REAL (L"Xmin", L"-1.0")
-	REAL (L"Xmax", L"1.0")
+FORM (Polynomial_scaleX, U"Polynomial: Scale x", U"Polynomial: Scale x...")
+	LABEL (U"", U"New domain")
+	REAL (U"Xmin", U"-1.0")
+	REAL (U"Xmax", U"1.0")
 	OK
 DO
-	double xmin = GET_REAL (L"Xmin"), xmax = GET_REAL (L"Xmax");
+	double xmin = GET_REAL (U"Xmin"), xmax = GET_REAL (U"Xmax");
 	if (xmin >= xmax) {
-		Melder_throw ("Xmin must be smaller than Xmax.");
+		Melder_throw (U"Xmin must be smaller than Xmax.");
 	}
 	LOOP {
 		iam (Polynomial);
-		praat_new (Polynomial_scaleX (me, xmin, xmax), my name, L"_scaleX");
+		praat_new (Polynomial_scaleX (me, xmin, xmax), my name, U"_scaleX");
 	}
 END
 
@@ -5052,29 +5214,29 @@ DIRECT (Polynomial_to_Roots)
 	}
 END
 
-FORM (Polynomial_evaluate_z, L"Polynomial: Get value (complex)", L"Polynomial: Get value (complex)...")
-	REAL (L"Real part", L"0.0")
-	REAL (L"Imaginary part", L"0.0")
+FORM (Polynomial_evaluate_z, U"Polynomial: Get value (complex)", U"Polynomial: Get value (complex)...")
+	REAL (U"Real part", U"0.0")
+	REAL (U"Imaginary part", U"0.0")
 	OK
 DO
-	dcomplex p, z = dcomplex_create (GET_REAL (L"Real part"), GET_REAL (L"Imaginary part"));
+	dcomplex p, z = dcomplex_create (GET_REAL (U"Real part"), GET_REAL (U"Imaginary part"));
 	LOOP {
 		iam (Polynomial);
 		Polynomial_evaluate_z (me, &z, &p);
-		Melder_information (Melder_double (p.re), L" + ", Melder_double (p.im), L" i");
+		Melder_information (p.re, U" + ", p.im, U" i");
 	}
 END
 
 
-FORM (Polynomial_to_Spectrum, L"Polynomial: To Spectrum", L"Polynomial: To Spectrum...")
-	POSITIVE (L"Nyquist frequency (Hz)", L"5000.0")
-	NATURAL (L"Number of frequencies (>1)", L"1025")
+FORM (Polynomial_to_Spectrum, U"Polynomial: To Spectrum", U"Polynomial: To Spectrum...")
+	POSITIVE (U"Nyquist frequency (Hz)", U"5000.0")
+	NATURAL (U"Number of frequencies (>1)", U"1025")
 	OK
 DO
-	long n = GET_INTEGER (L"Number of frequencies");
+	long n = GET_INTEGER (U"Number of frequencies");
 	LOOP {
 		iam (Polynomial);
-		praat_new (Polynomial_to_Spectrum (me, GET_REAL (L"Nyquist frequency"), n, 1.0), my name);
+		praat_new (Polynomial_to_Spectrum (me, GET_REAL (U"Nyquist frequency"), n, 1.0), my name);
 	}
 END
 
@@ -5085,23 +5247,23 @@ DIRECT (Polynomials_multiply)
 		(p1 ? p2 : p1) = me;
 	}
 	Melder_assert (p1 && p2);
-	praat_new (Polynomials_multiply (p1, p2), Thing_getName (p1), L"_x_", Thing_getName (p2));
+	praat_new (Polynomials_multiply (p1, p2), Thing_getName (p1), U"_x_", Thing_getName (p2));
 END
 
-FORM (Polynomials_divide, L"Polynomials: Divide", L"Polynomials: Divide...")
-	BOOLEAN (L"Want quotient", 1)
-	BOOLEAN (L"Want remainder", 1)
+FORM (Polynomials_divide, U"Polynomials: Divide", U"Polynomials: Divide...")
+	BOOLEAN (U"Want quotient", 1)
+	BOOLEAN (U"Want remainder", 1)
 	OK
 DO
 /* With gcc (GCC) 3.2.2 20030217 (Red Hat Linux 8.0 3.2.2-2)
-	The following line initiates pq = NULL and I don't know why
-Polynomial p1 = NULL, p2 = NULL, pq, pr;
+	The following line initiates pq = nullptr and I don't know why
+Polynomial p1 = nullptr, p2 = nullptr, pq, pr;
 */
 
-	bool wantq = GET_INTEGER (L"Want quotient");
-	bool wantr = GET_INTEGER (L"Want remainder");
+	bool wantq = GET_INTEGER (U"Want quotient");
+	bool wantr = GET_INTEGER (U"Want remainder");
 	if (! wantq && ! wantr) {
-		Melder_throw ("Either \'Want quotient\' or \'Want remainder\' must be chosen");
+		Melder_throw (U"Either \'Want quotient\' or \'Want remainder\' should be chosen");
 	}
 	Polynomial p1 = 0, p2 = 0;
 	LOOP {
@@ -5119,98 +5281,98 @@ Polynomial p1 = NULL, p2 = NULL, pq, pr;
 	Polynomials_divide (p1, p2, &q, &r);
 	autoPolynomial aq = q, ar = r;
 	if (wantq) {
-		praat_new (aq.transfer(), Thing_getName (p1), L"_q");
+		praat_new (aq.transfer(), Thing_getName (p1), U"_q");
 	}
 	if (wantr) {
-		praat_new (ar.transfer(), Thing_getName (p1), L"_r");
+		praat_new (ar.transfer(), Thing_getName (p1), U"_r");
 	}
 END
 
 /********************* Roots ******************************/
 
-DIRECT (Roots_help) Melder_help (L"Roots"); END
+DIRECT (Roots_help) Melder_help (U"Roots"); END
 
-FORM (Roots_draw, L"Roots: Draw", 0)
-	REAL (L"Minimum of real axis", L"0.0")
-	REAL (L"Maximum of real axis", L"0.0")
-	REAL (L"Minimum of imaginary axis", L"0.0")
-	REAL (L"Maximum of imaginary axis", L"0.0")
-	SENTENCE (L"Mark string (+x0...)", L"o")
-	NATURAL (L"Mark size", L"12")
-	BOOLEAN (L"Garnish", 0)
+FORM (Roots_draw, U"Roots: Draw", 0)
+	REAL (U"Minimum of real axis", U"0.0")
+	REAL (U"Maximum of real axis", U"0.0")
+	REAL (U"Minimum of imaginary axis", U"0.0")
+	REAL (U"Maximum of imaginary axis", U"0.0")
+	SENTENCE (U"Mark string (+x0...)", U"o")
+	NATURAL (U"Mark size", U"12")
+	BOOLEAN (U"Garnish", 0)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Roots);
-		Roots_draw (me, GRAPHICS, GET_REAL (L"Minimum of real axis"), GET_REAL (L"Maximum of real axis"),
-		GET_REAL (L"Minimum of imaginary axis"), GET_REAL (L"Maximum of imaginary axis"),
-		GET_STRING (L"Mark string"), GET_INTEGER (L"Mark size"), GET_INTEGER (L"Garnish"));
+		Roots_draw (me, GRAPHICS, GET_REAL (U"Minimum of real axis"), GET_REAL (U"Maximum of real axis"),
+		GET_REAL (U"Minimum of imaginary axis"), GET_REAL (U"Maximum of imaginary axis"),
+		GET_STRING (U"Mark string"), GET_INTEGER (U"Mark size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (Roots_getNumberOfRoots)
 	LOOP {
 		iam (Roots);
-		Melder_information (Melder_integer (Roots_getNumberOfRoots (me)));
+		Melder_information (Roots_getNumberOfRoots (me));
 	}
 END
 
-FORM (Roots_getRoot, L"Roots: Get root", 0)
-	NATURAL (L"Root number", L"1")
+FORM (Roots_getRoot, U"Roots: Get root", 0)
+	NATURAL (U"Root number", U"1")
 	OK
 DO
 	LOOP {
 		iam (Roots);
-		dcomplex z = Roots_getRoot (me, GET_INTEGER (L"Root number"));
-		Melder_information (Melder_double (z.re), (z.im < 0 ? L" - " : L" + "), Melder_double (fabs (z.im)), L" i");
+		dcomplex z = Roots_getRoot (me, GET_INTEGER (U"Root number"));
+		Melder_information (z.re, (z.im < 0 ? U" - " : U" + "), fabs (z.im), U" i");   // ppgb: waarom hier de absolute waarde maar beneden niet?
 	}
 END
 
-FORM (Roots_getRealPartOfRoot, L"Roots: Get real part", 0)
-	NATURAL (L"Root number", L"1")
+FORM (Roots_getRealPartOfRoot, U"Roots: Get real part", 0)
+	NATURAL (U"Root number", U"1")
 	OK
 DO
 	LOOP {
 		iam (Roots);
-		dcomplex z = Roots_getRoot (me, GET_INTEGER (L"Root number"));
-		Melder_information (Melder_double (z.re));
+		dcomplex z = Roots_getRoot (me, GET_INTEGER (U"Root number"));
+		Melder_information (z.re);
 	}
 END
 
-FORM (Roots_getImaginaryPartOfRoot, L"Roots: Get imaginary part", 0)
-	NATURAL (L"Root number", L"1")
+FORM (Roots_getImaginaryPartOfRoot, U"Roots: Get imaginary part", 0)
+	NATURAL (U"Root number", U"1")
 	OK
 DO
 	LOOP {
 		iam (Roots);
-		dcomplex z = Roots_getRoot (me, GET_INTEGER (L"Root number"));
-		Melder_information (Melder_double (z.im));
+		dcomplex z = Roots_getRoot (me, GET_INTEGER (U"Root number"));
+		Melder_information (z.im);   // ppgb: waarom hier de imaginaire waarde zelf, maar boven de absolute waarde daarvan?
 	}
 END
 
-FORM (Roots_setRoot, L"Roots: Set root", 0)
-	NATURAL (L"Root number", L"1")
-	REAL (L"Real part", L"1.0/sqrt(2)")
-	REAL (L"Imaginary part", L"1.0/sqrt(2)")
+FORM (Roots_setRoot, U"Roots: Set root", 0)
+	NATURAL (U"Root number", U"1")
+	REAL (U"Real part", U"1.0/sqrt(2)")
+	REAL (U"Imaginary part", U"1.0/sqrt(2)")
 	OK
 DO
 	LOOP {
 		iam (Roots);
-		Roots_setRoot (me, GET_INTEGER (L"Root number"), GET_REAL (L"Real part"), GET_REAL (L"Imaginary part"));
+		Roots_setRoot (me, GET_INTEGER (U"Root number"), GET_REAL (U"Real part"), GET_REAL (U"Imaginary part"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Roots_to_Spectrum, L"Roots: To Spectrum", L"Roots: To Spectrum...")
-	POSITIVE (L"Nyquist frequency (Hz)", L"5000.0")
-	NATURAL (L"Number of frequencies (>1)", L"1025")
+FORM (Roots_to_Spectrum, U"Roots: To Spectrum", U"Roots: To Spectrum...")
+	POSITIVE (U"Nyquist frequency (Hz)", U"5000.0")
+	NATURAL (U"Number of frequencies (>1)", U"1025")
 	OK
 DO
-	long n = GET_INTEGER (L"Number of frequencies");
+	long n = GET_INTEGER (U"Number of frequencies");
 	LOOP {
 		iam (Roots);
-		praat_new (Roots_to_Spectrum (me, GET_REAL (L"Nyquist frequency"), n, 1.0), my name);
+		praat_new (Roots_to_Spectrum (me, GET_REAL (U"Nyquist frequency"), n, 1.0), my name);
 	}
 END
 
@@ -5228,761 +5390,780 @@ DIRECT (Praat_ReportFloatingPointProperties)
 		NUMmachar ();
 	}
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Double precision floating point properties of this machine,");
-	MelderInfo_writeLine (L"as calculated by algorithms from the Binary Linear Algebra System (BLAS)");
-	MelderInfo_writeLine (L"Radix: ", Melder_double (NUMfpp -> base));
-	MelderInfo_writeLine (L"Number of digits in mantissa: ", Melder_double (NUMfpp -> t));
-	MelderInfo_writeLine (L"Smallest exponent before (gradual) underflow (expmin): ", Melder_integer (NUMfpp -> emin));
-	MelderInfo_writeLine (L"Largest exponent before overflow (expmax): ", Melder_integer (NUMfpp -> emax));
-	MelderInfo_writeLine (L"Does rounding occur in addition: ", (NUMfpp -> rnd == 1 ? L"yes" : L"no"));
-	MelderInfo_writeLine (L"Quantization step (d): ", Melder_double (NUMfpp -> prec));
-	MelderInfo_writeLine (L"Quantization error (eps = d/2): ", Melder_double (NUMfpp -> eps));
-	MelderInfo_writeLine (L"Underflow threshold (= radix ^ (expmin - 1)): ", Melder_double (NUMfpp -> rmin));
-	MelderInfo_writeLine (L"Safe minimum (such that its inverse does not overflow): ", Melder_double (NUMfpp -> sfmin));
-	MelderInfo_writeLine (L"Overflow threshold (= (1 - eps) * radix ^ expmax): ", Melder_double (NUMfpp -> rmax));
+	MelderInfo_writeLine (U"Double precision floating point properties of this machine,");
+	MelderInfo_writeLine (U"as calculated by algorithms from the Binary Linear Algebra System (BLAS)");
+	MelderInfo_writeLine (U"Radix: ", NUMfpp -> base);
+	MelderInfo_writeLine (U"Number of digits in mantissa: ", NUMfpp -> t);
+	MelderInfo_writeLine (U"Smallest exponent before (gradual) underflow (expmin): ", NUMfpp -> emin);
+	MelderInfo_writeLine (U"Largest exponent before overflow (expmax): ", NUMfpp -> emax);
+	MelderInfo_writeLine (U"Does rounding occur in addition: ", (NUMfpp -> rnd == 1 ? U"yes" : U"no"));
+	MelderInfo_writeLine (U"Quantization step (d): ", NUMfpp -> prec);
+	MelderInfo_writeLine (U"Quantization error (eps = d/2): ", NUMfpp -> eps);
+	MelderInfo_writeLine (U"Underflow threshold (= radix ^ (expmin - 1)): ", NUMfpp -> rmin);
+	MelderInfo_writeLine (U"Safe minimum (such that its inverse does not overflow): ", NUMfpp -> sfmin);
+	MelderInfo_writeLine (U"Overflow threshold (= (1 - eps) * radix ^ expmax): ", NUMfpp -> rmax);
 	MelderInfo_close ();
 END
-
-FORM (Praat_getTukeyQ, L"Get TukeyQ", 0)
-	REAL (L"Critical value", L"2.0")
-	NATURAL (L"Number of means", L"3")
-	POSITIVE (L"Degrees of freedom", L"10.0")
-	NATURAL (L"Number of rows", L"1")
+/*
+#ifdef HAVE_PULSEAUDIO
+void pulseAudioServer_report ();
+DIRECT (Praat_ReportSoundServerProperties)
+	pulseAudioServer_report ();
+END
+#endif
+*/
+FORM (Praat_getTukeyQ, U"Get TukeyQ", 0)
+	REAL (U"Critical value", U"2.0")
+	NATURAL (U"Number of means", U"3")
+	POSITIVE (U"Degrees of freedom", U"10.0")
+	NATURAL (U"Number of rows", U"1")
 	OK
 DO
-	double q = GET_REAL (L"Critical value");
-	REQUIRE (q > 0 , L"Critical value must be > 0.")
-	double val = NUMtukeyQ (q, GET_INTEGER (L"Number of means"), GET_REAL (L"Degrees of freedom"), GET_INTEGER (L"Number of rows") );
-	Melder_informationReal (val, NULL);
+	double q = GET_REAL (U"Critical value");
+	REQUIRE (q > 0 , U"Critical value must be > 0.")
+	double val = NUMtukeyQ (q, GET_INTEGER (U"Number of means"), GET_REAL (U"Degrees of freedom"), GET_INTEGER (U"Number of rows") );
+	Melder_informationReal (val, nullptr);
 END
 
-FORM (Praat_getInvTukeyQ, L"Get invTukeyQ", 0)
-	REAL (L"Probability", L"0.05")
-	NATURAL (L"Number of means", L"3")
-	POSITIVE (L"Degrees of freedom", L"10.0")
-	NATURAL (L"Number of rows", L"1")
+FORM (Praat_getInvTukeyQ, U"Get invTukeyQ", 0)
+	REAL (U"Probability", U"0.05")
+	NATURAL (U"Number of means", U"3")
+	POSITIVE (U"Degrees of freedom", U"10.0")
+	NATURAL (U"Number of rows", U"1")
 	OK
 DO
-	double p = GET_REAL (L"Probability");
-	REQUIRE (p >= 0 && p <= 1, L"Probability must be in (0,1).")
-	double val = NUMinvTukeyQ (p, GET_INTEGER (L"Number of means"), GET_REAL (L"Degrees of freedom"), GET_INTEGER (L"Number of rows"));
-	Melder_informationReal (val, NULL);
+	double p = GET_REAL (U"Probability");
+	REQUIRE (p >= 0 && p <= 1, U"Probability must be in (0,1).")
+	double val = NUMinvTukeyQ (p, GET_INTEGER (U"Number of means"), GET_REAL (U"Degrees of freedom"), GET_INTEGER (U"Number of rows"));
+	Melder_informationReal (val, nullptr);
 END
 
 /******************** Sound ****************************************/
 
-static void Sound_create_addCommonFields (void *dia, const wchar_t *endTime) {
-	REAL (L"Starting time (s)", L"0.0")
-	REAL (L"Finishing time (s)", endTime)
-	POSITIVE (L"Sampling frequency (Hz)", L"44100.0")
+static void Sound_create_addCommonFields (UiForm dia, const char32 *endTime) {
+	REAL (U"Starting time (s)", U"0.0")
+	REAL (U"Finishing time (s)", endTime)
+	POSITIVE (U"Sampling frequency (Hz)", U"44100.0")
 }
 
-static void Sound_create_checkCommonFields (void *dia, double *startingTime, double *finishingTime,
+static void Sound_create_checkCommonFields (UiForm dia, double *startingTime, double *finishingTime,
         double *samplingFrequency) {
 	double numberOfSamples_real;
-	*startingTime = GET_REAL (L"Starting time");
-	*finishingTime = GET_REAL (L"Finishing time");
-	*samplingFrequency = GET_REAL (L"Sampling frequency");
-	numberOfSamples_real = floor ( (*finishingTime - *startingTime) * *samplingFrequency + 0.5);
+	*startingTime = GET_REAL (U"Starting time");
+	*finishingTime = GET_REAL (U"Finishing time");
+	*samplingFrequency = GET_REAL (U"Sampling frequency");
+	numberOfSamples_real = round ( (*finishingTime - *startingTime) * *samplingFrequency);
 	if (*finishingTime <= *startingTime) {
 		if (*finishingTime == *startingTime) {
-			Melder_throw ("A Sound cannot have a duration of zero.");
+			Melder_throw (U"A Sound cannot have a duration of zero.");
 		} else {
-			Melder_throw ("A Sound cannot have a duration less than zero.");
+			Melder_throw (U"A Sound cannot have a duration less than zero.");
 		}
 		if (*startingTime == 0.0) {
-			Melder_throw ("Please set the finishing time to something greater than 0 seconds.");
+			Melder_throw (U"Please set the finishing time to something greater than 0 seconds.");
 		} else {
-			Melder_throw ("Please lower the starting time or raise the finishing time.");
+			Melder_throw (U"Please lower the starting time or raise the finishing time.");
 		}
 	}
 	if (*samplingFrequency <= 0.0)
-		Melder_throw ("A Sound cannot have a negative sampling frequency.\n"
-		              "Please set the sampling frequency to something greater than zero, e.g. 44100 Hz.");
+		Melder_throw (U"A Sound cannot have a negative sampling frequency.\n"
+		              U"Please set the sampling frequency to something greater than zero, e.g. 44100 Hz.");
 
 	if (numberOfSamples_real < 1.0) {
-		Melder_error_ ("A Sound cannot have zero samples.\n");
+		Melder_appendError (U"A Sound cannot have zero samples.\n");
 		if (*startingTime == 0.0) {
-			Melder_throw ("Please raise the finishing time.");
+			Melder_throw (U"Please raise the finishing time.");
 		} else {
-			Melder_throw ("Please lower the starting time or raise the finishing time.");
+			Melder_throw (U"Please lower the starting time or raise the finishing time.");
 		}
 	}
-	if (numberOfSamples_real > LONG_MAX) {
-		Melder_throw ("A Sound cannot have ", Melder_bigInteger (numberOfSamples_real), " samples; the maximum is ", Melder_bigInteger (LONG_MAX), " samples.\n");
+	if (numberOfSamples_real > LONG_MAX) {   // ppgb: kan niet in een 64-bit-omgeving
+		Melder_throw (U"A Sound cannot have ", Melder_bigInteger ((long) numberOfSamples_real), U" samples; the maximum is ", Melder_bigInteger (LONG_MAX), U" samples.\n");
 #if 0
 		if (*startingTime == 0.0) {
-			Melder_throw (L"Please lower the finishing time or the sampling frequency.");
+			Melder_throw (U"Please lower the finishing time or the sampling frequency.");
 		} else {
-			Melder_throw (L"Please raise the starting time, lower the finishing time, or lower the sampling frequency.");
+			Melder_throw (U"Please raise the starting time, lower the finishing time, or lower the sampling frequency.");
 		}
 #endif
 	}
 }
 
-FORM (Sound_and_Pitch_to_FormantFilter, L"Sound & Pitch: To FormantFilter", L"Sound & Pitch: To Spectrogram...")
-	POSITIVE (L"Analysis window duration (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.005")
-	LABEL (L"", L"Filter bank parameters")
-	POSITIVE (L"Position of first filter (Hz)", L"100.0")
-	POSITIVE (L"Distance between filters (Hz)", L"50.0")
-	REAL (L"Maximum frequency", L"0");
-	POSITIVE (L"Relative bandwidth", L"1.1")
+FORM (Sound_and_Pitch_to_FormantFilter, U"Sound & Pitch: To FormantFilter", U"Sound & Pitch: To Spectrogram...")
+	POSITIVE (U"Analysis window duration (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.005")
+	LABEL (U"", U"Filter bank parameters")
+	POSITIVE (U"Position of first filter (Hz)", U"100.0")
+	POSITIVE (U"Distance between filters (Hz)", U"50.0")
+	REAL (U"Maximum frequency", U"0");
+	POSITIVE (U"Relative bandwidth", U"1.1")
 	OK
 DO
 	Sound me = FIRST (Sound);
 	Pitch p = FIRST (Pitch);
-	praat_new (Sound_and_Pitch_to_FormantFilter (me, p, GET_REAL (L"Analysis window duration"),
-		GET_REAL (L"Time step"), GET_REAL (L"Position of first filter"),
-		GET_REAL (L"Maximum frequency"), GET_REAL (L"Distance between filters"),
-		GET_REAL (L"Relative bandwidth")), my name, L"_", p->name);
+	praat_new (Sound_and_Pitch_to_FormantFilter (me, p, GET_REAL (U"Analysis window duration"),
+		GET_REAL (U"Time step"), GET_REAL (U"Position of first filter"),
+		GET_REAL (U"Maximum frequency"), GET_REAL (U"Distance between filters"),
+		GET_REAL (U"Relative bandwidth")), my name, U"_", p->name);
 END
 
-FORM (Sound_and_Pitch_to_Spectrogram, L"Sound & Pitch: To Spectrogram", L"Sound & Pitch: To Spectrogram...")
-	POSITIVE (L"Analysis window duration (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.005")
-	LABEL (L"", L"Filter bank parameters")
-	POSITIVE (L"Position of first filter (Hz)", L"100.0")
-	POSITIVE (L"Distance between filters (Hz)", L"50.0")
-	REAL (L"Maximum frequency", L"0");
-	POSITIVE (L"Relative bandwidth", L"1.1")
+FORM (Sound_and_Pitch_to_Spectrogram, U"Sound & Pitch: To Spectrogram", U"Sound & Pitch: To Spectrogram...")
+	POSITIVE (U"Analysis window duration (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.005")
+	LABEL (U"", U"Filter bank parameters")
+	POSITIVE (U"Position of first filter (Hz)", U"100.0")
+	POSITIVE (U"Distance between filters (Hz)", U"50.0")
+	REAL (U"Maximum frequency", U"0");
+	POSITIVE (U"Relative bandwidth", U"1.1")
 	OK
 DO
 	Sound me = FIRST (Sound);
 	Pitch thee = FIRST (Pitch);
-	praat_new (Sound_and_Pitch_to_Spectrogram (me, thee, GET_REAL (L"Analysis window duration"),
-		GET_REAL (L"Time step"), GET_REAL (L"Position of first filter"),
-		GET_REAL (L"Maximum frequency"), GET_REAL (L"Distance between filters"),
-		GET_REAL (L"Relative bandwidth")), my name, L"_", thy name);
+	praat_new (Sound_and_Pitch_to_Spectrogram (me, thee, GET_REAL (U"Analysis window duration"),
+		GET_REAL (U"Time step"), GET_REAL (U"Position of first filter"),
+		GET_REAL (U"Maximum frequency"), GET_REAL (U"Distance between filters"),
+		GET_REAL (U"Relative bandwidth")), my name, U"_", thy name);
 END
 
-FORM (Sound_and_Pitch_changeGender, L"Sound & Pitch: Change gender", L"Sound & Pitch: Change gender...")
-	POSITIVE (L"Formant shift ratio", L"1.2")
-	REAL (L"New pitch median (Hz)", L"0.0 (=no change)")
-	POSITIVE (L"Pitch range factor", L"1.0 (=no change)")
-	POSITIVE (L"Duration factor", L"1.0")
+FORM (Sound_and_Pitch_changeGender, U"Sound & Pitch: Change gender", U"Sound & Pitch: Change gender...")
+	POSITIVE (U"Formant shift ratio", U"1.2")
+	REAL (U"New pitch median (Hz)", U"0.0 (=no change)")
+	POSITIVE (U"Pitch range factor", U"1.0 (=no change)")
+	POSITIVE (U"Duration factor", U"1.0")
 	OK
 DO
 	Sound me = FIRST (Sound);
 	Pitch p = FIRST (Pitch);
-	praat_new (Sound_and_Pitch_changeGender_old (me, p, GET_REAL (L"Formant shift ratio"),
-			GET_REAL (L"New pitch median"), GET_REAL (L"Pitch range factor"), GET_REAL (L"Duration factor")),
-			my name, L"_", p->name);
+	praat_new (Sound_and_Pitch_changeGender_old (me, p, GET_REAL (U"Formant shift ratio"),
+			GET_REAL (U"New pitch median"), GET_REAL (U"Pitch range factor"), GET_REAL (U"Duration factor")),
+			my name, U"_", p->name);
 END
 
-FORM (Sound_and_Pitch_changeSpeaker, L"Sound & Pitch: Change speaker", L"Sound & Pitch: Change speaker...")
-	POSITIVE (L"Multiply formants by", L"1.1 (male->female)")
-	POSITIVE (L"Multiply pitch by", L"1.8 (male->female")
-	REAL (L"Multiply pitch range by", L"1.0 (=no change)")
-	POSITIVE (L"Multiply duration", L"1.0")
+FORM (Sound_and_Pitch_changeSpeaker, U"Sound & Pitch: Change speaker", U"Sound & Pitch: Change speaker...")
+	POSITIVE (U"Multiply formants by", U"1.1 (male->female)")
+	POSITIVE (U"Multiply pitch by", U"1.8 (male->female")
+	REAL (U"Multiply pitch range by", U"1.0 (=no change)")
+	POSITIVE (U"Multiply duration", U"1.0")
 	OK
 DO
 	Sound me = FIRST (Sound);
 	Pitch p = FIRST (Pitch);
-	praat_new (Sound_and_Pitch_changeSpeaker (me, p, GET_REAL (L"Multiply formants by"),
-		GET_REAL (L"Multiply pitch by"), GET_REAL (L"Multiply pitch range by"), GET_REAL (L"Multiply duration")), my name, L"_", p->name);
+	praat_new (Sound_and_Pitch_changeSpeaker (me, p, GET_REAL (U"Multiply formants by"),
+		GET_REAL (U"Multiply pitch by"), GET_REAL (U"Multiply pitch range by"), GET_REAL (U"Multiply duration")), my name, U"_", p->name);
 END
 
-FORM (Sound_and_IntervalTier_cutPartsMatchingLabel, L"Sound & IntervalTier: Cut parts matching label", 0)
-	SENTENCE (L"Label", L"cut")
+FORM (Sound_and_IntervalTier_cutPartsMatchingLabel, U"Sound & IntervalTier: Cut parts matching label", 0)
+	SENTENCE (U"Label", U"cut")
 	OK
 DO
-	const wchar_t *label = GET_STRING (L"Label");
+	const char32 *label = GET_STRING (U"Label");
 	Sound me = FIRST (Sound);
 	IntervalTier thee = FIRST (IntervalTier);
-	praat_new (Sound_and_IntervalTier_cutPartsMatchingLabel (me, thee, label), my name, L"_cut");
+	praat_new (Sound_and_IntervalTier_cutPartsMatchingLabel (me, thee, label), my name, U"_cut");
 END
 
-FORM (Sound_createFromGammaTone, L"Create a gammatone", L"Create Sound from gammatone...")
-	WORD (L"Name", L"gammatone")
-	Sound_create_addCommonFields (dia, L"0.1");
-	INTEGER (L"Gamma", L"4")
-	POSITIVE (L"Frequency (Hz)", L"1000.0")
-	REAL (L"Bandwidth (Hz)", L"150.0")
-	REAL (L"Initial phase (radians)", L"0.0")
-	REAL (L"Addition factor", L"0.0")
-	BOOLEAN (L"Scale amplitudes", 1)
+FORM (Sound_createFromGammaTone, U"Create a gammatone", U"Create Sound from gammatone...")
+	WORD (U"Name", U"gammatone")
+	Sound_create_addCommonFields (dia, U"0.1");
+	INTEGER (U"Gamma", U"4")
+	POSITIVE (U"Frequency (Hz)", U"1000.0")
+	REAL (U"Bandwidth (Hz)", U"150.0")
+	REAL (U"Initial phase (radians)", U"0.0")
+	REAL (U"Addition factor", U"0.0")
+	BOOLEAN (U"Scale amplitudes", 1)
 	OK
 DO
 	double startingTime, finishingTime, samplingFrequency;
-	long gamma = GET_INTEGER (L"Gamma");
-	double bandwidth = GET_REAL (L"Bandwidth");
-	double f = GET_REAL (L"Frequency");
+	long gamma = GET_INTEGER (U"Gamma");
+	double bandwidth = GET_REAL (U"Bandwidth");
+	double f = GET_REAL (U"Frequency");
 
 	Sound_create_checkCommonFields (dia, &startingTime, &finishingTime, &samplingFrequency);
-	if (f >= samplingFrequency / 2) Melder_throw ("Frequency cannot be larger than half the sampling frequency.\n"
-				"Please use a frequency smaller than ", samplingFrequency / 2);
+	if (f >= samplingFrequency / 2) Melder_throw (U"Frequency cannot be larger than half the sampling frequency.\n"
+				U"Please use a frequency smaller than ", samplingFrequency / 2);
 	if (gamma < 0) {
-		Melder_throw ("Gamma cannot be negative.\nPlease use a positive or zero gamma.");
+		Melder_throw (U"Gamma cannot be negative.\nPlease use a positive or zero gamma.");
 	}
 	if (bandwidth < 0) {
-		Melder_throw ("Bandwidth cannot be negative.\nPlease use a positive or zero bandwidth.");
+		Melder_throw (U"Bandwidth cannot be negative.\nPlease use a positive or zero bandwidth.");
 	}
 	autoSound sound = Sound_createGammaTone (startingTime, finishingTime, samplingFrequency, gamma, f, bandwidth,
-					GET_REAL (L"Initial phase"), GET_REAL (L"Addition factor"), GET_INTEGER (L"Scale amplitudes"));
+					GET_REAL (U"Initial phase"), GET_REAL (U"Addition factor"), GET_INTEGER (U"Scale amplitudes"));
 	//Sound_create_check (sound.peek(), startingTime, finishingTime, samplingFrequency);//TODO
-	praat_new (sound.transfer(), GET_STRING (L"Name"));
+	praat_new (sound.transfer(), GET_STRING (U"Name"));
 END
 
-FORM (Sound_createFromShepardTone, L"Create a Shepard tone", L"Create Sound from Shepard tone...")
-	WORD (L"Name", L"shepardTone")
-	Sound_create_addCommonFields (dia, L"1.0");
-	POSITIVE (L"Lowest frequency (Hz)", L"4.863")
-	NATURAL (L"Number of components", L"10")
-	REAL (L"Frequency change (semitones/s)", L"4.0")
-	REAL (L"Amplitude range (dB)", L"30.0")
-	REAL (L"Octave shift fraction ([0,1))", L"0.0")
+FORM (Sound_createFromShepardTone, U"Create a Shepard tone", U"Create Sound from Shepard tone...")
+	WORD (U"Name", U"shepardTone")
+	Sound_create_addCommonFields (dia, U"1.0");
+	POSITIVE (U"Lowest frequency (Hz)", U"4.863")
+	NATURAL (U"Number of components", U"10")
+	REAL (U"Frequency change (semitones/s)", U"4.0")
+	REAL (U"Amplitude range (dB)", U"30.0")
+	REAL (U"Octave shift fraction ([0,1))", U"0.0")
 	OK
 DO
 	double startingTime, finishingTime, samplingFrequency;
-	double amplitudeRange = GET_REAL (L"Amplitude range");
-	double octaveShiftFraction = GET_REAL (L"Octave shift fraction");
+	double amplitudeRange = GET_REAL (U"Amplitude range");
+	double octaveShiftFraction = GET_REAL (U"Octave shift fraction");
 	Sound_create_checkCommonFields (dia, &startingTime, &finishingTime, &samplingFrequency);
 	if (amplitudeRange < 0) {
-		Melder_throw ("Amplitude range cannot be negative.\nPlease use a positive or zero amplitude range.");
+		Melder_throw (U"Amplitude range cannot be negative.\nPlease use a positive or zero amplitude range.");
 	}
 	autoSound sound = Sound_createShepardToneComplex (startingTime, finishingTime, samplingFrequency,
-					GET_REAL (L"Lowest frequency"), GET_INTEGER (L"Number of components"),
-					GET_REAL (L"Frequency change"), GET_REAL (L"Amplitude range"), octaveShiftFraction);
+					GET_REAL (U"Lowest frequency"), GET_INTEGER (U"Number of components"),
+					GET_REAL (U"Frequency change"), GET_REAL (U"Amplitude range"), octaveShiftFraction);
 	// Sound_create_check (sound, startingTime, finishingTime, samplingFrequency); //TODO
-	praat_new (sound.transfer(), GET_STRING (L"Name"));
+	praat_new (sound.transfer(), GET_STRING (U"Name"));
 END
 
-FORM (Sound_drawWhere, L"Sound: Draw where", L"Sound: Draw where...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range", L"0.0 (= all)")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"")
-	OPTIONMENU (L"Drawing method", 1)
-	OPTION (L"Curve")
-	OPTION (L"Bars")
-	OPTION (L"Poles")
-	OPTION (L"Speckles")
-	LABEL (L"", L"Draw only those parts where the following condition holds:")
-	TEXTFIELD (L"Formula", L"x < xmin + (xmax - xmin) / 2; first half")
+FORM (Sound_drawWhere, U"Sound: Draw where", U"Sound: Draw where...")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range", U"0.0 (= all)")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"")
+	OPTIONMENU (U"Drawing method", 1)
+	OPTION (U"Curve")
+	OPTION (U"Bars")
+	OPTION (U"Poles")
+	OPTION (U"Speckles")
+	LABEL (U"", U"Draw only those parts where the following condition holds:")
+	TEXTFIELD (U"Formula", U"x < xmin + (xmax - xmin) / 2; first half")
 	OK
 DO
 	long numberOfBisections = 10;
 	autoPraatPicture picture;
 	LOOP {
 		iam (Sound);
-		Sound_drawWhere (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"),
-		GET_STRING (L"Drawing method"), numberOfBisections, GET_STRING (L"Formula"), interpreter);
+		Sound_drawWhere (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"),
+		GET_STRING (U"Drawing method"), numberOfBisections, GET_STRING (U"Formula"), interpreter);
 	}
 END
 
-FORM (Sound_playOneChannel, L"Sound: Play one channel", 0)
-    NATURAL (L"Channel", L"1")
+FORM (Sound_playOneChannel, U"Sound: Play one channel", 0)
+    NATURAL (U"Channel", U"1")
     OK
 DO
-    long ichannel = GET_INTEGER (L"Channel");
+    long ichannel = GET_INTEGER (U"Channel");
     LOOP {
         iam (Sound);
         if (ichannel > my ny) {
-            Melder_throw (me, ": there is no channel ", Melder_integer(ichannel), ". Sound has only ", Melder_integer (my ny), " channel", 
-				  (my ny > 1 ? "s." : "."));
+            Melder_throw (me, U": there is no channel ", ichannel, U". Sound has only ", my ny, U" channel",
+				  (my ny > 1 ? U"s." : U"."));
         }
         autoSound thee = Sound_extractChannel (me, ichannel);
         Sound_play (thee.peek(), 0, 0);
     }
 END
 
-FORM (Sound_playAsFrequencyShifted, L"Sound: Play as frequency shifted", L"Sound: Play as frequency shifted...")
-	REAL (L"Shift by (Hz)", L"1000.0")
-	POSITIVE (L"New sampling frequency (Hz)", L"44100.0")
-	NATURAL (L"Precision (samples)", L"50")
+FORM (Sound_playAsFrequencyShifted, U"Sound: Play as frequency shifted", U"Sound: Play as frequency shifted...")
+	REAL (U"Shift by (Hz)", U"1000.0")
+	POSITIVE (U"New sampling frequency (Hz)", U"44100.0")
+	NATURAL (U"Precision (samples)", U"50")
 	OK
 DO
-	double shiftBy = GET_REAL (L"Shift by");
-	double newSamplingFrequency = GET_REAL (L"New sampling frequency");
-	long precision = GET_INTEGER (L"Precision");
+	double shiftBy = GET_REAL (U"Shift by");
+	double newSamplingFrequency = GET_REAL (U"New sampling frequency");
+	long precision = GET_INTEGER (U"Precision");
 	LOOP {
 		iam (Sound);
 		Sound_playAsFrequencyShifted (me, shiftBy, newSamplingFrequency, precision);
 	}
 END
 
-FORM (Sounds_to_DTW, L"Sounds: To DTW", 0)
-    POSITIVE (L"Window length (s)", L"0.015")
-    POSITIVE (L"Time step (s)", L"0.005")
-    LABEL (L"", L"")
-    REAL (L"Sakoe-Chiba band (s)", L"0.1")
-    RADIO (L"Slope constraint", 1)
-    RADIOBUTTON (L"no restriction")
-    RADIOBUTTON (L"1/3 < slope < 3")
-    RADIOBUTTON (L"1/2 < slope < 2")
-    RADIOBUTTON (L"2/3 < slope < 3/2")
+FORM (Sounds_to_DTW, U"Sounds: To DTW", 0)
+    POSITIVE (U"Window length (s)", U"0.015")
+    POSITIVE (U"Time step (s)", U"0.005")
+    LABEL (U"", U"")
+    REAL (U"Sakoe-Chiba band (s)", U"0.1")
+    RADIO (U"Slope constraint", 1)
+    RADIOBUTTON (U"no restriction")
+    RADIOBUTTON (U"1/3 < slope < 3")
+    RADIOBUTTON (U"1/2 < slope < 2")
+    RADIOBUTTON (U"2/3 < slope < 3/2")
     OK
 DO
-    double analysisWidth = GET_REAL (L"Window length");
-    double dt = GET_REAL (L"Time step");
-    double band = GET_REAL (L"Sakoe-Chiba band");
-    int slope = GET_INTEGER (L"Slope constraint");
+    double analysisWidth = GET_REAL (U"Window length");
+    double dt = GET_REAL (U"Time step");
+    double band = GET_REAL (U"Sakoe-Chiba band");
+    int slope = GET_INTEGER (U"Slope constraint");
     Sound s1 = 0, s2 = 0;
     LOOP {
         iam (Sound);
         (s1 ? s2 : s1) = me;
     }
     Melder_assert (s1 && s2);
-    praat_new (Sounds_to_DTW (s1, s2, analysisWidth, dt, band, slope), s1 -> name, L"_", s2 -> name);
+    praat_new (Sounds_to_DTW (s1, s2, analysisWidth, dt, band, slope), s1 -> name, U"_", s2 -> name);
 END
 
-FORM (Sound_to_TextGrid_detectSilences, L"Sound: To TextGrid (silences)", L"Sound: To TextGrid (silences)...")
-	LABEL (L"", L"Parameters for the intensity analysis")
-	POSITIVE (L"Minimum pitch (Hz)", L"100")
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	LABEL (L"", L"Silent intervals detection")
-	REAL (L"Silence threshold (dB)", L"-25.0")
-	POSITIVE (L"Minimum silent interval duration (s)", L"0.1")
-	POSITIVE (L"Minimum sounding interval duration (s)", L"0.1")
-	WORD (L"Silent interval label", L"silent")
-	WORD (L"Sounding interval label", L"sounding")
+FORM (Sound_to_TextGrid_detectSilences, U"Sound: To TextGrid (silences)", U"Sound: To TextGrid (silences)...")
+	LABEL (U"", U"Parameters for the intensity analysis")
+	POSITIVE (U"Minimum pitch (Hz)", U"100")
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	LABEL (U"", U"Silent intervals detection")
+	REAL (U"Silence threshold (dB)", U"-25.0")
+	POSITIVE (U"Minimum silent interval duration (s)", U"0.1")
+	POSITIVE (U"Minimum sounding interval duration (s)", U"0.1")
+	WORD (U"Silent interval label", U"silent")
+	WORD (U"Sounding interval label", U"sounding")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_TextGrid_detectSilences (me, GET_REAL (L"Minimum pitch"), GET_REAL (L"Time step"),
-		GET_REAL (L"Silence threshold"), GET_REAL (L"Minimum silent interval duration"),
-		GET_REAL (L"Minimum sounding interval duration"), GET_STRING (L"Silent interval label"),
-		GET_STRING (L"Sounding interval label")), my name);
+		praat_new (Sound_to_TextGrid_detectSilences (me, GET_REAL (U"Minimum pitch"), GET_REAL (U"Time step"),
+		GET_REAL (U"Silence threshold"), GET_REAL (U"Minimum silent interval duration"),
+		GET_REAL (U"Minimum sounding interval duration"), GET_STRING (U"Silent interval label"),
+		GET_STRING (U"Sounding interval label")), my name);
 	}
 END
 
-FORM (Sound_copyChannelRanges, L"Sound: Copy channel ranges", 0)
-	LABEL (L"", L"Create a new Sound from the following channels:")
-	TEXTFIELD (L"Ranges", L"1:64")
-	LABEL (L"", L"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
+FORM (Sound_copyChannelRanges, U"Sound: Copy channel ranges", 0)
+	LABEL (U"", U"Create a new Sound from the following channels:")
+	TEXTFIELD (U"Ranges", U"1:64")
+	LABEL (U"", U"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		autoSound thee = Sound_copyChannelRanges (me, GET_STRING (L"Ranges"));
-		praat_new (thee.transfer(), my name, L"_channels");
+		autoSound thee = Sound_copyChannelRanges (me, GET_STRING (U"Ranges"));
+		praat_new (thee.transfer(), my name, U"_channels");
 	}
 END
 
-FORM (Sound_trimSilences, L"Sound: Trim silences", L"Sound: Trim silences...")
-    REAL (L"Trim duration (s)", L"0.08")
-	BOOLEAN (L"Only at start and end", 1);
-	LABEL (L"", L"Parameters for the intensity analysis")
-	POSITIVE (L"Minimum pitch (Hz)", L"100")
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	LABEL (L"", L"Silent intervals detection")
-	REAL (L"Silence threshold (dB)", L"-35.0")
-	POSITIVE (L"Minimum silent interval duration (s)", L"0.1")
-	POSITIVE (L"Minimum sounding interval duration (s)", L"0.05")
-    BOOLEAN (L"Save trimming info as TextGrid", 0)
-    WORD (L"Trim label", L"trimmed")
+FORM (Sound_trimSilences, U"Sound: Trim silences", U"Sound: Trim silences...")
+    REAL (U"Trim duration (s)", U"0.08")
+	BOOLEAN (U"Only at start and end", 1);
+	LABEL (U"", U"Parameters for the intensity analysis")
+	POSITIVE (U"Minimum pitch (Hz)", U"100")
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	LABEL (U"", U"Silent intervals detection")
+	REAL (U"Silence threshold (dB)", U"-35.0")
+	POSITIVE (U"Minimum silent interval duration (s)", U"0.1")
+	POSITIVE (U"Minimum sounding interval duration (s)", U"0.05")
+    BOOLEAN (U"Save trimming info as TextGrid", 0)
+    WORD (U"Trim label", U"trimmed")
 	OK
 DO
-    double trimDuration = GET_REAL (L"Trim duration");
+    double trimDuration = GET_REAL (U"Trim duration");
     if (trimDuration < 0) {
         trimDuration = 0;
     }
-	bool onlyAtStartAndEnd = GET_INTEGER (L"Only at start and end");
-	double minPitch = GET_REAL (L"Minimum pitch");
-	double timeStep = GET_REAL (L"Time step");
-	double silenceThreshold = GET_REAL (L"Silence threshold");
-	double minSilenceDuration = GET_REAL (L"Minimum silent interval duration");
-	double minSoundingDuration = GET_REAL (L"Minimum sounding interval duration");
-    bool saveTextGrid = GET_INTEGER (L"Save trimming info as TextGrid");
-    const wchar_t *trimlabel = GET_STRING (L"Trim label");
+	bool onlyAtStartAndEnd = GET_INTEGER (U"Only at start and end");
+	double minPitch = GET_REAL (U"Minimum pitch");
+	double timeStep = GET_REAL (U"Time step");
+	double silenceThreshold = GET_REAL (U"Silence threshold");
+	double minSilenceDuration = GET_REAL (U"Minimum silent interval duration");
+	double minSoundingDuration = GET_REAL (U"Minimum sounding interval duration");
+    bool saveTextGrid = GET_INTEGER (U"Save trimming info as TextGrid");
+    const char32 *trimlabel = GET_STRING (U"Trim label");
 	LOOP {
 		iam (Sound);
-        TextGrid tg = NULL;
+        TextGrid tg = nullptr;
 		autoSound thee = Sound_trimSilences (me, trimDuration, onlyAtStartAndEnd, minPitch, timeStep, silenceThreshold,
 			minSilenceDuration, minSoundingDuration, (saveTextGrid ? &tg : 0), trimlabel);
         autoTextGrid atg = tg;
         if (saveTextGrid) {
-            praat_new (atg.transfer(), my name, L"_trimmed");
+            praat_new (atg.transfer(), my name, U"_trimmed");
         }
-		praat_new (thee.transfer(), my name, L"_trimmed");
+		praat_new (thee.transfer(), my name, U"_trimmed");
 	}
 END
 
 // deprecated
-FORM (Sound_to_BarkFilter, L"Sound: To BarkFilter", L"Sound: To BarkSpectrogram...")
-	POSITIVE (L"Window length (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.005")
-	LABEL (L"", L"Filter bank parameters")
-	POSITIVE (L"Position of first filter (bark)", L"1.0")
-	POSITIVE (L"Distance between filters (bark)", L"1.0")
-	REAL (L"Maximum frequency (bark)", L"0");
+FORM (Sound_to_BarkFilter, U"Sound: To BarkFilter", U"Sound: To BarkSpectrogram...")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.005")
+	LABEL (U"", U"Filter bank parameters")
+	POSITIVE (U"Position of first filter (bark)", U"1.0")
+	POSITIVE (U"Distance between filters (bark)", U"1.0")
+	REAL (U"Maximum frequency (bark)", U"0");
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_BarkFilter (me, GET_REAL (L"Window length"),
-		GET_REAL (L"Time step"), GET_REAL (L"Position of first filter"),
-		GET_REAL (L"Maximum frequency"), GET_REAL (L"Distance between filters")), my name);
+		praat_new (Sound_to_BarkFilter (me, GET_REAL (U"Window length"),
+		GET_REAL (U"Time step"), GET_REAL (U"Position of first filter"),
+		GET_REAL (U"Maximum frequency"), GET_REAL (U"Distance between filters")), my name);
 	}
 END
 
-FORM (Sound_to_BarkSpectrogram, L"Sound: To BarkSpectrogram", L"Sound: To BarkSpectrogram...")
-	POSITIVE (L"Window length (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.005")
-	LABEL (L"", L"Filter bank parameters")
-	POSITIVE (L"Position of first filter (bark)", L"1.0")
-	POSITIVE (L"Distance between filters (bark)", L"1.0")
-	REAL (L"Maximum frequency (bark)", L"0");
+FORM (Sound_to_BarkSpectrogram, U"Sound: To BarkSpectrogram", U"Sound: To BarkSpectrogram...")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.005")
+	LABEL (U"", U"Filter bank parameters")
+	POSITIVE (U"Position of first filter (bark)", U"1.0")
+	POSITIVE (U"Distance between filters (bark)", U"1.0")
+	REAL (U"Maximum frequency (bark)", U"0");
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_BarkSpectrogram (me, GET_REAL (L"Window length"),
-			GET_REAL (L"Time step"), GET_REAL (L"Position of first filter"),
-			GET_REAL (L"Maximum frequency"), GET_REAL (L"Distance between filters")), my name);
+		praat_new (Sound_to_BarkSpectrogram (me, GET_REAL (U"Window length"),
+			GET_REAL (U"Time step"), GET_REAL (U"Position of first filter"),
+			GET_REAL (U"Maximum frequency"), GET_REAL (U"Distance between filters")), my name);
 	}
 END
 
 // deprecated
-FORM (Sound_to_FormantFilter, L"Sound: To FormantFilter", L"Sound: To FormantFilter...")
-	POSITIVE (L"Window length (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.005")
-	LABEL (L"", L"Filter bank parameters")
-	POSITIVE (L"Position of first filter (Hz)", L"100.0")
-	POSITIVE (L"Distance between filters (Hz)", L"50.0")
-	REAL (L"Maximum frequency", L"0");
-	POSITIVE (L"Relative bandwidth", L"1.1")
-	LABEL (L"", L"Pitch analysis")
-	REAL (L"Minimum pitch (Hz)", L"75.0")
-	REAL (L"Maximum pitch (Hz)", L"600.0")
+FORM (Sound_to_FormantFilter, U"Sound: To FormantFilter", U"Sound: To FormantFilter...")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.005")
+	LABEL (U"", U"Filter bank parameters")
+	POSITIVE (U"Position of first filter (Hz)", U"100.0")
+	POSITIVE (U"Distance between filters (Hz)", U"50.0")
+	REAL (U"Maximum frequency", U"0");
+	POSITIVE (U"Relative bandwidth", U"1.1")
+	LABEL (U"", U"Pitch analysis")
+	REAL (U"Minimum pitch (Hz)", U"75.0")
+	REAL (U"Maximum pitch (Hz)", U"600.0")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_FormantFilter (me, GET_REAL (L"Window length"),
-		GET_REAL (L"Time step"), GET_REAL (L"Position of first filter"),
-		GET_REAL (L"Maximum frequency"), GET_REAL (L"Distance between filters"),
-		GET_REAL (L"Relative bandwidth"), GET_REAL (L"Minimum pitch"),
-		GET_REAL (L"Maximum pitch")), my name);
+		praat_new (Sound_to_FormantFilter (me, GET_REAL (U"Window length"),
+		GET_REAL (U"Time step"), GET_REAL (U"Position of first filter"),
+		GET_REAL (U"Maximum frequency"), GET_REAL (U"Distance between filters"),
+		GET_REAL (U"Relative bandwidth"), GET_REAL (U"Minimum pitch"),
+		GET_REAL (U"Maximum pitch")), my name);
 	}
 END
 
-FORM (Sound_to_Spectrogram_pitchDependent, L"Sound: To Spectrogram (pitch-dependent)", L"Sound: To Spectrogram (pitch-dependent)...")
-	POSITIVE (L"Window length (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.005")
-	LABEL (L"", L"Filter bank parameters")
-	POSITIVE (L"Position of first filter (Hz)", L"100.0")
-	POSITIVE (L"Distance between filters (Hz)", L"50.0")
-	REAL (L"Maximum frequency", L"0");
-	POSITIVE (L"Relative bandwidth", L"1.1")
-	LABEL (L"", L"Pitch analysis")
-	REAL (L"Minimum pitch (Hz)", L"75.0")
-	REAL (L"Maximum pitch (Hz)", L"600.0")
+FORM (Sound_to_Spectrogram_pitchDependent, U"Sound: To Spectrogram (pitch-dependent)", U"Sound: To Spectrogram (pitch-dependent)...")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.005")
+	LABEL (U"", U"Filter bank parameters")
+	POSITIVE (U"Position of first filter (Hz)", U"100.0")
+	POSITIVE (U"Distance between filters (Hz)", U"50.0")
+	REAL (U"Maximum frequency", U"0");
+	POSITIVE (U"Relative bandwidth", U"1.1")
+	LABEL (U"", U"Pitch analysis")
+	REAL (U"Minimum pitch (Hz)", U"75.0")
+	REAL (U"Maximum pitch (Hz)", U"600.0")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_Spectrogram_pitchDependent (me, GET_REAL (L"Window length"),
-		GET_REAL (L"Time step"), GET_REAL (L"Position of first filter"),
-		GET_REAL (L"Maximum frequency"), GET_REAL (L"Distance between filters"),
-		GET_REAL (L"Relative bandwidth"), GET_REAL (L"Minimum pitch"),
-		GET_REAL (L"Maximum pitch")), my name);
+		praat_new (Sound_to_Spectrogram_pitchDependent (me, GET_REAL (U"Window length"),
+		GET_REAL (U"Time step"), GET_REAL (U"Position of first filter"),
+		GET_REAL (U"Maximum frequency"), GET_REAL (U"Distance between filters"),
+		GET_REAL (U"Relative bandwidth"), GET_REAL (U"Minimum pitch"),
+		GET_REAL (U"Maximum pitch")), my name);
 	}
 END
 
 // deprecated
-FORM (Sound_to_MelFilter, L"Sound: To MelFilter", L"Sound: To MelFilter...")
-	POSITIVE (L"Window length (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.005")
-	LABEL (L"", L"Filter bank parameters")
-	POSITIVE (L"Position of first filter (mel)", L"100.0")
-	POSITIVE (L"Distance between filters (mel)", L"100.0")
-	REAL (L"Maximum frequency (mel)", L"0.0");
+FORM (Sound_to_MelFilter, U"Sound: To MelFilter", U"Sound: To MelFilter...")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.005")
+	LABEL (U"", U"Filter bank parameters")
+	POSITIVE (U"Position of first filter (mel)", U"100.0")
+	POSITIVE (U"Distance between filters (mel)", U"100.0")
+	REAL (U"Maximum frequency (mel)", U"0.0");
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_MelFilter (me, GET_REAL (L"Window length"),
-		GET_REAL (L"Time step"), GET_REAL (L"Position of first filter"),
-		GET_REAL (L"Maximum frequency"), GET_REAL (L"Distance between filters")), my name);
+		praat_new (Sound_to_MelFilter (me, GET_REAL (U"Window length"),
+		GET_REAL (U"Time step"), GET_REAL (U"Position of first filter"),
+		GET_REAL (U"Maximum frequency"), GET_REAL (U"Distance between filters")), my name);
 	}
 END
 
-FORM (Sound_to_MelSpectrogram, L"Sound: To MelSpectrogram", L"Sound: To MelSpectrogram...")
-	POSITIVE (L"Window length (s)", L"0.015")
-	POSITIVE (L"Time step (s)", L"0.005")
-	LABEL (L"", L"Filter bank parameters")
-	POSITIVE (L"Position of first filter (mel)", L"100.0")
-	POSITIVE (L"Distance between filters (mel)", L"100.0")
-	REAL (L"Maximum frequency (mel)", L"0.0");
+FORM (Sound_to_MelSpectrogram, U"Sound: To MelSpectrogram", U"Sound: To MelSpectrogram...")
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step (s)", U"0.005")
+	LABEL (U"", U"Filter bank parameters")
+	POSITIVE (U"Position of first filter (mel)", U"100.0")
+	POSITIVE (U"Distance between filters (mel)", U"100.0")
+	REAL (U"Maximum frequency (mel)", U"0.0");
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_MelSpectrogram (me, GET_REAL (L"Window length"),
-		GET_REAL (L"Time step"), GET_REAL (L"Position of first filter"),
-		GET_REAL (L"Maximum frequency"), GET_REAL (L"Distance between filters")), my name);
+		praat_new (Sound_to_MelSpectrogram (me, GET_REAL (U"Window length"),
+		GET_REAL (U"Time step"), GET_REAL (U"Position of first filter"),
+		GET_REAL (U"Maximum frequency"), GET_REAL (U"Distance between filters")), my name);
 	}
 END
 
-FORM (Sound_to_Pitch_shs, L"Sound: To Pitch (shs)", L"Sound: To Pitch (shs)...")
-	POSITIVE (L"Time step (s)", L"0.01")
-	POSITIVE (L"Minimum pitch (Hz)", L"50.0")
-	NATURAL (L"Max. number of candidates (Hz)", L"15")
-	LABEL (L"", L"Algorithm parameters")
-	POSITIVE (L"Maximum frequency component (Hz)", L"1250.0")
-	NATURAL (L"Max. number of subharmonics", L"15")
-	POSITIVE (L"Compression factor (<=1)", L"0.84")
-	POSITIVE (L"Ceiling (Hz)", L"600.0")
-	NATURAL (L"Number of points per octave", L"48");
+FORM (Sound_to_ComplexSpectrogram, U"Sound: To ComplexSpectrogram", 0)
+	POSITIVE (U"Window length (s)", U"0.015")
+	POSITIVE (U"Time step", U"0.005")
 	OK
 DO
-	double minimumPitch = GET_REAL (L"Minimum pitch");
-	double fmax = GET_REAL (L"Maximum frequency component");
-	double ceiling = GET_REAL (L"Ceiling");
+	LOOP {
+		iam (Sound);
+		autoComplexSpectrogram thee = Sound_to_ComplexSpectrogram (me, GET_REAL (U"Window length"), GET_REAL (U"Time step"));
+		praat_new (thee.transfer(), my name);
+	}
+END
+
+FORM (Sound_to_Pitch_shs, U"Sound: To Pitch (shs)", U"Sound: To Pitch (shs)...")
+	POSITIVE (U"Time step (s)", U"0.01")
+	POSITIVE (U"Minimum pitch (Hz)", U"50.0")
+	NATURAL (U"Max. number of candidates (Hz)", U"15")
+	LABEL (U"", U"Algorithm parameters")
+	POSITIVE (U"Maximum frequency component (Hz)", U"1250.0")
+	NATURAL (U"Max. number of subharmonics", U"15")
+	POSITIVE (U"Compression factor (<=1)", U"0.84")
+	POSITIVE (U"Ceiling (Hz)", U"600.0")
+	NATURAL (U"Number of points per octave", U"48");
+	OK
+DO
+	double minimumPitch = GET_REAL (U"Minimum pitch");
+	double fmax = GET_REAL (U"Maximum frequency component");
+	double ceiling = GET_REAL (U"Ceiling");
 	if (minimumPitch >= ceiling) {
-		Melder_throw ("Minimum pitch should be smaller than ceiling.");
+		Melder_throw (U"Minimum pitch should be smaller than ceiling.");
 	}
 	if (ceiling >= fmax) {
-		Melder_throw ("Maximum frequency must be greater than or equal to ceiling.");
+		Melder_throw (U"Maximum frequency must be greater than or equal to ceiling.");
 	}
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_Pitch_shs (me, GET_REAL (L"Time step"), minimumPitch, fmax, ceiling,
-		GET_INTEGER (L"Max. number of subharmonics"), GET_INTEGER (L"Max. number of candidates"),
-		GET_REAL (L"Compression factor"), GET_INTEGER (L"Number of points per octave")), my name);
+		praat_new (Sound_to_Pitch_shs (me, GET_REAL (U"Time step"), minimumPitch, fmax, ceiling,
+		GET_INTEGER (U"Max. number of subharmonics"), GET_INTEGER (U"Max. number of candidates"),
+		GET_REAL (U"Compression factor"), GET_INTEGER (U"Number of points per octave")), my name);
 	}
 END
 
-FORM (Sound_fadeIn, L"Sound: Fade in", L"Sound: Fade in...")
-	CHANNEL (L"Channel (number, 0 = (all))", L"1")
-	REAL (L"Time (s)", L"-10000.0")
-	REAL (L"Fade time (s)", L"0.005")
-	BOOLEAN (L"Silent from start", 0)
+FORM (Sound_fadeIn, U"Sound: Fade in", U"Sound: Fade in...")
+	CHANNEL (U"Channel (number, 0 = (all))", U"1")
+	REAL (U"Time (s)", U"-10000.0")
+	REAL (U"Fade time (s)", U"0.005")
+	BOOLEAN (U"Silent from start", 0)
 	OK
 DO
-	long channel = GET_INTEGER (L"Channel");
+	long channel = GET_INTEGER (U"Channel");
 	LOOP {
 		iam (Sound);
-		Sound_fade (me, channel, GET_REAL (L"Time"), GET_REAL (L"Fade time"), -1, GET_INTEGER (L"Silent from start"));
+		Sound_fade (me, channel, GET_REAL (U"Time"), GET_REAL (U"Fade time"), -1, GET_INTEGER (U"Silent from start"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Sound_fadeOut, L"Sound: Fade out", L"Sound: Fade out...")
-	CHANNEL (L"Channel (number, 0 = (all))", L"1")
-	REAL (L"Time (s)", L"10000.0")
-	REAL (L"Fade time (s)", L"-0.005")
-	BOOLEAN (L"Silent to end", 0)
+FORM (Sound_fadeOut, U"Sound: Fade out", U"Sound: Fade out...")
+	CHANNEL (U"Channel (number, 0 = (all))", U"1")
+	REAL (U"Time (s)", U"10000.0")
+	REAL (U"Fade time (s)", U"-0.005")
+	BOOLEAN (U"Silent to end", 0)
 	OK
 DO
-	long channel = GET_INTEGER (L"Channel");
+	long channel = GET_INTEGER (U"Channel");
 	LOOP {
 		iam (Sound);
-		Sound_fade (me, channel, GET_REAL (L"Time"), GET_REAL (L"Fade time"), 1, GET_INTEGER (L"Silent to end"));
+		Sound_fade (me, channel, GET_REAL (U"Time"), GET_REAL (U"Fade time"), 1, GET_INTEGER (U"Silent to end"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (Sound_to_KlattGrid_simple, L"Sound: To KlattGrid (simple)", L"Sound: To KlattGrid (simple)...")
-	POSITIVE (L"Time step (s)", L"0.005")
-	LABEL (L"", L"Formant determination")
-	NATURAL (L"Max. number of formants", L"5")
-	POSITIVE (L"Maximum formant (Hz)", L"5500 (=adult female)")
-	POSITIVE (L"Window length (s)", L"0.025")
-	POSITIVE (L"Pre-emphasis from (Hz)", L"50.0")
-	LABEL (L"", L"Pitch determination")
-	POSITIVE (L"Pitch floor (Hz)", L"60.0")
-	POSITIVE (L"Pitch ceiling (Hz)", L"600.0")
-	LABEL (L"", L"Intensity determination")
-	POSITIVE (L"Minimum pitch (Hz)", L"100.0")
-	BOOLEAN (L"Subtract mean", 1)
+FORM (Sound_to_KlattGrid_simple, U"Sound: To KlattGrid (simple)", U"Sound: To KlattGrid (simple)...")
+	POSITIVE (U"Time step (s)", U"0.005")
+	LABEL (U"", U"Formant determination")
+	NATURAL (U"Max. number of formants", U"5")
+	POSITIVE (U"Maximum formant (Hz)", U"5500 (=adult female)")
+	POSITIVE (U"Window length (s)", U"0.025")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50.0")
+	LABEL (U"", U"Pitch determination")
+	POSITIVE (U"Pitch floor (Hz)", U"60.0")
+	POSITIVE (U"Pitch ceiling (Hz)", U"600.0")
+	LABEL (U"", U"Intensity determination")
+	POSITIVE (U"Minimum pitch (Hz)", U"100.0")
+	BOOLEAN (U"Subtract mean", 1)
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_KlattGrid_simple (me, GET_REAL (L"Time step"),
-		GET_INTEGER (L"Max. number of formants"), GET_REAL (L"Maximum formant"),
-		GET_REAL (L"Window length"), GET_REAL (L"Pre-emphasis from"),
-		GET_REAL (L"Pitch floor"), GET_REAL (L"Pitch ceiling"),
-		GET_REAL (L"Minimum pitch"), GET_INTEGER (L"Subtract mean")), my name);
+		praat_new (Sound_to_KlattGrid_simple (me, GET_REAL (U"Time step"),
+			GET_INTEGER (U"Max. number of formants"), GET_REAL (U"Maximum formant"),
+			GET_REAL (U"Window length"), GET_REAL (U"Pre-emphasis from"),
+			GET_REAL (U"Pitch floor"), GET_REAL (U"Pitch ceiling"),
+			GET_REAL (U"Minimum pitch"), GET_INTEGER (U"Subtract mean")).transfer(), my name);
 	}
 END
 
-FORM (Sound_to_Pitch_SPINET, L"Sound: To SPINET", L"Sound: To SPINET...")
-	POSITIVE (L"Time step (s)", L"0.005")
-	POSITIVE (L"Window length (s)", L"0.040")
-	LABEL (L"", L"Gammatone filter bank")
-	POSITIVE (L"Minimum filter frequency (Hz)", L"70.0")
-	POSITIVE (L"Maximum filter frequency (Hz)", L"5000.0")
-	NATURAL (L"Number of filters", L"250");
-	POSITIVE (L"Ceiling (Hz)", L"500.0")
-	NATURAL (L"Max. number of candidates", L"15")
+FORM (Sound_to_Pitch_SPINET, U"Sound: To SPINET", U"Sound: To SPINET...")
+	POSITIVE (U"Time step (s)", U"0.005")
+	POSITIVE (U"Window length (s)", U"0.040")
+	LABEL (U"", U"Gammatone filter bank")
+	POSITIVE (U"Minimum filter frequency (Hz)", U"70.0")
+	POSITIVE (U"Maximum filter frequency (Hz)", U"5000.0")
+	NATURAL (U"Number of filters", U"250");
+	POSITIVE (U"Ceiling (Hz)", U"500.0")
+	NATURAL (U"Max. number of candidates", U"15")
 	OK
 DO
-	double fmin = GET_REAL (L"Minimum filter frequency");
-	double fmax = GET_REAL (L"Maximum filter frequency");
+	double fmin = GET_REAL (U"Minimum filter frequency");
+	double fmax = GET_REAL (U"Maximum filter frequency");
 	if (fmax <= fmin) {
-		Melder_throw ("Maximum frequency must be larger than minimum frequency.");
+		Melder_throw (U"Maximum frequency must be larger than minimum frequency.");
 	}
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_to_Pitch_SPINET (me, GET_REAL (L"Time step"), GET_REAL (L"Window length"),
-		fmin, fmax, GET_INTEGER (L"Number of filters"),
-		GET_REAL (L"Ceiling"), GET_INTEGER (L"Max. number of candidates")), my name);
+		praat_new (Sound_to_Pitch_SPINET (me, GET_REAL (U"Time step"), GET_REAL (U"Window length"),
+			fmin, fmax, GET_INTEGER (U"Number of filters"),
+			GET_REAL (U"Ceiling"), GET_INTEGER (U"Max. number of candidates")), my name);
 	}
 END
 
-FORM (Sound_to_Polygon, L"Sound: To Polygon", L"Sound: To Polygon...")
-	CHANNEL (L"Channel (number, Left, or Right)", L"1")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	REAL (L"Connection y-value", L"0.0")
+FORM (Sound_to_Polygon, U"Sound: To Polygon", U"Sound: To Polygon...")
+	CHANNEL (U"Channel (number, Left, or Right)", U"1")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	REAL (U"Connection y-value", U"0.0")
 	OK
 DO
-	long channel = GET_INTEGER (L"Channel");
+	long channel = GET_INTEGER (U"Channel");
 	LOOP {
 		iam (Sound);
 		if (channel > my ny) {
 			channel = 1;
 		}
-		praat_new (Sound_to_Polygon (me, channel, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_REAL (L"Connection y-value")), my name);
+		praat_new (Sound_to_Polygon (me, channel, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_REAL (U"Connection y-value")), my name);
 	}
 END
 
-FORM (Sounds_to_Polygon_enclosed, L"Sounds: To Polygon (enclosed)", L"Sounds: To Polygon (enclosed)...")
-	CHANNEL (L"Channel (number, Left, or Right)", L"1")
-	OPTION (L"Left")
-	OPTION (L"Right")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
+FORM (Sounds_to_Polygon_enclosed, U"Sounds: To Polygon (enclosed)", U"Sounds: To Polygon (enclosed)...")
+	CHANNEL (U"Channel (number, Left, or Right)", U"1")
+	OPTION (U"Left")
+	OPTION (U"Right")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
 	OK
 DO
-	long channel = GET_INTEGER (L"Channel");
+	long channel = GET_INTEGER (U"Channel");
 	Sound s1 = 0, s2 = 0;
 	LOOP {
 		iam (Sound);
 		(s1 ? s2 : s1) = me;
 	}
 	Melder_assert (s1 && s2);
-	praat_new (Sounds_to_Polygon_enclosed (s1, s2, channel, GET_REAL (L"left Time range"),
-		GET_REAL (L"right Time range"), GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range")), s1->name, L"_", s2->name);
+	praat_new (Sounds_to_Polygon_enclosed (s1, s2, channel, GET_REAL (U"left Time range"),
+		GET_REAL (U"right Time range"), GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range")), s1->name, U"_", s2->name);
 END
 
-FORM (Sound_filterByGammaToneFilter4, L"Sound: Filter (gammatone)", L"Sound: Filter (gammatone)...")
-	POSITIVE (L"Centre frequency (Hz)", L"1000.0")
-	POSITIVE (L"Bandwidth (Hz)", L"150.0")
+FORM (Sound_filterByGammaToneFilter4, U"Sound: Filter (gammatone)", U"Sound: Filter (gammatone)...")
+	POSITIVE (U"Centre frequency (Hz)", U"1000.0")
+	POSITIVE (U"Bandwidth (Hz)", U"150.0")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		praat_new (Sound_filterByGammaToneFilter4 (me, GET_REAL (L"Centre frequency"), GET_REAL (L"Bandwidth")), my name, L"_filtered");
+		praat_new (Sound_filterByGammaToneFilter4 (me, GET_REAL (U"Centre frequency"), GET_REAL (U"Bandwidth")), my name, U"_filtered");
 	}
 END
 
-FORM (Sound_removeNoise, L"Sound: Remove noise", L"Sound: Remove noise...")
-	REAL (L"left Noise time range (s)", L"0.0")
-	REAL (L"right Noise time range (s)", L"0.0")
-	POSITIVE (L"Window length (s)", L"0.025")
-	LABEL (L"", L"Filter")
-	REAL (L"left Filter frequency range (Hz)", L"80.0")
-	REAL (L"right Filter frequency range (Hz)", L"10000.0")
-	POSITIVE (L"Smoothing (Hz)", L"40.0")
-	OPTIONMENU (L"Noise reduction method", 1)
-	OPTION (L"Spectral subtraction")
+FORM (Sound_removeNoise, U"Sound: Remove noise", U"Sound: Remove noise...")
+	REAL (U"left Noise time range (s)", U"0.0")
+	REAL (U"right Noise time range (s)", U"0.0")
+	POSITIVE (U"Window length (s)", U"0.025")
+	LABEL (U"", U"Filter")
+	REAL (U"left Filter frequency range (Hz)", U"80.0")
+	REAL (U"right Filter frequency range (Hz)", U"10000.0")
+	POSITIVE (U"Smoothing (Hz)", U"40.0")
+	OPTIONMENU (U"Noise reduction method", 1)
+	OPTION (U"Spectral subtraction")
 	OK
 DO
 	LOOP {
 		iam (Sound);
-		autoSound thee = Sound_removeNoise (me, GET_REAL (L"left Noise time range"), GET_REAL (L"right Noise time range"),
-			GET_REAL (L"Window length"), GET_REAL (L"left Filter frequency range"),
-			GET_REAL (L"right Filter frequency range"), GET_REAL (L"Smoothing"), GET_INTEGER (L"Noise reduction method"));
-		praat_new (thee.transfer(), my name, L"_denoised");
+		autoSound thee = Sound_removeNoise (me, GET_REAL (U"left Noise time range"), GET_REAL (U"right Noise time range"),
+			GET_REAL (U"Window length"), GET_REAL (U"left Filter frequency range"),
+			GET_REAL (U"right Filter frequency range"), GET_REAL (U"Smoothing"), GET_INTEGER (U"Noise reduction method"));
+		praat_new (thee.transfer(), my name, U"_denoised");
 	}
 END
 
-FORM (Sound_changeSpeaker, L"Sound: Change speaker", L"Sound: Change speaker...")
-	LABEL (L"", L"Pitch measurement parameters")
-	POSITIVE (L"Pitch floor (Hz)", L"75.0")
-	POSITIVE (L"Pitch ceiling (Hz)", L"600.0")
-	LABEL (L"", L"Modification parameters")
-	POSITIVE (L"Multiply formants by", L"1.2")
-	POSITIVE (L"Multiply pitch by", L"1.0")
-	REAL (L"Multiply pitch range by", L"1.0 (=no change)")
-	POSITIVE (L"Multiply duration by", L"1.0")
+FORM (Sound_changeSpeaker, U"Sound: Change speaker", U"Sound: Change speaker...")
+	LABEL (U"", U"Pitch measurement parameters")
+	POSITIVE (U"Pitch floor (Hz)", U"75.0")
+	POSITIVE (U"Pitch ceiling (Hz)", U"600.0")
+	LABEL (U"", U"Modification parameters")
+	POSITIVE (U"Multiply formants by", U"1.2")
+	POSITIVE (U"Multiply pitch by", U"1.0")
+	REAL (U"Multiply pitch range by", U"1.0 (=no change)")
+	POSITIVE (U"Multiply duration by", U"1.0")
 	OK
 DO
-	double minimumPitch = GET_REAL (L"Pitch floor");
-	double maximumPitch = GET_REAL (L"Pitch ceiling");
+	double minimumPitch = GET_REAL (U"Pitch floor");
+	double maximumPitch = GET_REAL (U"Pitch ceiling");
 	if (minimumPitch >= maximumPitch) {
-		Melder_throw ("Maximum pitch should be greater than minimum pitch.");
+		Melder_throw (U"Maximum pitch should be greater than minimum pitch.");
 	}
 	LOOP {
 		iam (Sound);
 		praat_new (Sound_changeSpeaker (me, minimumPitch, maximumPitch,
-		GET_REAL (L"Multiply formants by"), GET_REAL (L"Multiply pitch by"),
-		GET_REAL (L"Multiply pitch range by"), GET_REAL (L"Multiply duration by")), my name, L"_changeSpeaker");
+		GET_REAL (U"Multiply formants by"), GET_REAL (U"Multiply pitch by"),
+		GET_REAL (U"Multiply pitch range by"), GET_REAL (U"Multiply duration by")), my name, U"_changeSpeaker");
 	}
 END
 
-FORM (Sound_changeGender, L"Sound: Change gender", L"Sound: Change gender...")
-	LABEL (L"", L"Pitch measurement parameters")
-	POSITIVE (L"Pitch floor (Hz)", L"75.0")
-	POSITIVE (L"Pitch ceiling (Hz)", L"600.0")
-	LABEL (L"", L"Modification parameters")
-	POSITIVE (L"Formant shift ratio", L"1.2")
-	REAL (L"New pitch median (Hz)", L"0.0 (=no change)")
-	REAL (L"Pitch range factor", L"1.0 (=no change)")
-	POSITIVE (L"Duration factor", L"1.0")
+FORM (Sound_changeGender, U"Sound: Change gender", U"Sound: Change gender...")
+	LABEL (U"", U"Pitch measurement parameters")
+	POSITIVE (U"Pitch floor (Hz)", U"75.0")
+	POSITIVE (U"Pitch ceiling (Hz)", U"600.0")
+	LABEL (U"", U"Modification parameters")
+	POSITIVE (U"Formant shift ratio", U"1.2")
+	REAL (U"New pitch median (Hz)", U"0.0 (=no change)")
+	REAL (U"Pitch range factor", U"1.0 (=no change)")
+	POSITIVE (U"Duration factor", U"1.0")
 	OK
 DO
-	double minimumPitch = GET_REAL (L"Pitch floor");
-	double maximumPitch = GET_REAL (L"Pitch ceiling");
-	double pitchrf = GET_REAL (L"Pitch range factor");
+	double minimumPitch = GET_REAL (U"Pitch floor");
+	double maximumPitch = GET_REAL (U"Pitch ceiling");
+	double pitchrf = GET_REAL (U"Pitch range factor");
 	if (minimumPitch >= maximumPitch) {
-		Melder_throw ("Maximum pitch should be greater than minimum pitch.");
+		Melder_throw (U"Maximum pitch should be greater than minimum pitch.");
 	}
 	if (pitchrf < 0) {
-		Melder_throw ("Pitch range factor may not be negative");
+		Melder_throw (U"Pitch range factor may not be negative");
 	}
 	LOOP {
 		iam (Sound);
 		praat_new (Sound_changeGender_old (me, minimumPitch, maximumPitch,
-		GET_REAL (L"Formant shift ratio"), GET_REAL (L"New pitch median"),
-		pitchrf, GET_REAL (L"Duration factor")), my name, L"_changeGender");
+		GET_REAL (U"Formant shift ratio"), GET_REAL (U"New pitch median"),
+		pitchrf, GET_REAL (U"Duration factor")), my name, U"_changeGender");
 	}
 END
 
-FORM (Sound_paintWhere, L"Sound paint where", L"Sound: Paint where...")
-	COLOUR (L"Colour (0-1, name, or {r,g,b})", L"0.5")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	REAL (L"Fill from level", L"0.0")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"Paint only those parts where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; always")
+FORM (Sound_paintWhere, U"Sound paint where", U"Sound: Paint where...")
+	COLOUR (U"Colour (0-1, name, or {r,g,b})", U"0.5")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	REAL (U"Fill from level", U"0.0")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"Paint only those parts where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; always")
 	OK
 DO
 	long numberOfBisections = 10;
 	autoPraatPicture picture;
 	LOOP {
 		iam (Sound);
-		Sound_paintWhere (me, GRAPHICS, GET_COLOUR (L"Colour"), GET_REAL (L"left Time range"),
-		GET_REAL (L"right Time range"), GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_REAL (L"Fill from level"), GET_INTEGER (L"Garnish"), numberOfBisections, GET_STRING (L"Formula"),
+		Sound_paintWhere (me, GRAPHICS, GET_COLOUR (U"Colour"), GET_REAL (U"left Time range"),
+		GET_REAL (U"right Time range"), GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_REAL (U"Fill from level"), GET_INTEGER (U"Garnish"), numberOfBisections, GET_STRING (U"Formula"),
 		interpreter);
 	}
 END
 
-FORM (Sounds_paintEnclosed, L"Sounds paint enclosed", L"Sounds: Paint enclosed...")
-	COLOUR (L"Colour (0-1, name, or {r,g,b})", L"0.5")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (Sounds_paintEnclosed, U"Sounds paint enclosed", U"Sounds: Paint enclosed...")
+	COLOUR (U"Colour (0-1, name, or {r,g,b})", U"0.5")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	Sound s1 = 0, s2 = 0;
@@ -5992,26 +6173,26 @@ DO
 	}
 	Melder_assert (s1 && s2);
 	autoPraatPicture picture;
-	Sounds_paintEnclosed (s1, s2, GRAPHICS, GET_COLOUR (L"Colour"),
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"));
+	Sounds_paintEnclosed (s1, s2, GRAPHICS, GET_COLOUR (U"Colour"),
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"));
 END
 
-FORM_READ (Sound_readFromRawFileLE, L"Read Sound from raw Little Endian file", 0, true)
-	praat_new (Sound_readFromRawFile (file, NULL, 16, 1, 0, 0, 16000), MelderFile_name (file));
-END
+FORM_READ2 (Sound_readFromRawFileLE, U"Read Sound from raw Little Endian file", 0, true) {
+	praat_new (Sound_readFromRawFile (file, nullptr, 16, 1, 0, 0, 16000), MelderFile_name (file));
+END2 }
 
-FORM_READ (Sound_readFromRawFileBE, L"Read Sound from raw 16-bit Little Endian file", 0, true)
-	praat_new (Sound_readFromRawFile (file, NULL, 16, 0, 0, 0, 16000), MelderFile_name (file));
-END
+FORM_READ2 (Sound_readFromRawFileBE, U"Read Sound from raw 16-bit Little Endian file", 0, true) {
+	praat_new (Sound_readFromRawFile (file, nullptr, 16, 0, 0, 0, 16000), MelderFile_name (file));
+END2 }
 
-FORM_READ (KlattTable_readFromRawTextFile, L"KlattTable_readFromRawTextFile", 0, true)
+FORM_READ2 (KlattTable_readFromRawTextFile, U"KlattTable_readFromRawTextFile", 0, true) {
 	praat_new (KlattTable_readFromRawTextFile (file), MelderFile_name (file));
-END
+END2 }
 
 /************ Spectrograms *********************************************/
 
-FORM (Spectrograms_to_DTW, L"Spectrograms: To DTW", 0)
+FORM (Spectrograms_to_DTW, U"Spectrograms: To DTW", 0)
 	DTW_constraints_addCommonFields (dia);
 	OK
 DO
@@ -6023,26 +6204,53 @@ DO
 		(s1 ? s2 : s1) = me;
 	}
 	Melder_assert (s1 && s2);
-	praat_new (Spectrograms_to_DTW (s1, s2, begin, end, slope, 1), s1->name, L"_", s2->name);
+	autoDTW thee = Spectrograms_to_DTW (s1, s2, begin, end, slope, 1);
+	praat_new (thee.transfer(), s1->name, U"_", s2->name);
 END
 
 /**************** Spectrum *******************************************/
 
-FORM (Spectrum_drawPhases, L"Spectrum: Draw phases", L"Spectrum: Draw phases...")
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"0.0")
-	REAL (L"Minimum phase (dB/Hz)", L"0.0 (= auto)")
-	REAL (L"Maximum phase (dB/Hz)", L"0.0 (= auto)")
-	BOOLEAN (L"Unwrap", 1)
-	BOOLEAN (L"Garnish", 1)
+FORM (Spectrum_drawPhases, U"Spectrum: Draw phases", U"Spectrum: Draw phases...")
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"0.0")
+	REAL (U"Minimum phase (dB/Hz)", U"0.0 (= auto)")
+	REAL (U"Maximum phase (dB/Hz)", U"0.0 (= auto)")
+	BOOLEAN (U"Unwrap", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Spectrum);
-		Spectrum_drawPhases (me, GRAPHICS, GET_REAL (L"From frequency"), GET_REAL (L"To frequency"),
-		GET_REAL (L"Minimum phase"), GET_REAL (L"Maximum phase"),
-		GET_INTEGER (L"Unwrap"), GET_INTEGER (L"Garnish"));
+		Spectrum_drawPhases (me, GRAPHICS, GET_REAL (U"From frequency"), GET_REAL (U"To frequency"),
+		GET_REAL (U"Minimum phase"), GET_REAL (U"Maximum phase"),
+		GET_INTEGER (U"Unwrap"), GET_INTEGER (U"Garnish"));
+	}
+END
+
+FORM (Spectrum_setRealValueInBin, U"Spectrum: Set real value in bin", 0)
+	NATURAL (U"Bin number", U"100")
+	REAL (U"Value", U"0.0")
+	OK
+DO
+	long binNumber = GET_INTEGER (U"Bin number");
+	LOOP {
+		iam (Spectrum);
+		if (binNumber > my nx) Melder_throw (U"Bin number must not exceed number of bins.");
+		my z[1][binNumber]= GET_REAL (U"Value");
+	}
+END
+
+FORM (Spectrum_setImaginaryValueInBin, U"Spectrum: Set imaginary value in bin", 0)
+	NATURAL (U"Bin number", U"100")
+	REAL (U"Value", U"0.0")
+	OK
+DO
+	long binNumber = GET_INTEGER (U"Bin number");
+	LOOP {
+		iam (Spectrum);
+		if (binNumber > my nx) Melder_throw (U"Bin number must not exceed number of bins.");
+		my z[2][binNumber]= GET_REAL (U"Value");
 	}
 END
 
@@ -6054,19 +6262,19 @@ DIRECT (Spectrum_conjugate)
 	}
 END
 
-FORM (Spectrum_shiftFrequencies, L"Spectrum: Shift frequencies", L"Spectrum: Shift frequencies...")
-	REAL (L"Shift by (Hz)", L"1000.0")
-	POSITIVE (L"New maximum frequency (Hz)", L"22050")
-	NATURAL (L"Precision", L"50")
+FORM (Spectrum_shiftFrequencies, U"Spectrum: Shift frequencies", U"Spectrum: Shift frequencies...")
+	REAL (U"Shift by (Hz)", U"1000.0")
+	POSITIVE (U"New maximum frequency (Hz)", U"22050")
+	NATURAL (U"Precision", U"50")
 	OK
 DO
-	double shiftBy = GET_REAL (L"Shift by");
-	double newMaximumFrequency = GET_REAL (L"New maximum frequency");
-	long precision = GET_INTEGER (L"Precision");
+	double shiftBy = GET_REAL (U"Shift by");
+	double newMaximumFrequency = GET_REAL (U"New maximum frequency");
+	long precision = GET_INTEGER (U"Precision");
 	LOOP {
 		iam (Spectrum);
 		autoSpectrum thee = Spectrum_shiftFrequencies (me, shiftBy, newMaximumFrequency, precision);
-		praat_new (thee.transfer(), my name, (shiftBy < 0 ? L"_m" : L"_"), Melder_integer (shiftBy));
+		praat_new (thee.transfer(), my name, (shiftBy < 0 ? U"_m" : U"_"), (long) floor (shiftBy));
 	}
 END
 
@@ -6077,36 +6285,36 @@ DIRECT (Spectra_multiply)
 		(s1 ? s2 : s1) = me;
 	}
 	Melder_assert (s1 && s2);
-	praat_new (Spectra_multiply (s1, s2), Thing_getName (s1), L"_x_", Thing_getName (s2));
+	praat_new (Spectra_multiply (s1, s2), Thing_getName (s1), U"_x_", Thing_getName (s2));
 END
 
-FORM (Spectrum_resample, L"Spectrum: Resample", 0)
-	NATURAL (L"New number of frequencies", L"256")
+FORM (Spectrum_resample, U"Spectrum: Resample", 0)
+	NATURAL (U"New number of frequencies", U"256")
 	OK
 DO
-	long numberOfFrequencies = GET_INTEGER (L"New number of frequencies");
+	long numberOfFrequencies = GET_INTEGER (U"New number of frequencies");
 	LOOP {
 		iam (Spectrum);
 		autoSpectrum thee = Spectrum_resample (me, numberOfFrequencies);
-		praat_new (thee.transfer(), my name, L"_", Melder_integer (numberOfFrequencies));
+		praat_new (thee.transfer(), my name, U"_", numberOfFrequencies);
 	}
 END
 
-FORM (Spectrum_compressFrequencyDomain, L"Spectrum: Compress frequency domain", 0)
-	POSITIVE (L"Maximum frequency (Hz)", L"5000.0")
-	INTEGER (L"Interpolation depth", L"50")
-	RADIO (L"Interpolation scale", 1)
-	RADIOBUTTON (L"Linear")
-	RADIOBUTTON (L"Logarithmic")
+FORM (Spectrum_compressFrequencyDomain, U"Spectrum: Compress frequency domain", 0)
+	POSITIVE (U"Maximum frequency (Hz)", U"5000.0")
+	INTEGER (U"Interpolation depth", U"50")
+	RADIO (U"Interpolation scale", 1)
+	RADIOBUTTON (U"Linear")
+	RADIOBUTTON (U"Logarithmic")
 	OK
 DO
-	double maximumFrequency = GET_REAL (L"Maximum frequency");
-	long interpolationDepth = GET_INTEGER (L"Interpolation depth");
-	int freqScale = GET_INTEGER (L"Interpolation scale");
+	double maximumFrequency = GET_REAL (U"Maximum frequency");
+	long interpolationDepth = GET_INTEGER (U"Interpolation depth");
+	int freqScale = GET_INTEGER (U"Interpolation scale");
 	LOOP {
 		iam (Spectrum);
 		autoSpectrum thee = Spectrum_compressFrequencyDomain (me, maximumFrequency, interpolationDepth, freqScale, 1);
-		praat_new (thee.transfer(), my name, L"_", Melder_integer (maximumFrequency));
+		praat_new (thee.transfer(), my name, U"_", (long) floor (maximumFrequency));
 	}
 END
 
@@ -6120,64 +6328,66 @@ END
 DIRECT (Spectrum_to_PowerCepstrum)
 	LOOP {
 		iam (Spectrum);
-		praat_new (Spectrum_to_PowerCepstrum (me), my name);
+		autoPowerCepstrum thee = Spectrum_to_PowerCepstrum (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 DIRECT (Spectrum_to_Cepstrum)
 	LOOP {
 		iam (Spectrum);
-		praat_new (Spectrum_to_Cepstrum (me), my name);
+		autoCepstrum thee = Spectrum_to_Cepstrum (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 /************* SpeechSynthesizer *************************************************/
 
 DIRECT (SpeechSynthesizer_help)
-	Melder_help (L"SpeechSynthesizer");
+	Melder_help (U"SpeechSynthesizer");
 END
 
-FORM (SpeechSynthesizer_create, L"Create SpeechSynthesizer", L"Create SpeechSynthesizer...")
-	long prefVoice = Strings_findString (espeakdata_voices_names, L"English");
+FORM (SpeechSynthesizer_create, U"Create SpeechSynthesizer", U"Create SpeechSynthesizer...")
+	long prefVoice = Strings_findString (espeakdata_voices_names, U"English");
 	if (prefVoice == 0) {
 		prefVoice = 1;
 	}
-	LIST (L"Language", espeakdata_voices_names -> numberOfStrings, (const wchar_t **) espeakdata_voices_names -> strings, prefVoice)
-	long prefVariant = Strings_findString (espeakdata_variants_names, L"default");
-	LIST (L"Voice variant", espeakdata_variants_names -> numberOfStrings,
-		(const wchar_t **) espeakdata_variants_names -> strings, prefVariant)
+	LIST (U"Language", espeakdata_voices_names -> numberOfStrings, (const char32 **) espeakdata_voices_names -> strings, prefVoice)
+	long prefVariant = Strings_findString (espeakdata_variants_names, U"default");
+	LIST (U"Voice variant", espeakdata_variants_names -> numberOfStrings,
+		(const char32 **) espeakdata_variants_names -> strings, prefVariant)
 	OK
 DO
-	long voiceIndex = GET_INTEGER (L"Language");
-	long variantIndex = GET_INTEGER (L"Voice variant"); // default is not in the list!
+	long voiceIndex = GET_INTEGER (U"Language");
+	long variantIndex = GET_INTEGER (U"Voice variant"); // default is not in the list!
 	autoSpeechSynthesizer me = SpeechSynthesizer_create (espeakdata_voices_names -> strings[voiceIndex],
 		espeakdata_variants_names -> strings[variantIndex]);
-    praat_new (me.transfer(),  espeakdata_voices_names -> strings[voiceIndex], L"_",
+    praat_new (me.transfer(),  espeakdata_voices_names -> strings[voiceIndex], U"_",
         espeakdata_variants_names -> strings[variantIndex]);
 END
 
-FORM (SpeechSynthesizer_playText, L"SpeechSynthesizer: Play text", L"SpeechSynthesizer: Play text...")
-	TEXTFIELD (L"Text", L"This is some text.")
+FORM (SpeechSynthesizer_playText, U"SpeechSynthesizer: Play text", U"SpeechSynthesizer: Play text...")
+	TEXTFIELD (U"Text", U"This is some text.")
 	OK
 DO
-	const wchar_t *text = GET_STRING (L"Text");
+	const char32 *text = GET_STRING (U"Text");
 	LOOP {
 		iam (SpeechSynthesizer);
 		SpeechSynthesizer_playText (me, text);
 	}
 END
 
-FORM (SpeechSynthesizer_to_Sound, L"SpeechSynthesizer: To Sound", L"SpeechSynthesizer: To Sound...")
-	TEXTFIELD (L"Text", L"This is some text.")
-	BOOLEAN (L"Create TextGrid with annotations", 0);
+FORM (SpeechSynthesizer_to_Sound, U"SpeechSynthesizer: To Sound", U"SpeechSynthesizer: To Sound...")
+	TEXTFIELD (U"Text", U"This is some text.")
+	BOOLEAN (U"Create TextGrid with annotations", 0);
 	OK
 DO
-	const wchar_t *text = GET_STRING (L"Text");
-	bool createTextGrid = GET_INTEGER (L"Create TextGrid with annotations");
+	const char32 *text = GET_STRING (U"Text");
+	bool createTextGrid = GET_INTEGER (U"Create TextGrid with annotations");
 	LOOP {
 		iam (SpeechSynthesizer);
 		TextGrid tg = 0; Table t = 0;
-		autoSound thee = SpeechSynthesizer_to_Sound (me, text, (createTextGrid ? &tg : NULL), (Melder_debug == -2 ? &t : NULL));
+		autoSound thee = SpeechSynthesizer_to_Sound (me, text, (createTextGrid ? &tg : nullptr), (Melder_debug == -2 ? &t : nullptr));
 		autoTextGrid atg = tg; autoTable atr = t;
 		praat_new (thee.transfer(), my name);
 		if (createTextGrid) {
@@ -6203,16 +6413,16 @@ DIRECT (SpeechSynthesizer_getVoiceVariant)
 	}
 END
 
-FORM (SpeechSynthesizer_setTextInputSettings, L"SpeechSynthesizer: Set text input settings", L"SpeechSynthesizer: Set text input settings...")
-	OPTIONMENU (L"Input text format is", 1)
-	OPTION (L"Text only")
-	OPTION (L"Phoneme codes only")
-	OPTION (L"Mixed with tags")
-	OPTIONMENU (L"Input phoneme codes are", 1)
-	OPTION (L"Kirshenbaum_espeak")
+FORM (SpeechSynthesizer_setTextInputSettings, U"SpeechSynthesizer: Set text input settings", U"SpeechSynthesizer: Set text input settings...")
+	OPTIONMENU (U"Input text format is", 1)
+	OPTION (U"Text only")
+	OPTION (U"Phoneme codes only")
+	OPTION (U"Mixed with tags")
+	OPTIONMENU (U"Input phoneme codes are", 1)
+	OPTION (U"Kirshenbaum_espeak")
 	OK
 DO
-	int inputTextFormat = GET_INTEGER (L"Input text format is");
+	int inputTextFormat = GET_INTEGER (U"Input text format is");
 	int inputPhonemeCoding = SpeechSynthesizer_PHONEMECODINGS_KIRSHENBAUM; //
 	LOOP {
 		iam (SpeechSynthesizer);
@@ -6220,30 +6430,30 @@ DO
 	}
 END
 
-FORM (SpeechSynthesizer_setSpeechOutputSettings, L"SpeechSynthesizer: Set speech output settings", L"SpeechSynthesizer: Set speech output settings...")
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
-	REAL (L"Gap between words (s)", L"0.01")
-	INTEGER (L"Pitch adjustment (0-99)", L"50")
-	INTEGER (L"Pitch range (0-99)", L"50");
-	NATURAL (L"Words per minute (80-450)", L"175");
-	BOOLEAN (L"Estimate rate from data", 1);
-	OPTIONMENU (L"Output phoneme codes are", 2)
-	OPTION (L"Kirshenbaum_espeak")
-	OPTION (L"IPA")
+FORM (SpeechSynthesizer_setSpeechOutputSettings, U"SpeechSynthesizer: Set speech output settings", U"SpeechSynthesizer: Set speech output settings...")
+	POSITIVE (U"Sampling frequency (Hz)", U"44100")
+	REAL (U"Gap between words (s)", U"0.01")
+	INTEGER (U"Pitch adjustment (0-99)", U"50")
+	INTEGER (U"Pitch range (0-99)", U"50");
+	NATURAL (U"Words per minute (80-450)", U"175");
+	BOOLEAN (U"Estimate rate from data", 1);
+	OPTIONMENU (U"Output phoneme codes are", 2)
+	OPTION (U"Kirshenbaum_espeak")
+	OPTION (U"IPA")
 	OK
 DO
-	double samplingFrequency = GET_REAL (L"Sampling frequency");
-	double wordgap = GET_REAL (L"Gap between words");
+	double samplingFrequency = GET_REAL (U"Sampling frequency");
+	double wordgap = GET_REAL (U"Gap between words");
 	if (wordgap < 0) wordgap = 0;
-	double pitchAdjustment = GET_INTEGER (L"Pitch adjustment");
+	long pitchAdjustment = GET_INTEGER (U"Pitch adjustment");   // ppgb: waarom was dit een double?
 	if (pitchAdjustment < 0) pitchAdjustment = 0;
 	if (pitchAdjustment > 99) pitchAdjustment = 99;
-	double pitchRange = GET_INTEGER (L"Pitch range");
+	long pitchRange = GET_INTEGER (U"Pitch range");   // ppgb: waarom was dit een double?
 	if (pitchRange < 0) pitchRange = 0;
 	if (pitchRange > 99) pitchRange = 99;
-	double wordsPerMinute = GET_INTEGER (L"Words per minute");
-	bool estimateWordsPerMinute = GET_INTEGER (L"Estimate rate from data");
-	int outputPhonemeCodes = GET_INTEGER (L"Output phoneme codes are");
+	long wordsPerMinute = GET_INTEGER (U"Words per minute");   // ppgb: waarom was dit een double?
+	bool estimateWordsPerMinute = GET_INTEGER (U"Estimate rate from data");
+	int outputPhonemeCodes = GET_INTEGER (U"Output phoneme codes are");
 
 	LOOP {
 		iam (SpeechSynthesizer);
@@ -6253,17 +6463,17 @@ END
 
 /************* SpeechSynthesizer and TextGrid ************************/
 
-FORM (SpeechSynthesizer_and_TextGrid_to_Sound, L"SpeechSynthesizer & TextGrid: To Sound", 0)
-	NATURAL (L"Tier number", L"1")
-	NATURAL (L"Interval number", L"1")
-	BOOLEAN (L"Create TextGrid with annotations", 0);
+FORM (SpeechSynthesizer_and_TextGrid_to_Sound, U"SpeechSynthesizer & TextGrid: To Sound", 0)
+	NATURAL (U"Tier number", U"1")
+	NATURAL (U"Interval number", U"1")
+	BOOLEAN (U"Create TextGrid with annotations", 0);
 	OK
 DO
-	bool createTextGrid = GET_INTEGER (L"Create TextGrid with annotations");
+	bool createTextGrid = GET_INTEGER (U"Create TextGrid with annotations");
 	SpeechSynthesizer me = FIRST (SpeechSynthesizer);
 	TextGrid thee = FIRST (TextGrid), tg = 0;
-	autoSound him = SpeechSynthesizer_and_TextGrid_to_Sound (me, thee, GET_INTEGER (L"Tier number"),
-		GET_INTEGER (L"Interval number"), (createTextGrid ? &tg : NULL));
+	autoSound him = SpeechSynthesizer_and_TextGrid_to_Sound (me, thee, GET_INTEGER (U"Tier number"),
+		GET_INTEGER (U"Interval number"), (createTextGrid ? &tg : nullptr));
 	autoTextGrid atg = tg;
 	praat_new (him.transfer(), my name);
 	if (createTextGrid) {
@@ -6271,41 +6481,41 @@ DO
 	}
 END
 
-FORM (SpeechSynthesizer_and_Sound_and_TextGrid_align, L"SpeechSynthesizer & Sound & TextGrid: To TextGrid (align)", 0)
-	NATURAL (L"Tier number", L"1")
-	NATURAL (L"From interval number", L"1")
-	NATURAL (L"To interval number", L"1")
-	REAL (L"Silence threshold (dB)", L"-35.0")
-	POSITIVE (L"Minimum silent interval duration (s)", L"0.1")
-	POSITIVE (L"Minimum sounding interval duration (s)", L"0.1")
+FORM (SpeechSynthesizer_and_Sound_and_TextGrid_align, U"SpeechSynthesizer & Sound & TextGrid: To TextGrid (align)", 0)
+	NATURAL (U"Tier number", U"1")
+	NATURAL (U"From interval number", U"1")
+	NATURAL (U"To interval number", U"1")
+	REAL (U"Silence threshold (dB)", U"-35.0")
+	POSITIVE (U"Minimum silent interval duration (s)", U"0.1")
+	POSITIVE (U"Minimum sounding interval duration (s)", U"0.1")
 	OK
 DO
-	double silenceThreshold = GET_REAL (L"Silence threshold");
-	double minSilenceDuration = GET_REAL (L"Minimum silent interval duration");
-	double minSoundingDuration = GET_REAL (L"Minimum sounding interval duration");
+	double silenceThreshold = GET_REAL (U"Silence threshold");
+	double minSilenceDuration = GET_REAL (U"Minimum silent interval duration");
+	double minSoundingDuration = GET_REAL (U"Minimum sounding interval duration");
 	SpeechSynthesizer synth = FIRST (SpeechSynthesizer);
 	Sound s = FIRST (Sound);
 	TextGrid tg = FIRST (TextGrid);
 	autoTextGrid thee = SpeechSynthesizer_and_Sound_and_TextGrid_align (synth, s, tg,
-		GET_INTEGER (L"Tier number"), GET_INTEGER (L"From interval number"),
-		GET_INTEGER (L"To interval number"), silenceThreshold, minSilenceDuration, minSoundingDuration);
-	praat_new (thee.transfer(), s -> name, L"_aligned");
-END
-
-FORM (SpeechSynthesizer_and_Sound_and_TextGrid_align2, L"SpeechSynthesizer & Sound & TextGrid: To TextGrid (align, trim)", 0)
-    NATURAL (L"Tier number", L"1")
-    NATURAL (L"From interval number", L"1")
-    NATURAL (L"To interval number", L"1")
-    REAL (L"Silence threshold (dB)", L"-35.0")
-    POSITIVE (L"Minimum silent interval duration (s)", L"0.1")
-    POSITIVE (L"Minimum sounding interval duration (s)", L"0.1")
-    REAL (L"Silence trim duration (s)", L"0.08")
+		GET_INTEGER (U"Tier number"), GET_INTEGER (U"From interval number"),
+		GET_INTEGER (U"To interval number"), silenceThreshold, minSilenceDuration, minSoundingDuration);
+	praat_new (thee.transfer(), s -> name, U"_aligned");
+END
+
+FORM (SpeechSynthesizer_and_Sound_and_TextGrid_align2, U"SpeechSynthesizer & Sound & TextGrid: To TextGrid (align, trim)", 0)
+    NATURAL (U"Tier number", U"1")
+    NATURAL (U"From interval number", U"1")
+    NATURAL (U"To interval number", U"1")
+    REAL (U"Silence threshold (dB)", U"-35.0")
+    POSITIVE (U"Minimum silent interval duration (s)", U"0.1")
+    POSITIVE (U"Minimum sounding interval duration (s)", U"0.1")
+    REAL (U"Silence trim duration (s)", U"0.08")
     OK
 DO
-    double silenceThreshold = GET_REAL (L"Silence threshold");
-    double minSilenceDuration = GET_REAL (L"Minimum silent interval duration");
-    double minSoundingDuration = GET_REAL (L"Minimum sounding interval duration");
-    double trimDuration = GET_REAL (L"Silence trim duration");
+    double silenceThreshold = GET_REAL (U"Silence threshold");
+    double minSilenceDuration = GET_REAL (U"Minimum silent interval duration");
+    double minSoundingDuration = GET_REAL (U"Minimum sounding interval duration");
+    double trimDuration = GET_REAL (U"Silence trim duration");
     if (trimDuration < 0) {
         trimDuration = 0;
     }
@@ -6313,944 +6523,957 @@ DO
     Sound s = FIRST (Sound);
     TextGrid tg = FIRST (TextGrid);
     autoTextGrid thee = SpeechSynthesizer_and_Sound_and_TextGrid_align2 (synth, s, tg,
-        GET_INTEGER (L"Tier number"), GET_INTEGER (L"From interval number"),
-        GET_INTEGER (L"To interval number"), silenceThreshold, minSilenceDuration, minSoundingDuration, trimDuration);
-    praat_new (thee.transfer(), s -> name, L"_aligned");
+        GET_INTEGER (U"Tier number"), GET_INTEGER (U"From interval number"),
+        GET_INTEGER (U"To interval number"), silenceThreshold, minSilenceDuration, minSoundingDuration, trimDuration);
+    praat_new (thee.transfer(), s -> name, U"_aligned");
 END
 
 /************* Spline *************************************************/
 
-FORM (Spline_drawKnots, L"Spline: Draw knots", 0)
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (Spline_drawKnots, U"Spline: Draw knots", 0)
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	LOOP {
 		iam (Spline);
-		Spline_drawKnots (me, GRAPHICS, GET_REAL (L"Xmin"), GET_REAL (L"Xmax"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Garnish"));
+		Spline_drawKnots (me, GRAPHICS, GET_REAL (U"Xmin"), GET_REAL (U"Xmax"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (Spline_getOrder)
 	LOOP {
 		iam (Spline);
-		Melder_information (Melder_integer (Spline_getOrder (me)));
+		Melder_information (Spline_getOrder (me));
 	}
 END
 
-FORM (Spline_scaleX, L"Spline: Scale x", L"Spline: Scale x...")
-	LABEL (L"", L"New domain")
-	REAL (L"Xmin", L"-1.0")
-	REAL (L"Xmax", L"1.0")
+FORM (Spline_scaleX, U"Spline: Scale x", U"Spline: Scale x...")
+	LABEL (U"", U"New domain")
+	REAL (U"Xmin", U"-1.0")
+	REAL (U"Xmax", U"1.0")
 	OK
 DO
-	double xmin = GET_REAL (L"Xmin"), xmax = GET_REAL (L"Xmax");
+	double xmin = GET_REAL (U"Xmin"), xmax = GET_REAL (U"Xmax");
 	if (xmin >= xmax) {
-		Melder_throw ("Xmin must be smaller than Xmax.");
+		Melder_throw (U"Xmin must be smaller than Xmax.");
 	}
 	LOOP {
 		iam (Spline);
-		praat_new (Spline_scaleX (me, xmin, xmax), my name, L"_scaleX");
+		praat_new (Spline_scaleX (me, xmin, xmax), my name, U"_scaleX");
 	}
 END
 
 /************ SSCP ***************************************************/
 
-DIRECT (SSCP_help) Melder_help (L"SSCP"); END
+DIRECT (SSCP_help) Melder_help (U"SSCP"); END
 
-FORM (SSCP_drawConfidenceEllipse, L"SSCP: Draw confidence ellipse", 0)
-	POSITIVE (L"Confidence level", L"0.95")
-	NATURAL (L"Index for X-axis", L"1")
-	NATURAL (L"Index for Y-axis", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (SSCP_drawConfidenceEllipse, U"SSCP: Draw confidence ellipse", 0)
+	POSITIVE (U"Confidence level", U"0.95")
+	NATURAL (U"Index for X-axis", U"1")
+	NATURAL (U"Index for Y-axis", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (SSCP);
-		SSCP_drawConcentrationEllipse (me, GRAPHICS, GET_REAL (L"Confidence level"), 1,
-		GET_INTEGER (L"Index for X-axis"), GET_INTEGER (L"Index for Y-axis"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"));
+		SSCP_drawConcentrationEllipse (me, GRAPHICS, GET_REAL (U"Confidence level"), 1,
+		GET_INTEGER (U"Index for X-axis"), GET_INTEGER (U"Index for Y-axis"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (SSCP_drawSigmaEllipse, L"SSCP: Draw sigma ellipse", L"SSCP: Draw sigma ellipse...")
-	POSITIVE (L"Number of sigmas", L"1.0")
-	NATURAL (L"Index for X-axis", L"1")
-	NATURAL (L"Index for Y-axis", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (SSCP_drawSigmaEllipse, U"SSCP: Draw sigma ellipse", U"SSCP: Draw sigma ellipse...")
+	POSITIVE (U"Number of sigmas", U"1.0")
+	NATURAL (U"Index for X-axis", U"1")
+	NATURAL (U"Index for Y-axis", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (SSCP);
-		SSCP_drawConcentrationEllipse (me, GRAPHICS, GET_REAL (L"Number of sigmas"), 0,
-		GET_INTEGER (L"Index for X-axis"), GET_INTEGER (L"Index for Y-axis"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"));
+		SSCP_drawConcentrationEllipse (me, GRAPHICS, GET_REAL (U"Number of sigmas"), 0,
+		GET_INTEGER (U"Index for X-axis"), GET_INTEGER (U"Index for Y-axis"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (SSCP_extractCentroid)
 	LOOP {
 		iam (SSCP);
-		praat_new (SSCP_extractCentroid (me), my name, L"_centroid");
+		praat_new (SSCP_extractCentroid (me), my name, U"_centroid");
 	}
 END
 
-FORM (SSCP_getConfidenceEllipseArea, L"SSCP: Get confidence ellipse area", L"SSCP: Get confidence ellipse area...")
-	POSITIVE (L"Confidence level", L"0.95")
-	NATURAL (L"Index for X-axis", L"1")
-	NATURAL (L"Index for Y-axis", L"2")
+FORM (SSCP_getConfidenceEllipseArea, U"SSCP: Get confidence ellipse area", U"SSCP: Get confidence ellipse area...")
+	POSITIVE (U"Confidence level", U"0.95")
+	NATURAL (U"Index for X-axis", U"1")
+	NATURAL (U"Index for Y-axis", U"2")
 	OK
 DO
-	double conf = GET_REAL (L"Confidence level");
-	long d1 = GET_INTEGER (L"Index for X-axis");
-	long d2 = GET_INTEGER (L"Index for Y-axis");
+	double conf = GET_REAL (U"Confidence level");
+	long d1 = GET_INTEGER (U"Index for X-axis");
+	long d2 = GET_INTEGER (U"Index for Y-axis");
 	LOOP {
 		iam (SSCP);
-		Melder_information (Melder_double (SSCP_getConcentrationEllipseArea (me, conf, 1, d1, d2)));
+		Melder_information (SSCP_getConcentrationEllipseArea (me, conf, 1, d1, d2));
 	}
 END
 
-FORM (SSCP_getFractionVariation, L"SSCP: Get fraction variation", L"SSCP: Get fraction variation...")
-	NATURAL (L"From dimension", L"1")
-	NATURAL (L"To dimension", L"1")
+FORM (SSCP_getFractionVariation, U"SSCP: Get fraction variation", U"SSCP: Get fraction variation...")
+	NATURAL (U"From dimension", U"1")
+	NATURAL (U"To dimension", U"1")
 	OK
 DO
 	LOOP {
 		iam (SSCP);
-		Melder_information (Melder_double (SSCP_getFractionVariation (me,
-		GET_INTEGER (L"From dimension"), GET_INTEGER (L"To dimension"))));
+		Melder_information (SSCP_getFractionVariation (me,
+		GET_INTEGER (U"From dimension"), GET_INTEGER (U"To dimension")));
 	}
 END
 
 
-FORM (SSCP_getConcentrationEllipseArea, L"SSCP: Get sigma ellipse area", L"SSCP: Get sigma ellipse area...")
-	POSITIVE (L"Number of sigmas", L"1.0")
-	NATURAL (L"Index for X-axis", L"1")
-	NATURAL (L"Index for Y-axis", L"2")
+FORM (SSCP_getConcentrationEllipseArea, U"SSCP: Get sigma ellipse area", U"SSCP: Get sigma ellipse area...")
+	POSITIVE (U"Number of sigmas", U"1.0")
+	NATURAL (U"Index for X-axis", U"1")
+	NATURAL (U"Index for Y-axis", U"2")
 	OK
 DO
-	double nsigmas = GET_REAL (L"Number of sigmas");
-	long d1 = GET_INTEGER (L"Index for X-axis");
-	long d2 = GET_INTEGER (L"Index for Y-axis");
+	double nsigmas = GET_REAL (U"Number of sigmas");
+	long d1 = GET_INTEGER (U"Index for X-axis");
+	long d2 = GET_INTEGER (U"Index for Y-axis");
 	LOOP {
 		iam (SSCP);
-		Melder_information (Melder_double (SSCP_getConcentrationEllipseArea (me, nsigmas, 0, d1, d2)));
+		Melder_information (SSCP_getConcentrationEllipseArea (me, nsigmas, 0, d1, d2));
 }
 END
 
 DIRECT (SSCP_getDegreesOfFreedom)
 	LOOP {
 		iam (SSCP);
-		Melder_information (Melder_double (SSCP_getDegreesOfFreedom (me)));
+		Melder_information (SSCP_getDegreesOfFreedom (me));
 	}
 END
 
 DIRECT (SSCP_getNumberOfObservations)
 	LOOP {
 		iam (SSCP);
-		Melder_information (Melder_integer (my numberOfObservations));
+		Melder_information ((long) floor (my numberOfObservations));   // ppgb: blijf ik raar vinden
 	}
 END
 
 DIRECT (SSCP_getTotalVariance)
 	LOOP {
 		iam (SSCP);
-		Melder_information (Melder_double (SSCP_getTotalVariance (me)));
+		Melder_information (SSCP_getTotalVariance (me));
 	}
 END
 
-FORM (SSCP_getCentroidElement, L"SSCP: Get centroid element", L"SSCP: Get centroid element")
-	NATURAL (L"Number", L"1")
+FORM (SSCP_getCentroidElement, U"SSCP: Get centroid element", U"SSCP: Get centroid element")
+	NATURAL (U"Number", U"1")
 	OK
 DO
-	long number = GET_INTEGER (L"Number");
+	long number = GET_INTEGER (U"Number");
 	LOOP {
 		iam (SSCP);
 		if (number < 1 || number > my numberOfColumns) {
-			Melder_throw ("\"Number\" must be smaller than ", my numberOfColumns + 1, ".");
+			Melder_throw (U"\"Number\" must be smaller than ", my numberOfColumns + 1, U".");
 		}
-		Melder_information (Melder_double (my centroid[number]));
+		Melder_information (my centroid[number]);
 	}
 END
 
 DIRECT (SSCP_getLnDeterminant)
 	LOOP {
 		iam (SSCP);
-		Melder_information (Melder_double (SSCP_getLnDeterminant (me)));
+		Melder_information (SSCP_getLnDeterminant (me));
 	}
 END
 
-FORM (SSCP_testDiagonality_bartlett, L"SSCP: Get diagonality (bartlett)", L"SSCP: Get diagonality (bartlett)...")
-	NATURAL (L"Number of contraints", L"1")
+FORM (SSCP_testDiagonality_bartlett, U"SSCP: Get diagonality (bartlett)", U"SSCP: Get diagonality (bartlett)...")
+	NATURAL (U"Number of contraints", U"1")
 	OK
 DO
 	double chisq, p;
-	long nc = GET_INTEGER (L"Number of contraints");
+	long nc = GET_INTEGER (U"Number of contraints");
 	LOOP {
 		iam (SSCP);
 		SSCP_testDiagonality_bartlett (me, nc, &chisq, &p);
-		Melder_information (Melder_double (p), L" (=probability for chisq = ", Melder_double (chisq),
-		L" and ndf = ", Melder_integer (my numberOfRows * (my numberOfRows - 1) / 2), L")");
+		Melder_information (p, U" (=probability for chisq = ", chisq,
+		U" and ndf = ", my numberOfRows * (my numberOfRows - 1) / 2, U")");
 	}
 END
 
 DIRECT (SSCP_to_Correlation)
 	LOOP {
 		iam (SSCP);
-		praat_new (SSCP_to_Correlation (me), 0);
+		praat_new (SSCP_to_Correlation (me), U"");
 	}
 END
 
-FORM (SSCP_to_Covariance, L"SSCP: To Covariance", L"SSCP: To Covariance...")
-	NATURAL (L"Number of constraints", L"1")
+FORM (SSCP_to_Covariance, U"SSCP: To Covariance", U"SSCP: To Covariance...")
+	NATURAL (U"Number of constraints", U"1")
 	OK
 DO
-	long noc = GET_INTEGER (L"Number of constraints");
+	long noc = GET_INTEGER (U"Number of constraints");
 	LOOP {
 		iam (SSCP);
-		praat_new (SSCP_to_Covariance (me, noc), 0);
+		praat_new (SSCP_to_Covariance (me, noc), U"");
 	}
 END
 
 DIRECT (SSCP_to_PCA)
 	LOOP {
 		iam (SSCP);
-		praat_new (SSCP_to_PCA (me), 0);
+		praat_new (SSCP_to_PCA (me), U"");
 	}
 END
 
 /******************* Strings ****************************/
 DIRECT (Strings_createFromEspeakVoices)
-	praat_new (NULL, L"voices");
+	praat_new (nullptr, U"voices"); // TODO ??
 END
 
-FORM (Strings_createAsCharacters, L"Strings: Create as characters", 0)
-	SENTENCE (L"Text", L"intention")
+FORM (Strings_createAsCharacters, U"Strings: Create as characters", 0)
+	SENTENCE (U"Text", U"intention")
 	OK
 DO
-	praat_new (Strings_createAsCharacters (GET_STRING (L"Text")), 0);
+	praat_new (Strings_createAsCharacters (GET_STRING (U"Text")), U"");
 END
 
-FORM (Strings_createAsTokens, L"Strings: Create as tokens", 0)
-	SENTENCE (L"Text", L"There are seven tokens in this text")
+FORM (Strings_createAsTokens, U"Strings: Create as tokens", 0)
+	SENTENCE (U"Text", U"There are seven tokens in this text")
 	OK
 DO
-	praat_new (Strings_createAsTokens (GET_STRING (L"Text")), 0);
+	praat_new (Strings_createAsTokens (GET_STRING (U"Text")), U"");
 END
 
 DIRECT (Strings_append)
 	autoCollection set = praat_getSelectedObjects ();
-	praat_new (Strings_append (set.transfer()), L"appended");
+	praat_new (Strings_append (set.transfer()), U"appended");
 END
 
 DIRECT (Strings_to_Categories)
 	LOOP {
 		iam (Strings);
-		praat_new (Strings_to_Categories (me), 0);
+		praat_new (Strings_to_Categories (me), U"");
 	}
 END
 
-FORM (Strings_change, L"Strings: Change", L"Strings: Change")
-	SENTENCE (L"Search", L"a")
-	SENTENCE (L"Replace", L"a")
-	INTEGER (L"Replace limit", L"0 (=unlimited)")
-	RADIO (L"Search and replace are:", 1)
-	RADIOBUTTON (L"Literals")
-	RADIOBUTTON (L"Regular Expressions")
+FORM (Strings_change, U"Strings: Change", U"Strings: Change")
+	SENTENCE (U"Search", U"a")
+	SENTENCE (U"Replace", U"a")
+	INTEGER (U"Replace limit", U"0 (=unlimited)")
+	RADIO (U"Search and replace are:", 1)
+	RADIOBUTTON (U"Literals")
+	RADIOBUTTON (U"Regular Expressions")
 	OK
 DO
 	long nmatches, nstringmatches;
 	LOOP {
 		iam (Strings);
-		praat_new (Strings_change (me, GET_STRING (L"Search"), GET_STRING (L"Replace"),
-		GET_INTEGER (L"Replace limit"), &nmatches, &nstringmatches, GET_INTEGER (L"Search and replace are") - 1), 0);
+		praat_new (Strings_change (me, GET_STRING (U"Search"), GET_STRING (U"Replace"),
+		GET_INTEGER (U"Replace limit"), &nmatches, &nstringmatches, GET_INTEGER (U"Search and replace are") - 1), 0);
 	}
 END
 
-FORM (Strings_extractPart, L"Strings: Extract part", L"")
-	NATURAL (L"From index", L"1")
-	NATURAL (L"To index", L"1")
+FORM (Strings_extractPart, U"Strings: Extract part", U"")
+	NATURAL (U"From index", U"1")
+	NATURAL (U"To index", U"1")
 	OK
 DO
 	LOOP {
 		iam (Strings);
-		praat_new (Strings_extractPart (me, GET_INTEGER (L"From index"), GET_INTEGER (L"To index")), my name, L"_part");
+		praat_new (Strings_extractPart (me, GET_INTEGER (U"From index"), GET_INTEGER (U"To index")), my name, U"_part");
 	}
 END
 
 DIRECT (Strings_to_EditDistanceTable)
-	Strings s1 = NULL, s2 = NULL;
+	Strings s1 = nullptr, s2 = nullptr;
 	LOOP {
 		iam(Strings);
 		(s1 ? s2 : s1) = me;
 	}
-	Melder_assert (s1 != NULL && s2 != NULL);
+	Melder_assert (s1 && s2);
 	autoEditDistanceTable table = EditDistanceTable_create (s1, s2);
-	praat_new (table.transfer(), s1 -> name, L"_", s2 -> name);
+	praat_new (table.transfer(), s1 -> name, U"_", s2 -> name);
 END
 
-FORM (Strings_to_Permutation, L"Strings: To Permutation", L"Strings: To Permutation...")
-	BOOLEAN (L"Sort", 1)
+FORM (Strings_to_Permutation, U"Strings: To Permutation", U"Strings: To Permutation...")
+	BOOLEAN (U"Sort", 1)
 	OK
 DO
 	LOOP {
 		iam (Strings);
-		praat_new (Strings_to_Permutation (me, GET_INTEGER (L"Sort")), my name);
+		praat_new (Strings_to_Permutation (me, GET_INTEGER (U"Sort")), my name);
 	}
 END
 
 DIRECT (Strings_and_Permutation_permuteStrings)
 	Strings me = FIRST (Strings);
 	Permutation p = FIRST (Permutation);
-	praat_new (Strings_and_Permutation_permuteStrings (me, p), my name, L"_", p->name);
+	praat_new (Strings_and_Permutation_permuteStrings (me, p), my name, U"_", p->name);
 END
 
-FORM (SVD_to_TableOfReal, L"SVD: To TableOfReal", L"SVD: To TableOfReal...")
-	NATURAL (L"First component", L"1")
-	INTEGER (L"Last component", L"0 (=all)")
+FORM (SVD_to_TableOfReal, U"SVD: To TableOfReal", U"SVD: To TableOfReal...")
+	NATURAL (U"First component", U"1")
+	INTEGER (U"Last component", U"0 (=all)")
 	OK
 DO
 	LOOP {
 		iam (SVD);
-		praat_new (SVD_to_TableOfReal (me, GET_INTEGER (L"First component"), GET_INTEGER (L"Last component")), my name);
+		praat_new (SVD_to_TableOfReal (me, GET_INTEGER (U"First component"), GET_INTEGER (U"Last component")), my name);
 	}
 END
 
 DIRECT (SVD_extractLeftSingularVectors)
 	LOOP {
 		iam (SVD);
-		praat_new (SVD_extractLeftSingularVectors (me), Thing_getName (me), L"_lsv");
+		praat_new (SVD_extractLeftSingularVectors (me), Thing_getName (me), U"_lsv");
 	}
 END
 
 DIRECT (SVD_extractRightSingularVectors)
 	LOOP {
 		iam (SVD);
-		praat_new (SVD_extractRightSingularVectors (me), Thing_getName (me), L"_rsv");
+		praat_new (SVD_extractRightSingularVectors (me), Thing_getName (me), U"_rsv");
 	}
 END
 
 DIRECT (SVD_extractSingularValues)
 	LOOP {
 		iam (SVD);
-		praat_new (SVD_extractSingularValues (me), Thing_getName (me), L"_sv");
+		praat_new (SVD_extractSingularValues (me), Thing_getName (me), U"_sv");
 	}
 END
 
 /******************* Table ****************************/
 
 DIRECT (Table_createFromPetersonBarneyData)
-	praat_new (Table_createFromPetersonBarneyData (), L"pb");
+	praat_new (Table_createFromPetersonBarneyData (), U"pb");
 END
 
 DIRECT (Table_createFromPolsVanNieropData)
-	praat_new (Table_createFromPolsVanNieropData (), L"pvn");
+	praat_new (Table_createFromPolsVanNieropData (), U"pvn");
 END
 
 DIRECT (Table_createFromWeeninkData)
-	praat_new (Table_createFromWeeninkData (), L"m10w10c10");
+	praat_new (Table_createFromWeeninkData (), U"m10w10c10");
 END
 
-FORM (Table_scatterPlotWhere, L"Table: Scatter plot where", 0)
-	WORD (L"Horizontal column", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0 (= auto)")
-	WORD (L"Vertical column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	WORD (L"Column with marks", L"")
-	NATURAL (L"Font size", L"12")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"Use only data from rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_scatterPlotWhere, U"Table: Scatter plot where", 0)
+	WORD (U"Horizontal column", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0 (= auto)")
+	WORD (U"Vertical column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	WORD (U"Column with marks", U"")
+	NATURAL (U"Font size", U"12")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"Use only data from rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		long markColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column with marks"));
-		autoTable thee = Table_extractRowsWhere (me,  GET_STRING (L"Formula"), interpreter);
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		long markColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column with marks"));
+		autoTable thee = Table_extractRowsWhere (me,  GET_STRING (U"Formula"), interpreter);
 		Table_scatterPlot (thee.peek(), GRAPHICS, xcolumn, ycolumn,
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			markColumn, GET_INTEGER (L"Font size"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			markColumn, GET_INTEGER (U"Font size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Table_scatterPlotMarkWhere, L"Scatter plot where (marks)", 0)
-	WORD (L"Horizontal column", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0 (= auto)")
-	WORD (L"Vertical column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	POSITIVE (L"Mark size (mm)", L"1.0")
-	BOOLEAN (L"Garnish", 1)
-	SENTENCE (L"Mark string (+xo.)", L"+")
-	LABEL (L"", L"Use only data from rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_scatterPlotMarkWhere, U"Scatter plot where (marks)", 0)
+	WORD (U"Horizontal column", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0 (= auto)")
+	WORD (U"Vertical column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	POSITIVE (U"Mark size (mm)", U"1.0")
+	BOOLEAN (U"Garnish", 1)
+	SENTENCE (U"Mark string (+xo.)", U"+")
+	LABEL (U"", U"Use only data from rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		autoTable thee = Table_extractRowsWhere (me,  GET_STRING (L"Formula"), interpreter);
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		autoTable thee = Table_extractRowsWhere (me,  GET_STRING (U"Formula"), interpreter);
 		Table_scatterPlot_mark (thee.peek(), GRAPHICS, xcolumn, ycolumn,
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_REAL (L"Mark size"), GET_STRING (L"Mark string"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_REAL (U"Mark size"), GET_STRING (U"Mark string"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Table_barPlotWhere, L"Table: Bar plot where", L"Table: Bar plot where...")
-	SENTENCE (L"Vertical column(s)", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	SENTENCE (L"Column with labels", L"")
-	LABEL (L"", L"Distances are in units of 'bar width'")
-	REAL (L"Distance of first bar from border", L"1.0")
-	REAL (L"Distance between bar groups", L"1.0")
-	REAL (L"Distance between bars within group", L"0.0")
-	SENTENCE (L"Colours", L"Grey")
-	REAL (L"Label text angle (degrees)", L"0.0");
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"Use only data from rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"row >= 1 and row <= 8")
+FORM (Table_barPlotWhere, U"Table: Bar plot where", U"Table: Bar plot where...")
+	SENTENCE (U"Vertical column(s)", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	SENTENCE (U"Column with labels", U"")
+	LABEL (U"", U"Distances are in units of 'bar width'")
+	REAL (U"Distance of first bar from border", U"1.0")
+	REAL (U"Distance between bar groups", U"1.0")
+	REAL (U"Distance between bars within group", U"0.0")
+	SENTENCE (U"Colours", U"Grey")
+	REAL (U"Label text angle (degrees)", U"0.0");
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"Use only data from rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"row >= 1 and row <= 8")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		Table_barPlotWhere (me, GRAPHICS, GET_STRING (L"Vertical column"), GET_REAL (L"left Vertical range"), 
-			GET_REAL (L"right Vertical range"), GET_STRING (L"Column with labels"),
-			GET_REAL (L"Distance of first bar from border"), GET_REAL (L"Distance between bars within group"), GET_REAL (L"Distance between bar groups"),
-			GET_STRING (L"Colours"),GET_REAL (L"Label text angle"), GET_INTEGER (L"Garnish"), GET_STRING (L"Formula"), interpreter);
+		Table_barPlotWhere (me, GRAPHICS, GET_STRING (U"Vertical column"), GET_REAL (U"left Vertical range"), 
+			GET_REAL (U"right Vertical range"), GET_STRING (U"Column with labels"),
+			GET_REAL (U"Distance of first bar from border"), GET_REAL (U"Distance between bars within group"), GET_REAL (U"Distance between bar groups"),
+			GET_STRING (U"Colours"),GET_REAL (U"Label text angle"), GET_INTEGER (U"Garnish"), GET_STRING (U"Formula"), interpreter);
 	}
 END
 
-FORM (Table_LineGraphWhere, L"Table: Line graph where", L"Table: Line graph where...")
-	SENTENCE (L"Vertical column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	SENTENCE (L"Horizonal column", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0 (= auto)")
-	WORD (L"Text", L"+")
-	REAL (L"Label text angle (degrees)", L"0.0");
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"Use only data from rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; (= everything)")
+FORM (Table_LineGraphWhere, U"Table: Line graph where", U"Table: Line graph where...")
+	SENTENCE (U"Vertical column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	SENTENCE (U"Horizonal column", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0 (= auto)")
+	WORD (U"Text", U"+")
+	REAL (U"Label text angle (degrees)", U"0.0");
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"Use only data from rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; (= everything)")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		long xcolumn = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Horizonal column"));
-		Table_lineGraphWhere (me, GRAPHICS, xcolumn, GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			ycolumn, GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), 
-			GET_STRING (L"Text"), GET_REAL (L"Label text angle"),
-		  	GET_INTEGER (L"Garnish"), GET_STRING (L"Formula"), interpreter);
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		long xcolumn = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Horizonal column"));
+		Table_lineGraphWhere (me, GRAPHICS, xcolumn, GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			ycolumn, GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), 
+			GET_STRING (U"Text"), GET_REAL (U"Label text angle"),
+		  	GET_INTEGER (U"Garnish"), GET_STRING (U"Formula"), interpreter);
 	}
 END
 
-FORM (Table_boxPlots, L"Table: Box plots", 0)
-	WORD (L"Data columns", L"")
-	WORD (L"Factor column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1);
+FORM (Table_boxPlots, U"Table: Box plots", 0)
+	WORD (U"Data columns", U"")
+	WORD (U"Factor column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1);
 	OK
 DO
 	autoPraatPicture picture;
-	double ymin = GET_REAL (L"left Vertical range");
-	double ymax = GET_REAL (L"right Vertical range");
-	int garnish = GET_INTEGER (L"Garnish");
+	double ymin = GET_REAL (U"left Vertical range");
+	double ymax = GET_REAL (U"right Vertical range");
+	int garnish = GET_INTEGER (U"Garnish");
 	LOOP {
 		iam (Table);
-		long factorColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Factor column"));
-		Table_boxPlotsWhere (me, GRAPHICS, GET_STRING (L"Data columns"), factorColumn, ymin, ymax, garnish, L"1", interpreter);
+		long factorColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Factor column"));
+		Table_boxPlotsWhere (me, GRAPHICS, GET_STRING (U"Data columns"), factorColumn, ymin, ymax, garnish, U"1", interpreter);
 	}
 END
 
-FORM (Table_boxPlotsWhere, L"Table: Box plots where", L"Table: Box plots where...")
-	SENTENCE (L"Data columns", L"")
-	WORD (L"Factor column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1);
-	LABEL (L"", L"Use only data in rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_boxPlotsWhere, U"Table: Box plots where", U"Table: Box plots where...")
+	SENTENCE (U"Data columns", U"")
+	WORD (U"Factor column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1);
+	LABEL (U"", U"Use only data in rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
 	autoPraatPicture picture;
-	double ymin = GET_REAL (L"left Vertical range");
-	double ymax = GET_REAL (L"right Vertical range");
-	int garnish = GET_INTEGER (L"Garnish");
-	wchar_t *dataColumns = GET_STRING (L"Data columns");
+	double ymin = GET_REAL (U"left Vertical range");
+	double ymax = GET_REAL (U"right Vertical range");
+	int garnish = GET_INTEGER (U"Garnish");
+	char32 *dataColumns = GET_STRING (U"Data columns");
 	LOOP {
 		iam (Table);
-		long factorColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Factor column"));
-		Table_boxPlotsWhere (me, GRAPHICS, dataColumns, factorColumn, ymin, ymax, garnish, GET_STRING (L"Formula"), interpreter);
+		long factorColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Factor column"));
+		Table_boxPlotsWhere (me, GRAPHICS, dataColumns, factorColumn, ymin, ymax, garnish, GET_STRING (U"Formula"), interpreter);
 	}
 END
 
-FORM (Table_drawEllipseWhere, L"Draw ellipse (standard deviation)", 0)
-	WORD (L"Horizontal column", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0 (= auto)")
-	WORD (L"Vertical column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	POSITIVE (L"Number of sigmas", L"2.0")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"Use only data in rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_drawEllipseWhere, U"Draw ellipse (standard deviation)", 0)
+	WORD (U"Horizontal column", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0 (= auto)")
+	WORD (U"Vertical column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	POSITIVE (U"Number of sigmas", U"2.0")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"Use only data in rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		autoTable thee = Table_extractRowsWhere (me, GET_STRING (L"Formula"), interpreter);
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		autoTable thee = Table_extractRowsWhere (me, GET_STRING (U"Formula"), interpreter);
 		Table_drawEllipse_e (thee.peek(), GRAPHICS, xcolumn, ycolumn,
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_REAL (L"Number of sigmas"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_REAL (U"Number of sigmas"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Table_drawEllipses, L"Table: Draw ellipses", 0)
-	WORD (L"Horizontal column", L"F2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0 (= auto)")
-	WORD (L"Vertical column", L"F1")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	WORD (L"Factor column", L"Vowel")
-	POSITIVE (L"Number of sigmas", L"1.0")
-	NATURAL (L"Font size", L"12")
-	BOOLEAN (L"Garnish", 1)
+FORM (Table_drawEllipses, U"Table: Draw ellipses", 0)
+	WORD (U"Horizontal column", U"F2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0 (= auto)")
+	WORD (U"Vertical column", U"F1")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	WORD (U"Factor column", U"Vowel")
+	POSITIVE (U"Number of sigmas", U"1.0")
+	NATURAL (U"Font size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		long factorcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Factor column"));
-		Table_drawEllipsesWhere (me, GRAPHICS, xcolumn, ycolumn, factorcolumn, GET_REAL (L"left Horizontal range"), 
-			 GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			 GET_REAL (L"Number of sigmas"), GET_INTEGER (L"Font size"), GET_INTEGER (L"Garnish"), L"1", interpreter);
-	}
-END
-
-FORM (Table_drawEllipsesWhere, L"Table: Draw ellipses where", 0)
-	WORD (L"Horizontal column", L"F2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0 (= auto)")
-	WORD (L"Vertical column", L"F1")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	WORD (L"Factor column", L"Vowel")
-	POSITIVE (L"Number of sigmas", L"1.0")
-	NATURAL (L"Font size", L"12")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"Use only data in rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		long factorcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Factor column"));
+		Table_drawEllipsesWhere (me, GRAPHICS, xcolumn, ycolumn, factorcolumn, GET_REAL (U"left Horizontal range"), 
+			 GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			 GET_REAL (U"Number of sigmas"), GET_INTEGER (U"Font size"), GET_INTEGER (U"Garnish"), U"1", interpreter);
+	}
+END
+
+FORM (Table_drawEllipsesWhere, U"Table: Draw ellipses where", 0)
+	WORD (U"Horizontal column", U"F2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0 (= auto)")
+	WORD (U"Vertical column", U"F1")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	WORD (U"Factor column", U"Vowel")
+	POSITIVE (U"Number of sigmas", U"1.0")
+	NATURAL (U"Font size", U"12")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"Use only data in rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		long factorcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Factor column"));
-		Table_drawEllipsesWhere (me, GRAPHICS, xcolumn, ycolumn, factorcolumn, GET_REAL (L"left Horizontal range"), 
-			 GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			 GET_REAL (L"Number of sigmas"), GET_INTEGER (L"Font size"), GET_INTEGER (L"Garnish"), GET_STRING (L"Formula"), interpreter);
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		long factorcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Factor column"));
+		Table_drawEllipsesWhere (me, GRAPHICS, xcolumn, ycolumn, factorcolumn, GET_REAL (U"left Horizontal range"), 
+			 GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			 GET_REAL (U"Number of sigmas"), GET_INTEGER (U"Font size"), GET_INTEGER (U"Garnish"), GET_STRING (U"Formula"), interpreter);
 	}
 END
 
 
-FORM (Table_normalProbabilityPlot, L"Table: Normal probability plot", L"Table: Normal probability plot...")
-	WORD (L"Column", L"")
-	NATURAL (L"Number of quantiles", L"100")
-	REAL (L"Number of sigmas", L"0.0")
-	NATURAL (L"Label size", L"12")
-	WORD (L"Label", L"+")
-	BOOLEAN (L"Garnish", 1);
+FORM (Table_normalProbabilityPlot, U"Table: Normal probability plot", U"Table: Normal probability plot...")
+	WORD (U"Column", U"")
+	NATURAL (U"Number of quantiles", U"100")
+	REAL (U"Number of sigmas", U"0.0")
+	NATURAL (U"Label size", U"12")
+	WORD (U"Label", U"+")
+	BOOLEAN (U"Garnish", 1);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column"));
+		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column"));
 		Table_normalProbabilityPlot (me, GRAPHICS, column,
-			GET_INTEGER (L"Number of quantiles"), GET_REAL (L"Number of sigmas"),
-			GET_INTEGER (L"Label size"), GET_STRING (L"Label"), GET_INTEGER (L"Garnish"));
+			GET_INTEGER (U"Number of quantiles"), GET_REAL (U"Number of sigmas"),
+			GET_INTEGER (U"Label size"), GET_STRING (U"Label"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Table_normalProbabilityPlotWhere, L"Table: Normal probability plot where", L"Table: Normal probability plot...")
-	WORD (L"Column", L"")
-	NATURAL (L"Number of quantiles", L"100")
-	REAL (L"Number of sigmas", L"0.0")
-	NATURAL (L"Label size", L"12")
-	WORD (L"Label", L"+")
-	BOOLEAN (L"Garnish", 1);
-	LABEL (L"", L"Use only data in rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_normalProbabilityPlotWhere, U"Table: Normal probability plot where", U"Table: Normal probability plot...")
+	WORD (U"Column", U"")
+	NATURAL (U"Number of quantiles", U"100")
+	REAL (U"Number of sigmas", U"0.0")
+	NATURAL (U"Label size", U"12")
+	WORD (U"Label", U"+")
+	BOOLEAN (U"Garnish", 1);
+	LABEL (U"", U"Use only data in rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column"));
-		autoTable thee = Table_extractRowsWhere (me, GET_STRING (L"Formula"), interpreter);
+		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column"));
+		autoTable thee = Table_extractRowsWhere (me, GET_STRING (U"Formula"), interpreter);
 		Table_normalProbabilityPlot (thee.peek(), GRAPHICS, column,
-			GET_INTEGER (L"Number of quantiles"), GET_REAL (L"Number of sigmas"),
-			GET_INTEGER (L"Label size"), GET_STRING (L"Label"), GET_INTEGER (L"Garnish"));
+			GET_INTEGER (U"Number of quantiles"), GET_REAL (U"Number of sigmas"),
+			GET_INTEGER (U"Label size"), GET_STRING (U"Label"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Table_quantileQuantilePlot, L"Table: Quantile-quantile plot", L"Table: Quantile-quantile plot...")
-	WORD (L"Horizontal axis column", L"")
-	WORD (L"Vertical axis column", L"")
-	NATURAL (L"Number of quantiles", L"100")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	NATURAL (L"Label size", L"12")
-	WORD (L"Label", L"+")
-	BOOLEAN (L"Garnish", 1);
+FORM (Table_quantileQuantilePlot, U"Table: Quantile-quantile plot", U"Table: Quantile-quantile plot...")
+	WORD (U"Horizontal axis column", U"")
+	WORD (U"Vertical axis column", U"")
+	NATURAL (U"Number of quantiles", U"100")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	NATURAL (U"Label size", U"12")
+	WORD (U"Label", U"+")
+	BOOLEAN (U"Garnish", 1);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal axis column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical axis column"));
-		Table_quantileQuantilePlot (me, GRAPHICS, xcolumn, ycolumn, GET_INTEGER (L"Number of quantiles"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Label size"), GET_STRING (L"Label"), GET_INTEGER (L"Garnish"));
-	}
-END
-
-FORM (Table_quantileQuantilePlot_betweenLevels, L"Table: Quantile-quantile plot (between levels)", L"Table: Quantile-quantile plot...")
-	WORD (L"Data column", L"")
-	WORD (L"Factor column", L"")
-	WORD (L"Horizontal factor level", L"")
-	WORD (L"Vertical factor level", L"")
-	NATURAL (L"Number of quantiles", L"100")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	NATURAL (L"Label size", L"12")
-	WORD (L"Label", L"+")
-	BOOLEAN (L"Garnish", 1);
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal axis column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical axis column"));
+		Table_quantileQuantilePlot (me, GRAPHICS, xcolumn, ycolumn, GET_INTEGER (U"Number of quantiles"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Label size"), GET_STRING (U"Label"), GET_INTEGER (U"Garnish"));
+	}
+END
+
+FORM (Table_quantileQuantilePlot_betweenLevels, U"Table: Quantile-quantile plot (between levels)", U"Table: Quantile-quantile plot...")
+	WORD (U"Data column", U"")
+	WORD (U"Factor column", U"")
+	WORD (U"Horizontal factor level", U"")
+	WORD (U"Vertical factor level", U"")
+	NATURAL (U"Number of quantiles", U"100")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	NATURAL (U"Label size", U"12")
+	WORD (U"Label", U"+")
+	BOOLEAN (U"Garnish", 1);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long dataColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Data column"));
-		long factorColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Factor column"));
-		wchar_t *xLevel = GET_STRING (L"Horizontal factor level");
-		wchar_t *yLevel = GET_STRING (L"Vertical factor level");
+		long dataColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Data column"));
+		long factorColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Factor column"));
+		char32 *xLevel = GET_STRING (U"Horizontal factor level");
+		char32 *yLevel = GET_STRING (U"Vertical factor level");
 		Table_quantileQuantilePlot_betweenLevels (me, GRAPHICS, dataColumn, factorColumn, xLevel, yLevel,
-			GET_INTEGER (L"Number of quantiles"), GET_REAL (L"left Horizontal range"),
-			GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"),
-			GET_REAL (L"right Vertical range"), GET_INTEGER (L"Label size"), GET_STRING (L"Label"),
-			GET_INTEGER (L"Garnish"));
+			GET_INTEGER (U"Number of quantiles"), GET_REAL (U"left Horizontal range"),
+			GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"),
+			GET_REAL (U"right Vertical range"), GET_INTEGER (U"Label size"), GET_STRING (U"Label"),
+			GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Table_lagPlot, L"Table: lag plot",0)
-	WORD (L"Data column", L"errors")
-	NATURAL (L"Lag", L"1")
-	REAL (L"left Horizontal and vertical range", L"0.0")
-	REAL (L"right Horizontal and vertical range", L"0.0")
-	NATURAL (L"Label size", L"12")
-	WORD (L"Label", L"+")
-	BOOLEAN (L"Garnish", 1);
+FORM (Table_lagPlot, U"Table: lag plot",0)
+	WORD (U"Data column", U"errors")
+	NATURAL (U"Lag", U"1")
+	REAL (U"left Horizontal and vertical range", U"0.0")
+	REAL (U"right Horizontal and vertical range", U"0.0")
+	NATURAL (U"Label size", U"12")
+	WORD (U"Label", U"+")
+	BOOLEAN (U"Garnish", 1);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long dataColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Data column"));
-		Table_lagPlotWhere (me, GRAPHICS, dataColumn, GET_INTEGER (L"Lag"), GET_REAL (L"left Horizontal and vertical range"),
-			GET_REAL (L"right Horizontal and vertical range"), GET_STRING (L"Label"), GET_INTEGER (L"Label size"),
-			GET_INTEGER (L"Garnish"), L"1", interpreter);
+		long dataColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Data column"));
+		Table_lagPlotWhere (me, GRAPHICS, dataColumn, GET_INTEGER (U"Lag"), GET_REAL (U"left Horizontal and vertical range"),
+			GET_REAL (U"right Horizontal and vertical range"), GET_STRING (U"Label"), GET_INTEGER (U"Label size"),
+			GET_INTEGER (U"Garnish"), U"1", interpreter);
 	}
 END
 
 
-FORM (Table_lagPlotWhere, L"Table: lag plot where",0)
-	WORD (L"Data column", L"errors")
-	NATURAL (L"Lag", L"1")
-	REAL (L"left Horizontal and vertical range", L"0.0")
-	REAL (L"right Horizontal and vertical range", L"0.0")
-	NATURAL (L"Label size", L"12")
-	WORD (L"Label", L"+")
-	BOOLEAN (L"Garnish", 1);
-	LABEL (L"", L"Use only data in rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_lagPlotWhere, U"Table: lag plot where",0)
+	WORD (U"Data column", U"errors")
+	NATURAL (U"Lag", U"1")
+	REAL (U"left Horizontal and vertical range", U"0.0")
+	REAL (U"right Horizontal and vertical range", U"0.0")
+	NATURAL (U"Label size", U"12")
+	WORD (U"Label", U"+")
+	BOOLEAN (U"Garnish", 1);
+	LABEL (U"", U"Use only data in rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long dataColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Data column"));
-		Table_lagPlotWhere (me, GRAPHICS, dataColumn, GET_INTEGER (L"Lag"), GET_REAL (L"left Horizontal and vertical range"),
-			GET_REAL (L"right Horizontal and vertical range"), GET_STRING (L"Label"), GET_INTEGER (L"Label size"),
-			GET_INTEGER (L"Garnish"), GET_STRING (L"Formula"), interpreter);
+		long dataColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Data column"));
+		Table_lagPlotWhere (me, GRAPHICS, dataColumn, GET_INTEGER (U"Lag"), GET_REAL (U"left Horizontal and vertical range"),
+			GET_REAL (U"right Horizontal and vertical range"), GET_STRING (U"Label"), GET_INTEGER (U"Label size"),
+			GET_INTEGER (U"Garnish"), GET_STRING (U"Formula"), interpreter);
 	}
 END
 
-FORM (Table_distributionPlot, L"Table: Distribution plot", 0)
-	WORD (L"Data column", L"data")
-	REAL (L"Minimum value", L"0.0")
-	REAL (L"Maximum value", L"0.0")
-	LABEL (L"", L"Display of the distribution")
-	NATURAL (L"Number of bins", L"10")
-	REAL (L"Minimum frequency", L"0.0")
-	REAL (L"Maximum frequency", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (Table_distributionPlot, U"Table: Distribution plot", 0)
+	WORD (U"Data column", U"data")
+	REAL (U"Minimum value", U"0.0")
+	REAL (U"Maximum value", U"0.0")
+	LABEL (U"", U"Display of the distribution")
+	NATURAL (U"Number of bins", U"10")
+	REAL (U"Minimum frequency", U"0.0")
+	REAL (U"Maximum frequency", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long dataColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Data column"));
-		Table_distributionPlotWhere (me, GRAPHICS, dataColumn, GET_REAL (L"Minimum value"), GET_REAL (L"Maximum value"),
-			GET_INTEGER (L"Number of bins"), GET_REAL (L"Minimum frequency"), GET_REAL (L"Maximum frequency"), 
-			GET_INTEGER (L"Garnish"), L"1", interpreter);
+		long dataColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Data column"));
+		Table_distributionPlotWhere (me, GRAPHICS, dataColumn, GET_REAL (U"Minimum value"), GET_REAL (U"Maximum value"),
+			GET_INTEGER (U"Number of bins"), GET_REAL (U"Minimum frequency"), GET_REAL (U"Maximum frequency"), 
+			GET_INTEGER (U"Garnish"), U"1", interpreter);
 	}
 END
 
-FORM (Table_distributionPlotWhere, L"Table: Distribution plot where", 0)
-	WORD (L"Data column", L"data")
-	REAL (L"Minimum value", L"0.0")
-	REAL (L"Maximum value", L"0.0")
-	LABEL (L"", L"Display of the distribution")
-	NATURAL (L"Number of bins", L"10")
-	REAL (L"Minimum frequency", L"0.0")
-	REAL (L"Maximum frequency", L"0.0")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"Use only data in rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_distributionPlotWhere, U"Table: Distribution plot where", 0)
+	WORD (U"Data column", U"data")
+	REAL (U"Minimum value", U"0.0")
+	REAL (U"Maximum value", U"0.0")
+	LABEL (U"", U"Display of the distribution")
+	NATURAL (U"Number of bins", U"10")
+	REAL (U"Minimum frequency", U"0.0")
+	REAL (U"Maximum frequency", U"0.0")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"Use only data in rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long dataColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Data column"));
-		Table_distributionPlotWhere (me, GRAPHICS, dataColumn, GET_REAL (L"Minimum value"), GET_REAL (L"Maximum value"),
-			GET_INTEGER (L"Number of bins"), GET_REAL (L"Minimum frequency"), GET_REAL (L"Maximum frequency"), GET_INTEGER (L"Garnish"),
-			GET_STRING (L"Formula"), interpreter);
+		long dataColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Data column"));
+		Table_distributionPlotWhere (me, GRAPHICS, dataColumn, GET_REAL (U"Minimum value"), GET_REAL (U"Maximum value"),
+			GET_INTEGER (U"Number of bins"), GET_REAL (U"Minimum frequency"), GET_REAL (U"Maximum frequency"), GET_INTEGER (U"Garnish"),
+			GET_STRING (U"Formula"), interpreter);
 	}
 END
 
-FORM (Table_horizontalErrorBarsPlot, L"Table: Horizontal error bars plot", L"Table: Horizontal error bars plot...")
-	WORD (L"Horizontal column", L"x")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	WORD (L"Vertical column", L"y")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	WORD (L"Lower error value column", L"")
-	WORD (L"Upper error value column", L"")
-	REAL (L"Bar size (mm)", L"1.0")
-	BOOLEAN (L"Garnish", 1);
+FORM (Table_horizontalErrorBarsPlot, U"Table: Horizontal error bars plot", U"Table: Horizontal error bars plot...")
+	WORD (U"Horizontal column", U"x")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	WORD (U"Vertical column", U"y")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	WORD (U"Lower error value column", U"")
+	WORD (U"Upper error value column", U"")
+	REAL (U"Bar size (mm)", U"1.0")
+	BOOLEAN (U"Garnish", 1);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		long xl = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Lower error value column"));
-		long xu = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Upper error value column"));
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		long xl = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Lower error value column"));
+		long xu = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Upper error value column"));
 		
 		Table_horizontalErrorBarsPlotWhere (me, GRAPHICS, xcolumn, ycolumn,
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			xl, xu, GET_REAL (L"Bar size"), GET_INTEGER (L"Garnish"), L"1", interpreter);
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			xl, xu, GET_REAL (U"Bar size"), GET_INTEGER (U"Garnish"), U"1", interpreter);
 	}
 END
 
-FORM (Table_horizontalErrorBarsPlotWhere, L"Table: Horizontal error bars plot where", L"Table: Horizontal error bars plot where...")
-	WORD (L"Horizontal column", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	WORD (L"Vertical column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	WORD (L"Lower error value column", L"")
-	WORD (L"Upper error value column", L"")
-	REAL (L"Bar size (mm)", L"1.0")
-	BOOLEAN (L"Garnish", 1);
-	LABEL (L"", L"Use only data in rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_horizontalErrorBarsPlotWhere, U"Table: Horizontal error bars plot where", U"Table: Horizontal error bars plot where...")
+	WORD (U"Horizontal column", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	WORD (U"Vertical column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	WORD (U"Lower error value column", U"")
+	WORD (U"Upper error value column", U"")
+	REAL (U"Bar size (mm)", U"1.0")
+	BOOLEAN (U"Garnish", 1);
+	LABEL (U"", U"Use only data in rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		long xl = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Lower error value column"));
-		long xu = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Upper error value column"));
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		long xl = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Lower error value column"));
+		long xu = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Upper error value column"));
 		
 		Table_horizontalErrorBarsPlotWhere (me, GRAPHICS, xcolumn, ycolumn,
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			xl, xu, GET_REAL (L"Bar size"), GET_INTEGER (L"Garnish"), GET_STRING (L"Formula"), interpreter);
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			xl, xu, GET_REAL (U"Bar size"), GET_INTEGER (U"Garnish"), GET_STRING (U"Formula"), interpreter);
 	}
 END
 
-FORM (Table_verticalErrorBarsPlot, L"Table: Vertical error bars plot", L"Table: Vertical error bars plot...")
-	WORD (L"Horizontal column", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	WORD (L"Vertical column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	WORD (L"Lower error value column", L"")
-	WORD (L"Upper error value column", L"")
-	REAL (L"Bar size (mm)", L"1.0")
-	BOOLEAN (L"Garnish", 1);
+FORM (Table_verticalErrorBarsPlot, U"Table: Vertical error bars plot", U"Table: Vertical error bars plot...")
+	WORD (U"Horizontal column", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	WORD (U"Vertical column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	WORD (U"Lower error value column", U"")
+	WORD (U"Upper error value column", U"")
+	REAL (U"Bar size (mm)", U"1.0")
+	BOOLEAN (U"Garnish", 1);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		long yl = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Lower error value column"));
-		long yu = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Upper error value column"));
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		long yl = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Lower error value column"));
+		long yu = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Upper error value column"));
 		
 		Table_verticalErrorBarsPlotWhere (me, GRAPHICS, xcolumn, ycolumn,
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			yl, yu, GET_REAL (L"Bar size"), GET_INTEGER (L"Garnish"), L"1", interpreter);
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			yl, yu, GET_REAL (U"Bar size"), GET_INTEGER (U"Garnish"), U"1", interpreter);
 	}
 END
 
-FORM (Table_verticalErrorBarsPlotWhere, L"Table: Vertical error bars plot where", L"Table: Vertical error bars plot where...")
-	WORD (L"Horizontal column", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	WORD (L"Vertical column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	WORD (L"Lower error value column", L"")
-	WORD (L"Upper error value column", L"")
-	REAL (L"Bar size (mm)", L"1.0")
-	BOOLEAN (L"Garnish", 1);
-	LABEL (L"", L"Use only data in rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_verticalErrorBarsPlotWhere, U"Table: Vertical error bars plot where", U"Table: Vertical error bars plot where...")
+	WORD (U"Horizontal column", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	WORD (U"Vertical column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	WORD (U"Lower error value column", U"")
+	WORD (U"Upper error value column", U"")
+	REAL (U"Bar size (mm)", U"1.0")
+	BOOLEAN (U"Garnish", 1);
+	LABEL (U"", U"Use only data in rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		long yl = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Lower error value column"));
-		long yu = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Upper error value column"));
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		long yl = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Lower error value column"));
+		long yu = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Upper error value column"));
 		
 		Table_verticalErrorBarsPlotWhere (me, GRAPHICS, xcolumn, ycolumn,
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			yl, yu, GET_REAL (L"Bar size"), GET_INTEGER (L"Garnish"), GET_STRING (L"Formula"), interpreter);
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			yl, yu, GET_REAL (U"Bar size"), GET_INTEGER (U"Garnish"), GET_STRING (U"Formula"), interpreter);
 	}
 END
 
-FORM (Table_extractRowsWhere, L"Table: Extract rows where", 0)
-	LABEL (L"", L"Extract rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_extractRowsWhere, U"Table: Extract rows where", 0)
+	LABEL (U"", U"Extract rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
 	LOOP {
 		iam (Table);
-		autoTable thee = Table_extractRowsWhere (me, GET_STRING (L"Formula"), interpreter);
-		praat_new (thee.transfer(), my name, L"_formula");
+		autoTable thee = Table_extractRowsWhere (me, GET_STRING (U"Formula"), interpreter);
+		praat_new (thee.transfer(), my name, U"_formula");
 	}
 END
 
-FORM (Table_extractRowsMahalanobisWhere, L"Table: Extract rows where (mahalanobis)", 0)
-	SENTENCE (L"Extract all rows where columns...", L"")
-	RADIO_ENUM (L"...have a mahalanobis distance...", kMelder_number, GREATER_THAN)
-	REAL (L"...the number", L"2.0")
-	WORD (L"Factor column", L"")
-	LABEL (L"", L"Process only rows where the following condition holds:")
-	TEXTFIELD (L"Formula", L"1; self$[\"gender\"]=\"male\"")
+FORM (Table_extractRowsMahalanobisWhere, U"Table: Extract rows where (mahalanobis)", 0)
+	SENTENCE (U"Extract all rows where columns...", U"")
+	RADIO_ENUM (U"...have a mahalanobis distance...", kMelder_number, GREATER_THAN)
+	REAL (U"...the number", U"2.0")
+	WORD (U"Factor column", U"")
+	LABEL (U"", U"Process only rows where the following condition holds:")
+	TEXTFIELD (U"Formula", U"1; self$[\"gender\"]=\"male\"")
 	OK
 DO
-	double numberOfSigmas = GET_REAL (L"...the number");
+	double numberOfSigmas = GET_REAL (U"...the number");
 	LOOP {
 		iam (Table);
-		autoTable thee = Table_extractMahalanobisWhere(me, GET_STRING (L"Extract all rows where columns..."), 
-		   GET_STRING (L"Factor column"), numberOfSigmas, GET_ENUM (kMelder_number, L"...have a mahalanobis distance..."), 
-		   GET_STRING (L"Formula"), interpreter);
-		praat_new (thee.transfer(), my name, L"_mahalanobis");
+		autoTable thee = Table_extractMahalanobisWhere(me, GET_STRING (U"Extract all rows where columns..."), 
+		   GET_STRING (U"Factor column"), numberOfSigmas, GET_ENUM (kMelder_number, U"...have a mahalanobis distance..."),
+		   GET_STRING (U"Formula"), interpreter);
+		praat_new (thee.transfer(), my name, U"_mahalanobis");
+	}
+END
+
+FORM (Table_extractColumnRanges, U"Table: Extract column ranges", 0)
+	LABEL (U"", U"Create a new Table from the following columns:")
+	TEXTFIELD (U"Ranges", U"1 2")
+	LABEL (U"", U"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
+	OK
+DO
+	LOOP {
+		iam (Table);
+		autoTable thee = Table_extractColumnRanges (me, GET_STRING (U"Ranges"));
+		praat_new (thee.transfer(), my name, U"_columns");
 	}
 END
 
 /******************* TableOfReal ****************************/
 
 DIRECT (New_CreateIrisDataset)
-	praat_new (TableOfReal_createIrisDataset (), 0);
+	praat_new (TableOfReal_createIrisDataset (), U"");
 END
 
-FORM (TableOfReal_reportMultivariateNormality, L"TableOfReal: Report multivariate normality (BHEP)", L"TableOfReal: Report multivariate normality (BHEP)...")
-	REAL (L"Smoothing parameter", L"0.0")
+FORM (TableOfReal_reportMultivariateNormality, U"TableOfReal: Report multivariate normality (BHEP)", U"TableOfReal: Report multivariate normality (BHEP)...")
+	REAL (U"Smoothing parameter", U"0.0")
 	OK
 DO
-	double h = GET_REAL (L"Smoothing parameter");
+	double h = GET_REAL (U"Smoothing parameter");
 	MelderInfo_open ();
 	LOOP {
 		iam (TableOfReal);
 		double tnb, lnmu, lnvar;
 		double prob = TableOfReal_normalityTest_BHEP (me, &h, &tnb, &lnmu, &lnvar);
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"Baringhaus–Henze–Epps–Pulley normality test:");
-		MelderInfo_writeLine (L"Significance of normality: ", Melder_double (prob));
-		MelderInfo_writeLine (L"BHEP statistic: ", Melder_double (tnb));
-		MelderInfo_writeLine (L"Lognormal mean: ", Melder_double (lnmu));
-		MelderInfo_writeLine (L"Lognormal variance: ", Melder_double (lnvar));
-		MelderInfo_writeLine (L"Smoothing: ", Melder_double (h));
-		MelderInfo_writeLine (L"Sample size: ", Melder_integer (my numberOfRows));
-		MelderInfo_writeLine (L"Number of variables: ", Melder_integer (my numberOfColumns));
+		MelderInfo_writeLine (U"Baringhaus–Henze–Epps–Pulley normality test:");
+		MelderInfo_writeLine (U"Significance of normality: ", prob);
+		MelderInfo_writeLine (U"BHEP statistic: ", tnb);
+		MelderInfo_writeLine (U"Lognormal mean: ", lnmu);
+		MelderInfo_writeLine (U"Lognormal variance: ", lnvar);
+		MelderInfo_writeLine (U"Smoothing: ", h);
+		MelderInfo_writeLine (U"Sample size: ", my numberOfRows);
+		MelderInfo_writeLine (U"Number of variables: ", my numberOfColumns);
 	}
 	MelderInfo_close ();
 END
@@ -7259,7 +7482,7 @@ DIRECT (TableOfReal_and_Permutation_permuteRows)
 	TableOfReal me = FIRST (TableOfReal);
 	Permutation p = FIRST (Permutation);
 	praat_new (TableOfReal_and_Permutation_permuteRows (me, p),
-		my name, L"_", p->name);
+		my name, U"_", p->name);
 END
 
 DIRECT (TableOfReal_to_Permutation_sortRowlabels)
@@ -7271,273 +7494,275 @@ END
 
 DIRECT (TableOfReal_appendColumns)
 	autoCollection set = praat_getSelectedObjects ();
-	praat_new (TableOfReal_appendColumnsMany (set.peek()), L"columns_appended");
+	praat_new (TableOfReal_appendColumnsMany (set.peek()), U"columns_appended");
 END
 
-FORM (TableOfReal_createFromPolsData_50males, L"Create TableOfReal (Pols 1973)", L"Create TableOfReal (Pols 1973)...")
-	BOOLEAN (L"Include formant levels", 0)
+FORM (TableOfReal_createFromPolsData_50males, U"Create TableOfReal (Pols 1973)", U"Create TableOfReal (Pols 1973)...")
+	BOOLEAN (U"Include formant levels", 0)
 	OK
 DO
-	praat_new (TableOfReal_createFromPolsData_50males (GET_INTEGER (L"Include formant levels")), L"pols_50males");
+	praat_new (TableOfReal_createFromPolsData_50males (GET_INTEGER (U"Include formant levels")), U"pols_50males");
 END
 
 DIRECT (Table_createFromEspositoData)
-	praat_new (Table_createFromEspositoData (), L"h1_h2");
+	praat_new (Table_createFromEspositoData (), U"h1_h2");
 END
 
 DIRECT (Table_createFromGanongData)
-	praat_new (Table_createFromGanongData (), L"ganong");
+	praat_new (Table_createFromGanongData (), U"ganong");
 END
 
-FORM (TableOfReal_createFromVanNieropData_25females, L"Create TableOfReal (Van Nierop 1973)...", L"Create TableOfReal (Van Nierop 1973)...")
-	BOOLEAN (L"Include formant levels", 0)
+FORM (TableOfReal_createFromVanNieropData_25females, U"Create TableOfReal (Van Nierop 1973)...", U"Create TableOfReal (Van Nierop 1973)...")
+	BOOLEAN (U"Include formant levels", 0)
 	OK
 DO
-	praat_new (TableOfReal_createFromVanNieropData_25females (GET_INTEGER (L"Include formant levels")), L"vannierop_25females");
+	praat_new (TableOfReal_createFromVanNieropData_25females (GET_INTEGER (U"Include formant levels")), U"vannierop_25females");
 END
 
-FORM (TableOfReal_createFromWeeninkData, L"Create TableOfReal (Weenink 1985)...", L"Create TableOfReal (Weenink 1985)...")
-	RADIO (L"Speakers group", 1)
-	RADIOBUTTON (L"Men")
-	RADIOBUTTON (L"Women")
-	RADIOBUTTON (L"Children")
+FORM (TableOfReal_createFromWeeninkData, U"Create TableOfReal (Weenink 1985)...", U"Create TableOfReal (Weenink 1985)...")
+	RADIO (U"Speakers group", 1)
+	RADIOBUTTON (U"Men")
+	RADIOBUTTON (U"Women")
+	RADIOBUTTON (U"Children")
 	OK
 DO
-	int type = GET_INTEGER (L"Speakers group");
+	int type = GET_INTEGER (U"Speakers group");
 	praat_new (TableOfReal_createFromWeeninkData (type),
-		(type == 1 ? L"m10" : type == 2 ? L"w10" : L"c10"));
-END
-
-FORM (TableOfReal_drawScatterPlot, L"TableOfReal: Draw scatter plot", L"TableOfReal: Draw scatter plot...")
-	LABEL (L"", L"Select the part of the table")
-	NATURAL (L"Horizontal axis column number", L"1")
-	NATURAL (L"Vertical axis column number", L"2")
-	INTEGER (L"left Row number range", L"0")
-	INTEGER (L"right Row number range", L"0")
-	LABEL (L"", L"Select the drawing area limits")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	NATURAL (L"Label size", L"12")
-	BOOLEAN (L"Use row labels", 0)
-	WORD (L"Label", L"+")
-	BOOLEAN (L"Garnish", 1)
+		(type == 1 ? U"m10" : type == 2 ? U"w10" : U"c10"));
+END
+
+FORM (TableOfReal_drawScatterPlot, U"TableOfReal: Draw scatter plot", U"TableOfReal: Draw scatter plot...")
+	LABEL (U"", U"Select the part of the table")
+	NATURAL (U"Horizontal axis column number", U"1")
+	NATURAL (U"Vertical axis column number", U"2")
+	INTEGER (U"left Row number range", U"0")
+	INTEGER (U"right Row number range", U"0")
+	LABEL (U"", U"Select the drawing area limits")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	NATURAL (U"Label size", U"12")
+	BOOLEAN (U"Use row labels", 0)
+	WORD (U"Label", U"+")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
-		iam (Sound);
+		iam (TableOfReal);
 		TableOfReal_drawScatterPlot (me, GRAPHICS,
-		GET_INTEGER (L"Horizontal axis column number"),
-		GET_INTEGER (L"Vertical axis column number"),
-		GET_INTEGER (L"left Row number range"), GET_INTEGER (L"right Row number range"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Label size"), GET_INTEGER (L"Use row labels"),
-		GET_STRING (L"Label"), GET_INTEGER (L"Garnish"));
+		GET_INTEGER (U"Horizontal axis column number"), GET_INTEGER (U"Vertical axis column number"),
+		GET_INTEGER (U"left Row number range"), GET_INTEGER (U"right Row number range"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Label size"), GET_INTEGER (U"Use row labels"),
+		GET_STRING (U"Label"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (TableOfReal_drawScatterPlotMatrix, L"TableOfReal: Draw scatter plots matrix", 0)
-	INTEGER (L"From column", L"0")
-	INTEGER (L"To column", L"0")
-	POSITIVE (L"Fraction white", L"0.1")
+FORM (TableOfReal_drawScatterPlotMatrix, U"TableOfReal: Draw scatter plots matrix", 0)
+	INTEGER (U"From column", U"0")
+	INTEGER (U"To column", U"0")
+	POSITIVE (U"Fraction white", U"0.1")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_drawScatterPlotMatrix (me, GRAPHICS, GET_INTEGER (L"From column"), GET_INTEGER (L"To column"),
-		GET_REAL (L"Fraction white"));
+		TableOfReal_drawScatterPlotMatrix (me, GRAPHICS, GET_INTEGER (U"From column"), GET_INTEGER (U"To column"),
+		GET_REAL (U"Fraction white"));
 	}
 END
 
-FORM (TableOfReal_drawBiplot, L"TableOfReal: Draw biplot", L"TableOfReal: Draw biplot...")
-	LABEL (L"", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	REAL (L"Split factor", L"0.5")
-	INTEGER (L"Label size", L"10")
-	BOOLEAN (L"Garnish", 1)
+FORM (TableOfReal_drawBiplot, U"TableOfReal: Draw biplot", U"TableOfReal: Draw biplot...")
+	LABEL (U"", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	REAL (U"Split factor", U"0.5")
+	INTEGER (U"Label size", U"10")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
 		TableOfReal_drawBiplot (me, GRAPHICS,
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_REAL (L"Split factor"),
-		GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
-	}
-END
-
-FORM (TableOfReal_drawVectors, L"Draw vectors", L"TableOfReal: Draw vectors...")
-	LABEL (L"", L"From (x1, y1) to (x2, y2)")
-	NATURAL (L"left From columns (x1, y1)", L"1")
-	NATURAL (L"right From columns (x1, y1)", L"2")
-	NATURAL (L"left To columns (x2, y2)", L"3")
-	NATURAL (L"right To columns (x2, y2)", L"4")
-	LABEL (L"", L"Select the drawing area")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	RADIO (L"Vector type", 1)
-	RADIOBUTTON (L"Arrow")
-	RADIOBUTTON (L"Double arrow")
-	RADIOBUTTON (L"Line")
-	INTEGER (L"Label size", L"10")
-	BOOLEAN (L"Garnish", 1)
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_REAL (U"Split factor"),
+		GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
+	}
+END
+
+FORM (TableOfReal_drawVectors, U"Draw vectors", U"TableOfReal: Draw vectors...")
+	LABEL (U"", U"From (x1, y1) to (x2, y2)")
+	NATURAL (U"left From columns (x1, y1)", U"1")
+	NATURAL (U"right From columns (x1, y1)", U"2")
+	NATURAL (U"left To columns (x2, y2)", U"3")
+	NATURAL (U"right To columns (x2, y2)", U"4")
+	LABEL (U"", U"Select the drawing area")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	RADIO (U"Vector type", 1)
+	RADIOBUTTON (U"Arrow")
+	RADIOBUTTON (U"Double arrow")
+	RADIOBUTTON (U"Line")
+	INTEGER (U"Label size", U"10")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
 		TableOfReal_drawVectors (me, GRAPHICS,
-		GET_INTEGER (L"left From columns"), GET_INTEGER (L"right From columns"),
-		GET_INTEGER (L"left To columns"), GET_INTEGER (L"right To columns"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Vector type"), GET_INTEGER (L"Label size"),
-		GET_INTEGER (L"Garnish"));
-	}
-END
-
-FORM (TableOfReal_drawRowAsHistogram, L"Draw row as histogram", L"TableOfReal: Draw rows as histogram...")
-	LABEL (L"", L"Select from the table")
-	WORD (L"Row number", L"1")
-	INTEGER (L"left Column range", L"0")
-	INTEGER (L"right Column range", L"0")
-	LABEL (L"", L"Vertical drawing range")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	LABEL (L"", L"Offset and distance in units of 'bar width'")
-	REAL (L"Horizontal offset", L"0.5")
-	REAL (L"Distance between bars", L"1.0")
-	WORD (L"Grey value (1=white)", L"0.7")
-	BOOLEAN (L"Garnish", 1)
+		GET_INTEGER (U"left From columns"), GET_INTEGER (U"right From columns"),
+		GET_INTEGER (U"left To columns"), GET_INTEGER (U"right To columns"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Vector type"), GET_INTEGER (U"Label size"),
+		GET_INTEGER (U"Garnish"));
+	}
+END
+
+FORM (TableOfReal_drawRowAsHistogram, U"Draw row as histogram", U"TableOfReal: Draw rows as histogram...")
+	LABEL (U"", U"Select from the table")
+	WORD (U"Row number", U"1")
+	INTEGER (U"left Column range", U"0")
+	INTEGER (U"right Column range", U"0")
+	LABEL (U"", U"Vertical drawing range")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	LABEL (U"", U"Offset and distance in units of 'bar width'")
+	REAL (U"Horizontal offset", U"0.5")
+	REAL (U"Distance between bars", U"1.0")
+	WORD (U"Grey value (1=white)", U"0.7")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_drawRowsAsHistogram (me, GRAPHICS, GET_STRING (L"Row number"),
-		GET_INTEGER (L"left Column range"), GET_INTEGER (L"right Column range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_REAL (L"Horizontal offset"), 0,
-		GET_REAL (L"Distance between bars"), GET_STRING (L"Grey value"),
-		GET_INTEGER (L"Garnish"));
-	}
-END
-
-FORM (TableOfReal_drawRowsAsHistogram, L"Draw rows as histogram", L"TableOfReal: Draw rows as histogram...")
-	LABEL (L"", L"Select from the table")
-	SENTENCE (L"Row numbers", L"1 2")
-	INTEGER (L"left Column range", L"0")
-	INTEGER (L"right Column range", L"0")
-	LABEL (L"", L"Vertical drawing range")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	LABEL (L"", L"Offset and distance in units of 'bar width'")
-	REAL (L"Horizontal offset", L"1.0")
-	REAL (L"Distance between bar groups", L"1.0")
-	REAL (L"Distance between bars", L"0.0")
-	SENTENCE (L"Grey values (1=white)", L"1 1")
-	BOOLEAN (L"Garnish", 1)
+		TableOfReal_drawRowsAsHistogram (me, GRAPHICS, GET_STRING (U"Row number"),
+		GET_INTEGER (U"left Column range"), GET_INTEGER (U"right Column range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_REAL (U"Horizontal offset"), 0,
+		GET_REAL (U"Distance between bars"), GET_STRING (U"Grey value"),
+		GET_INTEGER (U"Garnish"));
+	}
+END
+
+FORM (TableOfReal_drawRowsAsHistogram, U"Draw rows as histogram", U"TableOfReal: Draw rows as histogram...")
+	LABEL (U"", U"Select from the table")
+	SENTENCE (U"Row numbers", U"1 2")
+	INTEGER (U"left Column range", U"0")
+	INTEGER (U"right Column range", U"0")
+	LABEL (U"", U"Vertical drawing range")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	LABEL (U"", U"Offset and distance in units of 'bar width'")
+	REAL (U"Horizontal offset", U"1.0")
+	REAL (U"Distance between bar groups", U"1.0")
+	REAL (U"Distance between bars", U"0.0")
+	SENTENCE (U"Grey values (1=white)", U"1 1")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
 		TableOfReal_drawRowsAsHistogram (me, GRAPHICS,
-		GET_STRING (L"Row numbers"),
-		GET_INTEGER (L"left Column range"), GET_INTEGER (L"right Column range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_REAL (L"Horizontal offset"), GET_REAL (L"Distance between bars"),
-		GET_REAL (L"Distance between bar groups"), GET_STRING (L"Grey values"),
-		GET_INTEGER (L"Garnish"));
+		GET_STRING (U"Row numbers"),
+		GET_INTEGER (U"left Column range"), GET_INTEGER (U"right Column range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_REAL (U"Horizontal offset"), GET_REAL (U"Distance between bars"),
+		GET_REAL (U"Distance between bar groups"), GET_STRING (U"Grey values"),
+		GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (TableOfReal_drawBoxPlots, L"TableOfReal: Draw box plots", L"TableOfReal: Draw box plots...")
-	INTEGER (L"From row", L"0")
-	INTEGER (L"To row", L"0")
-	INTEGER (L"From column", L"0")
-	INTEGER (L"To column", L"0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (TableOfReal_drawBoxPlots, U"TableOfReal: Draw box plots", U"TableOfReal: Draw box plots...")
+	INTEGER (U"From row", U"0")
+	INTEGER (U"To row", U"0")
+	INTEGER (U"From column", U"0")
+	INTEGER (U"To column", U"0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_drawBoxPlots (me, GRAPHICS, GET_INTEGER (L"From row"), GET_INTEGER (L"To row"),
-		GET_INTEGER (L"From column"), GET_INTEGER (L"To column"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"));
+		TableOfReal_drawBoxPlots (me, GRAPHICS, GET_INTEGER (U"From row"), GET_INTEGER (U"To row"),
+		GET_INTEGER (U"From column"), GET_INTEGER (U"To column"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (TableOfReal_drawColumnAsDistribution, L"TableOfReal: Draw column as distribution", L"TableOfReal: Draw column as distribution...")
-	NATURAL (L"Column number", L"1")
-	REAL (L"left Value range", L"0.0")
-	REAL (L"right Value range", L"0.0")
-	REAL (L"left Frequency range", L"0.0")
-	REAL (L"right frequency range", L"0.0")
-	NATURAL (L"Number of bins", L"10")
-	BOOLEAN (L"Garnish", 1)
+FORM (TableOfReal_drawColumnAsDistribution, U"TableOfReal: Draw column as distribution", U"TableOfReal: Draw column as distribution...")
+	NATURAL (U"Column number", U"1")
+	REAL (U"left Value range", U"0.0")
+	REAL (U"right Value range", U"0.0")
+	REAL (U"left Frequency range", U"0.0")
+	REAL (U"right frequency range", U"0.0")
+	NATURAL (U"Number of bins", U"10")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_drawColumnAsDistribution (me, GRAPHICS, GET_INTEGER (L"Column number"),
-		GET_REAL (L"left Value range"), GET_REAL (L"right Value range"), GET_INTEGER (L"Number of bins"),
-		GET_REAL (L"left Frequency range"), GET_REAL (L"right frequency range"), 0, GET_INTEGER (L"Garnish"));
+		TableOfReal_drawColumnAsDistribution (me, GRAPHICS, GET_INTEGER (U"Column number"),
+		GET_REAL (U"left Value range"), GET_REAL (U"right Value range"), GET_INTEGER (U"Number of bins"),
+		GET_REAL (U"left Frequency range"), GET_REAL (U"right frequency range"), 0, GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (TableOfReal_to_Configuration_lda, L"TableOfReal: To Configuration (lda)", L"TableOfReal: To Configuration (lda)...")
-	INTEGER (L"Number of dimensions", L"0 (= all)")
+FORM (TableOfReal_to_Configuration_lda, U"TableOfReal: To Configuration (lda)", U"TableOfReal: To Configuration (lda)...")
+	INTEGER (U"Number of dimensions", U"0 (= all)")
 	OK
 DO
-	long dimension = GET_INTEGER (L"Number of dimensions");
+	long dimension = GET_INTEGER (U"Number of dimensions");
 	if (dimension < 0) {
-		Melder_throw ("Number of dimensions must be greater equal zero.");
+		Melder_throw (U"Number of dimensions must be greater equal zero.");
 	}
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_to_Configuration_lda (me, dimension), my name, L"_lda");
+		autoConfiguration thee = TableOfReal_to_Configuration_lda (me, dimension);
+		praat_new (thee.transfer(), my name, U"_lda");
 	}
 END
 
-FORM (TableOfReal_to_CCA, L"TableOfReal: To CCA", L"TableOfReal: To CCA...")
-	NATURAL (L"Dimension of dependent variate", L"2")
+FORM (TableOfReal_to_CCA, U"TableOfReal: To CCA", U"TableOfReal: To CCA...")
+	NATURAL (U"Dimension of dependent variate", U"2")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_to_CCA (me, GET_INTEGER (L"Dimension of dependent variate")), my name);
+		praat_new (TableOfReal_to_CCA (me, GET_INTEGER (U"Dimension of dependent variate")), my name);
 	}
 END
 
-FORM (TableOfReal_to_Configuration_pca, L"TableOfReal: To Configuration (pca)", L"TableOfReal: To Configuration (pca)...")
-	NATURAL (L"Number of dimensions", L"2")
+FORM (TableOfReal_to_Configuration_pca, U"TableOfReal: To Configuration (pca)", U"TableOfReal: To Configuration (pca)...")
+	NATURAL (U"Number of dimensions", U"2")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_to_Configuration_pca (me, GET_INTEGER (L"Number of dimensions")), my name, L"_pca");
+		autoConfiguration thee = TableOfReal_to_Configuration_pca (me, GET_INTEGER (U"Number of dimensions"));
+		praat_new (thee.transfer(), my name, U"_pca");
 	}
 END
 
 DIRECT (TableOfReal_to_Discriminant)
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_to_Discriminant (me), my name);
+		autoDiscriminant thee = TableOfReal_to_Discriminant (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
@@ -7548,17 +7773,17 @@ DIRECT (TableOfReal_to_PCA)
 	}
 END
 
-FORM (TableOfReal_to_SSCP, L"TableOfReal: To SSCP", L"TableOfReal: To SSCP...")
-	INTEGER (L"Begin row", L"0")
-	INTEGER (L"End row", L"0")
-	INTEGER (L"Begin column", L"0")
-	INTEGER (L"End column", L"0")
+FORM (TableOfReal_to_SSCP, U"TableOfReal: To SSCP", U"TableOfReal: To SSCP...")
+	INTEGER (U"Begin row", U"0")
+	INTEGER (U"End row", U"0")
+	INTEGER (U"Begin column", U"0")
+	INTEGER (U"End column", U"0")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_to_SSCP (me, GET_INTEGER (L"Begin row"), GET_INTEGER (L"End row"),
-		GET_INTEGER (L"Begin column"), GET_INTEGER (L"End column")), my name);
+		praat_new (TableOfReal_to_SSCP (me, GET_INTEGER (U"Begin row"), GET_INTEGER (U"End row"),
+		GET_INTEGER (U"Begin column"), GET_INTEGER (U"End column")), my name);
 	}
 END
 
@@ -7605,18 +7830,18 @@ DIRECT (TablesOfReal_to_Eigen_gsvd)
 		(t1 ? t2 : t1) = me;
 	}
 	Melder_assert (t1 && t2);
-	praat_new (TablesOfReal_to_Eigen_gsvd (t1, t2), 0);
+	praat_new (TablesOfReal_to_Eigen_gsvd (t1, t2), U"");
 END
 
-FORM (TableOfReal_and_TableOfReal_crossCorrelations, L"TableOfReal & TableOfReal: Cross-correlations", 0)
-	OPTIONMENU (L"Correlations between", 1)
-	OPTION (L"Rows")
-	OPTION (L"Columns")
-	BOOLEAN (L"Center", 0)
-	BOOLEAN (L"Normalize", 0)
+FORM (TableOfReal_and_TableOfReal_crossCorrelations, U"TableOfReal & TableOfReal: Cross-correlations", 0)
+	OPTIONMENU (U"Correlations between", 1)
+	OPTION (U"Rows")
+	OPTION (U"Columns")
+	BOOLEAN (U"Center", 0)
+	BOOLEAN (U"Normalize", 0)
 	OK
 DO
-	int by_columns = GET_INTEGER (L"Correlations between") - 1;
+	int by_columns = GET_INTEGER (U"Correlations between") - 1;
 	TableOfReal t1 = 0, t2 = 0;
 	LOOP {
 		iam (TableOfReal);
@@ -7624,7 +7849,7 @@ DO
 	}
 	Melder_assert (t1 && t2);
 	praat_new (TableOfReal_and_TableOfReal_crossCorrelations (t1, t2, by_columns,
-			GET_INTEGER (L"Center"), GET_INTEGER (L"Normalize")), (by_columns ? L"by_columns" : L"by_rows"), L"cc");
+			GET_INTEGER (U"Center"), GET_INTEGER (U"Normalize")), (by_columns ? U"by_columns" : U"by_rows"), U"cc");
 END
 
 DIRECT (TablesOfReal_to_GSVD)
@@ -7634,154 +7859,154 @@ DIRECT (TablesOfReal_to_GSVD)
 		(t1 ? t2 : t1) = me;
 	}
 	Melder_assert (t1 && t2);
-	praat_new (TablesOfReal_to_GSVD (t1, t2), 0);
+	praat_new (TablesOfReal_to_GSVD (t1, t2), U"");
 END
 
-FORM (TableOfReal_choleskyDecomposition, L"TableOfReal: Cholesky decomposition", 0)
-	BOOLEAN (L"Upper (else L)", 0)
-	BOOLEAN (L"Inverse", 0)
+FORM (TableOfReal_choleskyDecomposition, U"TableOfReal: Cholesky decomposition", 0)
+	BOOLEAN (U"Upper (else L)", 0)
+	BOOLEAN (U"Inverse", 0)
 	OK
 	DO
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_choleskyDecomposition (me, GET_INTEGER (L"Upper"), GET_INTEGER (L"Inverse")), my name);
+		praat_new (TableOfReal_choleskyDecomposition (me, GET_INTEGER (U"Upper"), GET_INTEGER (U"Inverse")), my name);
 	}
 END
 
-FORM (TableOfReal_to_Pattern_and_Categories, L"TableOfReal: To Pattern and Categories", L"TableOfReal: To Pattern and Categories...")
-	INTEGER (L"left Row range", L"0")
-	INTEGER (L"right Row range", L"0 (=all)")
-	INTEGER (L"left Column range", L"0")
-	INTEGER (L"right Column range", L"0 (=all)")
+FORM (TableOfReal_to_Pattern_and_Categories, U"TableOfReal: To Pattern and Categories", U"TableOfReal: To Pattern and Categories...")
+	INTEGER (U"left Row range", U"0")
+	INTEGER (U"right Row range", U"0 (=all)")
+	INTEGER (U"left Column range", U"0")
+	INTEGER (U"right Column range", U"0 (=all)")
 	OK
 	DO
 	LOOP {
 		iam (TableOfReal);
 		Pattern p = 0; Categories c = 0;
-		TableOfReal_to_Pattern_and_Categories (me, GET_INTEGER (L"left Row range"),
-		GET_INTEGER (L"right Row range"), GET_INTEGER (L"left Column range"),
-		GET_INTEGER (L"right Column range"), &p, &c);
+		TableOfReal_to_Pattern_and_Categories (me, GET_INTEGER (U"left Row range"),
+		GET_INTEGER (U"right Row range"), GET_INTEGER (U"left Column range"),
+		GET_INTEGER (U"right Column range"), &p, &c);
 		autoPattern ap = p; autoCategories ac = c;
 		praat_new (ap.transfer(), Thing_getName (me));
 		praat_new (ac.transfer(), Thing_getName (me));
 	}
 END
 
-FORM (TableOfReal_getColumnSum, L"TableOfReal: Get column sum", L"")
-	INTEGER (L"Column", L"1")
+FORM (TableOfReal_getColumnSum, U"TableOfReal: Get column sum", U"")
+	INTEGER (U"Column", U"1")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		Melder_information (Melder_double (TableOfReal_getColumnSum (me, GET_INTEGER (L"Column"))));
+		Melder_information (TableOfReal_getColumnSum (me, GET_INTEGER (U"Column")));
 	}
 END
 
-FORM (TableOfReal_getRowSum, L"TableOfReal: Get row sum", L"")
-	INTEGER (L"Row", L"1")
+FORM (TableOfReal_getRowSum, U"TableOfReal: Get row sum", U"")
+	INTEGER (U"Row", U"1")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		Melder_information (Melder_double (TableOfReal_getRowSum (me, GET_INTEGER (L"Row"))));
+		Melder_information (TableOfReal_getRowSum (me, GET_INTEGER (U"Row")));
 	}
 END
 
 DIRECT (TableOfReal_getGrandSum)
 	LOOP {
 		iam (TableOfReal);
-		Melder_information (Melder_double (TableOfReal_getGrandSum (me)));
+		Melder_information (TableOfReal_getGrandSum (me));
 	}
 END
 
-FORM (TableOfReal_meansByRowLabels, L"TableOfReal: Means by row labels", L"TableOfReal: To TableOfReal (means by row labels)...")
-	BOOLEAN (L"Expand", 0)
+FORM (TableOfReal_meansByRowLabels, U"TableOfReal: Means by row labels", U"TableOfReal: To TableOfReal (means by row labels)...")
+	BOOLEAN (U"Expand", 0)
 	OK
 	DO
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_meansByRowLabels (me, GET_INTEGER (L"Expand"), 0), NAME, L"_byrowlabels");
+		praat_new (TableOfReal_meansByRowLabels (me, GET_INTEGER (U"Expand"), 0), NAME, U"_byrowlabels");
 	}
 END
 
-FORM (TableOfReal_mediansByRowLabels, L"TableOfReal: Medians by row labels", L"TableOfReal: To TableOfReal (medians by row labels)...")
-	BOOLEAN (L"Expand", 0)
+FORM (TableOfReal_mediansByRowLabels, U"TableOfReal: Medians by row labels", U"TableOfReal: To TableOfReal (medians by row labels)...")
+	BOOLEAN (U"Expand", 0)
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_meansByRowLabels (me, GET_INTEGER (L"Expand"), 1), Thing_getName (me), L"_byrowlabels");
+		praat_new (TableOfReal_meansByRowLabels (me, GET_INTEGER (U"Expand"), 1), Thing_getName (me), U"_byrowlabels");
 	}
 END
 
 /***** TableOfReal and FilterBank  *****/
 
-FORM (TextGrid_extendTime, L"TextGrid: Extend time", L"TextGrid: Extend time...")
-	LABEL (L"", L"")
-	POSITIVE (L"Extend domain by (s)", L"1.0")
-	RADIO (L"At", 1)
-	RADIOBUTTON (L"End")
-	RADIOBUTTON (L"Start")
+FORM (TextGrid_extendTime, U"TextGrid: Extend time", U"TextGrid: Extend time...")
+	LABEL (U"", U"")
+	POSITIVE (U"Extend domain by (s)", U"1.0")
+	RADIO (U"At", 1)
+	RADIOBUTTON (U"End")
+	RADIOBUTTON (U"Start")
 	OK
 DO
 	LOOP {
 		iam (TextGrid);
-		TextGrid_extendTime (me, GET_REAL (L"Extend domain by"), GET_INTEGER (L"At") - 1);
+		TextGrid_extendTime (me, GET_REAL (U"Extend domain by"), GET_INTEGER (U"At") - 1);
 		praat_dataChanged (me);
 	}
 END
 
-FORM (TextGrid_replaceIntervalTexts, L"TextGrid: Replace interval text", L"TextGrid: Replace interval text...")
-	LABEL (L"", L"")
-	NATURAL (L"Tier number", L"1")
-	INTEGER (L"left Interval range", L"0")
-	INTEGER (L"right Interval range", L"0")
-	SENTENCE (L"Search", L"a")
-	SENTENCE (L"Replace", L"a")
-	RADIO (L"Search and replace strings are:", 1)
-	RADIOBUTTON (L"Literals")
-	RADIOBUTTON (L"Regular Expressions")
+FORM (TextGrid_replaceIntervalTexts, U"TextGrid: Replace interval text", U"TextGrid: Replace interval text...")
+	LABEL (U"", U"")
+	NATURAL (U"Tier number", U"1")
+	INTEGER (U"left Interval range", U"0")
+	INTEGER (U"right Interval range", U"0")
+	SENTENCE (U"Search", U"a")
+	SENTENCE (U"Replace", U"a")
+	RADIO (U"Search and replace strings are:", 1)
+	RADIOBUTTON (U"Literals")
+	RADIOBUTTON (U"Regular Expressions")
 	OK
 DO
-	long from = GET_INTEGER (L"left Interval range");
-	long to = GET_INTEGER (L"right Interval range");
-	int isregexp = GET_INTEGER (L"Search and replace strings are") - 1;
-	wchar_t *search = GET_STRING (L"Search");
+	long from = GET_INTEGER (U"left Interval range");
+	long to = GET_INTEGER (U"right Interval range");
+	int isregexp = GET_INTEGER (U"Search and replace strings are") - 1;
+	char32 *search = GET_STRING (U"Search");
 	LOOP {
 		iam (TextGrid);
 		long nmatches, nstringmatches;
-		TextGrid_changeLabels (me, GET_INTEGER (L"Tier number"), from, to, search, GET_STRING (L"Replace"),
+		TextGrid_changeLabels (me, GET_INTEGER (U"Tier number"), from, to, search, GET_STRING (U"Replace"),
 		isregexp, &nmatches, &nstringmatches);
 		praat_dataChanged (me);
 	}
 END
 
-FORM (TextGrid_replacePointTexts, L"TextGrid: Replace point text", L"TextGrid: Replace point text...")
-	LABEL (L"", L"")
-	NATURAL (L"Tier number", L"1")
-	INTEGER (L"left Interval range", L"0")
-	INTEGER (L"right Interval range", L"0")
-	SENTENCE (L"Search", L"a")
-	SENTENCE (L"Replace", L"a")
-	RADIO (L"Search and replace strings are:", 1)
-	RADIOBUTTON (L"Literals")
-	RADIOBUTTON (L"Regular Expressions")
+FORM (TextGrid_replacePointTexts, U"TextGrid: Replace point text", U"TextGrid: Replace point text...")
+	LABEL (U"", U"")
+	NATURAL (U"Tier number", U"1")
+	INTEGER (U"left Interval range", U"0")
+	INTEGER (U"right Interval range", U"0")
+	SENTENCE (U"Search", U"a")
+	SENTENCE (U"Replace", U"a")
+	RADIO (U"Search and replace strings are:", 1)
+	RADIOBUTTON (U"Literals")
+	RADIOBUTTON (U"Regular Expressions")
 	OK
 DO
-	long from = GET_INTEGER (L"left Interval range");
-	long to = GET_INTEGER (L"right Interval range");
+	long from = GET_INTEGER (U"left Interval range");
+	long to = GET_INTEGER (U"right Interval range");
 	LOOP {
 		iam (TextGrid);
 		long nmatches, nstringmatches;
-		TextGrid_changeLabels (me, GET_INTEGER (L"Tier number"), from, to, GET_STRING (L"Search"), GET_STRING (L"Replace"),
-		GET_INTEGER (L"Search and replace strings are") - 1, &nmatches, &nstringmatches);
+		TextGrid_changeLabels (me, GET_INTEGER (U"Tier number"), from, to, GET_STRING (U"Search"), GET_STRING (U"Replace"),
+		GET_INTEGER (U"Search and replace strings are") - 1, &nmatches, &nstringmatches);
 		praat_dataChanged (me);
 	}
 END
 
-FORM (TextGrids_to_Table_textAlignmentment, L"TextGrids: To Table (text alignment)", 0)
-	NATURAL (L"Target tier", L"1")
-	NATURAL (L"Source tier", L"1")
+FORM (TextGrids_to_Table_textAlignmentment, U"TextGrids: To Table (text alignment)", 0)
+	NATURAL (U"Target tier", U"1")
+	NATURAL (U"Source tier", U"1")
 	OK
 DO
 	TextGrid tg1 = 0, tg2 = 0;
@@ -7790,12 +8015,12 @@ DO
         (tg1 ? tg2 : tg1) = me;
     }
     Melder_assert (tg1 && tg2);
-	praat_new (TextGrids_to_Table_textAlignmentment (tg1, GET_INTEGER (L"Target tier"), tg2, GET_INTEGER (L"Source tier"), 0), tg1 -> name, L"_", tg2 -> name);
+	praat_new (TextGrids_to_Table_textAlignmentment (tg1, GET_INTEGER (U"Target tier"), tg2, GET_INTEGER (U"Source tier"), 0), tg1 -> name, U"_", tg2 -> name);
 END
 
-FORM (TextGrids_and_EditCostsTable_to_Table_textAlignmentment, L"TextGrids & EditCostsTable: To Table(text alignmentment)", 0)
-	NATURAL (L"Target tier", L"1")
-	NATURAL (L"Source tier", L"1")
+FORM (TextGrids_and_EditCostsTable_to_Table_textAlignmentment, U"TextGrids & EditCostsTable: To Table(text alignmentment)", 0)
+	NATURAL (U"Target tier", U"1")
+	NATURAL (U"Source tier", U"1")
 	OK
 DO
 	TextGrid tg1 = 0, tg2 = 0; EditCostsTable ect = 0;
@@ -7807,133 +8032,147 @@ DO
 		}
     }
  	Melder_assert (tg1 && tg2 && ect);
-	praat_new (TextGrids_to_Table_textAlignmentment (tg1, GET_INTEGER (L"Target tier"), tg2, GET_INTEGER (L"Source tier"), ect), tg1 -> name, L"_", tg2 -> name);
+	praat_new (TextGrids_to_Table_textAlignmentment (tg1, GET_INTEGER (U"Target tier"), tg2, GET_INTEGER (U"Source tier"), ect), tg1 -> name, U"_", tg2 -> name);
 END
 
-FORM (TextGrid_setTierName, L"TextGrid: Set tier name", L"TextGrid: Set tier name...")
-	NATURAL (L"Tier number:", L"1")
-	SENTENCE (L"Name", L"");
+FORM (TextGrid_setTierName, U"TextGrid: Set tier name", U"TextGrid: Set tier name...")
+	NATURAL (U"Tier number:", U"1")
+	SENTENCE (U"Name", U"");
 	OK
 DO
 	LOOP {
 		iam (TextGrid);
-		TextGrid_setTierName (me, GET_INTEGER (L"Tier number"), GET_STRING (L"Name"));
+		TextGrid_setTierName (me, GET_INTEGER (U"Tier number"), GET_STRING (U"Name"));
 		praat_dataChanged (me);
 	}
 END
 
 DIRECT (VowelEditor_create)
 	if (theCurrentPraatApplication -> batch) {
-		Melder_throw ("Cannot edit from batch.");
+		Melder_throw (U"Cannot edit from batch.");
 	}
-	autoVowelEditor vowelEditor = VowelEditor_create (L"VowelEditor", NULL);
+	autoVowelEditor vowelEditor = VowelEditor_create (U"VowelEditor", nullptr);
 	vowelEditor.transfer(); // user becomes the owner
 END
 
 static Any cmuAudioFileRecognizer (int nread, const char *header, MelderFile fs) {
 	return nread < 12 || header [0] != 6 || header [1] != 0 ?
-	       NULL : Sound_readFromCmuAudioFile (fs);
+	       nullptr : Sound_readFromCmuAudioFile (fs);
 }
 
 void praat_CC_init (ClassInfo klas) {
-	praat_addAction1 (klas, 1, L"Paint...", 0, 1, DO_CC_paint);
-	praat_addAction1 (klas, 1, L"Draw...", 0, 1, DO_CC_drawC0);
+	praat_addAction1 (klas, 1, U"Paint...", 0, 1, DO_CC_paint);
+	praat_addAction1 (klas, 1, U"Draw...", 0, 1, DO_CC_drawC0);
 	praat_addAction1 (klas, 1, QUERY_BUTTON, 0, 0, 0);
 	praat_TimeFrameSampled_query_init (klas);
-	praat_addAction1 (klas, 1, L"Get number of coefficients...", 0, 1, DO_CC_getNumberOfCoefficients);
-	praat_addAction1 (klas, 1, L"Get value in frame...", 0, 1, DO_CC_getValueInFrame);
-	praat_addAction1 (klas, 1, L"Get c0 value in frame...", 0, 1, DO_CC_getC0ValueInFrame);
-	praat_addAction1 (klas, 1, L"Get value...", 0, praat_HIDDEN + praat_DEPTH_1, DO_CC_getValue);
-	praat_addAction1 (klas, 0, L"To Matrix", 0, 0, DO_CC_to_Matrix);
-	praat_addAction1 (klas, 2, L"To DTW...", 0, 0, DO_CCs_to_DTW);
+	praat_addAction1 (klas, 1, U"Get number of coefficients...", 0, 1, DO_CC_getNumberOfCoefficients);
+	praat_addAction1 (klas, 1, U"Get value in frame...", 0, 1, DO_CC_getValueInFrame);
+	praat_addAction1 (klas, 1, U"Get c0 value in frame...", 0, 1, DO_CC_getC0ValueInFrame);
+	praat_addAction1 (klas, 1, U"Get value...", 0, praat_HIDDEN + praat_DEPTH_1, DO_CC_getValue);
+	praat_addAction1 (klas, 0, U"To Matrix", 0, 0, DO_CC_to_Matrix);
+	praat_addAction1 (klas, 2, U"To DTW...", 0, 0, DO_CCs_to_DTW);
 }
 
 static void praat_Eigen_Matrix_project (ClassInfo klase, ClassInfo klasm); // deprecated 2014
 static void praat_Eigen_Matrix_project (ClassInfo klase, ClassInfo klasm) {
-	praat_addAction2 (klase, 1, klasm, 1, L"Project...", 0, praat_HIDDEN, DO_Eigen_and_Matrix_project);
+	praat_addAction2 (klase, 1, klasm, 1, U"Project...", 0, praat_HIDDEN, DO_Eigen_and_Matrix_project);
 }
 
 static void praat_Eigen_Spectrogram_project (ClassInfo klase, ClassInfo klasm);
 static void praat_Eigen_Spectrogram_project (ClassInfo klase, ClassInfo klasm) {
-	praat_addAction2 (klase, 1, klasm, 1, L"Project...", 0, 0, DO_Eigen_and_Matrix_project);
+	praat_addAction2 (klase, 1, klasm, 1, U"Project...", 0, 0, DO_Eigen_and_Matrix_project);
 }
 
 static void praat_Eigen_query_init (ClassInfo klas) {
-	praat_addAction1 (klas, 1, L"Get eigenvalue...", 0, 1, DO_Eigen_getEigenvalue);
-	praat_addAction1 (klas, 1, L"Get sum of eigenvalues...", 0, 1, DO_Eigen_getSumOfEigenvalues);
-	praat_addAction1 (klas, 1, L"Get number of eigenvectors", 0, 1, DO_Eigen_getNumberOfEigenvalues);
-	praat_addAction1 (klas, 1, L"Get eigenvector dimension", 0, 1, DO_Eigen_getDimension);
-	praat_addAction1 (klas, 1, L"Get eigenvector element...", 0, 1, DO_Eigen_getEigenvectorElement);
+	praat_addAction1 (klas, 1, U"Get eigenvalue...", 0, 1, DO_Eigen_getEigenvalue);
+	praat_addAction1 (klas, 1, U"Get sum of eigenvalues...", 0, 1, DO_Eigen_getSumOfEigenvalues);
+	praat_addAction1 (klas, 1, U"Get number of eigenvectors", 0, 1, DO_Eigen_getNumberOfEigenvalues);
+	praat_addAction1 (klas, 1, U"Get eigenvector dimension", 0, 1, DO_Eigen_getDimension);
+	praat_addAction1 (klas, 1, U"Get eigenvector element...", 0, 1, DO_Eigen_getEigenvectorElement);
 }
 
 static void praat_Eigen_draw_init (ClassInfo klas) {
-	praat_addAction1 (klas, 0, L"Draw eigenvalues...", 0, 1, DO_Eigen_drawEigenvalues);
-	praat_addAction1 (klas, 0, L"Draw eigenvalues (scree)...", 0, praat_DEPTH_1 | praat_HIDDEN, DO_Eigen_drawEigenvalues_scree);
-	praat_addAction1 (klas, 0, L"Draw eigenvector...", 0, 1, DO_Eigen_drawEigenvector);
+	praat_addAction1 (klas, 0, U"Draw eigenvalues...", 0, 1, DO_Eigen_drawEigenvalues);
+	praat_addAction1 (klas, 0, U"Draw eigenvalues (scree)...", 0, praat_DEPTH_1 | praat_HIDDEN, DO_Eigen_drawEigenvalues_scree);
+	praat_addAction1 (klas, 0, U"Draw eigenvector...", 0, 1, DO_Eigen_drawEigenvector);
 }
 
 static void praat_Index_init (ClassInfo klas) {
-	praat_addAction1 (klas, 1, L"Get number of classes", 0, 0, DO_Index_getNumberOfClasses);
-	praat_addAction1 (klas, 1, L"To Permutation...", 0, 0, DO_Index_to_Permutation);
-	praat_addAction1 (klas, 1, L"Extract part...", 0, 0, DO_Index_extractPart);
+	praat_addAction1 (klas, 1, U"Get number of classes", 0, 0, DO_Index_getNumberOfClasses);
+	praat_addAction1 (klas, 1, U"To Permutation...", 0, 0, DO_Index_to_Permutation);
+	praat_addAction1 (klas, 1, U"Extract part...", 0, 0, DO_Index_extractPart);
 }
 
 static void praat_BandFilterSpectrogram_draw_init (ClassInfo klas);
 static void praat_BandFilterSpectrogram_draw_init (ClassInfo klas) {
 	praat_addAction1 (klas, 0, DRAW_BUTTON, 0, 0, 0);
-//	praat_addAction1 (klas, 0, L"Paint image...", 0, praat_DEPTH_1, DO_BandFilterSpectrogram_paintImage);
-//	praat_addAction1 (klas, 0, L"Draw filters...", 0, 1, DO_FilterBank_drawFilters);
-//	praat_addAction1 (klas, 0, L"Draw one contour...", 0, 1, DO_FilterBank_drawOneContour);
-//	praat_addAction1 (klas, 0, L"Draw contours...", 0, 1, DO_FilterBank_drawContours);
-//	praat_addAction1 (klas, 0, L"Paint contours...", 0, 1, DO_FilterBank_paintContours);
-//	praat_addAction1 (klas, 0, L"Paint cells...", 0, 1, DO_FilterBank_paintCells);
-//	praat_addAction1 (klas, 0, L"Paint surface...", 0, 1, DO_FilterBank_paintSurface);
-	praat_addAction1 (klas, 0, L"-- frequency scales --", 0, 1, 0);
-	praat_addAction1 (klas, 0, L"Draw frequency scale...", 0, 1, DO_BandFilterSpectrogram_drawFrequencyScale);
+//	praat_addAction1 (klas, 0, U"Paint image...", 0, praat_DEPTH_1, DO_BandFilterSpectrogram_paintImage);
+//	praat_addAction1 (klas, 0, U"Draw filters...", 0, 1, DO_FilterBank_drawFilters);
+//	praat_addAction1 (klas, 0, U"Draw one contour...", 0, 1, DO_FilterBank_drawOneContour);
+//	praat_addAction1 (klas, 0, U"Draw contours...", 0, 1, DO_FilterBank_drawContours);
+//	praat_addAction1 (klas, 0, U"Paint contours...", 0, 1, DO_FilterBank_paintContours);
+//	praat_addAction1 (klas, 0, U"Paint cells...", 0, 1, DO_FilterBank_paintCells);
+//	praat_addAction1 (klas, 0, U"Paint surface...", 0, 1, DO_FilterBank_paintSurface);
+	praat_addAction1 (klas, 0, U"-- frequency scales --", 0, 1, 0);
+	praat_addAction1 (klas, 0, U"Draw frequency scale...", 0, 1, DO_BandFilterSpectrogram_drawFrequencyScale);
 }
 
 void praat_Matrixft_query_init (ClassInfo klas);
 void praat_Matrixft_query_init (ClassInfo klas) {
 	praat_TimeFrameSampled_query_init (klas);
-	praat_addAction1 (klas, 1, L"Get time from column...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_BandFilterSpectrogram_getXofColumn);
-	praat_addAction1 (klas, 1, L"-- frequencies --", 0, praat_DEPTH_1 + praat_HIDDEN, 0);
-	praat_addAction1 (klas, 1, L"Get lowest frequency", 0, praat_DEPTH_1 + praat_HIDDEN, DO_BandFilterSpectrogram_getLowestFrequency);
-	praat_addAction1 (klas, 1, L"Get highest frequency", 0, praat_DEPTH_1 + praat_HIDDEN, DO_BandFilterSpectrogram_getHighestFrequency);
-	praat_addAction1 (klas, 1, L"Get number of frequencies", 0, praat_DEPTH_1 + praat_HIDDEN, DO_BandFilterSpectrogram_getNumberOfFrequencies);
-	praat_addAction1 (klas, 1, L"Get frequency distance", 0, praat_DEPTH_1 + praat_HIDDEN, DO_BandFilterSpectrogram_getFrequencyDistance);
-	praat_addAction1 (klas, 1, L"Get frequency from row...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_BandFilterSpectrogram_getFrequencyOfRow);
-	praat_addAction1 (klas, 1, L"-- get value --", 0, praat_DEPTH_1 + praat_HIDDEN, 0);
-	praat_addAction1 (klas, 1, L"Get value in cell...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_BandFilterSpectrogram_getValueInCell);
+	praat_addAction1 (klas, 1, U"Get time from column...", 0, praat_DEPTH_1, DO_BandFilterSpectrogram_getXofColumn);
+	praat_addAction1 (klas, 1, U"-- frequencies --", 0, praat_DEPTH_1, 0);
+	praat_addAction1 (klas, 1, U"Get lowest frequency", 0, praat_DEPTH_1, DO_BandFilterSpectrogram_getLowestFrequency);
+	praat_addAction1 (klas, 1, U"Get highest frequency", 0, praat_DEPTH_1, DO_BandFilterSpectrogram_getHighestFrequency);
+	praat_addAction1 (klas, 1, U"Get number of frequencies", 0, praat_DEPTH_1, DO_BandFilterSpectrogram_getNumberOfFrequencies);
+	praat_addAction1 (klas, 1, U"Get frequency distance", 0, praat_DEPTH_1, DO_BandFilterSpectrogram_getFrequencyDistance);
+	praat_addAction1 (klas, 1, U"Get frequency from row...", 0, praat_DEPTH_1, DO_BandFilterSpectrogram_getFrequencyOfRow);
+	praat_addAction1 (klas, 1, U"-- get value --", 0, praat_DEPTH_1, 0);
+	praat_addAction1 (klas, 1, U"Get value in cell...", 0, praat_DEPTH_1, DO_BandFilterSpectrogram_getValueInCell);
+}
+
+void praat_Matrixtype_query_init (ClassInfo klas);
+void praat_Matrixtype_query_init (ClassInfo klas) {
+	praat_TimeFrameSampled_query_init (klas);
+	praat_addAction1 (klas, 1, U"Get time from column...", 0, praat_DEPTH_1, DO_FilterBank_getXofColumn);
+	praat_addAction1 (klas, 1, U"-- frequencies --", 0, praat_DEPTH_1, 0);
+	praat_addAction1 (klas, 1, U"Get lowest frequency", 0, praat_DEPTH_1, DO_FilterBank_getLowestFrequency);
+	praat_addAction1 (klas, 1, U"Get highest frequency", 0, praat_DEPTH_1, DO_FilterBank_getHighestFrequency);
+	praat_addAction1 (klas, 1, U"Get number of frequencies", 0, praat_DEPTH_1, DO_FilterBank_getNumberOfFrequencies);
+	praat_addAction1 (klas, 1, U"Get frequency distance", 0, praat_DEPTH_1, DO_FilterBank_getFrequencyDistance);
+	praat_addAction1 (klas, 1, U"Get frequency from row...", 0, praat_DEPTH_1, DO_FilterBank_getFrequencyOfRow);
+	praat_addAction1 (klas, 1, U"-- get value --", 0, praat_DEPTH_1, 0);
+	praat_addAction1 (klas, 1, U"Get value in cell...", 0, praat_DEPTH_1, DO_FilterBank_getValueInCell);
 }
 
 static void praat_FilterBank_query_init (ClassInfo klas);
 static void praat_FilterBank_query_init (ClassInfo klas) {
 	praat_addAction1 (klas, 0, QUERY_BUTTON, 0, 0, 0);
-	praat_Matrixft_query_init (klas);
-	praat_addAction1 (klas, 0, L"-- frequency scales --", 0, praat_DEPTH_1 + praat_HIDDEN, 0);
-	praat_addAction1 (klas, 1, L"Get frequency in Hertz...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_getFrequencyInHertz);
-	praat_addAction1 (klas, 1, L"Get frequency in Bark...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_getFrequencyInBark);
-	praat_addAction1 (klas, 1, L"Get frequency in mel...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_getFrequencyInMel);
+	praat_Matrixtype_query_init (klas);
+	praat_addAction1 (klas, 0, U"-- frequency scales --", 0, praat_DEPTH_1, 0);
+	praat_addAction1 (klas, 1, U"Get frequency in Hertz...", 0, praat_DEPTH_1, DO_FilterBank_getFrequencyInHertz);
+	praat_addAction1 (klas, 1, U"Get frequency in Bark...", 0, praat_DEPTH_1, DO_FilterBank_getFrequencyInBark);
+	praat_addAction1 (klas, 1, U"Get frequency in mel...", 0, praat_DEPTH_1, DO_FilterBank_getFrequencyInMel);
 }
 
 static void praat_FilterBank_modify_init (ClassInfo klas);
 static void praat_FilterBank_modify_init (ClassInfo klas) {
 	// praat_addAction1 (klas, 0, MODIFY_BUTTON, 0, 0, 0); 
-	praat_addAction1 (klas, 0, L"Equalize intensities...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_equalizeIntensities);
+	praat_addAction1 (klas, 0, U"Equalize intensities...", 0, praat_DEPTH_1, DO_FilterBank_equalizeIntensities);
 }
 
 static void praat_FilterBank_draw_init (ClassInfo klas);
 static void praat_FilterBank_draw_init (ClassInfo klas) {
 	// praat_addAction1 (klas, 0, DRAW_BUTTON, 0, 0, 0);
-	praat_addAction1 (klas, 0, L"Draw filters...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_drawFilters);
-	praat_addAction1 (klas, 0, L"Draw one contour...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_drawOneContour);
-	praat_addAction1 (klas, 0, L"Draw contours...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_drawContours);
-	praat_addAction1 (klas, 0, L"Paint image...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_paintImage);
-	praat_addAction1 (klas, 0, L"Paint contours...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_paintContours);
-	praat_addAction1 (klas, 0, L"Paint cells...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_paintCells);
-	praat_addAction1 (klas, 0, L"Paint surface...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_paintSurface);
-	praat_addAction1 (klas, 0, L"-- frequency scales --", 0, praat_DEPTH_1 + praat_HIDDEN, 0);
-	praat_addAction1 (klas, 0, L"Draw frequency scales...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilterBank_drawFrequencyScales);
+	praat_addAction1 (klas, 0, U"Draw filters...", 0, praat_DEPTH_1, DO_FilterBank_drawFilters);
+	praat_addAction1 (klas, 0, U"Draw one contour...", 0, praat_DEPTH_1, DO_FilterBank_drawOneContour);
+	praat_addAction1 (klas, 0, U"Draw contours...", 0, praat_DEPTH_1, DO_FilterBank_drawContours);
+	praat_addAction1 (klas, 0, U"Paint image...", 0, praat_DEPTH_1, DO_FilterBank_paintImage);
+	praat_addAction1 (klas, 0, U"Paint contours...", 0, praat_DEPTH_1, DO_FilterBank_paintContours);
+	praat_addAction1 (klas, 0, U"Paint cells...", 0, praat_DEPTH_1, DO_FilterBank_paintCells);
+	praat_addAction1 (klas, 0, U"Paint surface...", 0, praat_DEPTH_1, DO_FilterBank_paintSurface);
+	praat_addAction1 (klas, 0, U"-- frequency scales --", 0, praat_DEPTH_1, 0);
+	praat_addAction1 (klas, 0, U"Draw frequency scales...", 0, praat_DEPTH_1, DO_FilterBank_drawFrequencyScales);
 }
 
 static void praat_FilterBank_all_init (ClassInfo klas);
@@ -7941,116 +8180,116 @@ static void praat_FilterBank_all_init (ClassInfo klas) {
 	praat_FilterBank_draw_init (klas);
 	praat_FilterBank_query_init (klas);
 	praat_FilterBank_modify_init (klas);
-	praat_addAction1 (klas, 0, L"To Intensity", 0, praat_HIDDEN, DO_FilterBank_to_Intensity);
-	praat_addAction1 (klas, 0, L"To Matrix", 0, praat_HIDDEN, DO_FilterBank_to_Matrix);
-	praat_addAction1 (klas, 2, L"Cross-correlate...", 0, praat_HIDDEN, DO_FilterBanks_crossCorrelate);
-	praat_addAction1 (klas, 2, L"Convolve...", 0, praat_HIDDEN, DO_FilterBanks_convolve);
+	praat_addAction1 (klas, 0, U"To Intensity", 0, praat_HIDDEN, DO_FilterBank_to_Intensity);
+	praat_addAction1 (klas, 0, U"To Matrix", 0, praat_HIDDEN, DO_FilterBank_to_Matrix);
+	praat_addAction1 (klas, 2, U"Cross-correlate...", 0, praat_HIDDEN, DO_FilterBanks_crossCorrelate);
+	praat_addAction1 (klas, 2, U"Convolve...", 0, praat_HIDDEN, DO_FilterBanks_convolve);
 }
 
 static void praat_FunctionTerms_init (ClassInfo klas) {
 	praat_addAction1 (klas, 0, DRAW_BUTTON, 0, 0, 0);
-	praat_addAction1 (klas, 0, L"Draw...", 0, 1, DO_FunctionTerms_draw);
-	praat_addAction1 (klas, 0, L"Draw basis function...", 0, 1, DO_FunctionTerms_drawBasisFunction);
+	praat_addAction1 (klas, 0, U"Draw...", 0, 1, DO_FunctionTerms_draw);
+	praat_addAction1 (klas, 0, U"Draw basis function...", 0, 1, DO_FunctionTerms_drawBasisFunction);
 	praat_addAction1 (klas, 0, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction1 (klas, 1, L"Get number of coefficients", 0, 1, DO_FunctionTerms_getNumberOfCoefficients);
-	praat_addAction1 (klas, 1, L"Get coefficient...", 0, 1, DO_FunctionTerms_getCoefficient);
-	praat_addAction1 (klas, 1, L"Get degree", 0, 1, DO_FunctionTerms_getDegree);
-	praat_addAction1 (klas, 0, L"-- function specifics --", 0, 1, 0);
-	praat_addAction1 (klas, 1, L"Get value...", 0, 1, DO_FunctionTerms_evaluate);
-	praat_addAction1 (klas, 1, L"Get minimum...", 0, 1, DO_FunctionTerms_getMinimum);
-	praat_addAction1 (klas, 1, L"Get x of minimum...", 0, 1, DO_FunctionTerms_getXOfMinimum);
-	praat_addAction1 (klas, 1, L"Get maximum...", 0, 1, DO_FunctionTerms_getMaximum);
-	praat_addAction1 (klas, 1, L"Get x of maximum...", 0, 1, DO_FunctionTerms_getXOfMaximum);
-	praat_addAction1 (klas, 0, L"Modify -", 0, 0, 0);
-	praat_addAction1 (klas, 1, L"Set domain...", 0, 1, DO_FunctionTerms_setDomain);
-	praat_addAction1 (klas, 1, L"Set coefficient...", 0, 1, DO_FunctionTerms_setCoefficient);
-	praat_addAction1 (klas, 0, L"Analyse", 0, 0, 0);
+	praat_addAction1 (klas, 1, U"Get number of coefficients", 0, 1, DO_FunctionTerms_getNumberOfCoefficients);
+	praat_addAction1 (klas, 1, U"Get coefficient...", 0, 1, DO_FunctionTerms_getCoefficient);
+	praat_addAction1 (klas, 1, U"Get degree", 0, 1, DO_FunctionTerms_getDegree);
+	praat_addAction1 (klas, 0, U"-- function specifics --", 0, 1, 0);
+	praat_addAction1 (klas, 1, U"Get value...", 0, 1, DO_FunctionTerms_evaluate);
+	praat_addAction1 (klas, 1, U"Get minimum...", 0, 1, DO_FunctionTerms_getMinimum);
+	praat_addAction1 (klas, 1, U"Get x of minimum...", 0, 1, DO_FunctionTerms_getXOfMinimum);
+	praat_addAction1 (klas, 1, U"Get maximum...", 0, 1, DO_FunctionTerms_getMaximum);
+	praat_addAction1 (klas, 1, U"Get x of maximum...", 0, 1, DO_FunctionTerms_getXOfMaximum);
+	praat_addAction1 (klas, 0, U"Modify -", 0, 0, 0);
+	praat_addAction1 (klas, 1, U"Set domain...", 0, 1, DO_FunctionTerms_setDomain);
+	praat_addAction1 (klas, 1, U"Set coefficient...", 0, 1, DO_FunctionTerms_setCoefficient);
+	praat_addAction1 (klas, 0, U"Analyse", 0, 0, 0);
 }
 
 /* Query buttons for frame-based frequency x time subclasses of matrix. */
 
 void praat_BandFilterSpectrogram_query_init (ClassInfo klas) {
 	praat_TimeFrameSampled_query_init (klas);
-	praat_addAction1 (klas, 1, L"Get time from column...", 0, 1, DO_BandFilterSpectrogram_getXofColumn);
-	praat_addAction1 (klas, 1, L"-- frequencies --", 0, 1, 0);
-	praat_addAction1 (klas, 1, L"Get lowest frequency", 0, 1, DO_BandFilterSpectrogram_getLowestFrequency);
-	praat_addAction1 (klas, 1, L"Get highest frequency", 0, 1, DO_BandFilterSpectrogram_getHighestFrequency);
-	praat_addAction1 (klas, 1, L"Get number of frequencies", 0, 1, DO_BandFilterSpectrogram_getNumberOfFrequencies);
-	praat_addAction1 (klas, 1, L"Get frequency distance", 0, 1, DO_BandFilterSpectrogram_getFrequencyDistance);
-	praat_addAction1 (klas, 1, L"Get frequency from row...", 0, 1, DO_BandFilterSpectrogram_getFrequencyOfRow);
-	praat_addAction1 (klas, 1, L"-- get value --", 0, 1, 0);
-	praat_addAction1 (klas, 1, L"Get value in cell...", 0, 1, DO_BandFilterSpectrogram_getValueInCell);
+	praat_addAction1 (klas, 1, U"Get time from column...", 0, 1, DO_BandFilterSpectrogram_getXofColumn);
+	praat_addAction1 (klas, 1, U"-- frequencies --", 0, 1, 0);
+	praat_addAction1 (klas, 1, U"Get lowest frequency", 0, 1, DO_BandFilterSpectrogram_getLowestFrequency);
+	praat_addAction1 (klas, 1, U"Get highest frequency", 0, 1, DO_BandFilterSpectrogram_getHighestFrequency);
+	praat_addAction1 (klas, 1, U"Get number of frequencies", 0, 1, DO_BandFilterSpectrogram_getNumberOfFrequencies);
+	praat_addAction1 (klas, 1, U"Get frequency distance", 0, 1, DO_BandFilterSpectrogram_getFrequencyDistance);
+	praat_addAction1 (klas, 1, U"Get frequency from row...", 0, 1, DO_BandFilterSpectrogram_getFrequencyOfRow);
+	praat_addAction1 (klas, 1, U"-- get value --", 0, 1, 0);
+	praat_addAction1 (klas, 1, U"Get value in cell...", 0, 1, DO_BandFilterSpectrogram_getValueInCell);
 }
 
 static void praat_Spline_init (ClassInfo klas) {
 	praat_FunctionTerms_init (klas);
-	praat_addAction1 (klas, 0, L"Draw knots...", L"Draw basis function...", 1, DO_Spline_drawKnots);
-	praat_addAction1 (klas, 1, L"Get order", L"Get degree", 1, DO_Spline_getOrder);
-	praat_addAction1 (klas, 1, L"Scale x...", L"Analyse",	0, DO_Spline_scaleX);
+	praat_addAction1 (klas, 0, U"Draw knots...", U"Draw basis function...", 1, DO_Spline_drawKnots);
+	praat_addAction1 (klas, 1, U"Get order", U"Get degree", 1, DO_Spline_getOrder);
+	praat_addAction1 (klas, 1, U"Scale x...", U"Analyse",	0, DO_Spline_scaleX);
 }
 
 static void praat_SSCP_query_init (ClassInfo klas) {
-	praat_addAction1 (klas, 1, L"-- statistics --", L"Get value...", 1, 0);
-	praat_addAction1 (klas, 1, L"Get number of observations", L"-- statistics --", 1, DO_SSCP_getNumberOfObservations);
-	praat_addAction1 (klas, 1, L"Get degrees of freedom", L"Get number of observations", 1, DO_SSCP_getDegreesOfFreedom);
-	praat_addAction1 (klas, 1, L"Get centroid element...", L"Get degrees of freedom", 1, DO_SSCP_getCentroidElement);
-	praat_addAction1 (klas, 1, L"Get ln(determinant)", L"Get centroid element...", 1, DO_SSCP_getLnDeterminant);
+	praat_addAction1 (klas, 1, U"-- statistics --", U"Get value...", 1, 0);
+	praat_addAction1 (klas, 1, U"Get number of observations", U"-- statistics --", 1, DO_SSCP_getNumberOfObservations);
+	praat_addAction1 (klas, 1, U"Get degrees of freedom", U"Get number of observations", 1, DO_SSCP_getDegreesOfFreedom);
+	praat_addAction1 (klas, 1, U"Get centroid element...", U"Get degrees of freedom", 1, DO_SSCP_getCentroidElement);
+	praat_addAction1 (klas, 1, U"Get ln(determinant)", U"Get centroid element...", 1, DO_SSCP_getLnDeterminant);
 }
 
 static void praat_SSCP_extract_init (ClassInfo klas) {
-	praat_addAction1 (klas, 1, L"Extract centroid", EXTRACT_BUTTON, 1, DO_SSCP_extractCentroid);
+	praat_addAction1 (klas, 1, U"Extract centroid", EXTRACT_BUTTON, 1, DO_SSCP_extractCentroid);
 }
 
-FORM (SSCP_setValue, L"Covariance: Set value", L"Covariance: Set value...")
-	NATURAL (L"Row number", L"1")
-	NATURAL (L"Column number", L"1")
-	REAL (L"New value", L"1.0")
+FORM (SSCP_setValue, U"Covariance: Set value", U"Covariance: Set value...")
+	NATURAL (U"Row number", U"1")
+	NATURAL (U"Column number", U"1")
+	REAL (U"New value", U"1.0")
 	OK
 DO
 	LOOP {
 		iam (SSCP);
-		SSCP_setValue (me, GET_INTEGER (L"Row number"), GET_INTEGER (L"Column number"), GET_REAL (L"New value"));
+		SSCP_setValue (me, GET_INTEGER (U"Row number"), GET_INTEGER (U"Column number"), GET_REAL (U"New value"));
 	}
 END
 
-FORM (SSCP_setCentroid, L"", 0)
-	NATURAL (L"Element number", L"1")
-	REAL (L"New value", L"1.0")
+FORM (SSCP_setCentroid, U"", 0)
+	NATURAL (U"Element number", U"1")
+	REAL (U"New value", U"1.0")
 	OK
 DO
 	LOOP {
 		iam (SSCP);
-		SSCP_setCentroid (me, GET_INTEGER (L"Element number"), GET_REAL (L"New value"));
+		SSCP_setCentroid (me, GET_INTEGER (U"Element number"), GET_REAL (U"New value"));
 	}
 END
 
 void praat_SSCP_as_TableOfReal_init (ClassInfo klas) {
 	praat_TableOfReal_init (klas);
-	praat_removeAction (klas, NULL, NULL, L"Set value...");
-	praat_addAction1 (klas, 1, L"Set centroid...", L"Formula...", 1, DO_SSCP_setCentroid);
-	praat_addAction1 (klas, 1, L"Set value...", L"Formula...", 1, DO_SSCP_setValue);
-	praat_addAction1 (klas, 0, L"To TableOfReal", L"To Matrix", 1, DO_TableOfReal_to_TableOfReal);
+	praat_removeAction (klas, nullptr, nullptr, U"Set value...");
+	praat_addAction1 (klas, 1, U"Set centroid...", U"Formula...", 1, DO_SSCP_setCentroid);
+	praat_addAction1 (klas, 1, U"Set value...", U"Formula...", 1, DO_SSCP_setValue);
+	praat_addAction1 (klas, 0, U"To TableOfReal", U"To Matrix", 1, DO_TableOfReal_to_TableOfReal);
 
 }
 
 void praat_TableOfReal_init2 (ClassInfo klas) {
 	praat_TableOfReal_init (klas);
-	praat_addAction1 (klas, 0, L"To TableOfReal", L"To Matrix", 1, DO_TableOfReal_to_TableOfReal);
+	praat_addAction1 (klas, 0, U"To TableOfReal", U"To Matrix", 1, DO_TableOfReal_to_TableOfReal);
 }
 
 void praat_EditDistanceTable_as_TableOfReal_init (ClassInfo klas) {
 	praat_TableOfReal_init (klas);
-	praat_addAction1 (klas, 0, L"Set default costs...", L"Formula...", 1, DO_EditDistanceTable_setDefaultCosts);
-	praat_removeAction (klas, NULL, NULL, L"Draw as numbers...");
-	praat_addAction1 (klas, 0, L"Draw...", L"Draw -", 1, DO_EditDistanceTable_draw);
-	praat_addAction1 (klas, 0, L"Draw edit operations", L"Draw...", 1, DO_EditDistanceTable_drawEditOperations);
-	praat_removeAction (klas, NULL, NULL, L"Draw as numbers if...");
-	praat_removeAction (klas, NULL, NULL, L"Draw as squares...");
-	praat_removeAction (klas, NULL, NULL, L"Draw vertical lines...");
-	praat_removeAction (klas, NULL, NULL, L"Draw horizontal lines...");
-	praat_removeAction (klas, NULL, NULL, L"Draw left and right lines...");
-	praat_removeAction (klas, NULL, NULL, L"Draw top and bottom lines...");
-	praat_removeAction (klas, NULL, NULL, L"-- draw lines --");
+	praat_addAction1 (klas, 0, U"Set default costs...", U"Formula...", 1, DO_EditDistanceTable_setDefaultCosts);
+	praat_removeAction (klas, nullptr, nullptr, U"Draw as numbers...");
+	praat_addAction1 (klas, 0, U"Draw...", U"Draw -", 1, DO_EditDistanceTable_draw);
+	praat_addAction1 (klas, 0, U"Draw edit operations", U"Draw...", 1, DO_EditDistanceTable_drawEditOperations);
+	praat_removeAction (klas, nullptr, nullptr, U"Draw as numbers if...");
+	praat_removeAction (klas, nullptr, nullptr, U"Draw as squares...");
+	praat_removeAction (klas, nullptr, nullptr, U"Draw vertical lines...");
+	praat_removeAction (klas, nullptr, nullptr, U"Draw horizontal lines...");
+	praat_removeAction (klas, nullptr, nullptr, U"Draw left and right lines...");
+	praat_removeAction (klas, nullptr, nullptr, U"Draw top and bottom lines...");
+	praat_removeAction (klas, nullptr, nullptr, U"-- draw lines --");
 }
 
 void praat_uvafon_David_init ();
@@ -8060,7 +8299,7 @@ void praat_uvafon_David_init () {
 
 	Thing_recognizeClassesByName (classActivation, classBarkFilter, classBarkSpectrogram,
 		classCategories, classCepstrum, classCCA,
-		classChebyshevSeries, classClassificationTable, classConfusion,
+		classChebyshevSeries, classClassificationTable, classComplexSpectrogram, classConfusion,
 		classCorrelation, classCovariance, classDiscriminant, classDTW,
 		classEigen, classExcitations, classEditCostsTable, classEditDistanceTable,
 		classFileInMemory, classFilesInMemory, classFormantFilter,
@@ -8068,253 +8307,260 @@ void praat_uvafon_David_init () {
 		classPermutation, classISpline, classLegendreSeries,
 		classMelFilter, classMelSpectrogram, classMSpline, classPattern, classPCA, classPolynomial, classRoots,
 		classSimpleString, classStringsIndex, classSpeechSynthesizer, classSPINET, classSSCP,
-		classSVD, NULL);
+		classSVD, nullptr);
 
 	VowelEditor_prefs ();
 
 	espeakdata_praat_init ();
 
-	praat_addMenuCommand (L"Objects", L"Technical", L"Report floating point properties", L"Report integer properties", 0, DO_Praat_ReportFloatingPointProperties);
-	praat_addMenuCommand (L"Objects", L"Goodies", L"Get TukeyQ...", 0, praat_HIDDEN, DO_Praat_getTukeyQ);
-	praat_addMenuCommand (L"Objects", L"Goodies", L"Get invTukeyQ...", 0, praat_HIDDEN, DO_Praat_getInvTukeyQ);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Strings from espeak voices", L"Create Strings as directory list...", praat_DEPTH_1 + praat_HIDDEN, DO_Strings_createFromEspeakVoices);
-	praat_addMenuCommand (L"Objects", L"New", L"Create iris data set", L"Create TableOfReal...", 1, DO_New_CreateIrisDataset);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Permutation...", 0, 0, DO_Permutation_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Polynomial", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Polynomial...", 0, 1, DO_Polynomial_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create LegendreSeries...", 0, 1, DO_LegendreSeries_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create ChebyshevSeries...", 0, 1, DO_ChebyshevSeries_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create MSpline...", 0, 1, DO_MSpline_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create ISpline...", 0, 1, DO_ISpline_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Sound from gammatone...", L"Create Sound from tone complex...", 1, DO_Sound_createFromGammaTone);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Sound from gamma-tone...", L"Create Sound from tone complex...", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_createFromGammaTone);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Sound from Shepard tone...", L"Create Sound from gammatone...", 1, DO_Sound_createFromShepardTone);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Sound from VowelEditor...", L"Create Sound from Shepard tone...", praat_DEPTH_1, DO_VowelEditor_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create SpeechSynthesizer...", L"Create Sound from VowelEditor...", praat_DEPTH_1, DO_SpeechSynthesizer_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create formant table (Pols & Van Nierop 1973)", L"Create Table...", 1, DO_Table_createFromPolsVanNieropData);
-	praat_addMenuCommand (L"Objects", L"New", L"Create formant table (Peterson & Barney 1952)", L"Create Table...", 1, DO_Table_createFromPetersonBarneyData);
-	praat_addMenuCommand (L"Objects", L"New", L"Create formant table (Weenink 1985)", L"Create formant table (Peterson & Barney 1952)", 1, DO_Table_createFromWeeninkData);
-	praat_addMenuCommand (L"Objects", L"New", L"Create H1H2 table (Esposito 2006)", L"Create formant table (Weenink 1985)", praat_DEPTH_1+ praat_HIDDEN, DO_Table_createFromEspositoData);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Table (Ganong 1980)", L"Create H1H2 table (Esposito 2006)", praat_DEPTH_1+ praat_HIDDEN, DO_Table_createFromGanongData);
-	praat_addMenuCommand (L"Objects", L"New", L"Create TableOfReal (Pols 1973)...", L"Create TableOfReal...", 1, DO_TableOfReal_createFromPolsData_50males);
-	praat_addMenuCommand (L"Objects", L"New", L"Create TableOfReal (Van Nierop 1973)...", L"Create TableOfReal (Pols 1973)...", 1, DO_TableOfReal_createFromVanNieropData_25females);
-	praat_addMenuCommand (L"Objects", L"New", L"Create TableOfReal (Weenink 1985)...", L"Create TableOfReal (Van Nierop 1973)...", 1, DO_TableOfReal_createFromWeeninkData);
-	praat_addMenuCommand (L"Objects", L"New", L"Create simple Confusion...", L"Create TableOfReal (Weenink 1985)...", 1, DO_Confusion_createSimple);
-	praat_addMenuCommand (L"Objects", L"New", L"Create simple Covariance...", L"Create simple Confusion...", 1, DO_Covariance_createSimple);
-	praat_addMenuCommand (L"Objects", L"New", L"Create empty EditCostsTable...", L"Create simple Covariance...", 1, DO_EditCostsTable_createEmpty);
-
-	praat_addMenuCommand (L"Objects", L"New", L"Create KlattTable example", L"Create TableOfReal (Weenink 1985)...", praat_DEPTH_1 + praat_HIDDEN, DO_KlattTable_createExample);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Strings as characters...", L"Create TextGrid...", praat_HIDDEN, DO_Strings_createAsCharacters);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Strings as tokens...", L"Create TextGrid...", praat_HIDDEN, DO_Strings_createAsTokens);
-
-	praat_addMenuCommand (L"Objects", L"New", L"Create simple Polygon...", 0, praat_HIDDEN, DO_Polygon_createSimple);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Polygon (random vertices)...", 0, praat_HIDDEN, DO_Polygon_createFromRandomVertices);
-	praat_addMenuCommand (L"Objects", L"New", L"FilesInMemory", 0, praat_HIDDEN, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"Create FileInMemory...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FileInMemory_create);
-		praat_addMenuCommand (L"Objects", L"New", L"Create copy from FilesInMemory...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilesInMemory_createCopyFromFilesInMemory);
-		praat_addMenuCommand (L"Objects", L"New", L"Create FilesInMemory from directory contents...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilesInMemory_createFromDirectoryContents);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read Sound from raw 16-bit Little Endian file...", L"Read from special sound file", 1,
+	praat_addMenuCommand (U"Objects", U"Technical", U"Report floating point properties", U"Report integer properties", 0, DO_Praat_ReportFloatingPointProperties);
+	praat_addMenuCommand (U"Objects", U"Goodies", U"Get TukeyQ...", 0, praat_HIDDEN, DO_Praat_getTukeyQ);
+	praat_addMenuCommand (U"Objects", U"Goodies", U"Get invTukeyQ...", 0, praat_HIDDEN, DO_Praat_getInvTukeyQ);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Strings from espeak voices", U"Create Strings as directory list...", praat_DEPTH_1 + praat_HIDDEN, DO_Strings_createFromEspeakVoices);
+	praat_addMenuCommand (U"Objects", U"New", U"Create iris data set", U"Create TableOfReal...", 1, DO_New_CreateIrisDataset);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Permutation...", 0, 0, DO_Permutation_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Polynomial", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Polynomial...", 0, 1, DO_Polynomial_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create LegendreSeries...", 0, 1, DO_LegendreSeries_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create ChebyshevSeries...", 0, 1, DO_ChebyshevSeries_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create MSpline...", 0, 1, DO_MSpline_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create ISpline...", 0, 1, DO_ISpline_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Sound from gammatone...", U"Create Sound from tone complex...", 1, DO_Sound_createFromGammaTone);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Sound from gamma-tone...", U"Create Sound from tone complex...", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_createFromGammaTone);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Sound from Shepard tone...", U"Create Sound from gammatone...", 1, DO_Sound_createFromShepardTone);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Sound from VowelEditor...", U"Create Sound from Shepard tone...", praat_DEPTH_1, DO_VowelEditor_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create SpeechSynthesizer...", U"Create Sound from VowelEditor...", praat_DEPTH_1, DO_SpeechSynthesizer_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create formant table (Pols & Van Nierop 1973)", U"Create Table...", 1, DO_Table_createFromPolsVanNieropData);
+	praat_addMenuCommand (U"Objects", U"New", U"Create formant table (Peterson & Barney 1952)", U"Create Table...", 1, DO_Table_createFromPetersonBarneyData);
+	praat_addMenuCommand (U"Objects", U"New", U"Create formant table (Weenink 1985)", U"Create formant table (Peterson & Barney 1952)", 1, DO_Table_createFromWeeninkData);
+	praat_addMenuCommand (U"Objects", U"New", U"Create H1H2 table (Esposito 2006)", U"Create formant table (Weenink 1985)", praat_DEPTH_1+ praat_HIDDEN, DO_Table_createFromEspositoData);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Table (Ganong 1980)", U"Create H1H2 table (Esposito 2006)", praat_DEPTH_1+ praat_HIDDEN, DO_Table_createFromGanongData);
+	praat_addMenuCommand (U"Objects", U"New", U"Create TableOfReal (Pols 1973)...", U"Create TableOfReal...", 1, DO_TableOfReal_createFromPolsData_50males);
+	praat_addMenuCommand (U"Objects", U"New", U"Create TableOfReal (Van Nierop 1973)...", U"Create TableOfReal (Pols 1973)...", 1, DO_TableOfReal_createFromVanNieropData_25females);
+	praat_addMenuCommand (U"Objects", U"New", U"Create TableOfReal (Weenink 1985)...", U"Create TableOfReal (Van Nierop 1973)...", 1, DO_TableOfReal_createFromWeeninkData);
+	praat_addMenuCommand (U"Objects", U"New", U"Create simple Confusion...", U"Create TableOfReal (Weenink 1985)...", 1, DO_Confusion_createSimple);
+	praat_addMenuCommand (U"Objects", U"New", U"Create simple Covariance...", U"Create simple Confusion...", 1, DO_Covariance_createSimple);
+	praat_addMenuCommand (U"Objects", U"New", U"Create empty EditCostsTable...", U"Create simple Covariance...", 1, DO_EditCostsTable_createEmpty);
+
+	praat_addMenuCommand (U"Objects", U"New", U"Create KlattTable example", U"Create TableOfReal (Weenink 1985)...", praat_DEPTH_1 + praat_HIDDEN, DO_KlattTable_createExample);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Strings as characters...", U"Create TextGrid...", praat_HIDDEN, DO_Strings_createAsCharacters);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Strings as tokens...", U"Create TextGrid...", praat_HIDDEN, DO_Strings_createAsTokens);
+
+	praat_addMenuCommand (U"Objects", U"New", U"Create simple Polygon...", 0, praat_HIDDEN, DO_Polygon_createSimple);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Polygon (random vertices)...", 0, praat_HIDDEN, DO_Polygon_createFromRandomVertices);
+	praat_addMenuCommand (U"Objects", U"New", U"FilesInMemory", 0, praat_HIDDEN, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"Create FileInMemory...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FileInMemory_create);
+		praat_addMenuCommand (U"Objects", U"New", U"Create copy from FilesInMemory...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilesInMemory_createCopyFromFilesInMemory);
+		praat_addMenuCommand (U"Objects", U"New", U"Create FilesInMemory from directory contents...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_FilesInMemory_createFromDirectoryContents);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read Sound from raw 16-bit Little Endian file...", U"Read from special sound file", 1,
 	                      DO_Sound_readFromRawFileLE);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read Sound from raw 16-bit Big Endian file...", L"Read Sound from raw 16-bit Little Endian file...", 1, DO_Sound_readFromRawFileBE);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read KlattTable from raw text file...", L"Read Matrix from raw text file...", praat_HIDDEN, DO_KlattTable_readFromRawTextFile);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read Sound from raw 16-bit Big Endian file...", U"Read Sound from raw 16-bit Little Endian file...", 1, DO_Sound_readFromRawFileBE);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read KlattTable from raw text file...", U"Read Matrix from raw text file...", praat_HIDDEN, DO_KlattTable_readFromRawTextFile);
 
-	praat_addAction1 (classActivation, 0, L"Modify", 0, 0, 0);
-	praat_addAction1 (classActivation, 0, L"Formula...", 0, 0,
+	praat_addAction1 (classActivation, 0, U"Modify", 0, 0, 0);
+	praat_addAction1 (classActivation, 0, U"Formula...", 0, 0,
 	                  DO_Activation_formula);
-	praat_addAction1 (classActivation, 0, L"Hack", 0, 0, 0);
-	praat_addAction1 (classActivation, 0, L"To Matrix", 0, 0,
+	praat_addAction1 (classActivation, 0, U"Hack", 0, 0, 0);
+	praat_addAction1 (classActivation, 0, U"To Matrix", 0, 0,
 	                  DO_Activation_to_Matrix);
 
-	praat_addAction2 (classActivation, 1, classCategories, 1, L"To TableOfReal", 0, 0, DO_Matrix_Categories_to_TableOfReal);
+	praat_addAction2 (classActivation, 1, classCategories, 1, U"To TableOfReal", 0, 0, DO_Matrix_Categories_to_TableOfReal);
 
-	praat_addAction1 (classBarkFilter, 0, L"BarkFilter help", 0, 0, DO_BarkFilter_help);
+	praat_addAction1 (classBarkFilter, 0, U"BarkFilter help", 0, 0, DO_BarkFilter_help);
 	praat_FilterBank_all_init (classBarkFilter);	// deprecated 2014
-	praat_addAction1 (classBarkFilter, 0, L"Draw spectrum (slice)...", L"Draw filters...", praat_DEPTH_1 + praat_HIDDEN, DO_BarkFilter_drawSpectrum);	// deprecated 2014
-	praat_addAction1 (classBarkFilter, 1, L"Draw filter functions...", L"Draw filters...", praat_DEPTH_1 + praat_HIDDEN, DO_BarkFilter_drawSekeyHansonFilterFunctions);	// deprecated 2014
-	praat_addAction1 (classBarkFilter, 0, L"Paint...", L"Draw filters...", praat_DEPTH_1 + praat_HIDDEN, DO_BarkFilter_paint);	// deprecated 2014
-	praat_addAction1 (classBarkFilter, 0, L"To BarkSpectrogram", 0, 0, DO_BarkFilter_to_BarkSpectrogram);
+	praat_addAction1 (classBarkFilter, 0, U"Draw spectrum (slice)...", U"Draw filters...", praat_DEPTH_1, DO_BarkFilter_drawSpectrum);	// deprecated 2014
+	praat_addAction1 (classBarkFilter, 1, U"Draw filter functions...", U"Draw filters...", praat_DEPTH_1, DO_BarkFilter_drawSekeyHansonFilterFunctions);	// deprecated 2014
+	praat_addAction1 (classBarkFilter, 0, U"Paint...", U"Draw filters...", praat_DEPTH_1, DO_BarkFilter_paint);	// deprecated 2014
+	praat_addAction1 (classBarkFilter, 0, U"To BarkSpectrogram", 0, 0, DO_BarkFilter_to_BarkSpectrogram);
 
-	praat_addAction1 (classBarkSpectrogram, 0, L"BarkSpectrogram help", 0, 0, DO_BarkSpectrogram_help);
+	praat_addAction1 (classBarkSpectrogram, 0, U"BarkSpectrogram help", 0, 0, DO_BarkSpectrogram_help);
 	praat_BandFilterSpectrogram_draw_init (classBarkSpectrogram);
-	praat_addAction1 (classBarkSpectrogram, 0, L"Paint image...", 0, 1, DO_BarkSpectrogram_paintImage);
-	praat_addAction1 (classBarkSpectrogram, 0, L"Draw Sekey-Hanson auditory filters...", 0, 1, DO_BarkSpectrogram_drawSekeyHansonAuditoryFilters);
-	praat_addAction1 (classBarkSpectrogram, 0, L"Draw spectrum at nearest time slice...", 0, 1, DO_BarkSpectrogram_drawSpectrumAtNearestTimeSlice);
+	praat_addAction1 (classBarkSpectrogram, 0, U"Paint image...", 0, 1, DO_BarkSpectrogram_paintImage);
+	praat_addAction1 (classBarkSpectrogram, 0, U"Draw Sekey-Hanson auditory filters...", 0, 1, DO_BarkSpectrogram_drawSekeyHansonAuditoryFilters);
+	praat_addAction1 (classBarkSpectrogram, 0, U"Draw spectrum at nearest time slice...", 0, 1, DO_BarkSpectrogram_drawSpectrumAtNearestTimeSlice);
 	praat_addAction1 (classBarkSpectrogram, 0, QUERY_BUTTON, 0, 0, 0);
 	praat_BandFilterSpectrogram_query_init (classBarkSpectrogram);
-	praat_addAction1 (classBarkSpectrogram, 0, L"Equalize intensities...", 0, 0, DO_BandFilterSpectrogram_equalizeIntensities);
-	praat_addAction1 (classBarkSpectrogram, 0, L"To Intensity", 0, 0, DO_BandFilterSpectrogram_to_Intensity);
-	praat_addAction1 (classBarkSpectrogram, 0, L"To Matrix...", 0, 0, DO_BandFilterSpectrogram_to_Matrix);
-	praat_addAction1 (classBarkSpectrogram, 2, L"Cross-correlate...", 0, 0, DO_BandFilterSpectrograms_crossCorrelate);
-	praat_addAction1 (classBarkSpectrogram, 2, L"Convolve...", 0, 0, DO_BandFilterSpectrograms_convolve);
+	praat_addAction1 (classBarkSpectrogram, 0, U"Equalize intensities...", 0, 0, DO_BandFilterSpectrogram_equalizeIntensities);
+	praat_addAction1 (classBarkSpectrogram, 0, U"To Intensity", 0, 0, DO_BandFilterSpectrogram_to_Intensity);
+	praat_addAction1 (classBarkSpectrogram, 0, U"To Matrix...", 0, 0, DO_BandFilterSpectrogram_to_Matrix);
+	praat_addAction1 (classBarkSpectrogram, 2, U"Cross-correlate...", 0, 0, DO_BandFilterSpectrograms_crossCorrelate);
+	praat_addAction1 (classBarkSpectrogram, 2, U"Convolve...", 0, 0, DO_BandFilterSpectrograms_convolve);
 	
 	
-	praat_addAction1 (classCategories, 0, L"Edit", 0, 0, DO_Categories_edit);
+	praat_addAction1 (classCategories, 0, U"Edit", 0, 0, DO_Categories_edit);
 	praat_addAction1 (classCategories, 0, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classCategories, 1, L"Get number of categories", QUERY_BUTTON, 1, DO_Categories_getNumberOfCategories);
-	praat_addAction1 (classCategories, 2, L"Get difference", QUERY_BUTTON, praat_HIDDEN | praat_DEPTH_1, DO_Categories_difference);
-	praat_addAction1 (classCategories, 2, L"Get number of differences", QUERY_BUTTON, 1, DO_Categories_getNumberOfDifferences);
-	praat_addAction1 (classCategories, 2, L"Get fraction different", QUERY_BUTTON, 1, DO_Categories_getFractionDifferent);
+	praat_addAction1 (classCategories, 1, U"Get number of categories", QUERY_BUTTON, 1, DO_Categories_getNumberOfCategories);
+	praat_addAction1 (classCategories, 2, U"Get difference", QUERY_BUTTON, praat_HIDDEN | praat_DEPTH_1, DO_Categories_difference);
+	praat_addAction1 (classCategories, 2, U"Get number of differences", QUERY_BUTTON, 1, DO_Categories_getNumberOfDifferences);
+	praat_addAction1 (classCategories, 2, U"Get fraction different", QUERY_BUTTON, 1, DO_Categories_getFractionDifferent);
 	praat_addAction1 (classCategories, 0, MODIFY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classCategories, 1, L"Append 1 category...", MODIFY_BUTTON,
+	praat_addAction1 (classCategories, 1, U"Append 1 category...", MODIFY_BUTTON,
 	                  1, DO_Categories_append);
-	praat_addAction1 (classCategories, 0, L"Extract", 0, 0, 0);
-	praat_addAction1 (classCategories, 0, L"To unique Categories", 0, 0,
+	praat_addAction1 (classCategories, 0, U"Extract", 0, 0, 0);
+	praat_addAction1 (classCategories, 0, U"To unique Categories", 0, 0,
 	                  DO_Categories_selectUniqueItems);
-	praat_addAction1 (classCategories, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classCategories, 2, L"To Confusion", 0, 0,
+	praat_addAction1 (classCategories, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classCategories, 2, U"To Confusion", 0, 0,
 	                  DO_Categories_to_Confusion);
-	praat_addAction1 (classCategories, 0, L"Synthesize", 0, 0, 0);
-	praat_addAction1 (classCategories, 2, L"Join", 0, 0, DO_Categories_join);
-	praat_addAction1 (classCategories, 0, L"Permute items", 0, 0, DO_Categories_permuteItems);
-	praat_addAction1 (classCategories, 0, L"To Strings", 0, 0,
+	praat_addAction1 (classCategories, 0, U"Synthesize", 0, 0, 0);
+	praat_addAction1 (classCategories, 2, U"Join", 0, 0, DO_Categories_join);
+	praat_addAction1 (classCategories, 0, U"Permute items", 0, 0, DO_Categories_permuteItems);
+	praat_addAction1 (classCategories, 0, U"To Strings", 0, 0,
 	                  DO_Categories_to_Strings);
 
-	praat_addAction1 (classChebyshevSeries, 0, L"ChebyshevSeries help", 0, 0,
+	praat_addAction1 (classChebyshevSeries, 0, U"ChebyshevSeries help", 0, 0,
 	                  DO_ChebyshevSeries_help);
 	praat_FunctionTerms_init (classChebyshevSeries);
-	praat_addAction1 (classChebyshevSeries, 0, L"To Polynomial", L"Analyse",
+	praat_addAction1 (classChebyshevSeries, 0, U"To Polynomial", U"Analyse",
 	                  0, DO_ChebyshevSeries_to_Polynomial);
 
-	praat_addAction1 (classCCA, 1, L"Draw eigenvector...", 0, 0,
+	praat_addAction1 (classCCA, 1, U"Draw eigenvector...", 0, 0,
 	                  DO_CCA_drawEigenvector);
-	praat_addAction1 (classCCA, 1, L"Get number of correlations", 0, 0,
+	praat_addAction1 (classCCA, 1, U"Get number of correlations", 0, 0,
 	                  DO_CCA_getNumberOfCorrelations);
-	praat_addAction1 (classCCA, 1, L"Get correlation...", 0, 0,
+	praat_addAction1 (classCCA, 1, U"Get correlation...", 0, 0,
 	                  DO_CCA_getCorrelationCoefficient);
-	praat_addAction1 (classCCA, 1, L"Get eigenvector element...", 0, 0, DO_CCA_getEigenvectorElement);
-	praat_addAction1 (classCCA, 1, L"Get zero correlation probability...", 0, 0, DO_CCA_getZeroCorrelationProbability);
+	praat_addAction1 (classCCA, 1, U"Get eigenvector element...", 0, 0, DO_CCA_getEigenvectorElement);
+	praat_addAction1 (classCCA, 1, U"Get zero correlation probability...", 0, 0, DO_CCA_getZeroCorrelationProbability);
 
-	praat_addAction2 (classCCA, 1, classTableOfReal, 1, L"To TableOfReal (scores)...",
+	praat_addAction2 (classCCA, 1, classTableOfReal, 1, U"To TableOfReal (scores)...",
 	                  0, 0, DO_CCA_and_TableOfReal_scores);
-	praat_addAction2 (classCCA, 1, classTableOfReal, 1, L"To TableOfReal (loadings)",
+	praat_addAction2 (classCCA, 1, classTableOfReal, 1, U"To TableOfReal (loadings)",
 	                  0, 0, DO_CCA_and_TableOfReal_factorLoadings);
-	praat_addAction2 (classCCA, 1, classTableOfReal, 1, L"Predict...", 0, 0,
+	praat_addAction2 (classCCA, 1, classTableOfReal, 1, U"Predict...", 0, 0,
 	                  DO_CCA_and_TableOfReal_predict);
-	praat_addAction2 (classCCA, 1, classCorrelation, 1, L"To TableOfReal (loadings)",
+	praat_addAction2 (classCCA, 1, classCorrelation, 1, U"To TableOfReal (loadings)",
 	                  0, 0, DO_CCA_and_Correlation_factorLoadings);
-	praat_addAction2 (classCCA, 1, classCorrelation, 1, L"Get variance fraction...",
+	praat_addAction2 (classCCA, 1, classCorrelation, 1, U"Get variance fraction...",
 	                  0, 0, DO_CCA_and_Correlation_getVarianceFraction);
-	praat_addAction2 (classCCA, 1, classCorrelation, 1, L"Get redundancy (sl)...",
+	praat_addAction2 (classCCA, 1, classCorrelation, 1, U"Get redundancy (sl)...",
 	                  0, 0, DO_CCA_and_Correlation_getRedundancy_sl);
-
-	praat_addAction1 (classConfusion, 0, L"Confusion help", 0, 0,
-	                  DO_Confusion_help);
+	
+	
+	praat_addAction1 (classComplexSpectrogram, 0, U"ComplexSpectrogram help", 0, 0, DO_ComplexSpectrogram_help);
+	praat_addAction1 (classComplexSpectrogram, 0, DRAW_BUTTON, 0, 0, 0);
+	praat_addAction1 (classComplexSpectrogram, 0, U"To Sound...", 0, 0, DO_ComplexSpectrogram_to_Sound);
+	praat_addAction1 (classComplexSpectrogram, 0, U"Down to Spectrogram", 0, 0, DO_ComplexSpectrogram_to_Spectrogram);
+	praat_addAction1 (classComplexSpectrogram, 0, U"To Spectrum (slice)...", 0, 0, DO_ComplexSpectrogram_to_Spectrum);
+	//praat_addAction1 (classComplexSpectrogram, 0, U"Paint...", 0, 1, DO_Spectrogram_paint);
+
+	praat_addAction1 (classConfusion, 0, U"Confusion help", 0, 0, DO_Confusion_help);
 	praat_TableOfReal_init2 (classConfusion);
-	praat_removeAction (classConfusion, NULL, NULL, L"Draw as numbers...");
-	praat_removeAction (classConfusion, NULL, NULL, L"Sort by label...");
-	praat_removeAction (classConfusion, NULL, NULL, L"Sort by column...");
-	praat_addAction1 (classConfusion, 0, L"Draw as numbers...", L"Draw -", 1, DO_Confusion_drawAsNumbers);
-	praat_addAction1 (classConfusion, 1, L"Get value (labels)...", L"Get value...", 1, DO_Confusion_getValue);
-	praat_addAction1 (classConfusion, 0, L"-- confusion statistics --", L"Get value (labels)...", 1, 0);
-	praat_addAction1 (classConfusion, 1, L"Get fraction correct", L"-- confusion statistics --", 1, DO_Confusion_getFractionCorrect);
-	praat_addAction1 (classConfusion, 1, L"Get stimulus sum...", L"Get fraction correct", 1, DO_Confusion_getStimulusSum);
-	praat_addAction1 (classConfusion, 1, L"Get row sum...", L"Get fraction correct", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_getRowSum);
-	praat_addAction1 (classConfusion, 1, L"Get response sum...", L"Get stimulus sum...", 1, DO_Confusion_getResponseSum);
-	praat_addAction1 (classConfusion, 1, L"Get column sum...", L"Get row sum...", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_getColumnSum);
-	praat_addAction1 (classConfusion, 1, L"Get grand sum", L"Get response sum...", 1, DO_TableOfReal_getGrandSum);
-	praat_addAction1 (classConfusion, 0, L"Increase...", L"Formula...", 1, DO_Confusion_increase);
-	praat_addAction1 (classConfusion, 0, L"To TableOfReal (marginals)", L"To TableOfReal", 0, DO_Confusion_to_TableOfReal_marginals);
-	praat_addAction1 (classConfusion, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classConfusion, 0, L"Condense...", 0, praat_HIDDEN, DO_Confusion_condense);
-	praat_addAction1 (classConfusion, 0, L"Group...", 0, 0, DO_Confusion_group);
-	praat_addAction1 (classConfusion, 0, L"Group stimuli...", 0, 0, DO_Confusion_groupStimuli);
-	praat_addAction1 (classConfusion, 0, L"Group responses...", 0, 0, DO_Confusion_groupResponses);
-	praat_addAction1 (classConfusion, 2, L"To difference matrix", 0, 0,
+	praat_removeAction (classConfusion, nullptr, nullptr, U"Draw as numbers...");
+	praat_removeAction (classConfusion, nullptr, nullptr, U"Sort by label...");
+	praat_removeAction (classConfusion, nullptr, nullptr, U"Sort by column...");
+	praat_addAction1 (classConfusion, 0, U"Draw as numbers...", U"Draw -", 1, DO_Confusion_drawAsNumbers);
+	praat_addAction1 (classConfusion, 1, U"Get value (labels)...", U"Get value...", 1, DO_Confusion_getValue);
+	praat_addAction1 (classConfusion, 0, U"-- confusion statistics --", U"Get value (labels)...", 1, 0);
+	praat_addAction1 (classConfusion, 1, U"Get fraction correct", U"-- confusion statistics --", 1, DO_Confusion_getFractionCorrect);
+	praat_addAction1 (classConfusion, 1, U"Get stimulus sum...", U"Get fraction correct", 1, DO_Confusion_getStimulusSum);
+	praat_addAction1 (classConfusion, 1, U"Get row sum...", U"Get fraction correct", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_getRowSum);
+	praat_addAction1 (classConfusion, 1, U"Get response sum...", U"Get stimulus sum...", 1, DO_Confusion_getResponseSum);
+	praat_addAction1 (classConfusion, 1, U"Get column sum...", U"Get row sum...", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_getColumnSum);
+	praat_addAction1 (classConfusion, 1, U"Get grand sum", U"Get response sum...", 1, DO_TableOfReal_getGrandSum);
+	praat_addAction1 (classConfusion, 0, U"Increase...", U"Formula...", 1, DO_Confusion_increase);
+	praat_addAction1 (classConfusion, 0, U"To TableOfReal (marginals)", U"To TableOfReal", 0, DO_Confusion_to_TableOfReal_marginals);
+	praat_addAction1 (classConfusion, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classConfusion, 0, U"Condense...", 0, praat_HIDDEN, DO_Confusion_condense);
+	praat_addAction1 (classConfusion, 0, U"Group...", 0, 0, DO_Confusion_group);
+	praat_addAction1 (classConfusion, 0, U"Group stimuli...", 0, 0, DO_Confusion_groupStimuli);
+	praat_addAction1 (classConfusion, 0, U"Group responses...", 0, 0, DO_Confusion_groupResponses);
+	praat_addAction1 (classConfusion, 2, U"To difference matrix", 0, 0,
 	                  DO_Confusion_difference);
 	
-	praat_addAction2 (classConfusion, 1, classClassificationTable, 1, L"Increase confusion count", 0, 0, DO_Confusion_and_ClassificationTable_increase);
+	praat_addAction2 (classConfusion, 1, classClassificationTable, 1, U"Increase confusion count", 0, 0, DO_Confusion_and_ClassificationTable_increase);
 
-	praat_addAction2 (classConfusion, 1, classMatrix, 1, L"Draw", 0, 0, 0);
-	praat_addAction2 (classConfusion, 1, classMatrix, 1, L"Draw confusion...",
+	praat_addAction2 (classConfusion, 1, classMatrix, 1, U"Draw", 0, 0, 0);
+	praat_addAction2 (classConfusion, 1, classMatrix, 1, U"Draw confusion...",
 	                  0, 0, DO_Confusion_Matrix_draw);
 
-	praat_addAction1 (classCovariance, 0, L"Covariance help", 0, 0,
+	praat_addAction1 (classCovariance, 0, U"Covariance help", 0, 0,
 	                  DO_Covariance_help);
 	praat_SSCP_as_TableOfReal_init (classCovariance);
 	praat_SSCP_query_init (classCovariance);
 	praat_SSCP_extract_init (classCovariance);
-	praat_addAction1 (classCovariance, 1, L"Get probability at position...", L"Get value...", 1, DO_Covariance_getProbabilityAtPosition);
-	praat_addAction1 (classCovariance, 1, L"Get diagonality (bartlett)...", L"Get ln(determinant)", 1, DO_SSCP_testDiagonality_bartlett);
-	praat_addAction1 (classCovariance, 1, L"Get significance of one mean...", L"Get diagonality (bartlett)...", 1, DO_Covariance_getSignificanceOfOneMean);
-	praat_addAction1 (classCovariance, 1, L"Get significance of means difference...", L"Get significance of one mean...", 1, DO_Covariance_getSignificanceOfMeansDifference);
-	praat_addAction1 (classCovariance, 1, L"Get significance of one variance...", L"Get significance of means difference...", 1, DO_Covariance_getSignificanceOfOneVariance);
-	praat_addAction1 (classCovariance, 1, L"Get significance of variances ratio...", L"Get significance of one variance...", 1, DO_Covariance_getSignificanceOfVariancesRatio);
-	praat_addAction1 (classCovariance, 1, L"Get fraction variance...", L"Get significance of variances ratio...", 1, DO_Covariance_getFractionVariance);
-	praat_addAction1 (classCovariance, 2, L"Report multivariate mean difference...", L"Get fraction variance...", 1, DO_Covariances_reportMultivariateMeanDifference);
-	praat_addAction1 (classCovariance, 2, L"Difference", L"Report multivariate mean difference...", praat_DEPTH_1 | praat_HIDDEN, DO_Covariances_reportEquality);
-	praat_addAction1 (classCovariance, 0, L"Report equality of covariances", L"Report multivariate mean difference...", praat_DEPTH_1 | praat_HIDDEN, DO_Covariances_reportEquality);
+	praat_addAction1 (classCovariance, 1, U"Get probability at position...", U"Get value...", 1, DO_Covariance_getProbabilityAtPosition);
+	praat_addAction1 (classCovariance, 1, U"Get diagonality (bartlett)...", U"Get ln(determinant)", 1, DO_SSCP_testDiagonality_bartlett);
+	praat_addAction1 (classCovariance, 1, U"Get significance of one mean...", U"Get diagonality (bartlett)...", 1, DO_Covariance_getSignificanceOfOneMean);
+	praat_addAction1 (classCovariance, 1, U"Get significance of means difference...", U"Get significance of one mean...", 1, DO_Covariance_getSignificanceOfMeansDifference);
+	praat_addAction1 (classCovariance, 1, U"Get significance of one variance...", U"Get significance of means difference...", 1, DO_Covariance_getSignificanceOfOneVariance);
+	praat_addAction1 (classCovariance, 1, U"Get significance of variances ratio...", U"Get significance of one variance...", 1, DO_Covariance_getSignificanceOfVariancesRatio);
+	praat_addAction1 (classCovariance, 1, U"Get fraction variance...", U"Get significance of variances ratio...", 1, DO_Covariance_getFractionVariance);
+	praat_addAction1 (classCovariance, 2, U"Report multivariate mean difference...", U"Get fraction variance...", 1, DO_Covariances_reportMultivariateMeanDifference);
+	praat_addAction1 (classCovariance, 2, U"Difference", U"Report multivariate mean difference...", praat_DEPTH_1 | praat_HIDDEN, DO_Covariances_reportEquality);
+	praat_addAction1 (classCovariance, 0, U"Report equality of covariances", U"Report multivariate mean difference...", praat_DEPTH_1 | praat_HIDDEN, DO_Covariances_reportEquality);
 
-	praat_addAction1 (classCovariance, 0, L"To TableOfReal (random sampling)...", 0, 0, DO_Covariance_to_TableOfReal_randomSampling);
+	praat_addAction1 (classCovariance, 0, U"To TableOfReal (random sampling)...", 0, 0, DO_Covariance_to_TableOfReal_randomSampling);
 
-	praat_addAction1 (classCovariance, 0, L"To Correlation", 0, 0, DO_Covariance_to_Correlation);
-	praat_addAction1 (classCovariance, 0, L"To PCA", 0, 0, DO_Covariance_to_PCA);
+	praat_addAction1 (classCovariance, 0, U"To Correlation", 0, 0, DO_Covariance_to_Correlation);
+	praat_addAction1 (classCovariance, 0, U"To PCA", 0, 0, DO_Covariance_to_PCA);
 
-	praat_addAction2 (classCovariance, 1, classTableOfReal, 1, L"To TableOfReal (mahalanobis)...", 0, 0, DO_Covariance_and_TableOfReal_mahalanobis);
+	praat_addAction2 (classCovariance, 1, classTableOfReal, 1, U"To TableOfReal (mahalanobis)...", 0, 0, DO_Covariance_and_TableOfReal_mahalanobis);
 
-	praat_addAction1 (classClassificationTable, 0, L"ClassificationTable help", 0, 0, DO_ClassificationTable_help);
+	praat_addAction1 (classClassificationTable, 0, U"ClassificationTable help", 0, 0, DO_ClassificationTable_help);
 	praat_TableOfReal_init (classClassificationTable);
-	praat_addAction1 (classClassificationTable, 0, L"Get class index at maximum in row...", L"Get column index...", 1, DO_ClassificationTable_getClassIndexAtMaximumInRow);
-	praat_addAction1 (classClassificationTable, 0, L"Get class label at maximum in row...",L"Get class index at maximum in row...", 1, DO_ClassificationTable_getClassLabelAtMaximumInRow);
-	praat_addAction1 (classClassificationTable, 0, L"To Confusion", 0, praat_HIDDEN, DO_ClassificationTable_to_Confusion_old); // deprecated 2014
-	praat_addAction1 (classClassificationTable, 0, L"To Confusion...", 0, 0, DO_ClassificationTable_to_Confusion);
-	praat_addAction1 (classClassificationTable, 0, L"To Correlation (columns)", 0, 0, DO_ClassificationTable_to_Correlation_columns);
-	praat_addAction1 (classClassificationTable, 0, L"To Strings (max. prob.)", 0, 0, DO_ClassificationTable_to_Strings_maximumProbability);
-
-	praat_addAction1 (classCorrelation, 0, L"Correlation help", 0, 0, DO_Correlation_help);
+	praat_addAction1 (classClassificationTable, 0, U"Get class index at maximum in row...", U"Get column index...", 1, DO_ClassificationTable_getClassIndexAtMaximumInRow);
+	praat_addAction1 (classClassificationTable, 0, U"Get class label at maximum in row...", U"Get class index at maximum in row...", 1, DO_ClassificationTable_getClassLabelAtMaximumInRow);
+	praat_addAction1 (classClassificationTable, 0, U"To Confusion", 0, praat_HIDDEN, DO_ClassificationTable_to_Confusion_old); // deprecated 2014
+	praat_addAction1 (classClassificationTable, 0, U"To Confusion...", 0, 0, DO_ClassificationTable_to_Confusion);
+	praat_addAction1 (classClassificationTable, 0, U"To Correlation (columns)", 0, 0, DO_ClassificationTable_to_Correlation_columns);
+	praat_addAction1 (classClassificationTable, 0, U"To Strings (max. prob.)", 0, 0, DO_ClassificationTable_to_Strings_maximumProbability);
+
+	praat_addAction1 (classCorrelation, 0, U"Correlation help", 0, 0, DO_Correlation_help);
 	praat_TableOfReal_init2 (classCorrelation);
 	praat_SSCP_query_init (classCorrelation);
 	praat_SSCP_extract_init (classCorrelation);
-	praat_addAction1 (classCorrelation, 1, L"Get diagonality (bartlett)...", L"Get ln(determinant)", 1, DO_Correlation_testDiagonality_bartlett);
-	praat_addAction1 (classCorrelation, 0, L"Confidence intervals...", 0, 0, DO_Correlation_confidenceIntervals);
-	praat_addAction1 (classCorrelation, 0, L"To PCA", 0, 0, DO_Correlation_to_PCA);
+	praat_addAction1 (classCorrelation, 1, U"Get diagonality (bartlett)...", U"Get ln(determinant)", 1, DO_Correlation_testDiagonality_bartlett);
+	praat_addAction1 (classCorrelation, 0, U"Confidence intervals...", 0, 0, DO_Correlation_confidenceIntervals);
+	praat_addAction1 (classCorrelation, 0, U"To PCA", 0, 0, DO_Correlation_to_PCA);
 
-	praat_addAction1 (classDiscriminant, 0, L"Discriminant help", 0, 0, DO_Discriminant_help);
+	praat_addAction1 (classDiscriminant, 0, U"Discriminant help", 0, 0, DO_Discriminant_help);
 	praat_addAction1 (classDiscriminant, 0, DRAW_BUTTON, 0, 0, 0);
 	praat_Eigen_draw_init (classDiscriminant);
-	praat_addAction1 (classDiscriminant, 0, L"-- sscps --", 0, 1, 0);
-	praat_addAction1 (classDiscriminant, 0, L"Draw sigma ellipses...", 0, 1, DO_Discriminant_drawSigmaEllipses);
-	praat_addAction1 (classDiscriminant, 0, L"Draw one sigma ellipse...", 0, 1, DO_Discriminant_drawOneSigmaEllipse);
-	praat_addAction1 (classDiscriminant, 0, L"Draw confidence ellipses...", 0, 1, DO_Discriminant_drawConfidenceEllipses);
+	praat_addAction1 (classDiscriminant, 0, U"-- sscps --", 0, 1, 0);
+	praat_addAction1 (classDiscriminant, 0, U"Draw sigma ellipses...", 0, 1, DO_Discriminant_drawSigmaEllipses);
+	praat_addAction1 (classDiscriminant, 0, U"Draw one sigma ellipse...", 0, 1, DO_Discriminant_drawOneSigmaEllipse);
+	praat_addAction1 (classDiscriminant, 0, U"Draw confidence ellipses...", 0, 1, DO_Discriminant_drawConfidenceEllipses);
 
 	praat_addAction1 (classDiscriminant, 1, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classDiscriminant, 1, L"-- eigen structure --", 0, 1, 0);
+	praat_addAction1 (classDiscriminant, 1, U"-- eigen structure --", 0, 1, 0);
 	praat_Eigen_query_init (classDiscriminant);
-	praat_addAction1 (classDiscriminant, 1, L"-- discriminant --", 0, 1, 0);
-	praat_addAction1 (classDiscriminant, 1, L"Get number of functions", 0, 1, DO_Discriminant_getNumberOfFunctions);
-	praat_addAction1 (classDiscriminant, 1, L"Get dimension of functions", 0, 1, DO_Discriminant_getDimensionOfFunctions);
-	praat_addAction1 (classDiscriminant, 1, L"Get number of groups", 0, 1, DO_Discriminant_getNumberOfGroups);
-	praat_addAction1 (classDiscriminant, 1, L"Get number of observations...", 0, 1, DO_Discriminant_getNumberOfObservations);
-	praat_addAction1 (classDiscriminant, 1, L"-- tests --", 0, 1, 0);
-	praat_addAction1 (classDiscriminant, 1, L"Get Wilks lambda...", 0, 1, DO_Discriminant_getWilksLambda);
-	praat_addAction1 (classDiscriminant, 1, L"Get cumulative contribution of components...", 0, 1, DO_Discriminant_getCumulativeContributionOfComponents);
-	praat_addAction1 (classDiscriminant, 1, L"Get partial discrimination probability...", 0, 1,
+	praat_addAction1 (classDiscriminant, 1, U"-- discriminant --", 0, 1, 0);
+	praat_addAction1 (classDiscriminant, 1, U"Get number of functions", 0, 1, DO_Discriminant_getNumberOfFunctions);
+	praat_addAction1 (classDiscriminant, 1, U"Get dimension of functions", 0, 1, DO_Discriminant_getDimensionOfFunctions);
+	praat_addAction1 (classDiscriminant, 1, U"Get number of groups", 0, 1, DO_Discriminant_getNumberOfGroups);
+	praat_addAction1 (classDiscriminant, 1, U"Get number of observations...", 0, 1, DO_Discriminant_getNumberOfObservations);
+	praat_addAction1 (classDiscriminant, 1, U"-- tests --", 0, 1, 0);
+	praat_addAction1 (classDiscriminant, 1, U"Get Wilks lambda...", 0, 1, DO_Discriminant_getWilksLambda);
+	praat_addAction1 (classDiscriminant, 1, U"Get cumulative contribution of components...", 0, 1, DO_Discriminant_getCumulativeContributionOfComponents);
+	praat_addAction1 (classDiscriminant, 1, U"Get partial discrimination probability...", 0, 1,
 	                  DO_Discriminant_getPartialDiscriminationProbability);
-	praat_addAction1 (classDiscriminant, 1, L"Get homogeneity of covariances (box)", 0, praat_DEPTH_1 | praat_HIDDEN,
+	praat_addAction1 (classDiscriminant, 1, U"Get homogeneity of covariances (box)", 0, praat_DEPTH_1 | praat_HIDDEN,
 	                  DO_Discriminant_getHomegeneityOfCovariances_box);
-	praat_addAction1 (classDiscriminant, 1, L"Report equality of covariance matrices", 0, 1,
+	praat_addAction1 (classDiscriminant, 1, U"Report equality of covariance matrices", 0, 1,
 	                  DO_Discriminant_reportEqualityOfCovariances_wald);
-	praat_addAction1 (classDiscriminant, 1, L"-- ellipses --", 0, 1, 0);
-	praat_addAction1 (classDiscriminant, 1, L"Get sigma ellipse area...", 0, 1, DO_Discriminant_getConcentrationEllipseArea);
-	praat_addAction1 (classDiscriminant, 1, L"Get confidence ellipse area...", 0, 1, DO_Discriminant_getConfidenceEllipseArea);
-	praat_addAction1 (classDiscriminant, 1, L"Get ln(determinant_group)...", 0, 1, DO_Discriminant_getLnDeterminant_group);
-	praat_addAction1 (classDiscriminant, 1, L"Get ln(determinant_total)", 0, 1, DO_Discriminant_getLnDeterminant_total);
+	praat_addAction1 (classDiscriminant, 1, U"-- ellipses --", 0, 1, 0);
+	praat_addAction1 (classDiscriminant, 1, U"Get sigma ellipse area...", 0, 1, DO_Discriminant_getConcentrationEllipseArea);
+	praat_addAction1 (classDiscriminant, 1, U"Get confidence ellipse area...", 0, 1, DO_Discriminant_getConfidenceEllipseArea);
+	praat_addAction1 (classDiscriminant, 1, U"Get ln(determinant_group)...", 0, 1, DO_Discriminant_getLnDeterminant_group);
+	praat_addAction1 (classDiscriminant, 1, U"Get ln(determinant_total)", 0, 1, DO_Discriminant_getLnDeterminant_total);
 
 	praat_addAction1 (classDiscriminant, 0, MODIFY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classDiscriminant, 1, L"Invert eigenvector...", 0, 1, DO_Discriminant_invertEigenvector);
-	praat_addAction1 (classDiscriminant, 0, L"Align eigenvectors", 0, 1, DO_Eigens_alignEigenvectors);
+	praat_addAction1 (classDiscriminant, 1, U"Invert eigenvector...", 0, 1, DO_Discriminant_invertEigenvector);
+	praat_addAction1 (classDiscriminant, 0, U"Align eigenvectors", 0, 1, DO_Eigens_alignEigenvectors);
 
 	praat_addAction1 (classDiscriminant, 0, EXTRACT_BUTTON, 0, 0, 0);
-	praat_addAction1 (classDiscriminant, 1, L"Extract pooled within-groups SSCP", 0, 1,
+	praat_addAction1 (classDiscriminant, 1, U"Extract pooled within-groups SSCP", 0, 1,
 	                  DO_Discriminant_extractPooledWithinGroupsSSCP);
-	praat_addAction1 (classDiscriminant, 1, L"Extract within-group SSCP...", 0, 1, DO_Discriminant_extractWithinGroupSSCP);
-	praat_addAction1 (classDiscriminant, 1, L"Extract between-groups SSCP", 0, 1, DO_Discriminant_extractBetweenGroupsSSCP);
-	praat_addAction1 (classDiscriminant, 1, L"Extract group centroids", 0, 1, DO_Discriminant_extractGroupCentroids);
-	praat_addAction1 (classDiscriminant, 1, L"Extract group standard deviations", 0, 1, DO_Discriminant_extractGroupStandardDeviations);
-	praat_addAction1 (classDiscriminant, 1, L"Extract group labels", 0, 1, DO_Discriminant_extractGroupLabels);
+	praat_addAction1 (classDiscriminant, 1, U"Extract within-group SSCP...", 0, 1, DO_Discriminant_extractWithinGroupSSCP);
+	praat_addAction1 (classDiscriminant, 1, U"Extract between-groups SSCP", 0, 1, DO_Discriminant_extractBetweenGroupsSSCP);
+	praat_addAction1 (classDiscriminant, 1, U"Extract group centroids", 0, 1, DO_Discriminant_extractGroupCentroids);
+	praat_addAction1 (classDiscriminant, 1, U"Extract group standard deviations", 0, 1, DO_Discriminant_extractGroupStandardDeviations);
+	praat_addAction1 (classDiscriminant, 1, U"Extract group labels", 0, 1, DO_Discriminant_extractGroupLabels);
 
-	praat_addAction1 (classDiscriminant , 0, L"& TableOfReal: To ClassificationTable?", 0, 0, DO_hint_Discriminant_and_TableOfReal_to_ClassificationTable);
+	praat_addAction1 (classDiscriminant , 0, U"& TableOfReal: To ClassificationTable?", 0, 0, DO_hint_Discriminant_and_TableOfReal_to_ClassificationTable);
 
-	/*		praat_addAction1 (classDiscriminant, 1, L"Extract coefficients...", 0, 1, DO_Discriminant_extractCoefficients);*/
+	/*		praat_addAction1 (classDiscriminant, 1, U"Extract coefficients...", 0, 1, DO_Discriminant_extractCoefficients);*/
 
 
 	praat_Eigen_Spectrogram_project (classDiscriminant, classSpectrogram);
@@ -8325,261 +8571,261 @@ void praat_uvafon_David_init () {
 	praat_Eigen_Matrix_project (classDiscriminant, classBarkFilter); // deprecated 2014
 	praat_Eigen_Matrix_project (classDiscriminant, classMelFilter); // deprecated 2014
 
-	praat_addAction2 (classDiscriminant, 1, classPattern, 1, L"To Categories...", 0, 0, DO_Discriminant_and_Pattern_to_Categories);
-	praat_addAction2 (classDiscriminant, 1, classSSCP, 1, L"Project", 0, 0, DO_Eigen_and_SSCP_project);
-	praat_addAction2 (classDiscriminant, 1, classStrings, 1, L"Modify Discriminant", 0, 0, 0);
-	praat_addAction2 (classDiscriminant, 1, classStrings, 1, L"Set group labels", 0, 0, DO_Discriminant_setGroupLabels);
+	praat_addAction2 (classDiscriminant, 1, classPattern, 1, U"To Categories...", 0, 0, DO_Discriminant_and_Pattern_to_Categories);
+	praat_addAction2 (classDiscriminant, 1, classSSCP, 1, U"Project", 0, 0, DO_Eigen_and_SSCP_project);
+	praat_addAction2 (classDiscriminant, 1, classStrings, 1, U"Modify Discriminant", 0, 0, 0);
+	praat_addAction2 (classDiscriminant, 1, classStrings, 1, U"Set group labels", 0, 0, DO_Discriminant_setGroupLabels);
 
-	praat_addAction2 (classDiscriminant, 1, classTableOfReal, 1, L"To Configuration...", 0, 0, DO_Discriminant_and_TableOfReal_to_Configuration);
-	praat_addAction2 (classDiscriminant, 1, classTableOfReal, 1, L"To ClassificationTable...", 0, 0,
+	praat_addAction2 (classDiscriminant, 1, classTableOfReal, 1, U"To Configuration...", 0, 0, DO_Discriminant_and_TableOfReal_to_Configuration);
+	praat_addAction2 (classDiscriminant, 1, classTableOfReal, 1, U"To ClassificationTable...", 0, 0,
 	                  DO_Discriminant_and_TableOfReal_to_ClassificationTable);
-	praat_addAction2 (classDiscriminant, 1, classTableOfReal, 1, L"To TableOfReal (mahalanobis)...", 0, 0, DO_Discriminant_and_TableOfReal_mahalanobis);
+	praat_addAction2 (classDiscriminant, 1, classTableOfReal, 1, U"To TableOfReal (mahalanobis)...", 0, 0, DO_Discriminant_and_TableOfReal_mahalanobis);
 
 
-	praat_addAction1 (classDTW, 0, L"DTW help", 0, 0, DO_DTW_help);
+	praat_addAction1 (classDTW, 0, U"DTW help", 0, 0, DO_DTW_help);
 	praat_addAction1 (classDTW, 0, DRAW_BUTTON, 0, 0, 0);
-	praat_addAction1 (classDTW, 0, L"Draw path...", 0, 1, DO_DTW_drawPath);
-	praat_addAction1 (classDTW, 0, L"Paint distances...", 0, 1, DO_DTW_paintDistances);
-	praat_addAction1 (classDTW, 0, L"Draw warp (x)...", 0, 1, DO_DTW_drawWarpX);
+	praat_addAction1 (classDTW, 0, U"Draw path...", 0, 1, DO_DTW_drawPath);
+	praat_addAction1 (classDTW, 0, U"Paint distances...", 0, 1, DO_DTW_paintDistances);
+	praat_addAction1 (classDTW, 0, U"Draw warp (x)...", 0, 1, DO_DTW_drawWarpX);
 	praat_addAction1 (classDTW, 0, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classDTW, 1, L"Query time domains", 0, 1, 0);
-	praat_addAction1 (classDTW, 1, L"Get start time (x)", 0, 2, DO_DTW_getStartTimeX);
-	praat_addAction1 (classDTW, 1, L"Get end time (x)", 0, 2, DO_DTW_getEndTimeX);
-	praat_addAction1 (classDTW, 1, L"Get total duration (x)", 0, 2, DO_DTW_getTotalDurationX);
-	praat_addAction1 (classDTW, 1, L"-- time domain x from y separator --", 0, 2, 0);
-	praat_addAction1 (classDTW, 1, L"Get start time (y)", 0, 2, DO_DTW_getStartTimeY);
-	praat_addAction1 (classDTW, 1, L"Get end time (y)", 0, 2, DO_DTW_getEndTimeY);
-	praat_addAction1 (classDTW, 1, L"Get total duration (y)", 0, 2, DO_DTW_getTotalDurationY);
-	praat_addAction1 (classDTW, 1, L"Query time samplings", 0, 1, 0);
-	praat_addAction1 (classDTW, 1, L"Get number of frames (x)", 0, 2, DO_DTW_getNumberOfFramesX);
-	praat_addAction1 (classDTW, 1, L"Get time step (x)", 0, 2, DO_DTW_getTimeStepX);
-	praat_addAction1 (classDTW, 1, L"Get time from frame number (x)...", 0, 2, DO_DTW_getTimeFromFrameNumberX);
-	praat_addAction1 (classDTW, 1, L"Get frame number from time (x)...", 0, 2, DO_DTW_getFrameNumberFromTimeX);
-	praat_addAction1 (classDTW, 1, L"-- time sampling x from y separator --", 0, 2, 0);
-	praat_addAction1 (classDTW, 1, L"Get number of frames (y)", 0, 2, DO_DTW_getNumberOfFramesY);
-	praat_addAction1 (classDTW, 1, L"Get time step (y)", 0, 2, DO_DTW_getTimeStepY);
-	praat_addAction1 (classDTW, 1, L"Get time from frame number (y)...", 0, 2, DO_DTW_getTimeFromFrameNumberY);
-	praat_addAction1 (classDTW, 1, L"Get frame number from time (y)...", 0, 2, DO_DTW_getFrameNumberFromTimeY);
-
-	praat_addAction1 (classDTW, 1, L"Get y time from x time...", 0, 1, DO_DTW_getYTimeFromXTime);
-	praat_addAction1 (classDTW, 1, L"Get x time from y time...", 0, 1, DO_DTW_getXTimeFromYTime);
-	praat_addAction1 (classDTW, 1, L"Get y time...", 0, praat_HIDDEN + praat_DEPTH_1, DO_DTW_getYTimeFromXTime);
-	praat_addAction1 (classDTW, 1, L"Get x time...", 0, praat_HIDDEN + praat_DEPTH_1, DO_DTW_getXTimeFromYTime);
-	praat_addAction1 (classDTW, 1, L"Get maximum consecutive steps...", 0, 1, DO_DTW_getMaximumConsecutiveSteps);
-	praat_addAction1 (classDTW, 1, L"Get time along path...", 0, praat_DEPTH_1 | praat_HIDDEN, DO_DTW_getPathY);
-	praat_addAction1 (classDTW, 1, L"-- distance queries --", 0, 1, 0);
-	praat_addAction1 (classDTW, 1, L"Get distance value...", 0, 1, DO_DTW_getDistanceValue);
-	praat_addAction1 (classDTW, 1, L"Get minimum distance", 0, 1, DO_DTW_getMinimumDistance);
-	praat_addAction1 (classDTW, 1, L"Get maximum distance", 0, 1, DO_DTW_getMaximumDistance);
-	praat_addAction1 (classDTW, 1, L"Get distance (weighted)", 0, 1, DO_DTW_getWeightedDistance);
+	praat_addAction1 (classDTW, 1, U"Query time domains", 0, 1, 0);
+	praat_addAction1 (classDTW, 1, U"Get start time (x)", 0, 2, DO_DTW_getStartTimeX);
+	praat_addAction1 (classDTW, 1, U"Get end time (x)", 0, 2, DO_DTW_getEndTimeX);
+	praat_addAction1 (classDTW, 1, U"Get total duration (x)", 0, 2, DO_DTW_getTotalDurationX);
+	praat_addAction1 (classDTW, 1, U"-- time domain x from y separator --", 0, 2, 0);
+	praat_addAction1 (classDTW, 1, U"Get start time (y)", 0, 2, DO_DTW_getStartTimeY);
+	praat_addAction1 (classDTW, 1, U"Get end time (y)", 0, 2, DO_DTW_getEndTimeY);
+	praat_addAction1 (classDTW, 1, U"Get total duration (y)", 0, 2, DO_DTW_getTotalDurationY);
+	praat_addAction1 (classDTW, 1, U"Query time samplings", 0, 1, 0);
+	praat_addAction1 (classDTW, 1, U"Get number of frames (x)", 0, 2, DO_DTW_getNumberOfFramesX);
+	praat_addAction1 (classDTW, 1, U"Get time step (x)", 0, 2, DO_DTW_getTimeStepX);
+	praat_addAction1 (classDTW, 1, U"Get time from frame number (x)...", 0, 2, DO_DTW_getTimeFromFrameNumberX);
+	praat_addAction1 (classDTW, 1, U"Get frame number from time (x)...", 0, 2, DO_DTW_getFrameNumberFromTimeX);
+	praat_addAction1 (classDTW, 1, U"-- time sampling x from y separator --", 0, 2, 0);
+	praat_addAction1 (classDTW, 1, U"Get number of frames (y)", 0, 2, DO_DTW_getNumberOfFramesY);
+	praat_addAction1 (classDTW, 1, U"Get time step (y)", 0, 2, DO_DTW_getTimeStepY);
+	praat_addAction1 (classDTW, 1, U"Get time from frame number (y)...", 0, 2, DO_DTW_getTimeFromFrameNumberY);
+	praat_addAction1 (classDTW, 1, U"Get frame number from time (y)...", 0, 2, DO_DTW_getFrameNumberFromTimeY);
+
+	praat_addAction1 (classDTW, 1, U"Get y time from x time...", 0, 1, DO_DTW_getYTimeFromXTime);
+	praat_addAction1 (classDTW, 1, U"Get x time from y time...", 0, 1, DO_DTW_getXTimeFromYTime);
+	praat_addAction1 (classDTW, 1, U"Get y time...", 0, praat_HIDDEN + praat_DEPTH_1, DO_DTW_getYTimeFromXTime);
+	praat_addAction1 (classDTW, 1, U"Get x time...", 0, praat_HIDDEN + praat_DEPTH_1, DO_DTW_getXTimeFromYTime);
+	praat_addAction1 (classDTW, 1, U"Get maximum consecutive steps...", 0, 1, DO_DTW_getMaximumConsecutiveSteps);
+	praat_addAction1 (classDTW, 1, U"Get time along path...", 0, praat_DEPTH_1 | praat_HIDDEN, DO_DTW_getPathY);
+	praat_addAction1 (classDTW, 1, U"-- distance queries --", 0, 1, 0);
+	praat_addAction1 (classDTW, 1, U"Get distance value...", 0, 1, DO_DTW_getDistanceValue);
+	praat_addAction1 (classDTW, 1, U"Get minimum distance", 0, 1, DO_DTW_getMinimumDistance);
+	praat_addAction1 (classDTW, 1, U"Get maximum distance", 0, 1, DO_DTW_getMaximumDistance);
+	praat_addAction1 (classDTW, 1, U"Get distance (weighted)", 0, 1, DO_DTW_getWeightedDistance);
 	praat_addAction1 (classDTW, 0, MODIFY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classDTW, 0, L"Formula (distances)...", 0, 1, DO_DTW_formulaDistances);
-	praat_addAction1 (classDTW, 0, L"Set distance value...", 0, 1, DO_DTW_setDistanceValue);
-
-	praat_addAction1 (classDTW, 0, L"Analyse", 0, 0, 0);
-    praat_addAction1 (classDTW, 0, L"Find path...", 0, praat_HIDDEN, DO_DTW_findPath);
-    praat_addAction1 (classDTW, 0, L"Find path (band & slope)...", 0, 0, DO_DTW_findPath_bandAndSlope);
-    praat_addAction1 (classDTW, 0, L"To Polygon...", 0, 1, DO_DTW_to_Polygon);
-	praat_addAction1 (classDTW, 0, L"To Matrix (distances)", 0, 0, DO_DTW_to_Matrix_distances);
-    praat_addAction1 (classDTW, 0, L"To Matrix (cumm. distances)...", 0, 0, DO_DTW_to_Matrix_cummulativeDistances);
-	praat_addAction1 (classDTW, 0, L"Swap axes", 0, 0, DO_DTW_swapAxes);
-
-	praat_addAction2 (classDTW, 1, classMatrix, 1, L"Replace matrix", 0, 0, DO_DTW_and_Matrix_replace);
-	praat_addAction2 (classDTW, 1, classTextGrid, 1, L"To TextGrid (warp times)", 0, 0, DO_DTW_and_TextGrid_to_TextGrid);
-	praat_addAction2 (classDTW, 1, classIntervalTier, 1, L"To Table (distances)", 0, 0, DO_DTW_and_IntervalTier_to_Table);
-
-    praat_addAction2 (classDTW, 1, classPolygon, 1, L"Find path inside...", 0, 0, DO_DTW_and_Polygon_findPathInside);
-    praat_addAction2 (classDTW, 1, classPolygon, 1, L"To Matrix (cumm. distances)...", 0, 0, DO_DTW_and_Polygon_to_Matrix_cummulativeDistances);
-	praat_addAction2 (classDTW, 1, classSound, 2, L"Draw...", 0, 0, DO_DTW_and_Sounds_draw);
-	praat_addAction2 (classDTW, 1, classSound, 2, L"Draw warp (x)...", 0, 0, DO_DTW_and_Sounds_drawWarpX);
-
-	praat_addAction1 (classEditDistanceTable, 1, L"EditDistanceTable help", 0, 0, DO_EditDistanceTable_help);
+	praat_addAction1 (classDTW, 0, U"Formula (distances)...", 0, 1, DO_DTW_formulaDistances);
+	praat_addAction1 (classDTW, 0, U"Set distance value...", 0, 1, DO_DTW_setDistanceValue);
+
+	praat_addAction1 (classDTW, 0, U"Analyse", 0, 0, 0);
+    praat_addAction1 (classDTW, 0, U"Find path...", 0, praat_HIDDEN, DO_DTW_findPath);
+    praat_addAction1 (classDTW, 0, U"Find path (band & slope)...", 0, 0, DO_DTW_findPath_bandAndSlope);
+    praat_addAction1 (classDTW, 0, U"To Polygon...", 0, 1, DO_DTW_to_Polygon);
+	praat_addAction1 (classDTW, 0, U"To Matrix (distances)", 0, 0, DO_DTW_to_Matrix_distances);
+    praat_addAction1 (classDTW, 0, U"To Matrix (cumm. distances)...", 0, 0, DO_DTW_to_Matrix_cummulativeDistances);
+	praat_addAction1 (classDTW, 0, U"Swap axes", 0, 0, DO_DTW_swapAxes);
+
+	praat_addAction2 (classDTW, 1, classMatrix, 1, U"Replace matrix", 0, 0, DO_DTW_and_Matrix_replace);
+	praat_addAction2 (classDTW, 1, classTextGrid, 1, U"To TextGrid (warp times)", 0, 0, DO_DTW_and_TextGrid_to_TextGrid);
+	praat_addAction2 (classDTW, 1, classIntervalTier, 1, U"To Table (distances)", 0, 0, DO_DTW_and_IntervalTier_to_Table);
+
+    praat_addAction2 (classDTW, 1, classPolygon, 1, U"Find path inside...", 0, 0, DO_DTW_and_Polygon_findPathInside);
+    praat_addAction2 (classDTW, 1, classPolygon, 1, U"To Matrix (cumm. distances)...", 0, 0, DO_DTW_and_Polygon_to_Matrix_cummulativeDistances);
+	praat_addAction2 (classDTW, 1, classSound, 2, U"Draw...", 0, 0, DO_DTW_and_Sounds_draw);
+	praat_addAction2 (classDTW, 1, classSound, 2, U"Draw warp (x)...", 0, 0, DO_DTW_and_Sounds_drawWarpX);
+
+	praat_addAction1 (classEditDistanceTable, 1, U"EditDistanceTable help", 0, 0, DO_EditDistanceTable_help);
 	praat_EditDistanceTable_as_TableOfReal_init (classEditDistanceTable);
-	praat_addAction1 (classEditDistanceTable, 1, L"To TableOfReal (directions)...", 0, praat_HIDDEN, DO_EditDistanceTable_to_TableOfReal_directions);
-	praat_addAction2 (classEditDistanceTable, 1, classEditCostsTable, 1, L"Set new edit costs", 0, 0, DO_EditDistanceTable_setEditCosts);
+	praat_addAction1 (classEditDistanceTable, 1, U"To TableOfReal (directions)...", 0, praat_HIDDEN, DO_EditDistanceTable_to_TableOfReal_directions);
+	praat_addAction2 (classEditDistanceTable, 1, classEditCostsTable, 1, U"Set new edit costs", 0, 0, DO_EditDistanceTable_setEditCosts);
 
-	praat_addAction1 (classEditCostsTable, 1, L"EditCostsTable help", 0, 0, DO_EditCostsTable_help);
+	praat_addAction1 (classEditCostsTable, 1, U"EditCostsTable help", 0, 0, DO_EditCostsTable_help);
 	praat_addAction1 (classEditCostsTable, 0, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classEditCostsTable, 1, L"Get target index...", 0, 1, DO_EditCostsTable_getTargetIndex);
-	praat_addAction1 (classEditCostsTable, 1, L"Get source index...", 0, 1, DO_EditCostsTable_getSourceIndex);
-	praat_addAction1 (classEditCostsTable, 1, L"Get insertion cost...", 0, 1, DO_EditCostsTable_getInsertionCost);
-	praat_addAction1 (classEditCostsTable, 1, L"Get deletion cost...", 0, 1, DO_EditCostsTable_getDeletionCost);
-	praat_addAction1 (classEditCostsTable, 1, L"Get substitution cost...", 0, 1, DO_EditCostsTable_getSubstitutionCost);
-	praat_addAction1 (classEditCostsTable, 1, L"Get cost (others)...", 0, 1, DO_EditCostsTable_getOthersCost);
+	praat_addAction1 (classEditCostsTable, 1, U"Get target index...", 0, 1, DO_EditCostsTable_getTargetIndex);
+	praat_addAction1 (classEditCostsTable, 1, U"Get source index...", 0, 1, DO_EditCostsTable_getSourceIndex);
+	praat_addAction1 (classEditCostsTable, 1, U"Get insertion cost...", 0, 1, DO_EditCostsTable_getInsertionCost);
+	praat_addAction1 (classEditCostsTable, 1, U"Get deletion cost...", 0, 1, DO_EditCostsTable_getDeletionCost);
+	praat_addAction1 (classEditCostsTable, 1, U"Get substitution cost...", 0, 1, DO_EditCostsTable_getSubstitutionCost);
+	praat_addAction1 (classEditCostsTable, 1, U"Get cost (others)...", 0, 1, DO_EditCostsTable_getOthersCost);
 	praat_addAction1 (classEditCostsTable, 0, MODIFY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classEditCostsTable, 1, L"Set target symbol (index)...", 0, 1, DO_EditCostsTable_setTargetSymbol_index);
-	praat_addAction1 (classEditCostsTable, 1, L"Set source symbol (index)...", 0, 1, DO_EditCostsTable_setSourceSymbol_index);
-	praat_addAction1 (classEditCostsTable, 1, L"Set insertion costs...", 0, 1, DO_EditCostsTable_setInsertionCosts);
-	praat_addAction1 (classEditCostsTable, 1, L"Set deletion costs...", 0, 1, DO_EditCostsTable_setDeletionCosts);
-	praat_addAction1 (classEditCostsTable, 1, L"Set substitution costs...", 0, 1, DO_EditCostsTable_setSubstitutionCosts);
-	praat_addAction1 (classEditCostsTable, 1, L"Set costs (others)...", 0, 1, DO_EditCostsTable_setOthersCosts);
-	praat_addAction1 (classEditCostsTable, 1, L"To TableOfReal", 0, 0, DO_EditCostsTable_to_TableOfReal);
+	praat_addAction1 (classEditCostsTable, 1, U"Set target symbol (index)...", 0, 1, DO_EditCostsTable_setTargetSymbol_index);
+	praat_addAction1 (classEditCostsTable, 1, U"Set source symbol (index)...", 0, 1, DO_EditCostsTable_setSourceSymbol_index);
+	praat_addAction1 (classEditCostsTable, 1, U"Set insertion costs...", 0, 1, DO_EditCostsTable_setInsertionCosts);
+	praat_addAction1 (classEditCostsTable, 1, U"Set deletion costs...", 0, 1, DO_EditCostsTable_setDeletionCosts);
+	praat_addAction1 (classEditCostsTable, 1, U"Set substitution costs...", 0, 1, DO_EditCostsTable_setSubstitutionCosts);
+	praat_addAction1 (classEditCostsTable, 1, U"Set costs (others)...", 0, 1, DO_EditCostsTable_setOthersCosts);
+	praat_addAction1 (classEditCostsTable, 1, U"To TableOfReal", 0, 0, DO_EditCostsTable_to_TableOfReal);
 
 	praat_Index_init (classStringsIndex);
-	praat_addAction1 (classIndex, 0, L"Index help", 0, 0, DO_Index_help);
-	praat_addAction1 (classStringsIndex, 1, L"Get class label...", 0, 0, DO_StringsIndex_getClassLabel);
-	praat_addAction1 (classStringsIndex, 1, L"Get class index...", 0, 0, DO_StringsIndex_getClassIndex);
-	praat_addAction1 (classStringsIndex, 1, L"Get label...", 0, 0, DO_StringsIndex_getLabel);
-	praat_addAction1 (classIndex, 1, L"Get index...", 0, 0, DO_Index_getIndex);
-	praat_addAction1 (classStringsIndex, 1, L"To Strings", 0, 0, DO_StringsIndex_to_Strings);
-
-	praat_addAction1 (classExcitation, 0, L"Synthesize", L"To Formant...", 0, 0);
-	praat_addAction1 (classExcitation, 0, L"To Excitations", L"Synthesize", 0, DO_Excitation_to_Excitations);
-
-	praat_addAction1 (classExcitations, 0, L"Modify", 0, 0, 0);
-	praat_addAction1 (classExcitations, 0, L"Formula...", 0, 0, DO_Excitations_formula);
-	praat_addAction1 (classExcitations, 0, L"Extract", 0, 0, 0);
-	praat_addAction1 (classExcitations, 0, L"Extract Excitation...", 0, 0, DO_Excitations_getItem);
-	praat_addAction1 (classExcitations, 0, L"Synthesize", 0, 0, 0);
-	praat_addAction1 (classExcitations, 0, L"Append", 0, 0, DO_Excitations_append);
-	praat_addAction1 (classExcitations, 0, L"Convert", 0, 0, 0);
-	praat_addAction1 (classExcitations, 0, L"To Pattern...", 0, 0, DO_Excitations_to_Pattern);
-	praat_addAction1 (classExcitations, 0, L"To TableOfReal", 0, 0, DO_Excitations_to_TableOfReal);
-
-	praat_addAction2 (classExcitations, 1, classExcitation, 0, L"Add to Excitations", 0, 0, DO_Excitations_addItem);
-
-	praat_addAction1 (classFileInMemory, 1, L"Show as code...", 0, 0, DO_FileInMemory_showAsCode);
-	praat_addAction1 (classFileInMemory, 1, L"Set id...", 0, 0, DO_FileInMemory_setId);
-	praat_addAction1 (classFileInMemory, 0, L"To FilesInMemory", 0, 0, DO_FileInMemory_to_FilesInMemory);
-
-	praat_addAction1 (classFilesInMemory, 1, L"Show as code...", 0, 0, DO_FilesInMemory_showAsCode);
-	praat_addAction1 (classFilesInMemory, 1, L"Show one file as code...", 0, 0, DO_FilesInMemory_showOneFileAsCode);
-	praat_addAction1 (classFilesInMemory, 0, L"Merge", 0, 0, DO_FilesInMemory_merge);
-	praat_addAction1 (classFilesInMemory, 0, L"To Strings (id)", 0, 0, DO_FilesInMemory_to_Strings_id);
-
-	praat_addAction2 (classFilesInMemory, 1, classFileInMemory, 0, L"Add items to Collection", 0, 0, DO_FilesInMemory_addItems);
-
-	praat_addAction1 (classFormantFilter, 0, L"FormantFilter help", 0, 0, DO_FormantFilter_help);
+	praat_addAction1 (classIndex, 0, U"Index help", 0, 0, DO_Index_help);
+	praat_addAction1 (classStringsIndex, 1, U"Get class label...", 0, 0, DO_StringsIndex_getClassLabel);
+	praat_addAction1 (classStringsIndex, 1, U"Get class index...", 0, 0, DO_StringsIndex_getClassIndex);
+	praat_addAction1 (classStringsIndex, 1, U"Get label...", 0, 0, DO_StringsIndex_getLabel);
+	praat_addAction1 (classIndex, 1, U"Get index...", 0, 0, DO_Index_getIndex);
+	praat_addAction1 (classStringsIndex, 1, U"To Strings", 0, 0, DO_StringsIndex_to_Strings);
+
+	praat_addAction1 (classExcitation, 0, U"Synthesize", U"To Formant...", 0, 0);
+	praat_addAction1 (classExcitation, 0, U"To Excitations", U"Synthesize", 0, DO_Excitation_to_Excitations);
+
+	praat_addAction1 (classExcitations, 0, U"Modify", 0, 0, 0);
+	praat_addAction1 (classExcitations, 0, U"Formula...", 0, 0, DO_Excitations_formula);
+	praat_addAction1 (classExcitations, 0, U"Extract", 0, 0, 0);
+	praat_addAction1 (classExcitations, 0, U"Extract Excitation...", 0, 0, DO_Excitations_getItem);
+	praat_addAction1 (classExcitations, 0, U"Synthesize", 0, 0, 0);
+	praat_addAction1 (classExcitations, 0, U"Append", 0, 0, DO_Excitations_append);
+	praat_addAction1 (classExcitations, 0, U"Convert", 0, 0, 0);
+	praat_addAction1 (classExcitations, 0, U"To Pattern...", 0, 0, DO_Excitations_to_Pattern);
+	praat_addAction1 (classExcitations, 0, U"To TableOfReal", 0, 0, DO_Excitations_to_TableOfReal);
+
+	praat_addAction2 (classExcitations, 1, classExcitation, 0, U"Add to Excitations", 0, 0, DO_Excitations_addItem);
+
+	praat_addAction1 (classFileInMemory, 1, U"Show as code...", 0, 0, DO_FileInMemory_showAsCode);
+	praat_addAction1 (classFileInMemory, 1, U"Set id...", 0, 0, DO_FileInMemory_setId);
+	praat_addAction1 (classFileInMemory, 0, U"To FilesInMemory", 0, 0, DO_FileInMemory_to_FilesInMemory);
+
+	praat_addAction1 (classFilesInMemory, 1, U"Show as code...", 0, 0, DO_FilesInMemory_showAsCode);
+	praat_addAction1 (classFilesInMemory, 1, U"Show one file as code...", 0, 0, DO_FilesInMemory_showOneFileAsCode);
+	praat_addAction1 (classFilesInMemory, 0, U"Merge", 0, 0, DO_FilesInMemory_merge);
+	praat_addAction1 (classFilesInMemory, 0, U"To Strings (id)", 0, 0, DO_FilesInMemory_to_Strings_id);
+
+	praat_addAction2 (classFilesInMemory, 1, classFileInMemory, 0, U"Add items to Collection", 0, 0, DO_FilesInMemory_addItems);
+
+	praat_addAction1 (classFormantFilter, 0, U"FormantFilter help", 0, 0, DO_FormantFilter_help);
 	praat_FilterBank_all_init (classFormantFilter);
-	praat_addAction1 (classFormantFilter, 0, L"Draw spectrum (slice)...", L"Draw filters...", praat_DEPTH_1 + praat_HIDDEN, DO_FormantFilter_drawSpectrum);
-	praat_addAction1 (classFormantFilter, 0, L"Draw filter functions...", L"Draw filters...",  praat_DEPTH_1 + praat_HIDDEN, DO_FormantFilter_drawFilterFunctions);
-	praat_addAction1 (classFormantFilter, 0, L"To Spectrogram", 0, 0, DO_FormantFilter_to_Spectrogram);
+	praat_addAction1 (classFormantFilter, 0, U"Draw spectrum (slice)...", U"Draw filters...", praat_DEPTH_1 + praat_HIDDEN, DO_FormantFilter_drawSpectrum);
+	praat_addAction1 (classFormantFilter, 0, U"Draw filter functions...", U"Draw filters...",  praat_DEPTH_1 + praat_HIDDEN, DO_FormantFilter_drawFilterFunctions);
+	praat_addAction1 (classFormantFilter, 0, U"To Spectrogram", 0, 0, DO_FormantFilter_to_Spectrogram);
 	
 	
-	praat_addAction1 (classFormantGrid, 0, L"Draw...", L"Edit", praat_DEPTH_1 + praat_HIDDEN, DO_FormantGrid_draw);
+	praat_addAction1 (classFormantGrid, 0, U"Draw...", U"Edit", praat_DEPTH_1 + praat_HIDDEN, DO_FormantGrid_draw);
 
 
-	praat_addAction1 (classIntensity, 0, L"To TextGrid (silences)...", L"To IntensityTier (valleys)", 0, DO_Intensity_to_TextGrid_detectSilences);
-	praat_addAction1 (classIntensityTier, 0, L"To TextGrid (silences)...", 0, 0, DO_IntensityTier_to_TextGrid_detectSilences);
-	praat_addAction1 (classIntensityTier, 0, L"To Intensity...", 0, praat_HIDDEN, DO_IntensityTier_to_Intensity);
+	praat_addAction1 (classIntensity, 0, U"To TextGrid (silences)...", U"To IntensityTier (valleys)", 0, DO_Intensity_to_TextGrid_detectSilences);
+	praat_addAction1 (classIntensityTier, 0, U"To TextGrid (silences)...", 0, 0, DO_IntensityTier_to_TextGrid_detectSilences);
+	praat_addAction1 (classIntensityTier, 0, U"To Intensity...", 0, praat_HIDDEN, DO_IntensityTier_to_Intensity);
 
-	praat_addAction1 (classISpline, 0, L"ISpline help", 0, 0, DO_ISpline_help);
+	praat_addAction1 (classISpline, 0, U"ISpline help", 0, 0, DO_ISpline_help);
 	praat_Spline_init (classISpline);
 
-	praat_addAction1 (classKlattTable, 0, L"KlattTable help", 0, 0, DO_KlattTable_help);
-	praat_addAction1 (classKlattTable, 0, L"To Sound...", 0, 0, DO_KlattTable_to_Sound);
-	praat_addAction1 (classKlattTable, 0, L"To KlattGrid...", 0, 0, DO_KlattTable_to_KlattGrid);
-	praat_addAction1 (classKlattTable, 0, L"To Table", 0, 0, DO_KlattTable_to_Table);
+	praat_addAction1 (classKlattTable, 0, U"KlattTable help", 0, 0, DO_KlattTable_help);
+	praat_addAction1 (classKlattTable, 0, U"To Sound...", 0, 0, DO_KlattTable_to_Sound);
+	praat_addAction1 (classKlattTable, 0, U"To KlattGrid...", 0, 0, DO_KlattTable_to_KlattGrid);
+	praat_addAction1 (classKlattTable, 0, U"To Table", 0, 0, DO_KlattTable_to_Table);
 
-	praat_addAction1 (classLegendreSeries, 0, L"LegendreSeries help", 0, 0, DO_LegendreSeries_help);
+	praat_addAction1 (classLegendreSeries, 0, U"LegendreSeries help", 0, 0, DO_LegendreSeries_help);
 	praat_FunctionTerms_init (classLegendreSeries);
-	praat_addAction1 (classLegendreSeries, 0, L"To Polynomial", L"Analyse", 0, DO_LegendreSeries_to_Polynomial);
-
-	praat_addAction1 (classLongSound, 0, L"Append to existing sound file...", 0, 0, DO_LongSounds_appendToExistingSoundFile);
-	praat_addAction1 (classSound, 0, L"Append to existing sound file...", 0, 0, DO_LongSounds_appendToExistingSoundFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Append to existing sound file...", 0, 0, DO_LongSounds_appendToExistingSoundFile);
-
-	praat_addAction1 (classLongSound, 2, L"Save as stereo AIFF file...", L"Save as NIST file...", 1, DO_LongSounds_writeToStereoAiffFile);
-	praat_addAction1 (classLongSound, 2, L"Write to stereo AIFF file...", L"Write to NIST file...", praat_HIDDEN + praat_DEPTH_1, DO_LongSounds_writeToStereoAiffFile);
-	praat_addAction1 (classLongSound, 2, L"Save as stereo AIFC file...", L"Save as stereo AIFF file...", 1, DO_LongSounds_writeToStereoAifcFile);
-	praat_addAction1 (classLongSound, 2, L"Write to stereo AIFC file...", L"Write to stereo AIFF file...", praat_HIDDEN + praat_DEPTH_1, DO_LongSounds_writeToStereoAifcFile);
-	praat_addAction1 (classLongSound, 2, L"Save as stereo WAV file...", L"Save as stereo AIFC file...", 1, DO_LongSounds_writeToStereoWavFile);
-	praat_addAction1 (classLongSound, 2, L"Write to stereo WAV file...", L"Write to stereo AIFC file...", praat_HIDDEN + praat_DEPTH_1, DO_LongSounds_writeToStereoWavFile);
-	praat_addAction1 (classLongSound, 2, L"Save as stereo NeXt/Sun file...", L"Save as stereo WAV file...", 1, DO_LongSounds_writeToStereoNextSunFile);
-	praat_addAction1 (classLongSound, 2, L"Write to stereo NeXt/Sun file...", L"Write to stereo WAV file...", praat_HIDDEN + praat_DEPTH_1, DO_LongSounds_writeToStereoNextSunFile);
-	praat_addAction1 (classLongSound, 2, L"Save as stereo NIST file...", L"Save as stereo NeXt/Sun file...", 1, DO_LongSounds_writeToStereoNistFile);
-	praat_addAction1 (classLongSound, 2, L"Write to stereo NIST file...", L"Write to stereo NeXt/Sun file...", praat_HIDDEN + praat_DEPTH_1, DO_LongSounds_writeToStereoNistFile);
-
-	praat_addAction1 (classLtas, 0, L"Report spectral tilt...", L"Get slope...", 1, DO_Ltas_reportSpectralTilt);
-
-	praat_addAction1 (classMatrix, 0, L"Scatter plot...", L"Paint cells...", 1, DO_Matrix_scatterPlot);
-	praat_addAction1 (classMatrix, 0, L"Draw as squares...", L"Scatter plot...", 1, DO_Matrix_drawAsSquares);
-	praat_addAction1 (classMatrix, 0, L"Draw distribution...", L"Draw as squares...", 1, DO_Matrix_drawDistribution);
-	praat_addAction1 (classMatrix, 0, L"Draw cumulative distribution...", L"Draw distribution...", 1, DO_Matrix_drawCumulativeDistribution);
-	praat_addAction1 (classMatrix, 0, L"Get mean...", L"Get sum", 1, DO_Matrix_getMean);
-	praat_addAction1 (classMatrix, 0, L"Get standard deviation...", L"Get mean...", 1, DO_Matrix_getStandardDeviation);
-	praat_addAction1 (classMatrix, 0, L"Transpose", L"Synthesize", 0, DO_Matrix_transpose);
-	praat_addAction1 (classMatrix, 0, L"Solve equation...", L"Analyse", 0, DO_Matrix_solveEquation);
-	praat_addAction1 (classMatrix, 0, L"To Pattern...", L"To VocalTract", 1, DO_Matrix_to_Pattern);
-	praat_addAction1 (classMatrix, 0, L"To Activation", L"To Pattern...", 1, DO_Matrix_to_Activation);
-	praat_addAction1 (classMatrix, 2, L"To DTW...", L"To ParamCurve", 1, DO_Matrices_to_DTW);
-
-	praat_addAction2 (classMatrix, 1, classCategories, 1, L"To TableOfReal", 0, 0, DO_Matrix_Categories_to_TableOfReal);
+	praat_addAction1 (classLegendreSeries, 0, U"To Polynomial", U"Analyse", 0, DO_LegendreSeries_to_Polynomial);
+
+	praat_addAction1 (classLongSound, 0, U"Append to existing sound file...", 0, 0, DO_LongSounds_appendToExistingSoundFile);
+	praat_addAction1 (classSound, 0, U"Append to existing sound file...", 0, 0, DO_LongSounds_appendToExistingSoundFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Append to existing sound file...", 0, 0, DO_LongSounds_appendToExistingSoundFile);
+
+	praat_addAction1 (classLongSound, 2, U"Save as stereo AIFF file...", U"Save as NIST file...", 1, DO_LongSounds_writeToStereoAiffFile);
+	praat_addAction1 (classLongSound, 2, U"Write to stereo AIFF file...", U"Write to NIST file...", praat_HIDDEN + praat_DEPTH_1, DO_LongSounds_writeToStereoAiffFile);
+	praat_addAction1 (classLongSound, 2, U"Save as stereo AIFC file...", U"Save as stereo AIFF file...", 1, DO_LongSounds_writeToStereoAifcFile);
+	praat_addAction1 (classLongSound, 2, U"Write to stereo AIFC file...", U"Write to stereo AIFF file...", praat_HIDDEN + praat_DEPTH_1, DO_LongSounds_writeToStereoAifcFile);
+	praat_addAction1 (classLongSound, 2, U"Save as stereo WAV file...", U"Save as stereo AIFC file...", 1, DO_LongSounds_writeToStereoWavFile);
+	praat_addAction1 (classLongSound, 2, U"Write to stereo WAV file...", U"Write to stereo AIFC file...", praat_HIDDEN + praat_DEPTH_1, DO_LongSounds_writeToStereoWavFile);
+	praat_addAction1 (classLongSound, 2, U"Save as stereo NeXt/Sun file...", U"Save as stereo WAV file...", 1, DO_LongSounds_writeToStereoNextSunFile);
+	praat_addAction1 (classLongSound, 2, U"Write to stereo NeXt/Sun file...", U"Write to stereo WAV file...", praat_HIDDEN + praat_DEPTH_1, DO_LongSounds_writeToStereoNextSunFile);
+	praat_addAction1 (classLongSound, 2, U"Save as stereo NIST file...", U"Save as stereo NeXt/Sun file...", 1, DO_LongSounds_writeToStereoNistFile);
+	praat_addAction1 (classLongSound, 2, U"Write to stereo NIST file...", U"Write to stereo NeXt/Sun file...", praat_HIDDEN + praat_DEPTH_1, DO_LongSounds_writeToStereoNistFile);
+
+	praat_addAction1 (classLtas, 0, U"Report spectral tilt...", U"Get slope...", 1, DO_Ltas_reportSpectralTilt);
+
+	praat_addAction1 (classMatrix, 0, U"Scatter plot...", U"Paint cells...", 1, DO_Matrix_scatterPlot);
+	praat_addAction1 (classMatrix, 0, U"Draw as squares...", U"Scatter plot...", 1, DO_Matrix_drawAsSquares);
+	praat_addAction1 (classMatrix, 0, U"Draw distribution...", U"Draw as squares...", 1, DO_Matrix_drawDistribution);
+	praat_addAction1 (classMatrix, 0, U"Draw cumulative distribution...", U"Draw distribution...", 1, DO_Matrix_drawCumulativeDistribution);
+	praat_addAction1 (classMatrix, 0, U"Get mean...", U"Get sum", 1, DO_Matrix_getMean);
+	praat_addAction1 (classMatrix, 0, U"Get standard deviation...", U"Get mean...", 1, DO_Matrix_getStandardDeviation);
+	praat_addAction1 (classMatrix, 0, U"Transpose", U"Synthesize", 0, DO_Matrix_transpose);
+	praat_addAction1 (classMatrix, 0, U"Solve equation...", U"Analyse", 0, DO_Matrix_solveEquation);
+	praat_addAction1 (classMatrix, 0, U"To Pattern...", U"To VocalTract", 1, DO_Matrix_to_Pattern);
+	praat_addAction1 (classMatrix, 0, U"To Activation", U"To Pattern...", 1, DO_Matrix_to_Activation);
+	praat_addAction1 (classMatrix, 2, U"To DTW...", U"To ParamCurve", 1, DO_Matrices_to_DTW);
+
+	praat_addAction2 (classMatrix, 1, classCategories, 1, U"To TableOfReal", 0, 0, DO_Matrix_Categories_to_TableOfReal);
 
 	
-	praat_addAction1 (classMelSpectrogram, 0, L"MelSpectrogram help", 0, 0, DO_MelSpectrogram_help);
+	praat_addAction1 (classMelSpectrogram, 0, U"MelSpectrogram help", 0, 0, DO_MelSpectrogram_help);
 	praat_BandFilterSpectrogram_draw_init (classMelSpectrogram);
-	praat_addAction1 (classMelSpectrogram, 0, L"Paint image...", 0, 1, DO_MelSpectrogram_paintImage);
-	praat_addAction1 (classMelSpectrogram, 0, L"Draw triangular filter functions...", 0, 1, DO_MelSpectrogram_drawTriangularFilterFunctions);
-	praat_addAction1 (classMelSpectrogram, 0, L"Draw spectrum at nearest time slice...", 0, 1, DO_MelSpectrogram_drawSpectrumAtNearestTimeSlice);
+	praat_addAction1 (classMelSpectrogram, 0, U"Paint image...", 0, 1, DO_MelSpectrogram_paintImage);
+	praat_addAction1 (classMelSpectrogram, 0, U"Draw triangular filter functions...", 0, 1, DO_MelSpectrogram_drawTriangularFilterFunctions);
+	praat_addAction1 (classMelSpectrogram, 0, U"Draw spectrum at nearest time slice...", 0, 1, DO_MelSpectrogram_drawSpectrumAtNearestTimeSlice);
 	praat_addAction1 (classMelSpectrogram, 0, QUERY_BUTTON, 0, 0, 0);
 	praat_BandFilterSpectrogram_query_init (classMelSpectrogram);
 
-	praat_addAction1 (classMelSpectrogram, 0, L"Equalize intensities...", 0, 0, DO_BandFilterSpectrogram_equalizeIntensities);
-	praat_addAction1 (classMelSpectrogram, 0, L"To MFCC...", 0, 0, DO_MelSpectrogram_to_MFCC);
-	praat_addAction1 (classMelSpectrogram, 0, L"To Intensity", 0, 0, DO_BandFilterSpectrogram_to_Intensity);
-	praat_addAction1 (classMelSpectrogram, 0, L"To Matrix...", 0, 0, DO_BandFilterSpectrogram_to_Matrix);
-	praat_addAction1 (classMelSpectrogram, 2, L"Cross-correlate...", 0, 0, DO_BandFilterSpectrograms_crossCorrelate);
-	praat_addAction1 (classMelSpectrogram, 2, L"Convolve...", 0, 0, DO_BandFilterSpectrograms_convolve);
+	praat_addAction1 (classMelSpectrogram, 0, U"Equalize intensities...", 0, 0, DO_BandFilterSpectrogram_equalizeIntensities);
+	praat_addAction1 (classMelSpectrogram, 0, U"To MFCC...", 0, 0, DO_MelSpectrogram_to_MFCC);
+	praat_addAction1 (classMelSpectrogram, 0, U"To Intensity", 0, 0, DO_BandFilterSpectrogram_to_Intensity);
+	praat_addAction1 (classMelSpectrogram, 0, U"To Matrix...", 0, 0, DO_BandFilterSpectrogram_to_Matrix);
+	praat_addAction1 (classMelSpectrogram, 2, U"Cross-correlate...", 0, 0, DO_BandFilterSpectrograms_crossCorrelate);
+	praat_addAction1 (classMelSpectrogram, 2, U"Convolve...", 0, 0, DO_BandFilterSpectrograms_convolve);
 	
-	praat_addAction1 (classMelFilter, 0, L"MelFilter help", 0, 0, DO_MelFilter_help); // deprecated 2014
+	praat_addAction1 (classMelFilter, 0, U"MelFilter help", 0, 0, DO_MelFilter_help); // deprecated 2014
 	praat_FilterBank_all_init (classMelFilter); // deprecated 2014
-	praat_addAction1 (classMelFilter, 0, L"Draw spectrum (slice)...", L"Draw filters...", praat_DEPTH_1 + praat_HIDDEN, DO_MelFilter_drawSpectrum); // deprecated 2014
-	praat_addAction1 (classMelFilter, 0, L"Draw filter functions...", L"Draw filters...", praat_DEPTH_1 + praat_HIDDEN, DO_MelFilter_drawFilterFunctions); // deprecated 2014
-	praat_addAction1 (classMelFilter, 0, L"Paint...", L"Draw filter functions...", praat_DEPTH_1 + praat_HIDDEN, DO_MelFilter_paint); // deprecated 2014
-	praat_addAction1 (classMelFilter, 0, L"To MFCC...", 0, praat_HIDDEN, DO_MelFilter_to_MFCC); // deprecated 2014
-	praat_addAction1 (classMelFilter, 0, L"To MelSpectrogram", 0, 0, DO_MelFilter_to_MelSpectrogram);
+	praat_addAction1 (classMelFilter, 0, U"Draw spectrum (slice)...", U"Draw filters...", praat_DEPTH_1 + praat_HIDDEN, DO_MelFilter_drawSpectrum); // deprecated 2014
+	praat_addAction1 (classMelFilter, 0, U"Draw filter functions...", U"Draw filters...", praat_DEPTH_1 + praat_HIDDEN, DO_MelFilter_drawFilterFunctions); // deprecated 2014
+	praat_addAction1 (classMelFilter, 0, U"Paint...", U"Draw filter functions...", praat_DEPTH_1 + praat_HIDDEN, DO_MelFilter_paint); // deprecated 2014
+	praat_addAction1 (classMelFilter, 0, U"To MFCC...", 0, praat_HIDDEN, DO_MelFilter_to_MFCC); // deprecated 2014
+	praat_addAction1 (classMelFilter, 0, U"To MelSpectrogram", 0, 0, DO_MelFilter_to_MelSpectrogram);
 
 	
-	praat_addAction1 (classMFCC, 0, L"MFCC help", 0, 0, DO_MFCC_help);
+	praat_addAction1 (classMFCC, 0, U"MFCC help", 0, 0, DO_MFCC_help);
 	praat_CC_init (classMFCC);
-	praat_addAction1 (classMFCC, 0, L"To MelFilter...", 0, praat_HIDDEN, DO_MFCC_to_MelFilter);
-	praat_addAction1 (classMFCC, 0, L"To MelSpectrogram...", 0, 0, DO_MFCC_to_MelSpectrogram);
-	praat_addAction1 (classMFCC, 0, L"To TableOfReal...", 0, 0, DO_MFCC_to_TableOfReal);
-	praat_addAction1 (classMFCC, 0, L"To Matrix (features)...", 0, praat_HIDDEN, DO_MFCC_to_Matrix_features);
-	praat_addAction1 (classMFCC, 0, L"To Sound", 0, praat_HIDDEN, DO_MFCC_to_Sound);
-	praat_addAction1 (classMFCC, 2, L"Cross-correlate...", 0, 0, DO_MFCCs_crossCorrelate);
-	praat_addAction1 (classMFCC, 2, L"Convolve...", 0, 0, DO_MFCCs_convolve);
-
-	praat_addAction1 (classMSpline, 0, L"MSpline help", 0, 0, DO_MSpline_help);
+	praat_addAction1 (classMFCC, 0, U"To MelFilter...", 0, praat_HIDDEN, DO_MFCC_to_MelFilter);
+	praat_addAction1 (classMFCC, 0, U"To MelSpectrogram...", 0, 0, DO_MFCC_to_MelSpectrogram);
+	praat_addAction1 (classMFCC, 0, U"To TableOfReal...", 0, 0, DO_MFCC_to_TableOfReal);
+	praat_addAction1 (classMFCC, 0, U"To Matrix (features)...", 0, praat_HIDDEN, DO_MFCC_to_Matrix_features);
+	praat_addAction1 (classMFCC, 0, U"To Sound", 0, praat_HIDDEN, DO_MFCC_to_Sound);
+	praat_addAction1 (classMFCC, 2, U"Cross-correlate...", 0, 0, DO_MFCCs_crossCorrelate);
+	praat_addAction1 (classMFCC, 2, U"Convolve...", 0, 0, DO_MFCCs_convolve);
+
+	praat_addAction1 (classMSpline, 0, U"MSpline help", 0, 0, DO_MSpline_help);
 	praat_Spline_init (classMSpline);
 
-	praat_addAction1 (classPattern, 0, L"Draw", 0, 0, 0);
-	praat_addAction1 (classPattern, 0, L"Draw...", 0, 0, DO_Pattern_draw);
+	praat_addAction1 (classPattern, 0, U"Draw", 0, 0, 0);
+	praat_addAction1 (classPattern, 0, U"Draw...", 0, 0, DO_Pattern_draw);
 	praat_addAction1 (classPattern, 0, MODIFY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classPattern, 0, L"Formula...", 0, 1, DO_Pattern_formula);
-	praat_addAction1 (classPattern, 0, L"Set value...", 0, 1, DO_Pattern_setValue);
-	praat_addAction1 (classPattern, 0, L"To Matrix", 0, 0, DO_Pattern_to_Matrix);
+	praat_addAction1 (classPattern, 0, U"Formula...", 0, 1, DO_Pattern_formula);
+	praat_addAction1 (classPattern, 0, U"Set value...", 0, 1, DO_Pattern_setValue);
+	praat_addAction1 (classPattern, 0, U"To Matrix", 0, 0, DO_Pattern_to_Matrix);
 
-	praat_addAction2 (classPattern, 1, classCategories, 1, L"To TableOfReal", 0, 0, DO_Matrix_Categories_to_TableOfReal);
+	praat_addAction2 (classPattern, 1, classCategories, 1, U"To TableOfReal", 0, 0, DO_Matrix_Categories_to_TableOfReal);
 
-	praat_addAction2 (classPattern, 1, classCategories, 1, L"To Discriminant", 0, 0, DO_Pattern_and_Categories_to_Discriminant);
+	praat_addAction2 (classPattern, 1, classCategories, 1, U"To Discriminant", 0, 0, DO_Pattern_and_Categories_to_Discriminant);
 
-	praat_addAction1 (classPCA, 0, L"PCA help", 0, 0, DO_PCA_help);
+	praat_addAction1 (classPCA, 0, U"PCA help", 0, 0, DO_PCA_help);
 	praat_addAction1 (classPCA, 0, DRAW_BUTTON, 0, 0, 0);
 	praat_Eigen_draw_init (classPCA);
 	praat_addAction1 (classPCA, 0, QUERY_BUTTON, 0, 0, 0);
 	praat_Eigen_query_init (classPCA);
-	praat_addAction1 (classPCA, 1, L"-- pca --", 0, 1, 0);
-	praat_addAction1 (classPCA, 1, L"Get centroid element...", 0, 1, DO_PCA_getCentroidElement);
-	praat_addAction1 (classPCA, 1, L"Get equality of eigenvalues...", 0, 1, DO_PCA_getEqualityOfEigenvalues);
-	praat_addAction1 (classPCA, 1, L"Get fraction variance accounted for...", 0, 1, DO_PCA_getFractionVAF);
-	praat_addAction1 (classPCA, 1, L"Get number of components (VAF)...", 0, 1, DO_PCA_getNumberOfComponentsVAF);
-	praat_addAction1 (classPCA, 2, L"Get angle between pc1-pc2 planes", 0, 1, DO_PCAs_getAngleBetweenPc1Pc2Plane_degrees);
+	praat_addAction1 (classPCA, 1, U"-- pca --", 0, 1, 0);
+	praat_addAction1 (classPCA, 1, U"Get centroid element...", 0, 1, DO_PCA_getCentroidElement);
+	praat_addAction1 (classPCA, 1, U"Get equality of eigenvalues...", 0, 1, DO_PCA_getEqualityOfEigenvalues);
+	praat_addAction1 (classPCA, 1, U"Get fraction variance accounted for...", 0, 1, DO_PCA_getFractionVAF);
+	praat_addAction1 (classPCA, 1, U"Get number of components (VAF)...", 0, 1, DO_PCA_getNumberOfComponentsVAF);
+	praat_addAction1 (classPCA, 2, U"Get angle between pc1-pc2 planes", 0, 1, DO_PCAs_getAngleBetweenPc1Pc2Plane_degrees);
 	praat_addAction1 (classPCA, 0, MODIFY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classPCA, 1, L"Invert eigenvector...", 0, 1, DO_PCA_invertEigenvector);
-	praat_addAction1 (classPCA, 0, L"Align eigenvectors", 0, 1, DO_Eigens_alignEigenvectors);
-	praat_addAction1 (classPCA, 2, L"To Procrustes...", 0, 0, DO_PCAs_to_Procrustes);
-	praat_addAction1 (classPCA, 0, L"To TableOfReal (reconstruct 1)...", 0, 0, DO_PCA_to_TableOfReal_reconstruct1);
-	praat_addAction1 (classPCA, 0, L"& TableOfReal: To Configuration?", 0, 0, DO_hint_PCA_and_TableOfReal_to_Configuration);
-	praat_addAction1 (classPCA, 0, L"& Configuration (reconstruct)?", 0, 0, DO_hint_PCA_and_Configuration_to_TableOfReal_reconstruct);
-	praat_addAction1 (classPCA, 0, L"& Covariance: Project?", 0, 0, DO_hint_PCA_and_Covariance_Project);
-	praat_addAction2 (classPCA, 1, classConfiguration, 1, L"To TableOfReal (reconstruct)", 0, 0, DO_PCA_and_Configuration_to_TableOfReal_reconstruct);
-	praat_addAction2 (classPCA, 1, classSSCP, 1, L"Project", 0, 0, DO_Eigen_and_SSCP_project);
-	praat_addAction2 (classPCA, 1, classTableOfReal, 1, L"To Configuration...", 0, 0, DO_PCA_and_TableOfReal_to_Configuration);
-	praat_addAction2 (classPCA, 1, classTableOfReal, 1, L"To TableOfReal (z-scores)...", 0, 0, DO_PCA_and_TableOfReal_to_TableOfReal_zscores);
-	praat_addAction2 (classPCA, 1, classTableOfReal, 1, L"Get fraction variance...", 0, 0, DO_PCA_and_TableOfReal_getFractionVariance);
-	praat_addAction2 (classPCA, 1, classCovariance, 1, L"Project", 0, 0, DO_Eigen_and_Covariance_project);
+	praat_addAction1 (classPCA, 1, U"Invert eigenvector...", 0, 1, DO_PCA_invertEigenvector);
+	praat_addAction1 (classPCA, 0, U"Align eigenvectors", 0, 1, DO_Eigens_alignEigenvectors);
+	praat_addAction1 (classPCA, 2, U"To Procrustes...", 0, 0, DO_PCAs_to_Procrustes);
+	praat_addAction1 (classPCA, 0, U"To TableOfReal (reconstruct 1)...", 0, 0, DO_PCA_to_TableOfReal_reconstruct1);
+	praat_addAction1 (classPCA, 0, U"& TableOfReal: To Configuration?", 0, 0, DO_hint_PCA_and_TableOfReal_to_Configuration);
+	praat_addAction1 (classPCA, 0, U"& Configuration (reconstruct)?", 0, 0, DO_hint_PCA_and_Configuration_to_TableOfReal_reconstruct);
+	praat_addAction1 (classPCA, 0, U"& Covariance: Project?", 0, 0, DO_hint_PCA_and_Covariance_Project);
+	praat_addAction2 (classPCA, 1, classConfiguration, 1, U"To TableOfReal (reconstruct)", 0, 0, DO_PCA_and_Configuration_to_TableOfReal_reconstruct);
+	praat_addAction2 (classPCA, 1, classSSCP, 1, U"Project", 0, 0, DO_Eigen_and_SSCP_project);
+	praat_addAction2 (classPCA, 1, classTableOfReal, 1, U"To Configuration...", 0, 0, DO_PCA_and_TableOfReal_to_Configuration);
+	praat_addAction2 (classPCA, 1, classTableOfReal, 1, U"To TableOfReal (z-scores)...", 0, 0, DO_PCA_and_TableOfReal_to_TableOfReal_zscores);
+	praat_addAction2 (classPCA, 1, classTableOfReal, 1, U"Get fraction variance...", 0, 0, DO_PCA_and_TableOfReal_getFractionVariance);
+	praat_addAction2 (classPCA, 1, classCovariance, 1, U"Project", 0, 0, DO_Eigen_and_Covariance_project);
 
 	praat_Eigen_Spectrogram_project (classPCA, classSpectrogram);
 	praat_Eigen_Spectrogram_project (classPCA, classBarkSpectrogram);
@@ -8589,257 +8835,266 @@ void praat_uvafon_David_init () {
 	praat_Eigen_Matrix_project (classPCA, classBarkFilter); // deprecated 2014
 	praat_Eigen_Matrix_project (classPCA, classMelFilter); // deprecated 2014
 
-	praat_addAction1 (classPermutation, 0, L"Permutation help", 0, 0, DO_Permutation_help);
+	praat_addAction1 (classPermutation, 0, U"Permutation help", 0, 0, DO_Permutation_help);
 	praat_addAction1 (classPermutation, 0, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classPermutation, 1, L"Get number of elements", 0, 1, DO_Permutation_getNumberOfElements);
-	praat_addAction1 (classPermutation, 1, L"Get value...", 0, 1, DO_Permutation_getValueAtIndex);
-	praat_addAction1 (classPermutation, 1, L"Get index...", 0, 1, DO_Permutation_getIndexAtValue);
+	praat_addAction1 (classPermutation, 1, U"Get number of elements", 0, 1, DO_Permutation_getNumberOfElements);
+	praat_addAction1 (classPermutation, 1, U"Get value...", 0, 1, DO_Permutation_getValueAtIndex);
+	praat_addAction1 (classPermutation, 1, U"Get index...", 0, 1, DO_Permutation_getIndexAtValue);
 	praat_addAction1 (classPermutation, 0, MODIFY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classPermutation, 1, L"Sort", 0, 1, DO_Permutation_sort);
-	praat_addAction1 (classPermutation, 1, L"Swap blocks...", 0, 1, DO_Permutation_swapBlocks);
-	praat_addAction1 (classPermutation, 1, L"Swap numbers...", 0, 1, DO_Permutation_swapNumbers);
-	praat_addAction1 (classPermutation, 1, L"Swap positions...", 0, 1, DO_Permutation_swapPositions);
-	praat_addAction1 (classPermutation, 1, L"Swap one from range...", 0, 1, DO_Permutation_swapOneFromRange);
-	praat_addAction1 (classPermutation, 0, L"-- sequential permutations --", 0, 1, 0);
-	praat_addAction1 (classPermutation, 0, L"Next", 0, 1, DO_Permutations_next);
-	praat_addAction1 (classPermutation, 0, L"Previous", 0, 1, DO_Permutations_previous);
-	praat_addAction1 (classPermutation, 1, L"Permute randomly...", 0, 0, DO_Permutation_permuteRandomly);
-	praat_addAction1 (classPermutation, 1, L"Permute randomly (blocks)...", 0, 0, DO_Permutation_permuteBlocksRandomly);
-	praat_addAction1 (classPermutation, 1, L"Interleave...", 0, 0, DO_Permutation_interleave);
-	praat_addAction1 (classPermutation, 1, L"Rotate...", 0, 0, DO_Permutation_rotate);
-	praat_addAction1 (classPermutation, 1, L"Reverse...", 0, 0, DO_Permutation_reverse);
-	praat_addAction1 (classPermutation, 1, L"Invert", 0, 0, DO_Permutation_invert);
-	praat_addAction1 (classPermutation, 0, L"Multiply", 0, 0, DO_Permutations_multiply);
-
-	praat_addAction1 (classPitch, 2, L"To DTW...", L"To PointProcess", praat_HIDDEN, DO_Pitches_to_DTW);
-
-	praat_addAction1 (classPitchTier, 0, L"To Pitch...", L"To Sound (sine)...", 1, DO_PitchTier_to_Pitch);
-	praat_addAction1 (classPolygon, 0, QUERY_BUTTON, L"Paint circles...", 0, 0);
-	praat_addAction1 (classPolygon, 0, L"Get number of points", QUERY_BUTTON, 1, DO_Polygon_getNumberOfPoints);
-	praat_addAction1 (classPolygon, 0, L"Get point (x)...", L"Get number of points", 1, DO_Polygon_getPointX);
-	praat_addAction1 (classPolygon, 0, L"Get point (y)...",  L"Get point (x)...", 1, DO_Polygon_getPointY);
-	praat_addAction1 (classPolygon, 0, L"-- other queries --",  L"Get point (y)...", 1, 0);
-	praat_addAction1 (classPolygon, 0, L"Get location of point...", L"-- other queries --", 1, DO_Polygon_getLocationOfPoint);
-	praat_addAction1 (classPolygon, 0, L"Translate...", MODIFY_BUTTON, 1, DO_Polygon_translate);
-	praat_addAction1 (classPolygon, 0, L"Rotate...", L"Translate...", 1, DO_Polygon_rotate);
-	praat_addAction1 (classPolygon, 0, L"Scale...", L"Rotate...", 1, DO_Polygon_scale);
-	praat_addAction1 (classPolygon, 0, L"Reverse X", L"Scale...", 1, DO_Polygon_reverseX);
-	praat_addAction1 (classPolygon, 0, L"Reverse Y", L"Reverse X", 1, DO_Polygon_reverseY);
-	praat_addAction1 (classPolygon, 0, L"Simplify", 0, praat_HIDDEN, DO_Polygon_simplify);
-	praat_addAction1 (classPolygon, 0, L"Circular permutation...", 0, praat_HIDDEN, DO_Polygon_circularPermutation);
-
-	praat_addAction2 (classPolygon, 1, classCategories, 1, L"Draw...", 0, 0, DO_Polygon_Categories_draw);
-
-	praat_addAction1 (classPolynomial, 0, L"Polynomial help", 0, 0, DO_Polynomial_help);
+	praat_addAction1 (classPermutation, 1, U"Sort", 0, 1, DO_Permutation_sort);
+	praat_addAction1 (classPermutation, 1, U"Swap blocks...", 0, 1, DO_Permutation_swapBlocks);
+	praat_addAction1 (classPermutation, 1, U"Swap numbers...", 0, 1, DO_Permutation_swapNumbers);
+	praat_addAction1 (classPermutation, 1, U"Swap positions...", 0, 1, DO_Permutation_swapPositions);
+	praat_addAction1 (classPermutation, 1, U"Swap one from range...", 0, 1, DO_Permutation_swapOneFromRange);
+	praat_addAction1 (classPermutation, 0, U"-- sequential permutations --", 0, 1, 0);
+	praat_addAction1 (classPermutation, 0, U"Next", 0, 1, DO_Permutations_next);
+	praat_addAction1 (classPermutation, 0, U"Previous", 0, 1, DO_Permutations_previous);
+	praat_addAction1 (classPermutation, 1, U"Permute randomly...", 0, 0, DO_Permutation_permuteRandomly);
+	praat_addAction1 (classPermutation, 1, U"Permute randomly (blocks)...", 0, 0, DO_Permutation_permuteBlocksRandomly);
+	praat_addAction1 (classPermutation, 1, U"Interleave...", 0, 0, DO_Permutation_interleave);
+	praat_addAction1 (classPermutation, 1, U"Rotate...", 0, 0, DO_Permutation_rotate);
+	praat_addAction1 (classPermutation, 1, U"Reverse...", 0, 0, DO_Permutation_reverse);
+	praat_addAction1 (classPermutation, 1, U"Invert", 0, 0, DO_Permutation_invert);
+	praat_addAction1 (classPermutation, 0, U"Multiply", 0, 0, DO_Permutations_multiply);
+
+	praat_addAction1 (classPitch, 2, U"To DTW...", U"To PointProcess", praat_HIDDEN, DO_Pitches_to_DTW);
+
+	praat_addAction1 (classPitchTier, 0, U"To Pitch...", U"To Sound (sine)...", 1, DO_PitchTier_to_Pitch);
+	praat_addAction1 (classPolygon, 0, QUERY_BUTTON, U"Paint circles...", 0, 0);
+	praat_addAction1 (classPolygon, 0, U"Get number of points", QUERY_BUTTON, 1, DO_Polygon_getNumberOfPoints);
+	praat_addAction1 (classPolygon, 0, U"Get point (x)...", U"Get number of points", 1, DO_Polygon_getPointX);
+	praat_addAction1 (classPolygon, 0, U"Get point (y)...",  U"Get point (x)...", 1, DO_Polygon_getPointY);
+	praat_addAction1 (classPolygon, 0, U"-- other queries --",  U"Get point (y)...", 1, 0);
+	praat_addAction1 (classPolygon, 0, U"Get location of point...", U"-- other queries --", 1, DO_Polygon_getLocationOfPoint);
+	praat_addAction1 (classPolygon, 0, U"Get area of convex hull...", U"Get location of point...", praat_DEPTH_1 + praat_HIDDEN, DO_Polygon_getAreaOfConvexHull);
+	
+	praat_addAction1 (classPolygon, 0, U"Translate...", MODIFY_BUTTON, 1, DO_Polygon_translate);
+	praat_addAction1 (classPolygon, 0, U"Rotate...", U"Translate...", 1, DO_Polygon_rotate);
+	praat_addAction1 (classPolygon, 0, U"Scale...", U"Rotate...", 1, DO_Polygon_scale);
+	praat_addAction1 (classPolygon, 0, U"Reverse X", U"Scale...", 1, DO_Polygon_reverseX);
+	praat_addAction1 (classPolygon, 0, U"Reverse Y", U"Reverse X", 1, DO_Polygon_reverseY);
+	praat_addAction1 (classPolygon, 0, U"Simplify", 0, praat_HIDDEN, DO_Polygon_simplify);
+	praat_addAction1 (classPolygon, 0, U"Convex hull", 0, 0, DO_Polygon_convexHull);
+	praat_addAction1 (classPolygon, 0, U"Circular permutation...", 0, praat_HIDDEN, DO_Polygon_circularPermutation);
+
+	praat_addAction2 (classPolygon, 1, classCategories, 1, U"Draw...", 0, 0, DO_Polygon_Categories_draw);
+
+	praat_addAction1 (classPolynomial, 0, U"Polynomial help", 0, 0, DO_Polynomial_help);
 	praat_FunctionTerms_init (classPolynomial);
-	praat_addAction1 (classPolynomial, 0, L"-- area --", L"Get x of maximum...", 1, 0);
-	praat_addAction1 (classPolynomial, 1, L"Get area...", L"-- area --", 1, DO_Polynomial_getArea);
-	praat_addAction1 (classPolynomial, 0, L"-- monic --", L"Set coefficient...", 1, 0);
-	praat_addAction1 (classPolynomial, 0, L"Scale coefficients (monic)", L"-- monic --", 1, DO_Polynomial_scaleCoefficients_monic);
-	praat_addAction1 (classPolynomial, 1, L"Get value (complex)...", L"Get value...", 1, DO_Polynomial_evaluate_z);
-	praat_addAction1 (classPolynomial, 0, L"To Spectrum...", L"Analyse", 0, DO_Polynomial_to_Spectrum);
-	praat_addAction1 (classPolynomial, 0, L"To Roots", 0, 0, DO_Polynomial_to_Roots);
-	praat_addAction1 (classPolynomial, 0, L"To Polynomial (derivative)", 0, 0, DO_Polynomial_getDerivative);
-	praat_addAction1 (classPolynomial, 0, L"To Polynomial (primitive)", 0, 0, DO_Polynomial_getPrimitive);
-	praat_addAction1 (classPolynomial, 0, L"Scale x...", 0, 0, DO_Polynomial_scaleX);
-	praat_addAction1 (classPolynomial, 2, L"Multiply", 0, 0, DO_Polynomials_multiply);
-	praat_addAction1 (classPolynomial, 2, L"Divide...", 0, 0, DO_Polynomials_divide);
-
-	praat_addAction1 (classRoots, 1, L"Roots help", 0, 0, DO_Roots_help);
-	praat_addAction1 (classRoots, 1, L"Draw...", 0, 0, DO_Roots_draw);
+	praat_addAction1 (classPolynomial, 0, U"-- area --", U"Get x of maximum...", 1, 0);
+	praat_addAction1 (classPolynomial, 1, U"Get area...", U"-- area --", 1, DO_Polynomial_getArea);
+	praat_addAction1 (classPolynomial, 0, U"-- monic --", U"Set coefficient...", 1, 0);
+	praat_addAction1 (classPolynomial, 0, U"Scale coefficients (monic)", U"-- monic --", 1, DO_Polynomial_scaleCoefficients_monic);
+	praat_addAction1 (classPolynomial, 1, U"Get value (complex)...", U"Get value...", 1, DO_Polynomial_evaluate_z);
+	praat_addAction1 (classPolynomial, 0, U"To Spectrum...", U"Analyse", 0, DO_Polynomial_to_Spectrum);
+	praat_addAction1 (classPolynomial, 0, U"To Roots", 0, 0, DO_Polynomial_to_Roots);
+	praat_addAction1 (classPolynomial, 0, U"To Polynomial (derivative)", 0, 0, DO_Polynomial_getDerivative);
+	praat_addAction1 (classPolynomial, 0, U"To Polynomial (primitive)", 0, 0, DO_Polynomial_getPrimitive);
+	praat_addAction1 (classPolynomial, 0, U"Scale x...", 0, 0, DO_Polynomial_scaleX);
+	praat_addAction1 (classPolynomial, 2, U"Multiply", 0, 0, DO_Polynomials_multiply);
+	praat_addAction1 (classPolynomial, 2, U"Divide...", 0, 0, DO_Polynomials_divide);
+
+	praat_addAction1 (classRoots, 1, U"Roots help", 0, 0, DO_Roots_help);
+	praat_addAction1 (classRoots, 1, U"Draw...", 0, 0, DO_Roots_draw);
 	praat_addAction1 (classRoots, 1, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classRoots, 1, L"Get number of roots", 0, 1, DO_Roots_getNumberOfRoots);
-	praat_addAction1 (classRoots, 1, L"-- roots --", 0, 1, 0);
-	praat_addAction1 (classRoots, 1, L"Get root...", 0, 1, DO_Roots_getRoot);
-	praat_addAction1 (classRoots, 1, L"Get real part of root...", 0, 1, DO_Roots_getRealPartOfRoot);
-	praat_addAction1 (classRoots, 1, L"Get imaginary part of root...", 0, 1, DO_Roots_getImaginaryPartOfRoot);
+	praat_addAction1 (classRoots, 1, U"Get number of roots", 0, 1, DO_Roots_getNumberOfRoots);
+	praat_addAction1 (classRoots, 1, U"-- roots --", 0, 1, 0);
+	praat_addAction1 (classRoots, 1, U"Get root...", 0, 1, DO_Roots_getRoot);
+	praat_addAction1 (classRoots, 1, U"Get real part of root...", 0, 1, DO_Roots_getRealPartOfRoot);
+	praat_addAction1 (classRoots, 1, U"Get imaginary part of root...", 0, 1, DO_Roots_getImaginaryPartOfRoot);
 	praat_addAction1 (classRoots, 1, MODIFY_BUTTON, 0, 0, 0);
-	praat_addAction1 (classRoots, 1, L"Set root...", 0, 1, DO_Roots_setRoot);
-	praat_addAction1 (classRoots, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classRoots, 0, L"To Spectrum...", 0, 0, DO_Roots_to_Spectrum);
-
-	praat_addAction2 (classRoots, 1, classPolynomial, 1, L"Polish roots", 0, 0, DO_Roots_and_Polynomial_polish);
-
-	praat_addAction1 (classSound, 0, L"To TextGrid (silences)...", L"To IntervalTier", 1, DO_Sound_to_TextGrid_detectSilences);
-    praat_addAction1 (classSound, 0, L"Play one channel...", L"Play", praat_HIDDEN, DO_Sound_playOneChannel);
-    praat_addAction1 (classSound, 0, L"Play as frequency shifted...", L"Play", praat_HIDDEN, DO_Sound_playAsFrequencyShifted);
-	praat_addAction1 (classSound, 0, L"Draw where...", L"Draw...", 1, DO_Sound_drawWhere);
-	//	praat_addAction1 (classSound, 0, L"Paint where...", L"Draw where...", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_paintWhere);
-	praat_addAction1 (classSound, 0, L"Paint where...", L"Draw where...", 1, DO_Sound_paintWhere);
-	//	praat_addAction1 (classSound, 2, L"Paint enclosed...", L"Paint where...", praat_DEPTH_1 | praat_HIDDEN, DO_Sounds_paintEnclosed);
-	praat_addAction1 (classSound, 2, L"Paint enclosed...", L"Paint where...", 1, DO_Sounds_paintEnclosed);
-
-	praat_addAction1 (classSound, 0, L"To Pitch (shs)...", L"To Pitch (cc)...", 1, DO_Sound_to_Pitch_shs);
-	praat_addAction1 (classSound, 0, L"Fade in...", L"Multiply by window...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_fadeIn);
-	praat_addAction1 (classSound, 0, L"Fade out...", L"Fade in...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_fadeOut);
-	praat_addAction1 (classSound, 0, L"To Pitch (SPINET)...", L"To Pitch (cc)...", 1, DO_Sound_to_Pitch_SPINET);
-
-	praat_addAction1 (classSound, 0, L"To FormantFilter...", L"To Cochleagram (edb)...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_FormantFilter);
-	praat_addAction1 (classSound, 0, L"To Spectrogram (pitch-dependent)...", L"To Cochleagram (edb)...", 1, DO_Sound_to_Spectrogram_pitchDependent);
-
-	praat_addAction1 (classSound, 0, L"To BarkFilter...", L"To FormantFilter...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_BarkFilter); // deprecated 2014
-	praat_addAction1 (classSound, 0, L"To BarkSpectrogram...", L"To FormantFilter...", praat_DEPTH_1, DO_Sound_to_BarkSpectrogram);
-
-	praat_addAction1 (classSound, 0, L"To MelFilter...", L"To BarkFilter...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_MelFilter); // deprecated 2014
-	praat_addAction1 (classSound, 0, L"To MelSpectrogram...", L"To BarkSpectrogram...", praat_DEPTH_1, DO_Sound_to_MelSpectrogram);
-
-	praat_addAction1 (classSound, 0, L"To Polygon...", L"Down to Matrix", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_to_Polygon);
-    praat_addAction1 (classSound, 2, L"To Polygon (enclosed)...", L"Cross-correlate...", praat_DEPTH_1 | praat_HIDDEN, DO_Sounds_to_Polygon_enclosed);
-    praat_addAction1 (classSound, 2, L"To DTW...", L"Cross-correlate...", praat_DEPTH_1, DO_Sounds_to_DTW);
-
-	praat_addAction1 (classSound, 1, L"Filter (gammatone)...", L"Filter (de-emphasis)...", 1, DO_Sound_filterByGammaToneFilter4);
-	praat_addAction1 (classSound, 0, L"Remove noise...", L"Filter (formula)...", 1, DO_Sound_removeNoise);
-
-	praat_addAction1 (classSound, 0, L"Change gender...", L"Deepen band modulation...", 1, DO_Sound_changeGender);
-
-	praat_addAction1 (classSound, 0, L"Change speaker...", L"Deepen band modulation...", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_changeSpeaker);
-	praat_addAction1 (classSound, 0, L"Copy channel ranges...", L"Extract all channels", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_copyChannelRanges);
-	praat_addAction1 (classSound, 0, L"Trim silences...", L"Resample...", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_trimSilences);
-	praat_addAction1 (classSound, 0, L"To KlattGrid (simple)...", L"To Manipulation...", 1, DO_Sound_to_KlattGrid_simple);
-	praat_addAction2 (classSound, 1, classPitch, 1, L"To FormantFilter...", 0, praat_HIDDEN, DO_Sound_and_Pitch_to_FormantFilter);
-	praat_addAction2 (classSound, 1, classPitch, 1, L"To Spectrogram (pitch-dependent)...", 0, 0, DO_Sound_and_Pitch_to_Spectrogram);
-
-	praat_addAction2 (classSound, 1, classPitch, 1, L"Change gender...", 0, 0, DO_Sound_and_Pitch_changeGender);
-	praat_addAction2 (classSound, 1, classPitch, 1, L"Change speaker...", 0, praat_HIDDEN, DO_Sound_and_Pitch_changeSpeaker);
-	praat_addAction2 (classSound, 1, classIntervalTier, 1, L"Cut parts matching label...", 0, 0, DO_Sound_and_IntervalTier_cutPartsMatchingLabel);
-	praat_addAction1 (classSpectrogram, 2, L"To DTW...", L"To Spectrum (slice)...", 0, DO_Spectrograms_to_DTW);
-	praat_addAction1 (classSpectrum, 0, L"Draw phases...", L"Draw (log freq)...", praat_DEPTH_1 | praat_HIDDEN, DO_Spectrum_drawPhases);
-	praat_addAction1 (classSpectrum, 0, L"Conjugate", L"Formula...", praat_HIDDEN | praat_DEPTH_1, DO_Spectrum_conjugate);
-	praat_addAction1 (classSpectrum, 2, L"Multiply", L"To Sound (fft)", praat_HIDDEN, DO_Spectra_multiply);
-	praat_addAction1 (classSpectrum, 0, L"To Matrix (unwrap)", L"To Matrix", praat_HIDDEN, DO_Spectrum_unwrap);
-	praat_addAction1 (classSpectrum, 0, L"Shift frequencies...", L"To Matrix", praat_HIDDEN, DO_Spectrum_shiftFrequencies);
-	praat_addAction1 (classSpectrum, 0, L"Compress frequency domain...", L"Shift frequencies...", praat_HIDDEN, DO_Spectrum_compressFrequencyDomain);
-	praat_addAction1 (classSpectrum, 0, L"Resample...", L"Compress frequency domain...", praat_HIDDEN, DO_Spectrum_resample);
-	praat_addAction1 (classSpectrum, 0, L"To Cepstrum", L"To Spectrogram", 1, DO_Spectrum_to_Cepstrum);
-	praat_addAction1 (classSpectrum, 0, L"To PowerCepstrum", L"To Cepstrum", 1, DO_Spectrum_to_PowerCepstrum);
-
-	praat_addAction1 (classSpeechSynthesizer, 0, L"SpeechSynthesizer help", 0, 0, DO_SpeechSynthesizer_help);
-	praat_addAction1 (classSpeechSynthesizer, 0, L"Play text...", 0, 0, DO_SpeechSynthesizer_playText);
-	praat_addAction1 (classSpeechSynthesizer, 0, L"To Sound...", 0, 0, DO_SpeechSynthesizer_to_Sound);
+	praat_addAction1 (classRoots, 1, U"Set root...", 0, 1, DO_Roots_setRoot);
+	praat_addAction1 (classRoots, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classRoots, 0, U"To Spectrum...", 0, 0, DO_Roots_to_Spectrum);
+
+	praat_addAction2 (classRoots, 1, classPolynomial, 1, U"Polish roots", 0, 0, DO_Roots_and_Polynomial_polish);
+
+	praat_addAction1 (classSound, 0, U"To TextGrid (silences)...", U"To IntervalTier", 1, DO_Sound_to_TextGrid_detectSilences);
+    praat_addAction1 (classSound, 0, U"Play one channel...", U"Play", praat_HIDDEN, DO_Sound_playOneChannel);
+    praat_addAction1 (classSound, 0, U"Play as frequency shifted...", U"Play", praat_HIDDEN, DO_Sound_playAsFrequencyShifted);
+	praat_addAction1 (classSound, 0, U"Draw where...", U"Draw...", 1, DO_Sound_drawWhere);
+	//	praat_addAction1 (classSound, 0, U"Paint where...", U"Draw where...", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_paintWhere);
+	praat_addAction1 (classSound, 0, U"Paint where...", U"Draw where...", 1, DO_Sound_paintWhere);
+	//	praat_addAction1 (classSound, 2, U"Paint enclosed...", U"Paint where...", praat_DEPTH_1 | praat_HIDDEN, DO_Sounds_paintEnclosed);
+	praat_addAction1 (classSound, 2, U"Paint enclosed...", U"Paint where...", 1, DO_Sounds_paintEnclosed);
+
+	praat_addAction1 (classSound, 0, U"To Pitch (shs)...", U"To Pitch (cc)...", 1, DO_Sound_to_Pitch_shs);
+	praat_addAction1 (classSound, 0, U"Fade in...", U"Multiply by window...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_fadeIn);
+	praat_addAction1 (classSound, 0, U"Fade out...", U"Fade in...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_fadeOut);
+	praat_addAction1 (classSound, 0, U"To Pitch (SPINET)...", U"To Pitch (cc)...", 1, DO_Sound_to_Pitch_SPINET);
+
+	praat_addAction1 (classSound, 0, U"To FormantFilter...", U"To Cochleagram (edb)...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_FormantFilter);
+	praat_addAction1 (classSound, 0, U"To Spectrogram (pitch-dependent)...", U"To Cochleagram (edb)...", 1, DO_Sound_to_Spectrogram_pitchDependent);
+
+	praat_addAction1 (classSound, 0, U"To BarkFilter...", U"To FormantFilter...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_BarkFilter); // deprecated 2014
+	praat_addAction1 (classSound, 0, U"To BarkSpectrogram...", U"To FormantFilter...", praat_DEPTH_1, DO_Sound_to_BarkSpectrogram);
+
+	praat_addAction1 (classSound, 0, U"To MelFilter...", U"To BarkFilter...", praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_MelFilter); // deprecated 2014
+	praat_addAction1 (classSound, 0, U"To MelSpectrogram...", U"To BarkSpectrogram...", praat_DEPTH_1, DO_Sound_to_MelSpectrogram);
+	praat_addAction1 (classSound, 0, U"To ComplexSpectrogram...", U"To MelSpectrogram...", praat_DEPTH_1 + praat_HIDDEN, DO_Sound_to_ComplexSpectrogram);
+
+	praat_addAction1 (classSound, 0, U"To Polygon...", U"Down to Matrix", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_to_Polygon);
+    praat_addAction1 (classSound, 2, U"To Polygon (enclosed)...", U"Cross-correlate...", praat_DEPTH_1 | praat_HIDDEN, DO_Sounds_to_Polygon_enclosed);
+    praat_addAction1 (classSound, 2, U"To DTW...", U"Cross-correlate...", praat_DEPTH_1, DO_Sounds_to_DTW);
+
+	praat_addAction1 (classSound, 1, U"Filter (gammatone)...", U"Filter (de-emphasis)...", 1, DO_Sound_filterByGammaToneFilter4);
+	praat_addAction1 (classSound, 0, U"Remove noise...", U"Filter (formula)...", 1, DO_Sound_removeNoise);
+
+	praat_addAction1 (classSound, 0, U"Change gender...", U"Deepen band modulation...", 1, DO_Sound_changeGender);
+
+	praat_addAction1 (classSound, 0, U"Change speaker...", U"Deepen band modulation...", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_changeSpeaker);
+	praat_addAction1 (classSound, 0, U"Copy channel ranges...", U"Extract all channels", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_copyChannelRanges);
+	praat_addAction1 (classSound, 0, U"Trim silences...", U"Resample...", praat_DEPTH_1 | praat_HIDDEN, DO_Sound_trimSilences);
+	praat_addAction1 (classSound, 0, U"To KlattGrid (simple)...", U"To Manipulation...", 1, DO_Sound_to_KlattGrid_simple);
+	praat_addAction2 (classSound, 1, classPitch, 1, U"To FormantFilter...", 0, praat_HIDDEN, DO_Sound_and_Pitch_to_FormantFilter);
+	praat_addAction2 (classSound, 1, classPitch, 1, U"To Spectrogram (pitch-dependent)...", 0, 0, DO_Sound_and_Pitch_to_Spectrogram);
+
+	praat_addAction2 (classSound, 1, classPitch, 1, U"Change gender...", 0, 0, DO_Sound_and_Pitch_changeGender);
+	praat_addAction2 (classSound, 1, classPitch, 1, U"Change speaker...", 0, praat_HIDDEN, DO_Sound_and_Pitch_changeSpeaker);
+	praat_addAction2 (classSound, 1, classIntervalTier, 1, U"Cut parts matching label...", 0, 0, DO_Sound_and_IntervalTier_cutPartsMatchingLabel);
+	praat_addAction1 (classSpectrogram, 2, U"To DTW...", U"To Spectrum (slice)...", 0, DO_Spectrograms_to_DTW);
+	praat_addAction1 (classSpectrum, 0, U"Draw phases...", U"Draw (log freq)...", praat_DEPTH_1 | praat_HIDDEN, DO_Spectrum_drawPhases);
+	praat_addAction1 (classSpectrum, 0, U"Set real value in bin...", U"Formula...", praat_HIDDEN | praat_DEPTH_1, DO_Spectrum_setRealValueInBin);
+	praat_addAction1 (classSpectrum, 0, U"Set imaginary value in bin...", U"Formula...", praat_HIDDEN | praat_DEPTH_1, DO_Spectrum_setImaginaryValueInBin);
+	praat_addAction1 (classSpectrum, 0, U"Conjugate", U"Formula...", praat_HIDDEN | praat_DEPTH_1, DO_Spectrum_conjugate);
+	praat_addAction1 (classSpectrum, 2, U"Multiply", U"To Sound (fft)", praat_HIDDEN, DO_Spectra_multiply);
+	praat_addAction1 (classSpectrum, 0, U"To Matrix (unwrap)", U"To Matrix", praat_HIDDEN, DO_Spectrum_unwrap);
+	praat_addAction1 (classSpectrum, 0, U"Shift frequencies...", U"To Matrix", praat_HIDDEN, DO_Spectrum_shiftFrequencies);
+	praat_addAction1 (classSpectrum, 0, U"Compress frequency domain...", U"Shift frequencies...", praat_HIDDEN, DO_Spectrum_compressFrequencyDomain);
+	praat_addAction1 (classSpectrum, 0, U"Resample...", U"Compress frequency domain...", praat_HIDDEN, DO_Spectrum_resample);
+	praat_addAction1 (classSpectrum, 0, U"To Cepstrum", U"To Spectrogram", 1, DO_Spectrum_to_Cepstrum);
+	praat_addAction1 (classSpectrum, 0, U"To PowerCepstrum", U"To Cepstrum", 1, DO_Spectrum_to_PowerCepstrum);
+
+	praat_addAction1 (classSpeechSynthesizer, 0, U"SpeechSynthesizer help", 0, 0, DO_SpeechSynthesizer_help);
+	praat_addAction1 (classSpeechSynthesizer, 0, U"Play text...", 0, 0, DO_SpeechSynthesizer_playText);
+	praat_addAction1 (classSpeechSynthesizer, 0, U"To Sound...", 0, 0, DO_SpeechSynthesizer_to_Sound);
 	praat_addAction1 (classSpeechSynthesizer, 0, QUERY_BUTTON, 0, 0, 0);
-		praat_addAction1 (classSpeechSynthesizer, 1, L"Get voice name", 0, 1, DO_SpeechSynthesizer_getVoiceName);
-		praat_addAction1 (classSpeechSynthesizer, 1, L"Get voice variant", 0, 1, DO_SpeechSynthesizer_getVoiceVariant);
+		praat_addAction1 (classSpeechSynthesizer, 1, U"Get voice name", 0, 1, DO_SpeechSynthesizer_getVoiceName);
+		praat_addAction1 (classSpeechSynthesizer, 1, U"Get voice variant", 0, 1, DO_SpeechSynthesizer_getVoiceVariant);
 	praat_addAction1 (classSpeechSynthesizer, 0, MODIFY_BUTTON, 0, 0, 0);
-		praat_addAction1 (classSpeechSynthesizer, 0, L"Set text input settings...", 0, 1, DO_SpeechSynthesizer_setTextInputSettings);
-		praat_addAction1 (classSpeechSynthesizer, 0, L"Set speech output settings...", 0, 1, DO_SpeechSynthesizer_setSpeechOutputSettings);
-	praat_addAction2 (classSpeechSynthesizer, 1, classTextGrid, 1, L"To Sound...", 0, 0, DO_SpeechSynthesizer_and_TextGrid_to_Sound);
+		praat_addAction1 (classSpeechSynthesizer, 0, U"Set text input settings...", 0, 1, DO_SpeechSynthesizer_setTextInputSettings);
+		praat_addAction1 (classSpeechSynthesizer, 0, U"Set speech output settings...", 0, 1, DO_SpeechSynthesizer_setSpeechOutputSettings);
+	praat_addAction2 (classSpeechSynthesizer, 1, classTextGrid, 1, U"To Sound...", 0, 0, DO_SpeechSynthesizer_and_TextGrid_to_Sound);
 
-	praat_addAction3 (classSpeechSynthesizer, 1, classSound, 1, classTextGrid, 1, L"To TextGrid (align)...", 0, 0, DO_SpeechSynthesizer_and_Sound_and_TextGrid_align);
-    praat_addAction3 (classSpeechSynthesizer, 1, classSound, 1, classTextGrid, 1, L"To TextGrid (align,trim)...", 0, 0, DO_SpeechSynthesizer_and_Sound_and_TextGrid_align2);
+	praat_addAction3 (classSpeechSynthesizer, 1, classSound, 1, classTextGrid, 1, U"To TextGrid (align)...", 0, 0, DO_SpeechSynthesizer_and_Sound_and_TextGrid_align);
+    praat_addAction3 (classSpeechSynthesizer, 1, classSound, 1, classTextGrid, 1, U"To TextGrid (align,trim)...", 0, 0, DO_SpeechSynthesizer_and_Sound_and_TextGrid_align2);
 
-	praat_addAction1 (classSSCP, 0, L"SSCP help", 0, 0, DO_SSCP_help);
+	praat_addAction1 (classSSCP, 0, U"SSCP help", 0, 0, DO_SSCP_help);
 	praat_TableOfReal_init2 (classSSCP);
-	praat_removeAction (classSSCP, NULL, NULL, L"Append");
-	praat_addAction1 (classSSCP, 0, L"Draw sigma ellipse...", DRAW_BUTTON, 1, DO_SSCP_drawSigmaEllipse);
-	praat_addAction1 (classSSCP, 0, L"Draw confidence ellipse...", DRAW_BUTTON, 1, DO_SSCP_drawConfidenceEllipse);
+	praat_removeAction (classSSCP, nullptr, nullptr, U"Append");
+	praat_addAction1 (classSSCP, 0, U"Draw sigma ellipse...", DRAW_BUTTON, 1, DO_SSCP_drawSigmaEllipse);
+	praat_addAction1 (classSSCP, 0, U"Draw confidence ellipse...", DRAW_BUTTON, 1, DO_SSCP_drawConfidenceEllipse);
 	praat_SSCP_query_init (classSSCP);
-	praat_addAction1 (classSSCP, 1, L"Get diagonality (bartlett)...", L"Get ln(determinant)", 1, DO_SSCP_testDiagonality_bartlett);
-	praat_addAction1 (classSSCP, 1, L"Get total variance", L"Get diagonality (bartlett)...", 1, DO_SSCP_getTotalVariance);
-	praat_addAction1 (classSSCP, 1, L"Get sigma ellipse area...", L"Get total variance", 1, DO_SSCP_getConcentrationEllipseArea);
-	praat_addAction1 (classSSCP, 1, L"Get confidence ellipse area...", L"Get sigma ellipse area...", 1, DO_SSCP_getConfidenceEllipseArea);
-	praat_addAction1 (classSSCP, 1, L"Get fraction variation...", L"Get confidence ellipse area...", 1, DO_SSCP_getFractionVariation);
+	praat_addAction1 (classSSCP, 1, U"Get diagonality (bartlett)...", U"Get ln(determinant)", 1, DO_SSCP_testDiagonality_bartlett);
+	praat_addAction1 (classSSCP, 1, U"Get total variance", U"Get diagonality (bartlett)...", 1, DO_SSCP_getTotalVariance);
+	praat_addAction1 (classSSCP, 1, U"Get sigma ellipse area...", U"Get total variance", 1, DO_SSCP_getConcentrationEllipseArea);
+	praat_addAction1 (classSSCP, 1, U"Get confidence ellipse area...", U"Get sigma ellipse area...", 1, DO_SSCP_getConfidenceEllipseArea);
+	praat_addAction1 (classSSCP, 1, U"Get fraction variation...", U"Get confidence ellipse area...", 1, DO_SSCP_getFractionVariation);
 	praat_SSCP_extract_init (classSSCP);
-	praat_addAction1 (classSSCP, 0, L"To PCA", 0, 0, DO_SSCP_to_PCA);
-	praat_addAction1 (classSSCP, 0, L"To Correlation", 0, 0, DO_SSCP_to_Correlation);
-	praat_addAction1 (classSSCP, 0, L"To Covariance...", 0, 0, DO_SSCP_to_Covariance);
-
-	praat_addAction1 (classStrings, 0, L"To Categories", 0, 0, DO_Strings_to_Categories);
-	praat_addAction1 (classStrings, 0, L"Append", 0, 0, DO_Strings_append);
-	praat_addAction1 (classStrings, 0, L"Change...", L"Replace all...", praat_HIDDEN, DO_Strings_change);
-	praat_addAction1 (classStrings, 0, L"Extract part...", L"Replace all...", 0, DO_Strings_extractPart);
-	praat_addAction1 (classStrings, 0, L"To Permutation...", L"To Distributions", 0, DO_Strings_to_Permutation);
-	praat_addAction1 (classStrings, 2, L"To EditDistanceTable", L"To Distributions", 0, DO_Strings_to_EditDistanceTable);
-
-	praat_addAction1 (classSVD, 0, L"To TableOfReal...", 0, 0, DO_SVD_to_TableOfReal);
-	praat_addAction1 (classSVD, 0, L"Extract left singular vectors", 0, 0, DO_SVD_extractLeftSingularVectors);
-	praat_addAction1 (classSVD, 0, L"Extract right singular vectors", 0, 0, DO_SVD_extractRightSingularVectors);
-	praat_addAction1 (classSVD, 0, L"Extract singular values", 0, 0, DO_SVD_extractSingularValues);
-		praat_addAction1 (classTable, 0, L"Draw ellipses...", L"Draw ellipse (standard deviation)...", praat_DEPTH_1, DO_Table_drawEllipses);
-		praat_addAction1 (classTable, 0, L"Box plots...", L"Draw ellipses...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_boxPlots);
-		praat_addAction1 (classTable, 0, L"Normal probability plot...", L"Box plots...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_normalProbabilityPlot);
-		praat_addAction1 (classTable, 0, L"Quantile-quantile plot...", L"Normal probability plot...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_quantileQuantilePlot);
-		praat_addAction1 (classTable, 0, L"Quantile-quantile plot (between levels)...", L"Quantile-quantile plot...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_quantileQuantilePlot_betweenLevels);
-		praat_addAction1 (classTable, 0, L"Lag plot...", L"Quantile-quantile plot (between levels)...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_lagPlot);
-		praat_addAction1 (classTable, 0, L"Horizontal error bars plot...", L"Scatter plot (mark)...", praat_DEPTH_1, DO_Table_horizontalErrorBarsPlot);
-		praat_addAction1 (classTable, 0, L"Vertical error bars plot...", L"Scatter plot (mark)...", praat_DEPTH_1, DO_Table_verticalErrorBarsPlot);
-		praat_addAction1 (classTable, 0, L"Distribution plot...", L"Quantile-quantile plot...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_distributionPlot);
-		praat_addAction1 (classTable, 1, L"Draw where",  L"Lag plot...", 1 , 0);
-			praat_addAction1 (classTable, 0, L"Scatter plot where...", L"Draw where", 2, DO_Table_scatterPlotWhere);
-			praat_addAction1 (classTable, 0, L"Scatter plot where (mark)...", L"Scatter plot where...", 2, DO_Table_scatterPlotMarkWhere);
-			praat_addAction1 (classTable, 0, L"Horizontal error bars plot where...", L"Scatter plot where (mark)...", praat_DEPTH_2, DO_Table_horizontalErrorBarsPlotWhere);
-			praat_addAction1 (classTable, 0, L"Vertical error bars plot where...", L"Scatter plot where (mark)...", praat_DEPTH_2, DO_Table_verticalErrorBarsPlotWhere);
+	praat_addAction1 (classSSCP, 0, U"To PCA", 0, 0, DO_SSCP_to_PCA);
+	praat_addAction1 (classSSCP, 0, U"To Correlation", 0, 0, DO_SSCP_to_Correlation);
+	praat_addAction1 (classSSCP, 0, U"To Covariance...", 0, 0, DO_SSCP_to_Covariance);
+
+	praat_addAction1 (classStrings, 0, U"To Categories", 0, 0, DO_Strings_to_Categories);
+	praat_addAction1 (classStrings, 0, U"Append", 0, 0, DO_Strings_append);
+	praat_addAction1 (classStrings, 0, U"Change...", U"Replace all...", praat_HIDDEN, DO_Strings_change);
+	praat_addAction1 (classStrings, 0, U"Extract part...", U"Replace all...", 0, DO_Strings_extractPart);
+	praat_addAction1 (classStrings, 0, U"To Permutation...", U"To Distributions", 0, DO_Strings_to_Permutation);
+	praat_addAction1 (classStrings, 2, U"To EditDistanceTable", U"To Distributions", 0, DO_Strings_to_EditDistanceTable);
+
+	praat_addAction1 (classSVD, 0, U"To TableOfReal...", 0, 0, DO_SVD_to_TableOfReal);
+	praat_addAction1 (classSVD, 0, U"Extract left singular vectors", 0, 0, DO_SVD_extractLeftSingularVectors);
+	praat_addAction1 (classSVD, 0, U"Extract right singular vectors", 0, 0, DO_SVD_extractRightSingularVectors);
+	praat_addAction1 (classSVD, 0, U"Extract singular values", 0, 0, DO_SVD_extractSingularValues);
+		praat_addAction1 (classTable, 0, U"Draw ellipses...", U"Draw ellipse (standard deviation)...", praat_DEPTH_1, DO_Table_drawEllipses);
+		praat_addAction1 (classTable, 0, U"Box plots...", U"Draw ellipses...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_boxPlots);
+		praat_addAction1 (classTable, 0, U"Normal probability plot...", U"Box plots...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_normalProbabilityPlot);
+		praat_addAction1 (classTable, 0, U"Quantile-quantile plot...", U"Normal probability plot...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_quantileQuantilePlot);
+		praat_addAction1 (classTable, 0, U"Quantile-quantile plot (between levels)...", U"Quantile-quantile plot...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_quantileQuantilePlot_betweenLevels);
+		praat_addAction1 (classTable, 0, U"Lag plot...", U"Quantile-quantile plot (between levels)...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_lagPlot);
+		praat_addAction1 (classTable, 0, U"Horizontal error bars plot...", U"Scatter plot (mark)...", praat_DEPTH_1, DO_Table_horizontalErrorBarsPlot);
+		praat_addAction1 (classTable, 0, U"Vertical error bars plot...", U"Scatter plot (mark)...", praat_DEPTH_1, DO_Table_verticalErrorBarsPlot);
+		praat_addAction1 (classTable, 0, U"Distribution plot...", U"Quantile-quantile plot...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_distributionPlot);
+		praat_addAction1 (classTable, 1, U"Draw where",  U"Lag plot...", 1 , 0);
+			praat_addAction1 (classTable, 0, U"Scatter plot where...", U"Draw where", 2, DO_Table_scatterPlotWhere);
+			praat_addAction1 (classTable, 0, U"Scatter plot where (mark)...", U"Scatter plot where...", 2, DO_Table_scatterPlotMarkWhere);
+			praat_addAction1 (classTable, 0, U"Horizontal error bars plot where...", U"Scatter plot where (mark)...", praat_DEPTH_2, DO_Table_horizontalErrorBarsPlotWhere);
+			praat_addAction1 (classTable, 0, U"Vertical error bars plot where...", U"Scatter plot where (mark)...", praat_DEPTH_2, DO_Table_verticalErrorBarsPlotWhere);
 			
-			praat_addAction1 (classTable, 0, L"Distribution plot where...", L"Scatter plot where (mark)...", 2, DO_Table_distributionPlotWhere);
-			praat_addAction1 (classTable, 0, L"Draw ellipse where (standard deviation)...", L"Distribution plot where...", 2, DO_Table_drawEllipseWhere);
-			praat_addAction1 (classTable, 0, L"Box plots where...", L"Draw ellipse where (standard deviation)...", 2, DO_Table_boxPlotsWhere);
-			praat_addAction1 (classTable, 0, L"Normal probability plot where...", L"Box plots where...", 2, DO_Table_normalProbabilityPlotWhere);
-			praat_addAction1 (classTable, 0, L"Bar plot where...", L"Normal probability plot where...", 2, DO_Table_barPlotWhere);
-			praat_addAction1 (classTable, 0, L"Line graph where...", L"Bar plot where...", 2, DO_Table_LineGraphWhere);
-			praat_addAction1 (classTable, 0, L"Lag plot where...", L"Line graph where...", 2, DO_Table_lagPlotWhere);
-			praat_addAction1 (classTable, 0, L"Draw ellipses where...", L"Lag plot where...", 2, DO_Table_drawEllipsesWhere);
-
-	praat_addAction1 (classTable, 1, L"Get number of rows where...", L"Get number of rows", praat_DEPTH_1 | praat_HIDDEN,	DO_Table_getNumberOfRowsWhere);
-	praat_addAction1 (classTable, 1, L"Report one-way anova...", L"Report group difference (Wilcoxon rank sum)...", praat_DEPTH_1 | praat_HIDDEN,	DO_Table_reportOneWayAnova);
-	praat_addAction1 (classTable, 1, L"Report one-way Kruskal-Wallis...", L"Report one-way anova...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_reportOneWayKruskalWallis);
-	praat_addAction1 (classTable, 1, L"Report two-way anova...", L"Report one-way Kruskal-Wallis...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_reportTwoWayAnova);
-	praat_addAction1 (classTable, 1, L"Extract rows where...", L"Extract rows where column (text)...", praat_DEPTH_1, DO_Table_extractRowsWhere);
-	praat_addAction1 (classTable, 1, L"Extract rows where (mahalanobis)...", L"Extract rows where...", praat_DEPTH_1| praat_HIDDEN, DO_Table_extractRowsMahalanobisWhere);
-
-	praat_addAction1 (classTable, 0, L"To KlattTable", 0, praat_HIDDEN, DO_Table_to_KlattTable);
-	praat_addAction1 (classTable, 1, L"Get median absolute deviation...", L"Get standard deviation...", 1, DO_Table_getMedianAbsoluteDeviation);
-	praat_addAction1 (classTable, 0, L"To StringsIndex (column)...", 0, praat_HIDDEN, DO_Table_to_StringsIndex_column);
-
-	praat_addAction1 (classTableOfReal, 1, L"Report multivariate normality...", L"Get column stdev (label)...",
+			praat_addAction1 (classTable, 0, U"Distribution plot where...", U"Scatter plot where (mark)...", 2, DO_Table_distributionPlotWhere);
+			praat_addAction1 (classTable, 0, U"Draw ellipse where (standard deviation)...", U"Distribution plot where...", 2, DO_Table_drawEllipseWhere);
+			praat_addAction1 (classTable, 0, U"Box plots where...", U"Draw ellipse where (standard deviation)...", 2, DO_Table_boxPlotsWhere);
+			praat_addAction1 (classTable, 0, U"Normal probability plot where...", U"Box plots where...", 2, DO_Table_normalProbabilityPlotWhere);
+			praat_addAction1 (classTable, 0, U"Bar plot where...", U"Normal probability plot where...", 2, DO_Table_barPlotWhere);
+			praat_addAction1 (classTable, 0, U"Line graph where...", U"Bar plot where...", 2, DO_Table_LineGraphWhere);
+			praat_addAction1 (classTable, 0, U"Lag plot where...", U"Line graph where...", 2, DO_Table_lagPlotWhere);
+			praat_addAction1 (classTable, 0, U"Draw ellipses where...", U"Lag plot where...", 2, DO_Table_drawEllipsesWhere);
+
+	praat_addAction1 (classTable, 1, U"Get number of rows where...", U"Get number of rows", praat_DEPTH_1 | praat_HIDDEN,	DO_Table_getNumberOfRowsWhere);
+	praat_addAction1 (classTable, 1, U"Report one-way anova...", U"Report group difference (Wilcoxon rank sum)...", praat_DEPTH_1 | praat_HIDDEN,	DO_Table_reportOneWayAnova);
+	praat_addAction1 (classTable, 1, U"Report one-way Kruskal-Wallis...", U"Report one-way anova...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_reportOneWayKruskalWallis);
+	praat_addAction1 (classTable, 1, U"Report two-way anova...", U"Report one-way Kruskal-Wallis...", praat_DEPTH_1 | praat_HIDDEN, DO_Table_reportTwoWayAnova);
+	praat_addAction1 (classTable, 0, U"Extract rows where...", U"Extract rows where column (text)...", praat_DEPTH_1, DO_Table_extractRowsWhere);
+	praat_addAction1 (classTable, 0, U"Extract rows where (mahalanobis)...", U"Extract rows where...", praat_DEPTH_1| praat_HIDDEN, DO_Table_extractRowsMahalanobisWhere);
+	praat_addAction1 (classTable, 0, U"-- Extract columns ----", U"Extract rows where (mahalanobis)...", praat_DEPTH_1| praat_HIDDEN, 0);
+	praat_addAction1 (classTable, 0, U"Extract column ranges...", U"-- Extract columns ----", praat_DEPTH_1| praat_HIDDEN, DO_Table_extractColumnRanges);
+	
+
+	praat_addAction1 (classTable, 0, U"To KlattTable", 0, praat_HIDDEN, DO_Table_to_KlattTable);
+	praat_addAction1 (classTable, 1, U"Get median absolute deviation...", U"Get standard deviation...", 1, DO_Table_getMedianAbsoluteDeviation);
+	praat_addAction1 (classTable, 0, U"To StringsIndex (column)...", 0, praat_HIDDEN, DO_Table_to_StringsIndex_column);
+
+	praat_addAction1 (classTableOfReal, 1, U"Report multivariate normality...", U"Get column stdev (label)...",
 		praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_reportMultivariateNormality);
-	praat_addAction1 (classTableOfReal, 0, L"Append columns", L"Append", 1, DO_TableOfReal_appendColumns);
-	praat_addAction1 (classTableOfReal, 0, L"Multivariate statistics -", 0, 0, 0);
-	praat_addAction1 (classTableOfReal, 0, L"To Discriminant", 0, 1, DO_TableOfReal_to_Discriminant);
-	praat_addAction1 (classTableOfReal, 0, L"To PCA", 0, 1, DO_TableOfReal_to_PCA);
-	praat_addAction1 (classTableOfReal, 0, L"To SSCP...", 0, 1, DO_TableOfReal_to_SSCP);
-	praat_addAction1 (classTableOfReal, 0, L"To Covariance", 0, 1, DO_TableOfReal_to_Covariance);
-	praat_addAction1 (classTableOfReal, 0, L"To Correlation", 0, 1, DO_TableOfReal_to_Correlation);
-	praat_addAction1 (classTableOfReal, 0, L"To Correlation (rank)", 0, 1, DO_TableOfReal_to_Correlation_rank);
-	praat_addAction1 (classTableOfReal, 0, L"To CCA...", 0, 1, DO_TableOfReal_to_CCA);
-	praat_addAction1 (classTableOfReal, 0, L"To TableOfReal (means by row labels)...", 0, 1, DO_TableOfReal_meansByRowLabels);
-	praat_addAction1 (classTableOfReal, 0, L"To TableOfReal (medians by row labels)...", 0, 1, DO_TableOfReal_mediansByRowLabels);
-
-	praat_addAction1 (classTableOfReal, 0, L"-- configurations --", 0, 1, 0);
-	praat_addAction1 (classTableOfReal, 0, L"To Configuration (pca)...",	0, 1, DO_TableOfReal_to_Configuration_pca);
-	praat_addAction1 (classTableOfReal, 0, L"To Configuration (lda)...", 0, 1, DO_TableOfReal_to_Configuration_lda);
-	praat_addAction1 (classTableOfReal, 2, L"-- between tables --", L"To Configuration (lda)...", 1, 0);
-	praat_addAction1 (classTableOfReal, 2, L"To TableOfReal (cross-correlations)...", 0, praat_HIDDEN + praat_DEPTH_1, DO_TableOfReal_and_TableOfReal_crossCorrelations);
-
-
-	praat_addAction1 (classTableOfReal, 1, L"To Pattern and Categories...", L"To Matrix", 1, DO_TableOfReal_to_Pattern_and_Categories);
-	praat_addAction1 (classTableOfReal, 1, L"Split into Pattern and Categories...", L"To Pattern and Categories...", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_to_Pattern_and_Categories);
-	praat_addAction1 (classTableOfReal, 0, L"To Permutation (sort row labels)", L"To Matrix", 1, DO_TableOfReal_to_Permutation_sortRowlabels);
-
-	praat_addAction1 (classTableOfReal, 1, L"To SVD", 0, praat_HIDDEN, DO_TableOfReal_to_SVD);
-	praat_addAction1 (classTableOfReal, 2, L"To GSVD", 0, praat_HIDDEN, DO_TablesOfReal_to_GSVD);
-	praat_addAction1 (classTableOfReal, 2, L"To Eigen (gsvd)", 0, praat_HIDDEN, DO_TablesOfReal_to_Eigen_gsvd);
-
-	praat_addAction1 (classTableOfReal, 0, L"To TableOfReal (cholesky)...", 0, praat_HIDDEN, DO_TableOfReal_choleskyDecomposition);
-
-	praat_addAction1 (classTableOfReal, 0, L"-- scatter plots --", L"Draw top and bottom lines...", 1, 0);
-	praat_addAction1 (classTableOfReal, 0, L"Draw scatter plot...", L"-- scatter plots --", 1, DO_TableOfReal_drawScatterPlot);
-	praat_addAction1 (classTableOfReal, 0, L"Draw scatter plot matrix...", L"Draw scatter plot...", 1, DO_TableOfReal_drawScatterPlotMatrix);
-	praat_addAction1 (classTableOfReal, 0, L"Draw box plots...", L"Draw scatter plot matrix...", 1, DO_TableOfReal_drawBoxPlots);
-	praat_addAction1 (classTableOfReal, 0, L"Draw biplot...", L"Draw box plots...", 1, DO_TableOfReal_drawBiplot);
-	praat_addAction1 (classTableOfReal, 0, L"Draw vectors...", L"Draw box plots...", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_drawVectors);
-	praat_addAction1 (classTableOfReal, 1, L"Draw row as histogram...", L"Draw biplot...", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_drawRowAsHistogram);
-	praat_addAction1 (classTableOfReal, 1, L"Draw rows as histogram...", L"Draw row as histogram...", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_drawRowsAsHistogram);
-	praat_addAction1 (classTableOfReal, 1, L"Draw column as distribution...", L"Draw rows as histogram...", praat_DEPTH_1, DO_TableOfReal_drawColumnAsDistribution);
-
-	praat_addAction2 (classStrings, 1, classPermutation, 1, L"Permute strings", 0, 0, DO_Strings_and_Permutation_permuteStrings);
-
-	praat_addAction2 (classTableOfReal, 1, classPermutation, 1, L"Permute rows",	0, 0, DO_TableOfReal_and_Permutation_permuteRows);
-
-	praat_addAction1 (classTextGrid, 0, L"Extend time...", L"Scale times...", 2, DO_TextGrid_extendTime);
-	praat_addAction1 (classTextGrid, 1, L"Set tier name...", L"Remove tier...", 1, DO_TextGrid_setTierName);
-	praat_addAction1 (classTextGrid, 0, L"Replace interval text...", L"Set interval text...", 2, DO_TextGrid_replaceIntervalTexts);
-	praat_addAction1 (classTextGrid, 0, L"Replace point text...", L"Set point text...", 2, DO_TextGrid_replacePointTexts);
-	praat_addAction1 (classTextGrid, 2, L"To Table (text alignment)...", L"Extract part...", 0, DO_TextGrids_to_Table_textAlignmentment);
-	praat_addAction2 (classTextGrid, 2, classEditCostsTable, 1, L"To Table (text alignment)...", 0, 0, DO_TextGrids_and_EditCostsTable_to_Table_textAlignmentment);
+	praat_addAction1 (classTableOfReal, 0, U"Append columns", U"Append", 1, DO_TableOfReal_appendColumns);
+	praat_addAction1 (classTableOfReal, 0, U"Multivariate statistics -", 0, 0, 0);
+	praat_addAction1 (classTableOfReal, 0, U"To Discriminant", 0, 1, DO_TableOfReal_to_Discriminant);
+	praat_addAction1 (classTableOfReal, 0, U"To PCA", 0, 1, DO_TableOfReal_to_PCA);
+	praat_addAction1 (classTableOfReal, 0, U"To SSCP...", 0, 1, DO_TableOfReal_to_SSCP);
+	praat_addAction1 (classTableOfReal, 0, U"To Covariance", 0, 1, DO_TableOfReal_to_Covariance);
+	praat_addAction1 (classTableOfReal, 0, U"To Correlation", 0, 1, DO_TableOfReal_to_Correlation);
+	praat_addAction1 (classTableOfReal, 0, U"To Correlation (rank)", 0, 1, DO_TableOfReal_to_Correlation_rank);
+	praat_addAction1 (classTableOfReal, 0, U"To CCA...", 0, 1, DO_TableOfReal_to_CCA);
+	praat_addAction1 (classTableOfReal, 0, U"To TableOfReal (means by row labels)...", 0, 1, DO_TableOfReal_meansByRowLabels);
+	praat_addAction1 (classTableOfReal, 0, U"To TableOfReal (medians by row labels)...", 0, 1, DO_TableOfReal_mediansByRowLabels);
+
+	praat_addAction1 (classTableOfReal, 0, U"-- configurations --", 0, 1, 0);
+	praat_addAction1 (classTableOfReal, 0, U"To Configuration (pca)...",	0, 1, DO_TableOfReal_to_Configuration_pca);
+	praat_addAction1 (classTableOfReal, 0, U"To Configuration (lda)...", 0, 1, DO_TableOfReal_to_Configuration_lda);
+	praat_addAction1 (classTableOfReal, 2, U"-- between tables --", U"To Configuration (lda)...", 1, 0);
+	praat_addAction1 (classTableOfReal, 2, U"To TableOfReal (cross-correlations)...", 0, praat_HIDDEN + praat_DEPTH_1, DO_TableOfReal_and_TableOfReal_crossCorrelations);
+
+
+	praat_addAction1 (classTableOfReal, 1, U"To Pattern and Categories...", U"To Matrix", 1, DO_TableOfReal_to_Pattern_and_Categories);
+	praat_addAction1 (classTableOfReal, 1, U"Split into Pattern and Categories...", U"To Pattern and Categories...", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_to_Pattern_and_Categories);
+	praat_addAction1 (classTableOfReal, 0, U"To Permutation (sort row labels)", U"To Matrix", 1, DO_TableOfReal_to_Permutation_sortRowlabels);
+
+	praat_addAction1 (classTableOfReal, 1, U"To SVD", 0, praat_HIDDEN, DO_TableOfReal_to_SVD);
+	praat_addAction1 (classTableOfReal, 2, U"To GSVD", 0, praat_HIDDEN, DO_TablesOfReal_to_GSVD);
+	praat_addAction1 (classTableOfReal, 2, U"To Eigen (gsvd)", 0, praat_HIDDEN, DO_TablesOfReal_to_Eigen_gsvd);
+
+	praat_addAction1 (classTableOfReal, 0, U"To TableOfReal (cholesky)...", 0, praat_HIDDEN, DO_TableOfReal_choleskyDecomposition);
+
+	praat_addAction1 (classTableOfReal, 0, U"-- scatter plots --", U"Draw top and bottom lines...", 1, 0);
+	praat_addAction1 (classTableOfReal, 0, U"Draw scatter plot...", U"-- scatter plots --", 1, DO_TableOfReal_drawScatterPlot);
+	praat_addAction1 (classTableOfReal, 0, U"Draw scatter plot matrix...", U"Draw scatter plot...", 1, DO_TableOfReal_drawScatterPlotMatrix);
+	praat_addAction1 (classTableOfReal, 0, U"Draw box plots...", U"Draw scatter plot matrix...", 1, DO_TableOfReal_drawBoxPlots);
+	praat_addAction1 (classTableOfReal, 0, U"Draw biplot...", U"Draw box plots...", 1, DO_TableOfReal_drawBiplot);
+	praat_addAction1 (classTableOfReal, 0, U"Draw vectors...", U"Draw box plots...", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_drawVectors);
+	praat_addAction1 (classTableOfReal, 1, U"Draw row as histogram...", U"Draw biplot...", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_drawRowAsHistogram);
+	praat_addAction1 (classTableOfReal, 1, U"Draw rows as histogram...", U"Draw row as histogram...", praat_DEPTH_1 | praat_HIDDEN, DO_TableOfReal_drawRowsAsHistogram);
+	praat_addAction1 (classTableOfReal, 1, U"Draw column as distribution...", U"Draw rows as histogram...", praat_DEPTH_1, DO_TableOfReal_drawColumnAsDistribution);
+
+	praat_addAction2 (classStrings, 1, classPermutation, 1, U"Permute strings", 0, 0, DO_Strings_and_Permutation_permuteStrings);
+
+	praat_addAction2 (classTableOfReal, 1, classPermutation, 1, U"Permute rows",	0, 0, DO_TableOfReal_and_Permutation_permuteRows);
+
+	praat_addAction1 (classTextGrid, 0, U"Extend time...", U"Scale times...", 2, DO_TextGrid_extendTime);
+	praat_addAction1 (classTextGrid, 1, U"Set tier name...", U"Remove tier...", 1, DO_TextGrid_setTierName);
+	praat_addAction1 (classTextGrid, 0, U"Replace interval text...", U"Set interval text...", 2, DO_TextGrid_replaceIntervalTexts);
+	praat_addAction1 (classTextGrid, 0, U"Replace point text...", U"Set point text...", 2, DO_TextGrid_replacePointTexts);
+	praat_addAction1 (classTextGrid, 2, U"To Table (text alignment)...", U"Extract part...", 0, DO_TextGrids_to_Table_textAlignmentment);
+	praat_addAction2 (classTextGrid, 2, classEditCostsTable, 1, U"To Table (text alignment)...", 0, 0, DO_TextGrids_and_EditCostsTable_to_Table_textAlignmentment);
 
 	INCLUDE_MANPAGES (manual_dwtools_init)
 	INCLUDE_MANPAGES (manual_Permutation_init)
diff --git a/dwtools/praat_HMM_init.cpp b/dwtools/praat_HMM_init.cpp
index ce14b38..8605057 100644
--- a/dwtools/praat_HMM_init.cpp
+++ b/dwtools/praat_HMM_init.cpp
@@ -1,6 +1,6 @@
 /* praat_HMM_init.cpp
  *
- * Copyright (C) 2010-2011 David Weenink
+ * Copyright (C) 2010-2011, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,172 +34,172 @@
 //#define praat_HIDDEN 0
 
 #define GaussianMixture_OPTION_MENU_CRITERIA \
-	OPTIONMENU (L"Criterion based on", 1) \
-	OPTION (L"Likelihood") \
-	OPTION (L"Message length") \
-	OPTION (L"Bayes information") \
-	OPTION (L"Akaike information") \
-	OPTION (L"Akaike corrected") \
-	OPTION (L"Complete-data ML")
+	OPTIONMENU (U"Criterion based on", 1) \
+	OPTION (U"Likelihood") \
+	OPTION (U"Message length") \
+	OPTION (U"Bayes information") \
+	OPTION (U"Akaike information") \
+	OPTION (U"Akaike corrected") \
+	OPTION (U"Complete-data ML")
 
 Correlation GaussianMixture_and_TableOfReal_to_Correlation2 (GaussianMixture me, thou);
 
 DIRECT (GaussianMixture_help)
-	Melder_help (L"GaussianMixture");
+	Melder_help (U"GaussianMixture");
 END
 
-FORM (GaussianMixture_drawConcentrationEllipses, L"GaussianMixture: Draw concentration ellipses",
-      L"GaussianMixture: Draw concentration ellipses...")
-	POSITIVE (L"Number of sigmas", L"1.0")
-	BOOLEAN (L"Principal component plane", 1)
-	INTEGER (L"X-dimension", L"1")
-	INTEGER (L"Y-dimension", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	INTEGER (L"Label size", L"12")
-	BOOLEAN (L"Garnish", 1)
+FORM (GaussianMixture_drawConcentrationEllipses, U"GaussianMixture: Draw concentration ellipses",
+      U"GaussianMixture: Draw concentration ellipses...")
+	POSITIVE (U"Number of sigmas", U"1.0")
+	BOOLEAN (U"Principal component plane", 1)
+	INTEGER (U"X-dimension", U"1")
+	INTEGER (U"Y-dimension", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	INTEGER (U"Label size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (GaussianMixture);
 		GaussianMixture_drawConcentrationEllipses (me, GRAPHICS,
-			GET_REAL (L"Number of sigmas"), 0, 0, GET_INTEGER (L"Principal component plane"),
-			GET_INTEGER (L"X-dimension"), GET_INTEGER (L"Y-dimension"),
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"Number of sigmas"), 0, 0, GET_INTEGER (U"Principal component plane"),
+			GET_INTEGER (U"X-dimension"), GET_INTEGER (U"Y-dimension"),
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (GaussianMixture_and_PCA_drawConcentrationEllipses, L"GaussianMixture & PCA: Draw concentration ellipses",
-      L"GaussianMixture & PCA: Draw concentration ellipses...")
-	POSITIVE (L"Number of sigmas", L"1.0")
-	INTEGER (L"X-dimension", L"1")
-	INTEGER (L"Y-dimension", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	INTEGER (L"Label size", L"12")
-	BOOLEAN (L"Garnish", 1)
+FORM (GaussianMixture_and_PCA_drawConcentrationEllipses, U"GaussianMixture & PCA: Draw concentration ellipses",
+      U"GaussianMixture & PCA: Draw concentration ellipses...")
+	POSITIVE (U"Number of sigmas", U"1.0")
+	INTEGER (U"X-dimension", U"1")
+	INTEGER (U"Y-dimension", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	INTEGER (U"Label size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	GaussianMixture me = FIRST (GaussianMixture);
 	PCA pca = FIRST (PCA);
 	GaussianMixture_and_PCA_drawConcentrationEllipses (me, pca, GRAPHICS,
-		GET_REAL (L"Number of sigmas"), 0, NULL, GET_INTEGER (L"X-dimension"), GET_INTEGER (L"Y-dimension"),
-		GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
+		GET_REAL (U"Number of sigmas"), 0, nullptr, GET_INTEGER (U"X-dimension"), GET_INTEGER (U"Y-dimension"),
+		GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
 END
 
-FORM (GaussianMixture_drawMarginalPdf, L"GaussianMixture: Draw marginal pdf", L"GaussianMixture: Draw marginal pdf...")
-	INTEGER (L"X-dimension", L"1")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	NATURAL (L"Number of points", L"500")
-	INTEGER (L"Number of bins", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (GaussianMixture_drawMarginalPdf, U"GaussianMixture: Draw marginal pdf", U"GaussianMixture: Draw marginal pdf...")
+	INTEGER (U"X-dimension", U"1")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	NATURAL (U"Number of points", U"500")
+	INTEGER (U"Number of bins", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (GaussianMixture);
-		GaussianMixture_drawMarginalPdf (me, GRAPHICS, GET_INTEGER (L"X-dimension"),
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_INTEGER (L"Number of points"), GET_INTEGER (L"Number of bins"), GET_INTEGER (L"Garnish"));
+		GaussianMixture_drawMarginalPdf (me, GRAPHICS, GET_INTEGER (U"X-dimension"),
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_INTEGER (U"Number of points"), GET_INTEGER (U"Number of bins"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 DIRECT (GaussianMixture_getNumberOfComponents)
 	LOOP {
 		iam (GaussianMixture);
-		Melder_information (Melder_integer (my numberOfComponents), L" (= number of components)");
+		Melder_information (my numberOfComponents, U" (= number of components)");
 	}
 END
 
 DIRECT (GaussianMixture_getDimensionOfComponent)
 	LOOP {
 		iam (GaussianMixture);
-		Melder_information (Melder_integer (my dimension), L" (= dimension of component)");
+		Melder_information (my dimension, U" (= dimension of component)");
 	}
 END
 
-FORM (GaussianMixture_getProbabilityAtPosition, L"GaussianMixture: Get probability at position", 0)
-	SENTENCE (L"Position", L"100.0 300.0")
+FORM (GaussianMixture_getProbabilityAtPosition, U"GaussianMixture: Get probability at position", 0)
+	SENTENCE (U"Position", U"100.0 300.0")
 	OK
 DO
-	const wchar_t *position = GET_STRING (L"Position");
+	const char32 *position = GET_STRING (U"Position");
 	LOOP {
 		iam (GaussianMixture);
 		double p = GaussianMixture_getProbabilityAtPosition_string (me, position);
-		Melder_information (Melder_double (p), L" (= probability at position ", position);
+		Melder_information (p, U" (= probability at position ", position);
 	}
 END
 
-FORM (GaussianMixture_splitComponent, L"GaussianMixture: Split component", L"GaussianMixture: Split component...")
-	NATURAL (L"Component", L"1")
+FORM (GaussianMixture_splitComponent, U"GaussianMixture: Split component", U"GaussianMixture: Split component...")
+	NATURAL (U"Component", U"1")
 	OK
 DO
 	LOOP {
 		iam (GaussianMixture);
-		GaussianMixture_splitComponent (me, GET_INTEGER (L"Component"));
+		GaussianMixture_splitComponent (me, GET_INTEGER (U"Component"));
 	}
 END
 
-FORM (GaussianMixture_and_PCA_drawMarginalPdf, L"GaussianMixture & PCA: Draw pdf function", L"GaussianMixture: Draw marginal pdf...")
-	INTEGER (L"X-dimension", L"1")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	NATURAL (L"Number of points", L"500")
-	INTEGER (L"Number of bins", L"0.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (GaussianMixture_and_PCA_drawMarginalPdf, U"GaussianMixture & PCA: Draw pdf function", U"GaussianMixture: Draw marginal pdf...")
+	INTEGER (U"X-dimension", U"1")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	NATURAL (U"Number of points", U"500")
+	INTEGER (U"Number of bins", U"0.0")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	GaussianMixture me = FIRST (GaussianMixture);
 	PCA pca = FIRST (PCA);
 	GaussianMixture_and_PCA_drawMarginalPdf (me, pca, GRAPHICS,
-		GET_INTEGER (L"X-dimension"), GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-		GET_INTEGER (L"Number of points"), GET_INTEGER (L"Number of bins"), GET_INTEGER (L"Garnish"));
+		GET_INTEGER (U"X-dimension"), GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+		GET_INTEGER (U"Number of points"), GET_INTEGER (U"Number of bins"), GET_INTEGER (U"Garnish"));
 END
 
-FORM (GaussianMixture_and_PCA_to_Matrix_density, L"GaussianMixture & PCA: To Matrix density", L"GaussianMixture & PCA: To Matrix (density)...")
-	INTEGER (L"X-dimension", L"1")
-	INTEGER (L"Y-dimension", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	NATURAL (L"Number of columns", L"100")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
-	NATURAL (L"Number of rows", L"100")
+FORM (GaussianMixture_and_PCA_to_Matrix_density, U"GaussianMixture & PCA: To Matrix density", U"GaussianMixture & PCA: To Matrix (density)...")
+	INTEGER (U"X-dimension", U"1")
+	INTEGER (U"Y-dimension", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	NATURAL (U"Number of columns", U"100")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
+	NATURAL (U"Number of rows", U"100")
 	OK
 DO
 	GaussianMixture me = FIRST (GaussianMixture);
 	PCA pca = FIRST (PCA);
-	praat_new (GaussianMixture_and_PCA_to_Matrix_density (me, pca, GET_INTEGER (L"X-dimension"),
-		GET_INTEGER (L"Y-dimension"), GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-		GET_INTEGER (L"Number of columns"), GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Number of rows")), my name, L"_", pca->name);
+	praat_new (GaussianMixture_and_PCA_to_Matrix_density (me, pca, GET_INTEGER (U"X-dimension"),
+		GET_INTEGER (U"Y-dimension"), GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+		GET_INTEGER (U"Number of columns"), GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Number of rows")), my name, U"_", pca->name);
 END
 
-FORM (GaussianMixture_extractComponent, L"GaussianMixture: Extract component", 0)
-	NATURAL (L"Component", L"1")
+FORM (GaussianMixture_extractComponent, U"GaussianMixture: Extract component", 0)
+	NATURAL (U"Component", U"1")
 	OK
 DO
-	long component = GET_INTEGER (L"Component");
+	long component = GET_INTEGER (U"Component");
 	LOOP {
 		iam (GaussianMixture);
 		Covariance cov = GaussianMixture_extractComponent (me, component);
-		praat_new (cov, my name, L"_", cov->name);
+		praat_new (cov, my name, U"_", cov->name);
 	}
 END
 
@@ -224,11 +224,11 @@ DIRECT (GaussianMixture_to_PCA)
 	}
 END
 
-FORM (GaussianMixture_to_TableOfReal_randomSampling, L"GaussianMixture: To TableOfReal (random sampling)", L"GaussianMixture: To TableOfReal (random sampling)...")
-	NATURAL (L"Number of data points", L"100")
+FORM (GaussianMixture_to_TableOfReal_randomSampling, U"GaussianMixture: To TableOfReal (random sampling)", U"GaussianMixture: To TableOfReal (random sampling)...")
+	NATURAL (U"Number of data points", U"100")
 	OK
 DO
-	long numberOfpoints = GET_INTEGER (L"Number of data points");
+	long numberOfpoints = GET_INTEGER (U"Number of data points");
 	LOOP {
 		iam (GaussianMixture);
 		praat_new (GaussianMixture_to_TableOfReal_randomSampling (me, numberOfpoints), my name);
@@ -238,120 +238,120 @@ END
 DIRECT (GaussianMixture_to_Covariance_between)
 	LOOP {
 		iam (GaussianMixture);
-		praat_new (GaussianMixture_to_Covariance_between (me), my name, L"_b");
+		praat_new (GaussianMixture_to_Covariance_between (me), my name, U"_b");
 	}
 END
 
 DIRECT (GaussianMixture_to_Covariance_within)
 	LOOP {
 		iam (GaussianMixture);
-		praat_new (GaussianMixture_to_Covariance_within (me), my name, L"_w");
+		praat_new (GaussianMixture_to_Covariance_within (me), my name, U"_w");
 	}
 END
 
 DIRECT (GaussianMixture_to_Covariance_total)
 	LOOP {
 		iam (GaussianMixture);
-		praat_new (GaussianMixture_to_Covariance_total (me), my name, L"_t");
+		praat_new (GaussianMixture_to_Covariance_total (me), my name, U"_t");
 	}
 END
 
-FORM (GaussianMixture_and_TableOfReal_getLikelihoodValue, L"GaussianMixture & TableOfReal: Get likelihood value",
-      L"GaussianMixture & TableOfReal: Get likelihood value...")
+FORM (GaussianMixture_and_TableOfReal_getLikelihoodValue, U"GaussianMixture & TableOfReal: Get likelihood value",
+      U"GaussianMixture & TableOfReal: Get likelihood value...")
 	GaussianMixture_OPTION_MENU_CRITERIA
 	OK
 DO
 	GaussianMixture me = FIRST (GaussianMixture);
 	TableOfReal thee = FIRST (TableOfReal);
-	int criterion = GET_INTEGER (L"Criterion based on") - 1;
-	const wchar_t *criterionText = GaussianMixture_criterionText (criterion);
+	int criterion = GET_INTEGER (U"Criterion based on") - 1;
+	const char32 *criterionText = GaussianMixture_criterionText (criterion);
 	double lnpdn = GaussianMixture_and_TableOfReal_getLikelihoodValue (me, thee, criterion);
-	Melder_information (Melder_double (lnpdn / thy numberOfRows), L" (= ", criterionText, L", n = ",
-		Melder_integer (thy numberOfRows), L")");
+	Melder_information (lnpdn / thy numberOfRows, U" (= ", criterionText, U", n = ",
+		thy numberOfRows, U")");
 END
 
 DIRECT (HMM_help)
-	Melder_help (L"HMM");
+	Melder_help (U"HMM");
 END
 
-FORM (HMM_create, L"Create HMM", L"")
-	WORD (L"Name", L"hmm")
-	BOOLEAN (L"Left to right model", 0)
-	NATURAL (L"Number of states", L"3")
-	NATURAL (L"Number of observations", L"3")
+FORM (HMM_create, U"Create HMM", U"")
+	WORD (U"Name", U"hmm")
+	BOOLEAN (U"Left to right model", 0)
+	NATURAL (U"Number of states", U"3")
+	NATURAL (U"Number of observations", U"3")
 	OK
 DO
-	praat_new (HMM_create (GET_INTEGER (L"Left to right model"), GET_INTEGER (L"Number of states"),
-		GET_INTEGER (L"Number of observations")), GET_STRING (L"Name"));
+	autoHMM thee = HMM_create (GET_INTEGER (U"Left to right model"), GET_INTEGER (U"Number of states"), GET_INTEGER (U"Number of observations"));
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
 END
 
-FORM (HMM_createSimple, L"HMM: Create simple", L"HMM: Create simple HMM...")
-	WORD (L"Name", L"weather")
-	BOOLEAN (L"Left to right model", 0)
-	SENTENCE (L"States", L"Rainy Sunny")
-	SENTENCE (L"Observations", L"Walk Shop Clean")
+FORM (HMM_createSimple, U"HMM: Create simple", U"HMM: Create simple HMM...")
+	WORD (U"Name", U"weather")
+	BOOLEAN (U"Left to right model", 0)
+	SENTENCE (U"States", U"Rainy Sunny")
+	SENTENCE (U"Observations", U"Walk Shop Clean")
 	OK
 DO
-	praat_new (HMM_createSimple (GET_INTEGER (L"Left to right model"), GET_STRING (L"States"),
-		GET_STRING (L"Observations")), GET_STRING (L"Name"));
+	autoHMM thee = HMM_createSimple (GET_INTEGER (U"Left to right model"), GET_STRING (U"States"), GET_STRING (U"Observations"));
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
 END
 
-FORM (HMM_createContinuousModel, L"HMM: Create continuous model", 0)
-	WORD (L"Name", L"cm")
-	BOOLEAN (L"Left to right model", 0)
-	NATURAL (L"Number of states", L"3")
-	NATURAL (L"Number of symbols", L"10")
-	LABEL (L"", L"For the Gaussian mixtures:")
-	NATURAL (L"Number of components", L"3")
-	NATURAL (L"Dimension of component", L"39")
-	OPTIONMENU (L"Covariance matrices are", 1)
-	OPTION (L"Complete")
-	OPTION (L"Diagonal")
+FORM (HMM_createContinuousModel, U"HMM: Create continuous model", 0)
+	WORD (U"Name", U"cm")
+	BOOLEAN (U"Left to right model", 0)
+	NATURAL (U"Number of states", U"3")
+	NATURAL (U"Number of symbols", U"10")
+	LABEL (U"", U"For the Gaussian mixtures:")
+	NATURAL (U"Number of components", U"3")
+	NATURAL (U"Dimension of component", U"39")
+	OPTIONMENU (U"Covariance matrices are", 1)
+	OPTION (U"Complete")
+	OPTION (U"Diagonal")
 	OK
 DO
-	long componentStorage = GET_INTEGER (L"Covariance matrices are") - 1;
-	long dimension = GET_INTEGER (L"Dimension of component");
-	REQUIRE (componentStorage >= 0 && componentStorage <= dimension, L"Not a valid covariance matrix type")
-	praat_new (HMM_createContinuousModel (GET_INTEGER (L"Left to right model"),
-		GET_INTEGER (L"Number of states"), GET_INTEGER (L"Number of symbols"),
-		GET_INTEGER (L"Number of components"), dimension, componentStorage),
-		GET_STRING (L"Name"));
+	long componentStorage = GET_INTEGER (U"Covariance matrices are") - 1;
+	long dimension = GET_INTEGER (U"Dimension of component");
+	REQUIRE (componentStorage >= 0 && componentStorage <= dimension, U"Not a valid covariance matrix type")
+	autoHMM thee = HMM_createContinuousModel (GET_INTEGER (U"Left to right model"),
+		GET_INTEGER (U"Number of states"), GET_INTEGER (U"Number of symbols"),
+		GET_INTEGER (U"Number of components"), dimension, componentStorage);
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
 END
 
-FORM (HMM_ObservationSequence_to_HMM, L"HMM_ObservationSequence: To HMM", 0)
-	LABEL (L"", L"(0 states gives a non-hidden model) ")
-	INTEGER (L"Number of states", L"2")
-	BOOLEAN (L"Left to right model", 0)
+FORM (HMM_ObservationSequence_to_HMM, U"HMM_ObservationSequence: To HMM", 0)
+	LABEL (U"", U"(0 states gives a non-hidden model) ")
+	INTEGER (U"Number of states", U"2")
+	BOOLEAN (U"Left to right model", 0)
 	OK
 DO
-	long numberOfStates = GET_INTEGER (L"Number of states");
+	long numberOfStates = GET_INTEGER (U"Number of states");
 	LOOP {
 		iam (HMM_ObservationSequence);
-		praat_new (HMM_createFromHMM_ObservationSequence (me, numberOfStates, GET_INTEGER (L"Left to right model")),
-			my name, L"_", Melder_integer (numberOfStates));
+		autoHMM thee = HMM_createFromHMM_ObservationSequence (me, numberOfStates, GET_INTEGER (U"Left to right model"));
+		praat_new (thee.transfer(), my name, U"_", numberOfStates);
 	}
 END
 
-FORM (HMM_draw, L"HMM: Draw", 0)
-	BOOLEAN (L"Garnish", 0)
+FORM (HMM_draw, U"HMM: Draw", 0)
+	BOOLEAN (U"Garnish", 0)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (HMM);
-		HMM_draw (me, GRAPHICS, GET_INTEGER (L"Garnish"));
+		HMM_draw (me, GRAPHICS, GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (HMM_and_HMM_StateSequence_drawTrellis, L"HMM & Strings: Draw trellis", 0)
-	BOOLEAN (L"Connect", 1);
-	BOOLEAN (L"Garnish", 1);
+FORM (HMM_and_HMM_StateSequence_drawTrellis, U"HMM & Strings: Draw trellis", 0)
+	BOOLEAN (U"Connect", 1);
+	BOOLEAN (U"Garnish", 1);
 	OK
 DO
 	autoPraatPicture picture;
 	HMM me = FIRST (HMM);
 	HMM_StateSequence hmm_ss = FIRST (HMM_StateSequence);
-	HMM_and_HMM_StateSequence_drawTrellis (me, hmm_ss, GRAPHICS, GET_INTEGER (L"Connect"), GET_INTEGER (L"Garnish"));
+	HMM_and_HMM_StateSequence_drawTrellis (me, hmm_ss, GRAPHICS, GET_INTEGER (U"Connect"), GET_INTEGER (U"Garnish"));
 END
 
 DIRECT (HMM_drawForwardProbabilitiesIllustration)
@@ -369,135 +369,135 @@ DIRECT (HMM_drawForwardAndBackwardProbabilitiesIllustration)
 	HMM_drawForwardAndBackwardProbabilitiesIllustration (GRAPHICS, true);
 END
 
-FORM (HMM_getTransitionProbability, L"HMM: Get transition probability", L"HMM: Get transition probability...")
-	NATURAL (L"From state number", L"1")
-	NATURAL (L"To state number", L"1")
+FORM (HMM_getTransitionProbability, U"HMM: Get transition probability", U"HMM: Get transition probability...")
+	NATURAL (U"From state number", U"1")
+	NATURAL (U"To state number", U"1")
 	OK
 DO
 	LOOP {
 		iam (HMM);
-		long s1 = GET_INTEGER (L"From state number"), s2 = GET_INTEGER (L"To state number");
-		REQUIRE (s1 <= my numberOfStates && s2 <= my numberOfStates, L"State number(s) too high.")
-		Melder_information (Melder_double (my transitionProbs[s1][s2]), L" : [ ", Melder_integer (s1), L", ", Melder_integer (s2), L" ]");
+		long s1 = GET_INTEGER (U"From state number"), s2 = GET_INTEGER (U"To state number");
+		REQUIRE (s1 <= my numberOfStates && s2 <= my numberOfStates, U"State number(s) too high.")
+		Melder_information (my transitionProbs[s1][s2], U" : [ ", s1, U", ", s2, U" ]");
 	}
 END
 
-FORM (HMM_getEmissionProbability, L"HMM: Get emission probability", L"HMM: Get emission probability...")
-	NATURAL (L"From state number", L"1")
-	NATURAL (L"To symbol number", L"1")
+FORM (HMM_getEmissionProbability, U"HMM: Get emission probability", U"HMM: Get emission probability...")
+	NATURAL (U"From state number", U"1")
+	NATURAL (U"To symbol number", U"1")
 	OK
 DO
 	LOOP {
 		iam (HMM);
-		long s1 = GET_INTEGER (L"From state number"), s2 = GET_INTEGER (L"To symbol number");
-		REQUIRE (s1 <= my numberOfStates, L"State number too high.")
-		REQUIRE (s2 <= my numberOfObservationSymbols, L"Symbol number too high.")
-		Melder_information (Melder_double (my emissionProbs[s1][s2]), L" : [ ", Melder_integer (s1), L", ", Melder_integer (s2), L" ]");
+		long s1 = GET_INTEGER (U"From state number"), s2 = GET_INTEGER (U"To symbol number");
+		REQUIRE (s1 <= my numberOfStates, U"State number too high.")
+		REQUIRE (s2 <= my numberOfObservationSymbols, U"Symbol number too high.")
+		Melder_information (my emissionProbs[s1][s2], U" : [ ", s1, U", ", s2, U" ]");
 	}
 END
 
-FORM (HMM_getStartProbability, L"HMM: Get start probability", L"HMM: Get start probability...")
-	NATURAL (L"State number", L"1")
+FORM (HMM_getStartProbability, U"HMM: Get start probability", U"HMM: Get start probability...")
+	NATURAL (U"State number", U"1")
 	OK
 DO
 	LOOP {
 		iam (HMM);
-		long s1 = GET_INTEGER (L"State number");
-		REQUIRE (s1 <= my numberOfStates, L"State number too high.")
-		Melder_information (Melder_double (my transitionProbs[0][s1]), L" : [ ", Melder_integer (s1), L" ]");
+		long s1 = GET_INTEGER (U"State number");
+		REQUIRE (s1 <= my numberOfStates, U"State number too high.")
+		Melder_information (my transitionProbs[0][s1], U" : [ ", s1, U" ]");
 	}
 END
 
-FORM (HMM_getProbabilityAtTimeBeingInState, L"HMM: Get probability of being in state at time",
-      L"HMM: Get p (time, state)...")
-	NATURAL (L"Time index", L"10")
-	NATURAL (L"State number", L"1")
+FORM (HMM_getProbabilityAtTimeBeingInState, U"HMM: Get probability of being in state at time",
+      U"HMM: Get p (time, state)...")
+	NATURAL (U"Time index", U"10")
+	NATURAL (U"State number", U"1")
 	OK
 DO
-	long istate = GET_INTEGER (L"State number");
-	long itime = GET_INTEGER (L"Time index");
+	long istate = GET_INTEGER (U"State number");
+	long itime = GET_INTEGER (U"Time index");
 	LOOP {
 		iam (HMM);
 		double lnp = HMM_getProbabilityAtTimeBeingInState (me, itime, istate);
-		Melder_information (Melder_double (lnp), L" (=ln(p), p = ", Melder_naturalLogarithm (lnp), L") Being in state ",
-			Melder_integer (istate), L" at time ", Melder_integer (itime));
+		Melder_information (lnp, U" (=ln(p), p = ", Melder_naturalLogarithm (lnp), U") Being in state ",
+			istate, U" at time ", itime);
 	}
 END
 
-FORM (HMM_getProbabilityAtTimeBeingInStateEmittingSymbol, L"HMM: get probability being at time in state emitting symbol", L"HMM: Get p (time, state, symbol)...")
-	NATURAL (L"Time index", L"10")
-	NATURAL (L"State number", L"1")
-	NATURAL (L"Symbol number", L"1")
+FORM (HMM_getProbabilityAtTimeBeingInStateEmittingSymbol, U"HMM: get probability being at time in state emitting symbol", U"HMM: Get p (time, state, symbol)...")
+	NATURAL (U"Time index", U"10")
+	NATURAL (U"State number", U"1")
+	NATURAL (U"Symbol number", U"1")
 	OK
 DO
-	long istate = GET_INTEGER (L"State number");
-	long itime = GET_INTEGER (L"Time index");
-	long isymbol = GET_INTEGER (L"Symbol number");
+	long istate = GET_INTEGER (U"State number");
+	long itime = GET_INTEGER (U"Time index");
+	long isymbol = GET_INTEGER (U"Symbol number");
 	LOOP {
 		iam (HMM);
 		double lnp = HMM_getProbabilityAtTimeBeingInStateEmittingSymbol (me, itime, istate, isymbol);
-		Melder_information (Melder_double (lnp), L" (=ln(p), p = ", Melder_naturalLogarithm (lnp), L") Being in state ",
-			Melder_integer (istate), L" emitting symbol ", Melder_integer (isymbol), L" at time ", Melder_integer (itime));
+		Melder_information (lnp, U" (=ln(p), p = ", Melder_naturalLogarithm (lnp), U") Being in state ",
+			istate, U" emitting symbol ", isymbol, U" at time ", itime);
 	}
 END
 
-FORM (HMM_getProbabilityOfStayingInState, L"HMM: Get probability of staying in state",
-      L"HMM: Get probability staying in state...")
-	NATURAL (L"State number", L"1")
-	NATURAL (L"Number of times", L"2")
+FORM (HMM_getProbabilityOfStayingInState, U"HMM: Get probability of staying in state",
+      U"HMM: Get probability staying in state...")
+	NATURAL (U"State number", U"1")
+	NATURAL (U"Number of times", U"2")
 	OK
 DO
 	LOOP {
 		iam (HMM);
-		Melder_informationReal (HMM_getProbabilityOfStayingInState (me, GET_INTEGER (L"State number"),
-			GET_INTEGER (L"Number of times")), 0);
+		Melder_informationReal (HMM_getProbabilityOfStayingInState (me, GET_INTEGER (U"State number"),
+			GET_INTEGER (U"Number of times")), 0);
 	}
 END
 
-FORM (HMM_getExpectedValueOfDurationInState, L"HMM: Get expected value of duration in state",
-      L"HMM: Get expected duration in state...")
-	NATURAL (L"State number", L"1")
+FORM (HMM_getExpectedValueOfDurationInState, U"HMM: Get expected value of duration in state",
+      U"HMM: Get expected duration in state...")
+	NATURAL (U"State number", U"1")
 	OK
 DO
 	LOOP {
 		iam (HMM);
-		Melder_informationReal (HMM_getExpectedValueOfDurationInState (me, GET_INTEGER (L"State number")), L" time units");
+		Melder_informationReal (HMM_getExpectedValueOfDurationInState (me, GET_INTEGER (U"State number")), U" time units");
 	}
 END
 
-FORM (HMM_getSymbolLabel, L"HMM: Get symbol label", 0)
-	NATURAL (L"Symbol number", L"1")
+FORM (HMM_getSymbolLabel, U"HMM: Get symbol label", 0)
+	NATURAL (U"Symbol number", U"1")
 	OK
 DO
-	long is = GET_INTEGER (L"Symbol number");
+	long is = GET_INTEGER (U"Symbol number");
 	LOOP {
 		iam (HMM);
-		REQUIRE (is <= my numberOfObservationSymbols, L"Symbol number too high.")
+		REQUIRE (is <= my numberOfObservationSymbols, U"Symbol number too high.")
 		HMM_Observation s = (HMM_Observation) my observationSymbols -> item[is];
 		Melder_information (s -> label);
 	}
 END
 
-FORM (HMM_getStateLabel, L"HMM: Get state label", 0)
-	NATURAL (L"State number", L"1")
+FORM (HMM_getStateLabel, U"HMM: Get state label", 0)
+	NATURAL (U"State number", U"1")
 	OK
 DO
-	long is = GET_INTEGER (L"State number");
+	long is = GET_INTEGER (U"State number");
 	LOOP {
 		iam (HMM);
-		REQUIRE (is <= my numberOfStates, L"State number too high.")
+		REQUIRE (is <= my numberOfStates, U"State number too high.")
 		HMM_State s = (HMM_State) my states -> item[is];
 		Melder_information (s -> label);
 	}
 END
 
-FORM (HMM_and_HMM_getCrossEntropy, L"HMM & HMM: Get cross-entropy...", L"HMM & HMM: Get cross-entropy...")
-	NATURAL (L"Observation length", L"2000")
-	BOOLEAN (L"Symmetric", 1)
+FORM (HMM_and_HMM_getCrossEntropy, U"HMM & HMM: Get cross-entropy...", U"HMM & HMM: Get cross-entropy...")
+	NATURAL (U"Observation length", U"2000")
+	BOOLEAN (U"Symmetric", 1)
 	OK
 DO
-	long n = GET_INTEGER (L"Observation length");
-	int sym = GET_INTEGER (L"Symmetric");
+	long n = GET_INTEGER (U"Observation length");
+	int sym = GET_INTEGER (U"Symmetric");
 	HMM m1 = 0, m2 = 0;
 	LOOP {
 		iam (HMM);
@@ -505,8 +505,8 @@ DO
 	}
 	Melder_assert (m1 && m2);
 	double ce = HMM_and_HMM_getCrossEntropy (m1, m2, n, sym);
-	Melder_information (Melder_double (ce), L" (=", (sym ? L"symmetric " : L""),
-		L" cross-entropy between models for observation length = ", Melder_integer (n), L")");
+	Melder_information (ce, U" (=", (sym ? U"symmetric " : U""),
+		U" cross-entropy between models for observation length = ", n, U")");
 END
 
 DIRECT (HMM_and_HMM_and_HMM_ObservationSequence_getCrossEntropy)
@@ -518,18 +518,18 @@ DIRECT (HMM_and_HMM_and_HMM_ObservationSequence_getCrossEntropy)
 	}
 	Melder_assert (m1 && m2 && hmm_os);
 	double ce = HMM_and_HMM_and_HMM_ObservationSequence_getCrossEntropy (m1, m2, hmm_os);
-	Melder_information (Melder_double (ce), L" (=symmetric cross-entropy between models)");
+	Melder_information (ce, U" (=symmetric cross-entropy between models)");
 END
 
-FORM (HMM_to_HMM_ObservationSequence, L"HMM: To HMM_ObservationSequence (generate observations)", L"HMM: To HMM_ObservationSequence...")
-	INTEGER (L"Start state", L"0")
-	NATURAL (L"Number of observations", L"20")
+FORM (HMM_to_HMM_ObservationSequence, U"HMM: To HMM_ObservationSequence (generate observations)", U"HMM: To HMM_ObservationSequence...")
+	INTEGER (U"Start state", U"0")
+	NATURAL (U"Number of observations", U"20")
 	OK
 DO
 	LOOP {
 		iam (HMM);
-		praat_new (HMM_to_HMM_ObservationSequence (me, GET_INTEGER (L"Start state"),
-			GET_INTEGER (L"Number of observations")), my name);
+		autoHMM_ObservationSequence thee = HMM_to_HMM_ObservationSequence (me, GET_INTEGER (U"Start state"), GET_INTEGER (U"Number of observations"));
+		praat_new (thee.transfer(), my name);
 	}
 END
 
@@ -537,357 +537,365 @@ DIRECT (HMM_and_HMM_StateSequence_getProbability)
 	HMM me = FIRST (HMM);
 	HMM_StateSequence hmm_ss = FIRST (HMM_StateSequence);
 	double lnp = HMM_and_HMM_StateSequence_getProbability (me, hmm_ss);
-	Melder_information (Melder_double (lnp), L" (=ln(p), p = ", Melder_naturalLogarithm (lnp), L")");
+	Melder_information (lnp, U" (=ln(p), p = ", Melder_naturalLogarithm (lnp), U")");
 END
 
 DIRECT (HMM_and_HMM_ObservationSequence_getProbability)
 	HMM me = FIRST (HMM);
 	HMM_ObservationSequence hmm_os = FIRST (HMM_ObservationSequence);
 	double lnp = HMM_and_HMM_ObservationSequence_getProbability (me, hmm_os);
-	Melder_information (Melder_double (lnp), L" (=ln(p), p = ", Melder_naturalLogarithm (lnp), L")");
+	Melder_information (lnp, U" (=ln(p), p = ", Melder_naturalLogarithm (lnp), U")");
 END
 
 DIRECT (HMM_and_HMM_ObservationSequence_getCrossEntropy)
 	HMM me = FIRST (HMM);
 	HMM_ObservationSequence hmm_os = FIRST (HMM_ObservationSequence);
 	double ce = HMM_and_HMM_ObservationSequence_getCrossEntropy (me, hmm_os);
-	Melder_information (Melder_double (ce), L" (= cross-entropy)");
+	Melder_information (ce, U" (= cross-entropy)");
 END
 
 DIRECT (HMM_and_HMM_ObservationSequence_getPerplexity)
 	HMM me = FIRST (HMM);
 	HMM_ObservationSequence hmm_os = FIRST (HMM_ObservationSequence);
 	double py = HMM_and_HMM_ObservationSequence_getPerplexity (me, hmm_os);
-	Melder_information (Melder_double (py), L" (= perplexity)");
+	Melder_information (py, U" (= perplexity)");
 END
 
 DIRECT (HMM_and_HMM_ObservationSequence_to_HMM_StateSequence)
 	HMM me = FIRST (HMM);
 	HMM_ObservationSequence thee = FIRST (HMM_ObservationSequence);
-	praat_new (HMM_and_HMM_ObservationSequence_to_HMM_StateSequence (me, thee), my name, L"_", thy name, L"_states");
+	autoHMM_StateSequence him = HMM_and_HMM_ObservationSequence_to_HMM_StateSequence (me, thee);
+	praat_new (him.transfer(), my name, U"_", thy name, U"_states");
 END
 
-FORM (HMM_and_HMM_ObservationSequence_learn, L"HMM & HMM_ObservationSequence: Learn", L"HMM & HMM_ObservationSequences: Learn...")
-	POSITIVE (L"Relative precision in log(p)", L"0.001")
-	REAL (L"Minimum probability", L"0.00000000001")
+FORM (HMM_and_HMM_ObservationSequence_learn, U"HMM & HMM_ObservationSequence: Learn", U"HMM & HMM_ObservationSequences: Learn...")
+	POSITIVE (U"Relative precision in log(p)", U"0.001")
+	REAL (U"Minimum probability", U"0.00000000001")
 	OK
 DO
-	double minProb = GET_REAL (L"Minimum probability");
-	REQUIRE (minProb >= 0 && minProb < 1, L"A probabilty must be >= 0 and < 1!")
+	double minProb = GET_REAL (U"Minimum probability");
+	REQUIRE (minProb >= 0 && minProb < 1, U"A probabilty must be >= 0 and < 1!")
 	autoHMM_ObservationSequences hmm_oss = HMM_ObservationSequences_create (); HMM hmm = 0;
 	Collection_dontOwnItems (hmm_oss.peek());
 	LOOP {
-		iam (Data);
+		iam (Daata);
 		if (CLASS == classHMM_ObservationSequence) {
 			Collection_addItem (hmm_oss.peek(), me);
 		} else { hmm = (HMM) me; }
 	}
-	HMM_and_HMM_ObservationSequences_learn (hmm, hmm_oss.peek(), GET_REAL (L"Relative precision in log"), minProb);
+	HMM_and_HMM_ObservationSequences_learn (hmm, hmm_oss.peek(), GET_REAL (U"Relative precision in log"), minProb);
 END
 
-FORM (HMM_setTransitionProbabilities, L"HMM: Set transition probabilities", L"HMM: Set transition probabilities...")
-	NATURAL (L"State number", L"1")
-	SENTENCE (L"Probabilities", L"0.1 0.9")
+FORM (HMM_setTransitionProbabilities, U"HMM: Set transition probabilities", U"HMM: Set transition probabilities...")
+	NATURAL (U"State number", U"1")
+	SENTENCE (U"Probabilities", U"0.1 0.9")
 	OK
 DO
 	LOOP {
 		iam (HMM);
-		HMM_setTransitionProbabilities (me, GET_INTEGER (L"State number"), GET_STRING (L"Probabilities"));
+		HMM_setTransitionProbabilities (me, GET_INTEGER (U"State number"), GET_STRING (U"Probabilities"));
 	}
 END
 
-FORM (HMM_setEmissionProbabilities, L"HMM: Set emission probabilities", L"HMM: Set emission probabilities...")
-	NATURAL (L"State number", L"1")
-	SENTENCE (L"Probabilities", L"0.1 0.7 0.2")
+FORM (HMM_setEmissionProbabilities, U"HMM: Set emission probabilities", U"HMM: Set emission probabilities...")
+	NATURAL (U"State number", U"1")
+	SENTENCE (U"Probabilities", U"0.1 0.7 0.2")
 	OK
 DO
 	LOOP {
 		iam (HMM);
-		HMM_setEmissionProbabilities (me, GET_INTEGER (L"State number"), GET_STRING (L"Probabilities"));
+		HMM_setEmissionProbabilities (me, GET_INTEGER (U"State number"), GET_STRING (U"Probabilities"));
 	}
 END
 
-FORM (HMM_setStartProbabilities, L"HMM: Set start probabilities", L"HMM: Set start probabilities...")
-	SENTENCE (L"Probabilities", L"0.1 0.9")
+FORM (HMM_setStartProbabilities, U"HMM: Set start probabilities", U"HMM: Set start probabilities...")
+	SENTENCE (U"Probabilities", U"0.1 0.9")
 	OK
 DO
 	LOOP {
 		iam (HMM);
-		HMM_setStartProbabilities (me, GET_STRING (L"Probabilities"));
+		HMM_setStartProbabilities (me, GET_STRING (U"Probabilities"));
 	}
 END
 
 DIRECT (HMM_extractTransitionProbabilities)
 	LOOP {
 		iam (HMM);
-		praat_new (HMM_extractTransitionProbabilities (me), my name, L"_t");
+		autoTableOfReal thee = HMM_extractTransitionProbabilities (me);
+		praat_new (thee.transfer(), my name, U"_t");
 	}
 END
 
 DIRECT (HMM_extractEmissionProbabilities)
 	LOOP {
 		iam (HMM);
-		praat_new (HMM_extractEmissionProbabilities (me), my name, L"_e");
+		autoTableOfReal thee = HMM_extractEmissionProbabilities (me);
+		praat_new (thee.transfer(), my name, U"_e");
 	}
 END
 
-FORM (HMM_ObservationSequence_to_TableOfReal, L"HMM_ObservationSequence: To TableOfReal ",
-      L"HMM_ObservationSequence: To TableOfReal (bigrams)...")
-	BOOLEAN (L"As probabilities", 1)
+FORM (HMM_ObservationSequence_to_TableOfReal, U"HMM_ObservationSequence: To TableOfReal ",
+      U"HMM_ObservationSequence: To TableOfReal (bigrams)...")
+	BOOLEAN (U"As probabilities", 1)
 	OK
 DO
 	LOOP {
 		iam (HMM_ObservationSequence);
-		praat_new (HMM_ObservationSequence_to_TableOfReal_transitions (me, GET_INTEGER (L"As probabilities")), my name);
+		autoTableOfReal thee = HMM_ObservationSequence_to_TableOfReal_transitions (me, GET_INTEGER (U"As probabilities"));
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (HMM_and_HMM_ObservationSequence_to_TableOfReal, L"HMM & HMM_ObservationSequence: To TableOfReal", L"HMM & HMM_ObservationSequence: To TableOfReal (bigrams)...")
-	BOOLEAN (L"As probabilities", 1)
+FORM (HMM_and_HMM_ObservationSequence_to_TableOfReal, U"HMM & HMM_ObservationSequence: To TableOfReal", U"HMM & HMM_ObservationSequence: To TableOfReal (bigrams)...")
+	BOOLEAN (U"As probabilities", 1)
 	OK
 DO
 	HMM me = FIRST (HMM);
 	HMM_ObservationSequence hmm_os = FIRST (HMM_ObservationSequence);
-	praat_new (HMM_and_HMM_ObservationSequence_to_TableOfReal_transitions (me, hmm_os,
-		GET_INTEGER (L"As probabilities")), hmm_os -> name, L"_m");
+	autoTableOfReal thee = HMM_and_HMM_ObservationSequence_to_TableOfReal_transitions (me, hmm_os,GET_INTEGER (U"As probabilities"));
+	praat_new (thee.transfer(), hmm_os -> name, U"_m");
 END
 
-FORM (HMM_and_HMM_StateSequence_to_TableOfReal, L"HMM & HMM_StateSequence: To TableOfReal", 0)
-	BOOLEAN (L"As probabilities", 1)
+FORM (HMM_and_HMM_StateSequence_to_TableOfReal, U"HMM & HMM_StateSequence: To TableOfReal", 0)
+	BOOLEAN (U"As probabilities", 1)
 	OK
 DO
 	HMM me = FIRST (HMM);
 	HMM_StateSequence hmm_ss = FIRST (HMM_StateSequence);
-	praat_new (HMM_and_HMM_StateSequence_to_TableOfReal_transitions (me, hmm_ss, GET_INTEGER (L"As probabilities")),
-		Thing_getName (hmm_ss), L"_m");
+	autoTableOfReal thee = HMM_and_HMM_StateSequence_to_TableOfReal_transitions (me, hmm_ss, GET_INTEGER (U"As probabilities"));
+	praat_new (thee.transfer(), Thing_getName (hmm_ss), U"_m");
 END
 
-FORM (HMM_StateSequence_to_TableOfReal, L"HMM_StateSequence: To TableOfReal", 0)
-	BOOLEAN (L"As probabilities", 1)
+FORM (HMM_StateSequence_to_TableOfReal, U"HMM_StateSequence: To TableOfReal", 0)
+	BOOLEAN (U"As probabilities", 1)
 	OK
 DO
 	LOOP {
 		iam (HMM_StateSequence);
-		praat_new (Strings_to_TableOfReal_transitions ( (Strings) me, GET_INTEGER (L"As probabilities")), my name);
+		autoTableOfReal thee = Strings_to_TableOfReal_transitions (me, GET_INTEGER (U"As probabilities"));
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 DIRECT (HMM_ObservationSequence_to_Strings)
 	LOOP {
 		iam (HMM_ObservationSequence);
-		praat_new (HMM_ObservationSequence_to_Strings (me), my name);
+		autoStrings thee = HMM_ObservationSequence_to_Strings (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 DIRECT (Strings_to_HMM_ObservationSequence)
 	LOOP {
 		iam (Strings);
-		praat_new (Strings_to_HMM_ObservationSequence (me), my name);
+		autoHMM_ObservationSequence thee = Strings_to_HMM_ObservationSequence (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 DIRECT (HMM_StateSequence_to_Strings)
 	LOOP {
 		iam (HMM_StateSequence);
-		praat_new (HMM_StateSequence_to_Strings (me), my name);
+		autoStrings thee = HMM_StateSequence_to_Strings (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (TableOfReal_to_GaussianMixture_fromRowlabels, L"TableOfReal: To GaussianMixture from row labels",
-      L"TableOfReal: To GaussianMixture (row labels)...")
-	OPTIONMENU (L"Covariance matrices are", 1)
-	OPTION (L"Complete")
-	OPTION (L"Diagonal")
+FORM (TableOfReal_to_GaussianMixture_fromRowlabels, U"TableOfReal: To GaussianMixture from row labels",
+      U"TableOfReal: To GaussianMixture (row labels)...")
+	OPTIONMENU (U"Covariance matrices are", 1)
+	OPTION (U"Complete")
+	OPTION (U"Diagonal")
 	OK
 DO
-	long storage = GET_INTEGER (L"Covariance matrices are") - 1;
+	long storage = GET_INTEGER (U"Covariance matrices are") - 1;
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_to_GaussianMixture_fromRowLabels (me, storage), my name);
+		autoGaussianMixture thee = TableOfReal_to_GaussianMixture_fromRowLabels (me, storage);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (TableOfReal_to_GaussianMixture, L"TableOfReal: To GaussianMixture (no labels)",
-      L"TableOfReal: To GaussianMixture...")
-	NATURAL (L"Number of components", L"2")
-	POSITIVE (L"Tolerance of minimizer", L"0.001")
-	INTEGER (L"Maximum number of iterations", L"200")
-	REAL (L"Stability coefficient lambda", L"0.001")
-	OPTIONMENU (L"Covariance matrices are", 1)
-	OPTION (L"Complete")
-	OPTION (L"Diagonal")
+FORM (TableOfReal_to_GaussianMixture, U"TableOfReal: To GaussianMixture (no labels)",
+      U"TableOfReal: To GaussianMixture...")
+	NATURAL (U"Number of components", U"2")
+	POSITIVE (U"Tolerance of minimizer", U"0.001")
+	INTEGER (U"Maximum number of iterations", U"200")
+	REAL (U"Stability coefficient lambda", U"0.001")
+	OPTIONMENU (U"Covariance matrices are", 1)
+	OPTION (U"Complete")
+	OPTION (U"Diagonal")
 	GaussianMixture_OPTION_MENU_CRITERIA
 	OK
 DO
-	int criterion = GET_INTEGER (L"Criterion based on") - 1;
-	double lambda = GET_REAL (L"Stability coefficient lambda");
-	REQUIRE (lambda >= 0 && lambda < 1, L"Lambda must be in interval [0,1).")
-	long storage = GET_INTEGER (L"Covariance matrices are") - 1;
+	int criterion = GET_INTEGER (U"Criterion based on") - 1;
+	double lambda = GET_REAL (U"Stability coefficient lambda");
+	REQUIRE (lambda >= 0 && lambda < 1, U"Lambda must be in interval [0,1).")
+	long storage = GET_INTEGER (U"Covariance matrices are") - 1;
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_to_GaussianMixture (me, GET_INTEGER (L"Number of components"),
-			GET_REAL (L"Tolerance of minimizer"), GET_INTEGER (L"Maximum number of iterations"),
-			lambda, storage, criterion), my name);
+		autoGaussianMixture thee = TableOfReal_to_GaussianMixture (me, GET_INTEGER (U"Number of components"), 
+			GET_REAL (U"Tolerance of minimizer"), GET_INTEGER (U"Maximum number of iterations"), lambda, storage, criterion);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
-FORM (GaussianMixture_and_TableOfReal_improveLikelihood, L"GaussianMixture & TableOfReal: Improve likelihood",
-      L"GaussianMixture & TableOfReal: Improve likelihood...")
-	POSITIVE (L"Tolerance of minimizer", L"0.001")
-	NATURAL (L"Maximum number of iterations", L"200")
-	REAL (L"Stability coefficient lambda", L"0.001")
+FORM (GaussianMixture_and_TableOfReal_improveLikelihood, U"GaussianMixture & TableOfReal: Improve likelihood",
+      U"GaussianMixture & TableOfReal: Improve likelihood...")
+	POSITIVE (U"Tolerance of minimizer", U"0.001")
+	NATURAL (U"Maximum number of iterations", U"200")
+	REAL (U"Stability coefficient lambda", U"0.001")
 	GaussianMixture_OPTION_MENU_CRITERIA
 	OK
 DO
-	long criterion = GET_INTEGER (L"Criterion based on") - 1;
-	double lambda = GET_REAL (L"Stability coefficient lambda");
+	long criterion = GET_INTEGER (U"Criterion based on") - 1;
+	double lambda = GET_REAL (U"Stability coefficient lambda");
 	GaussianMixture me = FIRST (GaussianMixture);
 	TableOfReal thee = FIRST (TableOfReal);
-	REQUIRE (lambda >= 0 && lambda < 1, L"Lambda must be in interval [0,1).")
-	REQUIRE (thy numberOfColumns == my dimension, L"The number of columns and the dimension of the model do not agree.");
-	REQUIRE (my numberOfComponents < thy numberOfRows / 2, L"Not enough data points.")
-	GaussianMixture_and_TableOfReal_improveLikelihood (me, thee, GET_REAL (L"Tolerance of minimizer"), GET_INTEGER (L"Maximum number of iterations"), lambda, criterion);
+	REQUIRE (lambda >= 0 && lambda < 1, U"Lambda must be in interval [0,1).")
+	REQUIRE (thy numberOfColumns == my dimension, U"The number of columns and the dimension of the model do not agree.");
+	REQUIRE (my numberOfComponents < thy numberOfRows / 2, U"Not enough data points.")
+	GaussianMixture_and_TableOfReal_improveLikelihood (me, thee, GET_REAL (U"Tolerance of minimizer"), GET_INTEGER (U"Maximum number of iterations"), lambda, criterion);
 END
 
-FORM (GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM, L"GaussianMixture & TableOfReal: To GaussianMixture (CEMM)", L"GaussianMixture & TableOfReal: To GaussianMixture (CEMM)...")
-	INTEGER (L"Minimum number of components", L"1")
-	POSITIVE (L"Tolerance of minimizer", L"0.001")
-	NATURAL (L"Maximum number of iterations", L"200")
-	REAL (L"Stability coefficient lambda", L"0.001")
+FORM (GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM, U"GaussianMixture & TableOfReal: To GaussianMixture (CEMM)", U"GaussianMixture & TableOfReal: To GaussianMixture (CEMM)...")
+	INTEGER (U"Minimum number of components", U"1")
+	POSITIVE (U"Tolerance of minimizer", U"0.001")
+	NATURAL (U"Maximum number of iterations", U"200")
+	REAL (U"Stability coefficient lambda", U"0.001")
 	GaussianMixture_OPTION_MENU_CRITERIA
 	OK
 DO
-	double lambda = GET_REAL (L"Stability coefficient lambda");
-	int criterion = GET_INTEGER (L"Criterion based on") - 1;
+	double lambda = GET_REAL (U"Stability coefficient lambda");
+	int criterion = GET_INTEGER (U"Criterion based on") - 1;
 	GaussianMixture me = FIRST (GaussianMixture);
 	TableOfReal thee = FIRST (TableOfReal);
-	REQUIRE (lambda >= 0 && lambda < 1, L"Lambda must be in interval [0,1).")
-	REQUIRE (thy numberOfColumns == my dimension, L"The number of columns and the dimension of the model do not agree.");
-	REQUIRE (my numberOfComponents < thy numberOfRows / 2, L"Not enough data points.")
+	REQUIRE (lambda >= 0 && lambda < 1, U"Lambda must be in interval [0,1).")
+	REQUIRE (thy numberOfColumns == my dimension, U"The number of columns and the dimension of the model do not agree.");
+	REQUIRE (my numberOfComponents < thy numberOfRows / 2, U"Not enough data points.")
 	praat_new (GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM (me, thee,
-		GET_INTEGER (L"Minimum number of components"), GET_REAL (L"Tolerance of minimizer"),
-		GET_INTEGER (L"Maximum number of iterations"), lambda, criterion), my name);
+		GET_INTEGER (U"Minimum number of components"), GET_REAL (U"Tolerance of minimizer"),
+		GET_INTEGER (U"Maximum number of iterations"), lambda, criterion), my name);
 END
 
 DIRECT (GaussianMixture_and_TableOfReal_to_ClassificationTable)
 	GaussianMixture me = FIRST (GaussianMixture);
 	TableOfReal thee = FIRST (TableOfReal);
 	praat_new (GaussianMixture_and_TableOfReal_to_ClassificationTable (me, thee),
-		my name, L"_", thy name);
+		my name, U"_", thy name);
 END
 
 DIRECT (GaussianMixture_and_TableOfReal_to_Correlation)
 	GaussianMixture me = FIRST (GaussianMixture);
 	TableOfReal thee = FIRST (TableOfReal);
 	praat_new (GaussianMixture_and_TableOfReal_to_Correlation (me, thee),
-		my name, L"_", thy name);
+		my name, U"_", thy name);
 END
 
-FORM (GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests, L"GaussianMixture & TableOfReal: To TableOfReal BHEP normality tests", L"GaussianMixture & TableOfReal: To TableOfReal (BHEP normality tests)...")
-	REAL (L"Smoothing parameter", L"1.41")
+FORM (GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests, U"GaussianMixture & TableOfReal: To TableOfReal BHEP normality tests", U"GaussianMixture & TableOfReal: To TableOfReal (BHEP normality tests)...")
+	REAL (U"Smoothing parameter", U"1.41")
 	OK
 DO
 	GaussianMixture me = FIRST (GaussianMixture);
 	TableOfReal thee = FIRST (TableOfReal);
-	double h = GET_REAL (L"Smoothing parameter");
+	double h = GET_REAL (U"Smoothing parameter");
 	praat_new (GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests (me, thee, h),
-		my name, L"_", thy name);
+		my name, U"_", thy name);
 END
 
 void praat_HMM_init ();
 void praat_HMM_init () {
-	Thing_recognizeClassesByName (classHMM, classHMM_State, classHMM_Observation,
-	                              classHMM_ObservationSequence, classHMM_StateSequence, classGaussianMixture, NULL);
-
-	praat_addMenuCommand (L"Objects", L"New", L"Markov models", 0, praat_HIDDEN, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Create HMM...", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create simple HMM...", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_createSimple);
-	praat_addMenuCommand (L"Objects", L"New", L"Create continuous HMM...", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_createContinuousModel);
-	praat_addMenuCommand (L"Objects", L"New", L"--drawings--", 0, praat_HIDDEN + praat_DEPTH_1, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Draw forward probabilities illustration", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_drawForwardProbabilitiesIllustration);
-	praat_addMenuCommand (L"Objects", L"New", L"Draw backward probabilities illustration", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_drawBackwardProbabilitiesIllustration);
-	praat_addMenuCommand (L"Objects", L"New", L"Draw forward and backward probabilities illustration", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_drawForwardAndBackwardProbabilitiesIllustration);
-
-	praat_addAction1 (classGaussianMixture, 0, L"GaussianMixture help", 0, 0, DO_GaussianMixture_help);
-	praat_addAction1 (classGaussianMixture, 0, L"Draw concentration ellipses...", 0, 0, DO_GaussianMixture_drawConcentrationEllipses);
-	praat_addAction1 (classGaussianMixture, 0, L"Draw marginal pdf...", 0, 0, DO_GaussianMixture_drawMarginalPdf);
-	praat_addAction1 (classGaussianMixture, 0, L"Query -", 0, 0, 0);
-	praat_addAction1 (classGaussianMixture, 1, L"Get number of components", 0, 1, DO_GaussianMixture_getNumberOfComponents);
-	praat_addAction1 (classGaussianMixture, 1, L"Get dimension of component", 0, 1, DO_GaussianMixture_getDimensionOfComponent);
-	praat_addAction1 (classGaussianMixture, 1, L"Get probability at position...", 0, 1, DO_GaussianMixture_getProbabilityAtPosition);
-	praat_addAction1 (classGaussianMixture, 0, L"Modify -", 0, 0, 0);
-	praat_addAction1 (classGaussianMixture, 1, L"Split component...", 0, 1, DO_GaussianMixture_splitComponent);
-	praat_addAction1 (classGaussianMixture, 0, L"Extract -", 0, 0, 0);
-	praat_addAction1 (classGaussianMixture, 0, L"Extract mixing probabilities", 0, 1, DO_GaussianMixture_extractMixingProbabilities);
-	praat_addAction1 (classGaussianMixture, 0, L"Extract component...", 0, 1, DO_GaussianMixture_extractComponent);
-	praat_addAction1 (classGaussianMixture, 0, L"Extract centroids", 0, 1, DO_GaussianMixture_extractCentroids);
-	praat_addAction1 (classGaussianMixture, 0, L"To Covariance (between)", 0, 0, DO_GaussianMixture_to_Covariance_between);
-	praat_addAction1 (classGaussianMixture, 0, L"To Covariance (within)", 0, 0, DO_GaussianMixture_to_Covariance_within);
-	praat_addAction1 (classGaussianMixture, 0, L"To Covariance (total)", 0, 0, DO_GaussianMixture_to_Covariance_total);
-	praat_addAction1 (classGaussianMixture, 0, L"To PCA", 0, 0, DO_GaussianMixture_to_PCA);
-	praat_addAction1 (classGaussianMixture, 0, L"To TableOfReal (random sampling)...", 0, 0, DO_GaussianMixture_to_TableOfReal_randomSampling);
-
-	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, L"Get likelihood value...", 0, 0, DO_GaussianMixture_and_TableOfReal_getLikelihoodValue);
-	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, L"Improve likelihood...", 0, 0, DO_GaussianMixture_and_TableOfReal_improveLikelihood);
-	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, L"To GaussianMixture (CEMM)...", 0, 0, DO_GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM);
-	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, L"To ClassificationTable", 0, 0, DO_GaussianMixture_and_TableOfReal_to_ClassificationTable);
-	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, L"To Correlation", 0, 0, DO_GaussianMixture_and_TableOfReal_to_Correlation);
-	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, L"To TableOfReal (BHEP normality tests)...", 0, 0, DO_GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests);
-
-	praat_addAction2 (classGaussianMixture, 1, classPCA, 1, L"Draw concentration ellipses...", 0, 0, DO_GaussianMixture_and_PCA_drawConcentrationEllipses);
-	praat_addAction2 (classGaussianMixture, 1, classPCA, 1, L"Draw marginal pdf...", 0, 0, DO_GaussianMixture_and_PCA_drawMarginalPdf);
-	praat_addAction2 (classGaussianMixture, 1, classPCA, 1, L"To Matrix (density)...", 0, 0, DO_GaussianMixture_and_PCA_to_Matrix_density);
-
-
-	praat_addAction1 (classHMM, 0, L"HMM help ", 0, 0, DO_HMM_help);
-	praat_addAction1 (classHMM, 0, L"Draw...", 0, 0, DO_HMM_draw);
-	praat_addAction1 (classHMM, 0, L"Query -", 0, 0, 0);
-	praat_addAction1 (classHMM, 1, L"Get transition probability...", 0, 1, DO_HMM_getTransitionProbability);
-	praat_addAction1 (classHMM, 1, L"Get emission probability...", 0, 1, DO_HMM_getEmissionProbability);
-	praat_addAction1 (classHMM, 1, L"Get start probability...", 0, 1, DO_HMM_getStartProbability);
-	praat_addAction1 (classHMM, 1, L"Get p (time, state)...", 0, 1, DO_HMM_getProbabilityAtTimeBeingInState);
-	praat_addAction1 (classHMM, 1, L"Get p (time, state, symbol)...", 0, 1, DO_HMM_getProbabilityAtTimeBeingInStateEmittingSymbol);
-	praat_addAction1 (classHMM, 1, L"Get probability staying in state...", 0, 1, DO_HMM_getProbabilityOfStayingInState);
-	praat_addAction1 (classHMM, 1, L"Get expected duration in state...", 0, 1, DO_HMM_getExpectedValueOfDurationInState);
-	praat_addAction1 (classHMM, 1, L"---- states / symbols -----", 0, 1, 0);
-	praat_addAction1 (classHMM, 1, L"Get state label...", 0, 1, DO_HMM_getStateLabel);
-	praat_addAction1 (classHMM, 1, L"Get symbol label...", 0, 1, DO_HMM_getSymbolLabel);
-	praat_addAction1 (classHMM, 0, L"--- multiple HMMs ----", 0, 1, 0);
-	praat_addAction1 (classHMM, 2, L"Get cross-entropy...", 0, 1, DO_HMM_and_HMM_getCrossEntropy);
-
-	praat_addAction1 (classHMM, 0, L"Modify -", 0, 0, 0);
-	praat_addAction1 (classHMM, 1, L"Set transition probabilities...", 0, 1, DO_HMM_setTransitionProbabilities);
-	praat_addAction1 (classHMM, 1, L"Set emission probabilities...", 0, 1, DO_HMM_setEmissionProbabilities);
-	praat_addAction1 (classHMM, 1, L"Set start probabilities...", 0, 1, DO_HMM_setStartProbabilities);
-
-	praat_addAction1 (classHMM, 0, L"Extract -", 0, 0, 0);
-	praat_addAction1 (classHMM, 0, L"Extract transition probabilities", 0, 1, DO_HMM_extractTransitionProbabilities);
-	praat_addAction1 (classHMM, 0, L"Extract emission probabilities", 0, 1, DO_HMM_extractEmissionProbabilities);
-
-	praat_addAction1 (classHMM, 0, L"To HMM_ObservationSequence...", 0, 0, DO_HMM_to_HMM_ObservationSequence);
-	praat_addAction2 (classHMM, 1, classHMM_StateSequence, 1, L"Draw trellis...", 0, 0, DO_HMM_and_HMM_StateSequence_drawTrellis);
-	praat_addAction2 (classHMM, 1, classHMM_StateSequence, 1, L"Get probability", 0, 0, DO_HMM_and_HMM_StateSequence_getProbability);
-	praat_addAction2 (classHMM, 1, classHMM_StateSequence, 1, L"To TableOfReal (bigrams)...", 0, 0, DO_HMM_and_HMM_StateSequence_to_TableOfReal);
-	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 1, L"Get probability", 0, 0, DO_HMM_and_HMM_ObservationSequence_getProbability);
-	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 1, L"Get cross-entropy", 0, 0, DO_HMM_and_HMM_ObservationSequence_getCrossEntropy);
-	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 1, L"Get perplexity", 0, 0, DO_HMM_and_HMM_ObservationSequence_getPerplexity);
-
-
-	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 1, L"To HMM_StateSequence", 0, 0, DO_HMM_and_HMM_ObservationSequence_to_HMM_StateSequence);
-	praat_addAction2 (classHMM, 2, classHMM_ObservationSequence, 1, L"Get cross-entropy", 0, 0, DO_HMM_and_HMM_and_HMM_ObservationSequence_getCrossEntropy);
-	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 1, L"To TableOfReal (bigrams)...", 0, 0, DO_HMM_and_HMM_ObservationSequence_to_TableOfReal);
-	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 0, L"Learn...", 0, 0, DO_HMM_and_HMM_ObservationSequence_learn);
-
-	praat_addAction1 (classHMM_ObservationSequence, 0, L"To TableOfReal (bigrams)...", 0, 0, DO_HMM_ObservationSequence_to_TableOfReal);
-	praat_addAction1 (classHMM_ObservationSequence, 0, L"To Strings", 0, 0, DO_HMM_ObservationSequence_to_Strings);
-	praat_addAction1 (classHMM_StateSequence, 0, L"To TableOfReal (bigrams)...", 0, 0, DO_HMM_StateSequence_to_TableOfReal);
-	praat_addAction1 (classHMM_StateSequence, 0, L"To Strings", 0, 0, DO_HMM_StateSequence_to_Strings);
-
-	praat_addAction1 (classHMM_ObservationSequence, 0, L"To HMM...", 0, 1, DO_HMM_ObservationSequence_to_HMM);
-
-	praat_addAction1 (classStrings, 0, L"To HMM_ObservationSequence", 0, praat_HIDDEN, DO_Strings_to_HMM_ObservationSequence);
-	praat_addAction1 (classTableOfReal, 0, L"To GaussianMixture (row labels)...", L"To Covariance", praat_HIDDEN + praat_DEPTH_1, DO_TableOfReal_to_GaussianMixture_fromRowlabels);
-	praat_addAction1 (classTableOfReal, 0, L"To GaussianMixture...", L"To Covariance", praat_HIDDEN + praat_DEPTH_1, DO_TableOfReal_to_GaussianMixture);
+	Thing_recognizeClassesByName (classHMM, classHMM_State, classHMM_Observation, classHMM_ObservationSequence, classHMM_StateSequence, classGaussianMixture, nullptr);
+
+	praat_addMenuCommand (U"Objects", U"New", U"Markov models", 0, praat_HIDDEN, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Create HMM...", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create simple HMM...", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_createSimple);
+	praat_addMenuCommand (U"Objects", U"New", U"Create continuous HMM...", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_createContinuousModel);
+	praat_addMenuCommand (U"Objects", U"New", U"--drawings--", 0, praat_HIDDEN + praat_DEPTH_1, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Draw forward probabilities illustration", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_drawForwardProbabilitiesIllustration);
+	praat_addMenuCommand (U"Objects", U"New", U"Draw backward probabilities illustration", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_drawBackwardProbabilitiesIllustration);
+	praat_addMenuCommand (U"Objects", U"New", U"Draw forward and backward probabilities illustration", 0, praat_HIDDEN + praat_DEPTH_1, DO_HMM_drawForwardAndBackwardProbabilitiesIllustration);
+
+	praat_addAction1 (classGaussianMixture, 0, U"GaussianMixture help", 0, 0, DO_GaussianMixture_help);
+	praat_addAction1 (classGaussianMixture, 0, U"Draw concentration ellipses...", 0, 0, DO_GaussianMixture_drawConcentrationEllipses);
+	praat_addAction1 (classGaussianMixture, 0, U"Draw marginal pdf...", 0, 0, DO_GaussianMixture_drawMarginalPdf);
+	praat_addAction1 (classGaussianMixture, 0, U"Query -", 0, 0, 0);
+	praat_addAction1 (classGaussianMixture, 1, U"Get number of components", 0, 1, DO_GaussianMixture_getNumberOfComponents);
+	praat_addAction1 (classGaussianMixture, 1, U"Get dimension of component", 0, 1, DO_GaussianMixture_getDimensionOfComponent);
+	praat_addAction1 (classGaussianMixture, 1, U"Get probability at position...", 0, 1, DO_GaussianMixture_getProbabilityAtPosition);
+	praat_addAction1 (classGaussianMixture, 0, U"Modify -", 0, 0, 0);
+	praat_addAction1 (classGaussianMixture, 1, U"Split component...", 0, 1, DO_GaussianMixture_splitComponent);
+	praat_addAction1 (classGaussianMixture, 0, U"Extract -", 0, 0, 0);
+	praat_addAction1 (classGaussianMixture, 0, U"Extract mixing probabilities", 0, 1, DO_GaussianMixture_extractMixingProbabilities);
+	praat_addAction1 (classGaussianMixture, 0, U"Extract component...", 0, 1, DO_GaussianMixture_extractComponent);
+	praat_addAction1 (classGaussianMixture, 0, U"Extract centroids", 0, 1, DO_GaussianMixture_extractCentroids);
+	praat_addAction1 (classGaussianMixture, 0, U"To Covariance (between)", 0, 0, DO_GaussianMixture_to_Covariance_between);
+	praat_addAction1 (classGaussianMixture, 0, U"To Covariance (within)", 0, 0, DO_GaussianMixture_to_Covariance_within);
+	praat_addAction1 (classGaussianMixture, 0, U"To Covariance (total)", 0, 0, DO_GaussianMixture_to_Covariance_total);
+	praat_addAction1 (classGaussianMixture, 0, U"To PCA", 0, 0, DO_GaussianMixture_to_PCA);
+	praat_addAction1 (classGaussianMixture, 0, U"To TableOfReal (random sampling)...", 0, 0, DO_GaussianMixture_to_TableOfReal_randomSampling);
+
+	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, U"Get likelihood value...", 0, 0, DO_GaussianMixture_and_TableOfReal_getLikelihoodValue);
+	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, U"Improve likelihood...", 0, 0, DO_GaussianMixture_and_TableOfReal_improveLikelihood);
+	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, U"To GaussianMixture (CEMM)...", 0, 0, DO_GaussianMixture_and_TableOfReal_to_GaussianMixture_CEMM);
+	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, U"To ClassificationTable", 0, 0, DO_GaussianMixture_and_TableOfReal_to_ClassificationTable);
+	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, U"To Correlation", 0, 0, DO_GaussianMixture_and_TableOfReal_to_Correlation);
+	praat_addAction2 (classGaussianMixture, 1, classTableOfReal, 1, U"To TableOfReal (BHEP normality tests)...", 0, 0, DO_GaussianMixture_and_TableOfReal_to_TableOfReal_BHEPNormalityTests);
+
+	praat_addAction2 (classGaussianMixture, 1, classPCA, 1, U"Draw concentration ellipses...", 0, 0, DO_GaussianMixture_and_PCA_drawConcentrationEllipses);
+	praat_addAction2 (classGaussianMixture, 1, classPCA, 1, U"Draw marginal pdf...", 0, 0, DO_GaussianMixture_and_PCA_drawMarginalPdf);
+	praat_addAction2 (classGaussianMixture, 1, classPCA, 1, U"To Matrix (density)...", 0, 0, DO_GaussianMixture_and_PCA_to_Matrix_density);
+
+
+	praat_addAction1 (classHMM, 0, U"HMM help ", 0, 0, DO_HMM_help);
+	praat_addAction1 (classHMM, 0, U"Draw...", 0, 0, DO_HMM_draw);
+	praat_addAction1 (classHMM, 0, U"Query -", 0, 0, 0);
+	praat_addAction1 (classHMM, 1, U"Get transition probability...", 0, 1, DO_HMM_getTransitionProbability);
+	praat_addAction1 (classHMM, 1, U"Get emission probability...", 0, 1, DO_HMM_getEmissionProbability);
+	praat_addAction1 (classHMM, 1, U"Get start probability...", 0, 1, DO_HMM_getStartProbability);
+	praat_addAction1 (classHMM, 1, U"Get p (time, state)...", 0, 1, DO_HMM_getProbabilityAtTimeBeingInState);
+	praat_addAction1 (classHMM, 1, U"Get p (time, state, symbol)...", 0, 1, DO_HMM_getProbabilityAtTimeBeingInStateEmittingSymbol);
+	praat_addAction1 (classHMM, 1, U"Get probability staying in state...", 0, 1, DO_HMM_getProbabilityOfStayingInState);
+	praat_addAction1 (classHMM, 1, U"Get expected duration in state...", 0, 1, DO_HMM_getExpectedValueOfDurationInState);
+	praat_addAction1 (classHMM, 1, U"---- states / symbols -----", 0, 1, 0);
+	praat_addAction1 (classHMM, 1, U"Get state label...", 0, 1, DO_HMM_getStateLabel);
+	praat_addAction1 (classHMM, 1, U"Get symbol label...", 0, 1, DO_HMM_getSymbolLabel);
+	praat_addAction1 (classHMM, 0, U"--- multiple HMMs ----", 0, 1, 0);
+	praat_addAction1 (classHMM, 2, U"Get cross-entropy...", 0, 1, DO_HMM_and_HMM_getCrossEntropy);
+
+	praat_addAction1 (classHMM, 0, U"Modify -", 0, 0, 0);
+	praat_addAction1 (classHMM, 1, U"Set transition probabilities...", 0, 1, DO_HMM_setTransitionProbabilities);
+	praat_addAction1 (classHMM, 1, U"Set emission probabilities...", 0, 1, DO_HMM_setEmissionProbabilities);
+	praat_addAction1 (classHMM, 1, U"Set start probabilities...", 0, 1, DO_HMM_setStartProbabilities);
+
+	praat_addAction1 (classHMM, 0, U"Extract -", 0, 0, 0);
+	praat_addAction1 (classHMM, 0, U"Extract transition probabilities", 0, 1, DO_HMM_extractTransitionProbabilities);
+	praat_addAction1 (classHMM, 0, U"Extract emission probabilities", 0, 1, DO_HMM_extractEmissionProbabilities);
+
+	praat_addAction1 (classHMM, 0, U"To HMM_ObservationSequence...", 0, 0, DO_HMM_to_HMM_ObservationSequence);
+	praat_addAction2 (classHMM, 1, classHMM_StateSequence, 1, U"Draw trellis...", 0, 0, DO_HMM_and_HMM_StateSequence_drawTrellis);
+	praat_addAction2 (classHMM, 1, classHMM_StateSequence, 1, U"Get probability", 0, 0, DO_HMM_and_HMM_StateSequence_getProbability);
+	praat_addAction2 (classHMM, 1, classHMM_StateSequence, 1, U"To TableOfReal (bigrams)...", 0, 0, DO_HMM_and_HMM_StateSequence_to_TableOfReal);
+	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 1, U"Get probability", 0, 0, DO_HMM_and_HMM_ObservationSequence_getProbability);
+	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 1, U"Get cross-entropy", 0, 0, DO_HMM_and_HMM_ObservationSequence_getCrossEntropy);
+	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 1, U"Get perplexity", 0, 0, DO_HMM_and_HMM_ObservationSequence_getPerplexity);
+
+
+	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 1, U"To HMM_StateSequence", 0, 0, DO_HMM_and_HMM_ObservationSequence_to_HMM_StateSequence);
+	praat_addAction2 (classHMM, 2, classHMM_ObservationSequence, 1, U"Get cross-entropy", 0, 0, DO_HMM_and_HMM_and_HMM_ObservationSequence_getCrossEntropy);
+	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 1, U"To TableOfReal (bigrams)...", 0, 0, DO_HMM_and_HMM_ObservationSequence_to_TableOfReal);
+	praat_addAction2 (classHMM, 1, classHMM_ObservationSequence, 0, U"Learn...", 0, 0, DO_HMM_and_HMM_ObservationSequence_learn);
+
+	praat_addAction1 (classHMM_ObservationSequence, 0, U"To TableOfReal (bigrams)...", 0, 0, DO_HMM_ObservationSequence_to_TableOfReal);
+	praat_addAction1 (classHMM_ObservationSequence, 0, U"To Strings", 0, 0, DO_HMM_ObservationSequence_to_Strings);
+	praat_addAction1 (classHMM_StateSequence, 0, U"To TableOfReal (bigrams)...", 0, 0, DO_HMM_StateSequence_to_TableOfReal);
+	praat_addAction1 (classHMM_StateSequence, 0, U"To Strings", 0, 0, DO_HMM_StateSequence_to_Strings);
+
+	praat_addAction1 (classHMM_ObservationSequence, 0, U"To HMM...", 0, 1, DO_HMM_ObservationSequence_to_HMM);
+
+	praat_addAction1 (classStrings, 0, U"To HMM_ObservationSequence", 0, praat_HIDDEN, DO_Strings_to_HMM_ObservationSequence);
+	praat_addAction1 (classTableOfReal, 0, U"To GaussianMixture (row labels)...", U"To Covariance", praat_HIDDEN + praat_DEPTH_1, DO_TableOfReal_to_GaussianMixture_fromRowlabels);
+	praat_addAction1 (classTableOfReal, 0, U"To GaussianMixture...", U"To Covariance", praat_HIDDEN + praat_DEPTH_1, DO_TableOfReal_to_GaussianMixture);
 
 	INCLUDE_MANPAGES (manual_HMM)
 }
diff --git a/dwtools/praat_KlattGrid_init.cpp b/dwtools/praat_KlattGrid_init.cpp
index 802a7ac..eff48bc 100644
--- a/dwtools/praat_KlattGrid_init.cpp
+++ b/dwtools/praat_KlattGrid_init.cpp
@@ -1,6 +1,6 @@
 /* praat_KlattGrid_init.cpp
  *
- * Copyright (C) 2009-2014 David Weenink
+ * Copyright (C) 2009-2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,211 +33,211 @@
 
 /******************* KlattGrid  *********************************/
 
-static const wchar_t *formant_names[] = { L"", L"oral ", L"nasal ", L"frication ", L"tracheal ", L"nasal anti", L"tracheal anti", L"delta "};
+static const char32 *formant_names[] = { U"", U"oral ", U"nasal ", U"frication ", U"tracheal ", U"nasal anti", U"tracheal anti", U"delta "};
 
-static void KlattGrid_4formants_addCommonField (void *dia) {
+static void KlattGrid_4formants_addCommonField (UiForm dia) {
 	Any radio;
-	OPTIONMENU (L"Formant type", 1)
-	OPTION (L"Normal formant")
-	OPTION (L"Nasal formant")
-	OPTION (L"Frication formant")
-	OPTION (L"Tracheal formant")
+	OPTIONMENU (U"Formant type", 1)
+	OPTION (U"Normal formant")
+	OPTION (U"Nasal formant")
+	OPTION (U"Frication formant")
+	OPTION (U"Tracheal formant")
 }
 
-static void KlattGrid_6formants_addCommonField (void *dia) {
+static void KlattGrid_6formants_addCommonField (UiForm dia) {
 	Any radio;
-	OPTIONMENU (L"Formant type", 1)
-	OPTION (L"Normal formant")
-	OPTION (L"Nasal formant")
-	OPTION (L"Frication formant")
-	OPTION (L"Tracheal formant")
-	OPTION (L"Nasal antiformant")
-	OPTION (L"Tracheal antiformant")
-	//	OPTION (L"Delta formant")
+	OPTIONMENU (U"Formant type", 1)
+	OPTION (U"Normal formant")
+	OPTION (U"Nasal formant")
+	OPTION (U"Frication formant")
+	OPTION (U"Tracheal formant")
+	OPTION (U"Nasal antiformant")
+	OPTION (U"Tracheal antiformant")
+	//	OPTION (U"Delta formant")
 }
 
-static void KlattGrid_7formants_addCommonField (void *dia) {
+static void KlattGrid_7formants_addCommonField (UiForm dia) {
 	Any radio;
-	OPTIONMENU (L"Formant type", 1)
-	OPTION (L"Normal formant")
-	OPTION (L"Nasal formant")
-	OPTION (L"Frication formant")
-	OPTION (L"Tracheal formant")
-	OPTION (L"Nasal antiformant")
-	OPTION (L"Tracheal antiformant")
-	OPTION (L"Delta formant")
+	OPTIONMENU (U"Formant type", 1)
+	OPTION (U"Normal formant")
+	OPTION (U"Nasal formant")
+	OPTION (U"Frication formant")
+	OPTION (U"Tracheal formant")
+	OPTION (U"Nasal antiformant")
+	OPTION (U"Tracheal antiformant")
+	OPTION (U"Delta formant")
 }
 
-static void KlattGrid_PhonationGridPlayOptions_addCommonFields (void *dia) {
+static void KlattGrid_PhonationGridPlayOptions_addCommonFields (UiForm dia) {
 	Any radio;
-	//LABEL (L"", L"Phonation options")
-	BOOLEAN (L"Voicing", 1)
-	BOOLEAN (L"Flutter", 1)
-	BOOLEAN (L"Double pulsing", 1)
-	BOOLEAN (L"Collision phase", 1)
-	BOOLEAN (L"Spectral tilt", 1)
-	OPTIONMENU (L"Flow function", 1)
-	OPTION (L"Powers in tiers")
-	OPTION (L"t^2-t^3")
-	OPTION (L"t^3-t^4")
-	BOOLEAN (L"Flow derivative", 1)
-	BOOLEAN (L"Aspiration", 1)
-	BOOLEAN (L"Breathiness", 1)
+	//LABEL (U"", U"Phonation options")
+	BOOLEAN (U"Voicing", 1)
+	BOOLEAN (U"Flutter", 1)
+	BOOLEAN (U"Double pulsing", 1)
+	BOOLEAN (U"Collision phase", 1)
+	BOOLEAN (U"Spectral tilt", 1)
+	OPTIONMENU (U"Flow function", 1)
+	OPTION (U"Powers in tiers")
+	OPTION (U"t^2-t^3")
+	OPTION (U"t^3-t^4")
+	BOOLEAN (U"Flow derivative", 1)
+	BOOLEAN (U"Aspiration", 1)
+	BOOLEAN (U"Breathiness", 1)
 }
 
-static void KlattGrid_PhonationGridPlayOptions_getCommonFields (void *dia, KlattGrid thee) {
-	PhonationGridPlayOptions pp = thy phonation -> options;
-	pp -> voicing = GET_INTEGER (L"Voicing");
-	pp -> flutter = GET_INTEGER (L"Flutter");
-	pp -> doublePulsing = GET_INTEGER (L"Double pulsing");
-	pp -> collisionPhase = GET_INTEGER (L"Collision phase");
-	pp -> spectralTilt = GET_INTEGER (L"Spectral tilt");
-	pp -> flowFunction = GET_INTEGER (L"Flow function");
-	pp -> flowDerivative = GET_INTEGER (L"Flow derivative");
-	pp -> aspiration = GET_INTEGER (L"Aspiration");
-	pp -> breathiness = GET_INTEGER (L"Breathiness");
+static void KlattGrid_PhonationGridPlayOptions_getCommonFields (UiForm dia, KlattGrid thee) {
+	PhonationGridPlayOptions pp = thy phonation -> options.get();
+	pp -> voicing = GET_INTEGER (U"Voicing");
+	pp -> flutter = GET_INTEGER (U"Flutter");
+	pp -> doublePulsing = GET_INTEGER (U"Double pulsing");
+	pp -> collisionPhase = GET_INTEGER (U"Collision phase");
+	pp -> spectralTilt = GET_INTEGER (U"Spectral tilt");
+	pp -> flowFunction = GET_INTEGER (U"Flow function");
+	pp -> flowDerivative = GET_INTEGER (U"Flow derivative");
+	pp -> aspiration = GET_INTEGER (U"Aspiration");
+	pp -> breathiness = GET_INTEGER (U"Breathiness");
 }
 
-static void KlattGrid_PlayOptions_addCommonFields (void *dia, int sound) {
+static void KlattGrid_PlayOptions_addCommonFields (UiForm dia, int sound) {
 	Any radio;
-	//LABEL (L"", L"Time domain")
-	REAL (L"left Time range (s)", L"0")
-	REAL (L"right Time range (s)", L"0")
-	if (sound) POSITIVE (L"Sampling frequency (Hz)", L"44100")
-		BOOLEAN (L"Scale peak", 1)
+	//LABEL (U"", U"Time domain")
+	REAL (U"left Time range (s)", U"0")
+	REAL (U"right Time range (s)", U"0")
+	if (sound) POSITIVE (U"Sampling frequency (Hz)", U"44100")
+		BOOLEAN (U"Scale peak", 1)
 		KlattGrid_PhonationGridPlayOptions_addCommonFields (dia);
-	OPTIONMENU (L"Filter options", 1)
-	OPTION (L"Cascade")
-	OPTION (L"Parallel")
-	REAL (L"left Oral formant range", L"1")
-	REAL (L"right Oral formant range", L"5")
-	REAL (L"left Nasal formant range", L"1")
-	REAL (L"right Nasal formant range", L"1")
-	REAL (L"left Nasal antiformant range", L"1")
-	REAL (L"right Nasal antiformant range", L"1")
-	//LABEL (L"", L"Coupling options")
-	REAL (L"left Tracheal formant range", L"1")
-	REAL (L"right Tracheal formant range", L"1")
-	REAL (L"left Tracheal antiformant range", L"1")
-	REAL (L"right Tracheal antiformant range", L"1")
-	REAL (L"left Delta formant range", L"1")
-	REAL (L"right Delta formant range", L"1")
-	REAL (L"left Delta bandwidth range", L"1")
-	REAL (L"right Delta bandwidth range", L"1")
-	//LABEL (L"", L"Frication options")
-	REAL (L"left Frication formant range", L"1")
-	REAL (L"right Frication formant range", L"6")
-	BOOLEAN (L"Frication bypass", 1)
+	OPTIONMENU (U"Filter options", 1)
+	OPTION (U"Cascade")
+	OPTION (U"Parallel")
+	INTEGER (U"left Oral formant range", U"1")
+	INTEGER (U"right Oral formant range", U"5")
+	INTEGER (U"left Nasal formant range", U"1")
+	INTEGER (U"right Nasal formant range", U"1")
+	INTEGER (U"left Nasal antiformant range", U"1")
+	INTEGER (U"right Nasal antiformant range", U"1")
+	//LABEL (U"", U"Coupling options")
+	INTEGER (U"left Tracheal formant range", U"1")
+	INTEGER (U"right Tracheal formant range", U"1")
+	INTEGER (U"left Tracheal antiformant range", U"1")
+	INTEGER (U"right Tracheal antiformant range", U"1")
+	INTEGER (U"left Delta formant range", U"1")
+	INTEGER (U"right Delta formant range", U"1")
+	INTEGER (U"left Delta bandwidth range", U"1")
+	INTEGER (U"right Delta bandwidth range", U"1")
+	//LABEL (U"", U"Frication options")
+	INTEGER (U"left Frication formant range", U"1")
+	INTEGER (U"right Frication formant range", U"6")
+	BOOLEAN (U"Frication bypass", 1)
 }
 
-static void KlattGrid_PlayOptions_getCommonFields (void *dia, int sound, KlattGrid thee) {
+static void KlattGrid_PlayOptions_getCommonFields (UiForm dia, int sound, KlattGrid thee) {
 	KlattGrid_setDefaultPlayOptions (thee);
-	KlattGridPlayOptions pk = thy options;
-	pk -> scalePeak = GET_INTEGER (L"Scale peak");
-	pk -> xmin = GET_REAL (L"left Time range");
-	pk -> xmax = GET_REAL (L"right Time range");
+	KlattGridPlayOptions pk = thy options.get();
+	pk -> scalePeak = GET_INTEGER (U"Scale peak");
+	pk -> xmin = GET_REAL (U"left Time range");
+	pk -> xmax = GET_REAL (U"right Time range");
 	if (sound) {
-		pk -> samplingFrequency = GET_REAL (L"Sampling frequency");
+		pk -> samplingFrequency = GET_REAL (U"Sampling frequency");
 	}
-	pk -> scalePeak = GET_INTEGER (L"Scale peak");
+	pk -> scalePeak = GET_INTEGER (U"Scale peak");
 	KlattGrid_PhonationGridPlayOptions_getCommonFields (dia, thee);
-	VocalTractGridPlayOptions pv = thy vocalTract -> options;
-	pv -> filterModel = GET_INTEGER (L"Filter options") == 1 ? KlattGrid_FILTER_CASCADE : KlattGrid_FILTER_PARALLEL;
-	pv -> startOralFormant = GET_REAL (L"left Oral formant range");
-	pv -> endOralFormant  = GET_REAL (L"right Oral formant range");
-	pv -> startNasalFormant = GET_REAL (L"left Nasal formant range");
-	pv -> endNasalFormant = GET_REAL (L"right Nasal formant range");
-	pv -> startNasalAntiFormant = GET_REAL (L"left Nasal antiformant range");
-	pv -> endNasalAntiFormant = GET_REAL (L"right Nasal antiformant range");
-	CouplingGridPlayOptions pc = thy coupling -> options;
-	pc -> startTrachealFormant = GET_REAL (L"left Tracheal formant range");
-	pc -> endTrachealFormant = GET_REAL (L"right Tracheal formant range");
-	pc -> startTrachealAntiFormant = GET_REAL (L"left Tracheal antiformant range");
-	pc -> endTrachealAntiFormant = GET_REAL (L"right Tracheal antiformant range");
-	pc -> startDeltaFormant = GET_REAL (L"left Delta formant range");
-	pc -> endDeltaFormant = GET_REAL (L"right Delta formant range");
-	pc -> startDeltaBandwidth = GET_REAL (L"left Delta bandwidth range");
-	pc -> endDeltaFormant = GET_REAL (L"right Delta bandwidth range");
-	FricationGridPlayOptions pf = thy frication -> options;
-	pf -> startFricationFormant = GET_REAL (L"left Frication formant range");
-	pf -> endFricationFormant = GET_REAL (L"right Frication formant range");
-	pf -> bypass = GET_INTEGER (L"Frication bypass");
+	VocalTractGridPlayOptions pv = thy vocalTract -> options.get();
+	pv -> filterModel = GET_INTEGER (U"Filter options") == 1 ? KlattGrid_FILTER_CASCADE : KlattGrid_FILTER_PARALLEL;
+	pv -> startOralFormant = GET_INTEGER (U"left Oral formant range");
+	pv -> endOralFormant  = GET_INTEGER (U"right Oral formant range");
+	pv -> startNasalFormant = GET_INTEGER (U"left Nasal formant range");
+	pv -> endNasalFormant = GET_INTEGER (U"right Nasal formant range");
+	pv -> startNasalAntiFormant = GET_INTEGER (U"left Nasal antiformant range");
+	pv -> endNasalAntiFormant = GET_INTEGER (U"right Nasal antiformant range");
+	CouplingGridPlayOptions pc = thy coupling -> options.get();
+	pc -> startTrachealFormant = GET_INTEGER (U"left Tracheal formant range");
+	pc -> endTrachealFormant = GET_INTEGER (U"right Tracheal formant range");
+	pc -> startTrachealAntiFormant = GET_INTEGER (U"left Tracheal antiformant range");
+	pc -> endTrachealAntiFormant = GET_INTEGER (U"right Tracheal antiformant range");
+	pc -> startDeltaFormant = GET_INTEGER (U"left Delta formant range");
+	pc -> endDeltaFormant = GET_INTEGER (U"right Delta formant range");
+	pc -> startDeltaBandwidth = GET_INTEGER (U"left Delta bandwidth range");
+	pc -> endDeltaFormant = GET_INTEGER (U"right Delta bandwidth range");
+	FricationGridPlayOptions pf = thy frication -> options.get();
+	pf -> startFricationFormant = GET_INTEGER (U"left Frication formant range");
+	pf -> endFricationFormant = GET_INTEGER (U"right Frication formant range");
+	pf -> bypass = GET_INTEGER (U"Frication bypass");
 }
 
 DIRECT (KlattGrid_createExample)
-praat_new (KlattGrid_createExample(), L"example");
+	praat_new (KlattGrid_createExample().transfer(), U"example");
 END
 
-FORM (KlattGrid_create, L"Create KlattGrid", L"Create KlattGrid...")
-	WORD (L"Name", L"kg")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	INTEGER (L"Number of oral formants", L"6")
-	INTEGER (L"Number of nasal formants", L"1")
-	INTEGER (L"Number of nasal antiformants", L"1")
-	INTEGER (L"Number of frication formants", L"6")
-	LABEL (L"", L"Coupling between source and filter")
-	INTEGER (L"Number of tracheal formants", L"1")
-	INTEGER (L"Number of tracheal antiformants", L"1")
-	INTEGER (L"Number of delta formants", L"1")
+FORM (KlattGrid_create, U"Create KlattGrid", U"Create KlattGrid...")
+	WORD (U"Name", U"kg")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	INTEGER (U"Number of oral formants", U"6")
+	INTEGER (U"Number of nasal formants", U"1")
+	INTEGER (U"Number of nasal antiformants", U"1")
+	INTEGER (U"Number of frication formants", U"6")
+	LABEL (U"", U"Coupling between source and filter")
+	INTEGER (U"Number of tracheal formants", U"1")
+	INTEGER (U"Number of tracheal antiformants", U"1")
+	INTEGER (U"Number of delta formants", U"1")
 	OK
 DO
-	double tmin = GET_REAL (L"Start time");
-	double tmax = GET_REAL (L"End time");
-	REQUIRE (tmin < tmax, L"The start time must lie before the end time.")
-	long numberOfOralFormants = GET_INTEGER (L"Number of oral formants");
-	long numberOfNasalFormants = GET_INTEGER (L"Number of nasal formants");
-	long numberOfNasalAntiFormants = GET_INTEGER (L"Number of nasal antiformants");
-	long numberOfTrachealFormants = GET_INTEGER (L"Number of tracheal formants");
-	long numberOfTrachealAntiFormants = GET_INTEGER (L"Number of tracheal antiformants");
-	long numberOfFricationFormants = GET_INTEGER (L"Number of frication formants");
-	long numberOfDeltaFormants = GET_INTEGER (L"Number of delta formants");
+	double tmin = GET_REAL (U"Start time");
+	double tmax = GET_REAL (U"End time");
+	REQUIRE (tmin < tmax, U"The start time must lie before the end time.")
+	long numberOfOralFormants = GET_INTEGER (U"Number of oral formants");
+	long numberOfNasalFormants = GET_INTEGER (U"Number of nasal formants");
+	long numberOfNasalAntiFormants = GET_INTEGER (U"Number of nasal antiformants");
+	long numberOfTrachealFormants = GET_INTEGER (U"Number of tracheal formants");
+	long numberOfTrachealAntiFormants = GET_INTEGER (U"Number of tracheal antiformants");
+	long numberOfFricationFormants = GET_INTEGER (U"Number of frication formants");
+	long numberOfDeltaFormants = GET_INTEGER (U"Number of delta formants");
 	REQUIRE (numberOfOralFormants >= 0 && numberOfNasalFormants >= 0 && numberOfNasalAntiFormants >= 0
 		&& numberOfTrachealFormants >= 0 && numberOfTrachealAntiFormants >= 0
 		&& numberOfFricationFormants >= 0 && numberOfDeltaFormants >= 0,
-		L"The number of (..) formants cannot be negative!")
+		U"The number of (..) formants cannot be negative!")
 	praat_new (KlattGrid_create (tmin, tmax, numberOfOralFormants,
 		numberOfNasalFormants, numberOfNasalAntiFormants,
 		numberOfTrachealFormants, numberOfTrachealAntiFormants,
-		numberOfFricationFormants, numberOfDeltaFormants),
-		GET_STRING (L"Name"));
+		numberOfFricationFormants, numberOfDeltaFormants).transfer(),
+		GET_STRING (U"Name"));
 END
 
 
-#define KlattGrid_INSTALL_TIER_EDITOR(Name,name) \
+#define KlattGrid_INSTALL_TIER_EDITOR(Name) \
 DIRECT (KlattGrid_edit##Name##Tier) \
-	if (theCurrentPraatApplication -> batch) { Melder_throw ("Cannot edit a KlattGrid from batch."); } \
+	if (theCurrentPraatApplication -> batch) { Melder_throw (U"Cannot edit a KlattGrid from batch."); } \
 	LOOP {\
 		iam (KlattGrid); \
-		auto##KlattGrid_##name##TierEditor editor = KlattGrid_##name##TierEditor_create (ID_AND_FULL_NAME, me); \
+		auto##KlattGrid_##Name##TierEditor editor = KlattGrid_##Name##TierEditor_create (ID_AND_FULL_NAME, me); \
 		praat_installEditor (editor.transfer(), IOBJECT); \
 	}\
 END
 
-KlattGrid_INSTALL_TIER_EDITOR (Pitch, pitch)
-KlattGrid_INSTALL_TIER_EDITOR (VoicingAmplitude, voicingAmplitude)
-KlattGrid_INSTALL_TIER_EDITOR (Flutter, flutter)
-KlattGrid_INSTALL_TIER_EDITOR (Power1, power1)
-KlattGrid_INSTALL_TIER_EDITOR (Power2, power2)
-KlattGrid_INSTALL_TIER_EDITOR (OpenPhase, openPhase)
-KlattGrid_INSTALL_TIER_EDITOR (CollisionPhase, collisionPhase)
-KlattGrid_INSTALL_TIER_EDITOR (DoublePulsing, doublePulsing)
-KlattGrid_INSTALL_TIER_EDITOR (AspirationAmplitude, aspirationAmplitude)
-KlattGrid_INSTALL_TIER_EDITOR (BreathinessAmplitude, breathinessAmplitude)
-KlattGrid_INSTALL_TIER_EDITOR (SpectralTilt, spectralTilt)
-
-KlattGrid_INSTALL_TIER_EDITOR (FricationBypass, fricationBypass)
-KlattGrid_INSTALL_TIER_EDITOR (FricationAmplitude, fricationAmplitude)
+KlattGrid_INSTALL_TIER_EDITOR (Pitch)
+KlattGrid_INSTALL_TIER_EDITOR (VoicingAmplitude)
+KlattGrid_INSTALL_TIER_EDITOR (Flutter)
+KlattGrid_INSTALL_TIER_EDITOR (Power1)
+KlattGrid_INSTALL_TIER_EDITOR (Power2)
+KlattGrid_INSTALL_TIER_EDITOR (OpenPhase)
+KlattGrid_INSTALL_TIER_EDITOR (CollisionPhase)
+KlattGrid_INSTALL_TIER_EDITOR (DoublePulsing)
+KlattGrid_INSTALL_TIER_EDITOR (AspirationAmplitude)
+KlattGrid_INSTALL_TIER_EDITOR (BreathinessAmplitude)
+KlattGrid_INSTALL_TIER_EDITOR (SpectralTilt)
+
+KlattGrid_INSTALL_TIER_EDITOR (FricationBypass)
+KlattGrid_INSTALL_TIER_EDITOR (FricationAmplitude)
 
 #undef KlattGrid_INSTALL_TIER_EDITOR
 
 #define KlattGRID_EDIT_FORMANTGRID(Name,formantType) \
 DIRECT (KlattGrid_edit##Name##FormantGrid) \
-	if (theCurrentPraatApplication -> batch) { Melder_throw ("Cannot edit a KlattGrid from batch."); } \
+	if (theCurrentPraatApplication -> batch) { Melder_throw (U"Cannot edit a KlattGrid from batch."); } \
 	LOOP {\
 		iam (KlattGrid); \
-		const wchar_t *id_and_name = Melder_wcscat (Melder_integer (ID), L". ", formant_names[formantType], L"formant grid"); \
-		autoKlattGrid_formantGridEditor editor = KlattGrid_formantGridEditor_create (id_and_name, me, formantType); \
+		const char32 *id_and_name = Melder_cat (ID, U". ", formant_names[formantType], U"formant grid"); \
+		autoKlattGrid_FormantGridEditor editor = KlattGrid_FormantGridEditor_create (id_and_name, me, formantType); \
 		praat_installEditor (editor.transfer(), IOBJECT); \
 	} \
 END
@@ -253,19 +253,19 @@ KlattGRID_EDIT_FORMANTGRID (Frication, KlattGrid_FRICATION_FORMANTS)
 #undef KlattGRID_EDIT_FORMANTGRID
 
 #define KlattGrid_EDIT_FORMANT_AMPLITUDE_TIER(Name,name,formantType) \
-FORM (KlattGrid_edit##Name##FormantAmplitudeTier, L"KlattGrid: View & Edit " #name "formant amplitude tier", 0) \
-	NATURAL (L"Formant number", L"1") \
+FORM (KlattGrid_edit##Name##FormantAmplitudeTier, U"KlattGrid: View & Edit " #name "formant amplitude tier", 0) \
+	NATURAL (U"Formant number", U"1") \
 	OK \
 DO \
-	long formantNumber = GET_INTEGER (L"Formant number"); \
-	if (theCurrentPraatApplication -> batch) { Melder_throw ("Cannot edit a KlattGrid from batch."); } \
+	long formantNumber = GET_INTEGER (U"Formant number"); \
+	if (theCurrentPraatApplication -> batch) { Melder_throw (U"Cannot edit a KlattGrid from batch."); } \
 	LOOP { \
 		iam (KlattGrid); \
 		Ordered *amp = KlattGrid_getAddressOfAmplitudes (me, formantType); \
-		if (amp == NULL) Melder_throw ("Unknown formant type"); \
-		if (formantNumber > (*amp) -> size) Melder_throw ("Formant number does not exist."); \
-		const wchar_t *id_and_name = Melder_wcscat (Melder_integer (ID), L". ", formant_names[formantType], L"formant amplitude tier"); \
-		autoKlattGrid_decibelTierEditor editor = KlattGrid_decibelTierEditor_create (id_and_name, me, (RealTier) (*amp)->item[formantNumber]); \
+		if (! amp) Melder_throw (U"Unknown formant type"); \
+		if (formantNumber > (*amp) -> size) Melder_throw (U"Formant number does not exist."); \
+		const char32 *id_and_name = Melder_cat (ID, U". ", formant_names[formantType], U"formant amplitude tier"); \
+		autoKlattGrid_DecibelTierEditor editor = KlattGrid_DecibelTierEditor_create (id_and_name, me, (RealTier) (*amp)->item[formantNumber]); \
 		praat_installEditor (editor.transfer(), IOBJECT); \
 	} \
 END
@@ -278,39 +278,39 @@ KlattGrid_EDIT_FORMANT_AMPLITUDE_TIER (Frication, frication, KlattGrid_FRICATION
 #undef KlattGrid_EDIT_FORMANT_AMPLITUDE_TIER
 
 #define KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE(Name,name,unit,default,require, requiremessage,newname,tiertype) \
-FORM(KlattGrid_get##Name##AtTime, L"KlattGrid: Get " #name " at time", 0) \
-	REAL (L"Time", L"0.5") \
+FORM(KlattGrid_get##Name##AtTime, U"KlattGrid: Get " #name " at time", 0) \
+	REAL (U"Time", U"0.5") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-	Melder_informationReal (KlattGrid_get##Name##AtTime (me, GET_REAL (L"Time")), unit); \
+	Melder_informationReal (KlattGrid_get##Name##AtTime (me, GET_REAL (U"Time")), unit); \
 	}\
 END \
-FORM (KlattGrid_add##Name##Point, L"KlattGrid: Add " #name " point", 0) \
-	REAL (L"Time (s)", L"0.5") \
-	REAL (L"Value" unit, default) \
+FORM (KlattGrid_add##Name##Point, U"KlattGrid: Add " #name " point", 0) \
+	REAL (U"Time (s)", U"0.5") \
+	REAL (U"Value" unit, default) \
 	OK \
 DO \
-	double value = GET_REAL (L"Value"); \
+	double value = GET_REAL (U"Value"); \
 	REQUIRE (require, requiremessage) \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_add##Name##Point (me, GET_REAL (L"Time"), value); \
+		KlattGrid_add##Name##Point (me, GET_REAL (U"Time"), value); \
 		praat_dataChanged (me); \
 	} \
 END \
-FORM (KlattGrid_remove##Name##Points, L"Remove " #name " points", 0) \
-	REAL (L"From time (s)", L"0.3")\
-	REAL (L"To time (s)", L"0.7") \
+FORM (KlattGrid_remove##Name##Points, U"Remove " #name " points", 0) \
+	REAL (U"From time (s)", U"0.3")\
+	REAL (U"To time (s)", U"0.7") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_remove##Name##Points (me, GET_REAL (L"From time"), GET_REAL (L"To time")); \
+		KlattGrid_remove##Name##Points (me, GET_REAL (U"From time"), GET_REAL (U"To time")); \
 		praat_dataChanged (me);\
 	} \
 END \
 DIRECT (KlattGrid_extract##Name##Tier) \
 	LOOP { iam (KlattGrid); \
-		praat_new (KlattGrid_extract##Name##Tier (me), newname); \
+		praat_new (KlattGrid_extract##Name##Tier (me).transfer(), newname); \
 	} \
 END \
 DIRECT (KlattGrid_replace##Name##Tier) \
@@ -321,150 +321,150 @@ DIRECT (KlattGrid_replace##Name##Tier) \
 END
 
 // 55 DO_KlattGrid... functions
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Pitch, pitch, L" (Hz)", (L"100.0"),
-        (value >= 0), (L"Pitch must be greater equal zero."), L"f0", PitchTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (VoicingAmplitude, voicing amplitude, L" (dB SPL)", L"90.0",
-        (1), L"", L"voicing", IntensityTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Flutter, flutter, L" (0..1)", (L"0.0"),
-        (value >= 0 && value <= 1), (L"Flutter must be in [0,1]."), L"flutter", RealTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Power1, power1, L"", L"3",
-        (value > 0), L"Power1 needs to be positive.", L"power1", RealTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Power2, power2, L"", L"4",
-        (value > 0), L"Power2 needs to be positive.", L"power2", RealTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (OpenPhase, open phase, L"", L"0.7",
-        (value >= 0 && value <= 1), L"Open phase must be greater than zero and smaller equal one.", L"openPhase", RealTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (CollisionPhase, collision phase, L"", L"0.03",
-        (value >= 0 && value < 1), L"Collision phase must be greater equal zero and smaller than one.", L"collisionPhase", RealTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (DoublePulsing, double pulsing, L" (0..1)", L"0.0",
-        (value >= 0 && value <= 1), L"Double pulsing must be greater equal zero and smaller equal one.", L"doublePulsing", RealTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (SpectralTilt, spectral tilt, L" (dB)", L"0.0",
-        (value >= 0), L"Spectral tilt must be greater equal zero.", L"spectralTilt", IntensityTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (AspirationAmplitude, aspiration amplitude, L" (dB SPL)", L"0.0",
-        (1), L"", L"aspiration", IntensityTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (BreathinessAmplitude, breathiness amplitude, L" (dB SPL)", L"30.0",
-        (1), L"", L"breathiness", IntensityTier)
-
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (FricationAmplitude, frication amplitude, L" (dB SPL)", L"30.0",
-        (1), L"", L"frication", IntensityTier)
-KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (FricationBypass, frication bypass, L" (dB)", L"30.0",
-        (1), L"", L"bypass", IntensityTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Pitch, pitch, U" (Hz)", (U"100.0"),
+        (value >= 0), (U"Pitch must be greater equal zero."), U"f0", PitchTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (VoicingAmplitude, voicing amplitude, U" (dB SPL)", U"90.0",
+        (1), U"", U"voicing", IntensityTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Flutter, flutter, U" (0..1)", (U"0.0"),
+        (value >= 0 && value <= 1), (U"Flutter must be in [0,1]."), U"flutter", RealTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Power1, power1, U"", U"3",
+        (value > 0), U"Power1 needs to be positive.", U"power1", RealTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (Power2, power2, U"", U"4",
+        (value > 0), U"Power2 needs to be positive.", U"power2", RealTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (OpenPhase, open phase, U"", U"0.7",
+        (value >= 0 && value <= 1), U"Open phase must be greater than zero and smaller equal one.", U"openPhase", RealTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (CollisionPhase, collision phase, U"", U"0.03",
+        (value >= 0 && value < 1), U"Collision phase must be greater equal zero and smaller than one.", U"collisionPhase", RealTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (DoublePulsing, double pulsing, U" (0..1)", U"0.0",
+        (value >= 0 && value <= 1), U"Double pulsing must be greater equal zero and smaller equal one.", U"doublePulsing", RealTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (SpectralTilt, spectral tilt, U" (dB)", U"0.0",
+        (value >= 0), U"Spectral tilt must be greater equal zero.", U"spectralTilt", IntensityTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (AspirationAmplitude, aspiration amplitude, U" (dB SPL)", U"0.0",
+        (1), U"", U"aspiration", IntensityTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (BreathinessAmplitude, breathiness amplitude, U" (dB SPL)", U"30.0",
+        (1), U"", U"breathiness", IntensityTier)
+
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (FricationAmplitude, frication amplitude, U" (dB SPL)", U"30.0",
+        (1), U"", U"frication", IntensityTier)
+KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE (FricationBypass, frication bypass, U" (dB)", U"30.0",
+        (1), U"", U"bypass", IntensityTier)
 
 #undef KlattGrid_PHONATION_GET_ADD_REMOVE_EXTRACT_REPLACE
 
 #define KlattGrid_FORMULA_FORMANT_FBA_VALUE(Name,namef,ForBs,forbs,textfield,formantType,label) \
-FORM (KlattGrid_formula##Name##Formant##ForBs, L"KlattGrid: Formula (" #namef "ormant " #forbs ")", L"Formant: Formula (" #forbs ")...") \
-	LABEL (L"", L"row is formant number, col is point number:\nfor row from 1 to nrow do for col from 1 to ncol do " #ForBs " (row, col) :=") \
-	LABEL (L"", label) \
-	TEXTFIELD (L"formula", textfield) \
+FORM (KlattGrid_formula##Name##Formant##ForBs, U"KlattGrid: Formula (" #namef "ormant " #forbs ")", U"Formant: Formula (" #forbs ")...") \
+	LABEL (U"", U"row is formant number, col is point number:\nfor row from 1 to nrow do for col from 1 to ncol do " #ForBs " (row, col) :=") \
+	LABEL (U"", label) \
+	TEXTFIELD (U"formula", textfield) \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_formula_##forbs (me, formantType, GET_STRING (L"formula"), interpreter); \
+		KlattGrid_formula_##forbs (me, formantType, GET_STRING (U"formula"), interpreter); \
 		praat_dataChanged (me); \
 	} \
 END
 
 #define KlattGrid_ADD_FBA_VALUE(Name,namef,Form,FBA,fba,formantType,default,unit,require,requiremessage) \
-FORM (KlattGrid_add##Name##Formant##FBA##Point, L"KlattGrid: Add " #namef "ormant " #fba " point", 0) \
-	NATURAL (L"Formant number", L"1") \
-	REAL (L"Time (s)", L"0.5") \
-	REAL (L"Value " #unit, default) \
+FORM (KlattGrid_add##Name##Formant##FBA##Point, U"KlattGrid: Add " #namef "ormant " #fba " point", 0) \
+	NATURAL (U"Formant number", U"1") \
+	REAL (U"Time (s)", U"0.5") \
+	REAL (U"Value " #unit, default) \
 	OK \
 DO \
-	double value = GET_REAL (L"Value"); \
+	double value = GET_REAL (U"Value"); \
 	REQUIRE (require, requiremessage) \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_add##Form##Point (me, formantType, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"), value); \
+		KlattGrid_add##Form##Point (me, formantType, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"), value); \
 		praat_dataChanged (me); \
 	} \
 END
 
 #define KlattGrid_REMOVE_FBA_VALUE(Name,namef,Form,FBA,fba,formantType) \
-FORM (KlattGrid_remove##Name##Formant##FBA##Points, L"KlattGrid: Remove " #namef "ormant " #fba " points", 0) \
-	NATURAL (L"Formant number", L"1") \
-	REAL (L"From time (s)", L"0.3")\
-	REAL (L"To time (s)", L"0.7") \
+FORM (KlattGrid_remove##Name##Formant##FBA##Points, U"KlattGrid: Remove " #namef "ormant " #fba " points", 0) \
+	NATURAL (U"Formant number", U"1") \
+	REAL (U"From time (s)", U"0.3")\
+	REAL (U"To time (s)", U"0.7") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_remove##Form##Points (me, formantType, GET_INTEGER (L"Formant number"), GET_REAL (L"From time"), GET_REAL (L"To time")); \
+		KlattGrid_remove##Form##Points (me, formantType, GET_INTEGER (U"Formant number"), GET_REAL (U"From time"), GET_REAL (U"To time")); \
 		praat_dataChanged (me);\
 	} \
 END
 
 #define KlattGrid_ADD_FORMANT(Name,namef,formantType) \
-FORM (KlattGrid_add##Name##Formant, L"KlattGrid: Add " #namef "ormant", 0) \
-	INTEGER (L"Position", L"0 (=at end)") \
+FORM (KlattGrid_add##Name##Formant, U"KlattGrid: Add " #namef "ormant", 0) \
+	INTEGER (U"Position", U"0 (=at end)") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_addFormant (me, formantType, GET_INTEGER (L"Position")); \
+		KlattGrid_addFormant (me, formantType, GET_INTEGER (U"Position")); \
 		praat_dataChanged (me); \
 	} \
 END
 
 #define KlattGrid_REMOVE_FORMANT(Name,namef,formantType) \
-FORM (KlattGrid_remove##Name##Formant, L"KlattGrid: Remove " #namef "ormant", 0) \
-	INTEGER (L"Position", L"0 (=do nothing)") \
+FORM (KlattGrid_remove##Name##Formant, U"KlattGrid: Remove " #namef "ormant", 0) \
+	INTEGER (U"Position", U"0 (=do nothing)") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_removeFormant (me, formantType, GET_INTEGER (L"Position")); \
+		KlattGrid_removeFormant (me, formantType, GET_INTEGER (U"Position")); \
 		praat_dataChanged (me); \
 	} \
 END
 
 #define KlattGrid_ADD_FORMANT_FREQUENCYANDBANDWIDTHTIERS(Name,namef,formantType) \
-FORM (KlattGrid_add##Name##FormantFrequencyAndBandwidthTiers, L"KlattGrid: Add " #namef "ormant", 0) \
-	INTEGER (L"Position", L"0 (=at end)") \
+FORM (KlattGrid_add##Name##FormantFrequencyAndBandwidthTiers, U"KlattGrid: Add " #namef "ormant", 0) \
+	INTEGER (U"Position", U"0 (=at end)") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_addFormantFrequencyAndBandwidthTiers (me, formantType, GET_INTEGER (L"Position")); \
+		KlattGrid_addFormantFrequencyAndBandwidthTiers (me, formantType, GET_INTEGER (U"Position")); \
 		praat_dataChanged (me); \
 	} \
 END
 
 #define KlattGrid_REMOVE_FORMANT_FREQUENCYANDBANDWIDTHTIERS(Name,namef,formantType) \
-FORM (KlattGrid_remove##Name##FormantFrequencyAndBandwidthTiers, L"KlattGrid: Remove " #namef "ormant", 0) \
-	INTEGER (L"Position", L"0 (=do nothing)") \
+FORM (KlattGrid_remove##Name##FormantFrequencyAndBandwidthTiers, U"KlattGrid: Remove " #namef "ormant", 0) \
+	INTEGER (U"Position", U"0 (=do nothing)") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_removeFormantFrequencyAndBandwidthTiers (me, formantType, GET_INTEGER (L"Position")); \
+		KlattGrid_removeFormantFrequencyAndBandwidthTiers (me, formantType, GET_INTEGER (U"Position")); \
 		praat_dataChanged (me); \
 	} \
 END
 
 #define KlattGrid_ADD_FORMANT_AMPLITUDETIER(Name,namef,formantType) \
-FORM (KlattGrid_add##Name##FormantAmplitudeTier, L"KlattGrid: Add " #namef "ormant amplitude tier", 0) \
-	INTEGER (L"Position", L"0 (=at end)") \
+FORM (KlattGrid_add##Name##FormantAmplitudeTier, U"KlattGrid: Add " #namef "ormant amplitude tier", 0) \
+	INTEGER (U"Position", U"0 (=at end)") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_addFormantAmplitudeTier (me, formantType, GET_INTEGER (L"Position")); \
+		KlattGrid_addFormantAmplitudeTier (me, formantType, GET_INTEGER (U"Position")); \
 		praat_dataChanged (me); \
 	} \
 END
 
 #define KlattGrid_REMOVE_FORMANT_AMPLITUDETIER(Name,namef,formantType) \
-FORM (KlattGrid_remove##Name##FormantAmplitudeTier, L"KlattGrid: Remove " #namef "ormant amplitude tier", 0) \
-	INTEGER (L"Position", L"0 (=do nothing)") \
+FORM (KlattGrid_remove##Name##FormantAmplitudeTier, U"KlattGrid: Remove " #namef "ormant amplitude tier", 0) \
+	INTEGER (U"Position", U"0 (=do nothing)") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_removeFormant (me, formantType, GET_INTEGER (L"Position")); \
+		KlattGrid_removeFormant (me, formantType, GET_INTEGER (U"Position")); \
 		praat_dataChanged (me); \
 	} \
 END
 
 
 #define KlattGrid_FORMULA_ADD_REMOVE_FBA(Name,namef,formantType) \
-KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Frequencies, frequencies, L"if row = 2 then self + 200 else self fi", formantType, L" ") \
-KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Bandwidths, bandwidths, L"self / 10 ; 10% of frequency", formantType, L"Warning: self is formant frequency.") \
-KlattGrid_ADD_FBA_VALUE (Name, namef, Formant, Frequency, frequency, formantType, L"500.0", (Hz), (value>0), L"Frequency must be greater than zero.") \
-KlattGrid_ADD_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType, L"50.0", (Hz), (value>0), L"Bandwidth must be greater than zero.") \
-KlattGrid_ADD_FBA_VALUE (Name, namef, Amplitude, Amplitude, amplitude, formantType, L"0.0", (dB), (NUMdefined(value)), L"Amplitude must be defined.") \
+KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Frequencies, frequencies, U"if row = 2 then self + 200 else self fi", formantType, U" ") \
+KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Bandwidths, bandwidths, U"self / 10 ; 10% of frequency", formantType, U"Warning: self is formant frequency.") \
+KlattGrid_ADD_FBA_VALUE (Name, namef, Formant, Frequency, frequency, formantType, U"500.0", (Hz), (value>0), U"Frequency must be greater than zero.") \
+KlattGrid_ADD_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType, U"50.0", (Hz), (value>0), U"Bandwidth must be greater than zero.") \
+KlattGrid_ADD_FBA_VALUE (Name, namef, Amplitude, Amplitude, amplitude, formantType, U"0.0", (dB), (NUMdefined(value)), U"Amplitude must be defined.") \
 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Formant, Frequency, frequency, formantType) \
 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType) \
 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Amplitude, Amplitude, amplitude, formantType) \
@@ -477,10 +477,10 @@ KlattGrid_ADD_FORMANT_AMPLITUDETIER(Name,namef,formantType)
 
 
 #define KlattGrid_FORMULA_ADD_REMOVE_FB(Name,namef,formantType) \
-KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Frequencies, frequencies, L"if row = 2 then self + 200 else self fi",formantType, L" ") \
-KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Bandwidths, bandwidths, L"self / 10 ; 10% of frequency",formantType,L"Warning: self is formant frequency.") \
-KlattGrid_ADD_FBA_VALUE (Name, namef, Formant,Frequency, frequency, formantType, L"500.0", (Hz), (value>0), L"Frequency must be greater than zero.") \
-KlattGrid_ADD_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType,  L"50.0", (Hz), (value>0), L"Bandwidth must be greater than zero.") \
+KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Frequencies, frequencies, U"if row = 2 then self + 200 else self fi",formantType, U" ") \
+KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Bandwidths, bandwidths, U"self / 10 ; 10% of frequency",formantType, U"Warning: self is formant frequency.") \
+KlattGrid_ADD_FBA_VALUE (Name, namef, Formant,Frequency, frequency, formantType, U"500.0", (Hz), (value>0), U"Frequency must be greater than zero.") \
+KlattGrid_ADD_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType,  U"50.0", (Hz), (value>0), U"Bandwidth must be greater than zero.") \
 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Formant, Frequency, frequency, formantType) \
 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType) \
 KlattGrid_ADD_FORMANT(Name,namef,formantType) \
@@ -489,10 +489,10 @@ KlattGrid_REMOVE_FORMANT_FREQUENCYANDBANDWIDTHTIERS(Name,namef,formantType) \
 KlattGrid_REMOVE_FORMANT(Name,namef,formantType)
 
 #define KlattGrid_FORMULA_ADD_REMOVE_FB_DELTA(Name,namef,formantType) \
-KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Frequencies, frequencies, L"if row = 2 then self + 200 else self fi",formantType, L" ") \
-KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Bandwidths, bandwidths, L"self / 10 ; 10% of frequency",formantType,L"Warning: self is formant frequency.") \
-KlattGrid_ADD_FBA_VALUE (Name, namef, Formant,Frequency, frequency, formantType, L"-100.0", (Hz), (value!=NUMundefined), L"Frequency must be defined.") \
-KlattGrid_ADD_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType,  L"-50.0", (Hz), (value!=NUMundefined), L"Bandwidth must be defined.") \
+KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Frequencies, frequencies, U"if row = 2 then self + 200 else self fi",formantType, U" ") \
+KlattGrid_FORMULA_FORMANT_FBA_VALUE (Name, namef, Bandwidths, bandwidths, U"self / 10 ; 10% of frequency",formantType, U"Warning: self is formant frequency.") \
+KlattGrid_ADD_FBA_VALUE (Name, namef, Formant,Frequency, frequency, formantType, U"-100.0", (Hz), (value!=NUMundefined), U"Frequency must be defined.") \
+KlattGrid_ADD_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType,  U"-50.0", (Hz), (value!=NUMundefined), U"Bandwidth must be defined.") \
 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Formant, Frequency, frequency, formantType) \
 KlattGrid_REMOVE_FBA_VALUE (Name, namef, Bandwidth, Bandwidth, bandwidth, formantType) \
 KlattGrid_ADD_FORMANT_FREQUENCYANDBANDWIDTHTIERS(Name,namef,formantType) \
@@ -518,57 +518,57 @@ KlattGrid_FORMULA_ADD_REMOVE_FBA (Frication, frication f, KlattGrid_FRICATION_FO
 DIRECT (KlattGrid_extractPointProcess_glottalClosures)
 LOOP {
 	iam (KlattGrid);
-	praat_new (KlattGrid_extractPointProcess_glottalClosures (me), my name);
+	praat_new (KlattGrid_extractPointProcess_glottalClosures (me).transfer(), my name);
 }
 END
 
-FORM (KlattGrid_formula_frequencies, L"KlattGrid: Formula (frequencies)", L"Formant: Formula (frequencies)...")
+FORM (KlattGrid_formula_frequencies, U"KlattGrid: Formula (frequencies)", U"Formant: Formula (frequencies)...")
 	KlattGrid_6formants_addCommonField (dia);
-	LABEL (L"", L"row is formant number, col is point number: for row from 1 to nrow do for col from 1 to ncol do F (row, col) :=")
-	TEXTFIELD (L"formula", L"if row = 2 then self + 200 else self fi")
+	LABEL (U"", U"row is formant number, col is point number: for row from 1 to nrow do for col from 1 to ncol do F (row, col) :=")
+	TEXTFIELD (U"formula", U"if row = 2 then self + 200 else self fi")
 	OK
 DO
-	int formantType = GET_INTEGER (L"Formant type");
+	int formantType = GET_INTEGER (U"Formant type");
 	LOOP {
 		iam (KlattGrid);
-		KlattGrid_formula_frequencies (me, formantType, GET_STRING (L"formula"), interpreter);
+		KlattGrid_formula_frequencies (me, formantType, GET_STRING (U"formula"), interpreter);
 		praat_dataChanged (me);
 	}
 END
 
-FORM (KlattGrid_formula_bandwidths, L"KlattGrid: Formula (bandwidths)", L"Formant: Formula (bandwidths)...")
+FORM (KlattGrid_formula_bandwidths, U"KlattGrid: Formula (bandwidths)", U"Formant: Formula (bandwidths)...")
 	KlattGrid_6formants_addCommonField (dia);
-	LABEL (L"", L"row is formant number, col is point number: for row from 1 to nrow do for col from 1 to ncol do F (row, col) :=")
-	TEXTFIELD (L"formula", L"if row = 2 then self + 200 else self fi")
+	LABEL (U"", U"row is formant number, col is point number: for row from 1 to nrow do for col from 1 to ncol do F (row, col) :=")
+	TEXTFIELD (U"formula", U"if row = 2 then self + 200 else self fi")
 	OK
 DO
-	int formantType = GET_INTEGER (L"Formant type");
+	int formantType = GET_INTEGER (U"Formant type");
 	LOOP {
 		iam (KlattGrid);
-		KlattGrid_formula_bandwidths (me, formantType, GET_STRING (L"formula"), interpreter);
+		KlattGrid_formula_bandwidths (me, formantType, GET_STRING (U"formula"), interpreter);
 		praat_dataChanged (me);
 	}
 END
 
 #define KlattGrid_FORMANT_GET_FB_VALUE(Name,name,ForB,forb,FormB,formantType) \
-FORM (KlattGrid_get##Name##Formant##ForB##AtTime, L"KlattGrid: Get " #name " " #forb " at time", 0) \
-	NATURAL (L"Formant number", L"1") \
-	REAL (L"Time (s)", L"0.5") \
+FORM (KlattGrid_get##Name##Formant##ForB##AtTime, U"KlattGrid: Get " #name " " #forb " at time", 0) \
+	NATURAL (U"Formant number", U"1") \
+	REAL (U"Time (s)", U"0.5") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		Melder_informationReal (KlattGrid_get##FormB##AtTime (me, formantType, GET_INTEGER (L"Formant number"), GET_REAL (L"Time")), L" (Hz)"); \
+		Melder_informationReal (KlattGrid_get##FormB##AtTime (me, formantType, GET_INTEGER (U"Formant number"), GET_REAL (U"Time")), U" (Hz)"); \
 	} \
 END
 
 #define KlattGrid_FORMANT_GET_A_VALUE(Name,name,formantType) \
-FORM (KlattGrid_get##Name##FormantAmplitudeAtTime, L"KlattGrid: Get " #name " formant amplitude at time", 0) \
-	NATURAL (L"Formant number", L"1") \
-	REAL (L"Time (s)", L"0.5") \
+FORM (KlattGrid_get##Name##FormantAmplitudeAtTime, U"KlattGrid: Get " #name " formant amplitude at time", 0) \
+	NATURAL (U"Formant number", U"1") \
+	REAL (U"Time (s)", U"0.5") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-	Melder_informationReal (KlattGrid_getAmplitudeAtTime (me, formantType, GET_INTEGER (L"Formant number"), GET_REAL (L"Time")), L" (dB)"); \
+	Melder_informationReal (KlattGrid_getAmplitudeAtTime (me, formantType, GET_INTEGER (U"Formant number"), GET_REAL (U"Time")), U" (dB)"); \
 	} \
 END
 
@@ -594,21 +594,20 @@ KlattGrid_FORMANT_GET_A_VALUE (Frication, frication, KlattGrid_FRICATION_FORMANT
 #define KlattGrid_EXTRACT_FORMANT_GRID(Name,gridType) \
 DIRECT (KlattGrid_extract##Name##FormantGrid) \
 	LOOP { iam (KlattGrid); \
-		praat_new (KlattGrid_extractFormantGrid (me, gridType), formant_names[gridType]); \
+		praat_new (KlattGrid_extractFormantGrid (me, gridType).transfer(), formant_names[gridType]); \
 	} \
 END
 
 #define KlattGrid_EXTRACT_FORMANT_AMPLITUDE(Name,name,formantType) \
-FORM (KlattGrid_extract##Name##FormantAmplitudeTier, L"KlattGrid: Extract " #name " formant amplitude tier", 0) \
-	NATURAL (L"Formant number", L"1") \
+FORM (KlattGrid_extract##Name##FormantAmplitudeTier, U"KlattGrid: Extract " #name " formant amplitude tier", 0) \
+	NATURAL (U"Formant number", U"1") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		praat_new (KlattGrid_extractAmplitudeTier (me, formantType, GET_INTEGER (L"Formant number")), formant_names[formantType]); \
+		praat_new (KlattGrid_extractAmplitudeTier (me, formantType, GET_INTEGER (U"Formant number")).transfer(), formant_names[formantType]); \
 	} \
 END
 
-
 KlattGrid_EXTRACT_FORMANT_GRID (Oral, KlattGrid_ORAL_FORMANTS)
 KlattGrid_EXTRACT_FORMANT_AMPLITUDE (Oral, oral, KlattGrid_ORAL_FORMANTS)
 KlattGrid_EXTRACT_FORMANT_GRID (Nasal, KlattGrid_NASAL_FORMANTS)
@@ -632,13 +631,13 @@ DIRECT (KlattGrid_replace##Name##FormantGrid) \
 END
 
 #define KlattGrid_REPLACE_FORMANT_AMPLITUDE(Name,name,formantType) \
-FORM (KlattGrid_replace##Name##FormantAmplitudeTier, L"KlattGrid: Replace " #name " formant amplitude tier", 0) \
-	NATURAL (L"Formant number", L"1") \
+FORM (KlattGrid_replace##Name##FormantAmplitudeTier, U"KlattGrid: Replace " #name " formant amplitude tier", 0) \
+	NATURAL (U"Formant number", U"1") \
 	OK \
 DO \
 	KlattGrid me = FIRST (KlattGrid); \
 	IntensityTier thee = FIRST (IntensityTier); \
-	KlattGrid_replaceAmplitudeTier (me, formantType, GET_INTEGER (L"Formant number"), thee); \
+	KlattGrid_replaceAmplitudeTier (me, formantType, GET_INTEGER (U"Formant number"), thee); \
 	praat_dataChanged (me); \
 END
 
@@ -658,187 +657,187 @@ KlattGrid_REPLACE_FORMANT_AMPLITUDE (Frication, frication, KlattGrid_FRICATION_F
 #undef KlattGrid_REPLACE_FORMANTGRID
 
 #define KlattGrid_FORMANT_GET_ADD_REMOVE(Name,name,unit,default,require,requiremessage) \
-FORM (KlattGrid_get##Name##AtTime, L"KlattGrid: Get " #name " at time", 0) \
+FORM (KlattGrid_get##Name##AtTime, U"KlattGrid: Get " #name " at time", 0) \
 	KlattGrid_6formants_addCommonField (dia); \
-	NATURAL (L"Formant number", L"1") \
-	REAL (L"Time (s)", L"0.5") \
+	NATURAL (U"Formant number", U"1") \
+	REAL (U"Time (s)", U"0.5") \
 	OK \
 DO \
-	int formantType = GET_INTEGER (L"Formant type"); \
+	int formantType = GET_INTEGER (U"Formant type"); \
 	LOOP { iam (KlattGrid); \
-		Melder_informationReal (KlattGrid_get##Name##AtTime (me, formantType, GET_INTEGER (L"Formant number"), GET_REAL (L"Time")), L" (Hz)"); \
+		Melder_informationReal (KlattGrid_get##Name##AtTime (me, formantType, GET_INTEGER (U"Formant number"), GET_REAL (U"Time")), U" (Hz)"); \
 	} \
 END \
-FORM (KlattGrid_getDelta##Name##AtTime, L"KlattGrid: Get delta " #name " at time", 0) \
-	NATURAL (L"Formant number", L"1") \
-	REAL (L"Time (s)", L"0.5") \
+FORM (KlattGrid_getDelta##Name##AtTime, U"KlattGrid: Get delta " #name " at time", 0) \
+	NATURAL (U"Formant number", U"1") \
+	REAL (U"Time (s)", U"0.5") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		Melder_informationReal (KlattGrid_getDelta##Name##AtTime (me, GET_INTEGER (L"Formant number"), GET_REAL (L"Time")), L" (Hz)"); \
+		Melder_informationReal (KlattGrid_getDelta##Name##AtTime (me, GET_INTEGER (U"Formant number"), GET_REAL (U"Time")), U" (Hz)"); \
 	} \
 END \
-FORM (KlattGrid_add##Name##Point, L"KlattGrid: Add " #name " point", 0) \
+FORM (KlattGrid_add##Name##Point, U"KlattGrid: Add " #name " point", 0) \
 	KlattGrid_6formants_addCommonField (dia); \
-	NATURAL (L"Formant number", L"1") \
-	REAL (L"Time (s)", L"0.5") \
-	REAL (L"Value" unit, default) \
+	NATURAL (U"Formant number", U"1") \
+	REAL (U"Time (s)", U"0.5") \
+	REAL (U"Value" unit, default) \
 	OK \
 DO \
-	int formantType = GET_INTEGER (L"Formant type"); \
-	double value = GET_REAL (L"Value"); \
+	int formantType = GET_INTEGER (U"Formant type"); \
+	double value = GET_REAL (U"Value"); \
 	REQUIRE (require, requiremessage) \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_add##Name##Point (me, formantType, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"), value); \
+		KlattGrid_add##Name##Point (me, formantType, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"), value); \
 		praat_dataChanged (me); \
 	} \
 END \
-FORM (KlattGrid_addDelta##Name##Point, L"KlattGrid: Add delta " #name " point", 0) \
-	NATURAL (L"Formant number", L"1") \
-	REAL (L"Time (s)", L"0.5") \
-	REAL (L"Value" unit, default) \
+FORM (KlattGrid_addDelta##Name##Point, U"KlattGrid: Add delta " #name " point", 0) \
+	NATURAL (U"Formant number", U"1") \
+	REAL (U"Time (s)", U"0.5") \
+	REAL (U"Value" unit, default) \
 	OK \
 DO \
-	double value = GET_REAL (L"Value"); \
+	double value = GET_REAL (U"Value"); \
 	REQUIRE (require, requiremessage) \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_addDelta##Name##Point (me, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"), value); \
+		KlattGrid_addDelta##Name##Point (me, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"), value); \
 		praat_dataChanged (me); \
 	} \
 END \
-FORM (KlattGrid_remove##Name##Points, L"Remove " #name " points", 0) \
+FORM (KlattGrid_remove##Name##Points, U"Remove " #name " points", 0) \
 	KlattGrid_6formants_addCommonField (dia); \
-	NATURAL (L"Formant number", L"1") \
-	REAL (L"From time (s)", L"0.3")\
-	REAL (L"To time (s)", L"0.7") \
+	NATURAL (U"Formant number", U"1") \
+	REAL (U"From time (s)", U"0.3")\
+	REAL (U"To time (s)", U"0.7") \
 	OK \
 DO \
-	int formantType = GET_INTEGER (L"Formant type"); \
+	int formantType = GET_INTEGER (U"Formant type"); \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_remove##Name##Points (me, formantType, GET_INTEGER (L"Formant number"), GET_REAL (L"From time"), GET_REAL (L"To time")); \
+		KlattGrid_remove##Name##Points (me, formantType, GET_INTEGER (U"Formant number"), GET_REAL (U"From time"), GET_REAL (U"To time")); \
 		praat_dataChanged (me);\
 	} \
 END \
-FORM (KlattGrid_removeDelta##Name##Points, L"Remove delta " #name " points", 0) \
-	NATURAL (L"Formant number", L"1") \
-	REAL (L"From time (s)", L"0.3")\
-	REAL (L"To time (s)", L"0.7") \
+FORM (KlattGrid_removeDelta##Name##Points, U"Remove delta " #name " points", 0) \
+	NATURAL (U"Formant number", U"1") \
+	REAL (U"From time (s)", U"0.3")\
+	REAL (U"To time (s)", U"0.7") \
 	OK \
 DO \
 	LOOP { iam (KlattGrid); \
-		KlattGrid_removeDelta##Name##Points (me, GET_INTEGER (L"Formant number"), GET_REAL (L"From time"), GET_REAL (L"To time")); \
+		KlattGrid_removeDelta##Name##Points (me, GET_INTEGER (U"Formant number"), GET_REAL (U"From time"), GET_REAL (U"To time")); \
 		praat_dataChanged (me);\
 	} \
 END
 
-KlattGrid_FORMANT_GET_ADD_REMOVE (Formant, formant, L" (Hz)", L"500.0", (value > 0), L"Frequency must be greater than zero.")
-KlattGrid_FORMANT_GET_ADD_REMOVE (Bandwidth, bandwidth, L" (Hz)", L"50.0", (value > 0), L"Bandwidth must be greater than zero.")
+KlattGrid_FORMANT_GET_ADD_REMOVE (Formant, formant, U" (Hz)", U"500.0", (value > 0), U"Frequency must be greater than zero.")
+KlattGrid_FORMANT_GET_ADD_REMOVE (Bandwidth, bandwidth, U" (Hz)", U"50.0", (value > 0), U"Bandwidth must be greater than zero.")
 
 #undef KlattGrid_FORMANT_GET_ADD_REMOVE
 
-FORM (KlattGrid_addFormantAndBandwidthTier, L"", 0)
+FORM (KlattGrid_addFormantAndBandwidthTier, U"", 0)
 	KlattGrid_7formants_addCommonField (dia);
-	INTEGER (L"Position", L"0 (=at end)")
+	INTEGER (U"Position", U"0 (=at end)")
 	OK
 DO
-	long gridType = GET_INTEGER (L"Formant type");
+	long gridType = GET_INTEGER (U"Formant type");
 	LOOP {
 		iam (KlattGrid);
-		KlattGrid_addFormantFrequencyAndBandwidthTiers (me, gridType, GET_INTEGER (L"Position"));
+		KlattGrid_addFormantFrequencyAndBandwidthTiers (me, gridType, GET_INTEGER (U"Position"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (KlattGrid_extractFormantGrid, L"KlattGrid: Extract formant grid", 0)
+FORM (KlattGrid_extractFormantGrid, U"KlattGrid: Extract formant grid", 0)
 	KlattGrid_6formants_addCommonField (dia);
 	OK
 DO
-	long gridType = GET_INTEGER (L"Formant type");
+	long gridType = GET_INTEGER (U"Formant type");
 	LOOP {
 		iam (KlattGrid);
-		praat_new (KlattGrid_extractFormantGrid (me, gridType), formant_names[gridType]);
+		praat_new (KlattGrid_extractFormantGrid (me, gridType).transfer(), formant_names[gridType]);
 	}
 END
 
-FORM (KlattGrid_replaceFormantGrid, L"KlattGrid: Replace formant grid", 0)
+FORM (KlattGrid_replaceFormantGrid, U"KlattGrid: Replace formant grid", 0)
 	KlattGrid_6formants_addCommonField (dia);
 	OK
 DO
 	KlattGrid me = FIRST (KlattGrid);
 	FormantGrid thee = FIRST (FormantGrid);
-	KlattGrid_replaceFormantGrid (me, GET_INTEGER (L"Formant type"), thee);
+	KlattGrid_replaceFormantGrid (me, GET_INTEGER (U"Formant type"), thee);
 	praat_dataChanged (OBJECT);
 END
 
-FORM (KlattGrid_getAmplitudeAtTime, L"KlattGrid: Get amplitude at time", 0) \
+FORM (KlattGrid_getAmplitudeAtTime, U"KlattGrid: Get amplitude at time", 0) \
 	KlattGrid_4formants_addCommonField (dia);
-	NATURAL (L"Formant number", L"1")
-	REAL (L"Time (s)", L"0.5")
+	NATURAL (U"Formant number", U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK
 DO
-	int formantType = GET_INTEGER (L"Formant type");
+	int formantType = GET_INTEGER (U"Formant type");
 	LOOP {
 		iam (KlattGrid);
-		Melder_informationReal (KlattGrid_getAmplitudeAtTime (me, formantType, GET_INTEGER (L"Formant number"), GET_REAL (L"Time")), L" (dB)");
+		Melder_informationReal (KlattGrid_getAmplitudeAtTime (me, formantType, GET_INTEGER (U"Formant number"), GET_REAL (U"Time")), U" (dB)");
 	}
 END
 
-FORM (KlattGrid_addAmplitudePoint, L"KlattGrid: Add amplitude point", 0)
+FORM (KlattGrid_addAmplitudePoint, U"KlattGrid: Add amplitude point", 0)
 	KlattGrid_4formants_addCommonField (dia);
-	NATURAL (L"Formant number", L"1")
-	REAL (L"Time (s)", L"0.5")
-	REAL (L"Value (Hz)", L"80.0")
+	NATURAL (U"Formant number", U"1")
+	REAL (U"Time (s)", U"0.5")
+	REAL (U"Value (Hz)", U"80.0")
 	OK
 DO
-	int formantType = GET_INTEGER (L"Formant type");
-	double value = GET_REAL (L"Value");
+	int formantType = GET_INTEGER (U"Formant type");
+	double value = GET_REAL (U"Value");
 	LOOP {
 		iam (KlattGrid);
-		KlattGrid_addAmplitudePoint (me, formantType, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"), value);
+		KlattGrid_addAmplitudePoint (me, formantType, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"), value);
 		praat_dataChanged (me);
 	}
 END
 
-FORM (KlattGrid_removeAmplitudePoints, L"Remove amplitude points", 0) \
+FORM (KlattGrid_removeAmplitudePoints, U"Remove amplitude points", 0) \
 	KlattGrid_4formants_addCommonField (dia);
-	NATURAL (L"Formant number", L"1")
-	REAL (L"From time (s)", L"0.3")
-	REAL (L"To time (s)", L"0.7")
+	NATURAL (U"Formant number", U"1")
+	REAL (U"From time (s)", U"0.3")
+	REAL (U"To time (s)", U"0.7")
 	OK
 DO
-	int formantType = GET_INTEGER (L"Formant type");
+	int formantType = GET_INTEGER (U"Formant type");
 	LOOP {
 		iam (KlattGrid);
-		KlattGrid_removeAmplitudePoints (me, formantType, GET_INTEGER (L"Formant number"), GET_REAL (L"From time"), GET_REAL (L"To time"));
+		KlattGrid_removeAmplitudePoints (me, formantType, GET_INTEGER (U"Formant number"), GET_REAL (U"From time"), GET_REAL (U"To time"));
 		praat_dataChanged (me);
 	}
 END
 
-FORM (KlattGrid_extractAmplitudeTier, L"", 0)
+FORM (KlattGrid_extractAmplitudeTier, U"", 0)
 	KlattGrid_4formants_addCommonField (dia);
-	NATURAL (L"Formant number", L"1")
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
-	int formantType = GET_INTEGER (L"Formant type");
+	int formantType = GET_INTEGER (U"Formant type");
 	LOOP {
 		iam (KlattGrid);
-		praat_new (KlattGrid_extractAmplitudeTier (me, formantType, GET_INTEGER (L"Formant number")), formant_names[formantType]);
+		praat_new (KlattGrid_extractAmplitudeTier (me, formantType, GET_INTEGER (U"Formant number")).transfer(), formant_names[formantType]);
 	}
 END
 
-FORM (KlattGrid_replaceAmplitudeTier, L"KlattGrid: Replace amplitude tier", 0)
+FORM (KlattGrid_replaceAmplitudeTier, U"KlattGrid: Replace amplitude tier", 0)
 	KlattGrid_4formants_addCommonField (dia);
-	NATURAL (L"Formant number", L"1")
+	NATURAL (U"Formant number", U"1")
 	OK
 DO
-	int formantType = GET_INTEGER (L"Formant type");
+	int formantType = GET_INTEGER (U"Formant type");
 	KlattGrid me = FIRST (KlattGrid);
 	IntensityTier thee = FIRST (IntensityTier);
-	KlattGrid_replaceAmplitudeTier (me, formantType, GET_INTEGER (L"Formant number"), thee);
+	KlattGrid_replaceAmplitudeTier (me, formantType, GET_INTEGER (U"Formant number"), thee);
 	praat_dataChanged (me);
 END
 
-FORM (KlattGrid_to_Sound_special, L"KlattGrid: To Sound (special)", L"KlattGrid: To Sound (special)...")
+FORM (KlattGrid_to_Sound_special, U"KlattGrid: To Sound (special)", U"KlattGrid: To Sound (special)...")
 	KlattGrid_PlayOptions_addCommonFields (dia, 1);
 	OK
 DO
@@ -846,7 +845,7 @@ DO
 		iam (KlattGrid);
 		KlattGrid_setDefaultPlayOptions (me);
 		KlattGrid_PlayOptions_getCommonFields (dia, 1, me);
-		praat_new (KlattGrid_to_Sound (me), my name);
+		praat_new (KlattGrid_to_Sound (me).transfer(), my name);
 	}
 END
 
@@ -854,11 +853,11 @@ DIRECT (KlattGrid_to_Sound)
 	LOOP {
 		iam (KlattGrid);
 		KlattGrid_setDefaultPlayOptions (me);
-		praat_new (KlattGrid_to_Sound (me), my name);
+		praat_new (KlattGrid_to_Sound (me).transfer(), my name);
 	}
 END
 
-FORM (KlattGrid_playSpecial, L"KlattGrid: Play special", L"KlattGrid: Play special...")
+FORM (KlattGrid_playSpecial, U"KlattGrid: Play special", U"KlattGrid: Play special...")
 	KlattGrid_PlayOptions_addCommonFields (dia, 0);
 	OK
 DO
@@ -870,20 +869,20 @@ DO
 	}
 END
 
-FORM (KlattGrid_to_Sound_phonation, L"KlattGrid: To Sound (phonation)", L"KlattGrid: To Sound (phonation)...")
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
+FORM (KlattGrid_to_Sound_phonation, U"KlattGrid: To Sound (phonation)", U"KlattGrid: To Sound (phonation)...")
+	POSITIVE (U"Sampling frequency (Hz)", U"44100")
 	KlattGrid_PhonationGridPlayOptions_addCommonFields (dia);
 	OK
 DO
 	LOOP {
 		iam (KlattGrid);
 		KlattGrid_PhonationGridPlayOptions_getCommonFields (dia, me);
-		my options -> samplingFrequency = GET_REAL (L"Sampling frequency");
-		praat_new (KlattGrid_to_Sound_phonation (me), my name, L"_phonation");
+		my options -> samplingFrequency = GET_REAL (U"Sampling frequency");
+		praat_new (KlattGrid_to_Sound_phonation (me).transfer(), my name, U"_phonation");
 	}
 END
 
-DIRECT (KlattGrid_help) Melder_help (L"KlattGrid"); END
+DIRECT (KlattGrid_help) Melder_help (U"KlattGrid"); END
 
 DIRECT (KlattGrid_play)
 	LOOP {
@@ -892,30 +891,30 @@ DIRECT (KlattGrid_play)
 	}
 END
 
-FORM (KlattGrid_draw, L"KlattGrid: Draw", 0)
-	RADIO (L"Synthesis model", 1)
-	RADIOBUTTON (L"Cascade")
-	RADIOBUTTON (L"Parallel")
+FORM (KlattGrid_draw, U"KlattGrid: Draw", 0)
+	RADIO (U"Synthesis model", 1)
+	RADIOBUTTON (U"Cascade")
+	RADIOBUTTON (U"Parallel")
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (KlattGrid);
-		KlattGrid_draw (me, GRAPHICS, GET_INTEGER (L"Synthesis model") - 1);
+		KlattGrid_draw (me, GRAPHICS, GET_INTEGER (U"Synthesis model") - 1);
 	}
 END
 
-FORM (KlattGrid_drawVocalTract, L"KlattGrid: Draw vocal tract", 0)
-	RADIO (L"Synthesis model", 1)
-	RADIOBUTTON (L"Cascade")
-	RADIOBUTTON (L"Parallel")
-	BOOLEAN (L"Include tracheal formants", 1);
+FORM (KlattGrid_drawVocalTract, U"KlattGrid: Draw vocal tract", 0)
+	RADIO (U"Synthesis model", 1)
+	RADIOBUTTON (U"Cascade")
+	RADIOBUTTON (U"Parallel")
+	BOOLEAN (U"Include tracheal formants", 1);
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (KlattGrid);
-		KlattGrid_drawVocalTract (me, GRAPHICS, GET_INTEGER (L"Synthesis model") - 1, GET_INTEGER (L"Include tracheal formants"));
+		KlattGrid_drawVocalTract (me, GRAPHICS, GET_INTEGER (U"Synthesis model") - 1, GET_INTEGER (U"Include tracheal formants"));
 	}
 END
 
@@ -923,7 +922,7 @@ DIRECT (KlattGrid_drawPhonation)
 	autoPraatPicture picture;
 	LOOP {
 		iam (KlattGrid);
-		PhonationGrid_draw (my phonation, GRAPHICS);
+		PhonationGrid_draw (my phonation.get(), GRAPHICS);
 	}
 END
 
@@ -931,44 +930,44 @@ DIRECT (KlattGrid_drawFrication)
 	autoPraatPicture picture;
 	LOOP {
 		iam (KlattGrid);
-		FricationGrid_draw (my frication, GRAPHICS);
+		FricationGrid_draw (my frication.get(), GRAPHICS);
 	}
 END
 
-FORM (KlattGrid_to_oralFormantGrid_openPhases, L"KlattGrid: Extract oral formant grid (open phases)", L"KlattGrid: Extract oral formant grid (open phases)...")
-	REAL (L"Fade fraction (0..0.5)", L"0.1")
+FORM (KlattGrid_to_oralFormantGrid_openPhases, U"KlattGrid: Extract oral formant grid (open phases)", U"KlattGrid: Extract oral formant grid (open phases)...")
+	REAL (U"Fade fraction (0..0.5)", U"0.1")
 	OK
 DO
-	double fadeFraction = GET_REAL (L"Fade fraction");
-	REQUIRE (fadeFraction < 0.5, L"Fade fraction has to be smaller than 0.5.")
+	double fadeFraction = GET_REAL (U"Fade fraction");
+	REQUIRE (fadeFraction < 0.5, U"Fade fraction has to be smaller than 0.5.")
 	LOOP {
 		iam (KlattGrid);
-		praat_new (KlattGrid_to_oralFormantGrid_openPhases (me, fadeFraction), L"corrected");
+		praat_new (KlattGrid_to_oralFormantGrid_openPhases (me, fadeFraction).transfer(), U"corrected");
 	}
 END
 
-FORM (Sound_KlattGrid_filterByVocalTract, L"Sound & KlattGrid: Filter by vocal tract", L"Sound & KlattGrid: Filter by vocal tract...")
-	RADIO (L"Vocal tract filter model", 1)
-	RADIOBUTTON (L"Cascade")
-	RADIOBUTTON (L"Parallel")
+FORM (Sound_KlattGrid_filterByVocalTract, U"Sound & KlattGrid: Filter by vocal tract", U"Sound & KlattGrid: Filter by vocal tract...")
+	RADIO (U"Vocal tract filter model", 1)
+	RADIOBUTTON (U"Cascade")
+	RADIOBUTTON (U"Parallel")
 	OK
 DO
 	Sound me = FIRST (Sound);
 	KlattGrid thee = FIRST (KlattGrid);
-	int filterModel = GET_INTEGER (L"Vocal tract filter model") - 1;
-	praat_new (Sound_KlattGrid_filterByVocalTract (me, thee, filterModel), my name, L"_", thy name);
+	int filterModel = GET_INTEGER (U"Vocal tract filter model") - 1;
+	praat_new (Sound_KlattGrid_filterByVocalTract (me, thee, filterModel).transfer(), my name, U"_", thy name);
 END
 
 void praat_KlattGrid_init ();
 void praat_KlattGrid_init () {
 
-	Thing_recognizeClassesByName (classKlattGrid, NULL);
+	Thing_recognizeClassesByName (classKlattGrid, nullptr);
 
-	praat_addMenuCommand (L"Objects", L"New", L"Acoustic synthesis (Klatt)", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"KlattGrid help", 0, 1, DO_KlattGrid_help);
-	praat_addMenuCommand (L"Objects", L"New", L"-- the synthesizer grid --", 0, 1, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Create KlattGrid...", 0, 1, DO_KlattGrid_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create KlattGrid example", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_createExample);
+	praat_addMenuCommand (U"Objects", U"New", U"Acoustic synthesis (Klatt)", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"KlattGrid help", 0, 1, DO_KlattGrid_help);
+	praat_addMenuCommand (U"Objects", U"New", U"-- the synthesizer grid --", 0, 1, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Create KlattGrid...", 0, 1, DO_KlattGrid_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create KlattGrid example", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_createExample);
 
 	/*
 	Edit oral/nasal/tracheal/frication/delta formant grid
@@ -1006,76 +1005,76 @@ void praat_KlattGrid_init () {
 	#define KlattGrid_TRACHEAL_ANTIFORMANTS 6
 	#define KlattGrid_DELTA_FORMANTS 7
 	*/
-	praat_addAction1 (classKlattGrid, 0, L"KlattGrid help", 0, 0, DO_KlattGrid_help);
-	praat_addAction1 (classKlattGrid, 0, L"Edit phonation -", 0, 0, 0);
-	praat_addAction1 (classKlattGrid, 0, L"Edit pitch tier", 0, 1, DO_KlattGrid_editPitchTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit voicing amplitude tier", 0, 1, DO_KlattGrid_editVoicingAmplitudeTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit flutter tier", 0, 1, DO_KlattGrid_editFlutterTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit power1 tier", 0, 1, DO_KlattGrid_editPower1Tier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit power2 tier", 0, 1, DO_KlattGrid_editPower2Tier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit open phase tier", 0, 1, DO_KlattGrid_editOpenPhaseTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit collision phase tier", 0, 1, DO_KlattGrid_editCollisionPhaseTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit double pulsing tier", 0, 1, DO_KlattGrid_editDoublePulsingTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit spectral tilt tier", 0, 1, DO_KlattGrid_editSpectralTiltTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit aspiration amplitude tier", 0, 1, DO_KlattGrid_editAspirationAmplitudeTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit breathiness amplitude tier", 0, 1, DO_KlattGrid_editBreathinessAmplitudeTier);
-
-	praat_addAction1 (classKlattGrid, 0, L"Edit filters -", 0, 0, 0);
-	praat_addAction1 (classKlattGrid, 0, L"Edit oral formant grid", 0, 1, DO_KlattGrid_editOralFormantGrid);
-	praat_addAction1 (classKlattGrid, 0, L"Edit nasal formant grid", 0, 1, DO_KlattGrid_editNasalFormantGrid);
-	praat_addAction1 (classKlattGrid, 0, L"Edit nasal antiformant grid", 0, 1, DO_KlattGrid_editNasalAntiFormantGrid);
-	praat_addAction1 (classKlattGrid, 0, L"Edit oral formant amplitude tier...", 0, 1, DO_KlattGrid_editOralFormantAmplitudeTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit nasal formant amplitude tier...", 0, 1, DO_KlattGrid_editNasalFormantAmplitudeTier);
-	praat_addAction1 (classKlattGrid, 0, L"-- edit delta formant grid --", 0, 1, 0);
-	praat_addAction1 (classKlattGrid, 0, L"Edit delta formant grid", 0, 1, DO_KlattGrid_editDeltaFormantGrid);
-	praat_addAction1 (classKlattGrid, 0, L"Edit tracheal formant grid", 0, 1, DO_KlattGrid_editTrachealFormantGrid);
-	praat_addAction1 (classKlattGrid, 0, L"Edit tracheal antiformant grid", 0, 1, DO_KlattGrid_editTrachealAntiFormantGrid);
-	praat_addAction1 (classKlattGrid, 0, L"Edit tracheal formant amplitude tier...", 0, 1, DO_KlattGrid_editTrachealFormantAmplitudeTier);
-	praat_addAction1 (classKlattGrid, 0, L"-- edit frication tiers --", 0, 1, 0);
-	praat_addAction1 (classKlattGrid, 1, L"Edit frication amplitude tier", 0, 1, DO_KlattGrid_editFricationAmplitudeTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit frication formant grid", 0, 1, DO_KlattGrid_editFricationFormantGrid);
-	praat_addAction1 (classKlattGrid, 0, L"Edit frication formant amplitude tier...", 0, 1, DO_KlattGrid_editFricationFormantAmplitudeTier);
-	praat_addAction1 (classKlattGrid, 0, L"Edit frication bypass tier", 0, 1, DO_KlattGrid_editFricationBypassTier);
-	praat_addAction1 (classKlattGrid, 1, L"Edit frication amplitude tier", 0, 1, DO_KlattGrid_editFricationAmplitudeTier);
-
-	praat_addAction1 (classKlattGrid, 0, L"Play", 0, 0, DO_KlattGrid_play);
-	praat_addAction1 (classKlattGrid, 0, L"Play special...", 0, 0, DO_KlattGrid_playSpecial);
-	praat_addAction1 (classKlattGrid, 0, L"To Sound", 0, 0, DO_KlattGrid_to_Sound);
-	praat_addAction1 (classKlattGrid, 0, L"To Sound (special)...", 0, 0, DO_KlattGrid_to_Sound_special);
-	praat_addAction1 (classKlattGrid, 0, L"To Sound (phonation)...", 0, 0, DO_KlattGrid_to_Sound_phonation);
-
-	praat_addAction1 (classKlattGrid, 0, L"Draw -", 0, 0, 0);
-	praat_addAction1 (classKlattGrid, 0, L"Draw synthesizer...", 0, 1, DO_KlattGrid_draw);
-	praat_addAction1 (classKlattGrid, 0, L"Draw vocal tract...", 0, 1, DO_KlattGrid_drawVocalTract);
-	praat_addAction1 (classKlattGrid, 0, L"Draw phonation", 0, 1, DO_KlattGrid_drawPhonation);
-	praat_addAction1 (classKlattGrid, 0, L"Draw frication", 0, 1, DO_KlattGrid_drawFrication);
-
-	praat_addAction1 (classKlattGrid, 0, L"Query phonation -", 0, 0, 0);
-	praat_addAction1 (classKlattGrid, 1, L"Get pitch at time...", 0, 1, DO_KlattGrid_getPitchAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get voicing amplitude at time...", 0, 1, DO_KlattGrid_getVoicingAmplitudeAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get flutter at time...", 0, 1, DO_KlattGrid_getFlutterAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get power1 at time...", 0, 1, DO_KlattGrid_getPower1AtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get power2 at time...", 0, 1, DO_KlattGrid_getPower2AtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get open phase at time...", 0, 1, DO_KlattGrid_getOpenPhaseAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get collision phase at time...", 0, 1, DO_KlattGrid_getCollisionPhaseAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get double pulsing at time...", 0, 1, DO_KlattGrid_getDoublePulsingAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get spectral tilt at time...", 0, 1, DO_KlattGrid_getSpectralTiltAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get aspiration amplitude at time...", 0, 1, DO_KlattGrid_getAspirationAmplitudeAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get breathiness amplitude at time...", 0, 1, DO_KlattGrid_getBreathinessAmplitudeAtTime);
-
-	praat_addAction1 (classKlattGrid, 0, L"Query filters -", 0, 0, 0);
-	praat_addAction1 (classKlattGrid, 1, L"Get formant at time...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_getFormantAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get bandwidth at time...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_getBandwidthAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get amplitude at time...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_getAmplitudeAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get delta formant at time...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_getDeltaFormantAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get delta bandwidth at time...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_getDeltaBandwidthAtTime);
+	praat_addAction1 (classKlattGrid, 0, U"KlattGrid help", 0, 0, DO_KlattGrid_help);
+	praat_addAction1 (classKlattGrid, 0, U"Edit phonation -", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Edit pitch tier", 0, 1, DO_KlattGrid_editPitchTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit voicing amplitude tier", 0, 1, DO_KlattGrid_editVoicingAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit flutter tier", 0, 1, DO_KlattGrid_editFlutterTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit power1 tier", 0, 1, DO_KlattGrid_editPower1Tier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit power2 tier", 0, 1, DO_KlattGrid_editPower2Tier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit open phase tier", 0, 1, DO_KlattGrid_editOpenPhaseTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit collision phase tier", 0, 1, DO_KlattGrid_editCollisionPhaseTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit double pulsing tier", 0, 1, DO_KlattGrid_editDoublePulsingTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit spectral tilt tier", 0, 1, DO_KlattGrid_editSpectralTiltTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit aspiration amplitude tier", 0, 1, DO_KlattGrid_editAspirationAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit breathiness amplitude tier", 0, 1, DO_KlattGrid_editBreathinessAmplitudeTier);
+
+	praat_addAction1 (classKlattGrid, 0, U"Edit filters -", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Edit oral formant grid", 0, 1, DO_KlattGrid_editOralFormantGrid);
+	praat_addAction1 (classKlattGrid, 0, U"Edit nasal formant grid", 0, 1, DO_KlattGrid_editNasalFormantGrid);
+	praat_addAction1 (classKlattGrid, 0, U"Edit nasal antiformant grid", 0, 1, DO_KlattGrid_editNasalAntiFormantGrid);
+	praat_addAction1 (classKlattGrid, 0, U"Edit oral formant amplitude tier...", 0, 1, DO_KlattGrid_editOralFormantAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit nasal formant amplitude tier...", 0, 1, DO_KlattGrid_editNasalFormantAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"-- edit delta formant grid --", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Edit delta formant grid", 0, 1, DO_KlattGrid_editDeltaFormantGrid);
+	praat_addAction1 (classKlattGrid, 0, U"Edit tracheal formant grid", 0, 1, DO_KlattGrid_editTrachealFormantGrid);
+	praat_addAction1 (classKlattGrid, 0, U"Edit tracheal antiformant grid", 0, 1, DO_KlattGrid_editTrachealAntiFormantGrid);
+	praat_addAction1 (classKlattGrid, 0, U"Edit tracheal formant amplitude tier...", 0, 1, DO_KlattGrid_editTrachealFormantAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"-- edit frication tiers --", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 1, U"Edit frication amplitude tier", 0, 1, DO_KlattGrid_editFricationAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit frication formant grid", 0, 1, DO_KlattGrid_editFricationFormantGrid);
+	praat_addAction1 (classKlattGrid, 0, U"Edit frication formant amplitude tier...", 0, 1, DO_KlattGrid_editFricationFormantAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"Edit frication bypass tier", 0, 1, DO_KlattGrid_editFricationBypassTier);
+	praat_addAction1 (classKlattGrid, 1, U"Edit frication amplitude tier", 0, 1, DO_KlattGrid_editFricationAmplitudeTier);
+
+	praat_addAction1 (classKlattGrid, 0, U"Play", 0, 0, DO_KlattGrid_play);
+	praat_addAction1 (classKlattGrid, 0, U"Play special...", 0, 0, DO_KlattGrid_playSpecial);
+	praat_addAction1 (classKlattGrid, 0, U"To Sound", 0, 0, DO_KlattGrid_to_Sound);
+	praat_addAction1 (classKlattGrid, 0, U"To Sound (special)...", 0, 0, DO_KlattGrid_to_Sound_special);
+	praat_addAction1 (classKlattGrid, 0, U"To Sound (phonation)...", 0, 0, DO_KlattGrid_to_Sound_phonation);
+
+	praat_addAction1 (classKlattGrid, 0, U"Draw -", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Draw synthesizer...", 0, 1, DO_KlattGrid_draw);
+	praat_addAction1 (classKlattGrid, 0, U"Draw vocal tract...", 0, 1, DO_KlattGrid_drawVocalTract);
+	praat_addAction1 (classKlattGrid, 0, U"Draw phonation", 0, 1, DO_KlattGrid_drawPhonation);
+	praat_addAction1 (classKlattGrid, 0, U"Draw frication", 0, 1, DO_KlattGrid_drawFrication);
+
+	praat_addAction1 (classKlattGrid, 0, U"Query phonation -", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 1, U"Get pitch at time...", 0, 1, DO_KlattGrid_getPitchAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get voicing amplitude at time...", 0, 1, DO_KlattGrid_getVoicingAmplitudeAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get flutter at time...", 0, 1, DO_KlattGrid_getFlutterAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get power1 at time...", 0, 1, DO_KlattGrid_getPower1AtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get power2 at time...", 0, 1, DO_KlattGrid_getPower2AtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get open phase at time...", 0, 1, DO_KlattGrid_getOpenPhaseAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get collision phase at time...", 0, 1, DO_KlattGrid_getCollisionPhaseAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get double pulsing at time...", 0, 1, DO_KlattGrid_getDoublePulsingAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get spectral tilt at time...", 0, 1, DO_KlattGrid_getSpectralTiltAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get aspiration amplitude at time...", 0, 1, DO_KlattGrid_getAspirationAmplitudeAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get breathiness amplitude at time...", 0, 1, DO_KlattGrid_getBreathinessAmplitudeAtTime);
+
+	praat_addAction1 (classKlattGrid, 0, U"Query filters -", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 1, U"Get formant at time...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_getFormantAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get bandwidth at time...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_getBandwidthAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get amplitude at time...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_getAmplitudeAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get delta formant at time...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_getDeltaFormantAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get delta bandwidth at time...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_getDeltaBandwidthAtTime);
 
 #define KlattGRID_GET_FORMANT_FB_VALUES_ACTION(Name, formantname) \
-	praat_addAction1 (classKlattGrid, 1, L"Get " #formantname " frequency at time...", 0, 1, DO_KlattGrid_get##Name##FormantFrequencyAtTime); \
-	praat_addAction1 (classKlattGrid, 1, L"Get " #formantname " bandwidth at time...", 0, 1, DO_KlattGrid_get##Name##FormantBandwidthAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get " #formantname " frequency at time...", 0, 1, DO_KlattGrid_get##Name##FormantFrequencyAtTime); \
+	praat_addAction1 (classKlattGrid, 1, U"Get " #formantname " bandwidth at time...", 0, 1, DO_KlattGrid_get##Name##FormantBandwidthAtTime);
 
 #define KlattGRID_GET_FORMANT_A_VALUES_ACTION(Name,formantname) \
-	praat_addAction1 (classKlattGrid, 1, L"Get " #formantname " amplitude at time...", 0, 1, DO_KlattGrid_get##Name##FormantAmplitudeAtTime); \
+	praat_addAction1 (classKlattGrid, 1, U"Get " #formantname " amplitude at time...", 0, 1, DO_KlattGrid_get##Name##FormantAmplitudeAtTime); \
 
 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (Oral, oral formant)
 	KlattGRID_GET_FORMANT_A_VALUES_ACTION (Oral, oral formant)
@@ -1083,37 +1082,37 @@ void praat_KlattGrid_init () {
 	KlattGRID_GET_FORMANT_A_VALUES_ACTION (Nasal, nasal formant)
 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (NasalAnti, nasal antiformant)
 
-	praat_addAction1 (classKlattGrid, 1, L"-- query delta characteristics", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 1, U"-- query delta characteristics", 0, 1, 0);
 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (Delta, delta formant)
 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (Tracheal, tracheal formant)
 	KlattGRID_GET_FORMANT_A_VALUES_ACTION (Tracheal, tracheal formant)
 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (TrachealAnti, tracheal antiformant)
-	praat_addAction1 (classKlattGrid, 1, L"-- query frication characteristics", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 1, U"-- query frication characteristics", 0, 1, 0);
 	KlattGRID_GET_FORMANT_FB_VALUES_ACTION (Frication, frication formant)
 	KlattGRID_GET_FORMANT_A_VALUES_ACTION (Frication, frication formant)
 
 #undef KlattGRID_GET_FORMANT_A_VALUES_ACTION
 #undef KlattGRID_GET_FORMANT_A_VALUES_ACTION
 
-	praat_addAction1 (classKlattGrid, 1, L"Get frication bypass at time...", 0, 1, DO_KlattGrid_getFricationBypassAtTime);
-	praat_addAction1 (classKlattGrid, 1, L"Get frication amplitude at time...", 0, 1, DO_KlattGrid_getFricationAmplitudeAtTime);
-
-	praat_addAction1 (classKlattGrid, 0, L"Modify phonation -", 0, 0, 0);
-	praat_addAction1 (classKlattGrid, 0, L"Add pitch point...", 0, 1, DO_KlattGrid_addPitchPoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add voicing amplitude point...", 0, 1, DO_KlattGrid_addVoicingAmplitudePoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add flutter point...", 0, 1, DO_KlattGrid_addFlutterPoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add power1 point...", 0, 1, DO_KlattGrid_addPower1Point);
-	praat_addAction1 (classKlattGrid, 0, L"Add power2 point...", 0, 1, DO_KlattGrid_addPower2Point);
-	praat_addAction1 (classKlattGrid, 0, L"Add open phase point...", 0, 1, DO_KlattGrid_addOpenPhasePoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add collision phase point...", 0, 1, DO_KlattGrid_addCollisionPhasePoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add double pulsing point...", 0, 1, DO_KlattGrid_addDoublePulsingPoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add spectral tilt point...", 0, 1, DO_KlattGrid_addSpectralTiltPoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add aspiration amplitude point...", 0, 1, DO_KlattGrid_addAspirationAmplitudePoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add breathiness amplitude point...", 0, 1, DO_KlattGrid_addBreathinessAmplitudePoint);
+	praat_addAction1 (classKlattGrid, 1, U"Get frication bypass at time...", 0, 1, DO_KlattGrid_getFricationBypassAtTime);
+	praat_addAction1 (classKlattGrid, 1, U"Get frication amplitude at time...", 0, 1, DO_KlattGrid_getFricationAmplitudeAtTime);
+
+	praat_addAction1 (classKlattGrid, 0, U"Modify phonation -", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Add pitch point...", 0, 1, DO_KlattGrid_addPitchPoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add voicing amplitude point...", 0, 1, DO_KlattGrid_addVoicingAmplitudePoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add flutter point...", 0, 1, DO_KlattGrid_addFlutterPoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add power1 point...", 0, 1, DO_KlattGrid_addPower1Point);
+	praat_addAction1 (classKlattGrid, 0, U"Add power2 point...", 0, 1, DO_KlattGrid_addPower2Point);
+	praat_addAction1 (classKlattGrid, 0, U"Add open phase point...", 0, 1, DO_KlattGrid_addOpenPhasePoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add collision phase point...", 0, 1, DO_KlattGrid_addCollisionPhasePoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add double pulsing point...", 0, 1, DO_KlattGrid_addDoublePulsingPoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add spectral tilt point...", 0, 1, DO_KlattGrid_addSpectralTiltPoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add aspiration amplitude point...", 0, 1, DO_KlattGrid_addAspirationAmplitudePoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add breathiness amplitude point...", 0, 1, DO_KlattGrid_addBreathinessAmplitudePoint);
 
 #define KlattGrid_REMOVE_POINTS_ACTION(Name,name) \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #name " points between...", 0, praat_DEPTH_1+praat_HIDDEN, DO_KlattGrid_remove##Name##Points); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #name " points...", 0, 1, DO_KlattGrid_remove##Name##Points);
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #name " points between...", 0, praat_DEPTH_1+praat_HIDDEN, DO_KlattGrid_remove##Name##Points); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #name " points...", 0, 1, DO_KlattGrid_remove##Name##Points);
 
 	KlattGrid_REMOVE_POINTS_ACTION (Pitch, pitch)
 	KlattGrid_REMOVE_POINTS_ACTION (VoicingAmplitude, voicing amplitude)
@@ -1127,165 +1126,165 @@ void praat_KlattGrid_init () {
 	KlattGrid_REMOVE_POINTS_ACTION (AspirationAmplitude, aspiration amplitude)
 	KlattGrid_REMOVE_POINTS_ACTION (BreathinessAmplitude, breathiness amplitude)
 
-	praat_addAction1 (classKlattGrid, 0, L"Modify vocal tract -", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Modify vocal tract -", 0, 0, 0);
 
 #define KlattGrid_MODIFY_ACTIONS_FBA(Name,formantname) \
-	praat_addAction1 (classKlattGrid, 0, L"Formula (" #formantname " frequencies)...", 0, 1, DO_KlattGrid_formula##Name##FormantFrequencies); \
-	praat_addAction1 (classKlattGrid, 0, L"Formula (" #formantname " bandwidths)...", 0, 1, DO_KlattGrid_formula##Name##FormantBandwidths); \
-	praat_addAction1 (classKlattGrid, 0, L"Add " #formantname " frequency point...", 0, 1, DO_KlattGrid_add##Name##FormantFrequencyPoint); \
-	praat_addAction1 (classKlattGrid, 0, L"Add " #formantname " bandwidth point...", 0, 1, DO_KlattGrid_add##Name##FormantBandwidthPoint); \
-	praat_addAction1 (classKlattGrid, 0, L"Add " #formantname " amplitude point...", 0, 1, DO_KlattGrid_add##Name##FormantAmplitudePoint); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #formantname " frequency points...", 0, 1, DO_KlattGrid_remove##Name##FormantFrequencyPoints); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #formantname " bandwidth points...", 0, 1, DO_KlattGrid_remove##Name##FormantBandwidthPoints); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #formantname " amplitude points...", 0, 1, DO_KlattGrid_remove##Name##FormantAmplitudePoints); \
-	praat_addAction1 (classKlattGrid, 0, L"Add " #formantname " frequency and bandwidth tiers...", 0, 1, DO_KlattGrid_add##Name##FormantFrequencyAndBandwidthTiers); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #formantname " frequency and bandwidth tiers...", 0, 1, DO_KlattGrid_remove##Name##FormantFrequencyAndBandwidthTiers); \
-	praat_addAction1 (classKlattGrid, 0, L"Add " #formantname " amplitude tier...", 0, 1, DO_KlattGrid_add##Name##FormantAmplitudeTier); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #formantname " amplitude tier...", 0, 1, DO_KlattGrid_remove##Name##FormantAmplitudeTier); \
-	praat_addAction1 (classKlattGrid, 0, L"Add " #formantname "...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_add##Name##Formant); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #formantname "...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_remove##Name##Formant);
+	praat_addAction1 (classKlattGrid, 0, U"Formula (" #formantname " frequencies)...", 0, 1, DO_KlattGrid_formula##Name##FormantFrequencies); \
+	praat_addAction1 (classKlattGrid, 0, U"Formula (" #formantname " bandwidths)...", 0, 1, DO_KlattGrid_formula##Name##FormantBandwidths); \
+	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " frequency point...", 0, 1, DO_KlattGrid_add##Name##FormantFrequencyPoint); \
+	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " bandwidth point...", 0, 1, DO_KlattGrid_add##Name##FormantBandwidthPoint); \
+	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " amplitude point...", 0, 1, DO_KlattGrid_add##Name##FormantAmplitudePoint); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " frequency points...", 0, 1, DO_KlattGrid_remove##Name##FormantFrequencyPoints); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " bandwidth points...", 0, 1, DO_KlattGrid_remove##Name##FormantBandwidthPoints); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " amplitude points...", 0, 1, DO_KlattGrid_remove##Name##FormantAmplitudePoints); \
+	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " frequency and bandwidth tiers...", 0, 1, DO_KlattGrid_add##Name##FormantFrequencyAndBandwidthTiers); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " frequency and bandwidth tiers...", 0, 1, DO_KlattGrid_remove##Name##FormantFrequencyAndBandwidthTiers); \
+	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " amplitude tier...", 0, 1, DO_KlattGrid_add##Name##FormantAmplitudeTier); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " amplitude tier...", 0, 1, DO_KlattGrid_remove##Name##FormantAmplitudeTier); \
+	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname "...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_add##Name##Formant); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname "...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_remove##Name##Formant);
 
 #define KlattGrid_MODIFY_ACTIONS_FB(Name,formantname) \
-	praat_addAction1 (classKlattGrid, 0, L"Formula (" #formantname " frequencies)...", 0, 1, DO_KlattGrid_formula##Name##FormantFrequencies); \
-	praat_addAction1 (classKlattGrid, 0, L"Formula (" #formantname " bandwidths)...", 0, 1, DO_KlattGrid_formula##Name##FormantBandwidths); \
-	praat_addAction1 (classKlattGrid, 0, L"Add " #formantname " frequency point...", 0, 1, DO_KlattGrid_add##Name##FormantFrequencyPoint); \
-	praat_addAction1 (classKlattGrid, 0, L"Add " #formantname " bandwidth point...", 0, 1, DO_KlattGrid_add##Name##FormantBandwidthPoint); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #formantname " frequency points...", 0, 1, DO_KlattGrid_remove##Name##FormantFrequencyPoints); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #formantname " bandwidth points...", 0, 1, DO_KlattGrid_remove##Name##FormantBandwidthPoints); \
-	praat_addAction1 (classKlattGrid, 0, L"Add " #formantname " frequency and bandwidth tiers...", 0, 1, DO_KlattGrid_add##Name##FormantFrequencyAndBandwidthTiers); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #formantname " frequency and bandwidth tiers...", 0, 1, DO_KlattGrid_remove##Name##FormantFrequencyAndBandwidthTiers); \
-	praat_addAction1 (classKlattGrid, 0, L"Add " #formantname "...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_add##Name##Formant); \
-	praat_addAction1 (classKlattGrid, 0, L"Remove " #formantname "...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_remove##Name##Formant);
+	praat_addAction1 (classKlattGrid, 0, U"Formula (" #formantname " frequencies)...", 0, 1, DO_KlattGrid_formula##Name##FormantFrequencies); \
+	praat_addAction1 (classKlattGrid, 0, U"Formula (" #formantname " bandwidths)...", 0, 1, DO_KlattGrid_formula##Name##FormantBandwidths); \
+	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " frequency point...", 0, 1, DO_KlattGrid_add##Name##FormantFrequencyPoint); \
+	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " bandwidth point...", 0, 1, DO_KlattGrid_add##Name##FormantBandwidthPoint); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " frequency points...", 0, 1, DO_KlattGrid_remove##Name##FormantFrequencyPoints); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " bandwidth points...", 0, 1, DO_KlattGrid_remove##Name##FormantBandwidthPoints); \
+	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname " frequency and bandwidth tiers...", 0, 1, DO_KlattGrid_add##Name##FormantFrequencyAndBandwidthTiers); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname " frequency and bandwidth tiers...", 0, 1, DO_KlattGrid_remove##Name##FormantFrequencyAndBandwidthTiers); \
+	praat_addAction1 (classKlattGrid, 0, U"Add " #formantname "...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_add##Name##Formant); \
+	praat_addAction1 (classKlattGrid, 0, U"Remove " #formantname "...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_remove##Name##Formant);
 
 	KlattGrid_MODIFY_ACTIONS_FBA (Oral, oral formant)
-	praat_addAction1 (classKlattGrid, 0, L"-- oral modify separator --", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 0, U"-- oral modify separator --", 0, 1, 0);
 	KlattGrid_MODIFY_ACTIONS_FBA (Nasal, nasal formant)
-	praat_addAction1 (classKlattGrid, 0, L"-- nasal modify separator --", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 0, U"-- nasal modify separator --", 0, 1, 0);
 	KlattGrid_MODIFY_ACTIONS_FB (NasalAnti, nasal antiformant)
 
-	praat_addAction1 (classKlattGrid, 0, L"Formula (frequencies)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_formula_frequencies);
-	praat_addAction1 (classKlattGrid, 0, L"Formula (bandwidths)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_formula_bandwidths);
-	praat_addAction1 (classKlattGrid, 0, L"Add formant point...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addFormantPoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add bandwidth point...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addBandwidthPoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add amplitude point...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addAmplitudePoint);
-	praat_addAction1 (classKlattGrid, 0, L"Remove formant points between...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_removeFormantPoints);
-	praat_addAction1 (classKlattGrid, 0, L"Remove bandwidth points between...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_removeBandwidthPoints);
-	praat_addAction1 (classKlattGrid, 0, L"Remove amplitude points between...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_removeAmplitudePoints);
-	praat_addAction1 (classKlattGrid, 0, L"Modify coupling - ", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Formula (frequencies)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_formula_frequencies);
+	praat_addAction1 (classKlattGrid, 0, U"Formula (bandwidths)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_formula_bandwidths);
+	praat_addAction1 (classKlattGrid, 0, U"Add formant point...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addFormantPoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add bandwidth point...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addBandwidthPoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add amplitude point...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addAmplitudePoint);
+	praat_addAction1 (classKlattGrid, 0, U"Remove formant points between...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_removeFormantPoints);
+	praat_addAction1 (classKlattGrid, 0, U"Remove bandwidth points between...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_removeBandwidthPoints);
+	praat_addAction1 (classKlattGrid, 0, U"Remove amplitude points between...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_removeAmplitudePoints);
+	praat_addAction1 (classKlattGrid, 0, U"Modify coupling - ", 0, 0, 0);
 	KlattGrid_MODIFY_ACTIONS_FB (Delta, delta formant)
-	praat_addAction1 (classKlattGrid, 0, L"-- delta modify separator --", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 0, U"-- delta modify separator --", 0, 1, 0);
 	KlattGrid_MODIFY_ACTIONS_FBA (Tracheal, tracheal formant)
-	praat_addAction1 (classKlattGrid, 0, L"-- nasal modify separator --", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 0, U"-- nasal modify separator --", 0, 1, 0);
 	KlattGrid_MODIFY_ACTIONS_FB (TrachealAnti, tracheal antiformant)
 
-	praat_addAction1 (classKlattGrid, 0, L"Add delta formant point...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addDeltaFormantPoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add delta bandwidth point...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addDeltaBandwidthPoint);
-	praat_addAction1 (classKlattGrid, 0, L"Remove delta formant points between...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_removeDeltaFormantPoints);
-	praat_addAction1 (classKlattGrid, 0, L"Remove delta bandwidth points between...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_removeDeltaBandwidthPoints);
+	praat_addAction1 (classKlattGrid, 0, U"Add delta formant point...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addDeltaFormantPoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add delta bandwidth point...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addDeltaBandwidthPoint);
+	praat_addAction1 (classKlattGrid, 0, U"Remove delta formant points between...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_removeDeltaFormantPoints);
+	praat_addAction1 (classKlattGrid, 0, U"Remove delta bandwidth points between...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_removeDeltaBandwidthPoints);
 
-	praat_addAction1 (classKlattGrid, 0, L"Modify frication -", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Modify frication -", 0, 0, 0);
 	KlattGrid_MODIFY_ACTIONS_FBA (Frication, frication formant)
-	praat_addAction1 (classKlattGrid, 0, L"-- frication modify separator --", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 0, U"-- frication modify separator --", 0, 1, 0);
 
-	praat_addAction1 (classKlattGrid, 0, L"Add frication bypass point...", 0, 1, DO_KlattGrid_addFricationBypassPoint);
-	praat_addAction1 (classKlattGrid, 0, L"Add frication amplitude point...", 0, 1, DO_KlattGrid_addFricationAmplitudePoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add frication bypass point...", 0, 1, DO_KlattGrid_addFricationBypassPoint);
+	praat_addAction1 (classKlattGrid, 0, U"Add frication amplitude point...", 0, 1, DO_KlattGrid_addFricationAmplitudePoint);
 	KlattGrid_REMOVE_POINTS_ACTION (FricationBypass, frication bypass)
 	KlattGrid_REMOVE_POINTS_ACTION (FricationAmplitude, frication amplitude)
-	praat_addAction1 (classKlattGrid, 0, L"Add formant and bandwidth tier...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addFormantAndBandwidthTier);
+	praat_addAction1 (classKlattGrid, 0, U"Add formant and bandwidth tier...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_addFormantAndBandwidthTier);
 
 #undef KlattGrid_REMOVE_POINTS_ACTION
 #undef KlattGrid_MODIFY_ACTION_FB
 #undef KlattGrid_MODIFY_ACTION_FBA
 
-	praat_addAction1 (classKlattGrid, 0, L"Extract phonation -", 0, 0, 0);
-	praat_addAction1 (classKlattGrid, 0, L"Extract pitch tier", 0, 1, DO_KlattGrid_extractPitchTier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract voicing amplitude tier", 0, 1, DO_KlattGrid_extractVoicingAmplitudeTier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract flutter tier", 0, 1, DO_KlattGrid_extractFlutterTier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract power1 tier", 0, 1, DO_KlattGrid_extractPower1Tier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract power2 tier", 0, 1, DO_KlattGrid_extractPower2Tier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract open phase tier", 0, 1, DO_KlattGrid_extractOpenPhaseTier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract collision phase tier", 0, 1, DO_KlattGrid_extractCollisionPhaseTier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract double pulsing tier", 0, 1, DO_KlattGrid_extractDoublePulsingTier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract spectral tilt tier", 0, 1, DO_KlattGrid_extractSpectralTiltTier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract aspiration amplitude tier", 0, 1, DO_KlattGrid_extractAspirationAmplitudeTier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract breathiness amplitude tier", 0, 1, DO_KlattGrid_extractBreathinessAmplitudeTier);
-	praat_addAction1 (classKlattGrid, 0, L"-- extract glottal events--", 0, 1, 0);
-	praat_addAction1 (classKlattGrid, 0, L"Extract PointProcess (glottal closures)", 0, 1, DO_KlattGrid_extractPointProcess_glottalClosures);
+	praat_addAction1 (classKlattGrid, 0, U"Extract phonation -", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Extract pitch tier", 0, 1, DO_KlattGrid_extractPitchTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract voicing amplitude tier", 0, 1, DO_KlattGrid_extractVoicingAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract flutter tier", 0, 1, DO_KlattGrid_extractFlutterTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract power1 tier", 0, 1, DO_KlattGrid_extractPower1Tier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract power2 tier", 0, 1, DO_KlattGrid_extractPower2Tier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract open phase tier", 0, 1, DO_KlattGrid_extractOpenPhaseTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract collision phase tier", 0, 1, DO_KlattGrid_extractCollisionPhaseTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract double pulsing tier", 0, 1, DO_KlattGrid_extractDoublePulsingTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract spectral tilt tier", 0, 1, DO_KlattGrid_extractSpectralTiltTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract aspiration amplitude tier", 0, 1, DO_KlattGrid_extractAspirationAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract breathiness amplitude tier", 0, 1, DO_KlattGrid_extractBreathinessAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"-- extract glottal events--", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Extract PointProcess (glottal closures)", 0, 1, DO_KlattGrid_extractPointProcess_glottalClosures);
 
 #define KlattGRID_EXTRACT_FORMANT_GRID_ACTION(Name,namef) \
-	praat_addAction1 (classKlattGrid, 0, L"Extract " #namef "ormant grid", 0, 1, DO_KlattGrid_extract##Name##FormantGrid);
+	praat_addAction1 (classKlattGrid, 0, U"Extract " #namef "ormant grid", 0, 1, DO_KlattGrid_extract##Name##FormantGrid);
 #define KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION(Name,name) \
-	praat_addAction1 (classKlattGrid, 0, L"Extract " #name " formant amplitude tier...", 0, 1, DO_KlattGrid_extract##Name##FormantAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract " #name " formant amplitude tier...", 0, 1, DO_KlattGrid_extract##Name##FormantAmplitudeTier);
 
-	praat_addAction1 (classKlattGrid, 0, L"Extract filters -", 0, 0, 0);
-	praat_addAction1 (classKlattGrid, 0, L"Extract formant grid...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_extractFormantGrid); // deprecated
+	praat_addAction1 (classKlattGrid, 0, U"Extract filters -", 0, 0, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Extract formant grid...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_extractFormantGrid); // deprecated
 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (Oral, oral f)
-	praat_addAction1 (classKlattGrid, 0, L"Extract amplitude tier...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_extractAmplitudeTier); // deprecated
-	praat_addAction1 (classKlattGrid, 0, L"Extract formant grid (open phases)...", 0, praat_HIDDEN + praat_DEPTH_1, DO_KlattGrid_to_oralFormantGrid_openPhases);
-	praat_addAction1 (classKlattGrid, 0, L"Extract oral formant grid (open phases)...", 0, 1, DO_KlattGrid_to_oralFormantGrid_openPhases);
+	praat_addAction1 (classKlattGrid, 0, U"Extract amplitude tier...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_KlattGrid_extractAmplitudeTier); // deprecated
+	praat_addAction1 (classKlattGrid, 0, U"Extract formant grid (open phases)...", 0, praat_HIDDEN + praat_DEPTH_1, DO_KlattGrid_to_oralFormantGrid_openPhases);
+	praat_addAction1 (classKlattGrid, 0, U"Extract oral formant grid (open phases)...", 0, 1, DO_KlattGrid_to_oralFormantGrid_openPhases);
 	KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION (Oral, oral)
 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (Nasal, nasal f)
 	KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION (Nasal, nasal)
 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (NasalAnti, nasal antif)
 
-	praat_addAction1 (classKlattGrid, 0, L"-- extract delta characteristics", 0, 1, 0);
-	praat_addAction1 (classKlattGrid, 0, L"Extract delta formant grid", 0, 1, DO_KlattGrid_extractDeltaFormantGrid);
+	praat_addAction1 (classKlattGrid, 0, U"-- extract delta characteristics", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 0, U"Extract delta formant grid", 0, 1, DO_KlattGrid_extractDeltaFormantGrid);
 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (Tracheal, tracheal f)
 	KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION (Tracheal, tracheal)
 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (TrachealAnti, tracheal antif)
-	praat_addAction1 (classKlattGrid, 0, L"-- extract frication characteristics", 0, 1, 0);
+	praat_addAction1 (classKlattGrid, 0, U"-- extract frication characteristics", 0, 1, 0);
 	KlattGRID_EXTRACT_FORMANT_GRID_ACTION (Frication, frication f)
 	KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION (Frication, frication)
-	praat_addAction1 (classKlattGrid, 0, L"Extract frication bypass tier", 0, 1, DO_KlattGrid_extractFricationBypassTier);
-	praat_addAction1 (classKlattGrid, 0, L"Extract frication amplitude tier", 0, 1, DO_KlattGrid_extractFricationAmplitudeTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract frication bypass tier", 0, 1, DO_KlattGrid_extractFricationBypassTier);
+	praat_addAction1 (classKlattGrid, 0, U"Extract frication amplitude tier", 0, 1, DO_KlattGrid_extractFricationAmplitudeTier);
 
 #undef KlattGRID_EXTRACT_FORMANT_AMPLITUDE_ACTION
 #undef KlattGRID_EXTRACT_FORMANT_GRID_ACTION
 
-	praat_addAction2 (classKlattGrid, 1, classPitchTier, 1, L"Replace pitch tier", 0, 1, DO_KlattGrid_replacePitchTier);
-	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, L"Replace flutter tier", 0, 1, DO_KlattGrid_replaceFlutterTier);
-	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, L"Replace power1 tier", 0, 1, DO_KlattGrid_replacePower1Tier);
-	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, L"Replace power2 tier", 0, 1, DO_KlattGrid_replacePower2Tier);
-	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, L"Replace open phase tier", 0, 1, DO_KlattGrid_replaceOpenPhaseTier);
-	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, L"Replace collision phase tier", 0, 1, DO_KlattGrid_replaceCollisionPhaseTier);
-	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, L"Replace double pulsing tier", 0, 1, DO_KlattGrid_replaceDoublePulsingTier);
+	praat_addAction2 (classKlattGrid, 1, classPitchTier, 1, U"Replace pitch tier", 0, 1, DO_KlattGrid_replacePitchTier);
+	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace flutter tier", 0, 1, DO_KlattGrid_replaceFlutterTier);
+	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace power1 tier", 0, 1, DO_KlattGrid_replacePower1Tier);
+	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace power2 tier", 0, 1, DO_KlattGrid_replacePower2Tier);
+	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace open phase tier", 0, 1, DO_KlattGrid_replaceOpenPhaseTier);
+	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace collision phase tier", 0, 1, DO_KlattGrid_replaceCollisionPhaseTier);
+	praat_addAction2 (classKlattGrid, 1, classRealTier, 1, U"Replace double pulsing tier", 0, 1, DO_KlattGrid_replaceDoublePulsingTier);
 
-	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, L"-- replace formant amplitudes --", 0, 1, 0);
+	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"-- replace formant amplitudes --", 0, 1, 0);
 
 #define KlattGrid_REPLACE_FORMANTGRID_ACTION(Name,namef) \
-	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, L"Replace " #namef "ormant grid", 0, 1, DO_KlattGrid_replace##Name##FormantGrid);
+	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, U"Replace " #namef "ormant grid", 0, 1, DO_KlattGrid_replace##Name##FormantGrid);
 #define KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION(Name,namef) \
-	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, L"Replace " #namef "ormant amplitude tier...", 0, 1, DO_KlattGrid_replace##Name##FormantAmplitudeTier);
+	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace " #namef "ormant amplitude tier...", 0, 1, DO_KlattGrid_replace##Name##FormantAmplitudeTier);
 
 
 	KlattGrid_REPLACE_FORMANTGRID_ACTION (Oral, oral f)
 	KlattGrid_REPLACE_FORMANTGRID_ACTION (Nasal, nasal f)
 	KlattGrid_REPLACE_FORMANTGRID_ACTION (NasalAnti, nasal antif)
-	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, L"-- replace coupling --", 0, 1, 0);
+	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, U"-- replace coupling --", 0, 1, 0);
 	KlattGrid_REPLACE_FORMANTGRID_ACTION (Tracheal, tracheal f)
 	KlattGrid_REPLACE_FORMANTGRID_ACTION (TrachealAnti, tracheal antif)
 	KlattGrid_REPLACE_FORMANTGRID_ACTION (Delta, delta f)
-	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, L"-- replace frication --", 0, 1, 0);
+	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, U"-- replace frication --", 0, 1, 0);
 	KlattGrid_REPLACE_FORMANTGRID_ACTION (Frication, frication f)
-	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, L"Replace formant grid...", 0, praat_HIDDEN + praat_DEPTH_1, DO_KlattGrid_replaceFormantGrid);
-	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, L"Replace voicing amplitude tier", 0, 1, DO_KlattGrid_replaceVoicingAmplitudeTier);
-	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, L"Replace spectral tilt tier", 0, 1, DO_KlattGrid_replaceSpectralTiltTier);
-	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, L"Replace aspiration amplitude tier", 0, 1,
+	praat_addAction2 (classKlattGrid, 1, classFormantGrid, 1, U"Replace formant grid...", 0, praat_HIDDEN + praat_DEPTH_1, DO_KlattGrid_replaceFormantGrid);
+	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace voicing amplitude tier", 0, 1, DO_KlattGrid_replaceVoicingAmplitudeTier);
+	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace spectral tilt tier", 0, 1, DO_KlattGrid_replaceSpectralTiltTier);
+	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace aspiration amplitude tier", 0, 1,
 	                  DO_KlattGrid_replaceAspirationAmplitudeTier);
-	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, L"Replace breathiness amplitude tier", 0, 1,
+	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace breathiness amplitude tier", 0, 1,
 	                  DO_KlattGrid_replaceBreathinessAmplitudeTier);
-	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, L"Replace amplitude tier...", 0, praat_HIDDEN + praat_DEPTH_1, DO_KlattGrid_replaceAmplitudeTier);
+	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace amplitude tier...", 0, praat_HIDDEN + praat_DEPTH_1, DO_KlattGrid_replaceAmplitudeTier);
 	KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION (Oral, oral f)
 	KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION (Nasal, nasal f)
 	KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION (Tracheal, tracheal f)
 	KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION (Frication, frication f)
-	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, L"Replace frication amplitude tier", 0, 1, DO_KlattGrid_replaceFricationAmplitudeTier);
-	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, L"Replace frication bypass tier", 0, 1, DO_KlattGrid_replaceFricationBypassTier);
+	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace frication amplitude tier", 0, 1, DO_KlattGrid_replaceFricationAmplitudeTier);
+	praat_addAction2 (classKlattGrid, 1, classIntensityTier, 1, U"Replace frication bypass tier", 0, 1, DO_KlattGrid_replaceFricationBypassTier);
 
 #undef KlattGrid_REPLACE_FORMANT_AMPLITUDE_ACTION
 #undef KlattGrid_REPLACE_FORMANTGRID_ACTION
 
-	praat_addAction2 (classKlattGrid, 1, classSound, 1, L"Filter by vocal tract...", 0, 1, DO_Sound_KlattGrid_filterByVocalTract);
+	praat_addAction2 (classKlattGrid, 1, classSound, 1, U"Filter by vocal tract...", 0, 1, DO_Sound_KlattGrid_filterByVocalTract);
 
 	INCLUDE_MANPAGES (manual_KlattGrid)
 }
diff --git a/dwtools/praat_MDS_init.cpp b/dwtools/praat_MDS_init.cpp
index 34e5add..cb02873 100644
--- a/dwtools/praat_MDS_init.cpp
+++ b/dwtools/praat_MDS_init.cpp
@@ -1,6 +1,6 @@
 /* praat_MDS_init.cpp
  *
- * Copyright (C) 1992-2012 David Weenink
+ * Copyright (C) 1992-2012, 2015 David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,7 +29,7 @@
  djmw 20050630 Better name of Procrustes object after Configurations_to_Procrustes.
  djmw 20061218 Introduction of Melder_information<12...9>
  djmw 20070902 Melder_new<1...>
- djmw 20071011 REQUIRE requires L"".
+ djmw 20071011 REQUIRE requires U"".
  djmw 20090818 Thing_recognizeClassesByName: added classAffineTransform, classScalarProduct, classWeight
 */
 
@@ -47,10 +47,10 @@
 void praat_TableOfReal_init (ClassInfo klas);
 void praat_TableOfReal_init2 (ClassInfo klas);
 
-static const wchar_t *QUERY_BUTTON   = L"Query -";
-static const wchar_t *DRAW_BUTTON    = L"Draw -";
-static const wchar_t *ANALYSE_BUTTON = L"Analyse -";
-static const wchar_t *CONFIGURATION_BUTTON = L"To Configuration -";
+static const char32 *QUERY_BUTTON   = U"Query -";
+static const char32 *DRAW_BUTTON    = U"Draw -";
+static const char32 *ANALYSE_BUTTON = U"Analyse -";
+static const char32 *CONFIGURATION_BUTTON = U"To Configuration -";
 
 /* Tests */
 
@@ -66,10 +66,10 @@ static void TabelOfReal_testSorting (I, long rowtoindex) {
 
 		autoNUMvector<long> index (1, nc);
 		if (my numberOfRows < 6) {
-			Melder_throw ("TabelOfReal_sort2: we want at least 6 rows!!");
+			Melder_throw (U"TabelOfReal_sort2: we want at least 6 rows!!");
 		}
 		if (rowtoindex < 1 || rowtoindex > 2) {
-			Melder_throw ("TabelOfReal_sort2: rowtoindex <= 2");
+			Melder_throw (U"TabelOfReal_sort2: rowtoindex <= 2");
 		}
 
 		// Copy 1->3 and sort 3 inplace
@@ -86,76 +86,76 @@ static void TabelOfReal_testSorting (I, long rowtoindex) {
 			my data[6][i] = index[i];
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": sorting test not ok.");
+		Melder_throw (me, U": sorting test not ok.");
 	}
 }
 
 #undef iam
 #define iam iam_LOOP
 
-FORM (TabelOfReal_testSorting, L"TabelOfReal: Sort and index", L"")
-	NATURAL (L"Row to index", L"1")
+FORM (TabelOfReal_testSorting, U"TabelOfReal: Sort and index", U"")
+	NATURAL (U"Row to index", U"1")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		TabelOfReal_testSorting (me, GET_INTEGER (L"Row to index"));
+		TabelOfReal_testSorting (me, GET_INTEGER (U"Row to index"));
 	}
 END
 
 /************************* examples ***************************************/
 
-FORM (Dissimilarity_createLetterRExample, L"Create letter R example", L"Create letter R example...")
-	LABEL (L"", L"For the monotone transformation on the distances")
-	REAL (L"Noise range", L"32.5")
+FORM (Dissimilarity_createLetterRExample, U"Create letter R example", U"Create letter R example...")
+	LABEL (U"", U"For the monotone transformation on the distances")
+	REAL (U"Noise range", U"32.5")
 	OK
 DO
-	praat_new (Dissimilarity_createLetterRExample (GET_REAL (L"Noise range")), 0);
+	praat_new (Dissimilarity_createLetterRExample (GET_REAL (U"Noise range")), U"");
 END
 
 FORM (INDSCAL_createCarrollWishExample,
-      L"Create INDSCAL Carroll & Wish example...",
-      L"Create INDSCAL Carroll & Wish example...")
-	REAL (L"Noise standard deviation", L"0.0")
+      U"Create INDSCAL Carroll & Wish example...",
+      U"Create INDSCAL Carroll & Wish example...")
+	REAL (U"Noise standard deviation", U"0.0")
 OK
 	DO
-	praat_new (INDSCAL_createCarrollWishExample (GET_REAL (L"Noise standard deviation")), 0);
+	praat_new (INDSCAL_createCarrollWishExample (GET_REAL (U"Noise standard deviation")), U""); 
 END
 
-FORM (Configuration_create, L"Create Configuration", L"Create Configuration...")
-	WORD (L"Name", L"uniform")
-	NATURAL (L"Number of points", L"10")
-	NATURAL (L"Number of dimensions", L"2")
-	LABEL (L"", L"Formula:")
-	TEXTFIELD (L"formula", L"randomUniform(-1.5, 1.5)")
+FORM (Configuration_create, U"Create Configuration", U"Create Configuration...")
+	WORD (U"Name", U"uniform")
+	NATURAL (U"Number of points", U"10")
+	NATURAL (U"Number of dimensions", U"2")
+	LABEL (U"", U"Formula:")
+	TEXTFIELD (U"formula", U"randomUniform(-1.5, 1.5)")
 	OK
 DO
-	autoConfiguration me = Configuration_create (GET_INTEGER (L"Number of points"), GET_INTEGER (L"Number of dimensions"));
-	TableOfReal_formula (me.peek(), GET_STRING (L"formula"), interpreter, 0);
-	praat_new (me.transfer(), GET_STRING (L"Name"));
+	autoConfiguration me = Configuration_create (GET_INTEGER (U"Number of points"), GET_INTEGER (U"Number of dimensions"));
+	TableOfReal_formula (me.peek(), GET_STRING (U"formula"), interpreter, 0);
+	praat_new (me.transfer(), GET_STRING (U"Name"));
 END
 
-FORM (drawSplines, L"Draw splines", L"spline")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"1.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"20.0")
-	RADIO (L"Spline type", 1)
-	RADIOBUTTON (L"M-spline")
-	RADIOBUTTON (L"I-spline")
-	INTEGER (L"Order", L"3")
-	SENTENCE (L"Interior knots", L"0.3 0.5 0.6")
-	BOOLEAN (L"Garnish", 1)
+FORM (drawSplines, U"Draw splines", U"spline")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"1.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"20.0")
+	RADIO (U"Spline type", 1)
+	RADIOBUTTON (U"M-spline")
+	RADIOBUTTON (U"I-spline")
+	INTEGER (U"Order", U"3")
+	SENTENCE (U"Interior knots", U"0.3 0.5 0.6")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
-	double xmin = GET_REAL (L"left Horizontal range"), xmax = GET_REAL (L"right Horizontal range");
-	double ymin = GET_REAL (L"left Vertical range"), ymax = GET_REAL (L"right Vertical range");
+	double xmin = GET_REAL (U"left Horizontal range"), xmax = GET_REAL (U"right Horizontal range");
+	double ymin = GET_REAL (U"left Vertical range"), ymax = GET_REAL (U"right Vertical range");
 	if (xmax <= xmin or ymax <= ymin) {
-		Melder_throw ("Required: xmin < xmax and ymin < ymax.");
+		Melder_throw (U"Required: xmin < xmax and ymin < ymax.");
 	}
 	autoPraatPicture picture;
-	drawSplines (GRAPHICS, xmin, xmax, ymin, ymax, GET_INTEGER (L"Spline type"),
-		GET_INTEGER (L"Order"), GET_STRING (L"Interior knots"), GET_INTEGER (L"Garnish"));
+	drawSplines (GRAPHICS, xmin, xmax, ymin, ymax, GET_INTEGER (U"Spline type"),
+		GET_INTEGER (U"Order"), GET_STRING (U"Interior knots"), GET_INTEGER (U"Garnish"));
 END
 
 DIRECT (drawMDSClassRelations)
@@ -168,169 +168,171 @@ END
 
 
 DIRECT (AffineTransform_help)
-	Melder_help (L"AffineTransform");
+	Melder_help (U"AffineTransform");
 END
 
 DIRECT (AffineTransform_invert)
 	LOOP {
 		iam (AffineTransform);
-		praat_new ( (AffineTransform) AffineTransform_invert (me), NAME, L"_inv");
+		praat_new ( (AffineTransform) AffineTransform_invert (me), NAME, U"_inv");
 	}
 END
 
-FORM (AffineTransform_getTransformationElement, L"AffineTransform: Get transformation element", L"Procrustes")
-	NATURAL (L"Row number", L"1")
-	NATURAL (L"Column number", L"1")
+FORM (AffineTransform_getTransformationElement, U"AffineTransform: Get transformation element", U"Procrustes")
+	NATURAL (U"Row number", U"1")
+	NATURAL (U"Column number", U"1")
 	OK
 DO
-	long row = GET_INTEGER (L"Row number");
-	long column = GET_INTEGER (L"Column number");
+	long row = GET_INTEGER (U"Row number");
+	long column = GET_INTEGER (U"Column number");
 	LOOP {
 		iam (AffineTransform);
 		if (row > my n) {
-			Melder_throw ("Row number must not exceed number of rows.");
+			Melder_throw (U"Row number must not exceed number of rows.");
 		}
 		if (column > my n) {
-			Melder_throw ("Column number must not exceed number of columns.");
+			Melder_throw (U"Column number must not exceed number of columns.");
 		}
-		Melder_information (Melder_double (my r [row] [column]));
+		Melder_information (my r [row] [column]);
 	}
 END
 
-FORM (AffineTransform_getTranslationElement, L"AffineTransform: Get translation element", L"Procrustes")
-	NATURAL (L"Index", L"1")
+FORM (AffineTransform_getTranslationElement, U"AffineTransform: Get translation element", U"Procrustes")
+	NATURAL (U"Index", U"1")
 	OK
 DO
-	long number = GET_INTEGER (L"Index");
+	long number = GET_INTEGER (U"Index");
 	LOOP {
 		iam (AffineTransform);
 		if (number > my n) {
-			Melder_throw ("Index must not exceed number of elements.");
+			Melder_throw (U"Index must not exceed number of elements.");
 		}
-		Melder_information (Melder_double (my t [number]));
+		Melder_information (my t [number]);
 	}
 END
 
 DIRECT (AffineTransform_extractMatrix)
 	LOOP {
 		iam (AffineTransform);
-		praat_new (AffineTransform_extractMatrix (me), my name);
+		autoTableOfReal thee = AffineTransform_extractMatrix (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 DIRECT (AffineTransform_extractTranslationVector)
 	LOOP {
 		iam (AffineTransform);
-		praat_new (AffineTransform_extractTranslationVector (me), my name);
+		autoTableOfReal thee = AffineTransform_extractTranslationVector (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 /***************** Configuration ***************************************/
 
 DIRECT (Configuration_help)
-	Melder_help (L"Configuration");
+	Melder_help (U"Configuration");
 END
 
-static void Configuration_draw_addCommonFields (void *dia) {
-	NATURAL (L"Horizontal dimension", L"1")
-	NATURAL (L"Vertical dimension", L"2")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0")
+static void Configuration_draw_addCommonFields (UiForm dia) {
+	NATURAL (U"Horizontal dimension", U"1")
+	NATURAL (U"Vertical dimension", U"2")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0")
 }
 
-FORM (Configuration_draw, L"Configuration: Draw", L"Configuration: Draw...")
+FORM (Configuration_draw, U"Configuration: Draw", U"Configuration: Draw...")
 	Configuration_draw_addCommonFields (dia);
-	NATURAL (L"Label size", L"12")
-	BOOLEAN (L"Use row labels", 0)
-	WORD (L"Label", L"+")
-	BOOLEAN (L"Garnish", 1)
+	NATURAL (U"Label size", U"12")
+	BOOLEAN (U"Use row labels", 0)
+	WORD (U"Label", U"+")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Configuration);
-		Configuration_draw (me, GRAPHICS, GET_INTEGER (L"Horizontal dimension"), GET_INTEGER (L"Vertical dimension"),
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"), GET_REAL (L"left Vertical range"),
-			GET_REAL (L"right Vertical range"), GET_INTEGER (L"Label size"),
-			GET_INTEGER (L"Use row labels"), GET_STRING (L"Label"), GET_INTEGER (L"Garnish"));
+		Configuration_draw (me, GRAPHICS, GET_INTEGER (U"Horizontal dimension"), GET_INTEGER (U"Vertical dimension"),
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"), GET_REAL (U"left Vertical range"),
+			GET_REAL (U"right Vertical range"), GET_INTEGER (U"Label size"),
+			GET_INTEGER (U"Use row labels"), GET_STRING (U"Label"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Configuration_drawSigmaEllipses, L"Configuration: Draw sigma ellipses", L"Configuration: Draw sigma ellipses...")
-	POSITIVE (L"Number of sigmas", L"1.0")
+FORM (Configuration_drawSigmaEllipses, U"Configuration: Draw sigma ellipses", U"Configuration: Draw sigma ellipses...")
+	POSITIVE (U"Number of sigmas", U"1.0")
 	Configuration_draw_addCommonFields (dia);
-	INTEGER (L"Label size", L"12")
-	BOOLEAN (L"Garnish", 1)
+	INTEGER (U"Label size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Configuration);
-		Configuration_drawConcentrationEllipses (me, GRAPHICS, GET_REAL (L"Number of sigmas"), 0, 0,
-			GET_INTEGER (L"Horizontal dimension"), GET_INTEGER (L"Vertical dimension"),
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
+		Configuration_drawConcentrationEllipses (me, GRAPHICS, GET_REAL (U"Number of sigmas"), 0, 0,
+			GET_INTEGER (U"Horizontal dimension"), GET_INTEGER (U"Vertical dimension"),
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Configuration_drawOneSigmaEllipse, L"Configuration: Draw one sigma ellipse", L"Configuration: Draw sigma ellipses...")
-	SENTENCE (L"Label", L"")
-	POSITIVE (L"Number of sigmas", L"1.0")
+FORM (Configuration_drawOneSigmaEllipse, U"Configuration: Draw one sigma ellipse", U"Configuration: Draw sigma ellipses...")
+	SENTENCE (U"Label", U"")
+	POSITIVE (U"Number of sigmas", U"1.0")
 	Configuration_draw_addCommonFields (dia);
-	INTEGER (L"Label size", L"12")
-	BOOLEAN (L"Garnish", 1)
+	INTEGER (U"Label size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Configuration);
-		Configuration_drawConcentrationEllipses (me, GRAPHICS, GET_REAL (L"Number of sigmas"), 0, GET_STRING (L"Label"),
-			GET_INTEGER (L"Horizontal dimension"), GET_INTEGER (L"Vertical dimension"),
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
+		Configuration_drawConcentrationEllipses (me, GRAPHICS, GET_REAL (U"Number of sigmas"), 0, GET_STRING (U"Label"),
+			GET_INTEGER (U"Horizontal dimension"), GET_INTEGER (U"Vertical dimension"),
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
 
-FORM (Configuration_drawConfidenceEllipses, L"Configuration: Draw confidence ellipses", 0)
-	POSITIVE (L"Confidence level (0-1)", L"0.95")
+FORM (Configuration_drawConfidenceEllipses, U"Configuration: Draw confidence ellipses", 0)
+	POSITIVE (U"Confidence level (0-1)", U"0.95")
 	Configuration_draw_addCommonFields (dia);
-	INTEGER (L"Label size", L"12")
-	BOOLEAN (L"Garnish", 1)
+	INTEGER (U"Label size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Configuration);
-		Configuration_drawConcentrationEllipses (me, GRAPHICS, GET_REAL (L"Confidence level"), 1, 0,
-			GET_INTEGER (L"Horizontal dimension"), GET_INTEGER (L"Vertical dimension"),
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
+		Configuration_drawConcentrationEllipses (me, GRAPHICS, GET_REAL (U"Confidence level"), 1, 0,
+			GET_INTEGER (U"Horizontal dimension"), GET_INTEGER (U"Vertical dimension"),
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
-FORM (Configuration_drawOneConfidenceEllipse, L"Configuration: Draw one confidence ellipse", 0)
-	SENTENCE (L"Label", L"")
-	POSITIVE (L"Confidence level (0-1)", L"0.95")
+FORM (Configuration_drawOneConfidenceEllipse, U"Configuration: Draw one confidence ellipse", 0)
+	SENTENCE (U"Label", U"")
+	POSITIVE (U"Confidence level (0-1)", U"0.95")
 	Configuration_draw_addCommonFields (dia);
-	INTEGER (L"Label size", L"12")
-	BOOLEAN (L"Garnish", 1)
+	INTEGER (U"Label size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Configuration);
 		Configuration_drawConcentrationEllipses (me, GRAPHICS,
-			GET_REAL (L"Confidence level"), 1, GET_STRING (L"Label"),
-			GET_INTEGER (L"Horizontal dimension"), GET_INTEGER (L"Vertical dimension"),
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_INTEGER (L"Label size"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"Confidence level"), 1, GET_STRING (U"Label"),
+			GET_INTEGER (U"Horizontal dimension"), GET_INTEGER (U"Vertical dimension"),
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_INTEGER (U"Label size"), GET_INTEGER (U"Garnish"));
 	}
 END
 
@@ -341,15 +343,15 @@ DIRECT (Configuration_randomize)
 	}
 END
 
-FORM (Configuration_normalize, L"Configuration: Normalize", L"Configuration: Normalize...")
-	REAL (L"Sum of squares", L"0.0")
-	LABEL (L"", L"On (INDSCAL), Off (Kruskal)")
-	BOOLEAN (L"Each dimension separately", 1)
+FORM (Configuration_normalize, U"Configuration: Normalize", U"Configuration: Normalize...")
+	REAL (U"Sum of squares", U"0.0")
+	LABEL (U"", U"On (INDSCAL), Off (Kruskal)")
+	BOOLEAN (U"Each dimension separately", 1)
 	OK
 DO
 	LOOP {
 		iam (Configuration);
-		Configuration_normalize (me, GET_REAL (L"Sum of squares"), GET_INTEGER (L"Each dimension separately"));
+		Configuration_normalize (me, GET_REAL (U"Sum of squares"), GET_INTEGER (U"Each dimension separately"));
 	}
 END
 
@@ -360,15 +362,15 @@ DIRECT (Configuration_centralize)
 	}
 END
 
-FORM (Configuration_rotate, L"Configuration: Rotate", L"Configuration: Rotate...")
-	NATURAL (L"Dimension 1", L"1")
-	NATURAL (L"Dimension 2", L"2")
-	REAL (L"Angle (degrees)", L"60.0")
+FORM (Configuration_rotate, U"Configuration: Rotate", U"Configuration: Rotate...")
+	NATURAL (U"Dimension 1", U"1")
+	NATURAL (U"Dimension 2", U"2")
+	REAL (U"Angle (degrees)", U"60.0")
 	OK
 DO
 	LOOP {
 		iam (Configuration);
-		Configuration_rotate (me, GET_INTEGER (L"Dimension 1"), GET_INTEGER (L"Dimension 2"), GET_REAL (L"Angle"));
+		Configuration_rotate (me, GET_INTEGER (U"Dimension 1"), GET_INTEGER (U"Dimension 2"), GET_REAL (U"Angle"));
 	}
 END
 
@@ -379,13 +381,13 @@ DIRECT (Configuration_rotateToPrincipalDirections)
 	}
 END
 
-FORM (Configuration_invertDimension, L"Configuration: Invert dimension", L"Configuration: Invert dimension...")
-	NATURAL (L"Dimension", L"1")
+FORM (Configuration_invertDimension, U"Configuration: Invert dimension", U"Configuration: Invert dimension...")
+	NATURAL (U"Dimension", U"1")
 	OK
 DO
 	LOOP {
 		iam (Configuration);
-		Configuration_invertDimension (me, GET_INTEGER (L"Dimension"));
+		Configuration_invertDimension (me, GET_INTEGER (U"Dimension"));
 	}
 END
 
@@ -396,27 +398,28 @@ DIRECT (Configuration_to_Distance)
 	}
 END
 
-FORM (Configuration_varimax, L"Configuration: To Configuration (varimax)", L"Configuration: To Configuration (varimax)...")
-	BOOLEAN (L"Normalize rows", 1)
-	BOOLEAN (L"Quartimax", 0)
-	NATURAL (L"Maximum number of iterations", L"50")
-	POSITIVE (L"Tolerance", L"1e-6")
+FORM (Configuration_varimax, U"Configuration: To Configuration (varimax)", U"Configuration: To Configuration (varimax)...")
+	BOOLEAN (U"Normalize rows", 1)
+	BOOLEAN (U"Quartimax", 0)
+	NATURAL (U"Maximum number of iterations", U"50")
+	POSITIVE (U"Tolerance", U"1e-6")
 	OK
 DO
 	LOOP {
 		iam (Configuration);
-		praat_new (Configuration_varimax (me, GET_INTEGER (L"Normalize rows"), GET_INTEGER (L"Quartimax"),
-			GET_INTEGER (L"Maximum number of iterations"), GET_REAL (L"Tolerance")), my name, L"_varimax");
+		autoConfiguration thee = Configuration_varimax (me, GET_INTEGER (U"Normalize rows"), 
+			GET_INTEGER (U"Quartimax"), GET_INTEGER (U"Maximum number of iterations"), GET_REAL (U"Tolerance"));
+		praat_new (thee.transfer(), my name, U"_varimax");
 	}
 END
 
 DIRECT (Configurations_to_Similarity_cc)
 	autoConfigurations set = (Configurations) praat_getSelectedObjects ();
-	praat_new (Configurations_to_Similarity_cc (set.peek(), 0), L"congruence");
+	praat_new (Configurations_to_Similarity_cc (set.peek(), 0), U"congruence");
 END
 
-FORM (Configurations_to_Procrustes, L"Configuration & Configuration: To Procrustes", L"Configuration & Configuration: To Procrustes...")
-	BOOLEAN (L"Orthogonal transform", 0)
+FORM (Configurations_to_Procrustes, U"Configuration & Configuration: To Procrustes", U"Configuration & Configuration: To Procrustes...")
+	BOOLEAN (U"Orthogonal transform", 0)
 	OK
 DO
 	Configuration c1 = 0, c2 = 0;
@@ -425,13 +428,13 @@ DO
 		(c1 ? c2 : c1) = me;
 	}
 	Melder_assert (c1 && c2);
-	praat_new (Configurations_to_Procrustes (c1, c2, GET_INTEGER (L"Orthogonal transform")),
-		Thing_getName (c2), L"_to_", Thing_getName (c1));
+	praat_new (Configurations_to_Procrustes (c1, c2, GET_INTEGER (U"Orthogonal transform")),
+		Thing_getName (c2), U"_to_", Thing_getName (c1));
 END
 
-FORM (Configurations_to_AffineTransform_congruence, L"Configurations: To AffineTransform (congruence)", L"Configurations: To AffineTransform (congruence)...")
-	NATURAL (L"Maximum number of iterations", L"50")
-	POSITIVE (L"Tolerance", L"1e-6")
+FORM (Configurations_to_AffineTransform_congruence, U"Configurations: To AffineTransform (congruence)", U"Configurations: To AffineTransform (congruence)...")
+	NATURAL (U"Maximum number of iterations", U"50")
+	POSITIVE (U"Tolerance", U"1e-6")
 	OK
 DO
 	Configuration c1 = 0, c2 = 0;
@@ -440,8 +443,8 @@ DO
 		(c1 ? c2 : c1) = me;
 	}
 	Melder_assert (c1 && c2);
-	praat_new (Configurations_to_AffineTransform_congruence (c1, c2, GET_INTEGER (L"Maximum number of iterations"),
-		GET_REAL (L"Tolerance")), c1 -> name, L"_", c2 -> name);
+	praat_new (Configurations_to_AffineTransform_congruence (c1, c2, GET_INTEGER (U"Maximum number of iterations"),
+		GET_REAL (U"Tolerance")), c1 -> name, U"_", c2 -> name);
 END
 
 DIRECT (Configuration_Weight_to_Similarity_cc)
@@ -449,7 +452,7 @@ DIRECT (Configuration_Weight_to_Similarity_cc)
 	Collection_dontOwnItems (thee.peek());
 	Weight w = 0;
 	LOOP {
-		iam (Data);
+		iam (Daata);
 		if (CLASS == classConfiguration) {
 			Collection_addItem (thee.peek(), me);
 		} else if (CLASS == classWeight) {
@@ -457,101 +460,102 @@ DIRECT (Configuration_Weight_to_Similarity_cc)
 		}
 	}
 	Melder_assert (thy size > 0 && w);
-	praat_new (Configurations_to_Similarity_cc (thee.peek(), w), L"congruence");
+	praat_new (Configurations_to_Similarity_cc (thee.peek(), w), U"congruence");
 END
 
 DIRECT (Configuration_and_AffineTransform_to_Configuration)
 	Configuration me = FIRST (Configuration);
 	AffineTransform at = FIRST_GENERIC (AffineTransform);
-	praat_new (Configuration_and_AffineTransform_to_Configuration (me, at), my name, L"_", at -> name);
+	praat_new (Configuration_and_AffineTransform_to_Configuration (me, at), my name, U"_", at -> name);
 END
 
 /*************** Confusion *********************************/
 
-FORM (Confusion_to_Dissimilarity_pdf, L"Confusion: To Dissimilarity (pdf)", L"Confusion: To Dissimilarity (pdf)...")
-	POSITIVE (L"Minimum confusion level", L"0.5")
+FORM (Confusion_to_Dissimilarity_pdf, U"Confusion: To Dissimilarity (pdf)", U"Confusion: To Dissimilarity (pdf)...")
+	POSITIVE (U"Minimum confusion level", U"0.5")
 	OK
 DO
 	LOOP {
 		iam (Confusion);
-		praat_new (Confusion_to_Dissimilarity_pdf (me, GET_REAL (L"Minimum confusion level")), my name, L"_pdf");
+		praat_new (Confusion_to_Dissimilarity_pdf (me, GET_REAL (U"Minimum confusion level")), my name, U"_pdf");
 	}
 END
 
-FORM (Confusion_to_Similarity, L"Confusion: To Similarity", L"Confusion: To Similarity...")
-	BOOLEAN (L"Normalize", 1)
-	RADIO (L"Symmetrization", 1)
-	RADIOBUTTON (L"No symmetrization")
-	RADIOBUTTON (L"Average (s[i][j] = (c[i][j]+c[j][i])/2)")
-	RADIOBUTTON (L"Houtgast (s[i][j]= sum (min(c[i][k],c[j][k])))")
+FORM (Confusion_to_Similarity, U"Confusion: To Similarity", U"Confusion: To Similarity...")
+	BOOLEAN (U"Normalize", 1)
+	RADIO (U"Symmetrization", 1)
+	RADIOBUTTON (U"No symmetrization")
+	RADIOBUTTON (U"Average (s[i][j] = (c[i][j]+c[j][i])/2)")
+	RADIOBUTTON (U"Houtgast (s[i][j]= sum (min(c[i][k],c[j][k])))")
 	OK
 DO
 	LOOP {
 		iam (Confusion);
-		praat_new (Confusion_to_Similarity (me, GET_INTEGER (L"Normalize"), GET_INTEGER (L"Symmetrization")), my name);
+		praat_new (Confusion_to_Similarity (me, GET_INTEGER (U"Normalize"), GET_INTEGER (U"Symmetrization")), my name);
 	}
 END
 
 DIRECT (Confusions_sum)
 	autoConfusions me = (Confusions) praat_getSelectedObjects ();
-	praat_new (Confusions_sum (me.peek()), L"sum");
+	praat_new (Confusions_sum (me.peek()), U"sum");
 END
 
 DIRECT (Confusion_to_ContingencyTable)
 	LOOP {
 		iam (Confusion);
-		praat_new (Confusion_to_ContingencyTable (me), my name);
+		autoContingencyTable thee = Confusion_to_ContingencyTable (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 /*************** ContingencyTable *********************************/
 
 
-FORM (ContingencyTable_to_Configuration_ca, L"ContingencyTable: To Configuration (ca)", L"ContingencyTable: To Configuration (ca)...")
-	NATURAL (L"Number of dimensions", L"2")
-	RADIO (L"Scaling of final configuration", 3)
-	RADIOBUTTON (L"Row points in centre of gravity of column points")
-	RADIOBUTTON (L"Column points in centre of gravity of row points")
-	RADIOBUTTON (L"Row points and column points symmetric")
+FORM (ContingencyTable_to_Configuration_ca, U"ContingencyTable: To Configuration (ca)", U"ContingencyTable: To Configuration (ca)...")
+	NATURAL (U"Number of dimensions", U"2")
+	RADIO (U"Scaling of final configuration", 3)
+	RADIOBUTTON (U"Row points in centre of gravity of column points")
+	RADIOBUTTON (U"Column points in centre of gravity of row points")
+	RADIOBUTTON (U"Row points and column points symmetric")
 	OK
 DO
 	LOOP {
 		iam (ContingencyTable);
-		praat_new (ContingencyTable_to_Configuration_ca (me, GET_INTEGER (L"Number of dimensions"),
-			GET_INTEGER (L"Scaling of final configuration")), my name);
+		praat_new (ContingencyTable_to_Configuration_ca (me, GET_INTEGER (U"Number of dimensions"),
+			GET_INTEGER (U"Scaling of final configuration")), my name);
 	}
 END
 
 DIRECT (ContingencyTable_chisqProbability)
 	LOOP {
 		iam (ContingencyTable);
-		Melder_information (Melder_double (ContingencyTable_chisqProbability (me)));
+		Melder_information (ContingencyTable_chisqProbability (me));
 	}
 END
 
 DIRECT (ContingencyTable_cramersStatistic)
 	LOOP {
 		iam (ContingencyTable);
-		Melder_information (Melder_double (ContingencyTable_cramersStatistic (me)));
+		Melder_information (ContingencyTable_cramersStatistic (me));
 	}
 END
 
 DIRECT (ContingencyTable_contingencyCoefficient)
 	LOOP {
 		iam (ContingencyTable);
-		Melder_information (Melder_double (ContingencyTable_contingencyCoefficient (me)));
+		Melder_information (ContingencyTable_contingencyCoefficient (me));
 	}
 END
 
 /************************* Correlation ***********************************/
 
-FORM (Correlation_to_Configuration, L"Correlation: To Configuration", 0)
-	NATURAL (L"Number of dimensions", L"2")
+FORM (Correlation_to_Configuration, U"Correlation: To Configuration", 0)
+	NATURAL (U"Number of dimensions", U"2")
 	OK
 DO
 	LOOP {
 		iam (Correlation);
-		praat_new (Correlation_to_Configuration (me, GET_INTEGER (L"Number of dimensions")), my name);
+		praat_new (Correlation_to_Configuration (me, GET_INTEGER (U"Number of dimensions")), my name);
 	}
 END
 
@@ -559,77 +563,76 @@ END
 /************************* Similarity ***************************************/
 
 DIRECT (Similarity_help)
-	Melder_help (L"Similarity");
+	Melder_help (U"Similarity");
 END
 
-FORM (Similarity_to_Dissimilarity, L"Similarity: To Dissimilarity", L"Similarity: To Dissimilarity...")
-	REAL (L"Maximum dissimilarity", L"0.0 (=from data)")
+FORM (Similarity_to_Dissimilarity, U"Similarity: To Dissimilarity", U"Similarity: To Dissimilarity...")
+	REAL (U"Maximum dissimilarity", U"0.0 (=from data)")
 	OK
 DO
 	LOOP {
 		iam (Similarity);
-		praat_new (Similarity_to_Dissimilarity (me, GET_REAL (L"Maximum dissimilarity")), my name);
+		praat_new (Similarity_to_Dissimilarity (me, GET_REAL (U"Maximum dissimilarity")), my name);
 	}
 END
 
 /**************** Dissimilarity ***************************************/
 
-static void Dissimilarity_to_Configuration_addCommonFields (void *dia) {
-	LABEL (L"", L"Minimization parameters")
-	REAL (L"Tolerance", L"1e-5")
-	NATURAL (L"Maximum number of iterations", L"50 (= each repetition)")
-	NATURAL (L"Number of repetitions", L"1")
+static void Dissimilarity_to_Configuration_addCommonFields (UiForm dia) {
+	LABEL (U"", U"Minimization parameters")
+	REAL (U"Tolerance", U"1e-5")
+	NATURAL (U"Maximum number of iterations", U"50 (= each repetition)")
+	NATURAL (U"Number of repetitions", U"1")
 }
 
-static void Dissimilarity_and_Configuration_getStress_addCommonFields (void *dia, void *radio) {
-	RADIO (L"Stress measure", 1)
-	RADIOBUTTON (L"Normalized")
-	RADIOBUTTON (L"Kruskal's stress-1")
-	RADIOBUTTON (L"Kruskal's stress-2")
-	RADIOBUTTON (L"Raw")
+static void Dissimilarity_and_Configuration_getStress_addCommonFields (UiForm dia, void *radio) {
+	RADIO (U"Stress measure", 1)
+	RADIOBUTTON (U"Normalized")
+	RADIOBUTTON (U"Kruskal's stress-1")
+	RADIOBUTTON (U"Kruskal's stress-2")
+	RADIOBUTTON (U"Raw")
 }
 
-static void Dissimilarity_Configuration_drawDiagram_addCommonFields (void *dia) {
-	REAL (L"left Proximity range", L"0.0")
-	REAL (L"right Proximity range", L"0.0")
-	REAL (L"left Distance range", L"0.0")
-	REAL (L"right Distance range", L"0.0")
-	POSITIVE (L"Mark size (mm)", L"1.0")
-	SENTENCE (L"Mark string (+xo.)", L"+")
-	BOOLEAN (L"Garnish", 1)
+static void Dissimilarity_Configuration_drawDiagram_addCommonFields (UiForm dia) {
+	REAL (U"left Proximity range", U"0.0")
+	REAL (U"right Proximity range", U"0.0")
+	REAL (U"left Distance range", U"0.0")
+	REAL (U"right Distance range", U"0.0")
+	POSITIVE (U"Mark size (mm)", U"1.0")
+	SENTENCE (U"Mark string (+xo.)", U"+")
+	BOOLEAN (U"Garnish", 1)
 }
 
 DIRECT (Dissimilarity_help)
-	Melder_help (L"Dissimilarity");
+	Melder_help (U"Dissimilarity");
 END
 
 DIRECT (Dissimilarity_getAdditiveConstant)
 	LOOP {
 		iam (Dissimilarity);
-		double c;
-		Dissimilarity_getAdditiveConstant (me, &c);
-		Melder_information (Melder_double (c));
+		double c = Dissimilarity_getAdditiveConstant (me);
+		Melder_information (c);
 	}
 END
 
-FORM (Dissimilarity_Configuration_kruskal, L"Dissimilarity & Configuration: To Configuration (kruskal)", L"Dissimilarity & Configuration: To Configuration (kruskal)...")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach")
-	RADIOBUTTON (L"Secondary approach")
-	RADIO (L"Stress calculation", 1)
-	RADIOBUTTON (L"Formula1")
-	RADIOBUTTON (L"Formula2")
+FORM (Dissimilarity_Configuration_kruskal, U"Dissimilarity & Configuration: To Configuration (kruskal)", U"Dissimilarity & Configuration: To Configuration (kruskal)...")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach")
+	RADIOBUTTON (U"Secondary approach")
+	RADIO (U"Stress calculation", 1)
+	RADIOBUTTON (U"Formula1")
+	RADIOBUTTON (U"Formula2")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
-	praat_new (Dissimilarity_Configuration_kruskal (me, c, GET_INTEGER (L"Handling of ties"), GET_INTEGER (L"Stress calculation"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions")), my name, L"_kruskal");
+	praat_new (Dissimilarity_Configuration_kruskal (me, c, GET_INTEGER (U"Handling of ties"), GET_INTEGER (U"Stress calculation"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions")), my name, U"_kruskal");
 END
 
-FORM (Dissimilarity_Configuration_absolute_mds, L"Dissimilarity & Configuration: To Configuration (absolute mds)", L"Dissimilarity & Configuration: To Configuration (absolute mds)...")
+FORM (Dissimilarity_Configuration_absolute_mds, U"Dissimilarity & Configuration: To Configuration (absolute mds)", U"Dissimilarity & Configuration: To Configuration (absolute mds)...")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
@@ -637,11 +640,11 @@ DO
 	Configuration c = FIRST (Configuration);
 	int showProgress = 1;
 	praat_new (Dissimilarity_Configuration_Weight_absolute_mds (me, c, 0,
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_absolute");
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_absolute");
 END
 
-FORM (Dissimilarity_Configuration_ratio_mds, L"Dissimilarity & Configuration: To Configuration (ratio mds)", L"Dissimilarity & Configuration: To Configuration (ratio mds)...")
+FORM (Dissimilarity_Configuration_ratio_mds, U"Dissimilarity & Configuration: To Configuration (ratio mds)", U"Dissimilarity & Configuration: To Configuration (ratio mds)...")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
@@ -649,11 +652,11 @@ DO
 	Configuration c = FIRST (Configuration);
 	int showProgress = 1;
 	praat_new (Dissimilarity_Configuration_Weight_ratio_mds (me, c, 0,
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_ratio");
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_ratio");
 END
 
-FORM (Dissimilarity_Configuration_interval_mds, L"Dissimilarity & Configuration: To Configuration (interval mds)", L"Dissimilarity & Configuration: To Configuration (interval mds)...")
+FORM (Dissimilarity_Configuration_interval_mds, U"Dissimilarity & Configuration: To Configuration (interval mds)", U"Dissimilarity & Configuration: To Configuration (interval mds)...")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
@@ -661,14 +664,14 @@ DO
 	Configuration c = FIRST (Configuration);
 	int showProgress = 1;
 	praat_new (Dissimilarity_Configuration_Weight_interval_mds (me, c, 0,
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_interval");
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_interval");
 END
 
-FORM (Dissimilarity_Configuration_monotone_mds, L"Dissimilarity & Configuration: To Configuration (monotone mds)", L"Dissimilarity & Configuration: To Configuration (monotone mds)...")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach")
-	RADIOBUTTON (L"Secondary approach")
+FORM (Dissimilarity_Configuration_monotone_mds, U"Dissimilarity & Configuration: To Configuration (monotone mds)", U"Dissimilarity & Configuration: To Configuration (monotone mds)...")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach")
+	RADIOBUTTON (U"Secondary approach")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
@@ -676,14 +679,14 @@ DO
 	Configuration c = FIRST (Configuration);
 	int showProgress = 1;
 	praat_new (Dissimilarity_Configuration_Weight_monotone_mds (me, c, 0,
-		GET_INTEGER (L"Handling of ties"), GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_monotone");
+		GET_INTEGER (U"Handling of ties"), GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_monotone");
 END
 
-FORM (Dissimilarity_Configuration_ispline_mds, L"Dissimilarity & Configuration: To Configuration (i-spline mds)", L"Dissimilarity & Configuration: To Configuration (i-spline mds)...")
-	LABEL (L"", L"Spline smoothing")
-	INTEGER (L"Number of interior knots", L"1")
-	INTEGER (L"Order of I-spline", L"1")
+FORM (Dissimilarity_Configuration_ispline_mds, U"Dissimilarity & Configuration: To Configuration (i-spline mds)", U"Dissimilarity & Configuration: To Configuration (i-spline mds)...")
+	LABEL (U"", U"Spline smoothing")
+	INTEGER (U"Number of interior knots", U"1")
+	INTEGER (U"Order of I-spline", U"1")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
@@ -691,12 +694,12 @@ DO
 	Configuration c = FIRST (Configuration);
 	int showProgress = 1;
 	praat_new (Dissimilarity_Configuration_Weight_ispline_mds (me, c, 0,
-		GET_INTEGER (L"Number of interior knots"), GET_INTEGER (L"Order of I-spline"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_ispline");
+		GET_INTEGER (U"Number of interior knots"), GET_INTEGER (U"Order of I-spline"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_ispline");
 END
 
-FORM (Dissimilarity_Configuration_Weight_absolute_mds, L"Dissimilarity & Configuration & Weight: To Configuration (absolute mds)", L"Dissimilarity & Configuration & Weight: To Configuration...")
+FORM (Dissimilarity_Configuration_Weight_absolute_mds, U"Dissimilarity & Configuration & Weight: To Configuration (absolute mds)", U"Dissimilarity & Configuration & Weight: To Configuration...")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
@@ -705,11 +708,11 @@ DO
 	Weight w = FIRST (Weight);
 	int showProgress = 1;
 	praat_new (Dissimilarity_Configuration_Weight_absolute_mds (me, c, w,
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_w_absolute");
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_w_absolute");
 END
 
-FORM (Dissimilarity_Configuration_Weight_ratio_mds, L"Dissimilarity & Configuration & Weight: To Configuration (ratio mds)", L"Dissimilarity & Configuration & Weight: To Configuration...")
+FORM (Dissimilarity_Configuration_Weight_ratio_mds, U"Dissimilarity & Configuration & Weight: To Configuration (ratio mds)", U"Dissimilarity & Configuration & Weight: To Configuration...")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
@@ -718,11 +721,11 @@ DO
 	Weight w = FIRST (Weight);
 	int showProgress = 1;
 	praat_new (Dissimilarity_Configuration_Weight_ratio_mds (me, c, w,
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_w_ratio");
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_w_ratio");
 END
 
-FORM (Dissimilarity_Configuration_Weight_interval_mds, L"Dissimilarity & Configuration & Weight: To Configuration (interval mds)", L"Dissimilarity & Configuration & Weight: To Configuration...")
+FORM (Dissimilarity_Configuration_Weight_interval_mds, U"Dissimilarity & Configuration & Weight: To Configuration (interval mds)", U"Dissimilarity & Configuration & Weight: To Configuration...")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
@@ -731,16 +734,16 @@ DO
 	Weight w = FIRST (Weight);
 	int showProgress = 1;
 	praat_new (Dissimilarity_Configuration_Weight_interval_mds (me, c, w,
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_w_interval");
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_w_interval");
 END
 
 FORM (Dissimilarity_Configuration_Weight_monotone_mds,
-      L"Dissimilarity & Configuration & Weight: To Configuration (monotone mds)",
-      L"Dissimilarity & Configuration & Weight: To Configuration...")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach")
-	RADIOBUTTON (L"Secondary approach")
+      U"Dissimilarity & Configuration & Weight: To Configuration (monotone mds)",
+      U"Dissimilarity & Configuration & Weight: To Configuration...")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach")
+	RADIOBUTTON (U"Secondary approach")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
@@ -749,17 +752,17 @@ DO
 	Weight w = FIRST (Weight);
 	int showProgress = 1;
 	praat_new (Dissimilarity_Configuration_Weight_monotone_mds (me, c, w,
-		GET_INTEGER (L"Handling of ties"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_sw_monotone");
+		GET_INTEGER (U"Handling of ties"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_sw_monotone");
 END
 
 FORM (Dissimilarity_Configuration_Weight_ispline_mds,
-      L"Dissimilarity & Configuration & Weight: To Configuration (i-spline mds)",
-      L"Dissimilarity & Configuration & Weight: To Configuration...")
-	LABEL (L"", L"Spline smoothing")
-	INTEGER (L"Number of interior knots", L"1")
-	INTEGER (L"Order of I-spline", L"1")
+      U"Dissimilarity & Configuration & Weight: To Configuration (i-spline mds)",
+      U"Dissimilarity & Configuration & Weight: To Configuration...")
+	LABEL (U"", U"Spline smoothing")
+	INTEGER (U"Number of interior knots", U"1")
+	INTEGER (U"Order of I-spline", U"1")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
@@ -768,163 +771,163 @@ DO
 	Weight w = FIRST (Weight);
 	int showProgress = 1;
 	praat_new (Dissimilarity_Configuration_Weight_ispline_mds (me, c, w,
-		GET_INTEGER (L"Number of interior knots"), GET_INTEGER (L"Order of I-spline"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_sw_ispline");
+		GET_INTEGER (U"Number of interior knots"), GET_INTEGER (U"Order of I-spline"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_sw_ispline");
 END
 
-FORM (Dissimilarity_Configuration_getStress, L"Dissimilarity & Configuration: Get stress",
-      L"Dissimilarity & Configuration: get stress")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach")
-	RADIOBUTTON (L"Secondary approach")
-	RADIO (L"Stress calculation", 1)
-	RADIOBUTTON (L"Formula1")
-	RADIOBUTTON (L"Formula2")
+FORM (Dissimilarity_Configuration_getStress, U"Dissimilarity & Configuration: Get stress",
+      U"Dissimilarity & Configuration: get stress")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach")
+	RADIOBUTTON (U"Secondary approach")
+	RADIO (U"Stress calculation", 1)
+	RADIOBUTTON (U"Formula1")
+	RADIOBUTTON (U"Formula2")
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
-	Melder_information (Melder_double (Dissimilarity_Configuration_getStress (me, c,
-		GET_INTEGER (L"Handling of ties"), GET_INTEGER (L"Stress calculation"))));
+	Melder_information (Dissimilarity_Configuration_getStress (me, c,
+		GET_INTEGER (U"Handling of ties"), GET_INTEGER (U"Stress calculation")));
 END
 
 FORM (Dissimilarity_Configuration_absolute_stress,
-      L"Dissimilarity & Configuration: Get stress (absolute mds)",
-      L"Dissimilarity & Configuration: Get stress (absolute mds)...")
+      U"Dissimilarity & Configuration: Get stress (absolute mds)",
+      U"Dissimilarity & Configuration: Get stress (absolute mds)...")
 	Dissimilarity_and_Configuration_getStress_addCommonFields (dia, radio);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
-	Melder_information (Melder_double (Dissimilarity_Configuration_Weight_absolute_stress (me, c, 0,
-		GET_INTEGER (L"Stress measure"))));
+	Melder_information (Dissimilarity_Configuration_Weight_absolute_stress (me, c, 0,
+		GET_INTEGER (U"Stress measure")));
 END
 
-FORM (Dissimilarity_Configuration_ratio_stress, L"Dissimilarity & Configuration: Get stress (ratio mds)",
-      L"Dissimilarity & Configuration: Get stress (ratio mds)...")
+FORM (Dissimilarity_Configuration_ratio_stress, U"Dissimilarity & Configuration: Get stress (ratio mds)",
+      U"Dissimilarity & Configuration: Get stress (ratio mds)...")
 	Dissimilarity_and_Configuration_getStress_addCommonFields (dia, radio);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
-	Melder_information (Melder_double (Dissimilarity_Configuration_Weight_ratio_stress (me, c, 0,
-		GET_INTEGER (L"Stress measure"))));
+	Melder_information (Dissimilarity_Configuration_Weight_ratio_stress (me, c, 0,
+		GET_INTEGER (U"Stress measure")));
 END
 
 FORM (Dissimilarity_Configuration_interval_stress,
-      L"Dissimilarity & Configuration: Get stress (interval mds)",
-      L"Dissimilarity & Configuration: Get stress (interval mds)...")
+      U"Dissimilarity & Configuration: Get stress (interval mds)",
+      U"Dissimilarity & Configuration: Get stress (interval mds)...")
 	Dissimilarity_and_Configuration_getStress_addCommonFields (dia, radio);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
-	Melder_information (Melder_double (Dissimilarity_Configuration_Weight_interval_stress (me, c, 0,
-		GET_INTEGER (L"Stress measure"))));
+	Melder_information (Dissimilarity_Configuration_Weight_interval_stress (me, c, 0,
+		GET_INTEGER (U"Stress measure")));
 END
 
 FORM (Dissimilarity_Configuration_monotone_stress,
-      L"Dissimilarity & Configuration: Get stress (monotone mds)",
-      L"Dissimilarity & Configuration: Get stress (monotone mds)...")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach")
-	RADIOBUTTON (L"Secondary approach")
+      U"Dissimilarity & Configuration: Get stress (monotone mds)",
+      U"Dissimilarity & Configuration: Get stress (monotone mds)...")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach")
+	RADIOBUTTON (U"Secondary approach")
 	Dissimilarity_and_Configuration_getStress_addCommonFields (dia, radio);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
-	Melder_information (Melder_double (Dissimilarity_Configuration_Weight_monotone_stress (me, c, 0,
-		GET_INTEGER (L"Handling of ties"), GET_INTEGER (L"Stress measure"))));
+	Melder_information (Dissimilarity_Configuration_Weight_monotone_stress (me, c, 0,
+		GET_INTEGER (U"Handling of ties"), GET_INTEGER (U"Stress measure")));
 END
 
 FORM (Dissimilarity_Configuration_ispline_stress,
-      L"Dissimilarity & Configuration: Get stress (i-spline mds)",
-      L"Dissimilarity & Configuration: Get stress (i-spline mds)...")
-	INTEGER (L"Number of interior knots", L"1")
-	INTEGER (L"Order of I-spline", L"3")
+      U"Dissimilarity & Configuration: Get stress (i-spline mds)",
+      U"Dissimilarity & Configuration: Get stress (i-spline mds)...")
+	INTEGER (U"Number of interior knots", U"1")
+	INTEGER (U"Order of I-spline", U"3")
 	Dissimilarity_and_Configuration_getStress_addCommonFields (dia, radio);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
-	Melder_information (Melder_double (Dissimilarity_Configuration_Weight_ispline_stress (me, c, 0,
-		GET_INTEGER (L"Number of interior knots"), GET_INTEGER (L"Order of I-spline"), GET_INTEGER (L"Stress measure"))));
+	Melder_information (Dissimilarity_Configuration_Weight_ispline_stress (me, c, 0,
+		GET_INTEGER (U"Number of interior knots"), GET_INTEGER (U"Order of I-spline"), GET_INTEGER (U"Stress measure")));
 END
 
 FORM (Dissimilarity_Configuration_Weight_absolute_stress,
-      L"Dissimilarity & Configuration & Weight: Get stress (absolute mds)",
-      L"Dissimilarity & Configuration & Weight: Get stress (absolute mds)...")
+      U"Dissimilarity & Configuration & Weight: Get stress (absolute mds)",
+      U"Dissimilarity & Configuration & Weight: Get stress (absolute mds)...")
 	Dissimilarity_and_Configuration_getStress_addCommonFields (dia, radio);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Weight w = FIRST (Weight);
-	Melder_information (Melder_double (Dissimilarity_Configuration_Weight_absolute_stress (me, c, w,
-		GET_INTEGER (L"Stress measure"))));
+	Melder_information (Dissimilarity_Configuration_Weight_absolute_stress (me, c, w,
+		GET_INTEGER (U"Stress measure")));
 END
 
 FORM (Dissimilarity_Configuration_Weight_ratio_stress,
-      L"Dissimilarity & Configuration & Weight: Get stress (ratio mds)",
-      L"Dissimilarity & Configuration & Weight: Get stress (ratio mds)...")
+      U"Dissimilarity & Configuration & Weight: Get stress (ratio mds)",
+      U"Dissimilarity & Configuration & Weight: Get stress (ratio mds)...")
 	Dissimilarity_and_Configuration_getStress_addCommonFields (dia, radio);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Weight w = FIRST (Weight);
-	Melder_information (Melder_double (Dissimilarity_Configuration_Weight_ratio_stress (me, c, w,
-		GET_INTEGER (L"Stress measure"))));
+	Melder_information (Dissimilarity_Configuration_Weight_ratio_stress (me, c, w,
+		GET_INTEGER (U"Stress measure")));
 END
 
 FORM (Dissimilarity_Configuration_Weight_interval_stress,
-      L"Dissimilarity & Configuration & Weight: Get stress (interval mds)",
-      L"Dissimilarity & Configuration & Weight: Get stress (interval mds)...")
+      U"Dissimilarity & Configuration & Weight: Get stress (interval mds)",
+      U"Dissimilarity & Configuration & Weight: Get stress (interval mds)...")
 	Dissimilarity_and_Configuration_getStress_addCommonFields (dia, radio);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Weight w = FIRST (Weight);
-	Melder_information (Melder_double (Dissimilarity_Configuration_Weight_interval_stress (me, c, w,
-		GET_INTEGER (L"Stress measure"))));
+	Melder_information (Dissimilarity_Configuration_Weight_interval_stress (me, c, w,
+		GET_INTEGER (U"Stress measure")));
 END
 
 FORM (Dissimilarity_Configuration_Weight_monotone_stress,
-      L"Dissimilarity & Configuration & Weight: Get stress (monotone mds)",
-      L"Dissimilarity & Configuration & Weight: Get stress (monotone mds)...")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach)")
-	RADIOBUTTON (L"Secondary approach")
+      U"Dissimilarity & Configuration & Weight: Get stress (monotone mds)",
+      U"Dissimilarity & Configuration & Weight: Get stress (monotone mds)...")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach)")
+	RADIOBUTTON (U"Secondary approach")
 	Dissimilarity_and_Configuration_getStress_addCommonFields (dia, radio);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Weight w = FIRST (Weight);
-	Melder_information (Melder_double (Dissimilarity_Configuration_Weight_monotone_stress (me, c, w,
-		GET_INTEGER (L"Handling of ties"), GET_INTEGER (L"Stress measure"))));
+	Melder_information (Dissimilarity_Configuration_Weight_monotone_stress (me, c, w,
+		GET_INTEGER (U"Handling of ties"), GET_INTEGER (U"Stress measure")));
 END
 
 FORM (Dissimilarity_Configuration_Weight_ispline_stress,
-      L"Dissimilarity & Configuration & Weight: Get stress (i-spline mds)",
-      L"Dissimilarity & Configuration & Weight: Get stress (i-spline mds)...")
-	INTEGER (L"Number of interior knots", L"1")
-	INTEGER (L"Order of I-spline", L"3")
+      U"Dissimilarity & Configuration & Weight: Get stress (i-spline mds)",
+      U"Dissimilarity & Configuration & Weight: Get stress (i-spline mds)...")
+	INTEGER (U"Number of interior knots", U"1")
+	INTEGER (U"Order of I-spline", U"3")
 	Dissimilarity_and_Configuration_getStress_addCommonFields (dia, radio);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Weight w = FIRST (Weight);
-	Melder_information (Melder_double (Dissimilarity_Configuration_Weight_ispline_stress (me, c, w,
-		GET_INTEGER (L"Number of interior knots"), GET_INTEGER (L"Order of I-spline"), GET_INTEGER (L"Stress measure"))));
+	Melder_information (Dissimilarity_Configuration_Weight_ispline_stress (me, c, w,
+		GET_INTEGER (U"Number of interior knots"), GET_INTEGER (U"Order of I-spline"), GET_INTEGER (U"Stress measure")));
 END
 
-FORM (Dissimilarity_Configuration_drawShepardDiagram, L"Dissimilarity & Configuration: Draw Shepard diagram",
-      L"Dissimilarity & Configuration: Draw Shepard diagram...")
+FORM (Dissimilarity_Configuration_drawShepardDiagram, U"Dissimilarity & Configuration: Draw Shepard diagram",
+      U"Dissimilarity & Configuration: Draw Shepard diagram...")
 	Dissimilarity_Configuration_drawDiagram_addCommonFields (dia);
 	OK
 DO
@@ -932,15 +935,15 @@ DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Dissimilarity_Configuration_drawShepardDiagram (me, c, GRAPHICS,
-		GET_REAL (L"left Proximity range"), GET_REAL (L"right Proximity range"),
-		GET_REAL (L"left Distance range"), GET_REAL (L"right Distance range"),
-		GET_REAL (L"Mark size"), GET_STRING (L"Mark string"),
-		GET_INTEGER (L"Garnish"));
+		GET_REAL (U"left Proximity range"), GET_REAL (U"right Proximity range"),
+		GET_REAL (U"left Distance range"), GET_REAL (U"right Distance range"),
+		GET_REAL (U"Mark size"), GET_STRING (U"Mark string"),
+		GET_INTEGER (U"Garnish"));
 END
 
 FORM (Dissimilarity_Configuration_drawAbsoluteRegression,
-      L"Dissimilarity & Configuration: Draw regression (absolute mds)",
-      L"Dissimilarity & Configuration: Draw regression (absolute mds)...")
+      U"Dissimilarity & Configuration: Draw regression (absolute mds)",
+      U"Dissimilarity & Configuration: Draw regression (absolute mds)...")
 	Dissimilarity_Configuration_drawDiagram_addCommonFields (dia);
 	OK
 DO
@@ -948,15 +951,15 @@ DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Dissimilarity_Configuration_Weight_drawAbsoluteRegression (me, c, 0, GRAPHICS,
-		GET_REAL (L"left Proximity range"), GET_REAL (L"right Proximity range"),
-		GET_REAL (L"left Distance range"), GET_REAL (L"right Distance range"),
-		GET_REAL (L"Mark size"), GET_STRING (L"Mark string"),
-		GET_INTEGER (L"Garnish"));
+		GET_REAL (U"left Proximity range"), GET_REAL (U"right Proximity range"),
+		GET_REAL (U"left Distance range"), GET_REAL (U"right Distance range"),
+		GET_REAL (U"Mark size"), GET_STRING (U"Mark string"),
+		GET_INTEGER (U"Garnish"));
 END
 
 FORM (Dissimilarity_Configuration_drawRatioRegression,
-      L"Dissimilarity & Configuration: Draw regression (ratio mds)",
-      L"Dissimilarity & Configuration: Draw regression (ratio mds)...")
+      U"Dissimilarity & Configuration: Draw regression (ratio mds)",
+      U"Dissimilarity & Configuration: Draw regression (ratio mds)...")
 	Dissimilarity_Configuration_drawDiagram_addCommonFields (dia);
 	OK
 DO
@@ -964,14 +967,14 @@ DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Dissimilarity_Configuration_Weight_drawRatioRegression (me, c, 0, GRAPHICS,
-		GET_REAL (L"left Proximity range"), GET_REAL (L"right Proximity range"),
-		GET_REAL (L"left Distance range"), GET_REAL (L"right Distance range"),
-		GET_REAL (L"Mark size"), GET_STRING (L"Mark string"), GET_INTEGER (L"Garnish"));
+		GET_REAL (U"left Proximity range"), GET_REAL (U"right Proximity range"),
+		GET_REAL (U"left Distance range"), GET_REAL (U"right Distance range"),
+		GET_REAL (U"Mark size"), GET_STRING (U"Mark string"), GET_INTEGER (U"Garnish"));
 END
 
 FORM (Dissimilarity_Configuration_drawIntervalRegression,
-      L"Dissimilarity & Configuration: Draw regression (interval mds)",
-      L"Dissimilarity & Configuration: Draw regression (interval mds)...")
+      U"Dissimilarity & Configuration: Draw regression (interval mds)",
+      U"Dissimilarity & Configuration: Draw regression (interval mds)...")
 	Dissimilarity_Configuration_drawDiagram_addCommonFields (dia);
 	OK
 DO
@@ -979,17 +982,17 @@ DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Dissimilarity_Configuration_Weight_drawIntervalRegression (me, c, 0, GRAPHICS,
-		GET_REAL (L"left Proximity range"), GET_REAL (L"right Proximity range"),
-		GET_REAL (L"left Distance range"), GET_REAL (L"right Distance range"),
-		GET_REAL (L"Mark size"), GET_STRING (L"Mark string"), GET_INTEGER (L"Garnish"));
+		GET_REAL (U"left Proximity range"), GET_REAL (U"right Proximity range"),
+		GET_REAL (U"left Distance range"), GET_REAL (U"right Distance range"),
+		GET_REAL (U"Mark size"), GET_STRING (U"Mark string"), GET_INTEGER (U"Garnish"));
 END
 
 FORM (Dissimilarity_Configuration_drawMonotoneRegression,
-      L"Dissimilarity & Configuration: Draw regression (monotone mds)",
-      L"Dissimilarity & Configuration: Draw regression (monotone mds)...")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach)")
-	RADIOBUTTON (L"Secondary approach")
+      U"Dissimilarity & Configuration: Draw regression (monotone mds)",
+      U"Dissimilarity & Configuration: Draw regression (monotone mds)...")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach)")
+	RADIOBUTTON (U"Secondary approach")
 	Dissimilarity_Configuration_drawDiagram_addCommonFields (dia);
 	OK
 DO
@@ -997,16 +1000,16 @@ DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Dissimilarity_Configuration_Weight_drawMonotoneRegression (me, c, 0, GRAPHICS,
-		GET_INTEGER (L"Handling of ties"), GET_REAL (L"left Proximity range"), GET_REAL (L"right Proximity range"),
-		GET_REAL (L"left Distance range"), GET_REAL (L"right Distance range"),
-		GET_REAL (L"Mark size"), GET_STRING (L"Mark string"), GET_INTEGER (L"Garnish"));
+		GET_INTEGER (U"Handling of ties"), GET_REAL (U"left Proximity range"), GET_REAL (U"right Proximity range"),
+		GET_REAL (U"left Distance range"), GET_REAL (U"right Distance range"),
+		GET_REAL (U"Mark size"), GET_STRING (U"Mark string"), GET_INTEGER (U"Garnish"));
 END
 
 FORM (Dissimilarity_Configuration_drawISplineRegression,
-      L"Dissimilarity & Configuration: Draw regression (i-spline mds)",
-      L"Dissimilarity & Configuration: Draw regression (i-spline mds)...")
-	INTEGER (L"Number of interior knots", L"1")
-	INTEGER (L"Order of I-spline", L"3")
+      U"Dissimilarity & Configuration: Draw regression (i-spline mds)",
+      U"Dissimilarity & Configuration: Draw regression (i-spline mds)...")
+	INTEGER (U"Number of interior knots", U"1")
+	INTEGER (U"Order of I-spline", U"3")
 	Dissimilarity_Configuration_drawDiagram_addCommonFields (dia);
 	OK
 DO
@@ -1014,219 +1017,219 @@ DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Configuration c = FIRST (Configuration);
 	Dissimilarity_Configuration_Weight_drawISplineRegression (me, c, 0, GRAPHICS,
-		GET_INTEGER (L"Number of interior knots"), GET_INTEGER (L"Order of I-spline"),
-		GET_REAL (L"left Proximity range"), GET_REAL (L"right Proximity range"),
-		GET_REAL (L"left Distance range"), GET_REAL (L"right Distance range"),
-		GET_REAL (L"Mark size"), GET_STRING (L"Mark string"), GET_INTEGER (L"Garnish"));
-END
-
-FORM (Dissimilarity_kruskal, L"Dissimilarity: To Configuration (kruskal)", L"Dissimilarity: To Configuration (kruskal)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
-	NATURAL (L"Distance metric", L"2 (=Euclidean)")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach")
-	RADIOBUTTON (L"Secondary approach")
-	RADIO (L"Stress calculation", 1)
-	RADIOBUTTON (L"Formula1")
-	RADIOBUTTON (L"Formula2")
+		GET_INTEGER (U"Number of interior knots"), GET_INTEGER (U"Order of I-spline"),
+		GET_REAL (U"left Proximity range"), GET_REAL (U"right Proximity range"),
+		GET_REAL (U"left Distance range"), GET_REAL (U"right Distance range"),
+		GET_REAL (U"Mark size"), GET_STRING (U"Mark string"), GET_INTEGER (U"Garnish"));
+END
+
+FORM (Dissimilarity_kruskal, U"Dissimilarity: To Configuration (kruskal)", U"Dissimilarity: To Configuration (kruskal)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
+	NATURAL (U"Distance metric", U"2 (=Euclidean)")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach")
+	RADIOBUTTON (U"Secondary approach")
+	RADIO (U"Stress calculation", 1)
+	RADIOBUTTON (U"Formula1")
+	RADIOBUTTON (U"Formula2")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	LOOP {
 		iam (Dissimilarity);
-		praat_new (Dissimilarity_kruskal (me, GET_INTEGER (L"Number of dimensions"),
-			GET_INTEGER (L"Distance metric"), GET_INTEGER (L"Handling of ties"),
-			GET_INTEGER (L"Stress calculation"), GET_REAL (L"Tolerance"),
-			GET_INTEGER (L"Maximum number of iterations"), GET_INTEGER (L"Number of repetitions")), my name);
+		praat_new (Dissimilarity_kruskal (me, GET_INTEGER (U"Number of dimensions"),
+			GET_INTEGER (U"Distance metric"), GET_INTEGER (U"Handling of ties"),
+			GET_INTEGER (U"Stress calculation"), GET_REAL (U"Tolerance"),
+			GET_INTEGER (U"Maximum number of iterations"), GET_INTEGER (U"Number of repetitions")), my name);
 	}
 END
 
-FORM (Dissimilarity_absolute_mds, L"Dissimilarity: To Configuration (absolute mds)",
-      L"Dissimilarity: To Configuration (absolute mds)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
+FORM (Dissimilarity_absolute_mds, U"Dissimilarity: To Configuration (absolute mds)",
+      U"Dissimilarity: To Configuration (absolute mds)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	LOOP {
 		iam (Dissimilarity);
 		int showProgress = 1;
-		praat_new (Dissimilarity_Weight_absolute_mds (me, NULL, GET_INTEGER (L"Number of dimensions"),
-			GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-			GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_absolute");
+		praat_new (Dissimilarity_Weight_absolute_mds (me, nullptr, GET_INTEGER (U"Number of dimensions"),
+			GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+			GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_absolute");
 	}
 END
 
-FORM (Dissimilarity_ratio_mds, L"Dissimilarity: To Configuration (ratio mds)",
-      L"Dissimilarity: To Configuration (ratio mds)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
+FORM (Dissimilarity_ratio_mds, U"Dissimilarity: To Configuration (ratio mds)",
+      U"Dissimilarity: To Configuration (ratio mds)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	LOOP {
 		iam (Dissimilarity);
 		int showProgress = 1;
-		praat_new (Dissimilarity_Weight_ratio_mds (me, 0, GET_INTEGER (L"Number of dimensions"),
-			GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-			GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_ratio");
+		praat_new (Dissimilarity_Weight_ratio_mds (me, 0, GET_INTEGER (U"Number of dimensions"),
+			GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+			GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_ratio");
 	}
 END
 
-FORM (Dissimilarity_interval_mds, L"Dissimilarity: To Configuration (interval mds)",
-      L"Dissimilarity: To Configuration (interval mds)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
+FORM (Dissimilarity_interval_mds, U"Dissimilarity: To Configuration (interval mds)",
+      U"Dissimilarity: To Configuration (interval mds)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	LOOP {
 		iam (Dissimilarity);
 		int showProgress = 1;
-		praat_new (Dissimilarity_Weight_interval_mds (me, 0, GET_INTEGER (L"Number of dimensions"),
-			GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-			GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_interval");
+		praat_new (Dissimilarity_Weight_interval_mds (me, 0, GET_INTEGER (U"Number of dimensions"),
+			GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+			GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_interval");
 	}
 END
 
-FORM (Dissimilarity_monotone_mds, L"Dissimilarity: To Configuration (monotone mds)",
-      L"Dissimilarity: To Configuration (monotone mds)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach")
-	RADIOBUTTON (L"Secondary approach")
+FORM (Dissimilarity_monotone_mds, U"Dissimilarity: To Configuration (monotone mds)",
+      U"Dissimilarity: To Configuration (monotone mds)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach")
+	RADIOBUTTON (U"Secondary approach")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	LOOP {
 		iam (Dissimilarity);
 		int showProgress = 1;
-		praat_new (Dissimilarity_Weight_monotone_mds (me, 0, GET_INTEGER (L"Number of dimensions"),
-			GET_INTEGER (L"Handling of ties"),
-			GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-			GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_monotone");
+		praat_new (Dissimilarity_Weight_monotone_mds (me, 0, GET_INTEGER (U"Number of dimensions"),
+			GET_INTEGER (U"Handling of ties"),
+			GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+			GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_monotone");
 	}
 END
 
-FORM (Dissimilarity_ispline_mds, L"Dissimilarity: To Configuration (i-spline mds)",
-      L"Dissimilarity: To Configuration (i-spline mds)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
-	LABEL (L"", L"Spline smoothing")
-	INTEGER (L"Number of interior knots", L"1")
-	INTEGER (L"Order of I-spline", L"1")
+FORM (Dissimilarity_ispline_mds, U"Dissimilarity: To Configuration (i-spline mds)",
+      U"Dissimilarity: To Configuration (i-spline mds)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
+	LABEL (U"", U"Spline smoothing")
+	INTEGER (U"Number of interior knots", U"1")
+	INTEGER (U"Order of I-spline", U"1")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
-	long niknots = GET_INTEGER (L"Number of interior knots");
-	long order = GET_INTEGER (L"Order of I-spline");
+	long niknots = GET_INTEGER (U"Number of interior knots");
+	long order = GET_INTEGER (U"Order of I-spline");
 	if (not (order > 0 || niknots > 0)) {
-		Melder_throw ("Order-zero spline must at least have 1 interior knot.");
+		Melder_throw (U"Order-zero spline must at least have 1 interior knot.");
 	}
 	LOOP {
 		iam (Dissimilarity);
 		int showProgress = 1;
-		praat_new (Dissimilarity_Weight_ispline_mds (me, 0, GET_INTEGER (L"Number of dimensions"), niknots, order,
-			GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-			GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_ispline");
+		praat_new (Dissimilarity_Weight_ispline_mds (me, 0, GET_INTEGER (U"Number of dimensions"), niknots, order,
+			GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+			GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_ispline");
 	}
 END
 
-FORM (Dissimilarity_Weight_ispline_mds, L"Dissimilarity & Weight: To Configuration (i-spline mds)",
-      L"Dissimilarity & Weight: To Configuration (i-spline mds)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
-	LABEL (L"", L"Spline smoothing")
-	INTEGER (L"Number of interior knots", L"1")
-	INTEGER (L"Order of I-spline", L"1")
+FORM (Dissimilarity_Weight_ispline_mds, U"Dissimilarity & Weight: To Configuration (i-spline mds)",
+      U"Dissimilarity & Weight: To Configuration (i-spline mds)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
+	LABEL (U"", U"Spline smoothing")
+	INTEGER (U"Number of interior knots", U"1")
+	INTEGER (U"Order of I-spline", U"1")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Weight w = FIRST (Weight);
 	int showProgress = 1;
-	long niknots = GET_INTEGER (L"Number of interior knots");
-	long order = GET_INTEGER (L"Order of I-spline");
+	long niknots = GET_INTEGER (U"Number of interior knots");
+	long order = GET_INTEGER (U"Order of I-spline");
 	if (not (order > 0 || niknots > 0)) {
-		Melder_throw ("Order-zero spline must at least have 1 interior knot.");
+		Melder_throw (U"Order-zero spline must at least have 1 interior knot.");
 	}
-	praat_new (Dissimilarity_Weight_ispline_mds (me, w, GET_INTEGER (L"Number of dimensions"), niknots, order,
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_ispline");
+	praat_new (Dissimilarity_Weight_ispline_mds (me, w, GET_INTEGER (U"Number of dimensions"), niknots, order,
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_ispline");
 END
 
-FORM (Dissimilarity_Weight_absolute_mds, L"Dissimilarity & Weight: To Configuration (absolute mds)",
-      L"Dissimilarity & Weight: To Configuration (absolute mds)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
+FORM (Dissimilarity_Weight_absolute_mds, U"Dissimilarity & Weight: To Configuration (absolute mds)",
+      U"Dissimilarity & Weight: To Configuration (absolute mds)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Weight w = FIRST (Weight);
 	int showProgress = 1;
-	praat_new (Dissimilarity_Weight_absolute_mds (me, w, GET_INTEGER (L"Number of dimensions"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_absolute");
+	praat_new (Dissimilarity_Weight_absolute_mds (me, w, GET_INTEGER (U"Number of dimensions"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_absolute");
 END
 
-FORM (Dissimilarity_Weight_ratio_mds, L"Dissimilarity & Weight: To Configuration (ratio mds)",
-      L"Dissimilarity & Weight: To Configuration (ratio mds)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
+FORM (Dissimilarity_Weight_ratio_mds, U"Dissimilarity & Weight: To Configuration (ratio mds)",
+      U"Dissimilarity & Weight: To Configuration (ratio mds)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Weight w = FIRST (Weight);
 	int showProgress = 1;
-	praat_new (Dissimilarity_Weight_ratio_mds (me, w, GET_INTEGER (L"Number of dimensions"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_absolute");
+	praat_new (Dissimilarity_Weight_ratio_mds (me, w, GET_INTEGER (U"Number of dimensions"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_absolute");
 END
 
-FORM (Dissimilarity_Weight_interval_mds, L"Dissimilarity & Weight: To Configuration (interval mds)",
-      L"Dissimilarity & Weight: To Configuration (interval mds)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
+FORM (Dissimilarity_Weight_interval_mds, U"Dissimilarity & Weight: To Configuration (interval mds)",
+      U"Dissimilarity & Weight: To Configuration (interval mds)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Weight w = FIRST (Weight);
 	int showProgress = 1;
-	praat_new (Dissimilarity_Weight_interval_mds (me, w, GET_INTEGER (L"Number of dimensions"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_absolute");
-END
-
-FORM (Dissimilarity_Weight_monotone_mds, L"Dissimilarity & Weight: To Configuration (monotone mds)",
-      L"Dissimilarity & Weight: To Configuration (monotone mds)...")
-	LABEL (L"", L"Configuration")
-	NATURAL (L"Number of dimensions", L"2")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach")
-	RADIOBUTTON (L"Secondary approach")
+	praat_new (Dissimilarity_Weight_interval_mds (me, w, GET_INTEGER (U"Number of dimensions"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_absolute");
+END
+
+FORM (Dissimilarity_Weight_monotone_mds, U"Dissimilarity & Weight: To Configuration (monotone mds)",
+      U"Dissimilarity & Weight: To Configuration (monotone mds)...")
+	LABEL (U"", U"Configuration")
+	NATURAL (U"Number of dimensions", U"2")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach")
+	RADIOBUTTON (U"Secondary approach")
 	Dissimilarity_to_Configuration_addCommonFields (dia);
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Weight w = FIRST (Weight);
 	int showProgress = 1;
-	praat_new (Dissimilarity_Weight_monotone_mds (me, w, GET_INTEGER (L"Number of dimensions"),
-		GET_INTEGER (L"Handling of ties"), GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"),
-		GET_INTEGER (L"Number of repetitions"), showProgress), my name, L"_monotone");
+	praat_new (Dissimilarity_Weight_monotone_mds (me, w, GET_INTEGER (U"Number of dimensions"),
+		GET_INTEGER (U"Handling of ties"), GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"),
+		GET_INTEGER (U"Number of repetitions"), showProgress), my name, U"_monotone");
 END
 
-FORM (Dissimilarity_to_Distance, L"Dissimilarity: To Distance", L"Dissimilarity: To Distance...")
-	BOOLEAN (L"Scale (additive constant)", 1)
+FORM (Dissimilarity_to_Distance, U"Dissimilarity: To Distance", U"Dissimilarity: To Distance...")
+	BOOLEAN (U"Scale (additive constant)", 1)
 	OK
 DO
 	LOOP {
 		iam (Dissimilarity);
-		praat_new (Dissimilarity_to_Distance (me, GET_INTEGER (L"Scale")), my name);
+		praat_new (Dissimilarity_to_Distance (me, GET_INTEGER (U"Scale")), my name);
 	}
 END
 
@@ -1239,13 +1242,13 @@ END
 
 /************************* Distance(s) ***************************************/
 
-FORM (Distance_to_ScalarProduct, L"Distance: To ScalarProduct", L"Distance: To ScalarProduct...")
-	BOOLEAN (L"Make sum of squares equal 1.0", 1)
+FORM (Distance_to_ScalarProduct, U"Distance: To ScalarProduct", U"Distance: To ScalarProduct...")
+	BOOLEAN (U"Make sum of squares equal 1.0", 1)
 	OK
 DO
 	LOOP {
 		iam (Distance);
-		praat_new (Distance_to_ScalarProduct (me, GET_INTEGER (L"Make sum of squares equal 1.0")), my name);
+		praat_new (Distance_to_ScalarProduct (me, GET_INTEGER (U"Make sum of squares equal 1.0")), my name);
 	}
 END
 
@@ -1256,57 +1259,56 @@ DIRECT (Distance_to_Dissimilarity)
 	}
 END
 
-FORM (Distances_indscal, L"Distance: To Configuration (indscal)", L"Distance: To Configuration (indscal)...")
-	NATURAL (L"Number of dimensions", L"2")
-	BOOLEAN (L"Normalize scalar products", 1)
-	LABEL (L"", L"Minimization parameters")
-	REAL (L"Tolerance", L"1e-5")
-	NATURAL (L"Maximum number of iterations", L"100 (= each repetition)")
-	NATURAL (L"Number of repetitions", L"1")
+FORM (Distances_indscal, U"Distance: To Configuration (indscal)", U"Distance: To Configuration (indscal)...")
+	NATURAL (U"Number of dimensions", U"2")
+	BOOLEAN (U"Normalize scalar products", 1)
+	LABEL (U"", U"Minimization parameters")
+	REAL (U"Tolerance", U"1e-5")
+	NATURAL (U"Maximum number of iterations", U"100 (= each repetition)")
+	NATURAL (U"Number of repetitions", U"1")
 	OK
 DO
 	autoDistances me = (Distances) praat_getSelectedObjects ();
-	Configuration c; Salience s;
-	Distances_indscal (me.peek(), GET_INTEGER (L"Number of dimensions"), GET_INTEGER (L"Normalize scalar products"),
-		GET_REAL (L"Tolerance"), GET_INTEGER (L"Maximum number of iterations"), GET_INTEGER (L"Number of repetitions"),
-		1, &c, &s);
-	autoConfiguration ac = c; autoSalience as = s;
-	praat_new (ac.transfer(), L"indscal");
-	praat_new (as.transfer(), L"indscal");
-END
-
-FORM (Distance_and_Configuration_drawScatterDiagram, L"Distance & Configuration: Draw scatter diagram",
-      L"Distance & Configuration: Draw scatter diagram...")
-	REAL (L"Minimum x-distance", L"0.0")
-	REAL (L"Maximum x-distance", L"0.0")
-	REAL (L"Minimum y-distance", L"0.0")
-	REAL (L"Maximum y-distance", L"0.0")
-	POSITIVE (L"Mark size (mm)", L"1.0")
-	SENTENCE (L"Mark string (+xo.)", L"+")
-	BOOLEAN (L"Garnish", 1)
+	autoConfiguration ac; autoSalience as;
+	Distances_indscal (me.peek(), GET_INTEGER (U"Number of dimensions"), GET_INTEGER (U"Normalize scalar products"),
+		GET_REAL (U"Tolerance"), GET_INTEGER (U"Maximum number of iterations"), GET_INTEGER (U"Number of repetitions"),
+		1, &ac, &as);
+	praat_new (ac.transfer(), U"indscal");
+	praat_new (as.transfer(), U"indscal");
+END
+
+FORM (Distance_and_Configuration_drawScatterDiagram, U"Distance & Configuration: Draw scatter diagram",
+      U"Distance & Configuration: Draw scatter diagram...")
+	REAL (U"Minimum x-distance", U"0.0")
+	REAL (U"Maximum x-distance", U"0.0")
+	REAL (U"Minimum y-distance", U"0.0")
+	REAL (U"Maximum y-distance", U"0.0")
+	POSITIVE (U"Mark size (mm)", U"1.0")
+	SENTENCE (U"Mark string (+xo.)", U"+")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	autoPraatPicture picture;
 	Distance me = FIRST (Distance);
 	Configuration c = FIRST (Configuration);
-	Distance_and_Configuration_drawScatterDiagram (me, c, GRAPHICS, GET_REAL (L"Minimum x-distance"),
-		GET_REAL (L"Maximum x-distance"), GET_REAL (L"Minimum y-distance"), GET_REAL (L"Maximum y-distance"),
-		GET_REAL (L"Mark size"), GET_STRING (L"Mark string"), GET_INTEGER (L"Garnish"));
+	Distance_and_Configuration_drawScatterDiagram (me, c, GRAPHICS, GET_REAL (U"Minimum x-distance"),
+		GET_REAL (U"Maximum x-distance"), GET_REAL (U"Minimum y-distance"), GET_REAL (U"Maximum y-distance"),
+		GET_REAL (U"Mark size"), GET_STRING (U"Mark string"), GET_INTEGER (U"Garnish"));
 END
 
-FORM (Distance_Configuration_indscal, L"Distance & Configuration: To Configuration (indscal)",
-      L"Distance & Configuration: To Configuration (indscal)...")
-	BOOLEAN (L"Normalize scalar products", 1)
-	LABEL (L"", L"Minimization parameters")
-	REAL (L"Tolerance", L"1e-5")
-	NATURAL (L"Maximum number of iterations", L"100 (= each repetition)")
+FORM (Distance_Configuration_indscal, U"Distance & Configuration: To Configuration (indscal)",
+      U"Distance & Configuration: To Configuration (indscal)...")
+	BOOLEAN (U"Normalize scalar products", 1)
+	LABEL (U"", U"Minimization parameters")
+	REAL (U"Tolerance", U"1e-5")
+	NATURAL (U"Maximum number of iterations", U"100 (= each repetition)")
 	OK
 DO
 	autoDistances thee = Distances_create ();
 	Collection_dontOwnItems (thee.peek());
 	Configuration c = 0;
 	LOOP {
-		iam (Data);
+		iam (Daata);
 		if (CLASS == classDistance) {
 			Collection_addItem (thee.peek(), me);
 		} else if (CLASS == classConfiguration) {
@@ -1314,24 +1316,23 @@ DO
 		}
 	}
 	Melder_assert (thy size > 0 && c);
-	Configuration cr; Salience sr;
+	autoConfiguration ac; autoSalience as;
 	Distances_Configuration_indscal (thee.peek(), c,
-		GET_INTEGER (L"Normalize scalar products"), GET_REAL (L"Tolerance"),
-		GET_INTEGER (L"Maximum number of iterations"), 1, &cr, &sr);
-	autoConfiguration ac = cr; autoSalience as = sr;
-	praat_new (ac.transfer(), L"indscal");
-	praat_new (as.transfer(), L"indscal");
+		GET_INTEGER (U"Normalize scalar products"), GET_REAL (U"Tolerance"),
+		GET_INTEGER (U"Maximum number of iterations"), 1, &ac, &as);
+	praat_new (ac.transfer(), U"indscal");
+	praat_new (as.transfer(), U"indscal");
 END
 
-FORM (Distance_Configuration_vaf, L"Distance & Configuration: Get VAF", L"Distance & Configuration: Get VAF...")
-	BOOLEAN (L"Normalize scalar products", 1)
+FORM (Distance_Configuration_vaf, U"Distance & Configuration: Get VAF", U"Distance & Configuration: Get VAF...")
+	BOOLEAN (U"Normalize scalar products", 1)
 	OK
 DO
 	autoDistances thee = Distances_create ();
 	Collection_dontOwnItems (thee.peek());
 	Configuration c = 0;
 	LOOP {
-		iam (Data);
+		iam (Daata);
 		if (CLASS == classDistance) {
 			Collection_addItem (thee.peek(), me);
 		} else if (CLASS == classConfiguration) {
@@ -1340,19 +1341,19 @@ DO
 	}
 	Melder_assert (thy size > 0 && c);
 	double vaf;
-	Distances_Configuration_vaf (thee.peek(), c, GET_INTEGER (L"Normalize scalar products"), &vaf);
-	Melder_information (Melder_double (vaf));
+	Distances_Configuration_vaf (thee.peek(), c, GET_INTEGER (U"Normalize scalar products"), &vaf);
+	Melder_information (vaf);
 END
 
-FORM (Distance_Configuration_Salience_vaf, L"Distance & Configuration & Salience: Get VAF", L"Distance & Configuration & Salience: Get VAF...")
-	BOOLEAN (L"Normalize scalar products", 1)
+FORM (Distance_Configuration_Salience_vaf, U"Distance & Configuration & Salience: Get VAF", U"Distance & Configuration & Salience: Get VAF...")
+	BOOLEAN (U"Normalize scalar products", 1)
 	OK
 DO
 	autoDistances thee = Distances_create ();
 	Collection_dontOwnItems (thee.peek());
 	Configuration c = 0; Salience s = 0;
 	LOOP {
-		iam (Data);
+		iam (Daata);
 		if (CLASS == classDistance) {
 			Collection_addItem (thee.peek(), me);
 		} else if (CLASS == classConfiguration) {
@@ -1363,23 +1364,23 @@ DO
 	}
 	Melder_assert (thy size > 0 && c && s);
 	double vaf;
-	Distances_Configuration_Salience_vaf (thee.peek(), c, s, GET_INTEGER (L"Normalize scalar products"), &vaf);
-	Melder_information (Melder_double (vaf));
+	Distances_Configuration_Salience_vaf (thee.peek(), c, s, GET_INTEGER (U"Normalize scalar products"), &vaf);
+	Melder_information (vaf);
 END
 
-FORM (Dissimilarity_Configuration_Salience_vaf, L"Dissimilarity & Configuration & Salience: Get VAF",
-      L"Dissimilarity & Configuration & Salience: Get VAF...")
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach")
-	RADIOBUTTON (L"Secondary approach")
-	BOOLEAN (L"Normalize scalar products", 1)
+FORM (Dissimilarity_Configuration_Salience_vaf, U"Dissimilarity & Configuration & Salience: Get VAF",
+      U"Dissimilarity & Configuration & Salience: Get VAF...")
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach")
+	RADIOBUTTON (U"Secondary approach")
+	BOOLEAN (U"Normalize scalar products", 1)
 	OK
 DO
 	autoDissimilarities thee = Dissimilarities_create ();
 	Collection_dontOwnItems (thee.peek());
 	Configuration c = 0; Salience s = 0;
 	LOOP {
-		iam (Data);
+		iam (Daata);
 		if (CLASS == classDissimilarity) {
 			Collection_addItem (thee.peek(), me);
 		} else if (CLASS == classConfiguration) {
@@ -1390,25 +1391,25 @@ DO
 	}
 	Melder_assert (thy size > 0 && c && s);
 	double vaf;
-	Dissimilarities_Configuration_Salience_vaf (thee.peek(), c, s, GET_INTEGER (L"Handling of ties"),
-		GET_INTEGER (L"Normalize scalar products"), &vaf);
-	Melder_information (Melder_double (vaf));
+	Dissimilarities_Configuration_Salience_vaf (thee.peek(), c, s, GET_INTEGER (U"Handling of ties"),
+		GET_INTEGER (U"Normalize scalar products"), &vaf);
+	Melder_information (vaf);
 END
 
 FORM (Distance_Configuration_Salience_indscal,
-      L"Distance & Configuration & Salience: To Configuration (indscal)",
-      L"Distance & Configuration & Salience: To Configuration (indscal)...")
-	BOOLEAN (L"Normalize scalar products", 1)
-	LABEL (L"", L"Minimization parameters")
-	REAL (L"Tolerance", L"1e-5")
-	NATURAL (L"Maximum number of iterations", L"100")
+      U"Distance & Configuration & Salience: To Configuration (indscal)",
+      U"Distance & Configuration & Salience: To Configuration (indscal)...")
+	BOOLEAN (U"Normalize scalar products", 1)
+	LABEL (U"", U"Minimization parameters")
+	REAL (U"Tolerance", U"1e-5")
+	NATURAL (U"Maximum number of iterations", U"100")
 	OK
 DO
 	autoDistances thee = Distances_create ();
 	Collection_dontOwnItems (thee.peek());
 	Configuration c = 0; Salience s = 0;
 	LOOP {
-		iam (Data);
+		iam (Daata);
 		if (CLASS == classDistance) {
 			Collection_addItem (thee.peek(), me);
 		} else if (CLASS == classConfiguration) {
@@ -1419,105 +1420,103 @@ DO
 	}
 	Melder_assert (thy size > 0 && c && s);
 	double vaf;
-	Configuration cr; Salience sr;
+	autoConfiguration ac; autoSalience as;
 	Distances_Configuration_Salience_indscal (thee.peek(), c, s,
-		GET_INTEGER (L"Normalize scalar products"), GET_REAL (L"Tolerance"),
-		GET_INTEGER (L"Maximum number of iterations"), 1, &cr, &sr, &vaf);
-	autoConfiguration ac = cr; autoSalience as = sr;
-	praat_new (ac.transfer(), L"indscal");
-	praat_new (as.transfer(), L"indscal");
+		GET_INTEGER (U"Normalize scalar products"), GET_REAL (U"Tolerance"),
+		GET_INTEGER (U"Maximum number of iterations"), 1, &ac, &as, &vaf);
+	praat_new (ac.transfer(), U"indscal");
+	praat_new (as.transfer(), U"indscal");
 END
 
-FORM (Distances_to_Configuration_ytl, L"Distance: To Configuration (ytl)", L"Distance: To Configuration (ytl)...")
-	NATURAL (L"Number of dimensions", L"2")
-	BOOLEAN (L"Normalize scalar products", 1)
-	BOOLEAN (L"Salience object", 0)
+FORM (Distances_to_Configuration_ytl, U"Distance: To Configuration (ytl)", U"Distance: To Configuration (ytl)...")
+	NATURAL (U"Number of dimensions", U"2")
+	BOOLEAN (U"Normalize scalar products", 1)
+	BOOLEAN (U"Salience object", 0)
 	OK
 DO
 	autoDistances me = (Distances) praat_getSelectedObjects ();
-	Configuration cr; Salience sr;
-	Distances_to_Configuration_ytl (me.peek(), GET_INTEGER (L"Number of dimensions"),
-		GET_INTEGER (L"Normalize scalar products"), &cr, &sr);
-	autoConfiguration ac = cr; autoSalience as = sr;
-	praat_new (ac.transfer(), L"ytl");
-	if (GET_INTEGER (L"Salience object")) {
-		praat_new (as.transfer(), L"ytl");
+	autoConfiguration ac; autoSalience as;
+	Distances_to_Configuration_ytl (me.peek(), GET_INTEGER (U"Number of dimensions"),
+		GET_INTEGER (U"Normalize scalar products"), &ac, &as);
+	praat_new (ac.transfer(), U"ytl");
+	if (GET_INTEGER (U"Salience object")) {
+		praat_new (as.transfer(), U"ytl");
 	}
 END
 
-FORM (Dissimilarity_Distance_monotoneRegression, L"Dissimilarity & Distance: Monotone regression", 0)
-	RADIO (L"Handling of ties", 1)
-	RADIOBUTTON (L"Primary approach")
-	RADIOBUTTON (L"Secondary approach")
+FORM (Dissimilarity_Distance_monotoneRegression, U"Dissimilarity & Distance: Monotone regression", 0)
+	RADIO (U"Handling of ties", 1)
+	RADIOBUTTON (U"Primary approach")
+	RADIOBUTTON (U"Secondary approach")
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Distance d = FIRST (Distance);
-	praat_new (Dissimilarity_Distance_monotoneRegression (me, d, GET_INTEGER (L"Handling of ties")), my name);
+	praat_new (Dissimilarity_Distance_monotoneRegression (me, d, GET_INTEGER (U"Handling of ties")), my name);
 END
 
-FORM (Distance_Dissimilarity_drawShepardDiagram, L"Distance & Dissimilarity: Draw Shepard diagram", L"")
-	REAL (L"Minimum dissimilarity", L"0.0")
-	REAL (L"Maximum dissimilarity", L"0.0")
-	REAL (L"left Distance range", L"0.0")
-	REAL (L"right Distance range", L"0.0")
-	POSITIVE (L"Mark size (mm)", L"1.0")
-	SENTENCE (L"Mark string (+xo.)", L"+")
-	BOOLEAN (L"Garnish", 1)
+FORM (Distance_Dissimilarity_drawShepardDiagram, U"Distance & Dissimilarity: Draw Shepard diagram", U"")
+	REAL (U"Minimum dissimilarity", U"0.0")
+	REAL (U"Maximum dissimilarity", U"0.0")
+	REAL (U"left Distance range", U"0.0")
+	REAL (U"right Distance range", U"0.0")
+	POSITIVE (U"Mark size (mm)", U"1.0")
+	SENTENCE (U"Mark string (+xo.)", U"+")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	Dissimilarity me = FIRST (Dissimilarity);
 	Distance d = FIRST (Distance);
 	Proximity_Distance_drawScatterDiagram (me, d, GRAPHICS,
-		GET_REAL (L"Minimum dissimilarity"), GET_REAL (L"Maximum dissimilarity"),
-		GET_REAL (L"left Distance range"), GET_REAL (L"right Distance range"),
-		GET_REAL (L"Mark size"), GET_STRING (L"Mark string"),
-		GET_INTEGER (L"Garnish"));
+		GET_REAL (U"Minimum dissimilarity"), GET_REAL (U"Maximum dissimilarity"),
+		GET_REAL (U"left Distance range"), GET_REAL (U"right Distance range"),
+		GET_REAL (U"Mark size"), GET_STRING (U"Mark string"),
+		GET_INTEGER (U"Garnish"));
 END
 
 DIRECT (MDS_help)
-	Melder_help (L"Multidimensional scaling");
+	Melder_help (U"Multidimensional scaling");
 END
 
 
 /************************* Salience ***************************************/
 
 
-FORM (Salience_draw, L"Salience: Draw", 0)
-	NATURAL (L"Horizontal dimension", L"1")
-	NATURAL (L"Vertical dimension", L"2")
-	BOOLEAN (L"Garnish", 1)
+FORM (Salience_draw, U"Salience: Draw", 0)
+	NATURAL (U"Horizontal dimension", U"1")
+	NATURAL (U"Vertical dimension", U"2")
+	BOOLEAN (U"Garnish", 1)
 	OK
 DO
 	LOOP {
 		iam (Salience);
-		Salience_draw (me, GRAPHICS, GET_INTEGER (L"Horizontal dimension"), GET_INTEGER (L"Vertical dimension"),
-		GET_INTEGER (L"Garnish"));
+		Salience_draw (me, GRAPHICS, GET_INTEGER (U"Horizontal dimension"), GET_INTEGER (U"Vertical dimension"),
+		GET_INTEGER (U"Garnish"));
 	}
 END
 
 /************************* COVARIANCE & CONFIGURATION  ********************/
 
-FORM (Covariance_to_Configuration, L"Covariance: To Configuration", 0)
-	NATURAL (L"Number of dimensions", L"2")
+FORM (Covariance_to_Configuration, U"Covariance: To Configuration", 0)
+	NATURAL (U"Number of dimensions", U"2")
 	OK
 DO
 	LOOP {
 		iam (Covariance);
-		praat_new (Covariance_to_Configuration (me, GET_INTEGER (L"Number of dimensions")), my name);
+		praat_new (Covariance_to_Configuration (me, GET_INTEGER (U"Number of dimensions")), my name);
 	}
 END
 
 /********* Procrustes ***************************/
 
 DIRECT (Procrustes_help)
-	Melder_help (L"Procrustes");
+	Melder_help (U"Procrustes");
 END
 
 DIRECT (Procrustes_getScale)
 	LOOP {
 		iam (Procrustes);
-		Melder_information (Melder_double (my s));
+		Melder_information (my s);
 	}
 END
 
@@ -1568,14 +1567,16 @@ END
 DIRECT (TableOfReal_to_Configuration)
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_to_Configuration (me), my name);
+		autoConfiguration thee = TableOfReal_to_Configuration (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 DIRECT (TableOfReal_to_ContingencyTable)
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_to_ContingencyTable (me), my name);
+		autoContingencyTable thee = TableOfReal_to_ContingencyTable (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
@@ -1584,37 +1585,37 @@ END
 DIRECT (TableOfReal_getTableNorm)
 	LOOP {
 		iam (TableOfReal);
-		Melder_information (Melder_double (TableOfReal_getTableNorm (me)));
+		Melder_information (TableOfReal_getTableNorm (me));
 	}
 END
 
-FORM (TableOfReal_normalizeTable, L"TableOfReal: Normalize table", L"TableOfReal: Normalize table...")
-	POSITIVE (L"Norm", L"1.0")
+FORM (TableOfReal_normalizeTable, U"TableOfReal: Normalize table", U"TableOfReal: Normalize table...")
+	POSITIVE (U"Norm", U"1.0")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_normalizeTable (me, GET_REAL (L"Norm"));
+		TableOfReal_normalizeTable (me, GET_REAL (U"Norm"));
 	}
 END
 
-FORM (TableOfReal_normalizeRows, L"TableOfReal: Normalize rows", L"TableOfReal: Normalize rows...")
-	POSITIVE (L"Norm", L"1.0")
+FORM (TableOfReal_normalizeRows, U"TableOfReal: Normalize rows", U"TableOfReal: Normalize rows...")
+	POSITIVE (U"Norm", U"1.0")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_normalizeRows (me, GET_REAL (L"Norm"));
+		TableOfReal_normalizeRows (me, GET_REAL (U"Norm"));
 	}
 END
 
-FORM (TableOfReal_normalizeColumns, L"TableOfReal: Normalize columns", L"TableOfReal: Normalize columns...")
-	POSITIVE (L"Norm", L"1.0")
+FORM (TableOfReal_normalizeColumns, U"TableOfReal: Normalize columns", U"TableOfReal: Normalize columns...")
+	POSITIVE (U"Norm", U"1.0")
 	OK
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_normalizeColumns (me, GET_REAL (L"Norm"));
+		TableOfReal_normalizeColumns (me, GET_REAL (U"Norm"));
 	}
 END
 
@@ -1656,169 +1657,168 @@ END
 DIRECT (TableOfReal_to_Confusion)
 	LOOP {
 		iam (TableOfReal);
-		praat_new (TableOfReal_to_Confusion (me), my name);
+		autoConfusion thee = TableOfReal_to_Confusion (me);
+		praat_new (thee.transfer(), my name);
 	}
 END
 
 static void praat_AffineTransform_init (ClassInfo klas) {
 	praat_addAction1 (klas, 0, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction1 (klas, 1, L"Get transformation element...", QUERY_BUTTON, 1, DO_AffineTransform_getTransformationElement);
-	praat_addAction1 (klas, 1, L"Get translation element...", QUERY_BUTTON, 1, DO_AffineTransform_getTranslationElement);
-	praat_addAction1 (klas, 0, L"Invert", 0, 0, DO_AffineTransform_invert);
+	praat_addAction1 (klas, 1, U"Get transformation element...", QUERY_BUTTON, 1, DO_AffineTransform_getTransformationElement);
+	praat_addAction1 (klas, 1, U"Get translation element...", QUERY_BUTTON, 1, DO_AffineTransform_getTranslationElement);
+	praat_addAction1 (klas, 0, U"Invert", 0, 0, DO_AffineTransform_invert);
 }
 
 static void praat_Configuration_and_AffineTransform_init (ClassInfo transform) {
-	praat_addAction2 (classConfiguration, 1, transform, 1, L"To Configuration", 0, 0, DO_Configuration_and_AffineTransform_to_Configuration);
+	praat_addAction2 (classConfiguration, 1, transform, 1, U"To Configuration", 0, 0, DO_Configuration_and_AffineTransform_to_Configuration);
 }
 
 void praat_TableOfReal_extras (ClassInfo klas);
 void praat_TableOfReal_extras (ClassInfo klas) {
-	praat_addAction1 (klas, 1, L"-- get additional --", L"Get value...", 1, 0);
-	praat_addAction1 (klas, 1, L"Get table norm", L"-- get additional --", 1, DO_TableOfReal_getTableNorm);
-	praat_addAction1 (klas, 1, L"-- set additional --", L"Set column label (label)...", 1, 0);
-	praat_addAction1 (klas, 1, L"Normalize rows...", L"-- set additional --", 1, DO_TableOfReal_normalizeRows);
-	praat_addAction1 (klas, 1, L"Normalize columns...", L"Normalize rows...", 1, DO_TableOfReal_normalizeColumns);
-	praat_addAction1 (klas, 1, L"Normalize table...", L"Normalize columns...", 1, DO_TableOfReal_normalizeTable);
-	praat_addAction1 (klas, 1, L"Standardize rows", L"Normalize table...", 1, DO_TableOfReal_standardizeRows);
-	praat_addAction1 (klas, 1, L"Standardize columns", L"Standardize rows", 1, DO_TableOfReal_standardizeColumns);
-	praat_addAction1 (klas, 1, L"Test sorting...", L"Standardize columns", praat_DEPTH_1 + praat_HIDDEN, DO_TabelOfReal_testSorting);
+	praat_addAction1 (klas, 1, U"-- get additional --", U"Get value...", 1, 0);
+	praat_addAction1 (klas, 1, U"Get table norm", U"-- get additional --", 1, DO_TableOfReal_getTableNorm);
+	praat_addAction1 (klas, 1, U"-- set additional --", U"Set column label (label)...", 1, 0);
+	praat_addAction1 (klas, 1, U"Normalize rows...", U"-- set additional --", 1, DO_TableOfReal_normalizeRows);
+	praat_addAction1 (klas, 1, U"Normalize columns...", U"Normalize rows...", 1, DO_TableOfReal_normalizeColumns);
+	praat_addAction1 (klas, 1, U"Normalize table...", U"Normalize columns...", 1, DO_TableOfReal_normalizeTable);
+	praat_addAction1 (klas, 1, U"Standardize rows", U"Normalize table...", 1, DO_TableOfReal_standardizeRows);
+	praat_addAction1 (klas, 1, U"Standardize columns", U"Standardize rows", 1, DO_TableOfReal_standardizeColumns);
+	praat_addAction1 (klas, 1, U"Test sorting...", U"Standardize columns", praat_DEPTH_1 + praat_HIDDEN, DO_TabelOfReal_testSorting);
 }
 
 void praat_uvafon_MDS_init ();
 void praat_uvafon_MDS_init () {
-	Thing_recognizeClassesByName (classAffineTransform, classProcrustes,
-	                              classContingencyTable, classDissimilarity,
-	                              classSimilarity, classConfiguration, classDistance,
-	                              classSalience, classScalarProduct, classWeight, NULL);
-	Thing_recognizeClassByOtherName (classProcrustes, L"Procrustus");
-
-	praat_addMenuCommand (L"Objects", L"New", L"Multidimensional scaling", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"MDS tutorial", 0, 1, DO_MDS_help);
-	praat_addMenuCommand (L"Objects", L"New", L"-- MDS --", 0, 1, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Create letter R example...", 0, 1, DO_Dissimilarity_createLetterRExample);
-	praat_addMenuCommand (L"Objects", L"New", L"Create INDSCAL Carroll Wish example...", 0, 1, DO_INDSCAL_createCarrollWishExample);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Configuration...", 0, 1, DO_Configuration_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Draw splines...", 0, 1, DO_drawSplines);
-	praat_addMenuCommand (L"Objects", L"New", L"Draw MDS class relations", 0, 1, DO_drawMDSClassRelations);
+	Thing_recognizeClassesByName (classAffineTransform, classProcrustes, classContingencyTable, classDissimilarity,
+		classSimilarity, classConfiguration, classDistance, classSalience, classScalarProduct, classWeight, nullptr);
+	Thing_recognizeClassByOtherName (classProcrustes, U"Procrustus");
+
+	praat_addMenuCommand (U"Objects", U"New", U"Multidimensional scaling", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"MDS tutorial", 0, 1, DO_MDS_help);
+	praat_addMenuCommand (U"Objects", U"New", U"-- MDS --", 0, 1, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Create letter R example...", 0, 1, DO_Dissimilarity_createLetterRExample);
+	praat_addMenuCommand (U"Objects", U"New", U"Create INDSCAL Carroll Wish example...", 0, 1, DO_INDSCAL_createCarrollWishExample);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Configuration...", 0, 1, DO_Configuration_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Draw splines...", 0, 1, DO_drawSplines);
+	praat_addMenuCommand (U"Objects", U"New", U"Draw MDS class relations", 0, 1, DO_drawMDSClassRelations);
 
 	/****** 1 class ********************************************************/
 
-	praat_addAction1 (classAffineTransform, 0, L"AffineTransform help", 0, 0, DO_AffineTransform_help);
+	praat_addAction1 (classAffineTransform, 0, U"AffineTransform help", 0, 0, DO_AffineTransform_help);
 	praat_AffineTransform_init (classAffineTransform);
 
 
-	praat_addAction1 (classConfiguration, 0, L"Configuration help", 0, 0, DO_Configuration_help);
+	praat_addAction1 (classConfiguration, 0, U"Configuration help", 0, 0, DO_Configuration_help);
 	praat_TableOfReal_init2 (classConfiguration);
 	praat_TableOfReal_extras (classConfiguration);
-	(void) praat_removeAction (classConfiguration, NULL, NULL, L"Insert column (index)...");
-	(void) praat_removeAction (classConfiguration, NULL, NULL, L"Remove column (index)...");
-	(void) praat_removeAction (classConfiguration, NULL, NULL, L"Append");
-	praat_addAction1 (classConfiguration, 0, L"Draw...", DRAW_BUTTON, 1, DO_Configuration_draw);
-	praat_addAction1 (classConfiguration, 0, L"Draw sigma ellipses...", L"Draw...", 1, DO_Configuration_drawSigmaEllipses);
-	praat_addAction1 (classConfiguration, 0, L"Draw one sigma ellipse...", L"Draw...", 1, DO_Configuration_drawOneSigmaEllipse);
-	praat_addAction1 (classConfiguration, 0, L"Draw confidence ellipses...", L"Draw sigma ellipses...", 1, DO_Configuration_drawConfidenceEllipses);
-	praat_addAction1 (classConfiguration, 0, L"Draw one confidence ellipse...", L"Draw sigma ellipses...", 1, DO_Configuration_drawOneConfidenceEllipse);
-
-	praat_addAction1 (classConfiguration, 0, L"Randomize", L"Normalize table...", 1, DO_Configuration_randomize);
-	praat_addAction1 (classConfiguration, 0, L"Normalize...", L"Randomize", 1, DO_Configuration_normalize);
-	praat_addAction1 (classConfiguration, 0, L"Centralize", L"Randomize", 1, DO_Configuration_centralize);
-	praat_addAction1 (classConfiguration, 1, L"-- set rotations & reflections --", L"Centralize", 1, 0);
-
-	praat_addAction1 (classConfiguration, 0, L"Rotate...", L"-- set rotations & reflections --", 1, DO_Configuration_rotate);
-	praat_addAction1 (classConfiguration, 0, L"Rotate (pc)", L"Rotate...", 1, DO_Configuration_rotateToPrincipalDirections);
-	praat_addAction1 (classConfiguration, 0, L"Invert dimension...", L"Rotate (pc)", 1, DO_Configuration_invertDimension);
-	praat_addAction1 (classConfiguration, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classConfiguration, 0, L"To Distance", 0, 0, DO_Configuration_to_Distance);
-	praat_addAction1 (classConfiguration, 0, L"To Configuration (varimax)...", 0, 0, DO_Configuration_varimax);
-	praat_addAction1 (classConfiguration, 0, L"To Similarity (cc)", 0, 0, DO_Configurations_to_Similarity_cc);
-
-	praat_addAction1 (classConfiguration, 0, L"Match configurations -", 0, 0, 0);
-	praat_addAction1 (classConfiguration, 2, L"To Procrustes...", 0, 1, DO_Configurations_to_Procrustes);
-	praat_addAction1 (classConfiguration, 2, L"To AffineTransform (congruence)...", 0, 1, DO_Configurations_to_AffineTransform_congruence);
-
-	praat_addAction1 (classConfusion, 0, L"To ContingencyTable", L"To Matrix", 0, DO_Confusion_to_ContingencyTable);
-	praat_addAction1 (classConfusion, 0, L"To Proximity -", L"Analyse", 0, 0);
-	praat_addAction1 (classConfusion, 0, L"To Dissimilarity (pdf)...", L"To Proximity -", 1, DO_Confusion_to_Dissimilarity_pdf);
-	praat_addAction1 (classConfusion, 0, L"To Similarity...", L"To Proximity -", 1, DO_Confusion_to_Similarity);
-	praat_addAction1 (classConfusion, 0, L"Sum", L"Synthesize -", 1, DO_Confusions_sum);
+	(void) praat_removeAction (classConfiguration, nullptr, nullptr, U"Insert column (index)...");
+	(void) praat_removeAction (classConfiguration, nullptr, nullptr, U"Remove column (index)...");
+	(void) praat_removeAction (classConfiguration, nullptr, nullptr, U"Append");
+	praat_addAction1 (classConfiguration, 0, U"Draw...", DRAW_BUTTON, 1, DO_Configuration_draw);
+	praat_addAction1 (classConfiguration, 0, U"Draw sigma ellipses...", U"Draw...", 1, DO_Configuration_drawSigmaEllipses);
+	praat_addAction1 (classConfiguration, 0, U"Draw one sigma ellipse...", U"Draw...", 1, DO_Configuration_drawOneSigmaEllipse);
+	praat_addAction1 (classConfiguration, 0, U"Draw confidence ellipses...", U"Draw sigma ellipses...", 1, DO_Configuration_drawConfidenceEllipses);
+	praat_addAction1 (classConfiguration, 0, U"Draw one confidence ellipse...", U"Draw sigma ellipses...", 1, DO_Configuration_drawOneConfidenceEllipse);
+
+	praat_addAction1 (classConfiguration, 0, U"Randomize", U"Normalize table...", 1, DO_Configuration_randomize);
+	praat_addAction1 (classConfiguration, 0, U"Normalize...", U"Randomize", 1, DO_Configuration_normalize);
+	praat_addAction1 (classConfiguration, 0, U"Centralize", U"Randomize", 1, DO_Configuration_centralize);
+	praat_addAction1 (classConfiguration, 1, U"-- set rotations & reflections --", U"Centralize", 1, 0);
+
+	praat_addAction1 (classConfiguration, 0, U"Rotate...", U"-- set rotations & reflections --", 1, DO_Configuration_rotate);
+	praat_addAction1 (classConfiguration, 0, U"Rotate (pc)", U"Rotate...", 1, DO_Configuration_rotateToPrincipalDirections);
+	praat_addAction1 (classConfiguration, 0, U"Invert dimension...", U"Rotate (pc)", 1, DO_Configuration_invertDimension);
+	praat_addAction1 (classConfiguration, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classConfiguration, 0, U"To Distance", 0, 0, DO_Configuration_to_Distance);
+	praat_addAction1 (classConfiguration, 0, U"To Configuration (varimax)...", 0, 0, DO_Configuration_varimax);
+	praat_addAction1 (classConfiguration, 0, U"To Similarity (cc)", 0, 0, DO_Configurations_to_Similarity_cc);
+
+	praat_addAction1 (classConfiguration, 0, U"Match configurations -", 0, 0, 0);
+	praat_addAction1 (classConfiguration, 2, U"To Procrustes...", 0, 1, DO_Configurations_to_Procrustes);
+	praat_addAction1 (classConfiguration, 2, U"To AffineTransform (congruence)...", 0, 1, DO_Configurations_to_AffineTransform_congruence);
+
+	praat_addAction1 (classConfusion, 0, U"To ContingencyTable", U"To Matrix", 0, DO_Confusion_to_ContingencyTable);
+	praat_addAction1 (classConfusion, 0, U"To Proximity -", U"Analyse", 0, 0);
+	praat_addAction1 (classConfusion, 0, U"To Dissimilarity (pdf)...", U"To Proximity -", 1, DO_Confusion_to_Dissimilarity_pdf);
+	praat_addAction1 (classConfusion, 0, U"To Similarity...", U"To Proximity -", 1, DO_Confusion_to_Similarity);
+	praat_addAction1 (classConfusion, 0, U"Sum", U"Synthesize -", 1, DO_Confusions_sum);
 
 
 	praat_TableOfReal_init2 (classContingencyTable);
-	praat_addAction1 (classContingencyTable, 1, L"-- statistics --", L"Get value...", 1, 0);
-	praat_addAction1 (classContingencyTable, 1, L"Get chi squared probability", L"-- statistics --", 1, DO_ContingencyTable_chisqProbability);
-	praat_addAction1 (classContingencyTable, 1, L"Get Cramer's statistic", L"Get chi squared probability", 1, DO_ContingencyTable_cramersStatistic);
-	praat_addAction1 (classContingencyTable, 1, L"Get contingency coefficient", L"Get Cramer's statistic", 1,
+	praat_addAction1 (classContingencyTable, 1, U"-- statistics --", U"Get value...", 1, 0);
+	praat_addAction1 (classContingencyTable, 1, U"Get chi squared probability", U"-- statistics --", 1, DO_ContingencyTable_chisqProbability);
+	praat_addAction1 (classContingencyTable, 1, U"Get Cramer's statistic", U"Get chi squared probability", 1, DO_ContingencyTable_cramersStatistic);
+	praat_addAction1 (classContingencyTable, 1, U"Get contingency coefficient", U"Get Cramer's statistic", 1,
 	                  DO_ContingencyTable_contingencyCoefficient);
-	praat_addAction1 (classContingencyTable, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classContingencyTable, 1, L"To Configuration (ca)...", 0, 0, DO_ContingencyTable_to_Configuration_ca);
+	praat_addAction1 (classContingencyTable, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classContingencyTable, 1, U"To Configuration (ca)...", 0, 0, DO_ContingencyTable_to_Configuration_ca);
 
 
-	praat_addAction1 (classCorrelation, 0, L"To Configuration...", 0, 0, DO_Correlation_to_Configuration);
+	praat_addAction1 (classCorrelation, 0, U"To Configuration...", 0, 0, DO_Correlation_to_Configuration);
 
-	praat_addAction1 (classDissimilarity, 0, L"Dissimilarity help", 0, 0, DO_Dissimilarity_help);
+	praat_addAction1 (classDissimilarity, 0, U"Dissimilarity help", 0, 0, DO_Dissimilarity_help);
 	praat_TableOfReal_init2 (classDissimilarity);
 	praat_TableOfReal_extras (classDissimilarity);
-	praat_addAction1 (classDissimilarity, 0, L"Get additive constant", L"Get table norm", 1, DO_Dissimilarity_getAdditiveConstant);
+	praat_addAction1 (classDissimilarity, 0, U"Get additive constant", U"Get table norm", 1, DO_Dissimilarity_getAdditiveConstant);
 	praat_addAction1 (classDissimilarity, 0, CONFIGURATION_BUTTON, 0, 0, 0);
-	praat_addAction1 (classDissimilarity, 1, L"To Configuration (monotone mds)...", 0, 1, DO_Dissimilarity_monotone_mds);
-	praat_addAction1 (classDissimilarity, 1, L"To Configuration (i-spline mds)...", 0, 1, DO_Dissimilarity_ispline_mds);
-	praat_addAction1 (classDissimilarity, 1, L"To Configuration (interval mds)...", 0, 1, DO_Dissimilarity_interval_mds);
-	praat_addAction1 (classDissimilarity, 1, L"To Configuration (ratio mds)...", 0, 1, DO_Dissimilarity_ratio_mds);
-	praat_addAction1 (classDissimilarity, 1, L"To Configuration (absolute mds)...", 0, 1, DO_Dissimilarity_absolute_mds);
-	praat_addAction1 (classDissimilarity, 1, L"To Configuration (kruskal)...", 0, 1, DO_Dissimilarity_kruskal);
-	praat_addAction1 (classDissimilarity, 0, L"To Distance...", 0, 0, DO_Dissimilarity_to_Distance);
-	praat_addAction1 (classDissimilarity, 0, L"To Weight", 0, 0, DO_Dissimilarity_to_Weight);
+	praat_addAction1 (classDissimilarity, 1, U"To Configuration (monotone mds)...", 0, 1, DO_Dissimilarity_monotone_mds);
+	praat_addAction1 (classDissimilarity, 1, U"To Configuration (i-spline mds)...", 0, 1, DO_Dissimilarity_ispline_mds);
+	praat_addAction1 (classDissimilarity, 1, U"To Configuration (interval mds)...", 0, 1, DO_Dissimilarity_interval_mds);
+	praat_addAction1 (classDissimilarity, 1, U"To Configuration (ratio mds)...", 0, 1, DO_Dissimilarity_ratio_mds);
+	praat_addAction1 (classDissimilarity, 1, U"To Configuration (absolute mds)...", 0, 1, DO_Dissimilarity_absolute_mds);
+	praat_addAction1 (classDissimilarity, 1, U"To Configuration (kruskal)...", 0, 1, DO_Dissimilarity_kruskal);
+	praat_addAction1 (classDissimilarity, 0, U"To Distance...", 0, 0, DO_Dissimilarity_to_Distance);
+	praat_addAction1 (classDissimilarity, 0, U"To Weight", 0, 0, DO_Dissimilarity_to_Weight);
 
 
-	praat_addAction1 (classCovariance, 0, L"To Configuration...", 0, 0, DO_Covariance_to_Configuration);
+	praat_addAction1 (classCovariance, 0, U"To Configuration...", 0, 0, DO_Covariance_to_Configuration);
 
 
 	praat_TableOfReal_init2 (classDistance);
 	praat_TableOfReal_extras (classDistance);
-	praat_addAction1 (classDistance, 0, L"Analyse -", 0, 0, 0);
+	praat_addAction1 (classDistance, 0, U"Analyse -", 0, 0, 0);
 	praat_addAction1 (classDistance, 0, CONFIGURATION_BUTTON, 0, 0, 0);
-	praat_addAction1 (classDistance, 0, L"To Configuration (indscal)...", 0, 1, DO_Distances_indscal);
-	praat_addAction1 (classDistance, 0, L"-- linear scaling --", 0, 1, 0);
-	praat_addAction1 (classDistance, 0, L"To Configuration (ytl)...", 0, 1, DO_Distances_to_Configuration_ytl);
-	praat_addAction1 (classDistance, 0, L"To Dissimilarity", 0, 0, DO_Distance_to_Dissimilarity);
-	praat_addAction1 (classDistance, 0, L"To ScalarProduct...", 0, 0, DO_Distance_to_ScalarProduct);
+	praat_addAction1 (classDistance, 0, U"To Configuration (indscal)...", 0, 1, DO_Distances_indscal);
+	praat_addAction1 (classDistance, 0, U"-- linear scaling --", 0, 1, 0);
+	praat_addAction1 (classDistance, 0, U"To Configuration (ytl)...", 0, 1, DO_Distances_to_Configuration_ytl);
+	praat_addAction1 (classDistance, 0, U"To Dissimilarity", 0, 0, DO_Distance_to_Dissimilarity);
+	praat_addAction1 (classDistance, 0, U"To ScalarProduct...", 0, 0, DO_Distance_to_ScalarProduct);
 
 
-	praat_addAction1 (classProcrustes, 0, L"Procrustes help", 0, 0, DO_Procrustes_help);
+	praat_addAction1 (classProcrustes, 0, U"Procrustes help", 0, 0, DO_Procrustes_help);
 	praat_AffineTransform_init (classProcrustes);
-	praat_addAction1 (classProcrustes, 1, L"Get scale", QUERY_BUTTON, 1, DO_Procrustes_getScale);
-	praat_addAction1 (classProcrustes, 0, L"Extract transformation matrix", 0, 0, DO_AffineTransform_extractMatrix);
-	praat_addAction1 (classProcrustes, 0, L"Extract translation vector", 0, 0, DO_AffineTransform_extractTranslationVector);
+	praat_addAction1 (classProcrustes, 1, U"Get scale", QUERY_BUTTON, 1, DO_Procrustes_getScale);
+	praat_addAction1 (classProcrustes, 0, U"Extract transformation matrix", 0, 0, DO_AffineTransform_extractMatrix);
+	praat_addAction1 (classProcrustes, 0, U"Extract translation vector", 0, 0, DO_AffineTransform_extractTranslationVector);
 
 	praat_TableOfReal_init2 (classSalience);
 	praat_TableOfReal_extras (classSalience);
-	praat_addAction1 (classSalience, 0, L"Draw...", DRAW_BUTTON, 1, DO_Salience_draw);
+	praat_addAction1 (classSalience, 0, U"Draw...", DRAW_BUTTON, 1, DO_Salience_draw);
 
 
-	praat_addAction1 (classSimilarity, 0, L"Similarity help", 0, 0, DO_Similarity_help);
+	praat_addAction1 (classSimilarity, 0, U"Similarity help", 0, 0, DO_Similarity_help);
 	praat_TableOfReal_init2 (classSimilarity);
 	praat_TableOfReal_extras (classSimilarity);
-	praat_addAction1 (classSimilarity, 0, L"Analyse -", 0, 0, 0);
-	praat_addAction1 (classSimilarity, 0, L"To Dissimilarity...", 0, 0, DO_Similarity_to_Dissimilarity);
+	praat_addAction1 (classSimilarity, 0, U"Analyse -", 0, 0, 0);
+	praat_addAction1 (classSimilarity, 0, U"To Dissimilarity...", 0, 0, DO_Similarity_to_Dissimilarity);
 
 
 	praat_TableOfReal_init2 (classScalarProduct);
 	praat_TableOfReal_extras (classScalarProduct);
 
 	praat_TableOfReal_extras (classTableOfReal);
-	praat_addAction1 (classTableOfReal, 1, L"Centre rows", L"Normalize table...", 1, DO_TableOfReal_centreRows);
-	praat_addAction1 (classTableOfReal, 1, L"Centre columns", L"Centre rows", 1, DO_TableOfReal_centreColumns);
-	praat_addAction1 (classTableOfReal, 1, L"Double centre", L"Centre columns", 1, DO_TableOfReal_doubleCentre);
-	praat_addAction1 (classTableOfReal, 0, L"Cast -", 0, 0, 0);
-	praat_addAction1 (classTableOfReal, 0, L"To Confusion", 0, 1, DO_TableOfReal_to_Confusion);
-	praat_addAction1 (classTableOfReal, 0, L"To Dissimilarity", 0, 1, DO_TableOfReal_to_Dissimilarity);
-	praat_addAction1 (classTableOfReal, 0, L"To Similarity", 0, 1, DO_TableOfReal_to_Similarity);
-	praat_addAction1 (classTableOfReal, 0, L"To Distance", 0, 1, DO_TableOfReal_to_Distance);
-	praat_addAction1 (classTableOfReal, 0, L"To Salience", 0, 1, DO_TableOfReal_to_Salience);
-	praat_addAction1 (classTableOfReal, 0, L"To Weight", 0, 1, DO_TableOfReal_to_Weight);
-	praat_addAction1 (classTableOfReal, 0, L"To ScalarProduct", 0, 1, DO_TableOfReal_to_ScalarProduct);
-	praat_addAction1 (classTableOfReal, 0, L"To Configuration", 0, 1, DO_TableOfReal_to_Configuration);
-	praat_addAction1 (classTableOfReal, 0, L"To ContingencyTable", 0, 1, DO_TableOfReal_to_ContingencyTable);
+	praat_addAction1 (classTableOfReal, 1, U"Centre rows", U"Normalize table...", 1, DO_TableOfReal_centreRows);
+	praat_addAction1 (classTableOfReal, 1, U"Centre columns", U"Centre rows", 1, DO_TableOfReal_centreColumns);
+	praat_addAction1 (classTableOfReal, 1, U"Double centre", U"Centre columns", 1, DO_TableOfReal_doubleCentre);
+	praat_addAction1 (classTableOfReal, 0, U"Cast -", 0, 0, 0);
+	praat_addAction1 (classTableOfReal, 0, U"To Confusion", 0, 1, DO_TableOfReal_to_Confusion);
+	praat_addAction1 (classTableOfReal, 0, U"To Dissimilarity", 0, 1, DO_TableOfReal_to_Dissimilarity);
+	praat_addAction1 (classTableOfReal, 0, U"To Similarity", 0, 1, DO_TableOfReal_to_Similarity);
+	praat_addAction1 (classTableOfReal, 0, U"To Distance", 0, 1, DO_TableOfReal_to_Distance);
+	praat_addAction1 (classTableOfReal, 0, U"To Salience", 0, 1, DO_TableOfReal_to_Salience);
+	praat_addAction1 (classTableOfReal, 0, U"To Weight", 0, 1, DO_TableOfReal_to_Weight);
+	praat_addAction1 (classTableOfReal, 0, U"To ScalarProduct", 0, 1, DO_TableOfReal_to_ScalarProduct);
+	praat_addAction1 (classTableOfReal, 0, U"To Configuration", 0, 1, DO_TableOfReal_to_Configuration);
+	praat_addAction1 (classTableOfReal, 0, U"To ContingencyTable", 0, 1, DO_TableOfReal_to_ContingencyTable);
 
 	praat_TableOfReal_init2 (classWeight);
 
@@ -1828,74 +1828,74 @@ void praat_uvafon_MDS_init () {
 	praat_Configuration_and_AffineTransform_init (classAffineTransform);
 	praat_Configuration_and_AffineTransform_init (classProcrustes);
 
-	praat_addAction2 (classConfiguration, 0, classWeight, 1, L"Analyse", 0, 0, 0);
-	praat_addAction2 (classConfiguration, 0, classWeight, 1, L"To Similarity (cc)", 0, 0, DO_Configuration_Weight_to_Similarity_cc);
+	praat_addAction2 (classConfiguration, 0, classWeight, 1, U"Analyse", 0, 0, 0);
+	praat_addAction2 (classConfiguration, 0, classWeight, 1, U"To Similarity (cc)", 0, 0, DO_Configuration_Weight_to_Similarity_cc);
 
 	praat_addAction2 (classDissimilarity, 1, classWeight, 1, ANALYSE_BUTTON, 0, 0, 0);
-	praat_addAction2 (classDissimilarity, 1, classWeight, 1, L"To Configuration (monotone mds)...", 0, 1, DO_Dissimilarity_Weight_monotone_mds);
-	praat_addAction2 (classDissimilarity, 1, classWeight, 1, L"To Configuration (i-spline mds)...", 0, 1, DO_Dissimilarity_Weight_ispline_mds);
-	praat_addAction2 (classDissimilarity, 1, classWeight, 1, L"To Configuration (interval mds)...", 0, 1, DO_Dissimilarity_Weight_interval_mds);
-	praat_addAction2 (classDissimilarity, 1, classWeight, 1, L"To Configuration (ratio mds)...", 0, 1, DO_Dissimilarity_Weight_ratio_mds);
-	praat_addAction2 (classDissimilarity, 1, classWeight, 1, L"To Configuration (absolute mds)...", 0, 1, DO_Dissimilarity_Weight_absolute_mds);
+	praat_addAction2 (classDissimilarity, 1, classWeight, 1, U"To Configuration (monotone mds)...", 0, 1, DO_Dissimilarity_Weight_monotone_mds);
+	praat_addAction2 (classDissimilarity, 1, classWeight, 1, U"To Configuration (i-spline mds)...", 0, 1, DO_Dissimilarity_Weight_ispline_mds);
+	praat_addAction2 (classDissimilarity, 1, classWeight, 1, U"To Configuration (interval mds)...", 0, 1, DO_Dissimilarity_Weight_interval_mds);
+	praat_addAction2 (classDissimilarity, 1, classWeight, 1, U"To Configuration (ratio mds)...", 0, 1, DO_Dissimilarity_Weight_ratio_mds);
+	praat_addAction2 (classDissimilarity, 1, classWeight, 1, U"To Configuration (absolute mds)...", 0, 1, DO_Dissimilarity_Weight_absolute_mds);
 
 
 	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, DRAW_BUTTON, 0, 0, 0);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Draw Shepard diagram...", 0, 1, DO_Dissimilarity_Configuration_drawShepardDiagram);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"-- draw regressions --", 0, 1, 0);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Draw monotone regression...", 0, 1, DO_Dissimilarity_Configuration_drawMonotoneRegression);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Draw i-spline regression...", 0, 1, DO_Dissimilarity_Configuration_drawISplineRegression);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Draw interval regression...", 0, 1, DO_Dissimilarity_Configuration_drawIntervalRegression);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Draw ratio regression...", 0, 1, DO_Dissimilarity_Configuration_drawRatioRegression);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Draw absolute regression...", 0, 1, DO_Dissimilarity_Configuration_drawAbsoluteRegression);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Draw Shepard diagram...", 0, 1, DO_Dissimilarity_Configuration_drawShepardDiagram);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"-- draw regressions --", 0, 1, 0);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Draw monotone regression...", 0, 1, DO_Dissimilarity_Configuration_drawMonotoneRegression);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Draw i-spline regression...", 0, 1, DO_Dissimilarity_Configuration_drawISplineRegression);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Draw interval regression...", 0, 1, DO_Dissimilarity_Configuration_drawIntervalRegression);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Draw ratio regression...", 0, 1, DO_Dissimilarity_Configuration_drawRatioRegression);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Draw absolute regression...", 0, 1, DO_Dissimilarity_Configuration_drawAbsoluteRegression);
 	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Get stress...", 0, 1, DO_Dissimilarity_Configuration_getStress);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Get stress (monotone mds)...", 0, 1, DO_Dissimilarity_Configuration_monotone_stress);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Get stress (i-spline mds)...", 0, 1, DO_Dissimilarity_Configuration_ispline_stress);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Get stress (interval mds)...", 0, 1, DO_Dissimilarity_Configuration_interval_stress);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Get stress (ratio mds)...", 0, 1, DO_Dissimilarity_Configuration_ratio_stress);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"Get stress (absolute mds)...", 0, 1, DO_Dissimilarity_Configuration_absolute_stress);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Get stress...", 0, 1, DO_Dissimilarity_Configuration_getStress);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Get stress (monotone mds)...", 0, 1, DO_Dissimilarity_Configuration_monotone_stress);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Get stress (i-spline mds)...", 0, 1, DO_Dissimilarity_Configuration_ispline_stress);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Get stress (interval mds)...", 0, 1, DO_Dissimilarity_Configuration_interval_stress);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Get stress (ratio mds)...", 0, 1, DO_Dissimilarity_Configuration_ratio_stress);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"Get stress (absolute mds)...", 0, 1, DO_Dissimilarity_Configuration_absolute_stress);
 	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, ANALYSE_BUTTON, 0, 0, 0);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"To Configuration (monotone mds)...", 0, 1, DO_Dissimilarity_Configuration_monotone_mds);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"To Configuration (i-spline mds)...", 0, 1, DO_Dissimilarity_Configuration_ispline_mds);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"To Configuration (interval mds)...", 0, 1, DO_Dissimilarity_Configuration_interval_mds);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"To Configuration (ratio mds)...", 0, 1, DO_Dissimilarity_Configuration_ratio_mds);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"To Configuration (absolute mds)...", 0, 1, DO_Dissimilarity_Configuration_absolute_mds);
-	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, L"To Configuration (kruskal)...", 0, 1, DO_Dissimilarity_Configuration_kruskal);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"To Configuration (monotone mds)...", 0, 1, DO_Dissimilarity_Configuration_monotone_mds);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"To Configuration (i-spline mds)...", 0, 1, DO_Dissimilarity_Configuration_ispline_mds);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"To Configuration (interval mds)...", 0, 1, DO_Dissimilarity_Configuration_interval_mds);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"To Configuration (ratio mds)...", 0, 1, DO_Dissimilarity_Configuration_ratio_mds);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"To Configuration (absolute mds)...", 0, 1, DO_Dissimilarity_Configuration_absolute_mds);
+	praat_addAction2 (classDissimilarity, 1, classConfiguration, 1, U"To Configuration (kruskal)...", 0, 1, DO_Dissimilarity_Configuration_kruskal);
 
 	praat_addAction2 (classDistance, 1, classConfiguration, 1, DRAW_BUTTON, 0, 0, 0);
-	praat_addAction2 (classDistance, 1, classConfiguration, 1, L"Draw scatter diagram...", 0, 0, DO_Distance_and_Configuration_drawScatterDiagram);
+	praat_addAction2 (classDistance, 1, classConfiguration, 1, U"Draw scatter diagram...", 0, 0, DO_Distance_and_Configuration_drawScatterDiagram);
 	praat_addAction2 (classDistance, 1, classConfiguration, 1, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction2 (classDistance, 0, classConfiguration, 1, L"Get VAF...", 0, 0, DO_Distance_Configuration_vaf);
+	praat_addAction2 (classDistance, 0, classConfiguration, 1, U"Get VAF...", 0, 0, DO_Distance_Configuration_vaf);
 	praat_addAction2 (classDistance, 1, classConfiguration, 1, ANALYSE_BUTTON, 0, 0, 0);
-	praat_addAction2 (classDistance, 0, classConfiguration, 1, L"To Configuration (indscal)...", 0, 1, DO_Distance_Configuration_indscal);
+	praat_addAction2 (classDistance, 0, classConfiguration, 1, U"To Configuration (indscal)...", 0, 1, DO_Distance_Configuration_indscal);
 
-	praat_addAction2 (classDistance, 1, classDissimilarity, 1, L"Draw Shepard diagram...", 0, 0, DO_Distance_Dissimilarity_drawShepardDiagram);
-	praat_addAction2 (classDissimilarity, 1, classDistance, 1, L"Monotone regression...", 0, 0, DO_Dissimilarity_Distance_monotoneRegression);
+	praat_addAction2 (classDistance, 1, classDissimilarity, 1, U"Draw Shepard diagram...", 0, 0, DO_Distance_Dissimilarity_drawShepardDiagram);
+	praat_addAction2 (classDissimilarity, 1, classDistance, 1, U"Monotone regression...", 0, 0, DO_Dissimilarity_Distance_monotoneRegression);
 
 	/****** 3 classes ********************************************************/
 
 
 	praat_addAction3 (classDissimilarity, 0, classConfiguration, 1, classSalience, 1, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction3 (classDissimilarity, 0, classConfiguration, 1, classSalience, 1, L"Get VAF...", 0, 1, DO_Dissimilarity_Configuration_Salience_vaf);
+	praat_addAction3 (classDissimilarity, 0, classConfiguration, 1, classSalience, 1, U"Get VAF...", 0, 1, DO_Dissimilarity_Configuration_Salience_vaf);
 
 	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, L"Get stress (monotone mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_monotone_stress);
-	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, L"Get stress (i-spline mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_ispline_stress);
-	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, L"Get stress (interval mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_interval_stress);
-	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, L"Get stress (ratio mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_ratio_stress);
-	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, L"Get stress (absolute mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_absolute_stress);
+	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, U"Get stress (monotone mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_monotone_stress);
+	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, U"Get stress (i-spline mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_ispline_stress);
+	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, U"Get stress (interval mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_interval_stress);
+	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, U"Get stress (ratio mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_ratio_stress);
+	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, U"Get stress (absolute mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_absolute_stress);
 	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, ANALYSE_BUTTON, 0, 0, 0);
-	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, L"To Configuration (monotone mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_monotone_mds);
-	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, L"To Configuration (i-spline mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_ispline_mds);
-	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, L"To Configuration (interval mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_interval_mds);
-	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, L"To Configuration (ratio mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_ratio_mds);
-	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, L"To Configuration (absolute mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_absolute_mds);
+	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, U"To Configuration (monotone mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_monotone_mds);
+	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, U"To Configuration (i-spline mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_ispline_mds);
+	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, U"To Configuration (interval mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_interval_mds);
+	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, U"To Configuration (ratio mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_ratio_mds);
+	praat_addAction3 (classDissimilarity, 1, classConfiguration, 1, classWeight, 1, U"To Configuration (absolute mds)...", 0, 1, DO_Dissimilarity_Configuration_Weight_absolute_mds);
 
 
 	praat_addAction3 (classDistance, 0, classConfiguration, 1, classSalience, 1, QUERY_BUTTON, 0, 0, 0);
-	praat_addAction3 (classDistance, 0, classConfiguration, 1, classSalience, 1, L"Get VAF...", 0, 1, DO_Distance_Configuration_Salience_vaf);
-	praat_addAction3 (classDistance, 0, classConfiguration, 1, classSalience, 1, L"Analyse", 0, 0, 0);
-	praat_addAction3 (classDistance, 0, classConfiguration, 1, classSalience, 1, L"To Configuration (indscal)...", 0, 0, DO_Distance_Configuration_Salience_indscal);
+	praat_addAction3 (classDistance, 0, classConfiguration, 1, classSalience, 1, U"Get VAF...", 0, 1, DO_Distance_Configuration_Salience_vaf);
+	praat_addAction3 (classDistance, 0, classConfiguration, 1, classSalience, 1, U"Analyse", 0, 0, 0);
+	praat_addAction3 (classDistance, 0, classConfiguration, 1, classSalience, 1, U"To Configuration (indscal)...", 0, 0, DO_Distance_Configuration_Salience_indscal);
 
 
 	INCLUDE_MANPAGES (manual_MDS_init)
diff --git a/external/espeak/dictionary.cpp b/external/espeak/dictionary.cpp
index 0c75ce9..d1c88da 100644
--- a/external/espeak/dictionary.cpp
+++ b/external/espeak/dictionary.cpp
@@ -259,12 +259,12 @@ int LoadDictionary(Translator *tr, const char *name, int no_error)
 	int length = Reverse4Bytes (pw[1]); // was int really written with 4 bytes?
 
 	if (size <= (N_HASH_DICT + sizeof(int)*2)) {
-		Melder_error_ (L"Empty _dict: ", Melder_utf8ToWcs(name), L"_dict.");
+		Melder_appendError (U"Empty _dict: ", Melder_peek8to32(name), U"_dict.");
 		return(2);
 	}
 
 	if((Reverse4Bytes(pw[0]) != N_HASH_DICT) || (length <= 0) || (length > 0x8000000)) {
-		Melder_error_ (L"Bad data in dict: ", Melder_utf8ToWcs(name), L" ", Melder_integer (Reverse4Bytes(pw[0])), L" ", Melder_integer (length));
+		Melder_appendError (U"Bad data in dict: ", Melder_peek8to32(name), U" ", Reverse4Bytes(pw[0]), U" ", length);
 		return (2);
 	}
 	tr -> data_dictrules = &(tr->data_dictlist[length]);
@@ -272,7 +272,7 @@ int LoadDictionary(Translator *tr, const char *name, int no_error)
 	// set up indices into data_dictrules
 	InitGroups(tr);
 	if (tr -> groups1[0] == NULL) {
-		Melder_error_ (L"Error in ", Melder_peekUtf8ToWcs (name), L"_rules, no default rule group.");
+		Melder_appendError (U"Error in ", Melder_peek8to32(name), U"_rules, no default rule group.");
 	}
 
 	// set up hash table for data_dictlist
diff --git a/external/espeak/espeakdata_FileInMemory.cpp b/external/espeak/espeakdata_FileInMemory.cpp
index a91bab1..59e0119 100644
--- a/external/espeak/espeakdata_FileInMemory.cpp
+++ b/external/espeak/espeakdata_FileInMemory.cpp
@@ -37,7 +37,7 @@ static void FilesInMemory_and_Strings_changeIds (FilesInMemory me, Strings thee)
 			FileInMemory_setId ((FileInMemory) my item[i], thy strings[i]);
 		}
 	} catch (MelderError) {
-		Melder_throw (me, "Ids not changed.");
+		Melder_throw (me, U"Ids not changed.");
 	}
 }
 
@@ -48,34 +48,34 @@ static Strings espeak_voices_sort () {
 		FilesInMemory_and_Strings_changeIds (espeakdata_voices, fullnames.peek());
 		espeakdata_voices -> d_sortKey = 1; // sort id's
 		Sorted_sort (espeakdata_voices);
-		Table_sortRows_string (names.peek(), L"name"); //They hopefully sort the same way
+		Table_sortRows_string (names.peek(), U"name"); //They hopefully sort the same way
 		autoStrings neworder = espeakdata_voices_getNames (names.peek(), 2);
 		autoStrings names_short = espeakdata_voices_getNames (names.peek(), 1);
 		FilesInMemory_and_Strings_changeIds (espeakdata_voices, names_short.peek());
 		return neworder.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Espeak voices not sorted.");
+		Melder_throw (U"Espeak voices not sorted.");
 	}
 }
 
-static Strings Strings_insertAndExpand (Strings me, long position, const wchar_t *newstring) {
+static Strings Strings_insertAndExpand (Strings me, long position, const char32 *newstring) {
 	try {
 		if (position == 0) position = my numberOfStrings + 1;
 		Melder_assert (position >= 1);
 		Melder_assert (position <= my numberOfStrings + 1);
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector<wchar *> (1, my numberOfStrings + 1);
+		thy strings = NUMvector<char32 *> (1, my numberOfStrings + 1);
 		for (long i = 1, from = 1; i <= my numberOfStrings + 1; i++, from++) {
-			const wchar *to_copy = my strings[from];
+			const char32 *to_copy = my strings[from];
 			if (i == position) {
 				to_copy = newstring; from--;
 			}
-			thy strings[i] = Melder_wcsdup (to_copy);
+			thy strings[i] = Melder_dup (to_copy);
 		}
 		thy numberOfStrings = my numberOfStrings + 1;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " not expanded.");
+		Melder_throw (me, U" not expanded.");
 	}
 }
 
@@ -83,14 +83,14 @@ void espeakdata_praat_init () {
 	try {
 		espeakdata_variants = create_espeakdata_variants ();
 		autoStrings vnames = FilesInMemory_to_Strings_id (espeakdata_variants);
-		espeakdata_variants_names = Strings_insertAndExpand (vnames.peek(), 1, L"default");
+		espeakdata_variants_names = Strings_insertAndExpand (vnames.peek(), 1, U"default");
 		espeakdata_dicts = create_espeakdata_dicts ();
 		espeakdata_phons = create_espeakdata_phons ();
 		espeakdata_voices = create_espeakdata_voices ();
 		espeakdata_voices_names = espeak_voices_sort ();
 		autoTable names_table = espeakdata_voices_to_Table (espeakdata_voices);
 	} catch (MelderError) {
-		Melder_throw ("Espeakdata initialization not performed.");
+		Melder_throw (U"Espeakdata initialization not performed.");
 	}
 }
 
@@ -105,6 +105,7 @@ const char * espeakdata_get_voicedata (const char *data, long ndata, char *buf,
 	while (i < nbuf && *index < ndata && ((buf[i] = data[i]) != '\n')) {
 		i++; (*index)++;
 	}
+	(*index)++;   // ppgb 20151020 fix
 	long idata = i + 1;
 	buf[i] = '\0';
 	while (--i >= 0 && ESPEAK_ISSPACE (buf[i])) {
@@ -119,7 +120,7 @@ const char * espeakdata_get_voicedata (const char *data, long ndata, char *buf,
 
 Table espeakdata_voices_to_Table (FilesInMemory me) {
 	try {
-		autoTable thee = Table_createWithColumnNames (my size, L"id name");
+		autoTable thee = Table_createWithColumnNames (my size, U"id name");
 		for (long ifile = 1; ifile <= my size; ifile++) {
 			FileInMemory fim = (FileInMemory) my item[ifile];
 			Table_setStringValue (thee.peek(), ifile, 1, fim -> d_id);
@@ -137,51 +138,51 @@ Table espeakdata_voices_to_Table (FilesInMemory me) {
 			// skip leading white space
 			bufp = & buf[4];
 			while (ESPEAK_ISSPACE (*bufp)) { *bufp++; }
-			Table_setStringValue (thee.peek(), ifile, 2, Melder_peekUtf8ToWcs (bufp));
+			Table_setStringValue (thee.peek(), ifile, 2, Melder_peek8to32 (bufp));
 			TableRow row = static_cast <TableRow> (thy rows -> item [ifile]);
 			wint_t c0 = row -> cells [2]. string[0];
 			row -> cells [2]. string[0] = towupper (c0);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Espeakdata: voice table not initialized.");
+		Melder_throw (U"Espeakdata: voice table not initialized.");
 	}
 }
 
 Strings espeakdata_voices_getNames (Table me, long column) {
 	try {
 		if (column < 0 || column > 2) {
-			Melder_throw ("Illegal columnn.");
+			Melder_throw (U"Illegal columnn.");
 		}
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector <wchar *> (1, my rows -> size);
+		thy strings = NUMvector <char32 *> (1, my rows -> size);
 		thy numberOfStrings = 0;
 		for (long irow = 1; irow <= my rows -> size; irow++) {
-			thy strings[irow] = Melder_wcsdup (Table_getStringValue_Assert (me, irow, column));
+			thy strings[irow] = Melder_dup (Table_getStringValue_Assert (me, irow, column));
 			thy numberOfStrings++;
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Espeakdata: voices not initialized.");
+		Melder_throw (U"Espeakdata: voices not initialized.");
 	}
 }
 
 char * espeakdata_get_dict_data (const char *name, unsigned int *size) {
 	long lsize;
-	char *data = FilesInMemory_getCopyOfData (espeakdata_dicts, Melder_peekUtf8ToWcs (name), &lsize);
+	char *data = FilesInMemory_getCopyOfData (espeakdata_dicts, Melder_peek8to32 (name), &lsize);
 	*size = (unsigned int) lsize;
 	return data;
 }
 
 
 const char * espeakdata_get_voice (const char *vname, long *numberOfBytes) {
-	return FilesInMemory_getData (espeakdata_voices, Melder_peekUtf8ToWcs (vname), numberOfBytes);
+	return FilesInMemory_getData (espeakdata_voices, Melder_peek8to32 (vname), numberOfBytes);
 }
 
 const char * espeakdata_get_voiceVariant (const char *vname, long *numberOfBytes) {
 	char *plus = strstr ((char *) vname, "+"); // prototype says: strstr (const char *, const char *)
 	const char *name = plus != NULL ? ++plus : vname;
-	return FilesInMemory_getData (espeakdata_variants, Melder_peekUtf8ToWcs (name), numberOfBytes);;
+	return FilesInMemory_getData (espeakdata_variants, Melder_peek8to32 (name), numberOfBytes);;
 }
 
 
diff --git a/external/espeak/espeakdata_FileInMemory.h b/external/espeak/espeakdata_FileInMemory.h
index 5958e06..9fcb953 100644
--- a/external/espeak/espeakdata_FileInMemory.h
+++ b/external/espeak/espeakdata_FileInMemory.h
@@ -37,7 +37,7 @@ void espeakdata_praat_init ();
 const char * espeakdata_get_voicedata (const char *data, long ndata, char *buf, long nbuf, long *index);
 Table espeakdata_voices_to_Table (FilesInMemory me);
 Strings espeakdata_voices_getNames (Table me, long column);
-// mask the char / wchar_t
+// mask the char / char32
 char * espeakdata_get_dict_data (const char *name, unsigned int *size);
 const char * espeakdata_get_voice (const char *vname, long *numberOfBytes);
 const char * espeakdata_get_voiceVariant (const char *vname, long *numberOfBytes);
diff --git a/external/espeak/espeakdata_dicts.cpp b/external/espeak/espeakdata_dicts.cpp
index 06eae1d..9c61886 100644
--- a/external/espeak/espeakdata_dicts.cpp
+++ b/external/espeak/espeakdata_dicts.cpp
@@ -2720,8 +2720,8 @@ FilesInMemory create_espeakdata_dicts () {
 			3, 113, 0, 195, 170, 101, 114, 1, 108, 3, 113, 13, 34, 0, 195, 170, 114, 1, 107, 115, 2, 12, 3, 113, 34, 0, 195, 170, 114, 101,
 			1, 98, 2, 32, 3, 113, 34, 13, 0, 195, 170, 3, 130, 0, 195, 180, 3, 131, 0, 195, 174, 101, 3, 132, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts1 = FileInMemory_createWithData (81297, reinterpret_cast<const char *> (&espeakdata_dicts1_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/af_dict", 
-			L"af");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/af_dict", 
+			U"af");
 		Collection_addItem (me.peek(), espeakdata_dicts1.transfer());
 
 		static unsigned char espeakdata_dicts2_data[1351] = {
@@ -2772,8 +2772,8 @@ FilesInMemory create_espeakdata_dicts () {
 			1, 25, 2, 25, 3, 37, 0, 3, 57, 0, 7, 6, 122, 0, 3, 88, 0, 7, 6, 0, 36, 3, 72, 109, 55, 35, 51, 0, 7, 0,
 			0};
 		autoFileInMemory espeakdata_dicts2 = FileInMemory_createWithData (1350, reinterpret_cast<const char *> (&espeakdata_dicts2_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ak_dict", 
-			L"ak");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ak_dict", 
+			U"ak");
 		Collection_addItem (me.peek(), espeakdata_dicts2.transfer());
 
 		static unsigned char espeakdata_dicts3_data[3335] = {
@@ -2890,8 +2890,8 @@ FilesInMemory create_espeakdata_dicts () {
 			3, 83, 40, 0, 154, 3, 83, 57, 13, 0, 143, 3, 83, 58, 35, 0, 141, 3, 83, 108, 0, 7, 6, 0, 36, 3, 72, 39, 55, 35,
 			34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts3 = FileInMemory_createWithData (3334, reinterpret_cast<const char *> (&espeakdata_dicts3_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/am_dict", 
-			L"am");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/am_dict", 
+			U"am");
 		Collection_addItem (me.peek(), espeakdata_dicts3.transfer());
 
 		static unsigned char espeakdata_dicts4_data[1813] = {
@@ -2957,8 +2957,8 @@ FilesInMemory create_espeakdata_dicts () {
 			0, 3, 84, 0, 7, 6, 119, 0, 3, 58, 0, 7, 6, 120, 0, 3, 101, 0, 7, 6, 121, 0, 3, 57, 0, 7, 6, 122, 0, 3,
 			88, 0, 7, 6, 0, 195, 164, 3, 127, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts4 = FileInMemory_createWithData (1812, reinterpret_cast<const char *> (&espeakdata_dicts4_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/az_dict", 
-			L"az");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/az_dict", 
+			U"az");
 		Collection_addItem (me.peek(), espeakdata_dicts4.transfer());
 
 		static unsigned char espeakdata_dicts5_data[26955] = {
@@ -3862,8 +3862,8 @@ FilesInMemory create_espeakdata_dicts () {
 			1, 21, 2, 32, 14, 128, 192, 130, 3, 57, 35, 47, 0, 7, 6, 0, 209, 144, 3, 7, 36, 0, 209, 157, 3, 7, 37, 0, 204, 128,
 			3, 8, 0, 36, 3, 72, 6, 39, 64, 35, 34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts5 = FileInMemory_createWithData (26954, reinterpret_cast<const char *> (&espeakdata_dicts5_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/bg_dict", 
-			L"bg");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/bg_dict", 
+			U"bg");
 		Collection_addItem (me.peek(), espeakdata_dicts5.transfer());
 
 		static unsigned char espeakdata_dicts6_data[2830] = {
@@ -3963,8 +3963,8 @@ FilesInMemory create_espeakdata_dicts () {
 			66, 0, 170, 3, 151, 35, 0, 4, 172, 1, 21, 2, 32, 3, 152, 0, 172, 2, 17, 66, 0, 172, 3, 152, 35, 0, 7, 6, 0, 36,
 			3, 72, 39, 55, 35, 34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts6 = FileInMemory_createWithData (2829, reinterpret_cast<const char *> (&espeakdata_dicts6_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/bo_dict", 
-			L"bo");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/bo_dict", 
+			U"bo");
 		Collection_addItem (me.peek(), espeakdata_dicts6.transfer());
 
 		static unsigned char espeakdata_dicts7_data[4178] = {
@@ -4109,8 +4109,8 @@ FilesInMemory create_espeakdata_dicts () {
 			195, 175, 3, 37, 0, 195, 188, 3, 40, 0, 197, 128, 3, 55, 0, 195, 188, 1, 103, 3, 58, 0, 195, 177, 3, 67, 0, 36, 3, 72,
 			39, 55, 124, 16, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts7 = FileInMemory_createWithData (4177, reinterpret_cast<const char *> (&espeakdata_dicts7_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ca_dict", 
-			L"ca");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ca_dict", 
+			U"ca");
 		Collection_addItem (me.peek(), espeakdata_dicts7.transfer());
 
 		static unsigned char espeakdata_dicts8_data[7615] = {
@@ -4369,8 +4369,8 @@ FilesInMemory create_espeakdata_dicts () {
 			17, 67, 2, 32, 15, 0, 195, 171, 3, 36, 0, 195, 188, 3, 37, 0, 197, 149, 3, 44, 0, 196, 186, 3, 45, 0, 45, 8, 32, 2,
 			32, 15, 3, 65, 121, 50, 40, 89, 0, 36, 3, 72, 39, 55, 124, 51, 0, 195, 182, 3, 123, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts8 = FileInMemory_createWithData (7614, reinterpret_cast<const char *> (&espeakdata_dicts8_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/cs_dict", 
-			L"cs");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/cs_dict", 
+			U"cs");
 		Collection_addItem (me.peek(), espeakdata_dicts8.transfer());
 
 		static unsigned char espeakdata_dicts9_data[3463] = {
@@ -4491,8 +4491,8 @@ FilesInMemory create_espeakdata_dicts () {
 			112, 0, 4, 195, 174, 3, 114, 0, 195, 175, 0, 4, 195, 187, 3, 115, 0, 197, 183, 0, 197, 181, 3, 116, 0, 195, 170, 3, 117, 0,
 			195, 180, 3, 118, 0, 195, 162, 3, 119, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts9 = FileInMemory_createWithData (3462, reinterpret_cast<const char *> (&espeakdata_dicts9_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/cy_dict", 
-			L"cy");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/cy_dict", 
+			U"cy");
 		Collection_addItem (me.peek(), espeakdata_dicts9.transfer());
 
 		static unsigned char espeakdata_dicts10_data[193792] = {
@@ -10957,8 +10957,8 @@ FilesInMemory create_espeakdata_dicts () {
 			109, 98, 105, 3, 89, 114, 65, 71, 37, 0, 111, 109, 98, 105, 101, 0, 7, 6, 0, 195, 177, 3, 21, 101, 115, 0, 195, 175, 3, 37,
 			12, 0, 36, 3, 72, 114, 55, 114, 0, 195, 167, 3, 89, 0, 195, 160, 3, 110, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts10 = FileInMemory_createWithData (193791, reinterpret_cast<const char *> (&espeakdata_dicts10_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/da_dict", 
-			L"da");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/da_dict", 
+			U"da");
 		Collection_addItem (me.peek(), espeakdata_dicts10.transfer());
 
 		static unsigned char espeakdata_dicts11_data[21637] = {
@@ -11685,8 +11685,8 @@ FilesInMemory create_espeakdata_dicts () {
 			197, 161, 3, 91, 0, 45, 1, 32, 15, 2, 32, 15, 3, 91, 47, 34, 111, 99, 0, 195, 166, 3, 109, 0, 195, 169, 3, 126, 0, 195,
 			184, 3, 131, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts11 = FileInMemory_createWithData (21636, reinterpret_cast<const char *> (&espeakdata_dicts11_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/de_dict", 
-			L"de");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/de_dict", 
+			U"de");
 		Collection_addItem (me.peek(), espeakdata_dicts11.transfer());
 
 		static unsigned char espeakdata_dicts12_data[3607] = {
@@ -11812,8 +11812,8 @@ FilesInMemory create_espeakdata_dicts () {
 			7, 6, 1, 48, 0, 3, 119, 0, 7, 6, 1, 49, 0, 3, 0, 7, 6, 1, 50, 0, 3, 66, 0, 7, 6, 0, 36, 3, 72, 39,
 			55, 35, 51, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts12 = FileInMemory_createWithData (3606, reinterpret_cast<const char *> (&espeakdata_dicts12_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/dv_dict", 
-			L"dv");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/dv_dict", 
+			U"dv");
 		Collection_addItem (me.peek(), espeakdata_dicts12.transfer());
 
 		static unsigned char espeakdata_dicts13_data[5352] = {
@@ -11997,8 +11997,8 @@ FilesInMemory create_espeakdata_dicts () {
 			3, 37, 0, 207, 139, 0, 46, 3, 47, 36, 55, 6, 37, 35, 0, 44, 2, 15, 3, 49, 6, 39, 65, 35, 0, 33, 3, 87, 35, 84,
 			65, 35, 89, 47, 37, 49, 6, 39, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts13 = FileInMemory_createWithData (5351, reinterpret_cast<const char *> (&espeakdata_dicts13_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/el_dict", 
-			L"el");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/el_dict", 
+			U"el");
 		Collection_addItem (me.peek(), espeakdata_dicts13.transfer());
 
 		static unsigned char espeakdata_dicts14_data[94548] = {
@@ -15155,8 +15155,8 @@ FilesInMemory create_espeakdata_dicts () {
 			91, 0, 197, 161, 0, 4, 195, 164, 3, 121, 0, 195, 171, 0, 195, 170, 3, 121, 12, 0, 195, 182, 3, 128, 0, 4, 195, 169, 101, 3,
 			129, 0, 195, 175, 0, 195, 188, 3, 134, 0, 195, 169, 3, 138, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts14 = FileInMemory_createWithData (94547, reinterpret_cast<const char *> (&espeakdata_dicts14_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/en_dict", 
-			L"en");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/en_dict", 
+			U"en");
 		Collection_addItem (me.peek(), espeakdata_dicts14.transfer());
 
 		static unsigned char espeakdata_dicts15_data[4669] = {
@@ -15317,8 +15317,8 @@ FilesInMemory create_espeakdata_dicts () {
 			47, 39, 10, 0, 196, 181, 3, 90, 0, 196, 181, 8, 2, 32, 3, 90, 39, 0, 197, 157, 3, 91, 0, 197, 157, 8, 2, 32, 3, 91,
 			39, 0, 196, 165, 3, 101, 0, 196, 165, 8, 2, 32, 3, 101, 39, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts15 = FileInMemory_createWithData (4668, reinterpret_cast<const char *> (&espeakdata_dicts15_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/eo_dict", 
-			L"eo");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/eo_dict", 
+			U"eo");
 		Collection_addItem (me.peek(), espeakdata_dicts15.transfer());
 
 		static unsigned char espeakdata_dicts16_data[6340] = {
@@ -15535,8 +15535,8 @@ FilesInMemory create_espeakdata_dicts () {
 			0, 44, 2, 15, 3, 49, 110, 65, 35, 0, 45, 8, 2, 32, 15, 3, 65, 6, 109, 50, 110, 89, 0, 195, 177, 3, 67, 0, 36, 3,
 			72, 6, 110, 55, 35, 34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts16 = FileInMemory_createWithData (6339, reinterpret_cast<const char *> (&espeakdata_dicts16_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/es_dict", 
-			L"es");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/es_dict", 
+			U"es");
 		Collection_addItem (me.peek(), espeakdata_dicts16.transfer());
 
 		static unsigned char espeakdata_dicts17_data[6778] = {
@@ -15767,8 +15767,8 @@ FilesInMemory create_espeakdata_dicts () {
 			88, 0, 104, 1, 25, 3, 90, 0, 7, 6, 0, 4, 45, 1, 32, 17, 65, 2, 32, 15, 3, 10, 0, 45, 1, 32, 17, 67, 2, 32,
 			15, 0, 45, 8, 32, 2, 32, 15, 3, 65, 112, 50, 40, 89, 0, 197, 190, 3, 90, 0, 197, 161, 3, 91, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts17 = FileInMemory_createWithData (6777, reinterpret_cast<const char *> (&espeakdata_dicts17_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/et_dict", 
-			L"et");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/et_dict", 
+			U"et");
 		Collection_addItem (me.peek(), espeakdata_dicts17.transfer());
 
 		static unsigned char espeakdata_dicts18_data[5131] = {
@@ -15945,8 +15945,8 @@ FilesInMemory create_espeakdata_dicts () {
 			35, 34, 37, 50, 0, 197, 190, 3, 90, 0, 197, 161, 3, 91, 0, 195, 188, 3, 114, 0, 195, 188, 195, 188, 3, 114, 12, 0, 7, 0,
 			0};
 		autoFileInMemory espeakdata_dicts18 = FileInMemory_createWithData (5130, reinterpret_cast<const char *> (&espeakdata_dicts18_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/fi_dict", 
-			L"fi");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/fi_dict", 
+			U"fi");
 		Collection_addItem (me.peek(), espeakdata_dicts18.transfer());
 
 		static unsigned char espeakdata_dicts19_data[21485] = {
@@ -16668,8 +16668,8 @@ FilesInMemory create_espeakdata_dicts () {
 			0, 195, 188, 3, 111, 0, 195, 187, 3, 111, 12, 0, 195, 170, 3, 112, 0, 58, 8, 32, 18, 81, 2, 32, 18, 82, 15, 32, 3, 117,
 			34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts19 = FileInMemory_createWithData (21484, reinterpret_cast<const char *> (&espeakdata_dicts19_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/fr_dict", 
-			L"fr");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/fr_dict", 
+			U"fr");
 		Collection_addItem (me.peek(), espeakdata_dicts19.transfer());
 
 		static unsigned char espeakdata_dicts20_data[1093] = {
@@ -16711,8 +16711,8 @@ FilesInMemory create_espeakdata_dicts () {
 			108, 0, 7, 6, 105, 0, 3, 110, 0, 7, 6, 111, 0, 3, 112, 0, 7, 6, 116, 0, 3, 47, 0, 7, 6, 117, 0, 3, 114, 0,
 			7, 6, 0, 36, 3, 70, 111, 55, 13, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts20 = FileInMemory_createWithData (1092, reinterpret_cast<const char *> (&espeakdata_dicts20_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ga_dict", 
-			L"ga");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ga_dict", 
+			U"ga");
 		Collection_addItem (me.peek(), espeakdata_dicts20.transfer());
 
 		static unsigned char espeakdata_dicts21_data[3391] = {
@@ -16831,8 +16831,8 @@ FilesInMemory create_espeakdata_dicts () {
 			125, 12, 0, 39, 3, 8, 0, 225, 190, 179, 3, 117, 12, 0, 225, 191, 131, 3, 119, 12, 0, 225, 191, 179, 3, 125, 12, 0, 7, 0,
 			0};
 		autoFileInMemory espeakdata_dicts21 = FileInMemory_createWithData (3390, reinterpret_cast<const char *> (&espeakdata_dicts21_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/grc_dict", 
-			L"grc");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/grc_dict", 
+			U"grc");
 		Collection_addItem (me.peek(), espeakdata_dicts21.transfer());
 
 		static unsigned char espeakdata_dicts22_data[7360] = {
@@ -17083,8 +17083,8 @@ FilesInMemory create_espeakdata_dicts () {
 			40, 89, 0, 36, 3, 72, 6, 39, 55, 122, 51, 0, 195, 173, 3, 121, 0, 195, 169, 3, 123, 0, 195, 161, 3, 124, 0, 195, 179, 3,
 			125, 0, 195, 186, 3, 126, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts22 = FileInMemory_createWithData (7359, reinterpret_cast<const char *> (&espeakdata_dicts22_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/hbs_dict", 
-			L"hbs");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/hbs_dict", 
+			U"hbs");
 		Collection_addItem (me.peek(), espeakdata_dicts22.transfer());
 
 		static unsigned char espeakdata_dicts23_data[5724] = {
@@ -17280,8 +17280,8 @@ FilesInMemory create_espeakdata_dicts () {
 			100, 0, 3, 45, 12, 0, 7, 6, 111, 0, 3, 21, 0, 102, 1, 32, 32, 15, 2, 32, 32, 15, 194, 160, 194, 160, 194, 160, 3, 65,
 			36, 0, 7, 6, 0, 37, 3, 48, 109, 89, 116, 50, 47, 0, 36, 3, 72, 121, 55, 109, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts23 = FileInMemory_createWithData (5723, reinterpret_cast<const char *> (&espeakdata_dicts23_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/hi_dict", 
-			L"hi");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/hi_dict", 
+			U"hi");
 		Collection_addItem (me.peek(), espeakdata_dicts23.transfer());
 
 		static unsigned char espeakdata_dicts24_data[2417] = {
@@ -17367,8 +17367,8 @@ FilesInMemory create_espeakdata_dicts () {
 			7, 6, 120, 0, 3, 49, 89, 0, 7, 6, 121, 0, 1, 25, 2, 25, 3, 37, 0, 3, 57, 0, 7, 6, 122, 0, 3, 88, 0, 7,
 			6, 0, 36, 3, 72, 39, 55, 35, 0, 195, 167, 3, 89, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts24 = FileInMemory_createWithData (2416, reinterpret_cast<const char *> (&espeakdata_dicts24_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ht_dict", 
-			L"ht");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ht_dict", 
+			U"ht");
 		Collection_addItem (me.peek(), espeakdata_dicts24.transfer());
 
 		static unsigned char espeakdata_dicts25_data[112826] = {
@@ -21134,8 +21134,8 @@ FilesInMemory create_espeakdata_dicts () {
 			188, 114, 105, 99, 104, 8, 3, 119, 111, 52, 37, 0, 7, 6, 0, 195, 177, 3, 67, 0, 36, 3, 72, 39, 55, 55, 114, 52, 0, 195,
 			167, 3, 76, 0, 195, 159, 3, 89, 0, 4, 195, 164, 3, 109, 0, 195, 166, 0, 195, 184, 3, 110, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts25 = FileInMemory_createWithData (112825, reinterpret_cast<const char *> (&espeakdata_dicts25_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/hu_dict", 
-			L"hu");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/hu_dict", 
+			U"hu");
 		Collection_addItem (me.peek(), espeakdata_dicts25.transfer());
 
 		static unsigned char espeakdata_dicts26_data[2436] = {
@@ -21222,8 +21222,8 @@ FilesInMemory create_espeakdata_dicts () {
 			6, 1, 86, 0, 3, 39, 0, 7, 6, 1, 87, 0, 3, 83, 0, 8, 2, 17, 67, 3, 83, 13, 0, 7, 6, 0, 36, 3, 72, 39,
 			55, 13, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts26 = FileInMemory_createWithData (2435, reinterpret_cast<const char *> (&espeakdata_dicts26_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/hy_dict", 
-			L"hy");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/hy_dict", 
+			U"hy");
 		Collection_addItem (me.peek(), espeakdata_dicts26.transfer());
 
 		static unsigned char espeakdata_dicts27_data[3083] = {
@@ -21331,8 +21331,8 @@ FilesInMemory create_espeakdata_dicts () {
 			42, 3, 0, 42, 1, 42, 42, 2, 32, 3, 24, 0, 45, 8, 32, 2, 32, 15, 3, 47, 4, 35, 50, 72, 35, 49, 6, 40, 52, 35,
 			68, 0, 42, 3, 71, 6, 37, 50, 47, 35, 68, 0, 36, 3, 72, 110, 55, 35, 51, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts27 = FileInMemory_createWithData (3082, reinterpret_cast<const char *> (&espeakdata_dicts27_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/id_dict", 
-			L"id");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/id_dict", 
+			U"id");
 		Collection_addItem (me.peek(), espeakdata_dicts27.transfer());
 
 		static unsigned char espeakdata_dicts28_data[5469] = {
@@ -21520,8 +21520,8 @@ FilesInMemory create_espeakdata_dicts () {
 			109, 0, 4, 3, 110, 0, 2, 17, 69, 17, 68, 0, 7, 6, 122, 0, 122, 3, 47, 89, 0, 3, 88, 0, 7, 6, 0, 36, 3, 72,
 			114, 55, 55, 35, 34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts28 = FileInMemory_createWithData (5468, reinterpret_cast<const char *> (&espeakdata_dicts28_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/is_dict", 
-			L"is");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/is_dict", 
+			U"is");
 		Collection_addItem (me.peek(), espeakdata_dicts28.transfer());
 
 		static unsigned char espeakdata_dicts29_data[43393] = {
@@ -22973,8 +22973,8 @@ FilesInMemory create_espeakdata_dicts () {
 			65, 36, 50, 39, 0, 36, 3, 72, 39, 55, 55, 35, 34, 39, 0, 44, 2, 15, 3, 84, 6, 37, 34, 81, 39, 55, 35, 0, 194, 167,
 			3, 89, 36, 123, 37, 6, 39, 50, 36, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts29 = FileInMemory_createWithData (43392, reinterpret_cast<const char *> (&espeakdata_dicts29_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/it_dict", 
-			L"it");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/it_dict", 
+			U"it");
 		Collection_addItem (me.peek(), espeakdata_dicts29.transfer());
 
 		static unsigned char espeakdata_dicts30_data[2058] = {
@@ -23048,8 +23048,8 @@ FilesInMemory create_espeakdata_dicts () {
 			0, 7, 6, 0, 203, 136, 3, 6, 0, 39, 8, 2, 32, 3, 6, 13, 107, 13, 0, 4, 46, 3, 11, 0, 46, 2, 32, 14, 128, 128,
 			129, 0, 46, 8, 2, 21, 14, 128, 132, 129, 0, 39, 3, 107, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts30 = FileInMemory_createWithData (2057, reinterpret_cast<const char *> (&espeakdata_dicts30_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/jbo_dict", 
-			L"jbo");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/jbo_dict", 
+			U"jbo");
 		Collection_addItem (me.peek(), espeakdata_dicts30.transfer());
 
 		static unsigned char espeakdata_dicts31_data[3163] = {
@@ -23160,8 +23160,8 @@ FilesInMemory create_espeakdata_dicts () {
 			0, 7, 6, 209, 0, 3, 21, 114, 117, 0, 7, 6, 210, 0, 3, 21, 114, 117, 0, 7, 6, 211, 0, 3, 21, 114, 117, 0, 7, 6,
 			0, 36, 3, 72, 39, 55, 35, 34, 37, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts31 = FileInMemory_createWithData (3162, reinterpret_cast<const char *> (&espeakdata_dicts31_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ka_dict", 
-			L"ka");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ka_dict", 
+			U"ka");
 		Collection_addItem (me.peek(), espeakdata_dicts31.transfer());
 
 		static unsigned char espeakdata_dicts32_data[2024] = {
@@ -23234,8 +23234,8 @@ FilesInMemory create_espeakdata_dicts () {
 			177, 0, 3, 111, 0, 7, 6, 210, 187, 0, 3, 107, 0, 7, 6, 211, 153, 0, 3, 113, 0, 7, 6, 211, 169, 0, 3, 115, 0, 7,
 			6, 0, 4, 209, 138, 3, 0, 209, 140, 3, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts32 = FileInMemory_createWithData (2023, reinterpret_cast<const char *> (&espeakdata_dicts32_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/kk_dict", 
-			L"kk");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/kk_dict", 
+			U"kk");
 		Collection_addItem (me.peek(), espeakdata_dicts32.transfer());
 
 		static unsigned char espeakdata_dicts33_data[1678] = {
@@ -23296,8 +23296,8 @@ FilesInMemory create_espeakdata_dicts () {
 			84, 0, 118, 3, 84, 12, 0, 7, 6, 119, 0, 3, 58, 0, 7, 6, 120, 0, 3, 49, 89, 0, 7, 6, 121, 0, 1, 25, 2, 25,
 			3, 37, 0, 3, 57, 0, 7, 6, 122, 0, 3, 88, 0, 7, 6, 0, 36, 3, 72, 6, 39, 55, 35, 34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts33 = FileInMemory_createWithData (1677, reinterpret_cast<const char *> (&espeakdata_dicts33_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/kl_dict", 
-			L"kl");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/kl_dict", 
+			U"kl");
 		Collection_addItem (me.peek(), espeakdata_dicts33.transfer());
 
 		static unsigned char espeakdata_dicts34_data[5368] = {
@@ -23481,8 +23481,8 @@ FilesInMemory create_espeakdata_dicts () {
 			34, 40, 0, 134, 3, 36, 0, 138, 3, 39, 0, 129, 3, 40, 0, 132, 3, 44, 12, 0, 128, 3, 112, 0, 135, 3, 114, 0, 139, 3,
 			119, 0, 130, 3, 123, 0, 136, 3, 134, 0, 140, 3, 135, 0, 7, 6, 0, 36, 3, 72, 119, 62, 35, 34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts34 = FileInMemory_createWithData (5367, reinterpret_cast<const char *> (&espeakdata_dicts34_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/kn_dict", 
-			L"kn");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/kn_dict", 
+			U"kn");
 		Collection_addItem (me.peek(), espeakdata_dicts34.transfer());
 
 		static unsigned char espeakdata_dicts35_data[6488] = {
@@ -23704,8 +23704,8 @@ FilesInMemory create_espeakdata_dicts () {
 			3, 112, 0, 129, 3, 48, 0, 129, 2, 17, 65, 3, 114, 0, 130, 2, 17, 65, 3, 0, 130, 3, 112, 0, 7, 6, 0, 4, 46, 3,
 			0, 203, 144, 3, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts35 = FileInMemory_createWithData (6487, reinterpret_cast<const char *> (&espeakdata_dicts35_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ko_dict", 
-			L"ko");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ko_dict", 
+			U"ko");
 		Collection_addItem (me.peek(), espeakdata_dicts35.transfer());
 
 		static unsigned char espeakdata_dicts36_data[2277] = {
@@ -23786,8 +23786,8 @@ FilesInMemory create_espeakdata_dicts () {
 			0, 3, 58, 0, 7, 6, 120, 0, 3, 101, 0, 119, 101, 3, 101, 58, 126, 0, 7, 6, 121, 0, 3, 57, 0, 7, 6, 122, 0, 3,
 			88, 0, 7, 6, 0, 36, 3, 72, 111, 55, 35, 34, 0, 195, 188, 3, 112, 0, 195, 182, 3, 124, 12, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts36 = FileInMemory_createWithData (2276, reinterpret_cast<const char *> (&espeakdata_dicts36_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ku_dict", 
-			L"ku");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ku_dict", 
+			U"ku");
 		Collection_addItem (me.peek(), espeakdata_dicts36.transfer());
 
 		static unsigned char espeakdata_dicts37_data[3818] = {
@@ -23920,8 +23920,8 @@ FilesInMemory create_espeakdata_dicts () {
 			121, 3, 118, 0, 7, 6, 122, 0, 3, 88, 0, 4, 1, 17, 65, 2, 17, 65, 3, 88, 12, 0, 122, 0, 7, 6, 0, 106, 3, 57,
 			0, 119, 3, 58, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts37 = FileInMemory_createWithData (3817, reinterpret_cast<const char *> (&espeakdata_dicts37_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/la_dict", 
-			L"la");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/la_dict", 
+			U"la");
 		Collection_addItem (me.peek(), espeakdata_dicts37.transfer());
 
 		static unsigned char espeakdata_dicts38_data[5185] = {
@@ -24099,8 +24099,8 @@ FilesInMemory create_espeakdata_dicts () {
 			37, 50, 40, 89, 0, 62, 61, 3, 72, 123, 81, 38, 6, 123, 10, 35, 34, 71, 6, 108, 10, 137, 115, 81, 40, 0, 58, 3, 135, 84,
 			38, 6, 114, 47, 35, 97, 49, 38, 37, 89, 0, 33, 61, 3, 136, 36, 137, 6, 115, 81, 40, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts38 = FileInMemory_createWithData (5184, reinterpret_cast<const char *> (&espeakdata_dicts38_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/lt_dict", 
-			L"lt");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/lt_dict", 
+			U"lt");
 		Collection_addItem (me.peek(), espeakdata_dicts38.transfer());
 
 		static unsigned char espeakdata_dicts39_data[12328] = {
@@ -24516,8 +24516,8 @@ FilesInMemory create_espeakdata_dicts () {
 			84, 116, 15, 84, 6, 122, 50, 113, 72, 89, 0, 60, 61, 3, 65, 35, 88, 113, 49, 89, 15, 4, 84, 116, 15, 84, 6, 122, 50, 113,
 			72, 89, 0, 45, 8, 32, 2, 32, 15, 3, 65, 108, 50, 40, 89, 0, 36, 3, 72, 39, 55, 113, 34, 37, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts39 = FileInMemory_createWithData (12327, reinterpret_cast<const char *> (&espeakdata_dicts39_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/lv_dict", 
-			L"lv");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/lv_dict", 
+			U"lv");
 		Collection_addItem (me.peek(), espeakdata_dicts39.transfer());
 
 		static unsigned char espeakdata_dicts40_data[4946] = {
@@ -24687,8 +24687,8 @@ FilesInMemory create_espeakdata_dicts () {
 			65, 37, 50, 40, 89, 0, 36, 3, 72, 6, 39, 55, 122, 51, 0, 42, 3, 118, 84, 6, 36, 88, 72, 37, 76, 49, 122, 0, 195, 173,
 			3, 121, 0, 195, 169, 3, 123, 0, 195, 161, 3, 124, 0, 195, 179, 3, 125, 0, 195, 186, 3, 126, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts40 = FileInMemory_createWithData (4945, reinterpret_cast<const char *> (&espeakdata_dicts40_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/mk_dict", 
-			L"mk");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/mk_dict", 
+			U"mk");
 		Collection_addItem (me.peek(), espeakdata_dicts40.transfer());
 
 		static unsigned char espeakdata_dicts41_data[3020] = {
@@ -24794,8 +24794,8 @@ FilesInMemory create_espeakdata_dicts () {
 			149, 12, 0, 128, 3, 112, 0, 135, 3, 114, 0, 139, 3, 119, 0, 130, 3, 123, 0, 136, 3, 134, 0, 4, 140, 3, 135, 0, 151, 0,
 			141, 2, 32, 3, 149, 0, 7, 6, 0, 36, 3, 72, 119, 62, 35, 34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts41 = FileInMemory_createWithData (3019, reinterpret_cast<const char *> (&espeakdata_dicts41_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ml_dict", 
-			L"ml");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ml_dict", 
+			U"ml");
 		Collection_addItem (me.peek(), espeakdata_dicts41.transfer());
 
 		static unsigned char espeakdata_dicts42_data[4388] = {
@@ -24947,8 +24947,8 @@ FilesInMemory create_espeakdata_dicts () {
 			182, 3, 127, 0, 7, 6, 122, 0, 3, 47, 89, 36, 0, 104, 1, 25, 3, 90, 0, 7, 6, 0, 196, 139, 3, 76, 13, 0, 197, 188,
 			3, 88, 6, 13, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts42 = FileInMemory_createWithData (4387, reinterpret_cast<const char *> (&espeakdata_dicts42_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/mt_dict", 
-			L"mt");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/mt_dict", 
+			U"mt");
 		Collection_addItem (me.peek(), espeakdata_dicts42.transfer());
 
 		static unsigned char espeakdata_dicts43_data[1535] = {
@@ -25005,8 +25005,8 @@ FilesInMemory create_espeakdata_dicts () {
 			98, 3, 71, 0, 100, 3, 72, 0, 103, 3, 81, 0, 102, 3, 83, 0, 118, 3, 84, 0, 4, 115, 3, 89, 0, 195, 167, 0, 106, 3,
 			101, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts43 = FileInMemory_createWithData (1534, reinterpret_cast<const char *> (&espeakdata_dicts43_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/nci_dict", 
-			L"nci");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/nci_dict", 
+			U"nci");
 		Collection_addItem (me.peek(), espeakdata_dicts43.transfer());
 
 		static unsigned char espeakdata_dicts44_data[10795] = {
@@ -25371,8 +25371,8 @@ FilesInMemory create_espeakdata_dicts () {
 			6, 39, 71, 6, 71, 111, 34, 111, 4, 58, 37, 34, 6, 118, 12, 65, 109, 0, 36, 3, 72, 121, 55, 109, 0, 224, 165, 176, 3, 109,
 			4, 50, 89, 107, 13, 0, 224, 165, 146, 3, 109, 72, 6, 119, 4, 34, 6, 36, 146, 6, 118, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts44 = FileInMemory_createWithData (10794, reinterpret_cast<const char *> (&espeakdata_dicts44_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ne_dict", 
-			L"ne");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ne_dict", 
+			U"ne");
 		Collection_addItem (me.peek(), espeakdata_dicts44.transfer());
 
 		static unsigned char espeakdata_dicts45_data[21599] = {
@@ -26097,8 +26097,8 @@ FilesInMemory create_espeakdata_dicts () {
 			0, 44, 2, 15, 3, 49, 6, 113, 65, 115, 0, 45, 8, 32, 2, 32, 15, 3, 65, 6, 108, 50, 0, 36, 3, 72, 6, 113, 55, 116,
 			34, 0, 39, 115, 1, 21, 2, 32, 14, 128, 128, 130, 3, 89, 0, 4, 195, 169, 3, 119, 0, 195, 169, 195, 169, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts45 = FileInMemory_createWithData (21598, reinterpret_cast<const char *> (&espeakdata_dicts45_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/nl_dict", 
-			L"nl");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/nl_dict", 
+			U"nl");
 		Collection_addItem (me.peek(), espeakdata_dicts45.transfer());
 
 		static unsigned char espeakdata_dicts46_data[4198] = {
@@ -26243,8 +26243,8 @@ FilesInMemory create_espeakdata_dicts () {
 			32, 17, 65, 2, 32, 15, 3, 10, 0, 45, 1, 32, 17, 67, 2, 32, 15, 0, 46, 3, 48, 125, 68, 49, 47, 126, 65, 0, 45, 8,
 			32, 2, 32, 15, 3, 65, 110, 50, 126, 89, 0, 36, 3, 72, 121, 55, 55, 120, 51, 0, 195, 188, 3, 112, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts46 = FileInMemory_createWithData (4197, reinterpret_cast<const char *> (&espeakdata_dicts46_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/no_dict", 
-			L"no");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/no_dict", 
+			U"no");
 		Collection_addItem (me.peek(), espeakdata_dicts46.transfer());
 
 		static unsigned char espeakdata_dicts47_data[3416] = {
@@ -26363,8 +26363,8 @@ FilesInMemory create_espeakdata_dicts () {
 			35, 89, 37, 55, 37, 65, 37, 35, 0, 195, 180, 3, 39, 0, 42, 3, 67, 39, 47, 35, 0, 36, 3, 72, 39, 55, 35, 0, 197, 161,
 			8, 116, 3, 76, 0, 4, 197, 161, 3, 91, 0, 197, 161, 8, 112, 2, 104, 0, 195, 170, 3, 109, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts47 = FileInMemory_createWithData (3415, reinterpret_cast<const char *> (&espeakdata_dicts47_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/nso_dict", 
-			L"nso");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/nso_dict", 
+			U"nso");
 		Collection_addItem (me.peek(), espeakdata_dicts47.transfer());
 
 		static unsigned char espeakdata_dicts48_data[5257] = {
@@ -26545,8 +26545,8 @@ FilesInMemory create_espeakdata_dicts () {
 			116, 0, 3, 40, 0, 7, 6, 224, 171, 0, 160, 3, 44, 0, 7, 6, 0, 37, 3, 48, 109, 89, 116, 50, 47, 0, 36, 3, 72, 121,
 			55, 109, 51, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts48 = FileInMemory_createWithData (5256, reinterpret_cast<const char *> (&espeakdata_dicts48_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/pa_dict", 
-			L"pa");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/pa_dict", 
+			U"pa");
 		Collection_addItem (me.peek(), espeakdata_dicts48.transfer());
 
 		static unsigned char espeakdata_dicts49_data[2134] = {
@@ -26623,8 +26623,8 @@ FilesInMemory create_espeakdata_dicts () {
 			7, 37, 0, 195, 179, 3, 7, 39, 0, 195, 186, 3, 7, 40, 0, 39, 3, 19, 0, 36, 3, 72, 110, 55, 110, 0, 195, 167, 3, 89,
 			0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts49 = FileInMemory_createWithData (2133, reinterpret_cast<const char *> (&espeakdata_dicts49_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/pap_dict", 
-			L"pap");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/pap_dict", 
+			U"pap");
 		Collection_addItem (me.peek(), espeakdata_dicts49.transfer());
 
 		static unsigned char espeakdata_dicts50_data[39426] = {
@@ -27944,8 +27944,8 @@ FilesInMemory create_espeakdata_dicts () {
 			65, 40, 0, 39, 101, 103, 111, 2, 32, 14, 128, 128, 132, 3, 109, 81, 111, 0, 39, 111, 119, 105, 2, 32, 14, 128, 128, 132, 3, 111,
 			84, 37, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts50 = FileInMemory_createWithData (39425, reinterpret_cast<const char *> (&espeakdata_dicts50_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/pl_dict", 
-			L"pl");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/pl_dict", 
+			U"pl");
 		Collection_addItem (me.peek(), espeakdata_dicts50.transfer());
 
 		static unsigned char espeakdata_dicts51_data[2570] = {
@@ -28036,8 +28036,8 @@ FilesInMemory create_espeakdata_dicts () {
 			0, 3, 49, 109, 0, 7, 6, 218, 175, 0, 4, 2, 18, 66, 3, 81, 0, 2, 32, 0, 3, 81, 109, 0, 7, 6, 219, 140, 0, 3,
 			37, 0, 8, 3, 57, 109, 0, 7, 6, 0, 36, 3, 72, 39, 55, 13, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts51 = FileInMemory_createWithData (2569, reinterpret_cast<const char *> (&espeakdata_dicts51_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/prs_dict", 
-			L"prs");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/prs_dict", 
+			U"prs");
 		Collection_addItem (me.peek(), espeakdata_dicts51.transfer());
 
 		static unsigned char espeakdata_dicts52_data[18253] = {
@@ -28651,8 +28651,8 @@ FilesInMemory create_espeakdata_dicts () {
 			15, 3, 65, 6, 36, 50, 111, 89, 0, 44, 2, 15, 3, 84, 6, 37, 34, 81, 40, 55, 132, 0, 4, 195, 159, 3, 89, 0, 195, 167,
 			0, 36, 3, 89, 37, 83, 51, 6, 130, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts52 = FileInMemory_createWithData (18252, reinterpret_cast<const char *> (&espeakdata_dicts52_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/pt_dict", 
-			L"pt");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/pt_dict", 
+			U"pt");
 		Collection_addItem (me.peek(), espeakdata_dicts52.transfer());
 
 		static unsigned char espeakdata_dicts53_data[26886] = {
@@ -29554,8 +29554,8 @@ FilesInMemory create_espeakdata_dicts () {
 			65, 6, 37, 50, 40, 89, 0, 36, 3, 72, 39, 55, 35, 34, 0, 44, 2, 15, 3, 84, 6, 37, 34, 81, 40, 55, 13, 0, 195, 182,
 			3, 113, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts53 = FileInMemory_createWithData (26885, reinterpret_cast<const char *> (&espeakdata_dicts53_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ro_dict", 
-			L"ro");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ro_dict", 
+			U"ro");
 		Collection_addItem (me.peek(), espeakdata_dicts53.transfer());
 
 		static unsigned char espeakdata_dicts54_data[6158] = {
@@ -29766,8 +29766,8 @@ FilesInMemory create_espeakdata_dicts () {
 			0, 4, 1, 136, 209, 3, 6, 127, 0, 1, 182, 208, 0, 3, 6, 128, 0, 8, 2, 32, 3, 57, 128, 0, 7, 6, 0, 36, 3, 72,
 			39, 55, 35, 34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts54 = FileInMemory_createWithData (6157, reinterpret_cast<const char *> (&espeakdata_dicts54_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ru_dict", 
-			L"ru");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ru_dict", 
+			U"ru");
 		Collection_addItem (me.peek(), espeakdata_dicts54.transfer());
 
 		static unsigned char espeakdata_dicts55_data[2251] = {
@@ -29848,8 +29848,8 @@ FilesInMemory create_espeakdata_dicts () {
 			88, 0, 7, 6, 121, 0, 3, 57, 0, 7, 6, 122, 0, 3, 88, 0, 7, 6, 0, 36, 3, 72, 39, 55, 35, 16, 35, 0, 7, 0,
 			0};
 		autoFileInMemory espeakdata_dicts55 = FileInMemory_createWithData (2250, reinterpret_cast<const char *> (&espeakdata_dicts55_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/rw_dict", 
-			L"rw");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/rw_dict", 
+			U"rw");
 		Collection_addItem (me.peek(), espeakdata_dicts55.transfer());
 
 		static unsigned char espeakdata_dicts56_data[2455] = {
@@ -29936,8 +29936,8 @@ FilesInMemory create_espeakdata_dicts () {
 			179, 3, 55, 112, 0, 147, 3, 112, 0, 154, 3, 114, 0, 145, 3, 117, 0, 143, 3, 118, 0, 157, 3, 119, 0, 150, 3, 123, 0, 155,
 			3, 134, 0, 158, 3, 135, 0, 144, 3, 149, 0, 7, 6, 0, 36, 3, 72, 119, 62, 35, 34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts56 = FileInMemory_createWithData (2454, reinterpret_cast<const char *> (&espeakdata_dicts56_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/si_dict", 
-			L"si");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/si_dict", 
+			U"si");
 		Collection_addItem (me.peek(), espeakdata_dicts56.transfer());
 
 		static unsigned char espeakdata_dicts57_data[8715] = {
@@ -30233,8 +30233,8 @@ FilesInMemory create_espeakdata_dicts () {
 			196, 155, 3, 36, 0, 37, 1, 32, 15, 3, 48, 36, 51, 117, 36, 50, 47, 0, 37, 3, 48, 36, 51, 117, 36, 50, 47, 39, 0, 36,
 			3, 72, 39, 55, 124, 51, 0, 197, 175, 3, 126, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts57 = FileInMemory_createWithData (8714, reinterpret_cast<const char *> (&espeakdata_dicts57_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/sk_dict", 
-			L"sk");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/sk_dict", 
+			U"sk");
 		Collection_addItem (me.peek(), espeakdata_dicts57.transfer());
 
 		static unsigned char espeakdata_dicts58_data[2691] = {
@@ -30329,8 +30329,8 @@ FilesInMemory create_espeakdata_dicts () {
 			3, 21, 100, 101, 0, 36, 3, 72, 6, 39, 55, 35, 51, 0, 196, 145, 3, 75, 0, 196, 135, 3, 76, 0, 4, 195, 164, 3, 109, 0,
 			195, 168, 0, 195, 178, 3, 111, 0, 195, 188, 3, 112, 0, 197, 153, 3, 133, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts58 = FileInMemory_createWithData (2690, reinterpret_cast<const char *> (&espeakdata_dicts58_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/sl_dict", 
-			L"sl");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/sl_dict", 
+			U"sl");
 		Collection_addItem (me.peek(), espeakdata_dicts58.transfer());
 
 		static unsigned char espeakdata_dicts59_data[3215] = {
@@ -30443,8 +30443,8 @@ FilesInMemory create_espeakdata_dicts () {
 			121, 0, 3, 116, 0, 101, 3, 121, 0, 7, 6, 122, 0, 3, 88, 0, 104, 3, 90, 0, 7, 6, 0, 36, 3, 72, 117, 123, 35, 34,
 			37, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts59 = FileInMemory_createWithData (3214, reinterpret_cast<const char *> (&espeakdata_dicts59_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/sq_dict", 
-			L"sq");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/sq_dict", 
+			U"sq");
 		Collection_addItem (me.peek(), espeakdata_dicts59.transfer());
 
 		static unsigned char espeakdata_dicts60_data[9702] = {
@@ -30773,8 +30773,8 @@ FilesInMemory create_espeakdata_dicts () {
 			6, 123, 55, 35, 51, 0, 47, 3, 89, 50, 6, 110, 72, 89, 47, 51, 111, 49, 0, 64, 3, 89, 50, 6, 122, 71, 111, 55, 122, 0,
 			42, 3, 127, 6, 113, 51, 50, 35, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts60 = FileInMemory_createWithData (9701, reinterpret_cast<const char *> (&espeakdata_dicts60_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/sv_dict", 
-			L"sv");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/sv_dict", 
+			U"sv");
 		Collection_addItem (me.peek(), espeakdata_dicts60.transfer());
 
 		static unsigned char espeakdata_dicts61_data[3005] = {
@@ -30880,8 +30880,8 @@ FilesInMemory create_espeakdata_dicts () {
 			42, 42, 2, 32, 3, 24, 0, 37, 3, 35, 89, 37, 55, 37, 65, 37, 35, 0, 42, 3, 67, 39, 47, 35, 0, 36, 3, 72, 39, 55,
 			35, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts61 = FileInMemory_createWithData (3004, reinterpret_cast<const char *> (&espeakdata_dicts61_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/sw_dict", 
-			L"sw");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/sw_dict", 
+			U"sw");
 		Collection_addItem (me.peek(), espeakdata_dicts61.transfer());
 
 		static unsigned char espeakdata_dicts62_data[88228] = {
@@ -33827,8 +33827,8 @@ FilesInMemory create_espeakdata_dicts () {
 			32, 15, 0, 46, 1, 15, 2, 15, 12, 3, 10, 48, 40, 62, 62, 37, 0, 114, 115, 1, 19, 2, 32, 46, 15, 3, 34, 123, 48, 112,
 			88, 0, 45, 8, 32, 2, 32, 15, 3, 49, 109, 92, 37, 47, 47, 109, 55, 0, 36, 3, 72, 39, 55, 109, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts62 = FileInMemory_createWithData (88227, reinterpret_cast<const char *> (&espeakdata_dicts62_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ta_dict", 
-			L"ta");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ta_dict", 
+			U"ta");
 		Collection_addItem (me.peek(), espeakdata_dicts62.transfer());
 
 		static unsigned char espeakdata_dicts63_data[3365] = {
@@ -33946,8 +33946,8 @@ FilesInMemory create_espeakdata_dicts () {
 			0, 135, 3, 114, 0, 139, 3, 119, 0, 130, 3, 123, 0, 136, 3, 134, 0, 140, 3, 135, 0, 7, 6, 0, 36, 3, 141, 118, 55, 35,
 			34, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts63 = FileInMemory_createWithData (3364, reinterpret_cast<const char *> (&espeakdata_dicts63_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/te_dict", 
-			L"te");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/te_dict", 
+			U"te");
 		Collection_addItem (me.peek(), espeakdata_dicts63.transfer());
 
 		static unsigned char espeakdata_dicts64_data[3073] = {
@@ -34055,8 +34055,8 @@ FilesInMemory create_espeakdata_dicts () {
 			3, 0, 42, 42, 3, 0, 42, 1, 42, 42, 2, 32, 3, 24, 0, 37, 3, 35, 89, 37, 55, 37, 65, 37, 35, 0, 42, 3, 67, 39,
 			47, 35, 0, 36, 3, 72, 39, 55, 35, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts64 = FileInMemory_createWithData (3072, reinterpret_cast<const char *> (&espeakdata_dicts64_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/tn_dict", 
-			L"tn");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/tn_dict", 
+			U"tn");
 		Collection_addItem (me.peek(), espeakdata_dicts64.transfer());
 
 		static unsigned char espeakdata_dicts65_data[5978] = {
@@ -34261,8 +34261,8 @@ FilesInMemory create_espeakdata_dicts () {
 			7, 6, 122, 0, 3, 88, 0, 7, 6, 0, 39, 2, 14, 130, 132, 128, 3, 0, 36, 3, 72, 39, 55, 35, 34, 0, 4, 195, 164, 3,
 			109, 0, 201, 153, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts65 = FileInMemory_createWithData (5977, reinterpret_cast<const char *> (&espeakdata_dicts65_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/tr_dict", 
-			L"tr");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/tr_dict", 
+			U"tr");
 		Collection_addItem (me.peek(), espeakdata_dicts65.transfer());
 
 		static unsigned char espeakdata_dicts66_data[2122] = {
@@ -34338,8 +34338,8 @@ FilesInMemory create_espeakdata_dicts () {
 			1, 17, 65, 3, 58, 0, 3, 108, 0, 7, 6, 210, 187, 0, 3, 107, 0, 7, 6, 211, 153, 0, 3, 111, 0, 208, 181, 3, 114, 0,
 			7, 6, 211, 169, 0, 3, 109, 0, 7, 6, 0, 36, 3, 72, 39, 55, 112, 51, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts66 = FileInMemory_createWithData (2121, reinterpret_cast<const char *> (&espeakdata_dicts66_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/tt_dict", 
-			L"tt");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/tt_dict", 
+			U"tt");
 		Collection_addItem (me.peek(), espeakdata_dicts66.transfer());
 
 		static unsigned char espeakdata_dicts67_data[3431] = {
@@ -34459,8 +34459,8 @@ FilesInMemory create_espeakdata_dicts () {
 			6, 219, 146, 0, 3, 114, 0, 7, 6, 224, 164, 0, 3, 21, 104, 105, 0, 7, 6, 224, 165, 0, 3, 21, 104, 105, 0, 7, 6, 0,
 			36, 3, 72, 119, 55, 13, 51, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts67 = FileInMemory_createWithData (3430, reinterpret_cast<const char *> (&espeakdata_dicts67_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ur_dict", 
-			L"ur");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/ur_dict", 
+			U"ur");
 		Collection_addItem (me.peek(), espeakdata_dicts67.transfer());
 
 		static unsigned char espeakdata_dicts68_data[5837] = {
@@ -34660,8 +34660,8 @@ FilesInMemory create_espeakdata_dicts () {
 			3, 83, 6, 13, 108, 50, 15, 78, 6, 35, 65, 0, 104, 1, 32, 15, 2, 32, 15, 15, 32, 3, 86, 6, 118, 108, 0, 33, 61, 3,
 			101, 4, 39, 17, 68, 23, 10, 71, 6, 35, 108, 68, 10, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts68 = FileInMemory_createWithData (5836, reinterpret_cast<const char *> (&espeakdata_dicts68_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/vi_dict", 
-			L"vi");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/vi_dict", 
+			U"vi");
 		Collection_addItem (me.peek(), espeakdata_dicts68.transfer());
 
 		static unsigned char espeakdata_dicts69_data[1735] = {
@@ -34724,8 +34724,8 @@ FilesInMemory create_espeakdata_dicts () {
 			40, 0, 117, 3, 117, 0, 7, 6, 118, 0, 3, 84, 0, 7, 6, 119, 0, 3, 58, 0, 7, 6, 120, 0, 3, 101, 0, 7, 6, 121,
 			0, 3, 57, 0, 7, 6, 122, 0, 3, 88, 0, 7, 6, 0, 36, 3, 72, 114, 55, 35, 52, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts69 = FileInMemory_createWithData (1734, reinterpret_cast<const char *> (&espeakdata_dicts69_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/wo_dict", 
-			L"wo");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/wo_dict", 
+			U"wo");
 		Collection_addItem (me.peek(), espeakdata_dicts69.transfer());
 
 		static unsigned char espeakdata_dicts70_data[41828] = {
@@ -36125,8 +36125,8 @@ FilesInMemory create_espeakdata_dicts () {
 			122, 0, 104, 2, 12, 3, 124, 0, 7, 6, 0, 124, 3, 23, 0, 53, 3, 108, 0, 51, 3, 110, 0, 50, 3, 113, 0, 52, 3, 115,
 			0, 49, 3, 117, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts70 = FileInMemory_createWithData (41827, reinterpret_cast<const char *> (&espeakdata_dicts70_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/zh_dict", 
-			L"zh");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/zh_dict", 
+			U"zh");
 		Collection_addItem (me.peek(), espeakdata_dicts70.transfer());
 
 		static unsigned char espeakdata_dicts71_data[1557] = {
@@ -36183,13 +36183,13 @@ FilesInMemory create_espeakdata_dicts () {
 			3, 57, 0, 117, 5, 2, 3, 136, 0, 7, 6, 122, 0, 5, 1, 3, 21, 0, 5, 2, 3, 88, 0, 7, 6, 0, 49, 3, 17, 0,
 			50, 3, 108, 0, 51, 3, 109, 0, 52, 3, 110, 0, 53, 3, 111, 0, 54, 3, 112, 0, 55, 3, 113, 0, 7, 0, 0};
 		autoFileInMemory espeakdata_dicts71 = FileInMemory_createWithData (1556, reinterpret_cast<const char *> (&espeakdata_dicts71_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/zhy_dict", 
-			L"zhy");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/zhy_dict", 
+			U"zhy");
 		Collection_addItem (me.peek(), espeakdata_dicts71.transfer());
 
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw (L"FilesInMemory not created.");
+		Melder_throw (U"FilesInMemory not created.");
 	}
 }
 
diff --git a/external/espeak/espeakdata_phons.cpp b/external/espeak/espeakdata_phons.cpp
index 48d8d4b..c999074 100644
--- a/external/espeak/espeakdata_phons.cpp
+++ b/external/espeak/espeakdata_phons.cpp
@@ -39,8 +39,8 @@ FilesInMemory create_espeakdata_phons () {
 			50, 255, 3, 5, 249, 247, 247, 249, 0, 0, 0, 92, 8, 0, 92, 80, 76, 8, 0, 92, 80, 76, 8, 0, 0, 0, 0, 0, 0, 0,
 			0, 0, 0, 0, 0, 0, 0};
 		autoFileInMemory espeakdata_phons1 = FileInMemory_createWithData (816, reinterpret_cast<const char *> (&espeakdata_phons1_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/intonations", 
-			L"intonations");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/intonations", 
+			U"intonations");
 		Collection_addItem (me.peek(), espeakdata_phons1.transfer());
 
 		static unsigned char espeakdata_phons2_data[385581] = {
@@ -12898,8 +12898,8 @@ FilesInMemory create_espeakdata_phons () {
 			238, 239, 239, 240, 239, 242, 244, 238, 233, 239, 242, 243, 242, 235, 234, 238, 236, 240, 240, 246, 0, 5, 6, 9, 5, 241, 242, 245, 251, 10,
 			2, 19, 23, 19, 23, 15, 15, 2, 0, 253, 5, 13, 19, 19, 6, 8, 4, 247, 246, 0, 0};
 		autoFileInMemory espeakdata_phons2 = FileInMemory_createWithData (385580, reinterpret_cast<const char *> (&espeakdata_phons2_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/phondata", 
-			L"phondata");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/phondata", 
+			U"phondata");
 		Collection_addItem (me.peek(), espeakdata_phons2.transfer());
 
 		static unsigned char espeakdata_phons3_data[20427] = {
@@ -13585,8 +13585,8 @@ FilesInMemory create_espeakdata_phons () {
 			0, 176, 183, 0, 136, 40, 0, 176, 72, 213, 0, 176, 248, 0, 0, 176, 57, 1, 0, 176, 233, 180, 0, 176, 105, 254, 0, 176, 162, 183,
 			3, 13, 108, 116, 0, 35, 0, 161, 213, 3, 77, 1, 98, 170, 0, 162, 146, 18, 77, 1, 98, 162, 33, 195, 111, 74, 0};
 		autoFileInMemory espeakdata_phons3 = FileInMemory_createWithData (20426, reinterpret_cast<const char *> (&espeakdata_phons3_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/phonindex", 
-			L"phonindex");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/phonindex", 
+			U"phonindex");
 		Collection_addItem (me.peek(), espeakdata_phons3.transfer());
 
 		static unsigned char espeakdata_phons4_data[36149] = {
@@ -14796,13 +14796,13 @@ FilesInMemory create_espeakdata_phons () {
 			0, 0, 224, 34, 111, 2, 32, 32, 75, 0, 116, 108, 35, 0, 8, 0, 4, 0, 216, 39, 112, 4, 0, 0, 0, 2, 116, 115, 0, 0,
 			40, 0, 4, 0, 18, 6, 113, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 		autoFileInMemory espeakdata_phons4 = FileInMemory_createWithData (36148, reinterpret_cast<const char *> (&espeakdata_phons4_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/phontab", 
-			L"phontab");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/phontab", 
+			U"phontab");
 		Collection_addItem (me.peek(), espeakdata_phons4.transfer());
 
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw (L"FilesInMemory not created.");
+		Melder_throw (U"FilesInMemory not created.");
 	}
 }
 
diff --git a/external/espeak/espeakdata_variants.cpp b/external/espeak/espeakdata_variants.cpp
index 69c18cb..4d66113 100644
--- a/external/espeak/espeakdata_variants.cpp
+++ b/external/espeak/espeakdata_variants.cpp
@@ -14,8 +14,8 @@ FilesInMemory create_espeakdata_variants () {
 			116, 116, 101, 114, 32, 50, 48, 10, 10, 102, 111, 114, 109, 97, 110, 116, 32, 48, 32, 49, 48, 48, 32, 56, 48, 32, 49, 49, 48, 10,
 			10, 10, 10, 0};
 		autoFileInMemory espeakdata_variants1 = FileInMemory_createWithData (93, reinterpret_cast<const char *> (&espeakdata_variants1_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/croak", 
-			L"croak");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/croak",
+			U"croak");
 		Collection_addItem (me.peek(), espeakdata_variants1.transfer());
 
 		static unsigned char espeakdata_variants2_data[325] = {
@@ -31,8 +31,8 @@ FilesInMemory create_espeakdata_variants () {
 			110, 116, 32, 56, 32, 49, 49, 48, 32, 32, 55, 48, 32, 49, 53, 48, 10, 10, 115, 116, 114, 101, 115, 115, 65, 100, 100, 32, 45, 49,
 			48, 32, 45, 49, 48, 32, 45, 50, 48, 32, 45, 50, 48, 32, 48, 32, 48, 32, 52, 48, 32, 54, 48, 10, 0};
 		autoFileInMemory espeakdata_variants2 = FileInMemory_createWithData (324, reinterpret_cast<const char *> (&espeakdata_variants2_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/f1", 
-			L"f1");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/f1",
+			U"f1");
 		Collection_addItem (me.peek(), espeakdata_variants2.transfer());
 
 		static unsigned char espeakdata_variants3_data[358] = {
@@ -49,8 +49,8 @@ FilesInMemory create_espeakdata_variants () {
 			52, 48, 10, 98, 114, 101, 97, 116, 104, 32, 48, 32, 50, 32, 51, 32, 51, 32, 51, 32, 51, 32, 51, 32, 50, 10, 101, 99, 104, 111,
 			32, 49, 52, 48, 32, 49, 48, 10, 99, 111, 110, 115, 111, 110, 97, 110, 116, 115, 32, 49, 50, 53, 32, 49, 50, 53, 10, 0};
 		autoFileInMemory espeakdata_variants3 = FileInMemory_createWithData (357, reinterpret_cast<const char *> (&espeakdata_variants3_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/f2", 
-			L"f2");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/f2",
+			U"f2");
 		Collection_addItem (me.peek(), espeakdata_variants3.transfer());
 
 		static unsigned char espeakdata_variants4_data[376] = {
@@ -68,8 +68,8 @@ FilesInMemory create_espeakdata_variants () {
 			116, 104, 32, 48, 32, 50, 32, 51, 32, 51, 32, 51, 32, 51, 32, 51, 32, 50, 10, 101, 99, 104, 111, 32, 49, 50, 48, 32, 49, 48,
 			10, 114, 111, 117, 103, 104, 110, 101, 115, 115, 32, 52, 10, 10, 10, 0};
 		autoFileInMemory espeakdata_variants4 = FileInMemory_createWithData (375, reinterpret_cast<const char *> (&espeakdata_variants4_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/f3", 
-			L"f3");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/f3",
+			U"f3");
 		Collection_addItem (me.peek(), espeakdata_variants4.transfer());
 
 		static unsigned char espeakdata_variants5_data[351] = {
@@ -86,8 +86,8 @@ FilesInMemory create_espeakdata_variants () {
 			32, 45, 50, 48, 32, 48, 32, 48, 32, 50, 48, 32, 49, 50, 48, 10, 115, 116, 114, 101, 115, 115, 65, 109, 112, 32, 49, 56, 32, 49,
 			54, 32, 50, 48, 32, 50, 48, 32, 50, 48, 32, 50, 48, 32, 50, 48, 32, 50, 48, 10, 0};
 		autoFileInMemory espeakdata_variants5 = FileInMemory_createWithData (350, reinterpret_cast<const char *> (&espeakdata_variants5_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/f4", 
-			L"f4");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/f4",
+			U"f4");
 		Collection_addItem (me.peek(), espeakdata_variants5.transfer());
 
 		static unsigned char espeakdata_variants6_data[426] = {
@@ -107,32 +107,32 @@ FilesInMemory create_espeakdata_variants () {
 			48, 10, 98, 114, 101, 97, 116, 104, 119, 32, 49, 53, 48, 32, 49, 53, 48, 32, 50, 48, 48, 32, 50, 48, 48, 32, 52, 48, 48, 32,
 			52, 48, 48, 32, 10, 0};
 		autoFileInMemory espeakdata_variants6 = FileInMemory_createWithData (425, reinterpret_cast<const char *> (&espeakdata_variants6_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/f5", 
-			L"f5");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/f5",
+			U"f5");
 		Collection_addItem (me.peek(), espeakdata_variants6.transfer());
 
 		static unsigned char espeakdata_variants7_data[39] = {
 			108, 97, 110, 103, 117, 97, 103, 101, 32, 118, 97, 114, 105, 97, 110, 116, 10, 110, 97, 109, 101, 32, 107, 108, 97, 116, 116, 10, 107, 108,
 			97, 116, 116, 32, 49, 10, 32, 10, 0};
 		autoFileInMemory espeakdata_variants7 = FileInMemory_createWithData (38, reinterpret_cast<const char *> (&espeakdata_variants7_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/klatt", 
-			L"klatt");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/klatt",
+			U"klatt");
 		Collection_addItem (me.peek(), espeakdata_variants7.transfer());
 
 		static unsigned char espeakdata_variants8_data[39] = {
 			108, 97, 110, 103, 117, 97, 103, 101, 32, 118, 97, 114, 105, 97, 110, 116, 10, 110, 97, 109, 101, 32, 107, 108, 97, 116, 116, 50, 10, 107,
 			108, 97, 116, 116, 32, 50, 10, 10, 0};
 		autoFileInMemory espeakdata_variants8 = FileInMemory_createWithData (38, reinterpret_cast<const char *> (&espeakdata_variants8_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/klatt2", 
-			L"klatt2");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/klatt2",
+			U"klatt2");
 		Collection_addItem (me.peek(), espeakdata_variants8.transfer());
 
 		static unsigned char espeakdata_variants9_data[40] = {
 			108, 97, 110, 103, 117, 97, 103, 101, 32, 118, 97, 114, 105, 97, 110, 116, 10, 110, 97, 109, 101, 32, 107, 108, 97, 116, 116, 51, 10, 107,
 			108, 97, 116, 116, 32, 51, 10, 32, 10, 0};
 		autoFileInMemory espeakdata_variants9 = FileInMemory_createWithData (39, reinterpret_cast<const char *> (&espeakdata_variants9_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/klatt3", 
-			L"klatt3");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/klatt3",
+			U"klatt3");
 		Collection_addItem (me.peek(), espeakdata_variants9.transfer());
 
 		static unsigned char espeakdata_variants10_data[336] = {
@@ -149,8 +149,8 @@ FilesInMemory create_espeakdata_variants () {
 			116, 114, 101, 115, 115, 65, 100, 100, 32, 45, 49, 48, 32, 45, 49, 48, 32, 45, 50, 48, 32, 45, 50, 48, 32, 48, 32, 48, 32, 52,
 			48, 32, 55, 48, 10, 0};
 		autoFileInMemory espeakdata_variants10 = FileInMemory_createWithData (335, reinterpret_cast<const char *> (&espeakdata_variants10_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m1", 
-			L"m1");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m1",
+			U"m1");
 		Collection_addItem (me.peek(), espeakdata_variants10.transfer());
 
 		static unsigned char espeakdata_variants11_data[265] = {
@@ -164,8 +164,8 @@ FilesInMemory create_espeakdata_variants () {
 			48, 32, 32, 57, 48, 32, 49, 50, 48, 10, 102, 111, 114, 109, 97, 110, 116, 32, 55, 32, 49, 48, 48, 32, 32, 57, 48, 32, 49, 50,
 			48, 10, 102, 111, 114, 109, 97, 110, 116, 32, 56, 32, 49, 48, 48, 32, 32, 57, 48, 32, 49, 50, 48, 10, 0};
 		autoFileInMemory espeakdata_variants11 = FileInMemory_createWithData (264, reinterpret_cast<const char *> (&espeakdata_variants11_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m2", 
-			L"m2");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m2",
+			U"m2");
 		Collection_addItem (me.peek(), espeakdata_variants11.transfer());
 
 		static unsigned char espeakdata_variants12_data[286] = {
@@ -180,8 +180,8 @@ FilesInMemory create_espeakdata_variants () {
 			49, 48, 48, 32, 49, 48, 48, 32, 49, 48, 48, 10, 10, 115, 116, 114, 101, 115, 115, 65, 100, 100, 32, 49, 48, 32, 49, 48, 32, 48,
 			32, 48, 32, 48, 32, 48, 32, 45, 51, 48, 32, 45, 51, 48, 10, 0};
 		autoFileInMemory espeakdata_variants12 = FileInMemory_createWithData (285, reinterpret_cast<const char *> (&espeakdata_variants12_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m3", 
-			L"m3");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m3",
+			U"m3");
 		Collection_addItem (me.peek(), espeakdata_variants12.transfer());
 
 		static unsigned char espeakdata_variants13_data[291] = {
@@ -196,8 +196,8 @@ FilesInMemory create_espeakdata_variants () {
 			32, 49, 48, 51, 32, 49, 48, 48, 32, 49, 48, 48, 10, 10, 115, 116, 114, 101, 115, 115, 65, 100, 100, 32, 45, 49, 48, 32, 45, 49,
 			48, 32, 45, 51, 48, 32, 45, 51, 48, 32, 48, 32, 48, 32, 54, 48, 32, 57, 48, 10, 0};
 		autoFileInMemory espeakdata_variants13 = FileInMemory_createWithData (290, reinterpret_cast<const char *> (&espeakdata_variants13_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m4", 
-			L"m4");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m4",
+			U"m4");
 		Collection_addItem (me.peek(), espeakdata_variants13.transfer());
 
 		static unsigned char espeakdata_variants14_data[263] = {
@@ -211,8 +211,8 @@ FilesInMemory create_espeakdata_variants () {
 			116, 32, 55, 32, 49, 48, 53, 32, 32, 56, 53, 32, 49, 53, 48, 10, 102, 111, 114, 109, 97, 110, 116, 32, 56, 32, 49, 48, 53, 32,
 			32, 56, 53, 32, 49, 53, 48, 10, 10, 105, 110, 116, 111, 110, 97, 116, 105, 111, 110, 32, 50, 10, 0};
 		autoFileInMemory espeakdata_variants14 = FileInMemory_createWithData (262, reinterpret_cast<const char *> (&espeakdata_variants14_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m5", 
-			L"m5");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m5",
+			U"m5");
 		Collection_addItem (me.peek(), espeakdata_variants14.transfer());
 
 		static unsigned char espeakdata_variants15_data[189] = {
@@ -224,8 +224,8 @@ FilesInMemory create_espeakdata_variants () {
 			32, 52, 32, 49, 48, 48, 32, 32, 56, 48, 32, 49, 52, 48, 10, 102, 111, 114, 109, 97, 110, 116, 32, 53, 32, 49, 48, 48, 32, 32,
 			56, 48, 32, 49, 52, 48, 10, 10, 0};
 		autoFileInMemory espeakdata_variants15 = FileInMemory_createWithData (188, reinterpret_cast<const char *> (&espeakdata_variants15_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m6", 
-			L"m6");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m6",
+			U"m6");
 		Collection_addItem (me.peek(), espeakdata_variants15.transfer());
 
 		static unsigned char espeakdata_variants16_data[255] = {
@@ -239,8 +239,8 @@ FilesInMemory create_espeakdata_variants () {
 			48, 48, 32, 53, 48, 32, 49, 48, 48, 10, 102, 111, 114, 109, 97, 110, 116, 32, 56, 32, 49, 48, 48, 32, 53, 48, 32, 49, 48, 48,
 			10, 118, 111, 105, 99, 105, 110, 103, 32, 49, 53, 53, 10, 10, 0};
 		autoFileInMemory espeakdata_variants16 = FileInMemory_createWithData (254, reinterpret_cast<const char *> (&espeakdata_variants16_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m7", 
-			L"m7");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/m7",
+			U"m7");
 		Collection_addItem (me.peek(), espeakdata_variants16.transfer());
 
 		static unsigned char espeakdata_variants17_data[187] = {
@@ -252,8 +252,8 @@ FilesInMemory create_espeakdata_variants () {
 			32, 49, 48, 10, 98, 114, 101, 97, 116, 104, 119, 32, 49, 53, 48, 32, 49, 53, 48, 32, 50, 48, 48, 32, 50, 48, 48, 32, 52, 48,
 			48, 32, 52, 48, 48, 10, 0};
 		autoFileInMemory espeakdata_variants17 = FileInMemory_createWithData (186, reinterpret_cast<const char *> (&espeakdata_variants17_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/whisper", 
-			L"whisper");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/whisper",
+			U"whisper");
 		Collection_addItem (me.peek(), espeakdata_variants17.transfer());
 
 		static unsigned char espeakdata_variants18_data[393] = {
@@ -272,13 +272,13 @@ FilesInMemory create_espeakdata_variants () {
 			101, 97, 116, 104, 119, 32, 49, 53, 48, 32, 49, 53, 48, 32, 50, 48, 48, 32, 50, 48, 48, 32, 52, 48, 48, 32, 52, 48, 48, 10,
 			32, 10, 0};
 		autoFileInMemory espeakdata_variants18 = FileInMemory_createWithData (392, reinterpret_cast<const char *> (&espeakdata_variants18_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/whisperf", 
-			L"whisperf");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/!v/whisperf",
+			U"whisperf");
 		Collection_addItem (me.peek(), espeakdata_variants18.transfer());
 
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw (L"FilesInMemory not created.");
+		Melder_throw (U"FilesInMemory not created.");
 	}
 }
 
diff --git a/external/espeak/espeakdata_voices.cpp b/external/espeak/espeakdata_voices.cpp
index e5653a5..4af626d 100644
--- a/external/espeak/espeakdata_voices.cpp
+++ b/external/espeak/espeakdata_voices.cpp
@@ -13,8 +13,8 @@ FilesInMemory create_espeakdata_voices () {
 			100, 101, 114, 32, 109, 97, 108, 101, 10, 114, 111, 117, 103, 104, 110, 101, 115, 115, 32, 48, 10, 112, 105, 116, 99, 104, 32, 54, 51, 32,
 			49, 50, 48, 10, 10, 10, 10, 0};
 		autoFileInMemory espeakdata_voices1 = FileInMemory_createWithData (67, reinterpret_cast<const char *> (&espeakdata_voices1_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//af", 
-			L"af");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//af",
+			U"af");
 		Collection_addItem (me.peek(), espeakdata_voices1.transfer());
 
 		static unsigned char espeakdata_voices2_data[116] = {
@@ -23,8 +23,8 @@ FilesInMemory create_espeakdata_voices () {
 			32, 50, 50, 32, 50, 49, 32, 10, 115, 116, 114, 101, 115, 115, 76, 101, 110, 103, 116, 104, 32, 49, 56, 48, 32, 49, 55, 48, 32, 32,
 			50, 48, 48, 32, 50, 48, 48, 32, 32, 50, 48, 48, 32, 50, 48, 48, 32, 32, 50, 49, 48, 32, 50, 50, 48, 0};
 		autoFileInMemory espeakdata_voices2 = FileInMemory_createWithData (115, reinterpret_cast<const char *> (&espeakdata_voices2_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//bg", 
-			L"bg");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//bg",
+			U"bg");
 		Collection_addItem (me.peek(), espeakdata_voices2.transfer());
 
 		static unsigned char espeakdata_voices3_data[258] = {
@@ -38,72 +38,72 @@ FilesInMemory create_espeakdata_voices () {
 			10, 115, 116, 114, 101, 115, 115, 65, 100, 100, 32, 49, 48, 32, 49, 48, 32, 48, 32, 48, 32, 48, 32, 48, 32, 45, 51, 48, 32, 45,
 			51, 48, 10, 100, 105, 99, 116, 114, 117, 108, 101, 115, 32, 51, 32, 52, 10, 0};
 		autoFileInMemory espeakdata_voices3 = FileInMemory_createWithData (257, reinterpret_cast<const char *> (&espeakdata_voices3_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//bs", 
-			L"bs");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//bs", 
+			U"bs");
 		Collection_addItem (me.peek(), espeakdata_voices3.transfer());
 
 		static unsigned char espeakdata_voices4_data[39] = {
 			110, 97, 109, 101, 32, 99, 97, 116, 97, 108, 97, 110, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 99, 97, 10, 103, 101, 110, 100, 101,
 			114, 32, 109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices4 = FileInMemory_createWithData (38, reinterpret_cast<const char *> (&espeakdata_voices4_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ca", 
-			L"ca");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ca", 
+			U"ca");
 		Collection_addItem (me.peek(), espeakdata_voices4.transfer());
 
 		static unsigned char espeakdata_voices5_data[37] = {
 			110, 97, 109, 101, 32, 99, 122, 101, 99, 104, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 99, 115, 10, 103, 101, 110, 100, 101, 114, 32,
 			109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices5 = FileInMemory_createWithData (36, reinterpret_cast<const char *> (&espeakdata_voices5_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//cs", 
-			L"cs");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//cs", 
+			U"cs");
 		Collection_addItem (me.peek(), espeakdata_voices5.transfer());
 
 		static unsigned char espeakdata_voices6_data[55] = {
 			108, 97, 110, 103, 117, 97, 103, 101, 32, 99, 121, 10, 110, 97, 109, 101, 32, 119, 101, 108, 115, 104, 45, 116, 101, 115, 116, 10, 103, 101,
 			110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 105, 110, 116, 111, 110, 97, 116, 105, 111, 110, 32, 52, 10, 0};
 		autoFileInMemory espeakdata_voices6 = FileInMemory_createWithData (54, reinterpret_cast<const char *> (&espeakdata_voices6_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//cy", 
-			L"cy");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//cy", 
+			U"cy");
 		Collection_addItem (me.peek(), espeakdata_voices6.transfer());
 
 		static unsigned char espeakdata_voices7_data[58] = {
 			110, 97, 109, 101, 32, 100, 97, 110, 105, 115, 104, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 100, 97, 10, 103, 101, 110, 100, 101, 114,
 			32, 109, 97, 108, 101, 10, 10, 116, 117, 110, 101, 115, 32, 115, 50, 32, 99, 50, 32, 113, 50, 32, 101, 50, 10, 10, 10, 0};
 		autoFileInMemory espeakdata_voices7 = FileInMemory_createWithData (57, reinterpret_cast<const char *> (&espeakdata_voices7_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//da", 
-			L"da");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//da", 
+			U"da");
 		Collection_addItem (me.peek(), espeakdata_voices7.transfer());
 
 		static unsigned char espeakdata_voices8_data[39] = {
 			110, 97, 109, 101, 32, 103, 101, 114, 109, 97, 110, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 100, 101, 10, 103, 101, 110, 100, 101, 114,
 			32, 109, 97, 108, 101, 10, 10, 10, 0};
 		autoFileInMemory espeakdata_voices8 = FileInMemory_createWithData (38, reinterpret_cast<const char *> (&espeakdata_voices8_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//de", 
-			L"de");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//de", 
+			U"de");
 		Collection_addItem (me.peek(), espeakdata_voices8.transfer());
 
 		static unsigned char espeakdata_voices9_data[39] = {
 			110, 97, 109, 101, 32, 100, 101, 102, 97, 117, 108, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 101, 110, 10, 103, 101, 110, 100, 101,
 			114, 32, 109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices9 = FileInMemory_createWithData (38, reinterpret_cast<const char *> (&espeakdata_voices9_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//default", 
-			L"default");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//default", 
+			U"default");
 		Collection_addItem (me.peek(), espeakdata_voices9.transfer());
 
 		static unsigned char espeakdata_voices10_data[38] = {
 			110, 97, 109, 101, 32, 103, 114, 101, 101, 107, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 101, 108, 10, 103, 101, 110, 100, 101, 114, 32,
 			109, 97, 108, 101, 10, 10, 10, 0};
 		autoFileInMemory espeakdata_voices10 = FileInMemory_createWithData (37, reinterpret_cast<const char *> (&espeakdata_voices10_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//el", 
-			L"el");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//el", 
+			U"el");
 		Collection_addItem (me.peek(), espeakdata_voices10.transfer());
 
 		static unsigned char espeakdata_voices11_data[40] = {
 			110, 97, 109, 101, 32, 101, 115, 112, 101, 114, 97, 110, 116, 111, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 101, 111, 10, 103, 101, 110,
 			100, 101, 114, 32, 109, 97, 108, 101, 10, 0};
 		autoFileInMemory espeakdata_voices11 = FileInMemory_createWithData (39, reinterpret_cast<const char *> (&espeakdata_voices11_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//eo", 
-			L"eo");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//eo", 
+			U"eo");
 		Collection_addItem (me.peek(), espeakdata_voices11.transfer());
 
 		static unsigned char espeakdata_voices12_data[67] = {
@@ -111,8 +111,8 @@ FilesInMemory create_espeakdata_voices () {
 			114, 32, 109, 97, 108, 101, 10, 10, 100, 105, 99, 116, 114, 117, 108, 101, 115, 32, 49, 10, 47, 47, 105, 110, 116, 111, 110, 97, 116, 105,
 			111, 110, 32, 51, 10, 10, 0};
 		autoFileInMemory espeakdata_voices12 = FileInMemory_createWithData (66, reinterpret_cast<const char *> (&espeakdata_voices12_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//es", 
-			L"es");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//es", 
+			U"es");
 		Collection_addItem (me.peek(), espeakdata_voices12.transfer());
 
 		static unsigned char espeakdata_voices13_data[188] = {
@@ -124,23 +124,23 @@ FilesInMemory create_espeakdata_voices () {
 			51, 48, 32, 49, 56, 48, 32, 32, 48, 32, 48, 32, 32, 50, 53, 48, 32, 50, 56, 48, 10, 10, 114, 101, 112, 108, 97, 99, 101, 32,
 			48, 48, 32, 84, 32, 115, 10, 0};
 		autoFileInMemory espeakdata_voices13 = FileInMemory_createWithData (187, reinterpret_cast<const char *> (&espeakdata_voices13_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//es-la", 
-			L"es-la");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//es-la", 
+			U"es-la");
 		Collection_addItem (me.peek(), espeakdata_voices13.transfer());
 
 		static unsigned char espeakdata_voices14_data[28] = {
 			110, 97, 109, 101, 32, 101, 115, 116, 111, 110, 105, 97, 110, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 101, 116, 10, 10, 0};
 		autoFileInMemory espeakdata_voices14 = FileInMemory_createWithData (27, reinterpret_cast<const char *> (&espeakdata_voices14_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//et", 
-			L"et");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//et", 
+			U"et");
 		Collection_addItem (me.peek(), espeakdata_voices14.transfer());
 
 		static unsigned char espeakdata_voices15_data[39] = {
 			110, 97, 109, 101, 32, 102, 105, 110, 110, 105, 115, 104, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 102, 105, 10, 103, 101, 110, 100, 101,
 			114, 32, 109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices15 = FileInMemory_createWithData (38, reinterpret_cast<const char *> (&espeakdata_voices15_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//fi", 
-			L"fi");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//fi", 
+			U"fi");
 		Collection_addItem (me.peek(), espeakdata_voices15.transfer());
 
 		static unsigned char espeakdata_voices16_data[83] = {
@@ -148,8 +148,8 @@ FilesInMemory create_espeakdata_voices () {
 			103, 117, 97, 103, 101, 32, 102, 114, 10, 103, 101, 110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 100, 105, 99, 116, 114, 117, 108, 101,
 			115, 32, 49, 10, 116, 117, 110, 101, 115, 32, 115, 51, 32, 99, 51, 32, 113, 51, 32, 101, 51, 10, 0};
 		autoFileInMemory espeakdata_voices16 = FileInMemory_createWithData (82, reinterpret_cast<const char *> (&espeakdata_voices16_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//fr", 
-			L"fr");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//fr", 
+			U"fr");
 		Collection_addItem (me.peek(), espeakdata_voices16.transfer());
 
 		static unsigned char espeakdata_voices17_data[97] = {
@@ -158,16 +158,16 @@ FilesInMemory create_espeakdata_voices () {
 			108, 101, 10, 10, 100, 105, 99, 116, 114, 117, 108, 101, 115, 32, 50, 10, 116, 117, 110, 101, 115, 32, 115, 51, 32, 99, 51, 32, 113, 51,
 			32, 101, 51, 10, 10, 10, 0};
 		autoFileInMemory espeakdata_voices17 = FileInMemory_createWithData (96, reinterpret_cast<const char *> (&espeakdata_voices17_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//fr-be", 
-			L"fr-be");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//fr-be", 
+			U"fr-be");
 		Collection_addItem (me.peek(), espeakdata_voices17.transfer());
 
 		static unsigned char espeakdata_voices18_data[36] = {
 			110, 97, 109, 101, 32, 104, 105, 110, 100, 105, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 104, 105, 10, 103, 101, 110, 100, 101, 114, 32,
 			109, 97, 108, 101, 10, 0};
 		autoFileInMemory espeakdata_voices18 = FileInMemory_createWithData (35, reinterpret_cast<const char *> (&espeakdata_voices18_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//hi", 
-			L"hi");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//hi", 
+			U"hi");
 		Collection_addItem (me.peek(), espeakdata_voices18.transfer());
 
 		static unsigned char espeakdata_voices19_data[291] = {
@@ -182,8 +182,8 @@ FilesInMemory create_espeakdata_voices () {
 			32, 49, 48, 48, 10, 10, 115, 116, 114, 101, 115, 115, 65, 100, 100, 32, 49, 48, 32, 49, 48, 32, 48, 32, 48, 32, 48, 32, 48, 32,
 			45, 51, 48, 32, 45, 51, 48, 10, 100, 105, 99, 116, 114, 117, 108, 101, 115, 32, 49, 10, 0};
 		autoFileInMemory espeakdata_voices19 = FileInMemory_createWithData (290, reinterpret_cast<const char *> (&espeakdata_voices19_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//hr", 
-			L"hr");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//hr", 
+			U"hr");
 		Collection_addItem (me.peek(), espeakdata_voices19.transfer());
 
 		static unsigned char espeakdata_voices20_data[74] = {
@@ -191,16 +191,16 @@ FilesInMemory create_espeakdata_voices () {
 			100, 101, 114, 32, 109, 97, 108, 101, 10, 111, 112, 116, 105, 111, 110, 32, 98, 114, 97, 99, 107, 101, 116, 32, 48, 32, 48, 10, 112, 105,
 			116, 99, 104, 32, 56, 49, 32, 49, 49, 55, 10, 10, 10, 0};
 		autoFileInMemory espeakdata_voices20 = FileInMemory_createWithData (73, reinterpret_cast<const char *> (&espeakdata_voices20_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//hu", 
-			L"hu");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//hu", 
+			U"hu");
 		Collection_addItem (me.peek(), espeakdata_voices20.transfer());
 
 		static unsigned char espeakdata_voices21_data[39] = {
 			110, 97, 109, 101, 32, 97, 114, 109, 101, 110, 105, 97, 110, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 104, 121, 10, 103, 101, 110, 100,
 			101, 114, 32, 109, 97, 108, 101, 10, 0};
 		autoFileInMemory espeakdata_voices21 = FileInMemory_createWithData (38, reinterpret_cast<const char *> (&espeakdata_voices21_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//hy", 
-			L"hy");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//hy", 
+			U"hy");
 		Collection_addItem (me.peek(), espeakdata_voices21.transfer());
 
 		static unsigned char espeakdata_voices22_data[327] = {
@@ -216,8 +216,8 @@ FilesInMemory create_espeakdata_voices () {
 			114, 101, 112, 108, 97, 99, 101, 32, 48, 48, 32, 107, 32, 32, 103, 10, 10, 114, 101, 112, 108, 97, 99, 101, 32, 48, 48, 32, 42, 42,
 			32, 82, 32, 32, 47, 47, 32, 63, 63, 10, 114, 101, 112, 108, 97, 99, 101, 32, 48, 48, 32, 114, 32, 32, 82, 10, 0};
 		autoFileInMemory espeakdata_voices22 = FileInMemory_createWithData (326, reinterpret_cast<const char *> (&espeakdata_voices22_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//hy-west", 
-			L"hy-west");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//hy-west", 
+			U"hy-west");
 		Collection_addItem (me.peek(), espeakdata_voices22.transfer());
 
 		static unsigned char espeakdata_voices23_data[152] = {
@@ -228,48 +228,48 @@ FilesInMemory create_espeakdata_voices () {
 			32, 48, 32, 48, 32, 32, 50, 50, 32, 32, 50, 49, 10, 10, 99, 111, 110, 115, 111, 110, 97, 110, 116, 115, 32, 56, 48, 32, 56, 48,
 			10, 0};
 		autoFileInMemory espeakdata_voices23 = FileInMemory_createWithData (151, reinterpret_cast<const char *> (&espeakdata_voices23_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//id", 
-			L"id");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//id", 
+			U"id");
 		Collection_addItem (me.peek(), espeakdata_voices23.transfer());
 
 		static unsigned char espeakdata_voices24_data[46] = {
 			110, 97, 109, 101, 32, 105, 99, 101, 108, 97, 110, 100, 105, 99, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 105,
 			115, 10, 103, 101, 110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices24 = FileInMemory_createWithData (45, reinterpret_cast<const char *> (&espeakdata_voices24_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//is", 
-			L"is");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//is", 
+			U"is");
 		Collection_addItem (me.peek(), espeakdata_voices24.transfer());
 
 		static unsigned char espeakdata_voices25_data[55] = {
 			110, 97, 109, 101, 32, 105, 116, 97, 108, 105, 97, 110, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 105, 116, 10, 103, 101, 110, 100, 101,
 			114, 32, 109, 97, 108, 101, 10, 10, 114, 101, 112, 108, 97, 99, 101, 32, 48, 51, 32, 105, 32, 73, 10, 10, 0};
 		autoFileInMemory espeakdata_voices25 = FileInMemory_createWithData (54, reinterpret_cast<const char *> (&espeakdata_voices25_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//it", 
-			L"it");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//it", 
+			U"it");
 		Collection_addItem (me.peek(), espeakdata_voices25.transfer());
 
 		static unsigned char espeakdata_voices26_data[32] = {
 			110, 97, 109, 101, 32, 103, 101, 111, 114, 103, 105, 97, 110, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 107, 97,
 			10, 0};
 		autoFileInMemory espeakdata_voices26 = FileInMemory_createWithData (31, reinterpret_cast<const char *> (&espeakdata_voices26_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ka", 
-			L"ka");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ka", 
+			U"ka");
 		Collection_addItem (me.peek(), espeakdata_voices26.transfer());
 
 		static unsigned char espeakdata_voices27_data[56] = {
 			110, 97, 109, 101, 32, 107, 97, 110, 110, 97, 100, 97, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 107, 110, 10, 10, 105, 110, 116, 111,
 			110, 97, 116, 105, 111, 110, 32, 50, 10, 47, 47, 99, 111, 110, 115, 111, 110, 97, 110, 116, 115, 32, 56, 48, 10, 0};
 		autoFileInMemory espeakdata_voices27 = FileInMemory_createWithData (55, reinterpret_cast<const char *> (&espeakdata_voices27_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//kn", 
-			L"kn");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//kn", 
+			U"kn");
 		Collection_addItem (me.peek(), espeakdata_voices27.transfer());
 
 		static unsigned char espeakdata_voices28_data[53] = {
 			110, 97, 109, 101, 32, 107, 117, 114, 100, 105, 115, 104, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 107, 117, 10, 103, 101, 110, 100, 101,
 			114, 32, 109, 97, 108, 101, 10, 10, 47, 47, 119, 111, 114, 100, 115, 32, 49, 32, 52, 56, 10, 10, 0};
 		autoFileInMemory espeakdata_voices28 = FileInMemory_createWithData (52, reinterpret_cast<const char *> (&espeakdata_voices28_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ku", 
-			L"ku");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ku", 
+			U"ku");
 		Collection_addItem (me.peek(), espeakdata_voices28.transfer());
 
 		static unsigned char espeakdata_voices29_data[299] = {
@@ -284,24 +284,24 @@ FilesInMemory create_espeakdata_voices () {
 			101, 32, 76, 97, 116, 105, 110, 32, 118, 111, 105, 99, 101, 32, 110, 101, 101, 100, 115, 32, 108, 111, 110, 103, 32, 118, 111, 119, 101, 108,
 			115, 32, 116, 111, 32, 98, 101, 32, 109, 97, 114, 107, 101, 100, 32, 119, 105, 116, 104, 32, 109, 97, 99, 114, 111, 110, 115, 10, 0};
 		autoFileInMemory espeakdata_voices29 = FileInMemory_createWithData (298, reinterpret_cast<const char *> (&espeakdata_voices29_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//la", 
-			L"la");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//la", 
+			U"la");
 		Collection_addItem (me.peek(), espeakdata_voices29.transfer());
 
 		static unsigned char espeakdata_voices30_data[58] = {
 			110, 97, 109, 101, 32, 108, 97, 116, 118, 105, 97, 110, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 108, 118, 10, 103, 101, 110, 100, 101,
 			114, 32, 109, 97, 108, 101, 10, 10, 114, 101, 112, 108, 97, 99, 101, 32, 48, 51, 32, 32, 111, 32, 32, 111, 58, 10, 10, 0};
 		autoFileInMemory espeakdata_voices30 = FileInMemory_createWithData (57, reinterpret_cast<const char *> (&espeakdata_voices30_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//lv", 
-			L"lv");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//lv", 
+			U"lv");
 		Collection_addItem (me.peek(), espeakdata_voices30.transfer());
 
 		static unsigned char espeakdata_voices31_data[47] = {
 			110, 97, 109, 101, 32, 109, 97, 99, 101, 100, 111, 110, 105, 97, 110, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32,
 			109, 107, 10, 103, 101, 110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices31 = FileInMemory_createWithData (46, reinterpret_cast<const char *> (&espeakdata_voices31_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//mk", 
-			L"mk");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//mk", 
+			U"mk");
 		Collection_addItem (me.peek(), espeakdata_voices31.transfer());
 
 		static unsigned char espeakdata_voices32_data[70] = {
@@ -309,16 +309,16 @@ FilesInMemory create_espeakdata_voices () {
 			100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 105, 110, 116, 111, 110, 97, 116, 105, 111, 110, 32, 50, 10, 47, 47, 99, 111, 110, 115, 111,
 			110, 97, 110, 116, 115, 32, 56, 48, 10, 0};
 		autoFileInMemory espeakdata_voices32 = FileInMemory_createWithData (69, reinterpret_cast<const char *> (&espeakdata_voices32_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ml", 
-			L"ml");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ml", 
+			U"ml");
 		Collection_addItem (me.peek(), espeakdata_voices32.transfer());
 
 		static unsigned char espeakdata_voices33_data[41] = {
 			108, 97, 110, 103, 117, 97, 103, 101, 32, 110, 108, 10, 110, 97, 109, 101, 32, 100, 117, 116, 99, 104, 45, 116, 101, 115, 116, 10, 103, 101,
 			110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 0};
 		autoFileInMemory espeakdata_voices33 = FileInMemory_createWithData (40, reinterpret_cast<const char *> (&espeakdata_voices33_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//nl", 
-			L"nl");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//nl", 
+			U"nl");
 		Collection_addItem (me.peek(), espeakdata_voices33.transfer());
 
 		static unsigned char espeakdata_voices34_data[66] = {
@@ -326,16 +326,16 @@ FilesInMemory create_espeakdata_voices () {
 			103, 117, 97, 103, 101, 32, 110, 98, 10, 103, 101, 110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 105, 110, 116, 111, 110, 97, 116, 105,
 			111, 110, 32, 52, 10, 0};
 		autoFileInMemory espeakdata_voices34 = FileInMemory_createWithData (65, reinterpret_cast<const char *> (&espeakdata_voices34_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//no", 
-			L"no");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//no", 
+			U"no");
 		Collection_addItem (me.peek(), espeakdata_voices34.transfer());
 
 		static unsigned char espeakdata_voices35_data[51] = {
 			110, 97, 109, 101, 32, 112, 111, 108, 105, 115, 104, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 112, 108, 10, 103, 101, 110, 100, 101, 114,
 			32, 109, 97, 108, 101, 10, 10, 105, 110, 116, 111, 110, 97, 116, 105, 111, 110, 32, 50, 10, 0};
 		autoFileInMemory espeakdata_voices35 = FileInMemory_createWithData (50, reinterpret_cast<const char *> (&espeakdata_voices35_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//pl", 
-			L"pl");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//pl", 
+			U"pl");
 		Collection_addItem (me.peek(), espeakdata_voices35.transfer());
 
 		static unsigned char espeakdata_voices36_data[66] = {
@@ -343,8 +343,8 @@ FilesInMemory create_espeakdata_voices () {
 			103, 117, 97, 103, 101, 32, 112, 116, 10, 103, 101, 110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 100, 105, 99, 116, 114, 117, 108, 101,
 			115, 32, 50, 10, 10, 0};
 		autoFileInMemory espeakdata_voices36 = FileInMemory_createWithData (65, reinterpret_cast<const char *> (&espeakdata_voices36_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//pt", 
-			L"pt");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//pt", 
+			U"pt");
 		Collection_addItem (me.peek(), espeakdata_voices36.transfer());
 
 		static unsigned char espeakdata_voices37_data[97] = {
@@ -353,16 +353,16 @@ FilesInMemory create_espeakdata_voices () {
 			109, 101, 115, 32, 112, 116, 45, 112, 116, 10, 10, 100, 105, 99, 116, 114, 117, 108, 101, 115, 32, 49, 10, 105, 110, 116, 111, 110, 97, 116,
 			105, 111, 110, 32, 50, 10, 0};
 		autoFileInMemory espeakdata_voices37 = FileInMemory_createWithData (96, reinterpret_cast<const char *> (&espeakdata_voices37_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//pt-pt", 
-			L"pt-pt");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//pt-pt", 
+			U"pt-pt");
 		Collection_addItem (me.peek(), espeakdata_voices37.transfer());
 
 		static unsigned char espeakdata_voices38_data[41] = {
 			110, 97, 109, 101, 32, 114, 111, 109, 97, 110, 105, 97, 110, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 114, 111, 10, 103, 101, 110, 100,
 			101, 114, 32, 109, 97, 108, 101, 10, 10, 10, 0};
 		autoFileInMemory espeakdata_voices38 = FileInMemory_createWithData (40, reinterpret_cast<const char *> (&espeakdata_voices38_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ro", 
-			L"ro");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ro", 
+			U"ro");
 		Collection_addItem (me.peek(), espeakdata_voices38.transfer());
 
 		static unsigned char espeakdata_voices39_data[61] = {
@@ -370,16 +370,16 @@ FilesInMemory create_espeakdata_voices () {
 			103, 101, 110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 114, 101, 112, 108, 97, 99, 101, 32, 48, 51, 32, 97, 32, 97, 35, 10, 10,
 			0};
 		autoFileInMemory espeakdata_voices39 = FileInMemory_createWithData (60, reinterpret_cast<const char *> (&espeakdata_voices39_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ru", 
-			L"ru");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ru", 
+			U"ru");
 		Collection_addItem (me.peek(), espeakdata_voices39.transfer());
 
 		static unsigned char espeakdata_voices40_data[38] = {
 			110, 97, 109, 101, 32, 115, 108, 111, 118, 97, 107, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 115, 107, 10, 103, 101, 110, 100, 101, 114,
 			32, 109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices40 = FileInMemory_createWithData (37, reinterpret_cast<const char *> (&espeakdata_voices40_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//sk", 
-			L"sk");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//sk", 
+			U"sk");
 		Collection_addItem (me.peek(), espeakdata_voices40.transfer());
 
 		static unsigned char espeakdata_voices41_data[116] = {
@@ -388,8 +388,8 @@ FilesInMemory create_espeakdata_voices () {
 			101, 109, 111, 118, 101, 32, 39, 195, 171, 39, 32, 97, 116, 32, 116, 104, 101, 32, 101, 110, 100, 32, 111, 102, 32, 119, 111, 114, 100, 115,
 			10, 47, 47, 32, 114, 101, 112, 108, 97, 99, 101, 32, 48, 48, 32, 32, 64, 47, 32, 32, 78, 85, 76, 76, 10, 0};
 		autoFileInMemory espeakdata_voices41 = FileInMemory_createWithData (115, reinterpret_cast<const char *> (&espeakdata_voices41_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//sq", 
-			L"sq");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//sq", 
+			U"sq");
 		Collection_addItem (me.peek(), espeakdata_voices41.transfer());
 
 		static unsigned char espeakdata_voices42_data[278] = {
@@ -404,24 +404,24 @@ FilesInMemory create_espeakdata_voices () {
 			32, 49, 48, 32, 49, 48, 32, 48, 32, 48, 32, 48, 32, 48, 32, 45, 51, 48, 32, 45, 51, 48, 10, 100, 105, 99, 116, 114, 117, 108,
 			101, 115, 32, 50, 32, 52, 10, 0};
 		autoFileInMemory espeakdata_voices42 = FileInMemory_createWithData (277, reinterpret_cast<const char *> (&espeakdata_voices42_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//sr", 
-			L"sr");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//sr", 
+			U"sr");
 		Collection_addItem (me.peek(), espeakdata_voices42.transfer());
 
 		static unsigned char espeakdata_voices43_data[39] = {
 			110, 97, 109, 101, 32, 115, 119, 101, 100, 105, 115, 104, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 115, 118, 10, 103, 101, 110, 100, 101,
 			114, 32, 109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices43 = FileInMemory_createWithData (38, reinterpret_cast<const char *> (&espeakdata_voices43_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//sv", 
-			L"sv");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//sv", 
+			U"sv");
 		Collection_addItem (me.peek(), espeakdata_voices43.transfer());
 
 		static unsigned char espeakdata_voices44_data[44] = {
 			110, 97, 109, 101, 32, 115, 119, 97, 104, 105, 108, 105, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 115, 119, 10,
 			103, 101, 110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices44 = FileInMemory_createWithData (43, reinterpret_cast<const char *> (&espeakdata_voices44_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//sw", 
-			L"sw");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//sw", 
+			U"sw");
 		Collection_addItem (me.peek(), espeakdata_voices44.transfer());
 
 		static unsigned char espeakdata_voices45_data[64] = {
@@ -429,24 +429,24 @@ FilesInMemory create_espeakdata_voices () {
 			109, 97, 108, 101, 10, 10, 105, 110, 116, 111, 110, 97, 116, 105, 111, 110, 32, 50, 10, 99, 111, 110, 115, 111, 110, 97, 110, 116, 115, 32,
 			56, 48, 10, 0};
 		autoFileInMemory espeakdata_voices45 = FileInMemory_createWithData (63, reinterpret_cast<const char *> (&espeakdata_voices45_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ta", 
-			L"ta");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//ta", 
+			U"ta");
 		Collection_addItem (me.peek(), espeakdata_voices45.transfer());
 
 		static unsigned char espeakdata_voices46_data[39] = {
 			110, 97, 109, 101, 32, 116, 117, 114, 107, 105, 115, 104, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 116, 114, 10, 103, 101, 110, 100, 101,
 			114, 32, 109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices46 = FileInMemory_createWithData (38, reinterpret_cast<const char *> (&espeakdata_voices46_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//tr", 
-			L"tr");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//tr", 
+			U"tr");
 		Collection_addItem (me.peek(), espeakdata_voices46.transfer());
 
 		static unsigned char espeakdata_voices47_data[60] = {
 			110, 97, 109, 101, 32, 118, 105, 101, 116, 110, 97, 109, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 118, 105, 10, 103, 101, 110, 100, 101,
 			114, 32, 109, 97, 108, 101, 10, 10, 119, 111, 114, 100, 115, 32, 49, 10, 112, 105, 116, 99, 104, 32, 56, 48, 32, 49, 49, 56, 10, 0};
 		autoFileInMemory espeakdata_voices47 = FileInMemory_createWithData (59, reinterpret_cast<const char *> (&espeakdata_voices47_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//vi", 
-			L"vi");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//vi", 
+			U"vi");
 		Collection_addItem (me.peek(), espeakdata_voices47.transfer());
 
 		static unsigned char espeakdata_voices48_data[595] = {
@@ -471,8 +471,8 @@ FilesInMemory create_espeakdata_voices () {
 			101, 103, 105, 110, 110, 105, 110, 103, 32, 119, 32, 119, 105, 116, 104, 32, 118, 10, 47, 47, 91, 122, 104, 93, 58, 32, 119, 239, 191, 189,
 			239, 191, 189, 239, 191, 189, 118, 10, 47, 47, 114, 101, 112, 108, 97, 99, 101, 32, 48, 32, 119, 32, 32, 118, 0};
 		autoFileInMemory espeakdata_voices48 = FileInMemory_createWithData (594, reinterpret_cast<const char *> (&espeakdata_voices48_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//zh", 
-			L"zh");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//zh", 
+			U"zh");
 		Collection_addItem (me.peek(), espeakdata_voices48.transfer());
 
 		static unsigned char espeakdata_voices49_data[196] = {
@@ -484,8 +484,8 @@ FilesInMemory create_espeakdata_voices () {
 			103, 108, 105, 115, 104, 32, 119, 111, 114, 100, 115, 44, 32, 50, 61, 106, 121, 117, 116, 112, 105, 110, 103, 10, 100, 105, 99, 116, 114, 117,
 			108, 101, 115, 32, 49, 10, 10, 119, 111, 114, 100, 115, 32, 49, 10, 0};
 		autoFileInMemory espeakdata_voices49 = FileInMemory_createWithData (195, reinterpret_cast<const char *> (&espeakdata_voices49_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//zh-yue", 
-			L"zh-yue");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices//zh-yue", 
+			U"zh-yue");
 		Collection_addItem (me.peek(), espeakdata_voices49.transfer());
 
 		static unsigned char espeakdata_voices50_data[143] = {
@@ -495,8 +495,8 @@ FilesInMemory create_espeakdata_voices () {
 			10, 114, 101, 112, 108, 97, 99, 101, 32, 48, 51, 32, 73, 50, 32, 105, 10, 10, 47, 47, 112, 105, 116, 99, 104, 32, 56, 48, 32, 49,
 			49, 56, 10, 10, 116, 117, 110, 101, 115, 32, 115, 49, 32, 99, 49, 32, 113, 49, 32, 101, 49, 10, 0};
 		autoFileInMemory espeakdata_voices50 = FileInMemory_createWithData (142, reinterpret_cast<const char *> (&espeakdata_voices50_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en", 
-			L"en");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en", 
+			U"en");
 		Collection_addItem (me.peek(), espeakdata_voices50.transfer());
 
 		static unsigned char espeakdata_voices51_data[217] = {
@@ -509,8 +509,8 @@ FilesInMemory create_espeakdata_voices () {
 			47, 114, 101, 112, 108, 97, 99, 101, 32, 48, 51, 32, 73, 32, 32, 105, 10, 47, 47, 114, 101, 112, 108, 97, 99, 101, 32, 48, 51, 32,
 			73, 50, 32, 105, 10, 10, 0};
 		autoFileInMemory espeakdata_voices51 = FileInMemory_createWithData (216, reinterpret_cast<const char *> (&espeakdata_voices51_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-n", 
-			L"en-n");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-n", 
+			U"en-n");
 		Collection_addItem (me.peek(), espeakdata_voices51.transfer());
 
 		static unsigned char espeakdata_voices52_data[195] = {
@@ -522,8 +522,8 @@ FilesInMemory create_espeakdata_voices () {
 			97, 99, 101, 32, 48, 51, 32, 73, 50, 32, 105, 10, 114, 101, 112, 108, 97, 99, 101, 32, 48, 51, 32, 64, 32, 97, 35, 10, 114, 101,
 			112, 108, 97, 99, 101, 32, 48, 51, 32, 51, 32, 97, 35, 10, 0};
 		autoFileInMemory espeakdata_voices52 = FileInMemory_createWithData (194, reinterpret_cast<const char *> (&espeakdata_voices52_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-rp", 
-			L"en-rp");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-rp", 
+			U"en-rp");
 		Collection_addItem (me.peek(), espeakdata_voices52.transfer());
 
 		static unsigned char espeakdata_voices53_data[247] = {
@@ -537,8 +537,8 @@ FilesInMemory create_espeakdata_voices () {
 			97, 47, 10, 114, 101, 112, 108, 97, 99, 101, 32, 48, 50, 32, 117, 58, 32, 85, 10, 114, 101, 112, 108, 97, 99, 101, 32, 48, 50, 32,
 			51, 58, 32, 86, 82, 10, 0};
 		autoFileInMemory espeakdata_voices53 = FileInMemory_createWithData (246, reinterpret_cast<const char *> (&espeakdata_voices53_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-sc", 
-			L"en-sc");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-sc", 
+			U"en-sc");
 		Collection_addItem (me.peek(), espeakdata_voices53.transfer());
 
 		static unsigned char espeakdata_voices54_data[281] = {
@@ -553,8 +553,8 @@ FilesInMemory create_espeakdata_voices () {
 			51, 32, 73, 32, 32, 105, 10, 114, 101, 112, 108, 97, 99, 101, 32, 48, 51, 32, 73, 50, 32, 105, 10, 114, 101, 112, 108, 97, 99, 101,
 			32, 48, 51, 32, 64, 32, 32, 64, 47, 10, 0};
 		autoFileInMemory espeakdata_voices54 = FileInMemory_createWithData (280, reinterpret_cast<const char *> (&espeakdata_voices54_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-us", 
-			L"en-us");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-us", 
+			U"en-us");
 		Collection_addItem (me.peek(), espeakdata_voices54.transfer());
 
 		static unsigned char espeakdata_voices55_data[317] = {
@@ -570,8 +570,8 @@ FilesInMemory create_espeakdata_voices () {
 			102, 111, 114, 109, 97, 110, 116, 32, 49, 32, 32, 57, 56, 32, 32, 49, 48, 48, 32, 49, 48, 48, 10, 102, 111, 114, 109, 97, 110, 116,
 			32, 50, 32, 32, 57, 56, 32, 32, 49, 48, 48, 32, 49, 48, 48, 10, 0};
 		autoFileInMemory espeakdata_voices55 = FileInMemory_createWithData (316, reinterpret_cast<const char *> (&espeakdata_voices55_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-wi", 
-			L"en-wi");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-wi", 
+			U"en-wi");
 		Collection_addItem (me.peek(), espeakdata_voices55.transfer());
 
 		static unsigned char espeakdata_voices56_data[206] = {
@@ -583,32 +583,32 @@ FilesInMemory create_espeakdata_voices () {
 			105, 64, 10, 100, 105, 99, 116, 114, 117, 108, 101, 115, 32, 54, 10, 105, 110, 116, 111, 110, 97, 116, 105, 111, 110, 32, 52, 10, 115, 116,
 			114, 101, 115, 115, 65, 100, 100, 32, 48, 32, 48, 32, 48, 32, 48, 32, 48, 32, 48, 32, 48, 32, 50, 48, 10, 0};
 		autoFileInMemory espeakdata_voices56 = FileInMemory_createWithData (205, reinterpret_cast<const char *> (&espeakdata_voices56_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-wm", 
-			L"en-wm");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/en/en-wm", 
+			U"en-wm");
 		Collection_addItem (me.peek(), espeakdata_voices56.transfer());
 
 		static unsigned char espeakdata_voices57_data[44] = {
 			110, 97, 109, 101, 32, 97, 107, 97, 110, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 97, 107, 10, 116, 114, 97,
 			110, 115, 108, 97, 116, 111, 114, 32, 115, 119, 10, 32, 10, 0};
 		autoFileInMemory espeakdata_voices57 = FileInMemory_createWithData (43, reinterpret_cast<const char *> (&espeakdata_voices57_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ak", 
-			L"ak");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ak", 
+			U"ak");
 		Collection_addItem (me.peek(), espeakdata_voices57.transfer());
 
 		static unsigned char espeakdata_voices58_data[32] = {
 			110, 97, 109, 101, 32, 97, 109, 104, 97, 114, 105, 99, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 97, 109, 10,
 			10, 0};
 		autoFileInMemory espeakdata_voices58 = FileInMemory_createWithData (31, reinterpret_cast<const char *> (&espeakdata_voices58_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/am", 
-			L"am");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/am", 
+			U"am");
 		Collection_addItem (me.peek(), espeakdata_voices58.transfer());
 
 		static unsigned char espeakdata_voices59_data[36] = {
 			110, 97, 109, 101, 32, 97, 122, 101, 114, 98, 97, 105, 106, 97, 110, 105, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101,
 			32, 97, 122, 10, 10, 0};
 		autoFileInMemory espeakdata_voices59 = FileInMemory_createWithData (35, reinterpret_cast<const char *> (&espeakdata_voices59_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/az", 
-			L"az");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/az", 
+			U"az");
 		Collection_addItem (me.peek(), espeakdata_voices59.transfer());
 
 		static unsigned char espeakdata_voices60_data[116] = {
@@ -617,24 +617,24 @@ FilesInMemory create_espeakdata_voices () {
 			32, 50, 50, 32, 50, 49, 32, 10, 115, 116, 114, 101, 115, 115, 76, 101, 110, 103, 116, 104, 32, 49, 56, 48, 32, 49, 55, 48, 32, 32,
 			50, 48, 48, 32, 50, 48, 48, 32, 32, 50, 48, 48, 32, 50, 48, 48, 32, 32, 50, 49, 48, 32, 50, 50, 48, 0};
 		autoFileInMemory espeakdata_voices60 = FileInMemory_createWithData (115, reinterpret_cast<const char *> (&espeakdata_voices60_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/bg", 
-			L"bg");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/bg", 
+			U"bg");
 		Collection_addItem (me.peek(), espeakdata_voices60.transfer());
 
 		static unsigned char espeakdata_voices61_data[31] = {
 			110, 97, 109, 101, 32, 100, 105, 118, 101, 104, 105, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 100, 118, 10, 10,
 			0};
 		autoFileInMemory espeakdata_voices61 = FileInMemory_createWithData (30, reinterpret_cast<const char *> (&espeakdata_voices61_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/dv", 
-			L"dv");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/dv", 
+			U"dv");
 		Collection_addItem (me.peek(), espeakdata_voices61.transfer());
 
 		static unsigned char espeakdata_voices62_data[43] = {
 			110, 97, 109, 101, 32, 105, 114, 105, 115, 104, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 103, 97, 10, 115, 116,
 			114, 101, 115, 115, 114, 117, 108, 101, 32, 48, 10, 10, 0};
 		autoFileInMemory espeakdata_voices62 = FileInMemory_createWithData (42, reinterpret_cast<const char *> (&espeakdata_voices62_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ga", 
-			L"ga");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ga", 
+			U"ga");
 		Collection_addItem (me.peek(), espeakdata_voices62.transfer());
 
 		static unsigned char espeakdata_voices63_data[111] = {
@@ -643,15 +643,15 @@ FilesInMemory create_espeakdata_voices () {
 			48, 32, 49, 55, 48, 32, 32, 49, 57, 48, 32, 49, 57, 48, 32, 32, 48, 32, 48, 32, 32, 50, 51, 48, 32, 50, 52, 48, 10, 100,
 			105, 99, 116, 114, 117, 108, 101, 115, 32, 49, 10, 119, 111, 114, 100, 115, 32, 51, 10, 10, 0};
 		autoFileInMemory espeakdata_voices63 = FileInMemory_createWithData (110, reinterpret_cast<const char *> (&espeakdata_voices63_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/grc", 
-			L"grc");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/grc", 
+			U"grc");
 		Collection_addItem (me.peek(), espeakdata_voices63.transfer());
 
 		static unsigned char espeakdata_voices64_data[28] = {
 			110, 97, 109, 101, 32, 104, 97, 105, 116, 105, 97, 110, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 104, 116, 10, 32, 10, 0};
 		autoFileInMemory espeakdata_voices64 = FileInMemory_createWithData (27, reinterpret_cast<const char *> (&espeakdata_voices64_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ht", 
-			L"ht");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ht", 
+			U"ht");
 		Collection_addItem (me.peek(), espeakdata_voices64.transfer());
 
 		static unsigned char espeakdata_voices65_data[70] = {
@@ -659,15 +659,15 @@ FilesInMemory create_espeakdata_voices () {
 			100, 32, 56, 48, 32, 32, 32, 47, 47, 32, 115, 112, 101, 101, 100, 32, 97, 100, 106, 117, 115, 116, 109, 101, 110, 116, 44, 32, 112, 101,
 			114, 99, 101, 110, 116, 97, 103, 101, 10, 0};
 		autoFileInMemory espeakdata_voices65 = FileInMemory_createWithData (69, reinterpret_cast<const char *> (&espeakdata_voices65_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/jbo", 
-			L"jbo");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/jbo", 
+			U"jbo");
 		Collection_addItem (me.peek(), espeakdata_voices65.transfer());
 
 		static unsigned char espeakdata_voices66_data[27] = {
 			110, 97, 109, 101, 32, 107, 97, 122, 97, 107, 104, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 107, 107, 10, 32, 10, 0};
 		autoFileInMemory espeakdata_voices66 = FileInMemory_createWithData (26, reinterpret_cast<const char *> (&espeakdata_voices66_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/kk", 
-			L"kk");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/kk", 
+			U"kk");
 		Collection_addItem (me.peek(), espeakdata_voices66.transfer());
 
 		static unsigned char espeakdata_voices67_data[75] = {
@@ -675,8 +675,8 @@ FilesInMemory create_espeakdata_voices () {
 			115, 116, 114, 101, 115, 115, 114, 117, 108, 101, 32, 50, 32, 32, 47, 47, 32, 112, 101, 110, 117, 108, 116, 105, 109, 97, 116, 101, 32, 40,
 			102, 111, 114, 32, 116, 101, 115, 116, 105, 110, 103, 41, 10, 10, 0};
 		autoFileInMemory espeakdata_voices67 = FileInMemory_createWithData (74, reinterpret_cast<const char *> (&espeakdata_voices67_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/kl", 
-			L"kl");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/kl", 
+			U"kl");
 		Collection_addItem (me.peek(), espeakdata_voices67.transfer());
 
 		static unsigned char espeakdata_voices68_data[83] = {
@@ -684,24 +684,24 @@ FilesInMemory create_espeakdata_voices () {
 			32, 109, 97, 108, 101, 10, 112, 105, 116, 99, 104, 32, 56, 48, 32, 49, 49, 56, 10, 105, 110, 116, 111, 110, 97, 116, 105, 111, 110, 32,
 			50, 10, 10, 116, 117, 110, 101, 115, 32, 113, 49, 32, 113, 49, 32, 113, 49, 32, 113, 49, 10, 10, 0};
 		autoFileInMemory espeakdata_voices68 = FileInMemory_createWithData (82, reinterpret_cast<const char *> (&espeakdata_voices68_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ko", 
-			L"ko");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ko", 
+			U"ko");
 		Collection_addItem (me.peek(), espeakdata_voices68.transfer());
 
 		static unsigned char espeakdata_voices69_data[43] = {
 			10, 110, 97, 109, 101, 32, 108, 105, 116, 104, 117, 97, 110, 105, 97, 110, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 108, 116, 10, 103,
 			101, 110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 0};
 		autoFileInMemory espeakdata_voices69 = FileInMemory_createWithData (42, reinterpret_cast<const char *> (&espeakdata_voices69_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/lt", 
-			L"lt");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/lt", 
+			U"lt");
 		Collection_addItem (me.peek(), espeakdata_voices69.transfer());
 
 		static unsigned char espeakdata_voices70_data[33] = {
 			110, 97, 109, 101, 32, 109, 97, 108, 116, 101, 115, 101, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 109, 116, 10,
 			32, 10, 0};
 		autoFileInMemory espeakdata_voices70 = FileInMemory_createWithData (32, reinterpret_cast<const char *> (&espeakdata_voices70_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/mt", 
-			L"mt");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/mt", 
+			U"mt");
 		Collection_addItem (me.peek(), espeakdata_voices70.transfer());
 
 		static unsigned char espeakdata_voices71_data[127] = {
@@ -711,64 +711,64 @@ FilesInMemory create_espeakdata_voices () {
 			32, 49, 57, 48, 32, 32, 49, 57, 48, 32, 32, 50, 48, 48, 32, 32, 50, 48, 48, 32, 32, 48, 32, 32, 48, 32, 32, 50, 50, 48,
 			32, 32, 50, 52, 48, 10, 0};
 		autoFileInMemory espeakdata_voices71 = FileInMemory_createWithData (126, reinterpret_cast<const char *> (&espeakdata_voices71_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/nci", 
-			L"nci");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/nci", 
+			U"nci");
 		Collection_addItem (me.peek(), espeakdata_voices71.transfer());
 
 		static unsigned char espeakdata_voices72_data[55] = {
 			110, 97, 109, 101, 32, 110, 101, 112, 97, 108, 105, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 110, 101, 10, 103,
 			101, 110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 10, 100, 105, 99, 116, 114, 117, 108, 101, 115, 32, 49, 10, 0};
 		autoFileInMemory espeakdata_voices72 = FileInMemory_createWithData (54, reinterpret_cast<const char *> (&espeakdata_voices72_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ne", 
-			L"ne");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ne", 
+			U"ne");
 		Collection_addItem (me.peek(), espeakdata_voices72.transfer());
 
 		static unsigned char espeakdata_voices73_data[48] = {
 			110, 97, 109, 101, 32, 110, 111, 114, 116, 104, 101, 114, 110, 45, 115, 111, 116, 104, 111, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 110,
 			115, 111, 10, 116, 114, 97, 110, 115, 108, 97, 116, 111, 114, 32, 115, 119, 10, 0};
 		autoFileInMemory espeakdata_voices73 = FileInMemory_createWithData (47, reinterpret_cast<const char *> (&espeakdata_voices73_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/nso", 
-			L"nso");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/nso", 
+			U"nso");
 		Collection_addItem (me.peek(), espeakdata_voices73.transfer());
 
 		static unsigned char espeakdata_voices74_data[31] = {
 			110, 97, 109, 101, 32, 112, 117, 110, 106, 97, 98, 105, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 112, 97, 10,
 			0};
 		autoFileInMemory espeakdata_voices74 = FileInMemory_createWithData (30, reinterpret_cast<const char *> (&espeakdata_voices74_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/pa", 
-			L"pa");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/pa", 
+			U"pa");
 		Collection_addItem (me.peek(), espeakdata_voices74.transfer());
 
 		static unsigned char espeakdata_voices75_data[52] = {
 			110, 97, 109, 101, 32, 112, 97, 112, 105, 97, 109, 101, 110, 116, 111, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32,
 			112, 97, 112, 10, 10, 112, 104, 111, 110, 101, 109, 101, 115, 32, 98, 97, 115, 101, 50, 10, 10, 0};
 		autoFileInMemory espeakdata_voices75 = FileInMemory_createWithData (51, reinterpret_cast<const char *> (&espeakdata_voices75_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/pap", 
-			L"pap");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/pap", 
+			U"pap");
 		Collection_addItem (me.peek(), espeakdata_voices75.transfer());
 
 		static unsigned char espeakdata_voices76_data[58] = {
 			110, 97, 109, 101, 32, 100, 97, 114, 105, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 112, 114, 115, 10, 10, 116,
 			114, 97, 110, 115, 108, 97, 116, 111, 114, 32, 102, 97, 10, 115, 116, 114, 101, 115, 115, 114, 117, 108, 101, 32, 49, 48, 10, 0};
 		autoFileInMemory espeakdata_voices76 = FileInMemory_createWithData (57, reinterpret_cast<const char *> (&espeakdata_voices76_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/prs", 
-			L"prs");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/prs", 
+			U"prs");
 		Collection_addItem (me.peek(), espeakdata_voices76.transfer());
 
 		static unsigned char espeakdata_voices77_data[49] = {
 			110, 97, 109, 101, 32, 107, 105, 110, 121, 97, 114, 119, 97, 110, 100, 97, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101,
 			32, 114, 119, 10, 103, 101, 110, 100, 101, 114, 32, 109, 97, 108, 101, 10, 32, 10, 0};
 		autoFileInMemory espeakdata_voices77 = FileInMemory_createWithData (48, reinterpret_cast<const char *> (&espeakdata_voices77_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/rw", 
-			L"rw");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/rw", 
+			U"rw");
 		Collection_addItem (me.peek(), espeakdata_voices77.transfer());
 
 		static unsigned char espeakdata_voices78_data[40] = {
 			110, 97, 109, 101, 32, 115, 105, 110, 104, 97, 108, 97, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 115, 105, 10, 10, 105, 110, 116, 111,
 			110, 97, 116, 105, 111, 110, 32, 50, 10, 0};
 		autoFileInMemory espeakdata_voices78 = FileInMemory_createWithData (39, reinterpret_cast<const char *> (&espeakdata_voices78_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/si", 
-			L"si");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/si", 
+			U"si");
 		Collection_addItem (me.peek(), espeakdata_voices78.transfer());
 
 		static unsigned char espeakdata_voices79_data[84] = {
@@ -776,53 +776,53 @@ FilesInMemory create_espeakdata_voices () {
 			108, 10, 32, 10, 115, 116, 114, 101, 115, 115, 76, 101, 110, 103, 116, 104, 32, 32, 32, 49, 54, 48, 32, 49, 53, 48, 32, 32, 50, 52,
 			48, 32, 50, 52, 48, 32, 32, 50, 52, 48, 32, 50, 52, 48, 32, 32, 51, 48, 48, 32, 51, 50, 48, 0};
 		autoFileInMemory espeakdata_voices79 = FileInMemory_createWithData (83, reinterpret_cast<const char *> (&espeakdata_voices79_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/sl", 
-			L"sl");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/sl", 
+			U"sl");
 		Collection_addItem (me.peek(), espeakdata_voices79.transfer());
 
 		static unsigned char espeakdata_voices80_data[55] = {
 			110, 97, 109, 101, 32, 116, 101, 108, 117, 103, 117, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 116, 101, 10, 10, 105, 110, 116, 111, 110,
 			97, 116, 105, 111, 110, 32, 50, 10, 47, 47, 99, 111, 110, 115, 111, 110, 97, 110, 116, 115, 32, 56, 48, 10, 0};
 		autoFileInMemory espeakdata_voices80 = FileInMemory_createWithData (54, reinterpret_cast<const char *> (&espeakdata_voices80_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/te", 
-			L"te");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/te", 
+			U"te");
 		Collection_addItem (me.peek(), espeakdata_voices80.transfer());
 
 		static unsigned char espeakdata_voices81_data[34] = {
 			110, 97, 109, 101, 32, 115, 101, 116, 115, 119, 97, 110, 97, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 116, 110,
 			10, 32, 10, 0};
 		autoFileInMemory espeakdata_voices81 = FileInMemory_createWithData (33, reinterpret_cast<const char *> (&espeakdata_voices81_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/tn", 
-			L"tn");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/tn", 
+			U"tn");
 		Collection_addItem (me.peek(), espeakdata_voices81.transfer());
 
 		static unsigned char espeakdata_voices82_data[49] = {
 			110, 97, 109, 101, 32, 116, 97, 116, 97, 114, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 116, 116, 10, 10, 116,
 			117, 110, 101, 115, 32, 115, 51, 32, 99, 51, 32, 113, 51, 32, 101, 51, 10, 10, 0};
 		autoFileInMemory espeakdata_voices82 = FileInMemory_createWithData (48, reinterpret_cast<const char *> (&espeakdata_voices82_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/tt", 
-			L"tt");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/tt", 
+			U"tt");
 		Collection_addItem (me.peek(), espeakdata_voices82.transfer());
 
 		static unsigned char espeakdata_voices83_data[55] = {
 			110, 97, 109, 101, 32, 117, 114, 100, 117, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 117, 114, 10, 10, 112, 104,
 			111, 110, 101, 109, 101, 115, 32, 104, 105, 10, 115, 116, 114, 101, 115, 115, 114, 117, 108, 101, 32, 54, 10, 10, 0};
 		autoFileInMemory espeakdata_voices83 = FileInMemory_createWithData (54, reinterpret_cast<const char *> (&espeakdata_voices83_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ur", 
-			L"ur");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/ur", 
+			U"ur");
 		Collection_addItem (me.peek(), espeakdata_voices83.transfer());
 
 		static unsigned char espeakdata_voices84_data[32] = {
 			110, 97, 109, 101, 32, 119, 111, 108, 111, 102, 45, 116, 101, 115, 116, 10, 108, 97, 110, 103, 117, 97, 103, 101, 32, 119, 111, 10, 10, 32,
 			10, 0};
 		autoFileInMemory espeakdata_voices84 = FileInMemory_createWithData (31, reinterpret_cast<const char *> (&espeakdata_voices84_data), 
-			L"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/wo", 
-			L"wo");
+			U"/home/david/praat/src/espeak-work/espeak-1.46.27/espeak-data/voices/test/wo", 
+			U"wo");
 		Collection_addItem (me.peek(), espeakdata_voices84.transfer());
 
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw (L"FilesInMemory not created.");
+		Melder_throw (U"FilesInMemory not created.");
 	}
 }
 
diff --git a/external/espeak/klatt.cpp b/external/espeak/klatt.cpp
index e78d1cd..961c661 100644
--- a/external/espeak/klatt.cpp
+++ b/external/espeak/klatt.cpp
@@ -249,6 +249,9 @@ if(option_log_frames)
 {
 	FILE *f;
 	f=fopen("log-klatt","a");
+	/*
+	 * ppgb: BUG; vervangen door fwrite (Melder_sprint...
+	 */
 	fprintf(f,"%4dhz %2dAV %4d %3d, %4d %3d, %4d %3d, %4d %3d, %4d, %3d, FNZ=%3d TLT=%2d\n",frame->F0hz10,frame->AVdb,
 	frame->Fhz[1],frame->Bhz[1],frame->Fhz[2],frame->Bhz[2],frame->Fhz[3],frame->Bhz[3],frame->Fhz[4],frame->Bhz[4],frame->Fhz[5],frame->Bhz[5],frame->Fhz[0],frame->TLTdb);
 	fclose(f);
@@ -1175,6 +1178,9 @@ if(option_log_frames)
 {
 	FILE *f_log;
 	f_log=fopen("log-espeakedit","a");
+	/*
+	 * ppgb: BUG; vervangen door fwrite (Melder_sprint...
+	 */
 	if(f_log != NULL)
 	{
 		fprintf(f_log,"K %3dmS  %3d %3d %4d %4d %4d %4d (%2d)  to  %3d %3d %4d %4d %4d %4d (%2d)\n",length*1000/samplerate,
@@ -1183,6 +1189,9 @@ if(option_log_frames)
 		fclose(f_log);
 	}
 	f_log=fopen("log-klatt","a");
+	/*
+	 * ppgb: BUG; vervangen door fwrite (Melder_sprint...
+	 */
 	if(f_log != NULL)
 	{
 		fprintf(f_log,"K %3dmS  %3d %3d %4d %4d (%2d)  to  %3d %3d %4d %4d (%2d)\n",length*1000/samplerate,
diff --git a/external/espeak/readclause.cpp b/external/espeak/readclause.cpp
old mode 100755
new mode 100644
diff --git a/external/espeak/setlengths.cpp b/external/espeak/setlengths.cpp
old mode 100755
new mode 100644
diff --git a/external/espeak/sonic.cpp b/external/espeak/sonic.cpp
old mode 100755
new mode 100644
diff --git a/external/espeak/sonic.h b/external/espeak/sonic.h
old mode 100755
new mode 100644
diff --git a/external/espeak/speech.h b/external/espeak/speech.h
index 7f1dc96..cd38fc0 100644
--- a/external/espeak/speech.h
+++ b/external/espeak/speech.h
@@ -24,11 +24,6 @@
 #include "espeakdata_FileInMemory.h"
 #define DATA_FROM_SOURCECODE_FILES
 
-#ifdef _WIN32
-	wchar_t * Melder_peekUtf8ToWcs (const char *string);
-	const uint16_t * Melder_peekWcsToUtf16 (const wchar_t *string);
-#endif
-
 // conditional compilation options
 #define INCLUDE_KLATT
 /* ppgb, 23 December 2011 */
@@ -48,9 +43,7 @@
 #undef PLATFORM_WINDOWS
 
 #define PATHSEP  '/'
-// USE_PORTAUDIO or USE_PULSEAUDIO are now defined in the makefile
-//#define USE_PORTAUDIO
-//#define USE_PULSEAUDIO
+
 /* ppgb, 23 December 2011 */
 #undef USE_NANOSLEEP
 //#define ESPEAK_API  extern "C"
diff --git a/external/espeak/synth_mbrola.cpp b/external/espeak/synth_mbrola.cpp
old mode 100755
new mode 100644
diff --git a/external/espeak/synthdata.cpp b/external/espeak/synthdata.cpp
index 4f5a694..4135002 100644
--- a/external/espeak/synthdata.cpp
+++ b/external/espeak/synthdata.cpp
@@ -120,10 +120,10 @@ int LoadPhData()
 
 #ifdef DATA_FROM_SOURCECODE_FILES
 	long llength;
-	phoneme_tab_data = (unsigned char *) FilesInMemory_getData (espeakdata_phons, L"phontab", &llength);
-	phoneme_index = (USHORT *) FilesInMemory_getData (espeakdata_phons, L"phonindex", &llength);
-	phondata_ptr = (char *) FilesInMemory_getData (espeakdata_phons, L"phondata", &llength);
-	tunes = (TUNE *) FilesInMemory_getData (espeakdata_phons, L"intonations", &llength);
+	phoneme_tab_data = (unsigned char *) FilesInMemory_getData (espeakdata_phons, U"phontab", &llength);
+	phoneme_index = (USHORT *) FilesInMemory_getData (espeakdata_phons, U"phonindex", &llength);
+	phondata_ptr = (char *) FilesInMemory_getData (espeakdata_phons, U"phondata", &llength);
+	tunes = (TUNE *) FilesInMemory_getData (espeakdata_phons, U"intonations", &llength);
 	length = llength;
 #else
 	if((phoneme_tab_data = (unsigned char *)ReadPhFile((void *)(phoneme_tab_data),"phontab",NULL)) == NULL)
diff --git a/external/espeak/synthesize.cpp b/external/espeak/synthesize.cpp
old mode 100755
new mode 100644
diff --git a/external/espeak/synthesize.h b/external/espeak/synthesize.h
old mode 100755
new mode 100644
diff --git a/external/espeak/translate.h b/external/espeak/translate.h
old mode 100755
new mode 100644
diff --git a/external/espeak/voices.cpp b/external/espeak/voices.cpp
index becdc3c..5970a1b 100644
--- a/external/espeak/voices.cpp
+++ b/external/espeak/voices.cpp
@@ -672,7 +672,7 @@ voice_t *LoadVoice(const char *vname, int control)
 #ifdef DATA_FROM_SOURCECODE_FILES
 	long index = 0;
 	const char *start = data;
-	while (start = espeakdata_get_voicedata (start, numberOfBytes, buf, sizeof(buf), &index)) {
+	while (!! (start = espeakdata_get_voicedata (start, numberOfBytes, buf, sizeof(buf), &index))) {
 #else
 	while((f_voice != NULL) && (fgets_strip(buf,sizeof(buf),f_voice) != NULL)) {
 #endif
@@ -1002,7 +1002,7 @@ voice_t *LoadVoice(const char *vname, int control)
 	{
 		if((ix = SelectPhonemeTableName(phonemes_name)) < 0)
 		{
-			Melder_throw ("Unknown phoneme table: ", phonemes_name);
+			Melder_throw (U"Unknown phoneme table: ", Melder_peek8to32 (phonemes_name));
 		}
 		voice->phoneme_tab_ix = ix;
 		new_translator->phoneme_tab_ix = ix;
diff --git a/external/espeak/wavegen.cpp b/external/espeak/wavegen.cpp
old mode 100755
new mode 100644
diff --git a/external/flac/flac_FLAC_format.h b/external/flac/flac_FLAC_format.h
index 8984713..d93ed27 100644
--- a/external/flac/flac_FLAC_format.h
+++ b/external/flac/flac_FLAC_format.h
@@ -1004,10 +1004,12 @@ FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Pic
 /* \} */
 
 // pb 20080502
-#ifdef _WIN32
-	wchar_t * Melder_peekUtf8ToWcs (const char *string);
-	const uint16_t * Melder_peekWcsToUtf16 (const wchar_t *string);
-	#define fopen(filename,mode)  _wfopen (Melder_peekWcsToUtf16 (Melder_peekUtf8ToWcs (filename)), L"" mode)
+#if defined (_WIN32) && ! defined (__CYGWIN__)
+	#ifndef __cplusplus
+		uint32_t * Melder_peek8to32 (const char *string);
+		const uint16_t * Melder_peek32to16 (const uint32_t *string);
+	#endif
+	#define fopen(filename,mode)  _wfopen (Melder_peek32to16 (Melder_peek8to32 (filename)), L"" mode)
 #endif
 
 #ifdef __cplusplus
diff --git a/external/flac/flac_stream_decoder.c b/external/flac/flac_stream_decoder.c
index ef053fc..54f4470 100644
--- a/external/flac/flac_stream_decoder.c
+++ b/external/flac/flac_stream_decoder.c
@@ -33,7 +33,7 @@
 #  include <config.h>
 #endif
 
-#if defined _WIN32
+#if defined (_WIN32)
 #include <io.h> /* for _setmode() */
 #include <fcntl.h> /* for _O_BINARY */
 #endif
@@ -1279,9 +1279,9 @@ FILE *get_binary_stdin_(void)
 	 */
 #if defined _MSC_VER || defined __MINGW32__
 	_setmode(_fileno(stdin), _O_BINARY);
-#elif defined __CYGWIN__ 
+#elif defined __CYGWIN__
 	/* almost certainly not needed for any modern Cygwin, but let's be safe... */
-	setmode(_fileno(stdin), _O_BINARY);
+	setmode(fileno(stdin), O_BINARY);
 #elif defined __EMX__
 	setmode(fileno(stdin), O_BINARY);
 #endif
diff --git a/external/flac/flac_stream_encoder.c b/external/flac/flac_stream_encoder.c
index 65f18a9..8f6cd3f 100644
--- a/external/flac/flac_stream_encoder.c
+++ b/external/flac/flac_stream_encoder.c
@@ -33,7 +33,7 @@
 #  include <config.h>
 #endif
 
-#if defined _WIN32
+#if defined (_WIN32)
 #include <io.h> /* for _setmode() */
 #include <fcntl.h> /* for _O_BINARY */
 #endif
@@ -4286,7 +4286,7 @@ FILE *get_binary_stdout_(void)
 	_setmode(_fileno(stdout), _O_BINARY);
 #elif defined __CYGWIN__
 	/* almost certainly not needed for any modern Cygwin, but let's be safe... */
-	setmode(_fileno(stdout), _O_BINARY);
+	setmode(fileno(stdout), O_BINARY);
 #elif defined __EMX__
 	setmode(fileno(stdout), O_BINARY);
 #endif
diff --git a/external/mp3/mp3.cpp b/external/mp3/mp3.cpp
index c7b7191..a0aa0c5 100644
--- a/external/mp3/mp3.cpp
+++ b/external/mp3/mp3.cpp
@@ -107,6 +107,7 @@ struct _MP3_FILE
 	MP3F_OFFSET first_offset;
 	unsigned skip_amount;
 	int need_seek;
+	MP3F_OFFSET id3TagSize_bytes; /* David Weenink */
 };
 
 static enum mad_flow mp3f_mad_error (void *context, struct mad_stream *stream, struct mad_frame *frame);
@@ -145,12 +146,12 @@ int mp3_recognize (int nread, const char *data)
 		((bytes [1] & 0xFE) == 0xE2);   /* MPEG ADTS, layer III, v2.5 */
 }
 
-MP3_FILE mp3f_new (void)
+MP3_FILE mp3f_new ()
 {
 	try {
 		return Melder_calloc (struct _MP3_FILE, 1);
 	} catch (MelderError) {
-		Melder_throw ("Cannot create MP3 file object.");
+		Melder_throw (U"Cannot create MP3 file object.");
 	}
 }
 
@@ -165,6 +166,70 @@ void mp3f_set_file (MP3_FILE mp3f, FILE *f)
 	if (! f)
 		return;
 	fseek (f, 0, SEEK_SET);
+	/* David Weenink 20151005
+		Check if an ID3 header version 2 or newer is present at the START of the file (older header types are always at the END of the file). We calculate the size of the header (in bytes), store it in the mp3f -> id3TagSize_bytes field and simply skip this amount of bytes before analyzing/decoding starts.
+		
+		According to http://id3.org/id3v2-00:
+		The ID3v2 tag header, which should be the FIRST information in the file, is 10 bytes as follows:
+
+		ID3/file identifier      "ID3"
+		ID3 version              $02 00
+		ID3 flags                %xx000000
+		ID3 size             4 * %0xxxxxxx
+
+		The first three bytes of the tag are always "ID3" to indicate that
+		this is an ID3 tag, directly followed by the two version bytes. The
+		first byte of ID3 version is it's major version, while the second byte
+		is its revision number. All revisions are backwards compatible while
+		major versions are not. If software with ID3v2 and below support
+		should encounter version three or higher it should simply ignore the
+		whole tag. Version and revision will never be $FF.
+
+		The first bit (bit 7) in the 'ID3 flags' is indicating whether or not
+		unsynchronisation is used (see section 5 for details); a set bit
+		indicates usage.
+
+		The second bit (bit 6) is indicating whether or not compression is
+		used; a set bit indicates usage. Since no compression scheme has been
+		decided yet, the ID3 decoder (for now) should just ignore the entire
+		tag if the compression bit is set.
+
+		The ID3 tag size is encoded with four bytes where the first bit (bit
+		7) is set to zero in every byte, making a total of 28 bits. The zeroed
+		bits are ignored, so a 257 bytes long tag is represented as $00 00 02 01.
+
+		The ID3 tag size is the size of the complete tag after
+		unsychronisation, including padding, excluding the header (total tag
+		size - 10). The reason to use 28 bits (representing up to 256MB) for
+		size description is that we don't want to run out of space here.
+
+		A ID3v2 tag can be detected with the following pattern:
+		$49 44 33 yy yy xx zz zz zz zz
+		Where yy is less than $FF, xx is the 'flags' byte and zz is less than$80.
+	*/
+	{
+		unsigned char bytes [10];
+		(void) fread (& bytes, 1, 10, mp3f -> f);
+		mp3f -> id3TagSize_bytes = 0;
+		if (bytes[0] == 'I' && bytes[1] == 'D' && bytes[2] == '3') {
+			if (bytes[3] < 0xFF && bytes[4] < 0xFF &&
+				bytes[6] < 0x80 && bytes[7] < 0x80 && bytes[8] < 0x80 && bytes[9] < 0x80 ) {
+				/* 
+				Ignore version: bytes[3] & bytes[4] 
+				Ignore flags: bytes[5]
+					The only purpose of the 'unsychronisation scheme' is to make the ID3v2
+					tag as compatible as possible with existing software. There is no use
+					in 'unsynchronising' tags if the file is only to be processed by new
+					software. Unsynchronisation may only be made with MPEG 2 layer I, II
+					and III and MPEG 2.5 files.
+				 */
+				mp3f -> id3TagSize_bytes = (bytes[6] << 21 | bytes[7] << 14 | bytes[8] << 7 | bytes[9]) + 10;
+			}
+		}
+	}
+	
+	fseek (f, mp3f -> id3TagSize_bytes, SEEK_SET); // David Weenink
+
 	mp3f -> next_read_position = 0;
 	mp3f -> need_seek = 0;
 	mp3f -> delay = MP3F_DECODER_DELAY + MP3F_ENCODER_DELAY;
@@ -183,7 +248,7 @@ int mp3f_analyze (MP3_FILE mp3f)
 	if (! mp3f || ! mp3f -> f)
 		return 0;
 
-	fseek (mp3f -> f, 0, SEEK_SET);
+	fseek (mp3f -> f, mp3f -> id3TagSize_bytes, SEEK_SET); // David Weenink
 
 	mp3f -> xing = 0;
 	mp3f -> channels = 0;
@@ -199,9 +264,9 @@ int mp3f_analyze (MP3_FILE mp3f)
 			mp3f_mad_input,
 			mp3f_mad_first_header,
 			mp3f_mad_first_filter,
-			NULL /* Output: Don't actually decode for now */,
+			nullptr /* Output: Don't actually decode for now */,
 			mp3f_mad_error,
-			NULL /* Message */);
+			nullptr /* Message */);
 
 	status = mad_decoder_run (decoder, MAD_DECODER_MODE_SYNC);
 	if (status != 0)
@@ -219,7 +284,7 @@ int mp3f_analyze (MP3_FILE mp3f)
 		frame_size = mp3f -> locations [1] - mp3f -> locations[0];
 
 		/* For file size, seek to end */
-		fseek (mp3f -> f, 0, SEEK_END);
+		fseek (mp3f -> f, mp3f -> id3TagSize_bytes, SEEK_END); // David Weenink
 		file_size = ftell (mp3f -> f);
 
 		/* This estimate will be pretty accurate for CBR */
@@ -249,15 +314,15 @@ int mp3f_analyze (MP3_FILE mp3f)
 	mp3f -> frames = 0;
 	mp3f -> samples = 0;
 
-	fseek (mp3f -> f, 0, SEEK_SET);
+	fseek (mp3f -> f, mp3f -> id3TagSize_bytes, SEEK_SET); // David Weenink
 	mad_decoder_init (decoder, 
 			mp3f,
 			mp3f_mad_input,
 			mp3f_mad_scan_header,
-			NULL /* Filter */,
-			NULL /* Output */,
+			nullptr /* Filter */,
+			nullptr /* Output */,
 			mp3f_mad_error,
-			NULL /* Message */);
+			nullptr /* Message */);
 
 	status = mad_decoder_run (decoder, MAD_DECODER_MODE_SYNC);
 
@@ -370,11 +435,11 @@ int mp3f_read (MP3_FILE mp3f, MP3F_OFFSET num_samples)
 	mad_decoder_init (decoder, 
 			mp3f,
 			mp3f_mad_input,
-			NULL /* Header */,
-			NULL /* Filter */,
+			nullptr /* Header */,
+			nullptr /* Filter */,
 			mp3f_mad_report_samples,
 			mp3f_mad_error,
-			NULL /* Message */);
+			nullptr /* Message */);
 
 	mp3f -> read_amount = num_samples;
 	status = mad_decoder_run (decoder, MAD_DECODER_MODE_SYNC);
@@ -456,7 +521,7 @@ static enum mad_flow mp3f_mad_input(void *context, struct mad_stream *stream)
 {
 	MP3_FILE mp3f = (MP3_FILE) context;
 	FILE *f = mp3f -> f;
-	unsigned char *buffer = NULL;
+	unsigned char *buffer = nullptr;
 	unsigned nthrown = 0, ncopied = 0, size = 0;
 	size_t nread = 0;
 	MP3F_OFFSET offset;
diff --git a/external/mp3/mp3.h b/external/mp3/mp3.h
index 0759cb2..f65297a 100644
--- a/external/mp3/mp3.h
+++ b/external/mp3/mp3.h
@@ -44,7 +44,7 @@ typedef void (*MP3F_CALLBACK) (
 		long num_samples,
 		void *context);
 
-MP3_FILE mp3f_new (void);
+MP3_FILE mp3f_new ();
 void mp3f_delete (MP3_FILE mp3f);
 
 void mp3f_set_file (MP3_FILE mp3f, FILE *f);
diff --git a/fon/AmplitudeTier.cpp b/fon/AmplitudeTier.cpp
index 1183c62..15139d0 100644
--- a/fon/AmplitudeTier.cpp
+++ b/fon/AmplitudeTier.cpp
@@ -1,6 +1,6 @@
 /* AmplitudeTier.cpp
  *
- * Copyright (C) 2003-2011,2014 Paul Boersma
+ * Copyright (C) 2003-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,66 +21,66 @@
 
 Thing_implement (AmplitudeTier, RealTier, 0);
 
-AmplitudeTier AmplitudeTier_create (double tmin, double tmax) {
+autoAmplitudeTier AmplitudeTier_create (double tmin, double tmax) {
 	try {
 		autoAmplitudeTier me = Thing_new (AmplitudeTier);
 		RealTier_init (me.peek(), tmin, tmax);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("AmplitudeTier not created.");
+		Melder_throw (U"AmplitudeTier not created.");
 	}
 }
 
 void AmplitudeTier_draw (AmplitudeTier me, Graphics g, double tmin, double tmax,
-	double ymin, double ymax, const wchar_t *method, int garnish)
+	double ymin, double ymax, const char32 *method, int garnish)
 {
-	RealTier_draw (me, g, tmin, tmax, ymin, ymax, garnish, method, L"Sound pressure (Pa)");
+	RealTier_draw (me, g, tmin, tmax, ymin, ymax, garnish, method, U"Sound pressure (Pa)");
 }
 
-AmplitudeTier PointProcess_upto_AmplitudeTier (PointProcess me, double soundPressure) {
+autoAmplitudeTier PointProcess_upto_AmplitudeTier (PointProcess me, double soundPressure) {
 	try {
 		return (AmplitudeTier) PointProcess_upto_RealTier (me, soundPressure, classAmplitudeTier);
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to AmplitudeTier.");
+		Melder_throw (me, U": not converted to AmplitudeTier.");
 	}
 }
 
-AmplitudeTier IntensityTier_to_AmplitudeTier (IntensityTier me) {
+autoAmplitudeTier IntensityTier_to_AmplitudeTier (IntensityTier me) {
 	try {
 		autoAmplitudeTier thee = Thing_new (AmplitudeTier);
 		my structRealTier :: v_copy (thee.peek());
-		for (long i = 1; i <= thy points -> size; i ++) {
-			RealPoint point = (RealPoint) thy points -> item [i];
+		for (long i = 1; i <= thy numberOfPoints(); i ++) {
+			RealPoint point = thy point (i);
 			point -> value = pow (10.0, point -> value / 20.0) * 2.0e-5;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to AmplitudeTier.");
+		Melder_throw (me, U": not converted to AmplitudeTier.");
 	}
 }
 
-IntensityTier AmplitudeTier_to_IntensityTier (AmplitudeTier me, double threshold_dB) {
+autoIntensityTier AmplitudeTier_to_IntensityTier (AmplitudeTier me, double threshold_dB) {
 	try {
 		double threshold_Pa = pow (10.0, threshold_dB / 20.0) * 2.0e-5;   // often zero!
 		autoIntensityTier thee = Thing_new (IntensityTier);
 		my structRealTier :: v_copy (thee.peek());
-		for (long i = 1; i <= thy points -> size; i ++) {
-			RealPoint point = (RealPoint) thy points -> item [i];
+		for (long i = 1; i <= thy numberOfPoints(); i ++) {
+			RealPoint point = thy point (i);
 			double absoluteValue = fabs (point -> value);
 			point -> value = absoluteValue <= threshold_Pa ? threshold_dB : 20.0 * log10 (absoluteValue / 2.0e-5);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to IntensityTier.");
+		Melder_throw (me, U": not converted to IntensityTier.");
 	}
 }
 
-TableOfReal AmplitudeTier_downto_TableOfReal (AmplitudeTier me) {
-	return RealTier_downto_TableOfReal (me, L"Time (s)", L"Sound pressure (Pa)");
+autoTableOfReal AmplitudeTier_downto_TableOfReal (AmplitudeTier me) {
+	return RealTier_downto_TableOfReal (me, U"Time (s)", U"Sound pressure (Pa)");
 }
 
 void Sound_AmplitudeTier_multiply_inline (Sound me, AmplitudeTier amplitude) {
-	if (amplitude -> points -> size == 0) return;
+	if (amplitude -> numberOfPoints() == 0) return;
 	for (long isamp = 1; isamp <= my nx; isamp ++) {
 		double t = my x1 + (isamp - 1) * my dx;
 		double factor = RealTier_getValueAtTime (amplitude, t);
@@ -90,29 +90,29 @@ void Sound_AmplitudeTier_multiply_inline (Sound me, AmplitudeTier amplitude) {
 	}
 }
 
-Sound Sound_AmplitudeTier_multiply (Sound me, AmplitudeTier amplitude) {
+autoSound Sound_AmplitudeTier_multiply (Sound me, AmplitudeTier amplitude) {
 	try {
 		autoSound thee = Data_copy (me);
 		Sound_AmplitudeTier_multiply_inline (thee.peek(), amplitude);
 		Vector_scale (thee.peek(), 0.9);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not multiplied by ", amplitude, ".");
+		Melder_throw (me, U": not multiplied by ", amplitude, U".");
 	}
 }
 
-AmplitudeTier PointProcess_Sound_to_AmplitudeTier_point (PointProcess me, Sound thee) {
+autoAmplitudeTier PointProcess_Sound_to_AmplitudeTier_point (PointProcess me, Sound thee) {
 	try {
 		long imin, imax, numberOfPeaks = PointProcess_getWindowPoints (me, my xmin, my xmax, & imin, & imax);
-		if (numberOfPeaks < 3) return NULL;
+		if (numberOfPeaks < 3) return nullptr;
 		autoAmplitudeTier him = AmplitudeTier_create (my xmin, my xmax);
 		for (long i = imin; i <= imax; i ++) {
 			double value = Vector_getValueAtX (thee, my t [i], Vector_CHANNEL_AVERAGE, Vector_VALUE_INTERPOLATION_SINC700);
 			if (NUMdefined (value)) RealTier_addPoint (him.peek(), my t [i], value);
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": not converted to AmplitudeTier.");
+		Melder_throw (me, U" & ", thee, U": not converted to AmplitudeTier.");
 	}
 }
 /*
@@ -149,14 +149,14 @@ static double Sound_getHannWindowedRms (Sound me, double tmid, double widthLeft,
 	}
 	return sqrt (sumOfSquares / windowSumOfSquares);
 }
-AmplitudeTier PointProcess_Sound_to_AmplitudeTier_period (PointProcess me, Sound thee, double tmin, double tmax,
+autoAmplitudeTier PointProcess_Sound_to_AmplitudeTier_period (PointProcess me, Sound thee, double tmin, double tmax,
 	double pmin, double pmax, double maximumPeriodFactor)
 {
 	try {
-		long imin, imax, numberOfPeaks;
 		if (tmax <= tmin) tmin = my xmin, tmax = my xmax;
-		numberOfPeaks = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax);
-		if (numberOfPeaks < 3) Melder_throw ("Too few pulses between ", tmin, " and ", tmax, " seconds.");
+		long imin, imax;
+		long numberOfPeaks = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax);
+		if (numberOfPeaks < 3) Melder_throw (U"Too few pulses between ", tmin, U" and ", tmax, U" seconds.");
 		autoAmplitudeTier him = AmplitudeTier_create (tmin, tmax);
 		for (long i = imin + 1; i < imax; i ++) {
 			double p1 = my t [i] - my t [i - 1], p2 = my t [i + 1] - my t [i];
@@ -167,9 +167,9 @@ AmplitudeTier PointProcess_Sound_to_AmplitudeTier_period (PointProcess me, Sound
 					RealTier_addPoint (him.peek(), my t [i], peak);
 			}
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": not converted to AmplitudeTier.");
+		Melder_throw (me, U" & ", thee, U": not converted to AmplitudeTier.");
 	}
 }
 double AmplitudeTier_getShimmer_local (AmplitudeTier me, double pmin, double pmax, double maximumAmplitudeFactor) {
@@ -341,9 +341,9 @@ double AmplitudeTier_getShimmer_dda (AmplitudeTier me, double pmin, double pmax,
 	return NUMdefined (apq3) ? 3.0 * apq3 : NUMundefined;
 }
 
-Sound AmplitudeTier_to_Sound (AmplitudeTier me, double samplingFrequency, long interpolationDepth) {
+autoSound AmplitudeTier_to_Sound (AmplitudeTier me, double samplingFrequency, long interpolationDepth) {
 	try {
-		long sound_nt = 1 + floor ((my xmax - my xmin) * samplingFrequency);   /* >= 1 */
+		long sound_nt = 1 + (long) floor ((my xmax - my xmin) * samplingFrequency);   // >= 1
 		double dt = 1.0 / samplingFrequency;
 		double tmid = (my xmin + my xmax) / 2;
 		double t1 = tmid - 0.5 * (sound_nt - 1) * dt;
@@ -372,9 +372,9 @@ Sound AmplitudeTier_to_Sound (AmplitudeTier me, double samplingFrequency, long i
 				halfampsinangle = - halfampsinangle;
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
diff --git a/fon/AmplitudeTier.h b/fon/AmplitudeTier.h
index 9f30ddf..e6a8746 100644
--- a/fon/AmplitudeTier.h
+++ b/fon/AmplitudeTier.h
@@ -2,7 +2,7 @@
 #define _AmplitudeTier_h_
 /* AmplitudeTier.h
  *
- * Copyright (C) 2003-2011 Paul Boersma
+ * Copyright (C) 2003-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,25 +26,24 @@
 /********** class AmplitudeTier **********/
 
 Thing_define (AmplitudeTier, RealTier) {
-	// overridden methods:
-	protected:
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
 };
 
-AmplitudeTier AmplitudeTier_create (double tmin, double tmax);
+autoAmplitudeTier AmplitudeTier_create (double tmin, double tmax);
 
 void AmplitudeTier_draw (AmplitudeTier me, Graphics g, double tmin, double tmax,
-	double ymin, double ymax, const wchar_t *method, int garnish);
+	double ymin, double ymax, const char32 *method, int garnish);
 
-AmplitudeTier PointProcess_upto_AmplitudeTier (PointProcess me, double soundPressure);
-AmplitudeTier IntensityTier_to_AmplitudeTier (IntensityTier me);
-IntensityTier AmplitudeTier_to_IntensityTier (AmplitudeTier me, double threshold_dB);
-TableOfReal AmplitudeTier_downto_TableOfReal (AmplitudeTier me);
+autoAmplitudeTier PointProcess_upto_AmplitudeTier (PointProcess me, double soundPressure);
+autoAmplitudeTier IntensityTier_to_AmplitudeTier (IntensityTier me);
+autoIntensityTier AmplitudeTier_to_IntensityTier (AmplitudeTier me, double threshold_dB);
+autoTableOfReal AmplitudeTier_downto_TableOfReal (AmplitudeTier me);
 void Sound_AmplitudeTier_multiply_inline (Sound me, AmplitudeTier intensity);
-Sound Sound_AmplitudeTier_multiply (Sound me, AmplitudeTier intensity);
+autoSound Sound_AmplitudeTier_multiply (Sound me, AmplitudeTier intensity);
 
-AmplitudeTier PointProcess_Sound_to_AmplitudeTier_point (PointProcess me, Sound thee);
-AmplitudeTier PointProcess_Sound_to_AmplitudeTier_period (PointProcess me, Sound thee,
+autoAmplitudeTier PointProcess_Sound_to_AmplitudeTier_point (PointProcess me, Sound thee);
+autoAmplitudeTier PointProcess_Sound_to_AmplitudeTier_period (PointProcess me, Sound thee,
 	double tmin, double tmax, double shortestPeriod, double longestPeriod, double maximumPeriodFactor);
 double AmplitudeTier_getShimmer_local (AmplitudeTier me, double shortestPeriod, double longestPeriod, double maximumAmplitudeFactor);
 double AmplitudeTier_getShimmer_local_dB (AmplitudeTier me, double shortestPeriod, double longestPeriod, double maximumAmplitudeFactor);
@@ -53,7 +52,7 @@ double AmplitudeTier_getShimmer_apq5 (AmplitudeTier me, double shortestPeriod, d
 double AmplitudeTier_getShimmer_apq11 (AmplitudeTier me, double shortestPeriod, double longestPeriod, double maximumAmplitudeFactor);
 double AmplitudeTier_getShimmer_dda (AmplitudeTier me, double shortestPeriod, double longestPeriod, double maximumAmplitudeFactor);
 
-Sound AmplitudeTier_to_Sound (AmplitudeTier me, double samplingFrequency, long interpolationDepth);
+autoSound AmplitudeTier_to_Sound (AmplitudeTier me, double samplingFrequency, long interpolationDepth);
 
 /* End of file AmplitudeTier.h */
 #endif
diff --git a/fon/AmplitudeTierEditor.cpp b/fon/AmplitudeTierEditor.cpp
index 4f5972f..b9cde58 100644
--- a/fon/AmplitudeTierEditor.cpp
+++ b/fon/AmplitudeTierEditor.cpp
@@ -1,6 +1,6 @@
 /* AmplitudeTierEditor.cpp
  *
- * Copyright (C) 2003-2011,2012,2014 Paul Boersma
+ * Copyright (C) 2003-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,28 +22,28 @@
 
 Thing_implement (AmplitudeTierEditor, RealTierEditor, 0);
 
-static void menu_cb_AmplitudeTierHelp (EDITOR_ARGS) { EDITOR_IAM (AmplitudeTierEditor); Melder_help (L"AmplitudeTier"); }
+static void menu_cb_AmplitudeTierHelp (EDITOR_ARGS) { EDITOR_IAM (AmplitudeTierEditor); Melder_help (U"AmplitudeTier"); }
 
 void structAmplitudeTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	AmplitudeTierEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"AmplitudeTier help", 0, menu_cb_AmplitudeTierHelp);
+	EditorMenu_addCommand (menu, U"AmplitudeTier help", 0, menu_cb_AmplitudeTierHelp);
 }
 
 void structAmplitudeTierEditor :: v_play (double fromTime, double toTime) {
 	if (our d_sound.data) {
 		Sound_playPart (our d_sound.data, fromTime, toTime, theFunctionEditor_playCallback, this);
 	} else {
-		//AmplitudeTier_playPart (data, fromTime, toTime, FALSE);
+		//AmplitudeTier_playPart (data, fromTime, toTime, false);
 	}
 }
 
-AmplitudeTierEditor AmplitudeTierEditor_create (const wchar_t *title, AmplitudeTier amplitude, Sound sound, bool ownSound) {
+autoAmplitudeTierEditor AmplitudeTierEditor_create (const char32 *title, AmplitudeTier amplitude, Sound sound, bool ownSound) {
 	try {
 		autoAmplitudeTierEditor me = Thing_new (AmplitudeTierEditor);
 		RealTierEditor_init (me.peek(), title, (RealTier) amplitude, sound, ownSound);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("AmplitudeTier window not created.");
+		Melder_throw (U"AmplitudeTier window not created.");
 	}
 }
 
diff --git a/fon/AmplitudeTierEditor.h b/fon/AmplitudeTierEditor.h
index a92b2f0..8453a18 100644
--- a/fon/AmplitudeTierEditor.h
+++ b/fon/AmplitudeTierEditor.h
@@ -2,7 +2,7 @@
 #define _AmplitudeTierEditor_h_
 /* AmplitudeTierEditor.h
  *
- * Copyright (C) 2003-2011,2012,2014 Paul Boersma
+ * Copyright (C) 2003-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,28 +24,39 @@
 #include "Sound.h"
 
 Thing_define (AmplitudeTierEditor, RealTierEditor) {
-	// overridden methods:
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_play (double fromTime, double toTime);
-		virtual const wchar_t *
-			v_quantityText ()
-				{ return L"Sound pressure (Pa)"; }
-		virtual const wchar_t * v_quantityKey () { return L"Sound pressure"; }
-		virtual const wchar_t * v_rightTickUnits () { return L" Pa"; }
-		virtual double v_defaultYmin () { return -1.0; }
-		virtual double v_defaultYmax () { return +1.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set amplitude range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"-1.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"+1.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum amplitude (Pa)"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum amplitude (Pa)"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum amplitude"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum amplitude"; }
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_play (double fromTime, double toTime)
+		override;
+	const char32 * v_quantityText ()
+		override { return U"Sound pressure (Pa)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Sound pressure"; }
+	const char32 * v_rightTickUnits ()
+		override { return U" Pa"; }
+	double v_defaultYmin ()
+		override { return -1.0; }
+	double v_defaultYmax ()
+		override { return +1.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set amplitude range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"-1.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"+1.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum amplitude (Pa)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum amplitude (Pa)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum amplitude"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum amplitude"; }
 };
 
-AmplitudeTierEditor AmplitudeTierEditor_create (const wchar_t *title,
+autoAmplitudeTierEditor AmplitudeTierEditor_create (const char32 *title,
 	AmplitudeTier amplitude,
-	Sound sound,   // may be NULL
+	Sound sound,   // may be null
 	bool ownSound);
 
 /* End of file AmplitudeTierEditor.h */
diff --git a/fon/AnyTier.cpp b/fon/AnyTier.cpp
index 4273355..a7faa9f 100644
--- a/fon/AnyTier.cpp
+++ b/fon/AnyTier.cpp
@@ -1,6 +1,6 @@
 /* AnyTier.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -191,12 +191,12 @@ long AnyTier_hasPoint (I, double t) {
 	return 0;   /* Point not found. */
 }
 
-void AnyTier_addPoint (I, Data point) {
+void AnyTier_addPoint (I, Daata point) {
 	iam (AnyTier);
 	try {
 		Collection_addItem (my points, point);
 	} catch (MelderError) {
-		Melder_throw (me, ": point not added.");
+		Melder_throw (me, U": point not added.");
 	}
 }
 
@@ -232,7 +232,7 @@ PointProcess AnyTier_downto_PointProcess (I) {
 		thy nt = numberOfPoints;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to PointProcess.");
+		Melder_throw (me, U": not converted to PointProcess.");
 	}
 }
 
diff --git a/fon/AnyTier.h b/fon/AnyTier.h
index 3ab2feb..b1fa6c7 100644
--- a/fon/AnyTier.h
+++ b/fon/AnyTier.h
@@ -2,7 +2,7 @@
 #define _AnyTier_h_
 /* AnyTier.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@ long AnyTier_timeToHighIndex (I, double time);
 long AnyTier_getWindowPoints (I, double tmin, double tmax, long *imin, long *imax);
 long AnyTier_timeToNearestIndex (I, double time);
 long AnyTier_hasPoint (I, double t);
-void AnyTier_addPoint (I, Data point);
+void AnyTier_addPoint (I, Daata point);
 void AnyTier_removePoint (I, long i);
 void AnyTier_removePointNear (I, double time);
 void AnyTier_removePointsBetween (I, double tmin, double tmax);
diff --git a/fon/AnyTier_def.h b/fon/AnyTier_def.h
index 032695e..1b37125 100644
--- a/fon/AnyTier_def.h
+++ b/fon/AnyTier_def.h
@@ -1,6 +1,6 @@
 /* AnyTier_def.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,10 +31,10 @@ oo_DEFINE_CLASS (AnyTier, Function)
 	oo_COLLECTION (SortedSetOfDouble, points, AnyPoint, 0)
 
 	#if oo_DECLARING
-		// overridden methods:
-		protected:
-			virtual void v_shiftX (double xfrom, double xto);
-			virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
 	#endif
 
 oo_END_CLASS (AnyTier)
diff --git a/fon/Cochleagram.cpp b/fon/Cochleagram.cpp
index 559709c..43d0950 100644
--- a/fon/Cochleagram.cpp
+++ b/fon/Cochleagram.cpp
@@ -1,6 +1,6 @@
 /* Cochleagram.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,19 +22,19 @@
 
 Thing_implement (Cochleagram, Matrix, 2);
 
-Cochleagram Cochleagram_create (double tmin, double tmax, long nt, double dt, double t1, double df, long nf) {
+autoCochleagram Cochleagram_create (double tmin, double tmax, long nt, double dt, double t1, double df, long nf) {
 	try {
 		autoCochleagram me = Thing_new (Cochleagram);
 		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, 0.0, nf * df, nf, df, 0.5 * df);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Cochleagram with ", nt, " times and ", nf, " frequencies not created.");
+		Melder_throw (U"Cochleagram with ", nt, U" times and ", nf, U" frequencies not created.");
 	}
 }
 
 void Cochleagram_paint (Cochleagram me, Graphics g, double tmin, double tmax, int garnish) {
-	static double border [1 + 12] =
-		{ 0, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80 };
+	static double border [1 + 12]
+		{ 0.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 55.0, 60.0, 65.0, 70.0, 75.0, 80.0 };
 	try {
 		autoCochleagram copy = Data_copy (me);
 		if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; }
@@ -45,12 +45,12 @@ void Cochleagram_paint (Cochleagram me, Graphics g, double tmin, double tmax, in
 				if (my z [iy] [ix] > my z [iy - 1] [ix] &&
 					my z [iy] [ix] > my z [iy + 1] [ix])
 				{
-					copy -> z [iy - 1] [ix] += 10;
-					copy -> z [iy] [ix] += 10;
-					copy -> z [iy + 1] [ix] += 10;
+					copy -> z [iy - 1] [ix] += 10.0;
+					copy -> z [iy] [ix] += 10.0;
+					copy -> z [iy + 1] [ix] += 10.0;
 				}
 		Graphics_setInner (g);
-		Graphics_setWindow (g, tmin, tmax, 0, my ny * my dy);
+		Graphics_setWindow (g, tmin, tmax, 0.0, my ny * my dy);
 		Graphics_grey (g, copy -> z,
 			itmin, itmax, Matrix_columnToX (me, itmin), Matrix_columnToX (me, itmax),
 			1, my ny, 0.5 * my dy, (my ny - 0.5) * my dy,
@@ -58,27 +58,27 @@ void Cochleagram_paint (Cochleagram me, Graphics g, double tmin, double tmax, in
 		Graphics_unsetInner (g);
 		if (garnish) {
 			Graphics_drawInnerBox (g);
-			Graphics_textBottom (g, 1, L"Time (s)");
-			Graphics_marksBottom (g, 2, 1, 1, 0);
-			Graphics_textLeft (g, 1, L"Place (Bark)");
-			Graphics_marksLeftEvery (g, 1.0, 5.0, 1, 1, 0);
+			Graphics_textBottom (g, true, U"Time (s)");
+			Graphics_marksBottom (g, 2, true, true, false);
+			Graphics_textLeft (g, true, U"Place (Bark)");
+			Graphics_marksLeftEvery (g, 1.0, 5.0, true, true, false);
 		}
 	} catch (MelderError) {
-		Melder_clearError ();   // BUG
+		Melder_clearError ();
 	}
 }
 
 double Cochleagram_difference (Cochleagram me, Cochleagram thee, double tmin, double tmax) {
 	try {
 		if (my nx != thy nx || my dx != thy dx || my x1 != thy x1)
-			Melder_throw (L"Unequal time samplings.");
+			Melder_throw (U"Unequal time samplings.");
 		if (my ny != thy ny)
-			Melder_throw (L"Unequal numbers of frequencies.");
+			Melder_throw (U"Unequal numbers of frequencies.");
 		if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; }
 		long itmin, itmax;
 		long nt = Matrix_getWindowSamplesX (me, tmin, tmax, & itmin, & itmax);
 		if (nt == 0)
-			Melder_throw ("Window too short.");
+			Melder_throw (U"Window too short.");
 		double diff = 0.0;
 		for (long itime = itmin; itime <= itmax; itime ++) {
 			for (long ifreq = 1; ifreq <= my ny; ifreq ++) {
@@ -89,27 +89,27 @@ double Cochleagram_difference (Cochleagram me, Cochleagram thee, double tmin, do
 		diff /= nt * my ny;
 		return sqrt (diff);
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": difference not computed.");
+		Melder_throw (me, U" & ", thee, U": difference not computed.");
 	}
 }
 
-Cochleagram Matrix_to_Cochleagram (Matrix me) {
+autoCochleagram Matrix_to_Cochleagram (Matrix me) {
 	try {
 		autoCochleagram thee = Cochleagram_create (my xmin, my xmax, my nx, my dx, my x1, my dy, my ny);
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Cochleagram.");
+		Melder_throw (me, U": not converted to Cochleagram.");
 	}
 }
 
-Matrix Cochleagram_to_Matrix (Cochleagram me) {
+autoMatrix Cochleagram_to_Matrix (Cochleagram me) {
 	try {
 		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1);
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
diff --git a/fon/Cochleagram.h b/fon/Cochleagram.h
index d401d4c..8164c1a 100644
--- a/fon/Cochleagram.h
+++ b/fon/Cochleagram.h
@@ -2,7 +2,7 @@
 #define _Cochleagram_h_
 /* Cochleagram.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,9 +22,8 @@
 #include "Matrix.h"
 
 Thing_define (Cochleagram, Matrix) {
-	// overridden methods:
-	protected:
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
 };
 
 /* Normally, the attributes will meet the following:
@@ -41,11 +40,11 @@ Thing_define (Cochleagram, Matrix) {
 	z;				// Basilar filter output (milliVolt), or firing rate (Hz), or intensity (phon).
 */
 
-Cochleagram Cochleagram_create (double tmin, double tmax, long nt, double dt, double t1,
+autoCochleagram Cochleagram_create (double tmin, double tmax, long nt, double dt, double t1,
 	double df, long nf);
 /*
 	Function:
-		return a new instance of Cochleagram, or NULL if out of memory.
+		return a new instance of Cochleagram.
 	Preconditions:
 		dt > 0.0;						df > 0.0;
 		nt >= 1;						nf >= 1;
@@ -62,20 +61,20 @@ void Cochleagram_paint (Cochleagram me, Graphics g, double tmin, double tmax, in
 
 double Cochleagram_difference (Cochleagram me, Cochleagram thee, double tmin, double tmax);
 
-Cochleagram Matrix_to_Cochleagram (Matrix me);
+autoCochleagram Matrix_to_Cochleagram (Matrix me);
 /*
 	Function:
 		create a Cochleagram from a Matrix,
 		with deep copy of all its attributes, except class information and methods.
-	Return NULL if out of memory.  
+	Fail if out of memory.
 */
 
-Matrix Cochleagram_to_Matrix (Cochleagram me);
+autoMatrix Cochleagram_to_Matrix (Cochleagram me);
 /*
 	Function:
 		create a Matrix from a Cochleagram,
 		with deep copy of all its attributes, except class information and methods.
-	Return NULL if out of memory.  
+	Fail if out of memory.
 */
 
 /* End of file Cochleagram.h */
diff --git a/fon/Cochleagram_and_Excitation.cpp b/fon/Cochleagram_and_Excitation.cpp
index adcde73..1c7a4fc 100644
--- a/fon/Cochleagram_and_Excitation.cpp
+++ b/fon/Cochleagram_and_Excitation.cpp
@@ -1,6 +1,6 @@
 /* Cochleagram_and_Excitation.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 
 #include "Cochleagram_and_Excitation.h"
 
-Excitation Cochleagram_to_Excitation (Cochleagram me, double t) {
+autoExcitation Cochleagram_to_Excitation (Cochleagram me, double t) {
 	try {
 		long column = Matrix_xToNearestColumn (me, t);
 		if (column < 1) column = 1;
@@ -34,9 +34,9 @@ Excitation Cochleagram_to_Excitation (Cochleagram me, double t) {
 		autoExcitation thee = Excitation_create (my dy, my ny);
 		for (long ifreq = 1; ifreq <= my ny; ifreq ++)
 			thy z [1] [ifreq] = my z [ifreq] [column];
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": slice at time ", t, " seconds not extracted to Excitation.");
+		Melder_throw (me, U": slice at time ", t, U" seconds not extracted to Excitation.");
 	}
 }
 
diff --git a/fon/Cochleagram_and_Excitation.h b/fon/Cochleagram_and_Excitation.h
index 13f276e..c384c7c 100644
--- a/fon/Cochleagram_and_Excitation.h
+++ b/fon/Cochleagram_and_Excitation.h
@@ -1,6 +1,6 @@
 /* Cochleagram_and_Excitation.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,6 +20,6 @@
 #include "Cochleagram.h"
 #include "Excitation.h"
 
-Excitation Cochleagram_to_Excitation (Cochleagram me, double t);
+autoExcitation Cochleagram_to_Excitation (Cochleagram me, double t);
 
 /* End of file Cochleagram_and_Excitation.h */
diff --git a/fon/Distributions_and_Transition.cpp b/fon/Distributions_and_Transition.cpp
index 83a6a12..d3ac49f 100644
--- a/fon/Distributions_and_Transition.cpp
+++ b/fon/Distributions_and_Transition.cpp
@@ -1,6 +1,6 @@
 /* Distributions_and_Transition.cpp
  *
- * Copyright (C) 1997-2011 Paul Boersma
+ * Copyright (C) 1997-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,33 +20,33 @@
 /*
  * pb 1997/03/02 created
  * pb 2002/07/16 GPL
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2011/05/09 C++
  */
 
 #include "Distributions_and_Transition.h"
 
-Transition Distributions_to_Transition (Distributions underlying, Distributions surface, long environment,
+autoTransition Distributions_to_Transition (Distributions underlying, Distributions surface, long environment,
 	Transition adjacency, int greedy)
 {
 	try {
-		if (underlying == NULL) return NULL;
+		if (! underlying) return nullptr;
 
 		/*
 		 * Preconditions: range check and matrix matching.
 		 */
 		if (environment < 1 || environment > underlying -> numberOfColumns)
-			Melder_throw ("Environment (", environment, ") out of range (1-", underlying -> numberOfColumns, ").");
+			Melder_throw (U"Environment (", environment, U") out of range (1-", underlying -> numberOfColumns, U").");
 		if (surface && (underlying -> numberOfColumns != surface -> numberOfColumns || underlying -> numberOfRows != surface -> numberOfRows))
-			Melder_throw ("Sizes of underlying and surface distributions do not match.");
+			Melder_throw (U"Sizes of underlying and surface distributions do not match.");
 		if (adjacency && adjacency -> numberOfStates != underlying -> numberOfColumns)
-			Melder_throw ("Number of states (", adjacency -> numberOfStates, ") in adjacency matrix "
-				"does not match number of distributions (", underlying -> numberOfColumns, ")");
+			Melder_throw (U"Number of states (", adjacency -> numberOfStates, U") in adjacency matrix "
+				U"does not match number of distributions (", underlying -> numberOfColumns, U")");
 
 		/*
 		 * Defaults.
 		 */
-		if (surface == NULL) surface = underlying;
+		if (! surface) surface = underlying;
 
 		/*
 		 * Create the output object.
@@ -57,7 +57,7 @@ Transition Distributions_to_Transition (Distributions underlying, Distributions
 		 * Copy labels and set name.
 		 */
 		for (long i = 1; i <= thy numberOfStates; i ++) {
-			thy stateLabels [i] = Melder_wcsdup (underlying -> columnLabels [i]);
+			thy stateLabels [i] = Melder_dup (underlying -> columnLabels [i]);
 		}
 		Thing_setName (thee.peek(), underlying -> columnLabels [environment]);
 
@@ -73,7 +73,7 @@ Transition Distributions_to_Transition (Distributions underlying, Distributions
 			if (adjacency) {
 				numberOfAdjacentStates = 0;
 				for (long j = 1; j <= thy numberOfStates; j ++)
-					if (i != j && adjacency -> data [i] [j])
+					if (i != j && adjacency -> data [i] [j] != 0.0)
 						numberOfAdjacentStates ++;
 			} else {
 				numberOfAdjacentStates = thy numberOfStates - 1;
@@ -98,7 +98,7 @@ Transition Distributions_to_Transition (Distributions underlying, Distributions
 					 * Error-driven: grammar step only triggered by positive evidence.
 					 * If the datum does not conflict with the current hypothesis (i), ignore it.
 					 */
-					if (underlying -> data [m] [i]) continue;
+					if (underlying -> data [m] [i] != 0.0) continue;
 
 					/*
 					 * Greedy: grammar step only taken if new grammar accepts datum.
@@ -123,20 +123,20 @@ Transition Distributions_to_Transition (Distributions underlying, Distributions
 			thy data [i] [i] = sum > 1.0 ? 0.0 : 1.0 - sum;   // guard against rounding errors
 		}
 
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (underlying, ": Transition not computed.");
+		Melder_throw (underlying, U": Transition not computed.");
 	}
 }
 
-Distributions Distributions_Transition_map (Distributions me, Transition map) {
+autoDistributions Distributions_Transition_map (Distributions me, Transition map) {
 	try {
 		/*
 		 * Preconditions: matrix matching.
 		 */
 		if (map -> numberOfStates != my numberOfRows)
-			Melder_throw ("Number of data (", map -> numberOfStates, ") in mapping matrix "
-				"does not match number of data (", my numberOfRows, ") in distribution.");
+			Melder_throw (U"Number of data (", map -> numberOfStates, U") in mapping matrix "
+				U"does not match number of data (", my numberOfRows, U") in distribution.");
 
 		/*
 		 * Create the output object.
@@ -152,13 +152,13 @@ Distributions Distributions_Transition_map (Distributions me, Transition map) {
 				thy data [row] [col] += my data [m] [col] * map -> data [m] [row];
 		}
 
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not mapped to Transition.");
+		Melder_throw (me, U": not mapped to Transition.");
 	}
 }
 
-Distributions Transition_to_Distributions_conflate (Transition me) {
+autoDistributions Transition_to_Distributions_conflate (Transition me) {
 	try {
 		autoDistributions thee = Distributions_create (my numberOfStates, 1);
 
@@ -166,7 +166,7 @@ Distributions Transition_to_Distributions_conflate (Transition me) {
 		 * Copy labels.
 		 */
 		for (long i = 1; i <= my numberOfStates; i ++) {
-			thy rowLabels [i] = Melder_wcsdup (my stateLabels [i]);
+			thy rowLabels [i] = Melder_dup (my stateLabels [i]);
 		}
 
 		/*
@@ -178,9 +178,9 @@ Distributions Transition_to_Distributions_conflate (Transition me) {
 			thy data [i] [1] /= my numberOfStates;
 		}
 
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not conflated to Distributions.");
+		Melder_throw (me, U": not conflated to Distributions.");
 	}
 }
 
diff --git a/fon/Distributions_and_Transition.h b/fon/Distributions_and_Transition.h
index 4d0c4b0..e0a73f6 100644
--- a/fon/Distributions_and_Transition.h
+++ b/fon/Distributions_and_Transition.h
@@ -1,6 +1,6 @@
 /* Distributions_and_Transition.h
  *
- * Copyright (C) 1997-2011 Paul Boersma
+ * Copyright (C) 1997-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,11 +20,11 @@
 #include "Distributions.h"
 #include "Transition.h"
 
-Transition Distributions_to_Transition (Distributions underlying, Distributions surface,
+autoTransition Distributions_to_Transition (Distributions underlying, Distributions surface,
 	long environment, Transition adjacency, int greedy);
 
-Distributions Distributions_Transition_map (Distributions me, Transition map);
+autoDistributions Distributions_Transition_map (Distributions me, Transition map);
 
-Distributions Transition_to_Distributions_conflate (Transition me);
+autoDistributions Transition_to_Distributions_conflate (Transition me);
 
 /* End of file Distributions_and_Transition.h */
diff --git a/fon/DurationTier.cpp b/fon/DurationTier.cpp
index 42ea586..fb5cef9 100644
--- a/fon/DurationTier.cpp
+++ b/fon/DurationTier.cpp
@@ -1,6 +1,6 @@
 /* DurationTier.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,41 +22,41 @@
 Thing_implement (DurationTier, RealTier, 0);
 
 void structDurationTier :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total original duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"Number of points: ", Melder_integer (points -> size));
-	MelderInfo_writeLine (L"Minimum relative duration value: ", Melder_double (RealTier_getMinimumValue (this)));
-	MelderInfo_writeLine (L"Maximum relative duration value: ", Melder_double (RealTier_getMaximumValue (this)));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total original duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"Number of points: ", points -> size);
+	MelderInfo_writeLine (U"Minimum relative duration value: ", RealTier_getMinimumValue (this));
+	MelderInfo_writeLine (U"Maximum relative duration value: ", RealTier_getMaximumValue (this));
 }
 
-DurationTier DurationTier_create (double tmin, double tmax) {
+autoDurationTier DurationTier_create (double tmin, double tmax) {
 	try {
 		autoDurationTier me = Thing_new (DurationTier);
 		RealTier_init (me.peek(), tmin, tmax);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("DurationTier not created.");
+		Melder_throw (U"DurationTier not created.");
 	}
 }
 
 void DurationTier_draw (DurationTier me, Graphics g, double tmin, double tmax,
-	double ymin, double ymax, const wchar_t *method, int garnish)
+	double ymin, double ymax, const char32 *method, int garnish)
 {
-	RealTier_draw (me, g, tmin, tmax, ymin, ymax, garnish, method, L"Relative duration");
+	RealTier_draw (me, g, tmin, tmax, ymin, ymax, garnish, method, U"Relative duration");
 }
 
-DurationTier PointProcess_upto_DurationTier (PointProcess me) {
+autoDurationTier PointProcess_upto_DurationTier (PointProcess me) {
 	try {
 		autoDurationTier thee = DurationTier_create (my xmin, my xmax);
 		for (long i = 1; i <= my nt; i ++) {
 			RealTier_addPoint (thee.peek(), my t [i], 1.0);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to DurationTier.");
+		Melder_throw (me, U": not converted to DurationTier.");
 	}
 }
 
diff --git a/fon/DurationTier.h b/fon/DurationTier.h
index c4a412e..6dd113e 100644
--- a/fon/DurationTier.h
+++ b/fon/DurationTier.h
@@ -2,7 +2,7 @@
 #define _DurationTier_h_
 /* DurationTier.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,18 +25,18 @@
 /********** class DurationTier **********/
 
 Thing_define (DurationTier, RealTier) {
-	// overridden methods:
-	protected:
-		virtual void v_info ();
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
+	void v_info ()
+		override;
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
 };
 
-DurationTier DurationTier_create (double tmin, double tmax);
+autoDurationTier DurationTier_create (double tmin, double tmax);
 
 void DurationTier_draw (DurationTier me, Graphics g, double tmin, double tmax,
-	double ymin, double ymax, const wchar_t *method, int garnish);
+	double ymin, double ymax, const char32 *method, int garnish);
 
-DurationTier PointProcess_upto_DurationTier (PointProcess me);
+autoDurationTier PointProcess_upto_DurationTier (PointProcess me);
 
 /* End of file DurationTier.h */
 #endif
diff --git a/fon/DurationTierEditor.cpp b/fon/DurationTierEditor.cpp
index 930de11..1f31fe5 100644
--- a/fon/DurationTierEditor.cpp
+++ b/fon/DurationTierEditor.cpp
@@ -1,6 +1,6 @@
 /* DurationTierEditor.cpp
  *
- * Copyright (C) 1992-2011,2012,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,28 +22,28 @@
 
 Thing_implement (DurationTierEditor, RealTierEditor, 0);
 
-static void menu_cb_DurationTierHelp (EDITOR_ARGS) { EDITOR_IAM (DurationTierEditor); Melder_help (L"DurationTier"); }
+static void menu_cb_DurationTierHelp (EDITOR_ARGS) { EDITOR_IAM (DurationTierEditor); Melder_help (U"DurationTier"); }
 
 void structDurationTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	DurationTierEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"DurationTier help", 0, menu_cb_DurationTierHelp);
+	EditorMenu_addCommand (menu, U"DurationTier help", 0, menu_cb_DurationTierHelp);
 }
 
 void structDurationTierEditor :: v_play (double fromTime, double toTime) {
 	if (our d_sound.data) {
-		Sound_playPart (our d_sound.data, fromTime, toTime, NULL, NULL);
+		Sound_playPart (our d_sound.data, fromTime, toTime, nullptr, nullptr);
 	} else {
-		//DurationTier_playPart (data, fromTime, toTime, FALSE);
+		//DurationTier_playPart (data, fromTime, toTime, false);
 	}
 }
 
-DurationTierEditor DurationTierEditor_create (const wchar_t *title, DurationTier duration, Sound sound, bool ownSound) {
+autoDurationTierEditor DurationTierEditor_create (const char32 *title, DurationTier duration, Sound sound, bool ownSound) {
 	try {
 		autoDurationTierEditor me = Thing_new (DurationTierEditor);
 		RealTierEditor_init (me.peek(), title, (RealTier) duration, sound, ownSound);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("DurationTier window not created.");
+		Melder_throw (U"DurationTier window not created.");
 	}
 }
 
diff --git a/fon/DurationTierEditor.h b/fon/DurationTierEditor.h
index a482d78..cf216a2 100644
--- a/fon/DurationTierEditor.h
+++ b/fon/DurationTierEditor.h
@@ -2,7 +2,7 @@
 #define _DurationTierEditor_h_
 /* DurationTierEditor.h
  *
- * Copyright (C) 1992-2011,2012,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,28 +24,42 @@
 #include "Sound.h"
 
 Thing_define (DurationTierEditor, RealTierEditor) {
-	// overridden methods:
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_play (double fromTime, double toTime);
-		virtual double v_minimumLegalValue () { return 0.0; }
-		virtual const wchar_t * v_quantityText () { return L"Relative duration"; }
-		virtual const wchar_t * v_quantityKey () { return L"Relative duration"; }
-		virtual const wchar_t * v_rightTickUnits () { return L""; }
-		virtual double v_defaultYmin () { return 0.25; }
-		virtual double v_defaultYmax () { return 3.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set duration range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"0.25"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"3.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum duration"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum duration"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum duration"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum duration"; }
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_play (double fromTime, double toTime)
+		override;
+	double v_minimumLegalValue ()
+		override { return 0.0; }
+	const char32 * v_quantityText ()
+		override { return U"Relative duration"; }
+	const char32 * v_quantityKey ()
+		override { return U"Relative duration"; }
+	const char32 * v_rightTickUnits ()
+		override { return U""; }
+	double v_defaultYmin ()
+		override { return 0.25; }
+	double v_defaultYmax ()
+		override { return 3.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set duration range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"0.25"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"3.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum duration"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum duration"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum duration"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum duration"; }
 };
 
-DurationTierEditor DurationTierEditor_create (const wchar_t *title,
+autoDurationTierEditor DurationTierEditor_create (const char32 *title,
 	DurationTier duration, Sound sound, bool ownSound);
 /*
-	'sound' may be NULL.
+	'sound' may be null.
 */
 
 /* End of file DurationTierEditor.h */
diff --git a/fon/Excitation.cpp b/fon/Excitation.cpp
index c8ce1a1..788b75b 100644
--- a/fon/Excitation.cpp
+++ b/fon/Excitation.cpp
@@ -1,6 +1,6 @@
 /* Excitation.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@ Thing_implement (Excitation, Vector, 2);
 
 double Excitation_hertzToBark (double hertz) {
 	double h650 = hertz / 650;
-	return 7.0 * log (h650 + sqrt (1 + h650 * h650));
+	return 7.0 * log (h650 + sqrt (1.0 + h650 * h650));
 }
 
 double Excitation_barkToHertz (double bark) {
@@ -31,11 +31,11 @@ double Excitation_barkToHertz (double bark) {
 }
 
 double Excitation_phonToDifferenceLimens (double phon) {
-	return 30 * (pow (61.0 / 60, phon) - 1);
+	return 30.0 * (pow (61.0 / 60.0, phon) - 1);
 }
 
 double Excitation_differenceLimensToPhon (double ndli) {
-	return log (1 + ndli / 30) / log (61.0 / 60);
+	return log (1 + ndli / 30.0) / log (61.0 / 60.0);
 }
 
 double Excitation_soundPressureToPhon (double soundPressure, double bark) {
@@ -44,44 +44,44 @@ double Excitation_soundPressureToPhon (double soundPressure, double bark) {
 	if (soundPressure <= 0.0) return 0.0;
 
 	/*  dB = 20 * log10 (soundPressure / threshold)  */
-	result = 20 * log10 (soundPressure / 2.0e-5);   /* First approximation: phon = dB */
+	result = 20.0 * log10 (soundPressure / 2.0e-5);   /* First approximation: phon = dB */
 
 	/*  Phones from dB  */
-	if (result < 90 && bark < 8.0)
+	if (result < 90.0 && bark < 8.0)
 	{
-		dum = (90 - result) * (8.0 - bark);
+		dum = (90.0 - result) * (8.0 - bark);
 		result -= dum * dum / 2500;
 	}
-	dum = bark / 3.6 - 5;
-	result += 5 * exp (- dum * dum);
-	if (bark > 20.0) { dum = bark - 20; result -= 0.5 * dum * dum; }
-	if (result < 0) result = 0;
+	dum = bark / 3.6 - 5.0;
+	result += 5.0 * exp (- dum * dum);
+	if (bark > 20.0) { dum = bark - 20.0; result -= 0.5 * dum * dum; }
+	if (result < 0.0) result = 0.0;
 	return result;
 }
 
 void structExcitation :: v_info () {
 	double *y = z [1];
 	long numberOfMaxima = 0;
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Loudness: ", Melder_half (Excitation_getLoudness (this)), L" sones");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Loudness: ", Melder_half (Excitation_getLoudness (this)), U" sones");
 	for (long i = 2; i < nx; i ++) if (y [i] > y [i - 1] && y [i] >= y [i + 1]) {
-		double i_real, formant_bark, strength;
 		if (++ numberOfMaxima > 15) break;
-		strength = NUMimproveMaximum (z [1], nx, i, NUM_PEAK_INTERPOLATE_SINC70, & i_real);
-		formant_bark = x1 + (i_real - 1) * dx;
-		MelderInfo_write (L"Peak at ", Melder_single (formant_bark), L" Bark");
-		MelderInfo_write (L", ", Melder_integer ((long) NUMbarkToHertz (formant_bark)), L" Hz");
-		MelderInfo_writeLine (L", ", Melder_half (strength), L" phon.");
+		double i_real;
+		double strength = NUMimproveMaximum (z [1], nx, i, NUM_PEAK_INTERPOLATE_SINC70, & i_real);
+		double formant_bark = x1 + (i_real - 1.0) * dx;
+		MelderInfo_write (U"Peak at ", Melder_single (formant_bark), U" Bark");
+		MelderInfo_write (U", ", (long) NUMbarkToHertz (formant_bark), U" Hz");
+		MelderInfo_writeLine (U", ", Melder_half (strength), U" phon.");
 	}
 }
 
-Excitation Excitation_create (double df, long nf) {
+autoExcitation Excitation_create (double df, long nf) {
 	try {
 		autoExcitation me = Thing_new (Excitation);
-		Matrix_init (me.peek(), 0.0, nf * df, nf, df, 0.5 * df, 1, 1, 1, 1, 1);
-		return me.transfer();
+		Matrix_init (me.peek(), 0.0, nf * df, nf, df, 0.5 * df, 1.0, 1.0, 1, 1.0, 1.0);
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Excitation not created.");
+		Melder_throw (U"Excitation not created.");
 	}
 }
 
@@ -103,7 +103,7 @@ double Excitation_getLoudness (Excitation me) {
 	double loudness = 0.0;
 	for (int i = 1; i <= my nx; i ++)
 		/*  Sones = 2 ** ((Phones - 40) / 10)  */
-		loudness += pow (2, (my z [1] [i] - 40) / 10);
+		loudness += pow (2.0, (my z [1] [i] - 40.0) / 10.0);
 	return my dx * loudness;
 }
 
@@ -115,7 +115,7 @@ void Excitation_draw (Excitation me, Graphics g,
 	Matrix_getWindowSamplesX (me, fmin, fmax, & ifmin, & ifmax);
 	if (maximum <= minimum)
 		Matrix_getWindowExtrema (me, ifmin, ifmax, 1, 1, & minimum, & maximum);
-	if (maximum <= minimum) { minimum -= 20; maximum += 20; }
+	if (maximum <= minimum) { minimum -= 20.0; maximum += 20.0; }
 	Graphics_setInner (g);
 	Graphics_setWindow (g, fmin, fmax, minimum, maximum);
 	Graphics_function (g, my z [1], ifmin, ifmax,
@@ -123,30 +123,30 @@ void Excitation_draw (Excitation me, Graphics g,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Frequency (Bark)");
-		Graphics_textLeft (g, 1, L"Excitation (phon)");
-		Graphics_marksBottomEvery (g, 1, 5, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1, 20, 1, 1, 0);
+		Graphics_textBottom (g, true, U"Frequency (Bark)");
+		Graphics_textLeft (g, true, U"Excitation (phon)");
+		Graphics_marksBottomEvery (g, 1.0, 5.0, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, 20.0, true, true, false);
 	}
 }
 
-Matrix Excitation_to_Matrix (Excitation me) {
+autoMatrix Excitation_to_Matrix (Excitation me) {
 	try {
 		autoMatrix thee = Thing_new (Matrix);
 		my structMatrix :: v_copy (thee.peek());   // BUG: safe, but compiler should be able to check
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
-Excitation Matrix_to_Excitation (Matrix me) {
+autoExcitation Matrix_to_Excitation (Matrix me) {
 	try {
 		autoExcitation thee = Thing_new (Excitation);
 		my structMatrix :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Excitation.");
+		Melder_throw (me, U": not converted to Excitation.");
 	}
 }
 
diff --git a/fon/Excitation.h b/fon/Excitation.h
index d043617..f551858 100644
--- a/fon/Excitation.h
+++ b/fon/Excitation.h
@@ -2,7 +2,7 @@
 #define _Excitation_h_
 /* Excitation.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,10 +23,10 @@
 #include "Graphics.h"
 
 Thing_define (Excitation, Vector) {
-	// overridden methods:
-	protected:
-		virtual void v_info ();
-		virtual int v_domainQuantity () { return MelderQuantity_FREQUENCY_BARK; }
+	void v_info ()
+		override;
+	int v_domainQuantity ()
+		override { return MelderQuantity_FREQUENCY_BARK; }
 };
 
 double Excitation_hertzToBark (double hertz);
@@ -35,12 +35,12 @@ double Excitation_phonToDifferenceLimens (double phon);
 double Excitation_differenceLimensToPhon (double ndli);
 double Excitation_soundPressureToPhon (double soundPressure, double bark);
 
-Excitation Excitation_create (double df, long nf);
+autoExcitation Excitation_create (double df, long nf);
 double Excitation_getDistance (Excitation me, Excitation thee);
 double Excitation_getLoudness (Excitation me);
 void Excitation_draw (Excitation me, Graphics g, double fmin, double fmax, double minimum, double maximum, int garnish);
-Matrix Excitation_to_Matrix (Excitation me);
-Excitation Matrix_to_Excitation (Matrix me);
+autoMatrix Excitation_to_Matrix (Excitation me);
+autoExcitation Matrix_to_Excitation (Matrix me);
 
 /* End of file Excitation.h */
 #endif
diff --git a/fon/Excitation_to_Formant.cpp b/fon/Excitation_to_Formant.cpp
index 6a1deba..2070283 100644
--- a/fon/Excitation_to_Formant.cpp
+++ b/fon/Excitation_to_Formant.cpp
@@ -1,6 +1,6 @@
 /* Excitation_to_Formant.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 
 #include "Excitation_to_Formant.h"
 
-Formant Excitation_to_Formant (Excitation me, int maxnFormants) {
+autoFormant Excitation_to_Formant (Excitation me, int maxnFormants) {
 	try {
 		long nfreq = my nx, nform = 0;
 		double *p = my z [1];
@@ -54,9 +54,9 @@ Formant Excitation_to_Formant (Excitation me, int maxnFormants) {
 				if (nform == thy maxnFormants) break;
 			}
 		thy d_frames [1]. nFormants = nform;
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Formant.");
+		Melder_throw (me, U": not converted to Formant.");
 	}
 }
 
diff --git a/fon/Excitation_to_Formant.h b/fon/Excitation_to_Formant.h
index 3430d1d..d7c5348 100644
--- a/fon/Excitation_to_Formant.h
+++ b/fon/Excitation_to_Formant.h
@@ -1,6 +1,6 @@
 /* Excitation_to_Formant.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,6 +20,6 @@
 #include "Excitation.h"
 #include "Formant.h"
 
-Formant Excitation_to_Formant (Excitation, int maxnFormants);
+autoFormant Excitation_to_Formant (Excitation, int maxnFormants);
 
 /* End of file Excitation_to_Formant.h */
diff --git a/fon/ExperimentMFC.cpp b/fon/ExperimentMFC.cpp
index bae267d..e7a04de 100644
--- a/fon/ExperimentMFC.cpp
+++ b/fon/ExperimentMFC.cpp
@@ -29,7 +29,7 @@
  * pb 2005/12/02 response sounds are read
  * pb 2006/10/28 erased MacOS 9 stuff
  * pb 2006/12/20 stereo
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2007/09/26 added font size; version 5
  * pb 2007/10/01 can write as encoding
  * pb 2008/04/08 in ExtractResults, check that a resonse was given
@@ -63,28 +63,29 @@
 #include "oo_DESCRIPTION.h"
 #include "ExperimentMFC_def.h"
 
-Thing_implement (ExperimentMFC, Data, 6);
+Thing_implement (ExperimentMFC, Daata, 6);
 
 #include "enums_getText.h"
 #include "Experiment_enums.h"
 #include "enums_getValue.h"
 #include "Experiment_enums.h"
 
-static void readSound (ExperimentMFC me, const wchar_t *fileNameHead, const wchar_t *fileNameTail,
-	double medialSilenceDuration, wchar_t **name, Sound *sound)
+static void readSound (ExperimentMFC me, const char32 *fileNameHead, const char32 *fileNameTail,
+	double medialSilenceDuration, char32 **name, Sound *sound)
 {
-	wchar_t fileNameBuffer [256], pathName [256], *fileNames = & fileNameBuffer [0];
+	char32 fileNameBuffer [256], *fileNames = & fileNameBuffer [0];
+	Melder_sprint (fileNameBuffer,256, *name);
 	structMelderFile file = { 0 };
-	wcscpy (fileNameBuffer, *name);
 	/*
 	 * The following conversion is needed when fileNameHead is an absolute path,
 	 * and the stimulus names contain slashes for relative paths.
 	 * An ugly case, but allowed.
 	 */
 	#if defined (_WIN32)
-		for (;;) { wchar_t *slash = wcschr (fileNames, '/'); if (! slash) break; *slash = '\\'; }
+		for (;;) { char32 *slash = str32chr (fileNames, U'/'); if (! slash) break; *slash = U'\\'; }
 	#endif
 	forget (*sound);
+	char32 pathName [kMelder_MAXPATH+1];
 	/*
 	 * 'fileNames' can contain commas, which separate partial file names.
 	 * The separate files should be concatenated.
@@ -93,12 +94,12 @@ static void readSound (ExperimentMFC me, const wchar_t *fileNameHead, const wcha
 		/*
 		 * Determine partial file name.
 		 */
-		wchar_t *comma = wcschr (fileNames, ',');
+		char32 *comma = str32chr (fileNames, U',');
 		if (comma) *comma = '\0';
 		/*
 		 * Determine complete (relative) file name.
 		 */
-		swprintf (pathName, 256, L"%ls%ls%ls", fileNameHead, fileNames, fileNameTail);
+		Melder_sprint (pathName,kMelder_MAXPATH+1, fileNameHead, fileNames, fileNameTail);
 		/*
 		 * Make sure we are in the correct directory.
 		 */
@@ -114,9 +115,9 @@ static void readSound (ExperimentMFC me, const wchar_t *fileNameHead, const wcha
 			MelderDir_relativePathToFile (& my rootDirectory, pathName, & file);
 			if (Melder_debug == 32) {
 				MelderInfo_open ();
-				MelderInfo_writeLine (L"Path name <", pathName, L">");
-				MelderInfo_writeLine (L"Root directory <", my rootDirectory.path, L">");
-				MelderInfo_writeLine (L"Full path name <", file.path, L">");
+				MelderInfo_writeLine (U"Path name <", pathName, U">");
+				MelderInfo_writeLine (U"Root directory <", my rootDirectory.path, U">");
+				MelderInfo_writeLine (U"Full path name <", file.path, U">");
 				MelderInfo_close ();
 			}
 		}
@@ -125,14 +126,14 @@ static void readSound (ExperimentMFC me, const wchar_t *fileNameHead, const wcha
 		 */
 		autoSound substimulus = (Sound) Data_readFromFile (& file);   // Sound_readFromSoundFile (& file);
 		if (substimulus -> classInfo != classSound)
-			Melder_throw ("File ", & file, " contains a ", Thing_className (substimulus.peek()), " instead of a sound.");
+			Melder_throw (U"File ", & file, U" contains a ", Thing_className (substimulus.peek()), U" instead of a sound.");
 		/*
 		 * Check whether all sounds have the same number of channels.
 		 */
 		if (my numberOfChannels == 0) {
 			my numberOfChannels = substimulus -> ny;
 		} else if (substimulus -> ny != my numberOfChannels) {
-			Melder_throw ("The sound in file ", & file, " has a different number of channels than some other sound.");
+			Melder_throw (U"The sound in file ", & file, U" has a different number of channels than some other sound.");
 		}
 		/*
 		 * Check whether all sounds have the same sampling frequency.
@@ -140,12 +141,12 @@ static void readSound (ExperimentMFC me, const wchar_t *fileNameHead, const wcha
 		if (my samplePeriod == 0.0) {
 			my samplePeriod = substimulus -> dx;   /* This must be the first sound read. */
 		} else if (substimulus -> dx != my samplePeriod) {
-			Melder_throw ("The sound in file ", & file, " has a different sampling frequency than some other sound.");
+			Melder_throw (U"The sound in file ", & file, U" has a different sampling frequency than some other sound.");
 		}
 		/*
 		 * Append the substimuli, perhaps with silent intervals.
 		 */
-		if (*sound == NULL) {
+		if (! *sound) {
 			*sound = substimulus.transfer();
 		} else {
 			autoSound newStimulus = Sounds_append (*sound, medialSilenceDuration, substimulus.peek());
@@ -156,7 +157,7 @@ static void readSound (ExperimentMFC me, const wchar_t *fileNameHead, const wcha
 		/*
 		 * Cycle.
 		 */
-		if (comma == NULL) break;
+		if (! comma) break;
 		fileNames = & comma [1];
 	}
 }
@@ -181,8 +182,8 @@ void ExperimentMFC_start (ExperimentMFC me) {
 		NUMvector_free <long> (my responses, 1);
 		NUMvector_free <double> (my goodnesses, 1);
 		NUMvector_free <double> (my reactionTimes, 1);
-		forget (my playBuffer);
-		my pausing = FALSE;
+		my playBuffer.reset();
+		my pausing = false;
 		my numberOfTrials = my numberOfDifferentStimuli * my numberOfReplicationsPerStimulus;
 		my stimuli = NUMvector <long> (1, my numberOfTrials);
 		my responses = NUMvector <long> (1, my numberOfTrials);
@@ -233,12 +234,12 @@ void ExperimentMFC_start (ExperimentMFC me) {
 		 * Create the play buffer.
 		 */
 		maximumStimulusPlaySamples =
-			floor (my stimulusInitialSilenceDuration / my samplePeriod + 0.5)
-			+ floor (my stimulusFinalSilenceDuration / my samplePeriod + 0.5)
+			lround (my stimulusInitialSilenceDuration / my samplePeriod)
+			+ lround (my stimulusFinalSilenceDuration / my samplePeriod)
 			+ stimulusCarrierBeforeSamples + maximumStimulusSamples + stimulusCarrierAfterSamples + 2;
 		maximumResponsePlaySamples =
-			floor (my responseInitialSilenceDuration / my samplePeriod + 0.5)
-			+ floor (my responseFinalSilenceDuration / my samplePeriod + 0.5)
+			lround (my responseInitialSilenceDuration / my samplePeriod)
+			+ lround (my responseFinalSilenceDuration / my samplePeriod)
 			+ responseCarrierBeforeSamples + maximumResponseSamples + responseCarrierAfterSamples + 2;
 		maximumPlaySamples = maximumStimulusPlaySamples > maximumResponsePlaySamples ? maximumStimulusPlaySamples : maximumResponsePlaySamples;
 		my playBuffer = Sound_create (my numberOfChannels, 0.0, maximumPlaySamples * my samplePeriod,
@@ -277,8 +278,8 @@ void ExperimentMFC_start (ExperimentMFC me) {
 	} catch (MelderError) {
 		Melder_warningOn ();
 		my numberOfTrials = 0;
-		NUMvector_free (my stimuli, 1); my stimuli = NULL;
-		Melder_throw (me, ": not started.");
+		NUMvector_free (my stimuli, 1); my stimuli = nullptr;
+		Melder_throw (me, U": not started.");
 	}
 }
 
@@ -287,7 +288,7 @@ static void playSound (ExperimentMFC me, Sound sound, Sound carrierBefore, Sound
 {
 	long numberOfSamplesWritten = 0;
 
-	long initialSilenceSamples = floor (initialSilenceDuration / my samplePeriod + 0.5);
+	long initialSilenceSamples = lround (initialSilenceDuration / my samplePeriod);
 	for (long channel = 1; channel <= my numberOfChannels; channel ++) {
 		for (long i = 1; i <= initialSilenceSamples; i ++) {
 			my playBuffer -> z [channel] [i] = 0.0;
@@ -319,7 +320,7 @@ static void playSound (ExperimentMFC me, Sound sound, Sound carrierBefore, Sound
 		numberOfSamplesWritten += carrierAfter -> nx;
 	}
 
-	long finalSilenceSamples = floor (finalSilenceDuration / my samplePeriod + 0.5);
+	long finalSilenceSamples = lround (finalSilenceDuration / my samplePeriod);
 	for (long channel = 1; channel <= my numberOfChannels; channel ++) {
 		for (long i = 1; i <= finalSilenceSamples; i ++) {
 			my playBuffer -> z [channel] [i + numberOfSamplesWritten] = 0.0;
@@ -329,7 +330,7 @@ static void playSound (ExperimentMFC me, Sound sound, Sound carrierBefore, Sound
 
 	if (! my blankWhilePlaying)
 		my startingTime = Melder_clock ();
-	Sound_playPart (my playBuffer, 0.0, numberOfSamplesWritten * my samplePeriod, 0, NULL);
+	Sound_playPart (my playBuffer.get(), 0.0, numberOfSamplesWritten * my samplePeriod, 0, nullptr);
 	if (my blankWhilePlaying)
 		my startingTime = Melder_clock ();
 }
@@ -344,7 +345,7 @@ void ExperimentMFC_playResponse (ExperimentMFC me, long iresp) {
 		my responseCarrierBefore. sound, my responseCarrierAfter. sound, my responseInitialSilenceDuration, my responseFinalSilenceDuration);
 }
 
-Thing_implement (ResultsMFC, Data, 2);
+Thing_implement (ResultsMFC, Daata, 2);
 
 ResultsMFC ResultsMFC_create (long numberOfTrials) {
 	try {
@@ -353,35 +354,27 @@ ResultsMFC ResultsMFC_create (long numberOfTrials) {
 		my result = NUMvector <structTrialMFC> (1, my numberOfTrials);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ResultsMFC not created.");
+		Melder_throw (U"ResultsMFC not created.");
 	}
 }
 
 ResultsMFC ExperimentMFC_extractResults (ExperimentMFC me) {
 	try {
 		if (my trial == 0 || my trial <= my numberOfTrials)
-			Melder_warning ("The experiment was not finished. Only the first ", my trial - 1 + my pausing, " responses are valid.");
+			Melder_warning (U"The experiment was not finished. Only the first ", my trial - 1 + my pausing, U" responses are valid.");
 		autoResultsMFC thee = ResultsMFC_create (my numberOfTrials);
 		for (long trial = 1; trial <= my numberOfTrials; trial ++) {
-			wchar_t *pipe = my stimulus [my stimuli [trial]]. visibleText ?
-				wcschr (my stimulus [my stimuli [trial]]. visibleText, '|') : NULL;
-			if (pipe) {
-				long nameLength = wcslen (my stimulus [my stimuli [trial]]. name);
-				long buttonTextLength = wcslen (pipe);
-				thy result [trial]. stimulus = Melder_calloc (wchar_t, nameLength + buttonTextLength + 1);
-				wcscpy (thy result [trial]. stimulus, my stimulus [my stimuli [trial]]. name);
-				wcscat (thy result [trial]. stimulus, pipe);
-			} else {
-				thy result [trial]. stimulus = Melder_wcsdup (my stimulus [my stimuli [trial]]. name);
-			}
-			//if (my responses [trial] < 1) Melder_throw ("No response for trial ", trial, ".")
-			thy result [trial]. response = Melder_wcsdup (my responses [trial] ? my response [my responses [trial]]. name : L"");
+			char32 *pipe = my stimulus [my stimuli [trial]]. visibleText ?
+				str32chr (my stimulus [my stimuli [trial]]. visibleText, U'|') : nullptr;
+			thy result [trial]. stimulus = Melder_dup (Melder_cat (my stimulus [my stimuli [trial]]. name, pipe));
+			//if (my responses [trial] < 1) Melder_throw (U"No response for trial ", trial, U".")
+			thy result [trial]. response = Melder_dup (my responses [trial] ? my response [my responses [trial]]. name : U"");
 			thy result [trial]. goodness = my goodnesses [trial];
 			thy result [trial]. reactionTime = my reactionTimes [trial];
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": results not extracted.");
+		Melder_throw (me, U": results not extracted.");
 	}
 }
 
@@ -392,22 +385,22 @@ ResultsMFC ResultsMFC_removeUnsharedStimuli (ResultsMFC me, ResultsMFC thee) {
 		for (long i = 1; i <= thy numberOfTrials; i ++) {
 			bool present = false;
 			for (long j = 1; j <= my numberOfTrials; j ++) {
-				if (wcsequ (thy result [i]. stimulus, my result [j]. stimulus)) {
+				if (str32equ (thy result [i]. stimulus, my result [j]. stimulus)) {
 					present = true;
 					break;
 				}
 			}
 			if (present) {
 				his numberOfTrials ++;
-				his result [his numberOfTrials]. stimulus = Melder_wcsdup (thy result [i]. stimulus);
-				his result [his numberOfTrials]. response = Melder_wcsdup (thy result [i]. response);
+				his result [his numberOfTrials]. stimulus = Melder_dup (thy result [i]. stimulus);
+				his result [his numberOfTrials]. response = Melder_dup (thy result [i]. response);
 			}
 		}
 		if (his numberOfTrials == 0)
-			Melder_throw ("No shared stimuli.");
+			Melder_throw (U"No shared stimuli.");
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": unshared stimuli not removed.");
+		Melder_throw (me, U" & ", thee, U": unshared stimuli not removed.");
 	}
 }
 
@@ -426,13 +419,13 @@ Table ResultsMFCs_to_Table (Collection me) {
 			}
 		}
 		autoTable thee = Table_create (irow, 3 + hasGoodnesses + hasReactionTimes);
-		Table_setColumnLabel (thee.peek(), 1, L"subject");
-		Table_setColumnLabel (thee.peek(), 2, L"stimulus");
-		Table_setColumnLabel (thee.peek(), 3, L"response");
+		Table_setColumnLabel (thee.peek(), 1, U"subject");
+		Table_setColumnLabel (thee.peek(), 2, U"stimulus");
+		Table_setColumnLabel (thee.peek(), 3, U"response");
 		if (hasGoodnesses)
-			Table_setColumnLabel (thee.peek(), 4, L"goodness");
+			Table_setColumnLabel (thee.peek(), 4, U"goodness");
 		if (hasReactionTimes)
-			Table_setColumnLabel (thee.peek(), 4 + hasGoodnesses, L"reactionTime");
+			Table_setColumnLabel (thee.peek(), 4 + hasGoodnesses, U"reactionTime");
 		irow = 0;
 		for (long iresults = 1; iresults <= my size; iresults ++) {
 			ResultsMFC results = (ResultsMFC) my item [iresults];
@@ -451,7 +444,7 @@ Table ResultsMFCs_to_Table (Collection me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("ResultsMFC objects not collected to Table.");
+		Melder_throw (U"ResultsMFC objects not collected to Table.");
 	}
 }
 
@@ -464,7 +457,7 @@ Categories ResultsMFC_to_Categories_stimuli (ResultsMFC me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": stimuli not converted to Categories.");
+		Melder_throw (me, U": stimuli not converted to Categories.");
 	}
 }
 
@@ -477,12 +470,12 @@ Categories ResultsMFC_to_Categories_responses (ResultsMFC me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": responses not converted to Categories.");
+		Melder_throw (me, U": responses not converted to Categories.");
 	}
 }
 
 static int compare (SimpleString me, SimpleString thee) {
-	return wcscmp (my string, thy string);
+	return str32cmp (my string, thy string);
 }
 void Categories_sort (Categories me) {
 	NUMsort_p (my size, my item, (int (*) (const void *, const void *)) compare);
@@ -490,14 +483,14 @@ void Categories_sort (Categories me) {
 
 double Categories_getEntropy (Categories me) {
 	long numberOfTokens = 0;
-	wchar_t *previousString = NULL;
+	char32 *previousString = nullptr;
 	double entropy = 0.0;
 	autoCategories thee = Data_copy (me);
 	Categories_sort (thee.peek());
 	for (long i = 1; i <= thy size; i ++) {
 		SimpleString s = (SimpleString) thy item [i];
-		wchar_t *string = s -> string;
-		if (previousString != NULL && ! wcsequ (string, previousString)) {
+		char32 *string = s -> string;
+		if (previousString && ! str32equ (string, previousString)) {
 			double p = (double) numberOfTokens / thy size;
 			entropy -= p * NUMlog2 (p);
 			numberOfTokens = 1;
diff --git a/fon/ExperimentMFC.h b/fon/ExperimentMFC.h
index 56a18f4..331de65 100644
--- a/fon/ExperimentMFC.h
+++ b/fon/ExperimentMFC.h
@@ -26,8 +26,8 @@
 #include "Experiment_enums.h"
 
 #include "ExperimentMFC_def.h"
-oo_CLASS_CREATE (ExperimentMFC, Data);
-oo_CLASS_CREATE (ResultsMFC, Data);
+oo_CLASS_CREATE (ExperimentMFC, Daata);
+oo_CLASS_CREATE (ResultsMFC, Daata);
 
 void ExperimentMFC_start (ExperimentMFC me);
 void ExperimentMFC_playStimulus (ExperimentMFC me, long istim);
diff --git a/fon/ExperimentMFC_def.h b/fon/ExperimentMFC_def.h
index e228c00..2772ee8 100644
--- a/fon/ExperimentMFC_def.h
+++ b/fon/ExperimentMFC_def.h
@@ -1,6 +1,6 @@
 /* ExperimentMFC_def.h
  *
- * Copyright (C) 2001-2011,2013 Paul Boersma
+ * Copyright (C) 2001-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
  * pb 2005/11/21 added replayButton (version 4)
  * pb 2005/12/04 added okButton and oopsButton (version 4)
  * pb 2005/12/06 fix stimuliAreSounds: defaults to TRUE
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2007/09/26 added font size (version 5)
  * pb 2011/03/03 added reaction time (version 2 of ResultsMFC)
  * pb 2013/01/01 added finalSilenceDuration and blankWhilePlaying (version 6)
@@ -97,7 +97,7 @@ oo_END_STRUCT (GoodnessMFC)
 
 
 #define ooSTRUCT ExperimentMFC
-oo_DEFINE_CLASS (ExperimentMFC, Data)
+oo_DEFINE_CLASS (ExperimentMFC, Daata)
 
 	oo_FROM (6)
 		oo_QUESTION (blankWhilePlaying)
@@ -175,12 +175,12 @@ oo_DEFINE_CLASS (ExperimentMFC, Data)
 		oo_DOUBLE_VECTOR (goodnesses, numberOfTrials)
 		oo_DOUBLE (startingTime)
 		oo_DOUBLE_VECTOR (reactionTimes, numberOfTrials)
-		oo_OBJECT (Sound, 0, playBuffer)
+		oo_AUTO_OBJECT (Sound, 0, playBuffer)
 	#endif
 	oo_DIR (rootDirectory)
 	#if oo_READING
 		MelderDir_copy (& Data_directoryBeingRead, & rootDirectory);
-		if (localVersion < 4) stimuliAreSounds = TRUE;
+		if (formatVersion < 4) stimuliAreSounds = true;
 	#endif
 
 oo_END_CLASS (ExperimentMFC)
@@ -206,7 +206,7 @@ oo_END_STRUCT (TrialMFC)
 
 
 #define ooSTRUCT ResultsMFC
-oo_DEFINE_CLASS (ResultsMFC, Data)
+oo_DEFINE_CLASS (ResultsMFC, Daata)
 
 	oo_LONG (numberOfTrials)
 	oo_STRUCT_VECTOR (TrialMFC, result, numberOfTrials)
diff --git a/fon/Experiment_enums.h b/fon/Experiment_enums.h
index 70c6c2e..857bf5a 100644
--- a/fon/Experiment_enums.h
+++ b/fon/Experiment_enums.h
@@ -1,6 +1,6 @@
 /* Experiment_enums.h
  *
- * Copyright (C) 2001-2009 Paul Boersma
+ * Copyright (C) 2001-2009,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,16 +17,12 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-/*
- * pb 2009/03/18
- */
-
 enums_begin (kExperiment_randomize, 0)
-	enums_add (kExperiment_randomize, 0, CYCLIC_NON_RANDOM, L"CyclicNonRandom")
-	enums_add (kExperiment_randomize, 1, PERMUTE_ALL, L"PermuteAll")
-	enums_add (kExperiment_randomize, 2, PERMUTE_BALANCED, L"PermuteBalanced")
-	enums_add (kExperiment_randomize, 3, PERMUTE_BALANCED_NO_DOUBLETS, L"PermuteBalancedNoDoublets")
-	enums_add (kExperiment_randomize, 4, WITH_REPLACEMENT, L"WithReplacement")
+	enums_add (kExperiment_randomize, 0, CYCLIC_NON_RANDOM, U"CyclicNonRandom")
+	enums_add (kExperiment_randomize, 1, PERMUTE_ALL, U"PermuteAll")
+	enums_add (kExperiment_randomize, 2, PERMUTE_BALANCED, U"PermuteBalanced")
+	enums_add (kExperiment_randomize, 3, PERMUTE_BALANCED_NO_DOUBLETS, U"PermuteBalancedNoDoublets")
+	enums_add (kExperiment_randomize, 4, WITH_REPLACEMENT, U"WithReplacement")
 enums_end (kExperiment_randomize, 4, PERMUTE_BALANCED_NO_DOUBLETS)
 
 /* End of file Experiment_enums.h */
diff --git a/fon/Formant.cpp b/fon/Formant.cpp
index 25c400e..b7665c7 100644
--- a/fon/Formant.cpp
+++ b/fon/Formant.cpp
@@ -1,6 +1,6 @@
 /* Formant.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -54,15 +54,15 @@
 Thing_implement (Formant, Sampled, 2);   // version 1 = with intensity, 2 = double
 
 void structFormant :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"Time sampling:");
-	MelderInfo_writeLine (L"   Number of frames: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"   Time step: ", Melder_double (dx), L" seconds");
-	MelderInfo_writeLine (L"   First frame centred at: ", Melder_double (x1), L" seconds");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"Time sampling:");
+	MelderInfo_writeLine (U"   Number of frames: ", nx);
+	MelderInfo_writeLine (U"   Time step: ", dx, U" seconds");
+	MelderInfo_writeLine (U"   First frame centred at: ", x1, U" seconds");
 }
 
 double structFormant :: v_getValueAtSample (long iframe, long which, int units) {
@@ -85,7 +85,7 @@ double structFormant :: v_getValueAtSample (long iframe, long which, int units)
 	return NUMundefined;
 }
 
-Formant Formant_create (double tmin, double tmax, long nt, double dt, double t1,
+autoFormant Formant_create (double tmin, double tmax, long nt, double dt, double t1,
 	int maxnFormants)
 {
 	try {
@@ -93,9 +93,9 @@ Formant Formant_create (double tmin, double tmax, long nt, double dt, double t1,
 		Sampled_init (me.peek(), tmin, tmax, nt, dt, t1);
 		my d_frames = NUMvector <structFormant_Frame> (1, nt);
 		my maxnFormants = maxnFormants;
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Formant object not created.");
+		Melder_throw (U"Formant object not created.");
 	}
 }
 
@@ -134,10 +134,10 @@ void Formant_drawTracks (Formant me, Graphics g, double tmin, double tmax, doubl
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_textLeft (g, 1, L"Formant frequency (Hz)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1.0, 1000.0, 1, 1, 1);
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_textLeft (g, true, U"Formant frequency (Hz)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, 1000.0, true, true, true);
 	}
 }
 
@@ -156,7 +156,7 @@ void Formant_drawSpeckles_inside (Formant me, Graphics g, double tmin, double tm
 			maximumIntensity = frame -> intensity;
 	}
 	if (maximumIntensity == 0.0 || suppress_dB <= 0.0)
-		minimumIntensity = 0.0;   /* Ignore. */
+		minimumIntensity = 0.0;   // ignore
 	else
 		minimumIntensity = maximumIntensity / pow (10.0, suppress_dB / 10.0);
 
@@ -180,54 +180,54 @@ void Formant_drawSpeckles (Formant me, Graphics g, double tmin, double tmax, dou
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_textLeft (g, 1, L"Formant frequency (Hz)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeftEvery (g, 1.0, 1000.0, 1, 1, 1);
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_textLeft (g, true, U"Formant frequency (Hz)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeftEvery (g, 1.0, 1000.0, true, true, true);
 	}
 }
 
-void Formant_formula_bandwidths (Formant me, const wchar_t *formula, Interpreter interpreter) {
+void Formant_formula_bandwidths (Formant me, const char32 *formula, Interpreter interpreter) {
 	try {
 		long nrow = Formant_getMaxNumFormants (me);
 		if (nrow < 1)
-			Melder_throw (L"No formants available.");
-		autoMatrix mat = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 0.5, nrow + 0.5, nrow, 1, 1);
+			Melder_throw (U"No formants available.");
+		autoMatrix mat = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 0.5, nrow + 0.5, nrow, 1.0, 1.0);
 		for (long iframe = 1; iframe <= my nx; iframe ++) {
 			Formant_Frame frame = & my d_frames [iframe];
 			for (long iformant = 1; iformant <= frame -> nFormants; iformant ++)
 				mat -> z [iformant] [iframe] = frame -> formant [iformant]. bandwidth;
 		}
-		Matrix_formula (mat.peek(), formula, interpreter, NULL);
+		Matrix_formula (mat.peek(), formula, interpreter, nullptr);
 		for (long iframe = 1; iframe <= my nx; iframe ++) {
 			Formant_Frame frame = & my d_frames [iframe];
 			for (long iformant = 1; iformant <= frame -> nFormants; iformant ++)
 				frame -> formant [iformant]. bandwidth = mat -> z [iformant] [iframe];
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": bandwidth formula not executed.");
+		Melder_throw (me, U": bandwidth formula not executed.");
 	}
 }
 
-void Formant_formula_frequencies (Formant me, const wchar_t *formula, Interpreter interpreter) {
+void Formant_formula_frequencies (Formant me, const char32 *formula, Interpreter interpreter) {
 	try {
 		long nrow = Formant_getMaxNumFormants (me);
 		if (nrow < 1)
-			Melder_throw ("No formants available.");
-		autoMatrix mat = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 0.5, nrow + 0.5, nrow, 1, 1);
+			Melder_throw (U"No formants available.");
+		autoMatrix mat = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 0.5, nrow + 0.5, nrow, 1.0, 1.0);
 		for (long iframe = 1; iframe <= my nx; iframe ++) {
 			Formant_Frame frame = & my d_frames [iframe];
 			for (long iformant = 1; iformant <= frame -> nFormants; iformant ++)
 				mat -> z [iformant] [iframe] = frame -> formant [iformant]. frequency;
 		}
-		Matrix_formula (mat.peek(), formula, interpreter, NULL);
+		Matrix_formula (mat.peek(), formula, interpreter, nullptr);
 		for (long iframe = 1; iframe <= my nx; iframe ++) {
 			Formant_Frame frame = & my d_frames [iframe];
 			for (long iformant = 1; iformant <= frame -> nFormants; iformant ++)
 				frame -> formant [iformant]. frequency = mat -> z [iformant] [iframe];
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": frequency formula not executed.");
+		Melder_throw (me, U": frequency formula not executed.");
 	}
 }
 
@@ -243,7 +243,7 @@ void Formant_getExtrema (Formant me, int iformant, double tmin, double tmax, dou
 		double f;
 		if (iformant > frame -> nFormants) continue;
 		f = frame -> formant [iformant]. frequency;
-		if (! f) continue;
+		if (f == 0.0) continue;
 		if (fmin) if (f < *fmin || *fmin == 0.0) *fmin = f;
 		if (fmax) if (f > *fmax) *fmax = f;
 	}
@@ -258,13 +258,13 @@ void Formant_getMinimumAndTime (Formant me, int iformant, double tmin, double tm
 
 double Formant_getMinimum (Formant me, int iformant, double tmin, double tmax, int bark, int interpolate) {
 	double minimum;
-	Formant_getMinimumAndTime (me, iformant, tmin, tmax, bark, interpolate, & minimum, NULL);
+	Formant_getMinimumAndTime (me, iformant, tmin, tmax, bark, interpolate, & minimum, nullptr);
 	return minimum;
 }
 
 double Formant_getTimeOfMinimum (Formant me, int iformant, double tmin, double tmax, int bark, int interpolate) {
 	double time;
-	Formant_getMinimumAndTime (me, iformant, tmin, tmax, bark, interpolate, NULL, & time);
+	Formant_getMinimumAndTime (me, iformant, tmin, tmax, bark, interpolate, nullptr, & time);
 	return time;
 }
 
@@ -272,18 +272,18 @@ void Formant_getMaximumAndTime (Formant me, int iformant, double tmin, double tm
 	double *return_maximum, double *return_timeOfMaximum)
 {
 	Sampled_getMaximumAndX (me, tmin, tmax, iformant << 1, bark, interpolate, return_maximum, return_timeOfMaximum);
-	if (return_maximum && *return_maximum <= 0.0) *return_maximum = NUMundefined;   /* Unlikely. */
+	if (return_maximum && *return_maximum <= 0.0) *return_maximum = NUMundefined;   // unlikely
 }
 
 double Formant_getMaximum (Formant me, int iformant, double tmin, double tmax, int bark, int interpolate) {
 	double maximum;
-	Formant_getMaximumAndTime (me, iformant, tmin, tmax, bark, interpolate, & maximum, NULL);
+	Formant_getMaximumAndTime (me, iformant, tmin, tmax, bark, interpolate, & maximum, nullptr);
 	return maximum;
 }
 
 double Formant_getTimeOfMaximum (Formant me, int iformant, double tmin, double tmax, int bark, int interpolate) {
 	double time;
-	Formant_getMaximumAndTime (me, iformant, tmin, tmax, bark, interpolate, NULL, & time);
+	Formant_getMaximumAndTime (me, iformant, tmin, tmax, bark, interpolate, nullptr, & time);
 	return time;
 }
 
@@ -292,7 +292,7 @@ double Formant_getQuantile (Formant me, int iformant, double quantile, double tm
 }
 
 double Formant_getMean (Formant me, int iformant, double tmin, double tmax, int bark) {
-	return Sampled_getMean (me, tmin, tmax, iformant << 1, bark, TRUE);
+	return Sampled_getMean (me, tmin, tmax, iformant << 1, bark, true);
 }
 
 double Formant_getStandardDeviation (Formant me, int iformant, double tmin, double tmax, int bark) {
@@ -307,7 +307,7 @@ double Formant_getStandardDeviation (Formant me, int iformant, double tmin, doub
 		Formant_Frame frame = & my d_frames [iframe];
 		if (iformant > frame -> nFormants) continue;
 		double f = frame -> formant [iformant]. frequency;
-		if (! f) continue;
+		if (f == 0.0) continue;
 		if (bark) f = NUMhertzToBark (f);
 		n += 1;
 		sum += (f - mean) * (f - mean);
@@ -317,11 +317,11 @@ double Formant_getStandardDeviation (Formant me, int iformant, double tmin, doub
 }
 
 double Formant_getValueAtTime (Formant me, int iformant, double time, int bark) {
-	return Sampled_getValueAtX (me, time, iformant << 1, bark, TRUE);
+	return Sampled_getValueAtX (me, time, iformant << 1, bark, true);
 }
 
 double Formant_getBandwidthAtTime (Formant me, int iformant, double time, int bark) {
-	return Sampled_getValueAtX (me, time, (iformant << 1) + 1, bark, TRUE);
+	return Sampled_getValueAtX (me, time, (iformant << 1) + 1, bark, true);
 }
 
 double Formant_getQuantileOfBandwidth (Formant me, int iformant, double quantile, double tmin, double tmax, int bark) {
@@ -330,7 +330,7 @@ double Formant_getQuantileOfBandwidth (Formant me, int iformant, double quantile
 
 void Formant_scatterPlot (Formant me, Graphics g, double tmin, double tmax,
 	int iformant1, double fmin1, double fmax1, int iformant2, double fmin2, double fmax2,
-	double size_mm, const wchar_t *mark, int garnish)
+	double size_mm, const char32 *mark, int garnish)
 {
 	if (iformant1 < 1 || iformant2 < 1) return;
 	if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; }
@@ -354,18 +354,15 @@ void Formant_scatterPlot (Formant me, Graphics g, double tmin, double tmax,
 	}
 	Graphics_unsetInner (g);
 	if (garnish) {
-		wchar_t text [100];
 		Graphics_drawInnerBox (g);
-		swprintf (text, 100, L"%%F_%d (Hz)", iformant1);
-		Graphics_textBottom (g, 1, text);
-		swprintf (text, 100, L"%%F_%d (Hz)", iformant2);
-		Graphics_textLeft (g, 1, text);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_textBottom (g, true, Melder_cat (U"%%F_", iformant1, U" (Hz)"));
+		Graphics_textLeft (g, true, Melder_cat (U"%%F_", iformant2, U" (Hz)"));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
-Matrix Formant_to_Matrix (Formant me, int iformant) {
+autoMatrix Formant_to_Matrix (Formant me, int iformant) {
 	try {
 		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 1.0, 1.0, 1, 1.0, 1.0);
 		for (long iframe = 1; iframe <= my nx; iframe ++) {
@@ -373,13 +370,13 @@ Matrix Formant_to_Matrix (Formant me, int iformant) {
 			thy z [1] [iframe] = iformant <= frame -> nFormants ?
 				frame -> formant [iformant]. frequency : 0.0;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": frequencies of formant ", iformant, " not converted to Matrix.");
+		Melder_throw (me, U": frequencies of formant ", iformant, U" not converted to Matrix.");
 	}
 }
 
-Matrix Formant_to_Matrix_bandwidths (Formant me, int iformant) {
+autoMatrix Formant_to_Matrix_bandwidths (Formant me, int iformant) {
 	try {
 		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 1.0, 1.0, 1, 1.0, 1.0);
 		for (long iframe = 1; iframe <= my nx; iframe ++) {
@@ -387,9 +384,9 @@ Matrix Formant_to_Matrix_bandwidths (Formant me, int iformant) {
 			thy z [1] [iframe] = iformant <= frame -> nFormants ?
 				frame -> formant [iformant]. bandwidth : 0.0;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": bandwidths of formant ", iformant, " not converted to Matrix.");
+		Melder_throw (me, U": bandwidths of formant ", iformant, U" not converted to Matrix.");
 	}
 }
 
@@ -404,7 +401,7 @@ static double getLocalCost (long iframe, long icand, int itrack, void *closure)
 	if (icand > frame -> nFormants) return 1e30;
 	candidate = & frame -> formant [icand];
 	/*if (candidate -> frequency <= 0.0) candidate -> frequency = 0.001;
-		Melder_fatal ("Weird formant frequency %ls Hz.", Melder_double (candidate -> frequency))*/;
+		Melder_fatal (U"Weird formant frequency ", candidate -> frequency, U" Hz.")*/;
 	Melder_assert (candidate -> bandwidth > 0.0);
 	Melder_assert (itrack > 0 && itrack <= 5);
 	return my dfCost * fabs (candidate -> frequency - my refF [itrack]) +
@@ -431,7 +428,7 @@ static void putResult (long iframe, long place, int itrack, void *closure) {
 	my thy d_frames [iframe]. formant [itrack] = my my d_frames [iframe]. formant [place];
 }
 
-Formant Formant_tracker (Formant me, int ntrack,
+autoFormant Formant_tracker (Formant me, int ntrack,
 	double refF1, double refF2, double refF3, double refF4, double refF5,
 	double dfCost,   /* Per kHz. */
 	double bfCost, double octaveJumpCost)
@@ -439,7 +436,7 @@ Formant Formant_tracker (Formant me, int ntrack,
 	try {
 		long nformmin = Formant_getMinNumFormants (me);
 		struct fparm parm;
-		if (ntrack > nformmin) Melder_throw ("Number of tracks (", ntrack, ") should not exceed minimum number of formants (", nformmin, ").");
+		if (ntrack > nformmin) Melder_throw (U"Number of tracks (", ntrack, U") should not exceed minimum number of formants (", nformmin, U").");
 		autoFormant thee = Formant_create (my xmin, my xmax, my nx, my dx, my x1, ntrack);
 		for (long iframe = 1; iframe <= thy nx; iframe ++) {
 			thy d_frames [iframe]. formant = NUMvector <structFormant_Formant> (1, ntrack);
@@ -459,13 +456,13 @@ Formant Formant_tracker (Formant me, int ntrack,
 		parm.refF [5] = refF5;
 		NUM_viterbi_multi (my nx, my maxnFormants, ntrack,
 			getLocalCost, getTransitionCost, putResult, & parm);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not tracked.");
+		Melder_throw (me, U": not tracked.");
 	}
 }
 
-Table Formant_downto_Table (Formant me, bool includeFrameNumbers,
+autoTable Formant_downto_Table (Formant me, bool includeFrameNumbers,
 	bool includeTimes, int timeDecimals,
 	bool includeIntensity, int intensityDecimals,
 	bool includeNumberOfFormants, int frequencyDecimals,
@@ -475,13 +472,13 @@ Table Formant_downto_Table (Formant me, bool includeFrameNumbers,
 		autoTable thee = Table_createWithoutColumnNames (my nx, includeFrameNumbers + includeTimes + includeIntensity +
 			includeNumberOfFormants + my maxnFormants * (1 + includeBandwidths));
 		long icol = 0;
-		if (includeFrameNumbers)     Table_setColumnLabel (thee.peek(), ++ icol, L"frame");
-		if (includeTimes)            Table_setColumnLabel (thee.peek(), ++ icol, L"time(s)");
-		if (includeIntensity)        Table_setColumnLabel (thee.peek(), ++ icol, L"intensity");
-		if (includeNumberOfFormants) Table_setColumnLabel (thee.peek(), ++ icol, L"nformants");
+		if (includeFrameNumbers)     Table_setColumnLabel (thee.peek(), ++ icol, U"frame");
+		if (includeTimes)            Table_setColumnLabel (thee.peek(), ++ icol, U"time(s)");
+		if (includeIntensity)        Table_setColumnLabel (thee.peek(), ++ icol, U"intensity");
+		if (includeNumberOfFormants) Table_setColumnLabel (thee.peek(), ++ icol, U"nformants");
 		for (long iformant = 1; iformant <= my maxnFormants; iformant ++) {
-			Table_setColumnLabel (thee.peek(), ++ icol, Melder_wcscat (L"F", Melder_integer (iformant), L"(Hz)"));
-			if (includeBandwidths) { Table_setColumnLabel (thee.peek(), ++ icol, Melder_wcscat (L"B", Melder_integer (iformant), L"(Hz)")); }
+			Table_setColumnLabel (thee.peek(), ++ icol, Melder_cat (U"F", iformant, U"(Hz)"));
+			if (includeBandwidths) { Table_setColumnLabel (thee.peek(), ++ icol, Melder_cat (U"B", iformant, U"(Hz)")); }
 		}
 		for (long iframe = 1; iframe <= my nx; iframe ++) {
 			icol = 0;
@@ -506,9 +503,9 @@ Table Formant_downto_Table (Formant me, bool includeFrameNumbers,
 					Table_setNumericValue (thee.peek(), iframe, ++ icol, NUMundefined);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Table.");
+		Melder_throw (me, U": not converted to Table.");
 	}
 }
 
@@ -524,7 +521,7 @@ void Formant_list (Formant me, bool includeFrameNumbers,
 			includeNumberOfFormants, frequencyDecimals, includeBandwidths);
 		Table_list (table.peek(), false);
 	} catch (MelderError) {
-		Melder_throw (me, ": not listed.");
+		Melder_throw (me, U": not listed.");
 	}
 }
 
diff --git a/fon/Formant.h b/fon/Formant.h
index 13558ef..246642d 100644
--- a/fon/Formant.h
+++ b/fon/Formant.h
@@ -2,7 +2,7 @@
 #define _Formant_h_
 /* Formant.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,10 +26,10 @@
 #include "Formant_def.h"
 oo_CLASS_CREATE (Formant, Sampled);
 
-Formant Formant_create (double tmin, double tmax, long nt, double dt, double t1, int maxnFormants);
+autoFormant Formant_create (double tmin, double tmax, long nt, double dt, double t1, int maxnFormants);
 /*
 	Function:
-		return a new instance of Formant, or NULL if out of memory.
+		return a new instance of Formant.
 	Preconditions:
 		nt >= 1;
 		dt > 0.0;
@@ -76,19 +76,19 @@ void Formant_drawSpeckles (Formant me, Graphics g, double tmin, double tmax, dou
 	double suppress_dB, int garnish);
 void Formant_scatterPlot (Formant me, Graphics g, double tmin, double tmax,
 	int iformant1, double fmin1, double fmax1, int iformant2, double fmin2, double fmax2,
-	double size_mm, const wchar_t *mark, int garnish);
+	double size_mm, const char32 *mark, int garnish);
 
-Matrix Formant_to_Matrix (Formant me, int iformant);
-Matrix Formant_to_Matrix_bandwidths (Formant me, int iformant);
-void Formant_formula_frequencies (Formant me, const wchar_t *formula, Interpreter interpreter);
-void Formant_formula_bandwidths (Formant me, const wchar_t *formula, Interpreter interpreter);
+autoMatrix Formant_to_Matrix (Formant me, int iformant);
+autoMatrix Formant_to_Matrix_bandwidths (Formant me, int iformant);
+void Formant_formula_frequencies (Formant me, const char32 *formula, Interpreter interpreter);
+void Formant_formula_bandwidths (Formant me, const char32 *formula, Interpreter interpreter);
 
-Formant Formant_tracker (Formant me, int numberOfTracks,
+autoFormant Formant_tracker (Formant me, int numberOfTracks,
 	double refF1, double refF2, double refF3, double refF4, double refF5,
-	double dfCost,   /* Per kHz. */
+	double dfCost,   // per kHz
 	double bfCost, double octaveJumpCost);
 
-Table Formant_downto_Table (Formant me, bool includeFrameNumbers,
+autoTable Formant_downto_Table (Formant me, bool includeFrameNumbers,
 	bool includeTimes, int timeDecimals,
 	bool includeIntensity, int intensityDecimals,
 	bool includeNumberOfFormants, int frequencyDecimals,
diff --git a/fon/FormantGrid.cpp b/fon/FormantGrid.cpp
index cc54a22..01249ed 100644
--- a/fon/FormantGrid.cpp
+++ b/fon/FormantGrid.cpp
@@ -1,6 +1,6 @@
 /* FormantGrid.cpp
  *
- * Copyright (C) 2008-2011,2014 Paul Boersma & David Weenink
+ * Copyright (C) 2008-2011,2014,2015 Paul Boersma & David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -89,17 +89,17 @@ void FormantGrid_init (FormantGrid me, double tmin, double tmax, long numberOfFo
 	my xmax = tmax;
 }
 
-FormantGrid FormantGrid_createEmpty (double tmin, double tmax, long numberOfFormants) {
+autoFormantGrid FormantGrid_createEmpty (double tmin, double tmax, long numberOfFormants) {
 	try {
 		autoFormantGrid me = Thing_new (FormantGrid);
 		FormantGrid_init (me.peek(), tmin, tmax, numberOfFormants);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Empty FormantGrid not created.");
+		Melder_throw (U"Empty FormantGrid not created.");
 	}
 }
 
-FormantGrid FormantGrid_create (double tmin, double tmax, long numberOfFormants,
+autoFormantGrid FormantGrid_create (double tmin, double tmax, long numberOfFormants,
 	double initialFirstFormant, double initialFormantSpacing,
 	double initialFirstBandwidth, double initialBandwidthSpacing)
 {
@@ -111,31 +111,31 @@ FormantGrid FormantGrid_create (double tmin, double tmax, long numberOfFormants,
 			FormantGrid_addBandwidthPoint (me.peek(), iformant, 0.5 * (tmin + tmax),
 				initialFirstBandwidth + (iformant - 1) * initialBandwidthSpacing);
 		}
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("FormantGrid not created.");
+		Melder_throw (U"FormantGrid not created.");
 	}
 }
 
 void FormantGrid_addFormantPoint (FormantGrid me, long iformant, double t, double value) {
 	try {
 		if (iformant < 1 || iformant > my formants -> size)
-			Melder_throw ("No such formant number.");
+			Melder_throw (U"No such formant number.");
 		RealTier formantTier = (RealTier) my formants -> item [iformant];
 		RealTier_addPoint (formantTier, t, value);
 	} catch (MelderError) {
-		Melder_throw (me, ": formant point not added.");
+		Melder_throw (me, U": formant point not added.");
 	}
 }
 
 void FormantGrid_addBandwidthPoint (FormantGrid me, long iformant, double t, double value) {
 	try {
 		if (iformant < 1 || iformant > my formants -> size)
-			Melder_throw ("No such formant number.");
+			Melder_throw (U"No such formant number.");
 		RealTier bandwidthTier = (RealTier) my bandwidths -> item [iformant];
 		RealTier_addPoint (bandwidthTier, t, value);
 	} catch (MelderError) {
-		Melder_throw (me, ": bandwidth point not added.");
+		Melder_throw (me, U": bandwidth point not added.");
 	}
 }
 
@@ -196,28 +196,28 @@ void Sound_FormantGrid_filter_inline (Sound me, FormantGrid formantGrid) {
 	}
 }
 
-Sound Sound_FormantGrid_filter (Sound me, FormantGrid formantGrid) {
+autoSound Sound_FormantGrid_filter (Sound me, FormantGrid formantGrid) {
 	try {
 		autoSound thee = Data_copy (me);
 		Sound_FormantGrid_filter_inline (thee.peek(), formantGrid);
 		Vector_scale (thee.peek(), 0.99);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered with ", formantGrid, ".");
+		Melder_throw (me, U": not filtered with ", formantGrid, U".");
 	}
 }
 
-Sound Sound_FormantGrid_filter_noscale (Sound me, FormantGrid formantGrid) {
+autoSound Sound_FormantGrid_filter_noscale (Sound me, FormantGrid formantGrid) {
 	try {
 		autoSound thee = Data_copy (me);
 		Sound_FormantGrid_filter_inline (thee.peek(), formantGrid);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered with ", formantGrid, ".");
+		Melder_throw (me, U": not filtered with ", formantGrid, U".");
 	}
 }
 
-Sound FormantGrid_to_Sound (FormantGrid me, double samplingFrequency,
+autoSound FormantGrid_to_Sound (FormantGrid me, double samplingFrequency,
 	double tStart, double f0Start, double tMid, double f0Mid, double tEnd, double f0End,
 	double adaptFactor, double maximumPeriod, double openPhase, double collisionPhase, double power1, double power2)
 {
@@ -229,9 +229,9 @@ Sound FormantGrid_to_Sound (FormantGrid me, double samplingFrequency,
 		autoSound thee = PitchTier_to_Sound_phonation (pitch.peek(), samplingFrequency,
 			adaptFactor, maximumPeriod, openPhase, collisionPhase, power1, power2, false);
 		Sound_FormantGrid_filter_inline (thee.peek(), me);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
@@ -247,49 +247,49 @@ void FormantGrid_playPart (FormantGrid me, double tmin, double tmax, double samp
 		Vector_scale (sound.peek(), 0.99);
 		Sound_playPart (sound.peek(), tmin, tmax, playCallback, playClosure);
 	} catch (MelderError) {
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
-void FormantGrid_formula_bandwidths (FormantGrid me, const wchar_t *expression, Interpreter interpreter, FormantGrid thee) {
+void FormantGrid_formula_bandwidths (FormantGrid me, const char32 *expression, Interpreter interpreter, FormantGrid thee) {
 	try {
-		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, TRUE);
-		if (thee == NULL) thee = me;
+		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, true);
+		if (! thee) thee = me;
 		for (long irow = 1; irow <= my formants -> size; irow ++) {
 			RealTier bandwidth = (RealTier) thy bandwidths -> item [irow];
 			for (long icol = 1; icol <= bandwidth -> points -> size; icol ++) {
 				struct Formula_Result result;
 				Formula_run (irow, icol, & result);
 				if (result. result.numericResult == NUMundefined)
-					Melder_throw ("Cannot put an undefined value into the tier.\nFormula not finished.");
+					Melder_throw (U"Cannot put an undefined value into the tier.\nFormula not finished.");
 				((RealPoint) bandwidth -> points -> item [icol]) -> value = result. result.numericResult;
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": bandwidth formula not completed.");
+		Melder_throw (me, U": bandwidth formula not completed.");
 	}
 }
 
-void FormantGrid_formula_frequencies (FormantGrid me, const wchar_t *expression, Interpreter interpreter, FormantGrid thee) {
+void FormantGrid_formula_frequencies (FormantGrid me, const char32 *expression, Interpreter interpreter, FormantGrid thee) {
 	try {
-		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, TRUE);
-		if (thee == NULL) thee = me;
+		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, true);
+		if (! thee) thee = me;
 		for (long irow = 1; irow <= my formants -> size; irow ++) {
 			RealTier formant = (RealTier) thy formants -> item [irow];
 			for (long icol = 1; icol <= formant -> points -> size; icol ++) {
 				struct Formula_Result result;
 				Formula_run (irow, icol, & result);
 				if (result. result.numericResult == NUMundefined)
-					Melder_throw ("Cannot put an undefined value into the tier.\nFormula not finished.");
+					Melder_throw (U"Cannot put an undefined value into the tier.\nFormula not finished.");
 				((RealPoint) formant -> points -> item [icol]) -> value = result. result.numericResult;
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": frequency formula not completed.");
+		Melder_throw (me, U": frequency formula not completed.");
 	}
 }
 
-FormantGrid Formant_downto_FormantGrid (Formant me) {
+autoFormantGrid Formant_downto_FormantGrid (Formant me) {
 	try {
 		autoFormantGrid thee = FormantGrid_createEmpty (my xmin, my xmax, my maxnFormants);
 		for (long iframe = 1; iframe <= my nx; iframe ++) {
@@ -301,13 +301,13 @@ FormantGrid Formant_downto_FormantGrid (Formant me) {
 				FormantGrid_addBandwidthPoint (thee.peek(), iformant, t, pair -> bandwidth);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to FormantGrid.");
+		Melder_throw (me, U": not converted to FormantGrid.");
 	}
 }
 
-Formant FormantGrid_to_Formant (FormantGrid me, double dt, double intensity) {
+autoFormant FormantGrid_to_Formant (FormantGrid me, double dt, double intensity) {
 	try {
 		Melder_assert (dt > 0.0);
 		Melder_assert (intensity >= 0.0);
@@ -326,29 +326,29 @@ Formant FormantGrid_to_Formant (FormantGrid me, double dt, double intensity) {
 				formant -> bandwidth = RealTier_getValueAtTime ((RealTier) my bandwidths -> item [iformant], t);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Formant.");
+		Melder_throw (me, U": not converted to Formant.");
 	}
 }
 
-Sound Sound_Formant_filter (Sound me, Formant formant) {
+autoSound Sound_Formant_filter (Sound me, Formant formant) {
 	try {
 		autoFormantGrid grid = Formant_downto_FormantGrid (formant);
 		autoSound thee = Sound_FormantGrid_filter (me, grid.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered with ", formant, ".");
+		Melder_throw (me, U": not filtered with ", formant, U".");
 	}
 }
 
-Sound Sound_Formant_filter_noscale (Sound me, Formant formant) {
+autoSound Sound_Formant_filter_noscale (Sound me, Formant formant) {
 	try {
 		autoFormantGrid grid = Formant_downto_FormantGrid (formant);
 		autoSound thee = Sound_FormantGrid_filter_noscale (me, grid.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered with ", formant, ".");
+		Melder_throw (me, U": not filtered with ", formant, U".");
 	}
 }
 
diff --git a/fon/FormantGrid.h b/fon/FormantGrid.h
index 1dca6cf..3abe330 100644
--- a/fon/FormantGrid.h
+++ b/fon/FormantGrid.h
@@ -2,7 +2,7 @@
 #define _FormantGrid_h_
 /* FormantGrid.h
  *
- * Copyright (C) 2008-2011,2014 Paul Boersma & David Weenink
+ * Copyright (C) 2008-2011,2014,2015 Paul Boersma & David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,9 +29,9 @@ Thing_declare (Interpreter);
 oo_CLASS_CREATE (FormantGrid, Function);
 
 void FormantGrid_init (FormantGrid me, double tmin, double tmax, long numberOfFormants);
-FormantGrid FormantGrid_createEmpty (double tmin, double tmax, long numberOfFormants);
+autoFormantGrid FormantGrid_createEmpty (double tmin, double tmax, long numberOfFormants);
 
-FormantGrid FormantGrid_create (double tmin, double tmax, long numberOfFormants,
+autoFormantGrid FormantGrid_create (double tmin, double tmax, long numberOfFormants,
 	double initialFirstFormant, double initialFormantSpacing,
 	double initialFirstBandwidth, double initialBandwidthSpacing);
 
@@ -44,10 +44,10 @@ void FormantGrid_removeFormantPointsBetween (FormantGrid me, long iformant, doub
 void FormantGrid_removeBandwidthPointsBetween (FormantGrid me, long iformant, double tmin, double tmax);
 
 void Sound_FormantGrid_filter_inline (Sound me, FormantGrid formantGrid);
-Sound Sound_FormantGrid_filter (Sound me, FormantGrid formantGrid);
-Sound Sound_FormantGrid_filter_noscale (Sound me, FormantGrid formantGrid);
+autoSound Sound_FormantGrid_filter (Sound me, FormantGrid formantGrid);
+autoSound Sound_FormantGrid_filter_noscale (Sound me, FormantGrid formantGrid);
 
-Sound FormantGrid_to_Sound (FormantGrid me, double samplingFrequency,
+autoSound FormantGrid_to_Sound (FormantGrid me, double samplingFrequency,
 	double tStart, double f0Start, double tMid, double f0Mid, double tEnd, double f0End,
 	double adaptFactor, double maximumPeriod, double openPhase, double collisionPhase, double power1, double power2);
 void FormantGrid_playPart (FormantGrid me, double tmin, double tmax, double samplingFrequency,
@@ -55,14 +55,14 @@ void FormantGrid_playPart (FormantGrid me, double tmin, double tmax, double samp
 	double adaptFactor, double maximumPeriod, double openPhase, double collisionPhase, double power1, double power2,
 	int (*playCallback) (void *playClosure, int phase, double tmin, double tmax, double t), void *playClosure);
 
-void FormantGrid_formula_frequencies (FormantGrid me, const wchar_t *expression, Interpreter interpreter, FormantGrid thee);
-void FormantGrid_formula_bandwidths (FormantGrid me, const wchar_t *expression, Interpreter interpreter, FormantGrid thee);
+void FormantGrid_formula_frequencies (FormantGrid me, const char32 *expression, Interpreter interpreter, FormantGrid thee);
+void FormantGrid_formula_bandwidths (FormantGrid me, const char32 *expression, Interpreter interpreter, FormantGrid thee);
 
-FormantGrid Formant_downto_FormantGrid (Formant me);
-Formant FormantGrid_to_Formant (FormantGrid me, double dt, double intensity);
+autoFormantGrid Formant_downto_FormantGrid (Formant me);
+autoFormant FormantGrid_to_Formant (FormantGrid me, double dt, double intensity);
 
-Sound Sound_Formant_filter (Sound me, Formant formant);
-Sound Sound_Formant_filter_noscale (Sound me, Formant formant);
+autoSound Sound_Formant_filter (Sound me, Formant formant);
+autoSound Sound_Formant_filter_noscale (Sound me, Formant formant);
 
 /* End of file FormantGrid.h */
 #endif
diff --git a/fon/FormantGridEditor.cpp b/fon/FormantGridEditor.cpp
index c2c41d9..6a071d5 100644
--- a/fon/FormantGridEditor.cpp
+++ b/fon/FormantGridEditor.cpp
@@ -1,6 +1,6 @@
 /* FormantGridEditor.cpp
  *
- * Copyright (C) 2008-2011,2012,2013,2014 Paul Boersma & David Weenink
+ * Copyright (C) 2008-2011,2012,2013,2014,2015 Paul Boersma & David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@ Thing_implement (FormantGridEditor, FunctionEditor, 0);
 
 static void menu_cb_removePoints (EDITOR_ARGS) {
 	EDITOR_IAM (FormantGridEditor);
-	Editor_save (me, L"Remove point(s)");
+	Editor_save (me, U"Remove point(s)");
 	FormantGrid grid = (FormantGrid) my data;
 	Ordered tiers = my editingBandwidths ? grid -> bandwidths : grid -> formants;
 	RealTier tier = (RealTier) tiers -> item [my selectedFormant];
@@ -43,65 +43,65 @@ static void menu_cb_removePoints (EDITOR_ARGS) {
 	else
 		AnyTier_removePointsBetween (tier, my d_startSelection, my d_endSelection);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addPointAtCursor (EDITOR_ARGS) {
 	EDITOR_IAM (FormantGridEditor);
-	Editor_save (me, L"Add point");
+	Editor_save (me, U"Add point");
 	FormantGrid grid = (FormantGrid) my data;
 	Ordered tiers = my editingBandwidths ? grid -> bandwidths : grid -> formants;
 	RealTier tier = (RealTier) tiers -> item [my selectedFormant];
 	RealTier_addPoint (tier, 0.5 * (my d_startSelection + my d_endSelection), my ycursor);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addPointAt (EDITOR_ARGS) {
 	EDITOR_IAM (FormantGridEditor);
-	EDITOR_FORM (L"Add point", 0)
-		REAL (L"Time (s)", L"0.0")
-		POSITIVE (L"Frequency (Hz)", L"200.0")
+	EDITOR_FORM (U"Add point", 0)
+		REAL (U"Time (s)", U"0.0")
+		POSITIVE (U"Frequency (Hz)", U"200.0")
 	EDITOR_OK
-		SET_REAL (L"Time", 0.5 * (my d_startSelection + my d_endSelection))
-		SET_REAL (L"Frequency", my ycursor)
+		SET_REAL (U"Time", 0.5 * (my d_startSelection + my d_endSelection))
+		SET_REAL (U"Frequency", my ycursor)
 	EDITOR_DO
-		Editor_save (me, L"Add point");
+		Editor_save (me, U"Add point");
 		FormantGrid grid = (FormantGrid) my data;
 		Ordered tiers = my editingBandwidths ? grid -> bandwidths : grid -> formants;
 		RealTier tier = (RealTier) tiers -> item [my selectedFormant];
-		RealTier_addPoint (tier, GET_REAL (L"Time"), GET_REAL (L"Frequency"));
+		RealTier_addPoint (tier, GET_REAL (U"Time"), GET_REAL (U"Frequency"));
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_setFormantRange (EDITOR_ARGS) {
 	EDITOR_IAM (FormantGridEditor);
-	EDITOR_FORM (L"Set formant range", 0)
-		REAL (L"Minimum formant (Hz)", my default_formantFloor   ())
-		REAL (L"Maximum formant (Hz)", my default_formantCeiling ())
+	EDITOR_FORM (U"Set formant range", 0)
+		REAL (U"Minimum formant (Hz)", my default_formantFloor   ())
+		REAL (U"Maximum formant (Hz)", my default_formantCeiling ())
 	EDITOR_OK
-		SET_REAL (L"Minimum formant", my p_formantFloor)
-		SET_REAL (L"Maximum formant", my p_formantCeiling)
+		SET_REAL (U"Minimum formant", my p_formantFloor)
+		SET_REAL (U"Maximum formant", my p_formantCeiling)
 	EDITOR_DO
-		my pref_formantFloor   () = my p_formantFloor   = GET_REAL (L"Minimum formant");
-		my pref_formantCeiling () = my p_formantCeiling = GET_REAL (L"Maximum formant");
+		my pref_formantFloor   () = my p_formantFloor   = GET_REAL (U"Minimum formant");
+		my pref_formantCeiling () = my p_formantCeiling = GET_REAL (U"Maximum formant");
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
 
 static void menu_cb_setBandwidthRange (EDITOR_ARGS) {
 	EDITOR_IAM (FormantGridEditor);
-	EDITOR_FORM (L"Set bandwidth range", 0)
-		REAL (L"Minimum bandwidth (Hz)", my default_bandwidthFloor   ())
-		REAL (L"Maximum bandwidth (Hz)", my default_bandwidthCeiling ())
+	EDITOR_FORM (U"Set bandwidth range", 0)
+		REAL (U"Minimum bandwidth (Hz)", my default_bandwidthFloor   ())
+		REAL (U"Maximum bandwidth (Hz)", my default_bandwidthCeiling ())
 	EDITOR_OK
-		SET_REAL (L"Minimum bandwidth", my p_bandwidthFloor)
-		SET_REAL (L"Maximum bandwidth", my p_bandwidthCeiling)
+		SET_REAL (U"Minimum bandwidth", my p_bandwidthFloor)
+		SET_REAL (U"Maximum bandwidth", my p_bandwidthCeiling)
 	EDITOR_DO
-		my pref_bandwidthFloor   () = my p_bandwidthFloor   = GET_REAL (L"Minimum bandwidth");
-		my pref_bandwidthCeiling () = my p_bandwidthCeiling = GET_REAL (L"Maximum bandwidth");
+		my pref_bandwidthFloor   () = my p_bandwidthFloor   = GET_REAL (U"Minimum bandwidth");
+		my pref_bandwidthCeiling () = my p_bandwidthCeiling = GET_REAL (U"Maximum bandwidth");
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
@@ -109,7 +109,7 @@ static void menu_cb_setBandwidthRange (EDITOR_ARGS) {
 static void menu_cb_showBandwidths (EDITOR_ARGS) {
 	EDITOR_IAM (FormantGridEditor);
 	my editingBandwidths = ! my editingBandwidths;
-	my d_bandwidthsToggle -> f_check (my editingBandwidths);
+	GuiMenuItem_check (my d_bandwidthsToggle, my editingBandwidths);
 	FunctionEditor_redraw (me);
 }
 
@@ -117,7 +117,7 @@ static void selectFormantOrBandwidth (FormantGridEditor me, long iformant) {
 	FormantGrid grid = (FormantGrid) my data;
 	long numberOfFormants = grid -> formants -> size;
 	if (iformant > numberOfFormants)
-		Melder_throw ("Cannot select formant ", iformant, ", because the FormantGrid has only ", numberOfFormants, " formants.");
+		Melder_throw (U"Cannot select formant ", iformant, U", because the FormantGrid has only ", numberOfFormants, U" formants.");
 	my selectedFormant = iformant;
 	FunctionEditor_redraw (me);
 }
@@ -133,70 +133,70 @@ static void menu_cb_selectEighth  (EDITOR_ARGS) { EDITOR_IAM (FormantGridEditor)
 static void menu_cb_selectNinth   (EDITOR_ARGS) { EDITOR_IAM (FormantGridEditor); selectFormantOrBandwidth (me, 9); }
 static void menu_cb_selectFormantOrBandwidth (EDITOR_ARGS) {
 	EDITOR_IAM (FormantGridEditor);
-	EDITOR_FORM (L"Select formant or bandwidth", 0)
-		NATURAL (L"Formant number", L"1")
+	EDITOR_FORM (U"Select formant or bandwidth", 0)
+		NATURAL (U"Formant number", U"1")
 	EDITOR_OK
-		SET_INTEGER (L"Formant number", my selectedFormant)
+		SET_INTEGER (U"Formant number", my selectedFormant)
 	EDITOR_DO
-		selectFormantOrBandwidth (me, GET_INTEGER (L"Formant number"));
+		selectFormantOrBandwidth (me, GET_INTEGER (U"Formant number"));
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
 
 static void menu_cb_pitchSettings (EDITOR_ARGS) {
 	EDITOR_IAM (FormantGridEditor);
-	EDITOR_FORM (L"Source pitch settings", 0)
-		LABEL (L"", L"These settings apply to the pitch curve")
-		LABEL (L"", L"that you hear when playing the FormantGrid.")
-		REAL     (L"Starting time",       my default_source_pitch_tStart  ())
-		POSITIVE (L"Starting pitch (Hz)", my default_source_pitch_f0Start ())
-		REAL     (L"Mid time",            my default_source_pitch_tMid    ())
-		POSITIVE (L"Mid pitch (Hz)",      my default_source_pitch_f0Mid   ())
-		REAL     (L"End time",            my default_source_pitch_tEnd    ())
-		POSITIVE (L"End pitch (Hz)",      my default_source_pitch_f0End   ())
+	EDITOR_FORM (U"Source pitch settings", 0)
+		LABEL (U"", U"These settings apply to the pitch curve")
+		LABEL (U"", U"that you hear when playing the FormantGrid.")
+		REAL     (U"Starting time",       my default_source_pitch_tStart  ())
+		POSITIVE (U"Starting pitch (Hz)", my default_source_pitch_f0Start ())
+		REAL     (U"Mid time",            my default_source_pitch_tMid    ())
+		POSITIVE (U"Mid pitch (Hz)",      my default_source_pitch_f0Mid   ())
+		REAL     (U"End time",            my default_source_pitch_tEnd    ())
+		POSITIVE (U"End pitch (Hz)",      my default_source_pitch_f0End   ())
 	EDITOR_OK
-		SET_REAL (L"Starting time",  my p_source_pitch_tStart)
-		SET_REAL (L"Starting pitch", my p_source_pitch_f0Start)
-		SET_REAL (L"Mid time",       my p_source_pitch_tMid)
-		SET_REAL (L"Mid pitch",      my p_source_pitch_f0Mid)
-		SET_REAL (L"End time",       my p_source_pitch_tEnd)
-		SET_REAL (L"End pitch",      my p_source_pitch_f0End)
+		SET_REAL (U"Starting time",  my p_source_pitch_tStart)
+		SET_REAL (U"Starting pitch", my p_source_pitch_f0Start)
+		SET_REAL (U"Mid time",       my p_source_pitch_tMid)
+		SET_REAL (U"Mid pitch",      my p_source_pitch_f0Mid)
+		SET_REAL (U"End time",       my p_source_pitch_tEnd)
+		SET_REAL (U"End pitch",      my p_source_pitch_f0End)
 	EDITOR_DO
-		my pref_source_pitch_tStart  () = my p_source_pitch_tStart  = GET_REAL (L"Starting time");
-		my pref_source_pitch_f0Start () = my p_source_pitch_f0Start = GET_REAL (L"Starting pitch");
-		my pref_source_pitch_tMid    () = my p_source_pitch_tMid    = GET_REAL (L"Mid time");
-		my pref_source_pitch_f0Mid   () = my p_source_pitch_f0Mid   = GET_REAL (L"Mid pitch");
-		my pref_source_pitch_tEnd    () = my p_source_pitch_tEnd    = GET_REAL (L"End time");
-		my pref_source_pitch_f0End   () = my p_source_pitch_f0End   = GET_REAL (L"End pitch");
+		my pref_source_pitch_tStart  () = my p_source_pitch_tStart  = GET_REAL (U"Starting time");
+		my pref_source_pitch_f0Start () = my p_source_pitch_f0Start = GET_REAL (U"Starting pitch");
+		my pref_source_pitch_tMid    () = my p_source_pitch_tMid    = GET_REAL (U"Mid time");
+		my pref_source_pitch_f0Mid   () = my p_source_pitch_f0Mid   = GET_REAL (U"Mid pitch");
+		my pref_source_pitch_tEnd    () = my p_source_pitch_tEnd    = GET_REAL (U"End time");
+		my pref_source_pitch_f0End   () = my p_source_pitch_f0End   = GET_REAL (U"End pitch");
 	EDITOR_END
 }
 
 void structFormantGridEditor :: v_createMenus () {
 	FormantGridEditor_Parent :: v_createMenus ();
-	EditorMenu menu = Editor_addMenu (this, L"Formant", 0);
-	our d_bandwidthsToggle = EditorMenu_addCommand (menu, L"Show bandwidths", GuiMenu_CHECKBUTTON, menu_cb_showBandwidths);
-	EditorMenu_addCommand (menu, L"Set formant range...", 0, menu_cb_setFormantRange);
-	EditorMenu_addCommand (menu, L"Set bandwidth range...", 0, menu_cb_setBandwidthRange);
-	EditorMenu_addCommand (menu, L"-- select formant --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Select first", '1', menu_cb_selectFirst);
-	EditorMenu_addCommand (menu, L"Select second", '2', menu_cb_selectSecond);
-	EditorMenu_addCommand (menu, L"Select third", '3', menu_cb_selectThird);
-	EditorMenu_addCommand (menu, L"Select fourth", '4', menu_cb_selectFourth);
-	EditorMenu_addCommand (menu, L"Select fifth", '5', menu_cb_selectFifth);
-	EditorMenu_addCommand (menu, L"Select sixth", '6', menu_cb_selectSixth);
-	EditorMenu_addCommand (menu, L"Select seventh", '7', menu_cb_selectSeventh);
-	EditorMenu_addCommand (menu, L"Select eighth", '8', menu_cb_selectEighth);
-	EditorMenu_addCommand (menu, L"Select ninth", '9', menu_cb_selectNinth);
-	EditorMenu_addCommand (menu, L"Select formant or bandwidth...", 0, menu_cb_selectFormantOrBandwidth);
-	menu = Editor_addMenu (this, L"Point", 0);
-	EditorMenu_addCommand (menu, L"Add point at cursor", 'T', menu_cb_addPointAtCursor);
-	EditorMenu_addCommand (menu, L"Add point at...", 0, menu_cb_addPointAt);
-	EditorMenu_addCommand (menu, L"-- remove point --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Remove point(s)", GuiMenu_OPTION + 'T', menu_cb_removePoints);
+	EditorMenu menu = Editor_addMenu (this, U"Formant", 0);
+	our d_bandwidthsToggle = EditorMenu_addCommand (menu, U"Show bandwidths", GuiMenu_CHECKBUTTON, menu_cb_showBandwidths);
+	EditorMenu_addCommand (menu, U"Set formant range...", 0, menu_cb_setFormantRange);
+	EditorMenu_addCommand (menu, U"Set bandwidth range...", 0, menu_cb_setBandwidthRange);
+	EditorMenu_addCommand (menu, U"-- select formant --", 0, nullptr);
+	EditorMenu_addCommand (menu, U"Select first", '1', menu_cb_selectFirst);
+	EditorMenu_addCommand (menu, U"Select second", '2', menu_cb_selectSecond);
+	EditorMenu_addCommand (menu, U"Select third", '3', menu_cb_selectThird);
+	EditorMenu_addCommand (menu, U"Select fourth", '4', menu_cb_selectFourth);
+	EditorMenu_addCommand (menu, U"Select fifth", '5', menu_cb_selectFifth);
+	EditorMenu_addCommand (menu, U"Select sixth", '6', menu_cb_selectSixth);
+	EditorMenu_addCommand (menu, U"Select seventh", '7', menu_cb_selectSeventh);
+	EditorMenu_addCommand (menu, U"Select eighth", '8', menu_cb_selectEighth);
+	EditorMenu_addCommand (menu, U"Select ninth", '9', menu_cb_selectNinth);
+	EditorMenu_addCommand (menu, U"Select formant or bandwidth...", 0, menu_cb_selectFormantOrBandwidth);
+	menu = Editor_addMenu (this, U"Point", 0);
+	EditorMenu_addCommand (menu, U"Add point at cursor", 'T', menu_cb_addPointAtCursor);
+	EditorMenu_addCommand (menu, U"Add point at...", 0, menu_cb_addPointAt);
+	EditorMenu_addCommand (menu, U"-- remove point --", 0, nullptr);
+	EditorMenu_addCommand (menu, U"Remove point(s)", GuiMenu_OPTION + 'T', menu_cb_removePoints);
 	if (our v_hasSourceMenu ()) {
-		menu = Editor_addMenu (this, L"Source", 0);
-		EditorMenu_addCommand (menu, L"Pitch settings...", 0, menu_cb_pitchSettings);
-		//EditorMenu_addCommand (menu, L"Phonation settings...", 0, menu_cb_phonationSettings);
+		menu = Editor_addMenu (this, U"Source", 0);
+		EditorMenu_addCommand (menu, U"Pitch settings...", 0, menu_cb_pitchSettings);
+		//EditorMenu_addCommand (menu, U"Phonation settings...", 0, menu_cb_phonationSettings);
 	}
 }
 
@@ -215,12 +215,12 @@ void structFormantGridEditor :: v_draw () {
 	Graphics_setColour (our d_graphics, Graphics_RED);
 	Graphics_line (our d_graphics, our d_startWindow, our ycursor, our d_endWindow, our ycursor);
 	Graphics_setTextAlignment (our d_graphics, Graphics_RIGHT, Graphics_HALF);
-	Graphics_text1 (our d_graphics, our d_startWindow, our ycursor, Melder_float (Melder_half (our ycursor)));
+	Graphics_text (our d_graphics, our d_startWindow, our ycursor, Melder_float (Melder_half (our ycursor)));
 	Graphics_setColour (our d_graphics, Graphics_BLUE);
 	Graphics_setTextAlignment (our d_graphics, Graphics_LEFT, Graphics_TOP);
-	Graphics_text2 (our d_graphics, our d_endWindow, ymax, Melder_float (Melder_half (ymax)), L" Hz");
+	Graphics_text (our d_graphics, our d_endWindow, ymax, Melder_float (Melder_half (ymax)), U" Hz");
 	Graphics_setTextAlignment (our d_graphics, Graphics_LEFT, Graphics_HALF);
-	Graphics_text2 (our d_graphics, our d_endWindow, ymin, Melder_float (Melder_half (ymin)), L" Hz");
+	Graphics_text (our d_graphics, our d_endWindow, ymin, Melder_float (Melder_half (ymin)), U" Hz");
 	Graphics_setLineWidth (our d_graphics, 1);
 	Graphics_setColour (our d_graphics, Graphics_GREY);
 	for (long iformant = 1; iformant <= grid -> formants -> size; iformant ++) if (iformant != our selectedFormant) {
@@ -261,7 +261,7 @@ void structFormantGridEditor :: v_draw () {
 	if (n == 0) {
 		Graphics_setTextAlignment (our d_graphics, Graphics_CENTRE, Graphics_HALF);
 		Graphics_text (our d_graphics, 0.5 * (our d_startWindow + our d_endWindow),
-			0.5 * (ymin + ymax), L"(no points in selected formant tier)");
+			0.5 * (ymin + ymax), U"(no points in selected formant tier)");
 	} else if (imax < imin) {
 		double yleft = RealTier_getValueAtTime (selectedTier, our d_startWindow);
 		double yright = RealTier_getValueAtTime (selectedTier, our d_endWindow);
@@ -317,10 +317,10 @@ static void drawWhileDragging (FormantGridEditor me, double xWC, double yWC, lon
 		double t = point -> number + dt, y = point -> value + dy;
 		Graphics_line (my d_graphics, t, ymin, t, ymax - Graphics_dyMMtoWC (my d_graphics, 4.0));
 		Graphics_setTextAlignment (my d_graphics, kGraphics_horizontalAlignment_CENTRE, Graphics_TOP);
-		Graphics_text1 (my d_graphics, t, ymax, Melder_fixed (t, 6));
+		Graphics_text (my d_graphics, t, ymax, Melder_fixed (t, 6));
 		Graphics_line (my d_graphics, my d_startWindow, y, my d_endWindow, y);
 		Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_BOTTOM);
-		Graphics_text1 (my d_graphics, my d_startWindow, y, Melder_fixed (y, 6));
+		Graphics_text (my d_graphics, my d_startWindow, y, Melder_fixed (y, 6));
 	}
 }
 
@@ -363,10 +363,10 @@ int structFormantGridEditor :: v_click (double xWC, double yWC, bool shiftKeyPre
 	if (draggingSelection) {
 		ifirstSelected = AnyTier_timeToHighIndex (tier, our d_startSelection);
 		ilastSelected = AnyTier_timeToLowIndex (tier, our d_endSelection);
-		Editor_save (this, L"Drag points");
+		Editor_save (this, U"Drag points");
 	} else {
 		ifirstSelected = ilastSelected = inearestPoint;
-		Editor_save (this, L"Drag point");
+		Editor_save (this, U"Drag point");
 	}
 
 	/*
@@ -433,7 +433,7 @@ int structFormantGridEditor :: v_click (double xWC, double yWC, bool shiftKeyPre
 		our ycursor += df;
 	}
 
-	our broadcastDataChanged ();
+	Editor_broadcastDataChanged (this);
 	return 1;   // update needed
 }
 
@@ -448,21 +448,21 @@ void structFormantGridEditor :: v_play (double tmin, double tmax) {
 		theFunctionEditor_playCallback, this);
 }
 
-void FormantGridEditor_init (FormantGridEditor me, const wchar_t *title, FormantGrid data) {
-	Melder_assert (data != NULL);
-	Melder_assert (Thing_member (data, classFormantGrid));
+void FormantGridEditor_init (FormantGridEditor me, const char32 *title, FormantGrid data) {
+	Melder_assert (data != nullptr);
+	Melder_assert (Thing_isa (data, classFormantGrid));
 	FunctionEditor_init (me, title, data);
 	my ycursor = 0.382 * my p_formantFloor + 0.618 * my p_formantCeiling;
 	my selectedFormant = 1;
 }
 
-FormantGridEditor FormantGridEditor_create (const wchar_t *title, FormantGrid data) {
+autoFormantGridEditor FormantGridEditor_create (const char32 *title, FormantGrid data) {
 	try {
 		autoFormantGridEditor me = Thing_new (FormantGridEditor);
 		FormantGridEditor_init (me.peek(), title, data);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("FormantGrid window not created.");
+		Melder_throw (U"FormantGrid window not created.");
 	}
 }
 
diff --git a/fon/FormantGridEditor.h b/fon/FormantGridEditor.h
index 84cb339..ec1ae73 100644
--- a/fon/FormantGridEditor.h
+++ b/fon/FormantGridEditor.h
@@ -2,7 +2,7 @@
 #define _FormantGridEditor_h_
 /* FormantGridEditor.h
  *
- * Copyright (C) 2008-2011,2012,2013 Paul Boersma & David Weenink
+ * Copyright (C) 2008-2011,2012,2013,2015 Paul Boersma & David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,26 +23,28 @@
 #include "FormantGrid.h"
 
 Thing_define (FormantGridEditor, FunctionEditor) {
-	// new data:
-	public:
-		bool editingBandwidths;
-		GuiMenuItem d_bandwidthsToggle;
-		long selectedFormant;
-		double ycursor;
-	// overridden methods:
-		virtual void v_createMenus ();
-		virtual void v_draw ();
-		virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
-		virtual void v_play (double tmin, double tmax);
-	// new methods:
-		virtual bool v_hasSourceMenu () { return true; }
-	// preferences:
-		#include "FormantGridEditor_prefs.h"
+	bool editingBandwidths;
+	GuiMenuItem d_bandwidthsToggle;
+	long selectedFormant;
+	double ycursor;
+
+	void v_createMenus ()
+		override;
+	void v_draw ()
+		override;
+	int v_click (double xWC, double yWC, bool shiftKeyPressed)
+		override;
+	void v_play (double tmin, double tmax)
+		override;
+
+	virtual bool v_hasSourceMenu () { return true; }
+
+	#include "FormantGridEditor_prefs.h"
 };
 
-void FormantGridEditor_init (FormantGridEditor me, const wchar_t *title, FormantGrid data);
+void FormantGridEditor_init (FormantGridEditor me, const char32 *title, FormantGrid data);
 
-FormantGridEditor FormantGridEditor_create (const wchar_t *title, FormantGrid data);
+autoFormantGridEditor FormantGridEditor_create (const char32 *title, FormantGrid data);
 
 /* End of file FormantGridEditor.h */
 #endif
diff --git a/fon/FormantGridEditor_prefs.h b/fon/FormantGridEditor_prefs.h
index d74dc6e..6805d92 100644
--- a/fon/FormantGridEditor_prefs.h
+++ b/fon/FormantGridEditor_prefs.h
@@ -1,6 +1,6 @@
 /* FormantGridEditor_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,24 +18,25 @@
  */
 
 prefs_begin (FormantGridEditor)
-	// new:
-		prefs_add_double_with_data (FormantGridEditor, formantFloor,                    1, L"0.0")   // Hz
-		prefs_add_double_with_data (FormantGridEditor, formantCeiling,                  1, L"11000.0")   // Hz
-		prefs_add_double_with_data (FormantGridEditor, bandwidthFloor,                  1, L"0.0")   // Hz
-		prefs_add_double_with_data (FormantGridEditor, bandwidthCeiling,                1, L"1000.0")   // Hz
-		prefs_add_double_with_data (FormantGridEditor, play_samplingFrequency,          1, L"44100.0")   // Hz
-		prefs_add_double_with_data (FormantGridEditor, source_pitch_tStart,             1, L"0.0%")   // relative time
-		prefs_add_double_with_data (FormantGridEditor, source_pitch_f0Start,            1, L"150.0")   // Hz
-		prefs_add_double_with_data (FormantGridEditor, source_pitch_tMid,               1, L"25.0%")   // relative time
-		prefs_add_double_with_data (FormantGridEditor, source_pitch_f0Mid,              1, L"180.0")   // Hz
-		prefs_add_double_with_data (FormantGridEditor, source_pitch_tEnd,               1, L"100.0%")   // relative time
-		prefs_add_double_with_data (FormantGridEditor, source_pitch_f0End,              1, L"120.0")   // Hz
-		prefs_add_double_with_data (FormantGridEditor, source_phonation_adaptFactor,    1, L"1.0")
-		prefs_add_double_with_data (FormantGridEditor, source_phonation_maximumPeriod,  1, L"0.05")
-		prefs_add_double_with_data (FormantGridEditor, source_phonation_openPhase,      1, L"0.7")
-		prefs_add_double_with_data (FormantGridEditor, source_phonation_collisionPhase, 1, L"0.03")
-		prefs_add_double_with_data (FormantGridEditor, source_phonation_power1,         1, L"3.0")
-		prefs_add_double_with_data (FormantGridEditor, source_phonation_power2,         1, L"4.0")
+
+	prefs_add_double_with_data (FormantGridEditor, formantFloor,                    1, U"0.0")   // Hz
+	prefs_add_double_with_data (FormantGridEditor, formantCeiling,                  1, U"11000.0")   // Hz
+	prefs_add_double_with_data (FormantGridEditor, bandwidthFloor,                  1, U"0.0")   // Hz
+	prefs_add_double_with_data (FormantGridEditor, bandwidthCeiling,                1, U"1000.0")   // Hz
+	prefs_add_double_with_data (FormantGridEditor, play_samplingFrequency,          1, U"44100.0")   // Hz
+	prefs_add_double_with_data (FormantGridEditor, source_pitch_tStart,             1, U"0.0%")   // relative time
+	prefs_add_double_with_data (FormantGridEditor, source_pitch_f0Start,            1, U"150.0")   // Hz
+	prefs_add_double_with_data (FormantGridEditor, source_pitch_tMid,               1, U"25.0%")   // relative time
+	prefs_add_double_with_data (FormantGridEditor, source_pitch_f0Mid,              1, U"180.0")   // Hz
+	prefs_add_double_with_data (FormantGridEditor, source_pitch_tEnd,               1, U"100.0%")   // relative time
+	prefs_add_double_with_data (FormantGridEditor, source_pitch_f0End,              1, U"120.0")   // Hz
+	prefs_add_double_with_data (FormantGridEditor, source_phonation_adaptFactor,    1, U"1.0")
+	prefs_add_double_with_data (FormantGridEditor, source_phonation_maximumPeriod,  1, U"0.05")
+	prefs_add_double_with_data (FormantGridEditor, source_phonation_openPhase,      1, U"0.7")
+	prefs_add_double_with_data (FormantGridEditor, source_phonation_collisionPhase, 1, U"0.03")
+	prefs_add_double_with_data (FormantGridEditor, source_phonation_power1,         1, U"3.0")
+	prefs_add_double_with_data (FormantGridEditor, source_phonation_power2,         1, U"4.0")
+
 prefs_end (FormantGridEditor)
 
 /* End of file FormantGridEditor_prefs.h */
diff --git a/fon/FormantGrid_def.h b/fon/FormantGrid_def.h
index 0222f20..398b004 100644
--- a/fon/FormantGrid_def.h
+++ b/fon/FormantGrid_def.h
@@ -1,6 +1,6 @@
 /* FormantGrid_def.h
  *
- * Copyright (C) 2008-2011 Paul Boersma & David Weenink
+ * Copyright (C) 2008-2011,2015 Paul Boersma & David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,13 +24,20 @@ oo_DEFINE_CLASS (FormantGrid, Function)
 	oo_COLLECTION (Ordered, bandwidths, RealTier, 0)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual bool v_hasGetVector    () { return true; }   virtual double v_getVector    (long irow, long icol);
-			virtual bool v_hasGetFunction1 () { return true; }   virtual double v_getFunction1 (long irow, double x);
-			virtual const wchar_t * v_getUnitText (long ilevel, int unit, unsigned long flags)
-				{ (void) unit; (void) flags; return ilevel & 1 ? L"Formant (Hz)" : L"Bandwidth (Hz)"; }
-			virtual void v_shiftX (double xfrom, double xto);
-			virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		bool v_hasGetVector ()
+			override { return true; }
+		double v_getVector (long irow, long icol)
+			override;
+		bool v_hasGetFunction1 ()
+			override { return true; }
+		double v_getFunction1 (long irow, double x)
+			override;
+		const char32 * v_getUnitText (long ilevel, int /* unit */, unsigned long /* flags */)
+			override { return ilevel & 1 ? U"Formant (Hz)" : U"Bandwidth (Hz)"; }
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
 	#endif
 
 oo_END_CLASS (FormantGrid)
diff --git a/fon/FormantTier.cpp b/fon/FormantTier.cpp
index 5d41d95..4c4dbdd 100644
--- a/fon/FormantTier.cpp
+++ b/fon/FormantTier.cpp
@@ -1,6 +1,6 @@
 /* FormantTier.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,29 +49,29 @@
 #include "oo_DESCRIPTION.h"
 #include "FormantTier_def.h"
 
-Thing_implement (FormantPoint, Data, 0);
+Thing_implement (FormantPoint, Daata, 0);
 
-FormantPoint FormantPoint_create (double time) {
+autoFormantPoint FormantPoint_create (double time) {
 	try {
 		autoFormantPoint me = Thing_new (FormantPoint);
 		my time = time;
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Formant point not created.");
+		Melder_throw (U"Formant point not created.");
 	}
 }
 
 Thing_implement (FormantTier, Function, 0);
 
-FormantTier FormantTier_create (double tmin, double tmax) {
+autoFormantTier FormantTier_create (double tmin, double tmax) {
 	try {
 		autoFormantTier me = Thing_new (FormantTier);
 		my points = SortedSetOfDouble_create ();
 		my xmin = tmin;
 		my xmax = tmax;
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("FormantTier not created.");
+		Melder_throw (U"FormantTier not created.");
 	}
 }
 
@@ -150,14 +150,14 @@ void FormantTier_speckle (FormantTier me, Graphics g, double tmin, double tmax,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, TRUE, L"Time (s)");
-		Graphics_marksBottom (g, 2, TRUE, TRUE, FALSE);
-		Graphics_marksLeft (g, 2, TRUE, TRUE, FALSE);
-		Graphics_textLeft (g, TRUE, L"Frequency (Hz)");
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Frequency (Hz)");
 	}
 }
 
-FormantTier Formant_downto_FormantTier (Formant me) {
+autoFormantTier Formant_downto_FormantTier (Formant me) {
 	try {
 		autoFormantTier thee = FormantTier_create (my xmin, my xmax);
 		for (long i = 1; i <= my nx; i ++) {
@@ -171,13 +171,13 @@ FormantTier Formant_downto_FormantTier (Formant me) {
 			}
 			Collection_addItem (thy points, point.transfer());
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to FormantTier.");
+		Melder_throw (me, U": not converted to FormantTier.");
 	}
 }
 
-FormantTier Formant_PointProcess_to_FormantTier (Formant me, PointProcess pp) {
+autoFormantTier Formant_PointProcess_to_FormantTier (Formant me, PointProcess pp) {
 	try {
 		autoFormantTier temp = Formant_downto_FormantTier (me);
 		autoFormantTier thee = FormantTier_create (pp -> xmin, pp -> xmax);
@@ -196,9 +196,9 @@ FormantTier Formant_PointProcess_to_FormantTier (Formant me, PointProcess pp) {
 			point -> numberOfFormants = iformant - 1;
 			Collection_addItem (thy points, point.transfer());
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", pp, ": not converted to FormantTier.");
+		Melder_throw (me, U" & ", pp, U": not converted to FormantTier.");
 	}
 }
 
@@ -222,21 +222,21 @@ int FormantTier_getMaxNumFormants (FormantTier me) {
 	return maxNumFormants;
 }
 	
-TableOfReal FormantTier_downto_TableOfReal (FormantTier me, int includeFormants, int includeBandwidths) {
+autoTableOfReal FormantTier_downto_TableOfReal (FormantTier me, int includeFormants, int includeBandwidths) {
 	try {
 		int maximumNumberOfFormants = FormantTier_getMaxNumFormants (me);
 		autoTableOfReal thee = TableOfReal_create (my points -> size, 1 +
 			( includeFormants ? maximumNumberOfFormants : 0 ) +
 			( includeBandwidths ? maximumNumberOfFormants : 0 ));
-		TableOfReal_setColumnLabel (thee.peek(), 1, L"Time");
+		TableOfReal_setColumnLabel (thee.peek(), 1, U"Time");
 		for (long icol = 1, iformant = 1; iformant <= maximumNumberOfFormants; iformant ++) {
-			wchar_t label [4];
+			char32 label [4];
 			if (includeFormants) {
-				swprintf (label, 4, L"F%d", iformant);
+				Melder_sprint (label,4, U"F", iformant);
 				TableOfReal_setColumnLabel (thee.peek(), ++ icol, label);
 			}
 			if (includeBandwidths) {
-				swprintf (label, 4, L"B%d", iformant);
+				Melder_sprint (label,4, U"B", iformant);
 				TableOfReal_setColumnLabel (thee.peek(), ++ icol, label);
 			}
 		}
@@ -248,9 +248,9 @@ TableOfReal FormantTier_downto_TableOfReal (FormantTier me, int includeFormants,
 				if (includeBandwidths) thy data [ipoint] [++ icol] = point -> bandwidth [iformant-1];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TableOfReal.");
+		Melder_throw (me, U": not converted to TableOfReal.");
 	}
 }
 
@@ -288,24 +288,24 @@ void Sound_FormantTier_filter_inline (Sound me, FormantTier formantTier) {
 	}
 }
 
-Sound Sound_FormantTier_filter (Sound me, FormantTier formantTier) {
+autoSound Sound_FormantTier_filter (Sound me, FormantTier formantTier) {
 	try {
 		autoSound thee = Data_copy (me);
 		Sound_FormantTier_filter_inline (thee.peek(), formantTier);
 		Vector_scale (thee.peek(), 0.99);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered with ", formantTier, ".");
+		Melder_throw (me, U": not filtered with ", formantTier, U".");
 	}
 }
 
-Sound Sound_FormantTier_filter_noscale (Sound me, FormantTier formantTier) {
+autoSound Sound_FormantTier_filter_noscale (Sound me, FormantTier formantTier) {
 	try {
 		autoSound thee = Data_copy (me);
 		Sound_FormantTier_filter_inline (thee.peek(), formantTier);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered with ", formantTier, ".");
+		Melder_throw (me, U": not filtered with ", formantTier, U".");
 	}
 }
 
diff --git a/fon/FormantTier.h b/fon/FormantTier.h
index 354997d..bb5480a 100644
--- a/fon/FormantTier.h
+++ b/fon/FormantTier.h
@@ -2,7 +2,7 @@
 #define _FormantTier_h_
 /* FormantTier.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,23 +25,23 @@
 #include "Sound.h"
 
 #include "FormantTier_def.h"
-oo_CLASS_CREATE (FormantPoint, Data);
+oo_CLASS_CREATE (FormantPoint, Daata);
 oo_CLASS_CREATE (FormantTier, Function);
 
-FormantPoint FormantPoint_create (double time);
-FormantTier FormantTier_create (double tmin, double tmax);
+autoFormantPoint FormantPoint_create (double time);
+autoFormantTier FormantTier_create (double tmin, double tmax);
 double FormantTier_getValueAtTime (FormantTier me, int iformant, double t);
 double FormantTier_getBandwidthAtTime (FormantTier me, int iformant, double t);
 int FormantTier_getMinNumFormants (FormantTier me);
 int FormantTier_getMaxNumFormants (FormantTier me);
 void FormantTier_speckle (FormantTier me, Graphics g, double tmin, double tmax, double fmax, int garnish);
-FormantTier Formant_downto_FormantTier (Formant me);
-FormantTier Formant_PointProcess_to_FormantTier (Formant me, PointProcess pp);
-TableOfReal FormantTier_downto_TableOfReal (FormantTier me, int includeFormants, int includeBandwidths);
+autoFormantTier Formant_downto_FormantTier (Formant me);
+autoFormantTier Formant_PointProcess_to_FormantTier (Formant me, PointProcess pp);
+autoTableOfReal FormantTier_downto_TableOfReal (FormantTier me, int includeFormants, int includeBandwidths);
 
 void Sound_FormantTier_filter_inline (Sound me, FormantTier formantTier);
-Sound Sound_FormantTier_filter (Sound me, FormantTier formantTier);
-Sound Sound_FormantTier_filter_noscale (Sound me, FormantTier formantTier);
+autoSound Sound_FormantTier_filter (Sound me, FormantTier formantTier);
+autoSound Sound_FormantTier_filter_noscale (Sound me, FormantTier formantTier);
 
 /* End of file FormantTier.h */
 #endif
diff --git a/fon/FormantTier_def.h b/fon/FormantTier_def.h
index 364e42d..9f187df 100644
--- a/fon/FormantTier_def.h
+++ b/fon/FormantTier_def.h
@@ -19,7 +19,7 @@
 
 
 #define ooSTRUCT FormantPoint
-oo_DEFINE_CLASS (FormantPoint, Data)
+oo_DEFINE_CLASS (FormantPoint, Daata)
 
 	oo_DOUBLE (time)   /* AnyPoint */
 	oo_INT (numberOfFormants)
diff --git a/fon/Formant_def.h b/fon/Formant_def.h
index 80e30da..4f2b7b1 100644
--- a/fon/Formant_def.h
+++ b/fon/Formant_def.h
@@ -1,6 +1,6 @@
 /* Formant_def.h
  *
- * Copyright (C) 1992-2002 Paul Boersma
+ * Copyright (C) 1992-2002,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,7 +22,7 @@
 oo_DEFINE_STRUCT (Formant_Formant)
 
 	#if oo_READING
-		if (localVersion <= 1) {
+		if (formatVersion <= 1) {
 			oo_FLOAT (frequency)
 			oo_FLOAT (bandwidth)
 		} else {
@@ -61,10 +61,12 @@ oo_DEFINE_CLASS (Formant, Sampled)
 	oo_STRUCT_VECTOR (Formant_Frame, d_frames, nx)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
-			virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
-			virtual double v_getValueAtSample (long iframe, long which, int units);
+		void v_info ()
+			override;
+		int v_domainQuantity ()
+			override { return MelderQuantity_TIME_SECONDS; }
+		double v_getValueAtSample (long iframe, long which, int units)
+			override;
 	#endif
 
 oo_END_CLASS (Formant)
diff --git a/fon/FujisakiPitch.cpp b/fon/FujisakiPitch.cpp
index 7030f1d..5bdb214 100644
--- a/fon/FujisakiPitch.cpp
+++ b/fon/FujisakiPitch.cpp
@@ -1,6 +1,6 @@
 /* FujisakiPitch.cpp
  *
- * Copyright (C) 2002-2011 Paul Boersma
+ * Copyright (C) 2002-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,20 +46,20 @@
 
 Thing_implement (FujisakiCommand, Function, 0);
 
-FujisakiCommand FujisakiCommand_create (double tmin, double tmax, double amplitude) {
+autoFujisakiCommand FujisakiCommand_create (double tmin, double tmax, double amplitude) {
 	try {
 		autoFujisakiCommand me = Thing_new (FujisakiCommand);
 		Function_init (me.peek(), tmin, tmax);
 		my amplitude = amplitude;
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Fujisaki command not created.");
+		Melder_throw (U"Fujisaki command not created.");
 	}
 }
 
 Thing_implement (FujisakiPitch, Function, 0);
 
-FujisakiPitch FujisakiPitch_create (double tmin, double tmax,
+autoFujisakiPitch FujisakiPitch_create (double tmin, double tmax,
 	double baseFrequency, double alpha, double beta, double gamma)
 {
 	try {
@@ -71,14 +71,14 @@ FujisakiPitch FujisakiPitch_create (double tmin, double tmax,
 		my gamma = gamma;
 		my phraseCommands = SortedSetOfDouble_create ();
 		my accentCommands = SortedSetOfDouble_create ();
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("FujisakiPitch not created.");
+		Melder_throw (U"FujisakiPitch not created.");
 	}
 }
 
-FujisakiPitch Pitch_to_FujisakiPitch (Pitch me, double gamma, double timeResolution,
-	FujisakiPitch *intermediate1, FujisakiPitch *intermediate2, FujisakiPitch *intermediate3)
+autoFujisakiPitch Pitch_to_FujisakiPitch (Pitch me, double gamma, double timeResolution,
+	autoFujisakiPitch *intermediate1, autoFujisakiPitch *intermediate2, autoFujisakiPitch *intermediate3)
 {
 	(void) timeResolution;
 	try {
@@ -122,9 +122,9 @@ FujisakiPitch Pitch_to_FujisakiPitch (Pitch me, double gamma, double timeResolut
 			FujisakiCommand accentCommand = (FujisakiCommand) thy accentCommands -> item [i];
 			/* ... */
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to FujisakiPitch.");
+		Melder_throw (me, U": not converted to FujisakiPitch.");
 	}
 }
 
diff --git a/fon/FujisakiPitch.h b/fon/FujisakiPitch.h
index 2df4681..bf46a0e 100644
--- a/fon/FujisakiPitch.h
+++ b/fon/FujisakiPitch.h
@@ -2,7 +2,7 @@
 #define _FujisakiPitch_h_
 /* FujisakiPitch.h
  *
- * Copyright (C) 2002-2011 Paul Boersma
+ * Copyright (C) 2002-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,13 +26,13 @@
 oo_CLASS_CREATE (FujisakiCommand, Function);
 oo_CLASS_CREATE (FujisakiPitch, Function);
 
-FujisakiCommand FujisakiCommand_create (double tmin, double tmax, double amplitude);
+autoFujisakiCommand FujisakiCommand_create (double tmin, double tmax, double amplitude);
 
-FujisakiPitch FujisakiPitch_create (double tmin, double tmax,
+autoFujisakiPitch FujisakiPitch_create (double tmin, double tmax,
 	double baseFrequency, double alpha, double beta, double gamma);
 
-FujisakiPitch Pitch_to_FujisakiPitch (Pitch me, double gamma, double timeResolution,
-	FujisakiPitch *intermediate1, FujisakiPitch *intermediate2, FujisakiPitch *intermediate3);
+autoFujisakiPitch Pitch_to_FujisakiPitch (Pitch me, double gamma, double timeResolution,
+	autoFujisakiPitch *intermediate1, autoFujisakiPitch *intermediate2, autoFujisakiPitch *intermediate3);
 
 /* End of file FujisakiPitch.h */
 #endif
diff --git a/fon/Function.cpp b/fon/Function.cpp
index 137699b..913c212 100644
--- a/fon/Function.cpp
+++ b/fon/Function.cpp
@@ -1,6 +1,6 @@
 /* Function.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,13 +38,13 @@
 #include "oo_DESCRIPTION.h"
 #include "Function_def.h"
 
-Thing_implement (Function, Data, 0);
+Thing_implement (Function, Daata, 0);
 
 void structFunction :: v_info () {
 	Function_Parent :: v_info ();
-	MelderInfo_writeLine (L"Domain:");
-	MelderInfo_writeLine (L"   xmin: ", Melder_double (xmin));
-	MelderInfo_writeLine (L"   xmax: ", Melder_double (xmax));
+	MelderInfo_writeLine (U"Domain:");
+	MelderInfo_writeLine (U"   xmin: ", xmin);
+	MelderInfo_writeLine (U"   xmax: ", xmax);
 }
 
 void structFunction :: v_shiftX (double xfrom, double xto) {
@@ -74,7 +74,7 @@ int Function_getDomainQuantity (Function me) {
 	return my v_domainQuantity ();
 }
 
-const wchar_t * Function_getUnitText (Function me, long ilevel, int unit, unsigned long flags) {
+const char32 * Function_getUnitText (Function me, long ilevel, int unit, unsigned long flags) {
 	Melder_assert (unit >= my v_getMinimumUnit (ilevel) && unit <= my v_getMaximumUnit (ilevel));
 	return my v_getUnitText (ilevel, unit, flags);
 }
@@ -135,11 +135,11 @@ double Function_window (double tim, int windowType) {
 			return 0.54 + 0.46 * cos (2 * NUMpi * tim);
 		case Function_KAISER12:
 			if (tim < -0.77 || tim > 0.77) return 0.0;
-			if (! one_by_bessi_0_12) one_by_bessi_0_12 = 1.0 / NUMbessel_i0_f (12);
+			if (one_by_bessi_0_12 == 0.0) one_by_bessi_0_12 = 1.0 / NUMbessel_i0_f (12);
 			return NUMbessel_i0_f (12 * sqrt (1 - (1.0 / 0.77 / 0.77) * tim * tim)) * one_by_bessi_0_12;
 		case Function_KAISER20:
 			if (tim <= -1 || tim >= 1) return 0.0;
-			if (! one_by_bessi_0_20) one_by_bessi_0_20 = 1.0 / NUMbessel_i0_f (20.24);
+			if (one_by_bessi_0_20 == 0.0) one_by_bessi_0_20 = 1.0 / NUMbessel_i0_f (20.24);
 			return NUMbessel_i0_f (20.24 * sqrt (1 - tim * tim)) * one_by_bessi_0_20;
 		case Function_GAUSSIAN:
 			return exp ((- NUMpi * NUMpi) * tim * tim);
diff --git a/fon/Function.h b/fon/Function.h
index 14ec6d2..5f99dbb 100644
--- a/fon/Function.h
+++ b/fon/Function.h
@@ -2,7 +2,7 @@
 #define _Function_h_
 /* Function.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,7 +22,7 @@
 #include "Data.h"
 
 #include "Function_def.h"
-oo_CLASS_CREATE (Function, Data);
+oo_CLASS_CREATE (Function, Daata);
 
 /*
 	An object of type Function represents a function f (x, ...) on the domain [xmin, xmax] * ....
@@ -56,7 +56,7 @@ int Function_getMaximumUnit (Function me, long ilevel);
 #define Function_UNIT_TEXT_SHORT            0x00000001
 #define Function_UNIT_TEXT_GRAPHICAL        0x00000002
 #define Function_UNIT_TEXT_MENU             0x00000004
-const wchar_t * Function_getUnitText (Function me, long ilevel, int unit, unsigned long flags);
+const char32 * Function_getUnitText (Function me, long ilevel, int unit, unsigned long flags);
 
 bool Function_isUnitLogarithmic (Function me, long ilevel, int unit);
 
diff --git a/fon/FunctionEditor.cpp b/fon/FunctionEditor.cpp
index 908e0a6..713271a 100644
--- a/fon/FunctionEditor.cpp
+++ b/fon/FunctionEditor.cpp
@@ -1,6 +1,6 @@
 /* FunctionEditor.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -43,9 +43,11 @@ Thing_implement (FunctionEditor, Editor, 0);
 #include "prefs_copyToInstance.h"
 #include "FunctionEditor_prefs.h"
 
-#define maxGroup 100
-static int nGroup = 0;
-static FunctionEditor theGroup [1 + maxGroup];
+namespace {
+	constexpr int maxGroup { 100 };
+	int nGroup = 0;
+	FunctionEditor theGroup [1 + maxGroup];
+}
 
 static void drawWhileDragging (FunctionEditor me, double x1, double x2);
 
@@ -59,16 +61,16 @@ static int group_equalDomain (double tmin, double tmax) {
 
 static void updateScrollBar (FunctionEditor me) {
 /* We cannot call this immediately after creation. */
-	int slider_size = (my d_endWindow - my d_startWindow) / (my tmax - my tmin) * maximumScrollBarValue - 1;
-	int increment, page_increment;
-	int value = (my d_startWindow - my tmin) / (my tmax - my tmin) * maximumScrollBarValue + 1;
+	double slider_size = (my d_endWindow - my d_startWindow) / (my tmax - my tmin) * maximumScrollBarValue - 1;
+	double increment, page_increment;
+	double value = (my d_startWindow - my tmin) / (my tmax - my tmin) * maximumScrollBarValue + 1;
 	if (slider_size < 1) slider_size = 1;
 	if (value > maximumScrollBarValue - slider_size)
 		value = maximumScrollBarValue - slider_size;
 	if (value < 1) value = 1;
 	increment = slider_size / SCROLL_INCREMENT_FRACTION + 1;
 	page_increment = RELATIVE_PAGE_INCREMENT * slider_size + 1;
-	my scrollBar -> f_set (NUMundefined, maximumScrollBarValue, value, slider_size, increment, page_increment);
+	GuiScrollBar_set (my scrollBar, NUMundefined, maximumScrollBarValue, value, slider_size, increment, page_increment);
 }
 
 static void updateGroup (FunctionEditor me) {
@@ -94,7 +96,6 @@ static void drawNow (FunctionEditor me) {
 	int selection = my d_endSelection > my d_startSelection;
 	int beginVisible, endVisible;
 	double verticalCorrection;
-	wchar_t text [100];
 
 	/* Update selection. */
 
@@ -220,7 +221,7 @@ static void drawNow (FunctionEditor me) {
 		double left = my rect [i]. left, right = my rect [i]. right;
 		double bottom = my rect [i]. bottom, top = my rect [i]. top;
 		if (left < right) {
-			const wchar_t *format = my v_format_long ();
+			const char *format = my v_format_long ();
 			double value = NUMundefined, inverseValue = 0.0;
 			switch (i) {
 				case 0: format = my v_format_totalDuration (), value = my tmax - my tmin; break;
@@ -230,9 +231,9 @@ static void drawNow (FunctionEditor me) {
 					 */	
 					Graphics_setColour (my d_graphics, Graphics_BLUE);
 					Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_HALF);
-					Graphics_text1 (my d_graphics, left, 0.5 * (bottom + top) - verticalCorrection, Melder_fixed (my d_startWindow, my v_fixedPrecision_long ()));
+					Graphics_text (my d_graphics, left, 0.5 * (bottom + top) - verticalCorrection, Melder_fixed (my d_startWindow, my v_fixedPrecision_long ()));
 					Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_HALF);
-					Graphics_text1 (my d_graphics, right, 0.5 * (bottom + top) - verticalCorrection, Melder_fixed (my d_endWindow, my v_fixedPrecision_long ()));
+					Graphics_text (my d_graphics, right, 0.5 * (bottom + top) - verticalCorrection, Melder_fixed (my d_endWindow, my v_fixedPrecision_long ()));
 					Graphics_setColour (my d_graphics, Graphics_BLACK);
 					Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_HALF);
 				break;
@@ -243,21 +244,26 @@ static void drawNow (FunctionEditor me) {
 				case 6: value = my marker [3] - my marker [2]; break;
 				case 7: format = my v_format_selection (), value = my d_endSelection - my d_startSelection, inverseValue = 1 / value; break;
 			}
-			swprintf (text, 100, format, value, inverseValue);
-			if (Graphics_textWidth (my d_graphics, text) < right - left) {
-				Graphics_text (my d_graphics, 0.5 * (left + right), 0.5 * (bottom + top) - verticalCorrection, text);
+			char text8 [100];
+			snprintf (text8, 100, format, value, inverseValue);
+			autostring32 text = Melder_8to32 (text8);
+			if (Graphics_textWidth (my d_graphics, text.peek()) < right - left) {
+				Graphics_text (my d_graphics, 0.5 * (left + right), 0.5 * (bottom + top) - verticalCorrection, text.peek());
 			} else if (format == my v_format_long ()) {
-				swprintf (text, 100, my v_format_short (), value);
-				if (Graphics_textWidth (my d_graphics, text) < right - left)
-					Graphics_text (my d_graphics, 0.5 * (left + right), 0.5 * (bottom + top) - verticalCorrection, text);
+				snprintf (text8, 100, my v_format_short (), value);
+				text.reset (Melder_8to32 (text8));
+				if (Graphics_textWidth (my d_graphics, text.peek()) < right - left)
+					Graphics_text (my d_graphics, 0.5 * (left + right), 0.5 * (bottom + top) - verticalCorrection, text.peek());
 			} else {
-				swprintf (text, 100, my v_format_long (), value);
-				if (Graphics_textWidth (my d_graphics, text) < right - left) {
-						Graphics_text (my d_graphics, 0.5 * (left + right), 0.5 * (bottom + top) - verticalCorrection, text);
+				snprintf (text8, 100, my v_format_long (), value);
+				text.reset (Melder_8to32 (text8));
+				if (Graphics_textWidth (my d_graphics, text.peek()) < right - left) {
+						Graphics_text (my d_graphics, 0.5 * (left + right), 0.5 * (bottom + top) - verticalCorrection, text.peek());
 				} else {
-					swprintf (text, 100, my v_format_short (), my d_endSelection - my d_startSelection);
-					if (Graphics_textWidth (my d_graphics, text) < right - left)
-						Graphics_text (my d_graphics, 0.5 * (left + right), 0.5 * (bottom + top) - verticalCorrection, text);
+					snprintf (text8, 100, my v_format_short (), my d_endSelection - my d_startSelection);
+					text.reset (Melder_8to32 (text8));
+					if (Graphics_textWidth (my d_graphics, text.peek()) < right - left)
+						Graphics_text (my d_graphics, 0.5 * (left + right), 0.5 * (bottom + top) - verticalCorrection, text.peek());
 				}
 			}
 		}
@@ -276,15 +282,15 @@ static void drawNow (FunctionEditor me) {
 	Graphics_setColour (my d_graphics, Graphics_RED);
 	if (cursorVisible) {
 		Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_BOTTOM);
-		Graphics_text1 (my d_graphics, my d_startSelection, my height - (TOP_MARGIN + space) - verticalCorrection, Melder_fixed (my d_startSelection, my v_fixedPrecision_long ()));
+		Graphics_text (my d_graphics, my d_startSelection, my height - (TOP_MARGIN + space) - verticalCorrection, Melder_fixed (my d_startSelection, my v_fixedPrecision_long ()));
 	}
 	if (beginVisible && selection) {
 		Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_HALF);
-		Graphics_text1 (my d_graphics, my d_startSelection, my height - (TOP_MARGIN + space/2) - verticalCorrection, Melder_fixed (my d_startSelection, my v_fixedPrecision_long ()));
+		Graphics_text (my d_graphics, my d_startSelection, my height - (TOP_MARGIN + space/2) - verticalCorrection, Melder_fixed (my d_startSelection, my v_fixedPrecision_long ()));
 	}
 	if (endVisible && selection) {
 		Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_HALF);
-		Graphics_text1 (my d_graphics, my d_endSelection, my height - (TOP_MARGIN + space/2) - verticalCorrection, Melder_fixed (my d_endSelection, my v_fixedPrecision_long ()));
+		Graphics_text (my d_graphics, my d_endSelection, my height - (TOP_MARGIN + space/2) - verticalCorrection, Melder_fixed (my d_endSelection, my v_fixedPrecision_long ()));
 	}
 	Graphics_setColour (my d_graphics, Graphics_BLACK);
 
@@ -346,38 +352,43 @@ static void drawNow (FunctionEditor me) {
 
 void structFunctionEditor :: v_destroy () {
 	MelderAudio_stopPlaying (MelderAudio_IMPLICIT);
-	if (group) {   // undangle
-		int i = 1; while (theGroup [i] != this) { Melder_assert (i < maxGroup); i ++; } theGroup [i] = NULL;
+	if (our group) {   // undangle
+		int i = 1;
+		while (theGroup [i] != this) {
+			Melder_assert (i < maxGroup);
+			i ++;
+		}
+		theGroup [i] = nullptr;
 		nGroup --;
 	}
-	forget (d_graphics);
+	forget (our d_graphics);
 	FunctionEditor_Parent :: v_destroy ();
 }
 
 void structFunctionEditor :: v_info () {
 	FunctionEditor_Parent :: v_info ();
-	MelderInfo_writeLine (L"Editor start: ", Melder_double (our tmin), L" ", v_format_units ());
-	MelderInfo_writeLine (L"Editor end: ", Melder_double (our tmax), L" ", v_format_units ());
-	MelderInfo_writeLine (L"Window start: ", Melder_double (our d_startWindow), L" ", v_format_units ());
-	MelderInfo_writeLine (L"Window end: ", Melder_double (our d_endWindow), L" ", v_format_units ());
-	MelderInfo_writeLine (L"Selection start: ", Melder_double (our d_startSelection), L" ", v_format_units ());
-	MelderInfo_writeLine (L"Selection end: ", Melder_double (our d_endSelection), L" ", v_format_units ());
-	MelderInfo_writeLine (L"Arrow scroll step: ", Melder_double (our p_arrowScrollStep), L" ", v_format_units ());
-	MelderInfo_writeLine (L"Group: ", group ? L"yes" : L"no");
+	MelderInfo_writeLine (U"Editor start: ", our tmin, U" ", v_format_units ());
+	MelderInfo_writeLine (U"Editor end: ", our tmax, U" ", v_format_units ());
+	MelderInfo_writeLine (U"Window start: ", our d_startWindow, U" ", v_format_units ());
+	MelderInfo_writeLine (U"Window end: ", our d_endWindow, U" ", v_format_units ());
+	MelderInfo_writeLine (U"Selection start: ", our d_startSelection, U" ", v_format_units ());
+	MelderInfo_writeLine (U"Selection end: ", our d_endSelection, U" ", v_format_units ());
+	MelderInfo_writeLine (U"Arrow scroll step: ", our p_arrowScrollStep, U" ", v_format_units ());
+	MelderInfo_writeLine (U"Group: ", group ? U"yes" : U"no");
 }
 
 /********** FILE MENU **********/
 
 static void gui_drawingarea_cb_resize (I, GuiDrawingAreaResizeEvent event) {
 	iam (FunctionEditor);
-	if (my d_graphics == NULL) return;   // Could be the case in the very beginning.
+	if (! my d_graphics) return;   // could be the case in the very beginning
 	Graphics_setWsViewport (my d_graphics, 0, event -> width, 0, event -> height);
-	short width = event -> width + 21;
+	int width = event -> width + 21;
 	/*
 	 * Put the function viewer at the left and the selection viewer at the right.
 	 */
 	my functionViewerLeft = 0;
-	my functionViewerRight = my p_showSelectionViewer ? width * (2.0/3) : width;
+	my functionViewerRight = my p_showSelectionViewer ? (short) floor (width * (2.0/3)) : width;
 	my selectionViewerLeft = my functionViewerRight;
 	my selectionViewerRight = width;
 	my height = event -> height + 111;
@@ -387,32 +398,32 @@ static void gui_drawingarea_cb_resize (I, GuiDrawingAreaResizeEvent event) {
 
 	/* Save the current shell size as the user's preference for a new FunctionEditor. */
 
-	my pref_shellWidth () = my d_windowForm -> f_getShellWidth ();
-	my pref_shellHeight () = my d_windowForm -> f_getShellHeight ();
+	my pref_shellWidth  () = GuiShell_getShellWidth  (my d_windowForm);
+	my pref_shellHeight () = GuiShell_getShellHeight (my d_windowForm);
 }
 
 static void menu_cb_preferences (EDITOR_ARGS) {
 	EDITOR_IAM (FunctionEditor);
-	EDITOR_FORM (L"Preferences", 0)
-		BOOLEAN (L"Synchronize zoom and scroll", my default_synchronizedZoomAndScroll ())
-		BOOLEAN (L"Show selection viewer", my default_showSelectionViewer ())
-		POSITIVE (Melder_wcscat (L"Arrow scroll step (", my v_format_units (), L")"), my default_arrowScrollStep ())
+	EDITOR_FORM (U"Preferences", 0)
+		BOOLEAN (U"Synchronize zoom and scroll", my default_synchronizedZoomAndScroll ())
+		BOOLEAN (U"Show selection viewer", my default_showSelectionViewer ())
+		POSITIVE (Melder_cat (U"Arrow scroll step (", my v_format_units (), U")"), my default_arrowScrollStep ())
 		my v_prefs_addFields (cmd);
 	EDITOR_OK
-		SET_INTEGER (L"Synchronize zoom and scroll", my pref_synchronizedZoomAndScroll ())
-		SET_INTEGER (L"Show selection viewer", my pref_showSelectionViewer())
-		SET_REAL (L"Arrow scroll step", my p_arrowScrollStep)
+		SET_INTEGER (U"Synchronize zoom and scroll", my pref_synchronizedZoomAndScroll ())
+		SET_INTEGER (U"Show selection viewer", my pref_showSelectionViewer())
+		SET_REAL (U"Arrow scroll step", my p_arrowScrollStep)
 		my v_prefs_setValues (cmd);
 	EDITOR_DO
 		bool oldSynchronizedZoomAndScroll = my pref_synchronizedZoomAndScroll ();
 		bool oldShowSelectionViewer = my p_showSelectionViewer;
-		my pref_synchronizedZoomAndScroll () = GET_INTEGER (L"Synchronize zoom and scroll");
-		my pref_showSelectionViewer () = my p_showSelectionViewer = GET_INTEGER (L"Show selection viewer");
-		my pref_arrowScrollStep () = my p_arrowScrollStep = GET_REAL (L"Arrow scroll step");
+		my pref_synchronizedZoomAndScroll () = GET_INTEGER (U"Synchronize zoom and scroll");
+		my pref_showSelectionViewer () = my p_showSelectionViewer = GET_INTEGER (U"Show selection viewer");
+		my pref_arrowScrollStep () = my p_arrowScrollStep = GET_REAL (U"Arrow scroll step");
 		if (my p_showSelectionViewer != oldShowSelectionViewer) {
 			struct structGuiDrawingAreaResizeEvent event = { my drawingArea, 0 };
-			event. width = my drawingArea -> f_getWidth ();
-			event. height = my drawingArea -> f_getHeight ();
+			event. width  = GuiControl_getWidth  (my drawingArea);
+			event. height = GuiControl_getHeight (my drawingArea);
 			gui_drawingarea_cb_resize (me, & event);
 		}
 		if (! oldSynchronizedZoomAndScroll && my pref_synchronizedZoomAndScroll ()) {
@@ -423,18 +434,18 @@ static void menu_cb_preferences (EDITOR_ARGS) {
 }
 
 void structFunctionEditor :: v_form_pictureSelection (EditorCommand cmd) {
-	BOOLEAN (L"Draw selection times", 1);
-	BOOLEAN (L"Draw selection hairs", 1);
+	BOOLEAN (U"Draw selection times", 1);
+	BOOLEAN (U"Draw selection hairs", 1);
 }
 void structFunctionEditor :: v_ok_pictureSelection (EditorCommand cmd) {
 	FunctionEditor me = (FunctionEditor) cmd -> d_editor;
-	SET_INTEGER (L"Draw selection times", my pref_picture_drawSelectionTimes ());
-	SET_INTEGER (L"Draw selection hairs", my pref_picture_drawSelectionHairs ());
+	SET_INTEGER (U"Draw selection times", my pref_picture_drawSelectionTimes ());
+	SET_INTEGER (U"Draw selection hairs", my pref_picture_drawSelectionHairs ());
 }
 void structFunctionEditor :: v_do_pictureSelection (EditorCommand cmd) {
 	FunctionEditor me = (FunctionEditor) cmd -> d_editor;
-	my pref_picture_drawSelectionTimes () = GET_INTEGER (L"Draw selection times");
-	my pref_picture_drawSelectionHairs () = GET_INTEGER (L"Draw selection hairs");
+	my pref_picture_drawSelectionTimes () = GET_INTEGER (U"Draw selection times");
+	my pref_picture_drawSelectionHairs () = GET_INTEGER (U"Draw selection hairs");
 }
 
 /********** QUERY MENU **********/
@@ -460,17 +471,17 @@ static void menu_cb_getSelectionDuration (EDITOR_ARGS) {
 
 static void menu_cb_zoom (EDITOR_ARGS) {
 	EDITOR_IAM (FunctionEditor);
-	EDITOR_FORM (L"Zoom", 0)
-		REAL (L"From", L"0.0")
-		REAL (L"To", L"1.0")
+	EDITOR_FORM (U"Zoom", 0)
+		REAL (U"From", U"0.0")
+		REAL (U"To", U"1.0")
 	EDITOR_OK
-		SET_REAL (L"From", my d_startWindow)
-		SET_REAL (L"To", my d_endWindow)
+		SET_REAL (U"From", my d_startWindow)
+		SET_REAL (U"To", my d_endWindow)
 	EDITOR_DO
-		my d_startWindow = GET_REAL (L"From");
+		my d_startWindow = GET_REAL (U"From");
 		if (my d_startWindow < my tmin + 1e-12)
 			my d_startWindow = my tmin;
-		my d_endWindow = GET_REAL (L"To");
+		my d_endWindow = GET_REAL (U"To");
 		if (my d_endWindow > my tmax - 1e-12)
 			my d_endWindow = my tmax;
 		my v_updateText ();
@@ -491,8 +502,7 @@ static void do_showAll (FunctionEditor me) {
 	}
 }
 
-static void gui_button_cb_showAll (I, GuiButtonEvent event) {
-	(void) event;
+static void gui_button_cb_showAll (I, GuiButtonEvent /*event*/) {
 	iam (FunctionEditor);
 	do_showAll (me);
 }
@@ -509,8 +519,7 @@ static void do_zoomIn (FunctionEditor me) {
 	}
 }
 
-static void gui_button_cb_zoomIn (I, GuiButtonEvent event) {
-	(void) event;
+static void gui_button_cb_zoomIn (I, GuiButtonEvent /*event*/) {
 	iam (FunctionEditor);
 	do_zoomIn (me);
 }
@@ -532,8 +541,7 @@ static void do_zoomOut (FunctionEditor me) {
 	}
 }
 
-static void gui_button_cb_zoomOut (I, GuiButtonEvent event) {
-	(void) event;
+static void gui_button_cb_zoomOut (I, GuiButtonEvent /*event*/) {
 	iam (FunctionEditor);
 	do_zoomOut (me);
 }
@@ -542,24 +550,23 @@ static void do_zoomToSelection (FunctionEditor me) {
 	if (my d_endSelection > my d_startSelection) {
 		my startZoomHistory = my d_startWindow;   // remember for Zoom Back
 		my endZoomHistory = my d_endWindow;   // remember for Zoom Back
-		trace ("Zooming in to %.17g ~ %.17g seconds.", my d_startSelection, my d_endSelection);
+		trace (U"Zooming in to ", my d_startSelection, U" ~ ", my d_endSelection, U" seconds.");
 		my d_startWindow = my d_startSelection;
 		my d_endWindow = my d_endSelection;
-		trace ("Zoomed in to %.17g ~ %.17g seconds (1).", my d_startWindow, my d_endWindow);
+		trace (U"Zoomed in to ", my d_startWindow, U" ~ ", my d_endWindow, U" seconds (1).");
 		my v_updateText ();
-		trace ("Zoomed in to %.17g ~ %.17g seconds (2).", my d_startWindow, my d_endWindow);
+		trace (U"Zoomed in to ", my d_startWindow, U" ~ ", my d_endWindow, U" seconds (2).");
 		updateScrollBar (me);
-		trace ("Zoomed in to %.17g ~ %.17g seconds (3).", my d_startWindow, my d_endWindow);
+		trace (U"Zoomed in to ", my d_startWindow, U" ~ ", my d_endWindow, U" seconds (3).");
 		/*Graphics_updateWs (my d_graphics);*/ drawNow (me);
 		if (my pref_synchronizedZoomAndScroll ()) {
 			updateGroup (me);
 		}
-		trace ("Zoomed in to %.17g ~ %.17g seconds (4).", my d_startWindow, my d_endWindow);
+		trace (U"Zoomed in to ", my d_startWindow, U" ~ ", my d_endWindow, U" seconds (4).");
 	}
 }
 
-static void gui_button_cb_zoomToSelection (I, GuiButtonEvent event) {
-	(void) event;
+static void gui_button_cb_zoomToSelection (I, GuiButtonEvent /*event*/) {
 	iam (FunctionEditor);
 	do_zoomToSelection (me);
 }
@@ -577,8 +584,7 @@ static void do_zoomBack (FunctionEditor me) {
 	}
 }
 
-static void gui_button_cb_zoomBack (I, GuiButtonEvent event) {
-	(void) event;
+static void gui_button_cb_zoomBack (I, GuiButtonEvent /*event*/) {
 	iam (FunctionEditor);
 	do_zoomBack (me);
 }
@@ -610,15 +616,15 @@ static void menu_cb_zoomBack (EDITOR_ARGS) {
 
 static void menu_cb_play (EDITOR_ARGS) {
 	EDITOR_IAM (FunctionEditor);
-	EDITOR_FORM (L"Play", 0)
-		REAL (L"From", L"0.0")
-		REAL (L"To", L"1.0")
+	EDITOR_FORM (U"Play", 0)
+		REAL (U"From", U"0.0")
+		REAL (U"To", U"1.0")
 	EDITOR_OK
-		SET_REAL (L"From", my d_startWindow)
-		SET_REAL (L"To", my d_endWindow)
+		SET_REAL (U"From", my d_startWindow)
+		SET_REAL (U"To", my d_endWindow)
 	EDITOR_DO
 		MelderAudio_stopPlaying (MelderAudio_IMPLICIT);
-		my v_play (GET_REAL (L"From"), GET_REAL (L"To"));
+		my v_play (GET_REAL (U"From"), GET_REAL (U"To"));
 	EDITOR_END
 }
 
@@ -654,17 +660,17 @@ static void menu_cb_interruptPlaying (EDITOR_ARGS) {
 
 static void menu_cb_select (EDITOR_ARGS) {
 	EDITOR_IAM (FunctionEditor);
-	EDITOR_FORM (L"Select", 0)
-		REAL (L"Start of selection", L"0.0")
-		REAL (L"End of selection", L"1.0")
+	EDITOR_FORM (U"Select", 0)
+		REAL (U"Start of selection", U"0.0")
+		REAL (U"End of selection", U"1.0")
 	EDITOR_OK
-		SET_REAL (L"Start of selection", my d_startSelection)
-		SET_REAL (L"End of selection", my d_endSelection)
+		SET_REAL (U"Start of selection", my d_startSelection)
+		SET_REAL (U"End of selection", my d_endSelection)
 	EDITOR_DO
-		my d_startSelection = GET_REAL (L"Start of selection");
+		my d_startSelection = GET_REAL (U"Start of selection");
 		if (my d_startSelection < my tmin + 1e-12)
 			my d_startSelection = my tmin;
-		my d_endSelection = GET_REAL (L"End of selection");
+		my d_endSelection = GET_REAL (U"End of selection");
 		if (my d_endSelection > my tmax - 1e-12)
 			my d_endSelection = my tmax;
 		if (my d_startSelection > my d_endSelection) {
@@ -696,12 +702,12 @@ static void menu_cb_moveCursorToE (EDITOR_ARGS) {
 
 static void menu_cb_moveCursorTo (EDITOR_ARGS) {
 	EDITOR_IAM (FunctionEditor);
-	EDITOR_FORM (L"Move cursor to", 0)
-		REAL (L"Position", L"0.0")
+	EDITOR_FORM (U"Move cursor to", 0)
+		REAL (U"Position", U"0.0")
 	EDITOR_OK
-		SET_REAL (L"Position", 0.5 * (my d_startSelection + my d_endSelection))
+		SET_REAL (U"Position", 0.5 * (my d_startSelection + my d_endSelection))
 	EDITOR_DO
-		double position = GET_REAL (L"Position");
+		double position = GET_REAL (U"Position");
 		if (position < my tmin + 1e-12) position = my tmin;
 		if (position > my tmax - 1e-12) position = my tmax;
 		my d_startSelection = my d_endSelection = position;
@@ -713,11 +719,11 @@ static void menu_cb_moveCursorTo (EDITOR_ARGS) {
 
 static void menu_cb_moveCursorBy (EDITOR_ARGS) {
 	EDITOR_IAM (FunctionEditor);
-	EDITOR_FORM (L"Move cursor by", 0)
-		REAL (L"Distance", L"0.05")
+	EDITOR_FORM (U"Move cursor by", 0)
+		REAL (U"Distance", U"0.05")
 	EDITOR_OK
 	EDITOR_DO
-		double position = 0.5 * (my d_startSelection + my d_endSelection) + GET_REAL (L"Distance");
+		double position = 0.5 * (my d_startSelection + my d_endSelection) + GET_REAL (U"Distance");
 		if (position < my tmin) position = my tmin;
 		if (position > my tmax) position = my tmax;
 		my d_startSelection = my d_endSelection = position;
@@ -729,11 +735,11 @@ static void menu_cb_moveCursorBy (EDITOR_ARGS) {
 
 static void menu_cb_moveBby (EDITOR_ARGS) {
 	EDITOR_IAM (FunctionEditor);
-	EDITOR_FORM (L"Move start of selection by", 0)
-		REAL (L"Distance", L"0.05")
+	EDITOR_FORM (U"Move start of selection by", 0)
+		REAL (U"Distance", U"0.05")
 	EDITOR_OK
 	EDITOR_DO
-		double position = my d_startSelection + GET_REAL (L"Distance");
+		double position = my d_startSelection + GET_REAL (U"Distance");
 		if (position < my tmin) position = my tmin;
 		if (position > my tmax) position = my tmax;
 		my d_startSelection = position;
@@ -750,11 +756,11 @@ static void menu_cb_moveBby (EDITOR_ARGS) {
 
 static void menu_cb_moveEby (EDITOR_ARGS) {
 	EDITOR_IAM (FunctionEditor);
-	EDITOR_FORM (L"Move end of selection by", 0)
-		REAL (L"Distance", L"0.05")
+	EDITOR_FORM (U"Move end of selection by", 0)
+		REAL (U"Distance", U"0.05")
 	EDITOR_OK
 	EDITOR_DO
-		double position = my d_endSelection + GET_REAL (L"Distance");
+		double position = my d_endSelection + GET_REAL (U"Distance");
 		if (position < my tmin) position = my tmin;
 		if (position > my tmax) position = my tmax;
 		my d_endSelection = position;
@@ -772,7 +778,7 @@ static void menu_cb_moveEby (EDITOR_ARGS) {
 void FunctionEditor_shift (FunctionEditor me, double shift, bool needsUpdateGroup) {
 	double windowLength = my d_endWindow - my d_startWindow;
 	MelderAudio_stopPlaying (MelderAudio_IMPLICIT);   /* Quickly, before window changes. */
-	trace ("shifting by %.17g", shift);
+	trace (U"shifting by ", shift);
 	if (shift < 0.0) {
 		my d_startWindow += shift;
 		if (my d_startWindow < my tmin + 1e-12)
@@ -879,12 +885,12 @@ static void menu_cb_moveEright (EDITOR_ARGS) {
 
 static void gui_cb_scroll (I, GuiScrollBarEvent event) {
 	iam (FunctionEditor);
-	if (my d_graphics == NULL) return;   // ignore events during creation
-	double value = event -> scrollBar -> f_getValue ();
+	if (! my d_graphics) return;   // ignore events during creation
+	double value = GuiScrollBar_getValue (event -> scrollBar);
 	double shift = my tmin + (value - 1) * (my tmax - my tmin) / maximumScrollBarValue - my d_startWindow;
 	bool shifted = shift != 0.0;
 	double oldSliderSize = (my d_endWindow - my d_startWindow) / (my tmax - my tmin) * maximumScrollBarValue - 1;
-	double newSliderSize = event -> scrollBar -> f_getSliderSize ();
+	double newSliderSize = GuiScrollBar_getSliderSize (event -> scrollBar);
 	bool zoomed = newSliderSize != oldSliderSize;
 	#if ! cocoa
 		zoomed = false;
@@ -934,7 +940,7 @@ static void gui_checkbutton_cb_group (I, GuiCheckButtonEvent event) {
 		FunctionEditor thee;
 		i = 1; while (theGroup [i]) i ++; theGroup [i] = me;
 		if (++ nGroup == 1) { Graphics_updateWs (my d_graphics); return; }
-		i = 1; while (theGroup [i] == NULL || theGroup [i] == me) i ++; thee = theGroup [i];
+		i = 1; while (theGroup [i] == nullptr || theGroup [i] == me) i ++; thee = theGroup [i];
 		if (my pref_synchronizedZoomAndScroll ()) {
 			my d_startWindow = thy d_startWindow;
 			my d_endWindow = thy d_endWindow;
@@ -963,7 +969,7 @@ static void gui_checkbutton_cb_group (I, GuiCheckButtonEvent event) {
 				}
 		}
 	} else {
-		i = 1; while (theGroup [i] != me) i ++; theGroup [i] = NULL;
+		i = 1; while (theGroup [i] != me) i ++; theGroup [i] = nullptr;
 		nGroup --;
 		my v_updateText ();
 		Graphics_updateWs (my d_graphics);   // for setting buttons in draw method
@@ -973,34 +979,34 @@ static void gui_checkbutton_cb_group (I, GuiCheckButtonEvent event) {
 
 static void menu_cb_intro (EDITOR_ARGS) {
 	EDITOR_IAM (FunctionEditor);
-	Melder_help (L"Intro");
+	Melder_help (U"Intro");
 }
 
 void structFunctionEditor :: v_createMenuItems_file (EditorMenu menu) {
 	FunctionEditor_Parent :: v_createMenuItems_file (menu);
-	EditorMenu_addCommand (menu, L"Preferences...", 0, menu_cb_preferences);
-	EditorMenu_addCommand (menu, L"-- after preferences --", 0, 0);
+	EditorMenu_addCommand (menu, U"Preferences...", 0, menu_cb_preferences);
+	EditorMenu_addCommand (menu, U"-- after preferences --", 0, 0);
 }
 
 void structFunctionEditor :: v_createMenuItems_view_timeDomain (EditorMenu menu) {
 	EditorMenu_addCommand (menu, v_format_domain (), GuiMenu_INSENSITIVE, menu_cb_zoom /* dummy */);
-	EditorMenu_addCommand (menu, L"Zoom...", 0, menu_cb_zoom);
-	EditorMenu_addCommand (menu, L"Show all", 'A', menu_cb_showAll);
-	EditorMenu_addCommand (menu, L"Zoom in", 'I', menu_cb_zoomIn);
-	EditorMenu_addCommand (menu, L"Zoom out", 'O', menu_cb_zoomOut);
-	EditorMenu_addCommand (menu, L"Zoom to selection", 'N', menu_cb_zoomToSelection);
-	EditorMenu_addCommand (menu, L"Zoom back", 'B', menu_cb_zoomBack);
-	EditorMenu_addCommand (menu, L"Scroll page back", GuiMenu_PAGE_UP, menu_cb_pageUp);
-	EditorMenu_addCommand (menu, L"Scroll page forward", GuiMenu_PAGE_DOWN, menu_cb_pageDown);
+	EditorMenu_addCommand (menu, U"Zoom...", 0, menu_cb_zoom);
+	EditorMenu_addCommand (menu, U"Show all", 'A', menu_cb_showAll);
+	EditorMenu_addCommand (menu, U"Zoom in", 'I', menu_cb_zoomIn);
+	EditorMenu_addCommand (menu, U"Zoom out", 'O', menu_cb_zoomOut);
+	EditorMenu_addCommand (menu, U"Zoom to selection", 'N', menu_cb_zoomToSelection);
+	EditorMenu_addCommand (menu, U"Zoom back", 'B', menu_cb_zoomBack);
+	EditorMenu_addCommand (menu, U"Scroll page back", GuiMenu_PAGE_UP, menu_cb_pageUp);
+	EditorMenu_addCommand (menu, U"Scroll page forward", GuiMenu_PAGE_DOWN, menu_cb_pageDown);
 }
 
 void structFunctionEditor :: v_createMenuItems_view_audio (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"-- play --", 0, 0);
-	EditorMenu_addCommand (menu, L"Audio:", GuiMenu_INSENSITIVE, menu_cb_play /* dummy */);
-	EditorMenu_addCommand (menu, L"Play...", 0, menu_cb_play);
-	EditorMenu_addCommand (menu, L"Play or stop", GuiMenu_TAB, menu_cb_playOrStop);
-	EditorMenu_addCommand (menu, L"Play window", GuiMenu_SHIFT + GuiMenu_TAB, menu_cb_playWindow);
-	EditorMenu_addCommand (menu, L"Interrupt playing", GuiMenu_ESCAPE, menu_cb_interruptPlaying);
+	EditorMenu_addCommand (menu, U"-- play --", 0, 0);
+	EditorMenu_addCommand (menu, U"Audio:", GuiMenu_INSENSITIVE, menu_cb_play /* dummy */);
+	EditorMenu_addCommand (menu, U"Play...", 0, menu_cb_play);
+	EditorMenu_addCommand (menu, U"Play or stop", GuiMenu_TAB, menu_cb_playOrStop);
+	EditorMenu_addCommand (menu, U"Play window", GuiMenu_SHIFT + GuiMenu_TAB, menu_cb_playWindow);
+	EditorMenu_addCommand (menu, U"Interrupt playing", GuiMenu_ESCAPE, menu_cb_interruptPlaying);
 }
 
 void structFunctionEditor :: v_createMenuItems_view (EditorMenu menu) {
@@ -1010,64 +1016,63 @@ void structFunctionEditor :: v_createMenuItems_view (EditorMenu menu) {
 
 void structFunctionEditor :: v_createMenuItems_query (EditorMenu menu) {
 	FunctionEditor_Parent :: v_createMenuItems_query (menu);
-	EditorMenu_addCommand (menu, L"-- query selection --", 0, 0);
-	EditorMenu_addCommand (menu, L"Get start of selection", 0, menu_cb_getB);
-	EditorMenu_addCommand (menu, L"Get begin of selection", Editor_HIDDEN, menu_cb_getB);
-	EditorMenu_addCommand (menu, L"Get cursor", GuiMenu_F6, menu_cb_getCursor);
-	EditorMenu_addCommand (menu, L"Get end of selection", 0, menu_cb_getE);
-	EditorMenu_addCommand (menu, L"Get selection length", 0, menu_cb_getSelectionDuration);
+	EditorMenu_addCommand (menu, U"-- query selection --", 0, 0);
+	EditorMenu_addCommand (menu, U"Get start of selection", 0, menu_cb_getB);
+	EditorMenu_addCommand (menu, U"Get begin of selection", Editor_HIDDEN, menu_cb_getB);
+	EditorMenu_addCommand (menu, U"Get cursor", GuiMenu_F6, menu_cb_getCursor);
+	EditorMenu_addCommand (menu, U"Get end of selection", 0, menu_cb_getE);
+	EditorMenu_addCommand (menu, U"Get selection length", 0, menu_cb_getSelectionDuration);
 }
 
 void structFunctionEditor :: v_createMenus () {
 	FunctionEditor_Parent :: v_createMenus ();
 	EditorMenu menu;
 
-	menu = Editor_addMenu (this, L"View", 0);
+	menu = Editor_addMenu (this, U"View", 0);
 	v_createMenuItems_view (menu);
 
-	Editor_addMenu (this, L"Select", 0);
-	Editor_addCommand (this, L"Select", L"Select...", 0, menu_cb_select);
-	Editor_addCommand (this, L"Select", L"Move cursor to start of selection", 0, menu_cb_moveCursorToB);
-	Editor_addCommand (this, L"Select", L"Move cursor to begin of selection", Editor_HIDDEN, menu_cb_moveCursorToB);
-	Editor_addCommand (this, L"Select", L"Move cursor to end of selection", 0, menu_cb_moveCursorToE);
-	Editor_addCommand (this, L"Select", L"Move cursor to...", 0, menu_cb_moveCursorTo);
-	Editor_addCommand (this, L"Select", L"Move cursor by...", 0, menu_cb_moveCursorBy);
-	Editor_addCommand (this, L"Select", L"Move start of selection by...", 0, menu_cb_moveBby);
-	Editor_addCommand (this, L"Select", L"Move begin of selection by...", Editor_HIDDEN, menu_cb_moveBby);
-	Editor_addCommand (this, L"Select", L"Move end of selection by...", 0, menu_cb_moveEby);
-	/*Editor_addCommand (this, L"Select", L"Move cursor back by half a second", motif_, menu_cb_moveCursorBy);*/
-	Editor_addCommand (this, L"Select", L"Select earlier", GuiMenu_UP_ARROW, menu_cb_selectEarlier);
-	Editor_addCommand (this, L"Select", L"Select later", GuiMenu_DOWN_ARROW, menu_cb_selectLater);
-	Editor_addCommand (this, L"Select", L"Move start of selection left", GuiMenu_SHIFT + GuiMenu_UP_ARROW, menu_cb_moveBleft);
-	Editor_addCommand (this, L"Select", L"Move begin of selection left", Editor_HIDDEN, menu_cb_moveBleft);
-	Editor_addCommand (this, L"Select", L"Move start of selection right", GuiMenu_SHIFT + GuiMenu_DOWN_ARROW, menu_cb_moveBright);
-	Editor_addCommand (this, L"Select", L"Move begin of selection right", Editor_HIDDEN, menu_cb_moveBright);
-	Editor_addCommand (this, L"Select", L"Move end of selection left", GuiMenu_COMMAND + GuiMenu_UP_ARROW, menu_cb_moveEleft);
-	Editor_addCommand (this, L"Select", L"Move end of selection right", GuiMenu_COMMAND + GuiMenu_DOWN_ARROW, menu_cb_moveEright);
+	Editor_addMenu (this, U"Select", 0);
+	Editor_addCommand (this, U"Select", U"Select...", 0, menu_cb_select);
+	Editor_addCommand (this, U"Select", U"Move cursor to start of selection", 0, menu_cb_moveCursorToB);
+	Editor_addCommand (this, U"Select", U"Move cursor to begin of selection", Editor_HIDDEN, menu_cb_moveCursorToB);
+	Editor_addCommand (this, U"Select", U"Move cursor to end of selection", 0, menu_cb_moveCursorToE);
+	Editor_addCommand (this, U"Select", U"Move cursor to...", 0, menu_cb_moveCursorTo);
+	Editor_addCommand (this, U"Select", U"Move cursor by...", 0, menu_cb_moveCursorBy);
+	Editor_addCommand (this, U"Select", U"Move start of selection by...", 0, menu_cb_moveBby);
+	Editor_addCommand (this, U"Select", U"Move begin of selection by...", Editor_HIDDEN, menu_cb_moveBby);
+	Editor_addCommand (this, U"Select", U"Move end of selection by...", 0, menu_cb_moveEby);
+	/*Editor_addCommand (this, U"Select", U"Move cursor back by half a second", motif_, menu_cb_moveCursorBy);*/
+	Editor_addCommand (this, U"Select", U"Select earlier", GuiMenu_UP_ARROW, menu_cb_selectEarlier);
+	Editor_addCommand (this, U"Select", U"Select later", GuiMenu_DOWN_ARROW, menu_cb_selectLater);
+	Editor_addCommand (this, U"Select", U"Move start of selection left", GuiMenu_SHIFT + GuiMenu_UP_ARROW, menu_cb_moveBleft);
+	Editor_addCommand (this, U"Select", U"Move begin of selection left", Editor_HIDDEN, menu_cb_moveBleft);
+	Editor_addCommand (this, U"Select", U"Move start of selection right", GuiMenu_SHIFT + GuiMenu_DOWN_ARROW, menu_cb_moveBright);
+	Editor_addCommand (this, U"Select", U"Move begin of selection right", Editor_HIDDEN, menu_cb_moveBright);
+	Editor_addCommand (this, U"Select", U"Move end of selection left", GuiMenu_COMMAND + GuiMenu_UP_ARROW, menu_cb_moveEleft);
+	Editor_addCommand (this, U"Select", U"Move end of selection right", GuiMenu_COMMAND + GuiMenu_DOWN_ARROW, menu_cb_moveEright);
 }
 
 void structFunctionEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	FunctionEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"Intro", 0, menu_cb_intro);
+	EditorMenu_addCommand (menu, U"Intro", 0, menu_cb_intro);
 }
 
-static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
+static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent /* event */) {
 	iam (FunctionEditor);
-	(void) event;
-	if (my d_graphics == NULL) return;   // Could be the case in the very beginning.
+	if (! my d_graphics) return;   // could be the case in the very beginning
 	if (my enableUpdates)
 		drawNow (me);
 }
 
 static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 	iam (FunctionEditor);
-	if (my d_graphics == NULL) return;   // Could be the case in the very beginning.
-	double xWC, yWC;
+	if (! my d_graphics) return;   // could be the case in the very beginning
 	my shiftKeyPressed = event -> shiftKeyPressed;
 	Graphics_setWindow (my d_graphics, my functionViewerLeft, my functionViewerRight, 0, my height);
+	double xWC, yWC;
 	Graphics_DCtoWC (my d_graphics, event -> x, event -> y, & xWC, & yWC);
 
-	if (yWC > BOTTOM_MARGIN + space * 3 && yWC < my height - (TOP_MARGIN + space)) {   /* In signal region? */
+	if (yWC > BOTTOM_MARGIN + space * 3 && yWC < my height - (TOP_MARGIN + space)) {   // in signal region?
 		int needsUpdate;
 		Graphics_setViewport (my d_graphics, my functionViewerLeft + MARGIN, my functionViewerRight - MARGIN,
 			BOTTOM_MARGIN + space * 3, my height - (TOP_MARGIN + space));
@@ -1076,8 +1081,12 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 		if (xWC < my d_startWindow) xWC = my d_startWindow;
 		if (xWC > my d_endWindow) xWC = my d_endWindow;
 		if (Melder_debug == 24) {
-			Melder_casual ("FunctionEditor::gui_drawingarea_cb_click: button %d shift %d option %d command %d control %d",
-				event -> button, my shiftKeyPressed, event -> optionKeyPressed, event -> commandKeyPressed, event -> extraControlKeyPressed);
+			Melder_casual (U"FunctionEditor::gui_drawingarea_cb_click:"
+				U" button ", event -> button,
+				U" shift ", my shiftKeyPressed,
+				U" option ", event -> optionKeyPressed,
+				U" command ", event -> commandKeyPressed,
+				U" control ", event -> extraControlKeyPressed);
 		}
 #if defined (macintosh)
 		needsUpdate =
@@ -1121,7 +1130,7 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 					}
 			}
 		} catch (MelderError) {
-			Melder_flushError (NULL);
+			Melder_flushError ();
 		}
 	}
 }
@@ -1132,19 +1141,19 @@ void structFunctionEditor :: v_createChildren () {
 	/***** Create zoom buttons. *****/
 
 	GuiButton_createShown (our d_windowForm, x, x + BUTTON_WIDTH, -4 - Gui_PUSHBUTTON_HEIGHT, -4,
-		L"all", gui_button_cb_showAll, this, 0);
+		U"all", gui_button_cb_showAll, this, 0);
 	x += BUTTON_WIDTH + BUTTON_SPACING;
 	GuiButton_createShown (our d_windowForm, x, x + BUTTON_WIDTH, -4 - Gui_PUSHBUTTON_HEIGHT, -4,
-		L"in", gui_button_cb_zoomIn, this, 0);
+		U"in", gui_button_cb_zoomIn, this, 0);
 	x += BUTTON_WIDTH + BUTTON_SPACING;
 	GuiButton_createShown (our d_windowForm, x, x + BUTTON_WIDTH, -4 - Gui_PUSHBUTTON_HEIGHT, -4,
-		L"out", gui_button_cb_zoomOut, this, 0);
+		U"out", gui_button_cb_zoomOut, this, 0);
 	x += BUTTON_WIDTH + BUTTON_SPACING;
 	GuiButton_createShown (our d_windowForm, x, x + BUTTON_WIDTH, -4 - Gui_PUSHBUTTON_HEIGHT, -4,
-		L"sel", gui_button_cb_zoomToSelection, this, 0);
+		U"sel", gui_button_cb_zoomToSelection, this, 0);
 	x += BUTTON_WIDTH + BUTTON_SPACING;
 	GuiButton_createShown (our d_windowForm, x, x + BUTTON_WIDTH, -4 - Gui_PUSHBUTTON_HEIGHT, -4,
-		L"bak", gui_button_cb_zoomBack, this, 0);
+		U"bak", gui_button_cb_zoomBack, this, 0);
 
 	/***** Create scroll bar. *****/
 
@@ -1156,7 +1165,7 @@ void structFunctionEditor :: v_createChildren () {
 	/***** Create Group button. *****/
 
 	our groupButton = GuiCheckButton_createShown (d_windowForm, -80, 0, -4 - Gui_PUSHBUTTON_HEIGHT, -4,
-		L"Group", gui_checkbutton_cb_group, this, group_equalDomain (our tmin, our tmax) ? GuiCheckButton_SET : 0);
+		U"Group", gui_checkbutton_cb_group, this, group_equalDomain (our tmin, our tmax) ? GuiCheckButton_SET : 0);
 
 	/***** Create optional text field. *****/
 
@@ -1184,13 +1193,13 @@ void structFunctionEditor :: v_createChildren () {
 	our drawingArea = GuiDrawingArea_createShown (our d_windowForm,
 		0, 0,
 		Machine_getMenuBarHeight () + ( our v_hasText () ? TEXT_HEIGHT + marginBetweenTextAndDrawingAreaToEnsureCorrectUnhighlighting : 0), -8 - Gui_PUSHBUTTON_HEIGHT,
-		gui_drawingarea_cb_expose, gui_drawingarea_cb_click, NULL, gui_drawingarea_cb_resize, this, 0);
-	our drawingArea -> f_setSwipable (our scrollBar, NULL);
+		gui_drawingarea_cb_expose, gui_drawingarea_cb_click, nullptr, gui_drawingarea_cb_resize, this, 0);
+	GuiDrawingArea_setSwipable (our drawingArea, our scrollBar, nullptr);
 }
 
 void structFunctionEditor :: v_dataChanged () {
 	Function function = (Function) our data;
-	Melder_assert (Thing_member (function, classFunction));
+	Melder_assert (Thing_isa (function, classFunction));
 	our tmin = function -> xmin;
  	our tmax = function -> xmax;
  	if (our d_startWindow < our tmin || our d_startWindow > our tmax) our d_startWindow = our tmin;
@@ -1213,13 +1222,13 @@ static void drawWhileDragging (FunctionEditor me, double x1, double x2) {
 	if (x1 > x2) xleft = x2, xright = x1; else xleft = x1, xright = x2;
 	Graphics_xorOn (my d_graphics, Graphics_MAROON);
 	Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_TOP);
-	Graphics_text1 (my d_graphics, xleft, 1.0, Melder_fixed (xleft, 6));
+	Graphics_text (my d_graphics, xleft, 1.0, Melder_fixed (xleft, 6));
 	Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_TOP);
-	Graphics_text1 (my d_graphics, xright, 1.0, Melder_fixed (xright, 6));
+	Graphics_text (my d_graphics, xright, 1.0, Melder_fixed (xright, 6));
 	Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_BOTTOM);
-	Graphics_text1 (my d_graphics, xleft, 0.0, Melder_fixed (xleft, 6));
+	Graphics_text (my d_graphics, xleft, 0.0, Melder_fixed (xleft, 6));
 	Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_BOTTOM);
-	Graphics_text1 (my d_graphics, xright, 0.0, Melder_fixed (xright, 6));
+	Graphics_text (my d_graphics, xright, 0.0, Melder_fixed (xright, 6));
 	Graphics_setLineType (my d_graphics, Graphics_DOTTED);
 	Graphics_line (my d_graphics, xleft, 0.0, xleft, 1.0);
 	Graphics_line (my d_graphics, xright, 0.0, xright, 1.0);
@@ -1513,7 +1522,7 @@ void structFunctionEditor :: v_unhighlightSelection (double left, double right,
 	Graphics_unhighlight (d_graphics, left, right, bottom, top);
 }
 
-void FunctionEditor_init (FunctionEditor me, const wchar_t *title, Function data) {
+void FunctionEditor_init (FunctionEditor me, const char32 *title, Function data) {
 	my tmin = data -> xmin;   // set before adding children (see group button)
 	my tmax = data -> xmax;
 	Editor_init (me, 0, 0, my pref_shellWidth (), my pref_shellHeight (), title, data);
@@ -1529,13 +1538,13 @@ void FunctionEditor_init (FunctionEditor me, const wchar_t *title, Function data
 
 // This exdents because it's a hack:
 struct structGuiDrawingAreaResizeEvent event = { my drawingArea, 0 };
-event. width  = my drawingArea -> f_getWidth  ();
-event. height = my drawingArea -> f_getHeight ();
+event. width  = GuiControl_getWidth  (my drawingArea);
+event. height = GuiControl_getHeight (my drawingArea);
 gui_drawingarea_cb_resize (me, & event);
 
 	my v_updateText ();
 	if (group_equalDomain (my tmin, my tmax))
-		gui_checkbutton_cb_group (me, NULL);   // BUG: NULL
+		gui_checkbutton_cb_group (me, nullptr);   // BUG: nullptr
 	my enableUpdates = true;
 }
 
@@ -1552,7 +1561,8 @@ void FunctionEditor_updateText (FunctionEditor me) {
 }
 
 void FunctionEditor_redraw (FunctionEditor me) {
-	/*Graphics_updateWs (my d_graphics);*/ drawNow (me);
+	//Graphics_updateWs (my d_graphics);
+	drawNow (me);
 }
 
 void FunctionEditor_enableUpdates (FunctionEditor me, bool enable) {
@@ -1562,19 +1572,18 @@ void FunctionEditor_enableUpdates (FunctionEditor me, bool enable) {
 void FunctionEditor_ungroup (FunctionEditor me) {
 	if (! my group) return;
 	my group = false;
-	my groupButton -> f_setValue (false);
+	GuiCheckButton_setValue (my groupButton, false);
 	int i = 1;
 	while (theGroup [i] != me) i ++;
-	theGroup [i] = NULL;
+	theGroup [i] = nullptr;
 	nGroup --;
 	my v_updateText ();
 	Graphics_updateWs (my d_graphics);   // for setting buttons in v_draw() method
 }
 
-void FunctionEditor_drawRangeMark (FunctionEditor me, double yWC, const wchar_t *yWC_string, const wchar_t *units, int verticalAlignment) {
-	static MelderString text = { 0 };
-	MelderString_empty (& text);
-	MelderString_append (& text, yWC_string, units);
+void FunctionEditor_drawRangeMark (FunctionEditor me, double yWC, const char32 *yWC_string, const char32 *units, int verticalAlignment) {
+	static MelderString text { 0 };
+	MelderString_copy (& text, yWC_string, units);
 	double textWidth = Graphics_textWidth (my d_graphics, text.string) + Graphics_dxMMtoWC (my d_graphics, 0.5);
 	Graphics_setColour (my d_graphics, Graphics_BLUE);
 	Graphics_line (my d_graphics, my d_endWindow, yWC, my d_endWindow + textWidth, yWC);
@@ -1583,20 +1592,17 @@ void FunctionEditor_drawRangeMark (FunctionEditor me, double yWC, const wchar_t
 	Graphics_text (my d_graphics, my d_endWindow, yWC, text.string);
 }
 
-void FunctionEditor_drawCursorFunctionValue (FunctionEditor me, double yWC, const wchar_t *yWC_string, const wchar_t *units) {
+void FunctionEditor_drawCursorFunctionValue (FunctionEditor me, double yWC, const char32 *yWC_string, const char32 *units) {
 	Graphics_setColour (my d_graphics, Graphics_CYAN);
 	Graphics_line (my d_graphics, my d_startWindow, yWC, 0.99 * my d_startWindow + 0.01 * my d_endWindow, yWC);
 	Graphics_fillCircle_mm (my d_graphics, 0.5 * (my d_startSelection + my d_endSelection), yWC, 1.5);
 	Graphics_setColour (my d_graphics, Graphics_BLUE);
 	Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_HALF);
-	Graphics_text2 (my d_graphics, my d_startWindow, yWC, yWC_string, units);
+	Graphics_text (my d_graphics, my d_startWindow, yWC,   yWC_string, units);
 }
 
-void FunctionEditor_insertCursorFunctionValue (FunctionEditor me, double yWC, const wchar_t *yWC_string, const wchar_t *units, double minimum, double maximum) {
-	static MelderString text = { 0 };
-	MelderString_empty (& text);
-	MelderString_append (& text, yWC_string, units);
-	double textX = my d_endWindow, textY = yWC, textWidth;
+void FunctionEditor_insertCursorFunctionValue (FunctionEditor me, double yWC, const char32 *yWC_string, const char32 *units, double minimum, double maximum) {
+	double textX = my d_endWindow, textY = yWC;
 	int tooHigh = Graphics_dyWCtoMM (my d_graphics, maximum - textY) < 5.0;
 	int tooLow = Graphics_dyWCtoMM (my d_graphics, textY - minimum) < 5.0;
 	if (yWC < minimum || yWC > maximum) return;
@@ -1609,18 +1615,20 @@ void FunctionEditor_insertCursorFunctionValue (FunctionEditor me, double yWC, co
 	} else if (tooLow) {
 		textY = minimum + Graphics_dyMMtoWC (my d_graphics, 5.0);
 	}
-	textWidth = Graphics_textWidth (my d_graphics, text.string);
+	static MelderString text { 0 };
+	MelderString_copy (& text, yWC_string, units);
+	double textWidth = Graphics_textWidth (my d_graphics, text.string);
 	Graphics_fillCircle_mm (my d_graphics, my d_endWindow + textWidth + Graphics_dxMMtoWC (my d_graphics, 1.5), textY, 1.5);
 	Graphics_setColour (my d_graphics, Graphics_RED);
 	Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_HALF);
 	Graphics_text (my d_graphics, textX, textY, text.string);
 }
 
-void FunctionEditor_drawHorizontalHair (FunctionEditor me, double yWC, const wchar_t *yWC_string, const wchar_t *units) {
+void FunctionEditor_drawHorizontalHair (FunctionEditor me, double yWC, const char32 *yWC_string, const char32 *units) {
 	Graphics_setColour (my d_graphics, Graphics_RED);
 	Graphics_line (my d_graphics, my d_startWindow, yWC, my d_endWindow, yWC);
 	Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_HALF);
-	Graphics_text2 (my d_graphics, my d_startWindow, yWC, yWC_string, units);
+	Graphics_text (my d_graphics, my d_startWindow, yWC,   yWC_string, units);
 }
 
 void FunctionEditor_drawGridLine (FunctionEditor me, double yWC) {
@@ -1633,15 +1641,15 @@ void FunctionEditor_drawGridLine (FunctionEditor me, double yWC) {
 void FunctionEditor_garnish (FunctionEditor me) {
 	if (my pref_picture_drawSelectionTimes ()) {
 		if (my d_startSelection >= my d_startWindow && my d_startSelection <= my d_endWindow)
-			Graphics_markTop (my pictureGraphics, my d_startSelection, true, true, false, NULL);
+			Graphics_markTop (my pictureGraphics, my d_startSelection, true, true, false, nullptr);
 		if (my d_endSelection != my d_startSelection && my d_endSelection >= my d_startWindow && my d_endSelection <= my d_endWindow)
-			Graphics_markTop (my pictureGraphics, my d_endSelection, true, true, false, NULL);
+			Graphics_markTop (my pictureGraphics, my d_endSelection, true, true, false, nullptr);
 	}
 	if (my pref_picture_drawSelectionHairs ()) {
 		if (my d_startSelection >= my d_startWindow && my d_startSelection <= my d_endWindow)
-			Graphics_markTop (my pictureGraphics, my d_startSelection, false, false, true, NULL);
+			Graphics_markTop (my pictureGraphics, my d_startSelection, false, false, true, nullptr);
 		if (my d_endSelection != my d_startSelection && my d_endSelection >= my d_startWindow && my d_endSelection <= my d_endWindow)
-			Graphics_markTop (my pictureGraphics, my d_endSelection, false, false, true, NULL);
+			Graphics_markTop (my pictureGraphics, my d_endSelection, false, false, true, nullptr);
 	}
 }
 
diff --git a/fon/FunctionEditor.h b/fon/FunctionEditor.h
index 8849263..2f64a94 100644
--- a/fon/FunctionEditor.h
+++ b/fon/FunctionEditor.h
@@ -2,7 +2,7 @@
 #define _FunctionEditor_h_
 /* FunctionEditor.h
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,106 +29,110 @@ struct FunctionEditor_picture {
 };
 
 Thing_define (FunctionEditor, Editor) {
-	// new data:
-	public:
-		/* Subclass may change the following attributes, */
-		/* but has to respect the invariants, */
-		/* and has to call FunctionEditor_marksChanged () */
-		/* immediately after making the changes. */
-		double tmin, tmax, d_startWindow, d_endWindow;
-		double d_startSelection, d_endSelection;   // markers
-			/* These attributes are all expressed in seconds. Invariants: */
-			/*    tmin <= startWindow < endWindow <= tmax; */
-			/*    tmin <= (startSelection, endSelection) <= tmax; */
-
-		Graphics d_graphics;   // used in the 'draw' method
-		short functionViewerLeft, functionViewerRight;   // size of drawing areas in pixels
-		short selectionViewerLeft, selectionViewerRight;   // size of drawing areas in pixels
-		short height;   // size of drawing areas in pixels
-		GuiText text;   // optional text at top
-		int shiftKeyPressed;   // information for the 'play' method
-		bool playingCursor, playingSelection;   // information for end of play
-		struct FunctionEditor_picture picture;
-
-		/* Private: */
-		GuiDrawingArea drawingArea;
-		GuiScrollBar scrollBar;
-		GuiCheckButton groupButton;
-		GuiObject bottomArea;
-		bool group, enableUpdates;
-		int nrect;
-		struct { double left, right, bottom, top; } rect [8];
-		double marker [1 + 3], playCursor, startZoomHistory, endZoomHistory;
-		int numberOfMarkers;
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_info ();
-		virtual void v_createMenus ();
-		virtual void v_createMenuItems_file (EditorMenu menu);
-		virtual void v_createMenuItems_query (EditorMenu menu);
-		virtual void v_createChildren ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_dataChanged ();
-	// new methods:
-		virtual void v_draw () { }
-			/*
-			 * Message: "draw your part of the data between startWindow and endWindow."
-			 */
-		virtual void v_drawSelectionViewer () { }
-		virtual void v_prepareDraw () { }   // for less flashing
-		virtual const wchar_t * v_format_domain () { return L"Time domain:"; }
-		virtual const wchar_t * v_format_short () { return L"%.3f"; }
-		virtual const wchar_t * v_format_long () { return L"%f"; }
-		virtual const wchar_t * v_format_units () { return L"seconds"; }
-		virtual const wchar_t * v_format_totalDuration () { return L"Total duration %f seconds"; }
-		virtual const wchar_t * v_format_window () { return L"Visible part %f seconds"; }
-		virtual const wchar_t * v_format_selection () { return L"%f (%.3f / s)"; }
-		virtual int v_fixedPrecision_long () { return 6; }
-		virtual bool v_hasText () { return false; }
-		virtual void v_play (double a_tmin, double a_tmax) { (void) a_tmin; (void) a_tmax; }
-			/*
-			 * Message: "the user clicked in one of the rectangles above or below the data window."
-			 */
-		virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
-			/*
-			 * Message: "the user clicked in data window with the left mouse button."
-			 * 'xWC' is the time;
-			 * 'yWC' is a value between 0.0 (bottom) and 1.0 (top);
-			 * 'shiftKeyPressed' flags if the Shift key was held down during the click.
-			 * Constraints:
-			 *    Return FunctionEditor_UPDATE_NEEDED if you want a window update, i.e.,
-			 *    if your 'click' moves the cursor or otherwise changes the appearance of the data.
-			 *    Return FunctionEditor_NO_UPDATE_NEEDED if you do not want a window update, e.g.,
-			 *    if your 'click' method just 'plays' something or puts a dialog on the screen.
-			 *    In the latter case, the 'ok' callback of the dialog should
-			 *    call FunctionEditor_marksChanged if necessary.
-			 * Behaviour of FunctionEditor::click ():
-			 *    moves the cursor to 'xWC', drags to create a selection, or extends the selection.
-			 */
-		virtual int v_clickB (double xWC, double yWC);
-		virtual int v_clickE (double xWC, double yWC);
-		virtual int v_playCallback (int phase, double tmin, double tmax, double t);
-		virtual void v_updateText () { }
-		virtual void v_prefs_addFields (EditorCommand cmd) { (void) cmd; }
-		virtual void v_prefs_setValues (EditorCommand cmd) { (void) cmd; }
-		virtual void v_prefs_getValues (EditorCommand cmd) { (void) cmd; }
-		virtual void v_createMenuItems_file_draw (EditorMenu menu) { (void) menu; }
-		virtual void v_createMenuItems_file_extract (EditorMenu menu) { (void) menu; }
-		virtual void v_createMenuItems_file_write (EditorMenu menu) { (void) menu; }
-		virtual void v_createMenuItems_view (EditorMenu menu);
-		virtual void v_createMenuItems_view_timeDomain (EditorMenu menu);
-		virtual void v_createMenuItems_view_audio (EditorMenu menu);
-		virtual void v_highlightSelection (double left, double right, double bottom, double top);
-		virtual void v_unhighlightSelection (double left, double right, double bottom, double top);
-		virtual double v_getBottomOfSoundArea () { return 0.0; }
-		virtual double v_getBottomOfSoundAndAnalysisArea () { return 0.0; }
-		virtual void v_form_pictureSelection (EditorCommand cmd);
-		virtual void v_ok_pictureSelection (EditorCommand cmd);
-		virtual void v_do_pictureSelection (EditorCommand cmd);
-    
-    // new preferences:
-    #include "FunctionEditor_prefs.h"
+	/* Subclass may change the following attributes, */
+	/* but has to respect the invariants, */
+	/* and has to call FunctionEditor_marksChanged () */
+	/* immediately after making the changes. */
+	double tmin, tmax, d_startWindow, d_endWindow;
+	double d_startSelection, d_endSelection;   // markers
+		/* These attributes are all expressed in seconds. Invariants: */
+		/*    tmin <= startWindow < endWindow <= tmax; */
+		/*    tmin <= (startSelection, endSelection) <= tmax; */
+
+	Graphics d_graphics;   // used in the 'draw' method
+	short functionViewerLeft, functionViewerRight;   // size of drawing areas in pixels
+	short selectionViewerLeft, selectionViewerRight;   // size of drawing areas in pixels
+	short height;   // size of drawing areas in pixels
+	GuiText text;   // optional text at top
+	int shiftKeyPressed;   // information for the 'play' method
+	bool playingCursor, playingSelection;   // information for end of play
+	struct FunctionEditor_picture picture;
+
+	/* Private: */
+	GuiDrawingArea drawingArea;
+	GuiScrollBar scrollBar;
+	GuiCheckButton groupButton;
+	GuiObject bottomArea;
+	bool group, enableUpdates;
+	int nrect;
+	struct { double left, right, bottom, top; } rect [8];
+	double marker [1 + 3], playCursor, startZoomHistory, endZoomHistory;
+	int numberOfMarkers;
 
+	void v_destroy ()
+		override;
+	void v_info ()
+		override;
+	void v_createMenus ()
+		override;
+	void v_createMenuItems_file (EditorMenu)
+		override;
+	void v_createMenuItems_query (EditorMenu)
+		override;
+	void v_createChildren ()
+		override;
+	void v_createHelpMenuItems (EditorMenu)
+		override;
+	void v_dataChanged ()
+		override;
+
+	virtual void v_draw () { }
+		/*
+		 * Message: "draw your part of the data between startWindow and endWindow."
+		 */
+	virtual void v_drawSelectionViewer () { }
+	virtual void v_prepareDraw () { }   // for less flashing
+	virtual const char32 * v_format_domain () { return U"Time domain:"; }
+	virtual const char * v_format_short () { return u8"%.3f"; }
+	virtual const char * v_format_long () { return u8"%f"; }
+	virtual const char32 * v_format_units () { return U"seconds"; }
+	virtual const char * v_format_totalDuration () { return u8"Total duration %f seconds"; }
+	virtual const char * v_format_window () { return u8"Visible part %f seconds"; }
+	virtual const char * v_format_selection () { return u8"%f (%.3f / s)"; }
+	virtual int v_fixedPrecision_long () { return 6; }
+	virtual bool v_hasText () { return false; }
+	virtual void v_play (double /* timeFrom */, double /* timeTo */) { }
+		/*
+		 * Message: "the user clicked in one of the rectangles above or below the data window."
+		 */
+	virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
+		/*
+		 * Message: "the user clicked in data window with the left mouse button."
+		 * 'xWC' is the time;
+		 * 'yWC' is a value between 0.0 (bottom) and 1.0 (top);
+		 * 'shiftKeyPressed' flags if the Shift key was held down during the click.
+		 * Constraints:
+		 *    Return FunctionEditor_UPDATE_NEEDED if you want a window update, i.e.,
+		 *    if your 'click' moves the cursor or otherwise changes the appearance of the data.
+		 *    Return FunctionEditor_NO_UPDATE_NEEDED if you do not want a window update, e.g.,
+		 *    if your 'click' method just 'plays' something or puts a dialog on the screen.
+		 *    In the latter case, the 'ok' callback of the dialog should
+		 *    call FunctionEditor_marksChanged if necessary.
+		 * Behaviour of FunctionEditor::click ():
+		 *    moves the cursor to 'xWC', drags to create a selection, or extends the selection.
+		 */
+	virtual int v_clickB (double xWC, double yWC);
+	virtual int v_clickE (double xWC, double yWC);
+	virtual int v_playCallback (int phase, double tmin, double tmax, double t);
+	virtual void v_updateText () { }
+	virtual void v_prefs_addFields (EditorCommand) { }
+	virtual void v_prefs_setValues (EditorCommand) { }
+	virtual void v_prefs_getValues (EditorCommand) { }
+	virtual void v_createMenuItems_file_draw (EditorMenu) { }
+	virtual void v_createMenuItems_file_extract (EditorMenu) { }
+	virtual void v_createMenuItems_file_write (EditorMenu) { }
+	virtual void v_createMenuItems_view (EditorMenu);
+	virtual void v_createMenuItems_view_timeDomain (EditorMenu);
+	virtual void v_createMenuItems_view_audio (EditorMenu);
+	virtual void v_highlightSelection (double left, double right, double bottom, double top);
+	virtual void v_unhighlightSelection (double left, double right, double bottom, double top);
+	virtual double v_getBottomOfSoundArea () { return 0.0; }
+	virtual double v_getBottomOfSoundAndAnalysisArea () { return 0.0; }
+	virtual void v_form_pictureSelection (EditorCommand);
+	virtual void v_ok_pictureSelection (EditorCommand);
+	virtual void v_do_pictureSelection (EditorCommand);
+
+    #include "FunctionEditor_prefs.h"
 };
 
 int theFunctionEditor_playCallback (void *void_me, int phase, double tmin, double tmax, double t);
@@ -137,21 +141,21 @@ int theFunctionEditor_playCallback (void *void_me, int phase, double tmin, doubl
 	Attributes:
 		data: must be a Function.
 
-	int clickB (I, double xWC, double yWC);
+	int clickB (double xWC, double yWC);
 		"user clicked in data window with the middle mouse button (Mac: control- or option-click)."
 		'xWC' is the time; 'yWC' is a value between 0.0 (bottom) and 1.0 (top).
 		For the return value, see the 'click' method.
 		FunctionEditor::clickB simply moves the start of the selection (B) to 'xWC',
 			with the sole statement 'my startSelection = xWC'.
 
-	int clickE (I, double xWC, double yWC);
+	int clickE (double xWC, double yWC);
 		"user clicked in data window with the right mouse button (Mac: command-click)."
 		'xWC' is the time; 'yWC' is a value between 0.0 (bottom) and 1.0 (top).
 		For the return value, see the 'click' method.
 		FunctionEditor::clickB simply moves the end of the selection (E) to 'xWC',
 			with the sole statement 'my endSelection = xWC'.
 
-	void key (I, unsigned char key);
+	void key (unsigned char key);
 		"user typed a key to the data window."
 		FunctionEditor::key ignores this message.
 */
@@ -160,7 +164,7 @@ int theFunctionEditor_playCallback (void *void_me, int phase, double tmin, doubl
 #define FunctionEditor_UPDATE_NEEDED  1
 #define FunctionEditor_NO_UPDATE_NEEDED  0
 
-void FunctionEditor_init (FunctionEditor me, const wchar_t *title, Function data);
+void FunctionEditor_init (FunctionEditor me, const char32 *title, Function data);
 /*
 	Function:
 		creates an Editor with a drawing area, a scroll bar and some buttons.
@@ -239,10 +243,10 @@ void FunctionEditor_ungroup (FunctionEditor me);
 /* The x axis of the window is supposed to have been set to [my startWindow, my endWindow]. */
 /* Preconditions: default line type, default line width. */
 /* Postconditions: default line type, default line width, undefined colour, undefined text alignment. */
-void FunctionEditor_drawRangeMark (FunctionEditor me, double yWC, const wchar_t *yWC_string, const wchar_t *units, int verticalAlignment);
-void FunctionEditor_drawCursorFunctionValue (FunctionEditor me, double yWC, const wchar_t *yWC_string, const wchar_t *units);
-void FunctionEditor_insertCursorFunctionValue (FunctionEditor me, double yWC, const wchar_t *yWC_string, const wchar_t *units, double minimum, double maximum);
-void FunctionEditor_drawHorizontalHair (FunctionEditor me, double yWC, const wchar_t *yWC_string, const wchar_t *units);
+void FunctionEditor_drawRangeMark (FunctionEditor me, double yWC, const char32 *yWC_string, const char32 *units, int verticalAlignment);
+void FunctionEditor_drawCursorFunctionValue (FunctionEditor me, double yWC, const char32 *yWC_string, const char32 *units);
+void FunctionEditor_insertCursorFunctionValue (FunctionEditor me, double yWC, const char32 *yWC_string, const char32 *units, double minimum, double maximum);
+void FunctionEditor_drawHorizontalHair (FunctionEditor me, double yWC, const char32 *yWC_string, const char32 *units);
 void FunctionEditor_drawGridLine (FunctionEditor me, double yWC);
 
 void FunctionEditor_insetViewport (FunctionEditor me);
diff --git a/fon/FunctionEditor_prefs.h b/fon/FunctionEditor_prefs.h
index 49af777..ba1ab39 100644
--- a/fon/FunctionEditor_prefs.h
+++ b/fon/FunctionEditor_prefs.h
@@ -1,6 +1,6 @@
 /* FunctionEditor_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,14 +18,15 @@
  */
 
 prefs_begin (FunctionEditor)
-	// new:
-		prefs_add_int  (FunctionEditor, shellWidth,                 1, L"700")
-		prefs_add_int  (FunctionEditor, shellHeight,                1, L"440")
-		prefs_add_bool (FunctionEditor, synchronizedZoomAndScroll,  1, true)
-		prefs_add_bool_with_data   (FunctionEditor, showSelectionViewer, 1, false)
-		prefs_add_double_with_data (FunctionEditor, arrowScrollStep,     1, L"0.05")
-		prefs_add_bool (FunctionEditor, picture_drawSelectionTimes, 1, true)
-		prefs_add_bool (FunctionEditor, picture_drawSelectionHairs, 1, true)
+
+	prefs_add_int  (FunctionEditor, shellWidth,                 1, U"700")
+	prefs_add_int  (FunctionEditor, shellHeight,                1, U"440")
+	prefs_add_bool (FunctionEditor, synchronizedZoomAndScroll,  1, true)
+	prefs_add_bool_with_data   (FunctionEditor, showSelectionViewer, 1, false)
+	prefs_add_double_with_data (FunctionEditor, arrowScrollStep,     1, U"0.05")
+	prefs_add_bool (FunctionEditor, picture_drawSelectionTimes, 1, true)
+	prefs_add_bool (FunctionEditor, picture_drawSelectionHairs, 1, true)
+
 prefs_end (FunctionEditor)
 
 /* End of file FunctionEditor_prefs.h */
diff --git a/fon/Function_def.h b/fon/Function_def.h
index a3d269e..d0efa90 100644
--- a/fon/Function_def.h
+++ b/fon/Function_def.h
@@ -1,6 +1,6 @@
 /* Function_def.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,35 +19,41 @@
 
 
 #define ooSTRUCT Function
-oo_DEFINE_CLASS (Function, Data)
+oo_DEFINE_CLASS (Function, Daata)
 
 	oo_DOUBLE (xmin)
 	oo_DOUBLE (xmax)
 
 	#if oo_READING
 		if (xmin > xmax)
-			Melder_throw ("Wrong xmin ", xmin, " and xmax ", xmax, ".");
+			Melder_throw (U"Wrong xmin ", xmin, U" and xmax ", xmax, U".");
 	#endif
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
-			virtual bool v_hasGetXmin () { return true; }   virtual double v_getXmin () { return xmin; }
-			virtual bool v_hasGetXmax () { return true; }   virtual double v_getXmax () { return xmax; }
-		// new methods:
-			virtual int v_domainQuantity () { return 0; }
-			virtual int v_getMinimumUnit (long ilevel) { (void) ilevel; return 0; }
-			virtual int v_getMaximumUnit (long ilevel) { (void) ilevel; return 0; }
-			virtual const wchar_t * v_getUnitText (long ilevel, int unit, unsigned long flags)
-				{ (void) ilevel; (void) unit; (void) flags; return L""; }
-			virtual bool v_isUnitLogarithmic (long ilevel, int unit)
-				{ (void) ilevel; (void) unit; return false; }
-			virtual double v_convertStandardToSpecialUnit (double value, long ilevel, int unit)
-				{ (void) ilevel; (void) unit; return value; }
-			virtual double v_convertSpecialToStandardUnit (double value, long ilevel, int unit)
-				{ (void) ilevel; (void) unit; return value; }
-			virtual void v_shiftX (double xfrom, double xto);
-			virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		void v_info ()
+			override;
+		bool v_hasGetXmin ()
+			override { return true; }
+		double v_getXmin ()
+			override { return xmin; }
+		bool v_hasGetXmax ()
+			override { return true; }
+		double v_getXmax ()
+			override { return xmax; }
+
+		virtual int v_domainQuantity () { return 0; }
+		virtual int v_getMinimumUnit (long ilevel) { (void) ilevel; return 0; }
+		virtual int v_getMaximumUnit (long ilevel) { (void) ilevel; return 0; }
+		virtual const char32 * v_getUnitText (long ilevel, int unit, unsigned long flags)
+			{ (void) ilevel; (void) unit; (void) flags; return U""; }
+		virtual bool v_isUnitLogarithmic (long ilevel, int unit)
+			{ (void) ilevel; (void) unit; return false; }
+		virtual double v_convertStandardToSpecialUnit (double value, long ilevel, int unit)
+			{ (void) ilevel; (void) unit; return value; }
+		virtual double v_convertSpecialToStandardUnit (double value, long ilevel, int unit)
+			{ (void) ilevel; (void) unit; return value; }
+		virtual void v_shiftX (double xfrom, double xto);
+		virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
 	#endif
 
 oo_END_CLASS (Function)
diff --git a/fon/Harmonicity.cpp b/fon/Harmonicity.cpp
index f37e5bc..2100410 100644
--- a/fon/Harmonicity.cpp
+++ b/fon/Harmonicity.cpp
@@ -1,6 +1,6 @@
 /* Harmonicity.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -79,73 +79,73 @@ double Harmonicity_getQuantile (Harmonicity me, double quantile) {
 }
 
 void structHarmonicity :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
 	autoNUMvector <double> strengths (1, nx);
 	long nSounding = 0;
 	for (long ix = 1; ix <= nx; ix ++)
 		if (z [1] [ix] != -200)
 			strengths [++ nSounding] = z [1] [ix];
-	MelderInfo_writeLine (L"Time sampling:");
-	MelderInfo_writeLine (L"   Number of frames: ", Melder_integer (nx), L" (", Melder_integer (nSounding), L" sounding)");
-	MelderInfo_writeLine (L"   Time step: ", Melder_double (dx), L" seconds");
-	MelderInfo_writeLine (L"   First frame centred at: ", Melder_double (x1), L" seconds");
+	MelderInfo_writeLine (U"Time sampling:");
+	MelderInfo_writeLine (U"   Number of frames: ", nx, U" (", nSounding, U" sounding)");
+	MelderInfo_writeLine (U"   Time step: ", dx, U" seconds");
+	MelderInfo_writeLine (U"   First frame centred at: ", x1, U" seconds");
 	if (nSounding) {
 		double sum = 0, sumOfSquares = 0;
-		MelderInfo_writeLine (L"Periodicity-to-noise ratios of sounding frames:");
+		MelderInfo_writeLine (U"Periodicity-to-noise ratios of sounding frames:");
 		NUMsort_d (nSounding, strengths.peek());
-		MelderInfo_writeLine (L"   Median ", Melder_single (NUMquantile (nSounding, strengths.peek(), 0.50)), L" dB");
-		MelderInfo_writeLine (L"   10 % = ", Melder_single (NUMquantile (nSounding, strengths.peek(), 0.10)), L" dB   90 %% = ",
-			Melder_single (NUMquantile (nSounding, strengths.peek(), 0.90)), L" dB");
-		MelderInfo_writeLine (L"   16 % = ", Melder_single (NUMquantile (nSounding, strengths.peek(), 0.16)), L" dB   84 %% = ",
-			Melder_single (NUMquantile (nSounding, strengths.peek(), 0.84)), L" dB");
-		MelderInfo_writeLine (L"   25 % = ", Melder_single (NUMquantile (nSounding, strengths.peek(), 0.25)), L" dB   75 %% = ",
-			Melder_single (NUMquantile (nSounding, strengths.peek(), 0.75)), L" dB");
-		MelderInfo_writeLine (L"Minimum: ", Melder_single (strengths [1]), L" dB");
-		MelderInfo_writeLine (L"Maximum: ", Melder_single (strengths [nSounding]), L" dB");
+		MelderInfo_writeLine (U"   Median ", Melder_single (NUMquantile (nSounding, strengths.peek(), 0.50)), U" dB");
+		MelderInfo_writeLine (U"   10 % = ", Melder_single (NUMquantile (nSounding, strengths.peek(), 0.10)), U" dB   90 %% = ",
+			Melder_single (NUMquantile (nSounding, strengths.peek(), 0.90)), U" dB");
+		MelderInfo_writeLine (U"   16 % = ", Melder_single (NUMquantile (nSounding, strengths.peek(), 0.16)), U" dB   84 %% = ",
+			Melder_single (NUMquantile (nSounding, strengths.peek(), 0.84)), U" dB");
+		MelderInfo_writeLine (U"   25 % = ", Melder_single (NUMquantile (nSounding, strengths.peek(), 0.25)), U" dB   75 %% = ",
+			Melder_single (NUMquantile (nSounding, strengths.peek(), 0.75)), U" dB");
+		MelderInfo_writeLine (U"Minimum: ", Melder_single (strengths [1]), U" dB");
+		MelderInfo_writeLine (U"Maximum: ", Melder_single (strengths [nSounding]), U" dB");
 		for (long i = 1; i <= nSounding; i ++) {
 			double f = strengths [i];
 			sum += f;
 			sumOfSquares += f * f;
 		}
-		MelderInfo_writeLine (L"Average: ", Melder_single (sum / nSounding), L" dB");
+		MelderInfo_writeLine (U"Average: ", Melder_single (sum / nSounding), U" dB");
 		if (nSounding > 1) {
 			double var = (sumOfSquares - sum * sum / nSounding) / (nSounding - 1);
-			MelderInfo_writeLine (L"Standard deviation: ", Melder_single (var < 0.0 ? 0.0 : sqrt (var)), L" dB");
+			MelderInfo_writeLine (U"Standard deviation: ", Melder_single (var < 0.0 ? 0.0 : sqrt (var)), U" dB");
 		}
 	}
 }
 
-Harmonicity Harmonicity_create (double tmin, double tmax, long nt, double dt, double t1) {
+autoHarmonicity Harmonicity_create (double tmin, double tmax, long nt, double dt, double t1) {
 	try {
 		autoHarmonicity me = Thing_new (Harmonicity);
 		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, 1, 1, 1, 1, 1);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Harmonicity not created.");
+		Melder_throw (U"Harmonicity not created.");
 	}
 }
 
-Matrix Harmonicity_to_Matrix (Harmonicity me) {
+autoMatrix Harmonicity_to_Matrix (Harmonicity me) {
 	try {
 		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1);
 		NUMvector_copyElements (my z [1], thy z [1], 1, my nx);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, "not converted to Matrix.");
+		Melder_throw (me, U"not converted to Matrix.");
 	}
 }
 
-Harmonicity Matrix_to_Harmonicity (Matrix me) {
+autoHarmonicity Matrix_to_Harmonicity (Matrix me) {
 	try {
 		autoHarmonicity thee = Harmonicity_create (my xmin, my xmax, my nx, my dx, my x1);
 		NUMvector_copyElements (my z [1], thy z [1], 1, my nx);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, "not converted to Harmonicity.");
+		Melder_throw (me, U"not converted to Harmonicity.");
 	}
 }
 
diff --git a/fon/Harmonicity.h b/fon/Harmonicity.h
index 1e18267..9f8d522 100644
--- a/fon/Harmonicity.h
+++ b/fon/Harmonicity.h
@@ -2,7 +2,7 @@
 #define _Harmonicity_h_
 /* Harmonicity.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,10 +22,10 @@
 #include "Vector.h"
 
 Thing_define (Harmonicity, Vector) {
-	// overridden methods:
-	protected:
-		virtual void v_info ();
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
+	void v_info ()
+		override;
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
 };
 
 /* Attributes:
@@ -42,7 +42,7 @@ Thing_define (Harmonicity, Vector) {
 			// -200 means silence.
 */
 
-Harmonicity Harmonicity_create (double tmin, double tmax, long nt, double dt, double t1);
+autoHarmonicity Harmonicity_create (double tmin, double tmax, long nt, double dt, double t1);
 
 void Harmonicity_draw (Harmonicity me, double tmin, double tmax, double min, double max);
 /*
@@ -55,8 +55,8 @@ double Harmonicity_getMean (Harmonicity me, double tmin, double tmax);
 double Harmonicity_getStandardDeviation (Harmonicity me, double tmin, double tmax);
 double Harmonicity_getQuantile (Harmonicity me, double quantile);
 
-Matrix Harmonicity_to_Matrix (Harmonicity me);
-Harmonicity Matrix_to_Harmonicity (Matrix me);
+autoMatrix Harmonicity_to_Matrix (Harmonicity me);
+autoHarmonicity Matrix_to_Harmonicity (Matrix me);
 
 /* End of file Harmonicity.h */
 #endif
diff --git a/fon/Harmonics.h b/fon/Harmonics.h
index bde8a25..ee2eee3 100644
--- a/fon/Harmonics.h
+++ b/fon/Harmonics.h
@@ -2,7 +2,7 @@
 #define _Harmonics_h_
 /* Harmonics.h
  *
- * Copyright (C) 2011 Paul Boersma
+ * Copyright (C) 2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,25 +23,25 @@
 #include "Sound.h"
 
 #include "Harmonics_def.h"
-oo_CLASS_CREATE (Harmonics, Data);
+oo_CLASS_CREATE (Harmonics, Daata);
 
-Harmonics Harmonics_create (long numberOfHarmonics);
+autoHarmonics Harmonics_create (long numberOfHarmonics);
 
 void Harmonics_draw (Harmonics me, Graphics g, double fmin, double fmax,
-	double minimum, double maximum, int garnish, const wchar_t *method);
+	double minimum, double maximum, int garnish, const char32 *method);
 
-Matrix Harmonics_to_Matrix (Harmonics me);
-Harmonics Matrix_to_Harmonics (Matrix me);
+autoMatrix Harmonics_to_Matrix (Harmonics me);
+autoHarmonics Matrix_to_Harmonics (Matrix me);
 
 /* Direct computation. */
 
-Harmonics PointProcess_Sound_to_Harmonics (PointProcess pulses, Sound sound,
+autoHarmonics PointProcess_Sound_to_Harmonics (PointProcess pulses, Sound sound,
 	long maximumHarmonic,
 	double shortestPeriod, double longestPeriod, double maximumPeriodFactor);
 
 /* Shortcut. */
 
-Harmonics Sound_to_Harmonics (Sound me, double bandwidth);
+autoHarmonics Sound_to_Harmonics (Sound me, double bandwidth);
 
 /* End of file Harmonics.h */
 #endif
diff --git a/fon/Harmonics_def.h b/fon/Harmonics_def.h
index c240bec..83ed24d 100644
--- a/fon/Harmonics_def.h
+++ b/fon/Harmonics_def.h
@@ -1,6 +1,6 @@
 /* Harmonics_def.h
  *
- * Copyright (C) 2011 Paul Boersma
+ * Copyright (C) 2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,16 +19,15 @@
 
 
 #define ooSTRUCT Harmonics
-oo_DEFINE_CLASS (Harmonics, Data)
+oo_DEFINE_CLASS (Harmonics, Daata)
 
 	oo_LONG (numberOfHarmonics)
 
 	oo_DOUBLE_VECTOR (harmonics, numberOfHarmonics)
 
 	#if oo_DECLARING
-		// overridden methods:
-		public:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (Harmonics)
diff --git a/fon/Image.h b/fon/Image.h
index a699f8c..f94711b 100644
--- a/fon/Image.h
+++ b/fon/Image.h
@@ -2,7 +2,7 @@
 #define _Image_h_
 /* Image.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,16 +34,16 @@ oo_CLASS_CREATE (Image, Sampled);
 	These represent the function values z (x1 + (ix - 1) * dx, y1 + (iy - 1) * dy).
 */
 
-int Image_init
-	(I, double xmin, double xmax, long nx, double dx, double x1,
-		double ymin, double ymax, long ny, double dy, double y1);
+//int Image_init
+//	(Image me, double xmin, double xmax, long nx, double dx, double x1,
+//		       double ymin, double ymax, long ny, double dy, double y1);
 
-Image Image_create
-	(double xmin, double xmax, long nx, double dx, double x1,
-	 double ymin, double ymax, long ny, double dy, double y1);
+//Image Image_create
+//	(double xmin, double xmax, long nx, double dx, double x1,
+//	 double ymin, double ymax, long ny, double dy, double y1);
 /*
 	Function:
-		return a new empty Image, or NULL if out of memory.
+		return a new empty Image.
 	Preconditions:
 		xmin <= xmax;   ymin <= ymax;
 		nx >= 1;  ny >= 1;
@@ -62,11 +62,11 @@ Image Image_create
 		result -> z [1..ny] [1..nx] == 0;
 */
 
-long Image_getWindowExtrema (I, long ixmin, long ixmax, long iymin, long iymax,
-	unsigned char *minimum, unsigned char *maximum);
+//long Image_getWindowExtrema (I, long ixmin, long ixmax, long iymin, long iymax,
+//	unsigned char *minimum, unsigned char *maximum);
 
-void Image_paint (I, Graphics g, double xmin, double xmax, double ymin, double ymax,
-	unsigned char minimum, unsigned char maximum);
+//void Image_paint (I, Graphics g, double xmin, double xmax, double ymin, double ymax,
+//	unsigned char minimum, unsigned char maximum);
 /*
 	Every sample is drawn as a grey rectangle.
 	The larger the value of the sample, the darker the rectangle.
diff --git a/fon/Intensity.cpp b/fon/Intensity.cpp
index c530aca..6496150 100644
--- a/fon/Intensity.cpp
+++ b/fon/Intensity.cpp
@@ -1,6 +1,6 @@
 /* Intensity.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,15 +22,15 @@
 Thing_implement (Intensity, Vector, 2);
 
 void structIntensity :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"Time sampling:");
-	MelderInfo_writeLine (L"   Number of frames: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"   Time step: ", Melder_double (dx), L" seconds");
-	MelderInfo_writeLine (L"   First frame centred at: ", Melder_double (x1), L" seconds");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"Time sampling:");
+	MelderInfo_writeLine (U"   Number of frames: ", nx);
+	MelderInfo_writeLine (U"   Time step: ", dx, U" seconds");
+	MelderInfo_writeLine (U"   First frame centred at: ", x1, U" seconds");
 }
 
 double structIntensity :: v_convertStandardToSpecialUnit (double value, long ilevel, int unit) {
@@ -57,33 +57,33 @@ void Intensity_init (Intensity me, double tmin, double tmax, long nt, double dt,
 	Matrix_init (me, tmin, tmax, nt, dt, t1, 1.0, 1.0, 1, 1.0, 1.0);
 }
 
-Intensity Intensity_create (double tmin, double tmax, long nt, double dt, double t1) {
+autoIntensity Intensity_create (double tmin, double tmax, long nt, double dt, double t1) {
 	try {
 		autoIntensity me = Thing_new (Intensity);
 		Intensity_init (me.peek(), tmin, tmax, nt, dt, t1);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Intensity not created.");
+		Melder_throw (U"Intensity not created.");
 	}
 }
 
-Matrix Intensity_to_Matrix (Intensity me) {
+autoMatrix Intensity_to_Matrix (Intensity me) {
 	try {
 		autoMatrix thee = Thing_new (Matrix);
 		my structMatrix :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Intensity.");
+		Melder_throw (me, U": not converted to Intensity.");
 	}
 }
 
-Intensity Matrix_to_Intensity (Matrix me) {
+autoIntensity Matrix_to_Intensity (Matrix me) {
 	try {
 		autoIntensity thee = Thing_new (Intensity);
 		my structMatrix :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
@@ -106,10 +106,10 @@ void Intensity_draw (Intensity me, Graphics g, double tmin, double tmax,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"Intensity (dB)");
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Intensity (dB)");
 	}
 }
 
@@ -121,7 +121,7 @@ double Intensity_getAverage (Intensity me, double tmin, double tmax, int averagi
 	return
 		averagingMethod == Intensity_averaging_MEDIAN ?
 			Intensity_getQuantile (me, tmin, tmax, 0.50) :
-			Sampled_getMean_standardUnit (me, tmin, tmax, 0, averagingMethod, TRUE);
+			Sampled_getMean_standardUnit (me, tmin, tmax, 0, averagingMethod, true);
 }
 
 /* End of file Intensity.cpp */
diff --git a/fon/Intensity.h b/fon/Intensity.h
index 4246c80..ba2ec7e 100644
--- a/fon/Intensity.h
+++ b/fon/Intensity.h
@@ -2,7 +2,7 @@
 #define _Intensity_h_
 /* Intensity.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,20 +32,23 @@
 #include "Vector.h"
 
 Thing_define (Intensity, Vector) {
-	// overridden methods:
-		virtual void v_info ();
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
-		virtual double v_convertStandardToSpecialUnit (double value, long ilevel, int unit);
-		virtual double v_convertSpecialToStandardUnit (double value, long ilevel, int unit);
+	void v_info ()
+		override;
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
+	double v_convertStandardToSpecialUnit (double value, long ilevel, int unit)
+		override;
+	double v_convertSpecialToStandardUnit (double value, long ilevel, int unit)
+		override;
 };
 
-Intensity Intensity_create (double tmin, double tmax, long nt, double dt, double t1);
+autoIntensity Intensity_create (double tmin, double tmax, long nt, double dt, double t1);
 
 void Intensity_init (Intensity me, double tmin, double tmax, long nt, double dt, double t1);
 
-Matrix Intensity_to_Matrix (Intensity me);
+autoMatrix Intensity_to_Matrix (Intensity me);
 
-Intensity Matrix_to_Intensity (Matrix me);
+autoIntensity Matrix_to_Intensity (Matrix me);
 
 void Intensity_drawInside (Intensity me, Graphics g, double tmin, double tmax,
 	double minimum, double maximum);
diff --git a/fon/IntensityTier.cpp b/fon/IntensityTier.cpp
index 68d2075..334b4a7 100644
--- a/fon/IntensityTier.cpp
+++ b/fon/IntensityTier.cpp
@@ -1,6 +1,6 @@
 /* IntensityTier.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,81 +21,81 @@
 
 Thing_implement (IntensityTier, RealTier, 0);
 
-IntensityTier IntensityTier_create (double tmin, double tmax) {
+autoIntensityTier IntensityTier_create (double tmin, double tmax) {
 	try {
 		autoIntensityTier me = Thing_new (IntensityTier);
 		RealTier_init (me.peek(), tmin, tmax);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("IntensityTier not created.");
+		Melder_throw (U"IntensityTier not created.");
 	}
 }
 
 void IntensityTier_draw (IntensityTier me, Graphics g, double tmin, double tmax,
-	double ymin, double ymax, const wchar_t *method, int garnish)
+	double ymin, double ymax, const char32 *method, int garnish)
 {
-	RealTier_draw (me, g, tmin, tmax, ymin, ymax, garnish, method, L"Intensity (dB)");
+	RealTier_draw (me, g, tmin, tmax, ymin, ymax, garnish, method, U"Intensity (dB)");
 }
 
-IntensityTier PointProcess_upto_IntensityTier (PointProcess me, double intensity) {
+autoIntensityTier PointProcess_upto_IntensityTier (PointProcess me, double intensity) {
 	try {
 		return (IntensityTier) PointProcess_upto_RealTier (me, intensity, classIntensityTier);
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to IntensityTier.");
+		Melder_throw (me, U": not converted to IntensityTier.");
 	}
 }
 
-IntensityTier Intensity_downto_IntensityTier (Intensity me) {
+autoIntensityTier Intensity_downto_IntensityTier (Intensity me) {
 	try {
 		return (IntensityTier) Vector_to_RealTier (me, 1, classIntensityTier);
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to IntensityTier.");
+		Melder_throw (me, U": not converted to IntensityTier.");
 	}
 }
 
-IntensityTier Intensity_to_IntensityTier_peaks (Intensity me) {
+autoIntensityTier Intensity_to_IntensityTier_peaks (Intensity me) {
 	try {
 		return (IntensityTier) Vector_to_RealTier_peaks (me, 1, classIntensityTier);
 	} catch (MelderError) {
-		Melder_throw (me, ": peaks not converted to IntensityTier.");
+		Melder_throw (me, U": peaks not converted to IntensityTier.");
 	}
 }
 
-IntensityTier Intensity_to_IntensityTier_valleys (Intensity me) {
+autoIntensityTier Intensity_to_IntensityTier_valleys (Intensity me) {
 	try {
 		return (IntensityTier) Vector_to_RealTier_valleys (me, 1, classIntensityTier);
 	} catch (MelderError) {
-		Melder_throw (me, ": valleys not converted to IntensityTier.");
+		Melder_throw (me, U": valleys not converted to IntensityTier.");
 	}
 }
 
-IntensityTier Intensity_PointProcess_to_IntensityTier (Intensity me, PointProcess pp) {
+autoIntensityTier Intensity_PointProcess_to_IntensityTier (Intensity me, PointProcess pp) {
 	try {
 		autoIntensityTier temp = Intensity_downto_IntensityTier (me);
 		autoIntensityTier thee = IntensityTier_PointProcess_to_IntensityTier (temp.peek(), pp);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", pp, ": not converted to IntensityTier.");
+		Melder_throw (me, U" & ", pp, U": not converted to IntensityTier.");
 	}
 }
 
-IntensityTier IntensityTier_PointProcess_to_IntensityTier (IntensityTier me, PointProcess pp) {
+autoIntensityTier IntensityTier_PointProcess_to_IntensityTier (IntensityTier me, PointProcess pp) {
 	try {
-		if (my points -> size == 0) Melder_throw ("No intensity points.");
+		if (my points -> size == 0) Melder_throw (U"No intensity points.");
 		autoIntensityTier thee = IntensityTier_create (pp -> xmin, pp -> xmax);
 		for (long i = 1; i <= pp -> nt; i ++) {
 			double time = pp -> t [i];
 			double value = RealTier_getValueAtTime (me, time);
 			RealTier_addPoint (thee.peek(), time, value);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", pp, ": not converted to IntensityTier.");
+		Melder_throw (me, U" & ", pp, U": not converted to IntensityTier.");
 	}
 }
 
-TableOfReal IntensityTier_downto_TableOfReal (IntensityTier me) {
-	return RealTier_downto_TableOfReal (me, L"Time (s)", L"Intensity (dB)");
+autoTableOfReal IntensityTier_downto_TableOfReal (IntensityTier me) {
+	return RealTier_downto_TableOfReal (me, U"Time (s)", U"Intensity (dB)");
 }
 
 void Sound_IntensityTier_multiply_inline (Sound me, IntensityTier intensity) {
@@ -109,14 +109,14 @@ void Sound_IntensityTier_multiply_inline (Sound me, IntensityTier intensity) {
 	}
 }
 
-Sound Sound_IntensityTier_multiply (Sound me, IntensityTier intensity, int scale) {
+autoSound Sound_IntensityTier_multiply (Sound me, IntensityTier intensity, int scale) {
 	try {
 		autoSound thee = Data_copy (me);
 		Sound_IntensityTier_multiply_inline (thee.peek(), intensity);
 		if (scale) Vector_scale (thee.peek(), 0.9);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not multiplied with ", intensity, ".");
+		Melder_throw (me, U": not multiplied with ", intensity, U".");
 	}
 }
 
diff --git a/fon/IntensityTier.h b/fon/IntensityTier.h
index 30bdd5f..edacbd9 100644
--- a/fon/IntensityTier.h
+++ b/fon/IntensityTier.h
@@ -2,7 +2,7 @@
 #define _IntensityTier_h_
 /* IntensityTier.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,25 +25,24 @@
 #include "Sound.h"
 
 Thing_define (IntensityTier, RealTier) {
-	// overridden methods:
-	protected:
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
 };
 
-IntensityTier IntensityTier_create (double tmin, double tmax);
+autoIntensityTier IntensityTier_create (double tmin, double tmax);
 
 void IntensityTier_draw (IntensityTier me, Graphics g, double tmin, double tmax,
-	double ymin, double ymax, const wchar_t *method, int garnish);
+	double ymin, double ymax, const char32 *method, int garnish);
 
-IntensityTier PointProcess_upto_IntensityTier (PointProcess me, double intensity);
-IntensityTier Intensity_downto_IntensityTier (Intensity me);
-IntensityTier Intensity_to_IntensityTier_peaks (Intensity me);
-IntensityTier Intensity_to_IntensityTier_valleys (Intensity me);
-IntensityTier Intensity_PointProcess_to_IntensityTier (Intensity me, PointProcess pp);
-IntensityTier IntensityTier_PointProcess_to_IntensityTier (IntensityTier me, PointProcess pp);
-TableOfReal IntensityTier_downto_TableOfReal (IntensityTier me);
+autoIntensityTier PointProcess_upto_IntensityTier (PointProcess me, double intensity);
+autoIntensityTier Intensity_downto_IntensityTier (Intensity me);
+autoIntensityTier Intensity_to_IntensityTier_peaks (Intensity me);
+autoIntensityTier Intensity_to_IntensityTier_valleys (Intensity me);
+autoIntensityTier Intensity_PointProcess_to_IntensityTier (Intensity me, PointProcess pp);
+autoIntensityTier IntensityTier_PointProcess_to_IntensityTier (IntensityTier me, PointProcess pp);
+autoTableOfReal IntensityTier_downto_TableOfReal (IntensityTier me);
 void Sound_IntensityTier_multiply_inline (Sound me, IntensityTier intensity);
-Sound Sound_IntensityTier_multiply (Sound me, IntensityTier intensity, int scale);
+autoSound Sound_IntensityTier_multiply (Sound me, IntensityTier intensity, int scale);
 
 /* End of file IntensityTier.h */
 #endif
diff --git a/fon/IntensityTierEditor.cpp b/fon/IntensityTierEditor.cpp
index a1d6aa3..f6b86e7 100644
--- a/fon/IntensityTierEditor.cpp
+++ b/fon/IntensityTierEditor.cpp
@@ -1,6 +1,6 @@
 /* IntensityTierEditor.cpp
  *
- * Copyright (C) 1992-2011,2012,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,28 +22,28 @@
 
 Thing_implement (IntensityTierEditor, RealTierEditor, 0);
 
-static void menu_cb_IntensityTierHelp (EDITOR_ARGS) { EDITOR_IAM (IntensityTierEditor); Melder_help (L"IntensityTier"); }
+static void menu_cb_IntensityTierHelp (EDITOR_ARGS) { EDITOR_IAM (IntensityTierEditor); Melder_help (U"IntensityTier"); }
 
 void structIntensityTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	IntensityTierEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"IntensityTier help", 0, menu_cb_IntensityTierHelp);
+	EditorMenu_addCommand (menu, U"IntensityTier help", 0, menu_cb_IntensityTierHelp);
 }
 
 void structIntensityTierEditor :: v_play (double a_tmin, double a_tmax) {
 	if (our d_sound.data) {
 		Sound_playPart (our d_sound.data, a_tmin, a_tmax, theFunctionEditor_playCallback, this);
 	} else {
-		//IntensityTier_playPart (our data, a_tmin, a_tmax, FALSE);
+		//IntensityTier_playPart (our data, a_tmin, a_tmax, false);
 	}
 }
 
-IntensityTierEditor IntensityTierEditor_create (const wchar_t *title, IntensityTier intensity, Sound sound, bool ownSound) {
+autoIntensityTierEditor IntensityTierEditor_create (const char32 *title, IntensityTier intensity, Sound sound, bool ownSound) {
 	try {
 		autoIntensityTierEditor me = Thing_new (IntensityTierEditor);
 		RealTierEditor_init (me.peek(), title, (RealTier) intensity, sound, ownSound);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("IntensityTier window not created.");
+		Melder_throw (U"IntensityTier window not created.");
 	}
 }
 
diff --git a/fon/IntensityTierEditor.h b/fon/IntensityTierEditor.h
index e7eca22..10630fc 100644
--- a/fon/IntensityTierEditor.h
+++ b/fon/IntensityTierEditor.h
@@ -2,7 +2,7 @@
 #define _IntensityTierEditor_h_
 /* IntensityTierEditor.h
  *
- * Copyright (C) 1992-2011,2012 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,27 +24,40 @@
 #include "Sound.h"
 
 Thing_define (IntensityTierEditor, RealTierEditor) {
-	// overridden methods:
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_play (double tmin, double tmax);
-		virtual const wchar_t * v_quantityText () { return L"Intensity (dB)"; }
-		virtual const wchar_t * v_quantityKey () { return L"Intensity"; }
-		virtual const wchar_t * v_rightTickUnits () { return L" dB"; }
-		virtual double v_defaultYmin () { return 50.0; }
-		virtual double v_defaultYmax () { return 100.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set intensity range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"50.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"100.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum intensity (dB)"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum intensity (dB)"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum intensity"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum intensity"; }
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_play (double tmin, double tmax)
+		override;
+	const char32 * v_quantityText ()
+		override { return U"Intensity (dB)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Intensity"; }
+	const char32 * v_rightTickUnits ()
+		override { return U" dB"; }
+	double v_defaultYmin ()
+		override { return 50.0; }
+	double v_defaultYmax ()
+		override { return 100.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set intensity range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"50.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"100.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum intensity (dB)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum intensity (dB)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum intensity"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum intensity"; }
 };
 
-IntensityTierEditor IntensityTierEditor_create (const wchar_t *title,
+autoIntensityTierEditor IntensityTierEditor_create (const char32 *title,
 	IntensityTier intensity, Sound sound, bool ownSound);
 /*
-	'sound' may be NULL.
+	'sound' may be null.
 */
 
 /* End of file IntensityTierEditor.h */
diff --git a/fon/Label.cpp b/fon/Label.cpp
index c136f9f..9907fe9 100644
--- a/fon/Label.cpp
+++ b/fon/Label.cpp
@@ -1,6 +1,6 @@
 /* Label.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,27 +30,27 @@ void structAutosegment :: v_copy (thou) {
 bool structAutosegment :: v_equal (thou) {
 	thouart (Autosegment);
 	if (! Autosegment_Parent :: v_equal (thee)) return false;
-	if (name == NULL && thy name == NULL) return true;   // shortcut: no names
-	if (name == NULL || thy name == NULL) return false;
-	return wcsequ (name, thy name);
+	if (! our name && ! thy name) return true;   // shortcut: no names
+	if (! our name || ! thy name) return false;
+	return str32equ (name, thy name);
 }
 
 static struct structData_Description theAutosegment_description [] = {
-	{ L"Autosegment", inheritwa, 0, sizeof (struct structAutosegment), L"Autosegment", & theClassInfo_Function },
-	{ L"name", stringwa, Melder_offsetof (Autosegment, name), sizeof (wchar_t *) },
+	{ U"Autosegment", inheritwa, 0, sizeof (struct structAutosegment), U"Autosegment", & theClassInfo_Function },
+	{ U"name", stringwa, Melder_offsetof (Autosegment, name), sizeof (char32 *) },
 	{ 0 } };
 Data_Description structAutosegment :: s_description = & theAutosegment_description [0];
 
-Autosegment Autosegment_create (double tmin, double tmax, const wchar_t *label) {
+autoAutosegment Autosegment_create (double tmin, double tmax, const char32 *label) {
 	try {
 		autoAutosegment me = Thing_new (Autosegment);
 		Function_init (me.peek(), tmin, tmax);
-		if (label != NULL) {
+		if (label) {
 			Thing_setName (me.peek(), label);
 		}
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Autosegment not created.");
+		Melder_throw (U"Autosegment not created.");
 	}
 }
 
@@ -65,53 +65,51 @@ int structTier :: compare (I, thou) {
 
 Thing_implement (Tier, Sorted, 0);
 
-void Tier_init (I, long initialCapacity) {
-	iam (Tier);
+void Tier_init (Tier me, long initialCapacity) {
 	Sorted_init (me, classAutosegment, initialCapacity);
-	Collection_addItem (me, Autosegment_create (-1e30, 1e30, NULL));
+	Collection_addItem (me, Autosegment_create (-1e30, 1e30, nullptr).transfer());
 }
 
-Tier Tier_create (long initialCapacity) {
+autoTier Tier_create (long initialCapacity) {
 	try {
 		autoTier me = Thing_new (Tier);
 		Tier_init (me.peek(), initialCapacity);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Tier not created.");
+		Melder_throw (U"Tier not created.");
 	}
 }
 
-long Tier_timeToIndex (Tier me, double t) {
+long Tier_timeToIndex (Tier me, double time) {
 	for (long i = 1; i <= my size; i ++) {
 		Autosegment interval = (Autosegment) my item [i];
-		if (t >= interval -> xmin && t < interval -> xmax)
+		if (time >= interval -> xmin && time < interval -> xmax)
 			return i;
 	}
-	return 0;   /* Empty tier or very large t. */
+	return 0;   // empty tier or very large time
 }
 
 Thing_implement (Label, Ordered, 0);
 
-void Label_init (I, long initialNumberOfTiers) {
-	iam (Label);
+void Label_init (Label me, long initialNumberOfTiers) {
 	Ordered_init (me, classTier, initialNumberOfTiers);
 	for (long i = 1; i <= initialNumberOfTiers; i ++) {
-		Collection_addItem (me, Tier_create (10));
+		Collection_addItem (me, Tier_create (10).transfer());
 	}
 }
 
-Label Label_create (long initialNumberOfTiers) {
+autoLabel Label_create (long initialNumberOfTiers) {
 	try {
 		autoLabel me = Thing_new (Label);
 		Label_init (me.peek(), initialNumberOfTiers);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Label not created.");
+		Melder_throw (U"Label not created.");
 	}
 }
 
 void Label_addTier (Label me) {
-	Collection_addItem (me, Tier_create (10));
+	Collection_addItem (me, Tier_create (10).transfer());
 }
 
 void Label_suggestDomain (Label me, double *tmin, double *tmax) {
diff --git a/fon/Label.h b/fon/Label.h
index d7c37a3..a03faac 100644
--- a/fon/Label.h
+++ b/fon/Label.h
@@ -2,7 +2,7 @@
 #define _Label_h_
 /* Label.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,52 +23,53 @@
 #include "Function.h"
 
 Thing_define (Autosegment, Function) {
-	// overridden methods:
-	protected:
-		virtual void v_copy (Any data_to);
-		virtual bool v_equal (Any otherData);
-		static Data_Description s_description;
-		virtual Data_Description v_description () { return s_description; }
+	void v_copy (Any data_to)
+		override;
+	bool v_equal (Any otherData)
+		override;
+	static Data_Description s_description;
+	Data_Description v_description ()
+		override { return s_description; }
 };
 
-Autosegment Autosegment_create (double tmin, double tmax, const wchar_t *label);
+autoAutosegment Autosegment_create (double tmin, double tmax, const char32 *label);
 /*
 	Function:
 		create a new instance of Autosegment.
 	Return value:
-		the new Autosegment, or NULL if out of memory.
+		the new Autosegment.
 	Preconditions:
 		tmax > tmin;
-		label may be NULL;
+		label may be null;
 	Postconditions:
 		result -> tmin == tmin;
 		result -> tmax == tmax;
-		if (label != NULL)
-			result -> name == NULL;
+		if (label)
+			result -> name == nullptr;
 		else
 			result -> name [] == label [];   // 'label' copied into 'name'
 */
 
 Thing_define (Tier, Sorted) {
-	// overridden methods:
-		static int compare (Any data1, Any data2);
-		virtual int (*v_getCompareFunction ()) (Any data1, Any data2) { return compare; }
+	static int compare (Any data1, Any data2);
+	int (*v_getCompareFunction ()) (Any data1, Any data2)
+		override { return compare; }
 };
 
-void Tier_init (I, long initialCapacity);
+void Tier_init (Tier me, long initialCapacity);
 
-Tier Tier_create (long initialCapacity);
+autoTier Tier_create (long initialCapacity);
 /*
 	Function:
 		create a new Tier containing one Autosegment from -1e30 to 1e30.
 	Return value:
-		the new Tier, or NULL if out of memory.
+		the new Tier.
 	Postconditions:
 		my size == 1;
 		my item [1] -> methods == classAutosegment;
 		my item [1] -> xmin == -1e30;
 		my item [1] -> xmax == 1e30;
-		my item [1] -> name == NULL;
+		my item [1] -> name == nullptr;
 */
 
 long Tier_timeToIndex (Tier me, double t);
@@ -79,14 +80,12 @@ long Tier_timeToIndex (Tier me, double t);
 		result == 0 || my item [i] -> xmin <= result < my item [i] -> xmax;
 */
 
-void Tier_init (I, long initialCapacity);
-
 Thing_define (Label, Ordered) {
 };
 
-Label Label_create (long initialNumberOfTiers);
+autoLabel Label_create (long initialNumberOfTiers);
 
-void Label_init (I, long initialNumberOfTiers);
+void Label_init (Label me, long initialNumberOfTiers);
 
 void Label_addTier (Label me);
 
diff --git a/fon/LongSound.cpp b/fon/LongSound.cpp
index 8d82dc6..8de490c 100644
--- a/fon/LongSound.cpp
+++ b/fon/LongSound.cpp
@@ -1,6 +1,6 @@
 /* LongSound.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma, 2007 Erez Volk (for FLAC and MP3)
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma, 2007 Erez Volk (for FLAC and MP3)
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -54,11 +54,11 @@ Thing_implement (LongSound, Sampled, 0);
 
 static long prefs_bufferLength;
 
-void LongSound_preferences (void) {
-	Preferences_addLong (L"LongSound.bufferLength", & prefs_bufferLength, 60);   // seconds
+void LongSound_preferences () {
+	Preferences_addLong (U"LongSound.bufferLength", & prefs_bufferLength, 60);   // seconds
 }
 
-long LongSound_getBufferSizePref_seconds (void) { return prefs_bufferLength; }
+long LongSound_getBufferSizePref_seconds () { return prefs_bufferLength; }
 void LongSound_setBufferSizePref_seconds (long size) { prefs_bufferLength = size < 10 ? 10 : size > 10000 ? 10000: size; }
 
 void structLongSound :: v_destroy () {
@@ -79,23 +79,23 @@ void structLongSound :: v_destroy () {
 }
 
 void structLongSound :: v_info () {
-	static const wchar_t *encodingStrings [1+20] = { L"none",
-		L"linear 8 bit signed", L"linear 8 bit unsigned",
-		L"linear 16 bit big-endian", L"linear 16 bit little-endian",
-		L"linear 24 bit big-endian", L"linear 24 bit little-endian",
-		L"linear 32 bit big-endian", L"linear 32 bit little-endian",
-		L"mu-law", L"A-law", L"shorten", L"polyphone",
-		L"IEEE float 32 bit big-endian", L"IEEE float 32 bit little-endian",
-		L"FLAC", L"FLAC", L"FLAC", L"MP3", L"MP3", L"MP3" };
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"File name: ", Melder_fileToPath (& file));
-	MelderInfo_writeLine (L"File type: ", audioFileType > Melder_NUMBER_OF_AUDIO_FILE_TYPES ? L"unknown" : Melder_audioFileTypeString (audioFileType));
-	MelderInfo_writeLine (L"Number of channels: ", Melder_integer (numberOfChannels));
-	MelderInfo_writeLine (L"Encoding: ", encoding > 20 ? L"unknown" : encodingStrings [encoding]);
-	MelderInfo_writeLine (L"Sampling frequency: ", Melder_double (sampleRate), L" Hz");
-	MelderInfo_writeLine (L"Size: ", Melder_integer (nx), L" samples");
-	MelderInfo_writeLine (L"Start of sample data: ", Melder_integer (startOfData), L" bytes from the start of the file");
+	static const char32 *encodingStrings [1+20] = { U"none",
+		U"linear 8 bit signed", U"linear 8 bit unsigned",
+		U"linear 16 bit big-endian", U"linear 16 bit little-endian",
+		U"linear 24 bit big-endian", U"linear 24 bit little-endian",
+		U"linear 32 bit big-endian", U"linear 32 bit little-endian",
+		U"mu-law", U"A-law", U"shorten", U"polyphone",
+		U"IEEE float 32 bit big-endian", U"IEEE float 32 bit little-endian",
+		U"FLAC", U"FLAC", U"FLAC", U"MP3", U"MP3", U"MP3" };
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"File name: ", Melder_fileToPath (& file));
+	MelderInfo_writeLine (U"File type: ", audioFileType > Melder_NUMBER_OF_AUDIO_FILE_TYPES ? U"unknown" : Melder_audioFileTypeString (audioFileType));
+	MelderInfo_writeLine (U"Number of channels: ", numberOfChannels);
+	MelderInfo_writeLine (U"Encoding: ", encoding > 20 ? U"unknown" : encodingStrings [encoding]);
+	MelderInfo_writeLine (U"Sampling frequency: ", sampleRate, U" Hz");
+	MelderInfo_writeLine (U"Size: ", nx, U" samples");
+	MelderInfo_writeLine (U"Start of sample data: ", startOfData, U" bytes from the start of the file");
 }
 
 static void _LongSound_FLAC_convertFloats (LongSound me, const FLAC__int32 * const samples[], long bitsPerSample, long numberOfSamples) {
@@ -203,9 +203,11 @@ static void LongSound_init (LongSound me, MelderFile file) {
 	my f = file -> filePointer;
 	my audioFileType = MelderFile_checkSoundFile (file, & my numberOfChannels, & my encoding, & my sampleRate, & my startOfData, & my nx);
 	if (my audioFileType == 0)
-		Melder_throw ("File not recognized (LongSound only supports AIFF, AIFC, WAV, NeXT/Sun, NIST and FLAC).");
+		Melder_throw (U"File not recognized (LongSound only supports AIFF, AIFC, WAV, NeXT/Sun, NIST and FLAC).");
 	if (my encoding == Melder_SHORTEN || my encoding == Melder_POLYPHONE)
-		Melder_throw ("LongSound does not support sound files compressed with \"shorten\".");
+		Melder_throw (U"LongSound does not support sound files compressed with \"shorten\".");
+	if (my nx < 1)
+		Melder_throw (U"Audio file contains 0 samples.");
 	my xmin = 0.0;
 	my dx = 1 / my sampleRate;
 	my xmax = my nx * my dx;
@@ -226,55 +228,55 @@ static void LongSound_init (LongSound me, MelderFile file) {
 	}
 	my imin = 1;
 	my imax = 0;
-	my flacDecoder = NULL;
+	my flacDecoder = nullptr;
 	if (my audioFileType == Melder_FLAC) {
 		my flacDecoder = FLAC__stream_decoder_new ();
-		FLAC__stream_decoder_init_FILE (my flacDecoder, my f, _LongSound_FLAC_write, NULL, _LongSound_FLAC_error, me);
+		FLAC__stream_decoder_init_FILE (my flacDecoder, my f, _LongSound_FLAC_write, nullptr, _LongSound_FLAC_error, me);
 	}
-	my mp3f = NULL;
+	my mp3f = nullptr;
 	if (my audioFileType == Melder_MP3) {
 		my mp3f = mp3f_new ();
 		mp3f_set_file (my mp3f, my f);
 		mp3f_set_callback (my mp3f, _LongSound_MP3_convert, me);
 		if (! mp3f_analyze (my mp3f))
-			Melder_throw ("Unable to analyze MP3 file.");
-		Melder_warning (L"Time measurements in MP3 files can be off by several tens of milliseconds. "
-			"Please convert to WAV file if you need time precision or annotation.");
+			Melder_throw (U"Unable to analyze MP3 file.");
+		Melder_warning (U"Time measurements in MP3 files can be off by several tens of milliseconds. "
+			U"Please convert to WAV file if you need time precision or annotation.");
 	}
 }
 
 void structLongSound :: v_copy (thou) {
 	thouart (LongSound);
-	thy f = NULL;
-	thy buffer = NULL;
+	thy f = nullptr;
+	thy buffer = nullptr;
 	LongSound_init (thee, & file);
 }
 
-LongSound LongSound_open (MelderFile file) {
+autoLongSound LongSound_open (MelderFile file) {
 	try {
 		autoLongSound me = Thing_new (LongSound);
 		LongSound_init (me.peek(), file);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("LongSound not created.");
+		Melder_throw (U"LongSound not created.");
 	}
 }
 
 static void _LongSound_FLAC_process (LongSound me, long firstSample, long numberOfSamples) {
 	my compressedSamplesLeft = numberOfSamples - 1;
 	if (! FLAC__stream_decoder_seek_absolute (my flacDecoder, firstSample))
-		Melder_throw ("Cannot seek in FLAC file ", & my file, ".");
+		Melder_throw (U"Cannot seek in FLAC file ", & my file, U".");
 	while (my compressedSamplesLeft > 0) {
 		if (FLAC__stream_decoder_get_state (my flacDecoder) == FLAC__STREAM_DECODER_END_OF_STREAM)
-			Melder_throw ("FLAC file ", & my file, " too short.");
+			Melder_throw (U"FLAC file ", & my file, U" too short.");
 		if (! FLAC__stream_decoder_process_single (my flacDecoder))
-			Melder_throw ("Error decoding FLAC file ", & my file, ".");
+			Melder_throw (U"Error decoding FLAC file ", & my file, U".");
 	}
 }
 
 static void _LongSound_FILE_seekSample (LongSound me, long firstSample) {
 	if (fseek (my f, my startOfData + (firstSample - 1) * my numberOfChannels * my numberOfBytesPerSamplePoint, SEEK_SET))
-		Melder_throw ("Cannot seek in file ", & my file, ".");
+		Melder_throw (U"Cannot seek in file ", & my file, U".");
 }
 
 static void _LongSound_FLAC_readAudioToShort (LongSound me, short *buffer, long firstSample, long numberOfSamples) {
@@ -285,10 +287,10 @@ static void _LongSound_FLAC_readAudioToShort (LongSound me, short *buffer, long
 
 static void _LongSound_MP3_process (LongSound me, long firstSample, long numberOfSamples) {
 	if (! mp3f_seek (my mp3f, firstSample))
-		Melder_throw ("Cannot seek in MP3 file ", & my file, ".");
+		Melder_throw (U"Cannot seek in MP3 file ", & my file, U".");
 	my compressedSamplesLeft = numberOfSamples;
 	if (! mp3f_read (my mp3f, numberOfSamples))
-		Melder_throw ("Error decoding MP3 file ", & my file, ".");
+		Melder_throw (U"Error decoding MP3 file ", & my file, U".");
 }
 
 static void _LongSound_MP3_readAudioToShort (LongSound me, short *buffer, long firstSample, long numberOfSamples) {
@@ -327,20 +329,20 @@ void LongSound_readAudioToShort (LongSound me, short *buffer, long firstSample,
 	}
 }
 
-Sound LongSound_extractPart (LongSound me, double tmin, double tmax, int preserveTimes) {
+autoSound LongSound_extractPart (LongSound me, double tmin, double tmax, int preserveTimes) {
 	try {
 		if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; }
 		if (tmin < my xmin) tmin = my xmin;
 		if (tmax > my xmax) tmax = my xmax;
 		long imin, imax;
 		long n = Sampled_getWindowSamples (me, tmin, tmax, & imin, & imax);
-		if (n < 1) Melder_throw ("Less than 1 sample in window.");
+		if (n < 1) Melder_throw (U"Less than 1 sample in window.");
 		autoSound thee = Sound_create (my numberOfChannels, tmin, tmax, n, my dx, my x1 + (imin - 1) * my dx);
 		if (! preserveTimes) thy xmin = 0.0, thy xmax -= tmin, thy x1 -= tmin;
 		LongSound_readAudioToFloat (me, thy z, imin, n);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": Sound not extracted.");
+		Melder_throw (me, U": Sound not extracted.");
 	}
 }
 
@@ -366,28 +368,28 @@ static void writePartToOpenFile (LongSound me, int audioFileType, long imin, lon
 	my imax = 0;
 }
 
-void LongSound_writePartToAudioFile (LongSound me, int audioFileType, double tmin, double tmax, MelderFile file) {
+void LongSound_writePartToAudioFile (LongSound me, int audioFileType, double tmin, double tmax, MelderFile file, int numberOfBitsPerSamplePoint) {
 	try {
 		if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; }
 		if (tmin < my xmin) tmin = my xmin;
 		if (tmax > my xmax) tmax = my xmax;
 		long imin, imax;
 		long n = Sampled_getWindowSamples (me, tmin, tmax, & imin, & imax);
-		if (n < 1) Melder_throw (L"Less than 1 sample selected.");
+		if (n < 1) Melder_throw (U"Less than 1 sample selected.");
 		autoMelderFile mfile = MelderFile_create (file);
-		MelderFile_writeAudioFileHeader (file, audioFileType, my sampleRate, n, my numberOfChannels, 8 * my numberOfBytesPerSamplePoint);
-		writePartToOpenFile (me, audioFileType, imin, n, file, 0, 8 * my numberOfBytesPerSamplePoint);
-		MelderFile_writeAudioFileTrailer (file, audioFileType, my sampleRate, n, my numberOfChannels, 8 * my numberOfBytesPerSamplePoint);
+		MelderFile_writeAudioFileHeader (file, audioFileType, my sampleRate, n, my numberOfChannels, numberOfBitsPerSamplePoint);
+		writePartToOpenFile (me, audioFileType, imin, n, file, 0, numberOfBitsPerSamplePoint);
+		MelderFile_writeAudioFileTrailer (file, audioFileType, my sampleRate, n, my numberOfChannels, numberOfBitsPerSamplePoint);
 		mfile.close ();
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to sound file ", file, ".");
+		Melder_throw (me, U": not written to sound file ", file, U".");
 	}
 }
 
 void LongSound_writeChannelToAudioFile (LongSound me, int audioFileType, int channel, MelderFile file) {
 	try {
 		if (my numberOfChannels != 2)
-			Melder_throw ("This audio file is not a stereo file. It does not have a ", channel == 0 ? L"left" : L"right", L" channel.");
+			Melder_throw (U"This audio file is not a stereo file. It does not have a ", channel == 0 ? U"left" : U"right", U" channel.");
 		autoMelderFile mfile = MelderFile_create (file);
 		if (file -> filePointer) {
 			MelderFile_writeAudioFileHeader (file, audioFileType, my sampleRate, my nx, 1, 8 * my numberOfBytesPerSamplePoint);
@@ -396,7 +398,7 @@ void LongSound_writeChannelToAudioFile (LongSound me, int audioFileType, int cha
 		MelderFile_writeAudioFileTrailer (file, audioFileType, my sampleRate, my nx, 1, 8 * my numberOfBytesPerSamplePoint);
 		mfile.close ();
 	} catch (MelderError) {
-		Melder_throw ("Channel ", channel, " of ", me, ": not written to sound file ", file, ".");
+		Melder_throw (U"Channel ", channel, U" of ", me, U": not written to sound file ", file, U".");
 	}
 }
 
@@ -542,7 +544,7 @@ void LongSound_playPart (LongSound me, double tmin, double tmax,
 		int fits = LongSound_haveWindow (me, tmin, tmax);
 		long bestSampleRate = MelderAudio_getOutputBestSampleRate (my sampleRate), n, i1, i2;
 		if (! fits)
-			Melder_throw ("Sound too long (", tmax - tmin, " seconds).");
+			Melder_throw (U"Sound too long (", tmax - tmin, U" seconds).");
 		/*
 		 * Assign to *thee only after stopping the playing sound.
 		 */
@@ -592,27 +594,29 @@ void LongSound_playPart (LongSound me, double tmin, double tmax,
 					double index = (t - t1) * my sampleRate;   /* From 0. */
 					long flore = index;   /* DANGEROUS: Implicitly rounding down... */
 					double fraction = index - flore;
-					resampledBuffer [i + silenceBefore] = (1 - fraction) * from [flore] + fraction * from [flore + 1];
+					resampledBuffer [i + silenceBefore] = (1.0 - fraction) * from [flore] + fraction * from [flore + 1];
 				}
 			} else if (my numberOfChannels == 2) {
 				for (i = 0; i < newN; i ++) {
 					double t = t1 + i * dt;
-					double index = (t - t1) * newSampleRate;
+					double index = (t - t1) * my sampleRate;
 					long flore = index;
 					double fraction = index - flore;
 					long ii = i + silenceBefore;
-					resampledBuffer [ii + ii] = (1 - fraction) * from [flore + flore] + fraction * from [flore + flore + 2];
-					resampledBuffer [ii + ii + 1] = (1 - fraction) * from [flore + flore + 1] + fraction * from [flore + flore + 3];
+					resampledBuffer [ii + ii] = (1.0 - fraction) * from [flore + flore] + fraction * from [flore + flore + 2];
+					resampledBuffer [ii + ii + 1] = (1.0 - fraction) * from [flore + flore + 1] + fraction * from [flore + flore + 3];
 				}
 			} else {
 				for (i = 0; i < newN; i ++) {
 					double t = t1 + i * dt;
-					double index = (t - t1) * newSampleRate;
+					double index = (t - t1) * my sampleRate;
 					long flore = index;
 					double fraction = index - flore;
 					long ii = (i + silenceBefore) * my numberOfChannels;
 					for (long chan = 0; chan < my numberOfChannels; chan ++) {
-						resampledBuffer [ii + chan] = (1 - fraction) * from [flore + flore + chan] + fraction * from [flore + flore + chan + my numberOfChannels];
+						resampledBuffer [ii + chan] =
+							(1.0 - fraction) * from [flore * my numberOfChannels + chan] +
+							fraction * from [(flore + 1) * my numberOfChannels + chan];
 					}
 				}
 			}
@@ -622,7 +626,7 @@ void LongSound_playPart (LongSound me, double tmin, double tmax,
 		//Melder_free (thy resampledBuffer);   // cannot do that, because MelderAudio_play16 isn't necessarily synchronous
 	} catch (MelderError) {
 		Melder_free (thy resampledBuffer);
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
@@ -630,7 +634,7 @@ void LongSound_concatenate (Collection me, MelderFile file, int audioFileType, i
 	try {
 		long sampleRate, n;   /* Integer sampling frequencies only, because of possible rounding errors. */
 		int numberOfChannels;
-		if (my size < 1) Melder_throw ("No Sound or LongSound objects to concatenate.");
+		if (my size < 1) Melder_throw (U"No Sound or LongSound objects to concatenate.");
 		/*
 		 * The sampling frequencies and numbers of channels must be equal for all (long)sounds.
 		 */
@@ -664,9 +668,9 @@ void LongSound_concatenate (Collection me, MelderFile file, int audioFileType, i
 				n += longSound -> nx;
 			}
 			if (! sampleRatesMatch)
-				Melder_throw ("Sampling frequencies are not equal.");
+				Melder_throw (U"Sampling frequencies are not equal.");
 			if (! numbersOfChannelsMatch)
-				Melder_throw ("Cannot mix stereo and mono.");
+				Melder_throw (U"Cannot mix stereo and mono.");
 		}
 		/*
 		 * Create output file and write header.
@@ -681,7 +685,7 @@ void LongSound_concatenate (Collection me, MelderFile file, int audioFileType, i
 				Sound sound = (Sound) data;
 				if (file -> filePointer) {
 					MelderFile_writeFloatToAudio (file, sound -> ny, Melder_defaultAudioFileEncoding (audioFileType, numberOfBitsPerSamplePoint),
-						sound -> z, sound -> nx, TRUE);
+						sound -> z, sound -> nx, true);
 				}
 			} else {
 				LongSound longSound = (LongSound) data;
@@ -691,7 +695,7 @@ void LongSound_concatenate (Collection me, MelderFile file, int audioFileType, i
 		MelderFile_writeAudioFileTrailer (file, audioFileType, sampleRate, n, numberOfChannels, numberOfBitsPerSamplePoint);
 		mfile.close ();
 	} catch (MelderError) {
-		Melder_throw ("Sounds not concatenated and not saved to ", file, ".");
+		Melder_throw (U"Sounds not concatenated and not saved to ", file, U".");
 	}
 }
 
diff --git a/fon/LongSound.h b/fon/LongSound.h
index 80065e2..dc015d6 100644
--- a/fon/LongSound.h
+++ b/fon/LongSound.h
@@ -2,7 +2,7 @@
 #define _LongSound_h_
 /* LongSound.h
  *
- * Copyright (C) 1992-2012 Paul Boersma, 2007 Erez Volk (for FLAC, MP3)
+ * Copyright (C) 1992-2012,2015 Paul Boersma, 2007 Erez Volk (for FLAC, MP3)
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,33 +30,36 @@ struct FLAC__StreamEncoder;
 struct _MP3_FILE;
 
 Thing_define (LongSound, Sampled) {
-	// new data:
-	public:
-		structMelderFile file;
-		FILE *f;
-		int audioFileType, numberOfChannels, encoding, numberOfBytesPerSamplePoint;
-		double sampleRate;
-		long startOfData;
-		double bufferLength;
-		short *buffer;
-		long imin, imax, nmax;
-		struct FLAC__StreamDecoder *flacDecoder;
-		struct _MP3_FILE *mp3f;
-		int compressedMode;
-		long compressedSamplesLeft;
-		double *compressedFloats [2];
-		short *compressedShorts;
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_info ();
-		virtual void v_copy (Any data_to);
-		virtual bool v_writable () { return false; }
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
+	structMelderFile file;
+	FILE *f;
+	int audioFileType, numberOfChannels, encoding, numberOfBytesPerSamplePoint;
+	double sampleRate;
+	long startOfData;
+	double bufferLength;
+	short *buffer;
+	long imin, imax, nmax;
+	struct FLAC__StreamDecoder *flacDecoder;
+	struct _MP3_FILE *mp3f;
+	int compressedMode;
+	long compressedSamplesLeft;
+	double *compressedFloats [2];
+	short *compressedShorts;
+
+	void v_destroy ()
+		override;
+	void v_info ()
+		override;
+	void v_copy (Any data_to)
+		override;
+	bool v_writable ()
+		override { return false; }
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
 };
 
-LongSound LongSound_open (MelderFile fs);
+autoLongSound LongSound_open (MelderFile file);
 
-Sound LongSound_extractPart (LongSound me, double tmin, double tmax, int preserveTimes);
+autoSound LongSound_extractPart (LongSound me, double tmin, double tmax, int preserveTimes);
 
 bool LongSound_haveWindow (LongSound me, double tmin, double tmax);
 /*
@@ -68,7 +71,7 @@ void LongSound_getWindowExtrema (LongSound me, double tmin, double tmax, int cha
 void LongSound_playPart (LongSound me, double tmin, double tmax,
 	int (*callback) (void *closure, int phase, double tmin, double tmax, double t), void *closure);
 
-void LongSound_writePartToAudioFile (LongSound me, int audioFileType, double tmin, double tmax, MelderFile file);
+void LongSound_writePartToAudioFile (LongSound me, int audioFileType, double tmin, double tmax, MelderFile file, int numberOfBitsPerSamplePoint);
 void LongSound_writeChannelToAudioFile (LongSound me, int audioFileType, int channel, MelderFile file);
 
 void LongSound_readAudioToFloat (LongSound me, double **buffer, long firstSample, long numberOfSamples);
@@ -77,8 +80,8 @@ void LongSound_readAudioToShort (LongSound me, short *buffer, long firstSample,
 void LongSound_concatenate (Collection collection, MelderFile file, int audioFileType, int numberOfBitsPerSamplePoint);
 /* Concatenate a collection of Sound and LongSound objects. */
 
-void LongSound_preferences (void);
-long LongSound_getBufferSizePref_seconds (void);
+void LongSound_preferences ();
+long LongSound_getBufferSizePref_seconds ();
 void LongSound_setBufferSizePref_seconds (long size);
 
 /* End of file LongSound.h */
diff --git a/fon/Ltas.cpp b/fon/Ltas.cpp
index b9b3927..b3b2564 100644
--- a/fon/Ltas.cpp
+++ b/fon/Ltas.cpp
@@ -1,6 +1,6 @@
 /* Ltas.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,17 +30,17 @@ Thing_implement (Ltas, Vector, 2);
 
 void structLtas :: v_info () {
 	double meanPowerDensity;
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Frequency domain:");
-	MelderInfo_writeLine (L"   Lowest frequency: ", Melder_double (xmin), L" Hz");
-	MelderInfo_writeLine (L"   Highest frequency: ", Melder_double (xmax), L" Hz");
-	MelderInfo_writeLine (L"   Total frequency domain: ", Melder_double (xmax - xmin), L" Hz");
-	MelderInfo_writeLine (L"Frequency sampling:");
-	MelderInfo_writeLine (L"   Number of frequency bands: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"   Width of each band: ", Melder_double (dx), L" Hz");
-	MelderInfo_writeLine (L"   First band centred at: ", Melder_double (x1), L" Hz");
-	meanPowerDensity = Sampled_getMean (this, xmin, xmax, 0, 1, FALSE);
-	MelderInfo_writeLine (L"Total SPL: ", Melder_single (10.0 * log10 (meanPowerDensity * (xmax - xmin))), L" dB");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Frequency domain:");
+	MelderInfo_writeLine (U"   Lowest frequency: ", xmin, U" Hz");
+	MelderInfo_writeLine (U"   Highest frequency: ", xmax, U" Hz");
+	MelderInfo_writeLine (U"   Total frequency domain: ", xmax - xmin, U" Hz");
+	MelderInfo_writeLine (U"Frequency sampling:");
+	MelderInfo_writeLine (U"   Number of frequency bands: ", nx);
+	MelderInfo_writeLine (U"   Width of each band: ", dx, U" Hz");
+	MelderInfo_writeLine (U"   First band centred at: ", x1, U" Hz");
+	meanPowerDensity = Sampled_getMean (this, xmin, xmax, 0, 1, false);
+	MelderInfo_writeLine (U"Total SPL: ", Melder_single (10.0 * log10 (meanPowerDensity * (xmax - xmin))), U" dB");
 }
 
 double structLtas :: v_convertStandardToSpecialUnit (double value, long ilevel, int unit) {
@@ -63,67 +63,67 @@ double structLtas :: v_convertSpecialToStandardUnit (double value, long ilevel,
 		value;   // value = dB
 }
 
-Ltas Ltas_create (long nx, double dx) {
+autoLtas Ltas_create (long nx, double dx) {
 	try {
 		autoLtas me = Thing_new (Ltas);
 		Matrix_init (me.peek(), 0.0, nx * dx, nx, dx, 0.5 * dx, 1.0, 1.0, 1, 1.0, 1.0);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Ltas not created.");
+		Melder_throw (U"Ltas not created.");
 	}
 }
 
-void Ltas_draw (Ltas me, Graphics g, double fmin, double fmax, double minimum, double maximum, int garnish, const wchar_t *method) {
+void Ltas_draw (Ltas me, Graphics g, double fmin, double fmax, double minimum, double maximum, int garnish, const char32 *method) {
 	Vector_draw (me, g, & fmin, & fmax, & minimum, & maximum, 1.0, method);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Frequency (Hz)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"Sound pressure level (dB/Hz)");
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_textBottom (g, true, U"Frequency (Hz)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Sound pressure level (dB/Hz)");
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
 double Ltas_getSlope (Ltas me, double f1min, double f1max, double f2min, double f2max, int averagingUnits) {
-	double low = Sampled_getMean (me, f1min, f1max, 0, averagingUnits, FALSE);
-	double high = Sampled_getMean (me, f2min, f2max, 0, averagingUnits, FALSE);
+	double low = Sampled_getMean (me, f1min, f1max, 0, averagingUnits, false);
+	double high = Sampled_getMean (me, f2min, f2max, 0, averagingUnits, false);
 	if (low == NUMundefined || high == NUMundefined) return NUMundefined;
 	return averagingUnits == 3 ? high - low : Function_convertSpecialToStandardUnit (me, high / low, 0, averagingUnits);
 }
 
 double Ltas_getLocalPeakHeight (Ltas me, double environmentMin, double environmentMax, double peakMin, double peakMax, int averagingUnits) {
-	double environmentLow = Sampled_getMean (me, environmentMin, peakMin, 0, averagingUnits, FALSE);
-	double environmentHigh = Sampled_getMean (me, peakMax, environmentMax, 0, averagingUnits, FALSE);
-	double peak = Sampled_getMean (me, peakMin, peakMax, 0, averagingUnits, FALSE);
+	double environmentLow = Sampled_getMean (me, environmentMin, peakMin, 0, averagingUnits, false);
+	double environmentHigh = Sampled_getMean (me, peakMax, environmentMax, 0, averagingUnits, false);
+	double peak = Sampled_getMean (me, peakMin, peakMax, 0, averagingUnits, false);
 	if (environmentLow == NUMundefined || environmentHigh == NUMundefined || peak == NUMundefined) return NUMundefined;
 	return averagingUnits == 3 ? peak - 0.5 * (environmentLow + environmentHigh) :
 		Function_convertSpecialToStandardUnit (me, peak / (0.5 * (environmentLow + environmentHigh)), 0, averagingUnits);
 }
 
-Matrix Ltas_to_Matrix (Ltas me) {
+autoMatrix Ltas_to_Matrix (Ltas me) {
 	try {
 		autoMatrix thee = Thing_new (Matrix);
 		my structMatrix :: v_copy (thee.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
-Ltas Matrix_to_Ltas (Matrix me) {
+autoLtas Matrix_to_Ltas (Matrix me) {
 	try {
 		autoLtas thee = Thing_new (Ltas);
 		my structMatrix :: v_copy (thee.peek());   // because copying a descendant of Matrix with additional members should not crash
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Ltas.");
+		Melder_throw (me, U": not converted to Ltas.");
 	}
 }
 
-Ltas Ltases_merge (Collection ltases) {
+autoLtas Ltases_merge (Collection ltases) {
 	try {
 		if (ltases -> size < 1)
-			Melder_throw ("Cannot merge zero Ltas objects.");
+			Melder_throw (U"Cannot merge zero Ltas objects.");
 		Ltas me = (Ltas) ltases -> item [1];
 		autoLtas thee = Data_copy (me);
 		/*
@@ -135,11 +135,11 @@ Ltas Ltases_merge (Collection ltases) {
 		for (long ispec = 2; ispec <= ltases -> size; ispec ++) {
 			Ltas him = (Ltas) ltases -> item [ispec];
 			if (his xmin != thy xmin || his xmax != thy xmax)
-				Melder_throw ("Frequency domains do not match.");
+				Melder_throw (U"Frequency domains do not match.");
 			if (his dx != thy dx)
-				Melder_throw ("Bandwidths do not match.");
+				Melder_throw (U"Bandwidths do not match.");
 			if (his nx != thy nx || his x1 != thy x1)
-				Melder_throw ("Frequency bands do not match.");
+				Melder_throw (U"Frequency bands do not match.");
 			/*
 			 * Add band energies.
 			 */
@@ -153,33 +153,33 @@ Ltas Ltases_merge (Collection ltases) {
 		for (long iband = 1; iband <= thy nx; iband ++) {
 			thy z [1] [iband] = 10.0 * log10 (thy z [1] [iband]);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("Ltas objects not merged.");
+		Melder_throw (U"Ltas objects not merged.");
 	}
 }
 
-Ltas Ltases_average (Collection ltases) {
+autoLtas Ltases_average (Collection ltases) {
 	try {
 		double factor = -10.0 * log10 (ltases -> size);
 		autoLtas thee = Ltases_merge (ltases);
 		for (long iband = 1; iband <= thy nx; iband ++) {
 			thy z [1] [iband] += factor;
 		}	
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw ("Ltas objects not averaged.");
+		Melder_throw (U"Ltas objects not averaged.");
 	}
 }
 
-Ltas Ltas_computeTrendLine (Ltas me, double fmin, double fmax) {
+autoLtas Ltas_computeTrendLine (Ltas me, double fmin, double fmax) {
 	try {
 		/*
 		 * Find the first and last bin.
 		 */
 		long imin, imax, n;
 		if ((n = Sampled_getWindowSamples (me, fmin, fmax, & imin, & imax)) < 2)
-			Melder_throw ("Number of bins too low (", n, "). Should be at least 2.");
+			Melder_throw (U"Number of bins too low (", n, U"). Should be at least 2.");
 		autoLtas thee = Data_copy (me);
 		/*
 		 * Compute average amplitude and frequency.
@@ -206,20 +206,20 @@ Ltas Ltas_computeTrendLine (Ltas me, double fmin, double fmax) {
 			double df = thy x1 + (i - 1) * thy dx - fmean;
 			thy z [1] [i] = amean + slope * df;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": trend line not computed.");
+		Melder_throw (me, U": trend line not computed.");
 	}
 }
 
-Ltas Ltas_subtractTrendLine (Ltas me, double fmin, double fmax) {
+autoLtas Ltas_subtractTrendLine (Ltas me, double fmin, double fmax) {
 	try {
 		/*
 		 * Find the first and last bin.
 		 */
 		long imin, imax, n;
 		if ((n = Sampled_getWindowSamples (me, fmin, fmax, & imin, & imax)) < 2)
-			Melder_throw ("Number of bins too low (", n, "). Should be at least 2.");
+			Melder_throw (U"Number of bins too low (", n, U"). Should be at least 2.");
 		autoLtas thee = Data_copy (me);
 		/*
 		 * Compute average amplitude and frequency.
@@ -252,59 +252,59 @@ Ltas Ltas_subtractTrendLine (Ltas me, double fmin, double fmax) {
 		for (long i = imax + 1; i <= thy nx; i ++) {
 			thy z [1] [i] = 0.0;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": trend line not subtracted.");
+		Melder_throw (me, U": trend line not subtracted.");
 	}
 }
 
-Ltas Spectrum_to_Ltas (Spectrum me, double bandWidth) {
+autoLtas Spectrum_to_Ltas (Spectrum me, double bandWidth) {
 	try {
 		long numberOfBands = ceil ((my xmax - my xmin) / bandWidth);
 		if (bandWidth <= my dx)
-			Melder_throw ("Bandwidth must be greater than ", my dx, ".");
+			Melder_throw (U"Bandwidth must be greater than ", my dx, U".");
 		autoLtas thee = Thing_new (Ltas);
-		Matrix_init (thee.peek(), my xmin, my xmax, numberOfBands, bandWidth, my xmin + 0.5 * bandWidth, 1, 1, 1, 1, 1);
+		Matrix_init (thee.peek(), my xmin, my xmax, numberOfBands, bandWidth, my xmin + 0.5 * bandWidth, 1.0, 1.0, 1, 1.0, 1.0);
 		for (long iband = 1; iband <= numberOfBands; iband ++) {
 			double fmin = thy xmin + (iband - 1) * bandWidth;
-			double meanEnergyDensity = Sampled_getMean (me, fmin, fmin + bandWidth, 0, 1, FALSE);
+			double meanEnergyDensity = Sampled_getMean (me, fmin, fmin + bandWidth, 0, 1, false);
 			double meanPowerDensity = meanEnergyDensity * my dx;   // as an approximation for a division by the original duration
 			thy z [1] [iband] = meanPowerDensity == 0.0 ? -300.0 : 10.0 * log10 (meanPowerDensity / 4.0e-10);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Ltas.");
+		Melder_throw (me, U": not converted to Ltas.");
 	}
 }
 
-Ltas Spectrum_to_Ltas_1to1 (Spectrum me) {
+autoLtas Spectrum_to_Ltas_1to1 (Spectrum me) {
 	try {
 		autoLtas thee = Thing_new (Ltas);
 		Matrix_init (thee.peek(), my xmin, my xmax, my nx, my dx, my x1, 1.0, 1.0, 1, 1.0, 1.0);
 		for (long iband = 1; iband <= my nx; iband ++) {
 			thy z [1] [iband] = Sampled_getValueAtSample (me, iband, 0, 2);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Ltas.");
+		Melder_throw (me, U": not converted to Ltas.");
 	}
 }
 
-Ltas Sound_to_Ltas (Sound me, double bandwidth) {
+autoLtas Sound_to_Ltas (Sound me, double bandwidth) {
 	try {
-		autoSpectrum thee = Sound_to_Spectrum (me, TRUE);
+		autoSpectrum thee = Sound_to_Spectrum (me, true);
 		autoLtas him = Spectrum_to_Ltas (thee.peek(), bandwidth);
 		double correction = -10.0 * log10 (thy dx * my nx * my dx);
 		for (long iband = 1; iband <= his nx; iband ++) {
 			his z [1] [iband] += correction;
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, ": LTAS analysis not performed.");
+		Melder_throw (me, U": LTAS analysis not performed.");
 	}
 }
 
-Ltas PointProcess_Sound_to_Ltas (PointProcess pulses, Sound sound,
+autoLtas PointProcess_Sound_to_Ltas (PointProcess pulses, Sound sound,
 	double maximumFrequency, double bandWidth,
 	double shortestPeriod, double longestPeriod, double maximumPeriodFactor)
 {
@@ -314,13 +314,13 @@ Ltas PointProcess_Sound_to_Ltas (PointProcess pulses, Sound sound,
 		ltas -> xmax = maximumFrequency;
 		autoLtas numbers = Data_copy (ltas.peek());
 		if (numberOfPeriods < 1)
-			Melder_throw ("Cannot compute an Ltas if there are no periods in the point process.");
-		autoMelderProgress progress (L"Ltas analysis...");
+			Melder_throw (U"Cannot compute an Ltas if there are no periods in the point process.");
+		autoMelderProgress progress (U"Ltas analysis...");
 		for (long ipulse = 2; ipulse < pulses -> nt; ipulse ++) {
 			double leftInterval = pulses -> t [ipulse] - pulses -> t [ipulse - 1];
 			double rightInterval = pulses -> t [ipulse + 1] - pulses -> t [ipulse];
 			double intervalFactor = leftInterval > rightInterval ? leftInterval / rightInterval : rightInterval / leftInterval;
-			Melder_progress ((double) ipulse / pulses -> nt, L"Sound & PointProcess: To Ltas: pulse ", Melder_integer (ipulse), L" out of ", Melder_integer (pulses -> nt));
+			Melder_progress ((double) ipulse / pulses -> nt, U"Sound & PointProcess: To Ltas: pulse ", ipulse, U" out of ", pulses -> nt);
 			if (leftInterval >= shortestPeriod && leftInterval <= longestPeriod &&
 				rightInterval >= shortestPeriod && rightInterval <= longestPeriod &&
 				intervalFactor <= maximumPeriodFactor)
@@ -330,8 +330,8 @@ Ltas PointProcess_Sound_to_Ltas (PointProcess pulses, Sound sound,
 				 */
 				autoSound period = Sound_extractPart (sound,
 					pulses -> t [ipulse] - 0.5 * leftInterval, pulses -> t [ipulse] + 0.5 * rightInterval,
-					kSound_windowShape_RECTANGULAR, 1.0, FALSE);
-				autoSpectrum spectrum = Sound_to_Spectrum (period.peek(), FALSE);
+					kSound_windowShape_RECTANGULAR, 1.0, false);
+				autoSpectrum spectrum = Sound_to_Spectrum (period.peek(), false);
 				for (long ifreq = 1; ifreq <= spectrum -> nx; ifreq ++) {
 					double frequency = spectrum -> xmin + (ifreq - 1) * spectrum -> dx;
 					double realPart = spectrum -> z [1] [ifreq];
@@ -349,7 +349,7 @@ Ltas PointProcess_Sound_to_Ltas (PointProcess pulses, Sound sound,
 			}
 		}
 		if (numberOfPeriods < 1)
-			Melder_throw ("There are no periods in the point process.");
+			Melder_throw (U"There are no periods in the point process.");
 		for (long iband = 1; iband <= ltas -> nx; iband ++) {
 			if (numbers -> z [1] [iband] == 0.0) {
 				ltas -> z [1] [iband] = NUMundefined;
@@ -383,7 +383,7 @@ Ltas PointProcess_Sound_to_Ltas (PointProcess pulses, Sound sound,
 				while (ibandleft >= 1 && ltas -> z [1] [ibandleft] == NUMundefined) ibandleft --;
 				while (ibandright <= ltas -> nx && ltas -> z [1] [ibandright] == NUMundefined) ibandright ++;
 				if (ibandleft < 1 && ibandright > ltas -> nx)
-					Melder_throw ("Cannot create an Ltas without energy in any bins.");
+					Melder_throw (U"Cannot create an Ltas without energy in any bins.");
 				if (ibandleft < 1) {
 					ltas -> z [1] [iband] = ltas -> z [1] [ibandright];
 				} else if (ibandright > ltas -> nx) {
@@ -397,13 +397,13 @@ Ltas PointProcess_Sound_to_Ltas (PointProcess pulses, Sound sound,
 				}
 			}
 		}
-		return ltas.transfer();
+		return ltas;
 	} catch (MelderError) {
-		Melder_throw (sound, " & ", pulses, ": LTAS analysis not performed.");
+		Melder_throw (sound, U" & ", pulses, U": LTAS analysis not performed.");
 	}
 }
 
-Ltas Sound_to_Ltas_pitchCorrected (Sound sound, double minimumPitch, double maximumPitch,
+autoLtas Sound_to_Ltas_pitchCorrected (Sound sound, double minimumPitch, double maximumPitch,
 	double maximumFrequency, double bandWidth,
 	double shortestPeriod, double longestPeriod, double maximumPeriodFactor)
 {
@@ -411,13 +411,13 @@ Ltas Sound_to_Ltas_pitchCorrected (Sound sound, double minimumPitch, double maxi
 		autoPointProcess pulses = Sound_to_PointProcess_periodic_cc (sound, minimumPitch, maximumPitch);
 		autoLtas ltas = PointProcess_Sound_to_Ltas (pulses.peek(), sound, maximumFrequency, bandWidth,
 			shortestPeriod, longestPeriod, maximumPeriodFactor);
-		return ltas.transfer();
+		return ltas;
 	} catch (MelderError) {
-		Melder_throw (sound, ": pitch-corrected LTAS analysis not performed.");
+		Melder_throw (sound, U": pitch-corrected LTAS analysis not performed.");
 	}
 }
 
-Ltas PointProcess_Sound_to_Ltas_harmonics (PointProcess pulses, Sound sound,
+autoLtas PointProcess_Sound_to_Ltas_harmonics (PointProcess pulses, Sound sound,
 	long maximumHarmonic,
 	double shortestPeriod, double longestPeriod, double maximumPeriodFactor)
 {
@@ -426,13 +426,13 @@ Ltas PointProcess_Sound_to_Ltas_harmonics (PointProcess pulses, Sound sound,
 		autoLtas ltas = Ltas_create (maximumHarmonic, 1.0);
 		ltas -> xmax = maximumHarmonic;
 		if (numberOfPeriods < 1)
-			Melder_throw ("There are no periods in the point process.");
-		autoMelderProgress progress (L"LTAS (harmonics) analysis...");
+			Melder_throw (U"There are no periods in the point process.");
+		autoMelderProgress progress (U"LTAS (harmonics) analysis...");
 		for (long ipulse = 2; ipulse < pulses -> nt; ipulse ++) {
 			double leftInterval = pulses -> t [ipulse] - pulses -> t [ipulse - 1];
 			double rightInterval = pulses -> t [ipulse + 1] - pulses -> t [ipulse];
 			double intervalFactor = leftInterval > rightInterval ? leftInterval / rightInterval : rightInterval / leftInterval;
-			Melder_progress ((double) ipulse / pulses -> nt, L"Sound & PointProcess: To Ltas: pulse ", Melder_integer (ipulse), L" out of ", Melder_integer (pulses -> nt));
+			Melder_progress ((double) ipulse / pulses -> nt, U"Sound & PointProcess: To Ltas: pulse ", ipulse, U" out of ", pulses -> nt);
 			if (leftInterval >= shortestPeriod && leftInterval <= longestPeriod &&
 				rightInterval >= shortestPeriod && rightInterval <= longestPeriod &&
 				intervalFactor <= maximumPeriodFactor)
@@ -443,8 +443,8 @@ Ltas PointProcess_Sound_to_Ltas_harmonics (PointProcess pulses, Sound sound,
 				long localMaximumHarmonic;
 				autoSound period = Sound_extractPart (sound,
 					pulses -> t [ipulse] - 0.5 * leftInterval, pulses -> t [ipulse] + 0.5 * rightInterval,
-					kSound_windowShape_RECTANGULAR, 1.0, FALSE);
-				autoSpectrum spectrum = Sound_to_Spectrum (period.peek(), FALSE);
+					kSound_windowShape_RECTANGULAR, 1.0, false);
+				autoSpectrum spectrum = Sound_to_Spectrum (period.peek(), false);
 				localMaximumHarmonic = maximumHarmonic < spectrum -> nx ? maximumHarmonic : spectrum -> nx;
 				for (long iharm = 1; iharm <= localMaximumHarmonic; iharm ++) {
 					double realPart = spectrum -> z [1] [iharm];
@@ -457,7 +457,7 @@ Ltas PointProcess_Sound_to_Ltas_harmonics (PointProcess pulses, Sound sound,
 			}
 		}
 		if (numberOfPeriods < 1)
-			Melder_throw (L"There are no periods in the point process.");
+			Melder_throw (U"There are no periods in the point process.");
 		for (long iharm = 1; iharm <= ltas -> nx; iharm ++) {
 			if (ltas -> z [1] [iharm] == 0.0) {
 				ltas -> z [1] [iharm] = -300.0;
@@ -467,9 +467,9 @@ Ltas PointProcess_Sound_to_Ltas_harmonics (PointProcess pulses, Sound sound,
 				ltas -> z [1] [iharm] = 10.0 * log10 (powerInThisBand / 4.0e-10);
 			}
 		}
-		return ltas.transfer();
+		return ltas;
 	} catch (MelderError) {
-		Melder_throw (sound, " & ", pulses, ": LTAS analysis (harmonics) not performed.");
+		Melder_throw (sound, U" & ", pulses, U": LTAS analysis (harmonics) not performed.");
 	}
 }
 
diff --git a/fon/Ltas.h b/fon/Ltas.h
index 731e749..74037af 100644
--- a/fon/Ltas.h
+++ b/fon/Ltas.h
@@ -2,7 +2,7 @@
 #define _Ltas_h_
 /* Ltas.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,12 +25,14 @@
 #include "Collection.h"
 
 Thing_define (Ltas, Vector) {
-	// overridden methods:
-	protected:
-		virtual void v_info ();
-		virtual int v_domainQuantity () { return MelderQuantity_FREQUENCY_HERTZ; }
-		virtual double v_convertStandardToSpecialUnit (double value, long ilevel, int unit);
-		virtual double v_convertSpecialToStandardUnit (double value, long ilevel, int unit);
+	void v_info ()
+		override;
+	int v_domainQuantity ()
+		override { return MelderQuantity_FREQUENCY_HERTZ; }
+	double v_convertStandardToSpecialUnit (double value, long ilevel, int unit)
+		override;
+	double v_convertSpecialToStandardUnit (double value, long ilevel, int unit)
+		override;
 };
 
 /*
@@ -44,10 +46,10 @@ Thing_define (Ltas, Vector) {
 		z [1] [1..nx]		// The intensity per band, in db/Hz.
 */
 
-Ltas Ltas_create (long nx, double dx);
+autoLtas Ltas_create (long nx, double dx);
 /*
 	Function:
-		create an Ltas, or NULL if out of memory.
+		create an Ltas.
 	Preconditions:
 		nx >= 1;
 		dx > 0.0;
@@ -61,32 +63,32 @@ Ltas Ltas_create (long nx, double dx);
  */
 
 void Ltas_draw (Ltas me, Graphics g, double fmin, double fmax,
-	double minimum, double maximum, int garnish, const wchar_t *method);
+	double minimum, double maximum, int garnish, const char32 *method);
 
-Matrix Ltas_to_Matrix (Ltas me);
-Ltas Matrix_to_Ltas (Matrix me);
+autoMatrix Ltas_to_Matrix (Ltas me);
+autoLtas Matrix_to_Ltas (Matrix me);
 
-Ltas Ltases_merge (Collection ltases);
-Ltas Ltases_average (Collection ltases);
+autoLtas Ltases_merge (Collection ltases);
+autoLtas Ltases_average (Collection ltases);
 
-Ltas Ltas_computeTrendLine (Ltas me, double fmin, double fmax);
-Ltas Ltas_subtractTrendLine (Ltas me, double fmin, double fmax);
+autoLtas Ltas_computeTrendLine (Ltas me, double fmin, double fmax);
+autoLtas Ltas_subtractTrendLine (Ltas me, double fmin, double fmax);
 
 /* Direct computations. */
 
-Ltas Spectrum_to_Ltas (Spectrum me, double bandwidth);
-Ltas Spectrum_to_Ltas_1to1 (Spectrum me);
-Ltas PointProcess_Sound_to_Ltas (PointProcess pulses, Sound sound,
+autoLtas Spectrum_to_Ltas (Spectrum me, double bandwidth);
+autoLtas Spectrum_to_Ltas_1to1 (Spectrum me);
+autoLtas PointProcess_Sound_to_Ltas (PointProcess pulses, Sound sound,
 	double maximumFrequency, double bandWidth,
 	double shortestPeriod, double longestPeriod, double maximumPeriodFactor);
-Ltas PointProcess_Sound_to_Ltas_harmonics (PointProcess pulses, Sound sound,
+autoLtas PointProcess_Sound_to_Ltas_harmonics (PointProcess pulses, Sound sound,
 	long maximumHarmonic,
 	double shortestPeriod, double longestPeriod, double maximumPeriodFactor);
 
 /* Shortcuts. */
 
-Ltas Sound_to_Ltas (Sound me, double bandwidth);
-Ltas Sound_to_Ltas_pitchCorrected (Sound sound, double minimumPitch, double maximumPitch,
+autoLtas Sound_to_Ltas (Sound me, double bandwidth);
+autoLtas Sound_to_Ltas_pitchCorrected (Sound sound, double minimumPitch, double maximumPitch,
 	double maximumFrequency, double bandWidth,
 	double shortestPeriod, double longestPeriod, double maximumPeriodFactor);
 
diff --git a/fon/Ltas_to_SpectrumTier.cpp b/fon/Ltas_to_SpectrumTier.cpp
index 020a43c..e012cdc 100644
--- a/fon/Ltas_to_SpectrumTier.cpp
+++ b/fon/Ltas_to_SpectrumTier.cpp
@@ -1,6 +1,6 @@
 /* Ltas_to_SpectrumTier.cpp
  *
- * Copyright (C) 2007-2011 Paul Boersma
+ * Copyright (C) 2007-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,11 +19,11 @@
 
 #include "Ltas_to_SpectrumTier.h"
 
-SpectrumTier Ltas_to_SpectrumTier_peaks (Ltas me) {
+autoSpectrumTier Ltas_to_SpectrumTier_peaks (Ltas me) {
 	try {
 		return (SpectrumTier) Vector_to_RealTier_peaks (me, 1, classSpectrumTier);
 	} catch (MelderError) {
-		Melder_throw (me, ": peaks not analyzed as SpectrumTier.");
+		Melder_throw (me, U": peaks not analyzed as SpectrumTier.");
 	}
 }
 
diff --git a/fon/Ltas_to_SpectrumTier.h b/fon/Ltas_to_SpectrumTier.h
index 2393543..de02f0b 100644
--- a/fon/Ltas_to_SpectrumTier.h
+++ b/fon/Ltas_to_SpectrumTier.h
@@ -1,6 +1,6 @@
 /* Ltas_to_SpectrumTier.h
  *
- * Copyright (C) 2007-2011 Paul Boersma
+ * Copyright (C) 2007-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,6 +20,6 @@
 #include "Ltas.h"
 #include "SpectrumTier.h"
 
-SpectrumTier Ltas_to_SpectrumTier_peaks (Ltas me);
+autoSpectrumTier Ltas_to_SpectrumTier_peaks (Ltas me);
 
 /* End of file Ltas_to_SpectrumTier.h */
diff --git a/fon/Manipulation.cpp b/fon/Manipulation.cpp
index 60a143b..7fce1d4 100644
--- a/fon/Manipulation.cpp
+++ b/fon/Manipulation.cpp
@@ -1,6 +1,6 @@
 /* Manipulation.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -51,162 +51,150 @@ Thing_implement (Manipulation, Function, 5);
 
 void structManipulation :: v_shiftX (double xfrom, double xto) {
 	Manipulation_Parent :: v_shiftX (xfrom, xto);
-	if (sound    != NULL)  Function_shiftXTo (sound,    xfrom, xto);
-	if (pulses   != NULL)  Function_shiftXTo (pulses,   xfrom, xto);
-	if (pitch    != NULL)  Function_shiftXTo (pitch,    xfrom, xto);
-	if (duration != NULL)  Function_shiftXTo (duration, xfrom, xto);
-	if (lpc      != NULL)  Function_shiftXTo (lpc,      xfrom, xto);
+	if (our sound   )  Function_shiftXTo (our sound.get(),    xfrom, xto);
+	if (our pulses  )  Function_shiftXTo (our pulses.get(),   xfrom, xto);
+	if (our pitch   )  Function_shiftXTo (our pitch.get(),    xfrom, xto);
+	if (our duration)  Function_shiftXTo (our duration.get(), xfrom, xto);
+	if (our lpc     )  Function_shiftXTo (our lpc,      xfrom, xto);
 }
 
 void structManipulation :: v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto) {
 	Manipulation_Parent :: v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	if (sound    != NULL)  sound    -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	if (pulses   != NULL)  pulses   -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	if (pitch    != NULL)  pitch    -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	if (duration != NULL)  duration -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	if (lpc      != NULL)  lpc      -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
+	if (our sound   )  our sound    -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
+	if (our pulses  )  our pulses   -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
+	if (our pitch   )  our pitch    -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
+	if (our duration)  our duration -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
+	if (our lpc     )  our lpc      -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
 }
 
-Manipulation Manipulation_create (double tmin, double tmax) {
+autoManipulation Manipulation_create (double tmin, double tmax) {
 	try {
 		autoManipulation me = Thing_new (Manipulation);
 		my xmin = tmin, my xmax = tmax;
 		my duration = DurationTier_create (tmin, tmax);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Manipulation object not created.");
+		Melder_throw (U"Manipulation object not created.");
 	}
 }
 
-int Manipulation_replaceOriginalSound (Manipulation me, Sound sound) {
+void Manipulation_replaceOriginalSound (Manipulation me, Sound sound) {
 	try {
-		autoSound sound2 = Sound_convertToMono (sound);
-		Vector_subtractMean (sound2.peek());
-		forget (my sound);
-		forget (my lpc);
-		my sound = sound2.transfer();
-		return 1;
+		my sound = Sound_convertToMono (sound);
+		Vector_subtractMean (my sound.peek());
+		my lpc = nullptr;
 	} catch (MelderError) {
-		Melder_throw (me, ": original Sound not replaced with ", sound, ".");
+		Melder_throw (me, U": original Sound not replaced with ", sound, U".");
 	}
 }
 
-int Manipulation_replacePulses (Manipulation me, PointProcess pulses) {
+void Manipulation_replacePulses (Manipulation me, PointProcess pulses) {
 	try {
-		autoPointProcess pulses2 = Data_copy (pulses);
-		forget (my pulses);
-		my pulses = pulses2.transfer();
-		return 1;
+		my pulses = Data_copy (pulses);
 	} catch (MelderError) {
-		Melder_throw (me, ": pulses not replaced with ", pulses, ".");
+		Melder_throw (me, U": pulses not replaced with ", pulses, U".");
 	}
 }
 
-int Manipulation_replacePitchTier (Manipulation me, PitchTier pitch) {
+void Manipulation_replacePitchTier (Manipulation me, PitchTier pitch) {
 	try {
-		autoPitchTier pitch2 = Data_copy (pitch);
-		forget (my pitch);
-		my pitch = pitch2.transfer();
-		return 1;
+		my pitch = Data_copy (pitch);
 	} catch (MelderError) {
-		Melder_throw (me, ": pitch tier not replaced with ", pitch, ".");
+		Melder_throw (me, U": pitch tier not replaced with ", pitch, U".");
 	}
 }
 
-int Manipulation_replaceDurationTier (Manipulation me, DurationTier duration) {
+void Manipulation_replaceDurationTier (Manipulation me, DurationTier duration) {
 	try {
-		autoDurationTier duration2 = Data_copy (duration);
-		forget (my duration);
-		my duration = duration2.transfer();
-		return 1;
+		my duration = Data_copy (duration);
 	} catch (MelderError) {
-		Melder_throw (me, ": duration tier not replaced with ", duration, ".");
+		Melder_throw (me, U": duration tier not replaced with ", duration, U".");
 	}
 }
 
-Manipulation Sound_to_Manipulation (Sound me, double timeStep, double minimumPitch, double maximumPitch) {
+autoManipulation Sound_to_Manipulation (Sound me, double timeStep, double minimumPitch, double maximumPitch) {
 	try {
 		autoManipulation thee = Manipulation_create (my xmin, my xmax);
 		thy sound = Sound_convertToMono (me);
-		Vector_subtractMean (thy sound);
-		autoPitch pitch = Sound_to_Pitch (thy sound, timeStep, minimumPitch, maximumPitch);
-		thy pulses = Sound_Pitch_to_PointProcess_cc (thy sound, pitch.peek());
+		Vector_subtractMean (thy sound.get());
+		autoPitch pitch = Sound_to_Pitch (thy sound.get(), timeStep, minimumPitch, maximumPitch);
+		thy pulses = Sound_Pitch_to_PointProcess_cc (thy sound.get(), pitch.peek());
 		thy pitch = Pitch_to_PitchTier (pitch.peek());
 		/* (DurationTier has been done at creation time) */
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Manipulation.");
+		Melder_throw (me, U": not converted to Manipulation.");
 	}
 }
 
-Manipulation Sound_Pitch_to_Manipulation (Sound sound, Pitch pitch) {
+autoManipulation Sound_Pitch_to_Manipulation (Sound sound, Pitch pitch) {
 	try {
 		autoManipulation me = Manipulation_create (sound -> xmin, sound -> xmax);
 		my sound = Sound_convertToMono (sound);
-		Vector_subtractMean (my sound);
-		my pulses = Sound_Pitch_to_PointProcess_cc (my sound, pitch);
+		Vector_subtractMean (my sound.get());
+		my pulses = Sound_Pitch_to_PointProcess_cc (my sound.get(), pitch);
 		my pitch = Pitch_to_PitchTier (pitch);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw (sound, " & ", pitch, ": not converted to Manipulation.");
+		Melder_throw (sound, U" & ", pitch, U": not converted to Manipulation.");
 	}
 }
 
-Manipulation Sound_PointProcess_to_Manipulation (Sound sound, PointProcess point) {
+autoManipulation Sound_PointProcess_to_Manipulation (Sound sound, PointProcess point) {
 	try {
 		autoManipulation me = Manipulation_create (sound -> xmin, sound -> xmax);
 		my sound = Sound_convertToMono (sound);
-		Vector_subtractMean (my sound);
+		Vector_subtractMean (my sound.get());
 		my pulses = Data_copy (point);
 		my pitch = PointProcess_to_PitchTier (point, MAX_T);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw (sound, " & ", point, ": not converted to Manipulation.");
+		Melder_throw (sound, U" & ", point, U": not converted to Manipulation.");
 	}
 }
 
 int Manipulation_playPart (Manipulation me, double tmin, double tmax, int method) {
 	try {
 		if (method == Manipulation_OVERLAPADD) {
-			Sound saved = my sound;
 			if (! my sound)
-				Melder_throw ("Cannot synthesize overlap-add without a sound.");
-			autoSound part = Data_copy (my sound);
+				Melder_throw (U"Cannot synthesize overlap-add without a sound.");
+			autoSound part = Data_copy (my sound.get());
 			long imin = Sampled_xToLowIndex (part.peek(), tmin), imax = Sampled_xToHighIndex (part.peek(), tmax);
 			double *amp = part -> z [1];
 			for (long i = 1; i <= imin; i ++) amp [i] = 0.0;
 			for (long i = imax; i <= part -> nx; i ++) amp [i] = 0.0;
-			my sound = part.peek();
+			autoSound saved = my sound.move();
+			my sound = part.move();
 			try {
 				autoSound played = Manipulation_to_Sound (me, Manipulation_OVERLAPADD);
-				my sound = saved;
+				my sound = saved.move();
 				amp = played -> z [1];
 				for (imin = 1; imin <= played -> nx; imin ++)
 					if (amp [imin] != 0.0) break;
 				for (imax = played -> nx; imax >= 1; imax --)
 					if (amp [imax] != 0.0) break;
-				Sound_playPart (played.peek(), played -> x1 + (imin - 1.5) * played -> dx, played -> x1 + (imax - 0.5) * played -> dx, NULL, 0);
+				Sound_playPart (played.peek(), played -> x1 + (imin - 1.5) * played -> dx, played -> x1 + (imax - 0.5) * played -> dx, nullptr, nullptr);
 			} catch (MelderError) {
-				my sound = saved;
+				my sound = saved.move();
 				throw;
 			}
 		} else {
 			autoSound sound = Manipulation_to_Sound (me, method);
-			Sound_playPart (sound.peek(), tmin, tmax, NULL, 0);
+			Sound_playPart (sound.peek(), tmin, tmax, nullptr, nullptr);
 		}
 		return 1;
 	} catch (MelderError) {
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
 int Manipulation_play (Manipulation me, int method) {
 	try {
 		autoSound sound = Manipulation_to_Sound (me, method);
-		Sound_play (sound.peek(), NULL, NULL);
+		Sound_play (sound.peek(), nullptr, nullptr);
 		return 1;
 	} catch (MelderError) {
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
@@ -216,38 +204,34 @@ static long PointProcess_getFirstVoicedPoint (PointProcess me, double maxT) {
 }
 
 static void copyRise (Sound me, double tmin, double tmax, Sound thee, double tmaxTarget) {
-	long imin, imax, imaxTarget, distance, i;
-	double dphase;
-	imin = Sampled_xToHighIndex (me, tmin);
+	long imin = Sampled_xToHighIndex (me, tmin);
 	if (imin < 1) imin = 1;
-	imax = Sampled_xToHighIndex (me, tmax) - 1;   /* Not xToLowIndex: ensure separation of subsequent calls. */
+	long imax = Sampled_xToHighIndex (me, tmax) - 1;   // not xToLowIndex: ensure separation of subsequent calls
 	if (imax > my nx) imax = my nx;
 	if (imax < imin) return;
-	imaxTarget = Sampled_xToHighIndex (thee, tmaxTarget) - 1;
-	distance = imaxTarget - imax;
-	dphase = NUMpi / (imax - imin + 1);
-	for (i = imin; i <= imax; i ++) {
+	long imaxTarget = Sampled_xToHighIndex (thee, tmaxTarget) - 1;
+	long distance = imaxTarget - imax;
+	double dphase = NUMpi / (imax - imin + 1);
+	for (long i = imin; i <= imax; i ++) {
 		long iTarget = i + distance;
 		if (iTarget >= 1 && iTarget <= thy nx)
-			thy z [1] [iTarget] += my z [1] [i] * 0.5 * (1 - cos (dphase * (i - imin + 0.5)));
+			thy z [1] [iTarget] += my z [1] [i] * 0.5 * (1.0 - cos (dphase * (i - imin + 0.5)));
 	}
 }
 
 static void copyFall (Sound me, double tmin, double tmax, Sound thee, double tminTarget) {
-	long imin, imax, iminTarget, distance, i;
-	double dphase;
-	imin = Sampled_xToHighIndex (me, tmin);
+	long imin = Sampled_xToHighIndex (me, tmin);
 	if (imin < 1) imin = 1;
-	imax = Sampled_xToHighIndex (me, tmax) - 1;   /* Not xToLowIndex: ensure separation of subsequent calls. */
+	long imax = Sampled_xToHighIndex (me, tmax) - 1;   // not xToLowIndex: ensure separation of subsequent calls
 	if (imax > my nx) imax = my nx;
 	if (imax < imin) return;
-	iminTarget = Sampled_xToHighIndex (thee, tminTarget);
-	distance = iminTarget - imin;
-	dphase = NUMpi / (imax - imin + 1);
-	for (i = imin; i <= imax; i ++) {
+	long iminTarget = Sampled_xToHighIndex (thee, tminTarget);
+	long distance = iminTarget - imin;
+	double dphase = NUMpi / (imax - imin + 1);
+	for (long i = imin; i <= imax; i ++) {
 		long iTarget = i + distance;
 		if (iTarget >= 1 && iTarget <= thy nx)
-			thy z [1] [iTarget] += my z [1] [i] * 0.5 * (1 + cos (dphase * (i - imin + 0.5)));
+			thy z [1] [iTarget] += my z [1] [i] * 0.5 * (1.0 + cos (dphase * (i - imin + 0.5)));
 	}
 }
 
@@ -283,12 +267,12 @@ static void copyFlat (Sound me, double tmin, double tmax, Sound thee, double tmi
 	if (imax < imin) return;
 	long iminTarget = Sampled_xToHighIndex (thee, tminTarget);
 	if (iminTarget < 1) iminTarget = 1;
-	trace ("%.17g %.17g %.17g %ld %ld %ld", tmin, tmax, tminTarget, imin, imax, iminTarget);
+	trace (tmin, U" ", tmax, U" ", tminTarget, U" ", imin, U" ", imax, U" ", iminTarget);
 	Melder_assert (iminTarget + imax - imin <= thy nx);
 	NUMvector_copyElements (my z [1] + imin, thy z [1] + iminTarget, 0, imax - imin);
 }
 
-Sound Sound_Point_Point_to_Sound (Sound me, PointProcess source, PointProcess target, double maxT) {
+autoSound Sound_Point_Point_to_Sound (Sound me, PointProcess source, PointProcess target, double maxT) {
 	try {
 		autoSound thee = Sound_create (1, my xmin, my xmax, my nx, my dx, my x1);
 		if (source -> nt < 2 || target -> nt < 2) {   /* Almost completely voiceless? */
@@ -324,13 +308,13 @@ Sound Sound_Point_Point_to_Sound (Sound me, PointProcess source, PointProcess ta
 				copyFlat (me, startOfFlat, endOfFlat, thee.peek(), startOfFlat);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not manipulated.");
+		Melder_throw (me, U": not manipulated.");
 	}
 }
 
-Sound Sound_Point_Pitch_Duration_to_Sound (Sound me, PointProcess pulses,
+autoSound Sound_Point_Pitch_Duration_to_Sound (Sound me, PointProcess pulses,
 	PitchTier pitch, DurationTier duration, double maxT)
 {
 	try {
@@ -342,7 +326,7 @@ Sound Sound_Point_Pitch_Duration_to_Sound (Sound me, PointProcess pulses,
 		double durationOfSourceVoice, durationOfTargetVoice;
 		double startingPeriod, finishingPeriod, ttarget, voicelessPeriod;
 		if (duration -> points -> size == 0)
-			Melder_throw ("No duration points.");
+			Melder_throw (U"No duration points.");
 
 		/*
 		 * Create a Sound long enough to hold the longest possible duration-manipulated sound.
@@ -474,99 +458,93 @@ Sound Sound_Point_Pitch_Duration_to_Sound (Sound me, PointProcess pulses,
 		thy nx = Sampled_xToLowIndex (thee.peek(), thy xmax);
 		if (thy nx > 3 * my nx) thy nx = 3 * my nx;
 
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not manipulated.");
+		Melder_throw (me, U": not manipulated.");
 	}
 }
 
-static Sound synthesize_overlapAdd_nodur (Manipulation me) {
+static autoSound synthesize_overlapAdd_nodur (Manipulation me) {
 	try {
-		if (! my sound)  Melder_throw ("Missing original sound.");
-		if (! my pulses) Melder_throw ("Missing pulses analysis.");
-		if (! my pitch)  Melder_throw ("Missing pitch manipulation.");
-		autoPointProcess targetPulses = PitchTier_Point_to_PointProcess (my pitch, my pulses, MAX_T);
-		autoSound thee = Sound_Point_Point_to_Sound (my sound, my pulses, targetPulses.peek(), MAX_T);
-		return thee.transfer();
+		if (! my sound)  Melder_throw (U"Missing original sound.");
+		if (! my pulses) Melder_throw (U"Missing pulses analysis.");
+		if (! my pitch)  Melder_throw (U"Missing pitch manipulation.");
+		autoPointProcess targetPulses = PitchTier_Point_to_PointProcess (my pitch.get(), my pulses.get(), MAX_T);
+		return Sound_Point_Point_to_Sound (my sound.get(), my pulses.get(), targetPulses.peek(), MAX_T);
 	} catch (MelderError) {
-		Melder_throw (me, ": overlap-add synthesis (without duration) not performed.");
+		Melder_throw (me, U": overlap-add synthesis (without duration) not performed.");
 	}
 }
 
-static Sound synthesize_overlapAdd (Manipulation me) {
+static autoSound synthesize_overlapAdd (Manipulation me) {
 	if (! my duration || my duration -> points -> size == 0) return synthesize_overlapAdd_nodur (me);
 	try {
-		if (! my sound)  Melder_throw ("Missing original sound.");
-		if (! my pulses) Melder_throw ("Missing pulses analysis.");
-		if (! my pitch)  Melder_throw ("Missing pitch manipulation.");
-		autoSound thee = Sound_Point_Pitch_Duration_to_Sound (my sound, my pulses, my pitch, my duration, MAX_T);
-		return thee.transfer();
+		if (! my sound)  Melder_throw (U"Missing original sound.");
+		if (! my pulses) Melder_throw (U"Missing pulses analysis.");
+		if (! my pitch)  Melder_throw (U"Missing pitch manipulation.");
+		return Sound_Point_Pitch_Duration_to_Sound (my sound.get(), my pulses.get(), my pitch.get(), my duration.get(), MAX_T);
 	} catch (MelderError) {
-		Melder_throw (me, ": overlap-add synthesis not performed.");
+		Melder_throw (me, U": overlap-add synthesis not performed.");
 	}
 }
 
-static Sound synthesize_pulses (Manipulation me) {
+static autoSound synthesize_pulses (Manipulation me) {
 	try {
-		if (! my pulses) Melder_throw ("Missing pulses analysis.");
-		return PointProcess_to_Sound_pulseTrain (my pulses, 44100, 0.7, 0.05, 30);
+		if (! my pulses) Melder_throw (U"Missing pulses analysis.");
+		return PointProcess_to_Sound_pulseTrain (my pulses.get(), 44100, 0.7, 0.05, 30);
 	} catch (MelderError) {
-		Melder_throw (me, ": pulses synthesis not performed.");
+		Melder_throw (me, U": pulses synthesis not performed.");
 	}
 }
 
-static Sound synthesize_pulses_hum (Manipulation me) {
+static autoSound synthesize_pulses_hum (Manipulation me) {
 	try {
-		if (! my pulses) Melder_throw ("Missing pulses analysis.");
-		return PointProcess_to_Sound_hum (my pulses);
+		if (! my pulses) Melder_throw (U"Missing pulses analysis.");
+		return PointProcess_to_Sound_hum (my pulses.get());
 	} catch (MelderError) {
-		Melder_throw (me, ": pulses hum synthesis not performed.");
+		Melder_throw (me, U": pulses hum synthesis not performed.");
 	}
 }
 
-static Sound synthesize_pitch (Manipulation me) {
+static autoSound synthesize_pitch (Manipulation me) {
 	try {
-		if (! my pitch) Melder_throw ("Missing pitch tier.");
-		autoPointProcess pulses = PitchTier_to_PointProcess (my pitch);
-		autoSound thee = PointProcess_to_Sound_pulseTrain (pulses.peek(), 44100, 0.7, 0.05, 30);
-		return thee.transfer();
+		if (! my pitch) Melder_throw (U"Missing pitch tier.");
+		autoPointProcess pulses = PitchTier_to_PointProcess (my pitch.get());
+		return PointProcess_to_Sound_pulseTrain (pulses.peek(), 44100, 0.7, 0.05, 30);
 	} catch (MelderError) {
-		Melder_throw (me, ": pitch manipulation not synthesized.");
+		Melder_throw (me, U": pitch manipulation not synthesized.");
 	}
 }
 
-static Sound synthesize_pitch_hum (Manipulation me) {
+static autoSound synthesize_pitch_hum (Manipulation me) {
 	try {
-		if (! my pitch) Melder_throw ("Missing pitch tier.");
-		autoPointProcess pulses = PitchTier_to_PointProcess (my pitch);
-		autoSound thee = PointProcess_to_Sound_hum (pulses.peek());
-		return thee.transfer();
+		if (! my pitch) Melder_throw (U"Missing pitch tier.");
+		autoPointProcess pulses = PitchTier_to_PointProcess (my pitch.get());
+		return PointProcess_to_Sound_hum (pulses.peek());
 	} catch (MelderError) {
-		Melder_throw (me, ": pitch hum manipulation not synthesized.");
+		Melder_throw (me, U": pitch hum manipulation not synthesized.");
 	}
 }
 
-static Sound synthesize_pulses_pitch (Manipulation me) {
+static autoSound synthesize_pulses_pitch (Manipulation me) {
 	try {
-		if (! my pulses) Melder_throw ("Missing pulses analysis.");
-		if (! my pitch)  Melder_throw ("Missing pitch tier.");
-		autoPointProcess pulses = PitchTier_Point_to_PointProcess (my pitch, my pulses, MAX_T);
-		autoSound thee = PointProcess_to_Sound_pulseTrain (pulses.peek(), 44100, 0.7, 0.05, 30);
-		return thee.transfer();
+		if (! my pulses) Melder_throw (U"Missing pulses analysis.");
+		if (! my pitch)  Melder_throw (U"Missing pitch tier.");
+		autoPointProcess pulses = PitchTier_Point_to_PointProcess (my pitch.get(), my pulses.get(), MAX_T);
+		return PointProcess_to_Sound_pulseTrain (pulses.peek(), 44100, 0.7, 0.05, 30);
 	} catch (MelderError) {
-		Melder_throw (me, ": pitch pulses manipulation not synthesized.");
+		Melder_throw (me, U": pitch pulses manipulation not synthesized.");
 	}
 }
 
-static Sound synthesize_pulses_pitch_hum (Manipulation me) {
+static autoSound synthesize_pulses_pitch_hum (Manipulation me) {
 	try {
-		if (! my pulses) Melder_throw ("Missing pulses analysis.");
-		if (! my pitch)  Melder_throw ("Missing pitch tier.");
-		autoPointProcess pulses = PitchTier_Point_to_PointProcess (my pitch, my pulses, MAX_T);
-		autoSound thee = PointProcess_to_Sound_hum (pulses.peek());
-		return thee.transfer();
+		if (! my pulses) Melder_throw (U"Missing pulses analysis.");
+		if (! my pitch)  Melder_throw (U"Missing pitch tier.");
+		autoPointProcess pulses = PitchTier_Point_to_PointProcess (my pitch.get(), my pulses.get(), MAX_T);
+		return PointProcess_to_Sound_hum (pulses.peek());
 	} catch (MelderError) {
-		Melder_throw (me, ": pitch pulses hum manipulation not synthesized.");
+		Melder_throw (me, U": pitch pulses hum manipulation not synthesized.");
 	}
 }
 
@@ -580,13 +558,13 @@ void Sound_Formant_Intensity_filter (Sound me, FormantTier formantTier, Intensit
 
 static Sound synthesize_pulses_formant (Manipulation me, int useIntensity) {
 	try {
-		if (! my pulses)  Melder_throw ("Missing pulses analysis.");
-		if (! my formant) Melder_throw ("Missing formant information.");
+		if (! my pulses)  Melder_throw (U"Missing pulses analysis.");
+		if (! my formant) Melder_throw (U"Missing formant information.");
 		autoSound thee = PointProcess_to_Sound (my pulses, 44100, 0.7, 0.05, 30);
-		Sound_Formant_Intensity_filter (thee.peek(), my formant, useIntensity ? my intensity : NULL);
+		Sound_Formant_Intensity_filter (thee.peek(), my formant, useIntensity ? my intensity : nullptr);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": formant and pulses manipulation not synthesized.");
+		Melder_throw (me, U": formant and pulses manipulation not synthesized.");
 	}
 }
 */
@@ -621,49 +599,49 @@ static void Sound_PointProcess_fillVoiceless (Sound me, PointProcess pulses) {
 	}
 }
 
-static Sound synthesize_pulses_lpc (Manipulation me) {
+static autoSound synthesize_pulses_lpc (Manipulation me) {
 	try {
 		if (! my lpc) {
-			if (! my sound) Melder_throw ("Missing original sound.");
-			autoSound sound10k = Sound_resample (my sound, 10000, 50);
-			my lpc = Sound_to_LPC_burg (sound10k.peek(), 20, 0.025, 0.01, 50.0);
+			if (! my sound) Melder_throw (U"Missing original sound.");
+			autoSound sound10k = Sound_resample (my sound.get(), 10000.0, 50);
+			my lpc = Sound_to_LPC_burg (sound10k.peek(), 20, 0.025, 0.01, 50.0).transfer();
 		}
-		if (! my pulses) Melder_throw ("Missing pulses analysis.");
-		autoSound train = PointProcess_to_Sound_pulseTrain (my pulses, 1 / my lpc -> samplingPeriod, 0.7, 0.05, 30);
+		if (! my pulses) Melder_throw (U"Missing pulses analysis.");
+		autoSound train = PointProcess_to_Sound_pulseTrain (my pulses.get(), 1.0 / my lpc -> samplingPeriod, 0.7, 0.05, 30);
 		train -> dx = my lpc -> samplingPeriod;   // to be exact
-		Sound_PointProcess_fillVoiceless (train.peek(), my pulses);
-		autoSound result = LPC_and_Sound_filter (my lpc, train.peek(), TRUE);
+		Sound_PointProcess_fillVoiceless (train.peek(), my pulses.get());
+		autoSound result = LPC_and_Sound_filter (my lpc, train.peek(), true);
 		NUMdeemphasize_f (result -> z [1], result -> nx, result -> dx, 50.0);
 		Vector_scale (result.peek(), 0.99);
-		return result.transfer();
+		return result;
 	} catch (MelderError) {
-		Melder_throw (me, ": LPC synthesis not performed.");
+		Melder_throw (me, U": LPC synthesis not performed.");
 	}
 }
 
-static Sound synthesize_pitch_lpc (Manipulation me) {
+static autoSound synthesize_pitch_lpc (Manipulation me) {
 	try {
 		if (! my lpc) {
-			if (! my sound) Melder_throw ("Missing original sound.");
-			autoSound sound10k = Sound_resample (my sound, 10000, 50);
-			my lpc = Sound_to_LPC_burg (sound10k.peek(), 20, 0.025, 0.01, 50.0);
+			if (! my sound) Melder_throw (U"Missing original sound.");
+			autoSound sound10k = Sound_resample (my sound.get(), 10000.0, 50);
+			my lpc = Sound_to_LPC_burg (sound10k.peek(), 20, 0.025, 0.01, 50.0).transfer();
 		}
-		if (! my pitch)  Melder_throw ("Missing pitch manipulation.");
-		if (! my pulses) Melder_throw ("Missing pulses analysis.");
-		autoPointProcess pulses = PitchTier_Point_to_PointProcess (my pitch, my pulses, MAX_T);
+		if (! my pitch)  Melder_throw (U"Missing pitch manipulation.");
+		if (! my pulses) Melder_throw (U"Missing pulses analysis.");
+		autoPointProcess pulses = PitchTier_Point_to_PointProcess (my pitch.get(), my pulses.get(), MAX_T);
 		autoSound train = PointProcess_to_Sound_pulseTrain (pulses.peek(), 1 / my lpc -> samplingPeriod, 0.7, 0.05, 30);
 		train -> dx = my lpc -> samplingPeriod;   // to be exact
-		Sound_PointProcess_fillVoiceless (train.peek(), my pulses);
-		autoSound result = LPC_and_Sound_filter (my lpc, train.peek(), TRUE);
+		Sound_PointProcess_fillVoiceless (train.peek(), my pulses.get());
+		autoSound result = LPC_and_Sound_filter (my lpc, train.peek(), true);
 		NUMdeemphasize_f (result -> z [1], result -> nx, result -> dx, 50.0);
 		Vector_scale (result.peek(), 0.99);
-		return result.transfer();
+		return result;
 	} catch (MelderError) {
-		Melder_throw (me, ": pitch LPC synthesis not performed.");
+		Melder_throw (me, U": pitch LPC synthesis not performed.");
 	}
 }
 
-Sound Manipulation_to_Sound (Manipulation me, int method) {
+autoSound Manipulation_to_Sound (Manipulation me, int method) {
 	switch (method) {
 		case Manipulation_OVERLAPADD: return synthesize_overlapAdd (me);
 		case Manipulation_PULSES: return synthesize_pulses (me);
@@ -683,50 +661,36 @@ Sound Manipulation_to_Sound (Manipulation me, int method) {
 	}
 }
 
-Manipulation Manipulation_AnyTier_to_Manipulation (Manipulation me, AnyTier tier) {
+autoManipulation Manipulation_AnyTier_to_Manipulation (Manipulation me, AnyTier tier) {
 	try {
-		if (! my pitch) Melder_throw ("Missing pitch manipulation.");
+		if (! my pitch) Melder_throw (U"Missing pitch manipulation.");
 		autoManipulation result = Data_copy (me);
-		/*
-		 * Create without change.
-		 */
-		autoPitchTier pitch = PitchTier_AnyTier_to_PitchTier (my pitch, tier);
-		/*
-		 * Change without error.
-		 */
-		forget (result -> pitch);
-		result -> pitch = pitch.transfer();
-		/*
-		 */
-		return result.transfer();
+		result -> pitch = PitchTier_AnyTier_to_PitchTier (my pitch.get(), tier);
+		return result;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted.");
+		Melder_throw (me, U": not converted.");
 	}
 }
 
-int Manipulation_writeToTextFileWithoutSound (Manipulation me, MelderFile file) {
-	Sound saved = my sound;
+void Manipulation_writeToTextFileWithoutSound (Manipulation me, MelderFile file) {
+	autoSound saved = my sound.move();
 	try {
-		my sound = NULL;
 		Data_writeToTextFile (me, file);
-		my sound = saved;
-		return 1;
+		my sound = saved.move();
 	} catch (MelderError) {
-		my sound = saved;
-		Melder_throw (me, ": not saved to text file.");
+		my sound = saved.move();
+		Melder_throw (me, U": not saved to text file.");
 	}
 }
 
-int Manipulation_writeToBinaryFileWithoutSound (Manipulation me, MelderFile file) {
-	Sound saved = my sound;
+void Manipulation_writeToBinaryFileWithoutSound (Manipulation me, MelderFile file) {
+	autoSound saved = my sound.move();
 	try {
-		my sound = NULL;
 		Data_writeToBinaryFile (me, file);
-		my sound = saved;
-		return 1;
+		my sound = saved.move();
 	} catch (MelderError) {
-		my sound = saved;
-		Melder_throw (me, ": not saved to binary file.");
+		my sound = saved.move();
+		Melder_throw (me, U": not saved to binary file.");
 	}
 }
 
diff --git a/fon/Manipulation.h b/fon/Manipulation.h
index df8938a..ec7b73f 100644
--- a/fon/Manipulation.h
+++ b/fon/Manipulation.h
@@ -2,7 +2,7 @@
 #define _Manipulation_h_
 /* Manipulation.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,17 +38,17 @@ oo_CLASS_CREATE (Manipulation, Function);
 
 /* How to create an Manipulation. */
 
-Manipulation Manipulation_create (double tmin, double tmax);
-int Manipulation_replaceOriginalSound (Manipulation me, Sound sound);
-int Manipulation_replacePulses (Manipulation me, PointProcess pulses);
-int Manipulation_replaceIntensityTier (Manipulation me, IntensityTier intensity);
-int Manipulation_replacePitchTier (Manipulation me, PitchTier pitch);
-int Manipulation_replaceDurationTier (Manipulation me, DurationTier duration);
+autoManipulation Manipulation_create (double tmin, double tmax);
+void Manipulation_replaceOriginalSound (Manipulation me, Sound sound);
+void Manipulation_replacePulses (Manipulation me, PointProcess pulses);
+void Manipulation_replaceIntensityTier (Manipulation me, IntensityTier intensity);
+void Manipulation_replacePitchTier (Manipulation me, PitchTier pitch);
+void Manipulation_replaceDurationTier (Manipulation me, DurationTier duration);
 
-Manipulation Sound_to_Manipulation (Sound me, double timeStep, double minimumPitch, double maximumPitch);
-Manipulation Sound_Pitch_to_Manipulation (Sound sound, Pitch pitch);
-Manipulation Sound_PointProcess_to_Manipulation (Sound sound, PointProcess point);
-Manipulation Manipulation_AnyTier_to_Manipulation (Manipulation manip, AnyTier tier);
+autoManipulation Sound_to_Manipulation (Sound me, double timeStep, double minimumPitch, double maximumPitch);
+autoManipulation Sound_Pitch_to_Manipulation (Sound sound, Pitch pitch);
+autoManipulation Sound_PointProcess_to_Manipulation (Sound sound, PointProcess point);
+autoManipulation Manipulation_AnyTier_to_Manipulation (Manipulation manip, AnyTier tier);
 
 /* Resynthesis. */
 
@@ -67,18 +67,18 @@ Manipulation Manipulation_AnyTier_to_Manipulation (Manipulation manip, AnyTier t
 #define Manipulation_PITCH_LPC  13
 #define Manipulation_PITCH_LPC_INTENSITY  14
 #define Manipulation_PITCH_LPC_INT_DUR  15
-Sound Sound_Point_Point_to_Sound (Sound me, PointProcess source, PointProcess target, double maxT);
+autoSound Sound_Point_Point_to_Sound (Sound me, PointProcess source, PointProcess target, double maxT);
 /*void Sound_Formant_Intensity_filter (Sound me, FormantTier formant, IntensityTier intensity);*/
 
-Sound Manipulation_to_Sound (Manipulation me, int method);
+autoSound Manipulation_to_Sound (Manipulation me, int method);
 int Manipulation_playPart (Manipulation me, double tmin, double tmax, int method);
 int Manipulation_play (Manipulation me, int method);
-int Manipulation_writeToTextFileWithoutSound (Manipulation me, MelderFile fs);
-int Manipulation_writeToBinaryFileWithoutSound (Manipulation me, MelderFile fs);
+void Manipulation_writeToTextFileWithoutSound (Manipulation me, MelderFile file);
+void Manipulation_writeToBinaryFileWithoutSound (Manipulation me, MelderFile file);
 
 /* The low-level synthesis routines. */
 
-Sound Sound_Point_Pitch_Duration_to_Sound (Sound me, PointProcess pulses,
+autoSound Sound_Point_Pitch_Duration_to_Sound (Sound me, PointProcess pulses,
 	PitchTier pitch, DurationTier duration, double maxT);
 
 /* End of file Manipulation.h */
diff --git a/fon/ManipulationEditor.cpp b/fon/ManipulationEditor.cpp
index e49a101..dc09617 100644
--- a/fon/ManipulationEditor.cpp
+++ b/fon/ManipulationEditor.cpp
@@ -1,6 +1,6 @@
 /* ManipulationEditor.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -48,7 +48,7 @@ Thing_implement (ManipulationEditor, FunctionEditor, 0);
  * 5. create the button in createMenus and update updateMenus;
  */
 
-static const wchar_t *units_strings [] = { 0, L"Hz", L"st" };
+static const char32 *units_strings [] = { 0, U"Hz", U"st" };
 
 static int prefs_synthesisMethod = Manipulation_OVERLAPADD;   /* Remembered across editor creations, not across Praat sessions. */
 
@@ -57,59 +57,50 @@ static int prefs_synthesisMethod = Manipulation_OVERLAPADD;   /* Remembered acro
 #define YLININV(freq)  (my p_pitch_units == kManipulationEditor_pitchUnits_HERTZ ? (freq) : NUMsemitonesToHertz (freq))
 
 static void updateMenus (ManipulationEditor me) {
-	Melder_assert (my synthPulsesButton != NULL);
-	my synthPulsesButton -> f_check (my synthesisMethod == Manipulation_PULSES);
-	Melder_assert (my synthPulsesHumButton != NULL);
-	my synthPulsesHumButton -> f_check (my synthesisMethod == Manipulation_PULSES_HUM);
-	Melder_assert (my synthPulsesLpcButton != NULL);
-	my synthPulsesLpcButton -> f_check (my synthesisMethod == Manipulation_PULSES_LPC);
-	Melder_assert (my synthPitchButton != NULL);
-	my synthPitchButton -> f_check (my synthesisMethod == Manipulation_PITCH);
-	Melder_assert (my synthPitchHumButton != NULL);
-	my synthPitchHumButton -> f_check (my synthesisMethod == Manipulation_PITCH_HUM);
-	Melder_assert (my synthPulsesPitchButton != NULL);
-	my synthPulsesPitchButton -> f_check (my synthesisMethod == Manipulation_PULSES_PITCH);
-	Melder_assert (my synthPulsesPitchHumButton != NULL);
-	my synthPulsesPitchHumButton -> f_check (my synthesisMethod == Manipulation_PULSES_PITCH_HUM);
-	Melder_assert (my synthOverlapAddButton != NULL);
-	my synthOverlapAddButton -> f_check (my synthesisMethod == Manipulation_OVERLAPADD);
-	Melder_assert (my synthPitchLpcButton != NULL);
-	my synthPitchLpcButton -> f_check (my synthesisMethod == Manipulation_PITCH_LPC);
+	Melder_assert (my synthPulsesButton);
+	GuiMenuItem_check (my synthPulsesButton, my synthesisMethod == Manipulation_PULSES);
+	Melder_assert (my synthPulsesHumButton);
+	GuiMenuItem_check (my synthPulsesHumButton, my synthesisMethod == Manipulation_PULSES_HUM);
+	Melder_assert (my synthPulsesLpcButton);
+	GuiMenuItem_check (my synthPulsesLpcButton, my synthesisMethod == Manipulation_PULSES_LPC);
+	Melder_assert (my synthPitchButton);
+	GuiMenuItem_check (my synthPitchButton, my synthesisMethod == Manipulation_PITCH);
+	Melder_assert (my synthPitchHumButton);
+	GuiMenuItem_check (my synthPitchHumButton, my synthesisMethod == Manipulation_PITCH_HUM);
+	Melder_assert (my synthPulsesPitchButton);
+	GuiMenuItem_check (my synthPulsesPitchButton, my synthesisMethod == Manipulation_PULSES_PITCH);
+	Melder_assert (my synthPulsesPitchHumButton);
+	GuiMenuItem_check (my synthPulsesPitchHumButton, my synthesisMethod == Manipulation_PULSES_PITCH_HUM);
+	Melder_assert (my synthOverlapAddButton);
+	GuiMenuItem_check (my synthOverlapAddButton, my synthesisMethod == Manipulation_OVERLAPADD);
+	Melder_assert (my synthPitchLpcButton);
+	GuiMenuItem_check (my synthPitchLpcButton, my synthesisMethod == Manipulation_PITCH_LPC);
 }
 
 /*
  * The "sound area" contains the original sound and the pulses.
  */
-static int getSoundArea (ManipulationEditor me, double *ymin, double *ymax) {
+static bool getSoundArea (ManipulationEditor me, double *ymin, double *ymax) {
 	Manipulation ana = (Manipulation) my data;
 	*ymin = 0.66;
 	*ymax = 1.00;
-	return ana -> sound != NULL || ana -> pulses != NULL;
+	return ana -> sound || ana -> pulses;
 }
 /*
  * The "pitch area" contains the grey pitch analysis based on the pulses, and the blue pitch tier.
  */
-static int getPitchArea (ManipulationEditor me, double *ymin, double *ymax) {
+static bool getPitchArea (ManipulationEditor me, double *ymin, double *ymax) {
 	Manipulation ana = (Manipulation) my data;
 	*ymin = ana -> duration ? 0.16 : 0.00;
 	*ymax = 0.65;
-	return ana -> pulses != NULL || ana -> pitch != NULL;
+	return ana -> pulses || ana -> pitch;
 }
-static int getDurationArea (ManipulationEditor me, double *ymin, double *ymax) {
+static bool getDurationArea (ManipulationEditor me, double *ymin, double *ymax) {
 	Manipulation ana = (Manipulation) my data;
-	if (! ana -> duration) return FALSE;
+	if (! ana -> duration) return false;
 	*ymin = 0.00;
 	*ymax = 0.15;
-	return TRUE;
-}
-
-/********** DESTRUCTION **********/
-
-void structManipulationEditor :: v_destroy () {
-	forget (our previousPulses);
-	forget (our previousPitch);
-	forget (our previousDuration);
-	ManipulationEditor_Parent :: v_destroy ();
+	return true;
 }
 
 /********** MENU COMMANDS **********/
@@ -120,59 +111,55 @@ static void menu_cb_extractOriginalSound (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> sound) return;
-	autoSound publish = Data_copy (ana -> sound);
-	my broadcastPublication (publish.transfer());
+	autoSound publish = Data_copy (ana -> sound.get());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_extractPulses (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> pulses) return;
-	autoPointProcess publish = Data_copy (ana -> pulses);
-	my broadcastPublication (publish.transfer());
+	autoPointProcess publish = Data_copy (ana -> pulses.get());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_extractPitchTier (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> pitch) return;
-	autoPitchTier publish = Data_copy (ana -> pitch);
-	my broadcastPublication (publish.transfer());
+	autoPitchTier publish = Data_copy (ana -> pitch.get());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_extractDurationTier (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> duration) return;
-	autoDurationTier publish = Data_copy (ana -> duration);
-	my broadcastPublication (publish.transfer());
+	autoDurationTier publish = Data_copy (ana -> duration.get());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_extractManipulatedSound (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	autoSound publish = Manipulation_to_Sound (ana, my synthesisMethod);
-	my broadcastPublication (publish.transfer());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 /***** EDIT MENU *****/
 
 void structManipulationEditor :: v_saveData () {
 	Manipulation ana = (Manipulation) our data;
-	forget (our previousPulses);
-	forget (our previousPitch);
-	forget (our previousDuration);
-	if (ana -> pulses)   our previousPulses   = Data_copy (ana -> pulses);
-	if (ana -> pitch)    our previousPitch    = Data_copy (ana -> pitch);
-	if (ana -> duration) our previousDuration = Data_copy (ana -> duration);
+	if (ana -> pulses)   our previousPulses   = Data_copy (ana -> pulses.get());
+	if (ana -> pitch)    our previousPitch    = Data_copy (ana -> pitch.get());
+	if (ana -> duration) our previousDuration = Data_copy (ana -> duration.get());
 }
 
 void structManipulationEditor :: v_restoreData () {
 	Manipulation ana = (Manipulation) our data;
-	Any dummy;
-	dummy = ana -> pulses;   ana -> pulses   = our previousPulses;   our previousPulses   = (PointProcess) dummy;
-	dummy = ana -> pitch;    ana -> pitch    = our previousPitch;    our previousPitch    = (PitchTier)    dummy;
-	dummy = ana -> duration; ana -> duration = our previousDuration; our previousDuration = (DurationTier) dummy;
+	autoPointProcess dummy1 = ana -> pulses.move();   ana -> pulses   = our previousPulses.move();   our previousPulses   = dummy1.move();
+	autoPitchTier    dummy2 = ana -> pitch.move();    ana -> pitch    = our previousPitch.move();    our previousPitch    = dummy2.move();
+	autoDurationTier dummy3 = ana -> duration.move(); ana -> duration = our previousDuration.move(); our previousDuration = dummy3.move();
 }
 
 /***** PULSES MENU *****/
@@ -181,38 +168,38 @@ static void menu_cb_removePulses (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);	
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> pulses) return;
-	Editor_save (me, L"Remove pulse(s)");
+	Editor_save (me, U"Remove pulse(s)");
 	if (my d_startSelection == my d_endSelection)
-		PointProcess_removePointNear (ana -> pulses, my d_startSelection);
+		PointProcess_removePointNear (ana -> pulses.get(), my d_startSelection);
 	else
-		PointProcess_removePointsBetween (ana -> pulses, my d_startSelection, my d_endSelection);
+		PointProcess_removePointsBetween (ana -> pulses.get(), my d_startSelection, my d_endSelection);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addPulseAtCursor (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> pulses) return;
-	Editor_save (me, L"Add pulse");
-	PointProcess_addPoint (ana -> pulses, 0.5 * (my d_startSelection + my d_endSelection));
+	Editor_save (me, U"Add pulse");
+	PointProcess_addPoint (ana -> pulses.get(), 0.5 * (my d_startSelection + my d_endSelection));
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addPulseAt (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Add pulse", 0)
-		REAL (L"Position (s)", L"0.0")
+	EDITOR_FORM (U"Add pulse", 0)
+		REAL (U"Position (s)", U"0.0")
 	EDITOR_OK
-		SET_REAL (L"Position", 0.5 * (my d_startSelection + my d_endSelection))
+		SET_REAL (U"Position", 0.5 * (my d_startSelection + my d_endSelection))
 	EDITOR_DO
 		Manipulation ana = (Manipulation) my data;
 		if (! ana -> pulses) return;
-		Editor_save (me, L"Add pulse");
-		PointProcess_addPoint (ana -> pulses, GET_REAL (L"Position"));
+		Editor_save (me, U"Add pulse");
+		PointProcess_addPoint (ana -> pulses.get(), GET_REAL (U"Position"));
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
@@ -222,35 +209,35 @@ static void menu_cb_removePitchPoints (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> pitch) return;
-	Editor_save (me, L"Remove pitch point(s)");
+	Editor_save (me, U"Remove pitch point(s)");
 	if (my d_startSelection == my d_endSelection)
-		AnyTier_removePointNear (ana -> pitch, my d_startSelection);
+		AnyTier_removePointNear (ana -> pitch.get(), my d_startSelection);
 	else
-		AnyTier_removePointsBetween (ana -> pitch, my d_startSelection, my d_endSelection);
+		AnyTier_removePointsBetween (ana -> pitch.get(), my d_startSelection, my d_endSelection);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addPitchPointAtCursor (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> pitch) return;
-	Editor_save (me, L"Add pitch point");
-	RealTier_addPoint (ana -> pitch, 0.5 * (my d_startSelection + my d_endSelection), YLININV (my pitchTier.cursor));
+	Editor_save (me, U"Add pitch point");
+	RealTier_addPoint (ana -> pitch.get(), 0.5 * (my d_startSelection + my d_endSelection), YLININV (my pitchTier.cursor));
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addPitchPointAtSlice (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
-	PointProcess pulses = ana -> pulses;
-	if (! pulses) Melder_throw ("There are no pulses.");
+	PointProcess pulses = ana -> pulses.get();
+	if (! pulses) Melder_throw (U"There are no pulses.");
 	if (! ana -> pitch) return;
 	long ileft = PointProcess_getLowIndex (pulses, 0.5 * (my d_startSelection + my d_endSelection)), iright = ileft + 1, nt = pulses -> nt;
 	double *t = pulses -> t;
 	double f = my pitchTier.cursor;   // default
-	Editor_save (me, L"Add pitch point");
+	Editor_save (me, U"Add pitch point");
 	if (nt <= 1) {
 		/* Ignore. */
 	} else if (ileft <= 0) {
@@ -274,48 +261,48 @@ static void menu_cb_addPitchPointAtSlice (EDITOR_ARGS) {
 		else if (tmid != 0.0) f = YLIN (2 / (tmid + tright));   // median of 2
 		else if (tright != 0.0) f = YLIN (1 / tright);   // median of 1
 	}
-	RealTier_addPoint (ana -> pitch, 0.5 * (my d_startSelection + my d_endSelection), YLININV (f));
+	RealTier_addPoint (ana -> pitch.get(), 0.5 * (my d_startSelection + my d_endSelection), YLININV (f));
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }	
 
 static void menu_cb_addPitchPointAt (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Add pitch point", 0)
-		REAL (L"Time (s)", L"0.0")
-		REAL (L"Frequency (Hz or st)", L"100.0")
+	EDITOR_FORM (U"Add pitch point", 0)
+		REAL (U"Time (s)", U"0.0")
+		REAL (U"Frequency (Hz or st)", U"100.0")
 	EDITOR_OK
-		SET_REAL (L"Time", 0.5 * (my d_startSelection + my d_endSelection))
-		SET_REAL (L"Frequency", my pitchTier.cursor)
+		SET_REAL (U"Time", 0.5 * (my d_startSelection + my d_endSelection))
+		SET_REAL (U"Frequency", my pitchTier.cursor)
 	EDITOR_DO
 		Manipulation ana = (Manipulation) my data;
 		if (! ana -> pitch) return;
-		Editor_save (me, L"Add pitch point");
-		RealTier_addPoint (ana -> pitch, GET_REAL (L"Time"), YLININV (GET_REAL (L"Frequency")));
+		Editor_save (me, U"Add pitch point");
+		RealTier_addPoint (ana -> pitch.get(), GET_REAL (U"Time"), YLININV (GET_REAL (U"Frequency")));
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_stylizePitch (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Stylize pitch", L"PitchTier: Stylize...")
-		REAL (L"Frequency resolution", my default_pitch_stylize_frequencyResolution ())
-		RADIO (L"Units", my default_pitch_stylize_useSemitones () + 1)
-			RADIOBUTTON (L"Hertz")
-			RADIOBUTTON (L"semitones")
+	EDITOR_FORM (U"Stylize pitch", U"PitchTier: Stylize...")
+		REAL (U"Frequency resolution", my default_pitch_stylize_frequencyResolution ())
+		RADIO (U"Units", my default_pitch_stylize_useSemitones () + 1)
+			RADIOBUTTON (U"Hertz")
+			RADIOBUTTON (U"semitones")
 	EDITOR_OK
-		SET_REAL    (L"Frequency resolution", my p_pitch_stylize_frequencyResolution)
-		SET_INTEGER (L"Units",                my p_pitch_stylize_useSemitones + 1)
+		SET_REAL    (U"Frequency resolution", my p_pitch_stylize_frequencyResolution)
+		SET_INTEGER (U"Units",                my p_pitch_stylize_useSemitones + 1)
 	EDITOR_DO
 		Manipulation ana = (Manipulation) my data;
 		if (! ana -> pitch) return;
-		Editor_save (me, L"Stylize pitch");
-		PitchTier_stylize (ana -> pitch,
-			my pref_pitch_stylize_frequencyResolution () = my p_pitch_stylize_frequencyResolution = GET_REAL (L"Frequency resolution"),
-			my pref_pitch_stylize_useSemitones        () = my p_pitch_stylize_useSemitones        = GET_INTEGER (L"Units") - 1);
+		Editor_save (me, U"Stylize pitch");
+		PitchTier_stylize (ana -> pitch.get(),
+			my pref_pitch_stylize_frequencyResolution () = my p_pitch_stylize_frequencyResolution = GET_REAL (U"Frequency resolution"),
+			my pref_pitch_stylize_useSemitones        () = my p_pitch_stylize_useSemitones        = GET_INTEGER (U"Units") - 1);
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
@@ -323,27 +310,27 @@ static void menu_cb_stylizePitch_2st (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> pitch) return;
-	Editor_save (me, L"Stylize pitch");
-	PitchTier_stylize (ana -> pitch, 2.0, TRUE);
+	Editor_save (me, U"Stylize pitch");
+	PitchTier_stylize (ana -> pitch.get(), 2.0, true);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_interpolateQuadratically (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Interpolate quadratically", 0)
-		NATURAL (L"Number of points per parabola", my default_pitch_interpolateQuadratically_numberOfPointsPerParabola ())
+	EDITOR_FORM (U"Interpolate quadratically", 0)
+		NATURAL (U"Number of points per parabola", my default_pitch_interpolateQuadratically_numberOfPointsPerParabola ())
 	EDITOR_OK
-		SET_INTEGER (L"Number of points per parabola", my p_pitch_interpolateQuadratically_numberOfPointsPerParabola)
+		SET_INTEGER (U"Number of points per parabola", my p_pitch_interpolateQuadratically_numberOfPointsPerParabola)
 	EDITOR_DO
 		Manipulation ana = (Manipulation) my data;
 		if (! ana -> pitch) return;
-		Editor_save (me, L"Interpolate quadratically");
-		RealTier_interpolateQuadratically (ana -> pitch,
-			my pref_pitch_interpolateQuadratically_numberOfPointsPerParabola () = my p_pitch_interpolateQuadratically_numberOfPointsPerParabola = GET_INTEGER (L"Number of points per parabola"),
+		Editor_save (me, U"Interpolate quadratically");
+		RealTier_interpolateQuadratically (ana -> pitch.get(),
+			my pref_pitch_interpolateQuadratically_numberOfPointsPerParabola () = my p_pitch_interpolateQuadratically_numberOfPointsPerParabola = GET_INTEGER (U"Number of points per parabola"),
 			my p_pitch_units == kManipulationEditor_pitchUnits_SEMITONES);
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
@@ -351,26 +338,26 @@ static void menu_cb_interpolateQuadratically_4pts (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> pitch) return;
-	Editor_save (me, L"Interpolate quadratically");
-	RealTier_interpolateQuadratically (ana -> pitch, 4, my p_pitch_units == kManipulationEditor_pitchUnits_SEMITONES);
+	Editor_save (me, U"Interpolate quadratically");
+	RealTier_interpolateQuadratically (ana -> pitch.get(), 4, my p_pitch_units == kManipulationEditor_pitchUnits_SEMITONES);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_shiftPitchFrequencies (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Shift pitch frequencies", 0)
-		REAL (L"Frequency shift", L"-20.0")
-		OPTIONMENU (L"Unit", 1)
-			OPTION (L"Hertz")
-			OPTION (L"mel")
-			OPTION (L"logHertz")
-			OPTION (L"semitones")
-			OPTION (L"ERB")
+	EDITOR_FORM (U"Shift pitch frequencies", 0)
+		REAL (U"Frequency shift", U"-20.0")
+		OPTIONMENU (U"Unit", 1)
+			OPTION (U"Hertz")
+			OPTION (U"mel")
+			OPTION (U"logHertz")
+			OPTION (U"semitones")
+			OPTION (U"ERB")
 	EDITOR_OK
 	EDITOR_DO
 		Manipulation ana = (Manipulation) my data;
-		int unit = GET_INTEGER (L"Unit");
+		int unit = GET_INTEGER (U"Unit");
 		unit =
 			unit == 1 ? kPitch_unit_HERTZ :
 			unit == 2 ? kPitch_unit_MEL :
@@ -378,15 +365,15 @@ static void menu_cb_shiftPitchFrequencies (EDITOR_ARGS) {
 			unit == 4 ? kPitch_unit_SEMITONES_1 :
 			kPitch_unit_ERB;
 		if (! ana -> pitch) return;
-		Editor_save (me, L"Shift pitch frequencies");
+		Editor_save (me, U"Shift pitch frequencies");
 		try {
-			PitchTier_shiftFrequencies (ana -> pitch, my d_startSelection, my d_endSelection, GET_REAL (L"Frequency shift"), unit);
+			PitchTier_shiftFrequencies (ana -> pitch.get(), my d_startSelection, my d_endSelection, GET_REAL (U"Frequency shift"), unit);
 			FunctionEditor_redraw (me);
-			my broadcastDataChanged ();
+			Editor_broadcastDataChanged (me);
 		} catch (MelderError) {
 			// the PitchTier may have partially changed
 			FunctionEditor_redraw (me);
-			my broadcastDataChanged ();
+			Editor_broadcastDataChanged (me);
 			throw;
 		}
 	EDITOR_END
@@ -394,31 +381,31 @@ static void menu_cb_shiftPitchFrequencies (EDITOR_ARGS) {
 
 static void menu_cb_multiplyPitchFrequencies (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Multiply pitch frequencies", 0)
-		POSITIVE (L"Factor", L"1.2")
-		LABEL (L"", L"The multiplication is always done in hertz.")
+	EDITOR_FORM (U"Multiply pitch frequencies", 0)
+		POSITIVE (U"Factor", U"1.2")
+		LABEL (U"", U"The multiplication is always done in hertz.")
 	EDITOR_OK
 	EDITOR_DO
 		Manipulation ana = (Manipulation) my data;
 		if (! ana -> pitch) return;
-		Editor_save (me, L"Multiply pitch frequencies");
-		PitchTier_multiplyFrequencies (ana -> pitch, my d_startSelection, my d_endSelection, GET_REAL (L"Factor"));
+		Editor_save (me, U"Multiply pitch frequencies");
+		PitchTier_multiplyFrequencies (ana -> pitch.get(), my d_startSelection, my d_endSelection, GET_REAL (U"Factor"));
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_setPitchRange (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Set pitch range", 0)
+	EDITOR_FORM (U"Set pitch range", 0)
 		/* BUG: should include Minimum */
-		REAL (L"Maximum (Hz or st)", my default_pitch_maximum ())
+		REAL (U"Maximum (Hz or st)", my default_pitch_maximum ())
 	EDITOR_OK
-		SET_REAL (L"Maximum", my p_pitch_maximum)
+		SET_REAL (U"Maximum", my p_pitch_maximum)
 	EDITOR_DO
-		double maximum = GET_REAL (L"Maximum");
+		double maximum = GET_REAL (U"Maximum");
 		if (maximum <= my pitchTier.minPeriodic)
-			Melder_throw ("Maximum pitch must be greater than ", Melder_half (my pitchTier.minPeriodic), " ", units_strings [my p_pitch_units], ".");
+			Melder_throw (U"Maximum pitch must be greater than ", Melder_half (my pitchTier.minPeriodic), U" ", units_strings [my p_pitch_units], U".");
 		my pref_pitch_maximum () = my p_pitch_maximum = maximum;
 		FunctionEditor_redraw (me);
 	EDITOR_END
@@ -426,13 +413,13 @@ static void menu_cb_setPitchRange (EDITOR_ARGS) {
 
 static void menu_cb_setPitchUnits (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Set pitch units", 0)
-		RADIO_ENUM (L"Pitch units", kManipulationEditor_pitchUnits, my default_pitch_units ())
+	EDITOR_FORM (U"Set pitch units", 0)
+		RADIO_ENUM (U"Pitch units", kManipulationEditor_pitchUnits, my default_pitch_units ())
 	EDITOR_OK
-		SET_ENUM (L"Pitch units", kManipulationEditor_pitchUnits, my p_pitch_units)
+		SET_ENUM (U"Pitch units", kManipulationEditor_pitchUnits, my p_pitch_units)
 	EDITOR_DO
 		enum kManipulationEditor_pitchUnits oldPitchUnits = my p_pitch_units;
-		my pref_pitch_units () = my p_pitch_units = GET_ENUM (kManipulationEditor_pitchUnits, L"Pitch units");
+		my pref_pitch_units () = my p_pitch_units = GET_ENUM (kManipulationEditor_pitchUnits, U"Pitch units");
 		if (my p_pitch_units == oldPitchUnits) return;
 		if (my p_pitch_units == kManipulationEditor_pitchUnits_HERTZ) {
 			my p_pitch_minimum = 25.0;
@@ -453,26 +440,26 @@ static void menu_cb_setPitchUnits (EDITOR_ARGS) {
 
 static void menu_cb_setDurationRange (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Set duration range", 0)
-		REAL (L"Minimum", my default_duration_minimum ())
-		REAL (L"Maximum", my default_duration_maximum ())
+	EDITOR_FORM (U"Set duration range", 0)
+		REAL (U"Minimum", my default_duration_minimum ())
+		REAL (U"Maximum", my default_duration_maximum ())
 	EDITOR_OK
-		SET_REAL (L"Minimum", my p_duration_minimum)
-		SET_REAL (L"Maximum", my p_duration_maximum)
+		SET_REAL (U"Minimum", my p_duration_minimum)
+		SET_REAL (U"Maximum", my p_duration_maximum)
 	EDITOR_DO
 		Manipulation ana = (Manipulation) my data;
-		double minimum = GET_REAL (L"Minimum"), maximum = GET_REAL (L"Maximum");
-		double minimumValue = ana -> duration ? RealTier_getMinimumValue (ana -> duration) : NUMundefined;
-		double maximumValue = ana -> duration ? RealTier_getMaximumValue (ana -> duration) : NUMundefined;
-		if (minimum > 1) Melder_throw ("Minimum relative duration must not be greater than 1.");
-		if (maximum < 1) Melder_throw ("Maximum relative duration must not be less than 1.");
-		if (minimum >= maximum) Melder_throw ("Maximum relative duration must be greater than minimum.");
+		double minimum = GET_REAL (U"Minimum"), maximum = GET_REAL (U"Maximum");
+		double minimumValue = ana -> duration ? RealTier_getMinimumValue (ana -> duration.get()) : NUMundefined;
+		double maximumValue = ana -> duration ? RealTier_getMaximumValue (ana -> duration.get()) : NUMundefined;
+		if (minimum > 1) Melder_throw (U"Minimum relative duration must not be greater than 1.");
+		if (maximum < 1) Melder_throw (U"Maximum relative duration must not be less than 1.");
+		if (minimum >= maximum) Melder_throw (U"Maximum relative duration must be greater than minimum.");
 		if (NUMdefined (minimumValue) && minimum > minimumValue)
-			Melder_throw ("Minimum relative duration must not be greater than the minimum value present, "
-				"which is ", Melder_half (minimumValue), ".");
+			Melder_throw (U"Minimum relative duration must not be greater than the minimum value present, "
+				U"which is ", Melder_half (minimumValue), U".");
 		if (NUMdefined (maximumValue) && maximum < maximumValue)
-			Melder_throw ("Maximum relative duration must not be less than the maximum value present, "
-				"which is ", Melder_half (maximumValue), ".");
+			Melder_throw (U"Maximum relative duration must not be less than the maximum value present, "
+				U"which is ", Melder_half (maximumValue), U".");
 		my pref_duration_minimum () = my p_duration_minimum = minimum;
 		my pref_duration_maximum () = my p_duration_maximum = maximum;
 		FunctionEditor_redraw (me);
@@ -481,12 +468,12 @@ static void menu_cb_setDurationRange (EDITOR_ARGS) {
 
 static void menu_cb_setDraggingStrategy (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Set dragging strategy", L"ManipulationEditor")
-		RADIO_ENUM (L"Dragging strategy", kManipulationEditor_draggingStrategy, my default_pitch_draggingStrategy ())
+	EDITOR_FORM (U"Set dragging strategy", U"ManipulationEditor")
+		RADIO_ENUM (U"Dragging strategy", kManipulationEditor_draggingStrategy, my default_pitch_draggingStrategy ())
 	EDITOR_OK
-		SET_INTEGER (L"Dragging strategy", my p_pitch_draggingStrategy)
+		SET_INTEGER (U"Dragging strategy", my p_pitch_draggingStrategy)
 	EDITOR_DO
-		my pref_pitch_draggingStrategy () = my p_pitch_draggingStrategy = GET_ENUM (kManipulationEditor_draggingStrategy, L"Dragging strategy");
+		my pref_pitch_draggingStrategy () = my p_pitch_draggingStrategy = GET_ENUM (kManipulationEditor_draggingStrategy, U"Dragging strategy");
 	EDITOR_END
 }
 
@@ -494,62 +481,61 @@ static void menu_cb_removeDurationPoints (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> duration) return;
-	Editor_save (me, L"Remove duration point(s)");
+	Editor_save (me, U"Remove duration point(s)");
 	if (my d_startSelection == my d_endSelection)
-		AnyTier_removePointNear (ana -> duration, 0.5 * (my d_startSelection + my d_endSelection));
+		AnyTier_removePointNear (ana -> duration.get(), 0.5 * (my d_startSelection + my d_endSelection));
 	else
-		AnyTier_removePointsBetween (ana -> duration, my d_startSelection, my d_endSelection);
+		AnyTier_removePointsBetween (ana -> duration.get(), my d_startSelection, my d_endSelection);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addDurationPointAtCursor (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
 	if (! ana -> duration) return;
-	Editor_save (me, L"Add duration point");
-	RealTier_addPoint (ana -> duration, 0.5 * (my d_startSelection + my d_endSelection), my duration.cursor);
+	Editor_save (me, U"Add duration point");
+	RealTier_addPoint (ana -> duration.get(), 0.5 * (my d_startSelection + my d_endSelection), my duration.cursor);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addDurationPointAt (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
-	EDITOR_FORM (L"Add duration point", 0)
-		REAL (L"Time (s)", L"0.0");
-		REAL (L"Relative duration", L"1.0");
+	EDITOR_FORM (U"Add duration point", 0)
+		REAL (U"Time (s)", U"0.0");
+		REAL (U"Relative duration", U"1.0");
 	EDITOR_OK
-		SET_REAL (L"Time", 0.5 * (my d_startSelection + my d_endSelection))
+		SET_REAL (U"Time", 0.5 * (my d_startSelection + my d_endSelection))
 	EDITOR_DO
 		Manipulation ana = (Manipulation) my data;
 		if (! ana -> duration) return;
-		Editor_save (me, L"Add duration point");
-		RealTier_addPoint (ana -> duration, GET_REAL (L"Time"), GET_REAL (L"Relative duration"));
+		Editor_save (me, U"Add duration point");
+		RealTier_addPoint (ana -> duration.get(), GET_REAL (U"Time"), GET_REAL (U"Relative duration"));
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_newDuration (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
-	Editor_save (me, L"New duration");
-	forget (ana -> duration);
+	Editor_save (me, U"New duration");
 	ana -> duration = DurationTier_create (ana -> xmin, ana -> xmax);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_forgetDuration (EDITOR_ARGS) {
 	EDITOR_IAM (ManipulationEditor);
 	Manipulation ana = (Manipulation) my data;
-	forget (ana -> duration);
+	ana -> duration = nullptr;
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 	
-static void menu_cb_ManipulationEditorHelp (EDITOR_ARGS) { EDITOR_IAM (ManipulationEditor); Melder_help (L"ManipulationEditor"); }
-static void menu_cb_ManipulationHelp (EDITOR_ARGS) { EDITOR_IAM (ManipulationEditor); Melder_help (L"Manipulation"); }
+static void menu_cb_ManipulationEditorHelp (EDITOR_ARGS) { EDITOR_IAM (ManipulationEditor); Melder_help (U"ManipulationEditor"); }
+static void menu_cb_ManipulationHelp (EDITOR_ARGS) { EDITOR_IAM (ManipulationEditor); Melder_help (U"Manipulation"); }
 
 #define menu_cb_Synth_common(menu_cb,meth) \
 static void menu_cb (EDITOR_ARGS) { \
@@ -571,76 +557,76 @@ menu_cb_Synth_common (menu_cb_Synth_Pitch_Lpc, Manipulation_PITCH_LPC)
 void structManipulationEditor :: v_createMenus () {
 	ManipulationEditor_Parent :: v_createMenus ();
 
-	Editor_addCommand (this, L"File", L"Extract original sound", 0, menu_cb_extractOriginalSound);
-	Editor_addCommand (this, L"File", L"Extract pulses", 0, menu_cb_extractPulses);
-	Editor_addCommand (this, L"File", L"Extract pitch tier", 0, menu_cb_extractPitchTier);
-	Editor_addCommand (this, L"File", L"Extract duration tier", 0, menu_cb_extractDurationTier);
-	Editor_addCommand (this, L"File", L"Publish resynthesis", 0, menu_cb_extractManipulatedSound);
-	Editor_addCommand (this, L"File", L"-- close --", 0, NULL);
-
-	Editor_addMenu (this, L"Pulse", 0);
-	Editor_addCommand (this, L"Pulse", L"Add pulse at cursor", 'P', menu_cb_addPulseAtCursor);
-	Editor_addCommand (this, L"Pulse", L"Add pulse at...", 0, menu_cb_addPulseAt);
-	Editor_addCommand (this, L"Pulse", L"-- remove pulses --", 0, NULL);
-	Editor_addCommand (this, L"Pulse", L"Remove pulse(s)", GuiMenu_OPTION + 'P', menu_cb_removePulses);
-
-	Editor_addMenu (this, L"Pitch", 0);
-	Editor_addCommand (this, L"Pitch", L"Add pitch point at cursor", 'T', menu_cb_addPitchPointAtCursor);
-	Editor_addCommand (this, L"Pitch", L"Add pitch point at time slice", 0, menu_cb_addPitchPointAtSlice);
-	Editor_addCommand (this, L"Pitch", L"Add pitch point at...", 0, menu_cb_addPitchPointAt);
-	Editor_addCommand (this, L"Pitch", L"-- remove pitch --", 0, NULL);
-	Editor_addCommand (this, L"Pitch", L"Remove pitch point(s)", GuiMenu_OPTION + 'T', menu_cb_removePitchPoints);
-	Editor_addCommand (this, L"Pitch", L"-- pitch prefs --", 0, NULL);
-	Editor_addCommand (this, L"Pitch", L"Set pitch range...", 0, menu_cb_setPitchRange);
-	Editor_addCommand (this, L"Pitch", L"Set pitch units...", 0, menu_cb_setPitchUnits);
-	Editor_addCommand (this, L"Pitch", L"Set pitch dragging strategy...", 0, menu_cb_setDraggingStrategy);
-	Editor_addCommand (this, L"Pitch", L"-- modify pitch --", 0, NULL);
-	Editor_addCommand (this, L"Pitch", L"Shift pitch frequencies...", 0, menu_cb_shiftPitchFrequencies);
-	Editor_addCommand (this, L"Pitch", L"Multiply pitch frequencies...", 0, menu_cb_multiplyPitchFrequencies);
-	Editor_addCommand (this, L"Pitch", L"All:", GuiMenu_INSENSITIVE, menu_cb_stylizePitch);
-	Editor_addCommand (this, L"Pitch", L"Stylize pitch...", 0, menu_cb_stylizePitch);
-	Editor_addCommand (this, L"Pitch", L"Stylize pitch (2 st)", '2', menu_cb_stylizePitch_2st);
-	Editor_addCommand (this, L"Pitch", L"Interpolate quadratically...", 0, menu_cb_interpolateQuadratically);
-	Editor_addCommand (this, L"Pitch", L"Interpolate quadratically (4 pts)", '4', menu_cb_interpolateQuadratically_4pts);
-
-	Editor_addMenu (this, L"Dur", 0);
-	Editor_addCommand (this, L"Dur", L"Add duration point at cursor", 'D', menu_cb_addDurationPointAtCursor);
-	Editor_addCommand (this, L"Dur", L"Add duration point at...", 0, menu_cb_addDurationPointAt);
-	Editor_addCommand (this, L"Dur", L"-- remove duration --", 0, NULL);
-	Editor_addCommand (this, L"Dur", L"Remove duration point(s)", GuiMenu_OPTION + 'D', menu_cb_removeDurationPoints);
-	Editor_addCommand (this, L"Dur", L"-- duration prefs --", 0, NULL);
-	Editor_addCommand (this, L"Dur", L"Set duration range...", 0, menu_cb_setDurationRange);
-	Editor_addCommand (this, L"Dur", L"-- refresh duration --", 0, NULL);
-	Editor_addCommand (this, L"Dur", L"New duration", 0, menu_cb_newDuration);
-	Editor_addCommand (this, L"Dur", L"Forget duration", 0, menu_cb_forgetDuration);
-
-	Editor_addMenu (this, L"Synth", 0);
-	our synthPulsesButton = Editor_addCommand (this, L"Synth", L"Pulses --", GuiMenu_RADIO_FIRST, menu_cb_Synth_Pulses);
-	our synthPulsesHumButton = Editor_addCommand (this, L"Synth", L"Pulses (hum) --", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pulses_hum);
-
-	our synthPulsesLpcButton = Editor_addCommand (this, L"Synth", L"Pulses & LPC -- (\"LPC resynthesis\")", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pulses_Lpc);
-	Editor_addCommand (this, L"Synth", L"-- pitch resynth --", 0, NULL);
-	our synthPitchButton = Editor_addCommand (this, L"Synth", L" -- Pitch", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pitch);
-	our synthPitchHumButton = Editor_addCommand (this, L"Synth", L" -- Pitch (hum)", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pitch_hum);
-	our synthPulsesPitchButton = Editor_addCommand (this, L"Synth", L"Pulses -- Pitch", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pulses_Pitch);
-	our synthPulsesPitchHumButton = Editor_addCommand (this, L"Synth", L"Pulses -- Pitch (hum)", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pulses_Pitch_hum);
-	Editor_addCommand (this, L"Synth", L"-- full resynth --", 0, NULL);
-	our synthOverlapAddButton = Editor_addCommand (this, L"Synth", L"Sound & Pulses -- Pitch & Duration  (\"Overlap-add manipulation\")", GuiMenu_RADIO_NEXT | GuiMenu_TOGGLE_ON, menu_cb_Synth_OverlapAdd);
-	our synthPitchLpcButton = Editor_addCommand (this, L"Synth", L"LPC -- Pitch  (\"LPC pitch manipulation\")", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pitch_Lpc);
+	Editor_addCommand (this, U"File", U"Extract original sound", 0, menu_cb_extractOriginalSound);
+	Editor_addCommand (this, U"File", U"Extract pulses", 0, menu_cb_extractPulses);
+	Editor_addCommand (this, U"File", U"Extract pitch tier", 0, menu_cb_extractPitchTier);
+	Editor_addCommand (this, U"File", U"Extract duration tier", 0, menu_cb_extractDurationTier);
+	Editor_addCommand (this, U"File", U"Publish resynthesis", 0, menu_cb_extractManipulatedSound);
+	Editor_addCommand (this, U"File", U"-- close --", 0, nullptr);
+
+	Editor_addMenu (this, U"Pulse", 0);
+	Editor_addCommand (this, U"Pulse", U"Add pulse at cursor", 'P', menu_cb_addPulseAtCursor);
+	Editor_addCommand (this, U"Pulse", U"Add pulse at...", 0, menu_cb_addPulseAt);
+	Editor_addCommand (this, U"Pulse", U"-- remove pulses --", 0, nullptr);
+	Editor_addCommand (this, U"Pulse", U"Remove pulse(s)", GuiMenu_OPTION + 'P', menu_cb_removePulses);
+
+	Editor_addMenu (this, U"Pitch", 0);
+	Editor_addCommand (this, U"Pitch", U"Add pitch point at cursor", 'T', menu_cb_addPitchPointAtCursor);
+	Editor_addCommand (this, U"Pitch", U"Add pitch point at time slice", 0, menu_cb_addPitchPointAtSlice);
+	Editor_addCommand (this, U"Pitch", U"Add pitch point at...", 0, menu_cb_addPitchPointAt);
+	Editor_addCommand (this, U"Pitch", U"-- remove pitch --", 0, nullptr);
+	Editor_addCommand (this, U"Pitch", U"Remove pitch point(s)", GuiMenu_OPTION + 'T', menu_cb_removePitchPoints);
+	Editor_addCommand (this, U"Pitch", U"-- pitch prefs --", 0, nullptr);
+	Editor_addCommand (this, U"Pitch", U"Set pitch range...", 0, menu_cb_setPitchRange);
+	Editor_addCommand (this, U"Pitch", U"Set pitch units...", 0, menu_cb_setPitchUnits);
+	Editor_addCommand (this, U"Pitch", U"Set pitch dragging strategy...", 0, menu_cb_setDraggingStrategy);
+	Editor_addCommand (this, U"Pitch", U"-- modify pitch --", 0, nullptr);
+	Editor_addCommand (this, U"Pitch", U"Shift pitch frequencies...", 0, menu_cb_shiftPitchFrequencies);
+	Editor_addCommand (this, U"Pitch", U"Multiply pitch frequencies...", 0, menu_cb_multiplyPitchFrequencies);
+	Editor_addCommand (this, U"Pitch", U"All:", GuiMenu_INSENSITIVE, menu_cb_stylizePitch);
+	Editor_addCommand (this, U"Pitch", U"Stylize pitch...", 0, menu_cb_stylizePitch);
+	Editor_addCommand (this, U"Pitch", U"Stylize pitch (2 st)", '2', menu_cb_stylizePitch_2st);
+	Editor_addCommand (this, U"Pitch", U"Interpolate quadratically...", 0, menu_cb_interpolateQuadratically);
+	Editor_addCommand (this, U"Pitch", U"Interpolate quadratically (4 pts)", '4', menu_cb_interpolateQuadratically_4pts);
+
+	Editor_addMenu (this, U"Dur", 0);
+	Editor_addCommand (this, U"Dur", U"Add duration point at cursor", 'D', menu_cb_addDurationPointAtCursor);
+	Editor_addCommand (this, U"Dur", U"Add duration point at...", 0, menu_cb_addDurationPointAt);
+	Editor_addCommand (this, U"Dur", U"-- remove duration --", 0, nullptr);
+	Editor_addCommand (this, U"Dur", U"Remove duration point(s)", GuiMenu_OPTION + 'D', menu_cb_removeDurationPoints);
+	Editor_addCommand (this, U"Dur", U"-- duration prefs --", 0, nullptr);
+	Editor_addCommand (this, U"Dur", U"Set duration range...", 0, menu_cb_setDurationRange);
+	Editor_addCommand (this, U"Dur", U"-- refresh duration --", 0, nullptr);
+	Editor_addCommand (this, U"Dur", U"New duration", 0, menu_cb_newDuration);
+	Editor_addCommand (this, U"Dur", U"Forget duration", 0, menu_cb_forgetDuration);
+
+	Editor_addMenu (this, U"Synth", 0);
+	our synthPulsesButton = Editor_addCommand (this, U"Synth", U"Pulses --", GuiMenu_RADIO_FIRST, menu_cb_Synth_Pulses);
+	our synthPulsesHumButton = Editor_addCommand (this, U"Synth", U"Pulses (hum) --", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pulses_hum);
+
+	our synthPulsesLpcButton = Editor_addCommand (this, U"Synth", U"Pulses & LPC -- (\"LPC resynthesis\")", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pulses_Lpc);
+	Editor_addCommand (this, U"Synth", U"-- pitch resynth --", 0, nullptr);
+	our synthPitchButton = Editor_addCommand (this, U"Synth", U" -- Pitch", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pitch);
+	our synthPitchHumButton = Editor_addCommand (this, U"Synth", U" -- Pitch (hum)", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pitch_hum);
+	our synthPulsesPitchButton = Editor_addCommand (this, U"Synth", U"Pulses -- Pitch", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pulses_Pitch);
+	our synthPulsesPitchHumButton = Editor_addCommand (this, U"Synth", U"Pulses -- Pitch (hum)", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pulses_Pitch_hum);
+	Editor_addCommand (this, U"Synth", U"-- full resynth --", 0, nullptr);
+	our synthOverlapAddButton = Editor_addCommand (this, U"Synth", U"Sound & Pulses -- Pitch & Duration  (\"Overlap-add manipulation\")", GuiMenu_RADIO_NEXT | GuiMenu_TOGGLE_ON, menu_cb_Synth_OverlapAdd);
+	our synthPitchLpcButton = Editor_addCommand (this, U"Synth", U"LPC -- Pitch  (\"LPC pitch manipulation\")", GuiMenu_RADIO_NEXT, menu_cb_Synth_Pitch_Lpc);
 }
 
 void structManipulationEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	ManipulationEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"ManipulationEditor help", '?', menu_cb_ManipulationEditorHelp);
-	EditorMenu_addCommand (menu, L"Manipulation help", 0, menu_cb_ManipulationHelp);
+	EditorMenu_addCommand (menu, U"ManipulationEditor help", '?', menu_cb_ManipulationEditorHelp);
+	EditorMenu_addCommand (menu, U"Manipulation help", 0, menu_cb_ManipulationHelp);
 }
 
 /********** DRAWING AREA **********/
 
 static void drawSoundArea (ManipulationEditor me, double ymin, double ymax) {
 	Manipulation ana = (Manipulation) my data;
-	Sound sound = ana -> sound;
-	PointProcess pulses = ana -> pulses;
+	Sound sound = ana -> sound.get();
+	PointProcess pulses = ana -> pulses.get();
 	long first, last, i;
 	Graphics_Viewport viewport = Graphics_insetViewport (my d_graphics, 0, 1, ymin, ymax);
 	Graphics_setWindow (my d_graphics, 0, 1, 0, 1);
@@ -650,9 +636,9 @@ static void drawSoundArea (ManipulationEditor me, double ymin, double ymax) {
 	Graphics_rectangle (my d_graphics, 0, 1, 0, 1);
 	Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_TOP);
 	Graphics_setFont (my d_graphics, kGraphics_font_TIMES);
-	Graphics_text (my d_graphics, 1, 1, L"%%Sound");
+	Graphics_text (my d_graphics, 1, 1, U"%%Sound");
 	Graphics_setColour (my d_graphics, Graphics_BLUE);
-	Graphics_text (my d_graphics, 1, 1 - Graphics_dyMMtoWC (my d_graphics, 3), L"%%Pulses");
+	Graphics_text (my d_graphics, 1, 1 - Graphics_dyMMtoWC (my d_graphics, 3), U"%%Pulses");
 	Graphics_setFont (my d_graphics, kGraphics_font_HELVETICA);
 
 	/*
@@ -682,8 +668,8 @@ static void drawSoundArea (ManipulationEditor me, double ymin, double ymax) {
 		scaleMin = 0.83 * minimum + 0.17 * my soundmin;
 		scaleMax = 0.83 * maximum + 0.17 * my soundmax;
 		Graphics_setWindow (my d_graphics, my d_startWindow, my d_endWindow, scaleMin, scaleMax);
-		FunctionEditor_drawRangeMark (me, scaleMin, Melder_float (Melder_half (scaleMin)), L"", Graphics_BOTTOM);
-		FunctionEditor_drawRangeMark (me, scaleMax, Melder_float (Melder_half (scaleMax)), L"", Graphics_TOP);
+		FunctionEditor_drawRangeMark (me, scaleMin, Melder_float (Melder_half (scaleMin)), U"", Graphics_BOTTOM);
+		FunctionEditor_drawRangeMark (me, scaleMax, Melder_float (Melder_half (scaleMax)), U"", Graphics_TOP);
 
 		/*
 		 * Draw dotted zero line.
@@ -708,13 +694,13 @@ static void drawSoundArea (ManipulationEditor me, double ymin, double ymax) {
 
 static void drawPitchArea (ManipulationEditor me, double ymin, double ymax) {
 	Manipulation ana = (Manipulation) my data;
-	PointProcess pulses = ana -> pulses;
-	PitchTier pitch = ana -> pitch;
+	PointProcess pulses = ana -> pulses.get();
+	PitchTier pitch = ana -> pitch.get();
 	long ifirstSelected, ilastSelected, n = pitch ? pitch -> points -> size : 0, imin, imax, i;
 	int cursorVisible = my d_startSelection == my d_endSelection && my d_startSelection >= my d_startWindow && my d_startSelection <= my d_endWindow;
 	double minimumFrequency = YLIN (50);
 	int rangePrecisions [] = { 0, 1, 2 };
-	const wchar_t *rangeUnits [] = { L"", L" Hz", L" st" };
+	const char32 *rangeUnits [] = { U"", U" Hz", U" st" };
 
 	/*
 	 * Pitch contours.
@@ -728,9 +714,9 @@ static void drawPitchArea (ManipulationEditor me, double ymin, double ymax) {
 	Graphics_setColour (my d_graphics, Graphics_GREEN);
 	Graphics_setFont (my d_graphics, kGraphics_font_TIMES);
 	Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_TOP);
-	Graphics_text (my d_graphics, 1, 1, L"%%Pitch manip");
+	Graphics_text (my d_graphics, 1, 1, U"%%Pitch manip");
 	Graphics_setGrey (my d_graphics, 0.7);
-	Graphics_text (my d_graphics, 1, 1 - Graphics_dyMMtoWC (my d_graphics, 3), L"%%Pitch from pulses");
+	Graphics_text (my d_graphics, 1, 1 - Graphics_dyMMtoWC (my d_graphics, 3), U"%%Pitch from pulses");
 	Graphics_setFont (my d_graphics, kGraphics_font_HELVETICA);
 
 	Graphics_setWindow (my d_graphics, my d_startWindow, my d_endWindow, my p_pitch_minimum, my p_pitch_maximum);
@@ -776,7 +762,7 @@ static void drawPitchArea (ManipulationEditor me, double ymin, double ymax) {
 	if (n == 0) {
 		Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_HALF);
 		Graphics_setColour (my d_graphics, Graphics_BLACK);
-		Graphics_text (my d_graphics, 0.5 * (my d_startWindow + my d_endWindow), 0.5 * (my p_pitch_minimum + my p_pitch_maximum), L"(no pitch points)");
+		Graphics_text (my d_graphics, 0.5 * (my d_startWindow + my d_endWindow), 0.5 * (my p_pitch_minimum + my p_pitch_maximum), U"(no pitch points)");
 	} else if (imax < imin) {
 		double fleft = YLIN (RealTier_getValueAtTime (pitch, my d_startWindow));
 		double fright = YLIN (RealTier_getValueAtTime (pitch, my d_endWindow));
@@ -818,7 +804,7 @@ static void drawPitchArea (ManipulationEditor me, double ymin, double ymax) {
 
 static void drawDurationArea (ManipulationEditor me, double ymin, double ymax) {
 	Manipulation ana = (Manipulation) my data;
-	DurationTier duration = ana -> duration;
+	DurationTier duration = ana -> duration.get();
 	long ifirstSelected, ilastSelected, n = duration ? duration -> points -> size : 0, imin, imax, i;
 	int cursorVisible = my d_startSelection == my d_endSelection && my d_startSelection >= my d_startWindow && my d_startSelection <= my d_endWindow;
 
@@ -834,18 +820,18 @@ static void drawDurationArea (ManipulationEditor me, double ymin, double ymax) {
 	Graphics_setColour (my d_graphics, Graphics_GREEN);
 	Graphics_setFont (my d_graphics, kGraphics_font_TIMES);
 	Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_TOP);
-	Graphics_text (my d_graphics, 1, 1, L"%%Duration manip");
+	Graphics_text (my d_graphics, 1, 1, U"%%Duration manip");
 	Graphics_setFont (my d_graphics, kGraphics_font_HELVETICA);
 
 	Graphics_setWindow (my d_graphics, my d_startWindow, my d_endWindow, my p_duration_minimum, my p_duration_maximum);
 	FunctionEditor_drawGridLine (me, 1.0);
-	FunctionEditor_drawRangeMark (me, my p_duration_maximum, Melder_fixed (my p_duration_maximum, 3), L"", Graphics_TOP);
-	FunctionEditor_drawRangeMark (me, my p_duration_minimum, Melder_fixed (my p_duration_minimum, 3), L"", Graphics_BOTTOM);
+	FunctionEditor_drawRangeMark (me, my p_duration_maximum, Melder_fixed (my p_duration_maximum, 3), U"", Graphics_TOP);
+	FunctionEditor_drawRangeMark (me, my p_duration_minimum, Melder_fixed (my p_duration_minimum, 3), U"", Graphics_BOTTOM);
 	if (my d_startSelection == my d_endSelection && my duration.cursor >= my p_duration_minimum && my duration.cursor <= my p_duration_maximum)
-		FunctionEditor_drawHorizontalHair (me, my duration.cursor, Melder_fixed (my duration.cursor, 3), L"");
+		FunctionEditor_drawHorizontalHair (me, my duration.cursor, Melder_fixed (my duration.cursor, 3), U"");
 	if (cursorVisible && n > 0) {
 		double y = RealTier_getValueAtTime (duration, my d_startSelection);
-		FunctionEditor_insertCursorFunctionValue (me, y, Melder_fixed (y, 3), L"", my p_duration_minimum, my p_duration_maximum);
+		FunctionEditor_insertCursorFunctionValue (me, y, Melder_fixed (y, 3), U"", my p_duration_minimum, my p_duration_maximum);
 	}
 
 	/*
@@ -862,7 +848,7 @@ static void drawDurationArea (ManipulationEditor me, double ymin, double ymax) {
 		Graphics_setColour (my d_graphics, Graphics_BLACK);
 		Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_HALF);
 		Graphics_text (my d_graphics, 0.5 * (my d_startWindow + my d_endWindow),
-			0.5 * (my p_duration_minimum + my p_duration_maximum), L"(no duration points)");
+			0.5 * (my p_duration_minimum + my p_duration_maximum), U"(no duration points)");
 	} else if (imax < imin) {
 		double fleft = RealTier_getValueAtTime (duration, my d_startWindow);
 		double fright = RealTier_getValueAtTime (duration, my d_endWindow);
@@ -931,7 +917,7 @@ void structManipulationEditor :: v_draw () {
 
 static void drawWhileDragging (ManipulationEditor me, double xWC, double yWC, long first, long last, double dt, double df) {
 	Manipulation ana = (Manipulation) my data;
-	PitchTier pitch = ana -> pitch;
+	PitchTier pitch = ana -> pitch.get();
 	(void) xWC;
 	(void) yWC;
 
@@ -939,7 +925,7 @@ static void drawWhileDragging (ManipulationEditor me, double xWC, double yWC, lo
 	 * Draw all selected pitch points as magenta empty circles, if inside the window.
 	 */
 	for (long i = first; i <= last; i ++) {
-		RealPoint point = (RealPoint) pitch -> points -> item [i];
+		RealPoint point = pitch -> point (i);
 		double t = point -> number + dt, f = YLIN (point -> value) + df;
 		if (t >= my d_startWindow && t <= my d_endWindow)
 			Graphics_circle_mm (my d_graphics, t,
@@ -950,20 +936,20 @@ static void drawWhileDragging (ManipulationEditor me, double xWC, double yWC, lo
 		/*
 		 * Draw a crosshair with time and frequency.
 		 */
-		RealPoint point = (RealPoint) pitch -> points -> item [first];
+		RealPoint point = pitch -> point (first);
 		double t = point -> number + dt, fWC = YLIN (point -> value) + df;
 		Graphics_line (my d_graphics, t, my p_pitch_minimum, t, my p_pitch_maximum - Graphics_dyMMtoWC (my d_graphics, 4.0));
 		Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_TOP);
-		Graphics_text1 (my d_graphics, t, my p_pitch_maximum, Melder_fixed (t, 6));
+		Graphics_text (my d_graphics, t, my p_pitch_maximum, Melder_fixed (t, 6));
 		Graphics_line (my d_graphics, my d_startWindow, fWC, my d_endWindow, fWC);
 		Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_BOTTOM);
-		Graphics_text1 (my d_graphics, my d_startWindow, fWC, Melder_fixed (fWC, 5));
+		Graphics_text (my d_graphics, my d_startWindow, fWC, Melder_fixed (fWC, 5));
 	}
 }
 
 static int clickPitch (ManipulationEditor me, double xWC, double yWC, bool shiftKeyPressed) {
 	Manipulation ana = (Manipulation) my data;
-	PitchTier pitch = ana -> pitch;
+	PitchTier pitch = ana -> pitch.get();
 	long inearestPoint, ifirstSelected, ilastSelected, i;
 	RealPoint nearestPoint;
 	double dt = 0, df = 0;
@@ -999,10 +985,10 @@ static int clickPitch (ManipulationEditor me, double xWC, double yWC, bool shift
 	if (draggingSelection) {
 		ifirstSelected = AnyTier_timeToHighIndex (pitch, my d_startSelection);
 		ilastSelected = AnyTier_timeToLowIndex (pitch, my d_endSelection);
-		Editor_save (me, L"Drag pitch points");
+		Editor_save (me, U"Drag pitch points");
 	} else {
 		ifirstSelected = ilastSelected = inearestPoint;
-		Editor_save (me, L"Drag pitch point");
+		Editor_save (me, U"Drag pitch point");
 	}
 
 	/*
@@ -1073,13 +1059,13 @@ static int clickPitch (ManipulationEditor me, double xWC, double yWC, bool shift
 		my pitchTier.cursor = YLIN (point -> value);
 	}
 
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 	return 1;   /* Update needed. */
 }
 
 static void drawDurationWhileDragging (ManipulationEditor me, double xWC, double yWC, long first, long last, double dt, double df) {
 	Manipulation ana = (Manipulation) my data;
-	DurationTier duration = ana -> duration;
+	DurationTier duration = ana -> duration.get();
 	long i;
 	(void) xWC;
 	(void) yWC;
@@ -1103,16 +1089,16 @@ static void drawDurationWhileDragging (ManipulationEditor me, double xWC, double
 		double t = point -> number + dt, durWC = point -> value + df;
 		Graphics_line (my d_graphics, t, my p_duration_minimum, t, my p_duration_maximum - Graphics_dyMMtoWC (my d_graphics, 4.0));
 		Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_TOP);
-		Graphics_text1 (my d_graphics, t, my p_duration_maximum, Melder_fixed (t, 6));
+		Graphics_text (my d_graphics, t, my p_duration_maximum, Melder_fixed (t, 6));
 		Graphics_line (my d_graphics, my d_startWindow, durWC, my d_endWindow, durWC);
 		Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_BOTTOM);
-		Graphics_text1 (my d_graphics, my d_startWindow, durWC, Melder_fixed (durWC, 2));
+		Graphics_text (my d_graphics, my d_startWindow, durWC, Melder_fixed (durWC, 2));
 	}
 }
 
 static int clickDuration (ManipulationEditor me, double xWC, double yWC, int shiftKeyPressed) {
 	Manipulation ana = (Manipulation) my data;
-	DurationTier duration = ana -> duration;
+	DurationTier duration = ana -> duration.get();
 	long inearestPoint, ifirstSelected, ilastSelected, i;
 	RealPoint nearestPoint;
 	double dt = 0, df = 0;
@@ -1156,10 +1142,10 @@ static int clickDuration (ManipulationEditor me, double xWC, double yWC, int shi
 	if (draggingSelection) {
 		ifirstSelected = AnyTier_timeToHighIndex (duration, my d_startSelection);
 		ilastSelected = AnyTier_timeToLowIndex (duration, my d_endSelection);
-		Editor_save (me, L"Drag duration points");
+		Editor_save (me, U"Drag duration points");
 	} else {
 		ifirstSelected = ilastSelected = inearestPoint;
-		Editor_save (me, L"Drag duration point");
+		Editor_save (me, U"Drag duration point");
 	}
 
 	/*
@@ -1221,7 +1207,7 @@ static int clickDuration (ManipulationEditor me, double xWC, double yWC, int shi
 		my duration.cursor = point -> value;
 	}
 
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 	return 1;   /* Update needed. */
 }
 
@@ -1250,18 +1236,18 @@ void structManipulationEditor :: v_play (double a_tmin, double a_tmax) {
 	Manipulation ana = (Manipulation) our data;
 	if (our shiftKeyPressed) {
 		if (ana -> sound)
-			Sound_playPart (ana -> sound, a_tmin, a_tmax, theFunctionEditor_playCallback, this);
+			Sound_playPart (ana -> sound.get(), a_tmin, a_tmax, theFunctionEditor_playCallback, this);
 	} else {
 		Manipulation_playPart (ana, a_tmin, a_tmax, our synthesisMethod);
 	}
 }
 
-ManipulationEditor ManipulationEditor_create (const wchar_t *title, Manipulation ana) {
+autoManipulationEditor ManipulationEditor_create (const char32 *title, Manipulation ana) {
 	try {
 		autoManipulationEditor me = Thing_new (ManipulationEditor);
 		FunctionEditor_init (me.peek(), title, ana);
 
-		double maximumPitchValue = RealTier_getMaximumValue (ana -> pitch);
+		double maximumPitchValue = RealTier_getMaximumValue (ana -> pitch.get());
 		if (my p_pitch_units == kManipulationEditor_pitchUnits_HERTZ) {
 			my p_pitch_minimum = 25.0;
 			my pitchTier.minPeriodic = 50.0;
@@ -1278,13 +1264,13 @@ ManipulationEditor ManipulationEditor_create (const wchar_t *title, Manipulation
 		if (my p_pitch_maximum == NUMundefined || my p_pitch_maximum < my pref_pitch_maximum ())
 			my p_pitch_maximum = my pref_pitch_maximum ();
 
-		double minimumDurationValue = ana -> duration ? RealTier_getMinimumValue (ana -> duration) : NUMundefined;
+		double minimumDurationValue = ana -> duration ? RealTier_getMinimumValue (ana -> duration.get()) : NUMundefined;
 		my p_duration_minimum = NUMdefined (minimumDurationValue) ? minimumDurationValue : 1.0;
 		if (my pref_duration_minimum () > 1)
 			my pref_duration_minimum () = Melder_atof (my default_duration_minimum ());
 		if (my p_duration_minimum > my pref_duration_minimum ())
 			my p_duration_minimum = my pref_duration_minimum ();
-		double maximumDurationValue = ana -> duration ? RealTier_getMaximumValue (ana -> duration) : NUMundefined;
+		double maximumDurationValue = ana -> duration ? RealTier_getMaximumValue (ana -> duration.get()) : NUMundefined;
 		my p_duration_maximum = NUMdefined (maximumDurationValue) ? maximumDurationValue : 1.0;
 		if (my pref_duration_maximum () < 1)
 			my pref_duration_maximum () = Melder_atof (my default_duration_maximum ());
@@ -1298,12 +1284,12 @@ ManipulationEditor ManipulationEditor_create (const wchar_t *title, Manipulation
 
 		my synthesisMethod = prefs_synthesisMethod;
 		if (ana -> sound)
-			Matrix_getWindowExtrema (ana -> sound, 0, 0, 0, 0, & my soundmin, & my soundmax);
+			Matrix_getWindowExtrema (ana -> sound.get(), 0, 0, 0, 0, & my soundmin, & my soundmax);
 		if (my soundmin == my soundmax) my soundmin = -1.0, my soundmax = +1.0;
 		updateMenus (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Manipulation window not created.");
+		Melder_throw (U"Manipulation window not created.");
 	}
 }
 
diff --git a/fon/ManipulationEditor.h b/fon/ManipulationEditor.h
index ef290ba..e5e2a05 100644
--- a/fon/ManipulationEditor.h
+++ b/fon/ManipulationEditor.h
@@ -2,7 +2,7 @@
 #define _ManipulationEditor_h_
 /* ManipulationEditor.h
  *
- * Copyright (C) 1992-2011,2012,2013 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,36 +25,40 @@
 #include "ManipulationEditor_enums.h"
 
 Thing_define (ManipulationEditor, FunctionEditor) {
-	// new data:
-	public:
-		PointProcess previousPulses;
-		PitchTier previousPitch;
-		DurationTier previousDuration;
-		double soundmin, soundmax;
-		int synthesisMethod;
-		GuiMenuItem synthPulsesButton, synthPulsesHumButton;
-		GuiMenuItem synthPulsesLpcButton;
-		GuiMenuItem synthPitchButton, synthPitchHumButton;
-		GuiMenuItem synthPulsesPitchButton, synthPulsesPitchHumButton;
-		GuiMenuItem synthOverlapAddNodurButton, synthOverlapAddButton;
-		GuiMenuItem synthPitchLpcButton;
-		struct { double minPeriodic, cursor; } pitchTier;
-		struct { double cursor;  } duration;
-		Graphics_Viewport inset;
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_saveData ();
-		virtual void v_restoreData ();
-		virtual void v_draw ();
-		virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
-		virtual void v_play (double tmin, double tmax);
-	// preferences:
-		#include "ManipulationEditor_prefs.h"
+	autoPointProcess previousPulses;
+	autoPitchTier previousPitch;
+	autoDurationTier previousDuration;
+	double soundmin, soundmax;
+	int synthesisMethod;
+	GuiMenuItem synthPulsesButton, synthPulsesHumButton;
+	GuiMenuItem synthPulsesLpcButton;
+	GuiMenuItem synthPitchButton, synthPitchHumButton;
+	GuiMenuItem synthPulsesPitchButton, synthPulsesPitchHumButton;
+	GuiMenuItem synthOverlapAddNodurButton, synthOverlapAddButton;
+	GuiMenuItem synthPitchLpcButton;
+	struct { double minPeriodic, cursor; } pitchTier;
+	struct { double cursor;  } duration;
+	Graphics_Viewport inset;
+
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_saveData ()
+		override;
+	void v_restoreData ()
+		override;
+	void v_draw ()
+		override;
+	int v_click (double xWC, double yWC, bool shiftKeyPressed)
+		override;
+	void v_play (double tmin, double tmax)
+		override;
+
+	#include "ManipulationEditor_prefs.h"
 };
 
-ManipulationEditor ManipulationEditor_create (const wchar_t *title, Manipulation ana);
+autoManipulationEditor ManipulationEditor_create (const char32 *title, Manipulation ana);
 
 /* End of file ManipulationEditor.h */
 #endif
diff --git a/fon/ManipulationEditor_enums.h b/fon/ManipulationEditor_enums.h
index 21eef3d..737be41 100644
--- a/fon/ManipulationEditor_enums.h
+++ b/fon/ManipulationEditor_enums.h
@@ -1,6 +1,6 @@
 /* ManipulationEditor_enums.h
  *
- * Copyright (C) 1992-2007,2013 Paul Boersma
+ * Copyright (C) 1992-2007,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,15 +18,15 @@
  */
 
 enums_begin (kManipulationEditor_draggingStrategy, 1)
-	enums_add (kManipulationEditor_draggingStrategy, 1, ALL, L"all")
-	enums_add (kManipulationEditor_draggingStrategy, 2, HORIZONTAL, L"only horizontal")
-	enums_add (kManipulationEditor_draggingStrategy, 3, VERTICAL, L"only vertical")
-	enums_add (kManipulationEditor_draggingStrategy, 4, HYBRID, L"single all, multiple only vertical")
+	enums_add (kManipulationEditor_draggingStrategy, 1, ALL, U"all")
+	enums_add (kManipulationEditor_draggingStrategy, 2, HORIZONTAL, U"only horizontal")
+	enums_add (kManipulationEditor_draggingStrategy, 3, VERTICAL, U"only vertical")
+	enums_add (kManipulationEditor_draggingStrategy, 4, HYBRID, U"single all, multiple only vertical")
 enums_end (kManipulationEditor_draggingStrategy, 4, ALL)
 
 enums_begin (kManipulationEditor_pitchUnits, 1)
-	enums_add (kManipulationEditor_pitchUnits, 1, HERTZ, L"Hertz")
-	enums_add (kManipulationEditor_pitchUnits, 2, SEMITONES, L"semitones re 100 Hz")
+	enums_add (kManipulationEditor_pitchUnits, 1, HERTZ, U"Hertz")
+	enums_add (kManipulationEditor_pitchUnits, 2, SEMITONES, U"semitones re 100 Hz")
 enums_end (kManipulationEditor_pitchUnits, 2, HERTZ)
 
 /* End of file ManipulationEditor.h */
diff --git a/fon/ManipulationEditor_prefs.h b/fon/ManipulationEditor_prefs.h
index eae9da2..f9a7a8a 100644
--- a/fon/ManipulationEditor_prefs.h
+++ b/fon/ManipulationEditor_prefs.h
@@ -1,6 +1,6 @@
 /* ManipulationEditor_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,16 +18,17 @@
  */
 
 prefs_begin (ManipulationEditor)
-	// new:
-		prefs_add_double_with_data (ManipulationEditor, pitch_minimum,                                            1,  L"50.0")   // Hz
-		prefs_add_double_with_data (ManipulationEditor, pitch_maximum,                                            1, L"300.0")   // Hz
-		prefs_add_enum_with_data   (ManipulationEditor, pitch_units,            1, kManipulationEditor_pitchUnits,       DEFAULT)
-		prefs_add_enum_with_data   (ManipulationEditor, pitch_draggingStrategy, 1, kManipulationEditor_draggingStrategy, DEFAULT)
-		prefs_add_double_with_data (ManipulationEditor, pitch_stylize_frequencyResolution,                        1, L"2.0")
-		prefs_add_bool_with_data   (ManipulationEditor, pitch_stylize_useSemitones,                               1, true)
-		prefs_add_long_with_data   (ManipulationEditor, pitch_interpolateQuadratically_numberOfPointsPerParabola, 1, L"4")
-		prefs_add_double_with_data (ManipulationEditor, duration_minimum,                                         1, L"0.25")
-		prefs_add_double_with_data (ManipulationEditor, duration_maximum,                                         1, L"3.0")
+
+	prefs_add_double_with_data (ManipulationEditor, pitch_minimum,                                            1, U"50.0")   // Hz
+	prefs_add_double_with_data (ManipulationEditor, pitch_maximum,                                            1, U"300.0")   // Hz
+	prefs_add_enum_with_data   (ManipulationEditor, pitch_units,            1, kManipulationEditor_pitchUnits,       DEFAULT)
+	prefs_add_enum_with_data   (ManipulationEditor, pitch_draggingStrategy, 1, kManipulationEditor_draggingStrategy, DEFAULT)
+	prefs_add_double_with_data (ManipulationEditor, pitch_stylize_frequencyResolution,                        1, U"2.0")
+	prefs_add_bool_with_data   (ManipulationEditor, pitch_stylize_useSemitones,                               1, true)
+	prefs_add_long_with_data   (ManipulationEditor, pitch_interpolateQuadratically_numberOfPointsPerParabola, 1, U"4")
+	prefs_add_double_with_data (ManipulationEditor, duration_minimum,                                         1, U"0.25")
+	prefs_add_double_with_data (ManipulationEditor, duration_maximum,                                         1, U"3.0")
+
 prefs_end (ManipulationEditor)
 
 /* End of file ManipulationEditor_prefs.h */
diff --git a/fon/Manipulation_def.h b/fon/Manipulation_def.h
index f6b0561..7444e17 100644
--- a/fon/Manipulation_def.h
+++ b/fon/Manipulation_def.h
@@ -1,6 +1,6 @@
 /* Manipulation_def.h
  *
- * Copyright (C) 1992-2008 Paul Boersma
+ * Copyright (C) 1992-2008,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,23 +22,23 @@
 oo_DEFINE_CLASS (Manipulation, Function)
 
 	#if oo_READING
-		if (localVersion >= 5 || (Melder_debug == 25 && localVersion == 4)) {
-			oo_OBJECT (Sound, 2, sound)
+		if (formatVersion >= 5 || (Melder_debug == 25 && formatVersion == 4)) {
+			oo_AUTO_OBJECT (Sound, 2, sound)
 		} else {
-			oo_OBJECT (Sound, 0, sound)
+			oo_AUTO_OBJECT (Sound, 0, sound)
 		}
 	#else
-		oo_OBJECT (Sound, 0, sound)
+		oo_AUTO_OBJECT (Sound, 0, sound)
 	#endif
-	oo_OBJECT (PointProcess, 0, pulses)
-	oo_OBJECT (PitchTier, 0, pitch)
+	oo_AUTO_OBJECT (PointProcess, 0, pulses)
+	oo_AUTO_OBJECT (PitchTier, 0, pitch)
 
 	oo_FROM (1)
-		oo_OBJECT (IntensityTier, 0, dummyIntensity)
+		oo_AUTO_OBJECT (IntensityTier, 0, dummyIntensity)
 	oo_ENDFROM
 
 	oo_FROM (2)
-		oo_OBJECT (DurationTier, 0, duration)
+		oo_AUTO_OBJECT (DurationTier, 0, duration)
 	oo_ENDFROM
 
 	oo_FROM (3)
@@ -47,16 +47,16 @@ oo_DEFINE_CLASS (Manipulation, Function)
 		 * but allow it to be read (a legacy of writing but not reading the version 3 stuff).
 		 */
 		#if oo_WRITING
-			{ Image save = dummySpectrogram; dummySpectrogram = NULL;
+			{ Image save = dummySpectrogram; dummySpectrogram = nullptr;
 		#endif
 		oo_OBJECT (Image, 0, dummySpectrogram)
 		#if oo_WRITING
 			dummySpectrogram = save; }
 		#endif
 		oo_OBJECT (FormantTier, 0, dummyFormantTier)
-		oo_OBJECT (Data, 0, dummy1)
-		oo_OBJECT (Data, 0, dummy2)
-		oo_OBJECT (Data, 0, dummy3)
+		oo_OBJECT (Daata, 0, dummy1)
+		oo_OBJECT (Daata, 0, dummy2)
+		oo_OBJECT (Daata, 0, dummy3)
 	oo_ENDFROM
 
 	oo_FROM (4)
@@ -65,7 +65,7 @@ oo_DEFINE_CLASS (Manipulation, Function)
 		oo_DOUBLE (dummy11)
 		oo_DOUBLE (dummy12)
 		oo_OBJECT (Intensity, 0, dummyIntensityAnalysis)
-		oo_VERSION (1) oo_OBJECT (Formant, 1, dummyFormantAnalysis)
+		oo_OBJECT (Formant, 1, dummyFormantAnalysis)
 		oo_INT (dummy4)
 		oo_DOUBLE (dummy5)
 		oo_DOUBLE (dummy6)
@@ -79,11 +79,12 @@ oo_DEFINE_CLASS (Manipulation, Function)
 	#endif
 
 	#if oo_DECLARING
-		// overridden methods:
-		protected:
-			virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
-			virtual void v_shiftX (double xfrom, double xto);
-			virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		int v_domainQuantity ()
+			override { return MelderQuantity_TIME_SECONDS; }
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
 	#endif
 
 oo_END_CLASS (Manipulation)
diff --git a/fon/Matrix.cpp b/fon/Matrix.cpp
index 85db3bc..44f8b7f 100644
--- a/fon/Matrix.cpp
+++ b/fon/Matrix.cpp
@@ -1,6 +1,6 @@
 /* Matrix.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -42,25 +42,25 @@
 Thing_implement (Matrix, SampledXY, 2);
 
 void structMatrix :: v_info () {
-	structData :: v_info ();
+	structDaata :: v_info ();
 	double minimum = 0.0, maximum = 0.0;
 	Matrix_getWindowExtrema (this, 1, our nx, 1, our ny, & minimum, & maximum);
-	MelderInfo_writeLine (L"xmin: ", Melder_double (our xmin));
-	MelderInfo_writeLine (L"xmax: ", Melder_double (our xmax));
-	MelderInfo_writeLine (L"Number of columns: ", Melder_integer (our nx));
-	MelderInfo_writeLine (L"dx: ", Melder_double (our dx), L" (-> sampling rate ", Melder_double (1.0 / our dx), L" )");
-	MelderInfo_writeLine (L"x1: ", Melder_double (our x1));
-	MelderInfo_writeLine (L"ymin: ", Melder_double (our ymin));
-	MelderInfo_writeLine (L"ymax: ", Melder_double (our ymax));
-	MelderInfo_writeLine (L"Number of rows: ", Melder_integer (our ny));
-	MelderInfo_writeLine (L"dy: ", Melder_double (our dy), L" (-> sampling rate ", Melder_double (1.0 / our dy), L" )");
-	MelderInfo_writeLine (L"y1: ", Melder_double (our y1));
-	MelderInfo_writeLine (L"Minimum value: ", Melder_single (minimum));
-	MelderInfo_writeLine (L"Maximum value: ", Melder_single (maximum));
-}
-
-void structMatrix :: v_readText (MelderReadText text) {
-	if (Thing_version < 0) {
+	MelderInfo_writeLine (U"xmin: ", our xmin);
+	MelderInfo_writeLine (U"xmax: ", our xmax);
+	MelderInfo_writeLine (U"Number of columns: ", our nx);
+	MelderInfo_writeLine (U"dx: ", our dx, U" (-> sampling rate ", 1.0 / our dx, U" )");
+	MelderInfo_writeLine (U"x1: ", our x1);
+	MelderInfo_writeLine (U"ymin: ", our ymin);
+	MelderInfo_writeLine (U"ymax: ", our ymax);
+	MelderInfo_writeLine (U"Number of rows: ", our ny);
+	MelderInfo_writeLine (U"dy: ", our dy, U" (-> sampling rate ", 1.0 / our dy, U" )");
+	MelderInfo_writeLine (U"y1: ", our y1);
+	MelderInfo_writeLine (U"Minimum value: ", minimum);
+	MelderInfo_writeLine (U"Maximum value: ", maximum);
+}
+
+void structMatrix :: v_readText (MelderReadText text, int formatVersion) {
+	if (formatVersion < 0) {
 		our xmin = texgetr8 (text);
 		our xmax = texgetr8 (text);
 		our ymin = texgetr8 (text);
@@ -72,20 +72,20 @@ void structMatrix :: v_readText (MelderReadText text) {
 		our x1 = texgetr8 (text);
 		our y1 = texgetr8 (text);
 	} else {
-		Matrix_Parent :: v_readText (text);
+		Matrix_Parent :: v_readText (text, formatVersion);
 	}
 	if (our xmin > our xmax)
-		Melder_throw ("xmin should be less than or equal to xmax.");
+		Melder_throw (U"xmin should be less than or equal to xmax.");
 	if (our ymin > our ymax)
-		Melder_throw ("ymin should be less than or equal to ymax.");
+		Melder_throw (U"ymin should be less than or equal to ymax.");
 	if (our nx < 1)
-		Melder_throw ("nx should be at least 1.");
+		Melder_throw (U"nx should be at least 1.");
 	if (our ny < 1)
-		Melder_throw ("ny should be at least 1.");
+		Melder_throw (U"ny should be at least 1.");
 	if (our dx <= 0.0)
-		Melder_throw ("dx should be greater than 0.0.");
+		Melder_throw (U"dx should be greater than 0.0.");
 	if (our dy <= 0.0)
-		Melder_throw ("dy should be greater than 0.0.");
+		Melder_throw (U"dy should be greater than 0.0.");
 	our z = NUMmatrix_readText_r8 (1, our ny, 1, our nx, text, "z");
 }
 
@@ -103,7 +103,7 @@ double structMatrix :: v_getMatrix (long irow, long icol) {
 double structMatrix :: v_getFunction2 (double x, double y) {
 	double rrow = (y - our y1) / our dy + 1.0;
 	double rcol = (x - our x1) / our dx + 1.0;
-	long irow = floor (rrow), icol = floor (rcol);
+	long irow = (long) floor (rrow), icol = (long) floor (rcol);
 	double drow = rrow - irow, dcol = rcol - icol;
 	double z1 = irow < 1 || irow >  our ny || icol < 1 || icol >  our nx ? 0.0 : z [irow]     [icol];
 	double z2 = irow < 0 || irow >= our ny || icol < 1 || icol >  our nx ? 0.0 : z [irow + 1] [icol];
@@ -125,27 +125,27 @@ void Matrix_init
 	my z = NUMmatrix <double> (1, my ny, 1, my nx);
 }
 
-Matrix Matrix_create
+autoMatrix Matrix_create
 	(double xmin, double xmax, long nx, double dx, double x1,
 	 double ymin, double ymax, long ny, double dy, double y1)
 {
 	try {
 		autoMatrix me = Thing_new (Matrix);
 		Matrix_init (me.peek(), xmin, xmax, nx, dx, x1, ymin, ymax, ny, dy, y1);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Matrix object not created.");
+		Melder_throw (U"Matrix object not created.");
 	}
 }
 
-Matrix Matrix_createSimple (long numberOfRows, long numberOfColumns) {
+autoMatrix Matrix_createSimple (long numberOfRows, long numberOfColumns) {
 	try {
 		autoMatrix me = Thing_new (Matrix);
 		Matrix_init (me.peek(), 0.5, numberOfColumns + 0.5, numberOfColumns, 1, 1,
 			0.5, numberOfRows + 0.5, numberOfRows, 1, 1);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Matrix object not created.");
+		Melder_throw (U"Matrix object not created.");
 	}
 }
 
@@ -219,12 +219,12 @@ double Matrix_getValueAtXY (Matrix me, double x, double y) {
 	/*
 	 * Determine the four nearest (xi, yi) points.
 	 */
-	bottomRow = floor (row_real);   /* 0 <= bottomRow <= my ny */
-	topRow = bottomRow + 1;         /* 1 <= topRow <= my ny + 1 */
-	leftCol = floor (col_real);     /* 0 <= leftCol <= my nx */
-	rightCol = leftCol + 1;         /* 1 <= rightCol <= my nx + 1 */
-	drow = row_real - bottomRow;    /* 0.0 <= drow < 1.0 */
-	dcol = col_real - leftCol;      /* 0.0 <= dcol < 1.0 */
+	bottomRow = (long) floor (row_real);   // 0 <= bottomRow <= my ny
+	topRow = bottomRow + 1;         // 1 <= topRow <= my ny + 1
+	leftCol = (long) floor (col_real);     // 0 <= leftCol <= my nx
+	rightCol = leftCol + 1;         // 1 <= rightCol <= my nx + 1
+	drow = row_real - bottomRow;    // 0.0 <= drow < 1.0
+	dcol = col_real - leftCol;      // 0.0 <= dcol < 1.0
 	/*
 	 * If adjacent points exist
 	 * (i.e., both row numbers are between 1 and my ny,
@@ -233,10 +233,10 @@ double Matrix_getValueAtXY (Matrix me, double x, double y) {
 	 * If not, we do constant extrapolation,
 	 * which can be simulated by an interpolation between equal z values.
 	 */
-	if (bottomRow < 1) bottomRow = 1;         /* 1 <= bottomRow <= my ny */
-	if (topRow > my ny) topRow = my ny;       /* 1 <= topRow <= my ny */
-	if (leftCol < 1) leftCol = 1;             /* 1 <= leftCol <= my nx */
-	if (rightCol > my nx) rightCol = my nx;   /* 1 <= rightCol <= my nx */
+	if (bottomRow < 1) bottomRow = 1;         // 1 <= bottomRow <= my ny
+	if (topRow > my ny) topRow = my ny;       // 1 <= topRow <= my ny
+	if (leftCol < 1) leftCol = 1;             // 1 <= leftCol <= my nx
+	if (rightCol > my nx) rightCol = my nx;   // 1 <= rightCol <= my nx
 	return (1.0 - drow) * (1.0 - dcol) * my z [bottomRow] [leftCol] +
 		drow * (1.0 - dcol) * my z [topRow] [leftCol] +
 		(1.0 - drow) * dcol * my z [bottomRow] [rightCol] +
@@ -357,7 +357,7 @@ void Matrix_paintContours (Matrix me, Graphics g, double xmin, double xmax, doub
 }
 
 static void cellArrayOrImage (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax,
-	double minimum, double maximum, int interpolate)
+	double minimum, double maximum, bool interpolate)
 {
 	if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; }
 	if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; }
@@ -389,13 +389,13 @@ static void cellArrayOrImage (Matrix me, Graphics g, double xmin, double xmax, d
 void Matrix_paintImage (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax,
 	double minimum, double maximum)
 {
-	cellArrayOrImage (me, g, xmin, xmax, ymin, ymax, minimum, maximum, TRUE);
+	cellArrayOrImage (me, g, xmin, xmax, ymin, ymax, minimum, maximum, true);
 }
 
 void Matrix_paintCells (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax,
 	double minimum, double maximum)
 {
-	cellArrayOrImage (me, g, xmin, xmax, ymin, ymax, minimum, maximum, FALSE);
+	cellArrayOrImage (me, g, xmin, xmax, ymin, ymax, minimum, maximum, false);
 }
 
 void Matrix_paintSurface (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax,
@@ -433,14 +433,14 @@ void Matrix_movie (Matrix me, Graphics g) {
 	}
 }
 
-Matrix Matrix_readAP (MelderFile file) {
+autoMatrix Matrix_readAP (MelderFile file) {
 	try {
 		autofile f = Melder_fopen (file, "rb");
 		int16_t header [256];
 		for (long i = 0; i < 256; i ++)
 			header [i] = bingeti2LE (f);
 		double samplingFrequency = header [100];   // converting up (from 16 to 54 bytes)
-		Melder_casual ("Sampling frequency %.10g.", samplingFrequency);
+		Melder_casual (U"Sampling frequency ", samplingFrequency);
 		autoMatrix me = Matrix_create (0, header [34], header [34] /* Number of frames. */, 1, 0.5,
 			0, header [35], header [35] /* Number of words per frame. */, 1, 0.5);
 			/*Mat := MATRIX_create (Buffer.I2 [36], (* Number of words per frame. *)
@@ -448,7 +448,8 @@ Matrix Matrix_readAP (MelderFile file) {
 							   1.0,
 							   Buffer.I2 [111] / (* Samples per frame. *)
 							   Buffer.I2 [101]); (* Sampling frequency. *)*/
-		Melder_casual ("... Loading %d frames of %d words ...", header [34], header [35]);
+		Melder_casual (U"... Loading ", header [34], U" frames",
+			U" of ", header [35], U" words ...");
 		for (long i = 1; i <= my nx; i ++)
 			for (long j = 1; j <= my ny; j ++)
 				my z [j] [i] = bingeti2LE (f);   // converting up (from 16 to 54 bytes)
@@ -461,15 +462,15 @@ Matrix Matrix_readAP (MelderFile file) {
 				my z [1] [i] = - samplingFrequency / my z [1] [i];
 
 		f.close (file);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Matrix object not read from AP file ", file);
+		Melder_throw (U"Matrix object not read from AP file ", file);
 	}
 }
 
-Matrix Matrix_appendRows (Matrix me, Matrix thee, ClassInfo klas) {
+autoMatrix Matrix_appendRows (Matrix me, Matrix thee, ClassInfo klas) {
 	try {
-		autoMatrix him = (Matrix) _Thing_new (klas);
+		autoMatrix him = static_cast <Matrix> (Thing_newFromClass (klas));
 		Matrix_init (him.peek(), my xmin < thy xmin ? my xmin : thy xmin,
 			my xmax > thy xmax ? my xmax : thy xmax,
 			my nx > thy nx ? my nx : thy nx, my dx, my x1 < thy x1 ? my x1 : thy x1,
@@ -480,13 +481,13 @@ Matrix Matrix_appendRows (Matrix me, Matrix thee, ClassInfo klas) {
 		for (long irow = 1; irow <= thy ny; irow ++)
 			for (long icol = 1; icol <= thy nx; icol ++)
 				his z [irow + my ny] [icol] = thy z [irow] [icol];
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": rows not appended.");
+		Melder_throw (me, U" & ", thee, U": rows not appended.");
 	}
 }
 
-Matrix Matrix_readFromRawTextFile (MelderFile file) {   // BUG: not Unicode-compatible
+autoMatrix Matrix_readFromRawTextFile (MelderFile file) {   // BUG: not Unicode-compatible
 	try {
 		autofile f = Melder_fopen (file, "rb");
 
@@ -505,7 +506,7 @@ Matrix Matrix_readFromRawTextFile (MelderFile file) {   // BUG: not Unicode-comp
 			if (kar == '\n' || kar == '\r' || kar == EOF) break;
 		}
 		if (ncol == 0)
-			Melder_throw ("File empty");
+			Melder_throw (U"File empty");
 
 		/*
 		 * Count number of elements.
@@ -514,7 +515,7 @@ Matrix Matrix_readFromRawTextFile (MelderFile file) {   // BUG: not Unicode-comp
 		long nelements = 0;
 		for (;;) {
 			double element;
-			if (fscanf (f, "%lf", & element) < 1) break;   /* Zero or end-of-file. */
+			if (fscanf (f, "%lf", & element) < 1) break;   // zero or end-of-file
 			nelements ++;
 		}
 
@@ -522,7 +523,7 @@ Matrix Matrix_readFromRawTextFile (MelderFile file) {   // BUG: not Unicode-comp
 		 * Check if all columns are complete.
 		 */
 		if (nelements == 0 || nelements % ncol != 0)
-			Melder_throw ("The number of elements (", nelements, ") is not a multiple of the number of columns (", ncol, ").");
+			Melder_throw (U"The number of elements (", nelements, U") is not a multiple of the number of columns (", ncol, U").");
 
 		/*
 		 * Create simple matrix.
@@ -539,18 +540,18 @@ Matrix Matrix_readFromRawTextFile (MelderFile file) {   // BUG: not Unicode-comp
 				fscanf (f, "%lf", & my z [irow] [icol]);
 
 		f.close (file);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Matrix object not read from raw text file ", file);
+		Melder_throw (U"Matrix object not read from raw text file ", file, U".");
 	}
 }
 
 void Matrix_eigen (Matrix me, Matrix *out_eigenvectors, Matrix *out_eigenvalues) {
-	*out_eigenvectors = NULL;
-	*out_eigenvalues = NULL;
+	*out_eigenvectors = nullptr;
+	*out_eigenvalues = nullptr;
 	try {
 		if (my nx != my ny)
-			Melder_throw ("(Matrix not square.");
+			Melder_throw (U"(Matrix not square.");
 
 		autoEigen eigen = Thing_new (Eigen);
 		Eigen_initFromSymmetricMatrix (eigen.peek(), my z, my nx);
@@ -564,14 +565,14 @@ void Matrix_eigen (Matrix me, Matrix *out_eigenvectors, Matrix *out_eigenvalues)
 		*out_eigenvectors = eigenvectors.transfer();
 		*out_eigenvalues = eigenvalues.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": eigenstructure not computed.");
+		Melder_throw (me, U": eigenstructure not computed.");
 	}
 }
 
-Matrix Matrix_power (Matrix me, long power) {
+autoMatrix Matrix_power (Matrix me, long power) {
 	try {
 		if (my nx != my ny)
-			Melder_throw ("Matrix not square.");
+			Melder_throw (U"Matrix not square.");
 		autoMatrix thee = Data_copy (me);
 		autoMatrix him = Data_copy (me);
 		for (long ipow = 2; ipow <= power; ipow ++) {
@@ -585,9 +586,9 @@ Matrix Matrix_power (Matrix me, long power) {
 				}
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": power not computed.");
+		Melder_throw (me, U": power not computed.");
 	}
 }
 
@@ -595,7 +596,7 @@ void Matrix_writeToMatrixTextFile (Matrix me, MelderFile file) {
 	try {
 		autofile f = Melder_fopen (file, "w");
 		fprintf (f, "\"ooTextFile\"\n\"Matrix\"\n%.17g %.17g %ld %.17g %.17g\n%.17g %.17g %ld %.17g %.17g\n",
-			my xmin, my xmax, my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1);
+			my xmin, my xmax, (long) my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1);
 		for (long i = 1; i <= my ny; i ++) {
 			for (long j = 1; j <= my nx; j ++) {
 				if (j > 1) fprintf (f, " ");
@@ -605,7 +606,7 @@ void Matrix_writeToMatrixTextFile (Matrix me, MelderFile file) {
 		}
 		f.close (file);
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to Matrix text file.");
+		Melder_throw (me, U": not written to Matrix text file.");
 	}
 }
 
@@ -615,21 +616,21 @@ void Matrix_writeToHeaderlessSpreadsheetFile (Matrix me, MelderFile file) {
 		for (long i = 1; i <= my ny; i ++) {
 			for (long j = 1; j <= my nx; j ++) {
 				if (j > 1) fprintf (f, "\t");
-				fprintf (f, "%ls", Melder_single (my z [i] [j]));
+				fprintf (f, "%s", Melder8_single (my z [i] [j]));
 			}
 			fprintf (f, "\n");
 		}
 		f.close (file);
 	} catch (MelderError) {
-		Melder_throw (me, ": not saved as tab-separated file ", file);
+		Melder_throw (me, U": not saved as tab-separated file ", file);
 	}
 }
 
-void Matrix_formula (Matrix me, const wchar_t *expression, Interpreter interpreter, Matrix target) {
+void Matrix_formula (Matrix me, const char32 *expression, Interpreter interpreter, Matrix target) {
 	try {
 		struct Formula_Result result;
-		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, TRUE);
-		if (target == NULL) target = me;
+		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, true);
+		if (! target) target = me;
 		for (long irow = 1; irow <= my ny; irow ++) {
 			for (long icol = 1; icol <= my nx; icol ++) {
 				Formula_run (irow, icol, & result);
@@ -637,12 +638,12 @@ void Matrix_formula (Matrix me, const wchar_t *expression, Interpreter interpret
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": formula not completed.");
+		Melder_throw (me, U": formula not completed.");
 	}
 }
 
 void Matrix_formula_part (Matrix me, double xmin, double xmax, double ymin, double ymax,
-	const wchar_t *expression, Interpreter interpreter, Matrix target)
+	const char32 *expression, Interpreter interpreter, Matrix target)
 {
 	try {
 		if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; }
@@ -651,8 +652,8 @@ void Matrix_formula_part (Matrix me, double xmin, double xmax, double ymin, doub
 		(void) Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax);
 		(void) Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax);
 		struct Formula_Result result;
-		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, TRUE);
-		if (target == NULL) target = me;
+		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, true);
+		if (! target) target = me;
 		for (long irow = iymin; irow <= iymax; irow ++) {
 			for (long icol = ixmin; icol <= ixmax; icol ++) {
 				Formula_run (irow, icol, & result);
@@ -660,7 +661,7 @@ void Matrix_formula_part (Matrix me, double xmin, double xmax, double ymin, doub
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": formula not completed.");
+		Melder_throw (me, U": formula not completed.");
 	}
 }
 
@@ -683,31 +684,31 @@ void Matrix_scaleAbsoluteExtremum (Matrix me, double scale) {
 	}
 }
 
-Matrix TableOfReal_to_Matrix (TableOfReal me) {
+autoMatrix TableOfReal_to_Matrix (TableOfReal me) {
 	try {
 		autoMatrix thee = Matrix_createSimple (my numberOfRows, my numberOfColumns);
 		for (long i = 1; i <= my numberOfRows; i ++)
 			for (long j = 1; j <= my numberOfColumns; j ++)
 				thy z [i] [j] = my data [i] [j];
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
-TableOfReal Matrix_to_TableOfReal (Matrix me) {
+autoTableOfReal Matrix_to_TableOfReal (Matrix me) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my ny, my nx);
 		for (long i = 1; i <= my ny; i ++)
 			for (long j = 1; j <= my nx; j ++)
 				thy data [i] [j] = my z [i] [j];
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TableOfReal.");
+		Melder_throw (me, U": not converted to TableOfReal.");
 	}
 }
 
-Matrix Table_to_Matrix (Table me) {
+autoMatrix Table_to_Matrix (Table me) {
 	try {
 		autoMatrix thee = Matrix_createSimple (my rows -> size, my numberOfColumns);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
@@ -719,9 +720,9 @@ Matrix Table_to_Matrix (Table me) {
 				thy z [irow] [icol] = row -> cells [icol]. number;
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
diff --git a/fon/Matrix.h b/fon/Matrix.h
index 85b4475..000774c 100644
--- a/fon/Matrix.h
+++ b/fon/Matrix.h
@@ -2,7 +2,7 @@
 #define _Matrix_h_
 /* Matrix.h
  *
- * Copyright (C) 1992-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,12 +32,12 @@ void Matrix_init
 	(Matrix me, double xmin, double xmax, long nx, double dx, double x1,
 	            double ymin, double ymax, long ny, double dy, double y1);
 
-Matrix Matrix_create
+autoMatrix Matrix_create
 	(double xmin, double xmax, long nx, double dx, double x1,
 	 double ymin, double ymax, long ny, double dy, double y1);
 /*
 	Function:
-		return a new empty Matrix, or NULL if out of memory.
+		return a new empty Matrix.
 	Preconditions:
 		xmin <= xmax;   ymin <= ymax;
 		nx >= 1;  ny >= 1;
@@ -56,10 +56,10 @@ Matrix Matrix_create
 		result -> z [1..ny] [1..nx] == 0.0;
 */
 
-Matrix Matrix_createSimple (long numberOfRows, long numberOfColumns);
+autoMatrix Matrix_createSimple (long numberOfRows, long numberOfColumns);
 /*
 	Function:
-		return a new empty Matrix, or NULL if out of memory.
+		return a new empty Matrix.
 	Preconditions:
 		numberOfRows >= 1;  numberOfColumns >= 1;
 	Postconditions:
@@ -176,7 +176,7 @@ long Matrix_getWindowExtrema (Matrix me, long ixmin, long ixmax, long iymin, lon
 		if result == 0, *minimum and *maximum are not changed;
 */
 
-void Matrix_formula (Matrix me, const wchar_t *expression, Interpreter interpreter, Matrix target);
+void Matrix_formula (Matrix me, const char32 *expression, Interpreter interpreter, Matrix target);
 /*
 	Arguments:
 		"me" is the Matrix referred to as "self" or with "nx" etc. in the expression
@@ -187,12 +187,12 @@ void Matrix_formula (Matrix me, const wchar_t *expression, Interpreter interpret
 				ENDFOR
 			ENDFOR
 		"expression" is the text to be compiled and interpreted.
-		If "target" is NULL, the result will go to "me"; otherwise, to "target".
+		If "target" is null, the result will go to "me"; otherwise, to "target".
 	Return value:
 		0 in case of failure, otherwise 1.
 */
 void Matrix_formula_part (Matrix me, double xmin, double xmax, double ymin, double ymax,
-	const wchar_t *expression, Interpreter interpreter, Matrix target);
+	const char32 *expression, Interpreter interpreter, Matrix target);
 
 /***** Graphics routines. *****/
 /*
@@ -248,21 +248,21 @@ void Matrix_paintSurface (Matrix me, Graphics g, double xmin, double xmax, doubl
 
 void Matrix_movie (Matrix me, Graphics g);
 
-Matrix Matrix_readFromRawTextFile (MelderFile file);
-Matrix Matrix_readAP (MelderFile file);
-Matrix Matrix_appendRows (Matrix me, Matrix thee, ClassInfo klas);
+autoMatrix Matrix_readFromRawTextFile (MelderFile file);
+autoMatrix Matrix_readAP (MelderFile file);
+autoMatrix Matrix_appendRows (Matrix me, Matrix thee, ClassInfo klas);
 
 void Matrix_eigen (Matrix me, Matrix *eigenvectors, Matrix *eigenvalues);
-Matrix Matrix_power (Matrix me, long power);
+autoMatrix Matrix_power (Matrix me, long power);
 
 void Matrix_scaleAbsoluteExtremum (Matrix me, double scale);
 
-Matrix Table_to_Matrix (Table me);
+autoMatrix Table_to_Matrix (Table me);
 void Matrix_writeToMatrixTextFile (Matrix me, MelderFile file);
 void Matrix_writeToHeaderlessSpreadsheetFile (Matrix me, MelderFile file);
 
-Matrix TableOfReal_to_Matrix (TableOfReal me);
-TableOfReal Matrix_to_TableOfReal (Matrix me);
+autoMatrix TableOfReal_to_Matrix (TableOfReal me);
+autoTableOfReal Matrix_to_TableOfReal (Matrix me);
 
 /* End of file Matrix.h */
 #endif
diff --git a/fon/Matrix_and_Pitch.cpp b/fon/Matrix_and_Pitch.cpp
index 299363c..84ef003 100644
--- a/fon/Matrix_and_Pitch.cpp
+++ b/fon/Matrix_and_Pitch.cpp
@@ -1,6 +1,6 @@
 /* Matrix_and_Pitch.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 /*
  * pb 2002/07/16 GPL
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2009/01/18 Interpreter argument to formula
  * pb 2009/04/04 corrected voiceless frames in Pitch_to_Matrix
  * pb 2011/06/04 C++
@@ -27,20 +27,20 @@
 
 #include "Matrix_and_Pitch.h"
 
-Matrix Pitch_to_Matrix (Pitch me) {
+autoMatrix Pitch_to_Matrix (Pitch me) {
 	try {
 		autoMatrix thee = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 1, 1, 1, 1, 1);
 		for (long i = 1; i <= my nx; i ++) {
 			double value = my frame [i]. candidate [1]. frequency;
 			thy z [1] [i] = value > 0.0 && value < my ceiling ? my frame [i]. candidate [1]. frequency : 0.0;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
-Pitch Matrix_to_Pitch (Matrix me) {
+autoPitch Matrix_to_Pitch (Matrix me) {
 	try {
 		autoPitch thee = Pitch_create (my xmin, my xmax, my nx, my dx, my x1, 5000, 2);
 		for (long i = 1; i <= my nx; i ++) {
@@ -58,13 +58,13 @@ Pitch Matrix_to_Pitch (Matrix me) {
 				frame->candidate[2].strength = 0.4;
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Pitch.");
+		Melder_throw (me, U": not converted to Pitch.");
 	}
 }
 
-void Pitch_formula (Pitch me, const wchar_t *formula, Interpreter interpreter) {
+void Pitch_formula (Pitch me, const char32 *formula, Interpreter interpreter) {
 	try {
 		autoMatrix m = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 1, my maxnCandidates, my maxnCandidates, 1, 1);
 		for (long iframe = 1; iframe <= my nx; iframe ++) {
@@ -79,7 +79,7 @@ void Pitch_formula (Pitch me, const wchar_t *formula, Interpreter interpreter) {
 				frame -> candidate [icand]. frequency = m -> z [icand] [iframe];
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": formula not completed.");
+		Melder_throw (me, U": formula not completed.");
 	}
 }
 
diff --git a/fon/Matrix_and_Pitch.h b/fon/Matrix_and_Pitch.h
index 456190e..eb1327c 100644
--- a/fon/Matrix_and_Pitch.h
+++ b/fon/Matrix_and_Pitch.h
@@ -1,6 +1,6 @@
 /* Matrix_and_Pitch.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,8 +20,8 @@
 #include "Matrix.h"
 #include "Pitch.h"
 
-Matrix Pitch_to_Matrix (Pitch me);
+autoMatrix Pitch_to_Matrix (Pitch me);
 
-Pitch Matrix_to_Pitch (Matrix me);
+autoPitch Matrix_to_Pitch (Matrix me);
 
 /* End of file Matrix_and_Pitch.h */
diff --git a/fon/Matrix_and_PointProcess.cpp b/fon/Matrix_and_PointProcess.cpp
index 290c4dc..031e507 100644
--- a/fon/Matrix_and_PointProcess.cpp
+++ b/fon/Matrix_and_PointProcess.cpp
@@ -1,6 +1,6 @@
 /* Matrix_and_PointProcess.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,28 +25,28 @@
 
 #include "Matrix_and_PointProcess.h"
 
-Matrix PointProcess_to_Matrix (PointProcess me) {
+autoMatrix PointProcess_to_Matrix (PointProcess me) {
 	try {
 		if (my nt == 0)
-			Melder_throw ("No times in PointProcess.");
+			Melder_throw (U"No times in PointProcess.");
 		autoMatrix thee = Matrix_create (1, my nt, my nt, 1, 1, 1, 1, 1, 1, 1);
 		for (long i = 1; i <= my nt; i ++)
 			thy z [1] [i] = my t [i];
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
-PointProcess Matrix_to_PointProcess (Matrix me) {
+autoPointProcess Matrix_to_PointProcess (Matrix me) {
 	try {
 		autoPointProcess thee = PointProcess_create (my z [1] [1], my z [1] [my nx], my nx);
 		for (long i = 1; i <= my nx; i ++) {
 			PointProcess_addPoint (thee.peek(), my z [1] [i]);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to PointProcess.");
+		Melder_throw (me, U": not converted to PointProcess.");
 	}
 }
 
diff --git a/fon/Matrix_and_PointProcess.h b/fon/Matrix_and_PointProcess.h
index f7f12b6..b63a63e 100644
--- a/fon/Matrix_and_PointProcess.h
+++ b/fon/Matrix_and_PointProcess.h
@@ -1,6 +1,6 @@
 /* Matrix_and_PointProcess.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,10 +20,10 @@
 #include "Matrix.h"
 #include "PointProcess.h"
 
-Matrix PointProcess_to_Matrix (PointProcess me);
+autoMatrix PointProcess_to_Matrix (PointProcess me);
 /*
 	Function:
-		create a Matrix from a PointProcess; return NULL if out of memory.
+		create a Matrix from a PointProcess.
 	Postconditions:
 		thy xmin == 1;
 		thy xmax == my numberOfEvents;
@@ -34,10 +34,10 @@ Matrix PointProcess_to_Matrix (PointProcess me);
 		for (ievent in 1..my numberOfEvents) thy z [1] [ievent] == my event [ievent];
 */
 
-PointProcess Matrix_to_PointProcess (Matrix me);
+autoPointProcess Matrix_to_PointProcess (Matrix me);
 /*
 	Function:
-		create a PointProcess from a Matrix; return NULL if out of memory.
+		create a PointProcess from a Matrix.
 	Postconditions:
 		thy maximumNumberOfEvents == my nx;
 		thy numberOfEvents == my nx;
diff --git a/fon/Matrix_and_Polygon.cpp b/fon/Matrix_and_Polygon.cpp
index 2a0e78c..efa5300 100644
--- a/fon/Matrix_and_Polygon.cpp
+++ b/fon/Matrix_and_Polygon.cpp
@@ -1,6 +1,6 @@
 /* Matrix_and_Polygon.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,36 +26,36 @@
 
 #include "Matrix_and_Polygon.h"
 
-Polygon Matrix_to_Polygon (Matrix me) {
+autoPolygon Matrix_to_Polygon (Matrix me) {
 	try {
 		if (my nx != 2 && my ny != 2)
-			Melder_throw ("Matrix must have exactly 2 rows or columns.");
-		autoPolygon thee = NULL;
+			Melder_throw (U"Matrix must have exactly 2 rows or columns.");
+		autoPolygon thee;
 		if (my ny == 2) {
-			thee.reset (Polygon_create (my nx));
+			thee = Polygon_create (my nx);
 			NUMvector_copyElements (my z [1], thy x, 1, my nx);
 			NUMvector_copyElements (my z [2], thy y, 1, my nx);
 		} else {
-			thee.reset (Polygon_create (my ny));
+			thee = Polygon_create (my ny);
 			for (long i = 1; i <= my ny; i ++) {
 				thy x [i] = my z [i] [1];
 				thy y [i] = my z [i] [2];
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Polygon.");
+		Melder_throw (me, U": not converted to Polygon.");
 	}
 }
 
-Matrix Polygon_to_Matrix (Polygon me) {
+autoMatrix Polygon_to_Matrix (Polygon me) {
 	try {
 		autoMatrix thee = Matrix_create (1, my numberOfPoints, my numberOfPoints, 1, 1, 1, 2, 2, 1, 1);
 		NUMvector_copyElements (my x, thy z [1], 1, my numberOfPoints);
 		NUMvector_copyElements (my y, thy z [2], 1, my numberOfPoints);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
diff --git a/fon/Matrix_and_Polygon.h b/fon/Matrix_and_Polygon.h
index 2007e1f..a4de5b7 100644
--- a/fon/Matrix_and_Polygon.h
+++ b/fon/Matrix_and_Polygon.h
@@ -1,6 +1,6 @@
 /* Matrix_and_Polygon.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,10 +20,10 @@
 #include "Matrix.h"
 #include "Polygon.h"
 
-Polygon Matrix_to_Polygon (Matrix me);
+autoPolygon Matrix_to_Polygon (Matrix me);
 /*
 	Function:
-		create a Polygon from a Matrix; return NULL in case of failure.
+		create a Polygon from a Matrix.
 	Failures:
 		my ny != 2 && my nx != 2;   //  Matrix must have exactly 2 rows or columns.
 		Out of memory.
@@ -38,10 +38,10 @@ Polygon Matrix_to_Polygon (Matrix me);
 		}
 */
 
-Matrix Polygon_to_Matrix (Polygon me);
+autoMatrix Polygon_to_Matrix (Polygon me);
 /*
 	Function:
-		create a Matrix from a Polygon; return NULL if out of memory.
+		create a Matrix from a Polygon.
 	Postconditions:
 		thy xmin xmax nx dx x1 == 1 my numberOfPoints my numberOfPoints 1 1;
 		thy ymin ymax ny dy y1 == 1 2 2 1 1;
diff --git a/fon/Matrix_def.h b/fon/Matrix_def.h
index 273d5a3..4777849 100644
--- a/fon/Matrix_def.h
+++ b/fon/Matrix_def.h
@@ -1,6 +1,6 @@
 /* Matrix_def.h
  *
- * Copyright (C) 1992-2011,2013 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,8 +23,10 @@ oo_DEFINE_CLASS (Matrix, SampledXY)
 
 	#if oo_READING
 		if (Melder_debug == 45)
-			Melder_casual ("structMatrix :: read: Going to read %ld rows of %ld columns.", ny, nx);
-		if (localVersion >= 2) {
+			Melder_casual (U"structMatrix :: read:"
+				U" Going to read ", ny, U" rows"
+				U" of ", nx, U" columns.");
+		if (formatVersion >= 2) {
 			oo_DOUBLE_MATRIX (z, ny, nx)
 		} else {
 			oo_FLOAT_MATRIX (z, ny, nx)
@@ -34,13 +36,26 @@ oo_DEFINE_CLASS (Matrix, SampledXY)
 	#endif
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
-			virtual bool v_hasGetNrow      () { return true; }   virtual double v_getNrow      ()        { return ny; }
-			virtual bool v_hasGetNcol      () { return true; }   virtual double v_getNcol      ()        { return nx; }
-			virtual bool v_hasGetMatrix    () { return true; }   virtual double v_getMatrix    (long irow, long icol);
-			virtual bool v_hasGetFunction2 () { return true; }   virtual double v_getFunction2 (double x, double y);
-			virtual double v_getValueAtSample (long isamp, long ilevel, int unit);
+		void v_info ()
+			override;
+		bool v_hasGetNrow ()
+			override { return true; }
+		double v_getNrow ()
+			override { return ny; }
+		bool v_hasGetNcol ()
+			override { return true; }
+		double v_getNcol ()
+			override { return nx; }
+		bool v_hasGetMatrix ()
+			override { return true; }
+		double v_getMatrix (long irow, long icol)
+			override;
+		bool v_hasGetFunction2 ()
+			override { return true; }
+		double v_getFunction2 (double x, double y)
+			override;
+		double v_getValueAtSample (long isamp, long ilevel, int unit)
+			override;
 	#endif
 
 oo_END_CLASS (Matrix)
diff --git a/fon/Movie.cpp b/fon/Movie.cpp
index e64ded0..a2f7d9d 100644
--- a/fon/Movie.cpp
+++ b/fon/Movie.cpp
@@ -1,6 +1,6 @@
 /* Movie.cpp
  *
- * Copyright (C) 2011-2012 Paul Boersma
+ * Copyright (C) 2011-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -42,52 +42,52 @@ Thing_implement (Movie, Sampled, 0);
 
 void structMovie :: v_info ()
 {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"Time sampling:");
-	MelderInfo_writeLine (L"   Number of frames: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"   Frame duration: ", Melder_double (dx), L" seconds");
-	MelderInfo_writeLine (L"   Frame rate: ", Melder_single (1.0 / dx), L" frames per second");
-	MelderInfo_writeLine (L"   First frame centred at: ", Melder_double (x1), L" seconds");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"Time sampling:");
+	MelderInfo_writeLine (U"   Number of frames: ", nx);
+	MelderInfo_writeLine (U"   Frame duration: ", dx, U" seconds");
+	MelderInfo_writeLine (U"   Frame rate: ", Melder_single (1.0 / dx), U" frames per second");
+	MelderInfo_writeLine (U"   First frame centred at: ", x1, U" seconds");
 }
 
-void Movie_init (Movie me, Sound sound, const wchar_t *folderName, Strings fileNames)
+void Movie_init (Movie me, Sound sound, const char32 *folderName, Strings fileNames)
 {
 	Sampled_init (me, sound -> xmin, sound -> xmax, fileNames ? fileNames -> numberOfStrings : 0, 0.04, 0.0);
 	my d_sound = sound;
-	my d_folderName = Melder_wcsdup (folderName);
+	my d_folderName = Melder_dup (folderName);
 	my d_fileNames = fileNames;
 }
 
-Movie Movie_openFromSoundFile (MelderFile file)
+autoMovie Movie_openFromSoundFile (MelderFile file)
 {
 	try {
 		autoMovie me = Thing_new (Movie);
 		autoSound sound = Sound_readFromSoundFile (file);
 		autoMelderString fileNameHead;
 		MelderString_copy (& fileNameHead, Melder_fileToPath (file));
-		wchar_t *extensionLocation = wcsrchr (fileNameHead.string, '.');
-		if (extensionLocation == NULL)
+		char32 *extensionLocation = str32rchr (fileNameHead.string, U'.');
+		if (! extensionLocation)
 			extensionLocation = & fileNameHead.string [fileNameHead.length];
-		*extensionLocation = '\0';
+		*extensionLocation = U'\0';
 		fileNameHead.length = extensionLocation - fileNameHead.string;
-		autoStrings strings = Strings_createAsFileList (Melder_wcscat (fileNameHead.string, L"*.png"));
+		autoStrings strings = Strings_createAsFileList (Melder_cat (fileNameHead.string, U"*.png"));
 		struct structMelderDir folder;
 		MelderFile_getParentDir (file, & folder);
 		Movie_init (me.peek(), sound.transfer(), Melder_dirToPath (& folder), strings.transfer());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Movie object not read from file ", file, ".");
+		Melder_throw (U"Movie object not read from file ", file, U".");
 	}
 }
 
 void Movie_paintOneImageInside (Movie me, Graphics graphics, long frameNumber, double xmin, double xmax, double ymin, double ymax)
 {
 	try {
-		if (frameNumber < 1) Melder_throw ("Specified frame number is ", frameNumber, " but should be at least 1.");
-		if (frameNumber > my nx) Melder_throw ("Specified frame number is ", frameNumber, " but there are only ", my nx, "frames.");
+		if (frameNumber < 1) Melder_throw (U"Specified frame number is ", frameNumber, U" but should be at least 1.");
+		if (frameNumber > my nx) Melder_throw (U"Specified frame number is ", frameNumber, U" but there are only ", my nx, U"frames.");
 		Melder_assert (my d_fileNames != 0);
 		Melder_assert (my d_fileNames -> numberOfStrings == my nx);
 		struct structMelderDir folder;
@@ -96,7 +96,7 @@ void Movie_paintOneImageInside (Movie me, Graphics graphics, long frameNumber, d
 		MelderDir_getFile (& folder, my d_fileNames -> strings [frameNumber], & file);
 		Graphics_imageFromFile (graphics, Melder_fileToPath (& file), xmin, xmax, ymin, ymax);
 	} catch (MelderError) {
-		Melder_throw (me, ": image ", frameNumber, " not painted.");
+		Melder_throw (me, U": image ", frameNumber, U" not painted.");
 	}
 }
 
diff --git a/fon/Movie.h b/fon/Movie.h
index 3346733..88c88b8 100644
--- a/fon/Movie.h
+++ b/fon/Movie.h
@@ -2,7 +2,7 @@
 #define _Movie_h_
 /* Movie.h
  *
- * Copyright (C) 2011,2014 Paul Boersma
+ * Copyright (C) 2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,9 +27,9 @@
 #include "Movie_def.h"
 oo_CLASS_CREATE (Movie, Sampled);
 
-Movie Movie_openFromSoundFile (MelderFile file);
+autoMovie Movie_openFromSoundFile (MelderFile file);
 
-void Movie_init (Movie me, Sound sound, const wchar_t *folderName, Strings fileNames);
+void Movie_init (Movie me, Sound sound, const char32 *folderName, Strings fileNames);
 
 void Movie_paintOneImageInside (Movie me, Graphics graphics, long frameNumber, double xmin, double xmax, double ymin, double ymax);
 
diff --git a/fon/MovieWindow.cpp b/fon/MovieWindow.cpp
index 4e8be66..5bd777f 100644
--- a/fon/MovieWindow.cpp
+++ b/fon/MovieWindow.cpp
@@ -122,18 +122,18 @@ void structMovieWindow :: v_play (double tmin, double tmax) {
 	Movie_play (movie, our d_graphics, tmin, tmax, theFunctionEditor_playCallback, this);
 }
 
-void MovieWindow_init (MovieWindow me, const wchar_t *title, Movie movie) {
-	Melder_assert (movie != NULL);
+void MovieWindow_init (MovieWindow me, const char32 *title, Movie movie) {
+	Melder_assert (movie);
 	TimeSoundAnalysisEditor_init (me, title, movie, movie -> d_sound, false);
 }
 
-MovieWindow MovieWindow_create (const wchar_t *title, Movie movie) {
+autoMovieWindow MovieWindow_create (const char32 *title, Movie movie) {
 	try {
 		autoMovieWindow me = Thing_new (MovieWindow);
 		MovieWindow_init (me.peek(), title, movie);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Movie window not created.");
+		Melder_throw (U"Movie window not created.");
 	}
 }
 
diff --git a/fon/MovieWindow.h b/fon/MovieWindow.h
index 223276d..6a20482 100644
--- a/fon/MovieWindow.h
+++ b/fon/MovieWindow.h
@@ -2,7 +2,7 @@
 #define _MovieWindow_h_
 /* MovieWindow.h
  *
- * Copyright (C) 2011,2012,2014 Paul Boersma
+ * Copyright (C) 2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,20 +23,25 @@
 #include "Movie.h"
 
 Thing_define (MovieWindow, TimeSoundAnalysisEditor) {
-	// overridden methods:
-		protected:
-			virtual void v_createMenus ();
-			virtual void v_draw ();
-			virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
-			virtual void v_play (double tmin, double tmax);
-			virtual void v_createMenuItems_view (EditorMenu menu);
-			virtual void v_highlightSelection (double left, double right, double bottom, double top);
-			virtual void v_unhighlightSelection (double left, double right, double bottom, double top);
+	void v_createMenus ()
+		override;
+	void v_draw ()
+		override;
+	int v_click (double xWC, double yWC, bool shiftKeyPressed)
+		override;
+	void v_play (double tmin, double tmax)
+		override;
+	void v_createMenuItems_view (EditorMenu menu)
+		override;
+	void v_highlightSelection (double left, double right, double bottom, double top)
+		override;
+	void v_unhighlightSelection (double left, double right, double bottom, double top)
+		override;
 };
 
-void MovieWindow_init (MovieWindow me, const wchar_t *title, Movie movie);
+void MovieWindow_init (MovieWindow me, const char32 *title, Movie movie);
 
-MovieWindow MovieWindow_create (const wchar_t *title, Movie movie);
+autoMovieWindow MovieWindow_create (const char32 *title, Movie movie);
 
 /* End of file MovieWindow.h */
 #endif
diff --git a/fon/Movie_def.h b/fon/Movie_def.h
index 62e64df..a42e907 100644
--- a/fon/Movie_def.h
+++ b/fon/Movie_def.h
@@ -1,6 +1,6 @@
 /* Movie_def.h
  *
- * Copyright (C) 2011 Paul Boersma
+ * Copyright (C) 2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,8 +26,8 @@ oo_DEFINE_CLASS (Movie, Sampled)
 	oo_OBJECT (Strings, 0, d_fileNames)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (Movie)
diff --git a/fon/ParamCurve.cpp b/fon/ParamCurve.cpp
index 88e0fcc..c7c5750 100644
--- a/fon/ParamCurve.cpp
+++ b/fon/ParamCurve.cpp
@@ -1,6 +1,6 @@
 /* ParamCurve.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,84 +33,81 @@
 Thing_implement (ParamCurve, Function, 2);
 
 void structParamCurve :: v_info () {
-	double xmin = 1e300, xmax = -1e300, ymin = 1e300, ymax = -1e300;
-	for (long i = 1; i <= x -> nx; i ++) {
-		double value = x -> z [1] [i];
+	double xmin = 1e308, xmax = -1e308, ymin = 1e308, ymax = -1e308;
+	for (long i = 1; i <= our x -> nx; i ++) {
+		double value = our x -> z [1] [i];
 		if (value < xmin) xmin = value;
 		if (value > xmax) xmax = value;
 	}
 	for (long i = 1; i <= y -> nx; i ++) {
-		double value = y -> z [1] [i];
+		double value = our y -> z [1] [i];
 		if (value < ymin) ymin = value;
 		if (value > ymax) ymax = value;
 	}
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Domain:");
-	MelderInfo_writeLine (L"   tmin: ", Melder_double (xmin));
-	MelderInfo_writeLine (L"   tmax: ", Melder_double (xmax));
-	MelderInfo_writeLine (L"x sampling:");
-	MelderInfo_writeLine (L"   Number of values of t in x: ", Melder_double (x -> nx));
-	MelderInfo_writeLine (L"   t step in x: ", Melder_double (x -> dx), L" (sampling rate ", Melder_double (1.0 / x -> dx), L")");
-	MelderInfo_writeLine (L"   First t in x: ", Melder_double (x -> x1));
-	MelderInfo_writeLine (L"x values:");
-	MelderInfo_writeLine (L"   Minimum x: ", Melder_double (xmin));
-	MelderInfo_writeLine (L"   Maximum x: ", Melder_double (xmax));
-	MelderInfo_writeLine (L"y sampling:");
-	MelderInfo_writeLine (L"   Number of values of t in y: ", Melder_double (y -> nx));
-	MelderInfo_writeLine (L"   t step in y: ", Melder_double (y -> dx), L" (sampling rate ", Melder_double (1.0 / y -> dx), L")");
-	MelderInfo_writeLine (L"   First t in y: ", Melder_double (y -> x1));
-	MelderInfo_writeLine (L"y values:");
-	MelderInfo_writeLine (L"   Minimum y: ", Melder_double (ymin));
-	MelderInfo_writeLine (L"   Maximum y: ", Melder_double (ymax));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Domain:");
+	MelderInfo_writeLine (U"   tmin: ", xmin);
+	MelderInfo_writeLine (U"   tmax: ", xmax);
+	MelderInfo_writeLine (U"x sampling:");
+	MelderInfo_writeLine (U"   Number of values of t in x: ", our x -> nx);
+	MelderInfo_writeLine (U"   t step in x: ", our x -> dx, U" (sampling rate ", 1.0 / our x -> dx, U")");
+	MelderInfo_writeLine (U"   First t in x: ", our x -> x1);
+	MelderInfo_writeLine (U"x values:");
+	MelderInfo_writeLine (U"   Minimum x: ", xmin);
+	MelderInfo_writeLine (U"   Maximum x: ", xmax);
+	MelderInfo_writeLine (U"y sampling:");
+	MelderInfo_writeLine (U"   Number of values of t in y: ", our y -> nx);
+	MelderInfo_writeLine (U"   t step in y: ", our y -> dx, U" (sampling rate ", 1.0 / our y -> dx, U")");
+	MelderInfo_writeLine (U"   First t in y: ", our y -> x1);
+	MelderInfo_writeLine (U"y values:");
+	MelderInfo_writeLine (U"   Minimum y: ", ymin);
+	MelderInfo_writeLine (U"   Maximum y: ", ymax);
 }
 
 void structParamCurve :: v_writeText (MelderFile file) {
-	Data_writeText (x, file);
-	Data_writeText (y, file);
+	Data_writeText (our x.get(), file);
+	Data_writeText (our y.get(), file);
 }
 
-void structParamCurve :: v_readText (MelderReadText text) {
-	x = Thing_new (Sound);
-	y = Thing_new (Sound);
-	Data_readText (x, text);
-	Data_readText (y, text);
-	xmin = x -> xmin > y -> xmin ? x -> xmin : y -> xmin;
-	xmax = x -> xmax < y -> xmax ? x -> xmax : y -> xmax;
+void structParamCurve :: v_readText (MelderReadText text, int formatVersion) {
+	our x = Thing_new (Sound);
+	our y = Thing_new (Sound);
+	Data_readText (our x.get(), text, formatVersion);
+	Data_readText (our y.get(), text, formatVersion);
+	our xmin = our x -> xmin > our y -> xmin ? our x -> xmin : our y -> xmin;
+	our xmax = our x -> xmax < our y -> xmax ? our x -> xmax : our y -> xmax;
 }
 
 void structParamCurve :: v_writeBinary (FILE *f) {
-	Data_writeBinary (x, f);
-	Data_writeBinary (y, f);
+	Data_writeBinary (x.get(), f);
+	Data_writeBinary (y.get(), f);
 }
 
-void structParamCurve :: v_readBinary (FILE *f) {
-	long saveVersion = Thing_version;
-	Thing_version = 2;
-	x = Thing_new (Sound);
-	y = Thing_new (Sound);
-	Data_readBinary (x, f);
-	Data_readBinary (y, f);
-	Thing_version = saveVersion;
-	xmin = x -> xmin > y -> xmin ? x -> xmin : y -> xmin;
-	xmax = x -> xmax < y -> xmax ? x -> xmax : y -> xmax;
+void structParamCurve :: v_readBinary (FILE *f, int /*formatVersion*/) {
+	our x = Thing_new (Sound);
+	our y = Thing_new (Sound);
+	Data_readBinary (our x.get(), f, 2);
+	Data_readBinary (our y.get(), f, 2);
+	our xmin = our x -> xmin > our y -> xmin ? our x -> xmin : our y -> xmin;
+	our xmax = our x -> xmax < our y -> xmax ? our x -> xmax : our y -> xmax;
 }
 
 void ParamCurve_init (ParamCurve me, Sound x, Sound y) {
 	if (x -> xmax <= y -> xmin || x -> xmin >= y -> xmax)
-		Melder_throw ("Domains do not overlap.");
+		Melder_throw (U"Domains do not overlap.");
 	my x = Data_copy (x);
 	my y = Data_copy (y);
 	my xmin = x -> xmin > y -> xmin ? x -> xmin : y -> xmin;
 	my xmax = x -> xmax < y -> xmax ? x -> xmax : y -> xmax;
 }
 
-ParamCurve ParamCurve_create (Sound x, Sound y) {
+autoParamCurve ParamCurve_create (Sound x, Sound y) {
 	try {
 		autoParamCurve me = Thing_new (ParamCurve);
 		ParamCurve_init (me.peek(), x, y);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("ParamCurve not created.");
+		Melder_throw (U"ParamCurve not created.");
 	}
 }
 
@@ -125,9 +122,9 @@ void ParamCurve_draw (ParamCurve me, Graphics g, double t1, double t2, double dt
 		t1 = tx1 > ty1 ? tx1 : ty1;
 		t2 = tx2 < ty2 ? tx2 : ty2;
 	}
-	if (x2 <= x1) Matrix_getWindowExtrema (my x, 0, 0, 1, 1, & x1, & x2);
+	if (x2 <= x1) Matrix_getWindowExtrema (my x.get(), 0, 0, 1, 1, & x1, & x2);
 	if (x1 == x2) { x1 -= 1.0; x2 += 1.0; }
-	if (y2 <= y1) Matrix_getWindowExtrema (my y, 0, 0, 1, 1, & y1, & y2);
+	if (y2 <= y1) Matrix_getWindowExtrema (my y.get(), 0, 0, 1, 1, & y1, & y2);
 	if (y1 == y2) { y1 -= 1.0; y2 += 1.0; }
 	if (dt <= 0.0)
 		dt = my x -> dx < my y -> dx ? my x -> dx : my y -> dx;
@@ -137,9 +134,9 @@ void ParamCurve_draw (ParamCurve me, Graphics g, double t1, double t2, double dt
 		autoNUMvector <double> y (1, numberOfPoints);
 		for (long i = 1; i <= numberOfPoints; i ++) {
 			double t = i == numberOfPoints ? t2 : t1 + (i - 1) * dt;
-			double index = Sampled_xToIndex (my x, t);
+			double index = Sampled_xToIndex (my x.get(), t);
 			x [i] = NUM_interpolate_sinc (my x -> z [1], my x -> nx, index, 50);
-			index = Sampled_xToIndex (my y, t);
+			index = Sampled_xToIndex (my y.get(), t);
 			y [i] = NUM_interpolate_sinc (my y -> z [1], my y -> nx, index, 50);
 		}
 		Graphics_setWindow (g, x1, x2, y1, y2);
@@ -149,15 +146,15 @@ void ParamCurve_draw (ParamCurve me, Graphics g, double t1, double t2, double dt
 	}
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
 void ParamCurve_swapXY (ParamCurve me) {
-	Sound help = my x;
-	my x = my y;
-	my y = help;
+	autoSound help = my x.move();
+	my x = my y.move();
+	my y = help.move();
 }
 
 /* End of file ParamCurve.cpp */
diff --git a/fon/ParamCurve.h b/fon/ParamCurve.h
index bcf9788..702bde4 100644
--- a/fon/ParamCurve.h
+++ b/fon/ParamCurve.h
@@ -2,7 +2,7 @@
 #define _ParamCurve_h_
 /* ParamCurve.h
  *
- * Copyright (C) 1992-2011,2012 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,11 +35,10 @@ oo_CLASS_CREATE (ParamCurve, Function);
 
 void ParamCurve_init (ParamCurve me, Sound x, Sound y);
 
-ParamCurve ParamCurve_create (Sound x, Sound y);
+autoParamCurve ParamCurve_create (Sound x, Sound y);
 /*
 	Return value:
-		a newly created ParamCurve object,
-		or NULL in case of failure.
+		a newly created ParamCurve object.
 	Failures:
 		Out of memory.
 		Domains do not overlap:
@@ -62,8 +61,6 @@ void ParamCurve_draw (ParamCurve me, Graphics g, double t1, double t2, double dt
 		dt <= 0.0: time step is the smaller of my x -> dx and my y -> dx.
 		x2 <= x1: autoscaling along horizontal axis.
 		y2 <= y1: autoscaling along vertical axis.
-	Return value:
-		1 if OK, 0 if out of memory.
 */
 
 void ParamCurve_swapXY (ParamCurve me);
diff --git a/fon/ParamCurve_def.h b/fon/ParamCurve_def.h
index 776e0ef..3baab4a 100644
--- a/fon/ParamCurve_def.h
+++ b/fon/ParamCurve_def.h
@@ -1,6 +1,6 @@
 /* ParamCurve_def.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,12 +21,12 @@
 #define ooSTRUCT ParamCurve
 oo_DEFINE_CLASS (ParamCurve, Function)
 
-	oo_OBJECT (Sound, 2, x)
-	oo_OBJECT (Sound, 2, y)
+	oo_AUTO_OBJECT (Sound, 2, x)
+	oo_AUTO_OBJECT (Sound, 2, y)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (ParamCurve)
diff --git a/fon/Photo.cpp b/fon/Photo.cpp
index fbbf21c..b19982b 100644
--- a/fon/Photo.cpp
+++ b/fon/Photo.cpp
@@ -1,6 +1,6 @@
 /* Photo.cpp
  *
- * Copyright (C) 2013,2014 Paul Boersma
+ * Copyright (C) 2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -52,17 +52,17 @@
 Thing_implement (Photo, SampledXY, 0);
 
 void structPhoto :: v_info () {
-	our structData :: v_info ();
-	MelderInfo_writeLine (L"xmin: ", Melder_double (our xmin));
-	MelderInfo_writeLine (L"xmax: ", Melder_double (our xmax));
-	MelderInfo_writeLine (L"Number of columns: ", Melder_integer (our nx));
-	MelderInfo_writeLine (L"dx: ", Melder_double (our dx), L" (-> sampling rate ", Melder_double (1.0 / our dx), L" )");
-	MelderInfo_writeLine (L"x1: ", Melder_double (our x1));
-	MelderInfo_writeLine (L"ymin: ", Melder_double (our ymin));
-	MelderInfo_writeLine (L"ymax: ", Melder_double (our ymax));
-	MelderInfo_writeLine (L"Number of rows: ", Melder_integer (our ny));
-	MelderInfo_writeLine (L"dy: ", Melder_double (our dy), L" (-> sampling rate ", Melder_double (1.0 / our dy), L" )");
-	MelderInfo_writeLine (L"y1: ", Melder_double (our y1));
+	our structDaata :: v_info ();
+	MelderInfo_writeLine (U"xmin: ", our xmin);
+	MelderInfo_writeLine (U"xmax: ", our xmax);
+	MelderInfo_writeLine (U"Number of columns: ", our nx);
+	MelderInfo_writeLine (U"dx: ", our dx, U" (-> sampling rate ", 1.0 / our dx, U" )");
+	MelderInfo_writeLine (U"x1: ", our x1);
+	MelderInfo_writeLine (U"ymin: ", our ymin);
+	MelderInfo_writeLine (U"ymax: ", our ymax);
+	MelderInfo_writeLine (U"Number of rows: ", our ny);
+	MelderInfo_writeLine (U"dy: ", our dy, U" (-> sampling rate ", 1.0 / our dy, U" )");
+	MelderInfo_writeLine (U"y1: ", our y1);
 }
 
 void Photo_init (Photo me,
@@ -85,7 +85,7 @@ Photo Photo_create
 		Photo_init (me.peek(), xmin, xmax, nx, dx, x1, ymin, ymax, ny, dy, y1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Photo object not created.");
+		Melder_throw (U"Photo object not created.");
 	}
 }
 
@@ -96,21 +96,21 @@ Photo Photo_createSimple (long numberOfRows, long numberOfColumns) {
 		                       0.5, numberOfRows    + 0.5, numberOfRows,    1, 1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Photo object not created.");
+		Melder_throw (U"Photo object not created.");
 	}
 }
 
 Photo Photo_readFromImageFile (MelderFile file) {
 	try {
 		#if defined (linux)
-			cairo_surface_t *surface = cairo_image_surface_create_from_png (Melder_peekWcsToUtf8 (file -> path));
+			cairo_surface_t *surface = cairo_image_surface_create_from_png (Melder_peek32to8 (file -> path));
 			//if (cairo_surface_status)
-			//	Melder_throw ("Error opening PNG file.");
+			//	Melder_throw (U"Error opening PNG file.");
 			long width = cairo_image_surface_get_width (surface);
 			long height = cairo_image_surface_get_height (surface);
 			if (width == 0 || height == 0) {
 				cairo_surface_destroy (surface);
-				Melder_throw ("Error reading PNG file.");
+				Melder_throw (U"Error reading PNG file.");
 			}
 			unsigned char *imageData = cairo_image_surface_get_data (surface);
 			long bytesPerRow = cairo_image_surface_get_stride (surface);
@@ -138,16 +138,16 @@ Photo Photo_readFromImageFile (MelderFile file) {
 				}
 			} else {
 				cairo_surface_destroy (surface);
-				Melder_throw ("Unsupported PNG format ", format, ".");
+				Melder_throw (U"Unsupported PNG format ", format, U".");
 			}
 			cairo_surface_destroy (surface);
 			return me.transfer();
 		#elif defined (_WIN32)
-			Gdiplus::Bitmap gdiplusBitmap (file -> path);
+			Gdiplus::Bitmap gdiplusBitmap (Melder_peek32toW (file -> path));
 			long width = gdiplusBitmap. GetWidth ();
 			long height = gdiplusBitmap. GetHeight ();
 			if (width == 0 || height == 0)
-				Melder_throw ("Error reading PNG file.");
+				Melder_throw (U"Error reading PNG file.");
 			autoPhoto me = Photo_createSimple (height, width);
 			for (long irow = 1; irow <= height; irow ++) {
 				for (long icol = 1; icol <= width; icol ++) {
@@ -161,26 +161,30 @@ Photo Photo_readFromImageFile (MelderFile file) {
 			}
 			return me.transfer();
 		#elif defined (macintosh)
-			autoPhoto me = NULL;
+			autoPhoto me;
 			char utf8 [500];
-			Melder_wcsTo8bitFileRepresentation_inline (file -> path, utf8);
-			CFStringRef path = CFStringCreateWithCString (NULL, utf8, kCFStringEncodingUTF8);
-			CFURLRef url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, false);
+			Melder_str32To8bitFileRepresentation_inline (file -> path, utf8);
+			CFStringRef path = CFStringCreateWithCString (nullptr, utf8, kCFStringEncodingUTF8);
+			CFURLRef url = CFURLCreateWithFileSystemPath (nullptr, path, kCFURLPOSIXPathStyle, false);
 			CFRelease (path);
-			CGImageSourceRef imageSource = CGImageSourceCreateWithURL (url, NULL);
+			CGImageSourceRef imageSource = CGImageSourceCreateWithURL (url, nullptr);
 			CFRelease (url);
-			if (imageSource == NULL)
-				Melder_throw ("Cannot open picture file ", file, ".");
-			CGImageRef image = CGImageSourceCreateImageAtIndex (imageSource, 0, NULL);
+			if (! imageSource)
+				Melder_throw (U"Cannot open picture file ", file, U".");
+			CGImageRef image = CGImageSourceCreateImageAtIndex (imageSource, 0, nullptr);
 			CFRelease (imageSource);
-			if (image != NULL) {
+			if (image) {
 				long width = CGImageGetWidth (image);
 				long height = CGImageGetHeight (image);
 				me.reset (Photo_createSimple (height, width));
 				long bitsPerPixel = CGImageGetBitsPerPixel (image);
 				long bitsPerComponent = CGImageGetBitsPerComponent (image);
 				long bytesPerRow = CGImageGetBytesPerRow (image);
-				trace ("%ld bits per pixel, %ld bits per component, %ld bytes per row", bitsPerPixel, bitsPerComponent, bytesPerRow);
+				trace (
+					bitsPerPixel, U" bits per pixel, ",
+					bitsPerComponent, U" bits per component, ",
+					bytesPerRow, U" bytes per row"
+				);
 				/*
 				 * Now we probably need to use:
 				 * CGColorSpaceRef CGImageGetColorSpace (CGImageRef image);
@@ -204,7 +208,7 @@ Photo Photo_readFromImageFile (MelderFile file) {
 			return me.transfer();
 		#endif
 	} catch (MelderError) {
-		Melder_throw ("Picture file ", file, " not opened as Photo.");
+		Melder_throw (U"Picture file ", file, U" not opened as Photo.");
 	}
 }
 
@@ -219,13 +223,13 @@ Photo Photo_readFromImageFile (MelderFile file) {
 #endif
 
 #ifdef linux
-	static void _lin_saveAsImageFile (Photo me, MelderFile file, const wchar_t *which) {
+	static void _lin_saveAsImageFile (Photo me, MelderFile file, const char32 *which) {
 		cairo_format_t format = CAIRO_FORMAT_ARGB32;
-		long bytesPerRow = cairo_format_stride_for_width (format, my nx);   // likely to be my nx * 4;
+		long bytesPerRow = cairo_format_stride_for_width (format, my nx);   // likely to be my nx * 4
 		long numberOfRows = my ny;
-		unsigned char *imageData = Melder_malloc_f (unsigned char, bytesPerRow * numberOfRows);
+		uint8 *imageData = Melder_malloc_f (uint8, bytesPerRow * numberOfRows);
 		for (long irow = 1; irow <= my ny; irow ++) {
-			uint8_t *rowAddress = imageData + bytesPerRow * (my ny - irow);
+			uint8 *rowAddress = imageData + bytesPerRow * (my ny - irow);
 			for (long icol = 1; icol <= my nx; icol ++) {
 				* rowAddress ++ = round (my d_blue         -> z [irow] [icol] * 255.0);
 				* rowAddress ++ = round (my d_green        -> z [irow] [icol] * 255.0);
@@ -235,13 +239,13 @@ Photo Photo_readFromImageFile (MelderFile file) {
 		}
 		cairo_surface_t *surface = cairo_image_surface_create_for_data (imageData,
 			format, my nx, my ny, bytesPerRow);
-		cairo_surface_write_to_png (surface, Melder_peekWcsToUtf8 (file -> path));
+		cairo_surface_write_to_png (surface, Melder_peek32to8 (file -> path));
 		cairo_surface_destroy (surface);
 	}
 #endif
 
 #ifdef _WIN32
-	static void _win_saveAsImageFile (Photo me, MelderFile file, const wchar_t *mimeType) {
+	static void _win_saveAsImageFile (Photo me, MelderFile file, const char32 *mimeType) {
 		Gdiplus::Bitmap gdiplusBitmap (my nx, my ny, PixelFormat32bppARGB);
 		for (long irow = 1; irow <= my ny; irow ++) {
 			for (long icol = 1; icol <= my nx; icol ++) {
@@ -259,15 +263,15 @@ Photo Photo_readFromImageFile (MelderFile file) {
 		UINT numberOfImageEncoders, sizeOfImageEncoderArray;
 		Gdiplus::GetImageEncodersSize (& numberOfImageEncoders, & sizeOfImageEncoderArray);
 		if (sizeOfImageEncoderArray == 0)
-			Melder_throw ("Cannot find image encoders.");
+			Melder_throw (U"Cannot find image encoders.");
 		Gdiplus::ImageCodecInfo *imageEncoderInfos = Melder_malloc (Gdiplus::ImageCodecInfo, sizeOfImageEncoderArray);
 		Gdiplus::GetImageEncoders (numberOfImageEncoders, sizeOfImageEncoderArray, imageEncoderInfos);
 		for (int iencoder = 0; iencoder < numberOfImageEncoders; iencoder ++) {
-			trace ("Supported MIME type: %ls", imageEncoderInfos [iencoder]. MimeType);
-			if (Melder_wcsequ (imageEncoderInfos [iencoder]. MimeType, mimeType)) {
-				Gdiplus::EncoderParameters *p = NULL;
+			trace (U"Supported MIME type: ", Melder_peekWto32 (imageEncoderInfos [iencoder]. MimeType));
+			if (str32equ (Melder_peekWto32 (imageEncoderInfos [iencoder]. MimeType), mimeType)) {
+				Gdiplus::EncoderParameters *p = nullptr;
 				Gdiplus::EncoderParameters encoderParameters;
-				if (Melder_wcsequ (mimeType, L"image/jpeg")) {
+				if (str32equ (mimeType, U"image/jpeg")) {
 					encoderParameters. Count = 1;
 					GUID guid = { 0x1D5BE4B5, 0xFA4A, 0x452D, { 0x9C, 0xDD, 0x5D, 0xB3, 0x51, 0x05, 0xE7, 0xEB }};  // EncoderQuality
 					encoderParameters. Parameter [0]. Guid = guid;
@@ -277,12 +281,12 @@ Photo Photo_readFromImageFile (MelderFile file) {
 					encoderParameters. Parameter [0]. Value = & quality;
 					p = & encoderParameters;
 				}
-				gdiplusBitmap. Save (file -> path, & imageEncoderInfos [iencoder]. Clsid, p);
+				gdiplusBitmap. Save (Melder_peek32toW (file -> path), & imageEncoderInfos [iencoder]. Clsid, p);
 				Melder_free (imageEncoderInfos);
 				return;
 			}
 		}
-		Melder_throw ("Unknown MIME type ", mimeType, ".");
+		Melder_throw (U"Unknown MIME type ", mimeType, U".");
 	}
 #endif
 
@@ -294,30 +298,30 @@ Photo Photo_readFromImageFile (MelderFile file) {
 		for (long irow = 1; irow <= my ny; irow ++) {
 			uint8_t *rowAddress = imageData + bytesPerRow * (my ny - irow);
 			for (long icol = 1; icol <= my nx; icol ++) {
-				* rowAddress ++ = round (my d_red          -> z [irow] [icol] * 255.0);
-				* rowAddress ++ = round (my d_green        -> z [irow] [icol] * 255.0);
-				* rowAddress ++ = round (my d_blue         -> z [irow] [icol] * 255.0);
-				* rowAddress ++ = 255 - round (my d_transparency -> z [irow] [icol] * 255.0);
+				* rowAddress ++ = (uint8) lround (my d_red          -> z [irow] [icol] * 255.0);   // BUG: should be tested for speed
+				* rowAddress ++ = (uint8) lround (my d_green        -> z [irow] [icol] * 255.0);
+				* rowAddress ++ = (uint8) lround (my d_blue         -> z [irow] [icol] * 255.0);
+				* rowAddress ++ = 255 - (uint8) lround (my d_transparency -> z [irow] [icol] * 255.0);
 			}
 		}
-		static CGColorSpaceRef colourSpace = NULL;
-		if (colourSpace == NULL) {
+		static CGColorSpaceRef colourSpace = nullptr;
+		if (! colourSpace) {
 			colourSpace = CGColorSpaceCreateWithName (kCGColorSpaceGenericRGB);   // used to be kCGColorSpaceUserRGB
-			Melder_assert (colourSpace != NULL);
+			Melder_assert (colourSpace);
 		}
-		CGDataProviderRef dataProvider = CGDataProviderCreateWithData (NULL,
+		CGDataProviderRef dataProvider = CGDataProviderCreateWithData (nullptr,
 			imageData,
 			bytesPerRow * numberOfRows,
 			_mac_releaseDataCallback   // needed?
 		);
-		Melder_assert (dataProvider != NULL);
+		Melder_assert (dataProvider);
 		CGImageRef image = CGImageCreate (my nx, numberOfRows,
-			8, 32, bytesPerRow, colourSpace, kCGImageAlphaNone, dataProvider, NULL, false, kCGRenderingIntentDefault);
+			8, 32, bytesPerRow, colourSpace, kCGImageAlphaNone, dataProvider, nullptr, false, kCGRenderingIntentDefault);
 		CGDataProviderRelease (dataProvider);
-		Melder_assert (image != NULL);
-		NSString *path = (NSString *) Melder_peekWcsToCfstring (Melder_fileToPath (file));
+		Melder_assert (image);
+		NSString *path = (NSString *) Melder_peek32toCfstring (Melder_fileToPath (file));
 		CFURLRef url = (CFURLRef) [NSURL   fileURLWithPath: path   isDirectory: NO];
-		CGImageDestinationRef destination = CGImageDestinationCreateWithURL (url, (CFStringRef) which, 1, NULL);
+		CGImageDestinationRef destination = CGImageDestinationCreateWithURL (url, (CFStringRef) which, 1, nullptr);
 		CGImageDestinationAddImage (destination, image, nil);
 
 		if (! CGImageDestinationFinalize (destination)) {
@@ -332,17 +336,17 @@ Photo Photo_readFromImageFile (MelderFile file) {
 
 void Photo_saveAsPNG (Photo me, MelderFile file) {
 	#if defined (_WIN32)
-		_win_saveAsImageFile (me, file, L"image/png");
+		_win_saveAsImageFile (me, file, U"image/png");
 	#elif defined (macintosh)
 		_mac_saveAsImageFile (me, file, kUTTypePNG);
 	#elif defined (linux)
-		_lin_saveAsImageFile (me, file, L"image/png");
+		_lin_saveAsImageFile (me, file, U"image/png");
 	#endif
 }
 
 void Photo_saveAsTIFF (Photo me, MelderFile file) {
 	#if defined (_WIN32)
-		_win_saveAsImageFile (me, file, L"image/tiff");
+		_win_saveAsImageFile (me, file, U"image/tiff");
 	#elif defined (macintosh)
 		_mac_saveAsImageFile (me, file, kUTTypeTIFF);
 	#else
@@ -353,7 +357,7 @@ void Photo_saveAsTIFF (Photo me, MelderFile file) {
 
 void Photo_saveAsGIF (Photo me, MelderFile file) {
 	#if defined (_WIN32)
-		_win_saveAsImageFile (me, file, L"image/gif");
+		_win_saveAsImageFile (me, file, U"image/gif");
 	#elif defined (macintosh)
 		_mac_saveAsImageFile (me, file, kUTTypeGIF);
 	#else
@@ -364,7 +368,7 @@ void Photo_saveAsGIF (Photo me, MelderFile file) {
 
 void Photo_saveAsWindowsBitmapFile (Photo me, MelderFile file) {
 	#if defined (_WIN32)
-		_win_saveAsImageFile (me, file, L"image/bmp");
+		_win_saveAsImageFile (me, file, U"image/bmp");
 	#elif defined (macintosh)
 		_mac_saveAsImageFile (me, file, kUTTypeBMP);
 	#else
@@ -375,7 +379,7 @@ void Photo_saveAsWindowsBitmapFile (Photo me, MelderFile file) {
 
 void Photo_saveAsJPEG (Photo me, MelderFile file) {
 	#if defined (_WIN32)
-		_win_saveAsImageFile (me, file, L"image/jpeg");
+		_win_saveAsImageFile (me, file, U"image/jpeg");
 	#elif defined (macintosh)
 		_mac_saveAsImageFile (me, file, kUTTypeJPEG);
 	#else
@@ -386,7 +390,7 @@ void Photo_saveAsJPEG (Photo me, MelderFile file) {
 
 void Photo_saveAsJPEG2000 (Photo me, MelderFile file) {
 	#if defined (_WIN32)
-		_win_saveAsImageFile (me, file, L"image/jpeg2000");
+		_win_saveAsImageFile (me, file, U"image/jpeg2000");
 	#elif defined (macintosh)
 		_mac_saveAsImageFile (me, file, kUTTypeJPEG2000);
 	#else
@@ -397,7 +401,7 @@ void Photo_saveAsJPEG2000 (Photo me, MelderFile file) {
 
 void Photo_saveAsAppleIconFile (Photo me, MelderFile file) {
 	#if defined (_WIN32)
-		_win_saveAsImageFile (me, file, L"image/ICNS");
+		_win_saveAsImageFile (me, file, U"image/ICNS");
 	#elif defined (macintosh)
 		_mac_saveAsImageFile (me, file, kUTTypeAppleICNS);
 	#else
@@ -408,7 +412,7 @@ void Photo_saveAsAppleIconFile (Photo me, MelderFile file) {
 
 void Photo_saveAsWindowsIconFile (Photo me, MelderFile file) {
 	#if defined (_WIN32)
-		_win_saveAsImageFile (me, file, L"image/icon");
+		_win_saveAsImageFile (me, file, U"image/icon");
 	#elif defined (macintosh)
 		_mac_saveAsImageFile (me, file, kUTTypeICO);
 	#else
@@ -418,27 +422,19 @@ void Photo_saveAsWindowsIconFile (Photo me, MelderFile file) {
 }
 
 void Photo_replaceRed (Photo me, Matrix red) {
-	autoMatrix copy = Data_copy (red);
-	forget (my d_red);
-	my d_red = copy.transfer();
+	my d_red = Data_copy (red);
 }
 
 void Photo_replaceGreen (Photo me, Matrix green) {
-	autoMatrix copy = Data_copy (green);
-	forget (my d_green);
-	my d_green = copy.transfer();
+	my d_green = Data_copy (green);
 }
 
 void Photo_replaceBlue (Photo me, Matrix blue) {
-	autoMatrix copy = Data_copy (blue);
-	forget (my d_blue);
-	my d_blue = copy.transfer();
+	my d_blue = Data_copy (blue);
 }
 
 void Photo_replaceTransparency (Photo me, Matrix transparency) {
-	autoMatrix copy = Data_copy (transparency);
-	forget (my d_transparency);
-	my d_transparency = copy.transfer();
+	my d_transparency = Data_copy (transparency);
 }
 
 static void _Photo_cellArrayOrImage (Photo me, Graphics g, double xmin, double xmax, double ymin, double ymax, bool interpolate) {
@@ -448,7 +444,7 @@ static void _Photo_cellArrayOrImage (Photo me, Graphics g, double xmin, double x
 	Sampled_getWindowSamples    (me, xmin - 0.49999 * my dx, xmax + 0.49999 * my dx, & ixmin, & ixmax);
 	SampledXY_getWindowSamplesY (me, ymin - 0.49999 * my dy, ymax + 0.49999 * my dy, & iymin, & iymax);
 	if (ixmin > ixmax || iymin > iymax) {
-		Melder_fatal ("ixmin %ld ixmax %ld iymin %ld iymax %ld", ixmin, ixmax, iymin, iymax);
+		Melder_fatal (U"ixmin ", ixmin, U" ixmax ", ixmax, U" iymin ", iymin, U" iymax ", iymax);
 		return;
 	}
 	Graphics_setInner (g);
diff --git a/fon/Photo.h b/fon/Photo.h
index cabb569..df37bca 100644
--- a/fon/Photo.h
+++ b/fon/Photo.h
@@ -33,7 +33,7 @@ Photo Photo_create
 	 double ymin, double ymax, long ny, double dy, double y1);
 /*
 	Function:
-		return a new opaque black Photo, or NULL if out of memory.
+		return a new opaque black Photo.
 	Preconditions:
 		xmin <= xmax;   ymin <= ymax;
 		nx >= 1;  ny >= 1;
@@ -58,7 +58,7 @@ Photo Photo_create
 Photo Photo_createSimple (long numberOfRows, long numberOfColumns);
 /*
 	Function:
-		return a new opaque black Photo, or NULL if out of memory.
+		return a new opaque black Photo.
 	Preconditions:
 		numberOfRows >= 1;  numberOfColumns >= 1;
 	Postconditions:
diff --git a/fon/Photo_def.h b/fon/Photo_def.h
index 7203bf7..e0a6353 100644
--- a/fon/Photo_def.h
+++ b/fon/Photo_def.h
@@ -1,6 +1,6 @@
 /* Photo_def.h
  *
- * Copyright (C) 2013,2014 Paul Boersma
+ * Copyright (C) 2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,21 +21,42 @@
 #define ooSTRUCT Photo
 oo_DEFINE_CLASS (Photo, SampledXY)
 
-	oo_OBJECT (Matrix, 2, d_red)
-	oo_OBJECT (Matrix, 2, d_green)
-	oo_OBJECT (Matrix, 2, d_blue)
-	oo_OBJECT (Matrix, 2, d_transparency)
+	oo_AUTO_OBJECT (Matrix, 2, d_red)
+	oo_AUTO_OBJECT (Matrix, 2, d_green)
+	oo_AUTO_OBJECT (Matrix, 2, d_blue)
+	oo_AUTO_OBJECT (Matrix, 2, d_transparency)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
-			virtual bool v_hasGetNrow      () { return true; }   virtual double v_getNrow      ()        { return ny; }
-			virtual bool v_hasGetNcol      () { return true; }   virtual double v_getNcol      ()        { return nx; }
-			virtual bool v_hasGetYmin      () { return true; }   virtual double v_getYmin      ()        { return ymin; }
-			virtual bool v_hasGetYmax      () { return true; }   virtual double v_getYmax      ()        { return ymax; }
-			virtual bool v_hasGetNy        () { return true; }   virtual double v_getNy        ()        { return ny; }
-			virtual bool v_hasGetDy        () { return true; }   virtual double v_getDy        ()        { return dy; }
-			virtual bool v_hasGetY         () { return true; }   virtual double v_getY         (long iy) { return y1 + (iy - 1) * dy; }
+		void v_info ()
+			override;
+		bool v_hasGetNrow ()
+			override { return true; }
+		double v_getNrow ()
+			override { return ny; }
+		bool v_hasGetNcol ()
+			override { return true; }
+		double v_getNcol ()
+			override { return nx; }
+		bool v_hasGetYmin ()
+			override { return true; }
+		double v_getYmin ()
+			override { return ymin; }
+		bool v_hasGetYmax ()
+			override { return true; }
+		double v_getYmax ()
+			override { return ymax; }
+		bool v_hasGetNy ()
+			override { return true; }
+		double v_getNy ()
+			override { return ny; }
+		bool v_hasGetDy ()
+			override { return true; }
+		double v_getDy ()
+			override { return dy; }
+		bool v_hasGetY ()
+			override { return true; }
+		double v_getY (long iy)
+			override { return y1 + (iy - 1) * dy; }
 	#endif
 
 oo_END_CLASS (Photo)
diff --git a/fon/Pitch.cpp b/fon/Pitch.cpp
index 7f3ed01..b346f2b 100644
--- a/fon/Pitch.cpp
+++ b/fon/Pitch.cpp
@@ -1,6 +1,6 @@
 /* Pitch.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -60,35 +60,35 @@ int structPitch :: v_getMaximumUnit (long ilevel) {
 	return ilevel == Pitch_LEVEL_FREQUENCY ? kPitch_unit_MAX : Pitch_STRENGTH_UNIT_max;
 }
 
-const wchar_t * structPitch :: v_getUnitText (long ilevel, int unit, unsigned long flags) {
+const char32 * structPitch :: v_getUnitText (long ilevel, int unit, unsigned long flags) {
 	if (ilevel == Pitch_LEVEL_FREQUENCY) {
 		return
 			unit == kPitch_unit_HERTZ ?
-				flags & Function_UNIT_TEXT_MENU ? L"Hertz" : L"Hz" :
+				flags & Function_UNIT_TEXT_MENU ? U"Hertz" : U"Hz" :
 			unit == kPitch_unit_HERTZ_LOGARITHMIC ?
-				flags & Function_UNIT_TEXT_MENU ? L"Hertz (logarithmic)" : (flags & Function_UNIT_TEXT_SHORT) && (flags & Function_UNIT_TEXT_GRAPHICAL) ? L"%%Hz%" : L"Hz" :
-			unit == kPitch_unit_MEL ? L"mel" :
+				flags & Function_UNIT_TEXT_MENU ? U"Hertz (logarithmic)" : (flags & Function_UNIT_TEXT_SHORT) && (flags & Function_UNIT_TEXT_GRAPHICAL) ? U"%%Hz%" : U"Hz" :
+			unit == kPitch_unit_MEL ? U"mel" :
 			unit == kPitch_unit_LOG_HERTZ ?
-				flags & Function_UNIT_TEXT_MENU ? L"logHertz" : L"logHz" :
+				flags & Function_UNIT_TEXT_MENU ? U"logHertz" : U"logHz" :
 			unit == kPitch_unit_SEMITONES_1 ?
-				flags & Function_UNIT_TEXT_SHORT ? L"st__1_" : flags & Function_UNIT_TEXT_GRAPHICAL ? L"semitones %%re% 1 Hz" : L"semitones re 1 Hz" :
+				flags & Function_UNIT_TEXT_SHORT ? U"st__1_" : flags & Function_UNIT_TEXT_GRAPHICAL ? U"semitones %%re% 1 Hz" : U"semitones re 1 Hz" :
 			unit == kPitch_unit_SEMITONES_100 ?
-				flags & Function_UNIT_TEXT_SHORT ? L"st__100_" : flags & Function_UNIT_TEXT_GRAPHICAL ? L"semitones %%re% 100 Hz" : L"semitones re 100 Hz" :
+				flags & Function_UNIT_TEXT_SHORT ? U"st__100_" : flags & Function_UNIT_TEXT_GRAPHICAL ? U"semitones %%re% 100 Hz" : U"semitones re 100 Hz" :
 			unit == kPitch_unit_SEMITONES_200 ?
-				flags & Function_UNIT_TEXT_SHORT ? L"st__200_" : flags & Function_UNIT_TEXT_GRAPHICAL ? L"semitones %%re% 200 Hz" : L"semitones re 200 Hz" :
+				flags & Function_UNIT_TEXT_SHORT ? U"st__200_" : flags & Function_UNIT_TEXT_GRAPHICAL ? U"semitones %%re% 200 Hz" : U"semitones re 200 Hz" :
 			unit == kPitch_unit_SEMITONES_440 ?
-				flags & Function_UNIT_TEXT_SHORT ? L"st__a_" : flags & Function_UNIT_TEXT_GRAPHICAL ? L"semitones %%re% 440 Hz" : L"semitones re 440 Hz" :
+				flags & Function_UNIT_TEXT_SHORT ? U"st__a_" : flags & Function_UNIT_TEXT_GRAPHICAL ? U"semitones %%re% 440 Hz" : U"semitones re 440 Hz" :
 			unit == kPitch_unit_ERB ?
-				flags & Function_UNIT_TEXT_SHORT ? L"erb" : L"ERB" :
-			L"";
+				flags & Function_UNIT_TEXT_SHORT ? U"erb" : U"ERB" :
+			U"";
 	} else if (ilevel == Pitch_LEVEL_STRENGTH) {
 		return
-			unit == Pitch_STRENGTH_UNIT_AUTOCORRELATION ? L"" :
-			unit == Pitch_STRENGTH_UNIT_NOISE_HARMONICS_RATIO ? L"" :
-			unit == Pitch_STRENGTH_UNIT_HARMONICS_NOISE_DB ? L"dB" :
-			L"";
+			unit == Pitch_STRENGTH_UNIT_AUTOCORRELATION ? U"" :
+			unit == Pitch_STRENGTH_UNIT_NOISE_HARMONICS_RATIO ? U"" :
+			unit == Pitch_STRENGTH_UNIT_HARMONICS_NOISE_DB ? U"dB" :
+			U"";
 	}
-	return L"unknown";
+	return U"unknown";
 }
 
 bool structPitch :: v_isUnitLogarithmic (long ilevel, int unit) {
@@ -153,7 +153,7 @@ bool Pitch_isVoiced_i (Pitch me, long iframe) {
 }
 
 bool Pitch_isVoiced_t (Pitch me, double time) {
-	return NUMdefined (Sampled_getValueAtX (me, time, Pitch_LEVEL_FREQUENCY, kPitch_unit_HERTZ, FALSE));
+	return NUMdefined (Sampled_getValueAtX (me, time, Pitch_LEVEL_FREQUENCY, kPitch_unit_HERTZ, false));
 }
 
 double Pitch_getValueAtTime (Pitch me, double time, int unit, int interpolate) {
@@ -169,11 +169,11 @@ long Pitch_countVoicedFrames (Pitch me) {
 }
 
 double Pitch_getMean (Pitch me, double tmin, double tmax, int unit) {
-	return Sampled_getMean (me, tmin, tmax, Pitch_LEVEL_FREQUENCY, unit, TRUE);
+	return Sampled_getMean (me, tmin, tmax, Pitch_LEVEL_FREQUENCY, unit, true);
 }
 
 double Pitch_getMeanStrength (Pitch me, double tmin, double tmax, int unit) {
-	return Sampled_getMean (me, tmin, tmax, Pitch_LEVEL_STRENGTH, unit, TRUE);
+	return Sampled_getMean (me, tmin, tmax, Pitch_LEVEL_STRENGTH, unit, true);
 }
 
 double Pitch_getQuantile (Pitch me, double tmin, double tmax, double quantile, int unit) {
@@ -185,7 +185,7 @@ double Pitch_getQuantile (Pitch me, double tmin, double tmax, double quantile, i
 }
 
 double Pitch_getStandardDeviation (Pitch me, double tmin, double tmax, int unit) {
-	return Sampled_getStandardDeviation (me, tmin, tmax, Pitch_LEVEL_FREQUENCY, unit, TRUE);
+	return Sampled_getStandardDeviation (me, tmin, tmax, Pitch_LEVEL_FREQUENCY, unit, true);
 }
 
 #define MEL(f)  NUMhertzToMel (f)
@@ -204,13 +204,13 @@ void Pitch_getMaximumAndTime (Pitch me, double tmin, double tmax, int unit, int
 
 double Pitch_getMaximum (Pitch me, double tmin, double tmax, int unit, int interpolate) {
 	double maximum;
-	Pitch_getMaximumAndTime (me, tmin, tmax, unit, interpolate, & maximum, NULL);
+	Pitch_getMaximumAndTime (me, tmin, tmax, unit, interpolate, & maximum, nullptr);
 	return maximum;
 }
 
 double Pitch_getTimeOfMaximum (Pitch me, double tmin, double tmax, int unit, int interpolate) {
 	double time;
-	Pitch_getMaximumAndTime (me, tmin, tmax, unit, interpolate, NULL, & time);
+	Pitch_getMaximumAndTime (me, tmin, tmax, unit, interpolate, nullptr, & time);
 	return time;
 }
 
@@ -226,35 +226,35 @@ void Pitch_getMinimumAndTime (Pitch me, double tmin, double tmax, int unit, int
 
 double Pitch_getMinimum (Pitch me, double tmin, double tmax, int unit, int interpolate) {
 	double minimum;
-	Pitch_getMinimumAndTime (me, tmin, tmax, unit, interpolate, & minimum, NULL);
+	Pitch_getMinimumAndTime (me, tmin, tmax, unit, interpolate, & minimum, nullptr);
 	return minimum;
 }
 
 double Pitch_getTimeOfMinimum (Pitch me, double tmin, double tmax, int unit, int interpolate) {
 	double time;
-	Pitch_getMinimumAndTime (me, tmin, tmax, unit, interpolate, NULL, & time);
+	Pitch_getMinimumAndTime (me, tmin, tmax, unit, interpolate, nullptr, & time);
 	return time;
 }
 
 static long Pitch_getMeanAbsoluteSlope (Pitch me,
 	double *out_hertz, double *out_mel, double *out_semitones, double *out_erb, double *out_withoutOctaveJumps)
 {
-	long firstVoicedFrame = 0, lastVoicedFrame = 0, nVoiced = 0, i;
+	long firstVoicedFrame = 0, lastVoicedFrame = 0, nVoiced = 0;
 	autoNUMvector <double> frequencies (1, my nx);
-	for (i = 1; i <= my nx; i ++) {
+	for (long i = 1; i <= my nx; i ++) {
 		double frequency = my frame [i]. candidate [1]. frequency;
 		frequencies [i] = frequency > 0.0 && frequency < my ceiling ? frequency : 0.0;
-		if (frequencies [i]) nVoiced ++;
+		if (frequencies [i] != 0.0) nVoiced ++;
 	}
-	for (i = 1; i <= my nx; i ++)   // look for first voiced frame
+	for (long i = 1; i <= my nx; i ++)   // look for first voiced frame
 		if (frequencies [i] != 0.0) { firstVoicedFrame = i; break; }
-	for (i = my nx; i >= 1; i --)   // look for last voiced frame
+	for (long i = my nx; i >= 1; i --)   // look for last voiced frame
 		if (frequencies [i] != 0.0) { lastVoicedFrame = i; break; }
 	if (nVoiced > 1) {
 		int ilast = firstVoicedFrame;
 		double span = (lastVoicedFrame - firstVoicedFrame) * my dx, flast = frequencies [ilast];
-		double slopeHz = 0, slopeMel = 0, slopeSemitones = 0, slopeErb = 0, slopeRobust = 0;
-		for (i = firstVoicedFrame + 1; i <= lastVoicedFrame; i ++) if (frequencies [i] != 0.0) {
+		double slopeHz = 0.0, slopeMel = 0.0, slopeSemitones = 0.0, slopeErb = 0.0, slopeRobust = 0.0;
+		for (long i = firstVoicedFrame + 1; i <= lastVoicedFrame; i ++) if (frequencies [i] != 0.0) {
 			double localStepSemitones = fabs (SEMITONES (frequencies [i]) - SEMITONES (flast));
 			slopeHz += fabs (frequencies [i] - flast);
 			slopeMel += fabs (MEL (frequencies [i]) - MEL (flast));
@@ -264,7 +264,7 @@ static long Pitch_getMeanAbsoluteSlope (Pitch me,
 			if (localStepSemitones > 6.0) localStepSemitones = 12.0 - localStepSemitones;
 			slopeRobust += localStepSemitones;
 			ilast = i;
-			flast = frequencies [i];
+			flast = frequencies [ilast];
 		}
 		if (out_hertz) *out_hertz = slopeHz / span;
 		if (out_mel) *out_mel = slopeMel / span;
@@ -282,38 +282,38 @@ static long Pitch_getMeanAbsoluteSlope (Pitch me,
 }
 
 long Pitch_getMeanAbsSlope_hertz (Pitch me, double *slope) {
-	return Pitch_getMeanAbsoluteSlope (me, slope, NULL, NULL, NULL, NULL);
+	return Pitch_getMeanAbsoluteSlope (me, slope, nullptr, nullptr, nullptr, nullptr);
 }
 
 long Pitch_getMeanAbsSlope_mel (Pitch me, double *slope) {
-	return Pitch_getMeanAbsoluteSlope (me, NULL, slope, NULL, NULL, NULL);
+	return Pitch_getMeanAbsoluteSlope (me, nullptr, slope, nullptr, nullptr, nullptr);
 }
 
 long Pitch_getMeanAbsSlope_semitones (Pitch me, double *slope) {
-	return Pitch_getMeanAbsoluteSlope (me, NULL, NULL, slope, NULL, NULL);
+	return Pitch_getMeanAbsoluteSlope (me, nullptr, nullptr, slope, nullptr, nullptr);
 }
 
 long Pitch_getMeanAbsSlope_erb (Pitch me, double *slope) {
-	return Pitch_getMeanAbsoluteSlope (me, NULL, NULL, NULL, slope, NULL);
+	return Pitch_getMeanAbsoluteSlope (me, nullptr, nullptr, nullptr, slope, nullptr);
 }
 
 long Pitch_getMeanAbsSlope_noOctave (Pitch me, double *slope) {
-	return Pitch_getMeanAbsoluteSlope (me, NULL, NULL, NULL, NULL, slope);
+	return Pitch_getMeanAbsoluteSlope (me, nullptr, nullptr, nullptr, nullptr, slope);
 }
 
 void structPitch :: v_info () {
 	long nVoiced;
 	autoNUMvector <double> frequencies (Sampled_getSortedValues (this, Pitch_LEVEL_FREQUENCY, kPitch_unit_HERTZ, & nVoiced), 1);
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"Time sampling:");
-	MelderInfo_writeLine (L"   Number of frames: ", Melder_integer (nx), L" (", Melder_integer (nVoiced), L" voiced)");
-	MelderInfo_writeLine (L"   Time step: ", Melder_double (dx), L" seconds");
-	MelderInfo_writeLine (L"   First frame centred at: ", Melder_double (x1), L" seconds");
-	MelderInfo_writeLine (L"Ceiling at: ", Melder_double (ceiling), L" Hz");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"Time sampling:");
+	MelderInfo_writeLine (U"   Number of frames: ", nx, U" (", nVoiced, U" voiced)");
+	MelderInfo_writeLine (U"   Time step: ", dx, U" seconds");
+	MelderInfo_writeLine (U"   First frame centred at: ", x1, U" seconds");
+	MelderInfo_writeLine (U"Ceiling at: ", ceiling, U" Hz");
 
 	if (nVoiced >= 1) {   // quantiles
 		double quantile10, quantile16, quantile50, quantile84, quantile90;
@@ -322,59 +322,59 @@ void structPitch :: v_info () {
 		quantile50 = NUMquantile (nVoiced, frequencies.peek(), 0.50);   // median
 		quantile84 = NUMquantile (nVoiced, frequencies.peek(), 0.84);
 		quantile90 = NUMquantile (nVoiced, frequencies.peek(), 0.90);
-		MelderInfo_writeLine (L"\nEstimated quantiles:");
-		MelderInfo_write (L"   10% = ", Melder_single (quantile10), L" Hz = ", Melder_single (MEL (quantile10)), L" Mel = ");
-		MelderInfo_writeLine (Melder_single (SEMITONES (quantile10)), L" semitones above 100 Hz = ", Melder_single (ERB (quantile10)), L" ERB");
-		MelderInfo_write (L"   16% = ", Melder_single (quantile16), L" Hz = ", Melder_single (MEL (quantile16)), L" Mel = ");
-		MelderInfo_writeLine (Melder_single (SEMITONES (quantile16)), L" semitones above 100 Hz = ", Melder_single (ERB (quantile16)), L" ERB");
-		MelderInfo_write (L"   50% = ", Melder_single (quantile50), L" Hz = ", Melder_single (MEL (quantile50)), L" Mel = ");
-		MelderInfo_writeLine (Melder_single (SEMITONES (quantile50)), L" semitones above 100 Hz = ", Melder_single (ERB (quantile50)), L" ERB");
-		MelderInfo_write (L"   84% = ", Melder_single (quantile84), L" Hz = ", Melder_single (MEL (quantile84)), L" Mel = ");
-		MelderInfo_writeLine (Melder_single (SEMITONES (quantile84)), L" semitones above 100 Hz = ", Melder_single (ERB (quantile84)), L" ERB");
-		MelderInfo_write (L"   90% = ", Melder_single (quantile90), L" Hz = ", Melder_single (MEL (quantile90)), L" Mel = ");
-		MelderInfo_writeLine (Melder_single (SEMITONES (quantile90)), L" semitones above 100 Hz = ", Melder_single (ERB (quantile90)), L" ERB");
+		MelderInfo_writeLine (U"\nEstimated quantiles:");
+		MelderInfo_write (U"   10% = ", Melder_single (quantile10), U" Hz = ", Melder_single (MEL (quantile10)), U" Mel = ");
+		MelderInfo_writeLine (Melder_single (SEMITONES (quantile10)), U" semitones above 100 Hz = ", Melder_single (ERB (quantile10)), U" ERB");
+		MelderInfo_write (U"   16% = ", Melder_single (quantile16), U" Hz = ", Melder_single (MEL (quantile16)), U" Mel = ");
+		MelderInfo_writeLine (Melder_single (SEMITONES (quantile16)), U" semitones above 100 Hz = ", Melder_single (ERB (quantile16)), U" ERB");
+		MelderInfo_write (U"   50% = ", Melder_single (quantile50), U" Hz = ", Melder_single (MEL (quantile50)), U" Mel = ");
+		MelderInfo_writeLine (Melder_single (SEMITONES (quantile50)), U" semitones above 100 Hz = ", Melder_single (ERB (quantile50)), U" ERB");
+		MelderInfo_write (U"   84% = ", Melder_single (quantile84), U" Hz = ", Melder_single (MEL (quantile84)), U" Mel = ");
+		MelderInfo_writeLine (Melder_single (SEMITONES (quantile84)), U" semitones above 100 Hz = ", Melder_single (ERB (quantile84)), U" ERB");
+		MelderInfo_write (U"   90% = ", Melder_single (quantile90), U" Hz = ", Melder_single (MEL (quantile90)), U" Mel = ");
+		MelderInfo_writeLine (Melder_single (SEMITONES (quantile90)), U" semitones above 100 Hz = ", Melder_single (ERB (quantile90)), U" ERB");
 		if (nVoiced > 1) {
 			double corr = sqrt (nVoiced / (nVoiced - 1.0));
-			MelderInfo_writeLine (L"\nEstimated spreading:");
-			MelderInfo_write (L"   84%-median = ", Melder_half ((quantile84 - quantile50) * corr), L" Hz = ", Melder_half ((MEL (quantile84) - MEL (quantile50)) * corr), L" Mel = ");
-			MelderInfo_writeLine (Melder_half ((SEMITONES (quantile84) - SEMITONES (quantile50)) * corr), L" semitones = ", Melder_half ((ERB (quantile84) - ERB (quantile50)) * corr), L" ERB");
-			MelderInfo_write (L"   median-16% = ", Melder_half ((quantile50 - quantile16) * corr), L" Hz = ", Melder_half ((MEL (quantile50) - MEL (quantile16)) * corr), L" Mel = ");
-			MelderInfo_writeLine (Melder_half ((SEMITONES (quantile50) - SEMITONES (quantile16)) * corr), L" semitones = ", Melder_half ((ERB (quantile50) - ERB (quantile16)) * corr), L" ERB");
-			MelderInfo_write (L"   90%-10% = ", Melder_half ((quantile90 - quantile10) * corr), L" Hz = ", Melder_half ((MEL (quantile90) - MEL (quantile10)) * corr), L" Mel = ");
-			MelderInfo_writeLine (Melder_half ((SEMITONES (quantile90) - SEMITONES (quantile10)) * corr), L" semitones = ", Melder_half ((ERB (quantile90) - ERB (quantile10)) * corr), L" ERB");
+			MelderInfo_writeLine (U"\nEstimated spreading:");
+			MelderInfo_write (U"   84%-median = ", Melder_half ((quantile84 - quantile50) * corr), U" Hz = ", Melder_half ((MEL (quantile84) - MEL (quantile50)) * corr), U" Mel = ");
+			MelderInfo_writeLine (Melder_half ((SEMITONES (quantile84) - SEMITONES (quantile50)) * corr), U" semitones = ", Melder_half ((ERB (quantile84) - ERB (quantile50)) * corr), U" ERB");
+			MelderInfo_write (U"   median-16% = ", Melder_half ((quantile50 - quantile16) * corr), U" Hz = ", Melder_half ((MEL (quantile50) - MEL (quantile16)) * corr), U" Mel = ");
+			MelderInfo_writeLine (Melder_half ((SEMITONES (quantile50) - SEMITONES (quantile16)) * corr), U" semitones = ", Melder_half ((ERB (quantile50) - ERB (quantile16)) * corr), U" ERB");
+			MelderInfo_write (U"   90%-10% = ", Melder_half ((quantile90 - quantile10) * corr), U" Hz = ", Melder_half ((MEL (quantile90) - MEL (quantile10)) * corr), U" Mel = ");
+			MelderInfo_writeLine (Melder_half ((SEMITONES (quantile90) - SEMITONES (quantile10)) * corr), U" semitones = ", Melder_half ((ERB (quantile90) - ERB (quantile10)) * corr), U" ERB");
 		}
 	}
 	if (nVoiced >= 1) {   // extrema, range, mean and standard deviation
-		double minimum = Pitch_getMinimum (this, xmin, xmax, kPitch_unit_HERTZ, FALSE);
-		double maximum = Pitch_getMaximum (this, xmin, xmax, kPitch_unit_HERTZ, FALSE);
+		double minimum = Pitch_getMinimum (this, xmin, xmax, kPitch_unit_HERTZ, false);
+		double maximum = Pitch_getMaximum (this, xmin, xmax, kPitch_unit_HERTZ, false);
 		double meanHertz, meanMel, meanSemitones, meanErb;
-		MelderInfo_write (L"\nMinimum ", Melder_single (minimum), L" Hz = ", Melder_single (MEL (minimum)), L" Mel = ");
-		MelderInfo_writeLine (Melder_single (SEMITONES (minimum)), L" semitones above 100 Hz = ", Melder_single (ERB (minimum)), L" ERB");
-		MelderInfo_write (L"Maximum ", Melder_single (maximum), L" Hz = ", Melder_single (MEL (maximum)), L" Mel = ");
-		MelderInfo_writeLine (Melder_single (SEMITONES (maximum)), L" semitones above 100 Hz = ", Melder_single (ERB (maximum)), L" ERB");
-		MelderInfo_write (L"Range ", Melder_half (maximum - minimum), L" Hz = ", Melder_single (MEL (maximum) - MEL (minimum)), L" Mel = ");
-		MelderInfo_writeLine (Melder_half (SEMITONES (maximum) - SEMITONES (minimum)), L" semitones = ", Melder_half (ERB (maximum) - ERB (minimum)), L" ERB");
+		MelderInfo_write (U"\nMinimum ", Melder_single (minimum), U" Hz = ", Melder_single (MEL (minimum)), U" Mel = ");
+		MelderInfo_writeLine (Melder_single (SEMITONES (minimum)), U" semitones above 100 Hz = ", Melder_single (ERB (minimum)), U" ERB");
+		MelderInfo_write (U"Maximum ", Melder_single (maximum), U" Hz = ", Melder_single (MEL (maximum)), U" Mel = ");
+		MelderInfo_writeLine (Melder_single (SEMITONES (maximum)), U" semitones above 100 Hz = ", Melder_single (ERB (maximum)), U" ERB");
+		MelderInfo_write (U"Range ", Melder_half (maximum - minimum), U" Hz = ", Melder_single (MEL (maximum) - MEL (minimum)), U" Mel = ");
+		MelderInfo_writeLine (Melder_half (SEMITONES (maximum) - SEMITONES (minimum)), U" semitones = ", Melder_half (ERB (maximum) - ERB (minimum)), U" ERB");
 		meanHertz = Pitch_getMean (this, 0, 0, kPitch_unit_HERTZ);
 		meanMel = Pitch_getMean (this, 0, 0, kPitch_unit_MEL);
 		meanSemitones = Pitch_getMean (this, 0, 0, kPitch_unit_SEMITONES_100);
 		meanErb = Pitch_getMean (this, 0, 0, kPitch_unit_ERB);
-		MelderInfo_write (L"Average: ", Melder_single (meanHertz), L" Hz = ", Melder_single (meanMel), L" Mel = ");
-		MelderInfo_writeLine (Melder_single (meanSemitones), L" semitones above 100 Hz = ", Melder_single (meanErb), L" ERB");
+		MelderInfo_write (U"Average: ", Melder_single (meanHertz), U" Hz = ", Melder_single (meanMel), U" Mel = ");
+		MelderInfo_writeLine (Melder_single (meanSemitones), U" semitones above 100 Hz = ", Melder_single (meanErb), U" ERB");
 		if (nVoiced >= 2) {
 			double stdevHertz = Pitch_getStandardDeviation (this, 0, 0, kPitch_unit_HERTZ);
 			double stdevMel = Pitch_getStandardDeviation (this, 0, 0, kPitch_unit_MEL);
 			double stdevSemitones = Pitch_getStandardDeviation (this, 0, 0, kPitch_unit_SEMITONES_100);
 			double stdevErb = Pitch_getStandardDeviation (this, 0, 0, kPitch_unit_ERB);
-			MelderInfo_write (L"Standard deviation: ", Melder_half (stdevHertz), L" Hz = ", Melder_half (stdevMel), L" Mel = ");
-			MelderInfo_writeLine (Melder_half (stdevSemitones), L" semitones = ", Melder_half (stdevErb), L" ERB");
+			MelderInfo_write (U"Standard deviation: ", Melder_half (stdevHertz), U" Hz = ", Melder_half (stdevMel), U" Mel = ");
+			MelderInfo_writeLine (Melder_half (stdevSemitones), U" semitones = ", Melder_half (stdevErb), U" ERB");
 		}
 	}
 	if (nVoiced > 1) {   // variability: mean absolute slope
 		double slopeHertz, slopeMel, slopeSemitones, slopeErb, slopeWithoutOctaveJumps;
 		Pitch_getMeanAbsoluteSlope (this, & slopeHertz, & slopeMel, & slopeSemitones, & slopeErb, & slopeWithoutOctaveJumps);
-		MelderInfo_write (L"\nMean absolute slope: ", Melder_half (slopeHertz), L" Hz/s = ", Melder_half (slopeMel), L" Mel/s = ");
-		MelderInfo_writeLine (Melder_half (slopeSemitones), L" semitones/s = ", Melder_half (slopeErb), L" ERB/s");
-		MelderInfo_writeLine (L"Mean absolute slope without octave jumps: ", Melder_half (slopeWithoutOctaveJumps), L" semitones/s");
+		MelderInfo_write (U"\nMean absolute slope: ", Melder_half (slopeHertz), U" Hz/s = ", Melder_half (slopeMel), U" Mel/s = ");
+		MelderInfo_writeLine (Melder_half (slopeSemitones), U" semitones/s = ", Melder_half (slopeErb), U" ERB/s");
+		MelderInfo_writeLine (U"Mean absolute slope without octave jumps: ", Melder_half (slopeWithoutOctaveJumps), U" semitones/s");
 	}
 }
 
@@ -391,7 +391,7 @@ void Pitch_Frame_init (Pitch_Frame me, int nCandidates) {
 	my nCandidates = nCandidates;
 }
 
-Pitch Pitch_create (double tmin, double tmax, long nt, double dt, double t1,
+autoPitch Pitch_create (double tmin, double tmax, long nt, double dt, double t1,
 	double ceiling, int maxnCandidates)
 {
 	try {
@@ -406,9 +406,9 @@ Pitch Pitch_create (double tmin, double tmax, long nt, double dt, double t1,
 			Pitch_Frame_init (& my frame [it], 1);
 		}
 
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Pitch not created.");
+		Melder_throw (U"Pitch not created.");
 	}
 }
 
@@ -429,9 +429,15 @@ void Pitch_pathFinder (Pitch me, double silenceThreshold, double voicingThreshol
 	double octaveCost, double octaveJumpCost, double voicedUnvoicedCost,
 	double ceiling, int pullFormants)
 {
-	if (Melder_debug == 33) Melder_casual ("Pitch path finder:\nSilence threshold = %g\nVoicing threshold = %g\nOctave cost = %g\nOctave jump cost = %g\n"
-		"Voiced/unvoiced cost = %g\nCeiling = %g\nPull formants = %d", silenceThreshold, voicingThreshold, octaveCost, octaveJumpCost, voicedUnvoicedCost,
-		ceiling, pullFormants);
+	if (Melder_debug == 33)
+		Melder_casual (U"Pitch path finder:"
+			U"\nSilence threshold = ", silenceThreshold,
+			U"\nVoicing threshold = ", voicingThreshold,
+			U"\nOctave cost = ", octaveCost,
+			U"\nOctave jump cost = ", octaveJumpCost,
+			U"\nVoiced/unvoiced cost = ", voicedUnvoicedCost,
+			U"\nCeiling = ", ceiling,
+			U"\nPull formants = ", pullFormants);
 	try {
 		long maxnCandidates = Pitch_getMaxnCandidates (me);
 		long place;
@@ -510,7 +516,12 @@ void Pitch_pathFinder (Pitch me, double silenceThreshold, double voicingThreshol
 						maximum = value;
 						place = icand1;
 					} else if (value == maximum) {
-						if (Melder_debug == 33) Melder_casual ("A tie in frame %ld, current candidate %ld, previous candidate %ld", iframe, icand2, icand1);
+						if (Melder_debug == 33)
+							Melder_casual (
+								U"A tie in frame ", iframe,
+								U", current candidate ", icand2,
+								U", previous candidate ", icand1
+							);
 					}
 				}
 				curDelta [icand2] = maximum;
@@ -532,7 +543,11 @@ void Pitch_pathFinder (Pitch me, double silenceThreshold, double voicingThreshol
 		/* Backtracking: follow the path backwards. */
 
 		for (long iframe = my nx; iframe >= 1; iframe --) {
-			if (Melder_debug == 33) Melder_casual ("Frame %ld: swapping candidates 1 and %ld", iframe, place);
+			if (Melder_debug == 33)
+				Melder_casual (
+					U"Frame ", iframe, U":",
+					U" swapping candidates 1 and ", place
+				);
 			Pitch_Frame frame = & my frame [iframe];
 			structPitch_Candidate help = frame -> candidate [1];
 			frame -> candidate [1] = frame -> candidate [place];
@@ -543,7 +558,8 @@ void Pitch_pathFinder (Pitch me, double silenceThreshold, double voicingThreshol
 		/* Pull formants: devoice frames with frequencies between ceiling and ceiling2. */
 
 		if (ceiling2 > ceiling) {
-			if (Melder_debug == 33) Melder_casual ("Pulling formants...");
+			if (Melder_debug == 33)
+				Melder_casual (U"Pulling formants...");
 			for (long iframe = my nx; iframe >= 1; iframe --) {
 				Pitch_Frame frame = & my frame [iframe];
 				Pitch_Candidate winner = & frame -> candidate [1];
@@ -562,7 +578,7 @@ void Pitch_pathFinder (Pitch me, double silenceThreshold, double voicingThreshol
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": path not found.");
+		Melder_throw (me, U": path not found.");
 	}
 }
 
@@ -576,12 +592,9 @@ void Pitch_draw (Pitch me, Graphics g, double tmin, double tmax, double fmin, do
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, true, L"Time (s)");
+		Graphics_textBottom (g, true, U"Time (s)");
 		Graphics_marksBottom (g, 2, true, true, false);
-		static MelderString buffer = { 0 };
-		MelderString_empty (& buffer);
-		MelderString_append (& buffer, L"Pitch (", Function_getUnitText (me, Pitch_LEVEL_FREQUENCY, unit, Function_UNIT_TEXT_GRAPHICAL), L")");
-		Graphics_textLeft (g, TRUE, buffer.string);
+		Graphics_textLeft (g, true, Melder_cat (U"Pitch (", Function_getUnitText (me, Pitch_LEVEL_FREQUENCY, unit, Function_UNIT_TEXT_GRAPHICAL), U")"));
 		if (Function_isUnitLogarithmic (me, Pitch_LEVEL_FREQUENCY, unit)) {
 			Graphics_marksLeftLogarithmic (g, 6, true, true, false);
 		} else {
@@ -593,7 +606,7 @@ void Pitch_draw (Pitch me, Graphics g, double tmin, double tmax, double fmin, do
 void Pitch_difference (Pitch me, Pitch thee) {
 	long nuvtov = 0, nvtouv = 0, ndfdown = 0, ndfup = 0;
 	if (my nx != thy nx || my dx != thy dx || my x1 != thy x1) {
-		Melder_flushError ("Pitch_difference: these Pitches are not aligned.");
+		Melder_flushError (U"Pitch_difference: these Pitches are not aligned.");
 		return;
 	}
 	for (long i = 1; i <= my nx; i ++) {
@@ -602,10 +615,18 @@ void Pitch_difference (Pitch me, Pitch thee) {
 		int thyUnvoiced = thyf == 0 || thyf > thy ceiling;
 		double t = Sampled_indexToX (me, i);
 		if (myUnvoiced && ! thyUnvoiced) {
-			Melder_casual ("Frame %ld time %f: unvoiced to voiced.", i, t);
+			Melder_casual (
+				U"Frame ", i,
+				U" time ", t,
+				U": unvoiced to voiced."
+			);
 			nuvtov ++;
 		} else if (! myUnvoiced && thyUnvoiced) {
-			Melder_casual ("Frame %ld time %f: voiced to unvoiced.", i, t);
+			Melder_casual (
+				U"Frame ", i,
+				U" time ", t,
+				U": voiced to unvoiced."
+			);
 			nvtouv ++;
 		} else if (! myUnvoiced && ! thyUnvoiced) {
 			if (myf > thyf) {
@@ -618,15 +639,15 @@ void Pitch_difference (Pitch me, Pitch thee) {
 		}
 	}
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Difference between two Pitches:");
-	MelderInfo_writeLine (L"Unvoiced to voiced: ", Melder_integer (nuvtov), L" frames.");
-	MelderInfo_writeLine (L"Voiced to unvoiced: ", Melder_integer (nvtouv), L" frames.");
-	MelderInfo_writeLine (L"Downward frequency jump: ", Melder_integer (ndfdown), L" frames.");
-	MelderInfo_writeLine (L"Upward frequency jump: ", Melder_integer (ndfup), L" frames.");
+	MelderInfo_writeLine (U"Difference between two Pitches:");
+	MelderInfo_writeLine (U"Unvoiced to voiced: ", nuvtov, U" frames.");
+	MelderInfo_writeLine (U"Voiced to unvoiced: ", nvtouv, U" frames.");
+	MelderInfo_writeLine (U"Downward frequency jump: ", ndfdown, U" frames.");
+	MelderInfo_writeLine (U"Upward frequency jump: ", ndfup, U" frames.");
 	MelderInfo_close ();
 }
 
-Pitch Pitch_killOctaveJumps (Pitch me) {
+autoPitch Pitch_killOctaveJumps (Pitch me) {
 	try {
 		autoPitch thee = Pitch_create (my xmin, my xmax, my nx, my dx, my x1, my ceiling, 2);
 		long nVoiced = 0, nUp = 0;
@@ -644,7 +665,7 @@ Pitch Pitch_killOctaveJumps (Pitch me) {
 				lastFrequency = thy frame [i]. candidate [1]. frequency = f;
 			}
 		}
-		thy ceiling *= 2;   /* Make room for some octave jumps. */
+		thy ceiling *= 2.0;   // make room for some octave jumps
 		while (nUp > nVoiced / 2) {
 			for (long i = 1; i <= thy nx; i ++)
 				thy frame [i]. candidate [1]. frequency *= 0.5;
@@ -655,13 +676,13 @@ Pitch Pitch_killOctaveJumps (Pitch me) {
 				thy frame [i]. candidate [1]. frequency *= 2.0;
 			nUp += nVoiced;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": octave jumps not killed.");
+		Melder_throw (me, U": octave jumps not killed.");
 	}
 }
 
-Pitch Pitch_interpolate (Pitch me) {
+autoPitch Pitch_interpolate (Pitch me) {
 	try {
 		autoPitch thee = Pitch_create (my xmin, my xmax, my nx, my dx, my x1, my ceiling, 2);
 		for (long i = 1; i <= my nx; i ++) {
@@ -680,18 +701,18 @@ Pitch Pitch_interpolate (Pitch me) {
 					fright = my frame [right]. candidate [1]. frequency;
 					if (fright >= my ceiling) fright = 0.0;
 				}
-				if (fleft && fright)
+				if (fleft != 0.0 && fright != 0.0)
 					thy frame [i]. candidate [1]. frequency =
 						((i - left) * fright + (right - i) * fleft) / (right - left);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not interpolated.");
+		Melder_throw (me, U": not interpolated.");
 	}
 }
 
-Pitch Pitch_subtractLinearFit (Pitch me, int unit) {
+autoPitch Pitch_subtractLinearFit (Pitch me, int unit) {
 	try {
 		autoPitch thee = Pitch_interpolate (me);
 		/*
@@ -737,13 +758,13 @@ Pitch Pitch_subtractLinearFit (Pitch me, int unit) {
 			else
 				FREQUENCY (thyFrame) = Function_convertSpecialToStandardUnit (me, f, Pitch_LEVEL_FREQUENCY, unit);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": linear fit not subtracted.");
+		Melder_throw (me, U": linear fit not subtracted.");
 	}
 }
 
-Pitch Pitch_smooth (Pitch me, double bandWidth) {
+autoPitch Pitch_smooth (Pitch me, double bandWidth) {
 	try {
 		autoPitch interp = Pitch_interpolate (me);
 		autoMatrix matrix1 = Pitch_to_Matrix (interp.peek());
@@ -771,7 +792,7 @@ Pitch Pitch_smooth (Pitch me, double bandWidth) {
 			sound1 -> z [1] [i] = fextrap;
 
 		/* Smooth. */
-		autoSpectrum spectrum = Sound_to_Spectrum (sound1.peek(), TRUE);
+		autoSpectrum spectrum = Sound_to_Spectrum (sound1.peek(), true);
 		for (long i = 1; i <= spectrum -> nx; i ++) {
 			double f = (i - 1) * spectrum -> dx, fT = f / bandWidth, factor = exp (- fT * fT);
 			spectrum -> z [1] [i] *= factor;
@@ -787,9 +808,9 @@ Pitch Pitch_smooth (Pitch me, double bandWidth) {
 		}
 		autoPitch thee = Matrix_to_Pitch (matrix2.peek());
 		thy ceiling = my ceiling;
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not smoothed.");
+		Melder_throw (me, U": not smoothed.");
 	}
 }
 
diff --git a/fon/Pitch.h b/fon/Pitch.h
index 6b9d042..bef6359 100644
--- a/fon/Pitch.h
+++ b/fon/Pitch.h
@@ -2,7 +2,7 @@
 #define _Pitch_h_
 /* Pitch.h
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,11 +28,11 @@
 #include "Pitch_def.h"
 oo_CLASS_CREATE (Pitch, Sampled);
 
-Pitch Pitch_create (double tmin, double tmax, long nt, double dt, double t1,
+autoPitch Pitch_create (double tmin, double tmax, long nt, double dt, double t1,
 	double ceiling, int maxnCandidates);
 /*
 	Function:
-		create an empty pitch contour (voiceless), or NULL if out of memory.
+		create an empty pitch contour (voiceless).
 	Preconditions:
 		tmax > tmin;
 		nt >= 1;
@@ -76,8 +76,8 @@ bool Pitch_isVoiced_i (Pitch me, long index);
 
 bool Pitch_isVoiced_t (Pitch me, double t);
 /*
-	Are you voiced at time 't'?
-	The answer is TRUE iff 't' lies within a voiced frame.
+	Are you voiced at time `t`?
+	The answer is `true` iff `t` lies within a voiced frame.
 */
 
 #define Pitch_LEVEL_FREQUENCY  1
@@ -154,7 +154,7 @@ long Pitch_getMeanAbsSlope_noOctave (Pitch me, double *slope);
    'minimum', 'maximum', 'mean', and 'variance' may be NULL.
 */
 
-Pitch Pitch_killOctaveJumps (Pitch me);
+autoPitch Pitch_killOctaveJumps (Pitch me);
 /* Add octave jumps so that every pitch step,
    including those across unvoiced frames,
    does not exceed 1/2 octave.
@@ -162,13 +162,13 @@ Pitch Pitch_killOctaveJumps (Pitch me);
       result -> ceiling = my ceiling * 2;
 */
 
-Pitch Pitch_interpolate (Pitch me);
+autoPitch Pitch_interpolate (Pitch me);
 /* Interpolate the pitch values of unvoiced frames. */
 /* No extrapolation beyond first and last voiced frames. */
 
-Pitch Pitch_subtractLinearFit (Pitch me, int unit);
+autoPitch Pitch_subtractLinearFit (Pitch me, int unit);
 
-Pitch Pitch_smooth (Pitch me, double bandWidth);
+autoPitch Pitch_smooth (Pitch me, double bandWidth);
 /* Smoothing by convolution with Gaussian curve.
    Time domain: exp (- (pi t bandWidth) ^ 2)
       down to 8.5 % for t = +- 0.5/bandWidth
@@ -197,7 +197,7 @@ void Pitch_step (Pitch me, double step, double precision, double tmin, double tm
 	as long as that candidate is in between 0 and my ceiling.
 */
 
-void Pitch_formula (Pitch me, const wchar_t *formula, Interpreter interpreter);
+void Pitch_formula (Pitch me, const char32 *formula, Interpreter interpreter);
 
 /* End of file Pitch.h */
 #endif
diff --git a/fon/PitchEditor.cpp b/fon/PitchEditor.cpp
index 986db89..b4cf09d 100644
--- a/fon/PitchEditor.cpp
+++ b/fon/PitchEditor.cpp
@@ -1,6 +1,6 @@
 /* PitchEditor.cpp
  *
- * Copyright (C) 1992-2011,2012,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,88 +31,88 @@ Thing_implement (PitchEditor, FunctionEditor, 0);
 
 static void menu_cb_setCeiling (EDITOR_ARGS) {
 	EDITOR_IAM (PitchEditor);
-	EDITOR_FORM (L"Change ceiling", 0)
-		POSITIVE (L"Ceiling (Hz)", L"600")
+	EDITOR_FORM (U"Change ceiling", 0)
+		POSITIVE (U"Ceiling (Hz)", U"600")
 	EDITOR_OK
 		Pitch pitch = (Pitch) my data;
-		SET_REAL (L"Ceiling", pitch -> ceiling)
+		SET_REAL (U"Ceiling", pitch -> ceiling)
 	EDITOR_DO
 		Pitch pitch = (Pitch) my data;
-		Editor_save (me, L"Change ceiling");
-		Pitch_setCeiling (pitch, GET_REAL (L"Ceiling"));
+		Editor_save (me, U"Change ceiling");
+		Pitch_setCeiling (pitch, GET_REAL (U"Ceiling"));
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_pathFinder (EDITOR_ARGS) {
 	EDITOR_IAM (PitchEditor);
-	EDITOR_FORM (L"Path finder", 0)
-		REAL (L"Silence threshold", L"0.03")
-		REAL (L"Voicing threshold", L"0.45")
-		REAL (L"Octave cost", L"0.01")
-		REAL (L"Octave-jump cost", L"0.35")
-		REAL (L"Voiced/unvoiced cost", L"0.14")
-		POSITIVE (L"Ceiling (Hz)", L"600")
-		BOOLEAN (L"Pull formants", 0)
+	EDITOR_FORM (U"Path finder", 0)
+		REAL (U"Silence threshold", U"0.03")
+		REAL (U"Voicing threshold", U"0.45")
+		REAL (U"Octave cost", U"0.01")
+		REAL (U"Octave-jump cost", U"0.35")
+		REAL (U"Voiced/unvoiced cost", U"0.14")
+		POSITIVE (U"Ceiling (Hz)", U"600")
+		BOOLEAN (U"Pull formants", 0)
 	EDITOR_OK
 		Pitch pitch = (Pitch) my data;
-		SET_REAL (L"Ceiling", pitch -> ceiling)
+		SET_REAL (U"Ceiling", pitch -> ceiling)
 	EDITOR_DO
 		Pitch pitch = (Pitch) my data;
-		Editor_save (me, L"Path finder");
+		Editor_save (me, U"Path finder");
 		Pitch_pathFinder (pitch,
-			GET_REAL (L"Silence threshold"), GET_REAL (L"Voicing threshold"),
-			GET_REAL (L"Octave cost"), GET_REAL (L"Octave-jump cost"),
-			GET_REAL (L"Voiced/unvoiced cost"), GET_REAL (L"Ceiling"), GET_INTEGER (L"Pull formants"));
+			GET_REAL (U"Silence threshold"), GET_REAL (U"Voicing threshold"),
+			GET_REAL (U"Octave cost"), GET_REAL (U"Octave-jump cost"),
+			GET_REAL (U"Voiced/unvoiced cost"), GET_REAL (U"Ceiling"), GET_INTEGER (U"Pull formants"));
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_getPitch (EDITOR_ARGS) {
 	EDITOR_IAM (PitchEditor);
 	if (my d_startSelection == my d_endSelection) {
-		Melder_informationReal (Pitch_getValueAtTime ((Pitch) my data, my d_startSelection, kPitch_unit_HERTZ, 1), L"Hz");
+		Melder_informationReal (Pitch_getValueAtTime ((Pitch) my data, my d_startSelection, kPitch_unit_HERTZ, 1), U"Hz");
 	} else {
-		Melder_informationReal (Pitch_getMean ((Pitch) my data, my d_startSelection, my d_endSelection, kPitch_unit_HERTZ), L"Hz");
+		Melder_informationReal (Pitch_getMean ((Pitch) my data, my d_startSelection, my d_endSelection, kPitch_unit_HERTZ), U"Hz");
 	}
 }
 
 static void menu_cb_octaveUp (EDITOR_ARGS) {
 	EDITOR_IAM (PitchEditor);
 	Pitch pitch = (Pitch) my data;
-	Editor_save (me, L"Octave up");
+	Editor_save (me, U"Octave up");
 	Pitch_step (pitch, 2.0, 0.1, my d_startSelection, my d_endSelection);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_fifthUp (EDITOR_ARGS) {
 	EDITOR_IAM (PitchEditor);
 	Pitch pitch = (Pitch) my data;
-	Editor_save (me, L"Fifth up");
+	Editor_save (me, U"Fifth up");
 	Pitch_step (pitch, 1.5, 0.1, my d_startSelection, my d_endSelection);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_fifthDown (EDITOR_ARGS) {
 	EDITOR_IAM (PitchEditor);
 	Pitch pitch = (Pitch) my data;
-	Editor_save (me, L"Fifth down");
+	Editor_save (me, U"Fifth down");
 	Pitch_step (pitch, 1 / 1.5, 0.1, my d_startSelection, my d_endSelection);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_octaveDown (EDITOR_ARGS) {
 	EDITOR_IAM (PitchEditor);
 	Pitch pitch = (Pitch) my data;
-	Editor_save (me, L"Octave down");
+	Editor_save (me, U"Octave down");
 	Pitch_step (pitch, 0.5, 0.1, my d_startSelection, my d_endSelection);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_voiceless (EDITOR_ARGS) {
@@ -122,7 +122,7 @@ static void menu_cb_voiceless (EDITOR_ARGS) {
 	long iright = Sampled_xToLowIndex (pitch, my d_endSelection);
 	if (ileft < 1) ileft = 1;
 	if (iright > pitch -> nx) iright = pitch -> nx;
-	Editor_save (me, L"Unvoice");
+	Editor_save (me, U"Unvoice");
 	for (long i = ileft; i <= iright; i ++) {
 		Pitch_Frame frame = & pitch -> frame [i];
 		for (long cand = 1; cand <= frame -> nCandidates; cand ++) {
@@ -134,34 +134,34 @@ static void menu_cb_voiceless (EDITOR_ARGS) {
 		}
 	}
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
-static void menu_cb_PitchEditorHelp (EDITOR_ARGS) { EDITOR_IAM (PitchEditor); Melder_help (L"PitchEditor"); }
-static void menu_cb_PitchHelp (EDITOR_ARGS) { EDITOR_IAM (PitchEditor); Melder_help (L"Pitch"); }
+static void menu_cb_PitchEditorHelp (EDITOR_ARGS) { EDITOR_IAM (PitchEditor); Melder_help (U"PitchEditor"); }
+static void menu_cb_PitchHelp (EDITOR_ARGS) { EDITOR_IAM (PitchEditor); Melder_help (U"Pitch"); }
 
 void structPitchEditor :: v_createMenus () {
 	PitchEditor_Parent :: v_createMenus ();
 
-	Editor_addCommand (this, L"Edit", L"Change ceiling...", 0, menu_cb_setCeiling);
-	Editor_addCommand (this, L"Edit", L"Path finder...", 0, menu_cb_pathFinder);
+	Editor_addCommand (this, U"Edit", U"Change ceiling...", 0, menu_cb_setCeiling);
+	Editor_addCommand (this, U"Edit", U"Path finder...", 0, menu_cb_pathFinder);
 
-	Editor_addCommand (this, L"Query", L"-- pitch --", 0, NULL);
-	Editor_addCommand (this, L"Query", L"Get pitch", GuiMenu_F5, menu_cb_getPitch);
+	Editor_addCommand (this, U"Query", U"-- pitch --", 0, NULL);
+	Editor_addCommand (this, U"Query", U"Get pitch", GuiMenu_F5, menu_cb_getPitch);
 
-	Editor_addMenu (this, L"Selection", 0);
-	Editor_addCommand (this, L"Selection", L"Unvoice", 0, menu_cb_voiceless);
-	Editor_addCommand (this, L"Selection", L"-- up and down --", 0, NULL);
-	Editor_addCommand (this, L"Selection", L"Octave up", 0, menu_cb_octaveUp);
-	Editor_addCommand (this, L"Selection", L"Fifth up", 0, menu_cb_fifthUp);
-	Editor_addCommand (this, L"Selection", L"Fifth down", 0, menu_cb_fifthDown);
-	Editor_addCommand (this, L"Selection", L"Octave down", 0, menu_cb_octaveDown);
+	Editor_addMenu (this, U"Selection", 0);
+	Editor_addCommand (this, U"Selection", U"Unvoice", 0, menu_cb_voiceless);
+	Editor_addCommand (this, U"Selection", U"-- up and down --", 0, NULL);
+	Editor_addCommand (this, U"Selection", U"Octave up", 0, menu_cb_octaveUp);
+	Editor_addCommand (this, U"Selection", U"Fifth up", 0, menu_cb_fifthUp);
+	Editor_addCommand (this, U"Selection", U"Fifth down", 0, menu_cb_fifthDown);
+	Editor_addCommand (this, U"Selection", U"Octave down", 0, menu_cb_octaveDown);
 }
 
 void structPitchEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	PitchEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"PitchEditor help", '?', menu_cb_PitchEditorHelp);
-	EditorMenu_addCommand (menu, L"Pitch help", 0, menu_cb_PitchHelp);
+	EditorMenu_addCommand (menu, U"PitchEditor help", U'?', menu_cb_PitchEditorHelp);
+	EditorMenu_addCommand (menu, U"Pitch help", 0, menu_cb_PitchHelp);
 }
 	
 /********** DRAWING AREA **********/
@@ -207,7 +207,7 @@ void structPitchEditor :: v_draw () {
 				Graphics_setColour (our d_graphics, Graphics_RED);
 				Graphics_line (our d_graphics, our d_startWindow - radius, f, our d_endWindow, f);
 				Graphics_setTextAlignment (our d_graphics, Graphics_RIGHT, Graphics_HALF);
-				Graphics_text1 (our d_graphics, our d_startWindow - radius, f, Melder_fixed (f, 2));
+				Graphics_text (our d_graphics, our d_startWindow - radius, f, Melder_fixed (f, 2));
 			}
 		}
 
@@ -218,7 +218,7 @@ void structPitchEditor :: v_draw () {
 		Graphics_setTextAlignment (our d_graphics, Graphics_LEFT, Graphics_HALF);
 		for (long f = df; f <= pitch -> ceiling; f += df) {
 			Graphics_line (our d_graphics, our d_startWindow, f, our d_endWindow, f);
-			Graphics_text2 (our d_graphics, our d_endWindow + radius/2, f, Melder_integer (f), L" Hz");
+			Graphics_text (our d_graphics, our d_endWindow + radius/2, f,   f, U" Hz");
 		}
 		Graphics_setLineType (our d_graphics, Graphics_DRAWN);
 
@@ -238,7 +238,7 @@ void structPitchEditor :: v_draw () {
 				int strength = (int) floor (10 * frame -> candidate [icand]. strength + 0.5);
 				f = frame -> candidate [icand]. frequency;
 				if (strength > 9) strength = 9;
-				if (f > 0 && f <= pitch -> ceiling) Graphics_text1 (our d_graphics, t, f, Melder_integer (strength));
+				if (f > 0 && f <= pitch -> ceiling) Graphics_text (our d_graphics, t, f, strength);
 			}
 		}
 		Graphics_resetViewport (our d_graphics, previous);
@@ -252,16 +252,16 @@ void structPitchEditor :: v_draw () {
 		Graphics_setWindow (our d_graphics, our d_startWindow, our d_endWindow, 0, 1);
 		Graphics_setColour (our d_graphics, Graphics_BLACK);
 		Graphics_setTextAlignment (our d_graphics, Graphics_RIGHT, Graphics_HALF);
-		Graphics_text (our d_graphics, our d_startWindow, 0.5, L"intens");
+		Graphics_text (our d_graphics, our d_startWindow, 0.5, U"intens");
 		Graphics_setTextAlignment (our d_graphics, Graphics_LEFT, Graphics_HALF);
-		Graphics_text (our d_graphics, our d_endWindow, 0.5, L"intens");
+		Graphics_text (our d_graphics, our d_endWindow, 0.5, U"intens");
 		Graphics_setTextAlignment (our d_graphics, Graphics_CENTRE, Graphics_HALF);
 		for (it = it1; it <= it2; it ++) {
 			Pitch_Frame frame = & pitch -> frame [it];
 			double t = Sampled_indexToX (pitch, it);
 			int strength = (int) floor (10 * frame -> intensity + 0.5);   // map 0.0-1.0 to 0-9
 			if (strength > 9) strength = 9;
-			Graphics_text1 (our d_graphics, t, 0.5, Melder_integer (strength));
+			Graphics_text (our d_graphics, t, 0.5, strength);
 		}
 		Graphics_resetViewport (our d_graphics, previous);
 	}
@@ -277,9 +277,9 @@ void structPitchEditor :: v_draw () {
 		Graphics_setColour (our d_graphics, Graphics_BLUE);
 		Graphics_line (our d_graphics, our d_startWindow, 1, our d_endWindow, 1);
 		Graphics_setTextAlignment (our d_graphics, Graphics_RIGHT, Graphics_HALF);
-		Graphics_text (our d_graphics, our d_startWindow, 0.5, L"Unv");
+		Graphics_text (our d_graphics, our d_startWindow, 0.5, U"Unv");
 		Graphics_setTextAlignment (our d_graphics, Graphics_LEFT, Graphics_HALF);
-		Graphics_text (our d_graphics, our d_endWindow, 0.5, L"Unv");
+		Graphics_text (our d_graphics, our d_endWindow, 0.5, U"Unv");
 		for (it = it1; it <= it2; it ++) {
 			Pitch_Frame frame = & pitch -> frame [it];
 			double t = Sampled_indexToX (pitch, it), tleft = t - 0.5 * pitch -> dx, tright = t + 0.5 * pitch -> dx;
@@ -330,11 +330,11 @@ int structPitchEditor :: v_click (double xWC, double yWC, bool dummy) {
 		     (bestFrequency > 0.0 && dx_mm * dx_mm + dy_mm * dy_mm <= RADIUS * RADIUS)))   // voiced: click within circle
 		{
 			struct structPitch_Candidate help = bestFrame -> candidate [1];
-			Editor_save (this, L"Change path");
+			Editor_save (this, U"Change path");
 			bestFrame -> candidate [1] = bestFrame -> candidate [bestCandidate];
 			bestFrame -> candidate [bestCandidate] = help;
 			FunctionEditor_redraw (this);
-			our broadcastDataChanged ();
+			Editor_broadcastDataChanged (this);
 			our d_startSelection = our d_endSelection = tmid;   // cursor will snap to candidate
 			return 1;
 		} else {
@@ -344,13 +344,13 @@ int structPitchEditor :: v_click (double xWC, double yWC, bool dummy) {
 	return PitchEditor_Parent :: v_click (xWC, yWC, dummy);   // move cursor or drag selection
 }
 
-PitchEditor PitchEditor_create (const wchar_t *title, Pitch pitch) {
+autoPitchEditor PitchEditor_create (const char32 *title, Pitch pitch) {
 	try {
 		autoPitchEditor me = Thing_new (PitchEditor);
 		FunctionEditor_init (me.peek(), title, pitch);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Pitch window not created.");
+		Melder_throw (U"Pitch window not created.");
 	}
 }
 
diff --git a/fon/PitchEditor.h b/fon/PitchEditor.h
index 8d0de26..9596d3e 100644
--- a/fon/PitchEditor.h
+++ b/fon/PitchEditor.h
@@ -2,7 +2,7 @@
 #define _PitchEditor_h_
 /* PitchEditor.h
  *
- * Copyright (C) 1992-2011,2012 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,15 +23,19 @@
 #include "Pitch.h"
 
 Thing_define (PitchEditor, FunctionEditor) {
-	// overridden methods:
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_draw ();
-		virtual void v_play (double tmin, double tmax);
-		virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_draw ()
+		override;
+	void v_play (double tmin, double tmax)
+		override;
+	int v_click (double xWC, double yWC, bool shiftKeyPressed)
+		override;
 };
 
-PitchEditor PitchEditor_create (const wchar_t *title, Pitch pitch);
+autoPitchEditor PitchEditor_create (const char32 *title, Pitch pitch);
 
 /* End of file PitchEditor.h */
 #endif
diff --git a/fon/PitchTier.cpp b/fon/PitchTier.cpp
index 6390feb..d330b54 100644
--- a/fon/PitchTier.cpp
+++ b/fon/PitchTier.cpp
@@ -1,6 +1,6 @@
 /* PitchTier.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,37 +23,37 @@
 Thing_implement (PitchTier, RealTier, 0);
 
 void structPitchTier :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"Number of points: ", Melder_integer (points -> size));
-	MelderInfo_writeLine (L"Minimum pitch value: ", Melder_double (RealTier_getMinimumValue (this)), L" Hz");
-	MelderInfo_writeLine (L"Maximum pitch value: ", Melder_double (RealTier_getMaximumValue (this)), L" Hz");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"Number of points: ", points -> size);
+	MelderInfo_writeLine (U"Minimum pitch value: ", RealTier_getMinimumValue (this), U" Hz");
+	MelderInfo_writeLine (U"Maximum pitch value: ", RealTier_getMaximumValue (this), U" Hz");
 }
 
-PitchTier PitchTier_create (double tmin, double tmax) {
+autoPitchTier PitchTier_create (double tmin, double tmax) {
 	try {
 		autoPitchTier me = Thing_new (PitchTier);
 		RealTier_init (me.peek(), tmin, tmax);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("PitchTier not created.");
+		Melder_throw (U"PitchTier not created.");
 	}
 }
 
 void PitchTier_draw (PitchTier me, Graphics g, double tmin, double tmax,
-	double fmin, double fmax, int garnish, const wchar_t *method)
+	double fmin, double fmax, int garnish, const char32 *method)
 {
-	RealTier_draw (me, g, tmin, tmax, fmin, fmax, garnish, method, L"Frequency (Hz)");
+	RealTier_draw (me, g, tmin, tmax, fmin, fmax, garnish, method, U"Frequency (Hz)");
 }
 
-PitchTier PointProcess_upto_PitchTier (PointProcess me, double frequency) {
+autoPitchTier PointProcess_upto_PitchTier (PointProcess me, double frequency) {
 	try {
 		return (PitchTier) PointProcess_upto_RealTier (me, frequency, classPitchTier);
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to PitchTier.");
+		Melder_throw (me, U": not converted to PitchTier.");
 	}
 }
 
@@ -61,7 +61,7 @@ void PitchTier_stylize (PitchTier me, double frequencyResolution, int useSemiton
 	double dfmin;
 	for (;;) {
 		long i, imin = 0;
-		dfmin = 1e300;
+		dfmin = 1e308;
 		for (i = 2; i <= my points -> size - 1; i ++) {
 			RealPoint pm = (RealPoint) my points -> item [i];
 			RealPoint pl = (RealPoint) my points -> item [i - 1];
@@ -81,7 +81,7 @@ void PitchTier_stylize (PitchTier me, double frequencyResolution, int useSemiton
 	}
 }
 
-static void PitchTier_writeToSpreadsheetFile (PitchTier me, MelderFile file, int hasHeader) {
+static void PitchTier_writeToSpreadsheetFile (PitchTier me, MelderFile file, bool hasHeader) {
 	autofile f = Melder_fopen (file, "w");
 	if (hasHeader)
 		fprintf (f, "\"ooTextFile\"\n\"PitchTier\"\n%.17g %.17g %ld\n", my xmin, my xmax, my points -> size);
@@ -94,17 +94,17 @@ static void PitchTier_writeToSpreadsheetFile (PitchTier me, MelderFile file, int
 
 void PitchTier_writeToPitchTierSpreadsheetFile (PitchTier me, MelderFile file) {
 	try {
-		PitchTier_writeToSpreadsheetFile (me, file, TRUE);
+		PitchTier_writeToSpreadsheetFile (me, file, true);
 	} catch (MelderError) {
-		Melder_throw (me, " not written to tab-separated PitchTier file.");
+		Melder_throw (me, U" not written to tab-separated PitchTier file.");
 	}
 }
 
 void PitchTier_writeToHeaderlessSpreadsheetFile (PitchTier me, MelderFile file) {
 	try {
-		PitchTier_writeToSpreadsheetFile (me, file, FALSE);
+		PitchTier_writeToSpreadsheetFile (me, file, false);
 	} catch (MelderError) {
-		Melder_throw (me, " not written to tab-separated table file.");
+		Melder_throw (me, U" not written to tab-separated table file.");
 	}
 }
 
@@ -118,11 +118,11 @@ void PitchTier_shiftFrequencies (PitchTier me, double tmin, double tmax, double
 				case kPitch_unit_HERTZ: {	
 					frequency += shift;
 					if (frequency <= 0.0)
-						Melder_throw ("The resulting frequency has to be greater than 0 Hz.");
+						Melder_throw (U"The resulting frequency has to be greater than 0 Hz.");
 				} break; case kPitch_unit_MEL: {
 					frequency = NUMhertzToMel (frequency) + shift;
 					if (frequency <= 0.0)
-						Melder_throw ("The resulting frequency has to be greater than 0 mel.");
+						Melder_throw (U"The resulting frequency has to be greater than 0 mel.");
 					frequency = NUMmelToHertz (frequency);
 				} break; case kPitch_unit_LOG_HERTZ: {
 					frequency = pow (10.0, log10 (frequency) + shift);
@@ -131,14 +131,14 @@ void PitchTier_shiftFrequencies (PitchTier me, double tmin, double tmax, double
 				} break; case kPitch_unit_ERB: {
 					frequency = NUMhertzToErb (frequency) + shift;
 					if (frequency <= 0.0)
-						Melder_throw ("The resulting frequency has to be greater than 0 ERB.");
+						Melder_throw (U"The resulting frequency has to be greater than 0 ERB.");
 					frequency = NUMerbToHertz (frequency);
 				}
 			}
 			point -> value = frequency;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not all frequencies were shifted.");
+		Melder_throw (me, U": not all frequencies were shifted.");
 	}
 }
 
diff --git a/fon/PitchTier.h b/fon/PitchTier.h
index b7fdfb6..442304d 100644
--- a/fon/PitchTier.h
+++ b/fon/PitchTier.h
@@ -2,7 +2,7 @@
 #define _PitchTier_h_
 /* PitchTier.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,12 +26,13 @@
 /********** class PitchTier **********/
 
 Thing_define (PitchTier, RealTier) {
-	// overridden methods:
-		virtual void v_info ();
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
+	void v_info ()
+		override;
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
 };
 
-PitchTier PitchTier_create (double tmin, double tmax);
+autoPitchTier PitchTier_create (double tmin, double tmax);
 /*
 	Postconditions:
 		result -> xmin == tmin;
@@ -43,9 +44,9 @@ void PitchTier_shiftFrequencies (PitchTier me, double tmin, double tmax, double
 void PitchTier_multiplyFrequencies (PitchTier me, double tmin, double tmax, double factor);
 
 void PitchTier_draw (PitchTier me, Graphics g, double tmin, double tmax,
-	double fmin, double fmax, int garnish, const wchar_t *method);
+	double fmin, double fmax, int garnish, const char32 *method);
 
-PitchTier PointProcess_upto_PitchTier (PointProcess me, double frequency);
+autoPitchTier PointProcess_upto_PitchTier (PointProcess me, double frequency);
 void PitchTier_stylize (PitchTier me, double frequencyResolution, int useSemitones);
 
 void PitchTier_writeToPitchTierSpreadsheetFile (PitchTier me, MelderFile file);
diff --git a/fon/PitchTierEditor.cpp b/fon/PitchTierEditor.cpp
index f188eac..7d5da94 100644
--- a/fon/PitchTierEditor.cpp
+++ b/fon/PitchTierEditor.cpp
@@ -1,6 +1,6 @@
 /* PitchTierEditor.cpp
  *
- * Copyright (C) 1992-2011,2012 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,30 +23,30 @@
 
 Thing_implement (PitchTierEditor, RealTierEditor, 0);
 
-static void menu_cb_PitchTierEditorHelp (EDITOR_ARGS) { EDITOR_IAM (PitchTierEditor); Melder_help (L"PitchTierEditor"); }
-static void menu_cb_PitchTierHelp (EDITOR_ARGS) { EDITOR_IAM (PitchTierEditor); Melder_help (L"PitchTier"); }
+static void menu_cb_PitchTierEditorHelp (EDITOR_ARGS) { EDITOR_IAM (PitchTierEditor); Melder_help (U"PitchTierEditor"); }
+static void menu_cb_PitchTierHelp (EDITOR_ARGS) { EDITOR_IAM (PitchTierEditor); Melder_help (U"PitchTier"); }
 
 void structPitchTierEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	PitchTierEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"PitchTierEditor help", 0, menu_cb_PitchTierEditorHelp);
-	EditorMenu_addCommand (menu, L"PitchTier help", 0, menu_cb_PitchTierHelp);
+	EditorMenu_addCommand (menu, U"PitchTierEditor help", 0, menu_cb_PitchTierEditorHelp);
+	EditorMenu_addCommand (menu, U"PitchTier help", 0, menu_cb_PitchTierHelp);
 }
 
 void structPitchTierEditor :: v_play (double a_tmin, double a_tmax) {
 	if (d_sound.data) {
 		Sound_playPart (d_sound.data, a_tmin, a_tmax, theFunctionEditor_playCallback, this);
 	} else {
-		PitchTier_playPart ((PitchTier) data, a_tmin, a_tmax, FALSE);
+		PitchTier_playPart ((PitchTier) data, a_tmin, a_tmax, false);
 	}
 }
 
-PitchTierEditor PitchTierEditor_create (const wchar_t *title, PitchTier pitch, Sound sound, bool ownSound) {
+autoPitchTierEditor PitchTierEditor_create (const char32 *title, PitchTier pitch, Sound sound, bool ownSound) {
 	try {
 		autoPitchTierEditor me = Thing_new (PitchTierEditor);
 		RealTierEditor_init (me.peek(), title, (RealTier) pitch, sound, ownSound);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("PitchTier window not created.");
+		Melder_throw (U"PitchTier window not created.");
 	}
 }
 
diff --git a/fon/PitchTierEditor.h b/fon/PitchTierEditor.h
index 438e261..209848b 100644
--- a/fon/PitchTierEditor.h
+++ b/fon/PitchTierEditor.h
@@ -2,7 +2,7 @@
 #define _PitchTierEditor_h_
 /* PitchTierEditor.h
  *
- * Copyright (C) 1992-2011,2012 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,25 +24,39 @@
 #include "Sound.h"
 
 Thing_define (PitchTierEditor, RealTierEditor) {
-	// overridden methods:
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_play (double tmin, double tmax);
-		virtual double v_minimumLegalValue () { return 0.0; }
-		virtual const wchar_t * v_quantityText () { return L"Frequency (Hz)"; }
-		virtual const wchar_t * v_quantityKey () { return L"Frequency"; }
-		virtual const wchar_t * v_rightTickUnits () { return L" Hz"; }
-		virtual double v_defaultYmin () { return 50.0; }
-		virtual double v_defaultYmax () { return 600.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set frequency range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"50.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"600.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum frequency (Hz)"; }
-		virtual const wchar_t * v_ymaxText () { return L"Maximum frequency (Hz)"; }
-		virtual const wchar_t * v_yminKey () { return L"Minimum frequency"; }
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum frequency"; }
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_play (double tmin, double tmax)
+		override;
+	double v_minimumLegalValue ()
+		override { return 0.0; }
+	const char32 * v_quantityText ()
+		override { return U"Frequency (Hz)"; }
+	const char32 * v_quantityKey ()
+		override { return U"Frequency"; }
+	const char32 * v_rightTickUnits ()
+		override { return U" Hz"; }
+	double v_defaultYmin ()
+		override { return 50.0; }
+	double v_defaultYmax ()
+		override { return 600.0; }
+	const char32 * v_setRangeTitle ()
+		override { return U"Set frequency range..."; }
+	const char32 * v_defaultYminText ()
+		override { return U"50.0"; }
+	const char32 * v_defaultYmaxText ()
+		override { return U"600.0"; }
+	const char32 * v_yminText ()
+		override { return U"Minimum frequency (Hz)"; }
+	const char32 * v_ymaxText ()
+		override { return U"Maximum frequency (Hz)"; }
+	const char32 * v_yminKey ()
+		override { return U"Minimum frequency"; }
+	const char32 * v_ymaxKey ()
+		override { return U"Maximum frequency"; }
 };
 
-PitchTierEditor PitchTierEditor_create (const wchar_t *title,
+autoPitchTierEditor PitchTierEditor_create (const char32 *title,
 	PitchTier pitch,
 	Sound sound,   // may be NULL
 	bool ownSound);
diff --git a/fon/PitchTier_to_PointProcess.cpp b/fon/PitchTier_to_PointProcess.cpp
index 52c5845..4b6cf57 100644
--- a/fon/PitchTier_to_PointProcess.cpp
+++ b/fon/PitchTier_to_PointProcess.cpp
@@ -1,6 +1,6 @@
 /* PitchTier_to_PointProcess.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,14 +19,14 @@
 
 /*
  * pb 2002/07/16 GPL
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2011/06/05
  */
 
 #include "PitchTier_to_PointProcess.h"
 #include "Pitch_to_PitchTier.h"
 
-PointProcess PitchTier_to_PointProcess (PitchTier me) {
+autoPointProcess PitchTier_to_PointProcess (PitchTier me) {
 	try {
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 1000);
 		double area = 0.5;   // imagine an event half a period before the beginning
@@ -50,13 +50,13 @@ PointProcess PitchTier_to_PointProcess (PitchTier me) {
 				PointProcess_addPoint (thee.peek(), t2 - 2.0 * area / (f2 + sqrt (discriminant)));
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to PointProcess.");
+		Melder_throw (me, U": not converted to PointProcess.");
 	}
 }
 
-PointProcess PitchTier_Pitch_to_PointProcess (PitchTier me, Pitch vuv) {
+autoPointProcess PitchTier_Pitch_to_PointProcess (PitchTier me, Pitch vuv) {
 	try {
 		autoPointProcess fullPoint = PitchTier_to_PointProcess (me);
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, fullPoint -> maxnt);
@@ -69,9 +69,9 @@ PointProcess PitchTier_Pitch_to_PointProcess (PitchTier me, Pitch vuv) {
 				PointProcess_addPoint (thee.peek(), t);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", vuv, ": not converted to PointProcess.");
+		Melder_throw (me, U" & ", vuv, U": not converted to PointProcess.");
 	}
 }
 
@@ -87,7 +87,7 @@ static int PointProcess_isVoiced_t (PointProcess me, double t, double maxT) {
 	return 0;
 }
 
-PointProcess PitchTier_Point_to_PointProcess (PitchTier me, PointProcess vuv, double maxT) {
+autoPointProcess PitchTier_Point_to_PointProcess (PitchTier me, PointProcess vuv, double maxT) {
 	try {
 		autoPointProcess fullPoint = PitchTier_to_PointProcess (me);
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, fullPoint -> maxnt);
@@ -100,13 +100,13 @@ PointProcess PitchTier_Point_to_PointProcess (PitchTier me, PointProcess vuv, do
 				PointProcess_addPoint (thee.peek(), t);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", vuv, ": not converted to PointProcess.");
+		Melder_throw (me, U" & ", vuv, U": not converted to PointProcess.");
 	}
 }
 
-PitchTier PointProcess_to_PitchTier (PointProcess me, double maximumInterval) {
+autoPitchTier PointProcess_to_PitchTier (PointProcess me, double maximumInterval) {
 	try {
 		autoPitchTier thee = PitchTier_create (my xmin, my xmax);
 		for (long i = 1; i < my nt; i ++) {
@@ -115,46 +115,46 @@ PitchTier PointProcess_to_PitchTier (PointProcess me, double maximumInterval) {
 				RealTier_addPoint (thee.peek(), my t [i] + 0.5 * interval, 1.0 / interval);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to PitchTier.");
+		Melder_throw (me, U": not converted to PitchTier.");
 	}
 }
 
-PitchTier Pitch_PointProcess_to_PitchTier (Pitch me, PointProcess pp) {
+autoPitchTier Pitch_PointProcess_to_PitchTier (Pitch me, PointProcess pp) {
 	try {
 		autoPitchTier temp = Pitch_to_PitchTier (me);
 		autoPitchTier thee = PitchTier_PointProcess_to_PitchTier (temp.peek(), pp);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", pp, ": not converted to PitchTier.");
+		Melder_throw (me, U" & ", pp, U": not converted to PitchTier.");
 	}
 }
 
-PitchTier PitchTier_PointProcess_to_PitchTier (PitchTier me, PointProcess pp) {
+autoPitchTier PitchTier_PointProcess_to_PitchTier (PitchTier me, PointProcess pp) {
 	try {
-		if (my points -> size == 0) Melder_throw ("No pitch points.");
+		if (my points -> size == 0) Melder_throw (U"No pitch points.");
 		autoPitchTier thee = PitchTier_create (pp -> xmin, pp -> xmax);
 		for (long i = 1; i <= pp -> nt; i ++) {
 			double time = pp -> t [i];
 			double value = RealTier_getValueAtTime (me, time);
 			RealTier_addPoint (thee.peek(), time, value);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", pp, ": not converted to PitchTier.");
+		Melder_throw (me, U" & ", pp, U": not converted to PitchTier.");
 	}
 }
 
-TableOfReal PitchTier_downto_TableOfReal (PitchTier me, int useSemitones) {
+autoTableOfReal PitchTier_downto_TableOfReal (PitchTier me, int useSemitones) {
 	try {
-		autoTableOfReal thee = RealTier_downto_TableOfReal (me, L"Time", L"F0");
+		autoTableOfReal thee = RealTier_downto_TableOfReal (me, U"Time", U"F0");
 		if (useSemitones)
 			for (long i = 1; i <= thy numberOfRows; i ++)
 				thy data [i] [2] = NUMhertzToSemitones (thy data [i] [2]);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TableOfReal.");
+		Melder_throw (me, U": not converted to TableOfReal.");
 	}
 }
 
diff --git a/fon/PitchTier_to_PointProcess.h b/fon/PitchTier_to_PointProcess.h
index d1a4c91..3bb5355 100644
--- a/fon/PitchTier_to_PointProcess.h
+++ b/fon/PitchTier_to_PointProcess.h
@@ -1,6 +1,6 @@
 /* PitchTier_to_PointProcess.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,20 +21,20 @@
 #include "PointProcess.h"
 #include "Pitch.h"
 
-PointProcess PitchTier_to_PointProcess (PitchTier me);
+autoPointProcess PitchTier_to_PointProcess (PitchTier me);
 
-PointProcess PitchTier_Pitch_to_PointProcess (PitchTier me, Pitch vuv);
+autoPointProcess PitchTier_Pitch_to_PointProcess (PitchTier me, Pitch vuv);
 /* Keeps only the parts that are voiced according to 'vuv'. */
 /* Voiced means: inside voiced frame of 'pitch'. */
 
-PointProcess PitchTier_Point_to_PointProcess (PitchTier me, PointProcess vuv, double maxT);
+autoPointProcess PitchTier_Point_to_PointProcess (PitchTier me, PointProcess vuv, double maxT);
 /* Keeps only the parts that are voiced according to 'vuv'. */
 /* Voiced means: within an interval no longer than 'maxT', */
 /* or within half an adjacent short-enough interval from any pulse. */
 
-PitchTier PointProcess_to_PitchTier (PointProcess me, double maximumInterval);
-PitchTier Pitch_PointProcess_to_PitchTier (Pitch me, PointProcess pp);
-PitchTier PitchTier_PointProcess_to_PitchTier (PitchTier me, PointProcess pp);
-TableOfReal PitchTier_downto_TableOfReal (PitchTier me, int useSemitones);
+autoPitchTier PointProcess_to_PitchTier (PointProcess me, double maximumInterval);
+autoPitchTier Pitch_PointProcess_to_PitchTier (Pitch me, PointProcess pp);
+autoPitchTier PitchTier_PointProcess_to_PitchTier (PitchTier me, PointProcess pp);
+autoTableOfReal PitchTier_downto_TableOfReal (PitchTier me, int useSemitones);
 
 /* End of file PitchTier_to_PointProcess.h */
diff --git a/fon/PitchTier_to_Sound.cpp b/fon/PitchTier_to_Sound.cpp
index 9422929..9cd538c 100644
--- a/fon/PitchTier_to_Sound.cpp
+++ b/fon/PitchTier_to_Sound.cpp
@@ -30,64 +30,64 @@
 #include "PitchTier_to_PointProcess.h"
 #include "PointProcess_and_Sound.h"
 
-Sound PitchTier_to_Sound_pulseTrain (PitchTier me, double samplingFrequency,
-	 double adaptFactor, double adaptTime, long interpolationDepth, int hum)
+autoSound PitchTier_to_Sound_pulseTrain (PitchTier me, double samplingFrequency,
+	 double adaptFactor, double adaptTime, long interpolationDepth, bool hum)
 {
-	static double formant [1 + 6] = { 0, 600, 1400, 2400, 3400, 4500, 5500 };
-	static double bandwidth [1 + 6] = { 0, 50, 100, 200, 300, 400, 500 };
+	static double formant [1 + 6] = { 0.0, 600.0, 1400.0, 2400.0, 3400.0, 4500.0, 5500.0 };
+	static double bandwidth [1 + 6] = { 0.0, 50.0, 100.0, 200.0, 300.0, 400.0, 500.0 };
 	try {
 		autoPointProcess point = PitchTier_to_PointProcess (me);
 		autoSound sound = PointProcess_to_Sound_pulseTrain (point.peek(), samplingFrequency, adaptFactor, adaptTime, interpolationDepth);
 		if (hum) {
-			Sound_filterWithFormants (sound.peek(), 0, 0, 6, formant, bandwidth);
+			Sound_filterWithFormants (sound.peek(), 0.0, 0.0, 6, formant, bandwidth);
 		}
-		return sound.transfer();
+		return sound;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound (pulse train).");
+		Melder_throw (me, U": not converted to Sound (pulse train).");
 	}
 }
 
-Sound PitchTier_to_Sound_phonation (PitchTier me, double samplingFrequency,
-	 double adaptFactor, double maximumPeriod, double openPhase, double collisionPhase, double power1, double power2, int hum)
+autoSound PitchTier_to_Sound_phonation (PitchTier me, double samplingFrequency,
+	 double adaptFactor, double maximumPeriod, double openPhase, double collisionPhase, double power1, double power2, bool hum)
 {
-	static double formant [1 + 6] = { 0, 600, 1400, 2400, 3400, 4500, 5500 };
-	static double bandwidth [1 + 6] = { 0, 50, 100, 200, 300, 400, 500 };
+	static double formant [1 + 6] = { 0.0, 600.0, 1400.0, 2400.0, 3400.0, 4500.0, 5500.0 };
+	static double bandwidth [1 + 6] = { 0.0, 50.0, 100.0, 200.0, 300.0, 400.0, 500.0 };
 	try {
 		autoPointProcess point = PitchTier_to_PointProcess (me);
 		autoSound sound = PointProcess_to_Sound_phonation (point.peek(), samplingFrequency, adaptFactor,
 			maximumPeriod, openPhase, collisionPhase, power1, power2);
 		if (hum) {
-			Sound_filterWithFormants (sound.peek(), 0, 0, 6, formant, bandwidth);
+			Sound_filterWithFormants (sound.peek(), 0.0, 0.0, 6, formant, bandwidth);
 		}
-		return sound.transfer();
+		return sound;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound (phonation).");
+		Melder_throw (me, U": not converted to Sound (phonation).");
 	}
 }
 
-void PitchTier_playPart (PitchTier me, double tmin, double tmax, int hum) {
+void PitchTier_playPart (PitchTier me, double tmin, double tmax, bool hum) {
 	try {
 		autoSound sound = PitchTier_to_Sound_pulseTrain (me, 44100.0, 0.7, 0.05, 30, hum);
-		Sound_playPart (sound.peek(), tmin, tmax, NULL, NULL);
+		Sound_playPart (sound.peek(), tmin, tmax, nullptr, nullptr);
 	} catch (MelderError) {
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
 void PitchTier_play (PitchTier me) {
-	PitchTier_playPart (me, my xmin, my xmax, FALSE);
+	PitchTier_playPart (me, my xmin, my xmax, false);
 }
 
 void PitchTier_hum (PitchTier me) {
-	PitchTier_playPart (me, my xmin, my xmax, TRUE);
+	PitchTier_playPart (me, my xmin, my xmax, true);
 }
 
-Sound PitchTier_to_Sound_sine (PitchTier me, double tmin, double tmax, double samplingFrequency) {
+autoSound PitchTier_to_Sound_sine (PitchTier me, double tmin, double tmax, double samplingFrequency) {
 	try {
 		if (tmax <= tmin) tmin = my xmin, tmax = my xmax;
-		long numberOfSamples = 1 + floor ((my xmax - my xmin) * samplingFrequency);   // >= 1
+		long numberOfSamples = 1 + (long) floor ((my xmax - my xmin) * samplingFrequency);   // >= 1
 		double samplingPeriod = 1.0 / samplingFrequency;
-		double tmid = (tmin + tmax) / 2;
+		double tmid = (tmin + tmax) / 2.0;
 		double t1 = tmid - 0.5 * (numberOfSamples - 1) * samplingPeriod;
 		autoSound thee = Sound_create (1, tmin, tmax, numberOfSamples, samplingPeriod, t1);
 		double phase = 0.0;
@@ -97,9 +97,9 @@ Sound PitchTier_to_Sound_sine (PitchTier me, double tmin, double tmax, double sa
 			phase += fleft * thy dx;
 			thy z [1] [isamp] = 0.5 * sin (2.0 * NUMpi * phase);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound (sine).");
+		Melder_throw (me, U": not converted to Sound (sine).");
 	}
 }
 
@@ -107,9 +107,9 @@ void PitchTier_playPart_sine (PitchTier me, double tmin, double tmax) {
 	try {
 		if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; }   // autowindowing
 		autoSound sound = PitchTier_to_Sound_sine (me, tmin, tmax, 44100.0);
-		Sound_playPart (sound.peek(), tmin, tmax, NULL, NULL);
+		Sound_playPart (sound.peek(), tmin, tmax, nullptr, nullptr);
 	} catch (MelderError) {
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
diff --git a/fon/PitchTier_to_Sound.h b/fon/PitchTier_to_Sound.h
index 9c17bab..237c332 100644
--- a/fon/PitchTier_to_Sound.h
+++ b/fon/PitchTier_to_Sound.h
@@ -1,6 +1,6 @@
 /* PitchTier_to_Sound.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,18 +20,18 @@
 #include "PitchTier.h"
 #include "Sound.h"
 
-Sound PitchTier_to_Sound_pulseTrain (PitchTier me, double samplingFrequency,
+autoSound PitchTier_to_Sound_pulseTrain (PitchTier me, double samplingFrequency,
 	 double adaptFactor, double adaptTime, long interpolationDepth,
-	 int hum);
-Sound PitchTier_to_Sound_phonation (PitchTier me, double samplingFrequency,
+	 bool hum);
+autoSound PitchTier_to_Sound_phonation (PitchTier me, double samplingFrequency,
 	 double adaptFactor, double maximumPeriod,
 	 double openPhase, double collisionPhase, double power1, double power2,
-	 int hum);
-void PitchTier_playPart (PitchTier me, double tmin, double tmax, int hum);
+	 bool hum);
+void PitchTier_playPart (PitchTier me, double tmin, double tmax, bool hum);
 void PitchTier_play (PitchTier me);
 void PitchTier_hum (PitchTier me);
 
-Sound PitchTier_to_Sound_sine (PitchTier me, double tmin, double tmax, double samplingFrequency);
+autoSound PitchTier_to_Sound_sine (PitchTier me, double tmin, double tmax, double samplingFrequency);
 void PitchTier_playPart_sine (PitchTier me, double tmin, double tmax);
 
 /* End of file PitchTier_to_Sound.h */
diff --git a/fon/Pitch_AnyTier_to_PitchTier.cpp b/fon/Pitch_AnyTier_to_PitchTier.cpp
index c86b568..bb5011c 100644
--- a/fon/Pitch_AnyTier_to_PitchTier.cpp
+++ b/fon/Pitch_AnyTier_to_PitchTier.cpp
@@ -1,6 +1,6 @@
 /* Pitch_AnyTier_to_PitchTier.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,10 +26,10 @@
 #include "Pitch_AnyTier_to_PitchTier.h"
 #include "Pitch_to_PitchTier.h"
 
-PitchTier PitchTier_AnyTier_to_PitchTier (PitchTier pitch, AnyTier tier) {
+autoPitchTier PitchTier_AnyTier_to_PitchTier (PitchTier pitch, AnyTier tier) {
 	try {
 		SortedSetOfDouble points = tier -> points;
-		if (pitch -> points -> size == 0) Melder_throw ("No pitch points.");
+		if (pitch -> points -> size == 0) Melder_throw (U"No pitch points.");
 
 		/*
 		 * Result's domain is a union of both domains.
@@ -48,13 +48,13 @@ PitchTier PitchTier_AnyTier_to_PitchTier (PitchTier pitch, AnyTier tier) {
 			RealTier_addPoint (thee.peek(), time, frequency);
 		}
 
-		return thee.peek();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (pitch, " & ", tier, ": not converted to PitchTier.");
+		Melder_throw (pitch, U" & ", tier, U": not converted to PitchTier.");
 	}
 }
 
-PitchTier Pitch_AnyTier_to_PitchTier (Pitch pitch, AnyTier tier, int checkMethod) {
+autoPitchTier Pitch_AnyTier_to_PitchTier (Pitch pitch, AnyTier tier, int checkMethod) {
 	try {
 		SortedSetOfDouble points = tier -> points;
 		if (checkMethod == 2) {
@@ -78,13 +78,13 @@ PitchTier Pitch_AnyTier_to_PitchTier (Pitch pitch, AnyTier tier, int checkMethod
 			double time = point -> number;
 			double frequency = Pitch_getValueAtTime (pitch, time, kPitch_unit_HERTZ, Pitch_LINEAR);
 			if (frequency == NUMundefined && checkMethod)
-				Melder_throw ("No periodicity at time ", time, " seconds.");
+				Melder_throw (U"No periodicity at time ", time, U" seconds.");
 			RealTier_addPoint (thee.peek(), time, frequency);
 		}
 
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (pitch, " & ", tier, ": not converted to PitchTier.");
+		Melder_throw (pitch, U" & ", tier, U": not converted to PitchTier.");
 	}
 }
 
diff --git a/fon/Pitch_AnyTier_to_PitchTier.h b/fon/Pitch_AnyTier_to_PitchTier.h
index 529347c..928db8f 100644
--- a/fon/Pitch_AnyTier_to_PitchTier.h
+++ b/fon/Pitch_AnyTier_to_PitchTier.h
@@ -1,6 +1,6 @@
 /* Pitch_AnyTier_to_PitchTier.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
 #include "AnyTier.h"
 #include "PitchTier.h"
 
-PitchTier Pitch_AnyTier_to_PitchTier (Pitch pitch, AnyTier tier, int checkMethod);
-PitchTier PitchTier_AnyTier_to_PitchTier (PitchTier pitch, AnyTier tier);
+autoPitchTier Pitch_AnyTier_to_PitchTier (Pitch pitch, AnyTier tier, int checkMethod);
+autoPitchTier PitchTier_AnyTier_to_PitchTier (PitchTier pitch, AnyTier tier);
 
 /* End of file Pitch_AnyTier_to_PitchTier.h */
diff --git a/fon/Pitch_Intensity.cpp b/fon/Pitch_Intensity.cpp
index 3b97723..ee39937 100644
--- a/fon/Pitch_Intensity.cpp
+++ b/fon/Pitch_Intensity.cpp
@@ -1,6 +1,6 @@
 /* Pitch_Intensity.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -53,7 +53,7 @@ void Pitch_Intensity_draw (Pitch pitch, Intensity intensity, Graphics g,
 	for (long i = 1; i <= pitch -> nx; i ++) {
 		double t = Sampled_indexToX (pitch, i);
 		double x = pitch -> frame [i]. candidate [1]. frequency;
-		double y = Sampled_getValueAtX (intensity, t, Pitch_LEVEL_FREQUENCY, kPitch_unit_HERTZ, TRUE);
+		double y = Sampled_getValueAtX (intensity, t, Pitch_LEVEL_FREQUENCY, kPitch_unit_HERTZ, true);
 		if (x == 0) {
 			continue;   /* Voiceless. */
 		}
@@ -72,10 +72,10 @@ void Pitch_Intensity_draw (Pitch pitch, Intensity intensity, Graphics g,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Fundamental frequency (Hz)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"Intensity (dB)");
-		Graphics_marksLeft (g, 2, 1, 1, 0);
+		Graphics_textBottom (g, true, U"Fundamental frequency (Hz)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Intensity (dB)");
+		Graphics_marksLeft (g, 2, true, true, false);
 	}
 }
 
diff --git a/fon/Pitch_def.h b/fon/Pitch_def.h
index 92e1aae..8adf968 100644
--- a/fon/Pitch_def.h
+++ b/fon/Pitch_def.h
@@ -1,6 +1,6 @@
 /* Pitch_def.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -55,10 +55,10 @@ oo_END_STRUCT (Pitch_Candidate)
 oo_DEFINE_STRUCT (Pitch_Frame)
 
 	#if oo_READING_BINARY
-		if (localVersion < 0) {
+		if (formatVersion < 0) {
 			oo_INT (nCandidates)
 			oo_FLOAT (intensity)
-		} else if (localVersion == 0) {
+		} else if (formatVersion == 0) {
 			oo_FLOAT (intensity)
 			oo_LONG (nCandidates)
 		} else {
@@ -83,16 +83,24 @@ oo_DEFINE_CLASS (Pitch, Sampled)
 	oo_STRUCT_VECTOR (Pitch_Frame, frame, nx)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
-			virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
-			virtual int v_getMinimumUnit (long ilevel);
-			virtual int v_getMaximumUnit (long ilevel);
-			virtual const wchar_t * v_getUnitText (long ilevel, int unit, unsigned long flags);
-			virtual bool v_isUnitLogarithmic (long ilevel, int unit);
-			virtual double v_convertStandardToSpecialUnit (double value, long ilevel, int unit);
-			virtual double v_convertSpecialToStandardUnit (double value, long ilevel, int unit);
-			virtual double v_getValueAtSample (long isamp, long ilevel, int unit);
+		void v_info ()
+			override;
+		int v_domainQuantity ()
+			override { return MelderQuantity_TIME_SECONDS; }
+		int v_getMinimumUnit (long ilevel)
+			override;
+		int v_getMaximumUnit (long ilevel)
+			override;
+		const char32 * v_getUnitText (long ilevel, int unit, unsigned long flags)
+			override;
+		bool v_isUnitLogarithmic (long ilevel, int unit)
+			override;
+		double v_convertStandardToSpecialUnit (double value, long ilevel, int unit)
+			override;
+		double v_convertSpecialToStandardUnit (double value, long ilevel, int unit)
+			override;
+		double v_getValueAtSample (long isamp, long ilevel, int unit)
+			override;
 	#endif
 
 oo_END_CLASS (Pitch)
diff --git a/fon/Pitch_enums.h b/fon/Pitch_enums.h
index 0fe6cc6..5aa6d5d 100644
--- a/fon/Pitch_enums.h
+++ b/fon/Pitch_enums.h
@@ -1,6 +1,6 @@
 /* Pitch_enums.h
  *
- * Copyright (C) 1992-2007,2013 Paul Boersma
+ * Copyright (C) 1992-2007,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,15 +18,15 @@
  */
 
 enums_begin (kPitch_unit, 0)
-	enums_add (kPitch_unit, 0, HERTZ, L"Hertz")
-	enums_add (kPitch_unit, 1, HERTZ_LOGARITHMIC, L"Hertz (logarithmic)")
-	enums_add (kPitch_unit, 2, MEL, L"mel")
-	enums_add (kPitch_unit, 3, LOG_HERTZ, L"logHertz")
-	enums_add (kPitch_unit, 4, SEMITONES_1, L"semitones re 1 Hz")
-	enums_add (kPitch_unit, 5, SEMITONES_100, L"semitones re 100 Hz")
-	enums_add (kPitch_unit, 6, SEMITONES_200, L"semitones re 200 Hz")
-	enums_add (kPitch_unit, 7, SEMITONES_440, L"semitones re 440 Hz")
-	enums_add (kPitch_unit, 8, ERB, L"ERB")
+	enums_add (kPitch_unit, 0, HERTZ, U"Hertz")
+	enums_add (kPitch_unit, 1, HERTZ_LOGARITHMIC, U"Hertz (logarithmic)")
+	enums_add (kPitch_unit, 2, MEL, U"mel")
+	enums_add (kPitch_unit, 3, LOG_HERTZ, U"logHertz")
+	enums_add (kPitch_unit, 4, SEMITONES_1, U"semitones re 1 Hz")
+	enums_add (kPitch_unit, 5, SEMITONES_100, U"semitones re 100 Hz")
+	enums_add (kPitch_unit, 6, SEMITONES_200, U"semitones re 200 Hz")
+	enums_add (kPitch_unit, 7, SEMITONES_440, U"semitones re 440 Hz")
+	enums_add (kPitch_unit, 8, ERB, U"ERB")
 enums_end (kPitch_unit, 8, HERTZ)
 
 /* End of file Pitch_enums.h */
diff --git a/fon/Pitch_to_PitchTier.cpp b/fon/Pitch_to_PitchTier.cpp
index dae2c2e..a21d9c7 100644
--- a/fon/Pitch_to_PitchTier.cpp
+++ b/fon/Pitch_to_PitchTier.cpp
@@ -1,6 +1,6 @@
 /* Pitch_to_PitchTier.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 
 #include "Pitch_to_PitchTier.h"
 
-PitchTier Pitch_to_PitchTier (Pitch me) {
+autoPitchTier Pitch_to_PitchTier (Pitch me) {
 	try {
 		autoPitchTier thee = PitchTier_create (my xmin, my xmax);
 		for (long i = 1; i <= my nx; i ++) {
@@ -40,9 +40,9 @@ PitchTier Pitch_to_PitchTier (Pitch me) {
 				RealTier_addPoint (thee.peek(), time, frequency);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to PitchTier.");
+		Melder_throw (me, U": not converted to PitchTier.");
 	}
 }
 
@@ -79,7 +79,7 @@ static void Pitch_line (Pitch me, Graphics g, double tmin, double fleft, double
 }
 
 void PitchTier_Pitch_draw (PitchTier me, Pitch uv, Graphics g,
-	double tmin, double tmax, double fmin, double fmax, int nonPeriodicLineType, int garnish, const wchar_t *method)
+	double tmin, double tmax, double fmin, double fmax, int nonPeriodicLineType, int garnish, const char32 *method)
 {
 	long n = my points -> size, imin, imax, i;
 	if (nonPeriodicLineType == 0) {
@@ -116,16 +116,16 @@ void PitchTier_Pitch_draw (PitchTier me, Pitch uv, Graphics g,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"Frequency (Hz)");
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Frequency (Hz)");
 	}
 }
 
-Pitch Pitch_PitchTier_to_Pitch (Pitch me, PitchTier tier) {
+autoPitch Pitch_PitchTier_to_Pitch (Pitch me, PitchTier tier) {
 	try {
-		if (tier -> points -> size == 0) Melder_throw ("No pitch points.");
+		if (tier -> points -> size == 0) Melder_throw (U"No pitch points.");
 		autoPitch thee = Data_copy (me);
 		for (long iframe = 1; iframe <= my nx; iframe ++) {
 			Pitch_Frame frame = & thy frame [iframe];
@@ -135,9 +135,9 @@ Pitch Pitch_PitchTier_to_Pitch (Pitch me, PitchTier tier) {
 			cand -> strength = 0.9;
 			frame -> nCandidates = 1;
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", tier, ": not converted to Pitch.");
+		Melder_throw (me, U" & ", tier, U": not converted to Pitch.");
 	}
 }
 
diff --git a/fon/Pitch_to_PitchTier.h b/fon/Pitch_to_PitchTier.h
index dde6985..8365588 100644
--- a/fon/Pitch_to_PitchTier.h
+++ b/fon/Pitch_to_PitchTier.h
@@ -1,6 +1,6 @@
 /* Pitch_to_PitchTier.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
 #include "Pitch.h"
 #include "PitchTier.h"
 
-PitchTier Pitch_to_PitchTier (Pitch me);
+autoPitchTier Pitch_to_PitchTier (Pitch me);
 /*
 	Creates a PitchTier from an existing Pitch contour.
 	The best candidate in each frame becomes a target in the result.
@@ -29,8 +29,8 @@ PitchTier Pitch_to_PitchTier (Pitch me);
 
 void PitchTier_Pitch_draw (PitchTier me, Pitch uv, Graphics g,
 	double tmin, double tmax, double fmin, double fmax,
-	int nonPeriodicLineType, int garnish, const wchar_t *method);
+	int nonPeriodicLineType, int garnish, const char32 *method);
 
-Pitch Pitch_PitchTier_to_Pitch (Pitch me, PitchTier tier);
+autoPitch Pitch_PitchTier_to_Pitch (Pitch me, PitchTier tier);
 
 /* End of file Pitch_to_PitchTier.h */
diff --git a/fon/Pitch_to_PointProcess.cpp b/fon/Pitch_to_PointProcess.cpp
index 59769d6..bf85ad0 100644
--- a/fon/Pitch_to_PointProcess.cpp
+++ b/fon/Pitch_to_PointProcess.cpp
@@ -1,6 +1,6 @@
 /* Pitch_to_PointProcess.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,25 +38,25 @@
 #include "Pitch_to_PitchTier.h"
 #include <ctype.h>
 
-PointProcess Pitch_to_PointProcess (Pitch pitch) {
+autoPointProcess Pitch_to_PointProcess (Pitch pitch) {
 	try {
 		autoPitchTier pitchTier = Pitch_to_PitchTier (pitch);
 		autoPointProcess point = PitchTier_Pitch_to_PointProcess (pitchTier.peek(), pitch);
-		return point.transfer();
+		return point;
 	} catch (MelderError) {
-		Melder_throw (pitch, ": not converted to PointProcess.");
+		Melder_throw (pitch, U": not converted to PointProcess.");
 	}
 }
 
 static int Pitch_getVoicedIntervalAfter (Pitch me, double after, double *tleft, double *tright) {
 	long ileft = Sampled_xToHighIndex (me, after), iright;
-	if (ileft > my nx) return 0;   /* Offright. */
-	if (ileft < 1) ileft = 1;   /* Offleft. */
+	if (ileft > my nx) return 0;   // offright
+	if (ileft < 1) ileft = 1;   // offleft
 
 	/* Search for first voiced frame. */
 	for (; ileft <= my nx; ileft ++)
 		if (Pitch_isVoiced_i (me, ileft)) break;
-	if (ileft > my nx) return 0;   /* Offright. */
+	if (ileft > my nx) return 0;   // offright
 
 	/* Search for last voiced frame. */
 	for (iright = ileft; iright <= my nx; iright ++)
@@ -68,6 +68,7 @@ static int Pitch_getVoicedIntervalAfter (Pitch me, double after, double *tleft,
 	if (*tleft >= my xmax - 0.5 * my dx) return 0;
 	if (*tleft < my xmin) *tleft = my xmin;
 	if (*tright > my xmax) *tright = my xmax;
+	if (*tright <= after) return 0;
 	return 1;
 }
 
@@ -77,9 +78,9 @@ static double findExtremum_3 (double *channel1_base, double *channel2_base, long
 	long imin = 1, imax = 1, i, iextr;
 	double minimum, maximum;
 	if (n < 3) {
-		if (n <= 0) return 0.0;   /* Outside. */
+		if (n <= 0) return 0.0;   // outside
 		else if (n == 1) return 1.0;
-		else {   /* n == 2 */
+		else {   // n == 2
 			double x1 = channel2 ? 0.5 * (channel1 [1] + channel2 [1]) : channel1 [1];
 			double x2 = channel2 ? 0.5 * (channel1 [2] + channel2 [2]) : channel1 [2];
 			double xleft = includeAll ? fabs (x1) : includeMaxima ? x1 : - x1;
@@ -96,7 +97,7 @@ static double findExtremum_3 (double *channel1_base, double *channel2_base, long
 		if (value > maximum) { maximum = value; imax = i; }
 	}
 	if (minimum == maximum) {
-		return 0.5 * (n + 1.0);   /* All equal. */
+		return 0.5 * (n + 1.0);   // all equal
 	}
 	iextr = includeAll ? ( fabs (minimum) > fabs (maximum) ? imin : imax ) : includeMaxima ? imax : imin;
 	if (iextr == 1) return 1.0;
@@ -116,36 +117,29 @@ static double Sound_findExtremum (Sound me, double tmin, double tmax, int includ
 	if (imin < 1) imin = 1;
 	if (imax > my nx) imax = my nx;
 	double iextremum = findExtremum_3 (my z [1], my ny > 1 ? my z [2] : NULL, imin - 1, imax - imin + 1, includeMaxima, includeMinima);
-	if (iextremum)
+	if (iextremum != 0.0)
 		return my x1 + (imin - 1 + iextremum - 1) * my dx;
 	else
 		return (tmin + tmax) / 2;
 }
 
 static double Sound_findMaximumCorrelation (Sound me, double t1, double windowLength, double tmin2, double tmax2, double *tout, double *peak) {
-	double maximumCorrelation = -1.0, r1 = 0.0, r2 = 0.0, r3 = 0.0, r1_best, r3_best, ir;
+	double maximumCorrelation = -1.0;   // smart 'impossible' starting value
+	double r1_best = NUMundefined, r3_best = NUMundefined, ir = NUMundefined;   // assignments not necessary, but extra safe
+	double r1 = 0.0, r2 = 0.0, r3 = 0.0;
 	double halfWindowLength = 0.5 * windowLength;
 	long ileft1 = Sampled_xToNearestIndex ((Sampled) me, t1 - halfWindowLength);
 	long iright1 = Sampled_xToNearestIndex ((Sampled) me, t1 + halfWindowLength);
 	long ileft2min = Sampled_xToLowIndex ((Sampled) me, tmin2 - halfWindowLength);
 	long ileft2max = Sampled_xToHighIndex ((Sampled) me, tmax2 - halfWindowLength);
-	*peak = 0.0;   /* Default. */
+	*peak = 0.0;   // default
+	Melder_assert (ileft2max >= ileft2min);   // if the loop is never executed, the result will be garbage
 	for (long ileft2 = ileft2min; ileft2 <= ileft2max; ileft2 ++) {
 		double norm1 = 0.0, norm2 = 0.0, product = 0.0, localPeak = 0.0;
-		if (my ny == 1) {
+		for (long ichan = 1; ichan <= my ny; ichan ++) {
 			for (long i1 = ileft1, i2 = ileft2; i1 <= iright1; i1 ++, i2 ++) {
 				if (i1 < 1 || i1 > my nx || i2 < 1 || i2 > my nx) continue;
-				double amp1 = my z [1] [i1], amp2 = my z [1] [i2];
-				norm1 += amp1 * amp1;
-				norm2 += amp2 * amp2;
-				product += amp1 * amp2;
-				if (fabs (amp2) > localPeak)
-					localPeak = fabs (amp2);
-			}
-		} else {
-			for (long i1 = ileft1, i2 = ileft2; i1 <= iright1; i1 ++, i2 ++) {
-				if (i1 < 1 || i1 > my nx || i2 < 1 || i2 > my nx) continue;
-				double amp1 = 0.5 * (my z [1] [i1] + my z [2] [i1]), amp2 = 0.5 * (my z [1] [i2] + my z [2] [i2]);
+				double amp1 = my z [ichan] [i1], amp2 = my z [ichan] [i2];
 				norm1 += amp1 * amp1;
 				norm2 += amp2 * amp2;
 				product += amp1 * amp2;
@@ -153,10 +147,10 @@ static double Sound_findMaximumCorrelation (Sound me, double t1, double windowLe
 					localPeak = fabs (amp2);
 			}
 		}
-		r1 = r2;
-		r2 = r3;
-		r3 = product ? product / (sqrt (norm1 * norm2)) : 0.0;
-		if (r2 > maximumCorrelation && r2 >= r1 && r2 >= r3) {
+		r1 = r2;   // >= 0
+		r2 = r3;   // >= 0
+		r3 = product != 0.0 ? product / (sqrt (norm1 * norm2)) : 0.0;   // >= 0
+		if (r2 > maximumCorrelation /* true on first test */ && r2 >= r1 && r2 >= r3) {
 			r1_best = r1;
 			maximumCorrelation = r2;
 			r3_best = r3;
@@ -167,7 +161,9 @@ static double Sound_findMaximumCorrelation (Sound me, double t1, double windowLe
 	/*
 	 * Improve the result by means of parabolic interpolation.
 	 */
-	if (maximumCorrelation > -1.0) {
+	if (maximumCorrelation > -1.0) {   // was maximumCorrelation ever assigned to?...
+		// ...then r1_best and r3_best and ir must also have been assigned to:
+		Melder_assert (NUMdefined (r1_best) && NUMdefined (r3_best) && NUMdefined (ir));
 		double d2r = 2 * maximumCorrelation - r1_best - r3_best;
 		if (d2r != 0.0) {
 			double dr = 0.5 * (r3_best - r1_best);
@@ -179,35 +175,40 @@ static double Sound_findMaximumCorrelation (Sound me, double t1, double windowLe
 	return maximumCorrelation;
 }
 
-PointProcess Sound_Pitch_to_PointProcess_cc (Sound sound, Pitch pitch) {
+autoPointProcess Sound_Pitch_to_PointProcess_cc (Sound sound, Pitch pitch) {
 	try {
 		autoPointProcess point = PointProcess_create (sound -> xmin, sound -> xmax, 10);
 		double t = pitch -> xmin;
-		double addedRight = -1e300;
+		double addedRight = -1e308;
 		double globalPeak = Vector_getAbsoluteExtremum (sound, sound -> xmin, sound -> xmax, 0), peak;
 		
 		/*
 		 * Cycle over all voiced intervals.
 		 */
-		autoMelderProgress progress (L"Sound & Pitch: To PointProcess...");
+		autoMelderProgress progress (U"Sound & Pitch: To PointProcess...");
 		for (;;) {
 			double tleft, tright;
 			if (! Pitch_getVoicedIntervalAfter (pitch, t, & tleft, & tright)) break;
+			Melder_assert (tright > t);
+
 			/*
 			 * Go to the middle of the voice stretch.
 			 */
 			double tmiddle = (tleft + tright) / 2;
-			Melder_progress ((tmiddle - sound -> xmin) / (sound -> xmax - sound -> xmin), L"Sound & Pitch to PointProcess");
+			Melder_progress ((tmiddle - sound -> xmin) / (sound -> xmax - sound -> xmin), U"Sound & Pitch to PointProcess");
 			double f0middle = Pitch_getValueAtTime (pitch, tmiddle, kPitch_unit_HERTZ, Pitch_LINEAR);
 
 			/*
 			 * Our first point is near this middle.
 			 */
 			if (f0middle == NUMundefined) {
-				Melder_fatal ("Sound_Pitch_to_PointProcess_cc: tleft %ls, tright %ls, f0middle %ls",
-					Melder_double (tleft), Melder_double (tright), Melder_double (f0middle));
+				Melder_fatal (U"Sound_Pitch_to_PointProcess_cc:"
+					U" tleft ", tleft,
+					U", tright ", tright,
+					U", f0middle ", f0middle
+				);
 			}
-			double tmax = Sound_findExtremum (sound, tmiddle - 0.5 / f0middle, tmiddle + 0.5 / f0middle, TRUE, TRUE);
+			double tmax = Sound_findExtremum (sound, tmiddle - 0.5 / f0middle, tmiddle + 0.5 / f0middle, true, true);
 			Melder_assert (NUMdefined (tmax));
 			PointProcess_addPoint (point.peek(), tmax);
 
@@ -216,7 +217,7 @@ PointProcess Sound_Pitch_to_PointProcess_cc (Sound sound, Pitch pitch) {
 				double f0 = Pitch_getValueAtTime (pitch, tmax, kPitch_unit_HERTZ, Pitch_LINEAR), correlation;
 				if (f0 == NUMundefined) break;
 				correlation = Sound_findMaximumCorrelation (sound, tmax, 1.0 / f0, tmax - 1.25 / f0, tmax - 0.8 / f0, & tmax, & peak);
-				if (correlation == -1) /*break*/ tmax -= 1.0 / f0;   /* This one period will drop out. */
+				if (correlation == -1) /*break*/ tmax -= 1.0 / f0;   // this one period will drop out
 				if (tmax < tleft) {
 					if (correlation > 0.7 && peak > 0.023333 * globalPeak && tmax - addedRight > 0.8 / f0) {
 						PointProcess_addPoint (point.peek(), tmax);
@@ -249,23 +250,23 @@ PointProcess Sound_Pitch_to_PointProcess_cc (Sound sound, Pitch pitch) {
 			}
 			t = tright;
 		}
-		return point.transfer();
+		return point;
 	} catch (MelderError) {
-		Melder_throw (sound, " & ", pitch, ": not converted to PointProcess (cc).");
+		Melder_throw (sound, U" & ", pitch, U": not converted to PointProcess (cc).");
 	}
 }
 	
 
-PointProcess Sound_Pitch_to_PointProcess_peaks (Sound sound, Pitch pitch, int includeMaxima, int includeMinima) {
+autoPointProcess Sound_Pitch_to_PointProcess_peaks (Sound sound, Pitch pitch, int includeMaxima, int includeMinima) {
 	try {
 		autoPointProcess point = PointProcess_create (sound -> xmin, sound -> xmax, 10);
 		double t = pitch -> xmin;
-		double addedRight = -1e300;
+		double addedRight = -1e308;
 		/*
 		 * Cycle over all voiced intervals.
 		 */
 
-		autoMelderProgress progress (L"Sound & Pitch: To PointProcess");
+		autoMelderProgress progress (U"Sound & Pitch: To PointProcess");
 		for (;;) {
 			double tleft, tright;
 			if (! Pitch_getVoicedIntervalAfter (pitch, t, & tleft, & tright)) break;
@@ -273,7 +274,7 @@ PointProcess Sound_Pitch_to_PointProcess_peaks (Sound sound, Pitch pitch, int in
 			 * Go to the middle of the voiced interval.
 			 */
 			double tmiddle = (tleft + tright) / 2;
-			Melder_progress ((tmiddle - sound -> xmin) / (sound -> xmax - sound -> xmin), L"Sound & Pitch: To PointProcess");
+			Melder_progress ((tmiddle - sound -> xmin) / (sound -> xmax - sound -> xmin), U"Sound & Pitch: To PointProcess");
 			double f0middle = Pitch_getValueAtTime (pitch, tmiddle, kPitch_unit_HERTZ, Pitch_LINEAR);
 
 			/*
@@ -314,9 +315,9 @@ PointProcess Sound_Pitch_to_PointProcess_peaks (Sound sound, Pitch pitch, int in
 			}
 			t = tright;
 		}
-		return point.transfer();
+		return point;
 	} catch (MelderError) {
-		Melder_throw (sound, " & ", pitch, ": not converted to PointProcess (peaks).");
+		Melder_throw (sound, U" & ", pitch, U": not converted to PointProcess (peaks).");
 	}
 }
 	
diff --git a/fon/Pitch_to_PointProcess.h b/fon/Pitch_to_PointProcess.h
index 67bd95c..6d685f4 100644
--- a/fon/Pitch_to_PointProcess.h
+++ b/fon/Pitch_to_PointProcess.h
@@ -21,10 +21,10 @@
 #include "PointProcess.h"
 #include "Sound.h"
 
-PointProcess Pitch_to_PointProcess (Pitch pitch);
+autoPointProcess Pitch_to_PointProcess (Pitch pitch);
 
-PointProcess Sound_Pitch_to_PointProcess_cc (Sound sound, Pitch pitch);
+autoPointProcess Sound_Pitch_to_PointProcess_cc (Sound sound, Pitch pitch);
 
-PointProcess Sound_Pitch_to_PointProcess_peaks (Sound sound, Pitch pitch, int includeMaxima, int includeMinima);
+autoPointProcess Sound_Pitch_to_PointProcess_peaks (Sound sound, Pitch pitch, int includeMaxima, int includeMinima);
 
 /* End of file Pitch_to_PointProcess.h */
diff --git a/fon/Pitch_to_Sound.cpp b/fon/Pitch_to_Sound.cpp
index e63a8ab..58500bf 100644
--- a/fon/Pitch_to_Sound.cpp
+++ b/fon/Pitch_to_Sound.cpp
@@ -1,6 +1,6 @@
 /* Pitch_to_Sound.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@
 #include "PitchTier_to_Sound.h"
 #include "Pitch_to_PitchTier.h"
 
-Sound Pitch_to_Sound (Pitch me, double tmin, double tmax, int hum) {
+autoSound Pitch_to_Sound (Pitch me, double tmin, double tmax, int hum) {
 	static double formant [1 + 6] = { 0, 600, 1400, 2400, 3400, 4500, 5500 };
 	static double bandwidth [1 + 6] = { 0, 50, 100, 200, 300, 400, 500 };
 	try {
@@ -40,33 +40,33 @@ Sound Pitch_to_Sound (Pitch me, double tmin, double tmax, int hum) {
 		if (hum) {
 			Sound_filterWithFormants (sound.peek(), tmin, tmax, 6, formant, bandwidth);
 		}
-		return sound.transfer();
+		return sound;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
 void Pitch_play (Pitch me, double tmin, double tmax) {
 	try {
-		autoSound sound = Pitch_to_Sound (me, tmin, tmax, FALSE);
+		autoSound sound = Pitch_to_Sound (me, tmin, tmax, false);
 		if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; }   // autowindowing
-		Sound_playPart (sound.peek(), tmin, tmax, NULL, NULL);
+		Sound_playPart (sound.peek(), tmin, tmax, nullptr, nullptr);
 	} catch (MelderError) {
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
 void Pitch_hum (Pitch me, double tmin, double tmax) {
 	try {
-		autoSound sound = Pitch_to_Sound (me, tmin, tmax, TRUE);
+		autoSound sound = Pitch_to_Sound (me, tmin, tmax, true);
 		if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; }   // autowindowing
-		Sound_playPart (sound.peek(), tmin, tmax, NULL, NULL);
+		Sound_playPart (sound.peek(), tmin, tmax, nullptr, nullptr);
 	} catch (MelderError) {
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
-Sound Pitch_to_Sound_sine (Pitch me, double tmin, double tmax, double samplingFrequency, int roundToNearestZeroCrossings) {
+autoSound Pitch_to_Sound_sine (Pitch me, double tmin, double tmax, double samplingFrequency, int roundToNearestZeroCrossings) {
 	try {
 		autoPitchTier tier = Pitch_to_PitchTier (me);
 		autoSound sound = PitchTier_to_Sound_sine (tier.peek(), tmin, tmax, samplingFrequency);
@@ -92,9 +92,9 @@ Sound Pitch_to_Sound_sine (Pitch me, double tmin, double tmax, double samplingFr
 		if (unvoicedMax > unvoicedMin) {
 			Sound_setZero (sound.peek(), unvoicedMin, unvoicedMax, roundToNearestZeroCrossings);
 		}
-		return sound.transfer();
+		return sound;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound (sine).");
+		Melder_throw (me, U": not converted to Sound (sine).");
 	}
 }
 
diff --git a/fon/Pitch_to_Sound.h b/fon/Pitch_to_Sound.h
index 0b30e5b..3517b15 100644
--- a/fon/Pitch_to_Sound.h
+++ b/fon/Pitch_to_Sound.h
@@ -1,6 +1,6 @@
 /* Pitch_to_Sound.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,7 +24,7 @@
 /* then this PointProcess into a Sound (pulse train), */
 /* and then optionally filter this with 6 formants. */
 
-Sound Pitch_to_Sound (Pitch me, double tmin, double tmax, int hum);
+autoSound Pitch_to_Sound (Pitch me, double tmin, double tmax, int hum);
 void Pitch_play (Pitch me, double tmin, double tmax);
 void Pitch_hum (Pitch me, double tmin, double tmax);
 
@@ -32,7 +32,7 @@ void Pitch_hum (Pitch me, double tmin, double tmax);
 /* then this PitchTier into a Sound (sine wave), */
 /* and then cuts away the unvoiced stretches. */
 
-Sound Pitch_to_Sound_sine (Pitch me, double tmin, double tmax, double samplingFrequency,
+autoSound Pitch_to_Sound_sine (Pitch me, double tmin, double tmax, double samplingFrequency,
 	int roundToNearestZeroCrossings);
 
 /* End of file Pitch_to_Sound.h */
diff --git a/fon/PointEditor.cpp b/fon/PointEditor.cpp
index cbb7c7f..187aa9c 100644
--- a/fon/PointEditor.cpp
+++ b/fon/PointEditor.cpp
@@ -1,6 +1,6 @@
 /* PointEditor.cpp
  *
- * Copyright (C) 1992-2011,2012,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,140 +35,140 @@ void structPointEditor :: v_destroy () {
 
 static void menu_cb_getJitter_local (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure jitter, make a selection first.");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure jitter, make a selection first.");
 	Melder_informationReal (PointProcess_getJitter_local ((PointProcess) my data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3), NULL);
 }
 
 static void menu_cb_getJitter_local_absolute (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure jitter, make a selection first.");
-	Melder_informationReal (PointProcess_getJitter_local_absolute ((PointProcess) my data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3), L"seconds");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure jitter, make a selection first.");
+	Melder_informationReal (PointProcess_getJitter_local_absolute ((PointProcess) my data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3), U"seconds");
 }
 
 static void menu_cb_getJitter_rap (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure jitter, make a selection first.");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure jitter, make a selection first.");
 	Melder_informationReal (PointProcess_getJitter_rap ((PointProcess) my data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3), NULL);
 }
 
 static void menu_cb_getJitter_ppq5 (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure jitter, make a selection first.");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure jitter, make a selection first.");
 	Melder_informationReal (PointProcess_getJitter_ppq5 ((PointProcess) my data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3), NULL);
 }
 
 static void menu_cb_getJitter_ddp (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure jitter, make a selection first.");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure jitter, make a selection first.");
 	Melder_informationReal (PointProcess_getJitter_ddp ((PointProcess) my data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3), NULL);
 }
 
 static void menu_cb_getShimmer_local (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure shimmer, make a selection first.");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure shimmer, make a selection first.");
 	Melder_informationReal (PointProcess_Sound_getShimmer_local ((PointProcess) my data, my d_sound.data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3, 1.6), NULL);
 }
 
 static void menu_cb_getShimmer_local_dB (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure shimmer, make a selection first.");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure shimmer, make a selection first.");
 	Melder_informationReal (PointProcess_Sound_getShimmer_local_dB ((PointProcess) my data, my d_sound.data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3, 1.6), NULL);
 }
 
 static void menu_cb_getShimmer_apq3 (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure shimmer, make a selection first.");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure shimmer, make a selection first.");
 	Melder_informationReal (PointProcess_Sound_getShimmer_apq3 ((PointProcess) my data, my d_sound.data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3, 1.6), NULL);
 }
 
 static void menu_cb_getShimmer_apq5 (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure shimmer, make a selection first.");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure shimmer, make a selection first.");
 	Melder_informationReal (PointProcess_Sound_getShimmer_apq5 ((PointProcess) my data, my d_sound.data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3, 1.6), NULL);
 }
 
 static void menu_cb_getShimmer_apq11 (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure shimmer, make a selection first.");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure shimmer, make a selection first.");
 	Melder_informationReal (PointProcess_Sound_getShimmer_apq11 ((PointProcess) my data, my d_sound.data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3, 1.6), NULL);
 }
 
 static void menu_cb_getShimmer_dda (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	if (my d_startSelection == my d_endSelection) Melder_throw ("To measure shimmer, make a selection first.");
+	if (my d_startSelection == my d_endSelection) Melder_throw (U"To measure shimmer, make a selection first.");
 	Melder_informationReal (PointProcess_Sound_getShimmer_dda ((PointProcess) my data, my d_sound.data, my d_startSelection, my d_endSelection, 1e-4, 0.02, 1.3, 1.6), NULL);
 }
 
 static void menu_cb_removePoints (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	Editor_save (me, L"Remove point(s)");
+	Editor_save (me, U"Remove point(s)");
 	if (my d_startSelection == my d_endSelection)
 		PointProcess_removePointNear ((PointProcess) my data, my d_startSelection);
 	else
 		PointProcess_removePointsBetween ((PointProcess) my data, my d_startSelection, my d_endSelection);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addPointAtCursor (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	Editor_save (me, L"Add point");
+	Editor_save (me, U"Add point");
 	PointProcess_addPoint ((PointProcess) my data, 0.5 * (my d_startSelection + my d_endSelection));
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addPointAt (EDITOR_ARGS) {
 	EDITOR_IAM (PointEditor);
-	EDITOR_FORM (L"Add point", 0)
-		REAL (L"Position", L"0.0");
+	EDITOR_FORM (U"Add point", 0)
+		REAL (U"Position", U"0.0");
 	EDITOR_OK
-		SET_REAL (L"Position", 0.5 * (my d_startSelection + my d_endSelection));
+		SET_REAL (U"Position", 0.5 * (my d_startSelection + my d_endSelection));
 	EDITOR_DO
-		Editor_save (me, L"Add point");
-		PointProcess_addPoint ((PointProcess) my data, GET_REAL (L"Position"));
+		Editor_save (me, U"Add point");
+		PointProcess_addPoint ((PointProcess) my data, GET_REAL (U"Position"));
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
-static void menu_cb_PointEditorHelp (EDITOR_ARGS) { EDITOR_IAM (PointEditor); Melder_help (L"PointEditor"); }
+static void menu_cb_PointEditorHelp (EDITOR_ARGS) { EDITOR_IAM (PointEditor); Melder_help (U"PointEditor"); }
 
 void structPointEditor :: v_createMenus () {
 	PointEditor_Parent :: v_createMenus ();
 
-	Editor_addCommand (this, L"Query", L"-- query jitter --", 0, NULL);
-	Editor_addCommand (this, L"Query", L"Get jitter (local)", 0, menu_cb_getJitter_local);
-	Editor_addCommand (this, L"Query", L"Get jitter (local, absolute)", 0, menu_cb_getJitter_local_absolute);
-	Editor_addCommand (this, L"Query", L"Get jitter (rap)", 0, menu_cb_getJitter_rap);
-	Editor_addCommand (this, L"Query", L"Get jitter (ppq5)", 0, menu_cb_getJitter_ppq5);
-	Editor_addCommand (this, L"Query", L"Get jitter (ddp)", 0, menu_cb_getJitter_ddp);
+	Editor_addCommand (this, U"Query", U"-- query jitter --", 0, NULL);
+	Editor_addCommand (this, U"Query", U"Get jitter (local)", 0, menu_cb_getJitter_local);
+	Editor_addCommand (this, U"Query", U"Get jitter (local, absolute)", 0, menu_cb_getJitter_local_absolute);
+	Editor_addCommand (this, U"Query", U"Get jitter (rap)", 0, menu_cb_getJitter_rap);
+	Editor_addCommand (this, U"Query", U"Get jitter (ppq5)", 0, menu_cb_getJitter_ppq5);
+	Editor_addCommand (this, U"Query", U"Get jitter (ddp)", 0, menu_cb_getJitter_ddp);
 	if (d_sound.data) {
-		Editor_addCommand (this, L"Query", L"-- query shimmer --", 0, NULL);
-		Editor_addCommand (this, L"Query", L"Get shimmer (local)", 0, menu_cb_getShimmer_local);
-		Editor_addCommand (this, L"Query", L"Get shimmer (local, dB)", 0, menu_cb_getShimmer_local_dB);
-		Editor_addCommand (this, L"Query", L"Get shimmer (apq3)", 0, menu_cb_getShimmer_apq3);
-		Editor_addCommand (this, L"Query", L"Get shimmer (apq5)", 0, menu_cb_getShimmer_apq5);
-		Editor_addCommand (this, L"Query", L"Get shimmer (apq11)", 0, menu_cb_getShimmer_apq11);
-		Editor_addCommand (this, L"Query", L"Get shimmer (dda)", 0, menu_cb_getShimmer_dda);
+		Editor_addCommand (this, U"Query", U"-- query shimmer --", 0, NULL);
+		Editor_addCommand (this, U"Query", U"Get shimmer (local)", 0, menu_cb_getShimmer_local);
+		Editor_addCommand (this, U"Query", U"Get shimmer (local, dB)", 0, menu_cb_getShimmer_local_dB);
+		Editor_addCommand (this, U"Query", U"Get shimmer (apq3)", 0, menu_cb_getShimmer_apq3);
+		Editor_addCommand (this, U"Query", U"Get shimmer (apq5)", 0, menu_cb_getShimmer_apq5);
+		Editor_addCommand (this, U"Query", U"Get shimmer (apq11)", 0, menu_cb_getShimmer_apq11);
+		Editor_addCommand (this, U"Query", U"Get shimmer (dda)", 0, menu_cb_getShimmer_dda);
 	}
 
-	Editor_addMenu (this, L"Point", 0);
-	Editor_addCommand (this, L"Point", L"Add point at cursor", 'P', menu_cb_addPointAtCursor);
-	Editor_addCommand (this, L"Point", L"Add point at...", 0, menu_cb_addPointAt);
-	Editor_addCommand (this, L"Point", L"-- remove point --", 0, NULL);
-	Editor_addCommand (this, L"Point", L"Remove point(s)", GuiMenu_OPTION + 'P', menu_cb_removePoints);
+	Editor_addMenu (this, U"Point", 0);
+	Editor_addCommand (this, U"Point", U"Add point at cursor", 'P', menu_cb_addPointAtCursor);
+	Editor_addCommand (this, U"Point", U"Add point at...", 0, menu_cb_addPointAt);
+	Editor_addCommand (this, U"Point", U"-- remove point --", 0, NULL);
+	Editor_addCommand (this, U"Point", U"Remove point(s)", GuiMenu_OPTION + 'P', menu_cb_removePoints);
 }
 
 void structPointEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	PointEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"PointEditor help", '?', menu_cb_PointEditorHelp);
+	EditorMenu_addCommand (menu, U"PointEditor help", '?', menu_cb_PointEditorHelp);
 }
 
 /********** DRAWING AREA **********/
 
 void structPointEditor :: v_draw () {
-	PointProcess point = (PointProcess) data;
+	PointProcess point = static_cast <PointProcess> (our data);
 	Sound sound = d_sound.data;
 	Graphics_setColour (d_graphics, Graphics_WHITE);
 	Graphics_setWindow (d_graphics, 0, 1, 0, 1);
@@ -178,6 +178,7 @@ void structPointEditor :: v_draw () {
 		long first, last;
 		if (Sampled_getWindowSamples (sound, d_startWindow, d_endWindow, & first, & last) >= 1) {
 			Matrix_getWindowExtrema (sound, first, last, 1, 1, & minimum, & maximum);
+			if (minimum == maximum) minimum -= 1.0, maximum += 1.0;
 		}
 	}
 	Graphics_setWindow (d_graphics, d_startWindow, d_endWindow, minimum, maximum);
@@ -211,16 +212,16 @@ void structPointEditor :: v_play (double a_tmin, double a_tmax) {
 	}
 }
 
-PointEditor PointEditor_create (const wchar_t *title, PointProcess point, Sound sound) {
+autoPointEditor PointEditor_create (const char32 *title, PointProcess point, Sound sound) {
 	try {
 		autoPointEditor me = Thing_new (PointEditor);
 		if (sound) {
 			my monoSound = Sound_convertToMono (sound);
 		}
 		TimeSoundEditor_init (me.peek(), title, point, my monoSound, false);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("PointProcess window not created.");
+		Melder_throw (U"PointProcess window not created.");
 	}
 }
 
diff --git a/fon/PointEditor.h b/fon/PointEditor.h
index 658b159..fd18498 100644
--- a/fon/PointEditor.h
+++ b/fon/PointEditor.h
@@ -2,7 +2,7 @@
 #define _PointEditor_h_
 /* PointEditor.h
  *
- * Copyright (C) 1992-2011,2012 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,19 +23,22 @@
 #include "PointProcess.h"
 
 Thing_define (PointEditor, TimeSoundEditor) {
-	// new data:
-	public:
-		Sound monoSound;
-		GuiObject addPointAtDialog;
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_draw ();
-		virtual void v_play (double tmin, double tmax);
+	Sound monoSound;
+	GuiObject addPointAtDialog;
+
+	void v_destroy ()
+		override;
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_draw ()
+		override;
+	void v_play (double tmin, double tmax)
+		override;
 };
 
-PointEditor PointEditor_create (const wchar_t *title,
+autoPointEditor PointEditor_create (const char32 *title,
 	PointProcess point,
 	Sound sound   // may be NULL
 );
diff --git a/fon/PointProcess.cpp b/fon/PointProcess.cpp
index e38b459..b803f08 100644
--- a/fon/PointProcess.cpp
+++ b/fon/PointProcess.cpp
@@ -1,6 +1,6 @@
 /* PointProcess.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -50,32 +50,32 @@ static void infoPeriods (PointProcess me, double shortestPeriod, double longestP
 	double jitter_rap = PointProcess_getJitter_rap (me, 0.0, 0.0, shortestPeriod, longestPeriod, maximumPeriodFactor);
 	double jitter_ppq5 = PointProcess_getJitter_ppq5 (me, 0.0, 0.0, shortestPeriod, longestPeriod, maximumPeriodFactor);
 	double jitter_ddp = PointProcess_getJitter_ddp (me, 0.0, 0.0, shortestPeriod, longestPeriod, maximumPeriodFactor);
-	MelderInfo_writeLine (L"     Number of periods: ", Melder_integer (numberOfPeriods));
-	MelderInfo_writeLine (L"     Mean period: ", Melder_double (meanPeriod), L" seconds");
-	MelderInfo_writeLine (L"     Stdev period: ", Melder_double (stdevPeriod), L" seconds");
-	MelderInfo_writeLine (L"     Jitter (local): ", Melder_percent (jitter_local, precision));
-	MelderInfo_writeLine (L"     Jitter (local, absolute): ", Melder_fixedExponent (jitter_local_absolute, -6, precision), L" seconds");
-	MelderInfo_writeLine (L"     Jitter (rap): ", Melder_percent (jitter_rap, precision));
-	MelderInfo_writeLine (L"     Jitter (ppq5): ", Melder_percent (jitter_ppq5, precision));
-	MelderInfo_writeLine (L"     Jitter (ddp): ", Melder_percent (jitter_ddp, precision));
+	MelderInfo_writeLine (U"     Number of periods: ", numberOfPeriods);
+	MelderInfo_writeLine (U"     Mean period: ", meanPeriod, U" seconds");
+	MelderInfo_writeLine (U"     Stdev period: ", stdevPeriod, U" seconds");
+	MelderInfo_writeLine (U"     Jitter (local): ", Melder_percent (jitter_local, precision));
+	MelderInfo_writeLine (U"     Jitter (local, absolute): ", Melder_fixedExponent (jitter_local_absolute, -6, precision), U" seconds");
+	MelderInfo_writeLine (U"     Jitter (rap): ", Melder_percent (jitter_rap, precision));
+	MelderInfo_writeLine (U"     Jitter (ppq5): ", Melder_percent (jitter_ppq5, precision));
+	MelderInfo_writeLine (U"     Jitter (ddp): ", Melder_percent (jitter_ddp, precision));
 }
 
 void structPointProcess :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"Number of times: ", Melder_integer (nt));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"Number of times: ", nt);
 	if (nt) {
-		MelderInfo_writeLine (L"First time: ", Melder_double (t [1]), L" seconds");
-		MelderInfo_writeLine (L"Last time: ", Melder_double (t [nt]), L" seconds");
+		MelderInfo_writeLine (U"First time: ", t [1], U" seconds");
+		MelderInfo_writeLine (U"Last time: ", t [nt], U" seconds");
 	}
-	MelderInfo_writeLine (L"Periods between 0.1 ms and 20 ms (pitch between 50 and 10000 Hz),");
-	MelderInfo_writeLine (L"with a maximum \"period factor\" of 1.3:");
+	MelderInfo_writeLine (U"Periods between 0.1 ms and 20 ms (pitch between 50 and 10000 Hz),");
+	MelderInfo_writeLine (U"with a maximum \"period factor\" of 1.3:");
 	infoPeriods (this, 1e-4, 20e-3, 1.3, 3);
-	MelderInfo_writeLine (L"All periods:");
-	infoPeriods (this, 0.0, 0.0, 1e300, 6);
+	MelderInfo_writeLine (U"All periods:");
+	infoPeriods (this, 0.0, 0.0, 1e308, 6);
 }
 
 void structPointProcess :: v_shiftX (double xfrom, double xto) {
@@ -92,8 +92,7 @@ void structPointProcess :: v_scaleX (double xminfrom, double xmaxfrom, double xm
 	}
 }
 
-void PointProcess_init (I, double tmin, double tmax, long initialMaxnt) {
-	iam (PointProcess);
+void PointProcess_init (PointProcess me, double tmin, double tmax, long initialMaxnt) {
 	Function_init (me, tmin, tmax);
 	if (initialMaxnt < 1) initialMaxnt = 1;
 	my maxnt = initialMaxnt;
@@ -101,17 +100,17 @@ void PointProcess_init (I, double tmin, double tmax, long initialMaxnt) {
 	my t = NUMvector <double> (1, my maxnt);
 }
 
-PointProcess PointProcess_create (double tmin, double tmax, long initialMaxnt) {
+autoPointProcess PointProcess_create (double tmin, double tmax, long initialMaxnt) {
 	try {
 		autoPointProcess me = Thing_new (PointProcess);
 		PointProcess_init (me.peek(), tmin, tmax, initialMaxnt);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("PointProcess not created.");
+		Melder_throw (U"PointProcess not created.");
 	}
 }
 
-PointProcess PointProcess_createPoissonProcess (double startingTime, double finishingTime, double density) {
+autoPointProcess PointProcess_createPoissonProcess (double startingTime, double finishingTime, double density) {
 	try {
 		long nt = NUMrandomPoisson ((finishingTime - startingTime) * density);
 		autoPointProcess me = PointProcess_create (startingTime, finishingTime, nt);
@@ -119,9 +118,9 @@ PointProcess PointProcess_createPoissonProcess (double startingTime, double fini
 		for (long i = 1; i <= nt; i ++)
 			my t [i] = NUMrandomUniform (startingTime, finishingTime);
 		NUMsort_d (my nt, my t);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("PointProcess (Poisson process) not created.");
+		Melder_throw (U"PointProcess (Poisson process) not created.");
 	}
 }
 
@@ -178,7 +177,7 @@ long PointProcess_getNearestIndex (PointProcess me, double t) {
 void PointProcess_addPoint (PointProcess me, double t) {
 	try {
 		if (t == NUMundefined)
-			Melder_throw ("Cannot add a point at an undefined time.");
+			Melder_throw (U"Cannot add a point at an undefined time.");
 		if (my nt >= my maxnt) {
 			/*
 			 * Create without change.
@@ -203,7 +202,7 @@ void PointProcess_addPoint (PointProcess me, double t) {
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": point not added.");
+		Melder_throw (me, U": point not added.");
 	}
 }
 
@@ -234,22 +233,22 @@ void PointProcess_removePointsBetween (PointProcess me, double tmin, double tmax
 
 void PointProcess_draw (PointProcess me, Graphics g, double tmin, double tmax, int garnish) {
 	if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; }
-	Graphics_setWindow (g, tmin, tmax, -1, 1);
+	Graphics_setWindow (g, tmin, tmax, -1.0, 1.0);
 	if (my nt) {
 		long imin = PointProcess_getHighIndex (me, tmin), imax = PointProcess_getLowIndex (me, tmax), i;
 		int lineType = Graphics_inqLineType (g);
 		Graphics_setLineType (g, Graphics_DOTTED);
 		Graphics_setInner (g);
 		for (i = imin; i <= imax; i ++) {
-			Graphics_line (g, my t [i], -1, my t [i], 1);
+			Graphics_line (g, my t [i], -1.0, my t [i], 1.0);
 		}
 		Graphics_setLineType (g, lineType);
 		Graphics_unsetInner (g);
 	}
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
 	}
 }
 
@@ -259,7 +258,7 @@ double PointProcess_getInterval (PointProcess me, double t) {
 	return my t [ileft + 1] - my t [ileft];
 }
 
-PointProcess PointProcesses_union (PointProcess me, PointProcess thee) {
+autoPointProcess PointProcesses_union (PointProcess me, PointProcess thee) {
 	try {
 		autoPointProcess him = Data_copy (me);
 		if (thy xmin < my xmin) his xmin = thy xmin;
@@ -267,9 +266,9 @@ PointProcess PointProcesses_union (PointProcess me, PointProcess thee) {
 		for (long i = 1; i <= thy nt; i ++) {
 			PointProcess_addPoint (him.peek(), thy t [i]);
 		}
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": union not computed.");
+		Melder_throw (me, U" & ", thee, U": union not computed.");
 	}
 }
 
@@ -290,7 +289,7 @@ long PointProcess_findPoint (PointProcess me, double t) {
 	return 0;
 }
 
-PointProcess PointProcesses_intersection (PointProcess me, PointProcess thee) {
+autoPointProcess PointProcesses_intersection (PointProcess me, PointProcess thee) {
 	try {
 		autoPointProcess him = Data_copy (me);
 		if (thy xmin > my xmin) his xmin = thy xmin;
@@ -298,34 +297,34 @@ PointProcess PointProcesses_intersection (PointProcess me, PointProcess thee) {
 		for (long i = my nt; i >= 1; i --)
 			if (! PointProcess_findPoint (thee, my t [i]))
 				PointProcess_removePoint (him.peek(), i);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": intersection not computed.");
+		Melder_throw (me, U" & ", thee, U": intersection not computed.");
 	}
 }
 
-PointProcess PointProcesses_difference (PointProcess me, PointProcess thee) {
+autoPointProcess PointProcesses_difference (PointProcess me, PointProcess thee) {
 	try {
 		autoPointProcess him = Data_copy (me);
 		for (long i = my nt; i >= 1; i --)
 			if (PointProcess_findPoint (thee, my t [i]))
 				PointProcess_removePoint (him.peek(), i);
-		return him.transfer();
+		return him;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": difference not computed.");
+		Melder_throw (me, U" & ", thee, U": difference not computed.");
 	}
 }
 
 void PointProcess_fill (PointProcess me, double tmin, double tmax, double period) {
 	try {
 		if (tmax <= tmin) tmin = my xmin, tmax = my xmax;   // autowindowing
-		long n = floor ((tmax - tmin) / period);
+		long n = (long) floor ((tmax - tmin) / period);
 		double t = 0.5 * (tmin + tmax - n * period);
 		for (long i = 1; i <= n; i ++, t += period) {
 			PointProcess_addPoint (me, t);
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not filled.");
+		Melder_throw (me, U": not filled.");
 	}
 }
 
@@ -345,7 +344,7 @@ void PointProcess_voice (PointProcess me, double period, double maxT) {
 		endVoiceless = my xmax;
 		PointProcess_fill (me, beginVoiceless, endVoiceless, period);
 	} catch (MelderError) {
-		Melder_throw (me, ": not voiced.");
+		Melder_throw (me, U": not voiced.");
 	}
 }
 
@@ -357,7 +356,7 @@ long PointProcess_getWindowPoints (PointProcess me, double tmin, double tmax, lo
 	return imax - imin + 1;
 }
 
-static int PointProcess_isPeriod (PointProcess me, long ileft, double minimumPeriod, double maximumPeriod, double maximumPeriodFactor) {
+static bool PointProcess_isPeriod (PointProcess me, long ileft, double minimumPeriod, double maximumPeriod, double maximumPeriodFactor) {
 	/*
 	 * This function answers the question: is the interval from point 'ileft' to point 'ileft+1' a period?
 	 */
@@ -366,19 +365,19 @@ static int PointProcess_isPeriod (PointProcess me, long ileft, double minimumPer
 	 * Period condition 1: both 'ileft' and 'iright' have to be within the point process.
 	 */
 	if (ileft < 1 || iright > my nt) {
-		return FALSE;
+		return false;
 	} else {
 		/*
 		 * Period condition 2: the interval has to be within the boundaries, if specified.
 		 */
 		if (minimumPeriod == maximumPeriod) {
-			return TRUE;   /* All intervals count as periods, irrespective of absolute size and relative size. */
+			return true;   /* All intervals count as periods, irrespective of absolute size and relative size. */
 		} else {
 			double interval = my t [iright] - my t [ileft];
 			if (interval <= 0.0 || interval < minimumPeriod || interval > maximumPeriod) {
-				return FALSE;
+				return false;
 			} else if (! NUMdefined (maximumPeriodFactor) || maximumPeriodFactor < 1.0) {
-				return TRUE;
+				return true;
 			} else {
 				/*
 				 * Period condition 3: the interval cannot be too different from both of its neigbours, if any.
@@ -388,7 +387,7 @@ static int PointProcess_isPeriod (PointProcess me, long ileft, double minimumPer
 				double previousIntervalFactor = NUMdefined (previousInterval) && previousInterval > 0.0 ? interval / previousInterval : NUMundefined;
 				double nextIntervalFactor = NUMdefined (nextInterval) && nextInterval > 0.0 ? interval / nextInterval : NUMundefined;
 				if (! NUMdefined (previousIntervalFactor) && ! NUMdefined (nextIntervalFactor)) {
-					return TRUE;   /* No neighbours: this is a period. */
+					return true;   /* No neighbours: this is a period. */
 				}
 				if (NUMdefined (previousIntervalFactor) && previousIntervalFactor > 0.0 && previousIntervalFactor < 1.0) {
 					previousIntervalFactor = 1.0 / previousIntervalFactor;
@@ -399,26 +398,26 @@ static int PointProcess_isPeriod (PointProcess me, long ileft, double minimumPer
 				if (NUMdefined (previousIntervalFactor) && previousIntervalFactor > maximumPeriodFactor &&
 					NUMdefined (nextIntervalFactor) && nextIntervalFactor > maximumPeriodFactor)
 				{
-					return FALSE;
+					return false;
 				}
 			}
 		}
 	}
-	return TRUE;
+	return true;
 }
 
 long PointProcess_getNumberOfPeriods (PointProcess me, double tmin, double tmax,
 	double minimumPeriod, double maximumPeriod, double maximumPeriodFactor)
 {
-	long imin, imax, numberOfPeriods, i;
-	if (tmax <= tmin) tmin = my xmin, tmax = my xmax;   /* Autowindowing. */
-	numberOfPeriods = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax) - 1;
+	if (tmax <= tmin) tmin = my xmin, tmax = my xmax;   // autowindowing
+	long imin, imax;
+	long numberOfPeriods = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax) - 1;
 	if (numberOfPeriods < 1) return 0;
-	for (i = imin; i < imax; i ++) {
+	for (long i = imin; i < imax; i ++) {
 		if (PointProcess_isPeriod (me, i, minimumPeriod, maximumPeriod, maximumPeriodFactor)) {
-			(void) 0;   /* This interval counts as a period. */
+			(void) 0;   // this interval counts as a period
 		} else {
-			numberOfPeriods --;   /* This interval does not count as a period. */
+			numberOfPeriods --;   // this interval does not count as a period
 		}
 	}
 	return numberOfPeriods;
@@ -427,16 +426,16 @@ long PointProcess_getNumberOfPeriods (PointProcess me, double tmin, double tmax,
 double PointProcess_getMeanPeriod (PointProcess me, double tmin, double tmax,
 	double minimumPeriod, double maximumPeriod, double maximumPeriodFactor)
 {
-	if (tmax <= tmin) tmin = my xmin, tmax = my xmax;   /* Autowindowing. */
+	if (tmax <= tmin) tmin = my xmin, tmax = my xmax;   // autowindowing
 	long imin, imax;
 	long numberOfPeriods = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax) - 1;
 	if (numberOfPeriods < 1) return NUMundefined;
 	double sum = 0.0;
 	for (long i = imin; i < imax; i ++) {
 		if (PointProcess_isPeriod (me, i, minimumPeriod, maximumPeriod, maximumPeriodFactor)) {
-			sum += my t [i + 1] - my t [i];   /* This interval counts as a period. */
+			sum += my t [i + 1] - my t [i];   // this interval counts as a period
 		} else {
-			numberOfPeriods --;   /* This interval does not count as a period. */
+			numberOfPeriods --;   // this interval does not count as a period
 		}
 	}
 	return numberOfPeriods > 0 ? sum / numberOfPeriods : NUMundefined;
@@ -445,7 +444,7 @@ double PointProcess_getMeanPeriod (PointProcess me, double tmin, double tmax,
 double PointProcess_getStdevPeriod (PointProcess me, double tmin, double tmax,
 	double minimumPeriod, double maximumPeriod, double maximumPeriodFactor)
 {
-	if (tmax <= tmin) tmin = my xmin, tmax = my xmax;   /* Autowindowing. */
+	if (tmax <= tmin) tmin = my xmin, tmax = my xmax;   // autowindowing
 	long imin, imax;
 	long numberOfPeriods = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax) - 1;
 	if (numberOfPeriods < 2) return NUMundefined;
@@ -455,9 +454,9 @@ double PointProcess_getStdevPeriod (PointProcess me, double tmin, double tmax,
 	double sum = 0.0;
 	for (long i = imin; i < imax; i ++) {
 		if (PointProcess_isPeriod (me, i, minimumPeriod, maximumPeriod, maximumPeriodFactor)) {
-			sum += my t [i + 1] - my t [i];   /* This interval counts as a period. */
+			sum += my t [i + 1] - my t [i];   // this interval counts as a period
 		} else {
-			numberOfPeriods --;   /* This interval does not count as a period. */
+			numberOfPeriods --;   // this interval does not count as a period
 		}
 	}
 	if (numberOfPeriods < 2) return NUMundefined;
diff --git a/fon/PointProcess.h b/fon/PointProcess.h
index 89165a7..c8e89e3 100644
--- a/fon/PointProcess.h
+++ b/fon/PointProcess.h
@@ -2,7 +2,7 @@
 #define _PointProcess_h_
 /* PointProcess.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,9 +25,9 @@
 #include "PointProcess_def.h"
 oo_CLASS_CREATE (PointProcess, Function);
 
-PointProcess PointProcess_create (double startingTime, double finishingTime, long initialMaxnt);
-PointProcess PointProcess_createPoissonProcess (double startingTime, double finishingTime, double density);
-void PointProcess_init (I, double startingTime, double finishingTime, long initialMaxnt);
+autoPointProcess PointProcess_create (double startingTime, double finishingTime, long initialMaxnt);
+autoPointProcess PointProcess_createPoissonProcess (double startingTime, double finishingTime, double density);
+void PointProcess_init (PointProcess me, double startingTime, double finishingTime, long initialMaxnt);
 long PointProcess_getLowIndex (PointProcess me, double t);
 long PointProcess_getHighIndex (PointProcess me, double t);
 long PointProcess_getNearestIndex (PointProcess me, double t);
@@ -40,9 +40,9 @@ void PointProcess_removePoints (PointProcess me, long first, long last);
 void PointProcess_removePointsBetween (PointProcess me, double fromTime, double toTime);
 void PointProcess_draw (PointProcess me, Graphics g, double fromTime, double toTime, int garnish);
 double PointProcess_getInterval (PointProcess me, double t);
-PointProcess PointProcesses_union (PointProcess me, PointProcess thee);
-PointProcess PointProcesses_intersection (PointProcess me, PointProcess thee);
-PointProcess PointProcesses_difference (PointProcess me, PointProcess thee);
+autoPointProcess PointProcesses_union (PointProcess me, PointProcess thee);
+autoPointProcess PointProcesses_intersection (PointProcess me, PointProcess thee);
+autoPointProcess PointProcesses_difference (PointProcess me, PointProcess thee);
 void PointProcess_fill (PointProcess me, double tmin, double tmax, double period);
 void PointProcess_voice (PointProcess me, double period, double maxT);
 
diff --git a/fon/PointProcess_and_Sound.cpp b/fon/PointProcess_and_Sound.cpp
index a74ff63..949133a 100644
--- a/fon/PointProcess_and_Sound.cpp
+++ b/fon/PointProcess_and_Sound.cpp
@@ -1,6 +1,6 @@
 /* PointProcess_and_Sound.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,12 +31,12 @@
 
 #include "PointProcess_and_Sound.h"
 
-Sound PointProcess_to_Sound_pulseTrain
+autoSound PointProcess_to_Sound_pulseTrain
 	(PointProcess me, double samplingFrequency,
 	 double adaptFactor, double adaptTime, long interpolationDepth)
 {
 	try {
-		long sound_nt = 1 + floor ((my xmax - my xmin) * samplingFrequency);   // >= 1
+		long sound_nt = 1 + (long) floor ((my xmax - my xmin) * samplingFrequency);   // >= 1
 		double dt = 1.0 / samplingFrequency;
 		double tmid = (my xmin + my xmax) / 2;
 		double t1 = tmid - 0.5 * (sound_nt - 1) * dt;
@@ -60,26 +60,26 @@ Sound PointProcess_to_Sound_pulseTrain
 					sound [j] += amplitude;
 				else if (angle < 0.0)
 					sound [j] += halfampsinangle *
-						(1 + cos (angle / (mid - begin + 1))) / angle;
+						(1.0 + cos (angle / (mid - begin + 1))) / angle;
 				else
 					sound [j] += halfampsinangle *
-						(1 + cos (angle / (end - mid + 1))) / angle;
+						(1.0 + cos (angle / (end - mid + 1))) / angle;
 				angle += NUMpi;
 				halfampsinangle = - halfampsinangle;
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": pulse train not synthesized.");
+		Melder_throw (me, U": pulse train not synthesized.");
 	}
 }
 
-Sound PointProcess_to_Sound_phonation
+autoSound PointProcess_to_Sound_phonation
 	(PointProcess me, double samplingFrequency, double adaptFactor, double maximumPeriod,
 	 double openPhase, double collisionPhase, double power1, double power2)
 {
 	try {
-		long sound_nt = 1 + floor ((my xmax - my xmin) * samplingFrequency);   // >= 1
+		long sound_nt = 1 + (long) floor ((my xmax - my xmin) * samplingFrequency);   // >= 1
 		double dt = 1.0 / samplingFrequency;
 		double tmid = (my xmin + my xmax) / 2;
 		double t1 = tmid - 0.5 * (sound_nt - 1) * dt;
@@ -94,13 +94,7 @@ Sound PointProcess_to_Sound_phonation
 		} else {
 			double xmaxFlow = pow (power1 / power2, 1.0 / (power2 - power1));
 			double xleft = xmaxFlow;
-			double gleft = pow (xleft, power1) - pow (xleft, power2);
-			double gderivleft = power1 * pow (xleft, power1 - 1.0) - power2 * pow (xleft, power2 - 1.0);
-			double fleft = - gleft / gderivleft;
 			double xright = 1.0;
-			double gright = pow (xright, power1) - pow (xright, power2);
-			double gderivright = power1 * pow (xright, power1 - 1.0) - power2 * pow (xright, power2 - 1.0);
-			double fright = - gright / gderivright;
 			for (int i = 1; i <= 50; i ++) {
 				double xmid = 0.5 * (xleft + xright);
 				double gmid = pow (xmid, power1) - pow (xmid, power2);
@@ -108,10 +102,8 @@ Sound PointProcess_to_Sound_phonation
 				double fmid = - gmid / gderivmid;
 				if (fmid > collisionPhase / openPhase) {
 					xleft = xmid;
-					fleft = fmid;
 				} else {
 					xright = xmid;
-					fright = fmid;
 				}
 				re = xmid * openPhase;
 			}
@@ -134,15 +126,15 @@ Sound PointProcess_to_Sound_phonation
 					period = NUMundefined;
 				}
 			}
-			if (period == NUMundefined) {
+			if (! NUMdefined (period)) {
 				if (it < my nt) {
 					period = my t [it + 1] - my t [it];
 					if (period > maximumPeriod) {
 						period = NUMundefined;
 					}
 				}
-				if (period == NUMundefined) {
-					period = 0.5 * maximumPeriod;   /* Some default value. */
+				if (! NUMdefined (period)) {
+					period = 0.5 * maximumPeriod;   // some default value
 				}
 			}
 			te = re * period;
@@ -159,7 +151,7 @@ Sound PointProcess_to_Sound_phonation
 			 * Fill in the samples to the left of the current point.
 			 */
 			{// scope
-				long beginSample = midSample - floor (te / thy dx);
+				long beginSample = midSample - (long) floor (te / thy dx);
 				if (beginSample < 1) beginSample = 1;
 				long endSample = midSample;
 				if (endSample > thy nx) endSample = thy nx;
@@ -185,7 +177,7 @@ Sound PointProcess_to_Sound_phonation
 				double value = flowDerivative * factorPerSample;
 				long beginSample = midSample + 1;
 				if (beginSample < 1) beginSample = 1;
-				long endSample = midSample + floor (20 * ta / thy dx);
+				long endSample = midSample + (long) floor (20.0 * ta / thy dx);
 				if (endSample > thy nx) endSample = thy nx;
 				for (long isamp = beginSample; isamp <= endSample; isamp ++) {
 					sound [isamp] += value;
@@ -194,9 +186,9 @@ Sound PointProcess_to_Sound_phonation
 			}
 		}
 		Vector_scale (thee.peek(), 0.9);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound (phonation).");
+		Melder_throw (me, U": not converted to Sound (phonation).");
 	}
 }
 
@@ -205,7 +197,7 @@ void PointProcess_playPart (PointProcess me, double tmin, double tmax) {
 		autoSound sound = PointProcess_to_Sound_pulseTrain (me, 44100, 0.7, 0.05, 30);
 		Sound_playPart (sound.peek(), tmin, tmax, NULL, NULL);
 	} catch (MelderError) {
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
@@ -221,15 +213,15 @@ void PointProcess_hum (PointProcess me, double tmin, double tmax) {
 	Sound_playPart (sound.peek(), tmin, tmax, NULL, NULL);
 }
 
-Sound PointProcess_to_Sound_hum (PointProcess me) {
+autoSound PointProcess_to_Sound_hum (PointProcess me) {
 	static double formant [1 + 6] = { 0, 600, 1400, 2400, 3400, 4500, 5500 };
 	static double bandwidth [1 + 6] = { 0, 50, 100, 200, 300, 400, 500 };
 	try {
 		autoSound sound = PointProcess_to_Sound_pulseTrain (me, 44100, 0.7, 0.05, 30);
 		Sound_filterWithFormants (sound.peek(), my xmin, my xmax, 6, formant, bandwidth);
-		return sound.transfer();
+		return sound;
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound (hum).");
+		Melder_throw (me, U": not converted to Sound (hum).");
 	}
 }
 
diff --git a/fon/PointProcess_and_Sound.h b/fon/PointProcess_and_Sound.h
index bd4045d..c6fd9f0 100644
--- a/fon/PointProcess_and_Sound.h
+++ b/fon/PointProcess_and_Sound.h
@@ -1,6 +1,6 @@
 /* PointProcess_and_Sound.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,12 +20,11 @@
 #include "PointProcess.h"
 #include "Sound.h"
 
-Sound PointProcess_to_Sound_pulseTrain (PointProcess me, double samplingFrequency,
+autoSound PointProcess_to_Sound_pulseTrain (PointProcess me, double samplingFrequency,
 	double adaptFactor, double adaptTime, long interpolationDepth);
 /*
 	Function:
-		create a time signal out of a point process;
-		return NULL if out of memory.
+		create a time signal out of a point process.
 	Preconditions:
 		samplingFrequency > 0.0;
 	Arguments:
@@ -34,7 +33,7 @@ Sound PointProcess_to_Sound_pulseTrain (PointProcess me, double samplingFrequenc
 		"interpolationDepth" is the number of samples for sinxx interpolation in each direction.
 */
 
-Sound PointProcess_to_Sound_phonation
+autoSound PointProcess_to_Sound_phonation
 	(PointProcess me, double samplingFrequency, double adaptFactor, double maximumPeriod,
 	 double openPhase, double collisionPhase, double power1, double power2);
 #define PointProcess_to_Sound_phonation_DEFAULT_ADAPT_FACTOR  1.0
@@ -47,6 +46,6 @@ Sound PointProcess_to_Sound_phonation
 void PointProcess_playPart (PointProcess me, double tmin, double tmax);
 void PointProcess_play (PointProcess me);
 void PointProcess_hum (PointProcess me, double tmin, double tmax);
-Sound PointProcess_to_Sound_hum (PointProcess me);
+autoSound PointProcess_to_Sound_hum (PointProcess me);
 
 /* End of file PointProcess_and_Sound.h */
diff --git a/fon/PointProcess_def.h b/fon/PointProcess_def.h
index e74dd2b..35c6f92 100644
--- a/fon/PointProcess_def.h
+++ b/fon/PointProcess_def.h
@@ -1,6 +1,6 @@
 /* PointProcess_def.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -42,12 +42,14 @@ oo_DEFINE_CLASS (PointProcess, Function)
 	#endif
 
 	#if oo_DECLARING
-		// overridden methods:
-		public:
-			virtual void v_info ();
-			virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
-			virtual void v_shiftX (double xfrom, double xto);
-			virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		void v_info ()
+			override;
+		int v_domainQuantity ()
+			override { return MelderQuantity_TIME_SECONDS; }
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
 	#endif
 
 oo_END_CLASS (PointProcess)
diff --git a/fon/Polygon.cpp b/fon/Polygon.cpp
index 0d0f6ce..2e2ee1a 100644
--- a/fon/Polygon.cpp
+++ b/fon/Polygon.cpp
@@ -1,6 +1,6 @@
 /* Polygon.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,26 +34,26 @@
 #include "oo_DESCRIPTION.h"
 #include "Polygon_def.h"
 
-Thing_implement (Polygon, Data, 1);
+Thing_implement (Polygon, Daata, 1);
 
 void structPolygon :: v_info () {
-	our structData :: v_info ();
-	MelderInfo_writeLine (L"Number of points: ", Melder_integer (our numberOfPoints));
-	MelderInfo_writeLine (L"Perimeter: ", Melder_single (Polygon_perimeter (this)));
+	our structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of points: ", our numberOfPoints);
+	MelderInfo_writeLine (U"Perimeter: ", Melder_single (Polygon_perimeter (this)));
 }
   
 void structPolygon :: v_writeText (MelderFile file) {
-	texputi4 (file, our numberOfPoints, L"numberOfPoints", 0,0,0,0,0);
+	texputi4 (file, our numberOfPoints, U"numberOfPoints", 0,0,0,0,0);
 	for (long i = 1; i <= our numberOfPoints; i ++) {
-		texputr4 (file, our x [i], L"x [", Melder_integer (i), L"]", 0,0,0);
-		texputr4 (file, our y [i], L"y [", Melder_integer (i), L"]", 0,0,0);
+		texputr4 (file, our x [i], U"x [", Melder_integer (i), U"]", 0,0,0);
+		texputr4 (file, our y [i], U"y [", Melder_integer (i), U"]", 0,0,0);
 	}
 }
 
-void structPolygon :: v_readText (MelderReadText text) {
+void structPolygon :: v_readText (MelderReadText text, int /*formatVersion*/) {
 	our numberOfPoints = texgeti4 (text);
 	if (our numberOfPoints < 1)
-		Melder_throw ("Cannot read a Polygon with only ", our numberOfPoints, " points.");
+		Melder_throw (U"Cannot read a Polygon with only ", our numberOfPoints, U" points.");
 	our x = NUMvector <double> (1, our numberOfPoints);
 	our y = NUMvector <double> (1, our numberOfPoints);
 	for (long i = 1; i <= our numberOfPoints; i ++) {
@@ -62,15 +62,15 @@ void structPolygon :: v_readText (MelderReadText text) {
 	}
 }
 
-Polygon Polygon_create (long numberOfPoints) {
+autoPolygon Polygon_create (long numberOfPoints) {
 	try {
 		autoPolygon me = Thing_new (Polygon);
 		my numberOfPoints = numberOfPoints;
 		my x = NUMvector <double> (1, numberOfPoints);
 		my y = NUMvector <double> (1, numberOfPoints);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Polygon not created.");
+		Melder_throw (U"Polygon not created.");
 	}
 }
 
@@ -103,8 +103,7 @@ static void computeDistanceTable (Polygon me, int **table) {
 		for (long j = i + 1; j <= my numberOfPoints; j ++) {
 			double dx = my x [i] - my x [j], dy = my y [i] - my y [j];
 			table [i] [j] = table [j] [i] =
-				sqrt (dx * dx + dy * dy);
-					/* Round to zero. */
+				(int) floor (sqrt (dx * dx + dy * dy));   // round to zero
 		}
 }
 
@@ -220,7 +219,7 @@ void Polygon_salesperson (Polygon me, long numberOfIterations) {
 
 		int numberOfCities = my numberOfPoints;
 		if (numberOfCities < 1)
-			Melder_throw ("No points.");
+			Melder_throw (U"No points.");
 		autoNUMmatrix <int> distance (1, numberOfCities, 1, numberOfCities);
 		computeDistanceTable (me, distance.peek());
 		autoNUMvector <int> path (0L, numberOfCities);
@@ -245,8 +244,9 @@ void Polygon_salesperson (Polygon me, long numberOfIterations) {
 				numberOfShortest ++;
 		}
 		if (numberOfIterations > 1)
-			Melder_casual ("Polygon_salesperson: "
-				"found %ld times the same shortest path.", numberOfShortest);
+			Melder_casual (U"Polygon_salesperson:"
+				U" found ", numberOfShortest,
+				U" times the same shortest path.");
 
 		/* Change me: I will follow the shortest path found. */
 
@@ -256,7 +256,7 @@ void Polygon_salesperson (Polygon me, long numberOfIterations) {
 			my y [i] = help -> y [shortestPath [i]];
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": shortest path not found.");
+		Melder_throw (me, U": shortest path not found.");
 	}
 }
 
diff --git a/fon/Polygon.h b/fon/Polygon.h
index e6d6927..f68a5a5 100644
--- a/fon/Polygon.h
+++ b/fon/Polygon.h
@@ -2,7 +2,7 @@
 #define _Polygon_h_
 /* Polygon.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,9 +23,9 @@
 #include "Graphics.h"
 
 #include "Polygon_def.h"
-oo_CLASS_CREATE (Polygon, Data);
+oo_CLASS_CREATE (Polygon, Daata);
 
-Polygon Polygon_create (long numberOfPoints);
+autoPolygon Polygon_create (long numberOfPoints);
 /*
 	Function:
 		create a new instance of Polygon.
diff --git a/fon/Polygon_def.h b/fon/Polygon_def.h
index 2037d03..db68585 100644
--- a/fon/Polygon_def.h
+++ b/fon/Polygon_def.h
@@ -1,6 +1,6 @@
 /* Polygon_def.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,12 +19,12 @@
 
 
 #define ooSTRUCT Polygon
-oo_DEFINE_CLASS (Polygon, Data)
+oo_DEFINE_CLASS (Polygon, Daata)
 
 	oo_LONG (numberOfPoints)
 
 	#if oo_READING
-		if (localVersion >= 1) {
+		if (formatVersion >= 1) {
 			oo_DOUBLE_VECTOR (x, numberOfPoints)
 			oo_DOUBLE_VECTOR (y, numberOfPoints)
 		} else {
@@ -37,8 +37,8 @@ oo_DEFINE_CLASS (Polygon, Data)
 	#endif
 
 	#if oo_DECLARING
-		// overridden methods:
-		virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (Polygon)
diff --git a/fon/Praat_tests.cpp b/fon/Praat_tests.cpp
index 41a738c..785f261 100644
--- a/fon/Praat_tests.cpp
+++ b/fon/Praat_tests.cpp
@@ -1,21 +1,39 @@
 /* Praat_tests.cpp */
 /* Paul Boersma, August 2, 2001 */
 /* December 10, 2006: MelderInfo */
-/* November 5, 2007: wchar_t */
+/* November 5, 2007: wchar */
 /* 21 March 2009: modern enums */
 /* 24 May 2011: C++ */
+/* 5 June 2015: char32 */
 
 #include "Praat_tests.h"
 
+#include "Graphics.h"
+#include "praat.h"
+
 #include "enums_getText.h"
 #include "Praat_tests_enums.h"
 #include "enums_getValue.h"
 #include "Praat_tests_enums.h"
+#include <string>
 
+static void testAutoData (autoDaata data) {
+	fprintf (stderr, "testAutoData: %p %p\n", data.get(), data -> name);
+}
+static void testAutoDataRef (autoDaata& data) {
+	fprintf (stderr, "testAutoDataRef: %p %p\n", data.get(), data -> name);
+}
+static void testData (Daata data) {
+	fprintf (stderr, "testData: %p %s\n", data, Melder_peek32to8 (data -> name));
+}
+static autoDaata newAutoData () {
+	autoDaata data (Thing_new (Daata));
+	return data;
+}
 
-int Praat_tests (int itest, wchar_t *arg1, wchar_t *arg2, wchar_t *arg3, wchar_t *arg4) {
-	unsigned long i, n = wcstoul (arg1, NULL, 10);
-	double x, t;
+int Praat_tests (int itest, char32 *arg1, char32 *arg2, char32 *arg3, char32 *arg4) {
+	int64 n = Melder_atoi (arg1);
+	double t = 0.0;
 	(void) arg1;
 	(void) arg2;
 	(void) arg3;
@@ -24,74 +42,266 @@ int Praat_tests (int itest, wchar_t *arg1, wchar_t *arg2, wchar_t *arg3, wchar_t
 	Melder_stopwatch ();
 	switch (itest) {
 		case kPraatTests_TIME_RANDOM_FRACTION: {
-			for (i = 1; i <= n; i ++)
+			for (int64 i = 1; i <= n; i ++)
 				(void) NUMrandomFraction ();
 			t = Melder_stopwatch ();
 		} break;
 		case kPraatTests_TIME_RANDOM_GAUSS: {
-			for (i = 1; i <= n; i ++)
+			for (int64 i = 1; i <= n; i ++)
 				(void) NUMrandomGauss (0.0, 1.0);
 			t = Melder_stopwatch ();
 		} break;
 		case kPraatTests_TIME_SORT: {
-			long m = wcstol (arg2, NULL, 10);
+			long m = Melder_atoi (arg2);
 			long *array = NUMvector <long> (1, m);
-			for (i = 1; i <= m; i ++)
+			for (int64 i = 1; i <= m; i ++)
 				array [i] = NUMrandomInteger (1, 100);
 			Melder_stopwatch ();
-			for (i = 1; i <= n; i ++)
+			for (int64 i = 1; i <= n; i ++)
 				NUMsort_l (m, array);
 			t = Melder_stopwatch ();
 			NUMvector_free (array, 1);
 		} break;
 		case kPraatTests_TIME_INTEGER: {
-			double sum = 0;
-			for (i = 1; i <= n; i ++)
+			int64 sum = 0;
+			#if ! useCarbon
+			for (int64 i = 1; i <= n; i ++)
 				sum += i * (i - 1) * (i - 2);
+			#endif
 			t = Melder_stopwatch ();
-			MelderInfo_writeLine (Melder_double (sum));
+			MelderInfo_writeLine (sum);
 		} break;
 		case kPraatTests_TIME_FLOAT: {
 			double sum = 0.0, fn = n;
 			for (double fi = 1.0; fi <= fn; fi = fi + 1.0)
 				sum += fi * (fi - 1.0) * (fi - 2.0);
 			t = Melder_stopwatch ();
-			MelderInfo_writeLine (Melder_double (sum));
+			MelderInfo_writeLine (sum);
 		} break;
 		case kPraatTests_TIME_FLOAT_TO_UNSIGNED_BUILTIN: {
 			uint64_t sum = 0;
 			double fn = n;
 			for (double fi = 1.0; fi <= fn; fi = fi + 1.0)
-				sum += (uint32_t) fi;
+				sum += (uint32) fi;
 			t = Melder_stopwatch ();   // 2.59   // 1.60
-			MelderInfo_writeLine (Melder_double (sum));
+			MelderInfo_writeLine (sum);
 		} break;
 		case kPraatTests_TIME_FLOAT_TO_UNSIGNED_EXTERN: {
 			uint64_t sum = 0;
 			double fn = n;
 			for (double fi = 1.0; fi <= fn; fi = fi + 1.0)
-				sum += (uint32_t) ((int32_t) (fi - 2147483648.0) + 2147483647L + 1);
+				sum += (uint32) ((int32) (fi - 2147483648.0) + 2147483647L + 1);
 			t = Melder_stopwatch ();   // 1.60
-			MelderInfo_writeLine (Melder_double (sum));
+			MelderInfo_writeLine (sum);
 		} break;
 		case kPraatTests_TIME_UNSIGNED_TO_FLOAT_BUILTIN: {
 			double sum = 0.0;
-			uint32_t nu = (uint32_t) n;
-			for (uint32_t iu = 1; iu <= nu; iu ++)
+			uint32 nu = (uint32) n;
+			for (uint32 iu = 1; iu <= nu; iu ++)
 				sum += (double) iu;
 			t = Melder_stopwatch ();   // 1.35
-			MelderInfo_writeLine (Melder_double (sum));
+			MelderInfo_writeLine (sum);
 		} break;
 		case kPraatTests_TIME_UNSIGNED_TO_FLOAT_EXTERN: {
 			double sum = 0.0;
-			uint32_t nu = (uint32_t) n;
-			for (uint32_t iu = 1; iu <= nu; iu ++)
-				sum += (double) (int32_t) (iu - 2147483647L - 1) + 2147483648.0;
+			uint32 nu = (uint32) n;
+			for (uint32 iu = 1; iu <= nu; iu ++)
+				sum += (double) (int32) (iu - 2147483647L - 1) + 2147483648.0;
 			t = Melder_stopwatch ();   // 0.96
-			MelderInfo_writeLine (Melder_double (sum));
+			MelderInfo_writeLine (sum);
+		} break;
+		case kPraatTests_TIME_STRING_MELDER_32: {
+			autoMelderString string;
+			char32 word [] { U"abc" };
+			word [2] = NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				MelderString_copy (& string, word);
+				for (int j = 1; j <= 30; j ++)
+					MelderString_append (& string, word);
+			}
+			t = Melder_stopwatch ();
+		} break;
+		case kPraatTests_TIME_STRING_MELDER_32_ALLOC: {
+			char32 word [] { U"abc" };
+			word [2] = NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				autoMelderString string;
+				MelderString_copy (& string, word);
+				for (int j = 1; j <= 30; j ++)
+					MelderString_append (& string, word);
+			}
+			t = Melder_stopwatch ();
+		} break;
+		case kPraatTests_TIME_STRING_CPP_S: {
+			std::string s = "";
+			char word [] { "abc" };
+			word [2] = (char) NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				s = word;
+				for (int j = 1; j <= 30; j ++)
+					s += word;
+			}
+			t = Melder_stopwatch ();
+		} break;
+		case kPraatTests_TIME_STRING_CPP_C: {
+			std::basic_string<char> s = "";
+			char word [] { "abc" };
+			word [2] = (char) NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				s = word;
+				for (int j = 1; j <= 30; j ++)
+					s += word;
+			}
+			t = Melder_stopwatch ();
+		} break;
+		case kPraatTests_TIME_STRING_CPP_WS: {
+			std::wstring s = L"";
+			wchar_t word [] { L"abc" };
+			word [2] = NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				s = word;
+				for (int j = 1; j <= 30; j ++)
+					s += word;
+			}
+			t = Melder_stopwatch ();
+		} break;
+		case kPraatTests_TIME_STRING_CPP_WC: {
+			std::basic_string<wchar_t> s = L"";
+			wchar_t word [] { L"abc" };
+			word [2] = NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				s = word;
+				for (int j = 1; j <= 30; j ++)
+					s += word;
+			}
+			t = Melder_stopwatch ();
+		} break;
+		case kPraatTests_TIME_STRING_CPP_32: {
+			std::basic_string<char32_t> s = U"";
+			char32 word [] { U"abc" };
+			word [2] = NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				s = word;
+				for (int j = 1; j <= 30; j ++)
+					s += word;
+			}
+			t = Melder_stopwatch ();
+		} break;
+		case kPraatTests_TIME_STRING_CPP_U32STRING: {
+			#if ! defined (macintosh) || ! useCarbon
+			std::u32string s = U"";
+			char32 word [] { U"abc" };
+			word [2] = NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				s = word;
+				for (int j = 1; j <= 30; j ++)
+					s += word;
+			}
+			#endif
+			t = Melder_stopwatch ();
+		} break;
+		case kPraatTests_TIME_STRCPY: {
+			char buffer [100];
+			char word [] { "abc" };
+			word [2] = (char) NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				strcpy (buffer, word);
+				for (int j = 1; j <= 30; j ++)
+					strcpy (buffer + strlen (buffer), word);
+			}
+			t = Melder_stopwatch ();
+			MelderInfo_writeLine (Melder_peek8to32 (buffer));
+		} break;
+		case kPraatTests_TIME_WCSCPY: {
+			wchar_t buffer [100];
+			wchar_t word [] { L"abc" };
+			word [2] = NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				wcscpy (buffer, word);
+				for (int j = 1; j <= 30; j ++)
+					wcscpy (buffer + wcslen (buffer), word);
+			}
+			t = Melder_stopwatch ();
+		} break;
+		case kPraatTests_TIME_STR32CPY: {
+			char32 buffer [100];
+			char32 word [] { U"abc" };
+			word [2] = NUMrandomInteger ('a', 'z');
+			for (int64 i = 1; i <= n; i ++) {
+				str32cpy (buffer, word);
+				for (int j = 1; j <= 30; j ++)
+					str32cpy (buffer + str32len (buffer), word);
+			}
+			t = Melder_stopwatch ();
+			MelderInfo_writeLine (buffer);
+		} break;
+		case kPraatTests_TIME_GRAPHICS_TEXT_TOP: {
+			autoPraatPicture picture;
+			for (int64 i = 1; i <= n; i ++) {
+				Graphics_textTop (GRAPHICS, false, U"hello world");
+			}
+			t = Melder_stopwatch ();
+		} break;
+		case kPraatTests_THING_AUTO: {
+			int numberOfThingsBefore = Thing_getTotalNumberOfThings ();
+			{
+				Melder_casual (U"1\n");
+				autoDaata data = Thing_new (Daata);
+				Thing_setName (data.get(), U"hello");
+				Melder_casual (U"2\n");
+				testData (data.peek());
+				testAutoData (data.move());
+				autoDaata data18 = Thing_new (Daata);
+				testAutoData (data18.move());
+				fprintf (stderr, "3\n");
+				autoDaata data2 = newAutoData ();
+				fprintf (stderr, "4\n");
+				autoDaata data3 = newAutoData ();
+				fprintf (stderr, "5\n");
+				//data2 = data;   // disabled l-value copy assignment from same class
+				fprintf (stderr, "6\n");
+				autoOrdered ordered = Thing_new (Ordered);
+				fprintf (stderr, "7\n");
+				//data = ordered;   // disabled l-value copy assignment from subclass
+				data = ordered.move();
+				fprintf (stderr, "8\n");
+				data2 = newAutoData ();
+				fprintf (stderr, "8a\n");
+				autoDaata data5 = newAutoData ();
+				fprintf (stderr, "8b\n");
+				data2 = data5.move();
+				fprintf (stderr, "9\n");
+				//ordered = data;   // rightfully refused by compiler
+				fprintf (stderr, "10\n");
+				//autoOrdered ordered2 = Thing_new (Daata);   // rightfully refused by compiler
+				fprintf (stderr, "11\n");
+				autoDaata data4 = Thing_new (Ordered);   // constructor
+				fprintf (stderr, "12\n");
+				//autoDaata data6 = data4;   // disabled l-value copy constructor from same class
+				fprintf (stderr, "13\n");
+				autoDaata data7 = data4.move();
+				fprintf (stderr, "14\n");
+				autoOrdered ordered3 = Thing_new (Ordered);
+				autoDaata data8 = ordered3.move();
+				fprintf (stderr, "15\n");
+				//autoDaata data9 = ordered;   // disabled l-value copy constructor from subclass
+				fprintf (stderr, "16\n");
+				autoDaata data10 = data7.move();
+				fprintf (stderr, "17\n");
+				autoDaata data11 = Thing_new (Daata);   // constructor, move assignment, null destructor
+				fprintf (stderr, "18\n");
+				data11 = Thing_new (Ordered);
+				fprintf (stderr, "19\n");
+				testAutoDataRef (data11);
+				fprintf (stderr, "20\n");
+				data11 = nullptr;
+				fprintf (stderr, "21\n");
+			}
+			int numberOfThingsAfter = Thing_getTotalNumberOfThings ();
+			fprintf (stderr, "Number of things: before %d, after %d\n", numberOfThingsBefore, numberOfThingsAfter);
 		} break;
 	}
-	MelderInfo_writeLine (Melder_single (t / n * 1e9), L" nanoseconds");
+	MelderInfo_writeLine (Melder_single (t / n * 1e9), U" nanoseconds");
 	MelderInfo_close ();
 	return 1;
 }
diff --git a/fon/Praat_tests.h b/fon/Praat_tests.h
index f4f9205..9117bd9 100644
--- a/fon/Praat_tests.h
+++ b/fon/Praat_tests.h
@@ -1,12 +1,12 @@
 #ifndef _Praat_tests_h_
 #define _Praat_tests_h_
-/* Paul Boersma, 7 May 2011 */
+/* Paul Boersma, 5 June 2015 */
 
 #include "Thing.h"
 
 #include "Praat_tests_enums.h"
 
-int Praat_tests (int itest, wchar_t *arg1, wchar_t *arg2, wchar_t *arg3, wchar_t *arg4);
+int Praat_tests (int itest, char32 *arg1, char32 *arg2, char32 *arg3, char32 *arg4);
 
 #endif
 /* End of file Praat_tests.h */
diff --git a/fon/Praat_tests_enums.h b/fon/Praat_tests_enums.h
index 0039524..16387fb 100644
--- a/fon/Praat_tests_enums.h
+++ b/fon/Praat_tests_enums.h
@@ -1,18 +1,31 @@
 /* Praat_tests_enums.h */
-/* Paul Boersma, 2 January 2015 */
+/* Paul Boersma, 26 September 2015 */
 
 enums_begin (kPraatTests, 0)
-	enums_add (kPraatTests, 0, _, L"_")
-	enums_add (kPraatTests, 1, CHECK_RANDOM_1009_2009, L"CheckRandom1009_2009")
-	enums_add (kPraatTests, 2, TIME_RANDOM_FRACTION, L"TimeRandomFraction")
-	enums_add (kPraatTests, 3, TIME_RANDOM_GAUSS, L"TimeRandomGauss")
-	enums_add (kPraatTests, 4, TIME_SORT, L"TimeSort")
-	enums_add (kPraatTests, 5, TIME_INTEGER, L"TimeInteger")
-	enums_add (kPraatTests, 6, TIME_FLOAT, L"TimeFloat")
-	enums_add (kPraatTests, 7, TIME_FLOAT_TO_UNSIGNED_BUILTIN, L"TimeFloatToUnsigned_builtin")
-	enums_add (kPraatTests, 8, TIME_FLOAT_TO_UNSIGNED_EXTERN, L"TimeFloatToUnsigned_extern")
-	enums_add (kPraatTests, 9, TIME_UNSIGNED_TO_FLOAT_BUILTIN, L"TimeUnsignedToFloat_builtin")
-	enums_add (kPraatTests, 10, TIME_UNSIGNED_TO_FLOAT_EXTERN, L"TimeUnsignedToFloat_extern")
-enums_end (kPraatTests, 10, CHECK_RANDOM_1009_2009)
+	enums_add (kPraatTests, 0, _, U"_")
+	enums_add (kPraatTests, 1, CHECK_RANDOM_1009_2009, U"CheckRandom1009_2009")
+	enums_add (kPraatTests, 2, TIME_RANDOM_FRACTION, U"TimeRandomFraction")
+	enums_add (kPraatTests, 3, TIME_RANDOM_GAUSS, U"TimeRandomGauss")
+	enums_add (kPraatTests, 4, TIME_SORT, U"TimeSort")
+	enums_add (kPraatTests, 5, TIME_INTEGER, U"TimeInteger")
+	enums_add (kPraatTests, 6, TIME_FLOAT, U"TimeFloat")
+	enums_add (kPraatTests, 7, TIME_FLOAT_TO_UNSIGNED_BUILTIN, U"TimeFloatToUnsigned_builtin")
+	enums_add (kPraatTests, 8, TIME_FLOAT_TO_UNSIGNED_EXTERN, U"TimeFloatToUnsigned_extern")
+	enums_add (kPraatTests, 9, TIME_UNSIGNED_TO_FLOAT_BUILTIN, U"TimeUnsignedToFloat_builtin")
+	enums_add (kPraatTests, 10, TIME_UNSIGNED_TO_FLOAT_EXTERN, U"TimeUnsignedToFloat_extern")
+	enums_add (kPraatTests, 11, TIME_STRING_MELDER_32, U"TimeStringMelder32")
+	enums_add (kPraatTests, 12, TIME_STRING_MELDER_32_ALLOC, U"TimeStringMelder32_alloc")
+	enums_add (kPraatTests, 13, TIME_STRING_CPP_S, U"TimeStringC++S")
+	enums_add (kPraatTests, 14, TIME_STRING_CPP_C, U"TimeStringC++C")
+	enums_add (kPraatTests, 15, TIME_STRING_CPP_WS, U"TimeStringC++WS")
+	enums_add (kPraatTests, 16, TIME_STRING_CPP_WC, U"TimeStringC++WC")
+	enums_add (kPraatTests, 17, TIME_STRING_CPP_32, U"TimeStringC++32")
+	enums_add (kPraatTests, 18, TIME_STRING_CPP_U32STRING, U"TimeStringC++U32STRING")
+	enums_add (kPraatTests, 19, TIME_STRCPY, U"TimeStrcpy")
+	enums_add (kPraatTests, 20, TIME_WCSCPY, U"TimeWcscpy")
+	enums_add (kPraatTests, 21, TIME_STR32CPY, U"TimeStr32cpy")
+	enums_add (kPraatTests, 22, TIME_GRAPHICS_TEXT_TOP, U"TimeGraphicsTextTop")
+	enums_add (kPraatTests, 23, THING_AUTO, U"ThingAuto")
+enums_end (kPraatTests, 23, CHECK_RANDOM_1009_2009)
 
 /* End of file Praat_tests_enums.h */
diff --git a/fon/RealTier.cpp b/fon/RealTier.cpp
index 8cb8ee6..3eda077 100644
--- a/fon/RealTier.cpp
+++ b/fon/RealTier.cpp
@@ -1,6 +1,6 @@
 /* RealTier.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -54,9 +54,9 @@ RealPoint RealPoint_create (double time, double value) {
 
 void structRealTier :: v_info () {
 	structFunction :: v_info ();
-	MelderInfo_writeLine (L"Number of points: ", Melder_integer (our numberOfPoints ()));
-	MelderInfo_writeLine (L"Minimum value: ", Melder_double (RealTier_getMinimumValue (this)));
-	MelderInfo_writeLine (L"Maximum value: ", Melder_double (RealTier_getMaximumValue (this)));
+	MelderInfo_writeLine (U"Number of points: ", our numberOfPoints ());
+	MelderInfo_writeLine (U"Minimum value: ", RealTier_getMinimumValue (this));
+	MelderInfo_writeLine (U"Maximum value: ", RealTier_getMaximumValue (this));
 }
 
 double structRealTier :: v_getVector (long irow, long icol) {
@@ -99,17 +99,17 @@ RealTier RealTier_create (double tmin, double tmax) {
 		RealTier_init (me.peek(), tmin, tmax);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("RealTier not created.");
+		Melder_throw (U"RealTier not created.");
 	}
 }
 
 RealTier RealTier_createWithClass (double tmin, double tmax, ClassInfo klas) {
 	try {
-		autoRealTier me = (RealTier) _Thing_new (klas);
+		autoRealTier me = static_cast <RealTier> (Thing_newFromClass (klas));
 		RealTier_init (me.peek(), tmin, tmax);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw (klas -> className, " not created.");
+		Melder_throw (klas -> className, U" not created.");
 	}
 }
 
@@ -118,7 +118,7 @@ void RealTier_addPoint (RealTier me, double t, double value) {
 		autoRealPoint point = RealPoint_create (t, value);
 		Collection_addItem (my points, point.transfer());
 	} catch (MelderError) {
-		Melder_throw (me, ": point not added.");
+		Melder_throw (me, U": point not added.");
 	}
 }
 
@@ -281,10 +281,10 @@ void RealTier_multiplyPart (RealTier me, double tmin, double tmax, double factor
 }
 
 void RealTier_draw (RealTier me, Graphics g, double tmin, double tmax, double fmin, double fmax,
-	int garnish, const wchar_t *method, const wchar_t *quantity)
+	int garnish, const char32 *method, const char32 *quantity)
 {
-	bool drawLines = wcsstr (method, L"lines") || wcsstr (method, L"Lines");
-	bool drawSpeckles = wcsstr (method, L"speckles") || wcsstr (method, L"Speckles");
+	bool drawLines = str32str (method, U"lines") || str32str (method, U"Lines");
+	bool drawSpeckles = str32str (method, U"speckles") || str32str (method, U"Speckles");
 	long n = my numberOfPoints (), imin, imax, i;
 	if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; }
 	Graphics_setWindow (g, tmin, tmax, fmin, fmax);
@@ -318,14 +318,14 @@ void RealTier_draw (RealTier me, Graphics g, double tmin, double tmax, double fm
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, TRUE, my v_getUnitText (0, 0, 0));
-		Graphics_marksBottom (g, 2, TRUE, TRUE, FALSE);
-		Graphics_marksLeft (g, 2, TRUE, TRUE, FALSE);
-		if (quantity) Graphics_textLeft (g, TRUE, quantity);
+		Graphics_textBottom (g, true, my v_getUnitText (0, 0, 0));
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
+		if (quantity) Graphics_textLeft (g, true, quantity);
 	}
 }
 
-TableOfReal RealTier_downto_TableOfReal (RealTier me, const wchar_t *timeLabel, const wchar_t *valueLabel) {
+TableOfReal RealTier_downto_TableOfReal (RealTier me, const char32 *timeLabel, const char32 *valueLabel) {
 	try {
 		autoTableOfReal thee = TableOfReal_create (my numberOfPoints (), 2);
 		TableOfReal_setColumnLabel (thee.peek(), 1, timeLabel);
@@ -337,7 +337,7 @@ TableOfReal RealTier_downto_TableOfReal (RealTier me, const wchar_t *timeLabel,
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TableOfReal.");
+		Melder_throw (me, U": not converted to TableOfReal.");
 	}
 }
 
@@ -378,11 +378,11 @@ void RealTier_interpolateQuadratically (RealTier me, long numberOfPointsPerParab
 		}
 		Thing_swap (me, thee.peek());
 	} catch (MelderError) {
-		Melder_throw (me, ": not interpolated quadratically.");
+		Melder_throw (me, U": not interpolated quadratically.");
 	}
 }
 
-Table RealTier_downto_Table (RealTier me, const wchar_t *indexText, const wchar_t *timeText, const wchar_t *valueText) {
+Table RealTier_downto_Table (RealTier me, const char32 *indexText, const char32 *timeText, const char32 *valueText) {
 	try {
 		autoTable thee = Table_createWithoutColumnNames (my numberOfPoints (),
 			(indexText != NULL) + (timeText != NULL) + (valueText != NULL));
@@ -399,7 +399,7 @@ Table RealTier_downto_Table (RealTier me, const wchar_t *indexText, const wchar_
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Table.");
+		Melder_throw (me, U": not converted to Table.");
 	}
 }
 
@@ -411,7 +411,7 @@ RealTier Vector_to_RealTier (Vector me, long channel, ClassInfo klas) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to ", klas -> className, ".");
+		Melder_throw (me, U": not converted to ", klas -> className, U".");
 	}
 }
 
@@ -429,7 +429,7 @@ RealTier Vector_to_RealTier_peaks (Vector me, long channel, ClassInfo klas) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to ", klas -> className, " (peaks).");
+		Melder_throw (me, U": not converted to ", klas -> className, U" (peaks).");
 	}
 }
 
@@ -447,7 +447,7 @@ RealTier Vector_to_RealTier_valleys (Vector me, long channel, ClassInfo klas) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to ", klas -> className, " (valleys).");
+		Melder_throw (me, U": not converted to ", klas -> className, U" (valleys).");
 	}
 }
 
@@ -459,23 +459,23 @@ RealTier PointProcess_upto_RealTier (PointProcess me, double value, ClassInfo kl
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to RealTier.");
+		Melder_throw (me, U": not converted to RealTier.");
 	}
 }
 
-void RealTier_formula (RealTier me, const wchar_t *expression, Interpreter interpreter, RealTier thee) {
+void RealTier_formula (RealTier me, const char32 *expression, Interpreter interpreter, RealTier thee) {
 	try {
-		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, TRUE);
+		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, true);
 		if (thee == NULL) thee = me;
 		for (long icol = 1; icol <= my numberOfPoints (); icol ++) {
 			struct Formula_Result result;
 			Formula_run (0, icol, & result);
 			if (result. result.numericResult == NUMundefined)
-				Melder_throw ("Cannot put an undefined value into the tier.");
+				Melder_throw (U"Cannot put an undefined value into the tier.");
 			thy point (icol) -> value = result. result.numericResult;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": formula not completed.");
+		Melder_throw (me, U": formula not completed.");
 	}
 }
 
diff --git a/fon/RealTier.h b/fon/RealTier.h
index f8e3c9b..3f6da29 100644
--- a/fon/RealTier.h
+++ b/fon/RealTier.h
@@ -2,7 +2,7 @@
 #define _RealTier_h_
 /* RealTier.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -69,18 +69,18 @@ double RealTier_getStandardDeviation_points (RealTier me, double tmin, double tm
 
 void RealTier_addPoint (RealTier me, double t, double value);
 void RealTier_draw (RealTier me, Graphics g, double tmin, double tmax,
-	double ymin, double ymax, int garnish, const wchar_t *method, const wchar_t *quantity);
-TableOfReal RealTier_downto_TableOfReal (RealTier me, const wchar_t *timeLabel, const wchar_t *valueLabel);
+	double ymin, double ymax, int garnish, const char32 *method, const char32 *quantity);
+TableOfReal RealTier_downto_TableOfReal (RealTier me, const char32 *timeLabel, const char32 *valueLabel);
 
 void RealTier_interpolateQuadratically (RealTier me, long numberOfPointsPerParabola, int logarithmically);
 
-Table RealTier_downto_Table (RealTier me, const wchar_t *indexText, const wchar_t *timeText, const wchar_t *valueText);
+Table RealTier_downto_Table (RealTier me, const char32 *indexText, const char32 *timeText, const char32 *valueText);
 RealTier Vector_to_RealTier (Vector me, long channel, ClassInfo klas);
 RealTier Vector_to_RealTier_peaks (Vector me, long channel, ClassInfo klas);
 RealTier Vector_to_RealTier_valleys (Vector me, long channel, ClassInfo klas);
 RealTier PointProcess_upto_RealTier (PointProcess me, double value, ClassInfo klas);
 
-void RealTier_formula (RealTier me, const wchar_t *expression, Interpreter interpreter, RealTier thee);
+void RealTier_formula (RealTier me, const char32 *expression, Interpreter interpreter, RealTier thee);
 void RealTier_multiplyPart (RealTier me, double tmin, double tmax, double factor);
 void RealTier_removePointsBelow (RealTier me, double level);
 
diff --git a/fon/RealTierEditor.cpp b/fon/RealTierEditor.cpp
index bc799dc..2331e4e 100644
--- a/fon/RealTierEditor.cpp
+++ b/fon/RealTierEditor.cpp
@@ -1,6 +1,6 @@
 /* RealTierEditor.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,48 +28,48 @@ Thing_implement (RealTierEditor, TimeSoundEditor, 0);
 
 static void menu_cb_removePoints (EDITOR_ARGS) {
 	EDITOR_IAM (RealTierEditor);
-	Editor_save (me, L"Remove point(s)");
+	Editor_save (me, U"Remove point(s)");
 	if (my d_startSelection == my d_endSelection)
 		AnyTier_removePointNear (my data, my d_startSelection);
 	else
 		AnyTier_removePointsBetween (my data, my d_startSelection, my d_endSelection);
 	RealTierEditor_updateScaling (me);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addPointAtCursor (EDITOR_ARGS) {
 	EDITOR_IAM (RealTierEditor);
 	if (NUMdefined (my v_minimumLegalValue ()) && my ycursor < my v_minimumLegalValue ())
-		Melder_throw ("Cannot add a point below ", my v_minimumLegalValue (), my v_rightTickUnits (), ".");
+		Melder_throw (U"Cannot add a point below ", my v_minimumLegalValue (), my v_rightTickUnits (), U".");
 	if (NUMdefined (my v_maximumLegalValue ()) && my ycursor > my v_maximumLegalValue ())
-		Melder_throw ("Cannot add a point above ", my v_maximumLegalValue (), my v_rightTickUnits (), ".");
-	Editor_save (me, L"Add point");
+		Melder_throw (U"Cannot add a point above ", my v_maximumLegalValue (), my v_rightTickUnits (), U".");
+	Editor_save (me, U"Add point");
 	RealTier_addPoint ((RealTier) my data, 0.5 * (my d_startSelection + my d_endSelection), my ycursor);
 	RealTierEditor_updateScaling (me);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_addPointAt (EDITOR_ARGS) {
 	EDITOR_IAM (RealTierEditor);
-	EDITOR_FORM (L"Add point", 0)
-		REAL (L"Time (s)", L"0.0")
-		REAL (my v_quantityText (), L"0.0")
+	EDITOR_FORM (U"Add point", 0)
+		REAL (U"Time (s)", U"0.0")
+		REAL (my v_quantityText (), U"0.0")
 	EDITOR_OK
-		SET_REAL (L"Time", 0.5 * (my d_startSelection + my d_endSelection))
+		SET_REAL (U"Time", 0.5 * (my d_startSelection + my d_endSelection))
 		SET_REAL (my v_quantityKey (), my ycursor)
 	EDITOR_DO
 		double desiredValue = GET_REAL (my v_quantityKey ());
 		if (NUMdefined (my v_minimumLegalValue ()) && desiredValue < my v_minimumLegalValue ())
-			Melder_throw ("Cannot add a point below ", my v_minimumLegalValue (), my v_rightTickUnits (), ".");
+			Melder_throw (U"Cannot add a point below ", my v_minimumLegalValue (), my v_rightTickUnits (), U".");
 		if (NUMdefined (my v_maximumLegalValue ()) && desiredValue > my v_maximumLegalValue ())
-			Melder_throw ("Cannot add a point above ", my v_maximumLegalValue (), my v_rightTickUnits (), ".");
-		Editor_save (me, L"Add point");
-		RealTier_addPoint ((RealTier) my data, GET_REAL (L"Time"), desiredValue);
+			Melder_throw (U"Cannot add a point above ", my v_maximumLegalValue (), my v_rightTickUnits (), U".");
+		Editor_save (me, U"Add point");
+		RealTier_addPoint ((RealTier) my data, GET_REAL (U"Time"), desiredValue);
 		RealTierEditor_updateScaling (me);
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
@@ -91,17 +91,17 @@ static void menu_cb_setRange (EDITOR_ARGS) {
 
 void structRealTierEditor :: v_createMenuItems_view (EditorMenu menu) {
 	RealTierEditor_Parent :: v_createMenuItems_view (menu);
-	EditorMenu_addCommand (menu, L"-- view/realtier --", 0, 0);
+	EditorMenu_addCommand (menu, U"-- view/realtier --", 0, 0);
 	EditorMenu_addCommand (menu, v_setRangeTitle (), 0, menu_cb_setRange);
 }
 
 void structRealTierEditor :: v_createMenus () {
 	RealTierEditor_Parent :: v_createMenus ();
-	EditorMenu menu = Editor_addMenu (this, L"Point", 0);
-	EditorMenu_addCommand (menu, L"Add point at cursor", 'T', menu_cb_addPointAtCursor);
-	EditorMenu_addCommand (menu, L"Add point at...", 0, menu_cb_addPointAt);
-	EditorMenu_addCommand (menu, L"-- remove point --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Remove point(s)", GuiMenu_OPTION + 'T', menu_cb_removePoints);
+	EditorMenu menu = Editor_addMenu (this, U"Point", 0);
+	EditorMenu_addCommand (menu, U"Add point at cursor", 'T', menu_cb_addPointAtCursor);
+	EditorMenu_addCommand (menu, U"Add point at...", 0, menu_cb_addPointAt);
+	EditorMenu_addCommand (menu, U"-- remove point --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Remove point(s)", GuiMenu_OPTION + 'T', menu_cb_removePoints);
 }
 
 void RealTierEditor_updateScaling (RealTierEditor me) {
@@ -170,12 +170,12 @@ void structRealTierEditor :: v_draw () {
 	Graphics_setColour (our d_graphics, Graphics_RED);
 	Graphics_line (our d_graphics, our d_startWindow, ycursor, our d_endWindow, our ycursor);
 	Graphics_setTextAlignment (our d_graphics, Graphics_RIGHT, Graphics_HALF);
-	Graphics_text1 (our d_graphics, our d_startWindow, our ycursor, Melder_float (Melder_half (our ycursor)));
+	Graphics_text (our d_graphics, our d_startWindow, our ycursor, Melder_float (Melder_half (our ycursor)));
 	Graphics_setColour (our d_graphics, Graphics_BLUE);
 	Graphics_setTextAlignment (our d_graphics, Graphics_LEFT, Graphics_TOP);
-	Graphics_text2 (our d_graphics, our d_endWindow, our ymax, Melder_float (Melder_half (ymax)), our v_rightTickUnits ());
+	Graphics_text (our d_graphics, our d_endWindow, our ymax,   Melder_float (Melder_half (ymax)), our v_rightTickUnits ());
 	Graphics_setTextAlignment (our d_graphics, Graphics_LEFT, Graphics_HALF);
-	Graphics_text2 (our d_graphics, our d_endWindow, our ymin, Melder_float (Melder_half (our ymin)), our v_rightTickUnits ());
+	Graphics_text (our d_graphics, our d_endWindow, our ymin,   Melder_float (Melder_half (our ymin)), our v_rightTickUnits ());
 	ifirstSelected = AnyTier_timeToHighIndex (data, our d_startSelection);
 	ilastSelected = AnyTier_timeToLowIndex (data, our d_endSelection);
 	imin = AnyTier_timeToHighIndex (data, our d_startWindow);
@@ -184,7 +184,7 @@ void structRealTierEditor :: v_draw () {
 	if (n == 0) {
 		Graphics_setTextAlignment (our d_graphics, Graphics_CENTRE, Graphics_HALF);
 		Graphics_text (our d_graphics, 0.5 * (our d_startWindow + our d_endWindow),
-			0.5 * (our ymin + our ymax), L"(no points)");
+			0.5 * (our ymin + our ymax), U"(no points)");
 	} else if (imax < imin) {
 		double yleft = RealTier_getValueAtTime (data, our d_startWindow);
 		double yright = RealTier_getValueAtTime (data, our d_endWindow);
@@ -237,10 +237,10 @@ static void drawWhileDragging (RealTierEditor me, double xWC, double yWC, long f
 		double t = point -> number + dt, y = point -> value + dy;
 		Graphics_line (my d_graphics, t, my ymin, t, my ymax - Graphics_dyMMtoWC (my d_graphics, 4.0));
 		Graphics_setTextAlignment (my d_graphics, kGraphics_horizontalAlignment_CENTRE, Graphics_TOP);
-		Graphics_text1 (my d_graphics, t, my ymax, Melder_fixed (t, 6));
+		Graphics_text (my d_graphics, t, my ymax, Melder_fixed (t, 6));
 		Graphics_line (my d_graphics, my d_startWindow, y, my d_endWindow, y);
 		Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_BOTTOM);
-		Graphics_text1 (my d_graphics, my d_startWindow, y, Melder_fixed (y, 6));
+		Graphics_text (my d_graphics, my d_startWindow, y, Melder_fixed (y, 6));
 	}
 }
 
@@ -289,10 +289,10 @@ int structRealTierEditor :: v_click (double xWC, double yWC, bool shiftKeyPresse
 	if (draggingSelection) {
 		ifirstSelected = AnyTier_timeToHighIndex (pitch, d_startSelection);
 		ilastSelected = AnyTier_timeToLowIndex (pitch, d_endSelection);
-		Editor_save (this, L"Drag points");
+		Editor_save (this, U"Drag points");
 	} else {
 		ifirstSelected = ilastSelected = inearestPoint;
-		Editor_save (this, L"Drag point");
+		Editor_save (this, U"Drag point");
 	}
 
 	/*
@@ -369,7 +369,7 @@ int structRealTierEditor :: v_click (double xWC, double yWC, bool shiftKeyPresse
 			our ycursor = v_maximumLegalValue ();
 	}
 
-	our broadcastDataChanged ();
+	Editor_broadcastDataChanged (this);
 	RealTierEditor_updateScaling (this);
 	return 1;   // update needed
 }
@@ -379,9 +379,9 @@ void structRealTierEditor :: v_play (double a_tmin, double a_tmax) {
 		Sound_playPart (our d_sound.data, a_tmin, a_tmax, theFunctionEditor_playCallback, this);
 }
 
-void RealTierEditor_init (RealTierEditor me, const wchar_t *title, RealTier data, Sound sound, bool ownSound) {
+void RealTierEditor_init (RealTierEditor me, const char32 *title, RealTier data, Sound sound, bool ownSound) {
 	Melder_assert (data != NULL);
-	Melder_assert (Thing_member (data, classRealTier));
+	Melder_assert (Thing_isa (data, classRealTier));
 	TimeSoundEditor_init (me, title, data, sound, ownSound);
 	my ymin = -1.0;
 	RealTierEditor_updateScaling (me);
diff --git a/fon/RealTierEditor.h b/fon/RealTierEditor.h
index a0f8ba0..9dd0605 100644
--- a/fon/RealTierEditor.h
+++ b/fon/RealTierEditor.h
@@ -2,7 +2,7 @@
 #define _RealTierEditor_h_
 /* RealTierEditor.h
  *
- * Copyright (C) 1992-2011,2012 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,31 +23,35 @@
 #include "RealTier.h"
 
 Thing_define (RealTierEditor, TimeSoundEditor) {
-	// new data:
-	public:
-		double ymin, ymax, ycursor;
-	// overridden methods:
-		virtual void v_createMenus ();
-		virtual void v_dataChanged ();
-		virtual void v_draw ();
-		virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
-		virtual void v_play (double tmin, double tmax);
-		virtual void v_createMenuItems_view (EditorMenu menu);
-	// new methods:
-		virtual double v_minimumLegalValue () { return NUMundefined; }
-		virtual double v_maximumLegalValue () { return NUMundefined; }
-		virtual const wchar_t * v_quantityText () { return L"Y"; }   // normally includes units
-		virtual const wchar_t * v_quantityKey () { return L"Y"; }   // without units
-		virtual const wchar_t * v_rightTickUnits () { return L""; }
-		virtual double v_defaultYmin () { return 0.0; }
-		virtual double v_defaultYmax () { return 1.0; }
-		virtual const wchar_t * v_setRangeTitle () { return L"Set range..."; }
-		virtual const wchar_t * v_defaultYminText () { return L"0.0"; }
-		virtual const wchar_t * v_defaultYmaxText () { return L"1.0"; }
-		virtual const wchar_t * v_yminText () { return L"Minimum"; }   // normally includes units
-		virtual const wchar_t * v_ymaxText () { return L"Maximum"; }   // normally includes units
-		virtual const wchar_t * v_yminKey () { return L"Minimum"; }   // without units
-		virtual const wchar_t * v_ymaxKey () { return L"Maximum"; }   // without units
+	double ymin, ymax, ycursor;
+
+	void v_createMenus ()
+		override;
+	void v_dataChanged ()
+		override;
+	void v_draw ()
+		override;
+	int v_click (double xWC, double yWC, bool shiftKeyPressed)
+		override;
+	void v_play (double tmin, double tmax)
+		override;
+	void v_createMenuItems_view (EditorMenu menu)
+		override;
+
+	virtual double v_minimumLegalValue () { return NUMundefined; }
+	virtual double v_maximumLegalValue () { return NUMundefined; }
+	virtual const char32 * v_quantityText () { return U"Y"; }   // normally includes units
+	virtual const char32 * v_quantityKey () { return U"Y"; }   // without units
+	virtual const char32 * v_rightTickUnits () { return U""; }
+	virtual double v_defaultYmin () { return 0.0; }
+	virtual double v_defaultYmax () { return 1.0; }
+	virtual const char32 * v_setRangeTitle () { return U"Set range..."; }
+	virtual const char32 * v_defaultYminText () { return U"0.0"; }
+	virtual const char32 * v_defaultYmaxText () { return U"1.0"; }
+	virtual const char32 * v_yminText () { return U"Minimum"; }   // normally includes units
+	virtual const char32 * v_ymaxText () { return U"Maximum"; }   // normally includes units
+	virtual const char32 * v_yminKey () { return U"Minimum"; }   // without units
+	virtual const char32 * v_ymaxKey () { return U"Maximum"; }   // without units
 };
 
 void RealTierEditor_updateScaling (RealTierEditor me);
@@ -56,10 +60,10 @@ void RealTierEditor_updateScaling (RealTierEditor me);
 	Call after every change in the data.
 */
 
-void RealTierEditor_init (RealTierEditor me, const wchar_t *title, RealTier data, Sound sound, bool ownSound);
+void RealTierEditor_init (RealTierEditor me, const char32 *title, RealTier data, Sound sound, bool ownSound);
 /*
-	'Sound' may be NULL;
-	if 'ownSound' is TRUE, the editor will contain a deep copy of the Sound,
+	`Sound` may be NULL;
+	if `ownSound` is `true`, the editor will contain a deep copy of the Sound,
 	which the editor will destroy when the editor is destroyed.
 */
 
diff --git a/fon/RealTier_def.h b/fon/RealTier_def.h
index 558eceb..4dc9a90 100644
--- a/fon/RealTier_def.h
+++ b/fon/RealTier_def.h
@@ -1,6 +1,6 @@
 /* RealTier_def.h
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,21 +33,41 @@ oo_DEFINE_CLASS (RealTier, Function)
 	oo_COLLECTION (SortedSetOfDouble, points, RealPoint, 0)
 
 	#if oo_DECLARING
-		// access functions:
-			long numberOfPoints () { return points -> size; }
-			RealPoint * peekPoints () { return reinterpret_cast <RealPoint *> (points -> item); }
-			RealPoint point (long ipoint) { return static_cast <RealPoint> (points -> item [ipoint]); }
-		// overridden methods:
-			virtual void v_info ();
-			virtual bool v_hasGetNx        () { return true; }   virtual double v_getNx   ()        { return numberOfPoints (); }
-			virtual bool v_hasGetX         () { return true; }   virtual double v_getX    (long ix) { return point (ix) -> number; }
-			virtual bool v_hasGetNcol      () { return true; }   virtual double v_getNcol ()        { return numberOfPoints (); }
-			virtual bool v_hasGetVector    () { return true; }   virtual double v_getVector    (long irow, long icol);
-			virtual bool v_hasGetFunction1 () { return true; }   virtual double v_getFunction1 (long irow, double x);
-			virtual const wchar_t * v_getUnitText (long ilevel, int unit, unsigned long flags)
-				{ (void) ilevel; (void) unit; (void) flags; return L"Time (s)"; }
-			virtual void v_shiftX (double xfrom, double xto);
-			virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		long numberOfPoints () // accessor
+			{ return points -> size; }
+		RealPoint * peekPoints () // accessor
+			{ return reinterpret_cast <RealPoint *> (points -> item); }
+		RealPoint point (long ipoint) // accessor
+			{ return static_cast <RealPoint> (points -> item [ipoint]); }
+
+		void v_info ()
+			override;
+		bool v_hasGetNx ()
+			override { return true; }
+		double v_getNx ()
+			override { return numberOfPoints (); }
+		bool v_hasGetX ()
+			override { return true; }
+		double v_getX (long ix)
+			override { return point (ix) -> number; }
+		bool v_hasGetNcol ()
+			override { return true; }
+		double v_getNcol ()
+			override { return numberOfPoints (); }
+		bool v_hasGetVector ()
+			override { return true; }
+		double v_getVector (long irow, long icol)
+			override;
+		bool v_hasGetFunction1 ()
+			override { return true; }
+		double v_getFunction1 (long irow, double x)
+			override;
+		const char32 * v_getUnitText (long /* ilevel */, int /* unit */, unsigned long /* flags */)
+			override { return U"Time (s)"; }
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
 	#endif
 
 oo_END_CLASS (RealTier)
diff --git a/fon/RunnerMFC.cpp b/fon/RunnerMFC.cpp
index 8f2f1f4..3eb4aba 100644
--- a/fon/RunnerMFC.cpp
+++ b/fon/RunnerMFC.cpp
@@ -1,6 +1,6 @@
 /* RunnerMFC.cpp
  *
- * Copyright (C) 2001-2011,2013 Paul Boersma
+ * Copyright (C) 2001-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,29 +35,29 @@
 Thing_implement (RunnerMFC, Editor, 0);
 
 void structRunnerMFC :: v_destroy () {
-	if (experiments) {
-		experiments -> size = 0;   // give ownership back to whoever thinks they own the experiments. BUG: can be dontOwnItems
-		forget (experiments);
+	if (our experiments) {
+		our experiments -> size = 0;   // give ownership back to whoever thinks they own the experiments. BUG: can be dontOwnItems
+		forget (our experiments);
 	}
-	forget (graphics);
-	RunnerMFC_Parent :: v_destroy ();
+	forget (our graphics);
+	our RunnerMFC_Parent :: v_destroy ();
 }
 
 void structRunnerMFC :: v_dataChanged () {
-	Graphics_updateWs (graphics);
+	Graphics_updateWs (our graphics);
 }
 
 static int RunnerMFC_startExperiment (RunnerMFC me) {
-	my data = (Data) my experiments -> item [my iexperiment];
+	my data = (Daata) my experiments -> item [my iexperiment];
 	Melder_assert (my data -> classInfo == classExperimentMFC);
 	ExperimentMFC_start ((ExperimentMFC) my data);
 	Thing_setName (me, ((ExperimentMFC) my data) -> name);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 	Graphics_updateWs (my graphics);
 	return 1;
 }
 
-static void drawControlButton (RunnerMFC me, double left, double right, double bottom, double top, const wchar_t *visibleText) {
+static void drawControlButton (RunnerMFC me, double left, double right, double bottom, double top, const char32 *visibleText) {
 	Graphics_setColour (my graphics, Graphics_MAROON);
 	Graphics_setLineWidth (my graphics, 3.0);
 	Graphics_fillRectangle (my graphics, left, right, bottom, top);
@@ -90,43 +90,44 @@ static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
 				experiment -> oops_label);
 		}
 	} else if (experiment -> trial <= experiment -> numberOfTrials) {
-		const wchar_t *visibleText = experiment -> stimulus [experiment -> stimuli [experiment -> trial]]. visibleText;
-		wchar_t *visibleText_dup = Melder_wcsdup_f (visibleText ? visibleText : L""), *visibleText_p = visibleText_dup;
+		const char32 *visibleText = experiment -> stimulus [experiment -> stimuli [experiment -> trial]]. visibleText;
+		autostring32 visibleText_dup = Melder_dup_f (visibleText ? visibleText : U"");
+		char32 *visibleText_p = visibleText_dup.peek();
 		Graphics_setFont (my graphics, kGraphics_font_TIMES);
 		Graphics_setFontSize (my graphics, 10);
 		Graphics_setColour (my graphics, Graphics_BLACK);
 		Graphics_setTextAlignment (my graphics, Graphics_LEFT, Graphics_TOP);
-		Graphics_text3 (my graphics, 0, 1, Melder_integer (experiment -> trial), L" / ", Melder_integer (experiment -> numberOfTrials));
+		Graphics_text (my graphics, 0, 1,   experiment -> trial, U" / ", experiment -> numberOfTrials);
 		Graphics_setTextAlignment (my graphics, Graphics_CENTRE, Graphics_TOP);
 		Graphics_setFontSize (my graphics, 24);
 		/*
 		 * The run text.
 		 */
-		if (visibleText_p [0] != '\0') {
-			wchar_t *visibleText_q = wcschr (visibleText_p, '|');
+		if (visibleText_p [0] != U'\0') {
+			char32 *visibleText_q = str32chr (visibleText_p, U'|');
 			if (visibleText_q) *visibleText_q = '\0';
 			Graphics_text (my graphics, 0.5, 1.0, visibleText_p [0] != '\0' ? visibleText_p : experiment -> runText);
-			if (visibleText_q) visibleText_p = visibleText_q + 1; else visibleText_p += wcslen (visibleText_p);
+			if (visibleText_q) visibleText_p = visibleText_q + 1; else visibleText_p += str32len (visibleText_p);
 		} else {
 			Graphics_text (my graphics, 0.5, 1.0, experiment -> runText);
 		}
 		Graphics_setTextAlignment (my graphics, Graphics_CENTRE, Graphics_HALF);
 		for (iresponse = 1; iresponse <= experiment -> numberOfDifferentResponses; iresponse ++) {
 			ResponseMFC response = & experiment -> response [iresponse];
-			wchar_t *textToDraw = response -> label;   // can be overridden
-			if (visibleText_p [0] != '\0') {
-				wchar_t *visibleText_q = wcschr (visibleText_p, '|');
-				if (visibleText_q) *visibleText_q = '\0';
+			char32 *textToDraw = response -> label;   // can be overridden
+			if (visibleText_p [0] != U'\0') {
+				char32 *visibleText_q = str32chr (visibleText_p, U'|');
+				if (visibleText_q) *visibleText_q = U'\0';
 				textToDraw = visibleText_p;   // override
-				if (visibleText_q) visibleText_p = visibleText_q + 1; else visibleText_p += wcslen (visibleText_p);
+				if (visibleText_q) visibleText_p = visibleText_q + 1; else visibleText_p += str32len (visibleText_p);
 			}
-			if (wcsnequ (textToDraw, L"\\FI", 3)) {
+			if (str32nequ (textToDraw, U"\\FI", 3)) {
 				structMelderFile file = { 0 };
 				MelderDir_relativePathToFile (& experiment -> rootDirectory, textToDraw + 3, & file);
 				Graphics_imageFromFile (my graphics, Melder_fileToPath (& file), response -> left, response -> right, response -> bottom, response -> top);
 			} else {
 				Graphics_setColour (my graphics,
-					response -> name [0] == '\0' ? Graphics_SILVER :
+					response -> name [0] == U'\0' ? Graphics_SILVER :
 					experiment -> responses [experiment -> trial] == iresponse ? Graphics_RED :
 					experiment -> ok_right > experiment -> ok_left || experiment -> responses [experiment -> trial] == 0 ?
 					Graphics_YELLOW : Graphics_SILVER);
@@ -168,7 +169,6 @@ static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
 				experiment -> oops_left, experiment -> oops_right, experiment -> oops_bottom, experiment -> oops_top,
 				experiment -> oops_label);
 		}
-		Melder_free (visibleText_dup);
 	} else {
 		Graphics_setTextAlignment (my graphics, Graphics_CENTRE, Graphics_HALF);
 		Graphics_setFontSize (my graphics, 24);
@@ -196,15 +196,15 @@ static void do_ok (RunnerMFC me) {
 	my numberOfReplays = 0;
 	if (experiment -> trial == experiment -> numberOfTrials) {
 		experiment -> trial ++;
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 		Graphics_updateWs (my graphics);
 	} else if (experiment -> breakAfterEvery != 0 && experiment -> trial % experiment -> breakAfterEvery == 0) {
-		experiment -> pausing = TRUE;
-		my broadcastDataChanged ();
+		experiment -> pausing = true;
+		Editor_broadcastDataChanged (me);
 		Graphics_updateWs (my graphics);
 	} else {
 		experiment -> trial ++;
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 		if (experiment -> blankWhilePlaying) {
 			Graphics_setGrey (my graphics, 0.8);
 			Graphics_fillRectangle (my graphics, 0, 1, 0, 1);
@@ -231,9 +231,9 @@ static void do_oops (RunnerMFC me) {
 	experiment -> trial --;
 	experiment -> responses [experiment -> trial] = 0;
 	experiment -> goodnesses [experiment -> trial] = 0;
-	experiment -> pausing = FALSE;
+	experiment -> pausing = false;
 	my numberOfReplays = 0;
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 	if (experiment -> blankWhilePlaying) {
 		Graphics_setGrey (my graphics, 0.8);
 		Graphics_fillRectangle (my graphics, 0, 1, 0, 1);
@@ -253,7 +253,7 @@ static void do_replay (RunnerMFC me) {
 	ExperimentMFC experiment = (ExperimentMFC) my data;
 	Melder_assert (experiment -> trial >= 1 && experiment -> trial <= experiment -> numberOfTrials);
 	my numberOfReplays ++;
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 	if (experiment -> blankWhilePlaying) {
 		Graphics_setGrey (my graphics, 0.8);
 		Graphics_fillRectangle (my graphics, 0, 1, 0, 1);
@@ -271,7 +271,7 @@ static void do_replay (RunnerMFC me) {
 
 static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 	iam (RunnerMFC);
-	if (my graphics == NULL) return;   // Could be the case in the very beginning.
+	if (my graphics == NULL) return;   // could be the case in the very beginning
 	ExperimentMFC experiment = (ExperimentMFC) my data;
 	if (my data == NULL) return;
 	double reactionTime = Melder_clock () - experiment -> startingTime;
@@ -281,7 +281,7 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 	Graphics_DCtoWC (my graphics, event -> x, event -> y, & x, & y);
 	if (experiment -> trial == 0) {   // the first click of the experiment
 		experiment -> trial ++;
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 		if (experiment -> blankWhilePlaying) {
 			Graphics_setGrey (my graphics, 0.8);
 			Graphics_fillRectangle (my graphics, 0, 1, 0, 1);
@@ -291,7 +291,7 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 		Graphics_updateWs (my graphics);
 		if (experiment -> stimuliAreSounds) {
 			if (experiment -> numberOfTrials < 1) {
-				Melder_flushError ("There are zero trials in this experiment.");
+				Melder_flushError (U"There are zero trials in this experiment.");
 				forget (me);
 				return;
 			}
@@ -306,9 +306,9 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 		{
 			do_oops (me);
 		} else {
-			experiment -> pausing = FALSE;
+			experiment -> pausing = false;
 			experiment -> trial ++;
-			my broadcastDataChanged ();
+			Editor_broadcastDataChanged (me);
 			if (experiment -> blankWhilePlaying) {
 				Graphics_setGrey (my graphics, 0.8);
 				Graphics_fillRectangle (my graphics, 0, 1, 0, 1);
@@ -351,7 +351,7 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 					if (experiment -> ok_right <= experiment -> ok_left && experiment -> numberOfGoodnessCategories == 0) {
 						do_ok (me);
 					} else {
-						my broadcastDataChanged ();
+						Editor_broadcastDataChanged (me);
 						Graphics_updateWs (my graphics);
 					}
 				}
@@ -361,7 +361,7 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 					GoodnessMFC cat = & experiment -> goodness [iresponse];
 					if (x > cat -> left && x < cat -> right && y > cat -> bottom && y < cat -> top) {
 						experiment -> goodnesses [experiment -> trial] = iresponse;
-						my broadcastDataChanged ();
+						Editor_broadcastDataChanged (me);
 						Graphics_updateWs (my graphics);
 					}
 				}
@@ -386,7 +386,7 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 		if (my iexperiment < my experiments -> size) {
 			my iexperiment ++;
 			if (! RunnerMFC_startExperiment (me)) {
-				Melder_flushError (NULL);
+				Melder_flushError ();
 				forget (me);
 				return;
 			}
@@ -431,7 +431,7 @@ static void gui_drawingarea_cb_key (I, GuiDrawingAreaKeyEvent event) {
 					if (experiment -> ok_right <= experiment -> ok_left && experiment -> numberOfGoodnessCategories == 0) {
 						do_ok (me);
 					} else {
-						my broadcastDataChanged ();
+						Editor_broadcastDataChanged (me);
 						Graphics_updateWs (my graphics);
 					}
 				}
@@ -441,11 +441,11 @@ static void gui_drawingarea_cb_key (I, GuiDrawingAreaKeyEvent event) {
 }
 
 void structRunnerMFC :: v_createChildren () {
-	d_drawingArea = GuiDrawingArea_createShown (d_windowForm, 0, 0, Machine_getMenuBarHeight (), 0,
+	our d_drawingArea = GuiDrawingArea_createShown (our d_windowForm, 0, 0, Machine_getMenuBarHeight (), 0,
 		gui_drawingarea_cb_expose, gui_drawingarea_cb_click, gui_drawingarea_cb_key, gui_drawingarea_cb_resize, this, 0);
 }
 
-RunnerMFC RunnerMFC_create (const wchar_t *title, Ordered experiments) {
+autoRunnerMFC RunnerMFC_create (const char32 *title, Ordered experiments) {
 	try {
 		autoRunnerMFC me = Thing_new (RunnerMFC);
 		Editor_init (me.peek(), 0, 0, 2000, 2000, title, NULL);
@@ -453,15 +453,15 @@ RunnerMFC RunnerMFC_create (const wchar_t *title, Ordered experiments) {
 		my graphics = Graphics_create_xmdrawingarea (my d_drawingArea);
 
 struct structGuiDrawingAreaResizeEvent event = { my d_drawingArea, 0 };
-event. width  = my d_drawingArea -> f_getWidth  ();
-event. height = my d_drawingArea -> f_getHeight ();
+event. width  = GuiControl_getWidth  (my d_drawingArea);
+event. height = GuiControl_getHeight (my d_drawingArea);
 gui_drawingarea_cb_resize (me.peek(), & event);
 
 		my iexperiment = 1;
 		RunnerMFC_startExperiment (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Experiment window not created.");
+		Melder_throw (U"Experiment window not created.");
 	}
 }
 
diff --git a/fon/RunnerMFC.h b/fon/RunnerMFC.h
index 97b7717..c5b9414 100644
--- a/fon/RunnerMFC.h
+++ b/fon/RunnerMFC.h
@@ -2,7 +2,7 @@
 #define _RunnerMFC_h_
 /* RunnerMFC.h
  *
- * Copyright (C) 2001-2011,2012 Paul Boersma
+ * Copyright (C) 2001-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,22 +23,25 @@
 #include "ExperimentMFC.h"
 
 Thing_define (RunnerMFC, Editor) {
-	// new data:
-	public:
-		GuiDrawingArea d_drawingArea;
-		Ordered experiments;
-		long iexperiment;
-		Graphics graphics;
-		long numberOfReplays;
-	// overridden methods:
-		void v_destroy ();
-		bool v_editable () { return false; }
-		bool v_scriptable () { return false; }
-		void v_createChildren ();
-		void v_dataChanged ();
+	GuiDrawingArea d_drawingArea;
+	Ordered experiments;
+	long iexperiment;
+	Graphics graphics;
+	long numberOfReplays;
+
+	void v_destroy ()
+		override;
+	bool v_editable ()
+		override { return false; }
+	bool v_scriptable ()
+		override { return false; }
+	void v_createChildren ()
+		override;
+	void v_dataChanged ()
+		override;
 };
 
-RunnerMFC RunnerMFC_create (const wchar_t *title, Ordered experiments);
+autoRunnerMFC RunnerMFC_create (const char32 *title, Ordered experiments);
 
 /* End of file RunnerMFC.h */
 #endif
diff --git a/fon/Sampled.cpp b/fon/Sampled.cpp
index 385dcdb..f16b9b3 100644
--- a/fon/Sampled.cpp
+++ b/fon/Sampled.cpp
@@ -1,6 +1,6 @@
 /* Sampled.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -74,8 +74,8 @@ void Sampled_shortTermAnalysis (Sampled me, double windowDuration, double timeSt
 	Melder_assert (timeStep > 0.0);
 	volatile double myDuration = my dx * my nx;
 	if (windowDuration > myDuration)
-		Melder_throw (me, ": shorter than window length."); 
-	*numberOfFrames = floor ((myDuration - windowDuration) / timeStep) + 1;
+		Melder_throw (me, U": shorter than window length.");
+	*numberOfFrames = (long) floor ((myDuration - windowDuration) / timeStep) + 1;
 	Melder_assert (*numberOfFrames >= 1);
 	double ourMidTime = my x1 - 0.5 * my dx + 0.5 * myDuration;
 	double thyDuration = *numberOfFrames * timeStep;
@@ -91,7 +91,7 @@ double Sampled_getValueAtX (Sampled me, double x, long ilevel, int unit, bool in
 	if (x < my xmin || x > my xmax) return NUMundefined;
 	if (interpolate) {
 		double ireal = Sampled_xToIndex (me, x);
-		long ileft = floor (ireal), inear, ifar;
+		long ileft = (long) floor (ireal), inear, ifar;
 		double phase = ireal - ileft;
 		if (phase < 0.5) {
 			inear = ileft, ifar = ileft + 1;
@@ -153,7 +153,7 @@ double Sampled_getQuantile (Sampled me, double xmin, double xmax, double quantil
 		}
 		return result;
 	} catch (MelderError) {
-		Melder_throw (me, ": quantile not computed.");
+		Melder_throw (me, U": quantile not computed.");
 	}
 }
 
@@ -173,7 +173,7 @@ static void Sampled_getSumAndDefinitionRange
 			if (Sampled_getWindowSamples (me, xmin, xmax, & imin, & imax)) {
 				double leftEdge = my x1 - 0.5 * my dx, rightEdge = leftEdge + my nx * my dx;
 				for (isamp = imin; isamp <= imax; isamp ++) {
-					double value = my v_getValueAtSample (isamp, ilevel, unit);   /* A fast way to integrate a linearly interpolated curve; works everywhere except at the edges. */
+					double value = my v_getValueAtSample (isamp, ilevel, unit);   // a fast way to integrate a linearly interpolated curve; works everywhere except at the edges
 					if (NUMdefined (value)) {
 						definitionRange += 1.0;
 						sum += value;
@@ -182,19 +182,19 @@ static void Sampled_getSumAndDefinitionRange
 				/*
 				 * Corrections within the first and last sampling intervals.
 				 */
-				if (xmin > leftEdge) {   /* Otherwise, constant extrapolation over 0.5 sample is OK. */
-					double phase = (my x1 + (imin - 1) * my dx - xmin) / my dx;   /* This fraction of sampling interval is still to be determined. */
+				if (xmin > leftEdge) {   // otherwise, constant extrapolation over 0.5 sample is OK
+					double phase = (my x1 + (imin - 1) * my dx - xmin) / my dx;   // this fraction of sampling interval is still to be determined
 					double rightValue = Sampled_getValueAtSample (me, imin, ilevel, unit);
 					double leftValue = Sampled_getValueAtSample (me, imin - 1, ilevel, unit);
 					if (NUMdefined (rightValue)) {
-						definitionRange -= 0.5;   /* Delete constant extrapolation over 0.5 sample. */
+						definitionRange -= 0.5;   // delete constant extrapolation over 0.5 sample
 						sum -= 0.5 * rightValue;
 						if (NUMdefined (leftValue)) {
 							definitionRange += phase;   /* Add current fraction. */
-							sum += phase * (rightValue + 0.5 * phase * (leftValue - rightValue));   /* Interpolate to outside sample. */
+							sum += phase * (rightValue + 0.5 * phase * (leftValue - rightValue));   // interpolate to outside sample
 						} else {
 							if (phase > 0.5) phase = 0.5;
-							definitionRange += phase;   /* Add current fraction, but never more than 0.5. */
+							definitionRange += phase;   // add current fraction, but never more than 0.5
 							sum += phase * rightValue;
 						}
 					} else if (NUMdefined (leftValue) && phase > 0.5) {
@@ -202,19 +202,19 @@ static void Sampled_getSumAndDefinitionRange
 						sum += (phase - 0.5) * leftValue;
 					}
 				}
-				if (xmax < rightEdge) {   /* Otherwise, constant extrapolation is OK. */
-					double phase = (xmax - (my x1 + (imax - 1) * my dx)) / my dx;   /* This fraction of sampling interval is still to be determined. */
+				if (xmax < rightEdge) {   // otherwise, constant extrapolation is OK
+					double phase = (xmax - (my x1 + (imax - 1) * my dx)) / my dx;   // this fraction of sampling interval is still to be determined
 					double leftValue = Sampled_getValueAtSample (me, imax, ilevel, unit);
 					double rightValue = Sampled_getValueAtSample (me, imax + 1, ilevel, unit);
 					if (NUMdefined (leftValue)) {
-						definitionRange -= 0.5;   /* Delete constant extrapolation over 0.5 sample. */
+						definitionRange -= 0.5;   // delete constant extrapolation over 0.5 sample
 						sum -= 0.5 * leftValue;
 						if (NUMdefined (rightValue)) {
-							definitionRange += phase;   /* Add current fraction. */
-							sum += phase * (leftValue + 0.5 * phase * (rightValue - leftValue));   /* Interpolate to outside sample. */
+							definitionRange += phase;   // add current fraction
+							sum += phase * (leftValue + 0.5 * phase * (rightValue - leftValue));   // interpolate to outside sample
 						} else {
 							if (phase > 0.5) phase = 0.5;
-							definitionRange += phase;   /* Add current fraction, but never more than 0.5. */
+							definitionRange += phase;   // add current fraction, but never more than 0.5
 							sum += phase * leftValue;
 						}
 					} else if (NUMdefined (rightValue) && phase > 0.5) {
@@ -231,7 +231,7 @@ static void Sampled_getSumAndDefinitionRange
 				double rightValue = Sampled_getValueAtSample (me, imin, ilevel, unit);
 				double phase1 = (xmin - (my x1 + (imax - 1) * my dx)) / my dx;
 				double phase2 = (xmax - (my x1 + (imax - 1) * my dx)) / my dx;
-				if (imin == imax + 1) {   /* Not too far from sample definition region. */
+				if (imin == imax + 1) {   // not too far from sample definition region
 					if (NUMdefined (leftValue)) {
 						if (NUMdefined (rightValue)) {
 							definitionRange += phase2 - phase1;
@@ -248,7 +248,7 @@ static void Sampled_getSumAndDefinitionRange
 					}
 				}
 			}
-		} else {   /* No interpolation. */
+		} else {   // no interpolation
 			double rimin = Sampled_xToIndex (me, xmin), rimax = Sampled_xToIndex (me, xmax);
 			if (rimax >= 0.5 && rimin < my nx + 0.5) {
 				imin = rimin < 0.5 ? 0 : (long) floor (rimin + 0.5);
@@ -320,14 +320,14 @@ static void Sampled_getSum2AndDefinitionRange
 		Outside [x1-dx/2, xN+dx/2], the curve is undefined and neither times nor values are counted.
 		In [x1-dx/2,x1] and [xN,xN+dx/2], the curve is linearly extrapolated.
 	*/
-	long imin, imax, isamp;
+	long imin, imax;
 	double sum2 = 0.0, definitionRange = 0.0;
 	Function_unidirectionalAutowindow (me, & xmin, & xmax);
 	if (Function_intersectRangeWithDomain (me, & xmin, & xmax)) {
 		if (interpolate) {
 			if (Sampled_getWindowSamples (me, xmin, xmax, & imin, & imax)) {
 				double leftEdge = my x1 - 0.5 * my dx, rightEdge = leftEdge + my nx * my dx;
-				for (isamp = imin; isamp <= imax; isamp ++) {
+				for (long isamp = imin; isamp <= imax; isamp ++) {
 					double value = my v_getValueAtSample (isamp, ilevel, unit);   // a fast way to integrate a linearly interpolated curve; works everywhere except at the edges
 					if (NUMdefined (value)) {
 						value -= mean;
@@ -426,9 +426,9 @@ static void Sampled_getSum2AndDefinitionRange
 		} else {   // no interpolation
 			double rimin = Sampled_xToIndex (me, xmin), rimax = Sampled_xToIndex (me, xmax);
 			if (rimax >= 0.5 && rimin < my nx + 0.5) {
-				imin = rimin < 0.5 ? 0 : (long) floor (rimin + 0.5);
-				imax = rimax >= my nx + 0.5 ? my nx + 1 : (long) floor (rimax + 0.5);
-				for (isamp = imin + 1; isamp < imax; isamp ++) {
+				imin = rimin < 0.5 ? 0 : lround (rimin);
+				imax = rimax >= my nx + 0.5 ? my nx + 1 : lround (rimax);
+				for (long isamp = imin + 1; isamp < imax; isamp ++) {
 					double value = my v_getValueAtSample (isamp, ilevel, unit);
 					if (NUMdefined (value)) {
 						value -= mean;
@@ -490,7 +490,6 @@ double Sampled_getStandardDeviation_standardUnit (Sampled me, double xmin, doubl
 void Sampled_getMinimumAndX (Sampled me, double xmin, double xmax, long ilevel, int unit, bool interpolate,
 	double *return_minimum, double *return_xOfMinimum)
 {
-	long imin, imax, i;
 	double minimum = 1e301, xOfMinimum = 0.0;
 	if (xmin == NUMundefined || xmax == NUMundefined) {
 		minimum = xOfMinimum = NUMundefined;
@@ -501,6 +500,7 @@ void Sampled_getMinimumAndX (Sampled me, double xmin, double xmax, long ilevel,
 		minimum = xOfMinimum = NUMundefined;   // requested range and logical domain do not intersect
 		goto end;
 	}
+	long imin, imax;
 	if (! Sampled_getWindowSamples (me, xmin, xmax, & imin, & imax)) {
 		/*
 		 * No sample centres between xmin and xmax.
@@ -511,10 +511,10 @@ void Sampled_getMinimumAndX (Sampled me, double xmin, double xmax, long ilevel,
 		if (NUMdefined (fleft) && fleft < minimum) minimum = fleft, xOfMinimum = xmin;
 		if (NUMdefined (fright) && fright < minimum) minimum = fright, xOfMinimum = xmax;
 	} else {
-		for (i = imin; i <= imax; i ++) {
+		for (long i = imin; i <= imax; i ++) {
 			double fmid = my v_getValueAtSample (i, ilevel, unit);
 			if (fmid == NUMundefined) continue;
-			if (interpolate == FALSE) {
+			if (! interpolate) {
 				if (fmid < minimum) minimum = fmid, xOfMinimum = i;
 			} else {
 				/*
@@ -533,11 +533,11 @@ void Sampled_getMinimumAndX (Sampled me, double xmin, double xmax, long ilevel,
 				}
 			}
 		}
-		xOfMinimum = my x1 + (xOfMinimum - 1) * my dx;   /* From index plus phase to time. */
+		xOfMinimum = my x1 + (xOfMinimum - 1) * my dx;   // from index plus phase to time
 		/* Check boundary values. */
 		if (interpolate) {
-			double fleft = Sampled_getValueAtX (me, xmin, ilevel, unit, TRUE);
-			double fright = Sampled_getValueAtX (me, xmax, ilevel, unit, TRUE);
+			double fleft = Sampled_getValueAtX (me, xmin, ilevel, unit, true);
+			double fright = Sampled_getValueAtX (me, xmax, ilevel, unit, true);
 			if (NUMdefined (fleft) && fleft < minimum) minimum = fleft, xOfMinimum = xmin;
 			if (NUMdefined (fright) && fright < minimum) minimum = fright, xOfMinimum = xmax;
 		}
@@ -552,20 +552,19 @@ end:
 
 double Sampled_getMinimum (Sampled me, double xmin, double xmax, long ilevel, int unit, bool interpolate) {
 	double minimum;
-	Sampled_getMinimumAndX (me, xmin, xmax, ilevel, unit, interpolate, & minimum, NULL);
+	Sampled_getMinimumAndX (me, xmin, xmax, ilevel, unit, interpolate, & minimum, nullptr);
 	return minimum;
 }
 
 double Sampled_getXOfMinimum (Sampled me, double xmin, double xmax, long ilevel, int unit, bool interpolate) {
 	double time;
-	Sampled_getMinimumAndX (me, xmin, xmax, ilevel, unit, interpolate, NULL, & time);
+	Sampled_getMinimumAndX (me, xmin, xmax, ilevel, unit, interpolate, nullptr, & time);
 	return time;
 }
 
 void Sampled_getMaximumAndX (Sampled me, double xmin, double xmax, long ilevel, int unit, bool interpolate,
 	double *return_maximum, double *return_xOfMaximum)
 {
-	long imin, imax, i;
 	double maximum = -1e301, xOfMaximum = 0.0;
 	if (xmin == NUMundefined || xmax == NUMundefined) {
 		maximum = xOfMaximum = NUMundefined;
@@ -576,6 +575,7 @@ void Sampled_getMaximumAndX (Sampled me, double xmin, double xmax, long ilevel,
 		maximum = xOfMaximum = NUMundefined;   // requested range and logical domain do not intersect
 		goto end;
 	}
+	long imin, imax;
 	if (! Sampled_getWindowSamples (me, xmin, xmax, & imin, & imax)) {
 		/*
 		 * No sample centres between tmin and tmax.
@@ -586,10 +586,10 @@ void Sampled_getMaximumAndX (Sampled me, double xmin, double xmax, long ilevel,
 		if (NUMdefined (fleft) && fleft > maximum) maximum = fleft, xOfMaximum = xmin;
 		if (NUMdefined (fright) && fright > maximum) maximum = fright, xOfMaximum = xmax;
 	} else {
-		for (i = imin; i <= imax; i ++) {
+		for (long i = imin; i <= imax; i ++) {
 			double fmid = my v_getValueAtSample (i, ilevel, unit);
 			if (fmid == NUMundefined) continue;
-			if (interpolate == FALSE) {
+			if (! interpolate) {
 				if (fmid > maximum) maximum = fmid, xOfMaximum = i;
 			} else {
 				/*
@@ -608,11 +608,11 @@ void Sampled_getMaximumAndX (Sampled me, double xmin, double xmax, long ilevel,
 				}
 			}
 		}
-		xOfMaximum = my x1 + (xOfMaximum - 1) * my dx;   /* From index plus phase to time. */
+		xOfMaximum = my x1 + (xOfMaximum - 1) * my dx;   // from index plus phase to time
 		/* Check boundary values. */
 		if (interpolate) {
-			double fleft = Sampled_getValueAtX (me, xmin, ilevel, unit, TRUE);
-			double fright = Sampled_getValueAtX (me, xmax, ilevel, unit, TRUE);
+			double fleft = Sampled_getValueAtX (me, xmin, ilevel, unit, true);
+			double fright = Sampled_getValueAtX (me, xmax, ilevel, unit, true);
 			if (NUMdefined (fleft) && fleft > maximum) maximum = fleft, xOfMaximum = xmin;
 			if (NUMdefined (fright) && fright > maximum) maximum = fright, xOfMaximum = xmax;
 		}
diff --git a/fon/SampledXY_def.h b/fon/SampledXY_def.h
index f6c930b..4488f20 100644
--- a/fon/SampledXY_def.h
+++ b/fon/SampledXY_def.h
@@ -1,6 +1,6 @@
 /* SampledXY_def.h
  *
- * Copyright (C) 1992-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,13 +31,26 @@ oo_DEFINE_CLASS (SampledXY, Sampled)
 	oo_DOUBLE (y1)
 
 	#if oo_DECLARING
-		// overridden methods:
-			//virtual void v_info ();
-			virtual bool v_hasGetYmin      () { return true; }   virtual double v_getYmin      ()        { return ymin; }
-			virtual bool v_hasGetYmax      () { return true; }   virtual double v_getYmax      ()        { return ymax; }
-			virtual bool v_hasGetNy        () { return true; }   virtual double v_getNy        ()        { return ny; }
-			virtual bool v_hasGetDy        () { return true; }   virtual double v_getDy        ()        { return dy; }
-			virtual bool v_hasGetY         () { return true; }   virtual double v_getY         (long iy) { return y1 + (iy - 1) * dy; }
+		bool v_hasGetYmin ()
+			override { return true; }
+		double v_getYmin ()
+			override { return ymin; }
+		bool v_hasGetYmax ()
+			override { return true; }
+		double v_getYmax ()
+			override { return ymax; }
+		bool v_hasGetNy ()
+			override { return true; }
+		double v_getNy ()
+			override { return ny; }
+		bool v_hasGetDy ()
+			override { return true; }
+		double v_getDy ()
+			override { return dy; }
+		bool v_hasGetY ()
+			override { return true; }
+		double v_getY (long iy)
+			override { return y1 + (iy - 1) * dy; }
 	#endif
 
 oo_END_CLASS (SampledXY)
diff --git a/fon/Sampled_def.h b/fon/Sampled_def.h
index bce9e20..3c8950f 100644
--- a/fon/Sampled_def.h
+++ b/fon/Sampled_def.h
@@ -1,6 +1,6 @@
 /* Sampled_def.h
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,15 +26,25 @@ oo_DEFINE_CLASS (Sampled, Function)
 	oo_DOUBLE (x1)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual bool v_hasGetNx () { return true; }   virtual double v_getNx ()        { return nx; }
-			virtual bool v_hasGetDx () { return true; }   virtual double v_getDx ()        { return dx; }
-			virtual bool v_hasGetX  () { return true; }   virtual double v_getX  (long ix) { return x1 + (ix - 1) * dx; }
-			virtual void v_shiftX (double xfrom, double xto);
-			virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
-		// new methods:
-			virtual double v_getValueAtSample (long isamp, long ilevel, int unit)
-				{ (void) isamp; (void) ilevel; (void) unit; return NUMundefined; }
+		bool v_hasGetNx ()
+			override { return true; }
+		double v_getNx ()
+			override { return nx; }
+		bool v_hasGetDx ()
+			override { return true; }
+		double v_getDx ()
+			override { return dx; }
+		bool v_hasGetX ()
+			override { return true; }
+		double v_getX (long ix)
+			override { return x1 + (ix - 1) * dx; }
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
+
+		virtual double v_getValueAtSample (long /* isamp */, long /* ilevel */, int /* unit */)
+			{ return NUMundefined; }
 	#endif
 
 oo_END_CLASS (Sampled)
diff --git a/fon/Sound.cpp b/fon/Sound.cpp
index 055aeb7..4002ab8 100644
--- a/fon/Sound.cpp
+++ b/fon/Sound.cpp
@@ -1,6 +1,6 @@
 /* Sound.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -37,19 +37,19 @@ Thing_implement (Sound, Vector, 2);
 Sound Sound_clipboard;
 
 void structSound :: v_info () {
-	structData :: v_info ();
+	structDaata :: v_info ();
 	const double rho_c = 400;   /* rho = 1.14 kg m-3; c = 353 m s-1; [rho c] = kg m-2 s-1 */
 	double minimum = z [1] [1], maximum = minimum;
-	MelderInfo_writeLine (L"Number of channels: ", Melder_integer (ny), ny == 1 ? L" (mono)" : ny == 2 ? L" (stereo)" : L"");
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"Time sampling:");
-	MelderInfo_writeLine (L"   Number of samples: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"   Sampling period: ", Melder_double (dx), L" seconds");
-	MelderInfo_writeLine (L"   Sampling frequency: ", Melder_single (1.0 / dx), L" Hz");
-	MelderInfo_writeLine (L"   First sample centred at: ", Melder_double (x1), L" seconds");
+	MelderInfo_writeLine (U"Number of channels: ", ny, ny == 1 ? U" (mono)" : ny == 2 ? U" (stereo)" : U"");
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"Time sampling:");
+	MelderInfo_writeLine (U"   Number of samples: ", nx);
+	MelderInfo_writeLine (U"   Sampling period: ", dx, U" seconds");
+	MelderInfo_writeLine (U"   Sampling frequency: ", Melder_single (1.0 / dx), U" Hz");
+	MelderInfo_writeLine (U"   First sample centred at: ", x1, U" seconds");
 	{// scope
 		double sum = 0.0, sumOfSquares = 0.0;
 		for (long channel = 1; channel <= ny; channel ++) {
@@ -62,22 +62,22 @@ void structSound :: v_info () {
 				if (value > maximum) maximum = value;
 			}
 		}
-		MelderInfo_writeLine (L"Amplitude:");
-		MelderInfo_writeLine (L"   Minimum: ", Melder_single (minimum), L" Pascal");
-		MelderInfo_writeLine (L"   Maximum: ", Melder_single (maximum), L" Pascal");
+		MelderInfo_writeLine (U"Amplitude:");
+		MelderInfo_writeLine (U"   Minimum: ", Melder_single (minimum), U" Pascal");
+		MelderInfo_writeLine (U"   Maximum: ", Melder_single (maximum), U" Pascal");
 		double mean = sum / (nx * ny);
-		MelderInfo_writeLine (L"   Mean: ", Melder_single (mean), L" Pascal");
-		MelderInfo_writeLine (L"   Root-mean-square: ", Melder_single (sqrt (sumOfSquares / (nx * ny))), L" Pascal");
+		MelderInfo_writeLine (U"   Mean: ", Melder_single (mean), U" Pascal");
+		MelderInfo_writeLine (U"   Root-mean-square: ", Melder_single (sqrt (sumOfSquares / (nx * ny))), U" Pascal");
 		double penergy = sumOfSquares * dx / ny;   /* Pa2 s = kg2 m-2 s-3 */
-		MelderInfo_write (L"Total energy: ", Melder_single (penergy), L" Pascal\u00B2 sec");
+		MelderInfo_write (U"Total energy: ", Melder_single (penergy), U" Pascal\u00B2 sec");
 		double energy = penergy / rho_c;   /* kg s-2 = Joule m-2 */
-		MelderInfo_writeLine (L" (energy in air: ", Melder_single (energy), L" Joule/m\u00B2)");
+		MelderInfo_writeLine (U" (energy in air: ", Melder_single (energy), U" Joule/m\u00B2)");
 		double power = energy / (dx * nx);   /* kg s-3 = Watt/m2 */
-		MelderInfo_write (L"Mean power (intensity) in air: ", Melder_single (power), L" Watt/m\u00B2");
+		MelderInfo_write (U"Mean power (intensity) in air: ", Melder_single (power), U" Watt/m\u00B2");
 		if (power != 0.0) {
-			MelderInfo_writeLine (L" = ", Melder_half (10 * log10 (power / 1e-12)), L" dB");
+			MelderInfo_writeLine (U" = ", Melder_half (10 * log10 (power / 1e-12)), U" dB");
 		} else {
-			MelderInfo_writeLine (L"");
+			MelderInfo_writeLine (U"");
 		}
 	}
 	if (nx > 1) {
@@ -94,7 +94,7 @@ void structSound :: v_info () {
 				stdev += value * value;
 			}
 			stdev = sqrt (stdev / (nx - 1));
-			MelderInfo_writeLine (L"Standard deviation in channel ", Melder_integer (channel), L": ", Melder_single (stdev), L" Pascal");
+			MelderInfo_writeLine (U"Standard deviation in channel ", channel, U": ", Melder_single (stdev), U" Pascal");
 		}
 	}
 }
@@ -123,24 +123,24 @@ double structSound :: v_getFunction2 (double x, double y) {
 	return v_getFunction1 (channel, x);
 }
 
-Sound Sound_create (long numberOfChannels, double xmin, double xmax, long nx, double dx, double x1) {
+autoSound Sound_create (long numberOfChannels, double xmin, double xmax, long nx, double dx, double x1) {
 	try {
 		autoSound me = Thing_new (Sound);
 		Matrix_init (me.peek(), xmin, xmax, nx, dx, x1, 1, numberOfChannels, numberOfChannels, 1, 1);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Sound not created.");
+		Melder_throw (U"Sound not created.");
 	}
 }
 
-Sound Sound_createSimple (long numberOfChannels, double duration, double samplingFrequency) {
-	Melder_assert (duration > 0.0);
+autoSound Sound_createSimple (long numberOfChannels, double duration, double samplingFrequency) {
+	Melder_assert (duration >= 0.0);
 	Melder_assert (samplingFrequency > 0.0);
 	double numberOfSamples_f = round (duration * samplingFrequency);
 	if (numberOfSamples_f > (double) INT32_MAX)
-		Melder_throw ("Cannot create sounds with more than ", Melder_bigInteger (INT32_MAX), " samples, because they cannot be saved to disk.");
+		Melder_throw (U"Cannot create sounds with more than ", Melder_bigInteger (INT32_MAX), U" samples, because they cannot be saved to disk.");
 	return Sound_create (numberOfChannels, 0.0, duration, (long) (int32_t) numberOfSamples_f,
-		1 / samplingFrequency, 0.5 / samplingFrequency);
+		1.0 / samplingFrequency, 0.5 / samplingFrequency);
 }
 
 Sound Sound_convertToMono (Sound me) {
@@ -162,7 +162,7 @@ Sound Sound_convertToMono (Sound me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to mono.");
+		Melder_throw (me, U": not converted to mono.");
 	}
 }
 
@@ -170,7 +170,7 @@ Sound Sound_convertToStereo (Sound me) {
 	if (my ny == 2) return Data_copy (me);
 	try {
 		if (my ny > 2) {
-			Melder_throw ("The Sound has ", my ny, " channels; don't know which to choose.");
+			Melder_throw (U"The Sound has ", my ny, U" channels; don't know which to choose.");
 		}
 		Melder_assert (my ny == 1);
 		autoSound thee = Sound_create (2, my xmin, my xmax, my nx, my dx, my x1);
@@ -179,7 +179,7 @@ Sound Sound_convertToStereo (Sound me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to stereo.");
+		Melder_throw (me, U": not converted to stereo.");
 	}
 }
 
@@ -193,8 +193,8 @@ Sound Sounds_combineToStereo (Collection me) {
 			if (sharedSamplingPeriod == 0.0) {
 				sharedSamplingPeriod = sound -> dx;
 			} else if (sound -> dx != sharedSamplingPeriod) {
-				Melder_throw ("To combine sounds, their sampling frequencies must be equal.\n"
-						"You could resample one or more of the sounds before combining.");
+				Melder_throw (U"To combine sounds, their sampling frequencies must be equal.\n"
+						U"You could resample one or more of the sounds before combining.");
 			}
 		}
 		double sharedMinimumTime = NUMundefined, sharedMaximumTime = NUMundefined;
@@ -216,7 +216,7 @@ Sound Sounds_combineToStereo (Collection me) {
 			numberOfInitialZeroes [isound] = floor ((sound -> xmin - sharedMinimumTime) / sharedSamplingPeriod);
 			double newFirstTime = sound -> x1 - sound -> dx * numberOfInitialZeroes [isound];
 			sumOfFirstTimes += newFirstTime;
-			long newNumberOfSamplesThroughLastNonzero = sound -> nx + numberOfInitialZeroes [isound];
+			long newNumberOfSamplesThroughLastNonzero = sound -> nx + (long) floor (numberOfInitialZeroes [isound]);
 			if (newNumberOfSamplesThroughLastNonzero > sharedNumberOfSamples) sharedNumberOfSamples = newNumberOfSamplesThroughLastNonzero;
 		}
 		double sharedTimeOfFirstSample = sumOfFirstTimes / my size;   // this is an approximation
@@ -225,7 +225,7 @@ Sound Sounds_combineToStereo (Collection me) {
 		long channelNumber = 0;
 		for (long isound = 1; isound <= my size; isound ++) {
 			Sound sound = (Sound) my item [isound];
-			long offset = numberOfInitialZeroes [isound];
+			long offset = (long) floor (numberOfInitialZeroes [isound]);
 			for (long ichan = 1; ichan <= sound -> ny; ichan ++) {
 				channelNumber ++;
 				for (long isamp = 1; isamp <= sound -> nx; isamp ++) {
@@ -235,21 +235,21 @@ Sound Sounds_combineToStereo (Collection me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sounds not combined to stereo.");
+		Melder_throw (U"Sounds not combined to stereo.");
 	}
 }
 
 Sound Sound_extractChannel (Sound me, long ichan) {
 	try {
 		if (ichan <= 0 || ichan > my ny)
-			Melder_throw ("There is no channel ", ichan, ".");
+			Melder_throw (U"There is no channel ", ichan, U".");
 		autoSound thee = Sound_create (1, my xmin, my xmax, my nx, my dx, my x1);
 		for (long isamp = 1; isamp <= my nx; isamp ++) {
 			thy z [1] [isamp] = my z [ichan] [isamp];
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": channel ", ichan, " not extracted.");
+		Melder_throw (me, U": channel ", ichan, U" not extracted.");
 	}
 }
 
@@ -314,7 +314,7 @@ Sound Matrix_to_Sound_mono (Matrix me, long row) {
 		NUMvector_copyElements (my z [row], thy z [1], 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
@@ -324,7 +324,7 @@ Sound Matrix_to_Sound (Matrix me) {
 		my structMatrix :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
@@ -334,7 +334,7 @@ Matrix Sound_to_Matrix (Sound me) {
 		my structMatrix :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
@@ -343,9 +343,9 @@ Sound Sound_upsample (Sound me) {
 		long nfft = 1;
 		while (nfft < my nx + 2000) nfft *= 2;
 		autoSound thee = Sound_create (my ny, my xmin, my xmax, my nx * 2, my dx / 2, my x1 - my dx / 4);
-		autoNUMvector <double> data (1, 2 * nfft);
 		for (long channel = 1; channel <= my ny; channel ++) {
-			NUMvector_copyElements (my z [channel], & data [1000], 1, my nx);
+			autoNUMvector<double> data (1, 2 * nfft);   // zeroing is important...
+			NUMvector_copyElements (my z [channel], & data [1000], 1, my nx);   // ...because this fills only part of the sound
 			NUMrealft (data.peek(), nfft, 1);
 			long imin = (long) (nfft * 0.95);
 			for (long i = imin + 1; i <= nfft; i ++) {
@@ -360,7 +360,7 @@ Sound Sound_upsample (Sound me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not upsampled.");
+		Melder_throw (me, U": not upsampled.");
 	}
 }
 
@@ -369,23 +369,23 @@ Sound Sound_resample (Sound me, double samplingFrequency, long precision) {
 	if (fabs (upfactor - 2) < 1e-6) return Sound_upsample (me);
 	if (fabs (upfactor - 1) < 1e-6) return Data_copy (me);
 	try {
-		long numberOfSamples = floor ((my xmax - my xmin) * samplingFrequency + 0.5);
+		long numberOfSamples = lround ((my xmax - my xmin) * samplingFrequency);
 		if (numberOfSamples < 1)
-			Melder_throw ("The resampled Sound would have no samples.");
-		autoSound filtered = NULL;
-		if (upfactor < 1.0) {   /* Need anti-aliasing filter? */
+			Melder_throw (U"The resampled Sound would have no samples.");
+		autoSound filtered;
+		if (upfactor < 1.0) {   // need anti-aliasing filter?
 			long nfft = 1, antiTurnAround = 1000;
 			while (nfft < my nx + antiTurnAround * 2) nfft *= 2;
-			autoNUMvector <double> data (1, nfft);
-			filtered.reset (Sound_create (my ny, my xmin, my xmax, my nx, my dx, my x1));
+			autoNUMvector<double> data (1, nfft);
+			filtered = Sound_create (my ny, my xmin, my xmax, my nx, my dx, my x1);
 			for (long channel = 1; channel <= my ny; channel ++) {
 				for (long i = 1; i <= nfft; i ++) {
-					data [i] = 0;
+					data [i] = 0.0;
 				}
 				NUMvector_copyElements (my z [channel], & data [antiTurnAround], 1, my nx);
 				NUMrealft (data.peek(), nfft, 1);   // go to the frequency domain
-				for (long i = floor (upfactor * nfft); i <= nfft; i ++) {
-					data [i] = 0;   /* Filter away high frequencies. */
+				for (long i = (long) floor (upfactor * nfft); i <= nfft; i ++) {
+					data [i] = 0.0;   // filter away high frequencies
 				}
 				data [2] = 0.0;
 				NUMrealft (data.peek(), nfft, -1);   // return to the time domain
@@ -406,7 +406,7 @@ Sound Sound_resample (Sound me, double samplingFrequency, long precision) {
 				for (long i = 1; i <= numberOfSamples; i ++) {
 					double x = Sampled_indexToX (thee.peek(), i);
 					double index = Sampled_xToIndex (me, x);
-					long leftSample = floor (index);
+					long leftSample = (long) floor (index);
 					double fraction = index - leftSample;
 					to [i] = leftSample < 1 || leftSample >= my nx ? 0.0 :
 						(1 - fraction) * from [leftSample] + fraction * from [leftSample + 1];
@@ -421,25 +421,25 @@ Sound Sound_resample (Sound me, double samplingFrequency, long precision) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not resampled.");
+		Melder_throw (me, U": not resampled.");
 	}
 }
 
 Sound Sounds_append (Sound me, double silenceDuration, Sound thee) {
 	try {
-		long nx_silence = floor (silenceDuration / my dx + 0.5), nx = my nx + nx_silence + thy nx;
+		long nx_silence = lround (silenceDuration / my dx), nx = my nx + nx_silence + thy nx;
 		if (my ny != thy ny)
-			Melder_throw ("The numbers of channels are not equal (e.g. one is mono, the other stereo).");
+			Melder_throw (U"The numbers of channels are not equal (e.g. one is mono, the other stereo).");
 		if (my dx != thy dx)
-			Melder_throw ("The sampling frequencies are not equal.");
-		autoSound him = Sound_create (my ny, 0, nx * my dx, nx, my dx, 0.5 * my dx);
+			Melder_throw (U"The sampling frequencies are not equal.");
+		autoSound him = Sound_create (my ny, 0.0, nx * my dx, nx, my dx, 0.5 * my dx);
 		for (long channel = 1; channel <= my ny; channel ++) {
 			NUMvector_copyElements (my z [channel], his z [channel], 1, my nx);
 			NUMvector_copyElements (thy z [channel], his z [channel] + my nx + nx_silence, 1, thy nx);
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": not appended.");
+		Melder_throw (me, U" & ", thee, U": not appended.");
 	}
 }
 
@@ -452,17 +452,17 @@ Sound Sounds_concatenate_e (Collection me, double overlapTime) {
 			if (numberOfChannels == 0) {
 				numberOfChannels = sound -> ny;
 			} else if (sound -> ny != numberOfChannels) {
-				Melder_throw ("To concatenate sounds, their numbers of channels (mono, stereo) must be equal.");
+				Melder_throw (U"To concatenate sounds, their numbers of channels (mono, stereo) must be equal.");
 			}
 			if (dx == 0.0) {
 				dx = sound -> dx;
 			} else if (sound -> dx != dx) {
-				Melder_throw ("To concatenate sounds, their sampling frequencies must be equal.\n"
-						"You could resample one or more of the sounds before concatenating.");
+				Melder_throw (U"To concatenate sounds, their sampling frequencies must be equal.\n"
+						U"You could resample one or more of the sounds before concatenating.");
 			}
 			nx += sound -> nx;
 		}
-		numberOfSmoothingSamples = round (overlapTime / dx);
+		numberOfSmoothingSamples = lround (overlapTime / dx);
 		autoSound thee = Sound_create (numberOfChannels, 0.0, nx * dx, nx, dx, 0.5 * dx);
 		autoNUMvector <double> smoother;
 		if (numberOfSmoothingSamples > 0) {
@@ -476,7 +476,7 @@ Sound Sounds_concatenate_e (Collection me, double overlapTime) {
 		for (long i = 1; i <= my size; i ++) {
 			Sound sound = (Sound) my item [i];
 			if (numberOfSmoothingSamples > 2 * sound -> nx)
-				Melder_throw ("At least one of the sounds is shorter than twice the overlap time.\nChoose a shorter overlap time.");
+				Melder_throw (U"At least one of the sounds is shorter than twice the overlap time.\nChoose a shorter overlap time.");
 			bool thisIsTheFirstSound = ( i == 1 );
 			bool thisIsTheLastSound = ( i == my size );
 			bool weNeedSmoothingAtTheStartOfThisSound = ! thisIsTheFirstSound;
@@ -506,16 +506,16 @@ Sound Sounds_concatenate_e (Collection me, double overlapTime) {
 		thy xmax = thy nx * dx;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sounds not concatenated.");
+		Melder_throw (U"Sounds not concatenated.");
 	}
 }
 
 Sound Sounds_convolve (Sound me, Sound thee, enum kSounds_convolve_scaling scaling, enum kSounds_convolve_signalOutsideTimeDomain signalOutsideTimeDomain) {
 	try {
 		if (my ny > 1 && thy ny > 1 && my ny != thy ny)
-			Melder_throw ("The numbers of channels of the two sounds have to be equal or 1.");
+			Melder_throw (U"The numbers of channels of the two sounds have to be equal or 1.");
 		if (my dx != thy dx)
-			Melder_throw ("The sampling frequencies of the two sounds have to be equal.");
+			Melder_throw (U"The sampling frequencies of the two sounds have to be equal.");
 		long n1 = my nx, n2 = thy nx;
 		long n3 = n1 + n2 - 1, nfft = 1;
 		while (nfft < n3) nfft *= 2;
@@ -563,7 +563,7 @@ Sound Sounds_convolve (Sound me, Sound thee, enum kSounds_convolve_scaling scali
 			//case kSounds_convolve_signalOutsideTimeDomain_PERIODIC: {
 				// do nothing
 			//} break;
-			default: Melder_fatal ("Sounds_convolve: unimplemented outside-time-domain strategy %d", signalOutsideTimeDomain);
+			default: Melder_fatal (U"Sounds_convolve: unimplemented outside-time-domain strategy ", signalOutsideTimeDomain);
 		}
 		switch (scaling) {
 			case kSounds_convolve_scaling_INTEGRAL: {
@@ -581,20 +581,20 @@ Sound Sounds_convolve (Sound me, Sound thee, enum kSounds_convolve_scaling scali
 			case kSounds_convolve_scaling_PEAK_099: {
 				Vector_scale (him.peek(), 0.99);
 			} break;
-			default: Melder_fatal ("Sounds_convolve: unimplemented scaling %d", scaling);
+			default: Melder_fatal (U"Sounds_convolve: unimplemented scaling ", scaling);
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": not convolved.");
+		Melder_throw (me, U" & ", thee, U": not convolved.");
 	}
 }
 
 Sound Sounds_crossCorrelate (Sound me, Sound thee, enum kSounds_convolve_scaling scaling, enum kSounds_convolve_signalOutsideTimeDomain signalOutsideTimeDomain) {
 	try {
 		if (my ny > 1 && thy ny > 1 && my ny != thy ny)
-			Melder_throw ("The numbers of channels of the two sounds have to be equal or 1.");
+			Melder_throw (U"The numbers of channels of the two sounds have to be equal or 1.");
 		if (my dx != thy dx)
-			Melder_throw ("The sampling frequencies of the two sounds have to be equal.");
+			Melder_throw (U"The sampling frequencies of the two sounds have to be equal.");
 		long numberOfChannels = my ny > thy ny ? my ny : thy ny;
 		long n1 = my nx, n2 = thy nx;
 		long n3 = n1 + n2 - 1, nfft = 1;
@@ -646,7 +646,7 @@ Sound Sounds_crossCorrelate (Sound me, Sound thee, enum kSounds_convolve_scaling
 			//case kSounds_convolve_signalOutsideTimeDomain_PERIODIC: {
 				// do nothing
 			//} break;
-			default: Melder_fatal ("Sounds_crossCorrelate: unimplemented outside-time-domain strategy %d", signalOutsideTimeDomain);
+			default: Melder_fatal (U"Sounds_crossCorrelate: unimplemented outside-time-domain strategy ", signalOutsideTimeDomain);
 		}
 		switch (scaling) {
 			case kSounds_convolve_scaling_INTEGRAL: {
@@ -664,11 +664,11 @@ Sound Sounds_crossCorrelate (Sound me, Sound thee, enum kSounds_convolve_scaling
 			case kSounds_convolve_scaling_PEAK_099: {
 				Vector_scale (him.peek(), 0.99);
 			} break;
-			default: Melder_fatal ("Sounds_crossCorrelate: unimplemented scaling %d", scaling);
+			default: Melder_fatal (U"Sounds_crossCorrelate: unimplemented scaling ", scaling);
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": not cross-correlated.");
+		Melder_throw (me, U" & ", thee, U": not cross-correlated.");
 	}
 }
 
@@ -717,7 +717,7 @@ Sound Sound_autoCorrelate (Sound me, enum kSounds_convolve_scaling scaling, enum
 			//case kSounds_convolve_signalOutsideTimeDomain_PERIODIC: {
 				// do nothing
 			//} break;
-			default: Melder_fatal ("Sounds_autoCorrelate: unimplemented outside-time-domain strategy %d", signalOutsideTimeDomain);
+			default: Melder_fatal (U"Sounds_autoCorrelate: unimplemented outside-time-domain strategy ", signalOutsideTimeDomain);
 		}
 		switch (scaling) {
 			case kSounds_convolve_scaling_INTEGRAL: {
@@ -735,16 +735,16 @@ Sound Sound_autoCorrelate (Sound me, enum kSounds_convolve_scaling scaling, enum
 			case kSounds_convolve_scaling_PEAK_099: {
 				Vector_scale (thee.peek(), 0.99);
 			} break;
-			default: Melder_fatal ("Sounds_autoCorrelate: unimplemented scaling %d", scaling);
+			default: Melder_fatal (U"Sounds_autoCorrelate: unimplemented scaling ", scaling);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": autocorrelation not computed.");
+		Melder_throw (me, U": autocorrelation not computed.");
 	}
 }
 
 void Sound_draw (Sound me, Graphics g,
-	double tmin, double tmax, double minimum, double maximum, bool garnish, const wchar_t *method)
+	double tmin, double tmax, double minimum, double maximum, bool garnish, const char32 *method)
 {
 	long ixmin, ixmax;
 	bool treversed = tmin > tmax;
@@ -778,7 +778,7 @@ void Sound_draw (Sound me, Graphics g,
 		Graphics_setWindow (g, treversed ? tmax : tmin, treversed ? tmin : tmax,
 			minimum - (my ny - channel) * (maximum - minimum),
 			maximum + (channel - 1) * (maximum - minimum));
-		if (wcsstr (method, L"bars") || wcsstr (method, L"Bars")) {
+		if (str32str (method, U"bars") || str32str (method, U"Bars")) {
 			for (long ix = ixmin; ix <= ixmax; ix ++) {
 				double x = Sampled_indexToX (me, ix);
 				double y = my z [channel] [ix];
@@ -790,12 +790,12 @@ void Sound_draw (Sound me, Graphics g,
 				Graphics_line (g, left, y, left, minimum);
 				Graphics_line (g, right, y, right, minimum);
 			}
-		} else if (wcsstr (method, L"poles") || wcsstr (method, L"Poles")) {
+		} else if (str32str (method, U"poles") || str32str (method, U"Poles")) {
 			for (long ix = ixmin; ix <= ixmax; ix ++) {
 				double x = Sampled_indexToX (me, ix);
 				Graphics_line (g, x, 0, x, my z [channel] [ix]);
 			}
-		} else if (wcsstr (method, L"speckles") || wcsstr (method, L"Speckles")) {
+		} else if (str32str (method, U"speckles") || str32str (method, U"Speckles")) {
 			for (long ix = ixmin; ix <= ixmax; ix ++) {
 				double x = Sampled_indexToX (me, ix);
 				Graphics_speckle (g, x, my z [channel] [ix]);
@@ -813,20 +813,20 @@ void Sound_draw (Sound me, Graphics g,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
 		Graphics_setWindow (g, tmin, tmax, minimum - (my ny - 1) * (maximum - minimum), maximum);
-		Graphics_markLeft (g, minimum, 1, 1, 0, NULL);
-		Graphics_markLeft (g, maximum, 1, 1, 0, NULL);
+		Graphics_markLeft (g, minimum, true, true, false, nullptr);
+		Graphics_markLeft (g, maximum, true, true, false, nullptr);
 		if (minimum != 0.0 && maximum != 0.0 && (minimum > 0.0) != (maximum > 0.0)) {
-			Graphics_markLeft (g, 0.0, 1, 1, 1, NULL);
+			Graphics_markLeft (g, 0.0, true, true, true, nullptr);
 		}
 		if (my ny == 2) {
 			Graphics_setWindow (g, treversed ? tmax : tmin, treversed ? tmin : tmax, minimum, maximum + (my ny - 1) * (maximum - minimum));
-			Graphics_markRight (g, minimum, 1, 1, 0, NULL);
-			Graphics_markRight (g, maximum, 1, 1, 0, NULL);
+			Graphics_markRight (g, minimum, true, true, false, nullptr);
+			Graphics_markRight (g, maximum, true, true, false, nullptr);
 			if (minimum != 0.0 && maximum != 0.0 && (minimum > 0.0) != (maximum > 0.0)) {
-				Graphics_markRight (g, 0.0, 1, 1, 1, NULL);
+				Graphics_markRight (g, 0.0, true, true, true, nullptr);
 			}
 		}
 	}
@@ -838,7 +838,7 @@ static double interpolate (Sound me, long i1, long channel)
 	long i2 = i1 + 1;
 	double x1 = Sampled_indexToX (me, i1), x2 = Sampled_indexToX (me, i2);
 	double y1 = my z [channel] [i1], y2 = my z [channel] [i2];
-	return x1 + (x2 - x1) * y1 / (y1 - y2);   /* Linear. */
+	return x1 + (x2 - x1) * y1 / (y1 - y2);   // linear
 }
 double Sound_getNearestZeroCrossing (Sound me, double position, long channel) {
 	double *amplitude = my z [channel];
@@ -898,9 +898,9 @@ Sound Sound_createAsPureTone (long numberOfChannels, double startingTime, double
 	try {
 		double numberOfSamples_f = round ((endTime - startingTime) * sampleRate);
 		if (numberOfSamples_f > (double) INT32_MAX)
-			Melder_throw ("Cannot create sounds with more than ", Melder_bigInteger (INT32_MAX), " samples, because they cannot be saved to disk.");
+			Melder_throw (U"Cannot create sounds with more than ", Melder_bigInteger (INT32_MAX), U" samples, because they cannot be saved to disk.");
 		autoSound me = Sound_create (numberOfChannels, startingTime, endTime, (long) numberOfSamples_f,
-			1 / sampleRate, startingTime + 0.5 / sampleRate);
+			1.0 / sampleRate, startingTime + 0.5 / sampleRate);
 		for (long isamp = 1; isamp <= my nx; isamp ++) {
 			double time = my x1 + (isamp - 1) * my dx;
 			double value = amplitude * sin (NUM2pi * frequency * time);
@@ -916,7 +916,7 @@ Sound Sound_createAsPureTone (long numberOfChannels, double startingTime, double
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from tone complex.");
+		Melder_throw (U"Sound not created from tone complex.");
 	}
 }
 
@@ -925,7 +925,7 @@ Sound Sound_createFromToneComplex (double startingTime, double endTime, double s
 {
 	try {
 		if (frequencyStep == 0.0)
-			Melder_throw ("Frequency step must not be zero.");
+			Melder_throw (U"Frequency step must not be zero.");
 		/*
 		 * Translate default firstFrequency.
 		 */
@@ -939,17 +939,17 @@ Sound Sound_createFromToneComplex (double startingTime, double endTime, double s
 		/*
 		 * Translate number of components.
 		 */
-		long maximumNumberOfComponents = floor ((ceiling - firstFrequency) / frequencyStep) + 1;
+		long maximumNumberOfComponents = (long) floor ((ceiling - firstFrequency) / frequencyStep) + 1;
 		if (numberOfComponents <= 0 || numberOfComponents > maximumNumberOfComponents)
 			numberOfComponents = maximumNumberOfComponents;
 		if (numberOfComponents < 1)
-			Melder_throw ("Zero sine waves.");
+			Melder_throw (U"Zero sine waves.");
 		/*
 		 * Generate the Sound.
 		 */
 		double factor = 0.99 / numberOfComponents;
-		autoSound me = Sound_create (1, startingTime, endTime, floor ((endTime - startingTime) * sampleRate + 0.5),
-			1 / sampleRate, startingTime + 0.5 / sampleRate);
+		autoSound me = Sound_create (1, startingTime, endTime, lround ((endTime - startingTime) * sampleRate),
+			1.0 / sampleRate, startingTime + 0.5 / sampleRate);
 		double *amplitude = my z [1];
 		for (long isamp = 1; isamp <= my nx; isamp ++) {
 			double value = 0.0, t = Sampled_indexToX (me.peek(), isamp);
@@ -964,7 +964,7 @@ Sound Sound_createFromToneComplex (double startingTime, double endTime, double s
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not created from tone complex.");
+		Melder_throw (U"Sound not created from tone complex.");
 	}
 }
 
@@ -1079,7 +1079,7 @@ Sound Sound_extractPart (Sound me, double t1, double t2, enum kSound_windowShape
 		 */
 		long ix1 = 1 + (long) ceil ((t1 - my x1) / my dx);
 		long ix2 = 1 + (long) floor ((t2 - my x1) / my dx);
-		if (ix2 < ix1) Melder_throw ("Extracted Sound would contain no samples.");
+		if (ix2 < ix1) Melder_throw (U"Extracted Sound would contain no samples.");
 		/*
 		 * Create sound, optionally shifted to [0..t2-t1].
 		 */
@@ -1099,7 +1099,7 @@ Sound Sound_extractPart (Sound me, double t1, double t2, enum kSound_windowShape
 		Sound_multiplyByWindow (thee.peek(), windowShape);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": part not extracted.");
+		Melder_throw (me, U": part not extracted.");
 	}
 }
 
@@ -1118,7 +1118,7 @@ Sound Sound_extractPartForOverlap (Sound me, double t1, double t2, double overla
 		 */
 		long ix1 = 1 + (long) ceil ((t1 - my x1) / my dx);
 		long ix2 = 1 + (long) floor ((t2 - my x1) / my dx);
-		if (ix2 < ix1) Melder_throw ("Extracted Sound would contain no samples.");
+		if (ix2 < ix1) Melder_throw (U"Extracted Sound would contain no samples.");
 		/*
 		 * Create sound.
 		 */
@@ -1136,7 +1136,7 @@ Sound Sound_extractPartForOverlap (Sound me, double t1, double t2, double overla
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": part not extracted.");
+		Melder_throw (me, U": part not extracted.");
 	}
 }
 
@@ -1149,7 +1149,7 @@ void Sound_filterWithFormants (Sound me, double tmin, double tmax,
 			long itmin, itmax;
 			long n = Sampled_getWindowSamples (me, tmin, tmax, & itmin, & itmax);
 			if (n <= 2)
-				Melder_throw ("Sound too short.");
+				Melder_throw (U"Sound too short.");
 			double *amplitude = my z [channel] + itmin - 1;   // base 1
 			NUMdeemphasize_f (amplitude, n, my dx, 50.0);
 			for (int iformant = 1; iformant <= numberOfFormants; iformant ++) {
@@ -1158,7 +1158,7 @@ void Sound_filterWithFormants (Sound me, double tmin, double tmax,
 		}
 		Matrix_scaleAbsoluteExtremum (me, 0.99);
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered.");
+		Melder_throw (me, U": not filtered.");
 	}
 }
 
@@ -1168,7 +1168,7 @@ Sound Sound_filter_oneFormant (Sound me, double frequency, double bandwidth) {
 		Sound_filterWithOneFormantInline (thee.peek(), frequency, bandwidth);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered (one formant).");
+		Melder_throw (me, U": not filtered (one formant).");
 	}
 }
 
@@ -1186,7 +1186,7 @@ Sound Sound_filter_preemphasis (Sound me, double frequency) {
 		Matrix_scaleAbsoluteExtremum (thee.peek(), 0.99);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered (pre-emphasis).");
+		Melder_throw (me, U": not filtered (pre-emphasis).");
 	}
 }
 
@@ -1197,7 +1197,7 @@ Sound Sound_filter_deemphasis (Sound me, double frequency) {
 		Matrix_scaleAbsoluteExtremum (thee.peek(), 0.99);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered (de-emphasis).");
+		Melder_throw (me, U": not filtered (de-emphasis).");
 	}
 }
 
@@ -1218,17 +1218,17 @@ void Sound_reverse (Sound me, double tmin, double tmax) {
 Sound Sounds_crossCorrelate_short (Sound me, Sound thee, double tmin, double tmax, int normalize) {
 	try {
 		if (my dx != thy dx)
-			Melder_throw ("Sampling frequencies are not equal.");
+			Melder_throw (U"Sampling frequencies are not equal.");
 		if (my ny != thy ny)
-			Melder_throw ("Numbers of channels are not equal.");
+			Melder_throw (U"Numbers of channels are not equal.");
 		double dt = my dx;
 		double dphase = (thy x1 - my x1) / dt;
-		dphase -= floor (dphase);   /* A number between 0 and 1. */
-		long i1 = ceil (tmin / dt - dphase);   /* Index of first sample if sample at dphase has index 0. */
-		long i2 = floor (tmax / dt - dphase);   /* Index of last sample if sample at dphase has index 0. */
+		dphase -= floor (dphase);   // a number between 0 and 1
+		long i1 = (long) ceil (tmin / dt - dphase);   // index of first sample if sample at dphase has index 0
+		long i2 = (long) floor (tmax / dt - dphase);   // index of last sample if sample at dphase has index 0
 		long nt = i2 - i1 + 1;
 		if (nt < 1)
-			Melder_throw ("Window too small.");
+			Melder_throw (U"Window too small.");
 		double t1 = (dphase + i1) * dt;
 		autoSound him = Sound_create (1, tmin, tmax, nt, dt, t1);
 		for (long i = 1; i <= nt; i ++) {
@@ -1267,7 +1267,7 @@ Sound Sounds_crossCorrelate_short (Sound me, Sound thee, double tmin, double tma
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not cross-correlated.");
+		Melder_throw (me, U": not cross-correlated.");
 	}
 }
 
diff --git a/fon/Sound.h b/fon/Sound.h
index 5e59677..809efee 100644
--- a/fon/Sound.h
+++ b/fon/Sound.h
@@ -2,7 +2,7 @@
 #define _Sound_h_
 /* Sound.h
  *
- * Copyright (C) 1992-2011,2012,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,11 +27,18 @@
 #include "Sound_enums.h"
 
 Thing_define (Sound, Vector) {
-	// overridden methods:
-		virtual void v_info ();
-		virtual bool v_hasGetMatrix    () { return true; }   virtual double v_getMatrix (long irow, long icol);
-		virtual bool v_hasGetFunction2 () { return true; }   virtual double v_getFunction2 (double x, double y);
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
+	void v_info ()
+		override;
+	bool v_hasGetMatrix ()
+		override { return true; }
+	double v_getMatrix (long irow, long icol)
+		override;
+	bool v_hasGetFunction2 ()
+		override { return true; }
+	double v_getFunction2 (double x, double y)
+		override;
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
 };
 
 /* Attributes:
@@ -48,10 +55,10 @@ Thing_define (Sound, Vector) {
 	z may be replaced (e.g., in pasting).
 */
 
-Sound Sound_create (long numberOfChannels, double xmin, double xmax, long nx, double dx, double x1);
+autoSound Sound_create (long numberOfChannels, double xmin, double xmax, long nx, double dx, double x1);
 /*
 	Function:
-		return a new silent Sound, or NULL if out of memory.
+		return a new silent Sound.
 	Preconditions:
 		xmax > xmin;
 		nx >= 1;
@@ -70,10 +77,10 @@ Sound Sound_create (long numberOfChannels, double xmin, double xmax, long nx, do
 		thy z [i] [1..nx] == 0.0;
 */
 
-Sound Sound_createSimple (long numberOfChannels, double duration, double samplingFrequency);
+autoSound Sound_createSimple (long numberOfChannels, double duration, double samplingFrequency);
 /*
 	Function:
-		return a new silent Sound, or NULL if out of memory.
+		return a new silent Sound.
 	Preconditions:
 		duration > 0.0;
 		samplingFrequency > 0.0;
@@ -183,14 +190,13 @@ Sound Sound_filter_deemphasis (Sound me, double frequency);
 void Sound_reverse (Sound me, double tmin, double tmax);
 
 void Sound_draw (Sound me, Graphics g,
-	double tmin, double tmax, double minimum, double maximum, bool garnish, const wchar_t *method);
+	double tmin, double tmax, double minimum, double maximum, bool garnish, const char32 *method);
 /* For method, see Vector_draw. */
 
 Matrix Sound_to_Matrix (Sound me);
 /*
 	Create a Matrix from a Sound,
 	with deep copy of all its Matrix attributes, except class information and methods.
-	Return NULL if out of memory.  
 */
 
 Sound Matrix_to_Sound (Matrix me);
@@ -202,7 +208,6 @@ Sound Matrix_to_Sound_mono (Matrix me, long row);
 		"row" is forced inside the segment [1, my ny];
 		negative values count from the last row;
 		e.g., if "row" is -1, the last row is taken.
-		Return NULL if out of memory.
 	Postconditions:
 		thy xmin == my xmin;
 		thy xmax == my xmax;
@@ -279,7 +284,7 @@ void Sound_playPart (Sound me, double tmin, double tmax,
  *       } else {
  *          undrawPlayCursor (me, t);
  *          moveCursor (me, t);
- *          if (t < tmax) { Melder_casual ("Sound play interrupted."); }
+ *          if (t < tmax) { Melder_casual (U"Sound play interrupted."); }
  *       }
  *       return 1;
  *    }
diff --git a/fon/SoundEditor.cpp b/fon/SoundEditor.cpp
index 86265c6..67ee2f8 100644
--- a/fon/SoundEditor.cpp
+++ b/fon/SoundEditor.cpp
@@ -1,6 +1,6 @@
 /* SoundEditor.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma, 2007 Erez Volk (FLAC support)
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma, 2007 Erez Volk (FLAC support)
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -43,15 +43,15 @@ static void menu_cb_Copy (EDITOR_ARGS) {
 		/*
 		 * Create without change.
 		 */
-		autoSound publish = my d_longSound.data ? LongSound_extractPart ((LongSound) my data, my d_startSelection, my d_endSelection, FALSE) :
-			Sound_extractPart ((Sound) my data, my d_startSelection, my d_endSelection, kSound_windowShape_RECTANGULAR, 1.0, FALSE);
+		autoSound publish = my d_longSound.data ? LongSound_extractPart ((LongSound) my data, my d_startSelection, my d_endSelection, false) :
+			Sound_extractPart ((Sound) my data, my d_startSelection, my d_endSelection, kSound_windowShape_RECTANGULAR, 1.0, false);
 		/*
 		 * Change without error.
 		 */
 		forget (Sound_clipboard);
 		Sound_clipboard = publish.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound selection not copied to clipboard.");
+		Melder_throw (U"Sound selection not copied to clipboard.");
 	}
 }
 
@@ -64,9 +64,9 @@ static void menu_cb_Cut (EDITOR_ARGS) {
 		long oldNumberOfSamples = sound -> nx;
 		long newNumberOfSamples = oldNumberOfSamples - selectionNumberOfSamples;
 		if (newNumberOfSamples < 1)
-			Melder_throw ("You cannot cut all of the signal away,\n"
-				"because you cannot create a Sound with 0 samples.\n"
-				"You could consider using Copy instead.");
+			Melder_throw (U"You cannot cut all of the signal away,\n"
+				U"because you cannot create a Sound with 0 samples.\n"
+				U"You could consider using Copy instead.");
 		if (selectionNumberOfSamples) {
 			double **oldData = sound -> z;
 			/*
@@ -90,7 +90,7 @@ static void menu_cb_Cut (EDITOR_ARGS) {
 					newData [channel] [++ j] = oldData [channel] [i];
 				}
 			}
-			Editor_save (me, L"Cut");
+			Editor_save (me, U"Cut");
 			/*
 			 * Change without error.
 			 */
@@ -148,12 +148,12 @@ static void menu_cb_Cut (EDITOR_ARGS) {
 			my v_destroy_analysis ();
 			FunctionEditor_ungroup (me);
 			FunctionEditor_marksChanged (me, false);
-			my broadcastDataChanged ();
+			Editor_broadcastDataChanged (me);
 		} else {
-			Melder_warning (L"No samples selected.");
+			Melder_warning (U"No samples selected.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Sound selection not cut to clipboard.");
+		Melder_throw (U"Sound selection not cut to clipboard.");
 	}
 }
 
@@ -164,17 +164,17 @@ static void menu_cb_Paste (EDITOR_ARGS) {
 	long oldNumberOfSamples = sound -> nx, newNumberOfSamples;
 	double **oldData = sound -> z;
 	if (! Sound_clipboard) {
-		Melder_warning (L"Clipboard is empty; nothing pasted.");
+		Melder_warning (U"Clipboard is empty; nothing pasted.");
 		return;
 	}
 	if (Sound_clipboard -> ny != sound -> ny)
-		Melder_throw ("Cannot paste, because\n"
-			"the number of channels of the clipboard is not equal to\n"
-			"the number of channels of the edited sound.");
+		Melder_throw (U"Cannot paste, because\n"
+			U"the number of channels of the clipboard is not equal to\n"
+			U"the number of channels of the edited sound.");
 	if (Sound_clipboard -> dx != sound -> dx)
-		Melder_throw ("Cannot paste, because\n"
-			"the sampling frequency of the clipboard is not equal to\n"
-			"the sampling frequency of the edited sound.");
+		Melder_throw (U"Cannot paste, because\n"
+			U"the sampling frequency of the clipboard is not equal to\n"
+			U"the sampling frequency of the edited sound.");
 	if (leftSample < 0) leftSample = 0;
 	if (leftSample > oldNumberOfSamples) leftSample = oldNumberOfSamples;
 	newNumberOfSamples = oldNumberOfSamples + Sound_clipboard -> nx;
@@ -194,7 +194,7 @@ static void menu_cb_Paste (EDITOR_ARGS) {
 			newData [channel] [++ j] = oldData [channel] [i];
 		}
 	}
-	Editor_save (me, L"Paste");
+	Editor_save (me, U"Paste");
 	/*
 	 * Change without error.
 	 */
@@ -218,7 +218,7 @@ static void menu_cb_Paste (EDITOR_ARGS) {
 	my v_destroy_analysis ();
 	FunctionEditor_ungroup (me);
 	FunctionEditor_marksChanged (me, false);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_SetSelectionToZero (EDITOR_ARGS) {
@@ -226,7 +226,7 @@ static void menu_cb_SetSelectionToZero (EDITOR_ARGS) {
 	Sound sound = (Sound) my data;
 	long first, last;
 	Sampled_getWindowSamples (sound, my d_startSelection, my d_endSelection, & first, & last);
-	Editor_save (me, L"Set to zero");
+	Editor_save (me, U"Set to zero");
 	for (long channel = 1; channel <= sound -> ny; channel ++) {
 		for (long i = first; i <= last; i ++) {
 			sound -> z [channel] [i] = 0.0;
@@ -234,16 +234,16 @@ static void menu_cb_SetSelectionToZero (EDITOR_ARGS) {
 	}
 	my v_destroy_analysis ();
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_ReverseSelection (EDITOR_ARGS) {
 	EDITOR_IAM (SoundEditor);
-	Editor_save (me, L"Reverse selection");
+	Editor_save (me, U"Reverse selection");
 	Sound_reverse ((Sound) my data, my d_startSelection, my d_endSelection);
 	my v_destroy_analysis ();
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 /***** SELECT MENU *****/
@@ -287,30 +287,30 @@ static void menu_cb_MoveEtoZero (EDITOR_ARGS) {
 
 /***** HELP MENU *****/
 
-static void menu_cb_SoundEditorHelp (EDITOR_ARGS) { EDITOR_IAM (SoundEditor); Melder_help (L"SoundEditor"); }
-static void menu_cb_LongSoundEditorHelp (EDITOR_ARGS) { EDITOR_IAM (SoundEditor); Melder_help (L"LongSoundEditor"); }
+static void menu_cb_SoundEditorHelp (EDITOR_ARGS) { EDITOR_IAM (SoundEditor); Melder_help (U"SoundEditor"); }
+static void menu_cb_LongSoundEditorHelp (EDITOR_ARGS) { EDITOR_IAM (SoundEditor); Melder_help (U"LongSoundEditor"); }
 
 void structSoundEditor :: v_createMenus () {
 	SoundEditor_Parent :: v_createMenus ();
 	Melder_assert (data != NULL);
 	Melder_assert (d_sound.data != NULL || d_longSound.data != NULL);
 
-	Editor_addCommand (this, L"Edit", L"-- cut copy paste --", 0, NULL);
-	if (d_sound.data) cutButton = Editor_addCommand (this, L"Edit", L"Cut", 'X', menu_cb_Cut);
-	copyButton = Editor_addCommand (this, L"Edit", L"Copy selection to Sound clipboard", 'C', menu_cb_Copy);
-	if (d_sound.data) pasteButton = Editor_addCommand (this, L"Edit", L"Paste after selection", 'V', menu_cb_Paste);
+	Editor_addCommand (this, U"Edit", U"-- cut copy paste --", 0, NULL);
+	if (d_sound.data) cutButton = Editor_addCommand (this, U"Edit", U"Cut", 'X', menu_cb_Cut);
+	copyButton = Editor_addCommand (this, U"Edit", U"Copy selection to Sound clipboard", 'C', menu_cb_Copy);
+	if (d_sound.data) pasteButton = Editor_addCommand (this, U"Edit", U"Paste after selection", 'V', menu_cb_Paste);
 	if (d_sound.data) {
-		Editor_addCommand (this, L"Edit", L"-- zero --", 0, NULL);
-		zeroButton = Editor_addCommand (this, L"Edit", L"Set selection to zero", 0, menu_cb_SetSelectionToZero);
-		reverseButton = Editor_addCommand (this, L"Edit", L"Reverse selection", 'R', menu_cb_ReverseSelection);
+		Editor_addCommand (this, U"Edit", U"-- zero --", 0, NULL);
+		zeroButton = Editor_addCommand (this, U"Edit", U"Set selection to zero", 0, menu_cb_SetSelectionToZero);
+		reverseButton = Editor_addCommand (this, U"Edit", U"Reverse selection", 'R', menu_cb_ReverseSelection);
 	}
 
 	if (d_sound.data) {
-		Editor_addCommand (this, L"Select", L"-- move to zero --", 0, 0);
-		Editor_addCommand (this, L"Select", L"Move start of selection to nearest zero crossing", ',', menu_cb_MoveBtoZero);
-		Editor_addCommand (this, L"Select", L"Move begin of selection to nearest zero crossing", Editor_HIDDEN, menu_cb_MoveBtoZero);
-		Editor_addCommand (this, L"Select", L"Move cursor to nearest zero crossing", '0', menu_cb_MoveCursorToZero);
-		Editor_addCommand (this, L"Select", L"Move end of selection to nearest zero crossing", '.', menu_cb_MoveEtoZero);
+		Editor_addCommand (this, U"Select", U"-- move to zero --", 0, 0);
+		Editor_addCommand (this, U"Select", U"Move start of selection to nearest zero crossing", ',', menu_cb_MoveBtoZero);
+		Editor_addCommand (this, U"Select", U"Move begin of selection to nearest zero crossing", Editor_HIDDEN, menu_cb_MoveBtoZero);
+		Editor_addCommand (this, U"Select", U"Move cursor to nearest zero crossing", '0', menu_cb_MoveCursorToZero);
+		Editor_addCommand (this, U"Select", U"Move end of selection to nearest zero crossing", '.', menu_cb_MoveEtoZero);
 	}
 
 	v_createMenus_analysis ();
@@ -318,8 +318,8 @@ void structSoundEditor :: v_createMenus () {
 
 void structSoundEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	SoundEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"SoundEditor help", '?', menu_cb_SoundEditorHelp);
-	EditorMenu_addCommand (menu, L"LongSoundEditor help", 0, menu_cb_LongSoundEditorHelp);
+	EditorMenu_addCommand (menu, U"SoundEditor help", '?', menu_cb_SoundEditorHelp);
+	EditorMenu_addCommand (menu, U"LongSoundEditor help", 0, menu_cb_LongSoundEditorHelp);
 }
 
 /********** UPDATE **********/
@@ -350,9 +350,9 @@ void structSoundEditor :: v_draw () {
 		Graphics_fillRectangle (d_graphics, 0, 1, 0, 1);
 		Graphics_setColour (d_graphics, Graphics_BLACK);
 		Graphics_setTextAlignment (d_graphics, Graphics_CENTRE, Graphics_BOTTOM);
-		Graphics_text3 (d_graphics, 0.5, 0.5, L"(window longer than ", Melder_float (Melder_single (d_longSound.data -> bufferLength)), L" seconds)");
+		Graphics_text (d_graphics, 0.5, 0.5,   U"(window longer than ", Melder_float (Melder_single (d_longSound.data -> bufferLength)), U" seconds)");
 		Graphics_setTextAlignment (d_graphics, Graphics_CENTRE, Graphics_TOP);
-		Graphics_text1 (d_graphics, 0.5, 0.5, L"(zoom in to see the samples)");
+		Graphics_text (d_graphics, 0.5, 0.5, U"(zoom in to see the samples)");
 		return;
 	}
 
@@ -396,10 +396,10 @@ void structSoundEditor :: v_draw () {
 	long selectedSamples = Sampled_getWindowSamples (data, d_startSelection, d_endSelection, & first, & last);
 	v_updateMenuItems_file ();
 	if (d_sound.data) {
-		cutButton     -> f_setSensitive (selectedSamples != 0 && selectedSamples < d_sound.data -> nx);
-		copyButton    -> f_setSensitive (selectedSamples != 0);
-		zeroButton    -> f_setSensitive (selectedSamples != 0);
-		reverseButton -> f_setSensitive (selectedSamples != 0);
+		GuiThing_setSensitive (cutButton     , selectedSamples != 0 && selectedSamples < d_sound.data -> nx);
+		GuiThing_setSensitive (copyButton    , selectedSamples != 0);
+		GuiThing_setSensitive (zeroButton    , selectedSamples != 0);
+		GuiThing_setSensitive (reverseButton , selectedSamples != 0);
 	}
 }
 
@@ -432,10 +432,10 @@ void structSoundEditor :: v_unhighlightSelection (double left, double right, dou
 		Graphics_unhighlight (d_graphics, left, right, bottom, top);
 }
 
-void SoundEditor_init (SoundEditor me, const wchar_t *title, Sampled data) {
+void SoundEditor_init (SoundEditor me, const char32 *title, Sampled data) {
 	/*
 	 * my longSound.data or my sound.data have to be set before we call FunctionEditor_init,
-	 * because createMenus expect that one of them is not NULL.
+	 * because createMenus expects that one of them is not NULL.
 	 */
 	TimeSoundAnalysisEditor_init (me, title, data, data, false);
 	if (my d_longSound.data && my d_endWindow - my d_startWindow > 30.0) {
@@ -446,14 +446,14 @@ void SoundEditor_init (SoundEditor me, const wchar_t *title, Sampled data) {
 	}
 }
 
-SoundEditor SoundEditor_create (const wchar_t *title, Sampled data) {
-	Melder_assert (data != NULL);
+autoSoundEditor SoundEditor_create (const char32 *title, Sampled data) {
+	Melder_assert (data);
 	try {
 		autoSoundEditor me = Thing_new (SoundEditor);
 		SoundEditor_init (me.peek(), title, data);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Sound window not created.");
+		Melder_throw (U"Sound window not created.");
 	}
 }
 
diff --git a/fon/SoundEditor.h b/fon/SoundEditor.h
index da7a9e7..8654ad6 100644
--- a/fon/SoundEditor.h
+++ b/fon/SoundEditor.h
@@ -2,7 +2,7 @@
 #define _SoundEditor_h_
 /* SoundEditor.h
  *
- * Copyright (C) 1992-2011,2012 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,27 +22,36 @@
 #include "TimeSoundAnalysisEditor.h"
 
 Thing_define (SoundEditor, TimeSoundAnalysisEditor) {
-	// new data:
-		private:
-			GuiMenuItem cutButton, copyButton, pasteButton, zeroButton, reverseButton;
-			double maxBuffer;
-	// overridden methods:
-		private:
-			virtual void v_createMenus ();
-			virtual void v_createHelpMenuItems (EditorMenu menu);
-			virtual void v_dataChanged ();
-			virtual void v_prepareDraw ();
-			virtual void v_draw ();
-			virtual void v_play (double tmin, double tmax);
-			virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
-			virtual void v_highlightSelection (double left, double right, double bottom, double top);
-			virtual void v_unhighlightSelection (double left, double right, double bottom, double top);
+	GuiMenuItem cutButton, copyButton, pasteButton, zeroButton, reverseButton;
+	double maxBuffer;
+
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_dataChanged ()
+		override;
+	void v_prepareDraw ()
+		override;
+	void v_draw ()
+		override;
+	void v_play (double tmin, double tmax)
+		override;
+	int v_click (double xWC, double yWC, bool shiftKeyPressed)
+		override;
+	void v_highlightSelection (double left, double right, double bottom, double top)
+		override;
+	void v_unhighlightSelection (double left, double right, double bottom, double top)
+		override;
 };
 
-void SoundEditor_init (SoundEditor me, const wchar_t *title, Sampled data);
+void SoundEditor_init (SoundEditor me,
+	const char32 *title,
+	Sampled data
+);
 
-SoundEditor SoundEditor_create (
-	const wchar_t *title,
+autoSoundEditor SoundEditor_create (
+	const char32 *title,
 	Sampled data   // either a Sound or a LongSound
 );
 
diff --git a/fon/SoundRecorder.cpp b/fon/SoundRecorder.cpp
index c45c341..b569cd8 100644
--- a/fon/SoundRecorder.cpp
+++ b/fon/SoundRecorder.cpp
@@ -1,6 +1,6 @@
 /* SoundRecorder.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -58,7 +58,7 @@ static struct {
 } preferences;
 
 void SoundRecorder_preferences () {
-	Preferences_addInt (L"SoundRecorder.bufferSizeInMegabytes", & preferences.bufferSizeInMegabytes, 60);
+	Preferences_addInt (U"SoundRecorder.bufferSizeInMegabytes", & preferences.bufferSizeInMegabytes, 60);
 }
 
 int SoundRecorder_getBufferSizePref_MB () { return preferences.bufferSizeInMegabytes; }
@@ -105,15 +105,15 @@ static void win_fillHeader (SoundRecorder me, int which) {
 	my waveHeader [which]. reserved = 0;
 }
 static void win_waveInCheck (SoundRecorder me) {
-	wchar_t messageText [MAXERRORLENGTH];
+	char32 messageText [MAXERRORLENGTH];
 	MMRESULT err;
 	if (my err == MMSYSERR_NOERROR) return;
-	err = waveInGetErrorText (my err, messageText, MAXERRORLENGTH);
+	err = waveInGetErrorText (my err, Melder_32toW (messageText), MAXERRORLENGTH);
 	if (err == MMSYSERR_NOERROR) Melder_throw (messageText);
-	else if (err == MMSYSERR_BADERRNUM) Melder_throw ("Error number ", my err, " out of range.");
-	else if (err == MMSYSERR_NODRIVER) Melder_throw ("No sound driver present.");
-	else if (err == MMSYSERR_NOMEM) Melder_throw ("Out of memory.");
-	else Melder_throw ("Unknown sound error.");
+	else if (err == MMSYSERR_BADERRNUM) Melder_throw (U"Error number ", my err, U" out of range.");
+	else if (err == MMSYSERR_NODRIVER) Melder_throw (U"No sound driver present.");
+	else if (err == MMSYSERR_NOMEM) Melder_throw (U"Out of memory.");
+	else Melder_throw (U"Unknown sound error.");
 }
 static void win_waveInOpen (SoundRecorder me) {
 	try {
@@ -121,7 +121,7 @@ static void win_waveInOpen (SoundRecorder me) {
 		win_waveInCheck (me);
 		if (Melder_debug != 8) waveInReset (my hWaveIn);
 	} catch (MelderError) {
-		Melder_throw ("Audio input not opened.");
+		Melder_throw (U"Audio input not opened.");
 	}
 }
 static void win_waveInPrepareHeader (SoundRecorder me, int which) {
@@ -129,7 +129,7 @@ static void win_waveInPrepareHeader (SoundRecorder me, int which) {
 		my err = waveInPrepareHeader (my hWaveIn, & my waveHeader [which], sizeof (WAVEHDR));
 		win_waveInCheck (me);
 	} catch (MelderError) {
-		Melder_throw ("Audio input: cannot prepare header.\nQuit some other programs or go to \"Sound input prefs\" in the Preferences menu.");
+		Melder_throw (U"Audio input: cannot prepare header.\nQuit some other programs or go to \"Sound input prefs\" in the Preferences menu.");
 	}
 }
 static void win_waveInAddBuffer (SoundRecorder me, int which) {
@@ -137,7 +137,7 @@ static void win_waveInAddBuffer (SoundRecorder me, int which) {
 		my err = waveInAddBuffer (my hWaveIn, & my waveHeader [which], sizeof (WAVEHDR));
 		win_waveInCheck (me);
 	} catch (MelderError) {
-		Melder_throw ("Audio input: cannot add buffer.");
+		Melder_throw (U"Audio input: cannot add buffer.");
 	}
 }
 static void win_waveInStart (SoundRecorder me) {
@@ -145,7 +145,7 @@ static void win_waveInStart (SoundRecorder me) {
 		my err = waveInStart (my hWaveIn);   // asynchronous
 		win_waveInCheck (me);
 	} catch (MelderError) {
-		Melder_throw ("Audio input not started.");
+		Melder_throw (U"Audio input not started.");
 	}
 }
 static void win_waveInStop (SoundRecorder me) {
@@ -153,7 +153,7 @@ static void win_waveInStop (SoundRecorder me) {
 		my err = waveInStop (my hWaveIn);
 		win_waveInCheck (me);
 	} catch (MelderError) {
-		Melder_throw ("Audio input not stopped.");
+		Melder_throw (U"Audio input not stopped.");
 	}
 }
 static void win_waveInReset (SoundRecorder me) {
@@ -161,7 +161,7 @@ static void win_waveInReset (SoundRecorder me) {
 		my err = waveInReset (my hWaveIn);
 		win_waveInCheck (me);
 	} catch (MelderError) {
-		Melder_throw ("Audio input not reset.");
+		Melder_throw (U"Audio input not reset.");
 	}
 }
 static void win_waveInUnprepareHeader (SoundRecorder me, int which) {
@@ -169,7 +169,7 @@ static void win_waveInUnprepareHeader (SoundRecorder me, int which) {
 		my err = waveInUnprepareHeader (my hWaveIn, & my waveHeader [which], sizeof (WAVEHDR));
 		win_waveInCheck (me);
 	} catch (MelderError) {
-		Melder_throw ("Audio input: cannot unprepare header.");
+		Melder_throw (U"Audio input: cannot unprepare header.");
 	}
 }
 static void win_waveInClose (SoundRecorder me) {
@@ -178,7 +178,7 @@ static void win_waveInClose (SoundRecorder me) {
 		my hWaveIn = 0;
 		win_waveInCheck (me);
 	} catch (MelderError) {
-		Melder_throw ("Audio input not closed.");
+		Melder_throw (U"Audio input not closed.");
 	}
 }
 #endif
@@ -218,7 +218,7 @@ static void stopRecording (SoundRecorder me) {
 			}
 		}
 	} catch (MelderError) {
-		Melder_flushError ("Cannot stop recording.");
+		Melder_flushError (U"Cannot stop recording.");
 	}
 	Graphics_setWindow (my graphics, 0.0, 1.0, 0.0, 1.0);
 	Graphics_setColour (my graphics, Graphics_WHITE);
@@ -290,7 +290,7 @@ static void showMeter (SoundRecorder me, short *buffer, long nsamp) {
 		#endif
 		Graphics_setTextAlignment (my graphics, Graphics_CENTRE, Graphics_HALF);
 		Graphics_setColour (my graphics, Graphics_BLACK);
-		Graphics_text (my graphics, 0.5, 0.5, L"Not recording.");
+		Graphics_text (my graphics, 0.5, 0.5, U"Not recording.");
 		return;
 	}
 	if (my p_meter_which == kSoundRecorder_meter_INTENSITY) {
@@ -308,14 +308,14 @@ static void showMeter (SoundRecorder me, short *buffer, long nsamp) {
 			}
 		}
 		if (my lastLeftMaximum > 30000) {
-			int leak = my lastLeftMaximum - 2000000 / theControlPanel. sampleRate;
+			int leak = my lastLeftMaximum - (int) floor (2000000 / theControlPanel. sampleRate);
 			if (leftMaximum < leak) leftMaximum = leak;
 		}
 		showMaximum (me, 1, leftMaximum);
 		my lastLeftMaximum = leftMaximum;
 		if (my numberOfChannels == 2) {
 			if (my lastRightMaximum > 30000) {
-				int leak = my lastRightMaximum - 2000000 / theControlPanel. sampleRate;
+				int leak = my lastRightMaximum - (int) floor (2000000 / theControlPanel. sampleRate);
 				if (rightMaximum < leak) rightMaximum = leak;
 			}
 			showMaximum (me, 2, rightMaximum);
@@ -335,7 +335,7 @@ static void showMeter (SoundRecorder me, short *buffer, long nsamp) {
 		double intensity = Sound_getIntensity_dB (sound.peek());
 		autoSpectrum spectrum = Sound_to_Spectrum (sound.peek(), true);
 		double centreOfGravity = Spectrum_getCentreOfGravity (spectrum.peek(), 1.0);
-		trace ("%ld samples, intensity %f dB, centre of gravity %f Hz", nsamp, intensity, centreOfGravity);
+		trace (nsamp, U" samples, intensity ", intensity, U" dB, centre of gravity ", centreOfGravity, U" Hz");
 		Graphics_setWindow (my graphics,
 			my p_meter_centreOfGravity_minimum, my p_meter_centreOfGravity_maximum,
 			my p_meter_intensity_minimum, my p_meter_intensity_maximum);
@@ -387,27 +387,27 @@ static bool workProc (void *void_me) {
 
 		/* Set the buttons according to the audio parameters. */
 
-		if (my recordButton) my recordButton -> f_setSensitive (! my recording);
-		if (my stopButton)   my stopButton   -> f_setSensitive (  my recording);
-		if (my playButton)   my playButton   -> f_setSensitive (! my recording && my nsamp > 0);
-		if (my applyButton)  my applyButton  -> f_setSensitive (! my recording && my nsamp > 0);
-		if (my okButton)     my okButton     -> f_setSensitive (! my recording && my nsamp > 0);
-		if (my monoButton   && my numberOfChannels == 1) my monoButton   -> f_set ();
-		if (my stereoButton && my numberOfChannels == 2) my stereoButton -> f_set ();
+		if (my recordButton) GuiThing_setSensitive (my recordButton, ! my recording);
+		if (my stopButton)   GuiThing_setSensitive (my stopButton,     my recording);
+		if (my playButton)   GuiThing_setSensitive (my playButton,   ! my recording && my nsamp > 0);
+		if (my applyButton)  GuiThing_setSensitive (my applyButton,  ! my recording && my nsamp > 0);
+		if (my okButton)     GuiThing_setSensitive (my okButton,     ! my recording && my nsamp > 0);
+		if (my monoButton   && my numberOfChannels == 1) GuiRadioButton_set (my monoButton);
+		if (my stereoButton && my numberOfChannels == 2) GuiRadioButton_set (my stereoButton);
 		for (long i = 1; i <= SoundRecorder_IFSAMP_MAX; i ++)
 			if (my fsamp_ [i]. button && theControlPanel. sampleRate == my fsamp_ [i]. fsamp)
-				my fsamp_ [i]. button -> f_set ();
+				GuiRadioButton_set (my fsamp_ [i]. button);
 		if (my device_ [theControlPanel. inputSource]. button)
-			my device_ [theControlPanel. inputSource]. button -> f_set ();
-		if (my monoButton)   my monoButton   -> f_setSensitive (! my recording);
-		if (my stereoButton) my stereoButton -> f_setSensitive (! my recording);
+			GuiRadioButton_set (my device_ [theControlPanel. inputSource]. button);
+		if (my monoButton)   GuiThing_setSensitive (my monoButton,   ! my recording);
+		if (my stereoButton) GuiThing_setSensitive (my stereoButton, ! my recording);
 		for (long i = 1; i <= SoundRecorder_IFSAMP_MAX; i ++)
 			if (my fsamp_ [i]. button) {
-				my fsamp_ [i]. button -> f_setSensitive (! my recording);
+				GuiThing_setSensitive (my fsamp_ [i]. button, ! my recording);
 			}
 		for (long i = 1; i <= SoundRecorder_IDEVICE_MAX; i ++)
 			if (my device_ [i]. button)
-				my device_ [i]. button -> f_setSensitive (! my recording);
+				GuiThing_setSensitive (my device_ [i]. button, ! my recording);
 
 		/*Graphics_setGrey (my graphics, 0.9);
 		Graphics_fillRectangle (my graphics, 0.0, 1.0, 0.0, 32768.0);
@@ -442,7 +442,7 @@ static bool workProc (void *void_me) {
 				if (my recording) {
 					my nsamp += stepje;
 					if (my nsamp > my nmax - step) my recording = false;
-					my progressScale -> f_setValue (1000.0 * ((double) my nsamp / (double) my nmax));
+					GuiScale_setValue (my progressScale, 1000.0 * ((double) my nsamp / (double) my nmax));
 				}
 			} while (my recording && tooManySamplesInBufferToReturnToGui (me));
 		} else {
@@ -474,13 +474,13 @@ static bool workProc (void *void_me) {
 				long firstSample = lastSample - 3000;
 				if (firstSample < 0) firstSample = 0;
 				showMeter (me, my buffer + firstSample * my numberOfChannels, lastSample - firstSample);
-				my progressScale -> f_setValue (1000.0 * ((double) lastSample / (double) my nmax));
+				GuiScale_setValue (my progressScale, 1000.0 * ((double) lastSample / (double) my nmax));
 			} else {
 				showMeter (me, NULL, 0);
 			}
 		}
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 	#if cocoa
 		return;
@@ -509,13 +509,14 @@ static int portaudioStreamCallback (
 	(void) output;
 	(void) timeInfo;
 	(void) statusFlags;
-	if (Melder_debug == 20) Melder_casual ("The PortAudio stream callback receives %ld frames.", frameCount);
+	if (Melder_debug == 20)
+		Melder_casual (U"The PortAudio stream callback receives ", frameCount, U" frames.");
 	Melder_assert (my nsamp <= my nmax);
 	unsigned long samplesLeft = my nmax - my nsamp;
 	if (samplesLeft > 0) {
 		unsigned long dsamples = samplesLeft > frameCount ? frameCount : samplesLeft;
-		if (Melder_debug == 20) Melder_casual ("play %ls %ls", Melder_integer (dsamples),
-			Melder_double (Pa_GetStreamCpuLoad (my portaudioStream)));
+		if (Melder_debug == 20)
+			Melder_casual (U"play ", dsamples, U" ", Pa_GetStreamCpuLoad (my portaudioStream));
 		memcpy (my buffer + my nsamp * my numberOfChannels, input, 2 * dsamples * my numberOfChannels);
 		my nsamp += dsamples;
 		if (my nsamp >= my nmax) return paComplete;
@@ -550,16 +551,19 @@ static void gui_button_cb_record (I, GuiButtonEvent event) {
 					macCoreStreamInfo. flags = paMacCoreChangeDeviceParameters | paMacCoreFailIfConversionRequired;
 					streamParameters. hostApiSpecificStreamInfo = & macCoreStreamInfo;
 				#endif
-				if (Melder_debug == 20) Melder_casual ("Before Pa_OpenStream");
+				if (Melder_debug == 20)
+					Melder_casual (U"Before Pa_OpenStream");
 				PaError err = Pa_OpenStream (& my portaudioStream, & streamParameters, NULL,
 					theControlPanel. sampleRate, 0, paNoFlag, portaudioStreamCallback, (void *) me);
-				if (Melder_debug == 20) Melder_casual ("Pa_OpenStream returns %d", (int) err);
+				if (Melder_debug == 20)
+					Melder_casual (U"Pa_OpenStream returns ", (int) err);
 				if (err)
-					Melder_throw ("open ", Melder_peekUtf8ToWcs (Pa_GetErrorText (err)));
+					Melder_throw (U"open ", Melder_peek8to32 (Pa_GetErrorText (err)));
 				Pa_StartStream (my portaudioStream);
-				if (Melder_debug == 20) Melder_casual ("Pa_StartStream returns %d", (int) err);
+				if (Melder_debug == 20)
+					Melder_casual (U"Pa_StartStream returns ", (int) err);
 				if (err)
-					Melder_throw ("start ", Melder_peekUtf8ToWcs (Pa_GetErrorText (err)));
+					Melder_throw (U"start ", Melder_peek8to32 (Pa_GetErrorText (err)));
 			} else {
 				#if defined (_WIN32)
 					win_fillFormat (me);
@@ -580,7 +584,7 @@ static void gui_button_cb_record (I, GuiButtonEvent event) {
 		Graphics_setColour (my graphics, Graphics_WHITE);
 		Graphics_fillRectangle (my graphics, 0.0, 1.0, 0.0, 1.0);
 		my recording = false;
-		Melder_flushError ("Cannot record.");
+		Melder_flushError (U"Cannot record.");
 	}
 }
 
@@ -604,9 +608,9 @@ static void publish (SoundRecorder me) {
 	double fsamp = theControlPanel. sampleRate;
 	if (fsamp <= 0.0) fsamp = 44100.0;   // safe
 	try {
-		sound.reset (Sound_createSimple (my numberOfChannels, (double) nsamp / fsamp, fsamp));
+		sound = Sound_createSimple (my numberOfChannels, (double) nsamp / fsamp, fsamp);
 	} catch (MelderError) {
-		Melder_flushError ("You can still save to file.");
+		Melder_flushError (U"You can still save to file.");
 		return;
 	}
 	if (my fakeMono) {
@@ -622,10 +626,10 @@ static void publish (SoundRecorder me) {
 		}
 	}
 	if (my soundName) {
-		autostring name = my soundName -> f_getString ();
+		autostring32 name = GuiText_getString (my soundName);
 		Thing_setName (sound.peek(), name.peek());
 	}
-	my broadcastPublication (sound.transfer());
+	Editor_broadcastPublication (me, sound.transfer());
 }
 
 static void gui_button_cb_cancel (I, GuiButtonEvent event) {
@@ -682,10 +686,10 @@ static void initialize (SoundRecorder me) {
 				my fd = open ("/dev/dsp", O_RDONLY);
 				if (my fd == -1) {
 					if (errno == EBUSY)
-						Melder_throw ("Audio device already in use.");
+						Melder_throw (U"Audio device already in use.");
 					else
-						Melder_throw ("Cannot open audio device.\n"
-							"Please switch on PortAudio in the Sound Recording Preferences.");
+						Melder_throw (U"Cannot open audio device.\n"
+							U"Please switch on PortAudio in the Sound Recording Preferences.");
 				}
 				ioctl (my fd, SNDCTL_DSP_RESET, NULL);
 				ioctl (my fd, SNDCTL_DSP_SPEED, & sampleRate);
@@ -693,31 +697,33 @@ static void initialize (SoundRecorder me) {
 				ioctl (my fd, SNDCTL_DSP_CHANNELS, (val = channels, & val));
 				if (channels == 1 && val == 2) {
 					close (my fd);
-					Melder_throw ("This sound card does not support mono.");
+					Melder_throw (U"This sound card does not support mono.");
 				}
 				ioctl (my fd, SNDCTL_DSP_STEREO, & stereo);
 				ioctl (my fd, SNDCTL_DSP_SETFMT, & format);
 				fd_mixer = open ("/dev/mixer", O_WRONLY);		
 				if (fd_mixer == -1) {
-					Melder_throw ("Cannot open /dev/mixer.");
+					Melder_throw (U"Cannot open /dev/mixer.");
 				} else {
 					int dev_mask = theControlPanel. inputSource == 2 ? SOUND_MASK_LINE : SOUND_MASK_MIC;
 					if (ioctl (fd_mixer, SOUND_MIXER_WRITE_RECSRC, & dev_mask) == -1) {
 						close (fd_mixer);
-						Melder_throw ("Can't set recording device in mixer.");
+						Melder_throw (U"Can't set recording device in mixer.");
 					}
 					close (fd_mixer);
 				}
 			#endif
 		}
 	} catch (MelderError) {
-		Melder_throw ("16-bit audio recording not initialized.");
+		Melder_throw (U"16-bit audio recording not initialized.");
 	}
 }
 
 static void gui_radiobutton_cb_input (I, GuiRadioButtonEvent event) {
 	iam (SoundRecorder);
-	Melder_casual ("SoundRecorder: setting the input source from %ld to %ld.", (long) theControlPanel. inputSource, (long) event -> position);
+	Melder_casual (U"SoundRecorder:"
+		U" setting the input source from ", theControlPanel. inputSource,
+		U" to ", event -> position, U".");
 	theControlPanel. inputSource = event -> position;
 
 	/* Set system's input source. */
@@ -731,16 +737,16 @@ static void gui_radiobutton_cb_input (I, GuiRadioButtonEvent event) {
 			try {
 				initialize (me);
 			} catch (MelderError) {
-				Melder_flushError (NULL);
+				Melder_flushError ();
 			}
 		#elif defined (linux)
 			int fd_mixer = open ("/dev/mixer", O_WRONLY);		
 			if (fd_mixer == -1) {
-				Melder_flushError ("(Sound_record:) Cannot open /dev/mixer.");
+				Melder_flushError (U"(Sound_record:) Cannot open /dev/mixer.");
 			}
 			int dev_mask = theControlPanel.inputSource == 2 ? SOUND_MASK_LINE : SOUND_MASK_MIC;
 			if (ioctl (fd_mixer, SOUND_MIXER_WRITE_RECSRC, & dev_mask) == -1)
-				Melder_flushError ("(Sound_record:) Can't set recording device in mixer");		
+				Melder_flushError (U"(Sound_record:) Can't set recording device in mixer");
 			close (fd_mixer);
 		#endif
 	}
@@ -761,7 +767,9 @@ static void gui_radiobutton_cb_fsamp (I, GuiRadioButtonEvent event) {
 		 * and then we get a message that the 48000 button has changed.
 		 * So the following will work (it used to be different with old Motif versions on Linux):
 		 */
-		Melder_casual ("SoundRecorder: setting the sample rate from %ld to %ld Hz.", (long) theControlPanel. sampleRate, (long) fsamp);
+		Melder_casual (U"SoundRecorder:"
+			U" setting the sample rate from ", (long) theControlPanel. sampleRate,
+			U" to ", (long) fsamp, U" Hz.");
 		if (fsamp == theControlPanel. sampleRate) return;
 		/*
 		 * Now we know, hopefully, that the message is from the button that was clicked,
@@ -787,7 +795,7 @@ static void gui_radiobutton_cb_fsamp (I, GuiRadioButtonEvent event) {
 			#endif
 		}
 	} catch (MelderError) {
-		Melder_throw ("Sampling frequency not changed.");
+		Melder_throw (U"Sampling frequency not changed.");
 	}
 }
 
@@ -805,26 +813,26 @@ void structSoundRecorder :: v_createChildren ()
 	/* Channels */
 
 	long y = 20 + Machine_getMenuBarHeight ();
-	GuiLabel_createShown (d_windowForm, 10, 160, y, y + Gui_LABEL_HEIGHT, L"Channels:", 0);
+	GuiLabel_createShown (d_windowForm, 10, 160, y, y + Gui_LABEL_HEIGHT, U"Channels:", 0);
 
 	GuiRadioGroup_begin ();
 	y += Gui_RADIOBUTTON_HEIGHT + Gui_RADIOBUTTON_SPACING;
 	monoButton = GuiRadioButton_createShown (d_windowForm, 20, 170, y, y + Gui_RADIOBUTTON_HEIGHT,
-		L"Mono", NULL, NULL, 0);
+		U"Mono", NULL, NULL, 0);
 	y += Gui_RADIOBUTTON_HEIGHT + Gui_RADIOBUTTON_SPACING;
 	stereoButton = GuiRadioButton_createShown (d_windowForm, 20, 170, y, y + Gui_RADIOBUTTON_HEIGHT,
-		L"Stereo", NULL, NULL, 0);
+		U"Stereo", NULL, NULL, 0);
 	GuiRadioGroup_end ();
 
 	/* Input source */
 	
 	y = 140 + Machine_getMenuBarHeight ();
 	#if defined (_WIN32)
-		GuiLabel_createShown (d_windowForm, 10, 170, y, y + Gui_LABEL_HEIGHT, L"(use Windows mixer", 0);
+		GuiLabel_createShown (d_windowForm, 10, 170, y, y + Gui_LABEL_HEIGHT, U"(use Windows mixer", 0);
 		y += Gui_LABEL_HEIGHT + 10;
-		GuiLabel_createShown (d_windowForm, 10, 170, y, y + Gui_LABEL_HEIGHT, L"   without meters)", 0);
+		GuiLabel_createShown (d_windowForm, 10, 170, y, y + Gui_LABEL_HEIGHT, U"   without meters)", 0);
 	#else
-		GuiLabel_createShown (d_windowForm, 10, 170, y, y + Gui_LABEL_HEIGHT, L"Input source:", 0);
+		GuiLabel_createShown (d_windowForm, 10, 170, y, y + Gui_LABEL_HEIGHT, U"Input source:", 0);
 		GuiRadioGroup_begin ();
 		for (long i = 1; i <= SoundRecorder_IDEVICE_MAX; i ++) {
 			if (device_ [i]. canDo) {
@@ -839,7 +847,7 @@ void structSoundRecorder :: v_createChildren ()
 	/* Meter box */
 	
 	y = 20 + Machine_getMenuBarHeight ();
-	GuiLabel_createShown (d_windowForm, 170, -170, y, y + Gui_LABEL_HEIGHT, L"Meter", GuiLabel_CENTRE);
+	GuiLabel_createShown (d_windowForm, 170, -170, y, y + Gui_LABEL_HEIGHT, U"Meter", GuiLabel_CENTRE);
 	y += Gui_LABEL_HEIGHT;
 	meter = GuiDrawingArea_createShown (d_windowForm, 170, -170, y, -150,
 		NULL, NULL, NULL, gui_drawingarea_cb_resize, this, GuiDrawingArea_BORDER);
@@ -847,17 +855,16 @@ void structSoundRecorder :: v_createChildren ()
 	/* Sampling frequency */
 
 	y = 20 + Machine_getMenuBarHeight ();
-	GuiLabel_createShown (d_windowForm, -160, -10, y, y + Gui_LABEL_HEIGHT, L"Sampling frequency:", 0);
+	GuiLabel_createShown (d_windowForm, -160, -10, y, y + Gui_LABEL_HEIGHT, U"Sampling frequency:", 0);
 	GuiRadioGroup_begin ();
 	for (long i = 1; i <= SoundRecorder_IFSAMP_MAX; i ++) {
 		if (fsamp_ [i]. canDo) {
 			double fsamp = fsamp_ [i]. fsamp;
-			wchar_t title [40];
-			swprintf (title, 40, L"%ls Hz", fsamp == floor (fsamp) ? Melder_integer ((long) fsamp) : Melder_fixed (fsamp, 5));
 			y += Gui_RADIOBUTTON_HEIGHT + Gui_RADIOBUTTON_SPACING;
 			fsamp_ [i]. button = GuiRadioButton_createShown (d_windowForm,
 				-150, -10, y, y + Gui_RADIOBUTTON_HEIGHT,
-				title, gui_radiobutton_cb_fsamp, this, fsamp == theControlPanel. sampleRate ? GuiRadioButton_SET : 0);
+				Melder_cat (fsamp == floor (fsamp) ? Melder_integer ((long) fsamp) : Melder_fixed (fsamp, 5), U" Hz"),
+				gui_radiobutton_cb_fsamp, this, fsamp == theControlPanel. sampleRate ? GuiRadioButton_SET : 0);
 		}
 	}
 	GuiRadioGroup_end ();
@@ -868,30 +875,30 @@ void structSoundRecorder :: v_createChildren ()
 
 	y = 60;
 	recordButton = GuiButton_createShown (d_windowForm, 20, 90, -y - Gui_PUSHBUTTON_HEIGHT, -y,
-		L"Record", gui_button_cb_record, this, 0);
+		U"Record", gui_button_cb_record, this, 0);
 	stopButton = GuiButton_createShown (d_windowForm, 100, 170, -y - Gui_PUSHBUTTON_HEIGHT, -y,
-		L"Stop", gui_button_cb_stop, this, 0);
+		U"Stop", gui_button_cb_stop, this, 0);
 	if (inputUsesPortAudio) {
 		playButton = GuiButton_createShown (d_windowForm, 180, 250, -y - Gui_PUSHBUTTON_HEIGHT, -y,
-			L"Play", gui_button_cb_play, this, 0);
+			U"Play", gui_button_cb_play, this, 0);
 	} else {
 		#if defined (_WIN32) || defined (macintosh)
 			playButton = GuiButton_createShown (d_windowForm, 180, 250, -y - Gui_PUSHBUTTON_HEIGHT, -y,
-				L"Play", gui_button_cb_play, this, 0);
+				U"Play", gui_button_cb_play, this, 0);
 		#endif
 	}
 	
-	GuiLabel_createShown (d_windowForm, -200, -130, -y - 2 - Gui_TEXTFIELD_HEIGHT, -y - 2, L"Name:", GuiLabel_RIGHT);
+	GuiLabel_createShown (d_windowForm, -200, -130, -y - 2 - Gui_TEXTFIELD_HEIGHT, -y - 2, U"Name:", GuiLabel_RIGHT);
 	soundName = GuiText_createShown (d_windowForm, -120, -20, -y - 2 - Gui_TEXTFIELD_HEIGHT, -y - 2, 0);
-	soundName -> f_setString (L"untitled");
+	GuiText_setString (soundName, U"untitled");
 
 	y = 20;
 	cancelButton = GuiButton_createShown (d_windowForm, -350, -280, -y - Gui_PUSHBUTTON_HEIGHT, -y,
-		L"Close", gui_button_cb_cancel, this, 0);
+		U"Close", gui_button_cb_cancel, this, 0);
 	applyButton = GuiButton_createShown (d_windowForm, -270, -170, -y - Gui_PUSHBUTTON_HEIGHT, -y,
-		L"Save to list", gui_button_cb_apply, this, GuiButton_DEFAULT);
+		U"Save to list", gui_button_cb_apply, this, GuiButton_DEFAULT);
 	okButton = GuiButton_createShown (d_windowForm, -160, -20, -y - Gui_PUSHBUTTON_HEIGHT, -y,
-		L"Save to list & Close", gui_button_cb_ok, this, 0);
+		U"Save to list & Close", gui_button_cb_ok, this, 0);
 }
 
 static void writeFakeMonoFile (SoundRecorder me, MelderFile file, int audioFileType) {
@@ -905,7 +912,7 @@ static void writeFakeMonoFile (SoundRecorder me, MelderFile file, int audioFileT
 		for (long i = 0; i < nsamp; i ++)
 			binputi2LE ((my buffer [i + i - 2] + my buffer [i + i - 1]) / 2, file -> filePointer);
 	}
-	MelderFile_writeAudioFileTrailer (file, audioFileType, theControlPanel. sampleRate, nsamp, 1, 16);
+	MelderFile_writeAudioFileTrailer (file, audioFileType, lround (theControlPanel. sampleRate), nsamp, 1, 16);
 	mfile.close ();
 }
 
@@ -914,18 +921,18 @@ static void writeAudioFile (SoundRecorder me, MelderFile file, int audioFileType
 		if (my fakeMono) {
 			writeFakeMonoFile (me, file, audioFileType);
 		} else {
-			MelderFile_writeAudioFile (file, audioFileType, my buffer, theControlPanel. sampleRate, my nsamp, my numberOfChannels, 16);
+			MelderFile_writeAudioFile (file, audioFileType, my buffer, lround (theControlPanel. sampleRate), my nsamp, my numberOfChannels, 16);
 		}
 	} catch (MelderError) {
-		Melder_throw ("Audio file not written.");
+		Melder_throw (U"Audio file not written.");
 	}
 }
 
 static void menu_cb_writeWav (EDITOR_ARGS) {
 	EDITOR_IAM (SoundRecorder);
-	EDITOR_FORM_WRITE (L"Save as WAV file", 0)
-		wchar_t *name = my soundName -> f_getString ();
-		swprintf (defaultName, 300, L"%ls.wav", name);
+	EDITOR_FORM_WRITE (U"Save as WAV file", 0)
+		char32 *name = GuiText_getString (my soundName);
+		Melder_sprint (defaultName,300, name, U".wav");
 		Melder_free (name);
 	EDITOR_DO_WRITE
 		writeAudioFile (me, file, Melder_WAV);
@@ -934,9 +941,9 @@ static void menu_cb_writeWav (EDITOR_ARGS) {
 
 static void menu_cb_writeAifc (EDITOR_ARGS) {
 	EDITOR_IAM (SoundRecorder);
-	EDITOR_FORM_WRITE (L"Save as AIFC file", 0)
-		wchar_t *name = my soundName -> f_getString ();
-		swprintf (defaultName, 300, L"%ls.aifc", name);
+	EDITOR_FORM_WRITE (U"Save as AIFC file", 0)
+		char32 *name = GuiText_getString (my soundName);
+		Melder_sprint (defaultName,300, name, U".aifc");
 		Melder_free (name);
 	EDITOR_DO_WRITE
 		writeAudioFile (me, file, Melder_AIFC);
@@ -945,9 +952,9 @@ static void menu_cb_writeAifc (EDITOR_ARGS) {
 
 static void menu_cb_writeNextSun (EDITOR_ARGS) {
 	EDITOR_IAM (SoundRecorder);
-	EDITOR_FORM_WRITE (L"Save as NeXT/Sun file", 0)
-		wchar_t *name = my soundName -> f_getString ();
-		swprintf (defaultName, 300, L"%ls.au", name);
+	EDITOR_FORM_WRITE (U"Save as NeXT/Sun file", 0)
+		char32 *name = GuiText_getString (my soundName);
+		Melder_sprint (defaultName,300, name, U".au");
 		Melder_free (name);
 	EDITOR_DO_WRITE
 		writeAudioFile (me, file, Melder_NEXT_SUN);
@@ -956,9 +963,9 @@ static void menu_cb_writeNextSun (EDITOR_ARGS) {
 
 static void menu_cb_writeNist (EDITOR_ARGS) {
 	EDITOR_IAM (SoundRecorder);
-	EDITOR_FORM_WRITE (L"Save as NIST file", 0)
-		wchar_t *name = my soundName -> f_getString ();
-		swprintf (defaultName, 300, L"%ls.nist", name);
+	EDITOR_FORM_WRITE (U"Save as NIST file", 0)
+		char32 *name = GuiText_getString (my soundName);
+		Melder_sprint (defaultName,300, name, U".nist");
 		Melder_free (name);
 	EDITOR_DO_WRITE
 		writeAudioFile (me, file, Melder_NIST);
@@ -966,8 +973,10 @@ static void menu_cb_writeNist (EDITOR_ARGS) {
 }
 
 static void updateMenus (SoundRecorder me) {
-	my d_meterIntensityButton -> f_check (my p_meter_which == kSoundRecorder_meter_INTENSITY);
-	my d_meterCentreOfGravityVersusIntensityButton -> f_check (my p_meter_which == kSoundRecorder_meter_CENTRE_OF_GRAVITY_VERSUS_INTENSITY);
+	GuiMenuItem_check (my d_meterIntensityButton,
+		my p_meter_which == kSoundRecorder_meter_INTENSITY);
+	GuiMenuItem_check (my d_meterCentreOfGravityVersusIntensityButton,
+		my p_meter_which == kSoundRecorder_meter_CENTRE_OF_GRAVITY_VERSUS_INTENSITY);
 }
 
 static void menu_cb_intensity (EDITOR_ARGS) {
@@ -981,31 +990,38 @@ static void menu_cb_centreOfGravityVersusIntensity (EDITOR_ARGS) {
 	updateMenus (me);
 }
 
-static void menu_cb_SoundRecorder_help (EDITOR_ARGS) { EDITOR_IAM (SoundRecorder); Melder_help (L"SoundRecorder"); }
+static void menu_cb_SoundRecorder_help (EDITOR_ARGS) { EDITOR_IAM (SoundRecorder); Melder_help (U"SoundRecorder"); }
 
 void structSoundRecorder :: v_createMenus () {
 	SoundRecorder_Parent :: v_createMenus ();
-	Editor_addCommand (this, L"File", L"Save as WAV file...", 0, menu_cb_writeWav);
-	Editor_addCommand (this, L"File", L"Save as AIFC file...", 0, menu_cb_writeAifc);
-	Editor_addCommand (this, L"File", L"Save as NeXT/Sun file...", 0, menu_cb_writeNextSun);
-	Editor_addCommand (this, L"File", L"Save as NIST file...", 0, menu_cb_writeNist);
-	Editor_addCommand (this, L"File", L"-- write --", 0, 0);
-	Editor_addMenu (this, L"Meter", 0);
+	Editor_addCommand (this, U"File", U"Save as WAV file...", 0, menu_cb_writeWav);
+	Editor_addCommand (this, U"File", U"Save as AIFC file...", 0, menu_cb_writeAifc);
+	Editor_addCommand (this, U"File", U"Save as NeXT/Sun file...", 0, menu_cb_writeNextSun);
+	Editor_addCommand (this, U"File", U"Save as NIST file...", 0, menu_cb_writeNist);
+	Editor_addCommand (this, U"File", U"-- write --", 0, 0);
+	Editor_addMenu (this, U"Meter", 0);
 	d_meterIntensityButton =
-		Editor_addCommand (this, L"Meter", L"Intensity", GuiMenu_RADIO_FIRST, menu_cb_intensity);
+		Editor_addCommand (this, U"Meter", U"Intensity", GuiMenu_RADIO_FIRST, menu_cb_intensity);
 	d_meterCentreOfGravityVersusIntensityButton =
-		Editor_addCommand (this, L"Meter", L"Centre of gravity ~ intensity", GuiMenu_RADIO_NEXT, menu_cb_centreOfGravityVersusIntensity);
+		Editor_addCommand (this, U"Meter", U"Centre of gravity ~ intensity", GuiMenu_RADIO_NEXT, menu_cb_centreOfGravityVersusIntensity);
 }
 
 void structSoundRecorder :: v_createHelpMenuItems (EditorMenu menu) {
 	SoundRecorder_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"SoundRecorder help", '?', menu_cb_SoundRecorder_help);
+	EditorMenu_addCommand (menu, U"SoundRecorder help", '?', menu_cb_SoundRecorder_help);
 }
 
-SoundRecorder SoundRecorder_create (int numberOfChannels) {
+autoSoundRecorder SoundRecorder_create (int numberOfChannels) {
 	try {
 		autoSoundRecorder me = Thing_new (SoundRecorder);
-		my inputUsesPortAudio = MelderAudio_getInputUsesPortAudio ();
+		my inputUsesPortAudio =
+			#if defined (_WIN32)
+				MelderAudio_getInputSoundSystem () == kMelder_inputSoundSystem_MME_VIA_PORTAUDIO;
+			#elif defined (macintosh)
+				MelderAudio_getInputSoundSystem () == kMelder_inputSoundSystem_COREAUDIO_VIA_PORTAUDIO;
+			#else
+				MelderAudio_getInputSoundSystem () == kMelder_inputSoundSystem_ALSA_VIA_PORTAUDIO;
+			#endif
 
 		if (my inputUsesPortAudio) {
 		} else {
@@ -1014,14 +1030,14 @@ SoundRecorder SoundRecorder_create (int numberOfChannels) {
 				WAVEINCAPS caps;
 				MMRESULT err;
 				if (numberOfDevices == 0)
-					Melder_throw ("No sound input devices available.");
+					Melder_throw (U"No sound input devices available.");
 				err = waveInGetDevCaps (WAVE_MAPPER, & caps, sizeof (WAVEINCAPS));
 				if (numberOfChannels == 2 && caps. wChannels < 2)
-					Melder_throw ("Your computer does not support stereo sound input.");
+					Melder_throw (U"Your computer does not support stereo sound input.");
 				/* BUG: should we ask whether 16 bit is supported? */
 				for (i = 0; i < numberOfDevices; i ++) {
 					waveInGetDevCaps (i, & caps, sizeof (WAVEINCAPS));
-					/*Melder_casual ("Name of device %d: %s", i, caps. szPname);*/
+					/*Melder_casual (U"Name of device ", i, U": ", Melder_peek16to32 (aps. szPname));*/
 				}
 			#elif defined (macintosh)
 				SInt32 soundFeatures;
@@ -1029,16 +1045,16 @@ SoundRecorder SoundRecorder_create (int numberOfChannels) {
 						! (soundFeatures & (1 << gestaltSoundIOMgrPresent)) ||
 						! (soundFeatures & (1 << gestaltBuiltInSoundInput)) ||
 						! (soundFeatures & (1 << gestaltHasSoundInputDevice)))
-					Melder_throw ("Your computer does not support sound input.");
-				if (! (soundFeatures & (1 << gestalt16BitSoundIO)) ||   /* Hardware. */
-					! (soundFeatures & (1 << gestaltStereoInput)) ||   /* Hardware. */
-					! (soundFeatures & (1 << gestalt16BitAudioSupport)))   /* Software. */
-					Melder_throw ("Your computer does not support stereo sound input.");
+					Melder_throw (U"Your computer does not support sound input.");
+				if (! (soundFeatures & (1 << gestalt16BitSoundIO)) ||   // hardware
+					! (soundFeatures & (1 << gestaltStereoInput)) ||   // hardware
+					! (soundFeatures & (1 << gestalt16BitAudioSupport)))   // software
+					Melder_throw (U"Your computer does not support stereo sound input.");
 			#endif
 		}
 		my numberOfChannels = numberOfChannels;
 		if (sizeof (short) != 2)
-			Melder_throw ("Long shorts!!!!!");
+			Melder_throw (U"Long shorts!!!!!");
 		if (my inputUsesPortAudio) {
 			my synchronous = false;
 		} else {
@@ -1051,13 +1067,13 @@ SoundRecorder SoundRecorder_create (int numberOfChannels) {
 		/*
 		 * Allocate the maximum buffer.
 		 */
-		if (preferences.bufferSizeInMegabytes < 1) preferences.bufferSizeInMegabytes = 1;   /* Validate preferences. */
+		if (preferences.bufferSizeInMegabytes < 1) preferences.bufferSizeInMegabytes = 1;   // validate preferences
 		if (preferences.bufferSizeInMegabytes > 1000) preferences.bufferSizeInMegabytes = 1000;
 		if (my buffer == NULL) {
 			long nmax_bytes_pref = preferences.bufferSizeInMegabytes * 1000000;
 			long nmax_bytes = my inputUsesPortAudio ? nmax_bytes_pref :
 				#if defined (_WIN32)
-					66150000;   /* The maximum physical buffer on Windows XP; shorter than in Windows 98, alas. */
+					66150000;   // the maximum physical buffer on Windows XP; shorter than in Windows 98, alas.
 				#else
 					nmax_bytes_pref;
 				#endif
@@ -1085,46 +1101,52 @@ SoundRecorder SoundRecorder_create (int numberOfChannels) {
 			static bool paInitialized = false;
 			if (! paInitialized) {
 				PaError err = Pa_Initialize ();
-				if (Melder_debug == 20) Melder_casual ("init %s", Pa_GetErrorText (err));
+				if (Melder_debug == 20)
+					Melder_casual (U"init ", Melder_peek8to32 (Pa_GetErrorText (err)));
 				paInitialized = true;
 				if (Melder_debug == 20) {
 					PaHostApiIndex hostApiCount = Pa_GetHostApiCount ();
-					Melder_casual ("host API count %ls", Melder_integer (hostApiCount));
+					Melder_casual (U"host API count ", hostApiCount);
 					for (PaHostApiIndex iHostApi = 0; iHostApi < hostApiCount; iHostApi ++) {
 						const PaHostApiInfo *hostApiInfo = Pa_GetHostApiInfo (iHostApi);
 						PaHostApiTypeId type = hostApiInfo -> type;
-						Melder_casual ("host API %ls: %ls, \"%s\" %ls", Melder_integer (iHostApi), Melder_integer (type), hostApiInfo -> name, Melder_integer (hostApiInfo -> deviceCount));
+						Melder_casual (U"host API ", iHostApi, U": ", type, U", \"", Melder_peek8to32 (hostApiInfo -> name), U"\" ", hostApiInfo -> deviceCount);
 					}
 					PaHostApiIndex defaultHostApi = Pa_GetDefaultHostApi ();
-					Melder_casual ("default host API %ls", Melder_integer (defaultHostApi));
+					Melder_casual (U"default host API ", defaultHostApi);
 					PaDeviceIndex deviceCount = Pa_GetDeviceCount ();
-					Melder_casual ("device count %ls", Melder_integer (deviceCount));
+					Melder_casual (U"device count ", deviceCount);
 				}
 			}
 			PaDeviceIndex deviceCount = Pa_GetDeviceCount ();
 			for (PaDeviceIndex idevice = 0; idevice < deviceCount; idevice ++) {
 				const PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo (idevice);
-				if (Melder_debug == 20) Melder_casual ("Device \"%s\", input %d, output %d, sample rate %lf", deviceInfo -> name,
-					(int) deviceInfo -> maxInputChannels, (int) deviceInfo -> maxOutputChannels, deviceInfo -> defaultSampleRate);
+				if (Melder_debug == 20)
+					Melder_casual (
+						U"Device \"", Melder_peek8to32 (deviceInfo -> name),
+						U"\", input ", deviceInfo -> maxInputChannels,
+						U", output ", deviceInfo -> maxOutputChannels,
+						U", sample rate ", deviceInfo -> defaultSampleRate
+					);
 				if (deviceInfo -> maxInputChannels > 0 && my numberOfInputDevices < SoundRecorder_IDEVICE_MAX) {
 					my device_ [++ my numberOfInputDevices]. canDo = true;
-					wcsncpy (my device_ [my numberOfInputDevices]. name, Melder_peekUtf8ToWcs (deviceInfo -> name), 40);
-					my device_ [my numberOfInputDevices]. name [40] = '\0';
+					str32ncpy (my device_ [my numberOfInputDevices]. name, Melder_peek8to32 (deviceInfo -> name), 40);
+					my device_ [my numberOfInputDevices]. name [40] = U'\0';
 					my deviceInfos [my numberOfInputDevices] = deviceInfo;
 					my deviceIndices [my numberOfInputDevices] = idevice;
 				}
 			}
 			if (my numberOfInputDevices == 0)
-				Melder_throw ("No input devices available.");
+				Melder_throw (U"No input devices available.");
 		} else {
 			#if defined (macintosh)
 			#elif defined (_WIN32)
 				// No device info: use Windows mixer.
 			#else
 				my device_ [1]. canDo = true;
-				wcscpy (my device_ [1]. name, L"Microphone");
+				str32cpy (my device_ [1]. name, U"Microphone");
 				my device_ [2]. canDo = true;
-				wcscpy (my device_ [2]. name, L"Line");
+				str32cpy (my device_ [2]. name, U"Line");
 			#endif
 		}
 
@@ -1161,7 +1183,7 @@ SoundRecorder SoundRecorder_create (int numberOfChannels) {
 		 */
 		initialize (me.peek());
 
-		Editor_init (me.peek(), 100, 100, 600, 500, L"SoundRecorder", NULL);
+		Editor_init (me.peek(), 100, 100, 600, 500, U"SoundRecorder", NULL);
 		my graphics = Graphics_create_xmdrawingarea (my meter);
 		Melder_assert (my graphics);
 		Graphics_setWindow (my graphics, 0.0, 1.0, 0.0, 1.0);
@@ -1169,8 +1191,8 @@ SoundRecorder SoundRecorder_create (int numberOfChannels) {
 		Graphics_fillRectangle (my graphics, 0.0, 1.0, 0.0, 1.0);
 
 struct structGuiDrawingAreaResizeEvent event = { my meter, 0 };
-event. width  = my meter -> f_getWidth  ();
-event. height = my meter -> f_getHeight ();
+event. width  = GuiControl_getWidth  (my meter);
+event. height = GuiControl_getHeight (my meter);
 gui_drawingarea_cb_resize (me.peek(), & event);
 
 		#if cocoa
@@ -1184,9 +1206,9 @@ gui_drawingarea_cb_resize (me.peek(), & event);
 			my workProcId = GuiAddWorkProc (workProc, me.peek());
 		#endif
 		updateMenus (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("SoundRecorder not created.");
+		Melder_throw (U"SoundRecorder not created.");
 	}
 }
 
diff --git a/fon/SoundRecorder.h b/fon/SoundRecorder.h
index 1bdb915..3a2220b 100644
--- a/fon/SoundRecorder.h
+++ b/fon/SoundRecorder.h
@@ -2,7 +2,7 @@
 #define _SoundRecorder_h_
 /* SoundRecorder.h
  *
- * Copyright (C) 1992-2011,2012,2013 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -43,7 +43,7 @@
 #endif
 
 struct SoundRecorder_Device {
-	wchar_t name [1+40];
+	char32 name [1+40];
 	bool canDo;
 	GuiRadioButton button;
 };
@@ -73,60 +73,64 @@ struct SoundRecorder_Fsamp {
 #define SoundRecorder_IFSAMP_MAX  14
 
 Thing_define (SoundRecorder, Editor) {
-	// new data:
-	public:
-		int numberOfChannels;
-		long nsamp, nmax;
-		bool fakeMono, synchronous, recording;
-		int lastLeftMaximum, lastRightMaximum;
-		long numberOfInputDevices;
-		struct SoundRecorder_Device device_ [1+SoundRecorder_IDEVICE_MAX];
-		struct SoundRecorder_Fsamp fsamp_ [1+SoundRecorder_IFSAMP_MAX];
-		short *buffer;
-		GuiRadioButton monoButton, stereoButton;
-		GuiDrawingArea meter;
-		GuiScale progressScale;
-		GuiButton recordButton, stopButton, playButton;
-		GuiText soundName;
-		GuiButton cancelButton, applyButton, okButton;
-		GuiMenuItem d_meterIntensityButton, d_meterCentreOfGravityVersusIntensityButton;
-		Graphics graphics;
-		bool inputUsesPortAudio;
-		const PaDeviceInfo *deviceInfos [1+SoundRecorder_IDEVICE_MAX];
-		PaDeviceIndex deviceIndices [1+SoundRecorder_IDEVICE_MAX];
-		PaStream *portaudioStream;
-		#if cocoa
-			CFRunLoopTimerRef d_cocoaTimer;
-		#elif motif
-			XtWorkProcId workProcId;
-		#endif
-		#if defined (_WIN32)
-			HWAVEIN hWaveIn;
-			WAVEFORMATEX waveFormat;
-			WAVEHDR waveHeader [3];
-			MMRESULT err;
-			short buffertje1 [1000*2], buffertje2 [1000*2];
-		#elif defined (macintosh)
-			short macSource [1+8];
-			Str255 hybridDeviceNames [1+8];
-			long refNum;
-		#elif defined (linux)
-			int fd;
-		#else
-			int fd;
-		#endif
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual bool v_editable () { return false; }
-		virtual bool v_scriptable () { return false; }
-		virtual void v_createChildren ();
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-	// preferences:
-		#include "SoundRecorder_prefs.h"
+	int numberOfChannels;
+	long nsamp, nmax;
+	bool fakeMono, synchronous, recording;
+	int lastLeftMaximum, lastRightMaximum;
+	long numberOfInputDevices;
+	struct SoundRecorder_Device device_ [1+SoundRecorder_IDEVICE_MAX];
+	struct SoundRecorder_Fsamp fsamp_ [1+SoundRecorder_IFSAMP_MAX];
+	short *buffer;
+	GuiRadioButton monoButton, stereoButton;
+	GuiDrawingArea meter;
+	GuiScale progressScale;
+	GuiButton recordButton, stopButton, playButton;
+	GuiText soundName;
+	GuiButton cancelButton, applyButton, okButton;
+	GuiMenuItem d_meterIntensityButton, d_meterCentreOfGravityVersusIntensityButton;
+	Graphics graphics;
+	bool inputUsesPortAudio;
+	const PaDeviceInfo *deviceInfos [1+SoundRecorder_IDEVICE_MAX];
+	PaDeviceIndex deviceIndices [1+SoundRecorder_IDEVICE_MAX];
+	PaStream *portaudioStream;
+	#if cocoa
+		CFRunLoopTimerRef d_cocoaTimer;
+	#elif motif
+		XtWorkProcId workProcId;
+	#endif
+	#if defined (_WIN32)
+		HWAVEIN hWaveIn;
+		WAVEFORMATEX waveFormat;
+		WAVEHDR waveHeader [3];
+		MMRESULT err;
+		short buffertje1 [1000*2], buffertje2 [1000*2];
+	#elif defined (macintosh)
+		short macSource [1+8];
+		Str255 hybridDeviceNames [1+8];
+		long refNum;
+	#elif defined (linux)
+		int fd;
+	#else
+		int fd;
+	#endif
+
+	void v_destroy ()
+		override;
+	bool v_editable ()
+		override { return false; }
+	bool v_scriptable ()
+		override { return false; }
+	void v_createChildren ()
+		override;
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+
+	#include "SoundRecorder_prefs.h"
 };
 
-SoundRecorder SoundRecorder_create (int numberOfChannels);
+autoSoundRecorder SoundRecorder_create (int numberOfChannels);
 /*
 	Function:
 		create a SoundRecorder, which is an interactive window
diff --git a/fon/SoundRecorder_enums.h b/fon/SoundRecorder_enums.h
index 302d2e3..b49b201 100644
--- a/fon/SoundRecorder_enums.h
+++ b/fon/SoundRecorder_enums.h
@@ -1,6 +1,6 @@
 /* SoundRecorder_enums.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,8 +18,8 @@
  */
 
 enums_begin (kSoundRecorder_meter, 1)
-	enums_add (kSoundRecorder_meter, 1, INTENSITY, L"intensity")
-	enums_add (kSoundRecorder_meter, 2, CENTRE_OF_GRAVITY_VERSUS_INTENSITY, L"centre of gravity ~ intensity")
+	enums_add (kSoundRecorder_meter, 1, INTENSITY, U"intensity")
+	enums_add (kSoundRecorder_meter, 2, CENTRE_OF_GRAVITY_VERSUS_INTENSITY, U"centre of gravity ~ intensity")
 enums_end (kSoundRecorder_meter, 2, INTENSITY)
 
 /* End of file SoundRecorder_enums.h */
diff --git a/fon/SoundRecorder_prefs.h b/fon/SoundRecorder_prefs.h
index e3757f9..41bc9ed 100644
--- a/fon/SoundRecorder_prefs.h
+++ b/fon/SoundRecorder_prefs.h
@@ -1,6 +1,6 @@
 /* SoundRecorder_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,12 +18,13 @@
  */
 
 prefs_begin (SoundRecorder)
-	// new:
-		prefs_add_enum_with_data   (SoundRecorder, meter_which, 1, kSoundRecorder_meter, INTENSITY)
-		prefs_add_double_with_data (SoundRecorder, meter_intensity_minimum,  1, L"50.0")   // dB
-		prefs_add_double_with_data (SoundRecorder, meter_intensity_maximum,  1, L"94.0")   // dB
-		prefs_add_double_with_data (SoundRecorder, meter_centreOfGravity_minimum,  1,  L"500.0")   // Hz
-		prefs_add_double_with_data (SoundRecorder, meter_centreOfGravity_maximum,  1, L"8000.0")   // Hz
+
+	prefs_add_enum_with_data   (SoundRecorder, meter_which, 1, kSoundRecorder_meter, INTENSITY)
+	prefs_add_double_with_data (SoundRecorder, meter_intensity_minimum,  1, U"50.0")   // dB
+	prefs_add_double_with_data (SoundRecorder, meter_intensity_maximum,  1, U"94.0")   // dB
+	prefs_add_double_with_data (SoundRecorder, meter_centreOfGravity_minimum,  1,  U"500.0")   // Hz
+	prefs_add_double_with_data (SoundRecorder, meter_centreOfGravity_maximum,  1, U"8000.0")   // Hz
+
 prefs_end (SoundRecorder)
 
 /* End of file SoundRecorder_prefs.h */
diff --git a/fon/Sound_PointProcess.cpp b/fon/Sound_PointProcess.cpp
index a8b2ec6..ee0305d 100644
--- a/fon/Sound_PointProcess.cpp
+++ b/fon/Sound_PointProcess.cpp
@@ -1,6 +1,6 @@
 /* Sound_PointProcess.cpp
  *
- * Copyright (C) 2010-2011 Paul Boersma
+ * Copyright (C) 2010-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,12 +27,12 @@
 Sound Sound_PointProcess_to_SoundEnsemble_correlate (Sound me, PointProcess thee, double fromLag, double toLag) {
 	try {
 		if (my ny > 1)
-			Melder_throw ("Sound has to be mono.");
+			Melder_throw (U"Sound has to be mono.");
 		long numberOfPoints = thy nt;
 		double hisDuration = toLag - fromLag;
-		long numberOfSamples = floor (hisDuration / my dx) + 1;
+		long numberOfSamples = (long) floor (hisDuration / my dx) + 1;
 		if (numberOfSamples < 1)
-			Melder_throw (L"Time window too short.");
+			Melder_throw (U"Time window too short.");
 		double midTime = 0.5 * (fromLag + toLag);
 		double hisPhysicalDuration = numberOfSamples * my dx;
 		double firstTime = midTime - 0.5 * hisPhysicalDuration + 0.5 * my dx;   // distribute the samples evenly over the time domain
@@ -42,7 +42,7 @@ Sound Sound_PointProcess_to_SoundEnsemble_correlate (Sound me, PointProcess thee
 			double hisTimeOfPoint = 0.0;
 			double mySample = 1 + (myTimeOfPoint - my x1) / my dx;
 			double hisSample = 1 + (hisTimeOfPoint - his x1) / my dx;
-			long sampleDifference = round (mySample - hisSample);
+			long sampleDifference = lround (mySample - hisSample);
 			for (long isample = 1; isample <= numberOfSamples; isample ++) {
 				long jsample = isample + sampleDifference;
 				his z [ipoint] [isample] = jsample < 1 || jsample > my nx ? 0.0 : my z [1] [jsample];
@@ -50,7 +50,7 @@ Sound Sound_PointProcess_to_SoundEnsemble_correlate (Sound me, PointProcess thee
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": Sound ensemble not created.");
+		Melder_throw (me, U" & ", thee, U": Sound ensemble not created.");
 	}
 }
 
diff --git a/fon/Sound_and_Spectrogram.cpp b/fon/Sound_and_Spectrogram.cpp
index 410ef84..5e29eff 100644
--- a/fon/Sound_and_Spectrogram.cpp
+++ b/fon/Sound_and_Spectrogram.cpp
@@ -1,6 +1,6 @@
 /* Sound_and_Spectrogram.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -64,11 +64,11 @@ Spectrogram Sound_to_Spectrogram (Sound me, double effectiveAnalysisWidth, doubl
 		long halfnsamp_window = nsamp_window / 2 - 1;
 		nsamp_window = halfnsamp_window * 2;
 		if (nsamp_window < 1)
-			Melder_throw ("Your analysis window is too short: less than two samples.");
+			Melder_throw (U"Your analysis window is too short: less than two samples.");
 		if (physicalAnalysisWidth > duration)
-			Melder_throw ("Your sound is too short:\n"
-				"it should be at least as long as ",
-				windowType == kSound_to_Spectrogram_windowShape_GAUSSIAN ? "two window lengths." : "one window length.");
+			Melder_throw (U"Your sound is too short:\n"
+				U"it should be at least as long as ",
+				windowType == kSound_to_Spectrogram_windowShape_GAUSSIAN ? U"two window lengths." : U"one window length.");
 		long numberOfTimes = 1 + (long) floor ((duration - physicalAnalysisWidth) / timeStep);   // >= 1
 		double t1 = my x1 + 0.5 * ((double) (my nx - 1) * my dx - (double) (numberOfTimes - 1) * timeStep);
 			/* Centre of first frame. */
@@ -87,11 +87,11 @@ Spectrogram Sound_to_Spectrogram (Sound me, double effectiveAnalysisWidth, doubl
 		/*
 		 * Compute the frequency sampling of the spectrogram.
 		 */
-		long binWidth_samples = freqStep * my dx * nsampFFT;
+		long binWidth_samples = (long) floor (freqStep * my dx * nsampFFT);
 		if (binWidth_samples < 1) binWidth_samples = 1;
 		double binWidth_hertz = 1.0 / (my dx * nsampFFT);
 		freqStep = binWidth_samples * binWidth_hertz;
-		numberOfFreqs = floor (fmax / freqStep);
+		numberOfFreqs = (long) floor (fmax / freqStep);
 		if (numberOfFreqs < 1) return NULL;
 
 		autoSpectrogram thee = Spectrogram_create (my xmin, my xmax, numberOfTimes, timeStep, t1,
@@ -103,10 +103,10 @@ Spectrogram Sound_to_Spectrogram (Sound me, double effectiveAnalysisWidth, doubl
 		autoNUMfft_Table fftTable;
 		NUMfft_Table_init (& fftTable, nsampFFT);
 
-		autoMelderProgress progress (L"Sound to Spectrogram...");
+		autoMelderProgress progress (U"Sound to Spectrogram...");
 		for (long i = 1; i <= nsamp_window; i ++) {
 			double nSamplesPerWindow_f = physicalAnalysisWidth / my dx;
-			double phase = (double) i / nSamplesPerWindow_f;   /* 0 .. 1 */
+			double phase = (double) i / nSamplesPerWindow_f;   // 0 .. 1
 			double value;
 			switch (windowType) {
 				case kSound_to_Spectrogram_windowShape_SQUARE:
@@ -151,7 +151,7 @@ Spectrogram Sound_to_Spectrogram (Sound me, double effectiveAnalysisWidth, doubl
 				for (long j = nsamp_window + 1; j <= nsampFFT; j ++) frame [j] = 0.0f;
 
 				Melder_progress (iframe / (numberOfTimes + 1.0),
-					L"Sound to Spectrogram: analysis of frame ", Melder_integer (iframe), L" out of ", Melder_integer (numberOfTimes));
+					U"Sound to Spectrogram: analysis of frame ", iframe, U" out of ", numberOfTimes);
 
 				/* Compute Fast Fourier Transform of the frame. */
 
@@ -162,7 +162,7 @@ Spectrogram Sound_to_Spectrogram (Sound me, double effectiveAnalysisWidth, doubl
 				spec [1] += frame [1] * frame [1];   // DC component
 				for (long i = 2; i <= half_nsampFFT; i ++)
 					spec [i] += frame [i + i - 2] * frame [i + i - 2] + frame [i + i - 1] * frame [i + i - 1];
-				spec [half_nsampFFT + 1] += frame [nsampFFT] * frame [nsampFFT];   /* Nyquist frequency. Correct?? */
+				spec [half_nsampFFT + 1] += frame [nsampFFT] * frame [nsampFFT];   // Nyquist frequency. Correct??
 			}
 			if (my ny > 1 ) for (long i = 1; i <= half_nsampFFT; i ++) {
 				spec [i] /= my ny;
@@ -178,14 +178,14 @@ Spectrogram Sound_to_Spectrogram (Sound me, double effectiveAnalysisWidth, doubl
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": spectrogram analysis not performed.");
+		Melder_throw (me, U": spectrogram analysis not performed.");
 	}
 }
 
 Sound Spectrogram_to_Sound (Spectrogram me, double fsamp) {
 	try {
 		double dt = 1 / fsamp;
-		long n = (my xmax - my xmin) / dt;
+		long n = (long) floor ((my xmax - my xmin) / dt);
 		if (n < 0) return NULL;
 		autoSound thee = Sound_create (1, my xmin, my xmax, n, dt, 0.5 * dt);
 		for (long i = 1; i <= n; i ++) {
@@ -193,7 +193,7 @@ Sound Spectrogram_to_Sound (Spectrogram me, double fsamp) {
 			double rframe = Sampled_xToIndex (me, t), phase, value = 0.0;
 			long leftFrame, rightFrame;
 			if (rframe < 1 || rframe >= my nx) continue;
-			leftFrame = floor (rframe), rightFrame = leftFrame + 1, phase = rframe - leftFrame;
+			leftFrame = (long) floor (rframe), rightFrame = leftFrame + 1, phase = rframe - leftFrame;
 			for (long j = 1; j <= my ny; j ++) {
 				double f = Matrix_rowToY (me, j);
 				double power = my z [j] [leftFrame] * (1 - phase) + my z [j] [rightFrame] * phase;
@@ -203,7 +203,7 @@ Sound Spectrogram_to_Sound (Spectrogram me, double fsamp) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
diff --git a/fon/Sound_and_Spectrogram_enums.h b/fon/Sound_and_Spectrogram_enums.h
index 63ffc31..133176c 100644
--- a/fon/Sound_and_Spectrogram_enums.h
+++ b/fon/Sound_and_Spectrogram_enums.h
@@ -1,6 +1,6 @@
 /* Sound_and_Spectrogram_enums.h
  *
- * Copyright (C) 1992-2007,2013 Paul Boersma
+ * Copyright (C) 1992-2007,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,16 +18,16 @@
  */
 
 enums_begin (kSound_to_Spectrogram_method, 1)
-	enums_add (kSound_to_Spectrogram_method, 1, FOURIER, L"Fourier")
+	enums_add (kSound_to_Spectrogram_method, 1, FOURIER, U"Fourier")
 enums_end (kSound_to_Spectrogram_method, 1, FOURIER)
 
 enums_begin (kSound_to_Spectrogram_windowShape, 0)
-	enums_add (kSound_to_Spectrogram_windowShape, 0, SQUARE, L"square (rectangular)")
-	enums_add (kSound_to_Spectrogram_windowShape, 1, HAMMING, L"Hamming (raised sine-squared)")
-	enums_add (kSound_to_Spectrogram_windowShape, 2, BARTLETT, L"Bartlett (triangular)")
-	enums_add (kSound_to_Spectrogram_windowShape, 3, WELCH, L"Welch (parabolic)")
-	enums_add (kSound_to_Spectrogram_windowShape, 4, HANNING, L"Hanning (sine-squared)")
-	enums_add (kSound_to_Spectrogram_windowShape, 5, GAUSSIAN, L"Gaussian")
+	enums_add (kSound_to_Spectrogram_windowShape, 0, SQUARE, U"square (rectangular)")
+	enums_add (kSound_to_Spectrogram_windowShape, 1, HAMMING, U"Hamming (raised sine-squared)")
+	enums_add (kSound_to_Spectrogram_windowShape, 2, BARTLETT, U"Bartlett (triangular)")
+	enums_add (kSound_to_Spectrogram_windowShape, 3, WELCH, U"Welch (parabolic)")
+	enums_add (kSound_to_Spectrogram_windowShape, 4, HANNING, U"Hanning (sine-squared)")
+	enums_add (kSound_to_Spectrogram_windowShape, 5, GAUSSIAN, U"Gaussian")
 enums_end (kSound_to_Spectrogram_windowShape, 5, GAUSSIAN)
 
 /* End of Sound_and_Spectrogram_enums.h */
diff --git a/fon/Sound_and_Spectrum.cpp b/fon/Sound_and_Spectrum.cpp
index 40bc124..5467e50 100644
--- a/fon/Sound_and_Spectrum.cpp
+++ b/fon/Sound_and_Spectrum.cpp
@@ -1,6 +1,6 @@
 /* Sound_and_Spectrum.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -71,7 +71,7 @@ Spectrum Sound_to_Spectrum (Sound me, int fast) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Spectrum.");
+		Melder_throw (me, U": not converted to Spectrum.");
 	}
 }
 
@@ -81,7 +81,7 @@ Sound Spectrum_to_Sound (Spectrum me) {
 		double lastFrequency = my x1 + (my nx - 1) * my dx;
 		int originalNumberOfSamplesProbablyOdd = im [my nx] != 0.0 || my xmax - lastFrequency > 0.25 * my dx;
 		if (my x1 != 0.0)
-			Melder_throw ("A Fourier-transformable Spectrum must have a first frequency of 0 Hz, not ", my x1, L" Hz.");
+			Melder_throw (U"A Fourier-transformable Spectrum must have a first frequency of 0 Hz, not ", my x1, U" Hz.");
 		long numberOfSamples = 2 * my nx - ( originalNumberOfSamplesProbablyOdd ? 1 : 2 );
 		autoSound thee = Sound_createSimple (1, 1 / my dx, numberOfSamples * my dx);
 		double *amp = thy z [1];
@@ -100,7 +100,7 @@ Sound Spectrum_to_Sound (Spectrum me) {
 		NUMrealft (amp, numberOfSamples, -1);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Sound.");
+		Melder_throw (me, U": not converted to Sound.");
 	}
 }
 
@@ -138,30 +138,30 @@ Spectrum Spectrum_lpcSmoothing (Spectrum me, int numberOfPeaks, double preemphas
 		im [halfnfft + 1] = 0.0;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not smoothed.");
+		Melder_throw (me, U": not smoothed.");
 	}
 }
 
-Sound Sound_filter_formula (Sound me, const wchar_t *formula, Interpreter interpreter) {
+Sound Sound_filter_formula (Sound me, const char32 *formula, Interpreter interpreter) {
 	try {
 		autoSound thee = Data_copy (me);
 		if (my ny == 1) {
-			autoSpectrum spec = Sound_to_Spectrum (me, TRUE);
-			Matrix_formula ((Matrix) spec.peek(), formula, interpreter, NULL);
+			autoSpectrum spec = Sound_to_Spectrum (me, true);
+			Matrix_formula ((Matrix) spec.peek(), formula, interpreter, nullptr);
 			autoSound him = Spectrum_to_Sound (spec.peek());
 			NUMvector_copyElements (his z [1], thy z [1], 1, thy nx);
 		} else {
 			for (long ichan = 1; ichan <= my ny; ichan ++) {
 				autoSound channel = Sound_extractChannel (me, ichan);
-				autoSpectrum spec = Sound_to_Spectrum (channel.peek(), TRUE);
-				Matrix_formula ((Matrix) spec.peek(), formula, interpreter, NULL);
+				autoSpectrum spec = Sound_to_Spectrum (channel.peek(), true);
+				Matrix_formula ((Matrix) spec.peek(), formula, interpreter, nullptr);
 				autoSound him = Spectrum_to_Sound (spec.peek());
 				NUMvector_copyElements (his z [1], thy z [ichan], 1, thy nx);
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered (with formula).");
+		Melder_throw (me, U": not filtered (with formula).");
 	}
 }
 
@@ -169,14 +169,14 @@ Sound Sound_filter_passHannBand (Sound me, double fmin, double fmax, double smoo
 	try {
 		autoSound thee = Data_copy (me);
 		if (my ny == 1) {
-			autoSpectrum spec = Sound_to_Spectrum (me, TRUE);
+			autoSpectrum spec = Sound_to_Spectrum (me, true);
 			Spectrum_passHannBand (spec.peek(), fmin, fmax, smooth);
 			autoSound him = Spectrum_to_Sound (spec.peek());
 			NUMvector_copyElements (his z [1], thy z [1], 1, thy nx);
 		} else {
 			for (long ichan = 1; ichan <= my ny; ichan ++) {
 				autoSound channel = Sound_extractChannel (me, ichan);
-				autoSpectrum spec = Sound_to_Spectrum (channel.peek(), TRUE);
+				autoSpectrum spec = Sound_to_Spectrum (channel.peek(), true);
 				Spectrum_passHannBand (spec.peek(), fmin, fmax, smooth);
 				autoSound him = Spectrum_to_Sound (spec.peek());
 				NUMvector_copyElements (his z [1], thy z [ichan], 1, thy nx);
@@ -184,7 +184,7 @@ Sound Sound_filter_passHannBand (Sound me, double fmin, double fmax, double smoo
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered (pass Hann band).");
+		Melder_throw (me, U": not filtered (pass Hann band).");
 	}
 }
 
@@ -192,14 +192,14 @@ Sound Sound_filter_stopHannBand (Sound me, double fmin, double fmax, double smoo
 	try {
 		autoSound thee = Data_copy (me);
 		if (my ny == 1) {
-			autoSpectrum spec = Sound_to_Spectrum (me, TRUE);
+			autoSpectrum spec = Sound_to_Spectrum (me, true);
 			Spectrum_stopHannBand (spec.peek(), fmin, fmax, smooth);
 			autoSound him = Spectrum_to_Sound (spec.peek());
 			NUMvector_copyElements (his z [1], thy z [1], 1, thy nx);
 		} else {
 			for (long ichan = 1; ichan <= my ny; ichan ++) {
 				autoSound channel = Sound_extractChannel (me, ichan);
-				autoSpectrum spec = Sound_to_Spectrum (channel.peek(), TRUE);
+				autoSpectrum spec = Sound_to_Spectrum (channel.peek(), true);
 				Spectrum_stopHannBand (spec.peek(), fmin, fmax, smooth);
 				autoSound him = Spectrum_to_Sound (spec.peek());
 				NUMvector_copyElements (his z [1], thy z [ichan], 1, thy nx);
@@ -207,7 +207,7 @@ Sound Sound_filter_stopHannBand (Sound me, double fmin, double fmax, double smoo
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not filtered (stop Hann band).");
+		Melder_throw (me, U": not filtered (stop Hann band).");
 	}
 }
 
diff --git a/fon/Sound_and_Spectrum.h b/fon/Sound_and_Spectrum.h
index 3ff8e72..24c966e 100644
--- a/fon/Sound_and_Spectrum.h
+++ b/fon/Sound_and_Spectrum.h
@@ -1,6 +1,6 @@
 /* Sound_and_Spectrum.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,6 +30,6 @@ Spectrum Spectrum_lpcSmoothing (Spectrum me, int numberOfPeaks, double preemphas
 
 Sound Sound_filter_passHannBand (Sound me, double fmin, double fmax, double smooth);
 Sound Sound_filter_stopHannBand (Sound me, double fmin, double fmax, double smooth);
-Sound Sound_filter_formula (Sound me, const wchar_t *formula, Interpreter interpreter);
+Sound Sound_filter_formula (Sound me, const char32 *formula, Interpreter interpreter);
 
 /* End of file Sound_and_Spectrum.h */
diff --git a/fon/Sound_audio.cpp b/fon/Sound_audio.cpp
index 43c823d..ce4c402 100644
--- a/fon/Sound_audio.cpp
+++ b/fon/Sound_audio.cpp
@@ -1,6 +1,6 @@
 /* Sound_audio.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -134,7 +134,7 @@ static int portaudioStreamCallback (
 		memcpy (info -> buffer + 1 + info -> numberOfSamplesRead, input, 2 * dsamples);
 		info -> numberOfSamplesRead += dsamples;
 		short *input2 = (short*) input;
-		trace ("read %d samples: %d, %d, %d...", (int) dsamples, (int) input2 [0], (int) input2 [1], (int) input2 [3]);
+		trace (U"read ", dsamples, U" samples: ", input2 [0], U", ", input2 [1], U", ", input2 [3], U"...");
 		if (info -> numberOfSamplesRead >= info -> numberOfSamples) return paComplete;
 	} else /*if (info -> numberOfSamplesRead >= info -> numberOfSamples)*/ {
 		info -> numberOfSamplesRead = info -> numberOfSamples;
@@ -144,20 +144,27 @@ static int portaudioStreamCallback (
 }
 
 Sound Sound_recordFixedTime (int inputSource, double gain, double balance, double sampleRate, double duration) {
-	bool inputUsesPortAudio = MelderAudio_getInputUsesPortAudio ();
+	bool inputUsesPortAudio =
+		#if defined (_WIN32)
+			MelderAudio_getInputSoundSystem () == kMelder_inputSoundSystem_MME_VIA_PORTAUDIO;
+		#elif defined (macintosh)
+			MelderAudio_getInputSoundSystem () == kMelder_inputSoundSystem_COREAUDIO_VIA_PORTAUDIO;
+		#else
+			MelderAudio_getInputSoundSystem () == kMelder_inputSoundSystem_ALSA_VIA_PORTAUDIO;
+		#endif
 	PaStream *portaudioStream = NULL;
 	#if defined (macintosh)
 	#elif defined (_WIN32)
 		HWAVEIN hWaveIn = 0;
 	#else
-		int fd = -1;   /* Other systems use stream I/O with a file descriptor. */
+		int fd = -1;   // other systems use stream I/O with a file descriptor
 		int fd_mixer = -1;
 	#endif
 	try {
 		long numberOfSamples, i;
-		int mulaw = FALSE;
-		int can16bit = TRUE;
-		int fakeMonoByStereo = FALSE;   /* Will be set to TRUE for systems (like MacOS X) that do not allow direct mono recording. */
+		bool mulaw = false;
+		bool can16bit = true;
+		bool fakeMonoByStereo = false;   // will be set to `true` for systems (like MacOS X) that do not allow direct mono recording
 
 		/* Declare system-dependent data structures. */
 
@@ -184,7 +191,7 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 		/* Check representation of shorts. */
 
 		if (sizeof (short) != 2)
-			Melder_throw ("Cannot record a sound on this computer.");
+			Melder_throw (U"Cannot record a sound on this computer.");
 
 		/* Check sampling frequency. */
 
@@ -209,7 +216,7 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 			#endif
 		}
 		if (! supportsSamplingFrequency)
-			Melder_throw ("Your audio hardware does not support a sampling frequency of ", sampleRate, " Hz.");
+			Melder_throw (U"Your audio hardware does not support a sampling frequency of ", sampleRate, U" Hz.");
 
 		/*
 		 * Open phase 1.
@@ -220,7 +227,7 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 			if (! paInitialized) {
 				PaError err = Pa_Initialize ();
 				if (err)
-					Melder_throw ("Pa_Initialize: ", Pa_GetErrorText (err));
+					Melder_throw (U"Pa_Initialize: ", Melder_peek8to32 (Pa_GetErrorText (err)));
 				paInitialized = true;
 			}
 		} else {
@@ -231,12 +238,12 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 				fd = open (DEV_AUDIO, O_RDONLY);
 				if (fd == -1) {
 					if (errno == EBUSY)
-						Melder_throw ("Audio device in use by another program.");
+						Melder_throw (U"Audio device in use by another program.");
 					else
 						#ifdef linux
-							Melder_throw ("Cannot open audio device.\nPlease switch on PortAudio in the Sound Recording Preferences.");
+							Melder_throw (U"Cannot open audio device.\nPlease switch on PortAudio in the Sound Recording Preferences.");
 						#else
-							Melder_throw ("Cannot open audio device.");
+							Melder_throw (U"Cannot open audio device.");
 						#endif
 				}
 				/* The device immediately started recording into its buffer, but probably at the wrong rate etc. */
@@ -251,17 +258,17 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 
 		if (inputUsesPortAudio) {
 			if (inputSource < 1 || inputSource > Pa_GetDeviceCount ())
-				Melder_throw ("Unknown device #", inputSource, ".");
+				Melder_throw (U"Unknown device #", inputSource, U".");
 			streamParameters. device = inputSource - 1;
 		} else {
 			#if defined (macintosh)
 			#elif defined (linux)
 				fd_mixer = open ("/dev/mixer", O_WRONLY);		
 				if (fd_mixer == -1)
-					Melder_throw ("Cannot open /dev/mixer.");
+					Melder_throw (U"Cannot open /dev/mixer.");
 				dev_mask = inputSource == 1 ? SOUND_MASK_MIC : SOUND_MASK_LINE;
 				if (ioctl (fd_mixer, SOUND_MIXER_WRITE_RECSRC, & dev_mask) == -1)
-					Melder_throw ("Cannot set recording device in mixer");		
+					Melder_throw (U"Cannot set recording device in mixer");
 			#endif
 		}
 
@@ -284,11 +291,11 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 				if (inputSource == 1) {			
 					/* MIC */		       
 					if (ioctl (fd_mixer, MIXER_WRITE (SOUND_MIXER_MIC), & val) == -1)
-						Melder_throw ("Cannot set gain and balance.");
+						Melder_throw (U"Cannot set gain and balance.");
 				} else {
 					/* LINE */
 					if (ioctl (fd_mixer, MIXER_WRITE (SOUND_MIXER_LINE), & val) == -1)
-						Melder_throw ("Cannot set gain and balance.");
+						Melder_throw (U"Cannot set gain and balance.");
 				}
 				close (fd_mixer);
 				fd_mixer = -1;
@@ -304,7 +311,7 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 			#elif defined (linux)
 				int sampleRate_int = (int) sampleRate;
 				if (ioctl (fd, SNDCTL_DSP_SPEED, & sampleRate_int) == -1)
-					Melder_throw ("Cannot set sampling frequency to ", sampleRate, " Hz.");
+					Melder_throw (U"Cannot set sampling frequency to ", sampleRate, U" Hz.");
 			#elif defined (_WIN32)
 				waveFormat. nSamplesPerSec = sampleRate;
 			#endif
@@ -319,7 +326,7 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 			#elif defined (linux)
 				val = 1;
 				if (ioctl (fd, SNDCTL_DSP_CHANNELS, & val) == -1)
-					Melder_throw ("Cannot set to mono.");
+					Melder_throw (U"Cannot set to mono.");
 			#elif defined (_WIN32)
 				waveFormat. nChannels = 1;
 			#endif
@@ -338,7 +345,7 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 					val = AFMT_S16_LE;
 				#endif
 				if (ioctl (fd, SNDCTL_DSP_SETFMT, & val) == -1)
-					Melder_throw ("Cannot set 16-bit linear.");
+					Melder_throw (U"Cannot set 16-bit linear.");
 			#elif defined (_WIN32)
 				waveFormat. wFormatTag = WAVE_FORMAT_PCM;
 				waveFormat. wBitsPerSample = 16;
@@ -349,9 +356,9 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 
 		/* Create a buffer for recording, and the resulting sound. */
 
-		numberOfSamples = floor (sampleRate * duration + 0.5);
+		numberOfSamples = lround (sampleRate * duration);
 		if (numberOfSamples < 1)
-			Melder_throw ("Duration too short.");
+			Melder_throw (U"Duration too short.");
 		autoNUMvector <short> buffer (1, numberOfSamples * (fakeMonoByStereo ? 2 : 1));
 		autoSound me = Sound_createSimple (1, numberOfSamples / sampleRate, sampleRate);   // STEREO BUG
 		Melder_assert (my nx == numberOfSamples);
@@ -377,20 +384,20 @@ Sound Sound_recordFixedTime (int inputSource, double gain, double balance, doubl
 			PaError err = Pa_OpenStream (& portaudioStream, & streamParameters, NULL,
 				sampleRate, 0, paNoFlag, portaudioStreamCallback, (void *) & info);
 			if (err)
-				Melder_throw ("open ", Pa_GetErrorText (err));
+				Melder_throw (U"open ", Melder_peek8to32 (Pa_GetErrorText (err)));
 			Pa_StartStream (portaudioStream);
 			if (err)
-				Melder_throw ("start ", Pa_GetErrorText (err));
+				Melder_throw (U"start ", Melder_peek8to32 (Pa_GetErrorText (err)));
 		} else {
 			#if defined (macintosh)
 			#elif defined (_WIN32)
 				waveFormat. cbSize = 0;
 				err = waveInOpen (& hWaveIn, WAVE_MAPPER, & waveFormat, 0, 0, CALLBACK_NULL);
 				if (err != MMSYSERR_NOERROR)
-					Melder_throw ("Error ", err, " while opening.");
+					Melder_throw (U"Error ", err, U" while opening.");
 			#endif
 		}
-for (i = 1; i <= numberOfSamples; i ++) trace ("Started %d", (int) buffer [i]);
+for (i = 1; i <= numberOfSamples; i ++) trace (U"Started ", buffer [i]);
 
 		/* Read the sound into the buffer. */
 
@@ -400,7 +407,7 @@ for (i = 1; i <= numberOfSamples; i ++) trace ("Started %d", (int) buffer [i]);
 				//Pa_Sleep (1);
 				//Melder_casual ("filled %ld/%ld", getNumberOfSamplesRead (& info), numberOfSamples);
 			}
-for (i = 1; i <= numberOfSamples; i ++) trace ("Recorded %d", (int) buffer [i]);
+for (i = 1; i <= numberOfSamples; i ++) trace (U"Recorded ", buffer [i]);
 		} else {
 			#if defined (macintosh)
 			#elif defined (_WIN32)
@@ -412,17 +419,17 @@ for (i = 1; i <= numberOfSamples; i ++) trace ("Recorded %d", (int) buffer [i]);
 				waveHeader. reserved = 0;
 				err = waveInPrepareHeader (hWaveIn, & waveHeader, sizeof (WAVEHDR));
 				if (err != MMSYSERR_NOERROR)
-					Melder_throw ("Error ", err, " while preparing header.");
+					Melder_throw (U"Error ", err, U" while preparing header.");
 				err = waveInAddBuffer (hWaveIn, & waveHeader, sizeof (WAVEHDR));
 				if (err != MMSYSERR_NOERROR)
-					Melder_throw ("Error ", err, " while listening.");
+					Melder_throw (U"Error ", err, U" while listening.");
 				err = waveInStart (hWaveIn);
 				if (err != MMSYSERR_NOERROR)
-					Melder_throw ("Error ", err, " while starting.");
+					Melder_throw (U"Error ", err, U" while starting.");
 					while (! (waveHeader. dwFlags & WHDR_DONE)) { Pa_Sleep (1); }
 				err = waveInUnprepareHeader (hWaveIn, & waveHeader, sizeof (WAVEHDR));
 				if (err != MMSYSERR_NOERROR)
-					Melder_throw ("Error ", err, " while unpreparing header.");
+					Melder_throw (U"Error ", err, U" while unpreparing header.");
 			#else
 				if (mulaw)
 					read (fd, (char *) & buffer [1], numberOfSamples);
@@ -465,7 +472,7 @@ for (i = 1; i <= numberOfSamples; i ++) trace ("Recorded %d", (int) buffer [i]);
 			#elif defined (_WIN32)
 				err = waveInClose (hWaveIn);
 				if (err != MMSYSERR_NOERROR)
-					Melder_throw ("Error ", err, " while closing.");
+					Melder_throw (U"Error ", err, U" while closing.");
 			#else
 				close (fd);
 			#endif
@@ -487,7 +494,7 @@ for (i = 1; i <= numberOfSamples; i ++) trace ("Recorded %d", (int) buffer [i]);
 				if (fd != -1) close (fd);
 			#endif
 		}
-		Melder_throw ("Sound not recorded.");
+		Melder_throw (U"Sound not recorded.");
 	}
 }
 
@@ -520,7 +527,7 @@ void Sound_playPart (Sound me, double tmin, double tmax,
 	int (*callback) (void *closure, int phase, double tmin, double tmax, double t), void *closure)
 {
 	try {
-		long ifsamp = floor (1.0 / my dx + 0.5), bestSampleRate = MelderAudio_getOutputBestSampleRate (ifsamp);
+		long ifsamp = lround (1.0 / my dx), bestSampleRate = MelderAudio_getOutputBestSampleRate (ifsamp);
 		if (ifsamp == bestSampleRate) {
 			struct SoundPlay *thee = (struct SoundPlay *) & thePlayingSound;
 			double *fromLeft = my z [1], *fromRight = my ny > 1 ? my z [2] : NULL;
@@ -569,7 +576,7 @@ void Sound_playPart (Sound me, double tmin, double tmax,
 			Sound_playPart (resampled.peek(), tmin, tmax, callback, closure);   // recursively
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not played.");
+		Melder_throw (me, U": not played.");
 	}
 }
 
diff --git a/fon/Sound_enhance.cpp b/fon/Sound_enhance.cpp
index 4ecd91e..e6185bb 100644
--- a/fon/Sound_enhance.cpp
+++ b/fon/Sound_enhance.cpp
@@ -1,6 +1,6 @@
 /* Sound_enhance.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,7 +35,7 @@
 Sound Sound_lengthen_overlapAdd (Sound me, double fmin, double fmax, double factor) {
 	try {
 		if (my ny > 1)
-			Melder_throw ("Overlap-add works only on mono sounds.");
+			Melder_throw (U"Overlap-add works only on mono sounds.");
 		autoSound sound = Data_copy (me);
 		Vector_subtractMean (sound.peek());
 		autoPitch pitch = Sound_to_Pitch (sound.peek(), 0.8 / fmin, fmin, fmax);
@@ -46,7 +46,7 @@ Sound Sound_lengthen_overlapAdd (Sound me, double fmin, double fmax, double fact
 		autoSound thee = Sound_Point_Pitch_Duration_to_Sound (sound.peek(), pulses.peek(), pitchTier.peek(), duration.peek(), 1.5 / fmin);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not lengthened.");
+		Melder_throw (me, U": not lengthened.");
 	}
 }
 
@@ -60,7 +60,7 @@ Sound Sound_deepenBandModulation (Sound me, double enhancement_dB,
 
 		for (long channel = 1; channel <= my ny; channel ++) {
 			autoSound channelSound = Sound_extractChannel (me, channel);
-			autoSpectrum orgspec = Sound_to_Spectrum (channelSound.peek(), TRUE);
+			autoSpectrum orgspec = Sound_to_Spectrum (channelSound.peek(), true);
 
 			/*
 			 * Keep the part of the sound that is outside the filter bank.
@@ -72,7 +72,7 @@ Sound Sound_deepenBandModulation (Sound me, double enhancement_dB,
 			double *amp = thy z [channel];
 			for (long i = 1; i <= n; i ++) amp [i] = filtered -> z [1] [i];
 
-			autoMelderProgress progress (L"Deepen band modulation...");
+			autoMelderProgress progress (U"Deepen band modulation...");
 			double fmin = flow;
 			while (fmin < fhigh) {
 				/*
@@ -81,7 +81,7 @@ Sound Sound_deepenBandModulation (Sound me, double enhancement_dB,
 				double fmid_bark = NUMhertzToBark (fmin) + 0.5, ceiling;
 				double fmax = NUMbarkToHertz (NUMhertzToBark (fmin) + 1);
 				if (fmax > fhigh) fmax = fhigh;
-				Melder_progress (fmin / fhigh, L"Band: ", Melder_fixed (fmin, 0), L" ... ", Melder_fixed (fmax, 0), L" Hz");
+				Melder_progress (fmin / fhigh, U"Band: ", Melder_fixed (fmin, 0), U" ... ", Melder_fixed (fmax, 0), U" Hz");
 				NUMmatrix_copyElements (orgspec -> z, spec -> z, 1, 2, 1, spec -> nx);
 				Spectrum_passHannBand (spec.peek(), fmin, fmax, bandSmoothing);
 				autoSound band = Spectrum_to_Sound (spec.peek());
@@ -92,7 +92,7 @@ Sound Sound_deepenBandModulation (Sound me, double enhancement_dB,
 				n = intensity -> nx;
 				amp = intensity -> z [1];
 				for (long i = 1; i <= n; i ++) amp [i] = 10 * log10 (amp [i] * amp [i] + 1e-6);
-				autoSpectrum intensityFilter = Sound_to_Spectrum (intensity.peek(), TRUE);
+				autoSpectrum intensityFilter = Sound_to_Spectrum (intensity.peek(), true);
 				n = intensityFilter -> nx;
 				for (long i = 1; i <= n; i ++) {
 					double frequency = intensityFilter -> x1 + (i - 1) * intensityFilter -> dx;
@@ -126,7 +126,7 @@ Sound Sound_deepenBandModulation (Sound me, double enhancement_dB,
 		thy x1 = my x1;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": band modulation not deepened.");
+		Melder_throw (me, U": band modulation not deepened.");
 	}
 }
 
diff --git a/fon/Sound_enums.h b/fon/Sound_enums.h
index d1f80a2..dcbf8c5 100644
--- a/fon/Sound_enums.h
+++ b/fon/Sound_enums.h
@@ -1,6 +1,6 @@
 /* Sound_enums.h
  *
- * Copyright (C) 1992-2010 Paul Boersma
+ * Copyright (C) 1992-2010,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,36 +17,32 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-/*
- * pb 2010/03/31
- */
-
 enums_begin (kSound_windowShape, 0)
-	enums_add (kSound_windowShape, 0, RECTANGULAR, L"rectangular")
-	enums_add (kSound_windowShape, 1, TRIANGULAR, L"triangular")
-	enums_add (kSound_windowShape, 2, PARABOLIC, L"parabolic")
-	enums_add (kSound_windowShape, 3, HANNING, L"Hanning")
-	enums_add (kSound_windowShape, 4, HAMMING, L"Hamming")
-	enums_add (kSound_windowShape, 5, GAUSSIAN_1, L"Gaussian1")
-	enums_add (kSound_windowShape, 6, GAUSSIAN_2, L"Gaussian2")
-	enums_add (kSound_windowShape, 7, GAUSSIAN_3, L"Gaussian3")
-	enums_add (kSound_windowShape, 8, GAUSSIAN_4, L"Gaussian4")
-	enums_add (kSound_windowShape, 9, GAUSSIAN_5, L"Gaussian5")
-	enums_add (kSound_windowShape, 10, KAISER_1, L"Kaiser1")
-	enums_add (kSound_windowShape, 11, KAISER_2, L"Kaiser2")
+	enums_add (kSound_windowShape, 0, RECTANGULAR, U"rectangular")
+	enums_add (kSound_windowShape, 1, TRIANGULAR, U"triangular")
+	enums_add (kSound_windowShape, 2, PARABOLIC, U"parabolic")
+	enums_add (kSound_windowShape, 3, HANNING, U"Hanning")
+	enums_add (kSound_windowShape, 4, HAMMING, U"Hamming")
+	enums_add (kSound_windowShape, 5, GAUSSIAN_1, U"Gaussian1")
+	enums_add (kSound_windowShape, 6, GAUSSIAN_2, U"Gaussian2")
+	enums_add (kSound_windowShape, 7, GAUSSIAN_3, U"Gaussian3")
+	enums_add (kSound_windowShape, 8, GAUSSIAN_4, U"Gaussian4")
+	enums_add (kSound_windowShape, 9, GAUSSIAN_5, U"Gaussian5")
+	enums_add (kSound_windowShape, 10, KAISER_1, U"Kaiser1")
+	enums_add (kSound_windowShape, 11, KAISER_2, U"Kaiser2")
 enums_end (kSound_windowShape, 11, RECTANGULAR)
 
 enums_begin (kSounds_convolve_scaling, 1)
-	enums_add (kSounds_convolve_scaling, 1, INTEGRAL, L"integral")
-	enums_add (kSounds_convolve_scaling, 2, SUM, L"sum")
-	enums_add (kSounds_convolve_scaling, 3, NORMALIZE, L"normalize")
-	enums_add (kSounds_convolve_scaling, 4, PEAK_099, L"peak 0.99")
+	enums_add (kSounds_convolve_scaling, 1, INTEGRAL, U"integral")
+	enums_add (kSounds_convolve_scaling, 2, SUM, U"sum")
+	enums_add (kSounds_convolve_scaling, 3, NORMALIZE, U"normalize")
+	enums_add (kSounds_convolve_scaling, 4, PEAK_099, U"peak 0.99")
 enums_end (kSounds_convolve_scaling, 4, PEAK_099)
 
 enums_begin (kSounds_convolve_signalOutsideTimeDomain, 1)
-	enums_add (kSounds_convolve_signalOutsideTimeDomain, 1, ZERO, L"zero")
-	enums_add (kSounds_convolve_signalOutsideTimeDomain, 2, SIMILAR, L"similar")
-	//enums_add (kSounds_convolve_signalOutsideTimeDomain, 3, PERIODIC, L"periodic")
+	enums_add (kSounds_convolve_signalOutsideTimeDomain, 1, ZERO, U"zero")
+	enums_add (kSounds_convolve_signalOutsideTimeDomain, 2, SIMILAR, U"similar")
+	//enums_add (kSounds_convolve_signalOutsideTimeDomain, 3, PERIODIC, U"periodic")
 enums_end (kSounds_convolve_signalOutsideTimeDomain, 2, ZERO)
 
 /* End of file Sound_enums.h */
diff --git a/fon/Sound_files.cpp b/fon/Sound_files.cpp
index 8be0de7..c9fd2d6 100644
--- a/fon/Sound_files.cpp
+++ b/fon/Sound_files.cpp
@@ -75,17 +75,19 @@ Sound Sound_readFromSoundFile (MelderFile file) {
 		int32 numberOfSamples;
 		int fileType = MelderFile_checkSoundFile (file, & numberOfChannels, & encoding, & sampleRate, & startOfData, & numberOfSamples);
 		if (fileType == 0)
-			Melder_throw ("Not an audio file.");
+			Melder_throw (U"Not an audio file.");
 		if (fseek (file -> filePointer, startOfData, SEEK_SET) == EOF)   // start from beginning of Data Chunk
-			Melder_throw ("No data in audio file.");
+			Melder_throw (U"No data in audio file.");
+		if (numberOfSamples < 1)
+			Melder_throw (U"Audio file contains 0 samples.");
 		autoSound me = Sound_createSimple (numberOfChannels, numberOfSamples / sampleRate, sampleRate);
 		if (encoding == Melder_SHORTEN || encoding == Melder_POLYPHONE)
-			Melder_throw ("Cannot unshorten. Write to paul.boersma at uva.nl for more information.");
+			Melder_throw (U"Cannot unshorten. Write to paul.boersma at uva.nl for more information.");
 		Melder_readAudioToFloat (file -> filePointer, numberOfChannels, encoding, my z, numberOfSamples);
 		mfile.close ();
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not read from sound file ", file, ".");
+		Melder_throw (U"Sound not read from sound file ", file, U".");
 	}
 }
 
@@ -108,7 +110,7 @@ Sound Sound_readFromSesamFile (MelderFile file) {
 			numberOfSamples = (header [6] << 8) - header [68];
 		}
 		if (numberOfSamples < 1 || numberOfSamples > 1000000000 || samplingFrequency < 10.0 || samplingFrequency > 100000000.0)
-			Melder_throw ("Not a correct SESAM or LVS file.");
+			Melder_throw (U"Not a correct SESAM or LVS file.");
 		autoSound me = Sound_createSimple (1, numberOfSamples / samplingFrequency, samplingFrequency);
 		for (int32_t i = 1; i <= numberOfSamples; i ++) {
 			my z [1] [i] = (double) bingeti2LE (f) * (1.0 / 2048);   // 12 bits
@@ -116,7 +118,7 @@ Sound Sound_readFromSesamFile (MelderFile file) {
 		f.close (file);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not read from Sesam file ", file, ".");
+		Melder_throw (U"Sound not read from Sesam file ", file, U".");
 	}
 }
 
@@ -132,14 +134,14 @@ Sound Sound_readFromBellLabsFile (MelderFile file) {
 		 */
 		char tag [200];
 		if (fread (tag, 1, 16, f) < 16 || ! strnequ (tag, "SIG\n", 4))
-			Melder_throw ("Not a Bell-Labs sound file.");
+			Melder_throw (U"Not a Bell-Labs sound file.");
 		char *endOfTag = strchr (tag + 4, '\n');
 		if (endOfTag == NULL)
-			Melder_throw ("Second line missing or too long.");
+			Melder_throw (U"Second line missing or too long.");
 		unsigned long tagLength = (endOfTag - tag) + 1;   // probably 12
 		unsigned long headerLength = atol (tag + 4);
 		if (headerLength <= 0)
-			Melder_throw ("Wrong header-length info.");
+			Melder_throw (U"Wrong header-length info.");
 
 		/*
 		 * Read data from header.
@@ -147,7 +149,7 @@ Sound Sound_readFromBellLabsFile (MelderFile file) {
 		 */
 		autostring8 lines = Melder_calloc (char, headerLength + 1);
 		if (fread (lines.peek(), 1, headerLength, f) < headerLength)
-			Melder_throw ("Header too short.");
+			Melder_throw (U"Header too short.");
 		unsigned long numberOfSamples = 0;
 		char *psamples = & lines [-1];
 		while ((psamples = strstr (psamples + 1, "samples ")) != NULL)   // take last occurrence
@@ -158,7 +160,7 @@ Sound Sound_readFromBellLabsFile (MelderFile file) {
 			numberOfSamples = (ftell (f) - tagLength - headerLength) / 2;
 		}
 		if (numberOfSamples < 1)
-			Melder_throw ("No samples found.");
+			Melder_throw (U"No samples found.");
 		double samplingFrequency = 0.0;
 		char *pfrequency = & lines [-1];
 		while ((pfrequency = strstr (pfrequency + 1, "frequency ")) != NULL)   // take last occurrence
@@ -181,12 +183,12 @@ Sound Sound_readFromBellLabsFile (MelderFile file) {
 		f.close (file);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not read from Bell Labs sound file ", file, ".");
+		Melder_throw (U"Sound not read from Bell Labs sound file ", file, U".");
 	}
 }
 
 static void readError () {
-	Melder_throw ("Error reading bytes from file.");
+	Melder_throw (U"Error reading bytes from file.");
 }
 
 Sound Sound_readFromKayFile (MelderFile file) {
@@ -198,22 +200,22 @@ Sound Sound_readFromKayFile (MelderFile file) {
 		char data [100];
 		if (fread (data, 1, 12, f) < 12) readError ();
 		if (! strnequ (data, "FORMDS16", 8))
-			Melder_throw ("Not a KAY DS-16 file.");
+			Melder_throw (U"Not a KAY DS-16 file.");
 
 		/* HEDR or HDR8 chunk */
 
 		if (fread (data, 1, 4, f) < 4) readError ();
 		if (! strnequ (data, "HEDR", 4) && ! strnequ (data, "HDR8", 4))
-			Melder_throw ("Missing HEDR or HDR8 chunk. Please report to paul.boersma at uva.nl.");
+			Melder_throw (U"Missing HEDR or HDR8 chunk. Please report to paul.boersma at uva.nl.");
 		uint32_t chunkSize = bingetu4LE (f);
 		if (chunkSize & 1) ++ chunkSize;
 		if (chunkSize != 32 && chunkSize != 44)
-			Melder_throw ("Unknown chunk size %ld. Please report to paul.boersma at uva.nl.", chunkSize);
+			Melder_throw (U"Unknown chunk size %ld. Please report to paul.boersma at uva.nl.", chunkSize);
 		if (fread (data, 1, 20, f) < 20) readError ();
 		double samplingFrequency = bingetu4LE (f);   // converting up (from 32 to 53 bits)
 		uint32_t numberOfSamples = bingetu4LE (f);
 		if (samplingFrequency <= 0 || samplingFrequency > 1e7 || numberOfSamples >= 1000000000)
-			Melder_throw ("Not a correct Kay file.");
+			Melder_throw (U"Not a correct Kay file.");
 		int16_t tmp1 = bingeti2LE (f);
 		int16_t tmp2 = bingeti2LE (f);
 		long numberOfChannels = tmp1 == -1 || tmp2 == -1 ? 1 : 2;
@@ -224,8 +226,8 @@ Sound Sound_readFromKayFile (MelderFile file) {
 
 		if (fread (data, 1, 4, f) < 4) readError ();
 		while (! strnequ (data, "SDA_", 4) && ! strnequ (data, "SD_B", 4)) {
-			if (feof (f))
-				Melder_throw ("Missing or unreadable SD chunk. Please report to paul.boersma at uva.nl.");
+			if (feof ((FILE *) f))
+				Melder_throw (U"Missing or unreadable SD chunk. Please report to paul.boersma at uva.nl.");
 			chunkSize = bingetu4LE (f);
 			if (chunkSize & 1) ++ chunkSize;
 			if (fread (data, 1, chunkSize, f) < chunkSize) readError ();
@@ -233,7 +235,7 @@ Sound Sound_readFromKayFile (MelderFile file) {
 		}
 		chunkSize = bingetu4LE (f);
 		if (chunkSize != numberOfSamples * 2)
-			Melder_throw ("Incomplete SD chunk. Please report to paul.boersma at uva.nl.");
+			Melder_throw (U"Incomplete SD chunk. Please report to paul.boersma at uva.nl.");
 
 		autoSound me = Sound_createSimple (numberOfChannels, numberOfSamples / samplingFrequency, samplingFrequency);
 		for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
@@ -244,7 +246,7 @@ Sound Sound_readFromKayFile (MelderFile file) {
 		f.close (file);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not read from Kay file ", file, ".");
+		Melder_throw (U"Sound not read from Kay file ", file, U".");
 	}
 }
 
@@ -260,19 +262,19 @@ Sound Sound_readFromRawAlawFile (MelderFile file) {
 		f.close (file);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Sound not read from raw A-law file ", file, ".");
+		Melder_throw (U"Sound not read from raw A-law file ", file, U".");
 	}
 }
 
 void Sound_writeToAudioFile (Sound me, MelderFile file, int audioFileType, int numberOfBitsPerSamplePoint) {
 	try {
 		autoMelderFile mfile = MelderFile_create (file);
-		MelderFile_writeAudioFileHeader (file, audioFileType, floor (1.0 / my dx + 0.5), my nx, my ny, numberOfBitsPerSamplePoint);
-		MelderFile_writeFloatToAudio (file, my ny, Melder_defaultAudioFileEncoding (audioFileType, numberOfBitsPerSamplePoint), my z, my nx, TRUE);
-		MelderFile_writeAudioFileTrailer (file, audioFileType, floor (1.0 / my dx + 0.5), my nx, my ny, numberOfBitsPerSamplePoint);
+		MelderFile_writeAudioFileHeader (file, audioFileType, lround (1.0 / my dx), my nx, my ny, numberOfBitsPerSamplePoint);
+		MelderFile_writeFloatToAudio (file, my ny, Melder_defaultAudioFileEncoding (audioFileType, numberOfBitsPerSamplePoint), my z, my nx, true);
+		MelderFile_writeAudioFileTrailer (file, audioFileType, lround (1.0 / my dx), my nx, my ny, numberOfBitsPerSamplePoint);
 		mfile.close ();
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to 16-bit sound file ", file, ".");
+		Melder_throw (me, U": not written to 16-bit sound file ", file, U".");
 	}
 }
 
@@ -282,26 +284,26 @@ void Sound_writeToSesamFile (Sound me, MelderFile file) {
 		long header [1 + 128], tail;
 		for (long i = 1; i <= 128; i ++) header [i] = 0;
 		/* ILS header. */
-			header [6] = ((my nx - 1) >> 8) + 1;   /* Number of disk blocks. */
-			header [64] = 32149;   /* ILS magic. */
+			header [6] = ((my nx - 1) >> 8) + 1;   // number of disk blocks
+			header [64] = 32149;   // ILS magic
 		/* LVS header. */
-			header [62] = round (1 / my dx);   /* Sampling frequency, rounded to n Hz. */
-			header [63] = -32000;   /* Magic: "sampled signal." */
-			header [66] = 2047;   /* Maximum absolute value: 12 bits. */
-			header [67] = 2047;   /* LVS magic. */
-			header [68] = my nx % 256;   /* Number of samples in last block. */
-			header [69] = 1;   /* ? */
+			header [62] = lround (1 / my dx);   // sampling frequency, rounded to n Hz
+			header [63] = -32000;   // magic: "sampled signal"
+			header [66] = 2047;   // maximum absolute value: 12 bits
+			header [67] = 2047;   // LVS magic
+			header [68] = my nx % 256;   // number of samples in last block
+			header [69] = 1;   // ?
 		/* Sesam header. */
-			header [126] = round (1 / my dx);   /* Sampling frequency, rounded to n Hz. */
-			header [127] = my nx;   /* Number of samples. */
+			header [126] = lround (1 / my dx);   // sampling frequency, rounded to n Hz
+			header [127] = my nx;   // number of samples
 		for (long i = 1; i <= 128; i ++) binputi4LE (header [i], f);
-		for (long i = 1; i <= my nx; i ++) binputi2LE (round (my z [1] [i] * 2048), f);
+		for (long i = 1; i <= my nx; i ++) binputi2LE (lround (my z [1] [i] * 2048), f);
 		tail = 256 - my nx % 256;
 		if (tail == 256) tail = 0;
-		for (long i = 1; i <= tail; i ++) binputi2LE (0, f);   /* Pad last block with zeroes. */
+		for (long i = 1; i <= tail; i ++) binputi2LE (0, f);   // pad last block with zeroes
 		f.close (file);
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to Sesam file ", file, ".");
+		Melder_throw (me, U": not written to Sesam file ", file, U".");
 	}
 }
 
@@ -320,11 +322,11 @@ void Sound_writeToKayFile (Sound me, MelderFile file) {
 		strcpy (date, ctime (& today));	
 		fwrite (date+4, 1, 20, file -> filePointer);   // skip weekday
 
-		binputi4LE (round (1 / my dx), file -> filePointer);   // sampling frequency
+		binputi4LE (lround (1 / my dx), file -> filePointer);   // sampling frequency
 		binputi4LE (my nx, file -> filePointer);   // number of samples
 		int maximumA = 0;
 		for (long i = 1; i <= my nx; i ++) {
-			long value = floor (my z [1] [i] * 32768 + 0.5);
+			long value = lround (my z [1] [i] * 32768);
 			if (value < - maximumA) maximumA = - value;
 			if (value > maximumA) maximumA = value;
 		}
@@ -334,7 +336,7 @@ void Sound_writeToKayFile (Sound me, MelderFile file) {
 		} else {
 			int maximumB = 0;
 			for (long i = 1; i <= my nx; i ++) {
-				long value = round (my z [2] [i] * 32768);
+				long value = lround (my z [2] [i] * 32768);
 				if (value < - maximumB) maximumB = - value;
 				if (value > maximumB) maximumB = value;
 			}
@@ -343,22 +345,22 @@ void Sound_writeToKayFile (Sound me, MelderFile file) {
 		fwrite ("SDA_", 1, 4, file -> filePointer);
 		binputi4LE (my nx * 2, file -> filePointer);   // chunk size
 
-		MelderFile_writeFloatToAudio (file, 1, Melder_LINEAR_16_LITTLE_ENDIAN, my z, my nx, TRUE);
+		MelderFile_writeFloatToAudio (file, 1, Melder_LINEAR_16_LITTLE_ENDIAN, my z, my nx, true);
 		if (my ny > 1)
-			MelderFile_writeFloatToAudio (file, 1, Melder_LINEAR_16_LITTLE_ENDIAN, my z + 1, my nx, TRUE);
+			MelderFile_writeFloatToAudio (file, 1, Melder_LINEAR_16_LITTLE_ENDIAN, my z + 1, my nx, true);
 		mfile.close ();
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to Kay sound file ", file, ".");
+		Melder_throw (me, U": not written to Kay sound file ", file, U".");
 	}
 }
 
 void Sound_writeToRawSoundFile (Sound me, MelderFile file, int encoding) {
 	try {
 		autoMelderFile mfile = MelderFile_create (file);
-		MelderFile_writeFloatToAudio (file, my ny, encoding, my z, my nx, TRUE);
+		MelderFile_writeFloatToAudio (file, my ny, encoding, my z, my nx, true);
 		mfile.close ();
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to raw sound file ", file, ".");
+		Melder_throw (me, U": not written to raw sound file ", file, U".");
 	}
 }
 
diff --git a/fon/Sound_to_Cochleagram.cpp b/fon/Sound_to_Cochleagram.cpp
index 2bed453..953e5fe 100644
--- a/fon/Sound_to_Cochleagram.cpp
+++ b/fon/Sound_to_Cochleagram.cpp
@@ -1,6 +1,6 @@
 /* Sound_to_Cochleagram.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,15 +36,15 @@
 Cochleagram Sound_to_Cochleagram (Sound me, double dt, double df, double dt_window, double forwardMaskingTime) {
 	try {
 		double duration = my nx * my dx;
-		long nFrames = 1 + floor ((duration - dt_window) / dt);
-		long nsamp_window = floor (dt_window / my dx), halfnsamp_window = nsamp_window / 2 - 1;
-		long nf = floor (25.6 / df + 0.5);
-		double dampingFactor = forwardMaskingTime > 0.0 ? exp (- dt / forwardMaskingTime) : 0.0;   /* Default 30 ms. */
+		long nFrames = 1 + (long) floor ((duration - dt_window) / dt);
+		long nsamp_window = (long) floor (dt_window / my dx), halfnsamp_window = nsamp_window / 2 - 1;
+		long nf = lround (25.6 / df);
+		double dampingFactor = forwardMaskingTime > 0.0 ? exp (- dt / forwardMaskingTime) : 0.0;   // default 30 ms
 		double integrationCorrection = 1.0 - dampingFactor;
 
 		nsamp_window = halfnsamp_window * 2;
 		if (nFrames < 2) return NULL;
-		double t1 = my x1 + 0.5 * (duration - my dx - (nFrames - 1) * dt); /* Centre of first frame. */
+		double t1 = my x1 + 0.5 * (duration - my dx - (nFrames - 1) * dt);   // centre of first frame
 		autoCochleagram thee = Cochleagram_create (my xmin, my xmax, nFrames, dt, t1, df, nf);
 		autoSound window = Sound_createSimple (1, nsamp_window * my dx, 1.0 / my dx);
 		for (long iframe = 1; iframe <= nFrames; iframe ++) {
@@ -54,11 +54,14 @@ Cochleagram Sound_to_Cochleagram (Sound me, double dt, double df, double dt_wind
 			long startSample = rightSample - halfnsamp_window;
 			long endSample = rightSample + halfnsamp_window;
 			if (startSample < 1) {
-				Melder_casual ("Start sample too small: %ld instead of 1.", startSample);
+				Melder_casual (U"Start sample too small: ", startSample,
+					U" instead of 1.");
 				startSample = 1;
 			}
 			if (endSample > my nx) {
-				Melder_casual ("End sample too small: %ld instead of %ld.", endSample, my nx);
+				Melder_casual (U"End sample too small: ", endSample,
+					U" instead of ", my nx,
+					U".");
 				endSample = my nx;
 			}
 
@@ -67,7 +70,7 @@ Cochleagram Sound_to_Cochleagram (Sound me, double dt, double df, double dt_wind
 				window -> z [1] [i] =
 					( my ny == 1 ? my z[1][i+startSample-1] : 0.5 * (my z[1][i+startSample-1] + my z[2][i+startSample-1]) ) *
 					(0.5 - 0.5 * cos (2 * NUMpi * i / (nsamp_window + 1)));
-			autoSpectrum spec = Sound_to_Spectrum (window.peek(), TRUE);
+			autoSpectrum spec = Sound_to_Spectrum (window.peek(), true);
 			autoExcitation excitation = Spectrum_to_Excitation (spec.peek(), df);
 			for (long ifreq = 1; ifreq <= nf; ifreq ++)
 				thy z [ifreq] [iframe] = excitation -> z [1] [ifreq] + ( iframe > 1 ? dampingFactor * thy z [ifreq] [iframe - 1] : 0 );
@@ -77,7 +80,7 @@ Cochleagram Sound_to_Cochleagram (Sound me, double dt, double df, double dt_wind
 				thy z [ifreq] [iframe] *= integrationCorrection;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Cochleagram.");
+		Melder_throw (me, U": not converted to Cochleagram.");
 	}
 }
 
@@ -109,9 +112,9 @@ Cochleagram Sound_to_Cochleagram_edb
 	try {
 		double duration_seconds = my xmax;
 		if (dtime < my dx) dtime = my dx;
-		long ntime = floor (duration_seconds / dtime + 0.5);
+		long ntime = lround (duration_seconds / dtime);
 		if (ntime < 2) return NULL;
-		long nfreq = floor (25.6 / dfreq + 0.5);   // 25.6 Bark = highest frequency
+		long nfreq = lround (25.6 / dfreq);   // 25.6 Bark = highest frequency
 
 		autoCochleagram thee = Cochleagram_create (my xmin, my xmax, ntime, dtime, 0.5 * dtime, dfreq, nfreq);
 
@@ -183,11 +186,11 @@ Cochleagram Sound_to_Cochleagram_edb
 						mean /= n;
 					} else {
 						double mu = floor ((i1 + i2) / 2.0);
-						long muint = mu, dint = d;
+						long muint = (long) mu, dint = (long) d;
 						for (long isamp = muint - dint; isamp <= muint + dint; isamp ++) {
 							double y = 0;
 							if (isamp < 1 || isamp > basil -> nx)
-								Melder_casual ("isamp %ld", isamp);
+								Melder_casual (U"isamp ", isamp);
 							else
 								y = basil -> z [1] [isamp];
 							mean += y * onebyoneminexpmin6 * (exp (factor * (isamp - muint) *
@@ -201,7 +204,7 @@ Cochleagram Sound_to_Cochleagram_edb
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Cochleagram (edb).");
+		Melder_throw (me, U": not converted to Cochleagram (edb).");
 	}
 }
 
diff --git a/fon/Sound_to_Formant.cpp b/fon/Sound_to_Formant.cpp
index 9c2cfcc..0bb3b6b 100644
--- a/fon/Sound_to_Formant.cpp
+++ b/fon/Sound_to_Formant.cpp
@@ -1,6 +1,6 @@
 /* Sound_to_Formant.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -75,7 +75,7 @@ static void burg (double sample [], long nsamp_window, double cof [], int nPoles
 	 * Second pass: fill in the formants.
 	 */
 	int iformant = 0;
-	for (int i = roots -> min; i <= roots -> max; i ++) if (roots -> v [i]. im >= 0) {
+	for (int i = roots -> min; i <= roots -> max; i ++) if (roots -> v [i]. im >= 0.0) {
 		double f = fabs (atan2 (roots -> v [i].im, roots -> v [i].re)) * nyquistFrequency / NUMpi;
 		if (f >= safetyMargin && f <= nyquistFrequency - safetyMargin) {
 			Formant_Formant formant = & frame -> formant [++ iformant];
@@ -84,7 +84,7 @@ static void burg (double sample [], long nsamp_window, double cof [], int nPoles
 				log (roots -> v [i].re * roots -> v [i].re + roots -> v [i].im * roots -> v [i].im) * nyquistFrequency / NUMpi;
 		}
 	}
-	Melder_assert (iformant == frame -> nFormants);   /* May fail if some frequency is NaN. */
+	Melder_assert (iformant == frame -> nFormants);   // may fail if some frequency is NaN
 }
 
 static int findOneZero (int ijt, double vcx [], double a, double b, double *zero) {
@@ -94,25 +94,29 @@ static int findOneZero (int ijt, double vcx [], double a, double b, double *zero
 		fa = vcx [k] + a * fa;
 		fb = vcx [k] + b * fb;
 	}
-	if (fa * fb >= 0.0) {   /* There should be a zero between a and b. */
-		Melder_casual ("There is no zero between %.8g and %.8g.\n"
-			"   The function values are %.8g and %.8g, respectively.",
-			a, b, fa, fb);
+	if (fa * fb >= 0.0) {   // there should be a zero between a and b
+		Melder_casual (
+			U"There is no zero between ,", Melder_single (a),
+			U" and ", Melder_single (b),
+			U".\n    The function values are ", Melder_single (fa),
+			U" and ", Melder_single (fb),
+			U", respectively."
+		);
 		return 0;
 	}
 	do {
 		fx = 0.0;
 		/*x = fa == fb ? 0.5 * (a + b) : a + fa * (a - b) / (fb - fa);*/
-		x = 0.5 * (a + b);   /* Simple bisection. */
+		x = 0.5 * (a + b);   // simple bisection
 		for (k = ijt; k >= 0; k --) fx = vcx [k] + x * fx;
 		if (fa * fx > 0.0) { a = x; fa = fx; } else { b = x; fb = fx; }
 	} while (fabs (fx) > 1e-5);
 	*zero = x;
-	return 1;   /* OK */
+	return 1;   // OK
 }
 
 static int findNewZeroes (int ijt, double ppORIG [], int degree,
-	double zeroes [])   /* In / out */
+	double zeroes [])   // In / out
 {
 	static double cosa [7] [7] = {
 		{  1,   0,   0,   0,   0,   0,   0 },
@@ -136,7 +140,10 @@ static int findNewZeroes (int ijt, double ppORIG [], int degree,
 	newZeroes [0] = 1.0;
 	for (i = 1; i <= half_degree; i ++) {
 		if (! findOneZero (ijt, px, zeroes [i - 1], zeroes [i], & newZeroes [i])) {
-			Melder_casual ("Degree %d not completed.", (int) degree);
+			Melder_casual (
+				U"Degree ", degree,
+				U" not completed."
+			);
 			return 0;
 		}
 	}
@@ -148,9 +155,9 @@ static int findNewZeroes (int ijt, double ppORIG [], int degree,
 }
 
 static int splitLevinson (
-	double xw [], long nx,	/* The windowed signal xw [1..nx] */
-	int ncof,	/* The coefficients cof [1..ncof] */
-	Formant_Frame frame, double nyquistFrequency)	/* Put the results here. */
+	double xw [], long nx,   // the windowed signal xw [1..nx]
+	int ncof,   // the coefficients cof [1..ncof]
+	Formant_Frame frame, double nyquistFrequency)   // put the results here
 {
 	int result = 1;
 	double rx [100], zeroes [33];
@@ -188,7 +195,7 @@ static int splitLevinson (
 			if (degree == 1) {
 				(void) 0;
 			} else if (degree == 2) {
-				zeroes [0] = 1.0;   /* Starting values. */
+				zeroes [0] = 1.0;   // starting values
 				zeroes [1] = 0.5 - 0.5 * pnu [1];
 				zeroes [2] = -1.0;
 			}
@@ -268,7 +275,7 @@ static Formant Sound_to_Formant_any_inline (Sound me, double dt_in, int numberOf
 	long nsamp_window = (long) floor (dt_window / my dx), halfnsamp_window = nsamp_window / 2;
 
 	if (nsamp_window < numberOfPoles + 1)
-		Melder_throw ("Window too short.");
+		Melder_throw (U"Window too short.");
 	t1 = my x1 + 0.5 * (duration - my dx - (nFrames - 1) * dt);   // centre of first frame
 	if (nFrames < 1) {
 		nFrames = 1;
@@ -281,7 +288,7 @@ static Formant Sound_to_Formant_any_inline (Sound me, double dt_in, int numberOf
 	autoNUMvector <double> frame (1, nsamp_window);
 	autoNUMvector <double> cof (1, numberOfPoles);   // superfluous if which==2, but nobody uses that anyway
 
-	autoMelderProgress progress (L"Formant analysis...");
+	autoMelderProgress progress (U"Formant analysis...");
 
 	/* Pre-emphasis. */
 	Sound_preEmphasis (me, preemphasisFrequency);
@@ -289,7 +296,7 @@ static Formant Sound_to_Formant_any_inline (Sound me, double dt_in, int numberOf
 	/* Gaussian window. */
 	for (long i = 1; i <= nsamp_window; i ++) {
 		double imid = 0.5 * (nsamp_window + 1), edge = exp (-12.0);
-		window [i] = (exp (-48.0 * (i - imid) * (i - imid) / (nsamp_window + 1) / (nsamp_window + 1)) - edge) / (1 - edge);
+		window [i] = (exp (-48.0 * (i - imid) * (i - imid) / (nsamp_window + 1) / (nsamp_window + 1)) - edge) / (1.0 - edge);
 	}
 
 	for (long iframe = 1; iframe <= nFrames; iframe ++) {
@@ -308,7 +315,7 @@ static Formant Sound_to_Formant_any_inline (Sound me, double dt_in, int numberOf
 			}
 		}
 		if (maximumIntensity == HUGE_VAL)
-			Melder_throw ("Sound contains infinities.");
+			Melder_throw (U"Sound contains infinities.");
 		thy d_frames [iframe]. intensity = maximumIntensity;
 		if (maximumIntensity == 0.0) continue;   // Burg cannot stand all zeroes
 
@@ -321,10 +328,13 @@ static Formant Sound_to_Formant_any_inline (Sound me, double dt_in, int numberOf
 		} else if (which == 2) {
 			if (! splitLevinson (frame.peek(), endSample - startSample + 1, numberOfPoles, & thy d_frames [iframe], 0.5 / my dx)) {
 				Melder_clearError ();
-				Melder_casual ("(Sound_to_Formant:) Analysis results of frame %ld will be wrong.", iframe);
+				Melder_casual (U"(Sound_to_Formant:)"
+					U" Analysis results of frame ", iframe,
+					U" will be wrong."
+				);
 			}
 		}
-		Melder_progress ((double) iframe / (double) nFrames, L"Formant analysis: frame ", Melder_integer (iframe));
+		Melder_progress ((double) iframe / (double) nFrames, U"Formant analysis: frame ", iframe);
 	}
 	Formant_sort (thee.peek());
 	return thee.transfer();
@@ -348,7 +358,7 @@ Formant Sound_to_Formant_burg (Sound me, double dt, double nFormants, double max
 	try {
 		return Sound_to_Formant_any (me, dt, (int) (2 * nFormants), maximumFrequency, halfdt_window, 1, preemphasisFrequency, 50.0);
 	} catch (MelderError) {
-		Melder_throw (me, ": formant analysis (Burg) not performed.");
+		Melder_throw (me, U": formant analysis (Burg) not performed.");
 	}
 }
 
@@ -356,7 +366,7 @@ Formant Sound_to_Formant_keepAll (Sound me, double dt, double nFormants, double
 	try {
 		return Sound_to_Formant_any (me, dt, (int) (2 * nFormants), maximumFrequency, halfdt_window, 1, preemphasisFrequency, 0.0);
 	} catch (MelderError) {
-		Melder_throw (me, ": formant analysis (keep all) not performed.");
+		Melder_throw (me, U": formant analysis (keep all) not performed.");
 	}
 }
 
@@ -364,7 +374,7 @@ Formant Sound_to_Formant_willems (Sound me, double dt, double nFormants, double
 	try {
 		return Sound_to_Formant_any (me, dt, (int) (2 * nFormants), maximumFrequency, halfdt_window, 2, preemphasisFrequency, 50.0);
 	} catch (MelderError) {
-		Melder_throw (me, ": formant analysis (Burg) not performed.");
+		Melder_throw (me, U": formant analysis (Burg) not performed.");
 	}
 }
 
diff --git a/fon/Sound_to_Harmonicity.cpp b/fon/Sound_to_Harmonicity.cpp
index bc8a8bc..5fab19b 100644
--- a/fon/Sound_to_Harmonicity.cpp
+++ b/fon/Sound_to_Harmonicity.cpp
@@ -1,6 +1,6 @@
 /* Sound_to_Harmonicity.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -44,7 +44,7 @@ Harmonicity Sound_to_Harmonicity_ac (Sound me, double dt, double minimumPitch,
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": harmonicity analysis (ac) not performed.");
+		Melder_throw (me, U": harmonicity analysis (ac) not performed.");
 	}
 }
 
@@ -66,7 +66,7 @@ Harmonicity Sound_to_Harmonicity_cc (Sound me, double dt, double minimumPitch,
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": harmonicity analysis (cc) not performed.");
+		Melder_throw (me, U": harmonicity analysis (cc) not performed.");
 	}
 }
 
diff --git a/fon/Sound_to_Harmonicity_GNE.cpp b/fon/Sound_to_Harmonicity_GNE.cpp
index e69c9f8..4faac83 100644
--- a/fon/Sound_to_Harmonicity_GNE.cpp
+++ b/fon/Sound_to_Harmonicity_GNE.cpp
@@ -1,6 +1,6 @@
 /* Sound_to_Harmonicity_GNE.cpp
  *
- * Copyright (C) 1999-2011 Paul Boersma
+ * Copyright (C) 1999-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -61,7 +61,7 @@ Matrix Sound_to_Harmonicity_GNE (Sound me,
 {
 	try {
 		autoSound envelope [1+100];
-		long nenvelopes = (fmax - fmin) / step;
+		long nenvelopes = (long) floor ((fmax - fmin) / step);
 		for (long ienvelope = 1; ienvelope <= 100; ienvelope ++)
 			Melder_assert (envelope [ienvelope].peek() == NULL);
 
@@ -88,7 +88,7 @@ Matrix Sound_to_Harmonicity_GNE (Sound me,
 		 */
 		autoLPC lpc = Sound_to_LPC_auto (original10k.peek(), 13, 30e-3, 10e-3, 1e9);
 		autoSound flat = LPC_and_Sound_filterInverse (lpc.peek(), original10k.peek());
-		autoSpectrum flatSpectrum = Sound_to_Spectrum (flat.peek(), TRUE);
+		autoSpectrum flatSpectrum = Sound_to_Spectrum (flat.peek(), true);
 		autoSpectrum hilbertSpectrum = Data_copy (flatSpectrum.peek());
 		for (long col = 1; col <= hilbertSpectrum -> nx; col ++) {
 			hilbertSpectrum -> z [1] [col] = flatSpectrum -> z [2] [col];
@@ -96,7 +96,7 @@ Matrix Sound_to_Harmonicity_GNE (Sound me,
 		}
 		double fmid = fmin;
 		long ienvelope = 1;
-		autoMelderMonitor monitor (L"Computing Hilbert envelopes...");
+		autoMelderMonitor monitor (U"Computing Hilbert envelopes...");
 		while (fmid <= fmax) {
 			/*
 			 * Step 3: calculate Hilbert envelopes of bands.
@@ -114,11 +114,11 @@ Matrix Sound_to_Harmonicity_GNE (Sound me,
 			autoSound band = Spectrum_to_Sound (bandSpectrum.peek());
 			/*if (graphics) {
 				Graphics_clearWs (graphics);
-				Spectrum_draw (bandSpectrum, graphics, 0, 5000, 0, 0, TRUE);
+				Spectrum_draw (bandSpectrum, graphics, 0, 5000, 0, 0, true);
 			}*/
-			Melder_monitor (ienvelope / (nenvelopes + 1.0), L"Computing Hilbert envelope ", Melder_integer (ienvelope), L"...");
+			Melder_monitor (ienvelope / (nenvelopes + 1.0), U"Computing Hilbert envelope ", ienvelope, U"...");
 			autoSound hilbertBand = Spectrum_to_Sound (hilbertBandSpectrum.peek());
-			envelope [ienvelope].reset (Sound_extractPart (band.peek(), 0, duration, kSound_windowShape_RECTANGULAR, 1.0, TRUE));
+			envelope [ienvelope].reset (Sound_extractPart (band.peek(), 0, duration, kSound_windowShape_RECTANGULAR, 1.0, true));
 			/*
 			 * 3c: Compute the Hilbert envelope of the band-passed flat signal.
 			 */
@@ -141,7 +141,7 @@ Matrix Sound_to_Harmonicity_GNE (Sound me,
 		autoMatrix cc = Matrix_createSimple (nenvelopes, nenvelopes);
 		for (long row = 2; row <= nenvelopes; row ++) {
 			for (long col = 1; col <= row - 1; col ++) {
-				autoSound crossCorrelation = Sounds_crossCorrelate_short (envelope [row].peek(), envelope [col].peek(), -3.1e-4, 3.1e-4, TRUE);
+				autoSound crossCorrelation = Sounds_crossCorrelate_short (envelope [row].peek(), envelope [col].peek(), -3.1e-4, 3.1e-4, true);
 				/*
 				 * Step 5: the maximum of each correlation function
 				 */
@@ -155,7 +155,7 @@ Matrix Sound_to_Harmonicity_GNE (Sound me,
 		 */	
 		for (long row = 2; row <= nenvelopes; row ++) {
 			for (long col = 1; col <= row - 1; col ++) {
-				if (abs (row - col) < bandwidth / 2 / step) {
+				if (labs (row - col) < bandwidth / 2 / step) {
 					cc -> z [row] [col] = 0.0;
 				}
 			}
@@ -163,7 +163,7 @@ Matrix Sound_to_Harmonicity_GNE (Sound me,
 
 		return cc.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Harmonicity (GNE).");
+		Melder_throw (me, U": not converted to Harmonicity (GNE).");
 	}
 }
 
diff --git a/fon/Sound_to_Intensity.cpp b/fon/Sound_to_Intensity.cpp
index d3f14fe..c9f580f 100644
--- a/fon/Sound_to_Intensity.cpp
+++ b/fon/Sound_to_Intensity.cpp
@@ -1,6 +1,6 @@
 /* Sound_to_Intensity.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,16 +34,16 @@
 
 #include "Sound_to_Intensity.h"
 
-static Intensity Sound_to_Intensity_ (Sound me, double minimumPitch, double timeStep, int subtractMeanPressure) {
+static autoIntensity Sound_to_Intensity_ (Sound me, double minimumPitch, double timeStep, int subtractMeanPressure) {
 	try {
 		/*
 		 * Preconditions.
 		 */
-		if (! NUMdefined (minimumPitch)) Melder_throw ("(Sound-to-Intensity:) Minimum pitch undefined.");
-		if (! NUMdefined (timeStep)) Melder_throw ("(Sound-to-Intensity:) Time step undefined.");
-		if (timeStep < 0.0) Melder_throw ("(Sound-to-Intensity:) Time step should be zero or positive instead of ", timeStep, ".");
-		if (my dx <= 0.0) Melder_throw ("(Sound-to-Intensity:) The Sound's time step should be positive.");
-		if (minimumPitch <= 0.0) Melder_throw ("(Sound-to-Intensity:) Minimum pitch should be positive.");
+		if (! NUMdefined (minimumPitch)) Melder_throw (U"(Sound-to-Intensity:) Minimum pitch undefined.");
+		if (! NUMdefined (timeStep)) Melder_throw (U"(Sound-to-Intensity:) Time step undefined.");
+		if (timeStep < 0.0) Melder_throw (U"(Sound-to-Intensity:) Time step should be zero or positive instead of ", timeStep, U".");
+		if (my dx <= 0.0) Melder_throw (U"(Sound-to-Intensity:) The Sound's time step should be positive.");
+		if (minimumPitch <= 0.0) Melder_throw (U"(Sound-to-Intensity:) Minimum pitch should be positive.");
 		/*
 		 * Defaults.
 		 */
@@ -52,7 +52,7 @@ static Intensity Sound_to_Intensity_ (Sound me, double minimumPitch, double time
 		double windowDuration = 6.4 / minimumPitch;
 		Melder_assert (windowDuration > 0.0);
 		double halfWindowDuration = 0.5 * windowDuration;
-		long halfWindowSamples = halfWindowDuration / my dx;
+		long halfWindowSamples = (long) floor (halfWindowDuration / my dx);
 		autoNUMvector <double> amplitude (- halfWindowSamples, halfWindowSamples);
 		autoNUMvector <double> window (- halfWindowSamples, halfWindowSamples);
 
@@ -66,8 +66,8 @@ static Intensity Sound_to_Intensity_ (Sound me, double minimumPitch, double time
 		try {
 			Sampled_shortTermAnalysis (me, windowDuration, timeStep, & numberOfFrames, & thyFirstTime);
 		} catch (MelderError) {
-			Melder_throw ("The duration of the sound in an intensity analysis should be at least 6.4 divided by the minimum pitch (", minimumPitch, " Hz), "
-				"i.e. at least ", 6.4 / minimumPitch, " s, instead of ", my xmax - my xmin, " s.");
+			Melder_throw (U"The duration of the sound in an intensity analysis should be at least 6.4 divided by the minimum pitch (", minimumPitch, U" Hz), "
+				U"i.e. at least ", 6.4 / minimumPitch, U" s, instead of ", my xmax - my xmin, U" s.");
 		}
 		autoIntensity thee = Intensity_create (my xmin, my xmax, numberOfFrames, timeStep, thyFirstTime);
 		for (long iframe = 1; iframe <= numberOfFrames; iframe ++) {
@@ -98,12 +98,12 @@ static Intensity Sound_to_Intensity_ (Sound me, double minimumPitch, double time
 				}
 			}
 			intensity = sumxw / sumw;
-			if (intensity != 0.0) intensity /= 4e-10;
+			intensity /= 4e-10;
 			thy z [1] [iframe] = intensity < 1e-30 ? -300 : 10 * log10 (intensity);
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": intensity analysis not performed.");
+		Melder_throw (me, U": intensity analysis not performed.");
 	}
 }
 
@@ -119,13 +119,13 @@ Intensity Sound_to_Intensity (Sound me, double minimumPitch, double timeStep, in
 	}
 }
 
-IntensityTier Sound_to_IntensityTier (Sound me, double minimumPitch, double timeStep, int subtractMean) {
+autoIntensityTier Sound_to_IntensityTier (Sound me, double minimumPitch, double timeStep, int subtractMean) {
 	try {
 		autoIntensity intensity = Sound_to_Intensity (me, minimumPitch, timeStep, subtractMean);
 		autoIntensityTier thee = Intensity_downto_IntensityTier (intensity.peek());
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": no IntensityTier created.");
+		Melder_throw (me, U": no IntensityTier created.");
 	}
 }
 
diff --git a/fon/Sound_to_Intensity.h b/fon/Sound_to_Intensity.h
index 1cbdda4..5d84a9b 100644
--- a/fon/Sound_to_Intensity.h
+++ b/fon/Sound_to_Intensity.h
@@ -1,6 +1,6 @@
 /* Sound_to_Intensity.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,6 +46,6 @@ Intensity Sound_to_Intensity (Sound me, double minimumPitch, double timeStep, in
 		actual window duration = 64 ms;
 */
 
-IntensityTier Sound_to_IntensityTier (Sound me, double minimumPitch, double timeStep, int subtractMean);
+autoIntensityTier Sound_to_IntensityTier (Sound me, double minimumPitch, double timeStep, int subtractMean);
 
 /* End of file Sound_to_Intensity.h */
diff --git a/fon/Sound_to_Pitch.cpp b/fon/Sound_to_Pitch.cpp
index 829c1ff..cbad748 100644
--- a/fon/Sound_to_Pitch.cpp
+++ b/fon/Sound_to_Pitch.cpp
@@ -1,6 +1,6 @@
 /* Sound_to_Pitch.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -111,7 +111,7 @@ static void Sound_into_PitchFrame (Sound me, Pitch_Frame pitchFrame, double t,
 		if (localSpan > my nx + 1 - startSample) localSpan = my nx + 1 - startSample;
 		localMaximumLag = localSpan - nsamp_window;
 		offset = startSample - 1;
-		double sumx2 = 0;   /* Sum of squares. */
+		double sumx2 = 0;   // sum of squares
 		for (long channel = 1; channel <= my ny; channel ++) {
 			double *amp = my z [channel] + offset;
 			for (long i = 1; i <= nsamp_window; i ++) {
@@ -119,7 +119,7 @@ static void Sound_into_PitchFrame (Sound me, Pitch_Frame pitchFrame, double t,
 				sumx2 += x * x;
 			}
 		}
-		double sumy2 = sumx2;   /* At zero lag, these are still equal. */
+		double sumy2 = sumx2;   // at zero lag, these are still equal
 		r [0] = 1.0;
 		for (long i = 1; i <= localMaximumLag; i ++) {
 			double product = 0.0;
@@ -145,12 +145,12 @@ static void Sound_into_PitchFrame (Sound me, Pitch_Frame pitchFrame, double t,
 			ac [i] = 0.0;
 		}
 		for (long channel = 1; channel <= my ny; channel ++) {
-			NUMfft_forward (fftTable, frame [channel]);   /* Complex spectrum. */
-			ac [1] += frame [channel] [1] * frame [channel] [1];   /* DC component. */
+			NUMfft_forward (fftTable, frame [channel]);   // complex spectrum
+			ac [1] += frame [channel] [1] * frame [channel] [1];   // DC component
 			for (long i = 2; i < nsampFFT; i += 2) {
-				ac [i] += frame [channel] [i] * frame [channel] [i] + frame [channel] [i+1] * frame [channel] [i+1]; /* Power spectrum. */
+				ac [i] += frame [channel] [i] * frame [channel] [i] + frame [channel] [i+1] * frame [channel] [i+1];   // power spectrum
 			}
-			ac [nsampFFT] += frame [channel] [nsampFFT] * frame [channel] [nsampFFT];   /* Nyquist frequency. */
+			ac [nsampFFT] += frame [channel] [nsampFFT] * frame [channel] [nsampFFT];   // Nyquist frequency
 		}
 		NUMfft_backward (fftTable, ac);   /* Autocorrelation. */
 
@@ -167,7 +167,7 @@ static void Sound_into_PitchFrame (Sound me, Pitch_Frame pitchFrame, double t,
 	 * Register the first candidate, which is always present: voicelessness.
 	 */
 	pitchFrame->nCandidates = 1;
-	pitchFrame->candidate[1].frequency = 0.0;   /* Voiceless: always present. */
+	pitchFrame->candidate[1].frequency = 0.0;   // voiceless: always present
 	pitchFrame->candidate[1].strength = 0.0;
 
 	/*
@@ -182,8 +182,8 @@ static void Sound_into_PitchFrame (Sound me, Pitch_Frame pitchFrame, double t,
 	 */
 	imax [1] = 0;
 	for (long i = 2; i < maximumLag && i < brent_ixmax; i ++)
-		if (r [i] > 0.5 * voicingThreshold && /* Not too unvoiced? */
-			r [i] > r [i-1] && r [i] >= r [i+1])   /* Maximum? */
+		if (r [i] > 0.5 * voicingThreshold &&   // not too unvoiced?
+			r [i] > r [i-1] && r [i] >= r [i+1])   // maximum?
 	{
 		int place = 0;
 
@@ -203,7 +203,7 @@ static void Sound_into_PitchFrame (Sound me, Pitch_Frame pitchFrame, double t,
 		/*
 		 * Find a place for this maximum.
 		 */
-		if (pitchFrame->nCandidates < maxnCandidates) { /* Is there still a free place? */
+		if (pitchFrame->nCandidates < maxnCandidates) {   // is there still a free place?
 			place = ++ pitchFrame->nCandidates;
 		} else {
 			/* Try the place of the weakest candidate so far. */
@@ -219,7 +219,7 @@ static void Sound_into_PitchFrame (Sound me, Pitch_Frame pitchFrame, double t,
 			if (strengthOfMaximum - octaveCost * NUMlog2 (minimumPitch / frequencyOfMaximum) <= weakest)
 				place = 0;
 		}
-		if (place) {   /* Have we found a place for this candidate? */
+		if (place) {   // have we found a place for this candidate?
 			pitchFrame->candidate[place].frequency = frequencyOfMaximum;
 			pitchFrame->candidate[place].strength = strengthOfMaximum;
 			imax [place] = i;
@@ -322,7 +322,7 @@ static MelderThread_RETURN_TYPE Sound_into_Pitch (Sound_into_Pitch_Args me)
 		if (my isMainThread) {
 			try {
 				Melder_progress (0.1 + 0.8 * (iframe - my firstFrame) / (my lastFrame - my firstFrame),
-					L"Sound to Pitch: analysing ", Melder_integer (my lastFrame), L" frames");
+					U"Sound to Pitch: analysing ", my lastFrame, U" frames");
 			} catch (MelderError) {
 				*my cancelled = 1;
 				throw;
@@ -341,7 +341,7 @@ static MelderThread_RETURN_TYPE Sound_into_Pitch (Sound_into_Pitch_Args me)
 	MelderThread_RETURN;
 }
 
-Pitch Sound_to_Pitch_any (Sound me,
+autoPitch Sound_to_Pitch_any (Sound me,
 	double dt, double minimumPitch, double periodsPerWindow, int maxnCandidates,
 	int method,
 	double silenceThreshold, double voicingThreshold,
@@ -350,21 +350,21 @@ Pitch Sound_to_Pitch_any (Sound me,
 	try {
 		autoNUMfft_Table fftTable;
 		double duration, t1;
-		double dt_window;   /* Window length in seconds. */
-		long nsamp_window, halfnsamp_window;   /* Number of samples per window. */
+		double dt_window;   // window length in seconds
+		long nsamp_window, halfnsamp_window;   // number of samples per window
 		long nFrames, minimumLag, maximumLag;
 		long nsampFFT;
 		double interpolation_depth;
-		long nsamp_period, halfnsamp_period;   /* Number of samples in longest period. */
+		long nsamp_period, halfnsamp_period;   // number of samples in longest period
 		long brent_ixmax, brent_depth;
 		double globalPeak;
 
 		Melder_assert (maxnCandidates >= 2);
 		Melder_assert (method >= AC_HANNING && method <= FCC_ACCURATE);
 
-		if (maxnCandidates < ceiling / minimumPitch) maxnCandidates = ceiling / minimumPitch;
+		if (maxnCandidates < ceiling / minimumPitch) maxnCandidates = (long) floor (ceiling / minimumPitch);
 
-		if (dt <= 0.0) dt = periodsPerWindow / minimumPitch / 4.0;   /* e.g. 3 periods, 75 Hz: 10 milliseconds. */
+		if (dt <= 0.0) dt = periodsPerWindow / minimumPitch / 4.0;   // e.g. 3 periods, 75 Hz: 10 milliseconds
 
 		switch (method) {
 			case AC_HANNING:
@@ -372,9 +372,9 @@ Pitch Sound_to_Pitch_any (Sound me,
 				interpolation_depth = 0.5;
 				break;
 			case AC_GAUSS:
-				periodsPerWindow *= 2;   /* Because Gaussian window is twice as long. */
+				periodsPerWindow *= 2;   // because Gaussian window is twice as long
 				brent_depth = NUM_PEAK_INTERPOLATE_SINC700;
-				interpolation_depth = 0.25;   /* Because Gaussian window is twice as long. */
+				interpolation_depth = 0.25;   // because Gaussian window is twice as long
 				break;
 			case FCC_NORMAL:
 				brent_depth = NUM_PEAK_INTERPOLATE_SINC70;
@@ -387,14 +387,14 @@ Pitch Sound_to_Pitch_any (Sound me,
 		}
 		duration = my dx * my nx;
 		if (minimumPitch < periodsPerWindow / duration)
-			Melder_throw ("To analyse this Sound, ", L_LEFT_DOUBLE_QUOTE, "minimum pitch", L_RIGHT_DOUBLE_QUOTE, " must not be less than ", periodsPerWindow / duration, " Hz.");
+			Melder_throw (U"To analyse this Sound, ", U_LEFT_DOUBLE_QUOTE, U"minimum pitch", U_RIGHT_DOUBLE_QUOTE, U" must not be less than ", periodsPerWindow / duration, U" Hz.");
 
 		/*
 		 * Determine the number of samples in the longest period.
 		 * We need this to compute the local mean of the sound (looking one period in both directions),
 		 * and to compute the local peak of the sound (looking half a period in both directions).
 		 */
-		nsamp_period = floor (1 / my dx / minimumPitch);
+		nsamp_period = (long) floor (1 / my dx / minimumPitch);
 		halfnsamp_period = nsamp_period / 2 + 1;
 
 		if (ceiling > 0.5 / my dx) ceiling = 0.5 / my dx;
@@ -403,18 +403,18 @@ Pitch Sound_to_Pitch_any (Sound me,
 		 * Determine window length in seconds and in samples.
 		 */
 		dt_window = periodsPerWindow / minimumPitch;
-		nsamp_window = floor (dt_window / my dx);
+		nsamp_window = (long) floor (dt_window / my dx);
 		halfnsamp_window = nsamp_window / 2 - 1;
 		if (halfnsamp_window < 2)
-			Melder_throw ("Analysis window too short.");
+			Melder_throw (U"Analysis window too short.");
 		nsamp_window = halfnsamp_window * 2;
 
 		/*
 		 * Determine the minimum and maximum lags.
 		 */
-		minimumLag = floor (1 / my dx / ceiling);
+		minimumLag = (long) floor (1 / my dx / ceiling);
 		if (minimumLag < 2) minimumLag = 2;
-		maximumLag = floor (nsamp_window / periodsPerWindow) + 2;
+		maximumLag = (long) floor (nsamp_window / periodsPerWindow) + 2;
 		if (maximumLag > nsamp_window) maximumLag = nsamp_window;
 
 		/*
@@ -426,7 +426,7 @@ Pitch Sound_to_Pitch_any (Sound me,
 		try {
 			Sampled_shortTermAnalysis (me, method >= FCC_NORMAL ? 1 / minimumPitch + dt_window : dt_window, dt, & nFrames, & t1);
 		} catch (MelderError) {
-			Melder_throw ("The pitch analysis would give zero pitch frames.");
+			Melder_throw (U"The pitch analysis would give zero pitch frames.");
 		}
 
 		/*
@@ -458,7 +458,7 @@ Pitch Sound_to_Pitch_any (Sound me,
 			}
 		}
 		if (globalPeak == 0.0) {
-			return thee.transfer();
+			return thee;
 		}
 
 		autoNUMvector <double> window;
@@ -466,7 +466,7 @@ Pitch Sound_to_Pitch_any (Sound me,
 		if (method >= FCC_NORMAL) {   /* For cross-correlation analysis. */
 
 			nsampFFT = 0;
-			brent_ixmax = nsamp_window * interpolation_depth;
+			brent_ixmax = (long) floor (nsamp_window * interpolation_depth);
 
 		} else {   /* For autocorrelation analysis. */
 
@@ -515,15 +515,15 @@ Pitch Sound_to_Pitch_any (Sound me,
 			for (long i = 2; i <= nsamp_window; i ++) windowR [i] /= windowR [1];   // normalize
 			windowR [1] = 1.0;   // normalize
 
-			brent_ixmax = nsamp_window * interpolation_depth;
+			brent_ixmax = (long) floor (nsamp_window * interpolation_depth);
 		}
 
-		autoMelderProgress progress (L"Sound to Pitch...");
+		autoMelderProgress progress (U"Sound to Pitch...");
 
 		long numberOfFramesPerThread = 20;
 		int numberOfThreads = (nFrames - 1) / numberOfFramesPerThread + 1;
 		const int numberOfProcessors = MelderThread_getNumberOfProcessors ();
-		trace ("%d processors", (int) numberOfProcessors);
+		trace (numberOfProcessors, U" processors");
 		if (numberOfThreads > numberOfProcessors) numberOfThreads = numberOfProcessors;
 		if (numberOfThreads > 16) numberOfThreads = 16;
 		if (numberOfThreads < 1) numberOfThreads = 1;
@@ -547,22 +547,22 @@ Pitch Sound_to_Pitch_any (Sound me,
 		}
 		MelderThread_run (Sound_into_Pitch, args, numberOfThreads);
 
-		Melder_progress (0.95, L"Sound to Pitch: path finder");   // progress (0.95, L"Sound to Pitch: path finder");
+		Melder_progress (0.95, U"Sound to Pitch: path finder");
 		Pitch_pathFinder (thee.peek(), silenceThreshold, voicingThreshold,
 			octaveCost, octaveJumpCost, voicedUnvoicedCost, ceiling, Melder_debug == 31 ? true : false);
 
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": pitch analysis not performed.");
+		Melder_throw (me, U": pitch analysis not performed.");
 	}
 }
 
-Pitch Sound_to_Pitch (Sound me, double timeStep, double minimumPitch, double maximumPitch) {
+autoPitch Sound_to_Pitch (Sound me, double timeStep, double minimumPitch, double maximumPitch) {
 	return Sound_to_Pitch_ac (me, timeStep, minimumPitch,
-		3.0, 15, FALSE, 0.03, 0.45, 0.01, 0.35, 0.14, maximumPitch);
+		3.0, 15, false, 0.03, 0.45, 0.01, 0.35, 0.14, maximumPitch);
 }
 
-Pitch Sound_to_Pitch_ac (Sound me,
+autoPitch Sound_to_Pitch_ac (Sound me,
 	double dt, double minimumPitch, double periodsPerWindow, int maxnCandidates, int accurate,
 	double silenceThreshold, double voicingThreshold,
 	double octaveCost, double octaveJumpCost, double voicedUnvoicedCost, double ceiling)
@@ -571,7 +571,7 @@ Pitch Sound_to_Pitch_ac (Sound me,
 		silenceThreshold, voicingThreshold, octaveCost, octaveJumpCost, voicedUnvoicedCost, ceiling);
 }
 
-Pitch Sound_to_Pitch_cc (Sound me,
+autoPitch Sound_to_Pitch_cc (Sound me,
 	double dt, double minimumPitch, double periodsPerWindow, int maxnCandidates, int accurate,
 	double silenceThreshold, double voicingThreshold,
 	double octaveCost, double octaveJumpCost, double voicedUnvoicedCost, double ceiling)
diff --git a/fon/Sound_to_Pitch.h b/fon/Sound_to_Pitch.h
index 2132353..cb332e9 100644
--- a/fon/Sound_to_Pitch.h
+++ b/fon/Sound_to_Pitch.h
@@ -20,23 +20,23 @@
 #include "Sound.h"
 #include "Pitch.h"
 
-Pitch Sound_to_Pitch (Sound me, double timeStep,
+autoPitch Sound_to_Pitch (Sound me, double timeStep,
 	double minimumPitch, double maximumPitch);
 /* Calls Sound_to_Pitch_ac with default arguments. */
 
-Pitch Sound_to_Pitch_ac (Sound me, double timeStep, double minimumPitch,
+autoPitch Sound_to_Pitch_ac (Sound me, double timeStep, double minimumPitch,
 	double periodsPerWindow, int maxnCandidates, int accurate,
 	double silenceThreshold, double voicingThreshold, double octaveCost,
 	double octaveJumpCost, double voicedUnvoicedCost, double maximumPitch);
 /* Calls Sound_to_Pitch_any with AC method. */
 
-Pitch Sound_to_Pitch_cc (Sound me, double timeStep, double minimumPitch,
+autoPitch Sound_to_Pitch_cc (Sound me, double timeStep, double minimumPitch,
 	double periodsPerWindow, int maxnCandidates, int accurate,
 	double silenceThreshold, double voicingThreshold, double octaveCost,
 	double octaveJumpCost, double voicedUnvoicedCost, double maximumPitch);
 /* Calls Sound_to_Pitch_any with FCC method. */
 
-Pitch Sound_to_Pitch_any (Sound me,
+autoPitch Sound_to_Pitch_any (Sound me,
 
 	double dt,                 /* time step (seconds); 0.0 = automatic = periodsPerWindow / minimumPitch / 4 */
 	double minimumPitch,       /* (Hz) */
diff --git a/fon/Sound_to_PointProcess.cpp b/fon/Sound_to_PointProcess.cpp
index 706fe9c..8c012ef 100644
--- a/fon/Sound_to_PointProcess.cpp
+++ b/fon/Sound_to_PointProcess.cpp
@@ -1,6 +1,6 @@
 /* Sound_to_PointProcess.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,7 +30,7 @@
 #include "Sound_to_Pitch.h"
 #include "Pitch_to_PointProcess.h"
 
-PointProcess Sound_to_PointProcess_extrema (Sound me, long channel, int interpolation, bool includeMaxima, bool includeMinima) {
+autoPointProcess Sound_to_PointProcess_extrema (Sound me, long channel, int interpolation, bool includeMaxima, bool includeMinima) {
 	try {
 		/*
 		 * Pass 1: count the extrema. There may be a maximum and minimum in the same interval!
@@ -62,20 +62,20 @@ PointProcess Sound_to_PointProcess_extrema (Sound me, long channel, int interpol
 				PointProcess_addPoint (thee.peek(), time);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": extrema not computed.");
+		Melder_throw (me, U": extrema not computed.");
 	}
 }
 
-PointProcess Sound_to_PointProcess_maxima (Sound me, long channel, int interpolation)
+autoPointProcess Sound_to_PointProcess_maxima (Sound me, long channel, int interpolation)
 	{ return Sound_to_PointProcess_extrema (me, channel, interpolation, true, false); }
-PointProcess Sound_to_PointProcess_minima (Sound me, long channel, int interpolation)
+autoPointProcess Sound_to_PointProcess_minima (Sound me, long channel, int interpolation)
 	{ return Sound_to_PointProcess_extrema (me, channel, interpolation, false, true); }
-PointProcess Sound_to_PointProcess_allExtrema (Sound me, long channel, int interpolation)
+autoPointProcess Sound_to_PointProcess_allExtrema (Sound me, long channel, int interpolation)
 	{ return Sound_to_PointProcess_extrema (me, channel, interpolation, true, true); }
 
-PointProcess Sound_to_PointProcess_zeroes (Sound me, long channel, bool includeRaisers, bool includeFallers) {
+autoPointProcess Sound_to_PointProcess_zeroes (Sound me, long channel, bool includeRaisers, bool includeFallers) {
 	try {
 		/*
 		 * Pass 1: count the zeroes.
@@ -102,29 +102,29 @@ PointProcess Sound_to_PointProcess_zeroes (Sound me, long channel, bool includeR
 				PointProcess_addPoint (thee.peek(), time);
 			}
 		}
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": zeroes not computed.");
+		Melder_throw (me, U": zeroes not computed.");
 	}
 }
 
-PointProcess Sound_to_PointProcess_periodic_cc (Sound me, double fmin, double fmax) {
+autoPointProcess Sound_to_PointProcess_periodic_cc (Sound me, double fmin, double fmax) {
 	try {
 		autoPitch pitch = Sound_to_Pitch (me, 0.0, fmin, fmax);
-		autoPointProcess thee = Sound_Pitch_to_PointProcess_cc (me, pitch.peek());
-		return thee.transfer();
+		autoPointProcess thee = Sound_Pitch_to_PointProcess_cc (me, pitch.get());
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": periodic pulses (cc) not computed.");
+		Melder_throw (me, U": periodic pulses (cc) not computed.");
 	}
 }
 
-PointProcess Sound_to_PointProcess_periodic_peaks (Sound me, double fmin, double fmax, bool includeMaxima, bool includeMinima) {
+autoPointProcess Sound_to_PointProcess_periodic_peaks (Sound me, double fmin, double fmax, bool includeMaxima, bool includeMinima) {
 	try {
 		autoPitch pitch = Sound_to_Pitch (me, 0.0, fmin, fmax);
 		autoPointProcess thee = Sound_Pitch_to_PointProcess_peaks (me, pitch.peek(), includeMaxima, includeMinima);
-		return thee.transfer();
+		return thee;
 	} catch (MelderError) {
-		Melder_throw (me, ": periodic pulses (peaks) not computed.");
+		Melder_throw (me, U": periodic pulses (peaks) not computed.");
 	}
 }
 
diff --git a/fon/Sound_to_PointProcess.h b/fon/Sound_to_PointProcess.h
index 847103d..c36920c 100644
--- a/fon/Sound_to_PointProcess.h
+++ b/fon/Sound_to_PointProcess.h
@@ -1,6 +1,6 @@
 /* Sound_to_PointProcess.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,15 +20,15 @@
 #include "Sound.h"
 #include "PointProcess.h"
 
-PointProcess Sound_to_PointProcess_extrema (Sound me, long channel, int interpolation, bool includeMaxima, bool includeMinima);
-PointProcess Sound_to_PointProcess_maxima (Sound me, long channel, int interpolation);
-PointProcess Sound_to_PointProcess_minima (Sound me, long channel, int interpolation);
-PointProcess Sound_to_PointProcess_allExtrema (Sound me, long channel, int interpolation);
+autoPointProcess Sound_to_PointProcess_extrema (Sound me, long channel, int interpolation, bool includeMaxima, bool includeMinima);
+autoPointProcess Sound_to_PointProcess_maxima (Sound me, long channel, int interpolation);
+autoPointProcess Sound_to_PointProcess_minima (Sound me, long channel, int interpolation);
+autoPointProcess Sound_to_PointProcess_allExtrema (Sound me, long channel, int interpolation);
 
-PointProcess Sound_to_PointProcess_zeroes (Sound me, long channel, bool includeRaisers, bool includeFallers);
+autoPointProcess Sound_to_PointProcess_zeroes (Sound me, long channel, bool includeRaisers, bool includeFallers);
 
-PointProcess Sound_to_PointProcess_periodic_cc (Sound me, double fmin, double fmax);
+autoPointProcess Sound_to_PointProcess_periodic_cc (Sound me, double fmin, double fmax);
 
-PointProcess Sound_to_PointProcess_periodic_peaks (Sound me, double fmin, double fmax, bool includeMaxima, bool includeMinima);
+autoPointProcess Sound_to_PointProcess_periodic_peaks (Sound me, double fmin, double fmax, bool includeMaxima, bool includeMinima);
 
 /* End of file Sound_to_PointProcess.h */
diff --git a/fon/Spectrogram.cpp b/fon/Spectrogram.cpp
index 14737c9..3d16b99 100644
--- a/fon/Spectrogram.cpp
+++ b/fon/Spectrogram.cpp
@@ -1,6 +1,6 @@
 /* Spectrogram.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,23 +22,23 @@
 Thing_implement (Spectrogram, Matrix, 2);
 
 void structSpectrogram :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Time domain:");
-	MelderInfo_writeLine (L"   Start time: ", Melder_double (xmin), L" seconds");
-	MelderInfo_writeLine (L"   End time: ", Melder_double (xmax), L" seconds");
-	MelderInfo_writeLine (L"   Total duration: ", Melder_double (xmax - xmin), L" seconds");
-	MelderInfo_writeLine (L"Time sampling:");
-	MelderInfo_writeLine (L"   Number of time slices (frames): ", Melder_integer (nx));
-	MelderInfo_writeLine (L"   Time step (frame distance): ", Melder_double (dx), L" seconds");
-	MelderInfo_writeLine (L"   First time slice (frame centre) at: ", Melder_double (x1), L" seconds");
-	MelderInfo_writeLine (L"Frequency domain:");
-	MelderInfo_writeLine (L"   Lowest frequency: ", Melder_double (ymin), L" Hz");
-	MelderInfo_writeLine (L"   Highest frequency: ", Melder_double (ymax), L" Hz");
-	MelderInfo_writeLine (L"   Total bandwidth: ", Melder_double (ymax - ymin), L" Hz");
-	MelderInfo_writeLine (L"Frequency sampling:");
-	MelderInfo_writeLine (L"   Number of frequency bands (bins): ", Melder_integer (ny));
-	MelderInfo_writeLine (L"   Frequency step (bin width): ", Melder_double (dy), L" Hz");
-	MelderInfo_writeLine (L"   First frequency band around (bin centre at): ", Melder_double (y1), L" Hz");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Time domain:");
+	MelderInfo_writeLine (U"   Start time: ", xmin, U" seconds");
+	MelderInfo_writeLine (U"   End time: ", xmax, U" seconds");
+	MelderInfo_writeLine (U"   Total duration: ", xmax - xmin, U" seconds");
+	MelderInfo_writeLine (U"Time sampling:");
+	MelderInfo_writeLine (U"   Number of time slices (frames): ", nx);
+	MelderInfo_writeLine (U"   Time step (frame distance): ", dx, U" seconds");
+	MelderInfo_writeLine (U"   First time slice (frame centre) at: ", x1, U" seconds");
+	MelderInfo_writeLine (U"Frequency domain:");
+	MelderInfo_writeLine (U"   Lowest frequency: ", ymin, U" Hz");
+	MelderInfo_writeLine (U"   Highest frequency: ", ymax, U" Hz");
+	MelderInfo_writeLine (U"   Total bandwidth: ", ymax - ymin, U" Hz");
+	MelderInfo_writeLine (U"Frequency sampling:");
+	MelderInfo_writeLine (U"   Number of frequency bands (bins): ", ny);
+	MelderInfo_writeLine (U"   Frequency step (bin width): ", dy, U" Hz");
+	MelderInfo_writeLine (U"   First frequency band around (bin centre at): ", y1, U" Hz");
 }
 
 Spectrogram Spectrogram_create (double tmin, double tmax, long nt, double dt, double t1,
@@ -49,7 +49,7 @@ Spectrogram Spectrogram_create (double tmin, double tmax, long nt, double dt, do
 		Matrix_init (me.peek(), tmin, tmax, nt, dt, t1, fmin, fmax, nf, df, f1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Spectrogram not created.");
+		Melder_throw (U"Spectrogram not created.");
 	}
 }
 
@@ -113,10 +113,10 @@ void Spectrogram_paint (Spectrogram me, Graphics g,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_marksBottom (g, 2, 1, 1, 0);
-		Graphics_marksLeft (g, 2, 1, 1, 0);
-		Graphics_textLeft (g, 1, L"Frequency (Hz)");
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
+		Graphics_marksLeft (g, 2, true, true, false);
+		Graphics_textLeft (g, true, U"Frequency (Hz)");
 	}
 }
 
@@ -126,7 +126,7 @@ Spectrogram Matrix_to_Spectrogram (Matrix me) {
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Spectrogram.");
+		Melder_throw (me, U": not converted to Spectrogram.");
 	}
 }
 
@@ -136,7 +136,7 @@ Matrix Spectrogram_to_Matrix (Spectrogram me) {
 		NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
diff --git a/fon/Spectrogram.h b/fon/Spectrogram.h
index f611b5c..13b4c2c 100644
--- a/fon/Spectrogram.h
+++ b/fon/Spectrogram.h
@@ -2,7 +2,7 @@
 #define _Spectrogram_h_
 /* Spectrogram.h
  *
- * Copyright (C) 1992-2011 David Weenink & Paul Boersma
+ * Copyright (C) 1992-2011,2015 David Weenink & Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,10 +23,10 @@
 #include "Graphics.h"
 
 Thing_define (Spectrogram, Matrix) {
-	// overridden methods:
-	public:
-		virtual void v_info ();
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
+	void v_info ()
+		override;
+	int v_domainQuantity ()
+		override { return MelderQuantity_TIME_SECONDS; }
 };
 
 /* Attributes:
@@ -87,14 +87,12 @@ Spectrogram Matrix_to_Spectrogram (Matrix me);
 /*
 	Create a Spectrogram from a Matrix,
 	with deep copy of all its attributes, except class information and methods.
-	Return NULL if out of memory.  
 */
 
 Matrix Spectrogram_to_Matrix (Spectrogram me);
 /*
 	Create a Matrix from a Spectrogram,
 	with deep copy of all its attributes, except class information and methods.
-	Return NULL if out of memory.  
 */
 
 /* End of file Spectrogram.h */
diff --git a/fon/SpectrogramEditor.cpp b/fon/SpectrogramEditor.cpp
index 167170c..965e7d8 100644
--- a/fon/SpectrogramEditor.cpp
+++ b/fon/SpectrogramEditor.cpp
@@ -1,6 +1,6 @@
 /* SpectrogramEditor.cpp
  *
- * Copyright (C) 1992-2011,2012,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,7 +39,7 @@ void structSpectrogramEditor :: v_draw () {
 	our maximum = spectrogram -> ymax;
 
 	Graphics_setWindow (our d_graphics, our d_startWindow, our d_endWindow, 0.0, our maximum);
-	Spectrogram_paintInside (spectrogram, our d_graphics, our d_startWindow, our d_endWindow, 0, 0, 0.0, TRUE,
+	Spectrogram_paintInside (spectrogram, our d_graphics, our d_startWindow, our d_endWindow, 0, 0, 0.0, true,
 		 60, 6.0, 0);
 
 	/*
@@ -51,7 +51,7 @@ void structSpectrogramEditor :: v_draw () {
 	long df = 1000;
 	for (long f = df; f <= our maximum; f += df) {
 		Graphics_line (our d_graphics, 0.0, f, 1.0, f);
-		Graphics_text2 (our d_graphics, -0.01, f, Melder_integer (f), L" Hz");
+		Graphics_text (our d_graphics, -0.01, f,   f, U" Hz");
 	}
 
 	/*
@@ -77,14 +77,14 @@ int structSpectrogramEditor :: v_click (double xWC, double yWC, bool shiftKeyPre
 	return our SpectrogramEditor_Parent :: v_click (xWC, yWC, shiftKeyPressed);
 }
 
-SpectrogramEditor SpectrogramEditor_create (const wchar_t *title, Spectrogram data) {
+autoSpectrogramEditor SpectrogramEditor_create (const char32 *title, Spectrogram data) {
 	try {
 		autoSpectrogramEditor me = Thing_new (SpectrogramEditor);
 		FunctionEditor_init (me.peek(), title, data);
 		my maximum = 10000.0;
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Spectrogram window not created.");
+		Melder_throw (U"Spectrogram window not created.");
 	}
 }
 
diff --git a/fon/SpectrogramEditor.h b/fon/SpectrogramEditor.h
index 5be2e59..7ff0ee1 100644
--- a/fon/SpectrogramEditor.h
+++ b/fon/SpectrogramEditor.h
@@ -2,7 +2,7 @@
 #define _SpectrogramEditor_h_
 /* SpectrogramEditor.h
  *
- * Copyright (C) 1992-2011,2012 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,15 +23,15 @@
 #include "Spectrogram.h"
 
 Thing_define (SpectrogramEditor, FunctionEditor) {
-	// new data:
-	public:
-		double maximum;
-	// overridden methods:
-		virtual void v_draw ();
-		virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
+	double maximum;
+
+	void v_draw ()
+		override;
+	int v_click (double xWC, double yWC, bool shiftKeyPressed)
+		override;
 };
 
-SpectrogramEditor SpectrogramEditor_create (const wchar_t *title, Spectrogram data);
+autoSpectrogramEditor SpectrogramEditor_create (const char32 *title, Spectrogram data);
 
 /* End of file SpectrogramEditor.h */
 #endif
diff --git a/fon/Spectrum.cpp b/fon/Spectrum.cpp
index 3b06d09..5ae8bc1 100644
--- a/fon/Spectrum.cpp
+++ b/fon/Spectrum.cpp
@@ -1,6 +1,6 @@
 /* Spectrum.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,16 +49,16 @@
 Thing_implement (Spectrum, Matrix, 2);
 
 void structSpectrum :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Frequency domain:");
-	MelderInfo_writeLine (L"   Lowest frequency: ", Melder_double (xmin), L" Hz");
-	MelderInfo_writeLine (L"   Highest frequency: ", Melder_double (xmax), L" Hz");
-	MelderInfo_writeLine (L"   Total bandwidth: ", Melder_double (xmax - xmin), L" Hz");
-	MelderInfo_writeLine (L"Frequency sampling:");
-	MelderInfo_writeLine (L"   Number of frequency bands (bins): ", Melder_integer (nx));
-	MelderInfo_writeLine (L"   Frequency step (bin width): ", Melder_double (dx), L" Hz");
-	MelderInfo_writeLine (L"   First frequency band around (bin centre at): ", Melder_double (x1), L" Hz");
-	MelderInfo_writeLine (L"Total energy: ", Melder_single (Spectrum_getBandEnergy (this, 0.0, 0.0)), L" Pa2 sec");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Frequency domain:");
+	MelderInfo_writeLine (U"   Lowest frequency: ", xmin, U" Hz");
+	MelderInfo_writeLine (U"   Highest frequency: ", xmax, U" Hz");
+	MelderInfo_writeLine (U"   Total bandwidth: ", xmax - xmin, U" Hz");
+	MelderInfo_writeLine (U"Frequency sampling:");
+	MelderInfo_writeLine (U"   Number of frequency bands (bins): ", nx);
+	MelderInfo_writeLine (U"   Frequency step (bin width): ", dx, U" Hz");
+	MelderInfo_writeLine (U"   First frequency band around (bin centre at): ", x1, U" Hz");
+	MelderInfo_writeLine (U"Total energy: ", Melder_single (Spectrum_getBandEnergy (this, 0.0, 0.0)), U" Pa2 sec");
 }
 
 double structSpectrum :: v_getValueAtSample (long isamp, long which, int units) {
@@ -79,7 +79,7 @@ double structSpectrum :: v_getValueAtSample (long isamp, long which, int units)
 			double powerDensity = energyDensity * dx;   /* Pa^2 Hz-2 s-1, after division by approximate duration */
 			if (units == 2) {
 				/* "dB/Hz" */
-				return powerDensity == 0.0 ? -300.0 : 10 * log10 (powerDensity / 4.0e-10);
+				return powerDensity == 0.0 ? -300.0 : 10.0 * log10 (powerDensity / 4.0e-10);
 			}
 		}
 	}
@@ -89,18 +89,18 @@ double structSpectrum :: v_getValueAtSample (long isamp, long which, int units)
 Spectrum Spectrum_create (double fmax, long nf) {
 	try {
 		autoSpectrum me = Thing_new (Spectrum);
-		Matrix_init (me.peek(), 0.0, fmax, nf, fmax / (nf - 1), 0.0, 1, 2, 2, 1, 1);
+		Matrix_init (me.peek(), 0.0, fmax, nf, fmax / (nf - 1), 0.0, 1.0, 2.0, 2, 1.0, 1.0);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Spectrum not created.");
+		Melder_throw (U"Spectrum not created.");
 	}
 }
 
 int Spectrum_getPowerDensityRange (Spectrum me, double *minimum, double *maximum) {
-	*minimum = 1e300, *maximum = 0;
+	*minimum = 1e308, *maximum = 0.0;
 	for (long ifreq = 1; ifreq <= my nx; ifreq ++) {
 		double oneSidedPowerSpectralDensity =   /* Pa2 Hz-2 s-1 */
-			2 * (my z [1] [ifreq] * my z [1] [ifreq] + my z [2] [ifreq] * my z [2] [ifreq]) * my dx;
+			2.0 * (my z [1] [ifreq] * my z [1] [ifreq] + my z [2] [ifreq] * my z [2] [ifreq]) * my dx;
 		if (oneSidedPowerSpectralDensity < *minimum) *minimum = oneSidedPowerSpectralDensity;
 		if (oneSidedPowerSpectralDensity > *maximum) *maximum = oneSidedPowerSpectralDensity;
 	}
@@ -111,7 +111,7 @@ int Spectrum_getPowerDensityRange (Spectrum me, double *minimum, double *maximum
 }
 
 void Spectrum_drawInside (Spectrum me, Graphics g, double fmin, double fmax, double minimum, double maximum) {
-	int autoscaling = minimum >= maximum;
+	bool autoscaling = ( minimum >= maximum );
 
 	if (fmax <= fmin) { fmin = my xmin; fmax = my xmax; }
 	long ifmin, ifmax;
@@ -148,15 +148,15 @@ void Spectrum_draw (Spectrum me, Graphics g, double fmin, double fmax, double mi
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Frequency (Hz)");
+		Graphics_textBottom (g, true, U"Frequency (Hz)");
 		Graphics_marksBottom (g, 2, true, true, false);
-		Graphics_textLeft (g, 1, L"Sound pressure level (dB/Hz)");
+		Graphics_textLeft (g, true, U"Sound pressure level (dB/Hz)");
 		Graphics_marksLeftEvery (g, 1.0, 20.0, true, true, false);
 	}
 }
 
 void Spectrum_drawLogFreq (Spectrum me, Graphics g, double fmin, double fmax, double minimum, double maximum, int garnish) {
-	int autoscaling = minimum >= maximum;
+	bool autoscaling = ( minimum >= maximum );
 	if (fmax <= fmin) { fmin = my xmin; fmax = my xmax; }
 	long ifmin, ifmax;
 	if (! Matrix_getWindowSamplesX (me, fmin, fmax, & ifmin, & ifmax)) return;
@@ -173,7 +173,7 @@ if(ifmin==1)ifmin=2;  /* BUG */
 		yWC [ifreq] = my v_getValueAtSample (ifreq, 0, 2);
 		if (autoscaling && yWC [ifreq] > maximum) maximum = yWC [ifreq];
 	}
-	if (autoscaling) minimum = maximum - 60;   /* Default dynamic range is 60 dB. */
+	if (autoscaling) minimum = maximum - 60;   // default dynamic range is 60 dB
 
 	/*
 	 * Second pass: clip.
@@ -189,10 +189,10 @@ if(ifmin==1)ifmin=2;  /* BUG */
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Frequency (Hz)");
-		Graphics_marksBottomLogarithmic (g, 3, TRUE, TRUE, FALSE);
-		Graphics_textLeft (g, 1, L"Sound pressure level (dB/Hz)");
-		Graphics_marksLeftEvery (g, 1.0, 20.0, TRUE, TRUE, FALSE);
+		Graphics_textBottom (g, true, U"Frequency (Hz)");
+		Graphics_marksBottomLogarithmic (g, 3, true, true, false);
+		Graphics_textLeft (g, true, U"Sound pressure level (dB/Hz)");
+		Graphics_marksLeftEvery (g, 1.0, 20.0, true, true, false);
 	}
 }
 
@@ -203,12 +203,12 @@ Table Spectrum_downto_Table (Spectrum me, bool includeBinNumbers, bool includeFr
 		autoTable thee = Table_createWithoutColumnNames (my nx,
 			includeBinNumbers + includeFrequency + includeRealPart + includeImaginaryPart + includeEnergyDensity + includePowerDensity);
 		long icol = 0;
-		if (includeBinNumbers) Table_setColumnLabel (thee.peek(), ++ icol, L"bin");
-		if (includeFrequency) Table_setColumnLabel (thee.peek(), ++ icol, L"freq(Hz)");
-		if (includeRealPart) Table_setColumnLabel (thee.peek(), ++ icol, L"re(Pa/Hz)");
-		if (includeImaginaryPart) Table_setColumnLabel (thee.peek(), ++ icol, L"im(Pa/Hz)");
-		if (includeEnergyDensity) Table_setColumnLabel (thee.peek(), ++ icol, L"energy(Pa^2/Hz^2)");
-		if (includePowerDensity) Table_setColumnLabel (thee.peek(), ++ icol, L"pow(dB/Hz)");
+		if (includeBinNumbers) Table_setColumnLabel (thee.peek(), ++ icol, U"bin");
+		if (includeFrequency) Table_setColumnLabel (thee.peek(), ++ icol, U"freq(Hz)");
+		if (includeRealPart) Table_setColumnLabel (thee.peek(), ++ icol, U"re(Pa/Hz)");
+		if (includeImaginaryPart) Table_setColumnLabel (thee.peek(), ++ icol, U"im(Pa/Hz)");
+		if (includeEnergyDensity) Table_setColumnLabel (thee.peek(), ++ icol, U"energy(Pa^2/Hz^2)");
+		if (includePowerDensity) Table_setColumnLabel (thee.peek(), ++ icol, U"pow(dB/Hz)");
 		for (long ibin = 1; ibin <= my nx; ibin ++) {
 			icol = 0;
 			if (includeBinNumbers) Table_setNumericValue (thee.peek(), ibin, ++ icol, ibin);
@@ -220,7 +220,7 @@ Table Spectrum_downto_Table (Spectrum me, bool includeBinNumbers, bool includeFr
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Table.");
+		Melder_throw (me, U": not converted to Table.");
 	}
 }
 
@@ -232,19 +232,19 @@ void Spectrum_list (Spectrum me, bool includeBinNumbers, bool includeFrequency,
 			includeRealPart, includeImaginaryPart, includeEnergyDensity, includePowerDensity);
 		Table_list (table.peek(), false);
 	} catch (MelderError) {
-		Melder_throw (me, ": not listed.");
+		Melder_throw (me, U": not listed.");
 	}
 }
 
 Spectrum Matrix_to_Spectrum (Matrix me) {
 	try {
 		if (my ny != 2)
-			Melder_throw ("Matrix must have exactly 2 rows.");
+			Melder_throw (U"Matrix must have exactly 2 rows.");
 		autoSpectrum thee = Thing_new (Spectrum);
 		my structMatrix :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Spectrum.");
+		Melder_throw (me, U": not converted to Spectrum.");
 	}
 }
 
@@ -254,7 +254,7 @@ Matrix Spectrum_to_Matrix (Spectrum me) {
 		my structMatrix :: v_copy (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
@@ -266,7 +266,7 @@ Spectrum Spectrum_cepstralSmoothing (Spectrum me, double bandWidth) {
 		autoSpectrum dBspectrum = Data_copy (me);
 		double *re = dBspectrum -> z [1], *im = dBspectrum -> z [2];
 		for (long i = 1; i <= dBspectrum -> nx; i ++) {
-			re [i] = log (re [i] * re [i] + im [i] * im [i] + 1e-300);
+			re [i] = log (re [i] * re [i] + im [i] * im [i] + 1e-308);
 			im [i] = 0.0;
 		}
 
@@ -281,13 +281,13 @@ Spectrum Spectrum_cepstralSmoothing (Spectrum me, double bandWidth) {
 		double factor = - bandWidth * bandWidth;
 		for (long i = 1; i <= cepstrum -> nx; i ++) {
 			double t = (i - 1) * cepstrum -> dx;
-			cepstrum -> z [1] [i] *= exp (factor * t * t) * ( i == 1 ? 1 : 2 );
+			cepstrum -> z [1] [i] *= exp (factor * t * t) * ( i == 1 ? 1.0 : 2.0 );
 		}
 
 		/*
 		 * Smoothed power spectrum is original power spectrum convolved with a Gaussian.
 		 */
-		autoSpectrum thee = Sound_to_Spectrum (cepstrum.peek(), TRUE);
+		autoSpectrum thee = Sound_to_Spectrum (cepstrum.peek(), true);
 
 		/*
 		 * Convert power spectrum back into a "complex" spectrum without phase information.
@@ -299,14 +299,14 @@ Spectrum Spectrum_cepstralSmoothing (Spectrum me, double bandWidth) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": cepstral smoothing not computed.");
+		Melder_throw (me, U": cepstral smoothing not computed.");
 	}
 }
 
 void Spectrum_passHannBand (Spectrum me, double fmin, double fmax0, double smooth) {
 	double fmax = fmax0 == 0.0 ? my xmax : fmax0;
 	double f1 = fmin - smooth, f2 = fmin + smooth, f3 = fmax - smooth, f4 = fmax + smooth;
-	double halfpibysmooth = smooth != 0.0 ? NUMpi / (2 * smooth) : 0.0;
+	double halfpibysmooth = smooth != 0.0 ? NUMpi / (2.0 * smooth) : 0.0;
 	double *re = my z [1], *im = my z [2];
 	for (long i = 1; i <= my nx; i ++) {
 		double frequency = my x1 + (i - 1) * my dx;
@@ -326,7 +326,7 @@ void Spectrum_passHannBand (Spectrum me, double fmin, double fmax0, double smoot
 void Spectrum_stopHannBand (Spectrum me, double fmin, double fmax0, double smooth) {
 	double fmax = fmax0 == 0.0 ? my xmax : fmax0;
 	double f1 = fmin - smooth, f2 = fmin + smooth, f3 = fmax - smooth, f4 = fmax + smooth;
-	double halfpibysmooth = smooth != 0.0 ? NUMpi / (2 * smooth) : 0.0;
+	double halfpibysmooth = smooth != 0.0 ? NUMpi / (2.0 * smooth) : 0.0;
 	double *re = my z [1], *im = my z [2];
 	for (long i = 1; i <= my nx; i ++) {
 		double frequency = my x1 + (i - 1) * my dx;
@@ -366,12 +366,12 @@ double Spectrum_getBandEnergy (Spectrum me, double fmin, double fmax) {
 	 *
 	 * All this truncation is automatically performed by Sampled_getMean ().
 	 */
-	return Sampled_getIntegral (me, fmin, fmax, 0, 1, FALSE);
+	return Sampled_getIntegral (me, fmin, fmax, 0, 1, false);
 }
 
 double Spectrum_getBandDensity (Spectrum me, double fmin, double fmax) {
-	if (my xmin < 0.0) return NUMundefined;   /* No negative frequencies allowed in one-sided spectral density. */
-	return Sampled_getMean (me, fmin, fmax, 0, 1, FALSE);
+	if (my xmin < 0.0) return NUMundefined;   // no negative frequencies allowed in one-sided spectral density
+	return Sampled_getMean (me, fmin, fmax, 0, 1, false);
 }
 
 double Spectrum_getBandDensityDifference (Spectrum me, double lowBandMin, double lowBandMax, double highBandMin, double highBandMax) {
@@ -387,7 +387,7 @@ double Spectrum_getBandEnergyDifference (Spectrum me, double lowBandMin, double
 	double highBandEnergy = Spectrum_getBandEnergy (me, highBandMin, highBandMax);
 	if (lowBandEnergy == NUMundefined || highBandEnergy == NUMundefined) return NUMundefined;
 	if (lowBandEnergy == 0.0 || highBandEnergy == 0.0) return NUMundefined;
-	return 10 * log10 (highBandEnergy / lowBandEnergy);
+	return 10.0 * log10 (highBandEnergy / lowBandEnergy);
 }
 
 double Spectrum_getCentreOfGravity (Spectrum me, double power) {
@@ -423,14 +423,14 @@ double Spectrum_getStandardDeviation (Spectrum me, double power) {
 double Spectrum_getSkewness (Spectrum me, double power) {
 	double m2 = Spectrum_getCentralMoment (me, 2.0, power);
 	double m3 = Spectrum_getCentralMoment (me, 3.0, power);
-	if (m2 == NUMundefined || m3 == NUMundefined || m2 == 0) return NUMundefined;
+	if (m2 == NUMundefined || m3 == NUMundefined || m2 == 0.0) return NUMundefined;
 	return m3 / (m2 * sqrt (m2));
 }
 
 double Spectrum_getKurtosis (Spectrum me, double power) {
 	double m2 = Spectrum_getCentralMoment (me, 2.0, power);
 	double m4 = Spectrum_getCentralMoment (me, 4.0, power);
-	if (m2 == NUMundefined || m4 == NUMundefined || m2 == 0) return NUMundefined;
+	if (m2 == NUMundefined || m4 == NUMundefined || m2 == 0.0) return NUMundefined;
 	return m4 / (m2 * m2) - 3;
 }
 
@@ -439,12 +439,12 @@ void Spectrum_getNearestMaximum (Spectrum me, double frequency, double *frequenc
 		autoSpectrumTier thee = Spectrum_to_SpectrumTier_peaks (me);
 		long index = AnyTier_timeToNearestIndex (thee.peek(), frequency);
 		if (index == 0)
-			Melder_throw ("No peak.");
+			Melder_throw (U"No peak.");
 		RealPoint point = (RealPoint) thy points -> item [index];
 		*frequencyOfMaximum = point -> number;
 		*heightOfMaximum = point -> value;
 	} catch (MelderError) {
-		Melder_throw (me, ": no nearest maximum found.");
+		Melder_throw (me, U": no nearest maximum found.");
 	}
 }
 
diff --git a/fon/SpectrumEditor.cpp b/fon/SpectrumEditor.cpp
index 95be75a..04cef03 100644
--- a/fon/SpectrumEditor.cpp
+++ b/fon/SpectrumEditor.cpp
@@ -1,6 +1,6 @@
 /* SpectrumEditor.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -52,18 +52,18 @@ void structSpectrumEditor :: v_draw () {
 	Graphics_setColour (our d_graphics, Graphics_BLACK);
 	Graphics_rectangle (our d_graphics, 0, 1, 0, 1);
 	Spectrum_drawInside (spectrum, our d_graphics, our d_startWindow, our d_endWindow, our minimum, our maximum);
-	FunctionEditor_drawRangeMark (this, our maximum, Melder_fixed (maximum, 1), L" dB", Graphics_TOP);
-	FunctionEditor_drawRangeMark (this, our minimum, Melder_fixed (minimum, 1), L" dB", Graphics_BOTTOM);
+	FunctionEditor_drawRangeMark (this, our maximum, Melder_fixed (maximum, 1), U" dB", Graphics_TOP);
+	FunctionEditor_drawRangeMark (this, our minimum, Melder_fixed (minimum, 1), U" dB", Graphics_BOTTOM);
 	if (our cursorHeight > our minimum && our cursorHeight < our maximum)
-		FunctionEditor_drawHorizontalHair (this, our cursorHeight, Melder_fixed (our cursorHeight, 1), L" dB");
+		FunctionEditor_drawHorizontalHair (this, our cursorHeight, Melder_fixed (our cursorHeight, 1), U" dB");
 	Graphics_setColour (our d_graphics, Graphics_BLACK);
 
 	/* Update buttons. */
 
 	long first, last;
 	long selectedSamples = Sampled_getWindowSamples (spectrum, our d_startSelection, our d_endSelection, & first, & last);
-	our publishBandButton  -> f_setSensitive (selectedSamples != 0);
-	our publishSoundButton -> f_setSensitive (selectedSamples != 0);
+	GuiThing_setSensitive (our publishBandButton,  selectedSamples != 0);
+	GuiThing_setSensitive (our publishSoundButton, selectedSamples != 0);
 }
 
 int structSpectrumEditor :: v_click (double xWC, double yWC, bool shiftKeyPressed) {
@@ -94,44 +94,44 @@ void structSpectrumEditor :: v_play (double fmin, double fmax) {
 static void menu_cb_publishBand (EDITOR_ARGS) {
 	EDITOR_IAM (SpectrumEditor);
 	autoSpectrum publish = Spectrum_band ((Spectrum) my data, my d_startSelection, my d_endSelection);
-	my broadcastPublication (publish.transfer());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_publishSound (EDITOR_ARGS) {
 	EDITOR_IAM (SpectrumEditor);
 	autoSound publish = Spectrum_to_Sound_part ((Spectrum) my data, my d_startSelection, my d_endSelection);
-	my broadcastPublication (publish.transfer());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_passBand (EDITOR_ARGS) {
 	EDITOR_IAM (SpectrumEditor);
-	EDITOR_FORM (L"Filter (pass Hann band)", L"Spectrum: Filter (pass Hann band)...");
-		REAL (L"Band smoothing (Hz)", my default_bandSmoothing ())
+	EDITOR_FORM (U"Filter (pass Hann band)", U"Spectrum: Filter (pass Hann band)...");
+		REAL (U"Band smoothing (Hz)", my default_bandSmoothing ())
 	EDITOR_OK
-		SET_REAL (L"Band smoothing", my p_bandSmoothing)
+		SET_REAL (U"Band smoothing", my p_bandSmoothing)
 	EDITOR_DO
-		my pref_bandSmoothing() = my p_bandSmoothing = GET_REAL (L"Band smoothing");
-		if (my d_endSelection <= my d_startSelection) Melder_throw (L"To apply a band-pass filter, first make a selection.");
-		Editor_save (me, L"Pass band");
+		my pref_bandSmoothing() = my p_bandSmoothing = GET_REAL (U"Band smoothing");
+		if (my d_endSelection <= my d_startSelection) Melder_throw (U"To apply a band-pass filter, first make a selection.");
+		Editor_save (me, U"Pass band");
 		Spectrum_passHannBand ((Spectrum) my data, my d_startSelection, my d_endSelection, my p_bandSmoothing);
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_stopBand (EDITOR_ARGS) {
 	EDITOR_IAM (SpectrumEditor);
-	EDITOR_FORM (L"Filter (stop Hann band)", 0)
-		REAL (L"Band smoothing (Hz)", my default_bandSmoothing ())
+	EDITOR_FORM (U"Filter (stop Hann band)", 0)
+		REAL (U"Band smoothing (Hz)", my default_bandSmoothing ())
 	EDITOR_OK
-		SET_REAL (L"Band smoothing", my p_bandSmoothing)
+		SET_REAL (U"Band smoothing", my p_bandSmoothing)
 	EDITOR_DO
-		my pref_bandSmoothing () = my p_bandSmoothing = GET_REAL (L"Band smoothing");
-		if (my d_endSelection <= my d_startSelection) Melder_throw (L"To apply a band-stop filter, first make a selection.");
-		Editor_save (me, L"Stop band");
+		my pref_bandSmoothing () = my p_bandSmoothing = GET_REAL (U"Band smoothing");
+		if (my d_endSelection <= my d_startSelection) Melder_throw (U"To apply a band-stop filter, first make a selection.");
+		Editor_save (me, U"Stop band");
 		Spectrum_stopHannBand ((Spectrum) my data, my d_startSelection, my d_endSelection, my p_bandSmoothing);
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
@@ -146,53 +146,53 @@ static void menu_cb_moveCursorToPeak (EDITOR_ARGS) {
 
 static void menu_cb_setDynamicRange (EDITOR_ARGS) {
 	EDITOR_IAM (SpectrumEditor);
-	EDITOR_FORM (L"Set dynamic range", 0)
-		POSITIVE (L"Dynamic range (dB)", my default_dynamicRange ())
+	EDITOR_FORM (U"Set dynamic range", 0)
+		POSITIVE (U"Dynamic range (dB)", my default_dynamicRange ())
 	EDITOR_OK
-		SET_REAL (L"Dynamic range", my p_dynamicRange)
+		SET_REAL (U"Dynamic range", my p_dynamicRange)
 	EDITOR_DO
-		my pref_dynamicRange () = my p_dynamicRange = GET_REAL (L"Dynamic range");
+		my pref_dynamicRange () = my p_dynamicRange = GET_REAL (U"Dynamic range");
 		updateRange (me);
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
 
-static void menu_cb_help_SpectrumEditor (EDITOR_ARGS) { EDITOR_IAM (SpectrumEditor); Melder_help (L"SpectrumEditor"); }
-static void menu_cb_help_Spectrum (EDITOR_ARGS) { EDITOR_IAM (SpectrumEditor); Melder_help (L"Spectrum"); }
+static void menu_cb_help_SpectrumEditor (EDITOR_ARGS) { EDITOR_IAM (SpectrumEditor); Melder_help (U"SpectrumEditor"); }
+static void menu_cb_help_Spectrum (EDITOR_ARGS) { EDITOR_IAM (SpectrumEditor); Melder_help (U"Spectrum"); }
 
 void structSpectrumEditor :: v_createMenus () {
 	SpectrumEditor_Parent :: v_createMenus ();
-	our publishBandButton = Editor_addCommand (this, L"File", L"Publish band", 0, menu_cb_publishBand);
-	our publishSoundButton = Editor_addCommand (this, L"File", L"Publish band-filtered sound", 0, menu_cb_publishSound);
-	Editor_addCommand (this, L"File", L"-- close --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"-- edit band --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Pass band...", 0, menu_cb_passBand);
-	Editor_addCommand (this, L"Edit", L"Stop band...", 0, menu_cb_stopBand);
-	Editor_addCommand (this, L"Select", L"-- move to peak --", 0, 0);
-	Editor_addCommand (this, L"Select", L"Move cursor to nearest peak", 'K', menu_cb_moveCursorToPeak);
+	our publishBandButton = Editor_addCommand (this, U"File", U"Publish band", 0, menu_cb_publishBand);
+	our publishSoundButton = Editor_addCommand (this, U"File", U"Publish band-filtered sound", 0, menu_cb_publishSound);
+	Editor_addCommand (this, U"File", U"-- close --", 0, NULL);
+	Editor_addCommand (this, U"Edit", U"-- edit band --", 0, NULL);
+	Editor_addCommand (this, U"Edit", U"Pass band...", 0, menu_cb_passBand);
+	Editor_addCommand (this, U"Edit", U"Stop band...", 0, menu_cb_stopBand);
+	Editor_addCommand (this, U"Select", U"-- move to peak --", 0, 0);
+	Editor_addCommand (this, U"Select", U"Move cursor to nearest peak", 'K', menu_cb_moveCursorToPeak);
 }
 
 void structSpectrumEditor :: v_createMenuItems_view (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"Set dynamic range...", 0, menu_cb_setDynamicRange);
-	EditorMenu_addCommand (menu, L"-- view settings --", 0, 0);
+	EditorMenu_addCommand (menu, U"Set dynamic range...", 0, menu_cb_setDynamicRange);
+	EditorMenu_addCommand (menu, U"-- view settings --", 0, 0);
 	SpectrumEditor_Parent :: v_createMenuItems_view (menu);
 }
 
 void structSpectrumEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	SpectrumEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"SpectrumEditor help", '?', menu_cb_help_SpectrumEditor);
-	EditorMenu_addCommand (menu, L"Spectrum help", 0, menu_cb_help_Spectrum);
+	EditorMenu_addCommand (menu, U"SpectrumEditor help", '?', menu_cb_help_SpectrumEditor);
+	EditorMenu_addCommand (menu, U"Spectrum help", 0, menu_cb_help_Spectrum);
 }
 
-SpectrumEditor SpectrumEditor_create (const wchar_t *title, Spectrum data) {
+autoSpectrumEditor SpectrumEditor_create (const char32 *title, Spectrum data) {
 	try {
 		autoSpectrumEditor me = Thing_new (SpectrumEditor);
 		FunctionEditor_init (me.peek(), title, data);
 		my cursorHeight = -1000;
 		updateRange (me.peek());
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("Spectrum window not created.");
+		Melder_throw (U"Spectrum window not created.");
 	}
 }
 
diff --git a/fon/SpectrumEditor.h b/fon/SpectrumEditor.h
index b4b97cb..66b1b27 100644
--- a/fon/SpectrumEditor.h
+++ b/fon/SpectrumEditor.h
@@ -2,7 +2,7 @@
 #define _SpectrumEditor_h_
 /* SpectrumEditor.h
  *
- * Copyright (C) 1992-2011,2012,2013 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,30 +23,44 @@
 #include "Spectrum.h"
 
 Thing_define (SpectrumEditor, FunctionEditor) {
-	// new data:
-	public:
-		double minimum, maximum, cursorHeight;
-		GuiMenuItem publishBandButton, publishSoundButton;
-	// overridden methods:
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_dataChanged ();
-		virtual void v_draw ();
-		virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
-		virtual void v_play (double tmin, double tmax);
-		virtual void v_createMenuItems_view (EditorMenu menu);
-		virtual const wchar_t * v_format_domain () { return L"Frequency domain:"; }
-		virtual const wchar_t * v_format_short () { return L"%.0f"; }
-		virtual const wchar_t * v_format_long () { return L"%.2f"; }
-		virtual int v_fixedPrecision_long () { return 2; }
-		virtual const wchar_t * v_format_units () { return L"hertz"; }
-		virtual const wchar_t * v_format_totalDuration () { return L"Total bandwidth %.2f hertz"; }
-		virtual const wchar_t * v_format_window () { return L"Visible part %.2f hertz"; }
-		virtual const wchar_t * v_format_selection () { return L"%.2f Hz"; }
+	double minimum, maximum, cursorHeight;
+	GuiMenuItem publishBandButton, publishSoundButton;
+
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_dataChanged ()
+		override;
+	void v_draw ()
+		override;
+	int v_click (double xWC, double yWC, bool shiftKeyPressed)
+		override;
+	void v_play (double tmin, double tmax)
+		override;
+	void v_createMenuItems_view (EditorMenu menu)
+		override;
+	const char32 * v_format_domain ()
+		override { return U"Frequency domain:"; }
+	const char * v_format_short ()
+		override { return "%.0f"; }
+	const char * v_format_long ()
+		override { return "%.2f"; }
+	int v_fixedPrecision_long ()
+		override { return 2; }
+	const char32 * v_format_units ()
+		override { return U"hertz"; }
+	const char * v_format_totalDuration ()
+		override { return u8"Total bandwidth %.2f hertz"; }
+	const char * v_format_window ()
+		override { return u8"Visible part %.2f hertz"; }
+	const char * v_format_selection ()
+		override { return u8"%.2f Hz"; }
+
 	#include "SpectrumEditor_prefs.h"
 };
 
-SpectrumEditor SpectrumEditor_create (const wchar_t *title, Spectrum data);
+autoSpectrumEditor SpectrumEditor_create (const char32 *title, Spectrum data);
 
 /* End of file SpectrumEditor.h */
 #endif
diff --git a/fon/SpectrumEditor_prefs.h b/fon/SpectrumEditor_prefs.h
index 6870b2d..17d6950 100644
--- a/fon/SpectrumEditor_prefs.h
+++ b/fon/SpectrumEditor_prefs.h
@@ -1,6 +1,6 @@
 /* SpectrumEditor_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,13 +18,14 @@
  */
 
 prefs_begin (SpectrumEditor)
-	// overridden:
-		prefs_add_int  (SpectrumEditor, shellWidth,                 1, L"700")
-		prefs_add_int  (SpectrumEditor, shellHeight,                1, L"440")
-		prefs_add_double (SpectrumEditor, arrowScrollStep,          1, L"100.0")
-	// new:
-		prefs_add_double_with_data (SpectrumEditor, bandSmoothing,  1, L"100.0")
-		prefs_add_double_with_data (SpectrumEditor, dynamicRange,   1, L"60.0")
+
+	prefs_override_int         (SpectrumEditor, shellWidth,      1, U"700")
+	prefs_override_int         (SpectrumEditor, shellHeight,     1, U"440")
+	prefs_override_double      (SpectrumEditor, arrowScrollStep, 1, U"100.0")
+
+	prefs_add_double_with_data (SpectrumEditor, bandSmoothing,   1, U"100.0")
+	prefs_add_double_with_data (SpectrumEditor, dynamicRange,    1, U"60.0")
+
 prefs_end (SpectrumEditor)
 
 /* End of file SpectrumEditor_prefs.h */
diff --git a/fon/SpectrumTier.cpp b/fon/SpectrumTier.cpp
index b46b417..ba1c42d 100644
--- a/fon/SpectrumTier.cpp
+++ b/fon/SpectrumTier.cpp
@@ -1,6 +1,6 @@
 /* SpectrumTier.cpp
  *
- * Copyright (C) 2007-2012 Paul Boersma
+ * Copyright (C) 2007-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,14 +22,14 @@
 Thing_implement (SpectrumTier, RealTier, 0);
 
 void structSpectrumTier :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Frequency domain:");
-	MelderInfo_writeLine (L"   Lowest frequency: ", Melder_double (xmin), L" Hz");
-	MelderInfo_writeLine (L"   Highest frequency: ", Melder_double (xmax), L" Hz");
-	MelderInfo_writeLine (L"   Total bandwidth: ", Melder_double (xmax - xmin), L" Hz");
-	MelderInfo_writeLine (L"Number of points: ", Melder_integer (points -> size));
-	MelderInfo_writeLine (L"Minimum power value: ", Melder_double (RealTier_getMinimumValue (this)), L" dB/Hz");
-	MelderInfo_writeLine (L"Maximum power value: ", Melder_double (RealTier_getMaximumValue (this)), L" dB/Hz");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Frequency domain:");
+	MelderInfo_writeLine (U"   Lowest frequency: ", xmin, U" Hz");
+	MelderInfo_writeLine (U"   Highest frequency: ", xmax, U" Hz");
+	MelderInfo_writeLine (U"   Total bandwidth: ", xmax - xmin, U" Hz");
+	MelderInfo_writeLine (U"Number of points: ", points -> size);
+	MelderInfo_writeLine (U"Minimum power value: ", RealTier_getMinimumValue (this), U" dB/Hz");
+	MelderInfo_writeLine (U"Maximum power value: ", RealTier_getMaximumValue (this), U" dB/Hz");
 }
 
 SpectrumTier SpectrumTier_create (double fmin, double fmax) {
@@ -38,14 +38,14 @@ SpectrumTier SpectrumTier_create (double fmin, double fmax) {
 		RealTier_init (me.peek(), fmin, fmax);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("SpectrumTier not created.");
+		Melder_throw (U"SpectrumTier not created.");
 	}
 }
 
 void SpectrumTier_draw (SpectrumTier me, Graphics g, double fmin, double fmax,
-	double pmin, double pmax, int garnish, const wchar_t *method)
+	double pmin, double pmax, int garnish, const char32 *method)
 {
-	RealTier_draw (me, g, fmin, fmax, pmin, pmax, garnish, method, L"Power spectral density (dB)");
+	RealTier_draw (me, g, fmin, fmax, pmin, pmax, garnish, method, U"Power spectral density (dB)");
 }
 
 void SpectrumTier_list (SpectrumTier me, bool includeIndexes, bool includeFrequency, bool includePowerDensity) {
@@ -53,15 +53,15 @@ void SpectrumTier_list (SpectrumTier me, bool includeIndexes, bool includeFreque
 		autoTable table = SpectrumTier_downto_Table (me, includeIndexes, includeFrequency, includePowerDensity);
 		Table_list (table.peek(), false);
 	} catch (MelderError) {
-		Melder_throw (me, ": not listed.");
+		Melder_throw (me, U": not listed.");
 	}
 }
 
 Table SpectrumTier_downto_Table (SpectrumTier me, bool includeIndexes, bool includeFrequency, bool includePowerDensity) {
 	return RealTier_downto_Table (me,
-		includeIndexes ? L"index" : NULL,
-		includeFrequency ? L"freq(Hz)" : NULL,
-		includePowerDensity ? L"pow(dB/Hz)" : NULL);
+		includeIndexes ? U"index" : NULL,
+		includeFrequency ? U"freq(Hz)" : NULL,
+		includePowerDensity ? U"pow(dB/Hz)" : NULL);
 }
 
 SpectrumTier Spectrum_to_SpectrumTier_peaks (Spectrum me) {
@@ -70,7 +70,7 @@ SpectrumTier Spectrum_to_SpectrumTier_peaks (Spectrum me) {
 		autoSpectrumTier thee = Ltas_to_SpectrumTier_peaks (ltas.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": peaks not converted to SpectrumTier.");
+		Melder_throw (me, U": peaks not converted to SpectrumTier.");
 	}
 }
 
diff --git a/fon/SpectrumTier.h b/fon/SpectrumTier.h
index 63c906b..c47294e 100644
--- a/fon/SpectrumTier.h
+++ b/fon/SpectrumTier.h
@@ -2,7 +2,7 @@
 #define _SpectrumTier_h_
 /* SpectrumTier.h
  *
- * Copyright (C) 2007-2011,2014 Paul Boersma
+ * Copyright (C) 2007-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,12 +26,12 @@
 /********** class SpectrumTier **********/
 
 Thing_define (SpectrumTier, RealTier) {
-	// overridden methods:
-	protected:
-		virtual void v_info ();
-		virtual int v_domainQuantity () { return MelderQuantity_FREQUENCY_HERTZ; }
-		virtual const wchar_t * v_getUnitText (long ilevel, int unit, unsigned long flags)
-			{ (void) ilevel; (void) unit; (void) flags; return L"Frequency (Hz)"; }
+	void v_info ()
+		override;
+	int v_domainQuantity ()
+		override { return MelderQuantity_FREQUENCY_HERTZ; }
+	const char32 * v_getUnitText (long /* ilevel */, int /* unit */, unsigned long /* flags */)
+		override { return U"Frequency (Hz)"; }
 };
 
 SpectrumTier SpectrumTier_create (double fmin, double fmax);
@@ -43,7 +43,7 @@ SpectrumTier SpectrumTier_create (double fmin, double fmax);
 */
 
 void SpectrumTier_draw (SpectrumTier me, Graphics g, double fmin, double fmax,
-	double pmin, double pmax, int garnish, const wchar_t *method);
+	double pmin, double pmax, int garnish, const char32 *method);
 
 void SpectrumTier_list (SpectrumTier me, bool includeIndexes, bool includeFrequency, bool includePowerDensity);
 
diff --git a/fon/Spectrum_and_Spectrogram.cpp b/fon/Spectrum_and_Spectrogram.cpp
index fe230d4..1a8fb6d 100644
--- a/fon/Spectrum_and_Spectrogram.cpp
+++ b/fon/Spectrum_and_Spectrogram.cpp
@@ -1,6 +1,6 @@
 /* Spectrum_and_Spectrogram.cpp
  *
- * Copyright (C) 1992-2011,2014 David Weenink & Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 David Weenink & Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,19 +34,19 @@ Spectrum Spectrogram_to_Spectrum (I, double tim) {
 		thy xmax = my ymax;
 		thy x1 = my y1;   // centre of first band, instead of 0 (makes it unFFTable)
 		thy dx = my dy;   // frequency step
-		long itime = Sampled_xToIndex (me, tim);
+		long itime = Sampled_xToNearestIndex (me, tim);
 		if (itime < 1 ) itime = 1;
 		if (itime > my nx) itime = my nx;
 		for (long ifreq = 1; ifreq <= my ny; ifreq ++) {
 			double value = my z [ifreq] [itime];
 			if (value < 0.0)
-				Melder_throw ("Negative values in spectrogram.");
+				Melder_throw (U"Negative values in spectrogram.");
 			thy z [1] [ifreq] = sqrt (value);
 			thy z [2] [ifreq] = 0.0;
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": spectral slice not extracted.");
+		Melder_throw (me, U": spectral slice not extracted.");
 	}
 }
 
@@ -58,7 +58,7 @@ Spectrogram Spectrum_to_Spectrogram (I) {
 			thy z [i] [1] = my z [1] [i] * my z [1] [i] + my z [2] [i] * my z [2] [i];
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Spectrogram.");
+		Melder_throw (me, U": not converted to Spectrogram.");
 	}
 }
 
diff --git a/fon/Spectrum_def.h b/fon/Spectrum_def.h
index 8c83828..f06b3ca 100644
--- a/fon/Spectrum_def.h
+++ b/fon/Spectrum_def.h
@@ -1,6 +1,6 @@
 /* Spectrum_def.h
  *
- * Copyright (C) 2002-2011 Paul Boersma
+ * Copyright (C) 2002-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,17 +22,19 @@
 oo_DEFINE_CLASS (Spectrum, Matrix)
 
 	#if oo_READING
-		if (localVersion < 1) {
+		if (formatVersion < 1) {
 			for (long i = 1; i <= nx; i ++)
 				z [2] [i] = - z [2] [i];
 		}
 	#endif
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
-			virtual int v_domainQuantity () { return MelderQuantity_FREQUENCY_HERTZ; }
-			virtual double v_getValueAtSample (long isamp, long which, int units);
+		void v_info ()
+			override;
+		int v_domainQuantity ()
+			override { return MelderQuantity_FREQUENCY_HERTZ; }
+		double v_getValueAtSample (long isamp, long which, int units)
+			override;
 	#endif
 
 oo_END_CLASS (Spectrum)
diff --git a/fon/Spectrum_to_Excitation.cpp b/fon/Spectrum_to_Excitation.cpp
index 0f87b22..2b0ffbb 100644
--- a/fon/Spectrum_to_Excitation.cpp
+++ b/fon/Spectrum_to_Excitation.cpp
@@ -1,6 +1,6 @@
 /* Spectrum_to_Excitation.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -70,7 +70,7 @@ Excitation Spectrum_to_Excitation (Spectrum me, double dbark) {
 
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Excitation.");
+		Melder_throw (me, U": not converted to Excitation.");
 	}
 }
 
diff --git a/fon/Spectrum_to_Formant.cpp b/fon/Spectrum_to_Formant.cpp
index 57adca9..19dbd9e 100644
--- a/fon/Spectrum_to_Formant.cpp
+++ b/fon/Spectrum_to_Formant.cpp
@@ -1,6 +1,6 @@
 /* Spectrum_to_Formant.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -56,7 +56,7 @@ Formant Spectrum_to_Formant (Spectrum me, int maxnFormants) {
 		thy d_frames [1]. nFormants = nform;
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Formant.");
+		Melder_throw (me, U": not converted to Formant.");
 	}
 }
 
diff --git a/fon/SpellingChecker.cpp b/fon/SpellingChecker.cpp
index 80bd0ec..edfa714 100644
--- a/fon/SpellingChecker.cpp
+++ b/fon/SpellingChecker.cpp
@@ -1,6 +1,6 @@
 /* SpellingChecker.cpp
  *
- * Copyright (C) 1999-2011 Paul Boersma
+ * Copyright (C) 1999-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
 /*
  * pb 2002/07/16 GPL
  * pb 2007/06/21 tex
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2007/10/01 can write as encoding
  * pb 2011/03/03 wide-character WordList
  * pb 2011/06/10 C++
@@ -50,16 +50,16 @@
 
 #include "longchar.h"
 
-Thing_implement (SpellingChecker, Data, 0);
+Thing_implement (SpellingChecker, Daata, 0);
 
 SpellingChecker WordList_upto_SpellingChecker (WordList me) {
 	try {
 		autoSpellingChecker thee = Thing_new (SpellingChecker);
 		thy wordList = Data_copy (me);
-		thy separatingCharacters = Melder_wcsdup (L".,;:()\"");
+		thy separatingCharacters = Melder_dup (U".,;:()\"");
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to SpellingChecker.");
+		Melder_throw (me, U": not converted to SpellingChecker.");
 	}
 }
 
@@ -79,17 +79,17 @@ void SpellingChecker_replaceWordList (SpellingChecker me, WordList list) {
 		forget (my wordList);
 		my wordList = newList.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": word list not replaced.");
+		Melder_throw (me, U": word list not replaced.");
 	}
 }
 
 SortedSetOfString SpellingChecker_extractUserDictionary (SpellingChecker me) {
 	try {
 		if (! my userDictionary)
-			Melder_throw ("This spelling checker does not contain a user dictionary.");
+			Melder_throw (U"This spelling checker does not contain a user dictionary.");
 		return Data_copy (my userDictionary);
 	} catch (MelderError) {
-		Melder_throw (me, ": user dictionary not extracted.");
+		Melder_throw (me, U": user dictionary not extracted.");
 	}
 }
 
@@ -105,38 +105,38 @@ void SpellingChecker_replaceUserDictionary (SpellingChecker me, SortedSetOfStrin
 		forget (my userDictionary);
 		my userDictionary = newDict.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": user dictionary not replaced.");
+		Melder_throw (me, U": user dictionary not replaced.");
 	}
 }
 
-static int startsWithCapital (const wchar_t *word) {
-	return isupper (word [0]) || (word [0] == '\\' && isupper (word [1]));
+static int startsWithCapital (const char32 *word) {
+	return iswupper ((int) word [0]) || (word [0] == '\\' && iswupper ((int) word [1]));
 }
 
-bool SpellingChecker_isWordAllowed (SpellingChecker me, const wchar_t *word) {
-	int wordLength = wcslen (word);
+bool SpellingChecker_isWordAllowed (SpellingChecker me, const char32 *word) {
+	int wordLength = str32len (word);
 	if (my allowAllWordsContaining && my allowAllWordsContaining [0]) {
-		wchar_t *p = & my allowAllWordsContaining [0];
+		char32 *p = & my allowAllWordsContaining [0];
 		while (*p) {
 			/*
 			 * Find next token in list of allowed string parts.
 			 */
-			wchar_t token [100], *q = & token [0];
+			char32 token [100], *q = & token [0];
 			/*
 			 * Skip spaces in list.
 			 */
-			while (*p == ' ') p ++;
+			while (*p == U' ') p ++;
 			/*
 			 * Collect one token string from list.
 			 */
-			while (*p != '\0' && *p != ' ') {
+			while (*p != U'\0' && *p != U' ') {
 				*q ++ = *p ++;
 			}
-			*q = '\0';   /* Trailing null byte. */
+			*q = U'\0';   // trailing null character
 			/*
 			 * Allow word if it contains this token.
 			 */
-			if (wcsstr (word, token)) return TRUE;
+			if (str32str (word, token)) return true;
 		}
 	}
 	if (my allowAllNames) {
@@ -144,118 +144,110 @@ bool SpellingChecker_isWordAllowed (SpellingChecker me, const wchar_t *word) {
 		 * Allow word if it starts with a capital.
 		 */
 		if (startsWithCapital (word)) {
-			return TRUE;
+			return true;
 		}
 		if (my namePrefixes && my namePrefixes [0]) {
-			wchar_t *p = & my namePrefixes [0];
+			char32 *p = & my namePrefixes [0];
 			while (*p) {
-				wchar_t token [100], *q = & token [0];
-				while (*p == ' ') p ++;
-				while (*p != '\0' && *p != ' ') *q ++ = *p ++;
-				*q = '\0';   /* Trailing null byte. */
+				char32 token [100], *q = & token [0];
+				while (*p == U' ') p ++;
+				while (*p != U'\0' && *p != U' ') *q ++ = *p ++;
+				*q = U'\0';   // trailing null character
 				/*
 				 * Allow word if starts with this prefix
 				 * and this prefix is followed by a capital.
 				 */
-				if (wcsstr (word, token) == word && startsWithCapital (word + wcslen (token))) {
-					return TRUE;
+				if (str32str (word, token) == word && startsWithCapital (word + str32len (token))) {
+					return true;
 				}
 			}
 		}
 	} else if (my allowAllAbbreviations && startsWithCapital (word)) {
-		const wchar_t *p = & word [0];
+		const char32 *p = & word [0];
 		for (;;) {
-			if (*p == '\0') return TRUE;
-			if (islower (*p)) break;
+			if (*p == '\0') return true;
+			if (iswlower ((int) *p)) break;
 			p ++;
 		}
 	}
 	if (my allowAllWordsStartingWith && my allowAllWordsStartingWith [0]) {
-		wchar_t *p = & my allowAllWordsStartingWith [0];
+		char32 *p = & my allowAllWordsStartingWith [0];
 		while (*p) {
-			wchar_t token [100], *q = & token [0];
+			char32 token [100], *q = & token [0];
 			int tokenLength;
-			while (*p == ' ') p ++;
-			while (*p != '\0' && *p != ' ') *q ++ = *p ++;
-			*q = '\0';   /* Trailing null byte. */
-			tokenLength = wcslen (token);
-			if (wordLength >= tokenLength && wcsnequ (token, word, tokenLength)) {
-				return TRUE;
+			while (*p == U' ') p ++;
+			while (*p != U'\0' && *p != U' ') *q ++ = *p ++;
+			*q = U'\0';   // trailing null character
+			tokenLength = str32len (token);
+			if (wordLength >= tokenLength && str32nequ (token, word, tokenLength)) {
+				return true;
 			}
 		}
 	}
 	if (my allowAllWordsEndingIn && my allowAllWordsEndingIn [0]) {
-		wchar_t *p = & my allowAllWordsEndingIn [0];
+		char32 *p = & my allowAllWordsEndingIn [0];
 		while (*p) {
-			wchar_t token [100], *q = & token [0];
+			char32 token [100], *q = & token [0];
 			int tokenLength;
-			while (*p == ' ') p ++;
-			while (*p != '\0' && *p != ' ') *q ++ = *p ++;
-			*q = '\0';   /* Trailing null byte. */
-			tokenLength = wcslen (token);
-			if (wordLength >= tokenLength && wcsnequ (token, word + wordLength - tokenLength, tokenLength)) {
-				return TRUE;
+			while (*p == U' ') p ++;
+			while (*p != U'\0' && *p != U' ') *q ++ = *p ++;
+			*q = U'\0';   // trailing null character
+			tokenLength = str32len (token);
+			if (wordLength >= tokenLength && str32nequ (token, word + wordLength - tokenLength, tokenLength)) {
+				return true;
 			}
 		}
 	}
 	if (WordList_hasWord (my wordList, word))
-		return TRUE;
+		return true;
 	if (my userDictionary != NULL) {
-		if (wcslen (word) > 3333) return FALSE;   /* Superfluous, because WordList_hasWord already checked. But safe. */
-		Longchar_genericizeW (word, (wchar_t *) Melder_buffer2);
-		if (SortedSetOfString_lookUp (my userDictionary, (wchar_t *) Melder_buffer2) != 0)
-			return TRUE;
+		if (str32len (word) > 3333) return false;   // superfluous, because WordList_hasWord already checked; but safe
+		static char32 buffer [3*3333+1];
+		Longchar_genericize32 (word, buffer);
+		if (SortedSetOfString_lookUp (my userDictionary, buffer) != 0)
+			return true;
 	}
-	return FALSE;
+	return false;
 }
 
-void SpellingChecker_addNewWord (SpellingChecker me, const wchar_t *word) {
+void SpellingChecker_addNewWord (SpellingChecker me, const char32 *word) {
 	try {
 		if (! my userDictionary)
 			my userDictionary = SortedSetOfString_create ();
-		autostring generic = Melder_calloc (wchar_t, 3 * wcslen (word) + 1);
-		Longchar_genericizeW (word, generic.peek());
-		my userDictionary -> addString (generic.transfer());
+		autostring32 generic = Melder_calloc (char32, 3 * str32len (word) + 1);
+		Longchar_genericize32 (word, generic.peek());
+		SortedSetOfString_addString (my userDictionary, generic.transfer());
 	} catch (MelderError) {
-		Melder_throw (me, ": word \"", word, "\" not added.");
+		Melder_throw (me, U": word \"", word, U"\" not added.");
 	}
 }
 
-static bool stringContains (const wchar_t *string, int character) {
-	const wchar_t *p = & string [0];
-	while (*p) {
-		if (*p == character) return true;
-		p ++;
-	}
-	return false;
-}
-
-wchar_t * SpellingChecker_nextNotAllowedWord (SpellingChecker me, const wchar_t *sentence, long *start) {
-	const wchar_t *p = sentence + *start;
+char32 * SpellingChecker_nextNotAllowedWord (SpellingChecker me, const char32 *sentence, long *start) {
+	const char32 *p = sentence + *start;
 	for (;;) {
-		if (*p == '\0') {
-			return NULL;   /* All words allowed. */
-		} else if (*p == '(' && my allowAllParenthesized) {
+		if (*p == U'\0') {
+			return NULL;   // all words allowed
+		} else if (*p == U'(' && my allowAllParenthesized) {
 			p ++;
 			for (;;) {
-				if (*p == '\0') {
-					return NULL;   /* Everything is parenthesized... */
-				} else if (*p == ')') {
+				if (*p == U'\0') {
+					return NULL;   // everything is parenthesized...
+				} else if (*p == U')') {
 					p ++;
 					break;
 				} else {
 					p ++;
 				}
 			}
-		} else if (*p == ' ' || (my separatingCharacters && stringContains (my separatingCharacters, *p))) {
+		} else if (*p == U' ' || (my separatingCharacters && str32chr (my separatingCharacters, *p))) {
 			p ++;
 		} else {
-			static wchar_t word [100];
-			wchar_t *q = & word [0];
+			static char32 word [100];
+			char32 *q = & word [0];
 			*start = p - sentence;
 			for (;;) {
-				if (*p == '\0' || *p == ' ' || (my separatingCharacters && stringContains (my separatingCharacters, *p))) {
-					*q ++ = '\0';
+				if (*p == U'\0' || *p == U' ' || (my separatingCharacters && str32chr (my separatingCharacters, *p))) {
+					*q ++ = U'\0';
 					if (SpellingChecker_isWordAllowed (me, word)) {
 						/* Don't increment p (may contain a zero or a parenthesis). */
 						break;
diff --git a/fon/SpellingChecker.h b/fon/SpellingChecker.h
index 9fbae88..ac7fbe6 100644
--- a/fon/SpellingChecker.h
+++ b/fon/SpellingChecker.h
@@ -2,7 +2,7 @@
 #define _SpellingChecker_h_
 /* SpellingChecker.h
  *
- * Copyright (C) 1999-2011 Paul Boersma
+ * Copyright (C) 1999-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@
 #include "Collection.h"
 
 #include "SpellingChecker_def.h"
-oo_CLASS_CREATE (SpellingChecker, Data);
+oo_CLASS_CREATE (SpellingChecker, Daata);
 
 SpellingChecker WordList_upto_SpellingChecker (WordList me);
 WordList SpellingChecker_extractWordList (SpellingChecker me);
@@ -31,10 +31,10 @@ void SpellingChecker_replaceWordList (SpellingChecker me, WordList list);
 SortedSetOfString SpellingChecker_extractUserDictionary (SpellingChecker me);
 void SpellingChecker_replaceUserDictionary (SpellingChecker me, SortedSetOfString userDictionary);
 
-bool SpellingChecker_isWordAllowed (SpellingChecker me, const wchar_t *word);
-wchar_t * SpellingChecker_nextNotAllowedWord (SpellingChecker me, const wchar_t *sentence, long *start);
+bool SpellingChecker_isWordAllowed (SpellingChecker me, const char32 *word);
+char32 * SpellingChecker_nextNotAllowedWord (SpellingChecker me, const char32 *sentence, long *start);
 
-void SpellingChecker_addNewWord (SpellingChecker me, const wchar_t *word);
+void SpellingChecker_addNewWord (SpellingChecker me, const char32 *word);
 
 /* End of file SpellingChecker.h */
 #endif
diff --git a/fon/SpellingChecker_def.h b/fon/SpellingChecker_def.h
index 94388ef..c153a45 100644
--- a/fon/SpellingChecker_def.h
+++ b/fon/SpellingChecker_def.h
@@ -1,6 +1,6 @@
 /* SpellingChecker_def.h
  *
- * Copyright (C) 1999-2007 Paul Boersma
+ * Copyright (C) 1999-2007,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,19 +22,19 @@
  */
 
 #define ooSTRUCT SpellingChecker
-oo_DEFINE_CLASS (SpellingChecker, Data)           /* CGN: */
-	oo_STRING (forbiddenStrings)              /* : ; " */
-	oo_BOOLEAN (checkMatchingParentheses)     /* true */
-	oo_STRING (separatingCharacters)          /* .,:;()!? */
-	oo_BOOLEAN (allowAllParenthesized)        /* true */
-	oo_BOOLEAN (allowAllNames)                /* true */
-	oo_STRING (namePrefixes)                  /* 's- d' l' */
-	oo_BOOLEAN (allowAllAbbreviations)        /* true */
-	oo_BOOLEAN (allowCapsSentenceInitially)   /* false */
-	oo_BOOLEAN (allowCapsAfterColon)          /* false */
-	oo_STRING (allowAllWordsContaining)       /* * xxx */
-	oo_STRING (allowAllWordsStartingWith)     /* */
-	oo_STRING (allowAllWordsEndingIn)         /* - */
+oo_DEFINE_CLASS (SpellingChecker, Daata)           // CGN:
+	oo_STRING (forbiddenStrings)              // : ; "
+	oo_BOOLEAN (checkMatchingParentheses)     // true
+	oo_STRING (separatingCharacters)          // .,:;()!?
+	oo_BOOLEAN (allowAllParenthesized)        // true
+	oo_BOOLEAN (allowAllNames)                // true
+	oo_STRING (namePrefixes)                  // 's- d' l'
+	oo_BOOLEAN (allowAllAbbreviations)        // true
+	oo_BOOLEAN (allowCapsSentenceInitially)   // false
+	oo_BOOLEAN (allowCapsAfterColon)          // false
+	oo_STRING (allowAllWordsContaining)       // * xxx
+	oo_STRING (allowAllWordsStartingWith)
+	oo_STRING (allowAllWordsEndingIn)         // -
 	oo_OBJECT (WordList, 0, wordList)
 	oo_COLLECTION (SortedSetOfString, userDictionary, SimpleString, 0)
 oo_END_CLASS (SpellingChecker)
diff --git a/fon/TextGrid.cpp b/fon/TextGrid.cpp
index 9f2db2a..74c0753 100644
--- a/fon/TextGrid.cpp
+++ b/fon/TextGrid.cpp
@@ -1,6 +1,6 @@
 /* TextGrid.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -43,18 +43,18 @@
 
 Thing_implement (TextPoint, AnyPoint, 0);
 
-TextPoint TextPoint_create (double time, const wchar_t *mark) {
+TextPoint TextPoint_create (double time, const char32 *mark) {
 	try {
 		autoTextPoint me = Thing_new (TextPoint);
 		my number = time;
-		my mark = Melder_wcsdup (mark);
+		my mark = Melder_dup (mark);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Text point not created.");
+		Melder_throw (U"Text point not created.");
 	}
 }
 
-void TextPoint_setText (TextPoint me, const wchar_t *text) {
+void TextPoint_setText (TextPoint me, const char32 *text) {
 	try {
 		/*
 		 * Be fast if the string pointers are equal.
@@ -64,29 +64,29 @@ void TextPoint_setText (TextPoint me, const wchar_t *text) {
 		 * Create a temporary variable (i.e. a temporary pointer to the final string),
 		 * in order that 'my text' does not change in case of error.
 		 */
-		autostring newText = Melder_wcsdup (text);
+		autostring32 newText = Melder_dup (text);
 		Melder_free (my mark);
 		my mark = newText.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": text not set.");
+		Melder_throw (me, U": text not set.");
 	}
 }
 
 Thing_implement (TextInterval, Function, 0);
 
-TextInterval TextInterval_create (double tmin, double tmax, const wchar_t *text) {
+TextInterval TextInterval_create (double tmin, double tmax, const char32 *text) {
 	try {
 		autoTextInterval me = Thing_new (TextInterval);
 		my xmin = tmin;
 		my xmax = tmax;
-		my text = Melder_wcsdup (text);
+		my text = Melder_dup (text);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Text interval not created.");
+		Melder_throw (U"Text interval not created.");
 	}
 }
 
-void TextInterval_setText (TextInterval me, const wchar_t *text) {
+void TextInterval_setText (TextInterval me, const char32 *text) {
 	try {
 		/*
 		 * Be fast if the string pointers are equal.
@@ -95,14 +95,14 @@ void TextInterval_setText (TextInterval me, const wchar_t *text) {
 		/*
 		 * Create without change.
 		 */
-		autostring newText = Melder_wcsdup (text);
+		autostring32 newText = Melder_dup (text);
 		/*
 		 * Change without error.
 		 */
 		Melder_free (my text);
 		my text = newText.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Text interval: text not set.");
+		Melder_throw (U"Text interval: text not set.");
 	}
 }
 
@@ -110,16 +110,16 @@ Thing_implement (TextTier, Function, 0);
 
 void structTextTier :: v_shiftX (double xfrom, double xto) {
 	TextTier_Parent :: v_shiftX (xfrom, xto);
-	for (long i = 1; i <= points -> size; i ++) {
-		TextPoint point = (TextPoint) points -> item [i];
+	for (long i = 1; i <= our numberOfPoints(); i ++) {
+		TextPoint point = our point (i);
 		NUMshift (& point -> number, xfrom, xto);
 	}
 }
 
 void structTextTier :: v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto) {
 	TextTier_Parent :: v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	for (long i = 1; i <= points -> size; i ++) {
-		TextPoint point = (TextPoint) points -> item [i];
+	for (long i = 1; i <= our numberOfPoints(); i ++) {
+		TextPoint point = our point (i);
 		NUMscale (& point -> number, xminfrom, xmaxfrom, xminto, xmaxto);
 	}
 }
@@ -132,15 +132,15 @@ TextTier TextTier_create (double tmin, double tmax) {
 		my xmax = tmax;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Point tier not created.");
+		Melder_throw (U"Point tier not created.");
 	}
 }
 
-void TextTier_addPoint (TextTier me, double time, const wchar_t *mark) {
+void TextTier_addPoint (TextTier me, double time, const char32 *mark) {
 	try {
 		Collection_addItem (my points, TextPoint_create (time, mark));
 	} catch (MelderError) {
-		Melder_throw ("Point tier: point not added.");
+		Melder_throw (U"Point tier: point not added.");
 	}
 }
 
@@ -148,16 +148,16 @@ Thing_implement (IntervalTier, Function, 0);
 
 void structIntervalTier :: v_shiftX (double xfrom, double xto) {
 	IntervalTier_Parent :: v_shiftX (xfrom, xto);
-	for (long i = 1; i <= intervals -> size; i ++) {
-		TextInterval interval = (TextInterval) intervals -> item [i];
+	for (long i = 1; i <= our numberOfIntervals(); i ++) {
+		TextInterval interval = our interval (i);
 		interval -> v_shiftX (xfrom, xto);
 	}
 }
 
 void structIntervalTier :: v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto) {
 	IntervalTier_Parent :: v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	for (long i = 1; i <= intervals -> size; i ++) {
-		TextInterval interval = (TextInterval) intervals -> item [i];
+	for (long i = 1; i <= our numberOfIntervals(); i ++) {
+		TextInterval interval = our interval (i);
 		interval -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
 	}
 }
@@ -172,20 +172,20 @@ IntervalTier IntervalTier_create (double tmin, double tmax) {
 		Collection_addItem (my intervals, interval.transfer());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Interval tier not created.");
+		Melder_throw (U"Interval tier not created.");
 	}
 }
 
 long IntervalTier_timeToLowIndex (IntervalTier me, double t) {
-	long ileft = 1, iright = my intervals -> size;
+	long ileft = 1, iright = my numberOfIntervals();
 	if (iright < 1) return 0;   // empty tier
-	TextInterval leftInterval = (TextInterval) my intervals -> item [ileft];
+	TextInterval leftInterval = my interval (ileft);
 	if (t < leftInterval -> xmin) return 0;   // very small t
-	TextInterval rightInterval = (TextInterval) my intervals -> item [iright];
+	TextInterval rightInterval = my interval (iright);
 	if (t >= rightInterval -> xmax) return 0;   // very large t
 	while (ileft < iright) {
 		long imid = (ileft + iright) / 2;
-		TextInterval midInterval = (TextInterval) my intervals -> item [imid];
+		TextInterval midInterval = my interval (imid);
 		if (t >= midInterval -> xmax) {
 			ileft = imid + 1;
 		} else {
@@ -196,15 +196,15 @@ long IntervalTier_timeToLowIndex (IntervalTier me, double t) {
 }
 
 long IntervalTier_timeToIndex (IntervalTier me, double t) {
-	long ileft = 1, iright = my intervals -> size;
+	long ileft = 1, iright = my numberOfIntervals();
 	if (iright < 1) return 0;   // empty tier
-	TextInterval leftInterval = (TextInterval) my intervals -> item [ileft];
+	TextInterval leftInterval = my interval (ileft);
 	if (t < leftInterval -> xmin) return 0;   // very small t
-	TextInterval rightInterval = (TextInterval) my intervals -> item [iright];
+	TextInterval rightInterval = my interval (iright);
 	if (t > rightInterval -> xmax) return 0;   // very large t
 	while (ileft < iright) {
 		long imid = (ileft + iright) / 2;
-		TextInterval midInterval = (TextInterval) my intervals -> item [imid];
+		TextInterval midInterval = my interval (imid);
 		if (t >= midInterval -> xmax) {
 			ileft = imid + 1;
 		} else {
@@ -215,15 +215,15 @@ long IntervalTier_timeToIndex (IntervalTier me, double t) {
 }
 
 long IntervalTier_timeToHighIndex (IntervalTier me, double t) {
-	long ileft = 1, iright = my intervals -> size;
+	long ileft = 1, iright = my numberOfIntervals();
 	if (iright < 1) return 0;   // empty tier
-	TextInterval leftInterval = (TextInterval) my intervals -> item [ileft];
+	TextInterval leftInterval = my interval (ileft);
 	if (t <= leftInterval -> xmin) return 0;   // very small t
-	TextInterval rightInterval = (TextInterval) my intervals -> item [iright];
+	TextInterval rightInterval = my interval (iright);
 	if (t > rightInterval -> xmax) return 0;   // very large t
 	while (ileft < iright) {
 		long imid = (ileft + iright) / 2;
-		TextInterval midInterval = (TextInterval) my intervals -> item [imid];
+		TextInterval midInterval = my interval (imid);
 		if (t > midInterval -> xmax) {
 			ileft = imid + 1;
 		} else {
@@ -234,15 +234,15 @@ long IntervalTier_timeToHighIndex (IntervalTier me, double t) {
 }
 
 long IntervalTier_hasTime (IntervalTier me, double t) {
-	long ileft = 1, iright = my intervals -> size;
+	long ileft = 1, iright = my numberOfIntervals();
 	if (iright < 1) return 0;   // empty tier
-	TextInterval leftInterval = (TextInterval) my intervals -> item [ileft];
+	TextInterval leftInterval = my interval (ileft);
 	if (t < leftInterval -> xmin) return 0;   // very small t
-	TextInterval rightInterval = (TextInterval) my intervals -> item [iright];
+	TextInterval rightInterval = my interval (iright);
 	if (t > rightInterval -> xmax) return 0;   // very large t
 	while (ileft < iright) {
 		long imid = (ileft + iright) / 2;
-		TextInterval midInterval = (TextInterval) my intervals -> item [imid];
+		TextInterval midInterval = my interval (imid);
 		if (t >= midInterval -> xmax) {
 			ileft = imid + 1;
 		} else {
@@ -252,66 +252,66 @@ long IntervalTier_hasTime (IntervalTier me, double t) {
 	/*
 	 * We now know that t is within interval ileft.
 	 */
-	leftInterval = (TextInterval) my intervals -> item [ileft];
+	leftInterval = my interval (ileft);
 	if (t == leftInterval -> xmin || t == leftInterval -> xmax) return ileft;
 	return 0;   // not found
 }
 
 long IntervalTier_hasBoundary (IntervalTier me, double t) {
-	long ileft = 2, iright = my intervals -> size;
+	long ileft = 2, iright = my numberOfIntervals();
 	if (iright < 2) return 0;   // tier without inner boundaries
-	TextInterval leftInterval = (TextInterval) my intervals -> item [ileft];
+	TextInterval leftInterval = my interval (ileft);
 	if (t < leftInterval -> xmin) return 0;   // very small t
-	TextInterval rightInterval = (TextInterval) my intervals -> item [iright];
+	TextInterval rightInterval = my interval (iright);
 	if (t >= rightInterval -> xmax) return 0;   // very large t
 	while (ileft < iright) {
 		long imid = (ileft + iright) / 2;
-		TextInterval midInterval = (TextInterval) my intervals -> item [imid];
+		TextInterval midInterval = my interval (imid);
 		if (t >= midInterval -> xmax) {
 			ileft = imid + 1;
 		} else {
 			iright = imid;
 		}
 	}
-	leftInterval = (TextInterval) my intervals -> item [ileft];
+	leftInterval = my interval (ileft);
 	if (t == leftInterval -> xmin) return ileft;
 	return 0;   // not found
 }
 
 void structTextGrid :: v_info () {
-	long ntier = tiers -> size;
-	long numberOfIntervalTiers = 0, numberOfPointTiers = 0, numberOfIntervals = 0, numberOfPoints = 0;
-	structData :: v_info ();
-	for (long itier = 1; itier <= ntier; itier ++) {
-		Function anyTier = (Function) tiers -> item [itier];
+	structDaata :: v_info ();
+
+	long intervalTierCount = 0, pointTierCount = 0, intervalCount = 0, pointCount = 0;
+	for (long itier = 1; itier <= our numberOfTiers(); itier ++) {
+		Function anyTier = our tier (itier);
 		if (anyTier -> classInfo == classIntervalTier) {
-			IntervalTier tier = (IntervalTier) anyTier;
-			numberOfIntervalTiers += 1;
-			numberOfIntervals += tier -> intervals -> size;
+			IntervalTier intervalTier = static_cast <IntervalTier> (anyTier);
+			intervalTierCount += 1;
+			intervalCount += intervalTier -> numberOfIntervals();
 		} else {
-			TextTier tier = (TextTier) anyTier;
-			numberOfPointTiers += 1;
-			numberOfPoints += tier -> points -> size;
+			TextTier textTier = static_cast <TextTier> (anyTier);
+			pointTierCount += 1;
+			pointCount += textTier -> numberOfPoints();
 		}
 	}
-	MelderInfo_writeLine (L"Number of interval tiers: ", Melder_integer (numberOfIntervalTiers));
-	MelderInfo_writeLine (L"Number of point tiers: ", Melder_integer (numberOfPointTiers));
-	MelderInfo_writeLine (L"Number of intervals: ", Melder_integer (numberOfIntervals));
-	MelderInfo_writeLine (L"Number of points: ", Melder_integer (numberOfPoints));
+	MelderInfo_writeLine (U"Number of interval tiers: ", intervalTierCount);
+	MelderInfo_writeLine (U"Number of point tiers: ", pointTierCount);
+	MelderInfo_writeLine (U"Number of intervals: ", intervalCount);
+	MelderInfo_writeLine (U"Number of points: ", pointCount);
 }
 
-static void IntervalTier_addInterval_unsafe (IntervalTier me, double tmin, double tmax, const wchar_t *label) {
+static void IntervalTier_addInterval_unsafe (IntervalTier me, double tmin, double tmax, const char32 *label) {
 	autoTextInterval interval = TextInterval_create (tmin, tmax, label);
 	Collection_addItem (my intervals, interval.transfer());
 }
 
 void structTextGrid :: v_repair () {
-	for (long itier = 1; itier <= our numberOfTiers (); itier ++) {
+	for (long itier = 1; itier <= our numberOfTiers(); itier ++) {
 		Function anyTier = our tier (itier);
 		if (anyTier -> classInfo == classIntervalTier) {
-			IntervalTier tier = (IntervalTier) anyTier;
-			if (tier -> numberOfIntervals () == 0) {
-				IntervalTier_addInterval_unsafe (tier, tier -> xmin, tier -> xmax, L"");
+			IntervalTier tier = static_cast <IntervalTier> (anyTier);
+			if (tier -> numberOfIntervals() == 0) {
+				IntervalTier_addInterval_unsafe (tier, tier -> xmin, tier -> xmax, U"");
 			}
 		}
 	}
@@ -319,16 +319,16 @@ void structTextGrid :: v_repair () {
 
 void structTextGrid :: v_shiftX (double xfrom, double xto) {
 	TextGrid_Parent :: v_shiftX (xfrom, xto);
-	for (long i = 1; i <= tiers -> size; i ++) {
-		Function tier = (Function) tiers -> item [i];
+	for (long i = 1; i <= our numberOfTiers(); i ++) {
+		Function tier = our tier (i);
 		tier -> v_shiftX (xfrom, xto);
 	}
 }
 
 void structTextGrid :: v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto) {
 	TextGrid_Parent :: v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
-	for (long i = 1; i <= tiers -> size; i ++) {
-		Function tier = (Function) tiers -> item [i];
+	for (long i = 1; i <= our numberOfTiers(); i ++) {
+		Function tier = our tier (i);
 		tier -> v_scaleX (xminfrom, xmaxfrom, xminto, xmaxto);
 	}
 }
@@ -343,21 +343,21 @@ TextGrid TextGrid_createWithoutTiers (double tmin, double tmax) {
 		my xmax = tmax;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrid not created.");
+		Melder_throw (U"TextGrid not created.");
 	}
 }
 
-TextGrid TextGrid_create (double tmin, double tmax, const wchar_t *tierNames, const wchar_t *pointTiers) {
+TextGrid TextGrid_create (double tmin, double tmax, const char32 *tierNames, const char32 *pointTiers) {
 	try {
 		autoTextGrid me = TextGrid_createWithoutTiers (tmin, tmax);
-		wchar_t nameBuffer [400], *last;
+		char32 nameBuffer [400];
 
 		/*
 		 * Create a number of IntervalTier objects.
 		 */
 		if (tierNames && tierNames [0]) {
-			wcscpy (nameBuffer, tierNames);
-			for (wchar_t *tierName = Melder_wcstok (nameBuffer, L" ", & last); tierName != NULL; tierName = Melder_wcstok (NULL, L" ", & last)) {
+			str32cpy (nameBuffer, tierNames);
+			for (char32 *tierName = Melder_tok (nameBuffer, U" "); tierName != NULL; tierName = Melder_tok (NULL, U" ")) {
 				autoIntervalTier tier = IntervalTier_create (tmin, tmax);
 				Thing_setName (tier.peek(), tierName);
 				Collection_addItem (my tiers, tier.transfer());
@@ -368,23 +368,23 @@ TextGrid TextGrid_create (double tmin, double tmax, const wchar_t *tierNames, co
 		 * Replace some IntervalTier objects with TextTier objects.
 		 */
 		if (pointTiers && pointTiers [0]) {
-			wcscpy (nameBuffer, pointTiers);
-			for (wchar_t *tierName = Melder_wcstok (nameBuffer, L" ", & last); tierName != NULL; tierName = Melder_wcstok (NULL, L" ", & last)) {
-				for (long itier = 1; itier <= my tiers -> size; itier ++) {
-					if (wcsequ (tierName, Thing_getName ((Thing) my tiers -> item [itier]))) {
+			str32cpy (nameBuffer, pointTiers);
+			for (char32 *tierName = Melder_tok (nameBuffer, U" "); tierName != NULL; tierName = Melder_tok (NULL, U" ")) {
+				for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
+					if (str32equ (tierName, Thing_getName (my tier (itier)))) {
 						autoTextTier tier = TextTier_create (tmin, tmax);
 						Thing_setName (tier.peek(), tierName);
-						forget (((Function *) my tiers -> item) [itier]);
-						my tiers -> item [itier] = tier.transfer();
+						forget (my tier (itier));
+						my tier (itier) = tier.transfer();
 					}
 				}
 			}
 		}
-		if (my tiers -> size == 0)
-			Melder_throw ("Cannot create a TextGrid without tiers. Supply at least one tier name.");
+		if (my numberOfTiers() == 0)
+			Melder_throw (U"Cannot create a TextGrid without tiers. Supply at least one tier name.");
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrid not created.");
+		Melder_throw (U"TextGrid not created.");
 	}
 }
 
@@ -401,7 +401,7 @@ TextTier TextTier_readFromXwaves (MelderFile file) {
 		for (;;) {
 			line = MelderFile_readLine (file);
 			if (line == NULL)
-				Melder_throw ("Missing '#' line.");
+				Melder_throw (U"Missing '#' line.");
 			if (line [0] == '#') break;
 		}
 
@@ -415,114 +415,144 @@ TextTier TextTier_readFromXwaves (MelderFile file) {
 			long colour;
 			char mark [300];
 			if (sscanf (line, "%lf%ld%s", & time, & colour, mark) < 3)   // BUG: buffer overflow
-				Melder_throw ("Line too short: \"", line, "\".");
-			TextTier_addPoint (me.peek(), time, Melder_peekUtf8ToWcs (mark));
+				Melder_throw (U"Line too short: \"", Melder_peek8to32 (line), U"\".");
+			TextTier_addPoint (me.peek(), time, Melder_peek8to32 (mark));
 		}
 
 		/*
 		 * Fix domain.
 		 */
-		if (my points -> size) {
-			TextPoint point = (TextPoint) my points -> item [1];
+		if (my numberOfPoints() > 0) {
+			TextPoint point = my point (1);
 			if (point -> number < 0.0) my xmin = point -> number - 1.0;
-			point = (TextPoint) my points -> item [my points -> size];
+			point = my point (my numberOfPoints());
 			my xmax = point -> number + 1.0;
 		}
 		mfile.close ();
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextTier not read from Xwaves file.");
+		Melder_throw (U"TextTier not read from Xwaves file.");
 	}
 }
 
 Function TextGrid_checkSpecifiedTierNumberWithinRange (TextGrid me, long tierNumber) {
 	if (tierNumber < 1)
-		Melder_throw (me, ": the specified tier number is ", tierNumber, ", but should be at least 1.");
-	if (tierNumber > my tiers -> size)
-		Melder_throw (me, ": the specified tier number (", tierNumber, ") exceeds my number of tiers (", my tiers -> size, ").");	
+		Melder_throw (me, U": the specified tier number is ", tierNumber, U", but should be at least 1.");
+	if (tierNumber > my numberOfTiers())
+		Melder_throw (me, U": the specified tier number (", tierNumber, U") exceeds my number of tiers (", my numberOfTiers(), U").");
 	return my tier (tierNumber);
 }
 
 IntervalTier TextGrid_checkSpecifiedTierIsIntervalTier (TextGrid me, long tierNumber) {
 	Function tier = TextGrid_checkSpecifiedTierNumberWithinRange (me, tierNumber);
 	if (tier -> classInfo != classIntervalTier)
-		Melder_throw ("Tier ", tierNumber, " is not an interval tier.");
+		Melder_throw (U"Tier ", tierNumber, U" is not an interval tier.");
 	return static_cast <IntervalTier> (tier);
 }
 
 TextTier TextGrid_checkSpecifiedTierIsPointTier (TextGrid me, long tierNumber) {
 	Function tier = TextGrid_checkSpecifiedTierNumberWithinRange (me, tierNumber);
 	if (tier -> classInfo != classTextTier)
-		Melder_throw ("Tier ", tierNumber, " is not a point tier.");
+		Melder_throw (U"Tier ", tierNumber, U" is not a point tier.");
 	return static_cast <TextTier> (tier);
 }
 
-long TextGrid_countLabels (TextGrid me, long tierNumber, const wchar_t *text) {
+long TextGrid_countLabels (TextGrid me, long tierNumber, const char32 *text) {
 	try {
 		Function anyTier = TextGrid_checkSpecifiedTierNumberWithinRange (me, tierNumber);
 		long count = 0;
 		if (anyTier -> classInfo == classIntervalTier) {
-			IntervalTier tier = (IntervalTier) anyTier;
-			for (long i = 1; i <= tier -> numberOfIntervals (); i ++) {
+			IntervalTier tier = static_cast <IntervalTier> (anyTier);
+			for (long i = 1; i <= tier -> numberOfIntervals(); i ++) {
 				TextInterval segment = tier -> interval (i);
-				if (segment -> text && wcsequ (segment -> text, text))
+				if (segment -> text && str32equ (segment -> text, text))
 					count ++;
 			}
 		} else {
-			TextTier tier = (TextTier) anyTier;
-			for (long i = 1; i <= tier -> numberOfPoints (); i ++) {
+			TextTier tier = static_cast <TextTier> (anyTier);
+			for (long i = 1; i <= tier -> numberOfPoints(); i ++) {
 				TextPoint point = tier -> point (i);
-				if (point -> mark && wcsequ (point -> mark, text))
+				if (point -> mark && str32equ (point -> mark, text))
 					count ++;
 			}
 		}
 		return count;
 	} catch (MelderError) {
-		Melder_throw (me, ": labels not counted.");
+		Melder_throw (me, U": labels not counted.");
+	}
+}
+
+long TextGrid_countIntervalsWhere (TextGrid me, long tierNumber, int which_Melder_STRING, const char32 *criterion) {
+	try {
+		long count = 0;
+		IntervalTier tier = TextGrid_checkSpecifiedTierIsIntervalTier (me, tierNumber);
+		for (long iinterval = 1; iinterval <= tier -> numberOfIntervals(); iinterval ++) {
+			TextInterval interval = tier -> interval (iinterval);
+			if (Melder_stringMatchesCriterion (interval -> text, which_Melder_STRING, criterion)) {
+				count ++;
+			}
+		}
+		return count;
+	} catch (MelderError) {
+		Melder_throw (me, U": intervals not counted.");
+	}
+}
+
+long TextGrid_countPointsWhere (TextGrid me, long tierNumber, int which_Melder_STRING, const char32 *criterion) {
+	try {
+		long count = 0;
+		TextTier tier = TextGrid_checkSpecifiedTierIsPointTier (me, tierNumber);
+		for (long ipoint = 1; ipoint <= tier -> numberOfPoints(); ipoint ++) {
+			TextPoint point = tier -> point (ipoint);
+			if (Melder_stringMatchesCriterion (point -> mark, which_Melder_STRING, criterion)) {
+				count ++;
+			}
+		}
+		return count;
+	} catch (MelderError) {
+		Melder_throw (me, U": points not counted.");
 	}
 }
 
-void TextGrid_addTier (TextGrid me, Function anyTier) {
+void TextGrid_addTier_copy (TextGrid me, Function anyTier) {
 	try {
 		autoFunction tier = Data_copy (anyTier);
 		if (tier -> xmin < my xmin) my xmin = tier -> xmin;
 		if (tier -> xmax > my xmax) my xmax = tier -> xmax;
 		Collection_addItem (my tiers, tier.transfer());
 	} catch (MelderError) {
-		Melder_throw (me, ": tier not added.");
+		Melder_throw (me, U": tier not added.");
 	}
 }
 
 TextGrid TextGrid_merge (Collection textGrids) {
 	try {
 		if (textGrids -> size < 1)
-			Melder_throw ("Cannot merge zero TextGrid objects.");
+			Melder_throw (U"Cannot merge zero TextGrid objects.");
 		autoTextGrid thee = Data_copy ((TextGrid) textGrids -> item [1]);
 		for (long igrid = 2; igrid <= textGrids -> size; igrid ++) {
 			TextGrid textGrid = (TextGrid) textGrids -> item [igrid];
-			for (long itier = 1; itier <= textGrid -> tiers -> size; itier ++) {
-				TextGrid_addTier (thee.peek(), (TextGrid) textGrid -> tiers -> item [itier]);
+			for (long itier = 1; itier <= textGrid -> numberOfTiers(); itier ++) {
+				TextGrid_addTier_copy (thee.peek(), textGrid -> tier (itier));
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrids not merged.");
+		Melder_throw (U"TextGrids not merged.");
 	}
 }
 
 TextGrid TextGrid_extractPart (TextGrid me, double tmin, double tmax, int preserveTimes) {
 	try {
-		autoTextGrid thee = (TextGrid) Data_copy (me);
-		int ntier = my tiers -> size;
+		autoTextGrid thee = Data_copy (me);
 		if (tmax <= tmin) return thee.transfer();
 
-		for (long itier = 1; itier <= ntier; itier ++) {
-			Function anyTier = (Function) thy tiers -> item [itier];
+		for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
+			Function anyTier = thy tier (itier);
 			if (anyTier -> classInfo == classIntervalTier) {
-				IntervalTier tier = (IntervalTier) anyTier;
-				long ninterval = tier -> intervals -> size;
-				for (long iinterval = ninterval; iinterval >= 1; iinterval --) {
-					TextInterval interval = (TextInterval) tier -> intervals -> item [iinterval];
+				IntervalTier tier = static_cast <IntervalTier> (anyTier);
+				for (long iinterval = tier -> numberOfIntervals(); iinterval >= 1; iinterval --) {
+					TextInterval interval = tier -> interval (iinterval);
 					if (interval -> xmin >= tmax || interval -> xmax <= tmin) {
 						Collection_removeItem (tier -> intervals, iinterval);
 					} else {
@@ -531,11 +561,12 @@ TextGrid TextGrid_extractPart (TextGrid me, double tmin, double tmax, int preser
 					}
 				}
 			} else {
-				TextTier tier = (TextTier) anyTier;
-				long n = tier -> points -> size;
-				for (long i = n; i >= 1; i --) {
-					TextPoint point = (TextPoint) tier -> points -> item [i];
-					if (point -> number < tmin || point -> number > tmax) Collection_removeItem (tier -> points, i);
+				TextTier textTier = static_cast <TextTier> (anyTier);
+				for (long ipoint = textTier -> numberOfPoints(); ipoint >= 1; ipoint --) {
+					TextPoint point = textTier -> point (ipoint);
+					if (point -> number < tmin || point -> number > tmax) {
+						Collection_removeItem (textTier -> points, ipoint);
+					}
 				}
 			}
 			anyTier -> xmin = tmin;
@@ -546,7 +577,7 @@ TextGrid TextGrid_extractPart (TextGrid me, double tmin, double tmax, int preser
 		if (! preserveTimes) Function_shiftXTo (thee.peek(), thy xmin, 0.0);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": part not extracted.");
+		Melder_throw (me, U": part not extracted.");
 	}
 }
 
@@ -573,10 +604,10 @@ TextGrid Label_to_TextGrid (Label me, double duration) {
 	try {
 		double tmin = 0.0, tmax = duration;
 		if (duration == 0.0) Label_suggestDomain (me, & tmin, & tmax);
-	Melder_casual ("%g %g %g", duration,tmin,tmax);
+		trace (duration, U" ", tmin, U" ", tmax);
 		return _Label_to_TextGrid (me, tmin, tmax);
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TextGrid.");
+		Melder_throw (me, U": not converted to TextGrid.");
 	}
 }
 
@@ -584,11 +615,11 @@ TextGrid Label_Function_to_TextGrid (Label me, Any function) {
 	try {
 		return _Label_to_TextGrid (me, ((Function) function) -> xmin, ((Function) function) -> xmax);
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TextGrid.");
+		Melder_throw (me, U": not converted to TextGrid.");
 	}
 }
 
-TextTier PointProcess_upto_TextTier (PointProcess me, const wchar_t *text) {
+TextTier PointProcess_upto_TextTier (PointProcess me, const char32 *text) {
 	try {
 		autoTextTier thee = TextTier_create (my xmin, my xmax);
 		for (long i = 1; i <= my nt; i ++) {
@@ -596,17 +627,17 @@ TextTier PointProcess_upto_TextTier (PointProcess me, const wchar_t *text) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TextTier.");
+		Melder_throw (me, U": not converted to TextTier.");
 	}
 }
 
-PointProcess TextTier_getPoints (TextTier me, const wchar_t *text) {
+PointProcess TextTier_getPoints (TextTier me, const char32 *text) {
 	try {
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		for (long i = 1; i <= my points -> size; i ++) {
-			TextPoint point = (TextPoint) my points -> item [i];
+		for (long i = 1; i <= my numberOfPoints(); i ++) {
+			TextPoint point = my point (i);
 			if (text && text [0]) {
-				if (point -> mark && wcsequ (text, point -> mark))
+				if (point -> mark && str32equ (text, point -> mark))
 					PointProcess_addPoint (thee.peek(), point -> number);
 			} else {
 				if (! point -> mark || ! point -> mark [0])
@@ -615,17 +646,17 @@ PointProcess TextTier_getPoints (TextTier me, const wchar_t *text) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": points not converted to PointProcess.");
+		Melder_throw (me, U": points not converted to PointProcess.");
 	}
 }
 
-PointProcess IntervalTier_getStartingPoints (IntervalTier me, const wchar_t *text) {
+PointProcess IntervalTier_getStartingPoints (IntervalTier me, const char32 *text) {
 	try {
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		for (long i = 1; i <= my intervals -> size; i ++) {
-			TextInterval interval = (TextInterval) my intervals -> item [i];
+		for (long i = 1; i <= my numberOfIntervals(); i ++) {
+			TextInterval interval = my interval (i);
 			if (text && text [0]) {
-				if (interval -> text && wcsequ (text, interval -> text))
+				if (interval -> text && str32equ (text, interval -> text))
 					PointProcess_addPoint (thee.peek(), interval -> xmin);
 			} else {
 				if (! interval -> text || ! interval -> text [0])
@@ -634,17 +665,17 @@ PointProcess IntervalTier_getStartingPoints (IntervalTier me, const wchar_t *tex
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": starting points not gotten.");
+		Melder_throw (me, U": starting points not gotten.");
 	}
 }
 
-PointProcess IntervalTier_getEndPoints (IntervalTier me, const wchar_t *text) {
+PointProcess IntervalTier_getEndPoints (IntervalTier me, const char32 *text) {
 	try {
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		for (long i = 1; i <= my intervals -> size; i ++) {
-			TextInterval interval = (TextInterval) my intervals -> item [i];
+		for (long i = 1; i <= my numberOfIntervals(); i ++) {
+			TextInterval interval = my interval (i);
 			if (text && text [0]) {
-				if (interval -> text && wcsequ (text, interval -> text))
+				if (interval -> text && str32equ (text, interval -> text))
 					PointProcess_addPoint (thee.peek(), interval -> xmax);
 			} else {
 				if (! interval -> text || ! interval -> text [0])
@@ -653,17 +684,17 @@ PointProcess IntervalTier_getEndPoints (IntervalTier me, const wchar_t *text) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": end points not gotten.");
+		Melder_throw (me, U": end points not gotten.");
 	}
 }
 
-PointProcess IntervalTier_getCentrePoints (IntervalTier me, const wchar_t *text) {
+PointProcess IntervalTier_getCentrePoints (IntervalTier me, const char32 *text) {
 	try {
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		for (long i = 1; i <= my intervals -> size; i ++) {
-			TextInterval interval = (TextInterval) my intervals -> item [i];
+		for (long i = 1; i <= my numberOfIntervals(); i ++) {
+			TextInterval interval = my interval (i);
 			if (text && text [0]) {
-				if (interval -> text && wcsequ (text, interval -> text))
+				if (interval -> text && str32equ (text, interval -> text))
 					PointProcess_addPoint (thee.peek(), 0.5 * (interval -> xmin + interval -> xmax));
 			} else {
 				if (! interval -> text || ! interval -> text [0])
@@ -672,15 +703,15 @@ PointProcess IntervalTier_getCentrePoints (IntervalTier me, const wchar_t *text)
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": centre points not gotten.");
+		Melder_throw (me, U": centre points not gotten.");
 	}
 }
 
-PointProcess TextGrid_getStartingPoints (TextGrid me, long tierNumber, int which_Melder_STRING, const wchar_t *criterion) {
+PointProcess TextGrid_getStartingPoints (TextGrid me, long tierNumber, int which_Melder_STRING, const char32 *criterion) {
 	try {
 		IntervalTier tier = TextGrid_checkSpecifiedTierIsIntervalTier (me, tierNumber);
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		for (long iinterval = 1; iinterval <= tier -> numberOfIntervals (); iinterval ++) {
+		for (long iinterval = 1; iinterval <= tier -> numberOfIntervals(); iinterval ++) {
 			TextInterval interval = tier -> interval (iinterval);
 			if (Melder_stringMatchesCriterion (interval -> text, which_Melder_STRING, criterion)) {
 				PointProcess_addPoint (thee.peek(), interval -> xmin);
@@ -688,15 +719,15 @@ PointProcess TextGrid_getStartingPoints (TextGrid me, long tierNumber, int which
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": starting points not converted to PointProcess.");
+		Melder_throw (me, U": starting points not converted to PointProcess.");
 	}
 }
 
-PointProcess TextGrid_getEndPoints (TextGrid me, long tierNumber, int which_Melder_STRING, const wchar_t *criterion) {
+PointProcess TextGrid_getEndPoints (TextGrid me, long tierNumber, int which_Melder_STRING, const char32 *criterion) {
 	try {
 		IntervalTier tier = TextGrid_checkSpecifiedTierIsIntervalTier (me, tierNumber);
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		for (long iinterval = 1; iinterval <= tier -> numberOfIntervals (); iinterval ++) {
+		for (long iinterval = 1; iinterval <= tier -> numberOfIntervals(); iinterval ++) {
 			TextInterval interval = tier -> interval (iinterval);
 			if (Melder_stringMatchesCriterion (interval -> text, which_Melder_STRING, criterion)) {
 				PointProcess_addPoint (thee.peek(), interval -> xmax);
@@ -704,15 +735,15 @@ PointProcess TextGrid_getEndPoints (TextGrid me, long tierNumber, int which_Meld
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": end points not converted to PointProcess.");
+		Melder_throw (me, U": end points not converted to PointProcess.");
 	}
 }
 
-PointProcess TextGrid_getCentrePoints (TextGrid me, long tierNumber, int which_Melder_STRING, const wchar_t *criterion) {
+PointProcess TextGrid_getCentrePoints (TextGrid me, long tierNumber, int which_Melder_STRING, const char32 *criterion) {
 	try {
 		IntervalTier tier = TextGrid_checkSpecifiedTierIsIntervalTier (me, tierNumber);
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		for (long iinterval = 1; iinterval <= tier -> numberOfIntervals (); iinterval ++) {
+		for (long iinterval = 1; iinterval <= tier -> numberOfIntervals(); iinterval ++) {
 			TextInterval interval = tier -> interval (iinterval);
 			if (Melder_stringMatchesCriterion (interval -> text, which_Melder_STRING, criterion)) {
 				PointProcess_addPoint (thee.peek(), 0.5 * (interval -> xmin + interval -> xmax));
@@ -720,15 +751,15 @@ PointProcess TextGrid_getCentrePoints (TextGrid me, long tierNumber, int which_M
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": centre points not converted to PointProcess.");
+		Melder_throw (me, U": centre points not converted to PointProcess.");
 	}
 }
 
-PointProcess TextGrid_getPoints (TextGrid me, long tierNumber, int which_Melder_STRING, const wchar_t *criterion) {
+PointProcess TextGrid_getPoints (TextGrid me, long tierNumber, int which_Melder_STRING, const char32 *criterion) {
 	try {
 		TextTier tier = TextGrid_checkSpecifiedTierIsPointTier (me, tierNumber);
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		for (long ipoint = 1; ipoint <= tier -> numberOfPoints (); ipoint ++) {
+		for (long ipoint = 1; ipoint <= tier -> numberOfPoints(); ipoint ++) {
 			TextPoint point = tier -> point (ipoint);
 			if (Melder_stringMatchesCriterion (point -> mark, which_Melder_STRING, criterion)) {
 				PointProcess_addPoint (thee.peek(), point -> number);
@@ -736,21 +767,21 @@ PointProcess TextGrid_getPoints (TextGrid me, long tierNumber, int which_Melder_
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": points not converted to PointProcess.");
+		Melder_throw (me, U": points not converted to PointProcess.");
 	}
 }
 
 PointProcess TextGrid_getPoints_preceded (TextGrid me, long tierNumber,
-	int which_Melder_STRING, const wchar_t *criterion,
-	int which_Melder_STRING_precededBy, const wchar_t *criterion_precededBy)
+	int which_Melder_STRING, const char32 *criterion,
+	int which_Melder_STRING_precededBy, const char32 *criterion_precededBy)
 {
 	try {
 		TextTier tier = TextGrid_checkSpecifiedTierIsPointTier (me, tierNumber);
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		for (long ipoint = 1; ipoint <= tier -> numberOfPoints (); ipoint ++) {
+		for (long ipoint = 1; ipoint <= tier -> numberOfPoints(); ipoint ++) {
 			TextPoint point = tier -> point (ipoint);
 			if (Melder_stringMatchesCriterion (point -> mark, which_Melder_STRING, criterion)) {
-				TextPoint preceding = ipoint <= 1 ? NULL : (TextPoint) tier -> points -> item [ipoint - 1];
+				TextPoint preceding = ipoint <= 1 ? NULL : tier -> point (ipoint - 1);
 				if (Melder_stringMatchesCriterion (preceding -> mark, which_Melder_STRING_precededBy, criterion_precededBy)) {
 					PointProcess_addPoint (thee.peek(), point -> number);
 				}
@@ -758,21 +789,21 @@ PointProcess TextGrid_getPoints_preceded (TextGrid me, long tierNumber,
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": points not converted to PointProcess.");
+		Melder_throw (me, U": points not converted to PointProcess.");
 	}
 }
 
 PointProcess TextGrid_getPoints_followed (TextGrid me, long tierNumber,
-	int which_Melder_STRING, const wchar_t *criterion,
-	int which_Melder_STRING_followedBy, const wchar_t *criterion_followedBy)
+	int which_Melder_STRING, const char32 *criterion,
+	int which_Melder_STRING_followedBy, const char32 *criterion_followedBy)
 {
 	try {
 		TextTier tier = TextGrid_checkSpecifiedTierIsPointTier (me, tierNumber);
 		autoPointProcess thee = PointProcess_create (my xmin, my xmax, 10);
-		for (long ipoint = 1; ipoint <= tier -> numberOfPoints (); ipoint ++) {
+		for (long ipoint = 1; ipoint <= tier -> numberOfPoints(); ipoint ++) {
 			TextPoint point = tier -> point (ipoint);
 			if (Melder_stringMatchesCriterion (point -> mark, which_Melder_STRING, criterion)) {
-				TextPoint following = ipoint >= tier -> points -> size ? NULL : (TextPoint) tier -> points -> item [ipoint + 1];
+				TextPoint following = ipoint >= tier -> numberOfPoints() ? NULL : tier -> point (ipoint + 1);
 				if (Melder_stringMatchesCriterion (following -> mark, which_Melder_STRING_followedBy, criterion_followedBy)) {
 					PointProcess_addPoint (thee.peek(), point -> number);
 				}
@@ -780,7 +811,7 @@ PointProcess TextGrid_getPoints_followed (TextGrid me, long tierNumber,
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": points not converted to PointProcess.");
+		Melder_throw (me, U": points not converted to PointProcess.");
 	}
 }
 
@@ -798,7 +829,7 @@ PointProcess IntervalTier_PointProcess_startToCentre (IntervalTier tier, PointPr
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (tier, " & ", point, ": starts of intervals not converted to PointProcess.");
+		Melder_throw (tier, U" & ", point, U": starts of intervals not converted to PointProcess.");
 	}
 }
 
@@ -816,28 +847,28 @@ PointProcess IntervalTier_PointProcess_endToCentre (IntervalTier tier, PointProc
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (tier, " & ", point, ": ends of intervals not converted to PointProcess.");
+		Melder_throw (tier, U" & ", point, U": ends of intervals not converted to PointProcess.");
 	}
 }
 
-TableOfReal IntervalTier_downto_TableOfReal (IntervalTier me, const wchar_t *label) {
+TableOfReal IntervalTier_downto_TableOfReal (IntervalTier me, const char32 *label) {
 	try {
 		long n = 0;
-		for (long i = 1; i <= my numberOfIntervals (); i ++) {
+		for (long i = 1; i <= my numberOfIntervals(); i ++) {
 			TextInterval interval = my interval (i);
-			if (label == NULL || (label [0] == '\0' && ! interval -> text) || (interval -> text && wcsequ (interval -> text, label)))
+			if (label == NULL || (label [0] == U'\0' && ! interval -> text) || (interval -> text && str32equ (interval -> text, label)))
 				n ++;
 		}
 		autoTableOfReal thee = TableOfReal_create (n, 3);
-		TableOfReal_setColumnLabel (thee.peek(), 1, L"Start");
-		TableOfReal_setColumnLabel (thee.peek(), 2, L"End");
-		TableOfReal_setColumnLabel (thee.peek(), 3, L"Duration");
+		TableOfReal_setColumnLabel (thee.peek(), 1, U"Start");
+		TableOfReal_setColumnLabel (thee.peek(), 2, U"End");
+		TableOfReal_setColumnLabel (thee.peek(), 3, U"Duration");
 		n = 0;
-		for (long i = 1; i <= my numberOfIntervals (); i ++) {
+		for (long i = 1; i <= my numberOfIntervals(); i ++) {
 			TextInterval interval = my interval (i);
-			if (label == NULL || (label [0] == '\0' && ! interval -> text) || (interval -> text && wcsequ (interval -> text, label))) {
+			if (label == NULL || (label [0] == U'\0' && ! interval -> text) || (interval -> text && str32equ (interval -> text, label))) {
 				n ++;
-				TableOfReal_setRowLabel (thee.peek(), n, interval -> text ? interval -> text : L"");
+				TableOfReal_setRowLabel (thee.peek(), n, interval -> text ? interval -> text : U"");
 				thy data [n] [1] = interval -> xmin;
 				thy data [n] [2] = interval -> xmax;
 				thy data [n] [3] = interval -> xmax - interval -> xmin;
@@ -845,7 +876,7 @@ TableOfReal IntervalTier_downto_TableOfReal (IntervalTier me, const wchar_t *lab
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TableOfReal.");
+		Melder_throw (me, U": not converted to TableOfReal.");
 	}
 }
 
@@ -853,28 +884,28 @@ TableOfReal IntervalTier_downto_TableOfReal_any (IntervalTier me) {
 	return IntervalTier_downto_TableOfReal (me, NULL);
 }
 
-TableOfReal TextTier_downto_TableOfReal (TextTier me, const wchar_t *label) {
+TableOfReal TextTier_downto_TableOfReal (TextTier me, const char32 *label) {
 	try {
 		long n = 0;
-		for (long i = 1; i <= my points -> size; i ++) {
-			TextPoint point = (TextPoint) my points -> item [i];
-			if (label == NULL || (label [0] == '\0' && ! point -> mark) || (point -> mark && wcsequ (point -> mark, label)))
+		for (long i = 1; i <= my numberOfPoints(); i ++) {
+			TextPoint point = my point (i);
+			if (label == NULL || (label [0] == U'\0' && ! point -> mark) || (point -> mark && str32equ (point -> mark, label)))
 				n ++;
 		}
 		autoTableOfReal thee = TableOfReal_create (n, 1);
-		TableOfReal_setColumnLabel (thee.peek(), 1, L"Time");
+		TableOfReal_setColumnLabel (thee.peek(), 1, U"Time");
 		n = 0;
-		for (long i = 1; i <= my numberOfPoints (); i ++) {
+		for (long i = 1; i <= my numberOfPoints(); i ++) {
 			TextPoint point = my point (i);
-			if (label == NULL || (label [0] == '\0' && ! point -> mark) || (point -> mark && wcsequ (point -> mark, label))) {
+			if (label == NULL || (label [0] == U'\0' && ! point -> mark) || (point -> mark && str32equ (point -> mark, label))) {
 				n ++;
-				TableOfReal_setRowLabel (thee.peek(), n, point -> mark ? point -> mark : L"");
+				TableOfReal_setRowLabel (thee.peek(), n, point -> mark ? point -> mark : U"");
 				thy data [n] [1] = point -> number;
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TableOfReal.");
+		Melder_throw (me, U": not converted to TableOfReal.");
 	}
 }
 
@@ -896,7 +927,7 @@ IntervalTier IntervalTier_readFromXwaves (MelderFile file) {
 		for (;;) {
 			line = MelderFile_readLine (file);
 			if (line == NULL)
-				Melder_throw ("Missing '#' line.");
+				Melder_throw (U"Missing '#' line.");
 			if (line [0] == '#') break;
 		}
 
@@ -915,15 +946,15 @@ IntervalTier IntervalTier_readFromXwaves (MelderFile file) {
 				break;   // an empty line, hopefully at the end
 			}
 			if (numberOfElements == 1)
-				Melder_throw ("Line too short: \"", line, "\".");
+				Melder_throw (U"Line too short: \"", Melder_peek8to32 (line), U"\".");
 			if (numberOfElements == 2)
 				mark [0] = '\0';
 			if (lastTime == 0.0) {
-				TextInterval interval = (TextInterval) my intervals -> item [1];
+				TextInterval interval = my interval (1);
 				interval -> xmax = time;
-				TextInterval_setText (interval, Melder_peekUtf8ToWcs (mark));
+				TextInterval_setText (interval, Melder_peek8to32 (mark));
 			} else {
-				IntervalTier_addInterval_unsafe (me.peek(), lastTime, time, Melder_peekUtf8ToWcs (mark));
+				IntervalTier_addInterval_unsafe (me.peek(), lastTime, time, Melder_peek8to32 (mark));
 			}
 			lastTime = time;
 		}
@@ -932,14 +963,14 @@ IntervalTier IntervalTier_readFromXwaves (MelderFile file) {
 		 * Fix domain.
 		 */
 		if (lastTime > 0.0) {
-			TextInterval lastInterval = (TextInterval) my intervals -> item [my intervals -> size];
+			TextInterval lastInterval = my interval (my numberOfIntervals());
 			my xmax = lastInterval -> xmax = lastTime;
 		}
 
 		mfile.close ();
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("IntervalTier not read from file ", file, ".");
+		Melder_throw (U"IntervalTier not read from file ", file, U".");
 	}
 }
 
@@ -947,28 +978,29 @@ void IntervalTier_writeToXwaves (IntervalTier me, MelderFile file) {
 	try {
 		autofile f = Melder_fopen (file, "w");
 		fprintf (f, "separator ;\nnfields 1\n#\n");
-		for (long iinterval = 1; iinterval <= my intervals -> size; iinterval ++) {
-			TextInterval interval = (TextInterval) my intervals -> item [iinterval];
-			fprintf (f, "\t%.6f 26\t%s\n", interval -> xmax, Melder_peekWcsToUtf8 (interval -> text));
+		for (long iinterval = 1; iinterval <= my numberOfIntervals(); iinterval ++) {
+			TextInterval interval = my interval (iinterval);
+			fprintf (f, "\t%.6f 26\t%s\n", interval -> xmax, Melder_peek32to8 (interval -> text));
 		}
 		f.close (file);
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to Xwaves file ", file, ".");
+		Melder_throw (me, U": not written to Xwaves file ", file, U".");
 	}
 }
 
 TextGrid PointProcess_to_TextGrid_vuv (PointProcess me, double maxT, double meanT) {
 	try {
-		autoTextGrid thee = TextGrid_create (my xmin, my xmax, L"vuv", NULL);
-		Collection_removeItem (((IntervalTier) thy tiers -> item [1]) -> intervals, 1);
+		autoTextGrid thee = TextGrid_create (my xmin, my xmax, U"vuv", NULL);
+		IntervalTier tier = static_cast <IntervalTier> (thy tier (1));
+		Collection_removeItem (tier -> intervals, 1);
 		long ipointright;
 		double beginVoiceless = my xmin, endVoiceless, halfMeanT = 0.5 * meanT;
 		for (long ipointleft = 1; ipointleft <= my nt; ipointleft = ipointright + 1) {
 			endVoiceless = my t [ipointleft] - halfMeanT;
 			if (endVoiceless <= beginVoiceless) {
-				endVoiceless = beginVoiceless;   /* We will use for voiced interval. */
+				endVoiceless = beginVoiceless;   // we will use for voiced interval
 			} else {
-				IntervalTier_addInterval_unsafe ((IntervalTier) thy tiers -> item [1], beginVoiceless, endVoiceless, L"U");
+				IntervalTier_addInterval_unsafe (tier, beginVoiceless, endVoiceless, U"U");
 			}
 			for (ipointright = ipointleft + 1; ipointright <= my nt; ipointright ++)
 				if (my t [ipointright] - my t [ipointright - 1] > maxT)
@@ -977,64 +1009,70 @@ TextGrid PointProcess_to_TextGrid_vuv (PointProcess me, double maxT, double mean
 			beginVoiceless = my t [ipointright] + halfMeanT;
 			if (beginVoiceless > my xmax)
 				beginVoiceless = my xmax;
-			IntervalTier_addInterval_unsafe ((IntervalTier) thy tiers -> item [1], endVoiceless, beginVoiceless, L"V");
+			IntervalTier_addInterval_unsafe (tier, endVoiceless, beginVoiceless, U"V");
 		}
 		endVoiceless = my xmax;
 		if (endVoiceless > beginVoiceless) {
-			IntervalTier_addInterval_unsafe ((IntervalTier) thy tiers -> item [1], beginVoiceless, endVoiceless, L"U");
+			IntervalTier_addInterval_unsafe (tier, beginVoiceless, endVoiceless, U"U");
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TextGrid (vuv).");
+		Melder_throw (me, U": not converted to TextGrid (vuv).");
 	}
 }
 
 long TextInterval_labelLength (TextInterval me) {
-	return my text ? wcslen (my text) : 0;
+	return my text ? str32len (my text) : 0;
 }
 
 long TextPoint_labelLength (TextPoint me) {
-	return my mark ? wcslen (my mark) : 0;
+	return my mark ? str32len (my mark) : 0;
 }
 
 long IntervalTier_maximumLabelLength (IntervalTier me) {
-	long maximum = 0, ninterval = my intervals -> size;
-	for (long iinterval = 1; iinterval <= ninterval; iinterval ++) {
-		long length = TextInterval_labelLength ((TextInterval) my intervals -> item [iinterval]);
-		if (length > maximum) maximum = length;
+	long maximum = 0;
+	for (long iinterval = 1; iinterval <= my numberOfIntervals(); iinterval ++) {
+		long length = TextInterval_labelLength (my interval (iinterval));
+		if (length > maximum) {
+			maximum = length;
+		}
 	}
 	return maximum;
 }
 
 long TextTier_maximumLabelLength (TextTier me) {
-	long maximum = 0, npoint = my points -> size;
-	for (long ipoint= 1; ipoint <= npoint; ipoint ++) {
-		long length = TextPoint_labelLength ((TextPoint) my points -> item [ipoint]);
-		if (length > maximum) maximum = length;
+	long maximum = 0;
+	for (long ipoint = 1; ipoint <= my numberOfPoints(); ipoint ++) {
+		long length = TextPoint_labelLength (my point (ipoint));
+		if (length > maximum) {
+			maximum = length;
+		}
 	}
 	return maximum;
 }
 
 long TextGrid_maximumLabelLength (TextGrid me) {
-	long maximum = 0, ntier = my tiers -> size;
-	for (long itier = 1; itier <= ntier; itier ++) {
-		Function anyTier = (Function) my tiers -> item [itier];
+	long maximum = 0;
+	for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
+		Function anyTier = my tier (itier);
 		long length = anyTier -> classInfo == classIntervalTier ?
 			IntervalTier_maximumLabelLength ((IntervalTier) anyTier) :
 			TextTier_maximumLabelLength ((TextTier) anyTier);
-		if (length > maximum) maximum = length;
+		if (length > maximum) {
+			maximum = length;
+		}
 	}
 	return maximum;
 }
 
-static void genericize (wchar_t **pstring, wchar_t *buffer) {
+static void genericize (char32 **pstring, char32 *buffer) {
 	if (*pstring) {
-		const wchar_t *p = (const wchar_t *) *pstring;
+		const char32 *p = (const char32 *) *pstring;
 		while (*p) {
-			if (*p > 126) {   /* Only if necessary. */
-				wchar_t *newString;
-				Longchar_genericizeW (*pstring, buffer);
-				newString = Melder_wcsdup (buffer);
+			if (*p > 126) {   // only if necessary
+				char32 *newString;
+				Longchar_genericize32 (*pstring, buffer);
+				newString = Melder_dup (buffer);
 				/*
 				 * Replace string only if copying was OK.
 				 */
@@ -1049,59 +1087,55 @@ static void genericize (wchar_t **pstring, wchar_t *buffer) {
 
 void TextGrid_genericize (TextGrid me) {
 	try {
-		autostring buffer = Melder_calloc (wchar_t, TextGrid_maximumLabelLength (me) * 3 + 1);
-		for (long itier = 1; itier <= my numberOfTiers (); itier ++) {
+		autostring32 buffer = Melder_calloc (char32, TextGrid_maximumLabelLength (me) * 3 + 1);
+		for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
 			Function anyTier = my tier (itier);
 			if (anyTier -> classInfo == classIntervalTier) {
 				IntervalTier tier = static_cast <IntervalTier> (anyTier);
-				long n = tier -> numberOfIntervals ();
-				for (long i = 1; i <= n; i ++) {
+				for (long i = 1; i <= tier -> numberOfIntervals(); i ++) {
 					TextInterval interval = tier -> interval (i);
 					genericize (& interval -> text, buffer.peek());
 				}
 			} else {
-				TextTier tier = (TextTier) anyTier;
-				long n = tier -> points -> size;
-				for (long i = 1; i <= n; i ++) {
+				TextTier tier = static_cast <TextTier> (anyTier);
+				for (long i = 1; i <= tier -> numberOfPoints(); i ++) {
 					TextPoint point = tier -> point (i);
 					genericize (& point -> mark, buffer.peek());
 				}
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to backslash trigraphs.");
+		Melder_throw (me, U": not converted to backslash trigraphs.");
 	}
 }
 
 void TextGrid_nativize (TextGrid me) {
 	try {
-		autostring buffer = Melder_calloc (wchar_t, TextGrid_maximumLabelLength (me) + 1);
-		for (long itier = 1; itier <= my numberOfTiers (); itier ++) {
+		autostring32 buffer = Melder_calloc (char32, TextGrid_maximumLabelLength (me) + 1);
+		for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
 			Function anyTier = my tier (itier);
 			if (anyTier -> classInfo == classIntervalTier) {
 				IntervalTier tier = static_cast <IntervalTier> (anyTier);
-				long n = tier -> numberOfIntervals ();
-				for (long i = 1; i <= n; i ++) {
+				for (long i = 1; i <= tier -> numberOfIntervals(); i ++) {
 					TextInterval interval = tier -> interval (i);
 					if (interval -> text) {
-						Longchar_nativizeW (interval -> text, buffer.peek(), FALSE);
-						wcscpy (interval -> text, buffer.peek());
+						Longchar_nativize32 (interval -> text, buffer.peek(), false);
+						str32cpy (interval -> text, buffer.peek());
 					}
 				}
 			} else {
 				TextTier tier = static_cast <TextTier> (anyTier);
-				long n = tier -> numberOfPoints ();
-				for (long i = 1; i <= n; i ++) {
+				for (long i = 1; i <= tier -> numberOfPoints(); i ++) {
 					TextPoint point = tier -> point (i);
 					if (point -> mark) {
-						Longchar_nativizeW (point -> mark, buffer.peek(), FALSE);
-						wcscpy (point -> mark, buffer.peek());
+						Longchar_nativize32 (point -> mark, buffer.peek(), false);
+						str32cpy (point -> mark, buffer.peek());
 					}
 				}
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": backslash trigraphs not converted to Unicode.");
+		Melder_throw (me, U": backslash trigraphs not converted to Unicode.");
 	}
 }
 
@@ -1129,22 +1163,22 @@ void TextGrid_insertBoundary (TextGrid me, int tierNumber, double t) {
 	try {
 		Function anyTier = TextGrid_checkSpecifiedTierNumberWithinRange (me, tierNumber);
 		if (anyTier -> classInfo != classIntervalTier)
-			Melder_throw ("Cannot add a boundary on tier ", tierNumber, ", because that tier is not an interval tier.");
+			Melder_throw (U"Cannot add a boundary on tier ", tierNumber, U", because that tier is not an interval tier.");
 		IntervalTier intervalTier = static_cast <IntervalTier> (anyTier);
 		if (IntervalTier_hasTime (intervalTier, t))
-			Melder_throw ("Cannot add a boundary at ", Melder_fixed (t, 6), " seconds, because there is already a boundary there.");
+			Melder_throw (U"Cannot add a boundary at ", Melder_fixed (t, 6), U" seconds, because there is already a boundary there.");
 		long intervalNumber = IntervalTier_timeToIndex (intervalTier, t);
 		if (intervalNumber == 0)
-			Melder_throw ("Cannot add a boundary at ", Melder_fixed (t, 6), " seconds, because this is outside the time domain of the intervals.");
+			Melder_throw (U"Cannot add a boundary at ", Melder_fixed (t, 6), U" seconds, because this is outside the time domain of the intervals.");
 		TextInterval interval = intervalTier -> interval (intervalNumber);
 		/*
 		 * Move the text to the left of the boundary.
 		 */
-		autoTextInterval newInterval = TextInterval_create (t, interval -> xmax, L"");
+		autoTextInterval newInterval = TextInterval_create (t, interval -> xmax, U"");
 		interval -> xmax = t;
 		Collection_addItem (intervalTier -> intervals, newInterval.transfer());
 	} catch (MelderError) {
-		Melder_throw (me, ": boundary not inserted.");
+		Melder_throw (me, U": boundary not inserted.");
 	}
 }
 
@@ -1163,14 +1197,11 @@ void IntervalTier_removeLeftBoundary (IntervalTier me, long intervalNumber) {
 		} else if (left -> text == NULL) {
 			TextInterval_setText (left, right -> text);
 		} else {
-			static MelderString buffer = { 0 };
-			MelderString_empty (& buffer);
-			MelderString_append (& buffer, left -> text, right -> text);
-			TextInterval_setText (left, buffer.string);
+			TextInterval_setText (left, Melder_cat (left -> text, right -> text));
 		}
 		Collection_removeItem (my intervals, intervalNumber);   // remove right interval
 	} catch (MelderError) {
-		Melder_throw (me, ": left boundary not removed.");
+		Melder_throw (me, U": left boundary not removed.");
 	}
 }
 
@@ -1178,71 +1209,71 @@ void TextGrid_removeBoundaryAtTime (TextGrid me, int tierNumber, double t) {
 	try {
 		IntervalTier intervalTier = TextGrid_checkSpecifiedTierIsIntervalTier (me, tierNumber);
 		if (! IntervalTier_hasTime (intervalTier, t))
-			Melder_throw ("There is no boundary at ", t, " seconds.");
+			Melder_throw (U"There is no boundary at ", t, U" seconds.");
 		long intervalNumber = IntervalTier_timeToIndex (intervalTier, t);
 		if (intervalNumber == 0)
-			Melder_throw ("The time of ", t, " seconds is outside the time domain of the intervals.");
+			Melder_throw (U"The time of ", t, U" seconds is outside the time domain of the intervals.");
 		if (intervalNumber == 1)
-			Melder_throw ("The time of ", t, " seconds is at the left edge of the tier.");
+			Melder_throw (U"The time of ", t, U" seconds is at the left edge of the tier.");
 		IntervalTier_removeLeftBoundary (intervalTier, intervalNumber);
 	} catch (MelderError) {
-		Melder_throw (me, ": boundary not removed.");
+		Melder_throw (me, U": boundary not removed.");
 	}
 }
 
-void TextGrid_setIntervalText (TextGrid me, int tierNumber, long intervalNumber, const wchar_t *text) {
+void TextGrid_setIntervalText (TextGrid me, int tierNumber, long intervalNumber, const char32 *text) {
 	try {
 		IntervalTier intervalTier = TextGrid_checkSpecifiedTierIsIntervalTier (me, tierNumber);
 		if (intervalNumber < 1 || intervalNumber > intervalTier -> numberOfIntervals ())
-			Melder_throw ("Interval ", intervalNumber, " does not exist on tier ", tierNumber, ".");
+			Melder_throw (U"Interval ", intervalNumber, U" does not exist on tier ", tierNumber, U".");
 		TextInterval interval = intervalTier -> interval (intervalNumber);
 		TextInterval_setText (interval, text);
 	} catch (MelderError) {
-		Melder_throw (me, ": interval text not set.");
+		Melder_throw (me, U": interval text not set.");
 	}
 }
 
-void TextGrid_insertPoint (TextGrid me, int tierNumber, double t, const wchar_t *mark) {
+void TextGrid_insertPoint (TextGrid me, int tierNumber, double t, const char32 *mark) {
 	try {
 		TextTier textTier = TextGrid_checkSpecifiedTierIsPointTier (me, tierNumber);
 		if (AnyTier_hasPoint (textTier, t))
-			Melder_throw ("There is already a point at ", t, " seconds.");
+			Melder_throw (U"There is already a point at ", t, U" seconds.");
 		autoTextPoint newPoint = TextPoint_create (t, mark);
 		Collection_addItem (textTier -> points, newPoint.transfer());
 	} catch (MelderError) {
-		Melder_throw (me, ": point not inserted.");
+		Melder_throw (me, U": point not inserted.");
 	}
 }
 
 void TextTier_removePoint (TextTier me, long ipoint) {
-	Melder_assert (ipoint <= my points -> size);
+	Melder_assert (ipoint <= my numberOfPoints());
 	Collection_removeItem (my points, ipoint);
 }
 
-void structTextTier :: removePoints (int which_Melder_STRING, const wchar_t *criterion) {
-	for (long i = our numberOfPoints (); i > 0; i --)
-		if (Melder_stringMatchesCriterion (our point (i) -> mark, which_Melder_STRING, criterion))
-			Collection_removeItem (our points, i);
+void TextTier_removePoints (TextTier me, int which_Melder_STRING, const char32 *criterion) {
+	for (long i = my numberOfPoints (); i > 0; i --)
+		if (Melder_stringMatchesCriterion (my point (i) -> mark, which_Melder_STRING, criterion))
+			Collection_removeItem (my points, i);
 }
 
-void structTextGrid :: removePoints (long tierNumber, int which_Melder_STRING, const wchar_t *criterion) {
+void TextGrid_removePoints (TextGrid me, long tierNumber, int which_Melder_STRING, const char32 *criterion) {
 	try {
-		TextTier tier = TextGrid_checkSpecifiedTierIsPointTier (this, tierNumber);
-		tier -> removePoints (which_Melder_STRING, criterion);
+		TextTier tier = TextGrid_checkSpecifiedTierIsPointTier (me, tierNumber);
+		TextTier_removePoints (tier, which_Melder_STRING, criterion);
 	} catch (MelderError) {
-		Melder_throw (this, ": points not removed.");
+		Melder_throw (me, U": points not removed.");
 	}
 }
 
-void TextGrid_setPointText (TextGrid me, int tierNumber, long pointNumber, const wchar_t *text) {
+void TextGrid_setPointText (TextGrid me, int tierNumber, long pointNumber, const char32 *text) {
 	try {
 		TextTier textTier = TextGrid_checkSpecifiedTierIsPointTier (me, tierNumber);
 		if (pointNumber < 1 || pointNumber > textTier -> numberOfPoints ())
-			Melder_throw ("Point ", pointNumber, " does not exist on tier ", tierNumber, ".");
+			Melder_throw (U"Point ", pointNumber, U" does not exist on tier ", tierNumber, U".");
 		TextPoint point = textTier -> point (pointNumber);
 		TextPoint_setText (point, text);
 	} catch (MelderError) {
-		Melder_throw (me, ": point text not set.");
+		Melder_throw (me, U": point text not set.");
 	}
 }
 
@@ -1275,13 +1306,13 @@ static void sgmlToPraat (char *text) {
 			for (i = 0; i < 200; i ++) {
 				char sgmlChar = sgml [i];
 				if (sgmlChar == ';') {
-					if (i == 0) Melder_throw ("Empty SGML code.");
+					if (i == 0) Melder_throw (U"Empty SGML code.");
 					sgml += i + 1;
 					break;
 				}
 				sgmlCode [i] = sgmlChar;
 			}
-			if (i >= 200) Melder_throw ("Unfinished SGML code.");
+			if (i >= 200) Melder_throw (U"Unfinished SGML code.");
 			sgmlCode [i] = '\0';
 			for (i = 0; translations [i]. sgml != NULL; i ++) {
 				if (strequ (sgmlCode, translations [i]. sgml)) {
@@ -1290,7 +1321,7 @@ static void sgmlToPraat (char *text) {
 					break;
 				}
 			}
-			if (translations [i]. sgml == NULL) Melder_throw ("Unknown SGML code &", sgmlCode, ";.");
+			if (translations [i]. sgml == NULL) Melder_throw (U"Unknown SGML code &", Melder_peek8to32 (sgmlCode), U";.");
 		} else {
 			* praat ++ = * sgml ++;
 		}
@@ -1300,31 +1331,31 @@ static void sgmlToPraat (char *text) {
 
 TextGrid TextGrid_readFromChronologicalTextFile (MelderFile file) {
 	try {
-		Thing_version = 0;
+		int formatVersion = 0;
 		autoMelderReadText text = MelderReadText_createFromFile (file);
-		autostring tag = texgetw2 (text.peek());
-		if (! wcsequ (tag.peek(), L"Praat chronological TextGrid text file"))
-			Melder_throw ("This is not a chronological TextGrid text file.");
+		autostring32 tag = texgetw2 (text.peek());
+		if (! str32equ (tag.peek(), U"Praat chronological TextGrid text file"))
+			Melder_throw (U"This is not a chronological TextGrid text file.");
 		autoTextGrid me = Thing_new (TextGrid);
-		my structFunction :: v_readText (text.peek());
+		my structFunction :: v_readText (text.peek(), formatVersion);
 		my tiers = Ordered_create ();
 		long numberOfTiers = texgeti4 (text.peek());
 		for (long itier = 1; itier <= numberOfTiers; itier ++) {
-			autostring klas = texgetw2 (text.peek());
-			if (wcsequ (klas.peek(), L"IntervalTier")) {
+			autostring32 klas = texgetw2 (text.peek());
+			if (str32equ (klas.peek(), U"IntervalTier")) {
 				autoIntervalTier tier = Thing_new (IntervalTier);
 				tier -> name = texgetw2 (text.peek());
-				tier -> structFunction :: v_readText (text.peek());
+				tier -> structFunction :: v_readText (text.peek(), formatVersion);
 				tier -> intervals = SortedSetOfDouble_create ();
 				Collection_addItem (my tiers, tier.transfer());
-			} else if (wcsequ (klas.peek(), L"TextTier")) {
+			} else if (str32equ (klas.peek(), U"TextTier")) {
 				autoTextTier tier = Thing_new (TextTier);
 				tier -> name = texgetw2 (text.peek());
-				tier -> structFunction :: v_readText (text.peek());
+				tier -> structFunction :: v_readText (text.peek(), formatVersion);
 				tier -> points = SortedSetOfDouble_create ();
 				Collection_addItem (my tiers, tier.transfer());
 			} else {
-				Melder_throw ("Unknown tier class \"", klas.peek(), L"\".");
+				Melder_throw (U"Unknown tier class \"", klas.peek(), U"\".");
 			}
 		}
 		for (;;) {
@@ -1332,7 +1363,7 @@ TextGrid TextGrid_readFromChronologicalTextFile (MelderFile file) {
 			try {
 				tierNumber = texgeti4 (text.peek());
 			} catch (MelderError) {
-				if (wcsstr (Melder_getError (), L"Early end of text")) {
+				if (str32str (Melder_getError (), U"Early end of text")) {
 					Melder_clearError ();
 					break;
 				} else {
@@ -1343,31 +1374,31 @@ TextGrid TextGrid_readFromChronologicalTextFile (MelderFile file) {
 			if (anyTier -> classInfo == classIntervalTier) {
 				IntervalTier tier = static_cast <IntervalTier> (anyTier);
 				autoTextInterval interval = Thing_new (TextInterval);
-				interval -> v_readText (text.peek());
+				interval -> v_readText (text.peek(), formatVersion);
 				Collection_addItem (tier -> intervals, interval.transfer());   // not earlier: sorting depends on contents of interval
 			} else {
 				TextTier tier = static_cast <TextTier> (anyTier);
 				autoTextPoint point = Thing_new (TextPoint);
-				point -> v_readText (text.peek());
+				point -> v_readText (text.peek(), formatVersion);
 				Collection_addItem (tier -> points, point.transfer());   // not earlier: sorting depends on contents of point
 			}
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrid not read from chronological text file ", file, ".");
+		Melder_throw (U"TextGrid not read from chronological text file ", file, U".");
 	}
 }
 
-static void writeQuotedString (MelderFile file, const wchar_t *string) {
-	MelderFile_writeCharacter (file, '\"');
+static void writeQuotedString (MelderFile file, const char32 *string) {
+	MelderFile_writeCharacter (file, U'\"');
 	if (string) {
-		wchar_t kar;
-		while ((kar = *string ++) != '\0') {
+		char32 kar;
+		while ((kar = *string ++) != U'\0') {
 			MelderFile_writeCharacter (file, kar);
 			if (kar == '\"') MelderFile_writeCharacter (file, kar);
 		}
 	}   // BUG
-	MelderFile_writeCharacter (file, '\"');
+	MelderFile_writeCharacter (file, U'\"');
 }
 
 void TextGrid_writeToChronologicalTextFile (TextGrid me, MelderFile file) {
@@ -1381,25 +1412,25 @@ void TextGrid_writeToChronologicalTextFile (TextGrid me, MelderFile file) {
 		long sortingTier = 0;
 		file -> verbose = false;
 		texindent (file);
-		MelderFile_write (file, L"\"Praat chronological TextGrid text file\"\n", Melder_double (my xmin), L" ", Melder_double (my xmax),
-			L"   ! Time domain.\n", Melder_integer (my tiers -> size), L"   ! Number of tiers.");
-		for (long itier = 1; itier <= my tiers -> size; itier ++) {
-			Function anyTier = (Function) my tiers -> item [itier];
-			MelderFile_write (file, L"\n");
+		MelderFile_write (file, U"\"Praat chronological TextGrid text file\"\n", my xmin, U" ", my xmax,
+			U"   ! Time domain.\n", my numberOfTiers(), U"   ! Number of tiers.");
+		for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
+			Function anyTier = my tier (itier);
+			MelderFile_write (file, U"\n");
 			writeQuotedString (file, Thing_className (anyTier));
-			MelderFile_write (file, L" ");
+			MelderFile_write (file, U" ");
 			writeQuotedString (file, anyTier -> name);
-			MelderFile_write (file, L" ", Melder_double (anyTier -> xmin), L" ", Melder_double (anyTier -> xmax));
+			MelderFile_write (file, U" ", anyTier -> xmin, U" ", anyTier -> xmax);
 		}
 		for (;;) {
 			double firstRemainingTime = +1e308;
 			long firstRemainingTier = 2000000000, firstRemainingElement = 0;
-			for (long itier = 1; itier <= my tiers -> size; itier ++) {
-				Function anyTier = (Function) my tiers -> item [itier];
+			for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
+				Function anyTier = my tier (itier);
 				if (anyTier -> classInfo == classIntervalTier) {
-					IntervalTier tier = (IntervalTier) anyTier;
-					for (long ielement = 1; ielement <= tier -> intervals -> size; ielement ++) {
-						TextInterval interval = (TextInterval) tier -> intervals -> item [ielement];
+					IntervalTier tier = static_cast <IntervalTier> (anyTier);
+					for (long ielement = 1; ielement <= tier -> numberOfIntervals(); ielement ++) {
+						TextInterval interval = tier -> interval (ielement);
 						if ((interval -> xmin > sortingTime ||   // sort primarily by time
 							 (interval -> xmin == sortingTime && itier > sortingTier)) &&   // sort secondarily by tier number
 							(interval -> xmin < firstRemainingTime ||   // sort primarily by time
@@ -1411,9 +1442,9 @@ void TextGrid_writeToChronologicalTextFile (TextGrid me, MelderFile file) {
 						}
 					}
 				} else {
-					TextTier tier = (TextTier) anyTier;
-					for (long ielement = 1; ielement <= tier -> points -> size; ielement ++) {
-						TextPoint point = (TextPoint) tier -> points -> item [ielement];
+					TextTier tier = static_cast <TextTier> (anyTier);
+					for (long ielement = 1; ielement <= tier -> numberOfPoints(); ielement ++) {
+						TextPoint point = tier -> point (ielement);
 						if ((point -> number > sortingTime ||   // sort primarily by time
 							 (point -> number == sortingTime && itier > sortingTier)) &&   // sort secondarily by tier number
 							(point -> number < firstRemainingTime ||   // sort primarily by time
@@ -1429,20 +1460,19 @@ void TextGrid_writeToChronologicalTextFile (TextGrid me, MelderFile file) {
 			if (firstRemainingElement == 0) {
 				break;
 			} else {
-				Function anyTier = (Function) my tiers -> item [firstRemainingTier];
+				Function anyTier = my tier (firstRemainingTier);
 				if (anyTier -> classInfo == classIntervalTier) {
-					IntervalTier tier = (IntervalTier) anyTier;
-					TextInterval interval = (TextInterval) tier -> intervals -> item [firstRemainingElement];
-					if (tier -> name) MelderFile_write (file, L"\n\n! ", tier -> name, L":");
-					MelderFile_write (file, L"\n", Melder_integer (firstRemainingTier), L" ", Melder_double (interval -> xmin), L" ",
-						Melder_double (interval -> xmax));
-					texputw4 (file, interval -> text, L"", 0,0,0,0,0);
+					IntervalTier tier = static_cast <IntervalTier> (anyTier);
+					TextInterval interval = tier -> interval (firstRemainingElement);
+					if (tier -> name) MelderFile_write (file, U"\n\n! ", tier -> name, U":");
+					MelderFile_write (file, U"\n", firstRemainingTier, U" ", interval -> xmin, U" ", interval -> xmax);
+					texputw4 (file, interval -> text, U"", 0,0,0,0,0);
 				} else {
-					TextTier tier = (TextTier) anyTier;
-					TextPoint point = (TextPoint) tier -> points -> item [firstRemainingElement];
-					if (tier -> name) MelderFile_write (file, L"\n\n! ", tier -> name, L":");
-					MelderFile_write (file, L"\n", Melder_integer (firstRemainingTier), L" ", Melder_double (point -> number), L" ");
-					texputw4 (file, point -> mark, L"", 0,0,0,0,0);
+					TextTier tier = static_cast <TextTier> (anyTier);
+					TextPoint point = tier -> point (firstRemainingElement);
+					if (tier -> name) MelderFile_write (file, U"\n\n! ", tier -> name, U":");
+					MelderFile_write (file, U"\n", firstRemainingTier, U" ", point -> number, U" ");
+					texputw4 (file, point -> mark, U"", 0,0,0,0,0);
 				}
 				sortingTime = firstRemainingTime;
 				sortingTier = firstRemainingTier;
@@ -1451,7 +1481,7 @@ void TextGrid_writeToChronologicalTextFile (TextGrid me, MelderFile file) {
 		texexdent (file);
 		mfile.close ();
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to chronological text file ", file, ".");
+		Melder_throw (me, U": not written to chronological text file ", file, U".");
 	}
 }
 
@@ -1467,10 +1497,10 @@ TextGrid TextGrid_readFromCgnSyntaxFile (MelderFile file) {
 		autoMelderFile mfile = MelderFile_open (file);
 		char *line = MelderFile_readLine (file);
 		if (! strequ (line, "<?xml version=\"1.0\"?>"))
-			Melder_throw ("This is not a CGN syntax file.");
+			Melder_throw (U"This is not a CGN syntax file.");
 		line = MelderFile_readLine (file);
 		if (! strequ (line, "<!DOCTYPE ttext SYSTEM \"ttext.dtd\">"))
-			Melder_throw ("This is not a CGN syntax file.");
+			Melder_throw (U"This is not a CGN syntax file.");
 		line = MelderFile_readLine (file);
 		long startOfData = MelderFile_tell (file);
 		/*
@@ -1483,11 +1513,11 @@ TextGrid TextGrid_readFromCgnSyntaxFile (MelderFile file) {
 			if (! line) break;
 			if (strnequ (line, "  <tau ref=\"", 12)) {
 				if (sscanf (line, "%40s%40s%40s%40s%40s%40s%200s", arg1, arg2, arg3, arg4, arg5, arg6, arg7) < 7)
-					Melder_throw ("Too few strings in tau line.");
+					Melder_throw (U"Too few strings in tau line.");
 				my xmax = atof (arg5 + 4);
 			}
 		}
-		if (my xmax <= 0.0) Melder_throw ("Duration (", my xmax, " seconds) should be greater than zero.");
+		if (my xmax <= 0.0) Melder_throw (U"Duration (", my xmax, U" seconds) should be greater than zero.");
 		/*
 		 * Get number and names of tiers.
 		 */
@@ -1500,18 +1530,18 @@ TextGrid TextGrid_readFromCgnSyntaxFile (MelderFile file) {
 				int length, speakerTier = 0;
 				double tb, te;
 				if (sscanf (line, "%40s%40s%40s%40s%40s%40s%200s", arg1, arg2, arg3, arg4, arg5, arg6, arg7) < 7)
-					Melder_throw ("Too few strings in tau line.");
+					Melder_throw (U"Too few strings in tau line.");
 				length = strlen (arg3);
 				if (length < 5 || ! strnequ (arg3, "s=\"", 3))
-					Melder_throw ("Missing speaker name.");
+					Melder_throw (U"Missing speaker name.");
 				arg3 [length - 1] = '\0';   // truncate at double quote
 				speakerName = arg3 + 3;   // truncate leading s="
 				/*
 				 * Does this speaker name occur in the tiers?
 				 */
-				for (long itier = 1; itier <= my tiers -> size; itier ++) {
-					IntervalTier tier = (IntervalTier) my tiers -> item [itier];
-					if (wcsequ (tier -> name, Melder_peekUtf8ToWcs (speakerName))) {
+				for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
+					IntervalTier tier = static_cast <IntervalTier> (my tier (itier));
+					if (str32equ (tier -> name, Melder_peek8to32 (speakerName))) {
 						speakerTier = itier;
 						break;
 					}
@@ -1524,100 +1554,98 @@ TextGrid TextGrid_readFromCgnSyntaxFile (MelderFile file) {
 					newSentenceTier -> intervals = SortedSetOfDouble_create ();
 					newSentenceTier -> xmin = 0.0;
 					newSentenceTier -> xmax = my xmax;
-					Thing_setName (newSentenceTier.peek(), Melder_peekUtf8ToWcs (speakerName));
+					Thing_setName (newSentenceTier.peek(), Melder_peek8to32 (speakerName));
 					sentenceTier = newSentenceTier.peek();   // for later use; this seems safe
 					Collection_addItem (my tiers, newSentenceTier.transfer());
 					autoIntervalTier newPhraseTier = Thing_new (IntervalTier);
 					newPhraseTier -> intervals = SortedSetOfDouble_create ();
 					newPhraseTier -> xmin = 0.0;
 					newPhraseTier -> xmax = my xmax;
-					Thing_setName (newPhraseTier.peek(), Melder_peekUtf8ToWcs (speakerName));
+					Thing_setName (newPhraseTier.peek(), Melder_peek8to32 (speakerName));
 					phraseTier = newPhraseTier.peek();
 					Collection_addItem (my tiers, newPhraseTier.transfer());
 				} else {
-					sentenceTier = (IntervalTier) my tiers -> item [speakerTier];
-					phraseTier = (IntervalTier) my tiers -> item [speakerTier + 1];
+					sentenceTier = (IntervalTier) my tier (speakerTier);
+					phraseTier = (IntervalTier) my tier (speakerTier + 1);
 				}
 				tb = atof (arg4 + 4), te = atof (arg5 + 4);
 				if (te <= tb)
-					Melder_throw ("Zero duration for sentence.");
+					Melder_throw (U"Zero duration for sentence.");
 				/*
 				 * We are going to add one or two intervals to the sentence tier.
 				 */
-				if (sentenceTier -> intervals -> size > 0) {
-					TextInterval latestInterval = (TextInterval) sentenceTier -> intervals -> item [sentenceTier -> intervals -> size];
+				if (sentenceTier -> numberOfIntervals() > 0) {
+					TextInterval latestInterval = sentenceTier -> interval (sentenceTier -> numberOfIntervals());
 					if (tb > latestInterval -> xmax) {
-						autoTextInterval interval = TextInterval_create (latestInterval -> xmax, tb, L"");
+						autoTextInterval interval = TextInterval_create (latestInterval -> xmax, tb, U"");
 						Collection_addItem (sentenceTier -> intervals, interval.transfer());
 					} else if (tb < latestInterval -> xmax) {
-						Melder_throw ("Overlap on tier not allowed.");
+						Melder_throw (U"Overlap on tier not allowed.");
 					}
 				} else {
 					if (tb > 0.0) {
-						TextInterval interval = TextInterval_create (0.0, tb, L"");
+						TextInterval interval = TextInterval_create (0.0, tb, U"");
 						Collection_addItem (sentenceTier -> intervals, interval);
 					} else if (tb < 0.0) {
-						Melder_throw ("Negative times not allowed.");
+						Melder_throw (U"Negative times not allowed.");
 					}
 				}
-				char label [10];
-				sprintf (label, "%ld", ++ sentenceNumber);
-				autoTextInterval interval = TextInterval_create (tb, te, Melder_peekUtf8ToWcs (label));
+				autoTextInterval interval = TextInterval_create (tb, te, Melder_integer (++ sentenceNumber));
 				Collection_addItem (sentenceTier -> intervals, interval.transfer());
 			} else if (strnequ (line, "    <tw ref=\"", 13)) {
 				int length;
 				double tb, te;
 				if (sscanf (line, "%40s%40s%40s%40s%40s%40s%200s", arg1, arg2, arg3, arg4, arg5, arg6, arg7) < 7)
-					Melder_throw ("Too few strings in tw line.");
+					Melder_throw (U"Too few strings in tw line.");
 				length = strlen (arg3);
 				if (length < 6 || ! strnequ (arg3, "tb=\"", 4))
-					Melder_throw ("Missing tb.");
+					Melder_throw (U"Missing tb.");
 				tb = atof (arg3 + 4);
 				length = strlen (arg4);
 				if (length < 6 || ! strnequ (arg4, "te=\"", 4))
-					Melder_throw ("Missing te.");
+					Melder_throw (U"Missing te.");
 				te = atof (arg4 + 4);
 				if (te <= tb)
-					Melder_throw ("Zero duration for phrase.");
+					Melder_throw (U"Zero duration for phrase.");
 				if (tb == phraseBegin && te == phraseEnd) {
 					/* Append a word. */
 					strcat (phrase, " ");
 					length = strlen (arg7);
 					if (length < 6 || ! strnequ (arg7, "w=\"", 3))
-						Melder_throw ("Missing word.");
+						Melder_throw (U"Missing word.");
 					arg7 [length - 3] = '\0';   // truncate "/>
 					strcat (phrase, arg7 + 3);
 				} else {
 					/* Begin a phrase. */
 					if (lastInterval) {
 						sgmlToPraat (phrase);
-						TextInterval_setText (lastInterval, Melder_peekUtf8ToWcs (phrase));
+						TextInterval_setText (lastInterval, Melder_peek8to32 (phrase));
 					}
 					phrase [0] = '\0';
 					length = strlen (arg7);
 					if (length < 6 || ! strnequ (arg7, "w=\"", 3))
-						Melder_throw ("Missing word.");
-					arg7 [length - 3] = '\0';   /* Truncate "/>. */
+						Melder_throw (U"Missing word.");
+					arg7 [length - 3] = '\0';   // truncate "/>
 					strcat (phrase, arg7 + 3);
-					if (phraseTier -> intervals -> size > 0) {
-						TextInterval latestInterval = (TextInterval) phraseTier -> intervals -> item [phraseTier -> intervals -> size];
+					if (phraseTier -> numberOfIntervals() > 0) {
+						TextInterval latestInterval = phraseTier -> interval (phraseTier -> numberOfIntervals());
 						if (tb > latestInterval -> xmax) {
-							autoTextInterval interval = TextInterval_create (latestInterval -> xmax, tb, L"");
+							autoTextInterval interval = TextInterval_create (latestInterval -> xmax, tb, U"");
 							Collection_addItem (phraseTier -> intervals, interval.transfer());
 						} else if (tb < latestInterval -> xmax) {
-							Melder_throw ("Overlap on tier not allowed.");
+							Melder_throw (U"Overlap on tier not allowed.");
 						}
 					} else {
 						if (tb > 0.0) {
-							autoTextInterval interval = TextInterval_create (0.0, tb, L"");
+							autoTextInterval interval = TextInterval_create (0.0, tb, U"");
 							Collection_addItem (phraseTier -> intervals, interval.transfer());
 						} else if (tb < 0.0) {
-							Melder_throw ("Negative times not allowed.");
+							Melder_throw (U"Negative times not allowed.");
 						}
 					}
 					if (! phraseTier)
-						Melder_throw ("Phrase outside sentence.");
-					autoTextInterval newLastInterval = TextInterval_create (tb, te, L"");
+						Melder_throw (U"Phrase outside sentence.");
+					autoTextInterval newLastInterval = TextInterval_create (tb, te, U"");
 					lastInterval = newLastInterval.peek();
 					Collection_addItem (phraseTier -> intervals, newLastInterval.transfer());
 					phraseBegin = tb;
@@ -1627,66 +1655,66 @@ TextGrid TextGrid_readFromCgnSyntaxFile (MelderFile file) {
 		}
 		if (lastInterval) {
 			sgmlToPraat (phrase);
-			TextInterval_setText (lastInterval, Melder_peekUtf8ToWcs (phrase));
+			TextInterval_setText (lastInterval, Melder_peek8to32 (phrase));
 		}
-		for (long itier = 1; itier <= my tiers -> size; itier ++) {
-			IntervalTier tier = (IntervalTier) my tiers -> item [itier];
-			if (tier -> intervals -> size > 0) {
-				TextInterval latestInterval = (TextInterval) tier -> intervals -> item [tier -> intervals -> size];
+		for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
+			IntervalTier tier = static_cast <IntervalTier> (my tier (itier));
+			if (tier -> numberOfIntervals() > 0) {
+				TextInterval latestInterval = tier -> interval (tier -> numberOfIntervals());
 				if (my xmax > latestInterval -> xmax) {
-					autoTextInterval interval = TextInterval_create (latestInterval -> xmax, my xmax, L"");
+					autoTextInterval interval = TextInterval_create (latestInterval -> xmax, my xmax, U"");
 					Collection_addItem (tier -> intervals, interval.transfer());
 				}
 			} else {
-				autoTextInterval interval = TextInterval_create (my xmin, my xmax, L"");
+				autoTextInterval interval = TextInterval_create (my xmin, my xmax, U"");
 				Collection_addItem (tier -> intervals, interval.transfer());
 			}
 		}
 		mfile.close ();
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrid not read from CGN syntax file ", file, ".");
+		Melder_throw (U"TextGrid not read from CGN syntax file ", file, U".");
 	}
 }
 
 Table TextGrid_downto_Table (TextGrid me, bool includeLineNumbers, int timeDecimals, bool includeTierNames, bool includeEmptyIntervals) {
 	long numberOfRows = 0;
-	for (long itier = 1; itier <= my tiers -> size; itier ++) {
-		Function anyTier = (Function) my tiers -> item [itier];
+	for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
+		Function anyTier = my tier (itier);
 		if (anyTier -> classInfo == classIntervalTier) {
-			IntervalTier tier = (IntervalTier) anyTier;
+			IntervalTier tier = static_cast <IntervalTier> (anyTier);
 			if (includeEmptyIntervals) {
-				numberOfRows += tier -> intervals -> size;
+				numberOfRows += tier -> numberOfIntervals();
 			} else {
-				for (long iinterval = 1; iinterval <= tier -> intervals -> size; iinterval ++) {
-					TextInterval interval = (TextInterval) tier -> intervals -> item [iinterval];
-					if (interval -> text != NULL && interval -> text [0] != '\0') {
+				for (long iinterval = 1; iinterval <= tier -> numberOfIntervals(); iinterval ++) {
+					TextInterval interval = tier -> interval (iinterval);
+					if (interval -> text != NULL && interval -> text [0] != U'\0') {
 						numberOfRows ++;
 					}
 				}
 			}
 		} else {
-			TextTier tier = (TextTier) anyTier;
-			numberOfRows += tier -> points -> size;
+			TextTier tier = static_cast <TextTier> (anyTier);
+			numberOfRows += tier -> numberOfPoints();
 		}
 	}
 	autoTable thee = Table_createWithoutColumnNames (numberOfRows, 3 + includeLineNumbers + includeTierNames);
 	long icol = 0;
 	if (includeLineNumbers)
-		Table_setColumnLabel (thee.peek(), ++ icol, L"line");
-	Table_setColumnLabel (thee.peek(), ++ icol, L"tmin");
+		Table_setColumnLabel (thee.peek(), ++ icol, U"line");
+	Table_setColumnLabel (thee.peek(), ++ icol, U"tmin");
 	if (includeTierNames)
-		Table_setColumnLabel (thee.peek(), ++ icol, L"tier");
-	Table_setColumnLabel (thee.peek(), ++ icol, L"text");
-	Table_setColumnLabel (thee.peek(), ++ icol, L"tmax");
+		Table_setColumnLabel (thee.peek(), ++ icol, U"tier");
+	Table_setColumnLabel (thee.peek(), ++ icol, U"text");
+	Table_setColumnLabel (thee.peek(), ++ icol, U"tmax");
 	long irow = 0;
-	for (long itier = 1; itier <= my tiers -> size; itier ++) {
-		Function anyTier = (Function) my tiers -> item [itier];
+	for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
+		Function anyTier = my tier (itier);
 		if (anyTier -> classInfo == classIntervalTier) {
-			IntervalTier tier = (IntervalTier) anyTier;
-			for (long iinterval = 1; iinterval <= tier -> intervals -> size; iinterval ++) {
-				TextInterval interval = (TextInterval) tier -> intervals -> item [iinterval];
-				if (includeEmptyIntervals || (interval -> text != NULL && interval -> text [0] != '\0')) {
+			IntervalTier tier = static_cast <IntervalTier> (anyTier);
+			for (long iinterval = 1; iinterval <= tier -> numberOfIntervals(); iinterval ++) {
+				TextInterval interval = tier -> interval (iinterval);
+				if (includeEmptyIntervals || (interval -> text != NULL && interval -> text [0] != U'\0')) {
 					++ irow;
 					icol = 0;
 					if (includeLineNumbers)
@@ -1699,9 +1727,9 @@ Table TextGrid_downto_Table (TextGrid me, bool includeLineNumbers, int timeDecim
 				}
 			}
 		} else {
-			TextTier tier = (TextTier) anyTier;
-			for (long ipoint = 1; ipoint <= tier -> points -> size; ipoint ++) {
-				TextPoint point = (TextPoint) tier -> points -> item [ipoint];
+			TextTier tier = static_cast <TextTier> (anyTier);
+			for (long ipoint = 1; ipoint <= tier -> numberOfPoints(); ipoint ++) {
+				TextPoint point = tier -> point (ipoint);
 				++ irow;
 				icol = 0;
 				if (includeLineNumbers)
@@ -1724,27 +1752,27 @@ void TextGrid_list (TextGrid me, bool includeLineNumbers, int timeDecimals, bool
 		autoTable table = TextGrid_downto_Table (me, includeLineNumbers, timeDecimals, includeTierNames, includeEmptyIntervals);
 		Table_list (table.peek(), false);
 	} catch (MelderError) {
-		Melder_throw (me, ": not listed.");
+		Melder_throw (me, U": not listed.");
 	}
 }
 
 void TextGrid_correctRoundingErrors (TextGrid me) {
-	for (long itier = 1; itier <= my tiers -> size; itier ++) {
-		Function anyTier = (Function) my tiers -> item [itier];
+	for (long itier = 1; itier <= my numberOfTiers(); itier ++) {
+		Function anyTier = my tier (itier);
 		if (anyTier -> classInfo == classIntervalTier) {
-			IntervalTier tier = (IntervalTier) anyTier;
-			TextInterval first = (TextInterval) tier -> intervals -> item [1];
+			IntervalTier tier = static_cast <IntervalTier> (anyTier);
+			TextInterval first = tier -> interval (1);
 			first -> xmin = my xmin;
 			Melder_assert (first -> xmin < first -> xmax);
-			for (long iinterval = 1; iinterval < tier -> intervals -> size; iinterval ++) {
-				TextInterval left = (TextInterval) tier -> intervals -> item [iinterval];
-				TextInterval right = (TextInterval) tier -> intervals -> item [iinterval + 1];
+			for (long iinterval = 1; iinterval < tier -> numberOfIntervals(); iinterval ++) {
+				TextInterval left = tier -> interval (iinterval);
+				TextInterval right = tier -> interval (iinterval + 1);
 				right -> xmin = left -> xmax;
-				trace ("tier %ld, interval %ld, %.17g %.17g", itier, iinterval, right -> xmin, right -> xmax);
+				trace (U"tier ", itier, U", interval ", iinterval, U", ", right -> xmin, U" ", right -> xmax);
 				Melder_assert (right -> xmin < right -> xmax);
 			}
-			TextInterval last = (TextInterval) tier -> intervals -> item [tier -> intervals -> size];
-			trace ("%ld %.17g %.17g", tier -> intervals -> size, last -> xmax, my xmax);
+			TextInterval last = tier -> interval (tier -> numberOfIntervals());
+			trace (tier -> numberOfIntervals(), U" ", last -> xmax, U" ", my xmax);
 			last -> xmax = my xmax;
 			Melder_assert (last -> xmax > last -> xmin);
 		}
@@ -1759,7 +1787,7 @@ TextGrid TextGrids_concatenate (Collection me) {
 		TextGrid_correctRoundingErrors (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TextGrids not concatenated.");
+		Melder_throw (U"TextGrids not concatenated.");
 	}
 }
 
diff --git a/fon/TextGrid.h b/fon/TextGrid.h
index 51c64c7..bec715d 100644
--- a/fon/TextGrid.h
+++ b/fon/TextGrid.h
@@ -2,7 +2,7 @@
 #define _TextGrid_h_
 /* TextGrid.h
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,21 +28,21 @@
 #include "TextGrid_def.h"
 
 oo_CLASS_CREATE (TextPoint, AnyPoint);
-TextPoint TextPoint_create (double time, const wchar_t *mark);
+TextPoint TextPoint_create (double time, const char32 *mark);
 
-void TextPoint_setText (TextPoint me, const wchar_t *text);
+void TextPoint_setText (TextPoint me, const char32 *text);
 
 oo_CLASS_CREATE (TextInterval, Function);
-TextInterval TextInterval_create (double tmin, double tmax, const wchar_t *text);
+TextInterval TextInterval_create (double tmin, double tmax, const char32 *text);
 
-void TextInterval_setText (TextInterval me, const wchar_t *text);
+void TextInterval_setText (TextInterval me, const char32 *text);
 
 oo_CLASS_CREATE (TextTier, Function);
 TextTier TextTier_create (double tmin, double tmax);
 
-void TextTier_addPoint (TextTier me, double time, const wchar_t *mark);
+void TextTier_addPoint (TextTier me, double time, const char32 *mark);
 TextTier TextTier_readFromXwaves (MelderFile file);
-PointProcess TextTier_getPoints (TextTier me, const wchar_t *text);
+PointProcess TextTier_getPoints (TextTier me, const char32 *text);
 
 oo_CLASS_CREATE (IntervalTier, Function);
 IntervalTier IntervalTier_create (double tmin, double tmax);
@@ -54,9 +54,9 @@ long IntervalTier_timeToIndex (IntervalTier me, double t);   // obsolete
 long IntervalTier_timeToHighIndex (IntervalTier me, double t);
 long IntervalTier_hasTime (IntervalTier me, double t);
 long IntervalTier_hasBoundary (IntervalTier me, double t);
-PointProcess IntervalTier_getStartingPoints (IntervalTier me, const wchar_t *text);
-PointProcess IntervalTier_getEndPoints (IntervalTier me, const wchar_t *text);
-PointProcess IntervalTier_getCentrePoints (IntervalTier me, const wchar_t *text);
+PointProcess IntervalTier_getStartingPoints (IntervalTier me, const char32 *text);
+PointProcess IntervalTier_getEndPoints (IntervalTier me, const char32 *text);
+PointProcess IntervalTier_getCentrePoints (IntervalTier me, const char32 *text);
 PointProcess IntervalTier_PointProcess_startToCentre (IntervalTier tier, PointProcess point, double phase);
 PointProcess IntervalTier_PointProcess_endToCentre (IntervalTier tier, PointProcess point, double phase);
 void IntervalTier_removeLeftBoundary (IntervalTier me, long iinterval);
@@ -65,35 +65,37 @@ void TextTier_removePoint (TextTier me, long ipoint);
 
 oo_CLASS_CREATE (TextGrid, Function);
 TextGrid TextGrid_createWithoutTiers (double tmin, double tmax);
-TextGrid TextGrid_create (double tmin, double tmax, const wchar_t *tierNames, const wchar_t *pointTiers);
-
-long TextGrid_countLabels (TextGrid me, long itier, const wchar_t *text);
-PointProcess TextGrid_getStartingPoints (TextGrid me, long itier, int which_Melder_STRING, const wchar_t *criterion);
-PointProcess TextGrid_getEndPoints (TextGrid me, long itier, int which_Melder_STRING, const wchar_t *criterion);
-PointProcess TextGrid_getCentrePoints (TextGrid me, long itier, int which_Melder_STRING, const wchar_t *criterion);
-PointProcess TextGrid_getPoints (TextGrid me, long itier, int which_Melder_STRING, const wchar_t *criterion);
+TextGrid TextGrid_create (double tmin, double tmax, const char32 *tierNames, const char32 *pointTiers);
+
+long TextGrid_countLabels (TextGrid me, long itier, const char32 *text);
+long TextGrid_countIntervalsWhere (TextGrid me, long tierNumber, int which_Melder_STRING, const char32 *criterion);
+long TextGrid_countPointsWhere (TextGrid me, long tierNumber, int which_Melder_STRING, const char32 *criterion);
+PointProcess TextGrid_getStartingPoints (TextGrid me, long itier, int which_Melder_STRING, const char32 *criterion);
+PointProcess TextGrid_getEndPoints (TextGrid me, long itier, int which_Melder_STRING, const char32 *criterion);
+PointProcess TextGrid_getCentrePoints (TextGrid me, long itier, int which_Melder_STRING, const char32 *criterion);
+PointProcess TextGrid_getPoints (TextGrid me, long itier, int which_Melder_STRING, const char32 *criterion);
 PointProcess TextGrid_getPoints_preceded (TextGrid me, long tierNumber,
-	int which_Melder_STRING, const wchar_t *criterion,
-	int which_Melder_STRING_precededBy, const wchar_t *criterion_precededBy);
+	int which_Melder_STRING, const char32 *criterion,
+	int which_Melder_STRING_precededBy, const char32 *criterion_precededBy);
 PointProcess TextGrid_getPoints_followed (TextGrid me, long tierNumber,
-	int which_Melder_STRING, const wchar_t *criterion,
-	int which_Melder_STRING_followedBy, const wchar_t *criterion_followedBy);
+	int which_Melder_STRING, const char32 *criterion,
+	int which_Melder_STRING_followedBy, const char32 *criterion_followedBy);
 
 Function TextGrid_checkSpecifiedTierNumberWithinRange (TextGrid me, long tierNumber);
 IntervalTier TextGrid_checkSpecifiedTierIsIntervalTier (TextGrid me, long tierNumber);
 TextTier TextGrid_checkSpecifiedTierIsPointTier (TextGrid me, long tierNumber);
 
-void TextGrid_addTier (TextGrid me, Function tier);
+void TextGrid_addTier_copy (TextGrid me, Function tier);
 TextGrid TextGrid_merge (Collection textGrids);
 TextGrid TextGrid_extractPart (TextGrid me, double tmin, double tmax, int preserveTimes);
 
 TextGrid Label_to_TextGrid (Label me, double duration);
 TextGrid Label_Function_to_TextGrid (Label me, Any function);
 
-TextTier PointProcess_upto_TextTier (PointProcess me, const wchar_t *text);
-TableOfReal IntervalTier_downto_TableOfReal (IntervalTier me, const wchar_t *label);
+TextTier PointProcess_upto_TextTier (PointProcess me, const char32 *text);
+TableOfReal IntervalTier_downto_TableOfReal (IntervalTier me, const char32 *label);
 TableOfReal IntervalTier_downto_TableOfReal_any (IntervalTier me);
-TableOfReal TextTier_downto_TableOfReal (TextTier me, const wchar_t *label);
+TableOfReal TextTier_downto_TableOfReal (TextTier me, const char32 *label);
 TableOfReal TextTier_downto_TableOfReal_any (TextTier me);
 
 TextGrid PointProcess_to_TextGrid_vuv (PointProcess me, double maxT, double meanT);
@@ -111,11 +113,14 @@ void TextPoint_removeText (TextPoint me);
 void IntervalTier_removeText (IntervalTier me);
 void TextTier_removeText (TextTier me);
 
+void TextTier_removePoints (TextTier me, int which_Melder_STRING, const char32 *criterion);
+void TextGrid_removePoints (TextGrid me, long tierNumber, int which_Melder_STRING, const char32 *criterion);
+
 void TextGrid_insertBoundary (TextGrid me, int itier, double t);
 void TextGrid_removeBoundaryAtTime (TextGrid me, int itier, double t);
-void TextGrid_setIntervalText (TextGrid me, int itier, long iinterval, const wchar_t *text);
-void TextGrid_insertPoint (TextGrid me, int itier, double t, const wchar_t *mark);
-void TextGrid_setPointText (TextGrid me, int itier, long ipoint, const wchar_t *text);
+void TextGrid_setIntervalText (TextGrid me, int itier, long iinterval, const char32 *text);
+void TextGrid_insertPoint (TextGrid me, int itier, double t, const char32 *mark);
+void TextGrid_setPointText (TextGrid me, int itier, long ipoint, const char32 *text);
 
 void TextGrid_writeToChronologicalTextFile (TextGrid me, MelderFile file);
 TextGrid TextGrid_readFromChronologicalTextFile (MelderFile file);
diff --git a/fon/TextGridEditor.cpp b/fon/TextGridEditor.cpp
index 73befb1..ac47e90 100644
--- a/fon/TextGridEditor.cpp
+++ b/fon/TextGridEditor.cpp
@@ -1,6 +1,6 @@
 /* TextGridEditor.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -41,10 +41,10 @@ Thing_implement (TextGridEditor, TimeSoundAnalysisEditor, 0);
 
 void structTextGridEditor :: v_info () {
 	TextGridEditor_Parent :: v_info ();
-	MelderInfo_writeLine (L"Selected tier: ", Melder_integer (selectedTier));
-	MelderInfo_writeLine (L"TextGrid uses text styles: ", Melder_boolean (p_useTextStyles));
-	MelderInfo_writeLine (L"TextGrid font size: ", Melder_integer (p_fontSize));
-	MelderInfo_writeLine (L"TextGrid alignment: ", kGraphics_horizontalAlignment_getText (p_alignment));
+	MelderInfo_writeLine (U"Selected tier: ", selectedTier);
+	MelderInfo_writeLine (U"TextGrid uses text styles: ", p_useTextStyles);
+	MelderInfo_writeLine (U"TextGrid font size: ", p_fontSize);
+	MelderInfo_writeLine (U"TextGrid alignment: ", kGraphics_horizontalAlignment_getText (p_alignment));
 }
 
 /********** UTILITIES **********/
@@ -112,10 +112,10 @@ static void _TextGridEditor_timeToInterval (TextGridEditor me, double t, int iti
 	if (*tmax > my tmax) *tmax = my tmax;
 }
 
-static void checkTierSelection (TextGridEditor me, const wchar_t *verbPhrase) {
+static void checkTierSelection (TextGridEditor me, const char32 *verbPhrase) {
 	TextGrid grid = (TextGrid) my data;
 	if (my selectedTier < 1 || my selectedTier > grid -> tiers -> size)
-		Melder_throw ("To ", verbPhrase, ", first select a tier by clicking anywhere inside it.");
+		Melder_throw (U"To ", verbPhrase, U", first select a tier by clicking anywhere inside it.");
 }
 
 static long getSelectedInterval (TextGridEditor me) {
@@ -164,30 +164,30 @@ static void scrollToView (TextGridEditor me, double t) {
 
 static void menu_cb_ExtractSelectedTextGrid_preserveTimes (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	if (my d_endSelection <= my d_startSelection) Melder_throw ("No selection.");
+	if (my d_endSelection <= my d_startSelection) Melder_throw (U"No selection.");
 	autoTextGrid extract = TextGrid_extractPart ((TextGrid) my data, my d_startSelection, my d_endSelection, true);
-	my broadcastPublication (extract.transfer());
+	Editor_broadcastPublication (me, extract.transfer());
 }
 
 static void menu_cb_ExtractSelectedTextGrid_timeFromZero (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	if (my d_endSelection <= my d_startSelection) Melder_throw ("No selection.");
+	if (my d_endSelection <= my d_startSelection) Melder_throw (U"No selection.");
 	autoTextGrid extract = TextGrid_extractPart ((TextGrid) my data, my d_startSelection, my d_endSelection, false);
-	my broadcastPublication (extract.transfer());
+	Editor_broadcastPublication (me, extract.transfer());
 }
 
 void structTextGridEditor :: v_createMenuItems_file_extract (EditorMenu menu) {
 	TextGridEditor_Parent :: v_createMenuItems_file_extract (menu);
 	extractSelectedTextGridPreserveTimesButton =
-		EditorMenu_addCommand (menu, L"Extract selected TextGrid (preserve times)", 0, menu_cb_ExtractSelectedTextGrid_preserveTimes);
+		EditorMenu_addCommand (menu, U"Extract selected TextGrid (preserve times)", 0, menu_cb_ExtractSelectedTextGrid_preserveTimes);
 	extractSelectedTextGridTimeFromZeroButton =
-		EditorMenu_addCommand (menu, L"Extract selected TextGrid (time from 0)", 0, menu_cb_ExtractSelectedTextGrid_timeFromZero);
+		EditorMenu_addCommand (menu, U"Extract selected TextGrid (time from 0)", 0, menu_cb_ExtractSelectedTextGrid_timeFromZero);
 }
 
 static void menu_cb_WriteToTextFile (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	EDITOR_FORM_WRITE (L"Save as TextGrid text file", 0)
-		swprintf (defaultName, 300, L"%ls.TextGrid", ((Thing) my data) -> name);
+	EDITOR_FORM_WRITE (U"Save as TextGrid text file", 0)
+		Melder_sprint (defaultName,300, my data -> name, U".TextGrid");
 	EDITOR_DO_WRITE
 		Data_writeToTextFile (my data, file);
 	EDITOR_END
@@ -195,26 +195,26 @@ static void menu_cb_WriteToTextFile (EDITOR_ARGS) {
 
 void structTextGridEditor :: v_createMenuItems_file_write (EditorMenu menu) {
 	TextGridEditor_Parent :: v_createMenuItems_file_write (menu);
-	EditorMenu_addCommand (menu, L"Save TextGrid as text file...", 'S', menu_cb_WriteToTextFile);
+	EditorMenu_addCommand (menu, U"Save TextGrid as text file...", 'S', menu_cb_WriteToTextFile);
 }
 
 static void menu_cb_DrawVisibleTextGrid (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	EDITOR_FORM (L"Draw visible TextGrid", 0)
+	EDITOR_FORM (U"Draw visible TextGrid", 0)
 		my v_form_pictureWindow (cmd);
 		my v_form_pictureMargins (cmd);
 		my v_form_pictureSelection (cmd);
-		BOOLEAN (L"Garnish", my default_picture_garnish ());
+		BOOLEAN (U"Garnish", my default_picture_garnish ());
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
 		my v_ok_pictureMargins (cmd);
 		my v_ok_pictureSelection (cmd);
-		SET_INTEGER (L"Garnish", my pref_picture_garnish ());
+		SET_INTEGER (U"Garnish", my pref_picture_garnish ());
 	EDITOR_DO
 		my v_do_pictureWindow (cmd);
 		my v_do_pictureMargins (cmd);
 		my v_do_pictureSelection (cmd);
-		my pref_picture_garnish () = GET_INTEGER (L"Garnish");
+		my pref_picture_garnish () = GET_INTEGER (U"Garnish");
 		Editor_openPraatPicture (me);
 		TextGrid_Sound_draw ((TextGrid) my data, NULL, my pictureGraphics, my d_startWindow, my d_endWindow, true, my p_useTextStyles,
 			my pref_picture_garnish ());
@@ -225,27 +225,30 @@ static void menu_cb_DrawVisibleTextGrid (EDITOR_ARGS) {
 
 static void menu_cb_DrawVisibleSoundAndTextGrid (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	EDITOR_FORM (L"Draw visible sound and TextGrid", 0)
+	EDITOR_FORM (U"Draw visible sound and TextGrid", 0)
 		my v_form_pictureWindow (cmd);
 		my v_form_pictureMargins (cmd);
 		my v_form_pictureSelection (cmd);
-		BOOLEAN (L"Garnish", my default_picture_garnish ());
+		BOOLEAN (U"Garnish", my default_picture_garnish ());
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
 		my v_ok_pictureMargins (cmd);
 		my v_ok_pictureSelection (cmd);
-		SET_INTEGER (L"Garnish", my pref_picture_garnish ());
+		SET_INTEGER (U"Garnish", my pref_picture_garnish ());
 	EDITOR_DO
 		my v_do_pictureWindow (cmd);
 		my v_do_pictureMargins (cmd);
 		my v_do_pictureSelection (cmd);
-		my pref_picture_garnish () = GET_INTEGER (L"Garnish");
+		my pref_picture_garnish () = GET_INTEGER (U"Garnish");
 		Editor_openPraatPicture (me);
-		Sound publish = my d_longSound.data ?
-			LongSound_extractPart (my d_longSound.data, my d_startWindow, my d_endWindow, true) :
-			Sound_extractPart (my d_sound.data, my d_startWindow, my d_endWindow, kSound_windowShape_RECTANGULAR, 1.0, true);
-		TextGrid_Sound_draw ((TextGrid) my data, publish, my pictureGraphics, my d_startWindow, my d_endWindow, true, my p_useTextStyles, my pref_picture_garnish ());
-		forget (publish);
+		{// scope
+			autoSound sound = my d_longSound.data ?
+				LongSound_extractPart (my d_longSound.data, my d_startWindow, my d_endWindow, true) :
+				Sound_extractPart (my d_sound.data, my d_startWindow, my d_endWindow,
+					kSound_windowShape_RECTANGULAR, 1.0, true);
+			TextGrid_Sound_draw ((TextGrid) my data, sound.get(), my pictureGraphics,
+				my d_startWindow, my d_endWindow, true, my p_useTextStyles, my pref_picture_garnish ());
+		}
 		FunctionEditor_garnish (me);
 		Editor_closePraatPicture (me);
 	EDITOR_END
@@ -253,9 +256,9 @@ static void menu_cb_DrawVisibleSoundAndTextGrid (EDITOR_ARGS) {
 
 void structTextGridEditor :: v_createMenuItems_file_draw (EditorMenu menu) {
 	TextGridEditor_Parent :: v_createMenuItems_file_draw (menu);
-	EditorMenu_addCommand (menu, L"Draw visible TextGrid...", 0, menu_cb_DrawVisibleTextGrid);
+	EditorMenu_addCommand (menu, U"Draw visible TextGrid...", 0, menu_cb_DrawVisibleTextGrid);
 	if (d_sound.data || d_longSound.data)
-		EditorMenu_addCommand (menu, L"Draw visible sound and TextGrid...", 0, menu_cb_DrawVisibleSoundAndTextGrid);
+		EditorMenu_addCommand (menu, U"Draw visible sound and TextGrid...", 0, menu_cb_DrawVisibleSoundAndTextGrid);
 }
 
 /***** EDIT MENU *****/
@@ -263,38 +266,38 @@ void structTextGridEditor :: v_createMenuItems_file_draw (EditorMenu menu) {
 #ifndef macintosh
 static void menu_cb_Cut (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	my text -> f_cut ();
+	GuiText_cut (my text);
 }
 static void menu_cb_Copy (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	my text -> f_copy ();
+	GuiText_copy (my text);
 }
 static void menu_cb_Paste (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	my text -> f_paste ();
+	GuiText_paste (my text);
 }
 static void menu_cb_Erase (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	my text -> f_remove ();
+	GuiText_remove (my text);
 }
 #endif
 
 static void menu_cb_Genericize (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	Editor_save (me, L"Convert to Backslash Trigraphs");
+	Editor_save (me, U"Convert to Backslash Trigraphs");
 	TextGrid_genericize ((TextGrid) my data);
 	FunctionEditor_updateText (me);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_Nativize (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	Editor_save (me, L"Convert to Unicode");
+	Editor_save (me, U"Convert to Unicode");
 	TextGrid_nativize ((TextGrid) my data);
 	FunctionEditor_updateText (me);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 /***** QUERY MENU *****/
@@ -302,48 +305,48 @@ static void menu_cb_Nativize (EDITOR_ARGS) {
 static void menu_cb_GetStartingPointOfInterval (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	TextGrid grid = (TextGrid) my data;
-	checkTierSelection (me, L"query the starting point of an interval");
+	checkTierSelection (me, U"query the starting point of an interval");
 	Function anyTier = (Function) grid -> tiers -> item [my selectedTier];
 	if (anyTier -> classInfo == classIntervalTier) {
 		IntervalTier tier = (IntervalTier) anyTier;
 		long iinterval = IntervalTier_timeToIndex (tier, my d_startSelection);
 		double time = iinterval < 1 || iinterval > tier -> intervals -> size ? NUMundefined :
 			((TextInterval) tier -> intervals -> item [iinterval]) -> xmin;
-		Melder_informationReal (time, L"seconds");
+		Melder_informationReal (time, U"seconds");
 	} else {
-		Melder_throw ("The selected tier is not an interval tier.");
+		Melder_throw (U"The selected tier is not an interval tier.");
 	}
 }
 
 static void menu_cb_GetEndPointOfInterval (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	TextGrid grid = (TextGrid) my data;
-	checkTierSelection (me, L"query the end point of an interval");
+	checkTierSelection (me, U"query the end point of an interval");
 	Function anyTier = (Function) grid -> tiers -> item [my selectedTier];
 	if (anyTier -> classInfo == classIntervalTier) {
 		IntervalTier tier = (IntervalTier) anyTier;
 		long iinterval = IntervalTier_timeToIndex (tier, my d_startSelection);
 		double time = iinterval < 1 || iinterval > tier -> intervals -> size ? NUMundefined :
 			((TextInterval) tier -> intervals -> item [iinterval]) -> xmax;
-		Melder_informationReal (time, L"seconds");
+		Melder_informationReal (time, U"seconds");
 	} else {
-		Melder_throw ("The selected tier is not an interval tier.");
+		Melder_throw (U"The selected tier is not an interval tier.");
 	}
 }
 
 static void menu_cb_GetLabelOfInterval (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	TextGrid grid = (TextGrid) my data;
-	checkTierSelection (me, L"query the label of an interval");
+	checkTierSelection (me, U"query the label of an interval");
 	Function anyTier = (Function) grid -> tiers -> item [my selectedTier];
 	if (anyTier -> classInfo == classIntervalTier) {
 		IntervalTier tier = (IntervalTier) anyTier;
 		long iinterval = IntervalTier_timeToIndex (tier, my d_startSelection);
-		const wchar_t *label = iinterval < 1 || iinterval > tier -> intervals -> size ? L"" :
+		const char32 *label = iinterval < 1 || iinterval > tier -> intervals -> size ? U"" :
 			((TextInterval) tier -> intervals -> item [iinterval]) -> text;
 		Melder_information (label);
 	} else {
-		Melder_throw ("The selected tier is not an interval tier.");
+		Melder_throw (U"The selected tier is not an interval tier.");
 	}
 }
 
@@ -497,45 +500,45 @@ static void menu_cb_MoveEtoZero (EDITOR_ARGS) {
 
 static void menu_cb_DrawTextGridAndPitch (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	EDITOR_FORM (L"Draw TextGrid and Pitch separately", 0)
+	EDITOR_FORM (U"Draw TextGrid and Pitch separately", 0)
 		my v_form_pictureWindow (cmd);
-		LABEL (L"", L"TextGrid:")
-		BOOLEAN (L"Show boundaries and points", my default_picture_showBoundaries ());
-		LABEL (L"", L"Pitch:")
-		BOOLEAN (L"Speckle", my default_picture_pitch_speckle ());
+		LABEL (U"", U"TextGrid:")
+		BOOLEAN (U"Show boundaries and points", my default_picture_showBoundaries ());
+		LABEL (U"", U"Pitch:")
+		BOOLEAN (U"Speckle", my default_picture_pitch_speckle ());
 		my v_form_pictureMargins (cmd);
 		my v_form_pictureSelection (cmd);
-		BOOLEAN (L"Garnish", my default_picture_garnish ());
+		BOOLEAN (U"Garnish", my default_picture_garnish ());
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
-		SET_INTEGER (L"Show boundaries and points", my pref_picture_showBoundaries ());
-		SET_INTEGER (L"Speckle", my pref_picture_pitch_speckle ());
+		SET_INTEGER (U"Show boundaries and points", my pref_picture_showBoundaries ());
+		SET_INTEGER (U"Speckle", my pref_picture_pitch_speckle ());
 		my v_ok_pictureMargins (cmd);
 		my v_ok_pictureSelection (cmd);
-		SET_INTEGER (L"Garnish", my pref_picture_garnish ());
+		SET_INTEGER (U"Garnish", my pref_picture_garnish ());
 	EDITOR_DO
 		my v_do_pictureWindow (cmd);
-		my pref_picture_showBoundaries () = GET_INTEGER (L"Show boundaries and points");
-		my pref_picture_pitch_speckle () = GET_INTEGER (L"Speckle");
+		my pref_picture_showBoundaries () = GET_INTEGER (U"Show boundaries and points");
+		my pref_picture_pitch_speckle () = GET_INTEGER (U"Speckle");
 		my v_do_pictureMargins (cmd);
 		my v_do_pictureSelection (cmd);
-		my pref_picture_garnish () = GET_INTEGER (L"Garnish");
+		my pref_picture_garnish () = GET_INTEGER (U"Garnish");
 		if (! my p_pitch_show)
-			Melder_throw ("No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
+			Melder_throw (U"No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
 		if (! my d_pitch) {
 			TimeSoundAnalysisEditor_computePitch (me);
-			if (! my d_pitch) Melder_throw ("Cannot compute pitch.");
+			if (! my d_pitch) Melder_throw (U"Cannot compute pitch.");
 		}
 		Editor_openPraatPicture (me);
-		double pitchFloor_hidden = Function_convertStandardToSpecialUnit (my d_pitch, my p_pitch_floor, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-		double pitchCeiling_hidden = Function_convertStandardToSpecialUnit (my d_pitch, my p_pitch_ceiling, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-		double pitchFloor_overt = Function_convertToNonlogarithmic (my d_pitch, pitchFloor_hidden, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-		double pitchCeiling_overt = Function_convertToNonlogarithmic (my d_pitch, pitchCeiling_hidden, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		double pitchFloor_hidden = Function_convertStandardToSpecialUnit (my d_pitch.peek(), my p_pitch_floor, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		double pitchCeiling_hidden = Function_convertStandardToSpecialUnit (my d_pitch.peek(), my p_pitch_ceiling, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		double pitchFloor_overt = Function_convertToNonlogarithmic (my d_pitch.peek(), pitchFloor_hidden, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		double pitchCeiling_overt = Function_convertToNonlogarithmic (my d_pitch.peek(), pitchCeiling_hidden, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
 		double pitchViewFrom_overt = my p_pitch_viewFrom < my p_pitch_viewTo ? my p_pitch_viewFrom : pitchFloor_overt;
 		double pitchViewTo_overt = my p_pitch_viewFrom < my p_pitch_viewTo ? my p_pitch_viewTo : pitchCeiling_overt;
-		TextGrid_Pitch_drawSeparately ((TextGrid) my data, my d_pitch, my pictureGraphics, my d_startWindow, my d_endWindow,
-			pitchViewFrom_overt, pitchViewTo_overt, GET_INTEGER (L"Show boundaries and points"), my p_useTextStyles, GET_INTEGER (L"Garnish"),
-			GET_INTEGER (L"Speckle"), my p_pitch_unit);
+		TextGrid_Pitch_drawSeparately ((TextGrid) my data, my d_pitch.peek(), my pictureGraphics, my d_startWindow, my d_endWindow,
+			pitchViewFrom_overt, pitchViewTo_overt, GET_INTEGER (U"Show boundaries and points"), my p_useTextStyles, GET_INTEGER (U"Garnish"),
+			GET_INTEGER (U"Speckle"), my p_pitch_unit);
 		FunctionEditor_garnish (me);
 		Editor_closePraatPicture (me);
 	EDITOR_END
@@ -549,7 +552,7 @@ static void insertBoundaryOrPoint (TextGridEditor me, int itier, double t1, doub
 	TextTier textTier;
 	int ntiers = grid -> tiers -> size;
 	if (itier < 1 || itier > ntiers)
-		Melder_throw ("No tier ", itier, ".");
+		Melder_throw (U"No tier ", itier, U".");
 	_AnyTier_identifyClass ((Function) grid -> tiers -> item [itier], & intervalTier, & textTier);
 	Melder_assert (t1 <= t2);
 
@@ -558,24 +561,24 @@ static void insertBoundaryOrPoint (TextGridEditor me, int itier, double t1, doub
 		bool t1IsABoundary = IntervalTier_hasTime (intervalTier, t1);
 		bool t2IsABoundary = IntervalTier_hasTime (intervalTier, t2);
 		if (t1 == t2 && t1IsABoundary)
-			Melder_throw ("Cannot add a boundary at ", Melder_fixed (t1, 6), " seconds, because there is already a boundary there.");
+			Melder_throw (U"Cannot add a boundary at ", Melder_fixed (t1, 6), U" seconds, because there is already a boundary there.");
 		if (t1IsABoundary && t2IsABoundary)
-			Melder_throw ("Cannot add boundaries at ", Melder_fixed (t1, 6), " and ", Melder_fixed (t2, 6), " seconds, because there are already boundaries there.");
+			Melder_throw (U"Cannot add boundaries at ", Melder_fixed (t1, 6), U" and ", Melder_fixed (t2, 6), U" seconds, because there are already boundaries there.");
 		long iinterval = IntervalTier_timeToIndex (intervalTier, t1);
 		//Melder_casual ("iinterval %ld, t = %f", iinterval, t1);
 		long iinterval2 = t1 == t2 ? iinterval : IntervalTier_timeToIndex (intervalTier, t2);
 		//Melder_casual ("iinterval2 %ld, t = %f", iinterval2, t2);
 		if (iinterval == 0 || iinterval2 == 0)
-			Melder_throw ("The selection is outside the time domain of the intervals.");
+			Melder_throw (U"The selection is outside the time domain of the intervals.");
 		long correctedIinterval2 = t2IsABoundary && iinterval2 == intervalTier -> intervals -> size ? iinterval2 + 1 : iinterval2;
 		if (correctedIinterval2 > iinterval + 1 || (correctedIinterval2 > iinterval && ! t2IsABoundary))
-			Melder_throw ("The selection straddles a boundary.");
+			Melder_throw (U"The selection straddles a boundary.");
 		TextInterval interval = (TextInterval) intervalTier -> intervals -> item [iinterval];
 
 		if (t1 == t2) {
-			Editor_save (me, L"Add boundary");
+			Editor_save (me, U"Add boundary");
 		} else {
-			Editor_save (me, L"Add interval");
+			Editor_save (me, U"Add interval");
 		}
 
 		if (itier == my selectedTier) {
@@ -583,48 +586,48 @@ static void insertBoundaryOrPoint (TextGridEditor me, int itier, double t1, doub
 			 * Divide up the label text into left, mid and right, depending on where the text selection is.
 			 */
 			long left, right;
-			wchar_t *text = my text -> f_getStringAndSelectionPosition (& left, & right);
-			bool wholeTextIsSelected = right - left == wcslen (text);
+			char32 *text = GuiText_getStringAndSelectionPosition (my text, & left, & right);
+			bool wholeTextIsSelected = right - left == str32len (text);
 			rightNewInterval = TextInterval_create (t2, interval -> xmax, text + right);
 			text [right] = '\0';
 			midNewInterval = TextInterval_create (t1, t2, text + left);
-			if (! wholeTextIsSelected || t1 != t2) text [left] = '\0';
+			if (! wholeTextIsSelected || t1 != t2) text [left] = U'\0';
 			TextInterval_setText (interval, text);
 			Melder_free (text);
 		} else {
 			/*
 			 * Move the text to the left of the boundary.
 			 */
-			rightNewInterval = TextInterval_create (t2, interval -> xmax, L"");
-			midNewInterval = TextInterval_create (t1, t2, L"");
+			rightNewInterval = TextInterval_create (t2, interval -> xmax, U"");
+			midNewInterval = TextInterval_create (t1, t2, U"");
 		}
 		if (t1IsABoundary) {
 			/*
 			 * Merge mid with left interval.
 			 */
 			if (interval -> xmin != t1)
-				Melder_fatal ("Boundary unequal: %.17g versus %.17g.", interval -> xmin, t1);
+				Melder_fatal (U"Boundary unequal: ", interval -> xmin, U" versus ", t1, U".");
 			interval -> xmax = t2;
-			TextInterval_setText (interval, Melder_wcscat (interval -> text, midNewInterval -> text));
+			TextInterval_setText (interval, Melder_cat (interval -> text, midNewInterval -> text));
 			forget (midNewInterval);
 		} else if (t2IsABoundary) {
 			/*
 			 * Merge mid and right interval.
 			 */
 			if (interval -> xmax != t2)
-				Melder_fatal ("Boundary unequal: %.17g versus %.17g.", interval -> xmax, t2);
+				Melder_fatal (U"Boundary unequal: ", interval -> xmax, U" versus ", t2, U".");
 			interval -> xmax = t1;
 			Melder_assert (rightNewInterval -> xmin == t2);
 			Melder_assert (rightNewInterval -> xmax == t2);
 			rightNewInterval -> xmin = t1;
-			TextInterval_setText (rightNewInterval, Melder_wcscat (midNewInterval -> text, rightNewInterval -> text));
+			TextInterval_setText (rightNewInterval, Melder_cat (midNewInterval -> text, rightNewInterval -> text));
 			forget (midNewInterval);
 		} else {
 			interval -> xmax = t1;
 			if (t1 != t2) Collection_addItem (intervalTier -> intervals, midNewInterval);
 		}
 		Collection_addItem (intervalTier -> intervals, rightNewInterval);
-		if (insertSecond && ntiers >= 2) {
+		if (insertSecond && ntiers >= 2 && t1 == t2) {
 			/*
 			 * Find the last time before t on another tier.
 			 */
@@ -636,7 +639,7 @@ static void insertBoundaryOrPoint (TextGridEditor me, int itier, double t1, doub
 				}
 			}
 			if (tlast > interval -> xmin && tlast < t1) {
-				TextInterval newInterval = TextInterval_create (tlast, t1, L"");
+				TextInterval newInterval = TextInterval_create (tlast, t1, U"");
 				interval -> xmax = tlast;
 				Collection_addItem (intervalTier -> intervals, newInterval);
 			}
@@ -644,11 +647,11 @@ static void insertBoundaryOrPoint (TextGridEditor me, int itier, double t1, doub
 	} else {
 		TextPoint newPoint;
 		if (AnyTier_hasPoint (textTier, t1))
-			Melder_throw ("Cannot add a point at ", Melder_fixed (t1, 6), " seconds, because there is already a point there.");
+			Melder_throw (U"Cannot add a point at ", Melder_fixed (t1, 6), U" seconds, because there is already a point there.");
 
-		Editor_save (me, L"Add point");
+		Editor_save (me, U"Add point");
 
-		newPoint = TextPoint_create (t1, L"");
+		newPoint = TextPoint_create (t1, U"");
 		Collection_addItem (textTier -> points, newPoint);
 	}
 	my d_startSelection = my d_endSelection = t1;
@@ -662,9 +665,9 @@ static void do_insertIntervalOnTier (TextGridEditor me, int itier) {
 			true);
 		my selectedTier = itier;
 		FunctionEditor_marksChanged (me, true);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	} catch (MelderError) {
-		Melder_throw ("Interval not inserted.");
+		Melder_throw (U"Interval not inserted.");
 	}
 }
 
@@ -680,50 +683,50 @@ static void menu_cb_InsertIntervalOnTier8 (EDITOR_ARGS) { EDITOR_IAM (TextGridEd
 static void menu_cb_AlignInterval (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	TextGrid grid = (TextGrid) my data;
-	checkTierSelection (me, L"align words");
+	checkTierSelection (me, U"align words");
 	AnyTier tier = static_cast <AnyTier> (grid -> tiers -> item [my selectedTier]);
 	if (tier -> classInfo != classIntervalTier)
-		Melder_throw ("Alignment works only for interval tiers, whereas tier ", my selectedTier, " is a point tier.\nSelect an interval tier instead.");
+		Melder_throw (U"Alignment works only for interval tiers, whereas tier ", my selectedTier, U" is a point tier.\nSelect an interval tier instead.");
 	long intervalNumber = getSelectedInterval (me);
 	if (! intervalNumber)
-		Melder_throw ("Select an interval first");
+		Melder_throw (U"Select an interval first");
 	if (! my p_align_includeWords && ! my p_align_includePhonemes)
-		Melder_throw ("Nothing to be done.\nPlease switch on \"Include words\" and/or \"Include phonemes\" in the \"Alignment settings\".");
+		Melder_throw (U"Nothing to be done.\nPlease switch on \"Include words\" and/or \"Include phonemes\" in the \"Alignment settings\".");
 	{// scope
 		autoMelderProgressOff noprogress;
 		Function anySound = my d_sound.data;
 		if (my d_longSound.data) anySound = my d_longSound.data;
-		Editor_save (me, L"Align interval");
+		Editor_save (me, U"Align interval");
 		TextGrid_anySound_alignInterval (grid, anySound, my selectedTier, intervalNumber,
 			my p_align_language, my p_align_includeWords, my p_align_includePhonemes);
 	}
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_AlignmentSettings (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	EDITOR_FORM (L"Alignment settings", 0)
-		OPTIONMENU (L"Language", Strings_findString (espeakdata_voices_names, L"English"))
+	EDITOR_FORM (U"Alignment settings", 0)
+		OPTIONMENU (U"Language", Strings_findString (espeakdata_voices_names, U"English"))
 		for (long i = 1; i <= espeakdata_voices_names -> numberOfStrings; i ++) {
-			OPTION ((const wchar_t *) espeakdata_voices_names -> strings [i]);
+			OPTION ((const char32 *) espeakdata_voices_names -> strings [i]);
 		}
-		BOOLEAN (L"Include words", my default_align_includeWords ())
-		BOOLEAN (L"Include phonemes", my default_align_includePhonemes ())
-		BOOLEAN (L"Allow silences", my default_align_allowSilences ())
+		BOOLEAN (U"Include words", my default_align_includeWords ())
+		BOOLEAN (U"Include phonemes", my default_align_includePhonemes ())
+		BOOLEAN (U"Allow silences", my default_align_allowSilences ())
 	EDITOR_OK
 		long prefVoice = Strings_findString (espeakdata_voices_names, my p_align_language);
-		if (prefVoice == 0) prefVoice = Strings_findString (espeakdata_voices_names, L"English");
-		SET_INTEGER (L"Language", prefVoice);
-		SET_INTEGER (L"Include words", my p_align_includeWords)
-		SET_INTEGER (L"Include phonemes", my p_align_includePhonemes)
-		SET_INTEGER (L"Allow silences", my p_align_allowSilences)
+		if (prefVoice == 0) prefVoice = Strings_findString (espeakdata_voices_names, U"English");
+		SET_INTEGER (U"Language", prefVoice);
+		SET_INTEGER (U"Include words", my p_align_includeWords)
+		SET_INTEGER (U"Include phonemes", my p_align_includePhonemes)
+		SET_INTEGER (U"Allow silences", my p_align_allowSilences)
 	EDITOR_DO
-		//my pref_align_language () = my p_align_language = GET_ENUM (kTextGrid_language, L"Language");
-		pref_wcscpy2 (my pref_align_language (), my p_align_language, GET_STRING (L"Language"));
-		my pref_align_includeWords    () = my p_align_includeWords    = GET_INTEGER (L"Include words");
-		my pref_align_includePhonemes () = my p_align_includePhonemes = GET_INTEGER (L"Include phonemes");
-		my pref_align_allowSilences   () = my p_align_allowSilences   = GET_INTEGER (L"Allow silences");
+		//my pref_align_language () = my p_align_language = GET_ENUM (kTextGrid_language, U"Language");
+		pref_str32cpy2 (my pref_align_language (), my p_align_language, GET_STRING (U"Language"));
+		my pref_align_includeWords    () = my p_align_includeWords    = GET_INTEGER (U"Include words");
+		my pref_align_includePhonemes () = my p_align_includePhonemes = GET_INTEGER (U"Include phonemes");
+		my pref_align_allowSilences   () = my p_align_allowSilences   = GET_INTEGER (U"Allow silences");
 	EDITOR_END
 }
 
@@ -732,72 +735,72 @@ static void menu_cb_AlignmentSettings (EDITOR_ARGS) {
 static void menu_cb_RemovePointOrBoundary (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	TextGrid grid = (TextGrid) my data;
-	checkTierSelection (me, L"remove a point or boundary");
+	checkTierSelection (me, U"remove a point or boundary");
 	Function anyTier = (Function) grid -> tiers -> item [my selectedTier];
 	if (anyTier -> classInfo == classIntervalTier) {
 		IntervalTier tier = (IntervalTier) anyTier;
 		long selectedLeftBoundary = getSelectedLeftBoundary (me);
-		if (! selectedLeftBoundary) Melder_throw ("To remove a boundary, first click on it.");
+		if (! selectedLeftBoundary) Melder_throw (U"To remove a boundary, first click on it.");
 
-		Editor_save (me, L"Remove boundary");
+		Editor_save (me, U"Remove boundary");
 		IntervalTier_removeLeftBoundary (tier, selectedLeftBoundary);
 	} else {
 		TextTier tier = (TextTier) anyTier;
 		long selectedPoint = getSelectedPoint (me);
-		if (! selectedPoint) Melder_throw ("To remove a point, first click on it.");
+		if (! selectedPoint) Melder_throw (U"To remove a point, first click on it.");
 
-		Editor_save (me, L"Remove point");
+		Editor_save (me, U"Remove point");
 		Collection_removeItem (tier -> points, selectedPoint);
 	}
 	FunctionEditor_updateText (me);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void do_movePointOrBoundary (TextGridEditor me, int where) {
 	double position;
 	TextGrid grid = (TextGrid) my data;
 	if (where == 0 && my d_sound.data == NULL) return;
-	checkTierSelection (me, L"move a point or boundary");
+	checkTierSelection (me, U"move a point or boundary");
 	Function anyTier = (Function) grid -> tiers -> item [my selectedTier];
 	if (anyTier -> classInfo == classIntervalTier) {
 		IntervalTier tier = (IntervalTier) anyTier;
-		static const wchar_t *boundarySaveText [3] = { L"Move boundary to zero crossing", L"Move boundary to B", L"Move boundary to E" };
+		static const char32 *boundarySaveText [3] { U"Move boundary to zero crossing", U"Move boundary to B", U"Move boundary to E" };
 		TextInterval left, right;
 		long selectedLeftBoundary = getSelectedLeftBoundary (me);
 		if (! selectedLeftBoundary)
-			Melder_throw ("To move a boundary, first click on it.");
+			Melder_throw (U"To move a boundary, first click on it.");
 		left = (TextInterval) tier -> intervals -> item [selectedLeftBoundary - 1];
 		right = (TextInterval) tier -> intervals -> item [selectedLeftBoundary];
 		position = where == 1 ? my d_startSelection : where == 2 ? my d_endSelection :
 			Sound_getNearestZeroCrossing (my d_sound.data, left -> xmax, 1);   // STEREO BUG
 		if (position == NUMundefined)
-			Melder_throw ("There is no zero crossing to move to.");
+			Melder_throw (U"There is no zero crossing to move to.");
 		if (position <= left -> xmin || position >= right -> xmax)
-			Melder_throw ("Cannot move a boundary past its neighbour.");
+			Melder_throw (U"Cannot move a boundary past its neighbour.");
 
 		Editor_save (me, boundarySaveText [where]);
 
 		left -> xmax = right -> xmin = my d_startSelection = my d_endSelection = position;
 	} else {
 		TextTier tier = (TextTier) anyTier;
-		static const wchar_t *pointSaveText [3] = { L"Move point to zero crossing", L"Move point to B", L"Move point to E" };
+		static const char32 *pointSaveText [3] { U"Move point to zero crossing", U"Move point to B", U"Move point to E" };
 		TextPoint point;
 		long selectedPoint = getSelectedPoint (me);
 		if (! selectedPoint)
-			Melder_throw ("To move a point, first click on it.");
+			Melder_throw (U"To move a point, first click on it.");
 		point = (TextPoint) tier -> points -> item [selectedPoint];
 		position = where == 1 ? my d_startSelection : where == 2 ? my d_endSelection :
 			Sound_getNearestZeroCrossing (my d_sound.data, point -> number, 1);   // STEREO BUG
 		if (position == NUMundefined)
-			Melder_throw ("There is no zero crossing to move to.");
+			Melder_throw (U"There is no zero crossing to move to.");
 
 		Editor_save (me, pointSaveText [where]);
 
 		point -> number = my d_startSelection = my d_endSelection = position;
 	}
 	FunctionEditor_marksChanged (me, true);   // because cursor has moved
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_MoveToB (EDITOR_ARGS) {
@@ -823,9 +826,9 @@ static void do_insertOnTier (TextGridEditor me, int itier) {
 			false);
 		my selectedTier = itier;
 		FunctionEditor_marksChanged (me, true);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	} catch (MelderError) {
-		Melder_throw ("Boundary or point not inserted.");
+		Melder_throw (U"Boundary or point not inserted.");
 	}
 }
 
@@ -857,21 +860,21 @@ static void menu_cb_InsertOnAllTiers (EDITOR_ARGS) {
 
 static void findInTier (TextGridEditor me) {
 	TextGrid grid = (TextGrid) my data;
-	checkTierSelection (me, L"find a text");
+	checkTierSelection (me, U"find a text");
 	Function anyTier = (Function) grid -> tiers -> item [my selectedTier];
 	if (anyTier -> classInfo == classIntervalTier) {
 		IntervalTier tier = (IntervalTier) anyTier;
 		long iinterval = IntervalTier_timeToIndex (tier, my d_startSelection) + 1;
 		while (iinterval <= tier -> intervals -> size) {
 			TextInterval interval = (TextInterval) tier -> intervals -> item [iinterval];
-			wchar_t *text = interval -> text;
+			char32 *text = interval -> text;
 			if (text) {
-				wchar_t *position = wcsstr (text, my findString);
+				char32 *position = str32str (text, my findString);
 				if (position) {
 					my d_startSelection = interval -> xmin;
 					my d_endSelection = interval -> xmax;
 					scrollToView (me, my d_startSelection);
-					my text -> f_setSelection (position - text, position - text + wcslen (my findString));
+					GuiText_setSelection (my text, position - text, position - text + str32len (my findString));
 					return;
 				}
 			}
@@ -884,13 +887,13 @@ static void findInTier (TextGridEditor me) {
 		long ipoint = AnyTier_timeToLowIndex (tier, my d_startSelection) + 1;
 		while (ipoint <= tier -> points -> size) {
 			TextPoint point = (TextPoint) tier -> points -> item [ipoint];
-			wchar_t *text = point -> mark;
+			char32 *text = point -> mark;
 			if (text) {
-				wchar_t *position = wcsstr (text, my findString);
+				char32 *position = str32str (text, my findString);
 				if (position) {
 					my d_startSelection = my d_endSelection = point -> number;
 					scrollToView (me, point -> number);
-					my text -> f_setSelection (position - text, position - text + wcslen (my findString));
+					GuiText_setSelection (my text, position - text, position - text + str32len (my findString));
 					return;
 				}
 			}
@@ -904,10 +907,10 @@ static void findInTier (TextGridEditor me) {
 static void do_find (TextGridEditor me) {
 	if (my findString) {
 		long left, right;
-		autostring label = my text -> f_getStringAndSelectionPosition (& left, & right);
-		wchar_t *position = wcsstr (label.peek() + right, my findString);   // CRLF BUG?
+		autostring32 label = GuiText_getStringAndSelectionPosition (my text, & left, & right);
+		char32 *position = str32str (label.peek() + right, my findString);   // CRLF BUG?
 		if (position) {
-			my text -> f_setSelection (position - label.peek(), position - label.peek() + wcslen (my findString));
+			GuiText_setSelection (my text, position - label.peek(), position - label.peek() + str32len (my findString));
 		} else {
 			findInTier (me);
 		}
@@ -916,13 +919,13 @@ static void do_find (TextGridEditor me) {
 
 static void menu_cb_Find (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	EDITOR_FORM (L"Find text", 0)
-		LABEL (L"", L"Text:")
-		TEXTFIELD (L"string", L"")
+	EDITOR_FORM (U"Find text", 0)
+		LABEL (U"", U"Text:")
+		TEXTFIELD (U"string", U"")
 	EDITOR_OK
 	EDITOR_DO
 		Melder_free (my findString);
-		my findString = Melder_wcsdup_f (GET_STRING (L"string"));
+		my findString = Melder_dup_f (GET_STRING (U"string"));
 		do_find (me);
 	EDITOR_END
 }
@@ -934,22 +937,22 @@ static void menu_cb_FindAgain (EDITOR_ARGS) {
 
 static void checkSpellingInTier (TextGridEditor me) {
 	TextGrid grid = (TextGrid) my data;
-	checkTierSelection (me, L"check spelling");
+	checkTierSelection (me, U"check spelling");
 	Function anyTier = (Function) grid -> tiers -> item [my selectedTier];
 	if (anyTier -> classInfo == classIntervalTier) {
 		IntervalTier tier = (IntervalTier) anyTier;
 		long iinterval = IntervalTier_timeToIndex (tier, my d_startSelection) + 1;
 		while (iinterval <= tier -> intervals -> size) {
 			TextInterval interval = (TextInterval) tier -> intervals -> item [iinterval];
-			wchar_t *text = interval -> text;
+			char32 *text = interval -> text;
 			if (text) {
 				long position = 0;
-				wchar_t *notAllowed = SpellingChecker_nextNotAllowedWord (my spellingChecker, text, & position);
+				char32 *notAllowed = SpellingChecker_nextNotAllowedWord (my spellingChecker, text, & position);
 				if (notAllowed) {
 					my d_startSelection = interval -> xmin;
 					my d_endSelection = interval -> xmax;
 					scrollToView (me, my d_startSelection);
-					my text -> f_setSelection (position, position + wcslen (notAllowed));
+					GuiText_setSelection (my text, position, position + str32len (notAllowed));
 					return;
 				}
 			}
@@ -962,14 +965,14 @@ static void checkSpellingInTier (TextGridEditor me) {
 		long ipoint = AnyTier_timeToLowIndex (tier, my d_startSelection) + 1;
 		while (ipoint <= tier -> points -> size) {
 			TextPoint point = (TextPoint) tier -> points -> item [ipoint];
-			wchar_t *text = point -> mark;
+			char32 *text = point -> mark;
 			if (text) {
 				long position = 0;
-				wchar_t *notAllowed = SpellingChecker_nextNotAllowedWord (my spellingChecker, text, & position);
+				char32 *notAllowed = SpellingChecker_nextNotAllowedWord (my spellingChecker, text, & position);
 				if (notAllowed) {
 					my d_startSelection = my d_endSelection = point -> number;
 					scrollToView (me, point -> number);
-					my text -> f_setSelection (position, position + wcslen (notAllowed));
+					GuiText_setSelection (my text, position, position + str32len (notAllowed));
 					return;
 				}
 			}
@@ -984,11 +987,11 @@ static void menu_cb_CheckSpelling (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	if (my spellingChecker) {
 		long left, right;
-		autostring label = my text -> f_getStringAndSelectionPosition (& left, & right);
+		autostring32 label = GuiText_getStringAndSelectionPosition (my text, & left, & right);
 		long position = right;
-		wchar_t *notAllowed = SpellingChecker_nextNotAllowedWord (my spellingChecker, label.peek(), & position);
+		char32 *notAllowed = SpellingChecker_nextNotAllowedWord (my spellingChecker, label.peek(), & position);
 		if (notAllowed) {
-			my text -> f_setSelection (position, position + wcslen (notAllowed));
+			GuiText_setSelection (my text, position, position + str32len (notAllowed));
 		} else {
 			checkSpellingInTier (me);
 		}
@@ -999,11 +1002,11 @@ static void menu_cb_CheckSpellingInInterval (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	if (my spellingChecker) {
 		long left, right;
-		autostring label = my text -> f_getStringAndSelectionPosition (& left, & right);
+		autostring32 label = GuiText_getStringAndSelectionPosition (my text, & left, & right);
 		long position = right;
-		wchar_t *notAllowed = SpellingChecker_nextNotAllowedWord (my spellingChecker, label.peek(), & position);
+		char32 *notAllowed = SpellingChecker_nextNotAllowedWord (my spellingChecker, label.peek(), & position);
 		if (notAllowed) {
-			my text -> f_setSelection (position, position + wcslen (notAllowed));
+			GuiText_setSelection (my text, position, position + str32len (notAllowed));
 		}
 	}
 }
@@ -1011,9 +1014,9 @@ static void menu_cb_CheckSpellingInInterval (EDITOR_ARGS) {
 static void menu_cb_AddToUserDictionary (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	if (my spellingChecker) {
-		autostring word = my text -> f_getSelection ();
+		autostring32 word = GuiText_getSelection (my text);
 		SpellingChecker_addNewWord (my spellingChecker, word.peek());
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	}
 }
 
@@ -1021,48 +1024,48 @@ static void menu_cb_AddToUserDictionary (EDITOR_ARGS) {
 
 static void menu_cb_RenameTier (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	EDITOR_FORM (L"Rename tier", 0)
-		SENTENCE (L"Name", L"");
+	EDITOR_FORM (U"Rename tier", 0)
+		SENTENCE (U"Name", U"");
 	EDITOR_OK
 		TextGrid grid = (TextGrid) my data;
-		checkTierSelection (me, L"rename a tier");
-		Data tier = (Data) grid -> tiers -> item [my selectedTier];
-		SET_STRING (L"Name", tier -> name ? tier -> name : L"")
+		checkTierSelection (me, U"rename a tier");
+		Daata tier = (Daata) grid -> tiers -> item [my selectedTier];
+		SET_STRING (U"Name", tier -> name ? tier -> name : U"")
 	EDITOR_DO
 		TextGrid grid = (TextGrid) my data;
-		checkTierSelection (me, L"rename a tier");
+		checkTierSelection (me, U"rename a tier");
 		Function tier = (Function) grid -> tiers -> item [my selectedTier];
 
-		Editor_save (me, L"Rename tier");
+		Editor_save (me, U"Rename tier");
 
-		wchar_t *newName = GET_STRING (L"Name");
+		char32 *newName = GET_STRING (U"Name");
 		Thing_setName (tier, newName);
 
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_PublishTier (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	TextGrid grid = (TextGrid) my data;
-	checkTierSelection (me, L"publish a tier");
+	checkTierSelection (me, U"publish a tier");
 	Function tier = (Function) grid -> tiers -> item [my selectedTier];
 	autoTextGrid publish = TextGrid_createWithoutTiers (1e30, -1e30);
-	TextGrid_addTier (publish.peek(), tier);
+	TextGrid_addTier_copy (publish.peek(), tier);
 	Thing_setName (publish.peek(), tier -> name);
-	my broadcastPublication (publish.transfer());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_RemoveAllTextFromTier (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	TextGrid grid = (TextGrid) my data;
-	checkTierSelection (me, L"remove all text from a tier");
+	checkTierSelection (me, U"remove all text from a tier");
 	IntervalTier intervalTier;
 	TextTier textTier;
 	_AnyTier_identifyClass ((Function) grid -> tiers -> item [my selectedTier], & intervalTier, & textTier);
 
-	Editor_save (me, L"Remove text from tier");
+	Editor_save (me, U"Remove text from tier");
 	if (intervalTier) {
 		IntervalTier_removeText (intervalTier);
 	} else {
@@ -1071,217 +1074,211 @@ static void menu_cb_RemoveAllTextFromTier (EDITOR_ARGS) {
 
 	FunctionEditor_updateText (me);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_RemoveTier (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
 	TextGrid grid = (TextGrid) my data;
 	if (grid -> tiers -> size <= 1) {
-		Melder_throw ("Sorry, I refuse to remove the last tier.");
+		Melder_throw (U"Sorry, I refuse to remove the last tier.");
 	}
-	checkTierSelection (me, L"remove a tier");
+	checkTierSelection (me, U"remove a tier");
 
-	Editor_save (me, L"Remove tier");
+	Editor_save (me, U"Remove tier");
 	Collection_removeItem (grid -> tiers, my selectedTier);
 
 	my selectedTier = 1;
 	FunctionEditor_updateText (me);
 	FunctionEditor_redraw (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_AddIntervalTier (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	EDITOR_FORM (L"Add interval tier", 0)
-		NATURAL (L"Position", L"1 (= at top)")
-		SENTENCE (L"Name", L"")
+	EDITOR_FORM (U"Add interval tier", 0)
+		NATURAL (U"Position", U"1 (= at top)")
+		SENTENCE (U"Name", U"")
 	EDITOR_OK
 		TextGrid grid = (TextGrid) my data;
-		static MelderString text = { 0 };
-		MelderString_empty (& text);
-		MelderString_append (& text, Melder_integer (grid -> tiers -> size + 1), L" (= at bottom)");
-		SET_STRING (L"Position", text.string)
-		SET_STRING (L"Name", L"")
+		SET_STRING (U"Position", Melder_cat (grid -> tiers -> size + 1, U" (= at bottom)"))
+		SET_STRING (U"Name", U"")
 	EDITOR_DO
 		TextGrid grid = (TextGrid) my data;
-		int position = GET_INTEGER (L"Position");
-		wchar_t *name = GET_STRING (L"Name");
+		int position = GET_INTEGER (U"Position");
+		char32 *name = GET_STRING (U"Name");
 		autoIntervalTier tier = IntervalTier_create (grid -> xmin, grid -> xmax);
 		if (position > grid -> tiers -> size) position = grid -> tiers -> size + 1;
 		Thing_setName (tier.peek(), name);
 
-		Editor_save (me, L"Add interval tier");
+		Editor_save (me, U"Add interval tier");
 		Ordered_addItemPos (grid -> tiers, tier.transfer(), position);
 
 		my selectedTier = position;
 		FunctionEditor_updateText (me);
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_AddPointTier (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	EDITOR_FORM (L"Add point tier", 0)
-		NATURAL (L"Position", L"1 (= at top)")
-		SENTENCE (L"Name", L"");
+	EDITOR_FORM (U"Add point tier", 0)
+		NATURAL (U"Position", U"1 (= at top)")
+		SENTENCE (U"Name", U"");
 	EDITOR_OK
 		TextGrid grid = (TextGrid) my data;
-		static MelderString text = { 0 };
-		MelderString_empty (& text);
-		MelderString_append (& text, Melder_integer (grid -> tiers -> size + 1), L" (= at bottom)");
-		SET_STRING (L"Position", text.string)
-		SET_STRING (L"Name", L"")
+		SET_STRING (U"Position", Melder_cat (grid -> tiers -> size + 1, U" (= at bottom)"))
+		SET_STRING (U"Name", U"")
 	EDITOR_DO
 		TextGrid grid = (TextGrid) my data;
-		int position = GET_INTEGER (L"Position");
-		wchar_t *name = GET_STRING (L"Name");
+		int position = GET_INTEGER (U"Position");
+		char32 *name = GET_STRING (U"Name");
 		autoTextTier tier = TextTier_create (grid -> xmin, grid -> xmax);
 		if (position > grid -> tiers -> size) position = grid -> tiers -> size + 1;
 		Thing_setName (tier.peek(), name);
 
-		Editor_save (me, L"Add point tier");
+		Editor_save (me, U"Add point tier");
 		Ordered_addItemPos (grid -> tiers, tier.transfer(), position);
 
 		my selectedTier = position;
 		FunctionEditor_updateText (me);
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_DuplicateTier (EDITOR_ARGS) {
 	EDITOR_IAM (TextGridEditor);
-	EDITOR_FORM (L"Duplicate tier", 0)
-		NATURAL (L"Position", L"1 (= at top)")
-		SENTENCE (L"Name", L"")
+	EDITOR_FORM (U"Duplicate tier", 0)
+		NATURAL (U"Position", U"1 (= at top)")
+		SENTENCE (U"Name", U"")
 	EDITOR_OK
 		TextGrid grid = (TextGrid) my data;
 		if (my selectedTier) {
-			SET_STRING (L"Position", Melder_integer (my selectedTier + 1))
-			SET_STRING (L"Name", ((AnyTier) grid -> tiers -> item [my selectedTier]) -> name)
+			SET_STRING (U"Position", Melder_integer (my selectedTier + 1))
+			SET_STRING (U"Name", ((AnyTier) grid -> tiers -> item [my selectedTier]) -> name)
 		}
 	EDITOR_DO
 		TextGrid grid = (TextGrid) my data;
-		int position = GET_INTEGER (L"Position");
-		wchar_t *name = GET_STRING (L"Name");
-		checkTierSelection (me, L"duplicate a tier");
+		int position = GET_INTEGER (U"Position");
+		char32 *name = GET_STRING (U"Name");
+		checkTierSelection (me, U"duplicate a tier");
 		AnyTier tier = (AnyTier) grid -> tiers -> item [my selectedTier];
 		autoAnyTier newTier = Data_copy (tier);
 		if (position > grid -> tiers -> size)
 			position = grid -> tiers -> size + 1;
 		Thing_setName (newTier.peek(), name);
 
-		Editor_save (me, L"Duplicate tier");
+		Editor_save (me, U"Duplicate tier");
 		Ordered_addItemPos (grid -> tiers, newTier.transfer(), position);
 
 		my selectedTier = position;
 		FunctionEditor_updateText (me);
 		FunctionEditor_redraw (me);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 /***** HELP MENU *****/
 
-static void menu_cb_TextGridEditorHelp (EDITOR_ARGS) { EDITOR_IAM (TextGridEditor); Melder_help (L"TextGridEditor"); }
-static void menu_cb_AboutSpecialSymbols (EDITOR_ARGS) { EDITOR_IAM (TextGridEditor); Melder_help (L"Special symbols"); }
-static void menu_cb_PhoneticSymbols (EDITOR_ARGS) { EDITOR_IAM (TextGridEditor); Melder_help (L"Phonetic symbols"); }
-static void menu_cb_AboutTextStyles (EDITOR_ARGS) { EDITOR_IAM (TextGridEditor); Melder_help (L"Text styles"); }
+static void menu_cb_TextGridEditorHelp (EDITOR_ARGS) { EDITOR_IAM (TextGridEditor); Melder_help (U"TextGridEditor"); }
+static void menu_cb_AboutSpecialSymbols (EDITOR_ARGS) { EDITOR_IAM (TextGridEditor); Melder_help (U"Special symbols"); }
+static void menu_cb_PhoneticSymbols (EDITOR_ARGS) { EDITOR_IAM (TextGridEditor); Melder_help (U"Phonetic symbols"); }
+static void menu_cb_AboutTextStyles (EDITOR_ARGS) { EDITOR_IAM (TextGridEditor); Melder_help (U"Text styles"); }
 
 void structTextGridEditor :: v_createMenus () {
 	TextGridEditor_Parent :: v_createMenus ();
 	EditorMenu menu;
 
 	#ifndef macintosh
-		Editor_addCommand (this, L"Edit", L"-- cut copy paste --", 0, NULL);
-		Editor_addCommand (this, L"Edit", L"Cut text", 'X', menu_cb_Cut);
-		Editor_addCommand (this, L"Edit", L"Cut", Editor_HIDDEN, menu_cb_Cut);
-		Editor_addCommand (this, L"Edit", L"Copy text", 'C', menu_cb_Copy);
-		Editor_addCommand (this, L"Edit", L"Copy", Editor_HIDDEN, menu_cb_Copy);
-		Editor_addCommand (this, L"Edit", L"Paste text", 'V', menu_cb_Paste);
-		Editor_addCommand (this, L"Edit", L"Paste", Editor_HIDDEN, menu_cb_Paste);
-		Editor_addCommand (this, L"Edit", L"Erase text", 0, menu_cb_Erase);
-		Editor_addCommand (this, L"Edit", L"Erase", Editor_HIDDEN, menu_cb_Erase);
+		Editor_addCommand (this, U"Edit", U"-- cut copy paste --", 0, NULL);
+		Editor_addCommand (this, U"Edit", U"Cut text", 'X', menu_cb_Cut);
+		Editor_addCommand (this, U"Edit", U"Cut", Editor_HIDDEN, menu_cb_Cut);
+		Editor_addCommand (this, U"Edit", U"Copy text", 'C', menu_cb_Copy);
+		Editor_addCommand (this, U"Edit", U"Copy", Editor_HIDDEN, menu_cb_Copy);
+		Editor_addCommand (this, U"Edit", U"Paste text", 'V', menu_cb_Paste);
+		Editor_addCommand (this, U"Edit", U"Paste", Editor_HIDDEN, menu_cb_Paste);
+		Editor_addCommand (this, U"Edit", U"Erase text", 0, menu_cb_Erase);
+		Editor_addCommand (this, U"Edit", U"Erase", Editor_HIDDEN, menu_cb_Erase);
 	#endif
-	Editor_addCommand (this, L"Edit", L"-- encoding --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Convert entire TextGrid to backslash trigraphs", 0, menu_cb_Genericize);
-	Editor_addCommand (this, L"Edit", L"Genericize entire TextGrid", Editor_HIDDEN, menu_cb_Genericize);
-	Editor_addCommand (this, L"Edit", L"Genericize", Editor_HIDDEN, menu_cb_Genericize);
-	Editor_addCommand (this, L"Edit", L"Convert entire TextGrid to Unicode", 0, menu_cb_Nativize);
-	Editor_addCommand (this, L"Edit", L"Nativize entire TextGrid", Editor_HIDDEN, menu_cb_Nativize);
-	Editor_addCommand (this, L"Edit", L"Nativize", Editor_HIDDEN, menu_cb_Nativize);
-	Editor_addCommand (this, L"Edit", L"-- search --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Find...", 'F', menu_cb_Find);
-	Editor_addCommand (this, L"Edit", L"Find again", 'G', menu_cb_FindAgain);
+	Editor_addCommand (this, U"Edit", U"-- encoding --", 0, NULL);
+	Editor_addCommand (this, U"Edit", U"Convert entire TextGrid to backslash trigraphs", 0, menu_cb_Genericize);
+	Editor_addCommand (this, U"Edit", U"Genericize entire TextGrid", Editor_HIDDEN, menu_cb_Genericize);
+	Editor_addCommand (this, U"Edit", U"Genericize", Editor_HIDDEN, menu_cb_Genericize);
+	Editor_addCommand (this, U"Edit", U"Convert entire TextGrid to Unicode", 0, menu_cb_Nativize);
+	Editor_addCommand (this, U"Edit", U"Nativize entire TextGrid", Editor_HIDDEN, menu_cb_Nativize);
+	Editor_addCommand (this, U"Edit", U"Nativize", Editor_HIDDEN, menu_cb_Nativize);
+	Editor_addCommand (this, U"Edit", U"-- search --", 0, NULL);
+	Editor_addCommand (this, U"Edit", U"Find...", 'F', menu_cb_Find);
+	Editor_addCommand (this, U"Edit", U"Find again", 'G', menu_cb_FindAgain);
 
 	if (d_sound.data) {
-		Editor_addCommand (this, L"Select", L"-- move to zero --", 0, 0);
-		Editor_addCommand (this, L"Select", L"Move start of selection to nearest zero crossing", ',', menu_cb_MoveBtoZero);
-		Editor_addCommand (this, L"Select", L"Move begin of selection to nearest zero crossing", Editor_HIDDEN, menu_cb_MoveBtoZero);
-		Editor_addCommand (this, L"Select", L"Move cursor to nearest zero crossing", '0', menu_cb_MoveCursorToZero);
-		Editor_addCommand (this, L"Select", L"Move end of selection to nearest zero crossing", '.', menu_cb_MoveEtoZero);
+		Editor_addCommand (this, U"Select", U"-- move to zero --", 0, 0);
+		Editor_addCommand (this, U"Select", U"Move start of selection to nearest zero crossing", ',', menu_cb_MoveBtoZero);
+		Editor_addCommand (this, U"Select", U"Move begin of selection to nearest zero crossing", Editor_HIDDEN, menu_cb_MoveBtoZero);
+		Editor_addCommand (this, U"Select", U"Move cursor to nearest zero crossing", '0', menu_cb_MoveCursorToZero);
+		Editor_addCommand (this, U"Select", U"Move end of selection to nearest zero crossing", '.', menu_cb_MoveEtoZero);
 	}
 
-	Editor_addCommand (this, L"Query", L"-- query interval --", 0, NULL);
-	Editor_addCommand (this, L"Query", L"Get starting point of interval", 0, menu_cb_GetStartingPointOfInterval);
-	Editor_addCommand (this, L"Query", L"Get end point of interval", 0, menu_cb_GetEndPointOfInterval);
-	Editor_addCommand (this, L"Query", L"Get label of interval", 0, menu_cb_GetLabelOfInterval);
+	Editor_addCommand (this, U"Query", U"-- query interval --", 0, NULL);
+	Editor_addCommand (this, U"Query", U"Get starting point of interval", 0, menu_cb_GetStartingPointOfInterval);
+	Editor_addCommand (this, U"Query", U"Get end point of interval", 0, menu_cb_GetEndPointOfInterval);
+	Editor_addCommand (this, U"Query", U"Get label of interval", 0, menu_cb_GetLabelOfInterval);
 
-	menu = Editor_addMenu (this, L"Interval", 0);
+	menu = Editor_addMenu (this, U"Interval", 0);
 	if (d_sound.data || d_longSound.data) {
-		EditorMenu_addCommand (menu, L"Align interval", 'D', menu_cb_AlignInterval);
-		EditorMenu_addCommand (menu, L"Alignment settings...", 0, menu_cb_AlignmentSettings);
-		EditorMenu_addCommand (menu, L"-- add interval --", 0, NULL);
-	}
-	EditorMenu_addCommand (menu, L"Add interval on tier 1", GuiMenu_COMMAND | '1', menu_cb_InsertIntervalOnTier1);
-	EditorMenu_addCommand (menu, L"Add interval on tier 2", GuiMenu_COMMAND | '2', menu_cb_InsertIntervalOnTier2);
-	EditorMenu_addCommand (menu, L"Add interval on tier 3", GuiMenu_COMMAND | '3', menu_cb_InsertIntervalOnTier3);
-	EditorMenu_addCommand (menu, L"Add interval on tier 4", GuiMenu_COMMAND | '4', menu_cb_InsertIntervalOnTier4);
-	EditorMenu_addCommand (menu, L"Add interval on tier 5", GuiMenu_COMMAND | '5', menu_cb_InsertIntervalOnTier5);
-	EditorMenu_addCommand (menu, L"Add interval on tier 6", GuiMenu_COMMAND | '6', menu_cb_InsertIntervalOnTier6);
-	EditorMenu_addCommand (menu, L"Add interval on tier 7", GuiMenu_COMMAND | '7', menu_cb_InsertIntervalOnTier7);
-	EditorMenu_addCommand (menu, L"Add interval on tier 8", GuiMenu_COMMAND | '8', menu_cb_InsertIntervalOnTier8);
-
-	menu = Editor_addMenu (this, L"Boundary", 0);
-	/*EditorMenu_addCommand (menu, L"Move to B", 0, menu_cb_MoveToB);
-	EditorMenu_addCommand (menu, L"Move to E", 0, menu_cb_MoveToE);*/
+		EditorMenu_addCommand (menu, U"Align interval", 'D', menu_cb_AlignInterval);
+		EditorMenu_addCommand (menu, U"Alignment settings...", 0, menu_cb_AlignmentSettings);
+		EditorMenu_addCommand (menu, U"-- add interval --", 0, NULL);
+	}
+	EditorMenu_addCommand (menu, U"Add interval on tier 1", GuiMenu_COMMAND | '1', menu_cb_InsertIntervalOnTier1);
+	EditorMenu_addCommand (menu, U"Add interval on tier 2", GuiMenu_COMMAND | '2', menu_cb_InsertIntervalOnTier2);
+	EditorMenu_addCommand (menu, U"Add interval on tier 3", GuiMenu_COMMAND | '3', menu_cb_InsertIntervalOnTier3);
+	EditorMenu_addCommand (menu, U"Add interval on tier 4", GuiMenu_COMMAND | '4', menu_cb_InsertIntervalOnTier4);
+	EditorMenu_addCommand (menu, U"Add interval on tier 5", GuiMenu_COMMAND | '5', menu_cb_InsertIntervalOnTier5);
+	EditorMenu_addCommand (menu, U"Add interval on tier 6", GuiMenu_COMMAND | '6', menu_cb_InsertIntervalOnTier6);
+	EditorMenu_addCommand (menu, U"Add interval on tier 7", GuiMenu_COMMAND | '7', menu_cb_InsertIntervalOnTier7);
+	EditorMenu_addCommand (menu, U"Add interval on tier 8", GuiMenu_COMMAND | '8', menu_cb_InsertIntervalOnTier8);
+
+	menu = Editor_addMenu (this, U"Boundary", 0);
+	/*EditorMenu_addCommand (menu, U"Move to B", 0, menu_cb_MoveToB);
+	EditorMenu_addCommand (menu, U"Move to E", 0, menu_cb_MoveToE);*/
 	if (d_sound.data) {
-		EditorMenu_addCommand (menu, L"Move to nearest zero crossing", 0, menu_cb_MoveToZero);
-		EditorMenu_addCommand (menu, L"-- insert boundary --", 0, NULL);
-	}
-	EditorMenu_addCommand (menu, L"Add on selected tier", GuiMenu_ENTER, menu_cb_InsertOnSelectedTier);
-	EditorMenu_addCommand (menu, L"Add on tier 1", GuiMenu_COMMAND | GuiMenu_F1, menu_cb_InsertOnTier1);
-	EditorMenu_addCommand (menu, L"Add on tier 2", GuiMenu_COMMAND | GuiMenu_F2, menu_cb_InsertOnTier2);
-	EditorMenu_addCommand (menu, L"Add on tier 3", GuiMenu_COMMAND | GuiMenu_F3, menu_cb_InsertOnTier3);
-	EditorMenu_addCommand (menu, L"Add on tier 4", GuiMenu_COMMAND | GuiMenu_F4, menu_cb_InsertOnTier4);
-	EditorMenu_addCommand (menu, L"Add on tier 5", GuiMenu_COMMAND | GuiMenu_F5, menu_cb_InsertOnTier5);
-	EditorMenu_addCommand (menu, L"Add on tier 6", GuiMenu_COMMAND | GuiMenu_F6, menu_cb_InsertOnTier6);
-	EditorMenu_addCommand (menu, L"Add on tier 7", GuiMenu_COMMAND | GuiMenu_F7, menu_cb_InsertOnTier7);
-	EditorMenu_addCommand (menu, L"Add on tier 8", GuiMenu_COMMAND | GuiMenu_F8, menu_cb_InsertOnTier8);
-	EditorMenu_addCommand (menu, L"Add on all tiers", GuiMenu_COMMAND | GuiMenu_F9, menu_cb_InsertOnAllTiers);
-	EditorMenu_addCommand (menu, L"-- remove mark --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Remove", GuiMenu_OPTION | GuiMenu_BACKSPACE, menu_cb_RemovePointOrBoundary);
-
-	menu = Editor_addMenu (this, L"Tier", 0);
-	EditorMenu_addCommand (menu, L"Add interval tier...", 0, menu_cb_AddIntervalTier);
-	EditorMenu_addCommand (menu, L"Add point tier...", 0, menu_cb_AddPointTier);
-	EditorMenu_addCommand (menu, L"Duplicate tier...", 0, menu_cb_DuplicateTier);
-	EditorMenu_addCommand (menu, L"Rename tier...", 0, menu_cb_RenameTier);
-	EditorMenu_addCommand (menu, L"-- remove tier --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Remove all text from tier", 0, menu_cb_RemoveAllTextFromTier);
-	EditorMenu_addCommand (menu, L"Remove entire tier", 0, menu_cb_RemoveTier);
-	EditorMenu_addCommand (menu, L"-- extract tier --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Extract to list of objects:", GuiMenu_INSENSITIVE, menu_cb_PublishTier /* dummy */);
-	EditorMenu_addCommand (menu, L"Extract entire selected tier", 0, menu_cb_PublishTier);
+		EditorMenu_addCommand (menu, U"Move to nearest zero crossing", 0, menu_cb_MoveToZero);
+		EditorMenu_addCommand (menu, U"-- insert boundary --", 0, NULL);
+	}
+	EditorMenu_addCommand (menu, U"Add on selected tier", GuiMenu_ENTER, menu_cb_InsertOnSelectedTier);
+	EditorMenu_addCommand (menu, U"Add on tier 1", GuiMenu_COMMAND | GuiMenu_F1, menu_cb_InsertOnTier1);
+	EditorMenu_addCommand (menu, U"Add on tier 2", GuiMenu_COMMAND | GuiMenu_F2, menu_cb_InsertOnTier2);
+	EditorMenu_addCommand (menu, U"Add on tier 3", GuiMenu_COMMAND | GuiMenu_F3, menu_cb_InsertOnTier3);
+	EditorMenu_addCommand (menu, U"Add on tier 4", GuiMenu_COMMAND | GuiMenu_F4, menu_cb_InsertOnTier4);
+	EditorMenu_addCommand (menu, U"Add on tier 5", GuiMenu_COMMAND | GuiMenu_F5, menu_cb_InsertOnTier5);
+	EditorMenu_addCommand (menu, U"Add on tier 6", GuiMenu_COMMAND | GuiMenu_F6, menu_cb_InsertOnTier6);
+	EditorMenu_addCommand (menu, U"Add on tier 7", GuiMenu_COMMAND | GuiMenu_F7, menu_cb_InsertOnTier7);
+	EditorMenu_addCommand (menu, U"Add on tier 8", GuiMenu_COMMAND | GuiMenu_F8, menu_cb_InsertOnTier8);
+	EditorMenu_addCommand (menu, U"Add on all tiers", GuiMenu_COMMAND | GuiMenu_F9, menu_cb_InsertOnAllTiers);
+	EditorMenu_addCommand (menu, U"-- remove mark --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Remove", GuiMenu_OPTION | GuiMenu_BACKSPACE, menu_cb_RemovePointOrBoundary);
+
+	menu = Editor_addMenu (this, U"Tier", 0);
+	EditorMenu_addCommand (menu, U"Add interval tier...", 0, menu_cb_AddIntervalTier);
+	EditorMenu_addCommand (menu, U"Add point tier...", 0, menu_cb_AddPointTier);
+	EditorMenu_addCommand (menu, U"Duplicate tier...", 0, menu_cb_DuplicateTier);
+	EditorMenu_addCommand (menu, U"Rename tier...", 0, menu_cb_RenameTier);
+	EditorMenu_addCommand (menu, U"-- remove tier --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Remove all text from tier", 0, menu_cb_RemoveAllTextFromTier);
+	EditorMenu_addCommand (menu, U"Remove entire tier", 0, menu_cb_RemoveTier);
+	EditorMenu_addCommand (menu, U"-- extract tier --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Extract to list of objects:", GuiMenu_INSENSITIVE, menu_cb_PublishTier /* dummy */);
+	EditorMenu_addCommand (menu, U"Extract entire selected tier", 0, menu_cb_PublishTier);
 
 	if (spellingChecker) {
-		menu = Editor_addMenu (this, L"Spell", 0);
-		EditorMenu_addCommand (menu, L"Check spelling in tier", GuiMenu_COMMAND | GuiMenu_OPTION | 'L', menu_cb_CheckSpelling);
-		EditorMenu_addCommand (menu, L"Check spelling in interval", 0, menu_cb_CheckSpellingInInterval);
-		EditorMenu_addCommand (menu, L"-- edit lexicon --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Add selected word to user dictionary", 0, menu_cb_AddToUserDictionary);
+		menu = Editor_addMenu (this, U"Spell", 0);
+		EditorMenu_addCommand (menu, U"Check spelling in tier", GuiMenu_COMMAND | GuiMenu_OPTION | 'L', menu_cb_CheckSpelling);
+		EditorMenu_addCommand (menu, U"Check spelling in interval", 0, menu_cb_CheckSpellingInInterval);
+		EditorMenu_addCommand (menu, U"-- edit lexicon --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Add selected word to user dictionary", 0, menu_cb_AddToUserDictionary);
 	}
 
 	if (d_sound.data || d_longSound.data) {
@@ -1293,10 +1290,10 @@ void structTextGridEditor :: v_createMenus () {
 
 void structTextGridEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	TextGridEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"TextGridEditor help", '?', menu_cb_TextGridEditorHelp);
-	EditorMenu_addCommand (menu, L"About special symbols", 0, menu_cb_AboutSpecialSymbols);
-	EditorMenu_addCommand (menu, L"Phonetic symbols", 0, menu_cb_PhoneticSymbols);
-	EditorMenu_addCommand (menu, L"About text styles", 0, menu_cb_AboutTextStyles);
+	EditorMenu_addCommand (menu, U"TextGridEditor help", '?', menu_cb_TextGridEditorHelp);
+	EditorMenu_addCommand (menu, U"About special symbols", 0, menu_cb_AboutSpecialSymbols);
+	EditorMenu_addCommand (menu, U"Phonetic symbols", 0, menu_cb_PhoneticSymbols);
+	EditorMenu_addCommand (menu, U"About text styles", 0, menu_cb_AboutTextStyles);
 }
 
 /***** CHILDREN *****/
@@ -1305,11 +1302,11 @@ static void gui_text_cb_change (I, GuiTextEvent event) {
 	iam (TextGridEditor);
 	(void) event;
 	TextGrid grid = (TextGrid) my data;
-	//Melder_casual ("gui_text_cb_change 1 in editor %ld", me);
+	//Melder_casual (U"gui_text_cb_change 1 in editor ", Melder_pointer (me));
 	if (my suppressRedraw) return;   /* Prevent infinite loop if 'draw' method or Editor_broadcastChange calls GuiText_setString. */
-	//Melder_casual ("gui_text_cb_change 2 in editor %ld", me);
+	//Melder_casual (U"gui_text_cb_change 2 in editor ", me);
 	if (my selectedTier) {
-		wchar_t *text = my text -> f_getString ();
+		char32 *text = GuiText_getString (my text);
 		IntervalTier intervalTier;
 		TextTier textTier;
 		_AnyTier_identifyClass ((Function) grid -> tiers -> item [my selectedTier], & intervalTier, & textTier);
@@ -1317,23 +1314,23 @@ static void gui_text_cb_change (I, GuiTextEvent event) {
 			long selectedInterval = getSelectedInterval (me);
 			if (selectedInterval) {
 				TextInterval interval = (TextInterval) intervalTier -> intervals -> item [selectedInterval];
-				//Melder_casual ("gui_text_cb_change 3 in editor %ld", me);
+				//Melder_casual (U"gui_text_cb_change 3 in editor ", Melder_pointer (me));
 				TextInterval_setText (interval, text);
-				//Melder_casual ("gui_text_cb_change 4 in editor %ld", me);
+				//Melder_casual (U"gui_text_cb_change 4 in editor ", Melder_pointer (me));
 				FunctionEditor_redraw (me);
-				//Melder_casual ("gui_text_cb_change 5 in editor %ld", me);
-				my broadcastDataChanged ();
-				//Melder_casual ("gui_text_cb_change 6 in editor %ld", me);
+				//Melder_casual (U"gui_text_cb_change 5 in editor ", Melder_pointer (me));
+				Editor_broadcastDataChanged (me);
+				//Melder_casual (U"gui_text_cb_change 6 in editor ", Melder_pointer (me));
 			}
 		} else {
 			long selectedPoint = getSelectedPoint (me);
 			if (selectedPoint) {
 				TextPoint point = (TextPoint) textTier -> points -> item [selectedPoint];
 				Melder_free (point -> mark);
-				if (wcsspn (text, L" \n\t") != wcslen (text))   // any visible characters?
-				point -> mark = Melder_wcsdup_f (text);
+				if (str32spn (text, U" \n\t") != str32len (text))   // any visible characters?
+				point -> mark = Melder_dup_f (text);
 				FunctionEditor_redraw (me);
-				my broadcastDataChanged ();
+				Editor_broadcastDataChanged (me);
 			}
 		}
 		Melder_free (text);
@@ -1342,7 +1339,7 @@ static void gui_text_cb_change (I, GuiTextEvent event) {
 
 void structTextGridEditor :: v_createChildren () {
 	TextGridEditor_Parent :: v_createChildren ();
-	if (text) text -> f_setChangeCallback (gui_text_cb_change, this);
+	if (text) GuiText_setChangeCallback (text, gui_text_cb_change, this);
 }
 
 void structTextGridEditor :: v_dataChanged () {
@@ -1418,10 +1415,10 @@ static void do_drawIntervalTier (TextGridEditor me, IntervalTier tier, int itier
 	 * Draw a grey bar and a selection button at the cursor position.
 	 */
 	if (my d_startSelection == my d_endSelection && my d_startSelection >= my d_startWindow && my d_startSelection <= my d_endWindow) {
-		int cursorAtBoundary = FALSE;
+		bool cursorAtBoundary = false;
 		for (iinterval = 2; iinterval <= ninterval; iinterval ++) {
 			TextInterval interval = (TextInterval) tier -> intervals -> item [iinterval];
-			if (interval -> xmin == my d_startSelection) cursorAtBoundary = TRUE;
+			if (interval -> xmin == my d_startSelection) cursorAtBoundary = true;
 		}
 		if (! cursorAtBoundary) {
 			double dy = Graphics_dyMMtoWC (my d_graphics, 1.5);
@@ -1474,10 +1471,10 @@ static void do_drawIntervalTier (TextGridEditor me, IntervalTier tier, int itier
 		}
 
 	}
-	Graphics_setPercentSignIsItalic (my d_graphics, TRUE);
-	Graphics_setNumberSignIsBold (my d_graphics, TRUE);
-	Graphics_setCircumflexIsSuperscript (my d_graphics, TRUE);
-	Graphics_setUnderscoreIsSubscript (my d_graphics, TRUE);
+	Graphics_setPercentSignIsItalic (my d_graphics, true);
+	Graphics_setNumberSignIsBold (my d_graphics, true);
+	Graphics_setCircumflexIsSuperscript (my d_graphics, true);
+	Graphics_setUnderscoreIsSubscript (my d_graphics, true);
 }
 
 static void do_drawTextTier (TextGridEditor me, TextTier tier, int itier) {
@@ -1496,10 +1493,10 @@ static void do_drawTextTier (TextGridEditor me, TextTier tier, int itier) {
 	 * Draw a grey bar and a selection button at the cursor position.
 	 */
 	if (my d_startSelection == my d_endSelection && my d_startSelection >= my d_startWindow && my d_startSelection <= my d_endWindow) {
-		int cursorAtPoint = FALSE;
+		bool cursorAtPoint = false;
 		for (ipoint = 1; ipoint <= npoint; ipoint ++) {
 			TextPoint point = (TextPoint) tier -> points -> item [ipoint];
-			if (point -> number == my d_startSelection) cursorAtPoint = TRUE;
+			if (point -> number == my d_startSelection) cursorAtPoint = true;
 		}
 		if (! cursorAtPoint) {
 			double dy = Graphics_dyMMtoWC (my d_graphics, 1.5);
@@ -1543,10 +1540,10 @@ static void do_drawTextTier (TextGridEditor me, TextTier tier, int itier) {
 			if (point -> mark) Graphics_text (my d_graphics, t, 0.5, point -> mark);
 		}
 	}
-	Graphics_setPercentSignIsItalic (my d_graphics, TRUE);
-	Graphics_setNumberSignIsBold (my d_graphics, TRUE);
-	Graphics_setCircumflexIsSuperscript (my d_graphics, TRUE);
-	Graphics_setUnderscoreIsSubscript (my d_graphics, TRUE);
+	Graphics_setPercentSignIsItalic (my d_graphics, true);
+	Graphics_setNumberSignIsBold (my d_graphics, true);
+	Graphics_setCircumflexIsSuperscript (my d_graphics, true);
+	Graphics_setUnderscoreIsSubscript (my d_graphics, true);
 }
 
 void structTextGridEditor :: v_draw () {
@@ -1598,7 +1595,7 @@ void structTextGridEditor :: v_draw () {
 		Graphics_setFont (d_graphics, oldFont);
 		Graphics_setFontSize (d_graphics, 14);
 		Graphics_setTextAlignment (d_graphics, Graphics_RIGHT, Graphics_HALF);
-		Graphics_text2 (d_graphics, d_startWindow, 0.5, tierIsSelected ? L"☞ " : L"", Melder_integer (itier));
+		Graphics_text (d_graphics, d_startWindow, 0.5,   tierIsSelected ? U"☞ " : U"", itier);
 		Graphics_setFontSize (d_graphics, oldFontSize);
 		if (anyTier -> name && anyTier -> name [0]) {
 			Graphics_setTextAlignment (d_graphics, Graphics_LEFT,
@@ -1611,9 +1608,9 @@ void structTextGridEditor :: v_draw () {
 				long count = isIntervalTier ? ((IntervalTier) anyTier) -> intervals -> size : ((TextTier) anyTier) -> points -> size;
 				long position = itier == selectedTier ? ( isIntervalTier ? getSelectedInterval (this) : getSelectedPoint (this) ) : 0;
 				if (position) {
-					Graphics_text5 (d_graphics, d_endWindow, 0.5, L"(", Melder_integer (position), L"/", Melder_integer (count), L")");
+					Graphics_text (d_graphics, d_endWindow, 0.5,   U"(", position, U"/", count, U")");
 				} else {
-					Graphics_text3 (d_graphics, d_endWindow, 0.5, L"(", Melder_integer (count), L")");
+					Graphics_text (d_graphics, d_endWindow, 0.5,   U"(", count, U")");
 				}
 			} else {
 				Melder_assert (kTextGridEditor_showNumberOf_NONEMPTY_INTERVALS_OR_POINTS);
@@ -1637,7 +1634,7 @@ void structTextGridEditor :: v_draw () {
 						}
 					}
 				}
-				Graphics_text3 (d_graphics, d_endWindow, 0.5, L"(##", Melder_integer (count), L"#)");
+				Graphics_text (d_graphics, d_endWindow, 0.5,   U"(##", count, U"#)");
 			}
 		}
 
@@ -1686,32 +1683,32 @@ void structTextGridEditor :: v_draw () {
 	v_updateMenuItems_file ();
 }
 
-static void do_drawWhileDragging (TextGridEditor me, double numberOfTiers, int *selectedTier, double x, double soundY) {
+static void do_drawWhileDragging (TextGridEditor me, double numberOfTiers, bool selectedTier [], double x, double soundY) {
 	long itier;
 	for (itier = 1; itier <= numberOfTiers; itier ++) if (selectedTier [itier]) {
 		double ymin = soundY * (1.0 - (double) itier / numberOfTiers);
 		double ymax = soundY * (1.0 - (double) (itier - 1) / numberOfTiers);
-		Graphics_setLineWidth (my d_graphics, 7);
+		Graphics_setLineWidth (my d_graphics, 7.0);
 		Graphics_line (my d_graphics, x, ymin, x, ymax);
 	}
 	Graphics_setLineWidth (my d_graphics, 1);
-	Graphics_line (my d_graphics, x, 0, x, 1.01);
-	Graphics_text1 (my d_graphics, x, 1.01, Melder_fixed (x, 6));
+	Graphics_line (my d_graphics, x, 0.0, x, 1.01);
+	Graphics_text (my d_graphics, x, 1.01, Melder_fixed (x, 6));
 }
 
 static void do_dragBoundary (TextGridEditor me, double xbegin, int iClickedTier, int shiftKeyPressed) {
 	TextGrid grid = (TextGrid) my data;
-	int itier, numberOfTiers = grid -> tiers -> size, itierDrop;
+	int numberOfTiers = grid -> tiers -> size, itierDrop;
 	double xWC = xbegin, yWC;
 	double leftDraggingBoundary = my tmin, rightDraggingBoundary = my tmax;   // initial dragging range
-	int selectedTier [100];
+	bool selectedTier [1000];
 	double soundY = _TextGridEditor_computeSoundY (me);
 
 	/*
 	 * Determine the set of selected boundaries and points, and the dragging range.
 	 */
-	for (itier = 1; itier <= numberOfTiers; itier ++) {
-		selectedTier [itier] = FALSE;   /* The default. */
+	for (int itier = 1; itier <= numberOfTiers; itier ++) {
+		selectedTier [itier] = false;   // the default
 		/*
 		 * If she has pressed the shift key, let her drag all the boundaries and points at this time.
 		 * Otherwise, let her only drag the boundary or point on the clicked tier.
@@ -1725,7 +1722,7 @@ static void do_dragBoundary (TextGridEditor me, double xbegin, int iClickedTier,
 				if (ibound) {
 					TextInterval leftInterval = (TextInterval) intervalTier -> intervals -> item [ibound - 1];
 					TextInterval rightInterval = (TextInterval) intervalTier -> intervals -> item [ibound];
-					selectedTier [itier] = TRUE;
+					selectedTier [itier] = true;
 					/*
 					 * Prevent her to drag the boundary past its left or right neighbours on the same tier.
 					 */
@@ -1742,7 +1739,7 @@ static void do_dragBoundary (TextGridEditor me, double xbegin, int iClickedTier,
 					 * Other than with boundaries on interval tiers,
 					 * points on text tiers can be dragged past their neighbours.
 					 */
-					selectedTier [itier] = TRUE;
+					selectedTier [itier] = true;
 				}
 			}
 		}
@@ -1821,9 +1818,9 @@ static void do_dragBoundary (TextGridEditor me, double xbegin, int iClickedTier,
 		return;
 	}
 
-	Editor_save (me, L"Drag");
+	Editor_save (me, U"Drag");
 
-	for (itier = 1; itier <= numberOfTiers; itier ++) if (selectedTier [itier]) {
+	for (int itier = 1; itier <= numberOfTiers; itier ++) if (selectedTier [itier]) {
 		IntervalTier intervalTier;
 		TextTier textTier;
 		_AnyTier_identifyClass ((Function) grid -> tiers -> item [itier], & intervalTier, & textTier);
@@ -1842,7 +1839,7 @@ static void do_dragBoundary (TextGridEditor me, double xbegin, int iClickedTier,
 			if (iDraggedPoint) {
 				long dropSiteHasPoint = AnyTier_hasPoint (textTier, xWC);
 				if (dropSiteHasPoint) {
-					Melder_warning (L"Cannot drop point on an existing point.");
+					Melder_warning (U"Cannot drop point on an existing point.");
 				} else {
 					TextPoint point = (TextPoint) textTier -> points -> item [iDraggedPoint];
 					/*
@@ -1870,14 +1867,15 @@ static void do_dragBoundary (TextGridEditor me, double xbegin, int iClickedTier,
 		my d_endSelection = dummy;
 	}
 	FunctionEditor_marksChanged (me, true);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 int structTextGridEditor :: v_click (double xclick, double yWC, bool shiftKeyPressed) {
 	TextGrid grid = (TextGrid) our data;
 	double tmin, tmax, x, y;
 	long ntiers = grid -> tiers -> size, iClickedTier, iClickedInterval, iClickedPoint;
-	int clickedLeftBoundary = 0, nearBoundaryOrPoint, nearCursorCircle, drag = FALSE;
+	int clickedLeftBoundary = 0;
+	bool nearBoundaryOrPoint, nearCursorCircle, drag = false;
 	IntervalTier intervalTier;
 	TextTier textTier;
 	TextInterval interval = NULL;
@@ -1947,9 +1945,9 @@ int structTextGridEditor :: v_click (double xclick, double yWC, bool shiftKeyPre
 	/*
 	 * Where did she click?
 	 */
-	nearBoundaryOrPoint = tnear != NUMundefined && fabs (Graphics_dxWCtoMM (our d_graphics, xclick - tnear)) < 1.5;
-	nearCursorCircle = our d_startSelection == our d_endSelection && Graphics_distanceWCtoMM (our d_graphics, xclick, yWC,
-		our d_startSelection, (ntiers + 1 - iClickedTier) * soundY / ntiers - Graphics_dyMMtoWC (our d_graphics, 1.5)) < 1.5;
+	nearBoundaryOrPoint = ( tnear != NUMundefined && fabs (Graphics_dxWCtoMM (our d_graphics, xclick - tnear)) < 1.5 );
+	nearCursorCircle = ( our d_startSelection == our d_endSelection && Graphics_distanceWCtoMM (our d_graphics, xclick, yWC,
+		our d_startSelection, (ntiers + 1 - iClickedTier) * soundY / ntiers - Graphics_dyMMtoWC (our d_graphics, 1.5)) < 1.5 );
 
 	/*
 	 * Find out whether this is a click or a drag.
@@ -1959,7 +1957,7 @@ int structTextGridEditor :: v_click (double xclick, double yWC, bool shiftKeyPre
 		if (x < our d_startWindow) x = our d_startWindow;
 		if (x > our d_endWindow) x = our d_endWindow;
 		if (fabs (Graphics_dxWCtoMM (our d_graphics, x - xclick)) > 1.5) {
-			drag = TRUE;
+			drag = true;
 			break;
 		}
 	}
@@ -2005,7 +2003,7 @@ int structTextGridEditor :: v_click (double xclick, double yWC, bool shiftKeyPre
 		insertBoundaryOrPoint (this, iClickedTier, our d_startSelection, our d_startSelection, false);
 		our selectedTier = iClickedTier;
 		FunctionEditor_marksChanged (this, true);
-		our broadcastDataChanged ();
+		Editor_broadcastDataChanged (this);
 		if (drag) Graphics_waitMouseUp (our d_graphics);
 		return FunctionEditor_NO_UPDATE_NEEDED;
 	} else {
@@ -2080,8 +2078,8 @@ void structTextGridEditor :: v_play (double tmin, double tmax) {
 
 void structTextGridEditor :: v_updateText () {
 	TextGrid grid = (TextGrid) our data;
-	const wchar_t *newText = L"";
-	trace ("selected tier %ld", our selectedTier);
+	const char32 *newText = U"";
+	trace (U"selected tier ", our selectedTier);
 	if (our selectedTier) {
 		IntervalTier intervalTier;
 		TextTier textTier;
@@ -2106,57 +2104,57 @@ void structTextGridEditor :: v_updateText () {
 	}
 	//Melder_casual ("v_updateText in editor %ld %ls %d", this, name, (int) suppressRedraw);
 	if (our text) {
-		our suppressRedraw = TRUE;   // prevent valueChangedCallback from redrawing
-		trace ("setting new text %ls", newText);
-		text -> f_setString (newText);
-		long cursor = wcslen (newText);   // at end
-		text -> f_setSelection (cursor, cursor);
-		our suppressRedraw = FALSE;
+		our suppressRedraw = true;   // prevent valueChangedCallback from redrawing
+		trace (U"setting new text ", newText);
+		GuiText_setString (text, newText);
+		long cursor = str32len (newText);   // at end
+		GuiText_setSelection (text, cursor, cursor);
+		our suppressRedraw = false;
 	}
 }
 
 void structTextGridEditor :: v_prefs_addFields (EditorCommand cmd) {
 	Any radio;
-	NATURAL (L"Font size (points)", default_fontSize ())
-	OPTIONMENU_ENUM (L"Text alignment in intervals", kGraphics_horizontalAlignment, kGraphics_horizontalAlignment_DEFAULT)
-	OPTIONMENU (L"The symbols %#_^ in labels", default_useTextStyles () + 1)
-		OPTION (L"are shown as typed")
-		OPTION (L"mean italic/bold/sub/super")
-	OPTIONMENU (L"With the shift key, you drag", default_shiftDragMultiple () + 1)
-		OPTION (L"a single boundary")
-		OPTION (L"multiple boundaries")
-	OPTIONMENU_ENUM (L"Show number of", kTextGridEditor_showNumberOf, kTextGridEditor_showNumberOf_DEFAULT)
-	OPTIONMENU_ENUM (L"Paint intervals green whose label...", kMelder_string, kMelder_string_DEFAULT)
-	SENTENCE (L"...the text", default_greenString ())
+	NATURAL (U"Font size (points)", default_fontSize ())
+	OPTIONMENU_ENUM (U"Text alignment in intervals", kGraphics_horizontalAlignment, kGraphics_horizontalAlignment_DEFAULT)
+	OPTIONMENU (U"The symbols %#_^ in labels", default_useTextStyles () + 1)
+		OPTION (U"are shown as typed")
+		OPTION (U"mean italic/bold/sub/super")
+	OPTIONMENU (U"With the shift key, you drag", default_shiftDragMultiple () + 1)
+		OPTION (U"a single boundary")
+		OPTION (U"multiple boundaries")
+	OPTIONMENU_ENUM (U"Show number of", kTextGridEditor_showNumberOf, kTextGridEditor_showNumberOf_DEFAULT)
+	OPTIONMENU_ENUM (U"Paint intervals green whose label...", kMelder_string, kMelder_string_DEFAULT)
+	SENTENCE (U"...the text", default_greenString ())
 }
 void structTextGridEditor :: v_prefs_setValues (EditorCommand cmd) {
-	SET_INTEGER (L"The symbols %#_^ in labels", p_useTextStyles + 1)
-	SET_INTEGER (L"Font size", p_fontSize)
-	SET_ENUM (L"Text alignment in intervals", kGraphics_horizontalAlignment, p_alignment)
-	SET_INTEGER (L"With the shift key, you drag", p_shiftDragMultiple + 1)
-	SET_ENUM (L"Show number of", kTextGridEditor_showNumberOf, p_showNumberOf)
-	SET_ENUM (L"Paint intervals green whose label...", kMelder_string, p_greenMethod)
-	SET_STRING (L"...the text", p_greenString)
+	SET_INTEGER (U"The symbols %#_^ in labels", p_useTextStyles + 1)
+	SET_INTEGER (U"Font size", p_fontSize)
+	SET_ENUM (U"Text alignment in intervals", kGraphics_horizontalAlignment, p_alignment)
+	SET_INTEGER (U"With the shift key, you drag", p_shiftDragMultiple + 1)
+	SET_ENUM (U"Show number of", kTextGridEditor_showNumberOf, p_showNumberOf)
+	SET_ENUM (U"Paint intervals green whose label...", kMelder_string, p_greenMethod)
+	SET_STRING (U"...the text", p_greenString)
 }
 void structTextGridEditor :: v_prefs_getValues (EditorCommand cmd) {
-	pref_useTextStyles () = p_useTextStyles = GET_INTEGER (L"The symbols %#_^ in labels") - 1;
-	pref_fontSize () = p_fontSize = GET_INTEGER (L"Font size");
-	pref_alignment () = p_alignment = GET_ENUM (kGraphics_horizontalAlignment, L"Text alignment in intervals");
-	pref_shiftDragMultiple () = p_shiftDragMultiple = GET_INTEGER (L"With the shift key, you drag") - 1;
-	pref_showNumberOf () = p_showNumberOf = GET_ENUM (kTextGridEditor_showNumberOf, L"Show number of");
-	pref_greenMethod () = p_greenMethod = GET_ENUM (kMelder_string, L"Paint intervals green whose label...");
-	pref_wcscpy2 (pref_greenString (), p_greenString, GET_STRING (L"...the text"));
+	pref_useTextStyles () = p_useTextStyles = GET_INTEGER (U"The symbols %#_^ in labels") - 1;
+	pref_fontSize () = p_fontSize = GET_INTEGER (U"Font size");
+	pref_alignment () = p_alignment = GET_ENUM (kGraphics_horizontalAlignment, U"Text alignment in intervals");
+	pref_shiftDragMultiple () = p_shiftDragMultiple = GET_INTEGER (U"With the shift key, you drag") - 1;
+	pref_showNumberOf () = p_showNumberOf = GET_ENUM (kTextGridEditor_showNumberOf, U"Show number of");
+	pref_greenMethod () = p_greenMethod = GET_ENUM (kMelder_string, U"Paint intervals green whose label...");
+	pref_str32cpy2 (pref_greenString (), p_greenString, GET_STRING (U"...the text"));
 	FunctionEditor_redraw (this);
 }
 
 void structTextGridEditor :: v_createMenuItems_view_timeDomain (EditorMenu menu) {
 	TextGridEditor_Parent :: v_createMenuItems_view_timeDomain (menu);
-	EditorMenu_addCommand (menu, L"Select previous tier", GuiMenu_OPTION | GuiMenu_UP_ARROW, menu_cb_SelectPreviousTier);
-	EditorMenu_addCommand (menu, L"Select next tier", GuiMenu_OPTION | GuiMenu_DOWN_ARROW, menu_cb_SelectNextTier);
-	EditorMenu_addCommand (menu, L"Select previous interval", GuiMenu_OPTION | GuiMenu_LEFT_ARROW, menu_cb_SelectPreviousInterval);
-	EditorMenu_addCommand (menu, L"Select next interval", GuiMenu_OPTION | GuiMenu_RIGHT_ARROW, menu_cb_SelectNextInterval);
-	EditorMenu_addCommand (menu, L"Extend-select left", GuiMenu_SHIFT | GuiMenu_OPTION | GuiMenu_LEFT_ARROW, menu_cb_ExtendSelectPreviousInterval);
-	EditorMenu_addCommand (menu, L"Extend-select right", GuiMenu_SHIFT | GuiMenu_OPTION | GuiMenu_RIGHT_ARROW, menu_cb_ExtendSelectNextInterval);
+	EditorMenu_addCommand (menu, U"Select previous tier", GuiMenu_OPTION | GuiMenu_UP_ARROW, menu_cb_SelectPreviousTier);
+	EditorMenu_addCommand (menu, U"Select next tier", GuiMenu_OPTION | GuiMenu_DOWN_ARROW, menu_cb_SelectNextTier);
+	EditorMenu_addCommand (menu, U"Select previous interval", GuiMenu_OPTION | GuiMenu_LEFT_ARROW, menu_cb_SelectPreviousInterval);
+	EditorMenu_addCommand (menu, U"Select next interval", GuiMenu_OPTION | GuiMenu_RIGHT_ARROW, menu_cb_SelectNextInterval);
+	EditorMenu_addCommand (menu, U"Extend-select left", GuiMenu_SHIFT | GuiMenu_OPTION | GuiMenu_LEFT_ARROW, menu_cb_ExtendSelectPreviousInterval);
+	EditorMenu_addCommand (menu, U"Extend-select right", GuiMenu_SHIFT | GuiMenu_OPTION | GuiMenu_RIGHT_ARROW, menu_cb_ExtendSelectNextInterval);
 }
 
 void structTextGridEditor :: v_highlightSelection (double left, double right, double bottom, double top) {
@@ -2189,18 +2187,18 @@ double structTextGridEditor :: v_getBottomOfSoundAndAnalysisArea () {
 
 void structTextGridEditor :: v_createMenuItems_pitch_picture (EditorMenu menu) {
 	TextGridEditor_Parent :: v_createMenuItems_pitch_picture (menu);
-	EditorMenu_addCommand (menu, L"Draw visible pitch contour and TextGrid...", 0, menu_cb_DrawTextGridAndPitch);
+	EditorMenu_addCommand (menu, U"Draw visible pitch contour and TextGrid...", 0, menu_cb_DrawTextGridAndPitch);
 }
 
 void structTextGridEditor :: v_updateMenuItems_file () {
 	TextGridEditor_Parent :: v_updateMenuItems_file ();
-	extractSelectedTextGridPreserveTimesButton -> f_setSensitive (our d_endSelection > our d_startSelection);
-	extractSelectedTextGridTimeFromZeroButton  -> f_setSensitive (our d_endSelection > our d_startSelection);
+	GuiThing_setSensitive (extractSelectedTextGridPreserveTimesButton, our d_endSelection > our d_startSelection);
+	GuiThing_setSensitive (extractSelectedTextGridTimeFromZeroButton,  our d_endSelection > our d_startSelection);
 }
 
 /********** EXPORTED **********/
 
-void TextGridEditor_init (TextGridEditor me, const wchar_t *title, TextGrid grid, Sampled sound, bool ownSound, SpellingChecker spellingChecker, const char *callbackSocket)
+void TextGridEditor_init (TextGridEditor me, const char32 *title, TextGrid grid, Sampled sound, bool ownSound, SpellingChecker spellingChecker, const char *callbackSocket)
 {
 	my spellingChecker = spellingChecker;   // set in time
 	my callbackSocket = Melder_strdup (callbackSocket);
@@ -2216,22 +2214,22 @@ void TextGridEditor_init (TextGridEditor me, const wchar_t *title, TextGrid grid
 		FunctionEditor_marksChanged (me, false);
 	}
 	if (spellingChecker != NULL)
-		my text -> f_setSelection (0, 0);
+		GuiText_setSelection (my text, 0, 0);
 	if (sound && sound -> xmin == 0.0 && grid -> xmin != 0.0 && grid -> xmax > sound -> xmax)
-		Melder_warning ("The time domain of the TextGrid (starting at ",
-			Melder_fixed (grid -> xmin, 6), " seconds) does not overlap with that of the sound "
-			"(which starts at 0 seconds).\nIf you want to repair this, you can select the TextGrid "
-			"and choose “Shift times to...” from the Modify menu "
-			"to shift the starting time of the TextGrid to zero.");
+		Melder_warning (U"The time domain of the TextGrid (starting at ",
+			Melder_fixed (grid -> xmin, 6), U" seconds) does not overlap with that of the sound "
+			U"(which starts at 0 seconds).\nIf you want to repair this, you can select the TextGrid "
+			U"and choose “Shift times to...” from the Modify menu "
+			U"to shift the starting time of the TextGrid to zero.");
 }
 
-TextGridEditor TextGridEditor_create (const wchar_t *title, TextGrid grid, Sampled sound, bool ownSound, SpellingChecker spellingChecker, const char *callbackSocket) {
+autoTextGridEditor TextGridEditor_create (const char32 *title, TextGrid grid, Sampled sound, bool ownSound, SpellingChecker spellingChecker, const char *callbackSocket) {
 	try {
 		autoTextGridEditor me = Thing_new (TextGridEditor);
 		TextGridEditor_init (me.peek(), title, grid, sound, ownSound, spellingChecker, callbackSocket);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("TextGrid window not created.");
+		Melder_throw (U"TextGrid window not created.");
 	}
 }
 
diff --git a/fon/TextGridEditor.h b/fon/TextGridEditor.h
index 208803c..de8c034 100644
--- a/fon/TextGridEditor.h
+++ b/fon/TextGridEditor.h
@@ -2,7 +2,7 @@
 #define _TextGridEditor_h_
 /* TextGridEditor.h
  *
- * Copyright (C) 1992-2011,2012,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,46 +27,71 @@
 #include "TextGridEditor_enums.h"
 
 Thing_define (TextGridEditor, TimeSoundAnalysisEditor) {
-	// new data:
-	public:
-		SpellingChecker spellingChecker;
-		long selectedTier;
-		bool suppressRedraw;
-		wchar_t *findString;
-		GuiMenuItem extractSelectedTextGridPreserveTimesButton, extractSelectedTextGridTimeFromZeroButton;
-	// overridden methods:
-		virtual void v_info ();
-		virtual void v_createChildren ();
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_dataChanged ();
-		virtual void v_createMenuItems_file_extract (EditorMenu menu);
-		virtual void v_createMenuItems_file_write (EditorMenu menu);
-		virtual void v_createMenuItems_file_draw (EditorMenu menu);
-		virtual void v_prepareDraw ();
-		virtual void v_draw ();
-		virtual bool v_hasText () { return true; }
-		virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
-		virtual int v_clickB (double xWC, double yWC);
-		virtual int v_clickE (double xWC, double yWC);
-		virtual void v_play (double tmin, double tmax);
-		virtual void v_updateText ();
-		virtual void v_prefs_addFields (EditorCommand cmd);
-		virtual void v_prefs_setValues (EditorCommand cmd);
-		virtual void v_prefs_getValues (EditorCommand cmd);
-		virtual void v_createMenuItems_view_timeDomain (EditorMenu menu);
-		virtual void v_highlightSelection (double left, double right, double bottom, double top);
-		virtual void v_unhighlightSelection (double left, double right, double bottom, double top);
-		virtual double v_getBottomOfSoundArea ();
-		virtual double v_getBottomOfSoundAndAnalysisArea ();
-		virtual void v_updateMenuItems_file ();
-		virtual void v_createMenuItems_pitch_picture (EditorMenu menu);
+	SpellingChecker spellingChecker;
+	long selectedTier;
+	bool suppressRedraw;
+	char32 *findString;
+	GuiMenuItem extractSelectedTextGridPreserveTimesButton, extractSelectedTextGridTimeFromZeroButton;
+
+	void v_info ()
+		override;
+	void v_createChildren ()
+		override;
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_dataChanged ()
+		override;
+	void v_createMenuItems_file_extract (EditorMenu menu)
+		override;
+	void v_createMenuItems_file_write (EditorMenu menu)
+		override;
+	void v_createMenuItems_file_draw (EditorMenu menu)
+		override;
+	void v_prepareDraw ()
+		override;
+	void v_draw ()
+		override;
+	bool v_hasText ()
+		override { return true; }
+	int v_click (double xWC, double yWC, bool shiftKeyPressed)
+		override;
+	int v_clickB (double xWC, double yWC)
+		override;
+	int v_clickE (double xWC, double yWC)
+		override;
+	void v_play (double tmin, double tmax)
+		override;
+	void v_updateText ()
+		override;
+	void v_prefs_addFields (EditorCommand cmd)
+		override;
+	void v_prefs_setValues (EditorCommand cmd)
+		override;
+	void v_prefs_getValues (EditorCommand cmd)
+		override;
+	void v_createMenuItems_view_timeDomain (EditorMenu menu)
+		override;
+	void v_highlightSelection (double left, double right, double bottom, double top)
+		override;
+	void v_unhighlightSelection (double left, double right, double bottom, double top)
+		override;
+	double v_getBottomOfSoundArea ()
+		override;
+	double v_getBottomOfSoundAndAnalysisArea ()
+		override;
+	void v_updateMenuItems_file ()
+		override;
+	void v_createMenuItems_pitch_picture (EditorMenu menu)
+		override;
+
 	#include "TextGridEditor_prefs.h"
 };
 
-void TextGridEditor_init (TextGridEditor me, const wchar_t *title, TextGrid grid, Sampled sound, bool ownSound, SpellingChecker spellingChecker, const char *callbackSocket);
+void TextGridEditor_init (TextGridEditor me, const char32 *title, TextGrid grid, Sampled sound, bool ownSound, SpellingChecker spellingChecker, const char *callbackSocket);
 
-TextGridEditor TextGridEditor_create (const wchar_t *title, TextGrid grid,
+autoTextGridEditor TextGridEditor_create (const char32 *title, TextGrid grid,
 	Sampled sound,   // either a Sound or a LongSound, or null
 	bool ownSound,
 	SpellingChecker spellingChecker,
diff --git a/fon/TextGridEditor_enums.h b/fon/TextGridEditor_enums.h
index 364a70c..03fb3c1 100644
--- a/fon/TextGridEditor_enums.h
+++ b/fon/TextGridEditor_enums.h
@@ -1,6 +1,6 @@
 /* TextGridEditor_enums.h
  *
- * Copyright (C) 1992-2007,2013 Paul Boersma
+ * Copyright (C) 1992-2007,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,37 +18,37 @@
  */
 
 enums_begin (kTextGridEditor_showNumberOf, 1)
-	enums_add (kTextGridEditor_showNumberOf, 1, NOTHING, L"nothing")
-	enums_add (kTextGridEditor_showNumberOf, 2, INTERVALS_OR_POINTS, L"intervals or points")
-	enums_add (kTextGridEditor_showNumberOf, 3, NONEMPTY_INTERVALS_OR_POINTS, L"non-empty intervals or points")
+	enums_add (kTextGridEditor_showNumberOf, 1, NOTHING, U"nothing")
+	enums_add (kTextGridEditor_showNumberOf, 2, INTERVALS_OR_POINTS, U"intervals or points")
+	enums_add (kTextGridEditor_showNumberOf, 3, NONEMPTY_INTERVALS_OR_POINTS, U"non-empty intervals or points")
 enums_end (kTextGridEditor_showNumberOf, 3, INTERVALS_OR_POINTS)
 
 enums_begin (kTextGridEditor_language, 1)
-	enums_add (kTextGridEditor_language, 1, AFRIKAANS, L"Afrikaans")
-	enums_add (kTextGridEditor_language, 2, AKAN, L"Akan")
-	enums_add (kTextGridEditor_language, 3, ALBANIAN, L"Albanian")
-	enums_add (kTextGridEditor_language, 4, AMHARIC, L"Amharic")
-	enums_add (kTextGridEditor_language, 5, ARMENIAN, L"Armenian")
-	enums_add (kTextGridEditor_language, 6, ARMENIAN_WEST, L"Armenian (West)")
-	enums_add (kTextGridEditor_language, 7, AZERBAIJANI, L"Azerbaijani")
-	enums_add (kTextGridEditor_language, 8, BOSNIAN, L"Bosnian")
-	enums_add (kTextGridEditor_language, 9, BULGARIAN, L"Bulgarian")
-	enums_add (kTextGridEditor_language, 10, CANTONESE, L"Cantonese")
-	enums_add (kTextGridEditor_language, 11, CATALAN, L"Catalan")
-	enums_add (kTextGridEditor_language, 12, CROATIAN, L"Croatian")
-	enums_add (kTextGridEditor_language, 13, CZECH, L"Czech")
-	enums_add (kTextGridEditor_language, 14, DARI, L"Danish")
-	enums_add (kTextGridEditor_language, 15, DEFAULT_LANGUAGE, L"Default language")
-	enums_add (kTextGridEditor_language, 16, DIVEHI, L"Divehi")
-	enums_add (kTextGridEditor_language, 17, DUTCH, L"Dutch-test")
-	enums_add (kTextGridEditor_language, 18, ENGLISH_AMERICAN, L"English (American)")
-	enums_add (kTextGridEditor_language, 19, ENGLISH_RP, L"English (RP)")
-	enums_add (kTextGridEditor_language, 20, ENGLISH_SCOTLAND, L"English (Scotland)")
-	enums_add (kTextGridEditor_language, 21, ENGLISH_SOUTHERN_ENGLAND, L"English (Southern England)")
-	enums_add (kTextGridEditor_language, 22, ENGLISH_WEST_INDIES, L"English (West Indies)")
-	enums_add (kTextGridEditor_language, 22, ENGLISH_WEST_MIDLANDS, L"English (West Midlands)")
-	enums_add (kTextGridEditor_language, 23, PORTUGUESE_BRAZILIAN, L"Portuguese (Brazilian)")
-	enums_add (kTextGridEditor_language, 24, PORTUGUESE_EUROPEAN, L"Portuguese (European)")
+	enums_add (kTextGridEditor_language, 1, AFRIKAANS, U"Afrikaans")
+	enums_add (kTextGridEditor_language, 2, AKAN, U"Akan")
+	enums_add (kTextGridEditor_language, 3, ALBANIAN, U"Albanian")
+	enums_add (kTextGridEditor_language, 4, AMHARIC, U"Amharic")
+	enums_add (kTextGridEditor_language, 5, ARMENIAN, U"Armenian")
+	enums_add (kTextGridEditor_language, 6, ARMENIAN_WEST, U"Armenian (West)")
+	enums_add (kTextGridEditor_language, 7, AZERBAIJANI, U"Azerbaijani")
+	enums_add (kTextGridEditor_language, 8, BOSNIAN, U"Bosnian")
+	enums_add (kTextGridEditor_language, 9, BULGARIAN, U"Bulgarian")
+	enums_add (kTextGridEditor_language, 10, CANTONESE, U"Cantonese")
+	enums_add (kTextGridEditor_language, 11, CATALAN, U"Catalan")
+	enums_add (kTextGridEditor_language, 12, CROATIAN, U"Croatian")
+	enums_add (kTextGridEditor_language, 13, CZECH, U"Czech")
+	enums_add (kTextGridEditor_language, 14, DARI, U"Danish")
+	enums_add (kTextGridEditor_language, 15, DEFAULT_LANGUAGE, U"Default language")
+	enums_add (kTextGridEditor_language, 16, DIVEHI, U"Divehi")
+	enums_add (kTextGridEditor_language, 17, DUTCH, U"Dutch-test")
+	enums_add (kTextGridEditor_language, 18, ENGLISH_AMERICAN, U"English (American)")
+	enums_add (kTextGridEditor_language, 19, ENGLISH_RP, U"English (RP)")
+	enums_add (kTextGridEditor_language, 20, ENGLISH_SCOTLAND, U"English (Scotland)")
+	enums_add (kTextGridEditor_language, 21, ENGLISH_SOUTHERN_ENGLAND, U"English (Southern England)")
+	enums_add (kTextGridEditor_language, 22, ENGLISH_WEST_INDIES, U"English (West Indies)")
+	enums_add (kTextGridEditor_language, 22, ENGLISH_WEST_MIDLANDS, U"English (West Midlands)")
+	enums_add (kTextGridEditor_language, 23, PORTUGUESE_BRAZILIAN, U"Portuguese (Brazilian)")
+	enums_add (kTextGridEditor_language, 24, PORTUGUESE_EUROPEAN, U"Portuguese (European)")
 enums_end (kTextGridEditor_language, 2, ENGLISH_AMERICAN)
 
 /* End of file TextGridEditor_enums.h */
diff --git a/fon/TextGridEditor_prefs.h b/fon/TextGridEditor_prefs.h
index fa51467..898abd1 100644
--- a/fon/TextGridEditor_prefs.h
+++ b/fon/TextGridEditor_prefs.h
@@ -1,6 +1,6 @@
 /* TextGridEditor_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,24 +18,25 @@
  */
 
 prefs_begin (TextGridEditor)
-	// overridden:
-		prefs_add_int    (TextGridEditor, shellWidth,                 1, L"800")
-		prefs_add_int    (TextGridEditor, shellHeight,                1, L"600")
-		prefs_add_bool   (TextGridEditor, picture_garnish,            1, true)
-	// new:
-		prefs_add_bool_with_data   (TextGridEditor, useTextStyles,      1, false)
-		prefs_add_int_with_data    (TextGridEditor, fontSize,           1, L"18")
-		prefs_add_enum_with_data   (TextGridEditor, alignment,          1, kGraphics_horizontalAlignment, DEFAULT)
-		prefs_add_bool_with_data   (TextGridEditor, shiftDragMultiple,  1, true)
-		prefs_add_enum_with_data   (TextGridEditor, showNumberOf,       1, kTextGridEditor_showNumberOf, DEFAULT)
-		prefs_add_enum_with_data   (TextGridEditor, greenMethod,        1, kMelder_string, DEFAULT)
-		prefs_add_string_with_data (TextGridEditor, greenString,        1, L"some text here for green paint")
-		prefs_add_bool   (TextGridEditor, picture_showBoundaries,     1, true)
-		prefs_add_bool   (TextGridEditor, picture_pitch_speckle,      1, false)
-		prefs_add_string_with_data (TextGridEditor, align_language,        1, L"English")
-		prefs_add_bool_with_data   (TextGridEditor, align_includeWords,    1, true)
-		prefs_add_bool_with_data   (TextGridEditor, align_includePhonemes, 1, false)
-		prefs_add_bool_with_data   (TextGridEditor, align_allowSilences,   1, false)
+
+	prefs_override_int         (TextGridEditor, shellWidth,             1, U"800")
+	prefs_override_int         (TextGridEditor, shellHeight,            1, U"600")
+	prefs_override_bool        (TextGridEditor, picture_garnish,        1, true)
+
+	prefs_add_bool_with_data   (TextGridEditor, useTextStyles,          1, false)
+	prefs_add_int_with_data    (TextGridEditor, fontSize,               1, U"18")
+	prefs_add_enum_with_data   (TextGridEditor, alignment,              1, kGraphics_horizontalAlignment, DEFAULT)
+	prefs_add_bool_with_data   (TextGridEditor, shiftDragMultiple,      1, true)
+	prefs_add_enum_with_data   (TextGridEditor, showNumberOf,           1, kTextGridEditor_showNumberOf, DEFAULT)
+	prefs_add_enum_with_data   (TextGridEditor, greenMethod,            1, kMelder_string, DEFAULT)
+	prefs_add_string_with_data (TextGridEditor, greenString,            1, U"some text here for green paint")
+	prefs_add_bool             (TextGridEditor, picture_showBoundaries, 1, true)
+	prefs_add_bool             (TextGridEditor, picture_pitch_speckle,  1, false)
+	prefs_add_string_with_data (TextGridEditor, align_language,         1, U"English")
+	prefs_add_bool_with_data   (TextGridEditor, align_includeWords,     1, true)
+	prefs_add_bool_with_data   (TextGridEditor, align_includePhonemes,  1, false)
+	prefs_add_bool_with_data   (TextGridEditor, align_allowSilences,    1, false)
+
 prefs_end (TextGridEditor)
 
 /* End of file TextGridEditor_prefs.h */
diff --git a/fon/TextGrid_Sound.cpp b/fon/TextGrid_Sound.cpp
index 0d29195..d99a5dd 100644
--- a/fon/TextGrid_Sound.cpp
+++ b/fon/TextGrid_Sound.cpp
@@ -1,6 +1,6 @@
 /* TextGrid_Sound.cpp
  *
- * Copyright (C) 1992-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -54,12 +54,12 @@ static void IntervalTier_insertIntervalDestructively (IntervalTier me, double tm
 	if (! firstIntervalNumber) {
 		long intervalNumber = IntervalTier_timeToIndex (me, tmin);
 		if (intervalNumber == 0)
-			Melder_throw ("Cannot add a boundary at ", Melder_fixed (tmin, 6), " seconds, because this is outside the time domain of the intervals.");
+			Melder_throw (U"Cannot add a boundary at ", Melder_fixed (tmin, 6), U" seconds, because this is outside the time domain of the intervals.");
 		TextInterval interval = my interval (intervalNumber);
 		/*
 		 * Move the text to the left of the boundary.
 		 */
-		autoTextInterval newInterval = TextInterval_create (tmin, interval -> xmax, L"");
+		autoTextInterval newInterval = TextInterval_create (tmin, interval -> xmax, U"");
 		interval -> xmax = tmin;
 		Collection_addItem (my intervals, newInterval.transfer());
 		firstIntervalNumber = IntervalTier_hasTime (me, interval -> xmin);
@@ -69,12 +69,12 @@ static void IntervalTier_insertIntervalDestructively (IntervalTier me, double tm
 	if (! lastIntervalNumber) {
 		long intervalNumber = IntervalTier_timeToIndex (me, tmax);
 		if (intervalNumber == 0)
-			Melder_throw ("Cannot add a boundary at ", Melder_fixed (tmin, 6), " seconds, because this is outside the time domain of the intervals.");
+			Melder_throw (U"Cannot add a boundary at ", Melder_fixed (tmin, 6), U" seconds, because this is outside the time domain of the intervals.");
 		TextInterval interval = my interval (intervalNumber);
 		/*
 		 * Move the text to the right of the boundary.
 		 */
-		autoTextInterval newInterval = TextInterval_create (interval -> xmin, tmax, L"");
+		autoTextInterval newInterval = TextInterval_create (interval -> xmin, tmax, U"");
 		interval -> xmin = tmax;
 		Collection_addItem (my intervals, newInterval.transfer());
 		lastIntervalNumber = IntervalTier_hasTime (me, interval -> xmax);
@@ -83,18 +83,18 @@ static void IntervalTier_insertIntervalDestructively (IntervalTier me, double tm
 	/*
 	 * Empty the interval in the word tier.
 	 */
-	trace ("Empty interval %ld down to %ld.", lastIntervalNumber, firstIntervalNumber);
+	trace (U"Empty interval %ld down to ", lastIntervalNumber, U".", firstIntervalNumber);
 	for (long iinterval = lastIntervalNumber; iinterval >= firstIntervalNumber; iinterval --) {
 		TextInterval interval = my interval (iinterval);
 		if (interval -> xmin > tmin && interval -> xmin < tmax) {
 			Melder_assert (iinterval > 1);
 			TextInterval previous = (TextInterval) my intervals -> item [iinterval - 1];
 			previous -> xmax = tmax;   // collapse left and right intervals into left interval
-			TextInterval_setText (previous, L"");
+			TextInterval_setText (previous, U"");
 			Collection_removeItem (my intervals, iinterval);   // remove right interval
 		}
 		if (interval -> xmax == tmax) {
-			TextInterval_setText (interval, L"");
+			TextInterval_setText (interval, U"");
 		}
 	}
 }
@@ -111,21 +111,21 @@ static double IntervalTier_boundaryTimeClosestTo (IntervalTier me, double tmin,
 }
 
 static void IntervalTier_removeEmptyIntervals (IntervalTier me, IntervalTier boss) {
-	IntervalTier_removeBoundariesBetweenIdenticallyLabeledIntervals (me, L"");
+	IntervalTier_removeBoundariesBetweenIdenticallyLabeledIntervals (me, U"");
 	if (my intervals -> size < 2) return;
 	TextInterval firstInterval = my interval (1);
-	if (Melder_wcsequ (firstInterval -> text, L"")) {
+	if (Melder_equ (firstInterval -> text, U"")) {
 		IntervalTier_removeLeftBoundary (me, 2);
 	}
 	if (my numberOfIntervals () < 2) return;
 	TextInterval lastInterval = my interval (my numberOfIntervals ());
-	if (Melder_wcsequ (lastInterval -> text, L"")) {
+	if (Melder_equ (lastInterval -> text, U"")) {
 		IntervalTier_removeLeftBoundary (me, my numberOfIntervals ());
 	}
 	if (my numberOfIntervals () < 3) return;
 	for (long iinterval = my numberOfIntervals () - 1; iinterval >= 2; iinterval --) {
 		TextInterval interval = my interval (iinterval);
-		if (Melder_wcsequ (interval -> text, L"")) {
+		if (Melder_equ (interval -> text, U"")) {
 			/*
 			 * Distribute the empty interval between its neigbours.
 			 */
@@ -142,24 +142,24 @@ static void IntervalTier_removeEmptyIntervals (IntervalTier me, IntervalTier bos
 	}
 }
 
-void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierNumber, long intervalNumber, const wchar_t *languageName, bool includeWords, bool includePhonemes) {
+void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierNumber, long intervalNumber, const char32 *languageName, bool includeWords, bool includePhonemes) {
 	try {
 		IntervalTier headTier = TextGrid_checkSpecifiedTierIsIntervalTier (me, tierNumber);
 		if (intervalNumber < 1 || intervalNumber > headTier -> numberOfIntervals ())
-			Melder_throw ("Interval ", intervalNumber, " does not exist.");
+			Melder_throw (U"Interval ", intervalNumber, U" does not exist.");
 		TextInterval interval = headTier -> interval (intervalNumber);
 		if (! includeWords && ! includePhonemes)
-			Melder_throw ("Nothing to be done, because you asked neither for word alignment nor for phoneme alignment.");
-		if (wcsstr (headTier -> name, L"/") )
-			Melder_throw ("The current tier already has a slash (\"/\") in its name. Cannot create a word or phoneme tier from it.");
+			Melder_throw (U"Nothing to be done, because you asked neither for word alignment nor for phoneme alignment.");
+		if (str32str (headTier -> name, U"/") )
+			Melder_throw (U"The current tier already has a slash (\"/\") in its name. Cannot create a word or phoneme tier from it.");
 		autoSound part =
 			anySound -> classInfo == classLongSound ? 
 				LongSound_extractPart (static_cast <LongSound> (anySound), interval -> xmin, interval -> xmax, true) :
 				Sound_extractPart (static_cast <Sound> (anySound), interval -> xmin, interval -> xmax, kSound_windowShape_RECTANGULAR, 1.0, true);
-		autoSpeechSynthesizer synthesizer = SpeechSynthesizer_create (languageName, L"default");
+		autoSpeechSynthesizer synthesizer = SpeechSynthesizer_create (languageName, U"default");
 		double silenceThreshold = -35, minSilenceDuration = 0.1, minSoundingDuration = 0.1;
 		autoTextGrid analysis = NULL;
-		if (! Melder_wcsequ (interval -> text, L"")) {
+		if (! Melder_equ (interval -> text, U"")) {
 			try {
 				analysis.reset (SpeechSynthesizer_and_Sound_and_TextInterval_align
 					(synthesizer.peek(), part.peek(), interval, silenceThreshold, minSilenceDuration, minSoundingDuration));
@@ -176,7 +176,7 @@ void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierN
 			Melder_assert (analysis -> numberOfTiers () == 4);
 			Thing_cast (IntervalTier, analysisWordTier, analysis -> tier (3));
 			if (! IntervalTier_check (analysisWordTier))
-				Melder_throw (L"Analysis word tier out of order.");
+				Melder_throw (U"Analysis word tier out of order.");
 			IntervalTier_removeEmptyIntervals (analysisWordTier, NULL);
 			Melder_assert (analysisWordTier -> xmax == analysis -> xmax);
 			Melder_assert (analysisWordTier -> numberOfIntervals () >= 1);
@@ -185,13 +185,12 @@ void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierN
 			firstInterval -> xmin = analysis -> xmin;
 			lastInterval  -> xmax = analysis -> xmax;
 			if (lastInterval -> xmax != analysis -> xmax)
-				Melder_fatal ("analysis ends at %ls, but last interval at %ls seconds",
-					Melder_double (analysis -> xmax), Melder_double (lastInterval -> xmax));
+				Melder_fatal (U"analysis ends at ", analysis -> xmax, U", but last interval at ", lastInterval -> xmax, U" seconds");
 			if (! IntervalTier_check (analysisWordTier))
-				Melder_throw (L"Analysis word tier out of order (2).");
+				Melder_throw (U"Analysis word tier out of order (2).");
 			Thing_cast (IntervalTier, analysisPhonemeTier, analysis -> tier (4));
 			if (! IntervalTier_check (analysisPhonemeTier))
-				Melder_throw (L"Analysis phoneme tier out of order.");
+				Melder_throw (U"Analysis phoneme tier out of order.");
 			IntervalTier_removeEmptyIntervals (analysisPhonemeTier, analysisWordTier);
 			Melder_assert (analysisPhonemeTier -> xmax == analysis -> xmax);
 			Melder_assert (analysisPhonemeTier -> numberOfIntervals () >= 1);
@@ -201,7 +200,7 @@ void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierN
 			lastInterval  -> xmax = analysis -> xmax;
 			Melder_assert (lastInterval -> xmax == analysis -> xmax);
 			if (! IntervalTier_check (analysisPhonemeTier))
-				Melder_throw (L"Analysis phoneme tier out of order (2).");
+				Melder_throw (U"Analysis phoneme tier out of order (2).");
 		}
 		long wordTierNumber = 0, phonemeTierNumber = 0;
 		IntervalTier wordTier = NULL, phonemeTier = NULL;
@@ -213,14 +212,13 @@ void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierN
 			 * Make sure that the word tier exists.
 			 */
 			autoMelderString newWordTierName;
-			MelderString_copy (& newWordTierName, headTier -> name);
-			MelderString_append (& newWordTierName, L"/word");
+			MelderString_copy (& newWordTierName, headTier -> name, U"/word");
 			for (long itier = 1; itier <= my numberOfTiers (); itier ++) {
 				IntervalTier tier = static_cast <IntervalTier> (my tier (itier));
-				if (Melder_wcsequ (newWordTierName.string, tier -> name)) {
+				if (Melder_equ (newWordTierName.string, tier -> name)) {
 					if (tier -> classInfo != classIntervalTier)
-						Melder_throw ("A tier with the prospective word tier name (", tier -> name, ") already exists, but it is not an interval tier."
-							"\nPlease change its name or remove it.");
+						Melder_throw (U"A tier with the prospective word tier name (", tier -> name, U") already exists, but it is not an interval tier."
+							U"\nPlease change its name or remove it.");
 					wordTierNumber = itier;
 					break;
 				}
@@ -244,9 +242,9 @@ void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierN
 			if (analysis.peek()) {
 				Thing_cast (IntervalTier, analysisWordTier, analysis -> tier (3));
 				if (! IntervalTier_check (analysisWordTier))
-					Melder_throw (L"Analysis word tier out of order (3).");
+					Melder_throw (U"Analysis word tier out of order (3).");
 				if (! IntervalTier_check (wordTier))
-					Melder_throw (L"Word tier out of order (3).");
+					Melder_throw (U"Word tier out of order (3).");
 				for (long ianalysisInterval = 1; ianalysisInterval <= analysisWordTier -> numberOfIntervals (); ianalysisInterval ++) {
 					TextInterval analysisInterval = analysisWordTier -> interval (ianalysisInterval);
 					TextInterval wordInterval = NULL;
@@ -263,9 +261,9 @@ void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierN
 					}
 				}
 				if (! IntervalTier_check (analysisWordTier))
-					Melder_throw (L"Analysis word tier out of order (4).");
+					Melder_throw (U"Analysis word tier out of order (4).");
 				if (! IntervalTier_check (wordTier))
-					Melder_throw (L"Word tier out of order (4).");
+					Melder_throw (U"Word tier out of order (4).");
 			}
 		}
 		/*
@@ -276,14 +274,13 @@ void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierN
 			 * Make sure that the phoneme tier exists.
 			 */
 			autoMelderString newPhonemeTierName;
-			MelderString_copy (& newPhonemeTierName, headTier -> name);
-			MelderString_append (& newPhonemeTierName, L"/phon");
+			MelderString_copy (& newPhonemeTierName, headTier -> name, U"/phon");
 			for (long itier = 1; itier <= my numberOfTiers (); itier ++) {
 				IntervalTier tier = static_cast <IntervalTier> (my tier (itier));
-				if (Melder_wcsequ (newPhonemeTierName.string, tier -> name)) {
+				if (Melder_equ (newPhonemeTierName.string, tier -> name)) {
 					if (tier -> classInfo != classIntervalTier)
-						Melder_throw ("A tier with the prospective phoneme tier name (", tier -> name, ") already exists, but it is not an interval tier."
-							"\nPlease change its name or remove it.");
+						Melder_throw (U"A tier with the prospective phoneme tier name (", tier -> name, U") already exists, but it is not an interval tier."
+							U"\nPlease change its name or remove it.");
 					phonemeTierNumber = itier;
 					break;
 				}
@@ -330,7 +327,7 @@ void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierN
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, " & ", anySound, ": interval not aligned.");
+		Melder_throw (me, U" & ", anySound, U": interval not aligned.");
 	}
 }
 
@@ -414,15 +411,15 @@ void TextGrid_Sound_draw (TextGrid me, Sound sound, Graphics g, double tmin, dou
 			}
 		}
 	}
-	Graphics_setPercentSignIsItalic (g, TRUE);
-	Graphics_setNumberSignIsBold (g, TRUE);
-	Graphics_setCircumflexIsSuperscript (g, TRUE);
-	Graphics_setUnderscoreIsSubscript (g, TRUE);
+	Graphics_setPercentSignIsItalic (g, true);
+	Graphics_setNumberSignIsBold (g, true);
+	Graphics_setCircumflexIsSuperscript (g, true);
+	Graphics_setUnderscoreIsSubscript (g, true);
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_textBottom (g, 1, L"Time (s)");
-		Graphics_marksBottom (g, 2, 1, 1, 1);
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
 	}
 }
 
@@ -433,12 +430,12 @@ Collection TextGrid_Sound_extractAllIntervals (TextGrid me, Sound sound, long ti
 		for (long iseg = 1; iseg <= tier -> numberOfIntervals (); iseg ++) {
 			TextInterval segment = tier -> interval (iseg);
 			autoSound interval = Sound_extractPart (sound, segment -> xmin, segment -> xmax, kSound_windowShape_RECTANGULAR, 1.0, preserveTimes);
-			Thing_setName (interval.peek(), segment -> text ? segment -> text : L"untitled");
+			Thing_setName (interval.peek(), segment -> text ? segment -> text : U"untitled");
 			Collection_addItem (collection.peek(), interval.transfer()); 
 		}
 		return collection.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", sound, ": intervals not extracted.");
+		Melder_throw (me, U" & ", sound, U": intervals not extracted.");
 	}
 }
 
@@ -450,19 +447,19 @@ Collection TextGrid_Sound_extractNonemptyIntervals (TextGrid me, Sound sound, lo
 			TextInterval segment = tier -> interval (iseg);
 			if (segment -> text != NULL && segment -> text [0] != '\0') {
 				autoSound interval = Sound_extractPart (sound, segment -> xmin, segment -> xmax, kSound_windowShape_RECTANGULAR, 1.0, preserveTimes);
-				Thing_setName (interval.peek(), segment -> text ? segment -> text : L"untitled");
+				Thing_setName (interval.peek(), segment -> text ? segment -> text : U"untitled");
 				Collection_addItem (collection.peek(), interval.transfer());
 			}
 		}
-		if (collection -> size == 0) Melder_warning (L"No non-empty intervals were found.");
+		if (collection -> size == 0) Melder_warning (U"No non-empty intervals were found.");
 		return collection.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", sound, ": non-empty intervals not extracted.");
+		Melder_throw (me, U" & ", sound, U": non-empty intervals not extracted.");
 	}
 }
 
 Collection TextGrid_Sound_extractIntervalsWhere (TextGrid me, Sound sound, long tierNumber,
-	int comparison_Melder_STRING, const wchar_t *text, int preserveTimes)
+	int comparison_Melder_STRING, const char32 *text, int preserveTimes)
 {
 	try {
 		IntervalTier tier = TextGrid_checkSpecifiedTierIsIntervalTier (me, tierNumber);
@@ -472,38 +469,36 @@ Collection TextGrid_Sound_extractIntervalsWhere (TextGrid me, Sound sound, long
 			TextInterval segment = tier -> interval (iseg);
 			if (Melder_stringMatchesCriterion (segment -> text, comparison_Melder_STRING, text)) {
 				autoSound interval = Sound_extractPart (sound, segment -> xmin, segment -> xmax, kSound_windowShape_RECTANGULAR, 1.0, preserveTimes);
-				wchar_t name [1000];
-				swprintf (name, 1000, L"%ls_%ls_%ld", sound -> name ? sound -> name : L"", text, ++ count);
-				Thing_setName (interval.peek(), name);
+				Thing_setName (interval.peek(), Melder_cat (sound -> name ? sound -> name : U"", U"_", text, U"_", ++ count));
 				Collection_addItem (collection.peek(), interval.transfer());
 			}
 		}
 		if (collection -> size == 0)
-			Melder_warning ("No label that ", kMelder_string_getText (comparison_Melder_STRING), " the text \"", text, "\" was found.");
+			Melder_warning (U"No label that ", kMelder_string_getText (comparison_Melder_STRING), U" the text \"", text, U"\" was found.");
 		return collection.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", sound, ": intervals not extracted.");
+		Melder_throw (me, U" & ", sound, U": intervals not extracted.");
 	}
 }
 
 static void autoMarks (Graphics g, double ymin, double ymax, bool haveDottedLines) {
 	double dy = ymax - ymin;
-	if (dy < 26) {
-		long imin = ceil ((ymin + 2.0) / 5.0), imax = floor ((ymax - 2.0) / 5.0);
+	if (dy < 26.0) {
+		long imin = (long) ceil ((ymin + 2.0) / 5.0), imax = (long) floor ((ymax - 2.0) / 5.0);
 		for (long i = imin; i <= imax; i ++)
-			Graphics_markLeft (g, i * 5, TRUE, TRUE, haveDottedLines, NULL);
-	} else if (dy < 110) {
-		long imin = ceil ((ymin + 8.0) / 20.0), imax = floor ((ymax - 8.0) / 20.0);
+			Graphics_markLeft (g, i * 5.0, true, true, haveDottedLines, nullptr);
+	} else if (dy < 110.0) {
+		long imin = (long) ceil ((ymin + 8.0) / 20.0), imax = (long) floor ((ymax - 8.0) / 20.0);
 		for (long i = imin; i <= imax; i ++)
-			Graphics_markLeft (g, i * 20, TRUE, TRUE, haveDottedLines, NULL);
-	} else if (dy < 260) {
-		long imin = ceil ((ymin + 20.0) / 50.0), imax = floor ((ymax - 20.0) / 50.0);
+			Graphics_markLeft (g, i * 20.0, true, true, haveDottedLines, nullptr);
+	} else if (dy < 260.0) {
+		long imin = (long) ceil ((ymin + 20.0) / 50.0), imax = (long) floor ((ymax - 20.0) / 50.0);
 		for (long i = imin; i <= imax; i ++)
-			Graphics_markLeft (g, i * 50, TRUE, TRUE, haveDottedLines, NULL);
-	} else if (dy < 510) {
-		long imin = ceil ((ymin + 40.0) / 100.0), imax = floor ((ymax - 40.0) / 100.0);
+			Graphics_markLeft (g, i * 50.0, true, true, haveDottedLines, nullptr);
+	} else if (dy < 510.0) {
+		long imin = (long) ceil ((ymin + 40.0) / 100.0), imax = (long) floor ((ymax - 40.0) / 100.0);
 		for (long i = imin; i <= imax; i ++)
-			Graphics_markLeft (g, i * 100, TRUE, TRUE, haveDottedLines, NULL);
+			Graphics_markLeft (g, i * 100.0, true, true, haveDottedLines, nullptr);
 	}
 }
 
@@ -512,35 +507,35 @@ static void autoMarks_logarithmic (Graphics g, double ymin, double ymax, bool ha
 	for (int i = -12; i <= 12; i ++) {
 		double power = pow (10, i), y = power;
 		if (y > ymin * 1.2 && y < ymax / 1.2)
-			Graphics_markLeftLogarithmic (g, y, TRUE, TRUE, haveDottedLines, NULL);
+			Graphics_markLeftLogarithmic (g, y, true, true, haveDottedLines, nullptr);
 		if (fy > 2100) {
 			;   /* Enough. */
 		} else if (fy > 210) {
 			y = 3.0 * power;
 			if (y > ymin * 1.2 && y < ymax / 1.2)
-				Graphics_markLeftLogarithmic (g, y, TRUE, TRUE, haveDottedLines, NULL);
+				Graphics_markLeftLogarithmic (g, y, true, true, haveDottedLines, nullptr);
 		} else {
 			y = 2.0 * power;
 			if (y > ymin * 1.2 && y < ymax / 1.2)
-				Graphics_markLeftLogarithmic (g, y, TRUE, TRUE, haveDottedLines, NULL);
+				Graphics_markLeftLogarithmic (g, y, true, true, haveDottedLines, nullptr);
 			y = 5.0 * power;
 			if (y > ymin * 1.2 && y < ymax / 1.2)
-				Graphics_markLeftLogarithmic (g, y, TRUE, TRUE, haveDottedLines, NULL);
+				Graphics_markLeftLogarithmic (g, y, true, true, haveDottedLines, nullptr);
 			if (fy < 21) {
 				y = 3.0 * power;
 				if (y > ymin * 1.2 && y < ymax / 1.2)
-					Graphics_markLeftLogarithmic (g, y, TRUE, TRUE, haveDottedLines, NULL);
+					Graphics_markLeftLogarithmic (g, y, true, true, haveDottedLines, nullptr);
 				y = 7.0 * power;
 				if (y > ymin * 1.2 && y < ymax / 1.2)
-					Graphics_markLeftLogarithmic (g, y, TRUE, TRUE, haveDottedLines, NULL);
+					Graphics_markLeftLogarithmic (g, y, true, true, haveDottedLines, nullptr);
 			}
 			if (fy < 4.1) {
 				y = 1.5 * power;
 				if (y > ymin * 1.2 && y < ymax / 1.2)
-					Graphics_markLeftLogarithmic (g, y, TRUE, TRUE, haveDottedLines, NULL);
+					Graphics_markLeftLogarithmic (g, y, true, true, haveDottedLines, nullptr);
 				y = 4.0 * power;
 				if (y > ymin * 1.2 && y < ymax / 1.2)
-					Graphics_markLeftLogarithmic (g, y, TRUE, TRUE, haveDottedLines, NULL);
+					Graphics_markLeftLogarithmic (g, y, true, true, haveDottedLines, nullptr);
 			}
 		}
 	}
@@ -549,21 +544,21 @@ static void autoMarks_logarithmic (Graphics g, double ymin, double ymax, bool ha
 static void autoMarks_semitones (Graphics g, double ymin, double ymax, bool haveDottedLines) {
 	double dy = ymax - ymin;
 	if (dy < 16) {
-		long imin = ceil ((ymin + 1.2) / 3.0), imax = floor ((ymax - 1.2) / 3.0);
+		long imin = (long) ceil ((ymin + 1.2) / 3.0), imax = (long) floor ((ymax - 1.2) / 3.0);
 		for (long i = imin; i <= imax; i ++)
-			Graphics_markLeft (g, i * 3, TRUE, TRUE, haveDottedLines, NULL);
+			Graphics_markLeft (g, i * 3.0, true, true, haveDottedLines, nullptr);
 	} else if (dy < 32) {
-		long imin = ceil ((ymin + 2.4) / 6.0), imax = floor ((ymax - 2.4) / 6.0);
+		long imin = (long) ceil ((ymin + 2.4) / 6.0), imax = (long) floor ((ymax - 2.4) / 6.0);
 		for (long i = imin; i <= imax; i ++)
-			Graphics_markLeft (g, i * 6, TRUE, TRUE, haveDottedLines, NULL);
+			Graphics_markLeft (g, i * 6.0, true, true, haveDottedLines, nullptr);
 	} else if (dy < 64) {
-		long imin = ceil ((ymin + 4.8) / 12.0), imax = floor ((ymax - 4.8) / 12.0);
+		long imin = (long) ceil ((ymin + 4.8) / 12.0), imax = (long) floor ((ymax - 4.8) / 12.0);
 		for (long i = imin; i <= imax; i ++)
-			Graphics_markLeft (g, i * 12, TRUE, TRUE, haveDottedLines, NULL);
+			Graphics_markLeft (g, i * 12.0, true, true, haveDottedLines, nullptr);
 	} else if (dy < 128) {
-		long imin = ceil ((ymin + 9.6) / 24.0), imax = floor ((ymax - 9.6) / 24.0);
+		long imin = (long) ceil ((ymin + 9.6) / 24.0), imax = (long) floor ((ymax - 9.6) / 24.0);
 		for (long i = imin; i <= imax; i ++)
-			Graphics_markLeft (g, i * 24, TRUE, TRUE, haveDottedLines, NULL);
+			Graphics_markLeft (g, i * 24.0, true, true, haveDottedLines, nullptr);
 	}
 }
 
@@ -577,37 +572,34 @@ void TextGrid_Pitch_drawSeparately (TextGrid grid, Pitch pitch, Graphics g, doub
 		fmax = Function_convertStandardToSpecialUnit (pitch, fmax, Pitch_LEVEL_FREQUENCY, unit);
 	}
 	if (unit == kPitch_unit_HERTZ_LOGARITHMIC)
-		Pitch_draw (pitch, g, tmin, tmax, pow (10, fmin - 0.25 * (fmax - fmin) * ntier), pow (10, fmax), FALSE, speckle, unit);
+		Pitch_draw (pitch, g, tmin, tmax, pow (10.0, fmin - 0.25 * (fmax - fmin) * ntier), pow (10.0, fmax), false, speckle, unit);
 	else
-		Pitch_draw (pitch, g, tmin, tmax, fmin - 0.25 * (fmax - fmin) * ntier, fmax, FALSE, speckle, unit);
-	TextGrid_Sound_draw (grid, NULL, g, tmin, tmax, showBoundaries, useTextStyles, FALSE);
+		Pitch_draw (pitch, g, tmin, tmax, fmin - 0.25 * (fmax - fmin) * ntier, fmax, false, speckle, unit);
+	TextGrid_Sound_draw (grid, NULL, g, tmin, tmax, showBoundaries, useTextStyles, false);
 	/*
 	 * Restore window for the sake of margin drawing.
 	 */
 	Graphics_setWindow (g, tmin, tmax, fmin - 0.25 * (fmax - fmin) * ntier, fmax);
 	if (unit == kPitch_unit_HERTZ_LOGARITHMIC)
-		fmin = pow (10, fmin), fmax = pow (10, fmax);
+		fmin = pow (10, fmin), fmax = pow (10.0, fmax);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
 		if (unit == kPitch_unit_HERTZ_LOGARITHMIC) {
-			Graphics_markLeftLogarithmic (g, fmin, TRUE, TRUE, FALSE, NULL);
-			Graphics_markLeftLogarithmic (g, fmax, TRUE, TRUE, FALSE, NULL);
-			autoMarks_logarithmic (g, fmin, fmax, FALSE);
+			Graphics_markLeftLogarithmic (g, fmin, true, true, false, nullptr);
+			Graphics_markLeftLogarithmic (g, fmax, true, true, false, nullptr);
+			autoMarks_logarithmic (g, fmin, fmax, false);
 		} else if (unit == kPitch_unit_SEMITONES_100) {
-			Graphics_markLeft (g, fmin, TRUE, TRUE, FALSE, NULL);
-			Graphics_markLeft (g, fmax, TRUE, TRUE, FALSE, NULL);
-			autoMarks_semitones (g, fmin, fmax, FALSE);
+			Graphics_markLeft (g, fmin, true, true, false, nullptr);
+			Graphics_markLeft (g, fmax, true, true, false, nullptr);
+			autoMarks_semitones (g, fmin, fmax, false);
 		} else {
-			Graphics_markLeft (g, fmin, TRUE, TRUE, FALSE, NULL);
-			Graphics_markLeft (g, fmax, TRUE, TRUE, FALSE, NULL);
-			autoMarks (g, fmin, fmax, FALSE);
+			Graphics_markLeft (g, fmin, true, true, false, nullptr);
+			Graphics_markLeft (g, fmax, true, true, false, nullptr);
+			autoMarks (g, fmin, fmax, false);
 		}
-		static MelderString buffer = { 0 };
-		MelderString_empty (& buffer);
-		MelderString_append (& buffer, L"Pitch (", Function_getUnitText (pitch, Pitch_LEVEL_FREQUENCY, unit, Function_UNIT_TEXT_GRAPHICAL), L")");
-		Graphics_textLeft (g, true, buffer.string);
-		Graphics_textBottom (g, true, L"Time (s)");
-		Graphics_marksBottom (g, 2, true, true, true);
+		Graphics_textLeft (g, true, Melder_cat (U"Pitch (", Function_getUnitText (pitch, Pitch_LEVEL_FREQUENCY, unit, Function_UNIT_TEXT_GRAPHICAL), U")"));
+		Graphics_textBottom (g, true, U"Time (s)");
+		Graphics_marksBottom (g, 2, true, true, false);
 	}
 }
 
@@ -660,14 +652,14 @@ void TextGrid_Pitch_draw (TextGrid grid, Pitch pitch, Graphics g,
 				Graphics_text (g, t, f0, point -> mark);
 			}
 		}
-		Graphics_setPercentSignIsItalic (g, TRUE);
-		Graphics_setNumberSignIsBold (g, TRUE);
-		Graphics_setCircumflexIsSuperscript (g, TRUE);
-		Graphics_setUnderscoreIsSubscript (g, TRUE);
+		Graphics_setPercentSignIsItalic (g, true);
+		Graphics_setNumberSignIsBold (g, true);
+		Graphics_setCircumflexIsSuperscript (g, true);
+		Graphics_setUnderscoreIsSubscript (g, true);
 		Graphics_setFontSize (g, oldFontSize);
 		Graphics_unsetInner (g);
 	} catch (MelderError) {
-		Melder_throw (grid, " & ", pitch, ": not drawn.");
+		Melder_throw (grid, U" & ", pitch, U": not drawn.");
 	}
 }
 
diff --git a/fon/TextGrid_Sound.h b/fon/TextGrid_Sound.h
index 2059ff5..814dc09 100644
--- a/fon/TextGrid_Sound.h
+++ b/fon/TextGrid_Sound.h
@@ -1,6 +1,6 @@
 /* TextGrid_Sound.h
  *
- * Copyright (C) 1992-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@ void TextGrid_Sound_draw (TextGrid me, Sound sound, Graphics g, double tmin, dou
 Collection TextGrid_Sound_extractAllIntervals (TextGrid me, Sound sound, long itier, int preserveTimes);
 Collection TextGrid_Sound_extractNonemptyIntervals (TextGrid me, Sound sound, long itier, int preserveTimes);
 Collection TextGrid_Sound_extractIntervalsWhere (TextGrid me, Sound sound,
-	long itier, int which_Melder_STRING, const wchar_t *text, int preserveTimes);
+	long itier, int which_Melder_STRING, const char32 *text, int preserveTimes);
 
 void TextGrid_Pitch_draw (TextGrid grid, Pitch pitch, Graphics g,
 	long itier, double tmin, double tmax, double fmin, double fmax,
@@ -35,6 +35,6 @@ void TextGrid_Pitch_drawSeparately (TextGrid grid, Pitch pitch, Graphics g, doub
 	double fmin, double fmax, int showBoundaries, int useTextStyles, int garnish, int speckle, int yscale);
 
 void TextGrid_anySound_alignInterval (TextGrid me, Function anySound, long tierNumber, long intervalNumber,
-	const wchar_t *languageName, bool includeWords, bool includePhonemes);
+	const char32 *languageName, bool includeWords, bool includePhonemes);
 
 /* End of file TextGrid_Sound.h */
diff --git a/fon/TextGrid_def.h b/fon/TextGrid_def.h
index 52b5bbf..13db9bf 100644
--- a/fon/TextGrid_def.h
+++ b/fon/TextGrid_def.h
@@ -1,6 +1,6 @@
 /* TextGrid_def.h
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,9 +25,9 @@ oo_DEFINE_CLASS (TextPoint, AnyPoint)
 
 	/* 'after' was a temporary attribute (19970211-19970307). */
 	#if oo_READING_TEXT
-		if (Thing_version == 1) texgetw2 (a_text);
+		if (formatVersion == 1) texgetw2 (a_text);
 	#elif oo_READING_BINARY
-		if (Thing_version == 1) bingetw2 (f);
+		if (formatVersion == 1) bingetw2 (f);
 	#endif
 
 oo_END_CLASS (TextPoint)
@@ -40,7 +40,8 @@ oo_DEFINE_CLASS (TextInterval, Function)
 	oo_STRING (text)
 
 	#if oo_DECLARING
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
+		int v_domainQuantity ()
+			override { return MelderQuantity_TIME_SECONDS; }
 	#endif
 
 oo_END_CLASS (TextInterval)
@@ -53,12 +54,17 @@ oo_DEFINE_CLASS (TextTier, Function)
 	oo_COLLECTION (SortedSetOfDouble, points, TextPoint, 0)
 
 	#if oo_DECLARING
-		long numberOfPoints () { return our points -> size; }
-		TextPoint point (long i) { return static_cast <TextPoint> (our points -> item [i]); }
-		void removePoints (int which_Melder_STRING, const wchar_t *criterion);
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
-		virtual void v_shiftX (double xfrom, double xto);
-		virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		long numberOfPoints () // accessor
+			{ return our points -> size; }
+		TextPoint& point (long i) // accessor
+			{ return reinterpret_cast <TextPoint&> (our points -> item [i]); }
+
+		int v_domainQuantity ()
+			override { return MelderQuantity_TIME_SECONDS; }
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
 	#endif
 
 oo_END_CLASS (TextTier)
@@ -71,13 +77,17 @@ oo_DEFINE_CLASS (IntervalTier, Function)
 	oo_COLLECTION (SortedSetOfDouble, intervals, TextInterval, 0)
 
 	#if oo_DECLARING
-		long numberOfIntervals () { return our intervals -> size; }
-		TextInterval interval (long i) { return static_cast <TextInterval> (our intervals -> item [i]); }
-		//template <class T> T& operator[] (long i) { return (T) (our intervals -> item [i]); }
-		//TextInterval* intervalss () { return (TextInterval *) (our intervals -> item); }
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
-		virtual void v_shiftX (double xfrom, double xto);
-		virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		long numberOfIntervals () // accessor
+			{ return our intervals -> size; }
+		TextInterval& interval (long i) // accessor
+			{ return reinterpret_cast <TextInterval&> (our intervals -> item [i]); }
+
+		int v_domainQuantity ()
+			override { return MelderQuantity_TIME_SECONDS; }
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
 	#endif
 
 oo_END_CLASS (IntervalTier)
@@ -90,14 +100,21 @@ oo_DEFINE_CLASS (TextGrid, Function)
 	oo_OBJECT (Ordered, 0, tiers)   // TextTier and IntervalTier objects
 
 	#if oo_DECLARING
-		long numberOfTiers () { return our tiers -> size; }
-		Function tier (long i) { return static_cast <Function> (our tiers -> item [i]); }
-		void removePoints (long tierNumber, int which_Melder_STRING, const wchar_t *criterion);
-		virtual void v_info ();
-		virtual void v_repair ();
-		virtual int v_domainQuantity () { return MelderQuantity_TIME_SECONDS; }
-		virtual void v_shiftX (double xfrom, double xto);
-		virtual void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto);
+		long numberOfTiers () // accessor
+			{ return our tiers -> size; }
+		Function& tier (long i) // accessor
+			{ return reinterpret_cast <Function&> (our tiers -> item [i]); }
+
+		void v_info ()
+			override;
+		void v_repair ()
+			override;
+		int v_domainQuantity ()
+			override { return MelderQuantity_TIME_SECONDS; }
+		void v_shiftX (double xfrom, double xto)
+			override;
+		void v_scaleX (double xminfrom, double xmaxfrom, double xminto, double xmaxto)
+			override;
 	#endif
 
 oo_END_CLASS (TextGrid)
diff --git a/fon/TimeSoundAnalysisEditor.cpp b/fon/TimeSoundAnalysisEditor.cpp
index 8afa1f1..532beb9 100644
--- a/fon/TimeSoundAnalysisEditor.cpp
+++ b/fon/TimeSoundAnalysisEditor.cpp
@@ -1,6 +1,6 @@
 /* TimeSoundAnalysisEditor.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -44,11 +44,11 @@ Thing_implement (TimeSoundAnalysisEditor, TimeSoundEditor, 0);
 #include "prefs_copyToInstance.h"
 #include "TimeSoundAnalysisEditor_prefs.h"
 
-static const wchar_t * theMessage_Cannot_compute_spectrogram = L"The spectrogram is not defined at the edge of the sound.";
-static const wchar_t * theMessage_Cannot_compute_pitch = L"The pitch contour is not defined at the edge of the sound.";
-static const wchar_t * theMessage_Cannot_compute_formant = L"The formants are not defined at the edge of the sound.";
-static const wchar_t * theMessage_Cannot_compute_intensity = L"The intensity curve is not defined at the edge of the sound.";
-static const wchar_t * theMessage_Cannot_compute_pulses = L"The pulses are not defined at the edge of the sound.";
+static const char32 * theMessage_Cannot_compute_spectrogram = U"The spectrogram is not defined at the edge of the sound.";
+static const char32 * theMessage_Cannot_compute_pitch = U"The pitch contour is not defined at the edge of the sound.";
+static const char32 * theMessage_Cannot_compute_formant = U"The formants are not defined at the edge of the sound.";
+static const char32 * theMessage_Cannot_compute_intensity = U"The intensity curve is not defined at the edge of the sound.";
+static const char32 * theMessage_Cannot_compute_pulses = U"The pulses are not defined at the edge of the sound.";
 
 void structTimeSoundAnalysisEditor :: v_destroy () {
 	v_destroy_analysis ();
@@ -59,80 +59,80 @@ void structTimeSoundAnalysisEditor :: v_info () {
 	TimeSoundAnalysisEditor_Parent :: v_info ();
 	if (v_hasSpectrogram ()) {
 		/* Spectrogram flag: */
-		MelderInfo_writeLine (L"Spectrogram show: ", Melder_boolean (p_spectrogram_show));
+		MelderInfo_writeLine (U"Spectrogram show: ", p_spectrogram_show);
 		/* Spectrogram settings: */
-		MelderInfo_writeLine (L"Spectrogram view from: ", Melder_double (p_spectrogram_viewFrom), L" Hz");
-		MelderInfo_writeLine (L"Spectrogram view to: ", Melder_double (p_spectrogram_viewTo), L" Hz");
-		MelderInfo_writeLine (L"Spectrogram window length: ", Melder_double (p_spectrogram_windowLength), L" seconds");
-		MelderInfo_writeLine (L"Spectrogram dynamic range: ", Melder_double (p_spectrogram_dynamicRange), L" dB");
+		MelderInfo_writeLine (U"Spectrogram view from: ", p_spectrogram_viewFrom, U" Hz");
+		MelderInfo_writeLine (U"Spectrogram view to: ", p_spectrogram_viewTo, U" Hz");
+		MelderInfo_writeLine (U"Spectrogram window length: ", p_spectrogram_windowLength, U" seconds");
+		MelderInfo_writeLine (U"Spectrogram dynamic range: ", p_spectrogram_dynamicRange, U" dB");
 		/* Advanced spectrogram settings: */
-		MelderInfo_writeLine (L"Spectrogram number of time steps: ", Melder_integer (p_spectrogram_timeSteps));
-		MelderInfo_writeLine (L"Spectrogram number of frequency steps: ", Melder_integer (p_spectrogram_frequencySteps));
-		MelderInfo_writeLine (L"Spectrogram method: ", L"Fourier");
-		MelderInfo_writeLine (L"Spectrogram window shape: ", kSound_to_Spectrogram_windowShape_getText (p_spectrogram_windowShape));
-		MelderInfo_writeLine (L"Spectrogram autoscaling: ", Melder_boolean (p_spectrogram_autoscaling));
-		MelderInfo_writeLine (L"Spectrogram maximum: ", Melder_double (p_spectrogram_maximum), L" dB/Hz");
-		MelderInfo_writeLine (L"Spectrogram pre-emphasis: ", Melder_integer (p_spectrogram_preemphasis), L" dB/octave");
-		MelderInfo_writeLine (L"Spectrogram dynamicCompression: ", Melder_integer (p_spectrogram_dynamicCompression));
+		MelderInfo_writeLine (U"Spectrogram number of time steps: ", p_spectrogram_timeSteps);
+		MelderInfo_writeLine (U"Spectrogram number of frequency steps: ", p_spectrogram_frequencySteps);
+		MelderInfo_writeLine (U"Spectrogram method: ", U"Fourier");
+		MelderInfo_writeLine (U"Spectrogram window shape: ", kSound_to_Spectrogram_windowShape_getText (p_spectrogram_windowShape));
+		MelderInfo_writeLine (U"Spectrogram autoscaling: ", p_spectrogram_autoscaling);
+		MelderInfo_writeLine (U"Spectrogram maximum: ", p_spectrogram_maximum, U" dB/Hz");
+		MelderInfo_writeLine (U"Spectrogram pre-emphasis: ", p_spectrogram_preemphasis, U" dB/octave");
+		MelderInfo_writeLine (U"Spectrogram dynamicCompression: ", p_spectrogram_dynamicCompression);
 		/* Dynamic information: */
-		MelderInfo_writeLine (L"Spectrogram cursor frequency: ", Melder_double (d_spectrogram_cursor), L" Hz");
+		MelderInfo_writeLine (U"Spectrogram cursor frequency: ", d_spectrogram_cursor, U" Hz");
 	}
 	if (v_hasPitch ()) {
 		/* Pitch flag: */
-		MelderInfo_writeLine (L"Pitch show: ", Melder_boolean (p_pitch_show));
+		MelderInfo_writeLine (U"Pitch show: ", p_pitch_show);
 		/* Pitch settings: */
-		MelderInfo_writeLine (L"Pitch floor: ", Melder_double (p_pitch_floor), L" Hz");
-		MelderInfo_writeLine (L"Pitch ceiling: ", Melder_double (p_pitch_ceiling), L" Hz");
-		MelderInfo_writeLine (L"Pitch unit: ", Function_getUnitText (Thing_dummyObject (Pitch), Pitch_LEVEL_FREQUENCY, p_pitch_unit, Function_UNIT_TEXT_MENU));
-		MelderInfo_writeLine (L"Pitch drawing method: ", kTimeSoundAnalysisEditor_pitch_drawingMethod_getText (p_pitch_drawingMethod));
+		MelderInfo_writeLine (U"Pitch floor: ", p_pitch_floor, U" Hz");
+		MelderInfo_writeLine (U"Pitch ceiling: ", p_pitch_ceiling, U" Hz");
+		MelderInfo_writeLine (U"Pitch unit: ", Function_getUnitText (Thing_dummyObject (Pitch), Pitch_LEVEL_FREQUENCY, p_pitch_unit, Function_UNIT_TEXT_MENU));
+		MelderInfo_writeLine (U"Pitch drawing method: ", kTimeSoundAnalysisEditor_pitch_drawingMethod_getText (p_pitch_drawingMethod));
 		/* Advanced pitch settings: */
-		MelderInfo_writeLine (L"Pitch view from: ", Melder_double (p_pitch_viewFrom), L" ", Function_getUnitText (Thing_dummyObject (Pitch), Pitch_LEVEL_FREQUENCY, p_pitch_unit, Function_UNIT_TEXT_MENU));
-		MelderInfo_writeLine (L"Pitch view to: ", Melder_double (p_pitch_viewTo), L" ", Function_getUnitText (Thing_dummyObject (Pitch), Pitch_LEVEL_FREQUENCY, p_pitch_unit, Function_UNIT_TEXT_MENU));
-		MelderInfo_writeLine (L"Pitch method: ", kTimeSoundAnalysisEditor_pitch_analysisMethod_getText (p_pitch_method));
-		MelderInfo_writeLine (L"Pitch very accurate: ", Melder_boolean (p_pitch_veryAccurate));
-		MelderInfo_writeLine (L"Pitch max. number of candidates: ", Melder_integer (p_pitch_maximumNumberOfCandidates));
-		MelderInfo_writeLine (L"Pitch silence threshold: ", Melder_double (p_pitch_silenceThreshold), L" of global peak");
-		MelderInfo_writeLine (L"Pitch voicing threshold: ", Melder_double (p_pitch_voicingThreshold), L" (periodic power / total power)");
-		MelderInfo_writeLine (L"Pitch octave cost: ", Melder_double (p_pitch_octaveCost), L" per octave");
-		MelderInfo_writeLine (L"Pitch octave jump cost: ", Melder_double (p_pitch_octaveJumpCost), L" per octave");
-		MelderInfo_writeLine (L"Pitch voiced/unvoiced cost: ", Melder_double (p_pitch_voicedUnvoicedCost));
+		MelderInfo_writeLine (U"Pitch view from: ", p_pitch_viewFrom, U" ", Function_getUnitText (Thing_dummyObject (Pitch), Pitch_LEVEL_FREQUENCY, p_pitch_unit, Function_UNIT_TEXT_MENU));
+		MelderInfo_writeLine (U"Pitch view to: ", p_pitch_viewTo, U" ", Function_getUnitText (Thing_dummyObject (Pitch), Pitch_LEVEL_FREQUENCY, p_pitch_unit, Function_UNIT_TEXT_MENU));
+		MelderInfo_writeLine (U"Pitch method: ", kTimeSoundAnalysisEditor_pitch_analysisMethod_getText (p_pitch_method));
+		MelderInfo_writeLine (U"Pitch very accurate: ", p_pitch_veryAccurate);
+		MelderInfo_writeLine (U"Pitch max. number of candidates: ", p_pitch_maximumNumberOfCandidates);
+		MelderInfo_writeLine (U"Pitch silence threshold: ", p_pitch_silenceThreshold, U" of global peak");
+		MelderInfo_writeLine (U"Pitch voicing threshold: ", p_pitch_voicingThreshold, U" (periodic power / total power)");
+		MelderInfo_writeLine (U"Pitch octave cost: ", p_pitch_octaveCost, U" per octave");
+		MelderInfo_writeLine (U"Pitch octave jump cost: ", p_pitch_octaveJumpCost, U" per octave");
+		MelderInfo_writeLine (U"Pitch voiced/unvoiced cost: ", p_pitch_voicedUnvoicedCost);
 	}
 	if (v_hasIntensity ()) {
 		/* Intensity flag: */
-		MelderInfo_writeLine (L"Intensity show: ", Melder_boolean (p_intensity_show));
+		MelderInfo_writeLine (U"Intensity show: ", p_intensity_show);
 		/* Intensity settings: */
-		MelderInfo_writeLine (L"Intensity view from: ", Melder_double (p_intensity_viewFrom), L" dB");
-		MelderInfo_writeLine (L"Intensity view to: ", Melder_double (p_intensity_viewTo), L" dB");
-		MelderInfo_writeLine (L"Intensity averaging method: ", kTimeSoundAnalysisEditor_intensity_averagingMethod_getText (p_intensity_averagingMethod));
-		MelderInfo_writeLine (L"Intensity subtract mean pressure: ", Melder_boolean (p_intensity_subtractMeanPressure));
+		MelderInfo_writeLine (U"Intensity view from: ", p_intensity_viewFrom, U" dB");
+		MelderInfo_writeLine (U"Intensity view to: ", p_intensity_viewTo, U" dB");
+		MelderInfo_writeLine (U"Intensity averaging method: ", kTimeSoundAnalysisEditor_intensity_averagingMethod_getText (p_intensity_averagingMethod));
+		MelderInfo_writeLine (U"Intensity subtract mean pressure: ", p_intensity_subtractMeanPressure);
 	}
 	if (v_hasFormants ()) {
 		/* Formant flag: */
-		MelderInfo_writeLine (L"Formant show: ", Melder_boolean (p_formant_show));
+		MelderInfo_writeLine (U"Formant show: ", p_formant_show);
 		/* Formant settings: */
-		MelderInfo_writeLine (L"Formant maximum formant: ", Melder_double (p_formant_maximumFormant), L" Hz");
-		MelderInfo_writeLine (L"Formant number of poles: ", Melder_integer (2 * p_formant_numberOfFormants));
-		MelderInfo_writeLine (L"Formant window length: ", Melder_double (p_formant_windowLength), L" seconds");
-		MelderInfo_writeLine (L"Formant dynamic range: ", Melder_double (p_formant_dynamicRange), L" dB");
-		MelderInfo_writeLine (L"Formant dot size: ", Melder_double (p_formant_dotSize), L" mm");
+		MelderInfo_writeLine (U"Formant maximum formant: ", p_formant_maximumFormant, U" Hz");
+		MelderInfo_writeLine (U"Formant number of poles: ", Melder_integer (2 * p_formant_numberOfFormants));   // should be a whole number
+		MelderInfo_writeLine (U"Formant window length: ", p_formant_windowLength, U" seconds");
+		MelderInfo_writeLine (U"Formant dynamic range: ", p_formant_dynamicRange, U" dB");
+		MelderInfo_writeLine (U"Formant dot size: ", p_formant_dotSize, U" mm");
 		/* Advanced formant settings: */
-		MelderInfo_writeLine (L"Formant method: ", kTimeSoundAnalysisEditor_formant_analysisMethod_getText (p_formant_method));
-		MelderInfo_writeLine (L"Formant pre-emphasis from: ", Melder_double (p_formant_preemphasisFrom), L" Hz");
+		MelderInfo_writeLine (U"Formant method: ", kTimeSoundAnalysisEditor_formant_analysisMethod_getText (p_formant_method));
+		MelderInfo_writeLine (U"Formant pre-emphasis from: ", p_formant_preemphasisFrom, U" Hz");
 	}
 	if (v_hasPulses ()) {
 		/* Pulses flag: */
-		MelderInfo_writeLine (L"Pulses show: ", Melder_boolean (p_pulses_show));
-		MelderInfo_writeLine (L"Pulses maximum period factor: ", Melder_double (p_pulses_maximumPeriodFactor));
-		MelderInfo_writeLine (L"Pulses maximum amplitude factor: ", Melder_double (p_pulses_maximumAmplitudeFactor));
+		MelderInfo_writeLine (U"Pulses show: ", p_pulses_show);
+		MelderInfo_writeLine (U"Pulses maximum period factor: ", p_pulses_maximumPeriodFactor);
+		MelderInfo_writeLine (U"Pulses maximum amplitude factor: ", p_pulses_maximumAmplitudeFactor);
 	}
 }
 
 void structTimeSoundAnalysisEditor :: v_destroy_analysis () {
-	forget (d_spectrogram);
-	forget (d_pitch);
+	//forget (d_spectrogram);
+	//forget (d_pitch);
 	forget (d_intensity);
-	forget (d_formant);
-	forget (d_pulses);
+	//forget_nozero (d_formant.peek());
+	//forget (d_pulses);
 }
 
 enum {
@@ -140,32 +140,32 @@ enum {
 	TimeSoundAnalysisEditor_PART_SELECTION = 2
 };
 
-static const wchar_t *TimeSoundAnalysisEditor_partString (int part) {
-	static const wchar_t *strings [] = { L"", L"CURSOR", L"SELECTION" };
+static const char32 *TimeSoundAnalysisEditor_partString (int part) {
+	static const char32 *strings [] = { U"", U"CURSOR", U"SELECTION" };
 	return strings [part];
 }
 
-static const wchar_t *TimeSoundAnalysisEditor_partString_locative (int part) {
-	static const wchar_t *strings [] = { L"", L"at CURSOR", L"in SELECTION" };
+static const char32 *TimeSoundAnalysisEditor_partString_locative (int part) {
+	static const char32 *strings [] = { U"", U"at CURSOR", U"in SELECTION" };
 	return strings [part];
 }
 
 static int makeQueriable (TimeSoundAnalysisEditor me, int allowCursor, double *tmin, double *tmax) {
 	if (my d_endWindow - my d_startWindow > my p_longestAnalysis) {
-		Melder_throw ("Window too long to show analyses. Zoom in to at most ", Melder_half (my p_longestAnalysis), " seconds "
-			"or set the \"longest analysis\" to at least ", Melder_half (my d_endWindow - my d_startWindow), " seconds.");
+		Melder_throw (U"Window too long to show analyses. Zoom in to at most ", Melder_half (my p_longestAnalysis), U" seconds "
+			U"or set the \"longest analysis\" to at least ", Melder_half (my d_endWindow - my d_startWindow), U" seconds.");
 	}
 	if (my d_startSelection == my d_endSelection) {
 		if (allowCursor) {
 			*tmin = *tmax = my d_startSelection;
 			return TimeSoundAnalysisEditor_PART_CURSOR;
 		} else {
-			Melder_throw ("Make a selection first.");
+			Melder_throw (U"Make a selection first.");
 		}
 	} else if (my d_startSelection < my d_startWindow || my d_endSelection > my d_endWindow) {
-		Melder_throw ("Command ambiguous: a part of the selection (", my d_startSelection, ", ", my d_endSelection, ") "
-			"is outside of the window (", my d_startWindow, ", ", my d_endWindow, "). "
-			"Either zoom or re-select.");
+		Melder_throw (U"Command ambiguous: a part of the selection (", my d_startSelection, U", ", my d_endSelection, U") "
+			U"is outside of the window (", my d_startWindow, U", ", my d_endWindow, U"). "
+			U"Either zoom or re-select.");
 	}
 	*tmin = my d_startSelection;
 	*tmax = my d_endSelection;
@@ -174,47 +174,47 @@ static int makeQueriable (TimeSoundAnalysisEditor me, int allowCursor, double *t
 
 static void menu_cb_logSettings (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Log settings", L"Log files")
-		OPTIONMENU (L"Write log 1 to", 3)
-			OPTION (L"Log file only")
-			OPTION (L"Info window only")
-			OPTION (L"Log file and Info window")
-		LABEL (L"", L"Log file 1:")
-		TEXTFIELD (L"Log file 1",   my default_log1_fileName ())
-		LABEL (L"", L"Log 1 format:")
-		TEXTFIELD (L"Log 1 format", my default_log1_format   ())
-		OPTIONMENU (L"Write log 2 to", 3)
-			OPTION (L"Log file only")
-			OPTION (L"Info window only")
-			OPTION (L"Log file and Info window")
-		LABEL (L"", L"Log file 2:")
-		TEXTFIELD (L"Log file 2",   my default_log2_fileName ())
-		LABEL (L"", L"Log 2 format:")
-		TEXTFIELD (L"Log 2 format", my default_log2_format   ())
-		LABEL (L"", L"Log script 3:")
-		TEXTFIELD (L"Log script 3", my default_logScript3    ())
-		LABEL (L"", L"Log script 4:")
-		TEXTFIELD (L"Log script 4", my default_logScript4    ())
+	EDITOR_FORM (U"Log settings", U"Log files")
+		OPTIONMENU (U"Write log 1 to", 3)
+			OPTION (U"Log file only")
+			OPTION (U"Info window only")
+			OPTION (U"Log file and Info window")
+		LABEL (U"", U"Log file 1:")
+		TEXTFIELD (U"Log file 1",   my default_log1_fileName ())
+		LABEL (U"", U"Log 1 format:")
+		TEXTFIELD (U"Log 1 format", my default_log1_format   ())
+		OPTIONMENU (U"Write log 2 to", 3)
+			OPTION (U"Log file only")
+			OPTION (U"Info window only")
+			OPTION (U"Log file and Info window")
+		LABEL (U"", U"Log file 2:")
+		TEXTFIELD (U"Log file 2",   my default_log2_fileName ())
+		LABEL (U"", U"Log 2 format:")
+		TEXTFIELD (U"Log 2 format", my default_log2_format   ())
+		LABEL (U"", U"Log script 3:")
+		TEXTFIELD (U"Log script 3", my default_logScript3    ())
+		LABEL (U"", U"Log script 4:")
+		TEXTFIELD (U"Log script 4", my default_logScript4    ())
 	EDITOR_OK
-		SET_INTEGER (L"Write log 1 to", my p_log1_toLogFile + 2 * my p_log1_toInfoWindow)
-		SET_STRING (L"Log file 1",      my p_log1_fileName)
-		SET_STRING (L"Log 1 format",    my p_log1_format)
-		SET_INTEGER (L"Write log 2 to", my p_log2_toLogFile + 2 * my p_log2_toInfoWindow)
-		SET_STRING (L"Log file 2",      my p_log2_fileName)
-		SET_STRING (L"Log 2 format",    my p_log2_format)
-		SET_STRING (L"Log script 3",    my p_logScript3)
-		SET_STRING (L"Log script 4",    my p_logScript4)
+		SET_INTEGER (U"Write log 1 to", my p_log1_toLogFile + 2 * my p_log1_toInfoWindow)
+		SET_STRING (U"Log file 1",      my p_log1_fileName)
+		SET_STRING (U"Log 1 format",    my p_log1_format)
+		SET_INTEGER (U"Write log 2 to", my p_log2_toLogFile + 2 * my p_log2_toInfoWindow)
+		SET_STRING (U"Log file 2",      my p_log2_fileName)
+		SET_STRING (U"Log 2 format",    my p_log2_format)
+		SET_STRING (U"Log script 3",    my p_logScript3)
+		SET_STRING (U"Log script 4",    my p_logScript4)
 	EDITOR_DO
-		my pref_log1_toLogFile    () = my p_log1_toLogFile    = (GET_INTEGER (L"Write log 1 to") & 1) != 0;
-		my pref_log1_toInfoWindow () = my p_log1_toInfoWindow = (GET_INTEGER (L"Write log 1 to") & 2) != 0;
-		pref_wcscpy2 (my pref_log1_fileName (), my p_log1_fileName, GET_STRING (L"Log file 1"));
-		pref_wcscpy2 (my pref_log1_format   (), my p_log1_format,   GET_STRING (L"Log 1 format"));
-		my pref_log2_toLogFile    () = my p_log2_toLogFile    = (GET_INTEGER (L"Write log 2 to") & 1) != 0;
-		my pref_log2_toInfoWindow () = my p_log2_toInfoWindow = (GET_INTEGER (L"Write log 2 to") & 2) != 0;
-		pref_wcscpy2 (my pref_log2_fileName (), my p_log2_fileName, GET_STRING (L"Log file 2"));
-		pref_wcscpy2 (my pref_log2_format   (), my p_log2_format,   GET_STRING (L"Log 2 format"));
-		pref_wcscpy2 (my pref_logScript3    (), my p_logScript3,    GET_STRING (L"Log script 3"));
-		pref_wcscpy2 (my pref_logScript4    (), my p_logScript4,    GET_STRING (L"Log script 4"));
+		my pref_log1_toLogFile    () = my p_log1_toLogFile    = (GET_INTEGER (U"Write log 1 to") & 1) != 0;
+		my pref_log1_toInfoWindow () = my p_log1_toInfoWindow = (GET_INTEGER (U"Write log 1 to") & 2) != 0;
+		pref_str32cpy2 (my pref_log1_fileName (), my p_log1_fileName, GET_STRING (U"Log file 1"));
+		pref_str32cpy2 (my pref_log1_format   (), my p_log1_format,   GET_STRING (U"Log 1 format"));
+		my pref_log2_toLogFile    () = my p_log2_toLogFile    = (GET_INTEGER (U"Write log 2 to") & 1) != 0;
+		my pref_log2_toInfoWindow () = my p_log2_toInfoWindow = (GET_INTEGER (U"Write log 2 to") & 2) != 0;
+		pref_str32cpy2 (my pref_log2_fileName (), my p_log2_fileName, GET_STRING (U"Log file 2"));
+		pref_str32cpy2 (my pref_log2_format   (), my p_log2_format,   GET_STRING (U"Log 2 format"));
+		pref_str32cpy2 (my pref_logScript3    (), my p_logScript3,    GET_STRING (U"Log script 3"));
+		pref_str32cpy2 (my pref_logScript4    (), my p_logScript4,    GET_STRING (U"Log script 4"));
 	EDITOR_END
 }
 
@@ -233,77 +233,77 @@ static void menu_cb_deleteLogFile2 (EDITOR_ARGS) {
 }
 
 static void do_log (TimeSoundAnalysisEditor me, int which) {
-	wchar_t format [Preferences_STRING_BUFFER_SIZE], *p;
+	char32 format [Preferences_STRING_BUFFER_SIZE], *p;
 	double tmin, tmax;
-	int part = makeQueriable (me, TRUE, & tmin, & tmax);
-	wcscpy (format, which == 1 ? my p_log1_format : my p_log2_format);
-	for (p = format; *p !='\0'; p ++) if (*p == '\'') {
+	int part = makeQueriable (me, true, & tmin, & tmax);
+	str32cpy (format, which == 1 ? my p_log1_format : my p_log2_format);
+	for (p = format; *p != U'\0'; p ++) if (*p == U'\'') {
 		/*
 		 * Found a left quote. Search for a matching right quote.
 		 */
-		wchar_t *q = p + 1, varName [300], *r, *s, *colon;
+		char32 *q = p + 1, varName [300], *r, *s, *colon;
 		int precision = -1;
 		double value = NUMundefined;
-		const wchar_t *stringValue = NULL;
-		while (*q != '\0' && *q != '\'') q ++;
-		if (*q == '\0') break;   /* No matching right quote: done with this line. */
+		const char32 *stringValue = NULL;
+		while (*q != U'\0' && *q != U'\'') q ++;
+		if (*q == U'\0') break;   /* No matching right quote: done with this line. */
 		if (q - p == 1) continue;   /* Ignore empty variable names. */
 		/*
 		 * Found a right quote. Get potential variable name.
 		 */
 		for (r = p + 1, s = varName; q - r > 0; r ++, s ++) *s = *r;
-		*s = '\0';   /* Trailing null byte. */
-		colon = wcschr (varName, ':');
+		*s = U'\0';   /* Trailing null byte. */
+		colon = str32chr (varName, U':');
 		if (colon) {
-			precision = wcstol (colon + 1, NULL, 10);
-			*colon = '\0';
+			precision = Melder_atoi (colon + 1);
+			*colon = U'\0';
 		}
-		if (wcsequ (varName, L"time")) {
+		if (str32equ (varName, U"time")) {
 			value = 0.5 * (tmin + tmax);
-		} else if (wcsequ (varName, L"t1")) {
+		} else if (str32equ (varName, U"t1")) {
 			value = tmin;
-		} else if (wcsequ (varName, L"t2")) {
+		} else if (str32equ (varName, U"t2")) {
 			value = tmax;
-		} else if (wcsequ (varName, L"dur")) {
+		} else if (str32equ (varName, U"dur")) {
 			value = tmax - tmin;
-		} else if (wcsequ (varName, L"freq")) {
+		} else if (str32equ (varName, U"freq")) {
 			value = my d_spectrogram_cursor;
-		} else if (wcsequ (varName, L"tab$")) {
-			stringValue = L"\t";
-		} else if (wcsequ (varName, L"editor$")) {
+		} else if (str32equ (varName, U"tab$")) {
+			stringValue = U"\t";
+		} else if (str32equ (varName, U"editor$")) {
 			stringValue = my name;
-		} else if (wcsequ (varName, L"f0")) {
+		} else if (str32equ (varName, U"f0")) {
 			if (! my p_pitch_show)
-				Melder_throw ("No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
+				Melder_throw (U"No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
 			if (! my d_pitch) {
 				Melder_throw (theMessage_Cannot_compute_pitch);
 			}
 			if (part == TimeSoundAnalysisEditor_PART_CURSOR) {
-				value = Pitch_getValueAtTime (my d_pitch, tmin, my p_pitch_unit, 1);
+				value = Pitch_getValueAtTime (my d_pitch.get(), tmin, my p_pitch_unit, 1);
 			} else {
-				value = Pitch_getMean (my d_pitch, tmin, tmax, my p_pitch_unit);
+				value = Pitch_getMean (my d_pitch.get(), tmin, tmax, my p_pitch_unit);
 			}
 		} else if (varName [0] == 'f' && varName [1] >= '1' && varName [1] <= '5' && varName [2] == '\0') {
 			if (! my p_formant_show)
-				Melder_throw ("No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
+				Melder_throw (U"No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
 			if (! my d_formant) {
 				Melder_throw (theMessage_Cannot_compute_formant);
 			}
 			if (part == TimeSoundAnalysisEditor_PART_CURSOR) {
-				value = Formant_getValueAtTime (my d_formant, varName [1] - '0', tmin, 0);
+				value = Formant_getValueAtTime (my d_formant.get(), (int) (varName [1] - U'0'), tmin, 0);
 			} else {
-				value = Formant_getMean (my d_formant, varName [1] - '0', tmin, tmax, 0);
+				value = Formant_getMean (my d_formant.get(), (int) (varName [1] - U'0'), tmin, tmax, 0);
 			}
-		} else if (varName [0] == 'b' && varName [1] >= '1' && varName [1] <= '5' && varName [2] == '\0') {
+		} else if (varName [0] == U'b' && varName [1] >= U'1' && varName [1] <= U'5' && varName [2] == U'\0') {
 			if (! my p_formant_show)
-				Melder_throw ("No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
+				Melder_throw (U"No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
 			if (! my d_formant) {
 				Melder_throw (theMessage_Cannot_compute_formant);
 			}
-			value = Formant_getBandwidthAtTime (my d_formant, varName [1] - '0', 0.5 * (tmin + tmax), 0);
-		} else if (wcsequ (varName, L"intensity")) {
+			value = Formant_getBandwidthAtTime (my d_formant.get(), (int) (varName [1] - U'0'), 0.5 * (tmin + tmax), 0);
+		} else if (str32equ (varName, U"intensity")) {
 			if (! my p_intensity_show)
-				Melder_throw ("No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
+				Melder_throw (U"No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
 			if (! my d_intensity) {
 				Melder_throw (theMessage_Cannot_compute_intensity);
 			}
@@ -312,38 +312,38 @@ static void do_log (TimeSoundAnalysisEditor me, int which) {
 			} else {
 				value = Intensity_getAverage (my d_intensity, tmin, tmax, my p_intensity_averagingMethod);
 			}
-		} else if (wcsequ (varName, L"power")) {
+		} else if (str32equ (varName, U"power")) {
 			if (! my p_spectrogram_show)
-				Melder_throw ("No spectrogram is visible.\nFirst choose \"Show spectrogram\" from the Spectrum menu.");
+				Melder_throw (U"No spectrogram is visible.\nFirst choose \"Show spectrogram\" from the Spectrum menu.");
 			if (! my d_spectrogram) {
 				Melder_throw (theMessage_Cannot_compute_spectrogram);
 			}
-			if (part != TimeSoundAnalysisEditor_PART_CURSOR) Melder_throw ("Click inside the spectrogram first.");
-			value = Matrix_getValueAtXY (my d_spectrogram, tmin, my d_spectrogram_cursor);
+			if (part != TimeSoundAnalysisEditor_PART_CURSOR) Melder_throw (U"Click inside the spectrogram first.");
+			value = Matrix_getValueAtXY (my d_spectrogram.get(), tmin, my d_spectrogram_cursor);
 		}
 		if (NUMdefined (value)) {
 			int varlen = (q - p) - 1, headlen = p - format;
-			wchar_t formattedNumber [400];
+			char32 formattedNumber [400];
 			if (precision >= 0) {
-				swprintf (formattedNumber, 400, L"%.*f", precision, value);
+				Melder_sprint (formattedNumber,400, Melder_fixed (value, precision));
 			} else {
-				swprintf (formattedNumber, 400, L"%.17g", value);
+				Melder_sprint (formattedNumber,400, value);
 			}
-			int arglen = wcslen (formattedNumber);
-			static MelderString buffer = { 0 };
+			int arglen = str32len (formattedNumber);
+			static MelderString buffer { 0 };
 			MelderString_ncopy (& buffer, format, headlen);
 			MelderString_append (& buffer, formattedNumber, p + varlen + 2);
-			wcscpy (format, buffer.string);
+			str32cpy (format, buffer.string);
 			p += arglen - 1;
 		} else if (stringValue != NULL) {
-			int varlen = (q - p) - 1, headlen = p - format, arglen = wcslen (stringValue);
-			static MelderString buffer = { 0 };
+			int varlen = (q - p) - 1, headlen = p - format, arglen = str32len (stringValue);
+			static MelderString buffer { 0 };
 			MelderString_ncopy (& buffer, format, headlen);
 			MelderString_append (& buffer, stringValue, p + varlen + 2);
-			wcscpy (format, buffer.string);
+			str32cpy (format, buffer.string);
 			p += arglen - 1;
 		} else {
-			p = q - 1;   /* Go to before next quote. */
+			p = q - 1;   // go to before next quote
 		}
 	}
 	if ((which == 1 && my p_log1_toInfoWindow) || (which == 2 && my p_log2_toInfoWindow)) {
@@ -352,7 +352,7 @@ static void do_log (TimeSoundAnalysisEditor me, int which) {
 	}
 	if ((which == 1 && my p_log1_toLogFile) || (which == 2 && my p_log2_toLogFile)) {
 		structMelderFile file = { 0 };
-		wcscat (format, L"\n");
+		str32cpy (format + str32len (format), U"\n");
 		Melder_relativePathToFile (which == 1 ? my p_log1_fileName : my p_log2_fileName, & file);
 		MelderFile_appendText (& file, format);
 	}
@@ -372,53 +372,53 @@ static void menu_cb_logScript4 (EDITOR_ARGS) {
 
 static void menu_cb_showAnalyses (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Show analyses", 0)
-		BOOLEAN  (L"Show spectrogram",     my default_spectrogram_show ())
-		BOOLEAN  (L"Show pitch",           my default_pitch_show       ())
-		BOOLEAN  (L"Show intensity",       my default_intensity_show   ())
-		BOOLEAN  (L"Show formants",        my default_formant_show     ())
-		BOOLEAN  (L"Show pulses",          my default_pulses_show      ())
-		POSITIVE (L"Longest analysis (s)", my default_longestAnalysis  ())
+	EDITOR_FORM (U"Show analyses", 0)
+		BOOLEAN  (U"Show spectrogram",     my default_spectrogram_show ())
+		BOOLEAN  (U"Show pitch",           my default_pitch_show       ())
+		BOOLEAN  (U"Show intensity",       my default_intensity_show   ())
+		BOOLEAN  (U"Show formants",        my default_formant_show     ())
+		BOOLEAN  (U"Show pulses",          my default_pulses_show      ())
+		POSITIVE (U"Longest analysis (s)", my default_longestAnalysis  ())
 	EDITOR_OK
-		SET_INTEGER (L"Show spectrogram", my p_spectrogram_show)
-		SET_INTEGER (L"Show pitch",       my p_pitch_show)
-		SET_INTEGER (L"Show intensity",   my p_intensity_show)
-		SET_INTEGER (L"Show formants",    my p_formant_show)
-		SET_INTEGER (L"Show pulses",      my p_pulses_show)
-		SET_REAL    (L"Longest analysis", my p_longestAnalysis)
+		SET_INTEGER (U"Show spectrogram", my p_spectrogram_show)
+		SET_INTEGER (U"Show pitch",       my p_pitch_show)
+		SET_INTEGER (U"Show intensity",   my p_intensity_show)
+		SET_INTEGER (U"Show formants",    my p_formant_show)
+		SET_INTEGER (U"Show pulses",      my p_pulses_show)
+		SET_REAL    (U"Longest analysis", my p_longestAnalysis)
 	EDITOR_DO
-		my spectrogramToggle -> f_check (my pref_spectrogram_show () = my p_spectrogram_show = GET_INTEGER (L"Show spectrogram"));
-		my pitchToggle       -> f_check (my pref_pitch_show       () = my p_pitch_show       = GET_INTEGER (L"Show pitch"));
-		my intensityToggle   -> f_check (my pref_intensity_show   () = my p_intensity_show   = GET_INTEGER (L"Show intensity"));
-		my formantToggle     -> f_check (my pref_formant_show     () = my p_formant_show     = GET_INTEGER (L"Show formants"));
-		my pulsesToggle      -> f_check (my pref_pulses_show      () = my p_pulses_show      = GET_INTEGER (L"Show pulses"));
-		my pref_longestAnalysis () = my p_longestAnalysis = GET_REAL (L"Longest analysis");
+		GuiMenuItem_check (my spectrogramToggle , my pref_spectrogram_show () = my p_spectrogram_show = GET_INTEGER (U"Show spectrogram"));
+		GuiMenuItem_check (my pitchToggle       , my pref_pitch_show       () = my p_pitch_show       = GET_INTEGER (U"Show pitch"));
+		GuiMenuItem_check (my intensityToggle   , my pref_intensity_show   () = my p_intensity_show   = GET_INTEGER (U"Show intensity"));
+		GuiMenuItem_check (my formantToggle     , my pref_formant_show     () = my p_formant_show     = GET_INTEGER (U"Show formants"));
+		GuiMenuItem_check (my pulsesToggle      , my pref_pulses_show      () = my p_pulses_show      = GET_INTEGER (U"Show pulses"));
+		my pref_longestAnalysis () = my p_longestAnalysis = GET_REAL (U"Longest analysis");
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
 
 static void menu_cb_timeStepSettings (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Time step settings", L"Time step settings...")
-		OPTIONMENU_ENUM (L"Time step strategy", kTimeSoundAnalysisEditor_timeStepStrategy, my default_timeStepStrategy ())
-		LABEL (L"", L"")
-		LABEL (L"", L"If the time step strategy is \"fixed\":")
-		POSITIVE (L"Fixed time step (s)", my default_fixedTimeStep ())
-		LABEL (L"", L"")
-		LABEL (L"", L"If the time step strategy is \"view-dependent\":")
-		NATURAL (L"Number of time steps per view", my default_numberOfTimeStepsPerView ())
+	EDITOR_FORM (U"Time step settings", U"Time step settings...")
+		OPTIONMENU_ENUM (U"Time step strategy", kTimeSoundAnalysisEditor_timeStepStrategy, my default_timeStepStrategy ())
+		LABEL (U"", U"")
+		LABEL (U"", U"If the time step strategy is \"fixed\":")
+		POSITIVE (U"Fixed time step (s)", my default_fixedTimeStep ())
+		LABEL (U"", U"")
+		LABEL (U"", U"If the time step strategy is \"view-dependent\":")
+		NATURAL (U"Number of time steps per view", my default_numberOfTimeStepsPerView ())
 	EDITOR_OK
-		SET_ENUM (L"Time step strategy", kTimeSoundAnalysisEditor_timeStepStrategy, my p_timeStepStrategy)
-		SET_REAL (L"Fixed time step", my p_fixedTimeStep)
-		SET_INTEGER (L"Number of time steps per view", my p_numberOfTimeStepsPerView)
+		SET_ENUM (U"Time step strategy", kTimeSoundAnalysisEditor_timeStepStrategy, my p_timeStepStrategy)
+		SET_REAL (U"Fixed time step", my p_fixedTimeStep)
+		SET_INTEGER (U"Number of time steps per view", my p_numberOfTimeStepsPerView)
 	EDITOR_DO
-		my pref_timeStepStrategy         () = my p_timeStepStrategy         = GET_ENUM    (kTimeSoundAnalysisEditor_timeStepStrategy, L"Time step strategy");
-		my pref_fixedTimeStep            () = my p_fixedTimeStep            = GET_REAL    (L"Fixed time step");
-		my pref_numberOfTimeStepsPerView () = my p_numberOfTimeStepsPerView = GET_INTEGER (L"Number of time steps per view");
-		forget (my d_pitch);
-		forget (my d_formant);
+		my pref_timeStepStrategy         () = my p_timeStepStrategy         = GET_ENUM    (kTimeSoundAnalysisEditor_timeStepStrategy, U"Time step strategy");
+		my pref_fixedTimeStep            () = my p_fixedTimeStep            = GET_REAL    (U"Fixed time step");
+		my pref_numberOfTimeStepsPerView () = my p_numberOfTimeStepsPerView = GET_INTEGER (U"Number of time steps per view");
+		my d_pitch. reset();
+		my d_formant. reset();
 		forget (my d_intensity);
-		forget (my d_pulses);
+		my d_pulses. reset();
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
@@ -428,24 +428,24 @@ static void menu_cb_timeStepSettings (EDITOR_ARGS) {
 static void menu_cb_showSpectrogram (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	my pref_spectrogram_show () = my p_spectrogram_show = ! my p_spectrogram_show;
-	my spectrogramToggle -> f_check (my p_spectrogram_show);   // in case we're called from a script
+	GuiMenuItem_check (my spectrogramToggle, my p_spectrogram_show);   // in case we're called from a script
 	FunctionEditor_redraw (me);
 }
 
 static void menu_cb_spectrogramSettings (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Spectrogram settings", L"Intro 3.2. Configuring the spectrogram")
-		REAL     (L"left View range (Hz)",  my default_spectrogram_viewFrom     ())
-		POSITIVE (L"right View range (Hz)", my default_spectrogram_viewTo       ())
-		POSITIVE (L"Window length (s)",     my default_spectrogram_windowLength ())
-		POSITIVE (L"Dynamic range (dB)",    my default_spectrogram_dynamicRange ())
-		LABEL    (L"note1", L"")
-		LABEL    (L"note2", L"")
+	EDITOR_FORM (U"Spectrogram settings", U"Intro 3.2. Configuring the spectrogram")
+		REAL     (U"left View range (Hz)",  my default_spectrogram_viewFrom     ())
+		POSITIVE (U"right View range (Hz)", my default_spectrogram_viewTo       ())
+		POSITIVE (U"Window length (s)",     my default_spectrogram_windowLength ())
+		POSITIVE (U"Dynamic range (dB)",    my default_spectrogram_dynamicRange ())
+		LABEL    (U"note1", U"")
+		LABEL    (U"note2", U"")
 	EDITOR_OK
-		SET_REAL (L"left View range",  my p_spectrogram_viewFrom)
-		SET_REAL (L"right View range", my p_spectrogram_viewTo)
-		SET_REAL (L"Window length",    my p_spectrogram_windowLength)
-		SET_REAL (L"Dynamic range",    my p_spectrogram_dynamicRange)
+		SET_REAL (U"left View range",  my p_spectrogram_viewFrom)
+		SET_REAL (U"right View range", my p_spectrogram_viewTo)
+		SET_REAL (U"Window length",    my p_spectrogram_windowLength)
+		SET_REAL (U"Dynamic range",    my p_spectrogram_dynamicRange)
 		if (my p_spectrogram_timeSteps          != Melder_atof (my default_spectrogram_timeSteps ()) ||
 			my p_spectrogram_frequencySteps     != Melder_atof (my default_spectrogram_frequencySteps ()) ||
 			my p_spectrogram_method             != my default_spectrogram_method () ||
@@ -455,110 +455,109 @@ static void menu_cb_spectrogramSettings (EDITOR_ARGS) {
 			my p_spectrogram_preemphasis        != Melder_atof (my default_spectrogram_preemphasis ()) ||
 			my p_spectrogram_dynamicCompression != Melder_atof (my default_spectrogram_dynamicCompression ()))
 		{
-			SET_STRING (L"note1", L"Warning: you have non-standard \"advanced settings\".")
+			SET_STRING (U"note1", U"Warning: you have non-standard \"advanced settings\".")
 		} else {
-			SET_STRING (L"note1", L"(all of your \"advanced settings\" have their standard values)")
+			SET_STRING (U"note1", U"(all of your \"advanced settings\" have their standard values)")
 		}
 		if (my p_timeStepStrategy != my default_timeStepStrategy ()) {
-			SET_STRING (L"note2", L"Warning: you have a non-standard \"time step strategy\".")
+			SET_STRING (U"note2", U"Warning: you have a non-standard \"time step strategy\".")
 		} else {
-			SET_STRING (L"note2", L"(your \"time step strategy\" has its standard value: automatic)")
+			SET_STRING (U"note2", U"(your \"time step strategy\" has its standard value: automatic)")
 		}
 	EDITOR_DO
-		my pref_spectrogram_viewFrom     () = my p_spectrogram_viewFrom     = GET_REAL (L"left View range");
-		my pref_spectrogram_viewTo       () = my p_spectrogram_viewTo       = GET_REAL (L"right View range");
-		my pref_spectrogram_windowLength () = my p_spectrogram_windowLength = GET_REAL (L"Window length");
-		my pref_spectrogram_dynamicRange () = my p_spectrogram_dynamicRange = GET_REAL (L"Dynamic range");
-		forget (my d_spectrogram);
+		my pref_spectrogram_viewFrom     () = my p_spectrogram_viewFrom     = GET_REAL (U"left View range");
+		my pref_spectrogram_viewTo       () = my p_spectrogram_viewTo       = GET_REAL (U"right View range");
+		my pref_spectrogram_windowLength () = my p_spectrogram_windowLength = GET_REAL (U"Window length");
+		my pref_spectrogram_dynamicRange () = my p_spectrogram_dynamicRange = GET_REAL (U"Dynamic range");
+		my d_spectrogram. reset();
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
 
 static void menu_cb_advancedSpectrogramSettings (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Advanced spectrogram settings", L"Advanced spectrogram settings...")
-		LABEL (L"", L"Time and frequency resolutions:")
-		NATURAL (L"Number of time steps",      my default_spectrogram_timeSteps          ())
-		NATURAL (L"Number of frequency steps", my default_spectrogram_frequencySteps     ())
-		LABEL (L"", L"Spectrogram analysis settings:")
-		OPTIONMENU_ENUM (L"Method",       kSound_to_Spectrogram_method,      my default_spectrogram_method ())
-		OPTIONMENU_ENUM (L"Window shape", kSound_to_Spectrogram_windowShape, my default_spectrogram_windowShape ())
-		LABEL (L"", L"Spectrogram view settings:")
-		BOOLEAN (L"Autoscaling",               my default_spectrogram_autoscaling        ())
-		REAL    (L"Maximum (dB/Hz)",           my default_spectrogram_maximum            ())
-		REAL    (L"Pre-emphasis (dB/oct)",     my default_spectrogram_preemphasis        ())
-		REAL    (L"Dynamic compression (0-1)", my default_spectrogram_dynamicCompression ())
+	EDITOR_FORM (U"Advanced spectrogram settings", U"Advanced spectrogram settings...")
+		LABEL (U"", U"Time and frequency resolutions:")
+		NATURAL (U"Number of time steps",      my default_spectrogram_timeSteps          ())
+		NATURAL (U"Number of frequency steps", my default_spectrogram_frequencySteps     ())
+		LABEL (U"", U"Spectrogram analysis settings:")
+		OPTIONMENU_ENUM (U"Method",       kSound_to_Spectrogram_method,      my default_spectrogram_method ())
+		OPTIONMENU_ENUM (U"Window shape", kSound_to_Spectrogram_windowShape, my default_spectrogram_windowShape ())
+		LABEL (U"", U"Spectrogram view settings:")
+		BOOLEAN (U"Autoscaling",               my default_spectrogram_autoscaling        ())
+		REAL    (U"Maximum (dB/Hz)",           my default_spectrogram_maximum            ())
+		REAL    (U"Pre-emphasis (dB/oct)",     my default_spectrogram_preemphasis        ())
+		REAL    (U"Dynamic compression (0-1)", my default_spectrogram_dynamicCompression ())
 	EDITOR_OK
-		SET_INTEGER (L"Number of time steps",      my p_spectrogram_timeSteps)
-		SET_INTEGER (L"Number of frequency steps", my p_spectrogram_frequencySteps)
-		SET_ENUM    (L"Method",       kSound_to_Spectrogram_method,      my p_spectrogram_method)
-		SET_ENUM    (L"Window shape", kSound_to_Spectrogram_windowShape, my p_spectrogram_windowShape)
-		SET_INTEGER (L"Autoscaling",               my p_spectrogram_autoscaling)
-		SET_REAL    (L"Maximum",                   my p_spectrogram_maximum)
-		SET_REAL    (L"Pre-emphasis",              my p_spectrogram_preemphasis)
-		SET_REAL    (L"Dynamic compression",       my p_spectrogram_dynamicCompression)
+		SET_INTEGER (U"Number of time steps",      my p_spectrogram_timeSteps)
+		SET_INTEGER (U"Number of frequency steps", my p_spectrogram_frequencySteps)
+		SET_ENUM    (U"Method",       kSound_to_Spectrogram_method,      my p_spectrogram_method)
+		SET_ENUM    (U"Window shape", kSound_to_Spectrogram_windowShape, my p_spectrogram_windowShape)
+		SET_INTEGER (U"Autoscaling",               my p_spectrogram_autoscaling)
+		SET_REAL    (U"Maximum",                   my p_spectrogram_maximum)
+		SET_REAL    (U"Pre-emphasis",              my p_spectrogram_preemphasis)
+		SET_REAL    (U"Dynamic compression",       my p_spectrogram_dynamicCompression)
 	EDITOR_DO
-		my pref_spectrogram_timeSteps          () = my p_spectrogram_timeSteps          = GET_INTEGER (L"Number of time steps");
-		my pref_spectrogram_frequencySteps     () = my p_spectrogram_frequencySteps     = GET_INTEGER (L"Number of frequency steps");
-		my pref_spectrogram_method             () = my p_spectrogram_method             = GET_ENUM (kSound_to_Spectrogram_method, L"Method");
-		my pref_spectrogram_windowShape        () = my p_spectrogram_windowShape        = GET_ENUM (kSound_to_Spectrogram_windowShape, L"Window shape");
-		my pref_spectrogram_autoscaling        () = my p_spectrogram_autoscaling        = GET_INTEGER (L"Autoscaling");
-		my pref_spectrogram_maximum            () = my p_spectrogram_maximum            = GET_REAL (L"Maximum");
-		my pref_spectrogram_preemphasis        () = my p_spectrogram_preemphasis        = GET_REAL (L"Pre-emphasis");
-		my pref_spectrogram_dynamicCompression () = my p_spectrogram_dynamicCompression = GET_REAL (L"Dynamic compression");
-		forget (my d_spectrogram);
+		my pref_spectrogram_timeSteps          () = my p_spectrogram_timeSteps          = GET_INTEGER (U"Number of time steps");
+		my pref_spectrogram_frequencySteps     () = my p_spectrogram_frequencySteps     = GET_INTEGER (U"Number of frequency steps");
+		my pref_spectrogram_method             () = my p_spectrogram_method             = GET_ENUM (kSound_to_Spectrogram_method, U"Method");
+		my pref_spectrogram_windowShape        () = my p_spectrogram_windowShape        = GET_ENUM (kSound_to_Spectrogram_windowShape, U"Window shape");
+		my pref_spectrogram_autoscaling        () = my p_spectrogram_autoscaling        = GET_INTEGER (U"Autoscaling");
+		my pref_spectrogram_maximum            () = my p_spectrogram_maximum            = GET_REAL (U"Maximum");
+		my pref_spectrogram_preemphasis        () = my p_spectrogram_preemphasis        = GET_REAL (U"Pre-emphasis");
+		my pref_spectrogram_dynamicCompression () = my p_spectrogram_dynamicCompression = GET_REAL (U"Dynamic compression");
+		my d_spectrogram. reset();
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
 
 static void menu_cb_getFrequency (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	Melder_informationReal (my d_spectrogram_cursor, L"Hz");
+	Melder_informationReal (my d_spectrogram_cursor, U"Hz");
 }
 
 static void menu_cb_getSpectralPowerAtCursorCross (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	double tmin, tmax;
-	int part = makeQueriable (me, TRUE, & tmin, & tmax);
+	int part = makeQueriable (me, true, & tmin, & tmax);
 	if (! my p_spectrogram_show)
-		Melder_throw ("No spectrogram is visible.\nFirst choose \"Show spectrogram\" from the Spectrum menu.");
+		Melder_throw (U"No spectrogram is visible.\nFirst choose \"Show spectrogram\" from the Spectrum menu.");
 	if (! my d_spectrogram) {
 		TimeSoundAnalysisEditor_computeSpectrogram (me);
 		if (! my d_spectrogram) Melder_throw (theMessage_Cannot_compute_spectrogram);
 	}
-	if (part != TimeSoundAnalysisEditor_PART_CURSOR) Melder_throw ("Click inside the spectrogram first.");
+	if (part != TimeSoundAnalysisEditor_PART_CURSOR) Melder_throw (U"Click inside the spectrogram first.");
 	MelderInfo_open ();
-	MelderInfo_write (Melder_double (Matrix_getValueAtXY (my d_spectrogram, tmin, my d_spectrogram_cursor)));
-	MelderInfo_write (L" Pa2/Hz (at time = ", Melder_double (tmin), L" seconds and frequency = ",
-		Melder_double (my d_spectrogram_cursor), L" Hz)");
+	MelderInfo_write (Matrix_getValueAtXY (my d_spectrogram.get(), tmin, my d_spectrogram_cursor),
+		U" Pa2/Hz (at time = ", tmin, U" seconds and frequency = ", my d_spectrogram_cursor, U" Hz)");
 	MelderInfo_close ();
 }
 
 static void menu_cb_moveFrequencyCursorTo (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	if (! my p_spectrogram_show)
-		Melder_throw ("No spectrogram is visible.\nFirst choose \"Show spectrogram\" from the Spectrum menu.");
-	EDITOR_FORM (L"Move frequency cursor to", 0)
-		REAL (L"Frequency (Hz)", L"0.0")
+		Melder_throw (U"No spectrogram is visible.\nFirst choose \"Show spectrogram\" from the Spectrum menu.");
+	EDITOR_FORM (U"Move frequency cursor to", 0)
+		REAL (U"Frequency (Hz)", U"0.0")
 	EDITOR_OK
-		SET_REAL (L"Frequency", my d_spectrogram_cursor)
+		SET_REAL (U"Frequency", my d_spectrogram_cursor)
 	EDITOR_DO
-		double frequency = GET_REAL (L"Frequency");
+		double frequency = GET_REAL (U"Frequency");
 		my d_spectrogram_cursor = frequency;
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
 
-static Sound extractSound (TimeSoundAnalysisEditor me, double tmin, double tmax) {
-	Sound sound = NULL;
+static autoSound extractSound (TimeSoundAnalysisEditor me, double tmin, double tmax) {
+	autoSound sound;
 	if (my d_longSound.data) {
 		if (tmin < my d_longSound.data -> xmin) tmin = my d_longSound.data -> xmin;
 		if (tmax > my d_longSound.data -> xmax) tmax = my d_longSound.data -> xmax;
-		sound = LongSound_extractPart (my d_longSound.data, tmin, tmax, TRUE);
+		sound = LongSound_extractPart (my d_longSound.data, tmin, tmax, true);
 	} else if (my d_sound.data) {
 		if (tmin < my d_sound.data -> xmin) tmin = my d_sound.data -> xmin;
 		if (tmax > my d_sound.data -> xmax) tmax = my d_sound.data -> xmax;
-		sound = Sound_extractPart (my d_sound.data, tmin, tmax, kSound_windowShape_RECTANGULAR, 1.0, TRUE);
+		sound = Sound_extractPart (my d_sound.data, tmin, tmax, kSound_windowShape_RECTANGULAR, 1.0, true);
 	}
 	return sound;
 }
@@ -566,13 +565,13 @@ static Sound extractSound (TimeSoundAnalysisEditor me, double tmin, double tmax)
 static void menu_cb_extractVisibleSpectrogram (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	if (! my p_spectrogram_show)
-		Melder_throw ("No spectrogram is visible.\nFirst choose \"Show spectrogram\" from the Spectrum menu.");
+		Melder_throw (U"No spectrogram is visible.\nFirst choose \"Show spectrogram\" from the Spectrum menu.");
 	if (! my d_spectrogram) {
 		TimeSoundAnalysisEditor_computeSpectrogram (me);
 		if (! my d_spectrogram) Melder_throw (theMessage_Cannot_compute_spectrogram);
 	}
-	autoSpectrogram publish = Data_copy (my d_spectrogram);
-	my broadcastPublication (publish.transfer());
+	autoSpectrogram publish = Data_copy (my d_spectrogram.get());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_viewSpectralSlice (EDITOR_ARGS) {
@@ -591,40 +590,37 @@ static void menu_cb_viewSpectralSlice (EDITOR_ARGS) {
 		my p_spectrogram_windowShape == kSound_to_Spectrogram_windowShape_WELCH ? kSound_windowShape_PARABOLIC :
 		my p_spectrogram_windowShape == kSound_to_Spectrogram_windowShape_HANNING ? kSound_windowShape_HANNING :
 		my p_spectrogram_windowShape == kSound_to_Spectrogram_windowShape_GAUSSIAN ? kSound_windowShape_GAUSSIAN_2 : kSound_windowShape_RECTANGULAR);
-	autoSpectrum publish = Sound_to_Spectrum (sound.peek(), TRUE);
-	static MelderString sliceName = { 0 };
-	MelderString_copy (& sliceName, my data == NULL ? L"untitled" : ((Data) my data) -> name);
-	MelderString_appendCharacter (& sliceName, '_');
-	MelderString_append (& sliceName, Melder_fixed (0.5 * (my d_startSelection + my d_endSelection), 3));
-	Thing_setName (publish.peek(), sliceName.string);
-	my broadcastPublication (publish.transfer());
+	autoSpectrum publish = Sound_to_Spectrum (sound.peek(), true);
+	Thing_setName (publish.peek(), Melder_cat (( my data == nullptr ? U"untitled" : ((Daata) my data) -> name ),
+		U"_", Melder_fixed (0.5 * (my d_startSelection + my d_endSelection), 3)));
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_paintVisibleSpectrogram (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Paint visible spectrogram", 0)
+	EDITOR_FORM (U"Paint visible spectrogram", 0)
 		my v_form_pictureWindow (cmd);
 		my v_form_pictureMargins (cmd);
 		my v_form_pictureSelection (cmd);
-		BOOLEAN (L"Garnish", 1);
+		BOOLEAN (U"Garnish", 1);
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
 		my v_ok_pictureMargins (cmd);
 		my v_ok_pictureSelection (cmd);
-		SET_INTEGER (L"Garnish", my p_spectrogram_picture_garnish);
+		SET_INTEGER (U"Garnish", my p_spectrogram_picture_garnish);
 	EDITOR_DO
 		my v_do_pictureWindow (cmd);
 		my v_do_pictureMargins (cmd);
 		my v_do_pictureSelection (cmd);
-		my pref_spectrogram_picture_garnish () = my p_spectrogram_picture_garnish = GET_INTEGER (L"Garnish");
+		my pref_spectrogram_picture_garnish () = my p_spectrogram_picture_garnish = GET_INTEGER (U"Garnish");
 		if (! my p_spectrogram_show)
-			Melder_throw ("No spectrogram is visible.\nFirst choose \"Show spectrogram\" from the Spectrum menu.");
+			Melder_throw (U"No spectrogram is visible.\nFirst choose \"Show spectrogram\" from the Spectrum menu.");
 		if (! my d_spectrogram) {
 			TimeSoundAnalysisEditor_computeSpectrogram (me);
 			if (! my d_spectrogram) Melder_throw (theMessage_Cannot_compute_spectrogram);
 		}
 		Editor_openPraatPicture (me);
-		Spectrogram_paint (my d_spectrogram, my pictureGraphics, my d_startWindow, my d_endWindow, my p_spectrogram_viewFrom, my p_spectrogram_viewTo,
+		Spectrogram_paint (my d_spectrogram.get(), my pictureGraphics, my d_startWindow, my d_endWindow, my p_spectrogram_viewFrom, my p_spectrogram_viewTo,
 			my p_spectrogram_maximum, my p_spectrogram_autoscaling, my p_spectrogram_dynamicRange, my p_spectrogram_preemphasis,
 			my p_spectrogram_dynamicCompression, my p_spectrogram_picture_garnish);
 		FunctionEditor_garnish (me);
@@ -637,28 +633,28 @@ static void menu_cb_paintVisibleSpectrogram (EDITOR_ARGS) {
 static void menu_cb_showPitch (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	my pref_pitch_show () = my p_pitch_show = ! my p_pitch_show;
-	my pitchToggle -> f_check (my p_pitch_show);   // in case we're called from a script
+	GuiMenuItem_check (my pitchToggle, my p_pitch_show);   // in case we're called from a script
 	FunctionEditor_redraw (me);
 }
 
 static void menu_cb_pitchSettings (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Pitch settings", L"Intro 4.2. Configuring the pitch contour")
-		POSITIVE (L"left Pitch range (Hz)", my default_pitch_floor ())
-		POSITIVE (L"right Pitch range (Hz)", my default_pitch_ceiling ())
-		OPTIONMENU_ENUM (L"Unit", kPitch_unit, my default_pitch_unit ())
-		LABEL (L"opt1", L"The autocorrelation method optimizes for intonation research;")
-		LABEL (L"opt2", L"and the cross-correlation method optimizes for voice research:")
-		RADIO_ENUM (L"Analysis method", kTimeSoundAnalysisEditor_pitch_analysisMethod, my default_pitch_method ())
-		OPTIONMENU_ENUM (L"Drawing method", kTimeSoundAnalysisEditor_pitch_drawingMethod, my default_pitch_drawingMethod ())
-		LABEL (L"note1", L"")
-		LABEL (L"note2", L"")
+	EDITOR_FORM (U"Pitch settings", U"Intro 4.2. Configuring the pitch contour")
+		POSITIVE (U"left Pitch range (Hz)", my default_pitch_floor ())
+		POSITIVE (U"right Pitch range (Hz)", my default_pitch_ceiling ())
+		OPTIONMENU_ENUM (U"Unit", kPitch_unit, my default_pitch_unit ())
+		LABEL (U"opt1", U"The autocorrelation method optimizes for intonation research;")
+		LABEL (U"opt2", U"and the cross-correlation method optimizes for voice research:")
+		RADIO_ENUM (U"Analysis method", kTimeSoundAnalysisEditor_pitch_analysisMethod, my default_pitch_method ())
+		OPTIONMENU_ENUM (U"Drawing method", kTimeSoundAnalysisEditor_pitch_drawingMethod, my default_pitch_drawingMethod ())
+		LABEL (U"note1", U"")
+		LABEL (U"note2", U"")
 	EDITOR_OK
-		SET_REAL (L"left Pitch range", my p_pitch_floor)
-		SET_REAL (L"right Pitch range", my p_pitch_ceiling)
-		SET_ENUM (L"Unit", kPitch_unit, my p_pitch_unit)
-		SET_ENUM (L"Analysis method", kTimeSoundAnalysisEditor_pitch_analysisMethod, my p_pitch_method)
-		SET_ENUM (L"Drawing method", kTimeSoundAnalysisEditor_pitch_drawingMethod, my p_pitch_drawingMethod)
+		SET_REAL (U"left Pitch range", my p_pitch_floor)
+		SET_REAL (U"right Pitch range", my p_pitch_ceiling)
+		SET_ENUM (U"Unit", kPitch_unit, my p_pitch_unit)
+		SET_ENUM (U"Analysis method", kTimeSoundAnalysisEditor_pitch_analysisMethod, my p_pitch_method)
+		SET_ENUM (U"Drawing method", kTimeSoundAnalysisEditor_pitch_drawingMethod, my p_pitch_drawingMethod)
 		if (my p_pitch_viewFrom                  != Melder_atof (my default_pitch_viewFrom ()) ||
 			my p_pitch_viewTo                    != Melder_atof (my default_pitch_viewTo ()) ||
 			my p_pitch_veryAccurate              != my default_pitch_veryAccurate () ||
@@ -669,67 +665,67 @@ static void menu_cb_pitchSettings (EDITOR_ARGS) {
 			my p_pitch_octaveJumpCost            != Melder_atof (my default_pitch_octaveJumpCost ()) ||
 			my p_pitch_voicedUnvoicedCost        != Melder_atof (my default_pitch_voicedUnvoicedCost ()))
 		{
-			SET_STRING (L"note1", L"Warning: you have some non-standard \"advanced settings\".")
+			SET_STRING (U"note1", U"Warning: you have some non-standard \"advanced settings\".")
 		} else {
-			SET_STRING (L"note1", L"(all of your \"advanced settings\" have their standard values)")
+			SET_STRING (U"note1", U"(all of your \"advanced settings\" have their standard values)")
 		}
 		if (my p_timeStepStrategy != my default_timeStepStrategy ()) {
-			SET_STRING (L"note2", L"Warning: you have a non-standard \"time step strategy\".")
+			SET_STRING (U"note2", U"Warning: you have a non-standard \"time step strategy\".")
 		} else {
-			SET_STRING (L"note2", L"(your \"time step strategy\" has its standard value: automatic)")
+			SET_STRING (U"note2", U"(your \"time step strategy\" has its standard value: automatic)")
 		}
 	EDITOR_DO
-		my pref_pitch_floor         () = my p_pitch_floor         = GET_REAL (L"left Pitch range");
-		my pref_pitch_ceiling       () = my p_pitch_ceiling       = GET_REAL (L"right Pitch range");
-		my pref_pitch_unit          () = my p_pitch_unit          = GET_ENUM (kPitch_unit, L"Unit");
-		my pref_pitch_method        () = my p_pitch_method        = GET_ENUM (kTimeSoundAnalysisEditor_pitch_analysisMethod, L"Analysis method");
-		my pref_pitch_drawingMethod () = my p_pitch_drawingMethod = GET_ENUM (kTimeSoundAnalysisEditor_pitch_drawingMethod, L"Drawing method");
-		forget (my d_pitch);
+		my pref_pitch_floor         () = my p_pitch_floor         = GET_REAL (U"left Pitch range");
+		my pref_pitch_ceiling       () = my p_pitch_ceiling       = GET_REAL (U"right Pitch range");
+		my pref_pitch_unit          () = my p_pitch_unit          = GET_ENUM (kPitch_unit, U"Unit");
+		my pref_pitch_method        () = my p_pitch_method        = GET_ENUM (kTimeSoundAnalysisEditor_pitch_analysisMethod, U"Analysis method");
+		my pref_pitch_drawingMethod () = my p_pitch_drawingMethod = GET_ENUM (kTimeSoundAnalysisEditor_pitch_drawingMethod, U"Drawing method");
+		my d_pitch. reset();
 		forget (my d_intensity);
-		forget (my d_pulses);
+		my d_pulses. reset();
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
 
 static void menu_cb_advancedPitchSettings (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Advanced pitch settings", L"Advanced pitch settings...")
-		LABEL   (L"", L"Make view range different from analysis range:")
-		REAL    (L"left View range (units)",   my default_pitch_viewFrom                  ())
-		REAL    (L"right View range (units)",  my default_pitch_viewTo                    ())
-		LABEL   (L"", L"Analysis settings:")
-		BOOLEAN (L"Very accurate", 0)
-		NATURAL (L"Max. number of candidates", my default_pitch_maximumNumberOfCandidates ())
-		REAL    (L"Silence threshold",         my default_pitch_silenceThreshold          ())
-		REAL    (L"Voicing threshold",         my default_pitch_voicingThreshold          ())
-		REAL    (L"Octave cost",               my default_pitch_octaveCost                ())
-		REAL    (L"Octave-jump cost",          my default_pitch_octaveJumpCost            ())
-		REAL    (L"Voiced / unvoiced cost",    my default_pitch_voicedUnvoicedCost        ())
+	EDITOR_FORM (U"Advanced pitch settings", U"Advanced pitch settings...")
+		LABEL   (U"", U"Make view range different from analysis range:")
+		REAL    (U"left View range (units)",   my default_pitch_viewFrom                  ())
+		REAL    (U"right View range (units)",  my default_pitch_viewTo                    ())
+		LABEL   (U"", U"Analysis settings:")
+		BOOLEAN (U"Very accurate", 0)
+		NATURAL (U"Max. number of candidates", my default_pitch_maximumNumberOfCandidates ())
+		REAL    (U"Silence threshold",         my default_pitch_silenceThreshold          ())
+		REAL    (U"Voicing threshold",         my default_pitch_voicingThreshold          ())
+		REAL    (U"Octave cost",               my default_pitch_octaveCost                ())
+		REAL    (U"Octave-jump cost",          my default_pitch_octaveJumpCost            ())
+		REAL    (U"Voiced / unvoiced cost",    my default_pitch_voicedUnvoicedCost        ())
 	EDITOR_OK
-		SET_REAL    (L"left View range",           my p_pitch_viewFrom)
-		SET_REAL    (L"right View range",          my p_pitch_viewTo)
-		SET_INTEGER (L"Very accurate",             my p_pitch_veryAccurate)
-		SET_INTEGER (L"Max. number of candidates", my p_pitch_maximumNumberOfCandidates)
-		SET_REAL    (L"Silence threshold",         my p_pitch_silenceThreshold)
-		SET_REAL    (L"Voicing threshold",         my p_pitch_voicingThreshold)
-		SET_REAL    (L"Octave cost",               my p_pitch_octaveCost)
-		SET_REAL    (L"Octave-jump cost",          my p_pitch_octaveJumpCost)
-		SET_REAL    (L"Voiced / unvoiced cost",    my p_pitch_voicedUnvoicedCost)
+		SET_REAL    (U"left View range",           my p_pitch_viewFrom)
+		SET_REAL    (U"right View range",          my p_pitch_viewTo)
+		SET_INTEGER (U"Very accurate",             my p_pitch_veryAccurate)
+		SET_INTEGER (U"Max. number of candidates", my p_pitch_maximumNumberOfCandidates)
+		SET_REAL    (U"Silence threshold",         my p_pitch_silenceThreshold)
+		SET_REAL    (U"Voicing threshold",         my p_pitch_voicingThreshold)
+		SET_REAL    (U"Octave cost",               my p_pitch_octaveCost)
+		SET_REAL    (U"Octave-jump cost",          my p_pitch_octaveJumpCost)
+		SET_REAL    (U"Voiced / unvoiced cost",    my p_pitch_voicedUnvoicedCost)
 	EDITOR_DO
-		long maxnCandidates = GET_INTEGER (L"Max. number of candidates");
-		if (maxnCandidates < 2) Melder_throw ("Maximum number of candidates must be greater than 1.");
-		my pref_pitch_viewFrom                  () = my p_pitch_viewFrom                  = GET_REAL    (L"left View range");
-		my pref_pitch_viewTo                    () = my p_pitch_viewTo                    = GET_REAL    (L"right View range");
-		my pref_pitch_veryAccurate              () = my p_pitch_veryAccurate              = GET_INTEGER (L"Very accurate");
-		my pref_pitch_maximumNumberOfCandidates () = my p_pitch_maximumNumberOfCandidates = GET_INTEGER (L"Max. number of candidates");
-		my pref_pitch_silenceThreshold          () = my p_pitch_silenceThreshold          = GET_REAL    (L"Silence threshold");
-		my pref_pitch_voicingThreshold          () = my p_pitch_voicingThreshold          = GET_REAL    (L"Voicing threshold");
-		my pref_pitch_octaveCost                () = my p_pitch_octaveCost                = GET_REAL    (L"Octave cost");
-		my pref_pitch_octaveJumpCost            () = my p_pitch_octaveJumpCost            = GET_REAL    (L"Octave-jump cost");
-		my pref_pitch_voicedUnvoicedCost        () = my p_pitch_voicedUnvoicedCost        = GET_REAL    (L"Voiced / unvoiced cost");
-		forget (my d_pitch);
+		long maxnCandidates = GET_INTEGER (U"Max. number of candidates");
+		if (maxnCandidates < 2) Melder_throw (U"Maximum number of candidates must be greater than 1.");
+		my pref_pitch_viewFrom                  () = my p_pitch_viewFrom                  = GET_REAL    (U"left View range");
+		my pref_pitch_viewTo                    () = my p_pitch_viewTo                    = GET_REAL    (U"right View range");
+		my pref_pitch_veryAccurate              () = my p_pitch_veryAccurate              = GET_INTEGER (U"Very accurate");
+		my pref_pitch_maximumNumberOfCandidates () = my p_pitch_maximumNumberOfCandidates = GET_INTEGER (U"Max. number of candidates");
+		my pref_pitch_silenceThreshold          () = my p_pitch_silenceThreshold          = GET_REAL    (U"Silence threshold");
+		my pref_pitch_voicingThreshold          () = my p_pitch_voicingThreshold          = GET_REAL    (U"Voicing threshold");
+		my pref_pitch_octaveCost                () = my p_pitch_octaveCost                = GET_REAL    (U"Octave cost");
+		my pref_pitch_octaveJumpCost            () = my p_pitch_octaveJumpCost            = GET_REAL    (U"Octave-jump cost");
+		my pref_pitch_voicedUnvoicedCost        () = my p_pitch_voicedUnvoicedCost        = GET_REAL    (U"Voiced / unvoiced cost");
+		my d_pitch. reset();
 		forget (my d_intensity);
-		forget (my d_pulses);
+		my d_pulses. reset();
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
@@ -737,27 +733,27 @@ static void menu_cb_advancedPitchSettings (EDITOR_ARGS) {
 static void menu_cb_pitchListing (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	double tmin, tmax;
-	int part = makeQueriable (me, TRUE, & tmin, & tmax);
+	int part = makeQueriable (me, true, & tmin, & tmax);
 	if (! my p_pitch_show)
-		Melder_throw ("No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
+		Melder_throw (U"No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
 	if (! my d_pitch) {
 		TimeSoundAnalysisEditor_computePitch (me);
 		if (! my d_pitch) Melder_throw (theMessage_Cannot_compute_pitch);
 	}
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Time_s   F0_", Function_getUnitText (my d_pitch, Pitch_LEVEL_FREQUENCY, my p_pitch_unit, Function_UNIT_TEXT_SHORT));
+	MelderInfo_writeLine (U"Time_s   F0_", Function_getUnitText (my d_pitch.peek(), Pitch_LEVEL_FREQUENCY, my p_pitch_unit, Function_UNIT_TEXT_SHORT));
 	if (part == TimeSoundAnalysisEditor_PART_CURSOR) {
-		double f0 = Pitch_getValueAtTime (my d_pitch, tmin, my p_pitch_unit, TRUE);
-		f0 = Function_convertToNonlogarithmic (my d_pitch, f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-		MelderInfo_writeLine (Melder_fixed (tmin, 6), L"   ", Melder_fixed (f0, 6));
+		double f0 = Pitch_getValueAtTime (my d_pitch.get(), tmin, my p_pitch_unit, true);
+		f0 = Function_convertToNonlogarithmic (my d_pitch.get(), f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		MelderInfo_writeLine (Melder_fixed (tmin, 6), U"   ", Melder_fixed (f0, 6));
 	} else {
 		long i, i1, i2;
-		Sampled_getWindowSamples (my d_pitch, tmin, tmax, & i1, & i2);
+		Sampled_getWindowSamples (my d_pitch.get(), tmin, tmax, & i1, & i2);
 		for (i = i1; i <= i2; i ++) {
-			double t = Sampled_indexToX (my d_pitch, i);
-			double f0 = Sampled_getValueAtSample (my d_pitch, i, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-			f0 = Function_convertToNonlogarithmic (my d_pitch, f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-			MelderInfo_writeLine (Melder_fixed (t, 6), L"   ", Melder_fixed (f0, 6));
+			double t = Sampled_indexToX (my d_pitch.get(), i);
+			double f0 = Sampled_getValueAtSample (my d_pitch.get(), i, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+			f0 = Function_convertToNonlogarithmic (my d_pitch.get(), f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+			MelderInfo_writeLine (Melder_fixed (t, 6), U"   ", Melder_fixed (f0, 6));
 		}
 	}
 	MelderInfo_close ();
@@ -766,74 +762,74 @@ static void menu_cb_pitchListing (EDITOR_ARGS) {
 static void menu_cb_getPitch (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	double tmin, tmax;
-	int part = makeQueriable (me, TRUE, & tmin, & tmax);
+	int part = makeQueriable (me, true, & tmin, & tmax);
 	if (! my p_pitch_show)
-		Melder_throw ("No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
+		Melder_throw (U"No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
 	if (! my d_pitch) {
 		TimeSoundAnalysisEditor_computePitch (me);
 		if (! my d_pitch) Melder_throw (theMessage_Cannot_compute_pitch);
 	}
 	if (part == TimeSoundAnalysisEditor_PART_CURSOR) {
-		double f0 = Pitch_getValueAtTime (my d_pitch, tmin, my p_pitch_unit, TRUE);
-		f0 = Function_convertToNonlogarithmic (my d_pitch, f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-		Melder_information (Melder_double (f0), L" ", Function_getUnitText (my d_pitch, Pitch_LEVEL_FREQUENCY, my p_pitch_unit, 0),
-			L" (interpolated pitch at CURSOR)");
+		double f0 = Pitch_getValueAtTime (my d_pitch.get(), tmin, my p_pitch_unit, true);
+		f0 = Function_convertToNonlogarithmic (my d_pitch.get(), f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		Melder_information (f0, U" ", Function_getUnitText (my d_pitch.get(), Pitch_LEVEL_FREQUENCY, my p_pitch_unit, 0),
+			U" (interpolated pitch at CURSOR)");
 	} else {
-		double f0 = Pitch_getMean (my d_pitch, tmin, tmax, my p_pitch_unit);
-		f0 = Function_convertToNonlogarithmic (my d_pitch, f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-		Melder_information (Melder_double (f0), L" ", Function_getUnitText (my d_pitch, Pitch_LEVEL_FREQUENCY, my p_pitch_unit, 0),
-			L" (mean pitch ", TimeSoundAnalysisEditor_partString_locative (part), L")");
+		double f0 = Pitch_getMean (my d_pitch.get(), tmin, tmax, my p_pitch_unit);
+		f0 = Function_convertToNonlogarithmic (my d_pitch.get(), f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		Melder_information (f0, U" ", Function_getUnitText (my d_pitch.get(), Pitch_LEVEL_FREQUENCY, my p_pitch_unit, 0),
+			U" (mean pitch ", TimeSoundAnalysisEditor_partString_locative (part), U")");
 	}
 }
 
 static void menu_cb_getMinimumPitch (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	double tmin, tmax, f0;
-	int part = makeQueriable (me, FALSE, & tmin, & tmax);
+	int part = makeQueriable (me, false, & tmin, & tmax);
 	if (! my p_pitch_show)
-		Melder_throw ("No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
+		Melder_throw (U"No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
 	if (! my d_pitch) {
 		TimeSoundAnalysisEditor_computePitch (me);
 		if (! my d_pitch) Melder_throw (theMessage_Cannot_compute_pitch);
 	}
-	f0 = Pitch_getMinimum (my d_pitch, tmin, tmax, my p_pitch_unit, TRUE);
-	f0 = Function_convertToNonlogarithmic (my d_pitch, f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-	Melder_information (Melder_double (f0), L" ", Function_getUnitText (my d_pitch, Pitch_LEVEL_FREQUENCY, my p_pitch_unit, 0),
-		L" (minimum pitch ", TimeSoundAnalysisEditor_partString_locative (part), L")");
+	f0 = Pitch_getMinimum (my d_pitch.get(), tmin, tmax, my p_pitch_unit, true);
+	f0 = Function_convertToNonlogarithmic (my d_pitch.get(), f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+	Melder_information (f0, U" ", Function_getUnitText (my d_pitch.get(), Pitch_LEVEL_FREQUENCY, my p_pitch_unit, 0),
+		U" (minimum pitch ", TimeSoundAnalysisEditor_partString_locative (part), U")");
 }
 
 static void menu_cb_getMaximumPitch (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	double tmin, tmax, f0;
-	int part = makeQueriable (me, FALSE, & tmin, & tmax);
+	int part = makeQueriable (me, false, & tmin, & tmax);
 	if (! my p_pitch_show)
-		Melder_throw ("No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
+		Melder_throw (U"No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
 	if (! my d_pitch) {
 		TimeSoundAnalysisEditor_computePitch (me);
 		if (! my d_pitch) Melder_throw (theMessage_Cannot_compute_pitch);   // BUG
 	}
-	f0 = Pitch_getMaximum (my d_pitch, tmin, tmax, my p_pitch_unit, TRUE);
-	f0 = Function_convertToNonlogarithmic (my d_pitch, f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-	Melder_information (Melder_double (f0), L" ", Function_getUnitText (my d_pitch, Pitch_LEVEL_FREQUENCY, my p_pitch_unit, 0),
-		L" (maximum pitch ", TimeSoundAnalysisEditor_partString_locative (part), L")");
+	f0 = Pitch_getMaximum (my d_pitch.get(), tmin, tmax, my p_pitch_unit, true);
+	f0 = Function_convertToNonlogarithmic (my d_pitch.get(), f0, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+	Melder_information (f0, U" ", Function_getUnitText (my d_pitch.get(), Pitch_LEVEL_FREQUENCY, my p_pitch_unit, 0),
+		U" (maximum pitch ", TimeSoundAnalysisEditor_partString_locative (part), U")");
 }
 
 static void menu_cb_moveCursorToMinimumPitch (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	if (! my p_pitch_show)
-		Melder_throw ("No pitch contour is visible.\nFirst choose \"Show pitch\" from the View menu.");
+		Melder_throw (U"No pitch contour is visible.\nFirst choose \"Show pitch\" from the View menu.");
 	if (! my d_pitch) {
 		TimeSoundAnalysisEditor_computePitch (me);
 		if (! my d_pitch) Melder_throw (theMessage_Cannot_compute_pitch);
 	}
 	if (my d_startSelection == my d_endSelection) {
-		Melder_throw ("Empty selection.");
+		Melder_throw (U"Empty selection.");
 	} else {
 		double time;
-		Pitch_getMinimumAndTime (my d_pitch, my d_startSelection, my d_endSelection,
+		Pitch_getMinimumAndTime (my d_pitch.get(), my d_startSelection, my d_endSelection,
 			my p_pitch_unit, 1, NULL, & time);
 		if (! NUMdefined (time))
-			Melder_throw ("Selection is voiceless.");
+			Melder_throw (U"Selection is voiceless.");
 		my d_startSelection = my d_endSelection = time;
 		FunctionEditor_marksChanged (me, true);
 	}
@@ -842,19 +838,19 @@ static void menu_cb_moveCursorToMinimumPitch (EDITOR_ARGS) {
 static void menu_cb_moveCursorToMaximumPitch (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	if (! my p_pitch_show)
-		Melder_throw ("No pitch contour is visible.\nFirst choose \"Show pitch\" from the View menu.");
+		Melder_throw (U"No pitch contour is visible.\nFirst choose \"Show pitch\" from the View menu.");
 	if (! my d_pitch) {
 		TimeSoundAnalysisEditor_computePitch (me);
 		if (! my d_pitch) Melder_throw (theMessage_Cannot_compute_pitch);
 	}
 	if (my d_startSelection == my d_endSelection) {
-		Melder_throw (L"Empty selection.");
+		Melder_throw (U"Empty selection.");
 	} else {
 		double time;
-		Pitch_getMaximumAndTime (my d_pitch, my d_startSelection, my d_endSelection,
+		Pitch_getMaximumAndTime (my d_pitch.get(), my d_startSelection, my d_endSelection,
 			my p_pitch_unit, 1, NULL, & time);
 		if (! NUMdefined (time))
-			Melder_throw (L"Selection is voiceless.");
+			Melder_throw (U"Selection is voiceless.");
 		my d_startSelection = my d_endSelection = time;
 		FunctionEditor_marksChanged (me, true);
 	}
@@ -863,50 +859,50 @@ static void menu_cb_moveCursorToMaximumPitch (EDITOR_ARGS) {
 static void menu_cb_extractVisiblePitchContour (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	if (! my p_pitch_show)
-		Melder_throw ("No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
+		Melder_throw (U"No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
 	if (! my d_pitch) {
 		TimeSoundAnalysisEditor_computePitch (me);
 		if (! my d_pitch) Melder_throw (theMessage_Cannot_compute_pitch);
 	}
-	autoPitch publish = Data_copy (my d_pitch);
-	my broadcastPublication (publish.transfer());
+	autoPitch publish = Data_copy (my d_pitch.get());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_drawVisiblePitchContour (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Draw visible pitch contour", 0)
+	EDITOR_FORM (U"Draw visible pitch contour", 0)
 		my v_form_pictureWindow (cmd);
-		LABEL (L"", L"Pitch:")
-		BOOLEAN (L"Speckle", 0);
+		LABEL (U"", U"Pitch:")
+		BOOLEAN (U"Speckle", 0);
 		my v_form_pictureMargins (cmd);
 		my v_form_pictureSelection (cmd);
-		BOOLEAN (L"Garnish", 1);
+		BOOLEAN (U"Garnish", 1);
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
-		SET_INTEGER (L"Speckle", my p_pitch_picture_speckle);
+		SET_INTEGER (U"Speckle", my p_pitch_picture_speckle);
 		my v_ok_pictureMargins (cmd);
 		my v_ok_pictureSelection (cmd);
-		SET_INTEGER (L"Garnish", my p_pitch_picture_garnish);
+		SET_INTEGER (U"Garnish", my p_pitch_picture_garnish);
 	EDITOR_DO
 		my v_do_pictureWindow (cmd);
-		my pref_pitch_picture_speckle () = my p_pitch_picture_speckle = GET_INTEGER (L"Speckle");
+		my pref_pitch_picture_speckle () = my p_pitch_picture_speckle = GET_INTEGER (U"Speckle");
 		my v_do_pictureMargins (cmd);
 		my v_do_pictureSelection (cmd);
-		my pref_pitch_picture_garnish () = my p_pitch_picture_garnish = GET_INTEGER (L"Garnish");
+		my pref_pitch_picture_garnish () = my p_pitch_picture_garnish = GET_INTEGER (U"Garnish");
 		if (! my p_pitch_show)
-			Melder_throw ("No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
+			Melder_throw (U"No pitch contour is visible.\nFirst choose \"Show pitch\" from the Pitch menu.");
 		if (! my d_pitch) {
 			TimeSoundAnalysisEditor_computePitch (me);
 			if (! my d_pitch) Melder_throw (theMessage_Cannot_compute_pitch);
 		}
 		Editor_openPraatPicture (me);
-		double pitchFloor_hidden = Function_convertStandardToSpecialUnit (my d_pitch, my p_pitch_floor, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-		double pitchCeiling_hidden = Function_convertStandardToSpecialUnit (my d_pitch, my p_pitch_ceiling, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-		double pitchFloor_overt = Function_convertToNonlogarithmic (my d_pitch, pitchFloor_hidden, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
-		double pitchCeiling_overt = Function_convertToNonlogarithmic (my d_pitch, pitchCeiling_hidden, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		double pitchFloor_hidden = Function_convertStandardToSpecialUnit (my d_pitch.get(), my p_pitch_floor, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		double pitchCeiling_hidden = Function_convertStandardToSpecialUnit (my d_pitch.get(), my p_pitch_ceiling, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		double pitchFloor_overt = Function_convertToNonlogarithmic (my d_pitch.get(), pitchFloor_hidden, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+		double pitchCeiling_overt = Function_convertToNonlogarithmic (my d_pitch.get(), pitchCeiling_hidden, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
 		double pitchViewFrom_overt = my p_pitch_viewFrom < my p_pitch_viewTo ? my p_pitch_viewFrom : pitchFloor_overt;
 		double pitchViewTo_overt = my p_pitch_viewFrom < my p_pitch_viewTo ? my p_pitch_viewTo : pitchCeiling_overt;
-		Pitch_draw (my d_pitch, my pictureGraphics, my d_startWindow, my d_endWindow, pitchViewFrom_overt, pitchViewTo_overt,
+		Pitch_draw (my d_pitch.get(), my pictureGraphics, my d_startWindow, my d_endWindow, pitchViewFrom_overt, pitchViewTo_overt,
 			my p_pitch_picture_garnish, my p_pitch_picture_speckle, my p_pitch_unit);
 		FunctionEditor_garnish (me);
 		Editor_closePraatPicture (me);
@@ -918,34 +914,34 @@ static void menu_cb_drawVisiblePitchContour (EDITOR_ARGS) {
 static void menu_cb_showIntensity (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	my pref_intensity_show () = my p_intensity_show = ! my p_intensity_show;
-	my intensityToggle -> f_check (my p_intensity_show);   // in case we're called from a script
+	GuiMenuItem_check (my intensityToggle, my p_intensity_show);   // in case we're called from a script
 	FunctionEditor_redraw (me);
 }
 
 static void menu_cb_intensitySettings (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Intensity settings", L"Intro 6.2. Configuring the intensity contour")
-		REAL (L"left View range (dB)",  my default_intensity_viewFrom ())
-		REAL (L"right View range (dB)", my default_intensity_viewTo   ())
-		RADIO_ENUM (L"Averaging method", kTimeSoundAnalysisEditor_intensity_averagingMethod, my default_intensity_averagingMethod ())
-		BOOLEAN (L"Subtract mean pressure", my default_intensity_subtractMeanPressure ())
-		LABEL (L"", L"Note: the pitch floor is taken from the pitch settings.")
-		LABEL (L"note2", L"")
+	EDITOR_FORM (U"Intensity settings", U"Intro 6.2. Configuring the intensity contour")
+		REAL (U"left View range (dB)",  my default_intensity_viewFrom ())
+		REAL (U"right View range (dB)", my default_intensity_viewTo   ())
+		RADIO_ENUM (U"Averaging method", kTimeSoundAnalysisEditor_intensity_averagingMethod, my default_intensity_averagingMethod ())
+		BOOLEAN (U"Subtract mean pressure", my default_intensity_subtractMeanPressure ())
+		LABEL (U"", U"Note: the pitch floor is taken from the pitch settings.")
+		LABEL (U"note2", U"")
 	EDITOR_OK
-		SET_REAL (L"left View range",  my p_intensity_viewFrom)
-		SET_REAL (L"right View range", my p_intensity_viewTo)
-		SET_ENUM (L"Averaging method", kTimeSoundAnalysisEditor_intensity_averagingMethod, my p_intensity_averagingMethod)
-		SET_INTEGER (L"Subtract mean pressure", my p_intensity_subtractMeanPressure)
+		SET_REAL (U"left View range",  my p_intensity_viewFrom)
+		SET_REAL (U"right View range", my p_intensity_viewTo)
+		SET_ENUM (U"Averaging method", kTimeSoundAnalysisEditor_intensity_averagingMethod, my p_intensity_averagingMethod)
+		SET_INTEGER (U"Subtract mean pressure", my p_intensity_subtractMeanPressure)
 		if (my p_timeStepStrategy != my default_timeStepStrategy ()) {
-			SET_STRING (L"note2", L"Warning: you have a non-standard \"time step strategy\".")
+			SET_STRING (U"note2", U"Warning: you have a non-standard \"time step strategy\".")
 		} else {
-			SET_STRING (L"note2", L"(your \"time step strategy\" has its standard value: automatic)")
+			SET_STRING (U"note2", U"(your \"time step strategy\" has its standard value: automatic)")
 		}
 	EDITOR_DO
-		my pref_intensity_viewFrom             () = my p_intensity_viewFrom             = GET_REAL    (L"left View range");
-		my pref_intensity_viewTo               () = my p_intensity_viewTo               = GET_REAL    (L"right View range");
-		my pref_intensity_averagingMethod      () = my p_intensity_averagingMethod      = GET_ENUM    (kTimeSoundAnalysisEditor_intensity_averagingMethod, L"Averaging method");
-		my pref_intensity_subtractMeanPressure () = my p_intensity_subtractMeanPressure = GET_INTEGER (L"Subtract mean pressure");
+		my pref_intensity_viewFrom             () = my p_intensity_viewFrom             = GET_REAL    (U"left View range");
+		my pref_intensity_viewTo               () = my p_intensity_viewTo               = GET_REAL    (U"right View range");
+		my pref_intensity_averagingMethod      () = my p_intensity_averagingMethod      = GET_ENUM    (kTimeSoundAnalysisEditor_intensity_averagingMethod, U"Averaging method");
+		my pref_intensity_subtractMeanPressure () = my p_intensity_subtractMeanPressure = GET_INTEGER (U"Subtract mean pressure");
 		forget (my d_intensity);
 		FunctionEditor_redraw (me);
 	EDITOR_END
@@ -954,34 +950,34 @@ static void menu_cb_intensitySettings (EDITOR_ARGS) {
 static void menu_cb_extractVisibleIntensityContour (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	if (! my p_intensity_show)
-		Melder_throw ("No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
+		Melder_throw (U"No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
 	if (! my d_intensity) {
 		TimeSoundAnalysisEditor_computeIntensity (me);
 		if (! my d_intensity) Melder_throw (theMessage_Cannot_compute_intensity);
 	}
 	autoIntensity publish = Data_copy (my d_intensity);
-	my broadcastPublication (publish.transfer());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_drawVisibleIntensityContour (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Draw visible intensity contour", 0)
+	EDITOR_FORM (U"Draw visible intensity contour", 0)
 		my v_form_pictureWindow (cmd);
 		my v_form_pictureMargins (cmd);
 		my v_form_pictureSelection (cmd);
-		BOOLEAN (L"Garnish", 1);
+		BOOLEAN (U"Garnish", 1);
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
 		my v_ok_pictureMargins (cmd);
 		my v_ok_pictureSelection (cmd);
-		SET_INTEGER (L"Garnish", my p_intensity_picture_garnish);
+		SET_INTEGER (U"Garnish", my p_intensity_picture_garnish);
 	EDITOR_DO
 		my v_do_pictureWindow (cmd);
 		my v_do_pictureMargins (cmd);
 		my v_do_pictureSelection (cmd);
-		my pref_intensity_picture_garnish () = my p_intensity_picture_garnish = GET_INTEGER (L"Garnish");
+		my pref_intensity_picture_garnish () = my p_intensity_picture_garnish = GET_INTEGER (U"Garnish");
 		if (! my p_intensity_show)
-			Melder_throw ("No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
+			Melder_throw (U"No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
 		if (! my d_intensity) {
 			TimeSoundAnalysisEditor_computeIntensity (me);
 			if (! my d_intensity) Melder_throw (theMessage_Cannot_compute_intensity);
@@ -997,25 +993,25 @@ static void menu_cb_drawVisibleIntensityContour (EDITOR_ARGS) {
 static void menu_cb_intensityListing (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	double tmin, tmax;
-	int part = makeQueriable (me, TRUE, & tmin, & tmax);
+	int part = makeQueriable (me, true, & tmin, & tmax);
 	if (! my p_intensity_show)
-		Melder_throw ("No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
+		Melder_throw (U"No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
 	if (! my d_intensity) {
 		TimeSoundAnalysisEditor_computeIntensity (me);
 		if (! my d_intensity) Melder_throw (theMessage_Cannot_compute_intensity);
 	}
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Time_s   Intensity_dB");
+	MelderInfo_writeLine (U"Time_s   Intensity_dB");
 	if (part == TimeSoundAnalysisEditor_PART_CURSOR) {
 		double intensity = Vector_getValueAtX (my d_intensity, tmin, Vector_CHANNEL_1, Vector_VALUE_INTERPOLATION_LINEAR);
-		MelderInfo_writeLine (Melder_fixed (tmin, 6), L"   ", Melder_fixed (intensity, 6));
+		MelderInfo_writeLine (Melder_fixed (tmin, 6), U"   ", Melder_fixed (intensity, 6));
 	} else {
 		long i, i1, i2;
 		Sampled_getWindowSamples (my d_intensity, tmin, tmax, & i1, & i2);
 		for (i = i1; i <= i2; i ++) {
 			double t = Sampled_indexToX (my d_intensity, i);
 			double intensity = Vector_getValueAtX (my d_intensity, t, Vector_CHANNEL_1, Vector_VALUE_INTERPOLATION_NEAREST);
-			MelderInfo_writeLine (Melder_fixed (t, 6), L"   ", Melder_fixed (intensity, 6));
+			MelderInfo_writeLine (Melder_fixed (t, 6), U"   ", Melder_fixed (intensity, 6));
 		}
 	}
 	MelderInfo_close ();
@@ -1024,48 +1020,48 @@ static void menu_cb_intensityListing (EDITOR_ARGS) {
 static void menu_cb_getIntensity (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	double tmin, tmax;
-	int part = makeQueriable (me, TRUE, & tmin, & tmax);
+	int part = makeQueriable (me, true, & tmin, & tmax);
 	if (! my p_intensity_show)
-		Melder_throw ("No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
+		Melder_throw (U"No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
 	if (! my d_intensity) {
 		TimeSoundAnalysisEditor_computeIntensity (me);
 		if (! my d_intensity) Melder_throw (theMessage_Cannot_compute_intensity);
 	}
 	if (part == TimeSoundAnalysisEditor_PART_CURSOR) {
-		Melder_information (Melder_double (Vector_getValueAtX (my d_intensity, tmin, Vector_CHANNEL_1, Vector_VALUE_INTERPOLATION_LINEAR)), L" dB (intensity at CURSOR)");
+		Melder_information (Vector_getValueAtX (my d_intensity, tmin, Vector_CHANNEL_1, Vector_VALUE_INTERPOLATION_LINEAR), U" dB (intensity at CURSOR)");
 	} else {
-		static const wchar_t *methodString [] = { L"median", L"mean-energy", L"mean-sones", L"mean-dB" };
-		Melder_information (Melder_double (Intensity_getAverage (my d_intensity, tmin, tmax, my p_intensity_averagingMethod)),
-			L" dB (", methodString [my p_intensity_averagingMethod], L" intensity ", TimeSoundAnalysisEditor_partString_locative (part), L")");
+		static const char32 *methodString [] = { U"median", U"mean-energy", U"mean-sones", U"mean-dB" };
+		Melder_information (Intensity_getAverage (my d_intensity, tmin, tmax, my p_intensity_averagingMethod),
+			U" dB (", methodString [my p_intensity_averagingMethod], U" intensity ", TimeSoundAnalysisEditor_partString_locative (part), U")");
 	}
 }
 
 static void menu_cb_getMinimumIntensity (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	double tmin, tmax;
-	int part = makeQueriable (me, FALSE, & tmin, & tmax);
+	int part = makeQueriable (me, false, & tmin, & tmax);
 	if (! my p_intensity_show)
-		Melder_throw ("No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
+		Melder_throw (U"No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
 	if (! my d_intensity) {
 		TimeSoundAnalysisEditor_computeIntensity (me);
 		if (! my d_intensity) Melder_throw (theMessage_Cannot_compute_intensity);
 	}
 	double intensity = Vector_getMinimum (my d_intensity, tmin, tmax, NUM_PEAK_INTERPOLATE_PARABOLIC);
-	Melder_information (Melder_double (intensity), L" dB (minimum intensity ", TimeSoundAnalysisEditor_partString_locative (part), L")");
+	Melder_information (intensity, U" dB (minimum intensity ", TimeSoundAnalysisEditor_partString_locative (part), U")");
 }
 
 static void menu_cb_getMaximumIntensity (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	double tmin, tmax;
-	int part = makeQueriable (me, FALSE, & tmin, & tmax);
+	int part = makeQueriable (me, false, & tmin, & tmax);
 	if (! my p_intensity_show)
-		Melder_throw ("No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
+		Melder_throw (U"No intensity contour is visible.\nFirst choose \"Show intensity\" from the Intensity menu.");
 	if (! my d_intensity) {
 		TimeSoundAnalysisEditor_computeIntensity (me);
 		if (! my d_intensity) Melder_throw (theMessage_Cannot_compute_intensity);
 	}
 	double intensity = Vector_getMaximum (my d_intensity, tmin, tmax, NUM_PEAK_INTERPOLATE_PARABOLIC);
-	Melder_information (Melder_double (intensity), L" dB (maximum intensity ", TimeSoundAnalysisEditor_partString_locative (part), L")");
+	Melder_information (intensity, U" dB (maximum intensity ", TimeSoundAnalysisEditor_partString_locative (part), U")");
 }
 
 /***** FORMANT MENU *****/
@@ -1073,59 +1069,59 @@ static void menu_cb_getMaximumIntensity (EDITOR_ARGS) {
 static void menu_cb_showFormants (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	my pref_formant_show () = my p_formant_show = ! my p_formant_show;
-	my formantToggle -> f_check (my p_formant_show);   // in case we're called from a script
+	GuiMenuItem_check (my formantToggle, my p_formant_show);   // in case we're called from a script
 	FunctionEditor_redraw (me);
 }
 
 static void menu_cb_formantSettings (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Formant settings", L"Intro 5.2. Configuring the formant contours")
-		POSITIVE (L"Maximum formant (Hz)", my default_formant_maximumFormant   ())
-		POSITIVE (L"Number of formants",   my default_formant_numberOfFormants ())
-		POSITIVE (L"Window length (s)",    my default_formant_windowLength     ())
-		REAL     (L"Dynamic range (dB)",   my default_formant_dynamicRange     ())
-		POSITIVE (L"Dot size (mm)",        my default_formant_dotSize          ())
-		LABEL    (L"note1", L"")
-		LABEL    (L"note2", L"")
+	EDITOR_FORM (U"Formant settings", U"Intro 5.2. Configuring the formant contours")
+		POSITIVE (U"Maximum formant (Hz)", my default_formant_maximumFormant   ())
+		POSITIVE (U"Number of formants",   my default_formant_numberOfFormants ())
+		POSITIVE (U"Window length (s)",    my default_formant_windowLength     ())
+		REAL     (U"Dynamic range (dB)",   my default_formant_dynamicRange     ())
+		POSITIVE (U"Dot size (mm)",        my default_formant_dotSize          ())
+		LABEL    (U"note1", U"")
+		LABEL    (U"note2", U"")
 	EDITOR_OK
-		SET_REAL (L"Maximum formant",    my p_formant_maximumFormant)
-		SET_REAL (L"Number of formants", my p_formant_numberOfFormants)
-		SET_REAL (L"Window length",      my p_formant_windowLength)
-		SET_REAL (L"Dynamic range",      my p_formant_dynamicRange)
-		SET_REAL (L"Dot size",           my p_formant_dotSize)
+		SET_REAL (U"Maximum formant",    my p_formant_maximumFormant)
+		SET_REAL (U"Number of formants", my p_formant_numberOfFormants)
+		SET_REAL (U"Window length",      my p_formant_windowLength)
+		SET_REAL (U"Dynamic range",      my p_formant_dynamicRange)
+		SET_REAL (U"Dot size",           my p_formant_dotSize)
 		if (my p_formant_method != my default_formant_method () || my p_formant_preemphasisFrom != Melder_atof (my default_formant_preemphasisFrom ())) {
-			SET_STRING (L"note1", L"Warning: you have non-standard \"advanced settings\".")
+			SET_STRING (U"note1", U"Warning: you have non-standard \"advanced settings\".")
 		} else {
-			SET_STRING (L"note1", L"(all of your \"advanced settings\" have their standard values)")
+			SET_STRING (U"note1", U"(all of your \"advanced settings\" have their standard values)")
 		}
 		if (my p_timeStepStrategy != my default_timeStepStrategy ()) {
-			SET_STRING (L"note2", L"Warning: you have a non-standard \"time step strategy\".")
+			SET_STRING (U"note2", U"Warning: you have a non-standard \"time step strategy\".")
 		} else {
-			SET_STRING (L"note2", L"(your \"time step strategy\" has its standard value: automatic)")
+			SET_STRING (U"note2", U"(your \"time step strategy\" has its standard value: automatic)")
 		}
 	EDITOR_DO
-		my pref_formant_maximumFormant   () = my p_formant_maximumFormant   = GET_REAL (L"Maximum formant");
-		my pref_formant_numberOfFormants () = my p_formant_numberOfFormants = GET_REAL (L"Number of formants");
-		my pref_formant_windowLength     () = my p_formant_windowLength     = GET_REAL (L"Window length");
-		my pref_formant_dynamicRange     () = my p_formant_dynamicRange     = GET_REAL (L"Dynamic range");
-		my pref_formant_dotSize          () = my p_formant_dotSize          = GET_REAL (L"Dot size");
-		forget (my d_formant);
+		my pref_formant_maximumFormant   () = my p_formant_maximumFormant   = GET_REAL (U"Maximum formant");
+		my pref_formant_numberOfFormants () = my p_formant_numberOfFormants = GET_REAL (U"Number of formants");
+		my pref_formant_windowLength     () = my p_formant_windowLength     = GET_REAL (U"Window length");
+		my pref_formant_dynamicRange     () = my p_formant_dynamicRange     = GET_REAL (U"Dynamic range");
+		my pref_formant_dotSize          () = my p_formant_dotSize          = GET_REAL (U"Dot size");
+		my d_formant. reset();
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
 
 static void menu_cb_advancedFormantSettings (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Advanced formant settings", L"Advanced formant settings...")
-		RADIO_ENUM (L"Method", kTimeSoundAnalysisEditor_formant_analysisMethod, my default_formant_method ())
-		POSITIVE (L"Pre-emphasis from (Hz)", my default_formant_preemphasisFrom ())
+	EDITOR_FORM (U"Advanced formant settings", U"Advanced formant settings...")
+		RADIO_ENUM (U"Method", kTimeSoundAnalysisEditor_formant_analysisMethod, my default_formant_method ())
+		POSITIVE (U"Pre-emphasis from (Hz)", my default_formant_preemphasisFrom ())
 	EDITOR_OK
-		SET_ENUM (L"Method", kTimeSoundAnalysisEditor_formant_analysisMethod, my p_formant_method)
-		SET_REAL (L"Pre-emphasis from", my p_formant_preemphasisFrom)
+		SET_ENUM (U"Method", kTimeSoundAnalysisEditor_formant_analysisMethod, my p_formant_method)
+		SET_REAL (U"Pre-emphasis from", my p_formant_preemphasisFrom)
 	EDITOR_DO
-		my pref_formant_method          () = my p_formant_method          = GET_ENUM (kTimeSoundAnalysisEditor_formant_analysisMethod, L"Method");
-		my pref_formant_preemphasisFrom () = my p_formant_preemphasisFrom = GET_REAL (L"Pre-emphasis from");
-		forget (my d_formant);
+		my pref_formant_method          () = my p_formant_method          = GET_ENUM (kTimeSoundAnalysisEditor_formant_analysisMethod, U"Method");
+		my pref_formant_preemphasisFrom () = my p_formant_preemphasisFrom = GET_REAL (U"Pre-emphasis from");
+		my d_formant. reset();
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
@@ -1133,40 +1129,40 @@ static void menu_cb_advancedFormantSettings (EDITOR_ARGS) {
 static void menu_cb_extractVisibleFormantContour (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	if (! my p_formant_show)
-		Melder_throw ("No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
+		Melder_throw (U"No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
 	if (! my d_formant) {
 		TimeSoundAnalysisEditor_computeFormants (me);
 		if (! my d_formant) Melder_throw (theMessage_Cannot_compute_formant);
 	}
-	autoFormant publish = Data_copy (my d_formant);
-	my broadcastPublication (publish.transfer());
+	autoFormant publish = Data_copy (my d_formant.peek());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_drawVisibleFormantContour (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Draw visible formant contour", 0)
+	EDITOR_FORM (U"Draw visible formant contour", 0)
 		my v_form_pictureWindow (cmd);
 		my v_form_pictureMargins (cmd);
 		my v_form_pictureSelection (cmd);
-		BOOLEAN (L"Garnish", 1);
+		BOOLEAN (U"Garnish", 1);
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
 		my v_ok_pictureMargins (cmd);
 		my v_ok_pictureSelection (cmd);
-		SET_INTEGER (L"Garnish", my p_formant_picture_garnish);
+		SET_INTEGER (U"Garnish", my p_formant_picture_garnish);
 	EDITOR_DO
 		my v_do_pictureWindow (cmd);
 		my v_do_pictureMargins (cmd);
 		my v_do_pictureSelection (cmd);
-		my pref_formant_picture_garnish () = my p_formant_picture_garnish = GET_INTEGER (L"Garnish");
+		my pref_formant_picture_garnish () = my p_formant_picture_garnish = GET_INTEGER (U"Garnish");
 		if (! my p_formant_show)
-			Melder_throw ("No formant contour is visible.\nFirst choose \"Show formant\" from the Formant menu.");
+			Melder_throw (U"No formant contour is visible.\nFirst choose \"Show formant\" from the Formant menu.");
 		if (! my d_formant) {
 			TimeSoundAnalysisEditor_computeFormants (me);
 			if (! my d_formant) Melder_throw (theMessage_Cannot_compute_formant);
 		}
 		Editor_openPraatPicture (me);
-		Formant_drawSpeckles (my d_formant, my pictureGraphics, my d_startWindow, my d_endWindow,
+		Formant_drawSpeckles (my d_formant.get(), my pictureGraphics, my d_startWindow, my d_endWindow,
 			my p_spectrogram_viewTo, my p_formant_dynamicRange,
 			my p_formant_picture_garnish);
 		FunctionEditor_garnish (me);
@@ -1177,31 +1173,31 @@ static void menu_cb_drawVisibleFormantContour (EDITOR_ARGS) {
 static void menu_cb_formantListing (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	double tmin, tmax;
-	int part = makeQueriable (me, TRUE, & tmin, & tmax);
+	int part = makeQueriable (me, true, & tmin, & tmax);
 	if (! my p_formant_show)
-		Melder_throw ("No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
+		Melder_throw (U"No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
 	if (! my d_formant) {
 		TimeSoundAnalysisEditor_computeFormants (me);
 		if (! my d_formant) Melder_throw (theMessage_Cannot_compute_formant);
 	}
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Time_s   F1_Hz   F2_Hz   F3_Hz   F4_Hz");
+	MelderInfo_writeLine (U"Time_s   F1_Hz   F2_Hz   F3_Hz   F4_Hz");
 	if (part == TimeSoundAnalysisEditor_PART_CURSOR) {
-		double f1 = Formant_getValueAtTime (my d_formant, 1, tmin, 0);
-		double f2 = Formant_getValueAtTime (my d_formant, 2, tmin, 0);
-		double f3 = Formant_getValueAtTime (my d_formant, 3, tmin, 0);
-		double f4 = Formant_getValueAtTime (my d_formant, 4, tmin, 0);
-		MelderInfo_writeLine (Melder_fixed (tmin, 6), L"   ", Melder_fixed (f1, 6), L"   ", Melder_fixed (f2, 6), L"   ", Melder_fixed (f3, 6), L"   ", Melder_fixed (f4, 6));
+		double f1 = Formant_getValueAtTime (my d_formant.get(), 1, tmin, 0);
+		double f2 = Formant_getValueAtTime (my d_formant.get(), 2, tmin, 0);
+		double f3 = Formant_getValueAtTime (my d_formant.get(), 3, tmin, 0);
+		double f4 = Formant_getValueAtTime (my d_formant.get(), 4, tmin, 0);
+		MelderInfo_writeLine (Melder_fixed (tmin, 6), U"   ", Melder_fixed (f1, 6), U"   ", Melder_fixed (f2, 6), U"   ", Melder_fixed (f3, 6), U"   ", Melder_fixed (f4, 6));
 	} else {
 		long i, i1, i2;
-		Sampled_getWindowSamples (my d_formant, tmin, tmax, & i1, & i2);
+		Sampled_getWindowSamples (my d_formant.get(), tmin, tmax, & i1, & i2);
 		for (i = i1; i <= i2; i ++) {
-			double t = Sampled_indexToX (my d_formant, i);
-			double f1 = Formant_getValueAtTime (my d_formant, 1, t, 0);
-			double f2 = Formant_getValueAtTime (my d_formant, 2, t, 0);
-			double f3 = Formant_getValueAtTime (my d_formant, 3, t, 0);
-			double f4 = Formant_getValueAtTime (my d_formant, 4, t, 0);
-			MelderInfo_writeLine (Melder_fixed (t, 6), L"   ", Melder_fixed (f1, 6), L"   ", Melder_fixed (f2, 6), L"   ", Melder_fixed (f3, 6), L"   ", Melder_fixed (f4, 6));
+			double t = Sampled_indexToX (my d_formant.get(), i);
+			double f1 = Formant_getValueAtTime (my d_formant.get(), 1, t, 0);
+			double f2 = Formant_getValueAtTime (my d_formant.get(), 2, t, 0);
+			double f3 = Formant_getValueAtTime (my d_formant.get(), 3, t, 0);
+			double f4 = Formant_getValueAtTime (my d_formant.get(), 4, t, 0);
+			MelderInfo_writeLine (Melder_fixed (t, 6), U"   ", Melder_fixed (f1, 6), U"   ", Melder_fixed (f2, 6), U"   ", Melder_fixed (f3, 6), U"   ", Melder_fixed (f4, 6));
 		}
 	}
 	MelderInfo_close ();
@@ -1209,36 +1205,36 @@ static void menu_cb_formantListing (EDITOR_ARGS) {
 
 static void do_getFormant (TimeSoundAnalysisEditor me, int iformant) {
 	double tmin, tmax;
-	int part = makeQueriable (me, TRUE, & tmin, & tmax);
+	int part = makeQueriable (me, true, & tmin, & tmax);
 	if (! my p_formant_show)
-		Melder_throw ("No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
+		Melder_throw (U"No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
 	if (! my d_formant) {
 		TimeSoundAnalysisEditor_computeFormants (me);
 		if (! my d_formant) Melder_throw (theMessage_Cannot_compute_formant);
 	}
 	if (part == TimeSoundAnalysisEditor_PART_CURSOR) {
-		Melder_information (Melder_double (Formant_getValueAtTime (my d_formant, iformant, tmin, 0)),
-			L" Hz (nearest F", Melder_integer (iformant), L" to CURSOR)");
+		Melder_information (Formant_getValueAtTime (my d_formant.get(), iformant, tmin, 0),
+			U" Hz (nearest F", iformant, U" to CURSOR)");
 	} else {
-		Melder_information (Melder_double (Formant_getMean (my d_formant, iformant, tmin, tmax, 0)),
-			L" Hz (mean F", Melder_integer (iformant), L" ", TimeSoundAnalysisEditor_partString_locative (part), L")");
+		Melder_information (Formant_getMean (my d_formant.get(), iformant, tmin, tmax, 0),
+			U" Hz (mean F", iformant, U" ", TimeSoundAnalysisEditor_partString_locative (part), U")");
 	}
 }
 static void do_getBandwidth (TimeSoundAnalysisEditor me, int iformant) {
 	double tmin, tmax;
-	int part = makeQueriable (me, TRUE, & tmin, & tmax);
+	int part = makeQueriable (me, true, & tmin, & tmax);
 	if (! my p_formant_show)
-		Melder_throw ("No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
+		Melder_throw (U"No formant contour is visible.\nFirst choose \"Show formants\" from the Formant menu.");
 	if (! my d_formant) {
 		TimeSoundAnalysisEditor_computeFormants (me);
 		if (! my d_formant) Melder_throw (theMessage_Cannot_compute_formant);
 	}
 	if (part == TimeSoundAnalysisEditor_PART_CURSOR) {
-		Melder_information (Melder_double (Formant_getBandwidthAtTime (my d_formant, iformant, tmin, 0)),
-			L" Hz (nearest B", Melder_integer (iformant), L" to CURSOR)");
+		Melder_information (Formant_getBandwidthAtTime (my d_formant.get(), iformant, tmin, 0),
+			U" Hz (nearest B", iformant, U" to CURSOR)");
 	} else {
-		Melder_information (Melder_double (Formant_getBandwidthAtTime (my d_formant, iformant, 0.5 * (tmin + tmax), 0)),
-			L" Hz (B", Melder_integer (iformant), L" in centre of ", TimeSoundAnalysisEditor_partString (part), L")");
+		Melder_information (Formant_getBandwidthAtTime (my d_formant.get(), iformant, 0.5 * (tmin + tmax), 0),
+			U" Hz (B", iformant, U" in centre of ", TimeSoundAnalysisEditor_partString (part), U")");
 	}
 }
 static void menu_cb_getFirstFormant (EDITOR_ARGS) {
@@ -1260,21 +1256,21 @@ static void menu_cb_getFourthBandwidth (EDITOR_ARGS) {
 
 static void menu_cb_getFormant (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Get formant", 0)
-		NATURAL (L"Formant number", L"5")
+	EDITOR_FORM (U"Get formant", 0)
+		NATURAL (U"Formant number", U"5")
 	EDITOR_OK
 	EDITOR_DO
-		do_getFormant (me, GET_INTEGER (L"Formant number"));
+		do_getFormant (me, GET_INTEGER (U"Formant number"));
 	EDITOR_END
 }
 
 static void menu_cb_getBandwidth (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Get bandwidth", 0)
-		NATURAL (L"Formant number", L"5")
+	EDITOR_FORM (U"Get bandwidth", 0)
+		NATURAL (U"Formant number", U"5")
 	EDITOR_OK
 	EDITOR_DO
-		do_getBandwidth (me, GET_INTEGER (L"Formant number"));
+		do_getBandwidth (me, GET_INTEGER (U"Formant number"));
 	EDITOR_END
 }
 
@@ -1283,22 +1279,22 @@ static void menu_cb_getBandwidth (EDITOR_ARGS) {
 static void menu_cb_showPulses (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	my pref_pulses_show () = my p_pulses_show = ! my p_pulses_show;
-	my pulsesToggle -> f_check (my p_pulses_show);   // in case we're called from a script
+	GuiMenuItem_check (my pulsesToggle, my p_pulses_show);   // in case we're called from a script
 	FunctionEditor_redraw (me);
 }
 
 static void menu_cb_advancedPulsesSettings (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Advanced pulses settings", L"Advanced pulses settings...")
-		POSITIVE (L"Maximum period factor",    my default_pulses_maximumPeriodFactor    ())
-		POSITIVE (L"Maximum amplitude factor", my default_pulses_maximumAmplitudeFactor ())
+	EDITOR_FORM (U"Advanced pulses settings", U"Advanced pulses settings...")
+		POSITIVE (U"Maximum period factor",    my default_pulses_maximumPeriodFactor    ())
+		POSITIVE (U"Maximum amplitude factor", my default_pulses_maximumAmplitudeFactor ())
 	EDITOR_OK
-		SET_REAL (L"Maximum period factor",    my p_pulses_maximumPeriodFactor)
-		SET_REAL (L"Maximum amplitude factor", my p_pulses_maximumAmplitudeFactor)
+		SET_REAL (U"Maximum period factor",    my p_pulses_maximumPeriodFactor)
+		SET_REAL (U"Maximum amplitude factor", my p_pulses_maximumAmplitudeFactor)
 	EDITOR_DO
-		my pref_pulses_maximumPeriodFactor    () = my p_pulses_maximumPeriodFactor    = GET_REAL (L"Maximum period factor");
-		my pref_pulses_maximumAmplitudeFactor () = my p_pulses_maximumAmplitudeFactor = GET_REAL (L"Maximum amplitude factor");
-		forget (my d_pulses);
+		my pref_pulses_maximumPeriodFactor    () = my p_pulses_maximumPeriodFactor    = GET_REAL (U"Maximum period factor");
+		my pref_pulses_maximumAmplitudeFactor () = my p_pulses_maximumAmplitudeFactor = GET_REAL (U"Maximum amplitude factor");
+		my d_pulses. reset();
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
@@ -1306,40 +1302,40 @@ static void menu_cb_advancedPulsesSettings (EDITOR_ARGS) {
 static void menu_cb_extractVisiblePulses (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	if (! my p_pulses_show)
-		Melder_throw ("No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
+		Melder_throw (U"No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
 	if (! my d_pulses) {
 		TimeSoundAnalysisEditor_computePulses (me);
 		if (! my d_pulses) Melder_throw (theMessage_Cannot_compute_pulses);
 	}
-	autoPointProcess publish = Data_copy (my d_pulses);
-	my broadcastPublication (publish.transfer());
+	autoPointProcess publish = Data_copy (my d_pulses.get());
+	Editor_broadcastPublication (me, publish.transfer());
 }
 
 static void menu_cb_drawVisiblePulses (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
-	EDITOR_FORM (L"Draw visible pulses", 0)
+	EDITOR_FORM (U"Draw visible pulses", 0)
 		my v_form_pictureWindow (cmd);
 		my v_form_pictureMargins (cmd);
 		my v_form_pictureSelection (cmd);
-		BOOLEAN (L"Garnish", 1);
+		BOOLEAN (U"Garnish", 1);
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
 		my v_ok_pictureMargins (cmd);
 		my v_ok_pictureSelection (cmd);
-		SET_INTEGER (L"Garnish", my p_pulses_picture_garnish);
+		SET_INTEGER (U"Garnish", my p_pulses_picture_garnish);
 	EDITOR_DO
 		my v_do_pictureWindow (cmd);
 		my v_do_pictureMargins (cmd);
 		my v_do_pictureSelection (cmd);
-		my pref_pulses_picture_garnish () = my p_pulses_picture_garnish = GET_INTEGER (L"Garnish");
+		my pref_pulses_picture_garnish () = my p_pulses_picture_garnish = GET_INTEGER (U"Garnish");
 		if (! my p_pulses_show)
-			Melder_throw (L"No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
+			Melder_throw (U"No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
 		if (! my d_pulses) {
 			TimeSoundAnalysisEditor_computePulses (me);
 			if (! my d_pulses) Melder_throw (theMessage_Cannot_compute_pulses);
 		}
 		Editor_openPraatPicture (me);
-		PointProcess_draw (my d_pulses, my pictureGraphics, my d_startWindow, my d_endWindow,
+		PointProcess_draw (my d_pulses.get(), my pictureGraphics, my d_startWindow, my d_endWindow,
 			my p_pulses_picture_garnish);
 		FunctionEditor_garnish (me);
 		Editor_closePraatPicture (me);
@@ -1350,21 +1346,21 @@ static void menu_cb_voiceReport (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	time_t today = time (NULL);
 	double tmin, tmax;
-	int part = makeQueriable (me, FALSE, & tmin, & tmax);
+	int part = makeQueriable (me, false, & tmin, & tmax);
 	if (! my p_pulses_show)
-		Melder_throw ("No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
+		Melder_throw (U"No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
 	if (! my d_pulses) {
 		TimeSoundAnalysisEditor_computePulses (me);
 		if (! my d_pulses) Melder_throw (theMessage_Cannot_compute_pulses);
 	}
 	autoSound sound = extractSound (me, tmin, tmax);
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"-- Voice report for ", my name, L" --\nDate: ", Melder_peekUtf8ToWcs (ctime (& today)));
+	MelderInfo_writeLine (U"-- Voice report for ", my name, U" --\nDate: ", Melder_peek8to32 (ctime (& today)));
 	if (my p_pitch_method != kTimeSoundAnalysisEditor_pitch_analysisMethod_CROSS_CORRELATION)
-		MelderInfo_writeLine (L"WARNING: some of the following measurements may be imprecise.\n"
+		MelderInfo_writeLine (U"WARNING: some of the following measurements may be imprecise.\n"
 			"For more precision, go to \"Pitch settings\" and choose \"Optimize for voice analysis\".\n");
-	MelderInfo_writeLine (L"Time range of ", TimeSoundAnalysisEditor_partString (part));
-	Sound_Pitch_PointProcess_voiceReport (sound.peek(), my d_pitch, my d_pulses, tmin, tmax,
+	MelderInfo_writeLine (U"Time range of ", TimeSoundAnalysisEditor_partString (part));
+	Sound_Pitch_PointProcess_voiceReport (sound.peek(), my d_pitch.get(), my d_pulses.get(), tmin, tmax,
 		my p_pitch_floor, my p_pitch_ceiling, my p_pulses_maximumPeriodFactor, my p_pulses_maximumAmplitudeFactor, my p_pitch_silenceThreshold, my p_pitch_voicingThreshold);
 	MelderInfo_close ();
 }
@@ -1373,17 +1369,17 @@ static void menu_cb_pulseListing (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundAnalysisEditor);
 	long i, i1, i2;
 	double tmin, tmax;
-	makeQueriable (me, FALSE, & tmin, & tmax);
+	makeQueriable (me, false, & tmin, & tmax);
 	if (! my p_pulses_show)
-		Melder_throw ("No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
+		Melder_throw (U"No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
 	if (! my d_pulses) {
 		TimeSoundAnalysisEditor_computePulses (me);
 		if (! my d_pulses) Melder_throw (theMessage_Cannot_compute_pulses);
 	}
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Time_s");
-	i1 = PointProcess_getHighIndex (my d_pulses, tmin);
-	i2 = PointProcess_getLowIndex (my d_pulses, tmax);
+	MelderInfo_writeLine (U"Time_s");
+	i1 = PointProcess_getHighIndex (my d_pulses.get(), tmin);
+	i2 = PointProcess_getLowIndex (my d_pulses.get(), tmax);
 	for (i = i1; i <= i2; i ++) {
 		double t = my d_pulses -> t [i];
 		MelderInfo_writeLine (Melder_fixed (t, 12));
@@ -1395,13 +1391,13 @@ static void menu_cb_pulseListing (EDITOR_ARGS) {
 static void cb_getJitter_xx (TimeSoundAnalysisEditor me, double (*PointProcess_getJitter_xx) (PointProcess, double, double, double, double, double)) {
 	double minimumPeriod = 0.8 / my p_pitch_ceiling, maximumPeriod = 1.25 / my p_pitch_floor;
 	if (! my p_pulses_show)
-		Melder_throw ("No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
+		Melder_throw (U"No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
 	if (! my d_pulses) {
 		computePulses (me);
 		if (! my d_pulses) Melder_throw (theMessage_Cannot_compute_pulses);
 	}
 	if (my startSelection == my endSelection)
-		Melder_throw (L"Make a selection first.");
+		Melder_throw (U"Make a selection first.");
 	makeQueriable
 	Melder_informationReal (PointProcess_getJitter_xx (my d_pulses, my startSelection, my endSelection,
 		minimumPeriod, maximumPeriod, my p_pulses_maximumPeriodFactor), NULL);
@@ -1415,13 +1411,13 @@ DIRECT (TimeSoundAnalysisEditor, cb_getJitter_ddp) cb_getJitter_xx (me, PointPro
 static void cb_getShimmer_xx (TimeSoundAnalysisEditor me, double (*PointProcess_Sound_getShimmer_xx) (PointProcess, Sound, double, double, double, double, double)) {
 	double minimumPeriod = 0.8 / my p_pitch_ceiling, maximumPeriod = 1.25 / my p_pitch_floor;
 	if (! my p_pulses_show)
-		Melder_throw ("No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
+		Melder_throw (U"No pulses are visible.\nFirst choose \"Show pulses\" from the Pulses menu.");
 	if (! my d_pulses) {
 		computePulses (me);
 		if (! my d_pulses) Melder_throw (theMessage_Cannot_compute_pulses);
 	}
 	if (my startSelection == my endSelection)
-		Melder_throw ("Make a selection first.");
+		Melder_throw (U"Make a selection first.");
 	makeQueriable
 	autoSound sound = extractSound (me, my startSelection, my endSelection);
 	Melder_informationReal (PointProcess_Sound_getShimmer_xx (my d_pulses, sound, my startSelection, my endSelection,
@@ -1441,10 +1437,10 @@ void structTimeSoundAnalysisEditor :: v_createMenuItems_view_sound (EditorMenu m
 }
 
 void structTimeSoundAnalysisEditor :: v_createMenuItems_view_sound_analysis (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"Analysis window:", GuiMenu_INSENSITIVE, menu_cb_showAnalyses);
-	EditorMenu_addCommand (menu, L"Show analyses...", 0, menu_cb_showAnalyses);
-	EditorMenu_addCommand (menu, L"Time step settings...", 0, menu_cb_timeStepSettings);
-	EditorMenu_addCommand (menu, L"-- sound analysis --", 0, 0);
+	EditorMenu_addCommand (menu, U"Analysis window:", GuiMenu_INSENSITIVE, menu_cb_showAnalyses);
+	EditorMenu_addCommand (menu, U"Show analyses...", 0, menu_cb_showAnalyses);
+	EditorMenu_addCommand (menu, U"Time step settings...", 0, menu_cb_timeStepSettings);
+	EditorMenu_addCommand (menu, U"-- sound analysis --", 0, 0);
 }
 
 void structTimeSoundAnalysisEditor :: v_createMenuItems_query (EditorMenu menu) {
@@ -1455,169 +1451,169 @@ void structTimeSoundAnalysisEditor :: v_createMenuItems_query (EditorMenu menu)
 }
 
 void structTimeSoundAnalysisEditor :: v_createMenuItems_query_log (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"-- query log --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Log settings...", 0, menu_cb_logSettings);
-	EditorMenu_addCommand (menu, L"Delete log file 1", 0, menu_cb_deleteLogFile1);
-	EditorMenu_addCommand (menu, L"Delete log file 2", 0, menu_cb_deleteLogFile2);
-	EditorMenu_addCommand (menu, L"Log 1", GuiMenu_F12, menu_cb_log1);
-	EditorMenu_addCommand (menu, L"Log 2", GuiMenu_F12 + GuiMenu_SHIFT, menu_cb_log2);
-	EditorMenu_addCommand (menu, L"Log script 3 (...)", GuiMenu_F12 + GuiMenu_OPTION, menu_cb_logScript3);
-	EditorMenu_addCommand (menu, L"Log script 4 (...)", GuiMenu_F12 + GuiMenu_COMMAND, menu_cb_logScript4);
+	EditorMenu_addCommand (menu, U"-- query log --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Log settings...", 0, menu_cb_logSettings);
+	EditorMenu_addCommand (menu, U"Delete log file 1", 0, menu_cb_deleteLogFile1);
+	EditorMenu_addCommand (menu, U"Delete log file 2", 0, menu_cb_deleteLogFile2);
+	EditorMenu_addCommand (menu, U"Log 1", GuiMenu_F12, menu_cb_log1);
+	EditorMenu_addCommand (menu, U"Log 2", GuiMenu_F12 + GuiMenu_SHIFT, menu_cb_log2);
+	EditorMenu_addCommand (menu, U"Log script 3 (...)", GuiMenu_F12 + GuiMenu_OPTION, menu_cb_logScript3);
+	EditorMenu_addCommand (menu, U"Log script 4 (...)", GuiMenu_F12 + GuiMenu_COMMAND, menu_cb_logScript4);
 }
 
 void structTimeSoundAnalysisEditor :: v_createMenus_analysis () {
 	EditorMenu menu;
 
 	if (v_hasSpectrogram ()) {
-		menu = Editor_addMenu (this, L"Spectrum", 0);
-		spectrogramToggle = EditorMenu_addCommand (menu, L"Show spectrogram",
+		menu = Editor_addMenu (this, U"Spectrum", 0);
+		spectrogramToggle = EditorMenu_addCommand (menu, U"Show spectrogram",
 			GuiMenu_CHECKBUTTON | (pref_spectrogram_show () ? GuiMenu_TOGGLE_ON : 0), menu_cb_showSpectrogram);
-		EditorMenu_addCommand (menu, L"Spectrogram settings...", 0, menu_cb_spectrogramSettings);
-		EditorMenu_addCommand (menu, L"Advanced spectrogram settings...", 0, menu_cb_advancedSpectrogramSettings);
-		EditorMenu_addCommand (menu, L"-- spectrum query --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Query:", GuiMenu_INSENSITIVE, menu_cb_getFrequency /* dummy */);
-		EditorMenu_addCommand (menu, L"Get frequency at frequency cursor", 0, menu_cb_getFrequency);
-		EditorMenu_addCommand (menu, L"Get spectral power at cursor cross", GuiMenu_F7, menu_cb_getSpectralPowerAtCursorCross);
-		EditorMenu_addCommand (menu, L"-- spectrum select --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Select:", GuiMenu_INSENSITIVE, menu_cb_moveFrequencyCursorTo/* dummy */);
-		EditorMenu_addCommand (menu, L"Move frequency cursor to...", 0, menu_cb_moveFrequencyCursorTo);
+		EditorMenu_addCommand (menu, U"Spectrogram settings...", 0, menu_cb_spectrogramSettings);
+		EditorMenu_addCommand (menu, U"Advanced spectrogram settings...", 0, menu_cb_advancedSpectrogramSettings);
+		EditorMenu_addCommand (menu, U"-- spectrum query --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Query:", GuiMenu_INSENSITIVE, menu_cb_getFrequency /* dummy */);
+		EditorMenu_addCommand (menu, U"Get frequency at frequency cursor", 0, menu_cb_getFrequency);
+		EditorMenu_addCommand (menu, U"Get spectral power at cursor cross", GuiMenu_F7, menu_cb_getSpectralPowerAtCursorCross);
+		EditorMenu_addCommand (menu, U"-- spectrum select --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Select:", GuiMenu_INSENSITIVE, menu_cb_moveFrequencyCursorTo/* dummy */);
+		EditorMenu_addCommand (menu, U"Move frequency cursor to...", 0, menu_cb_moveFrequencyCursorTo);
 		v_createMenuItems_spectrum_picture (menu);
-		EditorMenu_addCommand (menu, L"-- spectrum extract --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_extractVisibleSpectrogram /* dummy */);
-		EditorMenu_addCommand (menu, L"Extract visible spectrogram", 0, menu_cb_extractVisibleSpectrogram);
-		EditorMenu_addCommand (menu, L"View spectral slice", 'L', menu_cb_viewSpectralSlice);
+		EditorMenu_addCommand (menu, U"-- spectrum extract --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_extractVisibleSpectrogram /* dummy */);
+		EditorMenu_addCommand (menu, U"Extract visible spectrogram", 0, menu_cb_extractVisibleSpectrogram);
+		EditorMenu_addCommand (menu, U"View spectral slice", 'L', menu_cb_viewSpectralSlice);
 	}
 
 	if (v_hasPitch ()) {
-		menu = Editor_addMenu (this, L"Pitch", 0);
-		pitchToggle = EditorMenu_addCommand (menu, L"Show pitch",
+		menu = Editor_addMenu (this, U"Pitch", 0);
+		pitchToggle = EditorMenu_addCommand (menu, U"Show pitch",
 			GuiMenu_CHECKBUTTON | (pref_pitch_show () ? GuiMenu_TOGGLE_ON : 0), menu_cb_showPitch);
-		EditorMenu_addCommand (menu, L"Pitch settings...", 0, menu_cb_pitchSettings);
-		EditorMenu_addCommand (menu, L"Advanced pitch settings...", 0, menu_cb_advancedPitchSettings);
-		EditorMenu_addCommand (menu, L"-- pitch query --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Query:", GuiMenu_INSENSITIVE, menu_cb_getFrequency /* dummy */);
-		EditorMenu_addCommand (menu, L"Pitch listing", 0, menu_cb_pitchListing);
-		EditorMenu_addCommand (menu, L"Get pitch", GuiMenu_F5, menu_cb_getPitch);
-		EditorMenu_addCommand (menu, L"Get minimum pitch", GuiMenu_F5 + GuiMenu_COMMAND, menu_cb_getMinimumPitch);
-		EditorMenu_addCommand (menu, L"Get maximum pitch", GuiMenu_F5 + GuiMenu_SHIFT, menu_cb_getMaximumPitch);
-		EditorMenu_addCommand (menu, L"-- pitch select --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Select:", GuiMenu_INSENSITIVE, menu_cb_moveCursorToMinimumPitch /* dummy */);
-		EditorMenu_addCommand (menu, L"Move cursor to minimum pitch", GuiMenu_COMMAND + GuiMenu_SHIFT + 'L', menu_cb_moveCursorToMinimumPitch);
-		EditorMenu_addCommand (menu, L"Move cursor to maximum pitch", GuiMenu_COMMAND + GuiMenu_SHIFT + 'H', menu_cb_moveCursorToMaximumPitch);
+		EditorMenu_addCommand (menu, U"Pitch settings...", 0, menu_cb_pitchSettings);
+		EditorMenu_addCommand (menu, U"Advanced pitch settings...", 0, menu_cb_advancedPitchSettings);
+		EditorMenu_addCommand (menu, U"-- pitch query --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Query:", GuiMenu_INSENSITIVE, menu_cb_getFrequency /* dummy */);
+		EditorMenu_addCommand (menu, U"Pitch listing", 0, menu_cb_pitchListing);
+		EditorMenu_addCommand (menu, U"Get pitch", GuiMenu_F5, menu_cb_getPitch);
+		EditorMenu_addCommand (menu, U"Get minimum pitch", GuiMenu_F5 + GuiMenu_COMMAND, menu_cb_getMinimumPitch);
+		EditorMenu_addCommand (menu, U"Get maximum pitch", GuiMenu_F5 + GuiMenu_SHIFT, menu_cb_getMaximumPitch);
+		EditorMenu_addCommand (menu, U"-- pitch select --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Select:", GuiMenu_INSENSITIVE, menu_cb_moveCursorToMinimumPitch /* dummy */);
+		EditorMenu_addCommand (menu, U"Move cursor to minimum pitch", GuiMenu_COMMAND + GuiMenu_SHIFT + 'L', menu_cb_moveCursorToMinimumPitch);
+		EditorMenu_addCommand (menu, U"Move cursor to maximum pitch", GuiMenu_COMMAND + GuiMenu_SHIFT + 'H', menu_cb_moveCursorToMaximumPitch);
 		v_createMenuItems_pitch_picture (menu);
-		EditorMenu_addCommand (menu, L"-- pitch extract --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_extractVisiblePitchContour /* dummy */);
-		EditorMenu_addCommand (menu, L"Extract visible pitch contour", 0, menu_cb_extractVisiblePitchContour);
+		EditorMenu_addCommand (menu, U"-- pitch extract --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_extractVisiblePitchContour /* dummy */);
+		EditorMenu_addCommand (menu, U"Extract visible pitch contour", 0, menu_cb_extractVisiblePitchContour);
 	}
 
 	if (v_hasIntensity ()) {
-		menu = Editor_addMenu (this, L"Intensity", 0);
-		intensityToggle = EditorMenu_addCommand (menu, L"Show intensity",
+		menu = Editor_addMenu (this, U"Intensity", 0);
+		intensityToggle = EditorMenu_addCommand (menu, U"Show intensity",
 			GuiMenu_CHECKBUTTON | (pref_intensity_show () ? GuiMenu_TOGGLE_ON : 0), menu_cb_showIntensity);
-		EditorMenu_addCommand (menu, L"Intensity settings...", 0, menu_cb_intensitySettings);
-		EditorMenu_addCommand (menu, L"-- intensity query --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Query:", GuiMenu_INSENSITIVE, menu_cb_getFrequency /* dummy */);
-		EditorMenu_addCommand (menu, L"Intensity listing", 0, menu_cb_intensityListing);
-		EditorMenu_addCommand (menu, L"Get intensity", GuiMenu_F8, menu_cb_getIntensity);
-		EditorMenu_addCommand (menu, L"Get minimum intensity", GuiMenu_F8 + GuiMenu_COMMAND, menu_cb_getMinimumIntensity);
-		EditorMenu_addCommand (menu, L"Get maximum intensity", GuiMenu_F8 + GuiMenu_SHIFT, menu_cb_getMaximumIntensity);
+		EditorMenu_addCommand (menu, U"Intensity settings...", 0, menu_cb_intensitySettings);
+		EditorMenu_addCommand (menu, U"-- intensity query --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Query:", GuiMenu_INSENSITIVE, menu_cb_getFrequency /* dummy */);
+		EditorMenu_addCommand (menu, U"Intensity listing", 0, menu_cb_intensityListing);
+		EditorMenu_addCommand (menu, U"Get intensity", GuiMenu_F8, menu_cb_getIntensity);
+		EditorMenu_addCommand (menu, U"Get minimum intensity", GuiMenu_F8 + GuiMenu_COMMAND, menu_cb_getMinimumIntensity);
+		EditorMenu_addCommand (menu, U"Get maximum intensity", GuiMenu_F8 + GuiMenu_SHIFT, menu_cb_getMaximumIntensity);
 		v_createMenuItems_intensity_picture (menu);
-		EditorMenu_addCommand (menu, L"-- intensity extract --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_extractVisibleIntensityContour /* dummy */);
-		EditorMenu_addCommand (menu, L"Extract visible intensity contour", 0, menu_cb_extractVisibleIntensityContour);
+		EditorMenu_addCommand (menu, U"-- intensity extract --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_extractVisibleIntensityContour /* dummy */);
+		EditorMenu_addCommand (menu, U"Extract visible intensity contour", 0, menu_cb_extractVisibleIntensityContour);
 	}
 
 	if (v_hasFormants ()) {
-		menu = Editor_addMenu (this, L"Formant", 0);
-		formantToggle = EditorMenu_addCommand (menu, L"Show formants",
+		menu = Editor_addMenu (this, U"Formant", 0);
+		formantToggle = EditorMenu_addCommand (menu, U"Show formants",
 			GuiMenu_CHECKBUTTON | (pref_formant_show () ? GuiMenu_TOGGLE_ON : 0), menu_cb_showFormants);
-		EditorMenu_addCommand (menu, L"Formant settings...", 0, menu_cb_formantSettings);
-		EditorMenu_addCommand (menu, L"Advanced formant settings...", 0, menu_cb_advancedFormantSettings);
-		EditorMenu_addCommand (menu, L"-- formant query --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Query:", GuiMenu_INSENSITIVE, menu_cb_getFrequency /* dummy */);
-		EditorMenu_addCommand (menu, L"Formant listing", 0, menu_cb_formantListing);
-		EditorMenu_addCommand (menu, L"Get first formant", GuiMenu_F1, menu_cb_getFirstFormant);
-		EditorMenu_addCommand (menu, L"Get first bandwidth", 0, menu_cb_getFirstBandwidth);
-		EditorMenu_addCommand (menu, L"Get second formant", GuiMenu_F2, menu_cb_getSecondFormant);
-		EditorMenu_addCommand (menu, L"Get second bandwidth", 0, menu_cb_getSecondBandwidth);
-		EditorMenu_addCommand (menu, L"Get third formant", GuiMenu_F3, menu_cb_getThirdFormant);
-		EditorMenu_addCommand (menu, L"Get third bandwidth", 0, menu_cb_getThirdBandwidth);
-		EditorMenu_addCommand (menu, L"Get fourth formant", GuiMenu_F4, menu_cb_getFourthFormant);
-		EditorMenu_addCommand (menu, L"Get fourth bandwidth", 0, menu_cb_getFourthBandwidth);
-		EditorMenu_addCommand (menu, L"Get formant...", 0, menu_cb_getFormant);
-		EditorMenu_addCommand (menu, L"Get bandwidth...", 0, menu_cb_getBandwidth);
+		EditorMenu_addCommand (menu, U"Formant settings...", 0, menu_cb_formantSettings);
+		EditorMenu_addCommand (menu, U"Advanced formant settings...", 0, menu_cb_advancedFormantSettings);
+		EditorMenu_addCommand (menu, U"-- formant query --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Query:", GuiMenu_INSENSITIVE, menu_cb_getFrequency /* dummy */);
+		EditorMenu_addCommand (menu, U"Formant listing", 0, menu_cb_formantListing);
+		EditorMenu_addCommand (menu, U"Get first formant", GuiMenu_F1, menu_cb_getFirstFormant);
+		EditorMenu_addCommand (menu, U"Get first bandwidth", 0, menu_cb_getFirstBandwidth);
+		EditorMenu_addCommand (menu, U"Get second formant", GuiMenu_F2, menu_cb_getSecondFormant);
+		EditorMenu_addCommand (menu, U"Get second bandwidth", 0, menu_cb_getSecondBandwidth);
+		EditorMenu_addCommand (menu, U"Get third formant", GuiMenu_F3, menu_cb_getThirdFormant);
+		EditorMenu_addCommand (menu, U"Get third bandwidth", 0, menu_cb_getThirdBandwidth);
+		EditorMenu_addCommand (menu, U"Get fourth formant", GuiMenu_F4, menu_cb_getFourthFormant);
+		EditorMenu_addCommand (menu, U"Get fourth bandwidth", 0, menu_cb_getFourthBandwidth);
+		EditorMenu_addCommand (menu, U"Get formant...", 0, menu_cb_getFormant);
+		EditorMenu_addCommand (menu, U"Get bandwidth...", 0, menu_cb_getBandwidth);
 		v_createMenuItems_formant_picture (menu);
-		EditorMenu_addCommand (menu, L"-- formant extract --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_extractVisibleFormantContour /* dummy */);
-		EditorMenu_addCommand (menu, L"Extract visible formant contour", 0, menu_cb_extractVisibleFormantContour);
+		EditorMenu_addCommand (menu, U"-- formant extract --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_extractVisibleFormantContour /* dummy */);
+		EditorMenu_addCommand (menu, U"Extract visible formant contour", 0, menu_cb_extractVisibleFormantContour);
 	}
 
 	if (v_hasPulses ()) {
-		menu = Editor_addMenu (this, L"Pulses", 0);
-		pulsesToggle = EditorMenu_addCommand (menu, L"Show pulses",
+		menu = Editor_addMenu (this, U"Pulses", 0);
+		pulsesToggle = EditorMenu_addCommand (menu, U"Show pulses",
 			GuiMenu_CHECKBUTTON | (pref_pulses_show () ? GuiMenu_TOGGLE_ON : 0), menu_cb_showPulses);
-		EditorMenu_addCommand (menu, L"Advanced pulses settings...", 0, menu_cb_advancedPulsesSettings);
-		EditorMenu_addCommand (menu, L"-- pulses query --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Query:", GuiMenu_INSENSITIVE, menu_cb_getFrequency /* dummy */);
-		EditorMenu_addCommand (menu, L"Voice report", 0, menu_cb_voiceReport);
-		EditorMenu_addCommand (menu, L"Pulse listing", 0, menu_cb_pulseListing);
+		EditorMenu_addCommand (menu, U"Advanced pulses settings...", 0, menu_cb_advancedPulsesSettings);
+		EditorMenu_addCommand (menu, U"-- pulses query --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Query:", GuiMenu_INSENSITIVE, menu_cb_getFrequency /* dummy */);
+		EditorMenu_addCommand (menu, U"Voice report", 0, menu_cb_voiceReport);
+		EditorMenu_addCommand (menu, U"Pulse listing", 0, menu_cb_pulseListing);
 		/*
-		EditorMenu_addCommand (menu, L"Get jitter (local)", 0, cb_getJitter_local);
-		EditorMenu_addCommand (menu, L"Get jitter (local, absolute)", 0, cb_getJitter_local_absolute);
-		EditorMenu_addCommand (menu, L"Get jitter (rap)", 0, cb_getJitter_rap);
-		EditorMenu_addCommand (menu, L"Get jitter (ppq5)", 0, cb_getJitter_ppq5);
-		EditorMenu_addCommand (menu, L"Get jitter (ddp)", 0, cb_getJitter_ddp);
-		EditorMenu_addCommand (menu, L"Get shimmer (local)", 0, cb_getShimmer_local);
-		EditorMenu_addCommand (menu, L"Get shimmer (local_dB)", 0, cb_getShimmer_local_dB);
-		EditorMenu_addCommand (menu, L"Get shimmer (apq3)", 0, cb_getShimmer_apq3);
-		EditorMenu_addCommand (menu, L"Get shimmer (apq5)", 0, cb_getShimmer_apq5);
-		EditorMenu_addCommand (menu, L"Get shimmer (apq11)", 0, cb_getShimmer_apq11);
-		EditorMenu_addCommand (menu, L"Get shimmer (dda)", 0, cb_getShimmer_dda);
+		EditorMenu_addCommand (menu, U"Get jitter (local)", 0, cb_getJitter_local);
+		EditorMenu_addCommand (menu, U"Get jitter (local, absolute)", 0, cb_getJitter_local_absolute);
+		EditorMenu_addCommand (menu, U"Get jitter (rap)", 0, cb_getJitter_rap);
+		EditorMenu_addCommand (menu, U"Get jitter (ppq5)", 0, cb_getJitter_ppq5);
+		EditorMenu_addCommand (menu, U"Get jitter (ddp)", 0, cb_getJitter_ddp);
+		EditorMenu_addCommand (menu, U"Get shimmer (local)", 0, cb_getShimmer_local);
+		EditorMenu_addCommand (menu, U"Get shimmer (local_dB)", 0, cb_getShimmer_local_dB);
+		EditorMenu_addCommand (menu, U"Get shimmer (apq3)", 0, cb_getShimmer_apq3);
+		EditorMenu_addCommand (menu, U"Get shimmer (apq5)", 0, cb_getShimmer_apq5);
+		EditorMenu_addCommand (menu, U"Get shimmer (apq11)", 0, cb_getShimmer_apq11);
+		EditorMenu_addCommand (menu, U"Get shimmer (dda)", 0, cb_getShimmer_dda);
 		*/
 		v_createMenuItems_pulses_picture (menu);
-		EditorMenu_addCommand (menu, L"-- pulses extract --", 0, NULL);
-		EditorMenu_addCommand (menu, L"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_extractVisiblePulses /* dummy */);
-		EditorMenu_addCommand (menu, L"Extract visible pulses", 0, menu_cb_extractVisiblePulses);
+		EditorMenu_addCommand (menu, U"-- pulses extract --", 0, NULL);
+		EditorMenu_addCommand (menu, U"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_extractVisiblePulses /* dummy */);
+		EditorMenu_addCommand (menu, U"Extract visible pulses", 0, menu_cb_extractVisiblePulses);
 	}
 }
 
 void structTimeSoundAnalysisEditor :: v_createMenuItems_spectrum_picture (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"-- spectrum draw --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_paintVisibleSpectrogram /* dummy */);
-	EditorMenu_addCommand (menu, L"Paint visible spectrogram...", 0, menu_cb_paintVisibleSpectrogram);
+	EditorMenu_addCommand (menu, U"-- spectrum draw --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_paintVisibleSpectrogram /* dummy */);
+	EditorMenu_addCommand (menu, U"Paint visible spectrogram...", 0, menu_cb_paintVisibleSpectrogram);
 }
 
 void structTimeSoundAnalysisEditor :: v_createMenuItems_pitch_picture (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"-- pitch draw --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_drawVisiblePitchContour /* dummy */);
-	EditorMenu_addCommand (menu, L"Draw visible pitch contour...", 0, menu_cb_drawVisiblePitchContour);
+	EditorMenu_addCommand (menu, U"-- pitch draw --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_drawVisiblePitchContour /* dummy */);
+	EditorMenu_addCommand (menu, U"Draw visible pitch contour...", 0, menu_cb_drawVisiblePitchContour);
 }
 
 void structTimeSoundAnalysisEditor :: v_createMenuItems_intensity_picture (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"-- intensity draw --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_drawVisibleIntensityContour /* dummy */);
-	EditorMenu_addCommand (menu, L"Draw visible intensity contour...", 0, menu_cb_drawVisibleIntensityContour);
+	EditorMenu_addCommand (menu, U"-- intensity draw --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_drawVisibleIntensityContour /* dummy */);
+	EditorMenu_addCommand (menu, U"Draw visible intensity contour...", 0, menu_cb_drawVisibleIntensityContour);
 }
 
 void structTimeSoundAnalysisEditor :: v_createMenuItems_formant_picture (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"-- formant draw --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_drawVisibleFormantContour /* dummy */);
-	EditorMenu_addCommand (menu, L"Draw visible formant contour...", 0, menu_cb_drawVisibleFormantContour);
+	EditorMenu_addCommand (menu, U"-- formant draw --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_drawVisibleFormantContour /* dummy */);
+	EditorMenu_addCommand (menu, U"Draw visible formant contour...", 0, menu_cb_drawVisibleFormantContour);
 }
 
 void structTimeSoundAnalysisEditor :: v_createMenuItems_pulses_picture (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"-- pulses draw --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_drawVisiblePulses /* dummy */);
-	EditorMenu_addCommand (menu, L"Draw visible pulses...", 0, menu_cb_drawVisiblePulses);
+	EditorMenu_addCommand (menu, U"-- pulses draw --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_drawVisiblePulses /* dummy */);
+	EditorMenu_addCommand (menu, U"Draw visible pulses...", 0, menu_cb_drawVisiblePulses);
 }
 
 void TimeSoundAnalysisEditor_computeSpectrogram (TimeSoundAnalysisEditor me) {
 	autoMelderProgressOff progress;
 	if (my p_spectrogram_show && my d_endWindow - my d_startWindow <= my p_longestAnalysis &&
-		(my d_spectrogram == NULL || my d_spectrogram -> xmin != my d_startWindow || my d_spectrogram -> xmax != my d_endWindow))
+		(! my d_spectrogram || my d_spectrogram -> xmin != my d_startWindow || my d_spectrogram -> xmax != my d_endWindow))
 	{
 		double margin = my p_spectrogram_windowShape == kSound_to_Spectrogram_windowShape_GAUSSIAN ? my p_spectrogram_windowLength : 0.5 * my p_spectrogram_windowLength;
-		forget (my d_spectrogram);
+		my d_spectrogram.reset();
 		try {
 			autoSound sound = extractSound (me, my d_startWindow - margin, my d_endWindow + margin);
 			my d_spectrogram = Sound_to_Spectrogram (sound.peek(), my p_spectrogram_windowLength,
@@ -1633,7 +1629,7 @@ void TimeSoundAnalysisEditor_computeSpectrogram (TimeSoundAnalysisEditor me) {
 
 static void computePitch_inside (TimeSoundAnalysisEditor me) {
 	double margin = my p_pitch_veryAccurate ? 3.0 / my p_pitch_floor : 1.5 / my p_pitch_floor;
-	forget (my d_pitch);
+	my d_pitch. reset();
 	try {
 		autoSound sound = extractSound (me, my d_startWindow - margin, my d_endWindow + margin);
 		double pitchTimeStep =
@@ -1657,7 +1653,7 @@ static void computePitch_inside (TimeSoundAnalysisEditor me) {
 void TimeSoundAnalysisEditor_computePitch (TimeSoundAnalysisEditor me) {
 	autoMelderProgressOff progress;
 	if (my p_pitch_show && my d_endWindow - my d_startWindow <= my p_longestAnalysis &&
-		(my d_pitch == NULL || my d_pitch -> xmin != my d_startWindow || my d_pitch -> xmax != my d_endWindow))
+		(! my d_pitch || my d_pitch -> xmin != my d_startWindow || my d_pitch -> xmax != my d_endWindow))
 	{
 		computePitch_inside (me);
 	}
@@ -1666,7 +1662,7 @@ void TimeSoundAnalysisEditor_computePitch (TimeSoundAnalysisEditor me) {
 void TimeSoundAnalysisEditor_computeIntensity (TimeSoundAnalysisEditor me) {
 	autoMelderProgressOff progress;
 	if (my p_intensity_show && my d_endWindow - my d_startWindow <= my p_longestAnalysis &&
-		(my d_intensity == NULL || my d_intensity -> xmin != my d_startWindow || my d_intensity -> xmax != my d_endWindow))
+		(! my d_intensity || my d_intensity -> xmin != my d_startWindow || my d_intensity -> xmax != my d_endWindow))
 	{
 		double margin = 3.2 / my p_pitch_floor;
 		forget (my d_intensity);
@@ -1686,10 +1682,10 @@ void TimeSoundAnalysisEditor_computeIntensity (TimeSoundAnalysisEditor me) {
 void TimeSoundAnalysisEditor_computeFormants (TimeSoundAnalysisEditor me) {
 	autoMelderProgressOff progress;
 	if (my p_formant_show && my d_endWindow - my d_startWindow <= my p_longestAnalysis &&
-		(my d_formant == NULL || my d_formant -> xmin != my d_startWindow || my d_formant -> xmax != my d_endWindow))
+		(! my d_formant || my d_formant -> xmin != my d_startWindow || my d_formant -> xmax != my d_endWindow))
 	{
 		double margin = my p_formant_windowLength;
-		forget (my d_formant);
+		my d_formant. reset();
 		try {
 			autoSound sound =
 				my d_endWindow - my d_startWindow > my p_longestAnalysis ?
@@ -1702,7 +1698,7 @@ void TimeSoundAnalysisEditor_computeFormants (TimeSoundAnalysisEditor me) {
 				my p_timeStepStrategy == kTimeSoundAnalysisEditor_timeStepStrategy_VIEW_DEPENDENT ? (my d_endWindow - my d_startWindow) / my p_numberOfTimeStepsPerView :
 				0.0;   // the default: determined by analysis window length
 			my d_formant = Sound_to_Formant_any (sound.peek(), formantTimeStep,
-				my p_formant_numberOfFormants * 2, my p_formant_maximumFormant,
+				lround (my p_formant_numberOfFormants * 2), my p_formant_maximumFormant,
 				my p_formant_windowLength, my p_formant_method, my p_formant_preemphasisFrom, 50.0);
 			my d_formant -> xmin = my d_startWindow;
 			my d_formant -> xmax = my d_endWindow;
@@ -1715,16 +1711,16 @@ void TimeSoundAnalysisEditor_computeFormants (TimeSoundAnalysisEditor me) {
 void TimeSoundAnalysisEditor_computePulses (TimeSoundAnalysisEditor me) {
 	autoMelderProgressOff progress;
 	if (my p_pulses_show && my d_endWindow - my d_startWindow <= my p_longestAnalysis &&
-		(my d_pulses == NULL || my d_pulses -> xmin != my d_startWindow || my d_pulses -> xmax != my d_endWindow))
+		(! my d_pulses || my d_pulses -> xmin != my d_startWindow || my d_pulses -> xmax != my d_endWindow))
 	{
-		forget (my d_pulses);
-		if (my d_pitch == NULL || my d_pitch -> xmin != my d_startWindow || my d_pitch -> xmax != my d_endWindow) {
+		my d_pulses. reset();
+		if (! my d_pitch || my d_pitch -> xmin != my d_startWindow || my d_pitch -> xmax != my d_endWindow) {
 			computePitch_inside (me);
 		}
-		if (my d_pitch != NULL) {
+		if (my d_pitch) {
 			try {
 				autoSound sound = extractSound (me, my d_startWindow, my d_endWindow);
-				my d_pulses = Sound_Pitch_to_PointProcess_cc (sound.peek(), my d_pitch);
+				my d_pulses = Sound_Pitch_to_PointProcess_cc (sound.peek(), my d_pitch.get());
 			} catch (MelderError) {
 				Melder_clearError ();
 			}
@@ -1735,7 +1731,7 @@ void TimeSoundAnalysisEditor_computePulses (TimeSoundAnalysisEditor me) {
 static void TimeSoundAnalysisEditor_v_draw_analysis (TimeSoundAnalysisEditor me) {
 	/*
 	 * d_pitch may not exist yet (if shown at all, it may be going to be created in TimeSoundAnalysisEditor_computePitch (),
-	 * and even if if that fails we should see the pitch settings. So we use a dummy object.
+	 * and even if that fails the user should see what the pitch settings are). So we use a dummy object.
 	 */
 	double pitchFloor_hidden = Function_convertStandardToSpecialUnit (Thing_dummyObject (Pitch), my p_pitch_floor, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
 	double pitchCeiling_hidden = Function_convertStandardToSpecialUnit (Thing_dummyObject (Pitch), my p_pitch_ceiling, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
@@ -1756,19 +1752,19 @@ static void TimeSoundAnalysisEditor_v_draw_analysis (TimeSoundAnalysisEditor me)
 		Graphics_setFont (my d_graphics, kGraphics_font_HELVETICA);
 		Graphics_setFontSize (my d_graphics, 10);
 		Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text3 (my d_graphics, 0.5, 0.67, L"(To see the analyses, zoom in to at most ", Melder_half (my p_longestAnalysis), L" seconds,");
-		Graphics_text (my d_graphics, 0.5, 0.33, L"or raise the \"longest analysis\" setting with \"Show analyses\" in the View menu.)");
+		Graphics_text (my d_graphics, 0.5, 0.67,   U"(To see the analyses, zoom in to at most ", Melder_half (my p_longestAnalysis), U" seconds,");
+		Graphics_text (my d_graphics, 0.5, 0.33, U"or raise the \"longest analysis\" setting with \"Show analyses\" in the View menu.)");
 		Graphics_setFontSize (my d_graphics, 12);
 		return;
 	}
 	TimeSoundAnalysisEditor_computeSpectrogram (me);
-	if (my p_spectrogram_show && my d_spectrogram != NULL) {
-		Spectrogram_paintInside (my d_spectrogram, my d_graphics, my d_startWindow, my d_endWindow,
+	if (my p_spectrogram_show && my d_spectrogram) {
+		Spectrogram_paintInside (my d_spectrogram.get(), my d_graphics, my d_startWindow, my d_endWindow,
 			my p_spectrogram_viewFrom, my p_spectrogram_viewTo, my p_spectrogram_maximum, my p_spectrogram_autoscaling,
 			my p_spectrogram_dynamicRange, my p_spectrogram_preemphasis, my p_spectrogram_dynamicCompression);
 	}
 	TimeSoundAnalysisEditor_computePitch (me);
-	if (my p_pitch_show && my d_pitch != NULL) {
+	if (my p_pitch_show && my d_pitch) {
 		double periodsPerAnalysisWindow = my p_pitch_method == kTimeSoundAnalysisEditor_pitch_analysisMethod_AUTOCORRELATION ? 3.0 : 1.0;
 		double greatestNonUndersamplingTimeStep = 0.5 * periodsPerAnalysisWindow / my p_pitch_floor;
 		double defaultTimeStep = 0.5 * greatestNonUndersamplingTimeStep;
@@ -1783,29 +1779,29 @@ static void TimeSoundAnalysisEditor_v_draw_analysis (TimeSoundAnalysisEditor me)
 		if ((my p_pitch_drawingMethod == kTimeSoundAnalysisEditor_pitch_drawingMethod_AUTOMATIC && (undersampled || numberOfVisiblePitchPoints < 101)) ||
 		    my p_pitch_drawingMethod == kTimeSoundAnalysisEditor_pitch_drawingMethod_SPECKLE)
 		{
-			Pitch_drawInside (my d_pitch, my d_graphics, my d_startWindow, my d_endWindow, pitchViewFrom_overt, pitchViewTo_overt, 2, my p_pitch_unit);
+			Pitch_drawInside (my d_pitch.get(), my d_graphics, my d_startWindow, my d_endWindow, pitchViewFrom_overt, pitchViewTo_overt, 2, my p_pitch_unit);
 		}
 		if ((my p_pitch_drawingMethod == kTimeSoundAnalysisEditor_pitch_drawingMethod_AUTOMATIC && ! undersampled) ||
 		    my p_pitch_drawingMethod == kTimeSoundAnalysisEditor_pitch_drawingMethod_CURVE)
 		{
-			Pitch_drawInside (my d_pitch, my d_graphics, my d_startWindow, my d_endWindow, pitchViewFrom_overt, pitchViewTo_overt, FALSE, my p_pitch_unit);
+			Pitch_drawInside (my d_pitch.get(), my d_graphics, my d_startWindow, my d_endWindow, pitchViewFrom_overt, pitchViewTo_overt, false, my p_pitch_unit);
 		}
 		Graphics_setColour (my d_graphics, Graphics_BLUE);
 		Graphics_setLineWidth (my d_graphics, 1.0);
 		if ((my p_pitch_drawingMethod == kTimeSoundAnalysisEditor_pitch_drawingMethod_AUTOMATIC && (undersampled || numberOfVisiblePitchPoints < 101)) ||
 		    my p_pitch_drawingMethod == kTimeSoundAnalysisEditor_pitch_drawingMethod_SPECKLE)
 		{
-			Pitch_drawInside (my d_pitch, my d_graphics, my d_startWindow, my d_endWindow, pitchViewFrom_overt, pitchViewTo_overt, 1, my p_pitch_unit);
+			Pitch_drawInside (my d_pitch.get(), my d_graphics, my d_startWindow, my d_endWindow, pitchViewFrom_overt, pitchViewTo_overt, 1, my p_pitch_unit);
 		}
 		if ((my p_pitch_drawingMethod == kTimeSoundAnalysisEditor_pitch_drawingMethod_AUTOMATIC && ! undersampled) ||
 		    my p_pitch_drawingMethod == kTimeSoundAnalysisEditor_pitch_drawingMethod_CURVE)
 		{
-			Pitch_drawInside (my d_pitch, my d_graphics, my d_startWindow, my d_endWindow, pitchViewFrom_overt, pitchViewTo_overt, FALSE, my p_pitch_unit);
+			Pitch_drawInside (my d_pitch.get(), my d_graphics, my d_startWindow, my d_endWindow, pitchViewFrom_overt, pitchViewTo_overt, false, my p_pitch_unit);
 		}
 		Graphics_setColour (my d_graphics, Graphics_BLACK);
 	}
 	TimeSoundAnalysisEditor_computeIntensity (me);
-	if (my p_intensity_show && my d_intensity != NULL) {
+	if (my p_intensity_show && my d_intensity) {
 		Graphics_setColour (my d_graphics, my p_spectrogram_show ? Graphics_YELLOW : Graphics_LIME);
 		Graphics_setLineWidth (my d_graphics, my p_spectrogram_show ? 1.0 : 3.0);
 		Intensity_drawInside (my d_intensity, my d_graphics, my d_startWindow, my d_endWindow,
@@ -1814,10 +1810,10 @@ static void TimeSoundAnalysisEditor_v_draw_analysis (TimeSoundAnalysisEditor me)
 		Graphics_setColour (my d_graphics, Graphics_BLACK);
 	}
 	TimeSoundAnalysisEditor_computeFormants (me);
-	if (my p_formant_show && my d_formant != NULL) {
+	if (my p_formant_show && my d_formant) {
 		Graphics_setColour (my d_graphics, Graphics_RED);
 		Graphics_setSpeckleSize (my d_graphics, my p_formant_dotSize);
-		Formant_drawSpeckles_inside (my d_formant, my d_graphics, my d_startWindow, my d_endWindow,
+		Formant_drawSpeckles_inside (my d_formant.get(), my d_graphics, my d_startWindow, my d_endWindow,
 			my p_spectrogram_viewFrom, my p_spectrogram_viewTo, my p_formant_dynamicRange);
 		Graphics_setColour (my d_graphics, Graphics_BLACK);
 	}
@@ -1830,38 +1826,39 @@ static void TimeSoundAnalysisEditor_v_draw_analysis (TimeSoundAnalysisEditor me)
 		Graphics_setColour (my d_graphics, Graphics_BLUE);
 		if (my d_pitch) {
 			if (my d_startSelection == my d_endSelection)
-				pitchCursor_hidden = Pitch_getValueAtTime (my d_pitch, my d_startSelection, my p_pitch_unit, 1);
+				pitchCursor_hidden = Pitch_getValueAtTime (my d_pitch.get(), my d_startSelection, my p_pitch_unit, 1);
 			else
-				pitchCursor_hidden = Pitch_getMean (my d_pitch, my d_startSelection, my d_endSelection, my p_pitch_unit);
-			pitchCursor_overt = Function_convertToNonlogarithmic (my d_pitch, pitchCursor_hidden, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
+				pitchCursor_hidden = Pitch_getMean (my d_pitch.get(), my d_startSelection, my d_endSelection, my p_pitch_unit);
+			pitchCursor_overt = Function_convertToNonlogarithmic (my d_pitch.get(), pitchCursor_hidden, Pitch_LEVEL_FREQUENCY, my p_pitch_unit);
 			if (NUMdefined (pitchCursor_hidden)) {
 				Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_HALF);
-				Graphics_text3 (my d_graphics, my d_endWindow, pitchCursor_hidden, Melder_float (Melder_half (pitchCursor_overt)), L" ",
-					Function_getUnitText (my d_pitch, Pitch_LEVEL_FREQUENCY, my p_pitch_unit, Function_UNIT_TEXT_SHORT | Function_UNIT_TEXT_GRAPHICAL));
+				Graphics_text (my d_graphics, my d_endWindow, pitchCursor_hidden,
+					Melder_float (Melder_half (pitchCursor_overt)), U" ",
+					Function_getUnitText (my d_pitch.get(), Pitch_LEVEL_FREQUENCY, my p_pitch_unit, Function_UNIT_TEXT_SHORT | Function_UNIT_TEXT_GRAPHICAL));
 			}
 			if (! NUMdefined (pitchCursor_hidden) || Graphics_dyWCtoMM (my d_graphics, pitchCursor_hidden - pitchViewFrom_hidden) > 5.0) {
 				Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_BOTTOM);
-				Graphics_text3 (my d_graphics, my d_endWindow, pitchViewFrom_hidden - Graphics_dyMMtoWC (my d_graphics, 0.5),
-					Melder_float (Melder_half (pitchViewFrom_overt)), L" ",
-					Function_getUnitText (my d_pitch, Pitch_LEVEL_FREQUENCY, my p_pitch_unit, Function_UNIT_TEXT_SHORT | Function_UNIT_TEXT_GRAPHICAL));
+				Graphics_text (my d_graphics, my d_endWindow, pitchViewFrom_hidden - Graphics_dyMMtoWC (my d_graphics, 0.5),
+					Melder_float (Melder_half (pitchViewFrom_overt)), U" ",
+					Function_getUnitText (my d_pitch.get(), Pitch_LEVEL_FREQUENCY, my p_pitch_unit, Function_UNIT_TEXT_SHORT | Function_UNIT_TEXT_GRAPHICAL));
 			}
 			if (! NUMdefined (pitchCursor_hidden) || Graphics_dyWCtoMM (my d_graphics, pitchViewTo_hidden - pitchCursor_hidden) > 5.0) {
 				Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_TOP);
-				Graphics_text3 (my d_graphics, my d_endWindow, pitchViewTo_hidden, Melder_float (Melder_half (pitchViewTo_overt)), L" ",
-					Function_getUnitText (my d_pitch, Pitch_LEVEL_FREQUENCY, my p_pitch_unit, Function_UNIT_TEXT_SHORT | Function_UNIT_TEXT_GRAPHICAL));
+				Graphics_text (my d_graphics, my d_endWindow, pitchViewTo_hidden,
+					Melder_float (Melder_half (pitchViewTo_overt)), U" ",
+					Function_getUnitText (my d_pitch.get(), Pitch_LEVEL_FREQUENCY, my p_pitch_unit, Function_UNIT_TEXT_SHORT | Function_UNIT_TEXT_GRAPHICAL));
 			}
 		} else {
 			Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_HALF);
 			Graphics_setFontSize (my d_graphics, 10);
 			Graphics_text (my d_graphics, 0.5 * (my d_startWindow + my d_endWindow), 0.5 * (pitchViewFrom_hidden + pitchViewTo_hidden),
-				L"(Cannot show pitch contour. Zoom out or change bottom of pitch range in pitch settings.)");
+				U"(Cannot show pitch contour. Zoom out or change bottom of pitch range in pitch settings.)");
 			Graphics_setFontSize (my d_graphics, 12);
 		}
 		Graphics_setColour (my d_graphics, Graphics_BLACK);
 	}
 	if (my p_intensity_show) {
 		double intensityCursor = NUMundefined;
-		int intensityCursorVisible;
 		Graphics_Colour textColour;
 		int alignment;
 		double y;
@@ -1878,28 +1875,30 @@ static void TimeSoundAnalysisEditor_v_draw_analysis (TimeSoundAnalysisEditor me)
 				}
 			}
 			Graphics_setColour (my d_graphics, textColour);
-			intensityCursorVisible = NUMdefined (intensityCursor) && intensityCursor > my p_intensity_viewFrom && intensityCursor < my p_intensity_viewTo;
+			bool intensityCursorVisible = NUMdefined (intensityCursor) &&
+				intensityCursor > my p_intensity_viewFrom && intensityCursor < my p_intensity_viewTo;
 			if (intensityCursorVisible) {
-				static const wchar_t *methodString [] = { L" (.5)", L" (μE)", L" (μS)", L" (μ)" };
+				static const char32 *methodString [] = { U" (.5)", U" (μE)", U" (μS)", U" (μ)" };
 				Graphics_setTextAlignment (my d_graphics, alignment, Graphics_HALF);
-				Graphics_text3 (my d_graphics, y, intensityCursor, Melder_float (Melder_half (intensityCursor)), L" dB",
-					my d_startSelection == my d_endSelection ? L"" : methodString [my p_intensity_averagingMethod]);
+				Graphics_text (my d_graphics, y, intensityCursor,
+					Melder_float (Melder_half (intensityCursor)), U" dB",
+					my d_startSelection == my d_endSelection ? U"" : methodString [my p_intensity_averagingMethod]);
 			}
 			if (! intensityCursorVisible || Graphics_dyWCtoMM (my d_graphics, intensityCursor - my p_intensity_viewFrom) > 5.0) {
 				Graphics_setTextAlignment (my d_graphics, alignment, Graphics_BOTTOM);
-				Graphics_text2 (my d_graphics, y, my p_intensity_viewFrom - Graphics_dyMMtoWC (my d_graphics, 0.5),
-					Melder_float (Melder_half (my p_intensity_viewFrom)), L" dB");
+				Graphics_text (my d_graphics, y, my p_intensity_viewFrom - Graphics_dyMMtoWC (my d_graphics, 0.5),
+					Melder_float (Melder_half (my p_intensity_viewFrom)), U" dB");
 			}
 			if (! intensityCursorVisible || Graphics_dyWCtoMM (my d_graphics, my p_intensity_viewTo - intensityCursor) > 5.0) {
 				Graphics_setTextAlignment (my d_graphics, alignment, Graphics_TOP);
-				Graphics_text2 (my d_graphics, y, my p_intensity_viewTo, Melder_float (Melder_half (my p_intensity_viewTo)), L" dB");
+				Graphics_text (my d_graphics, y, my p_intensity_viewTo,
+					Melder_float (Melder_half (my p_intensity_viewTo)), U" dB");
 			}
 			Graphics_setColour (my d_graphics, Graphics_BLACK);
 		}
 	}
 	if (my p_spectrogram_show || my p_formant_show) {
-		static MelderString text = { 0 };
-		int frequencyCursorVisible = my d_spectrogram_cursor > my p_spectrogram_viewFrom && my d_spectrogram_cursor < my p_spectrogram_viewTo;
+		bool frequencyCursorVisible = my d_spectrogram_cursor > my p_spectrogram_viewFrom && my d_spectrogram_cursor < my p_spectrogram_viewTo;
 		Graphics_setWindow (my d_graphics, my d_startWindow, my d_endWindow, my p_spectrogram_viewFrom, my p_spectrogram_viewTo);
 		/*
 		 * Range marks.
@@ -1907,16 +1906,14 @@ static void TimeSoundAnalysisEditor_v_draw_analysis (TimeSoundAnalysisEditor me)
 		Graphics_setLineType (my d_graphics, Graphics_DRAWN);
 		Graphics_setColour (my d_graphics, Graphics_BLACK);
 		if (! frequencyCursorVisible || Graphics_dyWCtoMM (my d_graphics, my d_spectrogram_cursor - my p_spectrogram_viewFrom) > 5.0) {
-			MelderString_empty (& text);
-			MelderString_append (& text, Melder_half (my p_spectrogram_viewFrom), L" Hz");
 			Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_BOTTOM);
-			Graphics_text (my d_graphics, my d_startWindow, my p_spectrogram_viewFrom - Graphics_dyMMtoWC (my d_graphics, 0.5), Melder_float (text.string));
+			Graphics_text (my d_graphics, my d_startWindow, my p_spectrogram_viewFrom - Graphics_dyMMtoWC (my d_graphics, 0.5),
+				Melder_float (Melder_half (my p_spectrogram_viewFrom)), U" Hz");
 		}
 		if (! frequencyCursorVisible || Graphics_dyWCtoMM (my d_graphics, my p_spectrogram_viewTo - my d_spectrogram_cursor) > 5.0) {
-			MelderString_empty (& text);
-			MelderString_append (& text, Melder_half (my p_spectrogram_viewTo), L" Hz");
 			Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_TOP);
-			Graphics_text (my d_graphics, my d_startWindow, my p_spectrogram_viewTo, Melder_float (text.string));
+			Graphics_text (my d_graphics, my d_startWindow, my p_spectrogram_viewTo,
+				Melder_float (Melder_half (my p_spectrogram_viewTo)), U" Hz");
 		}
 		/*
 		 * Cursor lines.
@@ -1926,7 +1923,7 @@ static void TimeSoundAnalysisEditor_v_draw_analysis (TimeSoundAnalysisEditor me)
 		if (frequencyCursorVisible) {
 			double x = my d_startWindow, y = my d_spectrogram_cursor;
 			Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_HALF);
-			Graphics_text2 (my d_graphics, x, y, Melder_float (Melder_half (y)), L" Hz");
+			Graphics_text (my d_graphics, x, y,   Melder_float (Melder_half (y)), U" Hz");
 			Graphics_line (my d_graphics, x, y, my d_endWindow, y);
 		}
 		/*
@@ -1948,8 +1945,8 @@ void structTimeSoundAnalysisEditor :: v_draw_analysis () {
 
 void structTimeSoundAnalysisEditor :: v_draw_analysis_pulses () {
 	TimeSoundAnalysisEditor_computePulses (this);
-	if (our p_pulses_show && our d_endWindow - our d_startWindow <= our p_longestAnalysis && our d_pulses != NULL) {
-		PointProcess point = d_pulses;
+	if (our p_pulses_show && our d_endWindow - our d_startWindow <= our p_longestAnalysis && our d_pulses) {
+		PointProcess point = our d_pulses.get();
 		Graphics_setWindow (our d_graphics, our d_startWindow, our d_endWindow, -1.0, 1.0);
 		Graphics_setColour (our d_graphics, Graphics_BLUE);
 		if (point -> nt < 2000) for (long i = 1; i <= point -> nt; i ++) {
@@ -1963,26 +1960,26 @@ void structTimeSoundAnalysisEditor :: v_draw_analysis_pulses () {
 
 int structTimeSoundAnalysisEditor :: v_click (double xbegin, double ybegin, bool shiftKeyPressed) {
 	if (our p_pitch_show) {
-		//Melder_warning (xbegin, L" ", ybegin);
+		//Melder_warning (xbegin, U" ", ybegin);
 		if (xbegin >= our d_endWindow && ybegin > 0.48 && ybegin <= 0.50) {
 			our pref_pitch_ceiling () = our p_pitch_ceiling = our p_pitch_ceiling * 1.26;
-			forget (our d_pitch);
+			our d_pitch. reset();
 			forget (our d_intensity);
-			forget (our d_pulses);
+			our d_pulses. reset();
 			return 1;
 		}
 		if (xbegin >= our d_endWindow && ybegin > 0.46 && ybegin <= 0.48) {
 			our pref_pitch_ceiling () = our p_pitch_ceiling = our p_pitch_ceiling / 1.26;
-			forget (our d_pitch);
+			our d_pitch. reset();
 			forget (our d_intensity);
-			forget (our d_pulses);
+			our d_pulses. reset();
 			return 1;
 		}
 	}
 	return TimeSoundAnalysisEditor_Parent :: v_click (xbegin, ybegin, shiftKeyPressed);
 }
 
-void TimeSoundAnalysisEditor_init (TimeSoundAnalysisEditor me, const wchar_t *title, Function data, Sampled sound, bool ownSound) {
+void TimeSoundAnalysisEditor_init (TimeSoundAnalysisEditor me, const char32 *title, Function data, Sampled sound, bool ownSound) {
 	TimeSoundEditor_init (me, title, data, sound, ownSound);
 	if (my v_hasAnalysis ()) {
 		if (my p_log1_toLogFile == false && my p_log1_toInfoWindow == false) {
diff --git a/fon/TimeSoundAnalysisEditor.h b/fon/TimeSoundAnalysisEditor.h
index 6135b34..60c5b39 100644
--- a/fon/TimeSoundAnalysisEditor.h
+++ b/fon/TimeSoundAnalysisEditor.h
@@ -37,7 +37,7 @@
  * pb 2005/01/11 getBottomOfSoundAndAnalysisArea
  * pb 2005/06/16 units
  * pb 2005/12/07 arrowScrollStep
- * pb 2007/06/10 wchar_t
+ * pb 2007/06/10 wchar
  * pb 2007/09/02 direct drawing to picture window
  * pb 2007/09/08 inherit from TimeSoundEditor
  * pb 2007/11/01 direct intensity, formants, and pulses drawing
@@ -55,48 +55,54 @@
 
 #include "TimeSoundAnalysisEditor_enums.h"
 
-Thing_define (TimeSoundAnalysisEditor, TimeSoundEditor) { public:
-	// new data:
-		Spectrogram d_spectrogram;
-		double d_spectrogram_cursor;
-		Pitch d_pitch;
-		Intensity d_intensity;
-		Formant d_formant;
-		PointProcess d_pulses;
-		GuiMenuItem spectrogramToggle, pitchToggle, intensityToggle, formantToggle, pulsesToggle;
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_info ();
-		virtual void v_createMenuItems_query (EditorMenu menu);
-		virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
-		virtual void v_createMenuItems_view_sound (EditorMenu menu);
-		virtual double v_getBottomOfSoundArea () {
-			return p_spectrogram_show || p_pitch_show || p_intensity_show || p_formant_show ? 0.5 : 0.0;
-		}
-	// new methods:
-		virtual bool v_hasAnalysis    () { return true; }
-		virtual bool v_hasSpectrogram () { return true; }
-		virtual bool v_hasPitch       () { return true; }
-		virtual bool v_hasIntensity   () { return true; }
-		virtual bool v_hasFormants    () { return true; }
-		virtual bool v_hasPulses      () { return true; }
-		virtual void v_destroy_analysis ();
-		virtual void v_createMenuItems_spectrum_picture (EditorMenu menu);
-		virtual void v_createMenuItems_pitch_picture (EditorMenu menu);
-		virtual void v_createMenuItems_intensity_picture (EditorMenu menu);
-		virtual void v_createMenuItems_formant_picture (EditorMenu menu);
-		virtual void v_createMenuItems_pulses_picture (EditorMenu menu);
-		virtual void v_draw_analysis ();
-		virtual void v_draw_analysis_pulses ();
-		virtual void v_createMenuItems_query_log (EditorMenu menu);
-		virtual void v_createMenus_analysis ();
-		virtual void v_createMenuItems_view_sound_analysis (EditorMenu menu);
-	// preferences:
-		#include "TimeSoundAnalysisEditor_prefs.h"
+Thing_define (TimeSoundAnalysisEditor, TimeSoundEditor) {
+	autoSpectrogram d_spectrogram;
+	double d_spectrogram_cursor;
+	autoPitch d_pitch;
+	Intensity d_intensity;
+	autoFormant d_formant;
+	autoPointProcess d_pulses;
+	GuiMenuItem spectrogramToggle, pitchToggle, intensityToggle, formantToggle, pulsesToggle;
+
+	void v_destroy ()
+		override;
+	void v_info ()
+		override;
+	void v_createMenuItems_query (EditorMenu menu)
+		override;
+	int v_click (double xWC, double yWC, bool shiftKeyPressed)
+		override;
+	void v_createMenuItems_view_sound (EditorMenu menu)
+		override;
+	double v_getBottomOfSoundArea ()
+		override
+	{
+		return p_spectrogram_show || p_pitch_show || p_intensity_show || p_formant_show ? 0.5 : 0.0;
+	}
+
+	virtual bool v_hasAnalysis    () { return true; }
+	virtual bool v_hasSpectrogram () { return true; }
+	virtual bool v_hasPitch       () { return true; }
+	virtual bool v_hasIntensity   () { return true; }
+	virtual bool v_hasFormants    () { return true; }
+	virtual bool v_hasPulses      () { return true; }
+	virtual void v_destroy_analysis ();
+	virtual void v_createMenuItems_spectrum_picture (EditorMenu menu);
+	virtual void v_createMenuItems_pitch_picture (EditorMenu menu);
+	virtual void v_createMenuItems_intensity_picture (EditorMenu menu);
+	virtual void v_createMenuItems_formant_picture (EditorMenu menu);
+	virtual void v_createMenuItems_pulses_picture (EditorMenu menu);
+	virtual void v_draw_analysis ();
+	virtual void v_draw_analysis_pulses ();
+	virtual void v_createMenuItems_query_log (EditorMenu menu);
+	virtual void v_createMenus_analysis ();
+	virtual void v_createMenuItems_view_sound_analysis (EditorMenu menu);
+
+	#include "TimeSoundAnalysisEditor_prefs.h"
 };
 
 void TimeSoundAnalysisEditor_init (TimeSoundAnalysisEditor me,
-	const wchar_t *title, Function data, Sampled sound, bool ownSound);
+	const char32 *title, Function data, Sampled sound, bool ownSound);
 
 void TimeSoundAnalysisEditor_computeSpectrogram (TimeSoundAnalysisEditor me);
 void TimeSoundAnalysisEditor_computePitch (TimeSoundAnalysisEditor me);
diff --git a/fon/TimeSoundAnalysisEditor_enums.h b/fon/TimeSoundAnalysisEditor_enums.h
index afdab65..df24128 100644
--- a/fon/TimeSoundAnalysisEditor_enums.h
+++ b/fon/TimeSoundAnalysisEditor_enums.h
@@ -1,6 +1,6 @@
 /* TimeSoundAnalysisEditor_enums.h
  *
- * Copyright (C) 2007,2013 Paul Boersma
+ * Copyright (C) 2007,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,32 +18,32 @@
  */
 
 enums_begin (kTimeSoundAnalysisEditor_timeStepStrategy, 1)
-	enums_add (kTimeSoundAnalysisEditor_timeStepStrategy, 1, AUTOMATIC, L"automatic")
-	enums_add (kTimeSoundAnalysisEditor_timeStepStrategy, 2, FIXED, L"fixed")
-	enums_add (kTimeSoundAnalysisEditor_timeStepStrategy, 3, VIEW_DEPENDENT, L"view-dependent")
+	enums_add (kTimeSoundAnalysisEditor_timeStepStrategy, 1, AUTOMATIC, U"automatic")
+	enums_add (kTimeSoundAnalysisEditor_timeStepStrategy, 2, FIXED, U"fixed")
+	enums_add (kTimeSoundAnalysisEditor_timeStepStrategy, 3, VIEW_DEPENDENT, U"view-dependent")
 enums_end (kTimeSoundAnalysisEditor_timeStepStrategy, 3, AUTOMATIC)
 
 enums_begin (kTimeSoundAnalysisEditor_pitch_drawingMethod, 1)
-	enums_add (kTimeSoundAnalysisEditor_pitch_drawingMethod, 1, CURVE, L"curve")
-	enums_add (kTimeSoundAnalysisEditor_pitch_drawingMethod, 2, SPECKLE, L"speckles")
-	enums_alt (kTimeSoundAnalysisEditor_pitch_drawingMethod,    SPECKLE, L"speckle")
-	enums_add (kTimeSoundAnalysisEditor_pitch_drawingMethod, 3, AUTOMATIC, L"automatic")
+	enums_add (kTimeSoundAnalysisEditor_pitch_drawingMethod, 1, CURVE, U"curve")
+	enums_add (kTimeSoundAnalysisEditor_pitch_drawingMethod, 2, SPECKLE, U"speckles")
+	enums_alt (kTimeSoundAnalysisEditor_pitch_drawingMethod,    SPECKLE, U"speckle")
+	enums_add (kTimeSoundAnalysisEditor_pitch_drawingMethod, 3, AUTOMATIC, U"automatic")
 enums_end (kTimeSoundAnalysisEditor_pitch_drawingMethod, 3, AUTOMATIC)
 
 enums_begin (kTimeSoundAnalysisEditor_pitch_analysisMethod, 1)
-	enums_add (kTimeSoundAnalysisEditor_pitch_analysisMethod, 1, AUTOCORRELATION, L"autocorrelation")
-	enums_add (kTimeSoundAnalysisEditor_pitch_analysisMethod, 2, CROSS_CORRELATION, L"cross-correlation")
+	enums_add (kTimeSoundAnalysisEditor_pitch_analysisMethod, 1, AUTOCORRELATION, U"autocorrelation")
+	enums_add (kTimeSoundAnalysisEditor_pitch_analysisMethod, 2, CROSS_CORRELATION, U"cross-correlation")
 enums_end (kTimeSoundAnalysisEditor_pitch_analysisMethod, 2, AUTOCORRELATION)
 
 enums_begin (kTimeSoundAnalysisEditor_intensity_averagingMethod, 0)
-	enums_add (kTimeSoundAnalysisEditor_intensity_averagingMethod, 0, MEDIAN, L"median")   // BUG: this HAS to be zero!
-	enums_add (kTimeSoundAnalysisEditor_intensity_averagingMethod, 1, MEAN_ENERGY, L"mean energy")
-	enums_add (kTimeSoundAnalysisEditor_intensity_averagingMethod, 2, MEAN_SONES, L"mean sones")
-	enums_add (kTimeSoundAnalysisEditor_intensity_averagingMethod, 3, MEAN_DB, L"mean dB")
+	enums_add (kTimeSoundAnalysisEditor_intensity_averagingMethod, 0, MEDIAN, U"median")   // BUG: this HAS to be zero!
+	enums_add (kTimeSoundAnalysisEditor_intensity_averagingMethod, 1, MEAN_ENERGY, U"mean energy")
+	enums_add (kTimeSoundAnalysisEditor_intensity_averagingMethod, 2, MEAN_SONES, U"mean sones")
+	enums_add (kTimeSoundAnalysisEditor_intensity_averagingMethod, 3, MEAN_DB, U"mean dB")
 enums_end (kTimeSoundAnalysisEditor_intensity_averagingMethod, 3, MEAN_ENERGY)
 
 enums_begin (kTimeSoundAnalysisEditor_formant_analysisMethod, 1)
-	enums_add (kTimeSoundAnalysisEditor_formant_analysisMethod, 1, BURG, L"Burg")
+	enums_add (kTimeSoundAnalysisEditor_formant_analysisMethod, 1, BURG, U"Burg")
 enums_end (kTimeSoundAnalysisEditor_formant_analysisMethod, 1, BURG)
 
 /* End of file TimeSoundAnalysisEditor_enums.h */
diff --git a/fon/TimeSoundAnalysisEditor_prefs.h b/fon/TimeSoundAnalysisEditor_prefs.h
index 8aa3a03..297d116 100644
--- a/fon/TimeSoundAnalysisEditor_prefs.h
+++ b/fon/TimeSoundAnalysisEditor_prefs.h
@@ -1,6 +1,6 @@
 /* TimeSoundAnalysisEditor_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,83 +18,84 @@
  */
 
 prefs_begin (TimeSoundAnalysisEditor)
-	// new:
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, longestAnalysis,                 1, L"10.0")   // seconds
-		prefs_add_enum_with_data   (TimeSoundAnalysisEditor, timeStepStrategy,                1, kTimeSoundAnalysisEditor_timeStepStrategy, DEFAULT)
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, fixedTimeStep,                   1, L"0.01")   // seconds
-		prefs_add_long_with_data   (TimeSoundAnalysisEditor, numberOfTimeStepsPerView,        1, L"100")
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, spectrogram_show,                1, true)
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_viewFrom,            2, L"0.0")   // Hz
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_viewTo,              2, L"5000.0")   // Hz
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_windowLength,        2, L"0.005")   // seconds
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_dynamicRange,        2, L"70.0")   // dB
-		prefs_add_long_with_data   (TimeSoundAnalysisEditor, spectrogram_timeSteps,           2, L"1000")
-		prefs_add_long_with_data   (TimeSoundAnalysisEditor, spectrogram_frequencySteps,      2, L"250")
-		prefs_add_enum_with_data   (TimeSoundAnalysisEditor, spectrogram_method,              2, kSound_to_Spectrogram_method, DEFAULT)
-		prefs_add_enum_with_data   (TimeSoundAnalysisEditor, spectrogram_windowShape,         2, kSound_to_Spectrogram_windowShape, DEFAULT)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, spectrogram_autoscaling,         2, true)
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_maximum,             2, L"100.0")   // dB/Hz
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_preemphasis,         2, L"6.0")   // dB/octave
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_dynamicCompression,  2, L"0.0")   // 0..1
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, spectrogram_picture_garnish,     1, true)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pitch_show,                      1, true)
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_floor,                     1, L"75.0")
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_ceiling,                   1, L"500.0")
-		prefs_add_enum_with_data   (TimeSoundAnalysisEditor, pitch_unit,                      1, kPitch_unit, DEFAULT)
-		prefs_add_enum_with_data   (TimeSoundAnalysisEditor, pitch_drawingMethod,             1, kTimeSoundAnalysisEditor_pitch_drawingMethod, DEFAULT)
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_viewFrom,                  1, L"0.0 (= auto)")
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_viewTo,                    1, L"0.0 (= auto)")
-		prefs_add_enum_with_data   (TimeSoundAnalysisEditor, pitch_method,                    1, kTimeSoundAnalysisEditor_pitch_analysisMethod, DEFAULT)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pitch_veryAccurate,              1, false)
-		prefs_add_long_with_data   (TimeSoundAnalysisEditor, pitch_maximumNumberOfCandidates, 1, L"15")
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_silenceThreshold,          1, L"0.03")
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_voicingThreshold,          1, L"0.45")
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_octaveCost,                1, L"0.01")
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_octaveJumpCost,            1, L"0.35")
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_voicedUnvoicedCost,        1, L"0.14")
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pitch_picture_speckle,           1, false)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pitch_picture_garnish,           1, true)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, intensity_show,                  1, false)
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, intensity_viewFrom,              1, L"50.0")   // dB
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, intensity_viewTo,                1, L"100.0")   // dB
-		prefs_add_enum_with_data   (TimeSoundAnalysisEditor, intensity_averagingMethod,       1, kTimeSoundAnalysisEditor_intensity_averagingMethod, DEFAULT)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, intensity_subtractMeanPressure,  1, true)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, intensity_picture_garnish,       1, true)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, formant_show,                    1, false)
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_maximumFormant,          1, L"5500.0")   // Hz
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_numberOfFormants,        1, L"5.0")
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_windowLength,            1, L"0.025")   // seconds
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_dynamicRange,            1, L"30.0")   // dB
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_dotSize,                 1, L"1.0")   // mm
-		prefs_add_enum_with_data   (TimeSoundAnalysisEditor, formant_method,                  1, kTimeSoundAnalysisEditor_formant_analysisMethod, BURG)
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_preemphasisFrom,         1, L"50.0")   // Hz
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, formant_picture_garnish,         1, true)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pulses_show,                     1, false)
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pulses_maximumPeriodFactor,      1, L"1.3")
-		prefs_add_double_with_data (TimeSoundAnalysisEditor, pulses_maximumAmplitudeFactor,   1, L"1.6")
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pulses_picture_garnish,          1, true)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, log1_toInfoWindow,               1, true)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, log1_toLogFile,                  1, true)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, log2_toInfoWindow,               1, true)
-		prefs_add_bool_with_data   (TimeSoundAnalysisEditor, log2_toLogFile,                  1, true)
-		#if defined (macintosh)
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, log1_fileName,               1, L"~/Desktop/Pitch Log")
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, log2_fileName,               1, L"~/Desktop/Formant Log")
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript3,                  1, L"~/Desktop/Log script 3")
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript4,                  1, L"~/Desktop/Log script 4")
-		#elif defined (WIN32)
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, log1_fileName,               1, L"C:\\WINDOWS\\DESKTOP\\Pitch Log.txt")
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, log2_fileName,               1, L"C:\\WINDOWS\\DESKTOP\\Formant Log.txt")
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript3,                  1, L"C:\\WINDOWS\\DESKTOP\\Log script 3.praat")
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript4,                  1, L"C:\\WINDOWS\\DESKTOP\\Log script 4.praat")
-		#else
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, log1_fileName,               1, L"~/pitch_log")
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, log2_fileName,               1, L"~/formant_log")
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript3,                  1, L"~/log_script3")
-			prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript4,                  1, L"~/log_script4")
-		#endif
-		prefs_add_string_with_data (TimeSoundAnalysisEditor, log1_format,                     1, L"Time 'time:6' seconds, pitch 'f0:2' Hz")
-		prefs_add_string_with_data (TimeSoundAnalysisEditor, log2_format,                     1, L"'t1:4''tab$''t2:4''tab$''f1:0''tab$''f2:0''tab$''f3:0'")
+
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, longestAnalysis,                 1, U"10.0")   // seconds
+	prefs_add_enum_with_data   (TimeSoundAnalysisEditor, timeStepStrategy,                1, kTimeSoundAnalysisEditor_timeStepStrategy, DEFAULT)
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, fixedTimeStep,                   1, U"0.01")   // seconds
+	prefs_add_long_with_data   (TimeSoundAnalysisEditor, numberOfTimeStepsPerView,        1, U"100")
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, spectrogram_show,                1, true)
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_viewFrom,            2, U"0.0")   // Hz
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_viewTo,              2, U"5000.0")   // Hz
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_windowLength,        2, U"0.005")   // seconds
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_dynamicRange,        2, U"70.0")   // dB
+	prefs_add_long_with_data   (TimeSoundAnalysisEditor, spectrogram_timeSteps,           2, U"1000")
+	prefs_add_long_with_data   (TimeSoundAnalysisEditor, spectrogram_frequencySteps,      2, U"250")
+	prefs_add_enum_with_data   (TimeSoundAnalysisEditor, spectrogram_method,              2, kSound_to_Spectrogram_method, DEFAULT)
+	prefs_add_enum_with_data   (TimeSoundAnalysisEditor, spectrogram_windowShape,         2, kSound_to_Spectrogram_windowShape, DEFAULT)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, spectrogram_autoscaling,         2, true)
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_maximum,             2, U"100.0")   // dB/Hz
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_preemphasis,         2, U"6.0")   // dB/octave
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, spectrogram_dynamicCompression,  2, U"0.0")   // 0..1
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, spectrogram_picture_garnish,     1, true)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pitch_show,                      1, true)
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_floor,                     1, U"75.0")
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_ceiling,                   1, U"500.0")
+	prefs_add_enum_with_data   (TimeSoundAnalysisEditor, pitch_unit,                      1, kPitch_unit, DEFAULT)
+	prefs_add_enum_with_data   (TimeSoundAnalysisEditor, pitch_drawingMethod,             1, kTimeSoundAnalysisEditor_pitch_drawingMethod, DEFAULT)
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_viewFrom,                  1, U"0.0 (= auto)")
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_viewTo,                    1, U"0.0 (= auto)")
+	prefs_add_enum_with_data   (TimeSoundAnalysisEditor, pitch_method,                    1, kTimeSoundAnalysisEditor_pitch_analysisMethod, DEFAULT)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pitch_veryAccurate,              1, false)
+	prefs_add_long_with_data   (TimeSoundAnalysisEditor, pitch_maximumNumberOfCandidates, 1, U"15")
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_silenceThreshold,          1, U"0.03")
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_voicingThreshold,          1, U"0.45")
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_octaveCost,                1, U"0.01")
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_octaveJumpCost,            1, U"0.35")
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pitch_voicedUnvoicedCost,        1, U"0.14")
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pitch_picture_speckle,           1, false)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pitch_picture_garnish,           1, true)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, intensity_show,                  1, false)
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, intensity_viewFrom,              1, U"50.0")   // dB
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, intensity_viewTo,                1, U"100.0")   // dB
+	prefs_add_enum_with_data   (TimeSoundAnalysisEditor, intensity_averagingMethod,       1, kTimeSoundAnalysisEditor_intensity_averagingMethod, DEFAULT)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, intensity_subtractMeanPressure,  1, true)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, intensity_picture_garnish,       1, true)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, formant_show,                    1, false)
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_maximumFormant,          1, U"5500.0")   // Hz
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_numberOfFormants,        1, U"5.0")
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_windowLength,            1, U"0.025")   // seconds
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_dynamicRange,            1, U"30.0")   // dB
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_dotSize,                 1, U"1.0")   // mm
+	prefs_add_enum_with_data   (TimeSoundAnalysisEditor, formant_method,                  1, kTimeSoundAnalysisEditor_formant_analysisMethod, BURG)
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, formant_preemphasisFrom,         1, U"50.0")   // Hz
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, formant_picture_garnish,         1, true)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pulses_show,                     1, false)
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pulses_maximumPeriodFactor,      1, U"1.3")
+	prefs_add_double_with_data (TimeSoundAnalysisEditor, pulses_maximumAmplitudeFactor,   1, U"1.6")
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, pulses_picture_garnish,          1, true)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, log1_toInfoWindow,               1, true)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, log1_toLogFile,                  1, true)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, log2_toInfoWindow,               1, true)
+	prefs_add_bool_with_data   (TimeSoundAnalysisEditor, log2_toLogFile,                  1, true)
+	#if defined (macintosh)
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, log1_fileName,               1, U"~/Desktop/Pitch Log")
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, log2_fileName,               1, U"~/Desktop/Formant Log")
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript3,                  1, U"~/Desktop/Log script 3")
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript4,                  1, U"~/Desktop/Log script 4")
+	#elif defined (WIN32)
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, log1_fileName,               1, U"C:\\WINDOWS\\DESKTOP\\Pitch Log.txt")
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, log2_fileName,               1, U"C:\\WINDOWS\\DESKTOP\\Formant Log.txt")
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript3,                  1, U"C:\\WINDOWS\\DESKTOP\\Log script 3.praat")
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript4,                  1, U"C:\\WINDOWS\\DESKTOP\\Log script 4.praat")
+	#else
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, log1_fileName,               1, U"~/pitch_log")
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, log2_fileName,               1, U"~/formant_log")
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript3,                  1, U"~/log_script3")
+		prefs_add_string_with_data (TimeSoundAnalysisEditor, logScript4,                  1, U"~/log_script4")
+	#endif
+	prefs_add_string_with_data (TimeSoundAnalysisEditor, log1_format,                     1, U"Time 'time:6' seconds, pitch 'f0:2' Hz")
+	prefs_add_string_with_data (TimeSoundAnalysisEditor, log2_format,                     1, U"'t1:4''tab$''t2:4''tab$''f1:0''tab$''f2:0''tab$''f3:0'")
+
 prefs_end (TimeSoundAnalysisEditor)
 
 /* End of file TimeSoundAnalysisEditor_prefs.h */
diff --git a/fon/TimeSoundEditor.cpp b/fon/TimeSoundEditor.cpp
index f775e9c..39c56d7 100644
--- a/fon/TimeSoundEditor.cpp
+++ b/fon/TimeSoundEditor.cpp
@@ -1,6 +1,6 @@
 /* TimeSoundEditor.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,46 +46,46 @@ void structTimeSoundEditor :: v_destroy () {
 void structTimeSoundEditor :: v_info () {
 	TimeSoundEditor_Parent :: v_info ();
 	/* Sound flags: */
-	MelderInfo_writeLine (L"Sound scaling strategy: ", kTimeSoundEditor_scalingStrategy_getText (p_sound_scalingStrategy));
+	MelderInfo_writeLine (U"Sound scaling strategy: ", kTimeSoundEditor_scalingStrategy_getText (p_sound_scalingStrategy));
 }
 
 /***** FILE MENU *****/
 
 static void menu_cb_DrawVisibleSound (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM (L"Draw visible sound", 0)
+	EDITOR_FORM (U"Draw visible sound", 0)
 		my v_form_pictureWindow (cmd);
-		LABEL (L"", L"Sound:")
-		BOOLEAN (L"Preserve times", my default_picture_preserveTimes ());
-		REAL (L"left Vertical range", my default_picture_bottom ())
-		REAL (L"right Vertical range", my default_picture_top ())
+		LABEL (U"", U"Sound:")
+		BOOLEAN (U"Preserve times", my default_picture_preserveTimes ());
+		REAL (U"left Vertical range", my default_picture_bottom ())
+		REAL (U"right Vertical range", my default_picture_top ())
 		my v_form_pictureMargins (cmd);
 		my v_form_pictureSelection (cmd);
-		BOOLEAN (L"Garnish", my default_picture_garnish ());
+		BOOLEAN (U"Garnish", my default_picture_garnish ());
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
-		SET_INTEGER (L"Preserve times", my pref_picture_preserveTimes ());
-		SET_REAL (L"left Vertical range", my pref_picture_bottom ());
-		SET_REAL (L"right Vertical range", my pref_picture_top ());
+		SET_INTEGER (U"Preserve times", my pref_picture_preserveTimes ());
+		SET_REAL (U"left Vertical range", my pref_picture_bottom ());
+		SET_REAL (U"right Vertical range", my pref_picture_top ());
 		my v_ok_pictureMargins (cmd);
 		my v_ok_pictureSelection (cmd);
-		SET_INTEGER (L"Garnish", my pref_picture_garnish ());
+		SET_INTEGER (U"Garnish", my pref_picture_garnish ());
 	EDITOR_DO
 		my v_do_pictureWindow (cmd);
-		my pref_picture_preserveTimes () = GET_INTEGER (L"Preserve times");
-		my pref_picture_bottom () = GET_REAL (L"left Vertical range");
-		my pref_picture_top () = GET_REAL (L"right Vertical range");
+		my pref_picture_preserveTimes () = GET_INTEGER (U"Preserve times");
+		my pref_picture_bottom () = GET_REAL (U"left Vertical range");
+		my pref_picture_top () = GET_REAL (U"right Vertical range");
 		my v_do_pictureMargins (cmd);
 		my v_do_pictureSelection (cmd);
-		my pref_picture_garnish () = GET_INTEGER (L"Garnish");
+		my pref_picture_garnish () = GET_INTEGER (U"Garnish");
 		if (my d_longSound.data == NULL && my d_sound.data == NULL)
-			Melder_throw ("There is no sound to draw.");
+			Melder_throw (U"There is no sound to draw.");
 		autoSound publish = my d_longSound.data ?
 			LongSound_extractPart (my d_longSound.data, my d_startWindow, my d_endWindow, my pref_picture_preserveTimes ()) :
 			Sound_extractPart (my d_sound.data, my d_startWindow, my d_endWindow, kSound_windowShape_RECTANGULAR, 1.0, my pref_picture_preserveTimes ());
 		Editor_openPraatPicture (me);
 		Sound_draw (publish.peek(), my pictureGraphics, 0.0, 0.0, my pref_picture_bottom (), my pref_picture_top (),
-			my pref_picture_garnish (), L"Curve");
+			my pref_picture_garnish (), U"Curve");
 		FunctionEditor_garnish (me);
 		Editor_closePraatPicture (me);
 	EDITOR_END
@@ -93,113 +93,113 @@ static void menu_cb_DrawVisibleSound (EDITOR_ARGS) {
 
 static void menu_cb_DrawSelectedSound (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM (L"Draw selected sound", 0)
+	EDITOR_FORM (U"Draw selected sound", 0)
 		my v_form_pictureWindow (cmd);
-		LABEL (L"", L"Sound:")
-		BOOLEAN (L"Preserve times", my default_picture_preserveTimes ());
-		REAL (L"left Vertical range", my default_picture_bottom ());
-		REAL (L"right Vertical range", my default_picture_top ());
+		LABEL (U"", U"Sound:")
+		BOOLEAN (U"Preserve times", my default_picture_preserveTimes ());
+		REAL (U"left Vertical range", my default_picture_bottom ());
+		REAL (U"right Vertical range", my default_picture_top ());
 		my v_form_pictureMargins (cmd);
-		BOOLEAN (L"Garnish", my default_picture_garnish ());
+		BOOLEAN (U"Garnish", my default_picture_garnish ());
 	EDITOR_OK
 		my v_ok_pictureWindow (cmd);
-		SET_INTEGER (L"Preserve times", my pref_picture_preserveTimes ());
-		SET_REAL (L"left Vertical range", my pref_picture_bottom ());
-		SET_REAL (L"right Vertical range", my pref_picture_top ());
+		SET_INTEGER (U"Preserve times", my pref_picture_preserveTimes ());
+		SET_REAL (U"left Vertical range", my pref_picture_bottom ());
+		SET_REAL (U"right Vertical range", my pref_picture_top ());
 		my v_ok_pictureMargins (cmd);
-		SET_INTEGER (L"Garnish", my pref_picture_garnish ());
+		SET_INTEGER (U"Garnish", my pref_picture_garnish ());
 	EDITOR_DO
 		my v_do_pictureWindow (cmd);
-		my pref_picture_preserveTimes () = GET_INTEGER (L"Preserve times");
-		my pref_picture_bottom () = GET_REAL (L"left Vertical range");
-		my pref_picture_top () = GET_REAL (L"right Vertical range");
+		my pref_picture_preserveTimes () = GET_INTEGER (U"Preserve times");
+		my pref_picture_bottom () = GET_REAL (U"left Vertical range");
+		my pref_picture_top () = GET_REAL (U"right Vertical range");
 		my v_do_pictureMargins (cmd);
-		my pref_picture_garnish () = GET_INTEGER (L"Garnish");
+		my pref_picture_garnish () = GET_INTEGER (U"Garnish");
 		if (my d_longSound.data == NULL && my d_sound.data == NULL)
-			Melder_throw ("There is no sound to draw.");
+			Melder_throw (U"There is no sound to draw.");
 		autoSound publish = my d_longSound.data ?
 			LongSound_extractPart (my d_longSound.data, my d_startSelection, my d_endSelection, my pref_picture_preserveTimes ()) :
 			Sound_extractPart (my d_sound.data, my d_startSelection, my d_endSelection, kSound_windowShape_RECTANGULAR, 1.0, my pref_picture_preserveTimes ());
 		Editor_openPraatPicture (me);
 		Sound_draw (publish.peek(), my pictureGraphics, 0.0, 0.0, my pref_picture_bottom (), my pref_picture_top (),
-			my pref_picture_garnish (), L"Curve");
+			my pref_picture_garnish (), U"Curve");
 		Editor_closePraatPicture (me);
 	EDITOR_END
 }
 
 static void do_ExtractSelectedSound (TimeSoundEditor me, bool preserveTimes) {
-	autoSound extract = NULL;
+	autoSound extract;
 	if (my d_endSelection <= my d_startSelection)
-		Melder_throw ("No selection.");
+		Melder_throw (U"No selection.");
 	if (my d_longSound.data) {
-		extract.reset (LongSound_extractPart (my d_longSound.data, my d_startSelection, my d_endSelection, preserveTimes));
+		extract = LongSound_extractPart (my d_longSound.data, my d_startSelection, my d_endSelection, preserveTimes);
 	} else if (my d_sound.data) {
 		extract.reset (Sound_extractPart (my d_sound.data, my d_startSelection, my d_endSelection, kSound_windowShape_RECTANGULAR, 1.0, preserveTimes));
 	}
-	my broadcastPublication (extract.transfer());
+	Editor_broadcastPublication (me, extract.transfer());
 }
 
 static void menu_cb_ExtractSelectedSound_timeFromZero (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	do_ExtractSelectedSound (me, FALSE);
+	do_ExtractSelectedSound (me, false);
 }
 
 static void menu_cb_ExtractSelectedSound_preserveTimes (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	do_ExtractSelectedSound (me, TRUE);
+	do_ExtractSelectedSound (me, true);
 }
 
 static void menu_cb_ExtractSelectedSound_windowed (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM (L"Extract selected sound (windowed)", 0)
-		WORD (L"Name", L"slice")
-		OPTIONMENU_ENUM (L"Window shape", kSound_windowShape, my default_extract_windowShape ())
-		POSITIVE (L"Relative width", my default_extract_relativeWidth ())
-		BOOLEAN (L"Preserve times", my default_extract_preserveTimes ())
+	EDITOR_FORM (U"Extract selected sound (windowed)", 0)
+		WORD (U"Name", U"slice")
+		OPTIONMENU_ENUM (U"Window shape", kSound_windowShape, my default_extract_windowShape ())
+		POSITIVE (U"Relative width", my default_extract_relativeWidth ())
+		BOOLEAN (U"Preserve times", my default_extract_preserveTimes ())
 	EDITOR_OK
-		SET_ENUM (L"Window shape", kSound_windowShape, my pref_extract_windowShape ())
-		SET_REAL (L"Relative width", my pref_extract_relativeWidth ())
-		SET_INTEGER (L"Preserve times", my pref_extract_preserveTimes ())
+		SET_ENUM (U"Window shape", kSound_windowShape, my pref_extract_windowShape ())
+		SET_REAL (U"Relative width", my pref_extract_relativeWidth ())
+		SET_INTEGER (U"Preserve times", my pref_extract_preserveTimes ())
 	EDITOR_DO
 		Sound sound = my d_sound.data;
 		Melder_assert (sound != NULL);
-		my pref_extract_windowShape () = GET_ENUM (kSound_windowShape, L"Window shape");
-		my pref_extract_relativeWidth () = GET_REAL (L"Relative width");
-		my pref_extract_preserveTimes () = GET_INTEGER (L"Preserve times");
+		my pref_extract_windowShape () = GET_ENUM (kSound_windowShape, U"Window shape");
+		my pref_extract_relativeWidth () = GET_REAL (U"Relative width");
+		my pref_extract_preserveTimes () = GET_INTEGER (U"Preserve times");
 		autoSound extract = Sound_extractPart (sound, my d_startSelection, my d_endSelection, my pref_extract_windowShape (),
 			my pref_extract_relativeWidth (), my pref_extract_preserveTimes ());
-		Thing_setName (extract.peek(), GET_STRING (L"Name"));
-		my broadcastPublication (extract.transfer());
+		Thing_setName (extract.peek(), GET_STRING (U"Name"));
+		Editor_broadcastPublication (me, extract.transfer());
 	EDITOR_END
 }
 
 static void menu_cb_ExtractSelectedSoundForOverlap (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM (L"Extract selected sound for overlap)", 0)
-		WORD (L"Name", L"slice")
-		POSITIVE (L"Overlap (s)", my default_extract_overlap ())
+	EDITOR_FORM (U"Extract selected sound for overlap)", 0)
+		WORD (U"Name", U"slice")
+		POSITIVE (U"Overlap (s)", my default_extract_overlap ())
 	EDITOR_OK
-		SET_REAL (L"Overlap", my pref_extract_overlap ())
+		SET_REAL (U"Overlap", my pref_extract_overlap ())
 	EDITOR_DO
 		Sound sound = my d_sound.data;
 		Melder_assert (sound != NULL);
-		my pref_extract_overlap () = GET_REAL (L"Overlap");
+		my pref_extract_overlap () = GET_REAL (U"Overlap");
 		autoSound extract = Sound_extractPartForOverlap (sound, my d_startSelection, my d_endSelection,
 			my pref_extract_overlap ());
-		Thing_setName (extract.peek(), GET_STRING (L"Name"));
-		my broadcastPublication (extract.transfer());
+		Thing_setName (extract.peek(), GET_STRING (U"Name"));
+		Editor_broadcastPublication (me, extract.transfer());
 	EDITOR_END
 }
 
-static void do_write (TimeSoundEditor me, MelderFile file, int format, int numberOfBitsPersamplePoint) {
+static void do_write (TimeSoundEditor me, MelderFile file, int format, int numberOfBitsPerSamplePoint) {
 	if (my d_startSelection >= my d_endSelection)
-		Melder_throw ("No samples selected.");
+		Melder_throw (U"No samples selected.");
 	if (my d_longSound.data) {
-		LongSound_writePartToAudioFile (my d_longSound.data, format, my d_startSelection, my d_endSelection, file);
+		LongSound_writePartToAudioFile (my d_longSound.data, format, my d_startSelection, my d_endSelection, file, numberOfBitsPerSamplePoint);
 	} else if (my d_sound.data) {
 		Sound sound = my d_sound.data;
 		double margin = 0.0;
-		long nmargin = margin / sound -> dx;
+		long nmargin = (long) floor (margin / sound -> dx);
 		long first, last, numberOfSamples = Sampled_getWindowSamples (sound,
 			my d_startSelection, my d_endSelection, & first, & last) + nmargin * 2;
 		first -= nmargin;
@@ -214,15 +214,15 @@ static void do_write (TimeSoundEditor me, MelderFile file, int format, int numbe
 					save -> z [channel] [i - offset] = sound -> z [channel] [i];
 				}
 			}
-			Sound_writeToAudioFile (save.peek(), file, format, numberOfBitsPersamplePoint);
+			Sound_writeToAudioFile (save.peek(), file, format, numberOfBitsPerSamplePoint);
 		}
 	}
 }
 
 static void menu_cb_WriteWav (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM_WRITE (L"Save selected sound as WAV file", 0)
-		swprintf (defaultName, 300, L"%ls.wav", my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name);
+	EDITOR_FORM_WRITE (U"Save selected sound as WAV file", 0)
+		Melder_sprint (defaultName,300, my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name, U".wav");
 	EDITOR_DO_WRITE
 		do_write (me, file, Melder_WAV, 16);
 	EDITOR_END
@@ -230,9 +230,9 @@ static void menu_cb_WriteWav (EDITOR_ARGS) {
 
 static void menu_cb_SaveAs24BitWav (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM_WRITE (L"Save selected sound as 24-bit WAV file", 0)
+	EDITOR_FORM_WRITE (U"Save selected sound as 24-bit WAV file", 0)
 		Melder_assert (my d_longSound.data == NULL && my d_sound.data != NULL);
-		swprintf (defaultName, 300, L"%ls.wav", my d_sound.data -> name);
+		Melder_sprint (defaultName,300, my d_sound.data -> name, U".wav");
 	EDITOR_DO_WRITE
 		do_write (me, file, Melder_WAV, 24);
 	EDITOR_END
@@ -240,9 +240,9 @@ static void menu_cb_SaveAs24BitWav (EDITOR_ARGS) {
 
 static void menu_cb_SaveAs32BitWav (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM_WRITE (L"Save selected sound as 32-bit WAV file", 0)
+	EDITOR_FORM_WRITE (U"Save selected sound as 32-bit WAV file", 0)
 		Melder_assert (my d_longSound.data == NULL && my d_sound.data != NULL);
-		swprintf (defaultName, 300, L"%ls.wav", my d_sound.data -> name);
+		Melder_sprint (defaultName,300, my d_sound.data -> name, U".wav");
 	EDITOR_DO_WRITE
 		do_write (me, file, Melder_WAV, 32);
 	EDITOR_END
@@ -250,8 +250,8 @@ static void menu_cb_SaveAs32BitWav (EDITOR_ARGS) {
 
 static void menu_cb_WriteAiff (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM_WRITE (L"Save selected sound as AIFF file", 0)
-		swprintf (defaultName, 300, L"%ls.aiff", my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name);
+	EDITOR_FORM_WRITE (U"Save selected sound as AIFF file", 0)
+		Melder_sprint (defaultName,300, my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name, U".aiff");
 	EDITOR_DO_WRITE
 		do_write (me, file, Melder_AIFF, 16);
 	EDITOR_END
@@ -259,8 +259,8 @@ static void menu_cb_WriteAiff (EDITOR_ARGS) {
 
 static void menu_cb_WriteAifc (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM_WRITE (L"Save selected sound as AIFC file", 0)
-		swprintf (defaultName, 300, L"%ls.aifc", my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name);
+	EDITOR_FORM_WRITE (U"Save selected sound as AIFC file", 0)
+		Melder_sprint (defaultName,300, my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name, U".aifc");
 	EDITOR_DO_WRITE
 		do_write (me, file, Melder_AIFC, 16);
 	EDITOR_END
@@ -268,8 +268,8 @@ static void menu_cb_WriteAifc (EDITOR_ARGS) {
 
 static void menu_cb_WriteNextSun (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM_WRITE (L"Save selected sound as NeXT/Sun file", 0)
-		swprintf (defaultName, 300, L"%ls.au", my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name);
+	EDITOR_FORM_WRITE (U"Save selected sound as NeXT/Sun file", 0)
+		Melder_sprint (defaultName,300, my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name, U".au");
 	EDITOR_DO_WRITE
 		do_write (me, file, Melder_NEXT_SUN, 16);
 	EDITOR_END
@@ -277,8 +277,8 @@ static void menu_cb_WriteNextSun (EDITOR_ARGS) {
 
 static void menu_cb_WriteNist (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM_WRITE (L"Save selected sound as NIST file", 0)
-		swprintf (defaultName, 300, L"%ls.nist", my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name);
+	EDITOR_FORM_WRITE (U"Save selected sound as NIST file", 0)
+		Melder_sprint (defaultName,300, my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name, U".nist");
 	EDITOR_DO_WRITE
 		do_write (me, file, Melder_NIST, 16);
 	EDITOR_END
@@ -286,81 +286,81 @@ static void menu_cb_WriteNist (EDITOR_ARGS) {
 
 static void menu_cb_WriteFlac (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM_WRITE (L"Save selected sound as FLAC file", 0)
-		swprintf (defaultName, 300, L"%ls.flac", my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name);
+	EDITOR_FORM_WRITE (U"Save selected sound as FLAC file", 0)
+		Melder_sprint (defaultName,300, my d_longSound.data ? my d_longSound.data -> name : my d_sound.data -> name, U".flac");
 	EDITOR_DO_WRITE
 		do_write (me, file, Melder_FLAC, 16);
 	EDITOR_END
 }
 
 void structTimeSoundEditor :: v_createMenuItems_file_draw (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_DrawVisibleSound /* dummy */);
+	EditorMenu_addCommand (menu, U"Draw to picture window:", GuiMenu_INSENSITIVE, menu_cb_DrawVisibleSound /* dummy */);
 	if (d_sound.data || d_longSound.data) {
-		EditorMenu_addCommand (menu, L"Draw visible sound...", 0, menu_cb_DrawVisibleSound);
-		drawButton = EditorMenu_addCommand (menu, L"Draw selected sound...", 0, menu_cb_DrawSelectedSound);
+		EditorMenu_addCommand (menu, U"Draw visible sound...", 0, menu_cb_DrawVisibleSound);
+		drawButton = EditorMenu_addCommand (menu, U"Draw selected sound...", 0, menu_cb_DrawSelectedSound);
 	}
 }
 
 void structTimeSoundEditor :: v_createMenuItems_file_extract (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_ExtractSelectedSound_preserveTimes /* dummy */);
+	EditorMenu_addCommand (menu, U"Extract to objects window:", GuiMenu_INSENSITIVE, menu_cb_ExtractSelectedSound_preserveTimes /* dummy */);
 	if (d_sound.data || d_longSound.data) {
-		publishPreserveButton = EditorMenu_addCommand (menu, L"Extract selected sound (preserve times)", 0, menu_cb_ExtractSelectedSound_preserveTimes);
-			EditorMenu_addCommand (menu, L"Extract sound selection (preserve times)", Editor_HIDDEN, menu_cb_ExtractSelectedSound_preserveTimes);
-			EditorMenu_addCommand (menu, L"Extract selection (preserve times)", Editor_HIDDEN, menu_cb_ExtractSelectedSound_preserveTimes);
-		publishButton = EditorMenu_addCommand (menu, L"Extract selected sound (time from 0)", 0, menu_cb_ExtractSelectedSound_timeFromZero);
-			EditorMenu_addCommand (menu, L"Extract sound selection (time from 0)", Editor_HIDDEN, menu_cb_ExtractSelectedSound_timeFromZero);
-			EditorMenu_addCommand (menu, L"Extract selection (time from 0)", Editor_HIDDEN, menu_cb_ExtractSelectedSound_timeFromZero);
-			EditorMenu_addCommand (menu, L"Extract selection", Editor_HIDDEN, menu_cb_ExtractSelectedSound_timeFromZero);
+		publishPreserveButton = EditorMenu_addCommand (menu, U"Extract selected sound (preserve times)", 0, menu_cb_ExtractSelectedSound_preserveTimes);
+			EditorMenu_addCommand (menu, U"Extract sound selection (preserve times)", Editor_HIDDEN, menu_cb_ExtractSelectedSound_preserveTimes);
+			EditorMenu_addCommand (menu, U"Extract selection (preserve times)", Editor_HIDDEN, menu_cb_ExtractSelectedSound_preserveTimes);
+		publishButton = EditorMenu_addCommand (menu, U"Extract selected sound (time from 0)", 0, menu_cb_ExtractSelectedSound_timeFromZero);
+			EditorMenu_addCommand (menu, U"Extract sound selection (time from 0)", Editor_HIDDEN, menu_cb_ExtractSelectedSound_timeFromZero);
+			EditorMenu_addCommand (menu, U"Extract selection (time from 0)", Editor_HIDDEN, menu_cb_ExtractSelectedSound_timeFromZero);
+			EditorMenu_addCommand (menu, U"Extract selection", Editor_HIDDEN, menu_cb_ExtractSelectedSound_timeFromZero);
 		if (d_sound.data) {
-			publishWindowButton = EditorMenu_addCommand (menu, L"Extract selected sound (windowed)...", 0, menu_cb_ExtractSelectedSound_windowed);
-				EditorMenu_addCommand (menu, L"Extract windowed sound selection...", Editor_HIDDEN, menu_cb_ExtractSelectedSound_windowed);
-				EditorMenu_addCommand (menu, L"Extract windowed selection...", Editor_HIDDEN, menu_cb_ExtractSelectedSound_windowed);
-			publishOverlapButton = EditorMenu_addCommand (menu, L"Extract selected sound for overlap...", 0, menu_cb_ExtractSelectedSoundForOverlap);
+			publishWindowButton = EditorMenu_addCommand (menu, U"Extract selected sound (windowed)...", 0, menu_cb_ExtractSelectedSound_windowed);
+				EditorMenu_addCommand (menu, U"Extract windowed sound selection...", Editor_HIDDEN, menu_cb_ExtractSelectedSound_windowed);
+				EditorMenu_addCommand (menu, U"Extract windowed selection...", Editor_HIDDEN, menu_cb_ExtractSelectedSound_windowed);
+			publishOverlapButton = EditorMenu_addCommand (menu, U"Extract selected sound for overlap...", 0, menu_cb_ExtractSelectedSoundForOverlap);
 		}
 	}
 }
 
 void structTimeSoundEditor :: v_createMenuItems_file_write (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"Save to disk:", GuiMenu_INSENSITIVE, menu_cb_WriteWav /* dummy */);
+	EditorMenu_addCommand (menu, U"Save to disk:", GuiMenu_INSENSITIVE, menu_cb_WriteWav /* dummy */);
 	if (d_sound.data || d_longSound.data) {
-		writeWavButton = EditorMenu_addCommand (menu, L"Save selected sound as WAV file...", 0, menu_cb_WriteWav);
-			EditorMenu_addCommand (menu, L"Write selected sound to WAV file...", Editor_HIDDEN, menu_cb_WriteWav);
-			EditorMenu_addCommand (menu, L"Write sound selection to WAV file...", Editor_HIDDEN, menu_cb_WriteWav);
-			EditorMenu_addCommand (menu, L"Write selection to WAV file...", Editor_HIDDEN, menu_cb_WriteWav);
+		writeWavButton = EditorMenu_addCommand (menu, U"Save selected sound as WAV file...", 0, menu_cb_WriteWav);
+			EditorMenu_addCommand (menu, U"Write selected sound to WAV file...", Editor_HIDDEN, menu_cb_WriteWav);
+			EditorMenu_addCommand (menu, U"Write sound selection to WAV file...", Editor_HIDDEN, menu_cb_WriteWav);
+			EditorMenu_addCommand (menu, U"Write selection to WAV file...", Editor_HIDDEN, menu_cb_WriteWav);
 		if (d_sound.data) {
-			d_saveAs24BitWavButton = EditorMenu_addCommand (menu, L"Save selected sound as 24-bit WAV file...", 0, menu_cb_SaveAs24BitWav);
-			d_saveAs32BitWavButton = EditorMenu_addCommand (menu, L"Save selected sound as 32-bit WAV file...", 0, menu_cb_SaveAs32BitWav);
+			d_saveAs24BitWavButton = EditorMenu_addCommand (menu, U"Save selected sound as 24-bit WAV file...", 0, menu_cb_SaveAs24BitWav);
+			d_saveAs32BitWavButton = EditorMenu_addCommand (menu, U"Save selected sound as 32-bit WAV file...", 0, menu_cb_SaveAs32BitWav);
 		}
-		writeAiffButton = EditorMenu_addCommand (menu, L"Save selected sound as AIFF file...", 0, menu_cb_WriteAiff);
-			EditorMenu_addCommand (menu, L"Write selected sound to AIFF file...", Editor_HIDDEN, menu_cb_WriteAiff);
-			EditorMenu_addCommand (menu, L"Write sound selection to AIFF file...", Editor_HIDDEN, menu_cb_WriteAiff);
-			EditorMenu_addCommand (menu, L"Write selection to AIFF file...", Editor_HIDDEN, menu_cb_WriteAiff);
-		writeAifcButton = EditorMenu_addCommand (menu, L"Save selected sound as AIFC file...", 0, menu_cb_WriteAifc);
-			EditorMenu_addCommand (menu, L"Write selected sound to AIFC file...", Editor_HIDDEN, menu_cb_WriteAifc);
-			EditorMenu_addCommand (menu, L"Write sound selection to AIFC file...", Editor_HIDDEN, menu_cb_WriteAifc);
-			EditorMenu_addCommand (menu, L"Write selection to AIFC file...", Editor_HIDDEN, menu_cb_WriteAifc);
-		writeNextSunButton = EditorMenu_addCommand (menu, L"Save selected sound as Next/Sun file...", 0, menu_cb_WriteNextSun);
-			EditorMenu_addCommand (menu, L"Write selected sound to Next/Sun file...", Editor_HIDDEN, menu_cb_WriteNextSun);
-			EditorMenu_addCommand (menu, L"Write sound selection to Next/Sun file...", Editor_HIDDEN, menu_cb_WriteNextSun);
-			EditorMenu_addCommand (menu, L"Write selection to Next/Sun file...", Editor_HIDDEN, menu_cb_WriteNextSun);
-		writeNistButton = EditorMenu_addCommand (menu, L"Save selected sound as NIST file...", 0, menu_cb_WriteNist);
-			EditorMenu_addCommand (menu, L"Write selected sound to NIST file...", Editor_HIDDEN, menu_cb_WriteNist);
-			EditorMenu_addCommand (menu, L"Write sound selection to NIST file...", Editor_HIDDEN, menu_cb_WriteNist);
-			EditorMenu_addCommand (menu, L"Write selection to NIST file...", Editor_HIDDEN, menu_cb_WriteNist);
-		writeFlacButton = EditorMenu_addCommand (menu, L"Save selected sound as FLAC file...", 0, menu_cb_WriteFlac);
-			EditorMenu_addCommand (menu, L"Write selected sound to FLAC file...", Editor_HIDDEN, menu_cb_WriteFlac);
-			EditorMenu_addCommand (menu, L"Write sound selection to FLAC file...", Editor_HIDDEN, menu_cb_WriteFlac);
+		writeAiffButton = EditorMenu_addCommand (menu, U"Save selected sound as AIFF file...", 0, menu_cb_WriteAiff);
+			EditorMenu_addCommand (menu, U"Write selected sound to AIFF file...", Editor_HIDDEN, menu_cb_WriteAiff);
+			EditorMenu_addCommand (menu, U"Write sound selection to AIFF file...", Editor_HIDDEN, menu_cb_WriteAiff);
+			EditorMenu_addCommand (menu, U"Write selection to AIFF file...", Editor_HIDDEN, menu_cb_WriteAiff);
+		writeAifcButton = EditorMenu_addCommand (menu, U"Save selected sound as AIFC file...", 0, menu_cb_WriteAifc);
+			EditorMenu_addCommand (menu, U"Write selected sound to AIFC file...", Editor_HIDDEN, menu_cb_WriteAifc);
+			EditorMenu_addCommand (menu, U"Write sound selection to AIFC file...", Editor_HIDDEN, menu_cb_WriteAifc);
+			EditorMenu_addCommand (menu, U"Write selection to AIFC file...", Editor_HIDDEN, menu_cb_WriteAifc);
+		writeNextSunButton = EditorMenu_addCommand (menu, U"Save selected sound as Next/Sun file...", 0, menu_cb_WriteNextSun);
+			EditorMenu_addCommand (menu, U"Write selected sound to Next/Sun file...", Editor_HIDDEN, menu_cb_WriteNextSun);
+			EditorMenu_addCommand (menu, U"Write sound selection to Next/Sun file...", Editor_HIDDEN, menu_cb_WriteNextSun);
+			EditorMenu_addCommand (menu, U"Write selection to Next/Sun file...", Editor_HIDDEN, menu_cb_WriteNextSun);
+		writeNistButton = EditorMenu_addCommand (menu, U"Save selected sound as NIST file...", 0, menu_cb_WriteNist);
+			EditorMenu_addCommand (menu, U"Write selected sound to NIST file...", Editor_HIDDEN, menu_cb_WriteNist);
+			EditorMenu_addCommand (menu, U"Write sound selection to NIST file...", Editor_HIDDEN, menu_cb_WriteNist);
+			EditorMenu_addCommand (menu, U"Write selection to NIST file...", Editor_HIDDEN, menu_cb_WriteNist);
+		writeFlacButton = EditorMenu_addCommand (menu, U"Save selected sound as FLAC file...", 0, menu_cb_WriteFlac);
+			EditorMenu_addCommand (menu, U"Write selected sound to FLAC file...", Editor_HIDDEN, menu_cb_WriteFlac);
+			EditorMenu_addCommand (menu, U"Write sound selection to FLAC file...", Editor_HIDDEN, menu_cb_WriteFlac);
 	}
 }
 
 void structTimeSoundEditor :: v_createMenuItems_file (EditorMenu menu) {
 	TimeSoundEditor_Parent :: v_createMenuItems_file (menu);
 	v_createMenuItems_file_draw (menu);
-	EditorMenu_addCommand (menu, L"-- after file draw --", 0, NULL);
+	EditorMenu_addCommand (menu, U"-- after file draw --", 0, NULL);
 	v_createMenuItems_file_extract (menu);
-	EditorMenu_addCommand (menu, L"-- after file extract --", 0, NULL);
+	EditorMenu_addCommand (menu, U"-- after file extract --", 0, NULL);
 	v_createMenuItems_file_write (menu);
-	EditorMenu_addCommand (menu, L"-- after file write --", 0, NULL);
+	EditorMenu_addCommand (menu, U"-- after file write --", 0, NULL);
 }
 
 /********** QUERY MENU **********/
@@ -378,9 +378,9 @@ static void menu_cb_LongSoundInfo (EDITOR_ARGS) {
 void structTimeSoundEditor :: v_createMenuItems_query_info (EditorMenu menu) {
 	TimeSoundEditor_Parent :: v_createMenuItems_query_info (menu);
 	if (d_sound.data != NULL && d_sound.data != data) {
-		EditorMenu_addCommand (menu, L"Sound info", 0, menu_cb_SoundInfo);
+		EditorMenu_addCommand (menu, U"Sound info", 0, menu_cb_SoundInfo);
 	} else if (d_longSound.data != NULL && d_longSound.data != data) {
-		EditorMenu_addCommand (menu, L"LongSound info", 0, menu_cb_LongSoundInfo);
+		EditorMenu_addCommand (menu, U"LongSound info", 0, menu_cb_LongSoundInfo);
 	}
 }
 
@@ -388,23 +388,23 @@ void structTimeSoundEditor :: v_createMenuItems_query_info (EditorMenu menu) {
 
 static void menu_cb_soundScaling (EDITOR_ARGS) {
 	EDITOR_IAM (TimeSoundEditor);
-	EDITOR_FORM (L"Sound scaling", 0)
-		OPTIONMENU_ENUM (L"Scaling strategy", kTimeSoundEditor_scalingStrategy, my default_sound_scalingStrategy ())
-		LABEL (L"", L"For \"fixed height\":");
-		POSITIVE (L"Height", my default_sound_scaling_height ())
-		LABEL (L"", L"For \"fixed range\":");
-		REAL (L"Minimum", my default_sound_scaling_minimum ())
-		REAL (L"Maximum", my default_sound_scaling_maximum ())
+	EDITOR_FORM (U"Sound scaling", 0)
+		OPTIONMENU_ENUM (U"Scaling strategy", kTimeSoundEditor_scalingStrategy, my default_sound_scalingStrategy ())
+		LABEL (U"", U"For \"fixed height\":");
+		POSITIVE (U"Height", my default_sound_scaling_height ())
+		LABEL (U"", U"For \"fixed range\":");
+		REAL (U"Minimum", my default_sound_scaling_minimum ())
+		REAL (U"Maximum", my default_sound_scaling_maximum ())
 	EDITOR_OK
-		SET_ENUM (L"Scaling strategy", kTimeSoundEditor_scalingStrategy, my p_sound_scalingStrategy)
-		SET_REAL (L"Height", my p_sound_scaling_height)
-		SET_REAL (L"Minimum", my p_sound_scaling_minimum)
-		SET_REAL (L"Maximum", my p_sound_scaling_maximum)
+		SET_ENUM (U"Scaling strategy", kTimeSoundEditor_scalingStrategy, my p_sound_scalingStrategy)
+		SET_REAL (U"Height", my p_sound_scaling_height)
+		SET_REAL (U"Minimum", my p_sound_scaling_minimum)
+		SET_REAL (U"Maximum", my p_sound_scaling_maximum)
 	EDITOR_DO
-		my pref_sound_scalingStrategy () = my p_sound_scalingStrategy = GET_ENUM (kTimeSoundEditor_scalingStrategy, L"Scaling strategy");
-		my pref_sound_scaling_height  () = my p_sound_scaling_height  = GET_REAL (L"Height");
-		my pref_sound_scaling_minimum () = my p_sound_scaling_minimum = GET_REAL (L"Minimum");
-		my pref_sound_scaling_maximum () = my p_sound_scaling_maximum = GET_REAL (L"Maximum");
+		my pref_sound_scalingStrategy () = my p_sound_scalingStrategy = GET_ENUM (kTimeSoundEditor_scalingStrategy, U"Scaling strategy");
+		my pref_sound_scaling_height  () = my p_sound_scaling_height  = GET_REAL (U"Height");
+		my pref_sound_scaling_minimum () = my p_sound_scaling_minimum = GET_REAL (U"Minimum");
+		my pref_sound_scaling_maximum () = my p_sound_scaling_maximum = GET_REAL (U"Maximum");
 		FunctionEditor_redraw (me);
 	EDITOR_END
 }
@@ -416,8 +416,8 @@ void structTimeSoundEditor :: v_createMenuItems_view (EditorMenu menu) {
 }
 
 void structTimeSoundEditor :: v_createMenuItems_view_sound (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"Sound scaling...", 0, menu_cb_soundScaling);
-	EditorMenu_addCommand (menu, L"-- sound view --", 0, 0);
+	EditorMenu_addCommand (menu, U"Sound scaling...", 0, menu_cb_soundScaling);
+	EditorMenu_addCommand (menu, U"-- sound view --", 0, 0);
 }
 
 void structTimeSoundEditor :: v_updateMenuItems_file () {
@@ -425,22 +425,22 @@ void structTimeSoundEditor :: v_updateMenuItems_file () {
 	if (sound == NULL) return;
 	long first, last, selectedSamples = Sampled_getWindowSamples (sound, d_startSelection, d_endSelection, & first, & last);
 	if (drawButton) {
-		drawButton -> f_setSensitive (selectedSamples != 0);
-		publishButton -> f_setSensitive (selectedSamples != 0);
-		publishPreserveButton -> f_setSensitive (selectedSamples != 0);
-		if (publishWindowButton) publishWindowButton -> f_setSensitive (selectedSamples != 0);
-		if (publishOverlapButton) publishOverlapButton -> f_setSensitive (selectedSamples != 0);
+		GuiThing_setSensitive (drawButton, selectedSamples != 0);
+		GuiThing_setSensitive (publishButton, selectedSamples != 0);
+		GuiThing_setSensitive (publishPreserveButton, selectedSamples != 0);
+		if (publishWindowButton) GuiThing_setSensitive (publishWindowButton, selectedSamples != 0);
+		if (publishOverlapButton) GuiThing_setSensitive (publishOverlapButton, selectedSamples != 0);
 	}
-	writeWavButton -> f_setSensitive (selectedSamples != 0);
+	GuiThing_setSensitive (writeWavButton, selectedSamples != 0);
 	if (d_saveAs24BitWavButton)
-		d_saveAs24BitWavButton -> f_setSensitive (selectedSamples != 0);
+		GuiThing_setSensitive (d_saveAs24BitWavButton, selectedSamples != 0);
 	if (d_saveAs32BitWavButton)
-		d_saveAs32BitWavButton -> f_setSensitive (selectedSamples != 0);
-	writeAiffButton -> f_setSensitive (selectedSamples != 0);
-	writeAifcButton -> f_setSensitive (selectedSamples != 0);
-	writeNextSunButton -> f_setSensitive (selectedSamples != 0);
-	writeNistButton -> f_setSensitive (selectedSamples != 0);
-	writeFlacButton -> f_setSensitive (selectedSamples != 0);
+		GuiThing_setSensitive (d_saveAs32BitWavButton, selectedSamples != 0);
+	GuiThing_setSensitive (writeAiffButton, selectedSamples != 0);
+	GuiThing_setSensitive (writeAifcButton, selectedSamples != 0);
+	GuiThing_setSensitive (writeNextSunButton, selectedSamples != 0);
+	GuiThing_setSensitive (writeNistButton, selectedSamples != 0);
+	GuiThing_setSensitive (writeFlacButton, selectedSamples != 0);
 }
 
 void TimeSoundEditor_drawSound (TimeSoundEditor me, double globalMinimum, double globalMaximum) {
@@ -454,24 +454,24 @@ void TimeSoundEditor_drawSound (TimeSoundEditor me, double globalMinimum, double
 	try {
 		fits = sound ? true : LongSound_haveWindow (longSound, my d_startWindow, my d_endWindow);
 	} catch (MelderError) {
-		int outOfMemory = wcsstr (Melder_getError (), L"memory") != NULL;
-		if (Melder_debug == 9) Melder_flushError (NULL); else Melder_clearError ();
+		int outOfMemory = str32str (Melder_getError (), U"memory") != NULL;
+		if (Melder_debug == 9) Melder_flushError (); else Melder_clearError ();
 		Graphics_setWindow (my d_graphics, 0, 1, 0, 1);
 		Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (my d_graphics, 0.5, 0.5, outOfMemory ? L"(out of memory)" : L"(cannot read sound file)");
+		Graphics_text (my d_graphics, 0.5, 0.5, outOfMemory ? U"(out of memory)" : U"(cannot read sound file)");
 		return;
 	}
 	if (! fits) {
 		Graphics_setWindow (my d_graphics, 0, 1, 0, 1);
 		Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (my d_graphics, 0.5, 0.5, L"(window too large; zoom in to see the data)");
+		Graphics_text (my d_graphics, 0.5, 0.5, U"(window too large; zoom in to see the data)");
 		return;
 	}
 	long first, last;
 	if (Sampled_getWindowSamples (sound ? (Sampled) sound : (Sampled) longSound, my d_startWindow, my d_endWindow, & first, & last) <= 1) {
 		Graphics_setWindow (my d_graphics, 0, 1, 0, 1);
 		Graphics_setTextAlignment (my d_graphics, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (my d_graphics, 0.5, 0.5, L"(zoom out to see the data)");
+		Graphics_text (my d_graphics, 0.5, 0.5, U"(zoom out to see the data)");
 		return;
 	}
 	const int numberOfVisibleChannels = nchan > 8 ? 8 : nchan;
@@ -549,22 +549,22 @@ void TimeSoundEditor_drawSound (TimeSoundEditor me, double globalMinimum, double
 		if (horizontal) {
 			Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_HALF);
 			double mid = 0.5 * (minimum + maximum);
-			Graphics_text1 (my d_graphics, my d_startWindow, mid, Melder_float (Melder_half (mid)));
+			Graphics_text (my d_graphics, my d_startWindow, mid, Melder_float (Melder_half (mid)));
 		} else {
 			if (! cursorVisible || ! NUMdefined (cursorFunctionValue) || Graphics_dyWCtoMM (my d_graphics, cursorFunctionValue - minimum) > 5.0) {
 				Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_BOTTOM);
-				Graphics_text1 (my d_graphics, my d_startWindow, minimum, Melder_float (Melder_half (minimum)));
+				Graphics_text (my d_graphics, my d_startWindow, minimum, Melder_float (Melder_half (minimum)));
 			}
 			if (! cursorVisible || ! NUMdefined (cursorFunctionValue) || Graphics_dyWCtoMM (my d_graphics, maximum - cursorFunctionValue) > 5.0) {
 				Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_TOP);
-				Graphics_text1 (my d_graphics, my d_startWindow, maximum, Melder_float (Melder_half (maximum)));
+				Graphics_text (my d_graphics, my d_startWindow, maximum, Melder_float (Melder_half (maximum)));
 			}
 		}
 		if (minimum < 0 && maximum > 0 && ! horizontal) {
 			Graphics_setWindow (my d_graphics, 0, 1, minimum, maximum);
 			if (! cursorVisible || ! NUMdefined (cursorFunctionValue) || fabs (Graphics_dyWCtoMM (my d_graphics, cursorFunctionValue - 0.0)) > 3.0) {
 				Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_HALF);
-				Graphics_text (my d_graphics, 0, 0, L"0");
+				Graphics_text (my d_graphics, 0, 0, U"0");
 			}
 			Graphics_setColour (my d_graphics, Graphics_CYAN);
 			Graphics_setLineType (my d_graphics, Graphics_DOTTED);
@@ -580,18 +580,17 @@ void TimeSoundEditor_drawSound (TimeSoundEditor me, double globalMinimum, double
 		Graphics_setColour (my d_graphics, Graphics_BLACK);
 		if (nchan > 1) {
 			Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_HALF);
+			const char32 *channelName = my v_getChannelName (ichan);
 			static MelderString channelLabel;
-			const wchar_t *channelName = my v_getChannelName (ichan);
-			MelderString_copy (& channelLabel, channelName ? L"ch" : L"Channel ");
-			MelderString_append (& channelLabel, Melder_integer (ichan));
+			MelderString_copy (& channelLabel, ( channelName ? U"ch" : U"Channel " ), ichan);
 			if (channelName)
-				MelderString_append (& channelLabel, L": ", channelName);
+				MelderString_append (& channelLabel, U": ", channelName);
 			if (ichan > 8 && ichan - my d_sound.channelOffset == 1) {
-				MelderString_append (& channelLabel, L" " UNITEXT_UPWARDS_ARROW);
+				MelderString_append (& channelLabel, U" " UNITEXT_UPWARDS_ARROW);
 			} else if (ichan >= 8 && ichan - my d_sound.channelOffset == 8 && ichan < nchan) {
-				MelderString_append (& channelLabel, L" " UNITEXT_DOWNWARDS_ARROW);
+				MelderString_append (& channelLabel, U" " UNITEXT_DOWNWARDS_ARROW);
 			}
-			Graphics_text1 (my d_graphics, 1, 0.5, channelLabel.string);
+			Graphics_text (my d_graphics, 1, 0.5, channelLabel.string);
 		}
 		/*
 		 * Draw a very thin separator line underneath.
@@ -607,7 +606,7 @@ void TimeSoundEditor_drawSound (TimeSoundEditor me, double globalMinimum, double
 		if (sound) {
 			Graphics_setWindow (my d_graphics, my d_startWindow, my d_endWindow, minimum, maximum);
 			if (cursorVisible && NUMdefined (cursorFunctionValue))
-				FunctionEditor_drawCursorFunctionValue (me, cursorFunctionValue, Melder_float (Melder_half (cursorFunctionValue)), L"");
+				FunctionEditor_drawCursorFunctionValue (me, cursorFunctionValue, Melder_float (Melder_half (cursorFunctionValue)), U"");
 			Graphics_setColour (my d_graphics, Graphics_BLACK);
 			Graphics_function (my d_graphics, sound -> z [ichan], first, last,
 				Sampled_indexToX (sound, first), Sampled_indexToX (sound, last));
@@ -630,7 +629,7 @@ int structTimeSoundEditor :: v_click (double xbegin, double ybegin, bool shiftKe
 		ybegin = (ybegin - v_getBottomOfSoundArea ()) / (1.0 - v_getBottomOfSoundArea ());
 		int nchan = sound ? sound -> ny : longSound -> numberOfChannels;
 		if (nchan > 8) {
-			trace ("%f %f %d %d", xbegin, ybegin, (int) nchan, (int) d_sound.channelOffset);
+			trace (xbegin, U" ", ybegin, U" ", nchan, U" ", d_sound.channelOffset);
 			if (xbegin >= d_endWindow && ybegin > 0.875 && ybegin <= 1.000 && d_sound.channelOffset > 0) {
 				d_sound.channelOffset -= 8;
 				return 1;
@@ -644,21 +643,21 @@ int structTimeSoundEditor :: v_click (double xbegin, double ybegin, bool shiftKe
 	return TimeSoundEditor_Parent :: v_click (xbegin, ybegin, shiftKeyPressed);
 }
 
-void TimeSoundEditor_init (TimeSoundEditor me, const wchar_t *title, Function data, Sampled sound, bool ownSound) {
+void TimeSoundEditor_init (TimeSoundEditor me, const char32 *title, Function data, Sampled sound, bool ownSound) {
 	my d_ownSound = ownSound;
 	if (sound != NULL) {
 		if (ownSound) {
-			Melder_assert (Thing_member (sound, classSound));
+			Melder_assert (Thing_isa (sound, classSound));
 			my d_sound.data = Data_copy ((Sound) sound);   // deep copy; ownership transferred
 			Matrix_getWindowExtrema (my d_sound.data, 1, my d_sound.data -> nx, 1, my d_sound.data -> ny, & my d_sound.minimum, & my d_sound.maximum);
-		} else if (Thing_member (sound, classSound)) {
+		} else if (Thing_isa (sound, classSound)) {
 			my d_sound.data = (Sound) sound;   // reference copy; ownership not transferred
 			Matrix_getWindowExtrema (my d_sound.data, 1, my d_sound.data -> nx, 1, my d_sound.data -> ny, & my d_sound.minimum, & my d_sound.maximum);
-		} else if (Thing_member (sound, classLongSound)) {
+		} else if (Thing_isa (sound, classLongSound)) {
 			my d_longSound.data = (LongSound) sound;
 			my d_sound.minimum = -1.0, my d_sound.maximum = 1.0;
 		} else {
-			Melder_fatal ("Invalid sound class in TimeSoundEditor::init.");
+			Melder_fatal (U"Invalid sound class in TimeSoundEditor::init.");
 		}
 	}
 	FunctionEditor_init (me, title, data);
diff --git a/fon/TimeSoundEditor.h b/fon/TimeSoundEditor.h
index e440296..03c30ed 100644
--- a/fon/TimeSoundEditor.h
+++ b/fon/TimeSoundEditor.h
@@ -2,7 +2,7 @@
 #define _TimeSoundEditor_h_
 /* TimeSoundEditor.h
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,33 +32,39 @@ struct TimeSoundEditor_sound {
 };
 
 Thing_define (TimeSoundEditor, FunctionEditor) {
-	// new data:
-		public:
-			bool d_ownSound;
-			struct TimeSoundEditor_sound d_sound;
-			struct { LongSound data; } d_longSound;
-			GuiMenuItem drawButton, publishButton, publishPreserveButton, publishWindowButton, publishOverlapButton;
-			GuiMenuItem writeAiffButton, d_saveAs24BitWavButton, d_saveAs32BitWavButton, writeAifcButton, writeWavButton, writeNextSunButton, writeNistButton, writeFlacButton;
-	// overridden methods:
-		protected:
-			virtual void v_destroy ();
-			virtual void v_info ();
-			virtual void v_createMenuItems_file (EditorMenu menu);
-			virtual void v_createMenuItems_query_info (EditorMenu menu);
-			virtual void v_createMenuItems_file_draw (EditorMenu menu);
-			virtual void v_createMenuItems_file_extract (EditorMenu menu);
-			virtual void v_createMenuItems_file_write (EditorMenu menu);
-			virtual void v_createMenuItems_view (EditorMenu menu);
-			virtual int v_click (double xbegin, double ybegin, bool shiftKeyPressed);   // catch channel scrolling
-	// new methods:
-		public:   // BUG
-			virtual void v_createMenuItems_view_sound (EditorMenu menu);
-			virtual void v_updateMenuItems_file ();
-			virtual const wchar_t * v_getChannelName (long channelNumber) { (void) channelNumber; return NULL; }
+	bool d_ownSound;
+	struct TimeSoundEditor_sound d_sound;
+	struct { LongSound data; } d_longSound;
+	GuiMenuItem drawButton, publishButton, publishPreserveButton, publishWindowButton, publishOverlapButton;
+	GuiMenuItem writeAiffButton, d_saveAs24BitWavButton, d_saveAs32BitWavButton, writeAifcButton, writeWavButton, writeNextSunButton, writeNistButton, writeFlacButton;
+
+	void v_destroy ()
+		override;
+	void v_info ()
+		override;
+	void v_createMenuItems_file (EditorMenu menu)
+		override;
+	void v_createMenuItems_query_info (EditorMenu menu)
+		override;
+	void v_createMenuItems_file_draw (EditorMenu menu)
+		override;
+	void v_createMenuItems_file_extract (EditorMenu menu)
+		override;
+	void v_createMenuItems_file_write (EditorMenu menu)
+		override;
+	void v_createMenuItems_view (EditorMenu menu)
+		override;
+	int v_click (double xbegin, double ybegin, bool shiftKeyPressed)
+		override;   // catch channel scrolling
+
+	virtual void v_createMenuItems_view_sound (EditorMenu menu);
+	virtual void v_updateMenuItems_file ();
+	virtual const char32 * v_getChannelName (long channelNumber) { (void) channelNumber; return NULL; }
+
 	#include "TimeSoundEditor_prefs.h"
 };
 
-void TimeSoundEditor_init (TimeSoundEditor me, const wchar_t *title, Function data, Sampled sound, bool ownSound);
+void TimeSoundEditor_init (TimeSoundEditor me, const char32 *title, Function data, Sampled sound, bool ownSound);
 
 void TimeSoundEditor_drawSound (TimeSoundEditor me, double globalMinimum, double globalMaximum);
 
diff --git a/fon/TimeSoundEditor_enums.h b/fon/TimeSoundEditor_enums.h
index 455ae65..74600a5 100644
--- a/fon/TimeSoundEditor_enums.h
+++ b/fon/TimeSoundEditor_enums.h
@@ -1,6 +1,6 @@
 /* TimeSoundEditor_enums.h
  *
- * Copyright (C) 2012 Paul Boersma
+ * Copyright (C) 2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,11 +18,11 @@
  */
 
 enums_begin (kTimeSoundEditor_scalingStrategy, 1)
-	enums_add (kTimeSoundEditor_scalingStrategy, 1, BY_WHOLE, L"by whole")
-	enums_add (kTimeSoundEditor_scalingStrategy, 2, BY_WINDOW, L"by window")
-	enums_add (kTimeSoundEditor_scalingStrategy, 3, BY_WINDOW_AND_CHANNEL, L"by window and channel")
-	enums_add (kTimeSoundEditor_scalingStrategy, 4, FIXED_HEIGHT, L"fixed height")
-	enums_add (kTimeSoundEditor_scalingStrategy, 5, FIXED_RANGE, L"fixed range")
+	enums_add (kTimeSoundEditor_scalingStrategy, 1, BY_WHOLE, U"by whole")
+	enums_add (kTimeSoundEditor_scalingStrategy, 2, BY_WINDOW, U"by window")
+	enums_add (kTimeSoundEditor_scalingStrategy, 3, BY_WINDOW_AND_CHANNEL, U"by window and channel")
+	enums_add (kTimeSoundEditor_scalingStrategy, 4, FIXED_HEIGHT, U"fixed height")
+	enums_add (kTimeSoundEditor_scalingStrategy, 5, FIXED_RANGE, U"fixed range")
 enums_end (kTimeSoundEditor_scalingStrategy, 5, BY_WINDOW)
 
 /* End of file TimeSoundEditor_enums.h */
diff --git a/fon/TimeSoundEditor_prefs.h b/fon/TimeSoundEditor_prefs.h
index 2141dd4..d8389d6 100644
--- a/fon/TimeSoundEditor_prefs.h
+++ b/fon/TimeSoundEditor_prefs.h
@@ -1,6 +1,6 @@
 /* TimeSoundEditor_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,19 +18,20 @@
  */
 
 prefs_begin (TimeSoundEditor)
-	// new:
-		prefs_add_enum_with_data   (TimeSoundEditor, sound_scalingStrategy,  1, kTimeSoundEditor_scalingStrategy, DEFAULT)
-		prefs_add_double_with_data (TimeSoundEditor, sound_scaling_height,   1, L"2.0")
-		prefs_add_double_with_data (TimeSoundEditor, sound_scaling_minimum,  1, L"-1.0")
-		prefs_add_double_with_data (TimeSoundEditor, sound_scaling_maximum,  1, L"1.0")
-		prefs_add_bool             (TimeSoundEditor, picture_preserveTimes,  1, true)
-		prefs_add_double           (TimeSoundEditor, picture_bottom,         1, L"0.0")
-		prefs_add_double           (TimeSoundEditor, picture_top,            1, L"0.0 (= auto)")
-		prefs_add_bool             (TimeSoundEditor, picture_garnish,        1, true)
-		prefs_add_enum             (TimeSoundEditor, extract_windowShape,    1, kSound_windowShape, DEFAULT)
-		prefs_add_double           (TimeSoundEditor, extract_relativeWidth,  1, L"1.0")
-		prefs_add_bool             (TimeSoundEditor, extract_preserveTimes,  1, true)
-		prefs_add_double           (TimeSoundEditor, extract_overlap,        1, L"0.01")
+
+	prefs_add_enum_with_data   (TimeSoundEditor, sound_scalingStrategy,  1, kTimeSoundEditor_scalingStrategy, DEFAULT)
+	prefs_add_double_with_data (TimeSoundEditor, sound_scaling_height,   1, U"2.0")
+	prefs_add_double_with_data (TimeSoundEditor, sound_scaling_minimum,  1, U"-1.0")
+	prefs_add_double_with_data (TimeSoundEditor, sound_scaling_maximum,  1, U"1.0")
+	prefs_add_bool             (TimeSoundEditor, picture_preserveTimes,  1, true)
+	prefs_add_double           (TimeSoundEditor, picture_bottom,         1, U"0.0")
+	prefs_add_double           (TimeSoundEditor, picture_top,            1, U"0.0 (= auto)")
+	prefs_add_bool             (TimeSoundEditor, picture_garnish,        1, true)
+	prefs_add_enum             (TimeSoundEditor, extract_windowShape,    1, kSound_windowShape, DEFAULT)
+	prefs_add_double           (TimeSoundEditor, extract_relativeWidth,  1, U"1.0")
+	prefs_add_bool             (TimeSoundEditor, extract_preserveTimes,  1, true)
+	prefs_add_double           (TimeSoundEditor, extract_overlap,        1, U"0.01")
+
 prefs_end (TimeSoundEditor)
 
 /* End of file TimeSoundEditor_prefs.h */
diff --git a/fon/Transition.cpp b/fon/Transition.cpp
index 8628317..96aba4c 100644
--- a/fon/Transition.cpp
+++ b/fon/Transition.cpp
@@ -1,6 +1,6 @@
 /* Transition.cpp
  *
- * Copyright (C) 1997-2012 Paul Boersma
+ * Copyright (C) 1997-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,36 +38,36 @@
 #include "oo_DESCRIPTION.h"
 #include "Transition_def.h"
 
-Thing_implement (Transition, Data, 0);
+Thing_implement (Transition, Daata, 0);
 
 void structTransition :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of states: ", Melder_integer (numberOfStates));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of states: ", numberOfStates);
 }
 
 void structTransition :: v_writeText (MelderFile file) {
-	texputi4 (file, numberOfStates, L"numberOfStates", 0,0,0,0,0);
-	MelderFile_write (file, L"\nstateLabels []: ");
-	if (numberOfStates < 1) MelderFile_write (file, L"(empty)");
-	MelderFile_write (file, L"\n");
+	texputi4 (file, numberOfStates, U"numberOfStates", 0,0,0,0,0);
+	MelderFile_write (file, U"\nstateLabels []: ");
+	if (numberOfStates < 1) MelderFile_write (file, U"(empty)");
+	MelderFile_write (file, U"\n");
 	for (long i = 1; i <= numberOfStates; i ++) {
-		MelderFile_write (file, L"\"");
+		MelderFile_write (file, U"\"");
 		if (stateLabels [i] != NULL) MelderFile_write (file, stateLabels [i]);
-		MelderFile_write (file, L"\"\t");
+		MelderFile_write (file, U"\"\t");
 	}
 	for (long i = 1; i <= numberOfStates; i ++) {
-		MelderFile_write (file, L"\nstate [", Melder_integer (i), L"]:");
+		MelderFile_write (file, U"\nstate [", i, U"]:");
 		for (long j = 1; j <= numberOfStates; j ++) {
-			MelderFile_write (file, L"\t", Melder_double (data [i] [j]));
+			MelderFile_write (file, U"\t", data [i] [j]);
 		}
 	}
 }
 
 void Transition_init (Transition me, long numberOfStates) {
 	if (numberOfStates < 1)
-		Melder_throw ("Cannot create empty matrix.");
+		Melder_throw (U"Cannot create empty matrix.");
 	my numberOfStates = numberOfStates;
-	my stateLabels = NUMvector <wchar_t *> (1, numberOfStates);
+	my stateLabels = NUMvector <char32 *> (1, numberOfStates);
 	my data = NUMmatrix <double> (1, my numberOfStates, 1, my numberOfStates);
 }
 
@@ -77,7 +77,7 @@ Transition Transition_create (long numberOfStates) {
 		Transition_init (me.peek(), numberOfStates);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Transition not created.");
+		Melder_throw (U"Transition not created.");
 	}
 }
 
@@ -85,29 +85,29 @@ static void NUMrationalize (double x, long *numerator, long *denominator) {
 	double epsilon = 1e-6;
 	*numerator = 1;
 	for (*denominator = 1; *denominator <= 100000; (*denominator) ++) {
-		double numerator_d = x * *denominator, rounded = floor (numerator_d + 0.5);
+		double numerator_d = x * *denominator, rounded = round (numerator_d);
 		if (fabs (rounded - numerator_d) < epsilon) {
-			*numerator = rounded;
+			*numerator = (long) rounded;
 			return;
 		}
 	}
 	*denominator = 0;   // failure
 }
 
-static void print4 (wchar_t *buffer, double value, int iformat, int width, int precision) {
-	wchar_t formatString [40];
+static void print4 (char *buffer, double value, int iformat, int width, int precision) {
+	char formatString [40];
 	if (iformat == 4) {
 		long numerator, denominator;
 		NUMrationalize (value, & numerator, & denominator);
 		if (numerator == 0)
-			swprintf (buffer, 40, L"0");
+			snprintf (buffer, 40, "0");
 		else if (denominator > 1)
-			swprintf (buffer, 40, L"%ld/%ld", numerator, denominator);
+			snprintf (buffer, 40, "%ld/%ld", numerator, denominator);
 		else
-			swprintf (buffer, 40, L"%.7g", value);
+			snprintf (buffer, 40, "%.7g", value);
 	} else {
-		swprintf (formatString, 40, L"%%%d.%d%c", width, precision, iformat == 1 ? 'f' : iformat == 2 ? 'e' : 'g');
-		swprintf (buffer, 40, formatString, value);
+		snprintf (formatString, 40, "%%%d.%d%c", width, precision, iformat == 1 ? 'f' : iformat == 2 ? 'e' : 'g');
+		snprintf (buffer, 40, formatString, value);
 	}
 }
 
@@ -121,7 +121,7 @@ void Transition_drawAsNumbers (Transition me, Graphics g, int iformat, int preci
 	for (long col = 1; col <= my numberOfStates; col ++) {
 		if (my stateLabels && my stateLabels [col] && my stateLabels [col] [0]) {
 			Graphics_text (g, col, 1, my stateLabels [col]);
-			if (! maxTextHeight) maxTextHeight = lineSpacing;
+			if (maxTextHeight == 0.0) maxTextHeight = lineSpacing;
 		}
 	}
 	for (long row = 1; row <= my numberOfStates; row ++) {
@@ -134,14 +134,14 @@ void Transition_drawAsNumbers (Transition me, Graphics g, int iformat, int preci
 		}
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
 		for (long col = 1; col <= my numberOfStates; col ++) {
-			wchar_t text [40];
+			char text [40];
 			print4 (text, my data [row] [col], iformat, 0, precision);
-			Graphics_text (g, col, y, text);
+			Graphics_text (g, col, y, Melder_peek8to32 (text));
 		}
 	}
-	if (maxTextWidth)
+	if (maxTextWidth != 0.0)
 		Graphics_line (g, 0.5 - maxTextWidth - leftMargin, 1, my numberOfStates + 0.5, 1);
-	if (maxTextHeight)
+	if (maxTextHeight != 0.0)
 		Graphics_line (g, 0.5, 1 + maxTextHeight, 0.5, 1 - lineSpacing * (my numberOfStates + 0.2));
 	Graphics_unsetInner (g);
 }
@@ -178,7 +178,7 @@ void Transition_eigen (Transition me, Matrix *out_eigenvectors, Matrix *out_eige
 	} catch (MelderError) {
 		if (transposed)
 			Transition_transpose (me);
-		Melder_throw (me, ": eigenvectors not computed.");
+		Melder_throw (me, U": eigenvectors not computed.");
 	}
 }
 
@@ -199,7 +199,7 @@ Transition Transition_power (Transition me, long power) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": power not computed.");
+		Melder_throw (me, U": power not computed.");
 	}
 }
 
@@ -211,21 +211,21 @@ Matrix Transition_to_Matrix (Transition me) {
 				thy z [i] [j] = my data [i] [j];
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
 Transition Matrix_to_Transition (Matrix me) {
 	try {
 		if (my nx != my ny)
-			Melder_throw ("Matrix should be square.");
+			Melder_throw (U"Matrix should be square.");
 		autoTransition thee = Transition_create (my nx);
 		for (long i = 1; i <= my nx; i ++)
 			for (long j = 1; j <= my nx; j ++)
 				thy data [i] [j] = my z [i] [j];
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Transition.");
+		Melder_throw (me, U": not converted to Transition.");
 	}
 }
 
diff --git a/fon/Transition.h b/fon/Transition.h
index f8b4453..b64a535 100644
--- a/fon/Transition.h
+++ b/fon/Transition.h
@@ -2,7 +2,7 @@
 #define _Transition_h_
 /* Transition.h
  *
- * Copyright (C) 1992-2011,2012 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,17 +19,16 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-/* Transition inherits from Data */
 #include "Matrix.h"
 #include "Graphics.h"
 
 #include "Transition_def.h"
-oo_CLASS_CREATE (Transition, Data);
+oo_CLASS_CREATE (Transition, Daata);
 
 void Transition_init (Transition me, long numberOfStates);
 Transition Transition_create (long numberOfStates);
 
-void Transition_formula (Transition me, const wchar_t *formula);
+void Transition_formula (Transition me, const char32 *formula);
 void Transition_drawAsNumbers (Transition me, Graphics g, int iformat, int precision);
 
 void Transition_eigen (Transition me, Matrix *eigenvectors, Matrix *eigenvalues);
diff --git a/fon/Transition_def.h b/fon/Transition_def.h
index 9021bc4..dae56aa 100644
--- a/fon/Transition_def.h
+++ b/fon/Transition_def.h
@@ -1,6 +1,6 @@
 /* Transition_def.h
  *
- * Copyright (C) 1997-2011 Paul Boersma
+ * Copyright (C) 1997-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,15 +19,15 @@
 
 
 #define ooSTRUCT Transition
-oo_DEFINE_CLASS (Transition, Data)
+oo_DEFINE_CLASS (Transition, Daata)
 
 	oo_LONG (numberOfStates)
 	oo_STRING_VECTOR (stateLabels, numberOfStates)
 	oo_DOUBLE_MATRIX (data, numberOfStates, numberOfStates)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (Transition)
diff --git a/fon/Vector.cpp b/fon/Vector.cpp
index d58975d..6ca6c27 100644
--- a/fon/Vector.cpp
+++ b/fon/Vector.cpp
@@ -1,6 +1,6 @@
 /* Vector.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -294,7 +294,7 @@ double Vector_getAbsoluteExtremum (Vector me, double xmin, double xmax, int inte
 /***** Get statistics. *****/
 
 double Vector_getMean (Vector me, double xmin, double xmax, long channel) {
-	return Sampled_getMean (me, xmin, xmax, channel, 0, TRUE);
+	return Sampled_getMean (me, xmin, xmax, channel, 0, true);
 }
 
 double Vector_getStandardDeviation (Vector me, double xmin, double xmax, long ilevel) {
@@ -369,7 +369,7 @@ void Vector_scale (Vector me, double scale) {
 /***** Graphics. *****/
 
 void Vector_draw (Vector me, Graphics g, double *pxmin, double *pxmax, double *pymin, double *pymax,
-	double defaultDy, const wchar_t *method)
+	double defaultDy, const char32 *method)
 {
 	bool xreversed = *pxmin > *pxmax, yreversed = *pymin > *pymax;
 	if (xreversed) { double temp = *pxmin; *pxmin = *pxmax; *pxmax = temp; }
@@ -401,7 +401,7 @@ void Vector_draw (Vector me, Graphics g, double *pxmin, double *pxmax, double *p
 	 */
 	Graphics_setInner (g);
 	Graphics_setWindow (g, xreversed ? *pxmax : *pxmin, xreversed ? *pxmin : *pxmax, yreversed ? *pymax : *pymin, yreversed ? *pymin : *pymax);
-	if (wcsstr (method, L"bars") || wcsstr (method, L"Bars")) {
+	if (str32str (method, U"bars") || str32str (method, U"Bars")) {
 		for (ix = ixmin; ix <= ixmax; ix ++) {
 			double x = Sampled_indexToX (me, ix);
 			double y = my z [1] [ix];
@@ -415,12 +415,12 @@ void Vector_draw (Vector me, Graphics g, double *pxmin, double *pxmax, double *p
 				Graphics_line (g, right, y, right, *pymin);
 			}
 		}
-	} else if (wcsstr (method, L"poles") || wcsstr (method, L"Poles")) {
+	} else if (str32str (method, U"poles") || str32str (method, U"Poles")) {
 		for (ix = ixmin; ix <= ixmax; ix ++) {
 			double x = Sampled_indexToX (me, ix);
 			Graphics_line (g, x, 0, x, my z [1] [ix]);
 		}
-	} else if (wcsstr (method, L"speckles") || wcsstr (method, L"Speckles")) {
+	} else if (str32str (method, U"speckles") || str32str (method, U"Speckles")) {
 		for (ix = ixmin; ix <= ixmax; ix ++) {
 			double x = Sampled_indexToX (me, ix);
 			Graphics_speckle (g, x, my z [1] [ix]);
diff --git a/fon/Vector.h b/fon/Vector.h
index 774b48a..0b6e8a6 100644
--- a/fon/Vector.h
+++ b/fon/Vector.h
@@ -2,7 +2,7 @@
 #define _Vector_h_
 /* Vector.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,13 +25,20 @@
 #include "Matrix.h"
 
 Thing_define (Vector, Matrix) {
-	// overridden methods:
-	protected:
-		virtual bool v_hasGetVector    () { return true; }   virtual double v_getVector (long irow, long icol);
-		virtual bool v_hasGetFunction1 () { return true; }   virtual double v_getFunction1 (long irow, double x);
-		virtual bool v_hasGetMatrix    () { return false; }
-		virtual bool v_hasGetFunction2 () { return false; }
-		virtual double v_getValueAtSample (long isamp, long ilevel, int unit);
+	bool v_hasGetVector ()
+		override { return true; }
+	double v_getVector (long irow, long icol)
+		override;
+	bool v_hasGetFunction1 ()
+		override { return true; }
+	double v_getFunction1 (long irow, double x)
+		override;
+	bool v_hasGetMatrix ()
+		override { return false; }
+	bool v_hasGetFunction2 ()
+		override { return false; }
+	double v_getValueAtSample (long isamp, long ilevel, int unit)
+		override;
 };
 
 #define Vector_CHANNEL_AVERAGE  0
@@ -69,7 +76,7 @@ void Vector_multiplyByScalar (Vector me, double scalar);
 void Vector_scale (Vector me, double scale);
 
 void Vector_draw (Vector me, Graphics g, double *pxmin, double *pxmax, double *pymin, double *pymax,
-	double defaultDy, const wchar_t *method);
+	double defaultDy, const char32 *method);
 /*
 	If *pxmin equals *pxmax, then autowindowing from my xmin to my xmax.
 	If *pymin equals *pymax, then autoscaling from minimum to maximum;
diff --git a/fon/VocalTract.cpp b/fon/VocalTract.cpp
index 988d691..24f65cc 100644
--- a/fon/VocalTract.cpp
+++ b/fon/VocalTract.cpp
@@ -1,6 +1,6 @@
 /* VocalTract.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,10 +22,10 @@
 Thing_implement (VocalTract, Vector, 2);
 
 void structVocalTract :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Vocal tract length: ", Melder_single (xmax), L" metres");
-	MelderInfo_writeLine (L"Number of sections: ", Melder_integer (nx));
-	MelderInfo_writeLine (L"Section length: ", Melder_single (dx), L" metres");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Vocal tract length: ", Melder_single (xmax), U" metres");
+	MelderInfo_writeLine (U"Number of sections: ", nx);
+	MelderInfo_writeLine (U"Section length: ", Melder_single (dx), U" metres");
 }
 
 VocalTract VocalTract_create (long nx, double dx) {
@@ -34,96 +34,96 @@ VocalTract VocalTract_create (long nx, double dx) {
 		Matrix_init (me.peek(), 0, nx * dx, nx, dx, 0.5 * dx, 1, 1, 1, 1, 1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("VocalTract not created.");
+		Melder_throw (U"VocalTract not created.");
 	}
 }
 
 #define MinimumWidth 0.0001
-static struct { const wchar_t *phone; int numberOfSections; double area [40]; }
+static struct { const char32 *phone; int numberOfSections; double area [40]; }
 	data [] = {
-{ L"a", 34, { 1.7, 1.2, 1.6, 3.39, 2.1, 1.4, 1, 0.8, 0.8, 0.8, 1, 1.4,
+{ U"a", 34, { 1.7, 1.2, 1.6, 3.39, 2.1, 1.4, 1, 0.8, 0.8, 0.8, 1, 1.4,
 	2.1, 2.9, 3.09, 2.1, 2.5, 4, 5.3, 6.16, 7, 7.6, 8.15, 8.5, 8.6,
 	8.4, 8, 7.5, 6.9, 6, 5.1, 5, 5.5, 7.9 } },
-{ L"e", 33, { 2.3, 1.95, 1.73, 1.7, 5.3, 6.3, 6.8, 7.55, 8.2, 9.1, 9.7,
+{ U"e", 33, { 2.3, 1.95, 1.73, 1.7, 5.3, 6.3, 6.8, 7.55, 8.2, 9.1, 9.7,
 	10.1, 10.2, 10, 8, 7.2, 7.5, 6.4, 5.4, 4.9, 4.35, 3.9, 3.5, 3.1,
 	2.7, 2.4, 2.2, 2.5, 3.4, 5, 6.7, 8.5, 10 } },
-{ L"i", 35, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
+{ U"i", 35, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
 	10.9, 11.15, 11.3, 11.2, 10.8, 8, 7.8, 7, 4.5, 2.8, 1.9, 1.3,
 	0.9, 0.65, 0.55, 0.5, 0.55, 0.7, 0.95, 1.3, 2, 3, 5, 8 } },
-{ L"o", 37, { 2.6, 2.05, 1.56, 1.3, 5.2, 4.54, 3.49, 2.6, 2.1, 1.8, 1.6, 1.4,
+{ U"o", 37, { 2.6, 2.05, 1.56, 1.3, 5.2, 4.54, 3.49, 2.6, 2.1, 1.8, 1.6, 1.4,
 	1.29, 1.19, 1.22, 2.6, 2.9, 2.2, 2.6, 3.6, 4.55, 5.55, 6.4, 7.15,
 	8, 8.9, 9.6, 10.5, 11.8, 14.6, 14.5, 12.9, 10.4, 5, 3.4, 3.4, 4 } },
-{ L"u", 40, { 2.5, 2.5, 2.5, 2.4, 5, 8.1, 8.9, 8.9, 8.4, 7.5, 5.8, 3.9, 2.3, 1.6, 1.2,
+{ U"u", 40, { 2.5, 2.5, 2.5, 2.4, 5, 8.1, 8.9, 8.9, 8.4, 7.5, 5.8, 3.9, 2.3, 1.6, 1.2,
 	1.05, 1.1, 1.4, 2.2, 2, 1.3, 2, 2.2, 2.3, 2.8, 3.7, 5, 6.2, 7.9,
 	10.9, 12.9, 13.15, 13, 12.5, 9.9, 3.9, 1.8, 0.32, 0.4, 0.6 } },
-{ L"y1", 37, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
+{ U"y1", 37, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
 	10.9, 11.15, 11.3, 11.2, 10.8, 8, 7.8, 7, 4.5, 2.8, 1.9, 1.3,
 	0.9, 0.65, 0.55, 0.5, 0.55, 0.7, 0.95, 1.3, 2, 3, 1.8, 0.32,
 	0.4, 0.6 } },
-{ L"y2", 38, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
+{ U"y2", 38, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
 	10.9, 11.15, 11.3, 11.2, 10.8, 8, 7.8, 7, 4.5, 2.8, 1.9, 1.3,
 	0.9, 0.65, 0.55, 0.5, 0.55, 0.7, 0.95, 1.3, 2, 3, 4, 1.8, 0.32,
 	0.4, 0.6 } },
-{ L"y3", 39, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
+{ U"y3", 39, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
 	10.9, 11.15, 11.3, 11.2, 10.8, 8, 7.8, 7, 4.5, 2.8, 1.9, 1.3,
 	0.9, 0.65, 0.55, 0.5, 0.55, 0.7, 0.95, 1.3, 2, 3, 4, 4, 1.8, 0.32,
 	0.4, 0.6 } },
-{ L"jery", 38, { 3.2, 3.2, 3.2, 3.2, 10.5, 10.5, 13, 13, 10.5, 10.5, 10.5, 10.5, 10.5,
+{ U"jery", 38, { 3.2, 3.2, 3.2, 3.2, 10.5, 10.5, 13, 13, 10.5, 10.5, 10.5, 10.5, 10.5,
 	8, 6.5, 6.5, 5, 4, 2, 2.6, 1.6, 1.3, 1, 1, 1.3, 1.6, 2, 2, 2.6, 3.2, 5,
 	8, 8, 8, 6.5,
 	2, 6.5, 6.5 } },
-{ L"p", 39, { 3.5, 3.2, 2.9, 2.6, 6.9, 6.65, 5.8, 4.9, 4, 3.14, 2.5, 1.84,
+{ U"p", 39, { 3.5, 3.2, 2.9, 2.6, 6.9, 6.65, 5.8, 4.9, 4, 3.14, 2.5, 1.84,
 	1.25, 0.83, 0.6, 0.53,
 	0.5, 0.6, 0.85, 1, 1.6, 2.05, 2.55, 3.08, 3.67, 4.15, 4.8, 5.5, 6.3,
 	7.4, 12, 12.98, 12.9, 11.4, 6.6, 2, 0.45, 0.1, MinimumWidth } },
-{ L"t", 36, { 2.8, 2.7, 2.4, 2.6, 6.45, 6.01, 5.31, 4.85, 4.55, 4.32, 4.18, 4.1,
+{ U"t", 36, { 2.8, 2.7, 2.4, 2.6, 6.45, 6.01, 5.31, 4.85, 4.55, 4.32, 4.18, 4.1,
 	4.04, 3.97, 3.85, 3.7, 3.4, 3.05, 2.91, 3.1, 3.55, 3.9, 4.1, 4, 3.8,
 	3.3, 2.55, 1.8, 1, 0.45, 0.1, MinimumWidth, 0.8, 2.5, 6, 9 } },
-{ L"k", 38, { 2.4, 2.7, 3, 3.3, 7, 9.38, 9.25, 8.62, 7.8, 6.7, 5.4, 4, 2.8, 1.9, 1.35,
+{ U"k", 38, { 2.4, 2.7, 3, 3.3, 7, 9.38, 9.25, 8.62, 7.8, 6.7, 5.4, 4, 2.8, 1.9, 1.35,
 	0.9, 0.55, 0.3, 0.19, 0.07, MinimumWidth, 0.12, 0.17, 0.3, 0.5, 0.9,
 	1.4, 2.2, 3.3, 5, 9, 11.25, 10.9, 7.3, 4.3, 3.5, 3.7, 6 } },
-{ L"x", 40, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+{ U"x", 40, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
 	4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 } },
-{ L"pa", 39, { 1.7, 1.2, 1.6, 3.39, 2.1, 1.4, 1, 0.8, 0.8, 0.8, 1, 1.4,
+{ U"pa", 39, { 1.7, 1.2, 1.6, 3.39, 2.1, 1.4, 1, 0.8, 0.8, 0.8, 1, 1.4,
 	2.1, 2.9, 3.09, 2.1, 2.5, 4, 5.3, 6.16, 7, 7.6, 8.15, 8.5, 8.6,
 	8.4, 8, 7.5, 6.9, 6, 5.1, 5, 5.5, 7.9, 6.6, 2, 0.45, 0.1,
 	MinimumWidth } },
-{ L"ta", 34, { 1.7, 1.2, 1.6, 3.39, 2.1, 1.4, 1, 0.8, 0.8, 0.8, 1, 1.4,
+{ U"ta", 34, { 1.7, 1.2, 1.6, 3.39, 2.1, 1.4, 1, 0.8, 0.8, 0.8, 1, 1.4,
 	2.1, 2.9, 3.09, 2.1, 2.5, 4, 5.3, 6.16, 7, 7.6, 8.15, 8.5, 8.6,
 	8.5, 6, 2, 0.45, MinimumWidth, 0.8, 2.5, 5.5, 7.9 } },
-{ L"ka", 34, { 1.7, 1.2, 1.6, 3.39, 2.1, 1.4, 1, 0.8, 0.8, 0.8, 1, 1.4,
+{ U"ka", 34, { 1.7, 1.2, 1.6, 3.39, 2.1, 1.4, 1, 0.8, 0.8, 0.8, 1, 1.4,
 	2.1, 2.9, 3.09, 2.1, 0.3, MinimumWidth,
 	0.3, 2, 5, 7.6, 8.15, 8.5, 8.6,
 	8.4, 8, 7.5, 6.9, 6, 5.1, 5, 5.5, 7.9 } },
-{ L"pi", 39, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
+{ U"pi", 39, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
 	10.9, 11.15, 11.3, 11.2, 10.8, 8, 7.8, 7, 4.5, 2.8, 1.9, 1.3,
 	0.9, 0.65, 0.55, 0.5, 0.55, 0.7, 0.95, 1.3, 2, 3, 5,
 	6.6, 2, 0.45, 0.1, MinimumWidth } },
-{ L"ti", 35, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
+{ U"ti", 35, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
 	10.9, 11.15, 11.3, 11.2, 10.8, 8, 7.8, 7, 4.5, 2.8, 1.9, 1.3,
 	0.9, 0.65, 0.55, 0.5, 0.5, 0.5, 0.3, 0.1, MinimumWidth,
 	0.8, 2.5, 8 } },
-{ L"ki", 35, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
+{ U"ki", 35, { 3, 2.9, 2.75, 2.58, 2.7, 6.35, 7.8, 8.9, 9.6, 10.15, 10.55,
 	10.9, 11.15, 11.3, 11.2, 10.8, 8, 6, 2, 0.3, MinimumWidth, 0.3, 1.3,
 	0.9, 0.65, 0.55, 0.5, 0.55, 0.7, 0.95, 1.3, 2, 3, 5, 8 } },
-{ L"pu", 40, { 2.5, 2.5, 2.5, 2.4, 5, 8.1, 8.9, 8.9, 8.4, 7.5, 5.8, 3.9, 2.3, 1.6, 1.2,
+{ U"pu", 40, { 2.5, 2.5, 2.5, 2.4, 5, 8.1, 8.9, 8.9, 8.4, 7.5, 5.8, 3.9, 2.3, 1.6, 1.2,
 	1.05, 1.1, 1.4, 2.2, 2, 1.3, 2, 2.2, 2.3, 2.8, 3.7, 5, 6.2, 7.9,
 	10.9, 12.9, 13.15, 13, 12.5, 9.9, 6.6, 2, 0.45, 0.1, MinimumWidth } },
-{ L"tu", 40, { 2.5, 2.5, 2.5, 2.4, 5, 8.1, 8.9, 8.9, 8.4, 7.5, 5.8, 3.9, 2.3, 1.6, 1.2,
+{ U"tu", 40, { 2.5, 2.5, 2.5, 2.4, 5, 8.1, 8.9, 8.9, 8.4, 7.5, 5.8, 3.9, 2.3, 1.6, 1.2,
 	1.05, 1.1, 1.4, 2.2, 2, 1.3, 2, 2.2, 2.3, 2.8, 3.7, 5, 6.2, 7.9,
 	10.9, 9, 3, 0.4, MinimumWidth, 0.8, 2.5, 1.8, 0.32, 0.4, 0.6 } },
-{ L"ku", 40, { 2.5, 2.5, 2.5, 2.4, 5, 8.1, 8.9, 8.9, 8.4, 7.5, 5.8, 3.9, 2.3, 1.6, 1.2,
+{ U"ku", 40, { 2.5, 2.5, 2.5, 2.4, 5, 8.1, 8.9, 8.9, 8.4, 7.5, 5.8, 3.9, 2.3, 1.6, 1.2,
 	1.05, 1.1, 1.4, 1.2, 0.3, MinimumWidth, 0.3, 2.2, 2.3, 2.8, 3.7, 5, 6.2, 7.9,
 	10.9, 12.9, 13.15, 13, 12.5, 9.9, 3.9, 1.8, 0.32, 0.4, 0.6 } },
 { NULL, 0, { 0 } } };
 
-VocalTract VocalTract_createFromPhone (const wchar_t *phone) {
+VocalTract VocalTract_createFromPhone (const char32 *phone) {
 	try {
 		int i = 0;
 		for (;; i ++) {
 			if (data [i]. phone == NULL)
-				Melder_throw ("Unknown phone ", phone);
-			if (Melder_wcsequ (data [i]. phone, phone))
+				Melder_throw (U"Unknown phone ", phone);
+			if (Melder_equ (data [i]. phone, phone))
 				break;
 		}
 		autoVocalTract me = VocalTract_create (data [i]. numberOfSections, 0.005);
@@ -131,7 +131,7 @@ VocalTract VocalTract_createFromPhone (const wchar_t *phone) {
 			my z [1] [isection] = data [i]. area [isection - 1] * 0.0001;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("VocalTract not created from phone.");
+		Melder_throw (U"VocalTract not created from phone.");
 	}
 }
 
@@ -145,7 +145,7 @@ Matrix VocalTract_to_Matrix (VocalTract me) {
 		NUMvector_copyElements (my z [1], thy z [1], 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Matrix.");
+		Melder_throw (me, U": not converted to Matrix.");
 	}
 }
 
@@ -155,7 +155,7 @@ VocalTract Matrix_to_VocalTract (Matrix me) {
 		NUMvector_copyElements (my z [1], thy z [1], 1, my nx);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to VocalTract.");
+		Melder_throw (me, U": not converted to VocalTract.");
 	}
 }
 
diff --git a/fon/VocalTract.h b/fon/VocalTract.h
index 4b22b04..7043ce1 100644
--- a/fon/VocalTract.h
+++ b/fon/VocalTract.h
@@ -2,7 +2,7 @@
 #define _VocalTract_h_
 /* VocalTract.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,10 +23,10 @@
 #include "Graphics.h"
 
 Thing_define (VocalTract, Vector) {
-	// overridden methods:
-	protected:
-		virtual void v_info ();
-		virtual int v_domainQuantity () { return MelderQuantity_DISTANCE_FROM_GLOTTIS_METRES; }
+	void v_info ()
+		override;
+	int v_domainQuantity ()
+		override { return MelderQuantity_DISTANCE_FROM_GLOTTIS_METRES; }
 };
 
 /*
@@ -43,7 +43,7 @@ Thing_define (VocalTract, Vector) {
 VocalTract VocalTract_create (long nx, double dx);
 /*
 	Function:
-		create a VocalTract, or NULL if out of memory.
+		create a VocalTract.
 	Preconditions:
 		nx >= 1;
 		dx > 0.0;
@@ -56,7 +56,7 @@ VocalTract VocalTract_create (long nx, double dx);
 		my z [1] [1..nx] == 1e-4; // straight tube, area 1 cm2.
  */
 
-VocalTract VocalTract_createFromPhone (const wchar_t *phone);
+VocalTract VocalTract_createFromPhone (const char32 *phone);
 /* 'phone' is one of the following: a e i o u y1 y2 y3 jery p t k x pa ta ka pi ti ki pu tu ku */
 
 void VocalTract_draw (VocalTract me, Graphics g);   /* Draw a VocalTract into a Graphics. */
@@ -65,14 +65,12 @@ Matrix VocalTract_to_Matrix (VocalTract me);
 /*
 	Create a Matrix from a VocalTract,
 	with deep copy of all of its Matrix attributes, except class information and methods.
-	Return NULL if out of memory.  
 */
 
 VocalTract Matrix_to_VocalTract (Matrix me);
 /*
 	Function:
 		create a VocalTract from a Matrix.
-		Return NULL if out of memory.
 	Postconditions:
 		thy xmin == my xmin;
 		thy xmax == my xmax;
diff --git a/fon/VocalTract_to_Spectrum.cpp b/fon/VocalTract_to_Spectrum.cpp
index 402b3f3..101ed03 100644
--- a/fon/VocalTract_to_Spectrum.cpp
+++ b/fon/VocalTract_to_Spectrum.cpp
@@ -1,6 +1,6 @@
 /* VocalTract_to_Spectrum.cpp
  *
- * Copyright (C) 1991-2011 Paul Boersma
+ * Copyright (C) 1991-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -131,7 +131,7 @@ Spectrum VocalTract_to_Spectrum
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Spectrum.");
+		Melder_throw (me, U": not converted to Spectrum.");
 	}
 }
 
diff --git a/fon/VoiceAnalysis.cpp b/fon/VoiceAnalysis.cpp
index 3000ecc..baec2b6 100644
--- a/fon/VoiceAnalysis.cpp
+++ b/fon/VoiceAnalysis.cpp
@@ -1,6 +1,6 @@
 /* VoiceAnalysis.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -133,11 +133,11 @@ double PointProcess_Sound_getShimmer_local (PointProcess me, Sound thee, double
 		autoAmplitudeTier peaks = PointProcess_Sound_to_AmplitudeTier_period (me, thee, tmin, tmax, pmin, pmax, maximumPeriodFactor);
 		return AmplitudeTier_getShimmer_local (peaks.peek(), pmin, pmax, maximumAmplitudeFactor);
 	} catch (MelderError) {
-		if (Melder_hasError (L"Too few pulses between ")) {
+		if (Melder_hasError (U"Too few pulses between ")) {
 			Melder_clearError ();
 			return NUMundefined;
 		} else {
-			Melder_throw (me, " & ", thee, ": shimmer (local) not computed.");
+			Melder_throw (me, U" & ", thee, U": shimmer (local) not computed.");
 		}
 	}
 }
@@ -150,11 +150,11 @@ double PointProcess_Sound_getShimmer_local_dB (PointProcess me, Sound thee, doub
 		autoAmplitudeTier peaks = PointProcess_Sound_to_AmplitudeTier_period (me, thee, tmin, tmax, pmin, pmax, maximumPeriodFactor);
 		return AmplitudeTier_getShimmer_local_dB (peaks.peek(), pmin, pmax, maximumAmplitudeFactor);
 	} catch (MelderError) {
-		if (Melder_hasError (L"Too few pulses between ")) {
+		if (Melder_hasError (U"Too few pulses between ")) {
 			Melder_clearError ();
 			return NUMundefined;
 		} else {
-			Melder_throw (me, " & ", thee, ": shimmer (local, dB) not computed.");
+			Melder_throw (me, U" & ", thee, U": shimmer (local, dB) not computed.");
 		}
 	}
 }
@@ -167,11 +167,11 @@ double PointProcess_Sound_getShimmer_apq3 (PointProcess me, Sound thee, double t
 		autoAmplitudeTier peaks = PointProcess_Sound_to_AmplitudeTier_period (me, thee, tmin, tmax, pmin, pmax, maximumPeriodFactor);
 		return AmplitudeTier_getShimmer_apq3 (peaks.peek(), pmin, pmax, maximumAmplitudeFactor);
 	} catch (MelderError) {
-		if (Melder_hasError (L"Too few pulses between ")) {
+		if (Melder_hasError (U"Too few pulses between ")) {
 			Melder_clearError ();
 			return NUMundefined;
 		} else {
-			Melder_throw (me, " & ", thee, ": shimmer (apq3) not computed.");
+			Melder_throw (me, U" & ", thee, U": shimmer (apq3) not computed.");
 		}
 	}
 }
@@ -184,11 +184,11 @@ double PointProcess_Sound_getShimmer_apq5 (PointProcess me, Sound thee, double t
 		autoAmplitudeTier peaks = PointProcess_Sound_to_AmplitudeTier_period (me, thee, tmin, tmax, pmin, pmax, maximumPeriodFactor);
 		return AmplitudeTier_getShimmer_apq5 (peaks.peek(), pmin, pmax, maximumAmplitudeFactor);
 	} catch (MelderError) {
-		if (Melder_hasError (L"Too few pulses between ")) {
+		if (Melder_hasError (U"Too few pulses between ")) {
 			Melder_clearError ();
 			return NUMundefined;
 		} else {
-			Melder_throw (me, " & ", thee, ": shimmer (apq5) not computed.");
+			Melder_throw (me, U" & ", thee, U": shimmer (apq5) not computed.");
 		}
 	}
 }
@@ -201,11 +201,11 @@ double PointProcess_Sound_getShimmer_apq11 (PointProcess me, Sound thee, double
 		autoAmplitudeTier peaks = PointProcess_Sound_to_AmplitudeTier_period (me, thee, tmin, tmax, pmin, pmax, maximumPeriodFactor);
 		return AmplitudeTier_getShimmer_apq11 (peaks.peek(), pmin, pmax, maximumAmplitudeFactor);
 	} catch (MelderError) {
-		if (Melder_hasError (L"Too few pulses between ")) {
+		if (Melder_hasError (U"Too few pulses between ")) {
 			Melder_clearError ();
 			return NUMundefined;
 		} else {
-			Melder_throw (me, " & ", thee, ": shimmer (apq11) not computed.");
+			Melder_throw (me, U" & ", thee, U": shimmer (apq11) not computed.");
 		}
 	}
 }
@@ -219,11 +219,11 @@ double PointProcess_Sound_getShimmer_dda (PointProcess me, Sound thee, double tm
 		double apq3 = AmplitudeTier_getShimmer_apq3 (peaks.peek(), pmin, pmax, maximumAmplitudeFactor);
 		return NUMdefined (apq3) ? 3.0 * apq3 : NUMundefined;
 	} catch (MelderError) {
-		if (Melder_hasError (L"Too few pulses between ")) {
+		if (Melder_hasError (U"Too few pulses between ")) {
 			Melder_clearError ();
 			return NUMundefined;
 		} else {
-			Melder_throw (me, " & ", thee, ": shimmer (dda) not computed.");
+			Melder_throw (me, U" & ", thee, U": shimmer (dda) not computed.");
 		}
 	}
 }
@@ -242,7 +242,7 @@ void PointProcess_Sound_getShimmer_multi (PointProcess me, Sound thee, double tm
 		if (apq11)    *apq11    =       AmplitudeTier_getShimmer_apq11    (peaks.peek(), pmin, pmax, maximumAmplitudeFactor);
 		if (dda)      *dda      = 3.0 * AmplitudeTier_getShimmer_apq3     (peaks.peek(), pmin, pmax, maximumAmplitudeFactor);
 	} catch (MelderError) {
-		if (Melder_hasError (L"Too few pulses between ")) {
+		if (Melder_hasError (U"Too few pulses between ")) {
 			Melder_clearError ();
 			if (local)    *local    = NUMundefined;
 			if (local_dB) *local_dB = NUMundefined;
@@ -251,7 +251,7 @@ void PointProcess_Sound_getShimmer_multi (PointProcess me, Sound thee, double tm
 			if (apq11)    *apq11    = NUMundefined;
 			if (dda)      *dda      = NUMundefined;
 		} else {
-			Melder_throw (me, " & ", thee, ": shimmer measures not computed.");
+			Melder_throw (me, U" & ", thee, U": shimmer measures not computed.");
 		}
 	}
 }
@@ -264,26 +264,26 @@ void Sound_Pitch_PointProcess_voiceReport (Sound sound, Pitch pitch, PointProces
 		/*
 		 * Time domain. Should be preceded by something like "Time range of SELECTION:" or so.
 		 */
-		MelderInfo_write (L"   From ", Melder_fixed (tmin, 6), L" to ", Melder_fixed (tmax, 6), L" seconds");
-		MelderInfo_writeLine (L" (duration: ", Melder_fixed (tmax - tmin, 6), L" seconds)");
+		MelderInfo_write (U"   From ", Melder_fixed (tmin, 6), U" to ", Melder_fixed (tmax, 6), U" seconds");
+		MelderInfo_writeLine (U" (duration: ", Melder_fixed (tmax - tmin, 6), U" seconds)");
 		/*
 		 * Pitch statistics.
 		 */
-		MelderInfo_writeLine (L"Pitch:");
-		MelderInfo_writeLine (L"   Median pitch: ", Melder_fixed (Pitch_getQuantile (pitch, tmin, tmax, 0.50, kPitch_unit_HERTZ), 3), L" Hz");
-		MelderInfo_writeLine (L"   Mean pitch: ", Melder_fixed (Pitch_getMean (pitch, tmin, tmax, kPitch_unit_HERTZ), 3), L" Hz");
-		MelderInfo_writeLine (L"   Standard deviation: ", Melder_fixed (Pitch_getStandardDeviation (pitch, tmin, tmax, kPitch_unit_HERTZ), 3), L" Hz");
-		MelderInfo_writeLine (L"   Minimum pitch: ", Melder_fixed (Pitch_getMinimum (pitch, tmin, tmax, kPitch_unit_HERTZ, 1), 3), L" Hz");
-		MelderInfo_writeLine (L"   Maximum pitch: ", Melder_fixed (Pitch_getMaximum (pitch, tmin, tmax, kPitch_unit_HERTZ, 1), 3), L" Hz");
+		MelderInfo_writeLine (U"Pitch:");
+		MelderInfo_writeLine (U"   Median pitch: ", Melder_fixed (Pitch_getQuantile (pitch, tmin, tmax, 0.50, kPitch_unit_HERTZ), 3), U" Hz");
+		MelderInfo_writeLine (U"   Mean pitch: ", Melder_fixed (Pitch_getMean (pitch, tmin, tmax, kPitch_unit_HERTZ), 3), U" Hz");
+		MelderInfo_writeLine (U"   Standard deviation: ", Melder_fixed (Pitch_getStandardDeviation (pitch, tmin, tmax, kPitch_unit_HERTZ), 3), U" Hz");
+		MelderInfo_writeLine (U"   Minimum pitch: ", Melder_fixed (Pitch_getMinimum (pitch, tmin, tmax, kPitch_unit_HERTZ, 1), 3), U" Hz");
+		MelderInfo_writeLine (U"   Maximum pitch: ", Melder_fixed (Pitch_getMaximum (pitch, tmin, tmax, kPitch_unit_HERTZ, 1), 3), U" Hz");
 		/*
 		 * Pulses statistics.
 		 */
 		double pmin = 0.8 / ceiling, pmax = 1.25 / floor;
-		MelderInfo_writeLine (L"Pulses:");
-		MelderInfo_writeLine (L"   Number of pulses: ", Melder_integer (PointProcess_getWindowPoints (pulses, tmin, tmax, NULL, NULL)));
-		MelderInfo_writeLine (L"   Number of periods: ", Melder_integer (PointProcess_getNumberOfPeriods (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor)));
-		MelderInfo_writeLine (L"   Mean period: ", Melder_fixedExponent (PointProcess_getMeanPeriod (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), -3, 6), L" seconds");
-		MelderInfo_writeLine (L"   Standard deviation of period: ", Melder_fixedExponent (PointProcess_getStdevPeriod (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), -3, 6), L" seconds");
+		MelderInfo_writeLine (U"Pulses:");
+		MelderInfo_writeLine (U"   Number of pulses: ", PointProcess_getWindowPoints (pulses, tmin, tmax, NULL, NULL));
+		MelderInfo_writeLine (U"   Number of periods: ", PointProcess_getNumberOfPeriods (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor));
+		MelderInfo_writeLine (U"   Mean period: ", Melder_fixedExponent (PointProcess_getMeanPeriod (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), -3, 6), U" seconds");
+		MelderInfo_writeLine (U"   Standard deviation of period: ", Melder_fixedExponent (PointProcess_getStdevPeriod (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), -3, 6), U" seconds");
 		/*
 		 * Voicing.
 		 */
@@ -300,9 +300,9 @@ void Sound_Pitch_PointProcess_voiceReport (Sound sound, Pitch pitch, PointProces
 				}
 			}
 		}
-		MelderInfo_writeLine (L"Voicing:");
-		MelderInfo_write (L"   Fraction of locally unvoiced frames: ", Melder_percent (n <= 0 ? NUMundefined : (double) nunvoiced / n, 3));
-		MelderInfo_writeLine (L"   (", Melder_integer (nunvoiced), L" / ", Melder_integer (n), L")");
+		MelderInfo_writeLine (U"Voicing:");
+		MelderInfo_write (U"   Fraction of locally unvoiced frames: ", Melder_percent (n <= 0 ? NUMundefined : (double) nunvoiced / n, 3));
+		MelderInfo_writeLine (U"   (", nunvoiced, U" / ", n, U")");
 		n = PointProcess_getWindowPoints (pulses, tmin, tmax, & imin, & imax);
 		long numberOfVoiceBreaks = 0;
 		double durationOfVoiceBreaks = 0.0;
@@ -321,40 +321,40 @@ void Sound_Pitch_PointProcess_voiceReport (Sound sound, Pitch pitch, PointProces
 				}
 			}
 		}
-		MelderInfo_writeLine (L"   Number of voice breaks: ", Melder_integer (numberOfVoiceBreaks));
-		MelderInfo_write (L"   Degree of voice breaks: ", Melder_percent (durationOfVoiceBreaks / (tmax - tmin), 3));
-		MelderInfo_writeLine (L"   (", Melder_fixed (durationOfVoiceBreaks, 6), L" seconds / ", Melder_fixed (tmax - tmin, 6), L" seconds)");
+		MelderInfo_writeLine (U"   Number of voice breaks: ", numberOfVoiceBreaks);
+		MelderInfo_write (U"   Degree of voice breaks: ", Melder_percent (durationOfVoiceBreaks / (tmax - tmin), 3));
+		MelderInfo_writeLine (U"   (", Melder_fixed (durationOfVoiceBreaks, 6), U" seconds / ", Melder_fixed (tmax - tmin, 6), U" seconds)");
 		/*
 		 * Jitter.
 		 */
 		double shimmerLocal, shimmerLocal_dB, apq3, apq5, apq11, dda;
-		MelderInfo_writeLine (L"Jitter:");
-		MelderInfo_writeLine (L"   Jitter (local): ", Melder_percent (PointProcess_getJitter_local (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), 3));
-		MelderInfo_writeLine (L"   Jitter (local, absolute): ", Melder_fixedExponent (PointProcess_getJitter_local_absolute (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), -6, 3), L" seconds");
-		MelderInfo_writeLine (L"   Jitter (rap): ", Melder_percent (PointProcess_getJitter_rap (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), 3));
-		MelderInfo_writeLine (L"   Jitter (ppq5): ", Melder_percent (PointProcess_getJitter_ppq5 (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), 3));
-		MelderInfo_writeLine (L"   Jitter (ddp): ", Melder_percent (PointProcess_getJitter_ddp (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), 3));
+		MelderInfo_writeLine (U"Jitter:");
+		MelderInfo_writeLine (U"   Jitter (local): ", Melder_percent (PointProcess_getJitter_local (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), 3));
+		MelderInfo_writeLine (U"   Jitter (local, absolute): ", Melder_fixedExponent (PointProcess_getJitter_local_absolute (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), -6, 3), U" seconds");
+		MelderInfo_writeLine (U"   Jitter (rap): ", Melder_percent (PointProcess_getJitter_rap (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), 3));
+		MelderInfo_writeLine (U"   Jitter (ppq5): ", Melder_percent (PointProcess_getJitter_ppq5 (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), 3));
+		MelderInfo_writeLine (U"   Jitter (ddp): ", Melder_percent (PointProcess_getJitter_ddp (pulses, tmin, tmax, pmin, pmax, maximumPeriodFactor), 3));
 		/*
 		 * Shimmer.
 		 */
 		PointProcess_Sound_getShimmer_multi (pulses, sound, tmin, tmax, pmin, pmax, maximumPeriodFactor, maximumAmplitudeFactor,
 			& shimmerLocal, & shimmerLocal_dB, & apq3, & apq5, & apq11, & dda);
-		MelderInfo_writeLine (L"Shimmer:");
-		MelderInfo_writeLine (L"   Shimmer (local): ", Melder_percent (shimmerLocal, 3));
-		MelderInfo_writeLine (L"   Shimmer (local, dB): ", Melder_fixed (shimmerLocal_dB, 3), L" dB");
-		MelderInfo_writeLine (L"   Shimmer (apq3): ", Melder_percent (apq3, 3));
-		MelderInfo_writeLine (L"   Shimmer (apq5): ", Melder_percent (apq5, 3));
-		MelderInfo_writeLine (L"   Shimmer (apq11): ", Melder_percent (apq11, 3));
-		MelderInfo_writeLine (L"   Shimmer (dda): ", Melder_percent (dda, 3));
+		MelderInfo_writeLine (U"Shimmer:");
+		MelderInfo_writeLine (U"   Shimmer (local): ", Melder_percent (shimmerLocal, 3));
+		MelderInfo_writeLine (U"   Shimmer (local, dB): ", Melder_fixed (shimmerLocal_dB, 3), U" dB");
+		MelderInfo_writeLine (U"   Shimmer (apq3): ", Melder_percent (apq3, 3));
+		MelderInfo_writeLine (U"   Shimmer (apq5): ", Melder_percent (apq5, 3));
+		MelderInfo_writeLine (U"   Shimmer (apq11): ", Melder_percent (apq11, 3));
+		MelderInfo_writeLine (U"   Shimmer (dda): ", Melder_percent (dda, 3));
 		/*
 		 * Harmonicity.
 		 */
-		MelderInfo_writeLine (L"Harmonicity of the voiced parts only:");
-		MelderInfo_writeLine (L"   Mean autocorrelation: ", Melder_fixed (Pitch_getMeanStrength (pitch, tmin, tmax, Pitch_STRENGTH_UNIT_AUTOCORRELATION), 6));
-		MelderInfo_writeLine (L"   Mean noise-to-harmonics ratio: ", Melder_fixed (Pitch_getMeanStrength (pitch, tmin, tmax, Pitch_STRENGTH_UNIT_NOISE_HARMONICS_RATIO), 6));
-		MelderInfo_writeLine (L"   Mean harmonics-to-noise ratio: ", Melder_fixed (Pitch_getMeanStrength (pitch, tmin, tmax, Pitch_STRENGTH_UNIT_HARMONICS_NOISE_DB), 3), L" dB");
+		MelderInfo_writeLine (U"Harmonicity of the voiced parts only:");
+		MelderInfo_writeLine (U"   Mean autocorrelation: ", Melder_fixed (Pitch_getMeanStrength (pitch, tmin, tmax, Pitch_STRENGTH_UNIT_AUTOCORRELATION), 6));
+		MelderInfo_writeLine (U"   Mean noise-to-harmonics ratio: ", Melder_fixed (Pitch_getMeanStrength (pitch, tmin, tmax, Pitch_STRENGTH_UNIT_NOISE_HARMONICS_RATIO), 6));
+		MelderInfo_writeLine (U"   Mean harmonics-to-noise ratio: ", Melder_fixed (Pitch_getMeanStrength (pitch, tmin, tmax, Pitch_STRENGTH_UNIT_HARMONICS_NOISE_DB), 3), U" dB");
 	} catch (MelderError) {
-		Melder_throw (sound, " & ", pitch, " & ", pulses, ": voice report not computed.");
+		Melder_throw (sound, U" & ", pitch, U" & ", pulses, U": voice report not computed.");
 	}
 }
 
diff --git a/fon/WordList.cpp b/fon/WordList.cpp
index 5e5c39c..47e31df 100644
--- a/fon/WordList.cpp
+++ b/fon/WordList.cpp
@@ -1,6 +1,6 @@
 /* WordList.cpp
  *
- * Copyright (C) 1999-2012 Paul Boersma
+ * Copyright (C) 1999-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -37,31 +37,31 @@
 
 /* BUG: not Unicode-savvy */
 
-Thing_implement (WordList, Data, 0);
+Thing_implement (WordList, Daata, 0);
 
 static long WordList_count (WordList me) {
 	long n = 0;
-	for (wchar_t *p = my string; *p; p ++) {
+	for (char32 *p = my string; *p; p ++) {
 		if (*p == '\n') n += 1;
 	}
 	return n;
 }
 
 void structWordList :: v_info () {
-	structData :: v_info ();
+	structDaata :: v_info ();
 	long n = WordList_count (this);
-	if (! our length) our length = wcslen (our string);
-	MelderInfo_writeLine (L"Number of words: ", Melder_integer (n));
-	MelderInfo_writeLine (L"Number of characters: ", Melder_integer (length - n));
+	if (! our length) our length = str32len (our string);
+	MelderInfo_writeLine (U"Number of words: ", n);
+	MelderInfo_writeLine (U"Number of characters: ", length - n);
 }
 
-void structWordList :: v_readBinary (FILE *f) {
-	wchar_t *current, *p;
+void structWordList :: v_readBinary (FILE *f, int /*formatVersion*/) {
+	char32 *current, *p;
 	int kar = 0;
 	our length = bingeti4 (f);
 	if (our length < 0)
-		Melder_throw ("Wrong length ", our length, ".");
-	string = Melder_calloc (wchar_t, our length + 1);
+		Melder_throw (U"Wrong length ", our length, U".");
+	string = Melder_calloc (char32, our length + 1);
 	p = current = string;
 	if (our length > 0) {
 		/*
@@ -71,7 +71,7 @@ void structWordList :: v_readBinary (FILE *f) {
 			if (p - string >= length - 1) break;
 			kar = fgetc (f);
 			if (kar == EOF)
-				Melder_throw (L"Early end of file.");
+				Melder_throw (U"Early end of file.");
 			if (kar >= 128) break;
 			*p ++ = kar;
 		}
@@ -80,16 +80,16 @@ void structWordList :: v_readBinary (FILE *f) {
 		 * Read following words.
 		 */
 		for (;;) {
-			wchar_t *previous = current;
+			char32 *previous = current;
 			int numberOfSame = kar - 128;
 			current = p;
-			wcsncpy (current, previous, numberOfSame);
+			str32ncpy (current, previous, numberOfSame);
 			p += numberOfSame;
 			for (;;) {
 				if (p - string >= length - 1) break;
 				kar = fgetc (f);
 				if (kar == EOF)
-					Melder_throw (L"Early end of file.");
+					Melder_throw (U"Early end of file.");
 				if (kar >= 128) break;
 				*p ++ = kar;
 			}
@@ -99,36 +99,36 @@ void structWordList :: v_readBinary (FILE *f) {
 	}
 	*p = '\0';
 	if (p - string != length)
-		Melder_throw ("Length in header (", length, ") does not match lenth of string (", (long) (p - string), ").");
+		Melder_throw (U"Length in header (", length, U") does not match lenth of string (", (long) (p - string), U").");
 }
 
 void structWordList :: v_writeBinary (FILE *f) {
 	long currentLength, previousLength;
-	if (! length) length = wcslen (string);
+	if (! length) length = str32len (string);
 	binputi4 (length, f);
 	if (length > 0) {
-		wchar_t *current = string, *kar = current;
-		for (kar = current; *kar != '\n'; kar ++) { }
+		char32 *current = string, *kar = current;
+		for (kar = current; *kar != U'\n'; kar ++) { }
 		currentLength = kar - current;
 		for (long i = 0; i < currentLength; i ++)
-			fputc (current [i], f);   // TODO: check
+			fputc ((int) current [i], f);   // TODO: check
 		for (;;) {
-			wchar_t *previous = current, *kar1, *kar2;
+			char32 *previous = current, *kar1, *kar2;
 			int numberOfSame;
 			previousLength = currentLength;
 			current = previous + previousLength + 1;
-			if (*current == '\0') break;
+			if (*current == U'\0') break;
 			kar1 = previous, kar2 = current;
-			while (*kar2 != '\n' && *kar2 == *kar1) {
+			while (*kar2 != U'\n' && *kar2 == *kar1) {
 				kar1 ++, kar2 ++;
 			}
 			numberOfSame = kar2 - current;
 			if (numberOfSame > 127) numberOfSame = 127;   // clip
 			fputc (128 + numberOfSame, f);
-			while (*kar2 != '\n') kar2 ++;
+			while (*kar2 != U'\n') kar2 ++;
 			currentLength = kar2 - current;
 			for (long i = 0; i < currentLength - numberOfSame; i ++)
-				fputc (current [numberOfSame + i], f);   // TODO: check
+				fputc ((int) current [numberOfSame + i], f);   // TODO: check
 		}
 	}
 }
@@ -140,89 +140,89 @@ WordList Strings_to_WordList (Strings me) {
 		 * Check whether the strings are generic and sorted.
 		 */
 		for (long i = 1; i <= my numberOfStrings; i ++) {
-			wchar_t *string = my strings [i], *p;
+			char32 *string = my strings [i], *p;
 			for (p = & string [0]; *p; p ++) {
 				if (*p > 126)
-					Melder_throw ("String \"", string, "\" not generic.\nPlease convert to backslash trigraphs first.");
+					Melder_throw (U"String \"", string, U"\" not generic.\nPlease convert to backslash trigraphs first.");
 			}
-			if (i > 1 && wcscmp (my strings [i - 1], string) > 0) {
-				Melder_throw ("String \"", string, L"\" not sorted.\nPlease sort first.");
+			if (i > 1 && str32cmp (my strings [i - 1], string) > 0) {
+				Melder_throw (U"String \"", string, U"\" not sorted.\nPlease sort first.");
 			}
-			totalLength += wcslen (string);
+			totalLength += str32len (string);
 		}
 		autoWordList thee = Thing_new (WordList);
 		thy length = totalLength + my numberOfStrings;
-		thy string = Melder_calloc (wchar_t, thy length + 1);
+		thy string = Melder_calloc (char32, thy length + 1);
 		/*
 		 * Concatenate the strings into the word list.
 		 */
-		wchar_t *q = thy string;
+		char32 *q = thy string;
 		for (long i = 1; i <= my numberOfStrings; i ++) {
-			long length = wcslen (my strings [i]);
-			wcscpy (q, my strings [i]);
+			long length = str32len (my strings [i]);
+			str32cpy (q, my strings [i]);
 			q += length;
 			*q ++ = '\n';
 		}
-		*q = '\0';
+		*q = U'\0';
 		Melder_assert (q - thy string == thy length);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to WordList.");
+		Melder_throw (me, U": not converted to WordList.");
 	}
 }
 
 Strings WordList_to_Strings (WordList me) {
 	try {
-		unsigned char *word = (unsigned char *) my string;
+		unsigned char *word = (unsigned char *) my string;   // BUG: explain this
 		autoStrings thee = Thing_new (Strings);
 		thy numberOfStrings = WordList_count (me);
 		if (thy numberOfStrings > 0) {
-			thy strings = NUMvector <wchar_t *> (1, thy numberOfStrings);
+			thy strings = NUMvector <char32 *> (1, thy numberOfStrings);
 		}
 		for (long i = 1; i <= thy numberOfStrings; i ++) {
 			unsigned char *kar = word;
 			for (; *kar != '\n'; kar ++) { }
 			long length = kar - word;
-			thy strings [i] = Melder_calloc (wchar_t, length + 1);
-			wcsncpy (thy strings [i], Melder_peekUtf8ToWcs ((const char *) word), length);
-			thy strings [i] [length] = '\0';
+			thy strings [i] = Melder_calloc (char32, length + 1);
+			str32ncpy (thy strings [i], Melder_peek8to32 ((const char *) word), length);
+			thy strings [i] [length] = U'\0';
 			word += length + 1;
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Strings.");
+		Melder_throw (me, U": not converted to Strings.");
 	}
 }
 
 static long gotoStart (WordList me, long p) {
 	if (p <= 0) return 0;
 	-- p;
-	while (p >= 0 && my string [p] != '\n') p --;
+	while (p >= 0 && my string [p] != U'\n') p --;
 	return p + 1;
 }
 
 static long gotoNext (WordList me, long p) {
 	if (p >= my length - 1) return my length;
-	while (my string [p] != '\n') p ++;
+	while (my string [p] != U'\n') p ++;
 	return p + 1;
 }
 
 static long gotoPrevious (WordList me, long p) {
 	if (p <= 0) return -1;
-	if (my string [-- p] != '\n') return -1;   // should not occur
+	if (my string [-- p] != U'\n') return -1;   // should not occur
 	if (p <= 0) return 0;   // if first word is empty
 	-- p;   // step from newline
-	while (p >= 0 && my string [p] != '\n') p --;
+	while (p >= 0 && my string [p] != U'\n') p --;
 	return p + 1;
 }
 
-static int compare (const wchar_t *word, const wchar_t *p) {
+static int compare (const char32 *word, const char32 *p) {
 	for (;;) {
-		if (*word == '\0') {
-			if (*p == '\n') return 0;
+		if (*word == U'\0') {
+			if (*p == U'\n') return 0;
 			else return -1;   // word is substring of p
 		}
-		if (*p == '\n') return +1;   // p is substring of word
+		if (*p == U'\n') return +1;   // p is substring of word
 		if (*word < *p) return -1;
 		if (*word > *p) return +1;
 		word ++, p ++;
@@ -230,14 +230,14 @@ static int compare (const wchar_t *word, const wchar_t *p) {
 	return 0;   // should not occur
 }
 
-static wchar_t buffer [3333+1];
+static char32 buffer [3333+1];
 
-bool WordList_hasWord (WordList me, const wchar_t *word) {
+bool WordList_hasWord (WordList me, const char32 *word) {
 	long p, d;
 	int cf;
-	if (wcslen (word) > 3333) return false;
-	Longchar_genericizeW (word, buffer);
-	if (! my length) my length = wcslen (my string);
+	if (str32len (word) > 3333) return false;
+	Longchar_genericize32 (word, buffer);
+	if (! my length) my length = str32len (my string);
 	p = my length / 2, d = p / 2;
 	while (d > 20) {
 		p = gotoStart (me, p);
diff --git a/fon/WordList.h b/fon/WordList.h
index 5a6f8d9..e4fe4da 100644
--- a/fon/WordList.h
+++ b/fon/WordList.h
@@ -2,7 +2,7 @@
 #define _WordList_h_
 /* WordList.h
  *
- * Copyright (C) 1999-2011 Paul Boersma
+ * Copyright (C) 1999-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,12 +22,12 @@
 #include "Strings_.h"
 
 #include "WordList_def.h"
-oo_CLASS_CREATE (WordList, Data);
+oo_CLASS_CREATE (WordList, Daata);
 
 WordList Strings_to_WordList (Strings me);
 Strings WordList_to_Strings (WordList me);
 
-bool WordList_hasWord (WordList me, const wchar_t *word);
+bool WordList_hasWord (WordList me, const char32 *word);
 
 /* End of file WordList.h */
 #endif
diff --git a/fon/WordList_def.h b/fon/WordList_def.h
index bb1ca52..db3ed8b 100644
--- a/fon/WordList_def.h
+++ b/fon/WordList_def.h
@@ -19,7 +19,7 @@
 
 
 #define ooSTRUCT WordList
-oo_DEFINE_CLASS (WordList, Data)
+oo_DEFINE_CLASS (WordList, Daata)
 
 	#if !oo_DESCRIBING
 		oo_LSTRING (string)
@@ -27,8 +27,9 @@ oo_DEFINE_CLASS (WordList, Data)
 
 	#if oo_DECLARING
 		oo_LONG (length)
-		// overridden methods:
-			virtual void v_info ();
+
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (WordList)
diff --git a/fon/manual_Exp.cpp b/fon/manual_Exp.cpp
index f4fdeea..1b7402f 100644
--- a/fon/manual_Exp.cpp
+++ b/fon/manual_Exp.cpp
@@ -1,6 +1,6 @@
 /* manual_Exp.c
  *
- * Copyright (C) 2001-2011,2013 Paul Boersma
+ * Copyright (C) 2001-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,147 +22,147 @@
 void manual_Exp_init (ManPages me);
 void manual_Exp_init (ManPages me) {
 
-MAN_BEGIN (L"ExperimentMFC", L"ppgb", 20130101)
-INTRO (L"One of the @@types of objects@ in Praat, "
+MAN_BEGIN (U"ExperimentMFC", U"ppgb", 20130101)
+INTRO (U"One of the @@types of objects@ in Praat, "
 	"for running a Multiple Forced Choice listening experiment.")
-LIST_ITEM (L"@@ExperimentMFC 1. When to use Praat")
-LIST_ITEM (L"@@ExperimentMFC 2. The first example")
-LIST_ITEM (L"@@ExperimentMFC 2.1. The experiment file")
-LIST_ITEM (L"@@ExperimentMFC 2.2. The stimuli")
-LIST_ITEM (L"@@ExperimentMFC 2.3. The carrier phrase")
-LIST_ITEM (L"@@ExperimentMFC 2.4. Breaks")
-LIST_ITEM (L"@@ExperimentMFC 2.5. Randomization strategies")
-LIST_ITEM (L"@@ExperimentMFC 2.6. Instructions")
-LIST_ITEM (L"@@ExperimentMFC 2.7. Response categories")
-LIST_ITEM (L"@@ExperimentMFC 2.8. Goodness judgments")
-LIST_ITEM (L"@@ExperimentMFC 2.9. How an experiment proceeds")
-LIST_ITEM (L"@@ExperimentMFC 3. More examples")
-LIST_ITEM (L"@@ExperimentMFC 3.1. A simple discrimination experiment")
-LIST_ITEM (L"@@ExperimentMFC 3.2. An AXB discrimination experiment")
-LIST_ITEM (L"@@ExperimentMFC 3.3. A 4I-oddity experiment")
-LIST_ITEM (L"@@ExperimentMFC 3.4. Variable inter-stimulus intervals")
-LIST_ITEM (L"@@ExperimentMFC 4. Special buttons")
-LIST_ITEM (L"@@ExperimentMFC 4.1. The replay button")
-LIST_ITEM (L"@@ExperimentMFC 4.2. The OK button")
-LIST_ITEM (L"@@ExperimentMFC 4.3. The oops button")
-LIST_ITEM (L"@@ExperimentMFC 5. Stimulus-dependent texts")
-LIST_ITEM (L"@@ExperimentMFC 5.1. The stimulus-dependent run text")
-LIST_ITEM (L"@@ExperimentMFC 5.2. Stimulus-dependent response buttons")
-LIST_ITEM (L"@@ExperimentMFC 6. Responses are sounds")
-LIST_ITEM (L"@@ExperimentMFC 7. Blanking the screen")
-LIST_ITEM (L"@@ExperimentMFC 8. Running multiple experiments")
+LIST_ITEM (U"@@ExperimentMFC 1. When to use Praat")
+LIST_ITEM (U"@@ExperimentMFC 2. The first example")
+LIST_ITEM (U"@@ExperimentMFC 2.1. The experiment file")
+LIST_ITEM (U"@@ExperimentMFC 2.2. The stimuli")
+LIST_ITEM (U"@@ExperimentMFC 2.3. The carrier phrase")
+LIST_ITEM (U"@@ExperimentMFC 2.4. Breaks")
+LIST_ITEM (U"@@ExperimentMFC 2.5. Randomization strategies")
+LIST_ITEM (U"@@ExperimentMFC 2.6. Instructions")
+LIST_ITEM (U"@@ExperimentMFC 2.7. Response categories")
+LIST_ITEM (U"@@ExperimentMFC 2.8. Goodness judgments")
+LIST_ITEM (U"@@ExperimentMFC 2.9. How an experiment proceeds")
+LIST_ITEM (U"@@ExperimentMFC 3. More examples")
+LIST_ITEM (U"@@ExperimentMFC 3.1. A simple discrimination experiment")
+LIST_ITEM (U"@@ExperimentMFC 3.2. An AXB discrimination experiment")
+LIST_ITEM (U"@@ExperimentMFC 3.3. A 4I-oddity experiment")
+LIST_ITEM (U"@@ExperimentMFC 3.4. Variable inter-stimulus intervals")
+LIST_ITEM (U"@@ExperimentMFC 4. Special buttons")
+LIST_ITEM (U"@@ExperimentMFC 4.1. The replay button")
+LIST_ITEM (U"@@ExperimentMFC 4.2. The OK button")
+LIST_ITEM (U"@@ExperimentMFC 4.3. The oops button")
+LIST_ITEM (U"@@ExperimentMFC 5. Stimulus-dependent texts")
+LIST_ITEM (U"@@ExperimentMFC 5.1. The stimulus-dependent run text")
+LIST_ITEM (U"@@ExperimentMFC 5.2. Stimulus-dependent response buttons")
+LIST_ITEM (U"@@ExperimentMFC 6. Responses are sounds")
+LIST_ITEM (U"@@ExperimentMFC 7. Blanking the screen")
+LIST_ITEM (U"@@ExperimentMFC 8. Running multiple experiments")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 1. When to use Praat", L"ppgb", 20130101)
-NORMAL (L"With Praat's ExperimentMFC, you can do simple experiments on identification and discrimination. "
+MAN_BEGIN (U"ExperimentMFC 1. When to use Praat", U"ppgb", 20130101)
+NORMAL (U"With Praat's ExperimentMFC, you can do simple experiments on identification and discrimination. "
 	"`Simple' means that for identification, the subject hears a sound and has to click on one of a set of "
 	"labelled rectangles (optionally, you can have the subject give a goodness-of-fit judgment). "
 	"For discrimination, you can have simple same-different choices, or more intricate things like AXB, 4I-oddity, and so on.")
-NORMAL (L"The advantage of using Praat's ExperimentMFC for this is that it is free, it works on Windows, Unix, and Macintosh, "
+NORMAL (U"The advantage of using Praat's ExperimentMFC for this is that it is free, it works on Windows, Unix, and Macintosh, "
 	"and the whole experiment (experiment file plus sound files) is portable across computers "
 	"(you can run it from a USB stick, for instance). Because of the limited possibilities, "
 	"it is also quite easy to set up the experiment. Just read the description below.")
-NORMAL (L"If you require more from your experiment design, you can use Praat's @@Demo window@; "
+NORMAL (U"If you require more from your experiment design, you can use Praat's @@Demo window@; "
 	"with that less simple method you could for instance let the stimulus depend on the subject's previous responses. "
 	"Alternatively, you could use a dedicated program like Presentation or E-prime instead of Praat; "
 	"with these programs, you can also measure reaction times more accurately.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 2. The first example", L"ppgb", 20051205)
-INTRO (L"The following pages give an example of an experiment definition, "
+MAN_BEGIN (U"ExperimentMFC 2. The first example", U"ppgb", 20051205)
+INTRO (U"The following pages give an example of an experiment definition, "
 	"and explain the main features of an identification task.")
-LIST_ITEM (L"@@ExperimentMFC 2.1. The experiment file")
-LIST_ITEM (L"@@ExperimentMFC 2.2. The stimuli")
-LIST_ITEM (L"@@ExperimentMFC 2.3. The carrier phrase")
-LIST_ITEM (L"@@ExperimentMFC 2.4. Breaks")
-LIST_ITEM (L"@@ExperimentMFC 2.5. Randomization strategies")
-LIST_ITEM (L"@@ExperimentMFC 2.6. Instructions")
-LIST_ITEM (L"@@ExperimentMFC 2.7. Response categories")
-LIST_ITEM (L"@@ExperimentMFC 2.8. Goodness judgments")
-LIST_ITEM (L"@@ExperimentMFC 2.9. How an experiment proceeds")
+LIST_ITEM (U"@@ExperimentMFC 2.1. The experiment file")
+LIST_ITEM (U"@@ExperimentMFC 2.2. The stimuli")
+LIST_ITEM (U"@@ExperimentMFC 2.3. The carrier phrase")
+LIST_ITEM (U"@@ExperimentMFC 2.4. Breaks")
+LIST_ITEM (U"@@ExperimentMFC 2.5. Randomization strategies")
+LIST_ITEM (U"@@ExperimentMFC 2.6. Instructions")
+LIST_ITEM (U"@@ExperimentMFC 2.7. Response categories")
+LIST_ITEM (U"@@ExperimentMFC 2.8. Goodness judgments")
+LIST_ITEM (U"@@ExperimentMFC 2.9. How an experiment proceeds")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 2.1. The experiment file", L"ppgb", 20130101)
-INTRO (L"An experiment is defined in a simple text file, which we call an %%experiment file%. "
+MAN_BEGIN (U"ExperimentMFC 2.1. The experiment file", U"ppgb", 20130101)
+INTRO (U"An experiment is defined in a simple text file, which we call an %%experiment file%. "
 	"The following is an example of such an experiment file. The first two lines have to be typed "
 	"exactly as in this example, the rest depends on your stimuli, on your response categories, "
 	"and on the way the experiment is to be presented to the listener. "
 	"The order of the elements in this file cannot be changed, and nothing can be skipped.")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"ExperimentMFC 6\"")
-CODE (L"blankWhilePlaying? <no>")
-CODE (L"stimuliAreSounds? <yes>")
-CODE (L"stimulusFileNameHead = \"Sounds/\"")
-CODE (L"stimulusFileNameTail = \".wav\"")
-CODE (L"stimulusCarrierBefore = \"weSayTheWord\"")
-CODE (L"stimulusCarrierAfter = \"again\"")
-CODE (L"stimulusInitialSilenceDuration = 0.5 seconds")
-CODE (L"stimulusMedialSilenceDuration = 0")
-CODE (L"stimulusFinalSilenceDuration = 0.5 seconds")
-CODE (L"numberOfDifferentStimuli = 4")
-CODE1 (L"\"heed\"  \"\"")
-CODE1 (L"\"hid\"   \"\"")
-CODE1 (L"\"hood\"  \"\"")
-CODE1 (L"\"hud\"   \"\"")
-CODE (L"numberOfReplicationsPerStimulus = 3")
-CODE (L"breakAfterEvery = 0")
-CODE (L"randomize = <PermuteBalancedNoDoublets>")
-CODE (L"startText = \"This is a listening experiment.")
-CODE (L"After hearing a sound, choose the vowel that is most similar to what you heard.")
-CODE (L"")
-CODE (L"Click to start.\"")
-CODE (L"runText = \"Choose the vowel that you heard.\"")
-CODE (L"pauseText = \"You can have a short break if you like. Click to proceed.\"")
-CODE (L"endText = \"The experiment has finished.\"")
-CODE (L"maximumNumberOfReplays = 0")
-CODE (L"replayButton = 0 0 0 0 \"\" \"\"")
-CODE (L"okButton = 0 0 0 0 \"\" \"\"")
-CODE (L"oopsButton = 0 0 0 0 \"\" \"\"")
-CODE (L"responsesAreSounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
-CODE (L"numberOfDifferentResponses = 5")
-CODE1 (L"0.2 0.3 0.7 0.8 \"h I d\" 40 \"\" \"i\"")
-CODE1 (L"0.3 0.4 0.5 0.6 \"h E d\" 40 \"\" \"e\"")
-CODE1 (L"0.4 0.5 0.3 0.4 \"h A d\" 40 \"\" \"a\"")
-CODE1 (L"0.5 0.6 0.5 0.6 \"h O d\" 40 \"\" \"o\"")
-CODE1 (L"0.6 0.7 0.7 0.8 \"h U d\" 40 \"\" \"u\"")
-CODE (L"numberOfGoodnessCategories = 5")
-CODE1 (L"0.25 0.35 0.10 0.20 \"1 (poor)\"")
-CODE1 (L"0.35 0.45 0.10 0.20 \"2\"")
-CODE1 (L"0.45 0.55 0.10 0.20 \"3\"")
-CODE1 (L"0.55 0.65 0.10 0.20 \"4\"")
-CODE1 (L"0.65 0.75 0.10 0.20 \"5 (good)\"")
-NORMAL (L"This experiment will play 4 different stimuli to the listener, each 3 times. "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"ExperimentMFC 6\"")
+CODE (U"blankWhilePlaying? <no>")
+CODE (U"stimuliAreSounds? <yes>")
+CODE (U"stimulusFileNameHead = \"Sounds/\"")
+CODE (U"stimulusFileNameTail = \".wav\"")
+CODE (U"stimulusCarrierBefore = \"weSayTheWord\"")
+CODE (U"stimulusCarrierAfter = \"again\"")
+CODE (U"stimulusInitialSilenceDuration = 0.5 seconds")
+CODE (U"stimulusMedialSilenceDuration = 0")
+CODE (U"stimulusFinalSilenceDuration = 0.5 seconds")
+CODE (U"numberOfDifferentStimuli = 4")
+CODE1 (U"\"heed\"  \"\"")
+CODE1 (U"\"hid\"   \"\"")
+CODE1 (U"\"hood\"  \"\"")
+CODE1 (U"\"hud\"   \"\"")
+CODE (U"numberOfReplicationsPerStimulus = 3")
+CODE (U"breakAfterEvery = 0")
+CODE (U"randomize = <PermuteBalancedNoDoublets>")
+CODE (U"startText = \"This is a listening experiment.")
+CODE (U"After hearing a sound, choose the vowel that is most similar to what you heard.")
+CODE (U"")
+CODE (U"Click to start.\"")
+CODE (U"runText = \"Choose the vowel that you heard.\"")
+CODE (U"pauseText = \"You can have a short break if you like. Click to proceed.\"")
+CODE (U"endText = \"The experiment has finished.\"")
+CODE (U"maximumNumberOfReplays = 0")
+CODE (U"replayButton = 0 0 0 0 \"\" \"\"")
+CODE (U"okButton = 0 0 0 0 \"\" \"\"")
+CODE (U"oopsButton = 0 0 0 0 \"\" \"\"")
+CODE (U"responsesAreSounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
+CODE (U"numberOfDifferentResponses = 5")
+CODE1 (U"0.2 0.3 0.7 0.8 \"h I d\" 40 \"\" \"i\"")
+CODE1 (U"0.3 0.4 0.5 0.6 \"h E d\" 40 \"\" \"e\"")
+CODE1 (U"0.4 0.5 0.3 0.4 \"h A d\" 40 \"\" \"a\"")
+CODE1 (U"0.5 0.6 0.5 0.6 \"h O d\" 40 \"\" \"o\"")
+CODE1 (U"0.6 0.7 0.7 0.8 \"h U d\" 40 \"\" \"u\"")
+CODE (U"numberOfGoodnessCategories = 5")
+CODE1 (U"0.25 0.35 0.10 0.20 \"1 (poor)\"")
+CODE1 (U"0.35 0.45 0.10 0.20 \"2\"")
+CODE1 (U"0.45 0.55 0.10 0.20 \"3\"")
+CODE1 (U"0.55 0.65 0.10 0.20 \"4\"")
+CODE1 (U"0.65 0.75 0.10 0.20 \"5 (good)\"")
+NORMAL (U"This experiment will play 4 different stimuli to the listener, each 3 times. "
 	"Thus, the listener is confronted with 12 trials.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 2.2. The stimuli", L"ppgb", 20130101)
-INTRO (L"You can see that the @@ExperimentMFC 2.1. The experiment file|example experiment@ "
+MAN_BEGIN (U"ExperimentMFC 2.2. The stimuli", U"ppgb", 20130101)
+INTRO (U"You can see that the @@ExperimentMFC 2.1. The experiment file|example experiment@ "
 	"contains four different stimuli: %heed, %hid, %hood, and %hud. "
 	"These are the %names of the four stimuli.")
-NORMAL (L"Because in the example experiment stimuli are sounds, "
+NORMAL (U"Because in the example experiment stimuli are sounds, "
 	"each of the four stimuli should be in a sound file. "
 	"The names of these sound files must be identical to the names "
 	"of the stimuli, bracketed with %stimulusFileNamehead and %stimulusFileNameTail. "
 	"Hence, the stimuli are expected in the following four files:")
-LIST_ITEM (L"Sounds/heed.wav")
-LIST_ITEM (L"Sounds/hid.wav")
-LIST_ITEM (L"Sounds/hood.wav")
-LIST_ITEM (L"Sounds/hud.wav")
-NORMAL (L"You need not use WAV files. You can also use AIFF files, "
+LIST_ITEM (U"Sounds/heed.wav")
+LIST_ITEM (U"Sounds/hid.wav")
+LIST_ITEM (U"Sounds/hood.wav")
+LIST_ITEM (U"Sounds/hud.wav")
+NORMAL (U"You need not use WAV files. You can also use AIFF files, "
 	"in which case %stimulusFileNameTail would probably be \".aiff\", or any other "
 	"type of sound file that Praat supports. But all sound files must have the same number of channels "
 	"(i.e. all mono or all stereo) and the same sampling frequency.")
-NORMAL (L"In this example, the experiment will look for the sound files in the directory #Sounds, "
+NORMAL (U"In this example, the experiment will look for the sound files in the directory #Sounds, "
 	"which has to be in the same directory as your experiment file. "
 	"In other words, \"Sounds/heed.wav\" is a %%relative file path%.")
-NORMAL (L"Instead of a relative path, you can also supply a %%full file path%. "
+NORMAL (U"Instead of a relative path, you can also supply a %%full file path%. "
 	"Such a path depends on your computer and on your operating system. "
 	"For instance, if you have a Windows computer and the stimuli are in the directory ##D:\\bsCorpus\\bsAutumn\\bsSpeaker23#, "
 	"you can write")
-CODE (L"fileNameHead = \"D:\\bsCorpus\\bsAutumn\\bsSpeaker23\\bs\"")
-NORMAL (L"If you have a Macintosh (OS X) or Unix computer and the stimuli are in ##/Users/mietta/Sounds/Dutch#, you write")
-CODE (L"fileNameHead = \"/Users/mietta/Sounds/Dutch/\"")
-NORMAL (L"But relative file paths will usually be preferred: they are more %portable. "
+CODE (U"fileNameHead = \"D:\\bsCorpus\\bsAutumn\\bsSpeaker23\\bs\"")
+NORMAL (U"If you have a Macintosh (OS X) or Unix computer and the stimuli are in ##/Users/mietta/Sounds/Dutch#, you write")
+CODE (U"fileNameHead = \"/Users/mietta/Sounds/Dutch/\"")
+NORMAL (U"But relative file paths will usually be preferred: they are more %portable. "
 	"The advantage of using relative file paths is that you can move your whole experiment (experiment file plus sounds) "
 	"from one computer to another without changing the experiment file, "
 	"as long as you put the experiment file in the same directory as where you put the directory #Sounds. "
@@ -172,106 +172,106 @@ NORMAL (L"But relative file paths will usually be preferred: they are more %port
 	"independent of the type of computer where you have created your experiment.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 2.3. The carrier phrase", L"ppgb", 20051205)
-NORMAL (L"The stimuli can be embedded in a %%carrier phrase%. "
+MAN_BEGIN (U"ExperimentMFC 2.3. The carrier phrase", U"ppgb", 20051205)
+NORMAL (U"The stimuli can be embedded in a %%carrier phrase%. "
 	"In the @@ExperimentMFC 2.1. The experiment file|example experiment@, we see that the stimulus "
 	"will be inserted between the sounds in the files ##weSayTheWord.wav# "
 	"and ##again.wav#, both of which are expected to be in the directory #Sounds. "
 	"If you do not want a carrier phrase, you do")
-CODE (L"stimulusCarrierBefore = \"\"")
-CODE (L"stimulusCarrierAfter = \"\"")
-NORMAL (L"If you want only an introductory phrase before the stimulus, and nothing after the stimulus, "
+CODE (U"stimulusCarrierBefore = \"\"")
+CODE (U"stimulusCarrierAfter = \"\"")
+NORMAL (U"If you want only an introductory phrase before the stimulus, and nothing after the stimulus, "
 	"you do something like")
-CODE (L"stimulusCarrierBefore = \"listenTo\"")
-CODE (L"stimulusCarrierAfter = \"\"")
-NORMAL (L"and of course you supply the file ##listenTo.wav# in the directory #Sounds.")
-NORMAL (L"If you want to have a short silence before every stimulus (and before the carrier phrase), "
+CODE (U"stimulusCarrierBefore = \"listenTo\"")
+CODE (U"stimulusCarrierAfter = \"\"")
+NORMAL (U"and of course you supply the file ##listenTo.wav# in the directory #Sounds.")
+NORMAL (U"If you want to have a short silence before every stimulus (and before the carrier phrase), "
 	"you supply a non-zero %stimulusInitialSilenceDuration, as in the example.")
-NORMAL (L"Since the carrier phrase is concatenated with the stimulus before it is played, it should have the same "
+NORMAL (U"Since the carrier phrase is concatenated with the stimulus before it is played, it should have the same "
 	"sampling frequency as the stimulus files.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 2.4. Breaks", L"ppgb", 20051205)
-NORMAL (L"A new stimulus will arrive as soon as the listener makes her choice. To allow her some breathing "
+MAN_BEGIN (U"ExperimentMFC 2.4. Breaks", U"ppgb", 20051205)
+NORMAL (U"A new stimulus will arrive as soon as the listener makes her choice. To allow her some breathing "
 	"time, you can insert a break after every so many trials. In the example, %breakAfterEvery is 0, "
 	"because there are only 12 trials. A typical experiment has perhaps 180 trials, and you may want to "
 	"insert a break after every 40 trials. In that case, you do")
-CODE (L"breakAfterEvery = 40")
+CODE (U"breakAfterEvery = 40")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 2.5. Randomization strategies", L"ppgb", 20051205)
-NORMAL (L"The 3 times 4 stimuli will have to be played in a certain order. For the least random order, you say")
-CODE (L"randomize = <CyclicNonRandom>")
-NORMAL (L"In this case, the stimuli will be played in the order in which they were specified in the file, 3 times:")
-FORMULA (L"heed hid hood hud heed hid hood hud heed hid hood hud")
-NORMAL (L"The most likely case in which you would want to use this randomization strategy, is if you have, say, 120 "
+MAN_BEGIN (U"ExperimentMFC 2.5. Randomization strategies", U"ppgb", 20051205)
+NORMAL (U"The 3 times 4 stimuli will have to be played in a certain order. For the least random order, you say")
+CODE (U"randomize = <CyclicNonRandom>")
+NORMAL (U"In this case, the stimuli will be played in the order in which they were specified in the file, 3 times:")
+FORMULA (U"heed hid hood hud heed hid hood hud heed hid hood hud")
+NORMAL (U"The most likely case in which you would want to use this randomization strategy, is if you have, say, 120 "
 	"different stimuli and you want to play them only once (%numberOfReplicationsPerStimulus = 1) in a fixed order.")
-NORMAL (L"The other extreme, the most random order, is")
-CODE (L"randomize = <WithReplacement>")
-NORMAL (L"In this case, a stimulus will be chosen at random 12 times without memory, for instance")
-FORMULA (L"hid hood hood heed hid hood hud hud hid hood heed hid")
-NORMAL (L"The order will probably be different for each listener. "
+NORMAL (U"The other extreme, the most random order, is")
+CODE (U"randomize = <WithReplacement>")
+NORMAL (U"In this case, a stimulus will be chosen at random 12 times without memory, for instance")
+FORMULA (U"hid hood hood heed hid hood hud hud hid hood heed hid")
+NORMAL (U"The order will probably be different for each listener. "
 	"In this example, %hood and %hid occur four times each, %heed and %hud only twice each. "
 	"This strategy is too random for most experiments. Usually, you will want to have the same number "
 	"of replications of each stimulus. The most random way to do this is")
-CODE (L"randomize = <PermuteAll>")
-NORMAL (L"In this case, all stimuli will be played exactly 3 times, for instance")
-FORMULA (L"heed hood hud hud hid heed heed hud hood hid hid hood")
-NORMAL (L"Quite often, you will want a less random order, namely one in which the 12 trials are divided into "
+CODE (U"randomize = <PermuteAll>")
+NORMAL (U"In this case, all stimuli will be played exactly 3 times, for instance")
+FORMULA (U"heed hood hud hud hid heed heed hud hood hid hid hood")
+NORMAL (U"Quite often, you will want a less random order, namely one in which the 12 trials are divided into "
 	"3 blocks of 4 stimuli. Within each block, all 4 different stimuli occur in a random order:")
-CODE (L"randomize = <PermuteBalanced>")
-NORMAL (L"In this case, each stimulus occurs exactly once within each block:")
-FORMULA (L"heed hood hud hid hood hud hid heed heed hud hood hid")
-NORMAL (L"This strategy ensures a certain spreading of the stimuli over the sequence of 12 trials. "
+CODE (U"randomize = <PermuteBalanced>")
+NORMAL (U"In this case, each stimulus occurs exactly once within each block:")
+FORMULA (U"heed hood hud hid hood hud hid heed heed hud hood hid")
+NORMAL (U"This strategy ensures a certain spreading of the stimuli over the sequence of 12 trials. "
 	"As we see here, it is still possible that the same stimulus (%heed) occurs twice in a row, "
 	"namely as the last stimulus of the second block and the first stimulus of the third. "
 	"If you want to prevent that situation, you use")
-CODE (L"randomize = <PermuteBalancedNoDoublets>")
-NORMAL (L"This will ensure that the same stimulus is never applied twice in a row:")
-FORMULA (L"heed hood hud hid hood hud hid heed hud heed hood hid")
-NORMAL (L"This randomization strategy is used in our example, and advised for most listening experiments "
+CODE (U"randomize = <PermuteBalancedNoDoublets>")
+NORMAL (U"This will ensure that the same stimulus is never applied twice in a row:")
+FORMULA (U"heed hood hud hid hood hud hid heed hud heed hood hid")
+NORMAL (U"This randomization strategy is used in our example, and advised for most listening experiments "
 	"in which you want to minimize effects of stimulus order.")
-NORMAL (L"The randomization procedure does not interfere in any way with the breaks. The order is determined "
+NORMAL (U"The randomization procedure does not interfere in any way with the breaks. The order is determined "
 	"before any breaks are inserted.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 2.6. Instructions", L"ppgb", 20081123)
-NORMAL (L"Before the experiment begins, the listener will see the %startText in the centre of the screen. "
+MAN_BEGIN (U"ExperimentMFC 2.6. Instructions", U"ppgb", 20081123)
+NORMAL (U"Before the experiment begins, the listener will see the %startText in the centre of the screen. "
 	"During each trial, she will see the %runText at the top of the screen. "
 	"During breaks, she will see the %pauseText in the centre of the screen. "
 	"After all the trials have been performed, she will see the %endText. "
 	"As you can see in the example, all these texts can consist of multiple lines.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 2.7. Response categories", L"ppgb", 20110911)
-NORMAL (L"Every trial comes with the same set of response categories. "
+MAN_BEGIN (U"ExperimentMFC 2.7. Response categories", U"ppgb", 20110911)
+NORMAL (U"Every trial comes with the same set of response categories. "
 	"The @@ExperimentMFC 2.1. The experiment file|example experiment@ has five of them. "
 	"For each response category, you supply the area of the screen where a rectangle will be drawn. "
 	"The whole screen measures from 0.0 (left) to 1.0 (right) and from 0.0 (bottom) to 1.0 (top). "
 	"Thus, \"0.2 0.3 0.7 0.8\" means that a rectangle will be drawn somewhere in the top left quadrant "
 	"of the screen. You also supply the text that will be drawn in this rectangle, for instance the text \"h I d\". "
 	"After this you supply the font size for this text, for instance 40.")
-NORMAL (L"The second text that you supply for every response is a response key on the keyboard. "
+NORMAL (U"The second text that you supply for every response is a response key on the keyboard. "
 	"In the above example this is \"\", i.e. the subject cannot press a key as a response. "
 	"If you want the user to be able to press the \"m\" key instead of clicking in the \"h I d\" rectangle, "
 	"the line in the experiment file would be:")
-CODE1 (L"0.2 0.3 0.7 0.8 \"h I d\" 40 \"m\" \"i\"")
-NORMAL (L"The third text that you supply for each rectangle is the response category as it will be reported by Praat to you when the user clicks it, "
+CODE1 (U"0.2 0.3 0.7 0.8 \"h I d\" 40 \"m\" \"i\"")
+NORMAL (U"The third text that you supply for each rectangle is the response category as it will be reported by Praat to you when the user clicks it, "
 	"e.g. the text \"i\". If you want Praat to ignore mouse clicks on this rectangle, specify an empty response "
 	"category, i.e. \"\".")
-NORMAL (L"The border of the rectangles will be maroon, the background of the screen will be light grey. "
+NORMAL (U"The border of the rectangles will be maroon, the background of the screen will be light grey. "
 	"The colour of clickable rectangles will be yellow, that of non-clickable rectangles (those with "
 	"empty category specifications) light grey.")
-NORMAL (L"You can have a picture instead of a text on a response button, by using \\bsFI:")
-CODE1 (L"0.2 0.3 0.7 0.8 \"\\bsFIpictures/hello.jpg\" 40 \"m\" \"i\"")
-NORMAL (L"In this example, the picture ##hello.jpg# from the subdirectory #pictures "
+NORMAL (U"You can have a picture instead of a text on a response button, by using \\bsFI:")
+CODE1 (U"0.2 0.3 0.7 0.8 \"\\bsFIpictures/hello.jpg\" 40 \"m\" \"i\"")
+NORMAL (U"In this example, the picture ##hello.jpg# from the subdirectory #pictures "
 	"(i.e. a subdirectory of the directory where your experiment file is) "
 	"will be drawn into the rectangle [0.2, 0.3] \\xx [0.7, 0.8]. "
 	"This currently (September 2011) works only on the Mac and Windows.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 2.8. Goodness judgments", L"ppgb", 20051205)
-NORMAL (L"If %numberOfGoodnessCategories is not 0, some more rectangles will be drawn, "
+MAN_BEGIN (U"ExperimentMFC 2.8. Goodness judgments", U"ppgb", 20051205)
+NORMAL (U"If %numberOfGoodnessCategories is not 0, some more rectangles will be drawn, "
 	"as in the @@ExperimentMFC 2.1. The experiment file|example experiment at . "
 	"You specify again the locations of these rectangles (in the example, they touch each other), "
 	"and the texts on them. Praat will record the number of the button when the listener clicks on it. "
@@ -280,8 +280,8 @@ NORMAL (L"If %numberOfGoodnessCategories is not 0, some more rectangles will be
 	"goodness judgment of 5.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 2.9. How an experiment proceeds", L"ppgb", 20110317)
-NORMAL (L"A text file with an ExperimentMFC object can be read into Praat with @@Read from file...@ "
+MAN_BEGIN (U"ExperimentMFC 2.9. How an experiment proceeds", U"ppgb", 20110317)
+NORMAL (U"A text file with an ExperimentMFC object can be read into Praat with @@Read from file...@ "
 	"(it is not a script but a data file, so do not try to read it with ##Open Praat script...#). "
 	"You can then choose #Run. After the experiment finishes, you can close the experiment window "
 	"and choose ##Extract results#. The resulting ResultsMFC object contains for each trial the stimulus "
@@ -298,21 +298,21 @@ NORMAL (L"A text file with an ExperimentMFC object can be read into Praat with @
 	"as a table file (with ##Save as tab-separated file...#), which can be read by programs like Excel and SPSS.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 3. More examples", L"ppgb", 20051205)
-INTRO (L"You can do many more kinds of experiments than simple identification experiments.")
-LIST_ITEM (L"@@ExperimentMFC 3.1. A simple discrimination experiment")
-LIST_ITEM (L"@@ExperimentMFC 3.2. An AXB discrimination experiment")
-LIST_ITEM (L"@@ExperimentMFC 3.3. A 4I-oddity experiment")
-LIST_ITEM (L"@@ExperimentMFC 3.4. Variable inter-stimulus intervals")
+MAN_BEGIN (U"ExperimentMFC 3. More examples", U"ppgb", 20051205)
+INTRO (U"You can do many more kinds of experiments than simple identification experiments.")
+LIST_ITEM (U"@@ExperimentMFC 3.1. A simple discrimination experiment")
+LIST_ITEM (U"@@ExperimentMFC 3.2. An AXB discrimination experiment")
+LIST_ITEM (U"@@ExperimentMFC 3.3. A 4I-oddity experiment")
+LIST_ITEM (U"@@ExperimentMFC 3.4. Variable inter-stimulus intervals")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 3.1. A simple discrimination experiment", L"ppgb", 20130416)
-NORMAL (L"The @@ExperimentMFC 2.1. The experiment file|example experiment@ was an %identification experiment: "
+MAN_BEGIN (U"ExperimentMFC 3.1. A simple discrimination experiment", U"ppgb", 20130416)
+NORMAL (U"The @@ExperimentMFC 2.1. The experiment file|example experiment@ was an %identification experiment: "
 	"the subject had identify a single sound as one element of a set of categories. "
 	"Phoneticians will often do %discrimination experiments, which are experiments in which "
 	"a stimulus consists of multiple sub-stimuli played in sequence, and the subject has to judge the similarity "
 	"between these sub-stimuli.")
-NORMAL (L"The simplest discrimination task has only two sub-stimuli, and the subject has to say whether these are "
+NORMAL (U"The simplest discrimination task has only two sub-stimuli, and the subject has to say whether these are "
 	"the %same or %different. Suppose you have vowel-like sounds along an F1 continuum with seven steps, "
 	"say 300, 320, 340, 360, 380, 400, and 420 hertz, and you are interested in knowing how well the listeners "
 	"can distinguish these. As your stimuli, you create pairs of these sounds, separated by 0.8 seconds of silence. "
@@ -320,482 +320,482 @@ NORMAL (L"The simplest discrimination task has only two sub-stimuli, and the sub
 	"of 340 Hz (see the literature on signal detection theory). Since sounds that are very different acoustically "
 	"will always be heard as different, you do not include pairs in which the distance is larger than 60 Hz. "
 	"The experiment file will look like this:")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"ExperimentMFC 6\"")
-CODE (L"blank while playing? <no>")
-CODE (L"stimuli are sounds? <yes>")
-CODE (L"\"stimuli/\"  \".wav\"")
-CODE (L"carrier phrase \"\"  \"\"")
-CODE (L"initial silence duration 0.5 seconds")
-CODE (L"medial silence duration 0.8 seconds  ! inter-stimulus interval")
-CODE (L"final silence duration 0 seconds")
-CODE (L"37 different stimuli")
-CODE1 (L"\"300,300\"  \"\"  \"300,320\"  \"\"  \"300,340\"  \"\"  \"300,360\"  \"\"")
-CODE1 (L"\"320,300\"  \"\"  \"320,320\"  \"\"  \"320,340\"  \"\"  \"320,360\"  \"\"  \"320,380\"  \"\"")
-CODE1 (L"\"340,300\"  \"\"  \"340,320\"  \"\"  \"340,340\"  \"\"  \"340,360\"  \"\"  \"340,380\"  \"\"  \"340,400\"  \"\"")
-CODE1 (L"\"360,300\"  \"\"  \"360,320\"  \"\"  \"360,340\"  \"\"  \"360,360\"  \"\"  \"360,380\"  \"\"  \"360,400\"  \"\"  \"360,420\"  \"\"")
-CODE1 (L"\"380,320\"  \"\"  \"380,340\"  \"\"  \"380,360\"  \"\"  \"380,380\"  \"\"  \"380,400\"  \"\"  \"380,420\"  \"\"")
-CODE1 (L"\"400,340\"  \"\"  \"400,360\"  \"\"  \"400,380\"  \"\"  \"400,400\"  \"\"  \"400,420\"  \"\"")
-CODE1 (L"\"420,360\"  \"\"  \"420,380\"  \"\"  \"420,400\"  \"\"  \"420,420\"  \"\"")
-CODE (L"10 replications per stimulus")
-CODE (L"break after every 50 stimuli")
-CODE (L"<PermuteBalancedNoDoublets>")
-CODE (L"\"Click to start.\"")
-CODE (L"\"Say whether these sounds were the same or different.\"")
-CODE (L"\"You can have a short break if you like. Click to proceed.\"")
-CODE (L"\"The experiment has finished. Call the experimenter.\"")
-CODE (L"0 replays")
-CODE (L"replay button 0 0 0 0 \"\" \"\"")
-CODE (L"ok button 0 0 0 0 \"\" \"\"")
-CODE (L"oops button 0 0 0 0 \"\" \"\"")
-CODE (L"responses are sounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
-CODE (L"2 response categories")
-CODE1 (L"0.1 0.4 0.35 0.65 \"same\" 24 \"\" \"same\"")
-CODE1 (L"0.6 0.9 0.35 0.65 \"different\" 24 \"\" \"different\"")
-CODE (L"0 goodness categories")
-NORMAL (L"In this example, the subject will have to click 370 times. After every 50 times, she will have the "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"ExperimentMFC 6\"")
+CODE (U"blank while playing? <no>")
+CODE (U"stimuli are sounds? <yes>")
+CODE (U"\"stimuli/\"  \".wav\"")
+CODE (U"carrier phrase \"\"  \"\"")
+CODE (U"initial silence duration 0.5 seconds")
+CODE (U"medial silence duration 0.8 seconds  ! inter-stimulus interval")
+CODE (U"final silence duration 0 seconds")
+CODE (U"37 different stimuli")
+CODE1 (U"\"300,300\"  \"\"  \"300,320\"  \"\"  \"300,340\"  \"\"  \"300,360\"  \"\"")
+CODE1 (U"\"320,300\"  \"\"  \"320,320\"  \"\"  \"320,340\"  \"\"  \"320,360\"  \"\"  \"320,380\"  \"\"")
+CODE1 (U"\"340,300\"  \"\"  \"340,320\"  \"\"  \"340,340\"  \"\"  \"340,360\"  \"\"  \"340,380\"  \"\"  \"340,400\"  \"\"")
+CODE1 (U"\"360,300\"  \"\"  \"360,320\"  \"\"  \"360,340\"  \"\"  \"360,360\"  \"\"  \"360,380\"  \"\"  \"360,400\"  \"\"  \"360,420\"  \"\"")
+CODE1 (U"\"380,320\"  \"\"  \"380,340\"  \"\"  \"380,360\"  \"\"  \"380,380\"  \"\"  \"380,400\"  \"\"  \"380,420\"  \"\"")
+CODE1 (U"\"400,340\"  \"\"  \"400,360\"  \"\"  \"400,380\"  \"\"  \"400,400\"  \"\"  \"400,420\"  \"\"")
+CODE1 (U"\"420,360\"  \"\"  \"420,380\"  \"\"  \"420,400\"  \"\"  \"420,420\"  \"\"")
+CODE (U"10 replications per stimulus")
+CODE (U"break after every 50 stimuli")
+CODE (U"<PermuteBalancedNoDoublets>")
+CODE (U"\"Click to start.\"")
+CODE (U"\"Say whether these sounds were the same or different.\"")
+CODE (U"\"You can have a short break if you like. Click to proceed.\"")
+CODE (U"\"The experiment has finished. Call the experimenter.\"")
+CODE (U"0 replays")
+CODE (U"replay button 0 0 0 0 \"\" \"\"")
+CODE (U"ok button 0 0 0 0 \"\" \"\"")
+CODE (U"oops button 0 0 0 0 \"\" \"\"")
+CODE (U"responses are sounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
+CODE (U"2 response categories")
+CODE1 (U"0.1 0.4 0.35 0.65 \"same\" 24 \"\" \"same\"")
+CODE1 (U"0.6 0.9 0.35 0.65 \"different\" 24 \"\" \"different\"")
+CODE (U"0 goodness categories")
+NORMAL (U"In this example, the subject will have to click 370 times. After every 50 times, she will have the "
 	"opportunity to sip her tea. A 0.5-seconds silence is played before every stimulus, so that the listener "
 	"will not hear the stimulus immediately after her mouse click.")
-NORMAL (L"The experimenter does not have to create the stimulus pairs as sound files. "
+NORMAL (U"The experimenter does not have to create the stimulus pairs as sound files. "
 	"You can specify multiple sound files by separating them with commas. Thus, \"320,300\" means that "
 	"Praat will play the files ##320.wav# and ##300.wav#. These two substimuli will be separated here by a silence "
 	"of 0.8 seconds, called the %%inter-stimulus interval% (or %stimulusMedialSilenceDuration).")
-NORMAL (L"Note that the text in this file is rather different from the previous example. "
+NORMAL (U"Note that the text in this file is rather different from the previous example. "
 	"It does not matter whether you write \"numberOfDifferentStimuli\", or \"different stimuli\", or anything else; "
 	"Praat ignores these texts as long as they do not contain numbers, quoted strings, or things between <>.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 3.2. An AXB discrimination experiment", L"ppgb", 20130101)
-INTRO (L"In the AXB task, the subject will hear three stimuli in sequence, and has to say "
+MAN_BEGIN (U"ExperimentMFC 3.2. An AXB discrimination experiment", U"ppgb", 20130101)
+INTRO (U"In the AXB task, the subject will hear three stimuli in sequence, and has to say "
 	"whether the second (X) is more similar to the first (A) or to the second (B). "
 	"An experiment file could look like follows:")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"ExperimentMFC 6\"")
-CODE (L"blankWhilePlaying? <no>")
-CODE (L"stimuliAreSounds? <yes>")
-CODE (L"\"stimuli/\"  \".wav\"")
-CODE (L"carrier \"\"  \"\"")
-CODE (L"initial silence 0.5")
-CODE (L"inter-stimulus interval 0.3")
-CODE (L"final silence 0")
-CODE (L"100 stimuli")
-CODE1 (L"\"300,300,320\"  \"\"  \"300,320,340\"  \"\"  \"300,340,340\"  \"\"  \"300,340,360\"  \"\"")
-CODE1 (L"...")
-CODE1 (L"(and 96 more triplets of substimuli)")
-CODE1 (L"...")
-CODE (L"4 replications")
-CODE (L"break every 50")
-CODE (L"<PermuteBalancedNoDoublets>")
-CODE (L"\"Click to start.\"")
-CODE (L"\"Say whether the second sound is more similar to the first or to the third.\"")
-CODE (L"\"You can have a short break if you like. Click to proceed.\"")
-CODE (L"\"The experiment has finished.\"")
-CODE (L"0 replays")
-CODE (L"replay button 0 0 0 0 \"\" \"\"")
-CODE (L"ok button 0 0 0 0 \"\" \"\"")
-CODE (L"oops button 0 0 0 0 \"\" \"\"")
-CODE (L"responses are sounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
-CODE (L"3 response categories")
-CODE1 (L"0.1 0.3 0.4 0.6 \"first\" 30 \"\" \"A\"")
-CODE1 (L"0.4 0.6 0.4 0.6 \"second\" 30 \"\" \"\"")
-CODE1 (L"0.7 0.9 0.4 0.6 \"third\" 30 \"\" \"B\"")
-CODE (L"0 goodness categories")
-NORMAL (L"In this example, the subject has to click 400 times. She sees three buttons, "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"ExperimentMFC 6\"")
+CODE (U"blankWhilePlaying? <no>")
+CODE (U"stimuliAreSounds? <yes>")
+CODE (U"\"stimuli/\"  \".wav\"")
+CODE (U"carrier \"\"  \"\"")
+CODE (U"initial silence 0.5")
+CODE (U"inter-stimulus interval 0.3")
+CODE (U"final silence 0")
+CODE (U"100 stimuli")
+CODE1 (U"\"300,300,320\"  \"\"  \"300,320,340\"  \"\"  \"300,340,340\"  \"\"  \"300,340,360\"  \"\"")
+CODE1 (U"...")
+CODE1 (U"(and 96 more triplets of substimuli)")
+CODE1 (U"...")
+CODE (U"4 replications")
+CODE (U"break every 50")
+CODE (U"<PermuteBalancedNoDoublets>")
+CODE (U"\"Click to start.\"")
+CODE (U"\"Say whether the second sound is more similar to the first or to the third.\"")
+CODE (U"\"You can have a short break if you like. Click to proceed.\"")
+CODE (U"\"The experiment has finished.\"")
+CODE (U"0 replays")
+CODE (U"replay button 0 0 0 0 \"\" \"\"")
+CODE (U"ok button 0 0 0 0 \"\" \"\"")
+CODE (U"oops button 0 0 0 0 \"\" \"\"")
+CODE (U"responses are sounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
+CODE (U"3 response categories")
+CODE1 (U"0.1 0.3 0.4 0.6 \"first\" 30 \"\" \"A\"")
+CODE1 (U"0.4 0.6 0.4 0.6 \"second\" 30 \"\" \"\"")
+CODE1 (U"0.7 0.9 0.4 0.6 \"third\" 30 \"\" \"B\"")
+CODE (U"0 goodness categories")
+NORMAL (U"In this example, the subject has to click 400 times. She sees three buttons, "
 	"labelled %first, %second, and %third, but the second button (the one with the empty response category) "
 	"is not clickable: it has a light grey rather than a yellow interior and cannot be chosen by the subject. "
 	"In your ResultsMFC object, you will only see %A and %B responses.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 3.3. A 4I-oddity experiment", L"ppgb", 20130101)
-NORMAL (L"In the four-items-oddity task, the subject will hear four stimuli in sequence, and has to say "
+MAN_BEGIN (U"ExperimentMFC 3.3. A 4I-oddity experiment", U"ppgb", 20130101)
+NORMAL (U"In the four-items-oddity task, the subject will hear four stimuli in sequence, and has to say "
 	"whether the second or the third is the odd one out. The other three substimuli are identical. "
 	"An experiment file could look as follows:")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"ExperimentMFC 6\"")
-CODE (L"blankWhilePlaying? <no>")
-CODE (L"stimuliAreSounds? <yes>")
-CODE (L"stimulusFileNameHead = \"stimuli/\"")
-CODE (L"stimulusFileNameTail = \".wav\"")
-CODE (L"stimulusCarrierBefore = \"\"")
-CODE (L"stimulusCarrierAfter = \"\"")
-CODE (L"stimulusInitialSilenceDuration = 0.5 seconds")
-CODE (L"stimulusMedialSilenceDuration = 0.3 seconds")
-CODE (L"numberOfDifferentStimuli = 60")
-CODE1 (L"\"300,300,320,300\"  \"\"  \"300,320,300,300\"  \"\"")
-CODE1 (L"\"300,300,340,300\"  \"\"  \"300,340,300,300\"  \"\"")
-CODE1 (L"\"300,300,360,300\"  \"\"  \"300,360,300,300\"  \"\"")
-CODE1 (L"\"320,320,300,320\"  \"\"  \"320,300,320,320\"  \"\"")
-CODE1 (L"\"320,320,340,320\"  \"\"  \"320,340,320,320\"  \"\"")
-CODE1 (L"\"320,320,360,320\"  \"\"  \"320,360,320,320\"  \"\"")
-CODE1 (L"\"320,320,380,320\"  \"\"  \"320,380,320,320\"  \"\"")
-CODE1 (L"\"340,340,300,340\"  \"\"  \"340,300,340,340\"  \"\"")
-CODE1 (L"\"340,340,320,340\"  \"\"  \"340,320,340,340\"  \"\"")
-CODE1 (L"\"340,340,360,340\"  \"\"  \"340,360,340,340\"  \"\"")
-CODE1 (L"\"340,340,380,340\"  \"\"  \"340,380,340,340\"  \"\"")
-CODE1 (L"\"340,340,400,340\"  \"\"  \"340,400,340,340\"  \"\"")
-CODE1 (L"\"360,360,300,360\"  \"\"  \"360,300,360,360\"  \"\"")
-CODE1 (L"\"360,360,320,360\"  \"\"  \"360,320,360,360\"  \"\"")
-CODE1 (L"\"360,360,340,360\"  \"\"  \"360,340,360,360\"  \"\"")
-CODE1 (L"\"360,360,380,360\"  \"\"  \"360,380,360,360\"  \"\"")
-CODE1 (L"\"360,360,400,360\"  \"\"  \"360,400,360,360\"  \"\"")
-CODE1 (L"\"360,360,420,360\"  \"\"  \"360,420,360,360\"  \"\"")
-CODE1 (L"\"380,380,320,380\"  \"\"  \"380,320,380,380\"  \"\"")
-CODE1 (L"\"380,380,340,380\"  \"\"  \"380,340,380,380\"  \"\"")
-CODE1 (L"\"380,380,360,380\"  \"\"  \"380,360,380,380\"  \"\"")
-CODE1 (L"\"380,380,400,380\"  \"\"  \"380,400,380,380\"  \"\"")
-CODE1 (L"\"380,380,420,380\"  \"\"  \"380,420,380,380\"  \"\"")
-CODE1 (L"\"400,400,340,400\"  \"\"  \"400,340,400,400\"  \"\"")
-CODE1 (L"\"400,400,360,400\"  \"\"  \"400,360,400,400\"  \"\"")
-CODE1 (L"\"400,400,380,400\"  \"\"  \"400,380,400,400\"  \"\"")
-CODE1 (L"\"400,400,420,400\"  \"\"  \"400,420,400,400\"  \"\"")
-CODE1 (L"\"420,420,360,420\"  \"\"  \"420,360,420,420\"  \"\"")
-CODE1 (L"\"420,420,380,420\"  \"\"  \"420,380,420,420\"  \"\"")
-CODE1 (L"\"420,420,400,420\"  \"\"  \"420,400,420,420\"  \"\"")
-CODE (L"numberOfReplicationsPerStimulus = 5")
-CODE (L"breakAfterEvery = 40")
-CODE (L"randomize = <PermuteBalancedNoDoublets>")
-CODE (L"startText = \"Click to start.\"")
-CODE (L"runText = \"Say whether the second or the third sound is different from the rest.\"")
-CODE (L"pauseText = \"You can have a short break if you like. Click to proceed.\"")
-CODE (L"endText = \"The experiment has finished.\"")
-CODE (L"maximumNumberOfReplays = 0")
-CODE (L"replayButton = 0 0 0 0 \"\" \"\"")
-CODE (L"okButton = 0 0 0 0 \"\" \"\"")
-CODE (L"oopsButton = 0 0 0 0 \"\" \"\"")
-CODE (L"responsesAreSounds? <no>")
-CODE (L"responseFileNameHead = \"\"")
-CODE (L"responseFileNameTail = \"\"")
-CODE (L"responseCarrierBefore = \"\"")
-CODE (L"responseCarrierAfter = \"\"")
-CODE (L"responseInitialSilenceDuration = 0")
-CODE (L"responseMedialSilenceDuration = 0")
-CODE (L"responseFinalSilenceDuration = 0")
-CODE (L"numberOfResponseCategories = 4")
-CODE1 (L"0.04 0.24 0.4 0.6 \"first\" 30 \"\" \"\"")
-CODE1 (L"0.28 0.48 0.4 0.6 \"second\" 30 \"\" \"2\"")
-CODE1 (L"0.52 0.72 0.4 0.6 \"third\" 30 \"\" \"3\"")
-CODE1 (L"0.76 0.96 0.4 0.6 \"fourth\" 30 \"\" \"\"")
-CODE (L"numberOfGoodnessCategories = 0")
-NORMAL (L"In this example, the subject has to click 300 times. She sees four buttons, "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"ExperimentMFC 6\"")
+CODE (U"blankWhilePlaying? <no>")
+CODE (U"stimuliAreSounds? <yes>")
+CODE (U"stimulusFileNameHead = \"stimuli/\"")
+CODE (U"stimulusFileNameTail = \".wav\"")
+CODE (U"stimulusCarrierBefore = \"\"")
+CODE (U"stimulusCarrierAfter = \"\"")
+CODE (U"stimulusInitialSilenceDuration = 0.5 seconds")
+CODE (U"stimulusMedialSilenceDuration = 0.3 seconds")
+CODE (U"numberOfDifferentStimuli = 60")
+CODE1 (U"\"300,300,320,300\"  \"\"  \"300,320,300,300\"  \"\"")
+CODE1 (U"\"300,300,340,300\"  \"\"  \"300,340,300,300\"  \"\"")
+CODE1 (U"\"300,300,360,300\"  \"\"  \"300,360,300,300\"  \"\"")
+CODE1 (U"\"320,320,300,320\"  \"\"  \"320,300,320,320\"  \"\"")
+CODE1 (U"\"320,320,340,320\"  \"\"  \"320,340,320,320\"  \"\"")
+CODE1 (U"\"320,320,360,320\"  \"\"  \"320,360,320,320\"  \"\"")
+CODE1 (U"\"320,320,380,320\"  \"\"  \"320,380,320,320\"  \"\"")
+CODE1 (U"\"340,340,300,340\"  \"\"  \"340,300,340,340\"  \"\"")
+CODE1 (U"\"340,340,320,340\"  \"\"  \"340,320,340,340\"  \"\"")
+CODE1 (U"\"340,340,360,340\"  \"\"  \"340,360,340,340\"  \"\"")
+CODE1 (U"\"340,340,380,340\"  \"\"  \"340,380,340,340\"  \"\"")
+CODE1 (U"\"340,340,400,340\"  \"\"  \"340,400,340,340\"  \"\"")
+CODE1 (U"\"360,360,300,360\"  \"\"  \"360,300,360,360\"  \"\"")
+CODE1 (U"\"360,360,320,360\"  \"\"  \"360,320,360,360\"  \"\"")
+CODE1 (U"\"360,360,340,360\"  \"\"  \"360,340,360,360\"  \"\"")
+CODE1 (U"\"360,360,380,360\"  \"\"  \"360,380,360,360\"  \"\"")
+CODE1 (U"\"360,360,400,360\"  \"\"  \"360,400,360,360\"  \"\"")
+CODE1 (U"\"360,360,420,360\"  \"\"  \"360,420,360,360\"  \"\"")
+CODE1 (U"\"380,380,320,380\"  \"\"  \"380,320,380,380\"  \"\"")
+CODE1 (U"\"380,380,340,380\"  \"\"  \"380,340,380,380\"  \"\"")
+CODE1 (U"\"380,380,360,380\"  \"\"  \"380,360,380,380\"  \"\"")
+CODE1 (U"\"380,380,400,380\"  \"\"  \"380,400,380,380\"  \"\"")
+CODE1 (U"\"380,380,420,380\"  \"\"  \"380,420,380,380\"  \"\"")
+CODE1 (U"\"400,400,340,400\"  \"\"  \"400,340,400,400\"  \"\"")
+CODE1 (U"\"400,400,360,400\"  \"\"  \"400,360,400,400\"  \"\"")
+CODE1 (U"\"400,400,380,400\"  \"\"  \"400,380,400,400\"  \"\"")
+CODE1 (U"\"400,400,420,400\"  \"\"  \"400,420,400,400\"  \"\"")
+CODE1 (U"\"420,420,360,420\"  \"\"  \"420,360,420,420\"  \"\"")
+CODE1 (U"\"420,420,380,420\"  \"\"  \"420,380,420,420\"  \"\"")
+CODE1 (U"\"420,420,400,420\"  \"\"  \"420,400,420,420\"  \"\"")
+CODE (U"numberOfReplicationsPerStimulus = 5")
+CODE (U"breakAfterEvery = 40")
+CODE (U"randomize = <PermuteBalancedNoDoublets>")
+CODE (U"startText = \"Click to start.\"")
+CODE (U"runText = \"Say whether the second or the third sound is different from the rest.\"")
+CODE (U"pauseText = \"You can have a short break if you like. Click to proceed.\"")
+CODE (U"endText = \"The experiment has finished.\"")
+CODE (U"maximumNumberOfReplays = 0")
+CODE (U"replayButton = 0 0 0 0 \"\" \"\"")
+CODE (U"okButton = 0 0 0 0 \"\" \"\"")
+CODE (U"oopsButton = 0 0 0 0 \"\" \"\"")
+CODE (U"responsesAreSounds? <no>")
+CODE (U"responseFileNameHead = \"\"")
+CODE (U"responseFileNameTail = \"\"")
+CODE (U"responseCarrierBefore = \"\"")
+CODE (U"responseCarrierAfter = \"\"")
+CODE (U"responseInitialSilenceDuration = 0")
+CODE (U"responseMedialSilenceDuration = 0")
+CODE (U"responseFinalSilenceDuration = 0")
+CODE (U"numberOfResponseCategories = 4")
+CODE1 (U"0.04 0.24 0.4 0.6 \"first\" 30 \"\" \"\"")
+CODE1 (U"0.28 0.48 0.4 0.6 \"second\" 30 \"\" \"2\"")
+CODE1 (U"0.52 0.72 0.4 0.6 \"third\" 30 \"\" \"3\"")
+CODE1 (U"0.76 0.96 0.4 0.6 \"fourth\" 30 \"\" \"\"")
+CODE (U"numberOfGoodnessCategories = 0")
+NORMAL (U"In this example, the subject has to click 300 times. She sees four buttons, "
 	"but the first and fourth buttons cannot be chosen. "
 	"In your ResultsMFC object, you will only see the responses %2 and %3.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 3.4. Variable inter-stimulus intervals", L"ppgb", 20130101)
-NORMAL (L"Praat only supports a fixed inter-stimulus interval, but sometimes you may want to test "
+MAN_BEGIN (U"ExperimentMFC 3.4. Variable inter-stimulus intervals", U"ppgb", 20130101)
+NORMAL (U"Praat only supports a fixed inter-stimulus interval, but sometimes you may want to test "
 	"discrimination as a function of the inter-stimulus interval itself. You can achieve this by "
 	"supplying an %stimulusMedialSilenceDuration of 0 and using sound files with various silences:")
-CODE1 (L"\"300,silence0.5,320\"  \"300,silence1.5,320\"  \"300,silence4.5,320\"")
-NORMAL (L"In this example, you have to supply the sound files ##silence0.5.wav# and so on. You can "
+CODE1 (U"\"300,silence0.5,320\"  \"300,silence1.5,320\"  \"300,silence4.5,320\"")
+NORMAL (U"In this example, you have to supply the sound files ##silence0.5.wav# and so on. You can "
 	"create them with the help of @@Create Sound from formula...@ (supply a %formula of 0).")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 4. Special buttons", L"ppgb", 20051205)
-INTRO (L"You can include up to three special buttons on the screen that the participant sees. "
+MAN_BEGIN (U"ExperimentMFC 4. Special buttons", U"ppgb", 20051205)
+INTRO (U"You can include up to three special buttons on the screen that the participant sees. "
 	"It is probably inadvisable to use all three at the same time.")
-LIST_ITEM (L"@@ExperimentMFC 4.1. The replay button")
-LIST_ITEM (L"@@ExperimentMFC 4.2. The OK button")
-LIST_ITEM (L"@@ExperimentMFC 4.3. The oops button")
+LIST_ITEM (U"@@ExperimentMFC 4.1. The replay button")
+LIST_ITEM (U"@@ExperimentMFC 4.2. The OK button")
+LIST_ITEM (U"@@ExperimentMFC 4.3. The oops button")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 4.1. The replay button", L"ppgb", 20051205)
-INTRO (L"The @@ExperimentMFC 2.1. The experiment file|example experiment@ contained the following lines:")
-CODE (L"maximumNumberOfReplays = 0")
-CODE (L"replayButton = 0 0 0 0 \"\" \"\"")
-NORMAL (L"This means that that experiment did not have a replay button. "
+MAN_BEGIN (U"ExperimentMFC 4.1. The replay button", U"ppgb", 20051205)
+INTRO (U"The @@ExperimentMFC 2.1. The experiment file|example experiment@ contained the following lines:")
+CODE (U"maximumNumberOfReplays = 0")
+CODE (U"replayButton = 0 0 0 0 \"\" \"\"")
+NORMAL (U"This means that that experiment did not have a replay button. "
 	"To add a replay button along the lower edge of the screen, you do something like")
-CODE (L"maximumNumberOfReplays = 1000")
-CODE (L"replayButton = 0.3 0.7 0.01 0.07 \"Click here to play the last sound again\" \"\"")
-NORMAL (L"If you supply a right edge (here 0.7) that is greater than the left edge (here 0.3), "
+CODE (U"maximumNumberOfReplays = 1000")
+CODE (U"replayButton = 0.3 0.7 0.01 0.07 \"Click here to play the last sound again\" \"\"")
+NORMAL (U"If you supply a right edge (here 0.7) that is greater than the left edge (here 0.3), "
 	"Praat will know that you want to show a replay button.")
-NORMAL (L"When the participant clicks this button, Praat will play the current stimulus again. "
+NORMAL (U"When the participant clicks this button, Praat will play the current stimulus again. "
 	"In this example, the button will be visible until the partipant has clicked it 1000 times.")
-NORMAL (L"To assign a keyboard shortcut to the replay button, do something like")
-CODE (L"maximumNumberOfReplays = 1000")
-CODE (L"replayButton = 0.1 0.9 0.01 0.07 \"Click here or press the space bar to play the last sound again\" \" \"")
+NORMAL (U"To assign a keyboard shortcut to the replay button, do something like")
+CODE (U"maximumNumberOfReplays = 1000")
+CODE (U"replayButton = 0.1 0.9 0.01 0.07 \"Click here or press the space bar to play the last sound again\" \" \"")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 4.2. The OK button", L"ppgb", 20051205)
-INTRO (L"The @@ExperimentMFC 2.1. The experiment file|example experiment@ contained the following lines:")
-CODE (L"okButton = 0 0 0 0 \"\" \"\"")
-NORMAL (L"This means that that experiment did not have an OK button. "
+MAN_BEGIN (U"ExperimentMFC 4.2. The OK button", U"ppgb", 20051205)
+INTRO (U"The @@ExperimentMFC 2.1. The experiment file|example experiment@ contained the following lines:")
+CODE (U"okButton = 0 0 0 0 \"\" \"\"")
+NORMAL (U"This means that that experiment did not have an OK button. "
 	"To add an OK button in the lower right corner of the screen, you do something likw")
-CODE (L"okButton = 0.8 0.95 0.05 0.15 \"OK\" \"\"")
-NORMAL (L"If you supply a right edge (here 0.95) that is greater than the left edge (here 0.8), "
+CODE (U"okButton = 0.8 0.95 0.05 0.15 \"OK\" \"\"")
+NORMAL (U"If you supply a right edge (here 0.95) that is greater than the left edge (here 0.8), "
 	"Praat will know that you want to show an OK button.")
-NORMAL (L"The behaviour of the experiment changes appreciably if you include an OK button. "
+NORMAL (U"The behaviour of the experiment changes appreciably if you include an OK button. "
 	"If you do not include an OK button, Praat will present the next stimulus as soon as the participant "
 	"has clicked a response category (and a goodness category, if there are such). "
 	"If you do include an OK button, it will become visible to the participant as soon as she has chosen "
 	"a response category (and a goodness category, if there are such). "
 	"The participant can then click the OK button, but she can also choose to click the response "
 	"(and goodness buttons) a bit more first.")
-NORMAL (L"The OK button seems to be useful only if there is also a replay button, "
+NORMAL (U"The OK button seems to be useful only if there is also a replay button, "
 	"or if the response categories are sounds (see @@ExperimentMFC 6. Responses are sounds@).")
-NORMAL (L"To assign a keyboard shortcut (here, the space bar) to the OK button, do something like")
-CODE (L"okButton = 0.8 0.95 0.05 0.15 \"OK\" \" \"")
+NORMAL (U"To assign a keyboard shortcut (here, the space bar) to the OK button, do something like")
+CODE (U"okButton = 0.8 0.95 0.05 0.15 \"OK\" \" \"")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 4.3. The oops button", L"ppgb", 20051205)
-INTRO (L"The @@ExperimentMFC 2.1. The experiment file|example experiment@ contained the following lines:")
-CODE (L"oopsButton = 0 0 0 0 \"\" \"\"")
-NORMAL (L"This means that that experiment did not have an oops button. "
+MAN_BEGIN (U"ExperimentMFC 4.3. The oops button", U"ppgb", 20051205)
+INTRO (U"The @@ExperimentMFC 2.1. The experiment file|example experiment@ contained the following lines:")
+CODE (U"oopsButton = 0 0 0 0 \"\" \"\"")
+NORMAL (U"This means that that experiment did not have an oops button. "
 	"To add an oops button in the lower left corner of the screen, you do something likw")
-CODE (L"oopsButton = 0.05 0.2 0.05 0.15 \"oops\" \"\"")
-NORMAL (L"If you supply a right edge (here 0.2) that is greater than the left edge (here 0.05), "
+CODE (U"oopsButton = 0.05 0.2 0.05 0.15 \"oops\" \"\"")
+NORMAL (U"If you supply a right edge (here 0.2) that is greater than the left edge (here 0.05), "
 	"Praat will know that you want to show an oops button.")
-NORMAL (L"If you include an oops button, it will become visible to the participant for every stimulus except the first, "
+NORMAL (U"If you include an oops button, it will become visible to the participant for every stimulus except the first, "
 	"and it will also be visible on the pause (break) screens and on the final screen.")
-NORMAL (L"If the participant clicks the oops button, Praat will forget everything the participant did "
+NORMAL (U"If the participant clicks the oops button, Praat will forget everything the participant did "
 	"with the current stimulus and the previous stimulus. The experiment will continue with playing "
 	"the previous stimulus again and waiting for the participant's choice.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 5. Stimulus-dependent texts", L"ppgb", 20051205)
-INTRO (L"In the @@ExperimentMFC 2.1. The experiment file|example experiment@, the text at the top of the screen "
+MAN_BEGIN (U"ExperimentMFC 5. Stimulus-dependent texts", U"ppgb", 20051205)
+INTRO (U"In the @@ExperimentMFC 2.1. The experiment file|example experiment@, the text at the top of the screen "
 	"stayed the same throughout the experiment, and so did the texts on the response buttons. "
 	"There are ways to have these texts depend on the stimulus at hand.")
-LIST_ITEM (L"@@ExperimentMFC 5.1. The stimulus-dependent run text")
-LIST_ITEM (L"@@ExperimentMFC 5.2. Stimulus-dependent response buttons")
+LIST_ITEM (U"@@ExperimentMFC 5.1. The stimulus-dependent run text")
+LIST_ITEM (U"@@ExperimentMFC 5.2. Stimulus-dependent response buttons")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 5.1. The stimulus-dependent run text", L"ppgb", 20051205)
-INTRO (L"The @@ExperimentMFC 2.1. The experiment file|example experiment@ contained the following lines:")
-CODE (L"numberOfDifferentStimuli = 4")
-CODE1 (L"\"heed\"  \"\"")
-CODE1 (L"\"hid\"   \"\"")
-CODE1 (L"\"hood\"  \"\"")
-CODE1 (L"\"hud\"   \"\"")
-CODE (L"...")
-CODE (L"...")
-CODE (L"runText = \"Choose the vowel that you heard.\"")
-NORMAL (L"For every stimulus, the same `run text' was written at the top of the screen. "
+MAN_BEGIN (U"ExperimentMFC 5.1. The stimulus-dependent run text", U"ppgb", 20051205)
+INTRO (U"The @@ExperimentMFC 2.1. The experiment file|example experiment@ contained the following lines:")
+CODE (U"numberOfDifferentStimuli = 4")
+CODE1 (U"\"heed\"  \"\"")
+CODE1 (U"\"hid\"   \"\"")
+CODE1 (U"\"hood\"  \"\"")
+CODE1 (U"\"hud\"   \"\"")
+CODE (U"...")
+CODE (U"...")
+CODE (U"runText = \"Choose the vowel that you heard.\"")
+NORMAL (U"For every stimulus, the same `run text' was written at the top of the screen. "
 	"But suppose you want to make that text dependent on the stimulus. You would do:")
-CODE1 (L"\"heed\"  \"Choose the vowel you heard.\"")
-CODE1 (L"\"hid\"   \"Click the vowel you heard.\"")
-CODE1 (L"\"hood\"  \"Select the vowel you heard.\"")
-CODE1 (L"\"hud\"   \"What's the vowel you heard?\"")
-CODE (L"...")
-CODE (L"...")
-CODE (L"runText = \"\"")
-NORMAL (L"In this case, each stimulus comes with its own text. The %runText will only show up for stimuli "
+CODE1 (U"\"heed\"  \"Choose the vowel you heard.\"")
+CODE1 (U"\"hid\"   \"Click the vowel you heard.\"")
+CODE1 (U"\"hood\"  \"Select the vowel you heard.\"")
+CODE1 (U"\"hud\"   \"What's the vowel you heard?\"")
+CODE (U"...")
+CODE (U"...")
+CODE (U"runText = \"\"")
+NORMAL (U"In this case, each stimulus comes with its own text. The %runText will only show up for stimuli "
 	"for which you do not supply a separate text.")
-NORMAL (L"This feature is useful mainly in cases where the responses are sounds but the stimulus is not "
+NORMAL (U"This feature is useful mainly in cases where the responses are sounds but the stimulus is not "
 	"(see @@ExperimentMFC 6. Responses are sounds@) or if you want to cause some lexical priming.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 5.2. Stimulus-dependent response buttons", L"ppgb", 20070926)
-INTRO (L"The @@ExperimentMFC 2.1. The experiment file|example experiment@ contained the following lines:")
-CODE (L"numberOfDifferentStimuli = 4")
-CODE1 (L"\"heed\"  \"\"")
-CODE1 (L"\"hid\"   \"\"")
-CODE1 (L"\"hood\"  \"\"")
-CODE1 (L"\"hud\"   \"\"")
-CODE (L"...")
-CODE (L"...")
-CODE (L"numberOfDifferentResponses = 5")
-CODE1 (L"0.2 0.3 0.7 0.8 \"h I d\" 40 \"\" \"i\"")
-CODE1 (L"0.3 0.4 0.5 0.6 \"h E d\" 40 \"\" \"e\"")
-CODE1 (L"0.4 0.5 0.3 0.4 \"h A d\" 40 \"\" \"a\"")
-CODE1 (L"0.5 0.6 0.5 0.6 \"h O d\" 40 \"\" \"o\"")
-CODE1 (L"0.6 0.7 0.7 0.8 \"h U d\" 40 \"\" \"u\"")
-NORMAL (L"For every stimulus, the buttons contained the same visible texts, such as \"h I d\" and \"h A d\".")
-NORMAL (L"But suppose you have an experiment about the perception of voicing in plosives. "
+MAN_BEGIN (U"ExperimentMFC 5.2. Stimulus-dependent response buttons", U"ppgb", 20070926)
+INTRO (U"The @@ExperimentMFC 2.1. The experiment file|example experiment@ contained the following lines:")
+CODE (U"numberOfDifferentStimuli = 4")
+CODE1 (U"\"heed\"  \"\"")
+CODE1 (U"\"hid\"   \"\"")
+CODE1 (U"\"hood\"  \"\"")
+CODE1 (U"\"hud\"   \"\"")
+CODE (U"...")
+CODE (U"...")
+CODE (U"numberOfDifferentResponses = 5")
+CODE1 (U"0.2 0.3 0.7 0.8 \"h I d\" 40 \"\" \"i\"")
+CODE1 (U"0.3 0.4 0.5 0.6 \"h E d\" 40 \"\" \"e\"")
+CODE1 (U"0.4 0.5 0.3 0.4 \"h A d\" 40 \"\" \"a\"")
+CODE1 (U"0.5 0.6 0.5 0.6 \"h O d\" 40 \"\" \"o\"")
+CODE1 (U"0.6 0.7 0.7 0.8 \"h U d\" 40 \"\" \"u\"")
+NORMAL (U"For every stimulus, the buttons contained the same visible texts, such as \"h I d\" and \"h A d\".")
+NORMAL (U"But suppose you have an experiment about the perception of voicing in plosives. "
 	"The first stimulus starts with an ambiguous /b/ or /p/, and you want the participant "
 	"to choose between \"bath\" and \"path\". The next stimulus starts with an ambiguous /d/ or /t/, "
 	"and you want the participant to choose between \"dart\" and \"tart\". "
 	"You would go about like this:")
-CODE (L"numberOfDifferentStimuli = 6")
-CODE1 (L"\"bpath1\"  \"|bath|path\"")
-CODE1 (L"\"bpath2\"  \"|bath|path\"")
-CODE1 (L"\"bpath3\"  \"|bath|path\"")
-CODE1 (L"\"dtart1\"  \"|dart|tart\"")
-CODE1 (L"\"dtart2\"  \"|dart|tart\"")
-CODE1 (L"\"dtart3\"  \"|dart|tart\"")
-CODE (L"...")
-CODE (L"...")
-CODE (L"numberOfDifferentResponses = 2")
-CODE1 (L"0.2 0.4 0.7 0.8 \"\" 40 \"\" \"left\"")
-CODE1 (L"0.6 0.8 0.7 0.8 \"\" 40 \"\" \"right\"")
-NORMAL (L"In this case, the two response buttons show either \"path\" and \"path\", or \"dart\" and \"tart\".")
-NORMAL (L"In the ResultsMFC (see @@ExperimentMFC 2.9. How an experiment proceeds@), "
+CODE (U"numberOfDifferentStimuli = 6")
+CODE1 (U"\"bpath1\"  \"|bath|path\"")
+CODE1 (U"\"bpath2\"  \"|bath|path\"")
+CODE1 (U"\"bpath3\"  \"|bath|path\"")
+CODE1 (U"\"dtart1\"  \"|dart|tart\"")
+CODE1 (U"\"dtart2\"  \"|dart|tart\"")
+CODE1 (U"\"dtart3\"  \"|dart|tart\"")
+CODE (U"...")
+CODE (U"...")
+CODE (U"numberOfDifferentResponses = 2")
+CODE1 (U"0.2 0.4 0.7 0.8 \"\" 40 \"\" \"left\"")
+CODE1 (U"0.6 0.8 0.7 0.8 \"\" 40 \"\" \"right\"")
+NORMAL (U"In this case, the two response buttons show either \"path\" and \"path\", or \"dart\" and \"tart\".")
+NORMAL (U"In the ResultsMFC (see @@ExperimentMFC 2.9. How an experiment proceeds@), "
 	"the stimuli will be recorded as \"bpath1|bath|path\" and the like, not just as \"bpath1\". "
 	"Praat does this in order to be able to cope with balanced designs such as")
-CODE1 (L"\"bpath1\"  \"|bath|path\"")
-CODE1 (L"\"bpath1\"  \"|path|bath\"")
-NORMAL (L"In other words, the button ordering is considered part of the stimulus.")
-NORMAL (L"This trick can be combined with a stimulus-dependent run text:")
-CODE (L"numberOfDifferentStimuli = 32")
-CODE1 (L"\"bpath1\"  \"Throw a...|bath|path\"")
-CODE1 (L"\"bpath1\"  \"Walk a...|bath|path\"")
-CODE1 (L"\"bpath2\"  \"Walk a...|bath|path\"")
-CODE1 (L"\"dtart1\"  \"Throw a...|dart|tart\"")
-CODE1 (L"\"dtart1\"  \"Carry a...|dart|tart\"")
-CODE (L"...")
-CODE (L"runText = \"\"")
-CODE (L"...")
-CODE (L"numberOfDifferentResponses = 2")
-CODE1 (L"0.2 0.4 0.7 0.8 \"\" 40 \"\" \"left\"")
-CODE1 (L"0.6 0.8 0.7 0.8 \"\" 40 \"\" \"right\"")
+CODE1 (U"\"bpath1\"  \"|bath|path\"")
+CODE1 (U"\"bpath1\"  \"|path|bath\"")
+NORMAL (U"In other words, the button ordering is considered part of the stimulus.")
+NORMAL (U"This trick can be combined with a stimulus-dependent run text:")
+CODE (U"numberOfDifferentStimuli = 32")
+CODE1 (U"\"bpath1\"  \"Throw a...|bath|path\"")
+CODE1 (U"\"bpath1\"  \"Walk a...|bath|path\"")
+CODE1 (U"\"bpath2\"  \"Walk a...|bath|path\"")
+CODE1 (U"\"dtart1\"  \"Throw a...|dart|tart\"")
+CODE1 (U"\"dtart1\"  \"Carry a...|dart|tart\"")
+CODE (U"...")
+CODE (U"runText = \"\"")
+CODE (U"...")
+CODE (U"numberOfDifferentResponses = 2")
+CODE1 (U"0.2 0.4 0.7 0.8 \"\" 40 \"\" \"left\"")
+CODE1 (U"0.6 0.8 0.7 0.8 \"\" 40 \"\" \"right\"")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 6. Responses are sounds", L"ppgb", 20130101)
-INTRO (L"In the @@ExperimentMFC 2.1. The experiment file|example experiment@, "
+MAN_BEGIN (U"ExperimentMFC 6. Responses are sounds", U"ppgb", 20130101)
+INTRO (U"In the @@ExperimentMFC 2.1. The experiment file|example experiment@, "
 	"the stimuli were sounds, and the responses were categories whose labels appeared on buttons. "
 	"Sometimes you want it the other way around.")
-NORMAL (L"An example is the %%/i/ prototype% task: the top of the screen just says \"Please choose the best %ee\", "
+NORMAL (U"An example is the %%/i/ prototype% task: the top of the screen just says \"Please choose the best %ee\", "
 	"and no stimulus sound is played. Instead, the participant can click repeatedly on an array of 40 buttons, "
 	"each of which contains a different [i]-like sound. That is, if the participant clicks on a response button, "
 	"an [i]-like sound is played, and every response button has its own sound.")
-NORMAL (L"Such a task can be regarded as reversing the task of the example experiment, "
+NORMAL (U"Such a task can be regarded as reversing the task of the example experiment, "
 	"in which the stimulus was a sound and the reponse was a phonological category. "
 	"In the /i/ prototype task, the stimulus is a phonological category, and the response is a sound.")
-NORMAL (L"This is what the experiment file could look like:")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"ExperimentMFC 6\"")
-CODE (L"blankWhilePlaying? <no>")
-CODE (L"stimuliAreSounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
-CODE (L"numberOfDifferentStimuli = 2")
-CODE1 (L"\"i\"  \"Choose the best \\% \\% ee\\% .\"")
-CODE1 (L"\"I\"  \"Choose the best \\% \\% i\\% .\"")
-CODE (L"numberOfReplicationsPerStimulus = 1")
-CODE (L"breakAfterEvery = 1")
-CODE (L"randomize = <CyclicNonRandom>")
-CODE (L"startText = \"Click to start.\"")
-CODE (L"runText = \"\"")
-CODE (L"pauseText = \"You can have a short break if you like. Click to proceed.\"")
-CODE (L"endText = \"The experiment has finished.\"")
-CODE (L"maximumNumberOfReplays = 0")
-CODE (L"replayButton = 0 0 0 0 \"\" \"\"")
-CODE (L"okButton = 0.8 0.95 0.45 0.55 \"OK\" \"\"")
-CODE (L"oopsButton = 0 0 0 0 \"\" \"\"")
-CODE (L"responsesAreSounds? <yes>")
-CODE (L"responseFileNameHead = \"Sounds/\"")
-CODE (L"responseFileNameTail = \".wav\"")
-CODE (L"responseCarrierBefore = \"\"")
-CODE (L"responseCarrierAfter = \"\"")
-CODE (L"responseInitialSilenceDuration = 0.3")
-CODE (L"responseMedialSilenceDuration = 0")
-CODE (L"responseFinalSilenceDuration = 0")
-CODE (L"numberOfDifferentResponses = 16")
-CODE1 (L"0.2 0.3 0.7 0.8 \"\" 10 \"\" \"i11\"")
-CODE1 (L"0.3 0.4 0.7 0.8 \"\" 10 \"\" \"i12\"")
-CODE1 (L"0.4 0.5 0.7 0.8 \"\" 10 \"\" \"i13\"")
-CODE1 (L"0.5 0.6 0.7 0.8 \"\" 10 \"\" \"i14\"")
-CODE1 (L"0.2 0.3 0.6 0.7 \"\" 10 \"\" \"i21\"")
-CODE1 (L"0.3 0.4 0.6 0.7 \"\" 10 \"\" \"i22\"")
-CODE1 (L"0.4 0.5 0.6 0.7 \"\" 10 \"\" \"i23\"")
-CODE1 (L"0.5 0.6 0.6 0.7 \"\" 10 \"\" \"i24\"")
-CODE1 (L"0.2 0.3 0.5 0.6 \"\" 10 \"\" \"i31\"")
-CODE1 (L"0.3 0.4 0.5 0.6 \"\" 10 \"\" \"i32\"")
-CODE1 (L"0.4 0.5 0.5 0.6 \"\" 10 \"\" \"i33\"")
-CODE1 (L"0.5 0.6 0.5 0.6 \"\" 10 \"\" \"i34\"")
-CODE1 (L"0.2 0.3 0.4 0.5 \"\" 10 \"\" \"i41\"")
-CODE1 (L"0.3 0.4 0.4 0.5 \"\" 10 \"\" \"i42\"")
-CODE1 (L"0.4 0.5 0.4 0.5 \"\" 10 \"\" \"i43\"")
-CODE1 (L"0.5 0.6 0.4 0.5 \"\" 10 \"\" \"i44\"")
-CODE (L"numberOfGoodnessCategories = 5")
-CODE1 (L"0.25 0.35 0.10 0.20 \"1 (poor)\"")
-CODE1 (L"0.35 0.45 0.10 0.20 \"2\"")
-CODE1 (L"0.45 0.55 0.10 0.20 \"3\"")
-CODE1 (L"0.55 0.65 0.10 0.20 \"4\"")
-CODE1 (L"0.65 0.75 0.10 0.20 \"5 (good)\"")
-NORMAL (L"The participant will see 16 squares on the screen. First she will have to find the best /i/, "
+NORMAL (U"This is what the experiment file could look like:")
+CODE (U"\"ooTextFile\"")
+CODE (U"\"ExperimentMFC 6\"")
+CODE (U"blankWhilePlaying? <no>")
+CODE (U"stimuliAreSounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
+CODE (U"numberOfDifferentStimuli = 2")
+CODE1 (U"\"i\"  \"Choose the best \\% \\% ee\\% .\"")
+CODE1 (U"\"I\"  \"Choose the best \\% \\% i\\% .\"")
+CODE (U"numberOfReplicationsPerStimulus = 1")
+CODE (U"breakAfterEvery = 1")
+CODE (U"randomize = <CyclicNonRandom>")
+CODE (U"startText = \"Click to start.\"")
+CODE (U"runText = \"\"")
+CODE (U"pauseText = \"You can have a short break if you like. Click to proceed.\"")
+CODE (U"endText = \"The experiment has finished.\"")
+CODE (U"maximumNumberOfReplays = 0")
+CODE (U"replayButton = 0 0 0 0 \"\" \"\"")
+CODE (U"okButton = 0.8 0.95 0.45 0.55 \"OK\" \"\"")
+CODE (U"oopsButton = 0 0 0 0 \"\" \"\"")
+CODE (U"responsesAreSounds? <yes>")
+CODE (U"responseFileNameHead = \"Sounds/\"")
+CODE (U"responseFileNameTail = \".wav\"")
+CODE (U"responseCarrierBefore = \"\"")
+CODE (U"responseCarrierAfter = \"\"")
+CODE (U"responseInitialSilenceDuration = 0.3")
+CODE (U"responseMedialSilenceDuration = 0")
+CODE (U"responseFinalSilenceDuration = 0")
+CODE (U"numberOfDifferentResponses = 16")
+CODE1 (U"0.2 0.3 0.7 0.8 \"\" 10 \"\" \"i11\"")
+CODE1 (U"0.3 0.4 0.7 0.8 \"\" 10 \"\" \"i12\"")
+CODE1 (U"0.4 0.5 0.7 0.8 \"\" 10 \"\" \"i13\"")
+CODE1 (U"0.5 0.6 0.7 0.8 \"\" 10 \"\" \"i14\"")
+CODE1 (U"0.2 0.3 0.6 0.7 \"\" 10 \"\" \"i21\"")
+CODE1 (U"0.3 0.4 0.6 0.7 \"\" 10 \"\" \"i22\"")
+CODE1 (U"0.4 0.5 0.6 0.7 \"\" 10 \"\" \"i23\"")
+CODE1 (U"0.5 0.6 0.6 0.7 \"\" 10 \"\" \"i24\"")
+CODE1 (U"0.2 0.3 0.5 0.6 \"\" 10 \"\" \"i31\"")
+CODE1 (U"0.3 0.4 0.5 0.6 \"\" 10 \"\" \"i32\"")
+CODE1 (U"0.4 0.5 0.5 0.6 \"\" 10 \"\" \"i33\"")
+CODE1 (U"0.5 0.6 0.5 0.6 \"\" 10 \"\" \"i34\"")
+CODE1 (U"0.2 0.3 0.4 0.5 \"\" 10 \"\" \"i41\"")
+CODE1 (U"0.3 0.4 0.4 0.5 \"\" 10 \"\" \"i42\"")
+CODE1 (U"0.4 0.5 0.4 0.5 \"\" 10 \"\" \"i43\"")
+CODE1 (U"0.5 0.6 0.4 0.5 \"\" 10 \"\" \"i44\"")
+CODE (U"numberOfGoodnessCategories = 5")
+CODE1 (U"0.25 0.35 0.10 0.20 \"1 (poor)\"")
+CODE1 (U"0.35 0.45 0.10 0.20 \"2\"")
+CODE1 (U"0.45 0.55 0.10 0.20 \"3\"")
+CODE1 (U"0.55 0.65 0.10 0.20 \"4\"")
+CODE1 (U"0.65 0.75 0.10 0.20 \"5 (good)\"")
+NORMAL (U"The participant will see 16 squares on the screen. First she will have to find the best /i/, "
 	"then the best /\\ic/. The sound files ##Sounds/i11.wav# and so on must exist and have the same sampling frequency. "
 	"A silence of 0.3 seconds is played just before each response sound.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 7. Blanking the screen", L"ppgb", 20130102)
-INTRO (L"In all the earlier examples, the flag %blankWhilePlaying was set to <no>. This means that in all those cases "
+MAN_BEGIN (U"ExperimentMFC 7. Blanking the screen", U"ppgb", 20130102)
+INTRO (U"In all the earlier examples, the flag %blankWhilePlaying was set to <no>. This means that in all those cases "
 	"the participant will immediately see the response categories when the sound starts playing "
 	"(or even earlier, if there is an initial silence).")
-NORMAL (L"This can be changed by setting %blankWhilePlaying to <yes>. When you do that, the participant will see a blank screen "
+NORMAL (U"This can be changed by setting %blankWhilePlaying to <yes>. When you do that, the participant will see a blank screen "
 	"while the stimulus is playing, and the response buttons will come up only after the sound has finished. "
 	"This is useful if you want to prevent the participant from clicking before the sound has finished, "
 	"or for priming experiments. Reaction times are measured from when the response buttons appear.")
-NORMAL (L"If you want the response buttons to come up 0.5 seconds after the sound finishes playing, "
+NORMAL (U"If you want the response buttons to come up 0.5 seconds after the sound finishes playing, "
 	"you set the %stimulusFinalSilenceDuration to 0.5.")
 MAN_END
 
-MAN_BEGIN (L"ExperimentMFC 8. Running multiple experiments", L"ppgb", 20130101)
-INTRO (L"In all the earlier examples, either the set of stimulus sounds or the set of response sounds stayed "
+MAN_BEGIN (U"ExperimentMFC 8. Running multiple experiments", U"ppgb", 20130101)
+INTRO (U"In all the earlier examples, either the set of stimulus sounds or the set of response sounds stayed "
 	"the same throughout the experiment. If you want more than one set of stimuli, or more than one set of responses, "
 	"you can run several experiments after each other, simply by selecting more than one experiment, then clicking #Run.")
-NORMAL (L"You can put all these ExperimentMFC objects in one text file. The following example contains two experiments. "
+NORMAL (U"You can put all these ExperimentMFC objects in one text file. The following example contains two experiments. "
 	"The second line has to contain the text \"Collection\", followed by the number of experiments:")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"Collection\" 2")
-CODE (L"")
-CODE (L"\"ExperimentMFC 6\" \"i\"")
-CODE (L"blankWhilePlaying? <no>")
-CODE (L"stimuliAreSounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
-CODE (L"numberOfDifferentStimuli = 1")
-CODE1 (L"\"i\"  \"Choose the best \\% \\% ee\\% .\"")
-CODE (L"numberOfReplicationsPerStimulus = 1")
-CODE (L"breakAfterEvery = 0")
-CODE (L"randomize = <CyclicNonRandom>")
-CODE (L"startText = \"You are going to choose the best \\% \\% ee\\% . Click to start.\"")
-CODE (L"runText = \"\"")
-CODE (L"pauseText = \"\"")
-CODE (L"endText = \"Thank you for choosing the best \\% \\% ee\\% . Click to proceed.\"")
-CODE (L"maximumNumberOfReplays = 0")
-CODE (L"replayButton = 0 0 0 0 \"\" \"\"")
-CODE (L"okButton = 0.8 0.95 0.45 0.55 \"OK\" \"\"")
-CODE (L"oopsButton = 0 0 0 0 \"\" \"\"")
-CODE (L"responsesAreSounds? <yes>")
-CODE (L"responseFileNameHead = \"Sounds/\"")
-CODE (L"responseFileNameTail = \".wav\"")
-CODE (L"responseCarrierBefore = \"\"")
-CODE (L"responseCarrierAfter = \"\"")
-CODE (L"responseInitialSilenceDuration = 0.3")
-CODE (L"responseMedialSilenceDuration = 0")
-CODE (L"responseFinalSilenceDuration = 0")
-CODE (L"numberOfDifferentResponses = 6")
-CODE1 (L"0.2 0.3 0.7 0.8 \"\" 10 \"\" \"i1\"")
-CODE1 (L"0.3 0.4 0.7 0.8 \"\" 10 \"\" \"i2\"")
-CODE1 (L"0.4 0.5 0.7 0.8 \"\" 10 \"\" \"i3\"")
-CODE1 (L"0.5 0.6 0.7 0.8 \"\" 10 \"\" \"i4\"")
-CODE1 (L"0.6 0.7 0.7 0.8 \"\" 10 \"\" \"i5\"")
-CODE1 (L"0.7 0.8 0.7 0.8 \"\" 10 \"\" \"i6\"")
-CODE (L"numberOfGoodnessCategories = 0")
-CODE (L"")
-CODE (L"\"ExperimentMFC 6\" \"u\"")
-CODE (L"blankWhilePlaying? <no>")
-CODE (L"stimuliAreSounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
-CODE (L"numberOfDifferentStimuli = 1")
-CODE1 (L"\"u\"  \"Choose the best \\% \\% oo\\% .\"")
-CODE (L"numberOfReplicationsPerStimulus = 1")
-CODE (L"breakAfterEvery = 0")
-CODE (L"randomize = <CyclicNonRandom>")
-CODE (L"startText = \"You are going to choose the best \\% \\% oo\\% . Click to start.\"")
-CODE (L"runText = \"\"")
-CODE (L"pauseText = \"\"")
-CODE (L"endText = \"All the experiments have finished. You can call the experimenter.\"")
-CODE (L"maximumNumberOfReplays = 0")
-CODE (L"replayButton = 0 0 0 0 \"\" \"\"")
-CODE (L"okButton = 0.8 0.95 0.45 0.55 \"OK\" \"\"")
-CODE (L"oopsButton = 0 0 0 0 \"\" \"\"")
-CODE (L"responsesAreSounds? <yes>")
-CODE (L"responseFileNameHead = \"Sounds/\"")
-CODE (L"responseFileNameTail = \".wav\"")
-CODE (L"responseCarrierBefore = \"\"")
-CODE (L"responseCarrierAfter = \"\"")
-CODE (L"responseInitialSilenceDuration = 0.3")
-CODE (L"responseMedialSilenceDuration = 0")
-CODE (L"responseFinalSilenceDuration = 0")
-CODE (L"numberOfDifferentResponses = 6")
-CODE1 (L"0.2 0.3 0.7 0.8 \"\" 10 \"\" \"u1\"")
-CODE1 (L"0.3 0.4 0.7 0.8 \"\" 10 \"\" \"u2\"")
-CODE1 (L"0.4 0.5 0.7 0.8 \"\" 10 \"\" \"u3\"")
-CODE1 (L"0.5 0.6 0.7 0.8 \"\" 10 \"\" \"u4\"")
-CODE1 (L"0.6 0.7 0.7 0.8 \"\" 10 \"\" \"u5\"")
-CODE1 (L"0.7 0.8 0.7 0.8 \"\" 10 \"\" \"u6\"")
-CODE (L"numberOfGoodnessCategories = 0")
-NORMAL (L"In this example, the participant first has to choose the best /i/ from among six [i]-like sounds, "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"Collection\" 2")
+CODE (U"")
+CODE (U"\"ExperimentMFC 6\" \"i\"")
+CODE (U"blankWhilePlaying? <no>")
+CODE (U"stimuliAreSounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
+CODE (U"numberOfDifferentStimuli = 1")
+CODE1 (U"\"i\"  \"Choose the best \\% \\% ee\\% .\"")
+CODE (U"numberOfReplicationsPerStimulus = 1")
+CODE (U"breakAfterEvery = 0")
+CODE (U"randomize = <CyclicNonRandom>")
+CODE (U"startText = \"You are going to choose the best \\% \\% ee\\% . Click to start.\"")
+CODE (U"runText = \"\"")
+CODE (U"pauseText = \"\"")
+CODE (U"endText = \"Thank you for choosing the best \\% \\% ee\\% . Click to proceed.\"")
+CODE (U"maximumNumberOfReplays = 0")
+CODE (U"replayButton = 0 0 0 0 \"\" \"\"")
+CODE (U"okButton = 0.8 0.95 0.45 0.55 \"OK\" \"\"")
+CODE (U"oopsButton = 0 0 0 0 \"\" \"\"")
+CODE (U"responsesAreSounds? <yes>")
+CODE (U"responseFileNameHead = \"Sounds/\"")
+CODE (U"responseFileNameTail = \".wav\"")
+CODE (U"responseCarrierBefore = \"\"")
+CODE (U"responseCarrierAfter = \"\"")
+CODE (U"responseInitialSilenceDuration = 0.3")
+CODE (U"responseMedialSilenceDuration = 0")
+CODE (U"responseFinalSilenceDuration = 0")
+CODE (U"numberOfDifferentResponses = 6")
+CODE1 (U"0.2 0.3 0.7 0.8 \"\" 10 \"\" \"i1\"")
+CODE1 (U"0.3 0.4 0.7 0.8 \"\" 10 \"\" \"i2\"")
+CODE1 (U"0.4 0.5 0.7 0.8 \"\" 10 \"\" \"i3\"")
+CODE1 (U"0.5 0.6 0.7 0.8 \"\" 10 \"\" \"i4\"")
+CODE1 (U"0.6 0.7 0.7 0.8 \"\" 10 \"\" \"i5\"")
+CODE1 (U"0.7 0.8 0.7 0.8 \"\" 10 \"\" \"i6\"")
+CODE (U"numberOfGoodnessCategories = 0")
+CODE (U"")
+CODE (U"\"ExperimentMFC 6\" \"u\"")
+CODE (U"blankWhilePlaying? <no>")
+CODE (U"stimuliAreSounds? <no> \"\" \"\" \"\" \"\" 0 0 0")
+CODE (U"numberOfDifferentStimuli = 1")
+CODE1 (U"\"u\"  \"Choose the best \\% \\% oo\\% .\"")
+CODE (U"numberOfReplicationsPerStimulus = 1")
+CODE (U"breakAfterEvery = 0")
+CODE (U"randomize = <CyclicNonRandom>")
+CODE (U"startText = \"You are going to choose the best \\% \\% oo\\% . Click to start.\"")
+CODE (U"runText = \"\"")
+CODE (U"pauseText = \"\"")
+CODE (U"endText = \"All the experiments have finished. You can call the experimenter.\"")
+CODE (U"maximumNumberOfReplays = 0")
+CODE (U"replayButton = 0 0 0 0 \"\" \"\"")
+CODE (U"okButton = 0.8 0.95 0.45 0.55 \"OK\" \"\"")
+CODE (U"oopsButton = 0 0 0 0 \"\" \"\"")
+CODE (U"responsesAreSounds? <yes>")
+CODE (U"responseFileNameHead = \"Sounds/\"")
+CODE (U"responseFileNameTail = \".wav\"")
+CODE (U"responseCarrierBefore = \"\"")
+CODE (U"responseCarrierAfter = \"\"")
+CODE (U"responseInitialSilenceDuration = 0.3")
+CODE (U"responseMedialSilenceDuration = 0")
+CODE (U"responseFinalSilenceDuration = 0")
+CODE (U"numberOfDifferentResponses = 6")
+CODE1 (U"0.2 0.3 0.7 0.8 \"\" 10 \"\" \"u1\"")
+CODE1 (U"0.3 0.4 0.7 0.8 \"\" 10 \"\" \"u2\"")
+CODE1 (U"0.4 0.5 0.7 0.8 \"\" 10 \"\" \"u3\"")
+CODE1 (U"0.5 0.6 0.7 0.8 \"\" 10 \"\" \"u4\"")
+CODE1 (U"0.6 0.7 0.7 0.8 \"\" 10 \"\" \"u5\"")
+CODE1 (U"0.7 0.8 0.7 0.8 \"\" 10 \"\" \"u6\"")
+CODE (U"numberOfGoodnessCategories = 0")
+NORMAL (U"In this example, the participant first has to choose the best /i/ from among six [i]-like sounds, "
 	"which are in the sound files ##i1.wav# through ##i6.wav#. After that, she has to choose the best /u/ "
 	"from among six [u]-like sounds, which are in the sound files ##u1.wav# through ##u6.wav#. "
 	"The percent signs in \\% \\% ee\\%  mean that %ee will be italicized.")
-NORMAL (L"If you read this file with ##Read from file...#, you will see two ExperimentMFC objects, "
+NORMAL (U"If you read this file with ##Read from file...#, you will see two ExperimentMFC objects, "
 	"named #i and #u. They both stand selected. You then click #Run, and after the participant finishes, "
 	"you select both ExperimentMFC objects again (probably they still stand selected), and click ##Extract results#. "
 	"You will then get two #ResultMFC objects.")
diff --git a/fon/manual_Fon.cpp b/fon/manual_Fon.cpp
index 9e44480..859650e 100644
--- a/fon/manual_Fon.cpp
+++ b/fon/manual_Fon.cpp
@@ -1,6 +1,6 @@
 /* manual_Fon.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,18 +20,18 @@
 #include "ManPagesM.h"
 
 static void draw_CreateDurationTier (Graphics g) {
-	static double x [] = { 0, 0.3, 0.6, 0.7, 0.9 }, y [] = { 1, 1, 2.3, 1, 1 };
-	Graphics_setWindow (g, 0, 0.9, 0, 2.5);
+	static double x [] = { 0.0, 0.3, 0.6, 0.7, 0.9 }, y [] = { 1.0, 1.0, 2.3, 1.0, 1.0 };
+	Graphics_setWindow (g, 0.0, 0.9, 0.0, 2.5);
 	Graphics_drawInnerBox (g);
-	Graphics_marksLeftEvery (g, 1, 1, TRUE, TRUE, FALSE);
-	Graphics_marksBottomEvery (g, 1, 0.1, TRUE, TRUE, FALSE);
+	Graphics_marksLeftEvery (g, 1.0, 1.0, true, true, false);
+	Graphics_marksBottomEvery (g, 1.0, 0.1, true, true, false);
 	Graphics_setInner (g);
 	Graphics_setColour (g, Graphics_RED);
 	Graphics_polyline (g, 5, x, y);
 	Graphics_setColour (g, Graphics_BLACK);
 	Graphics_unsetInner (g);
-	Graphics_textBottom (g, TRUE, L"Time (s)");
-	Graphics_textLeft (g, TRUE, L"Relative duration");
+	Graphics_textBottom (g, true, U"Time (s)");
+	Graphics_textLeft (g, true, U"Relative duration");
 }
 
 void manual_Sampling_init (ManPages me);
@@ -51,78 +51,78 @@ manual_spectrum_init (me);
 manual_formant_init (me);
 manual_annotation_init (me);
 
-MAN_BEGIN (L"Get high index from time...", L"ppgb", 20101230)
-INTRO (L"A @query to ask the selected tier object "
+MAN_BEGIN (U"Get high index from time...", U"ppgb", 20101230)
+INTRO (U"A @query to ask the selected tier object "
 	"(@DurationTier, @IntensityTier, @PitchTier) "
 	"which point is nearest to, but no earlier than, the specified time.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time from which you want to get the point index.")
-ENTRY (L"Return value")
-NORMAL (L"This query returns the index of the point with the lowest time greater than or equal to #Time. "
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time from which you want to get the point index.")
+ENTRY (U"Return value")
+NORMAL (U"This query returns the index of the point with the lowest time greater than or equal to #Time. "
 	"It is @undefined if there are no points. "
 	"It is the number of points plus 1 (offright) if the specified time is greater than the time of the last point.")
 MAN_END
 
-MAN_BEGIN (L"Get low index from time...", L"ppgb", 20101230)
-INTRO (L"A @query to ask the selected tier object "
+MAN_BEGIN (U"Get low index from time...", U"ppgb", 20101230)
+INTRO (U"A @query to ask the selected tier object "
 	"(@DurationTier, @IntensityTier, @PitchTier) "
 	"which point is nearest to, but no later than, the specified time.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time from which you want to get the point index.")
-ENTRY (L"Return value")
-NORMAL (L"This query returns the index of the point with the highest time less than or equal to #Time. "
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time from which you want to get the point index.")
+ENTRY (U"Return value")
+NORMAL (U"This query returns the index of the point with the highest time less than or equal to #Time. "
 	"It is @undefined if there are no points. "
 	"It is 0 (offleft) if the specified time is less than the time of the first point.")
 MAN_END
 
-MAN_BEGIN (L"Get nearest index from time...", L"ppgb", 20101230)
-INTRO (L"A @query to ask the selected tier object "
+MAN_BEGIN (U"Get nearest index from time...", U"ppgb", 20101230)
+INTRO (U"A @query to ask the selected tier object "
 	"(@DurationTier, @IntensityTier, @PitchTier) "
 	"which point is nearest to the specified time.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time near which you want to get the point index.")
-ENTRY (L"Return value")
-NORMAL (L"This query returns the index of the point with the highest time less than or equal to #Time. "
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time near which you want to get the point index.")
+ENTRY (U"Return value")
+NORMAL (U"This query returns the index of the point with the highest time less than or equal to #Time. "
 	"It is @undefined if there are no points.")
 MAN_END
 
-MAN_BEGIN (L"Remove point...", L"ppgb", 20101230)
-INTRO (L"A command to remove one point from every selected time-based tier object "
+MAN_BEGIN (U"Remove point...", U"ppgb", 20101230)
+INTRO (U"A command to remove one point from every selected time-based tier object "
 	"(@DurationTier, @IntensityTier, @PitchTier).")
-ENTRY (L"Setting")
-TAG (L"##Point number")
-DEFINITION (L"the index of the point you want to remove.")
-ENTRY (L"Behaviour")
-NORMAL (L"If ##Point number# is 3, the third point counted from the start of the tier (if it exists) "
+ENTRY (U"Setting")
+TAG (U"##Point number")
+DEFINITION (U"the index of the point you want to remove.")
+ENTRY (U"Behaviour")
+NORMAL (U"If ##Point number# is 3, the third point counted from the start of the tier (if it exists) "
 	"is removed from the tier.")
 MAN_END
 
-MAN_BEGIN (L"Remove point near...", L"ppgb", 20101230)
-INTRO (L"A command to remove one point from every selected time-based tier object "
+MAN_BEGIN (U"Remove point near...", U"ppgb", 20101230)
+INTRO (U"A command to remove one point from every selected time-based tier object "
 	"(@DurationTier, @IntensityTier, @PitchTier).")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time near which you want to remove a point.")
-ENTRY (L"Behaviour")
-NORMAL (L"The point nearest to #Time (if there is any point) is removed from the tier.")
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time near which you want to remove a point.")
+ENTRY (U"Behaviour")
+NORMAL (U"The point nearest to #Time (if there is any point) is removed from the tier.")
 MAN_END
 
-MAN_BEGIN (L"Remove points between...", L"ppgb", 20101230)
-INTRO (L"A command to remove some points from every selected time-based tier object "
+MAN_BEGIN (U"Remove points between...", U"ppgb", 20101230)
+INTRO (U"A command to remove some points from every selected time-based tier object "
 	"(@DurationTier, @IntensityTier, @PitchTier).")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the times between which you want to remove all points.")
-ENTRY (L"Behaviour")
-NORMAL (L"Any points between ##Frome time# and ##To Time# (inclusive) are removed from the tier.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the times between which you want to remove all points.")
+ENTRY (U"Behaviour")
+NORMAL (U"Any points between ##Frome time# and ##To Time# (inclusive) are removed from the tier.")
 MAN_END
 
-MAN_BEGIN (L"AmplitudeTier", L"ppgb", 20070825)
-INTRO (L"One of the @@types of objects@ in Praat. "
+MAN_BEGIN (U"AmplitudeTier", U"ppgb", 20070825)
+INTRO (U"One of the @@types of objects@ in Praat. "
 	"An AmplitudeTier object represents a time-stamped amplitude contour, i.e., it contains a series of (%time, %amplitude) points. "
 	"The amplitude values are in Pascal. To see some applications, consult the @IntensityTier information; "
 	"the difference between an AmplitudeTier and an IntensityTier is that the former has values in Pascal "
@@ -130,161 +130,161 @@ INTRO (L"One of the @@types of objects@ in Praat. "
 	"which multiply logarithmically with a Sound.")
 MAN_END
 
-MAN_BEGIN (L"Cochleagram", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat. It represents the excitation pattern "
+MAN_BEGIN (U"Cochleagram", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat. It represents the excitation pattern "
 	"of the basilar membrane in the inner ear (see @Excitation) as a function of time.")
 MAN_END
 
-MAN_BEGIN (L"Cochleagram: Formula...", L"ppgb", 20021206)
-INTRO (L"A command for changing the data in all selected @Cochleagram objects.")
-NORMAL (L"See the @Formulas tutorial for examples and explanations.")
+MAN_BEGIN (U"Cochleagram: Formula...", U"ppgb", 20021206)
+INTRO (U"A command for changing the data in all selected @Cochleagram objects.")
+NORMAL (U"See the @Formulas tutorial for examples and explanations.")
 MAN_END
 
-MAN_BEGIN (L"Create DurationTier...", L"ppgb", 20140421)
-INTRO (L"A command in the @@New menu@ to create an empty @DurationTier object.")
-NORMAL (L"The resulting object will have the specified name and time domain, but contain no duration points. "
+MAN_BEGIN (U"Create DurationTier...", U"ppgb", 20140421)
+INTRO (U"A command in the @@New menu@ to create an empty @DurationTier object.")
+NORMAL (U"The resulting object will have the specified name and time domain, but contain no duration points. "
 	"To add some points to it, use @@DurationTier: Add point... at .")
-ENTRY (L"Scripting example")
-NORMAL (L"To create a tier 0.9 seconds long, with an deceleration around 0.6 seconds, you do:")
-CODE (L"Create DurationTier: \"dur\", 0, 0.9")
-CODE (L"Add point: 0.3, 1")
-CODE (L"Add point: 0.6, 2.3")
-CODE (L"Add point: 0.7, 1")
-NORMAL (L"The result will look like")
+ENTRY (U"Scripting example")
+NORMAL (U"To create a tier 0.9 seconds long, with an deceleration around 0.6 seconds, you do:")
+CODE (U"Create DurationTier: \"dur\", 0, 0.9")
+CODE (U"Add point: 0.3, 1")
+CODE (U"Add point: 0.6, 2.3")
+CODE (U"Add point: 0.7, 1")
+NORMAL (U"The result will look like")
 PICTURE (5, 2.5, draw_CreateDurationTier)
-NORMAL (L"The target duration will be the area under this curve, which is 0.9 + 1/2 · 1.3 · 0.4 = 1.16 seconds.")
+NORMAL (U"The target duration will be the area under this curve, which is 0.9 + 1/2 · 1.3 · 0.4 = 1.16 seconds.")
 MAN_END
 
-MAN_BEGIN (L"Create empty PointProcess...", L"ppgb", 20021204)
-INTRO (L"A command in the @@New menu@ to create an empty @PointProcess. The newly created object is put in the list of objects.")
+MAN_BEGIN (U"Create empty PointProcess...", U"ppgb", 20021204)
+INTRO (U"A command in the @@New menu@ to create an empty @PointProcess. The newly created object is put in the list of objects.")
 MAN_END
 
-MAN_BEGIN (L"Create IntensityTier...", L"ppgb", 20021204)
-INTRO (L"A command in the @@New menu@ to create an empty @IntensityTier object.")
-NORMAL (L"The resulting object will have the specified name and time domain, but contain no formant points. "
+MAN_BEGIN (U"Create IntensityTier...", U"ppgb", 20021204)
+INTRO (U"A command in the @@New menu@ to create an empty @IntensityTier object.")
+NORMAL (U"The resulting object will have the specified name and time domain, but contain no formant points. "
 	"To add some points to it, use @@IntensityTier: Add point... at .")
-NORMAL (L"For an example, see @@Source-filter synthesis at .")
+NORMAL (U"For an example, see @@Source-filter synthesis at .")
 MAN_END
 
-MAN_BEGIN (L"Create Matrix...", L"ppgb", 20021212)
-INTRO (L"A command in the @@New menu@ to create a @Matrix with the specified sampling attributes, "
+MAN_BEGIN (U"Create Matrix...", U"ppgb", 20021212)
+INTRO (U"A command in the @@New menu@ to create a @Matrix with the specified sampling attributes, "
 	"filled with values from a formula (see @@Matrix: Formula...@).")
 MAN_END
 
-MAN_BEGIN (L"Create Poisson process...", L"ppgb", 20041005)
-INTRO (L"A command to create a @PointProcess object that represents a Poisson process.")
-NORMAL (L"A Poisson process is a stationary point process with a fixed density %λ, "
+MAN_BEGIN (U"Create Poisson process...", U"ppgb", 20041005)
+INTRO (U"A command to create a @PointProcess object that represents a Poisson process.")
+NORMAL (U"A Poisson process is a stationary point process with a fixed density %λ, "
 	"which means that there are, on the average, %λ events per second.")
-ENTRY (L"Settings")
-TAG (L"##Start time (s)")
-DEFINITION (L"%t__%min_, the beginning of the time domain, in seconds.")
-TAG (L"##End time (s)")
-DEFINITION (L"%t__%max_, the end of the time domain, in seconds.")
-TAG (L"##Density (Hz)")
-DEFINITION (L"the average number of points per second.")
-ENTRY (L"Algorithm")
-NORMAL (L"First, the number of points %N in the time domain is determined. Its expectation value is")
-FORMULA (L"%λ = (%t__%max_ – %t__%min_) · %density")
-NORMAL (L"but its actual value is taken from the Poisson distribution:")
-FORMULA (L"%p(%n) = (%%λ^n% / %n!) %e^^–%λ")
-NORMAL (L"Then, %N points are computed throughout the time domain, according to a uniform distribution:")
-FORMULA (L"%p(%t) = 1 / (%t__%max_ – %t__%min_)   for %t ∈ [%t__%min_, %t__%max_]")
-FORMULA (L"%p(%t) = 0   outside [%t__%min_, %t__%max_]")
-MAN_END
-
-MAN_BEGIN (L"Create simple Matrix...", L"ppgb", 20021204)
-INTRO (L"A command in the @@New menu@ to create a @Matrix with the specified number of rows and columns, "
+ENTRY (U"Settings")
+TAG (U"##Start time (s)")
+DEFINITION (U"%t__%min_, the beginning of the time domain, in seconds.")
+TAG (U"##End time (s)")
+DEFINITION (U"%t__%max_, the end of the time domain, in seconds.")
+TAG (U"##Density (Hz)")
+DEFINITION (U"the average number of points per second.")
+ENTRY (U"Algorithm")
+NORMAL (U"First, the number of points %N in the time domain is determined. Its expectation value is")
+FORMULA (U"%λ = (%t__%max_ – %t__%min_) · %density")
+NORMAL (U"but its actual value is taken from the Poisson distribution:")
+FORMULA (U"%p(%n) = (%%λ^n% / %n!) %e^^–%λ")
+NORMAL (U"Then, %N points are computed throughout the time domain, according to a uniform distribution:")
+FORMULA (U"%p(%t) = 1 / (%t__%max_ – %t__%min_)   for %t ∈ [%t__%min_, %t__%max_]")
+FORMULA (U"%p(%t) = 0   outside [%t__%min_, %t__%max_]")
+MAN_END
+
+MAN_BEGIN (U"Create simple Matrix...", U"ppgb", 20021204)
+INTRO (U"A command in the @@New menu@ to create a @Matrix with the specified number of rows and columns, "
 	"filled with values from a formula (see @@Matrix: Formula...@).")
 MAN_END
 
-MAN_BEGIN (L"Create Strings as directory list...", L"ppgb", 20060919)
-INTRO (L"A command in the @@New menu@ to create a @Strings object containing a list of directories in a given parent directory. "
+MAN_BEGIN (U"Create Strings as directory list...", U"ppgb", 20060919)
+INTRO (U"A command in the @@New menu@ to create a @Strings object containing a list of directories in a given parent directory. "
 	"It works completely analogously to @@Create Strings as file list... at .")
 MAN_END
 
-MAN_BEGIN (L"Create Strings as file list...", L"ppgb", 20140107)
-INTRO (L"A command in the @@New menu@ to create a @Strings object containing a list of files in a given directory.")
-ENTRY (L"Settings")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (2.6), L""
+MAN_BEGIN (U"Create Strings as file list...", U"ppgb", 20150713)
+INTRO (U"A command in the @@New menu@ to create a @Strings object containing a list of files in a given directory.")
+ENTRY (U"Settings")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (2.6), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Create Strings as file list", 2.6)
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Name", "fileList")
 	Manual_DRAW_SETTINGS_WINDOW_TEXT ("File path", "/Users/miep/Sounds/*.wav")
 )
-TAG (L"##Name")
-DEFINITION (L"the name of the resulting Strings object.")
-TAG (L"##File path")
-DEFINITION (L"the directory name, with an optional %wildcard (see below) for selecting files.")
-ENTRY (L"Behaviour")
-NORMAL (L"The resulting Strings object will contain an alphabetical list of file names, "
+TAG (U"##Name")
+DEFINITION (U"the name of the resulting Strings object.")
+TAG (U"##File path")
+DEFINITION (U"the directory name, with an optional %wildcard (see below) for selecting files.")
+ENTRY (U"Behaviour")
+NORMAL (U"The resulting Strings object will contain an alphabetical list of file names, "
 	"without the preceding path through the directory structures. If there are no files that match the file path, "
 	"the Strings object will contain no strings.")
-ENTRY (L"Usage")
-NORMAL (L"There are two ways to specify the file path.")
-NORMAL (L"One way is to specify a directory name only. On Unix, the file path could be "
+ENTRY (U"Usage")
+NORMAL (U"There are two ways to specify the file path.")
+NORMAL (U"One way is to specify a directory name only. On Unix, the file path could be "
 	"##/usr/people/miep/sounds# or ##/usr/people/miep/sounds/#, for instance. On Windows, "
-	"##C:\\bsDocuments and Settings\\bsMiep\\bsSounds# or ##C:\\bsDocuments and Settings\\bsMiep\\bsSounds\\bs#. "
+	"##C:\\bsUsers\\bsMiep\\bsSounds# or ##C:\\bsUsers\\bsMiep\\bsSounds\\bs#. "
 	"On Macintosh, ##/Users/miep/Sounds# or ##/Users/miep/Sounds/#. Any of these produce "
 	"a list of all the files in the specified directory.")
-NORMAL (L"The other way is to specify a wildcard (a single asterisk) for the file names. "
+NORMAL (U"The other way is to specify a wildcard (a single asterisk) for the file names. "
 	"To get a list of all the files whose names start with \"hal\" and end in \".wav\", "
-	"type ##/usr/people/miep/sounds/hal*.wav#, ##C:\\bsDocuments and Settings\\bsMiep\\bsSounds\\bshal*.wav#, "
+	"type ##/usr/people/miep/sounds/hal*.wav#, ##C:\\bsUsers\\bsMiep\\bsSounds\\bshal*.wav#, "
 	"or ##/Users/miep/Sounds/hal*.wav#.")
-ENTRY (L"Script usage")
-NORMAL (L"In a script, you can use this command to cycle through the files in a directory. "
+ENTRY (U"Script usage")
+NORMAL (U"In a script, you can use this command to cycle through the files in a directory. "
 	"For instance, to read in all the sound files in a specified directory, "
 	"you could use the following script:")
-CODE (L"directory\\$  = \"/usr/people/miep/sounds\"")
-CODE (L"strings = Create Strings as file list: \"list\", directory\\$  + \"/*.wav\"")
-CODE (L"numberOfFiles = Get number of strings")
-CODE (L"for ifile to numberOfFiles")
-	CODE1 (L"selectObject: strings")
-	CODE1 (L"fileName\\$  = Get string: ifile")
-	CODE1 (L"Read from file: directory\\$  + \"/\" + fileName\\$ ")
-CODE (L"endfor")
-NORMAL (L"If the script has been saved to a script file, you can use file paths that are relative to the directory "
+CODE (U"directory\\$  = \"/usr/people/miep/sounds\"")
+CODE (U"strings = Create Strings as file list: \"list\", directory\\$  + \"/*.wav\"")
+CODE (U"numberOfFiles = Get number of strings")
+CODE (U"for ifile to numberOfFiles")
+	CODE1 (U"selectObject: strings")
+	CODE1 (U"fileName\\$  = Get string: ifile")
+	CODE1 (U"Read from file: directory\\$  + \"/\" + fileName\\$ ")
+CODE (U"endfor")
+NORMAL (U"If the script has been saved to a script file, you can use file paths that are relative to the directory "
 	"where you saved the script. Thus, with")
-CODE (L"Create Strings as file list: \"list\", \"*.wav\"")
-NORMAL (L"you get a list of all the .wav files that are in the same directory as the script that contains this line. "
+CODE (U"Create Strings as file list: \"list\", \"*.wav\"")
+NORMAL (U"you get a list of all the .wav files that are in the same directory as the script that contains this line. "
 	"And to get a list of all the .wav files in the directory Sounds that resides in the same directory as your script, "
 	"you can do")
-CODE (L"Create Strings as file list: \"list\", \"Sounds/*.wav\"")
-NORMAL (L"As is usual in Praat scripting, the forward slash (\"/\") in this example can be used on all platforms, including Windows. "
+CODE (U"Create Strings as file list: \"list\", \"Sounds/*.wav\"")
+NORMAL (U"As is usual in Praat scripting, the forward slash (\"/\") in this example can be used on all platforms, including Windows. "
 	"This makes your script portable across platforms.")
-ENTRY (L"See also")
-NORMAL (L"To get a list of directories instead of files, use @@Create Strings as directory list... at .")
+ENTRY (U"See also")
+NORMAL (U"To get a list of directories instead of files, use @@Create Strings as directory list... at .")
 MAN_END
 
-MAN_BEGIN (L"Distributions", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat. Inherits most actions from @TableOfReal.")
-ENTRY (L"Actions")
-LIST_ITEM (L"@@Distributions: To Strings...@")
+MAN_BEGIN (U"Distributions", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat. Inherits most actions from @TableOfReal.")
+ENTRY (U"Actions")
+LIST_ITEM (U"@@Distributions: To Strings...@")
 MAN_END
 
-MAN_BEGIN (L"Distributions: To Strings...", L"ppgb", 19971022)
-INTRO (L"A command to create a @Strings object from every selected @Distributions object.")
-ENTRY (L"Settings")
-TAG (L"##Column number")
-DEFINITION (L"the column (in the #Distributions object) that contains the distribution that you are "
+MAN_BEGIN (U"Distributions: To Strings...", U"ppgb", 19971022)
+INTRO (U"A command to create a @Strings object from every selected @Distributions object.")
+ENTRY (U"Settings")
+TAG (U"##Column number")
+DEFINITION (U"the column (in the #Distributions object) that contains the distribution that you are "
 	"interested in. Often the #Distributions object will only contain a single distribution, "
 	"so this argument will often be 1. If the #Distributions object contains nine distributions, "
 	"specify any number between 1 and 9.")
-TAG (L"##Number of strings")
-DEFINITION (L"the number of times a string will be drawn from the chosen distribution. "
+TAG (U"##Number of strings")
+DEFINITION (U"the number of times a string will be drawn from the chosen distribution. "
 	"This is the number of strings that the resulting @Strings object is going to contain.")
-ENTRY (L"Behaviour")
-NORMAL (L"Every string in the resulting #Strings object will be a row label of the #Distributions object. "
+ENTRY (U"Behaviour")
+NORMAL (U"Every string in the resulting #Strings object will be a row label of the #Distributions object. "
 	"The number in each row at the specified column will be considered the relative frequency of "
 	"occurrence of that row.")
-NORMAL (L"%#Example. Suppose we have the following #Distributions:")
-CODE (L"File type = \"ooTextFile\"")
-CODE (L"Object class = \"Distributions\"")
-CODE (L"2 (number of columns)")
-CODE (L"         \"English\"  \"French\" (column labels)")
-CODE (L"3 (number of rows)")
-CODE (L"\"the\"     108        1.5")
-CODE (L"\"a\"       58.1       33")
-CODE (L"\"pour\"    0.7        15.5")
-NORMAL (L"If you set %Column to 1 and %%Number of strings% to 1000, "
+NORMAL (U"%#Example. Suppose we have the following #Distributions:")
+CODE (U"File type = \"ooTextFile\"")
+CODE (U"Object class = \"Distributions\"")
+CODE (U"2 (number of columns)")
+CODE (U"         \"English\"  \"French\" (column labels)")
+CODE (U"3 (number of rows)")
+CODE (U"\"the\"     108        1.5")
+CODE (U"\"a\"       58.1       33")
+CODE (U"\"pour\"    0.7        15.5")
+NORMAL (U"If you set %Column to 1 and %%Number of strings% to 1000, "
 	"you will get a @Strings object with approximately 647 occurrences of \"the\", "
 	"348 occurrences of \"a\", and 4 occurrences of \"pour\". "
 	"If you had set %Column to 2 (\"French\"), you would have gotten about "
@@ -292,8 +292,8 @@ NORMAL (L"If you set %Column to 1 and %%Number of strings% to 1000, "
 	"The actual numbers will vary because the choice of a string will not depend on previous choices.")
 MAN_END
 
-MAN_BEGIN (L"DurationTier", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat. "
+MAN_BEGIN (U"DurationTier", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat. "
 	"A DurationTier object contains a number of (%time, %duration) points, "
 	"where %duration is to be interpreted as a relative duration (e.g. the duration of a manipulated sound "
 	"as compared to the duration of the original). For instance, "
@@ -303,133 +303,133 @@ INTRO (L"One of the @@types of objects@ in Praat. "
 	"a relative duration of 0.6 (i.e. a speeding up) for all original times after 1.1 seconds, "
 	"and a linear interpolation between 0.5 and 1.1 seconds (e.g. a relative duration of "
 	"1.2 at 0.7 seconds, and of 0.9 at 0.9 seconds).")
-NORMAL (L"See @@Intro 8.2. Manipulation of duration@ and @@Create DurationTier... at .")
+NORMAL (U"See @@Intro 8.2. Manipulation of duration@ and @@Create DurationTier... at .")
 MAN_END
 
-MAN_BEGIN (L"DurationTier: Add point...", L"ppgb", 20030216)
-INTRO (L"A command to add a point to each selected @DurationTier. "
+MAN_BEGIN (U"DurationTier: Add point...", U"ppgb", 20030216)
+INTRO (U"A command to add a point to each selected @DurationTier. "
 	"For an example, see @@Create DurationTier... at .")
-ENTRY (L"Settings")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which a point is to be added.")
-TAG (L"##Relative duration")
-DEFINITION (L"the relative duration value of the requested new point.")
-ENTRY (L"Behaviour")
-NORMAL (L"The tier is modified so that it contains the new point. "
+ENTRY (U"Settings")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which a point is to be added.")
+TAG (U"##Relative duration")
+DEFINITION (U"the relative duration value of the requested new point.")
+ENTRY (U"Behaviour")
+NORMAL (U"The tier is modified so that it contains the new point. "
 	"If a point at the specified time was already present in the tier, nothing happens.")
 MAN_END
 
-MAN_BEGIN (L"DurationTier: Get target duration...", L"ppgb", 20101228)
-INTRO (L"A @query to the selected @DurationTier for the target duration of a specified time range.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the start and end of the (original) time range.")
-ENTRY (L"Return value")
-NORMAL (L"the target duration in seconds.")
+MAN_BEGIN (U"DurationTier: Get target duration...", U"ppgb", 20101228)
+INTRO (U"A @query to the selected @DurationTier for the target duration of a specified time range.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the start and end of the (original) time range.")
+ENTRY (U"Return value")
+NORMAL (U"the target duration in seconds.")
 MAN_END
 
-MAN_BEGIN (L"DurationTierEditor", L"ppgb", 20110128)
-INTRO (L"One of the @editors in the Praat program, for viewing and editing a @DurationTier object. "
+MAN_BEGIN (U"DurationTierEditor", U"ppgb", 20110128)
+INTRO (U"One of the @editors in the Praat program, for viewing and editing a @DurationTier object. "
 	"To create a DurationTierEditor window, select a DurationTier and click ##View & Edit#.")
 MAN_END
 
-MAN_BEGIN (L"Editors", L"ppgb", 20110128)
-INTRO (L"Many @@types of objects@ in Praat can be viewed and edited in their own windows.")
-ENTRY (L"Editor windows")
-LIST_ITEM (L"• @SoundEditor")
-LIST_ITEM (L"• @LongSoundEditor")
-LIST_ITEM (L"• @TextGridEditor")
-LIST_ITEM (L"• @ManipulationEditor")
-LIST_ITEM (L"• @SpectrumEditor")
-LIST_ITEM (L"• @PitchEditor")
-LIST_ITEM (L"• @PointEditor")
-LIST_ITEM (L"• @PitchTierEditor")
-LIST_ITEM (L"• @IntensityTierEditor")
-LIST_ITEM (L"• @DurationTierEditor")
-LIST_ITEM (L"• #SpectrogramEditor")
-LIST_ITEM (L"• #ArtwordEditor")
-LIST_ITEM (L"• @OTGrammarEditor")
-LIST_ITEM (L"• (any type: @Inspect)")
-ENTRY (L"How to open an editor for an object")
-NORMAL (L"To open an editor window for an object in the list, select the object and choose ##View & Edit# "
+MAN_BEGIN (U"Editors", U"ppgb", 20110128)
+INTRO (U"Many @@types of objects@ in Praat can be viewed and edited in their own windows.")
+ENTRY (U"Editor windows")
+LIST_ITEM (U"• @SoundEditor")
+LIST_ITEM (U"• @LongSoundEditor")
+LIST_ITEM (U"• @TextGridEditor")
+LIST_ITEM (U"• @ManipulationEditor")
+LIST_ITEM (U"• @SpectrumEditor")
+LIST_ITEM (U"• @PitchEditor")
+LIST_ITEM (U"• @PointEditor")
+LIST_ITEM (U"• @PitchTierEditor")
+LIST_ITEM (U"• @IntensityTierEditor")
+LIST_ITEM (U"• @DurationTierEditor")
+LIST_ITEM (U"• #SpectrogramEditor")
+LIST_ITEM (U"• #ArtwordEditor")
+LIST_ITEM (U"• @OTGrammarEditor")
+LIST_ITEM (U"• (any type: @Inspect)")
+ENTRY (U"How to open an editor for an object")
+NORMAL (U"To open an editor window for an object in the list, select the object and choose ##View & Edit# "
 	"(if the ##View & Edit# button exists, it is usually at the top of the @@Dynamic menu@). "
 	"The name of the object will appear as the title of the editor window.")
-NORMAL (L"Objects that cannot be modified (e.g. LongSound) just have the command #View instead of ##View & Edit#.")
-ENTRY (L"General behaviour")
-NORMAL (L"Changes that you make to an object in its editor window will take effect immediately. "
+NORMAL (U"Objects that cannot be modified (e.g. LongSound) just have the command #View instead of ##View & Edit#.")
+ENTRY (U"General behaviour")
+NORMAL (U"Changes that you make to an object in its editor window will take effect immediately. "
 	"For instance, you do not have close the editor window before saving the changed object to disk.")
-NORMAL (L"If you @Remove an object that you are viewing or editing from the @@List of Objects@, "
+NORMAL (U"If you @Remove an object that you are viewing or editing from the @@List of Objects@, "
 	"the editor window will automatically disappear from the screen.")
-NORMAL (L"All editors are independent windows: you can minimize and maximize them; "
+NORMAL (U"All editors are independent windows: you can minimize and maximize them; "
 	"if an editor window goes hiding behind another window, "
 	"you can raise it by choosing the ##View & Edit# command again.")
-NORMAL (L"If you rename an object that you are viewing or editing (with @@Rename...@), "
+NORMAL (U"If you rename an object that you are viewing or editing (with @@Rename...@), "
 	"the title of the editor window immediately changes to the new name.")
-ENTRY (L"Ways to control an editor window")
-LIST_ITEM (L"• @@Click")
-LIST_ITEM (L"• @@Shift-click")
-LIST_ITEM (L"• @@Drag")
-LIST_ITEM (L"• @@Shift-drag")
-LIST_ITEM (L"• @@Time selection")
-LIST_ITEM (L"• @@Keyboard shortcuts")
+ENTRY (U"Ways to control an editor window")
+LIST_ITEM (U"• @@Click")
+LIST_ITEM (U"• @@Shift-click")
+LIST_ITEM (U"• @@Drag")
+LIST_ITEM (U"• @@Shift-drag")
+LIST_ITEM (U"• @@Time selection")
+LIST_ITEM (U"• @@Keyboard shortcuts")
 MAN_END
 
-MAN_BEGIN (L"Excitation", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat. It represents the excitation pattern "
+MAN_BEGIN (U"Excitation", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat. It represents the excitation pattern "
 	"of the basilar membrane in the inner ear.")
-ENTRY (L"Inside an Excitation object")
-NORMAL (L"With @Inspect, you will see the following attributes.")
-TAG (L"%xmin = 0")
-DEFINITION (L"minimum place or frequency (Bark).")
-TAG (L"%xmax = 25.6 Bark")
-DEFINITION (L"maximum place or frequency (Bark).")
-TAG (L"%nx")
-DEFINITION (L"number of places or frequencies.")
-TAG (L"%dx = 25.6 / %nx")
-DEFINITION (L"Place or frequency step (Bark).")
-TAG (L"%x1 = %dx / 2")
-DEFINITION (L"centre of first place or frequency band (Bark).")
-TAG (L"%ymin = %ymax = %dy = %y__1_ = 1; %ny = 1")
-DEFINITION (L"dummies.")
-TAG (L"%z [1]")
-DEFINITION (L"intensity (sensation level) in phon.")
-MAN_END
-
-MAN_BEGIN (L"Excitation: Formula...", L"ppgb", 20021206)
-INTRO (L"A command for changing the data in all selected @Excitation objects.")
-NORMAL (L"See the @Formulas tutorial for examples and explanations.")
-MAN_END
-
-MAN_BEGIN (L"Excitation: Get loudness", L"ppgb", 19991016)
-INTRO (L"A @query to ask the selected @Excitation object for its loudness.")
-ENTRY (L"Return value")
-NORMAL (L"the loudness in sone units.")
-ENTRY (L"Algorithm")
-NORMAL (L"The loudness is defined as")
-FORMULA (L"∫%df 2^^(%e(%f) - 40 phon) / 10^")
-NORMAL (L"where %f is the frequency in Bark, and %e(%f) the excitation in phon. "
+ENTRY (U"Inside an Excitation object")
+NORMAL (U"With @Inspect, you will see the following attributes.")
+TAG (U"%xmin = 0")
+DEFINITION (U"minimum place or frequency (Bark).")
+TAG (U"%xmax = 25.6 Bark")
+DEFINITION (U"maximum place or frequency (Bark).")
+TAG (U"%nx")
+DEFINITION (U"number of places or frequencies.")
+TAG (U"%dx = 25.6 / %nx")
+DEFINITION (U"Place or frequency step (Bark).")
+TAG (U"%x1 = %dx / 2")
+DEFINITION (U"centre of first place or frequency band (Bark).")
+TAG (U"%ymin = %ymax = %dy = %y__1_ = 1; %ny = 1")
+DEFINITION (U"dummies.")
+TAG (U"%z [1]")
+DEFINITION (U"intensity (sensation level) in phon.")
+MAN_END
+
+MAN_BEGIN (U"Excitation: Formula...", U"ppgb", 20021206)
+INTRO (U"A command for changing the data in all selected @Excitation objects.")
+NORMAL (U"See the @Formulas tutorial for examples and explanations.")
+MAN_END
+
+MAN_BEGIN (U"Excitation: Get loudness", U"ppgb", 19991016)
+INTRO (U"A @query to ask the selected @Excitation object for its loudness.")
+ENTRY (U"Return value")
+NORMAL (U"the loudness in sone units.")
+ENTRY (U"Algorithm")
+NORMAL (U"The loudness is defined as")
+FORMULA (U"∫%df 2^^(%e(%f) - 40 phon) / 10^")
+NORMAL (U"where %f is the frequency in Bark, and %e(%f) the excitation in phon. "
 	"For our discrete Excitation object, the loudness is computed as")
-FORMULA (L"Δ%f ∑ 2^^(%e__%i_ - 40) / 10")
-NORMAL (L"where Δ%f is the distance between the excitation channels (in Bark).")
+FORMULA (U"Δ%f ∑ 2^^(%e__%i_ - 40) / 10")
+NORMAL (U"where Δ%f is the distance between the excitation channels (in Bark).")
 MAN_END
 
-MAN_BEGIN (L"Excitation_hertzToBark", L"ppgb", 19970401)
-INTRO (L"A routine for converting frequency into basilar place, "
+MAN_BEGIN (U"Excitation_hertzToBark", U"ppgb", 19970401)
+INTRO (U"A routine for converting frequency into basilar place, "
 	"the inverse of @Excitation_barkToHertz.")
-ENTRY (L"Syntax")
-PROTOTYPE (L"##double Excitation_hertzToBark (double #%hertz##);")
-ENTRY (L"Algorithm")
-NORMAL (L"Returns 7 · ln (%hertz / 650 + √ (1 + (%hertz / 650)^2)).")
+ENTRY (U"Syntax")
+PROTOTYPE (U"##double Excitation_hertzToBark (double #%hertz##);")
+ENTRY (U"Algorithm")
+NORMAL (U"Returns 7 · ln (%hertz / 650 + √ (1 + (%hertz / 650)^2)).")
 MAN_END
 
-MAN_BEGIN (L"Excitation_barkToHertz", L"ppgb", 19970401)
-INTRO (L"A routine for converting basilar place into frequency, "
+MAN_BEGIN (U"Excitation_barkToHertz", U"ppgb", 19970401)
+INTRO (U"A routine for converting basilar place into frequency, "
 	"the inverse of @Excitation_hertzToBark.")
-ENTRY (L"Syntax")
-PROTOTYPE (L"##double Excitation_barkToHertz (double #%bark##);")
-ENTRY (L"Algorithm")
-NORMAL (L"Returns 650 · sinh (%bark / 7).")
+ENTRY (U"Syntax")
+PROTOTYPE (U"##double Excitation_barkToHertz (double #%bark##);")
+ENTRY (U"Algorithm")
+NORMAL (U"Returns 650 · sinh (%bark / 7).")
 MAN_END
 
 /*
@@ -438,7 +438,7 @@ Uses auditory filter (width apx. 1 Bark) for masking.
 
 Excitation Excitation_create (double df, long nf);
 	Function:
-		return a new instance of Excitation, or NULL if out of memory.
+		return a new instance of Excitation.
 	Preconditions:
 		df > 0.0;
 		nf >= 1;
@@ -457,11 +457,9 @@ Matrix Excitation_to_Matrix (Excitation me);
 	Function:
 		Create a Matrix from an Excitation,
 		with deep copy of all of its Matrix attributes, except class information and methods.
-	Return NULL if out of memory.  
 Excitation Matrix_to_Excitation (Matrix me);
 	Function:
 		create an Excitation from a Matrix.
-		Return NULL if out of memory.
 	Postconditions:
 		thy xmin == 0.0;
 		thy xmax == my nx / (1 / my dx);
@@ -480,649 +478,649 @@ Excitation Matrix_to_Excitation (Matrix me);
 "   select a Polygon, click on `To Matrix', click on `Formula...',\n"
 "   type \"self * if row=1 then 1 else self fi\", click on `To Polygon'."*/
 
-MAN_BEGIN (L"Formula...", L"ppgb", 19980319)
-NORMAL (L"See @@Matrix: Formula...@")
+MAN_BEGIN (U"Formula...", U"ppgb", 19980319)
+NORMAL (U"See @@Matrix: Formula...@")
 MAN_END
 
-MAN_BEGIN (L"Frequency selection", L"ppgb", 20010402)
-INTRO (L"The way to select a frequency domain in the @SpectrumEditor. "
+MAN_BEGIN (U"Frequency selection", U"ppgb", 20010402)
+INTRO (U"The way to select a frequency domain in the @SpectrumEditor. "
 	"This works completely analogously to the @@time selection@ in other editors.")
 MAN_END
 
-MAN_BEGIN (L"Get area...", L"ppgb", 20030216)
-INTRO (L"A @query to the selected tier object (@PitchTier, @IntensityTier, @DurationTier).")
-ENTRY (L"Return value")
-NORMAL (L"the area under the curve.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored. "
+MAN_BEGIN (U"Get area...", U"ppgb", 20030216)
+INTRO (U"A @query to the selected tier object (@PitchTier, @IntensityTier, @DurationTier).")
+ENTRY (U"Return value")
+NORMAL (U"the area under the curve.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the tier is considered.")
-ENTRY (L"Algorithm")
-NORMAL (L"The curve consists of a sequence of line segments. The contribution of the line segment from "
+ENTRY (U"Algorithm")
+NORMAL (U"The curve consists of a sequence of line segments. The contribution of the line segment from "
 	"(%t__1_, %f__1_) to (%t__2_, %f__2_) to the area is")
-FORMULA (L"1/2 (%f__1_ + %f__2_) (%t__2_ – %t__1_)")
+FORMULA (U"1/2 (%f__1_ + %f__2_) (%t__2_ – %t__1_)")
 MAN_END
 
-MAN_BEGIN (L"Intensity", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"An Intensity object represents an intensity contour at linearly spaced time points "
+MAN_BEGIN (U"Intensity", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"An Intensity object represents an intensity contour at linearly spaced time points "
 	"%t__%i_ = %t__1_ + (%i – 1) %dt, with values in dB SPL, i.e. dB relative to 2·10^^-5^ Pascal, "
 	"which is the normative auditory threshold for a 1000-Hz sine wave.")
 MAN_END
 
-MAN_BEGIN (L"Intensity: Get maximum...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Intensity object.")
-ENTRY (L"Return value")
-NORMAL (L"the maximum value within the specified time domain, expressed in dB.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+MAN_BEGIN (U"Intensity: Get maximum...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Intensity object.")
+ENTRY (U"Return value")
+NORMAL (U"the maximum value within the specified time domain, expressed in dB.")
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Intensity is considered.")
-TAG (L"%%Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"%%Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is Parabolic because of the usual nonlinearity (logarithm) in the computation of intensity; "
 	"sinc interpolation would be too stiff and may give unexpected results.")
 MAN_END
 
-MAN_BEGIN (L"Intensity: Get mean...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Intensity object.")
-ENTRY (L"Return value")
-NORMAL (L"the mean (in dB) of the intensity values of the frames within a specified time domain.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+MAN_BEGIN (U"Intensity: Get mean...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Intensity object.")
+ENTRY (U"Return value")
+NORMAL (U"the mean (in dB) of the intensity values of the frames within a specified time domain.")
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Intensity is considered.")
-TAG (L"##Averaging method")
-DEFINITION (L"the units in which the averaging is performed. If the method is #energy, "
+TAG (U"##Averaging method")
+DEFINITION (U"the units in which the averaging is performed. If the method is #energy, "
 	"the returned dB value is based on the mean power (in Pa^2/s) between %t__1_ and %t__2_. "
 	"If the method is #dB, the returned value is the mean of the intensity curve in dB. "
 	"If the method is #sones, the returned value is in between these two, "
 	"and based on averaging properties of the human ear.")
-ENTRY (L"Algorithm")
-NORMAL (L"If the averaging method is #dB, the mean intensity between the times %t__1_ and %t__2_ is defined as")
-FORMULA (L"1/(%t__2_ - %t__1_)  ∫__%%t%1_^^%%t%2^ %x(%t) %dt")
-NORMAL (L"where %x(%t) is the intensity as a function of time, in dB. If the method is #energy, the result is")
-FORMULA (L"10 log__10_ { 1/(%t__2_ - %t__1_)  ∫__%%t%1_^^%%t%2^ 10^^%x(%t)/10^ %dt }")
-NORMAL (L"If the method is #sones, the result is")
-FORMULA (L"10 log__2_ { 1/(%t__2_ - %t__1_)  ∫__%%t%1_^^%%t%2^ 2^^%x(%t)/10^ %dt }")
-ENTRY (L"Behaviour")
-NORMAL (L"After you do @@Sound: To Intensity...@, the mean intensity of the resulting #Intensity, "
+ENTRY (U"Algorithm")
+NORMAL (U"If the averaging method is #dB, the mean intensity between the times %t__1_ and %t__2_ is defined as")
+FORMULA (U"1/(%t__2_ - %t__1_)  ∫__%%t%1_^^%%t%2^ %x(%t) %dt")
+NORMAL (U"where %x(%t) is the intensity as a function of time, in dB. If the method is #energy, the result is")
+FORMULA (U"10 log__10_ { 1/(%t__2_ - %t__1_)  ∫__%%t%1_^^%%t%2^ 10^^%x(%t)/10^ %dt }")
+NORMAL (U"If the method is #sones, the result is")
+FORMULA (U"10 log__2_ { 1/(%t__2_ - %t__1_)  ∫__%%t%1_^^%%t%2^ 2^^%x(%t)/10^ %dt }")
+ENTRY (U"Behaviour")
+NORMAL (U"After you do @@Sound: To Intensity...@, the mean intensity of the resulting #Intensity, "
 	"if the averaging method is #energy, should be close to the mean SPL of the original #Sound, "
 	"which can be found with #Info.")
 MAN_END
 
-MAN_BEGIN (L"Intensity: Get minimum...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Intensity object.")
-ENTRY (L"Return value")
-NORMAL (L"the minimum value within a specified time domain, expressed in dB.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+MAN_BEGIN (U"Intensity: Get minimum...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Intensity object.")
+ENTRY (U"Return value")
+NORMAL (U"the minimum value within a specified time domain, expressed in dB.")
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Intensity is considered.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is Parabolic because of the usual nonlinearity (logarithm) in the computation of intensity; "
 	"sinc interpolation would be too stiff and may give unexpected results.")
 MAN_END
 
-MAN_BEGIN (L"Intensity: Get standard deviation...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Intensity object.")
-ENTRY (L"Return value")
-NORMAL (L"the standard deviation (in dB) of the intensity values of the frames within a specified time domain.")
-ENTRY (L"Settings")
-TAG (L"%%Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+MAN_BEGIN (U"Intensity: Get standard deviation...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Intensity object.")
+ENTRY (U"Return value")
+NORMAL (U"the standard deviation (in dB) of the intensity values of the frames within a specified time domain.")
+ENTRY (U"Settings")
+TAG (U"%%Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Intensity is considered.")
-ENTRY (L"Algorithm")
-NORMAL (L"The standard deviation between the times %t__1_ and %t__2_ is defined as")
-FORMULA (L"√ {1/(%t__2_ - %t__1_)  ∫__%%t%1_^^%%t%2^ %dt (%x(%t) - %μ)^2}")
-NORMAL (L"where %x(%t) is the intensity (in dB) as a function of time, and %μ its mean. "
+ENTRY (U"Algorithm")
+NORMAL (U"The standard deviation between the times %t__1_ and %t__2_ is defined as")
+FORMULA (U"√ {1/(%t__2_ - %t__1_)  ∫__%%t%1_^^%%t%2^ %dt (%x(%t) - %μ)^2}")
+NORMAL (U"where %x(%t) is the intensity (in dB) as a function of time, and %μ its mean. "
 	"For our discrete Intensity object, the standard deviation is approximated by")
-FORMULA (L"√ {1/(%n-1) ∑__%i=%m..%m+%n-1_ (%x__%i_ - %μ)^2}")
-NORMAL (L"where %n is the number of frames between %t__1_ and %t__2_. Note the \"minus 1\".")
+FORMULA (U"√ {1/(%n-1) ∑__%i=%m..%m+%n-1_ (%x__%i_ - %μ)^2}")
+NORMAL (U"where %n is the number of frames between %t__1_ and %t__2_. Note the \"minus 1\".")
 MAN_END
 
-MAN_BEGIN (L"Intensity: Get time of maximum...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Intensity object.")
-ENTRY (L"Return value")
-NORMAL (L"the time (in seconds) associated with the maximum intensity within a specified time domain.")
-ENTRY (L"Settings")
-TAG (L"%%Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
+MAN_BEGIN (U"Intensity: Get time of maximum...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Intensity object.")
+ENTRY (U"Return value")
+NORMAL (U"the time (in seconds) associated with the maximum intensity within a specified time domain.")
+ENTRY (U"Settings")
+TAG (U"%%Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Intensity is considered.")
-TAG (L"%%Interpolation")
-DEFINITION (L"the interpolation method (None, Parabolic, Cubic, Sinc) of the @@vector peak interpolation at . "
+TAG (U"%%Interpolation")
+DEFINITION (U"the interpolation method (None, Parabolic, Cubic, Sinc) of the @@vector peak interpolation at . "
 	"The standard is Parabolic because of the usual nonlinearity (logarithm) in the computation of intensity; "
 	"sinc interpolation would be too stiff and may give unexpected results.")
 MAN_END
 
-MAN_BEGIN (L"Intensity: Get time of minimum...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Intensity object.")
-ENTRY (L"Return value")
-NORMAL (L"the time (in seconds) associated with the minimum intensity within a specified time domain.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
+MAN_BEGIN (U"Intensity: Get time of minimum...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Intensity object.")
+ENTRY (U"Return value")
+NORMAL (U"the time (in seconds) associated with the minimum intensity within a specified time domain.")
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Intensity is considered.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (None, Parabolic, Cubic, Sinc) of the @@vector peak interpolation at . "
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (None, Parabolic, Cubic, Sinc) of the @@vector peak interpolation at . "
 	"The standard is Parabolic because of the usual nonlinearity (logarithm) in the computation of intensity; "
 	"sinc interpolation would be too stiff and may give unexpected results.")
 MAN_END
 
-MAN_BEGIN (L"Intensity: Get value at time...", L"ppgb", 20030916)
-INTRO (L"A @query to the selected @Intensity object.")
-ENTRY (L"Return value")
-NORMAL (L"the intensity (in dB) at a specified time. If %time is outside the frames of the Intensity, the result is 0.")
-ENTRY (L"Settings")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which the value is to be evaluated.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method, see @@vector value interpolation at . "
+MAN_BEGIN (U"Intensity: Get value at time...", U"ppgb", 20030916)
+INTRO (U"A @query to the selected @Intensity object.")
+ENTRY (U"Return value")
+NORMAL (U"the intensity (in dB) at a specified time. If %time is outside the frames of the Intensity, the result is 0.")
+ENTRY (U"Settings")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which the value is to be evaluated.")
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method, see @@vector value interpolation at . "
 	"The standard is Cubic because of the usual nonlinearity (logarithm) in the computation of intensity; "
 	"sinc interpolation would be too stiff and may give unexpected results.")
 MAN_END
 
-MAN_BEGIN (L"Intensity: Get value in frame...", L"ppgb", 19991016)
-INTRO (L"A @query to the selected @Intensity object.")
-ENTRY (L"Setting")
-TAG (L"##Frame number")
-DEFINITION (L"the frame whose value is to be looked up.")
-ENTRY (L"Return value")
-NORMAL (L"the intensity value (in dB) in the specified frame. "
+MAN_BEGIN (U"Intensity: Get value in frame...", U"ppgb", 19991016)
+INTRO (U"A @query to the selected @Intensity object.")
+ENTRY (U"Setting")
+TAG (U"##Frame number")
+DEFINITION (U"the frame whose value is to be looked up.")
+ENTRY (U"Return value")
+NORMAL (U"the intensity value (in dB) in the specified frame. "
 	"If the index is less than 1 or greater than the number of frames, the result is 0; "
 	"otherwise, it is %z [1] [%%frame number%].")
 MAN_END
 
-MAN_BEGIN (L"Intensity: To IntensityTier", L"ppgb", 19970321)
-INTRO (L"A command to convert each selected @Intensity object to an @IntensityTier.")
-ENTRY (L"Behaviour")
-NORMAL (L"Every sample in the @Intensity object is copied to a point on the @IntensityTier.")
-ENTRY (L"Postconditions")
-DEFINITION (L"Equal time domains:")
-LIST_ITEM (L"• %result. %xmin == %intensity. %xmin")
-LIST_ITEM (L"• %result. %xmax == %intensity. %xmax")
-DEFINITION (L"Equal number of points:")
-LIST_ITEM (L"• %result. %points. %size == %intensity. %nx")
-NORMAL (L"For all points %i = 1 ... %intensity. %nx:")
-DEFINITION (L"   Explicit times:")
-LIST_ITEM (L"   • %result. %points. %item [%i]. %time == %intensity. %x1 + (%i – 1) * %intensity. %dx")
-DEFINITION (L"   Equal number of points:")
-LIST_ITEM (L"   • %result. %points. %item [%i]. %value == %intensity. %z [1] [%i]")
-MAN_END
-
-MAN_BEGIN (L"Intensity & PointProcess: To IntensityTier...", L"ppgb", 20101230)
-INTRO (L"A command to copy information from an @Intensity, at times specified by a @PointProcess, "
+MAN_BEGIN (U"Intensity: To IntensityTier", U"ppgb", 19970321)
+INTRO (U"A command to convert each selected @Intensity object to an @IntensityTier.")
+ENTRY (U"Behaviour")
+NORMAL (U"Every sample in the @Intensity object is copied to a point on the @IntensityTier.")
+ENTRY (U"Postconditions")
+DEFINITION (U"Equal time domains:")
+LIST_ITEM (U"• %result. %xmin == %intensity. %xmin")
+LIST_ITEM (U"• %result. %xmax == %intensity. %xmax")
+DEFINITION (U"Equal number of points:")
+LIST_ITEM (U"• %result. %points. %size == %intensity. %nx")
+NORMAL (U"For all points %i = 1 ... %intensity. %nx:")
+DEFINITION (U"   Explicit times:")
+LIST_ITEM (U"   • %result. %points. %item [%i]. %time == %intensity. %x1 + (%i – 1) * %intensity. %dx")
+DEFINITION (U"   Equal number of points:")
+LIST_ITEM (U"   • %result. %points. %item [%i]. %value == %intensity. %z [1] [%i]")
+MAN_END
+
+MAN_BEGIN (U"Intensity & PointProcess: To IntensityTier...", U"ppgb", 20101230)
+INTRO (U"A command to copy information from an @Intensity, at times specified by a @PointProcess, "
 	"to points on an @IntensityTier.")
-ENTRY (L"Behaviour")
-NORMAL (L"For all the times of the points in the PointProcess, an intensity is computed from the "
+ENTRY (U"Behaviour")
+NORMAL (U"For all the times of the points in the PointProcess, an intensity is computed from the "
 	"information in the Intensity object, by linear interpolation.")
 MAN_END
 
-MAN_BEGIN (L"IntensityTier", L"ppgb", 20101230)
-INTRO (L"One of the @@types of objects@ in Praat. "
+MAN_BEGIN (U"IntensityTier", U"ppgb", 20101230)
+INTRO (U"One of the @@types of objects@ in Praat. "
 	"An IntensityTier object represents a time-stamped intensity contour, i.e., it contains a series of (%time, %intensity) points. "
 	"The intensity values are in dB.")
-NORMAL (L"For examples, see @@Source-filter synthesis at .")
-ENTRY (L"IntensityTier commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"From scratch:")
-LIST_ITEM (L"• @@Create IntensityTier...")
-LIST_ITEM (L"• @@IntensityTier: Add point...")
-LIST_ITEM (L"Copy from another object:")
-LIST_ITEM (L"• @@Intensity: To IntensityTier@: trivial copying of linearly spaced points.")
-LIST_ITEM (L"• @@Intensity & PointProcess: To IntensityTier...@: copying interpolated values at specified points.")
-LIST_ITEM (L"• @@PointProcess: Up to IntensityTier...@: equal values at specified points.")
-NORMAL (L"Viewing and editing:")
-LIST_ITEM (L"• @IntensityTierEditor")
-NORMAL (L"Conversion:")
-LIST_ITEM (L"• @@IntensityTier: Down to PointProcess@: copy times.")
-NORMAL (L"Synthesis (see @@Source-filter synthesis@):")
-LIST_ITEM (L"• @@Sound & IntensityTier: Multiply@")
-NORMAL (L"Queries:")
-LIST_ITEM (L"• @@Get low index from time...")
-LIST_ITEM (L"• @@Get high index from time...")
-LIST_ITEM (L"• @@Get nearest index from time...")
-NORMAL (L"Modification:")
-LIST_ITEM (L"• @@Remove point...")
-LIST_ITEM (L"• @@Remove point near...")
-LIST_ITEM (L"• @@Remove points between...")
-LIST_ITEM (L"• @@IntensityTier: Add point...@")
-MAN_END
-
-MAN_BEGIN (L"IntensityTier: Add point...", L"ppgb", 20010410)
-INTRO (L"A command to add a point to each selected @IntensityTier.")
-ENTRY (L"Settings")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which a point is to be added.")
-TAG (L"##Intensity (dB)")
-DEFINITION (L"the intensity value of the requested new point.")
-ENTRY (L"Behaviour")
-NORMAL (L"The tier is modified so that it contains the new point. "
+NORMAL (U"For examples, see @@Source-filter synthesis at .")
+ENTRY (U"IntensityTier commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"From scratch:")
+LIST_ITEM (U"• @@Create IntensityTier...")
+LIST_ITEM (U"• @@IntensityTier: Add point...")
+LIST_ITEM (U"Copy from another object:")
+LIST_ITEM (U"• @@Intensity: To IntensityTier@: trivial copying of linearly spaced points.")
+LIST_ITEM (U"• @@Intensity & PointProcess: To IntensityTier...@: copying interpolated values at specified points.")
+LIST_ITEM (U"• @@PointProcess: Up to IntensityTier...@: equal values at specified points.")
+NORMAL (U"Viewing and editing:")
+LIST_ITEM (U"• @IntensityTierEditor")
+NORMAL (U"Conversion:")
+LIST_ITEM (U"• @@IntensityTier: Down to PointProcess@: copy times.")
+NORMAL (U"Synthesis (see @@Source-filter synthesis@):")
+LIST_ITEM (U"• @@Sound & IntensityTier: Multiply@")
+NORMAL (U"Queries:")
+LIST_ITEM (U"• @@Get low index from time...")
+LIST_ITEM (U"• @@Get high index from time...")
+LIST_ITEM (U"• @@Get nearest index from time...")
+NORMAL (U"Modification:")
+LIST_ITEM (U"• @@Remove point...")
+LIST_ITEM (U"• @@Remove point near...")
+LIST_ITEM (U"• @@Remove points between...")
+LIST_ITEM (U"• @@IntensityTier: Add point...@")
+MAN_END
+
+MAN_BEGIN (U"IntensityTier: Add point...", U"ppgb", 20010410)
+INTRO (U"A command to add a point to each selected @IntensityTier.")
+ENTRY (U"Settings")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which a point is to be added.")
+TAG (U"##Intensity (dB)")
+DEFINITION (U"the intensity value of the requested new point.")
+ENTRY (U"Behaviour")
+NORMAL (U"The tier is modified so that it contains the new point. "
 	"If a point at the specified time was already present in the tier, nothing happens.")
 MAN_END
 
-MAN_BEGIN (L"IntensityTier: Down to PointProcess", L"ppgb", 20010410)
-INTRO (L"A command to degrade every selected @IntensityTier to a @PointProcess.")
-ENTRY (L"Behaviour")
-NORMAL (L"The times of all the points are trivially copied, and so is the time domain. The intensity information is lost.")
+MAN_BEGIN (U"IntensityTier: Down to PointProcess", U"ppgb", 20010410)
+INTRO (U"A command to degrade every selected @IntensityTier to a @PointProcess.")
+ENTRY (U"Behaviour")
+NORMAL (U"The times of all the points are trivially copied, and so is the time domain. The intensity information is lost.")
 MAN_END
 
-MAN_BEGIN (L"IntensityTierEditor", L"ppgb", 20110128)
-INTRO (L"One of the @editors in the Praat program, for viewing and editing an @IntensityTier object. "
+MAN_BEGIN (U"IntensityTierEditor", U"ppgb", 20110128)
+INTRO (U"One of the @editors in the Praat program, for viewing and editing an @IntensityTier object. "
 	"To create a IntensityTierEditor window, select an IntensityTier and click ##View & Edit#.")
 MAN_END
 
-MAN_BEGIN (L"Keyboard shortcuts", L"ppgb", 20071016)
-INTRO (L"A way to accelerate the control of @Editors in Praat.")
-ENTRY (L"Purpose")
-NORMAL (L"to choose a menu command with the keyboard. All of these commands can also be chosen "
+MAN_BEGIN (U"Keyboard shortcuts", U"ppgb", 20071016)
+INTRO (U"A way to accelerate the control of @Editors in Praat.")
+ENTRY (U"Purpose")
+NORMAL (U"to choose a menu command with the keyboard. All of these commands can also be chosen "
 	"from a menu.")
-ENTRY (L"Command key")
-NORMAL (L"When mentioning the %%Command key%, this manual refers to the key that is marked with an apple on Apple keyboards "
+ENTRY (U"Command key")
+NORMAL (U"When mentioning the %%Command key%, this manual refers to the key that is marked with an apple on Apple keyboards "
 	"or to the key that is marked \"Ctrl\" if you are on a Windows or Linux computer.")
-ENTRY (L"Option key")
-NORMAL (L"When mentioning the %%Option key%, this manual refers to the key marked \"alt\" or \"option\". "
+ENTRY (U"Option key")
+NORMAL (U"When mentioning the %%Option key%, this manual refers to the key marked \"alt\" or \"option\". "
 	"In Praat, this key is sometimes used together with the Command key "
 	"for destructive actions that are the reverse of the actions invoked by using the Command key only. "
 	"For instance, if Command-T means \"add a target at the cursor position\", "
 	"Option-Command-T may mean \"remove the selected targets\".")
-ENTRY (L"Shortcuts")
-LIST_ITEM (L"Command-A: Zoom all")
-LIST_ITEM (L"Command-C: Copy (the selected text, or the selected sound, or the selected part of the Picture window)")
-LIST_ITEM (L"Command-D (in Manipulation window): Insert duration point at cursor")
-LIST_ITEM (L"Option-Command-D (in Manipulation window): Remove selected duration points")
-LIST_ITEM (L"Command-E (in Picture window): Erase all")
-LIST_ITEM (L"Shift-Command-H: Move cursor to maximum pitch")
-LIST_ITEM (L"Command-I: Zoom in")
-LIST_ITEM (L"Command-L (in Objects window): @@Open long sound file...@")
-LIST_ITEM (L"Command-L (in sound windows): @@Intro 3.6. Viewing a spectral slice|View spectral slice@")
-LIST_ITEM (L"Shift-Command-L: Move cursor to minimum pitch")
-LIST_ITEM (L"Command-M: Search Praat manual...")
-LIST_ITEM (L"Command-N: Zoom to selection")
-LIST_ITEM (L"Command-O (in Objects window): @@Read from file...@")
-LIST_ITEM (L"Command-O (in sound windows): Zoom out")
-LIST_ITEM (L"Command-P (in Picture window): Print")
-LIST_ITEM (L"Command-P (in Manipulation window): Add pulse at cursor")
-LIST_ITEM (L"Option-Command-P (in Manipulation window): Remove selected pulses")
-LIST_ITEM (L"Command-Q: Quit")
-LIST_ITEM (L"Command-R: Reverse selection")
-LIST_ITEM (L"Command-S: Save")
-LIST_ITEM (L"Command-T (in Manipulation window): Add pitch point at cursor")
-LIST_ITEM (L"Option-Command-T (in Manipulation window): Remove selected pitch points")
-LIST_ITEM (L"Command-U: @@Calculator...@")
-LIST_ITEM (L"Command-V: Paste (insert the text or sound clipboard over the selected text or the selected sound)")
-LIST_ITEM (L"Command-W: Close window")
-LIST_ITEM (L"Command-X: Cut (the selected text or the selected sound)")
-LIST_ITEM (L"Command-Y: Redo")
-LIST_ITEM (L"Command-Z: Undo")
-LIST_ITEM (L"Command-0: Move cursor to nearest zero crossing")
-LIST_ITEM (L"Command-2 (in Manipulation window): Stylize pitch (2 semitones)")
-LIST_ITEM (L"Command-4 (in Manipulation window): Interpolate quadratically (4 points)")
-LIST_ITEM (L"Shift-Command-?: Local help")
-LIST_ITEM (L"Command-,: Move start of selection to nearest zero crossing")
-LIST_ITEM (L"Command-.: Move end of selection to nearest zero crossing")
-LIST_ITEM (L"F5: Get pitch")
-LIST_ITEM (L"Command-F5: Get minimum pitch")
-LIST_ITEM (L"Shift-F5: Get maximum pitch")
-LIST_ITEM (L"F1: Get first formant")
-LIST_ITEM (L"F2: Get second formant")
-LIST_ITEM (L"F3: Get third formant")
-LIST_ITEM (L"F4: Get fourth formant")
-LIST_ITEM (L"F5: Get pitch")
-LIST_ITEM (L"F6: Get cursor")
-LIST_ITEM (L"F7: Get spectral power at cursor cross")
-LIST_ITEM (L"F8: Get intensity")
-LIST_ITEM (L"F12: Log 1")
-LIST_ITEM (L"Shift-F12: Log 2")
-LIST_ITEM (L"Option-F12: Log script 3")
-LIST_ITEM (L"Command-F12: Log script 4")
-LIST_ITEM (L"Tab (in sound windows): Play selection")
-LIST_ITEM (L"Shift-Tab (in sound windows): Play window")
-LIST_ITEM (L"Arrow-up (in sound windows): Select earlier")
-LIST_ITEM (L"Arrow-down (in sound windows): Select later")
-LIST_ITEM (L"Shift-Arrow-up (in sound windows): Move start of selection left")
-LIST_ITEM (L"Shift-Arrow-down (in sound windows): Move start of selection right")
-LIST_ITEM (L"Command-Arrow-up (in sound windows): Move end of selection left")
-LIST_ITEM (L"Command-Arrow-down (in sound windows): Move end of selection right")
-LIST_ITEM (L"Page-up (in sound windows): Scroll page back")
-LIST_ITEM (L"Page-down (in sound windows): Scroll page forward")
-LIST_ITEM (L"Escape: Interrupt playing")
-MAN_END
-
-MAN_BEGIN (L"Log files", L"ppgb", 20140421)
-INTRO (L"With some commands in the @Query menu of the @SoundEditor and @TextGridEditor, "
+ENTRY (U"Shortcuts")
+LIST_ITEM (U"Command-A: Zoom all")
+LIST_ITEM (U"Command-C: Copy (the selected text, or the selected sound, or the selected part of the Picture window)")
+LIST_ITEM (U"Command-D (in Manipulation window): Insert duration point at cursor")
+LIST_ITEM (U"Option-Command-D (in Manipulation window): Remove selected duration points")
+LIST_ITEM (U"Command-E (in Picture window): Erase all")
+LIST_ITEM (U"Shift-Command-H: Move cursor to maximum pitch")
+LIST_ITEM (U"Command-I: Zoom in")
+LIST_ITEM (U"Command-L (in Objects window): @@Open long sound file...@")
+LIST_ITEM (U"Command-L (in sound windows): @@Intro 3.6. Viewing a spectral slice|View spectral slice@")
+LIST_ITEM (U"Shift-Command-L: Move cursor to minimum pitch")
+LIST_ITEM (U"Command-M: Search Praat manual...")
+LIST_ITEM (U"Command-N: Zoom to selection")
+LIST_ITEM (U"Command-O (in Objects window): @@Read from file...@")
+LIST_ITEM (U"Command-O (in sound windows): Zoom out")
+LIST_ITEM (U"Command-P (in Picture window): Print")
+LIST_ITEM (U"Command-P (in Manipulation window): Add pulse at cursor")
+LIST_ITEM (U"Option-Command-P (in Manipulation window): Remove selected pulses")
+LIST_ITEM (U"Command-Q: Quit")
+LIST_ITEM (U"Command-R: Reverse selection")
+LIST_ITEM (U"Command-S: Save")
+LIST_ITEM (U"Command-T (in Manipulation window): Add pitch point at cursor")
+LIST_ITEM (U"Option-Command-T (in Manipulation window): Remove selected pitch points")
+LIST_ITEM (U"Command-U: @@Calculator...@")
+LIST_ITEM (U"Command-V: Paste (insert the text or sound clipboard over the selected text or the selected sound)")
+LIST_ITEM (U"Command-W: Close window")
+LIST_ITEM (U"Command-X: Cut (the selected text or the selected sound)")
+LIST_ITEM (U"Command-Y: Redo")
+LIST_ITEM (U"Command-Z: Undo")
+LIST_ITEM (U"Command-0: Move cursor to nearest zero crossing")
+LIST_ITEM (U"Command-2 (in Manipulation window): Stylize pitch (2 semitones)")
+LIST_ITEM (U"Command-4 (in Manipulation window): Interpolate quadratically (4 points)")
+LIST_ITEM (U"Shift-Command-?: Local help")
+LIST_ITEM (U"Command-,: Move start of selection to nearest zero crossing")
+LIST_ITEM (U"Command-.: Move end of selection to nearest zero crossing")
+LIST_ITEM (U"F5: Get pitch")
+LIST_ITEM (U"Command-F5: Get minimum pitch")
+LIST_ITEM (U"Shift-F5: Get maximum pitch")
+LIST_ITEM (U"F1: Get first formant")
+LIST_ITEM (U"F2: Get second formant")
+LIST_ITEM (U"F3: Get third formant")
+LIST_ITEM (U"F4: Get fourth formant")
+LIST_ITEM (U"F5: Get pitch")
+LIST_ITEM (U"F6: Get cursor")
+LIST_ITEM (U"F7: Get spectral power at cursor cross")
+LIST_ITEM (U"F8: Get intensity")
+LIST_ITEM (U"F12: Log 1")
+LIST_ITEM (U"Shift-F12: Log 2")
+LIST_ITEM (U"Option-F12: Log script 3")
+LIST_ITEM (U"Command-F12: Log script 4")
+LIST_ITEM (U"Tab (in sound windows): Play selection")
+LIST_ITEM (U"Shift-Tab (in sound windows): Play window")
+LIST_ITEM (U"Arrow-up (in sound windows): Select earlier")
+LIST_ITEM (U"Arrow-down (in sound windows): Select later")
+LIST_ITEM (U"Shift-Arrow-up (in sound windows): Move start of selection left")
+LIST_ITEM (U"Shift-Arrow-down (in sound windows): Move start of selection right")
+LIST_ITEM (U"Command-Arrow-up (in sound windows): Move end of selection left")
+LIST_ITEM (U"Command-Arrow-down (in sound windows): Move end of selection right")
+LIST_ITEM (U"Page-up (in sound windows): Scroll page back")
+LIST_ITEM (U"Page-down (in sound windows): Scroll page forward")
+LIST_ITEM (U"Escape: Interrupt playing")
+MAN_END
+
+MAN_BEGIN (U"Log files", U"ppgb", 20140421)
+INTRO (U"With some commands in the @Query menu of the @SoundEditor and @TextGridEditor, "
 	"you can write combined information about times, pitch values, formants, and intensities "
 	"to the @@Info window@ and to a log file.")
-NORMAL (L"A log file is a text file on disk. It consists of a number of similar lines, "
+NORMAL (U"A log file is a text file on disk. It consists of a number of similar lines, "
 	"whose format you determine with the log settings in the Query menu.")
-NORMAL (L"Every time you press F12 (or choose ##Log 1# from the Query menu, "
+NORMAL (U"Every time you press F12 (or choose ##Log 1# from the Query menu, "
 	"Praat writes a line to log file 1. If you press Shift-F12, Praat writes a line to log file 2.")
-NORMAL (L"With the ##log settings# command window, you determine the following:")
-TAG (L"##Log 1 to Info window")
-DEFINITION (L"this determines whether your log line will be written to the Info window or not.")
-TAG (L"##Log 1 to log file")
-DEFINITION (L"this determines whether your log line will be written to the log file or not.")
-TAG (L"##Log file 1")
-DEFINITION (L"the name of the log file. On Windows, this has to be a complete path name, such as "
+NORMAL (U"With the ##log settings# command window, you determine the following:")
+TAG (U"##Log 1 to Info window")
+DEFINITION (U"this determines whether your log line will be written to the Info window or not.")
+TAG (U"##Log 1 to log file")
+DEFINITION (U"this determines whether your log line will be written to the log file or not.")
+TAG (U"##Log file 1")
+DEFINITION (U"the name of the log file. On Windows, this has to be a complete path name, such as "
 	"$$C:\\bsWINDOWS\\bsDESKTOP\\bsPitch Log.txt$. "
 	"On Unix and MacOS X, it can either be a complete path name, e.g. $$/home/mary/pitch_log$, "
 	"or a home-relative name such as $$~/Desktop/Pitch log$.")
-TAG (L"##Log 1 format")
-DEFINITION (L"the format of the line that Praat will write. See below.")
-NORMAL (L"The same goes for log file 2.")
-ENTRY (L"Usage")
-NORMAL (L"The logging facility has been implemented in Praat especially for former users of Kay CSL, "
+TAG (U"##Log 1 format")
+DEFINITION (U"the format of the line that Praat will write. See below.")
+NORMAL (U"The same goes for log file 2.")
+ENTRY (U"Usage")
+NORMAL (U"The logging facility has been implemented in Praat especially for former users of Kay CSL, "
 	"who have been used to doing it for years and like to continue doing it in Praat. "
 	"Otherwise, you may prefer to use the @TextGridEditor to mark time points and run "
 	"an automatic analysis afterwards.")
-NORMAL (L"If you do want to use the logging facility, you typically start by deleting any old "
+NORMAL (U"If you do want to use the logging facility, you typically start by deleting any old "
 	"log file (by choosing ##Delete log file 1# or ##Delete log file 2#), if you want to re-use "
 	"the file name. Otherwise, you can change the log file name (with ##Log settings...#). "
 	"After this, you will move the cursor to various time locations and press F12 (or Shift-F12) "
 	"each time, so that information about the current time will be written to the log file.")
-ENTRY (L"Example 1: pitch logging")
-NORMAL (L"Suppose you want to log the time of the cursor and the pitch value at the cursor. "
+ENTRY (U"Example 1: pitch logging")
+NORMAL (U"Suppose you want to log the time of the cursor and the pitch value at the cursor. "
 	"You could use the following log format:")
-CODE (L"Time \'time:6\' seconds, pitch \'f0:2\' hertz")
-NORMAL (L"If you now click at 3.456789876 seconds, and the pitch happens to be 355.266 hertz "
+CODE (U"Time \'time:6\' seconds, pitch \'f0:2\' hertz")
+NORMAL (U"If you now click at 3.456789876 seconds, and the pitch happens to be 355.266 hertz "
 	"at that time, the following line will be appended to the log file and/or to the Info window:")
-CODE (L"Time 3.456790 seconds, pitch 355.27 hertz.")
-NORMAL (L"The parts \":6\" and \":2\" denote the number of digits after the decimal point. "
+CODE (U"Time 3.456790 seconds, pitch 355.27 hertz.")
+NORMAL (U"The parts \":6\" and \":2\" denote the number of digits after the decimal point. "
 	"If you leave them out, the values will be written with a precision of 17 digits.")
-NORMAL (L"The words \'time\' and \'f0\' mean exactly the same as the result of the commands "
+NORMAL (U"The words \'time\' and \'f0\' mean exactly the same as the result of the commands "
 	"##Get cursor# and ##Get pitch#. Therefore, if instead of setting a cursor line you selected a larger "
 	"piece of the sound, \'time\' will give the centre of the selection and \'f0\' will give the mean pitch "
 	"in the selection.")
-NORMAL (L"Beware of the following pitfall: if your pitch units are not hertz, but semitones, "
+NORMAL (U"Beware of the following pitfall: if your pitch units are not hertz, but semitones, "
 	"then \'f0\' will give the result in semitones. A format as in this example will then be misleading.")
-ENTRY (L"Example 2: formant logging")
-NORMAL (L"Suppose you want to log the start and finish of the selection, its duration, and the mean values "
+ENTRY (U"Example 2: formant logging")
+NORMAL (U"Suppose you want to log the start and finish of the selection, its duration, and the mean values "
 	"of the first three formants, all separated by tab stops for easy importation into Microsoft® Excel™. "
 	"You could use the following log format:")
-CODE (L"\'t1:4\'\'tab\\$ \'\'t2:4\'\'tab\\$ \'\'f1:0\'\'tab\\$ \'\'f2:0\'\'tab\\$ \'\'f3:0\'")
-NORMAL (L"You see that \'t1\' and \'t2\' are the start and finish of the selection, respectively, "
+CODE (U"\'t1:4\'\'tab\\$ \'\'t2:4\'\'tab\\$ \'\'f1:0\'\'tab\\$ \'\'f2:0\'\'tab\\$ \'\'f3:0\'")
+NORMAL (U"You see that \'t1\' and \'t2\' are the start and finish of the selection, respectively, "
 	"and that they are written with 4 digits after the decimal point. By using \":0\", the three formant values "
 	"are rounded to whole numbers in hertz. The word \'tab\\$ \' is the tab stop.")
-ENTRY (L"Loggable values")
-NORMAL (L"The following values can be logged:")
-LIST_ITEM (L"\'time\': the time of the cursor, or the centre of the selection.")
-LIST_ITEM (L"\'t1\': the start of the selection (\"B\").")
-LIST_ITEM (L"\'t2\': the end of the selection (\"E\").")
-LIST_ITEM (L"\'dur\': the duration of the selection.")
-LIST_ITEM (L"\'freq\': the frequency at the frequency cursor.")
-LIST_ITEM (L"\'f0\': the pitch at the cursor time, or the mean pitch in the selection.")
-LIST_ITEM (L"\'f1\', \'f2\', \'f3\', \'f4\', \'f5\': the first/second/third/fourth/fifth formant at the cursor time, "
+ENTRY (U"Loggable values")
+NORMAL (U"The following values can be logged:")
+LIST_ITEM (U"\'time\': the time of the cursor, or the centre of the selection.")
+LIST_ITEM (U"\'t1\': the start of the selection (\"B\").")
+LIST_ITEM (U"\'t2\': the end of the selection (\"E\").")
+LIST_ITEM (U"\'dur\': the duration of the selection.")
+LIST_ITEM (U"\'freq\': the frequency at the frequency cursor.")
+LIST_ITEM (U"\'f0\': the pitch at the cursor time, or the mean pitch in the selection.")
+LIST_ITEM (U"\'f1\', \'f2\', \'f3\', \'f4\', \'f5\': the first/second/third/fourth/fifth formant at the cursor time, "
 	"or the mean first/second/third/fourth/fifth formant in the selection.")
-LIST_ITEM (L"\'b1\', \'b2\', \'b3\', \'b4\', \'b5\': the bandwidth of the first/second/third/fourth/fifth formant "
+LIST_ITEM (U"\'b1\', \'b2\', \'b3\', \'b4\', \'b5\': the bandwidth of the first/second/third/fourth/fifth formant "
 	"at the cursor time or at the centre of the selection.")
-LIST_ITEM (L"\'intensity\': the intensity at the cursor time, or the mean intensity in the selection, in dB.")
-LIST_ITEM (L"\'power\': the spectral power at the cursor cross, in Pa^2/Hz.")
-LIST_ITEM (L"\'tab\\$ \': the tab stop.")
-LIST_ITEM (L"\'editor\\$ \': the title of the editor window (i.e. the name of the visible Sound or TextGrid).")
-ENTRY (L"More flexibility in logging")
-NORMAL (L"You may sometimes require information in your log file that cannot be generated directly "
+LIST_ITEM (U"\'intensity\': the intensity at the cursor time, or the mean intensity in the selection, in dB.")
+LIST_ITEM (U"\'power\': the spectral power at the cursor cross, in Pa^2/Hz.")
+LIST_ITEM (U"\'tab\\$ \': the tab stop.")
+LIST_ITEM (U"\'editor\\$ \': the title of the editor window (i.e. the name of the visible Sound or TextGrid).")
+ENTRY (U"More flexibility in logging")
+NORMAL (U"You may sometimes require information in your log file that cannot be generated directly "
 	"by the loggable values above. Suppose, for instance, that you want to log the values for F1 and F2-F1 "
 	"at the points where you click. You could write the following script:")
-CODE (L"f1 = Get first formant")
-CODE (L"f2 = Get second formant")
-CODE (L"f21 = f2 - f1")
-CODE (L"appendInfoLine: fixed\\$  (f1, 0), \" \", fixed\\$  (f21, 0)")
-CODE (L"appendFileLine: \"D:\\bsPraat logs\\bsFormant log.txt\", fixed\\$  (f1, 0), tab\\$ , fixed\\$  (f21, 0)")
-NORMAL (L"With this script, the information would be appended both to the Info window and to the "
+CODE (U"f1 = Get first formant")
+CODE (U"f2 = Get second formant")
+CODE (U"f21 = f2 - f1")
+CODE (U"appendInfoLine: fixed\\$  (f1, 0), \" \", fixed\\$  (f21, 0)")
+CODE (U"appendFileLine: \"D:\\bsPraat logs\\bsFormant log.txt\", fixed\\$  (f1, 0), tab\\$ , fixed\\$  (f21, 0)")
+NORMAL (U"With this script, the information would be appended both to the Info window and to the "
 	"file \"Formant log.txt\" on your desktop.")
-NORMAL (L"You can make this script accessible with Option-F12 (or Command-F12) "
+NORMAL (U"You can make this script accessible with Option-F12 (or Command-F12) "
 	"by saving the script and specifying the name of the script file in the ##Log script 3# (or #4) field "
 	"in the ##Log settings...# window.")
-NORMAL (L"These scripts may take arguments. Suppose, for instance, that you want to specify a vowel symbol "
+NORMAL (U"These scripts may take arguments. Suppose, for instance, that you want to specify a vowel symbol "
 	"as you press Option-F12. The following script will take care of that:")
-CODE (L"form Save vowel and formants")
-CODE1 (L"word Vowel a")
-CODE (L"endform")
-CODE (L"f1 = Get first formant")
-CODE (L"f2 = Get second formant")
-CODE (L"f21 = f2 - f1")
-CODE (L"appendInfoLine: vowel\\$ , \" \", fixed\\$  (f1, 0), \" \", fixed\\$  (f21, 0)")
-CODE (L"appendFileLine: \"~/Praat logs/Vowels and formants log\", vowel\\$ , tab\\$ , fixed\\$  (f1, 0), tab\\$ , fixed\\$  (f21, 0)")
-NORMAL (L"Beware of the following pitfall: because of the nature of scripts, you should not try to do this "
+CODE (U"form Save vowel and formants")
+CODE1 (U"word Vowel a")
+CODE (U"endform")
+CODE (U"f1 = Get first formant")
+CODE (U"f2 = Get second formant")
+CODE (U"f21 = f2 - f1")
+CODE (U"appendInfoLine: vowel\\$ , \" \", fixed\\$  (f1, 0), \" \", fixed\\$  (f21, 0)")
+CODE (U"appendFileLine: \"~/Praat logs/Vowels and formants log\", vowel\\$ , tab\\$ , fixed\\$  (f1, 0), tab\\$ , fixed\\$  (f21, 0)")
+NORMAL (U"Beware of the following pitfall: because of the nature of scripts, you should not try to do this "
 	"when you have two editor windows with the same name. I cannot predict which of the two windows "
 	"will answer the #Get queries...")
 MAN_END
 
-MAN_BEGIN (L"Manipulation", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat, for changing the pitch and duration contours of a sound.")
-ENTRY (L"Inside a manipulation object")
-NORMAL (L"With @Inspect, you will see the following attributes:")
-TAG (L"##timeStep")
-DEFINITION (L"the time step (or %%frame length%) used in the pitch analysis. A common value is 0.010 seconds.")
-TAG (L"##minimumPitch")
-DEFINITION (L"the minimum pitch frequency considered in the pitch analysis. A common value is 75 hertz.")
-TAG (L"##maximumPitch")
-DEFINITION (L"the maximum pitch frequency considered in the pitch analysis. A common value is 600 hertz.")
-NORMAL (L"A Manipulation object also contains the following smaller objects:")
-LIST_ITEM (L"1. The original @Sound.")
-LIST_ITEM (L"2. A @PointProcess representing glottal pulses.")
-LIST_ITEM (L"3. A @PitchTier.")
-LIST_ITEM (L"4. A @DurationTier.")
-ENTRY (L"Analysis")
-NORMAL (L"When a Manipulation object is created from a sound, the following steps are performed:")
-LIST_ITEM (L"1. A pitch analysis is performed on the original sound, with the method of @@Sound: To Pitch... at . "
+MAN_BEGIN (U"Manipulation", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat, for changing the pitch and duration contours of a sound.")
+ENTRY (U"Inside a manipulation object")
+NORMAL (U"With @Inspect, you will see the following attributes:")
+TAG (U"##timeStep")
+DEFINITION (U"the time step (or %%frame length%) used in the pitch analysis. A common value is 0.010 seconds.")
+TAG (U"##minimumPitch")
+DEFINITION (U"the minimum pitch frequency considered in the pitch analysis. A common value is 75 hertz.")
+TAG (U"##maximumPitch")
+DEFINITION (U"the maximum pitch frequency considered in the pitch analysis. A common value is 600 hertz.")
+NORMAL (U"A Manipulation object also contains the following smaller objects:")
+LIST_ITEM (U"1. The original @Sound.")
+LIST_ITEM (U"2. A @PointProcess representing glottal pulses.")
+LIST_ITEM (U"3. A @PitchTier.")
+LIST_ITEM (U"4. A @DurationTier.")
+ENTRY (U"Analysis")
+NORMAL (U"When a Manipulation object is created from a sound, the following steps are performed:")
+LIST_ITEM (U"1. A pitch analysis is performed on the original sound, with the method of @@Sound: To Pitch... at . "
 	"This uses the time step, minimum pitch, and maximum pitch parameters.")
-LIST_ITEM (L"2. The information of the resulting pitch contour (frequency and voiced/unvoiced decisions) "
+LIST_ITEM (U"2. The information of the resulting pitch contour (frequency and voiced/unvoiced decisions) "
 	"is used to posit glottal pulses where the original sound contains much energy. "
 	"The method is the same as in @@Sound & Pitch: To PointProcess (cc)@.")
-LIST_ITEM (L"3. The pitch contour is converted to a pitch tier with many points (targets), "
+LIST_ITEM (U"3. The pitch contour is converted to a pitch tier with many points (targets), "
 	"with the method of @@Pitch: To PitchTier at .")
-LIST_ITEM (L"4. An empty @DurationTier is created.")
-ENTRY (L"Resynthesis")
-TAG (L"A Manipulation object can produce Sound input. This Sound can be computed in several ways:")
-LIST_ITEM (L"• @@overlap-add@: from original sound + pulses + pitch tier + duration tier;")
-LIST_ITEM (L"• #LPC: from LPC (from original sound) + pulses + pitch tier;")
-LIST_ITEM (L"• from the pulses only, as a pulse train or hummed;")
-LIST_ITEM (L"• from the pitch tier only, as a pulse train or hummed.")
+LIST_ITEM (U"4. An empty @DurationTier is created.")
+ENTRY (U"Resynthesis")
+TAG (U"A Manipulation object can produce Sound input. This Sound can be computed in several ways:")
+LIST_ITEM (U"• @@overlap-add@: from original sound + pulses + pitch tier + duration tier;")
+LIST_ITEM (U"• #LPC: from LPC (from original sound) + pulses + pitch tier;")
+LIST_ITEM (U"• from the pulses only, as a pulse train or hummed;")
+LIST_ITEM (U"• from the pitch tier only, as a pulse train or hummed.")
 MAN_END
 
-MAN_BEGIN (L"Manipulation: Extract duration tier", L"ppgb", 20010330)
-INTRO (L"A command to extract a copy of the duration information in each selected @Manipulation object into a new @DurationTier object.")
+MAN_BEGIN (U"Manipulation: Extract duration tier", U"ppgb", 20010330)
+INTRO (U"A command to extract a copy of the duration information in each selected @Manipulation object into a new @DurationTier object.")
 MAN_END
 
-MAN_BEGIN (L"Manipulation: Extract original sound", L"ppgb", 20010330)
-INTRO (L"A command to copy the original sound in each selected @Manipulation object to a new @Sound object.")
+MAN_BEGIN (U"Manipulation: Extract original sound", U"ppgb", 20010330)
+INTRO (U"A command to copy the original sound in each selected @Manipulation object to a new @Sound object.")
 MAN_END
 
-MAN_BEGIN (L"Manipulation: Extract pitch tier", L"ppgb", 20010330)
-INTRO (L"A command to extract a copy of the pitch information in each selected @Manipulation object into a new @PitchTier object.")
+MAN_BEGIN (U"Manipulation: Extract pitch tier", U"ppgb", 20010330)
+INTRO (U"A command to extract a copy of the pitch information in each selected @Manipulation object into a new @PitchTier object.")
 MAN_END
 
-MAN_BEGIN (L"Manipulation: Extract pulses", L"ppgb", 20010330)
-INTRO (L"A command to extract a copy of the vocal-pulse information in each selected @Manipulation object into a new @PointProcess object.")
+MAN_BEGIN (U"Manipulation: Extract pulses", U"ppgb", 20010330)
+INTRO (U"A command to extract a copy of the vocal-pulse information in each selected @Manipulation object into a new @PointProcess object.")
 MAN_END
 
-MAN_BEGIN (L"Manipulation: Play (overlap-add)", L"ppgb", 20070722)
-INTRO (L"A command to play each selected @Manipulation object, resynthesized with the @@overlap-add@ method.")
+MAN_BEGIN (U"Manipulation: Play (overlap-add)", U"ppgb", 20070722)
+INTRO (U"A command to play each selected @Manipulation object, resynthesized with the @@overlap-add@ method.")
 MAN_END
 
-MAN_BEGIN (L"Manipulation: Get resynthesis (overlap-add)", L"ppgb", 20070722)
-INTRO (L"A command to extract the sound from each selected @Manipulation object, resynthesized with the @@overlap-add@ method.")
+MAN_BEGIN (U"Manipulation: Get resynthesis (overlap-add)", U"ppgb", 20070722)
+INTRO (U"A command to extract the sound from each selected @Manipulation object, resynthesized with the @@overlap-add@ method.")
 MAN_END
 
-MAN_BEGIN (L"Manipulation: Replace duration tier", L"ppgb", 20030216)
-INTRO (L"You can replace the duration tier that you see in your @Manipulation object "
+MAN_BEGIN (U"Manipulation: Replace duration tier", U"ppgb", 20030216)
+INTRO (U"You can replace the duration tier that you see in your @Manipulation object "
 	"with a separate @DurationTier object, for instance one that you extracted from another Manipulation "
 	"or one that you created with @@Create DurationTier... at .")
-NORMAL (L"To do this, select your Manipulation object together with the @DurationTier object and click ##Replace duration tier#.")
+NORMAL (U"To do this, select your Manipulation object together with the @DurationTier object and click ##Replace duration tier#.")
 MAN_END
 
-MAN_BEGIN (L"Manipulation: Replace pitch tier", L"ppgb", 20030216)
-INTRO (L"You can replace the pitch tier that you see in your @Manipulation object "
+MAN_BEGIN (U"Manipulation: Replace pitch tier", U"ppgb", 20030216)
+INTRO (U"You can replace the pitch tier that you see in your @Manipulation object "
 	"with a separate @PitchTier object, for instance one that you extracted from another Manipulation "
 	"or one that you created with @@Create PitchTier... at .")
-NORMAL (L"To do this, select your Manipulation object together with the @PitchTier object and click ##Replace pitch tier#.")
+NORMAL (U"To do this, select your Manipulation object together with the @PitchTier object and click ##Replace pitch tier#.")
 MAN_END
 
-MAN_BEGIN (L"Manipulation: Replace pulses", L"ppgb", 20010330)
-INTRO (L"A command to replace the vocal-pulse information in the selected @Manipulation object with the selected @PointProcess object.")
+MAN_BEGIN (U"Manipulation: Replace pulses", U"ppgb", 20010330)
+INTRO (U"A command to replace the vocal-pulse information in the selected @Manipulation object with the selected @PointProcess object.")
 MAN_END
 
-MAN_BEGIN (L"Manipulation: Replace original sound", L"ppgb", 20010330)
-INTRO (L"A command to replace the original sound in the selected @Manipulation object with the selected @Sound object.")
+MAN_BEGIN (U"Manipulation: Replace original sound", U"ppgb", 20010330)
+INTRO (U"A command to replace the original sound in the selected @Manipulation object with the selected @Sound object.")
 MAN_END
 
-MAN_BEGIN (L"ManipulationEditor", L"ppgb", 20030316)
-	INTRO (L"One of the @Editors in Praat, for viewing and manipulating a @Manipulation object.")
-ENTRY (L"Objects")
-	NORMAL (L"The editor shows:")
-	LIST_ITEM (L"• The original @Sound.")
-	LIST_ITEM (L"• The @PointProcess that represents the glottal %pulses. "
+MAN_BEGIN (U"ManipulationEditor", U"ppgb", 20030316)
+	INTRO (U"One of the @Editors in Praat, for viewing and manipulating a @Manipulation object.")
+ENTRY (U"Objects")
+	NORMAL (U"The editor shows:")
+	LIST_ITEM (U"• The original @Sound.")
+	LIST_ITEM (U"• The @PointProcess that represents the glottal %pulses. "
 		"You can edit it for improving the pitch analysis.")
-	LIST_ITEM (L"• A pitch contour based on the locations of the pulses, for comparison (drawn as grey dots). "
+	LIST_ITEM (U"• A pitch contour based on the locations of the pulses, for comparison (drawn as grey dots). "
 		"Changes shape if you edit the pulses.")
-	LIST_ITEM (L"• The @PitchTier that determines the pitch contour of the resynthesized @Sound (drawn as blue circles). "
+	LIST_ITEM (U"• The @PitchTier that determines the pitch contour of the resynthesized @Sound (drawn as blue circles). "
 		"At the creation of the @Manipulation object, it is computed from the original pitch contour. "
 		"You can manipulate it by simplifying it (i.e., removing targets), "
 		"or by moving parts of it up and down, and back and forth.")
-	LIST_ITEM (L"• A @DurationTier for manipulating the relative durations of the voiced parts of the sound.")
-ENTRY (L"Playing")
-	NORMAL (L"To play (a part of) the %resynthesized sound (by any of the methods shown in the #Synth menu, "
+	LIST_ITEM (U"• A @DurationTier for manipulating the relative durations of the voiced parts of the sound.")
+ENTRY (U"Playing")
+	NORMAL (U"To play (a part of) the %resynthesized sound (by any of the methods shown in the #Synth menu, "
 		"like @@overlap-add@ and #LPC), @click on any of the 1 to 8 buttons below and above the drawing area "
 		"or use the Play commands from the View menu.")
-	NORMAL (L"To play the %original sound instead, use ##Shift-click#.")
-ENTRY (L"Pulses")
-	TAG (L"To add:")
-	DEFINITION (L"#click at the desired time location, and choose ##Add pulse at cursor# or type ##Command-p#.")
-	TAG (L"To remove:")
-	DEFINITION (L"make a @@time selection@, and choose ##Remove pulse(s)# or type ##Option-Command-p#. "
+	NORMAL (U"To play the %original sound instead, use ##Shift-click#.")
+ENTRY (U"Pulses")
+	TAG (U"To add:")
+	DEFINITION (U"#click at the desired time location, and choose ##Add pulse at cursor# or type ##Command-p#.")
+	TAG (U"To remove:")
+	DEFINITION (U"make a @@time selection@, and choose ##Remove pulse(s)# or type ##Option-Command-p#. "
 		"If there is no selection, the pulse nearest to the cursor is removed.")
-ENTRY (L"Pitch points")
-	TAG (L"To add one at a specified %%time and frequency%:")
-	DEFINITION (L"#click at the desired time-frequency location, and choose ##Add pitch point at cursor# or type ##Command-t#.")
-	TAG (L"To add one at a specified %time only:")
-	DEFINITION (L"#click at the desired time, and choose ##Add pitch point at time slice#. ManipulationEditor tries to compute the frequency from the "
+ENTRY (U"Pitch points")
+	TAG (U"To add one at a specified %%time and frequency%:")
+	DEFINITION (U"#click at the desired time-frequency location, and choose ##Add pitch point at cursor# or type ##Command-t#.")
+	TAG (U"To add one at a specified %time only:")
+	DEFINITION (U"#click at the desired time, and choose ##Add pitch point at time slice#. ManipulationEditor tries to compute the frequency from the "
 		"intervals between the pulses, basically by a median-of-three method.")
-	TAG (L"To remove:")
-	DEFINITION (L"make a @@time selection@, and choose ##Remove pitch point(s)# or type ##Option-Command-t#. "
+	TAG (U"To remove:")
+	DEFINITION (U"make a @@time selection@, and choose ##Remove pitch point(s)# or type ##Option-Command-t#. "
 		"If there is no selection, the pitch point nearest to the cursor is removed.")
-	TAG (L"To move %some:")
-	DEFINITION (L"make a @@time selection@ (the points become red) and ##Shift-drag# the points across the window. "
+	TAG (U"To move %some:")
+	DEFINITION (U"make a @@time selection@ (the points become red) and ##Shift-drag# the points across the window. "
 		"You cannot drag them across adjacent points, or below 50 Hz, or above the maximum frequency. "
 		"You can only drag them horizontally if the %%dragging strategy% is ##All# or ##Only horizontal#, "
 		"and you can drag them vertically if the dragging strategy is not ##Only horizontal#. "
 		"You can change the dragging strategy with ##Set pitch dragging strategy...# from the #Pitch menu.")
-	TAG (L"To move %one:")
-	DEFINITION (L"@drag that point across the window. "
+	TAG (U"To move %one:")
+	DEFINITION (U"@drag that point across the window. "
 		"You can only drag it horizontally if the dragging strategy is not ##Only vertical#, "
 		"and you can drag it vertically if the dragging strategy is not ##Only horizontal#.")
-ENTRY (L"Duration points")
-	NORMAL (L"Work pretty much the same as pitch points.")
-ENTRY (L"Stylization")
-	NORMAL (L"Before editing the Pitch points, you may want to reduce their number by choosing any of the #Stylize "
+ENTRY (U"Duration points")
+	NORMAL (U"Work pretty much the same as pitch points.")
+ENTRY (U"Stylization")
+	NORMAL (U"Before editing the Pitch points, you may want to reduce their number by choosing any of the #Stylize "
 		"commands from the #Pitch menu.")
 MAN_END
 
-MAN_BEGIN (L"Matrix", L"ppgb", 20030216)
-INTRO (L"One of the @@types of objects@ in Praat. "
+MAN_BEGIN (U"Matrix", U"ppgb", 20030216)
+INTRO (U"One of the @@types of objects@ in Praat. "
 	"A Matrix object represents a function %z (%x, %y) "
 	"on the domain [%x__%min_, %x__%max_] × [%y__%min_, %y__%max_]. "
 	"The domain has been sampled in the %x and %y directions "
 	"with constant sampling intervals (%dx and %dy) along each direction. "
 	"The samples are thus %z [%i__%y_] [%i__%x_], %i__%x_ = 1 ... %n__%x_, %i__%y_ = 1 ... %n__%y_. "
 	"The samples represent the function values %z (%x__1_ + (%ix - 1) %dx, %y__1_ + (%iy - 1) %dy).")
-ENTRY (L"Matrix commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"• @@Create Matrix...")
-LIST_ITEM (L"• @@Create simple Matrix...")
-LIST_ITEM (L"• @@Read from file...")
-LIST_ITEM (L"• @@Read Matrix from raw text file...")
-LIST_ITEM (L"• ##Read Matrix from LVS AP file...")
-NORMAL (L"Drawing:")
-LIST_ITEM (L"• ##Matrix: Draw rows...")
-LIST_ITEM (L"• ##Matrix: Draw contours...")
-LIST_ITEM (L"• ##Matrix: Paint contours...")
-LIST_ITEM (L"• ##Matrix: Paint cells...")
-LIST_ITEM (L"• ##Matrix: Scatter plot...")
-LIST_ITEM (L"• @@Matrix: Draw as squares...")
-LIST_ITEM (L"• ##Matrix: Draw value distribution...")
-LIST_ITEM (L"• ##Matrix: Paint surface...")
-NORMAL (L"Modification:")
-LIST_ITEM (L"• @@Matrix: Formula...")
-LIST_ITEM (L"• ##Matrix: Scale...")
-ENTRY (L"Inside a Matrix object")
-NORMAL (L"With @Inspect, you will see the following attributes.")
-TAG (L"%xmin, %xmax ≥ %xmin")
-DEFINITION (L"%x domain.")
-TAG (L"%nx ≥ 1")
-DEFINITION (L"number of columns.")
-TAG (L"%dx > 0.0")
-DEFINITION (L"distance between columns.")
-TAG (L"%x1")
-DEFINITION (L"%x value associated with first column.")
-TAG (L"%ymin, %ymax ≥ %ymin")
-DEFINITION (L"%y domain.")
-TAG (L"%ny ≥ 1")
-DEFINITION (L"number of rows.")
-TAG (L"%dy > 0.0")
-DEFINITION (L"distance between rows.")
-TAG (L"%y1")
-DEFINITION (L"%y value associated with first row.")
-TAG (L"%z [1..%ny] [1..%nx]")
-DEFINITION (L"The sample values.")
-NORMAL (L"After creation of the #Matrix, %xmin, %xmax, %ymin, %ymax, "
+ENTRY (U"Matrix commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"• @@Create Matrix...")
+LIST_ITEM (U"• @@Create simple Matrix...")
+LIST_ITEM (U"• @@Read from file...")
+LIST_ITEM (U"• @@Read Matrix from raw text file...")
+LIST_ITEM (U"• ##Read Matrix from LVS AP file...")
+NORMAL (U"Drawing:")
+LIST_ITEM (U"• ##Matrix: Draw rows...")
+LIST_ITEM (U"• ##Matrix: Draw contours...")
+LIST_ITEM (U"• ##Matrix: Paint contours...")
+LIST_ITEM (U"• ##Matrix: Paint cells...")
+LIST_ITEM (U"• ##Matrix: Scatter plot...")
+LIST_ITEM (U"• @@Matrix: Draw as squares...")
+LIST_ITEM (U"• ##Matrix: Draw value distribution...")
+LIST_ITEM (U"• ##Matrix: Paint surface...")
+NORMAL (U"Modification:")
+LIST_ITEM (U"• @@Matrix: Formula...")
+LIST_ITEM (U"• ##Matrix: Scale...")
+ENTRY (U"Inside a Matrix object")
+NORMAL (U"With @Inspect, you will see the following attributes.")
+TAG (U"%xmin, %xmax ≥ %xmin")
+DEFINITION (U"%x domain.")
+TAG (U"%nx ≥ 1")
+DEFINITION (U"number of columns.")
+TAG (U"%dx > 0.0")
+DEFINITION (U"distance between columns.")
+TAG (U"%x1")
+DEFINITION (U"%x value associated with first column.")
+TAG (U"%ymin, %ymax ≥ %ymin")
+DEFINITION (U"%y domain.")
+TAG (U"%ny ≥ 1")
+DEFINITION (U"number of rows.")
+TAG (U"%dy > 0.0")
+DEFINITION (U"distance between rows.")
+TAG (U"%y1")
+DEFINITION (U"%y value associated with first row.")
+TAG (U"%z [1..%ny] [1..%nx]")
+DEFINITION (U"The sample values.")
+NORMAL (U"After creation of the #Matrix, %xmin, %xmax, %ymin, %ymax, "
 	"%nx, %ny, %dx, %dy, %x1, and %y1 "
 	"do not usually change. The contents of %z do.")
-NORMAL (L"Normally, you will want %xmin ≤ %x1 and %xmax ≥ %x1 + (%nx - 1) %dx.")
-ENTRY (L"Example: simple matrix")
-NORMAL (L"If a simple matrix has %x equal to column number "
+NORMAL (U"Normally, you will want %xmin ≤ %x1 and %xmax ≥ %x1 + (%nx - 1) %dx.")
+ENTRY (U"Example: simple matrix")
+NORMAL (U"If a simple matrix has %x equal to column number "
 	"and %y equal to row number, it has the following attributes:")
-LIST_ITEM (L"%xmin = 1;   %xmax = %nx;   %dx = 1;  %x1 = 1;")
-LIST_ITEM (L"%ymin = 1;   %ymax = %ny;   %dy = 1;  %y1 = 1;")
-ENTRY (L"Example: sampled signal")
-NORMAL (L"If the matrix represents a sampled signal of 1 second duration "
+LIST_ITEM (U"%xmin = 1;   %xmax = %nx;   %dx = 1;  %x1 = 1;")
+LIST_ITEM (U"%ymin = 1;   %ymax = %ny;   %dy = 1;  %y1 = 1;")
+ENTRY (U"Example: sampled signal")
+NORMAL (U"If the matrix represents a sampled signal of 1 second duration "
 	"with a sampling frequency of 10 kHz, it has the following attributes:")
-LIST_ITEM (L"%xmin = 0.0;   %xmax = 1.0;   %nx = 10000 ;   %dx = 1.0·10^^-4^;   %x1 = 0.5·10^^-4^;")
-LIST_ITEM (L"%ymin = 1;   %ymax = 1;   %ny = 1;   %dy = 1;   %y1 = 1;")
-ENTRY (L"Example: complex signal")
-NORMAL (L"If the matrix represents a complex spectrum "
+LIST_ITEM (U"%xmin = 0.0;   %xmax = 1.0;   %nx = 10000 ;   %dx = 1.0·10^^-4^;   %x1 = 0.5·10^^-4^;")
+LIST_ITEM (U"%ymin = 1;   %ymax = 1;   %ny = 1;   %dy = 1;   %y1 = 1;")
+ENTRY (U"Example: complex signal")
+NORMAL (U"If the matrix represents a complex spectrum "
 	"derived with an @FFT from the sound of example 2, it has the following attributes:")
-LIST_ITEM (L"%xmin = 0.0;   %xmax = 5000.0;   %nx = 8193 ;   %dx = 5000.0 / 8192;   %x1 = 0.0;")
-LIST_ITEM (L"%ny = 2 (real and imaginary part);")
-LIST_ITEM (L"%ymin = 1 (first row, real part);")
-LIST_ITEM (L"%ymax = 2 (second row, imaginary part);")
-LIST_ITEM (L"%dy = 1;   %y1 = 1;  (so that %y is equal to row number)")
-MAN_END
-
-MAN_BEGIN (L"Matrix: Draw as squares...", L"ppgb", 19980319)
-INTRO (L"A command to draw a @Matrix object into the @@Picture window at .")
-ENTRY (L"Settings")
-TAG (L"##Xmin")
-TAG (L"##Xmax")
-DEFINITION (L"the windowing domain in the %x direction. Elements outside will not be drawn. "
+LIST_ITEM (U"%xmin = 0.0;   %xmax = 5000.0;   %nx = 8193 ;   %dx = 5000.0 / 8192;   %x1 = 0.0;")
+LIST_ITEM (U"%ny = 2 (real and imaginary part);")
+LIST_ITEM (U"%ymin = 1 (first row, real part);")
+LIST_ITEM (U"%ymax = 2 (second row, imaginary part);")
+LIST_ITEM (U"%dy = 1;   %y1 = 1;  (so that %y is equal to row number)")
+MAN_END
+
+MAN_BEGIN (U"Matrix: Draw as squares...", U"ppgb", 19980319)
+INTRO (U"A command to draw a @Matrix object into the @@Picture window at .")
+ENTRY (U"Settings")
+TAG (U"##Xmin")
+TAG (U"##Xmax")
+DEFINITION (U"the windowing domain in the %x direction. Elements outside will not be drawn. "
 	"%Autowindowing: if (%Xmin ≥ %Xmax), the entire %x domain [%x__%min_, %x__%max_] of the Matrix is used.")
-TAG (L"##Ymin")
-TAG (L"##Ymax")
-DEFINITION (L"the windowing domain in the %y direction. Elements outside will not be drawn. "
+TAG (U"##Ymin")
+TAG (U"##Ymax")
+DEFINITION (U"the windowing domain in the %y direction. Elements outside will not be drawn. "
 	"%Autowindowing: if (%Ymin ≥ %Ymax), the entire %y domain [%y__%min_, %y__%max_] of the Matrix is used.")
-TAG (L"##Garnish")
-DEFINITION (L"determines whether axes are drawn around the picture. "
+TAG (U"##Garnish")
+DEFINITION (U"determines whether axes are drawn around the picture. "
 	"Turn this button off if you prefer to garnish your picture by yourself with the @Margins menu.")
-ENTRY (L"Behaviour")
-NORMAL (L"For every element of the Matrix inside the specified windowing domain, "
+ENTRY (U"Behaviour")
+NORMAL (U"For every element of the Matrix inside the specified windowing domain, "
 	"an opaque white or black rectangle is painted (white if the value of the element is positive, "
 	"black if it is negative), surrounded by a thin black box. "
 	"The %area of the rectangle is proportional to the value of the element.")
-ENTRY (L"Trick")
-NORMAL (L"If you prefer the %sides of the rectangle (instead of the area) to be proportional "
+ENTRY (U"Trick")
+NORMAL (U"If you prefer the %sides of the rectangle (instead of the area) to be proportional "
 	"to the value of the element, you can use the formula \"$$self\\^ 2$\" before drawing (see @@Matrix: Formula...@).") 
 MAN_END
 
-MAN_BEGIN (L"Matrix: Formula...", L"ppgb", 20021206)
-INTRO (L"A command for changing the data in all selected @Matrix objects.")
-NORMAL (L"See the @Formulas tutorial for examples and explanations.")
+MAN_BEGIN (U"Matrix: Formula...", U"ppgb", 20021206)
+INTRO (U"A command for changing the data in all selected @Matrix objects.")
+NORMAL (U"See the @Formulas tutorial for examples and explanations.")
 MAN_END
 
-MAN_BEGIN (L"Matrix: Paint cells...", L"ppgb", 20021204)
-INTRO (L"A command to draw the contents of a @Matrix to the @@Picture window at .")
-NORMAL (L"Every cell of the matrix is drawn as a rectangle filled with a grey value between white (if the content "
+MAN_BEGIN (U"Matrix: Paint cells...", U"ppgb", 20021204)
+INTRO (U"A command to draw the contents of a @Matrix to the @@Picture window at .")
+NORMAL (U"Every cell of the matrix is drawn as a rectangle filled with a grey value between white (if the content "
 	"of the cell is small) and black (if the content is large).")
 MAN_END
 
@@ -1167,15 +1165,15 @@ behalve element 16000, dat op 1 gezet wordt. De expressie is namelijk booleaans:
 Dit staat allemaal in de on-line handleiding, dus je hoeft niet te gokken!
 */
 
-MAN_BEGIN (L"Matrix: Set value...", L"ppgb", 19980319)
-INTRO (L"A command to change the value of one cell in each selected @Matrix object.")
-ENTRY (L"Settings")
-TAG (L"##Row number")
-DEFINITION (L"the number of the row of the cell whose value you want to change.")
-TAG (L"##Column number")
-DEFINITION (L"the number of the column of the cell whose value you want to change.")
-TAG (L"##New value")
-DEFINITION (L"the value that you want the specified cell to have.")
+MAN_BEGIN (U"Matrix: Set value...", U"ppgb", 19980319)
+INTRO (U"A command to change the value of one cell in each selected @Matrix object.")
+ENTRY (U"Settings")
+TAG (U"##Row number")
+DEFINITION (U"the number of the row of the cell whose value you want to change.")
+TAG (U"##Column number")
+DEFINITION (U"the number of the column of the cell whose value you want to change.")
+TAG (U"##New value")
+DEFINITION (U"the value that you want the specified cell to have.")
 MAN_END
 
 /*
@@ -1317,516 +1315,516 @@ suggestions as to oversights in my implementation, or other possible problems
 or incorrect choices.
 */
 
-MAN_BEGIN (L"Matrix: To TableOfReal", L"ppgb", 19991030)
-INTRO (L"A command to convert every selected @Matrix to a @TableOfReal.")
-NORMAL (L"This command is available from the #Cast menu. The resulting TableOfReal "
+MAN_BEGIN (U"Matrix: To TableOfReal", U"ppgb", 19991030)
+INTRO (U"A command to convert every selected @Matrix to a @TableOfReal.")
+NORMAL (U"This command is available from the #Cast menu. The resulting TableOfReal "
 	"has the same number of rows and columns as the original Matrix, "
 	"and the same data in the cells. However, it does not yet have any row or column "
 	"labels; you can add those with some commands from the TableOfReal #Modify menu.")
 MAN_END
 
-MAN_BEGIN (L"Modify", L"ppgb", 20021204)
-INTRO (L"The title of a submenu of the @@dynamic menu@ for many object types. "
+MAN_BEGIN (U"Modify", U"ppgb", 20021204)
+INTRO (U"The title of a submenu of the @@dynamic menu@ for many object types. "
 	"This submenu usually collects all the commands that can change the selected object.")
 MAN_END
 
-MAN_BEGIN (L"PairDistribution", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat. A "
+MAN_BEGIN (U"PairDistribution", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat. A "
 	"PairDistribution object represents the relative probabilities with which "
 	"the specified pairs of strings occur.")
-ENTRY (L"Class description")
-TAG (L"##struct-list# pairs")
-DEFINITION (L"a list of relative string-pair probabilities. Each element consists of:")
-TAG1 (L"#string %string1")
-DEFINITION1 (L"the first string.")
-TAG1 (L"#string %string2")
-DEFINITION1 (L"the second string.")
-TAG1 (L"#real %weight")
-DEFINITION1 (L"the relative probability associated with the string pair. This value cannot be negative.")
-MAN_END
-
-MAN_BEGIN (L"PairDistribution: To Stringses...", L"ppgb", 20030916)
-INTRO (L"A command to generate a number of string pairs from the selected @PairDistribution object. "
+ENTRY (U"Class description")
+TAG (U"##struct-list# pairs")
+DEFINITION (U"a list of relative string-pair probabilities. Each element consists of:")
+TAG1 (U"#string %string1")
+DEFINITION1 (U"the first string.")
+TAG1 (U"#string %string2")
+DEFINITION1 (U"the second string.")
+TAG1 (U"#real %weight")
+DEFINITION1 (U"the relative probability associated with the string pair. This value cannot be negative.")
+MAN_END
+
+MAN_BEGIN (U"PairDistribution: To Stringses...", U"ppgb", 20030916)
+INTRO (U"A command to generate a number of string pairs from the selected @PairDistribution object. "
 	"This command will create two aligned @Strings objects of equal size.")
-ENTRY (L"Settings")
-TAG (L"##Number# (standard: 1000)")
-DEFINITION (L"the number of the strings in either resulting Strings object.")
-TAG (L"##Name of first Strings# (standard: \"input\")")
-DEFINITION (L"the name of the resulting Strings object associated with the first string of each pair.")
-TAG (L"##Name of second Strings# (standard: \"output\")")
-DEFINITION (L"the name of the resulting Strings object associated with the second string of each pair.")
-ENTRY (L"Example")
-NORMAL (L"Suppose the PairDistribution contains the following:")
-CODE (L"4 pairs")
-CODE (L"\"at+ma\"  \"atma\"  100")
-CODE (L"\"at+ma\"  \"apma\"    0")
-CODE (L"\"an+pa\"  \"anpa\"   20")
-CODE (L"\"an+pa\"  \"ampa\"   80")
-NORMAL (L"The resulting Strings object \"input\" may then contain:")
-FORMULA (L"at+ma, an+pa, an+pa, at+ma, at+ma, an+pa, an+pa, an+pa, an+pa, at+ma, ...")
-NORMAL (L"The Strings object \"output\" may then contain:")
-FORMULA (L"atma,  ampa,  ampa,  atma,  atma,  ampa,  anpa,  ampa,  ampa,  atma, ...")
-MAN_END
-
-MAN_BEGIN (L"ParamCurve", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"An object of class #ParamCurve represents a sequence of time-stamped points (%x (%%t__i_), %y (%%t__i_)) "
+ENTRY (U"Settings")
+TAG (U"##Number# (standard: 1000)")
+DEFINITION (U"the number of the strings in either resulting Strings object.")
+TAG (U"##Name of first Strings# (standard: \"input\")")
+DEFINITION (U"the name of the resulting Strings object associated with the first string of each pair.")
+TAG (U"##Name of second Strings# (standard: \"output\")")
+DEFINITION (U"the name of the resulting Strings object associated with the second string of each pair.")
+ENTRY (U"Example")
+NORMAL (U"Suppose the PairDistribution contains the following:")
+CODE (U"4 pairs")
+CODE (U"\"at+ma\"  \"atma\"  100")
+CODE (U"\"at+ma\"  \"apma\"    0")
+CODE (U"\"an+pa\"  \"anpa\"   20")
+CODE (U"\"an+pa\"  \"ampa\"   80")
+NORMAL (U"The resulting Strings object \"input\" may then contain:")
+FORMULA (U"at+ma, an+pa, an+pa, at+ma, at+ma, an+pa, an+pa, an+pa, an+pa, at+ma, ...")
+NORMAL (U"The Strings object \"output\" may then contain:")
+FORMULA (U"atma,  ampa,  ampa,  atma,  atma,  ampa,  anpa,  ampa,  ampa,  atma, ...")
+MAN_END
+
+MAN_BEGIN (U"ParamCurve", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"An object of class #ParamCurve represents a sequence of time-stamped points (%x (%%t__i_), %y (%%t__i_)) "
 	"in a two-dimensional space.")
 MAN_END
 
-MAN_BEGIN (L"PointEditor", L"ppgb", 20110128)
-INTRO (L"One of the @Editors in Praat, for viewing and manipulating a @PointProcess object, "
+MAN_BEGIN (U"PointEditor", U"ppgb", 20110128)
+INTRO (U"One of the @Editors in Praat, for viewing and manipulating a @PointProcess object, "
 	"which is optionally shown together with a @Sound object.")
-ENTRY (L"Objects")
-NORMAL (L"The editor shows:")
-LIST_ITEM (L"• The @Sound, if you selected a Sound object together with the PointProcess object "
+ENTRY (U"Objects")
+NORMAL (U"The editor shows:")
+LIST_ITEM (U"• The @Sound, if you selected a Sound object together with the PointProcess object "
 	"before you clicked ##View & Edit#.")
-LIST_ITEM (L"• The @PointProcess; vertical blue lines represent the points.")
-ENTRY (L"Playing")
-NORMAL (L"To play (a part of) the %resynthesized sound (pulse train): "
+LIST_ITEM (U"• The @PointProcess; vertical blue lines represent the points.")
+ENTRY (U"Playing")
+NORMAL (U"To play (a part of) the %resynthesized sound (pulse train): "
 	"@click on any of the 8 buttons below and above the drawing area, or choose a Play command from the View menu.")
-NORMAL (L"To play the %original sound instead, use @@Shift-click at .")
-ENTRY (L"Adding a point")
-NORMAL (L"@Click at the desired time location, and choose \"Add point at cursor\" or type ##Command-P#.")
-ENTRY (L"Removing points")
-NORMAL (L"To remove one or more points, "
+NORMAL (U"To play the %original sound instead, use @@Shift-click at .")
+ENTRY (U"Adding a point")
+NORMAL (U"@Click at the desired time location, and choose \"Add point at cursor\" or type ##Command-P#.")
+ENTRY (U"Removing points")
+NORMAL (U"To remove one or more points, "
 	"make a @@time selection@ and choose ##Remove point(s)# from the ##Point# menu. "
 	"If there is no selection, the point nearest to the cursor is removed.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess", L"ppgb", 20110128)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"A PointProcess object represents a %%point process%, "
+MAN_BEGIN (U"PointProcess", U"ppgb", 20110128)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"A PointProcess object represents a %%point process%, "
 	"which is a sequence of %points %t__%i_ in time, defined on a domain [%t__%min_, %t__%max_]. "
 	"The index %i runs from 1 to the number of points. The points are sorted by time, i.e. %t__%i+1_ > %t__%i_.")
-ENTRY (L"PointProcess commands")
-NORMAL (L"Creation from scratch:")
-LIST_ITEM (L"• @@Create empty PointProcess...@")
-LIST_ITEM (L"• @@Create Poisson process...@")
-NORMAL (L"Creation of a pulse train from a pitch contour:")
-LIST_ITEM (L"• @@PitchTier: To PointProcess@: area-1 along entire time domain.")
-LIST_ITEM (L"• @@Pitch: To PointProcess@: same, but excludes voiceless intervals.")
-LIST_ITEM (L"• @@Sound & Pitch: To PointProcess (cc)@: \"pitch-synchronous\": near locations of high amplitude.")
-LIST_ITEM (L"• @@Sound & Pitch: To PointProcess (peaks)...@: \"pitch-synchronous\": near locations of high amplitude.")
-LIST_ITEM (L"• @@Sound: To PointProcess (periodic, cc)...@: near locations of high amplitude.")
-LIST_ITEM (L"• @@Sound: To PointProcess (periodic, peaks)...@: near locations of high amplitude.")
-NORMAL (L"Creation from converting another object:")
-LIST_ITEM (L"• ##Matrix: To PointProcess")
-LIST_ITEM (L"• @@PitchTier: Down to PointProcess@")
-LIST_ITEM (L"• @@IntensityTier: Down to PointProcess@")
-NORMAL (L"Hearing:")
-LIST_ITEM (L"• @@PointProcess: Play@: pulse train.")
-LIST_ITEM (L"• @@PointProcess: Hum@: pulse train with formants.")
-NORMAL (L"Drawing:")
-LIST_ITEM (L"• @@PointProcess: Draw...@")
-NORMAL (L"Editing:")
-LIST_ITEM (L"• ##PointProcess: View & Edit#: invokes a @PointEditor.")
-LIST_ITEM (L"• ##PointProcess & Sound: View & Edit#: invokes a @PointEditor.")
-LIST_ITEM (L"• Inside a @ManipulationEditor.")
-NORMAL (L"Queries:")
-LIST_ITEM (L"• @@PointProcess: Get jitter (local)...@: periodic jitter.")
-LIST_ITEM (L"• @@PointProcess: Get jitter (local, absolute)...@: periodic jitter.")
-LIST_ITEM (L"• @@PointProcess: Get jitter (rap)...@: periodic jitter.")
-LIST_ITEM (L"• @@PointProcess: Get jitter (ppq5)...@: periodic jitter.")
-LIST_ITEM (L"• @@PointProcess: Get jitter (ddp)...@: periodic jitter.")
-LIST_ITEM (L"• @@PointProcess: Get low index...@: index of nearest point not after specified time.")
-LIST_ITEM (L"• @@PointProcess: Get high index...@: index of nearest point not before specified time.")
-LIST_ITEM (L"• @@PointProcess: Get nearest index...@: index of point nearest to specified time.")
-LIST_ITEM (L"• @@PointProcess: Get interval...@: duration of interval around specified time.")
-NORMAL (L"Set calculations:")
-LIST_ITEM (L"• @@PointProcesses: Union@: the union of two point processes.")
-LIST_ITEM (L"• @@PointProcesses: Intersection@: the intersection of two point processes.")
-LIST_ITEM (L"• @@PointProcesses: Difference@: the difference of two point processes.")
-NORMAL (L"Modification:")
-LIST_ITEM (L"• @@PointProcess: Add point...@: at a specified time.")
-LIST_ITEM (L"• @@PointProcess: Remove point...@: at specified index.")
-LIST_ITEM (L"• @@PointProcess: Remove point near...@: near specified time.")
-LIST_ITEM (L"• @@PointProcess: Remove points...@: between specified indices.")
-LIST_ITEM (L"• @@PointProcess: Remove points between...@: between specified times.")
-NORMAL (L"Analysis:")
-LIST_ITEM (L"• @@PointProcess: To PitchTier...@: pitch values in interval centres.")
-LIST_ITEM (L"• ##PointProcess & Sound: To Manipulation")
-NORMAL (L"Synthesis:")
-LIST_ITEM (L"• @@PointProcess: To Sound (pulse train)...@")
-LIST_ITEM (L"• @@PointProcess: To Sound (hum)...@")
-NORMAL (L"Conversion:")
-LIST_ITEM (L"• ##PointProcess: To Matrix")
-LIST_ITEM (L"• @@PointProcess: Up to TextGrid...")
-LIST_ITEM (L"• @@PointProcess: Up to PitchTier...")
-LIST_ITEM (L"• @@PointProcess: Up to IntensityTier...")
-MAN_END
-
-MAN_BEGIN (L"PointProcess: Add point...", L"ppgb", 20010410)
-INTRO (L"A command to add a point to each selected @PointProcess.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which a point is to be added.")
-ENTRY (L"Behaviour")
-NORMAL (L"The point process is modified so that it contains the new point. "
+ENTRY (U"PointProcess commands")
+NORMAL (U"Creation from scratch:")
+LIST_ITEM (U"• @@Create empty PointProcess...@")
+LIST_ITEM (U"• @@Create Poisson process...@")
+NORMAL (U"Creation of a pulse train from a pitch contour:")
+LIST_ITEM (U"• @@PitchTier: To PointProcess@: area-1 along entire time domain.")
+LIST_ITEM (U"• @@Pitch: To PointProcess@: same, but excludes voiceless intervals.")
+LIST_ITEM (U"• @@Sound & Pitch: To PointProcess (cc)@: \"pitch-synchronous\": near locations of high amplitude.")
+LIST_ITEM (U"• @@Sound & Pitch: To PointProcess (peaks)...@: \"pitch-synchronous\": near locations of high amplitude.")
+LIST_ITEM (U"• @@Sound: To PointProcess (periodic, cc)...@: near locations of high amplitude.")
+LIST_ITEM (U"• @@Sound: To PointProcess (periodic, peaks)...@: near locations of high amplitude.")
+NORMAL (U"Creation from converting another object:")
+LIST_ITEM (U"• ##Matrix: To PointProcess")
+LIST_ITEM (U"• @@PitchTier: Down to PointProcess@")
+LIST_ITEM (U"• @@IntensityTier: Down to PointProcess@")
+NORMAL (U"Hearing:")
+LIST_ITEM (U"• @@PointProcess: Play@: pulse train.")
+LIST_ITEM (U"• @@PointProcess: Hum@: pulse train with formants.")
+NORMAL (U"Drawing:")
+LIST_ITEM (U"• @@PointProcess: Draw...@")
+NORMAL (U"Editing:")
+LIST_ITEM (U"• ##PointProcess: View & Edit#: invokes a @PointEditor.")
+LIST_ITEM (U"• ##PointProcess & Sound: View & Edit#: invokes a @PointEditor.")
+LIST_ITEM (U"• Inside a @ManipulationEditor.")
+NORMAL (U"Queries:")
+LIST_ITEM (U"• @@PointProcess: Get jitter (local)...@: periodic jitter.")
+LIST_ITEM (U"• @@PointProcess: Get jitter (local, absolute)...@: periodic jitter.")
+LIST_ITEM (U"• @@PointProcess: Get jitter (rap)...@: periodic jitter.")
+LIST_ITEM (U"• @@PointProcess: Get jitter (ppq5)...@: periodic jitter.")
+LIST_ITEM (U"• @@PointProcess: Get jitter (ddp)...@: periodic jitter.")
+LIST_ITEM (U"• @@PointProcess: Get low index...@: index of nearest point not after specified time.")
+LIST_ITEM (U"• @@PointProcess: Get high index...@: index of nearest point not before specified time.")
+LIST_ITEM (U"• @@PointProcess: Get nearest index...@: index of point nearest to specified time.")
+LIST_ITEM (U"• @@PointProcess: Get interval...@: duration of interval around specified time.")
+NORMAL (U"Set calculations:")
+LIST_ITEM (U"• @@PointProcesses: Union@: the union of two point processes.")
+LIST_ITEM (U"• @@PointProcesses: Intersection@: the intersection of two point processes.")
+LIST_ITEM (U"• @@PointProcesses: Difference@: the difference of two point processes.")
+NORMAL (U"Modification:")
+LIST_ITEM (U"• @@PointProcess: Add point...@: at a specified time.")
+LIST_ITEM (U"• @@PointProcess: Remove point...@: at specified index.")
+LIST_ITEM (U"• @@PointProcess: Remove point near...@: near specified time.")
+LIST_ITEM (U"• @@PointProcess: Remove points...@: between specified indices.")
+LIST_ITEM (U"• @@PointProcess: Remove points between...@: between specified times.")
+NORMAL (U"Analysis:")
+LIST_ITEM (U"• @@PointProcess: To PitchTier...@: pitch values in interval centres.")
+LIST_ITEM (U"• ##PointProcess & Sound: To Manipulation")
+NORMAL (U"Synthesis:")
+LIST_ITEM (U"• @@PointProcess: To Sound (pulse train)...@")
+LIST_ITEM (U"• @@PointProcess: To Sound (hum)...@")
+NORMAL (U"Conversion:")
+LIST_ITEM (U"• ##PointProcess: To Matrix")
+LIST_ITEM (U"• @@PointProcess: Up to TextGrid...")
+LIST_ITEM (U"• @@PointProcess: Up to PitchTier...")
+LIST_ITEM (U"• @@PointProcess: Up to IntensityTier...")
+MAN_END
+
+MAN_BEGIN (U"PointProcess: Add point...", U"ppgb", 20010410)
+INTRO (U"A command to add a point to each selected @PointProcess.")
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which a point is to be added.")
+ENTRY (U"Behaviour")
+NORMAL (U"The point process is modified so that it contains the new point. "
 	"If a point at the specified time was already present in the point process, nothing happens.")
 MAN_END
 
-MAN_BEGIN (L"PointProcesses: Difference", L"ppgb", 20021212)
-INTRO (L"A command to compute the difference of two selected @PointProcess objects.")
-ENTRY (L"Behaviour")
-NORMAL (L"The resulting #PointProcess will contain only those points of the first selected original point process "
+MAN_BEGIN (U"PointProcesses: Difference", U"ppgb", 20021212)
+INTRO (U"A command to compute the difference of two selected @PointProcess objects.")
+ENTRY (U"Behaviour")
+NORMAL (U"The resulting #PointProcess will contain only those points of the first selected original point process "
 	"that do not occur in the second.")
-NORMAL (L"The time domain of the resulting point process is equal to the time domain of the first original point process.")
+NORMAL (U"The time domain of the resulting point process is equal to the time domain of the first original point process.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Draw...", L"ppgb", 20021212)
-INTRO (L"A command to draw every selected @PointProcess into the @@Picture window at .")
+MAN_BEGIN (U"PointProcess: Draw...", U"ppgb", 20021212)
+INTRO (U"A command to draw every selected @PointProcess into the @@Picture window at .")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Get high index...", L"ppgb", 20021212)
-INTRO (L"A @query to the selected @PointProcess object.")
-ENTRY (L"Return value")
-NORMAL (L"the index of the nearest point at or after the specified time, "
+MAN_BEGIN (U"PointProcess: Get high index...", U"ppgb", 20021212)
+INTRO (U"A @query to the selected @PointProcess object.")
+ENTRY (U"Return value")
+NORMAL (U"the index of the nearest point at or after the specified time, "
 	"0 if the point process contains no points, "
 	"or a number higher than the number of points if the specified time is after the last point.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time from which a point is looked for, in seconds.")
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time from which a point is looked for, in seconds.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Get interval...", L"ppgb", 20021212)
-INTRO (L"A @query to the selected @PointProcess object.")
-ENTRY (L"Return value")
-NORMAL (L"the duration of the interval around a specified time. "
+MAN_BEGIN (U"PointProcess: Get interval...", U"ppgb", 20021212)
+INTRO (U"A @query to the selected @PointProcess object.")
+ENTRY (U"Return value")
+NORMAL (U"the duration of the interval around a specified time. "
 	"if the point process contains no points or if the specified time falls before the first point "
 	"or not before the last point, the value is @undefined. Otherwise, the result is the distance between "
 	"the nearest points to the left and to the right of the specified time. "
 	"If the point process happens to contain a point at exactly the specified time, "
 	"the duration of the interval following this point is returned.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time around which a point is looked for, in seconds.")
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time around which a point is looked for, in seconds.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Get jitter (local)...", L"ppgb", 20110302)
-INTRO (L"A command that becomes available in the #Query submenu when you select a @PointProcess object.")
-NORMAL (L"This command will write into the Info window "
+MAN_BEGIN (U"PointProcess: Get jitter (local)...", U"ppgb", 20110302)
+INTRO (U"A command that becomes available in the #Query submenu when you select a @PointProcess object.")
+NORMAL (U"This command will write into the Info window "
 	"the %%local jitter%, which is the average absolute difference between consecutive intervals, "
 	"divided by the average interval (an interval is the time between two consecutive points).")
-NORMAL (L"As %jitter is often used as a measure of voice quality (see @@Voice 2. Jitter@), "
+NORMAL (U"As %jitter is often used as a measure of voice quality (see @@Voice 2. Jitter@), "
 	"the intervals are often considered to be %%glottal periods%. "
 	"For this reason, the command has settings that can limit the possible duration of the interval (or period) "
 	"or the possible difference in the durations of consecutive intervals (periods).")
-ENTRY (L"1. The command window")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), L""
+ENTRY (U"1. The command window")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), U""
 	Manual_DRAW_SETTINGS_WINDOW ("PointProcess: Get jitter (local)", 4)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Time range (s)", "0.0", "0.0 (= all)")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Period floor (s)", "0.0001")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Period ceiling (s)", "0.02")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Maximum period factor", "1.3")
 )
-TAG (L"##Time range (s)")
-DEFINITION (L"the start time and end time of the part of the PointProcess that will be measured. "
+TAG (U"##Time range (s)")
+DEFINITION (U"the start time and end time of the part of the PointProcess that will be measured. "
 	"Points outside this range will be ignored.")
-TAG (L"##Period floor (s)")
-DEFINITION (L"the shortest possible interval that will be used in the computation of jitter, in seconds. "
+TAG (U"##Period floor (s)")
+DEFINITION (U"the shortest possible interval that will be used in the computation of jitter, in seconds. "
 	"If an interval is shorter than this, it will be ignored in the computation of jitter "
 	"(and the previous and next intervals will not be regarded as consecutive). "
 	"This setting will normally be very small, say 0.1 ms.")
-TAG (L"##Period ceiling (s)")
-DEFINITION (L"the longest possible interval that will be used in the computation of jitter, in seconds. "
+TAG (U"##Period ceiling (s)")
+DEFINITION (U"the longest possible interval that will be used in the computation of jitter, in seconds. "
 	"If an interval is longer than this, it will be ignored in the computation of jitter "
 	"(and the previous and next intervals will not be regarded as consecutive). "
 	"For example, if the minimum frequency of periodicity is 50 Hz, set this setting to 0.02 seconds; "
 	"intervals longer than that could be regarded as voiceless stretches and will be ignored in the computation.")
-TAG (L"##Maximum period factor")
-DEFINITION (L"the largest possible difference between consecutive intervals that will be used in the computation of jitter. "
+TAG (U"##Maximum period factor")
+DEFINITION (U"the largest possible difference between consecutive intervals that will be used in the computation of jitter. "
 	"If the ratio of the durations of two consecutive intervals is greater than this, "
 	"this pair of intervals will be ignored in the computation of jitter "
 	"(each of the intervals could still take part in the computation of jitter in a comparison with its neighbour on the other side).")
-ENTRY (L"2. Usage")
-NORMAL (L"The local jitter can be used as a measure of voice quality; "
+ENTRY (U"2. Usage")
+NORMAL (U"The local jitter can be used as a measure of voice quality; "
 	"it is the most common jitter measurement and is usually expressed as a percentage. See @@Voice 2. Jitter at .")
-ENTRY (L"3. Algorithm")
-NORMAL (L"(In the following the term %absolute means two different things: (1) the absolute (i.e. non-negative) value of a real number, "
+ENTRY (U"3. Algorithm")
+NORMAL (U"(In the following the term %absolute means two different things: (1) the absolute (i.e. non-negative) value of a real number, "
 	"and (2) the opposite of %relative.)")
-NORMAL (L"The local jitter is defined as the relative mean absolute "
+NORMAL (U"The local jitter is defined as the relative mean absolute "
 	"second-order difference of the point process (= the first-order difference of the interval process), as follows.")
-NORMAL (L"First, we define the absolute (non-relative) local jitter (in seconds) as the mean absolute (non-negative) "
+NORMAL (U"First, we define the absolute (non-relative) local jitter (in seconds) as the mean absolute (non-negative) "
 	"difference of consecutive intervals:")
-FORMULA (L"%jitter(seconds) = ∑__%i=2_^^%N^ |%T__%i_ - %T__%i-1_| / (%N - 1)")
-NORMAL (L"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
+FORMULA (U"%jitter(seconds) = ∑__%i=2_^^%N^ |%T__%i_ - %T__%i-1_| / (%N - 1)")
+NORMAL (U"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
 	"If an interval %T__%i-1_ or %T__%i_ is not between ##Period floor# and ##Period ceiling#, "
 	"or if %T__%i-1_/%T__%i_ or %T__%i_/%T__%i-1_ is greater than ##Maximum period factor#, "
 	"the term |%T__%i_ - %T__%i-1_| is not counted in the sum, and %N is lowered by 1 "
 	"(if %N ends up being less than 2, the result of the command is @undefined).")
-NORMAL (L"Second, we define the mean period as")
-FORMULA (L"%meanPeriod(seconds) = ∑__%i=1_^^%N^ %T__%i_ / %N")
-NORMAL (L"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
+NORMAL (U"Second, we define the mean period as")
+FORMULA (U"%meanPeriod(seconds) = ∑__%i=1_^^%N^ %T__%i_ / %N")
+NORMAL (U"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
 	"If an interval %T__%i_ is not between ##Period floor# and ##Period ceiling#, "
 	"or if %T__%i-1_/%T__%i_ or %T__%i_/%T__%i-1_ is greater than ##Maximum period factor# "
 	"%and %T__%i+1_/%T__%i_ or %T__%i_/%T__%i+1_ is greater than ##Maximum period factor#, "
 	"the term %T__%i_ is not counted in the sum, and %N is lowered by 1; "
 	"this procedure ensures that in the computation of the mean period we use at least all the intervals "
 	"that had taken part in the computation of the absolute local jitter.")
-NORMAL (L"Finally, we compute the (relative) local jitter as")
-FORMULA (L"%jitter = %jitter(seconds) / %meanPeriod(seconds)")
-NORMAL (L"The result is a value between 0 and 2, or between 0 and 200 percent.")
+NORMAL (U"Finally, we compute the (relative) local jitter as")
+FORMULA (U"%jitter = %jitter(seconds) / %meanPeriod(seconds)")
+NORMAL (U"The result is a value between 0 and 2, or between 0 and 200 percent.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Get jitter (local, absolute)...", L"ppgb", 20110220)
-INTRO (L"A command that becomes available in the #Query submenu when you select a @PointProcess object.")
-NORMAL (L"This command will write into the Info window "
+MAN_BEGIN (U"PointProcess: Get jitter (local, absolute)...", U"ppgb", 20110220)
+INTRO (U"A command that becomes available in the #Query submenu when you select a @PointProcess object.")
+NORMAL (U"This command will write into the Info window "
 	"the %%absolute local jitter%, which is the average absolute difference between consecutive intervals, "
 	"in seconds (an interval is the time between two consecutive points).")
-NORMAL (L"As %jitter is often used as a measure of voice quality (see @@Voice 2. Jitter@), "
+NORMAL (U"As %jitter is often used as a measure of voice quality (see @@Voice 2. Jitter@), "
 	"the intervals are often considered to be %%glottal periods%. "
 	"For this reason, the command has settings that can limit the possible duration of the interval (or period) "
 	"or the possible difference in the durations of consecutive intervals (periods).")
-ENTRY (L"1. The command window")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), L""
+ENTRY (U"1. The command window")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), U""
 	Manual_DRAW_SETTINGS_WINDOW ("PointProcess: Get jitter (local, absolute)", 4)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Time range (s)", "0.0", "0.0 (= all)")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Period floor (s)", "0.0001")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Period ceiling (s)", "0.02")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Maximum period factor", "1.3")
 )
-TAG (L"##Time range (s)")
-DEFINITION (L"the start time and end time of the part of the PointProcess that will be measured. "
+TAG (U"##Time range (s)")
+DEFINITION (U"the start time and end time of the part of the PointProcess that will be measured. "
 	"Points outside this range will be ignored.")
-TAG (L"##Period floor (s)")
-DEFINITION (L"the shortest possible interval that will be used in the computation of jitter, in seconds. "
+TAG (U"##Period floor (s)")
+DEFINITION (U"the shortest possible interval that will be used in the computation of jitter, in seconds. "
 	"If an interval is shorter than this, it will be ignored in the computation of jitter "
 	"(and the previous and next intervals will not be regarded as consecutive). "
 	"This setting will normally be very small, say 0.1 ms.")
-TAG (L"##Period ceiling (s)")
-DEFINITION (L"the longest possible interval that will be used in the computation of jitter, in seconds. "
+TAG (U"##Period ceiling (s)")
+DEFINITION (U"the longest possible interval that will be used in the computation of jitter, in seconds. "
 	"If an interval is longer than this, it will be ignored in the computation of jitter "
 	"(and the previous and next intervals will not be regarded as consecutive). "
 	"For example, if the minimum frequency of periodicity is 50 Hz, set this argument to 0.02 seconds; "
 	"intervals longer than that could be regarded as voiceless stretches and will be ignored in the computation.")
-TAG (L"##Maximum period factor")
-DEFINITION (L"the largest possible difference between consecutive intervals that will be used in the computation of jitter. "
+TAG (U"##Maximum period factor")
+DEFINITION (U"the largest possible difference between consecutive intervals that will be used in the computation of jitter. "
 	"If the ratio of the durations of two consecutive intervals is greater than this, "
 	"this pair of intervals will be ignored in the computation of jitter "
 	"(each of the intervals could still take part in the computation of jitter in a comparison with its neighbour on the other side).")
-ENTRY (L"2. Usage")
-NORMAL (L"The local jitter can be used as a measure of voice quality. See @@Voice 2. Jitter at .")
-ENTRY (L"3. Algorithm")
-NORMAL (L"The absolute local jitter is defined as the absolute (i.e. non-relative) mean absolute (i.e. non-negative) "
+ENTRY (U"2. Usage")
+NORMAL (U"The local jitter can be used as a measure of voice quality. See @@Voice 2. Jitter at .")
+ENTRY (U"3. Algorithm")
+NORMAL (U"The absolute local jitter is defined as the absolute (i.e. non-relative) mean absolute (i.e. non-negative) "
 	"second-order difference of the point process (= the first-order difference of the interval process), as follows.")
-NORMAL (L"The absolute local jitter (in seconds) is the mean absolute (non-negative) "
+NORMAL (U"The absolute local jitter (in seconds) is the mean absolute (non-negative) "
 	"difference of consecutive intervals:")
-FORMULA (L"%jitter(seconds) = ∑__%i=2_^^%N^ |%T__%i_ - %T__%i-1_| / (%N - 1)")
-NORMAL (L"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
+FORMULA (U"%jitter(seconds) = ∑__%i=2_^^%N^ |%T__%i_ - %T__%i-1_| / (%N - 1)")
+NORMAL (U"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
 	"If an interval %T__%i-1_ or %T__%i_ is not between ##Period floor# and ##Period ceiling#, "
 	"or if %T__%i-1_/%T__%i_ or %T__%i_/%T__%i-1_ is greater than ##Maximum period factor#, "
 	"the term |%T__%i_ - %T__%i-1_| is not counted in the sum, and %N is lowered by 1 "
 	"(if %N ends up being less than 2, the result of the command is @undefined).")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Get jitter (rap)...", L"ppgb", 20110302)
-INTRO (L"A command that becomes available in the #Query submenu when you select a @PointProcess object.")
-NORMAL (L"This command will write into the Info window the %%Relative Average Perturbation% (RAP), "
+MAN_BEGIN (U"PointProcess: Get jitter (rap)...", U"ppgb", 20110302)
+INTRO (U"A command that becomes available in the #Query submenu when you select a @PointProcess object.")
+NORMAL (U"This command will write into the Info window the %%Relative Average Perturbation% (RAP), "
 	"a jitter measure defined as the average absolute difference between an interval and the average of it and its two neighbours, "
 	"divided by the average interval (an interval is the time between two consecutive points).")
-NORMAL (L"As jitter is often used as a measure of voice quality (see @@Voice 2. Jitter@), "
+NORMAL (U"As jitter is often used as a measure of voice quality (see @@Voice 2. Jitter@), "
 	"the intervals are often considered to be %%glottal periods%. "
 	"For this reason, the command has settings that can limit the possible duration of the interval (or period) "
 	"or the possible difference in the durations of consecutive intervals (periods).")
-ENTRY (L"1. The command window")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), L""
+ENTRY (U"1. The command window")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), U""
 	Manual_DRAW_SETTINGS_WINDOW ("PointProcess: Get jitter (rap)", 4)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Time range (s)", "0.0", "0.0 (= all)")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Period floor (s)", "0.0001")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Period ceiling (s)", "0.02")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Maximum period factor", "1.3")
 )
-TAG (L"##Time range (s)")
-DEFINITION (L"the start time and end time of the part of the PointProcess that will be measured. "
+TAG (U"##Time range (s)")
+DEFINITION (U"the start time and end time of the part of the PointProcess that will be measured. "
 	"Points outside this range will be ignored.")
-TAG (L"##Period floor (s)")
-DEFINITION (L"the shortest possible interval that will be used in the computation of jitter, in seconds. "
+TAG (U"##Period floor (s)")
+DEFINITION (U"the shortest possible interval that will be used in the computation of jitter, in seconds. "
 	"If an interval is shorter than this, it will be ignored in the computation of jitter "
 	"(and the previous and next intervals will not be regarded as consecutive). "
 	"This setting will normally be very small, say 0.1 ms.")
-TAG (L"##Period ceiling (s)")
-DEFINITION (L"the longest possible interval that will be used in the computation of jitter, in seconds. "
+TAG (U"##Period ceiling (s)")
+DEFINITION (U"the longest possible interval that will be used in the computation of jitter, in seconds. "
 	"If an interval is longer than this, it will be ignored in the computation of jitter "
 	"(and the previous and next intervals will not be regarded as consecutive). "
 	"For example, if the minimum frequency of periodicity is 50 Hz, set this argument to 0.02 seconds; "
 	"intervals longer than that could be regarded as voiceless stretches and will be ignored in the computation.")
-TAG (L"##Maximum period factor")
-DEFINITION (L"the largest possible difference between consecutive intervals that will be used in the computation of jitter. "
+TAG (U"##Maximum period factor")
+DEFINITION (U"the largest possible difference between consecutive intervals that will be used in the computation of jitter. "
 	"If the ratio of the durations of two consecutive intervals is greater than this, "
 	"this pair of intervals will be ignored in the computation of jitter "
 	"(each of the intervals could still take part in the computation of jitter in a comparison with its neighbour on the other side).")
-ENTRY (L"2. Usage")
-NORMAL (L"The RAP can be used as a measure of voice quality; "
+ENTRY (U"2. Usage")
+NORMAL (U"The RAP can be used as a measure of voice quality; "
 	"it is the second most common jitter measurement (after @@PointProcess: Get jitter (local)...|local jitter@). See @@Voice 2. Jitter at .")
-ENTRY (L"3. Algorithm")
-NORMAL (L"Relative Average Perturbation is defined in terms of three consecutive intervals, as follows.")
-NORMAL (L"First, we define the absolute (i.e. non-relative) Average Perturbation (in seconds):")
-FORMULA (L"%absAP(seconds) = ∑__%i=2_^^%N-1^ |%T__%i_ - (%T__%i-1_ + %T__%i_ + %T__%i+1_) / 3| / (%N - 2)")
-NORMAL (L"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
+ENTRY (U"3. Algorithm")
+NORMAL (U"Relative Average Perturbation is defined in terms of three consecutive intervals, as follows.")
+NORMAL (U"First, we define the absolute (i.e. non-relative) Average Perturbation (in seconds):")
+FORMULA (U"%absAP(seconds) = ∑__%i=2_^^%N-1^ |%T__%i_ - (%T__%i-1_ + %T__%i_ + %T__%i+1_) / 3| / (%N - 2)")
+NORMAL (U"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
 	"If an interval %T__%i-1_ or %T__%i_ or %T__%i+1_ is not between ##Period floor# and ##Period ceiling#, "
 	"or if %T__%i-1_/%T__%i_ or %T__%i_/%T__%i-1_ or %T__%i+1_/%T__%i_ or %T__%i_/%T__%i+1_ is greater than ##Maximum period factor#, "
 	"the term |%T__%i_ - (%T__%i-1_ + %T__%i_ + %T__%i+1_) / 3| is not counted in the sum, and %N is lowered by 1 "
 	"(if %N ends up being less than 3, the result of the command is @undefined).")
-NORMAL (L"Second, we define the mean period as")
-FORMULA (L"%meanPeriod(seconds) = ∑__%i=1_^^%N^ %T__%i_ / %N")
-NORMAL (L"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
+NORMAL (U"Second, we define the mean period as")
+FORMULA (U"%meanPeriod(seconds) = ∑__%i=1_^^%N^ %T__%i_ / %N")
+NORMAL (U"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
 	"If an interval %T__%i_ is not between ##Period floor# and ##Period ceiling#, "
 	"or if %T__%i-1_/%T__%i_ or %T__%i_/%T__%i-1_ is greater than ##Maximum period factor# "
 	"%and %T__%i+1_/%T__%i_ or %T__%i_/%T__%i+1_ is greater than ##Maximum period factor#, "
 	"the term %T__%i_ is not counted in the sum, and %N is lowered by 1; "
 	"this procedure ensures that in the computation of the mean period we use at least all the intervals "
 	"that had taken part in the computation of the absolute average perturbation.")
-NORMAL (L"Finally, we compute the Relative Average Perturbation as")
-FORMULA (L"%RAP = %absAP(seconds) / %meanPeriod(seconds)")
-NORMAL (L"The result is a value between 0 and 2, or between 0 and 200 percent.")
+NORMAL (U"Finally, we compute the Relative Average Perturbation as")
+FORMULA (U"%RAP = %absAP(seconds) / %meanPeriod(seconds)")
+NORMAL (U"The result is a value between 0 and 2, or between 0 and 200 percent.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Get jitter (ppq5)...", L"ppgb", 20110302)
-INTRO (L"A command that becomes available in the #Query submenu when you select a @PointProcess object.")
-NORMAL (L"This command will write into the Info window the %%five-point Period Perturbation Quotient%, "
+MAN_BEGIN (U"PointProcess: Get jitter (ppq5)...", U"ppgb", 20110302)
+INTRO (U"A command that becomes available in the #Query submenu when you select a @PointProcess object.")
+NORMAL (U"This command will write into the Info window the %%five-point Period Perturbation Quotient%, "
 	"a jitter measure defined as the average absolute difference between an interval and the average of it and its four closest neighbours, "
 	"divided by the average interval (an interval is the time between two consecutive points).")
-NORMAL (L"As jitter is often used as a measure of voice quality (see @@Voice 2. Jitter@), "
+NORMAL (U"As jitter is often used as a measure of voice quality (see @@Voice 2. Jitter@), "
 	"the intervals are often considered to be %%glottal periods%. "
 	"For this reason, the command has settings that can limit the possible duration of the interval (or period) "
 	"or the possible difference in the durations of consecutive intervals (periods).")
-ENTRY (L"1. The command window")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), L""
+ENTRY (U"1. The command window")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), U""
 	Manual_DRAW_SETTINGS_WINDOW ("PointProcess: Get jitter (rap)", 4)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Time range (s)", "0.0", "0.0 (= all)")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Period floor (s)", "0.0001")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Period ceiling (s)", "0.02")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Maximum period factor", "1.3")
 )
-TAG (L"##Time range (s)")
-DEFINITION (L"the start time and end time of the part of the PointProcess that will be measured. "
+TAG (U"##Time range (s)")
+DEFINITION (U"the start time and end time of the part of the PointProcess that will be measured. "
 	"Points outside this range will be ignored.")
-TAG (L"##Period floor (s)")
-DEFINITION (L"the shortest possible interval that will be used in the computation of jitter, in seconds. "
+TAG (U"##Period floor (s)")
+DEFINITION (U"the shortest possible interval that will be used in the computation of jitter, in seconds. "
 	"If an interval is shorter than this, it will be ignored in the computation of jitter "
 	"(and the previous and next intervals will not be regarded as consecutive). "
 	"This setting will normally be very small, say 0.1 ms.")
-TAG (L"##Period ceiling (s)")
-DEFINITION (L"the longest possible interval that will be used in the computation of jitter, in seconds. "
+TAG (U"##Period ceiling (s)")
+DEFINITION (U"the longest possible interval that will be used in the computation of jitter, in seconds. "
 	"If an interval is longer than this, it will be ignored in the computation of jitter "
 	"(and the previous and next intervals will not be regarded as consecutive). "
 	"For example, if the minimum frequency of periodicity is 50 Hz, set this argument to 0.02 seconds; "
 	"intervals longer than that could be regarded as voiceless stretches and will be ignored in the computation.")
-TAG (L"##Maximum period factor")
-DEFINITION (L"the largest possible difference between consecutive intervals that will be used in the computation of jitter. "
+TAG (U"##Maximum period factor")
+DEFINITION (U"the largest possible difference between consecutive intervals that will be used in the computation of jitter. "
 	"If the ratio of the durations of two consecutive intervals is greater than this, "
 	"this pair of intervals will be ignored in the computation of jitter "
 	"(each of the intervals could still take part in the computation of jitter in a comparison with its neighbour on the other side).")
-ENTRY (L"2. Usage")
-NORMAL (L"The jitter can be used as a measure of voice quality. See @@Voice 2. Jitter at .")
-ENTRY (L"3. Algorithm")
-NORMAL (L"The five-point Period Perturbation Quotient (PPQ5) is defined in terms of five consecutive intervals, as follows.")
-NORMAL (L"First, we define the absolute (i.e. non-relative) PPQ5 (in seconds):")
-FORMULA (L"%absPPQ5(seconds) = ∑__%i=3_^^%N-2^ |%T__%i_ - (%T__%i-2_ + %T__%i-1_ + %T__%i_ + %T__%i+1_ + %T__%i+2_) / 5| / (%N - 4)")
-NORMAL (L"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
+ENTRY (U"2. Usage")
+NORMAL (U"The jitter can be used as a measure of voice quality. See @@Voice 2. Jitter at .")
+ENTRY (U"3. Algorithm")
+NORMAL (U"The five-point Period Perturbation Quotient (PPQ5) is defined in terms of five consecutive intervals, as follows.")
+NORMAL (U"First, we define the absolute (i.e. non-relative) PPQ5 (in seconds):")
+FORMULA (U"%absPPQ5(seconds) = ∑__%i=3_^^%N-2^ |%T__%i_ - (%T__%i-2_ + %T__%i-1_ + %T__%i_ + %T__%i+1_ + %T__%i+2_) / 5| / (%N - 4)")
+NORMAL (U"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
 	"If an interval %T__%i-2_ or %T__%i-1_ or %T__%i_ or %T__%i+1_ or %T__%i+2_ is not between ##Period floor# and ##Period ceiling#, "
 	"or if %T__%i-2_/%T__%i-1_ or %T__%i-1_/%T__%i-2_ or %T__%i-1_/%T__%i_ or %T__%i_/%T__%i-1_ or %T__%i+1_/%T__%i_ or %T__%i_/%T__%i+1_ or %T__%i+2_/%T__%i+1_ or %T__%i+1_/%T__%i+2_ is greater than ##Maximum period factor#, "
 	"the term |%T__%i_ - (%T__%i-2_ + %T__%i-1_ + %T__%i_ + %T__%i+1_ + %T__%i+2_) / 5| is not counted in the sum, and %N is lowered by 1 "
 	"(if %N ends up being less than 5, the result of the command is @undefined).")
-NORMAL (L"Second, we define the mean period as")
-FORMULA (L"%meanPeriod(seconds) = ∑__%i=1_^^%N^ %T__%i_ / %N")
-NORMAL (L"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
+NORMAL (U"Second, we define the mean period as")
+FORMULA (U"%meanPeriod(seconds) = ∑__%i=1_^^%N^ %T__%i_ / %N")
+NORMAL (U"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
 	"If an interval %T__%i_ is not between ##Period floor# and ##Period ceiling#, "
 	"or if %T__%i-1_/%T__%i_ or %T__%i_/%T__%i-1_ is greater than ##Maximum period factor# "
 	"%and %T__%i+1_/%T__%i_ or %T__%i_/%T__%i+1_ is greater than ##Maximum period factor#, "
 	"the term %T__%i_ is not counted in the sum, and %N is lowered by 1; "
 	"this procedure ensures that in the computation of the mean period we use at least all the intervals "
 	"that had taken part in the computation of the absolute PPQ5.")
-NORMAL (L"Finally, we compute the five-point Period Perturbation Quotient as")
-FORMULA (L"%PPQ5 = %PPQ5(seconds) / %meanPeriod(seconds)")
-NORMAL (L"The result is a value between 0 and 4, or between 0 and 400 percent.")
+NORMAL (U"Finally, we compute the five-point Period Perturbation Quotient as")
+FORMULA (U"%PPQ5 = %PPQ5(seconds) / %meanPeriod(seconds)")
+NORMAL (U"The result is a value between 0 and 4, or between 0 and 400 percent.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Get jitter (ddp)...", L"ppgb", 20110302)
-INTRO (L"A command that becomes available in the #Query submenu when you select a @PointProcess object.")
-NORMAL (L"This command will write into the Info window the %%Difference of Differences of Periods%, "
+MAN_BEGIN (U"PointProcess: Get jitter (ddp)...", U"ppgb", 20110302)
+INTRO (U"A command that becomes available in the #Query submenu when you select a @PointProcess object.")
+NORMAL (U"This command will write into the Info window the %%Difference of Differences of Periods%, "
 	"a jitter measure defined as the average absolute difference between the consecutives differences between consecutive intervals, "
 	"divided by the average interval (an interval is the time between two consecutive points).")
-NORMAL (L"As jitter is often used as a measure of voice quality (see @@Voice 2. Jitter@), "
+NORMAL (U"As jitter is often used as a measure of voice quality (see @@Voice 2. Jitter@), "
 	"the intervals are often considered to be %%glottal periods%. "
 	"For this reason, the command has settings that can limit the possible duration of the interval (or period) "
 	"or the possible difference in the durations of consecutive intervals (periods).")
-ENTRY (L"1. The command window")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), L""
+ENTRY (U"1. The command window")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), U""
 	Manual_DRAW_SETTINGS_WINDOW ("PointProcess: Get jitter (rap)", 4)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Time range (s)", "0.0", "0.0 (= all)")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Period floor (s)", "0.0001")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Period ceiling (s)", "0.02")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Maximum period factor", "1.3")
 )
-TAG (L"##Time range (s)")
-DEFINITION (L"the start time and end time of the part of the PointProcess that will be measured. "
+TAG (U"##Time range (s)")
+DEFINITION (U"the start time and end time of the part of the PointProcess that will be measured. "
 	"Points outside this range will be ignored.")
-TAG (L"##Period floor (s)")
-DEFINITION (L"the shortest possible interval that will be used in the computation of jitter, in seconds. "
+TAG (U"##Period floor (s)")
+DEFINITION (U"the shortest possible interval that will be used in the computation of jitter, in seconds. "
 	"If an interval is shorter than this, it will be ignored in the computation of jitter "
 	"(and the previous and next intervals will not be regarded as consecutive). "
 	"This setting will normally be very small, say 0.1 ms.")
-TAG (L"##Period ceiling (s)")
-DEFINITION (L"the longest possible interval that will be used in the computation of jitter, in seconds. "
+TAG (U"##Period ceiling (s)")
+DEFINITION (U"the longest possible interval that will be used in the computation of jitter, in seconds. "
 	"If an interval is longer than this, it will be ignored in the computation of jitter "
 	"(and the previous and next intervals will not be regarded as consecutive). "
 	"For example, if the minimum frequency of periodicity is 50 Hz, set this argument to 0.02 seconds; "
 	"intervals longer than that could be regarded as voiceless stretches and will be ignored in the computation.")
-TAG (L"##Maximum period factor")
-DEFINITION (L"the largest possible difference between consecutive intervals that will be used in the computation of jitter. "
+TAG (U"##Maximum period factor")
+DEFINITION (U"the largest possible difference between consecutive intervals that will be used in the computation of jitter. "
 	"If the ratio of the durations of two consecutive intervals is greater than this, "
 	"this pair of intervals will be ignored in the computation of jitter "
 	"(each of the intervals could still take part in the computation of jitter in a comparison with its neighbour on the other side).")
-ENTRY (L"2. Usage")
-NORMAL (L"The jitter can be used as a measure of voice quality. See @@Voice 2. Jitter at .")
-ENTRY (L"3. Algorithm")
-NORMAL (L"(In the following the term %absolute means two different things: (1) the absolute (i.e. non-negative) value of a real number, "
+ENTRY (U"2. Usage")
+NORMAL (U"The jitter can be used as a measure of voice quality. See @@Voice 2. Jitter at .")
+ENTRY (U"3. Algorithm")
+NORMAL (U"(In the following the term %absolute means two different things: (1) the absolute (i.e. non-negative) value of a real number, "
 	"and (2) the opposite of %relative.)")
-NORMAL (L"DDP is defined as the relative mean absolute (i.e. non-negative) "
+NORMAL (U"DDP is defined as the relative mean absolute (i.e. non-negative) "
 	"third-order difference of the point process (= the second-order difference of the interval process), as follows.")
-NORMAL (L"First, we define the absolute (i.e. non-relative) Average Perturbation (in seconds) as one third of the mean absolute (non-negative) "
+NORMAL (U"First, we define the absolute (i.e. non-relative) Average Perturbation (in seconds) as one third of the mean absolute (non-negative) "
 	"difference of difference of consecutive intervals:")
-FORMULA (L"%absDDP(seconds) = ∑__%i=2_^^%N-1^ |(%T__%i+1_ - %T__%i_) - (%T__%i_ - %T__%i-1_)| / (%N - 2)")
-NORMAL (L"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
+FORMULA (U"%absDDP(seconds) = ∑__%i=2_^^%N-1^ |(%T__%i+1_ - %T__%i_) - (%T__%i_ - %T__%i-1_)| / (%N - 2)")
+NORMAL (U"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
 	"If an interval %T__%i-1_ or %T__%i_ or %T__%i+1_ is not between ###Period floor# and ##Period ceiling#, "
 	"or if %T__%i-1_/%T__%i_ or %T__%i_/%T__%i-1_ or %T__%i+1_/%T__%i_ or %T__%i_/%T__%i+1_ is greater than ##Maximum period factor#, "
 	"the term |2%T__%i_ - %T__%i-1_ - %T__%i+1_| is not counted in the sum, and %N is lowered by 1 "
 	"(if %N ends up being less than 3, the result of the command is @undefined).")
-NORMAL (L"Second, we define the mean period as")
-FORMULA (L"%meanPeriod(seconds) = ∑__%i=1_^^%N^ %T__%i_ / %N")
-NORMAL (L"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
+NORMAL (U"Second, we define the mean period as")
+FORMULA (U"%meanPeriod(seconds) = ∑__%i=1_^^%N^ %T__%i_ / %N")
+NORMAL (U"where %T__%i_ is the duration of the %%i%th interval and %N is the number of intervals. "
 	"If an interval %T__%i_ is not between ##Period floor# and ##Period ceiling#, "
 	"or if %T__%i-1_/%T__%i_ or %T__%i_/%T__%i-1_ is greater than ##Maximum period factor# "
 	"%and %T__%i+1_/%T__%i_ or %T__%i_/%T__%i+1_ is greater than ##Maximum period factor#, "
 	"the term %T__%i_ is not counted in the sum, and %N is lowered by 1; "
 	"this procedure ensures that in the computation of the mean period we use at least all the intervals "
 	"that had taken part in the computation of DDP.")
-NORMAL (L"Finally, we compute DDP as")
-FORMULA (L"%DDP = %absDDP(seconds) / %meanPeriod(seconds)")
-NORMAL (L"The result is exactly 3 times the @@PointProcess: Get jitter (rap)...|RAP@ jitter measurement: "
+NORMAL (U"Finally, we compute DDP as")
+FORMULA (U"%DDP = %absDDP(seconds) / %meanPeriod(seconds)")
+NORMAL (U"The result is exactly 3 times the @@PointProcess: Get jitter (rap)...|RAP@ jitter measurement: "
 	"a value between 0 and 6, or between 0 and 600 percent.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Get low index...", L"ppgb", 20021212)
-INTRO (L"A @query to the selected @PointProcess object.")
-ENTRY (L"Return value")
-NORMAL (L"the index of the nearest point before or at the specified time, "
+MAN_BEGIN (U"PointProcess: Get low index...", U"ppgb", 20021212)
+INTRO (U"A @query to the selected @PointProcess object.")
+ENTRY (U"Return value")
+NORMAL (U"the index of the nearest point before or at the specified time, "
 	"or 0 if the point process contains no points or the specified time is before the first point.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time from which a point is looked for, in seconds.")
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time from which a point is looked for, in seconds.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Get nearest index...", L"ppgb", 20021212)
-INTRO (L"A @query to the selected @PointProcess object.")
-ENTRY (L"Return value")
-NORMAL (L"the index of the point nearest to the specified time, "
+MAN_BEGIN (U"PointProcess: Get nearest index...", U"ppgb", 20021212)
+INTRO (U"A @query to the selected @PointProcess object.")
+ENTRY (U"Return value")
+NORMAL (U"the index of the point nearest to the specified time, "
 	"or 0 if the point process contains no points.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time around which a point is looked for, in seconds.")
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time around which a point is looked for, in seconds.")
 /*
 form Get nearest raising zero
    real Time_(s) 0.5
@@ -1843,88 +1841,88 @@ echo 'time'
 */
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Hum", L"ppgb", 19970330)
-INTRO (L"A command to hear a @PointProcess.")
-ENTRY (L"Algorithm")
-NORMAL (L"A @Sound is created with the algorithm described at @@PointProcess: To Sound (hum)... at .")
-NORMAL (L"This sound is then played.")
+MAN_BEGIN (U"PointProcess: Hum", U"ppgb", 19970330)
+INTRO (U"A command to hear a @PointProcess.")
+ENTRY (U"Algorithm")
+NORMAL (U"A @Sound is created with the algorithm described at @@PointProcess: To Sound (hum)... at .")
+NORMAL (U"This sound is then played.")
 MAN_END
 
-MAN_BEGIN (L"PointProcesses: Intersection", L"ppgb", 20021212)
-INTRO (L"A command to merge two selected @PointProcess objects into one.")
-ENTRY (L"Behaviour")
-NORMAL (L"The resulting #PointProcess will contain only those points that occur in both original point processes.")
-NORMAL (L"The time domain of the resulting point process is the intersection of the time domains of the original point processes.")
+MAN_BEGIN (U"PointProcesses: Intersection", U"ppgb", 20021212)
+INTRO (U"A command to merge two selected @PointProcess objects into one.")
+ENTRY (U"Behaviour")
+NORMAL (U"The resulting #PointProcess will contain only those points that occur in both original point processes.")
+NORMAL (U"The time domain of the resulting point process is the intersection of the time domains of the original point processes.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Play", L"ppgb", 19970330)
-INTRO (L"A command to hear a @PointProcess.")
-ENTRY (L"Algorithm")
-NORMAL (L"A @Sound is created with the algorithm described at @@PointProcess: To Sound (pulse train)... at .")
-NORMAL (L"This sound is then played.")
+MAN_BEGIN (U"PointProcess: Play", U"ppgb", 19970330)
+INTRO (U"A command to hear a @PointProcess.")
+ENTRY (U"Algorithm")
+NORMAL (U"A @Sound is created with the algorithm described at @@PointProcess: To Sound (pulse train)... at .")
+NORMAL (U"This sound is then played.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Remove point...", L"ppgb", 20021212)
-INTRO (L"A command to remove a point from every selected @PointProcess.")
-ENTRY (L"Setting")
-TAG (L"##Index")
-DEFINITION (L"the index of the point that is to be removed.")
-ENTRY (L"Behaviour")
-NORMAL (L"Does nothing if %index is less than 1 or greater than the number of points %nt in the point process. "
+MAN_BEGIN (U"PointProcess: Remove point...", U"ppgb", 20021212)
+INTRO (U"A command to remove a point from every selected @PointProcess.")
+ENTRY (U"Setting")
+TAG (U"##Index")
+DEFINITION (U"the index of the point that is to be removed.")
+ENTRY (U"Behaviour")
+NORMAL (U"Does nothing if %index is less than 1 or greater than the number of points %nt in the point process. "
 	"Otherwise, one point is removed (e.g., if %index is 3, the third point is removed), and the other points stay the same.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Remove point near...", L"ppgb", 20021212)
-INTRO (L"A command to remove a point from every selected @PointProcess.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time (in seconds) around which a point is to be removed.")
-ENTRY (L"Behaviour")
-NORMAL (L"Does nothing if there are no points in the point process. "
+MAN_BEGIN (U"PointProcess: Remove point near...", U"ppgb", 20021212)
+INTRO (U"A command to remove a point from every selected @PointProcess.")
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time (in seconds) around which a point is to be removed.")
+ENTRY (U"Behaviour")
+NORMAL (U"Does nothing if there are no points in the point process. "
 	"Otherwise, the point nearest to %time is removed, and the other points stay the same.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Remove points...", L"ppgb", 20021212)
-INTRO (L"A command to remove a range of points from every selected @PointProcess.")
-ENTRY (L"Settings")
-TAG (L"##From index (≥ 1)")
-DEFINITION (L"the first index of the range of points that are to be removed.")
-TAG (L"##To index")
-DEFINITION (L"the last index of the range of points that are to be removed.")
-ENTRY (L"Behaviour")
-NORMAL (L"All points that originally fell in the range [%fromIndex, %toIndex] are removed, and the other points stay the same.")
-MAN_END
-
-MAN_BEGIN (L"PointProcess: Remove points between...", L"ppgb", 20021212)
-INTRO (L"A command to remove a range of points from every selected @PointProcess.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-DEFINITION (L"the start of the domain from which all points are to be removed.")
-TAG (L"##To time (s)")
-DEFINITION (L"the end of the domain from which all points are to be removed.")
-ENTRY (L"Behaviour")
-NORMAL (L"All points that originally fell in the domain [%fromTime, %toTime], including the edges, are removed, "
+MAN_BEGIN (U"PointProcess: Remove points...", U"ppgb", 20021212)
+INTRO (U"A command to remove a range of points from every selected @PointProcess.")
+ENTRY (U"Settings")
+TAG (U"##From index (≥ 1)")
+DEFINITION (U"the first index of the range of points that are to be removed.")
+TAG (U"##To index")
+DEFINITION (U"the last index of the range of points that are to be removed.")
+ENTRY (U"Behaviour")
+NORMAL (U"All points that originally fell in the range [%fromIndex, %toIndex] are removed, and the other points stay the same.")
+MAN_END
+
+MAN_BEGIN (U"PointProcess: Remove points between...", U"ppgb", 20021212)
+INTRO (U"A command to remove a range of points from every selected @PointProcess.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+DEFINITION (U"the start of the domain from which all points are to be removed.")
+TAG (U"##To time (s)")
+DEFINITION (U"the end of the domain from which all points are to be removed.")
+ENTRY (U"Behaviour")
+NORMAL (U"All points that originally fell in the domain [%fromTime, %toTime], including the edges, are removed, "
 	"and the other points stay the same.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: To Sound (hum)...", L"ppgb", 19970330)
-INTRO (L"A command to convert every selected @PointProcess into a @Sound.")
-ENTRY (L"Algorithm")
-NORMAL (L"A @Sound is created with the algorithm described at @@PointProcess: To Sound (pulse train)... at . "
+MAN_BEGIN (U"PointProcess: To Sound (hum)...", U"ppgb", 19970330)
+INTRO (U"A command to convert every selected @PointProcess into a @Sound.")
+ENTRY (U"Algorithm")
+NORMAL (U"A @Sound is created with the algorithm described at @@PointProcess: To Sound (pulse train)... at . "
 	"This sound is then run through a sequence of second-order filters that represent five formants.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: To Sound (phonation)...", L"ppgb", 20070225)
-INTRO (L"A command to convert every selected @PointProcess into a @Sound.")
-ENTRY (L"Algorithm")
-NORMAL (L"A glottal waveform is generated at every point in the point process. "
+MAN_BEGIN (U"PointProcess: To Sound (phonation)...", U"ppgb", 20070225)
+INTRO (U"A command to convert every selected @PointProcess into a @Sound.")
+ENTRY (U"Algorithm")
+NORMAL (U"A glottal waveform is generated at every point in the point process. "
 	"Its shape depends on the settings %power1 and %power2 according to the formula")
-FORMULA (L"%U(%x) = %x^^%power1^ - %x^^%power2^")
-NORMAL (L"where %x is a normalized time that runs from 0 to 1 and %U(%x) is the normalized glottal flow in arbitrary units (the real unit is m^3/s). "
+FORMULA (U"%U(%x) = %x^^%power1^ - %x^^%power2^")
+NORMAL (U"where %x is a normalized time that runs from 0 to 1 and %U(%x) is the normalized glottal flow in arbitrary units (the real unit is m^3/s). "
 	"If %power1 = 2.0 and %power2 = 3.0, the glottal flow shape is that proposed by @@Rosenberg (1971)@, "
 	"upon which for instance the Klatt synthesizer is based (@@Klatt & Klatt (1990)@):")
 SCRIPT (4.5, 3,
-	L"Select outer viewport... 0 4.5 -0.4 3\n"
+	U"Select outer viewport... 0 4.5 -0.4 3\n"
 	"Axes... 0 1 -0.1 1\n"
 	"One mark left... 0 yes yes yes\n"
 	"One mark bottom... 0 yes yes no\n"
@@ -1934,10 +1932,10 @@ SCRIPT (4.5, 3,
 	"Text bottom... yes Time (normalized)\n"
 	"Text left... yes Glottal flow\n"
 )
-NORMAL (L"If %power1 = 3.0 and %power2 = 4.0, the glottal flow shape starts somewhat smoother, "
+NORMAL (U"If %power1 = 3.0 and %power2 = 4.0, the glottal flow shape starts somewhat smoother, "
 	"reflecting the idea that the glottis opens like a zipper:")
 SCRIPT (4.5, 3,
-	L"Axes... 0 1 -0.1 1\n"
+	U"Axes... 0 1 -0.1 1\n"
 	"One mark left... 0 yes yes yes\n"
 	"One mark bottom... 0 yes yes no\n"
 	"One mark bottom... 1 yes yes no\n"
@@ -1946,14 +1944,14 @@ SCRIPT (4.5, 3,
 	"Text bottom... yes Time (normalized)\n"
 	"Text left... yes Glottal flow\n"
 )
-NORMAL (L"For the generation of speech sounds, we do not take the glottal flow itself, "
+NORMAL (U"For the generation of speech sounds, we do not take the glottal flow itself, "
 	"but rather its derivative (this takes into account the influence of radiation at the lips). "
 	"The glottal flow derivative is given by")
-FORMULA (L"%dU(%x)/%dx = %power1 %x^^(%power1-1)^ - %power2 %x^^(%power2-1)^")
-NORMAL (L"The flow derivative clearly shows the influence of the smoothing mentioned above. "
+FORMULA (U"%dU(%x)/%dx = %power1 %x^^(%power1-1)^ - %power2 %x^^(%power2-1)^")
+NORMAL (U"The flow derivative clearly shows the influence of the smoothing mentioned above. "
 	"The unsmoothed curve, with %power1 = 2.0 and %power2 = 3.0, looks like:")
 SCRIPT (4.5, 4,
-	L"Axes... 0 1 -9 3\n"
+	U"Axes... 0 1 -9 3\n"
 	"One mark left... 0 yes yes yes\n"
 	"One mark bottom... 0 yes yes no\n"
 	"One mark bottom... 1 yes yes no\n"
@@ -1962,9 +1960,9 @@ SCRIPT (4.5, 4,
 	"Text bottom... yes Time (normalized)\n"
 	"Text left... yes Glottal flow derivative\n"
 )
-NORMAL (L"Unlike the unsmoothed curve, the smoothed curve, with %power1 = 3.0 and %power2 = 4.0, starts out horizontally:")
+NORMAL (U"Unlike the unsmoothed curve, the smoothed curve, with %power1 = 3.0 and %power2 = 4.0, starts out horizontally:")
 SCRIPT (4.5, 4,
-	L"Axes... 0 1 -9 3\n"
+	U"Axes... 0 1 -9 3\n"
 	"One mark left... 0 yes yes yes\n"
 	"One mark bottom... 0 yes yes no\n"
 	"One mark bottom... 1 yes yes no\n"
@@ -1973,11 +1971,11 @@ SCRIPT (4.5, 4,
 	"Text bottom... yes Time (normalized)\n"
 	"Text left... yes Glottal flow derivative\n"
 )
-NORMAL (L"Another setting is the %%open phase%. If it is 0.70, the glottis will be open during 70 percent of a period. "
+NORMAL (U"Another setting is the %%open phase%. If it is 0.70, the glottis will be open during 70 percent of a period. "
 	"Suppose that the PointProcess has a pulse at time 0, at time 1, at time 2, and so on. The pulses at times 1 and 2 will then be turned "
 	"into glottal flows starting at times 0.30 and 1.30:")
 SCRIPT (4.5, 2.5,
-	L"Axes... 0 2 -0.1 1\n"
+	U"Axes... 0 2 -0.1 1\n"
 	"One mark left... 0 yes yes yes\n"
 	"One mark bottom... 0 yes yes no\n"
 	"One mark bottom... 1 yes yes yes\n"
@@ -1990,7 +1988,7 @@ SCRIPT (4.5, 2.5,
 	"Text left... yes Glottal flow\n"
 )
 SCRIPT (4.5, 2.5,
-	L"Axes... 0 2 -9 3\n"
+	U"Axes... 0 2 -9 3\n"
 	"One mark left... 0 yes yes yes\n"
 	"One mark bottom... 0 yes yes no\n"
 	"One mark bottom... 1 yes yes yes\n"
@@ -2002,7 +2000,7 @@ SCRIPT (4.5, 2.5,
 	"Text bottom... yes Time (normalized)\n"
 	"Text left... yes Glottal flow derivative\n"
 )
-NORMAL (L"The final setting that influences the shape of the glottal flow is the %%collision phase%. "
+NORMAL (U"The final setting that influences the shape of the glottal flow is the %%collision phase%. "
 	"If it is 0.03, for instance, the glottal flow derivative will not go abruptly to 0 at a pulse, "
 	"but will instead decay by a factor of %e (≈ 2.7183) every 3 percent of a period. "
 	"In order to keep the glottal flow curve smooth (and the derivative continuous), "
@@ -2012,7 +2010,7 @@ NORMAL (L"The final setting that influences the shape of the glottal flow is the
 	"(i.e. the area under the positive part of the curve equals the area above the negative part). "
 	"This is what the curves look like if %power1 = 3.0, %power2 = 4.0, %openPhase = 0.70 and %collisionPhase = 0.03:")
 SCRIPT (4.5, 2.5,
-	L"Axes... 0 2 -0.1 1\n"
+	U"Axes... 0 2 -0.1 1\n"
 	"One mark left... 0 yes yes yes\n"
 	"One mark bottom... 0 yes yes no\n"
 	"One mark bottom... 1 yes yes yes\n"
@@ -2028,7 +2026,7 @@ SCRIPT (4.5, 2.5,
 	"Text left... yes Glottal flow\n"
 )
 SCRIPT (4.5, 2.5,
-	L"Axes... 0 2 -9 3\n"
+	U"Axes... 0 2 -9 3\n"
 	"One mark left... 0 yes yes yes\n"
 	"One mark bottom... 0 yes yes no\n"
 	"One mark bottom... 1 yes yes yes\n"
@@ -2043,220 +2041,220 @@ SCRIPT (4.5, 2.5,
 	"Text bottom... yes Time (normalized)\n"
 	"Text left... yes Glottal flow derivative\n"
 )
-NORMAL (L"These curves have moved 2.646 percent of a period to the right. At time 1, "
+NORMAL (U"These curves have moved 2.646 percent of a period to the right. At time 1, "
 	"the glottal flow curve turns from a convex polynomial into a concave exponential, "
 	"and the derivative still has its minimum there.")
-ENTRY (L"Settings")
-TAG (L"##Sampling frequency (Hz)")
-DEFINITION (L"the sampling frequency of the resulting Sound object, e.g. 44100 hertz.")
-TAG (L"##Adaptation factor")
-DEFINITION (L"the factor by which a pulse height will be multiplied if the pulse time is not within "
+ENTRY (U"Settings")
+TAG (U"##Sampling frequency (Hz)")
+DEFINITION (U"the sampling frequency of the resulting Sound object, e.g. 44100 hertz.")
+TAG (U"##Adaptation factor")
+DEFINITION (U"the factor by which a pulse height will be multiplied if the pulse time is not within "
 	"##Maximum period# from the previous pulse, and by which a pulse height will again be multiplied "
 	"if the previous pulse time is not within ##Maximum period# from the pre-previous pulse. This factor is against "
 	"abrupt starts of the pulse train after silences, and is 1.0 if you do want abrupt starts after silences.")
-TAG (L"##Maximum period (s)")
-DEFINITION (L"the minimal period that will be considered a silence, e.g. 0.05 seconds. "
+TAG (U"##Maximum period (s)")
+DEFINITION (U"the minimal period that will be considered a silence, e.g. 0.05 seconds. "
 	"Example: if ##Adaptation factor# is 0.6, and ##Adaptation time# is 0.02 s, "
 	"then the heights of the first two pulses after silences of at least 20 ms "
 	"will be multiplied by 0.36 and 0.6, respectively.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: To Sound (pulse train)...", L"ppgb", 20070225)
-INTRO (L"A command to convert every selected @PointProcess into a @Sound.")
-ENTRY (L"Algorithm")
-NORMAL (L"A pulse is generated at every point in the point process. This pulse is filtered at the Nyquist frequency "
+MAN_BEGIN (U"PointProcess: To Sound (pulse train)...", U"ppgb", 20070225)
+INTRO (U"A command to convert every selected @PointProcess into a @Sound.")
+ENTRY (U"Algorithm")
+NORMAL (U"A pulse is generated at every point in the point process. This pulse is filtered at the Nyquist frequency "
 	"of the resulting #Sound by converting it into a sampled #sinc function.")
-ENTRY (L"Settings")
-TAG (L"##Sampling frequency (Hz)")
-DEFINITION (L"the sampling frequency of the resulting Sound object, e.g. 44100 hertz.")
-TAG (L"##Adaptation factor")
-DEFINITION (L"the factor by which a pulse height will be multiplied if the pulse time is not within "
+ENTRY (U"Settings")
+TAG (U"##Sampling frequency (Hz)")
+DEFINITION (U"the sampling frequency of the resulting Sound object, e.g. 44100 hertz.")
+TAG (U"##Adaptation factor")
+DEFINITION (U"the factor by which a pulse height will be multiplied if the pulse time is not within "
 	"##Adaptation time# from the pre-previous pulse, and by which a pulse height will again be multiplied "
 	"if the pulse time is not within ##Adaptation time# from the previous pulse. This factor is against "
 	"abrupt starts of the pulse train after silences, and is 1.0 if you do want abrupt starts after silences.")
-TAG (L"##Adaptation time (s)")
-DEFINITION (L"the minimal period that will be considered a silence, e.g. 0.05 seconds.")
-TAG (L"##Interpolation depth")
-DEFINITION (L"the extent of the sinc function to the left and to the right of the peak, e.g. 2000 samples.")
-NORMAL (L"Example: if ##Adaptation factor# is 0.6, and ##Adaptation time# is 0.02 s, "
+TAG (U"##Adaptation time (s)")
+DEFINITION (U"the minimal period that will be considered a silence, e.g. 0.05 seconds.")
+TAG (U"##Interpolation depth")
+DEFINITION (U"the extent of the sinc function to the left and to the right of the peak, e.g. 2000 samples.")
+NORMAL (U"Example: if ##Adaptation factor# is 0.6, and ##Adaptation time# is 0.02 s, "
 	"then the heights of the first two pulses after silences of at least 20 ms "
 	"will be multiplied by 0.36 and 0.6, respectively.")
 MAN_END
 
-MAN_BEGIN (L"PointProcesses: Union", L"ppgb", 20021212)
-INTRO (L"A command to merge two selected @PointProcess objects into one.")
-ENTRY (L"Behaviour")
-NORMAL (L"The resulting #PointProcess will contain all the points of the two original point processes, sorted by time. "
+MAN_BEGIN (U"PointProcesses: Union", U"ppgb", 20021212)
+INTRO (U"A command to merge two selected @PointProcess objects into one.")
+ENTRY (U"Behaviour")
+NORMAL (U"The resulting #PointProcess will contain all the points of the two original point processes, sorted by time. "
 	"Points that occur in both original point processes, will occur only once in the resulting point process.")
-NORMAL (L"The time domain of the resulting point process is the union of the time domains of the original point processes.")
+NORMAL (U"The time domain of the resulting point process is the union of the time domains of the original point processes.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Up to IntensityTier...", L"ppgb", 19970329)
-INTRO (L"A command to promote every selected @PointProcess to an @IntensityTier.")
-ENTRY (L"Setting")
-TAG (L"##Intensity (dB)")
-DEFINITION (L"the intensity that will be associated with every point.")
-ENTRY (L"Behaviour")
-NORMAL (L"The times of all the points are trivially copied, and so is the time domain. "
+MAN_BEGIN (U"PointProcess: Up to IntensityTier...", U"ppgb", 19970329)
+INTRO (U"A command to promote every selected @PointProcess to an @IntensityTier.")
+ENTRY (U"Setting")
+TAG (U"##Intensity (dB)")
+DEFINITION (U"the intensity that will be associated with every point.")
+ENTRY (U"Behaviour")
+NORMAL (U"The times of all the points are trivially copied, and so is the time domain. "
 	"The intensity information will be the same for every point.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Up to PitchTier...", L"ppgb", 19970329)
-INTRO (L"A command to promote every selected @PointProcess to a @PitchTier.")
-ENTRY (L"Setting")
-TAG (L"##Frequency (Hz)")
-DEFINITION (L"the pitch frequency that will be associated with every point.")
-ENTRY (L"Behaviour")
-NORMAL (L"The times of all the points are trivially copied, and so is the time domain. "
+MAN_BEGIN (U"PointProcess: Up to PitchTier...", U"ppgb", 19970329)
+INTRO (U"A command to promote every selected @PointProcess to a @PitchTier.")
+ENTRY (U"Setting")
+TAG (U"##Frequency (Hz)")
+DEFINITION (U"the pitch frequency that will be associated with every point.")
+ENTRY (U"Behaviour")
+NORMAL (U"The times of all the points are trivially copied, and so is the time domain. "
 	"The pitch information will be the same for every point.")
 MAN_END
 
-MAN_BEGIN (L"Polygon", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"A Polygon object represents a sequence of points (%%x__i_, %%y__i_) in a two-dimensional space.")
+MAN_BEGIN (U"Polygon", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"A Polygon object represents a sequence of points (%%x__i_, %%y__i_) in a two-dimensional space.")
 MAN_END
 
-MAN_BEGIN (L"Read Matrix from raw text file...", L"ppgb", 19980322)
-INTRO (L"A command to read a @Matrix object from a file on disk.")
-ENTRY (L"File format")
-NORMAL (L"The file should contain each row of the matrix on a separate line. Within each row, "
+MAN_BEGIN (U"Read Matrix from raw text file...", U"ppgb", 19980322)
+INTRO (U"A command to read a @Matrix object from a file on disk.")
+ENTRY (U"File format")
+NORMAL (U"The file should contain each row of the matrix on a separate line. Within each row, "
 	"the elements must be separated by spaces or tabs.")
-NORMAL (L"For instance, the following text file will be read as a Matrix with three rows and four columns:")
-CODE (L"0.19 3 245 123")
-CODE (L"18e-6 -3e18 0 0.0")
-CODE (L"1.5 2.5 3.5 4.5")
-NORMAL (L"The resulting Matrix will have the same domain and sampling as Matrices created with "
+NORMAL (U"For instance, the following text file will be read as a Matrix with three rows and four columns:")
+CODE (U"0.19 3 245 123")
+CODE (U"18e-6 -3e18 0 0.0")
+CODE (U"1.5 2.5 3.5 4.5")
+NORMAL (U"The resulting Matrix will have the same domain and sampling as Matrices created with "
 	"##Create simple Matrix...#. In the above example, this means that the Matrix will have "
 	"%x__%min_ = 0.5, %x__%max_ = 4.5, %n__%x_ = 4, %dx = 1.0, %x__1_ = 1.0, "
 	"%y__%min_ = 0.5, %y__%max_ = 3.5, %n__%y_ = 3, %dy = 1.0, %y__1_ = 1.0.")
 MAN_END
 
-MAN_BEGIN (L"Read Strings from raw text file...", L"ppgb", 19990502)
-INTRO (L"A command to read a @Strings object from a simple text file. "
+MAN_BEGIN (U"Read Strings from raw text file...", U"ppgb", 19990502)
+INTRO (U"A command to read a @Strings object from a simple text file. "
 	"Each line is read as a separate string. See @Strings for an example.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Intensity...", L"ppgb", 20100605)
-INTRO (L"A command to create an @Intensity object from every selected @Sound.")
-ENTRY (L"Settings")
-TAG (L"##Minimum pitch (Hz)")
-DEFINITION (L"the minimum periodicity frequency in your signal. If you set it too high, "
+MAN_BEGIN (U"Sound: To Intensity...", U"ppgb", 20100605)
+INTRO (U"A command to create an @Intensity object from every selected @Sound.")
+ENTRY (U"Settings")
+TAG (U"##Minimum pitch (Hz)")
+DEFINITION (U"the minimum periodicity frequency in your signal. If you set it too high, "
 	"you will end up with a pitch-synchronous intensity modulation. If you set it too low, "
 	"your intensity contour may appear smeared, so you should set it as high as allowed by the signal "
 	"if you want a sharp contour.")
-TAG (L"##Time step (s)")
-DEFINITION (L"the time step of the resulting intensity contour. If you set it to zero, the time step is computed as "
+TAG (U"##Time step (s)")
+DEFINITION (U"the time step of the resulting intensity contour. If you set it to zero, the time step is computed as "
 	"one quarter of the effective window length, i.e. as 0.8 / (%minimum_pitch).")
-TAG (L"##Subtract mean")
-DEFINITION (L"See @@Intro 6.2. Configuring the intensity contour at .")
-ENTRY (L"Algorithm")
-NORMAL (L"The values in the sound are first squared, then convolved with a Gaussian analysis window (Kaiser-20; sidelobes below -190 dB). "
+TAG (U"##Subtract mean")
+DEFINITION (U"See @@Intro 6.2. Configuring the intensity contour at .")
+ENTRY (U"Algorithm")
+NORMAL (U"The values in the sound are first squared, then convolved with a Gaussian analysis window (Kaiser-20; sidelobes below -190 dB). "
 	"The effective duration of this analysis window is 3.2 / (%minimum_pitch), which will guarantee that a periodic signal is analysed as having a "
 	"pitch-synchronous intensity ripple not greater than 0.00001 dB.")
 MAN_END
 
-MAN_BEGIN (L"Sound & IntensityTier: Multiply", L"ppgb", 20000724)
-INTRO (L"A command to create a new Sound from the selected @Sound and @Intensity objects.")
-NORMAL (L"The resulting Sound equals the original sound, multiplied by a linear interpolation of the intensity. "
+MAN_BEGIN (U"Sound & IntensityTier: Multiply", U"ppgb", 20000724)
+INTRO (U"A command to create a new Sound from the selected @Sound and @Intensity objects.")
+NORMAL (U"The resulting Sound equals the original sound, multiplied by a linear interpolation of the intensity. "
 	"Afterwards, the resulting Sound is scaled so that its maximum absolute amplitude is 0.9.")
 MAN_END
 
-MAN_BEGIN (L"Strings", L"ppgb", 20141001)
-INTRO (L"One of the @@types of objects@ in Praat. Represents an ordered list of strings.")
-ENTRY (L"Creation")
-NORMAL (L"The difficult way is to create a #Strings object from a generic Praat text file "
+MAN_BEGIN (U"Strings", U"ppgb", 20141001)
+INTRO (U"One of the @@types of objects@ in Praat. Represents an ordered list of strings.")
+ENTRY (U"Creation")
+NORMAL (U"The difficult way is to create a #Strings object from a generic Praat text file "
 	"(if there are non-ASCII symbols, use UTF-8 or UTF-16 format):")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"Strings\"")
-CODE (L"5 ! number of strings")
-CODE (L"\"Hello\"")
-CODE (L"\"Goodbye\"")
-CODE (L"\"Auf wiedersehen\"")
-CODE (L"\"Tschüss\"")
-CODE (L"\"Arrivederci\"")
-NORMAL (L"In this example, we see that a double quote within a string should be written twice; "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"Strings\"")
+CODE (U"5 ! number of strings")
+CODE (U"\"Hello\"")
+CODE (U"\"Goodbye\"")
+CODE (U"\"Auf wiedersehen\"")
+CODE (U"\"Tschüss\"")
+CODE (U"\"Arrivederci\"")
+NORMAL (U"In this example, we see that a double quote within a string should be written twice; "
 	"the fourth string will therefore be read as ##Tschüss#. "
 	"This file can be read simply with the generic @@Read from file...@ command from the #Open menu.")
-NORMAL (L"An easier way is to use the special command @@Read Strings from raw text file... at . "
+NORMAL (U"An easier way is to use the special command @@Read Strings from raw text file... at . "
 	"The file can then simply look like this:")
-CODE (L"Hello")
-CODE (L"Goodbye")
-CODE (L"Auf wiedersehen")
-CODE (L"Tschüss")
-CODE (L"Arrivederci")
-NORMAL (L"You can also create a #Strings object from a directory listing or from some other objects:")
-LIST_ITEM (L"• @@Create Strings as file list...")
-LIST_ITEM (L"• @@Distributions: To Strings...@")
-LIST_ITEM (L"• @@OTGrammar: Generate inputs...@")
-LIST_ITEM (L"• @@OTGrammar & Strings: Inputs to outputs...@")
-MAN_END
-
-MAN_BEGIN (L"Strings: To Distributions", L"ppgb", 19971025)
-INTRO (L"A command to analyse each selected @Strings object into a @Distributions object.")
-NORMAL (L"The resulting #Distributions will collect the occurrences of every string in the #Strings object, "
+CODE (U"Hello")
+CODE (U"Goodbye")
+CODE (U"Auf wiedersehen")
+CODE (U"Tschüss")
+CODE (U"Arrivederci")
+NORMAL (U"You can also create a #Strings object from a directory listing or from some other objects:")
+LIST_ITEM (U"• @@Create Strings as file list...")
+LIST_ITEM (U"• @@Distributions: To Strings...@")
+LIST_ITEM (U"• @@OTGrammar: Generate inputs...@")
+LIST_ITEM (U"• @@OTGrammar & Strings: Inputs to outputs...@")
+MAN_END
+
+MAN_BEGIN (U"Strings: To Distributions", U"ppgb", 19971025)
+INTRO (U"A command to analyse each selected @Strings object into a @Distributions object.")
+NORMAL (U"The resulting #Distributions will collect the occurrences of every string in the #Strings object, "
 	"and put the number of occurrences in its first and only column.")
-ENTRY (L"Example")
-NORMAL (L"We start from the following #Strings:")
-CODE (L"6 (number of strings)")
-CODE (L"\"hallo\"")
-CODE (L"\"dag allemaal\"")
-CODE (L"\"hallo\"")
-CODE (L"\"tot morgen\"")
-CODE (L"\"hallo\"")
-CODE (L"\"tot morgen\"")
-NORMAL (L"This will give us the following #Distributions:")
-CODE (L"1 (number of columns) \"\" (no column name)")
-CODE (L"\"hallo\"         3")
-CODE (L"\"dag allemaal\"  1")
-CODE (L"\"tot morgen\"    2")
-MAN_END
-
-MAN_BEGIN (L"Table", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat. See the @Statistics tutorial.")
-MAN_END
-
-MAN_BEGIN (L"TableOfReal", L"ppgb", 20030316)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"A TableOfReal object contains a number of %cells. Each cell belongs to a %row and a %column. "
+ENTRY (U"Example")
+NORMAL (U"We start from the following #Strings:")
+CODE (U"6 (number of strings)")
+CODE (U"\"hallo\"")
+CODE (U"\"dag allemaal\"")
+CODE (U"\"hallo\"")
+CODE (U"\"tot morgen\"")
+CODE (U"\"hallo\"")
+CODE (U"\"tot morgen\"")
+NORMAL (U"This will give us the following #Distributions:")
+CODE (U"1 (number of columns) \"\" (no column name)")
+CODE (U"\"hallo\"         3")
+CODE (U"\"dag allemaal\"  1")
+CODE (U"\"tot morgen\"    2")
+MAN_END
+
+MAN_BEGIN (U"Table", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat. See the @Statistics tutorial.")
+MAN_END
+
+MAN_BEGIN (U"TableOfReal", U"ppgb", 20030316)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"A TableOfReal object contains a number of %cells. Each cell belongs to a %row and a %column. "
 	"For instance, a TableOfReal with 10 rows and 3 columns has 30 cells.")
-NORMAL (L"Each row and each column may be labeled with a %title.")
-ENTRY (L"Creating a TableOfReal from data in a text file")
-NORMAL (L"Suppose you have F1 and F2 data for vowels. "
+NORMAL (U"Each row and each column may be labeled with a %title.")
+ENTRY (U"Creating a TableOfReal from data in a text file")
+NORMAL (U"Suppose you have F1 and F2 data for vowels. "
 	"You can create a simple text file like the following:")
-CODE (L"\"ooTextFile\"  ! The line by which Praat can recognize your file")
-CODE (L"\"TableOfReal\" ! The line that tells Praat about the contents")
-CODE (L"2   \"F1\"  \"F2\"      ! Number of columns, and column labels")
-CODE (L"3                   ! Number of rows")
-CODE (L"\"a\" 800 1100         ! Row label (vowel), F1 value, F2 value")
-CODE (L"\"i\" 280 2800         ! Row label (vowel), F1 value, F2 value")
-CODE (L"\"u\" 260  560         ! Row label (vowel), F1 value, F2 value")
-NORMAL (L"Praat is rather forgiving about the use of spaces, tabs, and newlines. "
+CODE (U"\"ooTextFile\"  ! The line by which Praat can recognize your file")
+CODE (U"\"TableOfReal\" ! The line that tells Praat about the contents")
+CODE (U"2   \"F1\"  \"F2\"      ! Number of columns, and column labels")
+CODE (U"3                   ! Number of rows")
+CODE (U"\"a\" 800 1100         ! Row label (vowel), F1 value, F2 value")
+CODE (U"\"i\" 280 2800         ! Row label (vowel), F1 value, F2 value")
+CODE (U"\"u\" 260  560         ! Row label (vowel), F1 value, F2 value")
+NORMAL (U"Praat is rather forgiving about the use of spaces, tabs, and newlines. "
 	"See @@Save as text file...@ for general information.")
-NORMAL (L"You will often have your data in a file with a self-describing format, "
+NORMAL (U"You will often have your data in a file with a self-describing format, "
 	"i.e. in which the number of values on a line equals the number of columns "
 	"of the table:")
-CODE (L"800 1100")
-CODE (L"280 2800")
-CODE (L"260 560")
-NORMAL (L"Such a file can be read with @@Read Matrix from raw text file... at . "
+CODE (U"800 1100")
+CODE (U"280 2800")
+CODE (U"260 560")
+NORMAL (U"Such a file can be read with @@Read Matrix from raw text file... at . "
 	"This creates a Matrix object, which can be cast to a TableOfReal object "
 	"by @@Matrix: To TableOfReal at . The resulting TableOfReal does not have "
 	"any row or column labels yet. You could add column labels with:")
-CODE (L"Set column label (index)... 1 F1")
-CODE (L"Set column label (index)... 2 F2")
-NORMAL (L"Of course, if the row labels contain crucial information, "
+CODE (U"Set column label (index)... 1 F1")
+CODE (U"Set column label (index)... 2 F2")
+NORMAL (U"Of course, if the row labels contain crucial information, "
 	"and the number of rows is large, this is not a feasible method.")
 MAN_END
 
-MAN_BEGIN (L"TableOfReal: Set value...", L"ppgb", 19980105)
-INTRO (L"A command to change the value of one table cell in each selected @TableOfReal object.")
-ENTRY (L"Settings")
-TAG (L"##Row number")
-DEFINITION (L"the number of the row of the cell whose value you want to change.")
-TAG (L"##Column number")
-DEFINITION (L"the number of the column of the cell whose value you want to change.")
-TAG (L"##New value")
-DEFINITION (L"the value that you want the specified cell to have.")
+MAN_BEGIN (U"TableOfReal: Set value...", U"ppgb", 19980105)
+INTRO (U"A command to change the value of one table cell in each selected @TableOfReal object.")
+ENTRY (U"Settings")
+TAG (U"##Row number")
+DEFINITION (U"the number of the row of the cell whose value you want to change.")
+TAG (U"##Column number")
+DEFINITION (U"the number of the column of the cell whose value you want to change.")
+TAG (U"##New value")
+DEFINITION (U"the value that you want the specified cell to have.")
 MAN_END
 
 }
diff --git a/fon/manual_Manual.cpp b/fon/manual_Manual.cpp
index fbfedb9..4758057 100644
--- a/fon/manual_Manual.cpp
+++ b/fon/manual_Manual.cpp
@@ -1,6 +1,6 @@
 /* manual_Manual.cpp
  *
- * Copyright (C) 1992-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,85 +22,85 @@
 void manual_Manual_init (ManPages me);
 void manual_Manual_init (ManPages me) {
 
-MAN_BEGIN (L"Manual", L"ppgb", 20110101)
-INTRO (L"The documentation system for the Praat program.")
-NORMAL (L"You will get a manual window every time you choose anything from a #Help menu or press a #Help button.")
-ENTRY (L"How to find what you are looking for")
-NORMAL (L"You can navigate the manual in several ways:")
-LIST_ITEM (L"\\bu To go to the Intro, use the #Home button.")
-LIST_ITEM (L"\\bu To go to the information behind a %link (a piece of blue text), just click on it.")
-LIST_ITEM (L"\\bu To go forward and backward through a tutorial with numbered pages, use ##1 ># and ##< 1#.")
-LIST_ITEM (L"\\bu To %revisit previous pages, use the #< and #> buttons.")
-LIST_ITEM (L"\\bu To browse %alphabetically, use the horizontal scroll bar and the buttons "
+MAN_BEGIN (U"Manual", U"ppgb", 20110101)
+INTRO (U"The documentation system for the Praat program.")
+NORMAL (U"You will get a manual window every time you choose anything from a #Help menu or press a #Help button.")
+ENTRY (U"How to find what you are looking for")
+NORMAL (U"You can navigate the manual in several ways:")
+LIST_ITEM (U"\\bu To go to the Intro, use the #Home button.")
+LIST_ITEM (U"\\bu To go to the information behind a %link (a piece of blue text), just click on it.")
+LIST_ITEM (U"\\bu To go forward and backward through a tutorial with numbered pages, use ##1 ># and ##< 1#.")
+LIST_ITEM (U"\\bu To %revisit previous pages, use the #< and #> buttons.")
+LIST_ITEM (U"\\bu To browse %alphabetically, use the horizontal scroll bar and the buttons "
 	"named ##< 1# and ##1 >#, or the ##Search for page (list)...# command in the ##Go to# menu.")
-LIST_ITEM (L"\\bu To find a page with a %%known title%, use the ##Search for page...# command.")
-NORMAL (L"The fastest way to find what you want is usually the #Search button.")
-ENTRY (L"Search")
-NORMAL (L"In the text field after the Search button, you can type strings, separated by spaces. "
+LIST_ITEM (U"\\bu To find a page with a %%known title%, use the ##Search for page...# command.")
+NORMAL (U"The fastest way to find what you want is usually the #Search button.")
+ENTRY (U"Search")
+NORMAL (U"In the text field after the Search button, you can type strings, separated by spaces. "
 	"When you press the #Return (or #Enter) key, or click the #Search button, "
 	"all manual pages are searched for the combination of strings that you typed. "
 	"The titles of the 20 best matching pages are displayed as links.")
-NORMAL (L"##Example:# to know how to create a pitch contour from a sound, type")
-CODE (L"sou pit")
-NORMAL (L"and press #Return. The best matches should appear on top. These should include "
+NORMAL (U"##Example:# to know how to create a pitch contour from a sound, type")
+CODE (U"sou pit")
+NORMAL (U"and press #Return. The best matches should appear on top. These should include "
 	"##Sound: To Pitch (ac)...# and ##Sound: To Pitch (cc)...#.")
-NORMAL (L"The search is case-insensitive. For instance, the search string \"$script\" will give you all "
+NORMAL (U"The search is case-insensitive. For instance, the search string \"$script\" will give you all "
 	"the pages that contain the words %script, %Script, %description, %PostScript, or %SCRIPT, and so on.")
-NORMAL (L"#Background. The search algorithm uses the following heuristics:")
-LIST_ITEM (L"\\bu A match in the page title is better than one in the rest of the text.")
-LIST_ITEM (L"\\bu Pages with many matches are better than those with few.")
-ENTRY (L"Your own manual pages")
-NORMAL (L"To create your own manual pages, create @ManPages text files.")
+NORMAL (U"#Background. The search algorithm uses the following heuristics:")
+LIST_ITEM (U"\\bu A match in the page title is better than one in the rest of the text.")
+LIST_ITEM (U"\\bu Pages with many matches are better than those with few.")
+ENTRY (U"Your own manual pages")
+NORMAL (U"To create your own manual pages, create @ManPages text files.")
 MAN_END
 
-MAN_BEGIN (L"ManPages", L"ppgb", 20140421)
-INTRO (L"You can create a documentation or education system with files that you and others "
+MAN_BEGIN (U"ManPages", U"ppgb", 20140421)
+INTRO (U"You can create a documentation or education system with files that you and others "
 	"can read into Praat (with the @@Read from file...@ command). "
 	"Your files will become a hypertext system very similar to the usual @Manual.")
-ENTRY (L"Example 1: a single document")
-NORMAL (L"If you create a single ManPages text file, it will look like a manual with a single page. "
+ENTRY (U"Example 1: a single document")
+NORMAL (U"If you create a single ManPages text file, it will look like a manual with a single page. "
 	"Here is an example:")
-CODE (L"ManPagesTextFile")
-CODE (L"\"Welkom\" \"miep\" 19970820 0")
-CODE (L"<intro> \"Hallo allemaal!\"")
-CODE (L"<entry> \"Belangrijk...\"")
-CODE (L"<normal> \"Hoogge\\bse\\\" \\\" erd publiek!\"")
-CODE (L"<normal> \"Einde.\"")
-NORMAL (L"A ManPages text file should start with the following information:")
-LIST_ITEM (L"1. The word \"ManPagesTextFile\" on the first line.")
-LIST_ITEM (L"2. The title of the manual page, between double quotes. "
+CODE (U"ManPagesTextFile")
+CODE (U"\"Welkom\" \"miep\" 19970820 0")
+CODE (U"<intro> \"Hallo allemaal!\"")
+CODE (U"<entry> \"Belangrijk...\"")
+CODE (U"<normal> \"Hoogge\\bse\\\" \\\" erd publiek!\"")
+CODE (U"<normal> \"Einde.\"")
+NORMAL (U"A ManPages text file should start with the following information:")
+LIST_ITEM (U"1. The word \"ManPagesTextFile\" on the first line.")
+LIST_ITEM (U"2. The title of the manual page, between double quotes. "
 	"This will be drawn at the top of the page. "
 	"The name of the ManPages text file should be derived from this title (see below).")
-LIST_ITEM (L"3. The author of the manual page, between double quotes. "
+LIST_ITEM (U"3. The author of the manual page, between double quotes. "
 	"This will be drawn at the bottom of the page.")
-LIST_ITEM (L"4. The date you created or modified the page, "
+LIST_ITEM (U"4. The date you created or modified the page, "
 	"in the format year \\-- month (two digits) \\-- day (two digits), without spaces.")
-LIST_ITEM (L"5. The recording time. If this is not zero, "
+LIST_ITEM (U"5. The recording time. If this is not zero, "
 	"three sound buttons (see below) will appear at the top of the page.")
-LIST_ITEM (L"6. A sequence of paragraph types and texts. "
+LIST_ITEM (U"6. A sequence of paragraph types and texts. "
 	"You put the types between < and >, and the texts between double quotes "
 	"(if your text contains a double quote, you should write two double quotes).")
-NORMAL (L"The format of a ManPages text file is rather free, as long as the first line is correct, "
+NORMAL (U"The format of a ManPages text file is rather free, as long as the first line is correct, "
 	"the four required pieces of information are there in the correct order, "
 	"and there is a correct alternation between paragraph texts and types. "
 	"If you put multiple elements on a line, there should be at least one space between them. "
 	"You may distribute texts across multiple lines, as long as you do not add any spaces:")
-CODE (L"<normal> \"Hoogge\\bse\\\" \\\" erd")
-CODE (L"publiek!\"")
-NORMAL (L"This will have exactly the same effect as above.")
-ENTRY (L"Example 2: multiple documents")
-NORMAL (L"The above example with a single document is not very useful. "
+CODE (U"<normal> \"Hoogge\\bse\\\" \\\" erd")
+CODE (U"publiek!\"")
+NORMAL (U"This will have exactly the same effect as above.")
+ENTRY (U"Example 2: multiple documents")
+NORMAL (U"The above example with a single document is not very useful. "
 	"You will usually want to refer to other documents:")
-CODE (L"ManPagesTextFile")
-CODE (L"\"Welcome\" \"Paul Boersma\" 19970820 1.0")
-CODE (L"<intro> \"Welcome to Paul's transcription course.\"")
-CODE (L"<entry> \"Groups of speech sounds\"")
-CODE (L"<normal> \"You can listen to the following sounds")
-CODE (L"from the languages of the world,")
-CODE (L"pronounced by a single speaker (me):\\\"r")
-CODE (L"<list_item> \"\\@ Vowels, quite problematic for Dutch students!\"")
-CODE (L"<list_item> \"\\@ \\@ Dorsal fricatives\\@ , equally problematic!\"")
-NORMAL (L"With the symbol `\\@ ', you create a %link to another ManPages text file. "
+CODE (U"ManPagesTextFile")
+CODE (U"\"Welcome\" \"Paul Boersma\" 19970820 1.0")
+CODE (U"<intro> \"Welcome to Paul's transcription course.\"")
+CODE (U"<entry> \"Groups of speech sounds\"")
+CODE (U"<normal> \"You can listen to the following sounds")
+CODE (U"from the languages of the world,")
+CODE (U"pronounced by a single speaker (me):\\\"r")
+CODE (U"<list_item> \"\\@ Vowels, quite problematic for Dutch students!\"")
+CODE (U"<list_item> \"\\@ \\@ Dorsal fricatives\\@ , equally problematic!\"")
+NORMAL (U"With the symbol `\\@ ', you create a %link to another ManPages text file. "
 	"A link will be drawn in blue on your screen. "
 	"In this example, you have created links to the files ##Vowels.man# "
 	"and ##Dorsal_fricatives.man# in the same directory as the current file "
@@ -109,110 +109,110 @@ NORMAL (L"With the symbol `\\@ ', you create a %link to another ManPages text fi
 	"If the link contains spaces or other non-alphanumeric symbols, "
 	"you have to use three `\\@ ' symbols, as shown; "
 	"with a single word, you may use a single `\\@ '.")
-NORMAL (L"In resolving the file name, the ManPages system replaces spaces "
+NORMAL (U"In resolving the file name, the ManPages system replaces spaces "
 	"and other special symbols with underscores, "
 	"and converts any initial lower-case character by its upper-case variant. "
 	"For instance, if your link is \"\\@ \\@ back vowels\\@ \", "
 	"the file name will be ##Back_vowels.man#.")
-NORMAL (L"The title in the second line of ##Back_vowels.man# must be equal to the link name, "
+NORMAL (U"The title in the second line of ##Back_vowels.man# must be equal to the link name, "
 	"though capitalization of the first letter is allowed. "
 	"Thus, the title of ##Back_vowels.man# will probably be \"Back vowels\". "
 	"Likewise, the starting file with the title \"Welcome\" should have the name ##Welcome.man# "
 	"if any other files refer to it.")
-ENTRY (L"Paragraph types")
-NORMAL (L"A normal paragraph will have type <normal>. The hypertext system will "
+ENTRY (U"Paragraph types")
+NORMAL (U"A normal paragraph will have type <normal>. The hypertext system will "
 	"leave a blank space between paragraphs with this type. "
 	"The first paragraph of a manual page will normally have the type <intro>. "
 	"Though this may look the same as <normal>, the search system of the @Manual "
 	"may take account of the distinction.")
-NORMAL (L"Headings (like the title \"Paragraph types\" of this subsection) "
+NORMAL (U"Headings (like the title \"Paragraph types\" of this subsection) "
 	"have type <entry>. This will be drawn in a larger character size.")
-NORMAL (L"For lists, you use the type <list_item>. You will often combine this with %button symbols, "
+NORMAL (U"For lists, you use the type <list_item>. You will often combine this with %button symbols, "
 	"like in the following:")
-CODE (L"<normal> \"Choose a colour:\"")
-CODE (L"<list_item> \"\\bsbu \\@ Red.\"")
-CODE (L"<list_item> \"\\bsbu \\@ Green.\"")
-CODE (L"<list_item> \"\\bsbu \\@ Blue.\"")
-NORMAL (L"For text that should appear with a fixed character width, you use the type <code>.")
-NORMAL (L"For a paragraph that should be connected with the following paragraph "
+CODE (U"<normal> \"Choose a colour:\"")
+CODE (U"<list_item> \"\\bsbu \\@ Red.\"")
+CODE (U"<list_item> \"\\bsbu \\@ Green.\"")
+CODE (U"<list_item> \"\\bsbu \\@ Blue.\"")
+NORMAL (U"For text that should appear with a fixed character width, you use the type <code>.")
+NORMAL (U"For a paragraph that should be connected with the following paragraph "
 	"without leaving a blank space "
 	"(probably a list item or a definition), you use the type <tag>.")
-NORMAL (L"For a paragraph with a blank left margin, you use the type <definition>.")
-NORMAL (L"For a paragraph with an embedded script (a picture), you use the type <script> (see below).")
-ENTRY (L"Special symbols and styles")
-NORMAL (L"You can use all of Praat's @@special symbols@ and @@text styles@, "
+NORMAL (U"For a paragraph with a blank left margin, you use the type <definition>.")
+NORMAL (U"For a paragraph with an embedded script (a picture), you use the type <script> (see below).")
+ENTRY (U"Special symbols and styles")
+NORMAL (U"You can use all of Praat's @@special symbols@ and @@text styles@, "
 	"except that some %single text-style symbols have different meanings:")
-LIST_ITEM (L"\\bu A single percent sign introduces a word in italic: $$\\% pot$ gives %pot.")
-LIST_ITEM (L"\\bu A single number sign introduces a word in bold: $$\\# pot$ gives #pot.")
-LIST_ITEM (L"\\bu A single dollar sign introduces a word in monospace: $$\\$ pot$ gives $pot.")
-LIST_ITEM (L"\\bu A single underscore is rendered as an underscore: $$a_b$ gives a_b.")
-NORMAL (L"To create a single italic, bold, or subscripted letter, "
+LIST_ITEM (U"\\bu A single percent sign introduces a word in italic: $$\\% pot$ gives %pot.")
+LIST_ITEM (U"\\bu A single number sign introduces a word in bold: $$\\# pot$ gives #pot.")
+LIST_ITEM (U"\\bu A single dollar sign introduces a word in monospace: $$\\$ pot$ gives $pot.")
+LIST_ITEM (U"\\bu A single underscore is rendered as an underscore: $$a_b$ gives a_b.")
+NORMAL (U"To create a single italic, bold, or subscripted letter, "
 	"you revert to the usual technique for stretches of italic, bold, or subscripted text. "
 	"So, to get %F__1_, you type $$\\% F_\\_ 1_.")
-ENTRY (L"Sound links")
-NORMAL (L"Your text may contain links to sound files. They are drawn in blue. "
+ENTRY (U"Sound links")
+NORMAL (U"Your text may contain links to sound files. They are drawn in blue. "
 	"The format is:")
-CODE (L"<normal> \"You should know that \\@ \\@ \\bsFIct.aifc|\\bsct\\@  is more open than "
+CODE (U"<normal> \"You should know that \\@ \\@ \\bsFIct.aifc|\\bsct\\@  is more open than "
 	"\\@ \\@ \\bsFIo.aifc|o\\@ .\"")
-NORMAL (L"On your screen, you will see an #\\ct and an #o symbol, both drawn in blue. "
+NORMAL (U"On your screen, you will see an #\\ct and an #o symbol, both drawn in blue. "
 	"If you click on one of these sound links, one of the sound files ##ct.aifc# "
 	"or ##o.aifc# will be played.")
-NORMAL (L"The format of the sound link \"$$\\@ \\@ \\bsFIo.aifc|o\\@ $\" is to be understood "
+NORMAL (U"The format of the sound link \"$$\\@ \\@ \\bsFIo.aifc|o\\@ $\" is to be understood "
 	"as follows. The pipe symbol separates the link information (\\bsFIo.aifc) from the viewable "
 	"link text (o). The link information is introduced with a symbol (\\bsFI) that "
 	"tells the manual system that a sound file name follows. The manual system reads "
 	"this file, sees that it contains a sound, and plays that sound.")
-NORMAL (L"You can use relative path names, e.g., \\bsFIsounds/o.aifc refers to the file "
+NORMAL (U"You can use relative path names, e.g., \\bsFIsounds/o.aifc refers to the file "
 	"##o.aifc# in the subdirectory #sounds, which must be contained in the same directory "
 	"as the ##.man# files. To make sure that your manual pages run on all platforms "
 	"(Windows, Macintosh, Unix), you will want to use the forward slash (/) to separate "
 	"the directory name(s) from the file name, as in this example "
 	"(i.e. you avoid the backslash (\\bs) that is usual on Windows computers).")
-ENTRY (L"Pictures as embedded scripts")
-NORMAL (L"Your text may contain Praat scripts. They typically draw a picture in your manual page, "
+ENTRY (U"Pictures as embedded scripts")
+NORMAL (U"Your text may contain Praat scripts. They typically draw a picture in your manual page, "
 	"with the font and font size of the manual until you specify otherwise in the script. The format is:")
-CODE (L"<script> 4.5 4 \"")
-CODE1 (L"Draw inner box")
-CODE1 (L"Axes: 0, 100, 0, 100")
-CODE1 (L"Text: 50, \"Centre\", 50, \"Half\", \"Hello!!\"")
-CODE (L"\\\"r")
-NORMAL (L"The two numbers after ##<script># are the width and the height of the picture "
+CODE (U"<script> 4.5 4 \"")
+CODE1 (U"Draw inner box")
+CODE1 (U"Axes: 0, 100, 0, 100")
+CODE1 (U"Text: 50, \"Centre\", 50, \"Half\", \"Hello!!\"")
+CODE (U"\\\"r")
+NORMAL (U"The two numbers after ##<script># are the width and the height of the picture "
 	"(the \"outer viewport\") in inches, if the font size of the manual is 12. "
 	"If the font size is larger, the viewport will be scaled up accordingly.")
-NORMAL (L"Please note that the script is enclosed within double quotes. "
+NORMAL (U"Please note that the script is enclosed within double quotes. "
 	"Therefore, you will have to double any double quotes that occur in the script.")
-NORMAL (L"If needed, a script like this can create objects in the object list of the manual. "
+NORMAL (U"If needed, a script like this can create objects in the object list of the manual. "
 	"However, you have to make sure that you remove them after use:")
-CODE (L"<script> 6 3 \"")
-CODE1 (L"Create Sound from formula: \"sineWithNoise\", 1, 0.0, 1.0, 44100, \"1/2*sin(2*pi*377*x)+randomGauss(0,0.1)\"")
-CODE1 (L"To Spectrogram: 0.005, 5000, 0.002, 20, \"Gaussian\"")
-CODE1 (L"Paint: 0, 0, 0, 0, 100.0, \"yes\", 50.0, 6.0, 0.0, \"yes\"")
-CODE1 (L"plusObject: \"Sound sineWithNoise\"")
-CODE1 (L"Remove")
-CODE (L"\\\"r")
-NORMAL (L"Note that unlike the previous script, this script does not set the font and font size. "
+CODE (U"<script> 6 3 \"")
+CODE1 (U"Create Sound from formula: \"sineWithNoise\", 1, 0.0, 1.0, 44100, \"1/2*sin(2*pi*377*x)+randomGauss(0,0.1)\"")
+CODE1 (U"To Spectrogram: 0.005, 5000, 0.002, 20, \"Gaussian\"")
+CODE1 (U"Paint: 0, 0, 0, 0, 100.0, \"yes\", 50.0, 6.0, 0.0, \"yes\"")
+CODE1 (U"plusObject: \"Sound sineWithNoise\"")
+CODE1 (U"Remove")
+CODE (U"\\\"r")
+NORMAL (U"Note that unlike the previous script, this script does not set the font and font size. "
 	"This means that the drawing will use the font and font size of the manual page, "
 	"which is usually what you want.")
-NORMAL (L"For obvious safety reasons, embedded scripts cannot contain commands that change the contents of any disk "
+NORMAL (U"For obvious safety reasons, embedded scripts cannot contain commands that change the contents of any disk "
 	"or send messages. Thus, commands like ##Save as WAV file...#, ##filedelete out.txt#, ##string\\$  >> out.txt#, "
 	"#system, or #sendpraat are forbidden. Several other commands, such as #pause and #editor, "
 	"are irrelevant inside pictures and are therefore forbidden as well. "
 	"Note that commands like #echo, ##Read from file...#, and #execute are still available "
 	"(with the last two, you can use relative paths; "
 	"with #execute, you can only run scripts that do not contain any of the forbidden commands).")
-NORMAL (L"The commands ##Set outer viewport...# and ##Set inner viewport...# are available; "
+NORMAL (U"The commands ##Set outer viewport...# and ##Set inner viewport...# are available; "
 	"they count in inches (if the font size of the manual is 12). The (0, 0) point is in the upper left corner, "
 	"as in the Picture window, so that you can test your picture with a normal Praat script; "
 	"for instance, the following script draws a cross in the upper half of the picture and a rectangle in the lower half:")
-CODE (L"<script> 4.5 4 \"")
-CODE1 (L"Axes: 0, 100, 0, 100")
-CODE1 (L"Select inner viewport: 0, 4.5, 0, 2")
-CODE1 (L"Draw line: 0, 0, 100, 100")
-CODE1 (L"Draw line: 0, 100, 100, 0")
-CODE1 (L"Select inner viewport: 0, 4.5, 2, 4")
-CODE1 (L"Draw rectangle: 0, 100, 0, 100")
-CODE (L"\\\"r")
-SCRIPT (4.5, 4, L""
+CODE (U"<script> 4.5 4 \"")
+CODE1 (U"Axes: 0, 100, 0, 100")
+CODE1 (U"Select inner viewport: 0, 4.5, 0, 2")
+CODE1 (U"Draw line: 0, 0, 100, 100")
+CODE1 (U"Draw line: 0, 100, 100, 0")
+CODE1 (U"Select inner viewport: 0, 4.5, 2, 4")
+CODE1 (U"Draw rectangle: 0, 100, 0, 100")
+CODE (U"\\\"r")
+SCRIPT (4.5, 4, U""
 	"Axes: 0, 100, 0, 100\n"
 	"Select inner viewport: 0, 4.5, 0, 2\n"
 	"Draw line: 0, 0, 100, 100\n"
@@ -220,42 +220,42 @@ SCRIPT (4.5, 4, L""
 	"Select inner viewport: 0, 4.5, 2, 4\n"
 	"Draw rectangle: 0, 100, 0, 100\n"
 )
-ENTRY (L"Script links")
-NORMAL (L"Your text may contain links to Praat scripts. They are drawn in blue. "
+ENTRY (U"Script links")
+NORMAL (U"Your text may contain links to Praat scripts. They are drawn in blue. "
 	"The format is:")
-CODE (L"<normal> \"Here is a script that \\@ \\@ \\bsSCdraw.praat|draws\\@  what you have selected.\"")
-NORMAL (L"On your screen, you will see the word #draws, drawn in blue. "
+CODE (U"<normal> \"Here is a script that \\@ \\@ \\bsSCdraw.praat|draws\\@  what you have selected.\"")
+NORMAL (U"On your screen, you will see the word #draws, drawn in blue. "
 	"If you click on it, the script ##draw.praat# will be executed. The string \"$$\\bsSC$\" indicates "
 	"that a script file name follows. As with sounds, you can use relative file paths. The script can take "
 	"arguments:")
-CODE (L"<normal> \"This script \\@ \\@ \\bsSCload2files.praat hello.wav hello.TextGrid|loads\\@  some files.\"")
-NORMAL (L"If the script file name or any arguments except the last contain spaces, they have to be enclosed "
+CODE (U"<normal> \"This script \\@ \\@ \\bsSCload2files.praat hello.wav hello.TextGrid|loads\\@  some files.\"")
+NORMAL (U"If the script file name or any arguments except the last contain spaces, they have to be enclosed "
 	"within double quotes, which have to be doubled again in the ManPage code:")
-CODE (L"<normal> \"Here is a script that \\@ \\@ \\bsSC\\\" \\\" my scripts/draw.praat\\\" \\\" |draws\\@  what you have selected.\"")
-CODE (L"<normal> \"This script \\@ \\@ \\bsSC\\\" \\\" my scripts/load2files.praat\\\" \\\"  \\\" \\\" my sounds/hello.wav\\\" \\\"  my textgrids/hello.TextGrid|loads\\@  some files.\"")
-NORMAL (L"For safety reasons, the user will see a warning about "
+CODE (U"<normal> \"Here is a script that \\@ \\@ \\bsSC\\\" \\\" my scripts/draw.praat\\\" \\\" |draws\\@  what you have selected.\"")
+CODE (U"<normal> \"This script \\@ \\@ \\bsSC\\\" \\\" my scripts/load2files.praat\\\" \\\"  \\\" \\\" my sounds/hello.wav\\\" \\\"  my textgrids/hello.TextGrid|loads\\@  some files.\"")
+NORMAL (U"For safety reasons, the user will see a warning about "
 	"\"trusting the author of the manual pages\" if you include script links in your manual.")
-ENTRY (L"How to separate link information and link text")
-NORMAL (L"The separation between link information and viewable link text, as seen "
+ENTRY (U"How to separate link information and link text")
+NORMAL (U"The separation between link information and viewable link text, as seen "
 	"in the above description of sound and script links, is actually a general mechanism "
 	"in the hypertext system. For instance, if you want to see the text \"x\" "
 	"in blue on your screen, and create a link from it to the page \"Dorsal fricatives\", "
 	"you specify the link as $$\\@ \\@ Dorsal fricatives|x\\@ $.")
-ENTRY (L"Sound buttons")
-NORMAL (L"If the %%recording time% in the second line is not 0, "
+ENTRY (U"Sound buttons")
+NORMAL (U"If the %%recording time% in the second line is not 0, "
 	"three buttons will appear near the top of the page:")
-NORMAL (L"1. The #Record button allows you to record a sound from the microphone.")
-NORMAL (L"2. The #Play button allows you to play this recorded sound. "
+NORMAL (U"1. The #Record button allows you to record a sound from the microphone.")
+NORMAL (U"2. The #Play button allows you to play this recorded sound. "
 	"In this way, you can compare your own utterances with the sounds "
 	"behind the sound links, for example.")
-NORMAL (L"3. The ##Copy last played to list# button copies the latest sound to the list of objects, "
+NORMAL (U"3. The ##Copy last played to list# button copies the latest sound to the list of objects, "
 	"allowing you to perform analyses on it, save it to disk, et cetera. "
 	"The latest sound may be a sound that you recorded with the #Record button, "
 	"a sound that you played with the #Play button, "
 	"or a sound that you played by clicking on a sound link, "
 	"whichever occurred most recently.")
-ENTRY (L"And beyond")
-NORMAL (L"If you need even more flexibility than ManPages offer you, consider using the @@Demo window@ instead.")
+ENTRY (U"And beyond")
+NORMAL (U"If you need even more flexibility than ManPages offer you, consider using the @@Demo window@ instead.")
 MAN_END
 
 }
diff --git a/fon/manual_Picture.cpp b/fon/manual_Picture.cpp
index 64d06ec..050effb 100644
--- a/fon/manual_Picture.cpp
+++ b/fon/manual_Picture.cpp
@@ -1,6 +1,6 @@
 /* manual_Picture.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,8 +20,8 @@
 #include "ManPagesM.h"
 #include "UnicodeData.h"
 
-static void drawOneIpaSymbol (Graphics g, double x, double y, const wchar_t *symbol) {
-	wchar_t buffer [30], *p = & buffer [0];
+static void drawOneIpaSymbol (Graphics g, double x, double y, const char32 *symbol) {
+	char32 buffer [30], *p = & buffer [0];
 	int fontSize = Graphics_inqFontSize (g);
 	Graphics_rectangle (g, x - 0.5, x + 0.5, y - 0.5, y + 0.5);
 	if (! symbol) return;
@@ -30,11 +30,11 @@ static void drawOneIpaSymbol (Graphics g, double x, double y, const wchar_t *sym
 	Graphics_setFontSize (g, fontSize * 3 / 2);
 	Graphics_text (g, x, y + 0.25, symbol);
 	while (*symbol) {
-		if (*symbol == '\\') { *p++ = '\\'; *p++ = 'b'; *p++ = 's'; }   /* Visualize backslash (\bs). */
-		else { *p++ = '\\'; *p++ = *symbol; *p++ = ' '; }   /* Visualize special symbols (% ^ _ #). */
+		if (*symbol == '\\') { *p++ = '\\'; *p++ = 'b'; *p++ = 's'; }   // visualize backslash (\bs)
+		else { *p++ = '\\'; *p++ = *symbol; *p++ = ' '; }   // visualize special symbols (% ^ _ #)
 		symbol ++;
 	}
-	*p = '\0';   /* Trailing null byte. */
+	*p = '\0';   // trailing null byte
 	Graphics_setFont (g, kGraphics_font_HELVETICA);
 	Graphics_setFontSize (g, fontSize * 5 / 6);
 	Graphics_text (g, x, y - 0.25, buffer);
@@ -46,56 +46,56 @@ static void draw_IPA_consonant_chart (Graphics graphics) {
 	Graphics_setFontStyle (graphics, Graphics_ITALIC);
 	Graphics_setTextRotation (graphics, 60);
 	Graphics_setTextAlignment (graphics, Graphics_LEFT, Graphics_HALF);
-	Graphics_text (graphics, 4, 17.6, L"bilabial");
-	Graphics_text (graphics, 5, 17.6, L"labiodental");
-	Graphics_text (graphics, 6, 17.6, L"dental");
-	Graphics_text (graphics, 7, 17.6, L"alveolar");
-	Graphics_text (graphics, 8, 17.6, L"alv. lateral");
-	Graphics_text (graphics, 9, 17.6, L"postalveolar");
-	Graphics_text (graphics, 10, 17.6, L"retroflex");
-	Graphics_text (graphics, 11, 17.6, L"alveolo-palatal");
-	Graphics_text (graphics, 12, 17.6, L"palatal");
-	Graphics_text (graphics, 13, 17.6, L"labial-palatal");
-	Graphics_text (graphics, 14, 17.6, L"labial-velar");
-	Graphics_text (graphics, 15, 17.6, L"velar");
-	Graphics_text (graphics, 16, 17.6, L"uvular");
-	Graphics_text (graphics, 17, 17.6, L"pharyngeal");
-	Graphics_text (graphics, 18, 17.6, L"epiglottal");
-	Graphics_text (graphics, 19, 17.6, L"glottal");
+	Graphics_text (graphics, 4, 17.6, U"bilabial");
+	Graphics_text (graphics, 5, 17.6, U"labiodental");
+	Graphics_text (graphics, 6, 17.6, U"dental");
+	Graphics_text (graphics, 7, 17.6, U"alveolar");
+	Graphics_text (graphics, 8, 17.6, U"alv. lateral");
+	Graphics_text (graphics, 9, 17.6, U"postalveolar");
+	Graphics_text (graphics, 10, 17.6, U"retroflex");
+	Graphics_text (graphics, 11, 17.6, U"alveolo-palatal");
+	Graphics_text (graphics, 12, 17.6, U"palatal");
+	Graphics_text (graphics, 13, 17.6, U"labial-palatal");
+	Graphics_text (graphics, 14, 17.6, U"labial-velar");
+	Graphics_text (graphics, 15, 17.6, U"velar");
+	Graphics_text (graphics, 16, 17.6, U"uvular");
+	Graphics_text (graphics, 17, 17.6, U"pharyngeal");
+	Graphics_text (graphics, 18, 17.6, U"epiglottal");
+	Graphics_text (graphics, 19, 17.6, U"glottal");
 	Graphics_setTextRotation (graphics, 0);
 	Graphics_setTextAlignment (graphics, Graphics_RIGHT, Graphics_HALF);
-	Graphics_text (graphics, 3.3, 17, L"voiceless plosive");
-	Graphics_text (graphics, 3.3, 16, L"voiced plosive");
-	Graphics_text (graphics, 3.3, 15, L"nasal");
-	Graphics_text (graphics, 3.3, 14, L"voiceless fricative");
-	Graphics_text (graphics, 3.3, 13, L"voiced fricative");
-	Graphics_text (graphics, 3.3, 12, L"approximant");
-	Graphics_text (graphics, 3.3, 11, L"trill");
-	Graphics_text (graphics, 3.3, 10, L"tap or flap");
-	Graphics_text (graphics, 3.3, 9, L"lateral approx.");
-	Graphics_text (graphics, 3.3, 8, L"implosive");
-	Graphics_text (graphics, 3.3, 7, L"click");
+	Graphics_text (graphics, 3.3, 17, U"voiceless plosive");
+	Graphics_text (graphics, 3.3, 16, U"voiced plosive");
+	Graphics_text (graphics, 3.3, 15, U"nasal");
+	Graphics_text (graphics, 3.3, 14, U"voiceless fricative");
+	Graphics_text (graphics, 3.3, 13, U"voiced fricative");
+	Graphics_text (graphics, 3.3, 12, U"approximant");
+	Graphics_text (graphics, 3.3, 11, U"trill");
+	Graphics_text (graphics, 3.3, 10, U"tap or flap");
+	Graphics_text (graphics, 3.3, 9, U"lateral approx.");
+	Graphics_text (graphics, 3.3, 8, U"implosive");
+	Graphics_text (graphics, 3.3, 7, U"click");
 	Graphics_setFontStyle (graphics, Graphics_NORMAL);
 	{
-		static struct { double x, y; const wchar_t *string; } symbols [] = {
-{ 4, 17, L"p" }, { 4, 16, L"b" }, { 4, 15, L"m" }, { 4, 14, L"\\ff" }, { 4, 13, L"\\bf" }, { 4, 11, L"\\bc" }, { 4, 8, L"\\b^" }, { 4, 7, L"\\O." },
-{ 5, 15, L"\\mj" }, { 5, 14, L"f" }, { 5, 13, L"v" }, { 5, 12, L"\\vs" },
-{ 6, 14, L"\\tf" }, { 6, 13, L"\\dh" }, { 6, 7, L"\\|1" },
-{ 7, 17, L"t" }, { 7, 16, L"d" }, { 7, 15, L"n" }, { 7, 14, L"s" }, { 7, 13, L"z" }, { 7, 12, L"\\rt" }, { 7, 11, L"r" }, { 7, 10, L"\\fh" }, { 7, 9, L"l" }, { 7, 8, L"\\d^" },
-{ 8, 17, L"t^l" }, { 8, 16, L"d^l" }, { 8, 14, L"\\l-" }, { 8, 13, L"\\lz" }, { 8, 12, L"l" }, { 8, 10, L"\\rl" }, { 8, 9, L"l" }, { 8, 7, L"\\|2" },
-{ 9, 14, L"\\sh" }, { 9, 13, L"\\zh" }, { 9, 7, L"\\|-" },
-{ 10, 17, L"\\t." }, { 10, 16, L"\\d." }, { 10, 15, L"\\n." }, { 10, 14, L"\\s." }, { 10, 13, L"\\z." }, { 10, 12, L"\\r." }, { 10, 10, L"\\f." }, { 10, 9, L"\\l." }, { 10, 7, L"!" },
-{ 11, 14, L"\\cc" }, { 11, 13, L"\\zc" },
-{ 12, 17, L"c" }, { 12, 16, L"\\j-" }, { 12, 15, L"\\nj" }, { 12, 14, L"\\c," }, { 12, 13, L"\\jc" }, { 12, 12, L"j" }, { 12, 9, L"\\yt" }, { 12, 8, L"\\j^" },
-{ 13, 12, L"\\ht" },
-{ 14, 14, L"\\wt" }, { 14, 12, L"w" },
-{ 15, 17, L"k" }, { 15, 16, L"\\gs" }, { 15, 15, L"\\ng" }, { 15, 14, L"x" }, { 15, 13, L"\\gf" }, { 15, 12, L"\\ml" }, { 15, 9, L"\\lc" }, { 15, 8, L"\\g^" },
-{ 16, 17, L"q" }, { 16, 16, L"\\gc" }, { 16, 15, L"\\nc" }, { 16, 14, L"\\cf" }, { 16, 13, L"\\ri" }, { 16, 11, L"\\rc" }, { 16, 8, L"\\G^" },
-{ 17, 14, L"\\h-" }, { 17, 13, L"\\9e" },
-{ 18, 17, L"\\?-" }, { 18, 14, L"\\hc" }, { 18, 13, L"\\9-" },
-{ 19, 17, L"\\?g" }, { 19, 14, L"h" }, { 19, 13, L"\\h^" },
-		{ 0, 0, NULL } };
-		for (int i = 0; symbols [i]. string != NULL; i ++)
+		static struct { double x, y; const char32 *string; } symbols [] = {
+{ 4, 17, U"p" }, { 4, 16, U"b" }, { 4, 15, U"m" }, { 4, 14, U"\\ff" }, { 4, 13, U"\\bf" }, { 4, 11, U"\\bc" }, { 4, 8, U"\\b^" }, { 4, 7, U"\\O." },
+{ 5, 15, U"\\mj" }, { 5, 14, U"f" }, { 5, 13, U"v" }, { 5, 12, U"\\vs" },
+{ 6, 14, U"\\tf" }, { 6, 13, U"\\dh" }, { 6, 7, U"\\|1" },
+{ 7, 17, U"t" }, { 7, 16, U"d" }, { 7, 15, U"n" }, { 7, 14, U"s" }, { 7, 13, U"z" }, { 7, 12, U"\\rt" }, { 7, 11, U"r" }, { 7, 10, U"\\fh" }, { 7, 9, U"l" }, { 7, 8, U"\\d^" },
+{ 8, 17, U"t^l" }, { 8, 16, U"d^l" }, { 8, 14, U"\\l-" }, { 8, 13, U"\\lz" }, { 8, 12, U"l" }, { 8, 10, U"\\rl" }, { 8, 9, U"l" }, { 8, 7, U"\\|2" },
+{ 9, 14, U"\\sh" }, { 9, 13, U"\\zh" }, { 9, 7, U"\\|-" },
+{ 10, 17, U"\\t." }, { 10, 16, U"\\d." }, { 10, 15, U"\\n." }, { 10, 14, U"\\s." }, { 10, 13, U"\\z." }, { 10, 12, U"\\r." }, { 10, 10, U"\\f." }, { 10, 9, U"\\l." }, { 10, 7, U"!" },
+{ 11, 14, U"\\cc" }, { 11, 13, U"\\zc" },
+{ 12, 17, U"c" }, { 12, 16, U"\\j-" }, { 12, 15, U"\\nj" }, { 12, 14, U"\\c," }, { 12, 13, U"\\jc" }, { 12, 12, U"j" }, { 12, 9, U"\\yt" }, { 12, 8, U"\\j^" },
+{ 13, 12, U"\\ht" },
+{ 14, 14, U"\\wt" }, { 14, 12, U"w" },
+{ 15, 17, U"k" }, { 15, 16, U"\\gs" }, { 15, 15, U"\\ng" }, { 15, 14, U"x" }, { 15, 13, U"\\gf" }, { 15, 12, U"\\ml" }, { 15, 9, U"\\lc" }, { 15, 8, U"\\g^" },
+{ 16, 17, U"q" }, { 16, 16, U"\\gc" }, { 16, 15, U"\\nc" }, { 16, 14, U"\\cf" }, { 16, 13, U"\\ri" }, { 16, 11, U"\\rc" }, { 16, 8, U"\\G^" },
+{ 17, 14, U"\\h-" }, { 17, 13, U"\\9e" },
+{ 18, 17, U"\\?-" }, { 18, 14, U"\\hc" }, { 18, 13, U"\\9-" },
+{ 19, 17, U"\\?g" }, { 19, 14, U"h" }, { 19, 13, U"\\h^" },
+		{ 0, 0, nullptr } };
+		for (int i = 0; symbols [i]. string != nullptr; i ++)
 			drawOneIpaSymbol (graphics, symbols [i]. x, symbols [i]. y, symbols [i]. string);
 	}
 }
@@ -105,28 +105,28 @@ static void draw_IPA_vowel_chart (Graphics graphics) {
 	Graphics_setFontStyle (graphics, Graphics_ITALIC);
 	Graphics_setTextRotation (graphics, 60);
 	Graphics_setTextAlignment (graphics, Graphics_LEFT, Graphics_HALF);
-	Graphics_text (graphics, 4.5, 6.6, L"front");
-	Graphics_text (graphics, 7, 6.6, L"central");
-	Graphics_text (graphics, 9.5, 6.6, L"back");
+	Graphics_text (graphics, 4.5, 6.6, U"front");
+	Graphics_text (graphics, 7, 6.6, U"central");
+	Graphics_text (graphics, 9.5, 6.6, U"back");
 	Graphics_setTextRotation (graphics, 0);
 	Graphics_setTextAlignment (graphics, Graphics_RIGHT, Graphics_HALF);
-	Graphics_text (graphics, 3.3, 6, L"close");
-	Graphics_text (graphics, 3.3, 5, L"close centralized");
-	Graphics_text (graphics, 3.3, 4, L"close-mid");
-	Graphics_text (graphics, 3.3, 2, L"open-mid");
-	Graphics_text (graphics, 3.3, 0, L"open");
+	Graphics_text (graphics, 3.3, 6, U"close");
+	Graphics_text (graphics, 3.3, 5, U"close centralized");
+	Graphics_text (graphics, 3.3, 4, U"close-mid");
+	Graphics_text (graphics, 3.3, 2, U"open-mid");
+	Graphics_text (graphics, 3.3, 0, U"open");
 	Graphics_setFontStyle (graphics, Graphics_NORMAL);
 	{
-		static struct { double x, y; const wchar_t *string; } symbols [] = {
-{ 4, 6, L"i" }, { 5, 6, L"y" }, { 6.5, 6, L"\\i-" }, { 7.5, 6, L"\\u-" }, { 9, 6, L"\\mt" }, { 10, 6, L"u" },
-{ 4.2, 5, L"\\ic" }, { 5.2, 5, L"\\yc" }, { 9.8, 5, L"\\hs" },
-{ 4, 4, L"e" }, { 5, 4, L"\\o/" }, { 6.5, 4, L"\\e-" }, { 7.5, 4, L"\\o-" }, { 9, 4, L"\\rh" }, { 10, 4, L"o" },
-{ 7, 3, L"\\sw" }, { 7, 1, L"\\at" },
-{ 4, 2, L"\\ef" }, { 5, 2, L"\\oe" }, { 6.5, 2, L"\\er" }, { 7.5, 2, L"\\kb" }, { 9, 2, L"\\vt" }, { 10, 2, L"\\ct" },
-{ 4, 1, L"\\ae" },
-{ 4, 0, L"a" }, { 5, 0, L"\\Oe" }, { 9, 0, L"\\as" }, { 10, 0, L"\\ab" },
-		{ 0, 0, NULL } };
-		for (int i = 0; symbols [i]. string != NULL; i ++)
+		static struct { double x, y; const char32 *string; } symbols [] = {
+{ 4, 6, U"i" }, { 5, 6, U"y" }, { 6.5, 6, U"\\i-" }, { 7.5, 6, U"\\u-" }, { 9, 6, U"\\mt" }, { 10, 6, U"u" },
+{ 4.2, 5, U"\\ic" }, { 5.2, 5, U"\\yc" }, { 9.8, 5, U"\\hs" },
+{ 4, 4, U"e" }, { 5, 4, U"\\o/" }, { 6.5, 4, U"\\e-" }, { 7.5, 4, U"\\o-" }, { 9, 4, U"\\rh" }, { 10, 4, U"o" },
+{ 7, 3, U"\\sw" }, { 7, 1, U"\\at" },
+{ 4, 2, U"\\ef" }, { 5, 2, U"\\oe" }, { 6.5, 2, U"\\er" }, { 7.5, 2, U"\\kb" }, { 9, 2, U"\\vt" }, { 10, 2, U"\\ct" },
+{ 4, 1, U"\\ae" },
+{ 4, 0, U"a" }, { 5, 0, U"\\Oe" }, { 9, 0, U"\\as" }, { 10, 0, U"\\ab" },
+		{ 0, 0, nullptr } };
+		for (int i = 0; symbols [i]. string != nullptr; i ++)
 			drawOneIpaSymbol (graphics, symbols [i]. x, symbols [i]. y, symbols [i]. string);
 	}
 }
@@ -134,178 +134,178 @@ static void draw_IPA_vowel_chart (Graphics graphics) {
 void manual_Picture_init (ManPages me);
 void manual_Picture_init (ManPages me) {
 
-MAN_BEGIN (L"Special symbols", L"ppgb", 20080227)
-INTRO (L"When drawing text into the @@Picture window@ or into the @@TextGridEditor@, "
+MAN_BEGIN (U"Special symbols", U"ppgb", 20080227)
+INTRO (U"When drawing text into the @@Picture window@ or into the @@TextGridEditor@, "
 	"you can use %%backslash sequences% to display various kinds of special symbols. "
 	"You can usually also type the characters themselves, if your computer has an input method for them.")
 
-ENTRY (L"European symbols")
-NORMAL (L"To get the symbol \"\\a^\" (a-circumflex), you type \"\\bsa\\^ \", i.e., "
+ENTRY (U"European symbols")
+NORMAL (U"To get the symbol \"\\a^\" (a-circumflex), you type \"\\bsa\\^ \", i.e., "
 	"a sequence of backslash + a + circumflex. In this way, you can get a hundred "
 	"non-ASCII symbols that are used in the alphabets of many European languages.")
-LIST_ITEM (L"\\a\" \\bsa\\\"   \\e\" \\bse\\\"   \\i\" \\bsi\\\"   \\o\" \\bso\\\"   "
+LIST_ITEM (U"\\a\" \\bsa\\\"   \\e\" \\bse\\\"   \\i\" \\bsi\\\"   \\o\" \\bso\\\"   "
 	"\\u\" \\bsu\\\"   \\y\" \\bsy\\\"  "
 	"\\A\" \\bsA\\\"   \\E\" \\bsE\\\"   \\I\" \\bsI\\\"   \\O\" \\bsO\\\"   \\U\" \\bsU\\\"   "
 	"\\Y\" \\bsY\\\" ")
-LIST_ITEM (L"\\a\' \\bsa\'  \\c\' \\bsc\'  \\e\' \\bse\'  \\i\' \\bsi\'  \\n\' \\bsn\'  \\o\' \\bso\'  \\s\' \\bss\'  \\u\' \\bsu\'  \\y\' \\bsy\'  \\z\' \\bsz\'  "
+LIST_ITEM (U"\\a\' \\bsa\'  \\c\' \\bsc\'  \\e\' \\bse\'  \\i\' \\bsi\'  \\n\' \\bsn\'  \\o\' \\bso\'  \\s\' \\bss\'  \\u\' \\bsu\'  \\y\' \\bsy\'  \\z\' \\bsz\'  "
 	"\\A\' \\bsA\'  \\C\' \\bsC\'  \\E\' \\bsE\'  \\I\' \\bsI\'  \\N\' \\bsN\'  \\O\' \\bsO\'  \\S\' \\bsS\'  \\U\' \\bsU\'  \\Y\' \\bsY\'  \\Z\' \\bsZ\'")
-LIST_ITEM (L"\\o: \\bso:  \\u: \\bsu:  \\O: \\bsO:  \\U: \\bsU:")
-LIST_ITEM (L"\\a` \\bsa`  \\e` \\bse`  \\i` \\bsi`  \\o` \\bso`  \\u` \\bsu`  "
+LIST_ITEM (U"\\o: \\bso:  \\u: \\bsu:  \\O: \\bsO:  \\U: \\bsU:")
+LIST_ITEM (U"\\a` \\bsa`  \\e` \\bse`  \\i` \\bsi`  \\o` \\bso`  \\u` \\bsu`  "
 	"\\A` \\bsA`  \\E` \\bsE`  \\I` \\bsI`  \\O` \\bsO`  \\U` \\bsU`")
-LIST_ITEM (L"\\a^ \\bsa\\^   \\e^ \\bse\\^   \\i^ \\bsi\\^   \\o^ \\bso\\^   \\u^ \\bsu\\^   "
+LIST_ITEM (U"\\a^ \\bsa\\^   \\e^ \\bse\\^   \\i^ \\bsi\\^   \\o^ \\bso\\^   \\u^ \\bsu\\^   "
 	"\\A^ \\bsA\\^   \\E^ \\bsE\\^   \\I^ \\bsI\\^   \\O^ \\bsO\\^   \\U^ \\bsU\\^ ")
-LIST_ITEM (L"\\a~ \\bsa\\~   \\n~ \\bsn\\~   \\o~ \\bso\\~   \\A~ \\bsA\\~   \\N~ \\bsN\\~   \\O~ \\bsO\\~  ")
-LIST_ITEM (L"\\c< \\bsc<  \\d< \\bsd<  \\e< \\bse<  \\g< \\bsg<  \\n< \\bsn<  \\r< \\bsr<  \\s< \\bss<  \\t< \\bst<  \\z< \\bsz<  "
+LIST_ITEM (U"\\a~ \\bsa\\~   \\n~ \\bsn\\~   \\o~ \\bso\\~   \\A~ \\bsA\\~   \\N~ \\bsN\\~   \\O~ \\bsO\\~  ")
+LIST_ITEM (U"\\c< \\bsc<  \\d< \\bsd<  \\e< \\bse<  \\g< \\bsg<  \\n< \\bsn<  \\r< \\bsr<  \\s< \\bss<  \\t< \\bst<  \\z< \\bsz<  "
 	"\\C< \\bsC<  \\D< \\bsD<  \\E< \\bsE<  \\G< \\bsG<  \\N< \\bsN<  \\R< \\bsR<  \\S< \\bsS<  \\T< \\bsT<  \\Z< \\bsZ<")
-LIST_ITEM (L"\\d- \\bsd-  \\D- \\bsD-")
-LIST_ITEM (L"\\ao \\bsao  \\uo \\bsuo  \\Ao \\bsAo  \\Uo \\bsUo")
-LIST_ITEM (L"\\a; \\bsa;  \\e; \\bse;  \\A; \\bsA;  \\E; \\bsE;")
-LIST_ITEM (L"\\ae \\bsae  \\Ae \\bsAe  \\o/ \\bso/  \\O/ \\bsO/  "
+LIST_ITEM (U"\\d- \\bsd-  \\D- \\bsD-")
+LIST_ITEM (U"\\ao \\bsao  \\uo \\bsuo  \\Ao \\bsAo  \\Uo \\bsUo")
+LIST_ITEM (U"\\a; \\bsa;  \\e; \\bse;  \\A; \\bsA;  \\E; \\bsE;")
+LIST_ITEM (U"\\ae \\bsae  \\Ae \\bsAe  \\o/ \\bso/  \\O/ \\bsO/  "
 	"\\c, \\bsc,  \\C, \\bsC,  \\l/ \\bsl/  \\L/ \\bsL/  \\ss \\bsss  \\th \\bsth  \\z! \\bsz!  \\Z! \\bsZ!")
-LIST_ITEM (L"\\!d \\bs!d  \\?d \\bs?d")
-LIST_ITEM (L"\\eu \\bseu %euro, \\Lp \\bsLp %%pound sterling%, \\Y= \\bsY= %yen, "
+LIST_ITEM (U"\\!d \\bs!d  \\?d \\bs?d")
+LIST_ITEM (U"\\eu \\bseu %euro, \\Lp \\bsLp %%pound sterling%, \\Y= \\bsY= %yen, "
 	"\\fd \\bsfd %florin, \\c/ \\bsc/ %cent")
-LIST_ITEM (L"\\SS \\bsSS %section, \\|| \\bs|| %pilcrow (%paragraph)")
-LIST_ITEM (L"\\co \\bsco %copyright, \\re \\bsre %registered, \\tm \\bstm %trademark")
-LIST_ITEM (L"\\a_ \\bsa_ %%feminine ordinal%, \\o_ \\bso_ %%masculine ordinal%")
-LIST_ITEM (L"\\<< \\bs<< %%left-pointing guillemet%, \\>> \\bs>> %%right-pointing guillemet%")
+LIST_ITEM (U"\\SS \\bsSS %section, \\|| \\bs|| %pilcrow (%paragraph)")
+LIST_ITEM (U"\\co \\bsco %copyright, \\re \\bsre %registered, \\tm \\bstm %trademark")
+LIST_ITEM (U"\\a_ \\bsa_ %%feminine ordinal%, \\o_ \\bso_ %%masculine ordinal%")
+LIST_ITEM (U"\\<< \\bs<< %%left-pointing guillemet%, \\>> \\bs>> %%right-pointing guillemet%")
 
-ENTRY (L"Mathematical symbols")
-LIST_ITEM (L"\\.c \\bs.c %%middle dot%, \\xx \\bsxx %multiplication, \\:- \\bs:- %division, \\/d \\bs/d %%division slash%")
-LIST_ITEM (L"\\dg \\bsdg %degree, \\\'p \\bs\'p %prime (%minute), \\\"p \\bs\\\" p %%double prime% (%second)")
-LIST_ITEM (L"\\-m \\bs-m %minus, \\-- \\bs-- %%en-dash%, \\+- \\bs+- %%plus-minus%")
-LIST_ITEM (L"\\<_ \\bs<_ %%less than or equal to%, \\>_ \\bs>_ %%greater than or equal to%, \\=/ \\bs=/ %%not equal to%")
-LIST_ITEM (L"\\no \\bsno %%logical not%, \\an \\bsan %%logical and%, \\or \\bsor %%logical or%")
-LIST_ITEM (L"\\At \\bsAt %%for all%, \\Er \\bsEr %%there exists%, \\.3 \\bs.3 %therefore")
-LIST_ITEM (L"\\oc \\bsoc %%proportional to%, \\=3 \\bs=3 %%defined as% (or %%congruent modulo%), \\~~ \\bs~~ %%approximately equal to%")
-LIST_ITEM (L"\\Vr \\bsVr %%square root%")
-LIST_ITEM (L"\\<- \\bs<-, \\-> \\bs->, \\<> \\bs<>")
-LIST_ITEM (L"\\<= \\bs<=, \\=> \\bs=>, \\eq \\bseq")
-LIST_ITEM (L"\\^| \\bs\\^ |, \\=~ \\bs=~ %%congruent to%, \\_| \\bs_|")
-LIST_ITEM (L"\\oo \\bsoo %infinity, \\Tt \\bsTt %%up tack% (%%perpendicular to%)")
-LIST_ITEM (L"\\O| \\bsO| %%empty set%, \\ni \\bsni %intersection, \\uu \\bsuu %union, "
+ENTRY (U"Mathematical symbols")
+LIST_ITEM (U"\\.c \\bs.c %%middle dot%, \\xx \\bsxx %multiplication, \\:- \\bs:- %division, \\/d \\bs/d %%division slash%")
+LIST_ITEM (U"\\dg \\bsdg %degree, \\\'p \\bs\'p %prime (%minute), \\\"p \\bs\\\" p %%double prime% (%second)")
+LIST_ITEM (U"\\-m \\bs-m %minus, \\-- \\bs-- %%en-dash%, \\+- \\bs+- %%plus-minus%")
+LIST_ITEM (U"\\<_ \\bs<_ %%less than or equal to%, \\>_ \\bs>_ %%greater than or equal to%, \\=/ \\bs=/ %%not equal to%")
+LIST_ITEM (U"\\no \\bsno %%logical not%, \\an \\bsan %%logical and%, \\or \\bsor %%logical or%")
+LIST_ITEM (U"\\At \\bsAt %%for all%, \\Er \\bsEr %%there exists%, \\.3 \\bs.3 %therefore")
+LIST_ITEM (U"\\oc \\bsoc %%proportional to%, \\=3 \\bs=3 %%defined as% (or %%congruent modulo%), \\~~ \\bs~~ %%approximately equal to%")
+LIST_ITEM (U"\\Vr \\bsVr %%square root%")
+LIST_ITEM (U"\\<- \\bs<-, \\-> \\bs->, \\<> \\bs<>")
+LIST_ITEM (U"\\<= \\bs<=, \\=> \\bs=>, \\eq \\bseq")
+LIST_ITEM (U"\\^| \\bs\\^ |, \\=~ \\bs=~ %%congruent to%, \\_| \\bs_|")
+LIST_ITEM (U"\\oo \\bsoo %infinity, \\Tt \\bsTt %%up tack% (%%perpendicular to%)")
+LIST_ITEM (U"\\O| \\bsO| %%empty set%, \\ni \\bsni %intersection, \\uu \\bsuu %union, "
 	"\\c= \\bsc= %%subset of%, \\e= \\bse= %%element of%")
-LIST_ITEM (L"\\dd \\bsdd %%partial differential%")
-LIST_ITEM (L"\\ox \\bsox %%circled times%, \\o+ \\bso+ %%circled plus%")
-LIST_ITEM (L"\\su \\bssu %summation, \\in \\bsin %integral")
+LIST_ITEM (U"\\dd \\bsdd %%partial differential%")
+LIST_ITEM (U"\\ox \\bsox %%circled times%, \\o+ \\bso+ %%circled plus%")
+LIST_ITEM (U"\\su \\bssu %summation, \\in \\bsin %integral")
 
-ENTRY (L"Greek letters")
-NORMAL (L"To get \\ep\\up\\ro\\et\\ka\\al, you type \\bsep\\bsup\\bsro\\bset\\bska\\bsal.")
-LIST_ITEM (L"\t\\al \\bsal \t\\Al \\bsAl %alpha")
-LIST_ITEM (L"\t\\be \\bsbe \t\\Be \\bsBe %beta")
-LIST_ITEM (L"\t\\ga \\bsga \t\\Ga \\bsGa %gamma")
-LIST_ITEM (L"\t\\de \\bsde \t\\De \\bsDe %delta")
-LIST_ITEM (L"\t\\ep \\bsep \t\\Ep \\bsEp %epsilon")
-LIST_ITEM (L"\t\\ze \\bsze \t\\Ze \\bsZe %zeta")
-LIST_ITEM (L"\t\\et \\bset \t\\Et \\bsEt %eta")
-LIST_ITEM (L"\t\\te \\bste \t\\Te \\bsTe %theta \t\\t2 \\bst2")
-LIST_ITEM (L"\t\\io \\bsio \t\\Io \\bsIo %iota")
-LIST_ITEM (L"\t\\ka \\bska \t\\Ka \\bsKa %kappa")
-LIST_ITEM (L"\t\\la \\bsla \t\\La \\bsLa %lambda")
-LIST_ITEM (L"\t\\mu \\bsmu \t\\Mu \\bsMu %mu")
-LIST_ITEM (L"\t\\nu \\bsnu \t\\Nu \\bsNu %nu")
-LIST_ITEM (L"\t\\xi \\bsxi \t\\Xi \\bsXi %xi")
-LIST_ITEM (L"\t\\on \\bson \t\\On \\bsOn %omicron")
-LIST_ITEM (L"\t\\pi \\bspi \t\\Pi \\bsPi %pi")
-LIST_ITEM (L"\t\\ro \\bsro \t\\Ro \\bsRo %rho")
-LIST_ITEM (L"\t\\si \\bssi \t\\Si \\bsSi %sigma \t\\s2 \\bss2")
-LIST_ITEM (L"\t\\ta \\bsta \t\\Ta \\bsTa %tau")
-LIST_ITEM (L"\t\\up \\bsup \t\\Up \\bsUp %upsilon")
-LIST_ITEM (L"\t\\fi \\bsfi \t\\Fi \\bsFi %phi \t\\f2 \\bsf2")
-LIST_ITEM (L"\t\\ci \\bsci \t\\Ci \\bsCi %chi")
-LIST_ITEM (L"\t\\ps \\bsps \t\\Ps \\bsPs %psi")
-LIST_ITEM (L"\t\\om \\bsom \t\\Om \\bsOm %omega \t\\o2 \\bso2")
+ENTRY (U"Greek letters")
+NORMAL (U"To get \\ep\\up\\ro\\et\\ka\\al, you type \\bsep\\bsup\\bsro\\bset\\bska\\bsal.")
+LIST_ITEM (U"\t\\al \\bsal \t\\Al \\bsAl %alpha")
+LIST_ITEM (U"\t\\be \\bsbe \t\\Be \\bsBe %beta")
+LIST_ITEM (U"\t\\ga \\bsga \t\\Ga \\bsGa %gamma")
+LIST_ITEM (U"\t\\de \\bsde \t\\De \\bsDe %delta")
+LIST_ITEM (U"\t\\ep \\bsep \t\\Ep \\bsEp %epsilon")
+LIST_ITEM (U"\t\\ze \\bsze \t\\Ze \\bsZe %zeta")
+LIST_ITEM (U"\t\\et \\bset \t\\Et \\bsEt %eta")
+LIST_ITEM (U"\t\\te \\bste \t\\Te \\bsTe %theta \t\\t2 \\bst2")
+LIST_ITEM (U"\t\\io \\bsio \t\\Io \\bsIo %iota")
+LIST_ITEM (U"\t\\ka \\bska \t\\Ka \\bsKa %kappa")
+LIST_ITEM (U"\t\\la \\bsla \t\\La \\bsLa %lambda")
+LIST_ITEM (U"\t\\mu \\bsmu \t\\Mu \\bsMu %mu")
+LIST_ITEM (U"\t\\nu \\bsnu \t\\Nu \\bsNu %nu")
+LIST_ITEM (U"\t\\xi \\bsxi \t\\Xi \\bsXi %xi")
+LIST_ITEM (U"\t\\on \\bson \t\\On \\bsOn %omicron")
+LIST_ITEM (U"\t\\pi \\bspi \t\\Pi \\bsPi %pi")
+LIST_ITEM (U"\t\\ro \\bsro \t\\Ro \\bsRo %rho")
+LIST_ITEM (U"\t\\si \\bssi \t\\Si \\bsSi %sigma \t\\s2 \\bss2")
+LIST_ITEM (U"\t\\ta \\bsta \t\\Ta \\bsTa %tau")
+LIST_ITEM (U"\t\\up \\bsup \t\\Up \\bsUp %upsilon")
+LIST_ITEM (U"\t\\fi \\bsfi \t\\Fi \\bsFi %phi \t\\f2 \\bsf2")
+LIST_ITEM (U"\t\\ci \\bsci \t\\Ci \\bsCi %chi")
+LIST_ITEM (U"\t\\ps \\bsps \t\\Ps \\bsPs %psi")
+LIST_ITEM (U"\t\\om \\bsom \t\\Om \\bsOm %omega \t\\o2 \\bso2")
 
-ENTRY (L"Hebrew letters")
-NORMAL (L"To get an alef, you type \\bs?+. "
+ENTRY (U"Hebrew letters")
+NORMAL (U"To get an alef, you type \\bs?+. "
 	"On Windows, you have to install international support to get the left-to-right order correct.")
-LIST_ITEM (L"\t\\?+ \\bs?+\t%alef")
-LIST_ITEM (L"\t\\B+ \\bsB+\t%bet")
-LIST_ITEM (L"\t\\G+ \\bsG+\t%gimel")
-LIST_ITEM (L"\t\\D+ \\bsD+\t%dalet")
-LIST_ITEM (L"\t\\H+ \\bsH+\t%he")
-LIST_ITEM (L"\t\\V+ \\bsV+\t%vav")
-LIST_ITEM (L"\t\\Z+ \\bsZ+\t%zayin")
-LIST_ITEM (L"\t\\X+ \\bsX+\t%het")
-LIST_ITEM (L"\t\\Y+ \\bsY+\t%tet")
-LIST_ITEM (L"\t\\J+ \\bsJ+\t%yod")
-LIST_ITEM (L"\t\\K+ \\bsK+\t%kaf\t\\K% \\bsK\\% ")
-LIST_ITEM (L"\t\\L+ \\bsL+\t%lamed")
-LIST_ITEM (L"\t\\M+ \\bsM+\t%mem\t\\M% \\bsM\\% ")
-LIST_ITEM (L"\t\\N+ \\bsN+\t%nun\t\\N% \\bsN\\% ")
-LIST_ITEM (L"\t\\S+ \\bsS+\t%samekh")
-LIST_ITEM (L"\t\\9+ \\bs9+\t%ayin")
-LIST_ITEM (L"\t\\P+ \\bsP+\t%pe\t\\P% \\bsP\\% ")
-LIST_ITEM (L"\t\\C+ \\bsC+\t%tsadi\t\\C% \\bsC\\% ")
-LIST_ITEM (L"\t\\Q+ \\bsQ+\t%qof")
-LIST_ITEM (L"\t\\R+ \\bsR+\t%resh")
-LIST_ITEM (L"\t\\W+ \\bsW+\t%shin")
-LIST_ITEM (L"\t\\T+ \\bsT+\t%tav")
-LIST_ITEM (L"\t\\?+\\hI \\bs?+\\bshI\t%hiriq")
-LIST_ITEM (L"\t\\?+\\sE \\bs?+\\bssE\t%segol\t\\?+\\cE \\bs?+\\bscE\t%tsere")
-LIST_ITEM (L"\t\\?+\\qA \\bs?+\\bsqA\t%qamats\t\\?+\\pA \\bs?+\\bspA\t%patah")
-LIST_ITEM (L"\t\\?+\\hO \\bs?+\\bshO\t%holam")
-LIST_ITEM (L"\t\\?+\\qU \\bs?+\\bsqU\t%qubuts")
-LIST_ITEM (L"\t\\dq \\bsdq\t%dagesh or %maliq")
-NORMAL (L"Combinations:")
-LIST_ITEM (L"\t\\vO \\bsvO\t%%vav holam")
-LIST_ITEM (L"\t\\sU \\bssU\t%shuruq")
+LIST_ITEM (U"\t\\?+ \\bs?+\t%alef")
+LIST_ITEM (U"\t\\B+ \\bsB+\t%bet")
+LIST_ITEM (U"\t\\G+ \\bsG+\t%gimel")
+LIST_ITEM (U"\t\\D+ \\bsD+\t%dalet")
+LIST_ITEM (U"\t\\H+ \\bsH+\t%he")
+LIST_ITEM (U"\t\\V+ \\bsV+\t%vav")
+LIST_ITEM (U"\t\\Z+ \\bsZ+\t%zayin")
+LIST_ITEM (U"\t\\X+ \\bsX+\t%het")
+LIST_ITEM (U"\t\\Y+ \\bsY+\t%tet")
+LIST_ITEM (U"\t\\J+ \\bsJ+\t%yod")
+LIST_ITEM (U"\t\\K+ \\bsK+\t%kaf\t\\K% \\bsK\\% ")
+LIST_ITEM (U"\t\\L+ \\bsL+\t%lamed")
+LIST_ITEM (U"\t\\M+ \\bsM+\t%mem\t\\M% \\bsM\\% ")
+LIST_ITEM (U"\t\\N+ \\bsN+\t%nun\t\\N% \\bsN\\% ")
+LIST_ITEM (U"\t\\S+ \\bsS+\t%samekh")
+LIST_ITEM (U"\t\\9+ \\bs9+\t%ayin")
+LIST_ITEM (U"\t\\P+ \\bsP+\t%pe\t\\P% \\bsP\\% ")
+LIST_ITEM (U"\t\\C+ \\bsC+\t%tsadi\t\\C% \\bsC\\% ")
+LIST_ITEM (U"\t\\Q+ \\bsQ+\t%qof")
+LIST_ITEM (U"\t\\R+ \\bsR+\t%resh")
+LIST_ITEM (U"\t\\W+ \\bsW+\t%shin")
+LIST_ITEM (U"\t\\T+ \\bsT+\t%tav")
+LIST_ITEM (U"\t\\?+\\hI \\bs?+\\bshI\t%hiriq")
+LIST_ITEM (U"\t\\?+\\sE \\bs?+\\bssE\t%segol\t\\?+\\cE \\bs?+\\bscE\t%tsere")
+LIST_ITEM (U"\t\\?+\\qA \\bs?+\\bsqA\t%qamats\t\\?+\\pA \\bs?+\\bspA\t%patah")
+LIST_ITEM (U"\t\\?+\\hO \\bs?+\\bshO\t%holam")
+LIST_ITEM (U"\t\\?+\\qU \\bs?+\\bsqU\t%qubuts")
+LIST_ITEM (U"\t\\dq \\bsdq\t%dagesh or %maliq")
+NORMAL (U"Combinations:")
+LIST_ITEM (U"\t\\vO \\bsvO\t%%vav holam")
+LIST_ITEM (U"\t\\sU \\bssU\t%shuruq")
 
-ENTRY (L"Phonetic symbols")
-NORMAL (L"See @@Phonetic symbols@")
+ENTRY (U"Phonetic symbols")
+NORMAL (U"See @@Phonetic symbols@")
 
-ENTRY (L"Miscellaneous")
-LIST_ITEM (L"\\bs \\bsbs %backslash")
-LIST_ITEM (L"\\bu \\bsbu %bullet")
-LIST_ITEM (L"\\cl \\bscl (%club), \\di \\bsdi (%diamond), \\he \\bshe (%heart), \\sp \\bssp (%spade)")
-LIST_ITEM (L"\\pf \\bspf %%pointing finger%, \\f5 \\bsf5 %%flower-five%")
+ENTRY (U"Miscellaneous")
+LIST_ITEM (U"\\bs \\bsbs %backslash")
+LIST_ITEM (U"\\bu \\bsbu %bullet")
+LIST_ITEM (U"\\cl \\bscl (%club), \\di \\bsdi (%diamond), \\he \\bshe (%heart), \\sp \\bssp (%spade)")
+LIST_ITEM (U"\\pf \\bspf %%pointing finger%, \\f5 \\bsf5 %%flower-five%")
 
-ENTRY (L"See also")
-NORMAL (L"@@Text styles@")
+ENTRY (U"See also")
+NORMAL (U"@@Text styles@")
 MAN_END
 
-MAN_BEGIN (L"Text styles", L"ppgb", 19961012)
-INTRO (L"When drawing text into the @@Picture window@ or into an editor, "
+MAN_BEGIN (U"Text styles", U"ppgb", 19961012)
+INTRO (U"When drawing text into the @@Picture window@ or into an editor, "
 	"you can use text styles other than regular Roman.")
-ENTRY (L"Italic, bold, superscript, subscript")
-NORMAL (L"With the following symbols, you introduce stretches of text drawn in special styles:")
-LIST_ITEM (L"\\% : the following letter will be italic.")
-LIST_ITEM (L"\\# : the following letter will be bold.")
-LIST_ITEM (L"\\# \\% : the following letter will be bold-italic.")
-LIST_ITEM (L"\\^ : the following letter will be superscript: \\% m\\% c\\^ 2 gives %mc^2.")
-LIST_ITEM (L"\\_ : the following letter will be subscript. Example: %F__0_ is typed as \\% F_0.")
-LIST_ITEM (L"\\% \\% : the following letters will be italic, until the following \\% :")
-LIST_ITEM (L"    $$Now \\% \\% you\\%  try$   gives:   Now %%you% try.")
-LIST_ITEM (L"The same goes for \\# \\# , \\^ \\^ , and \\_ \\_ .")
-LIST_ITEM (L"\\bss{...}: small:")
-LIST_ITEM (L"    $$W\\bss{ARP}$   gives:   W\\s{ARP}")
-NORMAL (L"To draw a \\% , \\# , \\^ , or \\_  symbol, you type \"$$\\bs\\%  $\", "
+ENTRY (U"Italic, bold, superscript, subscript")
+NORMAL (U"With the following symbols, you introduce stretches of text drawn in special styles:")
+LIST_ITEM (U"\\% : the following letter will be italic.")
+LIST_ITEM (U"\\# : the following letter will be bold.")
+LIST_ITEM (U"\\# \\% : the following letter will be bold-italic.")
+LIST_ITEM (U"\\^ : the following letter will be superscript: \\% m\\% c\\^ 2 gives %mc^2.")
+LIST_ITEM (U"\\_ : the following letter will be subscript. Example: %F__0_ is typed as \\% F_0.")
+LIST_ITEM (U"\\% \\% : the following letters will be italic, until the following \\% :")
+LIST_ITEM (U"    $$Now \\% \\% you\\%  try$   gives:   Now %%you% try.")
+LIST_ITEM (U"The same goes for \\# \\# , \\^ \\^ , and \\_ \\_ .")
+LIST_ITEM (U"\\bss{...}: small:")
+LIST_ITEM (U"    $$W\\bss{ARP}$   gives:   W\\s{ARP}")
+NORMAL (U"To draw a \\% , \\# , \\^ , or \\_  symbol, you type \"$$\\bs\\%  $\", "
 	"\"$$\\bs\\#  $\", \"$$\\bs\\^  $\", or \"$$\\bs\\_  $\": a backslash, the symbol, and a space.")
-NORMAL (L"On Xwindows machines, the font `Symbol' will never look bold or italic, "
+NORMAL (U"On Xwindows machines, the font `Symbol' will never look bold or italic, "
 	"but it will be printed correctly.")
-ENTRY (L"See also")
-NORMAL (L"@@Special symbols@")
+ENTRY (U"See also")
+NORMAL (U"@@Special symbols@")
 MAN_END
 
-MAN_BEGIN (L"Phonetic symbols", L"ppgb", 20090804)
-NORMAL (L"To draw phonetic symbols in the @@Picture window@ or in the @TextGridEditor, "
+MAN_BEGIN (U"Phonetic symbols", U"ppgb", 20090804)
+NORMAL (U"To draw phonetic symbols in the @@Picture window@ or in the @TextGridEditor, "
 	"make sure that you have installed the Charis SIL and/or Doulos SIL font, for instance from www.sil.org or from www.praat.org. "
 	"You can either type the symbols directly (if your computer has an input method for them), or use backslash sequences as described in:")
-LIST_ITEM (L"\\bu @@Phonetic symbols: consonants")
-LIST_ITEM (L"\\bu @@Phonetic symbols: vowels")
-LIST_ITEM (L"\\bu @@Phonetic symbols: diacritics")
+LIST_ITEM (U"\\bu @@Phonetic symbols: consonants")
+LIST_ITEM (U"\\bu @@Phonetic symbols: vowels")
+LIST_ITEM (U"\\bu @@Phonetic symbols: diacritics")
 MAN_END
 
-MAN_BEGIN (L"Phonetic symbols: consonants", L"ppgb", 20090804)
-NORMAL (L"To draw phonetic symbols for consonants in the @@Picture window@ or in the @TextGridEditor, "
+MAN_BEGIN (U"Phonetic symbols: consonants", U"ppgb", 20090804)
+NORMAL (U"To draw phonetic symbols for consonants in the @@Picture window@ or in the @TextGridEditor, "
 	"make sure that you have installed the Charis SIL and/or Doulos SIL font, for instance from www.sil.org or from www.praat.org. "
 	"You can either type the symbols directly (if your computer has an input method for them), or use the backslash sequences in the following table.")
 PICTURE (6.0, 7.0, draw_IPA_consonant_chart)
-NORMAL (L"Other consonant symbols:")
-LIST_ITEM (L"\\l~ \\bsl~ (%%l with tilde%): velarized %l")
-LIST_ITEM (L"\\hj \\bshj (%%heng with hooktop%): the Swedish rounded post-alveolar & velar fricative")
-ENTRY (L"How to remember the codes")
-NORMAL (L"For most of the codes, the first letter tells you the most similar letter of the English alphabet. "
+NORMAL (U"Other consonant symbols:")
+LIST_ITEM (U"\\l~ \\bsl~ (%%l with tilde%): velarized %l")
+LIST_ITEM (U"\\hj \\bshj (%%heng with hooktop%): the Swedish rounded post-alveolar & velar fricative")
+ENTRY (U"How to remember the codes")
+NORMAL (U"For most of the codes, the first letter tells you the most similar letter of the English alphabet. "
 	"The second letter can be %t (%turned), %c (%capital or %curled), %s (%script), - (%barred), %l (%%with leg%), "
 	"%i (%inverted), or %j (%%left tail%). Some phonetic symbols are similar to Greek letters but have special "
 	"phonetic (%f) versions with serifs (\\ff, \\bf, \\gf) or are otherwise slightly different (\\tf, \\cf). "
@@ -314,126 +314,126 @@ NORMAL (L"For most of the codes, the first letter tells you the most similar let
 	"The code for \\fh is an abbreviation for %fishhook.")
 MAN_END
 
-MAN_BEGIN (L"Phonetic symbols: diacritics", L"ppgb", 20130327)
-NORMAL (L"To draw phonetic diacritical symbols in the @@Picture window@ or in the @TextGridEditor, "
+MAN_BEGIN (U"Phonetic symbols: diacritics", U"ppgb", 20130327)
+NORMAL (U"To draw phonetic diacritical symbols in the @@Picture window@ or in the @TextGridEditor, "
 	"make sure that you have installed the Charis SIL and/or Doulos SIL font, for instance from www.sil.org or from www.praat.org. "
 	"You can either type the symbols directly (if your computer has an input method for them), or use the backslash sequences in the following list.")
-NORMAL (L"Understrikes:")
-LIST_ITEM (L"n\\|v n\\bs|v (%%combining vertical line below%): syllabic consonant")
-LIST_ITEM (L"b\\0v b\\bs0v (%%combining ring below%): voiceless (e.g. lenis voiceless plosive, voiceless nasal or approximant)")
-LIST_ITEM (L"o\\Tv o\\bsTv (%%combining down tack below%, %lowering): lowered vowel; or turns a fricative into an approximant")
-LIST_ITEM (L"o\\T^ o\\bsT\\^  (%%combining up tack below%, %raising): raised vowel; or turns an approximant into a fricative")
-LIST_ITEM (L"o\\T( o\\bsT( (%%combining left tack below%, %atr): advanced tongue root")
-LIST_ITEM (L"o\\T) o\\bsT) (%%combining right tack below%, %rtr): retracted tongue root")
-LIST_ITEM (L"e\\-v e\\bs-v (%%combining macron below%): backed")
-LIST_ITEM (L"o\\+v o\\bs+v (%%combining plus sign below%): fronted")
-LIST_ITEM (L"o\\:v o\\bs:v (%%combining diaeresis below%): breathy voice")
-LIST_ITEM (L"o\\~v o\\bs~v (%%combining tilde below%): creaky voice")
-LIST_ITEM (L"d\\Nv d\\bsNv (%%combining bridge below%): dental (as opposed to alveolar)")
-LIST_ITEM (L"d\\Uv d\\bsUv (%%combining inverted bridge below%): apical")
-LIST_ITEM (L"d\\Dv d\\bsDv (%%combining square below%): laminal")
-LIST_ITEM (L"u\\nv u\\bsnv (%%combining inverted breve below%): nonsyllabic")
-LIST_ITEM (L"e\\3v e\\bs3v (%%combining right half ring below%): slightly rounded")
-LIST_ITEM (L"u\\cv u\\bscv (%%combining left half ring below%): slightly unrounded")
-NORMAL (L"Overstrikes:")
-LIST_ITEM (L"\\gf\\0^ \\bsgf\\bs0\\^  (%%combining ring above%): voiceless")
-LIST_ITEM (L"\\ef\\\'^ \\bsef\\bs\'\\^  (%%combining acute accent%): high tone")
-LIST_ITEM (L"\\ef\\`^ \\bsef\\bs`\\^  (%%combining grave accent%): low tone")
-LIST_ITEM (L"\\ef\\-^ \\bsef\\bs-\\^  (%%combining macron%): mid tone (or so)")
-LIST_ITEM (L"\\ef\\~^ \\bsef\\bs~\\^  (%%combining tilde%): nasalized")
-LIST_ITEM (L"\\ef\\v^ \\bsef\\bsv\\^  (%%combining caron%, %%háček%, %wedge): rising tone")   // UNITEXT_LATIN_SMALL_LETTER_C_WITH_CARON
-LIST_ITEM (L"\\ef\\^^ \\bsef\\bs\\^ \\^  (%%combining circumflex accent%): falling tone")
-LIST_ITEM (L"o\\:^ o\\bs:\\^  (%%combining diaeresis%): centralized")
-LIST_ITEM (L"\\ef\\N^ \\bsef\\bsN\\^  (%%combining breve%): short")
-LIST_ITEM (L"k\\lip t\\lis k\\bslip (%%combining double inverted breve%, %ligature): simultaneous articulation, or single segment")
-NORMAL (L"In line:")
-LIST_ITEM (L"\\:f \\bs:f the phonetic length sign")
-LIST_ITEM (L"\\.f \\bs.f half length")
-LIST_ITEM (L"\\\'1 \\bs\'1 primary stress")
-LIST_ITEM (L"\\\'2 \\bs\'2 secondary stress")
-LIST_ITEM (L"\\|f \\bs|f the phonetic stroke")
-LIST_ITEM (L"t\\cn t\\bscn (%%combining left angle above%, %corner): unreleased plosive")
-LIST_ITEM (L"\\er\\hr \\bser\\bshr (%%combining rhotic hook%): rhotacized vowel")
-NORMAL (L"Not available in EPS files (i.e. only publishable with copy-paste or with PDF files):")
-LIST_ITEM (L"t\\^h t\\bs\\^ h aspiration")
-LIST_ITEM (L"b\\^H b\\bs\\^ H voiced aspiration (breathiness)")
-LIST_ITEM (L"t\\^j t\\bs\\^ j palatalization")
-LIST_ITEM (L"t\\^g t\\bs\\^ g, t\\^M t\\bs\\^ M, t\\^G t\\bs\\^ G velarization")
-LIST_ITEM (L"k\\^w k\\bs\\^ w rounding")
-LIST_ITEM (L"t\\^Y t\\bs\\^ Y rounding with palatalization")
-LIST_ITEM (L"a\\^? a\\bs\\^ ? glottalization")
-LIST_ITEM (L"t\\^9 t\\bs\\^ 9 pharyngealization")
-LIST_ITEM (L"t\\^l t\\bs\\^ l lateral release")
-LIST_ITEM (L"t\\^n t\\bs\\^ n, p\\^m p\\bs\\^ m, k\\^N k\\bs\\^ N nasal release")
-LIST_ITEM (L"t\\^s t\\bs\\^ s, k\\^x k\\bs\\^ x, p\\^f p\\bs\\^ f affrication")
-LIST_ITEM (L"\\^y \\bs\\^ y (palatalization in a deprecated American notation)")
-LIST_ITEM (L"a\\_ub a\\bs\\_ ub undertie (liaison, if spaces don't mean breaks in your transcription)")
-LIST_ITEM (L"\\ts \\bsts t\\--s ligature")
-LIST_ITEM (L"\\tS \\bstS tesh ligature")
-LIST_ITEM (L"p\\ap p\\bsap apostrophe (for ejectives)")
+NORMAL (U"Understrikes:")
+LIST_ITEM (U"n\\|v n\\bs|v (%%combining vertical line below%): syllabic consonant")
+LIST_ITEM (U"b\\0v b\\bs0v (%%combining ring below%): voiceless (e.g. lenis voiceless plosive, voiceless nasal or approximant)")
+LIST_ITEM (U"o\\Tv o\\bsTv (%%combining down tack below%, %lowering): lowered vowel; or turns a fricative into an approximant")
+LIST_ITEM (U"o\\T^ o\\bsT\\^  (%%combining up tack below%, %raising): raised vowel; or turns an approximant into a fricative")
+LIST_ITEM (U"o\\T( o\\bsT( (%%combining left tack below%, %atr): advanced tongue root")
+LIST_ITEM (U"o\\T) o\\bsT) (%%combining right tack below%, %rtr): retracted tongue root")
+LIST_ITEM (U"e\\-v e\\bs-v (%%combining macron below%): backed")
+LIST_ITEM (U"o\\+v o\\bs+v (%%combining plus sign below%): fronted")
+LIST_ITEM (U"o\\:v o\\bs:v (%%combining diaeresis below%): breathy voice")
+LIST_ITEM (U"o\\~v o\\bs~v (%%combining tilde below%): creaky voice")
+LIST_ITEM (U"d\\Nv d\\bsNv (%%combining bridge below%): dental (as opposed to alveolar)")
+LIST_ITEM (U"d\\Uv d\\bsUv (%%combining inverted bridge below%): apical")
+LIST_ITEM (U"d\\Dv d\\bsDv (%%combining square below%): laminal")
+LIST_ITEM (U"u\\nv u\\bsnv (%%combining inverted breve below%): nonsyllabic")
+LIST_ITEM (U"e\\3v e\\bs3v (%%combining right half ring below%): slightly rounded")
+LIST_ITEM (U"u\\cv u\\bscv (%%combining left half ring below%): slightly unrounded")
+NORMAL (U"Overstrikes:")
+LIST_ITEM (U"\\gf\\0^ \\bsgf\\bs0\\^  (%%combining ring above%): voiceless")
+LIST_ITEM (U"\\ef\\\'^ \\bsef\\bs\'\\^  (%%combining acute accent%): high tone")
+LIST_ITEM (U"\\ef\\`^ \\bsef\\bs`\\^  (%%combining grave accent%): low tone")
+LIST_ITEM (U"\\ef\\-^ \\bsef\\bs-\\^  (%%combining macron%): mid tone (or so)")
+LIST_ITEM (U"\\ef\\~^ \\bsef\\bs~\\^  (%%combining tilde%): nasalized")
+LIST_ITEM (U"\\ef\\v^ \\bsef\\bsv\\^  (%%combining caron%, %%háček%, %wedge): rising tone")   // UNITEXT_LATIN_SMALL_LETTER_C_WITH_CARON
+LIST_ITEM (U"\\ef\\^^ \\bsef\\bs\\^ \\^  (%%combining circumflex accent%): falling tone")
+LIST_ITEM (U"o\\:^ o\\bs:\\^  (%%combining diaeresis%): centralized")
+LIST_ITEM (U"\\ef\\N^ \\bsef\\bsN\\^  (%%combining breve%): short")
+LIST_ITEM (U"k\\lip t\\lis k\\bslip (%%combining double inverted breve%, %ligature): simultaneous articulation, or single segment")
+NORMAL (U"In line:")
+LIST_ITEM (U"\\:f \\bs:f the phonetic length sign")
+LIST_ITEM (U"\\.f \\bs.f half length")
+LIST_ITEM (U"\\\'1 \\bs\'1 primary stress")
+LIST_ITEM (U"\\\'2 \\bs\'2 secondary stress")
+LIST_ITEM (U"\\|f \\bs|f the phonetic stroke")
+LIST_ITEM (U"t\\cn t\\bscn (%%combining left angle above%, %corner): unreleased plosive")
+LIST_ITEM (U"\\er\\hr \\bser\\bshr (%%combining rhotic hook%): rhotacized vowel")
+NORMAL (U"Not available in EPS files (i.e. only publishable with copy-paste or with PDF files):")
+LIST_ITEM (U"t\\^h t\\bs\\^ h aspiration")
+LIST_ITEM (U"b\\^H b\\bs\\^ H voiced aspiration (breathiness)")
+LIST_ITEM (U"t\\^j t\\bs\\^ j palatalization")
+LIST_ITEM (U"t\\^g t\\bs\\^ g, t\\^M t\\bs\\^ M, t\\^G t\\bs\\^ G velarization")
+LIST_ITEM (U"k\\^w k\\bs\\^ w rounding")
+LIST_ITEM (U"t\\^Y t\\bs\\^ Y rounding with palatalization")
+LIST_ITEM (U"a\\^? a\\bs\\^ ? glottalization")
+LIST_ITEM (U"t\\^9 t\\bs\\^ 9 pharyngealization")
+LIST_ITEM (U"t\\^l t\\bs\\^ l lateral release")
+LIST_ITEM (U"t\\^n t\\bs\\^ n, p\\^m p\\bs\\^ m, k\\^N k\\bs\\^ N nasal release")
+LIST_ITEM (U"t\\^s t\\bs\\^ s, k\\^x k\\bs\\^ x, p\\^f p\\bs\\^ f affrication")
+LIST_ITEM (U"\\^y \\bs\\^ y (palatalization in a deprecated American notation)")
+LIST_ITEM (U"a\\_ub a\\bs\\_ ub undertie (liaison, if spaces don't mean breaks in your transcription)")
+LIST_ITEM (U"\\ts \\bsts t\\--s ligature")
+LIST_ITEM (U"\\tS \\bstS tesh ligature")
+LIST_ITEM (U"p\\ap p\\bsap apostrophe (for ejectives)")
 MAN_END
 
-MAN_BEGIN (L"Phonetic symbols: vowels", L"ppgb", 20090804)
-NORMAL (L"To draw phonetic symbols for vowels in the @@Picture window@ or in the @TextGridEditor, "
+MAN_BEGIN (U"Phonetic symbols: vowels", U"ppgb", 20090804)
+NORMAL (U"To draw phonetic symbols for vowels in the @@Picture window@ or in the @TextGridEditor, "
 	"make sure that you have installed the Charis SIL and/or Doulos SIL font, for instance from www.sil.org or from www.praat.org. "
 	"You can either type the symbols directly (if your computer has an input method for them), or use the backslash sequences in the following table.")
 PICTURE (6.0, 5.0, draw_IPA_vowel_chart)
-NORMAL (L"Other vowel symbols are:")
-LIST_ITEM (L"\\sr \\bssr (%%schwa with right hook%): rhotacized schwa")
-NORMAL (L"Not available in EPS files (i.e. only publishable with copy-paste or with PDF files):")
-LIST_ITEM (L"\\id \\bsid syllabic dental approximant")
-LIST_ITEM (L"\\ir \\bsir syllabic retroflex (or apico-postalveolar) approximant")
-ENTRY (L"How to remember the codes")
-NORMAL (L"For most of the codes, the first letter tells you the most similar letter of the English alphabet. "
+NORMAL (U"Other vowel symbols are:")
+LIST_ITEM (U"\\sr \\bssr (%%schwa with right hook%): rhotacized schwa")
+NORMAL (U"Not available in EPS files (i.e. only publishable with copy-paste or with PDF files):")
+LIST_ITEM (U"\\id \\bsid syllabic dental approximant")
+LIST_ITEM (U"\\ir \\bsir syllabic retroflex (or apico-postalveolar) approximant")
+ENTRY (U"How to remember the codes")
+NORMAL (U"For most of the codes, the first letter tells you the most similar letter of the English alphabet. "
 	"The second letter can be %t (%turned), %c (%capital), %s (%script), %r (%reversed), - (%barred or %retracted), or / (%slashed). "
 	"One symbol (\\ef) is a phonetic version of a Greek letter. "
 	"The codes for \\sw, \\rh, \\hs and \\kb are abbreviations for %schwa, %%ram's horn%, %horseshoe, and %%kidney bean%.")
 MAN_END
 
-MAN_BEGIN (L"Axes...", L"ppgb", 20140107)
-INTRO (L"One of the commands in the #Margins and #World menus of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To view and change the current world coordinates of the horizontal and vertical axes.")
-ENTRY (L"Usage")
-NORMAL (L"The axes are normally changed by every drawing operation in the dynamic menu, "
+MAN_BEGIN (U"Axes...", U"ppgb", 20140107)
+INTRO (U"One of the commands in the #Margins and #World menus of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To view and change the current world coordinates of the horizontal and vertical axes.")
+ENTRY (U"Usage")
+NORMAL (U"The axes are normally changed by every drawing operation in the dynamic menu, "
 	"i.e., by object-specific drawing commands with titles like ##Draw...# and ##Paint...# "
 	"(the drawing commands in the Picture window, like ##Paint rectangle...#, do not change the axes).")
-NORMAL (L"You would use the ##Axes...# command if your data are not in an object.")
-ENTRY (L"Example")
-NORMAL (L"The following script would draw a person's vowel triangle:")
-CODE (L"\\#  Put F1 (between 300 and 800 Hz) along the horizontal axis,")
-CODE (L"\\#  and F2 (between 600 and 3600 Hz) along the vertical axis.")
-CODE (L"##Axes:# 300, 800, 600, 3600")
-CODE (L"\\#  Draw a rectangle inside the current viewport (selected area),")
-CODE (L"\\#  with text in the margins, and tick marks in steps of 100 Hz along the F1 axis,")
-CODE (L"\\#  and in steps of 200 Hz along the F2 axis.")
-CODE (L"Draw inner box")
-CODE (L"Text top: \"no\", \"Daniël's Dutch vowel triangle\"")
-CODE (L"Text bottom: \"yes\", \"\\% F_1 (Hz)\"")
-CODE (L"Text left: \"yes\", \"\\% F_2 (Hz)\"")
-CODE (L"Marks bottom every: 1, 100, \"yes\", \"yes\", \"yes\", \"\"")
-CODE (L"Marks left every: 1, 200, \"yes\", \"yes\", \"yes\", \"\"")
-CODE (L"\\#  Draw large phonetic symbols at the vowel points.")
-CODE (L"Text special: 340, \"Centre\", 688, \"Half\", \"Times\", 24, \"0\", \"u\"")
-CODE (L"Text special: 481, \"Centre\", 1195, \"Half\", \"Times\", 24, \"0\", \"ø\"")
-CODE (L"\\#  Etcetera")
-NORMAL (L"This example would draw the texts \"Daniël's Dutch vowel triangle\", "
+NORMAL (U"You would use the ##Axes...# command if your data are not in an object.")
+ENTRY (U"Example")
+NORMAL (U"The following script would draw a person's vowel triangle:")
+CODE (U"\\#  Put F1 (between 300 and 800 Hz) along the horizontal axis,")
+CODE (U"\\#  and F2 (between 600 and 3600 Hz) along the vertical axis.")
+CODE (U"##Axes:# 300, 800, 600, 3600")
+CODE (U"\\#  Draw a rectangle inside the current viewport (selected area),")
+CODE (U"\\#  with text in the margins, and tick marks in steps of 100 Hz along the F1 axis,")
+CODE (U"\\#  and in steps of 200 Hz along the F2 axis.")
+CODE (U"Draw inner box")
+CODE (U"Text top: \"no\", \"Daniël's Dutch vowel triangle\"")
+CODE (U"Text bottom: \"yes\", \"\\% F_1 (Hz)\"")
+CODE (U"Text left: \"yes\", \"\\% F_2 (Hz)\"")
+CODE (U"Marks bottom every: 1, 100, \"yes\", \"yes\", \"yes\", \"\"")
+CODE (U"Marks left every: 1, 200, \"yes\", \"yes\", \"yes\", \"\"")
+CODE (U"\\#  Draw large phonetic symbols at the vowel points.")
+CODE (U"Text special: 340, \"Centre\", 688, \"Half\", \"Times\", 24, \"0\", \"u\"")
+CODE (U"Text special: 481, \"Centre\", 1195, \"Half\", \"Times\", 24, \"0\", \"ø\"")
+CODE (U"\\#  Etcetera")
+NORMAL (U"This example would draw the texts \"Daniël's Dutch vowel triangle\", "
 	"\"%F__1_ (Hz)\", and \"%F__2_ (Hz)\" in the margins, "
 	"and the texts \"u\" and \"ø\" at the appropriate positions inside the drawing area.")
 MAN_END
 
-MAN_BEGIN (L"Copy to clipboard", L"ppgb", 20120430)   /* Not Unix. */
-INTRO (L"A command in the File menu of the @@Picture window@ on Windows and Macintosh.")
-NORMAL (L"It copies the selected part of the picture to the clipboard. "
+MAN_BEGIN (U"Copy to clipboard", U"ppgb", 20120430)   /* Not Unix. */
+INTRO (U"A command in the File menu of the @@Picture window@ on Windows and Macintosh.")
+NORMAL (U"It copies the selected part of the picture to the clipboard. "
 	"You can then #Paste it into any program that knows how to display pictures.")
-ENTRY (L"Behaviour")
-NORMAL (L"Though all the picture data will be written to the clipboard, "
+ENTRY (U"Behaviour")
+NORMAL (U"Though all the picture data will be written to the clipboard, "
 	"only the part that corresponds to the selected part of the Picture window (the %viewport) will be visible.")
-ENTRY (L"Usage")
-NORMAL (L"On Windows, if you have a PostScript printer, you may want to use @@Save as EPS file...@ instead (experiment with the results after converting to PDF or printing). "
+ENTRY (U"Usage")
+NORMAL (U"On Windows, if you have a PostScript printer, you may want to use @@Save as EPS file...@ instead (experiment with the results after converting to PDF or printing). "
 	"If the picture is too large, e.g. a spectrogram that does not seem to fit into the clipboard, "
 	"you can try @@Save as Windows metafile...@ instead.")
-NORMAL (L"On the Mac, the picture will be put on the clipboard in PDF format, "
+NORMAL (U"On the Mac, the picture will be put on the clipboard in PDF format, "
 	"which is recognized by programs that know how to handle PDF pictures, such as Microsoft^\\re Word\\tm 2008; "
 	"the quality of the picture will be exactly as good as when you use @@Save as PDF file...@ and read in the resulting PDF file. "
 	"Please realize that Word will convert the PDF picture to a mediocre 300-dpi bitmap if you save the document as a ##.doc# file; "
@@ -443,121 +443,121 @@ NORMAL (L"On the Mac, the picture will be put on the clipboard in PDF format, "
 	"use @@Save as EPS file...@ instead.")
 MAN_END
 
-MAN_BEGIN (L"Draw inner box", L"ppgb", 19970330)
-INTRO (L"One of the commands in the #Margins menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To draw a rectangle inside the drawing area, "
+MAN_BEGIN (U"Draw inner box", U"ppgb", 19970330)
+INTRO (U"One of the commands in the #Margins menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To draw a rectangle inside the drawing area, "
 	"leaving @margins on all four sides for drawing text and marks.")
-ENTRY (L"Behaviour")
-NORMAL (L"The widths of the margins depend on the current font size.")
+ENTRY (U"Behaviour")
+NORMAL (U"The widths of the margins depend on the current font size.")
 MAN_END
 
-MAN_BEGIN (L"Encapsulated PostScript", L"ppgb", 20110129)
-INTRO (L"a kind of PostScript file that can easily be imported into word processors and drawing programs. "
+MAN_BEGIN (U"Encapsulated PostScript", U"ppgb", 20110129)
+INTRO (U"a kind of PostScript file that can easily be imported into word processors and drawing programs. "
 	"In Praat, you can create an Encapsulated PostScript (EPS) file by choosing @@Save as EPS file... at .")
 MAN_END
 
-MAN_BEGIN (L"Erase all", L"ppgb", 19980825)
-INTRO (L"A command in the #Edit menu of the @@Picture window at .")
-NORMAL (L"It erases all your drawings.")
+MAN_BEGIN (U"Erase all", U"ppgb", 19980825)
+INTRO (U"A command in the #Edit menu of the @@Picture window at .")
+NORMAL (U"It erases all your drawings.")
 MAN_END
 
-MAN_BEGIN (L"Font menu", L"ppgb", 20101125)
-INTRO (L"One of the menus of the @@Picture window at .")
-NORMAL (L"It allows you to choose the font of the text "
+MAN_BEGIN (U"Font menu", U"ppgb", 20101125)
+INTRO (U"One of the menus of the @@Picture window at .")
+NORMAL (U"It allows you to choose the font of the text "
 	"to be used in subsequent drawing, as well as its size (character height).")
-ENTRY (L"Sizes")
-NORMAL (L"You can choose any of the sizes 10, 12, 14, 18, or 24 directly from this menu, "
+ENTRY (U"Sizes")
+NORMAL (U"You can choose any of the sizes 10, 12, 14, 18, or 24 directly from this menu, "
 	"or fill in any other size in the ##Font size...# form.")
-NORMAL (L"The widths of the margins depend on the current font size, "
+NORMAL (U"The widths of the margins depend on the current font size, "
 	"so if you want to change the font size, "
 	"do so before making your drawing.")
-ENTRY (L"Fonts")
-NORMAL (L"With these commands, you set the font in which subsequent text will be drawn: "
+ENTRY (U"Fonts")
+NORMAL (U"With these commands, you set the font in which subsequent text will be drawn: "
 	"Times, Helvetica, Palatino, or Courier.")
-NORMAL (L"You can mix the Symbol and IPA alphabets with the normal Roman alphabets "
+NORMAL (U"You can mix the Symbol and IPA alphabets with the normal Roman alphabets "
 	"and use sequences of backslash + digraph for @@special symbols@ (see also @@phonetic symbols@).")
-NORMAL (L"For instance, you can get an \\e\" by typing \\bse\\\" , or a \\ss by typing \\bsss; "
+NORMAL (U"For instance, you can get an \\e\" by typing \\bse\\\" , or a \\ss by typing \\bsss; "
 	"you can get an \\ep by typing \\bsep, or a \\ct, which is a turned c, by typing \\bsct.")
-ENTRY (L"Styles")
-NORMAL (L"There are no commands in the menu for text styles (bold, italic), "
+ENTRY (U"Styles")
+NORMAL (U"There are no commands in the menu for text styles (bold, italic), "
 	"but you can still use them in the Picture window: see @@text styles at .")
 MAN_END
 
-MAN_BEGIN (L"Logarithmic marks left/right/top/bottom...", L"ppgb", 19970330)
-INTRO (L"Four of the commands in the #Margins menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To draw a specified number of marks per decade "
+MAN_BEGIN (U"Logarithmic marks left/right/top/bottom...", U"ppgb", 19970330)
+INTRO (U"Four of the commands in the #Margins menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To draw a specified number of marks per decade "
 	"into the @margins around the drawing area, along a logarithmic axis.")
-ENTRY (L"Settings")
-TAG (L"%%Marks per decade")
-DEFINITION (L"the number of marks that will be drawn for every decade.")
-TAG (L"%%Write numbers")
-DEFINITION (L"if on, real numbers will be written in the margin, "
+ENTRY (U"Settings")
+TAG (U"%%Marks per decade")
+DEFINITION (U"the number of marks that will be drawn for every decade.")
+TAG (U"%%Write numbers")
+DEFINITION (U"if on, real numbers will be written in the margin, "
 	"expressed in the domain or range of your latest drawing "
 	"in the horizontal or vertical direction.")
-TAG (L"%%Draw ticks")
-DEFINITION (L"if on, short line pieces will be drawn in the margin.")
-TAG (L"%%Draw dotted lines")
-DEFINITION (L"if on, dotted lines will be drawn through your drawing.")
-ENTRY (L"Behaviour")
-LIST_ITEM (L"If your vertical logarithmic axis runs from 10 to 100, "
+TAG (U"%%Draw ticks")
+DEFINITION (U"if on, short line pieces will be drawn in the margin.")
+TAG (U"%%Draw dotted lines")
+DEFINITION (U"if on, dotted lines will be drawn through your drawing.")
+ENTRY (U"Behaviour")
+LIST_ITEM (U"If your vertical logarithmic axis runs from 10 to 100, "
 	"and %%Marks per decade% is 1, marks will only be drawn at 10 and 100;")
-LIST_ITEM (L"if %%Marks per decade% is 2, marks will be drawn at 10, 30, and 100;")
-LIST_ITEM (L"if it is 3, marks will be drawn at 10, 20, 50, and 100;")
-LIST_ITEM (L"if it is 4, marks will be drawn at 10, 20, 30, 50, and 100;")
-LIST_ITEM (L"if it is 5, marks will be drawn at 10, 20, 30, 50, 70, and 100;")
-LIST_ITEM (L"if it is 6, marks will be drawn at 10, 15, 20, 30, 50, 70, and 100;")
-LIST_ITEM (L"if it is 7 (the maximum), marks will be drawn at 10, 15, 20, 30, 40, 50, 70, and 100.")
+LIST_ITEM (U"if %%Marks per decade% is 2, marks will be drawn at 10, 30, and 100;")
+LIST_ITEM (U"if it is 3, marks will be drawn at 10, 20, 50, and 100;")
+LIST_ITEM (U"if it is 4, marks will be drawn at 10, 20, 30, 50, and 100;")
+LIST_ITEM (U"if it is 5, marks will be drawn at 10, 20, 30, 50, 70, and 100;")
+LIST_ITEM (U"if it is 6, marks will be drawn at 10, 15, 20, 30, 50, 70, and 100;")
+LIST_ITEM (U"if it is 7 (the maximum), marks will be drawn at 10, 15, 20, 30, 40, 50, 70, and 100.")
 MAN_END
 
-MAN_BEGIN (L"Margins", L"ppgb", 19970405)
-INTRO (L"The space around most of your drawings in the @@Picture window at .")
-ENTRY (L"World coordinates")
-NORMAL (L"With the commands in the #Margins menu, "
+MAN_BEGIN (U"Margins", U"ppgb", 19970405)
+INTRO (U"The space around most of your drawings in the @@Picture window at .")
+ENTRY (U"World coordinates")
+NORMAL (U"With the commands in the #Margins menu, "
 	"you draw text, ticks, numbers, or a rectangle, "
 	"in the margins around the latest drawing that you made, "
 	"or you draw dotted lines through or text inside this last drawing.")
-NORMAL (L"You specify the positions of these things in world coordinates, "
+NORMAL (U"You specify the positions of these things in world coordinates, "
 	"i.e., in coordinates that refer to the natural coordinate system of your last drawing.")
-NORMAL (L"The numbers that you can mark around your drawing also refer to these coordinates. "
+NORMAL (U"The numbers that you can mark around your drawing also refer to these coordinates. "
 	"For instance, after drawing a spectrum with ##Spectrum: Draw...#, "
 	"you can draw a dotted line at 2000 Hz or at 60 dB "
 	"by choosing ##One mark bottom...# or ##One mark left...# "
 	"and typing \"2000\" or \"60\", respectively.")
-ENTRY (L"Usage")
-NORMAL (L"The margin commands work with all the drawings that leave margins around themselves, "
+ENTRY (U"Usage")
+NORMAL (U"The margin commands work with all the drawings that leave margins around themselves, "
 	"such as ##Sound: Draw...#, ##Spectrogram: Paint...#, ##Polygon: Paint...#, and more. "
 	"They do not work properly, however, with the commands that draw vocal tract shapes, "
 	"like ##Art & Speaker: Draw...# and ##Artword & Speaker: Draw...#, "
 	"because these can only be drawn correctly into a square viewport.")
-ENTRY (L"Limited validity")
-NORMAL (L"The margin commands work only on the latest drawing that you made "
+ENTRY (U"Limited validity")
+NORMAL (U"The margin commands work only on the latest drawing that you made "
 	"(unless you @Undo that drawing).")
-ENTRY (L"Margin size")
-NORMAL (L"The size of the margins depends on the font size, "
+ENTRY (U"Margin size")
+NORMAL (U"The size of the margins depends on the font size, "
 	"so be sure that you have the font size of your choice before you make your drawing. "
 	"You can set the font size with the @@Font menu at .")
 MAN_END
 
-MAN_BEGIN (L"Marks left/right/top/bottom...", L"ppgb", 19970330)
-INTRO (L"Four of the commands in the #Margins menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To draw any number of equally spaced marks into the @margins around the drawing area.")
-ENTRY (L"Settings")
-TAG (L"##Number of marks")
-DEFINITION (L"the number of equally spaced marks (2 or more) that will be drawn; "
+MAN_BEGIN (U"Marks left/right/top/bottom...", U"ppgb", 19970330)
+INTRO (U"Four of the commands in the #Margins menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To draw any number of equally spaced marks into the @margins around the drawing area.")
+ENTRY (U"Settings")
+TAG (U"##Number of marks")
+DEFINITION (U"the number of equally spaced marks (2 or more) that will be drawn; "
 	"there will always be marks at the beginning and end of the domain or range.")
-TAG (L"##Write numbers")
-DEFINITION (L"if on, real numbers will be written in the margin, "
+TAG (U"##Write numbers")
+DEFINITION (U"if on, real numbers will be written in the margin, "
 	"expressed in the domain or range of your latest drawing "
 	"in the horizontal or vertical direction.")
-TAG (L"##Draw ticks")
-DEFINITION (L"if on, short line pieces will be drawn in the margin.")
-TAG (L"##Draw dotted lines")
-DEFINITION (L"if on, dotted lines will be drawn through your drawing.")
-ENTRY (L"Example")
-NORMAL (L"If you draw a Sound with a domain between 0 and 1 seconds "
+TAG (U"##Draw ticks")
+DEFINITION (U"if on, short line pieces will be drawn in the margin.")
+TAG (U"##Draw dotted lines")
+DEFINITION (U"if on, dotted lines will be drawn through your drawing.")
+ENTRY (U"Example")
+NORMAL (U"If you draw a Sound with a domain between 0 and 1 seconds "
 	"to an amplitude range between -1 and 1, "
 	"choosing ##Marks left...# with a number of 3 and %%Draw dotted lines% on, "
 	"will give you horizontal marks and horizontal dotted lines at -1, 0, and 1; "
@@ -565,152 +565,152 @@ NORMAL (L"If you draw a Sound with a domain between 0 and 1 seconds "
 	"will give you vertical marks at 0, 0.2, 0.4, 0.6, 0.8, and 1.")
 MAN_END
 
-MAN_BEGIN (L"Marks left/right/top/bottom every...", L"ppgb", 19970330)
-INTRO (L"Four of the commands in the #Margins menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To draw a number of equally spaced marks into the @margins around the drawing area.")
-ENTRY (L"Settings")
-TAG (L"##Units")
-DEFINITION (L"the units, relative to the standard units, "
+MAN_BEGIN (U"Marks left/right/top/bottom every...", U"ppgb", 19970330)
+INTRO (U"Four of the commands in the #Margins menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To draw a number of equally spaced marks into the @margins around the drawing area.")
+ENTRY (U"Settings")
+TAG (U"##Units")
+DEFINITION (U"the units, relative to the standard units, "
 	"for writing the numbers; for example, if you want time in milliseconds "
 	"instead of seconds (which is always the standard), "
 	"#Units should be 0.001.")
-TAG (L"##Distance")
-DEFINITION (L"the distance between the equally spaced marks that will be drawn, "
+TAG (U"##Distance")
+DEFINITION (U"the distance between the equally spaced marks that will be drawn, "
 	"expressed in #Units; for example, if you want marks every 20 milliseconds, "
 	"and %Units is 0.001, this argument should be 20.")
-TAG (L"##Write numbers")
-DEFINITION (L"if on, real numbers will be written in the margin, "
+TAG (U"##Write numbers")
+DEFINITION (U"if on, real numbers will be written in the margin, "
 	"expressed in the domain or range of your latest drawing "
 	"in the horizontal or vertical direction.")
-TAG (L"##Draw ticks")
-DEFINITION (L"if on, short line pieces will be drawn in the margin.")
-TAG (L"##Draw dotted lines")
-DEFINITION (L"if on, dotted lines will be drawn through your drawing.")
+TAG (U"##Draw ticks")
+DEFINITION (U"if on, short line pieces will be drawn in the margin.")
+TAG (U"##Draw dotted lines")
+DEFINITION (U"if on, dotted lines will be drawn through your drawing.")
 MAN_END
 
-MAN_BEGIN (L"One logarithmic mark left/right/top/bottom...", L"ppgb", 19970330)
-INTRO (L"Four of the commands in the #Margins menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To draw one mark into one of the four @margins "
+MAN_BEGIN (U"One logarithmic mark left/right/top/bottom...", U"ppgb", 19970330)
+INTRO (U"Four of the commands in the #Margins menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To draw one mark into one of the four @margins "
 	"around the drawing area, along a logarithmic axis.")
-ENTRY (L"Settings")
-TAG (L"##Position")
-DEFINITION (L"the %x (for top or bottom) or %y (for left or right) position of the mark, "
+ENTRY (U"Settings")
+TAG (U"##Position")
+DEFINITION (U"the %x (for top or bottom) or %y (for left or right) position of the mark, "
 	"expressed in the logarithmic domain or range of your latest drawing "
 	"in the horizontal or vertical direction.")
-TAG (L"##Write number")
-DEFINITION (L"if on, a real number equal to #Position will be written in the margin, "
+TAG (U"##Write number")
+DEFINITION (U"if on, a real number equal to #Position will be written in the margin, "
 	"at an %x (for top or bottom) or %y (for left or right) position equal to #Position.")
-TAG (L"##Draw tick")
-DEFINITION (L"if on, a short line piece will be drawn in the margin, "
+TAG (U"##Draw tick")
+DEFINITION (U"if on, a short line piece will be drawn in the margin, "
 	"at an %x (for top or bottom) or %y (for left or right) position equal to #Position.")
-TAG (L"##Draw dotted line")
-DEFINITION (L"if on, a dotted line will be drawn through your drawing, "
+TAG (U"##Draw dotted line")
+DEFINITION (U"if on, a dotted line will be drawn through your drawing, "
 	"at an %x (for top or bottom) or %y (for left or right) position equal to #Position.")
-TAG (L"##Draw text")
-DEFINITION (L"if not empty, this text will be drawn in the margin, "
+TAG (U"##Draw text")
+DEFINITION (U"if not empty, this text will be drawn in the margin, "
 	"at an %x (for top or bottom) or %y (for left or right) position equal to #Position.")
-ENTRY (L"Example")
-NORMAL (L"After you draw a Pitch logarithmically in a range between 100 and 400 Hz, "
+ENTRY (U"Example")
+NORMAL (U"After you draw a Pitch logarithmically in a range between 100 and 400 Hz, "
 	"choosing ##One logarithmic mark left...# with a position of 200 and %%Draw dotted line% on, "
 	"will give you a horizontal mark \"200\" and a horizontal dotted line at a %y position of 200, "
 	"which is exactly halfway between 100 and 400 Hz.")
 MAN_END
 
-MAN_BEGIN (L"One mark left/right/top/bottom...", L"ppgb", 19970330)
-INTRO (L"Four of the commands in the #Margins menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To draw one mark into one of the four @margins around the drawing area.")
-ENTRY (L"Settings")
-TAG (L"##Position")
-DEFINITION (L"the %x (for top or bottom) or %y (for left or right) position of the mark, "
+MAN_BEGIN (U"One mark left/right/top/bottom...", U"ppgb", 19970330)
+INTRO (U"Four of the commands in the #Margins menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To draw one mark into one of the four @margins around the drawing area.")
+ENTRY (U"Settings")
+TAG (U"##Position")
+DEFINITION (U"the %x (for top or bottom) or %y (for left or right) position of the mark, "
 	"expressed in the domain or range of your latest drawing "
 	"in the horizontal or vertical direction.")
-TAG (L"##Write number")
-DEFINITION (L"if on, a real number equal to `Position' will be written in the margin, "
+TAG (U"##Write number")
+DEFINITION (U"if on, a real number equal to `Position' will be written in the margin, "
 	"at an %x (for top or bottom) or %y (for left or right) position equal to #Position.")
-TAG (L"##Draw tick")
-DEFINITION (L"if on, a short line piece will be drawn in the margin, "
+TAG (U"##Draw tick")
+DEFINITION (U"if on, a short line piece will be drawn in the margin, "
 	"at an %x (for top or bottom) or %y (for left or right) position equal to #Position.")
-TAG (L"##Draw dotted line")
-DEFINITION (L"if on, a dotted line will be drawn through your drawing, "
+TAG (U"##Draw dotted line")
+DEFINITION (U"if on, a dotted line will be drawn through your drawing, "
 	"at an %x (for top or bottom) or %y (for left or right) position equal to #Position.")
-TAG (L"##Draw text")
-DEFINITION (L"if not empty, this text will be drawn in the margin, "
+TAG (U"##Draw text")
+DEFINITION (U"if not empty, this text will be drawn in the margin, "
 	"at an %x (for top or bottom) or %y (for left or right) position equal to #Position.")
-ENTRY (L"Example")
-NORMAL (L"If you draw a Sound to an amplitude range between -1 and 1, "
+ENTRY (U"Example")
+NORMAL (U"If you draw a Sound to an amplitude range between -1 and 1, "
 	"choosing ##One mark left...# with a position of 0.0 and %%Draw dotted line% on, "
 	"will give you a horizontal mark \"0\" and a horizontal dotted line at a y position of 0.")
 MAN_END
 
-MAN_BEGIN (L"Pen menu", L"ppgb", 20091215)
-INTRO (L"One of the menus of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To choose the line type and @colour "
+MAN_BEGIN (U"Pen menu", U"ppgb", 20091215)
+INTRO (U"One of the menus of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To choose the line type and @colour "
 	"to be used in subsequent drawing of lines and text.")
-ENTRY (L"Behaviour")
-NORMAL (L"The line type used by @@Draw inner box@ (solid), "
+ENTRY (U"Behaviour")
+NORMAL (U"The line type used by @@Draw inner box@ (solid), "
 	"and the line type of the dotted lines in the ##Mark...# commands "
 	"will not be affected.")
-NORMAL (L"The commands in the @Margins menu will always draw in black.")
+NORMAL (U"The commands in the @Margins menu will always draw in black.")
 MAN_END
 
-MAN_BEGIN (L"Colour", L"ppgb", 20091215)
-INTRO (L"In windows that pop up when you choose ##Colour...# from the @@Pen menu@ "
+MAN_BEGIN (U"Colour", U"ppgb", 20091215)
+INTRO (U"In windows that pop up when you choose ##Colour...# from the @@Pen menu@ "
 	"or any of the #Paint commands in the ##World menu#, you can see the following field:")
-CODE (L"Colour (0-1, name, or {r,g,b})")
-NORMAL (L"This means that you can specify here a colour in any of three ways:")
-TAG (L"\\bu a grey value between 0 and 1:")
-DEFINITION (L"a value of 0 means black, 1 means white, 0.5 means grey, 0.75 means silver, and so on.")
-TAG (L"\\bu a colour name:")
-DEFINITION (L"you can choose from Black, White, Red, Green, Blue, Yellow, Cyan, Magenta, Maroon, Lime, Navy, Teal, "
+CODE (U"Colour (0-1, name, or {r,g,b})")
+NORMAL (U"This means that you can specify here a colour in any of three ways:")
+TAG (U"\\bu a grey value between 0 and 1:")
+DEFINITION (U"a value of 0 means black, 1 means white, 0.5 means grey, 0.75 means silver, and so on.")
+TAG (U"\\bu a colour name:")
+DEFINITION (U"you can choose from Black, White, Red, Green, Blue, Yellow, Cyan, Magenta, Maroon, Lime, Navy, Teal, "
 	"Purple, Olive, Pink, Silver, Grey, i.e. from any of the colours in the Pen menu. "
 	"You can write these either with a capital (Red) or in lowercase (red).")
-TAG (L"\\bu an RGB colour:")
-DEFINITION (L"you can specify a red-green-blue value as three values between 0 and 1, enclosed within braces "
+TAG (U"\\bu an RGB colour:")
+DEFINITION (U"you can specify a red-green-blue value as three values between 0 and 1, enclosed within braces "
 	"and separated by commas, e.g. {0.8,0.1,0.2} is something reddish.")
 MAN_END
 
-MAN_BEGIN (L"Picture window", L"ppgb", 20140325)
-INTRO (L"One of the two main windows in Praat.")
-TAG (L"File menu")
-LIST_ITEM (L"\\bu @@Save as PDF file...")
-LIST_ITEM (L"\\bu @@Save as PNG file...")
-LIST_ITEM (L"\\bu @@Save as EPS file...")
-LIST_ITEM (L"\\bu @@Save as Windows metafile...@")
-LIST_ITEM (L"\\bu @@Read from Praat picture file...@, @@Save as Praat picture file...")
-LIST_ITEM (L"\\bu @@PostScript settings...")
-LIST_ITEM (L"\\bu @@Print...")
-TAG (L"Edit menu")
-LIST_ITEM (L"\\bu @@Undo@")
-LIST_ITEM (L"\\bu @@Copy to clipboard@")
-LIST_ITEM (L"\\bu @@Erase all@")
-TAG (L"@Margins menu")
-LIST_ITEM (L"\\bu @@Draw inner box")
-LIST_ITEM (L"\\bu @@Text left/right/top/bottom...")
-LIST_ITEM (L"\\bu @@Marks left/right/top/bottom every...")
-LIST_ITEM (L"\\bu @@One mark left/right/top/bottom...")
-LIST_ITEM (L"\\bu @@Marks left/right/top/bottom...")
-LIST_ITEM (L"\\bu @@Logarithmic marks left/right/top/bottom...")
-LIST_ITEM (L"\\bu @@One logarithmic mark left/right/top/bottom...")
-LIST_ITEM (L"\\bu @@Axes...")
-TAG (L"World menu")
-LIST_ITEM (L"\\bu @@Text...")
-LIST_ITEM (L"\\bu @@Axes...")
-TAG (L"Select menu")
-LIST_ITEM (L"\\bu @@Select inner viewport...@, @@Select outer viewport...@, @@Viewport text...")
-TAG (L"@@Pen menu")
-TAG (L"@@Font menu")
+MAN_BEGIN (U"Picture window", U"ppgb", 20140325)
+INTRO (U"One of the two main windows in Praat.")
+TAG (U"File menu")
+LIST_ITEM (U"\\bu @@Save as PDF file...")
+LIST_ITEM (U"\\bu @@Save as PNG file...")
+LIST_ITEM (U"\\bu @@Save as EPS file...")
+LIST_ITEM (U"\\bu @@Save as Windows metafile...@")
+LIST_ITEM (U"\\bu @@Read from Praat picture file...@, @@Save as Praat picture file...")
+LIST_ITEM (U"\\bu @@PostScript settings...")
+LIST_ITEM (U"\\bu @@Print...")
+TAG (U"Edit menu")
+LIST_ITEM (U"\\bu @@Undo@")
+LIST_ITEM (U"\\bu @@Copy to clipboard@")
+LIST_ITEM (U"\\bu @@Erase all@")
+TAG (U"@Margins menu")
+LIST_ITEM (U"\\bu @@Draw inner box")
+LIST_ITEM (U"\\bu @@Text left/right/top/bottom...")
+LIST_ITEM (U"\\bu @@Marks left/right/top/bottom every...")
+LIST_ITEM (U"\\bu @@One mark left/right/top/bottom...")
+LIST_ITEM (U"\\bu @@Marks left/right/top/bottom...")
+LIST_ITEM (U"\\bu @@Logarithmic marks left/right/top/bottom...")
+LIST_ITEM (U"\\bu @@One logarithmic mark left/right/top/bottom...")
+LIST_ITEM (U"\\bu @@Axes...")
+TAG (U"World menu")
+LIST_ITEM (U"\\bu @@Text...")
+LIST_ITEM (U"\\bu @@Axes...")
+TAG (U"Select menu")
+LIST_ITEM (U"\\bu @@Select inner viewport...@, @@Select outer viewport...@, @@Viewport text...")
+TAG (U"@@Pen menu")
+TAG (U"@@Font menu")
 MAN_END
 
-MAN_BEGIN (L"PostScript settings...", L"ppgb", 20120430)
-INTRO (L"One of the commands in the File menus of many windows. "
+MAN_BEGIN (U"PostScript settings...", U"ppgb", 20120430)
+INTRO (U"One of the commands in the File menus of many windows. "
 	"The PostScript settings influence @Printing and saving to @@Encapsulated PostScript@ files.")
-ENTRY (L"Settings")
-TAG (L"##Allow direct PostScript printing# (Windows only)")
-DEFINITION (L"this determines whether Praat prints explicit PostScript commands to your printer "
+ENTRY (U"Settings")
+TAG (U"##Allow direct PostScript printing# (Windows only)")
+DEFINITION (U"this determines whether Praat prints explicit PostScript commands to your printer "
 	"if it is a PostScript printer. This is what you will usually want. However, if you find "
 	"that some of the options that you choose in the #Print window seem not to be supported "
 	"(e.g. scaling, printing two-up...), you may switch this off; Praat will then send native "
@@ -718,57 +718,57 @@ DEFINITION (L"this determines whether Praat prints explicit PostScript commands
 	"to PostScript. If your printer does not support PostScript, this switch is ignored. "
 	"On Macintosh, this switch is ignored, because all printingis done in PDF. "
 	"On Unix, this switch is superfluous, because all printing is done directly in PostScript.")
-TAG (L"##Grey resolution")
-DEFINITION (L"you can choose from two image qualities:")
-LIST_ITEM1 (L"\\bu the %finest quality for grey plots (106 spots per inch), "
+TAG (U"##Grey resolution")
+DEFINITION (U"you can choose from two image qualities:")
+LIST_ITEM1 (U"\\bu the %finest quality for grey plots (106 spots per inch), "
 	"which gives the best results directly from the printer;")
-LIST_ITEM1 (L"\\bu a %photocopyable quality, which has fewer spots per inch (85) and "
+LIST_ITEM1 (U"\\bu a %photocopyable quality, which has fewer spots per inch (85) and "
 	"gives the best results after photocopying.")
-DEFINITION (L"Your choice of the grey resolution influences direct PostScript printing "
+DEFINITION (U"Your choice of the grey resolution influences direct PostScript printing "
 	"and saving to @@Encapsulated PostScript@ files.")
-TAG (L"##Paper size# (Unix only)")
-DEFINITION (L"you can choose from A4 (210 \\xx 297 mm), A3 (297 \\xx 420 mm) or US Letter (8.5 \\xx 11\\\"p). "
+TAG (U"##Paper size# (Unix only)")
+DEFINITION (U"you can choose from A4 (210 \\xx 297 mm), A3 (297 \\xx 420 mm) or US Letter (8.5 \\xx 11\\\"p). "
 	"This choice applies to Unix only; on Windows, you choose the paper size in the ##Print...# window; "
 	"on Macintosh, you choose the paper size in the ##Page setup...# window.")
-TAG (L"##Orientation# (Unix only)")
-DEFINITION (L"you can choose between %portrait (e.g., 297 mm high and 210 mm wide) "
+TAG (U"##Orientation# (Unix only)")
+DEFINITION (U"you can choose between %portrait (e.g., 297 mm high and 210 mm wide) "
 	"and %landscape (e.g., 210 mm high and 297 mm wide). "
 	"This choice applies to Unix only; on Windows, you choose the orientation in the ##Print...# window; "
 	"on Macintosh, you choose the orientation in the ##Page setup...# window.")
-TAG (L"##Magnification# (Unix only)")
-DEFINITION (L"the relative size with which your picture will be printed; normally 1.0. "
+TAG (U"##Magnification# (Unix only)")
+DEFINITION (U"the relative size with which your picture will be printed; normally 1.0. "
 	"This choice applies to Unix only; on Windows, you choose the scaling in the ##Print...# window; "
 	"on Macintosh, you choose the scaling in the ##Page setup...# window.")
-TAG (L"##Print command# (Unix only)")
-DEFINITION (L"When printing on Unix, a temporary PostScript^\\re file is created in the \"/tmp\" directory; "
+TAG (U"##Print command# (Unix only)")
+DEFINITION (U"When printing on Unix, a temporary PostScript^\\re file is created in the \"/tmp\" directory; "
 	"it will have a name like \"picXXXXXX\", and is automatically removed after printing. "
 	"This file is sent to the printer with the print command, which will often look like $$lp -c \\% s$, "
 	"where $$\\% s$ stands for the file name.")
 MAN_END
 
-MAN_BEGIN (L"Print...", L"ppgb", 20001010)
-INTRO (L"One of the commands in the File menu of the @@Picture window at .")
-NORMAL (L"With this command, you send your entire picture immediately to the printer. "
+MAN_BEGIN (U"Print...", U"ppgb", 20001010)
+INTRO (U"One of the commands in the File menu of the @@Picture window at .")
+NORMAL (U"With this command, you send your entire picture immediately to the printer. "
 	"See the @Printing tutorial for details.")
 MAN_END
 
-MAN_BEGIN (L"Printing", L"ppgb", 20120430)
-ENTRY (L"1a. Printing on Windows")
-NORMAL (L"On Windows, the best results will be obtained on PostScript printers, since these have built-in "
+MAN_BEGIN (U"Printing", U"ppgb", 20120430)
+ENTRY (U"1a. Printing on Windows")
+NORMAL (U"On Windows, the best results will be obtained on PostScript printers, since these have built-in "
 	"facilities for images (e.g. spectrograms) and rotated text. If a PostScript printer is available, "
 	"Praat will usually write direct PostScript commands to that printer "
 	"(see @@PostScript settings...@ if you want to switch this off). "
 	"Praat also supports non-PostScript printers, such as most colour inkjet printers.")
-NORMAL (L"If you don't have a PostScript printer, and you still want PostScript quality, "
+NORMAL (U"If you don't have a PostScript printer, and you still want PostScript quality, "
 	"you can save the picture to an EPS file (@@Save as EPS file...@). "
 	"You can then view this file with the freely available "
 	"GhostView^\\tm program, which you can download from ##http://pages.cs.wisc.edu/~ghost/#, "
 	"or convert it to PDF with either GhostView or Adobe^\\re Acrobat^\\tm Distiller^\\tm, which is more reliable than GhostView "
 	"but is also expensive.")
-ENTRY (L"1b. Printing on Macintosh")
-NORMAL (L"On the Mac, Praat will print in PDF, both to PostScript and non-PostScript printers.")
-ENTRY (L"1c. Printing on Linux")
-NORMAL (L"On Linux, when you tell Praat to print a picture or manual page, Praat will write the picture to a temporary PostScript file "
+ENTRY (U"1b. Printing on Macintosh")
+NORMAL (U"On the Mac, Praat will print in PDF, both to PostScript and non-PostScript printers.")
+ENTRY (U"1c. Printing on Linux")
+NORMAL (U"On Linux, when you tell Praat to print a picture or manual page, Praat will write the picture to a temporary PostScript file "
 	"and send this file to a printer with the %%print command%, which you can change "
 	"with @@PostScript settings... at . You do not need a PostScript printer to print PostScript directly, "
 	"because the #lpr program sends PostScript files through the GhostScript program, "
@@ -776,246 +776,246 @@ NORMAL (L"On Linux, when you tell Praat to print a picture or manual page, Praat
 	"$$lpr \\% s$. By changing the print command (with @@PostScript settings...@), "
 	"you can change it to something fancier. For instance, if you want to save the woods "
 	"and print two pages on one sheet of paper, you change it to $$cat \\% s | mpage -2 -o -f -m0 | lpr$.")
-ENTRY (L"2. Indirect printing with your word processor")
-NORMAL (L"If you save your picture to an EPS file, you will be able to include it as a picture in your favourite "
+ENTRY (U"2. Indirect printing with your word processor")
+NORMAL (U"If you save your picture to an EPS file, you will be able to include it as a picture in your favourite "
 	"word processor (Microsoft^\\re Word^\\tm, LaTeX...). See @@Save as EPS file... at .")
-NORMAL (L"On the Mac it is better to save your picture to a PDF file, which both Microsoft^\\re Word^\\tm (when using the ##.docx# format) and LaTeX can process. "
+NORMAL (U"On the Mac it is better to save your picture to a PDF file, which both Microsoft^\\re Word^\\tm (when using the ##.docx# format) and LaTeX can process. "
 	"See @@Save as PDF file... at .")
-ENTRY (L"3. Indirect printing through the clipboard")
-NORMAL (L"On Windows, pictures included in your word processor via @@Copy to clipboard@ or @@Save as Windows metafile...@ "
+ENTRY (U"3. Indirect printing through the clipboard")
+NORMAL (U"On Windows, pictures included in your word processor via @@Copy to clipboard@ or @@Save as Windows metafile...@ "
 	"will print fine, though not as nicely as EPS files.")
-NORMAL (L"On the Mac, pictures included in your word processor (post-2006 versions) via @@Copy to clipboard@ "
+NORMAL (U"On the Mac, pictures included in your word processor (post-2006 versions) via @@Copy to clipboard@ "
 	"will print just as nicely as PDF files (use the ##.docx# format in Microsoft Word).")
 MAN_END
 
-MAN_BEGIN (L"Read from Praat picture file...", L"ppgb", 20110129)
-INTRO (L"One of the commands in the File menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To read a picture that you saved earlier "
+MAN_BEGIN (U"Read from Praat picture file...", U"ppgb", 20110129)
+INTRO (U"One of the commands in the File menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To read a picture that you saved earlier "
 	"with @@Save as Praat picture file... at .")
-ENTRY (L"Behaviour")
-NORMAL (L"The picture will be drawn across whatever is currently visible in the Picture window.")
-ENTRY (L"Usage")
-NORMAL (L"With the help of this command, you can transfer a picture from a Unix machine to a Macintosh. "
+ENTRY (U"Behaviour")
+NORMAL (U"The picture will be drawn across whatever is currently visible in the Picture window.")
+ENTRY (U"Usage")
+NORMAL (U"With the help of this command, you can transfer a picture from a Unix machine to a Macintosh. "
 	"Praat for Macintosh can write the picture to an @@Encapsulated PostScript@ file "
 	"with a screen preview.")
 MAN_END
 
-MAN_BEGIN (L"Text...", L"ppgb", 19970330)
-INTRO (L"One of the commands in the #World menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To write text inside the drawing area.")
-ENTRY (L"Scope")
-NORMAL (L"This works with all the drawings that leave @margins around themselves.")
-ENTRY (L"Settings")
-TAG (L"%x")
-DEFINITION (L"horizontal position, expressed in the horizontal domain of your latest drawing.")
-TAG (L"%y")
-DEFINITION (L"vertical position, expressed in the vertical range or domain of your latest drawing.")
-TAG (L"%%Horizontal alignment")
-DEFINITION (L"determines the horizontal alignment of the text relative to %x.")
-TAG (L"%%Vertical alignment")
-DEFINITION (L"determines the vertical alignment of the text relative to %y.")
-TAG (L"%%Text")
-DEFINITION (L"will be drawn in the current font and font size "
+MAN_BEGIN (U"Text...", U"ppgb", 19970330)
+INTRO (U"One of the commands in the #World menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To write text inside the drawing area.")
+ENTRY (U"Scope")
+NORMAL (U"This works with all the drawings that leave @margins around themselves.")
+ENTRY (U"Settings")
+TAG (U"%x")
+DEFINITION (U"horizontal position, expressed in the horizontal domain of your latest drawing.")
+TAG (U"%y")
+DEFINITION (U"vertical position, expressed in the vertical range or domain of your latest drawing.")
+TAG (U"%%Horizontal alignment")
+DEFINITION (U"determines the horizontal alignment of the text relative to %x.")
+TAG (U"%%Vertical alignment")
+DEFINITION (U"determines the vertical alignment of the text relative to %y.")
+TAG (U"%%Text")
+DEFINITION (U"will be drawn in the current font and font size "
 	"that you set with the @@Font menu at .")
-ENTRY (L"Usage")
-NORMAL (L"With the ##Text...# command, you can use all @@special symbols@ and @@text styles at .")
+ENTRY (U"Usage")
+NORMAL (U"With the ##Text...# command, you can use all @@special symbols@ and @@text styles at .")
 MAN_END
 
-MAN_BEGIN (L"Insert picture from file...", L"ppgb", 20140608)
-INTRO (L"A command in the #World menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To draw a picture file (PNG; on Mac and Windows also JPEG or TIFF; "
+MAN_BEGIN (U"Insert picture from file...", U"ppgb", 20140608)
+INTRO (U"A command in the #World menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To draw a picture file (PNG; on Mac and Windows also JPEG or TIFF; "
 	"other picture formats may also work) into the Picture window (or into the Demo window).")
-ENTRY (L"Settings")
-TAG (L"##File name")
-DEFINITION (L"the name of the picture file. If you use this command in a script, "
+ENTRY (U"Settings")
+TAG (U"##File name")
+DEFINITION (U"the name of the picture file. If you use this command in a script, "
 	"you can use a relative path name such as $$pictures/myface.png$ or $$~/Desktop/hello.png$.")
-TAG (L"##From x")
-TAG (L"##To x")
-DEFINITION (L"The horizontal location (in world coordinates) where the picture will appear. "
+TAG (U"##From x")
+TAG (U"##To x")
+DEFINITION (U"The horizontal location (in world coordinates) where the picture will appear. "
 	"Use the @@Axes...@ command to set world coordinates if they have not been set implicitly by an earlier #Draw or #Paint command. "
 	"If you set ##From x# and ##To x# to the same value, the picture will be horizontally centred around this %x value "
 	"and obtain a width that preserves the aspect ratio (width-to-height ratio) of the original picture.")
-TAG (L"##From y")
-TAG (L"##To y")
-DEFINITION (L"The vertical location (in world coordinates) where the picture will appear. "
+TAG (U"##From y")
+TAG (U"##To y")
+DEFINITION (U"The vertical location (in world coordinates) where the picture will appear. "
 	"Use the @@Axes...@ command to set world coordinates if they have not been set implicitly by an earlier #Draw or #Paint command. "
 	"If you set ##From y# and ##To y# to the same value, the picture will be vertically centred around this %y value "
 	"and obtain a height that preserves the aspect ratio (width-to-height ratio) of the original picture.")
-ENTRY (L"Behaviour")
-NORMAL (L"From the description above, you see that if ##From x# is unequal to ##To x# and ##From y# is unequal to ##To y#, "
+ENTRY (U"Behaviour")
+NORMAL (U"From the description above, you see that if ##From x# is unequal to ##To x# and ##From y# is unequal to ##To y#, "
 	"the picture will probably obtain an aspect ratio different from the original picture. "
 	"To preserve the aspect ratio, either make ##To x# equal to ##From x# or make ##To y# equal to ##From y#.")
-NORMAL (L"To show the picture on the same number of pixels as the original, make ##To x# equal to ##From x# and ##To y# equal to ##From y#. "
+NORMAL (U"To show the picture on the same number of pixels as the original, make ##To x# equal to ##From x# and ##To y# equal to ##From y#. "
 	"Praat will then show the picture with the original width and height (in pixels), centred around the given %x and %y values.")
-ENTRY (L"Usage")
-NORMAL (L"You will usually use this in a script, and often in a script that runs the @@Demo window at .")
+ENTRY (U"Usage")
+NORMAL (U"You will usually use this in a script, and often in a script that runs the @@Demo window at .")
 MAN_END
 
-MAN_BEGIN (L"Text left/right/top/bottom...", L"ppgb", 19970330)
-INTRO (L"Four of the commands in the #Margins menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To write text into the @margins around the drawing area.")
-ENTRY (L"Behaviour")
-NORMAL (L"The text will be centred along the side. "
+MAN_BEGIN (U"Text left/right/top/bottom...", U"ppgb", 19970330)
+INTRO (U"Four of the commands in the #Margins menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To write text into the @margins around the drawing area.")
+ENTRY (U"Behaviour")
+NORMAL (U"The text will be centred along the side. "
 	"Text at the left or right will be turned by 90 degrees "
 	"and written up and down, respectively.")
 MAN_END
 
-MAN_BEGIN (L"Undo", L"ppgb", 20091215)
-INTRO (L"One of the commands in the #Edit menu of the @@Picture window at .")
-NORMAL (L"It erases your most recently created drawing, which could have come from a command in the Objects window "
+MAN_BEGIN (U"Undo", U"ppgb", 20091215)
+INTRO (U"One of the commands in the #Edit menu of the @@Picture window at .")
+NORMAL (U"It erases your most recently created drawing, which could have come from a command in the Objects window "
 	"or from one of the drawing commands in the World and @Margins menus.")
-ENTRY (L"Behaviour")
-NORMAL (L"This command will erase some drawings, but it will not change your settings in the #Pen and #Font menus "
+ENTRY (U"Behaviour")
+NORMAL (U"This command will erase some drawings, but it will not change your settings in the #Pen and #Font menus "
 	"(line type, line width, font, font size, and @colour).")
-NORMAL (L"The world window will be what it was after the latest-but-one drawing, "
+NORMAL (U"The world window will be what it was after the latest-but-one drawing, "
 	"so that you can use the @Margins menu as if the latest drawing had never happened.")
 MAN_END
 
-MAN_BEGIN (L"Select inner viewport...", L"ppgb", 20041108)
-INTRO (L"One of the commands in the #Select menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To determine where your next drawing will occur.")
-ENTRY (L"The viewport")
+MAN_BEGIN (U"Select inner viewport...", U"ppgb", 20041108)
+INTRO (U"One of the commands in the #Select menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To determine where your next drawing will occur.")
+ENTRY (U"The viewport")
 #ifdef macintosh
-NORMAL (L"The \"viewport\" is the part of the Picture window where your next drawing will occur. "
+NORMAL (U"The \"viewport\" is the part of the Picture window where your next drawing will occur. "
 	"You can set the colour of its margins with ##System Preferences \\-> Appearance \\-> Highlight Colour#. ")
 #else
-NORMAL (L"The \"viewport\" is the part of the Picture window where your next drawing will occur. "
+NORMAL (U"The \"viewport\" is the part of the Picture window where your next drawing will occur. "
 	"Its margins are pink.")
 #endif
-NORMAL (L"The %inner viewport does not include the margins, the %outer viewport does (see @@Select outer viewport...@).")
-NORMAL (L"Normally, you select the viewport by dragging your mouse across the Picture window. "
+NORMAL (U"The %inner viewport does not include the margins, the %outer viewport does (see @@Select outer viewport...@).")
+NORMAL (U"Normally, you select the viewport by dragging your mouse across the Picture window. "
 	"However, you would use this explicit command:")
-LIST_ITEM (L"\\bu from a script;")
-LIST_ITEM (L"\\bu if you want a viewport that cannot be expressed in halves of an inch.")
+LIST_ITEM (U"\\bu from a script;")
+LIST_ITEM (U"\\bu if you want a viewport that cannot be expressed in halves of an inch.")
 MAN_END
 
-MAN_BEGIN (L"Select outer viewport...", L"ppgb", 20041108)
-INTRO (L"One of the commands in the #Select menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To determine where your next drawing will occur.")
-ENTRY (L"The viewport")
+MAN_BEGIN (U"Select outer viewport...", U"ppgb", 20041108)
+INTRO (U"One of the commands in the #Select menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To determine where your next drawing will occur.")
+ENTRY (U"The viewport")
 #ifdef macintosh
-NORMAL (L"The \"viewport\" is the part of the Picture window where your next drawing will occur. "
+NORMAL (U"The \"viewport\" is the part of the Picture window where your next drawing will occur. "
 	"You can set the colour of its margins with ##System Preferences \\-> Appearance \\-> Highlight Colour#. ")
 #else
-NORMAL (L"The \"viewport\" is the part of the Picture window where your next drawing will occur. "
+NORMAL (U"The \"viewport\" is the part of the Picture window where your next drawing will occur. "
 	"Its margins are pink.")
 #endif
-NORMAL (L"The %outer viewport includes the margins, the %inner viewport does not (see @@Select inner viewport...@).")
-NORMAL (L"Normally, you select the viewport by dragging your mouse across the Picture window. "
+NORMAL (U"The %outer viewport includes the margins, the %inner viewport does not (see @@Select inner viewport...@).")
+NORMAL (U"Normally, you select the viewport by dragging your mouse across the Picture window. "
 	"However, you would use this explicit command:")
-LIST_ITEM (L"\\bu from a script;")
-LIST_ITEM (L"\\bu if you want a viewport that cannot be expressed in halves of an inch.")
+LIST_ITEM (U"\\bu from a script;")
+LIST_ITEM (U"\\bu if you want a viewport that cannot be expressed in halves of an inch.")
 MAN_END
 
-MAN_BEGIN (L"Viewport text...", L"ppgb", 19970330)
-INTRO (L"One of the commands in the #Select menu of the @@Picture window at .")
-ENTRY (L"Purpose")
-NORMAL (L"To write text inside the viewport, at nine different places, "
+MAN_BEGIN (U"Viewport text...", U"ppgb", 19970330)
+INTRO (U"One of the commands in the #Select menu of the @@Picture window at .")
+ENTRY (U"Purpose")
+NORMAL (U"To write text inside the viewport, at nine different places, "
 	"with a rotation between 0 to 360 degrees.")
-ENTRY (L"Settings:")
-TAG (L"##Horizontal alignment")
-DEFINITION (L"determines the horizontal alignment of the text:")
-LIST_ITEM (L"    \\bu #Left means pushed against the left edge of the viewport;")
-LIST_ITEM (L"    \\bu #Right means pushed against the right edge of the viewport;")
-LIST_ITEM (L"    \\bu #Centre means horizontally centred in the viewport.")
-TAG (L"##Vertical alignment")
-DEFINITION (L"determines the vertical alignment of the text:")
-LIST_ITEM (L"    \\bu #Top means pushed against the top of the viewport;")
-LIST_ITEM (L"    \\bu #Bottom means pushed against the bottom of the viewport;")
-LIST_ITEM (L"    \\bu #Half means vertically centred in the viewport.")
-TAG (L"##Text")
-DEFINITION (L"will be drawn in the current font and font size "
+ENTRY (U"Settings:")
+TAG (U"##Horizontal alignment")
+DEFINITION (U"determines the horizontal alignment of the text:")
+LIST_ITEM (U"    \\bu #Left means pushed against the left edge of the viewport;")
+LIST_ITEM (U"    \\bu #Right means pushed against the right edge of the viewport;")
+LIST_ITEM (U"    \\bu #Centre means horizontally centred in the viewport.")
+TAG (U"##Vertical alignment")
+DEFINITION (U"determines the vertical alignment of the text:")
+LIST_ITEM (U"    \\bu #Top means pushed against the top of the viewport;")
+LIST_ITEM (U"    \\bu #Bottom means pushed against the bottom of the viewport;")
+LIST_ITEM (U"    \\bu #Half means vertically centred in the viewport.")
+TAG (U"##Text")
+DEFINITION (U"will be drawn in the current font and font size "
 	"that you set with the @@Font menu at .")
-ENTRY (L"Behaviour")
-NORMAL (L"For rotated text, the alignment settings will not only determine "
+ENTRY (U"Behaviour")
+NORMAL (U"For rotated text, the alignment settings will not only determine "
 	"the position inside the viewport, "
 	"but also the alignment in the rotated coordinate system. "
 	"This gives surprises now and then; "
 	"so, if you want several rotated texts that align with each other, "
 	"you should do this by varying the viewport, not the alignment.")
-ENTRY (L"Usage")
-NORMAL (L"You can use all @@special symbols@ and @@text styles at .")
+ENTRY (U"Usage")
+NORMAL (U"You can use all @@special symbols@ and @@text styles at .")
 MAN_END
 
-MAN_BEGIN (L"Save as EPS file...", L"ppgb", 20140325)
-INTRO (L"A command in the File menu of the @@Picture window at .")
-NORMAL (L"It saves the picture to an @@Encapsulated PostScript@ (EPS) file, "
+MAN_BEGIN (U"Save as EPS file...", U"ppgb", 20140325)
+INTRO (U"A command in the File menu of the @@Picture window at .")
+NORMAL (U"It saves the picture to an @@Encapsulated PostScript@ (EPS) file, "
 	"which can be imported by many other programs, such as Microsoft^\\re Word^\\tm.")
-ENTRY (L"Usage")
-NORMAL (L"EPS files are on the way out, mainly because they do not really support international text. "
+ENTRY (U"Usage")
+NORMAL (U"EPS files are on the way out, mainly because they do not really support international text. "
 	"On Macintosh and Linux, it is almost always better to use @@Save as PDF file...@ instead, "
 	"or (on the Mac) to use @@Copy to clipboard at . On Windows, which does not really support PDF files yet, "
 	"you may find that EPS files sometimes creates better quality than @@Copy to clipboard@; "
 	"you should also check out @@Save as PNG file...@ on Windows. "
 	"To import an EPS file in Word, choose #Insert \\-> #Picture \\-> ##From file...#. ")
-ENTRY (L"Behaviour")
-NORMAL (L"Though all the contents of the Picture window are written to the EPS file, "
+ENTRY (U"Behaviour")
+NORMAL (U"Though all the contents of the Picture window are written to the EPS file, "
 	"only the part that you selected in the Picture window (the %viewport) may become visible in Word (or another program).")
-ENTRY (L"Settings")
-NORMAL (L"The EPS picture is saved with the grey resolution and fonts that you specified with @@PostScript settings... at .")
+ENTRY (U"Settings")
+NORMAL (U"The EPS picture is saved with the grey resolution and fonts that you specified with @@PostScript settings... at .")
 MAN_END
 
-MAN_BEGIN (L"Save as PDF file...", L"ppgb", 20140325)
-INTRO (L"A command in the File menu of the @@Picture window@, on Macintosh and Linux.")
-NORMAL (L"It saves the picture to a PDF file, "
+MAN_BEGIN (U"Save as PDF file...", U"ppgb", 20140325)
+INTRO (U"A command in the File menu of the @@Picture window@, on Macintosh and Linux.")
+NORMAL (U"It saves the picture to a PDF file, "
 	"which can be imported by several other programs, such as modern versions of Microsoft^\\re Word\\tm.")
-ENTRY (L"PDF means highest possible quality")
-NORMAL (L"With PDF pictures you can use high-quality graphics in your word-processor documents. "
+ENTRY (U"PDF means highest possible quality")
+NORMAL (U"With PDF pictures you can use high-quality graphics in your word-processor documents. "
 	"On the Mac, the quality is the same as if you use @@Copy to clipboard at .")
-NORMAL (L"On Windows, use @@Save as PNG file...@ or @@Save as EPS file...@ instead.")
-ENTRY (L"Behaviour")
-NORMAL (L"Though all the contents of the Picture window are written to the PDF file, "
+NORMAL (U"On Windows, use @@Save as PNG file...@ or @@Save as EPS file...@ instead.")
+ENTRY (U"Behaviour")
+NORMAL (U"Though all the contents of the Picture window are written to the PDF file, "
 	"only the part that you selected in the Picture window (the %viewport) will become visible in Word (or another program).")
-ENTRY (L"Usage")
-NORMAL (L"To import a PDF file in Word, choose #Insert \\-> #Picture \\-> ##From file...#. "
+ENTRY (U"Usage")
+NORMAL (U"To import a PDF file in Word, choose #Insert \\-> #Picture \\-> ##From file...#. "
 	"Word will create a picture with the same size as the originally selected part of the Picture window (the %viewport).")
 MAN_END
 
-MAN_BEGIN (L"Save as PNG file...", L"ppgb", 20140325)
-INTRO (L"A command in the File menu of the @@Picture window@, on all platforms.")
-NORMAL (L"It saves the picture to a PNG (\"ping\") image file, "
+MAN_BEGIN (U"Save as PNG file...", U"ppgb", 20140325)
+INTRO (U"A command in the File menu of the @@Picture window@, on all platforms.")
+NORMAL (U"It saves the picture to a PNG (\"ping\") image file, "
 	"which can be imported by several other programs, such as Microsoft^\\re Word\\tm. "
 	"For the resolution you can choose between 600 dots per inch (very good quality even when printed) "
 	"and 300 dpi (enough for all web sites, even on retina displays).")
-ENTRY (L"Usage in text processors")
-NORMAL (L"On Windows, PNG files may sometimes have the best quality that you can get, "
+ENTRY (U"Usage in text processors")
+NORMAL (U"On Windows, PNG files may sometimes have the best quality that you can get, "
 	"although you should also try @@Save as EPS file...@ and @@Copy to clipboard at . "
 	"On Macintosh or Linux, @@Save as PDF file...@ or @@Copy to clipboard@ is almost always better.")
-ENTRY (L"Usage for publication")
-NORMAL (L"Some publishers do not accept PDF pictures. In such a case, "
+ENTRY (U"Usage for publication")
+NORMAL (U"Some publishers do not accept PDF pictures. In such a case, "
 	"they may accept 600-dpi or 300-dpi PNG pictures. If they accept TIFF pictures only, "
 	"then you can easily convert your PNG picture to a TIFF picture with any graphics converter program.")
-ENTRY (L"Behaviour")
-NORMAL (L"Only the contents of the part of the Picture window that you selected (the %viewport) "
+ENTRY (U"Behaviour")
+NORMAL (U"Only the contents of the part of the Picture window that you selected (the %viewport) "
 	"are written to the PNG file.")
-ENTRY (L"Usage")
-NORMAL (L"To import a PNG file in Word, choose #Insert \\-> #Picture \\-> ##From file...#. "
+ENTRY (U"Usage")
+NORMAL (U"To import a PNG file in Word, choose #Insert \\-> #Picture \\-> ##From file...#. "
 	"Word will create a picture with the same size as the originally selected part of the Picture window (the %viewport).")
 MAN_END
 
-MAN_BEGIN (L"Save as Praat picture file...", L"ppgb", 20110129)
-INTRO (L"A command in the File menu of the @@Picture window at .")
-NORMAL (L"It saves a picture in a format that can be imported into Praat later with @@Read from Praat picture file... at .")
-ENTRY (L"Usage")
-NORMAL (L"With the help of this command, you can transfer the contents of the picture window between computers or even between platforms, "
+MAN_BEGIN (U"Save as Praat picture file...", U"ppgb", 20110129)
+INTRO (U"A command in the File menu of the @@Picture window at .")
+NORMAL (U"It saves a picture in a format that can be imported into Praat later with @@Read from Praat picture file... at .")
+ENTRY (U"Usage")
+NORMAL (U"With the help of this command, you can transfer the contents of the picture window between computers or even between platforms, "
 	"for instance from a Macintosh to a Windows computer.")
 MAN_END
 
-MAN_BEGIN (L"Save as Windows metafile...", L"ppgb", 20140325)
-INTRO (L"A command in the File menu of the @@Picture window@, if you are on Windows.")
-NORMAL (L"It saves the selected part of the picture in an \"enhanced metafile\" (.EMF) format, "
+MAN_BEGIN (U"Save as Windows metafile...", U"ppgb", 20140325)
+INTRO (U"A command in the File menu of the @@Picture window@, if you are on Windows.")
+NORMAL (U"It saves the selected part of the picture in an \"enhanced metafile\" (.EMF) format, "
 	"which can be imported by many Windows programs, like Adobe^\\re Illustrator^\\tm or Microsoft^\\re Word^\\tm.")
-ENTRY (L"Behaviour")
-NORMAL (L"Though all the picture data will be written to the file, "
+ENTRY (U"Behaviour")
+NORMAL (U"Though all the picture data will be written to the file, "
 	"only the part that you selected in the Picture window (the %viewport) may become visible in the other program.")
-ENTRY (L"Usage")
-NORMAL (L"You will not use this command very often, "
+ENTRY (U"Usage")
+NORMAL (U"You will not use this command very often, "
 	"because it is usually easier to copy the selection to the clipboard with the @@Copy to clipboard@ command, "
 	"and `Paste' it into the other program. You may use a metafile instead of the clipboard if the clipboard is too large "
 	"for the other program to read, or if you want to transfer the picture to another computer.")
diff --git a/fon/manual_Sampling.cpp b/fon/manual_Sampling.cpp
index 18921ed..af23319 100644
--- a/fon/manual_Sampling.cpp
+++ b/fon/manual_Sampling.cpp
@@ -1,6 +1,6 @@
 /* manual_Sampling.cpp
  *
- * Copyright (C) 1992-2010,2014 Paul Boersma
+ * Copyright (C) 1992-2010,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,151 +24,151 @@
 void manual_Sampling_init (ManPages me);
 void manual_Sampling_init (ManPages me) {
 
-MAN_BEGIN (L"Get sampling period", L"ppgb", 20140421)
-INTRO (L"A command that becomes available in the #Query menu if you select a @Sound object.")
-NORMAL (L"The Info window will tell you the @@sampling period@ in seconds.")
-ENTRY (L"Usage")
-NORMAL (L"You will not often choose this command with the mouse, "
+MAN_BEGIN (U"Get sampling period", U"ppgb", 20140421)
+INTRO (U"A command that becomes available in the #Query menu if you select a @Sound object.")
+NORMAL (U"The Info window will tell you the @@sampling period@ in seconds.")
+ENTRY (U"Usage")
+NORMAL (U"You will not often choose this command with the mouse, "
 	"since the sampling period is included in the information that you get "
 	"by clicking the #Info button. This command is probably more useful in a Praat script:")
-CODE (L"selectObject: \"Sound hello\"")
-CODE (L"samplingPeriod = Get sampling period")
-ENTRY (L"Details for hackers")
-NORMAL (L"With @Inspect, you can see how the sampling period is stored in a #Sound object: it is the #dx attribute.")
+CODE (U"selectObject: \"Sound hello\"")
+CODE (U"samplingPeriod = Get sampling period")
+ENTRY (U"Details for hackers")
+NORMAL (U"With @Inspect, you can see how the sampling period is stored in a #Sound object: it is the #dx attribute.")
 MAN_END
 
-MAN_BEGIN (L"Get sampling frequency", L"ppgb", 20140421)
-INTRO (L"A command that becomes available in the #Query menu if you select a @Sound object.")
-NORMAL (L"The Info window will tell you the @@sampling frequency@ in hertz.")
-ENTRY (L"Usage")
-NORMAL (L"You will not often choose this command with the mouse, "
+MAN_BEGIN (U"Get sampling frequency", U"ppgb", 20140421)
+INTRO (U"A command that becomes available in the #Query menu if you select a @Sound object.")
+NORMAL (U"The Info window will tell you the @@sampling frequency@ in hertz.")
+ENTRY (U"Usage")
+NORMAL (U"You will not often choose this command with the mouse, "
 	"since the sampling frequency is included in the information that you get "
 	"by clicking the #Info button. This command is probably more useful in a Praat script:")
-CODE (L"selectObject: \"Sound hello\"")
-CODE (L"samplingFrequency = Get sampling frequency")
-ENTRY (L"Algorithm")
-NORMAL (L"The sampling frequency is defined as 1 / (\\De%t), where \\De%t is the @@sampling period at . "
+CODE (U"selectObject: \"Sound hello\"")
+CODE (U"samplingFrequency = Get sampling frequency")
+ENTRY (U"Algorithm")
+NORMAL (U"The sampling frequency is defined as 1 / (\\De%t), where \\De%t is the @@sampling period at . "
 	"See @@Get sampling period at .")
 MAN_END
 
-MAN_BEGIN (L"Get time from sample number...", L"ppgb", 20040420)
-INTRO (L"A command that becomes available in the #Query menu if you select a @Sound or @LongSound object.")
-NORMAL (L"The Info window will tell you the time (in seconds) associated with the sample number that you specify.")
-ENTRY (L"Setting")
-TAG (L"##Sample number")
-DEFINITION (L"the sample number whose time is sought.")
-ENTRY (L"Algorithm")
-NORMAL (L"the result is")
-FORMULA (L"%t__1_ + (%sample_number - 1) \\.c \\De%t")
-NORMAL (L"where %t__1_ is the time associated with the first sample, and \\De%t is the sampling period.")
-ENTRY (L"Details for hackers")
-NORMAL (L"If you select a Sound or LongSound and click @Inspect, "
+MAN_BEGIN (U"Get time from sample number...", U"ppgb", 20040420)
+INTRO (U"A command that becomes available in the #Query menu if you select a @Sound or @LongSound object.")
+NORMAL (U"The Info window will tell you the time (in seconds) associated with the sample number that you specify.")
+ENTRY (U"Setting")
+TAG (U"##Sample number")
+DEFINITION (U"the sample number whose time is sought.")
+ENTRY (U"Algorithm")
+NORMAL (U"the result is")
+FORMULA (U"%t__1_ + (%sample_number - 1) \\.c \\De%t")
+NORMAL (U"where %t__1_ is the time associated with the first sample, and \\De%t is the sampling period.")
+ENTRY (U"Details for hackers")
+NORMAL (U"If you select a Sound or LongSound and click @Inspect, "
 	"you can see how the relation between sample numbers and times is stored in the object: "
 	"%t__1_ is the #x1 attribute, and \\De%t is the #dx attribute.")
 MAN_END
 
-MAN_BEGIN (L"Get sample number from time...", L"ppgb", 20140421)
-INTRO (L"A command that becomes available in the #Query menu if you select a @Sound or @LongSound object.")
-NORMAL (L"The Info window will tell you the sample number belonging to the time that you specify. "
+MAN_BEGIN (U"Get sample number from time...", U"ppgb", 20140421)
+INTRO (U"A command that becomes available in the #Query menu if you select a @Sound or @LongSound object.")
+NORMAL (U"The Info window will tell you the sample number belonging to the time that you specify. "
 	"The result is presented as a real number.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time (in seconds) for which you want to know the sample number.")
-ENTRY (L"Example")
-NORMAL (L"If the sound has a sampling frequency of 10 kHz, the sample number associated with a time of 0.1 seconds "
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time (in seconds) for which you want to know the sample number.")
+ENTRY (U"Example")
+NORMAL (U"If the sound has a sampling frequency of 10 kHz, the sample number associated with a time of 0.1 seconds "
 	"will usually be 1000.5.")
-ENTRY (L"Scripting")
-NORMAL (L"You can use this command to put the nearest sample number into a script variable:")
-CODE (L"selectObject: \"Sound hallo\"")
-CODE (L"sampleNumber = Get sample number from time... 0.1")
-CODE (L"nearestSample = round (sampleNumber)")
-NORMAL (L"In this case, the value will not be written into the Info window. To round down or up, use")
-CODE (L"leftSample = floor (sampleNumber)")
-CODE (L"rightSample = ceiling (sampleNumber)")
-ENTRY (L"Algorithm")
-NORMAL (L"the result is")
-FORMULA (L"1 + (%time \\-- %t__1_) / \\De%t")
-NORMAL (L"where %t__1_ is the time associated with the first sample, and \\De%t is the sampling period.")
-ENTRY (L"Details for hackers")
-NORMAL (L"If you select a Sound or LongSound and click @Inspect, "
+ENTRY (U"Scripting")
+NORMAL (U"You can use this command to put the nearest sample number into a script variable:")
+CODE (U"selectObject: \"Sound hallo\"")
+CODE (U"sampleNumber = Get sample number from time... 0.1")
+CODE (U"nearestSample = round (sampleNumber)")
+NORMAL (U"In this case, the value will not be written into the Info window. To round down or up, use")
+CODE (U"leftSample = floor (sampleNumber)")
+CODE (U"rightSample = ceiling (sampleNumber)")
+ENTRY (U"Algorithm")
+NORMAL (U"the result is")
+FORMULA (U"1 + (%time \\-- %t__1_) / \\De%t")
+NORMAL (U"where %t__1_ is the time associated with the first sample, and \\De%t is the sampling period.")
+ENTRY (U"Details for hackers")
+NORMAL (U"If you select a Sound or LongSound and click @Inspect, "
 	"you can see how the relation between sample numbers and times is stored in the object: "
 	"%t__1_ is the #x1 attribute, and \\De%t is the #dx attribute.")
 MAN_END
 
-MAN_BEGIN (L"Get number of samples", L"ppgb", 20040420)
-INTRO (L"A command that becomes available in the #Query menu if you select a @Sound or @LongSound object.")
-NORMAL (L"The Info window will tell you the total number of time samples in this object.")
-ENTRY (L"Example")
-NORMAL (L"If the sampling frequency is 44100 hertz, a recording with a duration of 60 seconds "
+MAN_BEGIN (U"Get number of samples", U"ppgb", 20040420)
+INTRO (U"A command that becomes available in the #Query menu if you select a @Sound or @LongSound object.")
+NORMAL (U"The Info window will tell you the total number of time samples in this object.")
+ENTRY (U"Example")
+NORMAL (U"If the sampling frequency is 44100 hertz, a recording with a duration of 60 seconds "
 	"will contain 2,646,000 samples.")
-ENTRY (L"Details for hackers")
-NORMAL (L"If you select a Sound or LongSound and click @Inspect, "
+ENTRY (U"Details for hackers")
+NORMAL (U"If you select a Sound or LongSound and click @Inspect, "
 	"you can see how the number of samples is stored in the object: it is the #nx attribute.")
 MAN_END
 
-MAN_BEGIN (L"Get time from frame number...", L"ppgb", 20040420)
-INTRO (L"A command that becomes available in the #Query menu if you select a sound-analysis object that is a function of time "
+MAN_BEGIN (U"Get time from frame number...", U"ppgb", 20040420)
+INTRO (U"A command that becomes available in the #Query menu if you select a sound-analysis object that is a function of time "
 	"and that is evenly sampled in time (@Pitch, @Formant, @Intensity, @Harmonicity).")
-NORMAL (L"The Info window will tell you the time associated with the frame number that you specify.")
-ENTRY (L"Setting")
-TAG (L"##Frame number")
-DEFINITION (L"the frame number whose time is sought.")
-ENTRY (L"Algorithm")
-NORMAL (L"the result is")
-FORMULA (L"%t__1_ + (%frame_number - 1) \\.c \\De%t")
-NORMAL (L"where %t__1_ is the time associated with the centre of the first frame, and \\De%t is the time step.")
-ENTRY (L"Details for hackers")
-NORMAL (L"If you select one of the above objects and click @Inspect, "
+NORMAL (U"The Info window will tell you the time associated with the frame number that you specify.")
+ENTRY (U"Setting")
+TAG (U"##Frame number")
+DEFINITION (U"the frame number whose time is sought.")
+ENTRY (U"Algorithm")
+NORMAL (U"the result is")
+FORMULA (U"%t__1_ + (%frame_number - 1) \\.c \\De%t")
+NORMAL (U"where %t__1_ is the time associated with the centre of the first frame, and \\De%t is the time step.")
+ENTRY (U"Details for hackers")
+NORMAL (U"If you select one of the above objects and click @Inspect, "
 	"you can see how the relation between frame numbers and times is stored in the object: "
 	"%t__1_ is the #x1 attribute, and \\De%t is the #dx attribute.")
 MAN_END
 
-MAN_BEGIN (L"Get frame number from time...", L"ppgb", 20140421)
-INTRO (L"A command that becomes available in the #Query menu if you select a sound-analysis object that is a function of time "
+MAN_BEGIN (U"Get frame number from time...", U"ppgb", 20140421)
+INTRO (U"A command that becomes available in the #Query menu if you select a sound-analysis object that is a function of time "
 	"and that is evenly sampled in time (@Pitch, @Formant, @Intensity, @Harmonicity).")
-NORMAL (L"The Info window will tell you the frame number belonging to the time that you specify. "
+NORMAL (U"The Info window will tell you the frame number belonging to the time that you specify. "
 	"The result is presented as a real number.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time (in seconds) for which you want to know the frame number.")
-ENTRY (L"Example")
-NORMAL (L"If the Pitch object has a time step of 10 ms, and the first frame is centred around 18 ms, "
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time (in seconds) for which you want to know the frame number.")
+ENTRY (U"Example")
+NORMAL (U"If the Pitch object has a time step of 10 ms, and the first frame is centred around 18 ms, "
 	"the frame number associated with a time of 0.1 seconds is 9.2.")
-ENTRY (L"Scripting")
-NORMAL (L"You can use this command to put the nearest frame centre into a script variable:")
-CODE (L"selectObject: \"Pitch hallo\"")
-CODE (L"frame = Get frame from time... 0.1")
-CODE (L"nearestFrame = round (frame)")
-NORMAL (L"In this case, the value will not be written into the Info window. To round down or up, use")
-CODE (L"leftFrame = floor (frame)")
-CODE (L"rightFrame = ceiling (frame)")
-ENTRY (L"Algorithm")
-NORMAL (L"the result is")
-FORMULA (L"1 + (%time \\-- %t__1_) / \\De%t")
-NORMAL (L"where %t__1_ is the time associated with the centre of the first frame, "
+ENTRY (U"Scripting")
+NORMAL (U"You can use this command to put the nearest frame centre into a script variable:")
+CODE (U"selectObject: \"Pitch hallo\"")
+CODE (U"frame = Get frame from time... 0.1")
+CODE (U"nearestFrame = round (frame)")
+NORMAL (U"In this case, the value will not be written into the Info window. To round down or up, use")
+CODE (U"leftFrame = floor (frame)")
+CODE (U"rightFrame = ceiling (frame)")
+ENTRY (U"Algorithm")
+NORMAL (U"the result is")
+FORMULA (U"1 + (%time \\-- %t__1_) / \\De%t")
+NORMAL (U"where %t__1_ is the time associated with the centre of the first frame, "
 	"and \\De%t is the time step.")
-ENTRY (L"Details for hackers")
-NORMAL (L"If you select one of the above objects and click @Inspect, "
+ENTRY (U"Details for hackers")
+NORMAL (U"If you select one of the above objects and click @Inspect, "
 	"you can see how the relation between frame numbers and times is stored in the object: "
 	"%t__1_ is the #x1 attribute, and \\De%t is the #dx attribute.")
 MAN_END
 
-MAN_BEGIN (L"Get time step", L"ppgb", 20040420)
-INTRO (L"A command that becomes available in the #Query menu if you select a sound-analysis object that is a function of time "
+MAN_BEGIN (U"Get time step", U"ppgb", 20040420)
+INTRO (U"A command that becomes available in the #Query menu if you select a sound-analysis object that is a function of time "
 	"and that is evenly sampled in time (@Pitch, @Formant, @Intensity, @Harmonicity).")
-NORMAL (L"The Info window will tell you the time difference between consecutive frames, e.g. "
+NORMAL (U"The Info window will tell you the time difference between consecutive frames, e.g. "
 	"the time difference between consecutive formant circles in the sound editor window.")
-ENTRY (L"Details for hackers")
-NORMAL (L"If you select one of the above objects and click @Inspect, "
+ENTRY (U"Details for hackers")
+NORMAL (U"If you select one of the above objects and click @Inspect, "
 	"you can see how the time step is stored in the object: it is the #dx attribute.")
 MAN_END
 
-MAN_BEGIN (L"Get number of frames", L"ppgb", 20040420)
-INTRO (L"A command that becomes available in the #Query menu if you select a sound-analysis object that is a function of time "
+MAN_BEGIN (U"Get number of frames", U"ppgb", 20040420)
+INTRO (U"A command that becomes available in the #Query menu if you select a sound-analysis object that is a function of time "
 	"and that is evenly sampled in time (@Pitch, @Formant, @Intensity, @Harmonicity).")
-NORMAL (L"The Info window will tell you the total number of time frames in the object.")
-ENTRY (L"Details for hackers")
-NORMAL (L"If you select one of the above objects and click @Inspect, "
+NORMAL (U"The Info window will tell you the total number of time frames in the object.")
+ENTRY (U"Details for hackers")
+NORMAL (U"If you select one of the above objects and click @Inspect, "
 	"you can see how the number of frames is stored in the object: it is the #nx attribute.")
 MAN_END
 
diff --git a/fon/manual_Script.cpp b/fon/manual_Script.cpp
index 898f71d..217da7f 100644
--- a/fon/manual_Script.cpp
+++ b/fon/manual_Script.cpp
@@ -1,6 +1,6 @@
 /* manual_Script.cpp
  *
- * Copyright (C) 1992-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,1166 +23,1166 @@
 void manual_Script_init (ManPages me);
 void manual_Script_init (ManPages me) {
 
-MAN_BEGIN (L"Action commands", L"ppgb", 20110129)
-INTRO (L"The commands in the @@Dynamic menu@ of the @@Object window at .")
-NORMAL (L"These commands are only available if the right kinds of objects are selected. They are shown in a scrollable list, "
+MAN_BEGIN (U"Action commands", U"ppgb", 20110129)
+INTRO (U"The commands in the @@Dynamic menu@ of the @@Object window at .")
+NORMAL (U"These commands are only available if the right kinds of objects are selected. They are shown in a scrollable list, "
 	"or in the #Save menu if they start with \"Save as \" or \"Append to \".")
 MAN_END
 
-MAN_BEGIN (L"Add action command...", L"ppgb", 20060920)
-INTRO (L"One of the hidden commands in the #Praat menu of the @@Object window at . "
+MAN_BEGIN (U"Add action command...", U"ppgb", 20060920)
+INTRO (U"One of the hidden commands in the #Praat menu of the @@Object window at . "
 	"With this command, you add a button to the dynamic menu in the Object window.")
-ENTRY (L"Settings")
-NORMAL (L"See @@Add to dynamic menu... at .")
-ENTRY (L"Usage")
-NORMAL (L"You can use this command in your @@initialization script@ or in @@plug-ins at .")
-NORMAL (L"Normally, however, if you want to add a command to the dynamic menu, "
+ENTRY (U"Settings")
+NORMAL (U"See @@Add to dynamic menu... at .")
+ENTRY (U"Usage")
+NORMAL (U"You can use this command in your @@initialization script@ or in @@plug-ins at .")
+NORMAL (U"Normally, however, if you want to add a command to the dynamic menu, "
 	"you would use the command @@Add to dynamic menu...@ of the @ScriptEditor instead.")
 MAN_END
 
-MAN_BEGIN (L"Add menu command...", L"ppgb", 20060920)
-INTRO (L"One of the hidden commands in the #Praat menu of the @@Object window at . "
+MAN_BEGIN (U"Add menu command...", U"ppgb", 20060920)
+INTRO (U"One of the hidden commands in the #Praat menu of the @@Object window at . "
 	"With this command, you add a button to any of the fixed menus in the Object or Picture window.")
-ENTRY (L"Settings")
-NORMAL (L"See @@Add to fixed menu... at .")
-ENTRY (L"Usage")
-NORMAL (L"You can use this command in your @@initialization script@ or in @@plug-ins at .")
-NORMAL (L"Normally, however, if you want to add a command to a fixed menu, "
+ENTRY (U"Settings")
+NORMAL (U"See @@Add to fixed menu... at .")
+ENTRY (U"Usage")
+NORMAL (U"You can use this command in your @@initialization script@ or in @@plug-ins at .")
+NORMAL (U"Normally, however, if you want to add a command to a fixed menu, "
 	"you would use the command @@Add to fixed menu...@ of the @ScriptEditor instead.")
 MAN_END
 
-MAN_BEGIN (L"Add to dynamic menu...", L"ppgb", 20140107)
-INTRO (L"A command in the #File menu of the @ScriptEditor.")
-NORMAL (L"With this command, you add a button to the dynamic menu in the @@Object window at . "
+MAN_BEGIN (U"Add to dynamic menu...", U"ppgb", 20140107)
+INTRO (U"A command in the #File menu of the @ScriptEditor.")
+NORMAL (U"With this command, you add a button to the dynamic menu in the @@Object window at . "
 	"This button will only be visible if the specified combination of objects is selected. "
 	"Clicking the button will invoke the specified @@Praat script at .")
-ENTRY (L"Settings")
-TAG (L"%%Class 1")
-DEFINITION (L"the name of the class of the object to be selected. "
+ENTRY (U"Settings")
+TAG (U"%%Class 1")
+DEFINITION (U"the name of the class of the object to be selected. "
 	"For instance, if a button should only appear if the user selects a Sound, this would be \"Sound\".")
-TAG (L"%%Number 1")
-DEFINITION (L"the number of objects of %class1 that have to be selected. For most built-in commands, this number is unspecified (0); "
+TAG (U"%%Number 1")
+DEFINITION (U"the number of objects of %class1 that have to be selected. For most built-in commands, this number is unspecified (0); "
 	"e.g., the user can choose #Draw... or ##To Spectrum# regardless of whether she selected 1, 2, 3, or more Sound objects. "
 	"If the number of selected objects is different from %number1, the button will be visible but insensitive.")
-TAG (L"%%Class 2")
-DEFINITION (L"the name of the class of the second object to be selected, different from %class1. "
+TAG (U"%%Class 2")
+DEFINITION (U"the name of the class of the second object to be selected, different from %class1. "
 	"Normally the empty string (\"\").")
-TAG (L"%%Number 2")
-DEFINITION (L"the number of selected objects of %class2.")
-TAG (L"%%Class 3")
-DEFINITION (L"the name of the class of the third object to be selected, different from %class1 and %class2. "
+TAG (U"%%Number 2")
+DEFINITION (U"the number of selected objects of %class2.")
+TAG (U"%%Class 3")
+DEFINITION (U"the name of the class of the third object to be selected, different from %class1 and %class2. "
 	"Normally the empty string (\"\").")
-TAG (L"%%Number 3")
-DEFINITION (L"the number of selected objects of %class3.")
-TAG (L"%%Command")
-DEFINITION (L"the title of the new command button (or label, or submenu title). "
+TAG (U"%%Number 3")
+DEFINITION (U"the number of selected objects of %class3.")
+TAG (U"%%Command")
+DEFINITION (U"the title of the new command button (or label, or submenu title). "
 	"To get a separator line instead of a command text (only in a submenu), "
 	"you specify a unique string that starts with a hyphen ('-'); the @ButtonEditor may contain some examples of this. "
 	"If the command starts with \"Save as \", it will be placed in the @@Save menu at .")
-TAG (L"%%After command")
-DEFINITION (L"a button title in the dynamic menu or submenu where you want your new button. "
+TAG (U"%%After command")
+DEFINITION (U"a button title in the dynamic menu or submenu where you want your new button. "
 	"If you specify the empty string (\"\"), your button will be put at the bottom. "
 	"You can specify a push button, a label (subheader), or a cascade button (submenu title) here.")
-TAG (L"%%Depth")
-DEFINITION (L"0 if you want your button in the main menu, 1 if you want it in a submenu.")
-TAG (L"%%Script")
-DEFINITION (L"the full path name of the script to invoke. If you saved the script you are editing, "
+TAG (U"%%Depth")
+DEFINITION (U"0 if you want your button in the main menu, 1 if you want it in a submenu.")
+TAG (U"%%Script")
+DEFINITION (U"the full path name of the script to invoke. If you saved the script you are editing, "
 	"its name will already have been filled in here. "
 	"If you do not specify a script, you will get a separating label or cascading menu title instead, "
 	"depending on the %depth of the following command.")
-ENTRY (L"Example")
-NORMAL (L"If one object of class Sound is selected, you want a submenu called \"Filters\" "
+ENTRY (U"Example")
+NORMAL (U"If one object of class Sound is selected, you want a submenu called \"Filters\" "
 	"after the #Convolve button, containing the commands \"Autocorrelation\" and \"Band filter...\", "
 	"separated by a horizontal separator line:")
-CODE (L"Add to dynamic menu: \"Sound\", 0, \"\", 0, \"\", 0, \"Filters -\", \"Convolve\", 0, \"\"")
-CODE (L"Add to dynamic menu: \"Sound\", 1, \"\", 0, \"\", 0, \"Autocorrelation\", \"Filters -\", 1, \"/u/praats/demo/autocorrelation.praat\"")
-CODE (L"Add to dynamic menu: \"Sound\", 0, \"\", 0, \"\", 0, \"-- band filter --\", \"Autocorrelation\", 1, \"\"")
-CODE (L"Add to dynamic menu: \"Sound\", 1, \"\", 0, \"\", 0, \"Band filter...\", \"-- band filter --\", 1, \"/u/praats/demo/bandFilter.praat\"")
-NORMAL (L"Note that \"Filters -\" will be a submenu title, %because it is followed by subcommands (%depth 1). "
+CODE (U"Add to dynamic menu: \"Sound\", 0, \"\", 0, \"\", 0, \"Filters -\", \"Convolve\", 0, \"\"")
+CODE (U"Add to dynamic menu: \"Sound\", 1, \"\", 0, \"\", 0, \"Autocorrelation\", \"Filters -\", 1, \"/u/praats/demo/autocorrelation.praat\"")
+CODE (U"Add to dynamic menu: \"Sound\", 0, \"\", 0, \"\", 0, \"-- band filter --\", \"Autocorrelation\", 1, \"\"")
+CODE (U"Add to dynamic menu: \"Sound\", 1, \"\", 0, \"\", 0, \"Band filter...\", \"-- band filter --\", 1, \"/u/praats/demo/bandFilter.praat\"")
+NORMAL (U"Note that \"Filters -\" will be a submenu title, %because it is followed by subcommands (%depth 1). "
 	"Note that %number1 is 1 only for the executable buttons; for the cascade button and the separator line, "
 	"this number is ignored.")
-ENTRY (L"Usage convention")
-NORMAL (L"Please adhere to the convention that command that take arguments, such as \"Band filter...\" above, end in three dots.")
-ENTRY (L"Using this command in a script")
-NORMAL (L"To add a dynamic button from a script (perhaps your @@initialization script@ or a @@plug-ins|plug-in@), "
+ENTRY (U"Usage convention")
+NORMAL (U"Please adhere to the convention that command that take arguments, such as \"Band filter...\" above, end in three dots.")
+ENTRY (U"Using this command in a script")
+NORMAL (U"To add a dynamic button from a script (perhaps your @@initialization script@ or a @@plug-ins|plug-in@), "
 	"use the hidden shell command @@Add action command...@ instead.")
 MAN_END
 
-MAN_BEGIN (L"Add to fixed menu...", L"ppgb", 20140107)
-INTRO (L"A command in the #File menu of the @ScriptEditor.")
-NORMAL (L"With this command, you add a button to any fixed menu in the @@Object window@ or in the @@Picture window at . "
+MAN_BEGIN (U"Add to fixed menu...", U"ppgb", 20140107)
+INTRO (U"A command in the #File menu of the @ScriptEditor.")
+NORMAL (U"With this command, you add a button to any fixed menu in the @@Object window@ or in the @@Picture window at . "
 	"Clicking the added button will invoke the specified @@Praat script at .")
-ENTRY (L"Settings")
-TAG (L"%Window")
-DEFINITION (L"the name of the window (\"Objects\" or \"Picture\") that contains the menu that you want to change.")
-TAG (L"%Menu")
-DEFINITION (L"the title of the menu that you want to change. If %window is \"Objects\", you can specify "
+ENTRY (U"Settings")
+TAG (U"%Window")
+DEFINITION (U"the name of the window (\"Objects\" or \"Picture\") that contains the menu that you want to change.")
+TAG (U"%Menu")
+DEFINITION (U"the title of the menu that you want to change. If %window is \"Objects\", you can specify "
 	"the #Praat, #New, #Open, #Help, #Goodies, #Preferences, or #Technical menu (for the #Save menu, which depends on the objects selected, "
 	"you would use @@Add to dynamic menu...@ instead). If %window is \"Picture\", you can specify "
 	"the #File, #Edit, #Margins, #World, #Select, #Pen, #Font, or #Help menu.")
-TAG (L"%Command")
-DEFINITION (L"the title of the new menu button. To get a separator line instead of a command text, "
+TAG (U"%Command")
+DEFINITION (U"the title of the new menu button. To get a separator line instead of a command text, "
 	"you specify a unique string that starts with a hyphen ('-'); the @ButtonEditor contains many examples of this.")
-TAG (L"%%After command")
-DEFINITION (L"a button title in the menu or submenu after which you want your new button to be inserted. "
+TAG (U"%%After command")
+DEFINITION (U"a button title in the menu or submenu after which you want your new button to be inserted. "
 	"If you specify the empty string (\"\"), your button will be put in the main menu.")
-TAG (L"%Depth")
-DEFINITION (L"0 if you want your button in the main menu, 1 if you want it in a submenu.")
-TAG (L"%Script")
-DEFINITION (L"the full path name of the script to invoke. If you saved the script you are editing, "
+TAG (U"%Depth")
+DEFINITION (U"0 if you want your button in the main menu, 1 if you want it in a submenu.")
+TAG (U"%Script")
+DEFINITION (U"the full path name of the script to invoke. If you saved the script you are editing, "
 	"its name will already have been filled in here. If you do not specify a script, "
 	"you will get a cascading menu title instead.")
-ENTRY (L"Example 1")
-NORMAL (L"In the #Matrix submenu of the @@New menu@, you want a separator line followed by the command \"Peaks\":")
-CODE (L"Add to fixed menu: \"Objects\", \"New\", \"-- peaks --\", \"Create simple Matrix...\", 1, \"\"")
-CODE (L"Add to fixed menu: \"Objects\", \"New\", \"Peaks\", \"-- peaks --\", 1, \"/u/praats/demo/peaks.praat\"")
-ENTRY (L"Example 2")
-NORMAL (L"In the @@New menu@, you want a submenu called \"Demo\", with a subitem titled \"Lorenz...\":")
-CODE (L"Add to fixed menu: \"Objects\", \"New\", \"Demo\", \"\", 0,, \"\"")
-CODE (L"Add to fixed menu: \"Objects\", \"New\", \"Lorenz...\", \"Demo\", 1, \"/u/praats/demo/lorentz.praat\"")
-ENTRY (L"Usage convention")
-NORMAL (L"Please adhere to the convention that command that take arguments, such as \"Lorenz...\" above, end in three dots.")
-ENTRY (L"Using this command in a script")
-NORMAL (L"To add a fixed button from a script (perhaps your @@initialization script@ or a @@plug-ins|plug-in@), "
+ENTRY (U"Example 1")
+NORMAL (U"In the #Matrix submenu of the @@New menu@, you want a separator line followed by the command \"Peaks\":")
+CODE (U"Add to fixed menu: \"Objects\", \"New\", \"-- peaks --\", \"Create simple Matrix...\", 1, \"\"")
+CODE (U"Add to fixed menu: \"Objects\", \"New\", \"Peaks\", \"-- peaks --\", 1, \"/u/praats/demo/peaks.praat\"")
+ENTRY (U"Example 2")
+NORMAL (U"In the @@New menu@, you want a submenu called \"Demo\", with a subitem titled \"Lorenz...\":")
+CODE (U"Add to fixed menu: \"Objects\", \"New\", \"Demo\", \"\", 0,, \"\"")
+CODE (U"Add to fixed menu: \"Objects\", \"New\", \"Lorenz...\", \"Demo\", 1, \"/u/praats/demo/lorentz.praat\"")
+ENTRY (U"Usage convention")
+NORMAL (U"Please adhere to the convention that command that take arguments, such as \"Lorenz...\" above, end in three dots.")
+ENTRY (U"Using this command in a script")
+NORMAL (U"To add a fixed button from a script (perhaps your @@initialization script@ or a @@plug-ins|plug-in@), "
 	"use the hidden shell command @@Add menu command...@ instead.")
 MAN_END
 
-MAN_BEGIN (L"binomialQ", L"ppgb", 20140223)
-INTRO (L"A function that can be used in @@Formulas at . The complement of the cumulative binomial distribution.")
-ENTRY (L"Syntax")
-TAG (L"$$binomialQ (%p, %k, %n)")
-DEFINITION (L"the probability that in %n trials an event with probability %p will occur at least %k times.")
-ENTRY (L"Calculator example")
-NORMAL (L"A die is suspected to yield more sixes than a perfect die would do. In order to test this suspicion, "
+MAN_BEGIN (U"binomialQ", U"ppgb", 20140223)
+INTRO (U"A function that can be used in @@Formulas at . The complement of the cumulative binomial distribution.")
+ENTRY (U"Syntax")
+TAG (U"$$binomialQ (%p, %k, %n)")
+DEFINITION (U"the probability that in %n trials an event with probability %p will occur at least %k times.")
+ENTRY (U"Calculator example")
+NORMAL (U"A die is suspected to yield more sixes than a perfect die would do. In order to test this suspicion, "
 	"you throw it 1,000 times. The result is 211 sixes.")
-NORMAL (L"The probability that a perfect die yields at least 211 sixes is, according to @@Calculator...@, "
+NORMAL (U"The probability that a perfect die yields at least 211 sixes is, according to @@Calculator...@, "
 	"$$binomialQ (1/6, 211, 1000)$ = 0.000152.")
-ENTRY (L"Script example")
-NORMAL (L"You convert 1000 values of pitch targets in Hz to the nearest note on the piano keyboard. "
+ENTRY (U"Script example")
+NORMAL (U"You convert 1000 values of pitch targets in Hz to the nearest note on the piano keyboard. "
 	"597 of those values turn out to be in the A, B, C, D, E, F, or G regions (the white keys), and 403 values turn out "
 	"to be in the A\\# , C\\# , D\\# , F\\# , or G\\#  regions (the black keys). "
 	"Do our subjects have a preference for the white keys? "
 	"The following script computes the probability that in the case of no preference the subjects "
 	"would target the white keys at least 597 times. This is compared with a %\\ci^2 test.")
-CODE (L"a = 597")
-CODE (L"b = 403")
-CODE (L"p = 7/12 ; no preference")
-CODE (L"writeInfoLine: \"*** Binomial test \", a, \", \", b, \", p = \", fixed\\$  (p, 6), \" ***\"")
-CODE (L"pbin = binomialQ (p, a, a+b)")
-CODE (L"appendInfoLine: \"P (binomial) = \", fixed\\$  (pbin, 6)")
-CODE (L"\\#  Chi-square test with Yates correction:")
-CODE (L"x2 = (a - 1/2 - p * (a+b))\\^ 2/(p*(a+b)) + (b + 1/2 - (1-p) * (a+b))\\^ 2/((1-p)*(a+b))")
-CODE (L"px2 = chiSquareQ (x2, 1)")
-CODE (L"appendInfoLine: \"P (chi-square) = \", fixed\\$  (px2, 6)")
-NORMAL (L"The result is:")
-CODE (L"*** Binomial test 597, 403, p = 0.583333 ***")
-CODE (L"P (binomial) = 0.199330")
-CODE (L"P (chi-square) = 0.398365")
-NORMAL (L"The %\\ci^2 test is two-sided (it signals a preference for the white or for the black keys), "
+CODE (U"a = 597")
+CODE (U"b = 403")
+CODE (U"p = 7/12 ; no preference")
+CODE (U"writeInfoLine: \"*** Binomial test \", a, \", \", b, \", p = \", fixed\\$  (p, 6), \" ***\"")
+CODE (U"pbin = binomialQ (p, a, a+b)")
+CODE (U"appendInfoLine: \"P (binomial) = \", fixed\\$  (pbin, 6)")
+CODE (U"\\#  Chi-square test with Yates correction:")
+CODE (U"x2 = (a - 1/2 - p * (a+b))\\^ 2/(p*(a+b)) + (b + 1/2 - (1-p) * (a+b))\\^ 2/((1-p)*(a+b))")
+CODE (U"px2 = chiSquareQ (x2, 1)")
+CODE (U"appendInfoLine: \"P (chi-square) = \", fixed\\$  (px2, 6)")
+NORMAL (U"The result is:")
+CODE (U"*** Binomial test 597, 403, p = 0.583333 ***")
+CODE (U"P (binomial) = 0.199330")
+CODE (U"P (chi-square) = 0.398365")
+NORMAL (U"The %\\ci^2 test is two-sided (it signals a preference for the white or for the black keys), "
 	"so it has twice the probability of the binomial test.")
-NORMAL (L"We cannot conclude from this test that people have a preference for the white keys. "
+NORMAL (U"We cannot conclude from this test that people have a preference for the white keys. "
 	"Of course, we cannot conclude either that people do not have such a preference.")
 MAN_END
 
-MAN_BEGIN (L"ButtonEditor", L"ppgb", 20060920)
-INTRO (L"An editor for viewing, hiding, showing, removing, and executing the commands "
+MAN_BEGIN (U"ButtonEditor", U"ppgb", 20060920)
+INTRO (U"An editor for viewing, hiding, showing, removing, and executing the commands "
 	"in the fixed and dynamic menus of the Praat program. To open it, choose ##Buttons...# "
 	"from the #Praat menu of the @@Object window at .")
-ENTRY (L"What the button editor shows")
-NORMAL (L"The button editor gives a list of:")
-LIST_ITEM (L"1. The five fixed buttons.")
-LIST_ITEM (L"2. The built-in and added @@fixed menu commands@, lexicographically sorted by window and menu name.")
-LIST_ITEM (L"3. The built-in and added @@action commands@, sorted by the names of the selected objects.")
-ENTRY (L"Visibility of built-in commands")
-NORMAL (L"Most built-in commands are visible by default, but some are hidden by default (see @@Hidden commands@). "
+ENTRY (U"What the button editor shows")
+NORMAL (U"The button editor gives a list of:")
+LIST_ITEM (U"1. The five fixed buttons.")
+LIST_ITEM (U"2. The built-in and added @@fixed menu commands@, lexicographically sorted by window and menu name.")
+LIST_ITEM (U"3. The built-in and added @@action commands@, sorted by the names of the selected objects.")
+ENTRY (U"Visibility of built-in commands")
+NORMAL (U"Most built-in commands are visible by default, but some are hidden by default (see @@Hidden commands@). "
 	"The button editor shows these commands as \"shown\" or \"hidden\", respectively. "
 	"You can change the visibility of a command by clicking on the blue \"shown\" or \"hidden\" text; "
 	"this text will then be replaced with \"HIDDEN\" or \"SHOWN\", with capitals to signal their non-standard settings. "
 	"These changes will be remembered in the @@buttons file@ across sessions of your program. "
 	"To return to the standard settings, click the blue \"HIDDEN\" or \"SHOWN\" texts again.")
-NORMAL (L"Some built-in commands cannot be hidden. They are marked as \"unhidable\". "
+NORMAL (U"Some built-in commands cannot be hidden. They are marked as \"unhidable\". "
 	"The most notable example is the ##Buttons...# button "
 	"(a failure to make the ##Commands...# command unhidable in Microsoft Word "
 	"causes some computer viruses to be very hard to remove...).")
-ENTRY (L"Added commands")
-NORMAL (L"Commands that you have added to the fixed or dynamic menus (probably with @@Add to fixed menu...@ or "
+ENTRY (U"Added commands")
+NORMAL (U"Commands that you have added to the fixed or dynamic menus (probably with @@Add to fixed menu...@ or "
 	"@@Add to dynamic menu...@ in the @ScriptEditor), "
 	"are marked as \"ADDED\". They are remembered in the @@buttons file at . "
 	"You can change the availability of these commands by clicking on the blue \"ADDED\" text, which will then "
 	"be replaced with \"REMOVED\". After this, the added command will no longer be remembered in the @@buttons file at . "
 	"To make the command available again, click the blue \"REMOVED\" text again, before leaving the program.")
-ENTRY (L"Start-up commands")
-NORMAL (L"Commands that were added in an @@initialization script@ or @@plug-ins|plug-in@ (with @@Add menu command...@ or "
+ENTRY (U"Start-up commands")
+NORMAL (U"Commands that were added in an @@initialization script@ or @@plug-ins|plug-in@ (with @@Add menu command...@ or "
 	"@@Add action command...@) are marked as \"START-UP\". "
 	"They are %not remembered in the @@buttons file at . "
 	"You can change the visibility of these commands by clicking on the blue \"START-UP\" text, which will then "
 	"be replaced with \"HIDDEN\". This setting %will be remembered in the @@buttons file at . "
 	"To make the command visible again, click the blue \"HIDDEN\" text again.")
-ENTRY (L"Executing commands")
-NORMAL (L"The button editor allows you to choose hidden commands without first making them visible in the fixed or dynamic menus.")
-NORMAL (L"The editor shows all the executable commands in blue. These include:")
-LIST_ITEM (L"1. The fixed #Remove button, if one or more objects are selected in the @@List of Objects at .")
-LIST_ITEM (L"2. The other fixed buttons, if exactly one object is selected.")
-LIST_ITEM (L"3. All of the fixed menu commands, hidden or not, and \"removed\" or not.")
-LIST_ITEM (L"4. Those action commands that match the currently selected objects with respect to class and number.")
-NORMAL (L"To execute any of these blue commands, just click on it.")
-MAN_END
-
-MAN_BEGIN (L"buttons file", L"ppgb", 20071204)
-NORMAL (L"The file into which changes in the availability and visibility of commands in the fixed "
+ENTRY (U"Executing commands")
+NORMAL (U"The button editor allows you to choose hidden commands without first making them visible in the fixed or dynamic menus.")
+NORMAL (U"The editor shows all the executable commands in blue. These include:")
+LIST_ITEM (U"1. The fixed #Remove button, if one or more objects are selected in the @@List of Objects at .")
+LIST_ITEM (U"2. The other fixed buttons, if exactly one object is selected.")
+LIST_ITEM (U"3. All of the fixed menu commands, hidden or not, and \"removed\" or not.")
+LIST_ITEM (U"4. Those action commands that match the currently selected objects with respect to class and number.")
+NORMAL (U"To execute any of these blue commands, just click on it.")
+MAN_END
+
+MAN_BEGIN (U"buttons file", U"ppgb", 20151020)
+NORMAL (U"The file into which changes in the availability and visibility of commands in the fixed "
 	"and dynamic menus are recorded.")
-NORMAL (L"The buttons file is written to disk when you quit Praat, "
+NORMAL (U"The buttons file is written to disk when you quit Praat, "
 	"and it is read again when you start Praat the next time. It is a simple @@Praat script@ that you can read "
 	"(but should not edit) with any text editor.")
-ENTRY (L"Adding buttons")
-NORMAL (L"To add a command to a fixed or dynamic menu, you typically use the @ScriptEditor.")
-ENTRY (L"Removing buttons")
-NORMAL (L"To remove an added command from a fixed or dynamic menu, you typically use the @ButtonEditor.")
-ENTRY (L"Hiding and showing buttons")
-NORMAL (L"To hide a built-in command from a fixed or dynamic menu, or to make a hidden command visible, "
+ENTRY (U"Adding buttons")
+NORMAL (U"To add a command to a fixed or dynamic menu, you typically use the @ScriptEditor.")
+ENTRY (U"Removing buttons")
+NORMAL (U"To remove an added command from a fixed or dynamic menu, you typically use the @ButtonEditor.")
+ENTRY (U"Hiding and showing buttons")
+NORMAL (U"To hide a built-in command from a fixed or dynamic menu, or to make a hidden command visible, "
 	"you typically use the @ButtonEditor.")
-ENTRY (L"Where is the buttons file?")
-NORMAL (L"The buttons file is in your Praat @@preferences directory at .")
-NORMAL (L"On Unix the file is called #buttons5, "
-	"for instance ##/people/miep/.praat-dir/buttons5#.")
-NORMAL (L"On Macintosh it is called #Buttons5, "
+ENTRY (U"Where is the buttons file?")
+NORMAL (U"The buttons file is in your Praat @@preferences directory at .")
+NORMAL (U"On Windows the file is called ##Buttons5.ini#, "
+	"for instance ##C:\\bsUsers\\bsMiep\\bsPraat\\bsButtons5.ini#.")
+NORMAL (U"On MacOS it is called #Buttons5, "
 	"for instance ##/Users/miep/Library/Preferences/Praat Prefs/Buttons5#.")
-NORMAL (L"On Windows it is called ##Buttons5.ini#, "
-	"for instance ##C:\\bsDocuments and Settings\\bsMiep\\bsPraat\\bsButtons5.ini#.")
+NORMAL (U"On Linux it is called #buttons5, "
+	"for instance ##/home/miep/.praat-dir/buttons5#.")
 MAN_END
 
-MAN_BEGIN (L"Calculator", L"ppgb", 20021201)
-INTRO (L"A window that allows you to calculate all kinds of simple or complicated mathematical and string expressions. "
+MAN_BEGIN (U"Calculator", U"ppgb", 20021201)
+INTRO (U"A window that allows you to calculate all kinds of simple or complicated mathematical and string expressions. "
 	"To show the calculator, type Command-U or choose the @@Calculator...@ command. "
 	"The result will be written to the Info window.")
-NORMAL (L"See the @Formulas tutorial for all the things that you can calculate with this command.")
+NORMAL (U"See the @Formulas tutorial for all the things that you can calculate with this command.")
 MAN_END
 
-MAN_BEGIN (L"Calculator...", L"ppgb", 20050822)
-INTRO (L"A command in the @Goodies submenu of the @@Praat menu@ of the @@Object window at . Shortcut: Command-U. "
+MAN_BEGIN (U"Calculator...", U"ppgb", 20050822)
+INTRO (U"A command in the @Goodies submenu of the @@Praat menu@ of the @@Object window at . Shortcut: Command-U. "
 	"Choosing this command brings up Praat's @calculator.")
 MAN_END
 
-MAN_BEGIN (L"Clear history", L"ppgb", 20000927)
-INTRO (L"A command in the #Edit menu of the @ScriptEditor for clearing the remembered history. "
+MAN_BEGIN (U"Clear history", U"ppgb", 20000927)
+INTRO (U"A command in the #Edit menu of the @ScriptEditor for clearing the remembered history. "
 	"See @@History mechanism at .")
 MAN_END
 
-MAN_BEGIN (L"differenceLimensToPhon", L"ppgb", 20021215)
-INTRO (L"A routine for converting intensity difference limens into sensation level, "
+MAN_BEGIN (U"differenceLimensToPhon", U"ppgb", 20021215)
+INTRO (U"A routine for converting intensity difference limens into sensation level, "
 	"the inverse of @phonToDifferenceLimens.")
-ENTRY (L"Formula")
-FORMULA (L"differenceLimensToPhon (%ndli) = ln (1 + %ndli / 30) / ln (61 / 60)")
+ENTRY (U"Formula")
+FORMULA (U"differenceLimensToPhon (%ndli) = ln (1 + %ndli / 30) / ln (61 / 60)")
 MAN_END
 
-MAN_BEGIN (L"Fixed menu commands", L"ppgb", 20120915)
-INTRO (L"The commands in the fixed menus of the @@Object window@ (#Praat, #New, #Open, #Help, #Goodies, "
+MAN_BEGIN (U"Fixed menu commands", U"ppgb", 20120915)
+INTRO (U"The commands in the fixed menus of the @@Object window@ (#Praat, #New, #Open, #Help, #Goodies, "
 	"#Preferences, and #Technical) and the @@Picture window@ (#File, #Edit, #Margins, #World, #Select, #Pen, #Font, #Help).")
-NORMAL (L"These commands are always clickable (if not hidden) and scriptable (if not added).")
-MAN_END
-
-MAN_BEGIN (L"Formulas", L"ppgb", 20040414)
-INTRO (L"You can use numeric expressions and string (text) expressions in many places in Praat:")
-LIST_ITEM (L"\\bu in the @calculator in Praat's @Goodies submenu;")
-LIST_ITEM (L"\\bu in the numeric fields of most settings windows;")
-LIST_ITEM (L"\\bu in a @@Praat script at .")
-NORMAL (L"For some types of objects (mainly Sound and Matrix), you can also apply formulas to all their contents at the same time:")
-LIST_ITEM (L"\\bu when you create a Sound or a Matrix from the @@New menu@;")
-LIST_ITEM (L"\\bu when you choose @@Formula...@ from the @Modify menu for a selected object.")
-NORMAL (L"You can read this tutorial sequentially with the help of the \"< 1\" and \"1 >\" buttons.")
-LIST_ITEM (L"1. @@Formulas 1. My first formulas|My first formulas@ (where to use)")
-LIST_ITEM1 (L"1.1. @@Formulas 1.1. Formulas in the calculator|Formulas in the calculator@")
-LIST_ITEM1 (L"1.2. @@Formulas 1.2. Numeric expressions|Numeric expressions@")
-LIST_ITEM1 (L"1.3. @@Formulas 1.3. String expressions|String expressions@")
-LIST_ITEM1 (L"1.4. @@Formulas 1.4. Representation of numbers|Representation of numbers@")
-LIST_ITEM1 (L"1.5. @@Formulas 1.5. Representation of strings|Representation of strings@")
-LIST_ITEM1 (L"1.6. @@Formulas 1.6. Formulas in settings windows|Formulas in settings windows@")
-LIST_ITEM1 (L"1.7. @@Formulas 1.7. Formulas for creation|Formulas for creation@")
-LIST_ITEM1 (L"1.8. @@Formulas 1.8. Formulas for modification|Formulas for modification@")
-LIST_ITEM1 (L"1.9. @@Formulas 1.9. Formulas in scripts|Formulas in scripts@")
-LIST_ITEM (L"2. @@Formulas 2. Operators|Operators@ (+, -, *, /, \\^ )")
-LIST_ITEM (L"3. @@Formulas 3. Constants|Constants@ (pi, e, undefined)")
-LIST_ITEM (L"4. @@Formulas 4. Mathematical functions|Mathematical functions@")
-LIST_ITEM (L"5. @@Formulas 5. String functions|String functions@")
-LIST_ITEM (L"6. @@Formulas 6. Control structures|Control structures@ (if then else fi, semicolon)")
-LIST_ITEM (L"7. @@Formulas 7. Attributes of objects|Attributes of objects@")
-LIST_ITEM (L"8. @@Formulas 8. Data in objects|Data in objects@")
-MAN_END
-
-MAN_BEGIN (L"Formulas 1. My first formulas", L"ppgb", 20040414)
-LIST_ITEM (L"1.1. @@Formulas 1.1. Formulas in the calculator|Formulas in the calculator@")
-LIST_ITEM (L"1.2. @@Formulas 1.2. Numeric expressions|Numeric expressions@")
-LIST_ITEM (L"1.3. @@Formulas 1.3. String expressions|String expressions@")
-LIST_ITEM (L"1.4. @@Formulas 1.4. Representation of numbers|Representation of numbers@")
-LIST_ITEM (L"1.5. @@Formulas 1.5. Representation of strings|Representation of strings@")
-LIST_ITEM (L"1.6. @@Formulas 1.6. Formulas in settings windows|Formulas in settings windows@")
-LIST_ITEM (L"1.7. @@Formulas 1.7. Formulas for creation|Formulas for creation@")
-LIST_ITEM (L"1.8. @@Formulas 1.8. Formulas for modification|Formulas for modification@")
-LIST_ITEM (L"1.9. @@Formulas 1.9. Formulas in scripts|Formulas in scripts@")
-MAN_END
-
-MAN_BEGIN (L"Formulas 1.1. Formulas in the calculator", L"ppgb", 20050822)
-INTRO (L"To use the Praat @calculator, go to the @@Praat menu@ "
+NORMAL (U"These commands are always clickable (if not hidden) and scriptable (if not added).")
+MAN_END
+
+MAN_BEGIN (U"Formulas", U"ppgb", 20040414)
+INTRO (U"You can use numeric expressions and string (text) expressions in many places in Praat:")
+LIST_ITEM (U"\\bu in the @calculator in Praat's @Goodies submenu;")
+LIST_ITEM (U"\\bu in the numeric fields of most settings windows;")
+LIST_ITEM (U"\\bu in a @@Praat script at .")
+NORMAL (U"For some types of objects (mainly Sound and Matrix), you can also apply formulas to all their contents at the same time:")
+LIST_ITEM (U"\\bu when you create a Sound or a Matrix from the @@New menu@;")
+LIST_ITEM (U"\\bu when you choose @@Formula...@ from the @Modify menu for a selected object.")
+NORMAL (U"You can read this tutorial sequentially with the help of the \"< 1\" and \"1 >\" buttons.")
+LIST_ITEM (U"1. @@Formulas 1. My first formulas|My first formulas@ (where to use)")
+LIST_ITEM1 (U"1.1. @@Formulas 1.1. Formulas in the calculator|Formulas in the calculator@")
+LIST_ITEM1 (U"1.2. @@Formulas 1.2. Numeric expressions|Numeric expressions@")
+LIST_ITEM1 (U"1.3. @@Formulas 1.3. String expressions|String expressions@")
+LIST_ITEM1 (U"1.4. @@Formulas 1.4. Representation of numbers|Representation of numbers@")
+LIST_ITEM1 (U"1.5. @@Formulas 1.5. Representation of strings|Representation of strings@")
+LIST_ITEM1 (U"1.6. @@Formulas 1.6. Formulas in settings windows|Formulas in settings windows@")
+LIST_ITEM1 (U"1.7. @@Formulas 1.7. Formulas for creation|Formulas for creation@")
+LIST_ITEM1 (U"1.8. @@Formulas 1.8. Formulas for modification|Formulas for modification@")
+LIST_ITEM1 (U"1.9. @@Formulas 1.9. Formulas in scripts|Formulas in scripts@")
+LIST_ITEM (U"2. @@Formulas 2. Operators|Operators@ (+, -, *, /, \\^ )")
+LIST_ITEM (U"3. @@Formulas 3. Constants|Constants@ (pi, e, undefined)")
+LIST_ITEM (U"4. @@Formulas 4. Mathematical functions|Mathematical functions@")
+LIST_ITEM (U"5. @@Formulas 5. String functions|String functions@")
+LIST_ITEM (U"6. @@Formulas 6. Control structures|Control structures@ (if then else fi, semicolon)")
+LIST_ITEM (U"7. @@Formulas 7. Attributes of objects|Attributes of objects@")
+LIST_ITEM (U"8. @@Formulas 8. Data in objects|Data in objects@")
+MAN_END
+
+MAN_BEGIN (U"Formulas 1. My first formulas", U"ppgb", 20040414)
+LIST_ITEM (U"1.1. @@Formulas 1.1. Formulas in the calculator|Formulas in the calculator@")
+LIST_ITEM (U"1.2. @@Formulas 1.2. Numeric expressions|Numeric expressions@")
+LIST_ITEM (U"1.3. @@Formulas 1.3. String expressions|String expressions@")
+LIST_ITEM (U"1.4. @@Formulas 1.4. Representation of numbers|Representation of numbers@")
+LIST_ITEM (U"1.5. @@Formulas 1.5. Representation of strings|Representation of strings@")
+LIST_ITEM (U"1.6. @@Formulas 1.6. Formulas in settings windows|Formulas in settings windows@")
+LIST_ITEM (U"1.7. @@Formulas 1.7. Formulas for creation|Formulas for creation@")
+LIST_ITEM (U"1.8. @@Formulas 1.8. Formulas for modification|Formulas for modification@")
+LIST_ITEM (U"1.9. @@Formulas 1.9. Formulas in scripts|Formulas in scripts@")
+MAN_END
+
+MAN_BEGIN (U"Formulas 1.1. Formulas in the calculator", U"ppgb", 20050822)
+INTRO (U"To use the Praat @calculator, go to the @@Praat menu@ "
 	"and choose @@Calculator...@ from the @Goodies submenu. Or simply type Command-U anywhere in Praat.")
-ENTRY (L"Calculating numbers")
-NORMAL (L"You can do arithmetic computations. Type the formula")
-CODE (L"8*17")
-NORMAL (L"and click OK. The Info window will pop up and show the result:")
-CODE (L"136")
-ENTRY (L"Calculating strings")
-NORMAL (L"You can also do text computations. Type the formula")
-CODE (L"\"see\" + \"king\"")
-NORMAL (L"and click OK. The Info window will show the result:")
-CODE (L"seeking")
-MAN_END
-
-MAN_BEGIN (L"Formulas 1.2. Numeric expressions", L"ppgb", 20050901)
-INTRO (L"All the formulas whose outcome is a number are called numeric expressions. "
+ENTRY (U"Calculating numbers")
+NORMAL (U"You can do arithmetic computations. Type the formula")
+CODE (U"8*17")
+NORMAL (U"and click OK. The Info window will pop up and show the result:")
+CODE (U"136")
+ENTRY (U"Calculating strings")
+NORMAL (U"You can also do text computations. Type the formula")
+CODE (U"\"see\" + \"king\"")
+NORMAL (U"and click OK. The Info window will show the result:")
+CODE (U"seeking")
+MAN_END
+
+MAN_BEGIN (U"Formulas 1.2. Numeric expressions", U"ppgb", 20050901)
+INTRO (U"All the formulas whose outcome is a number are called numeric expressions. "
 	"For the following examples, all the outcomes can be checked with the @calculator.")
-ENTRY (L"Examples with numbers")
-NORMAL (L"Some numeric expressions involve numbers only:")
-TAG (L"##8*17")
-DEFINITION (L"computes a multiplication. Outcome: 136.")
-TAG (L"##2\\^ 10")
-DEFINITION (L"computes the tenth power of 2. Outcome: 1024.")
-TAG (L"##sqrt (2) / 2")
-DEFINITION (L"computes the square root of 2, and divides the result by 2. Outcome: 0.7071067811865476.")
-TAG (L"##sin (1/4 * pi)")
-DEFINITION (L"computes the sine of %\\pi/4. Outcome: 0.7071067811865476 (again).")
-ENTRY (L"Examples with strings")
-NORMAL (L"Some numeric expressions compute numeric properties of strings:")
-TAG (L"##length (\"internationalization\")")
-DEFINITION (L"computes the length of the string \"internationalization\". Outcome: 20.")
-TAG (L"##index (\"internationalization\", \"ation\")")
-DEFINITION (L"computes the location of the first occurrence of the string \"ation\" in the string \"internationalization\". Outcome: 7, "
+ENTRY (U"Examples with numbers")
+NORMAL (U"Some numeric expressions involve numbers only:")
+TAG (U"##8*17")
+DEFINITION (U"computes a multiplication. Outcome: 136.")
+TAG (U"##2\\^ 10")
+DEFINITION (U"computes the tenth power of 2. Outcome: 1024.")
+TAG (U"##sqrt (2) / 2")
+DEFINITION (U"computes the square root of 2, and divides the result by 2. Outcome: 0.7071067811865476.")
+TAG (U"##sin (1/4 * pi)")
+DEFINITION (U"computes the sine of %\\pi/4. Outcome: 0.7071067811865476 (again).")
+ENTRY (U"Examples with strings")
+NORMAL (U"Some numeric expressions compute numeric properties of strings:")
+TAG (U"##length (\"internationalization\")")
+DEFINITION (U"computes the length of the string \"internationalization\". Outcome: 20.")
+TAG (U"##index (\"internationalization\", \"ation\")")
+DEFINITION (U"computes the location of the first occurrence of the string \"ation\" in the string \"internationalization\". Outcome: 7, "
 	"because the first letter of \"ation\" lines up with the seventh letter of \"internationalization\". "
 	"If the substring does not occur, the outcome is 0.")
 MAN_END
 
-MAN_BEGIN (L"Formulas 1.3. String expressions", L"ppgb", 20040414)
-INTRO (L"All the formulas whose outcome is a text string are called string expressions. "
+MAN_BEGIN (U"Formulas 1.3. String expressions", U"ppgb", 20040414)
+INTRO (U"All the formulas whose outcome is a text string are called string expressions. "
 	"Again, the outcomes of the following examples can be checked with the @calculator.")
-TAG (L"##\"see\" + \"king\"")
-DEFINITION (L"concatenates two strings. Outcome: seeking.")
-TAG (L"##left\\$  (\"internationalization\", 6)")
-DEFINITION (L"computes the leftmost six letters of the string; the dollar sign is used for all functions whose result is a string. Outcome: intern.")
-TAG (L"##mid\\$  (\"internationalization\", 6, 8)")
-DEFINITION (L"computes the 8-letter substring that starts at the sixth letter of \"internationalization\". Outcome: national.")
-TAG (L"##date\\$  ( )")
-DEFINITION (L"computes the current date and time. Outcome at the time I am writing this: Mon Dec  2 02:23:45 2002.")
-MAN_END
-
-MAN_BEGIN (L"Formulas 1.4. Representation of numbers", L"ppgb", 20040414)
-INTRO (L"Formulas can work with integer numbers as well as with real numbers.")
-ENTRY (L"Real numbers")
-NORMAL (L"You can type many real numbers by using a decimal notation, for instance 3.14159, 299792.5, or -0.000123456789. "
+TAG (U"##\"see\" + \"king\"")
+DEFINITION (U"concatenates two strings. Outcome: seeking.")
+TAG (U"##left\\$  (\"internationalization\", 6)")
+DEFINITION (U"computes the leftmost six letters of the string; the dollar sign is used for all functions whose result is a string. Outcome: intern.")
+TAG (U"##mid\\$  (\"internationalization\", 6, 8)")
+DEFINITION (U"computes the 8-letter substring that starts at the sixth letter of \"internationalization\". Outcome: national.")
+TAG (U"##date\\$  ( )")
+DEFINITION (U"computes the current date and time. Outcome at the time I am writing this: Mon Dec  2 02:23:45 2002.")
+MAN_END
+
+MAN_BEGIN (U"Formulas 1.4. Representation of numbers", U"ppgb", 20040414)
+INTRO (U"Formulas can work with integer numbers as well as with real numbers.")
+ENTRY (U"Real numbers")
+NORMAL (U"You can type many real numbers by using a decimal notation, for instance 3.14159, 299792.5, or -0.000123456789. "
 	"For very large or small numbers, you can use the %e-notation: 6.022\\.c10^^23^ is typed as 6.022e23 or 6.022e+23, "
 	"and -1.6021917\\.c10^^-19^ is typed as -1.6021917e-19. You can use also use the percent notation: 0.157 "
 	"can be typed as 15.7\\% .")
-NORMAL (L"There are some limitations as to the values that real numbers can have in Praat. "
+NORMAL (U"There are some limitations as to the values that real numbers can have in Praat. "
 	"The numbers must lie between -10^^308^ and +10^^308^. If you type")
-CODE (L"1e200 * 1e100")
-NORMAL (L"the outcome will be")
-CODE (L"1e+300")
-NORMAL (L"but if you type")
-CODE (L"1e300 * 1e100")
-NORMAL (L"the outcome will be")
-CODE (L"--undefined--")
-NORMAL (L"Another limitation is that the smallest non-zero numbers lie near -10^^-308^ and +10^^-308^. If you type")
-CODE (L"1e-200 / 1e100")
-NORMAL (L"the outcome will be")
-CODE (L"1e-300")
-NORMAL (L"but if you type")
-CODE (L"1e-300 / 1e100")
-NORMAL (L"the outcome will be")
-CODE (L"0")
-NORMAL (L"Finally, the precision of real numbers is limited by the number of bits that every real number is stored with "
+CODE (U"1e200 * 1e100")
+NORMAL (U"the outcome will be")
+CODE (U"1e+300")
+NORMAL (U"but if you type")
+CODE (U"1e300 * 1e100")
+NORMAL (U"the outcome will be")
+CODE (U"--undefined--")
+NORMAL (U"Another limitation is that the smallest non-zero numbers lie near -10^^-308^ and +10^^-308^. If you type")
+CODE (U"1e-200 / 1e100")
+NORMAL (U"the outcome will be")
+CODE (U"1e-300")
+NORMAL (U"but if you type")
+CODE (U"1e-300 / 1e100")
+NORMAL (U"the outcome will be")
+CODE (U"0")
+NORMAL (U"Finally, the precision of real numbers is limited by the number of bits that every real number is stored with "
 	"in the computer, namely 64. For instance, if you type")
-CODE (L"pi")
-NORMAL (L"the outcome will be")
-CODE (L"3.141592653589793")
-NORMAL (L"because only 16 digits of precision are stored. This can lead to unexpected results caused by rounding. "
+CODE (U"pi")
+NORMAL (U"the outcome will be")
+CODE (U"3.141592653589793")
+NORMAL (U"because only 16 digits of precision are stored. This can lead to unexpected results caused by rounding. "
 	"For instance, the formula")
-CODE (L"0.34999999999999999 - 0.35")
-NORMAL (L"will result in")
-CODE (L"0")
-NORMAL (L"rather than the correct value of 1e-17. This is because the numbers 0.34999999999999999 and 0.35 cannot "
+CODE (U"0.34999999999999999 - 0.35")
+NORMAL (U"will result in")
+CODE (U"0")
+NORMAL (U"rather than the correct value of 1e-17. This is because the numbers 0.34999999999999999 and 0.35 cannot "
 	"be distinguished in the computer's memory. If you simply type")
-CODE (L"0.34999999999999999")
-NORMAL (L"the outcome will be")
-CODE (L"0.35")
-NORMAL (L"(as in this example, the calculator will always come up with the minimum number of digits needed to represent the number unambiguously).")
-NORMAL (L"Another example of inaccuracy is the formula")
-CODE (L"1 / 7 / 59 * 413")
-NORMAL (L"Because of rounding errors, the result will be")
-CODE (L"0.9999999999999999")
-ENTRY (L"Integer numbers")
-NORMAL (L"Formulas can work with integer (whole) numbers between -1,000,000,000,000,000 and +1,000,000,000,000,000. "
+CODE (U"0.34999999999999999")
+NORMAL (U"the outcome will be")
+CODE (U"0.35")
+NORMAL (U"(as in this example, the calculator will always come up with the minimum number of digits needed to represent the number unambiguously).")
+NORMAL (U"Another example of inaccuracy is the formula")
+CODE (U"1 / 7 / 59 * 413")
+NORMAL (U"Because of rounding errors, the result will be")
+CODE (U"0.9999999999999999")
+ENTRY (U"Integer numbers")
+NORMAL (U"Formulas can work with integer (whole) numbers between -1,000,000,000,000,000 and +1,000,000,000,000,000. "
 	"You type them without commas and without the plus sign: 337, -848947328345289.")
-NORMAL (L"You %can work with larger numbers than that (up to 10^^308^), but there will again be rounding errors. "
+NORMAL (U"You %can work with larger numbers than that (up to 10^^308^), but there will again be rounding errors. "
 	"For instance, the formula")
-CODE (L"1000000000000000 + 1")
-NORMAL (L"correctly yields")
-CODE (L"1000000000000001")
-NORMAL (L"but the formula")
-CODE (L"10000000000000000 + 1")
-NORMAL (L"yields an incorrect outcome:")
-CODE (L"1e16")
+CODE (U"1000000000000000 + 1")
+NORMAL (U"correctly yields")
+CODE (U"1000000000000001")
+NORMAL (U"but the formula")
+CODE (U"10000000000000000 + 1")
+NORMAL (U"yields an incorrect outcome:")
+CODE (U"1e16")
 MAN_END
 
-MAN_BEGIN (L"Formulas 1.5. Representation of strings", L"ppgb", 20021203)
-INTRO (L"Formulas can work with strings that are put between two double quotes, "
+MAN_BEGIN (U"Formulas 1.5. Representation of strings", U"ppgb", 20021203)
+INTRO (U"Formulas can work with strings that are put between two double quotes, "
 	"as in \"goodbye\" or \"how are you doing?\".")
-NORMAL (L"If a string has to contain a double quote, "
+NORMAL (U"If a string has to contain a double quote, "
 	"you have to type it twice. For instance, if you type")
-CODE (L"\"I asked: \\\" \\\" how are you doing?\\\" \\\" \"")
-NORMAL (L"into the calculator, the outcome will be")
-CODE (L"I asked: \"how are you doing?\"")
+CODE (U"\"I asked: \\\" \\\" how are you doing?\\\" \\\" \"")
+NORMAL (U"into the calculator, the outcome will be")
+CODE (U"I asked: \"how are you doing?\"")
 MAN_END
 
-MAN_BEGIN (L"Formulas 1.6. Formulas in settings windows", L"ppgb", 20070225)
-INTRO (L"Into numeric fields in settings windows you usually simply type a number. "
+MAN_BEGIN (U"Formulas 1.6. Formulas in settings windows", U"ppgb", 20070225)
+INTRO (U"Into numeric fields in settings windows you usually simply type a number. "
 	"However, you can use any numeric expression instead.")
-NORMAL (L"For instance, suppose you want to create a Sound that contains exactly 10000 samples. "
+NORMAL (U"For instance, suppose you want to create a Sound that contains exactly 10000 samples. "
 	"If the sampling frequency is 44100 Hz, the duration will be 10000/44100 seconds. "
 	"You can create such a Sound by choosing @@Create Sound from formula...@ from the @@New menu@, "
 	"then typing")
-CODE (L"10000/44100")
-NORMAL (L"into the ##End time# field.")
-NORMAL (L"Into text fields in settings windows, you can only type text directly; there is no way "
+CODE (U"10000/44100")
+NORMAL (U"into the ##End time# field.")
+NORMAL (U"Into text fields in settings windows, you can only type text directly; there is no way "
 	"to use string expressions (except if you use scripts; see @@Formulas 1.9. Formulas in scripts@).")
 MAN_END
 
-MAN_BEGIN (L"Formulas 1.7. Formulas for creation", L"ppgb", 20110128)
-INTRO (L"With some commands in the @@New menu@, you can supply a formula that Praat will apply to all elements of the new object.")
-ENTRY (L"Creating a Sound from a formula")
-NORMAL (L"Choose @@Create Sound from formula...@ and type the following into the #%Formula field:")
-CODE (L"1/2 * sin (2 * pi * 377 * x)")
-NORMAL (L"When you click OK, a new @Sound object will appear in the list. "
+MAN_BEGIN (U"Formulas 1.7. Formulas for creation", U"ppgb", 20110128)
+INTRO (U"With some commands in the @@New menu@, you can supply a formula that Praat will apply to all elements of the new object.")
+ENTRY (U"Creating a Sound from a formula")
+NORMAL (U"Choose @@Create Sound from formula...@ and type the following into the #%Formula field:")
+CODE (U"1/2 * sin (2 * pi * 377 * x)")
+NORMAL (U"When you click OK, a new @Sound object will appear in the list. "
 	"After you click ##View & Edit# and zoom in a couple of times, you will see that the sound is a sine wave "
 	"with a frequency of 377 hertz (cycles per second). This worked because the %x in the formula represents the time, "
 	"i.e. the formula was applied to every sample separately, with a different value of %x for each sample.")
-ENTRY (L"Creating a Matrix from a formula")
-NORMAL (L"Choose @@Create simple Matrix...@ and type the following into the #%Formula field:")
-CODE (L"8")
-NORMAL (L"When you click OK, a new @Matrix object will appear in the list. When you click #Info, "
+ENTRY (U"Creating a Matrix from a formula")
+NORMAL (U"Choose @@Create simple Matrix...@ and type the following into the #%Formula field:")
+CODE (U"8")
+NORMAL (U"When you click OK, a new @Matrix object will appear in the list. When you click #Info, "
 	"you will see that it is a matrix with 10 rows and 10 columns, and that all the 100 cells contain the value 8 "
 	"(you can see this because both the minimum and the maximum are reported as being 8).")
-NORMAL (L"A more interesting example is the formula")
-CODE (L"row * col")
-NORMAL (L"For the resulting Matrix, "
+NORMAL (U"A more interesting example is the formula")
+CODE (U"row * col")
+NORMAL (U"For the resulting Matrix, "
 	"choose @@Matrix: Paint cells...|Paint cells...@ and click OK. The Picture window will show a 10\\xx10 "
 	"matrix whose elements are the product of the row and column numbers, i.e., they have values between "
 	"1 and 100. Beside %row and %col, you can use %x for the distance along the horizontal axis and %y for the "
 	"distance along the vertical axis; see the following page for examples.")
 MAN_END
 
-MAN_BEGIN (L"Formulas 1.8. Formulas for modification", L"ppgb", 20021204)
-INTRO (L"Analogously to the formulas that you can use for creating new objects (see the previous page), "
+MAN_BEGIN (U"Formulas 1.8. Formulas for modification", U"ppgb", 20021204)
+INTRO (U"Analogously to the formulas that you can use for creating new objects (see the previous page), "
 	"you can use formulas for modifying existing objects. You do this with the command ##Formula...# that you "
 	"can find in the @Modify menu when you select an object.")
-ENTRY (L"Modifying a Sound with a formula")
-NORMAL (L"Record a sound with your microphone and talk very lowly. If you don't know how to record a sound in Praat, "
+ENTRY (U"Modifying a Sound with a formula")
+NORMAL (U"Record a sound with your microphone and talk very lowly. If you don't know how to record a sound in Praat, "
 	"consult the @Intro. Once the Sound objetc is in the list, click #%Play. The result will sound very soft. "
 	"Then choose ##Formula...# from the #Modify menu and type")
-CODE (L"self * 3")
-NORMAL (L"Click OK, then click #Play again. The sound is much louder now. You have multiplied the amplitude of every sample "
+CODE (U"self * 3")
+NORMAL (U"Click OK, then click #Play again. The sound is much louder now. You have multiplied the amplitude of every sample "
 	"in the sound with a factor of 3.")
-ENTRY (L"Replacing the contents of a Sound with a formula")
-NORMAL (L"If you don't use $self in your formula, the formula does not refer to the existing contents of the Sound. Hence, the formula ")
-CODE (L"1/2 * sin (2 * pi * 377 * x)")
-NORMAL (L"will simply replace your recorded speech with a 377-Hz sine wave.")
-ENTRY (L"Modifying a Matrix with a formula")
-NORMAL (L"Many objects can be thought of as matrices: "
+ENTRY (U"Replacing the contents of a Sound with a formula")
+NORMAL (U"If you don't use $self in your formula, the formula does not refer to the existing contents of the Sound. Hence, the formula ")
+CODE (U"1/2 * sin (2 * pi * 377 * x)")
+NORMAL (U"will simply replace your recorded speech with a 377-Hz sine wave.")
+ENTRY (U"Modifying a Matrix with a formula")
+NORMAL (U"Many objects can be thought of as matrices: "
 	"they consist of a number of rows and columns with data in every cell:")
-LIST_ITEM (L"@Sound: one row; columns represent samples.")
-LIST_ITEM (L"@Spectrum: two rows (first row is real part, second row is imaginary part); "
+LIST_ITEM (U"@Sound: one row; columns represent samples.")
+LIST_ITEM (U"@Spectrum: two rows (first row is real part, second row is imaginary part); "
 	"columns represent frequencies.")
-LIST_ITEM (L"@Spectrogram, @Cochleagram: rows represent frequencies; columns represent times.")
-LIST_ITEM (L"@Excitation: one row; columns represent frequency bands.")
-LIST_ITEM (L"@Harmonicity: one row; columns represent time frames.")
-NORMAL (L"The formula is performed on every column of every row. The formula")
-CODE (L"self\\^ 2$")
-NORMAL (L"will square all matrix elements.")
-NORMAL (L"The formula first works on the first row, and in that row from the first column on; "
+LIST_ITEM (U"@Spectrogram, @Cochleagram: rows represent frequencies; columns represent times.")
+LIST_ITEM (U"@Excitation: one row; columns represent frequency bands.")
+LIST_ITEM (U"@Harmonicity: one row; columns represent time frames.")
+NORMAL (U"The formula is performed on every column of every row. The formula")
+CODE (U"self\\^ 2$")
+NORMAL (U"will square all matrix elements.")
+NORMAL (U"The formula first works on the first row, and in that row from the first column on; "
 	"this can work recursively. The formula")
-CODE (L"self + self [row, col - 1]")
-NORMAL (L"integrates each row.")
-ENTRY (L"Referring to the current position in the object")
-NORMAL (L"You can refer to the current position in a Matrix (or Sound, etc.) by index or by %x and %y values:")
-TAG (L"#row")
-DEFINITION (L"the current row")
-TAG (L"#col")
-DEFINITION (L"the current column")
-TAG (L"#x")
-DEFINITION (L"the %x value associated with the current column:")
-DEFINITION (L"    for a Sound, Spectrogram, Cochleagram, or Harmonicity: time")
-DEFINITION (L"    for a Spectrum: frequency (Hz)")
-DEFINITION (L"    for an Excitation: frequency (Bark)")
-TAG (L"#y")
-DEFINITION (L"the %y value associated with the current row:")
-DEFINITION (L"    for a Spectrogram: frequency (Hz)")
-DEFINITION (L"    for a Cochleagram: frequency (Bark)")
-ENTRY (L"Referring to the contents of the object itself")
-NORMAL (L"You can refer to values in the current Matrix (or Sound, etc.) by index.")
-TAG (L"##self")
-DEFINITION (L"refers to the value in the current Matrix at the current row and column, or to the value in the current Sound at the current sample.")
-TAG (L"##self [%%column-expression%]")
-DEFINITION (L"refers to the value in the current Sound (or Intensity etc.) at the current sample (or frame). "
+CODE (U"self + self [row, col - 1]")
+NORMAL (U"integrates each row.")
+ENTRY (U"Referring to the current position in the object")
+NORMAL (U"You can refer to the current position in a Matrix (or Sound, etc.) by index or by %x and %y values:")
+TAG (U"#row")
+DEFINITION (U"the current row")
+TAG (U"#col")
+DEFINITION (U"the current column")
+TAG (U"#x")
+DEFINITION (U"the %x value associated with the current column:")
+DEFINITION (U"    for a Sound, Spectrogram, Cochleagram, or Harmonicity: time")
+DEFINITION (U"    for a Spectrum: frequency (Hz)")
+DEFINITION (U"    for an Excitation: frequency (Bark)")
+TAG (U"#y")
+DEFINITION (U"the %y value associated with the current row:")
+DEFINITION (U"    for a Spectrogram: frequency (Hz)")
+DEFINITION (U"    for a Cochleagram: frequency (Bark)")
+ENTRY (U"Referring to the contents of the object itself")
+NORMAL (U"You can refer to values in the current Matrix (or Sound, etc.) by index.")
+TAG (U"##self")
+DEFINITION (U"refers to the value in the current Matrix at the current row and column, or to the value in the current Sound at the current sample.")
+TAG (U"##self [%%column-expression%]")
+DEFINITION (U"refers to the value in the current Sound (or Intensity etc.) at the current sample (or frame). "
 	"The %%column-expression% is rounded to the nearest integer. "
 	"If the index is out of range (less than 1 or greater than %n__%x_), the expression evaluates as 0.")
-NORMAL (L"#Example. An integrator is")
-CODE (L"   self [col - 1] + self * dx")
-TAG (L"##self [%%row-expression%, %%column-expression%]")
-DEFINITION (L"refers to the value in the current Matrix (or Spectrogram etc.) at the specified row and column. "
+NORMAL (U"#Example. An integrator is")
+CODE (U"   self [col - 1] + self * dx")
+TAG (U"##self [%%row-expression%, %%column-expression%]")
+DEFINITION (U"refers to the value in the current Matrix (or Spectrogram etc.) at the specified row and column. "
 	"The expressions are rounded to the nearest integers.")
-NORMAL (L"You can refer to values in the current Matrix (or Spectrogram, etc.) by %x and %y position:")
-TAG (L"\\bu ##self (%%x-expression%, %%y-expression%)")
-DEFINITION (L"the expressions are linearly interpolated between the four nearest matrix points.")
-NORMAL (L"You can refer to values in the current Sound (or Intensity etc.) by %x position:")
-TAG (L"\\bu ##self (%%x-expression%)")
-DEFINITION (L"the expression is linearly interpolated between the two nearest samples (or frames).")
+NORMAL (U"You can refer to values in the current Matrix (or Spectrogram, etc.) by %x and %y position:")
+TAG (U"\\bu ##self (%%x-expression%, %%y-expression%)")
+DEFINITION (U"the expressions are linearly interpolated between the four nearest matrix points.")
+NORMAL (U"You can refer to values in the current Sound (or Intensity etc.) by %x position:")
+TAG (U"\\bu ##self (%%x-expression%)")
+DEFINITION (U"the expression is linearly interpolated between the two nearest samples (or frames).")
 MAN_END
 
-MAN_BEGIN (L"Formulas 1.9. Formulas in scripts", L"ppgb", 20140223)
-INTRO (L"In scripts, you can assign numeric expressions to numeric variables, "
+MAN_BEGIN (U"Formulas 1.9. Formulas in scripts", U"ppgb", 20140223)
+INTRO (U"In scripts, you can assign numeric expressions to numeric variables, "
 	"and string expressions to string variables. You can also use numeric and string variables in expressions.")
-ENTRY (L"Example: report a square")
-NORMAL (L"Choose @@New Praat script@ from the @@Praat menu at . A script editor window will become visible. "
+ENTRY (U"Example: report a square")
+NORMAL (U"Choose @@New Praat script@ from the @@Praat menu at . A script editor window will become visible. "
 	"Type the following lines into that window:")
-CODE (L"x = 99")
-CODE (L"x2 = x * x")
-CODE (L"writeInfoLine: \"The square of \", x, \" is \", x2, \".\"")
-NORMAL (L"This is an example of a simple @@Praat script@; it assigns the results of the numeric formulas $$99$ and $$x * x$ "
+CODE (U"x = 99")
+CODE (U"x2 = x * x")
+CODE (U"writeInfoLine: \"The square of \", x, \" is \", x2, \".\"")
+NORMAL (U"This is an example of a simple @@Praat script@; it assigns the results of the numeric formulas $$99$ and $$x * x$ "
 	"to the numeric variables %x and %x2. Note that the formula $$x * x$ itself refers to the variable %x. "
 	"To run (execute) this script, type Command-R or choose #Run from the #Run menu. "
 	"Praat will then write the following text into the Info window:")
-CODE (L"The square of 99 is 9801.")
-NORMAL (L"For more information on scripts, see the @Scripting tutorial.")
-ENTRY (L"Example: rename the city of Washington")
-NORMAL (L"Type the following text into the script editor window:")
-CODE (L"current\\$  = \"Bush\"")
-CODE (L"previous\\$  = \"Clinton\"")
-CODE (L"famous\\$  = \"Lincoln\"")
-CODE (L"newCapital\\$  = current\\$  + mid\\$  (famous\\$ , 2, 3) + right\\$  (previous\\$ , 3)")
-CODE (L"writeInfoLine: \"The new capital will be \", newCapital\\$ , \".\"")
-NORMAL (L"This script assigns the results of four string expressions to the four string variables %%current\\$ %, "
+CODE (U"The square of 99 is 9801.")
+NORMAL (U"For more information on scripts, see the @Scripting tutorial.")
+ENTRY (U"Example: rename the city of Washington")
+NORMAL (U"Type the following text into the script editor window:")
+CODE (U"current\\$  = \"Bush\"")
+CODE (U"previous\\$  = \"Clinton\"")
+CODE (U"famous\\$  = \"Lincoln\"")
+CODE (U"newCapital\\$  = current\\$  + mid\\$  (famous\\$ , 2, 3) + right\\$  (previous\\$ , 3)")
+CODE (U"writeInfoLine: \"The new capital will be \", newCapital\\$ , \".\"")
+NORMAL (U"This script assigns the results of four string expressions to the four string variables %%current\\$ %, "
 	"%%previous\\$ %, %%famous\\$ %, and %%newCapital\\$ %. The dollar sign is the notation for a string variable or "
 	"for a function whose result is a string (like ##left\\$ #). Note that the formula in the fourth line refers to three existing "
 	"variables.")
-NORMAL (L"To see what the new name of the capital will be, choose #Run.")
-ENTRY (L"Example: numeric expressions in settings in scripts")
-NORMAL (L"As in real settings windows, you can use numeric expressions in all numeric fields. "
+NORMAL (U"To see what the new name of the capital will be, choose #Run.")
+ENTRY (U"Example: numeric expressions in settings in scripts")
+NORMAL (U"As in real settings windows, you can use numeric expressions in all numeric fields. "
 	"The example of two pages back becomes:")
-CODE (L"Create Sound from formula: \"sine\", \"Mono\", 0, 10000 / 44100, 44100, \"0.9 * sin (2*pi*377*x)\"")
-ENTRY (L"Example: string expressions in settings in scripts")
-NORMAL (L"As in real settings windows, you can use string expressions in all text fields:")
-CODE (L"soundName\\$  = \"hello\"")
-CODE (L"Read from file: soundName\\$  + \".wav\"")
-ENTRY (L"Example: numeric expressions in creation in scripts")
-NORMAL (L"Suppose you want to generate a sine wave whose frequency is held in a variable. This is the way:")
-CODE (L"frequency = 377")
-CODE (L"Create Sound from formula: \"sine\", \"Mono\", 0, 1, 44100, \"0.9 * sin (2*pi*frequency*x)\"")
-NORMAL (L"In this example, Praat will protest if %x is a variable as well, because that would be ambiguous "
+CODE (U"Create Sound from formula: \"sine\", \"Mono\", 0, 10000 / 44100, 44100, \"0.9 * sin (2*pi*377*x)\"")
+ENTRY (U"Example: string expressions in settings in scripts")
+NORMAL (U"As in real settings windows, you can use string expressions in all text fields:")
+CODE (U"soundName\\$  = \"hello\"")
+CODE (U"Read from file: soundName\\$  + \".wav\"")
+ENTRY (U"Example: numeric expressions in creation in scripts")
+NORMAL (U"Suppose you want to generate a sine wave whose frequency is held in a variable. This is the way:")
+CODE (U"frequency = 377")
+CODE (U"Create Sound from formula: \"sine\", \"Mono\", 0, 1, 44100, \"0.9 * sin (2*pi*frequency*x)\"")
+NORMAL (U"In this example, Praat will protest if %x is a variable as well, because that would be ambiguous "
 	"with the %x that refers to the time in the sound (see @@Formulas 1.8. Formulas for modification@).")
 MAN_END
 
-MAN_BEGIN (L"Formulas 2. Operators", L"ppgb", 20060127)
-NORMAL (L"In formulas you can use the numerical and logical operators that are described on this page. "
+MAN_BEGIN (U"Formulas 2. Operators", U"ppgb", 20060127)
+NORMAL (U"In formulas you can use the numerical and logical operators that are described on this page. "
 	"The order of evaluation of the operators is the order that is most usual in programming languages. "
 	"To force a different order, you use parentheses.")
-NORMAL (L"The operators with the highest precedence are #negation (-) and #exponentation (\\^ ):")
-CODE (L"--6 \\-> 6")
-CODE (L"2\\^ 6 \\-> 64")
-NORMAL (L"Sequences of negation and exponentiation are evaluated from right to left:")
-CODE (L"2\\^ -6 \\-> 0.015625")
-CODE (L"-(1+1)\\^ 6 \\-> -64")
-CODE (L"4\\^ 3\\^ 2 \\-> 4\\^ 9 \\-> 262144")
-NORMAL (L"Note that changing the spacing does not change the meaning:")
-CODE (L"4\\^ 3 \\^  2 \\-> 262144")
-NORMAL (L"To change the order of evaluation, you have to use parentheses:")
-CODE (L"(4 \\^  3) \\^  2 \\-> 4096")
-NORMAL (L"The following construction is not allowed because of an ambiguity between a negative number "
+NORMAL (U"The operators with the highest precedence are #negation (-) and #exponentation (\\^ ):")
+CODE (U"--6 \\-> 6")
+CODE (U"2\\^ 6 \\-> 64")
+NORMAL (U"Sequences of negation and exponentiation are evaluated from right to left:")
+CODE (U"2\\^ -6 \\-> 0.015625")
+CODE (U"-(1+1)\\^ 6 \\-> -64")
+CODE (U"4\\^ 3\\^ 2 \\-> 4\\^ 9 \\-> 262144")
+NORMAL (U"Note that changing the spacing does not change the meaning:")
+CODE (U"4\\^ 3 \\^  2 \\-> 262144")
+NORMAL (U"To change the order of evaluation, you have to use parentheses:")
+CODE (U"(4 \\^  3) \\^  2 \\-> 4096")
+NORMAL (U"The following construction is not allowed because of an ambiguity between a negative number "
 	"and negation of a positive number:")
-CODE (L"-2\\^ 6 \\-> ?")
-NORMAL (L"Instead, you use any of the following:")
-CODE (L"(-2)\\^ 6 \\-> 64")
-CODE (L"-(2\\^ 6) \\-> -64")
-CODE (L"-(2)\\^ 6 \\-> -64")
-NORMAL (L"The operators with the next highest precedence are #multiplication (*) and #division (/). They are evaluated "
+CODE (U"-2\\^ 6 \\-> ?")
+NORMAL (U"Instead, you use any of the following:")
+CODE (U"(-2)\\^ 6 \\-> 64")
+CODE (U"-(2\\^ 6) \\-> -64")
+CODE (U"-(2)\\^ 6 \\-> -64")
+NORMAL (U"The operators with the next highest precedence are #multiplication (*) and #division (/). They are evaluated "
 	"from left to right:")
-CODE (L"1/4*5 \\-> 1.25        (from left to right)")
-CODE (L"1 / 4*5 \\-> 1.25      (spacing does not help)")
-CODE (L"1 / (4*5) \\-> 0.05    (use parentheses to change the order)")
-CODE (L"3 * 2 \\^  4 \\-> 48      (exponentiation before multiplication)")
-CODE (L"3*2 \\^  4 \\-> 48        (this spacing does not matter and is misleading)")
-CODE (L"(3 * 2) \\^  4 \\-> 1296  (use parentheses to change the order)")
-NORMAL (L"##Integer division# operators (#div and #mod) have the same precedence as * and /, "
+CODE (U"1/4*5 \\-> 1.25        (from left to right)")
+CODE (U"1 / 4*5 \\-> 1.25      (spacing does not help)")
+CODE (U"1 / (4*5) \\-> 0.05    (use parentheses to change the order)")
+CODE (U"3 * 2 \\^  4 \\-> 48      (exponentiation before multiplication)")
+CODE (U"3*2 \\^  4 \\-> 48        (this spacing does not matter and is misleading)")
+CODE (U"(3 * 2) \\^  4 \\-> 1296  (use parentheses to change the order)")
+NORMAL (U"##Integer division# operators (#div and #mod) have the same precedence as * and /, "
 	"and are likewise evaluated from left to right:")
-CODE (L"54 div 5 \\-> 10       (division rounded down)")
-CODE (L"54 mod 5 \\-> 4        (the remainder)")
-CODE (L"54.3 div 5.1 \\-> 10   (works for real numbers as well)")
-CODE (L"54.3 mod 5.1 \\-> 3.3  (the remainder)")
-CODE (L"-54 div 5 \\-> -11     (division rounded down; negation before division)")
-CODE (L"-54 mod 5 \\-> 1       (the remainder)")
-CODE (L"-(54 div 5) \\-> -10   (use parentheses to change the order)")
-CODE (L"-(54 mod 5) \\-> -4")
-CODE (L"3 * 18 div 5 \\-> 10   (from left to right)")
-CODE (L"3 * (18 div 5) \\-> 9")
-CODE (L"3 * 18 mod 5 \\-> 4")
-CODE (L"3 * (18 mod 5) \\-> 9")
-CODE (L"54 div 5 * 3 \\-> 30   (from left to right)")
-CODE (L"54 div (5 * 3) \\-> 3")
-CODE (L"54 mod 5 * 3 \\-> 12")
-CODE (L"54 mod (5 * 3) \\-> 9")
-NORMAL (L"The operators with the next highest precedence are #addition (+) and #subtraction (-), "
+CODE (U"54 div 5 \\-> 10       (division rounded down)")
+CODE (U"54 mod 5 \\-> 4        (the remainder)")
+CODE (U"54.3 div 5.1 \\-> 10   (works for real numbers as well)")
+CODE (U"54.3 mod 5.1 \\-> 3.3  (the remainder)")
+CODE (U"-54 div 5 \\-> -11     (division rounded down; negation before division)")
+CODE (U"-54 mod 5 \\-> 1       (the remainder)")
+CODE (U"-(54 div 5) \\-> -10   (use parentheses to change the order)")
+CODE (U"-(54 mod 5) \\-> -4")
+CODE (U"3 * 18 div 5 \\-> 10   (from left to right)")
+CODE (U"3 * (18 div 5) \\-> 9")
+CODE (U"3 * 18 mod 5 \\-> 4")
+CODE (U"3 * (18 mod 5) \\-> 9")
+CODE (U"54 div 5 * 3 \\-> 30   (from left to right)")
+CODE (U"54 div (5 * 3) \\-> 3")
+CODE (U"54 mod 5 * 3 \\-> 12")
+CODE (U"54 mod (5 * 3) \\-> 9")
+NORMAL (U"The operators with the next highest precedence are #addition (+) and #subtraction (-), "
 	"evaluated from left to right:")
-CODE (L"3 - 8 + 7 \\-> 2       (from left to right)")
-CODE (L"3 - (8 + 7) \\-> -12   (use parentheses to change the order)")
-CODE (L"3 + 8 * 7 \\-> 59      (multiplication before addition)")
-CODE (L"(3 + 8) * 7 \\-> 77    (use parentheses to change the order)")
-CODE (L"3 + - (2 \\^  4) \\-> -13   (exponentiation, negation, addition)")
-CODE (L"3 + 5 / 2 + 3 \\-> 8.5")
-CODE (L"(3 + 5) / (2 + 3) \\-> 1.6")
-NORMAL (L"The operators with the next highest precedence are the #comparison operators "
+CODE (U"3 - 8 + 7 \\-> 2       (from left to right)")
+CODE (U"3 - (8 + 7) \\-> -12   (use parentheses to change the order)")
+CODE (U"3 + 8 * 7 \\-> 59      (multiplication before addition)")
+CODE (U"(3 + 8) * 7 \\-> 77    (use parentheses to change the order)")
+CODE (U"3 + - (2 \\^  4) \\-> -13   (exponentiation, negation, addition)")
+CODE (U"3 + 5 / 2 + 3 \\-> 8.5")
+CODE (U"(3 + 5) / (2 + 3) \\-> 1.6")
+NORMAL (U"The operators with the next highest precedence are the #comparison operators "
 	"(=  <>  <  >  <=  >=). These operators always yield 0 (%false) or 1 (%true):")
-CODE (L"5 + 6 = 10 \\-> 0      (equal)")
-CODE (L"5 + 6 = 11 \\-> 1")
-CODE (L"5 + 6 <> 10 \\-> 1     (unequal)")
-CODE (L"5 + 6 <> 11 \\-> 0")
-CODE (L"5 + 6 < 10 \\-> 0      (less than)")
-CODE (L"5 + 6 < 11 \\-> 0")
-CODE (L"5 + 6 > 10 \\-> 1      (greater than)")
-CODE (L"5 + 6 > 11 \\-> 0")
-CODE (L"5 + 6 <= 10 \\-> 0     (less than or equal)")
-CODE (L"5 + 6 <= 11 \\-> 1")
-CODE (L"5 + 6 >= 10 \\-> 1     (greater or equal)")
-CODE (L"5 + 6 >= 11 \\-> 1")
-NORMAL (L"The comparison operators are mainly used in #if, #while, and #until conditions.")
-NORMAL (L"The operators of lowest precedence are the #logical operators (#not, #and, and #or), of which #not has the "
+CODE (U"5 + 6 = 10 \\-> 0      (equal)")
+CODE (U"5 + 6 = 11 \\-> 1")
+CODE (U"5 + 6 <> 10 \\-> 1     (unequal)")
+CODE (U"5 + 6 <> 11 \\-> 0")
+CODE (U"5 + 6 < 10 \\-> 0      (less than)")
+CODE (U"5 + 6 < 11 \\-> 0")
+CODE (U"5 + 6 > 10 \\-> 1      (greater than)")
+CODE (U"5 + 6 > 11 \\-> 0")
+CODE (U"5 + 6 <= 10 \\-> 0     (less than or equal)")
+CODE (U"5 + 6 <= 11 \\-> 1")
+CODE (U"5 + 6 >= 10 \\-> 1     (greater or equal)")
+CODE (U"5 + 6 >= 11 \\-> 1")
+NORMAL (U"The comparison operators are mainly used in #if, #while, and #until conditions.")
+NORMAL (U"The operators of lowest precedence are the #logical operators (#not, #and, and #or), of which #not has the "
 	"highest precedence and #or the lowest:")
-CODE (L"not 5 + 6 = 10 \\-> 1")
-CODE (L"x > 5 and x < 10               (is x between 5 and 10?)")
-CODE (L"not x <= 5 and not x >= 10     (same as previous line)")
-CODE (L"not (x <= 5 or x >= 10)        (same as previous line)")
-ENTRY (L"String comparison")
-TAG (L"##a\\$  = b\\$ ")
-DEFINITION (L"gives the value %true (= 1) if the strings are equal, and %false (= 0) otherwise.")
-TAG (L"##a\\$  <> b\\$ ")
-DEFINITION (L"gives the value %true if the strings are unequal, and %false otherwise.")
-TAG (L"##a\\$  < b\\$ ")
-DEFINITION (L"gives %true if the string %%a\\$ % precedes the string %%b\\$ % in ASCII sorting order. "
+CODE (U"not 5 + 6 = 10 \\-> 1")
+CODE (U"x > 5 and x < 10               (is x between 5 and 10?)")
+CODE (U"not x <= 5 and not x >= 10     (same as previous line)")
+CODE (U"not (x <= 5 or x >= 10)        (same as previous line)")
+ENTRY (U"String comparison")
+TAG (U"##a\\$  = b\\$ ")
+DEFINITION (U"gives the value %true (= 1) if the strings are equal, and %false (= 0) otherwise.")
+TAG (U"##a\\$  <> b\\$ ")
+DEFINITION (U"gives the value %true if the strings are unequal, and %false otherwise.")
+TAG (U"##a\\$  < b\\$ ")
+DEFINITION (U"gives %true if the string %%a\\$ % precedes the string %%b\\$ % in ASCII sorting order. "
 	"Thus, \"ha\" < \"hal\" and \"ha\" < \"ja\" are true, but \"ha\" < \"JA\" is false, "
 	"because all capitals precede all lower-case characters in the ASCII sorting order.")
-TAG (L"##a\\$  > b\\$ ")
-DEFINITION (L"%true if %%a\\$ % comes after %%b\\$ % in ASCII sorting order. ")
-TAG (L"##a\\$  <= b\\$ ")
-DEFINITION (L"gives the value %true if the string %%a\\$ % precedes the string %%b\\$ % in ASCII sorting order, "
+TAG (U"##a\\$  > b\\$ ")
+DEFINITION (U"%true if %%a\\$ % comes after %%b\\$ % in ASCII sorting order. ")
+TAG (U"##a\\$  <= b\\$ ")
+DEFINITION (U"gives the value %true if the string %%a\\$ % precedes the string %%b\\$ % in ASCII sorting order, "
 	"or if the strings are equal.")
-TAG (L"##a\\$  >= b\\$ ")
-DEFINITION (L"%true if %%a\\$ % comes after %%b\\$ % or the two are equal.")
-ENTRY (L"String concatenation and truncation")
-TAG (L"##a\\$  + b\\$ ")
-DEFINITION (L"concatenates the two strings. After")
-CODE1 (L"text\\$  = \"hallo\" + \"dag\"")
-DEFINITION (L"The variable %%text\\$ % contains the string \"hallodag\".")
-TAG (L"##a\\$  - b\\$ ")
-DEFINITION (L"subtracts the second string from the end of the first. After")
-CODE2 (L"soundFileName\\$  = \"hallo.aifc\"")
-CODE2 (L"textgridFileName\\$  = soundFileName\\$  - \".aifc\" + \".TextGrid\"")
-DEFINITION (L"the variable %%textgridFileName\\$ % contains the string \"hallo.TextGrid\". "
+TAG (U"##a\\$  >= b\\$ ")
+DEFINITION (U"%true if %%a\\$ % comes after %%b\\$ % or the two are equal.")
+ENTRY (U"String concatenation and truncation")
+TAG (U"##a\\$  + b\\$ ")
+DEFINITION (U"concatenates the two strings. After")
+CODE1 (U"text\\$  = \"hallo\" + \"dag\"")
+DEFINITION (U"The variable %%text\\$ % contains the string \"hallodag\".")
+TAG (U"##a\\$  - b\\$ ")
+DEFINITION (U"subtracts the second string from the end of the first. After")
+CODE2 (U"soundFileName\\$  = \"hallo.aifc\"")
+CODE2 (U"textgridFileName\\$  = soundFileName\\$  - \".aifc\" + \".TextGrid\"")
+DEFINITION (U"the variable %%textgridFileName\\$ % contains the string \"hallo.TextGrid\". "
 	"If the first string %%a\\$ % does not end in the string %%b\\$ %, the result of the subtraction is the string %%a\\$ %.")
 MAN_END
 
-MAN_BEGIN (L"Formulas 3. Constants", L"ppgb", 20080318)
-TAG (L"##pi")
-DEFINITION (L"%\\pi, 3.14159265358979323846264338328")
-TAG (L"##e")
-DEFINITION (L"%e, 2.71828182845904523536028747135")
-TAG (L"##undefined")
-DEFINITION (L"a special value, see @undefined")
-MAN_END
-
-MAN_BEGIN (L"Formulas 4. Mathematical functions", L"ppgb", 20080318)
-TAG (L"##abs (%x)")
-DEFINITION (L"absolute value")
-TAG (L"##round (%x)")
-DEFINITION (L"nearest integer; round (1.5) = 2")
-TAG (L"##floor (%x)")
-DEFINITION (L"round down: highest integer value not greater than %x")
-TAG (L"##ceiling (%x)")
-DEFINITION (L"round up: lowest integer value not less than %x")
-TAG (L"##sqrt (%x)")
-DEFINITION (L"square root: \\Vr%x, %x \\>_ 0")
-TAG (L"##min (%x, ...)")
-DEFINITION (L"the minimum of a series of numbers, e.g. min (7.2, -5, 3) = -5")
-TAG (L"##max (%x, ...)")
-DEFINITION (L"the maximum of a series of numbers, e.g. max (7.2, -5, 3) = 7.2")
-TAG (L"##imin (%x, ...)")
-DEFINITION (L"the location of the minimum, e.g. imin (7.2, -5, 3) = 2")
-TAG (L"##imax (%x, ...)")
-DEFINITION (L"the location of the maximum, e.g. imax (7.2, -5, 3) = 1")
-TAG (L"##sin (%x)")
-DEFINITION (L"sine")
-TAG (L"##cos (%x)")
-DEFINITION (L"cosine")
-TAG (L"##tan (%x)")
-DEFINITION (L"tangent")
-TAG (L"##arcsin (%x)")
-DEFINITION (L"arcsine, -1 \\<_ %x \\<_ 1")
-TAG (L"##arccos (%x)")
-DEFINITION (L"arccosine, -1 \\<_ %x \\<_ 1")
-TAG (L"##arctan (%x)")
-DEFINITION (L"arctangent")
-TAG (L"##arctan2 (%y, %x)")
-DEFINITION (L"argument angle")
-TAG (L"##sinc (%x)")
-DEFINITION (L"sinus cardinalis: sin (%x) / %x")
-TAG (L"##sincpi (%x)")
-DEFINITION (L"sinc__%\\pi_: sin (%\\pi%x) / (%\\pi%x)")
-TAG (L"##exp (%x)")
-DEFINITION (L"exponentiation: %e^%x; same as ##e\\^ %x")
-TAG (L"##ln (%x)")
-DEFINITION (L"natural logarithm, base %e")
-TAG (L"##log10 (%x)")
-DEFINITION (L"logarithm, base 10")
-TAG (L"##log2 (%x)")
-DEFINITION (L"logarithm, base 2")
-TAG (L"##sinh (%x)")
-DEFINITION (L"hyperbolic sine: (%e^%x - %e^^-%x^) / 2")
-TAG (L"##cosh (%x)")
-DEFINITION (L"hyperbolic cosine: (%e^%x + %e^^-%x^) / 2")
-TAG (L"##tanh (%x)")
-DEFINITION (L"hyperbolic tangent: sinh (%x) / cosh (%x)")
-TAG (L"##arcsinh (%x)")
-DEFINITION (L"inverse hyperbolic sine: ln (%x + \\Vr(1+%x^2))")
-TAG (L"##arccosh (%x)")
-DEFINITION (L"inverse hyperbolic cosine: ln (%x + \\Vr(%x^2\\--1))")
-TAG (L"##arctanh (%x)")
-DEFINITION (L"inverse hyperbolic tangent")
-TAG (L"##sigmoid (%x)")
-DEFINITION (L"#R \\-> (0,1): 1 / (1 + %e^^\\--%x^) or 1 \\-- 1 / (1 + %e^%x)")
-TAG (L"##invSigmoid (%x)")
-DEFINITION (L"(0,1) \\-> #R: ln (%x / (1 \\-- %x))")
-TAG (L"##erf (%x)")
-DEFINITION (L"the error function: 2/\\Vr%\\pi __0_\\in^%x exp(-%t^2) %dt")
-TAG (L"##erfc (%x)")
-DEFINITION (L"the complement of the error function: 1 - erf (%x)")
-TAG (L"##randomUniform (%min, %max)")
-DEFINITION (L"uniform random deviate between %min (inclusive) and %max (exclusive)")
-TAG (L"##randomInteger (%min, %max)")
-DEFINITION (L"uniform random deviate between %min and %max (inclusive)")
-TAG (L"##randomGauss (%\\mu, %\\si)")
-DEFINITION (L"Gaussian random deviate with mean %\\mu and standard deviation %\\si")
-TAG (L"##randomPoisson (%mean)")
-DEFINITION (L"Poisson random deviate")
-TAG (L"##lnGamma (%x)")
-DEFINITION (L"logarithm of the \\Ga function")
-TAG (L"##gaussP (%z)")
-DEFINITION (L"the area under the Gaussian distribution between \\--\\oo and %z")
-TAG (L"##gaussQ (%z)")
-DEFINITION (L"the area under the Gaussian distribution between %z and +\\oo: "
+MAN_BEGIN (U"Formulas 3. Constants", U"ppgb", 20080318)
+TAG (U"##pi")
+DEFINITION (U"%\\pi, 3.14159265358979323846264338328")
+TAG (U"##e")
+DEFINITION (U"%e, 2.71828182845904523536028747135")
+TAG (U"##undefined")
+DEFINITION (U"a special value, see @undefined")
+MAN_END
+
+MAN_BEGIN (U"Formulas 4. Mathematical functions", U"ppgb", 20080318)
+TAG (U"##abs (%x)")
+DEFINITION (U"absolute value")
+TAG (U"##round (%x)")
+DEFINITION (U"nearest integer; round (1.5) = 2")
+TAG (U"##floor (%x)")
+DEFINITION (U"round down: highest integer value not greater than %x")
+TAG (U"##ceiling (%x)")
+DEFINITION (U"round up: lowest integer value not less than %x")
+TAG (U"##sqrt (%x)")
+DEFINITION (U"square root: \\Vr%x, %x \\>_ 0")
+TAG (U"##min (%x, ...)")
+DEFINITION (U"the minimum of a series of numbers, e.g. min (7.2, -5, 3) = -5")
+TAG (U"##max (%x, ...)")
+DEFINITION (U"the maximum of a series of numbers, e.g. max (7.2, -5, 3) = 7.2")
+TAG (U"##imin (%x, ...)")
+DEFINITION (U"the location of the minimum, e.g. imin (7.2, -5, 3) = 2")
+TAG (U"##imax (%x, ...)")
+DEFINITION (U"the location of the maximum, e.g. imax (7.2, -5, 3) = 1")
+TAG (U"##sin (%x)")
+DEFINITION (U"sine")
+TAG (U"##cos (%x)")
+DEFINITION (U"cosine")
+TAG (U"##tan (%x)")
+DEFINITION (U"tangent")
+TAG (U"##arcsin (%x)")
+DEFINITION (U"arcsine, -1 \\<_ %x \\<_ 1")
+TAG (U"##arccos (%x)")
+DEFINITION (U"arccosine, -1 \\<_ %x \\<_ 1")
+TAG (U"##arctan (%x)")
+DEFINITION (U"arctangent")
+TAG (U"##arctan2 (%y, %x)")
+DEFINITION (U"argument angle")
+TAG (U"##sinc (%x)")
+DEFINITION (U"sinus cardinalis: sin (%x) / %x")
+TAG (U"##sincpi (%x)")
+DEFINITION (U"sinc__%\\pi_: sin (%\\pi%x) / (%\\pi%x)")
+TAG (U"##exp (%x)")
+DEFINITION (U"exponentiation: %e^%x; same as ##e\\^ %x")
+TAG (U"##ln (%x)")
+DEFINITION (U"natural logarithm, base %e")
+TAG (U"##log10 (%x)")
+DEFINITION (U"logarithm, base 10")
+TAG (U"##log2 (%x)")
+DEFINITION (U"logarithm, base 2")
+TAG (U"##sinh (%x)")
+DEFINITION (U"hyperbolic sine: (%e^%x - %e^^-%x^) / 2")
+TAG (U"##cosh (%x)")
+DEFINITION (U"hyperbolic cosine: (%e^%x + %e^^-%x^) / 2")
+TAG (U"##tanh (%x)")
+DEFINITION (U"hyperbolic tangent: sinh (%x) / cosh (%x)")
+TAG (U"##arcsinh (%x)")
+DEFINITION (U"inverse hyperbolic sine: ln (%x + \\Vr(1+%x^2))")
+TAG (U"##arccosh (%x)")
+DEFINITION (U"inverse hyperbolic cosine: ln (%x + \\Vr(%x^2\\--1))")
+TAG (U"##arctanh (%x)")
+DEFINITION (U"inverse hyperbolic tangent")
+TAG (U"##sigmoid (%x)")
+DEFINITION (U"#R \\-> (0,1): 1 / (1 + %e^^\\--%x^) or 1 \\-- 1 / (1 + %e^%x)")
+TAG (U"##invSigmoid (%x)")
+DEFINITION (U"(0,1) \\-> #R: ln (%x / (1 \\-- %x))")
+TAG (U"##erf (%x)")
+DEFINITION (U"the error function: 2/\\Vr%\\pi __0_\\in^%x exp(-%t^2) %dt")
+TAG (U"##erfc (%x)")
+DEFINITION (U"the complement of the error function: 1 - erf (%x)")
+TAG (U"##randomUniform (%min, %max)")
+DEFINITION (U"uniform random deviate between %min (inclusive) and %max (exclusive)")
+TAG (U"##randomInteger (%min, %max)")
+DEFINITION (U"uniform random deviate between %min and %max (inclusive)")
+TAG (U"##randomGauss (%\\mu, %\\si)")
+DEFINITION (U"Gaussian random deviate with mean %\\mu and standard deviation %\\si")
+TAG (U"##randomPoisson (%mean)")
+DEFINITION (U"Poisson random deviate")
+TAG (U"##lnGamma (%x)")
+DEFINITION (U"logarithm of the \\Ga function")
+TAG (U"##gaussP (%z)")
+DEFINITION (U"the area under the Gaussian distribution between \\--\\oo and %z")
+TAG (U"##gaussQ (%z)")
+DEFINITION (U"the area under the Gaussian distribution between %z and +\\oo: "
 	"the one-tailed \"statistical significance %p\" of a value that is %z standard deviations "
 	"away from the mean of a Gaussian distribution")
-TAG (L"##invGaussQ (%q)")
-DEFINITION (L"the value of %z for which $gaussQ (%z) = %q")
-TAG (L"##chiSquareP (%chiSquare, %df)")
-DEFINITION (L"the area under the %\\ci^2 distribution between 0 and %chiSquare, for %df degrees of freedom")
-TAG (L"##chiSquareQ (%chiSquare, %df)")
-DEFINITION (L"the area under the %\\ci^2 distribution between %chiSquare and +\\oo, "
+TAG (U"##invGaussQ (%q)")
+DEFINITION (U"the value of %z for which $gaussQ (%z) = %q")
+TAG (U"##chiSquareP (%chiSquare, %df)")
+DEFINITION (U"the area under the %\\ci^2 distribution between 0 and %chiSquare, for %df degrees of freedom")
+TAG (U"##chiSquareQ (%chiSquare, %df)")
+DEFINITION (U"the area under the %\\ci^2 distribution between %chiSquare and +\\oo, "
 	"for %df degrees of freedom: the \"statistical significance %p\" "
 	"of the %\\ci^2 difference between two distributions in %df+1 dimensions")
-TAG (L"##invChiSquareQ (%q, %df)")
-DEFINITION (L"the value of %\\ci^2 for which $chiSquareQ (%\\ci^2, %df) = %q")
-TAG (L"##studentP (%t, %df)")
-DEFINITION (L"the area under the student T-distribution from -\\oo to %t")
-TAG (L"##studentQ (%t, %df)")
-DEFINITION (L"the area under the student T-distribution from %t to +\\oo")
-TAG (L"##invStudentQ (%q, %df)")
-DEFINITION (L"the value of %t for which $studentQ (%t, %df) = %q")
-TAG (L"##fisherP (%f, %df1, %df2)")
-DEFINITION (L"the area under Fisher's F-distribution from 0 to %f")
-TAG (L"##fisherQ (%f, %df1, %df2)")
-DEFINITION (L"the area under Fisher's F-distribution from %f to +\\oo")
-TAG (L"##invFisherQ (%q, %df1, %df2)")
-DEFINITION (L"the value of %f for which $fisherQ (%f, %df1, %df2) = %q")
-TAG (L"##binomialP (%p, %k, %n)")
-DEFINITION (L"the probability that in %n experiments, an event with probability %p will occur at most %k times")
-TAG (L"@binomialQ (%p, %k, %n)")
-DEFINITION (L"the probability that in %n experiments, an event with probability %p will occur at least %k times; equals 1 - $binomialP (%p, %k - 1, %n)")
-TAG (L"##invBinomialP (%P, %k, %n)")
-DEFINITION (L"the value of %p for which $binomialP (%p, %k, %n) = %P")
-TAG (L"##invBinomialQ (%Q, %k, %n)")
-DEFINITION (L"the value of %p for which $binomialQ (%p, %k, %n) = %Q")
-TAG (L"##hertzToBark (%x)")
-DEFINITION (L"from acoustic frequency to Bark-rate (perceptual spectral frequency; place on basilar membrane): "
+TAG (U"##invChiSquareQ (%q, %df)")
+DEFINITION (U"the value of %\\ci^2 for which $chiSquareQ (%\\ci^2, %df) = %q")
+TAG (U"##studentP (%t, %df)")
+DEFINITION (U"the area under the student T-distribution from -\\oo to %t")
+TAG (U"##studentQ (%t, %df)")
+DEFINITION (U"the area under the student T-distribution from %t to +\\oo")
+TAG (U"##invStudentQ (%q, %df)")
+DEFINITION (U"the value of %t for which $studentQ (%t, %df) = %q")
+TAG (U"##fisherP (%f, %df1, %df2)")
+DEFINITION (U"the area under Fisher's F-distribution from 0 to %f")
+TAG (U"##fisherQ (%f, %df1, %df2)")
+DEFINITION (U"the area under Fisher's F-distribution from %f to +\\oo")
+TAG (U"##invFisherQ (%q, %df1, %df2)")
+DEFINITION (U"the value of %f for which $fisherQ (%f, %df1, %df2) = %q")
+TAG (U"##binomialP (%p, %k, %n)")
+DEFINITION (U"the probability that in %n experiments, an event with probability %p will occur at most %k times")
+TAG (U"@binomialQ (%p, %k, %n)")
+DEFINITION (U"the probability that in %n experiments, an event with probability %p will occur at least %k times; equals 1 - $binomialP (%p, %k - 1, %n)")
+TAG (U"##invBinomialP (%P, %k, %n)")
+DEFINITION (U"the value of %p for which $binomialP (%p, %k, %n) = %P")
+TAG (U"##invBinomialQ (%Q, %k, %n)")
+DEFINITION (U"the value of %p for which $binomialQ (%p, %k, %n) = %Q")
+TAG (U"##hertzToBark (%x)")
+DEFINITION (U"from acoustic frequency to Bark-rate (perceptual spectral frequency; place on basilar membrane): "
 	"7 ln (%x/650 + \\Vr(1 + (%x/650)^2))")
-TAG (L"##barkToHertz (%x)")
-DEFINITION (L"650 sinh (%x / 7)")
-TAG (L"##hertzToMel (%x)")
-DEFINITION (L"from acoustic frequency to perceptual pitch: 550 ln (1 + %x / 550)")
-TAG (L"##melToHertz (%x)")
-DEFINITION (L"550 (exp (%x / 550) - 1)")
-TAG (L"##hertzToSemitones (%x)")
-DEFINITION (L"from acoustic frequency to a logarithmic musical scale, relative to 100 Hz: 12 ln (%x / 100) / ln 2")
-TAG (L"##semitonesToHertz (%x)")
-DEFINITION (L"100 exp (%x ln 2 / 12)")
-TAG (L"##erb (%f)")
-DEFINITION (L"the perceptual %%equivalent rectangular bandwidth% (ERB) in hertz, for a specified acoustic frequency (also in hertz): "
+TAG (U"##barkToHertz (%x)")
+DEFINITION (U"650 sinh (%x / 7)")
+TAG (U"##hertzToMel (%x)")
+DEFINITION (U"from acoustic frequency to perceptual pitch: 550 ln (1 + %x / 550)")
+TAG (U"##melToHertz (%x)")
+DEFINITION (U"550 (exp (%x / 550) - 1)")
+TAG (U"##hertzToSemitones (%x)")
+DEFINITION (U"from acoustic frequency to a logarithmic musical scale, relative to 100 Hz: 12 ln (%x / 100) / ln 2")
+TAG (U"##semitonesToHertz (%x)")
+DEFINITION (U"100 exp (%x ln 2 / 12)")
+TAG (U"##erb (%f)")
+DEFINITION (U"the perceptual %%equivalent rectangular bandwidth% (ERB) in hertz, for a specified acoustic frequency (also in hertz): "
 	"6.23\\.c10^^-6^ %f^2 + 0.09339 %f + 28.52")
-TAG (L"##hertzToErb (%x)")
-DEFINITION (L"from acoustic frequency to ERB-rate: 11.17 ln ((%x + 312) / (%x + 14680)) + 43")
-TAG (L"##erbToHertz (%x)")
-DEFINITION (L"(14680 %d - 312) / (1 - %d) where %d = exp ((%x - 43) / 11.17)")
-TAG (L"@phonToDifferenceLimens (%x)")
-DEFINITION (L"from perceptual loudness (intensity sensation) level in phon, to the number of intensity "
+TAG (U"##hertzToErb (%x)")
+DEFINITION (U"from acoustic frequency to ERB-rate: 11.17 ln ((%x + 312) / (%x + 14680)) + 43")
+TAG (U"##erbToHertz (%x)")
+DEFINITION (U"(14680 %d - 312) / (1 - %d) where %d = exp ((%x - 43) / 11.17)")
+TAG (U"@phonToDifferenceLimens (%x)")
+DEFINITION (U"from perceptual loudness (intensity sensation) level in phon, to the number of intensity "
 	"difference limens above threshold: 30 \\.c ((61/60)^^ %x^ \\-- 1).")
-TAG (L"@differenceLimensToPhon (%x)")
-DEFINITION (L"the inverse of the previous: ln (1 + %x / 30) / ln (61 / 60).")
-TAG (L"##beta (%x, %y)")
-TAG (L"##besselI (%n, %x)")
-TAG (L"##besselK (%n, %x)")
+TAG (U"@differenceLimensToPhon (%x)")
+DEFINITION (U"the inverse of the previous: ln (1 + %x / 30) / ln (61 / 60).")
+TAG (U"##beta (%x, %y)")
+TAG (U"##besselI (%n, %x)")
+TAG (U"##besselK (%n, %x)")
 MAN_END
 
-MAN_BEGIN (L"Formulas 5. String functions", L"ppgb", 20140223)
-INTRO (L"String functions are functions that either return a text string or have at least one text string as an argument. "
+MAN_BEGIN (U"Formulas 5. String functions", U"ppgb", 20140223)
+INTRO (U"String functions are functions that either return a text string or have at least one text string as an argument. "
 	"Since string computations are not very useful in the @calculator, in settings windows, or in creation and "
 	"modification formulas, this page only gives examples of strings in scripts, so that the example may contain "
 	"string variables.")
-TAG (L"##length (a\\$ )")
-DEFINITION (L"gives the length of the string. After")
-		CODE2 (L"string\\$  = \"hallo\"")
-		CODE2 (L"length = length (string\\$  + \"dag\")")
-DEFINITION (L"the variable %length contains the number 8 (by the way, from this example "
+TAG (U"##length (a\\$ )")
+DEFINITION (U"gives the length of the string. After")
+		CODE2 (U"string\\$  = \"hallo\"")
+		CODE2 (U"length = length (string\\$  + \"dag\")")
+DEFINITION (U"the variable %length contains the number 8 (by the way, from this example "
 	"you see that variables can have the same names as functions, without any danger of confusing the interpreter).")
-TAG (L"##left\\$  (a\\$ , n)")
-DEFINITION (L"gives a string consisting of the first %n characters of %%a\\$ %. After")
-		CODE2 (L"head\\$  = left\\$  (\"hallo\", 3)")
-DEFINITION (L"the variable %%head\\$ % contains the string \"hal\".")
-TAG (L"##right\\$  (a\\$ , n)")
-DEFINITION (L"gives a string consisting of the last %n characters of %%a\\$ %. After")
-		CODE2 (L"english\\$  = \"he\" + right\\$  (\"hallo\", 3)")
-DEFINITION (L"the variable %%english\\$ % contains the string \"hello\".")
-TAG (L"##mid\\$  (\"hello\" , 3, 2)")
-DEFINITION (L"gives a string consisting of 2 characters from \"hello\", starting at the third character. Outcome: ll.")
-TAG (L"##index (a\\$ , b\\$ )")
-DEFINITION (L"gives the index of the first occurrence of the string %%b\\$ % in the string %%a\\$ %. After")
-		CODE2 (L"where = index (\"hallo allemaal\", \"al\")")
-DEFINITION (L"the variable %where contains the number 2, because the first \"al\" starts at the second character of the longer string. "
+TAG (U"##left\\$  (a\\$ , n)")
+DEFINITION (U"gives a string consisting of the first %n characters of %%a\\$ %. After")
+		CODE2 (U"head\\$  = left\\$  (\"hallo\", 3)")
+DEFINITION (U"the variable %%head\\$ % contains the string \"hal\".")
+TAG (U"##right\\$  (a\\$ , n)")
+DEFINITION (U"gives a string consisting of the last %n characters of %%a\\$ %. After")
+		CODE2 (U"english\\$  = \"he\" + right\\$  (\"hallo\", 3)")
+DEFINITION (U"the variable %%english\\$ % contains the string \"hello\".")
+TAG (U"##mid\\$  (\"hello\" , 3, 2)")
+DEFINITION (U"gives a string consisting of 2 characters from \"hello\", starting at the third character. Outcome: ll.")
+TAG (U"##index (a\\$ , b\\$ )")
+DEFINITION (U"gives the index of the first occurrence of the string %%b\\$ % in the string %%a\\$ %. After")
+		CODE2 (U"where = index (\"hallo allemaal\", \"al\")")
+DEFINITION (U"the variable %where contains the number 2, because the first \"al\" starts at the second character of the longer string. "
 	"If the first string does not contain the second string, %index returns 0.")
-TAG (L"##rindex (a\\$ , b\\$ )")
-DEFINITION (L"gives the index of the last occurrence of the string %%b\\$ % in the string %%a\\$ %. After")
-		CODE2 (L"where = rindex (\"hallo allemaal\", \"al\")")
-DEFINITION (L"the variable %where contains the number 13, because the last \"al\" starts at the 13th character. "
+TAG (U"##rindex (a\\$ , b\\$ )")
+DEFINITION (U"gives the index of the last occurrence of the string %%b\\$ % in the string %%a\\$ %. After")
+		CODE2 (U"where = rindex (\"hallo allemaal\", \"al\")")
+DEFINITION (U"the variable %where contains the number 13, because the last \"al\" starts at the 13th character. "
 	"If the first string does not contain the second string, %rindex returns 0.")
-TAG (L"##startsWith (a\\$ , b\\$ )")
-DEFINITION (L"determines whether the string %%a\\$ % starts with the string %%b\\$ %. After")
-		CODE2 (L"where = startsWith (\"internationalization\", \"int\")")
-DEFINITION (L"the variable %where contains the number 1 (true).")
-TAG (L"##endsWith (a\\$ , b\\$ )")
-DEFINITION (L"determines whether the string %%a\\$ % ends with the string %%b\\$ %. After")
-		CODE2 (L"where = endsWith (\"internationalization\", \"nation\")")
-DEFINITION (L"the variable %where contains the number 0 (false).")
-TAG (L"##replace\\$  (a\\$ , b\\$ , c\\$ , n)")
-DEFINITION (L"gives a string that is like %%a\\$ %, but where (at most %n) occurrences of %%b\\$ % are replaced with the string %%c\\$ %. After")
-		CODE2 (L"s\\$  = replace\\$  (\"hello\", \"l\", \"m\", 0)")
-DEFINITION (L"the variable %%s\\$ % contains the string \"hemmo\". After")
-		CODE2 (L"s\\$  = replace\\$  (\"hello\", \"l\", \"m\", 1)")
-DEFINITION (L"the variable %%s\\$ % contains the string \"hemlo\". The number %n determines the maximum number of occurrences of %%b\\$ % "
+TAG (U"##startsWith (a\\$ , b\\$ )")
+DEFINITION (U"determines whether the string %%a\\$ % starts with the string %%b\\$ %. After")
+		CODE2 (U"where = startsWith (\"internationalization\", \"int\")")
+DEFINITION (U"the variable %where contains the number 1 (true).")
+TAG (U"##endsWith (a\\$ , b\\$ )")
+DEFINITION (U"determines whether the string %%a\\$ % ends with the string %%b\\$ %. After")
+		CODE2 (U"where = endsWith (\"internationalization\", \"nation\")")
+DEFINITION (U"the variable %where contains the number 0 (false).")
+TAG (U"##replace\\$  (a\\$ , b\\$ , c\\$ , n)")
+DEFINITION (U"gives a string that is like %%a\\$ %, but where (at most %n) occurrences of %%b\\$ % are replaced with the string %%c\\$ %. After")
+		CODE2 (U"s\\$  = replace\\$  (\"hello\", \"l\", \"m\", 0)")
+DEFINITION (U"the variable %%s\\$ % contains the string \"hemmo\". After")
+		CODE2 (U"s\\$  = replace\\$  (\"hello\", \"l\", \"m\", 1)")
+DEFINITION (U"the variable %%s\\$ % contains the string \"hemlo\". The number %n determines the maximum number of occurrences of %%b\\$ % "
 	"that can be replaced. If %n is 0, all occurrences are replaced.")
-TAG (L"##index_regex (a\\$ , b\\$ )")
-DEFINITION (L"determines where the string %%a\\$ % first matches the @@regular expressions|regular expression@ %%b\\$ %. After")
-		CODE2 (L"where = index_regex (\"internationalization\", \"a.*n\")")
-DEFINITION (L"the variable %where contains the number 7. If there is no match, the outcome is 0.")
-TAG (L"##rindex_regex (a\\$ , b\\$ )")
-DEFINITION (L"determines where the string %%a\\$ % last matches the @@regular expressions|regular expression@ %%b\\$ %. After")
-		CODE2 (L"where = rindex_regex (\"internationalization\", \"a.*n\")")
-DEFINITION (L"the variable %where contains the number 16. If there is no match, the outcome is 0.")
-TAG (L"##replace_regex\\$  (a\\$ , b\\$ , c\\$ , n)")
-DEFINITION (L"gives a string that is like %%a\\$ %, but where (at most %n) substrings that match the @@regular expressions|regular expression@ %%b\\$ % "
+TAG (U"##index_regex (a\\$ , b\\$ )")
+DEFINITION (U"determines where the string %%a\\$ % first matches the @@regular expressions|regular expression@ %%b\\$ %. After")
+		CODE2 (U"where = index_regex (\"internationalization\", \"a.*n\")")
+DEFINITION (U"the variable %where contains the number 7. If there is no match, the outcome is 0.")
+TAG (U"##rindex_regex (a\\$ , b\\$ )")
+DEFINITION (U"determines where the string %%a\\$ % last matches the @@regular expressions|regular expression@ %%b\\$ %. After")
+		CODE2 (U"where = rindex_regex (\"internationalization\", \"a.*n\")")
+DEFINITION (U"the variable %where contains the number 16. If there is no match, the outcome is 0.")
+TAG (U"##replace_regex\\$  (a\\$ , b\\$ , c\\$ , n)")
+DEFINITION (U"gives a string that is like %%a\\$ %, but where (at most %n) substrings that match the @@regular expressions|regular expression@ %%b\\$ % "
 	"are replaced with the expression %%c\\$ %. After")
-		CODE2 (L"s\\$  = replace_regex\\$  (\"hello\", \".\", \"&&\", 0)")
-DEFINITION (L"the variable %%s\\$ % contains the string \"hheelllloo\". If there is no match, "
+		CODE2 (U"s\\$  = replace_regex\\$  (\"hello\", \".\", \"&&\", 0)")
+DEFINITION (U"the variable %%s\\$ % contains the string \"hheelllloo\". If there is no match, "
 	"the outcome is the original string a\\$ . After")
-		CODE2 (L"s\\$  = replace_regex\\$  (\"hello\", \".\", \"&&\", 1)")
-DEFINITION (L"the variable %%s\\$ % contains the string \"hhello\". The number %n determines the maximum number of text pieces "
+		CODE2 (U"s\\$  = replace_regex\\$  (\"hello\", \".\", \"&&\", 1)")
+DEFINITION (U"the variable %%s\\$ % contains the string \"hhello\". The number %n determines the maximum number of text pieces "
 	"that can be replaced. If %n is 0, all matching text pieces are replaced.")
-TAG (L"##string\\$  (number)")
-DEFINITION (L"formats a number as a string. Thus, $$string\\$  (5e6)$ "
+TAG (U"##string\\$  (number)")
+DEFINITION (U"formats a number as a string. Thus, $$string\\$  (5e6)$ "
 	"becomes the string $$5000000$, and $$string\\$  (56\\% )$ becomes the string $$0.56$.")
-TAG (L"##fixed\\$  (number, precision)")
-DEFINITION (L"formats a number as a string with %precision digits after the decimal point. Thus, $$fixed\\$  (72.65687, 3)$ "
+TAG (U"##fixed\\$  (number, precision)")
+DEFINITION (U"formats a number as a string with %precision digits after the decimal point. Thus, $$fixed\\$  (72.65687, 3)$ "
 	"becomes the string $$72.657$, and $$fixed\\$  (72.65001, 3)$ becomes the string $$72.650$. "
 	"In these examples, we see that the result can be rounded up and that trailing zeroes are kept. "
 	"At least one digit of precision is always given, e.g. $$fixed\\$  (0.0000157, 3)$ becomes the string $$0.00002$. "
 	"The number 0 always becomes the string $0.")
-TAG (L"##percent\\$  (number, precision)")
-DEFINITION (L"the same as ##fixed\\$ #, but with a percent sign. For instance, $$percent\\$ (0.157, 3)$ becomes $$15.700\\% $, "
+TAG (U"##percent\\$  (number, precision)")
+DEFINITION (U"the same as ##fixed\\$ #, but with a percent sign. For instance, $$percent\\$ (0.157, 3)$ becomes $$15.700\\% $, "
 	"$$percent\\$ (0.000157, 3)$ becomes $$0.016\\% $, and $$percent\\$  (0.000000157, 3)$ becomes $$0.00002\\% $. "
 	"The number 0 always becomes the string $0.")
-TAG (L"##number (a\\$ )")
-DEFINITION (L"interprets a string as a number.")
-		CODE2 (L"string\\$  = \"5e6\"")
-		CODE2 (L"writeInfoLine: 3 + number (string\\$ )")
-DEFINITION (L"the Info window contains the number 500003.")
-TAG (L"##date\\$  ( )")
-DEFINITION (L"gives the date and time in the following format:")
-		CODE2 (L"Mon Jun 24 17:11:21 2002")
-DEFINITION (L"To write the day of the month into the Info window, you type:")
-		CODE2 (L"date\\$  = date\\$  ()")
-		CODE2 (L"day\\$  = mid\\$  (date\\$ , 9, 2)")
-		CODE2 (L"writeInfoLine: \"The month day is \", day\\$ , \".\"")
-TAG (L"##extractNumber (\"Type: Sound\" + newline\\$  + \"Name: hello there\" + newline\\$  + \"Size: 44007\", \"Size:\")")
-DEFINITION (L"looks for a number after the first occurrence of \"Size:\" in the long string. Outcome: 44007. "
+TAG (U"##number (a\\$ )")
+DEFINITION (U"interprets a string as a number.")
+		CODE2 (U"string\\$  = \"5e6\"")
+		CODE2 (U"writeInfoLine: 3 + number (string\\$ )")
+DEFINITION (U"the Info window contains the number 500003.")
+TAG (U"##date\\$  ( )")
+DEFINITION (U"gives the date and time in the following format:")
+		CODE2 (U"Mon Jun 24 17:11:21 2002")
+DEFINITION (U"To write the day of the month into the Info window, you type:")
+		CODE2 (U"date\\$  = date\\$  ()")
+		CODE2 (U"day\\$  = mid\\$  (date\\$ , 9, 2)")
+		CODE2 (U"writeInfoLine: \"The month day is \", day\\$ , \".\"")
+TAG (U"##extractNumber (\"Type: Sound\" + newline\\$  + \"Name: hello there\" + newline\\$  + \"Size: 44007\", \"Size:\")")
+DEFINITION (U"looks for a number after the first occurrence of \"Size:\" in the long string. Outcome: 44007. "
 	"This is useful in scripts that try to get information from long reports, as the following script that "
 	"runs in the Sound editor window:")
-		CODE2 (L"report\\$  = Editor info")
-		CODE2 (L"maximumFrequency = extractNumber (report\\$ , \"Spectrogram window length:\")")
-TAG (L"##extractWord\\$  (\"Type: Sound\" + newline\\$  + \"Name: hello there\" + newline\\$  + \"Size: 44007\", \"Type:\")")
-DEFINITION (L"looks for a word without spaces after the first occurrence of \"Type:\" in the long string. Outcome: Sound.")
-TAG (L"##extractLine\\$  (\"Type: Sound\" + newline\\$  + \"Name: hello there\" + newline\\$  + \"Size: 44007\", \"Name: \")")
-DEFINITION (L"looks for the rest of the line (including spaces) after the first occurrence of \"Name: \" in the long string. "
+		CODE2 (U"report\\$  = Editor info")
+		CODE2 (U"maximumFrequency = extractNumber (report\\$ , \"Spectrogram window length:\")")
+TAG (U"##extractWord\\$  (\"Type: Sound\" + newline\\$  + \"Name: hello there\" + newline\\$  + \"Size: 44007\", \"Type:\")")
+DEFINITION (U"looks for a word without spaces after the first occurrence of \"Type:\" in the long string. Outcome: Sound.")
+TAG (U"##extractLine\\$  (\"Type: Sound\" + newline\\$  + \"Name: hello there\" + newline\\$  + \"Size: 44007\", \"Name: \")")
+DEFINITION (U"looks for the rest of the line (including spaces) after the first occurrence of \"Name: \" in the long string. "
 	"Outcome: hello there. Note how \"Name: \" includes a space, so that the `rest of the line' starts with the %h.")
-TAG (L"##backslashTrigraphsToUnicode\\$  (x\\$ ), unicodeToBackslashTrigraphs\\$  (x\\$ )")
-DEFINITION (L"converts e.g. \\bsct to \\ct or the reverse. See @@Special symbols at .")
-MAN_END
-
-MAN_BEGIN (L"Formulas 6. Control structures", L"ppgb", 20030519)
-ENTRY (L"if ... then ... else ... fi")
-NORMAL (L"You can use conditional expressions in all formulas. For example, ")
-CODE (L"3 * if 52\\%  * 3809 > 2000 then 5 else 6 fi")
-NORMAL (L"evaluates to 15. Instead of %fi, you can also use %endif.")
-NORMAL (L"Another example: you can clip the absolute amplitude of a Sound to 0.5 by supplying the following formula:")
-CODE (L"if abs(self)>0.5 then if self>0 then 0.5 else -0.5 fi else self fi")
-ENTRY (L"The semicolon")
-NORMAL (L"The semicolon ends the evaluation of the formula. This can be convenient "
+TAG (U"##backslashTrigraphsToUnicode\\$  (x\\$ ), unicodeToBackslashTrigraphs\\$  (x\\$ )")
+DEFINITION (U"converts e.g. \\bsct to \\ct or the reverse. See @@Special symbols at .")
+MAN_END
+
+MAN_BEGIN (U"Formulas 6. Control structures", U"ppgb", 20030519)
+ENTRY (U"if ... then ... else ... fi")
+NORMAL (U"You can use conditional expressions in all formulas. For example, ")
+CODE (U"3 * if 52\\%  * 3809 > 2000 then 5 else 6 fi")
+NORMAL (U"evaluates to 15. Instead of %fi, you can also use %endif.")
+NORMAL (U"Another example: you can clip the absolute amplitude of a Sound to 0.5 by supplying the following formula:")
+CODE (U"if abs(self)>0.5 then if self>0 then 0.5 else -0.5 fi else self fi")
+ENTRY (U"The semicolon")
+NORMAL (U"The semicolon ends the evaluation of the formula. This can be convenient "
 	"if you do not want to overwrite a long formula in your text field: the formula")
-CODE (L"800;sqrt(2)*sin(2*pi*103*0.5)+10\\^ (-40/20)*randomGauss(0,1)")
-NORMAL (L"evaluates to 800.")
+CODE (U"800;sqrt(2)*sin(2*pi*103*0.5)+10\\^ (-40/20)*randomGauss(0,1)")
+NORMAL (U"evaluates to 800.")
 MAN_END
 
-MAN_BEGIN (L"Formulas 7. Attributes of objects", L"ppgb", 20070225)
-NORMAL (L"You can refer to several attributes of objects that are visible in the @@List of Objects at . "
+MAN_BEGIN (U"Formulas 7. Attributes of objects", U"ppgb", 20070225)
+NORMAL (U"You can refer to several attributes of objects that are visible in the @@List of Objects at . "
 	"To do so, use the type and the name of the object, connected with an underscore. "
 	"Thus, $$Sound_hallo$ refers to an existing Sound object whose name is \"hallo\" "
 	"(if there is more than one such object, it refers to the one that was created last). "
 	"You can also use the unique ID instead of the name. Thus, $$Object_113$ refers to the 113th object that you created in the list.")
-NORMAL (L"To refer to an attribute, you use the period ( `.'). "
+NORMAL (U"To refer to an attribute, you use the period ( `.'). "
 	"Thus, $$Sound_hallo.nx$ is the number of samples of Sound_hallo, and "
 	"$$1 / Sound_hallo.dx$ is the sampling frequency of Sound_hallo.")
-ENTRY (L"Attributes in the calculator")
-NORMAL (L"Record a Sound (read the @Intro if you do not know how to do that), "
+ENTRY (U"Attributes in the calculator")
+NORMAL (U"Record a Sound (read the @Intro if you do not know how to do that), "
 	"name it \"mysound\" (or anything else), and type the following formula into the @calculator:")
-CODE (L"Sound_mysound.nx")
-NORMAL (L"After you click OK, the Info window will show the number of samples. Since you could have got this result "
+CODE (U"Sound_mysound.nx")
+NORMAL (U"After you click OK, the Info window will show the number of samples. Since you could have got this result "
 	"by simply choosing ##%%Get number of samples#% from the @Query menu, these attribute tricks are not very "
 	"useful in the calculator. We will see that they are much more useful in creation and modification formulas and in scripts.")
-ENTRY (L"List of possible attributes")
-NORMAL (L"The following attributes are available:")
-TAG (L"#xmin")
-DEFINITION (L"the start of the time domain (usually 0) for a @Sound, @Pitch, @Formant, "
+ENTRY (U"List of possible attributes")
+NORMAL (U"The following attributes are available:")
+TAG (U"#xmin")
+DEFINITION (U"the start of the time domain (usually 0) for a @Sound, @Pitch, @Formant, "
 	"@Spectrogram, @Intensity, @Cochleagram, @PointProcess, or @Harmonicity object, in seconds; "
 	"the lowest frequency (always 0) for a @Spectrum object, in hertz; "
 	"the lowest frequency (usually 0) for an @Excitation object, in Bark; "
 	"the left edge of the %x domain for a @Matrix object.")
-TAG (L"#xmax")
-DEFINITION (L"the end of the time domain (usually the duration, if %xmin is zero) for a Sound, Pitch, Formant, "
+TAG (U"#xmax")
+DEFINITION (U"the end of the time domain (usually the duration, if %xmin is zero) for a Sound, Pitch, Formant, "
 	"Spectrogram, Intensity, Cochleagram, PointProcess, or Harmonicity object, in seconds; "
 	"the highest frequency (@@Nyquist frequency@) for a Spectrum object, e.g. 11025 hertz; "
 	"the highest frequency for an Excitation object, often 25.6 Bark; "
 	"the right edge of the %x domain for a Matrix object.")
-TAG (L"#ncol")
-DEFINITION (L"the number of columns in a @Matrix, @TableOfReal, or @Table object.")
-TAG (L"#nrow")
-DEFINITION (L"the number of rows in a @Matrix, @TableOfReal, or @Table object.")
-TAG (L"##col\\$ # [%i]")
-DEFINITION (L"the name of column %i in a @TableOfReal or @Table object.")
-TAG (L"##row\\$ # [%i]")
-DEFINITION (L"the name of row %i in a @TableOfReal object.")
-TAG (L"#nx")
-DEFINITION (L"the number of samples in a Sound object; "
+TAG (U"#ncol")
+DEFINITION (U"the number of columns in a @Matrix, @TableOfReal, or @Table object.")
+TAG (U"#nrow")
+DEFINITION (U"the number of rows in a @Matrix, @TableOfReal, or @Table object.")
+TAG (U"##col\\$ # [%i]")
+DEFINITION (U"the name of column %i in a @TableOfReal or @Table object.")
+TAG (U"##row\\$ # [%i]")
+DEFINITION (U"the name of row %i in a @TableOfReal object.")
+TAG (U"#nx")
+DEFINITION (U"the number of samples in a Sound object; "
 	"the number of analysis frames in a Pitch, Formant, Spectrogram, Intensity, Cochleagram, or Harmonicity object; "
 	"the number of frequency bins in a Spectrum or Excitation object; "
 	"the number of divisions of the %x domain for a Matrix object (= %ncol).")
-TAG (L"#dx")
-DEFINITION (L"the sample period (time distance between consecutive samples) in a Sound object (the inverse of the sampling frequency), in seconds; "
+TAG (U"#dx")
+DEFINITION (U"the sample period (time distance between consecutive samples) in a Sound object (the inverse of the sampling frequency), in seconds; "
 	"the time step between consecutive frames in a Pitch, Formant, Spectrogram, Intensity, Cochleagram, or Harmonicity object, in seconds; "
 	"the width of a frequency bin in a Spectrum object, in hertz; "
 	"the width of a frequency bin in an Excitation object, in Bark; "
 	"the horizontal distance between cells in a Matrix object.")
-TAG (L"#ymin")
-DEFINITION (L"the lowest frequency (usually 0) for a Spectrogram object, in hertz; "
+TAG (U"#ymin")
+DEFINITION (U"the lowest frequency (usually 0) for a Spectrogram object, in hertz; "
 	"the lowest frequency (usually 0) for a Cochleagram object, in Bark; "
 	"the bottom of the %y domain for a Matrix object.")
-TAG (L"#ymax")
-DEFINITION (L"the highest frequency for a Spectrogram object, e.g. 5000 hertz; "
+TAG (U"#ymax")
+DEFINITION (U"the highest frequency for a Spectrogram object, e.g. 5000 hertz; "
 	"the highest frequency for a Cochleagram object, often 25.6 Bark; "
 	"the top of the %y domain for a Matrix object.")
-TAG (L"#ny")
-DEFINITION (L"the number of frequency bands in a Spectrogram or Cochleagram object; "
+TAG (U"#ny")
+DEFINITION (U"the number of frequency bands in a Spectrogram or Cochleagram object; "
 	"for a Spectrum object: always 2 (first row is real part, second row is imaginary part) "
 	"the number of divisions of the %y domain for a Matrix object (= %nrow).")
-TAG (L"#dy")
-DEFINITION (L"the distance between adjacent frequency bands in a Spectrogram object, in hertz; "
+TAG (U"#dy")
+DEFINITION (U"the distance between adjacent frequency bands in a Spectrogram object, in hertz; "
 	"the distance between adjacent frequency bands in a Cochleagram object, in hertz; "
 	"the vertical distance between cells in a Matrix object.")
-ENTRY (L"Attributes in a creation formula")
-NORMAL (L"In formulas for creating a new object, you can refer to the attributes of any object, "
+ENTRY (U"Attributes in a creation formula")
+NORMAL (U"In formulas for creating a new object, you can refer to the attributes of any object, "
 	"but you will often want to refer to the attributes of the object that is just being created. You can do that in two ways.")
-NORMAL (L"The first way is to use the name of the object, as above. Choose @@Create Sound from formula...@, supply %hello for its name, "
+NORMAL (U"The first way is to use the name of the object, as above. Choose @@Create Sound from formula...@, supply %hello for its name, "
 	"supply arbitrary values for the starting and finishing time, and type the following formula:")
-CODE (L"(x - Sound_hello.xmin) / (Sound_hello.xmax - Sound_hello.xmin)")
-NORMAL (L"When you edit this sound, you can see that it creates a straight line that rises from 0 to 1 within the time domain.")
-NORMAL (L"The formula above will also work if the Sound under creation is called %goodbye, and a Sound called %hello already exists; "
+CODE (U"(x - Sound_hello.xmin) / (Sound_hello.xmax - Sound_hello.xmin)")
+NORMAL (U"When you edit this sound, you can see that it creates a straight line that rises from 0 to 1 within the time domain.")
+NORMAL (U"The formula above will also work if the Sound under creation is called %goodbye, and a Sound called %hello already exists; "
 	"of course, in such a case $$Sound_hello.xmax$ refers to a property of the already existing sound.")
-NORMAL (L"If a formula refers to an object under creation, there is a shorter way: you do not have to supply the name of the object at all, "
+NORMAL (U"If a formula refers to an object under creation, there is a shorter way: you do not have to supply the name of the object at all, "
 	"so you can simply write")
-CODE (L"(x - xmin) / (xmax - xmin)")
-NORMAL (L"The attributes that you can use in this implicit way are %xmin, %xmax, %ncol, %nrow, %nx, %dx, %ny, and %dy. "
+CODE (U"(x - xmin) / (xmax - xmin)")
+NORMAL (U"The attributes that you can use in this implicit way are %xmin, %xmax, %ncol, %nrow, %nx, %dx, %ny, and %dy. "
 	"To disambiguate in case there exists a script variable %xmin as well, you can write %%Self.xmin%.")
-ENTRY (L"Attributes in a modification formula")
-NORMAL (L"In formulas for modifying an existing object, you refer to attributes in the same way as in creation formulas, "
+ENTRY (U"Attributes in a modification formula")
+NORMAL (U"In formulas for modifying an existing object, you refer to attributes in the same way as in creation formulas, "
 	"i.e., you do not have to specify the name of the object that is being modified. The formula")
-CODE (L"self * 20 \\^  (- (x - xmin) / (xmax - xmin))")
-NORMAL (L"causes the sound to decay exponentially in such a way that it has only 5 percent of its initial amplitude at the end. "
+CODE (U"self * 20 \\^  (- (x - xmin) / (xmax - xmin))")
+NORMAL (U"causes the sound to decay exponentially in such a way that it has only 5 percent of its initial amplitude at the end. "
 	"If you apply this formula to multiple Sound objects at the same time, %xmax will refer to the finishing time of each Sound separately "
 	"as it is modified. To disambiguate in case there exists a script variable %xmin as well, you can write %%Self.xmin%.")
-NORMAL (L"More examples of the use of attributes are on the next page.")
-MAN_END
-
-MAN_BEGIN (L"Formulas 8. Data in objects", L"ppgb", 20140223)
-NORMAL (L"With square brackets, you can get the values inside some objects.")
-ENTRY (L"Object contents in the calculator")
-NORMAL (L"The outcomes of the following examples can be checked with the @calculator.")
-TAG (L"##Matrix_hello [10, 3]")
-DEFINITION (L"gives the value in the cell at the third column of the 10th row of the Matrix called %hello.")
-TAG (L"##Sound_hello [0, 10000]")
-DEFINITION (L"gives the value (in Pa) of the 1000th sample of the Sound %hello, averaged over the channels.")
-TAG (L"##Sound_hello [1, 10000]")
-DEFINITION (L"gives the value (in Pa) of the 1000th sample of the left channel of the Sound %hello.")
-TAG (L"##Sound_hello [2, 10000]")
-DEFINITION (L"gives the value (in Pa) of the 1000th sample of the right channel of the Sound %hello.")
-TAG (L"##Sound_hello [10000]")
-DEFINITION (L"this can mean various things. In the calculator it means the same as ##Sound_hello [0, 10000]#, "
+NORMAL (U"More examples of the use of attributes are on the next page.")
+MAN_END
+
+MAN_BEGIN (U"Formulas 8. Data in objects", U"ppgb", 20140223)
+NORMAL (U"With square brackets, you can get the values inside some objects.")
+ENTRY (U"Object contents in the calculator")
+NORMAL (U"The outcomes of the following examples can be checked with the @calculator.")
+TAG (U"##Matrix_hello [10, 3]")
+DEFINITION (U"gives the value in the cell at the third column of the 10th row of the Matrix called %hello.")
+TAG (U"##Sound_hello [0, 10000]")
+DEFINITION (U"gives the value (in Pa) of the 1000th sample of the Sound %hello, averaged over the channels.")
+TAG (U"##Sound_hello [1, 10000]")
+DEFINITION (U"gives the value (in Pa) of the 1000th sample of the left channel of the Sound %hello.")
+TAG (U"##Sound_hello [2, 10000]")
+DEFINITION (U"gives the value (in Pa) of the 1000th sample of the right channel of the Sound %hello.")
+TAG (U"##Sound_hello [10000]")
+DEFINITION (U"this can mean various things. In the calculator it means the same as ##Sound_hello [0, 10000]#, "
 	"but in modification formulas it can mean ##Sound_hello [row, 10000]#, where %row refers to the channel. This variation exists in order to make "
 	"older Praat scripts (from the time that Praat did not support stereo) compatible with present-day Praat versions; "
 	"because of possible confusions, the use of ##Sound_hello [10000]# is not recommended.")
-TAG (L"##TableOfReal_tokens [5, 12]")
-DEFINITION (L"gives the value in the cell at the fifth row of the 12th column of the TableOfReal called %tokens.")
-TAG (L"##TableOfReal_tokens [5, \"F1\"]")
-DEFINITION (L"gives the value in the cell at the fifth row of the column labelled %F1 of the TableOfReal %tokens.")
-TAG (L"##TableOfReal_tokens [\"\\bsct\", \"F1\"]")
-DEFINITION (L"gives the value in the cell at the row labelled %%\\bsct% of column %F1 of the TableOfReal %tokens.")
-TAG (L"##Table_listeners [3, \"m3ae\"]")
-DEFINITION (L"gives the numeric value in the cell at the third row of column %m3ae of the Table %listeners.")
-TAG (L"##Table_listeners [3, 12]")
-DEFINITION (L"gives the numeric value in the cell at the third row of the 12th column of the Table %listeners.")
-TAG (L"##Table_results\\$  [3, \"response\"]")
-DEFINITION (L"gives the string value in the cell at the third row of column %response of the Table %results.")
-TAG (L"##Table_results\\$  [3, 12]")
-DEFINITION (L"gives the string value in the cell at the third row of the 12th column of the Table %results.")
-TAG (L"##PitchTier_hello [8]")
-DEFINITION (L"gives the pitch (in Hertz) of the 8th point in the PitchTier %hello.")
-NORMAL (L"Cells (or samples, or points) outside the objects are considered to contain zeroes.")
-ENTRY (L"Interpolation")
-NORMAL (L"The values inside some objects can be interpolated.")
-TAG (L"##Sound_hello (0.7, 0)")
-DEFINITION (L"gives the value (in Pa) at a time of 0.7 seconds in the Sound %hello, by linear interpolation between "
+TAG (U"##TableOfReal_tokens [5, 12]")
+DEFINITION (U"gives the value in the cell at the fifth row of the 12th column of the TableOfReal called %tokens.")
+TAG (U"##TableOfReal_tokens [5, \"F1\"]")
+DEFINITION (U"gives the value in the cell at the fifth row of the column labelled %F1 of the TableOfReal %tokens.")
+TAG (U"##TableOfReal_tokens [\"\\bsct\", \"F1\"]")
+DEFINITION (U"gives the value in the cell at the row labelled %%\\bsct% of column %F1 of the TableOfReal %tokens.")
+TAG (U"##Table_listeners [3, \"m3ae\"]")
+DEFINITION (U"gives the numeric value in the cell at the third row of column %m3ae of the Table %listeners.")
+TAG (U"##Table_listeners [3, 12]")
+DEFINITION (U"gives the numeric value in the cell at the third row of the 12th column of the Table %listeners.")
+TAG (U"##Table_results\\$  [3, \"response\"]")
+DEFINITION (U"gives the string value in the cell at the third row of column %response of the Table %results.")
+TAG (U"##Table_results\\$  [3, 12]")
+DEFINITION (U"gives the string value in the cell at the third row of the 12th column of the Table %results.")
+TAG (U"##PitchTier_hello [8]")
+DEFINITION (U"gives the pitch (in Hertz) of the 8th point in the PitchTier %hello.")
+NORMAL (U"Cells (or samples, or points) outside the objects are considered to contain zeroes.")
+ENTRY (U"Interpolation")
+NORMAL (U"The values inside some objects can be interpolated.")
+TAG (U"##Sound_hello (0.7, 0)")
+DEFINITION (U"gives the value (in Pa) at a time of 0.7 seconds in the Sound %hello, by linear interpolation between "
 	"the two samples that are nearest to 0.7 seconds. The channels are averaged.")
-TAG (L"##Sound_hello (0.7, 1)")
-DEFINITION (L"gives the interpolated value (in Pa) at a time of 0.7 seconds in the left channel of the Sound %hello.")
-TAG (L"##Sound_hello (0.7, 2)")
-DEFINITION (L"gives the interpolated value (in Pa) at a time of 0.7 seconds in the right channel of the Sound %hello.")
-TAG (L"##Sound_hello (0.7)")
-DEFINITION (L"this can mean various things. In the calculator it means the same as ##Sound_hello (0.7, 0)#, "
+TAG (U"##Sound_hello (0.7, 1)")
+DEFINITION (U"gives the interpolated value (in Pa) at a time of 0.7 seconds in the left channel of the Sound %hello.")
+TAG (U"##Sound_hello (0.7, 2)")
+DEFINITION (U"gives the interpolated value (in Pa) at a time of 0.7 seconds in the right channel of the Sound %hello.")
+TAG (U"##Sound_hello (0.7)")
+DEFINITION (U"this can mean various things. In the calculator it means the same as ##Sound_hello (0.7, 0)#, "
 	"but in modification formulas it can mean ##Sound_hello (0.7, row)#, where %row refers to the channel. This variation exists in order to make "
 	"older Praat scripts (from the time that Praat did not support stereo) compatible with present-day Praat versions; "
 	"because of possible confusions, the use of ##Sound_hello (0.7)# is not recommended.")
-TAG (L"##Spectrogram_hallo (0.7, 2500)")
-DEFINITION (L"gives the value at a time of 0.7 seconds and at a frequency of 2500 Hz in the Spectrogram %hallo, "
+TAG (U"##Spectrogram_hallo (0.7, 2500)")
+DEFINITION (U"gives the value at a time of 0.7 seconds and at a frequency of 2500 Hz in the Spectrogram %hallo, "
 	"by linear interpolation between the four samples that are nearest to that point.")
-TAG (L"##PitchTier_hullo (0.7)")
-DEFINITION (L"gives the pitch (in Hertz) at a time of 0.7 seconds in the PitchTier %hullo.")
-NORMAL (L"In the interpolation, times outside the time domain of the objects are considered to contain zeroes (this does not apply to PitchTiers and the like, "
+TAG (U"##PitchTier_hullo (0.7)")
+DEFINITION (U"gives the pitch (in Hertz) at a time of 0.7 seconds in the PitchTier %hullo.")
+NORMAL (U"In the interpolation, times outside the time domain of the objects are considered to contain zeroes (this does not apply to PitchTiers and the like, "
 	"which undergo @@constant extrapolation@).")
-ENTRY (L"Object contents in a modification formula")
-NORMAL (L"Suppose you want to do the difficult way of reversing the contents of a Sound called %hello (the easy way is to choose #Reverse "
+ENTRY (U"Object contents in a modification formula")
+NORMAL (U"Suppose you want to do the difficult way of reversing the contents of a Sound called %hello (the easy way is to choose #Reverse "
 	"from the @Modify menu). You select this sound, then choose @@Copy...@ to duplicate it to a new Sound, which you name %%hello_reverse%. "
 	"You select this new Sound and choose ##Formula...# from the @Modify menu. The formula will be")
-CODE (L"Sound_hello [ncol + 1 - col]")
-NORMAL (L"From this example, you see that the indices between [ ] may be formulas themselves, and that you can use implicit attributes like %ncol "
+CODE (U"Sound_hello [ncol + 1 - col]")
+NORMAL (U"From this example, you see that the indices between [ ] may be formulas themselves, and that you can use implicit attributes like %ncol "
 	"and position references like %col. An alternative formula is")
-CODE (L"Sound_hello (xmax - x)")
-NORMAL (L"at least if %xmin is zero. The advantage of the second method is that is also works correctly if the two sounds have different sampling frequencies; "
+CODE (U"Sound_hello (xmax - x)")
+NORMAL (U"at least if %xmin is zero. The advantage of the second method is that is also works correctly if the two sounds have different sampling frequencies; "
 	"the disadvantage is that it may do some interpolation between the samples, which deteriorates the sound quality.")
-ENTRY (L"Object contents in a script")
-NORMAL (L"In scripts, the indices between [ ] and the values between ( ) may be formulas themselves and contain variables. "
+ENTRY (U"Object contents in a script")
+NORMAL (U"In scripts, the indices between [ ] and the values between ( ) may be formulas themselves and contain variables. "
 	"The following script computes the sum of all the cells along the diagonal of a Matrix named %hello.")
-CODE (L"sumDiagonal = 0")
-CODE (L"for i to Matrix_hello.ncol")
-	CODE1 (L"sumDiagonal += Matrix_hello [i, i]")
-CODE (L"endfor")
-CODE (L"writeInfoLine: \"The sum of cells along the diagonal is \", sumDiagonal, \".\"")
-NORMAL (L"This example could have been written completely with commands from the dynamic menu:")
-CODE (L"select Matrix hello")
-CODE (L"sumDiagonal = 0")
-CODE (L"ncol = Get number of columns")
-CODE (L"for i to ncol")
-	CODE1 (L"value = Get value in cell: i, i")
-	CODE1 (L"sumDiagonal += value")
-CODE (L"endfor")
-CODE (L"writeInfoLine: \"The sum of cells along the diagonal is \", sumDiagonal, \".\"")
-NORMAL (L"The first version, which accesses the contents directly, is not only three lines shorter, but also three times faster.")
-MAN_END
-
-MAN_BEGIN (L"Hidden commands", L"ppgb", 20110129)
-NORMAL (L"Some commands in Praat's fixed and dynamic menus are hidden by default. "
+CODE (U"sumDiagonal = 0")
+CODE (U"for i to Matrix_hello.ncol")
+	CODE1 (U"sumDiagonal += Matrix_hello [i, i]")
+CODE (U"endfor")
+CODE (U"writeInfoLine: \"The sum of cells along the diagonal is \", sumDiagonal, \".\"")
+NORMAL (U"This example could have been written completely with commands from the dynamic menu:")
+CODE (U"select Matrix hello")
+CODE (U"sumDiagonal = 0")
+CODE (U"ncol = Get number of columns")
+CODE (U"for i to ncol")
+	CODE1 (U"value = Get value in cell: i, i")
+	CODE1 (U"sumDiagonal += value")
+CODE (U"endfor")
+CODE (U"writeInfoLine: \"The sum of cells along the diagonal is \", sumDiagonal, \".\"")
+NORMAL (U"The first version, which accesses the contents directly, is not only three lines shorter, but also three times faster.")
+MAN_END
+
+MAN_BEGIN (U"Hidden commands", U"ppgb", 20110129)
+NORMAL (U"Some commands in Praat's fixed and dynamic menus are hidden by default. "
 	"You can still call hidden commands from scripts, run them by clicking on them in a @ButtonEditor, "
 	"or make them visible with the help of the @ButtonEditor.")
-NORMAL (L"To hide commands that are visible by default, use the @ButtonEditor.")
-ENTRY (L"What commands are hidden by default?")
-NORMAL (L"Commands that are expected to be of very limited use, are hidden by default. Examples are:")
-LIST_ITEM (L"1. The commands @@Add menu command...@, ##Hide menu command...#, ##Show menu command...#, "
+NORMAL (U"To hide commands that are visible by default, use the @ButtonEditor.")
+ENTRY (U"What commands are hidden by default?")
+NORMAL (U"Commands that are expected to be of very limited use, are hidden by default. Examples are:")
+LIST_ITEM (U"1. The commands @@Add menu command...@, ##Hide menu command...#, ##Show menu command...#, "
 	"@@Add action command...@, ##Hide action command...#, and ##Show action command...# in the #Praat menu "
 	"of the @@Object window at . These are used in the @@buttons file@ and could be used by an @@initialization script@ or a @@plug-ins|plug-in@ "
 	"as well; in an interactive session, however, the functionality of these commands is part of the "
 	"@ScriptEditor and the @ButtonEditor.")
-LIST_ITEM (L"2. The command ##Read from old Praat picture file...# in the #File menu of the @@Picture window at . "
+LIST_ITEM (U"2. The command ##Read from old Praat picture file...# in the #File menu of the @@Picture window at . "
 	"For reading a file format that was in use before May, 1995.")
-LIST_ITEM (L"3. In the Praat program, the action ##Sound: Save as Sesam file...#. Writes a file format in common use "
+LIST_ITEM (U"3. In the Praat program, the action ##Sound: Save as Sesam file...#. Writes a file format in common use "
 	"in the Netherlands on Vax machines. In the Dutch phonetics departments, the plugs were pulled from the Vaxes in 1994.")
-LIST_ITEM (L"4. In the Praat program, the action ##Sound: To Cochleagram (edb)...#. Needed by one person in 1994. "
+LIST_ITEM (U"4. In the Praat program, the action ##Sound: To Cochleagram (edb)...#. Needed by one person in 1994. "
 	"An interesting, but undocumented procedure (De Boer's gammatone filter bank plus Meddis & Hewitt's "
 	"synapse model), which does not create a normally interpretable Cochleagram object.")
 MAN_END
 
-MAN_BEGIN (L"History mechanism", L"ppgb", 20040414)
-INTRO (L"The easiest way to do @@scripting at . "
+MAN_BEGIN (U"History mechanism", U"ppgb", 20040414)
+INTRO (U"The easiest way to do @@scripting at . "
 	"The %history is the sequence of all menu commands "
 	"(in the Objects or Picture window or in the editors), "
 	"action commands (in the dynamic menu), "
 	"or mouse clicks on objects (in the list of objects), that you performed during your Praat session, "
 	"together with the settings that you specified in the settings windows "
 	"that popped up as a result of those commands.")
-ENTRY (L"Viewing the history")
-NORMAL (L"To view your history, you first open a @ScriptEditor with @@New Praat script@ or @@Open Praat script... at . "
+ENTRY (U"Viewing the history")
+NORMAL (U"To view your history, you first open a @ScriptEditor with @@New Praat script@ or @@Open Praat script... at . "
 	"You then choose @@Paste history@ from the #Edit menu.")
-ENTRY (L"Recording a macro")
-NORMAL (L"To record a sequence of mouse clicks for later re-use, "
+ENTRY (U"Recording a macro")
+NORMAL (U"To record a sequence of mouse clicks for later re-use, "
 	"perform the following steps:")
-LIST_ITEM (L"1. Choose @@Clear history@ from the #Edit menu. "
+LIST_ITEM (U"1. Choose @@Clear history@ from the #Edit menu. "
 	"This makes the history mechanism forget all previous clicks.")
-LIST_ITEM (L"2. Perform the actions that you want to record.")
-LIST_ITEM (L"3. Choose @@Paste history@ from the #Edit menu. Because you cleared the history "
+LIST_ITEM (U"2. Perform the actions that you want to record.")
+LIST_ITEM (U"3. Choose @@Paste history@ from the #Edit menu. Because you cleared the history "
 	"before you started, the resulting script contains only the actions "
 	"that you performed in step 2. "
 	"You can now already re-run the actions that you performed in step 2.")
-LIST_ITEM (L"4. You can save the recorded actions to a script file by choosing #Save from the #File menu.")
-LIST_ITEM (L"5. You can put this script file under a button in the @@dynamic menu@ "
+LIST_ITEM (U"4. You can save the recorded actions to a script file by choosing #Save from the #File menu.")
+LIST_ITEM (U"5. You can put this script file under a button in the @@dynamic menu@ "
 	"by choosing @@Add to dynamic menu...@ from the File menu, "
 	"or under a button in a fixed menu by choosing @@Add to fixed menu... at . "
 	"This button will be preserved across Praat sessions.")
-NORMAL (L"This macro mechanism is much more flexible than the usual opaque macro mechanism "
+NORMAL (U"This macro mechanism is much more flexible than the usual opaque macro mechanism "
 	"used by most programs, because you can edit the script and make some "
 	"of the arguments variable by putting them in the #form clause at the top of the script. "
 	"In this way, the script will prompt the user for these arguments, "
@@ -1190,276 +1190,267 @@ NORMAL (L"This macro mechanism is much more flexible than the usual opaque macro
 	"See the @Scripting tutorial for all the things that you can do in scripts.")
 MAN_END
 
-MAN_BEGIN (L"initialization script", L"ppgb", 20140107)
-INTRO (L"Your initialization script is a normal @@Praat script@ that is run as soon as you start Praat.")
-#if defined (UNIX) || defined (macintosh)
-NORMAL (L"On Unix or MacOS X, you create an initialization script by creating a file named \"praat-startUp\" "
+MAN_BEGIN (U"initialization script", U"ppgb", 20151020)
+INTRO (U"Your initialization script is a normal @@Praat script@ that is run as soon as you start Praat.")
+NORMAL (U"On Unix or MacOS X, you create an initialization script by creating a file named \"praat-startUp\" "
 	"in the directory /usr/local, "
 	"or putting a file \".praat-user-startUp\" or \"praat-user-startUp\" in your home directory "
 	"(if you rename the Praat executable, these names have to change as well).")
-NORMAL (L"If you have more than one of these files, they are run in the above order.")
-#elif defined (_WIN32)
-NORMAL (L"On Windows NT or XP, you create an initialization script by creating a file named "
+NORMAL (U"If you have more than one of these files, they are run in the above order.")
+NORMAL (U"On Windows, you create an initialization script by creating a file named "
 	"\"praat-user-startUp\" in your home directory, "
-	"which on my Windows XP computer is C:\\bsDocuments and Settings\\bsPaul.")
-NORMAL (L"If you have both of these files, they are run in the above order.")
-#endif
-ENTRY (L"Example")
-NORMAL (L"If you like to be greeted by your husband when Praat starts up, "
+	"which could be C:\\bsUsers\\bsMiep if you are Miep.")
+NORMAL (U"If you have both of these files, they are run in the above order.")
+ENTRY (U"Example")
+NORMAL (U"If you like to be greeted by your husband when Praat starts up, "
 	"you could put the following lines in your initialization script:")
-#if defined (UNIX)
-	CODE (L"Read from file: \"/u/miep/helloMiep.wav\"")
-#elif defined (macintosh)
-	CODE (L"Read from file: \"/Users/miep/helloMiep.wav\"")
-#elif defined (_WIN32)
-	CODE (L"Read from file: \"C:\\bsDocuments and Settings\\bsMiep\\bshelloMiep.wav\"")
-#else
-	#error Some audio file reading example should go here
-#endif
-CODE (L"Play")
-CODE (L"Remove")
-ENTRY (L"What not to use an initialization script for")
-NORMAL (L"You could set preferences like the default font in your initialization script, "
+CODE (U"Read from file: \"C:\\bsUsers\\bsMiep\\bshelloMiep.wav\"   ! Windows")
+CODE (U"Read from file: \"/Users/miep/helloMiep.wav\"   ! Mac")
+CODE (U"Read from file: \"/home/miep/helloMiep.wav\"   ! Linux")
+CODE (U"Play")
+CODE (U"Remove")
+ENTRY (U"What not to use an initialization script for")
+NORMAL (U"You could set preferences like the default font in your initialization script, "
 	"but these will be automatically remembered between invocations of Praat anyway (in your @@preferences file@), "
 	"so this would often be superfluous.")
-NORMAL (L"For installing sets of menu commands at start-up you will probably prefer to use @@plug-ins@ "
+NORMAL (U"For installing sets of menu commands at start-up you will probably prefer to use @@plug-ins@ "
 	"rather than a single start-up file.")
 MAN_END
 
-MAN_BEGIN (L"New Praat script", L"ppgb", 20050822)
-INTRO (L"A command in the @@Praat menu@ for creating a new Praat script. "
+MAN_BEGIN (U"New Praat script", U"ppgb", 20050822)
+INTRO (U"A command in the @@Praat menu@ for creating a new Praat script. "
 	"It creates a @ScriptEditor with an empty script that you can edit, run, and save.") 
 MAN_END
 
-MAN_BEGIN (L"Open Praat script...", L"ppgb", 20050822)
-INTRO (L"A command in the @@Praat menu@ for editing an existing @@Praat script at . "
+MAN_BEGIN (U"Open Praat script...", U"ppgb", 20050822)
+INTRO (U"A command in the @@Praat menu@ for editing an existing @@Praat script at . "
 	"It creates a @ScriptEditor and asks "
 	"you to select a file. If you click #%OK, the file is read into the ScriptEditor window, "
 	"and you can run and edit it; if you click #%Cancel, you get an empty script, as with @@New Praat script at .") 
 MAN_END
 
-MAN_BEGIN (L"Paste history", L"ppgb", 20050822)
-INTRO (L"A command in the #Edit menu of a @ScriptEditor, for inserting the history of commands. "
+MAN_BEGIN (U"Paste history", U"ppgb", 20050822)
+INTRO (U"A command in the #Edit menu of a @ScriptEditor, for inserting the history of commands. "
 	"See @@History mechanism at .")
 MAN_END
 
-MAN_BEGIN (L"phonToDifferenceLimens", L"ppgb", 20021215)
-INTRO (L"A routine for converting sensation level in phons into intensity difference limen level, "
+MAN_BEGIN (U"phonToDifferenceLimens", U"ppgb", 20021215)
+INTRO (U"A routine for converting sensation level in phons into intensity difference limen level, "
 	"the inverse of @differenceLimensToPhon.")
-ENTRY (L"Formula")
-FORMULA (L"phonToDifferenceLimens (%phon) = 30 \\.c ((61/60)^^ %phon^ \\-- 1)")
-ENTRY (L"Derivation")
-NORMAL (L"In first approximation, humans can detect an intensity difference of 1 phon, i.e. "
+ENTRY (U"Formula")
+FORMULA (U"phonToDifferenceLimens (%phon) = 30 \\.c ((61/60)^^ %phon^ \\-- 1)")
+ENTRY (U"Derivation")
+NORMAL (U"In first approximation, humans can detect an intensity difference of 1 phon, i.e. "
 	"if two sounds that differ only in intensity are played a short time after each other, "
 	"people can generally detect their intensity difference if it is greater than 1 phon.")
-NORMAL (L"But the sensitivity is somewhat better for louder sounds. "
+NORMAL (U"But the sensitivity is somewhat better for louder sounds. "
 	"According to @@Jesteadt, Wier & Green (1977)@, the relative difference limen "
 	"of intensity is given by")
-FORMULA (L"DLI = \\De%I / %I = 0.463 \\.c (%I / %I__0_)^^ \\--0.072^")
-NORMAL (L"In this formula, %I is the intensity of the sound in Watt/m^2, %I__0_ is the intensity of "
+FORMULA (U"DLI = \\De%I / %I = 0.463 \\.c (%I / %I__0_)^^ \\--0.072^")
+NORMAL (U"In this formula, %I is the intensity of the sound in Watt/m^2, %I__0_ is the intensity of "
 	"the auditory threshold (i.e. 10^^\\--12^ Watt/m^2 at 1000 Hz), and \\De%I is the just noticeable difference.")
-NORMAL (L"@@Boersma (1998)|Boersma (1998: 109)@ calculates a difference-limen scale from this. "
+NORMAL (U"@@Boersma (1998)|Boersma (1998: 109)@ calculates a difference-limen scale from this. "
 	"Given an intensity %I, the number of difference limens above threshold is ")
-FORMULA (L"\\in__%I0_^%I %dx \\De%I(%x) "
+FORMULA (U"\\in__%I0_^%I %dx \\De%I(%x) "
 	"= (1 / 0.463) \\in__%I0_^%I %dx %I__0_^^\\--0.072^ %x^^0.072\\--1^")
-FORMULA (L"= (1 / (0.463\\.c0.072)) ((%I/%I__0_)^^0.072^ \\-- 1)")
-NORMAL (L"The sensation level in phon is defined as")
-FORMULA (L"SL = 10 log__10_ (%I/%I__0_)")
-NORMAL (L"so that the number of difference limens above threshold is")
-FORMULA (L"(1 / (0.463\\.c0.072)) (10^^(0.072/10)(10log(%I/%I__0_))^ \\-- 1) "
+FORMULA (U"= (1 / (0.463\\.c0.072)) ((%I/%I__0_)^^0.072^ \\-- 1)")
+NORMAL (U"The sensation level in phon is defined as")
+FORMULA (U"SL = 10 log__10_ (%I/%I__0_)")
+NORMAL (U"so that the number of difference limens above threshold is")
+FORMULA (U"(1 / (0.463\\.c0.072)) (10^^(0.072/10)(10log(%I/%I__0_))^ \\-- 1) "
 	"= 30 \\.c (1.0167^^SL^ \\-- 1)")
 MAN_END
 
-MAN_BEGIN (L"plug-ins", L"ppgb", 20140212)
-INTRO (L"Experienced Praat script writers can distribute their product as a plug-in to Praat.")
-ENTRY (L"The Praat plug-in mechanism")
-NORMAL (L"When Praat starts up, it will execute all Praat scripts called ##setup.praat# "
+MAN_BEGIN (U"plug-ins", U"ppgb", 20151020)
+INTRO (U"Experienced Praat script writers can distribute their product as a plug-in to Praat.")
+ENTRY (U"The Praat plug-in mechanism")
+NORMAL (U"When Praat starts up, it will execute all Praat scripts called ##setup.praat# "
 	"that reside in directories whose name starts with ##plugin_# and that themselves reside in "
 	"your Praat @@preferences directory at .")
-ENTRY (L"How to write a Praat plug-in")
-NORMAL (L"Suppose that you have a set of Praat scripts specialized in the analysis and synthesis of vocalizations of guinea pigs, "
+ENTRY (U"How to write a Praat plug-in")
+NORMAL (U"Suppose that you have a set of Praat scripts specialized in the analysis and synthesis of vocalizations of guinea pigs, "
 	"and that these scripts are called ##analyseQueak.praat# and ##createQueak.praat# (\"queak\" is what guinea pigs tend to say). "
 	"With the @ScriptEditor, you have put the script ##analyseQueak.praat# in the dynamic menu that "
 	"appears if the user selects a Sound object, and you have put the script ##createQueak.praat# in the @@New menu at . "
 	"Only the latter script requires the user to supply some settings in a form, so the two menu commands "
 	"are ##Analyse queak# (without dots) and ##Create queak...# (with three dots), respectively. "
 	"Suppose now that you want to distribute those two commands to other guinea pig vocalization researchers.")
-NORMAL (L"What you do is that you create a Praat script called ##setup.praat# (in the same directory as the two other scripts), "
+NORMAL (U"What you do is that you create a Praat script called ##setup.praat# (in the same directory as the two other scripts), "
 	"that contains the following two lines:")
-CODE (L"@@Add action command...|Add action command:@ \"Sound\", 1, \"\", 0, \"\", 0, \"Analyse queak\", \"\", 0, \"analyseQueak.praat\"")
-CODE (L"@@Add menu command...|Add menu command:@ \"Objects\", \"New\", \"Create queak...\", \"\", 0, \"createQueak.praat\"")
-NORMAL (L"(If you ran this script, Praat would install those two commands in the correct menus, and remember them in the @@buttons file@; "
+CODE (U"@@Add action command...|Add action command:@ \"Sound\", 1, \"\", 0, \"\", 0, \"Analyse queak\", \"\", 0, \"analyseQueak.praat\"")
+CODE (U"@@Add menu command...|Add menu command:@ \"Objects\", \"New\", \"Create queak...\", \"\", 0, \"createQueak.praat\"")
+NORMAL (U"(If you ran this script, Praat would install those two commands in the correct menus, and remember them in the @@buttons file@; "
 	"but you are now going to install them in a different way.)")
-NORMAL (L"You now put the three scripts in a new directory called ##plugin_Queak#, "
+NORMAL (U"You now put the three scripts in a new directory called ##plugin_Queak#, "
 	"and put this directory in your Praat preferences directory. If you are on Windows, "
-	"you will now have a directory called something like ##C:\\bsDocuments and Settings\\bsYour Name\\bsPraat\\bsplugin_Queak#.")
-NORMAL (L"If you now start up Praat, Praat will automatically execute the script "
-	"##C:\\bsDocuments and Settings\\bsYour Name\\bsPraat\\bsplugin_Queak\\bssetup.praat# "
+	"you will now have a directory called something like ##C:\\bsUsers\\bsYour Name\\bsPraat\\bsplugin_Queak#.")
+NORMAL (U"If you now start up Praat, Praat will automatically execute the script "
+	"##C:\\bsUsers\\bsYour Name\\bsPraat\\bsplugin_Queak\\bssetup.praat# "
 	"and thereby install the two buttons. The two buttons will %not be remembered in the buttons file, "
 	"but they will be installed at every Praat start-up. De-installation involves removing (or renaming) the ##plugin_Queak# directory.")
-NORMAL (L"To distribute the Queak plug-in among your colleague guinea pig researchers, you can use any installer program to put "
+NORMAL (U"To distribute the Queak plug-in among your colleague guinea pig researchers, you can use any installer program to put "
 	"the ##plugin_Queak# directory into the user's Praat preferences directory; or you could ask those colleagues to move "
 	"the ##plugin_Queak# directory there by hand.")
-ENTRY (L"The structure of your plug-in directory")
-NORMAL (L"In the example ##setup.praat# file above, the names of the scripts ##analyseQueak.praat# and ##createQueak.praat# "
+ENTRY (U"The structure of your plug-in directory")
+NORMAL (U"In the example ##setup.praat# file above, the names of the scripts ##analyseQueak.praat# and ##createQueak.praat# "
 	"occur without any directory information. This works because Praat regards these file names as being relative to the directory "
 	"where ##setup.praat# is located. If your plug-in is much larger than two scripts, you may want to put subdirectories into "
 	"the directory ##plugin_Queak#. For instance, if you put ##analyseQueak.praat# into the subdirectory ##analysis#, "
 	"your line in the ##setup.praat# script would look as follows:")
-CODE (L"@@Add action command...|Add action command:@ \"Sound\", 1, \"\", 0, \"\", 0, \"Analyse queak\", \"\", 0, \"analysis/analyseQueak.praat\"")
-NORMAL (L"The forward slash (\"/\") in this example makes your plug-in platform-independent: it will work unchanged "
+CODE (U"@@Add action command...|Add action command:@ \"Sound\", 1, \"\", 0, \"\", 0, \"Analyse queak\", \"\", 0, \"analysis/analyseQueak.praat\"")
+NORMAL (U"The forward slash (\"/\") in this example makes your plug-in platform-independent: it will work unchanged "
 	"on Windows, Macintosh, and Unix.")
-NORMAL (L"Nothing prevents you from adding data files to your plug-in. For instance, your ##plugin_Queak# directory "
+NORMAL (U"Nothing prevents you from adding data files to your plug-in. For instance, your ##plugin_Queak# directory "
 	"could contain a subdirectory #sounds full of guinea pig recordings, and you could make them available in the New or Open menu.")
-ENTRY (L"Using a plug-in for site-wide customization")
-NORMAL (L"If your local guinea pig research group shares a number of Praat scripts, these can be made available to everybody "
+ENTRY (U"Using a plug-in for site-wide customization")
+NORMAL (U"If your local guinea pig research group shares a number of Praat scripts, these can be made available to everybody "
 	"in the following way:")
-LIST_ITEM (L"1. Create a script that adds buttons to the fixed and dynamic menus, using the commands "
+LIST_ITEM (U"1. Create a script that adds buttons to the fixed and dynamic menus, using the commands "
 	"@@Add menu command...@ and @@Add action command... at . This script could be a slightly edited copy of someone's "
 	"@@buttons file at .")
-LIST_ITEM (L"2. Put this script where everybody can see it, "
+LIST_ITEM (U"2. Put this script where everybody can see it, "
 	"for instance in ##U:\\bsMaldenGuineaPigResearchButtons.praat#, where U is your shared computer.")
-LIST_ITEM (L"3. Create a file ##setup.praat# that contains only the following line:")
-CODE1 (L"runScript: \"U:\\bsMaldenGuineaPigResearchButtons.praat\"")
-LIST_ITEM (L"4. Put the ##setup.praat# file in a new directory called ##plugin_MaldenGuineaPigResearch#, "
+LIST_ITEM (U"3. Create a file ##setup.praat# that contains only the following line:")
+CODE1 (U"runScript: \"U:\\bsMaldenGuineaPigResearchButtons.praat\"")
+LIST_ITEM (U"4. Put the ##setup.praat# file in a new directory called ##plugin_MaldenGuineaPigResearch#, "
 	"and distribute this directory among your local colleagues.")
-NORMAL (L"This procedure allows all members of the group to automatically enjoy all the later changes in your "
+NORMAL (U"This procedure allows all members of the group to automatically enjoy all the later changes in your "
 	"custom command set.")
 MAN_END
 
-MAN_BEGIN (L"plugins", L"ppgb", 20060920)
-INTRO (L"See @@plug-ins at .")
+MAN_BEGIN (U"plugins", U"ppgb", 20060920)
+INTRO (U"See @@plug-ins at .")
 MAN_END
 
-MAN_BEGIN (L"Praat script", L"ppgb", 19980824)
-INTRO (L"An executable text that consists of menu commands and action commands.")
-NORMAL (L"See the @Scripting tutorial.")
+MAN_BEGIN (U"Praat script", U"ppgb", 19980824)
+INTRO (U"An executable text that consists of menu commands and action commands.")
+NORMAL (U"See the @Scripting tutorial.")
 MAN_END
 
-MAN_BEGIN (L"preferences directory", L"ppgb", 20101204)
-INTRO (L"The Praat preferences directory is the directory where Praat saves the @@preferences file@ and the @@buttons file@, "
+MAN_BEGIN (U"preferences directory", U"ppgb", 20151020)
+INTRO (U"The Praat preferences directory is the directory where Praat saves the @@preferences file@ and the @@buttons file@, "
 	"and where you can install @@plug-ins@ and save the preferences of your scripts (in your subdirectory of the #apps subdirectory). "
 	"If the preferences directory does not exist, it will automatically be created when you start Praat.")
-ENTRY (L"Unix")
-NORMAL (L"If your home directory is ##/people/miep/#, your Praat preferences directory will be ##/people/miep/.praat-dir/#.")
-ENTRY (L"Macintosh")
-NORMAL (L"If you are user #miep, your Praat preferences directory will be ##/Users/miep/Library/Preferences/Praat Prefs/#.")
-ENTRY (L"Windows")
-NORMAL (L"If you are user #Miep, your Praat preferences directory will be ##C:\\bsDocuments and Settings\\bsMiep\\bsPraat\\bs#.")
+ENTRY (U"Windows")
+NORMAL (U"If you are user #Miep, your Praat preferences directory will be ##C:\\bsUsers\\bsMiep\\bsPraat\\bs#.")
+ENTRY (U"Macintosh")
+NORMAL (U"If you are user #miep, your Praat preferences directory will be ##/Users/miep/Library/Preferences/Praat Prefs/#.")
+ENTRY (U"Linux")
+NORMAL (U"If your home directory is ##/home/miep/#, your Praat preferences directory will be ##/home/miep/.praat-dir/#.")
 MAN_END
 
-MAN_BEGIN (L"preferences file", L"ppgb", 20071205)
-NORMAL (L"The file into which some of your preferences are saved across your sessions with Praat. "
+MAN_BEGIN (U"preferences file", U"ppgb", 20151020)
+NORMAL (U"The file into which some of your preferences are saved across your sessions with Praat. "
 	"For instance, if you change the font used by the Picture window to Palatino and quit Praat, "
 	"the Picture-window font will still be Palatino when you start Praat again.")
-NORMAL (L"The preferences file is written to disk when you quit Praat, "
+NORMAL (U"The preferences file is written to disk when you quit Praat, "
 	"and it is read when you start Praat. It is a simple text file that you can read "
 	"(but should not edit) with any text editor.")
-ENTRY (L"Where is the preferences file?")
-NORMAL (L"The preferences file is in your Praat @@preferences directory at .")
-NORMAL (L"On Unix the file is called #prefs5, "
-	"for instance ##/people/miep/.praat-dir/prefs5#.")
-NORMAL (L"On Macintosh it is called #Prefs5, "
+ENTRY (U"Where is the preferences file?")
+NORMAL (U"The preferences file is in your Praat @@preferences directory at .")
+NORMAL (U"On Windows it is called ##Preferences5.ini#, "
+	"for instance ##C:\\bsUsers\\bsMiep\\bsPraat\\bsPreferences5.ini#.")
+NORMAL (U"On Macintosh it is called #Prefs5, "
 	"for instance ##/Users/miep/Library/Preferences/Praat Prefs/Prefs5#.")
-NORMAL (L"On Windows it is called ##Preferences5.ini#, "
-	"for instance ##C:\\bsDocuments and Settings\\bsMiep\\bsPraat\\bsPreferences5.ini#.")
+NORMAL (U"On Linux the file is called #prefs5, "
+	"for instance ##/home/miep/.praat-dir/prefs5#.")
 MAN_END
 
-MAN_BEGIN (L"Scripting", L"ppgb", 20141012)
-INTRO (L"This is one of the tutorials of the Praat program. It assumes you are familiar with the @Intro.")
-NORMAL (L"A %script is a text that consists of menu commands and action commands. "
+MAN_BEGIN (U"Scripting", U"ppgb", 20141012)
+INTRO (U"This is one of the tutorials of the Praat program. It assumes you are familiar with the @Intro.")
+NORMAL (U"A %script is a text that consists of menu commands and action commands. "
 	"If you %run the script (perhaps from a @ScriptEditor), "
 	"the commands are executed as if you clicked on them.")
-NORMAL (L"You can read this tutorial sequentially with the help of the \"< 1\" and \"1 >\" buttons.")
-LIST_ITEM (L"@@Scripting 1. Your first scripts@ (how to create, how to run, how to save)")
-LIST_ITEM (L"@@Scripting 2. How to script settings windows@ (numeric, boolean, multiple-choice, text, file)")
-LIST_ITEM (L"@@Scripting 3. Simple language elements")
-LIST_ITEM1 (L"@@Scripting 3.1. Hello world@ (writeInfoLine, appendInfoLine)")
-LIST_ITEM1 (L"@@Scripting 3.2. Numeric variables@ (assignments)")
-LIST_ITEM1 (L"@@Scripting 3.3. Numeric queries")
-LIST_ITEM1 (L"@@Scripting 3.4. String variables@ (assignments)")
-LIST_ITEM1 (L"@@Scripting 3.5. String queries")
-LIST_ITEM1 (L"@@Scripting 3.6. \"For\" loops@ (for, endfor)")
-LIST_ITEM1 (L"@@Scripting 3.7. Layout@ (white space, comments, continuation lines)")
-LIST_ITEM (L"@@Scripting 4. Object selection@")
-LIST_ITEM1 (L"@@Scripting 4.1. Selecting objects")
-LIST_ITEM1 (L"@@Scripting 4.2. Removing objects")
-LIST_ITEM1 (L"@@Scripting 4.3. Querying objects")
-LIST_ITEM (L"@@Scripting 5. Language elements reference@")
-LIST_ITEM1 (L"@@Scripting 5.1. Variables@ (numeric, string)")
-LIST_ITEM1 (L"@@Scripting 5.2. Expressions@ (numeric, string)")
-LIST_ITEM1 (L"@@Scripting 5.3. Jumps@ (if, then, elsif, else, endif)")
-LIST_ITEM1 (L"@@Scripting 5.4. Loops@ (for/endfor, while/endwhile, repeat/until)")
-LIST_ITEM1 (L"@@Scripting 5.5. Procedures@ (\\@ , procedure)")
-LIST_ITEM1 (L"@@Scripting 5.6. Arrays")
-LIST_ITEM1 (L"@@Scripting 5.7. Including other scripts")
-LIST_ITEM1 (L"@@Scripting 5.8. Quitting@ (exitScript)")
-LIST_ITEM (L"@@Scripting 6. Communication outside the script")
-LIST_ITEM1 (L"@@Scripting 6.1. Arguments to the script@ (form/endform, runScript)")
-LIST_ITEM1 (L"@@Scripting 6.2. Writing to the Info window@ (writeInfoLine, appendInfoLine, appendInfo, tab\\$ )")
-LIST_ITEM1 (L"@@Scripting 6.3. Query commands@ (Get, Count)")
-LIST_ITEM1 (L"@@Scripting 6.4. Files@ (fileReadable, readFile, writeFile, deleteFile, createDirectory)")
-LIST_ITEM1 (L"@@Scripting 6.5. Calling system commands@ (runSystem, environment\\$ , stopwatch)")
-LIST_ITEM1 (L"@@Scripting 6.6. Controlling the user@ (pause, beginPause/endPause, chooseReadFile\\$ )")
-LIST_ITEM1 (L"@@Scripting 6.7. Sending a message to another program@ (sendsocket)")
-LIST_ITEM1 (L"@@Scripting 6.8. Messages to the user@ (exitScript, assert, nowarn, nocheck)")
-LIST_ITEM1 (L"@@Scripting 6.9. Calling from the command line")
-LIST_ITEM (L"@@Scripting 7. Scripting the editors")
-LIST_ITEM1 (L"@@Scripting 7.1. Scripting an editor from a shell script@ (editor/endeditor)")
-LIST_ITEM1 (L"@@Scripting 7.2. Scripting an editor from within")
-LIST_ITEM (L"@@Scripting 8. Controlling Praat from another program")
-LIST_ITEM1 (L"@@Scripting 8.1. The sendpraat subroutine")
-LIST_ITEM1 (L"@@Scripting 8.2. The sendpraat program")
-LIST_ITEM1 (L"@@Scripting 8.3. The sendpraat directive")
+NORMAL (U"You can read this tutorial sequentially with the help of the \"< 1\" and \"1 >\" buttons.")
+LIST_ITEM (U"@@Scripting 1. Your first scripts@ (how to create, how to run, how to save)")
+LIST_ITEM (U"@@Scripting 2. How to script settings windows@ (numeric, boolean, multiple-choice, text, file)")
+LIST_ITEM (U"@@Scripting 3. Simple language elements")
+LIST_ITEM1 (U"@@Scripting 3.1. Hello world@ (writeInfoLine, appendInfoLine)")
+LIST_ITEM1 (U"@@Scripting 3.2. Numeric variables@ (assignments)")
+LIST_ITEM1 (U"@@Scripting 3.3. Numeric queries")
+LIST_ITEM1 (U"@@Scripting 3.4. String variables@ (assignments)")
+LIST_ITEM1 (U"@@Scripting 3.5. String queries")
+LIST_ITEM1 (U"@@Scripting 3.6. \"For\" loops@ (for, endfor)")
+LIST_ITEM1 (U"@@Scripting 3.7. Layout@ (white space, comments, continuation lines)")
+LIST_ITEM (U"@@Scripting 4. Object selection@")
+LIST_ITEM1 (U"@@Scripting 4.1. Selecting objects")
+LIST_ITEM1 (U"@@Scripting 4.2. Removing objects")
+LIST_ITEM1 (U"@@Scripting 4.3. Querying objects")
+LIST_ITEM (U"@@Scripting 5. Language elements reference@")
+LIST_ITEM1 (U"@@Scripting 5.1. Variables@ (numeric, string)")
+LIST_ITEM1 (U"@@Scripting 5.2. Expressions@ (numeric, string)")
+LIST_ITEM1 (U"@@Scripting 5.3. Jumps@ (if, then, elsif, else, endif)")
+LIST_ITEM1 (U"@@Scripting 5.4. Loops@ (for/endfor, while/endwhile, repeat/until)")
+LIST_ITEM1 (U"@@Scripting 5.5. Procedures@ (\\@ , procedure)")
+LIST_ITEM1 (U"@@Scripting 5.6. Arrays")
+LIST_ITEM1 (U"@@Scripting 5.7. Including other scripts")
+LIST_ITEM1 (U"@@Scripting 5.8. Quitting@ (exitScript)")
+LIST_ITEM (U"@@Scripting 6. Communication outside the script")
+LIST_ITEM1 (U"@@Scripting 6.1. Arguments to the script@ (form/endform, runScript)")
+LIST_ITEM1 (U"@@Scripting 6.2. Writing to the Info window@ (writeInfoLine, appendInfoLine, appendInfo, tab\\$ )")
+LIST_ITEM1 (U"@@Scripting 6.3. Query commands@ (Get, Count)")
+LIST_ITEM1 (U"@@Scripting 6.4. Files@ (fileReadable, readFile, writeFile, deleteFile, createDirectory)")
+LIST_ITEM1 (U"@@Scripting 6.5. Calling system commands@ (runSystem, environment\\$ , stopwatch)")
+LIST_ITEM1 (U"@@Scripting 6.6. Controlling the user@ (pause, beginPause/endPause, chooseReadFile\\$ )")
+LIST_ITEM1 (U"@@Scripting 6.7. Sending a message to another program@ (sendsocket)")
+LIST_ITEM1 (U"@@Scripting 6.8. Messages to the user@ (exitScript, assert, nowarn, nocheck)")
+LIST_ITEM1 (U"@@Scripting 6.9. Calling from the command line")
+LIST_ITEM (U"@@Scripting 7. Scripting the editors")
+LIST_ITEM1 (U"@@Scripting 7.1. Scripting an editor from a shell script@ (editor/endeditor)")
+LIST_ITEM1 (U"@@Scripting 7.2. Scripting an editor from within")
+LIST_ITEM (U"@@Scripting 8. Controlling Praat from another program")
+LIST_ITEM1 (U"@@Scripting 8.1. The sendpraat subroutine")
+LIST_ITEM1 (U"@@Scripting 8.2. The sendpraat program")
+LIST_ITEM1 (U"@@Scripting 8.3. The sendpraat directive")
 // 9. Hiding your script
 // 9.1 Incorporating your script into Praat
 // 9.2 Incorporating many scripts into Praat (plug-ins)
-LIST_ITEM (L"@@Scripting 9.1. Turning a script into a stand-alone program")
-LIST_ITEM (L"@@Scripting 9.2. Old functions")
-NORMAL (L"Also see the @@scripting examples at .")
+LIST_ITEM (U"@@Scripting 9.1. Turning a script into a stand-alone program")
+LIST_ITEM (U"@@Scripting 9.2. Old functions")
+NORMAL (U"Also see the @@scripting examples at .")
 MAN_END
 
-MAN_BEGIN (L"Scripting 1. Your first scripts", L"ppgb", 20140106)
-INTRO (L"This page tells you how to create, run and save a script. "
+MAN_BEGIN (U"Scripting 1. Your first scripts", U"ppgb", 20140106)
+INTRO (U"This page tells you how to create, run and save a script. "
 	"To get a feel for how it works, you are advised to try out all the steps.")
-ENTRY (L"1. A minimal script")
-NORMAL (L"Suppose that you want to create a script that allows you to play a selected Sound object twice. "
+ENTRY (U"1. A minimal script")
+NORMAL (U"Suppose that you want to create a script that allows you to play a selected Sound object twice. "
 	"You first create an empty script, by choosing @@New Praat script@ from the #Praat menu in the ##Praat Objects# window. "
 	"A @ScriptEditor window will appear on your screen:")
-SCRIPT (6, 4, L""
+SCRIPT (6, 4, U""
 	Manual_DRAW_WINDOW (4, "untitled script", "File   Edit   Search   Convert   Font   Run   Help")
 	"Draw rectangle: 0, 560, 0, 360\n"
 	"info$ = Picture info\n"
 	"fontSize = extractNumber (info$, \"Font size: \")\n"
 	";Text: 50, \"centre\", 50, \"half\", string$ (fontSize)\n"
 )
-NORMAL (L"In this window, you type")
-CODE (L"Play")
-CODE (L"Play")
-NORMAL (L"Now select a Sound in the ##Praat Objects# window. As you expect from selecting a Sound, a #Play button will "
+NORMAL (U"In this window, you type")
+CODE (U"Play")
+CODE (U"Play")
+NORMAL (U"Now select a Sound in the ##Praat Objects# window. As you expect from selecting a Sound, a #Play button will "
 	"appear in the dynamic menu. If you now choose #Run from the #Run menu in the ScriptEditor, Praat will play the sound twice. "
 	"This works because #Play is a command that becomes available in the dynamic menu when you select a Sound.")
-ENTRY (L"2. Some more commands")
-NORMAL (L"In the above example, you could use the #Play command because that was "
+ENTRY (U"2. Some more commands")
+NORMAL (U"In the above example, you could use the #Play command because that was "
 	"the text on a button currently available in the dynamic menu. "
 	"Apart from these selection-dependent (dynamic) commands, "
 	"you can also use all fixed commands from the menus of the @@Object window@ "
 	"and the @@Picture window at . For instance, try the following script:")
-CODE (L"Erase all")
-CODE (L"Draw inner box")
-CODE (L"Play")
-CODE (L"Play")
-CODE (L"Erase all")
-NORMAL (L"When you run this script, you'll see a rectangle appear in the ##Praat Picture# window "
+CODE (U"Erase all")
+CODE (U"Draw inner box")
+CODE (U"Play")
+CODE (U"Play")
+CODE (U"Erase all")
+NORMAL (U"When you run this script, you'll see a rectangle appear in the ##Praat Picture# window "
 	"(that's what the command ##Draw inner box# in the #Margins menu does), "
 	"then you'll hear the Sound play tiwce, then you'll see the rectangle disappear from the Picture window "
 	"(that's what the command ##Erase all# from the #Edit menu does).")
-NORMAL (L"Here we see that the Praat scripting language is an example of a %%procedural programming language%, "
+NORMAL (U"Here we see that the Praat scripting language is an example of a %%procedural programming language%, "
 	"which means that the five %statements are executed in the order in which they appear in the script, "
 	"i.e. first ##Erase all#, then ##Draw inner box#, then ##Play# twice, and finally ##Erase all#.")
-ENTRY (L"3. Experimenting with your script")
-NORMAL (L"You don't have to be afraid of making mistakes. Here are a couple that you can try to make.")
-NORMAL (L"First, try to run the script when a Sound is not selected "
+ENTRY (U"3. Experimenting with your script")
+NORMAL (U"You don't have to be afraid of making mistakes. Here are a couple that you can try to make.")
+NORMAL (U"First, try to run the script when a Sound is not selected "
 	"(e.g. you create a Pitch object from it and keep that selected, or you throw away the Sound). "
 	"You will notice that Praat gives you an error message saying ##The command \"Play\" is not available for the current selection#. "
 	"Indeed, if you select a Pitch or if you select nothing, then no command #Play appears in the dynamic menu, "
@@ -1469,17 +1460,17 @@ NORMAL (L"First, try to run the script when a Sound is not selected "
 	"and stop running at the third line, i.e. at your first$$ Play$. "
 	"The result is that the \"box\" will stay visible in the Picture window, because the fifth line of the script, "
 	"which should erase the box, is never executed.")
-NORMAL (L"Second, try to mistype a command (there's a good chance you already did it by accident), "
+NORMAL (U"Second, try to mistype a command (there's a good chance you already did it by accident), "
 	"e.g. write$$ PLay $instead of$$ Play$, or$$ Draw inner bocks $or whatever. "
 	"Again, you are likely to get a message saying that that command is not available. "
 	"Such messages are the most common messages that you'll see when writing scripts; "
 	"now you know that they mean either that you mistyped something or that you made the wrong selection.")
-ENTRY (L"4. Saving your script")
-NORMAL (L"The #File menu of the ScriptEditor has a command #Save, "
+ENTRY (U"4. Saving your script")
+NORMAL (U"The #File menu of the ScriptEditor has a command #Save, "
 	"with which you can save your script as a file on disk, for instance under the name$$ test.praat$.")
-NORMAL (L"Please try this with the five-line script you just typed. "
+NORMAL (U"Please try this with the five-line script you just typed. "
 	"After saving the script, the name of the script file will appear in the window title:")
-SCRIPT (6, 4, L""
+SCRIPT (6, 4, U""
 	Manual_DRAW_WINDOW (4, "Script \"/Users/Rose/Desktop/test.praat\"", "File   Edit   Search   Convert   Font   Run   Help")
 	"Courier\n"
 	"Text: 0, \"left\",  75, \"half\", \"\\s{Erase all}\"\n"
@@ -1489,60 +1480,60 @@ SCRIPT (6, 4, L""
 	"Text: 0, \"left\", 135, \"half\", \"\\s{Erase all}\"\n"
 	"Draw rectangle: 0, 560, 0, 360\n"
 )
-NORMAL (L"After you save your script, you can close the ScriptEditor window without losing the script: "
+NORMAL (U"After you save your script, you can close the ScriptEditor window without losing the script: "
 	"you can reopen the script file by using @@Open Praat script...@ from the #Praat menu, "
 	"or by choosing ##New Praat script# again, followed by ##Open...# from the ScriptEditor's #File menu.")
-NORMAL (L"It advisable to use$$ .praat $as the extension for script file names. "
+NORMAL (U"It advisable to use$$ .praat $as the extension for script file names. "
 	"On the Mac, if you double-click a$$ .praat $file, Praat will automatically start up and show the script. "
 	"On the Mac and on Windows, if you drag a$$ .praat $file on the Praat icon, Praat will also start up and show the script.")
 MAN_END
 
-MAN_BEGIN (L"Scripting 2. How to script settings windows", L"ppgb", 20140119)
-INTRO (L"Not all menu commands are as simple as those on the @@Scripting 1. Your first scripts|previous page@, "
+MAN_BEGIN (U"Scripting 2. How to script settings windows", U"ppgb", 20140119)
+INTRO (U"Not all menu commands are as simple as those on the @@Scripting 1. Your first scripts|previous page@, "
 	"which act immediately once you choose them from a menu (e.g. ##Play#, ##Erase all#). "
 	"Most commands in Praat require the user to supply additional information; "
 	"these are the commands whose title ends in \"...\".")
-NORMAL (L"For instance, when you select a Sound, the command ##Draw...# will appear in the #Draw menu, "
+NORMAL (U"For instance, when you select a Sound, the command ##Draw...# will appear in the #Draw menu, "
 	"and when you click it, Praat will present you with a %%settings window%, "
 	"which asks you to supply six pieces of additional information, i.e. six so-called %settings (or in programming jargon: %arguments):")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), L""
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Sound: Draw", 4)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Time range (s)", "0.0", "0.0 (= all)")
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Vertical range", "0.0", "0.0 (= auto)")
 	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN ("Garnish", 1)
 	Manual_DRAW_SETTINGS_WINDOW_OPTIONMENU ("Drawing method", "Curve")
 )
-NORMAL (L"In this example, all the settings have their standard values: you want to draw the whole time domain of the Sound, "
+NORMAL (U"In this example, all the settings have their standard values: you want to draw the whole time domain of the Sound, "
 	"you want to have autoscaling vertically, you want to see garnishings around the picture (a box, labelled axes, and numbers), "
 	"and you want the waveform to be drawn as a curve. Pressing the OK button in the above window is equivalent to executing the following script line:")
-CODE (L"Draw: 0, 0, 0, 0, \"yes\", \"Curve\"")
-NORMAL (L"You see that in a script, all of the arguments are supplied after the command, preceded by a colon and separated by commas, "
+CODE (U"Draw: 0, 0, 0, 0, \"yes\", \"Curve\"")
+NORMAL (U"You see that in a script, all of the arguments are supplied after the command, preceded by a colon and separated by commas, "
 	"in the same order as in the settings window, counted from top to bottom (and, within a line, from left to right). "
 	"The texts \"(= all)\" and \"(= auto)\" above are just Praat's explanations of what it means to type a zero in those fields "
 	"(namely `draw all times' and `use vertical autoscaling', respectively); in a script they are superfluous and you shouldn't write them.")
-NORMAL (L"If you want to draw the sound with different settings, say from 1 to 3.2 seconds, scaled between -1 and +1 instead of automatically, "
+NORMAL (U"If you want to draw the sound with different settings, say from 1 to 3.2 seconds, scaled between -1 and +1 instead of automatically, "
 	"with garnishings off, and with the waveform drawn as poles, you would have the following settings window:")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), L""
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (4), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Sound: Draw", 4)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Time range (s)", "1.0", "3.2")
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Vertical range", "-1", "1")
 	Manual_DRAW_SETTINGS_WINDOW_BOOLEAN ("Garnish", 0)
 	Manual_DRAW_SETTINGS_WINDOW_OPTIONMENU ("Drawing method", "Poles")
 )
-NORMAL (L"In a script this would look like")
-CODE (L"Draw: 1.0, 3.2, -1, 1, \"no\", \"Poles\"")
-ENTRY (L"1. Numeric arguments")
-NORMAL (L"The first four arguments in the above examples are %%numeric arguments%: they are (real or integer) numbers. "
+NORMAL (U"In a script this would look like")
+CODE (U"Draw: 1.0, 3.2, -1, 1, \"no\", \"Poles\"")
+ENTRY (U"1. Numeric arguments")
+NORMAL (U"The first four arguments in the above examples are %%numeric arguments%: they are (real or integer) numbers. "
 	"You just write them in the script as you would write them into the settings window.")
-ENTRY (L"2. Boolean (yes/no) arguments")
-NORMAL (L"The fifth argument in the above examples (#Garnish) is a %%boolean argument% (yes/no choice) and is represented by a %%check button%. "
+ENTRY (U"2. Boolean (yes/no) arguments")
+NORMAL (U"The fifth argument in the above examples (#Garnish) is a %%boolean argument% (yes/no choice) and is represented by a %%check button%. "
 	"In the script you write it as $$\"yes\"$ (including the quotes) or $$\"no\"$ (or as 1 or 0).")
-ENTRY (L"3. Multiple-choice arguments")
-NORMAL (L"The sixth argument in the above examples (##Drawing method#) is a %%multiple-choice argument% and is represented by an %%option menu%. "
+ENTRY (U"3. Multiple-choice arguments")
+NORMAL (U"The sixth argument in the above examples (##Drawing method#) is a %%multiple-choice argument% and is represented by an %%option menu%. "
 	"In the script you write the text of the choice, i.e. $$\"Curve\"$ or $$\"Poles\"$ in the examples.")
-NORMAL (L"A multiple choice argument is sometimes represented by a %%radio box% instead of by an option menu. "
+NORMAL (U"A multiple choice argument is sometimes represented by a %%radio box% instead of by an option menu. "
 	"For instance, the last example above could equally well have looked like")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6.1), L""   // 7 - 3 * 0.3 (three is the number of additional radio buttons)
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6.1), U""   // 7 - 3 * 0.3 (three is the number of additional radio buttons)
 	Manual_DRAW_SETTINGS_WINDOW ("Sound: Draw", 6.1)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Time range (s)", "1.0", "3.2")
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Vertical range", "-1", "1")
@@ -1555,12 +1546,12 @@ SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6.1), L""   // 7 - 3 * 0.3 (three is
 	"y -= 12\n"
 	Manual_DRAW_SETTINGS_WINDOW_RADIO ("", "Speckles", 0)
 )
-NORMAL (L"In supplying arguments to a command in a script, there is no difference between an option menu and a radio box. "
+NORMAL (U"In supplying arguments to a command in a script, there is no difference between an option menu and a radio box. "
 	"This last example will therefore again look like the following in a script:")
-CODE (L"Draw: 1.0, 3.2, -1, 1, \"no\", \"Poles\"")
-ENTRY (L"4. Text arguments")
-NORMAL (L"Consider another frequently used menu command, namely ##Create Sound from formula...# in the #New menu:")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6.6), L""
+CODE (U"Draw: 1.0, 3.2, -1, 1, \"no\", \"Poles\"")
+ENTRY (U"4. Text arguments")
+NORMAL (U"Consider another frequently used menu command, namely ##Create Sound from formula...# in the #New menu:")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6.6), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Create Sound from formula", 6.6)   // 0.6 extra for the text
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Name", "sine")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Number of channels", "1")
@@ -1569,54 +1560,54 @@ SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (6.6), L""
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Sampling frequency (Hz)", "44100")
 	Manual_DRAW_SETTINGS_WINDOW_TEXT ("Formula", "1/2 * sin(2*pi*377*x)")
 )
-NORMAL (L"In a script this would look like:")
-CODE (L"Create Sound from formula: \"sine\", 1, 0.0, 1.0, 44100, \"1/2 * sin(2*pi*377*x)\"")
-NORMAL (L"Both the first argument (#Name) and the sixth argument (#Formula) are %%text arguments%. "
+NORMAL (U"In a script this would look like:")
+CODE (U"Create Sound from formula: \"sine\", 1, 0.0, 1.0, 44100, \"1/2 * sin(2*pi*377*x)\"")
+NORMAL (U"Both the first argument (#Name) and the sixth argument (#Formula) are %%text arguments%. "
 	"In a script they are written within quotes.")
-ENTRY (L"5. File arguments")
-NORMAL (L"The commands from the Open and Save menus, and several other commands whose names "
+ENTRY (U"5. File arguments")
+NORMAL (U"The commands from the Open and Save menus, and several other commands whose names "
 	"start with #Read, #Open, or #Save, present a %%file selector window% instead of a typical Praat "
 	"settings window. File selector windows ask the user to supply a single argument: the file name.")
-NORMAL (L"In a script you can either supply the %%complete path% to the file, or supply a %%relative path%.")
-NORMAL (L"A complete path includes both the directory (folder) hierarchy and the name of the file. "
+NORMAL (U"In a script you can either supply the %%complete path% to the file, or supply a %%relative path%.")
+NORMAL (U"A complete path includes both the directory (folder) hierarchy and the name of the file. "
 	"This goes slightly differently on the Windows platform on the one hand, "
 	"and on the Mac and Linux platforms on the other. If your user name is Miep, "
 	"and your home directory contains a folder #Sounds, "
 	"and this folder contains a folder #Animals, and this contains the file ##miauw.wav#, "
 	"you can open that file as follows:")
-CODE (L"Read from file: \"C:/Users/Miep/Sounds/Animals/miauw.wav\"   ; Windows")
-CODE (L"Read from file: \"/Users/Miep/Sounds/Animals/miauw.wav\"   ; Mac")
-CODE (L"Read from file: \"/home/miep/Sounds/Animals/miauw.wav\"   ; Linux")
-NORMAL (L"(the part before your user name may be slightly different on your computer; "
+CODE (U"Read from file: \"C:/Users/Miep/Sounds/Animals/miauw.wav\"   ; Windows")
+CODE (U"Read from file: \"/Users/Miep/Sounds/Animals/miauw.wav\"   ; Mac")
+CODE (U"Read from file: \"/home/miep/Sounds/Animals/miauw.wav\"   ; Linux")
+NORMAL (U"(the part before your user name may be slightly different on your computer; "
 	"use your command or terminal window to find out)")
-NORMAL (L"In these examples, \"C\" is the Windows %%drive letter% and "
+NORMAL (U"In these examples, \"C\" is the Windows %%drive letter% and "
 	"##/Users/Miep# or ##/home/Miep# is your %%home directory%. Both the home directory and the drive letter "
 	"can be abbreviated away by using the tilde (\"~\"):")
-CODE (L"Read from file: \"~/Sounds/Animals/miauw.wav\"")
-NORMAL (L"If your #Sounds folder is not in your home directory but on your desktop, you do")
-CODE (L"Read from file: \"~/Desktop/Sounds/Animals/miauw.wav\"")
-NORMAL (L"(this works because on all three platforms, the desktop folder is a subfolder of your home directory)")
-NORMAL (L"If your Sounds folder is on a USB drive called PORCH, it would be something like:")
-CODE (L"Read from file: \"G:/Sounds/Animals/miauw.wav\"   ; Windows")
-CODE (L"Read from file: \"/Volumes/PORCH/Sounds/Animals/miauw.wav\"   ; Mac")
-CODE (L"Read from file: \"/media/PORCH/Sounds/Animals/miauw.wav\"   ; Linux")
-NORMAL (L"Instead of all these complete path names, you can use %relative path names. "
+CODE (U"Read from file: \"~/Sounds/Animals/miauw.wav\"")
+NORMAL (U"If your #Sounds folder is not in your home directory but on your desktop, you do")
+CODE (U"Read from file: \"~/Desktop/Sounds/Animals/miauw.wav\"")
+NORMAL (U"(this works because on all three platforms, the desktop folder is a subfolder of your home directory)")
+NORMAL (U"If your Sounds folder is on a USB drive called PORCH, it would be something like:")
+CODE (U"Read from file: \"G:/Sounds/Animals/miauw.wav\"   ; Windows")
+CODE (U"Read from file: \"/Volumes/PORCH/Sounds/Animals/miauw.wav\"   ; Mac")
+CODE (U"Read from file: \"/media/PORCH/Sounds/Animals/miauw.wav\"   ; Linux")
+NORMAL (U"Instead of all these complete path names, you can use %relative path names. "
 	"These are taken as relative to the directory in which your script resides, "
 	"and help to make your script portable if you move the script along with your data.")
-NORMAL (L"Thus, if your script (after you have saved it!) is in the #Animals folder mentioned above, "
+NORMAL (U"Thus, if your script (after you have saved it!) is in the #Animals folder mentioned above, "
 	"i.e. in the same folder as ##miauw.wav#, you would simply open the file with")
-CODE (L"Read from file: \"miauw.wav\"")
-NORMAL (L"If your script is in the #Sounds folder mentioned above, "
+CODE (U"Read from file: \"miauw.wav\"")
+NORMAL (U"If your script is in the #Sounds folder mentioned above, "
 	"i.e. in the same folder as where the #Animals folder is, you would open the file with")
-CODE (L"Read from file: \"Animals/miauw.aifc\"")
-NORMAL (L"If your script is in the folder #Scripts that is inside the #Sounds folder, "
+CODE (U"Read from file: \"Animals/miauw.aifc\"")
+NORMAL (U"If your script is in the folder #Scripts that is inside the #Sounds folder, "
 	"i.e. if your script is a sister folder of the #Animals folder, you would open the file with")
-CODE (L"Read from file: \"../Animals/miauw.aifc\"")
-NORMAL (L"where \"..\" is the general way on all platforms to go one folder up in the hierarchy.")
-NORMAL (L"Note that on Windows you could use the backslash (\"\\bs\") instead of the forward slash (\"/\"), "
+CODE (U"Read from file: \"../Animals/miauw.aifc\"")
+NORMAL (U"where \"..\" is the general way on all platforms to go one folder up in the hierarchy.")
+NORMAL (U"Note that on Windows you could use the backslash (\"\\bs\") instead of the forward slash (\"/\"), "
 	"but with the forward slash your script will work on all three platforms.")
-ENTRY (L"6. How to supply arguments automatically")
-NORMAL (L"Now you know all the ways to write the arguments of commands in a script line. "
+ENTRY (U"6. How to supply arguments automatically")
+NORMAL (U"Now you know all the ways to write the arguments of commands in a script line. "
 	"If you dislike manually copying arguments from settings windows into your script, "
 	"or if you are not sure whether something is a numeric or a string argument, "
 	"you can use the @@history mechanism@: "
@@ -1626,18 +1617,18 @@ NORMAL (L"Now you know all the ways to write the arguments of commands in a scri
 	"will appear in the ScriptEditor at the position of the text cursor. You can build whole new scripts on the basis of this mechanism.")
 MAN_END
 
-MAN_BEGIN (L"Scripting 3. Simple language elements", L"ppgb", 20130421)
-INTRO (L"The Praat scripting language doesn't only call the menu commands "
+MAN_BEGIN (U"Scripting 3. Simple language elements", U"ppgb", 20130421)
+INTRO (U"The Praat scripting language doesn't only call the menu commands "
 	"discussed in the @@Scripting 1. Your first scripts|first@ and @@Scripting 2. How to script settings windows|second@ chapters of this tutorial, "
 	"it is only a general procedural programming language that allows you to compute numbers, handle texts, and make custom analyses.")
-NORMAL (L"This chapter focuses on the things you need most. It is designed in such a way that you can work through it even if you haven't written computer programs before.")
-LIST_ITEM (L"@@Scripting 3.1. Hello world@ (writeInfoLine, appendInfoLine)")
-LIST_ITEM (L"@@Scripting 3.2. Numeric variables@ (assignments)")
-LIST_ITEM (L"@@Scripting 3.3. Numeric queries")
-LIST_ITEM (L"@@Scripting 3.4. String variables@ (assignments)")
-LIST_ITEM (L"@@Scripting 3.5. String queries")
-LIST_ITEM (L"@@Scripting 3.6. \"For\" loops@ (for, endfor)")
-LIST_ITEM (L"@@Scripting 3.7. Layout@ (white space, comments, continuation lines)")
+NORMAL (U"This chapter focuses on the things you need most. It is designed in such a way that you can work through it even if you haven't written computer programs before.")
+LIST_ITEM (U"@@Scripting 3.1. Hello world@ (writeInfoLine, appendInfoLine)")
+LIST_ITEM (U"@@Scripting 3.2. Numeric variables@ (assignments)")
+LIST_ITEM (U"@@Scripting 3.3. Numeric queries")
+LIST_ITEM (U"@@Scripting 3.4. String variables@ (assignments)")
+LIST_ITEM (U"@@Scripting 3.5. String queries")
+LIST_ITEM (U"@@Scripting 3.6. \"For\" loops@ (for, endfor)")
+LIST_ITEM (U"@@Scripting 3.7. Layout@ (white space, comments, continuation lines)")
 MAN_END
 
 #define Manual_DRAW_PICTURE_WINDOW(height,vpLeft,vpRight,vpTop,vpBottom) \
@@ -1662,45 +1653,45 @@ MAN_END
 	"Black\n" \
 	"Draw line: 0, 0, 5.6, 0\n" \
 
-MAN_BEGIN (L"Scripting 3.1. Hello world", L"ppgb", 20140111)
-INTRO (L"Many manuals of computer programming languages start with their answer on the following question:")
-NORMAL (L"%%How do I write the text \"Hello world\" on the screen?")
-NORMAL (L"For the Praat scripting language, there are two answers.")
-ENTRY (L"1. \"Hello world\" in the Info window")
-NORMAL (L"The simplest answer is that you open the ScriptEditor window with ##New Praat script# from the #Praat menu, "
+MAN_BEGIN (U"Scripting 3.1. Hello world", U"ppgb", 20140111)
+INTRO (U"Many manuals of computer programming languages start with their answer on the following question:")
+NORMAL (U"%%How do I write the text \"Hello world\" on the screen?")
+NORMAL (U"For the Praat scripting language, there are two answers.")
+ENTRY (U"1. \"Hello world\" in the Info window")
+NORMAL (U"The simplest answer is that you open the ScriptEditor window with ##New Praat script# from the #Praat menu, "
 	"then type the following line into the ScriptEditor window:")
-CODE (L"writeInfoLine: \"Hello world\"")
-NORMAL (L"and finally choose #Run from the #Run menu.")
-NORMAL (L"When you try this, the result should be that the Info window comes to the front, and that it shows the text $$Hello world$:")
-SCRIPT (6, 3, L""
+CODE (U"writeInfoLine: \"Hello world\"")
+NORMAL (U"and finally choose #Run from the #Run menu.")
+NORMAL (U"When you try this, the result should be that the Info window comes to the front, and that it shows the text $$Hello world$:")
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{Hello world}\"\n"
 	"Draw rectangle: 0, 560, 0, 260\n"
 )
-NORMAL (L"Now suppose that you to write two lines instead of just one, so you try a script with two lines:")
-CODE (L"writeInfoLine: \"Hello world\"")
-CODE (L"writeInfoLine: \"How do you do?\"")
-NORMAL (L"This turns out not to do what you want: it seems to write only the text $$How do you do?$. "
+NORMAL (U"Now suppose that you to write two lines instead of just one, so you try a script with two lines:")
+CODE (U"writeInfoLine: \"Hello world\"")
+CODE (U"writeInfoLine: \"How do you do?\"")
+NORMAL (U"This turns out not to do what you want: it seems to write only the text $$How do you do?$. "
 	"This happens because the #writeInfoLine function first erases the Info window, then writes the line of text. "
 	"So the first line of the script did write the text $$Hello world$, but the second line wiped it out "
 	"and wrote $$How do you do?$ instead. The script that does what you want is")
-CODE (L"writeInfoLine: \"Hello world\"")
-CODE (L"appendInfoLine: \"How do you do?\"")
-NORMAL (L"Now the result will be")
-SCRIPT (6, 3, L""
+CODE (U"writeInfoLine: \"Hello world\"")
+CODE (U"appendInfoLine: \"How do you do?\"")
+NORMAL (U"Now the result will be")
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{Hello world}\"\n"
 	"Text: 0, \"left\", 90, \"half\", \"\\s{How do you do?}\"\n"
 	"Draw rectangle: 0, 560, 0, 260\n"
 )
-NORMAL (L"This works because #appendInfoLine writes a line without erasing the Info window first.")
-NORMAL (L"Finally, try the following script:")
-CODE (L"appendInfoLine: \"Another try\"")
-CODE (L"appendInfoLine: \"Goodbye\"")
-NORMAL (L"The result could be")
-SCRIPT (6, 3, L""
+NORMAL (U"This works because #appendInfoLine writes a line without erasing the Info window first.")
+NORMAL (U"Finally, try the following script:")
+CODE (U"appendInfoLine: \"Another try\"")
+CODE (U"appendInfoLine: \"Goodbye\"")
+NORMAL (U"The result could be")
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{Hello world}\"\n"
@@ -1709,17 +1700,17 @@ SCRIPT (6, 3, L""
 	"Text: 0, \"left\", 120, \"half\", \"\\s{Goodbye}\"\n"
 	"Draw rectangle: 0, 560, 0, 260\n"
 )
-NORMAL (L"In other words, #appendInfoLine writes lines into the Info window without erasing it, even if you run a script anew. "
+NORMAL (U"In other words, #appendInfoLine writes lines into the Info window without erasing it, even if you run a script anew. "
 	"This is why many Praat scripts that write into the Info window do a #writeInfoLine first, and follow it with a series of #appendInfoLine calls.")
-NORMAL (L"For more information on these commands, see @@Scripting 6.2. Writing to the Info window at .")
-ENTRY (L"2. \"Hello world\" in the Picture window.")
-NORMAL (L"You can also show text in the Picture window. If you are an experienced Praat user, you have probably used the comamnd ##Text top...# before. "
+NORMAL (U"For more information on these commands, see @@Scripting 6.2. Writing to the Info window at .")
+ENTRY (U"2. \"Hello world\" in the Picture window.")
+NORMAL (U"You can also show text in the Picture window. If you are an experienced Praat user, you have probably used the comamnd ##Text top...# before. "
 	"You can use it do draw a text at the top of the current %viewport, which is the part of the Picture window where the next drawing will occur "
 	"and which is marked by the pink %margins. Thus, when you select the top 4\\xx3 inches of the Picture window (with the mouse), "
 	"set the font size to 12 (with the #Pen menu), and run the script")
-CODE (L"Text top: \"yes\", \"Hello world\"")
-NORMAL (L"then you'll see")
-SCRIPT (6, 4.5, L""
+CODE (U"Text top: \"yes\", \"Hello world\"")
+NORMAL (U"then you'll see")
+SCRIPT (6, 4.5, U""
 	Manual_DRAW_PICTURE_WINDOW (4.5, 0,4,0,3)
 	"Select outer viewport: 0.2, 4.2, 0.8, 12\n" \
 	"Times\n" \
@@ -1728,82 +1719,82 @@ SCRIPT (6, 4.5, L""
 	"Axes: 0, 1, 0, 1\n" \
 	"Draw rectangle: 0, 1, 0, 1\n"
 )
-NORMAL (L"So this works the same as when you choose ##Text top...# from the #Margins menu by hand, with #Far switched on.")
-NORMAL (L"If you want your script to always show the same text at the same position, with nothing else in the picture, "
+NORMAL (U"So this works the same as when you choose ##Text top...# from the #Margins menu by hand, with #Far switched on.")
+NORMAL (U"If you want your script to always show the same text at the same position, with nothing else in the picture, "
 	"then you can make your script a bit more extensive:")
-CODE (L"Erase all")
-CODE (L"Times")
-CODE (L"Font size: 12")
-CODE (L"Select outer viewport: 0, 4, 0, 3")
-CODE (L"Text top: \"yes\", \"Hello world\"")
-NORMAL (L"In this script, line 1 erases the Picture window, so that nothing besides your text can appear in the Picture window.")
-NORMAL (L"Line 2 executes the command #Times from the #Font menu, so that the script will always draw the text in Times, "
+CODE (U"Erase all")
+CODE (U"Times")
+CODE (U"Font size: 12")
+CODE (U"Select outer viewport: 0, 4, 0, 3")
+CODE (U"Text top: \"yes\", \"Hello world\"")
+NORMAL (U"In this script, line 1 erases the Picture window, so that nothing besides your text can appear in the Picture window.")
+NORMAL (U"Line 2 executes the command #Times from the #Font menu, so that the script will always draw the text in Times, "
 	"even if you choose #Helvetica in the #Font menu with the mouse before you run the script "
 	"(after the script has run, you'll see that #Times is chosen in the #Font menu).")
-NORMAL (L"Line 3 executes the command ##Font size...# from the #Font menu, setting the font size to 12 and setting the width of the pink margins "
+NORMAL (U"Line 3 executes the command ##Font size...# from the #Font menu, setting the font size to 12 and setting the width of the pink margins "
 	"accordingly.")
-NORMAL (L"Line 4 executes the command @@Select outer viewport...@ from the #Select menu. "
+NORMAL (U"Line 4 executes the command @@Select outer viewport...@ from the #Select menu. "
 	"This performs an action that you would normally do by dragging the mouse, "
 	"namely selecting the part of the Picture window that runs from 0 to 4 inches horizontally "
 	"and from 0 to 3 inches vertically. After running the script, "
 	"the %viewport is indeed [0, 4] \\xx [0, 3], as you can clearly see "
 	"from the pink margins above.")
-NORMAL (L"Line 5 finally writes the text.")
-NORMAL (L"For more information on these commands, see @@Picture window at .")
+NORMAL (U"Line 5 finally writes the text.")
+NORMAL (U"For more information on these commands, see @@Picture window at .")
 MAN_END
 
-MAN_BEGIN (L"Scripting 3.2. Numeric variables", L"ppgb", 20130411)
-INTRO (L"In any general procedural programming language you can work with %variables, "
+MAN_BEGIN (U"Scripting 3.2. Numeric variables", U"ppgb", 20130411)
+INTRO (U"In any general procedural programming language you can work with %variables, "
 	"which are places in your computer's memory where you can store a number or anything else.")
-NORMAL (L"For instance, you could put the number 3.1 into the variable $b in the following way:")
-CODE (L"b = 3.1")
-NORMAL (L"This statement is called as %assignment, i.e., you %assign the %value 3.1 to the %variable $b. "
+NORMAL (U"For instance, you could put the number 3.1 into the variable $b in the following way:")
+CODE (U"b = 3.1")
+NORMAL (U"This statement is called as %assignment, i.e., you %assign the %value 3.1 to the %variable $b. "
 	"We read this statement aloud as \"b becomes 3.1\". "
 	"What this means is that after this statement, the memory location $b %contains the numeric value (number) 3.1.")
-NORMAL (L"You can regard a variable as a box: you put the value 3.1 into the box named $b. "
+NORMAL (U"You can regard a variable as a box: you put the value 3.1 into the box named $b. "
 	"Or you can regard a variable as a house: the house is called $b and now the family \"3.1\" is living there. "
 	"Or you can regard it as any other storage location.")
-NORMAL (L"To see what value a variable contains (what's in the box, or who lives in the house), "
+NORMAL (U"To see what value a variable contains (what's in the box, or who lives in the house), "
 	"you can use the #writeInfoLine function:")
-CODE (L"b = 3.1")
-CODE (L"writeInfoLine: \"The value is \", b, \".\"")
-NORMAL (L"This will put the text $$The value is 3.1.$ into the Info window, as you are invited to verify.")
-NORMAL (L"A variable is called a variable because it is %variable, i.e. its value can change. Try the script")
-CODE (L"b = 3.1")
-CODE (L"b = 5.8")
-CODE (L"writeInfoLine: \"The value is \", b, \".\"")
-NORMAL (L"You will see that $b ends up having the value 5.8. The first line puts the value 3.1 there, but the second line "
+CODE (U"b = 3.1")
+CODE (U"writeInfoLine: \"The value is \", b, \".\"")
+NORMAL (U"This will put the text $$The value is 3.1.$ into the Info window, as you are invited to verify.")
+NORMAL (U"A variable is called a variable because it is %variable, i.e. its value can change. Try the script")
+CODE (U"b = 3.1")
+CODE (U"b = 5.8")
+CODE (U"writeInfoLine: \"The value is \", b, \".\"")
+NORMAL (U"You will see that $b ends up having the value 5.8. The first line puts the value 3.1 there, but the second line "
 	"replaces it with 5.8. It's like taking the 3.1 out of the box and putting the 5.8 in its stead. "
 	"Or the family 3.1 moves from the house, and the family called 5.8 moves in.")
-NORMAL (L"In an assignment, the part to the right of the \"becomes\" sign (the \"=\" sign) doesn't have to be a number; "
+NORMAL (U"In an assignment, the part to the right of the \"becomes\" sign (the \"=\" sign) doesn't have to be a number; "
 	"it can be any %formula that %evaluates to a number. For instance, the script")
-CODE (L"b = 3.1 * 2")
-CODE (L"writeInfoLine: \"The value is \", b, \".\"")
-NORMAL (L"puts the text $$The value is 6.2.$ into the Info window. This works because Praat handles the first line "
+CODE (U"b = 3.1 * 2")
+CODE (U"writeInfoLine: \"The value is \", b, \".\"")
+NORMAL (U"puts the text $$The value is 6.2.$ into the Info window. This works because Praat handles the first line "
 	"in the following way:")
-LIST_ITEM (L"1. the formula $$3.1 * 2$ is %evaluated (i.e. its value is computed), and the result is 6.2.")
-LIST_ITEM (L"2. the value 6.2 is subsequently stored in the variable $b.")
-NORMAL (L"After line 1 has been executed, the variable $b just contains the value 6.2, nothing more; "
+LIST_ITEM (U"1. the formula $$3.1 * 2$ is %evaluated (i.e. its value is computed), and the result is 6.2.")
+LIST_ITEM (U"2. the value 6.2 is subsequently stored in the variable $b.")
+NORMAL (U"After line 1 has been executed, the variable $b just contains the value 6.2, nothing more; "
 	"the variable $b doesn't remember that that value has been computed by multiplying 3.1 with 2.")
-NORMAL (L"Formulas can contain more things than numbers: they can also contain other variables:")
-CODE (L"b = 3.1")
-CODE (L"c = b * 2")
-CODE (L"writeInfoLine: \"The value of b is \", b, \", and the value of c is \", c, \".\"")
-NORMAL (L"In the first line, $b gets the value 3.1. In the second line, the formula $$b * 2$ first has to be evaluated. "
+NORMAL (U"Formulas can contain more things than numbers: they can also contain other variables:")
+CODE (U"b = 3.1")
+CODE (U"c = b * 2")
+CODE (U"writeInfoLine: \"The value of b is \", b, \", and the value of c is \", c, \".\"")
+NORMAL (U"In the first line, $b gets the value 3.1. In the second line, the formula $$b * 2$ first has to be evaluated. "
 	"Praat looks up the value of $b (which is 3.1), so that it knows that the formula actually means $$3.1 * 2$. "
 	"Praat evaluates this formula and stores the result (namely the value 6.2) "
 	"into the variable $c, which will then contain nothing else than the value 6.2. "
 	"The Info window thus reports $$The value of b is 3.1, and the value of c is 6.2.$.")
-NORMAL (L"After these explanations, consider the following script:")
-CODE (L"b = 3.1")
-CODE (L"c = b * 2")
-CODE (L"b = 5.8")
-CODE (L"writeInfoLine: \"The value of c is \", c, \".\"")
-NORMAL (L"Can you figure out what the Info will report? If you think it will report "
+NORMAL (U"After these explanations, consider the following script:")
+CODE (U"b = 3.1")
+CODE (U"c = b * 2")
+CODE (U"b = 5.8")
+CODE (U"writeInfoLine: \"The value of c is \", c, \".\"")
+NORMAL (U"Can you figure out what the Info will report? If you think it will report "
 	"$$The value of c is 6.2.$, then you are correct: after the first line, $b contains the value 3.1; "
 	"after the second line, the value of $c is therefore 6.2, and nothing more; "
 	"after line 3, the value of $b has changed to 5.8, but the value of $c hasn't changed and is still 6.2.")
-NORMAL (L"If you thought that $c would end up having the value 11.6, then you're thinking in terms "
+NORMAL (U"If you thought that $c would end up having the value 11.6, then you're thinking in terms "
 	"of a non-procedural language such as Prolog; you may have thought that the thing assigned to $c in the second line "
 	"is the whole %formula $$b * 2$, so that $c changes when $b changes. But this is not the case: "
 	"the thing stored in $c is just the %value of the formula $$b * 2$ at that moment, which is 6.2, "
@@ -1811,34 +1802,34 @@ NORMAL (L"If you thought that $c would end up having the value 11.6, then you're
 	"consult anybody who writes programs.")
 MAN_END
 
-MAN_BEGIN (L"Scripting 3.3. Numeric queries", L"ppgb", 20140111)
-INTRO (L"Now that you know how to script a menu command, and you know how variables work, "
+MAN_BEGIN (U"Scripting 3.3. Numeric queries", U"ppgb", 20140111)
+INTRO (U"Now that you know how to script a menu command, and you know how variables work, "
 	"you are ready to combine the two.")
-NORMAL (L"Suppose you have selected a Sound in the object list. One of the commands available in the #Query menu "
+NORMAL (U"Suppose you have selected a Sound in the object list. One of the commands available in the #Query menu "
 	"is ##Get power...#. When you choose it, you will see the following settings window:")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (1), L""   // 7 - 3 * 0.3 (three is the number of additional radio buttons)
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (1), U""   // 7 - 3 * 0.3 (three is the number of additional radio buttons)
 	Manual_DRAW_SETTINGS_WINDOW ("Sound: Get power", 1)
 	Manual_DRAW_SETTINGS_WINDOW_RANGE ("Time range (s)", "0.0", "0.0 (= all)")
 )
-NORMAL (L"When you click OK, something like the following will appear in the Info window:")
-SCRIPT (6, 3, L""
+NORMAL (U"When you click OK, something like the following will appear in the Info window:")
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{0.1350605005239421 Pa2}\"\n"
 	"Draw rectangle: 0, 560, 0, 260\n"
 )
-NORMAL (L"This is the mean power of the whole Sound.")
-NORMAL (L"In a script, you want to use the value of this power in the script itself, not in the Info window, "
+NORMAL (U"This is the mean power of the whole Sound.")
+NORMAL (U"In a script, you want to use the value of this power in the script itself, not in the Info window, "
 	"perhaps because you want to do computations with it or because you want to report the value with a nice text around it. "
 	"This is how you do the latter:")
-CODE (L"power = Get power: 0.0, 0.0")
-CODE (L"writeInfoLine: \"The power of this sound is \", power, \" Pascal-squared.\"")
-NORMAL (L"The first line of this script executes the menu command ##Get power...#, "
+CODE (U"power = Get power: 0.0, 0.0")
+CODE (U"writeInfoLine: \"The power of this sound is \", power, \" Pascal-squared.\"")
+NORMAL (U"The first line of this script executes the menu command ##Get power...#, "
 	"but puts the value 0.1350605005239421 into the variable $power instead of into the Info window "
 	"(the variable can have any name you like, as long as it starts with a lower-case letter "
 	"and consists of letters and digits; see @@Scripting 5.1. Variables@).")
-NORMAL (L"The second line then reports the value in the Info window, this time with a nice text around it:")
-SCRIPT (6, 3, L""
+NORMAL (U"The second line then reports the value in the Info window, this time with a nice text around it:")
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{The power of this sound is 0.1350605005239421 Pascal-squared.}\"\n"
@@ -1846,76 +1837,76 @@ SCRIPT (6, 3, L""
 )
 MAN_END
 
-MAN_BEGIN (L"Scripting 3.4. String variables", L"ppgb", 20130411)
-INTRO (L"Just as you can store @@Scripting 3.2. Numeric variables|numeric variables@, "
+MAN_BEGIN (U"Scripting 3.4. String variables", U"ppgb", 20130411)
+INTRO (U"Just as you can store @@Scripting 3.2. Numeric variables|numeric variables@, "
 	"you can store %%string variables%, which contain text instead of numbers. Here is an example:")
-CODE (L"word1\\$  = \"Hello\"")
-CODE (L"word2\\$  = \"world\"")
-CODE (L"sentence\\$  = word1\\$  + \" \" + word2\\$ ")
-CODE (L"writeInfoLine: \"The whole sentence is: \", sentence\\$ ")
-NORMAL (L"Yes, this is another way to get the sentence $$Hello world$ into the Info window. "
+CODE (U"word1\\$  = \"Hello\"")
+CODE (U"word2\\$  = \"world\"")
+CODE (U"sentence\\$  = word1\\$  + \" \" + word2\\$ ")
+CODE (U"writeInfoLine: \"The whole sentence is: \", sentence\\$ ")
+NORMAL (U"Yes, this is another way to get the sentence $$Hello world$ into the Info window. "
 	"It's a more linguistically valid way to do it, and here is how it works:")
-LIST_ITEM (L"1. In line 1, the value \"Hello\", which is a text (as we can see by its use of quotes), "
+LIST_ITEM (U"1. In line 1, the value \"Hello\", which is a text (as we can see by its use of quotes), "
 	"is stored into the variable $$word1\\$ $, which is a string variable (as we can see because its name ends in a dollar sign).")
-LIST_ITEM (L"2. In line 2, the text value \"world\" is stored into the string variable $$word2\\$ $.")
-LIST_ITEM (L"3. In line 3, we have the formula $$word1\\$  + \" \" + word2\\$ $, which contains two variables, "
+LIST_ITEM (U"2. In line 2, the text value \"world\" is stored into the string variable $$word2\\$ $.")
+LIST_ITEM (U"3. In line 3, we have the formula $$word1\\$  + \" \" + word2\\$ $, which contains two variables, "
 	"namely $$word1\\$ $ and $$word2\\$ $.")
-LIST_ITEM (L"4. The values of the two variables are \"Hello\" and \"world\", respectively, "
+LIST_ITEM (U"4. The values of the two variables are \"Hello\" and \"world\", respectively, "
 	"so what the formula actually says is \"Hello\" + \" \" + \"world\".")
-LIST_ITEM (L"5. The pluses in the formula mean \"concatenate\", so we concatenate the three strings "
+LIST_ITEM (U"5. The pluses in the formula mean \"concatenate\", so we concatenate the three strings "
 	"\"Hello\", \" \", and \"world\", giving the longer string \"Hello world\".")
-LIST_ITEM (L"6. Still in line 3, the string value \"Hello world\" is assigned to the string variable $$sentence\\$ $.")
-LIST_ITEM (L"7. Line 4 reports in the Info window: $$The whole sentence is: Hello world$")
+LIST_ITEM (U"6. Still in line 3, the string value \"Hello world\" is assigned to the string variable $$sentence\\$ $.")
+LIST_ITEM (U"7. Line 4 reports in the Info window: $$The whole sentence is: Hello world$")
 MAN_END
 
-MAN_BEGIN (L"Scripting 3.5. String queries", L"ppgb", 20140111)
-INTRO (L"Just as you can use menu commands (usually in a #Query menu) to query @@Scripting 3.3. Numeric queries|numbers@, "
+MAN_BEGIN (U"Scripting 3.5. String queries", U"ppgb", 20140111)
+INTRO (U"Just as you can use menu commands (usually in a #Query menu) to query @@Scripting 3.3. Numeric queries|numbers@, "
 	"you can query texts as well.")
-NORMAL (L"For instance, when you select a Textgrid, the #Query menu will contain the command ##Get label of interval...#, "
+NORMAL (U"For instance, when you select a Textgrid, the #Query menu will contain the command ##Get label of interval...#, "
 	"which takes two numeric arguments, namely ##Tier number# and ##Interval number#:")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (2), L""
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (2), U""
 	Manual_DRAW_SETTINGS_WINDOW ("TextGrid: Get label of interval", 2)
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Tier number", "1")
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Interval number", "3")
 )
-NORMAL (L"When you click OK, and interval 3 of tier 1 happens to contain the text $$hello$, the following appears in the Info window:")
-SCRIPT (6, 3, L""
+NORMAL (U"When you click OK, and interval 3 of tier 1 happens to contain the text $$hello$, the following appears in the Info window:")
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{hello}\"\n"
 	"Draw rectangle: 0, 560, 0, 260\n"
 )
-NORMAL (L"In a script, you will want to put the result of the query in a string variable instead of in the Info window, "
+NORMAL (U"In a script, you will want to put the result of the query in a string variable instead of in the Info window, "
 	"because you want to manipulate it further:")
-CODE (L"text\\$  = Get label of interval: 1, 3")
-CODE (L"writeInfoLine: \"The text in interval 3 of tier 1 is: \", text\\$ ")
-NORMAL (L"The script first stores the text of the interval, i.e. $$hello$, into the variable ##text\\$ #, "
+CODE (U"text\\$  = Get label of interval: 1, 3")
+CODE (U"writeInfoLine: \"The text in interval 3 of tier 1 is: \", text\\$ ")
+NORMAL (U"The script first stores the text of the interval, i.e. $$hello$, into the variable ##text\\$ #, "
 	"then writes it, preceded by some informative text, into the Info window:")
-SCRIPT (6, 3, L""
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{The text in interval 3 of tier 1 is: hello}\"\n"
 	"Draw rectangle: 0, 560, 0, 260\n"
 )
-NORMAL (L"Hey, yet another way to implement \"Hello world\" with the Praat scripting language!")
-ENTRY (L"The difference between numeric queries and string queries")
-NORMAL (L"A string query stores in a string variable the whole text that would appear in the Info window. "
+NORMAL (U"Hey, yet another way to implement \"Hello world\" with the Praat scripting language!")
+ENTRY (U"The difference between numeric queries and string queries")
+NORMAL (U"A string query stores in a string variable the whole text that would appear in the Info window. "
 	"For instance, the script")
-CODE (L"power\\$  = Get power: 0.0, 0.0")
-CODE (L"writeInfoLine: power\\$ ")
-NORMAL (L"could give you the following result:")
-SCRIPT (6, 3, L""
+CODE (U"power\\$  = Get power: 0.0, 0.0")
+CODE (U"writeInfoLine: power\\$ ")
+NORMAL (U"could give you the following result:")
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{0.1350605005239421 Pa2}\"\n"
 	"Draw rectangle: 0, 560, 0, 260\n"
 )
-NORMAL (L"A numeric query stores in a numeric variable only the first number that it can find in the text that would appear in the Info window. "
+NORMAL (U"A numeric query stores in a numeric variable only the first number that it can find in the text that would appear in the Info window. "
 	"For instance, the script")
-CODE (L"power = Get power: 0.0, 0.0")
-CODE (L"writeInfoLine: power")
-NORMAL (L"could give you the following result:")
-SCRIPT (6, 3, L""
+CODE (U"power = Get power: 0.0, 0.0")
+CODE (U"writeInfoLine: power")
+NORMAL (U"could give you the following result:")
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{0.1350605005239421}\"\n"
@@ -1923,25 +1914,25 @@ SCRIPT (6, 3, L""
 )
 MAN_END
 
-MAN_BEGIN (L"Scripting 3.6. \"For\" loops", L"ppgb", 20140111)
-INTRO (L"The power of a procedural programming language is most easily illustrated with the %%for-loop%.")
-NORMAL (L"Take the example of the @@Scripting 3.5. String queries|previous page@, "
+MAN_BEGIN (U"Scripting 3.6. \"For\" loops", U"ppgb", 20140111)
+INTRO (U"The power of a procedural programming language is most easily illustrated with the %%for-loop%.")
+NORMAL (U"Take the example of the @@Scripting 3.5. String queries|previous page@, "
 	"whereas you wanted to know the text in the third interval of the first tier of a selected TextGrid. "
 	"It's easy to imagine that you actually want the texts of %%all the first five% intervals. "
 	"With knowledge from the previous sections, you could write it like this:")
-CODE (L"writeInfoLine: \"The texts in the first five intervals:\"")
-CODE (L"text\\$  = Get label of interval: 1, 1")
-CODE (L"appendInfoLine: \"Interval 1: \", text\\$ ")
-CODE (L"text\\$  = Get label of interval: 1, 2")
-CODE (L"appendInfoLine: \"Interval 2: \", text\\$ ")
-CODE (L"text\\$  = Get label of interval: 1, 3")
-CODE (L"appendInfoLine: \"Interval 3: \", text\\$ ")
-CODE (L"text\\$  = Get label of interval: 1, 4")
-CODE (L"appendInfoLine: \"Interval 4: \", text\\$ ")
-CODE (L"text\\$  = Get label of interval: 1, 5")
-CODE (L"appendInfoLine: \"Interval 5: \", text\\$ ")
-NORMAL (L"The result will be something like")
-SCRIPT (6, 3, L""
+CODE (U"writeInfoLine: \"The texts in the first five intervals:\"")
+CODE (U"text\\$  = Get label of interval: 1, 1")
+CODE (U"appendInfoLine: \"Interval 1: \", text\\$ ")
+CODE (U"text\\$  = Get label of interval: 1, 2")
+CODE (U"appendInfoLine: \"Interval 2: \", text\\$ ")
+CODE (U"text\\$  = Get label of interval: 1, 3")
+CODE (U"appendInfoLine: \"Interval 3: \", text\\$ ")
+CODE (U"text\\$  = Get label of interval: 1, 4")
+CODE (U"appendInfoLine: \"Interval 4: \", text\\$ ")
+CODE (U"text\\$  = Get label of interval: 1, 5")
+CODE (U"appendInfoLine: \"Interval 5: \", text\\$ ")
+NORMAL (U"The result will be something like")
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{The texts in the first five intervals:}\"\n"
@@ -1952,52 +1943,52 @@ SCRIPT (6, 3, L""
 	"Text: 0, \"left\", 150, \"half\", \"\\s{Interval 5: you}\"\n"
 	"Draw rectangle: 0, 560, 0, 260\n"
 )
-NORMAL (L"This can be done more nicely. The first step is to realize that the sentences starting with $$text\\$ $ are similar to each other, "
+NORMAL (U"This can be done more nicely. The first step is to realize that the sentences starting with $$text\\$ $ are similar to each other, "
 	"and the sentence starting with $appendInfoLine are also similar to each other. They only differ in the interval number, "
 	"and can therefore be made %identical by using a variable for the interval number, like this:")
-CODE (L"writeInfoLine: \"The texts in the first five intervals:\"")
-CODE (L"intervalNumber = 1")
-CODE (L"text\\$  = Get label of interval: 1, intervalNumber")
-CODE (L"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
-CODE (L"intervalNumber = 2")
-CODE (L"text\\$  = Get label of interval: 1, intervalNumber")
-CODE (L"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
-CODE (L"intervalNumber = 3")
-CODE (L"text\\$  = Get label of interval: 1, intervalNumber")
-CODE (L"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
-CODE (L"intervalNumber = 4")
-CODE (L"text\\$  = Get label of interval: 1, intervalNumber")
-CODE (L"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
-CODE (L"intervalNumber = 5")
-CODE (L"text\\$  = Get label of interval: 1, intervalNumber")
-CODE (L"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
-NORMAL (L"A new trick that you see here is that as a numeric argument (##Interval number#, "
+CODE (U"writeInfoLine: \"The texts in the first five intervals:\"")
+CODE (U"intervalNumber = 1")
+CODE (U"text\\$  = Get label of interval: 1, intervalNumber")
+CODE (U"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
+CODE (U"intervalNumber = 2")
+CODE (U"text\\$  = Get label of interval: 1, intervalNumber")
+CODE (U"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
+CODE (U"intervalNumber = 3")
+CODE (U"text\\$  = Get label of interval: 1, intervalNumber")
+CODE (U"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
+CODE (U"intervalNumber = 4")
+CODE (U"text\\$  = Get label of interval: 1, intervalNumber")
+CODE (U"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
+CODE (U"intervalNumber = 5")
+CODE (U"text\\$  = Get label of interval: 1, intervalNumber")
+CODE (U"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
+NORMAL (U"A new trick that you see here is that as a numeric argument (##Interval number#, "
 	"the second argument to ##Get label of interval...#), you can use not only a number "
 	"(as in all previous examples), but also a variable ($intervalNumber). "
 	"The rest of the script should be known stuff by now.")
-NORMAL (L"The script above is long, but it can be made much shorter with the use of a %%for-loop%:")
-CODE (L"writeInfoLine: \"The texts in the first five intervals:\"")
-CODE (L"for intervalNumber from 1 to 5")
-CODE1 (L"text\\$  = Get label of interval: 1, intervalNumber")
-CODE1 (L"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
-CODE (L"endfor")
-NORMAL (L"The two lines that were repeated five times in the previous version now show up with indentation "
+NORMAL (U"The script above is long, but it can be made much shorter with the use of a %%for-loop%:")
+CODE (U"writeInfoLine: \"The texts in the first five intervals:\"")
+CODE (U"for intervalNumber from 1 to 5")
+CODE1 (U"text\\$  = Get label of interval: 1, intervalNumber")
+CODE1 (U"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
+CODE (U"endfor")
+NORMAL (U"The two lines that were repeated five times in the previous version now show up with indentation "
 	"between a %for line and its corresponding %endfor. Those two lines (the $$text\\$ $ and the $appendInfoLine line) "
 	"are executed five times: for $intervalNumber equal to 1, for $intervalNumber equal to 2, for $intervalNumber equal to 3, "
 	"for $intervalNumber equal to 4, and for $intervalNumber equal to 5, in that order.")
-NORMAL (L"In the above example, using a loop does not do much more than save eight lines, at the cost of adding two new lines. "
+NORMAL (U"In the above example, using a loop does not do much more than save eight lines, at the cost of adding two new lines. "
 	"But imagine the case in which you want to list %all the texts in the intervals: "
 	"the version without the loop is no longer possible. By contrast, the version %with the loop is still possible, "
 	"because we have the command ##Get number of intervals...#, which gives us the number of intervals in the specified tier "
 	"(here, tier 1). So you do:")
-CODE (L"numberOfIntervals = Get number of intervals: 1")
-CODE (L"writeInfoLine: \"The texts in all \", numberOfIntervals, \" intervals:\"")
-CODE (L"for intervalNumber from 1 to numberOfIntervals")
-CODE1 (L"text\\$  = Get label of interval: 1, intervalNumber")
-CODE1 (L"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
-CODE (L"endfor")
-NORMAL (L"This may yield something like")
-SCRIPT (6, 3, L""
+CODE (U"numberOfIntervals = Get number of intervals: 1")
+CODE (U"writeInfoLine: \"The texts in all \", numberOfIntervals, \" intervals:\"")
+CODE (U"for intervalNumber from 1 to numberOfIntervals")
+CODE1 (U"text\\$  = Get label of interval: 1, intervalNumber")
+CODE1 (U"appendInfoLine: \"Interval \", intervalNumber, \": \", text\\$ ")
+CODE (U"endfor")
+NORMAL (U"This may yield something like")
+SCRIPT (6, 3, U""
 	Manual_DRAW_WINDOW (3, "Praat Info", "File   Edit   Search   Convert   Font   Help")
 	"Courier\n"
 	"Text: 0, \"left\", 75, \"half\", \"\\s{The texts in all 7 intervals:}\"\n"
@@ -2010,295 +2001,295 @@ SCRIPT (6, 3, L""
 	"Text: 0, \"left\", 180, \"half\", \"\\s{Interval 7: goodbye}\"\n"
 	"Draw rectangle: 0, 560, 0, 260\n"
 )
-NORMAL (L"This is the first script in this tutorial that is useful in itself. On the basis of it "
+NORMAL (U"This is the first script in this tutorial that is useful in itself. On the basis of it "
 	"you can create all kinds of ways to list the texts in intervals. Here is how you would also list the durations "
 	"of those intervals:")
-CODE (L"numberOfIntervals = Get number of intervals: 1")
-CODE (L"writeInfoLine: \"The durations and texts in all \", numberOfIntervals, \" intervals:\"")
-CODE (L"for intervalNumber from 1 to numberOfIntervals")
-CODE1 (L"startTime = Get start point: 1, intervalNumber")
-CODE1 (L"endTime = Get end point: 1, intervalNumber")
-CODE1 (L"duration = endTime - startTime")
-CODE1 (L"text\\$  = Get label of interval: 1, intervalNumber")
-CODE1 (L"appendInfoLine: \"Interval \", intervalNumber, \" is \", duration, \" seconds long and contains the text: \", text\\$ ")
-CODE (L"endfor")
-MAN_END
-
-MAN_BEGIN (L"Scripting 3.7. Layout", L"ppgb", 20140111)
-INTRO (L"This chapter handles the way you use white space, comments, and continuation lines in a Praat script.")
-ENTRY (L"White space")
-NORMAL (L"Praat ignores all white space (spaces and tabs) that you put at the beginning of lines. The indentation "
+CODE (U"numberOfIntervals = Get number of intervals: 1")
+CODE (U"writeInfoLine: \"The durations and texts in all \", numberOfIntervals, \" intervals:\"")
+CODE (U"for intervalNumber from 1 to numberOfIntervals")
+CODE1 (U"startTime = Get start point: 1, intervalNumber")
+CODE1 (U"endTime = Get end point: 1, intervalNumber")
+CODE1 (U"duration = endTime - startTime")
+CODE1 (U"text\\$  = Get label of interval: 1, intervalNumber")
+CODE1 (U"appendInfoLine: \"Interval \", intervalNumber, \" is \", duration, \" seconds long and contains the text: \", text\\$ ")
+CODE (U"endfor")
+MAN_END
+
+MAN_BEGIN (U"Scripting 3.7. Layout", U"ppgb", 20140111)
+INTRO (U"This chapter handles the way you use white space, comments, and continuation lines in a Praat script.")
+ENTRY (U"White space")
+NORMAL (U"Praat ignores all white space (spaces and tabs) that you put at the beginning of lines. The indentation "
 	"that you saw on the @@Scripting 3.6. \"For\" loops|previous page@ was therefore used solely for readability. "
 	"You are advised to use indenting, though, with three or four spaces for each level, "
 	"as in the following example, which loops over all tiers and intervals of a TextGrid:")
-CODE (L"writeInfoLine: \"The texts in all tiers and intervals:\"")
-CODE (L"numberOfTiers = Get number of tiers")
-CODE (L"for tierNumber from 1 to numberOfTiers")
-CODE1 (L"numberOfIntervals = Get number of intervals: tierNumber")
-CODE1 (L"for intervalNumber from 1 to numberOfIntervals")
-CODE2 (L"text\\$  = Get label of interval: tierNumber, intervalNumber")
-CODE2 (L"appendInfoLine: \"Tier \", tierNumber, \", interval \", intervalNumber, \": \", text\\$ ")
-CODE1 (L"endfor")
-CODE (L"endfor")
-NORMAL (L"Praat also ignores lines that are empty or consist solely of white space, "
+CODE (U"writeInfoLine: \"The texts in all tiers and intervals:\"")
+CODE (U"numberOfTiers = Get number of tiers")
+CODE (U"for tierNumber from 1 to numberOfTiers")
+CODE1 (U"numberOfIntervals = Get number of intervals: tierNumber")
+CODE1 (U"for intervalNumber from 1 to numberOfIntervals")
+CODE2 (U"text\\$  = Get label of interval: tierNumber, intervalNumber")
+CODE2 (U"appendInfoLine: \"Tier \", tierNumber, \", interval \", intervalNumber, \": \", text\\$ ")
+CODE1 (U"endfor")
+CODE (U"endfor")
+NORMAL (U"Praat also ignores lines that are empty or consist solely of white space, "
 	"so you use those to structure your script visually.")
-ENTRY (L"Comments")
-NORMAL (L"Comments are lines that start with \"\\# \" or \";\". Praat ignores these lines when your script is running:")
-CODE (L"\\#  Create 1 second of a sine wave with a frequency of 100 Hertz,")
-CODE (L"\\#  sampled at 44100 Hz:")
-CODE (L"Create Sound from formula: \"sine\", 1, 0, 1, 44100, \"sin (2*pi*100*x)\"")
-NORMAL (L"Because of its visibility, you are advised to use \"\\# \" for comments that structure your script, "
+ENTRY (U"Comments")
+NORMAL (U"Comments are lines that start with \"\\# \" or \";\". Praat ignores these lines when your script is running:")
+CODE (U"\\#  Create 1 second of a sine wave with a frequency of 100 Hertz,")
+CODE (U"\\#  sampled at 44100 Hz:")
+CODE (U"Create Sound from formula: \"sine\", 1, 0, 1, 44100, \"sin (2*pi*100*x)\"")
+NORMAL (U"Because of its visibility, you are advised to use \"\\# \" for comments that structure your script, "
 	"and \";\" perhaps only for \"commenting out\" a statement, i.e. to temporarily put it before a line "
 	"that you don't want to execute.")
-ENTRY (L"Continuation lines")
-NORMAL (L"There is normally one line per statement, and one statement per line. But some statements are very long, "
+ENTRY (U"Continuation lines")
+NORMAL (U"There is normally one line per statement, and one statement per line. But some statements are very long, "
 	"such as this one on a previous page:")
-CODE1 (L"appendInfoLine: \"Interval \", intervalNumber, \" is \", duration, \" seconds long and contains the text: \", text\\$ ")
-NORMAL (L"By making the current window wider, you can see that I really put this whole statement on a single line. "
+CODE1 (U"appendInfoLine: \"Interval \", intervalNumber, \" is \", duration, \" seconds long and contains the text: \", text\\$ ")
+NORMAL (U"By making the current window wider, you can see that I really put this whole statement on a single line. "
 	"I could have distributed it over two lines in the following way, by using three dots (an %ellipsis):")
-CODE1 (L"appendInfoLine: \"Interval \", intervalNumber, \" is \", duration, \" seconds long")
-CODE1 (L"... and contains the text: \", text\\$ ")
-NORMAL (L"Here is another common type of example:")
-CODE (L"Create Sound from formula: \"windowedSine\", 1, 0, 1, 44100,")
-CODE (L"... \"0.5 * sin(2*pi*1000*x) * exp(-0.5*((x-0.5)/0.1)\\^ 2)\"")
-NORMAL (L"You will normally want to follow such an ellipsis with a space, unless you want to concatenate "
+CODE1 (U"appendInfoLine: \"Interval \", intervalNumber, \" is \", duration, \" seconds long")
+CODE1 (U"... and contains the text: \", text\\$ ")
+NORMAL (U"Here is another common type of example:")
+CODE (U"Create Sound from formula: \"windowedSine\", 1, 0, 1, 44100,")
+CODE (U"... \"0.5 * sin(2*pi*1000*x) * exp(-0.5*((x-0.5)/0.1)\\^ 2)\"")
+NORMAL (U"You will normally want to follow such an ellipsis with a space, unless you want to concatenate "
 	"the parts of a long word:")
-CODE (L"Select outer viewport: 0, 10, 0, 4")
-CODE (L"Text top: \"yes\", \"It's a long way to Llanfairpwllgwyngyll")
-CODE (L"...gogerychwyrndrobwllllantysiliogogogoch,")
-CODE (L"... unless you start from Tyddyn-y-felin.\"")
+CODE (U"Select outer viewport: 0, 10, 0, 4")
+CODE (U"Text top: \"yes\", \"It's a long way to Llanfairpwllgwyngyll")
+CODE (U"...gogerychwyrndrobwllllantysiliogogogoch,")
+CODE (U"... unless you start from Tyddyn-y-felin.\"")
 MAN_END
 
-MAN_BEGIN (L"Scripting 4. Object selection", L"ppgb", 20130501)
-INTRO (L"This chapter is about how to select objects from your script, "
+MAN_BEGIN (U"Scripting 4. Object selection", U"ppgb", 20130501)
+INTRO (U"This chapter is about how to select objects from your script, "
 	"and how to find out what objects are currently selected.")
-LIST_ITEM (L"@@Scripting 4.1. Selecting objects")
-LIST_ITEM (L"@@Scripting 4.2. Removing objects")
-LIST_ITEM (L"@@Scripting 4.3. Querying objects")
+LIST_ITEM (U"@@Scripting 4.1. Selecting objects")
+LIST_ITEM (U"@@Scripting 4.2. Removing objects")
+LIST_ITEM (U"@@Scripting 4.3. Querying objects")
 MAN_END
 
-MAN_BEGIN (L"Scripting 4.1. Selecting objects", L"ppgb", 20140223)
-NORMAL (L"To simulate the mouse-clicked and dragged selection in the list of objects, "
+MAN_BEGIN (U"Scripting 4.1. Selecting objects", U"ppgb", 20140223)
+NORMAL (U"To simulate the mouse-clicked and dragged selection in the list of objects, "
 	"you have the commands #selectObject, #plusObject and #minusObject.")
-NORMAL (L"Suppose you start Praat and use ##Create Sound as tone...# to create a Sound called %tone. "
+NORMAL (U"Suppose you start Praat and use ##Create Sound as tone...# to create a Sound called %tone. "
 	"In the object list it looks like \"1. Sound tone\". "
 	"Suppose you then do ##To Spectrum...# from the ##Analyse Spectrum# menu. "
 	"A second object, called \"2. Spectrum tone\" appears in the list and is selected. "
 	"To select and play the Sound, you can do either")
-CODE (L"#selectObject: 1")
-CODE (L"Play")
-NORMAL (L"or")
-CODE (L"#selectObject: \"Sound tone\"")
-CODE (L"Play")
-NORMAL (L"So you can select an object either by its unique ID (identifier: the unique number by which it appears in the list) "
+CODE (U"#selectObject: 1")
+CODE (U"Play")
+NORMAL (U"or")
+CODE (U"#selectObject: \"Sound tone\"")
+CODE (U"Play")
+NORMAL (U"So you can select an object either by its unique ID (identifier: the unique number by which it appears in the list) "
 	"or by name.")
-NORMAL (L"The function #selectObject works by first deselecting all objects, and then selecting the one you mention. "
+NORMAL (U"The function #selectObject works by first deselecting all objects, and then selecting the one you mention. "
 	"If you don't want to deselect the existing selection, you can use #plusObject or #minusObject. "
 	"When the Sound is selected, you can select the Spectrum as well by doing")
-CODE (L"#plusObject: 2")
-NORMAL (L"or")
-CODE (L"#plusObject: \"Spectrum tone\"")
-NORMAL (L"If you then want to deselect the Sound, and keep the Spectrum selected, you can do")
-CODE (L"#minusObject: 1")
-NORMAL (L"or")
-CODE (L"#minusObject: \"Sound tone\"")
-NORMAL (L"All these functions can take more than one argument. To select the Sound and the Spectrum together, you can do")
-CODE (L"#selectObject: 1, 2")
-NORMAL (L"or")
-CODE (L"#selectObject: \"Sound tone\", \"Spectrum tone\"")
-NORMAL (L"or even")
-CODE (L"#selectObject: 1, \"Spectrum tone\"")
-ENTRY (L"How to refer to objects created in your script")
-NORMAL (L"In a script, you typically don't know whether the IDs of the objects are 1 and 2, or much higher numbers. "
+CODE (U"#plusObject: 2")
+NORMAL (U"or")
+CODE (U"#plusObject: \"Spectrum tone\"")
+NORMAL (U"If you then want to deselect the Sound, and keep the Spectrum selected, you can do")
+CODE (U"#minusObject: 1")
+NORMAL (U"or")
+CODE (U"#minusObject: \"Sound tone\"")
+NORMAL (U"All these functions can take more than one argument. To select the Sound and the Spectrum together, you can do")
+CODE (U"#selectObject: 1, 2")
+NORMAL (U"or")
+CODE (U"#selectObject: \"Sound tone\", \"Spectrum tone\"")
+NORMAL (U"or even")
+CODE (U"#selectObject: 1, \"Spectrum tone\"")
+ENTRY (U"How to refer to objects created in your script")
+NORMAL (U"In a script, you typically don't know whether the IDs of the objects are 1 and 2, or much higher numbers. "
 	"Fortunately, commands that create a new object give you the ID of the object that is created, "
 	"so that you can refer to the object later on. For instance, suppose you want to generate a sine wave, play it, "
 	"draw its spectrum, and then throw away both the Sound and the Spectrum. Here is how you do it:")
-CODE (L"sound = Create Sound as pure tone: \"sine377\",")
-CODE (L"... 1, 0, 1, 44100, 377, 0.2, 0.01, 0.01   ; remember the ID of the Sound")
-CODE (L"Play   ; the Sound is selected, so it plays")
-CODE (L"To Spectrum: \"yes\"")
-CODE (L"Draw: 0, 5000, 20, 80, \"yes\"   ; the Spectrum is selected, so it is drawn")
-CODE (L"\\#  Remove the created Spectrum and Sound:")
-CODE (L"#plusObject: sound   ; the Spectrum was already selected")
-CODE (L"Remove")
-NORMAL (L"You could also select the objects by name:")
-CODE (L"Create Sound as pure tone: \"sine377\",")
-CODE (L"... 1, 0, 1, 44100, 377, 0.2, 0.01, 0.01   ; no need to remember the ID of the Sound")
-CODE (L"Play   ; the Sound is selected, so it plays")
-CODE (L"To Spectrum: \"yes\"")
-CODE (L"Draw: 0, 5000, 20, 80, \"yes\"   ; the Spectrum is selected, so it is drawn")
-CODE (L"\\#  Remove the created Spectrum and Sound:")
-CODE (L"#plusObject: \"Sound sine377\"   ; the Spectrum was already selected")
-CODE (L"Remove")
-NORMAL (L"This works even if there are multiple objects called \"Sound sine377\", "
+CODE (U"sound = Create Sound as pure tone: \"sine377\",")
+CODE (U"... 1, 0, 1, 44100, 377, 0.2, 0.01, 0.01   ; remember the ID of the Sound")
+CODE (U"Play   ; the Sound is selected, so it plays")
+CODE (U"To Spectrum: \"yes\"")
+CODE (U"Draw: 0, 5000, 20, 80, \"yes\"   ; the Spectrum is selected, so it is drawn")
+CODE (U"\\#  Remove the created Spectrum and Sound:")
+CODE (U"#plusObject: sound   ; the Spectrum was already selected")
+CODE (U"Remove")
+NORMAL (U"You could also select the objects by name:")
+CODE (U"Create Sound as pure tone: \"sine377\",")
+CODE (U"... 1, 0, 1, 44100, 377, 0.2, 0.01, 0.01   ; no need to remember the ID of the Sound")
+CODE (U"Play   ; the Sound is selected, so it plays")
+CODE (U"To Spectrum: \"yes\"")
+CODE (U"Draw: 0, 5000, 20, 80, \"yes\"   ; the Spectrum is selected, so it is drawn")
+CODE (U"\\#  Remove the created Spectrum and Sound:")
+CODE (U"#plusObject: \"Sound sine377\"   ; the Spectrum was already selected")
+CODE (U"Remove")
+NORMAL (U"This works even if there are multiple objects called \"Sound sine377\", "
 	"because if there are more objects with the same name, #selectObject and #plusObject select the most recently created one, "
 	"i.e., the one nearest to the bottom of the list of objects.")
 MAN_END
 
-MAN_BEGIN (L"Scripting 4.2. Removing objects", L"ppgb", 20140111)
-NORMAL (L"In @@Scripting 4.1. Selecting objects|\\SS4.1@ we saw that objects could be removed by selecting them first and then calling the #Remove command. "
+MAN_BEGIN (U"Scripting 4.2. Removing objects", U"ppgb", 20140111)
+NORMAL (U"In @@Scripting 4.1. Selecting objects|\\SS4.1@ we saw that objects could be removed by selecting them first and then calling the #Remove command. "
 	"A faster way is the #removeObject function, which can also remove unselected objects:")
-CODE (L"sound = Create Sound as pure tone: \"sine377\",")
-CODE (L"... 1, 0, 1, 44100, 377, 0.2, 0.01, 0.01   ; remember the ID of the Sound")
-CODE (L"Play   ; the Sound is selected, so it plays")
-CODE (L"spectrum = To Spectrum: \"yes\"   ; remember the ID of the Spectrum")
-CODE (L"Draw: 0, 5000, 20, 80, \"yes\"   ; the Spectrum is selected, so it is drawn")
-CODE (L"\\#  Remove the created Spectrum and Sound:")
-CODE (L"#removeObject: sound, spectrum   ; remove one selected and one unselected object")
-NORMAL (L"The #removeObject function keeps the objects selected that were selected before "
+CODE (U"sound = Create Sound as pure tone: \"sine377\",")
+CODE (U"... 1, 0, 1, 44100, 377, 0.2, 0.01, 0.01   ; remember the ID of the Sound")
+CODE (U"Play   ; the Sound is selected, so it plays")
+CODE (U"spectrum = To Spectrum: \"yes\"   ; remember the ID of the Spectrum")
+CODE (U"Draw: 0, 5000, 20, 80, \"yes\"   ; the Spectrum is selected, so it is drawn")
+CODE (U"\\#  Remove the created Spectrum and Sound:")
+CODE (U"#removeObject: sound, spectrum   ; remove one selected and one unselected object")
+NORMAL (U"The #removeObject function keeps the objects selected that were selected before "
 	"(except of course the ones it throws away). "
 	"This allows you to easily throw away objects as soon as you no longer need them:")
-CODE (L"sound = Create Sound as pure tone: \"sine377\",")
-CODE (L"... 1, 0, 1, 44100, 377, 0.2, 0.01, 0.01   ; remember the ID of the Sound")
-CODE (L"Play   ; the Sound is selected, so it plays")
-CODE (L"spectrum = To Spectrum: \"yes\"")
-CODE (L"#removeObject: sound   ; we no longer need the Sound, so we remove it")
-CODE (L"Draw: 0, 5000, 20, 80, \"yes\"   ; the Spectrum is still selected, so it is drawn")
-CODE (L"#removeObject: spectrum   ; remove the last object created by the script")
-ENTRY (L"Selecting and removing all objects from the list (don't)")
-NORMAL (L"A very strange command, which you should not normally use, is ##select all#:")
-CODE1 (L"##select all")
-CODE1 (L"Remove")
-NORMAL (L"This selects all objects in the list and then removes them. "
+CODE (U"sound = Create Sound as pure tone: \"sine377\",")
+CODE (U"... 1, 0, 1, 44100, 377, 0.2, 0.01, 0.01   ; remember the ID of the Sound")
+CODE (U"Play   ; the Sound is selected, so it plays")
+CODE (U"spectrum = To Spectrum: \"yes\"")
+CODE (U"#removeObject: sound   ; we no longer need the Sound, so we remove it")
+CODE (U"Draw: 0, 5000, 20, 80, \"yes\"   ; the Spectrum is still selected, so it is drawn")
+CODE (U"#removeObject: spectrum   ; remove the last object created by the script")
+ENTRY (U"Selecting and removing all objects from the list (don't)")
+NORMAL (U"A very strange command, which you should not normally use, is ##select all#:")
+CODE1 (U"##select all")
+CODE1 (U"Remove")
+NORMAL (U"This selects all objects in the list and then removes them. "
 	"Please try not to use this, because it will remove even the objects that your script did not create! "
 	"After all, you don't want the users of your script to lose the objects they created! "
 	"So please try to remove in your script only the objects that your script created, "
 	"even if the script is for your own use (because if it is a nice script, others will want to use it).")
 MAN_END
 
-MAN_BEGIN (L"Scripting 4.3. Querying objects", L"ppgb", 20140111)
-NORMAL (L"You can get the name of a selected object into a string variable. "
+MAN_BEGIN (U"Scripting 4.3. Querying objects", U"ppgb", 20140111)
+NORMAL (U"You can get the name of a selected object into a string variable. "
 	"For instance, the following reads the name of the second selected Sound "
 	"(as counted from the top of the list of objects) into the variable %name\\$ :")
-CODE (L"name\\$  = ##selected\\$ # (\"Sound\", 2)")
-NORMAL (L"If the Sound was called \"Sound hallo\", the variable %name\\$  will contain the string \"hallo\". "
+CODE (U"name\\$  = ##selected\\$ # (\"Sound\", 2)")
+NORMAL (U"If the Sound was called \"Sound hallo\", the variable %name\\$  will contain the string \"hallo\". "
 	"To get the name of the topmost selected Sound object, you can leave out the number:")
-CODE (L"name\\$  = ##selected\\$ # (\"Sound\")")
-NORMAL (L"To get the full name (type + name) of the third selected object, you do:")
-CODE (L"fullName\\$  = ##selected\\$ # (3)")
-NORMAL (L"To get the full name of the topmost selected object, you do:")
-CODE (L"fullName\\$  = ##selected\\$ # ()")
-NORMAL (L"To get the type and name out of the full name, you do:")
-CODE (L"type\\$  = extractWord\\$  (fullName\\$ , \"\")")
-CODE (L"name\\$  = extractLine\\$  (fullName\\$ , \" \")")
-NORMAL (L"Negative numbers count from the bottom. Thus, to get the name of the bottom-most selected Sound "
+CODE (U"name\\$  = ##selected\\$ # (\"Sound\")")
+NORMAL (U"To get the full name (type + name) of the third selected object, you do:")
+CODE (U"fullName\\$  = ##selected\\$ # (3)")
+NORMAL (U"To get the full name of the topmost selected object, you do:")
+CODE (U"fullName\\$  = ##selected\\$ # ()")
+NORMAL (U"To get the type and name out of the full name, you do:")
+CODE (U"type\\$  = extractWord\\$  (fullName\\$ , \"\")")
+CODE (U"name\\$  = extractLine\\$  (fullName\\$ , \" \")")
+NORMAL (U"Negative numbers count from the bottom. Thus, to get the name of the bottom-most selected Sound "
 	"object, you say")
-CODE (L"name\\$  = ##selected\\$ # (\"Sound\", -1)")
-NORMAL (L"You would use ##selected\\$ # for drawing the object name in a picture:")
-CODE (L"Draw: 0, 0, 0, 0, \"yes\"")
-CODE (L"name\\$  = ##selected\\$ # (\"Sound\")")
-CODE (L"Text top: \"no\", \"This is sound \" + name\\$ ")
-NORMAL (L"For identifying previously selected objects, this method is not very suitable, since "
+CODE (U"name\\$  = ##selected\\$ # (\"Sound\", -1)")
+NORMAL (U"You would use ##selected\\$ # for drawing the object name in a picture:")
+CODE (U"Draw: 0, 0, 0, 0, \"yes\"")
+CODE (U"name\\$  = ##selected\\$ # (\"Sound\")")
+CODE (U"Text top: \"no\", \"This is sound \" + name\\$ ")
+NORMAL (U"For identifying previously selected objects, this method is not very suitable, since "
 	"there may be multiple objects with the same name:")
-CODE (L"\\#  The following two lines are OK:")
-CODE (L"soundName\\$  = ##selected\\$ # (\"Sound\", -1)")
-CODE (L"pitchName\\$  = ##selected\\$ # (\"Pitch\")")
-CODE (L"\\#  But the following line is questionable, since it doesn't")
-CODE (L"\\#  necessarily select the previously selected Pitch again:")
-CODE (L"#selectObject: \"Pitch \" + pitchName\\$ ")
-NORMAL (L"Instead of this error-prone approach, you should get the object's unique ID. "
+CODE (U"\\#  The following two lines are OK:")
+CODE (U"soundName\\$  = ##selected\\$ # (\"Sound\", -1)")
+CODE (U"pitchName\\$  = ##selected\\$ # (\"Pitch\")")
+CODE (U"\\#  But the following line is questionable, since it doesn't")
+CODE (U"\\#  necessarily select the previously selected Pitch again:")
+CODE (U"#selectObject: \"Pitch \" + pitchName\\$ ")
+NORMAL (U"Instead of this error-prone approach, you should get the object's unique ID. "
 	"The correct version of our example becomes:")
-CODE (L"sound = #selected (\"Sound\", -1)")
-CODE (L"pitch = #selected (\"Pitch\")")
-CODE (L"\\#  Correct:")
-CODE (L"#selectObject: pitch")
-NORMAL (L"To get the number of selected Sound objects into a variable, use")
-CODE (L"numberOfSelectedSounds = #numberOfSelected (\"Sound\")")
-NORMAL (L"To get the number of selected objects into a variable, use")
-CODE (L"numberOfSelectedObjects = #numberOfSelected ()")
-ENTRY (L"Example: doing something to every selected Sound")
-CODE (L"n = #numberOfSelected (\"Sound\")")
-CODE (L"#for i to n")
-	CODE1 (L"sound [i] = #selected (\"Sound\", i)")
-CODE (L"#endfor")
-CODE (L"\\#  Median pitches of all selected sounds:")
-CODE (L"#for i to n")
-	CODE1 (L"#selectObject: sound [i]")
-	CODE1 (L"To Pitch: 0.0, 75, 600")
-	CODE1 (L"f0 = Get quantile: 0, 0, 0.50, \"Hertz\"")
-	CODE1 (L"appendInfoLine: f0")
-	CODE1 (L"Remove")
-CODE (L"#endfor")
-CODE (L"\\#  Restore selection:")
-CODE (L"#selectObject ( )   ; deselect all objects")
-CODE (L"#for i from 1 to n")
-	CODE1 (L"#plusObject: sound [i]")
-CODE (L"#endfor")
-MAN_END
-
-MAN_BEGIN (L"Scripting 5. Language elements reference", L"ppgb", 20130421)
-NORMAL (L"In a Praat script, you can use variables, expressions, and functions, of numeric as well as string type, "
+CODE (U"sound = #selected (\"Sound\", -1)")
+CODE (U"pitch = #selected (\"Pitch\")")
+CODE (U"\\#  Correct:")
+CODE (U"#selectObject: pitch")
+NORMAL (U"To get the number of selected Sound objects into a variable, use")
+CODE (U"numberOfSelectedSounds = #numberOfSelected (\"Sound\")")
+NORMAL (U"To get the number of selected objects into a variable, use")
+CODE (U"numberOfSelectedObjects = #numberOfSelected ()")
+ENTRY (U"Example: doing something to every selected Sound")
+CODE (U"n = #numberOfSelected (\"Sound\")")
+CODE (U"#for i to n")
+	CODE1 (U"sound [i] = #selected (\"Sound\", i)")
+CODE (U"#endfor")
+CODE (U"\\#  Median pitches of all selected sounds:")
+CODE (U"#for i to n")
+	CODE1 (U"#selectObject: sound [i]")
+	CODE1 (U"To Pitch: 0.0, 75, 600")
+	CODE1 (U"f0 = Get quantile: 0, 0, 0.50, \"Hertz\"")
+	CODE1 (U"appendInfoLine: f0")
+	CODE1 (U"Remove")
+CODE (U"#endfor")
+CODE (U"\\#  Restore selection:")
+CODE (U"#selectObject ( )   ; deselect all objects")
+CODE (U"#for i from 1 to n")
+	CODE1 (U"#plusObject: sound [i]")
+CODE (U"#endfor")
+MAN_END
+
+MAN_BEGIN (U"Scripting 5. Language elements reference", U"ppgb", 20130421)
+NORMAL (U"In a Praat script, you can use variables, expressions, and functions, of numeric as well as string type, "
 	"and most of the control structures known from other procedural computer languages. "
 	"The way the distinction between numbers and strings is made, may remind you of the programming language Basic.")
-LIST_ITEM (L"@@Scripting 5.1. Variables@ (numeric, string)")
-LIST_ITEM (L"@@Scripting 5.2. Expressions@ (numeric, string)")
-LIST_ITEM (L"@@Scripting 5.3. Jumps@ (if, then, elsif, else, endif)")
-LIST_ITEM (L"@@Scripting 5.4. Loops@ (for/endfor, while/endwhile, repeat/until)")
-LIST_ITEM (L"@@Scripting 5.5. Procedures@ (\\@ , procedure)")
-LIST_ITEM (L"@@Scripting 5.6. Arrays@")
-LIST_ITEM (L"@@Scripting 5.7. Including other scripts@")
-LIST_ITEM (L"@@Scripting 5.8. Quitting@ (exit)")
-MAN_END
-
-MAN_BEGIN (L"Scripting 5.1. Variables", L"ppgb", 20140111)
-INTRO (L"A %variable is a location in your computer's memory that has a name and where you can store something, "
+LIST_ITEM (U"@@Scripting 5.1. Variables@ (numeric, string)")
+LIST_ITEM (U"@@Scripting 5.2. Expressions@ (numeric, string)")
+LIST_ITEM (U"@@Scripting 5.3. Jumps@ (if, then, elsif, else, endif)")
+LIST_ITEM (U"@@Scripting 5.4. Loops@ (for/endfor, while/endwhile, repeat/until)")
+LIST_ITEM (U"@@Scripting 5.5. Procedures@ (\\@ , procedure)")
+LIST_ITEM (U"@@Scripting 5.6. Arrays@")
+LIST_ITEM (U"@@Scripting 5.7. Including other scripts@")
+LIST_ITEM (U"@@Scripting 5.8. Quitting@ (exit)")
+MAN_END
+
+MAN_BEGIN (U"Scripting 5.1. Variables", U"ppgb", 20140111)
+INTRO (U"A %variable is a location in your computer's memory that has a name and where you can store something, "
 	"as explained in @@Scripting 3.2. Numeric variables|\\SS3.2@ and @@Scripting 3.4. String variables|\\SS3.4 at . "
 	"In a Praat script, you can store numbers and texts, i.e. you can use %%numeric variables% and %%string variables%.")
-ENTRY (L"Numeric variables")
-NORMAL (L"Numeric variables can hold integer numbers between -1,000,000,000,000,000 and +1,000,000,000,000,000 "
+ENTRY (U"Numeric variables")
+NORMAL (U"Numeric variables can hold integer numbers between -1,000,000,000,000,000 and +1,000,000,000,000,000 "
 	"or real numbers between -10^^308^ and +10^^308^. The smallest numbers lie near -10^^-308^ and +10^^-308^.")
-NORMAL (L"You use numeric variables in your script like this:")
-CODE (L"#length = 10")
-CODE (L"Draw line: 0, #length, 1, 1")
-NORMAL (L"This draws a line in the Picture window from position (0, 10) to position (1, 1). "
+NORMAL (U"You use numeric variables in your script like this:")
+CODE (U"#length = 10")
+CODE (U"Draw line: 0, #length, 1, 1")
+NORMAL (U"This draws a line in the Picture window from position (0, 10) to position (1, 1). "
 	"In the first line, you assign the value 10 to the variable called %length, "
 	"and in the second line you use the value of %length as the second argument to the command \"Draw line...\".")
-NORMAL (L"Names of numeric variables must start with a lower-case letter, optionally followed by a sequence "
+NORMAL (U"Names of numeric variables must start with a lower-case letter, optionally followed by a sequence "
 	"of letters, digits, and underscores.")
-ENTRY (L"String variables")
-NORMAL (L"You use string variables, which contain text, as follows:")
-CODE (L"##title\\$ # = \"Dutch nasal place assimilation\"")
-CODE (L"Text top: \"yes\", ##title\\$ #")
-NORMAL (L"This writes the text \"Dutch nasal place assimilation\"")
-NORMAL (L"As in the programming language Basic, the names of string variables end in a dollar sign.")
-ENTRY (L"Making numeric variables visible")
-NORMAL (L"You can write the content of numeric variables directly to the info window:")
-CODE (L"x = 2.0")
-CODE (L"root = sqrt (x)")
-CODE (L"#writeInfoLine: \"The square root of \", x, \" is \", root, \".\"")
-NORMAL (L"This will write the following text to the Info window:")
-CODE (L"The square root of 2 is 1.4142135623730951.")
-NORMAL (L"You can fix the number of digits after the decimal point by use of the ##fixed\\$ # function:")
-CODE (L"x = 2.0")
-CODE (L"root = sqrt (x)")
-CODE (L"writeInfoLine: \"The square root of \", ##fixed\\$ # (x, 3), \" is approximately \", ##fixed\\$ # (root, 3), \".\"")
-NORMAL (L"This will write the following text to the Info window:")
-CODE (L"The square root of 2.000 is approximately 1.414.")
-NORMAL (L"By using 0 decimal digits, you round to whole values:")
-CODE (L"root = sqrt (2)")
-CODE (L"writeInfoLine: \"The square root of 2 is very approximately \", ##fixed\\$ # (root, #0), \".\"")
-NORMAL (L"This will write the following text to the Info window:")
-CODE (L"The square root of 2 is very approximately 1.")
-NORMAL (L"By using the ##percent\\$ # function, you give the result in a percent format:")
-CODE (L"jitter = 0.0156789")
-CODE (L"writeInfoLine: \"The jitter is \", ##percent\\$ # (jitter, 3), \".\"")
-NORMAL (L"This will write the following text to the Info window:")
-CODE (L"The jitter is 1.568\\% .")
-NORMAL (L"The number 0, however, will always be written as 0, and for small numbers the number of "
+ENTRY (U"String variables")
+NORMAL (U"You use string variables, which contain text, as follows:")
+CODE (U"##title\\$ # = \"Dutch nasal place assimilation\"")
+CODE (U"Text top: \"yes\", ##title\\$ #")
+NORMAL (U"This writes the text \"Dutch nasal place assimilation\"")
+NORMAL (U"As in the programming language Basic, the names of string variables end in a dollar sign.")
+ENTRY (U"Making numeric variables visible")
+NORMAL (U"You can write the content of numeric variables directly to the info window:")
+CODE (U"x = 2.0")
+CODE (U"root = sqrt (x)")
+CODE (U"#writeInfoLine: \"The square root of \", x, \" is \", root, \".\"")
+NORMAL (U"This will write the following text to the Info window:")
+CODE (U"The square root of 2 is 1.4142135623730951.")
+NORMAL (U"You can fix the number of digits after the decimal point by use of the ##fixed\\$ # function:")
+CODE (U"x = 2.0")
+CODE (U"root = sqrt (x)")
+CODE (U"writeInfoLine: \"The square root of \", ##fixed\\$ # (x, 3), \" is approximately \", ##fixed\\$ # (root, 3), \".\"")
+NORMAL (U"This will write the following text to the Info window:")
+CODE (U"The square root of 2.000 is approximately 1.414.")
+NORMAL (U"By using 0 decimal digits, you round to whole values:")
+CODE (U"root = sqrt (2)")
+CODE (U"writeInfoLine: \"The square root of 2 is very approximately \", ##fixed\\$ # (root, #0), \".\"")
+NORMAL (U"This will write the following text to the Info window:")
+CODE (U"The square root of 2 is very approximately 1.")
+NORMAL (U"By using the ##percent\\$ # function, you give the result in a percent format:")
+CODE (U"jitter = 0.0156789")
+CODE (U"writeInfoLine: \"The jitter is \", ##percent\\$ # (jitter, 3), \".\"")
+NORMAL (U"This will write the following text to the Info window:")
+CODE (U"The jitter is 1.568\\% .")
+NORMAL (U"The number 0, however, will always be written as 0, and for small numbers the number of "
 	"significant digits will never be less than 1:")
-CODE (L"jitter = 0.000000156789")
-CODE (L"writeInfoLine: \"The jitter is \", percent\\$  (jitter, 3), \".\"")
-NORMAL (L"This will write the following text to the Info window:")
-CODE (L"The jitter is 0.00002\\% .")
-ENTRY (L"Predefined variables")
-NORMAL (L"All of the variables you saw earlier in this tutorial were defined at the first moment a value was assigned to them. "
+CODE (U"jitter = 0.000000156789")
+CODE (U"writeInfoLine: \"The jitter is \", percent\\$  (jitter, 3), \".\"")
+NORMAL (U"This will write the following text to the Info window:")
+CODE (U"The jitter is 0.00002\\% .")
+ENTRY (U"Predefined variables")
+NORMAL (U"All of the variables you saw earlier in this tutorial were defined at the first moment a value was assigned to them. "
 	"Some variables, however, are already defined implicitly at the start of your script.")
 #define xstr(s) str(s)
 #define str(s) #s
-NORMAL (L"Some predefined ##numeric variables# are $macintosh, $windows, and $unix, which are 1 if the script "
+NORMAL (U"Some predefined ##numeric variables# are $macintosh, $windows, and $unix, which are 1 if the script "
 	"is running on a Macintosh, Windows, or Unix platform (respectively), and which are otherwise zero. "
 	"Another one is $praatVersion, which is e.g. " xstr(PRAAT_VERSION_NUM) " for the current version of Praat.")
-NORMAL (L"Some ##predefined string variables# are $$newline\\$ $,  $$tab\\$ $, and $$shellDirectory\\$ $. "
+NORMAL (U"Some ##predefined string variables# are $$newline\\$ $,  $$tab\\$ $, and $$shellDirectory\\$ $. "
 	"The last one specifies the directory that was the default directory when Praat started up; "
 	"you can use it in scripts that run from the Unix or Windows command line. "
 	"Likewise, there exist the predefined string variables $$homeDirectory\\$ $, "
@@ -2307,9 +2298,9 @@ NORMAL (L"Some ##predefined string variables# are $$newline\\$ $,  $$tab\\$ $, a
 	"if you want to know what they are on your computer, try to write them into a script window. "
 	"The variable $$defaultDirectory\\$ $ is available for formulas in scripts; it is the directory that contains the script file. "
 	"Finally, we have $$praatVersion\\$ $, which is \"" xstr(PRAAT_VERSION_STR) "\" for the current version of Praat.")
-ENTRY (L"Functions that handle variables")
-NORMAL (L"To check whether a variable exists, you can use the function")
-CODE (L"%variableExists (%%variableName\\$ %)")
+ENTRY (U"Functions that handle variables")
+NORMAL (U"To check whether a variable exists, you can use the function")
+CODE (U"%variableExists (%%variableName\\$ %)")
 MAN_END
 /*
 form Convert from WAV to AIFF
@@ -2324,200 +2315,200 @@ if left$ (fileName$) <> "/"
 endif
 */
 
-MAN_BEGIN (L"Scripting 5.2. Expressions", L"ppgb", 20140111)
-INTRO (L"In a Praat script, you can use numeric expressions as well as string expressions.")
-ENTRY (L"Numeric expressions")
-NORMAL (L"You can use a large variety of @@Formulas@ in your script:")
-CODE (L"length = 10")
-CODE (L"height = length/2")
-CODE (L"area = length * height")
-CODE (L"writeInfoLine: \"The area is \", area, \".\"")
-NORMAL (L"You can use numeric variables and formulas in numeric arguments to commands:")
-CODE (L"Draw line: 0, 0, length / 2, 2 * height")
-NORMAL (L"You can use numeric expressions in assignments (as above), or after "
+MAN_BEGIN (U"Scripting 5.2. Expressions", U"ppgb", 20140111)
+INTRO (U"In a Praat script, you can use numeric expressions as well as string expressions.")
+ENTRY (U"Numeric expressions")
+NORMAL (U"You can use a large variety of @@Formulas@ in your script:")
+CODE (U"length = 10")
+CODE (U"height = length/2")
+CODE (U"area = length * height")
+CODE (U"writeInfoLine: \"The area is \", area, \".\"")
+NORMAL (U"You can use numeric variables and formulas in numeric arguments to commands:")
+CODE (U"Draw line: 0, 0, length / 2, 2 * height")
+NORMAL (U"You can use numeric expressions in assignments (as above), or after "
 	"#if, #elsif, #while, #until, and twice after #for.")
-ENTRY (L"String expressions")
-NORMAL (L"You can use a large variety of @@Formulas@ in your script:")
-CODE (L"addressee\\$  = \"Silke\"")
-CODE (L"greeting\\$  = \"Hi \" + addressee\\$  + \"!\"")
-CODE (L"writeInfoLine: \"The greeting is: \", greeting\\$ ")
-NORMAL (L"You can use string variables and formulas in numeric arguments to commands:")
-CODE (L"Draw line: 0, length (greeting\\$ ), 0, 100")
-CODE (L"Draw line: 0, if answer\\$  = \"yes\" then 20 else 30 fi, 0, 100")
-NORMAL (L"You can use numeric and string variables and formulas in string arguments to commands:")
-CODE (L"Text top: \"yes\", \"Hi \" + addressee\\$  + \"!\"")
-CODE (L"Text top: \"yes\", left\\$  (fileName\\$ , index (fileName\\$ , \".\") - 1)")
-NORMAL (L"The two examples from the end of @@Scripting 3.5. String queries|\\SS3.5@ could be abbreviated as the one-liners")
-CODE (L"writeInfoLine: do\\$  (\"Get power...\", 0.0, 0.0)")
-NORMAL (L"and")
-CODE (L"writeInfoLine: do (\"Get power...\", 0.0, 0.0)")
-ENTRY (L"Assignments from query commands")
-NORMAL (L"On how to get information from commands that normally write to the Info window, "
+ENTRY (U"String expressions")
+NORMAL (U"You can use a large variety of @@Formulas@ in your script:")
+CODE (U"addressee\\$  = \"Silke\"")
+CODE (U"greeting\\$  = \"Hi \" + addressee\\$  + \"!\"")
+CODE (U"writeInfoLine: \"The greeting is: \", greeting\\$ ")
+NORMAL (U"You can use string variables and formulas in numeric arguments to commands:")
+CODE (U"Draw line: 0, length (greeting\\$ ), 0, 100")
+CODE (U"Draw line: 0, if answer\\$  = \"yes\" then 20 else 30 fi, 0, 100")
+NORMAL (U"You can use numeric and string variables and formulas in string arguments to commands:")
+CODE (U"Text top: \"yes\", \"Hi \" + addressee\\$  + \"!\"")
+CODE (U"Text top: \"yes\", left\\$  (fileName\\$ , index (fileName\\$ , \".\") - 1)")
+NORMAL (U"The two examples from the end of @@Scripting 3.5. String queries|\\SS3.5@ could be abbreviated as the one-liners")
+CODE (U"writeInfoLine: do\\$  (\"Get power...\", 0.0, 0.0)")
+NORMAL (U"and")
+CODE (U"writeInfoLine: do (\"Get power...\", 0.0, 0.0)")
+ENTRY (U"Assignments from query commands")
+NORMAL (U"On how to get information from commands that normally write to the Info window, "
 	"see @@Scripting 6.3. Query commands at .")
 MAN_END
 
-MAN_BEGIN (L"Scripting 5.3. Jumps", L"ppgb", 19991112)
-NORMAL (L"You can use conditional jumps in your script:")
-TAG (L"#if %expression")
-TAG (L"#elsif %expression")
-DEFINITION (L"if the expression evaluates to zero or %false, the execution of the script jumps to the next "
+MAN_BEGIN (U"Scripting 5.3. Jumps", U"ppgb", 19991112)
+NORMAL (U"You can use conditional jumps in your script:")
+TAG (U"#if %expression")
+TAG (U"#elsif %expression")
+DEFINITION (U"if the expression evaluates to zero or %false, the execution of the script jumps to the next "
 	"#elsif or after the next #else or #endif at the same depth.")
-NORMAL (L"The following script computes the preferred length of a bed for a person 'age' years of age:")
-CODE (L"#if age <= 3")
-CODE (L"   length = 1.20")
-CODE (L"#elsif age <= 8")
-CODE (L"   length = 1.60")
-CODE (L"#else")
-CODE (L"   length = 2.00")
-CODE (L"#endif")
-NORMAL (L"A variant spelling for #elsif is #elif.")
-MAN_END
-
-MAN_BEGIN (L"Scripting 5.4. Loops", L"ppgb", 20140111)
-ENTRY (L"\"For\" loops")
-TAG (L"#for %variable #from %expression__1_ #to %expression__2_")
-TAG (L"#for %variable #to %expression")
-DEFINITION (L"the statements between the #for line and the matching #endfor will be executed "
+NORMAL (U"The following script computes the preferred length of a bed for a person 'age' years of age:")
+CODE (U"#if age <= 3")
+CODE (U"   length = 1.20")
+CODE (U"#elsif age <= 8")
+CODE (U"   length = 1.60")
+CODE (U"#else")
+CODE (U"   length = 2.00")
+CODE (U"#endif")
+NORMAL (U"A variant spelling for #elsif is #elif.")
+MAN_END
+
+MAN_BEGIN (U"Scripting 5.4. Loops", U"ppgb", 20140111)
+ENTRY (U"\"For\" loops")
+TAG (U"#for %variable #from %expression__1_ #to %expression__2_")
+TAG (U"#for %variable #to %expression")
+DEFINITION (U"the statements between the #for line and the matching #endfor will be executed "
 	"while a variable takes on values between two expressions, with an increment (raise) of 1 "
 	"on each turn of the loop. If there is no #from, the loop variable starts at 1.")
-NORMAL (L"The following script plays nine sine waves, with frequencies of 200, 300, ..., 1000 Hz:")
-CODE (L"#for i #from 2 #to 10")
-CODE1 (L"Create Sound as pure tone: \"tone\", 1, 0, 0.3, 44100, i * 100, 0.2, 0.01, 0.01")
-CODE1 (L"Play")
-CODE1 (L"Remove")
-CODE (L"#endfor")
-NORMAL (L"The stop value of the #for loop is evaluated on each turn. If the second expression "
+NORMAL (U"The following script plays nine sine waves, with frequencies of 200, 300, ..., 1000 Hz:")
+CODE (U"#for i #from 2 #to 10")
+CODE1 (U"Create Sound as pure tone: \"tone\", 1, 0, 0.3, 44100, i * 100, 0.2, 0.01, 0.01")
+CODE1 (U"Play")
+CODE1 (U"Remove")
+CODE (U"#endfor")
+NORMAL (U"The stop value of the #for loop is evaluated on each turn. If the second expression "
 	"is already less than the first expression to begin with, the statements between #for and #endfor "
 	"are not executed even once.")
-ENTRY (L"\"Repeat\" loops")
-TAG (L"#until %expression")
-DEFINITION (L"the statements between the matching preceding #repeat and the #until line "
+ENTRY (U"\"Repeat\" loops")
+TAG (U"#until %expression")
+DEFINITION (U"the statements between the matching preceding #repeat and the #until line "
 	"will be executed again if the expression evaluates to zero or %false.")
-NORMAL (L"The following script measures the number of trials it takes me to throw 12 with two dice:")
-CODE (L"throws = 0")
-CODE (L"#repeat")
-	CODE1 (L"eyes = randomInteger (1, 6) + randomInteger (1, 6)")
-	CODE1 (L"throws = throws + 1")
-CODE (L"#until eyes = 12")
-CODE (L"#writeInfoLine: \"It took me \", throws, \" trials to throw 12 with two dice.\"")
-NORMAL (L"The statements in the #repeat/#until loop are executed at least once.")
-ENTRY (L"\"While\" loops")
-TAG (L"#while %expression")
-DEFINITION (L"if the expression evaluates to zero or %false, the execution of the script jumps "
+NORMAL (U"The following script measures the number of trials it takes me to throw 12 with two dice:")
+CODE (U"throws = 0")
+CODE (U"#repeat")
+	CODE1 (U"eyes = randomInteger (1, 6) + randomInteger (1, 6)")
+	CODE1 (U"throws = throws + 1")
+CODE (U"#until eyes = 12")
+CODE (U"#writeInfoLine: \"It took me \", throws, \" trials to throw 12 with two dice.\"")
+NORMAL (U"The statements in the #repeat/#until loop are executed at least once.")
+ENTRY (U"\"While\" loops")
+TAG (U"#while %expression")
+DEFINITION (U"if the expression evaluates to zero or %false, the execution of the script jumps "
 	"after the matching #endwhile.")
-TAG (L"#endwhile")
-DEFINITION (L"execution jumps back to the matching preceding #while line, which is then evaluated again.")
-NORMAL (L"The following script forces the number %x into the range [0; 2\\pi):")
-CODE (L"#while x < 0")
-	CODE1 (L"x = x + 2 * pi")
-CODE (L"#endwhile")
-CODE (L"#while x >= 2 * pi")
-	CODE1 (L"x = x - 2 * pi")
-CODE (L"#endwhile")
-NORMAL (L"If the expression evaluates to zero or %false to begin with, the statements between #while and #endwhile "
+TAG (U"#endwhile")
+DEFINITION (U"execution jumps back to the matching preceding #while line, which is then evaluated again.")
+NORMAL (U"The following script forces the number %x into the range [0; 2\\pi):")
+CODE (U"#while x < 0")
+	CODE1 (U"x = x + 2 * pi")
+CODE (U"#endwhile")
+CODE (U"#while x >= 2 * pi")
+	CODE1 (U"x = x - 2 * pi")
+CODE (U"#endwhile")
+NORMAL (U"If the expression evaluates to zero or %false to begin with, the statements between #while and #endwhile "
 	"are not executed even once.")
 MAN_END
 
-MAN_BEGIN (L"Scripting 5.5. Procedures", L"ppgb", 20140126)
-NORMAL (L"Sometimes in a Praat script, you will want to perform the same thing more than once. "
+MAN_BEGIN (U"Scripting 5.5. Procedures", U"ppgb", 20140126)
+NORMAL (U"Sometimes in a Praat script, you will want to perform the same thing more than once. "
 	"In @@Scripting 5.4. Loops|\\SS5.4@ we saw how %loops can help there. "
 	"In this section we will see how %procedures (also called %subroutines) can help us.")
-NORMAL (L"Imagine that you want to play a musical note with a frequency of 440 Hz (an \"A\") "
+NORMAL (U"Imagine that you want to play a musical note with a frequency of 440 Hz (an \"A\") "
 	"followed by a note that is one ocatve higher, i.e. has a frequency of 880 Hz (an \"a\"). "
 	"You could achieve this with the following script:")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 440, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 880, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-NORMAL (L"This script creates a sound with a sine wave with an amplitude of 0.4 and a frequency of 440 Hz, "
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 440, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 880, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+NORMAL (U"This script creates a sound with a sine wave with an amplitude of 0.4 and a frequency of 440 Hz, "
 	"then plays this sound, then changes the sound into a sine wave with a frequency of 880 Hz, "
 	"then plays this changed sound, and then removes the Sound object from the object list.")
-NORMAL (L"This script is perfect if all you want to do is to play those two notes and nothing more. "
+NORMAL (U"This script is perfect if all you want to do is to play those two notes and nothing more. "
 	"But now imagine that you want to play such an octave jump not only for a note of 440 Hz, "
 	"but also for a note of 400 Hz and for a note of 500 Hz. You could use the following script:")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 440, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 880, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 400, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 800, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 500, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 1000, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-NORMAL (L"This script works but is no longer perfect. It contains many similar lines, and is difficult to read.")
-NORMAL (L"Here is where %procedures come in handy. With procedures, you can re-use similar pieces of code. "
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 440, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 880, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 400, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 800, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 500, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, 1000, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+NORMAL (U"This script works but is no longer perfect. It contains many similar lines, and is difficult to read.")
+NORMAL (U"Here is where %procedures come in handy. With procedures, you can re-use similar pieces of code. "
 	"To make the three parts of the above script more similar, I'll rewrite it using two variables "
 	"(%frequency and %octaveHigher):")
-CODE (L"frequency = 440")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"octaveHigher = 2 * frequency")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"frequency = 400")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"octaveHigher = 2 * frequency")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"frequency = 500")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-CODE (L"octaveHigher = 2 * frequency")
-CODE (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-NORMAL (L"You can now see that seven lines of the script appear identically three times. "
+CODE (U"frequency = 440")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"octaveHigher = 2 * frequency")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"frequency = 400")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"octaveHigher = 2 * frequency")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"frequency = 500")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"octaveHigher = 2 * frequency")
+CODE (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+NORMAL (U"You can now see that seven lines of the script appear identically three times. "
 	"I'll put those seven lines into a %procedure that I name \"playOctave\":")
-CODE (L"#procedure playOctave")
-	CODE1 (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-	CODE1 (L"octaveHigher = 2 * frequency")
-	CODE1 (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-CODE (L"#endproc")
-NORMAL (L"As you see, a %%procedure definition% in Praat consists of three parts:")
-LIST_ITEM (L"1. a line with the word #procedure, followed by the name of the procedure, followed by a pair of parentheses;")
-LIST_ITEM (L"2. the %body of the procedure (here: seven lines);")
-LIST_ITEM (L"3. a line with the word #endproc.")
-NORMAL (L"You can put a procedure definition anywhere in your script; "
+CODE (U"#procedure playOctave")
+	CODE1 (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+	CODE1 (U"octaveHigher = 2 * frequency")
+	CODE1 (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+CODE (U"#endproc")
+NORMAL (U"As you see, a %%procedure definition% in Praat consists of three parts:")
+LIST_ITEM (U"1. a line with the word #procedure, followed by the name of the procedure, followed by a pair of parentheses;")
+LIST_ITEM (U"2. the %body of the procedure (here: seven lines);")
+LIST_ITEM (U"3. a line with the word #endproc.")
+NORMAL (U"You can put a procedure definition anywhere in your script; "
 	"the beginning or end of the script are common places.")
-NORMAL (L"The bodies of procedures are executed only if you %call the procedure explicitly, "
+NORMAL (U"The bodies of procedures are executed only if you %call the procedure explicitly, "
 	"which you can do anywhere in the rest of your script:")
-CODE (L"frequency = 440")
-CODE (L"\\@ playOctave")
-CODE (L"frequency = 400")
-CODE (L"\\@ playOctave")
-CODE (L"frequency = 500")
-CODE (L"\\@ playOctave")
-CODE (L"#procedure playOctave")
-	CODE1 (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-	CODE1 (L"octaveHigher = 2 * frequency")
-	CODE1 (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-CODE (L"#endproc")
-NORMAL (L"This script works as follows. First, the number 440 is assigned to the variable %frequency in line 1. "
+CODE (U"frequency = 440")
+CODE (U"\\@ playOctave")
+CODE (U"frequency = 400")
+CODE (U"\\@ playOctave")
+CODE (U"frequency = 500")
+CODE (U"\\@ playOctave")
+CODE (U"#procedure playOctave")
+	CODE1 (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+	CODE1 (U"octaveHigher = 2 * frequency")
+	CODE1 (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+CODE (U"#endproc")
+NORMAL (U"This script works as follows. First, the number 440 is assigned to the variable %frequency in line 1. "
 	"Then, execution of the script arrives at the ##\\@ # (\"call\") statement of line 2. "
 	"Praat then knows that it has to jump to the procedure called %playOctave, "
 	"which is found on line 7. The execution of the script then proceeds with the first line of the procedure body, "
@@ -2530,707 +2521,828 @@ NORMAL (L"This script works as follows. First, the number 440 is assigned to the
 	"the third #endproc jumps back to the line after the third #\\@ , i.e. to line 7. "
 	"Here the execution of the script will stop, because there are no more executable commands "
 	"(the procedure definition at the end is not executed again).")
-ENTRY (L"Arguments")
-NORMAL (L"The above example contains something awkward. The procedure %playOctave requires that the variable %frequency "
+ENTRY (U"Arguments")
+NORMAL (U"The above example contains something awkward. The procedure %playOctave requires that the variable %frequency "
 	"is set to an appropriate value, so before calling %playOctave you always have to insert a line like")
-CODE (L"frequency = 440")
-NORMAL (L"This can be improved upon. In the following version of the script, the procedure %playOctave requires an explicit %argument:")
-CODE (L"\\@ playOctave: 440")
-CODE (L"\\@ playOctave: 400")
-CODE (L"\\@ playOctave: 500")
-CODE (L"#procedure playOctave: frequency")
-	CODE1 (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-	CODE1 (L"octaveHigher = 2 * frequency")
-	CODE1 (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-CODE (L"#endproc")
-NORMAL (L"This works as follows. The first line of the procedure now not only contains the name (%playOctave), "
+CODE (U"frequency = 440")
+NORMAL (U"This can be improved upon. In the following version of the script, the procedure %playOctave requires an explicit %argument:")
+CODE (U"\\@ playOctave: 440")
+CODE (U"\\@ playOctave: 400")
+CODE (U"\\@ playOctave: 500")
+CODE (U"#procedure playOctave: frequency")
+	CODE1 (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+	CODE1 (U"octaveHigher = 2 * frequency")
+	CODE1 (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+CODE (U"#endproc")
+NORMAL (U"This works as follows. The first line of the procedure now not only contains the name (%playOctave), "
 	"but also a list of variables (here only one: %frequency). In the first line of the script, "
 	"the procedure %playOctave is called with the %%argument% 440. "
 	"Execution then jumps to the procedure, where the argument 440 is assigned to the variable %frequency, "
 	"which is then used in the body of the procedure.")
-ENTRY (L"Encapsulation and local variables")
-NORMAL (L"Although the size of the script has now been reduced to 12 lines, which cannot be further improved upon, "
+ENTRY (U"Encapsulation and local variables")
+NORMAL (U"Although the size of the script has now been reduced to 12 lines, which cannot be further improved upon, "
 	"there is still something wrong with it. Imagine the following script:")
-CODE (L"frequency = 300")
-CODE (L"\\@ playOctave: 440")
-CODE (L"\\@ playOctave: 400")
-CODE (L"\\@ playOctave: 500")
-CODE (L"#writeInfoLine: frequency")
-CODE (L"#procedure playOctave: frequency")
-	CODE1 (L"Create Sound from formula: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-	CODE1 (L"octaveHigher = 2 * frequency")
-	CODE1 (L"Create Sound from formula: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-CODE (L"#endproc")
-NORMAL (L"You might have thought that this script will write \"300\" to the Info window, "
+CODE (U"frequency = 300")
+CODE (U"\\@ playOctave: 440")
+CODE (U"\\@ playOctave: 400")
+CODE (U"\\@ playOctave: 500")
+CODE (U"#writeInfoLine: frequency")
+CODE (U"#procedure playOctave: frequency")
+	CODE1 (U"Create Sound from formula: \"note\", 1, 0, 0.3, 44100, frequency, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+	CODE1 (U"octaveHigher = 2 * frequency")
+	CODE1 (U"Create Sound from formula: \"note\", 1, 0, 0.3, 44100, octaveHigher, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+CODE (U"#endproc")
+NORMAL (U"You might have thought that this script will write \"300\" to the Info window, "
 	"because that is what you expect if you look at the first five lines. "
 	"However, the procedure will assign the values 440, 400, and 500 to the variable %frequency, "
 	"so that the script will actually write \"500\" to the Info window, because 500 "
 	"is the last (fourth!) value that was assigned to the variable %frequency.")
-NORMAL (L"What you would want is that variables that are used inside procedures, such as %frequency and %octaveHigher here, "
+NORMAL (U"What you would want is that variables that are used inside procedures, such as %frequency and %octaveHigher here, "
 	"could somehow be made not to \"clash\" with variable names used outside the procedure. "
 	"A trick that works would be to include the procedure name into the names of these variables:")
-CODE (L"frequency = 300")
-CODE (L"\\@ playOctave: 440")
-CODE (L"\\@ playOctave: 400")
-CODE (L"\\@ playOctave: 500")
-CODE (L"#writeInfoLine: frequency")
-CODE (L"#procedure playOctave: playOctave.frequency")
-	CODE1 (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, playOctave.frequency, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-	CODE1 (L"playOctave.octaveHigher = 2 * playOctave.frequency")
-	CODE1 (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, playOctave.octaveHigher, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-CODE (L"#endproc")
-NORMAL (L"This works. The six tones will be played, and \"300\" will be written to the Info window. "
+CODE (U"frequency = 300")
+CODE (U"\\@ playOctave: 440")
+CODE (U"\\@ playOctave: 400")
+CODE (U"\\@ playOctave: 500")
+CODE (U"#writeInfoLine: frequency")
+CODE (U"#procedure playOctave: playOctave.frequency")
+	CODE1 (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, playOctave.frequency, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+	CODE1 (U"playOctave.octaveHigher = 2 * playOctave.frequency")
+	CODE1 (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, playOctave.octaveHigher, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+CODE (U"#endproc")
+NORMAL (U"This works. The six tones will be played, and \"300\" will be written to the Info window. "
 	"But the formulation is a bit wordy, isn't it?")
-NORMAL (L"Fortunately, Praat allows an abbreviated version of these long names: "
+NORMAL (U"Fortunately, Praat allows an abbreviated version of these long names: "
 	"just leave \"playOctave\" off from the names of the variables, but keep the period (.):")
-CODE (L"frequency = 300")
-CODE (L"\\@ playOctave: 440")
-CODE (L"\\@ playOctave: 400")
-CODE (L"\\@ playOctave: 500")
-CODE (L"#writeInfoLine: frequency")
-CODE (L"#procedure playOctave: .frequency")
-	CODE1 (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, .frequency, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-	CODE1 (L".octaveHigher = 2 * .frequency")
-	CODE1 (L"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, .octaveHigher, 0.2, 0.01, 0.01")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-CODE (L"#endproc")
-NORMAL (L"This is the final version of the script. It works because Praat knows that "
+CODE (U"frequency = 300")
+CODE (U"\\@ playOctave: 440")
+CODE (U"\\@ playOctave: 400")
+CODE (U"\\@ playOctave: 500")
+CODE (U"#writeInfoLine: frequency")
+CODE (U"#procedure playOctave: .frequency")
+	CODE1 (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, .frequency, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+	CODE1 (U".octaveHigher = 2 * .frequency")
+	CODE1 (U"Create Sound as pure tone: \"note\", 1, 0, 0.3, 44100, .octaveHigher, 0.2, 0.01, 0.01")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+CODE (U"#endproc")
+NORMAL (U"This is the final version of the script. It works because Praat knows that "
 	"you are using the variable names %%.frequency% and %%.octaveHigher% in the context of the procedure %playOctave, "
 	"so that Praat knows that by these variable names you actually mean to refer to %%playOctave.frequency% and %%playOctave.octaveHigher%.")
-NORMAL (L"It is advisable that you use such \"local\" variable names for all %parameters of a procedure, "
+NORMAL (U"It is advisable that you use such \"local\" variable names for all %parameters of a procedure, "
 	"i.e. for the variables listed after the #procedure word (e.g. %%.frequency%), "
 	"as well as for all variables that you create in the procedure body (e.g. %%.octaveHigher%). "
 	"In this way, you make sure that you don't inadvertently use a variable name that is also used outside the procedure "
 	"and thereby perhaps inadvertently change the value of a variable that you expect to be constant across a procedure call.")
-ENTRY (L"A list of numeric and string arguments")
-NORMAL (L"You can use multiple arguments, separated by commas, and string arguments (with a dollar sign in the variable name):")
-CODE (L"\\@ listSpeaker: \"Bart\", 38")
-CODE (L"\\@ listSpeaker: \"Katja\", 24")
-CODE (L"#procedure listSpeaker: .name\\$ , .age")
-	CODE1 (L"#appendInfoLine: \"Speaker \", .name\\$ , \" is \", .age, \" years old.\"")
-CODE (L"#endproc")
-NORMAL (L"or")
-CODE (L"\\@ conjugateVerb: \"be\", \"I am\", \"you are\", \"she is\"")
-CODE (L"#procedure conjugateVerb: .verb\\$ , .first\\$ , .second\\$ , .third\\$ ")
-	CODE1 (L"#writeInfoLine: \"Conjugation of 'to \", .verb\\$ , \"':\"")
-	CODE1 (L"#appendInfoLine: \"1sg \", .first\\$ ")
-	CODE1 (L"#appendInfoLine: \"2sg \", .second\\$ ")
-	CODE1 (L"#appendInfoLine: \"3sg \", .third\\$ ")
-CODE (L"#endproc")
-NORMAL (L"For the arguments you can use expressions:")
-CODE (L"\\@ playOctave: 400 + 100")
-NORMAL (L"As with all string literals, the double quotes in literal string arguments should be doubled:")
-CODE (L"#procedure texts: .top\\$ , .bottom\\$ ")
-	CODE1 (L"Text top: \"yes\", .top\\$ ")
-	CODE1 (L"Text bottom: \"yes\", .bottom\\$ ")
-CODE (L"#endproc")
-CODE (L"\\@ texts: \\\" \\\" \\\" hello\\\" \\\"  at the top\\\" , \\\" \\\" \\\" goodbye\\\" \\\"  at the bottom\\\" ")
-ENTRY (L"Functions")
-NORMAL (L"The Praat scripting language does not have the concept of a \"function\" like some other scripting languages do. "
+ENTRY (U"A list of numeric and string arguments")
+NORMAL (U"You can use multiple arguments, separated by commas, and string arguments (with a dollar sign in the variable name):")
+CODE (U"\\@ listSpeaker: \"Bart\", 38")
+CODE (U"\\@ listSpeaker: \"Katja\", 24")
+CODE (U"#procedure listSpeaker: .name\\$ , .age")
+	CODE1 (U"#appendInfoLine: \"Speaker \", .name\\$ , \" is \", .age, \" years old.\"")
+CODE (U"#endproc")
+NORMAL (U"or")
+CODE (U"\\@ conjugateVerb: \"be\", \"I am\", \"you are\", \"she is\"")
+CODE (U"#procedure conjugateVerb: .verb\\$ , .first\\$ , .second\\$ , .third\\$ ")
+	CODE1 (U"#writeInfoLine: \"Conjugation of 'to \", .verb\\$ , \"':\"")
+	CODE1 (U"#appendInfoLine: \"1sg \", .first\\$ ")
+	CODE1 (U"#appendInfoLine: \"2sg \", .second\\$ ")
+	CODE1 (U"#appendInfoLine: \"3sg \", .third\\$ ")
+CODE (U"#endproc")
+NORMAL (U"For the arguments you can use expressions:")
+CODE (U"\\@ playOctave: 400 + 100")
+NORMAL (U"As with all string literals, the double quotes in literal string arguments should be doubled:")
+CODE (U"#procedure texts: .top\\$ , .bottom\\$ ")
+	CODE1 (U"Text top: \"yes\", .top\\$ ")
+	CODE1 (U"Text bottom: \"yes\", .bottom\\$ ")
+CODE (U"#endproc")
+CODE (U"\\@ texts: \\\" \\\" \\\" hello\\\" \\\"  at the top\\\" , \\\" \\\" \\\" goodbye\\\" \\\"  at the bottom\\\" ")
+ENTRY (U"Functions")
+NORMAL (U"The Praat scripting language does not have the concept of a \"function\" like some other scripting languages do. "
 	"A function is a procedure that returns a number or a string. For instance, you can imagine the function $$squareNumber$ "
 	"which takes a number (e.g. 5) as an argument and returns the square of that number (e.g. 25). "
 	"Here is an example of how you can do that, using the global availability of local variables:")
-CODE (L"\\@ squareNumber: 5")
-CODE (L"#writeInfoLine: \"The square of 5 is \", squareNumber.result, \".\"")
-CODE (L"#procedure squareNumber: .number")
-	CODE1 (L".result = .number \\^  2")
-CODE (L"#endproc")
-NORMAL (L"Another way to emulate functions is to use a variable name as an argument:")
-CODE (L"\\@ squareNumber: 5, \"square5\"")
-CODE (L"#writeInfoLine: \"The square of 5 is \", square5, \".\"")
-CODE (L"#procedure squareNumber: .number, .squareVariableName\\$ ")
-	CODE1 (L"'.squareVariableName\\$ ' = .number \\^  2")
-CODE (L"#endproc")
-NORMAL (L"However, this uses variable substitution, a trick better avoided.")
-MAN_END
-
-MAN_BEGIN (L"Scripting 5.6. Arrays", L"ppgb", 20140111)
-NORMAL (L"You can use arrays of numeric and string variables:")
-CODE (L"#for i #from 1 #to 5")
-	CODE1 (L"square [i] = i * i")
-	CODE1 (L"text\\$  [i] = mid\\$  (\"hello\", i)")
-CODE (L"#endfor")
-NORMAL (L"After this, the variables $$square[1]$, $$square[2]$, $$square[3]$, $$square[4]$, $$square[5]$, "
+CODE (U"\\@ squareNumber: 5")
+CODE (U"#writeInfoLine: \"The square of 5 is \", squareNumber.result, \".\"")
+CODE (U"#procedure squareNumber: .number")
+	CODE1 (U".result = .number \\^  2")
+CODE (U"#endproc")
+NORMAL (U"Another way to emulate functions is to use a variable name as an argument:")
+CODE (U"\\@ squareNumber: 5, \"square5\"")
+CODE (U"#writeInfoLine: \"The square of 5 is \", square5, \".\"")
+CODE (U"#procedure squareNumber: .number, .squareVariableName\\$ ")
+	CODE1 (U"'.squareVariableName\\$ ' = .number \\^  2")
+CODE (U"#endproc")
+NORMAL (U"However, this uses variable substitution, a trick better avoided.")
+MAN_END
+
+MAN_BEGIN (U"Scripting 5.6. Arrays", U"ppgb", 20140111)
+NORMAL (U"You can use arrays of numeric and string variables:")
+CODE (U"#for i #from 1 #to 5")
+	CODE1 (U"square [i] = i * i")
+	CODE1 (U"text\\$  [i] = mid\\$  (\"hello\", i)")
+CODE (U"#endfor")
+NORMAL (U"After this, the variables $$square[1]$, $$square[2]$, $$square[3]$, $$square[4]$, $$square[5]$, "
 	"$$text\\$ [1]$, $$text\\$ [2]$, $$text\\$ [3]$, $$text\\$ [4]$, and $$text\\$ [5]$ contain "
 	"the values 1, 4, 9, 16, 25, \"h\", \"e\", \"l\", \"l\", and \"o\", respectively:")
-CODE (L"#writeInfoLine: \"Some squares:\"")
-CODE (L"#for i #from 1 #to 5")
-	CODE1 (L"#appendInfoLine: \"The square of \", i, \" is \", square [i]")
-CODE (L"#endfor")
-NORMAL (L"You can use any number of variables in a script, but you can also use Matrix or Sound objects for arrays.")
-MAN_END
-
-MAN_BEGIN (L"Scripting 5.7. Including other scripts", L"ppgb", 20140111)
-INTRO (L"You can include other scripts within your script:")
-CODE (L"a = 5")
-CODE (L"include square.praat")
-CODE (L"writeInfoLine: a")
-NORMAL (L"The Info window will show the result 25 if the file square.praat contains the following:")
-CODE (L"a = a * a")
-NORMAL (L"The inclusion is done before any other part of the script is considered, so you can use the #form statement "
+CODE (U"#writeInfoLine: \"Some squares:\"")
+CODE (U"#for i #from 1 #to 5")
+	CODE1 (U"#appendInfoLine: \"The square of \", i, \" is \", square [i]")
+CODE (U"#endfor")
+NORMAL (U"You can use any number of variables in a script, but you can also use Matrix or Sound objects for arrays.")
+MAN_END
+
+MAN_BEGIN (U"Scripting 5.7. Including other scripts", U"ppgb", 20140111)
+INTRO (U"You can include other scripts within your script:")
+CODE (U"a = 5")
+CODE (U"include square.praat")
+CODE (U"writeInfoLine: a")
+NORMAL (U"The Info window will show the result 25 if the file square.praat contains the following:")
+CODE (U"a = a * a")
+NORMAL (U"The inclusion is done before any other part of the script is considered, so you can use the #form statement "
 	"and all variables in it. Usually, however, you will put some procedure definitions in the include file, that is "
 	"what it seems to be most useful for. Watch out, however, for using variable names in the include file: "
 	"the example above shows that there is no such thing as a separate name space.")
-NORMAL (L"Note that you do not put quotes around the name of the include file. "
+NORMAL (U"Note that you do not put quotes around the name of the include file. "
         "This is because the name of the include file has to be given explicitly; you cannot put it into a variable, for instance.")
-NORMAL (L"You can use full or relative file names. For instance, the file square.praat is expected to be in the same "
+NORMAL (U"You can use full or relative file names. For instance, the file square.praat is expected to be in the same "
 	"directory as the script that says %%include square.praat%. If you use the ScriptEditor, you will first have to save "
 	"the script that you are editing before any relative file names become meaningful (this is the same as with other "
 	"uses of relative file names in scripts).")
-NORMAL (L"You can \"nest\" include files, i.e., included scripts can include other scripts. However, relative file names "
+NORMAL (U"You can \"nest\" include files, i.e., included scripts can include other scripts. However, relative file names "
 	"are always evaluated relative to the directory of the outermost script.")
-NORMAL (L"The #include statement can only be at the start of a line: you cannot put any spaces in front of it.")
+NORMAL (U"The #include statement can only be at the start of a line: you cannot put any spaces in front of it.")
 MAN_END
 
-MAN_BEGIN (L"Scripting 5.8. Quitting", L"ppgb", 20140124)
-NORMAL (L"Usually, the execution of your script ends when the interpreter has executed the last line "
+MAN_BEGIN (U"Scripting 5.8. Quitting", U"ppgb", 20140124)
+NORMAL (U"Usually, the execution of your script ends when the interpreter has executed the last line "
 	"that is not within a procedure definition. However, you can also explicitly stop the script:")
-TAG (L"#exitScript ( )")
-DEFINITION (L"stops the execution of the script in the normal way, i.e. without any messages to the user. "
+TAG (U"#exitScript ( )")
+DEFINITION (U"stops the execution of the script in the normal way, i.e. without any messages to the user. "
 	"Any settings window is removed from the screen.")
-TAG (L"#exitScript: %%error-message%")
-DEFINITION (L"stops the execution of the script while sending an error message to the user. "
+TAG (U"#exitScript: %%error-message%")
+DEFINITION (U"stops the execution of the script while sending an error message to the user. "
 	"You can use the same argument list as with #writeInfoLine. "
 	"Any settings window will stay on the screen.")
-NORMAL (L"For an example, see @@Scripting 6.8. Messages to the user at .")
-MAN_END
-
-MAN_BEGIN (L"Scripting 6. Communication outside the script", L"ppgb", 20141012)
-LIST_ITEM (L"@@Scripting 6.1. Arguments to the script@ (form/endform, runScript)")
-LIST_ITEM (L"@@Scripting 6.2. Writing to the Info window@ (writeInfoLine, appendInfoLine, appendInfo, tab\\$ )")
-LIST_ITEM (L"@@Scripting 6.3. Query commands@ (Get, Count)")
-LIST_ITEM (L"@@Scripting 6.4. Files@ (fileReadable, readFile, writeFile, deleteFile, createDirectory)")
-LIST_ITEM (L"@@Scripting 6.5. Calling system commands@ (runSystem, environment\\$ , stopwatch)")
-LIST_ITEM (L"@@Scripting 6.6. Controlling the user@ (pause, beginPause/endPause, chooseReadFile\\$ )")
-LIST_ITEM (L"@@Scripting 6.7. Sending a message to another program@ (sendsocket)")
-LIST_ITEM (L"@@Scripting 6.8. Messages to the user@ (exitScript, assert, nowarn, nocheck)")
-LIST_ITEM (L"@@Scripting 6.9. Calling from the command line")
-MAN_END
-
-MAN_BEGIN (L"Scripting 6.1. Arguments to the script", L"ppgb", 20140212)
-NORMAL (L"You can cause a Praat script to prompt for arguments. The file $$playSine.praat$ may contain the following:")
-CODE (L"#form Play a sine wave")
-	CODE1 (L"#positive Sine_frequency_(Hz) 377")
-	CODE1 (L"#positive Gain_(0..1) 0.3 (= not too loud)")
-CODE (L"#endform")
-CODE (L"Create Sound as pure tone: \"sine\" + string\\$  (sine_frequency), 1, 0, 1, 44100, sine_frequency, gain, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-NORMAL (L"When running this script, the interpreter puts a settings window (%form) on your screen, "
+NORMAL (U"For an example, see @@Scripting 6.8. Messages to the user at .")
+MAN_END
+
+MAN_BEGIN (U"Scripting 6. Communication outside the script", U"ppgb", 20141012)
+LIST_ITEM (U"@@Scripting 6.1. Arguments to the script@ (form/endform, runScript)")
+LIST_ITEM (U"@@Scripting 6.2. Writing to the Info window@ (writeInfoLine, appendInfoLine, appendInfo, tab\\$ )")
+LIST_ITEM (U"@@Scripting 6.3. Query commands@ (Get, Count)")
+LIST_ITEM (U"@@Scripting 6.4. Files@ (fileReadable, readFile, writeFile, deleteFile, createDirectory)")
+LIST_ITEM (U"@@Scripting 6.5. Calling system commands@ (runSystem, environment\\$ , stopwatch)")
+LIST_ITEM (U"@@Scripting 6.6. Controlling the user@ (pause, beginPause/endPause, chooseReadFile\\$ )")
+LIST_ITEM (U"@@Scripting 6.7. Sending a message to another program@ (sendsocket)")
+LIST_ITEM (U"@@Scripting 6.8. Messages to the user@ (exitScript, assert, nowarn, nocheck)")
+LIST_ITEM (U"@@Scripting 6.9. Calling from the command line")
+MAN_END
+
+MAN_BEGIN (U"Scripting 6.1. Arguments to the script", U"ppgb", 20140212)
+NORMAL (U"You can cause a Praat script to prompt for arguments. The file $$playSine.praat$ may contain the following:")
+CODE (U"#form Play a sine wave")
+	CODE1 (U"#positive Sine_frequency_(Hz) 377")
+	CODE1 (U"#positive Gain_(0..1) 0.3 (= not too loud)")
+CODE (U"#endform")
+CODE (U"Create Sound as pure tone: \"sine\" + string\\$  (sine_frequency), 1, 0, 1, 44100, sine_frequency, gain, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+NORMAL (U"When running this script, the interpreter puts a settings window (%form) on your screen, "
 	"entitled \"Play a sine wave\", "
 	"with two fields, titled \"Sine frequency (Hz)\" and \"Gain\", that have been provided "
 	"with the standard values \"377\" and \"0.3 (= not too loud)\", which you can change before clicking #OK.")
-NORMAL (L"As you see, the underscores have been replaced with spaces: that looks better in the form. "
+NORMAL (U"As you see, the underscores have been replaced with spaces: that looks better in the form. "
 	"Inside the script, the field names can be accessed as variables: these do contain the underscores, "
 	"since they must not contain spaces, but the parentheses (Hz) have been chopped off. Note that the first "
 	"letter of these variables is converted to lower case, so that you can assign to them in your script.")
-NORMAL (L"Inside the script, the value \"0.3 (= not too loud)\" will be known as \"0.3\", "
+NORMAL (U"Inside the script, the value \"0.3 (= not too loud)\" will be known as \"0.3\", "
 	"because this is a numeric field.")
-NORMAL (L"You can use the following field types in your forms:")
-TAG (L"#real %variable %initialValue")
-DEFINITION (L"for real numbers.")
-TAG (L"#positive %variable %initialValue")
-DEFINITION (L"for positive real numbers: the form issues an error message if the number "
+NORMAL (U"You can use the following field types in your forms:")
+TAG (U"#real %variable %initialValue")
+DEFINITION (U"for real numbers.")
+TAG (U"#positive %variable %initialValue")
+DEFINITION (U"for positive real numbers: the form issues an error message if the number "
 	"that you enter is negative or zero; further on in the script, the number may take on any value.")
-TAG (L"#integer %variable %initialValue")
-DEFINITION (L"for whole numbers: the form reads the number as an integer; "
+TAG (U"#integer %variable %initialValue")
+DEFINITION (U"for whole numbers: the form reads the number as an integer; "
 	"further on in the script, the number may take on any real value.")
-TAG (L"#natural %variable %initialValue")
-DEFINITION (L"for positive whole numbers: the form issues an error message if the number "
+TAG (U"#natural %variable %initialValue")
+DEFINITION (U"for positive whole numbers: the form issues an error message if the number "
 	"that you enter is negative or zero; further on in the script, the number may take on any real value.")
-TAG (L"#word %variable %initialValue")
-DEFINITION (L"for a string without spaces: the form only reads up to the first space (\"oh yes\" becomes \"oh\"); "
+TAG (U"#word %variable %initialValue")
+DEFINITION (U"for a string without spaces: the form only reads up to the first space (\"oh yes\" becomes \"oh\"); "
 	"further on in the script, the string may contain spaces.")
-TAG (L"#sentence %variable %initialValue")
-DEFINITION (L"for any short string.")
-TAG (L"#text %variable %initialValue")
-DEFINITION (L"for any possibly long string (the variable name will not be shown in the form).")
-TAG (L"#boolean %variable %initialValue")
-DEFINITION (L"a check box will be shown; the value is 0 if off, 1 if on.")
-TAG (L"#choice %variable %initialValue")
-DEFINITION (L"a radio box will be shown; the value is 1 or higher. This is followed by a series of:")
-TAG (L"#button %text")
-DEFINITION (L"a button in a radio box.")
-TAG (L"#comment %text")
-DEFINITION (L"a line with any text.")
-NORMAL (L"Inside the script, strings are known as string variables, numbers as numeric variables. Consider the following form:")
-CODE (L"#form Sink it")
-	CODE1 (L"#sentence Name_of_the_ship Titanic")
-	CODE1 (L"#real Distance_to_the_iceberg_(m) 500.0")
-	CODE1 (L"#natural Number_of_people 1800")
-	CODE1 (L"#natural Number_of_boats 10")
-CODE (L"#endform")
-NORMAL (L"In the script following this form, the variables will be known as %%name_of_the_ship\\$ %, %distance_to_the_iceberg, "
+TAG (U"#sentence %variable %initialValue")
+DEFINITION (U"for any short string.")
+TAG (U"#text %variable %initialValue")
+DEFINITION (U"for any possibly long string (the variable name will not be shown in the form).")
+TAG (U"#boolean %variable %initialValue")
+DEFINITION (U"a check box will be shown; the value is 0 if off, 1 if on.")
+TAG (U"#choice %variable %initialValue")
+DEFINITION (U"a radio box will be shown; the value is 1 or higher. This is followed by a series of:")
+TAG (U"#button %text")
+DEFINITION (U"a button in a radio box.")
+TAG (U"#comment %text")
+DEFINITION (U"a line with any text.")
+NORMAL (U"Inside the script, strings are known as string variables, numbers as numeric variables. Consider the following form:")
+CODE (U"#form Sink it")
+	CODE1 (U"#sentence Name_of_the_ship Titanic")
+	CODE1 (U"#real Distance_to_the_iceberg_(m) 500.0")
+	CODE1 (U"#natural Number_of_people 1800")
+	CODE1 (U"#natural Number_of_boats 10")
+CODE (U"#endform")
+NORMAL (U"In the script following this form, the variables will be known as %%name_of_the_ship\\$ %, %distance_to_the_iceberg, "
 	"%number_of_people, and %number_of_boats.")
-NORMAL (L"The variable associated with a radio box will get a numeric as well as a string value:")
-CODE (L"#form Fill attributes")
-	CODE1 (L"#comment Choose any colour and texture for your paintings")
-	CODE1 (L"#choice Colour: 5")
-		CODE2 (L"#button Dark red")
-		CODE2 (L"#button Sea green")
-		CODE2 (L"#button Navy blue")
-		CODE2 (L"#button Canary yellow")
-		CODE2 (L"#button Black")
-		CODE2 (L"#button White")
-	CODE1 (L"#choice Texture: 1")
-		CODE2 (L"#button Smooth")
-		CODE2 (L"#button Rough")
-		CODE2 (L"#button With holes")
-CODE (L"#endform")
-CODE (L"#writeInfoLine: \"You chose the colour \", colour\\$ , \" and the texture \", texture\\$ , \".\"")
-NORMAL (L"This shows two radio boxes. In the Colour box, the fifth button (Black) is the standard value here. "
+NORMAL (U"The variable associated with a radio box will get a numeric as well as a string value:")
+CODE (U"#form Fill attributes")
+	CODE1 (U"#comment Choose any colour and texture for your paintings")
+	CODE1 (U"#choice Colour: 5")
+		CODE2 (U"#button Dark red")
+		CODE2 (U"#button Sea green")
+		CODE2 (U"#button Navy blue")
+		CODE2 (U"#button Canary yellow")
+		CODE2 (U"#button Black")
+		CODE2 (U"#button White")
+	CODE1 (U"#choice Texture: 1")
+		CODE2 (U"#button Smooth")
+		CODE2 (U"#button Rough")
+		CODE2 (U"#button With holes")
+CODE (U"#endform")
+CODE (U"#writeInfoLine: \"You chose the colour \", colour\\$ , \" and the texture \", texture\\$ , \".\"")
+NORMAL (U"This shows two radio boxes. In the Colour box, the fifth button (Black) is the standard value here. "
 	"If you click on \"Navy blue\" and then #%OK, the variable %colour will have the value \"3\", "
 	"and the variable %%colour\\$ % will have the value \"Navy blue\". "
 	"Note that the trailing colon is chopped off, and that the button and comment texts may contain spaces. "
 	"So you can test the value of the Colour box in either of the following ways:")
-CODE (L"if colour = 4")
-NORMAL (L"or")
-CODE (L"if colour\\$  = \"Canary yellow\"")
-NORMAL (L"The field types #optionmenu and #option are completely analogous to #choice and #button, "
+CODE (U"if colour = 4")
+NORMAL (U"or")
+CODE (U"if colour\\$  = \"Canary yellow\"")
+NORMAL (U"The field types #optionmenu and #option are completely analogous to #choice and #button, "
 	"but use up much less space on the screen:")
-CODE (L"#form Fill attributes")
-	CODE1 (L"#comment Choose any colour and texture for your paintings")
-	CODE1 (L"#optionmenu Colour: 5")
-		CODE2 (L"#option Dark red")
-		CODE2 (L"#option Sea green")
-		CODE2 (L"#option Navy blue")
-		CODE2 (L"#option Canary yellow")
-		CODE2 (L"#option Black")
-		CODE2 (L"#option White")
-	CODE1 (L"#optionmenu Texture: 1")
-		CODE2 (L"#option Smooth")
-		CODE2 (L"#option Rough")
-		CODE2 (L"#option With holes")
-CODE (L"#endform")
-CODE (L"#writeInfoLine: \"You chose the colour \", colour\\$ , \" and the texture \", texture\\$ , \".\"")
-NORMAL (L"You can combine two short fields into one by using %left and %right:")
-CODE (L"#form Get duration")
-	CODE1 (L"#natural left_Year_range 1940")
-	CODE1 (L"#natural right_Year_range 1945")
-CODE (L"#endform")
-CODE (L"duration = right_Year_range - left_Year_range")
-CODE (L"#writeInfoLine: \"The duration is \", duration, \" years.\"")
-NORMAL (L"The interpreter will only show the single text \"Year range\", followed by two small text fields.")
-ENTRY (L"Calling a script from another script")
-NORMAL (L"Scripts can be nested: the file %%doremi.praat% may contain the following:")
-CODE (L"#runScript: \"playSine.praat\", 550, 0.9")
-CODE (L"#runScript: \"playSine.praat\", 615, 0.9")
-CODE (L"#runScript: \"playSine.praat\", 687, 0.9")
-NORMAL (L"With #runScript, Praat will not display a form window, but simply execute the script "
+CODE (U"#form Fill attributes")
+	CODE1 (U"#comment Choose any colour and texture for your paintings")
+	CODE1 (U"#optionmenu Colour: 5")
+		CODE2 (U"#option Dark red")
+		CODE2 (U"#option Sea green")
+		CODE2 (U"#option Navy blue")
+		CODE2 (U"#option Canary yellow")
+		CODE2 (U"#option Black")
+		CODE2 (U"#option White")
+	CODE1 (U"#optionmenu Texture: 1")
+		CODE2 (U"#option Smooth")
+		CODE2 (U"#option Rough")
+		CODE2 (U"#option With holes")
+CODE (U"#endform")
+CODE (U"#writeInfoLine: \"You chose the colour \", colour\\$ , \" and the texture \", texture\\$ , \".\"")
+NORMAL (U"You can combine two short fields into one by using %left and %right:")
+CODE (U"#form Get duration")
+	CODE1 (U"#natural left_Year_range 1940")
+	CODE1 (U"#natural right_Year_range 1945")
+CODE (U"#endform")
+CODE (U"duration = right_Year_range - left_Year_range")
+CODE (U"#writeInfoLine: \"The duration is \", duration, \" years.\"")
+NORMAL (U"The interpreter will only show the single text \"Year range\", followed by two small text fields.")
+ENTRY (U"Calling a script from another script")
+NORMAL (U"Scripts can be nested: the file %%doremi.praat% may contain the following:")
+CODE (U"#runScript: \"playSine.praat\", 550, 0.9")
+CODE (U"#runScript: \"playSine.praat\", 615, 0.9")
+CODE (U"#runScript: \"playSine.praat\", 687, 0.9")
+NORMAL (U"With #runScript, Praat will not display a form window, but simply execute the script "
 	"with the two arguments that you supply on the same line (e.g. 550 and 0.9).")
-NORMAL (L"Values for #choice must be passed as strings:")
-CODE (L"#runScript: \"fill attributes.praat\", \"Navy blue\", \"With holes\"")
-NORMAL (L"You can pass values for #boolean either as \"yes\" and \"no\" or as 1 and 0.")
+NORMAL (U"Values for #choice must be passed as strings:")
+CODE (U"#runScript: \"fill attributes.praat\", \"Navy blue\", \"With holes\"")
+NORMAL (U"You can pass values for #boolean either as \"yes\" and \"no\" or as 1 and 0.")
 MAN_END
 
-MAN_BEGIN (L"Scripting 6.2. Writing to the Info window", L"ppgb", 20140111)
-NORMAL (L"With the @Info button and several commands in the #Query menus, "
+MAN_BEGIN (U"Scripting 6.2. Writing to the Info window", U"ppgb", 20140111)
+NORMAL (U"With the @Info button and several commands in the #Query menus, "
 	"you write to the @@Info window@ (if your program is run from the command line, "
 	"the text goes to the console window or to %stdout instead; see @@Scripting 6.9. Calling from the command line|\\SS6.9).")
-NORMAL (L"The commands #writeInfo, #writeInfoLine, #appendInfo and #appendInfoLine "
+NORMAL (U"The commands #writeInfo, #writeInfoLine, #appendInfo and #appendInfoLine "
 	"allow you to write to the Info window from a script. Those with #write in their name clear the Info window "
 	"before they write to it, those with #append in their name do not. Those with #Line in their name make sure "
 	"that a following #appendInfo or #appendInfoLine will write on the next line.")
-NORMAL (L"These four functions take a variable number of numeric and/or string arguments, separated by commas. "
+NORMAL (U"These four functions take a variable number of numeric and/or string arguments, separated by commas. "
 	"The following script builds a table with statistics about a pitch contour:")
-CODE (L"#writeInfoLine: \"  Minimum   Maximum\"")
-CODE (L"Create Sound as pure tone: \"sine\", 1, 0, 0.1, 44100, 377, 0.2, 0.01, 0.01")
-CODE (L"To Pitch: 0.01, 75, 600")
-CODE (L"minimum = Get minimum: 0, 0, \"Hertz\", \"Parabolic\"")
-CODE (L"#appendInfo: minimum")
-CODE (L"#appendInfo: tab\\$ ")
-CODE (L"maximum = Get maximum: 0, 0, \"Hertz\", \"Parabolic\"")
-CODE (L"#appendInfo: maximum")
-CODE (L"#appendInfoLine: \"\"")
-NORMAL (L"You could combine the last four print statements into:")
-CODE (L"#appendInfoLine: minimum, tab\\$ , maximum")
-NORMAL (L"which is the same as:")
-CODE (L"#appendInfo: minimum, tab\\$ , maximum, newline\\$ ")
-NORMAL (L"The little string ##tab\\$ # is a %tab character; it allows you to create "
+CODE (U"#writeInfoLine: \"  Minimum   Maximum\"")
+CODE (U"Create Sound as pure tone: \"sine\", 1, 0, 0.1, 44100, 377, 0.2, 0.01, 0.01")
+CODE (U"To Pitch: 0.01, 75, 600")
+CODE (U"minimum = Get minimum: 0, 0, \"Hertz\", \"Parabolic\"")
+CODE (U"#appendInfo: minimum")
+CODE (U"#appendInfo: tab\\$ ")
+CODE (U"maximum = Get maximum: 0, 0, \"Hertz\", \"Parabolic\"")
+CODE (U"#appendInfo: maximum")
+CODE (U"#appendInfoLine: \"\"")
+NORMAL (U"You could combine the last four print statements into:")
+CODE (U"#appendInfoLine: minimum, tab\\$ , maximum")
+NORMAL (U"which is the same as:")
+CODE (U"#appendInfo: minimum, tab\\$ , maximum, newline\\$ ")
+NORMAL (U"The little string ##tab\\$ # is a %tab character; it allows you to create "
 	"table files that can be read by some spreadsheet programs. The little string ##newline\\$ # is a %newline character; "
 	"it moves the following text to the next line.")
-NORMAL (L"To clear the Info window, you can do")
-CODE (L"#writeInfo: \"\"")
-NORMAL (L"or")
-CODE (L"#clearinfo")
+NORMAL (U"To clear the Info window, you can do")
+CODE (U"#writeInfo: \"\"")
+NORMAL (U"or")
+CODE (U"#clearinfo")
 MAN_END
 
-MAN_BEGIN (L"Scripting 6.3. Query commands", L"ppgb", 20140107)
-NORMAL (L"If you click the \"Get mean...\" command for a Pitch object, "
+MAN_BEGIN (U"Scripting 6.3. Query commands", U"ppgb", 20140107)
+NORMAL (U"If you click the \"Get mean...\" command for a Pitch object, "
 	"the Info window will contain a text like \"150 Hz\" as a result. In a script, you would rather "
 	"have this result in a variable instead of in the Info window. The solution is simple:")
-CODE (L"mean = Get mean: 0, 0, \"Hertz\", \"Parabolic\"")
-NORMAL (L"The numeric variable \"mean\" now contains the number 150. When assigning to a numeric variable, "
+CODE (U"mean = Get mean: 0, 0, \"Hertz\", \"Parabolic\"")
+NORMAL (U"The numeric variable \"mean\" now contains the number 150. When assigning to a numeric variable, "
 	"the interpreter converts the part of the text before the first space into a number.")
-NORMAL (L"You can also assign to string variables:")
-CODE (L"mean\\$  = Get mean: 0, 0, \"Hertz\", \"Parabolic\"")
-NORMAL (L"The string variable \"mean\\$ \" now contains the entire string \"150 Hz\".")
-NORMAL (L"This works for every command that would otherwise write into the Info window.")
-MAN_END
-
-MAN_BEGIN (L"Scripting 6.4. Files", L"ppgb", 20140111)
-INTRO (L"You can read from and write to text files from a Praat script.")
-ENTRY (L"Reading a file")
-NORMAL (L"You can check the availability of a file for reading with the function")
-CODE (L"#fileReadable (%%fileName\\$ %)")
-NORMAL (L"which returns 1 (true) if the file exists and can be read, and 0 (false) otherwise. "
+NORMAL (U"You can also assign to string variables:")
+CODE (U"mean\\$  = Get mean: 0, 0, \"Hertz\", \"Parabolic\"")
+NORMAL (U"The string variable \"mean\\$ \" now contains the entire string \"150 Hz\".")
+NORMAL (U"This works for every command that would otherwise write into the Info window.")
+MAN_END
+
+MAN_BEGIN (U"Scripting 6.4. Files", U"ppgb", 20150601)
+INTRO (U"You can read from and write to text files from a Praat script.")
+ENTRY (U"Reading a file")
+NORMAL (U"You can check the availability of a file for reading with the function")
+CODE (U"#fileReadable (%%fileName\\$ %)")
+NORMAL (U"which returns 1 (true) if the file exists and can be read, and 0 (false) otherwise. "
 	"Note that %%fileName\\$ % is taken relatively to the directory where the script is saved; "
 	"for instance, if your script is in the directory ##Paolo/project1#, then the file name "
 	"\"hello.wav\" refers to ##Paolo/project1/hello.wav#, the file name \"yesterday/hello.wav\" "
 	"refers to ##Paolo/project1/yesterday/hello.wav#, and the file name \"../project2/hello.wav\" "
 	"refers to ##Paolo/project2/hello.wav# (\"..\" goes one directory up). "
-	"You can also use full path names such as \"C:/Documents and Settings/Paolo/project1/hello.wav\" "
+	"You can also use full path names such as \"C:/Users/Paolo/project1/hello.wav\" "
 	"on Windows and \"/Users/Paolo/project1/hello.wav\" on the Mac.")
-NORMAL (L"To read the contents of an existing text file into a string variable or into a numeric variable, you use")
-CODE (L"text\\$  = readFile\\$  (\"myFile.txt\")")
-NORMAL (L"or")
-CODE (L"number = readFile (\"myFile.txt\")")
-NORMAL (L"If the file does not exist, the script terminates with an error message.")
-ENTRY (L"Example: reading a settings file")
-NORMAL (L"Suppose that the file ##height.inf# may contain an appropriate value for a numeric variable "
+NORMAL (U"To read the contents of an existing text file into a string variable or into a numeric variable, you use")
+CODE (U"text\\$  = readFile\\$  (\"myFile.txt\")")
+NORMAL (U"or")
+CODE (U"number = readFile (\"myFile.txt\")")
+NORMAL (U"If the file does not exist, the script terminates with an error message.")
+ENTRY (U"Example: reading a settings file")
+NORMAL (U"Suppose that the file ##height.inf# may contain an appropriate value for a numeric variable "
 	"called $height, which we need to use in our script. We would like to read it with")
-CODE (L"height = readFile (\"height.inf\")")
-NORMAL (L"However, this script will fail if the file ##height.inf# does not exist. To guard "
+CODE (U"height = readFile (\"height.inf\")")
+NORMAL (U"However, this script will fail if the file ##height.inf# does not exist. To guard "
 	"against this situation, we could check the existence of the file, and supply a default "
 	"value in case the file does not exist:")
-CODE (L"fileName\\$  = \"height.inf\"")
-CODE (L"if fileReadable (fileName\\$ )")
-	CODE1 (L"height = readFile (fileName\\$ )")
-CODE (L"else")
-	CODE1 (L"height = 180")
-CODE (L"endif")
-ENTRY (L"Writing a file")
-NORMAL (L"You write into a new text file just as you write into the Info window:")
-CODE (L"writeFileLine: \"myFile.txt\", \"The present year is \", 2000 + 13, \".\"")
-NORMAL (L"and likewise you use %writeFile if you don't want a newline symbol at the end of the file. "
+CODE (U"fileName\\$  = \"height.inf\"")
+CODE (U"if fileReadable (fileName\\$ )")
+	CODE1 (U"height = readFile (fileName\\$ )")
+CODE (U"else")
+	CODE1 (U"height = 180")
+CODE (U"endif")
+ENTRY (U"Writing a file")
+NORMAL (U"You write into a new text file just as you write into the Info window:")
+CODE (U"writeFileLine: \"myFile.txt\", \"The present year is \", 2000 + 13, \".\"")
+NORMAL (U"and likewise you use %writeFile if you don't want a newline symbol at the end of the file. "
 	"If the file cannot be created, the script terminates with an error message.")
-NORMAL (L"To append text at the end of an existing file, you use")
-CODE (L"appendFileLine: \"myFile.txt\", \"Next year it will be \", 2000 + 14, \".\"")
-NORMAL (L"With %appendFileLine (and %appendFile, which does not add the newline), "
+NORMAL (U"To append text at the end of an existing file, you use")
+CODE (U"appendFileLine: \"myFile.txt\", \"Next year it will be \", 2000 + 14, \".\"")
+NORMAL (U"With %appendFileLine (and %appendFile, which does not add the newline), "
 	"we follow the rule that if the file does not yet exist, it is created first.")
-NORMAL (L"You can create a directory with")
-CODE (L"#createDirectory: %%directoryName\\$ %")
-NORMAL (L"where, as with file names, %%directoryName\\$ % can be relative to the directory of the script "
+NORMAL (U"You can create a directory with")
+CODE (U"#createDirectory: %%directoryName\\$ %")
+NORMAL (U"where, as with file names, %%directoryName\\$ % can be relative to the directory of the script "
 	"(e.g. \"data\", or \"yesterday/data\", or \"../project2/yesterday/data\") "
-	"or an absolute path (e.g. \"C:/Documents and Settings/Paolo/project1/yesterday/data\" on Windows "
+	"or an absolute path (e.g. \"C:/Users/Paolo/project1/yesterday/data\" on Windows "
 	"or \"/Users/Paolo/project1/yesterday/data\" on the Mac). "
 	"If the directory already exists, this command does nothing.")
-NORMAL (L"You can delete an existing file with the function")
-CODE (L"#deleteFile: %%fileName\\$ %")
-NORMAL (L"If the file does not exist, this command does nothing.")
-ENTRY (L"Example: writing a table of squares")
-NORMAL (L"Suppose that we want to create a file with the following text:")
-CODE (L"The square of 1 is 1")
-CODE (L"The square of 2 is 4")
-CODE (L"The square of 3 is 9")
-CODE (L"...")
-CODE (L"The square of 100 is 10000")
-NORMAL (L"We can do this by appending 100 lines:")
-CODE (L"deleteFile: \"squares.txt\"")
-CODE (L"for i to 100")
-	CODE1 (L"appendFileLine: \"squares.txt\", \"The square of \", i, \" is \", i * i")
-CODE (L"endfor")
-NORMAL (L"Note that we delete the file before appending to it, "
+NORMAL (U"You can delete an existing file with the function")
+CODE (U"#deleteFile: %%fileName\\$ %")
+NORMAL (U"If the file does not exist, this command does nothing.")
+ENTRY (U"Example: writing a table of squares")
+NORMAL (U"Suppose that we want to create a file with the following text:")
+CODE (U"The square of 1 is 1")
+CODE (U"The square of 2 is 4")
+CODE (U"The square of 3 is 9")
+CODE (U"...")
+CODE (U"The square of 100 is 10000")
+NORMAL (U"We can do this by appending 100 lines:")
+CODE (U"deleteFile: \"squares.txt\"")
+CODE (U"for i to 100")
+	CODE1 (U"appendFileLine: \"squares.txt\", \"The square of \", i, \" is \", i * i")
+CODE (U"endfor")
+NORMAL (U"Note that we delete the file before appending to it, "
 	"in order that we do not append to an already existing file.")
-NORMAL (L"You can append the contents of the Info window to a file with")
-CODE (L"appendFile: \"out.txt\", info\\$  ( )")
-ENTRY (L"Directory listings")
-NORMAL (L"To get the names of the files if a certain type in a certain directory, "
+NORMAL (U"You can append the contents of the Info window to a file with")
+CODE (U"appendFile: \"out.txt\", info\\$  ( )")
+ENTRY (U"Directory listings")
+NORMAL (U"To get the names of the files if a certain type in a certain directory, "
 	"use @@Create Strings as file list... at .")
-ENTRY (L"Alternative syntax")
-NORMAL (L"If, on the basis of the syntax of commands and functions in earlier sections you expected that")
-CODE (L"text\\$  = readFile\\$  (\"myFile.txt\")")
-CODE (L"number = readFile (\"myFile.txt\")")
-NORMAL (L"could be written as")
-CODE (L"text\\$  = readFile\\$ : \"myFile.txt\"")
-CODE (L"number = readFile: \"myFile.txt\"")
-NORMAL (L"then you are right. The syntax with the colon is equivalent to the syntax with the two parentheses. Conversely, instead of")
-CODE (L"#deleteFile: %%fileName\\$ %")
-NORMAL (L"you can also write")
-CODE (L"#deleteFile (%%fileName\\$ %)")
-MAN_END
-
-MAN_BEGIN (L"Scripting 6.5. Calling system commands", L"ppgb", 20141012)
-INTRO (L"From a Praat script you can call system commands. "
+ENTRY (U"Alternative syntax")
+NORMAL (U"If, on the basis of the syntax of commands and functions in earlier sections you expected that")
+CODE (U"text\\$  = readFile\\$  (\"myFile.txt\")")
+CODE (U"number = readFile (\"myFile.txt\")")
+NORMAL (U"could be written as")
+CODE (U"text\\$  = readFile\\$ : \"myFile.txt\"")
+CODE (U"number = readFile: \"myFile.txt\"")
+NORMAL (U"then you are right. The syntax with the colon is equivalent to the syntax with the two parentheses. Conversely, instead of")
+CODE (U"#deleteFile: %%fileName\\$ %")
+NORMAL (U"you can also write")
+CODE (U"#deleteFile (%%fileName\\$ %)")
+MAN_END
+
+MAN_BEGIN (U"Scripting 6.5. Calling system commands", U"ppgb", 20141012)
+INTRO (U"From a Praat script you can call system commands. "
 	"These are the same commands that you would normally type into a terminal window or into the Window command line prompt. "
 	"The syntax is the same as that of the #writeInfo command.")
-NORMAL (L"Most system commands are different on different platforms. "
+NORMAL (U"Most system commands are different on different platforms. "
 	"For instance, to throw away all WAV files in the directory whose name (relative to the script's directory) is "
 	"in the variable directory\\$ , you would write")
-CODE (L"#runSystem: \"del \", directory\\$ , \"\\bs*.wav\"")
-NORMAL (L"on Windows, but")
-CODE (L"#runSystem: \"rm \", directory\\$ , \"/*.wav\"")
-NORMAL (L"on Macintosh and Unix.")
-NORMAL (L"The script will stop running if a system command returns an error. For instance,")
-CODE (L"#runSystem: \"rm \", directory\\$ , \"/*.wav\"")
-NORMAL (L"will stop the script if there are no WAV files in the directory. "
+CODE (U"#runSystem: \"del \", directory\\$ , \"\\bs*.wav\"")
+NORMAL (U"on Windows, but")
+CODE (U"#runSystem: \"rm \", directory\\$ , \"/*.wav\"")
+NORMAL (U"on Macintosh and Linux.")
+NORMAL (U"The script will stop running if a system command returns an error. For instance,")
+CODE (U"#runSystem: \"rm \", directory\\$ , \"/*.wav\"")
+NORMAL (U"will stop the script if there are no WAV files in the directory. "
 	"In order to prevent this, you can tell Praat to ignore the return value of the runSystem command.")
-NORMAL (L"Thus, to make sure that the directory contains no WAV files, you would write")
-CODE (L"#runSystem_nocheck: \"rm \", directory\\$ , \"/*.wav\"")
-ENTRY (L"Getting the values of system variables")
-TAG (L"##environment\\$  (#%%symbol-string%#)")
-DEFINITION (L"returns the value of an environment variable, e.g.")
-CODE1 (L"homeDirectory\\$  = ##environment\\$ # (\"HOME\")")
-ENTRY (L"Getting system duration")
-TAG (L"##stopwatch")
-DEFINITION (L"returns the time that has elapsed since the previous #stopwatch.")
-NORMAL (L"Here is a Praat script that measures how long it takes to do a million assignments:")
-CODE (L"stopwatch")
-CODE (L"for i to 1000000")
-	CODE1 (L"a = 1.23456789e123")
-CODE (L"endfor")
-CODE (L"time = stopwatch")
-CODE (L"writeInfoLine: a, \" \", fixed\\$  (time, 3)")
-MAN_END
-
-MAN_BEGIN (L"Scripting 6.6. Controlling the user", L"ppgb", 20140726)
-INTRO (L"You can temporarily halt a Praat script:")
-TAG (L"#pauseScript: %message")
-DEFINITION (L"suspends execution of the script, and allows the user to interrupt it. "
+NORMAL (U"Thus, to make sure that the directory contains no WAV files, you would write")
+CODE (U"#runSystem_nocheck: \"rm \", directory\\$ , \"/*.wav\"")
+ENTRY (U"Getting the values of system variables")
+TAG (U"##environment\\$  (#%%symbol-string%#)")
+DEFINITION (U"returns the value of an environment variable, e.g.")
+CODE1 (U"homeDirectory\\$  = ##environment\\$ # (\"HOME\")")
+ENTRY (U"Getting system duration")
+TAG (U"##stopwatch")
+DEFINITION (U"returns the time that has elapsed since the previous #stopwatch.")
+NORMAL (U"Here is a Praat script that measures how long it takes to do a million assignments:")
+CODE (U"stopwatch")
+CODE (U"for i to 1000000")
+	CODE1 (U"a = 1.23456789e123")
+CODE (U"endfor")
+CODE (U"time = stopwatch")
+CODE (U"writeInfoLine: a, \" \", fixed\\$  (time, 3)")
+MAN_END
+
+MAN_BEGIN (U"Scripting 6.6. Controlling the user", U"ppgb", 20140726)
+INTRO (U"You can temporarily halt a Praat script:")
+TAG (U"#pauseScript: %message")
+DEFINITION (U"suspends execution of the script, and allows the user to interrupt it. "
 	"A message window will appear with the %message (you can use the same argument list as with #writeInfoLine) and the buttons Stop and Continue:")
-CODE (L"#pauseScript: \"The next file will be \", fileName\\$ ")
-NORMAL (L"The pauseScript function is useful if you want to send a simple message to the user, "
+CODE (U"#pauseScript: \"The next file will be \", fileName\\$ ")
+NORMAL (U"The pauseScript function is useful if you want to send a simple message to the user, "
 	"and you only want to ask the user whether she wants to proceed or not. "
 	"More interesting interactions between your script and the user are possible with the %%pause window%. "
 	"In a pause window you can include the same kinds of arguments as in a @@Scripting 6.1. Arguments to the script|form at . "
 	"Here is an extensive example:")
-CODE (L"writeInfoLine: \"script\"")
-CODE (L"compression = 1")
-CODE (L"number_of_channels = 2")
-CODE (L"worth = 3")
-CODE (L"for i to 5")
-	CODE1 (L"#beginPause: \"Hi\"")
-		CODE2 (L"#comment: \"Type a lot of nonsense below.\"")
-		CODE2 (L"#natural: \"Number of people\", 10")
-		CODE2 (L"#real: \"Worth\", worth + 1")
-		CODE2 (L"#positive: \"Sampling frequency (Hz)\", \"44100.0 (= CD quality)\"")
-		CODE2 (L"#word: \"hi\", \"hhh\"")
-		CODE2 (L"#sentence: \"lo\", \"two words\"")
-		CODE2 (L"#text: \"ko\", \"jkgkjhkj g gdfg dfg\"")
-		CODE2 (L"#boolean: \"You like it?\", 1")
-		CODE2 (L"if worth < 6")
-			CODE3 (L"#choice: \"Compression\", compression")
-				CODE4 (L"#option: \"lossless (FLAC)\"")
-				CODE4 (L"#option: \"MP3\"")
-				CODE4 (L"#option: \"Ogg\"")
-		CODE2 (L"endif")
-		CODE2 (L"#optionMenu: \"Number of channels\", number_of_channels")
-			CODE3 (L"#option: \"mono\"")
-			CODE3 (L"#option: \"stereo\"")
-			CODE3 (L"#option: \"quadro\"")
-		CODE2 (L"#comment: \"Then click Stop or one of the continuation buttons.\"")
-	CODE1 (L"clicked = #endPause: \"Continue\", \"Next\", \"Proceed\", 2")
-	CODE1 (L"appendInfoLine: number_of_people, \" \", worth, \" \", sampling_frequency, \" \", clicked")
-	CODE1 (L"appendInfoLine: \"Compression: \", compression, \" (\", compression\\$ ")
-	CODE1 (L"appendInfoLine: \"Number of channels: \", number_of_channels\\$ ")
-CODE (L"endfor")
-NORMAL (L"This example uses several tricks. A useful one is seen with %number_of_channels: "
+CODE (U"writeInfoLine: \"script\"")
+CODE (U"compression = 1")
+CODE (U"number_of_channels = 2")
+CODE (U"worth = 3")
+CODE (U"for i to 5")
+	CODE1 (U"#beginPause: \"Hi\"")
+		CODE2 (U"#comment: \"Type a lot of nonsense below.\"")
+		CODE2 (U"#natural: \"Number of people\", 10")
+		CODE2 (U"#real: \"Worth\", worth + 1")
+		CODE2 (U"#positive: \"Sampling frequency (Hz)\", \"44100.0 (= CD quality)\"")
+		CODE2 (U"#word: \"hi\", \"hhh\"")
+		CODE2 (U"#sentence: \"lo\", \"two words\"")
+		CODE2 (U"#text: \"ko\", \"jkgkjhkj g gdfg dfg\"")
+		CODE2 (U"#boolean: \"You like it?\", 1")
+		CODE2 (U"if worth < 6")
+			CODE3 (U"#choice: \"Compression\", compression")
+				CODE4 (U"#option: \"lossless (FLAC)\"")
+				CODE4 (U"#option: \"MP3\"")
+				CODE4 (U"#option: \"Ogg\"")
+		CODE2 (U"endif")
+		CODE2 (U"#optionMenu: \"Number of channels\", number_of_channels")
+			CODE3 (U"#option: \"mono\"")
+			CODE3 (U"#option: \"stereo\"")
+			CODE3 (U"#option: \"quadro\"")
+		CODE2 (U"#comment: \"Then click Stop or one of the continuation buttons.\"")
+	CODE1 (U"clicked = #endPause: \"Continue\", \"Next\", \"Proceed\", 2")
+	CODE1 (U"appendInfoLine: number_of_people, \" \", worth, \" \", sampling_frequency, \" \", clicked")
+	CODE1 (U"appendInfoLine: \"Compression: \", compression, \" (\", compression\\$ ")
+	CODE1 (U"appendInfoLine: \"Number of channels: \", number_of_channels\\$ ")
+CODE (U"endfor")
+NORMAL (U"This example uses several tricks. A useful one is seen with %number_of_channels: "
 	"this is at the same time the value that is passed to #optionMenu (and therefore determines the setting of "
 	"the \"Number of channels\" menu when the window appears) and the name of the variable in which the user's "
 	"chosen value of \"Number of channels\" is stored (because \"number_of_channels\" is what you get "
 	"by replacing the spaces in \"Number of channels\" with underscores and turning its first letter to lower case.")
-NORMAL (L"Your own pause windows are not likely to be as rich as the above example. "
+NORMAL (U"Your own pause windows are not likely to be as rich as the above example. "
 	"For instance, the example has three continuation buttons (the second of these is the default button, "
 	"i.e. the button that you can \"click\" by pressing the Enter or Return key). "
 	"You will often use only one continuation button, for instance")
-CODE (L"#endPause: \"Continue\", 1")
-NORMAL (L"or")
-CODE (L"#endPause: \"Finish\", 1")
-NORMAL (L"or")
-CODE (L"#endPause: \"OK\", 1")
-NORMAL (L"If your script shows multiple different pause windows, then it is in fact a %wizard, "
+CODE (U"#endPause: \"Continue\", 1")
+NORMAL (U"or")
+CODE (U"#endPause: \"Finish\", 1")
+NORMAL (U"or")
+CODE (U"#endPause: \"OK\", 1")
+NORMAL (U"If your script shows multiple different pause windows, then it is in fact a %wizard, "
 	"and it becomes useful to have")
-CODE (L"#endPause: \"Next\", 1")
-NORMAL (L"for most of them, and")
-CODE (L"#endPause: \"Finish\", 1")
-NORMAL (L"for the last one.")
-NORMAL (L"The possibility of multiple continuation buttons can save the user a mouse click. "
+CODE (U"#endPause: \"Next\", 1")
+NORMAL (U"for most of them, and")
+CODE (U"#endPause: \"Finish\", 1")
+NORMAL (U"for the last one.")
+NORMAL (U"The possibility of multiple continuation buttons can save the user a mouse click. "
 	"The following script, for instance, requires two mouse clicks per sound:")
-CODE (L"for i to 20")
-	CODE1 (L"Read from file: \"sound\" + string\\$  (i) + \".wav\"")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-	CODE1 (L"#beginPause: \"Rate the quality\"")
-		CODE2 (L"#comment: \"How good is the sound on a scale from 1 to 7?\"")
-		CODE2 (L"#choice: \"Quality\", 4")
-			CODE3 (L"#option: \"1\"")
-			CODE3 (L"#option: \"2\"")
-			CODE3 (L"#option: \"3\"")
-			CODE3 (L"#option: \"4\"")
-			CODE3 (L"#option: \"5\"")
-			CODE3 (L"#option: \"6\"")
-			CODE3 (L"#option: \"7\"")
-	CODE1 (L"#endPause: if i = 20 then \"Finish\" else \"Next\" fi, 1")
-	CODE1 (L"appendInfoLine: quality")
-CODE (L"endfor")
-NORMAL (L"The following script works faster:")
-CODE (L"for i to 20")
-	CODE1 (L"Read from file: \"sound\" + string\\$  (i) + \".wav\"")
-	CODE1 (L"Play")
-	CODE1 (L"Remove")
-	CODE1 (L"#beginPause: \"Rate the quality\"")
-		CODE2 (L"#comment: \"How good is the sound on a scale from 1 to 7?\"")
-	CODE1 (L"quality = #endPause: \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", 0")
-	CODE1 (L"appendInfoLine: quality")
-CODE (L"endfor")
-NORMAL (L"In this example, the 0 at the end of #endPause means that there is no default button.")
-ENTRY (L"File selection")
-NORMAL (L"If you want the user to choose a file name for reading (opening), do")
-CODE (L"fileName\\$  = ##chooseReadFile\\$ #: \"Open a table file\"")
-CODE (L"if fileName\\$  <> \"\"")
-	CODE1 (L"table = Read Table from tab-separated file: fileName\\$ ")
-CODE (L"endif")
-NORMAL (L"A file selector window will appear, with (in this example) \"Open a table file\" as the title. "
+CODE (U"for i to 20")
+	CODE1 (U"Read from file: \"sound\" + string\\$  (i) + \".wav\"")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+	CODE1 (U"#beginPause: \"Rate the quality\"")
+		CODE2 (U"#comment: \"How good is the sound on a scale from 1 to 7?\"")
+		CODE2 (U"#choice: \"Quality\", 4")
+			CODE3 (U"#option: \"1\"")
+			CODE3 (U"#option: \"2\"")
+			CODE3 (U"#option: \"3\"")
+			CODE3 (U"#option: \"4\"")
+			CODE3 (U"#option: \"5\"")
+			CODE3 (U"#option: \"6\"")
+			CODE3 (U"#option: \"7\"")
+	CODE1 (U"#endPause: if i = 20 then \"Finish\" else \"Next\" fi, 1")
+	CODE1 (U"appendInfoLine: quality")
+CODE (U"endfor")
+NORMAL (U"The following script works faster:")
+CODE (U"for i to 20")
+	CODE1 (U"Read from file: \"sound\" + string\\$  (i) + \".wav\"")
+	CODE1 (U"Play")
+	CODE1 (U"Remove")
+	CODE1 (U"#beginPause: \"Rate the quality\"")
+		CODE2 (U"#comment: \"How good is the sound on a scale from 1 to 7?\"")
+	CODE1 (U"quality = #endPause: \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", 0")
+	CODE1 (U"appendInfoLine: quality")
+CODE (U"endfor")
+NORMAL (U"In this example, the 0 at the end of #endPause means that there is no default button.")
+ENTRY (U"File selection")
+NORMAL (U"If you want the user to choose a file name for reading (opening), do")
+CODE (U"fileName\\$  = ##chooseReadFile\\$ #: \"Open a table file\"")
+CODE (U"if fileName\\$  <> \"\"")
+	CODE1 (U"table = Read Table from tab-separated file: fileName\\$ ")
+CODE (U"endif")
+NORMAL (U"A file selector window will appear, with (in this example) \"Open a table file\" as the title. "
 	"If the user clicks #OK, the variable $$fileName\\$ $ will contain the name of the file that the user selected; "
 	"if the user clicks #Cancel, the variable $$fileName\\$ $ will contain the empty string (\"\").")
-NORMAL (L"If you want the user to choose a file name for writing (saving), do")
-CODE (L"selectObject: mySound")
-CODE (L"fileName\\$  = ##chooseWriteFile\\$ #: \"Save as a WAV file\", \"mySound.wav\"")
-CODE (L"if fileName\\$  <> \"\"")
-	CODE1 (L"Save as WAV file: fileName\\$ ")
-CODE (L"endif")
-NORMAL (L"A file selector window will appear, with (in this example) \"Save as a WAV file\" as the title "
+NORMAL (U"If you want the user to choose a file name for writing (saving), do")
+CODE (U"selectObject: mySound")
+CODE (U"fileName\\$  = ##chooseWriteFile\\$ #: \"Save as a WAV file\", \"mySound.wav\"")
+CODE (U"if fileName\\$  <> \"\"")
+	CODE1 (U"Save as WAV file: fileName\\$ ")
+CODE (U"endif")
+NORMAL (U"A file selector window will appear, with (in this example) \"Save as a WAV file\" as the title "
 	"and \"mySound.wav\" as the suggested file name (which the user can change). "
 	"If the user clicks #OK, the form will ask for confirmation if the file name that the user typed already exists. "
 	"If the user clicks #OK with a new file name, or clicks #OK in the confirmation window, "
 	"the variable $$fileName\\$ $ will contain the file name that the user typed; "
 	"if the user clicks #Cancel at any point, the variable $$fileName\\$ $ will contain the empty string (\"\").")
-NORMAL (L"If you want the user to choose a directory (folder) name, do")
-CODE (L"directoryName\\$  = ##chooseDirectory\\$ #: \"Choose a directory to save all the new files in\"")
-CODE (L"if directoryName\\$  <> \"\"")
-	CODE1 (L"for i to numberOfSelectedSounds")
-		CODE2 (L"selectObject: sound [i]")
-		CODE2 (L"Save as WAV file: directoryName\\$  + \"/sound\" + string\\$  (i) + \".wav\"")
-	CODE1 (L"endfor")
-CODE (L"endif")
-NORMAL (L"A directory selector window will appear, with (in this example) \"Choose a directory to save all the new files in\" as the title. "
+NORMAL (U"If you want the user to choose a directory (folder) name, do")
+CODE (U"directoryName\\$  = ##chooseDirectory\\$ #: \"Choose a directory to save all the new files in\"")
+CODE (U"if directoryName\\$  <> \"\"")
+	CODE1 (U"for i to numberOfSelectedSounds")
+		CODE2 (U"selectObject: sound [i]")
+		CODE2 (U"Save as WAV file: directoryName\\$  + \"/sound\" + string\\$  (i) + \".wav\"")
+	CODE1 (U"endfor")
+CODE (U"endif")
+NORMAL (U"A directory selector window will appear, with (in this example) \"Choose a directory to save all the new files in\" as the title. "
 	"If the user clicks #OK, the variable $$directoryName\\$ $ will contain the name of the directory that the user selected; "
 	"if the user clicks #Cancel, the variable $$directoryName\\$ $ will contain the empty string (\"\").")
-ENTRY (L"A non-pausing pause window without a Stop button")
-NORMAL (L"Especially if you use the pause window within the @@Demo window@, you may not want to give the user the capability of "
+ENTRY (U"A non-pausing pause window without a Stop button")
+NORMAL (U"Especially if you use the pause window within the @@Demo window@, you may not want to give the user the capability of "
 	"ending the script by hitting #Stop or closing the pause window. In that case, you can add an extra argument to #endPause "
 	"that denotes the cancel button:")
-CODE (L"#beginPause: \"Learning settings\"")
-	CODE1 (L"#positive: \"Learning rate\", \"0.01\"")
-	CODE1 (L"#choice: \"Directions\", 3")
-		CODE2 (L"#option: \"Forward\"")
-		CODE2 (L"#option: \"Backward\"")
-		CODE2 (L"#option: \"Bidirectional\"")
-CODE (L"clicked = #endPause: \"Cancel\", \"OK\", 2, 1")
-CODE (L"if clicked = 2")
-CODE1 (L"learningRate = learning_rate")
-CODE1 (L"includeForward = directions = 1 or directions = 3")
-CODE1 (L"includeBackward = directions = 2 or directions = 3")
-CODE (L"endif")
-NORMAL (L"In this example, the default button is 2 (i.e. #OK), and the cancel button is 1 (i.e. #Cancel). "
+CODE (U"#beginPause: \"Learning settings\"")
+	CODE1 (U"#positive: \"Learning rate\", \"0.01\"")
+	CODE1 (U"#choice: \"Directions\", 3")
+		CODE2 (U"#option: \"Forward\"")
+		CODE2 (U"#option: \"Backward\"")
+		CODE2 (U"#option: \"Bidirectional\"")
+CODE (U"clicked = #endPause: \"Cancel\", \"OK\", 2, 1")
+CODE (U"if clicked = 2")
+CODE1 (U"learningRate = learning_rate")
+CODE1 (U"includeForward = directions = 1 or directions = 3")
+CODE1 (U"includeBackward = directions = 2 or directions = 3")
+CODE (U"endif")
+NORMAL (U"In this example, the default button is 2 (i.e. #OK), and the cancel button is 1 (i.e. #Cancel). "
 	"The form will now contain no #Stop button, and if the user closes the window, "
 	"this will be the same as clicking #Cancel, namely that $clicked will be 1 (because the Cancel button is the first button) "
 	"and the variables $$learning_rate$, $directions and $$directions\\$ $ will not be changed (i.e. they might remain undefined).")
 MAN_END
 
-MAN_BEGIN (L"Scripting 6.7. Sending a message to another program", L"ppgb", 20140107)
-NORMAL (L"To send messages to running programs that use the Praat shell, "
+MAN_BEGIN (U"Scripting 6.7. Sending a message to another program", U"ppgb", 20151020)
+NORMAL (U"To send messages to running programs that use the Praat shell, "
 	"use $sendpraat (see @@Scripting 8. Controlling Praat from another program@).")
-NORMAL (L"To send a message to another running program that listens to a socket, "
-	"you can use the $sendsocket directive. This works on Unix and Windows only.")
-ENTRY (L"Example")
-NORMAL (L"Suppose we are in the Praat-shell program #Praat, which is a system for doing phonetics by computer. "
+NORMAL (U"To send a message to another running program that listens to a socket, "
+	"you can use the $sendsocket directive. This works on Linux and Windows only.")
+ENTRY (U"Example")
+NORMAL (U"Suppose we are in the Praat-shell program #Praat, which is a system for doing phonetics by computer. "
 	"From this program, we can send a message to the %%non%-Praat-shell program #MovieEdit, "
 	"which does know how to display a sound file:")
-CODE (L"Save as file: \"hallo.wav\"")
-CODE (L"sendsocket fonsg19.hum.uva.nl:6667 display hallo.wav")
-NORMAL (L"In this example, $$fonsg19.hum.uva.nl$ is the computer on which MovieEdit is running; "
+CODE (U"Save as file: \"hallo.wav\"")
+CODE (U"sendsocket fonsg19.hum.uva.nl:6667 display hallo.wav")
+NORMAL (U"In this example, $$fonsg19.hum.uva.nl$ is the computer on which MovieEdit is running; "
 	"you can specify any valid Internet address instead, as long as that computer allows you to send messages to it. "
 	"If MovieEdit is running on the same computer as Praat, you can specify $localhost instead of the full Internet address.")
-NORMAL (L"The number 6667 is the port number on which MovieEdit is listening. Other programs will use different port numbers.")
+NORMAL (U"The number 6667 is the port number on which MovieEdit is listening. Other programs will use different port numbers.")
 MAN_END
 
-MAN_BEGIN (L"Scripting 6.8. Messages to the user", L"ppgb", 201401024)
-NORMAL (L"If the user makes a mistake (e.g. types conflicting settings into your form window), "
+MAN_BEGIN (U"Scripting 6.8. Messages to the user", U"ppgb", 201401024)
+NORMAL (U"If the user makes a mistake (e.g. types conflicting settings into your form window), "
 	"you can use the #exitScript function (@@Scripting 5.8. Quitting|\\SS5.8@) "
 	"to stop the execution of the script with an error message:")
-CODE (L"form My analysis")
-	CODE1 (L"real Starting_time_(s) 0.0")
-	CODE1 (L"real Finishing_time_(s) 1.0")
-CODE (L"endform")
-CODE (L"if finishing_time <= starting_time")
-	CODE1 (L"#exitScript: \"The finishing time should exceed \", starting_time, \" seconds.\"")
-CODE (L"endif")
-CODE (L"\\#  Proceed with the analysis...")
-NORMAL (L"For things that should not normally go wrong, you can use the #assert directive:")
-CODE (L"power = Get power")
-CODE (L"assert power > 0")
-NORMAL (L"This is the same as:")
-CODE (L"if (power > 0) = undefined")
-	CODE1 (L"exitScript: \"Assertion failed in line \", lineNumber, \" (undefined): power > 0\"")
-CODE (L"elsif not (power > 0)")
-	CODE1 (L"exitScript: \"Assertion failed in line \", lineNumber, \" (false): power > 0\"")
-CODE (L"endif")
-NORMAL (L"You can prevent Praat from issuing warning messages:")
-CODE (L"nowarn Save as WAV file: \"hello.wav\"")
-NORMAL (L"This prevents warning messages about clipped samples, for instance.")
-NORMAL (L"You can also prevent Praat from showing a progress window:")
-CODE (L"noprogress To Pitch: 0, 75, 500")
-NORMAL (L"This prevents the progress window from popping up during lengthy operations. "
+CODE (U"form My analysis")
+	CODE1 (U"real Starting_time_(s) 0.0")
+	CODE1 (U"real Finishing_time_(s) 1.0")
+CODE (U"endform")
+CODE (U"if finishing_time <= starting_time")
+	CODE1 (U"#exitScript: \"The finishing time should exceed \", starting_time, \" seconds.\"")
+CODE (U"endif")
+CODE (U"\\#  Proceed with the analysis...")
+NORMAL (U"For things that should not normally go wrong, you can use the #assert directive:")
+CODE (U"power = Get power")
+CODE (U"assert power > 0")
+NORMAL (U"This is the same as:")
+CODE (U"if (power > 0) = undefined")
+	CODE1 (U"exitScript: \"Assertion failed in line \", lineNumber, \" (undefined): power > 0\"")
+CODE (U"elsif not (power > 0)")
+	CODE1 (U"exitScript: \"Assertion failed in line \", lineNumber, \" (false): power > 0\"")
+CODE (U"endif")
+NORMAL (U"You can prevent Praat from issuing warning messages:")
+CODE (U"nowarn Save as WAV file: \"hello.wav\"")
+NORMAL (U"This prevents warning messages about clipped samples, for instance.")
+NORMAL (U"You can also prevent Praat from showing a progress window:")
+CODE (U"noprogress To Pitch: 0, 75, 500")
+NORMAL (U"This prevents the progress window from popping up during lengthy operations. "
 	"Use this only if you want to prevent the user from stopping the execution of the script.")
-NORMAL (L"Finally, you can make Praat ignore error messages:")
-CODE (L"nocheck Remove")
-NORMAL (L"This would cause the script to continue even if there is nothing to remove.")
+NORMAL (U"Finally, you can make Praat ignore error messages:")
+CODE (U"nocheck Remove")
+NORMAL (U"This would cause the script to continue even if there is nothing to remove.")
 MAN_END
 
-MAN_BEGIN (L"Scripting 6.9. Calling from the command line", L"ppgb", 20140212)
-INTRO (L"Previous sections of this tutorial have shown you how to run a Praat script from the Script window. "
+MAN_BEGIN (U"Scripting 6.9. Calling from the command line", U"ppgb", 20151026)
+INTRO (U"Previous sections of this tutorial have shown you how to run a Praat script from the Script window. "
 	"However, you can also call a Praat script from the command line (text console) instead. "
 	"Information that would normally show up in the Info window, then goes to %stdout, "
 	"and error messages go to %stderr. "
-	"You cannot use commands like ##View & Edit#.")
-ENTRY (L"Command lines on Unix and Macintosh")
-NORMAL (L"On Unix or MacOS X, you call Praat scripts from the command line like this:")
-CODE (L"> /people/mietta/praat doit.praat 50 hallo")
-NORMAL (L"or")
-CODE (L"> /Applications/Praat.app/Contents/MacOS/Praat doit.praat 50 hallo")
-NORMAL (L"This opens Praat, runs the script ##doit.praat# with arguments \"50\" and \"hallo\", "
-	"and closes Praat.")
-NORMAL (L"You also have the possibility of running the program interactively from the command line:")
-CODE (L"> /people/mietta/praat -")
-NORMAL (L"You can then type in any of the fixed and dynamic commands, and commands that handle object selection, "
-	"like #select. This method also works in pipes:")
-CODE (L"> echo \"Statistics...\" | /people/mietta/praat -")
-ENTRY (L"Command lines on Windows")
-NORMAL (L"On Windows, you call Praat scripts from the command line like this:")
-CODE (L"e:\\bspraatcon.exe e:\\bsdoit.praat 50 hallo")
-NORMAL (L"Note that you use the program ##praatcon.exe# instead of ##praat.exe#. "
-	"The script will write to the console output in UTF-16 Little Endian encoding. "
-	"If you want to use ISO Latin-1 encoding instead, or if you want to use praatcon's output in a pipe or redirect it to a file, use ##praatcon -a# instead.")
-ENTRY (L"How to get arguments into the script")
-NORMAL (L"In the above example, the script ##doit.praat# requires two arguments. In the script ##doit.praat#, "
-	"you use #form and #endform to receive these arguments. See @@Scripting 6.1. Arguments to the script at . "
-	"As with #runScript, Praat will not present a form window, but simply run the script "
-	"with the arguments given on the command line. The example given in @@Scripting 6.1. Arguments to the script@ "
-	"will be called in the following way:")
-CODE (L"> /people/mietta/praat playSine.praat 550 0.9")
-NORMAL (L"or")
-CODE (L"e:\\bspraatcon.exe playSine.praat 550 0.9")
-MAN_END
-
-MAN_BEGIN (L"Scripting 7. Scripting the editors", L"ppgb", 20040222)
-NORMAL (L"With a Praat script, you can automatize your work in the editors.")
-NORMAL (L"#Warning: if the purpose of your script is to get information about "
+	"You cannot use commands in your script that create windows, such as ##View & Edit#. "
+	"Before describing how to achieve this (from section 4 below on), we first describe "
+	"how the normal Praat, with its usual Objects and Picture (and perhaps Info) window, "
+	"can be started from the command line.")
+
+ENTRY (U"1. Starting Praat from the command line")
+NORMAL (U"Before seeing how a Praat script can be called from the command line, "
+	"you should first know that just calling Praat from the command line just starts up Praat "
+	"with its usual GUI (Graphical User Interface), i.e. with its two windows. "
+	"For instance, on Windows you can start the Command Prompt window (the \"Console\"), and type")
+CODE (U"\"C:\\bsProgram Files\\bsPraat.exe\"")
+NORMAL (U"(including the quotes) if Praat.exe is indeed in the folder $$C:\\bsProgram Files$.")
+NORMAL (U"On the Mac, the executable is hidden inside the $$app$ file, so you open a Terminal window "
+	"and type something like")
+CODE (U"/Applications/Praat.app/Contents/MacOS/Praat")
+NORMAL (U"On Linux, you type into the Terminal something like")
+CODE (U"/usr/bin/praat")
+
+ENTRY (U"2. Calling Praat to open data files")
+NORMAL (U"On Windows, you can open Praat with a sound file and a TextGrid file by typing")
+CODE (U"\"C:\\bsProgram Files\\bsPraat.exe\" --open data\\bshello.wav data\\bshello.TextGrid")
+NORMAL (U"or")
+CODE (U"\"C:\\bsProgram Files\\bsPraat.exe\" --open data/hello.wav data/hello.TextGrid")
+NORMAL (U"at least if your current directory (see the Console's $$cd$ and $$dir$ commands) "
+	"contains the folder $$data$ and that folder contains those two files. "
+	"Praat will start up, and shows the two files as a Sound and a TextGrid object in the list. "
+	"If Praat was already running when you typed the command, "
+	"the two files are added as objects to the existing list in Praat.")
+NORMAL (U"On the Mac, you do")
+CODE (U"/Applications/Praat.app/Contents/MacOS/Praat --open data/hello.wav data/hello.TextGrid")
+NORMAL (U"and on Linux")
+CODE (U"/usr/bin/praat --open data/hello.wav data/hello.TextGrid")
+
+ENTRY (U"3. Calling Praat to open a script")
+NORMAL (U"On Windows, when you type")
+CODE (U"\"C:\\bsProgram Files\\bsPraat.exe\" --open \"my script.praat\"")
+NORMAL (U"Praat will start up, opening the script $$my script.praat$$ in a script window. "
+	"If Praat was already running when you typed the command, "
+	"the script window will appear within the already running instantiation of Praat.")
+NORMAL (U"On the Mac, you do")
+CODE (U"/Applications/Praat.app/Contents/MacOS/Praat --open \"my script.praat\"")
+NORMAL (U"and on Linux")
+CODE (U"/usr/bin/praat data/hello.wav --open \"my script.praat\"")
+NORMAL (U"Note that on all three platforms, you have to supply quotes around the file name "
+	"if that file name contains one or more spaces, as here between $$my$ and $$script$ "
+	"or above between $$Program$ and $$Files$. This because the script languages of "
+	"the Console or Terminal use spaces for separating commands and arguments.")
+
+ENTRY (U"4. Calling Praat to run a script")
+NORMAL (U"Now we are ready to discuss how to run Praat without a GUI.")
+NORMAL (U"On Windows, when you type")
+CODE (U"\"C:\\bsProgram Files\\bsPraat.exe\" \"my script.praat\"")
+NORMAL (U"Praat will execute the script $$my script.praat$$ without showing Praat's GUI, "
+	"i.e. without showing its usual two windows. "
+	"In fact, any output that would normally go to the Info window, "
+	"will now go directly to the Console window in which you typed te command. "
+	"If Praat was already running when you typed the command, "
+	"its windows will not be affected. In fact, the GUI-instantiation of Praat and the Console-instantiation "
+	"can run simultaneously without them noticing each other's existence; "
+	"moreover, multiple Console-instantiations of Praat can run simultaneously, each in their own Console.")
+NORMAL (U"On the Mac, you type")
+CODE (U"/Applications/Praat.app/Contents/MacOS/Praat \"my script.praat\"")
+NORMAL (U"and on Linux")
+CODE (U"/usr/bin/praat data/hello.wav \"my script.praat\"")
+NORMAL (U"What happens on all platforms is that the Console or Terminal starts up Praat, "
+	"then Praat executes the script, and then Praat closes itself.")
+
+ENTRY (U"5. Calling Praat to run a script with arguments")
+NORMAL (U"Consider the following script:")
+CODE (U"form Test command line calls")
+CODE1 (U"sentence First_text I love you")
+CODE1 (U"real Beep_duration 0.4")
+CODE1 (U"sentence Second_text Me too")
+CODE (U"endform")
+CODE (U"")
+CODE (U"writeInfoLine: \"She: \"\"\", first_text$, \"\"\"\"")
+CODE (U"appendInfoLine: \"He: \"\"\", second_text$, \"\"\"\"")
+CODE (U"")
+CODE (U"synth1 = Create SpeechSynthesizer: \"English\", \"f1\"")
+CODE (U"Play text: first_text\\$ ")
+CODE (U"Create Sound as pure tone: \"beep\", 1, 0.0, beep_duration,")
+CODE (U"... 44100, 440, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+CODE (U"synth2 = Create SpeechSynthesizer: \"English\", \"m1\"")
+CODE (U"Play text: second_text\\$ ")
+NORMAL (U"When you run this script from within Praat, it writes two lines to the Info window "
+	"and plays first a female voice speaking the first sentence, then a beep, and then a male voice "
+	"speaking the second sentence. To make this happen from the Windows command line instead, you type")
+CODE (U"\"C:\\bsProgram Files\\bsPraat.exe\" testCommandLineCalls.praat \"I love you\" 0.4 \"Me too\"")
+NORMAL (U"In the Mac terminal, you type")
+CODE (U"/Applications/Praat.app/Contents/MacOS/Praat testCommandLineCalls.praat \"I love you\" 0.4 \"Me too\"")
+NORMAL (U"and in the Linux terminal, you do")
+CODE (U"/usr/bin/praat data/hello.wav testCommandLineCalls.praat \"I love you\" 0.4 \"Me too\"")
+NORMAL (U"Note that each argument that contains one or more spaces has to be put within quotes, "
+	"on all three platforms. As with #runScript, Praat will not present a form window, "
+	"but simply run the script with the arguments given on the command line "
+	"(see @@Scripting 6.1. Arguments to the script@).")
+NORMAL (U"What then happens on all three platforms is that a console instantiation of Praat writes "
+	"the two lines to the Console window and plays the three sounds.")
+
+ENTRY (U"6. Calling Praat from Python")
+NORMAL (U"You can run the above script from several programming languages, not just from a Console or Terminal. "
+	"In Python, for instance, you can do it using the same syntax as you would use in the Console or Terminal:")
+CODE (U"import os")
+CODE (U"os.system ('\"C:\\bs\\bsProgram Files\\bs\\bsPraat.exe\" testCommandLineCalls.praat \"I love you\" 0.4 \"Me too\"')")
+NORMAL (U"Note that you have to double the backslashes!")
+NORMAL (U"A disadvantage of the $$os.system$ method is that you have to use quotes within quotes. "
+	"A somewhat cleaner approach is:")
+CODE (U"import subprocess")
+CODE (U"subprocess.call(['C:\\bs\\bsProgram Files\\bs\\bsPraat.exe', 'testCommandLineCalls.praat', 'I love you', '0.4', 'Me too'])")
+NORMAL (U"This way you specify the arguments directly, with quotes only because they are all strings, "
+	"but without having to worry about spaces. And perhaps even more importantly, this syntax "
+	"makes it easy to use variables as arguments, as in:")
+CODE (U"first_line = 'I love you'")
+CODE (U"second_line = 'me too'")
+CODE (U"subprocess.call(['C:\\bs\\bsProgram Files\\bs\\bsPraat.exe', 'testCommandLineCalls.praat', first_line, '0.4', second_line])")
+
+ENTRY (U"7. Running Praat interactively from the command line")
+NORMAL (U"On the Mac and Linux, you have the possibility of running the program interactively from the command line:")
+CODE (U"> /usr/bin/praat -")
+NORMAL (U"You can then type in any of the fixed and dynamic commands, and commands that handle object selection, "
+	"such as #selectObject. This method also works in pipes:")
+CODE (U"> echo \"Statistics...\" | /usr/bin/praat -")
+
+ENTRY (U"8. Calling Praat from a web server")
+NORMAL (U"If you call Praat from a web server, you typically do not want to read and write its preferences and buttons files. "
+	"To achieve this, you use the ##--no-pref-files# command line option before the script name:")
+CODE (U"> /users/apache/praat --no-pref-files /user/apache/scripts/computeAnalysis.praat 1234 blibla")
+
+ENTRY (U"9. All command line options")
+TAG (U"##--open")
+DEFINITION (U"Interpret the command line arguments as files to be opened in the GUI "
+	"(instead of as a script file name and its arguments).")
+TAG (U"##--no-pref-files#")
+DEFINITION (U"Ignore the preferences file and the buttons file at start-up, and don't write them when quitting (see above).")
+TAG (U"##--no-plugins#")
+DEFINITION (U"Don't activate the plugins at start-up.")
+TAG (U"##--pref-dir=#/var/www/praat_plugins")
+DEFINITION (U"Set the preferences directory to /var/www/praat_plugins (for instance). "
+	"This can come in handy if you require access to preference files and/or plugins that are not in your home directory.")
+TAG (U"##--version")
+DEFINITION (U"Print the Praat version.")
+TAG (U"##--help")
+DEFINITION (U"Print this list of command line options.")
+TAG (U"##-a#, ##--ansi#")
+DEFINITION (U"On Windows: use ISO Latin-1 encoding instead of the Console's native UTF-16 Little Endian encoding. "
+	"This is not recommended, but might be necessary if you want to use Praat in a pipe "
+	"or with redirection to a file.")
+MAN_END
+
+MAN_BEGIN (U"Scripting 7. Scripting the editors", U"ppgb", 20040222)
+NORMAL (U"With a Praat script, you can automatize your work in the editors.")
+NORMAL (U"#Warning: if the purpose of your script is to get information about "
 	"analyses (pitch, formants, intensity, spectrogram) from the Sound, "
 	"we do %not advise to script the Sound editor window. "
 	"It is much simpler, faster, and more reproducible to create the analyses "
@@ -3238,742 +3350,742 @@ NORMAL (L"#Warning: if the purpose of your script is to get information about "
 	"to extract information from the analyses. This also applies if you want to use a TextGrid "
 	"to determine the times at which you want to query the analyses. "
 	"See @@Scripting examples at .")
-LIST_ITEM (L"@@Scripting 7.1. Scripting an editor from a shell script@ (editor/endeditor)")
-LIST_ITEM (L"@@Scripting 7.2. Scripting an editor from within@")
-MAN_END
-
-MAN_BEGIN (L"Scripting 7.1. Scripting an editor from a shell script", L"ppgb", 20140526)
-NORMAL (L"From a Praat shell script, you can switch to an editor and back again:")
-CODE (L"sound\\$  = \"hallo\"")
-CODE (L"start = 0.3")
-CODE (L"finish = 0.7")
-CODE (L"sound = Read from file: sound\\$  + \".aifc\"")
-CODE (L"View & Edit")
-CODE (L"#editor: sound")
-	CODE1 (L"Zoom: start, finish")
-CODE (L"#endeditor")
-CODE (L"Play")
-NORMAL (L"This script reads a sound file from disk, pops up an editor for the resulting object, "
+LIST_ITEM (U"@@Scripting 7.1. Scripting an editor from a shell script@ (editor/endeditor)")
+LIST_ITEM (U"@@Scripting 7.2. Scripting an editor from within@")
+MAN_END
+
+MAN_BEGIN (U"Scripting 7.1. Scripting an editor from a shell script", U"ppgb", 20140526)
+NORMAL (U"From a Praat shell script, you can switch to an editor and back again:")
+CODE (U"sound\\$  = \"hallo\"")
+CODE (U"start = 0.3")
+CODE (U"finish = 0.7")
+CODE (U"sound = Read from file: sound\\$  + \".aifc\"")
+CODE (U"View & Edit")
+CODE (U"#editor: sound")
+	CODE1 (U"Zoom: start, finish")
+CODE (U"#endeditor")
+CODE (U"Play")
+NORMAL (U"This script reads a sound file from disk, pops up an editor for the resulting object, "
 	"makes this editor zoom in on the part between 0.3 and 0.7 seconds, "
 	"and returns to the Praat shell to play the entire sound.")
-NORMAL (L"After #editor you can either give the unique id of the object, as above, or its name:")
-CODE (L"#editor: \"Sound \" + sound\\$ ")
+NORMAL (U"After #editor you can either give the unique id of the object, as above, or its name:")
+CODE (U"#editor: \"Sound \" + sound\\$ ")
 MAN_END
 
-MAN_BEGIN (L"Scripting 7.2. Scripting an editor from within", L"ppgb", 20140113)
-NORMAL (L"This section will show how you can permanently extend the functionality of an editor.")
-NORMAL (L"As an example, consider the following problem: you want to see a graphic representation "
+MAN_BEGIN (U"Scripting 7.2. Scripting an editor from within", U"ppgb", 20140113)
+NORMAL (U"This section will show how you can permanently extend the functionality of an editor.")
+NORMAL (U"As an example, consider the following problem: you want to see a graphic representation "
 	"of the spectrum of the sound around the cursor position in the SoundEditor. To achieve this, "
 	"follow these steps:")
-LIST_ITEM (L"1. Create a Sound.")
-LIST_ITEM (L"2. View it in a SoundEditor by clicking @@View & Edit at .")
-LIST_ITEM (L"3. Choose ##New editor script# from the @@File menu@ in the SoundEditor. The resulting @ScriptEditor "
+LIST_ITEM (U"1. Create a Sound.")
+LIST_ITEM (U"2. View it in a SoundEditor by clicking @@View & Edit at .")
+LIST_ITEM (U"3. Choose ##New editor script# from the @@File menu@ in the SoundEditor. The resulting @ScriptEditor "
 	"will have a name like \"untitled script [Sound hallo]\".")
-LIST_ITEM (L"4. Type the following lines into the ScriptEditor:")
-CODE2 (L"cursor = Get cursor")
-CODE2 (L"Select: cursor - 0.02, cursor + 0.02")
-CODE2 (L"Extract selected sound (windowed): \"slice\", \"Kaiser2\", 2, \"no\"")
-CODE1 (L"#endeditor")
-CODE1 (L"To Spectrum: \"yes\"")
-CODE1 (L"View & Edit")
-NORMAL (L"If you choose #Run from the #Run menu in the ScriptEditor, a region of 40 milliseconds around the "
+LIST_ITEM (U"4. Type the following lines into the ScriptEditor:")
+CODE2 (U"cursor = Get cursor")
+CODE2 (U"Select: cursor - 0.02, cursor + 0.02")
+CODE2 (U"Extract selected sound (windowed): \"slice\", \"Kaiser2\", 2, \"no\"")
+CODE1 (U"#endeditor")
+CODE1 (U"To Spectrum: \"yes\"")
+CODE1 (U"View & Edit")
+NORMAL (U"If you choose #Run from the #Run menu in the ScriptEditor, a region of 40 milliseconds around the "
 	"current cursor position in the SoundEditor will become selected. This piece will be copied to the list of objects, "
 	"after applying a double Kaiser window (total length 80 ms). Thus, a Sound named \"slice\" will appear in the list. "
 	"Subsequently, a Spectrum object also called \"slice\" will appear in the list, and a SpectrumEditor titled "
 	"\"Spectrum slice\" will finally appear on your screen.")
-LIST_ITEM (L"5. Save the script to disk, e.g. as /us/miep/spectrum.praat. The title of the ScriptEditor will change accordingly.")
-LIST_ITEM (L"6. Since you will want this script to be available in all future SoundEditors, you choose ##Add to menu...# from the #File menu. "
+LIST_ITEM (U"5. Save the script to disk, e.g. as /us/miep/spectrum.praat. The title of the ScriptEditor will change accordingly.")
+LIST_ITEM (U"6. Since you will want this script to be available in all future SoundEditors, you choose ##Add to menu...# from the #File menu. "
 	"For the %Window, you specify \"SoundEditor\" (this is preset). For the %Menu, you may want to choose \"Spectrum\" "
 	"instead of the preset value (\"File\"). For the name of the %Command, you type something like \"Show spectrum at cursor\" "
 	"(instead of \"Do it...\"). Then you click #OK.")
-NORMAL (L"The command will be visible in every SoundEditor that you create from now on. "
+NORMAL (U"The command will be visible in every SoundEditor that you create from now on. "
 	"To see this, close the one visible SoundEditor, select the original Sound, choose ##View & Edit# again, and inspect the #Spectrum menu. "
 	"You can now view the spectrum around the cursor just by choosing this menu command.")
-NORMAL (L"After you leave Praat and start it again, the command will continue to appear in the SoundEditor. "
+NORMAL (U"After you leave Praat and start it again, the command will continue to appear in the SoundEditor. "
 	"If you don't like the command any longer, you can remove it with the @ButtonEditor, which you can start "
 	"by choosing #Buttons from the #Preferences submenu of the @@Praat menu at .")
-ENTRY (L"Improving your script")
-NORMAL (L"The above spectrum-viewing example has a number of disadvantages. It clutters the object list with a number "
+ENTRY (U"Improving your script")
+NORMAL (U"The above spectrum-viewing example has a number of disadvantages. It clutters the object list with a number "
 	"of indiscriminable Sounds and Spectra called \"slice\", and the spectrum is shown up to the Nyquist frequency "
 	"while we may just be interested in the lower 5000 Hz. Furthermore, the original selection in the SoundEditor is lost.")
-NORMAL (L"To improve the script, we open it again with ##Open editor script...# from the #File menu in the SoundEditor. After every change, "
+NORMAL (U"To improve the script, we open it again with ##Open editor script...# from the #File menu in the SoundEditor. After every change, "
 	"we can run it with #Run from the #Run menu again; alternatively, we could save it (with #Save from the #File menu) and choose our new "
 	"\"Show spectrum at cursor\" button (this button will always run the version on disk, never the one viewed in a ScriptEditor).")
-NORMAL (L"To zoom in on the first 5000 Hz, we add the following code at the end of our script:")
-CODE (L"#editor: \"Spectrum slice\"")
-	CODE1 (L"Zoom: 0, 5000")
-NORMAL (L"To get rid of the \"Sound slice\", we can add:")
-CODE (L"#endeditor")
-CODE (L"#removeObject: \"Sound slice\"")
-NORMAL (L"Note that #$endeditor is needed to change from the environment of a SpectrumEditor to the environment of the object & picture windows.")
-NORMAL (L"If you now choose the \"Show spectrum at cursor\" button for several cursor positions, you will notice that all those editors have the same name. "
+NORMAL (U"To zoom in on the first 5000 Hz, we add the following code at the end of our script:")
+CODE (U"#editor: \"Spectrum slice\"")
+	CODE1 (U"Zoom: 0, 5000")
+NORMAL (U"To get rid of the \"Sound slice\", we can add:")
+CODE (U"#endeditor")
+CODE (U"#removeObject: \"Sound slice\"")
+NORMAL (U"Note that #$endeditor is needed to change from the environment of a SpectrumEditor to the environment of the object & picture windows.")
+NORMAL (U"If you now choose the \"Show spectrum at cursor\" button for several cursor positions, you will notice that all those editors have the same name. "
 	"To remedy the ambiguity of the line $$#editor Spectrum slice$, we give each slice a better name. For example, if the cursor was at "
 	"635 milliseconds, the slice could be named \"635ms\". We can achieve this by changing the extraction in the following way:")
-CODE (L"milliseconds = round (cursor*1000)")
-CODE (L"Extract selection sound (windowed): string\\$  (milliseconds) + \"ms\", \"Kaiser2\", 2, \"no\"")
-NORMAL (L"The names of the Sound and Spectrum objects will now have more chance of being unique. Two lines will have to be edited trivially.")
-NORMAL (L"Finally, we will reset the selection to the original. At the top of the script, we add two lines to remember the positions of the selection markers:")
-CODE (L"start = Get start of selection")
-CODE (L"end = Get end of selection")
-NORMAL (L"At the bottom, we reset the selection:")
-CODE (L"#editor")
-CODE1 (L"Select: start, end")
-NORMAL (L"Note that the #$editor directive if not followed by the name of an editor, returns the script to the original environment.")
-NORMAL (L"The complete script is:")
-	CODE1 (L"start = Get start of selection")
-	CODE1 (L"end = Get end of selection")
-	CODE1 (L"cursor = Get cursor")
-	CODE1 (L"Select: cursor - 0.02, cursor + 0.02")
-	CODE1 (L"\\#  Create a name. E.g. \"670ms\" means at 670 milliseconds.")
-	CODE1 (L"milliseconds = round (cursor*1000)")
-	CODE1 (L"Extract windowed selection: string\\$  (milliseconds) + \"ms\", \"Kaiser2\", 2, \"no\"")
-CODE (L"#endeditor")
-CODE (L"To Spectrum: \"yes\"")
-CODE (L"View & Edit")
-CODE (L"#editor: \"Spectrum \" + string\\$  (milliseconds) + \"ms\"")
-	CODE1 (L"Zoom: 0, 5000")
-CODE (L"#endeditor")
-CODE (L"#removeObject: \"Sound \" + string\\$  (milliseconds) + \"ms\"")
-CODE (L"#editor")
-	CODE1 (L"Select: start, end")
-NORMAL (L"This script is useful as it stands. It is good enough for safe use. For instance, if the created Sound object has the same name "
+CODE (U"milliseconds = round (cursor*1000)")
+CODE (U"Extract selection sound (windowed): string\\$  (milliseconds) + \"ms\", \"Kaiser2\", 2, \"no\"")
+NORMAL (U"The names of the Sound and Spectrum objects will now have more chance of being unique. Two lines will have to be edited trivially.")
+NORMAL (U"Finally, we will reset the selection to the original. At the top of the script, we add two lines to remember the positions of the selection markers:")
+CODE (U"start = Get start of selection")
+CODE (U"end = Get end of selection")
+NORMAL (U"At the bottom, we reset the selection:")
+CODE (U"#editor")
+CODE1 (U"Select: start, end")
+NORMAL (U"Note that the #$editor directive if not followed by the name of an editor, returns the script to the original environment.")
+NORMAL (U"The complete script is:")
+	CODE1 (U"start = Get start of selection")
+	CODE1 (U"end = Get end of selection")
+	CODE1 (U"cursor = Get cursor")
+	CODE1 (U"Select: cursor - 0.02, cursor + 0.02")
+	CODE1 (U"\\#  Create a name. E.g. \"670ms\" means at 670 milliseconds.")
+	CODE1 (U"milliseconds = round (cursor*1000)")
+	CODE1 (U"Extract windowed selection: string\\$  (milliseconds) + \"ms\", \"Kaiser2\", 2, \"no\"")
+CODE (U"#endeditor")
+CODE (U"To Spectrum: \"yes\"")
+CODE (U"View & Edit")
+CODE (U"#editor: \"Spectrum \" + string\\$  (milliseconds) + \"ms\"")
+	CODE1 (U"Zoom: 0, 5000")
+CODE (U"#endeditor")
+CODE (U"#removeObject: \"Sound \" + string\\$  (milliseconds) + \"ms\"")
+CODE (U"#editor")
+	CODE1 (U"Select: start, end")
+NORMAL (U"This script is useful as it stands. It is good enough for safe use. For instance, if the created Sound object has the same name "
 	"as an already existing Sound object, it will be the newly created Sound object that will be removed by #removeObject, "
 	"because in case of ambiguity #removeObject always removes the most recently created object of that name.")
 MAN_END
 
-MAN_BEGIN (L"sendpraat", L"ppgb", 20000927)
-NORMAL (L"See @@Scripting 8. Controlling Praat from another program at .")
+MAN_BEGIN (U"sendpraat", U"ppgb", 20000927)
+NORMAL (U"See @@Scripting 8. Controlling Praat from another program at .")
 MAN_END
 
-MAN_BEGIN (L"Scripting 8. Controlling Praat from another program", L"ppgb", 20021218)
-LIST_ITEM (L"@@Scripting 8.1. The sendpraat subroutine")
-LIST_ITEM (L"@@Scripting 8.2. The sendpraat program")
-LIST_ITEM (L"@@Scripting 8.3. The sendpraat directive")
+MAN_BEGIN (U"Scripting 8. Controlling Praat from another program", U"ppgb", 20021218)
+LIST_ITEM (U"@@Scripting 8.1. The sendpraat subroutine")
+LIST_ITEM (U"@@Scripting 8.2. The sendpraat program")
+LIST_ITEM (U"@@Scripting 8.3. The sendpraat directive")
 MAN_END
 
-MAN_BEGIN (L"Scripting 8.1. The sendpraat subroutine", L"ppgb", 20140212)
-INTRO (L"A subroutine for sending messages to a %running Praat. "
-	"Also a Unix, MacOS, or DOS console program with the same purpose.")
-ENTRY (L"Syntax")
-LIST_ITEM (L"##sendpraat (void *#%display##, const char *#%program##, long #%timeOut##, char *#%text##);")
-ENTRY (L"Arguments")
-TAG (L"%display")
-DEFINITION (L"the display pointer if the subroutine is called from a running X program; "
+MAN_BEGIN (U"Scripting 8.1. The sendpraat subroutine", U"ppgb", 20151020)
+INTRO (U"A subroutine for sending messages to a %running Praat. "
+	"Also a Windows console, MacOS, or Linux console program with the same purpose.")
+ENTRY (U"Syntax")
+LIST_ITEM (U"##sendpraat (void *#%display##, const char *#%program##, long #%timeOut##, char *#%text##);")
+ENTRY (U"Arguments")
+TAG (U"%display")
+DEFINITION (U"the display pointer if the subroutine is called from a running X program; "
 	"if NULL, sendpraat will open the display by itself. On Windows and Macintosh, "
 	"this argument is ignored.")
-TAG (L"%program")
-DEFINITION (L"the name of a running program that uses the Praat shell, e.g. \"Praat\" or \"ALS\". "
-	"The first letter may be specified as lower or upper case; it will be converted to lower case for Unix "
-	"and to upper case for Macintosh and Windows.")
-TAG (L"%timeOut (Unix and Macintosh only)")
-DEFINITION (L"the number of seconds that sendpraat will wait for an answer "
+TAG (U"%program")
+DEFINITION (U"the name of a running program that uses the Praat shell, e.g. \"Praat\" or \"ALS\". "
+	"The first letter may be specified as lower or upper case; it will be converted "
+	"to upper case for Windows or MacOS and to lower case for Linux.")
+TAG (U"%timeOut (MacOS and Linux only)")
+DEFINITION (U"the number of seconds that sendpraat will wait for an answer "
 	"before writing an error message. A %timeOut of 0 means that "
 	"the message will be sent asynchronously, i.e., that sendpraat "
 	"will return immediately without issuing any error message.")
-TAG (L"%text")
-DEFINITION (L"the script text to be sent. Sendpraat may alter this text!")
-ENTRY (L"Example 1: killing a program")
-CODE (L"char message [100], *errorMessage;")
-CODE (L"strcpy (message, \"Quit\");")
-CODE (L"errorMessage = #sendpraat (NULL, \"praat\", 0, message);")
-CODE (L"if (errorMessage != NULL) fprintf (stderr, \"\\% s\", errorMessage);")
-NORMAL (L"This causes the program #Praat to quit (gracefully), because #Quit is a fixed "
+TAG (U"%text")
+DEFINITION (U"the script text to be sent. Sendpraat may alter this text!")
+ENTRY (U"Example 1: killing a program")
+CODE (U"char message [100], *errorMessage;")
+CODE (U"strcpy (message, \"Quit\");")
+CODE (U"errorMessage = #sendpraat (NULL, \"praat\", 0, message);")
+CODE (U"if (errorMessage != NULL) fprintf (stderr, \"\\% s\", errorMessage);")
+NORMAL (U"This causes the program #Praat to quit (gracefully), because #Quit is a fixed "
 	"command in one of the menus of that program. "
-	"On Unix and Macintosh, sendpraat returns immediately; on Windows, the %timeOut argument is ignored. "
+	"On MacOS and Linux, sendpraat returns immediately; on Windows, the %timeOut argument is ignored. "
 	"The return value %errorMessage is a statically allocated string internal to sendpraat, "
 	"and is overwritten by the next call to sendpraat.")
-ENTRY (L"Example 2: playing a sound file in reverse")
-NORMAL (L"Suppose you have a sound file whose name is in the variable $fileName, "
+ENTRY (U"Example 2: playing a sound file in reverse")
+NORMAL (U"Suppose you have a sound file whose name is in the variable $fileName, "
 	"and you want the program #Praat, which can play sounds, "
 	"to play this sound backwards.")
-CODE (L"char message [1000], *errorMessage;")
-CODE (L"sprintf (message, \"Read from file... \\% s\\bsnPlay reverse\\bsnRemove\", fileName);")
-CODE (L"errorMessage = #sendpraat (NULL, \"praat\", 1000, message);")
-NORMAL (L"This will work because ##Play reverse# is an action command "
+CODE (U"char message [1000], *errorMessage;")
+CODE (U"sprintf (message, \"Read from file... \\% s\\bsnPlay reverse\\bsnRemove\", fileName);")
+CODE (U"errorMessage = #sendpraat (NULL, \"praat\", 1000, message);")
+NORMAL (U"This will work because ##Play reverse# is an action command "
 	"that becomes available in the dynamic menu when a Sound is selected. "
-	"On Unix, sendpraat will allow #Praat at most 1000 seconds to perform this.")
-ENTRY (L"Example 3: executing a large script file")
-NORMAL (L"Sometimes, it may be unpractical to send a large script directly to #sendpraat. "
+	"On Linux, sendpraat will allow #Praat at most 1000 seconds to perform this.")
+ENTRY (U"Example 3: executing a large script file")
+NORMAL (U"Sometimes, it may be unpractical to send a large script directly to #sendpraat. "
 	"Fortunately, the receiving program knows #runScript:")
-CODE (L"char message [100], *errorMessage;")
-CODE (L"strcpy (message, \"runScript: \\bs\"doAll.praat\\bs\", 20\");")
-CODE (L"errorMessage = #sendpraat (NULL, \"praat\", 0, message);")
-NORMAL (L"This causes the program #Praat to run the script ##doAll.praat# with an argument of \"20\".")
-ENTRY (L"How to download")
-NORMAL (L"You can download the source code of the sendpraat subroutine and program "
+CODE (U"char message [100], *errorMessage;")
+CODE (U"strcpy (message, \"runScript: \\bs\"doAll.praat\\bs\", 20\");")
+CODE (U"errorMessage = #sendpraat (NULL, \"praat\", 0, message);")
+NORMAL (U"This causes the program #Praat to run the script ##doAll.praat# with an argument of \"20\".")
+ENTRY (U"How to download")
+NORMAL (U"You can download the source code of the sendpraat subroutine and program "
 	"via ##www.praat.org# or from ##http://www.fon.hum.uva.nl/praat/sendpraat.html#.")
-ENTRY (L"Instead")
-NORMAL (L"Instead of using sendpraat, you can also just take the following simple steps in your program:")
-LIST_ITEM (L"1. on Linux, write the script that you want to run, and save it as ##~/.praat-dir/message#;")
-LIST_ITEM (L"2. get Praat's process id from ##~/.praat-dir/pid#;")
-LIST_ITEM (L"3. if Praat's process id is e.g. 1178, send it a SIGUSR1 signal: $$kill -USR1 1178")
-NORMAL (L"If the first line of your script is the comment \"\\#  999\", where 999 stands for the process id of your program, "
+ENTRY (U"Instead")
+NORMAL (U"Instead of using sendpraat, you can also just take the following simple steps in your program:")
+LIST_ITEM (U"1. on Linux, write the script that you want to run, and save it as ##~/.praat-dir/message#;")
+LIST_ITEM (U"2. get Praat's process id from ##~/.praat-dir/pid#;")
+LIST_ITEM (U"3. if Praat's process id is e.g. 1178, send it a SIGUSR1 signal: $$kill -USR1 1178")
+NORMAL (U"If the first line of your script is the comment \"\\#  999\", where 999 stands for the process id of your program, "
 	"Praat will send your program a SIGUSR2 signal back when it finishes handling the script.")
-ENTRY (L"See also")
-NORMAL (L"To start a program from the command line instead and sending it a message, "
+ENTRY (U"See also")
+NORMAL (U"To start a program from the command line instead and sending it a message, "
 	"you would not use #sendpraat, but instead run the program with a script file as an argument. "
 	"See @@Scripting 6.9. Calling from the command line at .")
 MAN_END
 
-MAN_BEGIN (L"Scripting 8.2. The sendpraat program", L"ppgb", 20140212)
-INTRO (L"A Unix or DOS console program for sending messages to a %running Praat program.")
-ENTRY (L"Syntax")
-CODE (L"#sendpraat [%timeOut] %program %message...")
-NORMAL (L"For the meaning of the arguments, see @@Scripting 8.1. The sendpraat subroutine|the sendpraat subroutine at .")
-ENTRY (L"Example 1: killing a program")
-CODE (L"sendpraat 0 praat Quit")
-NORMAL (L"Causes the program #Praat to quit (gracefully), because #Quit is a fixed command in one of its menus. "
+MAN_BEGIN (U"Scripting 8.2. The sendpraat program", U"ppgb", 20151020)
+INTRO (U"A Windows console or Unix (MacOS, Linux) terminal program for sending messages to a %running Praat program.")
+ENTRY (U"Syntax")
+CODE (U"#sendpraat [%timeOut] %program %message...")
+NORMAL (U"For the meaning of the arguments, see @@Scripting 8.1. The sendpraat subroutine|the sendpraat subroutine at .")
+ENTRY (U"Example 1: killing a program")
+CODE (U"sendpraat 0 praat Quit")
+NORMAL (U"Causes the program #Praat to quit (gracefully), because #Quit is a fixed command in one of its menus. "
 	"On Unix, #sendpraat returns immediately; on Windows, you leave out the %timeOut argument.")
-ENTRY (L"Example 2: playing a sound file in reverse")
-CODE (L"sendpraat 1000 praat \"Read from file... hello.wav\" \"Play reverse\" \"Remove\"")
-NORMAL (L"This works because ##Play reverse# is an action command "
+ENTRY (U"Example 2: playing a sound file in reverse")
+CODE (U"sendpraat 1000 praat \"Read from file... hello.wav\" \"Play reverse\" \"Remove\"")
+NORMAL (U"This works because ##Play reverse# is an action command "
 	"that becomes available in the dynamic menu of the #Praat program when a Sound is selected. "
 	"On Unix, sendpraat will allow #Praat at most 1000 seconds to perform this.")
-NORMAL (L"Each line is a separate argument. Lines that contain spaces should be put inside double quotes.")
-ENTRY (L"Example 3: drawing")
-CODE (L"sendpraat als \"for i from 1 to 5\" \"Draw circle: 0.5, 0.5, i\" \"endfor\"")
-NORMAL (L"This causes the program #Als to draw five concentric circles into the Picture window.")
-ENTRY (L"Example 4: running a large script")
-CODE (L"sendpraat praat \"runScript: \\bs\"doAll.praat\\bs\", 20\"")
-NORMAL (L"This causes the program #Praat to execute the script ##doAll.praat# with an argument of \"20\".")
+NORMAL (U"Each line is a separate argument. Lines that contain spaces should be put inside double quotes.")
+ENTRY (U"Example 3: drawing")
+CODE (U"sendpraat als \"for i from 1 to 5\" \"Draw circle: 0.5, 0.5, i\" \"endfor\"")
+NORMAL (U"This causes the program #Als to draw five concentric circles into the Picture window.")
+ENTRY (U"Example 4: running a large script")
+CODE (U"sendpraat praat \"runScript: \\bs\"doAll.praat\\bs\", 20\"")
+NORMAL (U"This causes the program #Praat to execute the script ##doAll.praat# with an argument of \"20\".")
 MAN_END
 
-MAN_BEGIN (L"Scripting 8.3. The sendpraat directive", L"ppgb", 20140112)
-INTRO (L"Besides being a subroutine (@@Scripting 8.1. The sendpraat subroutine@) "
+MAN_BEGIN (U"Scripting 8.3. The sendpraat directive", U"ppgb", 20140112)
+INTRO (U"Besides being a subroutine (@@Scripting 8.1. The sendpraat subroutine@) "
 	"and a program (@@Scripting 8.2. The sendpraat program@), @sendpraat "
 	"can also be called from within a Praat script.")
-ENTRY (L"Example 1: killing a program")
-NORMAL (L"Suppose we are in the Praat-shell program #Als, which is a browser for dictionaries, "
+ENTRY (U"Example 1: killing a program")
+NORMAL (U"Suppose we are in the Praat-shell program #Als, which is a browser for dictionaries, "
 	"and we want to kill the Praat-shell program #Praat, which is a program for phonetics research:")
-CODE (L"beginSendpraat: \"Praat\"")
-CODE1 (L"Quit")
-CODE (L"endSendpraat")
-ENTRY (L"Example 2: playing a sound")
-NORMAL (L"Suppose we are in the Praat-shell program #Als, which is a browser for dictionaries, "
+CODE (U"beginSendpraat: \"Praat\"")
+CODE1 (U"Quit")
+CODE (U"endSendpraat")
+ENTRY (U"Example 2: playing a sound")
+NORMAL (U"Suppose we are in the Praat-shell program #Als, which is a browser for dictionaries, "
 	"and has no idea of what a %sound is. From this program, we can play a sound file "
 	"by sending a message to the Praat-shell program #Praat, which does know about sounds:")
-CODE (L"fileName\\$  = chooseReadFile\\$ : \"Play a sound file\"")
-CODE (L"beginSendpraat: \"Praat\", \"fileName\\$ \"")
-CODE1 (L"Read from file: fileName\\$ ")
-CODE1 (L"Play")
-CODE1 (L"Remove")
-CODE (L"endSendpraat")
-NORMAL (L"After #beginSendpraat, you first mention the name of the receiving program (here \"Praat\"), "
+CODE (U"fileName\\$  = chooseReadFile\\$ : \"Play a sound file\"")
+CODE (U"beginSendpraat: \"Praat\", \"fileName\\$ \"")
+CODE1 (U"Read from file: fileName\\$ ")
+CODE1 (U"Play")
+CODE1 (U"Remove")
+CODE (U"endSendpraat")
+NORMAL (U"After #beginSendpraat, you first mention the name of the receiving program (here \"Praat\"), "
         "then the names of the variables you want the receiving program to know about.")
-NORMAL (L"To have the receiving program return information to you, specify the variables that are to be handed back:")
-CODE (L"fileName\\$  = chooseReadFile\\$ : \"Measure a sound file\"")
-CODE (L"beginSendpraat: \"Praat\", \"fileName\\$ \"")
-CODE1 (L"Read from file: fileName\\$ ")
-CODE1 (L"duration = Get total duration")
-CODE1 (L"Remove")
-CODE (L"endSendpraat: \"duration\"")
-CODE (L"writeInfoLine: \"That sound file lasts \", duration, \" seconds.\"")
+NORMAL (U"To have the receiving program return information to you, specify the variables that are to be handed back:")
+CODE (U"fileName\\$  = chooseReadFile\\$ : \"Measure a sound file\"")
+CODE (U"beginSendpraat: \"Praat\", \"fileName\\$ \"")
+CODE1 (U"Read from file: fileName\\$ ")
+CODE1 (U"duration = Get total duration")
+CODE1 (U"Remove")
+CODE (U"endSendpraat: \"duration\"")
+CODE (U"writeInfoLine: \"That sound file lasts \", duration, \" seconds.\"")
 MAN_END
 
 /*
-ENTRY (L"How to run a script")
-NORMAL (L"You can run scripts from the @ScriptEditor. If you will have to use the script very often, "
+ENTRY (U"How to run a script")
+NORMAL (U"You can run scripts from the @ScriptEditor. If you will have to use the script very often, "
 	"it is advisable to create a button for it in the fixed menu or in a dynamic menu. See the "
 	"@ScriptEditor manual page.")
-NORMAL (L"(You can also run scripts from the command line. See @@Scripting 6.9. Calling from the command line|\\SS6.9@)")
+NORMAL (U"(You can also run scripts from the command line. See @@Scripting 6.9. Calling from the command line|\\SS6.9@)")
 */
 
-MAN_BEGIN (L"Scripting 9.1. Turning a script into a stand-alone program", L"ppgb", 20140112)
-INTRO (L"You can turn your script into a double-clickable stand-alone program by including it into Praat's #main procedure. "
+MAN_BEGIN (U"Scripting 9.1. Turning a script into a stand-alone program", U"ppgb", 20150713)
+INTRO (U"You can turn your script into a double-clickable stand-alone program by including it into Praat's #main procedure. "
 	"If you want to try this, you should already know how to compile and link the Praat program on your computer.")
-NORMAL (L"These stand-alone programs do not show the Objects window and the Picture window; "
+NORMAL (U"These stand-alone programs do not show the Objects window and the Picture window; "
 	"therefore, you will usually want to use @@Demo window@ commands in your script. Here is an example:")
-CODE (L"\\# include \"praat.h\"")
-CODE (L"")
-CODE (L"const wchar_t myScript [ ] = L\"\"")
-	CODE1 (L"\"demo Text: 0.5, \\bs\"centre\\bs\", 0.5, \\bs\"half\\bs\", \\bs\"Hello world\\bs\"\\bsn\"")
-	CODE1 (L"\"demoWaitForInput ( )\\bsn\"")
-CODE (L";")
-CODE (L"")
-CODE (L"int main (int argc, char *argv [ ]) {")
-	CODE1 (L"praat_setStandAloneScriptText (myScript);")
-	CODE1 (L"praat_init (\"Hello\", argc, argv);")
-	CODE1 (L"INCLUDE_LIBRARY (praat_uvafon_init)")
-	CODE1 (L"praat_run ();")
-	CODE1 (L"return 0;")
-CODE (L"}")
-NORMAL (L"The script in this example raises the Demo window, writes \"Hello world\" in the middle of the window, "
+CODE (U"\\# include \"praat.h\"")
+CODE (U"")
+CODE (U"const char32 myScript [ ] = U\"\"")
+	CODE1 (U"\"demo Text: 0.5, \\bs\"centre\\bs\", 0.5, \\bs\"half\\bs\", \\bs\"Hello world\\bs\"\\bsn\"")
+	CODE1 (U"\"demoWaitForInput ( )\\bsn\"")
+CODE (U";")
+CODE (U"")
+CODE (U"int main (int argc, char *argv [ ]) {")
+	CODE1 (U"praat_setStandAloneScriptText (myScript);")
+	CODE1 (U"praat_init (U\"Hello\", argc, argv);")
+	CODE1 (U"INCLUDE_LIBRARY (praat_uvafon_init)")
+	CODE1 (U"praat_run ();")
+	CODE1 (U"return 0;")
+CODE (U"}")
+NORMAL (U"The script in this example raises the Demo window, writes \"Hello world\" in the middle of the window, "
 	"waits until the user clicks the mouse or presses a key, and then closes.")
-NORMAL (L"Note that Praat is distributed under the General Public License (GPL). This means that if you distribute "
+NORMAL (U"Note that Praat is distributed under the General Public License (GPL). This means that if you distribute "
 	"a Praat-based stand-alone program, you have to make it open source under the GPL as well.")
-NORMAL (L"See also @@Programming with Praat at .")
-ENTRY (L"Details")
-NORMAL (L"Your program can save its preferences in a directory of its choice, "
+NORMAL (U"See also @@Programming with Praat at .")
+ENTRY (U"Details")
+NORMAL (U"Your program can save its preferences in a directory of its choice, "
 	"e.g. in ##'preferencesDirectory\\$ '/../GuineaPigAnalyzer# if your program is called GuineaPigAnalyzer. "
 	"If you want to be less conspicuous and like to use the Praat preferences directory instead, "
 	"please use the ##apps# subdirectory, in this way:")
-CODE (L"createDirectory: preferencesDirectory\\$  + \"/apps\"")
-CODE (L"createDirectory: preferencesDirectory\\$  + \"/apps/GuineaPigAnalyzer\"")
+CODE (U"createDirectory: preferencesDirectory\\$  + \"/apps\"")
+CODE (U"createDirectory: preferencesDirectory\\$  + \"/apps/GuineaPigAnalyzer\"")
 MAN_END
 
-MAN_BEGIN (L"Scripting 9.2. Old functions", L"ppgb", 20140112)
-INTRO (L"The Praat scripting language improves and changes, but old scripts should continue to work correctly. "
+MAN_BEGIN (U"Scripting 9.2. Old functions", U"ppgb", 20140112)
+INTRO (U"The Praat scripting language improves and changes, but old scripts should continue to work correctly. "
 	"Here are some examples of what you can see in old scripts, and what they mean:")
-NORMAL (L"The meaning of")
-CODE (L"echo Hello, my name is 'name\\$ ' and I am 'age' years old.")
-NORMAL (L"is")
-CODE (L"writeInfoLine: \"Hello, my name is \", name\\$ , \" and I am \", age, \" years old.\"")
-NORMAL (L"The meaning of")
-CODE (L"Draw... 0 0 0 0 yes Curve")
-NORMAL (L"is")
-CODE (L"Draw: 0, 0, 0, 0, \"yes\", \"Curve\"")
-NORMAL (L"The meaning of")
-CODE (L"Read from file... 'fileName\\$ '")
-NORMAL (L"is")
-CODE (L"Read from file: fileName\\$ ")
-MAN_END
-
-MAN_BEGIN (L"ScriptEditor", L"ppgb", 20140107)
-INTRO (L"An aid to @@scripting at .")
-NORMAL (L"The ScriptEditor is a text editor that allows you to edit, save, and run "
+NORMAL (U"The meaning of")
+CODE (U"echo Hello, my name is 'name\\$ ' and I am 'age' years old.")
+NORMAL (U"is")
+CODE (U"writeInfoLine: \"Hello, my name is \", name\\$ , \" and I am \", age, \" years old.\"")
+NORMAL (U"The meaning of")
+CODE (U"Draw... 0 0 0 0 yes Curve")
+NORMAL (U"is")
+CODE (U"Draw: 0, 0, 0, 0, \"yes\", \"Curve\"")
+NORMAL (U"The meaning of")
+CODE (U"Read from file... 'fileName\\$ '")
+NORMAL (U"is")
+CODE (U"Read from file: fileName\\$ ")
+MAN_END
+
+MAN_BEGIN (U"ScriptEditor", U"ppgb", 20140107)
+INTRO (U"An aid to @@scripting at .")
+NORMAL (U"The ScriptEditor is a text editor that allows you to edit, save, and run "
 	"any @@Praat script at . You can type such a script from scratch, "
 	"but it is sometimes easier to use the @@History mechanism@, which automatically records "
 	"all your commands and mouse clicks, and which can paste these directly "
 	"into a ScriptEditor.")
-NORMAL (L"To add a script as a button to a fixed or dynamic menu, "
+NORMAL (U"To add a script as a button to a fixed or dynamic menu, "
 	"use @@Add to fixed menu...@ or @@Add to dynamic menu...@ from the @@File menu at .")
-ENTRY (L"Example 1")
-NORMAL (L"In this example, we create a fixed button that will play a 0.4-second sine wave with a specified frequency.")
-NORMAL (L"First, we create a ScriptEditor by choosing @@New Praat script@ from the @@Praat menu at . "
+ENTRY (U"Example 1")
+NORMAL (U"In this example, we create a fixed button that will play a 0.4-second sine wave with a specified frequency.")
+NORMAL (U"First, we create a ScriptEditor by choosing @@New Praat script@ from the @@Praat menu at . "
 	"Then, we choose @@Clear history@ from the #Edit menu in the ScriptEditor. "
 	"We then perform some actions that will create a sine wave, play it, and remove it:")
-LIST_ITEM (L"1. Choose ##Create Sound as pure tone...# from the @@New menu@ and click OK.")
-LIST_ITEM (L"2. Click #Play in the dynamic menu.")
-LIST_ITEM (L"3. Click the fixed #Remove button.")
-NORMAL (L"We then choose @@Paste history@ from the #Edit menu in the ScriptEditor (or type Command-H). "
+LIST_ITEM (U"1. Choose ##Create Sound as pure tone...# from the @@New menu@ and click OK.")
+LIST_ITEM (U"2. Click #Play in the dynamic menu.")
+LIST_ITEM (U"3. Click the fixed #Remove button.")
+NORMAL (U"We then choose @@Paste history@ from the #Edit menu in the ScriptEditor (or type Command-H). "
 	"The text will now contain at least the following lines (delete any other lines):")
-CODE (L"Create Sound as pure tone: \"tone\", 1, 0, 0.4, 44100, 440, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-NORMAL (L"We can run this script again by choosing #Run from the #Run menu (or typing Command-R). "
+CODE (U"Create Sound as pure tone: \"tone\", 1, 0, 0.4, 44100, 440, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+NORMAL (U"We can run this script again by choosing #Run from the #Run menu (or typing Command-R). "
 	"However, this always plays a sine with a frequency of 440 Hz, so we will add the variable \"Frequency\" "
 	"to the script, which then looks like:")
-CODE (L"#form Play a sine wave")
-	CODE1 (L"#positive Frequency")
-CODE (L"#endform")
-CODE (L"Create Sound as pure tone: \"tone\", 1, 0, 0.4, 44100, frequency, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-NORMAL (L"When we choose #Run, the ScriptEditor will ask us to supply a value for the \"Frequency\" variable. "
+CODE (U"#form Play a sine wave")
+	CODE1 (U"#positive Frequency")
+CODE (U"#endform")
+CODE (U"Create Sound as pure tone: \"tone\", 1, 0, 0.4, 44100, frequency, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+NORMAL (U"When we choose #Run, the ScriptEditor will ask us to supply a value for the \"Frequency\" variable. "
 	"We can now play 1-second sine waves with any frequency.")
-NORMAL (L"It is advisable to supply a standard value for each argument in your script. "
+NORMAL (U"It is advisable to supply a standard value for each argument in your script. "
 	"If the duration should be variable, too, the final script could look like:")
-CODE (L"#form Play a sine wave")
-	CODE1 (L"#positive Frequency 440")
-	CODE1 (L"#positive Duration 1.0")
-CODE (L"#endform")
-CODE (L"Create Sound as pure tone: \"tone\", 1, 0, duration, 44100, frequency, 0.2, 0.01, 0.01")
-CODE (L"Play")
-CODE (L"Remove")
-NORMAL (L"When you run this script, the ScriptEditor will ask you to supply values for the two variables, "
+CODE (U"#form Play a sine wave")
+	CODE1 (U"#positive Frequency 440")
+	CODE1 (U"#positive Duration 1.0")
+CODE (U"#endform")
+CODE (U"Create Sound as pure tone: \"tone\", 1, 0, duration, 44100, frequency, 0.2, 0.01, 0.01")
+CODE (U"Play")
+CODE (U"Remove")
+NORMAL (U"When you run this script, the ScriptEditor will ask you to supply values for the two variables, "
 	"but the values \"440\" and \"1.0\" are already visible in the form window, "
 	"so that you will get a sensible result if you just click #OK.")
-NORMAL (L"If this script is useful to you, you may want to put a button for it in the @@New menu@, "
+NORMAL (U"If this script is useful to you, you may want to put a button for it in the @@New menu@, "
 	"in the ##Sound# submenu:")
-LIST_ITEM (L"1. Save the script to a file, with #Save from the #File menu. The file name that you supply, will "
+LIST_ITEM (U"1. Save the script to a file, with #Save from the #File menu. The file name that you supply, will "
 	"be shown in the title bar of the ScriptEditor window.")
-LIST_ITEM (L"2. Choose @@Add to fixed menu...@ from the #File menu. Supply #Objects for the %window, "
+LIST_ITEM (U"2. Choose @@Add to fixed menu...@ from the #File menu. Supply #Objects for the %window, "
 	"#New for the %menu, \"Play sine wave...\" for the %command, "
 	"##Create Sound from formula...# for %%after command%, and \"1\" for the depth (because it is supposed to be in a submenu); "
 	"the %script argument has already been set to the file name that you supplied in step 1.")
-LIST_ITEM (L"3. Click #OK and ensure that the button has been added in the @@New menu at . This button will still be there "
+LIST_ITEM (U"3. Click #OK and ensure that the button has been added in the @@New menu at . This button will still be there "
 	"after you leave the program and enter it again; to remove it from the menu, use the @ButtonEditor.")
-ENTRY (L"Example 2")
-NORMAL (L"In this example, we will create a shortcut for the usual complex pitch-analysis command.")
-NORMAL (L"First, we perform the required actions:")
-LIST_ITEM (L"1. Select a Sound object.")
-LIST_ITEM (L"2. Click ##To Pitch...# and set the arguments to your personal standard values.")
-LIST_ITEM (L"3. Click #OK. A new #Pitch object will appear.")
-NORMAL (L"We then paste the history into the ScriptEditor, after which this will contain at least a line like (delete all the other lines):")
-CODE (L"To Pitch: 0.01, 150, 900")
-NORMAL (L"You can run this script only after selecting one or more Sound objects.")
-NORMAL (L"If this script is useful to you, you may want to put a button for it in the dynamic menu:")
-LIST_ITEM (L"1. Save the script to a file, with #Save from the #File menu.")
-LIST_ITEM (L"2. Choose @@Add to dynamic menu...@ from the #File menu. Supply \"Sound\" for %class1 "
+ENTRY (U"Example 2")
+NORMAL (U"In this example, we will create a shortcut for the usual complex pitch-analysis command.")
+NORMAL (U"First, we perform the required actions:")
+LIST_ITEM (U"1. Select a Sound object.")
+LIST_ITEM (U"2. Click ##To Pitch...# and set the arguments to your personal standard values.")
+LIST_ITEM (U"3. Click #OK. A new #Pitch object will appear.")
+NORMAL (U"We then paste the history into the ScriptEditor, after which this will contain at least a line like (delete all the other lines):")
+CODE (U"To Pitch: 0.01, 150, 900")
+NORMAL (U"You can run this script only after selecting one or more Sound objects.")
+NORMAL (U"If this script is useful to you, you may want to put a button for it in the dynamic menu:")
+LIST_ITEM (U"1. Save the script to a file, with #Save from the #File menu.")
+LIST_ITEM (U"2. Choose @@Add to dynamic menu...@ from the #File menu. Supply \"Sound\" for %class1 "
 	"(because the button is supposed to be available only if a Sound is selected), \"0\" for %number1 "
 	"(because the command is supposed to work for any number of selected Sound objects), "
 	"\"To Pitch (child)\" for the %command, "
 	"\"To Spectrum\" for %%after command%, and \"0\" for the depth (because it is not supposed to be in a submenu); "
 	"the %script argument has already been set to the file name that you supplied in step 1.")
-LIST_ITEM (L"3. Click #OK and ensure that the button is clickable if you select one or more Sound objects. "
+LIST_ITEM (U"3. Click #OK and ensure that the button is clickable if you select one or more Sound objects. "
 	"This button will still be available after you leave the program and enter it again; "
 	"to remove it from the dynamic menus, use the @ButtonEditor.")
 MAN_END
 
-MAN_BEGIN (L"undefined", L"ppgb", 20140112)
-INTRO (L"When you give a query command for a numeric value, Praat sometimes writes the numeric value ##--undefined--# "
+MAN_BEGIN (U"undefined", U"ppgb", 20140112)
+INTRO (U"When you give a query command for a numeric value, Praat sometimes writes the numeric value ##--undefined--# "
 	"into the @@Info window@ (two hyphens at both sides of the word). This happens if the value you ask for is not defined, "
 	"as in the following examples:")
-LIST_ITEM (L"\\bu You select a Sound with a finishing time of 1.0 seconds and ask for the minimum point in the wave form "
+LIST_ITEM (U"\\bu You select a Sound with a finishing time of 1.0 seconds and ask for the minimum point in the wave form "
 	"between 1.5 and 2.0 seconds (with the query command ##Get minimum...#).")
-LIST_ITEM (L"\\bu You ask for a pitch value in a voiceless part of the sound (select a #Pitch, "
+LIST_ITEM (U"\\bu You ask for a pitch value in a voiceless part of the sound (select a #Pitch, "
 	"then choose ##Get value at time...#).")
-LIST_ITEM (L"\\bu You type into the @Calculator the following formula: 10\\^ 400.")
-ENTRY (L"Usage in a script")
-NORMAL (L"In a Praat script, this value is simply represented as \"undefined\". You use it to test whether "
+LIST_ITEM (U"\\bu You type into the @Calculator the following formula: 10\\^ 400.")
+ENTRY (U"Usage in a script")
+NORMAL (U"In a Praat script, this value is simply represented as \"undefined\". You use it to test whether "
 	"a query command returned a valid number:")
-CODE (L"selectObject: \"Pitch hallo\"")
-CODE (L"meanPitch = Get mean: 0.1, 0.2, \"Hertz\", \"Parabolic\"")
-CODE (L"if meanPitch = undefined")
-	CODE1 (L"\\#  Take some exceptional action.")
-CODE (L"else")
-	CODE1 (L"\\#  Take the normal action.")
-CODE (L"endif")
-ENTRY (L"Details for hackers")
-NORMAL (L"In text files, this value is written as ##--undefined--#. "
+CODE (U"selectObject: \"Pitch hallo\"")
+CODE (U"meanPitch = Get mean: 0.1, 0.2, \"Hertz\", \"Parabolic\"")
+CODE (U"if meanPitch = undefined")
+	CODE1 (U"\\#  Take some exceptional action.")
+CODE (U"else")
+	CODE1 (U"\\#  Take the normal action.")
+CODE (U"endif")
+ENTRY (U"Details for hackers")
+NORMAL (U"In text files, this value is written as ##--undefined--#. "
 	"In binary files, it is written as a big-endian IEEE positive infinity. "
 	"In memory, it is the ANSI-C constant HUGE_VAL, which equals infinity on IEEE machines.")
 MAN_END
 
-MAN_BEGIN (L"Scripting examples", L"ppgb", 20040222)
-INTRO (L"Here is a number of examples of how to use scripting in the Praat program. "
+MAN_BEGIN (U"Scripting examples", U"ppgb", 20040222)
+INTRO (U"Here is a number of examples of how to use scripting in the Praat program. "
 	"Refer to the @scripting tutorial when necessary.")
-LIST_ITEM (L"@@Script for listing time\\--F0 pairs")
-LIST_ITEM (L"@@Script for listing time\\--F0\\--intensity")
-LIST_ITEM (L"@@Script for listing F0 statistics")
-LIST_ITEM (L"@@Script for creating a frequency sweep")
-LIST_ITEM (L"@@Script for onset detection")
-LIST_ITEM (L"@@Script for TextGrid boundary drawing")
-LIST_ITEM (L"@@Script for analysing pitch with a TextGrid")
-MAN_END
-
-MAN_BEGIN (L"Script for listing time\\--F0 pairs", L"ppgb", 20140223)
-INTRO (L"\"I wish to have a list of time markers in one column and F0 in the other. "
-	"Those times that have no voiced data should be represented as \\\"l.\\\"r in the F0 column.\"")
-CODE (L"writeInfoLine: \"Time:    Pitch:\"")
-CODE (L"numberOfFrames = Get number of frames")
-CODE (L"for iframe to numberOfFrames")
-	CODE1 (L"time = Get time from frame: iframe")
-	CODE1 (L"pitch = Get value in frame: iframe, \"Hertz\"")
-	CODE1 (L"if pitch = undefined")
-		CODE2 (L"appendInfoLine: fixed\\$  (time, 6)")
-	CODE1 (L"else")
-		CODE2 (L"appendInfoLine: fixed\\$  (time, 6), \" \", fixed\\$  (pitch, 3)")
-	CODE1 (L"endif")
-CODE (L"endfor")
-NORMAL (L"If you want to see this in a text file, you can copy and paste from the Info window, or save the Info window, "
+LIST_ITEM (U"@@Script for listing time\\--F0 pairs")
+LIST_ITEM (U"@@Script for listing time\\--F0\\--intensity")
+LIST_ITEM (U"@@Script for listing F0 statistics")
+LIST_ITEM (U"@@Script for creating a frequency sweep")
+LIST_ITEM (U"@@Script for onset detection")
+LIST_ITEM (U"@@Script for TextGrid boundary drawing")
+LIST_ITEM (U"@@Script for analysing pitch with a TextGrid")
+MAN_END
+
+MAN_BEGIN (U"Script for listing time\\--F0 pairs", U"ppgb", 20140223)
+INTRO (U"“I wish to have a list of time markers in one column and F0 in the other. "
+	"Those times that have no voiced data should be represented as “.” in the F0 column.”")
+CODE (U"writeInfoLine: \"Time:    Pitch:\"")
+CODE (U"numberOfFrames = Get number of frames")
+CODE (U"for iframe to numberOfFrames")
+	CODE1 (U"time = Get time from frame: iframe")
+	CODE1 (U"pitch = Get value in frame: iframe, \"Hertz\"")
+	CODE1 (U"if pitch = undefined")
+		CODE2 (U"appendInfoLine: fixed\\$  (time, 6)")
+	CODE1 (U"else")
+		CODE2 (U"appendInfoLine: fixed\\$  (time, 6), \" \", fixed\\$  (pitch, 3)")
+	CODE1 (U"endif")
+CODE (U"endfor")
+NORMAL (U"If you want to see this in a text file, you can copy and paste from the Info window, or save the Info window, "
 	"or add a line to the script like")
-CODE (L"appendFile: \"out.txt\", info\\$ ( )")
+CODE (U"appendFile: \"out.txt\", info\\$ ( )")
 MAN_END
 
-MAN_BEGIN (L"Script for listing time\\--F0\\--intensity", L"ppgb", 20140112)
-INTRO (L"\"I want a list of pitch and intensity values at the same times.\"")
-NORMAL (L"Since @@Sound: To Pitch...@ and @@Sound: To Intensity...@ do not give values at the same times, "
+MAN_BEGIN (U"Script for listing time\\--F0\\--intensity", U"ppgb", 20140112)
+INTRO (U"\"I want a list of pitch and intensity values at the same times.\"")
+NORMAL (U"Since @@Sound: To Pitch...@ and @@Sound: To Intensity...@ do not give values at the same times, "
 	"you create separate pitch and intensity contours with high time resolution, then interpolate. "
 	"In the following example, you get pitch and intensity values at steps of 0.01 seconds "
 	"by interpolating curves that have a time resolution of 0.001 seconds.")
-CODE (L"sound = selected (\"Sound\")")
-CODE (L"tmin = Get start time")
-CODE (L"tmax = Get end time")
-CODE (L"To Pitch: 0.001, 75, 300")
-CODE (L"Rename: \"pitch\"")
-CODE (L"selectObject: sound")
-CODE (L"To Intensity: 75, 0.001")
-CODE (L"Rename: \"intensity\"")
-CODE (L"writeInfoLine: \"Here are the results:\"")
-CODE (L"for i to (tmax-tmin)/0.01")
-	CODE1 (L"time = tmin + i * 0.01")
-	CODE1 (L"selectObject: \"Pitch pitch\"")
-	CODE1 (L"pitch = Get value at time: time, \"Hertz\", \"Linear\"")
-	CODE1 (L"selectObject: \"Intensity intensity\"")
-	CODE1 (L"intensity = Get value at time: time, \"Cubic\"")
-	CODE1 (L"appendInfoLine: fixed\\$  (time, 2), \" \", fixed\\$  (pitch, 3), \" \", fixed\\$  (intensity, 3)")
-CODE (L"endfor")
-MAN_END
-
-MAN_BEGIN (L"Script for listing F0 statistics", L"ppgb", 20140112)
-INTRO (L"\"I need to split the wave into 50 msec sections, and then for each of those sections "
+CODE (U"sound = selected (\"Sound\")")
+CODE (U"tmin = Get start time")
+CODE (U"tmax = Get end time")
+CODE (U"To Pitch: 0.001, 75, 300")
+CODE (U"Rename: \"pitch\"")
+CODE (U"selectObject: sound")
+CODE (U"To Intensity: 75, 0.001")
+CODE (U"Rename: \"intensity\"")
+CODE (U"writeInfoLine: \"Here are the results:\"")
+CODE (U"for i to (tmax-tmin)/0.01")
+	CODE1 (U"time = tmin + i * 0.01")
+	CODE1 (U"selectObject: \"Pitch pitch\"")
+	CODE1 (U"pitch = Get value at time: time, \"Hertz\", \"Linear\"")
+	CODE1 (U"selectObject: \"Intensity intensity\"")
+	CODE1 (U"intensity = Get value at time: time, \"Cubic\"")
+	CODE1 (U"appendInfoLine: fixed\\$  (time, 2), \" \", fixed\\$  (pitch, 3), \" \", fixed\\$  (intensity, 3)")
+CODE (U"endfor")
+MAN_END
+
+MAN_BEGIN (U"Script for listing F0 statistics", U"ppgb", 20140112)
+INTRO (U"\"I need to split the wave into 50 msec sections, and then for each of those sections "
 	"get the F0 statistics. That is, for each 50 msec section of speech I want to get the average F0, "
 	"min, max, and standard deviation.\"")
-NORMAL (L"First you create the complete pitch contour, i.e., you select the Sound and choose "
+NORMAL (U"First you create the complete pitch contour, i.e., you select the Sound and choose "
 	"@@Sound: To Pitch...|To Pitch... at . You can then use the commands from the #Query menu in a loop:")
-CODE (L"startTime = Get start time")
-CODE (L"endTime = Get end time")
-CODE (L"numberOfTimeSteps = (endTime - startTime) / 0.05")
-CODE (L"writeInfoLine: \"   tmin     tmax    mean   fmin   fmax  stdev\"")
-CODE (L"for step to numberOfTimeSteps")
-	CODE1 (L"tmin = startTime + (step - 1) * 0.05")
-	CODE1 (L"tmax = tmin + 0.05")
-	CODE1 (L"mean = Get mean: tmin, tmax, \"Hertz\"")
-	CODE1 (L"minimum = Get minimum: tmin, tmax, \"Hertz\", \"Parabolic\"")
-	CODE1 (L"maximum = Get maximum: tmin, tmax, \"Hertz\", \"Parabolic\"")
-	CODE1 (L"stdev = Get standard deviation: tmin, tmax, \"Hertz\"")
-	CODE1 (L"appendInfoLine: fixed\\$  (tmin, 6), \" \", fixed\\$  (tmax, 6), \" \", fixed\\$  (mean, 2),")
-	CODE1 (L"... \" \", fixed\\$  (minimum, 2), \" \", fixed\\$  (maximum, 2), \" \", fixed\\$  (stdev, 2)")
-CODE (L"endfor")
-ENTRY (L"Notes")
-NORMAL (L"One should not cut the sound up into pieces of 50 ms and then do ##To Pitch...# on each of them, "
+CODE (U"startTime = Get start time")
+CODE (U"endTime = Get end time")
+CODE (U"numberOfTimeSteps = (endTime - startTime) / 0.05")
+CODE (U"writeInfoLine: \"   tmin     tmax    mean   fmin   fmax  stdev\"")
+CODE (U"for step to numberOfTimeSteps")
+	CODE1 (U"tmin = startTime + (step - 1) * 0.05")
+	CODE1 (U"tmax = tmin + 0.05")
+	CODE1 (U"mean = Get mean: tmin, tmax, \"Hertz\"")
+	CODE1 (U"minimum = Get minimum: tmin, tmax, \"Hertz\", \"Parabolic\"")
+	CODE1 (U"maximum = Get maximum: tmin, tmax, \"Hertz\", \"Parabolic\"")
+	CODE1 (U"stdev = Get standard deviation: tmin, tmax, \"Hertz\"")
+	CODE1 (U"appendInfoLine: fixed\\$  (tmin, 6), \" \", fixed\\$  (tmax, 6), \" \", fixed\\$  (mean, 2),")
+	CODE1 (U"... \" \", fixed\\$  (minimum, 2), \" \", fixed\\$  (maximum, 2), \" \", fixed\\$  (stdev, 2)")
+CODE (U"endfor")
+ENTRY (U"Notes")
+NORMAL (U"One should not cut the sound up into pieces of 50 ms and then do ##To Pitch...# on each of them, "
 	"because Praat will not compute F0 values in the first or last 20 ms (or so) of each piece. "
 	"This is because the analysis requires a window of 40 ms (or so) for every pitch frame. "
 	"Instead, one typically does the analysis on the whole sound, then queries the resulting large Pitch object. "
 	"In that way, the information loss of windowing only affects the two 20 ms edges of the whole sound.")
-NORMAL (L"The example writes lines to the #Info window. If you want to write to a file instead, "
+NORMAL (U"The example writes lines to the #Info window. If you want to write to a file instead, "
 	"you start with something like")
-	CODE1 (L"deleteFile: \"~/results/out.txt\"")
-NORMAL (L"and add lines in the following way:")
-	CODE1 (L"appendFileLine: \"~/results/out.txt \", fixed\\$  (tmin, 6), \" \", fixed\\$  (tmax, 6), \" \",")
-	CODE1 (L"... fixed\\$  (mean, 2), \" \", fixed\\$  (minimum, 2), \" \", fixed\\$  (maximum, 2), \" \",")
-	CODE1 (L"... fixed\\$  (stdev, 2)")
+	CODE1 (U"deleteFile: \"~/results/out.txt\"")
+NORMAL (U"and add lines in the following way:")
+	CODE1 (U"appendFileLine: \"~/results/out.txt \", fixed\\$  (tmin, 6), \" \", fixed\\$  (tmax, 6), \" \",")
+	CODE1 (U"... fixed\\$  (mean, 2), \" \", fixed\\$  (minimum, 2), \" \", fixed\\$  (maximum, 2), \" \",")
+	CODE1 (U"... fixed\\$  (stdev, 2)")
 MAN_END
 
-MAN_BEGIN (L"Script for creating a frequency sweep", L"ppgb", 20140107)
-INTRO (L"\"I have to find a formula for a sinewave that sweeps from 1 kHz to 12 kHz in "
+MAN_BEGIN (U"Script for creating a frequency sweep", U"ppgb", 20140107)
+INTRO (U"\"I have to find a formula for a sinewave that sweeps from 1 kHz to 12 kHz in "
 	"60 seconds while ramping the amplitude from 1 to 12 volts in the same amount of time.\"")
-NORMAL (L"The absolute amplitude in volts cannot be handled, of course, but linear crescendo is easy:")
-CODE (L"Create Sound from formula: \"sweep\", 1, 0, 60, 44100,")
-CODE (L"... \"0.05 * (1 + 11 * x/60) * sin (2*pi * (1000 + 11000/2 * x/60) * x)\"")
-NORMAL (L"Note the \"/2\" in this formula. Here is the derivation of the formula:")
-FORMULA (L"%frequency (%t) = 1000 + 11000 %t / 60")
-FORMULA (L"%phase (%t) = \\in %frequency (%t) %dt = 1000 %t + 11000 (%t^2/2) / 60")
-FORMULA (L"%signal (%t) = sin (%phase (%t))")
-MAN_END
-
-MAN_BEGIN (L"Script for onset detection", L"ppgb", 20140112)
-INTRO (L"\"Can anybody provide me with a script that detects the onset of sound (i.e. the end of silence).\"")
-NORMAL (L"You can create an Intensity contour and look for the first frame that is above some predefined threshold:")
-CODE (L"To Intensity: 100, 0")
-CODE (L"n = Get number of frames")
-CODE (L"for i to n")
-	CODE1 (L"intensity = Get value in frame: i")
-	CODE1 (L"if intensity > 40")
-		CODE2 (L"time = Get time from frame: i")
-		CODE2 (L"writeInfoLine: \"Onset of sound at: \", fixed\\$  (time, 3), \" seconds.\"")
-		CODE2 (L"exit")
-	CODE1 (L"endif")
-CODE (L"endfor")
-NORMAL (L"Since the intensity is computed with rather long windows, the result may be 0.01 or 0.02 seconds "
+NORMAL (U"The absolute amplitude in volts cannot be handled, of course, but linear crescendo is easy:")
+CODE (U"Create Sound from formula: \"sweep\", 1, 0, 60, 44100,")
+CODE (U"... \"0.05 * (1 + 11 * x/60) * sin (2*pi * (1000 + 11000/2 * x/60) * x)\"")
+NORMAL (U"Note the \"/2\" in this formula. Here is the derivation of the formula:")
+FORMULA (U"%frequency (%t) = 1000 + 11000 %t / 60")
+FORMULA (U"%phase (%t) = \\in %frequency (%t) %dt = 1000 %t + 11000 (%t^2/2) / 60")
+FORMULA (U"%signal (%t) = sin (%phase (%t))")
+MAN_END
+
+MAN_BEGIN (U"Script for onset detection", U"ppgb", 20140112)
+INTRO (U"\"Can anybody provide me with a script that detects the onset of sound (i.e. the end of silence).\"")
+NORMAL (U"You can create an Intensity contour and look for the first frame that is above some predefined threshold:")
+CODE (U"To Intensity: 100, 0")
+CODE (U"n = Get number of frames")
+CODE (U"for i to n")
+	CODE1 (U"intensity = Get value in frame: i")
+	CODE1 (U"if intensity > 40")
+		CODE2 (U"time = Get time from frame: i")
+		CODE2 (U"writeInfoLine: \"Onset of sound at: \", fixed\\$  (time, 3), \" seconds.\"")
+		CODE2 (U"exit")
+	CODE1 (U"endif")
+CODE (U"endfor")
+NORMAL (U"Since the intensity is computed with rather long windows, the result may be 0.01 or 0.02 seconds "
 	"before the actual start of sound.")
 MAN_END
 
-MAN_BEGIN (L"Script for TextGrid boundary drawing", L"ppgb", 20140107)
-INTRO (L"\"I want only the dotted lines of the textgrid marked on top of another analysis (e.g. pitch, intensity or so) "
+MAN_BEGIN (U"Script for TextGrid boundary drawing", U"ppgb", 20140107)
+INTRO (U"\"I want only the dotted lines of the textgrid marked on top of another analysis (e.g. pitch, intensity or so) "
 	"without the labels being shown below it.\"")
-CODE (L"n = Get number of intervals: 1")
-CODE (L"for i to n-1")
-    CODE1 (L"t = Get end point: 1, i")
-    CODE1 (L"One mark bottom: t, \"no\", \"no\", \"yes\"")
-CODE (L"endfor")
-MAN_END
-
-MAN_BEGIN (L"Script for analysing pitch with a TextGrid", L"ppgb", 20141001)
-INTRO (L"\"I want the mean pitch of every interval that has a non-empty label on tier 5.\"")
-CODE (L"if numberOfSelected (\"Sound\") <> 1 or numberOfSelected (\"TextGrid\") <> 1")
-	CODE1 (L"exitScript: \"Please select a Sound and a TextGrid first.\"")
-CODE (L"endif")
-CODE (L"sound = selected (\"Sound\")")
-CODE (L"textgrid = selected (\"TextGrid\")")
-CODE (L"writeInfoLine: \"Result:\"")
-CODE (L"selectObject: sound")
-CODE (L"To Pitch: 0.0, 75, 600")
-CODE (L"pitch = selected (\"Pitch\")")
-CODE (L"selectObject: textgrid")
-CODE (L"n = Get number of intervals: 5")
-CODE (L"for i to n")
-	CODE1 (L"tekst\\$  = Get label of interval: 5, i")
-	CODE1 (L"if tekst\\$  <> \"\"")
-		CODE2 (L"t1 = Get starting point: 5, i")
-		CODE2 (L"t2 = Get end point: 5, i")
-		CODE2 (L"selectObject: pitch")
-		CODE2 (L"f0 = Get mean: t1, t2, \"Hertz\"")
-		CODE2 (L"appendInfoLine: fixed\\$  (t1, 3), \" \", fixed\\$  (t2, 3), \" \", round (f0), \" \", tekst\\$ ")
-		CODE2 (L"selectObject: textgrid")
-	CODE1 (L"endif")
-CODE (L"endfor")
-CODE (L"selectObject: sound, textgrid")
-MAN_END
-
-MAN_BEGIN (L"Demo window", L"ppgb", 20140621)
-INTRO (L"The Demo window is a window in which you can draw and ask for user input. "
+CODE (U"n = Get number of intervals: 1")
+CODE (U"for i to n-1")
+    CODE1 (U"t = Get end point: 1, i")
+    CODE1 (U"One mark bottom: t, \"no\", \"no\", \"yes\"")
+CODE (U"endfor")
+MAN_END
+
+MAN_BEGIN (U"Script for analysing pitch with a TextGrid", U"ppgb", 20141001)
+INTRO (U"\"I want the mean pitch of every interval that has a non-empty label on tier 5.\"")
+CODE (U"if numberOfSelected (\"Sound\") <> 1 or numberOfSelected (\"TextGrid\") <> 1")
+	CODE1 (U"exitScript: \"Please select a Sound and a TextGrid first.\"")
+CODE (U"endif")
+CODE (U"sound = selected (\"Sound\")")
+CODE (U"textgrid = selected (\"TextGrid\")")
+CODE (U"writeInfoLine: \"Result:\"")
+CODE (U"selectObject: sound")
+CODE (U"To Pitch: 0.0, 75, 600")
+CODE (U"pitch = selected (\"Pitch\")")
+CODE (U"selectObject: textgrid")
+CODE (U"n = Get number of intervals: 5")
+CODE (U"for i to n")
+	CODE1 (U"tekst\\$  = Get label of interval: 5, i")
+	CODE1 (U"if tekst\\$  <> \"\"")
+		CODE2 (U"t1 = Get starting point: 5, i")
+		CODE2 (U"t2 = Get end point: 5, i")
+		CODE2 (U"selectObject: pitch")
+		CODE2 (U"f0 = Get mean: t1, t2, \"Hertz\"")
+		CODE2 (U"appendInfoLine: fixed\\$  (t1, 3), \" \", fixed\\$  (t2, 3), \" \", round (f0), \" \", tekst\\$ ")
+		CODE2 (U"selectObject: textgrid")
+	CODE1 (U"endif")
+CODE (U"endfor")
+CODE (U"selectObject: sound, textgrid")
+MAN_END
+
+MAN_BEGIN (U"Demo window", U"ppgb", 20150826)
+INTRO (U"The Demo window is a window in which you can draw and ask for user input. "
 	"You can use it for demonstrations, presentations, simulations, adaptive listening experiments, "
 	"and stand-alone programs (see @@Scripting 9.1. Turning a script into a stand-alone program@).")
-NORMAL (L"The Demo window is Praat's least visible window: you can create it only through a script. "
+NORMAL (U"The Demo window is Praat's least visible window: you can create it only through a script. "
 	"Try the following script after selecting a Sound object:")
-CODE (L"demo Draw: 0, 3, -1, 1, \"yes\", \"curve\"")
-NORMAL (L"You see the Demo window turning up on the screen, with the Sound painted into it. "
+CODE (U"demo Draw: 0, 3, -1, 1, \"yes\", \"curve\"")
+NORMAL (U"You see the Demo window turning up on the screen, with the Sound painted into it. "
 	"It works because the ##Draw...# command is available in the Objects window when you select a Sound. Then try:")
-CODE (L"demo Draw line: 0, -1, 3, 1")
-NORMAL (L"You see a line drawn from (0 seconds, -1 Pa) to (3 seconds, +1 Pascal) in the waveform. "
+CODE (U"demo Draw line: 0, -1, 3, 1")
+NORMAL (U"You see a line drawn from (0 seconds, -1 Pa) to (3 seconds, +1 Pascal) in the waveform. "
 	"It works because the ##Draw line...# command is available in the Picture window. Then try:")
-CODE (L"demo Erase all")
-CODE (L"demo Red")
-CODE (L"demo Axes: 0, 100, 0, 100")
-CODE (L"demo Text: 50, \"centre\", 50, \"half\", \"Hello\"")
-NORMAL (L"You see a text appearing in red, in the centre of the window. "
+CODE (U"demo Erase all")
+CODE (U"demo Red")
+CODE (U"demo Axes: 0, 100, 0, 100")
+CODE (U"demo Text: 50, \"centre\", 50, \"half\", \"Hello\"")
+NORMAL (U"You see a text appearing in red, in the centre of the window. "
 	"This works because you are using commands from the Picture window, including the @@Axes...@ command, "
 	"which sets the world coordinates to something else than before (before, the world coordinates were determined by the Sound).")
-NORMAL (L"Now suppose you want the Sound to appear in the top half of the window, "
+NORMAL (U"Now suppose you want the Sound to appear in the top half of the window, "
 	"and some texts in the bottom left and bottom right corners of the window. "
 	"You can use @@Select outer viewport...@ and @@Select inner viewport...@, "
 	"if you know that the size of the Demo window is \"100\" horizontally and \"100\" vertically (rather than 12\\xx12, as the Picture window), "
 	"and that the point (0, 0) lies in the bottom left (rather than the top left, as in the Picture window):")
-CODE (L"demo Erase all")
-CODE (L"demo Black")
-CODE (L"demo Times")
-CODE (L"demo 24")
-CODE (L"demo Select outer viewport: 0, 100, 50, 100")
-CODE (L"demo Draw: 0, 0, 0, 0, \"yes\", \"curve\"")
-CODE (L"demo Select inner viewport: 0, 100, 0, 100")
-CODE (L"demo Axes: 0, 10, 0, 10")
-CODE (L"demo Text: 0, \"left\", 0, \"bottom\", \"Left\", \"bottom corner\"")
-CODE (L"demo Text: 10, \"right\", 0, \"bottom\", \"Right bottom corner\"")
-NORMAL (L"As the title page of a presentation, you could do:")
-CODE (L"demo Erase all")
-CODE (L"demo Select inner viewport: 0, 100, 0, 100")
-CODE (L"demo Axes: 0, 100, 0, 100")
-CODE (L"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
-CODE (L"demo Pink")
-CODE (L"demo Text: 50, \"centre\", 50, \"half\", \"This is my title\"")
-ENTRY (L"Getting user input")
-NORMAL (L"For almost all applications, you will want the user (or the participant in an experiment) to be able to click on things in the Demo window, "
+CODE (U"demo Erase all")
+CODE (U"demo Black")
+CODE (U"demo Times")
+CODE (U"demo 24")
+CODE (U"demo Select outer viewport: 0, 100, 50, 100")
+CODE (U"demo Draw: 0, 0, 0, 0, \"yes\", \"curve\"")
+CODE (U"demo Select inner viewport: 0, 100, 0, 100")
+CODE (U"demo Axes: 0, 10, 0, 10")
+CODE (U"demo Text: 0, \"left\", 0, \"bottom\", \"Left bottom corner\"")
+CODE (U"demo Text: 10, \"right\", 0, \"bottom\", \"Right bottom corner\"")
+NORMAL (U"As the title page of a presentation, you could do:")
+CODE (U"demo Erase all")
+CODE (U"demo Select inner viewport: 0, 100, 0, 100")
+CODE (U"demo Axes: 0, 100, 0, 100")
+CODE (U"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
+CODE (U"demo Pink")
+CODE (U"demo Text: 50, \"centre\", 50, \"half\", \"This is my title\"")
+ENTRY (U"Getting user input")
+NORMAL (U"For almost all applications, you will want the user (or the participant in an experiment) to be able to click on things in the Demo window, "
 	"or to control the Demo window by pressing keys. Here is a presentation with two screens:")
-CODE (L"demo Erase all")
-CODE (L"demo Select inner viewport: 0, 100, 0, 100")
-CODE (L"demo Axes: 0, 100, 0, 100")
-CODE (L"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
-CODE (L"demo Pink")
-CODE (L"demo Text: 50, \"centre\", 50, \"half\", \"This is the first page\"")
-CODE (L"#demoWaitForInput ( )")
-CODE (L"demo Erase all")
-CODE (L"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
-CODE (L"demo Text: 50, \"centre\", 50, \"half\", \"This is the second page\"")
-NORMAL (L"In this example, you go from the first to the second screen either by clicking with the mouse or by pressing any key. "
+CODE (U"demo Erase all")
+CODE (U"demo Select inner viewport: 0, 100, 0, 100")
+CODE (U"demo Axes: 0, 100, 0, 100")
+CODE (U"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
+CODE (U"demo Pink")
+CODE (U"demo Text: 50, \"centre\", 50, \"half\", \"This is the first page\"")
+CODE (U"#demoWaitForInput ( )")
+CODE (U"demo Erase all")
+CODE (U"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
+CODE (U"demo Text: 50, \"centre\", 50, \"half\", \"This is the second page\"")
+NORMAL (U"In this example, you go from the first to the second screen either by clicking with the mouse or by pressing any key. "
 	"You will usually want to be more selective in your choice of user actions to respond to. "
 	"The function #demoWaitForInput always returns 1, so that you can use it nicely in a loop, in which you can react selectively:")
-CODE (L"label FIRST_SCREEN")
-CODE (L"demo Erase all")
-CODE (L"demo Black")
-CODE (L"demo Times")
-CODE (L"demo 24")
-CODE (L"demo Select inner viewport: 0, 100, 0, 100")
-CODE (L"demo Axes: 0, 100, 0, 100")
-CODE (L"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
-CODE (L"demo Pink")
-CODE (L"demo Text: 50, \"centre\", 50, \"half\", \"This is the first page\"")
-CODE (L"while demoWaitForInput ( )")
-	CODE1 (L"if #demoClicked ( )")
-		CODE2 (L"goto SECOND_SCREEN")
-	CODE1 (L"elsif #demoKeyPressed ( )")
-		CODE2 (L"if ##demoKey\\$ # ( ) = \"\\->\" or demoKey\\$  ( ) = \" \"")
-			CODE3 (L"goto SECOND_SCREEN")
-		CODE2 (L"endif")
-	CODE1 (L"endif")
-CODE (L"endwhile")
-CODE (L"label SECOND_SCREEN")
-CODE (L"demo Erase all")
-CODE (L"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
-CODE (L"demo Text: 50, \"centre\", 50, \"half\", \"This is the second page\"")
-CODE (L"while demoWaitForInput ( )")
-	CODE1 (L"if demoClicked ( )")
-		CODE2 (L"goto END")
-	CODE1 (L"elsif demoKeyPressed ( )")
-		CODE2 (L"if demoKey\\$  ( ) = \"\\<-\"")
-			CODE3 (L"goto FIRST_SCREEN")
-		CODE2 (L"elsif demoKey\\$  ( ) = \"\\->\" or demoKey\\$  ( ) = \" \"")
-			CODE3 (L"goto END")
-		CODE2 (L"endif")
-	CODE1 (L"endif")
-CODE (L"endwhile")
-CODE (L"label END")
-NORMAL (L"This script allows you to use the arrow keys and the space bar to navigate between the two screens. A shorter version is:")
-CODE (L"label FIRST_SCREEN")
-CODE (L"demo Erase all")
-CODE (L"demo Black")
-CODE (L"demo Times")
-CODE (L"demo 24")
-CODE (L"demo Select inner viewport: 0, 100, 0, 100")
-CODE (L"demo Axes: 0, 100, 0, 100")
-CODE (L"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
-CODE (L"demo Pink")
-CODE (L"demo Text: 50, \"centre\", 50, \"half\", \"This is the first page\"")
-CODE (L"while demoWaitForInput ( )")
-	CODE1 (L"goto SECOND_SCREEN #demoInput (\"\\bu\\-> \")")
-CODE (L"endwhile")
-CODE (L"label SECOND_SCREEN")
-CODE (L"demo Erase all")
-CODE (L"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
-CODE (L"demo Text: 50, \"centre\", 50, \"half\", \"This is the second page\"")
-CODE (L"while demoWaitForInput ( )")
-	CODE1 (L"goto END demoInput (\"\\bu\\-> \")")
-	CODE1 (L"goto FIRST_SCREEN demoInput (\"\\<-\")")
-CODE (L"endwhile")
-CODE (L"label END")
-NORMAL (L"This uses two tricks, namely the possibility of following the #goto statement by a condition "
+CODE (U"label FIRST_SCREEN")
+CODE (U"demo Erase all")
+CODE (U"demo Black")
+CODE (U"demo Times")
+CODE (U"demo 24")
+CODE (U"demo Select inner viewport: 0, 100, 0, 100")
+CODE (U"demo Axes: 0, 100, 0, 100")
+CODE (U"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
+CODE (U"demo Pink")
+CODE (U"demo Text: 50, \"centre\", 50, \"half\", \"This is the first page\"")
+CODE (U"while demoWaitForInput ( )")
+	CODE1 (U"if #demoClicked ( )")
+		CODE2 (U"goto SECOND_SCREEN")
+	CODE1 (U"elsif #demoKeyPressed ( )")
+		CODE2 (U"if ##demoKey\\$ # ( ) = \"\\->\" or demoKey\\$  ( ) = \" \"")
+			CODE3 (U"goto SECOND_SCREEN")
+		CODE2 (U"endif")
+	CODE1 (U"endif")
+CODE (U"endwhile")
+CODE (U"label SECOND_SCREEN")
+CODE (U"demo Erase all")
+CODE (U"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
+CODE (U"demo Text: 50, \"centre\", 50, \"half\", \"This is the second page\"")
+CODE (U"while demoWaitForInput ( )")
+	CODE1 (U"if demoClicked ( )")
+		CODE2 (U"goto END")
+	CODE1 (U"elsif demoKeyPressed ( )")
+		CODE2 (U"if demoKey\\$  ( ) = \"\\<-\"")
+			CODE3 (U"goto FIRST_SCREEN")
+		CODE2 (U"elsif demoKey\\$  ( ) = \"\\->\" or demoKey\\$  ( ) = \" \"")
+			CODE3 (U"goto END")
+		CODE2 (U"endif")
+	CODE1 (U"endif")
+CODE (U"endwhile")
+CODE (U"label END")
+NORMAL (U"This script allows you to use the arrow keys and the space bar to navigate between the two screens. A shorter version is:")
+CODE (U"label FIRST_SCREEN")
+CODE (U"demo Erase all")
+CODE (U"demo Black")
+CODE (U"demo Times")
+CODE (U"demo 24")
+CODE (U"demo Select inner viewport: 0, 100, 0, 100")
+CODE (U"demo Axes: 0, 100, 0, 100")
+CODE (U"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
+CODE (U"demo Pink")
+CODE (U"demo Text: 50, \"centre\", 50, \"half\", \"This is the first page\"")
+CODE (U"while demoWaitForInput ( )")
+	CODE1 (U"goto SECOND_SCREEN #demoInput (\"\\bu\\-> \")")
+CODE (U"endwhile")
+CODE (U"label SECOND_SCREEN")
+CODE (U"demo Erase all")
+CODE (U"demo Paint rectangle: \"purple\", 0, 100, 0, 100")
+CODE (U"demo Text: 50, \"centre\", 50, \"half\", \"This is the second page\"")
+CODE (U"while demoWaitForInput ( )")
+	CODE1 (U"goto END demoInput (\"\\bu\\-> \")")
+	CODE1 (U"goto FIRST_SCREEN demoInput (\"\\<-\")")
+CODE (U"endwhile")
+CODE (U"label END")
+NORMAL (U"This uses two tricks, namely the possibility of following the #goto statement by a condition "
 	"and using #demoInput to quickly test for multiple possible inputs (the bullet represents a mouse click).")
-ENTRY (L"Getting click locations")
-NORMAL (L"You can use the functions #demoX and #demoY to see where the user has clicked. "
+ENTRY (U"Getting click locations")
+NORMAL (U"You can use the functions #demoX and #demoY to see where the user has clicked. "
 	"These function respond in world coordinates. To see whether the user has clicked in the sound that occupies the "
 	"upper half of the screne in the above example, you do")
-CODE (L"while demoWaitForInput ( )")
-	CODE1 (L"if demoClicked ( )")
-		CODE2 (L"Select outer viewport: 0, 100, 50, 100")
-		CODE2 (L"Axes: 0, 3, -1, 1")
-		CODE2 (L"if #demoX ( ) >= 0 and demoX ( ) < 3 and #demoY ( ) >= -1 and demoY ( ) < 1")
-NORMAL (L"The last line can be shortened to:")
-		CODE2 (L"if #demoClickedIn (0, 3, -1, 1)")
-NORMAL (L"Another example of when you want to know the click location is when you test for a click on a button "
+CODE (U"while demoWaitForInput ( )")
+	CODE1 (U"if demoClicked ( )")
+		CODE2 (U"Select outer viewport: 0, 100, 50, 100")
+		CODE2 (U"Axes: 0, 3, -1, 1")
+		CODE2 (U"if #demoX ( ) >= 0 and demoX ( ) < 3 and #demoY ( ) >= -1 and demoY ( ) < 1")
+NORMAL (U"The last line can be shortened to:")
+		CODE2 (U"if #demoClickedIn (0, 3, -1, 1)")
+NORMAL (U"Another example of when you want to know the click location is when you test for a click on a button "
 	"that you drew on the screen:")
-CODE (L"demo Paint rounded rectangle: \"pink\", 30, 70, 16, 24")
-CODE (L"demo Text: 50, \"centre\", 20, \"half\", \"Analyse\"")
-CODE (L"while demoWaitForInput ( )")
-	CODE1 (L"goto ANALYSE demoClickedIn (30, 70, 16, 24)")
-ENTRY (L"Full-screen viewing")
-NORMAL (L"When you click in the top right corner of the Demo window (64-bit Mac) "
+CODE (U"demo Paint rounded rectangle: \"pink\", 30, 70, 16, 24")
+CODE (U"demo Text: 50, \"centre\", 20, \"half\", \"Analyse\"")
+CODE (U"while demoWaitForInput ( )")
+	CODE1 (U"goto ANALYSE demoClickedIn (30, 70, 16, 24)")
+ENTRY (U"Full-screen viewing")
+NORMAL (U"When you click in the top right corner of the Demo window (64-bit Mac) "
 	"or in the \"zoom box\" (the green button in the title bar of the Demo window on 32-bit Mac), "
 	"the Demo window will zoom out very strongly: it will fill up the whole screen. The menu bar becomes invisible, "
 	"although you can still make it temporarily visible and accessible by moving the mouse to the upper edge of the screen. "
 	"The Dock also becomes invisible, although you can make it temporarily visible and accessible by moving the mouse to the edge "
 	"of the screen (the left, bottom, or right edge, depending on where your Dock normally is). "
 	"When you click the zoom box again, the Demo window is restored to its original size. See also Tips and Tricks below.")
-ENTRY (L"Asynchronous play")
-NORMAL (L"If you select a Sound and execute the command")
-CODE (L"Play")
-NORMAL (L"Praat will play the whole sound before proceeding to the next line of your script. "
+ENTRY (U"Asynchronous play")
+NORMAL (U"If you select a Sound and execute the command")
+CODE (U"Play")
+NORMAL (U"Praat will play the whole sound before proceeding to the next line of your script. "
 	"You will often instead want Praat to continue running your script while the sound is playing. "
 	"To accomplish that, use the \"asynchronous\" directive:")
-CODE (L"Create Sound as pure tone: \"tone\", 1, 0, 0.2, 44100, 440, 0.2, 0.01, 0.01")
-CODE (L"#asynchronous Play")
-CODE (L"Remove")
-NORMAL (L"The sound will continue to play, even after the Sound object has been removed.")
-NORMAL (L"Please note that a following Play command will interrupt the playing of the first:")
-CODE (L"while demoWaitForInput ( )")
-	CODE1 (L"if demoClicked ( )")
-		CODE2 (L"Create Sound as pure tone: \"tone\", 1, 0, 3.0, 44100,")
-		CODE2 (L"... randomGauss (440, 100), 0.2, 0.01, 0.01")
-		CODE2 (L"asynchronous Play")
-		CODE2 (L"Remove")
-	CODE1 (L"endif")
-CODE (L"endwhile")
-NORMAL (L"The first sound will stop playing soon after the user clicks for the second time.")
-ENTRY (L"Miscellaneous")
-NORMAL (L"In the above examples, things will often get drawn to the screen with some delay, "
+CODE (U"Create Sound as pure tone: \"tone\", 1, 0, 0.2, 44100, 440, 0.2, 0.01, 0.01")
+CODE (U"#asynchronous Play")
+CODE (U"Remove")
+NORMAL (U"The sound will continue to play, even after the Sound object has been removed.")
+NORMAL (U"Please note that a following Play command will interrupt the playing of the first:")
+CODE (U"while demoWaitForInput ( )")
+	CODE1 (U"if demoClicked ( )")
+		CODE2 (U"Create Sound as pure tone: \"tone\", 1, 0, 3.0, 44100,")
+		CODE2 (U"... randomGauss (440, 100), 0.2, 0.01, 0.01")
+		CODE2 (U"asynchronous Play")
+		CODE2 (U"Remove")
+	CODE1 (U"endif")
+CODE (U"endwhile")
+NORMAL (U"The first sound will stop playing soon after the user clicks for the second time.")
+ENTRY (U"Miscellaneous")
+NORMAL (U"In the above examples, things will often get drawn to the screen with some delay, "
 	"i.e., you may not see the erasures and paintings happening. This is because several operating systems "
 	"use %buffering of graphics. These systems will draw the graphics only just before getting user input. "
 	"This means that #demoWaitForInput is the place where your drawings will typically be painted on the screen. "
 	"If you want painting to happen earlier (e.g. in animations), you can use ##demoShow ( )#.")
-NORMAL (L"To see whether any function keys are pressed (during a mouse click or key press), "
+NORMAL (U"To see whether any function keys are pressed (during a mouse click or key press), "
 	"you can use ##demoShiftKeyPressed ( )#, ##demoCommandKeyPressed ( )#, ##demoOptionKeyPressed ( )#, and "
 	"##demoExtraControlKeyPressed ( )#.")
-NORMAL (L"To put some text in the title bar of the Demo window, try")
-CODE (L"#demoWindowTitle: \"This is the title of my presentation\"")
-ENTRY (L"Tips and Tricks")
-NORMAL (L"If you resize the Demo window with the handle in the bottom left, or if you zoom the window out to the full screen, "
+NORMAL (U"To put some text in the title bar of the Demo window, try")
+CODE (U"#demoWindowTitle: \"This is the title of my presentation\"")
+ENTRY (U"Tips and Tricks")
+NORMAL (U"If you resize the Demo window with the handle in the bottom left, or if you zoom the window out to the full screen, "
 	"you may see that the relative positions of the contents of the window will change. Also, clicking on buttons and in parts "
 	"of the window may yield unexpected %x and %y values. It is therefore advisable to resize the window only if you are on a page "
 	"that you can get out of by pressing a key, or by clicking anywhere in the window without using #demoX, #demoY or #demoClickedIn.")
-NORMAL (L"If you click away the Demo window while it is waiting for input, you get a message saying \"You interrupted the script...\". "
+NORMAL (U"If you click away the Demo window while it is waiting for input, you get a message saying \"You interrupted the script...\". "
 	"If you do not want to see this message, you should make sure that the user can reach the end of the script, for instance by "
 	"pressing the \\-> key on the last page. To make sure the user sees that the script has ended, you could end it with ##demo Erase all#.")
-NORMAL (L"Your demo can save its preferences in a directory of its choice, "
+NORMAL (U"Your demo can save its preferences in a directory of its choice, "
 	"e.g. in ##'preferencesDirectory\\$ '/../GuineaPigAnalyzer# if your demo is called GuineaPigAnalyzer. "
 	"If you want to be less conspicuous and like to use the Praat preferences directory instead, "
 	"please use the ##apps# subdirectory, in this way:")
-CODE (L"createDirectory: preferencesDirectory\\$  + \"/apps\"")
-CODE (L"createDirectory: preferencesDirectory\\$  + \"/apps/GuineaPigAnalyzer\"")
+CODE (U"createDirectory: preferencesDirectory\\$  + \"/apps\"")
+CODE (U"createDirectory: preferencesDirectory\\$  + \"/apps/GuineaPigAnalyzer\"")
 MAN_END
 
 }
diff --git a/fon/manual_annotation.cpp b/fon/manual_annotation.cpp
index 2fcda4e..bf61994 100644
--- a/fon/manual_annotation.cpp
+++ b/fon/manual_annotation.cpp
@@ -1,6 +1,6 @@
 /* manual_annotation.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,388 +22,388 @@
 void manual_annotation_init (ManPages me);
 void manual_annotation_init (ManPages me) {
 
-MAN_BEGIN (L"Create TextGrid...", L"ppgb", 20101228)
-INTRO (L"A command to create a @TextGrid from scratch.")
-ENTRY (L"Settings")
-TAG (L"##Start time (s)")
-DEFINITION (L"the start time, usually 0 seconds.")
-TAG (L"##End time (s)")
-DEFINITION (L"the end time in seconds, usually the duration.")
-TAG (L"##Tier names")
-DEFINITION (L"a list of the names of the tiers that you want to create, separated by spaces.")
-TAG (L"##Point tiers")
-DEFINITION (L"a list of the names of the tiers that you want to be %%point tiers%; "
+MAN_BEGIN (U"Create TextGrid...", U"ppgb", 20101228)
+INTRO (U"A command to create a @TextGrid from scratch.")
+ENTRY (U"Settings")
+TAG (U"##Start time (s)")
+DEFINITION (U"the start time, usually 0 seconds.")
+TAG (U"##End time (s)")
+DEFINITION (U"the end time in seconds, usually the duration.")
+TAG (U"##Tier names")
+DEFINITION (U"a list of the names of the tiers that you want to create, separated by spaces.")
+TAG (U"##Point tiers")
+DEFINITION (U"a list of the names of the tiers that you want to be %%point tiers%; "
 	"the rest of the tiers will be %%interval tiers%.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: To TextGrid...", L"ppgb", 19980113)
-INTRO (L"A command to create an empty @TextGrid from every selected @PointProcess.")
-NORMAL (L"The only information in the PointProcess that is used, is its starting and finishing times.")
-ENTRY (L"Settings")
-TAG (L"##Tier names")
-DEFINITION (L"a list of the names of the tiers that you want to create, separated by spaces.")
-TAG (L"##Point tiers")
-DEFINITION (L"a list of the names of the tiers that you want to be %%point tiers%; "
+MAN_BEGIN (U"PointProcess: To TextGrid...", U"ppgb", 19980113)
+INTRO (U"A command to create an empty @TextGrid from every selected @PointProcess.")
+NORMAL (U"The only information in the PointProcess that is used, is its starting and finishing times.")
+ENTRY (U"Settings")
+TAG (U"##Tier names")
+DEFINITION (U"a list of the names of the tiers that you want to create, separated by spaces.")
+TAG (U"##Point tiers")
+DEFINITION (U"a list of the names of the tiers that you want to be %%point tiers%; "
 	"the rest of the tiers will be %%interval tiers%.")
-ENTRY (L"Example")
-NORMAL (L"If ##Tier names# is \"a b c\", and ##Point tiers# is \"b\", "
+ENTRY (U"Example")
+NORMAL (U"If ##Tier names# is \"a b c\", and ##Point tiers# is \"b\", "
 	"the resulting TextGrid object will contain an interval tier named \"a\", "
 	"a point tier named \"b\", and another interval tier named \"c\".")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: To TextGrid (vuv)...", L"ppgb", 19980210)
-INTRO (L"A command to create a @TextGrid with voiced/unvoiced information "
+MAN_BEGIN (U"PointProcess: To TextGrid (vuv)...", U"ppgb", 19980210)
+INTRO (U"A command to create a @TextGrid with voiced/unvoiced information "
 	"from every selected @PointProcess.")
-ENTRY (L"Settings")
-TAG (L"##Maximum period (s)")
-DEFINITION (L"the maximum interval that will be consider part of a larger voiced interval.")
-TAG (L"##Mean period (s)")
-DEFINITION (L"half of this value will be taken to be the amount to which a voiced interval "
+ENTRY (U"Settings")
+TAG (U"##Maximum period (s)")
+DEFINITION (U"the maximum interval that will be consider part of a larger voiced interval.")
+TAG (U"##Mean period (s)")
+DEFINITION (U"half of this value will be taken to be the amount to which a voiced interval "
 	"will extend beyond its initial and final points. ##Mean period# should be less than "
 	"##Maximum period#, or you may get intervals with negative durations.")
-ENTRY (L"Example")
-NORMAL (L"If ##Maximum period# is 0.02 s, and ##Mean period# is 0.01 s, "
+ENTRY (U"Example")
+NORMAL (U"If ##Maximum period# is 0.02 s, and ##Mean period# is 0.01 s, "
 	"and the point process is 0.1 seconds long, with points at 20, 28, 39, 61, and 72 milliseconds, "
 	"the resulting TextGrid object will contain an interval tier "
 	"with \"U\" intervals at [0 ms, 15 ms], [44 ms, 56 ms], and [77 ms, 100 ms], "
 	"and \"V\" intervals at [15 ms, 44 ms] and [56 ms, 77 ms].")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: Up to TextGrid...", L"ppgb", 20101230)
-INTRO (L"A command to promote every selected @PointProcess to a @TextGrid with a single text tier in it.")
-ENTRY (L"Setting")
-TAG (L"##Text")
-DEFINITION (L"the text that will be placed in every point.")
-ENTRY (L"Behaviour")
-NORMAL (L"The times of all the points are trivially copied, and so is the time domain. "
+MAN_BEGIN (U"PointProcess: Up to TextGrid...", U"ppgb", 20101230)
+INTRO (U"A command to promote every selected @PointProcess to a @TextGrid with a single text tier in it.")
+ENTRY (U"Setting")
+TAG (U"##Text")
+DEFINITION (U"the text that will be placed in every point.")
+ENTRY (U"Behaviour")
+NORMAL (U"The times of all the points are trivially copied, and so is the time domain. "
 	"The text information will be the same for every point.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To TextGrid...", L"ppgb", 19980730)
-INTRO (L"A command to create a @TextGrid without any labels, copying the time domain from the selected @Sound.")
-ENTRY (L"Settings")
-TAG (L"%%Tier names")
-DEFINITION (L"a list of the names of the tiers that you want to create, separated by spaces.")
-TAG (L"%%Point tiers")
-DEFINITION (L"a list of the names of the tiers that you want to be %%point tiers%; "
+MAN_BEGIN (U"Sound: To TextGrid...", U"ppgb", 19980730)
+INTRO (U"A command to create a @TextGrid without any labels, copying the time domain from the selected @Sound.")
+ENTRY (U"Settings")
+TAG (U"%%Tier names")
+DEFINITION (U"a list of the names of the tiers that you want to create, separated by spaces.")
+TAG (U"%%Point tiers")
+DEFINITION (U"a list of the names of the tiers that you want to be %%point tiers%; "
 	"the rest of the tiers will be %%interval tiers%.")
-ENTRY (L"Example")
-NORMAL (L"If ##Tier names# is \"a b c\", and ##Point tiers# is \"b\", "
+ENTRY (U"Example")
+NORMAL (U"If ##Tier names# is \"a b c\", and ##Point tiers# is \"b\", "
 	"the resulting TextGrid object will contain an interval tier named \"a\", "
 	"a point tier named \"b\", and another interval tier named \"c\".")
 MAN_END
 
-MAN_BEGIN (L"SpellingChecker", L"ppgb", 20110128)
-INTRO (L"One of the @@types of objects@ in Praat. For checking the spelling in texts and @TextGrid objects.")
-ENTRY (L"1. How to create a SpellingChecker object")
-NORMAL (L"You normally read in a SpellingChecker with @@Read from file...@ from the #Open menu.")
-ENTRY (L"2. How to check the spelling of a @TextGrid")
-NORMAL (L"A SpellingChecker object can be used fur purposes of spelling checking. In order "
+MAN_BEGIN (U"SpellingChecker", U"ppgb", 20110128)
+INTRO (U"One of the @@types of objects@ in Praat. For checking the spelling in texts and @TextGrid objects.")
+ENTRY (U"1. How to create a SpellingChecker object")
+NORMAL (U"You normally read in a SpellingChecker with @@Read from file...@ from the #Open menu.")
+ENTRY (U"2. How to check the spelling of a @TextGrid")
+NORMAL (U"A SpellingChecker object can be used fur purposes of spelling checking. In order "
 	"to check the spellings in a @TextGrid object, you first view the TextGrid in an editor window by selecting "
 	"the TextGrid together with the SpellingChecker object, and clicking ##View & Edit#. In most cases, you will also want "
 	"to select a @Sound or @LongSound object before clicking ##View & Edit#, so that a representation of the sound "
 	"is also visible (and audible) in the editor. Thus, you typically select three objects and click ##View & Edit#. "
 	"The editor then allows you to check the spellings "
 	"(commands ##Check spelling in tier# and ##Check spelling in interval# from the #Spell menu).")
-ENTRY (L"3. How to create a SpellingChecker object for the first time")
-NORMAL (L"If you are the maintainer of a word list for spelling checking, you will want "
+ENTRY (U"3. How to create a SpellingChecker object for the first time")
+NORMAL (U"If you are the maintainer of a word list for spelling checking, you will want "
 	"to convert this list to a SpellingChecker object that you can distribute among the transcribers of your corpus.")
-NORMAL (L"The first step is to create a @WordList object from your text file, as described on the @WordList man page. "
+NORMAL (U"The first step is to create a @WordList object from your text file, as described on the @WordList man page. "
 	"Then you simply click ##To SpellingChecker#. A button labelled ##Edit...# appears. "
 	"This command allows you to set the following attributes of the SpellingChecker object:")
-/*TAG (L"##Check matching parentheses")
-DEFINITION (L"determines whether it is considered a spelling error if parentheses do not match, as in the string \"Hi) there\".")*/
-TAG (L"##Allow all parenthesized")
-DEFINITION (L"this flag determines whether text between parentheses is ignored in spelling checking. "
+/*TAG (U"##Check matching parentheses")
+DEFINITION (U"determines whether it is considered a spelling error if parentheses do not match, as in the string \"Hi) there\".")*/
+TAG (U"##Allow all parenthesized")
+DEFINITION (U"this flag determines whether text between parentheses is ignored in spelling checking. "
 	"This would allow the transcriber to mark utterances in foreign languages, which cannot be found in the lexicon.")
-TAG (L"##Separating characters")
-DEFINITION (L"determines the set of characters (apart from the space character) that separate words. "
+TAG (U"##Separating characters")
+DEFINITION (U"determines the set of characters (apart from the space character) that separate words. "
 	"The standard is \".,;:()\". If a string like \"error-prone\" should be considered two separate words, "
 	"you will like to change this to \".,;:()-\". "
 	"For the Corpus of Spoken Dutch (CGN), the hyphen is not a separator, since words like \"mee-eter\" should be checked as a whole. "
 	"If a string like \"Mary's\" should be considered two separate words, include the apostrophe.")
-/*TAG (L"##Forbidden strings")
-DEFINITION (L"this will mainly contain characters that are not allowed in your corpus. For the CGN, this is \": ; \\\" \".")*/
-TAG (L"##Allow all names")
-DEFINITION (L"determines whether all words that start with a capital are allowed. For the CGN, this is on, "
+/*TAG (U"##Forbidden strings")
+DEFINITION (U"this will mainly contain characters that are not allowed in your corpus. For the CGN, this is \": ; \\\" \".")*/
+TAG (U"##Allow all names")
+DEFINITION (U"determines whether all words that start with a capital are allowed. For the CGN, this is on, "
 	"since the lexicon does not contain many names.")
-TAG (L"##Name prefixes")
-DEFINITION (L"a space-separated list that determines what small groups of characters can precede names. For the CGN, "
+TAG (U"##Name prefixes")
+DEFINITION (U"a space-separated list that determines what small groups of characters can precede names. For the CGN, "
 	"this is \"'s- d' l'\", since names like %%'s-Gravenhage%, %%d'Ancona%, and %%l'H\\o^pital% should be ignored by the spelling checker.")
-TAG (L"##Allow all words containing")
-DEFINITION (L"a space-separated list of strings that make a word correct even if not in the lexicon. "
+TAG (U"##Allow all words containing")
+DEFINITION (U"a space-separated list of strings that make a word correct even if not in the lexicon. "
 	"For the CGN, this is \"* xxx\", since words like %%keuje*d% and %%verxxxing% should be ignored by the spelling checker.")
-TAG (L"##Allow all words starting with")
-DEFINITION (L"a space-separated list of prefixes that make a word correct even if not in the lexicon. "
+TAG (U"##Allow all words starting with")
+DEFINITION (U"a space-separated list of prefixes that make a word correct even if not in the lexicon. "
 	"For the CGN, this is empty.")
-TAG (L"##Allow all words ending in")
-DEFINITION (L"a space-separated list of suffixes that make a word correct even if not in the lexicon. "
+TAG (U"##Allow all words ending in")
+DEFINITION (U"a space-separated list of suffixes that make a word correct even if not in the lexicon. "
 	"For the CGN, this is \"-\", since the first word in %%verzekerings- en bankwezen% should be ignored by the spelling checker.")
 MAN_END
 
-MAN_BEGIN (L"TextGrid", L"ppgb", 20110128)
-INTRO (L"One of the @@types of objects@ in Praat, used for %annotation (segmentation and labelling). "
+MAN_BEGIN (U"TextGrid", U"ppgb", 20110128)
+INTRO (U"One of the @@types of objects@ in Praat, used for %annotation (segmentation and labelling). "
 	"For tutorial information, see @@Intro 7. Annotation at .")
-ENTRY (L"Description")
-NORMAL (L"A #TextGrid object consists of a number of %tiers. There are two kinds of tiers: "
+ENTRY (U"Description")
+NORMAL (U"A #TextGrid object consists of a number of %tiers. There are two kinds of tiers: "
 	"an %%interval tier% is a connected sequence of labelled intervals, with %boundaries in between. "
 	"A %%point tier% is a sequence of labelled points.")
-ENTRY (L"How to create a TextGrid")
-TAG (L"From scratch:")
-LIST_ITEM (L"@@Sound: To TextGrid...@ (takes the time domain from the Sound)")
-LIST_ITEM (L"@@LongSound: To TextGrid...@ (takes the time domain from the LongSound)")
-LIST_ITEM (L"@@PointProcess: To TextGrid...@ (takes the time domain from the PointProcess)")
-LIST_ITEM (L"@@PointProcess: To TextGrid (vuv)...@ (labels voiced and unvoiced intervals)")
-LIST_ITEM (L"@@Create TextGrid...@")
-TAG (L"From merging existing TextGrids with each other:")
-LIST_ITEM (L"@@TextGrids: Merge@")
-ENTRY (L"How to edit a TextGrid")
-NORMAL (L"You select a TextGrid alone or together with a @Sound or @LongSound, and click ##View & Edit#. "
+ENTRY (U"How to create a TextGrid")
+TAG (U"From scratch:")
+LIST_ITEM (U"@@Sound: To TextGrid...@ (takes the time domain from the Sound)")
+LIST_ITEM (U"@@LongSound: To TextGrid...@ (takes the time domain from the LongSound)")
+LIST_ITEM (U"@@PointProcess: To TextGrid...@ (takes the time domain from the PointProcess)")
+LIST_ITEM (U"@@PointProcess: To TextGrid (vuv)...@ (labels voiced and unvoiced intervals)")
+LIST_ITEM (U"@@Create TextGrid...@")
+TAG (U"From merging existing TextGrids with each other:")
+LIST_ITEM (U"@@TextGrids: Merge@")
+ENTRY (U"How to edit a TextGrid")
+NORMAL (U"You select a TextGrid alone or together with a @Sound or @LongSound, and click ##View & Edit#. "
 	"A @TextGridEditor will appear on your screen, containing the TextGrid "
 	"and an optional copy of the Sound or LongSound.")
-ENTRY (L"How to draw a TextGrid")
-TAG (L"You can draw a TextGrid to the @@Picture window@ with:")
-LIST_ITEM (L"##TextGrid: Draw...")
-LIST_ITEM (L"##TextGrid & Sound: Draw...")
-LIST_ITEM (L"##TextGrid & Pitch: Draw...")
-LIST_ITEM (L"##TextGrid & Pitch: Draw separately...")
+ENTRY (U"How to draw a TextGrid")
+TAG (U"You can draw a TextGrid to the @@Picture window@ with:")
+LIST_ITEM (U"##TextGrid: Draw...")
+LIST_ITEM (U"##TextGrid & Sound: Draw...")
+LIST_ITEM (U"##TextGrid & Pitch: Draw...")
+LIST_ITEM (U"##TextGrid & Pitch: Draw separately...")
 MAN_END
 
-MAN_BEGIN (L"TextGrid: Count labels...", L"ppgb", 20140421)
-INTRO (L"A command to ask the selected @TextGrid object how many of the specified labels "
+MAN_BEGIN (U"TextGrid: Count labels...", U"ppgb", 20140421)
+INTRO (U"A command to ask the selected @TextGrid object how many of the specified labels "
 	"it contains in the specified tier.")
-ENTRY (L"Settings")
-TAG (L"##Tier number")
-DEFINITION (L"the number (1, 2, 3...) of the tier whose labels you want to investigate.")
-TAG (L"##Label text")
-DEFINITION (L"the text on the labels that you want to count.")
-ENTRY (L"Behaviour")
-NORMAL (L"The number of intervals or points with label %%Label text% in tier %%Tier number% "
+ENTRY (U"Settings")
+TAG (U"##Tier number")
+DEFINITION (U"the number (1, 2, 3...) of the tier whose labels you want to investigate.")
+TAG (U"##Label text")
+DEFINITION (U"the text on the labels that you want to count.")
+ENTRY (U"Behaviour")
+NORMAL (U"The number of intervals or points with label %%Label text% in tier %%Tier number% "
 	"is written into the @@Info window at . If the specified tier does not exist, the number will be 0.")
-ENTRY (L"Scripting")
-NORMAL (L"You can use this command to put the number into a script variable:")
-CODE (L"selectObject: \"TextGrid hallo\"")
-CODE (L"number_of_a = Count labels: 1, \"a\"")
-NORMAL (L"In this case, the value will not be written into the Info window.")
+ENTRY (U"Scripting")
+NORMAL (U"You can use this command to put the number into a script variable:")
+CODE (U"selectObject: \"TextGrid hallo\"")
+CODE (U"number_of_a = Count labels: 1, \"a\"")
+NORMAL (U"In this case, the value will not be written into the Info window.")
 MAN_END
  
-MAN_BEGIN (L"TextGrids: Merge", L"ppgb", 20101230)
-INTRO (L"A command to merge all selected @TextGrid objects into a new @TextGrid.")
+MAN_BEGIN (U"TextGrids: Merge", U"ppgb", 20101230)
+INTRO (U"A command to merge all selected @TextGrid objects into a new @TextGrid.")
 MAN_END
 
-MAN_BEGIN (L"TextGridEditor", L"ppgb", 20110131)
-INTRO (L"One of the @Editors in Praat, for editing a @TextGrid object.")
-NORMAL (L"You can optionally include a copy of a @Sound or @LongSound in this editor, "
+MAN_BEGIN (U"TextGridEditor", U"ppgb", 20110131)
+INTRO (U"One of the @Editors in Praat, for editing a @TextGrid object.")
+NORMAL (U"You can optionally include a copy of a @Sound or @LongSound in this editor, "
 	"by selecting both the TextGrid and the Sound or LongSound before clicking ##View & Edit#. "
 	"The Sound or LongSound is shown in the upper part of the window, the tiers in the lower part. "
 	"A text window at the top shows the text of the %#selected interval or point, "
 	"i.e. the interval or point at the location of the cursor. "
 	"All tiers are visible, and if you do not zoom in, all boundaries, points, and texts are visible, too. "
 	"You can do many of the same things that you can do with a @SoundEditor or @LongSoundEditor.")
-ENTRY (L"Positioning the cursor or the selection marks")
-NORMAL (L"To position the cursor hair, @click in the #Sound, on a boundary, on a point, or inside an interval.")
-NORMAL (L"To select any part of the time domain, use the @@time selection@ mechanism; "
+ENTRY (U"Positioning the cursor or the selection marks")
+NORMAL (U"To position the cursor hair, @click in the #Sound, on a boundary, on a point, or inside an interval.")
+NORMAL (U"To select any part of the time domain, use the @@time selection@ mechanism; "
 	"if you do this by clicking in a tier, "
 	"the selected time domain will snap to the nearest boundary or point.")
-ENTRY (L"Creating new intervals, boundaries, points, or tiers")
-NORMAL (L"To create a new interval, create a new boundary in an interval tier.")
-NORMAL (L"To create a new boundary or point in a tier, @click inside the cursor circle in that tier, "
+ENTRY (U"Creating new intervals, boundaries, points, or tiers")
+NORMAL (U"To create a new interval, create a new boundary in an interval tier.")
+NORMAL (U"To create a new boundary or point in a tier, @click inside the cursor circle in that tier, "
 	"or choose one of the commands in the Boundary/Point menu to insert a boundary at the cursor time "
 	"on the selected tier (shortcut: Enter) or on any tier (shortcuts: Command-F1 through Command-F9). The original text "
 	"in the interval that is split, is divided up between the two resulting intervals, depending on "
 	"the position of the text cursor in the text window.")
-NORMAL (L"To create a new tier, choose ##Add interval tier# or ##Add point tier# from the #Tier menu.")
-ENTRY (L"Playing an entire interval, or part of it")
-NORMAL (L"As in many other editors, you can play a stretch of sound by clicking in any of the rectangles "
+NORMAL (U"To create a new tier, choose ##Add interval tier# or ##Add point tier# from the #Tier menu.")
+ENTRY (U"Playing an entire interval, or part of it")
+NORMAL (U"As in many other editors, you can play a stretch of sound by clicking in any of the rectangles "
 	"around the drawing area.")
-NORMAL (L"To play an interval of an interval tier, you first @click inside it. This will make the interval %selected, "
+NORMAL (U"To play an interval of an interval tier, you first @click inside it. This will make the interval %selected, "
 	"which means that the visible part of the interval will be drawn in yellow. The cursor will be positioned "
 	"at the start of the interval, and the time selection will comprise exactly the interval. This means that "
 	"you can use the Tab key to play the interval. If you press it while a sound is playing, "
 	"the Tab key will halt the playing sound, and the cursor will move to the time at which the sound stopped playing. "
 	"This helps you to divide up a long sentence into parts that you can remember long enough to write them "
 	"down.")
-NORMAL (L"The Tab key will play the selected interval.")
-ENTRY (L"Editing the text in an interval or at a point")
-NORMAL (L"To edit the label text of an interval or point:")
-LIST_ITEM (L"1. Select that interval or point by clicking in or on it. The text currently in the interval or point "
+NORMAL (U"The Tab key will play the selected interval.")
+ENTRY (U"Editing the text in an interval or at a point")
+NORMAL (U"To edit the label text of an interval or point:")
+LIST_ITEM (U"1. Select that interval or point by clicking in or on it. The text currently in the interval or point "
 	"will appear in the text window.")
-LIST_ITEM (L"2. Just type the text, and use the mouse and the arrow keys to navigate the text window. "
+LIST_ITEM (U"2. Just type the text, and use the mouse and the arrow keys to navigate the text window. "
 	"Everything you type will become visible immediately in the text window as well as in the selected "
 	"interval or point.")
-NORMAL (L"You can use all the @@Special symbols@ "
+NORMAL (U"You can use all the @@Special symbols@ "
 	"that you can use elsewhere in Praat, including mathematical symbols, Greek and Chinese letters, superscripts, "
 	"and phonetic symbols.")
-ENTRY (L"Selecting a tier")
-NORMAL (L"To select a tier, click anywhere inside it. Its number and name will be drawn in red, "
+ENTRY (U"Selecting a tier")
+NORMAL (U"To select a tier, click anywhere inside it. Its number and name will be drawn in red, "
 	"and a pointing finger symbol (☞) will appear on its left.")
-ENTRY (L"Selecting a boundary or point")
-NORMAL (L"To select a boundary on an interval tier, @click in its vicinity or inside the following interval; "
+ENTRY (U"Selecting a boundary or point")
+NORMAL (U"To select a boundary on an interval tier, @click in its vicinity or inside the following interval; "
 	"the boundary will be drawn in red. The text in the interval will appear in the text window.")
-NORMAL (L"To select a point on a point tier, @click in its vicinity; it will be drawn in red. "
+NORMAL (U"To select a point on a point tier, @click in its vicinity; it will be drawn in red. "
 	"The text of the point will appear in the text window.")
-ENTRY (L"Moving one or more boundaries or points")
-NORMAL (L"To move a boundary or point to another time position, @drag it with the mouse.")
-NORMAL (L"To move all the boundaries and points with the same time (on different tiers) to another time position, "
+ENTRY (U"Moving one or more boundaries or points")
+NORMAL (U"To move a boundary or point to another time position, @drag it with the mouse.")
+NORMAL (U"To move all the boundaries and points with the same time (on different tiers) to another time position, "
 	"@@Shift-drag@ them.")
-NORMAL (L"To move boundaries or points to the exact time position of a boundary or point on an other tier, "
+NORMAL (U"To move boundaries or points to the exact time position of a boundary or point on an other tier, "
 	"@drag them into that other tier and into the vicinity of that boundary or point.")
-NORMAL (L"To move boundaries or points to the exact time position of the cursor, "
+NORMAL (U"To move boundaries or points to the exact time position of the cursor, "
 	"@drag them into the vicinity of the cursor.")
-ENTRY (L"Removing a boundary, point, or tier")
-NORMAL (L"To remove a selected #boundary, choose #Remove from the #Boundary menu. "
+ENTRY (U"Removing a boundary, point, or tier")
+NORMAL (U"To remove a selected #boundary, choose #Remove from the #Boundary menu. "
 	"This creates a new interval which is the union of the two intervals originally adjoining the boundary; "
 	"the new text of this interval is the concatenation of the two original texts, "
 	"except if these were equal, in which case the new text equals both original texts.")
-NORMAL (L"To remove a selected #point, choose #Remove from the #Point menu.")
-NORMAL (L"To remove a selected #tier, choose ##Remove entire tier# from the #Tier menu.")
+NORMAL (U"To remove a selected #point, choose #Remove from the #Point menu.")
+NORMAL (U"To remove a selected #tier, choose ##Remove entire tier# from the #Tier menu.")
 /*"To rename a selected tier, choose 'Rename...' from the 'Tier' menu. "*/
 /*"To remove all the boundaries and labels in a selected tier, "
 "   choose 'Clear entire tier' from the 'Tier' menu. "*/
-ENTRY (L"Extracting a part of the sound")
-NORMAL (L"To copy the selected part of the Sound or LongSound as a Sound to the @@List of Objects@, "
+ENTRY (U"Extracting a part of the sound")
+NORMAL (U"To copy the selected part of the Sound or LongSound as a Sound to the @@List of Objects@, "
 	"choose ##Extract sound selection# from the #File menu. You can specify whether you want "
 	"the time domain of the resulting Sound to match the starting and finishing times of the "
 	"selection or whether you want the time domain of the resulting Sound to start at zero seconds.")
-NORMAL (L"If you are viewing a LongSound, you can save the selected part of it to a 16-bit sound file "
+NORMAL (U"If you are viewing a LongSound, you can save the selected part of it to a 16-bit sound file "
 	"(AIFF, AIFC, WAV, NeXT/Sun, NIST) with a command from the File menu.")
-ENTRY (L"Accelerations")
-NORMAL (L"To save the @TextGrid object as a text file without going to the @@Object window@: "
+ENTRY (U"Accelerations")
+NORMAL (U"To save the @TextGrid object as a text file without going to the @@Object window@: "
 	"choose ##Save TextGrid as text file...# from the #File menu.")
-ENTRY (L"Searching")
-NORMAL (L"The Search menu contains the command #Find (Command-F), which will allow you to specify "
+ENTRY (U"Searching")
+NORMAL (U"The Search menu contains the command #Find (Command-F), which will allow you to specify "
 	"a text whose first occurrence will then be looked for in the currently selected tier "
 	"(starting from the currently selected text in the currently selected interval). "
 	"The command ##Find again# (Command-G) will search for the next occurrence of the same search text.")
-ENTRY (L"Checking the spelling")
-NORMAL (L"You can check the spelling of the intervals in your tiers by including a @SpellingChecker "
+ENTRY (U"Checking the spelling")
+NORMAL (U"You can check the spelling of the intervals in your tiers by including a @SpellingChecker "
 	"object as you launch the editor: select TextGrid + (Long)Sound + SpellingChecker, "
 	"then click ##View & Edit#. The #Spell menu will contain the commands ##Check spelling in tier# (Command-N), and ##Check spelling in interval# "
 	"which will search for the next word in the tier or interval that does not occur in the lexicon.")
 MAN_END
 
-MAN_BEGIN (L"WordList", L"ppgb", 20140421)
-INTRO (L"One of the @@types of objects@ in Praat. "
+MAN_BEGIN (U"WordList", U"ppgb", 20140421)
+INTRO (U"One of the @@types of objects@ in Praat. "
 	"An object of class WordList contains a sorted list of strings in a system-independent format. "
 	"WordList objects can be used for spelling checking after conversion to a @SpellingChecker object.")
-ENTRY (L"1. How to create a WordList object")
-NORMAL (L"You will normally create a WordList object by reading a binary WordList file. "
+ENTRY (U"1. How to create a WordList object")
+NORMAL (U"You will normally create a WordList object by reading a binary WordList file. "
 	"You'll use the generic @@Read from file...@ command from the #Open menu.")
-NORMAL (L"See below under 3 for how to create such a file.")
-ENTRY (L"2. What you can do with a Wordlist object")
-NORMAL (L"The main functionality of a WordList is its ability to tell you whether it contains a certain string. "
+NORMAL (U"See below under 3 for how to create such a file.")
+ENTRY (U"2. What you can do with a Wordlist object")
+NORMAL (U"The main functionality of a WordList is its ability to tell you whether it contains a certain string. "
 	"If you select a WordList, you can query the existence of a specific word by using the ##Has word# "
 	"command. You supply the word and press OK. If the WordList does contain the word, "
 	"the value \"1\" will be written to the Info window; otherwise, the value \"0\" will be written.")
-ENTRY (L"3. How to create a binary WordList file")
-NORMAL (L"You can create a binary (compressed) WordList file from a simple text file that contains a long list of words. "
+ENTRY (U"3. How to create a binary WordList file")
+NORMAL (U"You can create a binary (compressed) WordList file from a simple text file that contains a long list of words. "
 	"Perhaps such a text file has been supplied by a lexicographic institution in your country; "
 	"because of copyright issues, such word lists cannot be distributed with the Praat program. "
 	"To convert the simple text file into a compressed WordList file, you basically take the following steps:")
-CODE (L"Read Strings from raw text file: \"lexicon.iso\"")
-CODE (L"Genericize")
-CODE (L"Sort")
-CODE (L"To WordList")
-CODE (L"Save as binary file: \"lexicon.WordList\"")
-NORMAL (L"I'll explain these steps in detail. "
+CODE (U"Read Strings from raw text file: \"lexicon.iso\"")
+CODE (U"Genericize")
+CODE (U"Sort")
+CODE (U"To WordList")
+CODE (U"Save as binary file: \"lexicon.WordList\"")
+NORMAL (U"I'll explain these steps in detail. "
 	"For instance, a simple text file may contain the following list of words:")
-CODE (L"cook")
-CODE (L"cooked")
-CODE (L"cookie")
-CODE (L"cookies")
-CODE (L"cooking")
-CODE (L"cooks")
-CODE (L"Copenhagen")
-CODE (L"K\\o/bnhavn")
-CODE (L"M\\u\"nchen")
-CODE (L"Munich")
-CODE (L"\\aongstr\\o\"m")
-NORMAL (L"These are just 11 words, but the procedure will work fine if you have a million of them, "
+CODE (U"cook")
+CODE (U"cooked")
+CODE (U"cookie")
+CODE (U"cookies")
+CODE (U"cooking")
+CODE (U"cooks")
+CODE (U"Copenhagen")
+CODE (U"K\\o/bnhavn")
+CODE (U"M\\u\"nchen")
+CODE (U"Munich")
+CODE (U"\\aongstr\\o\"m")
+NORMAL (U"These are just 11 words, but the procedure will work fine if you have a million of them, "
 	"and enough memory in your computer.")
-NORMAL (L"You can read the file into a @Strings object with @@Read Strings from raw text file...@ "
+NORMAL (U"You can read the file into a @Strings object with @@Read Strings from raw text file...@ "
 	"from the #Open menu in the Objects window. The resulting @Strings object contains 11 strings in the above order, "
 	"as you can verify by viewing them with @Inspect.")
-NORMAL (L"In general, the Strings object will occupy a lot of memory, and be slow to read in. "
+NORMAL (U"In general, the Strings object will occupy a lot of memory, and be slow to read in. "
 	"For instance, a certain list of more than 300,000 Dutch word forms occupies 3.6 MB on disk, "
 	"and will occupy at least 7 MB of memory after it is read in. The extra 3.4 MB arise because the Strings object "
 	"contains a pointer to each of the strings, and each of the strings is in a separately allocated part of "
 	"the memory heap. Moreover, it takes 8 seconds on an average 1999 computer to read this object into memory. "
 	"For these reasons, we will use the WordList object if we need a sorted list for spelling checking.")
-NORMAL (L"If you select the Strings, you can click the ##To WordList# button. "
+NORMAL (U"If you select the Strings, you can click the ##To WordList# button. "
 	"However, you will get the following complaint:")
-CODE (L"String \"K\\o/bnhavn\" not generic. Please genericize first.")
-NORMAL (L"This complaint means that the strings are still in your computer's native text format, "
+CODE (U"String \"K\\o/bnhavn\" not generic. Please genericize first.")
+NORMAL (U"This complaint means that the strings are still in your computer's native text format, "
 	"which is ISO-Latin1 for Unix and Windows computers, or Mac encoding for Macintosh computers.")
-NORMAL (L"So you press the #Genericize button. You can see that the Strings object changes to")
-CODE (L"cook")
-CODE (L"cooked")
-CODE (L"cookie")
-CODE (L"cookies")
-CODE (L"cooking")
-CODE (L"cooks")
-CODE (L"Copenhagen")
-CODE (L"K\\bso/bnhavn")
-CODE (L"M\\bsu\\\" nchen")
-CODE (L"Munich")
-CODE (L"\\bsaongstr\\bso\\\" m")
-NORMAL (L"The strings are now in the generic system-independent format that is used everywhere in Praat "
+NORMAL (U"So you press the #Genericize button. You can see that the Strings object changes to")
+CODE (U"cook")
+CODE (U"cooked")
+CODE (U"cookie")
+CODE (U"cookies")
+CODE (U"cooking")
+CODE (U"cooks")
+CODE (U"Copenhagen")
+CODE (U"K\\bso/bnhavn")
+CODE (U"M\\bsu\\\" nchen")
+CODE (U"Munich")
+CODE (U"\\bsaongstr\\bso\\\" m")
+NORMAL (U"The strings are now in the generic system-independent format that is used everywhere in Praat "
 	"to draw strings (see @@Special symbols@).")
-NORMAL (L"You can again try to click the ##To WordList# button. However, you will get a complaint again:")
-CODE1 (L"String \"Copenhagen\" not sorted. Please sort first.")
-NORMAL (L"This complaint means that the strings have not been sorted in ASCII sorting order. "
+NORMAL (U"You can again try to click the ##To WordList# button. However, you will get a complaint again:")
+CODE1 (U"String \"Copenhagen\" not sorted. Please sort first.")
+NORMAL (U"This complaint means that the strings have not been sorted in ASCII sorting order. "
 	"So you click #Sort, and the Strings object becomes:")
-CODE (L"Copenhagen")
-CODE (L"K\\bso/bnhavn")
-CODE (L"M\\bsu\\\" nchen")
-CODE (L"Munich")
-CODE (L"\\bsaongstr\\bso\\\" m")
-CODE (L"cook")
-CODE (L"cooked")
-CODE (L"cookie")
-CODE (L"cookies")
-CODE (L"cooking")
-CODE (L"cooks")
-NORMAL (L"The strings are now in the ASCII order, in which capitals come before lower-case letters, "
+CODE (U"Copenhagen")
+CODE (U"K\\bso/bnhavn")
+CODE (U"M\\bsu\\\" nchen")
+CODE (U"Munich")
+CODE (U"\\bsaongstr\\bso\\\" m")
+CODE (U"cook")
+CODE (U"cooked")
+CODE (U"cookie")
+CODE (U"cookies")
+CODE (U"cooking")
+CODE (U"cooks")
+NORMAL (U"The strings are now in the ASCII order, in which capitals come before lower-case letters, "
 	"and backslashes come in between these two series.")
-NORMAL (L"Clicking ##To WordList# now succeeds, and a WordList object appears in the list. "
+NORMAL (U"Clicking ##To WordList# now succeeds, and a WordList object appears in the list. "
 	"If you save it to a text file (with the Save menu), you will get the following file:")
-CODE (L"File type = \"ooTextFile\"")
-CODE (L"Object class = \"WordList\"")
-CODE (L"")
-CODE (L"string = \"Copenhagen")
-CODE (L"K\\bso/bnhavn")
-CODE (L"M\\bsu\\\" \\\" nchen")
-CODE (L"Munich")
-CODE (L"\\bsaongstr\\bso\\\" \\\" m")
-CODE (L"cook")
-CODE (L"cooked")
-CODE (L"cookie")
-CODE (L"cookies")
-CODE (L"cooking")
-CODE (L"cooks\\\"r")
-NORMAL (L"Note that the double quotes (\\\" ) that appear inside the strings, have been doubled, "
+CODE (U"File type = \"ooTextFile\"")
+CODE (U"Object class = \"WordList\"")
+CODE (U"")
+CODE (U"string = \"Copenhagen")
+CODE (U"K\\bso/bnhavn")
+CODE (U"M\\bsu\\\" \\\" nchen")
+CODE (U"Munich")
+CODE (U"\\bsaongstr\\bso\\\" \\\" m")
+CODE (U"cook")
+CODE (U"cooked")
+CODE (U"cookie")
+CODE (U"cookies")
+CODE (U"cooking")
+CODE (U"cooks\\\"r")
+NORMAL (U"Note that the double quotes (\\\" ) that appear inside the strings, have been doubled, "
 	"as is done everywhere inside strings in Praat text files.")
-NORMAL (L"After you have created a WordList text file, you can create a WordList object just by reading this file "
+NORMAL (U"After you have created a WordList text file, you can create a WordList object just by reading this file "
 	"with @@Read from file...@ from the #Open menu.")
-NORMAL (L"The WordList object has two advantages over the Strings object. First, it won't take up more "
+NORMAL (U"The WordList object has two advantages over the Strings object. First, it won't take up more "
 	"memory than the original word list. This is because the WordList is stored as a single string: "
 	"a contiguous list of strings, separated by new-line symbols. Thus, our 300,000-word list "
 	"will take up only 3.6 MB, and be read in 4 seconds.")
-NORMAL (L"However, disk storage and reading can again be improved by compressing the word list. "
+NORMAL (U"However, disk storage and reading can again be improved by compressing the word list. "
 	"We can take advantage of the sorting, by noting for each entry how many leading characters "
 	"are equal to those of the previous entry. The list then becomes something equivalent to")
-CODE (L"Copenhagen")
-CODE (L"0 K\\bso/bnhavn")
-CODE (L"0 M\\bsu\\\" nchen")
-CODE (L"1 unich")
-CODE (L"0 \\bsaongstr\\bso\\\" m")
-CODE (L"0 cook")
-CODE (L"4 ed")
-CODE (L"4 ie")
-CODE (L"6 s")
-CODE (L"5 ng")
-CODE (L"4 s")
-NORMAL (L"You can save the WordList compressed in this way as a binary file with "
+CODE (U"Copenhagen")
+CODE (U"0 K\\bso/bnhavn")
+CODE (U"0 M\\bsu\\\" nchen")
+CODE (U"1 unich")
+CODE (U"0 \\bsaongstr\\bso\\\" m")
+CODE (U"0 cook")
+CODE (U"4 ed")
+CODE (U"4 ie")
+CODE (U"6 s")
+CODE (U"5 ng")
+CODE (U"4 s")
+NORMAL (U"You can save the WordList compressed in this way as a binary file with "
 	"@@Save as binary file... at . For our 300,000-word list, this file takes up only 1.1 MB "
 	"and can be read into memory (with @@Read from file...@) in a single second. "
 	"When read into memory, the WordList object is again expanded to 3.6 MB to allow rapid searching.")
diff --git a/fon/manual_exampleSound.cpp b/fon/manual_exampleSound.cpp
index 2997bc6..217e80b 100644
--- a/fon/manual_exampleSound.cpp
+++ b/fon/manual_exampleSound.cpp
@@ -2580,31 +2580,31 @@ static const char *data [] = {
 "74??83??;9??=9??<1??6;??>5?>>2?>",
 "57??58??0:??19??5=??3<??=4?>" };
 
-Sound manual_exampleSound (void) {
-	static Sound me = NULL;
-	if (me == NULL) {
+Sound manual_exampleSound () {
+	static autoSound me;
+	if (! me) {
 		long istring = 0, ichar = 24;
 		me = Sound_create (1, 0.0, 20457.0/44100, 20457, 1.0/44100, 0.5/44100);
 		for (long isamp = 1; isamp <= 20457; isamp ++) {
-			unsigned short part1 = data [istring] [ichar] - '0';
-			unsigned short part2 = data [istring] [++ ichar] - '0';
-			unsigned short part3 = data [istring] [++ ichar] - '0';
-			unsigned short part4 = data [istring] [++ ichar] - '0';
-			my z [1] [isamp] = (signed short) ((part3 << 12) + (part4 << 8) + (part1 << 4) + part2) / 32768.0;
+			uint16 part1 = data [istring] [ichar] - '0';
+			uint16 part2 = data [istring] [++ ichar] - '0';
+			uint16 part3 = data [istring] [++ ichar] - '0';
+			uint16 part4 = data [istring] [++ ichar] - '0';
+			my z [1] [isamp] = (int16) ((part3 << 12) + (part4 << 8) + (part1 << 4) + part2) / 32768.0;
 			if (++ ichar == 32) istring ++, ichar = 0;
 		}
 	}
-	return me;
+	return me.get();   // reference
 }
 
-Pitch manual_examplePitch (void) {
-	static Pitch me = NULL;
-	if (me == NULL) {
+Pitch manual_examplePitch () {
+	static autoPitch me;
+	if (! me) {
 		Melder_progressOff ();
 		me = Sound_to_Pitch (manual_exampleSound (), 0.0, 200.0, 500.0);
 		Melder_progressOn ();
 	}
-	return me;
+	return me.get();   // reference
 }
 
 /* End of file manual_exampleSound.cpp */
diff --git a/fon/manual_exampleSound.h b/fon/manual_exampleSound.h
index 05ecef6..c916029 100644
--- a/fon/manual_exampleSound.h
+++ b/fon/manual_exampleSound.h
@@ -22,8 +22,8 @@
 #include "Sound.h"
 #include "Pitch.h"
 
-Sound manual_exampleSound (void);
-Pitch manual_examplePitch (void);
+Sound manual_exampleSound ();
+Pitch manual_examplePitch ();
 
 /* End of file manual_exampleSound.h */
 #endif
diff --git a/fon/manual_formant.cpp b/fon/manual_formant.cpp
index 47c5340..7954bf1 100644
--- a/fon/manual_formant.cpp
+++ b/fon/manual_formant.cpp
@@ -1,6 +1,6 @@
 /* manual_formant.cpp
  *
- * Copyright (C) 1992-2010,2014 Paul Boersma
+ * Copyright (C) 1992-2010,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,370 +22,370 @@
 void manual_formant_init (ManPages me);
 void manual_formant_init (ManPages me) {
 
-MAN_BEGIN (L"Create FormantGrid...", L"ppgb", 20080425)
-INTRO (L"A command in the @@New menu@ to create an empty @FormantGrid object.")
-ENTRY (L"Settings")
-TAG (L"##Start time (s)")
-TAG (L"##End time (s)")
-DEFINITION (L"the @@time domain@ of the resulting FormantGrid.")
-TAG (L"##Number of formants# (e.g. 10)")
-DEFINITION (L"the number of formants in the resulting FormantGrid. For instance, if you set this to 10, "
+MAN_BEGIN (U"Create FormantGrid...", U"ppgb", 20080425)
+INTRO (U"A command in the @@New menu@ to create an empty @FormantGrid object.")
+ENTRY (U"Settings")
+TAG (U"##Start time (s)")
+TAG (U"##End time (s)")
+DEFINITION (U"the @@time domain@ of the resulting FormantGrid.")
+TAG (U"##Number of formants# (e.g. 10)")
+DEFINITION (U"the number of formants in the resulting FormantGrid. For instance, if you set this to 10, "
 	"the resulting FormantGrid will contain 10 formant tiers (for F1 through F10) "
 	"and 10 bandwidth tiers (for B1 through B10). Each of these 20 tiers will contain one point.")
-TAG (L"##Initial first formant# (e.g. 550 Hz)")
-DEFINITION (L"the frequency value of the single formant point in the first formant tier. "
+TAG (U"##Initial first formant# (e.g. 550 Hz)")
+DEFINITION (U"the frequency value of the single formant point in the first formant tier. "
 	"Because of @@constant extrapolation@, F1 will have this value throughout the time domain.")
-TAG (L"##Initial formant spacing# (e.g. 1100 Hz)")
-DEFINITION (L"the difference between the frequency values of the points in adjacent formant tiers. "
+TAG (U"##Initial formant spacing# (e.g. 1100 Hz)")
+DEFINITION (U"the difference between the frequency values of the points in adjacent formant tiers. "
 	"For instance, the example values mentioned here cause F2 to be 1650 Hz throughout the time domain; "
 	"F3 will be 2750 Hz, F4 will be 3850 Hz, and so on.")
-TAG (L"##Initial first bandwidth# (e.g. 60 Hz)")
-DEFINITION (L"the value of the single bandwidth point in the first bandwidth tier. "
+TAG (U"##Initial first bandwidth# (e.g. 60 Hz)")
+DEFINITION (U"the value of the single bandwidth point in the first bandwidth tier. "
 	"Because of @@constant extrapolation@, B1 will have this value throughout the time domain.")
-TAG (L"##Initial bandwidth spacing# (e.g. 50 Hz)")
-DEFINITION (L"the difference between the values of the points in adjacent bandwidth tiers. "
+TAG (U"##Initial bandwidth spacing# (e.g. 50 Hz)")
+DEFINITION (U"the difference between the values of the points in adjacent bandwidth tiers. "
 	"For instance, the example values mentioned here cause B2 to be 110 Hz throughout the time domain; "
 	"B3 will be 160 Hz, B4 will be 210 Hz, and so on.")
-NORMAL (L"To add some points to it, use @@FormantGrid: Add formant point...@ and @@FormantGrid: Add bandwidth point... at .")
-NORMAL (L"For more examples, see @@Source-filter synthesis at .")
+NORMAL (U"To add some points to it, use @@FormantGrid: Add formant point...@ and @@FormantGrid: Add bandwidth point... at .")
+NORMAL (U"For more examples, see @@Source-filter synthesis at .")
 MAN_END
 
-MAN_BEGIN (L"Formant", L"ppgb", 20050427)
-INTRO (L"One of the @@types of objects@ in Praat. "
+MAN_BEGIN (U"Formant", U"ppgb", 20050427)
+INTRO (U"One of the @@types of objects@ in Praat. "
 	"A Formant object represents spectral structure as a function of time: a %%formant contour%. "
 	"Unlike the time-stamped @FormantGrid object, it is sampled into a number of %frames centred around equally spaced times, "
 	"Each frame contains frequency and bandwidth information about several formants.")
-ENTRY (L"Inside a Formant object")
-NORMAL (L"With @Inspect, you will see the following attributes:")
-TAG (L"%xmin")
-DEFINITION (L"start time, in seconds.")
-TAG (L"%xmax")
-DEFINITION (L"end time, in seconds.")
-TAG (L"%nx")
-DEFINITION (L"the number of frames (≥ 1).")
-TAG (L"%dx")
-DEFINITION (L"time step = frame length = frame duration, in seconds.")
-TAG (L"%x1")
-DEFINITION (L"the time associated with the first frame, in seconds. "
+ENTRY (U"Inside a Formant object")
+NORMAL (U"With @Inspect, you will see the following attributes:")
+TAG (U"%xmin")
+DEFINITION (U"start time, in seconds.")
+TAG (U"%xmax")
+DEFINITION (U"end time, in seconds.")
+TAG (U"%nx")
+DEFINITION (U"the number of frames (≥ 1).")
+TAG (U"%dx")
+DEFINITION (U"time step = frame length = frame duration, in seconds.")
+TAG (U"%x1")
+DEFINITION (U"the time associated with the first frame, in seconds. "
 	"This will usually be in the range [%xmin, %xmax]. "
 	"The time associated with the last frame (i.e., %x1 + (%nx – 1) %dx)) "
 	"will also usually be in that range.")
-TAG (L"%frame__%i_, %i = 1 ... %nx")
-DEFINITION (L"the frames (see below).")
-ENTRY (L"Attributes of a formant frame")
-NORMAL (L"Each %frame__%i_ contains the following attributes:")
-TAG (L"%intensity")
-DEFINITION (L"an indication of the maximum intensity (a squared sound amplitude) in this frame.")
-TAG (L"%nFormants")
-DEFINITION (L"the number of formants in this frame (usually between 2 and 6).")
-TAG (L"%formant__%j_, %j = 1 ... %nFormants")
-DEFINITION (L"the information about each formant (see below).")
-ENTRY (L"Attributes of each formant")
-NORMAL (L"Each %formant__%j_ contains the following attributes:")
-TAG (L"%frequency")
-DEFINITION (L"the formant's centre frequency (in Hz).")
-TAG (L"%bandwidth")
-DEFINITION (L"the formant's bandwidth (in Hz).")
-ENTRY (L"See also")
-NORMAL (L"##Linear Prediction#")
+TAG (U"%frame__%i_, %i = 1 ... %nx")
+DEFINITION (U"the frames (see below).")
+ENTRY (U"Attributes of a formant frame")
+NORMAL (U"Each %frame__%i_ contains the following attributes:")
+TAG (U"%intensity")
+DEFINITION (U"an indication of the maximum intensity (a squared sound amplitude) in this frame.")
+TAG (U"%nFormants")
+DEFINITION (U"the number of formants in this frame (usually between 2 and 6).")
+TAG (U"%formant__%j_, %j = 1 ... %nFormants")
+DEFINITION (U"the information about each formant (see below).")
+ENTRY (U"Attributes of each formant")
+NORMAL (U"Each %formant__%j_ contains the following attributes:")
+TAG (U"%frequency")
+DEFINITION (U"the formant's centre frequency (in Hz).")
+TAG (U"%bandwidth")
+DEFINITION (U"the formant's bandwidth (in Hz).")
+ENTRY (U"See also")
+NORMAL (U"##Linear Prediction#")
 MAN_END
 
-MAN_BEGIN (L"Formant: Down to FormantGrid", L"ppgb", 20080427)
-INTRO (L"A command to convert every selected @Formant into a @FormantGrid.")
-NORMAL (L"This performs a trivial copying of frames to points. "
+MAN_BEGIN (U"Formant: Down to FormantGrid", U"ppgb", 20080427)
+INTRO (U"A command to convert every selected @Formant into a @FormantGrid.")
+NORMAL (U"This performs a trivial copying of frames to points. "
 	"Each formant tier and each bandwidth tier of the resulting FormantGrid contains a point for each original frame. "
 	"The intensity information is lost.")
 MAN_END
 
-MAN_BEGIN (L"Formant: Draw tracks...", L"ppgb", 19980321)
-INTRO (L"A command to draw the selected @Formant objects to the @@Picture window at .")
-ENTRY (L"Behaviour")
-NORMAL (L"Every formant value is drawn as one or two short line segments, connected, if possible, "
+MAN_BEGIN (U"Formant: Draw tracks...", U"ppgb", 19980321)
+INTRO (U"A command to draw the selected @Formant objects to the @@Picture window at .")
+ENTRY (U"Behaviour")
+NORMAL (U"Every formant value is drawn as one or two short line segments, connected, if possible, "
 	"with a line segment of the corresponding formant values in the adjacent frames.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the time domain of the drawing. If ##To time# is not greater than ##From time#, "
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the time domain of the drawing. If ##To time# is not greater than ##From time#, "
 	"the entire formant contour is drawn.")
-TAG (L"##Maximum frequency (Hz)")
-DEFINITION (L"the height of the %y axis. For speech, 5000 Hz is a usual value.")
-TAG (L"##Garnish")
-DEFINITION (L"determines whether axes, numbers, and texts (\"Time\", \"Formant frequency\") will be drawn in the margins around the picture. "
+TAG (U"##Maximum frequency (Hz)")
+DEFINITION (U"the height of the %y axis. For speech, 5000 Hz is a usual value.")
+TAG (U"##Garnish")
+DEFINITION (U"determines whether axes, numbers, and texts (\"Time\", \"Formant frequency\") will be drawn in the margins around the picture. "
 	"Turn this button off if you prefer to garnish your picture by yourself with the @Margins menu.")
-ENTRY (L"Usage")
-NORMAL (L"Unlike @@Formant: Speckle...@, this procedure assumes that e.g. the second formant in frame %i "
+ENTRY (U"Usage")
+NORMAL (U"Unlike @@Formant: Speckle...@, this procedure assumes that e.g. the second formant in frame %i "
 	"has something to do with the second formant in frame %i+1. To make this assumption more plausible, "
 	"use @@Formant: Track...@ first.")
 MAN_END
 
-MAN_BEGIN (L"Formant: Formula (bandwidths)...", L"ppgb", 19980323)
-INTRO (L"A command to modify each selected @Formant object with a specified formula.")
-NORMAL (L"For what you can do with formulas, see @@Matrix: Formula... at . "
+MAN_BEGIN (U"Formant: Formula (bandwidths)...", U"ppgb", 19980323)
+INTRO (U"A command to modify each selected @Formant object with a specified formula.")
+NORMAL (U"For what you can do with formulas, see @@Matrix: Formula... at . "
 	"The %%i%th row contains the values of the %%i%th bandwidth contour.")
-NORMAL (L"See @@Formant: Formula (frequencies)...@ for more information.")
+NORMAL (U"See @@Formant: Formula (frequencies)...@ for more information.")
 MAN_END
 
-MAN_BEGIN (L"Formant: Formula (frequencies)...", L"ppgb", 19981221)
-INTRO (L"A command to modify each selected @Formant object with a specified formula.")
-NORMAL (L"For what you can do with formulas, see @@Matrix: Formula... at . "
+MAN_BEGIN (U"Formant: Formula (frequencies)...", U"ppgb", 19981221)
+INTRO (U"A command to modify each selected @Formant object with a specified formula.")
+NORMAL (U"For what you can do with formulas, see @@Matrix: Formula... at . "
 	"The %%i%th row contains the values of the %%i%th frequency contour.")
-NORMAL (L"For an example, see @@Source-filter synthesis at .")
+NORMAL (U"For an example, see @@Source-filter synthesis at .")
 MAN_END
 
-MAN_BEGIN (L"Formant: Get bandwidth at time...", L"ppgb", 19991016)
-INTRO (L"A @query to the selected @Formant object for the bandwidth of the specified formant at the specified time.")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which to evaluate the bandwidth.")
-TAG (L"##Units")
-DEFINITION (L"the units of the result (#hertz or #Bark).")
-ENTRY (L"Return value")
-NORMAL (L"the estimated bandwidth in hertz or Bark. "
+MAN_BEGIN (U"Formant: Get bandwidth at time...", U"ppgb", 19991016)
+INTRO (U"A @query to the selected @Formant object for the bandwidth of the specified formant at the specified time.")
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which to evaluate the bandwidth.")
+TAG (U"##Units")
+DEFINITION (U"the units of the result (#hertz or #Bark).")
+ENTRY (U"Return value")
+NORMAL (U"the estimated bandwidth in hertz or Bark. "
 	"If %Time is not within half a frame width of any frame centre, or "
 	"If the specified %%Formant number% is greater than the number of formants in the frame, "
 	"the return value is @undefined; "
 	"otherwise, the formant is considered to belong to the frame whose centre is nearest to the specified time.")
-ENTRY (L"Algorithm")
-NORMAL (L"If possible (i.e. if the adjacent frame has enough formants), "
+ENTRY (U"Algorithm")
+NORMAL (U"If possible (i.e. if the adjacent frame has enough formants), "
 	"a linear interpolation is performed between the centre of the frame and the centre of the adjacent frame. "
 	"With Bark units, the hertz-to-Bark transformation is performed "
 	"on the two frequencies %F ± 1/2 %B (after interpolation), and the result is the difference between these two values")
 MAN_END
 
-MAN_BEGIN (L"Formant: Get maximum...", L"ppgb", 19991016)
-INTRO (L"A @query to ask the selected @Formant object for the maximum value of the specified formant.")
-ENTRY (L"Return value")
-NORMAL (L"the maximum, in hertz or Bark.")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored. "
+MAN_BEGIN (U"Formant: Get maximum...", U"ppgb", 19991016)
+INTRO (U"A @query to ask the selected @Formant object for the maximum value of the specified formant.")
+ENTRY (U"Return value")
+NORMAL (U"the maximum, in hertz or Bark.")
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the formant contour is considered.")
-TAG (L"##Units")
-DEFINITION (L"the units of the result (#Hertz or #Bark).")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None or #Parabolic). See @@vector peak interpolation at .")
+TAG (U"##Units")
+DEFINITION (U"the units of the result (#Hertz or #Bark).")
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None or #Parabolic). See @@vector peak interpolation at .")
 MAN_END
 
-MAN_BEGIN (L"Formant: Get mean...", L"ppgb", 20140421)
-INTRO (L"A @query to ask the selected @Formant object for the mean value of the specified formant.")
-ENTRY (L"Return value")
-NORMAL (L"the mean, in hertz or Bark.")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored. "
+MAN_BEGIN (U"Formant: Get mean...", U"ppgb", 20140421)
+INTRO (U"A @query to ask the selected @Formant object for the mean value of the specified formant.")
+ENTRY (U"Return value")
+NORMAL (U"the mean, in hertz or Bark.")
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the formant contour is considered.")
-TAG (L"##Units")
-DEFINITION (L"the units of the result (#Hertz or #Bark).")
-ENTRY (L"Scripting")
-NORMAL (L"You can use this command to put the mean into a script variable:")
-CODE (L"selectObject: \"Formant hallo\"")
-CODE (L"mean = Get mean: 2, 0, 0, \"Hertz\"")
-NORMAL (L"In this case, the value will not be written into the Info window.")
+TAG (U"##Units")
+DEFINITION (U"the units of the result (#Hertz or #Bark).")
+ENTRY (U"Scripting")
+NORMAL (U"You can use this command to put the mean into a script variable:")
+CODE (U"selectObject: \"Formant hallo\"")
+CODE (U"mean = Get mean: 2, 0, 0, \"Hertz\"")
+NORMAL (U"In this case, the value will not be written into the Info window.")
 MAN_END
 
-MAN_BEGIN (L"Formant: Get minimum...", L"ppgb", 19991016)
-INTRO (L"A @query to ask the selected @Formant object for the minimum value of the specified formant.")
-ENTRY (L"Return value")
-NORMAL (L"the minimum, in hertz or Bark.")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored. "
+MAN_BEGIN (U"Formant: Get minimum...", U"ppgb", 19991016)
+INTRO (U"A @query to ask the selected @Formant object for the minimum value of the specified formant.")
+ENTRY (U"Return value")
+NORMAL (U"the minimum, in hertz or Bark.")
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the formant contour is considered.")
-TAG (L"##Units")
-DEFINITION (L"the units of the result (#Hertz or #Bark).")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None or #Parabolic). See @@vector peak interpolation at .")
+TAG (U"##Units")
+DEFINITION (U"the units of the result (#Hertz or #Bark).")
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None or #Parabolic). See @@vector peak interpolation at .")
 MAN_END
 
-MAN_BEGIN (L"Formant: Get number of formants", L"ppgb", 19991016)
-INTRO (L"A @query to ask the selected @Formant object for the number of formants in a specified frame.")
-ENTRY (L"Setting")
-TAG (L"##Frame number")
-DEFINITION (L"the frame number whose formant count is sought.")
-ENTRY (L"Return value")
-NORMAL (L"the number of formants.")
+MAN_BEGIN (U"Formant: Get number of formants", U"ppgb", 19991016)
+INTRO (U"A @query to ask the selected @Formant object for the number of formants in a specified frame.")
+ENTRY (U"Setting")
+TAG (U"##Frame number")
+DEFINITION (U"the frame number whose formant count is sought.")
+ENTRY (U"Return value")
+NORMAL (U"the number of formants.")
 MAN_END
 
-MAN_BEGIN (L"Formant: Get quantile...", L"ppgb", 19991016)
-INTRO (L"A @query to ask the selected @Formant object for an estimation of the specified quantile of the distribution "
+MAN_BEGIN (U"Formant: Get quantile...", U"ppgb", 19991016)
+INTRO (U"A @query to ask the selected @Formant object for an estimation of the specified quantile of the distribution "
 	"that underlies the attested values of the specified formant.")
-ENTRY (L"Return value")
-NORMAL (L"the quantile, in hertz or Bark.")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored. "
+ENTRY (U"Return value")
+NORMAL (U"the quantile, in hertz or Bark.")
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the formant contour is considered.")
-TAG (L"##Units")
-DEFINITION (L"the units of the result (#Hertz or #Bark).")
-TAG (L"##Quantile")
-DEFINITION (L"the fraction (between 0 and 1) of the values of the underlying distribution expected to lie below the result. "
+TAG (U"##Units")
+DEFINITION (U"the units of the result (#Hertz or #Bark).")
+TAG (U"##Quantile")
+DEFINITION (U"the fraction (between 0 and 1) of the values of the underlying distribution expected to lie below the result. "
 	"For instance, if #Quantile is 0.10, the algorithm estimates the formant value below which 10\\%  of all formant values "
 	"are expected to lie. To get an estimate of the %median of the underlying distribution, specify a quantile of 0.50.")
-ENTRY (L"Algorithm")
-NORMAL (L"First, the available formant values within the selected time domain are collected in an array. "
+ENTRY (U"Algorithm")
+NORMAL (U"First, the available formant values within the selected time domain are collected in an array. "
 	"This array is then sorted and the @@quantile algorithm@ is performed. With Bark units, "
 	"the hertz-to-Bark transformation is performed before the quantile algorithm.")
 MAN_END
 
-MAN_BEGIN (L"Formant: Get standard deviation", L"ppgb", 19991016)
-INTRO (L"A @query to ask the selected @Formant object for the standard deviation of the attested values of the specified formant "
+MAN_BEGIN (U"Formant: Get standard deviation", U"ppgb", 19991016)
+INTRO (U"A @query to ask the selected @Formant object for the standard deviation of the attested values of the specified formant "
 	"within a specified time domain.")
-ENTRY (L"Return value")
-NORMAL (L"the standard deviation, in hertz or Bark.")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored. "
+ENTRY (U"Return value")
+NORMAL (U"the standard deviation, in hertz or Bark.")
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the formant contour is considered.")
-TAG (L"##Units")
-DEFINITION (L"the units of the result (#Hertz or #Bark).")
+TAG (U"##Units")
+DEFINITION (U"the units of the result (#Hertz or #Bark).")
 MAN_END
 
-MAN_BEGIN (L"Formant: Get time of maximum...", L"ppgb", 19991016)
-INTRO (L"A @query to ask the selected @Formant object for the time associated with the maximum value "
+MAN_BEGIN (U"Formant: Get time of maximum...", U"ppgb", 19991016)
+INTRO (U"A @query to ask the selected @Formant object for the time associated with the maximum value "
 	"of a specified formant within a specified time domain.")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored, except for interpolation. "
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored, except for interpolation. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the formant contour is considered.")
-TAG (L"##Units")
-DEFINITION (L"the units of the result (#Hertz or #Bark).")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None or #Parabolic). See @@vector peak interpolation at .")
-ENTRY (L"Return value")
-NORMAL (L"the time expressed in seconds. If no relevant formants are found, the value is @undefined.")
+TAG (U"##Units")
+DEFINITION (U"the units of the result (#Hertz or #Bark).")
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None or #Parabolic). See @@vector peak interpolation at .")
+ENTRY (U"Return value")
+NORMAL (U"the time expressed in seconds. If no relevant formants are found, the value is @undefined.")
 MAN_END
 
-MAN_BEGIN (L"Formant: Get time of minimum...", L"ppgb", 19991016)
-INTRO (L"A @query to ask the selected @Formant object for the time associated with the minimum value "
+MAN_BEGIN (U"Formant: Get time of minimum...", U"ppgb", 19991016)
+INTRO (U"A @query to ask the selected @Formant object for the time associated with the minimum value "
 	"of a specified formant within a specified time domain.")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored, except for interpolation. "
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored, except for interpolation. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the formant contour is considered.")
-TAG (L"##Units")
-DEFINITION (L"the units of the result (#Hertz or #Bark).")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None or #Parabolic). See @@vector peak interpolation at .")
-ENTRY (L"Return value")
-NORMAL (L"the time expressed in seconds. If no relevant formants are found, the value is @undefined.")
+TAG (U"##Units")
+DEFINITION (U"the units of the result (#Hertz or #Bark).")
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None or #Parabolic). See @@vector peak interpolation at .")
+ENTRY (U"Return value")
+NORMAL (U"the time expressed in seconds. If no relevant formants are found, the value is @undefined.")
 MAN_END
 
-MAN_BEGIN (L"Formant: Get value at time...", L"ppgb", 19991016)
-INTRO (L"A @query to ask the selected @Formant object for the frequency of the specified formant at the specified time.")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which to evaluate the formant frequency.")
-TAG (L"##Units)")
-DEFINITION (L"the units of the result (#Hertz or #Bark).")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method, see @@vector value interpolation at . "
+MAN_BEGIN (U"Formant: Get value at time...", U"ppgb", 19991016)
+INTRO (U"A @query to ask the selected @Formant object for the frequency of the specified formant at the specified time.")
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the ordinal number of the formant, counting up from 0 Hz. Specify \"2\" for %F__2_ etc.")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which to evaluate the formant frequency.")
+TAG (U"##Units)")
+DEFINITION (U"the units of the result (#Hertz or #Bark).")
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method, see @@vector value interpolation at . "
 	"Always Linear.")
-ENTRY (L"Return value")
-NORMAL (L"the bandwidth in hertz or Bark. "
+ENTRY (U"Return value")
+NORMAL (U"the bandwidth in hertz or Bark. "
 	"If #Time is not within half a frame width of any frame centre, or "
 	"if ##Formant number# is greater than the number of formants in the frame, "
 	"the value is @undefined; "
 	"otherwise, the formant is considered to belong to the frame whose centre is nearest to #Time.")
-ENTRY (L"Algorithm")
-NORMAL (L"If possible (i.e. if the adjacent frame has enough formants), "
+ENTRY (U"Algorithm")
+NORMAL (U"If possible (i.e. if the adjacent frame has enough formants), "
 	"a linear interpolation is performed between the centre of the frame and the centre of the adjacent frame. "
 	"With Bark units, the hertz-to-Bark transformation is performed before interpolation.")
 MAN_END
 
-MAN_BEGIN (L"Formant: Speckle...", L"ppgb", 20030916)
-INTRO (L"A command to draw the selected @Formant objects to the @@Picture window at .")
-ENTRY (L"Behaviour")
-NORMAL (L"Every formant value is drawn as a small circle, filled with the current colour.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the time domain of the drawing. If ##To time# is not greater than ##From time#, "
+MAN_BEGIN (U"Formant: Speckle...", U"ppgb", 20030916)
+INTRO (U"A command to draw the selected @Formant objects to the @@Picture window at .")
+ENTRY (U"Behaviour")
+NORMAL (U"Every formant value is drawn as a small circle, filled with the current colour.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the time domain of the drawing. If ##To time# is not greater than ##From time#, "
 	"the entire formant contour is drawn.")
-TAG (L"##Maximum frequency (Hz)")
-DEFINITION (L"the height of the %y axis. For speech, 5000 Hz is a usual value.")
-TAG (L"##Dynamic range (dB)")
-DEFINITION (L"determines the signal intensity (as stored in each formant frame) below which "
+TAG (U"##Maximum frequency (Hz)")
+DEFINITION (U"the height of the %y axis. For speech, 5000 Hz is a usual value.")
+TAG (U"##Dynamic range (dB)")
+DEFINITION (U"determines the signal intensity (as stored in each formant frame) below which "
 	"no formants will be drawn. If zero, all formants will be drawn. The standard value is 30 dB, "
 	"which would mean that formants in frames with intensities less than the maximum intensity minus 30 dB will not be drawn.")
-TAG (L"##Garnish")
-DEFINITION (L"determines whether axes, numbers, and texts (\"Time\", \"Formant frequency\") will be drawn in the margins around the picture. "
+TAG (U"##Garnish")
+DEFINITION (U"determines whether axes, numbers, and texts (\"Time\", \"Formant frequency\") will be drawn in the margins around the picture. "
 	"Turn this button off if you prefer to garnish your picture by yourself with the @Margins menu.")
 MAN_END
 
-MAN_BEGIN (L"Formant: Track...", L"ppgb", 20020308)
-INTRO (L"A command to extract a specified number of formant tracks from each selected @Formant object. "
+MAN_BEGIN (U"Formant: Track...", U"ppgb", 20020308)
+INTRO (U"A command to extract a specified number of formant tracks from each selected @Formant object. "
 	"The tracks represent the cheapest paths through the measured formant values in consecutive frames.")
-ENTRY (L"How to use")
-NORMAL (L"In order to be capable of producing three tracks (i.e. F1, F2, and F3), there must be at least "
+ENTRY (U"How to use")
+NORMAL (U"In order to be capable of producing three tracks (i.e. F1, F2, and F3), there must be at least "
 	"three formant candidates in %every frame of the Formant object. The typical use of "
 	"this command, therefore, is to analyse five formants with @@Sound: To Formant (burg)...@ "
 	"and then use the tracking command to extract three tracks.")
-ENTRY (L"When to use, when not")
-NORMAL (L"This command only makes sense if the whole of the formant contour makes sense. "
+ENTRY (U"When to use, when not")
+NORMAL (U"This command only makes sense if the whole of the formant contour makes sense. "
 	"For speech, formant contours make sense only for vowels and the like. "
 	"During some consonants, the Formant object may have fewer than three formant values, "
 	"and trying to create three tracks through them will fail. "
 	"You will typically use this command for the contours in diphthongs, if at all.")
-ENTRY (L"Settings")
-NORMAL (L"To be able to interpret the settings, you should know that the aim of the procedure is "
+ENTRY (U"Settings")
+NORMAL (U"To be able to interpret the settings, you should know that the aim of the procedure is "
 	"to minimize the sum of the %costs associated with the three tracks.")
-TAG (L"##Number of tracks")
-DEFINITION (L"the number of formant tracks that the procedure must find. If this number is 3, "
+TAG (U"##Number of tracks")
+DEFINITION (U"the number of formant tracks that the procedure must find. If this number is 3, "
 	"the procedure will try to find tracks for F1, F2, and F3; if the Formant object contains "
 	"a frame with less than three formants, the tracking procedure will fail.")
-TAG (L"##Reference F1 (Hz)")
-DEFINITION (L"the preferred value near which the first track wants to be. "
+TAG (U"##Reference F1 (Hz)")
+DEFINITION (U"the preferred value near which the first track wants to be. "
 	"For average (i.e. adult female) speakers, this value will be around "
 	"the average F1 for vowels of female speakers, i.e. 550 Hz.")
-TAG (L"##Reference F2 (Hz)")
-DEFINITION (L"the preferred value near which the second track wants to be. "
+TAG (U"##Reference F2 (Hz)")
+DEFINITION (U"the preferred value near which the second track wants to be. "
 	"A good value will be around "
 	"the average F2 for vowels of female speakers, i.e. 1650 Hz.")
-TAG (L"##Reference F3 (Hz)")
-DEFINITION (L"the preferred value near which the third track wants to be. "
+TAG (U"##Reference F3 (Hz)")
+DEFINITION (U"the preferred value near which the third track wants to be. "
 	"A good value will be around "
 	"the average F3 for vowels of female speakers, i.e. 2750 Hz. "
 	"This argument will be ignored if you choose to have fewer than three tracks, "
 	"i.e., if you are only interested in F1 and F2.")
-TAG (L"##Reference F4 (Hz)")
-DEFINITION (L"the preferred value near which the fourth track wants to be. "
+TAG (U"##Reference F4 (Hz)")
+DEFINITION (U"the preferred value near which the fourth track wants to be. "
 	"A good value may be around 3850 Hz, but you will usually not want to "
 	"track F4, because traditional formant lore tends to ignore it "
 	"(however inappropriate this may be for the vowel [i]), "
 	"and because Formant objects often contain not more than three formant values "
 	"in some frames. So you will not usually specify a higher %%Number of tracks% than 3, "
 	"and in that case, this argument will be ignored.")
-TAG (L"##Reference F5 (Hz)")
-DEFINITION (L"the preferred value near which the five track wants to be. "
+TAG (U"##Reference F5 (Hz)")
+DEFINITION (U"the preferred value near which the five track wants to be. "
 	"In the unlikely case that you want five tracks, "
 	"a good value may be around 4950 Hz.")
-TAG (L"##Frequency cost (per kiloHertz)")
-DEFINITION (L"the local cost of having a formant value in your track that deviates "
+TAG (U"##Frequency cost (per kiloHertz)")
+DEFINITION (U"the local cost of having a formant value in your track that deviates "
 	"from the reference value. For instance, if a candidate (i.e. any formant in a frame "
 	"of the Formant object) has a formant frequency of 800 Hz, "
 	"and ##Frequency cost# is 1.0/kHz, "
@@ -395,151 +395,151 @@ DEFINITION (L"the local cost of having a formant value in your track that deviat
 	"(= (1.650 kHz - 0.600 kHz) · 1.0/kHz), so we see that the procedure "
 	"locally favours the inclusion of the 800 Hz candidate into the F1 track. "
 	"But the next two cost factors may override this local preference.")
-TAG (L"##Bandwidth cost")
-DEFINITION (L"the local cost of having a bandwidth, relative to the formant frequency. "
+TAG (U"##Bandwidth cost")
+DEFINITION (U"the local cost of having a bandwidth, relative to the formant frequency. "
 	"For instance, if a candidate has a formant frequency of 400 Hz and "
 	"a bandwidth of 80 Hz, and ##Bandwidth cost# is 1.0, "
 	"the cost of having this formant in any track is (80/400) · 1.0 = 0.200. "
 	"So we see that the procedure locally favours the inclusion of candidates "
 	"with low relative bandwidths.")
-TAG (L"##Transition cost (per octave)")
-DEFINITION (L"the cost of having two different consecutive formant values in a track. "
+TAG (U"##Transition cost (per octave)")
+DEFINITION (U"the cost of having two different consecutive formant values in a track. "
 	"For instance, if a proposed track through the candidates has two consecutive formant "
 	"values of 300 Hz and 424 Hz, and ##Transition cost# is 1.0/octave, "
 	"the cost of having this large frequency jump is (0.5 octave) · (1.0/octave) = 0.500.")
-ENTRY (L"Algorithm")
-NORMAL (L"This command uses a Viterbi algorithm with multiple planes. For instance, if the selected Formant object "
+ENTRY (U"Algorithm")
+NORMAL (U"This command uses a Viterbi algorithm with multiple planes. For instance, if the selected Formant object "
 	"contains up to five formants per frame, and you request three tracks, the Viterbi algorithm will have to choose "
 	"between ten candidates (the number of combinations of three out of five) for each frame.")
-NORMAL (L"The formula for the cost of e.g. track 3, with proposed values %F__2%i_ (%i = 1...%N, "
+NORMAL (U"The formula for the cost of e.g. track 3, with proposed values %F__2%i_ (%i = 1...%N, "
 	"where %N is the number of frames) is:")
-FORMULA (L"∑__%i=1..%N_ %frequencyCost·|%F__3%i_ – %referenceF3|/1000 +")
-FORMULA (L"+ ∑__%i=1..%N_ %bandWidthCost·%B__3%i_/%F__3%i_ +")
-FORMULA (L"+ ∑__%i=1..%N-1_ %transitionCost·|log__2_(%F__3%i_/%F__3,%i+1_)|")
-NORMAL (L"Analogous formulas compute the cost of track 1 and track 2. "
+FORMULA (U"∑__%i=1..%N_ %frequencyCost·|%F__3%i_ – %referenceF3|/1000 +")
+FORMULA (U"+ ∑__%i=1..%N_ %bandWidthCost·%B__3%i_/%F__3%i_ +")
+FORMULA (U"+ ∑__%i=1..%N-1_ %transitionCost·|log__2_(%F__3%i_/%F__3,%i+1_)|")
+NORMAL (U"Analogous formulas compute the cost of track 1 and track 2. "
 	"The procedure will assign those candidates to the three tracks that minimize "
 	"the sum of three track costs.")
 MAN_END
 
-MAN_BEGIN (L"FormantGrid", L"ppgb", 20080427)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"A FormantGrid object represents spectral structure as a function of time: a %%formant contour%. "
+MAN_BEGIN (U"FormantGrid", U"ppgb", 20080427)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"A FormantGrid object represents spectral structure as a function of time: a %%formant contour%. "
 	"Unlike the evenly sampled @Formant object, it consists of a number of formant tiers and bandwidth tiers, "
 	"each of which contains a number of formant or bandwidth %points (or %targets), sorted by time.")
-NORMAL (L"For examples, see @@Source-filter synthesis at .")
-ENTRY (L"FormantGrid commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"From scratch:")
-LIST_ITEM (L"• @@Create FormantGrid...")
-LIST_ITEM (L"• @@FormantGrid: Add formant point...")
-LIST_ITEM (L"• @@FormantGrid: Add bandwidth point...")
-LIST_ITEM (L"Copy from another object:")
-LIST_ITEM (L"• @@Formant: Down to FormantGrid@: trivial copying of frames to points.")
-//NORMAL (L"Conversion:")
-//LIST_ITEM (L"• @@FormantGrid: Down to PointProcess@: copy times.")
-NORMAL (L"Synthesis:")
-LIST_ITEM (L"• @@Sound & FormantGrid: Filter@: see @@Source-filter synthesis at .")
-//NORMAL (L"Queries:")
-//LIST_ITEM (L"• @@Get low index from time...")
-//LIST_ITEM (L"• @@Get high index from time...")
-//LIST_ITEM (L"• @@Get nearest index from time...")
-NORMAL (L"Modification:")
-LIST_ITEM (L"• @@FormantGrid: Add formant point...")
-LIST_ITEM (L"• @@FormantGrid: Add bandwidth point...")
-//LIST_ITEM (L"• @@Remove point...")
-//LIST_ITEM (L"• @@Remove point near...")
-LIST_ITEM (L"• @@FormantGrid: Remove formant points between...")
-LIST_ITEM (L"• @@FormantGrid: Remove bandwidth points between...")
+NORMAL (U"For examples, see @@Source-filter synthesis at .")
+ENTRY (U"FormantGrid commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"From scratch:")
+LIST_ITEM (U"• @@Create FormantGrid...")
+LIST_ITEM (U"• @@FormantGrid: Add formant point...")
+LIST_ITEM (U"• @@FormantGrid: Add bandwidth point...")
+LIST_ITEM (U"Copy from another object:")
+LIST_ITEM (U"• @@Formant: Down to FormantGrid@: trivial copying of frames to points.")
+//NORMAL (U"Conversion:")
+//LIST_ITEM (U"• @@FormantGrid: Down to PointProcess@: copy times.")
+NORMAL (U"Synthesis:")
+LIST_ITEM (U"• @@Sound & FormantGrid: Filter@: see @@Source-filter synthesis at .")
+//NORMAL (U"Queries:")
+//LIST_ITEM (U"• @@Get low index from time...")
+//LIST_ITEM (U"• @@Get high index from time...")
+//LIST_ITEM (U"• @@Get nearest index from time...")
+NORMAL (U"Modification:")
+LIST_ITEM (U"• @@FormantGrid: Add formant point...")
+LIST_ITEM (U"• @@FormantGrid: Add bandwidth point...")
+//LIST_ITEM (U"• @@Remove point...")
+//LIST_ITEM (U"• @@Remove point near...")
+LIST_ITEM (U"• @@FormantGrid: Remove formant points between...")
+LIST_ITEM (U"• @@FormantGrid: Remove bandwidth points between...")
 MAN_END
 
-MAN_BEGIN (L"FormantGrid: Add bandwidth point...", L"ppgb", 20080425)
-INTRO (L"A command to add a bandwidth point to each selected @FormantGrid.")
-NORMAL (L"For examples, see @@Source-filter synthesis at .")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the number of the formant (e.g. 1, 2,...) to which a bandwidth point is to be added.")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which a bandwidth point is to be added.")
-TAG (L"##Bandwidth (Hz)")
-DEFINITION (L"the bandwidth value of the requested new point.")
-ENTRY (L"Example")
-NORMAL (L"To set the bandwidth of F2 at 0.3 seconds to 130 Hz, "
+MAN_BEGIN (U"FormantGrid: Add bandwidth point...", U"ppgb", 20080425)
+INTRO (U"A command to add a bandwidth point to each selected @FormantGrid.")
+NORMAL (U"For examples, see @@Source-filter synthesis at .")
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the number of the formant (e.g. 1, 2,...) to which a bandwidth point is to be added.")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which a bandwidth point is to be added.")
+TAG (U"##Bandwidth (Hz)")
+DEFINITION (U"the bandwidth value of the requested new point.")
+ENTRY (U"Example")
+NORMAL (U"To set the bandwidth of F2 at 0.3 seconds to 130 Hz, "
 	"you set ##Formant number# to 2, #Time to 0.3 s, and #Bandwidth to 130 Hz.")
-ENTRY (L"Behaviour")
-NORMAL (L"The formant tier is modified so that it contains the new point. "
+ENTRY (U"Behaviour")
+NORMAL (U"The formant tier is modified so that it contains the new point. "
 	"If a bandwidth point at the specified time was already present in the formant tier, nothing happens.")
 MAN_END
 
-MAN_BEGIN (L"FormantGrid: Add formant point...", L"ppgb", 20080425)
-INTRO (L"A command to add a formant point to each selected @FormantGrid.")
-NORMAL (L"For examples, see @@Source-filter synthesis at .")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the number of the formant (e.g. 1, 2,...) to which a formant point is to be added.")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which a formant point is to be added.")
-TAG (L"##Frequency (Hz)")
-DEFINITION (L"the formant frequency value of the requested new point.")
-ENTRY (L"Example")
-NORMAL (L"To set the value of F2 at 0.3 seconds to 2200 Hz, "
+MAN_BEGIN (U"FormantGrid: Add formant point...", U"ppgb", 20080425)
+INTRO (U"A command to add a formant point to each selected @FormantGrid.")
+NORMAL (U"For examples, see @@Source-filter synthesis at .")
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the number of the formant (e.g. 1, 2,...) to which a formant point is to be added.")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which a formant point is to be added.")
+TAG (U"##Frequency (Hz)")
+DEFINITION (U"the formant frequency value of the requested new point.")
+ENTRY (U"Example")
+NORMAL (U"To set the value of F2 at 0.3 seconds to 2200 Hz, "
 	"you set ##Formant number# to 2, #Time to 0.3 s, and #Frequency to 2200 Hz.")
-ENTRY (L"Behaviour")
-NORMAL (L"The formant tier is modified so that it contains the new point. "
+ENTRY (U"Behaviour")
+NORMAL (U"The formant tier is modified so that it contains the new point. "
 	"If a formant point at the specified time was already present in the formant tier, nothing happens.")
 MAN_END
 
-MAN_BEGIN (L"FormantGrid: Remove bandwidth points between...", L"ppgb", 20080427)
-INTRO (L"A command to remove some points from a bandwidth tier in every selected @FormantGrid.")
-ENTRY (L"Settings")
-TAG (L"##Formant number")
-DEFINITION (L"the formant (1, 2,...) from whose bandwidth tier you want to remove some points.")
-TAG (L"##From time (s))")
-TAG (L"##To time (s)")
-DEFINITION (L"the times between which you want to remove all bandwidth points.")
-ENTRY (L"Example")
-NORMAL (L"If you want to remove all bandwidth points in F2 between 0.5 and 0.7 seconds, "
+MAN_BEGIN (U"FormantGrid: Remove bandwidth points between...", U"ppgb", 20080427)
+INTRO (U"A command to remove some points from a bandwidth tier in every selected @FormantGrid.")
+ENTRY (U"Settings")
+TAG (U"##Formant number")
+DEFINITION (U"the formant (1, 2,...) from whose bandwidth tier you want to remove some points.")
+TAG (U"##From time (s))")
+TAG (U"##To time (s)")
+DEFINITION (U"the times between which you want to remove all bandwidth points.")
+ENTRY (U"Example")
+NORMAL (U"If you want to remove all bandwidth points in F2 between 0.5 and 0.7 seconds, "
 	"you set ##Formant number# to 2, ##From time# to 0.5 s, and ##To time# to 0.7 s.")
 MAN_END
 
-MAN_BEGIN (L"FormantGrid: Remove formant points between...", L"ppgb", 20080427)
-INTRO (L"A command to remove some points from a formant tier in every selected @FormantGrid.")
-ENTRY (L"Settings")
-TAG (L"%%Formant number")
-DEFINITION (L"the formant (1, 2,...) from which you want to remove some points.")
-TAG (L"##From time (s))")
-TAG (L"##To time (s)")
-DEFINITION (L"the times between which you want to remove all formant points.")
-ENTRY (L"Example")
-NORMAL (L"If you want to remove all formant points in F2 between 0.5 and 0.7 seconds, "
+MAN_BEGIN (U"FormantGrid: Remove formant points between...", U"ppgb", 20080427)
+INTRO (U"A command to remove some points from a formant tier in every selected @FormantGrid.")
+ENTRY (U"Settings")
+TAG (U"%%Formant number")
+DEFINITION (U"the formant (1, 2,...) from which you want to remove some points.")
+TAG (U"##From time (s))")
+TAG (U"##To time (s)")
+DEFINITION (U"the times between which you want to remove all formant points.")
+ENTRY (U"Example")
+NORMAL (U"If you want to remove all formant points in F2 between 0.5 and 0.7 seconds, "
 	"you set ##Formant number# to 2, ##From time# to 0.5 s, and ##To time# to 0.7.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Formant (burg)...", L"ppgb", 20101007)
-INTRO (L"A command that creates a @Formant object from every selected @Sound object. "
+MAN_BEGIN (U"Sound: To Formant (burg)...", U"ppgb", 20101007)
+INTRO (U"A command that creates a @Formant object from every selected @Sound object. "
 	"It performs a short-term spectral analysis, approximating the spectrum of each "
 	"analysis frame by a number of formants.")
-ENTRY (L"Settings")
-TAG (L"##Time step (s)")
-DEFINITION (L"the time between the centres of consecutive analysis frames. If the sound is 2 seconds long, "
+ENTRY (U"Settings")
+TAG (U"##Time step (s)")
+DEFINITION (U"the time between the centres of consecutive analysis frames. If the sound is 2 seconds long, "
 	"and the time step is 0.01 seconds, there will be approximately 200 analysis frames. "
 	"The actual number is somewhat lower (usually 195), because we cannot measure very well "
 	"near the edges. If you set the time step to 0.0 (the standard), Praat will use a time step "
 	"that is equal to 25 percent of the analysis window length (see below).")
-TAG (L"##Maximum number of formants")
-DEFINITION (L"for most analyses of human speech, you will want to extract 5 formants per frame. "
+TAG (U"##Maximum number of formants")
+DEFINITION (U"for most analyses of human speech, you will want to extract 5 formants per frame. "
 	"This, in combination with the ##Maximum formant# setting, is the only way "
 	"in which this procedure will give you results compatible with how people "
 	"tend to interpret formants for vowels, i.e. in terms of "
 	"vowel height (F1) and vowel place (F2). Otherwise, the ##Maximum number of formants# can be any multiple of 0.5, "
 	"you can choose 4, 4.5, 5, 5.5, 6, and so on (see below).")
-TAG (L"##Maximum formant (Hz)")
-DEFINITION (L"the ceiling of the formant search range, in hertz. It is crucial that you set this to a value suitable for your speaker. "
+TAG (U"##Maximum formant (Hz)")
+DEFINITION (U"the ceiling of the formant search range, in hertz. It is crucial that you set this to a value suitable for your speaker. "
 	"The standard value of 5500 Hz is suitable for an average adult female. For a male, use 5000 Hz; "
 	"if you use 5500 Hz for an adult male, you may end up with too few formants in the low frequency region, "
 	"e.g. analysing an [u] as having a single formant near 500 Hz whereas you want two formants at 300 and 600 Hz. "
 	"For a young child, use a value much higher than 5500 Hz, for instance 8000 Hz (experiment with it on steady vowels).")
-TAG (L"##Window length (s)")
-DEFINITION (L"the effective duration of the analysis window, in seconds. The actual length is twice this value, "
+TAG (U"##Window length (s)")
+DEFINITION (U"the effective duration of the analysis window, in seconds. The actual length is twice this value, "
 	"because Praat uses a Gaussian-like analysis window with sidelobes below -120 dB. "
 	"For instance, if the ##Window length# is 0.025 seconds, the actual Gaussian window duration "
 	"is 0.050 seconds. This window has values below 4\\%  outside the central 0.025 seconds, "
@@ -548,8 +548,8 @@ DEFINITION (L"the effective duration of the analysis window, in seconds. The act
 	"of a Hamming window of 0.025 seconds, which is 1.303 / (0.025 s) = 52.1 Hz, "
 	"but that window (which is the window most often used in other analysis programs) "
 	"has three spectral lobes of about -42 dB on each side.")
-TAG (L"##Pre-emphasis from (Hz)")
-DEFINITION (L"the +3 dB point for an inverted low-pass filter with a slope of +6 dB/octave. "
+TAG (U"##Pre-emphasis from (Hz)")
+DEFINITION (U"the +3 dB point for an inverted low-pass filter with a slope of +6 dB/octave. "
 	"If this value is 50 Hz, then frequencies below 50 Hz are not enhanced, "
 	"frequencies around 100 Hz are amplified by 6 dB, frequencies around 200 Hz are amplified by 12 dB, "
 	"and so forth. The point of this is that vowel spectra tend to fall by 6 dB per octave; "
@@ -557,15 +557,15 @@ DEFINITION (L"the +3 dB point for an inverted low-pass filter with a slope of +6
 	"because we want our formants to match the local peaks, not the global spectral slope. "
 	"See the @@source-filter synthesis@ tutorial for a technical explanation, "
 	"and @@Sound: Pre-emphasize (in-line)...@ for the algorithm.")
-ENTRY (L"Algorithm")
-NORMAL (L"The sound will be resampled to a sampling frequency of twice the value of %%Maximum formant%, "
+ENTRY (U"Algorithm")
+NORMAL (U"The sound will be resampled to a sampling frequency of twice the value of %%Maximum formant%, "
 	"with the algorithm described at @@Sound: Resample... at . "
 	"After this, pre-emphasis is applied with the algorithm described at @@Sound: Pre-emphasize (in-line)... at . "
 	"For each analysis window, Praat applies a Gaussian-like window, "
 	"and computes the LPC coefficients with the algorithm by Burg, as given by @@Childers (1978)@ "
 	"and @@Press et al. (1992)@. The number of \"poles\" that this algorithm computes is twice the %%Maximum number of formants%; "
 	"that's why you can set the %%Maximum number of formants% to any multiple of 0.5).")
-NORMAL (L"The algorithm will initially find ##Maximum number of formants# formants in the whole range between 0 Hz "
+NORMAL (U"The algorithm will initially find ##Maximum number of formants# formants in the whole range between 0 Hz "
 	"and ##Maximum formant#. The initially found formants can therefore sometimes have very low frequencies (near 0 Hz) "
 	"or very high frequencies (near ##Maximum formant#). Such low or high \"formants\" tend to be artefacts of the LPC algorithm, "
 	"i.e., the algorithm tends to use them to match the spectral slope if that slope differs from the 6 dB/octave assumption. "
@@ -577,60 +577,60 @@ NORMAL (L"The algorithm will initially find ##Maximum number of formants# forman
 	"across the frequency domain, you may try the otherwise rather unreliable Split-Levinson procedure @@Sound: To Formant (sl)... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Formant (keep all)...", L"ppgb", 20000210)
-INTRO (L"A command that creates a @Formant object from every selected @Sound object. Not recommended for general use.")
-ENTRY (L"Purpose")
-NORMAL (L"to perform a short-term spectral analysis, approximating the spectrum of each frame by a number of formants.")
-ENTRY (L"Settings")
-NORMAL (L"The same as with @@Sound: To Formant (burg)... at .")
-ENTRY (L"Algorithm")
-NORMAL (L"The same as with @@Sound: To Formant (burg)... at . In contrast with that command, "
+MAN_BEGIN (U"Sound: To Formant (keep all)...", U"ppgb", 20000210)
+INTRO (U"A command that creates a @Formant object from every selected @Sound object. Not recommended for general use.")
+ENTRY (U"Purpose")
+NORMAL (U"to perform a short-term spectral analysis, approximating the spectrum of each frame by a number of formants.")
+ENTRY (U"Settings")
+NORMAL (U"The same as with @@Sound: To Formant (burg)... at .")
+ENTRY (U"Algorithm")
+NORMAL (U"The same as with @@Sound: To Formant (burg)... at . In contrast with that command, "
 	"however, all formant values are kept, even those below 50 Hz and those above %%Maximum formant% minus 50 Hz. "
 	"Although this makes the identification of the traditional F1 and F2 more difficult, "
 	"this might give better results in resynthesis (see @@Sound & Formant: Filter@), but it usually generates funny values instead.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Formant (sl)...", L"ppgb", 20021215)
-INTRO (L"A command that creates a @Formant object from every selected @Sound object. Not recommended for general use.")
-ENTRY (L"Purpose")
-NORMAL (L"to perform a short-term spectral analysis, approximating the spectrum of each frame by a number of formants.")
-ENTRY (L"Settings")
-NORMAL (L"The same as with @@Sound: To Formant (burg)... at .")
-ENTRY (L"Algorithm")
-NORMAL (L"The algorithm is based on the implementation of the `Split Levinson' algorithm by @@Willems (1986)@. "
+MAN_BEGIN (U"Sound: To Formant (sl)...", U"ppgb", 20021215)
+INTRO (U"A command that creates a @Formant object from every selected @Sound object. Not recommended for general use.")
+ENTRY (U"Purpose")
+NORMAL (U"to perform a short-term spectral analysis, approximating the spectrum of each frame by a number of formants.")
+ENTRY (U"Settings")
+NORMAL (U"The same as with @@Sound: To Formant (burg)... at .")
+ENTRY (U"Algorithm")
+NORMAL (U"The algorithm is based on the implementation of the `Split Levinson' algorithm by @@Willems (1986)@. "
 	"This algorithm will always find the requested number of formants in every frame, even if they do not exist. "
 	"The standard routine (@@Sound: To Formant (burg)...@) yields much more reliable formant values, though it is more sensitive "
 	"to the %%Maximum formant% argument.")
-NORMAL (L"Because of the general funny behaviour of the Split-Levinson algorithm, we did not bother to implement an analysis "
+NORMAL (U"Because of the general funny behaviour of the Split-Levinson algorithm, we did not bother to implement an analysis "
 	"of the bandwidths. They are all set arbitrarily to 50 Hz.")
 MAN_END
 
-MAN_BEGIN (L"Sound & Formant: Filter", L"ppgb", 19991119)
-INTRO (L"A command to create a new Sound from the selected @Sound and @Formant objects.")
-NORMAL (L"For examples, see @@Source-filter synthesis at .")
-NORMAL (L"The resulting Sound is scaled so that its maximum absolute amplitude is 0.99. "
+MAN_BEGIN (U"Sound & Formant: Filter", U"ppgb", 19991119)
+INTRO (U"A command to create a new Sound from the selected @Sound and @Formant objects.")
+NORMAL (U"For examples, see @@Source-filter synthesis at .")
+NORMAL (U"The resulting Sound is scaled so that its maximum absolute amplitude is 0.99. "
 	"If you don't want this, use @@Sound & Formant: Filter (no scale)@ instead.")
 MAN_END
 
-MAN_BEGIN (L"Sound & Formant: Filter (no scale)", L"ppgb", 19991119)
-INTRO (L"A command to create a new Sound from the selected @Sound and @Formant objects.")
-NORMAL (L"For examples, see @@Source-filter synthesis at .")
-NORMAL (L"Unlike what happens in @@Sound & Formant: Filter@, "
+MAN_BEGIN (U"Sound & Formant: Filter (no scale)", U"ppgb", 19991119)
+INTRO (U"A command to create a new Sound from the selected @Sound and @Formant objects.")
+NORMAL (U"For examples, see @@Source-filter synthesis at .")
+NORMAL (U"Unlike what happens in @@Sound & Formant: Filter@, "
 	"the resulting Sound is not scaled. This allows generation of a series "
 	"of signals with controlled relative intensities.")
 MAN_END
 
-MAN_BEGIN (L"Sound & FormantGrid: Filter", L"ppgb", 20080425)
-INTRO (L"A command to create a new Sound from the selected @Sound and @FormantGrid objects.")
-NORMAL (L"For examples, see @@Source-filter synthesis at .")
-NORMAL (L"The resulting Sound is scaled so that its maximum absolute amplitude is 0.99. "
+MAN_BEGIN (U"Sound & FormantGrid: Filter", U"ppgb", 20080425)
+INTRO (U"A command to create a new Sound from the selected @Sound and @FormantGrid objects.")
+NORMAL (U"For examples, see @@Source-filter synthesis at .")
+NORMAL (U"The resulting Sound is scaled so that its maximum absolute amplitude is 0.99. "
 	"If you don't want this, use @@Sound & FormantGrid: Filter (no scale)@ instead.")
 MAN_END
 
-MAN_BEGIN (L"Sound & FormantGrid: Filter (no scale)", L"ppgb", 20080425)
-INTRO (L"A command to create a new Sound from the selected @Sound and @FormantGrid objects.")
-NORMAL (L"For examples, see @@Source-filter synthesis at .")
-NORMAL (L"Unlike what happens in @@Sound & FormantGrid: Filter@, "
+MAN_BEGIN (U"Sound & FormantGrid: Filter (no scale)", U"ppgb", 20080425)
+INTRO (U"A command to create a new Sound from the selected @Sound and @FormantGrid objects.")
+NORMAL (U"For examples, see @@Source-filter synthesis at .")
+NORMAL (U"Unlike what happens in @@Sound & FormantGrid: Filter@, "
 	"the resulting Sound is not scaled. This allows generation of a series "
 	"of signals with controlled relative intensities.")
 MAN_END
diff --git a/fon/manual_glossary.cpp b/fon/manual_glossary.cpp
index 6ac5481..812559c 100644
--- a/fon/manual_glossary.cpp
+++ b/fon/manual_glossary.cpp
@@ -1,6 +1,6 @@
 /* manual_glossary.cpp
  *
- * Copyright (C) 1992-2008,2014 Paul Boersma
+ * Copyright (C) 1992-2008,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,45 +22,45 @@
 #include "manual_exampleSound.h"
 
 static void draw_TimeDomain_Sound (Graphics g) {
-	Sound_draw (manual_exampleSound (), g, 0, 0, 0, 0, TRUE, L"curve");
+	Sound_draw (manual_exampleSound (), g, 0, 0, 0, 0, true, U"curve");
 }
 static void draw_TimeDomain_Pitch (Graphics g) {
-	Pitch_draw (manual_examplePitch (), g, 0, 0, 200.0, 500.0, TRUE, Pitch_speckle_NO, kPitch_unit_HERTZ);
+	Pitch_draw (manual_examplePitch (), g, 0, 0, 200.0, 500.0, true, Pitch_speckle_NO, kPitch_unit_HERTZ);
 }
 
 void manual_glossary_init (ManPages me);
 void manual_glossary_init (ManPages me) {
 
-MAN_BEGIN (L"aliasing", L"ppgb", 20040331)
-INTRO (L"Aliasing (Du. %vouwvervorming) is the phenomenon of the ambiguity "
+MAN_BEGIN (U"aliasing", U"ppgb", 20040331)
+INTRO (U"Aliasing (Du. %vouwvervorming) is the phenomenon of the ambiguity "
 	"of a sampled signal.")
-ENTRY (L"Example")
-NORMAL (L"With a sampling frequency of 10 kHz, a sine wave with a frequency of 3 kHz "
+ENTRY (U"Example")
+NORMAL (U"With a sampling frequency of 10 kHz, a sine wave with a frequency of 3 kHz "
 	"receives the same representation as a sine wave with a frequency of 7 kHz, "
 	"13 kHz, or 17 kHz, and so on. If the sampled signal is meant to represent a "
 	"continuous spectral range starting at 0 Hz "
 	"(which is the most common case for speech recordings), "
 	"all these tones are likely to be interpreted as 3 kHz tones after sampling.")
-NORMAL (L"To remedy this unwanted situation, the signal is usually low-pass filtered "
+NORMAL (U"To remedy this unwanted situation, the signal is usually low-pass filtered "
 	"with a cut-off frequency just below 5 kHz, prior to sampling.")
 MAN_END
 
-MAN_BEGIN (L"Click", L"ppgb", 19960913)
-INTRO (L"One of the ways to control @Editors.")
-ENTRY (L"How to click")
-LIST_ITEM (L"1. Position the mouse above the object that you want to click.")
-LIST_ITEM (L"2. Press and release the (left) mouse button.")
-NORMAL (L"See also @@Shift-click at .")
-ENTRY (L"Usage in the Praat program")
-NORMAL (L"Clicking on an object is used for selecting this object while deselecting "
+MAN_BEGIN (U"Click", U"ppgb", 19960913)
+INTRO (U"One of the ways to control @Editors.")
+ENTRY (U"How to click")
+LIST_ITEM (U"1. Position the mouse above the object that you want to click.")
+LIST_ITEM (U"2. Press and release the (left) mouse button.")
+NORMAL (U"See also @@Shift-click at .")
+ENTRY (U"Usage in the Praat program")
+NORMAL (U"Clicking on an object is used for selecting this object while deselecting "
 	"all previously selected objects; clicking is also used for moving a cursor hair.")
 MAN_END
 
-MAN_BEGIN (L"constant extrapolation", L"ppgb", 20080425)
-INTRO (L"- the interpretation of values in tiers before the first point or after the last point.")
-ENTRY (L"Example")
-NORMAL (L"The following is a @PitchTier with three points:")
-SCRIPT (4, 3, L""
+MAN_BEGIN (U"constant extrapolation", U"ppgb", 20080425)
+INTRO (U"- the interpretation of values in tiers before the first point or after the last point.")
+ENTRY (U"Example")
+NORMAL (U"The following is a @PitchTier with three points:")
+SCRIPT (4, 3, U""
 	"Create PitchTier: \"tier\", 0, 0.5\n"
 	"Add point: 0.10, 170\n"
 	"Add point: 0.20, 180\n"
@@ -75,78 +75,78 @@ SCRIPT (4, 3, L""
 	"One mark bottom: 0.3, \"yes\", \"yes\", \"yes\", \"\"\n"
 	"One mark bottom: 0.4, \"yes\", \"yes\", \"yes\", \"\"\n"
 )
-NORMAL (L"Between 0.10 and 0.20 seconds, the pitch rises from 170 to 180 Hz, "
+NORMAL (U"Between 0.10 and 0.20 seconds, the pitch rises from 170 to 180 Hz, "
 	"and between 0.20 and 0.45 seconds it falls from 180 to 110 Hz. "
 	"This is @@linear interpolation at .")
-NORMAL (L"But what happens before 0.10 seconds? There, the pitch is just 170 Hz, "
+NORMAL (U"But what happens before 0.10 seconds? There, the pitch is just 170 Hz, "
 	"i.e. the value of the first pitch point. This is %%constant extrapolation% to the left.")
-NORMAL (L"Likewise, after 0.45 seconds the pitch is just 110 Hz, "
+NORMAL (U"Likewise, after 0.45 seconds the pitch is just 110 Hz, "
 	"i.e. the value of the last pitch point. This is constant extrapolation to the right.")
-ENTRY (L"Constant extrapolation in Praat")
-NORMAL (L"Praat uses constant extrapolation in all tiers and grids with values at time points "
+ENTRY (U"Constant extrapolation in Praat")
+NORMAL (U"Praat uses constant extrapolation in all tiers and grids with values at time points "
 	"(@PitchTier, @IntensityTier, @DurationTier, @AmplitudeTier, @FormantGrid).")
 MAN_END
 
-MAN_BEGIN (L"Drag", L"ppgb", 19960913)
-INTRO (L"Dragging is one of the ways to control @Editors.")
-ENTRY (L"How to drag")
-LIST_ITEM (L"1. Position the mouse above the object that you want to drag.")
-LIST_ITEM (L"2. Press the (left) mouse button.")
-LIST_ITEM (L"3. Keeping the mouse button pressed, move the mouse across the window. "
+MAN_BEGIN (U"Drag", U"ppgb", 19960913)
+INTRO (U"Dragging is one of the ways to control @Editors.")
+ENTRY (U"How to drag")
+LIST_ITEM (U"1. Position the mouse above the object that you want to drag.")
+LIST_ITEM (U"2. Press the (left) mouse button.")
+LIST_ITEM (U"3. Keeping the mouse button pressed, move the mouse across the window. "
 	"A shadow of the object will follow.")
-LIST_ITEM (L"4. Release the mouse button when it is above the location where you want your object "
+LIST_ITEM (U"4. Release the mouse button when it is above the location where you want your object "
 	"to be moved (the %drop %site). If the drop site makes any sense, "
 	"the object will move there.")
-NORMAL (L"See also @@Shift-drag at .")
-ENTRY (L"Usage in the Praat program")
-NORMAL (L"Dragging is used for manipulating the time and value of one or more marks, targets, or boundaries:")
+NORMAL (U"See also @@Shift-drag at .")
+ENTRY (U"Usage in the Praat program")
+NORMAL (U"Dragging is used for manipulating the time and value of one or more marks, targets, or boundaries:")
 MAN_END
 
-MAN_BEGIN (L"end time", L"ppgb", 20060714)
-INTRO (L"- the end of the @@time domain@ (see there).")
+MAN_BEGIN (U"end time", U"ppgb", 20060714)
+INTRO (U"- the end of the @@time domain@ (see there).")
 MAN_END
 
-MAN_BEGIN (L"Fast Fourier Transform", L"ppgb", 20041123)
-INTRO (L"An algorithm for fast computation of the Fourier transform of a sampled signal. "
+MAN_BEGIN (U"Fast Fourier Transform", U"ppgb", 20041123)
+INTRO (U"An algorithm for fast computation of the Fourier transform of a sampled signal. "
 	"It involves increasing the number of samples %N to the next-highest power of two, "
 	"and the computation time scales as %N log %N.")
-NORMAL (L"In Praat, the Fast Fourier Transform is used:")
-LIST_ITEM (L"1. For the Fourier transform of an entire sound: @@Sound: To Spectrum...@ with #yes for the #Fast setting, "
+NORMAL (U"In Praat, the Fast Fourier Transform is used:")
+LIST_ITEM (U"1. For the Fourier transform of an entire sound: @@Sound: To Spectrum...@ with #yes for the #Fast setting, "
 	"and @@Spectrum: To Sound at .")
-LIST_ITEM (L"2. For the Fourier transform of consecutive frames in a sound. See @@Sound: To Spectrogram... at .")
-LIST_ITEM (L"3. For the fast computation of correlations, e.g. in @@Sound: To Pitch (ac)... at .")
+LIST_ITEM (U"2. For the Fourier transform of consecutive frames in a sound. See @@Sound: To Spectrogram... at .")
+LIST_ITEM (U"3. For the fast computation of correlations, e.g. in @@Sound: To Pitch (ac)... at .")
 MAN_END
 
-MAN_BEGIN (L"FFT", L"ppgb", 20011121)
-INTRO (L"An abbreviation for @@Fast Fourier Transform at .")
+MAN_BEGIN (U"FFT", U"ppgb", 20011121)
+INTRO (U"An abbreviation for @@Fast Fourier Transform at .")
 MAN_END
 
-MAN_BEGIN (L"frequency", L"ppgb", 20030314)
-INTRO (L"Frequency is how often something happens in a certain time, for instance "
+MAN_BEGIN (U"frequency", U"ppgb", 20030314)
+INTRO (U"Frequency is how often something happens in a certain time, for instance "
 	"the number of times the Praat home page www.praat.org is visited every day.")
-NORMAL (L"In Praat, frequency is the number of vibration cycles per second. "
+NORMAL (U"In Praat, frequency is the number of vibration cycles per second. "
 	"Although one can sometimes see the abbreviation %cps, Praat always uses Hz (short for %hertz), "
 	"which means the same.")
-NORMAL (L"Unfortunately, there are two very distinct kinds of vibrations in speech analysis. "
+NORMAL (U"Unfortunately, there are two very distinct kinds of vibrations in speech analysis. "
 	"For pitch, frequency is the number of glottal cycles per second, and for spectral analysis, "
 	"frequency is the number of sine wave cycles per second. Quite some bit of the training of an "
 	"acoustic phonetician goes into the understanding of the difference between the ideas behind F0 and F1, "
 	"and many years can be spent on understanding the influence they have on each other in production, "
 	"acoustics, perception, or measurement...")
-NORMAL (L"In order to prevent confusion, Praat always requires frequency to be expressed in Hz. "
+NORMAL (U"In order to prevent confusion, Praat always requires frequency to be expressed in Hz. "
 	"So if you want to supply a sampling frequency of 20 kiloHertz (20 kHz), you fill in 20000 or 2e4 or 20e3. "
 	"If you want to switch off pre-emphasis in some spectral analysis, you supply 1 GigaHertz (GHz) "
 	"for its \"from-frequency\", by typing 1e9.")
-NORMAL (L"In Praat editor windows, frequency usually runs from bottom to top, since time already has to run "
+NORMAL (U"In Praat editor windows, frequency usually runs from bottom to top, since time already has to run "
 	"from left to right. This goes for spectrograms, pitch contours, and formant contours. "
 	"In spectral slices, frequency runs from left to right, since these have no time axis.")
 MAN_END
 
-MAN_BEGIN (L"linear interpolation", L"ppgb", 20080426)
-INTRO (L"- the interpretation of values in tiers between the first point and the last point.")
-ENTRY (L"Example")
-NORMAL (L"The following is a @PitchTier with three points:")
-SCRIPT (4, 3, L""
+MAN_BEGIN (U"linear interpolation", U"ppgb", 20080426)
+INTRO (U"- the interpretation of values in tiers between the first point and the last point.")
+ENTRY (U"Example")
+NORMAL (U"The following is a @PitchTier with three points:")
+SCRIPT (4, 3, U""
 	"Create PitchTier: \"tier\", 0, 0.5\n"
 	"Add point: 0.10, 170\n"
 	"Add point: 0.20, 180\n"
@@ -161,211 +161,211 @@ SCRIPT (4, 3, L""
 	"One mark bottom: 0.3, \"yes\", \"yes\", \"yes\", \"\"\n"
 	"One mark bottom: 0.4, \"yes\", \"yes\", \"yes\", \"\"\n"
 )
-NORMAL (L"Between 0.10 and 0.20 seconds, the pitch rises linearly from 170 to 180 Hz, "
+NORMAL (U"Between 0.10 and 0.20 seconds, the pitch rises linearly from 170 to 180 Hz, "
 	"and between 0.20 and 0.45 seconds it falls linearly from 180 to 110 Hz. "
 	"This is %%linear interpolation%: at all times between two adjacent points, "
 	"the pitch values follow the straight line that connects the two points.")
-NORMAL (L"(Before 0.10 seconds and after 0.45 seconds there is @@constant extrapolation at .")
-ENTRY (L"Linear interpolation in Praat")
-NORMAL (L"Praat uses linear interpolation in all tiers and grids with values at time points "
+NORMAL (U"(Before 0.10 seconds and after 0.45 seconds there is @@constant extrapolation at .")
+ENTRY (U"Linear interpolation in Praat")
+NORMAL (U"Praat uses linear interpolation in all tiers and grids with values at time points "
 	"(@PitchTier, @IntensityTier, @DurationTier, @AmplitudeTier, @FormantGrid).")
 MAN_END
 
-MAN_BEGIN (L"Nyquist frequency", L"ppgb", 20040331)
-INTRO (L"The %%Nyquist frequency% is the bandwidth of a sampled signal, "
+MAN_BEGIN (U"Nyquist frequency", U"ppgb", 20040331)
+INTRO (U"The %%Nyquist frequency% is the bandwidth of a sampled signal, "
 	"and is equal to half the sampling frequency of that signal. "
 	"If the sampled signal should represent a continuous spectral range starting "
 	"at 0 Hz (which is the most common case for speech recordings), "
 	"the Nyquist frequency is the highest frequency that the sampled signal "
 	"can unambiguously represent.")
-ENTRY (L"Example")
-NORMAL (L"If a speech signal is sampled at 22050 Hz, the highest frequency that we can "
+ENTRY (U"Example")
+NORMAL (U"If a speech signal is sampled at 22050 Hz, the highest frequency that we can "
 	"expect to be present in the sampled signal is 11025 Hz. "
 	"This means that to heed this expectation, we should run the continuous signal "
 	"through a low-pass filter with a cut-off frequency below 11025 Hz; "
 	"otherwise, we would experience the phenomenon of @aliasing.")
-NORMAL (L"Of course, with a sampling frequency of 22050 Hz we could also represent a signal "
+NORMAL (U"Of course, with a sampling frequency of 22050 Hz we could also represent a signal "
 	"band-limited between, say, 40000 Hz and 51025 Hz, but this seems less useful "
 	"in speech research.")
 MAN_END
 
-MAN_BEGIN (L"objects", L"ppgb", 20030528)
-INTRO (L"The things that contain the data in the Praat program.")
-NORMAL (L"The objects are visible in the @@List of Objects@ in the @@Object window at .")
-NORMAL (L"Most objects are contained in memory: they are %not files! "
+MAN_BEGIN (U"objects", U"ppgb", 20030528)
+INTRO (U"The things that contain the data in the Praat program.")
+NORMAL (U"The objects are visible in the @@List of Objects@ in the @@Object window at .")
+NORMAL (U"Most objects are contained in memory: they are %not files! "
 	"Therefore, you may want to save them with one of the commands from the @@Save menu@ "
 	"before you @Quit. "
 	"Exceptions are the LongSound objects in the Praat program and the file-based dictionaries "
 	"in the ALS program.")
-NORMAL (L"You can create an object by choosing a command from the @@New menu@ "
+NORMAL (U"You can create an object by choosing a command from the @@New menu@ "
 	"or from the @@Open menu at .")
-NORMAL (L"When you select one or more objects, you can perform on them the actions that are shown "
+NORMAL (U"When you select one or more objects, you can perform on them the actions that are shown "
 	"in the @@dynamic menu@, on the ##fixed buttons# below the list of objects, "
 	"or in the @@Save menu at . You can choose hidden actions with the help of the @ButtonEditor.")
 MAN_END
 
-MAN_BEGIN (L"overlap-add", L"ppgb", 20070816)
-INTRO (L"A method for manipulating the pitch and duration of an acoustic speech signal. "
+MAN_BEGIN (U"overlap-add", U"ppgb", 20070816)
+INTRO (U"A method for manipulating the pitch and duration of an acoustic speech signal. "
 	"This method was realized by @@Moulines & Charpentier (1990)@, "
 	"who called it Time-Domain Pitch-Synchronous Overlap-and-Add (TD-PSOLA). "
 	"Nowadays, PSOLA™ and TD-PSOLA™ are trademarks owned by France Telecom^®.")
-ENTRY (L"Overlap-add synthesis")
-NORMAL (L"When a @Sound is created from a @Manipulation object, the following steps are performed:")
-LIST_ITEM (L"1. From the @PitchTier, new points are generated along the entire time domain, "
+ENTRY (U"Overlap-add synthesis")
+NORMAL (U"When a @Sound is created from a @Manipulation object, the following steps are performed:")
+LIST_ITEM (U"1. From the @PitchTier, new points are generated along the entire time domain, "
 	"with the method of @@PitchTier: To PointProcess at .")
-LIST_ITEM (L"2. The period information in the original pulses (available in the Manipulation object) "
+LIST_ITEM (U"2. The period information in the original pulses (available in the Manipulation object) "
 	"is used to remove from the new pulses all points that lie within voiceless intervals "
 	"(i.e., places where the distance between adjacent points in the original pulses is greater than 20 ms).")
-LIST_ITEM (L"3. The voiceless parts are copied from the source Sound to the target Sound, "
+LIST_ITEM (U"3. The voiceless parts are copied from the source Sound to the target Sound, "
 	"re-using some parts if the local duration is greater than 1.")
-LIST_ITEM (L"4. For each target point, we look up the nearest source point. A piece of the source Sound, "
+LIST_ITEM (U"4. For each target point, we look up the nearest source point. A piece of the source Sound, "
 	"centred around the source point, is copied to the target Sound at a location determined by "
 	"the target point, using a bell-shaped window whose left-hand half-length is the minimum "
 	"of the left-hand periods adjacent to the source and target points "
 	"(and analogously for the right-hand half-length).")
 MAN_END
 
-MAN_BEGIN (L"pitch floor", L"ppgb", 20060914)
-INTRO (L"The pitch floor is the bottom of the pitch range in the Sound window (see the @Intro). "
+MAN_BEGIN (U"pitch floor", U"ppgb", 20060914)
+INTRO (U"The pitch floor is the bottom of the pitch range in the Sound window (see the @Intro). "
 	"The standard setting is 75 hertz; pitch values below this pitch floor will not be computed or shown by Praat.")
-NORMAL (L"To change the pitch floor, choose @@Pitch settings... at .")
+NORMAL (U"To change the pitch floor, choose @@Pitch settings... at .")
 MAN_END
 
-MAN_BEGIN (L"power spectral density", L"ppgb", 20101026)
-INTRO (L"The average power in a sound during a certain time range and in a certain frequency range, expressed in Pa^2/Hz.")
-ENTRY (L"Mathematical definition")
-NORMAL (L"The %%complex spectrum% of a sound %x(%t) in the time range (%t__1_, %t__2_) is")
-FORMULA (L"%X(%f) ≡ ∫__%%t%1_^^%%t%2^ %x(%t) e^^-2%π%ift^ %dt")
-NORMAL (L"for any frequency %f in the two-sided frequency domain (-%F, +%F). "
+MAN_BEGIN (U"power spectral density", U"ppgb", 20101026)
+INTRO (U"The average power in a sound during a certain time range and in a certain frequency range, expressed in Pa^2/Hz.")
+ENTRY (U"Mathematical definition")
+NORMAL (U"The %%complex spectrum% of a sound %x(%t) in the time range (%t__1_, %t__2_) is")
+FORMULA (U"%X(%f) ≡ ∫__%%t%1_^^%%t%2^ %x(%t) e^^-2%π%ift^ %dt")
+NORMAL (U"for any frequency %f in the two-sided frequency domain (-%F, +%F). "
 	"If %x(%t) is expressed in units of Pascal, %X(%f) is expressed in units of Pa/Hz. "
 	"In Praat, this complex spectrum is the quantity stored in a @Spectrum.")
-NORMAL (L"From the complex spectrum we can compute the %%one-sided power spectral density% in Pa^2/Hz as")
-FORMULA (L"PSD(%f) ≡ 2|%X(%f)|^2 / (%t__2_ - %t__1_)")
-NORMAL (L"where the factor 2 is due to adding the contributions from positive and negative frequencies. "
+NORMAL (U"From the complex spectrum we can compute the %%one-sided power spectral density% in Pa^2/Hz as")
+FORMULA (U"PSD(%f) ≡ 2|%X(%f)|^2 / (%t__2_ - %t__1_)")
+NORMAL (U"where the factor 2 is due to adding the contributions from positive and negative frequencies. "
 	"In Praat, this power spectral density is the quantity stored in a @Spectrogram.")
-NORMAL (L"The PSD divides up the total power of the sound. "
+NORMAL (U"The PSD divides up the total power of the sound. "
 	"To see this, we integrate it over its entire one-sided frequency domain (0, %F):")
-FORMULA (L"∫__0_^^%F^ PSD(%f) %df = ∫__0_^^%F^ 2|%X(%f)|^2/(%t__2_-%t__1_) %df =")
-FORMULA (L"= 1/(%t__2_-%t__1_) ∫__-%F_^^+%F^ |%X(%f)|^2 %df = 1/(%t__2_-%t__1_) ∫__%%t%1_^^%%t%2^ |%x(%t)|^2 %dt")
-NORMAL (L"where the last step uses %%Parceval's theorem%. "
+FORMULA (U"∫__0_^^%F^ PSD(%f) %df = ∫__0_^^%F^ 2|%X(%f)|^2/(%t__2_-%t__1_) %df =")
+FORMULA (U"= 1/(%t__2_-%t__1_) ∫__-%F_^^+%F^ |%X(%f)|^2 %df = 1/(%t__2_-%t__1_) ∫__%%t%1_^^%%t%2^ |%x(%t)|^2 %dt")
+NORMAL (U"where the last step uses %%Parceval's theorem%. "
 	"The result is precisely the average power of the sound in the time range (%t__1_, %t__2_).")
-ENTRY (L"The logarithmic power spectral density")
-NORMAL (L"It is often useful to express the power spectral density in dB relative to %%P__ref_% = 2·10^^-5^ Pa:")
-FORMULA (L"PSD__dB_(%f) = 10 log__10_ { PSD(%f) / %%P__ref_%^2 }")
-NORMAL (L"Since the argument of the logarithm is in units of Hz^^-1^, this spectral measure can loosely be said "
+ENTRY (U"The logarithmic power spectral density")
+NORMAL (U"It is often useful to express the power spectral density in dB relative to %%P__ref_% = 2·10^^-5^ Pa:")
+FORMULA (U"PSD__dB_(%f) = 10 log__10_ { PSD(%f) / %%P__ref_%^2 }")
+NORMAL (U"Since the argument of the logarithm is in units of Hz^^-1^, this spectral measure can loosely be said "
 	"to be in units of `dB/Hz'. In Praat, this logarithmic power spectral density is the quantity stored in an @Ltas; "
 	"it is also the quantity shown in pictures of a @Spectrum and a @Spectrogram.")
 MAN_END
 
-MAN_BEGIN (L"quantile algorithm", L"ppgb", 19980101)
-INTRO (L"An algorithm to compute the specified quantile of a sorted array of real numbers.")
-NORMAL (L"The %n\\%  %quantile of a continuous real-valued distribution is the value below which %n\\%  of the values "
+MAN_BEGIN (U"quantile algorithm", U"ppgb", 19980101)
+INTRO (U"An algorithm to compute the specified quantile of a sorted array of real numbers.")
+NORMAL (U"The %n\\%  %quantile of a continuous real-valued distribution is the value below which %n\\%  of the values "
 	"is expected to lie. If we are given an array of real numbers that we want to interpret as having been drawn from a "
 	"distribution, we can %estimate the quantiles of the underlying distribution.")
-ENTRY (L"1. The median")
-NORMAL (L"The %median is a special case of a quantile: it is the 50\\%  quantile. It is usually estimated as follows: "
+ENTRY (U"1. The median")
+NORMAL (U"The %median is a special case of a quantile: it is the 50\\%  quantile. It is usually estimated as follows: "
 	"from an odd number of values, take the middle value; form an even number, take the average of "
 	"the two midmost values. For instance, if our values are 15, 20, and 32, the median is 20; "
 	"if our values are 15, 20, 32, and 60, the median is 26.")
-NORMAL (L"This estimate is direction-independent: if we multiply all values by -1 (i.e., they become -60, -32, -20, and -15), "
+NORMAL (U"This estimate is direction-independent: if we multiply all values by -1 (i.e., they become -60, -32, -20, and -15), "
 	"the median is also multiplied by -1 (it becomes -26).")
-ENTRY (L"2. Percentiles?")
-NORMAL (L"The %%n%th %percentile of a set of values is usually defined as the highest attested value "
+ENTRY (U"2. Percentiles?")
+NORMAL (U"The %%n%th %percentile of a set of values is usually defined as the highest attested value "
 	"for which at most %n\\%  of all attested values are less or equal. "
 	"For instance, if our values are 15, 20, 32, and 60, the 30th percentile is 15. Here is an extensive list:")
-LIST_ITEM (L"\tPercentile number\tValue")
-LIST_ITEM (L"\t0\t-")
-LIST_ITEM (L"\t10\t-")
-LIST_ITEM (L"\t20\t-")
-LIST_ITEM (L"\t30\t15")
-LIST_ITEM (L"\t40\t15")
-LIST_ITEM (L"\t50\t20")
-LIST_ITEM (L"\t60\t20")
-LIST_ITEM (L"\t70\t20")
-LIST_ITEM (L"\t80\t32")
-LIST_ITEM (L"\t90\t32")
-LIST_ITEM (L"\t100\t60")
-NORMAL (L"However, this procedure does not yield an estimate of the quantiles of the underlying distribution. "
+LIST_ITEM (U"\tPercentile number\tValue")
+LIST_ITEM (U"\t0\t-")
+LIST_ITEM (U"\t10\t-")
+LIST_ITEM (U"\t20\t-")
+LIST_ITEM (U"\t30\t15")
+LIST_ITEM (U"\t40\t15")
+LIST_ITEM (U"\t50\t20")
+LIST_ITEM (U"\t60\t20")
+LIST_ITEM (U"\t70\t20")
+LIST_ITEM (U"\t80\t32")
+LIST_ITEM (U"\t90\t32")
+LIST_ITEM (U"\t100\t60")
+NORMAL (U"However, this procedure does not yield an estimate of the quantiles of the underlying distribution. "
 	"For instance, the estimate is direction-dependent: if we multiply all values by -1, the 50th percentile "
 	"becomes -32 instead of -20, and the 70th percentile becomes -32 instead of the expected -15, "
 	"which is minus the 30th percentile of the original data set.")
-ENTRY (L"3. Unbiased quantiles")
-NORMAL (L"To get a better estimate of the quantiles of the underlying distribution, the interpolation that we used "
+ENTRY (U"3. Unbiased quantiles")
+NORMAL (U"To get a better estimate of the quantiles of the underlying distribution, the interpolation that we used "
 	"to determine the median, is generalized to %any quantile.")
-NORMAL (L"We assume that the attested values 15, 20, 32, and 60 each take up one quarter of the \"quantile space\". "
+NORMAL (U"We assume that the attested values 15, 20, 32, and 60 each take up one quarter of the \"quantile space\". "
 	"These four values are in the middles of those quarters, so they are at the 0.125, 0.375, 0.625, and 0.875 quantiles.")
-NORMAL (L"Quantiles in between 0.125 and 0.875 are evaluated by linear interpolation: the 0.25, 0.50, and 0.75 quantiles "
+NORMAL (U"Quantiles in between 0.125 and 0.875 are evaluated by linear interpolation: the 0.25, 0.50, and 0.75 quantiles "
 	"are 17.5, 26, and 46, respectively. Note that the 0.50 quantile is the median. The 0.40 quantile, for example, "
 	"is estimated as 20 + (32 - 20)·(0.40 - 0.375)/(0.625 - 0.375) = 21.2.")
-NORMAL (L"Quantiles between 0 and 0.125 or between 0.875 and 1 are evaluated by linear extrapolation from the "
+NORMAL (U"Quantiles between 0 and 0.125 or between 0.875 and 1 are evaluated by linear extrapolation from the "
 	"lowest or highest pair of values: the 0\\%  quantile is estimated as 15 - 1/2 (20 - 15) = 12.5, "
 	"and the 100\\%  quantile is estimated as 60 + 1/2 (60 – 32) = 74. The 0.10 quantile is estimated as "
 	"12.5 + (15 – 12.5)·(0.10 – 0.0)/(0.125 – 0.0) = 14.5.")
-NORMAL (L"Note that the estimated values for the very low or high quantiles can lie outside the range of attested values. "
+NORMAL (U"Note that the estimated values for the very low or high quantiles can lie outside the range of attested values. "
 	"In fact, the computed 0\\%  and 100\\%  quantiles are thought to be estimates of the minimum and maximum values "
 	"of the distribution. For uniform distributions, these estimates are reasonable; for a normal distribution, of course, "
 	"the 0\\%  and 100\\%  quantiles are meaningless.")
 MAN_END
 
-MAN_BEGIN (L"sampling frequency", L"ppgb", 20040415)
-INTRO (L"The sampling frequency (or %%sample rate%) is the number of samples per second in a @Sound. "
+MAN_BEGIN (U"sampling frequency", U"ppgb", 20040415)
+INTRO (U"The sampling frequency (or %%sample rate%) is the number of samples per second in a @Sound. "
 	"For example: if the sampling frequency is 44100 hertz, a recording with a duration of 60 seconds "
 	"will contain 2,646,000 samples.")
-NORMAL (L"Usual values for the sampling frequency are 44100 Hz (CD quality) and 22050 Hz "
+NORMAL (U"Usual values for the sampling frequency are 44100 Hz (CD quality) and 22050 Hz "
 	"(just enough for speech, since speech does not contain relevant frequencies above 11025 Hz; see @aliasing).")
-NORMAL (L"To get the sampling frequency of a selected #Sound, click #Info or choose @@Get sampling frequency at .")
+NORMAL (U"To get the sampling frequency of a selected #Sound, click #Info or choose @@Get sampling frequency at .")
 MAN_END
 
-MAN_BEGIN (L"sampling period", L"ppgb", 20040415)
-INTRO (L"The sampling period is the time difference between two consecutive samples in a @Sound. "
+MAN_BEGIN (U"sampling period", U"ppgb", 20040415)
+INTRO (U"The sampling period is the time difference between two consecutive samples in a @Sound. "
 	"It is the inverse of the @@sampling frequency at . For example: if the sampling frequency "
 	"is 44100 Hz, the sampling period is 1/44100 = 2.2675736961451248e-05 seconds: "
 	"the samples are spaced approximately 23 microseconds apart.")
-NORMAL (L"To get the sampling period of a selected #Sound, click #Info or choose @@Get sampling period at .")
+NORMAL (U"To get the sampling period of a selected #Sound, click #Info or choose @@Get sampling period at .")
 MAN_END
 
-MAN_BEGIN (L"Shift-drag", L"ppgb", 19980823)
-INTRO (L"Shift-dragging is one of the ways to control @Editors.")
-ENTRY (L"How to Shift-drag")
-LIST_ITEM (L"1. Position the mouse above any of the objects that you want to drag "
+MAN_BEGIN (U"Shift-drag", U"ppgb", 19980823)
+INTRO (U"Shift-dragging is one of the ways to control @Editors.")
+ENTRY (U"How to Shift-drag")
+LIST_ITEM (U"1. Position the mouse above any of the objects that you want to drag "
 	"(the objects were probably selected first).")
-LIST_ITEM (L"2. Press a Shift key.")
-LIST_ITEM (L"3. Press the (left) mouse button.")
-LIST_ITEM (L"4. Keeping the mouse button pressed, move the mouse across the window. "
+LIST_ITEM (U"2. Press a Shift key.")
+LIST_ITEM (U"3. Press the (left) mouse button.")
+LIST_ITEM (U"4. Keeping the mouse button pressed, move the mouse across the window. "
 	"A shadow of the objects will follow.")
-LIST_ITEM (L"5. Release the mouse button when it is above the location where you want your objects "
+LIST_ITEM (U"5. Release the mouse button when it is above the location where you want your objects "
 	"to be moved. If this %%drop site% makes any sense, the objects will move there.")
-ENTRY (L"Usage in the Praat program")
-NORMAL (L"While plain @@drag at ging is used for moving objects that were selected first by clicking, "
+ENTRY (U"Usage in the Praat program")
+NORMAL (U"While plain @@drag at ging is used for moving objects that were selected first by clicking, "
 	"##Shift-dragging# is used for manipulating the times and values of more marks, targets, "
 	"or boundaries simultaneously:")
 MAN_END
 
-MAN_BEGIN (L"Shift-click", L"ppgb", 19960913)
-INTRO (L"One of the ways to control @Editors.")
-ENTRY (L"How to Shift-click")
-LIST_ITEM (L"1. Position the mouse above the object that you want to Shift-click.")
-LIST_ITEM (L"2. Press a Shift key.")
-LIST_ITEM (L"3. Press and release the (left) mouse button.")
-ENTRY (L"Usage in the Praat program")
-NORMAL (L"Whereas plain @@click at ing is used for selecting only one object while deselecting "
+MAN_BEGIN (U"Shift-click", U"ppgb", 19960913)
+INTRO (U"One of the ways to control @Editors.")
+ENTRY (U"How to Shift-click")
+LIST_ITEM (U"1. Position the mouse above the object that you want to Shift-click.")
+LIST_ITEM (U"2. Press a Shift key.")
+LIST_ITEM (U"3. Press and release the (left) mouse button.")
+ENTRY (U"Usage in the Praat program")
+NORMAL (U"Whereas plain @@click at ing is used for selecting only one object while deselecting "
 	"all previously selected objects, ##Shift-click# is used for selecting a mark, target, "
 	"or boundary, %without deselecting the previously selected objects:")
 MAN_END
 
-MAN_BEGIN (L"sound pressure calibration", L"ppgb", 20041119)
-NORMAL (L"Your computer's sound-recording software returns integer values between -32768 and 32767. "
+MAN_BEGIN (U"sound pressure calibration", U"ppgb", 20041119)
+NORMAL (U"Your computer's sound-recording software returns integer values between -32768 and 32767. "
 	"Praat divides them by 32768 before putting them into a Sound object, "
 	"so that the values in the Sound objects are always between -1 and +1.")
-NORMAL (L"The Praat program considers these numbers to be air pressures in units of Pascal.")
-NORMAL (L"These values in Pascal are probably not the actual true air pressures that went into the microphone. "
+NORMAL (U"The Praat program considers these numbers to be air pressures in units of Pascal.")
+NORMAL (U"These values in Pascal are probably not the actual true air pressures that went into the microphone. "
 	"To determine what the actual air pressures were, you have to record an extra sound with a known air pressure, "
 	"with the same recording gain as the rest of your recordings. It is best if this extra sound is something "
 	"like a white noise, so that its @@sound pressure level@ can be determined reliably. A sine wave of 400 Hz, "
 	"for instance, is less suitable, since its sound pressure level at your microphone can depend very strongly "
 	"on the precise position and direction of the loudspeaker and on the position of other objects (like you, "
 	"the experimenter) in the room (differences of 10 dB are no exception).")
-NORMAL (L"For example, suppose that you record some speech on a CD recorder or with Praat's SoundRecorder. "
+NORMAL (U"For example, suppose that you record some speech on a CD recorder or with Praat's SoundRecorder. "
 	"Immediately before or after this recording, you also record a white noise produced by a noise generator. "
 	"With a dB meter (Linear or C setting), located at the same position as the microphone of the recording, "
 	"you measure that the Sound Pressure Level of this noise is 76.5 dB. "
@@ -373,14 +373,14 @@ NORMAL (L"For example, suppose that you record some speech on a CD recorder or w
 	"(switch on ##Show intensity#) is 68.6 dB. You then know that you have to add 7.9 dB to intensities measured in Praat "
 	"to get at the true sound pressure level. Thus, if your speech contains a long [a:] whose average intensity "
 	"is measured in the Sound window as 71.1 dB, its true sound pressure level must be 79.0 dB.")
-NORMAL (L"In this example, you can make Praat's sound window show the true sound pressures in Pascal "
+NORMAL (U"In this example, you can make Praat's sound window show the true sound pressures in Pascal "
 	"and true sound pressure levels in dB, if you multiply the sound with a factor of 10^^(7.9/20)^, "
 	"which you can do by selecting the Sound and choosing ##Multiply...# from the #Modify menu, "
 	"then supplying $$10\\^ (7.9/20)$ as the multiplication factor.")
 MAN_END
 
-MAN_BEGIN (L"sound pressure level", L"ppgb", 20041124)
-NORMAL (L"Air pressures are measured in Pascal (Pa), which are Newtons per square metre (N/m^2). "
+MAN_BEGIN (U"sound pressure level", U"ppgb", 20041124)
+NORMAL (U"Air pressures are measured in Pascal (Pa), which are Newtons per square metre (N/m^2). "
 	"The ambient air pressure is about 100,000 Pa, and the lungs modify this in phonation "
 	"only by a small amount, namely 200 to 1000 Pa (= 2 to 10 cm H__2_O). "
 	"Outside your body, the air pressures caused by your speech are much smaller again, "
@@ -388,51 +388,51 @@ NORMAL (L"Air pressures are measured in Pascal (Pa), which are Newtons per squar
 	"see for a typical speech recording in Praat's sound window, "
 	"although these numbers in Praat can be interpreted as true air pressures only if you perform "
 	"a @@sound pressure calibration@ (including the multiplication).")
-NORMAL (L"A normative human ear can detect a root-mean-squared air pressure "
+NORMAL (U"A normative human ear can detect a root-mean-squared air pressure "
 	"as small as 0.00002 Pa, for a sine wave with a frequency of 1000 Hz. "
 	"The %%sound pressure level% can be expressed in dB relative to this normative threshold:")
-FORMULA (L"SPL = 10 log__10_ { 1/(%t__2_-%t__1_) ∫__t1_^^t2^ %x^2(%t) %dt / (2·10^^-5^ Pa)^2 }")
-NORMAL (L"where %x(%t) is the sound pressure in Pa as a function of time, "
+FORMULA (U"SPL = 10 log__10_ { 1/(%t__2_-%t__1_) ∫__t1_^^t2^ %x^2(%t) %dt / (2·10^^-5^ Pa)^2 }")
+NORMAL (U"where %x(%t) is the sound pressure in Pa as a function of time, "
 	"and %t__1_ and %t__2_ are the times between which the energy (squared air pressure) is averaged. "
 	"For a calibrated sound, Praat's sound window will show you the SPL as a function of time, "
 	"if you switch on ##Show intensity# and set its ##averaging method# to #energy (with ##Intensity settings...#).")
 MAN_END
 
-MAN_BEGIN (L"spectro-temporal representation", L"ppgb", 20030314)
-INTRO (L"A representation (of a sound signal, for instance) as some sort of intensity as a function "
+MAN_BEGIN (U"spectro-temporal representation", U"ppgb", 20030314)
+INTRO (U"A representation (of a sound signal, for instance) as some sort of intensity as a function "
 	"of @time and @frequency. In Praat, we have the @Spectrogram, which is acoustic energy density as a "
 	"function of time in seconds and frequency in Hz, and the @Cochleagram, which is basilar membrane "
 	"excitation as a function of time in seconds and frequency in Bark.")
-NORMAL (L"For tutorial information, see @@Intro 3.1. Viewing a spectrogram at .")
+NORMAL (U"For tutorial information, see @@Intro 3.1. Viewing a spectrogram at .")
 MAN_END
 
-MAN_BEGIN (L"start time", L"ppgb", 20060714)
-INTRO (L"- the beginning of the @@time domain@ (see there).")
+MAN_BEGIN (U"start time", U"ppgb", 20060714)
+INTRO (U"- the beginning of the @@time domain@ (see there).")
 MAN_END
 
-MAN_BEGIN (L"stereo", L"ppgb", 20110131)
-INTRO (L"A stereo sound is a sound consisting of a left and a right channel. "
+MAN_BEGIN (U"stereo", U"ppgb", 20110131)
+INTRO (U"A stereo sound is a sound consisting of a left and a right channel. "
 	"Praat can read and write both mono and stereo sounds.")
-ENTRY (L"Reading a stereo sound from disk")
-NORMAL (L"If you read a @Sound into Praat from disk with @@Read from file...@, "
+ENTRY (U"Reading a stereo sound from disk")
+NORMAL (U"If you read a @Sound into Praat from disk with @@Read from file...@, "
 	"and that sound file is a stereo file, the resulting Sound object will be a stereo Sound.")
-NORMAL (L"If you want to look at the left or right channel separately, "
+NORMAL (U"If you want to look at the left or right channel separately, "
 	"you can use @@Extract one channel... at .")
-ENTRY (L"Saving a stereo sound to disk")
-NORMAL (L"If you choose @@Save as WAV file...@, and the sound is a stereo sound, "
+ENTRY (U"Saving a stereo sound to disk")
+NORMAL (U"If you choose @@Save as WAV file...@, and the sound is a stereo sound, "
 	"then the sound file will be a stereo file. "
 	"If you have two mono sounds and you want to combine them into one stereo sound, "
 	"you can use @@Combine to stereo at .")
 MAN_END
 
-MAN_BEGIN (L"time", L"ppgb", 20110128)
-INTRO (L"In normal life, time is how late the watch says it is.")
-NORMAL (L"In Praat, this definition is largely irrelevant. "
+MAN_BEGIN (U"time", U"ppgb", 20110128)
+INTRO (U"In normal life, time is how late the watch says it is.")
+NORMAL (U"In Praat, this definition is largely irrelevant. "
 	"Sound files rarely tell us the absolute time of recording. "
 	"So when you read a sound file into Praat and click ##View & Edit#, you will see "
 	"that the Sound starts at a time of 0 seconds, and if its duration is 3.5 seconds, "
 	"you will see that the Sound finishes at a time of 3.5 seconds.")
-NORMAL (L"Besides sounds, many other types of objects in Praat have a time scale as well: "
+NORMAL (U"Besides sounds, many other types of objects in Praat have a time scale as well: "
 	"spectrograms, pitch contours, formant contours, point processes, and so on. None of these "
 	"are required to have a time domain that starts at 0 seconds. In the Sound editor window, for example, "
 	"you can select the part that runs from 1.4. to 1.7 seconds, and \"extract\" it to the Objects window "
@@ -444,216 +444,216 @@ NORMAL (L"Besides sounds, many other types of objects in Praat have a time scale
 	"to an audio file (WAV, AIFF), the time information is not preserved in that file; "
 	"if you read such an audio file into Praat again, the time domain of the new Sound object "
 	"will run from 0 to 0.3 seconds.")
-NORMAL (L"In order to prevent confusion, Praat always requires times to be expressed in seconds. "
+NORMAL (U"In order to prevent confusion, Praat always requires times to be expressed in seconds. "
 	"So if you want to supply a window length of 5 milliseconds (5 ms), you fill in 0.005 or 5e-3. "
 	"For 83.2 microseconds (83.2 μs), you say 0.0000832, or better 83.2e-6 or 8.32e-5.")
-NORMAL (L"On a clock, time runs around in circles. In Praat's editor windows, time runs from left to right. "
+NORMAL (U"On a clock, time runs around in circles. In Praat's editor windows, time runs from left to right. "
 	"You can often see only a part of the time scale in the window. "
 	"To see another part, you %scroll backward or forward.")
 MAN_END
 
-MAN_BEGIN (L"time domain", L"ppgb", 20140421)
-INTRO (L"This manual page assumes that you have read the @Intro.")
-NORMAL (L"Many objects in Praat are %%functions of time%. Examples are: "
+MAN_BEGIN (U"time domain", U"ppgb", 20140421)
+INTRO (U"This manual page assumes that you have read the @Intro.")
+NORMAL (U"Many objects in Praat are %%functions of time%. Examples are: "
 	"@Sound, @Pitch, @Spectrogram, @Formant, @Intensity, @TextGrid, "
 	"@PitchTier, @DurationTier, @Harmonicity, @PointProcess.")
-NORMAL (L"In Praat, these functions have a contiguous ##time domain#, i.e. "
+NORMAL (U"In Praat, these functions have a contiguous ##time domain#, i.e. "
 	"a single time stretch with a @@start time@ and an @@end time at . "
 	"The @@total duration@ of such a function is the difference between the start time "
 	"and the end time. There are up to five ways to see the time domain "
 	"of an object.")
-ENTRY (L"The time domain in editor windows")
-NORMAL (L"If you select an object that is a function of time and click ##View & Edit#, an editor window "
+ENTRY (U"The time domain in editor windows")
+NORMAL (U"If you select an object that is a function of time and click ##View & Edit#, an editor window "
 	"will appear on the screen. The rectangle at the bottom will show the start time, "
 	"the end time, and the total duration.")
-ENTRY (L"The time domain in the picture window")
-NORMAL (L"If you select an object that is a function of time and choose one of the #Draw commands, "
+ENTRY (U"The time domain in the picture window")
+NORMAL (U"If you select an object that is a function of time and choose one of the #Draw commands, "
 	"the window that pops up will invite you to supply a time range. If you keep this time range "
 	"at its standard setting (from 0.0 to 0.0 seconds), Praat will draw the object for the whole time domain "
 	"and print the start time and the end time below the horizontal axis (if #Garnish is on):")
 PICTURE (5, 2.5, draw_TimeDomain_Sound)
 PICTURE (5, 2.5, draw_TimeDomain_Pitch)
-ENTRY (L"The time domain in the Info window")
-NORMAL (L"If you select an object that is a function of time and click #Info, "
+ENTRY (U"The time domain in the Info window")
+NORMAL (U"If you select an object that is a function of time and click #Info, "
 	"the Info window will tell you the start time, the end time, and the total duration (among other properties of the object).")
-ENTRY (L"Time domain query commands")
-NORMAL (L"If you select an object that is a function of time, "
+ENTRY (U"Time domain query commands")
+NORMAL (U"If you select an object that is a function of time, "
 	"the following three commands will become available in the #Query menu:")
-LIST_ITEM (L"##Get start time")
-LIST_ITEM (L"##Get end time")
-LIST_ITEM (L"##Get total duration")
-NORMAL (L"If you choose one of these commands, the Info window will tell you the result, "
+LIST_ITEM (U"##Get start time")
+LIST_ITEM (U"##Get end time")
+LIST_ITEM (U"##Get total duration")
+NORMAL (U"If you choose one of these commands, the Info window will tell you the result, "
 	"expressed in seconds. These commands are most useful in a Praat script. Example:")
-CODE (L"selectObject: \"Pitch hello\"")
-CODE (L"startTime = Get start time")
-CODE (L"endTime = Get end time")
-CODE (L"centreTime = (startTime + endTime) / 2")
-CODE (L"writeInfoLine: \"This Pitch runs from \", startTime, \" to \", endTime, \" seconds,\"")
-CODE (L"appendInfoLine: \"and the centre of its time domain is at \", centreTime, \" seconds.\"")
-ENTRY (L"Details for hackers")
-NORMAL (L"If you select an object that is a function of time and you click @Inspect, "
+CODE (U"selectObject: \"Pitch hello\"")
+CODE (U"startTime = Get start time")
+CODE (U"endTime = Get end time")
+CODE (U"centreTime = (startTime + endTime) / 2")
+CODE (U"writeInfoLine: \"This Pitch runs from \", startTime, \" to \", endTime, \" seconds,\"")
+CODE (U"appendInfoLine: \"and the centre of its time domain is at \", centreTime, \" seconds.\"")
+ENTRY (U"Details for hackers")
+NORMAL (U"If you select an object that is a function of time and you click @Inspect, "
 	"you can see how the time domain information is stored in the object: "
 	"the start time is the object's #xmin attribute and the end time is its #xmax attribute. "
 	"The total duration is not stored in the object, "
 	"because it can easily be computed as #xmax minus #xmin.")
 MAN_END
 
-MAN_BEGIN (L"time selection", L"ppgb", 20050924)
-INTRO (L"The ways to select a part of the time domain in some @editors in Praat, "
+MAN_BEGIN (U"time selection", U"ppgb", 20050924)
+INTRO (U"The ways to select a part of the time domain in some @editors in Praat, "
 	"namely those that contain a function of time.")
-NORMAL (L"The ##time selection# is used for selecting the time interval that will be played, "
+NORMAL (U"The ##time selection# is used for selecting the time interval that will be played, "
 	"copied, cut, modified, or questioned:")
-ENTRY (L"1. How to make a selection")
-NORMAL (L"The easiest way is to @drag the mouse across the part that you want to select. "
+ENTRY (U"1. How to make a selection")
+NORMAL (U"The easiest way is to @drag the mouse across the part that you want to select. "
 	"This is analogous to how selection works in a text processor.")
-ENTRY (L"2. How to extend or shrink a selection")
-NORMAL (L"The easiest way is to click with the Shift key pressed. "
+ENTRY (U"2. How to extend or shrink a selection")
+NORMAL (U"The easiest way is to click with the Shift key pressed. "
 	"The nearest edge of the selection will move to the time position where you clicked. "
 	"This is analogous to how extending a selection works in a text processor.")
-NORMAL (L"For instance, if the currently selected time interval runs from 2 to 5 seconds, "
+NORMAL (U"For instance, if the currently selected time interval runs from 2 to 5 seconds, "
 	"and you shift-click at a time position of 4 seconds, the end of the selection will move "
 	"from 5 to 4 seconds, thus shrinking the selection.")
-NORMAL (L"You can also shift-drag, i.e. hold the Shift key and the mouse button down while moving the mouse.")
-ENTRY (L"3. Other tricks")
-NORMAL (L"To select a specific time stretch or collapse the selection to its start or end, use the Select menu.")
+NORMAL (U"You can also shift-drag, i.e. hold the Shift key and the mouse button down while moving the mouse.")
+ENTRY (U"3. Other tricks")
+NORMAL (U"To select a specific time stretch or collapse the selection to its start or end, use the Select menu.")
 MAN_END
 
-MAN_BEGIN (L"total duration", L"ppgb", 20040505)
-INTRO (L"- the extent of the @@time domain@ (see there).")
+MAN_BEGIN (U"total duration", U"ppgb", 20040505)
+INTRO (U"- the extent of the @@time domain@ (see there).")
 MAN_END
 
-MAN_BEGIN (L"vector peak interpolation", L"ppgb", 20010410)
-INTRO (L"An algorithm for finding a maximum or a minimum in a sampled signal.")
-ENTRY (L"Overview")
-NORMAL (L"The signal is described with the sequence %y__%i_, %i = 1...%n, where %n is the number of samples. "
+MAN_BEGIN (U"vector peak interpolation", U"ppgb", 20010410)
+INTRO (U"An algorithm for finding a maximum or a minimum in a sampled signal.")
+ENTRY (U"Overview")
+NORMAL (U"The signal is described with the sequence %y__%i_, %i = 1...%n, where %n is the number of samples. "
 	"Each sample %i is associated with an %x value (typically, time) given by %x__%i_ = %x__1_ + (%i - 1) %dx, "
 	"where %dx is the sample period.")
-NORMAL (L"The maximum is looked for in two kinds of locations:")
-LIST_ITEM (L"1. At the left and right edge, i.e. at %i = 1 and at %i = %n.")
-LIST_ITEM (L"2. At or %near all local maxima, i.e. at or %near those %i that satisfy %y__%i-1_ < %y__%i_ ≤ %y__%i+1_.")
-NORMAL (L"The greatest of the following values, therefore, will be the maximum:")
-LIST_ITEM (L"1. %y__1_.")
-LIST_ITEM (L"2. The local maxima, which are at or %near %y__%i_, where %y__%i-1_ < %y__%i_ ≤ %y__%i+1_.")
-LIST_ITEM (L"3. %y__%n_.")
-NORMAL (L"We will now see what %near means. The precision of the result depends on the %%interpolation method% of this algorithm.")
-ENTRY (L"1. Lowest precision: round to sample")
-NORMAL (L"If the interpolation method is None, the local maxima are %at the samples %m that satisfy %y__%m-1_ < %y__%m_ ≤ %y__%m+1_. "
+NORMAL (U"The maximum is looked for in two kinds of locations:")
+LIST_ITEM (U"1. At the left and right edge, i.e. at %i = 1 and at %i = %n.")
+LIST_ITEM (U"2. At or %near all local maxima, i.e. at or %near those %i that satisfy %y__%i-1_ < %y__%i_ ≤ %y__%i+1_.")
+NORMAL (U"The greatest of the following values, therefore, will be the maximum:")
+LIST_ITEM (U"1. %y__1_.")
+LIST_ITEM (U"2. The local maxima, which are at or %near %y__%i_, where %y__%i-1_ < %y__%i_ ≤ %y__%i+1_.")
+LIST_ITEM (U"3. %y__%n_.")
+NORMAL (U"We will now see what %near means. The precision of the result depends on the %%interpolation method% of this algorithm.")
+ENTRY (U"1. Lowest precision: round to sample")
+NORMAL (U"If the interpolation method is None, the local maxima are %at the samples %m that satisfy %y__%m-1_ < %y__%m_ ≤ %y__%m+1_. "
 	"Thus, their %x values are at %x__%m_ = %x__1_ + (%m - 1) %dx, and their %y values are %y__%m_.")
-NORMAL (L"This kind of precision is appropriate for an unordered sequence of values %y__%i_: the result is simply the greatest available value.")
-ENTRY (L"2. Middle precision: parabolic interpolation")
-NORMAL (L"If the interpolation method is Parabolic, the algorithm uses one point on each side of every local maximum %y__%m_ "
+NORMAL (U"This kind of precision is appropriate for an unordered sequence of values %y__%i_: the result is simply the greatest available value.")
+ENTRY (U"2. Middle precision: parabolic interpolation")
+NORMAL (U"If the interpolation method is Parabolic, the algorithm uses one point on each side of every local maximum %y__%m_ "
 	"to estimate the location and value of the local maximum. Because a Taylor expansion shows that any smooth curve "
 	"can be approximated as a parabola in the vicinity of any local maximum, the location %x__%max_ and value %y__%max_ can be found "
 	"with the following procedure:")
-FORMULA (L"%dy ≡ 1/2 (%y__%m+1_ - %y__%m-1_)")
-FORMULA (L"%d^2%y ≡ 2 %y__%m_ - %y__%m-1_ - %y__%m+1_")
-FORMULA (L"%m′ ≡ %m + %dy/%d^2%y")
-FORMULA (L"%x__%max_ = %x__1_ + (%m′ - 1) %dx")
-FORMULA (L"%y__%max_ = %y__%m_ + 1/2 %dy^2 / %d^2%y")
-NORMAL (L"This kind of precision is appropriate if %y is considered a smooth function of %x, as in:")
-LIST_ITEM (L"@@Formant: Get minimum...")
-LIST_ITEM (L"@@Formant: Get time of minimum...")
-LIST_ITEM (L"@@Formant: Get maximum...")
-LIST_ITEM (L"@@Formant: Get time of maximum...")
-LIST_ITEM (L"@@Intensity: Get minimum...")
-LIST_ITEM (L"@@Intensity: Get time of minimum...")
-LIST_ITEM (L"@@Intensity: Get maximum...")
-LIST_ITEM (L"@@Intensity: Get time of maximum...")
-ENTRY (L"3. Higher precision: cubic interpolation")
-NORMAL (L"If the interpolation method is Cubic, the interpolation is performed over four points (see @@vector value interpolation@). "
+FORMULA (U"%dy ≡ 1/2 (%y__%m+1_ - %y__%m-1_)")
+FORMULA (U"%d^2%y ≡ 2 %y__%m_ - %y__%m-1_ - %y__%m+1_")
+FORMULA (U"%m′ ≡ %m + %dy/%d^2%y")
+FORMULA (U"%x__%max_ = %x__1_ + (%m′ - 1) %dx")
+FORMULA (U"%y__%max_ = %y__%m_ + 1/2 %dy^2 / %d^2%y")
+NORMAL (U"This kind of precision is appropriate if %y is considered a smooth function of %x, as in:")
+LIST_ITEM (U"@@Formant: Get minimum...")
+LIST_ITEM (U"@@Formant: Get time of minimum...")
+LIST_ITEM (U"@@Formant: Get maximum...")
+LIST_ITEM (U"@@Formant: Get time of maximum...")
+LIST_ITEM (U"@@Intensity: Get minimum...")
+LIST_ITEM (U"@@Intensity: Get time of minimum...")
+LIST_ITEM (U"@@Intensity: Get maximum...")
+LIST_ITEM (U"@@Intensity: Get time of maximum...")
+ENTRY (U"3. Higher precision: cubic interpolation")
+NORMAL (U"If the interpolation method is Cubic, the interpolation is performed over four points (see @@vector value interpolation@). "
 	"The results are similar to those of the parabolic interpolation method, but you can use it (or sinc interpolation) if you want the result of a "
 	"command like ##Get maximum...# to be equal to the result of a sequence of commands like "
 	"##Get time of maximum...# and ##Get value at time...#.")
-ENTRY (L"4. Highest precision: sinc interpolation")
-NORMAL (L"If the interpolation method is Sinc70 or Sinc700, the algorithm assumes that the signal "
+ENTRY (U"4. Highest precision: sinc interpolation")
+NORMAL (U"If the interpolation method is Sinc70 or Sinc700, the algorithm assumes that the signal "
 	"is a sum of sinc functions, so that a number of points (namely, 70 or 700) on each side of the initial guess %m must be taken into account "
 	"(see @@vector value interpolation@). The algorithm finds the maximum of this continuous function by Brent's method (see @@Press et al. (1992)@).")
-NORMAL (L"This method is appropriate for signals that result from sampling a continuous signal after it has been low-pass filtered "
+NORMAL (U"This method is appropriate for signals that result from sampling a continuous signal after it has been low-pass filtered "
 	"at the @@Nyquist frequency at . See:")
-LIST_ITEM (L"@@Sound: Get minimum...")
-LIST_ITEM (L"@@Sound: Get time of minimum...")
-LIST_ITEM (L"@@Sound: Get maximum...")
-LIST_ITEM (L"@@Sound: Get time of maximum...")
-LIST_ITEM (L"@@Sound: Get absolute extremum...")
+LIST_ITEM (U"@@Sound: Get minimum...")
+LIST_ITEM (U"@@Sound: Get time of minimum...")
+LIST_ITEM (U"@@Sound: Get maximum...")
+LIST_ITEM (U"@@Sound: Get time of maximum...")
+LIST_ITEM (U"@@Sound: Get absolute extremum...")
 MAN_END
 
-MAN_BEGIN (L"vector value interpolation", L"ppgb", 19980104)
-INTRO (L"An algorithm for estimating the value of a sampled signal at a specified location.")
-ENTRY (L"Overview")
-NORMAL (L"The signal is described with the sequence %y__%i_, %i = 1...%n, where %n is the number of samples. "
+MAN_BEGIN (U"vector value interpolation", U"ppgb", 19980104)
+INTRO (U"An algorithm for estimating the value of a sampled signal at a specified location.")
+ENTRY (U"Overview")
+NORMAL (U"The signal is described with the sequence %y__%i_, %i = 1...%n, where %n is the number of samples. "
 	"Each sample %i is associated with an %x location (typically, time) given by %x__%i_ = %x__1_ + (%i - 1) %dx, "
 	"where %dx is the sample period, so that the real-valued sample number associated with a given time %x is")
-FORMULA (L"%s = (%x - %x__1_) / %dx + 1")
-NORMAL (L"If the resulting %s is an integer number, the %y value must be %y__%s_. Otherwise, the estimated %y value %y(%s) must be interpolated "
+FORMULA (U"%s = (%x - %x__1_) / %dx + 1")
+NORMAL (U"If the resulting %s is an integer number, the %y value must be %y__%s_. Otherwise, the estimated %y value %y(%s) must be interpolated "
 	"from nearby values of %y. The precision of the result depends on the %%interpolation method% of this algorithm.")
-ENTRY (L"1. Lowest precision: round to sample")
-NORMAL (L"If the interpolation method is Nearest, we take the value of the nearest point:")
-FORMULA (L"%near ≡ round (%s)")
-FORMULA (L"%y(%s) ≈ %y__%near_")
-ENTRY (L"2. Middle precision: linear interpolation")
-NORMAL (L"If you know or assume that the function that underlies your points is continuous, the \"rounding\" interpolation would be poor, "
+ENTRY (U"1. Lowest precision: round to sample")
+NORMAL (U"If the interpolation method is Nearest, we take the value of the nearest point:")
+FORMULA (U"%near ≡ round (%s)")
+FORMULA (U"%y(%s) ≈ %y__%near_")
+ENTRY (U"2. Middle precision: linear interpolation")
+NORMAL (U"If you know or assume that the function that underlies your points is continuous, the \"rounding\" interpolation would be poor, "
 	"because the rounded value would abruptly change at the centres between the sample points.")
-NORMAL (L"For a linear interpolation, therefore, we use the attested values on both sides (%left and %right) of %s:")
-FORMULA (L"%s__%l_ ≡ floor (%s) ;   %s__%r_ ≡ %s__%l_ + 1")
-FORMULA (L"%y(%s) ≈ %y__%l_ + (%s - %s__%l_) · (%y__%r_ - %y__%l_)")
-NORMAL (L"where #floor (%x) computes the greatest integer not greater than %x. This interpolation is continuous.")
-ENTRY (L"3. Higher precision: cubic interpolation")
-NORMAL (L"If you know or assume that the function that underlies your points is %smooth, i.e. its derivative is defined for every %x, "
+NORMAL (U"For a linear interpolation, therefore, we use the attested values on both sides (%left and %right) of %s:")
+FORMULA (U"%s__%l_ ≡ floor (%s) ;   %s__%r_ ≡ %s__%l_ + 1")
+FORMULA (U"%y(%s) ≈ %y__%l_ + (%s - %s__%l_) · (%y__%r_ - %y__%l_)")
+NORMAL (U"where #floor (%x) computes the greatest integer not greater than %x. This interpolation is continuous.")
+ENTRY (U"3. Higher precision: cubic interpolation")
+NORMAL (U"If you know or assume that the function that underlies your points is %smooth, i.e. its derivative is defined for every %x, "
 	"linear interpolation would probably be poor, because the derivative of the interpolated function would abruptly change at every "
 	"sample point.")
-NORMAL (L"The next higher interpolation (Cubic), therefore, is differentiable at sample points. To enforce this, we define the "
+NORMAL (U"The next higher interpolation (Cubic), therefore, is differentiable at sample points. To enforce this, we define the "
 	"derivatives %y′__%l_ and %y′__%r_ at the left and right sample points on the basis of %their immediate neighbours "
 	"(i.e., the algorithm needs four sample points), perhaps by a parabolic interpolation through these three points. "
 	"A parabolic interpolation has the advantage that the extrema will be computed correctly if "
 	"the underlying function can be approximated by a parabola near its extremes (see @@vector peak interpolation@).")
-NORMAL (L"Because the derivative of a parabolic function is a linear function of %x, "
+NORMAL (U"Because the derivative of a parabolic function is a linear function of %x, "
 	"the derivatives at the left and right sample points are simply estimated as")
-FORMULA (L"%y′__%l_ ≈ (%y__%r_ - %y__%l-1_) / 2 ;   %y′__%r_ ≈ (%y__%r+1_ - %y__%l_) / 2")
-NORMAL (L"Now that we know %y__%l_, %y__%r_, %y′__%l_, and %y′__%r_, we can fit these values with a "
+FORMULA (U"%y′__%l_ ≈ (%y__%r_ - %y__%l-1_) / 2 ;   %y′__%r_ ≈ (%y__%r+1_ - %y__%l_) / 2")
+NORMAL (U"Now that we know %y__%l_, %y__%r_, %y′__%l_, and %y′__%r_, we can fit these values with a "
 	"third-degree (%cubic) polynomial:")
-FORMULA (L"%As__%l_^3 + %Bs__%l_^2 + %Cs__%l_ + %D = %y__%l_")
-FORMULA (L"%As__%r_^3 + %Bs__%r_^2 + %Cs__%r_ + %D = %y__%r_")
-FORMULA (L"3%As__%l_^2 + 2%Bs__%l_ + %C = %y′__%l_")
-FORMULA (L"3%As__%r_^2 + 2%Bs__%r_ + %C = %y′__%r_")
-NORMAL (L"If we shift the %x axis to the left sample point, we can reduce the four equations to")
-FORMULA (L"%D = %y__%l_")
-FORMULA (L"%A + %B + %C + %D = %y__%r_")
-FORMULA (L"%C = %y′__%l_")
-FORMULA (L"3%A + 2%B + %C = %y′__%r_")
-NORMAL (L"so that the interpolated value %y(%s) at any point %s between %s__%l_ and %s__%r_ is estimated as")
-FORMULA (L"(%y′__%r_ + %y′__%l_ - 2%y__%r_ + 2%y__%l_) %φ__%l_^3 + "
+FORMULA (U"%As__%l_^3 + %Bs__%l_^2 + %Cs__%l_ + %D = %y__%l_")
+FORMULA (U"%As__%r_^3 + %Bs__%r_^2 + %Cs__%r_ + %D = %y__%r_")
+FORMULA (U"3%As__%l_^2 + 2%Bs__%l_ + %C = %y′__%l_")
+FORMULA (U"3%As__%r_^2 + 2%Bs__%r_ + %C = %y′__%r_")
+NORMAL (U"If we shift the %x axis to the left sample point, we can reduce the four equations to")
+FORMULA (U"%D = %y__%l_")
+FORMULA (U"%A + %B + %C + %D = %y__%r_")
+FORMULA (U"%C = %y′__%l_")
+FORMULA (U"3%A + 2%B + %C = %y′__%r_")
+NORMAL (U"so that the interpolated value %y(%s) at any point %s between %s__%l_ and %s__%r_ is estimated as")
+FORMULA (U"(%y′__%r_ + %y′__%l_ - 2%y__%r_ + 2%y__%l_) %φ__%l_^3 + "
 	"(3%y__%r_ - 3%y__%l_ - 2%y′__%l_ - %y′__%r_) %φ__%l_^2 + %y′__%l_ %φ__%l_ + %y__%l_")
-NORMAL (L"where %φ__%l_ ≡ %s - %s__%l_. Some rearrangement gives")
-FORMULA (L"%y(%s) ≈ %y__%l_ %φ__%r_ + %y__%r_ %φ__%l_ +")
-FORMULA (L"- %φ__%l_ %φ__%r_ [1/2 (%y′__%r_ - %y′__%l_) + (%φ__%l_ - 1/2) "
+NORMAL (U"where %φ__%l_ ≡ %s - %s__%l_. Some rearrangement gives")
+FORMULA (U"%y(%s) ≈ %y__%l_ %φ__%r_ + %y__%r_ %φ__%l_ +")
+FORMULA (U"- %φ__%l_ %φ__%r_ [1/2 (%y′__%r_ - %y′__%l_) + (%φ__%l_ - 1/2) "
 	"(%y′__%l_ + %y′__%r_ - 2(%y__%r_ - %y__%l_))]")
-NORMAL (L"where %φ__%r_ ≡ 1 - %φ__%l_. From this formula we see:")
-LIST_ITEM (L"1. The first two terms define the linear interpolation.")
-LIST_ITEM (L"2. If the underlying function is linear, so that %y′__%l_ equals %y′__%r_ and both equal %y__%r_ - %y__%l_, "
+NORMAL (U"where %φ__%r_ ≡ 1 - %φ__%l_. From this formula we see:")
+LIST_ITEM (U"1. The first two terms define the linear interpolation.")
+LIST_ITEM (U"2. If the underlying function is linear, so that %y′__%l_ equals %y′__%r_ and both equal %y__%r_ - %y__%l_, "
 	"the higher-degree terms are zero.")
-LIST_ITEM (L"3. If %y′__%l_ + %y′__%r_ equals 2(%y__%r_ - %y__%l_), the third-degree term is zero, "
+LIST_ITEM (U"3. If %y′__%l_ + %y′__%r_ equals 2(%y__%r_ - %y__%l_), the third-degree term is zero, "
 	"so that the interpolated function is parabolic.")
-LIST_ITEM (L"4. At the left and right points, one of the %φ is 0 and the other is 1, so that at these boundary points, "
+LIST_ITEM (U"4. At the left and right points, one of the %φ is 0 and the other is 1, so that at these boundary points, "
 	"%y is computed with exact precision.")
-ENTRY (L"4. Highest precision: sinc interpolation")
-NORMAL (L"If the interpolation method is Sinc70 or Sinc700, the algorithm assumes that the signal "
+ENTRY (U"4. Highest precision: sinc interpolation")
+NORMAL (U"If the interpolation method is Sinc70 or Sinc700, the algorithm assumes that the signal "
 	"is a sum of sinc functions, so that a number of points (the %%interpolation depth%: 70 or 700) on each side of %s must be taken into account.")
-NORMAL (L"Because the interpolation depth must be finite, the sum of sinc functions is multiplied by a Hanning window:")
-FORMULA (L"%s__%l_ ≡ floor (%s);   %s__%r_ ≡ %s__%l_ + 1")
-FORMULA (L"%φ__%l_ ≡ %s - %s__%l_;   %φ__%r_ ≡ 1 - %φ__%l_")
-FORMULA (L"%y(%s) ≈ ∑__%i=1...%N_ %y__%r-%i_ sinc (%π(%φ__%l_+%i-1)) (1/2 + 1/2 cos (%π(%φ__%l_+%i-1)/(%φ__%l_+%N))) +")
-FORMULA (L"+ ∑__%i=1...%N_ %y__%l+%i_ sinc (%π(%φ__%r_+%i-1)) (1/2 + 1/2 cos (%π(%φ__%r_+%i-1)/(%φ__%r_+%N)))")
-NORMAL (L"where the sinc function is defined as")
-FORMULA (L"sinc (0) ≡ 1;   sinc (%x) ≡ sin %x / %x   for %x ≠ 0")
-NORMAL (L"If %s is less than the interpolation depth or greater than %n + 1 minus the interpolation depth, "
+NORMAL (U"Because the interpolation depth must be finite, the sum of sinc functions is multiplied by a Hanning window:")
+FORMULA (U"%s__%l_ ≡ floor (%s);   %s__%r_ ≡ %s__%l_ + 1")
+FORMULA (U"%φ__%l_ ≡ %s - %s__%l_;   %φ__%r_ ≡ 1 - %φ__%l_")
+FORMULA (U"%y(%s) ≈ ∑__%i=1...%N_ %y__%r-%i_ sinc (%π(%φ__%l_+%i-1)) (1/2 + 1/2 cos (%π(%φ__%l_+%i-1)/(%φ__%l_+%N))) +")
+FORMULA (U"+ ∑__%i=1...%N_ %y__%l+%i_ sinc (%π(%φ__%r_+%i-1)) (1/2 + 1/2 cos (%π(%φ__%r_+%i-1)/(%φ__%r_+%N)))")
+NORMAL (U"where the sinc function is defined as")
+FORMULA (U"sinc (0) ≡ 1;   sinc (%x) ≡ sin %x / %x   for %x ≠ 0")
+NORMAL (U"If %s is less than the interpolation depth or greater than %n + 1 minus the interpolation depth, "
 	"the depth is reduced accordingly.")
-NORMAL (L"This method is appropriate for signals that result from sampling a continuous signal after it has been low-pass filtered "
+NORMAL (U"This method is appropriate for signals that result from sampling a continuous signal after it has been low-pass filtered "
 	"at the @@Nyquist frequency at . See:")
-LIST_ITEM (L"@@Sound: Get value at time...")
+LIST_ITEM (U"@@Sound: Get value at time...")
 MAN_END
 
-MAN_BEGIN (L"waveform", L"ppgb", 20060914)
-INTRO (L"The waveform is the sound pressure as a function of time, or: the microphone output as a function of time. "
+MAN_BEGIN (U"waveform", U"ppgb", 20060914)
+INTRO (U"The waveform is the sound pressure as a function of time, or: the microphone output as a function of time. "
 	"In Praat, the waveform is shown in the top half of the Sound window (see the @Intro).")
 MAN_END
 }
diff --git a/fon/manual_pitch.cpp b/fon/manual_pitch.cpp
index cddb61f..f9317c2 100644
--- a/fon/manual_pitch.cpp
+++ b/fon/manual_pitch.cpp
@@ -1,6 +1,6 @@
 /* manual_pitch.cpp
  *
- * Copyright (C) 1992-2010 Paul Boersma
+ * Copyright (C) 1992-2010,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,237 +22,237 @@
 void manual_pitch_init (ManPages me);
 void manual_pitch_init (ManPages me) {
 
-MAN_BEGIN (L"Create PitchTier...", L"ppgb", 20110101)
-INTRO (L"A command in the @@New menu@ to create an empty @PitchTier object.")
-NORMAL (L"The resulting object will have the specified name and time domain, but contain no pitch points. "
+MAN_BEGIN (U"Create PitchTier...", U"ppgb", 20110101)
+INTRO (U"A command in the @@New menu@ to create an empty @PitchTier object.")
+NORMAL (U"The resulting object will have the specified name and time domain, but contain no pitch points. "
 	"To add some points to it, use @@PitchTier: Add point... at .")
-NORMAL (L"For an example, see @@Source-filter synthesis at .")
+NORMAL (U"For an example, see @@Source-filter synthesis at .")
 MAN_END
 
-MAN_BEGIN (L"Harmonicity", L"ppgb", 20030610)
-INTRO (L"One of the @@types of objects@ in Praat.")
-NORMAL (L"A Harmonicity object represents the degree of acoustic periodicity, "
+MAN_BEGIN (U"Harmonicity", U"ppgb", 20030610)
+INTRO (U"One of the @@types of objects@ in Praat.")
+NORMAL (U"A Harmonicity object represents the degree of acoustic periodicity, "
 	"also called Harmonics-to-Noise Ratio (HNR). "
 	"Harmonicity is expressed in dB: "
 	"if 99\\%  of the energy of the signal is in the periodic part, and 1\\%  is noise, "
 	"the HNR is 10*log10(99/1) = 20 dB. "
 	"A HNR of 0 dB means that there is equal energy in the harmonics and in the noise.")
-NORMAL (L"Harmonicity can be used as a measure for:")
-LIST_ITEM (L"\\bu The signal-to-noise ratio of anything that generates a periodic signal.")
-LIST_ITEM (L"\\bu Voice quality. For instance, a healthy speaker can produce a sustained [a] or [i] "
+NORMAL (U"Harmonicity can be used as a measure for:")
+LIST_ITEM (U"\\bu The signal-to-noise ratio of anything that generates a periodic signal.")
+LIST_ITEM (U"\\bu Voice quality. For instance, a healthy speaker can produce a sustained [a] or [i] "
 	"with a harmonicity of around 20 dB, and an [u] at around 40 dB; "
 	"the difference comes from the high frequencies in [a] and [i], versus low frequencies in [u], "
 	"resulting in a much higher sensitivity of HNR to jitter in [a] and [i] than in [u]. "
 	"Hoarse speakers will have an [a] with a harmonicity much lower than 20 dB. "
 	"We know of a pathological case where a speaker had an HNR of 40 dB for [i], "
 	"because his voice let down above 2000 Hz.")
-ENTRY (L"Harmonicity commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@Sound: To Harmonicity (cc)...@: cross-correlation method (preferred).")
-LIST_ITEM (L"\\bu @@Sound: To Harmonicity (ac)...@: autocorrelation method.")
+ENTRY (U"Harmonicity commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@Sound: To Harmonicity (cc)...@: cross-correlation method (preferred).")
+LIST_ITEM (U"\\bu @@Sound: To Harmonicity (ac)...@: autocorrelation method.")
 MAN_END
 
-MAN_BEGIN (L"Harmonicity: Formula...", L"ppgb", 20021206)
-INTRO (L"A command for changing the data in all selected @Harmonicity objects.")
-NORMAL (L"See the @Formulas tutorial for examples and explanations.")
+MAN_BEGIN (U"Harmonicity: Formula...", U"ppgb", 20021206)
+INTRO (U"A command for changing the data in all selected @Harmonicity objects.")
+NORMAL (U"See the @Formulas tutorial for examples and explanations.")
 MAN_END
 
-MAN_BEGIN (L"Harmonicity: Get maximum...", L"ppgb", 20030916)
-INTRO (L"A @query to the selected @Harmonicity object.")
-ENTRY (L"Return value")
-NORMAL (L"the maximum value, expressed in dB.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored. "
+MAN_BEGIN (U"Harmonicity: Get maximum...", U"ppgb", 20030916)
+INTRO (U"A @query to the selected @Harmonicity object.")
+ENTRY (U"Return value")
+NORMAL (U"the maximum value, expressed in dB.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the Harmonicity object is considered.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is Parabolic because of the usual nonlinearity (logarithm) in the computation of harmonicity; "
 	"sinc interpolation would be too stiff and may give unexpected results.")
 MAN_END
 
-MAN_BEGIN (L"Harmonicity: Get mean...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Harmonicity object.")
-ENTRY (L"Return value")
-NORMAL (L"the mean value, expressed in dB.")
-ENTRY (L"Setting")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+MAN_BEGIN (U"Harmonicity: Get mean...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Harmonicity object.")
+ENTRY (U"Return value")
+NORMAL (U"the mean value, expressed in dB.")
+ENTRY (U"Setting")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Harmonicity is considered.")
-ENTRY (L"Algorithm")
-NORMAL (L"The mean harmonicity between the times %t__1_ and %t__2_ is defined as")
-FORMULA (L"1/(%t__2_ - %t__1_)  \\in__%%t%1_^^%%t%2^ %dt %x(%t)")
-NORMAL (L"where %x(%t) is the harmonicity (in dB) as a function of time. "
+ENTRY (U"Algorithm")
+NORMAL (U"The mean harmonicity between the times %t__1_ and %t__2_ is defined as")
+FORMULA (U"1/(%t__2_ - %t__1_)  \\in__%%t%1_^^%%t%2^ %dt %x(%t)")
+NORMAL (U"where %x(%t) is the harmonicity (in dB) as a function of time. "
 	"Frames in which the value is undefined (i.e. in silent intervals) "
 	"are ignored. If all the frames are silent, the returned value is @undefined.")
 MAN_END
 
-MAN_BEGIN (L"Harmonicity: Get minimum...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Harmonicity object.")
-ENTRY (L"Return value")
-NORMAL (L"the minimum value, expressed in dB.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
+MAN_BEGIN (U"Harmonicity: Get minimum...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Harmonicity object.")
+ENTRY (U"Return value")
+NORMAL (U"the minimum value, expressed in dB.")
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Harmonicity is considered.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is Parabolic because of the usual nonlinearity (logarithm) in the computation of harmonicity; "
 	"sinc interpolation would be too stiff and may give unexpected results.")
 MAN_END
 
-MAN_BEGIN (L"Harmonicity: Get standard deviation...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Harmonicity object.")
-ENTRY (L"Return value")
-NORMAL (L"the standard deviation, expressed in dB.")
-ENTRY (L"Setting")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+MAN_BEGIN (U"Harmonicity: Get standard deviation...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Harmonicity object.")
+ENTRY (U"Return value")
+NORMAL (U"the standard deviation, expressed in dB.")
+ENTRY (U"Setting")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Harmonicity is considered.")
-ENTRY (L"Algorithm")
-NORMAL (L"The standard deviation between the times %t__1_ and %t__2_ is defined as")
-FORMULA (L"1/(%t__2_ - %t__1_)  \\in__%%t%1_^^%%t%2^ %dt (%x(%t) - %\\mu)^2")
-NORMAL (L"where %x(%t) is the harmonicity (in dB) as a function of time, and %\\mu its mean. "
+ENTRY (U"Algorithm")
+NORMAL (U"The standard deviation between the times %t__1_ and %t__2_ is defined as")
+FORMULA (U"1/(%t__2_ - %t__1_)  \\in__%%t%1_^^%%t%2^ %dt (%x(%t) - %\\mu)^2")
+NORMAL (U"where %x(%t) is the harmonicity (in dB) as a function of time, and %\\mu its mean. "
 	"For our discrete Harmonicity object, the standard deviation is approximated by")
-FORMULA (L"1/(%n-1) \\su__%i=%m..%m+%n-1_ (%x__%i_ - %\\mu)^2")
-NORMAL (L"where %n is the number of frame centres between %t__1_ and %t__2_. Note the \"minus 1\".")
+FORMULA (U"1/(%n-1) \\su__%i=%m..%m+%n-1_ (%x__%i_ - %\\mu)^2")
+NORMAL (U"where %n is the number of frame centres between %t__1_ and %t__2_. Note the \"minus 1\".")
 MAN_END
 
-MAN_BEGIN (L"Harmonicity: Get time of maximum...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Harmonicity object for the time associated with its maximum value.")
-ENTRY (L"Return value")
-NORMAL (L"the time (in seconds) associated with the maximum HNR value.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
+MAN_BEGIN (U"Harmonicity: Get time of maximum...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Harmonicity object for the time associated with its maximum value.")
+ENTRY (U"Return value")
+NORMAL (U"the time (in seconds) associated with the maximum HNR value.")
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Harmonicity is considered.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is Parabolic because of the usual nonlinearity (logarithm) in the computation of harmonicity; "
 	"sinc interpolation would be too stiff and may give unexpected results.")
 MAN_END
 
-MAN_BEGIN (L"Harmonicity: Get time of minimum...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Harmonicity object.")
-ENTRY (L"Return value")
-NORMAL (L"the time (in seconds) associated with the minimum HNR value.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
+MAN_BEGIN (U"Harmonicity: Get time of minimum...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Harmonicity object.")
+ENTRY (U"Return value")
+NORMAL (U"the time (in seconds) associated with the minimum HNR value.")
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the Harmonicity is considered.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is Parabolic because of the usual nonlinearity (logarithm) in the computation of harmonicity; "
 	"sinc interpolation would be too stiff and may give unexpected results.")
 MAN_END
 
-MAN_BEGIN (L"Harmonicity: Get value at time...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Harmonicity object to .")
-ENTRY (L"Return value")
-NORMAL (L"an estimate (in dB) of the value at a specified time. "
+MAN_BEGIN (U"Harmonicity: Get value at time...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Harmonicity object to .")
+ENTRY (U"Return value")
+NORMAL (U"an estimate (in dB) of the value at a specified time. "
 	"If this time is outside the time domain or outside the samples of the Harmonicity, the result is @undefined.")
-ENTRY (L"Settings")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which the value is to be evaluated.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method, see @@vector value interpolation at . "
+ENTRY (U"Settings")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which the value is to be evaluated.")
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method, see @@vector value interpolation at . "
 	"The standard is Cubic because of the usual nonlinearity (logarithm) in the computation of harmonicity; "
 	"sinc interpolation would be too stiff and may give unexpected results.")
 MAN_END
 
-MAN_BEGIN (L"Harmonicity: Get value in frame...", L"ppgb", 20041107)
-INTRO (L"A @query to the selected @Harmonicity object.")
-ENTRY (L"Return value")
-NORMAL (L"the value in a specified frame, expressed in dB. "
+MAN_BEGIN (U"Harmonicity: Get value in frame...", U"ppgb", 20041107)
+INTRO (U"A @query to the selected @Harmonicity object.")
+ENTRY (U"Return value")
+NORMAL (U"the value in a specified frame, expressed in dB. "
 	"If the index is less than 1 or greater than the number of frames, the result is @undefined.")
-ENTRY (L"Setting")
-TAG (L"##Frame number")
-DEFINITION (L"the frame whose value is to be looked up.")
+ENTRY (U"Setting")
+TAG (U"##Frame number")
+DEFINITION (U"the frame whose value is to be looked up.")
 MAN_END
 
-MAN_BEGIN (L"Pitch", L"ppgb", 20101230)
-INTRO (L"One of the @@types of objects@ in Praat. For tutorial information, see @@Intro 4. Pitch analysis at .")
-NORMAL (L"A Pitch object represents periodicity candidates as a function of time. "
+MAN_BEGIN (U"Pitch", U"ppgb", 20101230)
+INTRO (U"One of the @@types of objects@ in Praat. For tutorial information, see @@Intro 4. Pitch analysis at .")
+NORMAL (U"A Pitch object represents periodicity candidates as a function of time. "
 	"It does not mind whether this periodicity refers to acoustics, "
 	"perception, or vocal-cord vibration. "
 	"It is sampled into a number of %frames centred around equally spaced times.")
-ENTRY (L"Pitch commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@Sound: To Pitch...@: preferred method (autocorrelation).")
-LIST_ITEM (L"\\bu @@Sound: To Pitch (ac)...@: autocorrelation method (all parameters).")
-LIST_ITEM (L"\\bu @@Sound: To Pitch (cc)...@: cross-correlation method.")
-NORMAL (L"Drawing:")
-LIST_ITEM (L"\\bu @@Pitch: Draw...@")
-NORMAL (L"Viewing and editing:")
-LIST_ITEM (L"\\bu @PitchEditor")
-NORMAL (L"Synthesis:")
-LIST_ITEM (L"\\bu @@Pitch: To PointProcess@: create points in voiced intervals.")
-LIST_ITEM (L"\\bu @@Sound & Pitch: To PointProcess (cc)@: near locations of high amplitude.")
-LIST_ITEM (L"\\bu @@Sound & Pitch: To PointProcess (peaks)...@: near locations of high amplitude.")
-NORMAL (L"Conversion:")
-LIST_ITEM (L"\\bu @@Pitch: To PitchTier@: time-stamp voiced intervals.")
-LIST_ITEM (L"\\bu @@Pitch & PointProcess: To PitchTier...@: interpolate values at specified times.")
-ENTRY (L"Inside a Pitch object")
-NORMAL (L"With @Inspect, you will see the following attributes:")
-TAG (L"%x__%min_")
-DEFINITION (L"start time, in seconds.")
-TAG (L"%x__%max_")
-DEFINITION (L"end time, in seconds.")
-TAG (L"%n__%x_")
-DEFINITION (L"the number of frames (\\>_ 1).")
-TAG (L"%dx")
-DEFINITION (L"time step = frame length = frame duration, in seconds.")
-TAG (L"%x__1_")
-DEFINITION (L"the time associated with the first frame, in seconds. "
+ENTRY (U"Pitch commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@Sound: To Pitch...@: preferred method (autocorrelation).")
+LIST_ITEM (U"\\bu @@Sound: To Pitch (ac)...@: autocorrelation method (all parameters).")
+LIST_ITEM (U"\\bu @@Sound: To Pitch (cc)...@: cross-correlation method.")
+NORMAL (U"Drawing:")
+LIST_ITEM (U"\\bu @@Pitch: Draw...@")
+NORMAL (U"Viewing and editing:")
+LIST_ITEM (U"\\bu @PitchEditor")
+NORMAL (U"Synthesis:")
+LIST_ITEM (U"\\bu @@Pitch: To PointProcess@: create points in voiced intervals.")
+LIST_ITEM (U"\\bu @@Sound & Pitch: To PointProcess (cc)@: near locations of high amplitude.")
+LIST_ITEM (U"\\bu @@Sound & Pitch: To PointProcess (peaks)...@: near locations of high amplitude.")
+NORMAL (U"Conversion:")
+LIST_ITEM (U"\\bu @@Pitch: To PitchTier@: time-stamp voiced intervals.")
+LIST_ITEM (U"\\bu @@Pitch & PointProcess: To PitchTier...@: interpolate values at specified times.")
+ENTRY (U"Inside a Pitch object")
+NORMAL (U"With @Inspect, you will see the following attributes:")
+TAG (U"%x__%min_")
+DEFINITION (U"start time, in seconds.")
+TAG (U"%x__%max_")
+DEFINITION (U"end time, in seconds.")
+TAG (U"%n__%x_")
+DEFINITION (U"the number of frames (\\>_ 1).")
+TAG (U"%dx")
+DEFINITION (U"time step = frame length = frame duration, in seconds.")
+TAG (U"%x__1_")
+DEFINITION (U"the time associated with the first frame, in seconds. "
 	"This will usually be in the range [%xmin, %xmax]. "
 	"The time associated with the last frame (i.e., %x__1_ + (%n__%x_ \\-- 1) %dx)) "
 	"will also usually be in that range.")
-TAG (L"%ceiling")
-DEFINITION (L"a frequency above which a candidate is considered voiceless.")
-TAG (L"%frame__%i_, %i = 1 ... %n__%x_")
-DEFINITION (L"the frames (see below).")
-ENTRY (L"Attributes of a pitch frame")
-NORMAL (L"Each frame contains the following attributes:")
-TAG (L"%nCandidates")
-DEFINITION (L"the number of candidates in this frame (at least one: the `unvoiced' candidate).")
-TAG (L"%candidate__%j_, %j = 1 ... %nCandidates")
-DEFINITION (L"the information about each candidate (see below).")
-ENTRY (L"Attributes of each candidate")
-NORMAL (L"Each candidate contains the following attributes:")
-TAG (L"%frequency")
-DEFINITION (L"the candidate's frequency in Hz (for a voiced candidate), or 0 (for an unvoiced candidate).")
-TAG (L"%strength")
-DEFINITION (L"the degree of periodicity of this candidate (between 0 and 1).")
-ENTRY (L"Interpretation")
-NORMAL (L"The current pitch contour is determined by the path through all first candidates. "
+TAG (U"%ceiling")
+DEFINITION (U"a frequency above which a candidate is considered voiceless.")
+TAG (U"%frame__%i_, %i = 1 ... %n__%x_")
+DEFINITION (U"the frames (see below).")
+ENTRY (U"Attributes of a pitch frame")
+NORMAL (U"Each frame contains the following attributes:")
+TAG (U"%nCandidates")
+DEFINITION (U"the number of candidates in this frame (at least one: the `unvoiced' candidate).")
+TAG (U"%candidate__%j_, %j = 1 ... %nCandidates")
+DEFINITION (U"the information about each candidate (see below).")
+ENTRY (U"Attributes of each candidate")
+NORMAL (U"Each candidate contains the following attributes:")
+TAG (U"%frequency")
+DEFINITION (U"the candidate's frequency in Hz (for a voiced candidate), or 0 (for an unvoiced candidate).")
+TAG (U"%strength")
+DEFINITION (U"the degree of periodicity of this candidate (between 0 and 1).")
+ENTRY (U"Interpretation")
+NORMAL (U"The current pitch contour is determined by the path through all first candidates. "
 	"If the first candidate of a certain frame has a frequency of 0, "
 	"or a frequency above %ceiling, this frame is considered voiceless.")
 MAN_END
 
-MAN_BEGIN (L"Pitch: Draw...", L"ppgb", 19960910)
-INTRO (L"A command for drawing the selected @Pitch objects into the @@Picture window at .")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (seconds)")
-DEFINITION (L"the time domain along the horizontal axis. "
+MAN_BEGIN (U"Pitch: Draw...", U"ppgb", 19960910)
+INTRO (U"A command for drawing the selected @Pitch objects into the @@Picture window at .")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (seconds)")
+DEFINITION (U"the time domain along the horizontal axis. "
 	"If these are both zero, the time domain of the #Pitch itself is taken (autowindowing).")
-TAG (L"##Minimum frequency (Hz)")
-TAG (L"##Maximum frequency (Hz)")
-DEFINITION (L"the frequency range along the vertical axis. "
+TAG (U"##Minimum frequency (Hz)")
+TAG (U"##Maximum frequency (Hz)")
+DEFINITION (U"the frequency range along the vertical axis. "
 	"##Maximum frequency# must be greater than ##Minimum frequency#.")
-ENTRY (L"Behaviour")
-NORMAL (L"In unvoiced frames, nothing will be drawn.")
-NORMAL (L"In voiced frames, the pitch frequency associated with the frame "
+ENTRY (U"Behaviour")
+NORMAL (U"In unvoiced frames, nothing will be drawn.")
+NORMAL (U"In voiced frames, the pitch frequency associated with the frame "
 	"is thought to represent the time midpoint of the frame, "
 	"but frequencies will be drawn at all time points in the frame, as follows:")
-LIST_ITEM (L"\\bu If two adjacent frames are both voiced, the frequency of the time points between the midpoints "
+LIST_ITEM (U"\\bu If two adjacent frames are both voiced, the frequency of the time points between the midpoints "
 	"of the frames is linearly interpolated from both midpoints.")
-LIST_ITEM (L"\\bu If a voiced frame is adjacent to another voiced frame on one side, "
+LIST_ITEM (U"\\bu If a voiced frame is adjacent to another voiced frame on one side, "
 	"and to a voiceless frame on the other side, "
 	"the frequencies in the half-frame on the unvoiced side will be linearly extrapolated "
 	"from the midpoints of the two voiced frames involved.")
-LIST_ITEM (L"\\bu If a voiced frame is adjacent to two unvoiced frames, "
+LIST_ITEM (U"\\bu If a voiced frame is adjacent to two unvoiced frames, "
 	"a horizontal line segment will be drawn at the frequency of the midpoint.")
 MAN_END
 
@@ -264,8 +264,8 @@ while F0beg = undefined
 endwhile
 */
 
-MAN_BEGIN (L"Pitch: Interpolate", L"ppgb", 19990811)
-INTRO (L"A command that converts every selected @Pitch object.")
+MAN_BEGIN (U"Pitch: Interpolate", U"ppgb", 19990811)
+INTRO (U"A command that converts every selected @Pitch object.")
 /*
 	myID = selected ("Pitch")
 	tmin = Get start time
@@ -316,93 +316,93 @@ INTRO (L"A command that converts every selected @Pitch object.")
 */
 MAN_END
 
-MAN_BEGIN (L"Pitch: Smooth...", L"ppgb", 19990811)
-INTRO (L"A command that converts every selected @Pitch object.")
+MAN_BEGIN (U"Pitch: Smooth...", U"ppgb", 19990811)
+INTRO (U"A command that converts every selected @Pitch object.")
 MAN_END
 
-MAN_BEGIN (L"Pitch: To PitchTier", L"ppgb", 19960915)
-INTRO (L"A command that converts a @Pitch object into a @PitchTier object.")
-ENTRY (L"Algorithm")
-NORMAL (L"The #PitchTier object will contain as many points as there were voiced frames in the #Pitch.")
-NORMAL (L"The %time of each point is the time associated with the centre of the corresponding %frame "
+MAN_BEGIN (U"Pitch: To PitchTier", U"ppgb", 19960915)
+INTRO (U"A command that converts a @Pitch object into a @PitchTier object.")
+ENTRY (U"Algorithm")
+NORMAL (U"The #PitchTier object will contain as many points as there were voiced frames in the #Pitch.")
+NORMAL (U"The %time of each point is the time associated with the centre of the corresponding %frame "
 	"of the #Pitch contour. The %frequency of the point is the pitch frequency associated in this frame "
 	"with the current path through the candidates.")
 MAN_END
 
-MAN_BEGIN (L"Pitch: To PointProcess", L"ppgb", 19960917)
-INTRO (L"A command that uses a @Pitch object to generate a @PointProcess.")
-ENTRY (L"Purpose")
-NORMAL (L"to interpret an acoustic periodicity contour as the frequency of an underlying point process "
+MAN_BEGIN (U"Pitch: To PointProcess", U"ppgb", 19960917)
+INTRO (U"A command that uses a @Pitch object to generate a @PointProcess.")
+ENTRY (U"Purpose")
+NORMAL (U"to interpret an acoustic periodicity contour as the frequency of an underlying point process "
 	"(such as the sequence of glottal closures in vocal-fold vibration).")
-ENTRY (L"Algorithm")
-LIST_ITEM (L"1. A @PitchTier is created with @@Pitch: To PitchTier at .")
-LIST_ITEM (L"2. The algorithm of @@PitchTier: To PointProcess@ generates points along the entire time domain "
+ENTRY (U"Algorithm")
+LIST_ITEM (U"1. A @PitchTier is created with @@Pitch: To PitchTier at .")
+LIST_ITEM (U"2. The algorithm of @@PitchTier: To PointProcess@ generates points along the entire time domain "
 	"of the PitchTier.")
-LIST_ITEM (L"3. The PitchTier is removed (it never appeared in the List of Objects).")
-LIST_ITEM (L"4. The voiced/unvoiced information in the Pitch is used to remove all points "
+LIST_ITEM (U"3. The PitchTier is removed (it never appeared in the List of Objects).")
+LIST_ITEM (U"4. The voiced/unvoiced information in the Pitch is used to remove all points "
 	"that lie within voiceless frames.")
 MAN_END
 
-MAN_BEGIN (L"Pitch & PointProcess: To PitchTier...", L"ppgb", 20101230)
-INTRO (L"A command that creates a @PitchTier object from one selected @Pitch and one selected @PointProcess object.")
-ENTRY (L"Purpose")
-NORMAL (L"to return the frequencies in the Pitch contour at the times specified by the PointProcess.")
-ENTRY (L"Setting")
-TAG (L"##Check voicing# (standard: on)")
-DEFINITION (L"determines whether, if the time of a mark is not within a voiced frame, you will get a message like "
+MAN_BEGIN (U"Pitch & PointProcess: To PitchTier...", U"ppgb", 20101230)
+INTRO (U"A command that creates a @PitchTier object from one selected @Pitch and one selected @PointProcess object.")
+ENTRY (U"Purpose")
+NORMAL (U"to return the frequencies in the Pitch contour at the times specified by the PointProcess.")
+ENTRY (U"Setting")
+TAG (U"##Check voicing# (standard: on)")
+DEFINITION (U"determines whether, if the time of a mark is not within a voiced frame, you will get a message like "
 	"\"No periodicity at time %xxx.\", and no PitchTier is created. If this button is off, "
 	"the resulting pitch frequency will be 0.0 Hz.")
-ENTRY (L"Normal behaviour")
-NORMAL (L"For all the times in the PointProcess, a pitch frequency is computed from the "
+ENTRY (U"Normal behaviour")
+NORMAL (U"For all the times in the PointProcess, a pitch frequency is computed from the "
 	"information in the Pitch, by linear interpolation.")
-NORMAL (L"All the resulting time-frequency pairs are put in a new PitchTier object.")
-NORMAL (L"The time domain of the resulting PitchTier is a union of the domains of the original Pitch "
+NORMAL (U"All the resulting time-frequency pairs are put in a new PitchTier object.")
+NORMAL (U"The time domain of the resulting PitchTier is a union of the domains of the original Pitch "
 	"and PointProcess functions.")
 MAN_END
 
-MAN_BEGIN (L"PitchEditor", L"ppgb", 20110808)
-INTRO (L"One of the @Editors in Praat, for viewing and modifying a @Pitch object.")
-ENTRY (L"What the Pitch editor shows")
-NORMAL (L"In the window of the PitchEditor, you will see the following features:")
-LIST_ITEM (L"\\bu Digits between 0 and 9 scattered all over the drawing area. Their locations represent "
+MAN_BEGIN (U"PitchEditor", U"ppgb", 20110808)
+INTRO (U"One of the @Editors in Praat, for viewing and modifying a @Pitch object.")
+ENTRY (U"What the Pitch editor shows")
+NORMAL (U"In the window of the PitchEditor, you will see the following features:")
+LIST_ITEM (U"\\bu Digits between 0 and 9 scattered all over the drawing area. Their locations represent "
 	"the pitch %#candidates, of which there are several for every time frame. The digits themselves "
 	"represent the goodness of a candidate, multiplied by ten. For instance, if you see a \"9\" "
 	"at the location (1.23 seconds, 189 hertz), this means that in the time frame at 1.23 seconds, "
 	"there is a pitch candidate with a value of 189 hertz, and its goodness is 0.9. "
 	"The number 0.9 may be the relative height of an autocorrelation peak, a cross-correlation peak, "
 	"or a spectral peak, depending on the method by which the Pitch object was computed.")
-LIST_ITEM (L"\\bu A %#path of red disks. These disks represent the best path through the candidates, "
+LIST_ITEM (U"\\bu A %#path of red disks. These disks represent the best path through the candidates, "
 	"i.e. our best guess at what the pitch contour is. The path will usually have been determined "
 	"by the %%path finder%, which was called by the pitch-extraction algorithm, and you can change "
 	"the path manually. The path finder takes into account the goodness of each candidate, "
 	"the intensity of the sound in the frame, voiced-unvoiced transitions, and frequency jumps. "
 	"It also determines whether each frame is voiced or unvoiced.")
-LIST_ITEM (L"\\bu A %%##voicelessness bar%# at the bottom of the drawing area. If there is no suitable "
+LIST_ITEM (U"\\bu A %%##voicelessness bar%# at the bottom of the drawing area. If there is no suitable "
 	"pitch candidate in a frame, the frame is considered voiceless, which is shown as a blue rectangle "
 	"in the voicelessness bar.")
-LIST_ITEM (L"\\bu A line of digits between 0 and 9 along the top. These represent the relative intensity "
+LIST_ITEM (U"\\bu A line of digits between 0 and 9 along the top. These represent the relative intensity "
 	"of the sound in each frame.")
-ENTRY (L"Moving the marks")
-NORMAL (L"To move the cursor hair or the beginning or end of the selection, "
+ENTRY (U"Moving the marks")
+NORMAL (U"To move the cursor hair or the beginning or end of the selection, "
 	"use the @@time selection@ mechanism.")
-ENTRY (L"Changing the path")
-NORMAL (L"To change the path through the candidates manually, click on the candidates of your choice. "
+ENTRY (U"Changing the path")
+NORMAL (U"To change the path through the candidates manually, click on the candidates of your choice. "
 	"The changes will immediately affect the Pitch object that you are editing. To make a voiced frame "
 	"voiceless, click on the voicelessness bar.")
-NORMAL (L"To change the path automatically, choose ##Path finder...# from the #Edit menu; "
+NORMAL (U"To change the path automatically, choose ##Path finder...# from the #Edit menu; "
 	"this will have the same effect as filling in different values in the @@Sound: To Pitch (ac)...@ command window, "
 	"but is much faster because the candidates do not have to be determined again.")
-ENTRY (L"Resynthesis")
-NORMAL (L"To hum any part of the pitch contour, click on one of the buttons "
+ENTRY (U"Resynthesis")
+NORMAL (U"To hum any part of the pitch contour, click on one of the buttons "
 	"below or above the data area (there can be 1 to 8 of these buttons), or use a #Play command from the #View menu.")
-ENTRY (L"Changing the ceiling")
-NORMAL (L"To change the ceiling, but not the path, choose ##Change ceiling...# from the #Edit menu; "
+ENTRY (U"Changing the ceiling")
+NORMAL (U"To change the ceiling, but not the path, choose ##Change ceiling...# from the #Edit menu; "
 	"if the new ceiling is lower than the old ceiling, some formerly voiced frames may become unvoiced; "
 	"if the new ceiling is higher than the old ceiling, some formerly unvoiced frames may become voiced.")
 MAN_END
 
-MAN_BEGIN (L"PitchTier", L"ppgb", 20101230)
-INTRO (L"One of the @@types of objects@ in Praat. "
+MAN_BEGIN (U"PitchTier", U"ppgb", 20101230)
+INTRO (U"One of the @@types of objects@ in Praat. "
 	"A PitchTier object represents a time-stamped pitch contour, "
 	"i.e. it contains a number of (%time, %pitch) points, without voiced/unvoiced information. "
 	"For instance, if your PitchTier contains two points, namely 150 Hz at a time of 0.5 seconds and "
@@ -410,399 +410,399 @@ INTRO (L"One of the @@types of objects@ in Praat. "
 	"is constant at 150 Hz for all times before 0.5 seconds, constant at 200 Hz for all times after 1.5 seconds, "
 	"and linearly interpolated for all times between 0.5 and 1.5 seconds (i.e. 170 Hz at 0.7 seconds, "
 	"210 Hz at 1.1 seconds, and so on).")
-NORMAL (L"PitchTier objects are used for two purposes: "
+NORMAL (U"PitchTier objects are used for two purposes: "
 	"for manipulating the pitch curve of an existing sound "
 	"(see @@Intro 8.1. Manipulation of pitch@) "
 	"and for synthesizing a new sound "
 	"(see @@Source-filter synthesis 1. Creating a source from pitch targets@, "
 	"and for an example @@Source-filter synthesis 3. The ba-da continuum@).")
-ENTRY (L"PitchTier commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"From scratch:")
-LIST_ITEM (L"\\bu @@Create PitchTier...")
-LIST_ITEM (L"\\bu @@PitchTier: Add point...")
-LIST_ITEM (L"Copy from another object:")
-LIST_ITEM (L"\\bu @@Pitch: To PitchTier@: trivial copying of voiced frames.")
-LIST_ITEM (L"\\bu @@PointProcess: Up to PitchTier...@: single value at specified times.")
-LIST_ITEM (L"\\bu @@Pitch & PointProcess: To PitchTier...@: copying interpolated values at specified points.")
-LIST_ITEM (L"Synthesize from another object:")
-LIST_ITEM (L"\\bu @@PointProcess: To PitchTier...@: periodicity analysis.")
-LIST_ITEM (L"Extract from a @Manipulation object:")
-LIST_ITEM (L"\\bu @@Manipulation: Extract pitch tier@")
-NORMAL (L"Viewing and editing:")
-LIST_ITEM (L"\\bu @PitchTierEditor: with or without a Sound.")
-LIST_ITEM (L"\\bu @ManipulationEditor")
-NORMAL (L"Conversion:")
-LIST_ITEM (L"\\bu @@PitchTier: Down to PointProcess@: copy the times.")
-NORMAL (L"Synthesis:")
-LIST_ITEM (L"\\bu @@PitchTier: To PointProcess@: area-1 pulse generation (used in @@overlap-add@).")
-LIST_ITEM (L"\\bu @@Manipulation: Replace pitch tier@")
-NORMAL (L"Queries:")
-LIST_ITEM (L"\\bu @@time domain")
-LIST_ITEM (L"\\bu @@Get low index from time...")
-LIST_ITEM (L"\\bu @@Get high index from time...")
-LIST_ITEM (L"\\bu @@Get nearest index from time...")
-LIST_ITEM (L"\\bu @@PitchTier: Get mean (curve)...")
-LIST_ITEM (L"\\bu @@PitchTier: Get mean (points)...")
-LIST_ITEM (L"\\bu @@PitchTier: Get standard deviation (curve)...")
-LIST_ITEM (L"\\bu @@PitchTier: Get standard deviation (points)...")
-LIST_ITEM (L"\\bu @@Get area...@: the number of periods")
-NORMAL (L"Modification:")
-LIST_ITEM (L"\\bu @@Remove point...")
-LIST_ITEM (L"\\bu @@Remove point near...")
-LIST_ITEM (L"\\bu @@Remove points between...")
-LIST_ITEM (L"\\bu @@PitchTier: Add point...")
-LIST_ITEM (L"\\bu @@PitchTier: Stylize...")
-MAN_END
-
-MAN_BEGIN (L"PitchTier: Add point...", L"ppgb", 20010410)
-INTRO (L"A command to add a point to each selected @PitchTier.")
-ENTRY (L"Settings")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which a point is to be added.")
-TAG (L"##Pitch (Hz)")
-DEFINITION (L"the pitch value of the requested new point.")
-ENTRY (L"Behaviour")
-NORMAL (L"The tier is modified so that it contains the new point. "
+ENTRY (U"PitchTier commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"From scratch:")
+LIST_ITEM (U"\\bu @@Create PitchTier...")
+LIST_ITEM (U"\\bu @@PitchTier: Add point...")
+LIST_ITEM (U"Copy from another object:")
+LIST_ITEM (U"\\bu @@Pitch: To PitchTier@: trivial copying of voiced frames.")
+LIST_ITEM (U"\\bu @@PointProcess: Up to PitchTier...@: single value at specified times.")
+LIST_ITEM (U"\\bu @@Pitch & PointProcess: To PitchTier...@: copying interpolated values at specified points.")
+LIST_ITEM (U"Synthesize from another object:")
+LIST_ITEM (U"\\bu @@PointProcess: To PitchTier...@: periodicity analysis.")
+LIST_ITEM (U"Extract from a @Manipulation object:")
+LIST_ITEM (U"\\bu @@Manipulation: Extract pitch tier@")
+NORMAL (U"Viewing and editing:")
+LIST_ITEM (U"\\bu @PitchTierEditor: with or without a Sound.")
+LIST_ITEM (U"\\bu @ManipulationEditor")
+NORMAL (U"Conversion:")
+LIST_ITEM (U"\\bu @@PitchTier: Down to PointProcess@: copy the times.")
+NORMAL (U"Synthesis:")
+LIST_ITEM (U"\\bu @@PitchTier: To PointProcess@: area-1 pulse generation (used in @@overlap-add@).")
+LIST_ITEM (U"\\bu @@Manipulation: Replace pitch tier@")
+NORMAL (U"Queries:")
+LIST_ITEM (U"\\bu @@time domain")
+LIST_ITEM (U"\\bu @@Get low index from time...")
+LIST_ITEM (U"\\bu @@Get high index from time...")
+LIST_ITEM (U"\\bu @@Get nearest index from time...")
+LIST_ITEM (U"\\bu @@PitchTier: Get mean (curve)...")
+LIST_ITEM (U"\\bu @@PitchTier: Get mean (points)...")
+LIST_ITEM (U"\\bu @@PitchTier: Get standard deviation (curve)...")
+LIST_ITEM (U"\\bu @@PitchTier: Get standard deviation (points)...")
+LIST_ITEM (U"\\bu @@Get area...@: the number of periods")
+NORMAL (U"Modification:")
+LIST_ITEM (U"\\bu @@Remove point...")
+LIST_ITEM (U"\\bu @@Remove point near...")
+LIST_ITEM (U"\\bu @@Remove points between...")
+LIST_ITEM (U"\\bu @@PitchTier: Add point...")
+LIST_ITEM (U"\\bu @@PitchTier: Stylize...")
+MAN_END
+
+MAN_BEGIN (U"PitchTier: Add point...", U"ppgb", 20010410)
+INTRO (U"A command to add a point to each selected @PitchTier.")
+ENTRY (U"Settings")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which a point is to be added.")
+TAG (U"##Pitch (Hz)")
+DEFINITION (U"the pitch value of the requested new point.")
+ENTRY (U"Behaviour")
+NORMAL (U"The tier is modified so that it contains the new point. "
 	"If a point at the specified time was already present in the tier, nothing happens.")
 MAN_END
 
-MAN_BEGIN (L"PitchTier: Down to PointProcess", L"ppgb", 20010410)
-INTRO (L"A command to degrade every selected @PitchTier to a @PointProcess.")
-ENTRY (L"Behaviour")
-NORMAL (L"The times of all the pitch points are trivially copied, and so is the time domain. The pitch information is lost.")
+MAN_BEGIN (U"PitchTier: Down to PointProcess", U"ppgb", 20010410)
+INTRO (U"A command to degrade every selected @PitchTier to a @PointProcess.")
+ENTRY (U"Behaviour")
+NORMAL (U"The times of all the pitch points are trivially copied, and so is the time domain. The pitch information is lost.")
 MAN_END
 
-MAN_BEGIN (L"PitchTier: Get mean (curve)...", L"ppgb", 20010821)
-INTRO (L"A @query to the selected @PitchTier object.")
-ENTRY (L"Return value")
-NORMAL (L"the mean of the curve within a specified time window.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the time window, in seconds. Values outside this window are ignored. "
+MAN_BEGIN (U"PitchTier: Get mean (curve)...", U"ppgb", 20010821)
+INTRO (U"A @query to the selected @PitchTier object.")
+ENTRY (U"Return value")
+NORMAL (U"the mean of the curve within a specified time window.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the time window, in seconds. Values outside this window are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the tier is considered.")
-ENTRY (L"Algorithm")
-NORMAL (L"The curve consists of a sequence of line segments. The contribution of the line segment from "
+ENTRY (U"Algorithm")
+NORMAL (U"The curve consists of a sequence of line segments. The contribution of the line segment from "
 	"(%t__1_, %f__1_) to (%t__2_, %f__2_) to the area under the curve is")
-FORMULA (L"1/2 (%f__1_ + %f__2_) (%t__2_ \\-- %t__1_)")
-NORMAL (L"The mean is the sum of these values divided by %toTime \\-- %fromTime.")
-NORMAL (L"For a PitchTier that was created from a @Pitch object, this command gives the same result as "
+FORMULA (U"1/2 (%f__1_ + %f__2_) (%t__2_ \\-- %t__1_)")
+NORMAL (U"The mean is the sum of these values divided by %toTime \\-- %fromTime.")
+NORMAL (U"For a PitchTier that was created from a @Pitch object, this command gives the same result as "
 	"##Get mean....# for the original Pitch object (but remember that the median, "
 	"as available for Pitch objects, is more robust).")
-NORMAL (L"To get the mean in the entire curve, i.e. weighted by the durations of the line pieces, "
+NORMAL (U"To get the mean in the entire curve, i.e. weighted by the durations of the line pieces, "
 	"Use @@PitchTier: Get mean (points)...@ instead.")
 MAN_END
 
-MAN_BEGIN (L"PitchTier: Get mean (points)...", L"ppgb", 20010821)
-INTRO (L"A @query to the selected @PitchTier object.")
-ENTRY (L"Return value")
-NORMAL (L"the mean of the points within a specified time window.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the time window, in seconds. Values outside this window are ignored. "
+MAN_BEGIN (U"PitchTier: Get mean (points)...", U"ppgb", 20010821)
+INTRO (U"A @query to the selected @PitchTier object.")
+ENTRY (U"Return value")
+NORMAL (U"the mean of the points within a specified time window.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the time window, in seconds. Values outside this window are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the tier is considered.")
-NORMAL (L"To get the mean in the entire curve, i.e. weighted by the durations of the line pieces, "
+NORMAL (U"To get the mean in the entire curve, i.e. weighted by the durations of the line pieces, "
 	"Use @@PitchTier: Get mean (curve)...@ instead.")
 MAN_END
 
-MAN_BEGIN (L"PitchTier: Get standard deviation (curve)...", L"ppgb", 20010821)
-INTRO (L"A @query to the selected @PitchTier object.")
-ENTRY (L"Return value")
-NORMAL (L"the standard deviation in the curve within a specified time window.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored. "
+MAN_BEGIN (U"PitchTier: Get standard deviation (curve)...", U"ppgb", 20010821)
+INTRO (U"A @query to the selected @PitchTier object.")
+ENTRY (U"Return value")
+NORMAL (U"the standard deviation in the curve within a specified time window.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the tier is considered.")
-ENTRY (L"Algorithm")
-NORMAL (L"The curve consists of a sequence of line segments. The contribution of the line segment from "
+ENTRY (U"Algorithm")
+NORMAL (U"The curve consists of a sequence of line segments. The contribution of the line segment from "
 	"(%t__1_, %f__1_) to (%t__2_, %f__2_) to the variance-multiplied-by-time is")
-FORMULA (L"[ 1/4 (%f__1_ + %f__2_)^2 + 1/12 (%f__1_ \\-- %f__2_)^2 ] (%t__2_ \\-- %t__1_)")
-NORMAL (L"The standard deviation is the square root of: the sum of these values divided by %toTime \\-- %fromTime.")
-NORMAL (L"To get the standard deviation in the points only, i.e. not weighted by the durations of the line pieces, "
+FORMULA (U"[ 1/4 (%f__1_ + %f__2_)^2 + 1/12 (%f__1_ \\-- %f__2_)^2 ] (%t__2_ \\-- %t__1_)")
+NORMAL (U"The standard deviation is the square root of: the sum of these values divided by %toTime \\-- %fromTime.")
+NORMAL (U"To get the standard deviation in the points only, i.e. not weighted by the durations of the line pieces, "
 	"Use @@PitchTier: Get standard deviation (points)...@ instead.")
 MAN_END
 
-MAN_BEGIN (L"PitchTier: Get standard deviation (points)...", L"ppgb", 20010821)
-INTRO (L"A @query to the selected @PitchTier object.")
-ENTRY (L"Return value")
-NORMAL (L"the standard deviation in the points within a specified time window.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the selected time domain. Values outside this domain are ignored. "
+MAN_BEGIN (U"PitchTier: Get standard deviation (points)...", U"ppgb", 20010821)
+INTRO (U"A @query to the selected @PitchTier object.")
+ENTRY (U"Return value")
+NORMAL (U"the standard deviation in the points within a specified time window.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the selected time domain. Values outside this domain are ignored. "
 	"If ##To time# is not greater than ##From time#, the entire time domain of the tier is considered.")
-NORMAL (L"For a PitchTier that was created from a @Pitch object, this command gives the same result as "
+NORMAL (U"For a PitchTier that was created from a @Pitch object, this command gives the same result as "
 	"##Get standard deviation....# for the original Pitch object (but remember that variation measures "
 	"based on quantiles, as available for Pitch objects, are more robust).")
-NORMAL (L"To get the standard deviation in the entire curve, i.e. weighted by the durations of the line pieces, "
+NORMAL (U"To get the standard deviation in the entire curve, i.e. weighted by the durations of the line pieces, "
 	"Use @@PitchTier: Get standard deviation (curve)...@ instead.")
 MAN_END
 
-MAN_BEGIN (L"PitchTier: Stylize...", L"ppgb", 20050831)
-INTRO (L"A command that modifies the selected @PitchTier object "
+MAN_BEGIN (U"PitchTier: Stylize...", U"ppgb", 20050831)
+INTRO (U"A command that modifies the selected @PitchTier object "
 	"(or the pitch curve in the @ManipulationEditor).")
-ENTRY (L"Purpose")
-NORMAL (L"to end up with a much simplified pitch curve.")
-ENTRY (L"Settings")
-TAG (L"##Frequency resolution# (standard: 2.0 semitones)")
-DEFINITION (L"the minimum amount by which every remaining pitch point will lie "
+ENTRY (U"Purpose")
+NORMAL (U"to end up with a much simplified pitch curve.")
+ENTRY (U"Settings")
+TAG (U"##Frequency resolution# (standard: 2.0 semitones)")
+DEFINITION (U"the minimum amount by which every remaining pitch point will lie "
 	"above or below the line that connects its two neigbours.")
-ENTRY (L"Algorithm")
-LIST_ITEM (L"1. Look up the pitch point that is closest to the straight line "
+ENTRY (U"Algorithm")
+LIST_ITEM (U"1. Look up the pitch point that is closest to the straight line "
 	"that connects its two neighbouring points.")
-LIST_ITEM (L"2. If this pitch point is further away from that straight line "
+LIST_ITEM (U"2. If this pitch point is further away from that straight line "
 	"than ##Frequency resolution#, we are finished: the curve cannot be stylized any further.")
-LIST_ITEM (L"3. If we are not finished, the pitch point we found in step 1 is removed.")
-LIST_ITEM (L"4. Go back to step 1.")
+LIST_ITEM (U"3. If we are not finished, the pitch point we found in step 1 is removed.")
+LIST_ITEM (U"4. Go back to step 1.")
 MAN_END
 
-MAN_BEGIN (L"PitchTier: To PointProcess", L"ppgb", 19960915)
-INTRO (L"A command that uses a @PitchTier object to generate a @PointProcess.")
-ENTRY (L"Purpose")
-NORMAL (L"to interpret an acoustic periodicity contour as the frequency of an underlying point process "
+MAN_BEGIN (U"PitchTier: To PointProcess", U"ppgb", 19960915)
+INTRO (U"A command that uses a @PitchTier object to generate a @PointProcess.")
+ENTRY (U"Purpose")
+NORMAL (U"to interpret an acoustic periodicity contour as the frequency of an underlying point process "
 	"(such as the sequence of glottal closures in vocal-fold vibration).")
-ENTRY (L"Algorithm")
-NORMAL (L"Points are generated along the entire time domain of the #PitchTier, "
+ENTRY (U"Algorithm")
+NORMAL (U"Points are generated along the entire time domain of the #PitchTier, "
 	"because there is no voiced/unvoiced information. The area between two adjacent points "
 	"under the linearly interpolated pitch contour, is always 1.")
 MAN_END
 
-MAN_BEGIN (L"PitchTierEditor", L"ppgb", 20110128)
-INTRO (L"One of the @Editors in Praat, for viewing and manipulating a @PitchTier object, "
+MAN_BEGIN (U"PitchTierEditor", U"ppgb", 20110128)
+INTRO (U"One of the @Editors in Praat, for viewing and manipulating a @PitchTier object, "
 	"which is optionally shown together with a @Sound object.")
-ENTRY (L"Objects")
-NORMAL (L"The editor shows:")
-LIST_ITEM (L"\\bu The @Sound, if you selected a Sound object together with the PitchTier object "
+ENTRY (U"Objects")
+NORMAL (U"The editor shows:")
+LIST_ITEM (U"\\bu The @Sound, if you selected a Sound object together with the PitchTier object "
 	"before you clicked ##View & Edit#.")
-LIST_ITEM (L"\\bu The @PitchTier: blue points connected with blue lines.")
-ENTRY (L"Playing")
-NORMAL (L"To play (a part of) the %resynthesized sound: "
+LIST_ITEM (U"\\bu The @PitchTier: blue points connected with blue lines.")
+ENTRY (U"Playing")
+NORMAL (U"To play (a part of) the %resynthesized sound: "
 	"@click on any of the 8 buttons below and above the drawing area, or choose a Play command from the View menu.")
-NORMAL (L"To play the %original sound instead, use @@Shift-click at .")
-ENTRY (L"Adding a point")
-NORMAL (L"@Click at the desired time location, and choose ##Add point at cursor# or type ##Command-P#.")
-ENTRY (L"Removing points")
-NORMAL (L"To remove one or more pitch points, "
+NORMAL (U"To play the %original sound instead, use @@Shift-click at .")
+ENTRY (U"Adding a point")
+NORMAL (U"@Click at the desired time location, and choose ##Add point at cursor# or type ##Command-P#.")
+ENTRY (U"Removing points")
+NORMAL (U"To remove one or more pitch points, "
 	"make a @@time selection@ and choose ##Remove point(s)# from the ##Point# menu. "
 	"If there is no selection, the point nearest to the cursor is removed.")
 MAN_END
 
-MAN_BEGIN (L"PointProcess: To PitchTier...", L"ppgb", 19970402)
-INTRO (L"A command to compute a @PitchTier from a @PointProcess.")
-ENTRY (L"Setting")
-TAG (L"##Maximum interval (s)")
-DEFINITION (L"the maximum duration of a period; intervals longer than this are considered voiceless.")
-ENTRY (L"Algorithm")
-NORMAL (L"A pitch point is constructed between each consecutive pair of points in the #PointProcess, "
+MAN_BEGIN (U"PointProcess: To PitchTier...", U"ppgb", 19970402)
+INTRO (U"A command to compute a @PitchTier from a @PointProcess.")
+ENTRY (U"Setting")
+TAG (U"##Maximum interval (s)")
+DEFINITION (U"the maximum duration of a period; intervals longer than this are considered voiceless.")
+ENTRY (U"Algorithm")
+NORMAL (U"A pitch point is constructed between each consecutive pair of points in the #PointProcess, "
 	"if these are more than %maximumInterval apart. "
 	"The associated pitch value will be the inverse of the duration of the interval between the two points.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Harmonicity (ac)...", L"ppgb", 20030916)
-INTRO (L"A command that creates a @Harmonicity object from every selected @Sound object.")
-ENTRY (L"Purpose")
-NORMAL (L"to perform a short-term HNR analysis.")
-ENTRY (L"Algorithm")
-NORMAL (L"The algorithm performs an acoustic periodicity detection on the basis of an "
+MAN_BEGIN (U"Sound: To Harmonicity (ac)...", U"ppgb", 20030916)
+INTRO (U"A command that creates a @Harmonicity object from every selected @Sound object.")
+ENTRY (U"Purpose")
+NORMAL (U"to perform a short-term HNR analysis.")
+ENTRY (U"Algorithm")
+NORMAL (U"The algorithm performs an acoustic periodicity detection on the basis of an "
 	"accurate autocorrelation method, as described in @@Boersma (1993)@.")
-ENTRY (L"Settings")
-TAG (L"%%Time step% (standard value: 0.01 s)")
-DEFINITION (L"the measurement interval (frame duration), in seconds.")
-TAG (L"%%Minimum pitch% (standard value: 75 Hz)")
-DEFINITION (L"determines the length of the analysis window.")
-TAG (L"%%Silence threshold% (standard value: 0.1)")
-DEFINITION (L"frames that do not contain amplitudes above this threshold (relative to the global maximum amplitude), "
+ENTRY (U"Settings")
+TAG (U"%%Time step% (standard value: 0.01 s)")
+DEFINITION (U"the measurement interval (frame duration), in seconds.")
+TAG (U"%%Minimum pitch% (standard value: 75 Hz)")
+DEFINITION (U"determines the length of the analysis window.")
+TAG (U"%%Silence threshold% (standard value: 0.1)")
+DEFINITION (U"frames that do not contain amplitudes above this threshold (relative to the global maximum amplitude), "
 	"are considered silent.")
-TAG (L"%%Number of periods per window% (standard value: 4.5)")
-DEFINITION (L"4.5 is best for speech: "
+TAG (U"%%Number of periods per window% (standard value: 4.5)")
+DEFINITION (U"4.5 is best for speech: "
 	"HNR values up to 37 dB are guaranteed to be detected reliably; "
 	"6 periods per window raises this figure to more than 60 dB, "
 	"but the algorithm becomes more sensitive to dynamic changes in the signal.")
-ENTRY (L"Usage")
-NORMAL (L"You will normally use @@Sound: To Harmonicity (cc)...@ instead of this command, "
+ENTRY (U"Usage")
+NORMAL (U"You will normally use @@Sound: To Harmonicity (cc)...@ instead of this command, "
 	"because that has a much better time resolution (though its sensitivity is 60, not 80 dB).")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Harmonicity (cc)...", L"ppgb", 19961003)
-INTRO (L"A command that creates a @Harmonicity object from every selected @Sound object.")
-ENTRY (L"Purpose")
-NORMAL (L"to perform a short-term HNR analysis.")
-ENTRY (L"Algorithm")
-NORMAL (L"The algorithm performs an acoustic periodicity detection on the basis of a "
+MAN_BEGIN (U"Sound: To Harmonicity (cc)...", U"ppgb", 19961003)
+INTRO (U"A command that creates a @Harmonicity object from every selected @Sound object.")
+ENTRY (U"Purpose")
+NORMAL (U"to perform a short-term HNR analysis.")
+ENTRY (U"Algorithm")
+NORMAL (U"The algorithm performs an acoustic periodicity detection on the basis of a "
 	"forward cross-correlation analysis. "
 	"For information on the settings, see @@Sound: To Harmonicity (ac)... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Pitch...", L"ppgb", 20030916)
-INTRO (L"A command that creates a @Pitch object from every selected @Sound object.")
-ENTRY (L"Purpose")
-NORMAL (L"to perform a pitch analysis, optimized for speech.")
-ENTRY (L"Settings")
-NORMAL (L"The settings that control the recruitment of the candidates are:")
-TAG (L"##Time step (s)# (standard value: 0.0)")
-DEFINITION (L"the measurement interval (frame duration), in seconds. If you supply 0, "
+MAN_BEGIN (U"Sound: To Pitch...", U"ppgb", 20030916)
+INTRO (U"A command that creates a @Pitch object from every selected @Sound object.")
+ENTRY (U"Purpose")
+NORMAL (U"to perform a pitch analysis, optimized for speech.")
+ENTRY (U"Settings")
+NORMAL (U"The settings that control the recruitment of the candidates are:")
+TAG (U"##Time step (s)# (standard value: 0.0)")
+DEFINITION (U"the measurement interval (frame duration), in seconds. If you supply 0, "
 	"Praat will use a time step of 0.75 / (%%pitch floor%), e.g. 0.01 seconds if the pitch floor is 75 Hz; "
 	"in this example, Praat computes 100 pitch values per second.")
-TAG (L"##Pitch floor (Hz)# (standard value: 75 Hz)")
-DEFINITION (L"candidates below this frequency will not be recruited. "
+TAG (U"##Pitch floor (Hz)# (standard value: 75 Hz)")
+DEFINITION (U"candidates below this frequency will not be recruited. "
 	"This parameter determines the length of the analysis window: it will be 3 longest periods long, "
 	"i.e., if the pitch floor is 75 Hz, the window will be 3/75 = 0.04 seconds long.")
-NORMAL (L"Note that if you set the time step to zero, the analysis windows for consecutive measurements "
+NORMAL (U"Note that if you set the time step to zero, the analysis windows for consecutive measurements "
 	"will overlap appreciably: Praat will always compute 4 pitch values "
 	"within one window length, i.e., the degree of %oversampling is 4.")
-NORMAL (L"A post-processing algorithm seeks the cheapest path through the candidates. "
+NORMAL (U"A post-processing algorithm seeks the cheapest path through the candidates. "
 	"The argument that determines the cheapest path is:")
-TAG (L"##Pitch ceiling (Hz)# (standard value: 600 Hz)")
-DEFINITION (L"candidates above this frequency will be ignored.")
-ENTRY (L"Algorithm")
-NORMAL (L"This is the algorithm described at @@Sound: To Pitch (ac)...@, "
+TAG (U"##Pitch ceiling (Hz)# (standard value: 600 Hz)")
+DEFINITION (U"candidates above this frequency will be ignored.")
+ENTRY (U"Algorithm")
+NORMAL (U"This is the algorithm described at @@Sound: To Pitch (ac)...@, "
 	"with all the parameters not mentioned above set to their standard values.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Pitch (ac)...", L"ppgb", 20030916)
-INTRO (L"A command that creates a @Pitch object from every selected @Sound object.")
-ENTRY (L"Purpose")
-NORMAL (L"to perform a pitch analysis based on an autocorrelation method.")
-ENTRY (L"Usage")
-NORMAL (L"Normally, you will instead use @@Sound: To Pitch...@, which uses the same method. "
+MAN_BEGIN (U"Sound: To Pitch (ac)...", U"ppgb", 20030916)
+INTRO (U"A command that creates a @Pitch object from every selected @Sound object.")
+ENTRY (U"Purpose")
+NORMAL (U"to perform a pitch analysis based on an autocorrelation method.")
+ENTRY (U"Usage")
+NORMAL (U"Normally, you will instead use @@Sound: To Pitch...@, which uses the same method. "
 	"The command described here is mainly for experimenting with the parameters, "
 	"or for the analysis of non-speech signals, which may require different "
 	"standard settings of the parameters.")
-ENTRY (L"Algorithm")
-NORMAL (L"The algorithm performs an acoustic periodicity detection on the basis of an "
+ENTRY (U"Algorithm")
+NORMAL (U"The algorithm performs an acoustic periodicity detection on the basis of an "
 	"accurate autocorrelation method, as described in @@Boersma (1993)@. "
 	"This method is more accurate, noise-resistant, and robust, than methods based on cepstrum or combs, "
 	"or the original autocorrelation methods. The reason why other methods were invented, "
 	"was the failure to recognize the fact that if you want to estimate a signal's short-term autocorrelation "
 	"function on the basis of a windowed signal, you should divide the autocorrelation function of the "
 	"windowed signal by the autocorrelation function of the window:")
-NORMAL (L"%r__%x_ (%\\ta) \\~~ %r__%xw_ (%\\ta) / %r__%w_ (%\\ta)")
-ENTRY (L"Settings")
-NORMAL (L"The settings that control the recruitment of the candidates are:")
-TAG (L"##Time step (s)# (standard value: 0.0)")
-DEFINITION (L"the measurement interval (frame duration), in seconds. If you supply 0, "
+NORMAL (U"%r__%x_ (%\\ta) \\~~ %r__%xw_ (%\\ta) / %r__%w_ (%\\ta)")
+ENTRY (U"Settings")
+NORMAL (U"The settings that control the recruitment of the candidates are:")
+TAG (U"##Time step (s)# (standard value: 0.0)")
+DEFINITION (U"the measurement interval (frame duration), in seconds. If you supply 0, "
 	"Praat will use a time step of 0.75 / (%%pitch floor%), e.g. 0.01 seconds if the pitch floor is 75 Hz; "
 	"in this example, Praat computes 100 pitch values per second.")
-TAG (L"##Pitch floor (Hz)# (standard value: 75 Hz)")
-DEFINITION (L"candidates below this frequency will not be recruited. "
+TAG (U"##Pitch floor (Hz)# (standard value: 75 Hz)")
+DEFINITION (U"candidates below this frequency will not be recruited. "
 	"This parameter determines the effective length of the analysis window: it will be 3 longest periods long, "
 	"i.e., if the pitch floor is 75 Hz, the window will be effectively 3/75 = 0.04 seconds long.")
-NORMAL (L"Note that if you set the time step to zero, the analysis windows for consecutive measurements "
+NORMAL (U"Note that if you set the time step to zero, the analysis windows for consecutive measurements "
 	"will overlap appreciably: Praat will always compute 4 pitch values "
 	"within one window length, i.e., the degree of %oversampling is 4.")
-TAG (L"##Very accurate# (standard value: %off)")
-DEFINITION (L"if %off, the window is a Hanning window with a physical length of  3 / (%%pitch floor%). "
+TAG (U"##Very accurate# (standard value: %off)")
+DEFINITION (U"if %off, the window is a Hanning window with a physical length of  3 / (%%pitch floor%). "
 	"If %on, the window is a Gaussian window with a physical length of  6 / (%%pitch floor%), "
 	"i.e. twice the effective length.")
-NORMAL (L"A post-processing algorithm seeks the cheapest path through the candidates. "
+NORMAL (U"A post-processing algorithm seeks the cheapest path through the candidates. "
 	"The settings that determine the cheapest path are:")
-TAG (L"##Pitch ceiling (Hz)# (standard value: 600 Hz)")
-DEFINITION (L"candidates above this frequency will be ignored.")
-TAG (L"##Silence threshold# (standard value: 0.03)")
-DEFINITION (L"frames that do not contain amplitudes above this threshold (relative to the global maximum amplitude), "
+TAG (U"##Pitch ceiling (Hz)# (standard value: 600 Hz)")
+DEFINITION (U"candidates above this frequency will be ignored.")
+TAG (U"##Silence threshold# (standard value: 0.03)")
+DEFINITION (U"frames that do not contain amplitudes above this threshold (relative to the global maximum amplitude), "
 	"are probably silent.")
-TAG (L"##Voicing threshold# (standard value: 0.45)")
-DEFINITION (L"the strength of the unvoiced candidate, relative to the maximum possible autocorrelation. "
+TAG (U"##Voicing threshold# (standard value: 0.45)")
+DEFINITION (U"the strength of the unvoiced candidate, relative to the maximum possible autocorrelation. "
 	"To increase the number of unvoiced decisions, increase this value.")
-TAG (L"##Octave cost# (standard value: 0.01 per octave)")
-DEFINITION (L"degree of favouring of high-frequency candidates, relative to the maximum possible autocorrelation. "
+TAG (U"##Octave cost# (standard value: 0.01 per octave)")
+DEFINITION (U"degree of favouring of high-frequency candidates, relative to the maximum possible autocorrelation. "
 	"This is necessary because even (or: especially) in the case of a perfectly periodic signal, "
 	"all undertones of %F__0_ are equally strong candidates as %F__0_ itself. "
 	"To more strongly favour recruitment of high-frequency candidates, increase this value.")
-TAG (L"##Octave-jump cost# (standard value: 0.35)")
-DEFINITION (L"degree of disfavouring of pitch changes, relative to the maximum possible autocorrelation. "
+TAG (U"##Octave-jump cost# (standard value: 0.35)")
+DEFINITION (U"degree of disfavouring of pitch changes, relative to the maximum possible autocorrelation. "
 	"To decrease the number of large frequency jumps, increase this value. In contrast with what is described "
 	"in the article, this value will be corrected for the time step: multiply by 0.01 s / %TimeStep to get "
 	"the value in the way it is used in the formulas in the article.")
-TAG (L"##Voiced / unvoiced cost# (standard value: 0.14)")
-DEFINITION (L"degree of disfavouring of voiced/unvoiced transitions, relative to the maximum possible autocorrelation. "
+TAG (U"##Voiced / unvoiced cost# (standard value: 0.14)")
+DEFINITION (U"degree of disfavouring of voiced/unvoiced transitions, relative to the maximum possible autocorrelation. "
 	"To decrease the number of voiced/unvoiced transitions, increase this value. In contrast with what is described "
 	"in the article, this value will be corrected for the time step: multiply by 0.01 s / %TimeStep to get "
 	"the value in the way it is used in the formulas in the article.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Pitch (cc)...", L"ppgb", 20030916)
-INTRO (L"A command that creates a @Pitch object from every selected @Sound object.")
-ENTRY (L"Purpose")
-NORMAL (L"to perform a pitch analysis based on a cross-correlation method.")
-ENTRY (L"Algorithm")
-NORMAL (L"The algorithm performs an acoustic periodicity detection on the basis of a "
+MAN_BEGIN (U"Sound: To Pitch (cc)...", U"ppgb", 20030916)
+INTRO (U"A command that creates a @Pitch object from every selected @Sound object.")
+ENTRY (U"Purpose")
+NORMAL (U"to perform a pitch analysis based on a cross-correlation method.")
+ENTRY (U"Algorithm")
+NORMAL (U"The algorithm performs an acoustic periodicity detection on the basis of a "
 	"forward cross-correlation analysis.")
-ENTRY (L"Settings")
-TAG (L"##Time step (s)# (standard value: 0.0)")
-DEFINITION (L"the measurement interval (frame duration), in seconds. If you supply 0, "
+ENTRY (U"Settings")
+TAG (U"##Time step (s)# (standard value: 0.0)")
+DEFINITION (U"the measurement interval (frame duration), in seconds. If you supply 0, "
 	"Praat will use a time step of 0.25 / (%%pitch floor%), e.g. 0.00333333 seconds if the pitch floor is 75 Hz; "
 	"in this example, Praat computes 300 pitch values per second.")
-TAG (L"##Pitch floor (Hz)# (standard value: 75 Hz)")
-DEFINITION (L"candidates below this frequency will not be recruited. "
+TAG (U"##Pitch floor (Hz)# (standard value: 75 Hz)")
+DEFINITION (U"candidates below this frequency will not be recruited. "
 	"This parameter determines the length of the analysis window: it will be 1 longest period long, "
 	"i.e., if the pitch floor is 75 Hz, the window will be 1/75 = 0.01333333 seconds long.")
-NORMAL (L"Note that if you set the time step to zero, the analysis windows for consecutive measurements "
+NORMAL (U"Note that if you set the time step to zero, the analysis windows for consecutive measurements "
 	"will overlap appreciably: Praat will always compute 4 pitch values "
 	"within one window length, i.e., the degree of %oversampling is 4.")
-NORMAL (L"The other settings are the same as for @@Sound: To Pitch (ac)... at .")
-ENTRY (L"Usage")
-NORMAL (L"The preferred method for speech is @@Sound: To Pitch... at . "
+NORMAL (U"The other settings are the same as for @@Sound: To Pitch (ac)... at .")
+ENTRY (U"Usage")
+NORMAL (U"The preferred method for speech is @@Sound: To Pitch... at . "
 	"The command described here is mainly for experimenting, "
 	"or for applications where you need short time windows.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To PointProcess (periodic, cc)...", L"ppgb", 20030309)
-INTRO (L"A command that analyses the selected @Sound objects, and creates @PointProcess objects.")
-NORMAL (L"This command combines the actions of @@Sound: To Pitch (ac)...@ and @@Sound & Pitch: To PointProcess (cc)@.")
+MAN_BEGIN (U"Sound: To PointProcess (periodic, cc)...", U"ppgb", 20030309)
+INTRO (U"A command that analyses the selected @Sound objects, and creates @PointProcess objects.")
+NORMAL (U"This command combines the actions of @@Sound: To Pitch (ac)...@ and @@Sound & Pitch: To PointProcess (cc)@.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To PointProcess (periodic, peaks)...", L"ppgb", 20030309)
-INTRO (L"A command that analyses the selected @Sound objects, and creates @PointProcess objects.")
-NORMAL (L"This command combines the actions of @@Sound: To Pitch (ac)...@ and @@Sound & Pitch: To PointProcess (peaks)... at .")
+MAN_BEGIN (U"Sound: To PointProcess (periodic, peaks)...", U"ppgb", 20030309)
+INTRO (U"A command that analyses the selected @Sound objects, and creates @PointProcess objects.")
+NORMAL (U"This command combines the actions of @@Sound: To Pitch (ac)...@ and @@Sound & Pitch: To PointProcess (peaks)... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound & Pitch: To PointProcess (cc)", L"ppgb", 19980322)
-INTRO (L"A command to create a @PointProcess from the selected @Sound and @Pitch objects.")
-ENTRY (L"Purpose")
-NORMAL (L"to interpret an acoustic periodicity contour as the frequency of an underlying point process "
+MAN_BEGIN (U"Sound & Pitch: To PointProcess (cc)", U"ppgb", 19980322)
+INTRO (U"A command to create a @PointProcess from the selected @Sound and @Pitch objects.")
+ENTRY (U"Purpose")
+NORMAL (U"to interpret an acoustic periodicity contour as the frequency of an underlying point process "
 	"(such as the sequence of glottal closures in vocal-fold vibration).")
-ENTRY (L"Algorithm")
-NORMAL (L"The voiced intervals are determined on the basis of the voiced/unvoiced decisions in the @Pitch object. "
+ENTRY (U"Algorithm")
+NORMAL (U"The voiced intervals are determined on the basis of the voiced/unvoiced decisions in the @Pitch object. "
 	"For every voiced interval, a number of %points (or glottal pulses) is found as follows:")
-LIST_ITEM (L"1. The first point %t__1_ is the absolute extremum of the amplitude of the #Sound, "
+LIST_ITEM (U"1. The first point %t__1_ is the absolute extremum of the amplitude of the #Sound, "
 	"between %t__%mid_ \\-- %T__0_ / 2 and %t__%mid_ + %T__0_ / 2, where %t__%mid_ is the midpoint of the interval, "
 	"and %T__0_ is the period at %t__%mid_, as can be interpolated from the #Pitch contour.")
-LIST_ITEM (L"2. From this point, we recursively search for points %t__%i_ to the left "
+LIST_ITEM (U"2. From this point, we recursively search for points %t__%i_ to the left "
 	"until we reach the left edge of the interval. These points must be located between "
 	"%t__%i\\--1_ \\-- 1.2 %T__0_(%t__%i\\--1_) and %t__%i\\--1_ \\-- 0.8 %T__0_(%t__%i\\--1_), "
 	"and the cross-correlation of the amplitude "
 	"in its environment [%t__%i_ \\-- %T__0_(%t__%i_) / 2; %t__%i_ + %T__0_(%t__%i_) / 2] "
 	"with the amplitude of the environment of the existing point %t__%i\\--1_ must be maximal "
 	"(we use parabolic interpolation between samples of the correlation function).")
-LIST_ITEM (L"3. The same is done to the right of %t__1_.")
-LIST_ITEM (L"4. Though the voiced/unvoiced decision is initially taken by the #Pitch contour, "
+LIST_ITEM (U"3. The same is done to the right of %t__1_.")
+LIST_ITEM (U"4. Though the voiced/unvoiced decision is initially taken by the #Pitch contour, "
 	"points are removed if their correlation value is less than 0.3; "
 	"furthermore, one extra point may be added at the edge of the voiced interval "
 	"if its correlation value is greater than 0.7.")
 MAN_END
 
-MAN_BEGIN (L"Sound & Pitch: To PointProcess (peaks)...", L"ppgb", 20070722)
-INTRO (L"A command to create a @PointProcess from the selected @Sound and @Pitch objects.")
-ENTRY (L"Purpose")
-NORMAL (L"to interpret an acoustic periodicity contour as the frequency of an underlying point process "
+MAN_BEGIN (U"Sound & Pitch: To PointProcess (peaks)...", U"ppgb", 20070722)
+INTRO (U"A command to create a @PointProcess from the selected @Sound and @Pitch objects.")
+ENTRY (U"Purpose")
+NORMAL (U"to interpret an acoustic periodicity contour as the frequency of an underlying point process "
 	"(such as the sequence of glottal closures in vocal-fold vibration).")
-ENTRY (L"Algorithm")
-NORMAL (L"The voiced intervals are determined on the basis of the voiced/unvoiced decisions in the @Pitch object. "
+ENTRY (U"Algorithm")
+NORMAL (U"The voiced intervals are determined on the basis of the voiced/unvoiced decisions in the @Pitch object. "
 	"For every voiced interval, a number of %points (or glottal pulses) is found as follows:")
-LIST_ITEM (L"1. The first point %t__1_ is the absolute extremum (or the maximum, or the minimum, depending on "
+LIST_ITEM (U"1. The first point %t__1_ is the absolute extremum (or the maximum, or the minimum, depending on "
 	"your %%Include maxima% and %%Include minima% settings) of the amplitude of the #Sound, "
 	"between %t__%mid_ \\-- %T__0_ / 2 and %t__%mid_ + %T__0_ / 2, where %t__%mid_ is the midpoint of the interval, "
 	"and %T__0_ is the period at %t__%mid_, as can be interpolated from the #Pitch contour.")
-LIST_ITEM (L"2. From this point, we recursively search for points %t__%i_ to the left "
+LIST_ITEM (U"2. From this point, we recursively search for points %t__%i_ to the left "
 	"until we reach the left edge of the interval. These points are the absolute extrema (or the maxima, or the minima) "
 	"between the times "
 	"%t__%i\\--1_ \\-- 1.2 %T__0_(%t__%i\\--1_) and %t__%i\\--1_ \\-- 0.8 %T__0_(%t__%i\\--1_).")
-LIST_ITEM (L"3. The same is done to the right of %t__1_.")
-NORMAL (L"The periods that are found in this way are much more variable than those found by "
+LIST_ITEM (U"3. The same is done to the right of %t__1_.")
+NORMAL (U"The periods that are found in this way are much more variable than those found by "
 	"@@Sound & Pitch: To PointProcess (cc)@, and therefore less useful for analysis and subsequent @@overlap-add@ synthesis.")
 MAN_END
 
diff --git a/fon/manual_programming.cpp b/fon/manual_programming.cpp
index fe7bd6c..3356135 100644
--- a/fon/manual_programming.cpp
+++ b/fon/manual_programming.cpp
@@ -1,6 +1,6 @@
 /* manual_programming.cpp
  *
- * Copyright (C) 1992-2010 Paul Boersma
+ * Copyright (C) 1992-2010,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,60 +22,50 @@
 void manual_programming_init (ManPages me);
 void manual_programming_init (ManPages me) {
 
-MAN_BEGIN (L"Programming with Praat", L"ppgb", 20130429)
-INTRO (L"You can extend the functionality of the Praat program "
+MAN_BEGIN (U"Programming with Praat", U"ppgb", 20151028)
+INTRO (U"You can extend the functionality of the Praat program "
 	"by adding modules written in C or C++ to it. All of Praat's source code "
 	"is available under the General Public Licence.")
-ENTRY (L"1. Warning")
-NORMAL (L"Before trying the task of learning how to write Praat extensions in C or C++, "
+ENTRY (U"1. Warning")
+NORMAL (U"Before trying the task of learning how to write Praat extensions in C or C++, "
 	"you should be well aware of the possibilities of @scripting. "
 	"Many built-in commands in Praat have started their "
 	"lives as Praat scripts, and scripts are easier to write than extensions in C or C++. "
 	"If you have a set of scripts, you can distribute them as a @@plug-ins|plug-in at .")
-ENTRY (L"2. Getting the existing source code")
-NORMAL (L"You obtain the Praat source code via ##www.praat.org#, in a file with a name like "
-	"##praat5347_sources.zip# or ##praat5347_sources.tar.gz# (depending on the Praat version), and unpack this by double-clicking. "
+ENTRY (U"2. Getting the existing source code")
+NORMAL (U"You obtain the Praat source code from GitHub (https://github.com/praat), in a file with a name like "
+	"##praat5423_sources.zip# or ##praat5423_sources.tar.gz# (depending on the Praat version), and unpack this by double-clicking. "
 	"The result will be a set of directories "
 	"called #kar, #num, #external (with #GSL, #glpk, #FLAC, #mp3, #portaudio and #espeak in it), "
-	"#sys, #dwsys, #stat, #fon, #dwtools, #LPC, #FFNet, #gram, #artsynth, #EEG, #contrib, #main, #makefiles, and #test, "
+	"#sys, #dwsys, #stat, #fon, #dwtools, #LPC, #FFNet, #gram, #artsynth, #EEG, #contrib, #main, #makefiles, #test, and #dwtest, "
 	"plus a makefile and an Xcode project for Macintosh.")
-ENTRY (L"3. Building Praat on Macintosh")
-NORMAL (L"Open ##praat.xcodeproj# in Xcode and choose #Build and #Run. For more details see the download page.")
-ENTRY (L"4. Building Praat on Windows")
-NORMAL (L"Praat for Windows is compiled with MinGW. See the download page for instructions.")
-ENTRY (L"5. Building Praat on Linux")
-NORMAL (L"To compile and link Praat on Linux, you go to the directory that "
-	"contains the source directories and the makefile, and copy a ##makefile.defs# "
-	"file from the #makefiles directory:")
-CODE (L"> cp makefiles/makefile.defs.linux ./makefile.defs")
-NORMAL (L"You have to have installed ##libgtk2.0-dev# (and its dependencies) and ##libasound2-dev#.")
-NORMAL (L"On other Unixes, you do the same, but the file ##makefile.defs# may require some editing after this, "
-	"because Silicon Graphics Irix, Sparc Solaris and HPUX may use different libraries or have them in different locations than Linux.")
-ENTRY (L"6. Extending Praat")
-NORMAL (L"You can edit ##main/main_Praat.cpp#. "
+ENTRY (U"3. Building Praat")
+NORMAL (U"Consult the README file on GitHub for directions to compile and link Praat for your platform.")
+ENTRY (U"4. Extending Praat")
+NORMAL (U"To start extending Praat’s functionality, you can edit ##main/main_Praat.cpp#. "
 	"This example shows you how to create a very simple program with all the functionality "
 	"of the Praat program, and a single bit more (namely an additional command in the New menu):")
-CODE (L"\\# include \"praat.h\"")
-CODE (L"")
-CODE (L"DIRECT (HelloFromJane)")
-CODE1 (L"Melder_information (L\"Hello, I am Jane.\");")
-CODE (L"END")
-CODE (L"")
-CODE (L"int main (int argc, char **argv) {")
-CODE1 (L"praat_init (\"Praat_Jane\", argc, argv);")
-CODE1 (L"INCLUDE_LIBRARY (praat_uvafon_init)")
-CODE1 (L"praat_addMenuCommand (L\"Objects\", L\"New\", L\"Hello from Jane...\", NULL, 0, DO_HelloFromJane);")
-CODE1 (L"praat_run ();")
-CODE1 (L"return 0;")
-CODE (L"}")
-ENTRY (L"7. Learning how to program")
-NORMAL (L"To see how objects are defined, take a look at ##sys/Thing.h#, ##sys/Data.h#, "
+CODE (U"\\# include \"praat.h\"")
+CODE (U"")
+CODE (U"DIRECT (HelloFromJane)")
+CODE1 (U"Melder_information (U\"Hello, I am Jane.\");")
+CODE (U"END")
+CODE (U"")
+CODE (U"int main (int argc, char **argv) {")
+CODE1 (U"praat_init (U\"Praat_Jane\", argc, argv);")
+CODE1 (U"INCLUDE_LIBRARY (praat_uvafon_init)")
+CODE1 (U"praat_addMenuCommand (U\"Objects\", U\"New\", U\"Hello from Jane...\", NULL, 0, DO_HelloFromJane);")
+CODE1 (U"praat_run ();")
+CODE1 (U"return 0;")
+CODE (U"}")
+ENTRY (U"5. Learning how to program")
+NORMAL (U"To see how objects are defined, take a look at ##sys/Thing.h#, ##sys/Daata.h#, "
 	"##sys/oo.h#, the ##XXX_def.h# files in the #fon directory, and the corresponding "
 	"##XXX.cpp# files in the #fon directory. To see how commands show up on the buttons "
 	"in the fixed and dynamic menus, take a look at the large interface description file "
 	"##fon/praat_Fon.cpp#.")
-ENTRY (L"8. Using the Praat shell only")
-NORMAL (L"For building the Praat shell (the Objects and Picture windows) only, you need only the code in the eight directories "
+ENTRY (U"6. Using the Praat shell only")
+NORMAL (U"For building the Praat shell (the Objects and Picture windows) only, you need only the code in the eight directories "
 	"#kar, #GSL, #num, ##external/{FLAC,MP3,portaudio}#, #sys, and #dwsys. You delete the inclusion of praat_uvafon_init from #main. "
 	"You will be able to build a Praat shell, i.e. an Objects and a Picture window, "
 	"which has no knowledge of the world, i.e., which does not know any objects "
diff --git a/fon/manual_references.cpp b/fon/manual_references.cpp
index 2e2ded2..a0038e3 100644
--- a/fon/manual_references.cpp
+++ b/fon/manual_references.cpp
@@ -1,6 +1,6 @@
 /* manual_references.cpp
  *
- * Copyright (C) 1992-2010 Paul Boersma
+ * Copyright (C) 1992-2010,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,262 +22,262 @@
 void manual_references_init (ManPages me);
 void manual_references_init (ManPages me) {
 
-MAN_BEGIN (L"Archangeli & Pulleyblank (1994)", L"ppgb", 19971021)
-NORMAL (L"Diana Archangeli & Douglas Pulleyblank (1994): %%Grounded phonology%. "
+MAN_BEGIN (U"Archangeli & Pulleyblank (1994)", U"ppgb", 19971021)
+NORMAL (U"Diana Archangeli & Douglas Pulleyblank (1994): %%Grounded phonology%. "
 	"Cambridge, MA: MIT Press.")
 MAN_END
 
-MAN_BEGIN (L"Boersma (1993)", L"ppgb", 20030312)
-NORMAL (L"Paul Boersma (1993): \"Accurate short-term analysis of the fundamental frequency "
+MAN_BEGIN (U"Boersma (1993)", U"ppgb", 20030312)
+NORMAL (U"Paul Boersma (1993): \"Accurate short-term analysis of the fundamental frequency "
 	"and the harmonics-to-noise ratio of a sampled sound.\" "
 	"%%Proceedings of the Institute of Phonetic Sciences% #17: 97\\--110. University of Amsterdam.")
-NORMAL (L"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
+NORMAL (U"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
 MAN_END
 
-MAN_BEGIN (L"Boersma (1997)", L"ppgb", 19981219)
-NORMAL (L"Paul Boersma (1997): \"How we learn variation, optionality, and probability.\" "
+MAN_BEGIN (U"Boersma (1997)", U"ppgb", 19981219)
+NORMAL (U"Paul Boersma (1997): \"How we learn variation, optionality, and probability.\" "
 	"%%Proceedings of the Institute of Phonetic Sciences% #21: 43\\--58. University of Amsterdam.")
-NORMAL (L"Available from http://www.fon.hum.uva.nl/paul/. Equals chapter 15 of @@Boersma (1998)@.")
-NORMAL (L"A less correct version (demoting and promoting a single pair of constraints, instead of them all) "
+NORMAL (U"Available from http://www.fon.hum.uva.nl/paul/. Equals chapter 15 of @@Boersma (1998)@.")
+NORMAL (U"A less correct version (demoting and promoting a single pair of constraints, instead of them all) "
 	"is available as Rutgers Optimality Archive #221, http://ruccs.rutgers.edu/roa.html")
 MAN_END
 
-MAN_BEGIN (L"Boersma (1998)", L"ppgb", 20041020)
-NORMAL (L"Paul Boersma (1998): %%Functional Phonology% [%%LOT International Series% ##11#]. "
+MAN_BEGIN (U"Boersma (1998)", U"ppgb", 20041020)
+NORMAL (U"Paul Boersma (1998): %%Functional Phonology% [%%LOT International Series% ##11#]. "
 	"The Hague: Holland Academic Graphics. Pages i-ix, 1-493. [Doctoral thesis, University of Amsterdam]")
-NORMAL (L"This book can be downloaded as a PDF file from ##http://www.fon.hum.uva.nl/paul/#, "
+NORMAL (U"This book can be downloaded as a PDF file from ##http://www.fon.hum.uva.nl/paul/#, "
 	"where you can also find many Praat scripts for the simulations and pictures in this book. "
 	"A paperback version is also available from the author (paul.boersma\\@ uva.nl).")
 MAN_END
 
-MAN_BEGIN (L"Boersma (2000)", L"ppgb", 20001027)
-NORMAL (L"Paul Boersma (2000): \"Learning a grammar in Functional Phonology.\" "
+MAN_BEGIN (U"Boersma (2000)", U"ppgb", 20001027)
+NORMAL (U"Paul Boersma (2000): \"Learning a grammar in Functional Phonology.\" "
 	"In Joost Dekkers, Frank van der Leeuw, & Jeroen van de Weijer (eds.): "
 	"%%Phonology, Syntax, and Acquisition in Optimality Theory%. Oxford University Press.")
-NORMAL (L"An extended version is chapter 14 of @@Boersma (1998)@.")
+NORMAL (U"An extended version is chapter 14 of @@Boersma (1998)@.")
 MAN_END
 
-MAN_BEGIN (L"Boersma (2009a)", L"ppgb", 20100330)
-NORMAL (L"Paul Boersma (2009): \"Should jitter be measured by peak picking or by waveform matching?\" "
+MAN_BEGIN (U"Boersma (2009a)", U"ppgb", 20100330)
+NORMAL (U"Paul Boersma (2009): \"Should jitter be measured by peak picking or by waveform matching?\" "
 	"%%Folia Phoniatrica et Logopaedica% #61: 305\\--308.")
-NORMAL (L"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
+NORMAL (U"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
 MAN_END
 
-MAN_BEGIN (L"Boersma (2009b)", L"ppgb", 20100330)
-NORMAL (L"Paul Boersma (2009b): \"Some correct error-driven versions of the Constraint Demotion algorithm.\" "
+MAN_BEGIN (U"Boersma (2009b)", U"ppgb", 20100330)
+NORMAL (U"Paul Boersma (2009b): \"Some correct error-driven versions of the Constraint Demotion algorithm.\" "
 	"%%Linguistic Inquiry% #40: 667\\--686.")
-NORMAL (L"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
+NORMAL (U"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
 MAN_END
 
-MAN_BEGIN (L"Boersma & Escudero (2008)", L"ppgb", 20100331)
-NORMAL (L"Paul Boersma & Paola Escudero (2008): \"Learning to perceive a smaller L2 vowel inventory: "
+MAN_BEGIN (U"Boersma & Escudero (2008)", U"ppgb", 20100331)
+NORMAL (U"Paul Boersma & Paola Escudero (2008): \"Learning to perceive a smaller L2 vowel inventory: "
 	"an Optimality Theory account.\" In Peter Avery, Elan Dresher & Keren Rice (eds.), "
 	"%%Contrast in phonology: theory, perception, acquisition%. Berlin: Mouton De Gruyter. 271\\--301.")
-NORMAL (L"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
+NORMAL (U"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
 MAN_END
 
-MAN_BEGIN (L"Boersma & Hayes (2001)", L"ppgb", 20020511)
-NORMAL (L"Paul Boersma & Bruce Hayes (2001): \"Empirical tests of the Gradual Learning Algorithm.\" "
+MAN_BEGIN (U"Boersma & Hayes (2001)", U"ppgb", 20020511)
+NORMAL (U"Paul Boersma & Bruce Hayes (2001): \"Empirical tests of the Gradual Learning Algorithm.\" "
 	"%%Linguistic Inquiry% #32: 45\\--86.")
-NORMAL (L"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
+NORMAL (U"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
 MAN_END
 
-MAN_BEGIN (L"Boersma & Kovacic (2006)", L"ppgb", 20061203)
-NORMAL (L"Paul Boersma & Gordana Kovacic (2006): "
+MAN_BEGIN (U"Boersma & Kovacic (2006)", U"ppgb", 20061203)
+NORMAL (U"Paul Boersma & Gordana Kovacic (2006): "
 	"\"Spectral characteristics of three styles of Croatian folk singing.\" "
 	"%%Journal of the Acoustical Society of America% #119: 1805\\--1816.")
-NORMAL (L"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
+NORMAL (U"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
 MAN_END
 
-MAN_BEGIN (L"Boersma & Pater (2008)", L"ppgb", 20100331)
-NORMAL (L"Paul Boersma & Joe Pater (2008): "
+MAN_BEGIN (U"Boersma & Pater (2008)", U"ppgb", 20100331)
+NORMAL (U"Paul Boersma & Joe Pater (2008): "
 	"\"Convergence properties of a gradual learning algorithm for Harmonic Grammar.\" "
 	"%%Rutgers Optimality Archive% #970, http://ruccs.rutgers.edu/roa.html.")
-NORMAL (L"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
+NORMAL (U"Can be downloaded as a PDF file from http://www.fon.hum.uva.nl/paul/")
 MAN_END
 
-MAN_BEGIN (L"Childers (1978)", L"ppgb", 20030515)
-NORMAL (L"%%Modern spectrum analysis%. IEEE Press.")
-NORMAL (L"The Burg algorithm for linear prediction coefficients is described on pages 252-255.")
+MAN_BEGIN (U"Childers (1978)", U"ppgb", 20030515)
+NORMAL (U"%%Modern spectrum analysis%. IEEE Press.")
+NORMAL (U"The Burg algorithm for linear prediction coefficients is described on pages 252-255.")
 MAN_END
 
-MAN_BEGIN (L"Deliyski (1993)", L"ppgb", 20030312)
-NORMAL (L"Dimitar D. Deliyski: \"Acoustic model and evaluation of pathological voice production.\" "
+MAN_BEGIN (U"Deliyski (1993)", U"ppgb", 20030312)
+NORMAL (U"Dimitar D. Deliyski: \"Acoustic model and evaluation of pathological voice production.\" "
 	"%%Proceedings Eurospeech '93%, Vol. 3, 1969\\--1972.")
 MAN_END
 
-MAN_BEGIN (L"Escudero & Boersma (2004)", L"ppgb", 20050427)
-NORMAL (L"Paola Escudero & Paul Boersma (2004): \"Bridging the gap between L2 speech perception "
+MAN_BEGIN (U"Escudero & Boersma (2004)", U"ppgb", 20050427)
+NORMAL (U"Paola Escudero & Paul Boersma (2004): \"Bridging the gap between L2 speech perception "
 	"and phonological theory.\" %%Studies in Second Language Acquisition% #26: 551\\--585.")
 MAN_END
 
-MAN_BEGIN (L"Fant (1960)", L"ppgb", 19980201)
-NORMAL (L"Gunnar Fant (1960): %%Acoustic theory of speech production.% Mouton, The Hague.")
+MAN_BEGIN (U"Fant (1960)", U"ppgb", 19980201)
+NORMAL (U"Gunnar Fant (1960): %%Acoustic theory of speech production.% Mouton, The Hague.")
 MAN_END
 
-MAN_BEGIN (L"Fischer (2005)", L"ppgb", 20100331)
-NORMAL (L"Markus Fischer (2005): \"A Robbins-Monro type learning algorithm for an entropy maximizing version "
+MAN_BEGIN (U"Fischer (2005)", U"ppgb", 20100331)
+NORMAL (U"Markus Fischer (2005): \"A Robbins-Monro type learning algorithm for an entropy maximizing version "
 	"of stochastic Optimality Theory.\" Master’s thesis, Humboldt University, Berlin. "
 	"[%%Rutgers Optimality Archive% #767, http://roa.rutgers.edu/]")
 MAN_END
 
-MAN_BEGIN (L"Flanagan & Landgraf (1968)", L"ppgb", 19980201)
-NORMAL (L"James L. Flanagan & L.L. Landgraf (1968): \"Self-oscillating source for vocal-tract synthesizers.\" "
+MAN_BEGIN (U"Flanagan & Landgraf (1968)", U"ppgb", 19980201)
+NORMAL (U"James L. Flanagan & L.L. Landgraf (1968): \"Self-oscillating source for vocal-tract synthesizers.\" "
 	"%%IEEE Transactions on Audio and Electroacoustics% ##AU-16#: 57-64. "
 	"Reprinted in: James L. Flanagan & Lawrence R. Rabiner (eds.) (1973): "
 	"%%Speech synthesis%, Dowden, Hutchinson & Ross, Stroudsburg.")
-NORMAL (L"The authors show that if we model each vocal cord as a single mass-spring system, "
+NORMAL (U"The authors show that if we model each vocal cord as a single mass-spring system, "
 	"the vocal cords will vibrate passively as a result of the interaction with a glottal airflow.")
 MAN_END
 
-MAN_BEGIN (L"Hayes & MacEachern (1998)", L"ppgb", 19981219)
-NORMAL (L"Bruce P. Hayes & Margaret MacEachern (1998): \"Quatrain form in English folk verse.\" "
+MAN_BEGIN (U"Hayes & MacEachern (1998)", U"ppgb", 19981219)
+NORMAL (U"Bruce P. Hayes & Margaret MacEachern (1998): \"Quatrain form in English folk verse.\" "
 	"%Language #74: 473\\--507.")
 MAN_END
 
-MAN_BEGIN (L"Ishizaka & Flanagan (1972)", L"ppgb", 19980201)
-NORMAL (L"Kenzo Ishizaka & James L. Flanagan (1972): \"Synthesis of voiced sounds from a two-mass model "
+MAN_BEGIN (U"Ishizaka & Flanagan (1972)", U"ppgb", 19980201)
+NORMAL (U"Kenzo Ishizaka & James L. Flanagan (1972): \"Synthesis of voiced sounds from a two-mass model "
 	"of the vocal cords.\" %%Bell System Technical Journal% #51: 1233-1268. "
 	"Reprinted in: James L. Flanagan & Lawrence R. Rabiner (eds.) (1973): "
 	"%%Speech Synthesis%, Dowden, Hutchinson & Ross, Stroudsburg.")
-NORMAL (L"The authors show that if we model each vocal cord as two coupled mass-spring systems, "
+NORMAL (U"The authors show that if we model each vocal cord as two coupled mass-spring systems, "
 	"the passive vibration that results from the interaction with a glottal airflow "
 	"will show more realistic behaviour than with the one-mass model of @@Flanagan & Landgraf (1968)@, "
 	"at least for a male speaker.")
 MAN_END
 
-MAN_BEGIN (L"Jäger (2003)", L"ppgb", 20070423)
-NORMAL (L"Gerhard Jäger (2003): \"Maximum Entropy Models and Stochastic Optimality Theory.\" "
+MAN_BEGIN (U"Jäger (2003)", U"ppgb", 20070423)
+NORMAL (U"Gerhard Jäger (2003): \"Maximum Entropy Models and Stochastic Optimality Theory.\" "
 	"To appear in Jane Grimshaw, Joan Maling, Chris Manning, Jane Simpson, and Annie Zaenen (eds.): "
 	"%%Architectures, rules, and preferences: A Festschrift for Joan Bresnan%, "
 	"CSLI Publications, Stanford.")
 MAN_END
 
-MAN_BEGIN (L"Jesteadt, Wier & Green (1977)", L"ppgb", 20021215)
-NORMAL (L"W. Jesteadt, G.C. Wier, & D.M. Green (1977): \"Intensity discrimination as a function "
+MAN_BEGIN (U"Jesteadt, Wier & Green (1977)", U"ppgb", 20021215)
+NORMAL (U"W. Jesteadt, G.C. Wier, & D.M. Green (1977): \"Intensity discrimination as a function "
 	"of frequency and sensation level.\" %%Journal of the Acoustical Society of America% #61: 169\\--177.")
 MAN_END
 
-MAN_BEGIN (L"Klatt & Klatt (1990)", L"ppgb", 20050712)
-NORMAL (L"D.H. Klatt & L.C. Klatt (1990): \"Analysis, synthesis and perception of voice quality "
+MAN_BEGIN (U"Klatt & Klatt (1990)", U"ppgb", 20050712)
+NORMAL (U"D.H. Klatt & L.C. Klatt (1990): \"Analysis, synthesis and perception of voice quality "
 	"variations among male and female talkers.\" "
 	"%%Journal of the Acoustical Society of America% #87: 820\\--856.")
 MAN_END
 
-MAN_BEGIN (L"Ladefoged (2001)", L"ppgb", 20140325)
-NORMAL (L"Peter Ladefoged (2001). %%Vowels and consonants%: %%an introduction to the sounds of languages%. "
+MAN_BEGIN (U"Ladefoged (2001)", U"ppgb", 20140325)
+NORMAL (U"Peter Ladefoged (2001). %%Vowels and consonants%: %%an introduction to the sounds of languages%. "
 	"Oxford: Blackwell. [second edition: 2005; third edition with Sandra Disner: 2012]")
-NORMAL (L"A very readable introduction to phonetics, mainly acoustic and articulatory. "
+NORMAL (U"A very readable introduction to phonetics, mainly acoustic and articulatory. "
 	"Has lots of spectrograms of the sounds of the world's languages. Comes with a CD that has all those "
 	"sounds and includes training material for transcription (from another book).")
-NORMAL (L"For a more encyclopaedic treatment of the sounds of the world's languages, "
+NORMAL (U"For a more encyclopaedic treatment of the sounds of the world's languages, "
 	"see @@Ladefoged & Maddieson (1996)@ instead.")
 MAN_END
 
-MAN_BEGIN (L"Ladefoged & Maddieson (1996)", L"ppgb", 20030316)
-NORMAL (L"Peter Ladefoged & Ian Maddieson (1996). %%The sounds of the world's languages%. "
+MAN_BEGIN (U"Ladefoged & Maddieson (1996)", U"ppgb", 20030316)
+NORMAL (U"Peter Ladefoged & Ian Maddieson (1996). %%The sounds of the world's languages%. "
 	"Oxford: Blackwell.")
-NORMAL (L"An extensive reference source for the articulation and acoustics of `all' vowels and consonants "
+NORMAL (U"An extensive reference source for the articulation and acoustics of `all' vowels and consonants "
 	"that occur in the world's languages. If you don't find the answer in this book, you will find the "
 	"answer in the articles referred to in this book. "
 	"The book uses lots of spectrograms, palatograms, and other techniques.")
-NORMAL (L"The book is not an introductory text. For that, see @@Ladefoged (2001)@ instead.")
+NORMAL (U"The book is not an introductory text. For that, see @@Ladefoged (2001)@ instead.")
 MAN_END
 
-MAN_BEGIN (L"McCarthy & Prince (1995)", L"ppgb", 20021105)
-NORMAL (L"John J. McCarthy & Alan Prince (1995): Faithfulness and reduplicative identity. "
+MAN_BEGIN (U"McCarthy & Prince (1995)", U"ppgb", 20021105)
+NORMAL (U"John J. McCarthy & Alan Prince (1995): Faithfulness and reduplicative identity. "
 	"In Jill Beckman, Laura Walsh Dickey & Suzanne Urbanczyk (eds.), %%Papers in Optimality Theory%. "
 	"%%University of Massachusetts Occasional Papers% #18. Amherst, Mass.: Graduate Linguistic Student Association. "
 	"pp. 249\\--384. [Rutgers Optimality Archive #60, http://roa.rutgers.edu]")
 MAN_END
 
-MAN_BEGIN (L"Moulines & Charpentier (1990)", L"ppgb", 20070722)
-NORMAL (L"Eric Moulines & Francis Charpentier (1990): Pitch-synchronous waveform processing techniques for text-to-speech synthesis using diphones. "
+MAN_BEGIN (U"Moulines & Charpentier (1990)", U"ppgb", 20070722)
+NORMAL (U"Eric Moulines & Francis Charpentier (1990): Pitch-synchronous waveform processing techniques for text-to-speech synthesis using diphones. "
 	"%%Speech Communication% #9: 453\\--467.")
 MAN_END
 
-MAN_BEGIN (L"Nagarajan, Wang, Merzenich, Schreiner, Johnston, Jenkins, Miller & Tallal (1998)", L"ppgb", 20101026)
-NORMAL (L"Srikantan S. Nagarajan, Xiaoqin Wang, Michael M. Merzenich, Christoph E. Schreiner, Paul Johnston, William M. Jenkins, "
+MAN_BEGIN (U"Nagarajan, Wang, Merzenich, Schreiner, Johnston, Jenkins, Miller & Tallal (1998)", U"ppgb", 20101026)
+NORMAL (U"Srikantan S. Nagarajan, Xiaoqin Wang, Michael M. Merzenich, Christoph E. Schreiner, Paul Johnston, William M. Jenkins, "
 	"Steven Miller & Paula Tallal (1998): Speech modifications algorithms used for training language learning-impaired children. "
 	"%%IEEE Transactions on Rehabilitation Engineering% ##6(3)#: 257\\--268.")
 MAN_END
 
-MAN_BEGIN (L"Pater (2008)", L"ppgb", 20100331)
-NORMAL (L"Joe Pater (2008): \"Gradual learning and convergence.\" %%Linguistic Inquiry% #39: 334\\--345.")
+MAN_BEGIN (U"Pater (2008)", U"ppgb", 20100331)
+NORMAL (U"Joe Pater (2008): \"Gradual learning and convergence.\" %%Linguistic Inquiry% #39: 334\\--345.")
 MAN_END
 
-MAN_BEGIN (L"Pater, Potts & Bhatt (2007)", L"ppgb", 20080331)
-NORMAL (L"Joe Pater, Christopher Potts & Rajesh Bhatt (2007): \"Harmonic Grammar with linear programming.\" "
+MAN_BEGIN (U"Pater, Potts & Bhatt (2007)", U"ppgb", 20080331)
+NORMAL (U"Joe Pater, Christopher Potts & Rajesh Bhatt (2007): \"Harmonic Grammar with linear programming.\" "
 	"Manuscript, University of Massachusetts, Amherst. %%Rutgers Optimality Archive% #872.")
 MAN_END
 
-MAN_BEGIN (L"Patterson & Wightman (1976)", L"ppgb", 20021215)
-NORMAL (L"R. Patterson & F. Wightman (1976): \"Residue pitch as a function of component spacing.\" "
+MAN_BEGIN (U"Patterson & Wightman (1976)", U"ppgb", 20021215)
+NORMAL (U"R. Patterson & F. Wightman (1976): \"Residue pitch as a function of component spacing.\" "
 	"%%Journal of the Acoustical Society of America% #59: 1450\\--1459.")
 MAN_END
 
-MAN_BEGIN (L"Plomp (1967)", L"ppgb", 20021215)
-NORMAL (L"Reinier Plomp (1967): \"Frequencies dominant in the perception of pitch of complex sounds.\" "
+MAN_BEGIN (U"Plomp (1967)", U"ppgb", 20021215)
+NORMAL (U"Reinier Plomp (1967): \"Frequencies dominant in the perception of pitch of complex sounds.\" "
 	"%%Journal of the Acoustical Society of America% #42: 191\\--198.")
 MAN_END
 
-MAN_BEGIN (L"Prince & Smolensky (1993)", L"ppgb", 19971021)
-NORMAL (L"Alan Prince & Paul Smolensky (1993): %%Optimality Theory: Constraint Interaction in Generative Grammar.% "
+MAN_BEGIN (U"Prince & Smolensky (1993)", U"ppgb", 19971021)
+NORMAL (U"Alan Prince & Paul Smolensky (1993): %%Optimality Theory: Constraint Interaction in Generative Grammar.% "
 	"Rutgers University Center for Cognitive Science Technical Report #2.")
 MAN_END
 
-MAN_BEGIN (L"Rosenberg (1971)", L"ppgb", 20050712)
-NORMAL (L"A. Rosenberg (1971): \"Effect of glottal pulse shape on the quality of natural vowels.\" "
+MAN_BEGIN (U"Rosenberg (1971)", U"ppgb", 20050712)
+NORMAL (U"A. Rosenberg (1971): \"Effect of glottal pulse shape on the quality of natural vowels.\" "
 	"%%Journal of the Acoustical Society of America% #49: 583\\--590.")
 MAN_END
 
-MAN_BEGIN (L"Rosenblatt (1962)", L"ppgb", 20070423)
-NORMAL (L"Frank Rosenblatt (1962): "
+MAN_BEGIN (U"Rosenblatt (1962)", U"ppgb", 20070423)
+NORMAL (U"Frank Rosenblatt (1962): "
 	"%%Principles of neurodynamics; perceptrons and the theory of brain mechanisms%. Washington: Spartan Books.")
 MAN_END
 
-MAN_BEGIN (L"Smolensky (1986)", L"ppgb", 20100331)
-NORMAL (L"Paul Smolensky (1986): \"Information processing in dynamical systems: foundations of Harmony Theory.\" "
+MAN_BEGIN (U"Smolensky (1986)", U"ppgb", 20100331)
+NORMAL (U"Paul Smolensky (1986): \"Information processing in dynamical systems: foundations of Harmony Theory.\" "
 	"In @@Rumelhart & McClelland (1986)@, pp. 194\\--281.")
 MAN_END
 
-MAN_BEGIN (L"Rumelhart & McClelland (1986)", L"ppgb", 20100331)
-NORMAL (L"David Rumelhart, James L. McClelland, and the PDP Research Group (eds., 1986): "
+MAN_BEGIN (U"Rumelhart & McClelland (1986)", U"ppgb", 20100331)
+NORMAL (U"David Rumelhart, James L. McClelland, and the PDP Research Group (eds., 1986): "
 	"%%Parallel Distributed Processing: explorations in the microstructure of cognition%. MIT Press, Cambridge.")
 MAN_END
 
-MAN_BEGIN (L"Smolensky & Legendre (2006)", L"ppgb", 20100331)
-NORMAL (L"Paul Smolensky & G\\e'raldine Legendre (2006): %%The harmonic mind.% "
+MAN_BEGIN (U"Smolensky & Legendre (2006)", U"ppgb", 20100331)
+NORMAL (U"Paul Smolensky & G\\e'raldine Legendre (2006): %%The harmonic mind.% "
 	"MIT Press.")
-NORMAL (L"These two books contain all material on connectionism by Smolensky and colleagues from the late eighties on, "
+NORMAL (U"These two books contain all material on connectionism by Smolensky and colleagues from the late eighties on, "
 	"with extensive editing to make it into a coherent work, plus much new material.")
-NORMAL (L"This book can be seen in many respects as the predecessor of @@Prince & Smolensky (1993)@.")
-NORMAL (L"If you want to read a single chapter, I recommend @@Soderstrom, Mathis & Smolensky (2006)@.")
+NORMAL (U"This book can be seen in many respects as the predecessor of @@Prince & Smolensky (1993)@.")
+NORMAL (U"If you want to read a single chapter, I recommend @@Soderstrom, Mathis & Smolensky (2006)@.")
 MAN_END
 
-MAN_BEGIN (L"Soderstrom, Mathis & Smolensky (2006)", L"ppgb", 20070423)
-NORMAL (L"Melanie Soderstrom, Donald Mathis & Paul Smolensky (2006): "
+MAN_BEGIN (U"Soderstrom, Mathis & Smolensky (2006)", U"ppgb", 20070423)
+NORMAL (U"Melanie Soderstrom, Donald Mathis & Paul Smolensky (2006): "
 	"\"Abstract genomic encoding of Universal Grammar in Optimality Theory.\" "
 	"In @@Smolensky & Legendre (2006)@, pp. 403\\--471.")
 MAN_END
 
-MAN_BEGIN (L"Tesar & Smolensky (1998)", L"ppgb", 20100331)
-NORMAL (L"Bruce Tesar & Paul Smolensky (1998): \"Learnability in Optimality Theory.\" "
+MAN_BEGIN (U"Tesar & Smolensky (1998)", U"ppgb", 20100331)
+NORMAL (U"Bruce Tesar & Paul Smolensky (1998): \"Learnability in Optimality Theory.\" "
 	"%%Linguistic Inquiry% #29: 229\\--268.")
-NORMAL (L"The first version of the constraint-demotion algorithm appeared in:")
-NORMAL (L"Bruce Tesar & Paul Smolensky (1993): \"The learnability of Optimality Theory: "
+NORMAL (U"The first version of the constraint-demotion algorithm appeared in:")
+NORMAL (U"Bruce Tesar & Paul Smolensky (1993): \"The learnability of Optimality Theory: "
 	"an algorithm and some basic complexity results.\" "
 	"Manuscript Department of Computer Science & Institute of Cognitive Science, University of Colorado at Boulder. "
 	"Available as Rutgers Optimality Archive #2, http://ruccs.rutgers.edu/roa.html")
-NORMAL (L"The Error-Driven Constraint Demotion algorithm (EDCD) can be found in:")
-NORMAL (L"Bruce Tesar & Paul Smolensky (1996): \"Learnability in Optimality Theory (long version)\". "
+NORMAL (U"The Error-Driven Constraint Demotion algorithm (EDCD) can be found in:")
+NORMAL (U"Bruce Tesar & Paul Smolensky (1996): \"Learnability in Optimality Theory (long version)\". "
  	"Technical Report ##96-3#, Department of Cognitive Science, Johns Hopkins University, Baltimore. "
 	"Available as Rutgers Optimality Archive #156, http://ruccs.rutgers.edu/roa.html")
-NORMAL (L"A corrected version of EDCD appeared in @@Boersma (2009b)@.")
+NORMAL (U"A corrected version of EDCD appeared in @@Boersma (2009b)@.")
 MAN_END
 
-MAN_BEGIN (L"Willems (1986)", L"ppgb", 20021215)
-NORMAL (L"Lei Willems (1986): \"Robust formant analysis.\" %%IPO report% #529: 1\\--25. "
+MAN_BEGIN (U"Willems (1986)", U"ppgb", 20021215)
+NORMAL (U"Lei Willems (1986): \"Robust formant analysis.\" %%IPO report% #529: 1\\--25. "
 	"Eindhoven: Institute for Perception Research.")
 MAN_END
 
diff --git a/fon/manual_sound.cpp b/fon/manual_sound.cpp
index 37d77ce..492d1eb 100644
--- a/fon/manual_sound.cpp
+++ b/fon/manual_sound.cpp
@@ -1,6 +1,6 @@
 /* manual_sound.cpp
  *
- * Copyright (C) 1992-2010,2014 Paul Boersma
+ * Copyright (C) 1992-2010,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,73 +22,75 @@
 #include "Sound.h"
 
 static void draw_SoundDeepen_filter (Graphics g) {
-	Sound s = Sound_createSimple (1, 100, 10);
-	int i;
-	double alpha = sqrt (log (2.0));
-	if (! s) return;
-	Graphics_setWindow (g, 0, 100, 0, 1);
-	for (i = 1; i <= s -> nx; i ++) {
-		double alpha_f = alpha * (s -> x1 + (i - 1) * s -> dx);
-		double slow = alpha_f / 3.0, fast = alpha_f / 30.0;
-		s -> z [1] [i] = exp (- fast * fast) - exp (- slow * slow);
+	try {
+		autoSound s = Sound_createSimple (1, 100.0, 10.0);
+		double alpha = sqrt (log (2.0));
+		Graphics_setWindow (g, 0.0, 100.0, 0.0, 1.0);
+		for (int i = 1; i <= s -> nx; i ++) {
+			double alpha_f = alpha * (s -> x1 + (i - 1) * s -> dx);
+			double slow = alpha_f / 3.0, fast = alpha_f / 30.0;
+			s -> z [1] [i] = exp (- fast * fast) - exp (- slow * slow);
+		}
+		Graphics_drawInnerBox (g);
+		Graphics_textBottom (g, true, U"Frequency %f (Hz)");
+		Graphics_textLeft (g, true, U"Amplitude filter %H (%f)");
+		Graphics_markLeft (g, 0.0, true, true, false, nullptr);
+		Graphics_markLeft (g, 0.5, true, true, true, nullptr);
+		Graphics_markLeft (g, 1.0, true, true, false, nullptr);
+		Graphics_markRight (g, 1.0, false, true, false, U"0 dB");
+		Graphics_markRight (g, 0.5, false, true, false, U"-6 dB");
+		Graphics_markBottom (g, 0.0, true, true, false, nullptr);
+		Graphics_markBottom (g, 3.0, true, true, true, nullptr);
+		Graphics_markBottom (g, 30.0, true, true, true, nullptr);
+		Graphics_markBottom (g, 100.0, true, true, false, nullptr);
+		Graphics_setColour (g, Graphics_RED);
+		Sound_draw (s.get(), g, 0.0, 0.0, 0.0, 1.0, false, U"curve");
+		Graphics_setColour (g, Graphics_BLACK);
+	} catch (MelderError) {
+		Melder_clearError ();
 	}
-	Graphics_drawInnerBox (g);
-	Graphics_textBottom (g, TRUE, L"Frequency %f (Hz)");
-	Graphics_textLeft (g, TRUE, L"Amplitude filter %H (%f)");
-	Graphics_markLeft (g, 0, TRUE, TRUE, FALSE, NULL);
-	Graphics_markLeft (g, 0.5, TRUE, TRUE, TRUE, NULL);
-	Graphics_markLeft (g, 1, TRUE, TRUE, FALSE, NULL);
-	Graphics_markRight (g, 1, FALSE, TRUE, FALSE, L"0 dB");
-	Graphics_markRight (g, 0.5, FALSE, TRUE, FALSE, L"-6 dB");
-	Graphics_markBottom (g, 0, TRUE, TRUE, FALSE, NULL);
-	Graphics_markBottom (g, 3, TRUE, TRUE, TRUE, NULL);
-	Graphics_markBottom (g, 30, TRUE, TRUE, TRUE, NULL);
-	Graphics_markBottom (g, 100, TRUE, TRUE, FALSE, NULL);
-	Graphics_setColour (g, Graphics_RED);
-	Sound_draw (s, g, 0, 0, 0, 1, FALSE, L"curve");
-	Graphics_setColour (g, Graphics_BLACK);
-	forget (s);
 }
 
 static void draw_SoundDeepen_impulse (Graphics g) {
-	Sound s = Sound_create (1, -0.2, 0.2, 1000, 4e-4, -0.1998);
-	int i;
-	double pibyalpha = NUMpi / sqrt (log (2.0)), twosqrtpitimespibyalpha = 2 * sqrt (NUMpi) * pibyalpha;
-	if (! s) return;
-	Graphics_setWindow (g, -0.2, 0.2, -100, 400);
-	for (i = 1; i <= s -> nx; i ++) {
-		double pibyalpha_f = pibyalpha * (s -> x1 + (i - 1) * s -> dx);
-		double slow = pibyalpha_f * 3.0, fast = pibyalpha_f * 30.0;
-		s -> z [1] [i] = twosqrtpitimespibyalpha * (30.0 * exp (- fast * fast) - 3.0 * exp (- slow * slow));
+	try {
+		autoSound s = Sound_create (1, -0.2, 0.2, 1000, 4e-4, -0.1998);
+		double pibyalpha = NUMpi / sqrt (log (2.0)), twosqrtpitimespibyalpha = 2 * sqrt (NUMpi) * pibyalpha;
+		Graphics_setWindow (g, -0.2, 0.2, -100.0, 400.0);
+		for (int i = 1; i <= s -> nx; i ++) {
+			double pibyalpha_f = pibyalpha * (s -> x1 + (i - 1) * s -> dx);
+			double slow = pibyalpha_f * 3.0, fast = pibyalpha_f * 30.0;
+			s -> z [1] [i] = twosqrtpitimespibyalpha * (30.0 * exp (- fast * fast) - 3.0 * exp (- slow * slow));
+		}
+		Graphics_drawInnerBox (g);
+		Graphics_textBottom (g, true, U"Time %t (s)");
+		Graphics_textLeft (g, true, U"Intensity impulse reponse %h (%t)");
+		Graphics_markBottom (g, -0.2, true, true, false, nullptr);
+		Graphics_markBottom (g, 0, true, true, true, nullptr);
+		Graphics_markBottom (g, 0.2, true, true, false, nullptr);
+		Graphics_markLeft (g, 0, true, true, true, nullptr);
+		Graphics_setColour (g, Graphics_RED);
+		Sound_draw (s.get(), g, 0.0, 0.0, -100.0, 400.0, false, U"curve");
+		Graphics_setColour (g, Graphics_BLACK);
+	} catch (MelderError) {
+		Melder_clearError ();
 	}
-	Graphics_drawInnerBox (g);
-	Graphics_textBottom (g, TRUE, L"Time %t (s)");
-	Graphics_textLeft (g, TRUE, L"Intensity impulse reponse %h (%t)");
-	Graphics_markBottom (g, -0.2, TRUE, TRUE, FALSE, NULL);
-	Graphics_markBottom (g, 0, TRUE, TRUE, TRUE, NULL);
-	Graphics_markBottom (g, 0.2, TRUE, TRUE, FALSE, NULL);
-	Graphics_markLeft (g, 0, TRUE, TRUE, TRUE, NULL);
-	Graphics_setColour (g, Graphics_RED);
-	Sound_draw (s, g, 0, 0, -100, 400, FALSE, L"curve");
-	Graphics_setColour (g, Graphics_BLACK);
-	forget (s);
 }
 
 void manual_sound_init (ManPages me);
 void manual_sound_init (ManPages me) {
 
-MAN_BEGIN (L"Combine to stereo", L"ppgb", 20070129)
-INTRO (L"To combine two mono @Sound objects into one single stereo Sound, "
+MAN_BEGIN (U"Combine to stereo", U"ppgb", 20070129)
+INTRO (U"To combine two mono @Sound objects into one single stereo Sound, "
 	"select the two Sounds in the list and choose ##Combine to stereo# from the ##Combine sounds# menu. "
 	"A new stereo Sound will appear in the list.")
-NORMAL (L"Of the two original mono Sounds, the one that is higher in the list will become the left channel "
+NORMAL (U"Of the two original mono Sounds, the one that is higher in the list will become the left channel "
 	"of the new stereo Sound, and the one that is lower in the list will become the right channel of the new Sound.")
 MAN_END
 
-MAN_BEGIN (L"Create Sound from formula...", L"ppgb", 20070225)
-INTRO (L"A command in the @@New menu@ to create a @Sound with a specified duration and sampling frequency, "
+MAN_BEGIN (U"Create Sound from formula...", U"ppgb", 20070225)
+INTRO (U"A command in the @@New menu@ to create a @Sound with a specified duration and sampling frequency, "
 	"filled with values from a formula.")
-NORMAL (L"See the @Formulas tutorial for explanations and examples.")
+NORMAL (U"See the @Formulas tutorial for explanations and examples.")
 /*
 Create Sound from formula... blok Mono 0 1 44100 if round(x*377*2) mod 2 then 0.9 else -0.9 fi
 
@@ -107,331 +109,331 @@ Create Sound from formula... 'Naam' Mono begintijd eindtijd samplefrequentie
 */
 MAN_END
 
-MAN_BEGIN (L"Create Sound from tone complex...", L"ppgb", 20140421)
-INTRO (L"A command in the @@New menu@ to create a @Sound as the sum of a number of sine waves "
+MAN_BEGIN (U"Create Sound from tone complex...", U"ppgb", 20140421)
+INTRO (U"A command in the @@New menu@ to create a @Sound as the sum of a number of sine waves "
 	"with equidistant frequencies.")
-ENTRY (L"Settings")
-TAG (L"##Name")
-DEFINITION (L"the name of the resulting Sound object.")
-TAG (L"##Start time (s)")
-TAG (L"##End time (s)")
-DEFINITION (L"the time domain of the resulting Sound.")
-TAG (L"##Sampling frequency (Hz)")
-DEFINITION (L"the sampling frequency of the resulting Sound.")
-TAG (L"##Phase")
-DEFINITION (L"determines whether the result is a sum of %sines or a sum of %cosines, "
+ENTRY (U"Settings")
+TAG (U"##Name")
+DEFINITION (U"the name of the resulting Sound object.")
+TAG (U"##Start time (s)")
+TAG (U"##End time (s)")
+DEFINITION (U"the time domain of the resulting Sound.")
+TAG (U"##Sampling frequency (Hz)")
+DEFINITION (U"the sampling frequency of the resulting Sound.")
+TAG (U"##Phase")
+DEFINITION (U"determines whether the result is a sum of %sines or a sum of %cosines, "
 	"i.e., whether the zero crossings or the maxima of the components are synchronized. "
 	"This choice has little perceptual consequences.")
-TAG (L"##Frequency step (Hz)")
-DEFINITION (L"the distance between the components. In first approximation, "
+TAG (U"##Frequency step (Hz)")
+DEFINITION (U"the distance between the components. In first approximation, "
 	"this is the perceived fundamental frequency.")
-TAG (L"##First frequency (Hz)")
-DEFINITION (L"the lowest frequency component. If you supply a value of 0, "
+TAG (U"##First frequency (Hz)")
+DEFINITION (U"the lowest frequency component. If you supply a value of 0, "
 	"##First frequency# is taken equal to ##Frequency step#.")
-TAG (L"##Ceiling (Hz)")
-DEFINITION (L"the frequency above which no components are used. If you supply a value of 0 "
+TAG (U"##Ceiling (Hz)")
+DEFINITION (U"the frequency above which no components are used. If you supply a value of 0 "
 	"or a value above the Sound's @@Nyquist frequency@, %ceiling is taken equal to "
 	"the Nyquist frequency.")
-TAG (L"##Number of components")
-DEFINITION (L"determines how many sinusoids are used. If you supply a value of 0 "
+TAG (U"##Number of components")
+DEFINITION (U"determines how many sinusoids are used. If you supply a value of 0 "
 	"or a very high value, the maximum number of components is used, "
 	"limited by #Ceiling.")
-ENTRY (L"Example 1: a pulse train")
-NORMAL (L"A series of pulses at regular intervals, "
+ENTRY (U"Example 1: a pulse train")
+NORMAL (U"A series of pulses at regular intervals, "
 	"sampled after low-pass filtering at the Nyquist frequency, "
 	"can be regarded as a sum of cosine waves. For instance, a 100-Hz pulse train, "
 	"sampled at 44100 Hz, can be created with:")
-CODE (L"Create Sound from tone complex: \"train\", 0, 1, 44100, \"Cosine\", 100, 0, 0, 0")
-NORMAL (L"Supplying the value 0 for %firstFrequency yields an unshifted harmonic complex.")
-ENTRY (L"Example 2: a shifted harmonic complex")
-NORMAL (L"Some experiments on human pitch perception (%%residue pitch%) use "
+CODE (U"Create Sound from tone complex: \"train\", 0, 1, 44100, \"Cosine\", 100, 0, 0, 0")
+NORMAL (U"Supplying the value 0 for %firstFrequency yields an unshifted harmonic complex.")
+ENTRY (U"Example 2: a shifted harmonic complex")
+NORMAL (U"Some experiments on human pitch perception (%%residue pitch%) use "
 	"a number of sinusoidal components with harmonically "
 	"related frequencies that are all shifted by a constant amount.")
-NORMAL (L"For instance, to get a sum of sine waves with frequencies 105 Hz, 205 Hz, and 305 Hz, "
+NORMAL (U"For instance, to get a sum of sine waves with frequencies 105 Hz, 205 Hz, and 305 Hz, "
 	"you would use:")
-CODE (L"Create Sound from tone complex: \"train\", 0.3, 1, 44100, \"Sine\", 100, 105, 0, 3")
-NORMAL (L"or")
-CODE (L"Create Sound from tone complex: \"train\", 0.3, 1, 44100, \"Sine\", 100, 105, 350, 0")
-NORMAL (L"whichever you prefer.")
-NORMAL (L"Some of these experiments are described in @@Plomp (1967)@ and @@Patterson & Wightman (1976)@.")
-ENTRY (L"Algorithm")
-NORMAL (L"For the `sine' phase, the resulting Sound is given by the following formula:")
-NORMAL (L"%x(%t) = \\su__%i=1..%numberOfComponents_ sin (2%\\pi\\.c(%firstFrequency + "
+CODE (U"Create Sound from tone complex: \"train\", 0.3, 1, 44100, \"Sine\", 100, 105, 0, 3")
+NORMAL (U"or")
+CODE (U"Create Sound from tone complex: \"train\", 0.3, 1, 44100, \"Sine\", 100, 105, 350, 0")
+NORMAL (U"whichever you prefer.")
+NORMAL (U"Some of these experiments are described in @@Plomp (1967)@ and @@Patterson & Wightman (1976)@.")
+ENTRY (U"Algorithm")
+NORMAL (U"For the `sine' phase, the resulting Sound is given by the following formula:")
+NORMAL (U"%x(%t) = \\su__%i=1..%numberOfComponents_ sin (2%\\pi\\.c(%firstFrequency + "
 	"(%i\\--1)\\.c%frequencyStep)\\.c%t)")
-ENTRY (L"More flexibility?")
-NORMAL (L"Suppose you wanted to vary the relative strengths of the frequency components. "
+ENTRY (U"More flexibility?")
+NORMAL (U"Suppose you wanted to vary the relative strengths of the frequency components. "
 	"You could achieve this by creating a Sound with the command discussed here, "
 	"take its Fourier transform, run a formula on the resulting Spectrum, "
 	"and take the inverse Fourier transform.")
-NORMAL (L"A more general approach is described shortly.")
-NORMAL (L"Suppose you need a sum of sine waves with frequencies 105, 205, 305, ..., 1905 Hz, "
+NORMAL (U"A more general approach is described shortly.")
+NORMAL (U"Suppose you need a sum of sine waves with frequencies 105, 205, 305, ..., 1905 Hz, "
 	"and with relative amplitudes 1, 1/2, 1/3, ..., 1/19. You could build a script that computes "
 	"the various components, and add them to each other as you go along. Instead of calling 19 "
 	"scripts, however, you can achieve this with the following more general script:")
-CODE (L"form Add waves with decreasing amplitudes")
-CODE1 (L"natural Number_of_components 19")
-CODE (L"endform")
-CODE (L"\\#  Create a Matrix with frequency and amplitude information in each row:")
-CODE (L"Create simple Matrix: \"freqAndGain\", number_of_components, 2, \"0\"")
-CODE (L"Formula: \"if col = 1 then row * 100 + 5 else 1 / row fi\"")
-CODE (L"\\#  Create a large Matrix with all the component sine waves:")
-CODE (L"Create Matrix: \"components\", 0, 1, 10000, 1e-4, 0.5e-4, 1, number_of_components, number_of_components, 1, 1, \"0\"")
-CODE (L"Formula: \"Matrix_freqAndGain [2] * sin (2 * pi * Matrix_freqAndGain [1] * x)\"")
-CODE (L"\\#  Integrate:")
-CODE (L"Formula: \"self + self [row - 1, col]\"")
-CODE (L"\\#  Publish last row:")
-CODE (L"To Sound (slice): number_of_components")
-CODE (L"Scale amplitudes: 0.99")
+CODE (U"form Add waves with decreasing amplitudes")
+CODE1 (U"natural Number_of_components 19")
+CODE (U"endform")
+CODE (U"\\#  Create a Matrix with frequency and amplitude information in each row:")
+CODE (U"Create simple Matrix: \"freqAndGain\", number_of_components, 2, \"0\"")
+CODE (U"Formula: \"if col = 1 then row * 100 + 5 else 1 / row fi\"")
+CODE (U"\\#  Create a large Matrix with all the component sine waves:")
+CODE (U"Create Matrix: \"components\", 0, 1, 10000, 1e-4, 0.5e-4, 1, number_of_components, number_of_components, 1, 1, \"0\"")
+CODE (U"Formula: \"Matrix_freqAndGain [2] * sin (2 * pi * Matrix_freqAndGain [1] * x)\"")
+CODE (U"\\#  Integrate:")
+CODE (U"Formula: \"self + self [row - 1, col]\"")
+CODE (U"\\#  Publish last row:")
+CODE (U"To Sound (slice): number_of_components")
+CODE (U"Scale amplitudes: 0.99")
 MAN_END
 
-MAN_BEGIN (L"Extract one channel...", L"ppgb", 20110129)
-INTRO (L"To extract the left channel of an existing stereo @Sound as a new mono Sound, "
+MAN_BEGIN (U"Extract one channel...", U"ppgb", 20110129)
+INTRO (U"To extract the left channel of an existing stereo @Sound as a new mono Sound, "
 	"select that stereo Sound in the list and choose ##Extract one channel...# from the #Convert menu, "
 	"Then set the #Channel to 1 and click OK. "
 	"A new mono Sound will appear in the list. For the right channel, set #Channel to 2.")
-ENTRY (L"Details")
-NORMAL (L"The name of the new mono Sound will be based on the name of the original stereo Sound. "
+ENTRY (U"Details")
+NORMAL (U"The name of the new mono Sound will be based on the name of the original stereo Sound. "
 	"For instance, if the original Sound is called #hello and you extract channel 2, the new Sound will be called #hello_ch2.")
-NORMAL (L"This command also works if you select more than one stereo Sound. "
+NORMAL (U"This command also works if you select more than one stereo Sound. "
 	"For each of them, Praat creates a new mono Sound.")
 MAN_END
 
-MAN_BEGIN (L"Read separate channels from sound file...", L"ppgb", 20111010)
-INTRO (L"A command in the @@Open menu@ of the #Objects window. "
+MAN_BEGIN (U"Read separate channels from sound file...", U"ppgb", 20111010)
+INTRO (U"A command in the @@Open menu@ of the #Objects window. "
 	"You use this if you want to get the channels of a @stereo (or multi-channel) sound file "
 	"as two (or more) separate @Sound objects in the list. "
 	"If the file name is hello.wav, Praat will name the channels hello_ch1, hello_ch2, and so on.")
 MAN_END
 
-MAN_BEGIN (L"Record mono Sound...", L"ppgb", 20021212)
-INTRO (L"A command in the @@New menu@ to record a @Sound. Creates a @SoundRecorder window, "
+MAN_BEGIN (U"Record mono Sound...", U"ppgb", 20021212)
+INTRO (U"A command in the @@New menu@ to record a @Sound. Creates a @SoundRecorder window, "
 	"except on very old Macintoshes with 8-bit audio, where it presents a native Macintosh sound-recorder window.")
 MAN_END
 
-MAN_BEGIN (L"Record stereo Sound...", L"ppgb", 20021212)
-INTRO (L"A command in the @@New menu@ to record a @Sound. Creates a @SoundRecorder window.")
+MAN_BEGIN (U"Record stereo Sound...", U"ppgb", 20021212)
+INTRO (U"A command in the @@New menu@ to record a @Sound. Creates a @SoundRecorder window.")
 MAN_END
 
-MAN_BEGIN (L"Sound", L"ppgb", 20110131)
-INTRO (L"One of the @@types of objects@ in Praat. For tutorial information, see all of the @Intro.")
-ENTRY (L"Commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"\\bu @@Record mono Sound...@ (from microphone or line input, with the @SoundRecorder)")
-LIST_ITEM (L"\\bu @@Record stereo Sound...@")
-LIST_ITEM (L"\\bu @@Create Sound from formula...@")
-LIST_ITEM (L"\\bu @@Create Sound from tone complex...")
-LIST_ITEM (L"\\bu @@Create Sound from gammatone...")
-LIST_ITEM (L"\\bu @@Create Sound from Shepard tone...")
-NORMAL (L"Opening and saving:")
-LIST_ITEM (L"\\bu @@Sound files")
-NORMAL (L"You can also use the text and binary (real-valued) formats for Sounds, like for any other class:")
-LIST_ITEM (L"\\bu @@Save as text file...")
-LIST_ITEM (L"\\bu @@Save as binary file...")
-NORMAL (L"Playing:")
-LIST_ITEM (L"\\bu @@Sound: Play")
-LIST_ITEM (L"\\bu @@PointProcess: Hum")
-LIST_ITEM (L"\\bu @@PointProcess: Play")
-NORMAL (L"Viewing and editing:")
-LIST_ITEM (L"\\bu @SoundEditor, @ManipulationEditor, @TextGridEditor, @PointEditor, @PitchTierEditor, "
+MAN_BEGIN (U"Sound", U"ppgb", 20110131)
+INTRO (U"One of the @@types of objects@ in Praat. For tutorial information, see all of the @Intro.")
+ENTRY (U"Commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"\\bu @@Record mono Sound...@ (from microphone or line input, with the @SoundRecorder)")
+LIST_ITEM (U"\\bu @@Record stereo Sound...@")
+LIST_ITEM (U"\\bu @@Create Sound from formula...@")
+LIST_ITEM (U"\\bu @@Create Sound from tone complex...")
+LIST_ITEM (U"\\bu @@Create Sound from gammatone...")
+LIST_ITEM (U"\\bu @@Create Sound from Shepard tone...")
+NORMAL (U"Opening and saving:")
+LIST_ITEM (U"\\bu @@Sound files")
+NORMAL (U"You can also use the text and binary (real-valued) formats for Sounds, like for any other class:")
+LIST_ITEM (U"\\bu @@Save as text file...")
+LIST_ITEM (U"\\bu @@Save as binary file...")
+NORMAL (U"Playing:")
+LIST_ITEM (U"\\bu @@Sound: Play")
+LIST_ITEM (U"\\bu @@PointProcess: Hum")
+LIST_ITEM (U"\\bu @@PointProcess: Play")
+NORMAL (U"Viewing and editing:")
+LIST_ITEM (U"\\bu @SoundEditor, @ManipulationEditor, @TextGridEditor, @PointEditor, @PitchTierEditor, "
 	"@SpectrumEditor")
-NORMAL (L"Queries:")
-LIST_ITEM (L"structure:")
-LIST_ITEM1 (L"\\bu @@time domain")
-LIST_ITEM1 (L"\\bu @@Get number of samples")
-LIST_ITEM1 (L"\\bu @@Get sampling period")
-LIST_ITEM1 (L"\\bu @@Get sampling frequency")
-LIST_ITEM1 (L"\\bu @@Get time from sample number...")
-LIST_ITEM1 (L"\\bu @@Get sample number from time...")
-LIST_ITEM (L"content:")
-LIST_ITEM1 (L"\\bu @@Sound: Get value at time...")
-LIST_ITEM1 (L"\\bu @@Sound: Get value at sample number...")
-LIST_ITEM (L"shape:")
-LIST_ITEM1 (L"\\bu @@Sound: Get minimum...")
-LIST_ITEM1 (L"\\bu @@Sound: Get time of minimum...")
-LIST_ITEM1 (L"\\bu @@Sound: Get maximum...")
-LIST_ITEM1 (L"\\bu @@Sound: Get time of maximum...")
-LIST_ITEM1 (L"\\bu @@Sound: Get absolute extremum...")
-LIST_ITEM1 (L"\\bu @@Sound: Get nearest zero crossing...")
-LIST_ITEM (L"statistics:")
-LIST_ITEM1 (L"\\bu @@Sound: Get mean...")
-LIST_ITEM1 (L"\\bu @@Sound: Get root-mean-square...")
-LIST_ITEM1 (L"\\bu @@Sound: Get standard deviation...")
-LIST_ITEM (L"energy:")
-LIST_ITEM1 (L"\\bu @@Sound: Get energy...")
-LIST_ITEM1 (L"\\bu @@Sound: Get power...")
-LIST_ITEM (L"in air:")
-LIST_ITEM1 (L"\\bu @@Sound: Get energy in air")
-LIST_ITEM1 (L"\\bu @@Sound: Get power in air")
-LIST_ITEM1 (L"\\bu @@Sound: Get intensity (dB)")
-NORMAL (L"Modification:")
-LIST_ITEM (L"\\bu @@Matrix: Formula...")
-LIST_ITEM (L"\\bu @@Sound: Set value at sample number...")
-LIST_ITEM (L"\\bu @@Sound: Filter with one formant (in-line)...")
-LIST_ITEM (L"\\bu @@Sound: Pre-emphasize (in-line)...")
-LIST_ITEM (L"\\bu @@Sound: De-emphasize (in-line)...")
-NORMAL (L"Annotation (see @@Intro 7. Annotation@):")
-LIST_ITEM (L"\\bu @@Sound: To TextGrid...")
-NORMAL (L"Periodicity analysis:")
-LIST_ITEM (L"\\bu @@Sound: To Pitch...")
-LIST_ITEM (L"\\bu @@Sound: To Pitch (ac)...")
-LIST_ITEM (L"\\bu @@Sound: To Pitch (cc)...")
-LIST_ITEM (L"\\bu @@Sound: To Pitch (shs)...")
-LIST_ITEM (L"\\bu @@Sound: To Harmonicity (ac)...")
-LIST_ITEM (L"\\bu @@Sound: To Harmonicity (cc)...")
-LIST_ITEM (L"\\bu @@Sound: To PointProcess (periodic, cc)...")
-LIST_ITEM (L"\\bu @@Sound: To PointProcess (periodic, peaks)...")
-LIST_ITEM (L"\\bu @@Sound & Pitch: To PointProcess (cc)")
-LIST_ITEM (L"\\bu @@Sound & Pitch: To PointProcess (peaks)...")
-LIST_ITEM (L"\\bu @@Sound: To Intensity...")
-NORMAL (L"Spectral analysis:")
-LIST_ITEM (L"\\bu @@Sound: To Spectrum...")
-LIST_ITEM (L"\\bu @@Sound: To Spectrogram...")
-LIST_ITEM (L"\\bu @@Sound: To Formant (burg)...")
-LIST_ITEM (L"\\bu @@Sound: To Formant (sl)...")
-LIST_ITEM (L"\\bu @@Sound: LPC analysis")
-LIST_ITEM1 (L"\\bu @@Sound: To LPC (autocorrelation)...")
-LIST_ITEM1 (L"\\bu @@Sound: To LPC (covariance)...")
-LIST_ITEM1 (L"\\bu @@Sound: To LPC (burg)...")
-LIST_ITEM1 (L"\\bu @@Sound: To LPC (marple)...")
-NORMAL (L"Filtering (see @Filtering tutorial):")
-LIST_ITEM (L"\\bu @@Sound: Filter (pass Hann band)...")
-LIST_ITEM (L"\\bu @@Sound: Filter (stop Hann band)...")
-LIST_ITEM (L"\\bu @@Sound: Filter (formula)...")
-LIST_ITEM (L"\\bu @@Sound: Filter (one formant)...")
-LIST_ITEM (L"\\bu @@Sound: Filter (pre-emphasis)...")
-LIST_ITEM (L"\\bu @@Sound: Filter (de-emphasis)...")
-LIST_ITEM (L"\\bu @@LPC & Sound: Filter...")
-LIST_ITEM (L"\\bu @@LPC & Sound: Filter (inverse)")
-LIST_ITEM (L"\\bu @@Sound & Formant: Filter")
-LIST_ITEM (L"\\bu @@Sound & FormantGrid: Filter")
-NORMAL (L"Conversion:")
-LIST_ITEM (L"\\bu @@Sound: Resample...")
-NORMAL (L"Enhancement:")
-LIST_ITEM (L"\\bu @@Sound: Lengthen (overlap-add)...@: lengthen by a constant factor")
-LIST_ITEM (L"\\bu @@Sound: Deepen band modulation...@: strenghten intensity modulations in each critical band")
-NORMAL (L"Combination:")
-LIST_ITEM (L"\\bu @@Sounds: Convolve...")
-LIST_ITEM (L"\\bu @@Sounds: Cross-correlate...")
-LIST_ITEM (L"\\bu @@Sound: Autocorrelate...")
-LIST_ITEM (L"\\bu @@Sounds: Concatenate")
-NORMAL (L"Synthesis")
-LIST_ITEM (L"\\bu @@Source-filter synthesis@ tutorial")
-LIST_ITEM (L"\\bu @Manipulation (@@overlap-add@ etc.)")
-LIST_ITEM (L"\\bu @@Spectrum: To Sound")
-LIST_ITEM (L"\\bu ##Pitch: To Sound...")
-LIST_ITEM (L"\\bu @@PointProcess: To Sound (pulse train)...")
-LIST_ITEM (L"\\bu @@PointProcess: To Sound (hum)...")
-LIST_ITEM (L"\\bu ##Pitch & PointProcess: To Sound...")
-LIST_ITEM (L"\\bu @@Articulatory synthesis@ tutorial")
-LIST_ITEM (L"\\bu @@Artword & Speaker: To Sound...")
-ENTRY (L"Inside a Sound")
-NORMAL (L"With @Inspect, you will see that a Sound contains the following data:")
-TAG (L"%x__%min_")
-DEFINITION (L"start time, in seconds.")
-TAG (L"%x__%max_ > %x__%min_")
-DEFINITION (L"end time, in seconds.")
-TAG (L"%n__%x_")
-DEFINITION (L"the number of samples (\\>_ 1).")
-TAG (L"%dx")
-DEFINITION (L"sample period, in seconds. The inverse of the sampling frequency (in Hz).")
-TAG (L"%x__1_")
-DEFINITION (L"the time associated with the first sample (in seconds). "
+NORMAL (U"Queries:")
+LIST_ITEM (U"structure:")
+LIST_ITEM1 (U"\\bu @@time domain")
+LIST_ITEM1 (U"\\bu @@Get number of samples")
+LIST_ITEM1 (U"\\bu @@Get sampling period")
+LIST_ITEM1 (U"\\bu @@Get sampling frequency")
+LIST_ITEM1 (U"\\bu @@Get time from sample number...")
+LIST_ITEM1 (U"\\bu @@Get sample number from time...")
+LIST_ITEM (U"content:")
+LIST_ITEM1 (U"\\bu @@Sound: Get value at time...")
+LIST_ITEM1 (U"\\bu @@Sound: Get value at sample number...")
+LIST_ITEM (U"shape:")
+LIST_ITEM1 (U"\\bu @@Sound: Get minimum...")
+LIST_ITEM1 (U"\\bu @@Sound: Get time of minimum...")
+LIST_ITEM1 (U"\\bu @@Sound: Get maximum...")
+LIST_ITEM1 (U"\\bu @@Sound: Get time of maximum...")
+LIST_ITEM1 (U"\\bu @@Sound: Get absolute extremum...")
+LIST_ITEM1 (U"\\bu @@Sound: Get nearest zero crossing...")
+LIST_ITEM (U"statistics:")
+LIST_ITEM1 (U"\\bu @@Sound: Get mean...")
+LIST_ITEM1 (U"\\bu @@Sound: Get root-mean-square...")
+LIST_ITEM1 (U"\\bu @@Sound: Get standard deviation...")
+LIST_ITEM (U"energy:")
+LIST_ITEM1 (U"\\bu @@Sound: Get energy...")
+LIST_ITEM1 (U"\\bu @@Sound: Get power...")
+LIST_ITEM (U"in air:")
+LIST_ITEM1 (U"\\bu @@Sound: Get energy in air")
+LIST_ITEM1 (U"\\bu @@Sound: Get power in air")
+LIST_ITEM1 (U"\\bu @@Sound: Get intensity (dB)")
+NORMAL (U"Modification:")
+LIST_ITEM (U"\\bu @@Matrix: Formula...")
+LIST_ITEM (U"\\bu @@Sound: Set value at sample number...")
+LIST_ITEM (U"\\bu @@Sound: Filter with one formant (in-line)...")
+LIST_ITEM (U"\\bu @@Sound: Pre-emphasize (in-line)...")
+LIST_ITEM (U"\\bu @@Sound: De-emphasize (in-line)...")
+NORMAL (U"Annotation (see @@Intro 7. Annotation@):")
+LIST_ITEM (U"\\bu @@Sound: To TextGrid...")
+NORMAL (U"Periodicity analysis:")
+LIST_ITEM (U"\\bu @@Sound: To Pitch...")
+LIST_ITEM (U"\\bu @@Sound: To Pitch (ac)...")
+LIST_ITEM (U"\\bu @@Sound: To Pitch (cc)...")
+LIST_ITEM (U"\\bu @@Sound: To Pitch (shs)...")
+LIST_ITEM (U"\\bu @@Sound: To Harmonicity (ac)...")
+LIST_ITEM (U"\\bu @@Sound: To Harmonicity (cc)...")
+LIST_ITEM (U"\\bu @@Sound: To PointProcess (periodic, cc)...")
+LIST_ITEM (U"\\bu @@Sound: To PointProcess (periodic, peaks)...")
+LIST_ITEM (U"\\bu @@Sound & Pitch: To PointProcess (cc)")
+LIST_ITEM (U"\\bu @@Sound & Pitch: To PointProcess (peaks)...")
+LIST_ITEM (U"\\bu @@Sound: To Intensity...")
+NORMAL (U"Spectral analysis:")
+LIST_ITEM (U"\\bu @@Sound: To Spectrum...")
+LIST_ITEM (U"\\bu @@Sound: To Spectrogram...")
+LIST_ITEM (U"\\bu @@Sound: To Formant (burg)...")
+LIST_ITEM (U"\\bu @@Sound: To Formant (sl)...")
+LIST_ITEM (U"\\bu @@Sound: LPC analysis")
+LIST_ITEM1 (U"\\bu @@Sound: To LPC (autocorrelation)...")
+LIST_ITEM1 (U"\\bu @@Sound: To LPC (covariance)...")
+LIST_ITEM1 (U"\\bu @@Sound: To LPC (burg)...")
+LIST_ITEM1 (U"\\bu @@Sound: To LPC (marple)...")
+NORMAL (U"Filtering (see @Filtering tutorial):")
+LIST_ITEM (U"\\bu @@Sound: Filter (pass Hann band)...")
+LIST_ITEM (U"\\bu @@Sound: Filter (stop Hann band)...")
+LIST_ITEM (U"\\bu @@Sound: Filter (formula)...")
+LIST_ITEM (U"\\bu @@Sound: Filter (one formant)...")
+LIST_ITEM (U"\\bu @@Sound: Filter (pre-emphasis)...")
+LIST_ITEM (U"\\bu @@Sound: Filter (de-emphasis)...")
+LIST_ITEM (U"\\bu @@LPC & Sound: Filter...")
+LIST_ITEM (U"\\bu @@LPC & Sound: Filter (inverse)")
+LIST_ITEM (U"\\bu @@Sound & Formant: Filter")
+LIST_ITEM (U"\\bu @@Sound & FormantGrid: Filter")
+NORMAL (U"Conversion:")
+LIST_ITEM (U"\\bu @@Sound: Resample...")
+NORMAL (U"Enhancement:")
+LIST_ITEM (U"\\bu @@Sound: Lengthen (overlap-add)...@: lengthen by a constant factor")
+LIST_ITEM (U"\\bu @@Sound: Deepen band modulation...@: strenghten intensity modulations in each critical band")
+NORMAL (U"Combination:")
+LIST_ITEM (U"\\bu @@Sounds: Convolve...")
+LIST_ITEM (U"\\bu @@Sounds: Cross-correlate...")
+LIST_ITEM (U"\\bu @@Sound: Autocorrelate...")
+LIST_ITEM (U"\\bu @@Sounds: Concatenate")
+NORMAL (U"Synthesis")
+LIST_ITEM (U"\\bu @@Source-filter synthesis@ tutorial")
+LIST_ITEM (U"\\bu @Manipulation (@@overlap-add@ etc.)")
+LIST_ITEM (U"\\bu @@Spectrum: To Sound")
+LIST_ITEM (U"\\bu ##Pitch: To Sound...")
+LIST_ITEM (U"\\bu @@PointProcess: To Sound (pulse train)...")
+LIST_ITEM (U"\\bu @@PointProcess: To Sound (hum)...")
+LIST_ITEM (U"\\bu ##Pitch & PointProcess: To Sound...")
+LIST_ITEM (U"\\bu @@Articulatory synthesis@ tutorial")
+LIST_ITEM (U"\\bu @@Artword & Speaker: To Sound...")
+ENTRY (U"Inside a Sound")
+NORMAL (U"With @Inspect, you will see that a Sound contains the following data:")
+TAG (U"%x__%min_")
+DEFINITION (U"start time, in seconds.")
+TAG (U"%x__%max_ > %x__%min_")
+DEFINITION (U"end time, in seconds.")
+TAG (U"%n__%x_")
+DEFINITION (U"the number of samples (\\>_ 1).")
+TAG (U"%dx")
+DEFINITION (U"sample period, in seconds. The inverse of the sampling frequency (in Hz).")
+TAG (U"%x__1_")
+DEFINITION (U"the time associated with the first sample (in seconds). "
 	"This will normally be in the range [%xmin, %xmax]. "
 	"The time associated with the last sample (i.e., %x__1_ + (%nx \\-- 1) %dx)) "
 	"will also normally be in that range. Mostly, the sound starts at %t = 0 seconds "
 	"and %x__1_ = %dx / 2. Also, usually, %x__%max_ = %n__%x_ %dx.")
-TAG (L"%z [1] [1..%n__%x_]")
-DEFINITION (L"the amplitude of the sound (stored as single-precision floating-point numbers). "
+TAG (U"%z [1] [1..%n__%x_]")
+DEFINITION (U"the amplitude of the sound (stored as single-precision floating-point numbers). "
 	"For the most common applications (playing and file I-O), Praat assumes that "
 	"the amplitude is greater than -1 and less than +1. "
 	"For some applications (modelling of the inner ear; "
 	"articulatory synthesis), Praat assumes that the amplitude is expressed in Pascal units. "
 	"If these interpretations are combined, we see that the maximum peak amplitude of "
 	"a calibrated sound is 1 Pascal; for a sine wave, this means 91 dB SPL.")
-ENTRY (L"Limitations")
-NORMAL (L"Since the Sound object completely resides in memory, its size is limited "
+ENTRY (U"Limitations")
+NORMAL (U"Since the Sound object completely resides in memory, its size is limited "
 	"to the amount of RAM in your computer. For sounds longer than a few minutes, "
 	"you could use the @LongSound object instead, which you can view in the @LongSoundEditor.")
 MAN_END
 
-MAN_BEGIN (L"Sound: De-emphasize (in-line)...", L"ppgb", 20030309)
-INTRO (L"A command to change the spectral slope of every selected @Sound object.")
-NORMAL (L"The reverse of @@Sound: Pre-emphasize (in-line)... at . For an example, see @@Source-filter synthesis at .")
-NORMAL (L"This is the in-line version of @@Sound: Filter (de-emphasis)...@, "
+MAN_BEGIN (U"Sound: De-emphasize (in-line)...", U"ppgb", 20030309)
+INTRO (U"A command to change the spectral slope of every selected @Sound object.")
+NORMAL (U"The reverse of @@Sound: Pre-emphasize (in-line)... at . For an example, see @@Source-filter synthesis at .")
+NORMAL (U"This is the in-line version of @@Sound: Filter (de-emphasis)...@, "
 	"i.e., it does not create a new Sound object but modifies an existing object.")
-ENTRY (L"Setting")
-TAG (L"##From frequency (Hz)")
-DEFINITION (L"the frequency %F above which the spectral slope will decrease by 6 dB/octave.")
-ENTRY (L"Algorithm")
-NORMAL (L"The de-emphasis factor %\\al is computed as")
-FORMULA (L"%\\al = exp (-2 %\\pi %F \\De%t)")
-NORMAL (L"where \\De%t is the sampling period of the sound. Every sample %x__%i_ of the sound, "
+ENTRY (U"Setting")
+TAG (U"##From frequency (Hz)")
+DEFINITION (U"the frequency %F above which the spectral slope will decrease by 6 dB/octave.")
+ENTRY (U"Algorithm")
+NORMAL (U"The de-emphasis factor %\\al is computed as")
+FORMULA (U"%\\al = exp (-2 %\\pi %F \\De%t)")
+NORMAL (U"where \\De%t is the sampling period of the sound. Every sample %x__%i_ of the sound, "
 	"except %x__1_, is then changed, going up from the second sample:")
-FORMULA (L"%x__%i_ = %x__%i_ + %\\al %x__%i-1_")
+FORMULA (U"%x__%i_ = %x__%i_ + %\\al %x__%i-1_")
 MAN_END
 
-MAN_BEGIN (L"Sound: Deepen band modulation...", L"ppgb", 20101026)
-INTRO (L"A command to enhance the fast spectral changes, like %F__2_ movements, in each selected @Sound object.")
-ENTRY (L"Settings")
-TAG (L"##Enhancement (dB)")
-DEFINITION (L"the maximum increase in the level within each critical band. The standard value is 20 dB.")
-TAG (L"##From frequency (Hz)")
-DEFINITION (L"the lowest frequency that shall be manipulated. The bottom frequency of the first critical band that is to be enhanced. "
+MAN_BEGIN (U"Sound: Deepen band modulation...", U"ppgb", 20101026)
+INTRO (U"A command to enhance the fast spectral changes, like %F__2_ movements, in each selected @Sound object.")
+ENTRY (U"Settings")
+TAG (U"##Enhancement (dB)")
+DEFINITION (U"the maximum increase in the level within each critical band. The standard value is 20 dB.")
+TAG (U"##From frequency (Hz)")
+DEFINITION (U"the lowest frequency that shall be manipulated. The bottom frequency of the first critical band that is to be enhanced. "
 	"The standard value is 300 Hertz.")
-TAG (L"##To frequency (Hz)")
-DEFINITION (L"the highest frequency that shall be manipulated (the last critical band may be narrower than the others). The standard value is 8000 Hz.")
-TAG (L"##Slow modulation (Hz)")
-DEFINITION (L"the frequency %f__%slow_ below which the intensity modulations in the bands should not be expanded. The standard value is 3 Hz.")
-TAG (L"##Fast modulation (Hz)")
-DEFINITION (L"the frequency %f__%fast_ above which the intensity modulations in the bands should not be expanded. The standard value is 30 Hz.")
-TAG (L"##Band smoothing (Hz)")
-DEFINITION (L"the degree of overlap of each band into its adjacent bands. Prevents %ringing. The standard value is 100 Hz.")
-ENTRY (L"Algorithm")
-NORMAL (L"This algorithm was inspired by @@Nagarajan, Wang, Merzenich, Schreiner, Johnston, Jenkins, Miller & Tallal (1998)@, "
+TAG (U"##To frequency (Hz)")
+DEFINITION (U"the highest frequency that shall be manipulated (the last critical band may be narrower than the others). The standard value is 8000 Hz.")
+TAG (U"##Slow modulation (Hz)")
+DEFINITION (U"the frequency %f__%slow_ below which the intensity modulations in the bands should not be expanded. The standard value is 3 Hz.")
+TAG (U"##Fast modulation (Hz)")
+DEFINITION (U"the frequency %f__%fast_ above which the intensity modulations in the bands should not be expanded. The standard value is 30 Hz.")
+TAG (U"##Band smoothing (Hz)")
+DEFINITION (U"the degree of overlap of each band into its adjacent bands. Prevents %ringing. The standard value is 100 Hz.")
+ENTRY (U"Algorithm")
+NORMAL (U"This algorithm was inspired by @@Nagarajan, Wang, Merzenich, Schreiner, Johnston, Jenkins, Miller & Tallal (1998)@, "
 	"but not identical to it. Now follows the description.")
-NORMAL (L"Suppose the settings have their standard values. The resulting sound will composed of the unfiltered part of the original sound, "
+NORMAL (U"Suppose the settings have their standard values. The resulting sound will composed of the unfiltered part of the original sound, "
 	"plus all manipulated bands.")
-NORMAL (L"First, the resulting sound becomes the original sound, stop-band filtered between 300 and 8000 Hz: "
+NORMAL (U"First, the resulting sound becomes the original sound, stop-band filtered between 300 and 8000 Hz: "
 	"after a forward Fourier transform, all values in the @Spectrum at frequencies between 0 and 200 Hz and "
 	"between 8100 Hz and the Nyquist frequency of the sound are retained unchanged. "
 	"The spectral values at frequencies between 400 and 7900 Hz are set to zero. "
 	"Between 200 and 400 Hz and between 7900 and 8100 Hz, the values are multiplied by a raised sine, "
 	"so as to give a smooth transition without ringing in the time domain (the raised sine also allows us to view "
 	"the spectrum as a sum of spectral bands). Finally, a backward Fourier transform gives us the filtered sound.")
-NORMAL (L"The remaining part of the spectrum is divided into %%critical bands%, i.e. frequency bands one Bark wide. "
+NORMAL (U"The remaining part of the spectrum is divided into %%critical bands%, i.e. frequency bands one Bark wide. "
 	"For instance, the first critical band run from 300 to 406 Hz, the second from 406 to 520 Hz, and so on. "
 	"Each critical band is converted to a pass-band filtered sound by means of the backward Fourier transform.")
-NORMAL (L"Each filtered sound will be manipulated, and the resulting manipulated sounds are added to the stop-band filtered sound "
+NORMAL (U"Each filtered sound will be manipulated, and the resulting manipulated sounds are added to the stop-band filtered sound "
 	"we created earlier. If the manipulation is the identity transformation, the resulting sound will be equal to the original sound. "
 	"But, of course, the manipulation does something different. Here are the steps.")
-NORMAL (L"First, we compute the local intensity of the filtered sound %x (%t):")
-FORMULA (L"%intensity (%t) = 10 log__10_ (%x^2 (%t) + 10^^-6^)")
-NORMAL (L"This intensity is subjected to a forward Fourier transform. In the frequency domain, we administer a band filter. "
+NORMAL (U"First, we compute the local intensity of the filtered sound %x (%t):")
+FORMULA (U"%intensity (%t) = 10 log__10_ (%x^2 (%t) + 10^^-6^)")
+NORMAL (U"This intensity is subjected to a forward Fourier transform. In the frequency domain, we administer a band filter. "
 	"We want to enhance the intensity modulation in the range between 3 and 30 Hz. "
 	"We can achieve this by comparing the very smooth intensity contour, low-pass filtered at %f__%slow_ = 3 Hz, "
 	"with the intensity contour that has enough temporal resolution to see the place-discriminating %F__2_ movements, "
 	"which is low-pass filtered at %f__%fast_ = 30 Hz. In the frequency domain, the filter is")
-FORMULA (L"%H (%f) = exp (- (%\\al%f / %f__%fast_)^2) - exp (- (%\\al%f / %f__%slow_)^2)")
-NORMAL (L"where %\\al equals \\Vrln 2 \\~~ 1 / 1.2011224, so that %H (%f) has its -6 dB points at %f__%slow_ and %f__%fast_:")
+FORMULA (U"%H (%f) = exp (- (%\\al%f / %f__%fast_)^2) - exp (- (%\\al%f / %f__%slow_)^2)")
+NORMAL (U"where %\\al equals \\Vrln 2 \\~~ 1 / 1.2011224, so that %H (%f) has its -6 dB points at %f__%slow_ and %f__%fast_:")
 PICTURE (5, 3, draw_SoundDeepen_filter)
-NORMAL (L"Now, why do we use such a flat filter? Because a steep filter would show ringing effects in the time domain, "
+NORMAL (U"Now, why do we use such a flat filter? Because a steep filter would show ringing effects in the time domain, "
 	"dividing the sound into 30-ms chunks. If our filter is a sum of exponentials in the frequency domain, it will also "
 	"be a sum of exponentials in the time domain. The backward Fourier transform of the frequency response %H (%f) "
 	"is the impulse response %h (%t). It is given by")
-FORMULA (L"%h (%t) = 2%\\pi\\Vr%\\pi %f__%fast_/%\\al exp (-(%\\pi%t%f__%fast_/%\\al)^2) - "
+FORMULA (U"%h (%t) = 2%\\pi\\Vr%\\pi %f__%fast_/%\\al exp (-(%\\pi%t%f__%fast_/%\\al)^2) - "
 	"2%\\pi\\Vr%\\pi %f__%slow_/%\\al exp (-(%\\pi%t%f__%slow_/%\\al)^2)")
-NORMAL (L"This impulse response behaves well:")
+NORMAL (U"This impulse response behaves well:")
 PICTURE (5, 3, draw_SoundDeepen_impulse)
-NORMAL (L"We see that any short intensity peak will be enhanced, and that this enhancement will suppress the intensity "
+NORMAL (U"We see that any short intensity peak will be enhanced, and that this enhancement will suppress the intensity "
 	"around 30 milliseconds from the peak. Non-Gaussian frequency-domain filters would have given several maxima and minima "
 	"in the impulse response, clearly an undesirable phenomenon.")
-NORMAL (L"After the filtered band is subjected to a backward Fourier transform, we convert it into power again:")
-FORMULA (L"%power (%t) = 10^^%filtered / 2^")
-NORMAL (L"The relative enhancement has a maximum that is smoothly related to the basilar place:")
-FORMULA (L"%ceiling = 1 + (10^^%enhancement / 20^ - 1) \\.c (1/2 - 1/2 cos (%\\pi %f__%midbark_ / 13))")
-NORMAL (L"where %f__%midbark_ is the mid frequency of the band. Clipping is implemented as")
-FORMULA (L"%factor (%t) = 1 / (1 / %power (%t) + 1 / %ceiling)")
-NORMAL (L"Finally, the original filtered sound %x (%t), multiplied by this factor, is added to the output.")
+NORMAL (U"After the filtered band is subjected to a backward Fourier transform, we convert it into power again:")
+FORMULA (U"%power (%t) = 10^^%filtered / 2^")
+NORMAL (U"The relative enhancement has a maximum that is smoothly related to the basilar place:")
+FORMULA (U"%ceiling = 1 + (10^^%enhancement / 20^ - 1) \\.c (1/2 - 1/2 cos (%\\pi %f__%midbark_ / 13))")
+NORMAL (U"where %f__%midbark_ is the mid frequency of the band. Clipping is implemented as")
+FORMULA (U"%factor (%t) = 1 / (1 / %power (%t) + 1 / %ceiling)")
+NORMAL (U"Finally, the original filtered sound %x (%t), multiplied by this factor, is added to the output.")
 /*
 form Consonantversterker
 	positive Enhancement_(dB) 20
@@ -591,534 +593,534 @@ Ja
 >en -46 dB bij 1.89 seconde. Hoort dat niet?
 */
 
-MAN_BEGIN (L"Sound: Filter (de-emphasis)...", L"ppgb", 20030309)
-INTRO (L"A command to filter every selected @Sound object. The resulting Sound object has a lower spectral slope.")
-NORMAL (L"The reverse of @@Sound: Filter (pre-emphasis)... at . For an example, see @@Source-filter synthesis at .")
-ENTRY (L"Setting")
-TAG (L"##From frequency (Hz)")
-DEFINITION (L"the frequency %F above which the spectral slope will decrease by 6 dB/octave.")
-ENTRY (L"Algorithm")
-NORMAL (L"The de-emphasis factor %\\al is computed as")
-FORMULA (L"%\\al = exp (-2 %\\pi %F \\De%t)")
-NORMAL (L"where \\De%t is the sampling period of the sound. The new sound %y is then computed recursively as:")
-FORMULA (L"%y__1_ = %x__1_")
-FORMULA (L"%y__%i_ = %x__%i_ + %\\al %y__%i-1_")
+MAN_BEGIN (U"Sound: Filter (de-emphasis)...", U"ppgb", 20030309)
+INTRO (U"A command to filter every selected @Sound object. The resulting Sound object has a lower spectral slope.")
+NORMAL (U"The reverse of @@Sound: Filter (pre-emphasis)... at . For an example, see @@Source-filter synthesis at .")
+ENTRY (U"Setting")
+TAG (U"##From frequency (Hz)")
+DEFINITION (U"the frequency %F above which the spectral slope will decrease by 6 dB/octave.")
+ENTRY (U"Algorithm")
+NORMAL (U"The de-emphasis factor %\\al is computed as")
+FORMULA (U"%\\al = exp (-2 %\\pi %F \\De%t)")
+NORMAL (U"where \\De%t is the sampling period of the sound. The new sound %y is then computed recursively as:")
+FORMULA (U"%y__1_ = %x__1_")
+FORMULA (U"%y__%i_ = %x__%i_ + %\\al %y__%i-1_")
 MAN_END
 
-MAN_BEGIN (L"Sound: Filter (formula)...", L"ppgb", 20041123)
-INTRO (L"A command to convert every selected @Sound object into a filtered sound.")
-NORMAL (L"The filtering is done in the frequency domain. This command is equivalent to the following sequence:")
-LIST_ITEM (L"1. @@Sound: To Spectrum...@ yes")
-LIST_ITEM (L"2. @@Matrix: Formula...")
-LIST_ITEM (L"3. @@Spectrum: To Sound")
-NORMAL (L"For a comparative discussion of various filtering methods, see the @Filtering tutorial.")
-NORMAL (L"The example formula is the following:")
-CODE (L"if x<500 or x>1000 then 0 else self fi; rectangular band")
-NORMAL (L"This formula represents a rectangular pass band between 500 Hz and 1000 Hz (%x is the frequency). "
+MAN_BEGIN (U"Sound: Filter (formula)...", U"ppgb", 20041123)
+INTRO (U"A command to convert every selected @Sound object into a filtered sound.")
+NORMAL (U"The filtering is done in the frequency domain. This command is equivalent to the following sequence:")
+LIST_ITEM (U"1. @@Sound: To Spectrum...@ yes")
+LIST_ITEM (U"2. @@Matrix: Formula...")
+LIST_ITEM (U"3. @@Spectrum: To Sound")
+NORMAL (U"For a comparative discussion of various filtering methods, see the @Filtering tutorial.")
+NORMAL (U"The example formula is the following:")
+CODE (U"if x<500 or x>1000 then 0 else self fi; rectangular band")
+NORMAL (U"This formula represents a rectangular pass band between 500 Hz and 1000 Hz (%x is the frequency). "
 	"Rectangular bands are %not recommended, since they may lead to an appreciable amount of %#ringing in the time domain. "
 	"The transition between stop and pass band should be smooth, as e.g. in @@Sound: Filter (pass Hann band)... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: Filter (one formant)...", L"ppgb", 20030309)
-INTRO (L"A command to filter every selected @Sound object, with a single formant of a specified frequency and bandwidth.")
-ENTRY (L"Algorithm")
-NORMAL (L"Two recursive filter coefficients are computed as follows:")
-FORMULA (L"%p = \\--2 exp (\\--%\\pi %bandwidth %dt) cos (2%\\pi %frequency %dt)")
-FORMULA (L"%q = exp (\\--2%\\pi %bandwidth %dt)")
-NORMAL (L"where %dt is the sample period. The new signal %y is then computed from the old signal %x and itself as")
-FORMULA (L"%y__1_ := %x__1_")
-FORMULA (L"%y__2_ := %x__2_ \\-- %p %y__1_")
-FORMULA (L"\\At%n \\>_ 3:   %y__n_ := %x__n_ \\-- %p %y__%n-1_ \\-- %q %y__%n-2_")
-NORMAL (L"After filtering, the sound %y is scaled so that its absolute extremum is 0.9.")
-NORMAL (L"For a comparative discussion of various filtering methods, see the @Filtering tutorial.")
-NORMAL (L"This filter has an in-line version: @@Sound: Filter with one formant (in-line)... at .")
+MAN_BEGIN (U"Sound: Filter (one formant)...", U"ppgb", 20030309)
+INTRO (U"A command to filter every selected @Sound object, with a single formant of a specified frequency and bandwidth.")
+ENTRY (U"Algorithm")
+NORMAL (U"Two recursive filter coefficients are computed as follows:")
+FORMULA (U"%p = \\--2 exp (\\--%\\pi %bandwidth %dt) cos (2%\\pi %frequency %dt)")
+FORMULA (U"%q = exp (\\--2%\\pi %bandwidth %dt)")
+NORMAL (U"where %dt is the sample period. The new signal %y is then computed from the old signal %x and itself as")
+FORMULA (U"%y__1_ := %x__1_")
+FORMULA (U"%y__2_ := %x__2_ \\-- %p %y__1_")
+FORMULA (U"\\At%n \\>_ 3:   %y__n_ := %x__n_ \\-- %p %y__%n-1_ \\-- %q %y__%n-2_")
+NORMAL (U"After filtering, the sound %y is scaled so that its absolute extremum is 0.9.")
+NORMAL (U"For a comparative discussion of various filtering methods, see the @Filtering tutorial.")
+NORMAL (U"This filter has an in-line version: @@Sound: Filter with one formant (in-line)... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: Filter with one formant (in-line)...", L"ppgb", 20030309)
-INTRO (L"A command to filter every selected @Sound object in-line, with a single formant of a specified frequency and bandwidth.")
-NORMAL (L"This is the in-line version of @@Sound: Filter (one formant)...@, "
+MAN_BEGIN (U"Sound: Filter with one formant (in-line)...", U"ppgb", 20030309)
+INTRO (U"A command to filter every selected @Sound object in-line, with a single formant of a specified frequency and bandwidth.")
+NORMAL (U"This is the in-line version of @@Sound: Filter (one formant)...@, "
 	"i.e. it does not create a new Sound object but modifies the selected object.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Filter (pass Hann band)...", L"ppgb", 20041123)
-INTRO (L"A command to convert every selected @Sound object into a filtered sound.")
-NORMAL (L"The filtering is done in the frequency domain. This command is equivalent to the following sequence:")
-LIST_ITEM (L"1. @@Sound: To Spectrum...")
-LIST_ITEM (L"2. @@Spectrum: Filter (pass Hann band)...")
-LIST_ITEM (L"3. @@Spectrum: To Sound")
-NORMAL (L"For a comparative discussion of various filtering methods, see the @Filtering tutorial.")
-NORMAL (L"For a complementary filter, see @@Sound: Filter (stop Hann band)... at .")
+MAN_BEGIN (U"Sound: Filter (pass Hann band)...", U"ppgb", 20041123)
+INTRO (U"A command to convert every selected @Sound object into a filtered sound.")
+NORMAL (U"The filtering is done in the frequency domain. This command is equivalent to the following sequence:")
+LIST_ITEM (U"1. @@Sound: To Spectrum...")
+LIST_ITEM (U"2. @@Spectrum: Filter (pass Hann band)...")
+LIST_ITEM (U"3. @@Spectrum: To Sound")
+NORMAL (U"For a comparative discussion of various filtering methods, see the @Filtering tutorial.")
+NORMAL (U"For a complementary filter, see @@Sound: Filter (stop Hann band)... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: Filter (stop Hann band)...", L"ppgb", 20041123)
-INTRO (L"A command to convert every selected @Sound object into a filtered sound.")
-NORMAL (L"The filtering is done in the frequency domain. This command is equivalent to the following sequence:")
-LIST_ITEM (L"1. @@Sound: To Spectrum...")
-LIST_ITEM (L"2. @@Spectrum: Filter (stop Hann band)...")
-LIST_ITEM (L"3. @@Spectrum: To Sound")
-NORMAL (L"For a comparative discussion of various filtering methods, see the @Filtering tutorial.")
-NORMAL (L"For a complementary filter, see @@Sound: Filter (pass Hann band)... at .")
+MAN_BEGIN (U"Sound: Filter (stop Hann band)...", U"ppgb", 20041123)
+INTRO (U"A command to convert every selected @Sound object into a filtered sound.")
+NORMAL (U"The filtering is done in the frequency domain. This command is equivalent to the following sequence:")
+LIST_ITEM (U"1. @@Sound: To Spectrum...")
+LIST_ITEM (U"2. @@Spectrum: Filter (stop Hann band)...")
+LIST_ITEM (U"3. @@Spectrum: To Sound")
+NORMAL (U"For a comparative discussion of various filtering methods, see the @Filtering tutorial.")
+NORMAL (U"For a complementary filter, see @@Sound: Filter (pass Hann band)... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: Formula...", L"ppgb", 20021206)
-INTRO (L"A command for changing the data in all selected @Sound objects.")
-NORMAL (L"See the @Formulas tutorial for examples and explanations.")
+MAN_BEGIN (U"Sound: Formula...", U"ppgb", 20021206)
+INTRO (U"A command for changing the data in all selected @Sound objects.")
+NORMAL (U"See the @Formulas tutorial for examples and explanations.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get absolute extremum...", L"ppgb", 20040711)
-INTRO (L"A @query to the selected @Sound object.")
-ENTRY (L"Return value")
-NORMAL (L"the absolute extremum (in Pascal) within a specified time window.")
-ENTRY (L"Settings")
-TAG (L"%%Time range% (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+MAN_BEGIN (U"Sound: Get absolute extremum...", U"ppgb", 20040711)
+INTRO (U"A @query to the selected @Sound object.")
+ENTRY (U"Return value")
+NORMAL (U"the absolute extremum (in Pascal) within a specified time window.")
+ENTRY (U"Settings")
+TAG (U"%%Time range% (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the sound is considered.")
-TAG (L"%%Interpolation")
-DEFINITION (L"the interpolation method (None, Parabolic, Sinc) of the @@vector peak interpolation at . "
+TAG (U"%%Interpolation")
+DEFINITION (U"the interpolation method (None, Parabolic, Sinc) of the @@vector peak interpolation at . "
 	"The standard is Sinc70 because a Sound object is normally a sampled band-limited signal, "
 	"which can be seen as a sum of sinc functions.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get energy...", L"ppgb", 20070129)
-INTRO (L"A @query to the selected @Sound object.")
-ENTRY (L"Return value")
-NORMAL (L"the energy. If the unit of sound amplitude is Pa (Pascal), the unit of energy will be Pa^2\\.cs.")
-ENTRY (L"Setting")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+MAN_BEGIN (U"Sound: Get energy...", U"ppgb", 20070129)
+INTRO (U"A @query to the selected @Sound object.")
+ENTRY (U"Return value")
+NORMAL (U"the energy. If the unit of sound amplitude is Pa (Pascal), the unit of energy will be Pa^2\\.cs.")
+ENTRY (U"Setting")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the sound is considered.")
-ENTRY (L"Algorithm")
-NORMAL (L"The energy is defined as")
-FORMULA (L"\\in__%%t%1_^^%%t%2^ %x^2(%t) %dt")
-NORMAL (L"where %x(%t) is the amplitude of the sound. For stereo sounds, it is")
-FORMULA (L"\\in__%%t%1_^^%%t%2^ (%x__1_^2(%t) + %x__2_^2(%t))/2 %dt")
-NORMAL (L"where %x__1_(%t) and %x__2_(%t) are the two channels; this definition ensures that "
+ENTRY (U"Algorithm")
+NORMAL (U"The energy is defined as")
+FORMULA (U"\\in__%%t%1_^^%%t%2^ %x^2(%t) %dt")
+NORMAL (U"where %x(%t) is the amplitude of the sound. For stereo sounds, it is")
+FORMULA (U"\\in__%%t%1_^^%%t%2^ (%x__1_^2(%t) + %x__2_^2(%t))/2 %dt")
+NORMAL (U"where %x__1_(%t) and %x__2_(%t) are the two channels; this definition ensures that "
 	"if you convert a mono sound to a stereo sound, the energy will stay the same.")
-ENTRY (L"See also")
-NORMAL (L"For an interpretation of the energy as the sound energy in air, see @@Sound: Get energy in air at . "
+ENTRY (U"See also")
+NORMAL (U"For an interpretation of the energy as the sound energy in air, see @@Sound: Get energy in air at . "
 	"For the power, see @@Sound: Get power... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get energy in air", L"ppgb", 20070129)
-INTRO (L"A @query to the selected @Sound object.")
-ENTRY (L"Return value")
-NORMAL (L"The energy in air, expressed in Joule/m^2.")
-ENTRY (L"Algorithm")
-NORMAL (L"The energy of a sound in air is defined as")
-FORMULA (L"1 / (%\\roc) \\in %x^2(%t) %dt")
-NORMAL (L"where %x(%t) is the sound pressure in units of Pa (Pascal), %\\ro is the air density "
+MAN_BEGIN (U"Sound: Get energy in air", U"ppgb", 20070129)
+INTRO (U"A @query to the selected @Sound object.")
+ENTRY (U"Return value")
+NORMAL (U"The energy in air, expressed in Joule/m^2.")
+ENTRY (U"Algorithm")
+NORMAL (U"The energy of a sound in air is defined as")
+FORMULA (U"1 / (%\\roc) \\in %x^2(%t) %dt")
+NORMAL (U"where %x(%t) is the sound pressure in units of Pa (Pascal), %\\ro is the air density "
 	"(apx. 1.14 kg/m^3), and %c is the velocity of sound in air (apx. 353 m/s). "
 	"For how stereo sounds are handled, see @@Sound: Get energy... at .")
-ENTRY (L"See also")
-NORMAL (L"For an air-independent interpretation of the energy, see @@Sound: Get energy... at . "
+ENTRY (U"See also")
+NORMAL (U"For an air-independent interpretation of the energy, see @@Sound: Get energy... at . "
 	"For the power, see @@Sound: Get power in air at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get intensity (dB)", L"ppgb", 20070129)
-INTRO (L"A @query to the selected @Sound object.")
-ENTRY (L"Return value")
-NORMAL (L"the intensity in air, expressed in dB relative to the auditory threshold.")
-ENTRY (L"Algorithm")
-NORMAL (L"The intensity of a sound in air is defined as")
-FORMULA (L"10 log__10_ { 1 / (%T %P__0_^2) \\in%dt %x^2(%t) }")
-NORMAL (L"where %x(%t) is the sound pressure in units of Pa (Pascal), %T is the duration of the sound, "
+MAN_BEGIN (U"Sound: Get intensity (dB)", U"ppgb", 20070129)
+INTRO (U"A @query to the selected @Sound object.")
+ENTRY (U"Return value")
+NORMAL (U"the intensity in air, expressed in dB relative to the auditory threshold.")
+ENTRY (U"Algorithm")
+NORMAL (U"The intensity of a sound in air is defined as")
+FORMULA (U"10 log__10_ { 1 / (%T %P__0_^2) \\in%dt %x^2(%t) }")
+NORMAL (U"where %x(%t) is the sound pressure in units of Pa (Pascal), %T is the duration of the sound, "
 	"and %P__0_ = 2\\.c10^^-5^ Pa is the auditory threshold pressure. "
 	"For how stereo sounds are handled, see @@Sound: Get energy... at .")
-ENTRY (L"See also")
-NORMAL (L"For the intensity in Watt/m^2, see @@Sound: Get power in air at . For an auditory intensity, "
+ENTRY (U"See also")
+NORMAL (U"For the intensity in Watt/m^2, see @@Sound: Get power in air at . For an auditory intensity, "
 	"see @@Excitation: Get loudness at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get maximum...", L"ppgb", 20041123)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get maximum...", U"ppgb", 20041123)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the maximum amplitude (sound pressure in Pascal) within a specified time window.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the sound is considered.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is #Sinc70 because a Sound object is normally a sampled band-limited signal, "
 	"which can be seen as a sum of sinc functions.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get mean...", L"ppgb", 20041123)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get mean...", U"ppgb", 20041123)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the mean amplitude (sound pressure in Pascal) within a specified time range.")
-ENTRY (L"Setting")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+ENTRY (U"Setting")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the sound is considered.")
-ENTRY (L"Mathematical definition")
-NORMAL (L"The mean amplitude between the times %t__1_ and %t__2_ is defined as")
-FORMULA (L"1/(%t__2_ - %t__1_)  \\in__%%t%1_^^%%t%2^ %x(%t) %dt")
-NORMAL (L"where %x(%t) is the amplitude of the sound in Pa.")
+ENTRY (U"Mathematical definition")
+NORMAL (U"The mean amplitude between the times %t__1_ and %t__2_ is defined as")
+FORMULA (U"1/(%t__2_ - %t__1_)  \\in__%%t%1_^^%%t%2^ %x(%t) %dt")
+NORMAL (U"where %x(%t) is the amplitude of the sound in Pa.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get minimum...", L"ppgb", 20041123)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get minimum...", U"ppgb", 20041123)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the minimum amplitude (sound pressure in Pascal) within a specified time window.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the sound is considered.")
-TAG (L"%%Interpolation")
-DEFINITION (L"the interpolation method (None, Parabolic, Cubic, Sinc) of the @@vector peak interpolation at . "
+TAG (U"%%Interpolation")
+DEFINITION (U"the interpolation method (None, Parabolic, Cubic, Sinc) of the @@vector peak interpolation at . "
 	"The standard is Sinc70 because a Sound object is normally a sampled band-limited signal, "
 	"which can be seen as a sum of sinc functions.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get nearest zero crossing...", L"ppgb", 20041123)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get nearest zero crossing...", U"ppgb", 20041123)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the time associated with the zero crossing nearest to a specified time point. "
 	"It is @undefined if there are no zero crossings or if the specified time is outside the time domain of the sound. "
 	"Linear interpolation is used between sample points.")
-ENTRY (L"Setting")
-TAG (L"##Time (s)")
-DEFINITION (L"the time for which you want to get the time of the nearest zero crossing.")
+ENTRY (U"Setting")
+TAG (U"##Time (s)")
+DEFINITION (U"the time for which you want to get the time of the nearest zero crossing.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get power...", L"ppgb", 20070129)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get power...", U"ppgb", 20070129)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the power within a specified time window. "
 	"If the unit of sound amplitude is Pa (Pascal), the unit of power will be Pa^2.")
-ENTRY (L"Setting")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+ENTRY (U"Setting")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the sound is considered.")
-ENTRY (L"Mathematical definition")
-NORMAL (L"The power is defined as")
-FORMULA (L"1/(%t__2_-%t__1_)  \\in__%%t%1_^^%%t%2^ %x^2(%t) %dt")
-NORMAL (L"where %x(%t) is the amplitude of the sound. "
+ENTRY (U"Mathematical definition")
+NORMAL (U"The power is defined as")
+FORMULA (U"1/(%t__2_-%t__1_)  \\in__%%t%1_^^%%t%2^ %x^2(%t) %dt")
+NORMAL (U"where %x(%t) is the amplitude of the sound. "
 	"For how stereo sounds are handled, see @@Sound: Get energy... at .")
-ENTRY (L"See also")
-NORMAL (L"For an interpretation of the power as the sound power in air, see @@Sound: Get power in air at . "
+ENTRY (U"See also")
+NORMAL (U"For an interpretation of the power as the sound power in air, see @@Sound: Get power in air at . "
 	"For the total energy, see @@Sound: Get energy... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get power in air", L"ppgb", 20070129)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get power in air", U"ppgb", 20070129)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the power in air, expressed in Watt/m^2.")
-ENTRY (L"Mathematical definition")
-NORMAL (L"The power of a sound in air is defined as")
-FORMULA (L"1 / (%\\rocT) \\in %x^2(%t) %dt")
-NORMAL (L"where %x(%t) is the sound pressure in units of Pa (Pascal), %\\ro is the air density "
+ENTRY (U"Mathematical definition")
+NORMAL (U"The power of a sound in air is defined as")
+FORMULA (U"1 / (%\\rocT) \\in %x^2(%t) %dt")
+NORMAL (U"where %x(%t) is the sound pressure in units of Pa (Pascal), %\\ro is the air density "
 	"(apx. 1.14 kg/m^3), %c is the velocity of sound in air (apx. 353 m/s), and %T is the duration of the sound. "
 	"For how stereo sounds are handled, see @@Sound: Get energy... at .")
-NORMAL (L"For an air-independent interpretation of the power, see @@Sound: Get power... at . "
+NORMAL (U"For an air-independent interpretation of the power, see @@Sound: Get power... at . "
 	"For the energy, see @@Sound: Get energy in air at . For the intensity in dB, "
 	"see @@Sound: Get intensity (dB)@.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get root-mean-square...", L"ppgb", 20070129)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get root-mean-square...", U"ppgb", 20070129)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the root-mean-square (rms) value of the sound pressure, expressed in Pascal.")
-ENTRY (L"Setting")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+ENTRY (U"Setting")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the sound is considered.")
-ENTRY (L"Mathematical definition")
-NORMAL (L"The root-mean-square value is defined as")
-FORMULA (L"\\Vr { 1/(%t__2_-%t__1_)  \\in__%%t%1_^^%%t%2^ %x^2(%t) %dt }")
-NORMAL (L"where %x(%t) is the amplitude of the sound. "
+ENTRY (U"Mathematical definition")
+NORMAL (U"The root-mean-square value is defined as")
+FORMULA (U"\\Vr { 1/(%t__2_-%t__1_)  \\in__%%t%1_^^%%t%2^ %x^2(%t) %dt }")
+NORMAL (U"where %x(%t) is the amplitude of the sound. "
 	"For how stereo sounds are handled, see @@Sound: Get energy... at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get standard deviation...", L"ppgb", 20041123)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get standard deviation...", U"ppgb", 20041123)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the standard deviation (in Pascal) of the sound pressure within a specified window. "
 	"If the sound contains less than 2 samples, the value is @undefined.")
-ENTRY (L"Setting")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+ENTRY (U"Setting")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the sound is considered.")
-ENTRY (L"Mathematical definition")
-NORMAL (L"The standard deviation is defined as")
-FORMULA (L"1/(%t__2_-%t__1_)  \\in%__%%t%1_^^%%t%2^ (%x(%t) - %\\mu)^2 %dt")
-NORMAL (L"where %x(%t) is the amplitude of the sound, and %\\mu is its mean. "
+ENTRY (U"Mathematical definition")
+NORMAL (U"The standard deviation is defined as")
+FORMULA (U"1/(%t__2_-%t__1_)  \\in%__%%t%1_^^%%t%2^ (%x(%t) - %\\mu)^2 %dt")
+NORMAL (U"where %x(%t) is the amplitude of the sound, and %\\mu is its mean. "
 	"For our discrete Sound object, the standard deviation is approximated by")
-FORMULA (L"1/(%n-1) \\su__%i=%m..%m+%n-1_ (%x__%i_ - %\\mu)^2")
-NORMAL (L"where %n is the number of sample centres between %t__1_ and %t__2_. Note the \"minus 1\".")
+FORMULA (U"1/(%n-1) \\su__%i=%m..%m+%n-1_ (%x__%i_ - %\\mu)^2")
+NORMAL (U"where %n is the number of sample centres between %t__1_ and %t__2_. Note the \"minus 1\".")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get time of maximum...", L"ppgb", 20041123)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get time of maximum...", U"ppgb", 20041123)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the time (in seconds) associated with the maximum pressure in a specified time range.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the sound is considered.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is #Sinc70 because a Sound object is normally a sampled band-limited signal, "
 	"which can be seen as a sum of sinc functions.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get time of minimum...", L"ppgb", 20041107)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get time of minimum...", U"ppgb", 20041107)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the time (in seconds) associated with the minimum pressure in a specified time range.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored, except for purposes of interpolation. "
 	"If %t__1_ is not less than %t__2_, the entire time domain of the sound is considered.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is #Sinc70 because a Sound object is normally a sampled band-limited signal, "
 	"which can be seen as a sum of sinc functions.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get value at sample number...", L"ppgb", 20040420)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get value at sample number...", U"ppgb", 20040420)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show the amplitude (sound pressure in Pascal) at a specified sample number. "
 	"If the sample number is less than 1 or greater than the number of samples, the result is @undefined.")
-ENTRY (L"Setting")
-TAG (L"##Sample number")
-DEFINITION (L"the sample number at which the value is to be evaluated.")
+ENTRY (U"Setting")
+TAG (U"##Sample number")
+DEFINITION (U"the sample number at which the value is to be evaluated.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Get value at time...", L"ppgb", 20030916)
-INTRO (L"A command available in the #Query menu if you select a @Sound object. "
+MAN_BEGIN (U"Sound: Get value at time...", U"ppgb", 20030916)
+INTRO (U"A command available in the #Query menu if you select a @Sound object. "
 	"The Info window will show an estimate of the amplitude (sound pressure in Pascal) at a specified time. "
 	"If that time is outside the samples of the Sound, the result is equal to the value of the nearest sample; "
 	"otherwise, the result is an interpolated value.")
-ENTRY (L"Settings")
-TAG (L"##Time (s)")
-DEFINITION (L"the time at which the value is to be evaluated.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method, see @@vector value interpolation at . "
+ENTRY (U"Settings")
+TAG (U"##Time (s)")
+DEFINITION (U"the time at which the value is to be evaluated.")
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method, see @@vector value interpolation at . "
 	"The standard is #Sinc70 because a Sound object is normally a sampled band-limited signal, "
 	"which can be seen as a sum of sinc functions.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Lengthen (overlap-add)...", L"ppgb", 20030916)
-INTRO (L"A command to convert each selected @Sound object into a longer new @Sound object.")
-ENTRY (L"Settings")
-TAG (L"##Minimum frequency (Hz)")
-DEFINITION (L"the minimum pitch used in the periodicity analysis. The standard value is 75 Hz. For the voice of a young child, set this to 150 Hz."
+MAN_BEGIN (U"Sound: Lengthen (overlap-add)...", U"ppgb", 20030916)
+INTRO (U"A command to convert each selected @Sound object into a longer new @Sound object.")
+ENTRY (U"Settings")
+TAG (U"##Minimum frequency (Hz)")
+DEFINITION (U"the minimum pitch used in the periodicity analysis. The standard value is 75 Hz. For the voice of a young child, set this to 150 Hz."
 	"The shortest voiceless interval in the decomposition is taken as 1.5 divided by %%minimum frequency%.")
-TAG (L"##Maximum frequency (Hz)")
-DEFINITION (L"the maximum pitch used in the periodicity analysis. The standard value is 600 Hz. For an adult male voice, set this to 300 Hz.")
-TAG (L"##Factor")
-DEFINITION (L"the factor with which the sound will be lengthened. The standard value is 1.5. If you take a value less than 1, "
+TAG (U"##Maximum frequency (Hz)")
+DEFINITION (U"the maximum pitch used in the periodicity analysis. The standard value is 600 Hz. For an adult male voice, set this to 300 Hz.")
+TAG (U"##Factor")
+DEFINITION (U"the factor with which the sound will be lengthened. The standard value is 1.5. If you take a value less than 1, "
 	"the resulting sound will be shorter than the original. A value larger than 3 will not work.")
-ENTRY (L"Algorithm")
-NORMAL (L"@@overlap-add at .")
+ENTRY (U"Algorithm")
+NORMAL (U"@@overlap-add at .")
 MAN_END
 
-MAN_BEGIN (L"audio control panel", L"ppgb", 20050822)
-INTRO (L"Your system's way of controlling where sounds will be played, and how loud.")
-NORMAL (L"On Windows, double-click the loudspeaker icon in the Start bar. "
+MAN_BEGIN (U"audio control panel", U"ppgb", 20050822)
+INTRO (U"Your system's way of controlling where sounds will be played, and how loud.")
+NORMAL (U"On Windows, double-click the loudspeaker icon in the Start bar. "
 	"On MacOS X, go to ##System Preferences#, then to #Sound, then to ##Output Volume# "
 	"(you can put a loudspeaker icon in OSX's menu bar here). "
 	"On HP-UX, try the ##Use internal loudspeaker...# preference in Praat's #Preferences menu.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Play", L"ppgb", 20050822)
-INTRO (L"A command to play @Sound objects.")
-ENTRY (L"Availability")
-NORMAL (L"You can choose this command after selecting one or more Sounds.")
-ENTRY (L"Purpose")
-NORMAL (L"To play the selected Sounds through the internal or external loudspeakers, "
+MAN_BEGIN (U"Sound: Play", U"ppgb", 20050822)
+INTRO (U"A command to play @Sound objects.")
+ENTRY (U"Availability")
+NORMAL (U"You can choose this command after selecting one or more Sounds.")
+ENTRY (U"Purpose")
+NORMAL (U"To play the selected Sounds through the internal or external loudspeakers, "
 	"the headphones, or the analog or digital outputs of your computer.")
-ENTRY (L"Behaviour")
-NORMAL (L"All of the Sounds selected are played, "
+ENTRY (U"Behaviour")
+NORMAL (U"All of the Sounds selected are played, "
 	"in the order in which they appear in the list. If the sampling frequency of the Sound does not match any of "
 	"the system's sampling frequencies, a fast but inaccurate conversion is performed via linear interpolation.")
-ENTRY (L"Usage")
-NORMAL (L"The output level and the choice of the output device(s) depend on the settings "
+ENTRY (U"Usage")
+NORMAL (U"The output level and the choice of the output device(s) depend on the settings "
 	"in your @@audio control panel at .")
 MAN_END
 
-MAN_BEGIN (L"Sound: Filter (pre-emphasis)...", L"ppgb", 20030309)
-INTRO (L"A command to filter each selected @Sound object. The resulting Sound object has a higher spectral slope.")
-NORMAL (L"The reverse of @@Sound: Filter (de-emphasis)... at .")
-ENTRY (L"Setting")
-TAG (L"##From frequency (Hz)")
-DEFINITION (L"the frequency %F above which the spectral slope will increase by 6 dB/octave.")
-ENTRY (L"Algorithm")
-NORMAL (L"The pre-emphasis factor %\\al is computed as")
-FORMULA (L"%\\al = exp (-2 %\\pi %F \\De%t)")
-NORMAL (L"where \\De%t is the sampling period of the sound. The new sound %y is then computed as:")
-FORMULA (L"%y__%i_ = %x__%i_ - %\\al %x__%i-1_")
+MAN_BEGIN (U"Sound: Filter (pre-emphasis)...", U"ppgb", 20030309)
+INTRO (U"A command to filter each selected @Sound object. The resulting Sound object has a higher spectral slope.")
+NORMAL (U"The reverse of @@Sound: Filter (de-emphasis)... at .")
+ENTRY (U"Setting")
+TAG (U"##From frequency (Hz)")
+DEFINITION (U"the frequency %F above which the spectral slope will increase by 6 dB/octave.")
+ENTRY (U"Algorithm")
+NORMAL (U"The pre-emphasis factor %\\al is computed as")
+FORMULA (U"%\\al = exp (-2 %\\pi %F \\De%t)")
+NORMAL (U"where \\De%t is the sampling period of the sound. The new sound %y is then computed as:")
+FORMULA (U"%y__%i_ = %x__%i_ - %\\al %x__%i-1_")
 MAN_END
 
-MAN_BEGIN (L"Sound: Pre-emphasize (in-line)...", L"ppgb", 20030309)
-INTRO (L"A command to change the spectral slope of every selected @Sound object.")
-NORMAL (L"The reverse of @@Sound: De-emphasize (in-line)... at .")
-NORMAL (L"This is the in-line version of @@Sound: Filter (pre-emphasis)...@, "
+MAN_BEGIN (U"Sound: Pre-emphasize (in-line)...", U"ppgb", 20030309)
+INTRO (U"A command to change the spectral slope of every selected @Sound object.")
+NORMAL (U"The reverse of @@Sound: De-emphasize (in-line)... at .")
+NORMAL (U"This is the in-line version of @@Sound: Filter (pre-emphasis)...@, "
 	"i.e., it does not create a new Sound object but modifies an existing object.")
-ENTRY (L"Algorithm")
-NORMAL (L"The pre-emphasis factor %\\al is computed as")
-FORMULA (L"%\\al = exp (-2 %\\pi %F \\De%t)")
-NORMAL (L"where \\De%t is the sampling period of the sound. Every sample %x__%i_ of the sound, "
+ENTRY (U"Algorithm")
+NORMAL (U"The pre-emphasis factor %\\al is computed as")
+FORMULA (U"%\\al = exp (-2 %\\pi %F \\De%t)")
+NORMAL (U"where \\De%t is the sampling period of the sound. Every sample %x__%i_ of the sound, "
 	"except %x__1_, is then changed, going down from the last sample:")
-FORMULA (L"%x__%i_ = %x__%i_ - %\\al %x__%i-1_")
+FORMULA (U"%x__%i_ = %x__%i_ - %\\al %x__%i-1_")
 MAN_END
 
-MAN_BEGIN (L"Sound: Resample...", L"ppgb", 20040330)
-INTRO (L"A command that creates new @Sound objects from the selected Sounds.")
-ENTRY (L"Purpose")
-NORMAL (L"High-precision resampling from any sampling frequency to any other sampling frequency.")
-ENTRY (L"Settings")
-TAG (L"##Sampling frequency (Hz)")
-DEFINITION (L"the new sampling frequency, in hertz.")
-TAG (L"##Precision")
-DEFINITION (L"the depth of the interpolation, in samples (standard is 50). "
+MAN_BEGIN (U"Sound: Resample...", U"ppgb", 20040330)
+INTRO (U"A command that creates new @Sound objects from the selected Sounds.")
+ENTRY (U"Purpose")
+NORMAL (U"High-precision resampling from any sampling frequency to any other sampling frequency.")
+ENTRY (U"Settings")
+TAG (U"##Sampling frequency (Hz)")
+DEFINITION (U"the new sampling frequency, in hertz.")
+TAG (U"##Precision")
+DEFINITION (U"the depth of the interpolation, in samples (standard is 50). "
 	"This determines the quality of the interpolation used in resampling.")
-ENTRY (L"Algorithm")
-NORMAL (L"If #Precision is 1, the method is linear interpolation, which is inaccurate but fast.")
+ENTRY (U"Algorithm")
+NORMAL (U"If #Precision is 1, the method is linear interpolation, which is inaccurate but fast.")
 /* BUG */
-NORMAL (L"If #Precision is greater than 1, the method is sin(%x)/%x (\"%sinc\") interpolation, "
+NORMAL (U"If #Precision is greater than 1, the method is sin(%x)/%x (\"%sinc\") interpolation, "
 	"with a depth equal to #Precision. "
 	"For higher #Precision, the algorithm is slower but more accurate.")
-NORMAL (L"If ##Sampling frequency# is less than the sampling frequency of the selected sound, "
+NORMAL (U"If ##Sampling frequency# is less than the sampling frequency of the selected sound, "
 	"an anti-aliasing low-pass filtering is performed prior to resampling.")
-ENTRY (L"Behaviour")
-NORMAL (L"A new Sound will appear in the list of objects, "
+ENTRY (U"Behaviour")
+NORMAL (U"A new Sound will appear in the list of objects, "
 	"bearing the same name as the original Sound, followed by the sampling frequency. "
 	"For instance, the Sound \"hallo\" will give a new Sound \"hallo_10000\".")
 MAN_END
 
-MAN_BEGIN (L"Sound: Set value at sample number...", L"ppgb", 20140421)
-INTRO (L"A command to change a specified sample of the selected @Sound object.")
-ENTRY (L"Settings")
-TAG (L"##Sample number")
-DEFINITION (L"the sample whose value is to be changed. Specify any value between 1 and the number of samples in the Sound. "
+MAN_BEGIN (U"Sound: Set value at sample number...", U"ppgb", 20140421)
+INTRO (U"A command to change a specified sample of the selected @Sound object.")
+ENTRY (U"Settings")
+TAG (U"##Sample number")
+DEFINITION (U"the sample whose value is to be changed. Specify any value between 1 and the number of samples in the Sound. "
 	"If you specify a value outside that range, you will get an error message.")
-TAG (L"##New value")
-DEFINITION (L"the value that is to be put into the specified sample.")
-ENTRY (L"Scripting")
-NORMAL (L"Example:")
-CODE (L"selectObject: \"Sound hallo\"")
-CODE (L"Set value at sample number: 100, 1/2")
-NORMAL (L"This sets the value of the 100th sample to 0.5.")
+TAG (U"##New value")
+DEFINITION (U"the value that is to be put into the specified sample.")
+ENTRY (U"Scripting")
+NORMAL (U"Example:")
+CODE (U"selectObject: \"Sound hallo\"")
+CODE (U"Set value at sample number: 100, 1/2")
+NORMAL (U"This sets the value of the 100th sample to 0.5.")
 MAN_END
 
-MAN_BEGIN (L"SoundEditor", L"ppgb", 20100404)
-INTRO (L"An @@Editors|Editor@ for viewing and editing a @Sound object. "
+MAN_BEGIN (U"SoundEditor", U"ppgb", 20100404)
+INTRO (U"An @@Editors|Editor@ for viewing and editing a @Sound object. "
 	"Most of the functions of this editor are described in the @Intro.")
-ENTRY (L"The markers")
-NORMAL (L"To set the cursor, use the left mouse button. A short horizontal line will also be shown at the left edge (in cyan); "
+ENTRY (U"The markers")
+NORMAL (U"To set the cursor, use the left mouse button. A short horizontal line will also be shown at the left edge (in cyan); "
 	"the extension of this line crosses the cursor line at the sound's function value (seen as a cyan dot). "
 	"This function value (shown at the left in cyan) is the sinc-interpolated value, and is generally different from the "
 	"value that you would expect when looking at the linearly interpolated version of the sampled sound.")
-NORMAL (L"To select a part of the time domain, use the @@time selection@ mechanism.")
-ENTRY (L"Playing")
-NORMAL (L"To play any part of the sound, click on one of the rectangles "
+NORMAL (U"To select a part of the time domain, use the @@time selection@ mechanism.")
+ENTRY (U"Playing")
+NORMAL (U"To play any part of the sound, click on one of the rectangles "
 	"below or above the sound window (there can be 1 to 8 of these rectangles), "
 	"or choose a Play command from the View menu.")
-ENTRY (L"Publishing")
-NORMAL (L"To perform analyses on the selection, or save it to a file, "
+ENTRY (U"Publishing")
+NORMAL (U"To perform analyses on the selection, or save it to a file, "
 	"create an independent Sound as a copy of the selection, "
 	"by clicking on the button that will copy the selection to the List of Objects; "
 	"the resulting Sound will be called \"Sound untitled\".")
-ENTRY (L"Editing")
-LIST_ITEM (L"\\bu Cut: cut the selection to the clipboard, for later pasting into the same or another Sound.")
-LIST_ITEM (L"\\bu Copy selection to Sound clipboard: copy the selection to the clipboard, for later pasting into the same or another Sound.")
-LIST_ITEM (L"\\bu Paste after selection: paste the clipboard to the cursor or after the selection.")
-LIST_ITEM (L"\\bu Set selection to zero: set the selected samples to zero.")
-LIST_ITEM (L"\\bu Reverse selection: reverse the selected part of the sound.")
-NORMAL (L"You can undo these commands with Undo (Command-Z).")
-ENTRY (L"The Group button")
-NORMAL (L"To synchronize a SoundEditor window with other windows that show a time signal, "
+ENTRY (U"Editing")
+LIST_ITEM (U"\\bu Cut: cut the selection to the clipboard, for later pasting into the same or another Sound.")
+LIST_ITEM (U"\\bu Copy selection to Sound clipboard: copy the selection to the clipboard, for later pasting into the same or another Sound.")
+LIST_ITEM (U"\\bu Paste after selection: paste the clipboard to the cursor or after the selection.")
+LIST_ITEM (U"\\bu Set selection to zero: set the selected samples to zero.")
+LIST_ITEM (U"\\bu Reverse selection: reverse the selected part of the sound.")
+NORMAL (U"You can undo these commands with Undo (Command-Z).")
+ENTRY (U"The Group button")
+NORMAL (U"To synchronize a SoundEditor window with other windows that show a time signal, "
 	"push the Group button in all the windows that you want to synchronize. "
 	"You cannot Cut from or Paste into a synchronized SoundEditor window.")
 MAN_END
 
-MAN_BEGIN (L"SoundRecorder", L"ppgb", 20110129)
-INTRO (L"With the Praat SoundRecorder window you can record a mono or stereo sound "
+MAN_BEGIN (U"SoundRecorder", U"ppgb", 20110129)
+INTRO (U"With the Praat SoundRecorder window you can record a mono or stereo sound "
 	"for subsequent viewing and analysis in Praat. "
 	"The SoundRecorder appears on your screen if you choose @@Record mono Sound...@ or @@Record stereo Sound...@ "
 	"from the @@New menu at .")
-NORMAL (L"Depending on your system, the SoundRecorder window may allow you to choose "
+NORMAL (U"Depending on your system, the SoundRecorder window may allow you to choose "
 	"the sampling frequency, the input gain, and the input device (microphone, line, or digital). "
 	"The sound input level is monitored continuously with one or two meters. "
 	"The resulting sound has 16 bits per sample, like sounds on an audio CD.")
-ENTRY (L"Usage")
-NORMAL (L"To record the sound, use the Record and Stop buttons in the SoundRecorder window. "
+ENTRY (U"Usage")
+NORMAL (U"To record the sound, use the Record and Stop buttons in the SoundRecorder window. "
 	"Click ##Save to list# to copy the recorded sound to the object window "
 	"(or ##Save left channel to list# or ##Save right channel to list# "
 	"to copy the left or right channel if you have a stereo sound). "
 	"The name of the resulting Sound object will be taken from the text field next to the button clicked.")
-ENTRY (L"Size of the recording buffer")
-NORMAL (L"The size of the recording buffer determines how many seconds of sound you can record. "
+ENTRY (U"Size of the recording buffer")
+NORMAL (U"The size of the recording buffer determines how many seconds of sound you can record. "
 	"For instance, if the recording buffer is 20 megabytes (the standard value), you can record 220 seconds in stereo "
 	"(440 seconds in mono) at a sampling frequency of 22050 Hz, "
 	"or 110 seconds in stereo (220 seconds in mono) at a sampling frequency of 44100 Hz. "
 	"You can change the size of the recording buffer "
 	"with ##Sound input prefs...# from the Preferences menu.")
-NORMAL (L"If you recorded a very long sound, it is probable that you cannot copy it to the list of objects. "
+NORMAL (U"If you recorded a very long sound, it is probable that you cannot copy it to the list of objects. "
 	"In such a case, you can still write the sound to disk with one of the #Save commands in the #File menu. "
 	"You can then open such a long sound file in Praat with @@Open long sound file...@ from the Open menu.")
 #ifdef macintosh
-ENTRY (L"Recording sounds on MacOS X")
-NORMAL (L"You can record from the combined microphone / line input. On some computers, these are separate.")
-NORMAL (L"Note that in MacOS X you cannot record from the internal CD. This is because the system provides you with something better. "
+ENTRY (U"Recording sounds on MacOS X")
+NORMAL (U"You can record from the combined microphone / line input. On some computers, these are separate.")
+NORMAL (U"Note that in MacOS X you cannot record from the internal CD. This is because the system provides you with something better. "
 	"If you open the CD in the Finder, you will see the audio tracks as AIFC files! "
 	"To open these audio tracks in Praat, use @@Read from file...@ or @@Open long sound file... at .")
 #endif
 #ifdef _WIN32
-ENTRY (L"Recording sounds in Windows")
-NORMAL (L"In Windows, you can choose your input device with the help of the recording mixer that is supplied by Windows or comes with "
+ENTRY (U"Recording sounds in Windows")
+NORMAL (U"In Windows, you can choose your input device with the help of the recording mixer that is supplied by Windows or comes with "
 	"your sound card. There will usually be a loudspeaker icon in the Start bar; double-click it, and you will see the %playing mixer "
 	"(if there is no loudspeaker icon, go to ##Control Panels#, then ##Sounds and Audio Devices#, then #Volume, then #Advanced; "
 	"do not blame us for how Windows XP works). In the playing mixer, choose #Properties from the #Option menu, then click #Recording, "
 	"then #OK. You are now in the %recording mixer.")
-NORMAL (L"You can watch the input level only while recording.")
+NORMAL (U"You can watch the input level only while recording.")
 #endif
-ENTRY (L"The File menu")
-NORMAL (L"If your computer has little memory, a very long recorded sound can be too big to be copied to the list of objects. "
+ENTRY (U"The File menu")
+NORMAL (U"If your computer has little memory, a very long recorded sound can be too big to be copied to the list of objects. "
 	"Fortunately, the File menu contains commands to save the recording "
 	"to a sound file on disk, so that you will never have to lose your recording.")
-ENTRY (L"Sound pressure calibration")
-NORMAL (L"Your computer's sound-recording software returns integer values between -32768 and 32767. "
+ENTRY (U"Sound pressure calibration")
+NORMAL (U"Your computer's sound-recording software returns integer values between -32768 and 32767. "
 	"Praat divides them by 32768 before putting them into a Sound object, "
 	"so that the values in the Sound objects are always between -1 and +1.")
-NORMAL (L"The Praat program considers these numbers to be air pressures in units of Pascal, "
+NORMAL (U"The Praat program considers these numbers to be air pressures in units of Pascal, "
 	"but they are probably not the actual true air pressures that went into the microphone. "
 	"For how to obtain the true air pressures, perform a @@sound pressure calibration at .")
 MAN_END
 
-MAN_BEGIN (L"Sounds: Concatenate", L"ppgb", 20110211)
-INTRO (L"A command to concatenate all selected @Sound objects into a single large Sound.")
-NORMAL (L"All sounds must have equal sampling frequencies and equal numbers of channels. "
+MAN_BEGIN (U"Sounds: Concatenate", U"ppgb", 20110211)
+INTRO (U"A command to concatenate all selected @Sound objects into a single large Sound.")
+NORMAL (U"All sounds must have equal sampling frequencies and equal numbers of channels. "
 	"They are concatenated in the order in which they appear in the list of objects (not in the order in which you select them; remember: What You See Is What You Get).")
-ENTRY (L"How to concatenate directly to a file")
-NORMAL (L"If the resulting sound does not fit into memory, use one of the "
+ENTRY (U"How to concatenate directly to a file")
+NORMAL (U"If the resulting sound does not fit into memory, use one of the "
 	"commands in the @@Save menu at . See @@How to concatenate sound files at .")
-ENTRY (L"See also")
-NORMAL (L"If you want the sounds to fade into each other smoothly, choose @@Sounds: Concatenate with overlap...@ instead.")
+ENTRY (U"See also")
+NORMAL (U"If you want the sounds to fade into each other smoothly, choose @@Sounds: Concatenate with overlap...@ instead.")
 MAN_END
 
-MAN_BEGIN (L"Sounds: Concatenate with overlap...", L"ppgb", 20110211)
-INTRO (L"A command to concatenate all selected @Sound objects into a single large Sound, with smooth cross-fading between the sounds.")
-NORMAL (L"All sounds must have equal sampling frequencies and equal numbers of channels. "
+MAN_BEGIN (U"Sounds: Concatenate with overlap...", U"ppgb", 20110211)
+INTRO (U"A command to concatenate all selected @Sound objects into a single large Sound, with smooth cross-fading between the sounds.")
+NORMAL (U"All sounds must have equal sampling frequencies and equal numbers of channels. "
 	"They are concatenated in the order in which they appear in the list of objects (not in the order in which you select them; remember: What You See Is What You Get).")
-ENTRY (L"Settings")
-SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (1), L""
+ENTRY (U"Settings")
+SCRIPT (5.4, Manual_SETTINGS_WINDOW_HEIGHT (1), U""
 	Manual_DRAW_SETTINGS_WINDOW ("Sounds: Concatenate with overlap", 1)
 	Manual_DRAW_SETTINGS_WINDOW_FIELD ("Overlap time (s)", "0.01")
 )
-TAG (L"##Overlap time (s)")
-DEFINITION (L"the time by which any two adjacent sounds will come to overlap, "
+TAG (U"##Overlap time (s)")
+DEFINITION (U"the time by which any two adjacent sounds will come to overlap, "
 	"i.e. the time during which the earlier sound fades out and the later sound fades in.")
-ENTRY (L"Procedure")
-NORMAL (L"Suppose we start with the following two sounds. They are both 0.1 seconds long. "
+ENTRY (U"Procedure")
+NORMAL (U"Suppose we start with the following two sounds. They are both 0.1 seconds long. "
 	"The first sound is a sine wave with a frequency of 100 Hz, the second a sine wave with a frequency of 230 Hz:")
-SCRIPT (5.0, 3, L""
+SCRIPT (5.0, 3, U""
 	"Create Sound from formula... sine100 1 0 0.1 10000 0.9*sin(2*pi*100*x)\n"
 	"Draw... 0 0 -1 1 yes Curve\n"
 	"Remove")
-SCRIPT (5.0, 3, L""
+SCRIPT (5.0, 3, U""
 	"Create Sound from formula... sine230 1 0 0.1 10000 0.9*sin(2*pi*230*x)\n"
 	"Draw... 0 0 -1 1 yes Curve\n"
 	"Remove")
-NORMAL (L"If the overlap time is 0.01 seconds, the concatenation of these two sounds will produce a Sound with a duration of 0.19 seconds, "
+NORMAL (U"If the overlap time is 0.01 seconds, the concatenation of these two sounds will produce a Sound with a duration of 0.19 seconds, "
 	"which is the sum of the durations of the two sounds, minus the overlap time.")
-NORMAL (L"The concatenation works in the following way. "
+NORMAL (U"The concatenation works in the following way. "
 	"The last 0.01 seconds of the first sound is multiplied by a falling raised cosine (the second half of a Hann window, see the first red curve), "
 	"and the first 0.01 seconds of the second sound is multiplied by a rising raised cosine (the first half of a Hann window, see the second red curve):")
-SCRIPT (6.7, 5, L""
+SCRIPT (6.7, 5, U""
 	"Create Sound from formula... sine 1 0 0.1 10000 0.9\n"
 	"Formula (part)... 0.09 0.1 1 1 self*(0.5-0.5*cos(pi*(xmax-x)/0.01))\n"
 	"Select inner viewport... 0.5 3.5 0.5 2.5\n"
@@ -1153,9 +1155,9 @@ SCRIPT (6.7, 5, L""
 	"One mark right... 1 yes yes no\n"
 	"Remove\n"
 )
-NORMAL (L"This figure shows how the two sounds are windowed (faded out and in), as well as how they will overlap.")
-NORMAL (L"Finally, the two windowed (\"cross-faded\") sounds are added to each other:")
-SCRIPT (6.7, 3, L""
+NORMAL (U"This figure shows how the two sounds are windowed (faded out and in), as well as how they will overlap.")
+NORMAL (U"Finally, the two windowed (\"cross-faded\") sounds are added to each other:")
+SCRIPT (6.7, 3, U""
 	"sine100 = Create Sound from formula... sine100 1 0 0.1 10000 0.9*sin(2*pi*100*x)\n"
 	"sine230 = Create Sound from formula... sine100 1 0 0.1 10000 0.9*sin(2*pi*230*x)\n"
 	"plus sine100\n"
@@ -1167,59 +1169,59 @@ SCRIPT (6.7, 3, L""
 	"plus sine230\n"
 	"Remove\n"
 )
-NORMAL (L"This example showed how it works if you concatenate two sounds; "
+NORMAL (U"This example showed how it works if you concatenate two sounds; "
 	"if you concatenate three sounds, there will be two overlaps, and so on.")
 MAN_END
 
-MAN_BEGIN (L"Sounds: Convolve...", L"ppgb & djmw", 20100404)
-INTRO (L"A command available in the #Combine menu when you select two @Sound objects. "
+MAN_BEGIN (U"Sounds: Convolve...", U"ppgb & djmw", 20100404)
+INTRO (U"A command available in the #Combine menu when you select two @Sound objects. "
 	"This command convolves two selected @Sound objects with each other. "
 	"As a result, a new Sound will appear in the list of objects; "
 	"this new Sound is the %convolution of the two original Sounds.")
-ENTRY (L"Settings")
-TAG (L"##Amplitude scaling")
-DEFINITION (L"Here you can choose between the `principled' options #integral, #sum, and #normalize, which are explained in 1, 2 and 3 below. "
+ENTRY (U"Settings")
+TAG (U"##Amplitude scaling")
+DEFINITION (U"Here you can choose between the `principled' options #integral, #sum, and #normalize, which are explained in 1, 2 and 3 below. "
 	"There is also a `pragmatic' option, namely ##peak 0.99#, which scales the resulting sound in such a way "
 	"that its absolute peak becomes 0.99, so that the sound tends to be clearly audible without distortion when you play it "
 	"(see @@Sound: Scale peak...@).")
-TAG (L"##Signal outside time domain is...")
-DEFINITION (L"Here you can choose whether outside their time domains the sounds are considered to be #zero "
+TAG (U"##Signal outside time domain is...")
+DEFINITION (U"Here you can choose whether outside their time domains the sounds are considered to be #zero "
 	"(the standard value), or #similar to the sounds within the time domains. "
 	"This is explained in 4 below.")
-ENTRY (L"1. Convolution as an integral")
-NORMAL (L"The convolution %f*%g of two continuous time signals %f(%t) and %g(%t) is defined as the #integral")
-FORMULA (L"(%f*%g) (%t) \\=3 \\in %f(%\\ta) %g(%t-%\\ta) %d%\\ta")
-NORMAL (L"If %f and %g are sampled signals (as Sounds are in Praat), with the same @@sampling period@ %%\\Det%, "
+ENTRY (U"1. Convolution as an integral")
+NORMAL (U"The convolution %f*%g of two continuous time signals %f(%t) and %g(%t) is defined as the #integral")
+FORMULA (U"(%f*%g) (%t) \\=3 \\in %f(%\\ta) %g(%t-%\\ta) %d%\\ta")
+NORMAL (U"If %f and %g are sampled signals (as Sounds are in Praat), with the same @@sampling period@ %%\\Det%, "
 	"the definition is discretized as")
-FORMULA (L"(%f*%g) [%t] \\=3 \\su__%\\ta_ %f[%\\ta] %g[%t-%\\ta] %%\\Det%")
-NORMAL (L"where %\\ta and %t-%\\ta are the discrete times at which %f and %g are defined, respectively.")
-NORMAL (L"Convolution is a commutative operation, i.e. %g*%f equals %f*%g. "
+FORMULA (U"(%f*%g) [%t] \\=3 \\su__%\\ta_ %f[%\\ta] %g[%t-%\\ta] %%\\Det%")
+NORMAL (U"where %\\ta and %t-%\\ta are the discrete times at which %f and %g are defined, respectively.")
+NORMAL (U"Convolution is a commutative operation, i.e. %g*%f equals %f*%g. "
 	"This means that the order in which you put the two Sounds in the object list does not matter: you get the same result either way.")
-ENTRY (L"2. Convolution as a sum")
-NORMAL (L"You can see in the formula above that if both input Sounds are expressed in units of Pa, "
+ENTRY (U"2. Convolution as a sum")
+NORMAL (U"You can see in the formula above that if both input Sounds are expressed in units of Pa, "
 	"the resulting Sound should ideally be expressed in Pa^^2^s. "
 	"Nevertheless, Praat will express it in Pa, because Sounds cannot be expressed otherwise.")
-NORMAL (L"This basically means that it is impossible to get the amplitude of the resulting Sound correct for all purposes. "
+NORMAL (U"This basically means that it is impossible to get the amplitude of the resulting Sound correct for all purposes. "
 	"For this reason, Praat considers a different definition of convolution as well, namely as the #sum")
-FORMULA (L"(%f*%g) [%t] \\=3 \\su__\\ta_ %f[%\\ta] %g[%t-%\\ta]")
-NORMAL (L"The sum definition is appropriate if you want to filter a pulse train with a finite-impulse-response filter "
+FORMULA (U"(%f*%g) [%t] \\=3 \\su__\\ta_ %f[%\\ta] %g[%t-%\\ta]")
+NORMAL (U"The sum definition is appropriate if you want to filter a pulse train with a finite-impulse-response filter "
 	"and expect the amplitudes of each resulting period to be equal to the amplitude of the filter. Thus, the pulse train")
 SCRIPT (5, 3,
-	L"Create Sound from formula... peaks mono 0 0.6 1000 x*(col mod 100 = 0)\n"
+	U"Create Sound from formula... peaks mono 0 0.6 1000 x*(col mod 100 = 0)\n"
 	"Draw... 0 0 0 0.6 yes curve\n"
 	"Remove"
 )
-NORMAL (L"(made with ##@@Create Sound from formula...@ peaks mono 0 0.6 1000 x*(col mod 100 = 0)#), "
+NORMAL (U"(made with ##@@Create Sound from formula...@ peaks mono 0 0.6 1000 x*(col mod 100 = 0)#), "
 	"convolved with the `leaky integrator' filter")
 SCRIPT (5, 3,
-	L"Create Sound from formula... leak mono 0 1 1000 exp(-x/0.1)\n"
+	U"Create Sound from formula... leak mono 0 1 1000 exp(-x/0.1)\n"
 	"Draw... 0 0 0 1 yes curve\n"
 	"Remove"
 )
-NORMAL (L"(made with ##@@Create Sound from formula...@ leak mono 0 1 1000 exp(-x/0.1)#), "
+NORMAL (U"(made with ##@@Create Sound from formula...@ leak mono 0 1 1000 exp(-x/0.1)#), "
 	"yields the convolution")
 SCRIPT (5, 3,
-	L"Create Sound from formula... peaks mono 0 0.6 1000 x*(col mod 100 = 0)\n"
+	U"Create Sound from formula... peaks mono 0 0.6 1000 x*(col mod 100 = 0)\n"
 	"Create Sound from formula... leak mono 0 1 1000 exp(-x/0.1)\n"
 	"plus Sound peaks\n"
 	"Convolve... sum zero\n"
@@ -1228,35 +1230,35 @@ SCRIPT (5, 3,
 	"plus Sound leak\n"
 	"Remove"
 )
-NORMAL (L"The difference between the integral and sum definitions is that in the sum definition "
+NORMAL (U"The difference between the integral and sum definitions is that in the sum definition "
 	"the resulting sound is divided by %%\\Det%.")
-ENTRY (L"3. Normalized convolution")
-NORMAL (L"The %%normalized convolution% is defined as")
-FORMULA (L"(normalized %f*%g) (%t) \\=3 \\in %f(%\\ta) %g(%t-%\\ta) %d%\\ta "
+ENTRY (U"3. Normalized convolution")
+NORMAL (U"The %%normalized convolution% is defined as")
+FORMULA (U"(normalized %f*%g) (%t) \\=3 \\in %f(%\\ta) %g(%t-%\\ta) %d%\\ta "
 	"/ \\Vr (\\in %f^^2^(%\\ta) %%d\\ta% \\in %g^^2^(%\\ta) %%d\\ta%)")
-ENTRY (L"4. Shape scaling")
-NORMAL (L"The boundaries of the integral in 1 are -\\oo and +\\oo. "
+ENTRY (U"4. Shape scaling")
+NORMAL (U"The boundaries of the integral in 1 are -\\oo and +\\oo. "
 	"However, %f and %g are Sound objects in Praat and therefore have finite time domains. "
 	"If %f runs from %t__1_ to %t__2_ and is assumed to be #zero before %t__1_ and after %t__2_, and "
 	"%g runs from %t__3_ to %t__4_ and is assumed to be zero outside that domain, "
 	"then the convolution will be zero before %t__1_ + %t__3_ and after %t__2_ + %t__4_, "
 	"while between %t__1_ + %t__3_ and %t__2_ + %t__4_ it is")
-FORMULA (L"(%f*%g) (%t) = \\in__%%t%1_^^%%t%2^ %f(%\\ta) %g(%t-%\\ta) %d%\\ta")
-NORMAL (L"In this formula, the argument of %f runs from %t__1_ to %t__2_, "
+FORMULA (U"(%f*%g) (%t) = \\in__%%t%1_^^%%t%2^ %f(%\\ta) %g(%t-%\\ta) %d%\\ta")
+NORMAL (U"In this formula, the argument of %f runs from %t__1_ to %t__2_, "
 	"but the argument of %g runs from (%t__1_ + %t__3_) - %t__2_ to (%t__2_ + %t__4_) - %t__1_, "
 	"i.e. from %t__3_ - (%t__2_ - %t__1_) to %t__4_ + (%t__2_ - %t__1_). "
 	"This means that the integration is performed over two equal stretches of time during which %g must be taken zero, "
 	"namely a time stretch before %t__3_ and a time stretch after %t__4_, both of duration %t__2_ - %t__1_ "
 	"(equivalent equations can be formulated that rely on two stretches of %t__4_ - %t__3_ of zeroes in %f rather than in %g, "
 	"or on a stretch of %t__2_ - %t__1_ of zeroes in %g and a stretch of %t__4_ - %t__3_ of zeroes in %f.")
-NORMAL (L"If you consider the sounds outside their time domains as #similar to what they are within their time domains, instead of #zero, "
+NORMAL (U"If you consider the sounds outside their time domains as #similar to what they are within their time domains, instead of #zero, "
 	"the discretized formula in 1 should be based on the average over the jointly defined values of %f[%\\ta] and %g[%t-%\\ta], "
 	"without counting any multiplications of values outside the time domains. "
 	"Suppose that %f is defined on the time domain [0, 1.2] with the value of 1 everywhere, "
 	"and %g is defined on the time domain [0, 3] with the value 1 everywhere. "
 	"Their convolution under the assumption that they are #zero elsewhere is then")
 SCRIPT (5, 3,
-	L"Create Sound from formula... short mono 0 1.2 1000 1\n"
+	U"Create Sound from formula... short mono 0 1.2 1000 1\n"
 	"Create Sound from formula... long mono 0 3 1000 1\n"
 	"plus Sound short\n"
 	"Convolve... integral zero\n"
@@ -1266,9 +1268,9 @@ SCRIPT (5, 3,
 	"plus Sound long\n"
 	"Remove"
 )
-NORMAL (L"but under the assumption that the sounds are #similar (i.e. 1) elsewhere, their convolution should be")
+NORMAL (U"but under the assumption that the sounds are #similar (i.e. 1) elsewhere, their convolution should be")
 SCRIPT (5, 3,
-	L"Create Sound from formula... short mono 0 1.2 1000 1\n"
+	U"Create Sound from formula... short mono 0 1.2 1000 1\n"
 	"Create Sound from formula... long mono 0 3 1000 1\n"
 	"plus Sound short\n"
 	"Convolve... integral similar\n"
@@ -1278,34 +1280,34 @@ SCRIPT (5, 3,
 	"plus Sound long\n"
 	"Remove"
 )
-NORMAL (L"i.e. a constant value of 1.2. This is what you get by choosing the #similar option; "
+NORMAL (U"i.e. a constant value of 1.2. This is what you get by choosing the #similar option; "
 	"if %f is shorter than %g, the first and last parts of the convolution will be divided by a straight line of duration %t__2_ - %t__1_ "
 	"to compensate for the fact that the convolution has been computed over fewer values of %f and %g there.")
-ENTRY (L"5. Behaviour")
-NORMAL (L"The start time of the resulting Sound will be the sum of the start times of the original Sounds, "
+ENTRY (U"5. Behaviour")
+NORMAL (U"The start time of the resulting Sound will be the sum of the start times of the original Sounds, "
 	"the end time of the resulting Sound will be the sum of the end times of the original Sounds, "
 	"the time of the first sample of the resulting Sound will be the sum of the first samples of the original Sounds, "
 	"the time of the last sample of the resulting Sound will be the sum of the last samples of the original Sounds, "
 	"and the number of samples in the resulting Sound will be the sum of the numbers of samples of the original Sounds minus 1.")
-ENTRY (L"6. Behaviour for stereo and other multi-channel sounds")
-NORMAL (L"You can convolve e.g. a 10-channel sound either with another 10-channel sound or with a 1-channel (mono) sound.")
-NORMAL (L"If both Sounds have more than one channel, the two Sounds have to have the same number of channels; "
+ENTRY (U"6. Behaviour for stereo and other multi-channel sounds")
+NORMAL (U"You can convolve e.g. a 10-channel sound either with another 10-channel sound or with a 1-channel (mono) sound.")
+NORMAL (U"If both Sounds have more than one channel, the two Sounds have to have the same number of channels; "
 	"each channel of the resulting Sound is then computed as the convolution of the corresponding channels "
 	"of the original Sounds. For instance, if you convolve two 10-channel sounds, "
 	"the resulting sound will have 10 channels, and its 9th channel will be the convolution of the 9th channels "
 	"of the two original sounds.")
-NORMAL (L"If one of the original Sounds has multiple channels and the other Sound has only one channel, "
+NORMAL (U"If one of the original Sounds has multiple channels and the other Sound has only one channel, "
 	"the resulting Sound will have multiple channels; each of these is computed as the convolution of "
 	"the corresponding channel of the multiple-channel original and the single channel of the single-channel original. "
 	"For instance, if you convolve a 10-channel sound with a mono sound, "
 	"the resulting sound will have 10 channels, and its 9th channel will be the convolution of the mono sound "
 	"with the 9th channel of the original 10-channel sound.")
-NORMAL (L"The amplitude scaling factor will be the same for all channels, so that the relative amplitude of the channels "
+NORMAL (U"The amplitude scaling factor will be the same for all channels, so that the relative amplitude of the channels "
 	"will be preserved in the resulting sound. For the #normalize scaling, for instance, the norm of %f in the formula above "
 	"is taken over all channels of %f. For the ##peak 0.99# scaling, the resulting sound will typically have an absolute peak "
 	"of 0.99 in only one channel, and lower absolute peaks in the other channels.")
-ENTRY (L"7. Algorithm")
-NORMAL (L"The computation makes use of the fact that convolution in the time domain corresponds to multiplication in the frequency domain: "
+ENTRY (U"7. Algorithm")
+NORMAL (U"The computation makes use of the fact that convolution in the time domain corresponds to multiplication in the frequency domain: "
 	"we first pad %f with a stretch of %t__4_ - %t__3_ of zeroes and %g with a stretch of %t__2_ - %t__1_ of zeroes (see 4 above), "
 	"so that both sounds obtain a duration of (%t__2_ - %t__1_) + (%t__4_ - %t__3_); "
 	"we then calculate the spectra of the two zero-padded sounds by Fourier transformation, "
@@ -1314,68 +1316,68 @@ NORMAL (L"The computation makes use of the fact that convolution in the time dom
 	"the result will again have a duration of (%t__2_ - %t__1_) + (%t__4_ - %t__3_).")
 MAN_END
 
-MAN_BEGIN (L"Sounds: Cross-correlate...", L"djmw & ppgb", 20100404)
-INTRO (L"A command available in the #Combine menu when you select two @Sound objects. "
+MAN_BEGIN (U"Sounds: Cross-correlate...", U"djmw & ppgb", 20100404)
+INTRO (U"A command available in the #Combine menu when you select two @Sound objects. "
 	"This command cross-correlates two selected @Sound objects with each other. "
 	"As a result, a new Sound will appear in the list of objects; "
 	"this new Sound is the %cross-correlation of the two original Sounds.")
-ENTRY (L"Settings")
-TAG (L"##Amplitude scaling")
-DEFINITION (L"Here you can choose between the `principled' options #integral, #sum, and #normalize, which are explained in 1, 2 and 3 below. "
+ENTRY (U"Settings")
+TAG (U"##Amplitude scaling")
+DEFINITION (U"Here you can choose between the `principled' options #integral, #sum, and #normalize, which are explained in 1, 2 and 3 below. "
 	"There is also a `pragmatic' option, namely ##peak 0.99#, which scales the resulting sound in such a way "
 	"that its absolute peak becomes 0.99, so that the sound tends to be clearly audible without distortion when you play it "
 	"(see @@Sound: Scale peak...@).")
-TAG (L"##Signal outside time domain is...")
-DEFINITION (L"Here you can choose whether outside their time domains the sounds are considered to be #zero "
+TAG (U"##Signal outside time domain is...")
+DEFINITION (U"Here you can choose whether outside their time domains the sounds are considered to be #zero "
 	"(the standard value), or #similar to the sounds within the time domains. "
 	"This is explained in 4 below.")
-ENTRY (L"1. Cross-correlation as an integral")
-NORMAL (L"The cross-correlation of two continuous time signals %f(%t) and %g(%t) is a function of the lag time %\\ta, "
+ENTRY (U"1. Cross-correlation as an integral")
+NORMAL (U"The cross-correlation of two continuous time signals %f(%t) and %g(%t) is a function of the lag time %\\ta, "
 	"and defined as the #integral")
-FORMULA (L"cross-corr (%f, %g) (%\\ta) \\=3 \\in %f(%t) %g(%t+%\\ta) %dt")
-NORMAL (L"If %f and %g are sampled signals (as Sounds are in Praat), with the same @@sampling period@ %%\\Det%, "
+FORMULA (U"cross-corr (%f, %g) (%\\ta) \\=3 \\in %f(%t) %g(%t+%\\ta) %dt")
+NORMAL (U"If %f and %g are sampled signals (as Sounds are in Praat), with the same @@sampling period@ %%\\Det%, "
 	"the definition is discretized as")
-FORMULA (L"cross-corr (%f, %g) [%\\ta] \\=3 \\su__%t_ %f[%t] %g[%t+%\\ta] %%\\Det%")
-NORMAL (L"where %\\ta and %t+%\\ta are the discrete times at which %f and %g are defined, respectively.")
-NORMAL (L"Cross-correlation is not a commutative operation, i.e. cross-corr (%g, %f) equals the time reversal of cross-corr (%f, %g). "
+FORMULA (U"cross-corr (%f, %g) [%\\ta] \\=3 \\su__%t_ %f[%t] %g[%t+%\\ta] %%\\Det%")
+NORMAL (U"where %\\ta and %t+%\\ta are the discrete times at which %f and %g are defined, respectively.")
+NORMAL (U"Cross-correlation is not a commutative operation, i.e. cross-corr (%g, %f) equals the time reversal of cross-corr (%f, %g). "
 	"This means that the order in which you put the two Sounds in the object list does matter: "
 	"the two results are each other's time reversals.")
-ENTRY (L"2. Cross-correlation as a sum")
-NORMAL (L"You can see in the formula above that if both input Sounds are expressed in units of Pa, "
+ENTRY (U"2. Cross-correlation as a sum")
+NORMAL (U"You can see in the formula above that if both input Sounds are expressed in units of Pa, "
 	"the resulting Sound should ideally be expressed in Pa^^2^s. "
 	"Nevertheless, Praat will express it in Pa, because Sounds cannot be expressed otherwise.")
-NORMAL (L"This basically means that it is impossible to get the amplitude of the resulting Sound correct for all purposes. "
+NORMAL (U"This basically means that it is impossible to get the amplitude of the resulting Sound correct for all purposes. "
 	"For this reason, Praat considers a different definition of cross-correlation as well, namely as the #sum")
-FORMULA (L"cross-corr (%f, %g) [%\\ta] \\=3 \\su__%t_ %f[%t] %g[%t+%\\ta]")
-NORMAL (L"The difference between the integral and sum definitions is that in the sum definition "
+FORMULA (U"cross-corr (%f, %g) [%\\ta] \\=3 \\su__%t_ %f[%t] %g[%t+%\\ta]")
+NORMAL (U"The difference between the integral and sum definitions is that in the sum definition "
 	"the resulting sound is divided by %%\\Det%.")
-ENTRY (L"3. Normalized cross-correlation")
-NORMAL (L"The %%normalized cross-correlation% is defined as")
-FORMULA (L"norm-cross-corr (%f, %g) (%\\ta) \\=3 \\in %f(%t) %g(%t+%\\ta) %d%t "
+ENTRY (U"3. Normalized cross-correlation")
+NORMAL (U"The %%normalized cross-correlation% is defined as")
+FORMULA (U"norm-cross-corr (%f, %g) (%\\ta) \\=3 \\in %f(%t) %g(%t+%\\ta) %d%t "
 	"/ \\Vr (\\in %f^^2^(%t) %%dt% \\in %g^^2^(%t) %%dt%)")
-ENTRY (L"4. Shape scaling")
-NORMAL (L"The boundaries of the integral in 1 are -\\oo and +\\oo. "
+ENTRY (U"4. Shape scaling")
+NORMAL (U"The boundaries of the integral in 1 are -\\oo and +\\oo. "
 	"However, %f and %g are Sound objects in Praat and therefore have finite time domains. "
 	"If %f runs from %t__1_ to %t__2_ and is assumed to be #zero before %t__1_ and after %t__2_, and "
 	"%g runs from %t__3_ to %t__4_ and is assumed to be zero outside that domain, "
 	"then the cross-correlation will be zero before %t__3_ - %t__2_ and after %t__4_ - %t__1_, "
 	"while between %t__3_ - %t__2_ and %t__4_ - %t__1_ it is")
-FORMULA (L"cross-corr (%f, %g) (%\\ta) = \\in__%%t%1_^^%%t%2^ %f(%t) %g(%t+%\\ta) %d%t")
-NORMAL (L"In this formula, the argument of %f runs from %t__1_ to %t__2_, "
+FORMULA (U"cross-corr (%f, %g) (%\\ta) = \\in__%%t%1_^^%%t%2^ %f(%t) %g(%t+%\\ta) %d%t")
+NORMAL (U"In this formula, the argument of %f runs from %t__1_ to %t__2_, "
 	"but the argument of %g runs from %t__1_ + (%t__3_ - %t__2_) to %t__2_ + (%t__4_ - %t__1_), "
 	"i.e. from %t__3_ - (%t__2_ - %t__1_) to %t__4_ + (%t__2_ - %t__1_). "
 	"This means that the integration is performed over two equal stretches of time during which %g must be taken zero, "
 	"namely a time stretch before %t__3_ and a time stretch after %t__4_, both of duration %t__2_ - %t__1_ "
 	"(equivalent equations can be formulated that rely on two stretches of %t__4_ - %t__3_ of zeroes in %f rather than in %g, "
 	"or on a stretch of %t__2_ - %t__1_ of zeroes in %g and a stretch of %t__4_ - %t__3_ of zeroes in %f.")
-NORMAL (L"If you consider the sounds outside their time domains as #similar to what they are within their time domains, instead of #zero, "
+NORMAL (U"If you consider the sounds outside their time domains as #similar to what they are within their time domains, instead of #zero, "
 	"the discretized formula in 1 should be based on the average over the jointly defined values of %f[%\\ta] and %g[%t-%\\ta], "
 	"without counting any multiplications of values outside the time domains. "
 	"Suppose that %f is defined on the time domain [0, 1.2] with the value of 1 everywhere, "
 	"and %g is defined on the time domain [0, 3] with the value 1 everywhere. "
 	"Their cross-correlation under the assumption that they are #zero elsewhere is then")
 SCRIPT (5, 3,
-	L"Create Sound from formula... short mono 0 1.2 1000 1\n"
+	U"Create Sound from formula... short mono 0 1.2 1000 1\n"
 	"Create Sound from formula... long mono 0 3 1000 1\n"
 	"plus Sound short\n"
 	"Cross-correlate... integral zero\n"
@@ -1385,9 +1387,9 @@ SCRIPT (5, 3,
 	"plus Sound long\n"
 	"Remove"
 )
-NORMAL (L"but under the assumption that the sounds are #similar (i.e. 1) elsewhere, their cross-correlation should be")
+NORMAL (U"but under the assumption that the sounds are #similar (i.e. 1) elsewhere, their cross-correlation should be")
 SCRIPT (5, 3,
-	L"Create Sound from formula... short mono 0 1.2 1000 1\n"
+	U"Create Sound from formula... short mono 0 1.2 1000 1\n"
 	"Create Sound from formula... long mono 0 3 1000 1\n"
 	"plus Sound short\n"
 	"Cross-correlate... integral similar\n"
@@ -1397,34 +1399,34 @@ SCRIPT (5, 3,
 	"plus Sound long\n"
 	"Remove"
 )
-NORMAL (L"i.e. a constant value of 1.2. This is what you get by choosing the #similar option; "
+NORMAL (U"i.e. a constant value of 1.2. This is what you get by choosing the #similar option; "
 	"if %f is shorter than %g, the first and last parts of the cross-correlation will be divided by a straight line of duration %t__2_ - %t__1_ "
 	"to compensate for the fact that the cross-correlation has been computed over fewer values of %f and %g there.")
-ENTRY (L"5. Behaviour")
-NORMAL (L"The start time of the resulting Sound will be the start time of %f minus the end time of %g, "
+ENTRY (U"5. Behaviour")
+NORMAL (U"The start time of the resulting Sound will be the start time of %f minus the end time of %g, "
 	"the end time of the resulting Sound will be the end time of %f minus the start time of %g, "
 	"the time of the first sample of the resulting Sound will be the first sample of %f minus the last sample of %g, "
 	"the time of the last sample of the resulting Sound will be the last sample of %f minus the first sample of %g, "
 	"and the number of samples in the resulting Sound will be the sum of the numbers of samples of %f and %g minus 1.")
-ENTRY (L"6. Behaviour for stereo and other multi-channel sounds")
-NORMAL (L"You can cross-correlate e.g. a 10-channel sound either with another 10-channel sound or with a 1-channel (mono) sound.")
-NORMAL (L"If both Sounds have more than one channel, the two Sounds have to have the same number of channels; "
+ENTRY (U"6. Behaviour for stereo and other multi-channel sounds")
+NORMAL (U"You can cross-correlate e.g. a 10-channel sound either with another 10-channel sound or with a 1-channel (mono) sound.")
+NORMAL (U"If both Sounds have more than one channel, the two Sounds have to have the same number of channels; "
 	"each channel of the resulting Sound is then computed as the cross-correlation of the corresponding channels "
 	"of the original Sounds. For instance, if you cross-correlate two 10-channel sounds, "
 	"the resulting sound will have 10 channels, and its 9th channel will be the cross-correlation of the 9th channels "
 	"of the two original sounds.")
-NORMAL (L"If one of the original Sounds has multiple channels and the other Sound has only one channel, "
+NORMAL (U"If one of the original Sounds has multiple channels and the other Sound has only one channel, "
 	"the resulting Sound will have multiple channels; each of these is computed as the cross-correlation of "
 	"the corresponding channel of the multiple-channel original and the single channel of the single-channel original. "
 	"For instance, if you cross-correlate a 10-channel sound with a mono sound, "
 	"the resulting sound will have 10 channels, and its 9th channel will be the cross-correlation of the mono sound "
 	"with the 9th channel of the original 10-channel sound.")
-NORMAL (L"The amplitude scaling factor will be the same for all channels, so that the relative amplitude of the channels "
+NORMAL (U"The amplitude scaling factor will be the same for all channels, so that the relative amplitude of the channels "
 	"will be preserved in the resulting sound. For the #normalize scaling, for instance, the norm of %f in the formula above "
 	"is taken over all channels of %f. For the ##peak 0.99# scaling, the resulting sound will typically have an absolute peak "
 	"of 0.99 in only one channel, and lower absolute peaks in the other channels.")
-ENTRY (L"7. Algorithm")
-NORMAL (L"The computation makes use of the fact that cross-correlation in the time domain corresponds to multiplication "
+ENTRY (U"7. Algorithm")
+NORMAL (U"The computation makes use of the fact that cross-correlation in the time domain corresponds to multiplication "
 	"of the time-reversal of %f with %g in the frequency domain: "
 	"we first pad %f with a stretch of %t__4_ - %t__3_ of zeroes and %g with a stretch of %t__2_ - %t__1_ of zeroes (see 4 above), "
 	"so that both sounds obtain a duration of (%t__2_ - %t__1_) + (%t__4_ - %t__3_); "
@@ -1434,156 +1436,156 @@ NORMAL (L"The computation makes use of the fact that cross-correlation in the ti
 	"the result will again have a duration of (%t__2_ - %t__1_) + (%t__4_ - %t__3_).")
 MAN_END
 
-MAN_BEGIN (L"Sound: Autocorrelate...", L"djmw & ppgb", 20100404)
-INTRO (L"A command available in the #Periodicity menu when you select one or more @Sound objects. "
+MAN_BEGIN (U"Sound: Autocorrelate...", U"djmw & ppgb", 20100404)
+INTRO (U"A command available in the #Periodicity menu when you select one or more @Sound objects. "
 	"This command autocorrelates the selected @Sound object. "
 	"As a result, a new Sound will appear in the list of objects; "
 	"this new Sound is the %autocorrelation of the original Sound.")
-ENTRY (L"Settings")
-TAG (L"##Amplitude scaling")
-DEFINITION (L"Here you can choose between the `principled' options #integral, #sum, and #normalize, which are explained in 1, 2 and 3 below. "
+ENTRY (U"Settings")
+TAG (U"##Amplitude scaling")
+DEFINITION (U"Here you can choose between the `principled' options #integral, #sum, and #normalize, which are explained in 1, 2 and 3 below. "
 	"There is also a `pragmatic' option, namely ##peak 0.99#, which scales the resulting sound in such a way "
 	"that its absolute peak becomes 0.99, so that the sound tends to be clearly audible without distortion when you play it "
 	"(see @@Sound: Scale peak...@).")
-TAG (L"##Signal outside time domain is...")
-DEFINITION (L"Here you can choose whether outside its time domain the sound is considered to be #zero "
+TAG (U"##Signal outside time domain is...")
+DEFINITION (U"Here you can choose whether outside its time domain the sound is considered to be #zero "
 	"(the standard value), or #similar to the sound within the time domain. "
 	"This is explained in 4 below.")
-//DEFINITION (L"Here you can choose whether outside its time domain the sound is considered to be #zero "
+//DEFINITION (U"Here you can choose whether outside its time domain the sound is considered to be #zero "
 //	"(the standard value), or #similar to the sound within the time domain, or #periodic, i.e. that "
 //	"outside the time domain the waveforms is a repetition of the waveform within the time domain. "
 //	"This is explained in 4 below.")
-ENTRY (L"1. Autocorrelation as an integral")
-NORMAL (L"The autocorrelation of a continuous time signal %f(%t) is a function of the lag time %\\ta, "
+ENTRY (U"1. Autocorrelation as an integral")
+NORMAL (U"The autocorrelation of a continuous time signal %f(%t) is a function of the lag time %\\ta, "
 	"and defined as the #integral")
-FORMULA (L"%R__%f_ (%\\ta) \\=3 \\in %f(%t) %f(%t+%\\ta) %dt")
-NORMAL (L"If %f is a sampled signal (as Sounds are in Praat), with @@sampling period@ %%\\Det%, "
+FORMULA (U"%R__%f_ (%\\ta) \\=3 \\in %f(%t) %f(%t+%\\ta) %dt")
+NORMAL (U"If %f is a sampled signal (as Sounds are in Praat), with @@sampling period@ %%\\Det%, "
 	"the definition is discretized as")
-FORMULA (L"%R__%f_ [%\\ta] \\=3 \\su__%t_ %f[%t] %f[%t+%\\ta] %%\\Det%")
-NORMAL (L"where %\\ta and %t+%\\ta are the discrete times at which %f is defined.")
-NORMAL (L"The autocorrelation is symmetric: %R__%f_ (-%\\ta) = %R__%f_ (%\\ta).")
-ENTRY (L"2. Autocorrelation as a sum")
-NORMAL (L"You can see in the formula above that if the input Sound is expressed in units of Pa, "
+FORMULA (U"%R__%f_ [%\\ta] \\=3 \\su__%t_ %f[%t] %f[%t+%\\ta] %%\\Det%")
+NORMAL (U"where %\\ta and %t+%\\ta are the discrete times at which %f is defined.")
+NORMAL (U"The autocorrelation is symmetric: %R__%f_ (-%\\ta) = %R__%f_ (%\\ta).")
+ENTRY (U"2. Autocorrelation as a sum")
+NORMAL (U"You can see in the formula above that if the input Sound is expressed in units of Pa, "
 	"the resulting Sound should ideally be expressed in Pa^^2^s. "
 	"Nevertheless, Praat will express it in Pa, because Sounds cannot be expressed otherwise.")
-NORMAL (L"This basically means that it is impossible to get the amplitude of the resulting Sound correct for all purposes. "
+NORMAL (U"This basically means that it is impossible to get the amplitude of the resulting Sound correct for all purposes. "
 	"For this reason, Praat considers a different definition of autocorrelation as well, namely as the #sum")
-FORMULA (L"%R__%f_ [%\\ta] \\=3 \\su__%t_ %f[%t] %g[%t+%\\ta]")
-NORMAL (L"The difference between the integral and sum definitions is that in the sum definition "
+FORMULA (U"%R__%f_ [%\\ta] \\=3 \\su__%t_ %f[%t] %g[%t+%\\ta]")
+NORMAL (U"The difference between the integral and sum definitions is that in the sum definition "
 	"the resulting sound is divided by %%\\Det%.")
-ENTRY (L"3. Normalized autocorrelation")
-NORMAL (L"The %%normalized autocorrelation% is defined as")
-FORMULA (L"norm-autocorr (%f) (%\\ta) \\=3 \\in %f(%t) %f(%t+%\\ta) %d%t / \\in %f^^2^(%t) %%dt%")
-ENTRY (L"4. Shape scaling")
-NORMAL (L"The boundaries of the integral in 1 are -\\oo and +\\oo. "
+ENTRY (U"3. Normalized autocorrelation")
+NORMAL (U"The %%normalized autocorrelation% is defined as")
+FORMULA (U"norm-autocorr (%f) (%\\ta) \\=3 \\in %f(%t) %f(%t+%\\ta) %d%t / \\in %f^^2^(%t) %%dt%")
+ENTRY (U"4. Shape scaling")
+NORMAL (U"The boundaries of the integral in 1 are -\\oo and +\\oo. "
 	"However, %f is a Sound object in Praat and therefore has a finite time domain. "
 	"If %f runs from %t__1_ to %t__2_ and is assumed to be #zero before %t__1_ and after %t__2_, "
 	"then the autocorrelation will be zero before %t__1_ - %t__2_ and after %t__2_ - %t__1_, "
 	"while between %t__1_ - %t__2_ and %t__2_ - %t__1_ it is")
-FORMULA (L"%R__%f_ (%\\ta) = \\in__%%t%1_^^%%t%2^ %f(%t) %f(%t+%\\ta) %d%t")
-NORMAL (L"In this formula, the argument of the first %f runs from %t__1_ to %t__2_, "
+FORMULA (U"%R__%f_ (%\\ta) = \\in__%%t%1_^^%%t%2^ %f(%t) %f(%t+%\\ta) %d%t")
+NORMAL (U"In this formula, the argument of the first %f runs from %t__1_ to %t__2_, "
 	"but the argument of the second %f runs from %t__1_ + (%t__1_ - %t__2_) to %t__2_ + (%t__2_ - %t__1_), "
 	"i.e. from %t__1_ - (%t__2_ - %t__1_) to %t__2_ + (%t__2_ - %t__1_). "
 	"This means that the integration is performed over two equal stretches of time during which %f must be taken zero, "
 	"namely a time stretch before %t__1_ and a time stretch after %t__2_, both of duration %t__2_ - %t__1_.")
-NORMAL (L"If you consider the sound outside its time domains as #similar to what it is within its time domain, instead of #zero, "
+NORMAL (U"If you consider the sound outside its time domains as #similar to what it is within its time domain, instead of #zero, "
 	"the discretized formula in 1 should be based on the average over the jointly defined values of %f[%\\ta] and %f[%t-%\\ta], "
 	"without counting any multiplications of values outside the time domain. "
 	"Suppose that %f is defined on the time domain [0, 1.2] with the value of 1 everywhere. "
 	"Its autocorrelation under the assumption that it is #zero elsewhere is then")
 SCRIPT (5, 3,
-	L"Create Sound from formula... sound mono 0 1.2 1000 1\n"
+	U"Create Sound from formula... sound mono 0 1.2 1000 1\n"
 	"Autocorrelate... integral zero\n"
 	"Draw... 0 0 0 1.5 yes curve\n"
 	"One mark left... 1.2 yes yes yes\n"
 	"plus Sound sound\n"
 	"Remove"
 )
-NORMAL (L"but under the assumption that the sound is #similar (i.e. 1) elsewhere, its autocorrelation should be")
+NORMAL (U"but under the assumption that the sound is #similar (i.e. 1) elsewhere, its autocorrelation should be")
 SCRIPT (5, 3,
-	L"Create Sound from formula... sound mono 0 1.2 1000 1\n"
+	U"Create Sound from formula... sound mono 0 1.2 1000 1\n"
 	"Autocorrelate... integral similar\n"
 	"Draw... 0 0 0 1.5 yes curve\n"
 	"One mark left... 1.2 yes yes yes\n"
 	"plus Sound sound\n"
 	"Remove"
 )
-NORMAL (L"i.e. a constant value of 1.2. This is what you get by choosing the #similar option; "
+NORMAL (U"i.e. a constant value of 1.2. This is what you get by choosing the #similar option; "
 	"the autocorrelation will be divided by a triangular function "
 	"to compensate for the fact that the autocorrelation has been computed over fewer values closer to the edges; "
 	"this procedure is followed in all autocorrelation-based pitch computations in Praat (see @@Sound: To Pitch...@). "
 	"For examples, see @@Boersma (1993)@.")
-ENTRY (L"5. Behaviour")
-NORMAL (L"The start time of the resulting Sound will be the start time of %f minus the end time of %f, "
+ENTRY (U"5. Behaviour")
+NORMAL (U"The start time of the resulting Sound will be the start time of %f minus the end time of %f, "
 	"the end time of the resulting Sound will be the end time of %f minus the start time of %f, "
 	"the time of the first sample of the resulting Sound will be the first sample of %f minus the last sample of %f, "
 	"the time of the last sample of the resulting Sound will be the last sample of %f minus the first sample of %f, "
 	"and the number of samples in the resulting Sound will be twice the number of samples of %f, minus 1.")
-ENTRY (L"6. Behaviour for stereo and other multi-channel sounds")
-NORMAL (L"If the selected Sound has more than one channel, each channel of the resulting Sound is computed "
+ENTRY (U"6. Behaviour for stereo and other multi-channel sounds")
+NORMAL (U"If the selected Sound has more than one channel, each channel of the resulting Sound is computed "
 	"as the cross-correlation of the corresponding channel "
 	"of the original Sound. For instance, if you autocorrelate a 10-channel sound, "
 	"the resulting sound will again have 10 channels, and its 9th channel will be the autocorrelation of the 9th channel "
 	"of the original sound.")
-NORMAL (L"The amplitude scaling factor will be the same for all channels, so that the relative amplitude of the channels "
+NORMAL (U"The amplitude scaling factor will be the same for all channels, so that the relative amplitude of the channels "
 	"will be preserved in the resulting sound. For the #normalize scaling, for instance, the squared norm of %f in the formula above "
 	"is taken over all channels of %f. For the ##peak 0.99# scaling, the resulting sound will typically have an absolute peak "
 	"of 0.99 in only one channel, and lower absolute peaks in the other channels.")
-ENTRY (L"Algorithm")
-NORMAL (L"The autocorrelation is calculated as the @@Sounds: Cross-correlate...|cross-correlation@ of a sound with itself.")
+ENTRY (U"Algorithm")
+NORMAL (U"The autocorrelation is calculated as the @@Sounds: Cross-correlate...|cross-correlation@ of a sound with itself.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Scale intensity...", L"ppgb", 20120614)
-INTRO (L"A command available in the #Modify menu when you select one or more @Sound objects. "
+MAN_BEGIN (U"Sound: Scale intensity...", U"ppgb", 20120614)
+INTRO (U"A command available in the #Modify menu when you select one or more @Sound objects. "
 	"With this command you multiply the amplitude of each Sound in such a way that its average (i.e. root-mean-square) intensity becomes "
 	"the ##new average intensity# that you specify (see Settings).")
-ENTRY (L"Settings")
-TAG (L"##New average intensity (dB SPL)")
-DEFINITION (L"the new average intensity of the Sound. The standard value is 70 dB SPL. This means that the root-mean-square amplitude "
+ENTRY (U"Settings")
+TAG (U"##New average intensity (dB SPL)")
+DEFINITION (U"the new average intensity of the Sound. The standard value is 70 dB SPL. This means that the root-mean-square amplitude "
 	"of the sound will come to lie 70 dB above the assumed auditory threshold of 0.00002 Pa. Please check whether as a result a peak in the sound "
 	"does not get below -1 Pa or above +1 Pa. If that happens, the sound will be clipped when played, which will be audible as distortion; "
 	"in thast case you may want to set this number to 60 dB or even lower.")
 MAN_END
 
-MAN_BEGIN (L"Sound: Scale peak...", L"ppgb", 20100328)
-INTRO (L"A command available in the #Modify menu when you select one or more @Sound objects. "
+MAN_BEGIN (U"Sound: Scale peak...", U"ppgb", 20100328)
+INTRO (U"A command available in the #Modify menu when you select one or more @Sound objects. "
 	"With this command you multiply the amplitude of each Sound in such a way that its absolute peak becomes "
 	"the ##new absolute peak# that you specify (see Settings).")
-ENTRY (L"Settings")
-TAG (L"##New absolute peak")
-DEFINITION (L"the new absolute peak of the Sound. The standard value is 0.99: this maximizes the audibility of the Sound "
+ENTRY (U"Settings")
+TAG (U"##New absolute peak")
+DEFINITION (U"the new absolute peak of the Sound. The standard value is 0.99: this maximizes the audibility of the Sound "
 	"(sounds with lower amplitude are weaker) without distorting it "
 	"(sounds with absolute peaks above 1 are clipped when they are played).")
-ENTRY (L"Examples")
-NORMAL (L"The absolute peak of the following sound is 0.033:")
+ENTRY (U"Examples")
+NORMAL (U"The absolute peak of the following sound is 0.033:")
 SCRIPT (6.0, 3.0,
-	L"Create Sound from formula... 033 mono 0 0.1 10000 -0.02*(sin(2*pi*205*x)+sin(2*pi*5*x))+0.007\n"
+	U"Create Sound from formula... 033 mono 0 0.1 10000 -0.02*(sin(2*pi*205*x)+sin(2*pi*5*x))+0.007\n"
 	"Draw... 0 0 -0.033 0.0247 yes curve\n"
 	"Remove"
 )
-NORMAL (L"This sound will play rather weakly. To make it louder, you can do ##Scale peak...# with a ##new absolute peak# of 0.99. "
+NORMAL (U"This sound will play rather weakly. To make it louder, you can do ##Scale peak...# with a ##new absolute peak# of 0.99. "
 	"Praat will then multiply the waveform by 30, changing the sound to the following:")
 SCRIPT (6.0, 3.0,
-	L"Create Sound from formula... 033 mono 0 0.1 10000 -0.6*(sin(2*pi*205*x)+sin(2*pi*5*x))+0.21\n"
+	U"Create Sound from formula... 033 mono 0 0.1 10000 -0.6*(sin(2*pi*205*x)+sin(2*pi*5*x))+0.21\n"
 	"Draw... 0 0 -0.99 0.741 yes curve\n"
 	"Remove"
 )
-NORMAL (L"The absolute peak is now 0.99, and the sound will play loudly.")
-NORMAL (L"The reverse is also possible. The absolute peak of the following sound is 19.8:")
+NORMAL (U"The absolute peak is now 0.99, and the sound will play loudly.")
+NORMAL (U"The reverse is also possible. The absolute peak of the following sound is 19.8:")
 SCRIPT (6.0, 3.0,
-	L"Create Sound from formula... 033 mono 0 0.1 10000 12*(sin(2*pi*305*x)+sin(2*pi*5*x))-4.2\n"
+	U"Create Sound from formula... 033 mono 0 0.1 10000 12*(sin(2*pi*305*x)+sin(2*pi*5*x))-4.2\n"
 	"Draw... 0 0 -15.28 19.8 yes curve\n"
 	"Remove"
 )
-NORMAL (L"This sound will not play correctly: all samples with an amplitude outside the [-1;+1] range will be clipped to -1 or +1. "
+NORMAL (U"This sound will not play correctly: all samples with an amplitude outside the [-1;+1] range will be clipped to -1 or +1. "
 	"To make this sound nicer to play, you can again do ##Scale peak...# with a ##new absolute peak# of 0.99. "
 	"Praat will then divide the waveform by 20, changing the sound to the following:")
 SCRIPT (6.0, 3.0,
-	L"Create Sound from formula... 033 mono 0 0.1 10000 0.6*(sin(2*pi*305*x)+sin(2*pi*5*x))-0.21\n"
+	U"Create Sound from formula... 033 mono 0 0.1 10000 0.6*(sin(2*pi*305*x)+sin(2*pi*5*x))-0.21\n"
 	"Draw... 0 0 -0.764 0.99 yes curve\n"
 	"Remove"
 )
-NORMAL (L"The absolute peak is now 0.99, and the sound will play without distortion.")
+NORMAL (U"The absolute peak is now 0.99, and the sound will play without distortion.")
 MAN_END
 
 }
diff --git a/fon/manual_soundFiles.cpp b/fon/manual_soundFiles.cpp
index 54451c7..f4c92f6 100644
--- a/fon/manual_soundFiles.cpp
+++ b/fon/manual_soundFiles.cpp
@@ -1,6 +1,6 @@
 /* manual_soundFiles.cpp
  *
- * Copyright (C) 1992-2008,2014 Paul Boersma
+ * Copyright (C) 1992-2008,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,425 +22,425 @@
 void manual_soundFiles_init (ManPages me);
 void manual_soundFiles_init (ManPages me) {
 
-MAN_BEGIN (L"Sound files", L"ppgb", 20070602)
-INTRO (L"This tutorial describes the sound files that you can read "
+MAN_BEGIN (U"Sound files", U"ppgb", 20070602)
+INTRO (U"This tutorial describes the sound files that you can read "
 	"and write with Praat. It assumes you are familiar with the @Intro.")
-NORMAL (L"You can read this tutorial sequentially with the help of the \"< 1\" and \"1 >\" buttons.")
-LIST_ITEM (L"1. @@Sound files 1. General structure|General structure@")
-LIST_ITEM1 (L"1.1. @@Sound files 1.1. Sampling|Sampling@ (sampling frequency)")
-LIST_ITEM1 (L"1.2. @@Sound files 1.2. Quantization|Quantization@ (linear, endian, μ-law, A-law)")
-LIST_ITEM1 (L"1.3. @@Sound files 1.3. Channels|Channels@ (mono, stereo)")
-LIST_ITEM1 (L"1.4. @@Sound files 1.4. The header|The header@")
-LIST_ITEM1 (L"1.5. @@Sound files 1.5. Size|Size@")
-LIST_ITEM1 (L"1.6. @@Sound files 1.6. Compression|Compression@")
-LIST_ITEM (L"2. @@Sound files 2. File types|File types@")
-LIST_ITEM1 (L"2.1. @@Sound files 2.1. WAV files|WAV files@")
-LIST_ITEM1 (L"2.2. @@Sound files 2.2. AIFF files|AIFF files@")
-LIST_ITEM1 (L"2.3. @@Sound files 2.3. AIFC files|AIFC files@")
-LIST_ITEM1 (L"2.4. @@Sound files 2.4. NeXT/Sun (.au) files|NeXT/Sun (.au) files@")
-LIST_ITEM1 (L"2.5. @@Sound files 2.5. NIST files|NIST files@")
-LIST_ITEM1 (L"2.6. @@Sound files 2.6. FLAC files|FLAC files@")
-LIST_ITEM1 (L"2.7. @@Sound files 2.7. MP3 files|MP3 files@")
-LIST_ITEM (L"3. @@Sound files 3. Files that Praat can read|Files that Praat can read@")
-LIST_ITEM (L"4. @@Sound files 4. Files that Praat can write|Files that Praat can write@")
-MAN_END
-
-MAN_BEGIN (L"Sound files 1. General structure", L"ppgb", 20000123)
-INTRO (L"This is chapter 1 of the @@Sound files@ tutorial. "
+NORMAL (U"You can read this tutorial sequentially with the help of the \"< 1\" and \"1 >\" buttons.")
+LIST_ITEM (U"1. @@Sound files 1. General structure|General structure@")
+LIST_ITEM1 (U"1.1. @@Sound files 1.1. Sampling|Sampling@ (sampling frequency)")
+LIST_ITEM1 (U"1.2. @@Sound files 1.2. Quantization|Quantization@ (linear, endian, μ-law, A-law)")
+LIST_ITEM1 (U"1.3. @@Sound files 1.3. Channels|Channels@ (mono, stereo)")
+LIST_ITEM1 (U"1.4. @@Sound files 1.4. The header|The header@")
+LIST_ITEM1 (U"1.5. @@Sound files 1.5. Size|Size@")
+LIST_ITEM1 (U"1.6. @@Sound files 1.6. Compression|Compression@")
+LIST_ITEM (U"2. @@Sound files 2. File types|File types@")
+LIST_ITEM1 (U"2.1. @@Sound files 2.1. WAV files|WAV files@")
+LIST_ITEM1 (U"2.2. @@Sound files 2.2. AIFF files|AIFF files@")
+LIST_ITEM1 (U"2.3. @@Sound files 2.3. AIFC files|AIFC files@")
+LIST_ITEM1 (U"2.4. @@Sound files 2.4. NeXT/Sun (.au) files|NeXT/Sun (.au) files@")
+LIST_ITEM1 (U"2.5. @@Sound files 2.5. NIST files|NIST files@")
+LIST_ITEM1 (U"2.6. @@Sound files 2.6. FLAC files|FLAC files@")
+LIST_ITEM1 (U"2.7. @@Sound files 2.7. MP3 files|MP3 files@")
+LIST_ITEM (U"3. @@Sound files 3. Files that Praat can read|Files that Praat can read@")
+LIST_ITEM (U"4. @@Sound files 4. Files that Praat can write|Files that Praat can write@")
+MAN_END
+
+MAN_BEGIN (U"Sound files 1. General structure", U"ppgb", 20000123)
+INTRO (U"This is chapter 1 of the @@Sound files@ tutorial. "
 	"It describes the general structure of the headers and data parts of sound files.")
-LIST_ITEM (L"1.1. @@Sound files 1.1. Sampling|Sampling@ (sampling frequency)")
-LIST_ITEM (L"1.2. @@Sound files 1.2. Quantization|Quantization@ (linear, μ-law, A-law)")
-LIST_ITEM (L"1.3. @@Sound files 1.3. Channels|Channels@ (mono, stereo)")
-LIST_ITEM (L"1.4. @@Sound files 1.4. The header|The header@")
-LIST_ITEM (L"1.5. @@Sound files 1.5. Size|Size@")
-LIST_ITEM (L"1.6. @@Sound files 1.6. Compression|Compression@")
+LIST_ITEM (U"1.1. @@Sound files 1.1. Sampling|Sampling@ (sampling frequency)")
+LIST_ITEM (U"1.2. @@Sound files 1.2. Quantization|Quantization@ (linear, μ-law, A-law)")
+LIST_ITEM (U"1.3. @@Sound files 1.3. Channels|Channels@ (mono, stereo)")
+LIST_ITEM (U"1.4. @@Sound files 1.4. The header|The header@")
+LIST_ITEM (U"1.5. @@Sound files 1.5. Size|Size@")
+LIST_ITEM (U"1.6. @@Sound files 1.6. Compression|Compression@")
 MAN_END
 
-MAN_BEGIN (L"Sound files 1.1. Sampling", L"ppgb", 20040330)
-NORMAL (L"When a sound signal from a microphone or on a tape needs to be read into a computer, "
+MAN_BEGIN (U"Sound files 1.1. Sampling", U"ppgb", 20040330)
+NORMAL (U"When a sound signal from a microphone or on a tape needs to be read into a computer, "
 	"it is %digitized, which means that it is %sampled and %quantized.")
-NORMAL (L"Sampling is the discretization of the time domain of the signal: "
+NORMAL (U"Sampling is the discretization of the time domain of the signal: "
 	"each second of the signal is divided up into 11025, 22050, or 44100 "
 	"slices (or any other suitable number), and a %%sample value% is associated with "
 	"each slice. For instance, a continuous 377-Hz sine wave is expressed by")
-FORMULA (L"%x(%t) = sin (2%π 377 %t)")
-NORMAL (L"If the %%sampling frequency% (or %%sample rate%) is 44100 Hz, this sine wave will be sampled at "
+FORMULA (U"%x(%t) = sin (2%π 377 %t)")
+NORMAL (U"If the %%sampling frequency% (or %%sample rate%) is 44100 Hz, this sine wave will be sampled at "
 	"points spaced Δ%t = 1/44100 second apart, and the sample values will be")
-FORMULA (L"%x__%i_ = sin (2%π 377 (%t__0_ + %i Δ%t))")
-NORMAL (L"where %t__0_ is the time after which sampling begins. "
+FORMULA (U"%x__%i_ = sin (2%π 377 (%t__0_ + %i Δ%t))")
+NORMAL (U"where %t__0_ is the time after which sampling begins. "
 	"Δ%t is called the %%sample period%.")
-NORMAL (L"Quantization is handled in the next section (@@Sound files 1.2. Quantization|§1.2@).")
+NORMAL (U"Quantization is handled in the next section (@@Sound files 1.2. Quantization|§1.2@).")
 MAN_END
 
-MAN_BEGIN (L"Sound files 1.2. Quantization", L"ppgb", 20000126)
-NORMAL (L"Apart from sampling (@@Sound files 1.1. Sampling|§1.1@), "
+MAN_BEGIN (U"Sound files 1.2. Quantization", U"ppgb", 20000126)
+NORMAL (U"Apart from sampling (@@Sound files 1.1. Sampling|§1.1@), "
 	"digitization also involves quantization, which is the conversion of a sample value "
 	"into a number that fits into 8 or 16 bits.")
 MAN_END
 
-MAN_BEGIN (L"Sound files 1.3. Channels", L"ppgb", 20000126)
-NORMAL (L"For most file types, Praat supports sounds with one channel (mono) and two channels (stereo).")
+MAN_BEGIN (U"Sound files 1.3. Channels", U"ppgb", 20000126)
+NORMAL (U"For most file types, Praat supports sounds with one channel (mono) and two channels (stereo).")
 MAN_END
 
-MAN_BEGIN (L"Sound files 1.4. The header", L"ppgb", 20040223)
-NORMAL (L"The bulk of most sound files is formed by the samples. "
+MAN_BEGIN (U"Sound files 1.4. The header", U"ppgb", 20040223)
+NORMAL (U"The bulk of most sound files is formed by the samples. "
 	"The sample part is usually preceded by a header, which contains "
 	"information about:")
-LIST_ITEM (L"1. The type of file (WAV, AIFF, AIFC, NeXT/Sun, NIST, Kay, FLAC...).")
-LIST_ITEM (L"2. The sampling frequency (@@Sound files 1.1. Sampling|§1.1@).")
-LIST_ITEM (L"3. The encoding (linear, 8 or 16 bit, byte order, μ-law, A-law, see @@Sound files 1.2. Quantization|§1.2@).")
-LIST_ITEM (L"4. The number of channels (mono, stereo, see @@Sound files 1.3. Channels|§1.3@).")
-LIST_ITEM (L"5. The duration (usually the number of samples).")
+LIST_ITEM (U"1. The type of file (WAV, AIFF, AIFC, NeXT/Sun, NIST, Kay, FLAC...).")
+LIST_ITEM (U"2. The sampling frequency (@@Sound files 1.1. Sampling|§1.1@).")
+LIST_ITEM (U"3. The encoding (linear, 8 or 16 bit, byte order, μ-law, A-law, see @@Sound files 1.2. Quantization|§1.2@).")
+LIST_ITEM (U"4. The number of channels (mono, stereo, see @@Sound files 1.3. Channels|§1.3@).")
+LIST_ITEM (U"5. The duration (usually the number of samples).")
 MAN_END
 
-MAN_BEGIN (L"Sound files 1.5. Size", L"ppgb", 20000126)
-NORMAL (L"The size of a sound file is equal to the size of the header "
+MAN_BEGIN (U"Sound files 1.5. Size", U"ppgb", 20000126)
+NORMAL (U"The size of a sound file is equal to the size of the header "
 	"plus the product of the number of samples, the quantization size, "
 	"and the number of channels.")
-NORMAL (L"For instance, a stereo sound with a duration of 3 seconds, sampled at 44100 Hz, "
+NORMAL (U"For instance, a stereo sound with a duration of 3 seconds, sampled at 44100 Hz, "
 	"would, when written into a 16-bit NeXT/Sun file, take up a disk space of")
-FORMULA (L"28 + 2 * 3.0 * 44100 * 2 = 529228 bytes")
-NORMAL (L"whereas the same sound, when averaged to mono, downsampled to 8000 Hz, "
+FORMULA (U"28 + 2 * 3.0 * 44100 * 2 = 529228 bytes")
+NORMAL (U"whereas the same sound, when averaged to mono, downsampled to 8000 Hz, "
 	"and written into a μ-law NeXT/Sun file, take up only a disk space of")
-FORMULA (L"28 + 1 * 3.0 * 8000 * 1 = 24028 bytes")
-NORMAL (L"The first example is typical of CD quality, the second of telephone speech.")
+FORMULA (U"28 + 1 * 3.0 * 8000 * 1 = 24028 bytes")
+NORMAL (U"The first example is typical of CD quality, the second of telephone speech.")
 MAN_END
 
-MAN_BEGIN (L"Sound files 1.6. Compression", L"ppgb", 20040602)
-NORMAL (L"Praat used to be able to read some compressed sound file formats (shortened NIST, Polyphone), "
+MAN_BEGIN (U"Sound files 1.6. Compression", U"ppgb", 20040602)
+NORMAL (U"Praat used to be able to read some compressed sound file formats (shortened NIST, Polyphone), "
 	"but because of licensing problems (Praat went open source, Shorten did not), "
 	"you now need to use other (freely available) programs to do the conversion before reading them into Praat. "
 	"Praat can decode (but not create) MP3 files. "
 	"Praat fully supports FLAC compressed files.")
 MAN_END
 
-MAN_BEGIN (L"Sound files 2. File types", L"ppgb", 20070602)
-LIST_ITEM (L"2.1. @@Sound files 2.1. WAV files|WAV files@")
-LIST_ITEM (L"2.2. @@Sound files 2.2. AIFF files|AIFF files@")
-LIST_ITEM (L"2.3. @@Sound files 2.3. AIFC files|AIFC files@")
-LIST_ITEM (L"2.4. @@Sound files 2.4. NeXT/Sun (.au) files|NeXT/Sun (.au) files@")
-LIST_ITEM (L"2.5. @@Sound files 2.5. NIST files|NIST files@")
-LIST_ITEM (L"2.6. @@Sound files 2.6. FLAC files|FLAC files@")
-LIST_ITEM (L"2.7. @@Sound files 2.7. MP3 files|MP3 files@")
+MAN_BEGIN (U"Sound files 2. File types", U"ppgb", 20070602)
+LIST_ITEM (U"2.1. @@Sound files 2.1. WAV files|WAV files@")
+LIST_ITEM (U"2.2. @@Sound files 2.2. AIFF files|AIFF files@")
+LIST_ITEM (U"2.3. @@Sound files 2.3. AIFC files|AIFC files@")
+LIST_ITEM (U"2.4. @@Sound files 2.4. NeXT/Sun (.au) files|NeXT/Sun (.au) files@")
+LIST_ITEM (U"2.5. @@Sound files 2.5. NIST files|NIST files@")
+LIST_ITEM (U"2.6. @@Sound files 2.6. FLAC files|FLAC files@")
+LIST_ITEM (U"2.7. @@Sound files 2.7. MP3 files|MP3 files@")
 MAN_END
 
-MAN_BEGIN (L"Sound files 2.1. WAV files", L"ppgb", 20040223)
-NORMAL (L"The audio file type most commonly used on Windows computers, also very common on the Internet.")
+MAN_BEGIN (U"Sound files 2.1. WAV files", U"ppgb", 20040223)
+NORMAL (U"The audio file type most commonly used on Windows computers, also very common on the Internet.")
 MAN_END
 
-MAN_BEGIN (L"Sound files 2.2. AIFF files", L"ppgb", 20040223)
-NORMAL (L"AIFF stands for: Audio Interchange File Format.")
-NORMAL (L"This standard format for sound files was defined by Apple. "
+MAN_BEGIN (U"Sound files 2.2. AIFF files", U"ppgb", 20040223)
+NORMAL (U"AIFF stands for: Audio Interchange File Format.")
+NORMAL (U"This standard format for sound files was defined by Apple. "
 	"It is also the format of the sound files on the Iris Indigo, "
 	"where each sample is quantized into 16 bits.")
 MAN_END
 
-MAN_BEGIN (L"Sound files 2.3. AIFC files", L"ppgb", 20040223)
-NORMAL (L"AIFC is short for AIFF(C) or AIFF-C, i.e. the Audio Interchange File Format "
+MAN_BEGIN (U"Sound files 2.3. AIFC files", U"ppgb", 20040223)
+NORMAL (U"AIFC is short for AIFF(C) or AIFF-C, i.e. the Audio Interchange File Format "
 	"(@@Sound files 2.2. AIFF files|§2.2@) with optional compression.")
-NORMAL (L"Praat reads and write uncompressed AIFC files, but does not support compressed AIFC files.")
+NORMAL (U"Praat reads and write uncompressed AIFC files, but does not support compressed AIFC files.")
 MAN_END
 
-MAN_BEGIN (L"Sound files 2.4. NeXT/Sun (.au) files", L"ppgb", 20110131)
-NORMAL (L"This is the format of the sound files on the Sun.")
-ENTRY (L"Reading")
-NORMAL (L"To read a #Sound from a Sun audio file on disk, use @@Read from file... at ."
+MAN_BEGIN (U"Sound files 2.4. NeXT/Sun (.au) files", U"ppgb", 20110131)
+NORMAL (U"This is the format of the sound files on the Sun.")
+ENTRY (U"Reading")
+NORMAL (U"To read a #Sound from a Sun audio file on disk, use @@Read from file... at ."
 	"Praat then asks you for a file name. "
 	"After you click OK, Praat determines the encoding of the file. "
 	"If the encoding is 16-bit linear, the 16-bit sample values are divided by 32768 so that the amplitude "
 	"of the resulting Sound is between -1.0 and +1.0. "
 	"If the encoding is 8-bit %μ-law, the 16-bit sample value is determined by table look-up first.")
-NORMAL (L"The resulting Sound will appear in the list of objects; "
+NORMAL (U"The resulting Sound will appear in the list of objects; "
 	"its name will be equal to the file name, without extension.")
-ENTRY (L"Saving")
-NORMAL (L"Use @@Save as NeXT/Sun file... at . The samples of the Sound are multiplied by 32768 "
+ENTRY (U"Saving")
+NORMAL (U"Use @@Save as NeXT/Sun file... at . The samples of the Sound are multiplied by 32768 "
 	"and quantized between -32768 and 32767; "
 	"the result is written to the file in 16-bit mono Sun audio format.")
-NORMAL (L"To avoid clipping, keep the absolute amplitude below 1.000. "
+NORMAL (U"To avoid clipping, keep the absolute amplitude below 1.000. "
 	"If the maximum sound pressure level is 91 dB (top = 32767), "
 	"the quantization threshold is (top = 1/2) -5 dB.")
 MAN_END
 
-MAN_BEGIN (L"Sound files 2.5. NIST files", L"ppgb", 20040223)
-NORMAL (L"An audio file type used by speech researchers. Used, for instance, in the TIMIT database. "
+MAN_BEGIN (U"Sound files 2.5. NIST files", U"ppgb", 20040223)
+NORMAL (U"An audio file type used by speech researchers. Used, for instance, in the TIMIT database. "
 	"Praat reads several kinds of NIST files: big-endian, little-endian, μ-law, A-law, Polyphone. "
 	"NIST files compressed with #shorten are no longer supported "
 	"(see @@Sound files 1.6. Compression|§1.6@)")
 MAN_END
 
-MAN_BEGIN (L"Sound files 2.6. FLAC files", L"Erez Volk", 20070514)
-NORMAL (L"A lossless compressed audio format (see ##http://flac.sourceforge.net##). "
+MAN_BEGIN (U"Sound files 2.6. FLAC files", U"Erez Volk", 20070514)
+NORMAL (U"A lossless compressed audio format (see ##http://flac.sourceforge.net##). "
 	"Praat reads FLAC files in all bitrate/frequency settings "
 	"(see also @@Sound files 1.6. Compression|§1.6@)")
 MAN_END
 
-MAN_BEGIN (L"Sound files 3. Files that Praat can read", L"ppgb", 20070602)
-INTRO (L"Praat can read five types of standard sound files in several formats, "
+MAN_BEGIN (U"Sound files 3. Files that Praat can read", U"ppgb", 20070602)
+INTRO (U"Praat can read five types of standard sound files in several formats, "
 	"and a number of proprietary types of sound files as well.")
-ENTRY (L"Standard sound files")
-NORMAL (L"The @@Open menu@ contains two commands for opening sound files:")
-LIST_ITEM (L"• With @@Read from file...@, you read the entire file into memory. "
+ENTRY (U"Standard sound files")
+NORMAL (U"The @@Open menu@ contains two commands for opening sound files:")
+LIST_ITEM (U"• With @@Read from file...@, you read the entire file into memory. "
 	"A @Sound object will appear in the list. "
 	"This is appropriate if your sound is not too long to fit into memory. "
 	"The advantage of having a @Sound object is that you can perform analysis "
 	"on it directly.")
-LIST_ITEM (L"• With @@Open long sound file...@, you open a sound file that is too long "
+LIST_ITEM (U"• With @@Open long sound file...@, you open a sound file that is too long "
 	"to read into memory completely. A @LongSound object will appear in the list. "
 	"You will typically choose #View to view the contents of this sound and analyse it. "
 	"Praat will only read so much of the file into memory as is needed to play or display "
 	"parts of it.")
-NORMAL (L"Both commands understand the following five standard audio file formats:")
-LIST_ITEM (L"• WAV:")
-LIST_ITEM1 (L"• linear 16-bit little-endian")
-LIST_ITEM1 (L"• 8-bit μ-law")
-LIST_ITEM1 (L"• 8-bit A-law")
-LIST_ITEM1 (L"• linear 8-bit unsigned")
-LIST_ITEM (L"• AIFF or AIFC:")
-LIST_ITEM1 (L"• linear 16-bit big-endian")
-LIST_ITEM1 (L"• linear 8-bit signed")
-LIST_ITEM (L"• NeXT/Sun (.au):")
-LIST_ITEM1 (L"• linear 16-bit big-endian")
-LIST_ITEM1 (L"• 8-bit μ-law")
-LIST_ITEM1 (L"• 8-bit A-law")
-LIST_ITEM1 (L"• linear 8-bit signed")
-LIST_ITEM (L"• NIST:")
-LIST_ITEM1 (L"• linear 16-bit little-endian")
-LIST_ITEM1 (L"• linear 16-bit big-endian")
-LIST_ITEM1 (L"• 8-bit μ-law")
-LIST_ITEM1 (L"• 8-bit A-law")
-LIST_ITEM1 (L"• linear 8-bit signed")
-LIST_ITEM (L"• FLAC:")
-LIST_ITEM1 (L"• 8-bit, 16-bit, 24-bit or 32-bit")
-LIST_ITEM1 (L"• all sampling frequencies")
-LIST_ITEM (L"• MP3:")
-LIST_ITEM1 (L"• all constant or variable bitrates")
-MAN_END
-
-MAN_BEGIN (L"Sound files 4. Files that Praat can write", L"ppgb", 20110129)
-INTRO (L"Praat can write five types of standard sound files in an appropriate linear 16-bit formats, "
+NORMAL (U"Both commands understand the following five standard audio file formats:")
+LIST_ITEM (U"• WAV:")
+LIST_ITEM1 (U"• linear 16-bit little-endian")
+LIST_ITEM1 (U"• 8-bit μ-law")
+LIST_ITEM1 (U"• 8-bit A-law")
+LIST_ITEM1 (U"• linear 8-bit unsigned")
+LIST_ITEM (U"• AIFF or AIFC:")
+LIST_ITEM1 (U"• linear 16-bit big-endian")
+LIST_ITEM1 (U"• linear 8-bit signed")
+LIST_ITEM (U"• NeXT/Sun (.au):")
+LIST_ITEM1 (U"• linear 16-bit big-endian")
+LIST_ITEM1 (U"• 8-bit μ-law")
+LIST_ITEM1 (U"• 8-bit A-law")
+LIST_ITEM1 (U"• linear 8-bit signed")
+LIST_ITEM (U"• NIST:")
+LIST_ITEM1 (U"• linear 16-bit little-endian")
+LIST_ITEM1 (U"• linear 16-bit big-endian")
+LIST_ITEM1 (U"• 8-bit μ-law")
+LIST_ITEM1 (U"• 8-bit A-law")
+LIST_ITEM1 (U"• linear 8-bit signed")
+LIST_ITEM (U"• FLAC:")
+LIST_ITEM1 (U"• 8-bit, 16-bit, 24-bit or 32-bit")
+LIST_ITEM1 (U"• all sampling frequencies")
+LIST_ITEM (U"• MP3:")
+LIST_ITEM1 (U"• all constant or variable bitrates")
+MAN_END
+
+MAN_BEGIN (U"Sound files 4. Files that Praat can write", U"ppgb", 20110129)
+INTRO (U"Praat can write five types of standard sound files in an appropriate linear 16-bit formats, "
 	"and a number of proprietary types of sound files as well:")
-LIST_ITEM (L"• @@Save as WAV file...@ (16-bit little-endian)")
-LIST_ITEM (L"• @@Save as AIFF file...@ (16-bit big-endian)")
-LIST_ITEM (L"• @@Save as AIFC file...@ (16-bit big-endian)")
-LIST_ITEM (L"• @@Save as NeXT/Sun file...@ (16-bit big-endian)")
-LIST_ITEM (L"• @@Save as NIST file...@ (16-bit little-endian)")
-LIST_ITEM (L"• @@Save as FLAC file...@ (16-bit)")
-MAN_END
-
-MAN_BEGIN (L"AIFF and AIFC files", L"ppgb", 20110131)
-INTRO (L"Ways for storing a @Sound object on disk.")
-ENTRY (L"File format")
-ENTRY (L"Reading")
-NORMAL (L"@@Read from file...@ recognizes AIFF and AIFC files with 8-bit and 16-bit encoding, "
+LIST_ITEM (U"• @@Save as WAV file...@ (16-bit little-endian)")
+LIST_ITEM (U"• @@Save as AIFF file...@ (16-bit big-endian)")
+LIST_ITEM (U"• @@Save as AIFC file...@ (16-bit big-endian)")
+LIST_ITEM (U"• @@Save as NeXT/Sun file...@ (16-bit big-endian)")
+LIST_ITEM (U"• @@Save as NIST file...@ (16-bit little-endian)")
+LIST_ITEM (U"• @@Save as FLAC file...@ (16-bit)")
+MAN_END
+
+MAN_BEGIN (U"AIFF and AIFC files", U"ppgb", 20110131)
+INTRO (U"Ways for storing a @Sound object on disk.")
+ENTRY (U"File format")
+ENTRY (U"Reading")
+NORMAL (U"@@Read from file...@ recognizes AIFF and AIFC files with 8-bit and 16-bit encoding, "
 	"but not compressed AIFC files. It recognizes any sampling frequency. The two channels of stereo files "
 	"are averaged. ##Read two Sounds from AIFF file...# reads both channels separately and names "
 	"them %left and %right.")
-NORMAL (L"The sample values are divided by 2^^(%numberOfBitsPerSample – 1)^, "
+NORMAL (U"The sample values are divided by 2^^(%numberOfBitsPerSample – 1)^, "
 	"so that the amplitude of the resulting Sound is between –1.0 and +1.0; "
 	"the maximum sound pressure level for a sine wave is therefore: "
 	"20 · ^^10^log (√2 / 2·10^^–5^) = 91 dB.")
-NORMAL (L"The resulting Sound will appear in the List of Objects; "
+NORMAL (U"The resulting Sound will appear in the List of Objects; "
 	"its name will be equal to the file name, without extension.")
-ENTRY (L"Saving")
-NORMAL (L"With @@Save as AIFF file... at .")
-NORMAL (L"The samples of the Sound are multiplied by 32768 "
+ENTRY (U"Saving")
+NORMAL (U"With @@Save as AIFF file... at .")
+NORMAL (U"The samples of the Sound are multiplied by 32768 "
 	"and quantized between –32768 and 32767.")
-NORMAL (L"To avoid clipping, keep the absolute amplitude below 1.000. "
+NORMAL (U"To avoid clipping, keep the absolute amplitude below 1.000. "
 	"If the maximum sound pressure level is 91 dB (top = 32767), "
 	"the quantization threshold is (top = 1/2) –5 dB.")
 MAN_END
 
-MAN_BEGIN (L"Save as WAV file...", L"ppgb", 20110129)
-INTRO (L"With this command, you save one or more selected @Sound and/or @LongSound objects "
+MAN_BEGIN (U"Save as WAV file...", U"ppgb", 20110129)
+INTRO (U"With this command, you save one or more selected @Sound and/or @LongSound objects "
 	"as a single 16-bit little-endian WAV file on disk. See the @@Sound files@ tutorial for more information.")
 MAN_END
 
-MAN_BEGIN (L"Save as AIFF file...", L"ppgb", 20110129)
-INTRO (L"With this command, you save one or more selected @Sound and/or @LongSound objects "
+MAN_BEGIN (U"Save as AIFF file...", U"ppgb", 20110129)
+INTRO (U"With this command, you save one or more selected @Sound and/or @LongSound objects "
 	"as a single 16-bit big-endian AIFF file on disk. See the @@Sound files@ tutorial for more information.")
-/*ENTRY (L"AIFF file format for writing")
-NORMAL (L"Although")*/
+/*ENTRY (U"AIFF file format for writing")
+NORMAL (U"Although")*/
 MAN_END
 
-MAN_BEGIN (L"Save as AIFC file...", L"ppgb", 20110129)
-INTRO (L"With this command, you save one or more selected @Sound and/or @LongSound objects "
+MAN_BEGIN (U"Save as AIFC file...", U"ppgb", 20110129)
+INTRO (U"With this command, you save one or more selected @Sound and/or @LongSound objects "
 	"as a single 16-bit big-endian AIFC file on disk. See the @@Sound files@ tutorial for more information.")
 MAN_END
 
-MAN_BEGIN (L"Save as NeXT/Sun file...", L"ppgb", 20110129)
-INTRO (L"With this command, you save one or more selected @Sound and/or @LongSound objects "
+MAN_BEGIN (U"Save as NeXT/Sun file...", U"ppgb", 20110129)
+INTRO (U"With this command, you save one or more selected @Sound and/or @LongSound objects "
 	"as a single 16-bit big-endian NeXT/Sun (.au) file on disk. See the @@Sound files@ tutorial for more information.")
 MAN_END
 
-MAN_BEGIN (L"Save as NIST file...", L"ppgb", 20110129)
-INTRO (L"With this command, you save one or more selected @Sound and/or @LongSound objects "
+MAN_BEGIN (U"Save as NIST file...", U"ppgb", 20110129)
+INTRO (U"With this command, you save one or more selected @Sound and/or @LongSound objects "
 	"as a single 16-bit little-endian NIST audio file on disk. See the @@Sound files@ tutorial for more information.")
 MAN_END
 
-MAN_BEGIN (L"Save as FLAC file...", L"ppgb", 20110129)
-INTRO (L"With this command, you save one or more selected @Sound and/or @LongSound objects "
+MAN_BEGIN (U"Save as FLAC file...", U"ppgb", 20110129)
+INTRO (U"With this command, you save one or more selected @Sound and/or @LongSound objects "
 	"as a single 16-bit FLAC audio file on disk. See the @@Sound files@ tutorial for more information.")
 MAN_END
 
-MAN_BEGIN (L"Sound files 2.7. MP3 files", L"Erez Volk", 20070601)
-NORMAL (L"A ubiquitous lossy audio compression format. "
+MAN_BEGIN (U"Sound files 2.7. MP3 files", U"Erez Volk", 20070601)
+NORMAL (U"A ubiquitous lossy audio compression format. "
 	"Praat supports MP3 decoding through the MPEG Audio Decoder library "
 	"##http://www.underbit.com/products/mad/##. "
 	"(see also @@Sound files 1.6. Compression|§1.6@)")
 MAN_END
 
-MAN_BEGIN (L"NIST files", L"Erez Volk", 20110131)
-INTRO (L"A way for storing a @Sound object on disk.")
-ENTRY (L"File format")
-NORMAL (L"The compressed sound files of the Timit database, and the Groningen speech corpus.")
-ENTRY (L"Reading")
-NORMAL (L"With @@Read from file... at .")
-ENTRY (L"Saving")
-NORMAL (L"With ##Save as NIST audio file...#.")
+MAN_BEGIN (U"NIST files", U"Erez Volk", 20110131)
+INTRO (U"A way for storing a @Sound object on disk.")
+ENTRY (U"File format")
+NORMAL (U"The compressed sound files of the Timit database, and the Groningen speech corpus.")
+ENTRY (U"Reading")
+NORMAL (U"With @@Read from file... at .")
+ENTRY (U"Saving")
+NORMAL (U"With ##Save as NIST audio file...#.")
 MAN_END
 
-MAN_BEGIN (L"FLAC files", L"Erez Volk", 20110131)
-INTRO (L"A way for storing a @Sound object on disk.")
-ENTRY (L"File format")
-NORMAL (L"A lossless compressed audio file format.")
-ENTRY (L"Reading")
-NORMAL (L"With @@Read from file... at .")
-ENTRY (L"Saving")
-NORMAL (L"With ##Save as FLAC audio file...#.")
+MAN_BEGIN (U"FLAC files", U"Erez Volk", 20110131)
+INTRO (U"A way for storing a @Sound object on disk.")
+ENTRY (U"File format")
+NORMAL (U"A lossless compressed audio file format.")
+ENTRY (U"Reading")
+NORMAL (U"With @@Read from file... at .")
+ENTRY (U"Saving")
+NORMAL (U"With ##Save as FLAC audio file...#.")
 MAN_END
 
-MAN_BEGIN (L"How to concatenate sound files", L"ppgb", 20110131)
-INTRO (L"You can concatenate any combination of AIFF, AIFC, WAV, NeXT/Sun, NIST "
+MAN_BEGIN (U"How to concatenate sound files", U"ppgb", 20110131)
+INTRO (U"You can concatenate any combination of AIFF, AIFC, WAV, NeXT/Sun, NIST "
 	"and FLAC audio files, and other files that you have read into memory.")
-NORMAL (L"For instance, if you want to concatenate a 30-minute AIFF file, "
+NORMAL (U"For instance, if you want to concatenate a 30-minute AIFF file, "
 	"a 4-minute Kay sound file, and a 60-minute Next/Sun file, "
 	"by saving them into a 94-minute WAV file, "
 	"you do the following:")
-LIST_ITEM (L"1. Open the AIFF file with @@Open long sound file...@ from the @@Open menu at . "
+LIST_ITEM (U"1. Open the AIFF file with @@Open long sound file...@ from the @@Open menu at . "
 	"A @LongSound object will appear in the list.")
-LIST_ITEM (L"2. Read the Kay sound file into memory with @@Read from file... at . "
+LIST_ITEM (U"2. Read the Kay sound file into memory with @@Read from file... at . "
 	"A @Sound object will appear in the list.")
-LIST_ITEM (L"3. Open the AIFF file with @@Open long sound file...@ from the @@Open menu at . "
+LIST_ITEM (U"3. Open the AIFF file with @@Open long sound file...@ from the @@Open menu at . "
 	"A second @LongSound object will appear in the list.")
-LIST_ITEM (L"4. Select the three objects and choose @@Save as WAV file...@ "
+LIST_ITEM (U"4. Select the three objects and choose @@Save as WAV file...@ "
 	"from the @@Save menu at .")
-NORMAL (L"This only works if all the sounds have the same sampling frequency "
+NORMAL (U"This only works if all the sounds have the same sampling frequency "
 	"and the same number of channels.")
-ENTRY (L"Available formats")
-NORMAL (L"The format of the original sound files may be 16-bit linear "
+ENTRY (U"Available formats")
+NORMAL (U"The format of the original sound files may be 16-bit linear "
 	"(with big-endian or little-endian byte order), 8-bit linear (signed or unsigned), "
 	"8-bit μ-law, or 8-bit A-law. The format of the resulting sound file is always "
 	"16-bit linear, with an appropriate default byte order. The following commands "
 	"are available in the @@Save menu@ of you select any combination of @LongSound "
 	"and/or @Sound objects:")
-LIST_ITEM (L"• @@Save as WAV file...@ (little-endian)")
-LIST_ITEM (L"• @@Save as AIFF file...@ (big-endian)")
-LIST_ITEM (L"• @@Save as AIFC file...@ (big-endian)")
-LIST_ITEM (L"• @@Save as NeXT/Sun file...@ (big-endian)")
-LIST_ITEM (L"• @@Save as NIST file...@ (little-endian)")
-LIST_ITEM (L"• @@Save as FLAC file...@")
+LIST_ITEM (U"• @@Save as WAV file...@ (little-endian)")
+LIST_ITEM (U"• @@Save as AIFF file...@ (big-endian)")
+LIST_ITEM (U"• @@Save as AIFC file...@ (big-endian)")
+LIST_ITEM (U"• @@Save as NeXT/Sun file...@ (big-endian)")
+LIST_ITEM (U"• @@Save as NIST file...@ (little-endian)")
+LIST_ITEM (U"• @@Save as FLAC file...@")
 MAN_END
 
-MAN_BEGIN (L"LongSound", L"ppgb", 20110131)
-INTRO (L"One of the @@types of objects@ in Praat. See the @@Sound files@ tutorial.")
-NORMAL (L"A LongSound object gives you the ability to view and label "
+MAN_BEGIN (U"LongSound", U"ppgb", 20110131)
+INTRO (U"One of the @@types of objects@ in Praat. See the @@Sound files@ tutorial.")
+NORMAL (U"A LongSound object gives you the ability to view and label "
 	"a sound file that resides on disk. You will want to use it for sounds "
 	"that are too long to read into memory as a @Sound object (typically, a few minutes).")
-ENTRY (L"How to create a LongSound object")
-NORMAL (L"You create a LongSound object with @@Open long sound file...@ from the @@Open menu at .")
-ENTRY (L"What you can do with a LongSound object")
-NORMAL (L"You can save a LongSound object to a new sound file, "
+ENTRY (U"How to create a LongSound object")
+NORMAL (U"You create a LongSound object with @@Open long sound file...@ from the @@Open menu at .")
+ENTRY (U"What you can do with a LongSound object")
+NORMAL (U"You can save a LongSound object to a new sound file, "
 	"perhaps in a different format (AIFF, AIFC, WAV, NeXT/Sun, NIST, FLAC) "
 	"with the commands in the Save menu. You can also concatenate several "
 	"LongSound objects in this way. See @@How to concatenate sound files at .")
-ENTRY (L"How to view and edit a LongSound object")
-NORMAL (L"You can view a LongSound object in a @LongSoundEditor by choosing @@LongSound: View at . "
+ENTRY (U"How to view and edit a LongSound object")
+NORMAL (U"You can view a LongSound object in a @LongSoundEditor by choosing @@LongSound: View at . "
 	"This also allows you to extract parts of the LongSound as @Sound objects, "
 	"or save these parts as a sound file. "
 	"There are currently no ways to actually change the data in the file.")
-ENTRY (L"How to annotate a LongSound object")
-NORMAL (L"You can label and segment a LongSound object after the following steps:")
-LIST_ITEM (L"1. Select the LongSound object.")
-LIST_ITEM (L"2. Choose @@LongSound: To TextGrid...@ and specify your tiers.")
-LIST_ITEM (L"3. Select the resulting @TextGrid object together with the LongSound object, and click ##View & Edit#.")
-NORMAL (L"A @TextGridEditor will appear on the screen, with a copy of the LongSound object in it.")
-ENTRY (L"Limitations")
-NORMAL (L"The length of the sound file is limited to 2 gigabytes, which is 3 hours of CD-quality stereo, "
+ENTRY (U"How to annotate a LongSound object")
+NORMAL (U"You can label and segment a LongSound object after the following steps:")
+LIST_ITEM (U"1. Select the LongSound object.")
+LIST_ITEM (U"2. Choose @@LongSound: To TextGrid...@ and specify your tiers.")
+LIST_ITEM (U"3. Select the resulting @TextGrid object together with the LongSound object, and click ##View & Edit#.")
+NORMAL (U"A @TextGridEditor will appear on the screen, with a copy of the LongSound object in it.")
+ENTRY (U"Limitations")
+NORMAL (U"The length of the sound file is limited to 2 gigabytes, which is 3 hours of CD-quality stereo, "
 	"or 12 hours 16-bit mono sampled at 22050 Hz.")
 MAN_END
 
-MAN_BEGIN (L"LongSound: To TextGrid...", L"ppgb", 19980730)
-INTRO (L"A command to create a @TextGrid without any labels, copying the time domain from the selected @LongSound.")
-NORMAL (L"See @@Sound: To TextGrid...@ for the settings.")
+MAN_BEGIN (U"LongSound: To TextGrid...", U"ppgb", 19980730)
+INTRO (U"A command to create a @TextGrid without any labels, copying the time domain from the selected @LongSound.")
+NORMAL (U"See @@Sound: To TextGrid...@ for the settings.")
 MAN_END
 
-MAN_BEGIN (L"LongSound: View", L"ppgb", 19980730)
-INTRO (L"A command to view the selected @LongSound object in a @LongSoundEditor.")
+MAN_BEGIN (U"LongSound: View", U"ppgb", 19980730)
+INTRO (U"A command to view the selected @LongSound object in a @LongSoundEditor.")
 MAN_END
 
-MAN_BEGIN (L"LongSoundEditor", L"ppgb", 20041124)
-INTRO (L"One of the @Editors in Praat, for viewing a @LongSound object.")
-NORMAL (L"This viewer allows you:")
-LIST_ITEM (L"• to view and hear parts of the sound as it is on disk;")
-LIST_ITEM (L"• to copy a selected part as a @Sound object to the list of objects, so that you "
+MAN_BEGIN (U"LongSoundEditor", U"ppgb", 20041124)
+INTRO (U"One of the @Editors in Praat, for viewing a @LongSound object.")
+NORMAL (U"This viewer allows you:")
+LIST_ITEM (U"• to view and hear parts of the sound as it is on disk;")
+LIST_ITEM (U"• to copy a selected part as a @Sound object to the list of objects, so that you "
 	"can perform analyses on it or save it to a smaller sound file;")
-LIST_ITEM (L"• to copy a selected part as a @Sound object to the @Sound clipboard, "
+LIST_ITEM (U"• to copy a selected part as a @Sound object to the @Sound clipboard, "
 	"so that you can paste it into another Sound object that you are viewing in a @SoundEditor.")
-NORMAL (L"To label and segment the LongSound object, use the @TextGridEditor instead (see @LongSound).")
-NORMAL (L"The display and playback of the samples is restricted to 60 seconds at a time, for reasons of speed "
+NORMAL (U"To label and segment the LongSound object, use the @TextGridEditor instead (see @LongSound).")
+NORMAL (U"The display and playback of the samples is restricted to 60 seconds at a time, for reasons of speed "
 	"(although you can change this number with ##LongSound prefs# from the main #Preferences menu; "
 	"the sound file itself can contain several hours of sound.")
 MAN_END
 
-MAN_BEGIN (L"Macintosh sound files", L"ppgb", 20110131)
-INTRO (L"A way for storing a @Sound object on disk.")
-ENTRY (L"File format")
-NORMAL (L"The double-clickable sound file of the Macintosh (8 bits per sample). "
+MAN_BEGIN (U"Macintosh sound files", U"ppgb", 20110131)
+INTRO (U"A way for storing a @Sound object on disk.")
+ENTRY (U"File format")
+NORMAL (U"The double-clickable sound file of the Macintosh (8 bits per sample). "
 	"Cannot be ported to other machines, because the sound is in the @@resource fork at .")
-ENTRY (L"Reading")
-NORMAL (L"With @@Read from file... at .")
-NORMAL (L"To read a Sound from a Macintosh sound file on disk, use @@Read from file...@ (Macintosh only).")
-NORMAL (L"The 8-bit sample values are divided by 128 so that the amplitude "
+ENTRY (U"Reading")
+NORMAL (U"With @@Read from file... at .")
+NORMAL (U"To read a Sound from a Macintosh sound file on disk, use @@Read from file...@ (Macintosh only).")
+NORMAL (U"The 8-bit sample values are divided by 128 so that the amplitude "
 	"of the resulting Sound is between –1.0 and +1.0.")
-NORMAL (L"The resulting Sound will appear in the list of objects; "
+NORMAL (U"The resulting Sound will appear in the list of objects; "
 	"its name will be equal to the file name, without extension.")
-ENTRY (L"Saving")
-NORMAL (L"With ##Save as Mac sound file...#. Praat asks you for a file name. "
+ENTRY (U"Saving")
+NORMAL (U"With ##Save as Mac sound file...#. Praat asks you for a file name. "
 	"After you click OK, 0.5 is added to the samples of the Sound, "
 	"they are multiplied by 128 and quantized between 0 and 255; "
 	"the result is written to the file in 8-bit linear Macintosh sound-file format.")
-NORMAL (L"To avoid clipping, keep the absolute amplitude below 1.000. "
+NORMAL (U"To avoid clipping, keep the absolute amplitude below 1.000. "
 	"If the maximum sound pressure level is 91 dB (top = 127), "
 	"the quantization threshold for a sine wave is (top = 1/2) 43 dB.")
 MAN_END
 
-MAN_BEGIN (L"Open long sound file...", L"ppgb", 19980730)
-INTRO (L"A command in the @@Open menu@ that creates a @LongSound object.")
-NORMAL (L"The file will be opened for reading only. The file stays open until you remove the LongSound object.")
+MAN_BEGIN (U"Open long sound file...", U"ppgb", 19980730)
+INTRO (U"A command in the @@Open menu@ that creates a @LongSound object.")
+NORMAL (U"The file will be opened for reading only. The file stays open until you remove the LongSound object.")
 MAN_END
 
-MAN_BEGIN (L"Sesam/LVS files", L"ppgb", 20141001)
-INTRO (L"A way for storing a @Sound object on disk.")
-ENTRY (L"File format")
-NORMAL (L"The sound files used by the SESAM and LVS programs. Each sample is normally quantized into 12 bits.")
-ENTRY (L"Reading")
-NORMAL (L"To read a #Sound from a Sesam file on disk, use @@Read from file... at . "
+MAN_BEGIN (U"Sesam/LVS files", U"ppgb", 20141001)
+INTRO (U"A way for storing a @Sound object on disk.")
+ENTRY (U"File format")
+NORMAL (U"The sound files used by the SESAM and LVS programs. Each sample is normally quantized into 12 bits.")
+ENTRY (U"Reading")
+NORMAL (U"To read a #Sound from a Sesam file on disk, use @@Read from file... at . "
 	"The file name is expected to end in \".sdf\" or \".SDF\".")
-NORMAL (L"The 12-bit sample values are divided by 2048 so that the amplitude "
+NORMAL (U"The 12-bit sample values are divided by 2048 so that the amplitude "
 	"of the resulting Sound is between -1.0 and +1.0.")
-NORMAL (L"The resulting #Sound will appear in the List of Objects; "
+NORMAL (U"The resulting #Sound will appear in the List of Objects; "
 	"its name will be equal to the file name, without extension.")
-NORMAL (L"If the sound was encoded in 16 bits per sample, you should divide by 16 after reading "
+NORMAL (U"If the sound was encoded in 16 bits per sample, you should divide by 16 after reading "
 	"(with $$Formula: \"self/16\"$)")
-ENTRY (L"Saving")
-NORMAL (L"With ##Save as Sesam file...#. Praat then asks you for a file name. "
+ENTRY (U"Saving")
+NORMAL (U"With ##Save as Sesam file...#. Praat then asks you for a file name. "
 	"After you click OK, the samples of the Sound are multiplied by 2048 "
 	"and quantized between -2048 and 2047; "
 	"the result is written to the file in 12-bit LVS and Sesam format.")
-NORMAL (L"To avoid clipping, keep the absolute amplitude below 1.000. "
+NORMAL (U"To avoid clipping, keep the absolute amplitude below 1.000. "
 	"If the maximum sound pressure level is 91 dB (top = 2047), "
 	"the quantization threshold is (top = 1/2) 19 dB.")
-NORMAL (L"If you prefer 16-bit encoding, you should multiply by 16 before saving "
+NORMAL (U"If you prefer 16-bit encoding, you should multiply by 16 before saving "
 	"(with $$Formula: \"self*16\"$)")
 MAN_END
 
diff --git a/fon/manual_spectrum.cpp b/fon/manual_spectrum.cpp
index 7e1e5ca..948b1cc 100644
--- a/fon/manual_spectrum.cpp
+++ b/fon/manual_spectrum.cpp
@@ -1,6 +1,6 @@
 /* manual_spectrum.cpp
  *
- * Copyright (C) 1992-2010,2014 Paul Boersma
+ * Copyright (C) 1992-2010,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,281 +21,282 @@
 
 #include "Sound.h"
 
-static void draw_SpectrumHann (Graphics g, double f1, double f2, int stop, int garnish) {
-	double fmin = garnish == 1 ? 300 : 0, fmax = garnish == 1 ? 1300 : 4000, df = garnish == 1 ? 1 : 4;
-	Sound me = Sound_create (1, fmin, fmax, (fmax - fmin) / df + 1, df, fmin);
-	double w = 100, f1left = f1 - w, f1right = f1 + w, f2left = f2 - w, f2right = f2 + w, halfpibysmooth = NUMpi / (w + w);
-	int i;
-	if (! me) return;
-	Graphics_setWindow (g, fmin, fmax, -0.1, 1.1);
-	for (i = 1; i <= my nx; i ++) {
-		double f = my x1 + (i - 1) * my dx;
-		my z [1] [i] = f < f1left ? 0.0 : f < f1right ? ( f1 > 0.0 ? 0.5 - 0.5 * cos (halfpibysmooth * (f - f1left)) : 1.0 ) :
-			f < f2left ? 1.0 : f < f2right ? ( f2 < fmax ? 0.5 + 0.5 * cos (halfpibysmooth * (f - f2left)) : 1.0 ) : 0.0;
+static void draw_SpectrumHann (Graphics g, double f1, double f2, bool stop, int garnish) {
+	try {
+		double fmin = garnish == 1 ? 300 : 0, fmax = garnish == 1 ? 1300 : 4000, df = garnish == 1 ? 1 : 4;
+		autoSound me = Sound_create (1, fmin, fmax, (long) floor ((fmax - fmin) / df) + 1, df, fmin);
+		double w = 100, f1left = f1 - w, f1right = f1 + w, f2left = f2 - w, f2right = f2 + w, halfpibysmooth = NUMpi / (w + w);
+		Graphics_setWindow (g, fmin, fmax, -0.1, 1.1);
+		for (int i = 1; i <= my nx; i ++) {
+			double f = my x1 + (i - 1) * my dx;
+			my z [1] [i] = f < f1left ? 0.0 : f < f1right ? ( f1 > 0.0 ? 0.5 - 0.5 * cos (halfpibysmooth * (f - f1left)) : 1.0 ) :
+				f < f2left ? 1.0 : f < f2right ? ( f2 < fmax ? 0.5 + 0.5 * cos (halfpibysmooth * (f - f2left)) : 1.0 ) : 0.0;
+		}
+		if (stop)
+			for (int i = 1; i <= my nx; i ++)
+				my z [1] [i] = 1.0 - my z [1] [i];
+		if (garnish) {
+			Graphics_drawInnerBox (g);
+			Graphics_textLeft (g, true, U"Amplitude filter %H (%f)");
+			Graphics_markLeft (g, 0.0, true, true, false, nullptr);
+			Graphics_markLeft (g, 1.0, true, true, false, nullptr);
+		}
+		if (garnish == 1) {
+			Graphics_textBottom (g, true, U"Frequency %f");
+			Graphics_markBottom (g, f1left, false, true, true, U"%f__1_-%w");
+			Graphics_markBottom (g, f1, false, true, true, U"%f__1_");
+			Graphics_markBottom (g, f1right, false, true, true, U"%f__1_+%w");
+			Graphics_markBottom (g, f2left, false, true, true, U"%f__2_-%w");
+			Graphics_markBottom (g, f2, false, true, true, U"%f__2_");
+			Graphics_markBottom (g, f2right, false, true, true, U"%f__2_+%w");
+			Graphics_markRight (g, 1.0, false, true, false, U"0 dB");
+			Graphics_markLeft (g, 0.5, true, true, true, nullptr);
+			Graphics_markRight (g, 0.5, false, true, false, U"-6 dB");
+		}
+		if (garnish == 2) {
+			Graphics_textBottom (g, true, U"Frequency %f (Hz)");
+			Graphics_markBottom (g, 0.0, true, true, false, nullptr);
+			Graphics_markBottom (g, 500.0, true, true, false, nullptr);
+			Graphics_markBottom (g, 1000.0, true, true, false, nullptr);
+			Graphics_markBottom (g, 2000.0, true, true, false, nullptr);
+			Graphics_markBottom (g, 4000.0, true, true, false, nullptr);
+		}
+		Graphics_setColour (g, stop ? Graphics_BLUE : Graphics_RED);
+		Sound_draw (me.get(), g, 0.0, 0.0, -0.1, 1.1, false, U"curve");
+		Graphics_setColour (g, Graphics_BLACK);
+	} catch (MelderError) {
+		Melder_clearError ();
 	}
-	if (stop)
-		for (i = 1; i <= my nx; i ++)
-			my z [1] [i] = 1.0 - my z [1] [i];
-	if (garnish) {
-		Graphics_drawInnerBox (g);
-		Graphics_textLeft (g, TRUE, L"Amplitude filter %H (%f)");
-		Graphics_markLeft (g, 0, TRUE, TRUE, FALSE, NULL);
-		Graphics_markLeft (g, 1, TRUE, TRUE, FALSE, NULL);
-	}
-	if (garnish == 1) {
-		Graphics_textBottom (g, TRUE, L"Frequency %f");
-		Graphics_markBottom (g, f1left, FALSE, TRUE, TRUE, L"%f__1_-%w");
-		Graphics_markBottom (g, f1, FALSE, TRUE, TRUE, L"%f__1_");
-		Graphics_markBottom (g, f1right, FALSE, TRUE, TRUE, L"%f__1_+%w");
-		Graphics_markBottom (g, f2left, FALSE, TRUE, TRUE, L"%f__2_-%w");
-		Graphics_markBottom (g, f2, FALSE, TRUE, TRUE, L"%f__2_");
-		Graphics_markBottom (g, f2right, FALSE, TRUE, TRUE, L"%f__2_+%w");
-		Graphics_markRight (g, 1, FALSE, TRUE, FALSE, L"0 dB");
-		Graphics_markLeft (g, 0.5, TRUE, TRUE, TRUE, NULL);
-		Graphics_markRight (g, 0.5, FALSE, TRUE, FALSE, L"-6 dB");
-	}
-	if (garnish == 2) {
-		Graphics_textBottom (g, TRUE, L"Frequency %f (Hz)");
-		Graphics_markBottom (g, 0, TRUE, TRUE, FALSE, NULL);
-		Graphics_markBottom (g, 500, TRUE, TRUE, FALSE, NULL);
-		Graphics_markBottom (g, 1000, TRUE, TRUE, FALSE, NULL);
-		Graphics_markBottom (g, 2000, TRUE, TRUE, FALSE, NULL);
-		Graphics_markBottom (g, 4000, TRUE, TRUE, FALSE, NULL);
-	}
-	Graphics_setColour (g, stop ? Graphics_BLUE : Graphics_RED);
-	Sound_draw (me, g, 0, 0, -0.1, 1.1, FALSE, L"curve");
-	Graphics_setColour (g, Graphics_BLACK);
-	forget (me);
 }
 static void draw_SpectrumPassHann (Graphics g) {
-	draw_SpectrumHann (g, 500, 1000, 0, 1);
+	draw_SpectrumHann (g, 500.0, 1000.0, false, 1);
 }
 static void draw_SpectrumPassHann_decompose (Graphics g) {
-	draw_SpectrumHann (g, 0, 500, 0, 2);
-	draw_SpectrumHann (g, 500, 1000, 0, 0);
-	draw_SpectrumHann (g, 1000, 2000, 0, 0);
-	draw_SpectrumHann (g, 2000, 4000, 0, 0);
+	draw_SpectrumHann (g, 0.0, 500.0, false, 2);
+	draw_SpectrumHann (g, 500, 1000, false, 0);
+	draw_SpectrumHann (g, 1000, 2000, false, 0);
+	draw_SpectrumHann (g, 2000, 4000, false, 0);
 }
 static void draw_SpectrumStopHann (Graphics g) { draw_SpectrumHann (g, 500, 1000, 1, 1); }
 static void draw_SpectrumStopHann_decompose (Graphics g) {
-	draw_SpectrumHann (g, 500, 1000, 0, 2);
-	draw_SpectrumHann (g, 500, 1000, 1, 0);
+	draw_SpectrumHann (g, 500.0, 1000.0, false, 2);
+	draw_SpectrumHann (g, 500.0, 1000.0, true, 0);
 }
 
 void manual_spectrum_init (ManPages me);
 void manual_spectrum_init (ManPages me) {
 
-MAN_BEGIN (L"Ltas", L"ppgb", 20070320)
-INTRO (L"One of the @@types of objects@ in Praat. "
+MAN_BEGIN (U"Ltas", U"ppgb", 20070320)
+INTRO (U"One of the @@types of objects@ in Praat. "
 	"#Ltas is short for Long-Term Average Spectrum.")
-NORMAL (L"An object of class Ltas represents the logarithmic @@power spectral density@ as a function of frequency, "
+NORMAL (U"An object of class Ltas represents the logarithmic @@power spectral density@ as a function of frequency, "
 	"expressed in dB/Hz relative to 2·10^^-5^ Pa. ")
-ENTRY (L"Inside an Ltas object")
-NORMAL (L"With @Inspect, you will see the following attributes:")
-TAG (L"%x__%min_")
-DEFINITION (L"the bottom of the frequency domain, in hertz. Usually 0.")
-TAG (L"%x__%max_")
-DEFINITION (L"the top of the frequency domain, in hertz.")
-TAG (L"%n__%x_")
-DEFINITION (L"the number of frequency bins (≥ 1).")
-TAG (L"%dx")
-DEFINITION (L"the frequency step, or %%bin width%, in hertz.")
-TAG (L"%x__1_")
-DEFINITION (L"the frequency associated with the first bin, in hertz. "
+ENTRY (U"Inside an Ltas object")
+NORMAL (U"With @Inspect, you will see the following attributes:")
+TAG (U"%x__%min_")
+DEFINITION (U"the bottom of the frequency domain, in hertz. Usually 0.")
+TAG (U"%x__%max_")
+DEFINITION (U"the top of the frequency domain, in hertz.")
+TAG (U"%n__%x_")
+DEFINITION (U"the number of frequency bins (≥ 1).")
+TAG (U"%dx")
+DEFINITION (U"the frequency step, or %%bin width%, in hertz.")
+TAG (U"%x__1_")
+DEFINITION (U"the frequency associated with the first bin, in hertz. "
 	"Usually equals %dx / 2, because the first bin tends to start at 0 hertz.")
-TAG (L"%z__1%i_, %i = 1 ... %n__%x_")
-DEFINITION (L"the power spectral density, expressed in dB. ")
+TAG (U"%z__1%i_, %i = 1 ... %n__%x_")
+DEFINITION (U"the power spectral density, expressed in dB. ")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get bin number from frequency...", L"ppgb", 20140421)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return bin")
-NORMAL (L"the band number belonging to the specified frequency, expressed as a real number.")
-ENTRY (L"Example")
-NORMAL (L"If the Ltas has a bin width of 1000 Hz, and the lowest frequency is 0 Hz, "
+MAN_BEGIN (U"Ltas: Get bin number from frequency...", U"ppgb", 20140421)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return bin")
+NORMAL (U"the band number belonging to the specified frequency, expressed as a real number.")
+ENTRY (U"Example")
+NORMAL (U"If the Ltas has a bin width of 1000 Hz, and the lowest frequency is 0 Hz, "
 	"the bin number associated with a frequency of 1800 Hz is 2.3.")
-ENTRY (L"Scripting")
-NORMAL (L"You can use this command to put the nearest bin centre into a script variable:")
-CODE (L"selectObject: \"Ltas hallo\"")
-CODE (L"bin = Get bin number from frequency: 1800")
-CODE (L"nearestBin = round (bin)")
-NORMAL (L"In this case, the value will not be written into the Info window. To round down or up, use")
-CODE (L"leftBin = floor (bin)")
-CODE (L"rightBin = ceiling (bin)")
-MAN_END
-
-MAN_BEGIN (L"Ltas: Get bin width", L"ppgb", 20041122)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the with of a bin, expressed in hertz.")
-MAN_END
-
-MAN_BEGIN (L"Ltas: Get frequency from bin number...", L"ppgb", 20041122)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the frequency (in hertz) associated with a specified bin number.")
-ENTRY (L"Setting")
-TAG (L"##Bin number")
-DEFINITION (L"the bin number whose frequency is sought.")
-ENTRY (L"Algorithm")
-NORMAL (L"the result is")
-FORMULA (L"%f__1_ + (%binNumber - 1) · Δ%f")
-NORMAL (L"where %f__1_ is the frequency associated with the centre of the first bin, "
+ENTRY (U"Scripting")
+NORMAL (U"You can use this command to put the nearest bin centre into a script variable:")
+CODE (U"selectObject: \"Ltas hallo\"")
+CODE (U"bin = Get bin number from frequency: 1800")
+CODE (U"nearestBin = round (bin)")
+NORMAL (U"In this case, the value will not be written into the Info window. To round down or up, use")
+CODE (U"leftBin = floor (bin)")
+CODE (U"rightBin = ceiling (bin)")
+MAN_END
+
+MAN_BEGIN (U"Ltas: Get bin width", U"ppgb", 20041122)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the with of a bin, expressed in hertz.")
+MAN_END
+
+MAN_BEGIN (U"Ltas: Get frequency from bin number...", U"ppgb", 20041122)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the frequency (in hertz) associated with a specified bin number.")
+ENTRY (U"Setting")
+TAG (U"##Bin number")
+DEFINITION (U"the bin number whose frequency is sought.")
+ENTRY (U"Algorithm")
+NORMAL (U"the result is")
+FORMULA (U"%f__1_ + (%binNumber - 1) · Δ%f")
+NORMAL (U"where %f__1_ is the frequency associated with the centre of the first bin, "
 	"and Δ%f is the bin width.")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get frequency of maximum...", L"ppgb", 20110701)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the frequency (in hertz) associated with the maximum energy density.")
-ENTRY (L"Settings")
-TAG (L"##From frequency (Hz)")
-TAG (L"##To frequency (Hz)")
-DEFINITION (L"the selected frequency domain. Values outside this domain are ignored. "
+MAN_BEGIN (U"Ltas: Get frequency of maximum...", U"ppgb", 20110701)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the frequency (in hertz) associated with the maximum energy density.")
+ENTRY (U"Settings")
+TAG (U"##From frequency (Hz)")
+TAG (U"##To frequency (Hz)")
+DEFINITION (U"the selected frequency domain. Values outside this domain are ignored. "
 	"If ##To frequency# is not greater than ##From frequency#, "
 	"the entire frequency domain of the Ltas object is considered.")
-TAG (L"##Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"##Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is #None because of the usual large binning. "
 	"If the Ltas was computed with @@Spectrum: To Ltas (1-to-1)@, "
 	"a #Parabolic or #Cubic interpolation would be more appropriate.")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get frequency of minimum...", L"ppgb", 20030916)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the frequency (in hertz) associated with the minimum energy density.")
-ENTRY (L"Settings")
-TAG (L"##Time range (s)")
-DEFINITION (L"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
+MAN_BEGIN (U"Ltas: Get frequency of minimum...", U"ppgb", 20030916)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the frequency (in hertz) associated with the minimum energy density.")
+ENTRY (U"Settings")
+TAG (U"##Time range (s)")
+DEFINITION (U"the time range (%t__1_, %t__2_). Values outside this range are ignored. "
 	"If %t__1_ is not less than %t__2_, the entire frequency domain of the Ltas is considered.")
-TAG (L"%%Interpolation")
-DEFINITION (L"the interpolation method (None, Parabolic, Cubic, Sinc) of the @@vector peak interpolation at . "
+TAG (U"%%Interpolation")
+DEFINITION (U"the interpolation method (None, Parabolic, Cubic, Sinc) of the @@vector peak interpolation at . "
 	"The standard is None because of the usual large binning. "
 	"If the Ltas was computed with @@Spectrum: To Ltas (1-to-1)@, "
 	"a Parabolic or Cubic interpolation would be more appropriate.")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get highest frequency", L"ppgb", 20041122)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the highest frequency, expressed in hertz.")
+MAN_BEGIN (U"Ltas: Get highest frequency", U"ppgb", 20041122)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the highest frequency, expressed in hertz.")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get lowest frequency", L"ppgb", 20041122)
-INTRO (L"A @query to the selected @Ltas object for its lowest frequency.")
-ENTRY (L"Return value")
-NORMAL (L"the lowest frequency, expressed in Hertz. It is usually 0 Hz.")
+MAN_BEGIN (U"Ltas: Get lowest frequency", U"ppgb", 20041122)
+INTRO (U"A @query to the selected @Ltas object for its lowest frequency.")
+ENTRY (U"Return value")
+NORMAL (U"the lowest frequency, expressed in Hertz. It is usually 0 Hz.")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get maximum...", L"ppgb", 20101228)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the maximum value (in dB) within a specified frequency range.")
-ENTRY (L"Settings")
-TAG (L"##From frequency (Hz))")
-TAG (L"##To frequency (Hz)")
-DEFINITION (L"the selected frequency domain. Values outside this domain are ignored. "
+MAN_BEGIN (U"Ltas: Get maximum...", U"ppgb", 20101228)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the maximum value (in dB) within a specified frequency range.")
+ENTRY (U"Settings")
+TAG (U"##From frequency (Hz))")
+TAG (U"##To frequency (Hz)")
+DEFINITION (U"the selected frequency domain. Values outside this domain are ignored. "
 	"If %%To frequency% is not greater than %%From frequency%, "
 	"the entire frequency domain of the Ltas object is considered.")
-TAG (L"%%Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"%%Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is #None because of the usual large binning. "
 	"If the Ltas was computed with @@Spectrum: To Ltas (1-to-1)@, "
 	"a Parabolic or Cubic interpolation would be more appropriate.")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get mean...", L"ppgb", 20041122)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the mean value (in dB) within a specified frequency range.")
-ENTRY (L"Settings")
-TAG (L"##From frequency (Hz))")
-TAG (L"##To frequency (Hz)")
-DEFINITION (L"the frequency range. Values outside this range are ignored. "
+MAN_BEGIN (U"Ltas: Get mean...", U"ppgb", 20041122)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the mean value (in dB) within a specified frequency range.")
+ENTRY (U"Settings")
+TAG (U"##From frequency (Hz))")
+TAG (U"##To frequency (Hz)")
+DEFINITION (U"the frequency range. Values outside this range are ignored. "
 	"If ##To frequency# is not greater than ##From frequency#, the entire frequency domain of the Ltas is considered.")
-ENTRY (L"Algorithm")
-NORMAL (L"The mean value between the frequencies %f__1_ and %f__2_ is defined as")
-FORMULA (L"1/(%f__2_ - %f__1_)  ∫__%%f%1_^^%%f%2^ %df %x(%f)")
-NORMAL (L"where %x(%f) is the LTAS as a function of frequency, expressed in dB. "
+ENTRY (U"Algorithm")
+NORMAL (U"The mean value between the frequencies %f__1_ and %f__2_ is defined as")
+FORMULA (U"1/(%f__2_ - %f__1_)  ∫__%%f%1_^^%%f%2^ %df %x(%f)")
+NORMAL (U"where %x(%f) is the LTAS as a function of frequency, expressed in dB. "
 	"For our discrete Ltas object, this mean is approximated by")
-FORMULA (L"1/%n ∑__%i=%m..%m+%n-1_ %x__%i_")
-NORMAL (L"where %n is the number of band centres between %f__1_ and %f__2_.")
-MAN_END
-
-MAN_BEGIN (L"Ltas: Get minimum...", L"ppgb", 20030916)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the minimum value (in dB) within a specified frequency range.")
-ENTRY (L"Settings")
-TAG (L"##From frequency (Hz))")
-TAG (L"##To frequency (Hz)")
-DEFINITION (L"the selected frequency domain. Values outside this domain are ignored. "
+FORMULA (U"1/%n ∑__%i=%m..%m+%n-1_ %x__%i_")
+NORMAL (U"where %n is the number of band centres between %f__1_ and %f__2_.")
+MAN_END
+
+MAN_BEGIN (U"Ltas: Get minimum...", U"ppgb", 20030916)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the minimum value (in dB) within a specified frequency range.")
+ENTRY (U"Settings")
+TAG (U"##From frequency (Hz))")
+TAG (U"##To frequency (Hz)")
+DEFINITION (U"the selected frequency domain. Values outside this domain are ignored. "
 	"If ##To frequency# is not greater than ##From frequency#, "
 	"the entire frequency domain of the Ltas object is considered.")
-TAG (L"%%Interpolation")
-DEFINITION (L"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
+TAG (U"%%Interpolation")
+DEFINITION (U"the interpolation method (#None, #Parabolic, #Cubic, #Sinc) of the @@vector peak interpolation at . "
 	"The standard is #None because of the usual large binning. "
 	"If the Ltas was computed with @@Spectrum: To Ltas (1-to-1)@, "
 	"a #Parabolic or #Cubic interpolation would be more appropriate.")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get number of bins", L"ppgb", 20041122)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the total number of frequency bins.")
+MAN_BEGIN (U"Ltas: Get number of bins", U"ppgb", 20041122)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the total number of frequency bins.")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get standard deviation...", L"ppgb", 19991016)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the standard deviation (in dB) of the LTAS within a specified frequency domain.")
-ENTRY (L"Settings")
-TAG (L"##From frequency (Hz))")
-TAG (L"##To frequency (Hz)")
-DEFINITION (L"the frequency window. Values outside this domain are ignored. "
+MAN_BEGIN (U"Ltas: Get standard deviation...", U"ppgb", 19991016)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the standard deviation (in dB) of the LTAS within a specified frequency domain.")
+ENTRY (U"Settings")
+TAG (U"##From frequency (Hz))")
+TAG (U"##To frequency (Hz)")
+DEFINITION (U"the frequency window. Values outside this domain are ignored. "
 	"If ##To frequency# is not greater than ##From frequency#, the entire frequency domain of the Ltas is considered.")
-ENTRY (L"Algorithm")
-NORMAL (L"The standard deviation between the frequencies %f__1_ and %f__2_ is defined as")
-FORMULA (L"1/(%f__2_ – %f__1_)  ∫__%%f%1_^^%%f%2^ %df (%x(%f) – %μ)^2")
-NORMAL (L"where %x(%f) is the LTAS as a function of frequency, and %μ its mean. "
+ENTRY (U"Algorithm")
+NORMAL (U"The standard deviation between the frequencies %f__1_ and %f__2_ is defined as")
+FORMULA (U"1/(%f__2_ – %f__1_)  ∫__%%f%1_^^%%f%2^ %df (%x(%f) – %μ)^2")
+NORMAL (U"where %x(%f) is the LTAS as a function of frequency, and %μ its mean. "
 	"For our discrete Ltas object, the standard deviation is approximated by")
-FORMULA (L"1/(%n–1) ∑__%i=%m..%m+%n-1_ (%x__%i_ – %μ)^2")
-NORMAL (L"where %n is the number of band centres between %f__1_ and %f__2_. Note the \"minus 1\".")
+FORMULA (U"1/(%n–1) ∑__%i=%m..%m+%n-1_ (%x__%i_ – %μ)^2")
+NORMAL (U"where %n is the number of band centres between %f__1_ and %f__2_. Note the \"minus 1\".")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get value at frequency...", L"ppgb", 20101228)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the value (in dB) at a specified frequency. "
+MAN_BEGIN (U"Ltas: Get value at frequency...", U"ppgb", 20101228)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the value (in dB) at a specified frequency. "
 	"If %frequency is outside the bands of the Ltas, the result is 0.")
-ENTRY (L"Settings")
-TAG (L"##Frequency (Hz)")
-DEFINITION (L"the frequency at which the value is to be evaluated.")
-TAG (L"%%Interpolation")
-DEFINITION (L"the interpolation method, see @@vector value interpolation at . "
+ENTRY (U"Settings")
+TAG (U"##Frequency (Hz)")
+DEFINITION (U"the frequency at which the value is to be evaluated.")
+TAG (U"%%Interpolation")
+DEFINITION (U"the interpolation method, see @@vector value interpolation at . "
 	"The standard is #None because binning is usually large.")
 MAN_END
 
-MAN_BEGIN (L"Ltas: Get value in bin...", L"ppgb", 20041122)
-INTRO (L"A @query to the selected @Ltas object.")
-ENTRY (L"Return value")
-NORMAL (L"the LTAS value (in dB) in a specified bin. "
+MAN_BEGIN (U"Ltas: Get value in bin...", U"ppgb", 20041122)
+INTRO (U"A @query to the selected @Ltas object.")
+ENTRY (U"Return value")
+NORMAL (U"the LTAS value (in dB) in a specified bin. "
 	"If the bin number is less than 1 or greater than the number of bin, the result is 0; "
 	"otherwise, it is %z [1] [%%bin number%].")
-ENTRY (L"Setting")
-TAG (L"##Bin number")
-DEFINITION (L"the bin whose value is to be looked up.")
+ENTRY (U"Setting")
+TAG (U"##Bin number")
+DEFINITION (U"the bin whose value is to be looked up.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Spectrogram...", L"ppgb", 20140421)
-INTRO (L"A command that creates a @Spectrogram from every selected @Sound object. "
+MAN_BEGIN (U"Sound: To Spectrogram...", U"ppgb", 20140421)
+INTRO (U"A command that creates a @Spectrogram from every selected @Sound object. "
 	"It performs a %%short-term spectral analysis%, which means that for a number of time points in the Sound, "
 	"Praat computes an approximation of the spectrum at that time. Each such spectrum is called an %%analysis frame%.")
-NORMAL (L"For tutorial information, see @@Intro 3. Spectral analysis at .")
-ENTRY (L"Settings")
-TAG (L"##Window length (s)")
-DEFINITION (L"the duration of the analysis window, in seconds. If this is 0.005 seconds, Praat uses for each frame "
+NORMAL (U"For tutorial information, see @@Intro 3. Spectral analysis at .")
+ENTRY (U"Settings")
+TAG (U"##Window length (s)")
+DEFINITION (U"the duration of the analysis window, in seconds. If this is 0.005 seconds, Praat uses for each frame "
 	"the part of the sound that lies between 0.0025 seconds before and 0.0025 seconds after the centre of that frame "
 	"(for Gaussian windows, Praat actually uses a bit more than that). "
 	"The window length determines the %bandwidth of the spectral analysis, i.e. the width of the horizontal line "
@@ -305,122 +306,122 @@ DEFINITION (L"the duration of the analysis window, in seconds. If this is 0.005
 	"To get a `broad-band' spectrogram (bandwidth 260 Hz), set %%Window length% to 5 milliseconds; "
 	"to get a `narrow-band' spectrogram (bandwidth 43 Hz), set it to 30 milliseconds. "
 	"The other window shapes give slightly different values.")
-TAG (L"##Maximum frequency (Hz)")
-DEFINITION (L"the maximum frequency subject to analysis, e.g. 5000 hertz. "
+TAG (U"##Maximum frequency (Hz)")
+DEFINITION (U"the maximum frequency subject to analysis, e.g. 5000 hertz. "
 	"If it is higher than the Nyquist frequency of the Sound (which is half its sampling frequency), "
 	"some values in the result will be zero (and will be drawn in white by @@Spectrogram: Paint...@).")
-TAG (L"##Time step (s)")
-DEFINITION (L"the distance between the centres of subsequent frames, e.g. 0.002 seconds. "
+TAG (U"##Time step (s)")
+DEFINITION (U"the distance between the centres of subsequent frames, e.g. 0.002 seconds. "
 	"This determines the number of frames of the resulting Spectrogram. For instance, if the Sound is 1 second long, "
 	"and the time step is 2 milliseconds, the Spectrogram will consist of almost 500 frames "
 	"(not %exactly 500, because no reliable spectrum can be measured near the beginning and end of the sound). "
 	"See below for cases in which the time step of the resulting Spectrogram is different from what you supply here.")
-TAG (L"##Frequency step (Hz)")
-DEFINITION (L"the frequency resolution, e.g. 20 Hertz. "
+TAG (U"##Frequency step (Hz)")
+DEFINITION (U"the frequency resolution, e.g. 20 Hertz. "
 	"This determines the number of frequency bands (%bins) of the resulting Spectrogram. For instance, if the %%Maximum frequency% "
 	"is 5000 Hz, and the frequency step is 20 Hz, the Spectrogram will consist of 250 frequency bands. "
 	"See below for cases in which the frequency step of the resulting Spectrogram is different from what you supply here.")
-TAG (L"##Window shape")
-DEFINITION (L"determines the shape of the analysis window. "
+TAG (U"##Window shape")
+DEFINITION (U"determines the shape of the analysis window. "
 	"You can choose from: #Gaussian, #Square (none, rectangular), #Hamming (raised sine-squared), "
 	"#Bartlett (triangular), #Welch (parabolic), and #Hanning (sine-squared). "
 	"The Gaussian window is superior, as it gives no sidelobes in your spectrogram; "
 	"it analyzes a factor of 2 slower than the other window shapes, "
 	"because the analysis is actually performed on twice as many samples per frame.")
-NORMAL (L"For purposes of computation speed, Praat may decide to change the time step and the frequency step. "
+NORMAL (U"For purposes of computation speed, Praat may decide to change the time step and the frequency step. "
 	"This is because the time step never needs to be smaller than 1/(8√%π) of the window length, "
 	"and the frequency step never needs to be smaller than (√%π)/8 of the inverse of the window length. "
 	"For instance, if the window length is 29 ms, the actual time step will be never be less than 29/(8√%π) = 2.045 ms. "
 	"And if the window length is 5 ms, the actual frequency step will never be less than (√%π)/8/0.005 = 44.31 Hz.")
-ENTRY (L"Tests of the bandwidth")
-NORMAL (L"You can check the bandwidth formula with the following procedure:")
-CODE (L"! create a 1000-Hz sine wave, windowed by a 0.2-seconds Gaussian window.")
-CODE (L"Create Sound from formula: \"gauss\", 1, 0.0, 1.0, 44100, \"sin(2*pi*1000*x) * exp(-3*((x-0.5)/0.1)\\^ 2)\"")
-CODE (L"! compute its spectrum and look at its bandwidth")
-CODE (L"To Spectrum: \"yes\"")
-CODE (L"Draw: 980, 1020, 20, 80, \"yes\"")
-CODE (L"Marks bottom every: 1, 2, \"yes\", \"yes\", \"yes\"")
-CODE (L"Marks left every: 1, 2, \"yes\", \"yes\", \"yes\"")
-CODE (L"! now you should see a peak at 1000 Hz with a 3 dB bandwidth of 7 Hz (20 dB: 17 Hz)")
-CODE (L"! more precise: compute the position and width of the peak, and write them to the console")
-CODE (L"Formula: \"if x<980 or x>1020 then 0 else self fi\"")
-CODE (L"To Formant (peaks): 20")
-CODE (L"Write to console")
-CODE (L"! now you should be able to read that a peak was found at 999.99982 Hz")
-CODE (L"! with a bandwidth of 6.497 Hz; the theory above predicted 6.491 Hz")
-CODE (L"")
-CODE (L"! The same, windowed by a 0.1-seconds Hamming window.")
-CODE (L"Create Sound from formula: \"Hamming\", 1, 0.0, 1.0, 44100, \"if x<0.4 or x>0.6 then 0 else sin(2*pi*1000*x)*(0.54+0.46*cos(pi*(x-0.5)/0.1)) fi\"")
-CODE (L"To Spectrum: \"yes\"")
-CODE (L"Formula: \"if x<970 or x>1030 then 0 else self fi\"")
-CODE (L"To Formant (peaks): 20")
-CODE (L"Write to console")
-CODE (L"! peak at 999.99817 Hz, 3 dB bw 6.518 Hz, 20 dB bw 15 Hz, zero bw 20 Hz, sidelobe -42 dB")
-CODE (L"")
-CODE (L"! The same, windowed by a 0.1-seconds rectangular window.")
-CODE (L"Create Sound from formula: \"rectangular\", 1, 0.0, 1.0, 44100, \"if x<0.4 or x>0.6 then 0 else sin(2*pi*1000*x) fi\"")
-CODE (L"To Spectrum: \"yes\"")
-CODE (L"Formula: \"if x<970 or x>1030 then 0 else self fi\"")
-CODE (L"To Formant (peaks): 20")
-CODE (L"Write to console")
-CODE (L"! peak at 999.99506 Hz, 3 dB bw 4.440 Hz, 20 dB bw 27 Hz, zero bw 10 Hz, sidelobe -14 dB")
-CODE (L"")
-CODE (L"! The same, windowed by a 0.1-seconds Hanning window.")
-CODE (L"Create Sound from formula: \"Hanning\", 1, 0.0, 1.0, 44100, \"if x<0.4 or x>0.6 then 0 else sin(2*pi*1000*x)*(0.5+0.5*cos(pi*(x-0.5)/0.1)) fi\"")
-CODE (L"To Spectrum: \"yes\"")
-CODE (L"Formula: \"if x<970 or x>1030 then 0 else self fi\"")
-CODE (L"To Formant (peaks): 20")
-CODE (L"Write to console")
-CODE (L"! peak at 999.99945 Hz, 3 dB bw 7.212 Hz, 20 dB bw 16 Hz, zero bw 20 Hz, sidelobe -31 dB")
-CODE (L"")
-CODE (L"! The same, windowed by a 0.1-seconds triangular window.")
-CODE (L"Create Sound from formula: \"triangular\", 1, 0.0, 1.0, 44100, \"if x<0.4 or x>0.6 then 0 else sin(2*pi*1000*x)*(1-abs((x-0.5)/0.1)) fi\"")
-CODE (L"To Spectrum: \"yes\"")
-CODE (L"Formula: \"if x<970 or x>1030 then 0 else self fi\"")
-CODE (L"To Formant (peaks): 20")
-CODE (L"Write to console")
-CODE (L"! peak at 999.99933 Hz, 3 dB bw 6.384 Hz, 20 dB bw 15 Hz, zero bw 20 Hz, sidelobe -26 dB")
-CODE (L"")
-CODE (L"! The same, windowed by a 0.1-seconds parabolic window.")
-CODE (L"Create Sound from formula: \"parabolic\", 1, 0.0, 1.0, 44100, \"if x<0.4 or x>0.6 then 0 else sin(2*pi*1000*x)*(1-((x-0.5)/0.1)^2) fi\"")
-CODE (L"To Spectrum: \"yes\"")
-CODE (L"Formula: \"if x<970 or x>1030 then 0 else self fi\"")
-CODE (L"To Formant (peaks): 20")
-CODE (L"Write to console")
-CODE (L"! peak at 999.99921 Hz, 3 dB bw 5.786 Hz, 20 dB bw 12 Hz, zero bw 15 Hz, sidelobe -21 dB")
-MAN_END
-
-MAN_BEGIN (L"Sound: To Ltas (pitch-corrected)...", L"ppgb", 20061203)
-INTRO (L"A command available in the #Spectrum menu if you select one or more @Sound objects. "
+ENTRY (U"Tests of the bandwidth")
+NORMAL (U"You can check the bandwidth formula with the following procedure:")
+CODE (U"! create a 1000-Hz sine wave, windowed by a 0.2-seconds Gaussian window.")
+CODE (U"Create Sound from formula: \"gauss\", 1, 0.0, 1.0, 44100, \"sin(2*pi*1000*x) * exp(-3*((x-0.5)/0.1)\\^ 2)\"")
+CODE (U"! compute its spectrum and look at its bandwidth")
+CODE (U"To Spectrum: \"yes\"")
+CODE (U"Draw: 980, 1020, 20, 80, \"yes\"")
+CODE (U"Marks bottom every: 1, 2, \"yes\", \"yes\", \"yes\"")
+CODE (U"Marks left every: 1, 2, \"yes\", \"yes\", \"yes\"")
+CODE (U"! now you should see a peak at 1000 Hz with a 3 dB bandwidth of 7 Hz (20 dB: 17 Hz)")
+CODE (U"! more precise: compute the position and width of the peak, and write them to the console")
+CODE (U"Formula: \"if x<980 or x>1020 then 0 else self fi\"")
+CODE (U"To Formant (peaks): 20")
+CODE (U"Write to console")
+CODE (U"! now you should be able to read that a peak was found at 999.99982 Hz")
+CODE (U"! with a bandwidth of 6.497 Hz; the theory above predicted 6.491 Hz")
+CODE (U"")
+CODE (U"! The same, windowed by a 0.1-seconds Hamming window.")
+CODE (U"Create Sound from formula: \"Hamming\", 1, 0.0, 1.0, 44100, \"if x<0.4 or x>0.6 then 0 else sin(2*pi*1000*x)*(0.54+0.46*cos(pi*(x-0.5)/0.1)) fi\"")
+CODE (U"To Spectrum: \"yes\"")
+CODE (U"Formula: \"if x<970 or x>1030 then 0 else self fi\"")
+CODE (U"To Formant (peaks): 20")
+CODE (U"Write to console")
+CODE (U"! peak at 999.99817 Hz, 3 dB bw 6.518 Hz, 20 dB bw 15 Hz, zero bw 20 Hz, sidelobe -42 dB")
+CODE (U"")
+CODE (U"! The same, windowed by a 0.1-seconds rectangular window.")
+CODE (U"Create Sound from formula: \"rectangular\", 1, 0.0, 1.0, 44100, \"if x<0.4 or x>0.6 then 0 else sin(2*pi*1000*x) fi\"")
+CODE (U"To Spectrum: \"yes\"")
+CODE (U"Formula: \"if x<970 or x>1030 then 0 else self fi\"")
+CODE (U"To Formant (peaks): 20")
+CODE (U"Write to console")
+CODE (U"! peak at 999.99506 Hz, 3 dB bw 4.440 Hz, 20 dB bw 27 Hz, zero bw 10 Hz, sidelobe -14 dB")
+CODE (U"")
+CODE (U"! The same, windowed by a 0.1-seconds Hanning window.")
+CODE (U"Create Sound from formula: \"Hanning\", 1, 0.0, 1.0, 44100, \"if x<0.4 or x>0.6 then 0 else sin(2*pi*1000*x)*(0.5+0.5*cos(pi*(x-0.5)/0.1)) fi\"")
+CODE (U"To Spectrum: \"yes\"")
+CODE (U"Formula: \"if x<970 or x>1030 then 0 else self fi\"")
+CODE (U"To Formant (peaks): 20")
+CODE (U"Write to console")
+CODE (U"! peak at 999.99945 Hz, 3 dB bw 7.212 Hz, 20 dB bw 16 Hz, zero bw 20 Hz, sidelobe -31 dB")
+CODE (U"")
+CODE (U"! The same, windowed by a 0.1-seconds triangular window.")
+CODE (U"Create Sound from formula: \"triangular\", 1, 0.0, 1.0, 44100, \"if x<0.4 or x>0.6 then 0 else sin(2*pi*1000*x)*(1-abs((x-0.5)/0.1)) fi\"")
+CODE (U"To Spectrum: \"yes\"")
+CODE (U"Formula: \"if x<970 or x>1030 then 0 else self fi\"")
+CODE (U"To Formant (peaks): 20")
+CODE (U"Write to console")
+CODE (U"! peak at 999.99933 Hz, 3 dB bw 6.384 Hz, 20 dB bw 15 Hz, zero bw 20 Hz, sidelobe -26 dB")
+CODE (U"")
+CODE (U"! The same, windowed by a 0.1-seconds parabolic window.")
+CODE (U"Create Sound from formula: \"parabolic\", 1, 0.0, 1.0, 44100, \"if x<0.4 or x>0.6 then 0 else sin(2*pi*1000*x)*(1-((x-0.5)/0.1)^2) fi\"")
+CODE (U"To Spectrum: \"yes\"")
+CODE (U"Formula: \"if x<970 or x>1030 then 0 else self fi\"")
+CODE (U"To Formant (peaks): 20")
+CODE (U"Write to console")
+CODE (U"! peak at 999.99921 Hz, 3 dB bw 5.786 Hz, 20 dB bw 12 Hz, zero bw 15 Hz, sidelobe -21 dB")
+MAN_END
+
+MAN_BEGIN (U"Sound: To Ltas (pitch-corrected)...", U"ppgb", 20061203)
+INTRO (U"A command available in the #Spectrum menu if you select one or more @Sound objects. "
 	"It tries to compute an @Ltas of the spectral envelope of the voiced parts, "
 	"correcting away the influence of F0 in a way that does not sacrifice frequency selectivity. "
 	"The resulting Ltas is meant to reflect only the resonances (formants) in the vocal tract "
 	"and the envelope of the glottal source spectrum.")
-NORMAL (L"The analysis method is described in @@Boersma & Kovacic (2006)@.")
+NORMAL (U"The analysis method is described in @@Boersma & Kovacic (2006)@.")
 MAN_END
 
-MAN_BEGIN (L"Sound: To Spectrum...", L"ppgb", 20041123)
-INTRO (L"A command that appears in the #Spectrum menu if you select one or more @Sound objects. "
+MAN_BEGIN (U"Sound: To Spectrum...", U"ppgb", 20041123)
+INTRO (U"A command that appears in the #Spectrum menu if you select one or more @Sound objects. "
 	"It turns the selected Sound into a @Spectrum by an over-all spectral analysis, a %%Fourier transform%.")
-ENTRY (L"Setting")
-TAG (L"##Fast")
-DEFINITION (L"determines whether zeroes are appended to the sound such that the number of samples is a power of two. "
+ENTRY (U"Setting")
+TAG (U"##Fast")
+DEFINITION (U"determines whether zeroes are appended to the sound such that the number of samples is a power of two. "
 	"This can appreciably speed up the Fourier transform.")
-ENTRY (L"Mathematical procedure")
-NORMAL (L"For the Fourier transform, the Praat-defined @@time domain@ of the @Sound is ignored. "
+ENTRY (U"Mathematical procedure")
+NORMAL (U"For the Fourier transform, the Praat-defined @@time domain@ of the @Sound is ignored. "
 	"Instead, its time domain is considered to run from %t=0 to %t=%T, "
 	"where %t=0 is supposed to be aligned with the first sample, "
 	"and %T is the total duration of the samples, i.e. %%N%Δ%t, "
 	"where %N is the number of samples and Δe%t is the @@sampling period at . "
 	"Thus, the last sample lies at %t=%T–Δ%t.")
-NORMAL (L"For a sound %x(%t), defined for all times %t in the domain (0, %T), "
+NORMAL (U"For a sound %x(%t), defined for all times %t in the domain (0, %T), "
 	"the complex spectrum %X(%f) for any frequency %f is the forward Fourier transform of %x(%t), with a negative exponent:")
-FORMULA (L"%X(%f) = ∫__0_^^%T^ %x(%t) %e^^-2%%πift%^ %dt")
-NORMAL (L"If the Sound is expressed in Pascal (Pa), the Spectrum is expressed in Pa·s, or Pa/Hz. "
+FORMULA (U"%X(%f) = ∫__0_^^%T^ %x(%t) %e^^-2%%πift%^ %dt")
+NORMAL (U"If the Sound is expressed in Pascal (Pa), the Spectrum is expressed in Pa·s, or Pa/Hz. "
 	"Since a @Spectrum object can only contain a finite number of frequency samples, "
 	"it is only computed for frequencies that are multiples of Δ%f = 1/%T. "
 	"The number of those frequencies is determined by the number of samples %N of the sound.")
-NORMAL (L"If %N is odd, there will be %N frequency samples. For instance, if the sound has 20,457 samples, "
+NORMAL (U"If %N is odd, there will be %N frequency samples. For instance, if the sound has 20,457 samples, "
 	"the spectrum will be computed at the frequencies -10,228Δ%f, -10,227Δ%f, ..., –Δ%f, 0, +Δ%f, ..., "
 	"+10,227Δ%f, +10,228Δ%f. If we suppose that a frequency sample represents a frequency bin with a width of Δ%f, "
 	"we see that the frequency samples span adjacent frequency ranges, "
@@ -429,7 +430,7 @@ NORMAL (L"If %N is odd, there will be %N frequency samples. For instance, if the
 	"which runs from -%F to +%F, where %F = 10,228.5Δ%f. "
 	"We can see that this frequency equals one half of the @@sampling frequency@ of the original sound: "
 	"%F = 10,228.5Δ%f = 10,228.5/%T = 10,228.5/(20,457Δ%t) = 0.5/Δ%t. This is the so-called @@Nyquist frequency at .")
-NORMAL (L"If %N is even, there will be %N+1 frequency samples. For instance, if the sound has 32,768 samples, "
+NORMAL (U"If %N is even, there will be %N+1 frequency samples. For instance, if the sound has 32,768 samples, "
 	"the spectrum will be computed at the frequencies -16,384Δ%f, -16,383Δ%f, ..., -Δ%f, 0, +Δ%f, ..., "
 	"+16,383Δ%f, +16,384Δ%f. Again, the frequency samples span adjacent frequency ranges, "
 	"but the first and last samples are only half as wide as the rest, "
@@ -437,19 +438,19 @@ NORMAL (L"If %N is even, there will be %N+1 frequency samples. For instance, if
 	"and the last from +16,383.5Δ%f to +16,384Δ%f. "
 	"Together, the frequency samples again span the frequency domain of the spectrum, "
 	"which runs from –%F to +%F, where %F = 16,384Δ%f = 0.5/Δ%t, the Nyquist frequency.")
-ENTRY (L"Storage")
-NORMAL (L"In a @Spectrum object, Praat stores the real and imaginary parts of the complex spectrum separately. "
+ENTRY (U"Storage")
+NORMAL (U"In a @Spectrum object, Praat stores the real and imaginary parts of the complex spectrum separately. "
 	"The real part is equal to the cosine transform:")
-FORMULA (L"re %X(%f) = ∫__0_^^%T^ %x(%t) cos (2%%πft%) %dt")
-NORMAL (L"The imaginary part is equal to the reverse of the sine transform:")
-FORMULA (L"im %X(%f) = – ∫__0_^^%T^ %x(%t) sin (2%%πft%) %dt")
-NORMAL (L"The complex spectrum can be reconstructed from the real and imaginary part as follows:")
-FORMULA (L"%X(%f) = re %X(%f) + %i im %X(%f)")
-NORMAL (L"Since the cosine is a symmetric function of %t and the sine is an antisymmetric function of %t, "
+FORMULA (U"re %X(%f) = ∫__0_^^%T^ %x(%t) cos (2%%πft%) %dt")
+NORMAL (U"The imaginary part is equal to the reverse of the sine transform:")
+FORMULA (U"im %X(%f) = – ∫__0_^^%T^ %x(%t) sin (2%%πft%) %dt")
+NORMAL (U"The complex spectrum can be reconstructed from the real and imaginary part as follows:")
+FORMULA (U"%X(%f) = re %X(%f) + %i im %X(%f)")
+NORMAL (U"Since the cosine is a symmetric function of %t and the sine is an antisymmetric function of %t, "
 	"the complex spectrum for a negative frequency is the complex conjugate of the complex spectrum for the corresponding "
 	"positive frequency:")
-FORMULA (L"%X(-%f) = re %X(-%f) + %i im %X(-%f) = re %X(%f) - %i im %X(%f) = %X^*(%f)")
-NORMAL (L"For purposes of storage, therefore, the negative frequencies are superfluous. "
+FORMULA (U"%X(-%f) = re %X(-%f) + %i im %X(-%f) = re %X(%f) - %i im %X(%f) = %X^*(%f)")
+NORMAL (U"For purposes of storage, therefore, the negative frequencies are superfluous. "
 	"For this reason, the Spectrum object stores re %X(%f) and im %X(%f) only for frequencies %f = 0, Δ%f, 2Δ%f... "
 	"In the case of a sound with 20,457 samples, the Spectrum object contains the real part of %X(0) "
 	"(its imaginary part is always zero), and the real and imaginary parts of %X(%f) "
@@ -457,16 +458,16 @@ NORMAL (L"For purposes of storage, therefore, the negative frequencies are super
 	"In the case of a sound with 32,768 samples, the Spectrum object contains the real parts of %X(0) and %X(16,384Δ%f) "
 	"(their imaginary parts are always zero), and the real and imaginary parts of %X(%f) "
 	"for frequencies from Δ%f to 16,383Δ%f, which makes in total 2+2·16,383 = 32,768 real values.")
-NORMAL (L"Since the negative frequencies have been removed, the frequency domain now runs from 0 to %F. "
+NORMAL (U"Since the negative frequencies have been removed, the frequency domain now runs from 0 to %F. "
 	"This means that the first frequency bin is now only 0.5Δ%f wide (i.e. as wide as the last bin for even-%N spectra), "
 	"which has consequences for computations of energies.")
-ENTRY (L"Behaviour")
-NORMAL (L"If you perform @@Spectrum: To Sound@ on the resulting Spectrum object, "
+ENTRY (U"Behaviour")
+NORMAL (U"If you perform @@Spectrum: To Sound@ on the resulting Spectrum object, "
 	"a Sound is created that is equal to the original Sound (or to the original Sound with appended zeroes).")
-ENTRY (L"Properties")
-NORMAL (L"The frequency integral over the squared Spectrum equals the time integral over the squared Sound:")
-FORMULA (L"∫__-%F_^^+%F^ |%X(%f)|^2 %df = ∫__0_^%T |%x(%t)|^2 %dt")
-NORMAL (L"This is called %%Parceval's theorem%.")
+ENTRY (U"Properties")
+NORMAL (U"The frequency integral over the squared Spectrum equals the time integral over the squared Sound:")
+FORMULA (U"∫__-%F_^^+%F^ |%X(%f)|^2 %df = ∫__0_^%T |%x(%t)|^2 %dt")
+NORMAL (U"This is called %%Parceval's theorem%.")
 /*
 Copy... square
 Formula... self^2
@@ -489,69 +490,69 @@ it removes the contour. I tested it. It works.
 */
 MAN_END
 
-MAN_BEGIN (L"Spectrogram", L"ppgb", 20070321)
-INTRO (L"One of the @@types of objects@ in Praat. For tutorial information, see @@Intro 3. Spectral analysis at .")
-NORMAL (L"A Spectrogram object represents  an acoustic time-frequency representation of a sound: "
+MAN_BEGIN (U"Spectrogram", U"ppgb", 20070321)
+INTRO (U"One of the @@types of objects@ in Praat. For tutorial information, see @@Intro 3. Spectral analysis at .")
+NORMAL (U"A Spectrogram object represents  an acoustic time-frequency representation of a sound: "
 	"the @@power spectral density@ %PSD (%f, %t), expressed in Pa^2/Hz. "
 	"It is sampled into a number of points centred around equally spaced times %t__%i_ "
 	"and frequencies %f__%j_.")
-ENTRY (L"Inside a Spectrogram")
-NORMAL (L"With @Inspect, you will see the following attributes:")
-TAG (L"%xmin")
-DEFINITION (L"start time, in seconds.")
-TAG (L"%xmax")
-DEFINITION (L"end time, in seconds.")
-TAG (L"%nx")
-DEFINITION (L"the number of times (≥ 1).")
-TAG (L"%dx")
-DEFINITION (L"time step, in seconds.")
-TAG (L"%x1")
-DEFINITION (L"the time associated with the first column, in seconds. "
+ENTRY (U"Inside a Spectrogram")
+NORMAL (U"With @Inspect, you will see the following attributes:")
+TAG (U"%xmin")
+DEFINITION (U"start time, in seconds.")
+TAG (U"%xmax")
+DEFINITION (U"end time, in seconds.")
+TAG (U"%nx")
+DEFINITION (U"the number of times (≥ 1).")
+TAG (U"%dx")
+DEFINITION (U"time step, in seconds.")
+TAG (U"%x1")
+DEFINITION (U"the time associated with the first column, in seconds. "
 	"This will usually be in the range [%xmin, %xmax]. "
 	"The time associated with the last column (i.e., %x1 + (%nx – 1) %dx)) "
 	"will also usually be in that range.")
-TAG (L"%ymin")
-DEFINITION (L"lowest frequency, in Hertz. Normally 0.")
-TAG (L"%ymax")
-DEFINITION (L"highest frequency, in Hertz.")
-TAG (L"%ny")
-DEFINITION (L"the number of frequencies (≥ 1).")
-TAG (L"%dy")
-DEFINITION (L"frequency step, in Hertz.")
-TAG (L"%y1")
-DEFINITION (L"the frequency associated with the first row, in Hertz. Usually %dy / 2. "
+TAG (U"%ymin")
+DEFINITION (U"lowest frequency, in Hertz. Normally 0.")
+TAG (U"%ymax")
+DEFINITION (U"highest frequency, in Hertz.")
+TAG (U"%ny")
+DEFINITION (U"the number of frequencies (≥ 1).")
+TAG (U"%dy")
+DEFINITION (U"frequency step, in Hertz.")
+TAG (U"%y1")
+DEFINITION (U"the frequency associated with the first row, in Hertz. Usually %dy / 2. "
 	"The frequency associated with the last row (i.e., %y1 + (%ny – 1) %dy)) "
 	"will often be %ymax - %dy / 2.")
-TAG (L"%z__%ij_, %i = 1 ... %ny, %j = 1 ... %nx")
-DEFINITION (L"the power spectral density, in Pa^2/Hz. ")
-MAN_END
-
-MAN_BEGIN (L"Spectrogram: Formula...", L"ppgb", 20021206)
-INTRO (L"A command for changing the data in all selected @Spectrogram objects.")
-NORMAL (L"See the @Formulas tutorial for examples and explanations.")
-MAN_END
-
-MAN_BEGIN (L"Spectrogram: Paint...", L"ppgb", 20030916)
-INTRO (L"A command to draw the selected @Spectrogram object(s) into the @@Picture window@ in shades of grey.")
-ENTRY (L"Settings")
-TAG (L"##From time (s)")
-TAG (L"##To time (s)")
-DEFINITION (L"the time domain along the %x axis.")
-TAG (L"##From frequency (Hz)")
-TAG (L"##To frequency (Hz)")
-DEFINITION (L"the frequency domain along the %y axis.")
-TAG (L"##Dynamic range (dB)")
-DEFINITION (L"The global maximum of the spectrogram (after preemphasis) will always be drawn in black; "
+TAG (U"%z__%ij_, %i = 1 ... %ny, %j = 1 ... %nx")
+DEFINITION (U"the power spectral density, in Pa^2/Hz. ")
+MAN_END
+
+MAN_BEGIN (U"Spectrogram: Formula...", U"ppgb", 20021206)
+INTRO (U"A command for changing the data in all selected @Spectrogram objects.")
+NORMAL (U"See the @Formulas tutorial for examples and explanations.")
+MAN_END
+
+MAN_BEGIN (U"Spectrogram: Paint...", U"ppgb", 20030916)
+INTRO (U"A command to draw the selected @Spectrogram object(s) into the @@Picture window@ in shades of grey.")
+ENTRY (U"Settings")
+TAG (U"##From time (s)")
+TAG (U"##To time (s)")
+DEFINITION (U"the time domain along the %x axis.")
+TAG (U"##From frequency (Hz)")
+TAG (U"##To frequency (Hz)")
+DEFINITION (U"the frequency domain along the %y axis.")
+TAG (U"##Dynamic range (dB)")
+DEFINITION (U"The global maximum of the spectrogram (after preemphasis) will always be drawn in black; "
 	"all values that are more than %%Dynamic range% dB below this maximum (after dynamic compression) "
 	"will be drawn in white. Values in-between have appropriate shades of grey.")
-TAG (L"##Preemphasis (dB/octave)")
-DEFINITION (L"determines the steepness of a high-pass filter, "
+TAG (U"##Preemphasis (dB/octave)")
+DEFINITION (U"determines the steepness of a high-pass filter, "
 	"i.e., how much the power of higher frequencies will be raised before drawing, as compared to lower frequencies. "
 	"Since the spectral slope of human vowels is approximately -6 dB per octave, "
 	"the standard value for this parameter is +6 dB per octave, "
 	"so that the spectrum is flattened and the higher formants look as strong as the lower ones.")
-TAG (L"##Dynamic compression")
-DEFINITION (L"determines how much stronger weak time frames should be made before drawing. "
+TAG (U"##Dynamic compression")
+DEFINITION (U"determines how much stronger weak time frames should be made before drawing. "
 	"Normally, this parameter is between 0 and 1. If it is 0, there is no dynamic compression. "
 	"If it is 1, all time frames (vertical bands) will be drawn equally strong, "
 	"i.e., all of them will contain frequencies that are drawn in black. "
@@ -561,235 +562,235 @@ DEFINITION (L"determines how much stronger weak time frames should be made befor
 	"so that its maximum will be seen at 44 dB (thus making this frame visible).")
 MAN_END
 
-MAN_BEGIN (L"Spectrogram: To Spectrum (slice)...", L"ppgb", 19961003)
-INTRO (L"A command to create a @Spectrum object from every selected @Spectrogram object.")
-ENTRY (L"Purpose")
-NORMAL (L"to extract the information contained in a Spectrogram at a certain time.")
-ENTRY (L"Algorithm")
-NORMAL (L"The Spectrum will be constructed from one frame of the Spectrogram, "
+MAN_BEGIN (U"Spectrogram: To Spectrum (slice)...", U"ppgb", 19961003)
+INTRO (U"A command to create a @Spectrum object from every selected @Spectrogram object.")
+ENTRY (U"Purpose")
+NORMAL (U"to extract the information contained in a Spectrogram at a certain time.")
+ENTRY (U"Algorithm")
+NORMAL (U"The Spectrum will be constructed from one frame of the Spectrogram, "
 	"namely the frame whose centre is closed to the %time argument. ")
 MAN_END
 
-MAN_BEGIN (L"Spectrum", L"ppgb", 20041123)
-INTRO (L"One of the @@types of objects@ in Praat. A Spectrum object represents "
+MAN_BEGIN (U"Spectrum", U"ppgb", 20041123)
+INTRO (U"One of the @@types of objects@ in Praat. A Spectrum object represents "
 	"the complex spectrum as a function of frequency. "
 	"If the spectrum was created from a sound (which is expressed in units of Pascal), "
 	"the complex values are expressed in units Pa/Hz (Pascal per Hertz). "
 	"For detailed information, see @@Sound: To Spectrum... at .")
-ENTRY (L"Spectrum commands")
-NORMAL (L"Creation:")
-LIST_ITEM (L"• @@Sound: To Spectrum...")
-NORMAL (L"Queries:")
-LIST_ITEM (L"• @@Spectrum: Get centre of gravity...")
-LIST_ITEM (L"• @@Spectrum: Get standard deviation...")
-LIST_ITEM (L"• @@Spectrum: Get skewness...")
-LIST_ITEM (L"• @@Spectrum: Get kurtosis...")
-LIST_ITEM (L"• @@Spectrum: Get central moment...")
-NORMAL (L"Modification:")
-LIST_ITEM (L"• @@Spectrum: Filter (pass Hann band)...")
-LIST_ITEM (L"• @@Spectrum: Filter (stop Hann band)...")
-LIST_ITEM (L"• @@Formula...")
-NORMAL (L"Conversion:")
-LIST_ITEM (L"• @@Spectrum: To Ltas (1-to-1)")
-LIST_ITEM (L"• @@Spectrum: To Spectrogram")
-NORMAL (L"Synthesis:")
-LIST_ITEM (L"• @@Spectrum: To Sound")
-MAN_END
-
-MAN_BEGIN (L"Spectrum: Filter (pass Hann band)...", L"ppgb", 20030916)
-INTRO (L"A command to modify every selected @Spectrum object.")
-NORMAL (L"The complex values in the #Spectrum are multiplied by real-valued sine shapes and straight lines, according to the following figure:")
+ENTRY (U"Spectrum commands")
+NORMAL (U"Creation:")
+LIST_ITEM (U"• @@Sound: To Spectrum...")
+NORMAL (U"Queries:")
+LIST_ITEM (U"• @@Spectrum: Get centre of gravity...")
+LIST_ITEM (U"• @@Spectrum: Get standard deviation...")
+LIST_ITEM (U"• @@Spectrum: Get skewness...")
+LIST_ITEM (U"• @@Spectrum: Get kurtosis...")
+LIST_ITEM (U"• @@Spectrum: Get central moment...")
+NORMAL (U"Modification:")
+LIST_ITEM (U"• @@Spectrum: Filter (pass Hann band)...")
+LIST_ITEM (U"• @@Spectrum: Filter (stop Hann band)...")
+LIST_ITEM (U"• @@Formula...")
+NORMAL (U"Conversion:")
+LIST_ITEM (U"• @@Spectrum: To Ltas (1-to-1)")
+LIST_ITEM (U"• @@Spectrum: To Spectrogram")
+NORMAL (U"Synthesis:")
+LIST_ITEM (U"• @@Spectrum: To Sound")
+MAN_END
+
+MAN_BEGIN (U"Spectrum: Filter (pass Hann band)...", U"ppgb", 20030916)
+INTRO (U"A command to modify every selected @Spectrum object.")
+NORMAL (U"The complex values in the #Spectrum are multiplied by real-valued sine shapes and straight lines, according to the following figure:")
 PICTURE (5, 3, draw_SpectrumPassHann)
-ENTRY (L"Settings")
-TAG (L"##From frequency (Hz)# (standard value: 500 Hz)")
-DEFINITION (L"the lower edge of the pass band (%f__1_ in the figure). The value zero is special: the filter then acts as a low-pass filter.")
-TAG (L"##To frequency (Hz)# (standard value: 1000 Hz)")
-DEFINITION (L"the upper edge of the pass band (%f__2_ in the figure). The value zero is special: the filter then acts as a high-pass filter.")
-TAG (L"##Smoothing (Hz)# (standard value: 100 Hz)")
-DEFINITION (L"the width of the region between pass and stop (%w in the figure).")
-ENTRY (L"Usage")
-NORMAL (L"Because of its symmetric Hann-like shape, the filter is especially useful for decomposing the Spectrum into consecutive bands. "
+ENTRY (U"Settings")
+TAG (U"##From frequency (Hz)# (standard value: 500 Hz)")
+DEFINITION (U"the lower edge of the pass band (%f__1_ in the figure). The value zero is special: the filter then acts as a low-pass filter.")
+TAG (U"##To frequency (Hz)# (standard value: 1000 Hz)")
+DEFINITION (U"the upper edge of the pass band (%f__2_ in the figure). The value zero is special: the filter then acts as a high-pass filter.")
+TAG (U"##Smoothing (Hz)# (standard value: 100 Hz)")
+DEFINITION (U"the width of the region between pass and stop (%w in the figure).")
+ENTRY (U"Usage")
+NORMAL (U"Because of its symmetric Hann-like shape, the filter is especially useful for decomposing the Spectrum into consecutive bands. "
 	"For instance, we can decompose the spectrum into the bands 0-500 Hz, 500-1000 Hz, 1000-2000 Hz, and 2000-\"0\" Hz:")
 PICTURE (5, 3, draw_SpectrumPassHann_decompose)
-NORMAL (L"By adding the four bands together, we get the original spectrum again.")
-NORMAL (L"A complementary filter is described at @@Spectrum: Filter (stop Hann band)... at .")
-NORMAL (L"See the @Filtering tutorial for information on the need for smoothing and a comparative discussion of various filters.")
+NORMAL (U"By adding the four bands together, we get the original spectrum again.")
+NORMAL (U"A complementary filter is described at @@Spectrum: Filter (stop Hann band)... at .")
+NORMAL (U"See the @Filtering tutorial for information on the need for smoothing and a comparative discussion of various filters.")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: Filter (stop Hann band)...", L"ppgb", 20030916)
-INTRO (L"A command to modify every selected @Spectrum object.")
-NORMAL (L"The complex values in the #Spectrum are multiplied by real-valued sine shapes and straight lines, according to the following figure:")
+MAN_BEGIN (U"Spectrum: Filter (stop Hann band)...", U"ppgb", 20030916)
+INTRO (U"A command to modify every selected @Spectrum object.")
+NORMAL (U"The complex values in the #Spectrum are multiplied by real-valued sine shapes and straight lines, according to the following figure:")
 PICTURE (5, 3, draw_SpectrumStopHann)
-ENTRY (L"Settings")
-TAG (L"##From frequency (Hz)# (standard value: 500 Hz)")
-DEFINITION (L"the lower edge of the stop band (%f__1_ in the figure). The value zero is special: the filter then acts as a high-pass filter.")
-TAG (L"##To frequency (Hz)# (standard value: 1000 Hz)")
-DEFINITION (L"the upper edge of the stop band (%f__2_ in the figure). The value zero is special: the filter then acts as a low-pass filter.")
-TAG (L"##Smoothing (Hz)# (standard value: 100 Hz)")
-DEFINITION (L"the width of the region between stop and pass (%w in the figure).")
-ENTRY (L"Usage")
-NORMAL (L"This filter is the complement from the pass-band filter (@@Spectrum: Filter (pass Hann band)...@). "
+ENTRY (U"Settings")
+TAG (U"##From frequency (Hz)# (standard value: 500 Hz)")
+DEFINITION (U"the lower edge of the stop band (%f__1_ in the figure). The value zero is special: the filter then acts as a high-pass filter.")
+TAG (U"##To frequency (Hz)# (standard value: 1000 Hz)")
+DEFINITION (U"the upper edge of the stop band (%f__2_ in the figure). The value zero is special: the filter then acts as a low-pass filter.")
+TAG (U"##Smoothing (Hz)# (standard value: 100 Hz)")
+DEFINITION (U"the width of the region between stop and pass (%w in the figure).")
+ENTRY (U"Usage")
+NORMAL (U"This filter is the complement from the pass-band filter (@@Spectrum: Filter (pass Hann band)...@). "
 	"For instance, we can decompose the spectrum into the above stop-band spectrum and a band from 500 to 1000 Hz:")
 PICTURE (5, 3, draw_SpectrumStopHann_decompose)
-NORMAL (L"By adding the two spectra together, we get the original spectrum again.")
-NORMAL (L"See the @Filtering tutorial for information on the need for smoothing and a comparative discussion of various filters.")
+NORMAL (U"By adding the two spectra together, we get the original spectrum again.")
+NORMAL (U"See the @Filtering tutorial for information on the need for smoothing and a comparative discussion of various filters.")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: Formula...", L"ppgb", 20021206)
-INTRO (L"A command for changing the data in all selected @Spectrum objects.")
-NORMAL (L"See the @Formulas tutorial for examples and explanations.")
+MAN_BEGIN (U"Spectrum: Formula...", U"ppgb", 20021206)
+INTRO (U"A command for changing the data in all selected @Spectrum objects.")
+NORMAL (U"See the @Formulas tutorial for examples and explanations.")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: Get central moment...", L"ppgb", 20020323)
-INTRO (L"A command to query the selected @Spectrum object.")
-NORMAL (L"If the complex spectrum is given by %S(%f), the %%n%th central spectral moment is given by")
-FORMULA (L"∫__0_^∞  (%f – %f__%c_)^%n |%S(%f)|^%p %df")
-NORMAL (L"divided by the \"energy\"")
-FORMULA (L"∫__0_^∞  |%S(%f)|^%p %df")
-NORMAL (L"In this formula, %f__%c_ is the spectral centre of gravity (see @@Spectrum: Get centre of gravity...@). "
+MAN_BEGIN (U"Spectrum: Get central moment...", U"ppgb", 20020323)
+INTRO (U"A command to query the selected @Spectrum object.")
+NORMAL (U"If the complex spectrum is given by %S(%f), the %%n%th central spectral moment is given by")
+FORMULA (U"∫__0_^∞  (%f – %f__%c_)^%n |%S(%f)|^%p %df")
+NORMAL (U"divided by the \"energy\"")
+FORMULA (U"∫__0_^∞  |%S(%f)|^%p %df")
+NORMAL (U"In this formula, %f__%c_ is the spectral centre of gravity (see @@Spectrum: Get centre of gravity...@). "
 	"Thus, the %%n%th central moment is the average of (%f – %f__%c_)^%n over the entire frequency domain, "
 	"weighted by |%S(%f)|^%p. For %p = 2, the weighting is done by the power spectrum, and for %p = 1, "
 	"the weighting is done by the absolute spectrum. A value of %p = 2/3 has been seen as well.")
-ENTRY (L"Settings")
-TAG (L"##Moment")
-DEFINITION (L"the number %n in the formulas above. A number of 3 gives you the third central spectral moment. "
+ENTRY (U"Settings")
+TAG (U"##Moment")
+DEFINITION (U"the number %n in the formulas above. A number of 3 gives you the third central spectral moment. "
 	"It is not impossible to ask for fractional moments, e.g. %n = 1.5.")
-TAG (L"##Power")
-DEFINITION (L"the quantity %p in the formula above. Common values are 2, 1, or 2/3.")
-ENTRY (L"Usage")
-NORMAL (L"For %n = 1, the central moment should be zero, since the centre of gravity %f__%c_ is computed with "
+TAG (U"##Power")
+DEFINITION (U"the quantity %p in the formula above. Common values are 2, 1, or 2/3.")
+ENTRY (U"Usage")
+NORMAL (U"For %n = 1, the central moment should be zero, since the centre of gravity %f__%c_ is computed with "
 	"the same %p. For %n = 2, you get the variance of the frequencies in the spectrum; the standard deviation "
 	"of the frequency is the square root of this. For %n = 3, you get the non-normalized spectral skewness; "
 	"to normalize it, you can divide by the 1.5 power of the second moment. For %n = 4, you get the "
 	"non-normalized spectral kurtosis; to normalize it, you can divide by the square of the second moment "
 	"and subtract 3. Praat can directly give you the quantities mentioned here:")
-LIST_ITEM (L"• @@Spectrum: Get centre of gravity...")
-LIST_ITEM (L"• @@Spectrum: Get standard deviation...")
-LIST_ITEM (L"• @@Spectrum: Get skewness...")
-LIST_ITEM (L"• @@Spectrum: Get kurtosis...")
+LIST_ITEM (U"• @@Spectrum: Get centre of gravity...")
+LIST_ITEM (U"• @@Spectrum: Get standard deviation...")
+LIST_ITEM (U"• @@Spectrum: Get skewness...")
+LIST_ITEM (U"• @@Spectrum: Get kurtosis...")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: Get centre of gravity...", L"ppgb", 20070225)
-INTRO (L"A command to query the selected @Spectrum object.")
-NORMAL (L"If the complex spectrum is given by %S(%f), where %f is the frequency, the %%centre of gravity% "
+MAN_BEGIN (U"Spectrum: Get centre of gravity...", U"ppgb", 20070225)
+INTRO (U"A command to query the selected @Spectrum object.")
+NORMAL (U"If the complex spectrum is given by %S(%f), where %f is the frequency, the %%centre of gravity% "
 	"is given by")
-FORMULA (L"∫__0_^∞  %f |%S(%f)|^%p %df")
-NORMAL (L"divided by the \"energy\"")
-FORMULA (L"∫__0_^∞  |%S(%f)|^%p %df")
-NORMAL (L"Thus, the centre of gravity is the average of %f over the entire frequency domain, "
+FORMULA (U"∫__0_^∞  %f |%S(%f)|^%p %df")
+NORMAL (U"divided by the \"energy\"")
+FORMULA (U"∫__0_^∞  |%S(%f)|^%p %df")
+NORMAL (U"Thus, the centre of gravity is the average of %f over the entire frequency domain, "
 	"weighted by |%S(%f)|^%p. For %p = 2, the weighting is done by the power spectrum, and for %p = 1, "
 	"the weighting is done by the absolute spectrum. A value of %p = 2/3 has been seen as well.")
-ENTRY (L"Setting")
-TAG (L"##Power")
-DEFINITION (L"the quantity %p in the formulas above. Common values are 2, 1, or 2/3.")
-ENTRY (L"Interpretation")
-NORMAL (L"The spectral centre of gravity is a measure for how high the frequencies in a spectrum are on average. "
+ENTRY (U"Setting")
+TAG (U"##Power")
+DEFINITION (U"the quantity %p in the formulas above. Common values are 2, 1, or 2/3.")
+ENTRY (U"Interpretation")
+NORMAL (U"The spectral centre of gravity is a measure for how high the frequencies in a spectrum are on average. "
 	"For a sine wave with a frequency of 377 Hz, the centre of gravity is 377 Hz. You can easily check this "
 	"in Praat by creating such a sine wave (@@Create Sound from formula...@), then converting it to a Spectrum "
 	"(@@Sound: To Spectrum...@), then querying the mean frequency. For a white noise sampled at 22050 Hz, "
 	"the centre of gravity is 5512.5 Hz, i.e. one half of the @@Nyquist frequency at .")
-ENTRY (L"Related measures")
-NORMAL (L"The centre of gravity is used in the computation of spectral moments:")
-LIST_ITEM (L"• @@Spectrum: Get central moment...")
-LIST_ITEM (L"• @@Spectrum: Get standard deviation...")
-LIST_ITEM (L"• @@Spectrum: Get skewness...")
-LIST_ITEM (L"• @@Spectrum: Get kurtosis...")
+ENTRY (U"Related measures")
+NORMAL (U"The centre of gravity is used in the computation of spectral moments:")
+LIST_ITEM (U"• @@Spectrum: Get central moment...")
+LIST_ITEM (U"• @@Spectrum: Get standard deviation...")
+LIST_ITEM (U"• @@Spectrum: Get skewness...")
+LIST_ITEM (U"• @@Spectrum: Get kurtosis...")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: Get kurtosis...", L"ppgb", 20020323)
-INTRO (L"A command to query the selected @Spectrum object.")
-NORMAL (L"The (normalized) kurtosis of a spectrum is the fourth central moment of this spectrum, "
+MAN_BEGIN (U"Spectrum: Get kurtosis...", U"ppgb", 20020323)
+INTRO (U"A command to query the selected @Spectrum object.")
+NORMAL (U"The (normalized) kurtosis of a spectrum is the fourth central moment of this spectrum, "
 	"divided by the square of the second central moment, minus 3. "
 	"See @@Spectrum: Get central moment... at .")
-ENTRY (L"Setting")
-TAG (L"##Power")
-DEFINITION (L"the quantity %p in the formula for the centre of gravity and the second and fourth central moment. "
+ENTRY (U"Setting")
+TAG (U"##Power")
+DEFINITION (U"the quantity %p in the formula for the centre of gravity and the second and fourth central moment. "
 	"Common values are 2, 1, or 2/3.")
-ENTRY (L"Interpretation")
-NORMAL (L"The kurtosis is a measure for how much the shape of the spectrum around the "
+ENTRY (U"Interpretation")
+NORMAL (U"The kurtosis is a measure for how much the shape of the spectrum around the "
 	"%%centre of gravity% is different from a Gaussian shape. "
 	"For a white noise, the kurtosis is -6/5.")
-ENTRY (L"Related measures")
-LIST_ITEM (L"• @@Spectrum: Get centre of gravity...")
-LIST_ITEM (L"• @@Spectrum: Get central moment...")
-LIST_ITEM (L"• @@Spectrum: Get standard deviation...")
-LIST_ITEM (L"• @@Spectrum: Get skewness...")
+ENTRY (U"Related measures")
+LIST_ITEM (U"• @@Spectrum: Get centre of gravity...")
+LIST_ITEM (U"• @@Spectrum: Get central moment...")
+LIST_ITEM (U"• @@Spectrum: Get standard deviation...")
+LIST_ITEM (U"• @@Spectrum: Get skewness...")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: Get skewness...", L"ppgb", 20020323)
-INTRO (L"A command to query the selected @Spectrum object.")
-NORMAL (L"The (normalized) skewness of a spectrum is the third central moment of this spectrum, "
+MAN_BEGIN (U"Spectrum: Get skewness...", U"ppgb", 20020323)
+INTRO (U"A command to query the selected @Spectrum object.")
+NORMAL (U"The (normalized) skewness of a spectrum is the third central moment of this spectrum, "
 	"divided by the 1.5 power of the second central moment. "
 	"See @@Spectrum: Get central moment... at .")
-ENTRY (L"Setting")
-TAG (L"##Power")
-DEFINITION (L"the quantity %p in the formula for the centre of gravity and the second and third central moment. "
+ENTRY (U"Setting")
+TAG (U"##Power")
+DEFINITION (U"the quantity %p in the formula for the centre of gravity and the second and third central moment. "
 	"Common values are 2, 1, or 2/3.")
-ENTRY (L"Interpretation")
-NORMAL (L"The skewness is a measure for how much the shape of the spectrum below the "
+ENTRY (U"Interpretation")
+NORMAL (U"The skewness is a measure for how much the shape of the spectrum below the "
 	"%%centre of gravity% is different from the shape above the mean frequency. "
 	"For a white noise, the skewness is zero.")
-ENTRY (L"Related measures")
-LIST_ITEM (L"• @@Spectrum: Get centre of gravity...")
-LIST_ITEM (L"• @@Spectrum: Get central moment...")
-LIST_ITEM (L"• @@Spectrum: Get standard deviation...")
-LIST_ITEM (L"• @@Spectrum: Get kurtosis...")
+ENTRY (U"Related measures")
+LIST_ITEM (U"• @@Spectrum: Get centre of gravity...")
+LIST_ITEM (U"• @@Spectrum: Get central moment...")
+LIST_ITEM (U"• @@Spectrum: Get standard deviation...")
+LIST_ITEM (U"• @@Spectrum: Get kurtosis...")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: Get standard deviation...", L"ppgb", 20020323)
-INTRO (L"A command to query the selected @Spectrum object.")
-NORMAL (L"The standard deviation of a spectrum is the square root of the second central moment of this spectrum. "
+MAN_BEGIN (U"Spectrum: Get standard deviation...", U"ppgb", 20020323)
+INTRO (U"A command to query the selected @Spectrum object.")
+NORMAL (U"The standard deviation of a spectrum is the square root of the second central moment of this spectrum. "
 	"See @@Spectrum: Get central moment... at .")
-ENTRY (L"Setting")
-TAG (L"##Power")
-DEFINITION (L"the quantity %p in the formula for the centre of gravity and the second central moment. "
+ENTRY (U"Setting")
+TAG (U"##Power")
+DEFINITION (U"the quantity %p in the formula for the centre of gravity and the second central moment. "
 	"Common values are 2, 1, or 2/3.")
-ENTRY (L"Interpretation")
-NORMAL (L"The standard deviation is a measure for how much the frequencies in a spectrum can deviate from "
+ENTRY (U"Interpretation")
+NORMAL (U"The standard deviation is a measure for how much the frequencies in a spectrum can deviate from "
 	"the %%centre of gravity%. "
 	"For a sine wave, the standard deviation is zero. For a white noise, the standard deviation "
 	"is the @@Nyquist frequency@ divided by √12.")
-ENTRY (L"Related measures")
-LIST_ITEM (L"• @@Spectrum: Get centre of gravity...")
-LIST_ITEM (L"• @@Spectrum: Get central moment...")
-LIST_ITEM (L"• @@Spectrum: Get skewness...")
-LIST_ITEM (L"• @@Spectrum: Get kurtosis...")
-MAN_END
-
-MAN_BEGIN (L"Spectrum: To Ltas (1-to-1)", L"ppgb", 20141001)
-INTRO (L"A command for converting each selected @Spectrum object into an @Ltas object without loss of frequency resolution.")
-ENTRY (L"Algorithm")
-NORMAL (L"Each band %b__%i_ in the Ltas is computed from a single frequency sample %s__%i_ in the Spectrum as follows:")
-FORMULA (L"%b__%i_ = 2 ((re (%s__%i_))^2 + (im (%s__%i_))^2) / 4.0·10^^-10^")
-NORMAL (L"If the original Spectrum is expressible in Pa / Hz (sound pressure in air), the Ltas values "
+ENTRY (U"Related measures")
+LIST_ITEM (U"• @@Spectrum: Get centre of gravity...")
+LIST_ITEM (U"• @@Spectrum: Get central moment...")
+LIST_ITEM (U"• @@Spectrum: Get skewness...")
+LIST_ITEM (U"• @@Spectrum: Get kurtosis...")
+MAN_END
+
+MAN_BEGIN (U"Spectrum: To Ltas (1-to-1)", U"ppgb", 20141001)
+INTRO (U"A command for converting each selected @Spectrum object into an @Ltas object without loss of frequency resolution.")
+ENTRY (U"Algorithm")
+NORMAL (U"Each band %b__%i_ in the Ltas is computed from a single frequency sample %s__%i_ in the Spectrum as follows:")
+FORMULA (U"%b__%i_ = 2 ((re (%s__%i_))^2 + (im (%s__%i_))^2) / 4.0·10^^-10^")
+NORMAL (U"If the original Spectrum is expressible in Pa / Hz (sound pressure in air), the Ltas values "
 	"are in \"dB/Hz\" relative to the auditory threshold at 1000 Hz (2·10^^-5^ Pa).")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: To Sound", L"ppgb", 200411123)
-INTRO (L"A command for creating a @Sound object from every selected @Spectrum object.")
-ENTRY (L"Mathematical procedure")
-NORMAL (L"The reverse of the Fourier transform described in @@Sound: To Spectrum... at . "
+MAN_BEGIN (U"Spectrum: To Sound", U"ppgb", 200411123)
+INTRO (U"A command for creating a @Sound object from every selected @Spectrum object.")
+ENTRY (U"Mathematical procedure")
+NORMAL (U"The reverse of the Fourier transform described in @@Sound: To Spectrum... at . "
 	"If the Spectrum is expressed in Pa/Hz, the Sound will be in Pascal. "
 	"The frequency integral over the Sound equals the time integral over the Spectrum.")
-ENTRY (L"Behaviour")
-NORMAL (L"If you perform this command on a Spectrum object that was created earlier with @@Sound: To Spectrum...@, "
+ENTRY (U"Behaviour")
+NORMAL (U"If you perform this command on a Spectrum object that was created earlier with @@Sound: To Spectrum...@, "
 	"the resulting Sound is equal to the Sound that was input to ##Sound: To Spectrum...#.")
 MAN_END
 
-MAN_BEGIN (L"Spectrum: To Spectrogram", L"ppgb", 19961003)
-INTRO (L"A command to create a @Spectrogram object from every selected @Spectrum object.")
-ENTRY (L"Purpose")
-NORMAL (L"Format conversion.")
-ENTRY (L"Behaviour")
-NORMAL (L"The Spectrogram will have only one frame (time slice).")
-ENTRY (L"Algorithm")
-NORMAL (L"The values are computed as the sum of the squares of the real and imaginary parts of the Spectrum.")
+MAN_BEGIN (U"Spectrum: To Spectrogram", U"ppgb", 19961003)
+INTRO (U"A command to create a @Spectrogram object from every selected @Spectrum object.")
+ENTRY (U"Purpose")
+NORMAL (U"Format conversion.")
+ENTRY (U"Behaviour")
+NORMAL (U"The Spectrogram will have only one frame (time slice).")
+ENTRY (U"Algorithm")
+NORMAL (U"The values are computed as the sum of the squares of the real and imaginary parts of the Spectrum.")
 MAN_END
 
-MAN_BEGIN (L"SpectrumEditor", L"ppgb", 20030316)
-INTRO (L"One of the @editors in Praat. It allows you to view, "
+MAN_BEGIN (U"SpectrumEditor", U"ppgb", 20030316)
+INTRO (U"One of the @editors in Praat. It allows you to view, "
 	"zoom, and play a @Spectrum object.")
-NORMAL (L"Clicking on one of the (maximally) 8 rectangles above or below the drawing area "
+NORMAL (U"Clicking on one of the (maximally) 8 rectangles above or below the drawing area "
 	"lets you play a @Sound that is synthesized from a band-filtered part of the @Spectrum. "
 	"You can also copy the Spectrum, band-filtered with the @@frequency selection@, "
 	"or the Sound synthesized from this Spectrum, to the list of objects.")
diff --git a/fon/manual_tutorials.cpp b/fon/manual_tutorials.cpp
index 4bab514..940496e 100644
--- a/fon/manual_tutorials.cpp
+++ b/fon/manual_tutorials.cpp
@@ -1,6 +1,6 @@
 /* manual_tutorials.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,1636 +23,1706 @@
 void manual_tutorials_init (ManPages me);
 void manual_tutorials_init (ManPages me) {
 
-MAN_BEGIN (L"What's new?", L"ppgb", 20150221)
-INTRO (L"Latest changes in Praat.")
-/*LIST_ITEM (L"• Manual page about @@drawing a vowel triangle at .")*/
-NORMAL (L"##5.4.06# (21 February 2015)")
-LIST_ITEM (L"• Windows: repaired a bug that could cause Praat to crash if a metafile resolution was 200 dpi.")
-NORMAL (L"##5.4.05# (13 February 2015)")
-LIST_ITEM (L"• Better support for big integer numbers on Windows XP.")
-LIST_ITEM (L"• Sound window: guarded against empty view ranges for the intensity curve.")
-NORMAL (L"##5.4.04# (28 December 2014)")
-LIST_ITEM (L"• Windows audio playback: if the sound has more channels than the audio hardware, distribute them evenly.")
-NORMAL (L"##5.4.03# (18 December 2014)")
-LIST_ITEM (L"• TextGrid reading: Praat now corrects some incomplete TextGrid files created by others.")
-LIST_ITEM (L"• Better support for text files larger than 2 GB.")
-NORMAL (L"##5.4.02# (26 November 2014)")
-LIST_ITEM (L"• Mac: repaired a bug by which quote characters typed into the script window could become curly instead of straight.")
-NORMAL (L"##5.4.01# (9 November 2014)")
-LIST_ITEM (L"• @MelSpectrogram, @BarkSpectrogram.")
-LIST_ITEM (L"• Linux: removed a bug that could cause too many flashes when scrolling a Sound window.")
-LIST_ITEM (L"• Mac: repaired a bug that could cause a crash in the VowelEditor window.")
-NORMAL (L"##5.4# (4 October 2014)")
-NORMAL (L"##5.3.87# (3 October 2014)")
-LIST_ITEM (L"• Windows scripting: prevented incorrect handling of relative paths after the use of chooseReadFile\\$ .")
-LIST_ITEM (L"• Windows: repaired a bug that could cause Praat to crash if a metafile resolution was 180 or 1200 dpi.")
-NORMAL (L"##5.3.86# (28 September 2014)")
-LIST_ITEM (L"• Linux audio: reverted to old version of PortAudio because of race problems in the Alsa–PulseAudio cooperation.")
-NORMAL (L"##5.3.85# (19 September 2014)")
-LIST_ITEM (L"• Mac audio: circumvented a bug in PortAudio by which playback of sounds with sampling frequencies "
+MAN_BEGIN (U"What's new?", U"ppgb", 20151028)
+INTRO (U"Latest changes in Praat.")
+/*LIST_ITEM (U"• Manual page about @@drawing a vowel triangle at .")*/
+NORMAL (U"##6.0# (28 October 2015)")
+LIST_ITEM (U"• Linux: use PulseAudio as the server for playing sound.")
+LIST_ITEM (U"• Windows: removed Praatcon.exe, because Praat.exe can now be used from the command line.")
+LIST_ITEM (U"• Praat can now open files from the command line on all platforms.")
+LIST_ITEM (U"• The API change that requires raising the major Praat version to 6: "
+	"no longer any need for Praatcon.exe, because Praat itself can now run a script from the command line on all platforms.")
+LIST_ITEM (U"• See @@Scripting 6.9. Calling from the command line@ for all command line options.")
+LIST_ITEM (U"• SpeechSynthesizer: corrected a potentially crashing bug.")
+LIST_ITEM (U"• Mac Retina graphics: made function drawing (e.g. in the TextGrid window) twice as fast.")
+LIST_ITEM (U"• LongSound: corrected playing of more than 2 channels.")
+NORMAL (U"##5.4.22# (8 October 2015)")
+LIST_ITEM (U"• Sound files: added support for MP3 files with ID3 version 2 headers.")
+LIST_ITEM (U"• Table: Line graph where: removed a bug that caused nothing to be drawn if the number of columns was larger than the number of rows and "
+	"the column index was larger than the number of rows.")
+LIST_ITEM (U"• Mac: corrected horizontal spacing in graphical text on El Capitán.")
+LIST_ITEM (U"• Mac: corrected a bug that would cause Praat to crash if a PNG file could not be saved (from a script).")
+LIST_ITEM (U"• Windows: enabled PNG saving from Praatcon.")
+NORMAL (U"##5.4.21# (29 September 2015)")
+LIST_ITEM (U"• Corrected a bug introduced in 5.4.20 that could cause the Sound window to crash.")
+LIST_ITEM (U"• Repaired a very old hang with pulses in the Sound window.")
+NORMAL (U"##5.4.20# (26 September 2015)")
+LIST_ITEM (U"• Corrected the graphical representation of numbers with exponents (wrong since 5.4.10).")
+LIST_ITEM (U"• Windows: prevented flashing console window in $$runScript()$.")
+NORMAL (U"##5.4.19# (16 September 2015)")
+LIST_ITEM (U"• LongSound: corrected saving of 8-bit files as 16-bit.")
+NORMAL (U"##5.4.18# (7 September 2015)")
+LIST_ITEM (U"• Regular expressions: if the pattern is illegal, you'll now get an error message instead of an empty string.")
+LIST_ITEM (U"• LongSound: removed a bug introduced in 1999 that could play long stereo sounds much too fast if they had unusual sampling frequencies. "
+	"This bug has become more noticeable on the Mac since January 2015.")
+LIST_ITEM (U"• Guard better against sound files that contain 0 samples.")
+LIST_ITEM (U"• Scripting: faster look-up of variables.")
+NORMAL (U"##5.4.17# (20 August 2015)")
+LIST_ITEM (U"• Scripting: removed a bug that could cause Praat to crash when calling $$writeFile()$ with an empty text.")
+NORMAL (U"##5.4.16# (16 August 2015)")
+LIST_ITEM (U"• Mac 64-bit: removed a bug by which graphical text passed over the right edge in TextGrid intervals.")
+LIST_ITEM (U"• Mac 64-bit: removed a bug that allowed the general \"Zoom\" and \"Close\" commands to be accessible from a script.")
+NORMAL (U"##5.4.15# (1 August 2015)")
+LIST_ITEM (U"• Introduced several command line options that make it easier to call Praat from a web server.")
+LIST_ITEM (U"• 64-bit Mac: removed a bug introduced in 5.4.11 that caused incorrect spacing of vertical text in picture files.")
+NORMAL (U"##5.4.14# (24 July 2015)")
+LIST_ITEM (U"• Windows and 32-bit Mac: removed a bug introduced in 5.4.12 that could cause weird behavior (even crashing) when "
+	"pressing the Tab key in the script window or in the manual.")
+NORMAL (U"##5.4.13# (22 July 2015)")
+LIST_ITEM (U"• The Demo window can now save itself to a PNG or PDF file.")
+LIST_ITEM (U"• Windows: removed a bug introduced in 5.4.10 whereby Praatcon would write garbled text to the console.")
+NORMAL (U"##5.4.12# (10 July 2015)")
+LIST_ITEM (U"• Windows: removed a bug introduced in 5.4.10 whereby SpeechSynthesizer would only pronounce the first letter of the text.")
+NORMAL (U"##5.4.11# (8 July 2015)")
+LIST_ITEM (U"• Windows: removed a bug introduced in 5.4.10 whereby the file selection window could try to open a file with a garbled name.")
+LIST_ITEM (U"• Removed a bug whereby the PointProcess window would crash when showing a perfectly silent sound.")
+NORMAL (U"##5.4.10# (27 June 2015)")
+LIST_ITEM (U"• Removed a bug introduced in version 4.5.09 (January 2007) that caused incorrect "
+	"upsampling of stereo sounds when the upsampling factor was exactly 2. This bug has caused "
+	"incorrect playing of stereo sounds with a sampling frequency of 22050 Hz on the Mac since January 2015.")
+LIST_ITEM (U"• Removed a bug introduced in 2011 that could cause Praat to crash when you scrolled the LongSound window.")
+LIST_ITEM (U"• TextGrid: ##Count intervals where...# and ##Count points where...#.")
+NORMAL (U"##5.4.09# (1 June 2015)")
+LIST_ITEM (U"• Linux: the tab key can be used to play sounds on more computers.")
+LIST_ITEM (U"• Windows: TextGrid files with non-BMP characters are now read correctly.")
+LIST_ITEM (U"• Windows: files with names that contain non-BMP characters are now saved correctly.")
+LIST_ITEM (U"• Updated manual.")
+NORMAL (U"##5.4.08# (24 March 2015)")
+LIST_ITEM (U"• Sound window: removed a bug that caused a crash in \"Editor info\".")
+NORMAL (U"##5.4.07# (22 March 2015)")
+LIST_ITEM (U"• TextGrid window: ##Add interval# now does the same thing as ##Add boundary# if a time stretch is selected.")
+LIST_ITEM (U"• Linux: better redrawing in TextGrid window.")
+NORMAL (U"##5.4.06# (21 February 2015)")
+LIST_ITEM (U"• Windows: repaired a bug that could cause Praat to crash if a metafile resolution was 200 dpi.")
+NORMAL (U"##5.4.05# (13 February 2015)")
+LIST_ITEM (U"• Better support for big integer numbers on Windows XP.")
+LIST_ITEM (U"• Sound window: guarded against empty view ranges for the intensity curve.")
+NORMAL (U"##5.4.04# (28 December 2014)")
+LIST_ITEM (U"• Windows audio playback: if the sound has more channels than the audio hardware, distribute them evenly.")
+NORMAL (U"##5.4.03# (18 December 2014)")
+LIST_ITEM (U"• TextGrid reading: Praat now corrects some incomplete TextGrid files created by others.")
+LIST_ITEM (U"• Better support for text files larger than 2 GB.")
+NORMAL (U"##5.4.02# (26 November 2014)")
+LIST_ITEM (U"• Mac: repaired a bug by which quote characters typed into the script window could become curly instead of straight.")
+NORMAL (U"##5.4.01# (9 November 2014)")
+LIST_ITEM (U"• @MelSpectrogram, @BarkSpectrogram.")
+LIST_ITEM (U"• Linux: removed a bug that could cause too many flashes when scrolling a Sound window.")
+LIST_ITEM (U"• Mac: repaired a bug that could cause a crash in the VowelEditor window.")
+ENTRY (U"What used to be new?")
+LIST_ITEM (U"• @@What was new in 5.4?")
+LIST_ITEM (U"• @@What was new in 5.3?")
+LIST_ITEM (U"• @@What was new in 5.2?")
+LIST_ITEM (U"• @@What was new in 5.1?")
+LIST_ITEM (U"• @@What was new in 5.0?")
+LIST_ITEM (U"• @@What was new in 4.6?")
+LIST_ITEM (U"• @@What was new in 4.5?")
+LIST_ITEM (U"• @@What was new in 4.4?")
+LIST_ITEM (U"• @@What was new in 4.3?")
+LIST_ITEM (U"• @@What was new in 4.2?")
+LIST_ITEM (U"• @@What was new in 4.1?")
+LIST_ITEM (U"• @@What was new in 4.0?")
+LIST_ITEM (U"• @@What was new in 3.9?")
+LIST_ITEM (U"• @@What was new in 3.8?")
+LIST_ITEM (U"• @@What was new in 3.7?")
+LIST_ITEM (U"• @@What was new in 3.6?")
+LIST_ITEM (U"• @@What was new in 3.5?")
+LIST_ITEM (U"• @@What was new in 3.3?")
+LIST_ITEM (U"• @@What was new in 3.2?")
+LIST_ITEM (U"• @@What was new in 3.1?")
+MAN_END
+
+MAN_BEGIN (U"What was new in 5.4?", U"ppgb", 20141003)
+NORMAL (U"##5.4# (4 October 2014)")
+NORMAL (U"##5.3.87# (3 October 2014)")
+LIST_ITEM (U"• Windows scripting: prevented incorrect handling of relative paths after the use of chooseReadFile\\$ .")
+LIST_ITEM (U"• Windows: repaired a bug that could cause Praat to crash if a metafile resolution was 180 or 1200 dpi.")
+NORMAL (U"##5.3.86# (28 September 2014)")
+LIST_ITEM (U"• Linux audio: reverted to old version of PortAudio because of race problems in the Alsa–PulseAudio cooperation.")
+NORMAL (U"##5.3.85# (19 September 2014)")
+LIST_ITEM (U"• Mac audio: circumvented a bug in PortAudio by which playback of sounds with sampling frequencies "
 	"below 44100 Hz could be distorted on some USB headsets.")
-NORMAL (L"##5.3.84# (26 August 2014)")
-LIST_ITEM (L"• Manipulation: repaired a bug that could cause Praat to crash when playing a manipulation of a Sound created by the SpeechSynthesizer.")
-NORMAL (L"##5.3.83# (16 August 2014)")
-LIST_ITEM (L"• TextGrid window: repaired a bug with automatic alignment that could cause an analysis tier to go out of order.")
-LIST_ITEM (L"• Linux audio: created a second workaround that reduces even more the chances of a freeze that is due to a potential deadlock "
+NORMAL (U"##5.3.84# (26 August 2014)")
+LIST_ITEM (U"• Manipulation: repaired a bug that could cause Praat to crash when playing a manipulation of a Sound created by the SpeechSynthesizer.")
+NORMAL (U"##5.3.83# (16 August 2014)")
+LIST_ITEM (U"• TextGrid window: repaired a bug with automatic alignment that could cause an analysis tier to go out of order.")
+LIST_ITEM (U"• Linux audio: created a second workaround that reduces even more the chances of a freeze that is due to a potential deadlock "
 	"in the collaboration between Alsa and PulseAudio that can occur when the playback of a sound is cancelled.")
-LIST_ITEM (L"• Smoother communication with Phon.")
-LIST_ITEM (L"• Windows: repaired a memory leak when saving PNG files.")
-NORMAL (L"##5.3.82# (26 July 2014)")
-LIST_ITEM (L"• Linux and Mac audio playback: if the sound has more channels than the audio hardware, distribute them evenly.")
-LIST_ITEM (L"• Pause forms: more consistent appearance of the Revert button.")
-LIST_ITEM (L"• Scripting: pauseScript ( ) function.")
-NORMAL (L"##5.3.81# (2 July 2014)")
-LIST_ITEM (L"• EEG: can work with status %numbers instead of only with status %bits.")
-LIST_ITEM (L"• Windows: repaired a bug that could cause Praat to crash if there was a 96-dpi printer.")
-NORMAL (L"##5.3.80# (29 June 2014)")
-LIST_ITEM (L"• Praat preferences: choice between Chinese and Japanese style for Han characters.")
-NORMAL (L"##5.3.79# (21 June 2014)")
-LIST_ITEM (L"• Can now play sounds over more than two channels.")
-LIST_ITEM (L"• Asynchronous play in scripts (see @@Demo window@).")
-LIST_ITEM (L"• EEG: blue-to-red colour scale for scalp distributions.")
-NORMAL (L"##5.3.78# (12 June 2014)")
-LIST_ITEM (L"• Multithreading can now speed up pitch analysis by a factor of 4 or so, "
+LIST_ITEM (U"• Smoother communication with Phon.")
+LIST_ITEM (U"• Windows: repaired a memory leak when saving PNG files.")
+NORMAL (U"##5.3.82# (26 July 2014)")
+LIST_ITEM (U"• Linux and Mac audio playback: if the sound has more channels than the audio hardware, distribute them evenly.")
+LIST_ITEM (U"• Pause forms: more consistent appearance of the Revert button.")
+LIST_ITEM (U"• Scripting: pauseScript ( ) function.")
+NORMAL (U"##5.3.81# (2 July 2014)")
+LIST_ITEM (U"• EEG: can work with status %numbers instead of only with status %bits.")
+LIST_ITEM (U"• Windows: repaired a bug that could cause Praat to crash if there was a 96-dpi printer.")
+NORMAL (U"##5.3.80# (29 June 2014)")
+LIST_ITEM (U"• Praat preferences: choice between Chinese and Japanese style for Han characters.")
+NORMAL (U"##5.3.79# (21 June 2014)")
+LIST_ITEM (U"• Can now play sounds over more than two channels.")
+LIST_ITEM (U"• Asynchronous play in scripts (see @@Demo window@).")
+LIST_ITEM (U"• EEG: blue-to-red colour scale for scalp distributions.")
+NORMAL (U"##5.3.78# (12 June 2014)")
+LIST_ITEM (U"• Multithreading can now speed up pitch analysis by a factor of 4 or so, "
 	"depending on the number of cores in your processor.")
-LIST_ITEM (L"• Linux: can now open and save Photo objects (from PNG files) "
+LIST_ITEM (U"• Linux: can now open and save Photo objects (from PNG files) "
 	"and use @@Insert picture from file... at .")
-LIST_ITEM (L"• Open WAV files that are in the \"extensible\" format (previously \"unsupported format -2\").")
-LIST_ITEM (L"• Windows: support for dropping more than one file on the Praat icon.")
-LIST_ITEM (L"• Scripting: can now use the #editor command with an object's ID instead of only with its name.")
-LIST_ITEM (L"• Windows: removed a bug that sometimes disallowed saving more than one JPEG file.")
-LIST_ITEM (L"• Linux audio: created a workaround that reduces the chances of a freeze that is due to a potential deadlock "
+LIST_ITEM (U"• Open WAV files that are in the \"extensible\" format (previously \"unsupported format -2\").")
+LIST_ITEM (U"• Windows: support for dropping more than one file on the Praat icon.")
+LIST_ITEM (U"• Scripting: can now use the #editor command with an object's ID instead of only with its name.")
+LIST_ITEM (U"• Windows: removed a bug that sometimes disallowed saving more than one JPEG file.")
+LIST_ITEM (U"• Linux audio: created a workaround that reduces the chances of a freeze that is due to a potential deadlock "
 	"in the collaboration between Alsa and PulseAudio that can occur when the playback of a sound is cancelled.")
-NORMAL (L"##5.3.77# (18 May 2014)")
-LIST_ITEM (L"• EEG: more facilities for EDF+ files.")
-NORMAL (L"##5.3.76# (8 May 2014)")
-LIST_ITEM (L"• One can determine the size of \"speckles\" (filled circles) with ##Speckle size...# in the #Pen menu. "
+NORMAL (U"##5.3.77# (18 May 2014)")
+LIST_ITEM (U"• EEG: more facilities for EDF+ files.")
+NORMAL (U"##5.3.76# (8 May 2014)")
+LIST_ITEM (U"• One can determine the size of \"speckles\" (filled circles) with ##Speckle size...# in the #Pen menu. "
 	"Speckles are used in drawing Formant, PitchTier, and several other kinds of objects.")
-NORMAL (L"##5.3.75# (30 April 2014)")
-LIST_ITEM (L"• Linux Matrix graphics bug fix: corrected working of ##Draw cells...#.")
-LIST_ITEM (L"• Scripting bug fix: ability to use x and y as indexed variables.")
-LIST_ITEM (L"• PowerCepstrogram bug fix: made old version of Paint command available again for scripts.")
-NORMAL (L"##5.3.74# (24 April 2014)")
-LIST_ITEM (L"• EEG: more interpretation of triggers in EDF+ files.")
-NORMAL (L"##5.3.73# (21 April 2014)")
-LIST_ITEM (L"• EEG: understand more EGI/NetStation files.")
-NORMAL (L"##5.3.72# (17 April 2014)")
-LIST_ITEM (L"• Windows: repaired a bug that caused two black edges in PNG files.")
-LIST_ITEM (L"• Windows: repaired a bug that could cause Praat to crash if a metafile resolution was 360 dpi.")
-LIST_ITEM (L"• Linux: repaired a bug that caused Praat to crash when cutting or pasting a sound in the Sound window.")
-NORMAL (L"##5.3.71# (9 April 2014)")
-LIST_ITEM (L"• Windows: brought more unity in the style of Chinese characters.")
-NORMAL (L"##5.3.70# (2 April 2014)")
-LIST_ITEM (L"• Added some query commands for DurationTier objects.")
-LIST_ITEM (L"• Repaired a bug that caused Praat not to run as a console app.")
-NORMAL (L"##5.3.69# (28 March 2014)")
-LIST_ITEM (L"• Picture window: can save to 300-dpi and 600-dpi PNG files.")
-LIST_ITEM (L"• Graphics: sub-pixel precision line drawing on Mac and Linux.")
-LIST_ITEM (L"• Repaired a bug that could show spurious buttons in the Objects window if a plug-in created objects.")
-NORMAL (L"##5.3.68# (20 March 2014)")
-LIST_ITEM (L"• Mac: corrected a bug introduced in 5.3.67 that could cause crashes when drawing a spectrogram.")
-LIST_ITEM (L"• Mac and Linux: @@Create Strings as file list...@ handles broken symbolic links more leniently.")
-NORMAL (L"##5.3.67# (19 March 2014)")
-LIST_ITEM (L"• Corrected a bug that would create strange PNG files if the selection did not touch the upper left corner of the Picture window.")
-LIST_ITEM (L"• Mac: can save the Picture window to PNG file.")
-LIST_ITEM (L"• EEG: understand trigger letters in BDF/EDF files.")
-NORMAL (L"##5.3.66# (9 March 2014)")
-LIST_ITEM (L"• Windows and Linux: can save the Picture window to PNG file.")
-LIST_ITEM (L"• Windows: opening, modifying and saving PNG, TIFF or JPEG files (the Photo object, as on the Mac).")
-NORMAL (L"##5.3.65# (27 February 2014)")
-LIST_ITEM (L"• Scripting language: removed some bugs from runScript.")
-LIST_ITEM (L"• Linux: can save the Picture window to PDF file.")
-NORMAL (L"##5.3.64# (12 February 2014)")
-LIST_ITEM (L"• Scripting language: writeInfo, procedure, exitScript, runScript: all with colons.")
-LIST_ITEM (L"• 64-bit Mac graphics: better highlighting and unhighlighting of selection.")
-LIST_ITEM (L"• 64-bit Mac graphics: full screen.")
-NORMAL (L"##5.3.63# (24 January 2014)")
-LIST_ITEM (L"• Scripting language: easier menu command invocation using the colon \":\".")
-LIST_ITEM (L"• 64-bit Mac graphics: better handling of any absence of Doulos SIL or Charis SIL.")
-LIST_ITEM (L"• Windows scripting: can now use \"~\" in file names to refer to home directory, as on Mac and Linux.")
-NORMAL (L"##5.3.62# (2 January 2014)")
-LIST_ITEM (L"• 64-bit Mac: removed a bug introduced in 5.3.61 that could cause text containing \"ff\" to become invisible.")
-NORMAL (L"##5.3.61# (1 January 2014)")
-LIST_ITEM (L"• EEG: understand status registers that contain text.")
-LIST_ITEM (L"• KlattGrid: removed a bug introduced in May 2009 that could make Praat crash after editing an oral formant grid.")
-NORMAL (L"##5.3.60# (8 December 2013)")
-LIST_ITEM (L"• Mac 64-bit: implemented swiping (to scroll with the trackpad) and pinching (to zoom with the trackpad).")
-LIST_ITEM (L"• Scripting: backslashTrigraphsToUnicode () and unicodeToBackslashTrigraphs ().")
-NORMAL (L"##5.3.59# (20 November 2013)")
-LIST_ITEM (L"• EEG: faster reading of BDF and EDF files.")
-LIST_ITEM (L"• Batch scripting: made ##appendInfo()# write to the console in the same way as #print.")
-LIST_ITEM (L"• Removed a bug introduced in 5.3.57 whereby some Praat text files could not be read.")
-NORMAL (L"##5.3.58# (17 November 2013)")
-LIST_ITEM (L"• EEG: support for 16-bit (next to 24-bit) BDF files and for 16-bit (next to 8-bit) statuses.")
-LIST_ITEM (L"• Mac: 64-bit beta version.")
-NORMAL (L"##5.3.57# (27 October 2013)")
-LIST_ITEM (L"• Mac: opening, modifying and saving image files (the Photo object).")
-LIST_ITEM (L"• Mac 64-bit: some small improvements in the user interface.")
-NORMAL (L"##5.3.56# (15 September 2013)")
-LIST_ITEM (L"• Mac: 64-bit alpha version.")
-LIST_ITEM (L"• Linux: improved selecting in the Picture window.")
-NORMAL (L"##5.3.55# (2 September 2013)")
-LIST_ITEM (L"• Corrected a bug introduced in 5.3.54 by which you couldn't select a file for saving.")
-NORMAL (L"##5.3.54# (1 September 2013)")
-LIST_ITEM (L"• Sound window: removed a bug introduced in 5.3.42 by which you couldn't ask for an odd number of poles in Formant Settings "
+NORMAL (U"##5.3.75# (30 April 2014)")
+LIST_ITEM (U"• Linux Matrix graphics bug fix: corrected working of ##Draw cells...#.")
+LIST_ITEM (U"• Scripting bug fix: ability to use x and y as indexed variables.")
+LIST_ITEM (U"• PowerCepstrogram bug fix: made old version of Paint command available again for scripts.")
+NORMAL (U"##5.3.74# (24 April 2014)")
+LIST_ITEM (U"• EEG: more interpretation of triggers in EDF+ files.")
+NORMAL (U"##5.3.73# (21 April 2014)")
+LIST_ITEM (U"• EEG: understand more EGI/NetStation files.")
+NORMAL (U"##5.3.72# (17 April 2014)")
+LIST_ITEM (U"• Windows: repaired a bug that caused two black edges in PNG files.")
+LIST_ITEM (U"• Windows: repaired a bug that could cause Praat to crash if a metafile resolution was 360 dpi.")
+LIST_ITEM (U"• Linux: repaired a bug that caused Praat to crash when cutting or pasting a sound in the Sound window.")
+NORMAL (U"##5.3.71# (9 April 2014)")
+LIST_ITEM (U"• Windows: brought more unity in the style of Chinese characters.")
+NORMAL (U"##5.3.70# (2 April 2014)")
+LIST_ITEM (U"• Added some query commands for DurationTier objects.")
+LIST_ITEM (U"• Repaired a bug that caused Praat not to run as a console app.")
+NORMAL (U"##5.3.69# (28 March 2014)")
+LIST_ITEM (U"• Picture window: can save to 300-dpi and 600-dpi PNG files.")
+LIST_ITEM (U"• Graphics: sub-pixel precision line drawing on Mac and Linux.")
+LIST_ITEM (U"• Repaired a bug that could show spurious buttons in the Objects window if a plug-in created objects.")
+NORMAL (U"##5.3.68# (20 March 2014)")
+LIST_ITEM (U"• Mac: corrected a bug introduced in 5.3.67 that could cause crashes when drawing a spectrogram.")
+LIST_ITEM (U"• Mac and Linux: @@Create Strings as file list...@ handles broken symbolic links more leniently.")
+NORMAL (U"##5.3.67# (19 March 2014)")
+LIST_ITEM (U"• Corrected a bug that would create strange PNG files if the selection did not touch the upper left corner of the Picture window.")
+LIST_ITEM (U"• Mac: can save the Picture window to PNG file.")
+LIST_ITEM (U"• EEG: understand trigger letters in BDF/EDF files.")
+NORMAL (U"##5.3.66# (9 March 2014)")
+LIST_ITEM (U"• Windows and Linux: can save the Picture window to PNG file.")
+LIST_ITEM (U"• Windows: opening, modifying and saving PNG, TIFF or JPEG files (the Photo object, as on the Mac).")
+NORMAL (U"##5.3.65# (27 February 2014)")
+LIST_ITEM (U"• Scripting language: removed some bugs from runScript.")
+LIST_ITEM (U"• Linux: can save the Picture window to PDF file.")
+NORMAL (U"##5.3.64# (12 February 2014)")
+LIST_ITEM (U"• Scripting language: writeInfo, procedure, exitScript, runScript: all with colons.")
+LIST_ITEM (U"• 64-bit Mac graphics: better highlighting and unhighlighting of selection.")
+LIST_ITEM (U"• 64-bit Mac graphics: full screen.")
+NORMAL (U"##5.3.63# (24 January 2014)")
+LIST_ITEM (U"• Scripting language: easier menu command invocation using the colon \":\".")
+LIST_ITEM (U"• 64-bit Mac graphics: better handling of any absence of Doulos SIL or Charis SIL.")
+LIST_ITEM (U"• Windows scripting: can now use \"~\" in file names to refer to home directory, as on Mac and Linux.")
+NORMAL (U"##5.3.62# (2 January 2014)")
+LIST_ITEM (U"• 64-bit Mac: removed a bug introduced in 5.3.61 that could cause text containing \"ff\" to become invisible.")
+NORMAL (U"##5.3.61# (1 January 2014)")
+LIST_ITEM (U"• EEG: understand status registers that contain text.")
+LIST_ITEM (U"• KlattGrid: removed a bug introduced in May 2009 that could make Praat crash after editing an oral formant grid.")
+NORMAL (U"##5.3.60# (8 December 2013)")
+LIST_ITEM (U"• Mac 64-bit: implemented swiping (to scroll with the trackpad) and pinching (to zoom with the trackpad).")
+LIST_ITEM (U"• Scripting: backslashTrigraphsToUnicode () and unicodeToBackslashTrigraphs ().")
+NORMAL (U"##5.3.59# (20 November 2013)")
+LIST_ITEM (U"• EEG: faster reading of BDF and EDF files.")
+LIST_ITEM (U"• Batch scripting: made ##appendInfo()# write to the console in the same way as #print.")
+LIST_ITEM (U"• Removed a bug introduced in 5.3.57 whereby some Praat text files could not be read.")
+NORMAL (U"##5.3.58# (17 November 2013)")
+LIST_ITEM (U"• EEG: support for 16-bit (next to 24-bit) BDF files and for 16-bit (next to 8-bit) statuses.")
+LIST_ITEM (U"• Mac: 64-bit beta version.")
+NORMAL (U"##5.3.57# (27 October 2013)")
+LIST_ITEM (U"• Mac: opening, modifying and saving image files (the Photo object).")
+LIST_ITEM (U"• Mac 64-bit: some small improvements in the user interface.")
+NORMAL (U"##5.3.56# (15 September 2013)")
+LIST_ITEM (U"• Mac: 64-bit alpha version.")
+LIST_ITEM (U"• Linux: improved selecting in the Picture window.")
+NORMAL (U"##5.3.55# (2 September 2013)")
+LIST_ITEM (U"• Corrected a bug introduced in 5.3.54 by which you couldn't select a file for saving.")
+NORMAL (U"##5.3.54# (1 September 2013)")
+LIST_ITEM (U"• Sound window: removed a bug introduced in 5.3.42 by which you couldn't ask for an odd number of poles in Formant Settings "
 	"(by e.g. specifying \"5.5\" for the number of formants).")
-LIST_ITEM (L" Linux: improved dragging of selections in the Picture window and the Sound window.")
-NORMAL (L"##5.3.53# (9 July 2013)")
-LIST_ITEM (L"• Table: more drawing commands.")
-NORMAL (L"##5.3.52# (12 June 2013)")
-LIST_ITEM (L"• Scripting: editor windows understand #do and ##do\\$ #.")
-NORMAL (L"##5.3.51# (30 May 2013)")
-LIST_ITEM (L"• Sound window: ##Extract selected sound for overlap...#.")
-NORMAL (L"##5.3.49# (13 May 2013)")
-LIST_ITEM (L"• TextGrid window: alignment of the sound and the annotation in an interval, via Espeak.")
-LIST_ITEM (L"• Scripting: repaired a bug introduced in 5.3.32 that could cause very slow running of scripts.")
-NORMAL (L"##5.3.48# (1 May 2013)")
-LIST_ITEM (L"• Scripting: variable-substitution-free object selection and file writing.")
-LIST_ITEM (L"• Scripting: #selectObject and #removeObject can select or remove multiple objects at a time.")
-NORMAL (L"##5.3.47# (23 April 2013)")
-LIST_ITEM (L"• OTGrammar: included Giorgio Magri's (2012) update rule (weighted all up, high down).")
-NORMAL (L"##5.3.46# (21 April 2013)")
-LIST_ITEM (L"• Scripting: variable-substitution-free procedure calls.")
-LIST_ITEM (L"• Linux: made the Save menu compatible with Ubuntu 12.04.")
-NORMAL (L"##5.3.45# (15 April 2013)")
-LIST_ITEM (L"• More parts of the manual reflect variable-substitution-free scripting.")
-NORMAL (L"##5.3.44# (7 April 2013)")
-LIST_ITEM (L"• ##Create Sound as pure tone...#.")
-LIST_ITEM (L"• First steps towards variable-substitution-free scripting: the #do, ##do\\$ #, #writeInfo and #appendInfo functions.")
-NORMAL (L"##5.3.43# (27 March 2013)")
-LIST_ITEM (L"• Read and write stereo Kay sound files.")
-LIST_ITEM (L"• Phonetic symbols \\ts, \\tS and \\ap.")
-LIST_ITEM (L"• Network: ##Normalize weights...#, ##List weights...#, ##Weights down to Table...#.")
-NORMAL (L"##5.3.42# (2 March 2013)")
-LIST_ITEM (L"• Repaired some minor bugs regarding synchronization between multiple windows.")
-NORMAL (L"##5.3.41# (9 February 2013)")
-LIST_ITEM (L"• Linux: repaired a bug that could cause Praat to crash when closing the Info window or a script window.")
-NORMAL (L"##5.3.40# (2 February 2013)")
-LIST_ITEM (L"• Windows: better handling (in the LongSound window) of sounds that are too long to play.")
-LIST_ITEM (L"• Mac: corrected a bug that caused Praat to crash when closing the Strings window.")
-LIST_ITEM (L"• Linux: made audio output work again on 32-bit Linux.")
-NORMAL (L"##5.3.39# (6 January 2013)")
-LIST_ITEM (L"• Formant & Spectrogram: To IntensityTier...")
-NORMAL (L"##5.3.38# (4 January 2013)")
-LIST_ITEM (L"• ExperimentMFC: repaired a bug introduced in 5.3.36 that caused sound to fail to play completely if the screen did not blank.")
-NORMAL (L"##5.3.37# (2 January 2013)")
-LIST_ITEM (L"• ExperimentMFC: after screen blanking, reaction times count from when the response buttons appear.")
-NORMAL (L"##5.3.36# (1 January 2013)")
-LIST_ITEM (L"• ExperimentMFC: made it possible to blank the screen while the sound is playing.")
-NORMAL (L"##5.3.35# (8 December 2012)")
-LIST_ITEM (L"• SpeechSynthesizer: made it possible to have more than one at a time.")
-LIST_ITEM (L"• Linux: corrected a bug that caused incorrect alignment of the buttons in the Objects window.")
-NORMAL (L"##5.3.34# (21 November 2012)")
-LIST_ITEM (L"• Windows: corrected a bug that caused incorrect alignment of the buttons in the Objects window.")
-LIST_ITEM (L"• The new ##Sound: Combine to stereo# can now work with Sounds of different durations, as the old could.")
-LIST_ITEM (L"• Corrected a bug that caused Praat to crash when creating a SpeechSynthesizer.")
-NORMAL (L"##5.3.33# (20 November 2012)")
-LIST_ITEM (L"• ##Sound: Combine to stereo# can now combine any number of Sounds into a new Sound whose number of channels "
+LIST_ITEM (U" Linux: improved dragging of selections in the Picture window and the Sound window.")
+NORMAL (U"##5.3.53# (9 July 2013)")
+LIST_ITEM (U"• Table: more drawing commands.")
+NORMAL (U"##5.3.52# (12 June 2013)")
+LIST_ITEM (U"• Scripting: editor windows understand #do and ##do\\$ #.")
+NORMAL (U"##5.3.51# (30 May 2013)")
+LIST_ITEM (U"• Sound window: ##Extract selected sound for overlap...#.")
+NORMAL (U"##5.3.49# (13 May 2013)")
+LIST_ITEM (U"• TextGrid window: alignment of the sound and the annotation in an interval, via Espeak.")
+LIST_ITEM (U"• Scripting: repaired a bug introduced in 5.3.32 that could cause very slow running of scripts.")
+NORMAL (U"##5.3.48# (1 May 2013)")
+LIST_ITEM (U"• Scripting: variable-substitution-free object selection and file writing.")
+LIST_ITEM (U"• Scripting: #selectObject and #removeObject can select or remove multiple objects at a time.")
+NORMAL (U"##5.3.47# (23 April 2013)")
+LIST_ITEM (U"• OTGrammar: included Giorgio Magri's (2012) update rule (weighted all up, high down).")
+NORMAL (U"##5.3.46# (21 April 2013)")
+LIST_ITEM (U"• Scripting: variable-substitution-free procedure calls.")
+LIST_ITEM (U"• Linux: made the Save menu compatible with Ubuntu 12.04.")
+NORMAL (U"##5.3.45# (15 April 2013)")
+LIST_ITEM (U"• More parts of the manual reflect variable-substitution-free scripting.")
+NORMAL (U"##5.3.44# (7 April 2013)")
+LIST_ITEM (U"• ##Create Sound as pure tone...#.")
+LIST_ITEM (U"• First steps towards variable-substitution-free scripting: the #do, ##do\\$ #, #writeInfo and #appendInfo functions.")
+NORMAL (U"##5.3.43# (27 March 2013)")
+LIST_ITEM (U"• Read and write stereo Kay sound files.")
+LIST_ITEM (U"• Phonetic symbols \\ts, \\tS and \\ap.")
+LIST_ITEM (U"• Network: ##Normalize weights...#, ##List weights...#, ##Weights down to Table...#.")
+NORMAL (U"##5.3.42# (2 March 2013)")
+LIST_ITEM (U"• Repaired some minor bugs regarding synchronization between multiple windows.")
+NORMAL (U"##5.3.41# (9 February 2013)")
+LIST_ITEM (U"• Linux: repaired a bug that could cause Praat to crash when closing the Info window or a script window.")
+NORMAL (U"##5.3.40# (2 February 2013)")
+LIST_ITEM (U"• Windows: better handling (in the LongSound window) of sounds that are too long to play.")
+LIST_ITEM (U"• Mac: corrected a bug that caused Praat to crash when closing the Strings window.")
+LIST_ITEM (U"• Linux: made audio output work again on 32-bit Linux.")
+NORMAL (U"##5.3.39# (6 January 2013)")
+LIST_ITEM (U"• Formant & Spectrogram: To IntensityTier...")
+NORMAL (U"##5.3.38# (4 January 2013)")
+LIST_ITEM (U"• ExperimentMFC: repaired a bug introduced in 5.3.36 that caused sound to fail to play completely if the screen did not blank.")
+NORMAL (U"##5.3.37# (2 January 2013)")
+LIST_ITEM (U"• ExperimentMFC: after screen blanking, reaction times count from when the response buttons appear.")
+NORMAL (U"##5.3.36# (1 January 2013)")
+LIST_ITEM (U"• ExperimentMFC: made it possible to blank the screen while the sound is playing.")
+NORMAL (U"##5.3.35# (8 December 2012)")
+LIST_ITEM (U"• SpeechSynthesizer: made it possible to have more than one at a time.")
+LIST_ITEM (U"• Linux: corrected a bug that caused incorrect alignment of the buttons in the Objects window.")
+NORMAL (U"##5.3.34# (21 November 2012)")
+LIST_ITEM (U"• Windows: corrected a bug that caused incorrect alignment of the buttons in the Objects window.")
+LIST_ITEM (U"• The new ##Sound: Combine to stereo# can now work with Sounds of different durations, as the old could.")
+LIST_ITEM (U"• Corrected a bug that caused Praat to crash when creating a SpeechSynthesizer.")
+NORMAL (U"##5.3.33# (20 November 2012)")
+LIST_ITEM (U"• ##Sound: Combine to stereo# can now combine any number of Sounds into a new Sound whose number of channels "
 	"is the sum of the numbers of channels of the original Sounds.")
-LIST_ITEM (L"• ERP: Down to Sound.")
-NORMAL (L"##5.3.32# (17 October 2012)")
-LIST_ITEM (L"• Sound window: corrected the working of the \"by window\" scaling option.")
-NORMAL (L"##5.3.31# (10 October 2012)")
-LIST_ITEM (L"• ERP: Down to Table...")
-LIST_ITEM (L"• Linux: corrected a bug that could cause Praat to crash after closing a file selector window for saving.")
-NORMAL (L"##5.3.30# (6 October 2012)")
-LIST_ITEM (L"• Circumvented a rare Windows bug that could cause Praat to start to write 1.5 as 1,5 in some countries "
+LIST_ITEM (U"• ERP: Down to Sound.")
+NORMAL (U"##5.3.32# (17 October 2012)")
+LIST_ITEM (U"• Sound window: corrected the working of the \"by window\" scaling option.")
+NORMAL (U"##5.3.31# (10 October 2012)")
+LIST_ITEM (U"• ERP: Down to Table...")
+LIST_ITEM (U"• Linux: corrected a bug that could cause Praat to crash after closing a file selector window for saving.")
+NORMAL (U"##5.3.30# (6 October 2012)")
+LIST_ITEM (U"• Circumvented a rare Windows bug that could cause Praat to start to write 1.5 as 1,5 in some countries "
 	"after opening a strange directory.")
-LIST_ITEM (L"• Windows: corrected a bug introduced in 5.3.24 that could cause Praat to crash when quitting.")
-LIST_ITEM (L"• Windows: corrected a bug introduced in 5.3.24 that could cause the Objects window to look weird after resizing.")
-NORMAL (L"##5.3.29# (30 September 2012)")
-LIST_ITEM (L"• @EEG: Draw scalp..., including gray legend.")
-LIST_ITEM (L"• Made the new Sound scaling options available for LongSounds.")
-NORMAL (L"##5.3.28# (28 September 2012)")
-LIST_ITEM (L"• Corrected a bug introduced in 5.3.24 that made Praat crash on OSX 10.5.")
-NORMAL (L"##5.3.27# (27 September 2012)")
-LIST_ITEM (L"• Corrected a couple of small bugs.")
-NORMAL (L"##5.3.26# (26 September 2012)")
-LIST_ITEM (L"• Corrected a bug introduced in 5.3.24 that prevented Praat from running in batch mode.")
-NORMAL (L"##5.3.25# (26 September 2012)")
-LIST_ITEM (L"• EEG: view of scalp distribution takes scaling options into account.")
-LIST_ITEM (L"• Linux: swipable Sound window and manual.")
-LIST_ITEM (L"• Linux: corrected a bug introduced in 5.3.24 whereby TextGrids could not be edited.")
-NORMAL (L"##5.3.24# (24 September 2012)")
-LIST_ITEM (L"• More kinds of vertical scaling in e.g. Sound and EEG windows.")
-LIST_ITEM (L"• Rewritten user interface (may contain some bugs).")
-NORMAL (L"##5.3.23# (7 August 2012)")
-LIST_ITEM (L"• Mac: removed a bug introduced in September 2011 that could cause incorrect behaviour of regular expressions since July 2012.")
-NORMAL (L"##5.3.22# (21 July 2012)")
-LIST_ITEM (L"• Linux: removed a bug introduced in 5.3.21 that could cause Praat to crash when opening files.")
-LIST_ITEM (L"• Neural networks: correct writing and reading of learning settings.")
-NORMAL (L"##5.3.21# (10 July 2012)")
-LIST_ITEM (L"• Linux: better folder choice in file selector window for opening files.")
-LIST_ITEM (L"• Repaired a bug that caused Praat to crash when opening a ManPages file on some platforms.")
-NORMAL (L"##5.3.20# (5 July 2012)")
-LIST_ITEM (L"• @EEG: ##Replace TextGrid#.")
-NORMAL (L"##5.3.19# (24 June 2012)")
-NORMAL (L"##5.3.18# (15 June 2012)")
-LIST_ITEM (L"• Corrected a bug in @@Sound: Change gender...@ that caused a part of the sound not to be changed.")
-NORMAL (L"##5.3.17# (12 June 2012)")
-LIST_ITEM (L"• @EEG window: extent autoscaling by window.")
-LIST_ITEM (L"• ERPTier: Remove events between...")
-NORMAL (L"##5.3.16# (23 May 2012)")
-NORMAL (L"##5.3.15# (10 May 2012)")
-LIST_ITEM (L"• Improvements in clipboards, PDF and EPS files.")
-NORMAL (L"##5.3.14# (28 April 2012)")
-LIST_ITEM (L"• Linux: Tab shortcut for playing the selection.")
-LIST_ITEM (L"• EPS files: higher minimum image resolution for spectrograms (300 instead of 106 dpi).")
-NORMAL (L"##5.3.13# (11 April 2012)")
-LIST_ITEM (L"• @EEG: Extract part...")
-NORMAL (L"##5.3.12# (5 April 2012)")
-LIST_ITEM (L"• Praat picture file: allow larger function drawings (up to 10^9 instead of 10^6 points).")
-LIST_ITEM (L"• Linux: better audio compatibility with Ubuntu 11.10 (support for unusual sampling frequencies when playing LongSounds).")
-NORMAL (L"##5.3.11# (27 March 2012)")
-LIST_ITEM (L"• @EEG: a selected ERPTier can extract events on the basis of a column of a selected Table.")
-NORMAL (L"##5.3.10# (12 March 2012)")
-LIST_ITEM (L"• @EEG: Concatenate.")
-NORMAL (L"##5.3.09# (10 March 2012)")
-LIST_ITEM (L"• Better text-to-speech.")
-NORMAL (L"##5.3.08# (5 March 2012)")
-LIST_ITEM (L"• Removed a bug introduced in 5.3.07 that could cause Praat to crash when viewing a LongSound.")
-NORMAL (L"##5.3.07# (4 March 2012)")
-LIST_ITEM (L"• Praat can now save Sounds as 24-bit and 32-bit WAV files.")
-NORMAL (L"##5.3.06# (28 February 2012)")
-NORMAL (L"##5.3.05# (19 February 2012)")
-LIST_ITEM (L"• SpeechSynthesizer (#New menu \\-> #Sound): text-to-speech.")
-LIST_ITEM (L"• @EEG: better scalp distribution drawing for both 32-channel and 64-channel recordings.")
-NORMAL (L"##5.3.04# (12 January 2012)")
-LIST_ITEM (L"• EEG: draw scalp distribution.")
-LIST_ITEM (L"• Linux: better audio compatibility with Ubuntu 11.10 (support for unusual sampling frequencies when playing Sounds).")
-NORMAL (L"##5.3.03# (21 November 2011)")
-LIST_ITEM (L"• EEG: filtering, editing, more viewing.")
-NORMAL (L"##5.3.02# (7 November 2011)")
-LIST_ITEM (L"• Corrected a bug introduced in 5.3.01 that could cause the PitchTier or PointProcess window to crash.")
-LIST_ITEM (L"• Corrected a bug that could cause the Info window to freeze after an error message in a script window.")
-NORMAL (L"##5.3.01# (1 November 2011)")
-LIST_ITEM (L"• Macintosh and Windows: better window positioning if the Dock or Task Bar is on the left or right.")
-LIST_ITEM (L"• IPA symbol: you can now use \\bs.f for the half-length sign (\\.f).")
-LIST_ITEM (L"• EEG window.")
-ENTRY (L"What used to be new?")
-LIST_ITEM (L"• @@What was new in 5.3?")
-LIST_ITEM (L"• @@What was new in 5.2?")
-LIST_ITEM (L"• @@What was new in 5.1?")
-LIST_ITEM (L"• @@What was new in 5.0?")
-LIST_ITEM (L"• @@What was new in 4.6?")
-LIST_ITEM (L"• @@What was new in 4.5?")
-LIST_ITEM (L"• @@What was new in 4.4?")
-LIST_ITEM (L"• @@What was new in 4.3?")
-LIST_ITEM (L"• @@What was new in 4.2?")
-LIST_ITEM (L"• @@What was new in 4.1?")
-LIST_ITEM (L"• @@What was new in 4.0?")
-LIST_ITEM (L"• @@What was new in 3.9?")
-LIST_ITEM (L"• @@What was new in 3.8?")
-LIST_ITEM (L"• @@What was new in 3.7?")
-LIST_ITEM (L"• @@What was new in 3.6?")
-LIST_ITEM (L"• @@What was new in 3.5?")
-LIST_ITEM (L"• @@What was new in 3.3?")
-LIST_ITEM (L"• @@What was new in 3.2?")
-LIST_ITEM (L"• @@What was new in 3.1?")
-MAN_END
-
-MAN_BEGIN (L"What was new in 5.3?", L"ppgb", 20111015)
-NORMAL (L"##5.3# (15 October 2011)")
-NORMAL (L"##5.2.46# (7 October 2011)")
-LIST_ITEM (L"• Corrected the same very old bug as in 5.2.44, but now also for opening and saving files.")
-LIST_ITEM (L"• Many better messages.")
-NORMAL (L"##5.2.45# (29 September 2011)")
-LIST_ITEM (L"• Spectrum window: ##Move cursor to nearest peak#.")
-LIST_ITEM (L"• Table: ##Save as comma-separated file...#.")
-LIST_ITEM (L"• Windows: you can now change the font size of the script window.")
-LIST_ITEM (L"• Windows scripting: the Info window now updates while you are writing to it.")
-LIST_ITEM (L"• Windows: error messages now stay at the front so that you never have to click away "
+LIST_ITEM (U"• Windows: corrected a bug introduced in 5.3.24 that could cause Praat to crash when quitting.")
+LIST_ITEM (U"• Windows: corrected a bug introduced in 5.3.24 that could cause the Objects window to look weird after resizing.")
+NORMAL (U"##5.3.29# (30 September 2012)")
+LIST_ITEM (U"• @EEG: Draw scalp..., including gray legend.")
+LIST_ITEM (U"• Made the new Sound scaling options available for LongSounds.")
+NORMAL (U"##5.3.28# (28 September 2012)")
+LIST_ITEM (U"• Corrected a bug introduced in 5.3.24 that made Praat crash on OSX 10.5.")
+NORMAL (U"##5.3.27# (27 September 2012)")
+LIST_ITEM (U"• Corrected a couple of small bugs.")
+NORMAL (U"##5.3.26# (26 September 2012)")
+LIST_ITEM (U"• Corrected a bug introduced in 5.3.24 that prevented Praat from running in batch mode.")
+NORMAL (U"##5.3.25# (26 September 2012)")
+LIST_ITEM (U"• EEG: view of scalp distribution takes scaling options into account.")
+LIST_ITEM (U"• Linux: swipable Sound window and manual.")
+LIST_ITEM (U"• Linux: corrected a bug introduced in 5.3.24 whereby TextGrids could not be edited.")
+NORMAL (U"##5.3.24# (24 September 2012)")
+LIST_ITEM (U"• More kinds of vertical scaling in e.g. Sound and EEG windows.")
+LIST_ITEM (U"• Rewritten user interface (may contain some bugs).")
+NORMAL (U"##5.3.23# (7 August 2012)")
+LIST_ITEM (U"• Mac: removed a bug introduced in September 2011 that could cause incorrect behaviour of regular expressions since July 2012.")
+NORMAL (U"##5.3.22# (21 July 2012)")
+LIST_ITEM (U"• Linux: removed a bug introduced in 5.3.21 that could cause Praat to crash when opening files.")
+LIST_ITEM (U"• Neural networks: correct writing and reading of learning settings.")
+NORMAL (U"##5.3.21# (10 July 2012)")
+LIST_ITEM (U"• Linux: better folder choice in file selector window for opening files.")
+LIST_ITEM (U"• Repaired a bug that caused Praat to crash when opening a ManPages file on some platforms.")
+NORMAL (U"##5.3.20# (5 July 2012)")
+LIST_ITEM (U"• @EEG: ##Replace TextGrid#.")
+NORMAL (U"##5.3.19# (24 June 2012)")
+NORMAL (U"##5.3.18# (15 June 2012)")
+LIST_ITEM (U"• Corrected a bug in @@Sound: Change gender...@ that caused a part of the sound not to be changed.")
+NORMAL (U"##5.3.17# (12 June 2012)")
+LIST_ITEM (U"• @EEG window: extent autoscaling by window.")
+LIST_ITEM (U"• ERPTier: Remove events between...")
+NORMAL (U"##5.3.16# (23 May 2012)")
+NORMAL (U"##5.3.15# (10 May 2012)")
+LIST_ITEM (U"• Improvements in clipboards, PDF and EPS files.")
+NORMAL (U"##5.3.14# (28 April 2012)")
+LIST_ITEM (U"• Linux: Tab shortcut for playing the selection.")
+LIST_ITEM (U"• EPS files: higher minimum image resolution for spectrograms (300 instead of 106 dpi).")
+NORMAL (U"##5.3.13# (11 April 2012)")
+LIST_ITEM (U"• @EEG: Extract part...")
+NORMAL (U"##5.3.12# (5 April 2012)")
+LIST_ITEM (U"• Praat picture file: allow larger function drawings (up to 10^9 instead of 10^6 points).")
+LIST_ITEM (U"• Linux: better audio compatibility with Ubuntu 11.10 (support for unusual sampling frequencies when playing LongSounds).")
+NORMAL (U"##5.3.11# (27 March 2012)")
+LIST_ITEM (U"• @EEG: a selected ERPTier can extract events on the basis of a column of a selected Table.")
+NORMAL (U"##5.3.10# (12 March 2012)")
+LIST_ITEM (U"• @EEG: Concatenate.")
+NORMAL (U"##5.3.09# (10 March 2012)")
+LIST_ITEM (U"• Better text-to-speech.")
+NORMAL (U"##5.3.08# (5 March 2012)")
+LIST_ITEM (U"• Removed a bug introduced in 5.3.07 that could cause Praat to crash when viewing a LongSound.")
+NORMAL (U"##5.3.07# (4 March 2012)")
+LIST_ITEM (U"• Praat can now save Sounds as 24-bit and 32-bit WAV files.")
+NORMAL (U"##5.3.06# (28 February 2012)")
+NORMAL (U"##5.3.05# (19 February 2012)")
+LIST_ITEM (U"• SpeechSynthesizer (#New menu \\-> #Sound): text-to-speech.")
+LIST_ITEM (U"• @EEG: better scalp distribution drawing for both 32-channel and 64-channel recordings.")
+NORMAL (U"##5.3.04# (12 January 2012)")
+LIST_ITEM (U"• EEG: draw scalp distribution.")
+LIST_ITEM (U"• Linux: better audio compatibility with Ubuntu 11.10 (support for unusual sampling frequencies when playing Sounds).")
+NORMAL (U"##5.3.03# (21 November 2011)")
+LIST_ITEM (U"• EEG: filtering, editing, more viewing.")
+NORMAL (U"##5.3.02# (7 November 2011)")
+LIST_ITEM (U"• Corrected a bug introduced in 5.3.01 that could cause the PitchTier or PointProcess window to crash.")
+LIST_ITEM (U"• Corrected a bug that could cause the Info window to freeze after an error message in a script window.")
+NORMAL (U"##5.3.01# (1 November 2011)")
+LIST_ITEM (U"• Macintosh and Windows: better window positioning if the Dock or Task Bar is on the left or right.")
+LIST_ITEM (U"• IPA symbol: you can now use \\bs.f for the half-length sign (\\.f).")
+LIST_ITEM (U"• EEG window.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 5.3?", U"ppgb", 20111015)
+NORMAL (U"##5.3# (15 October 2011)")
+NORMAL (U"##5.2.46# (7 October 2011)")
+LIST_ITEM (U"• Corrected the same very old bug as in 5.2.44, but now also for opening and saving files.")
+LIST_ITEM (U"• Many better messages.")
+NORMAL (U"##5.2.45# (29 September 2011)")
+LIST_ITEM (U"• Spectrum window: ##Move cursor to nearest peak#.")
+LIST_ITEM (U"• Table: ##Save as comma-separated file...#.")
+LIST_ITEM (U"• Windows: you can now change the font size of the script window.")
+LIST_ITEM (U"• Windows scripting: the Info window now updates while you are writing to it.")
+LIST_ITEM (U"• Windows: error messages now stay at the front so that you never have to click away "
 	"an invisible message window anymore.")
-NORMAL (L"##5.2.44# (23 September 2011)")
-LIST_ITEM (L"• Corrected a very old bug in the history mechanism (the button title wouldn't always show up).")
-NORMAL (L"##5.2.43# (21 September 2011)")
-LIST_ITEM (L"• Linux: you can now change the font size of the script window.")
-LIST_ITEM (L"• Corrected a bug that could cause Praat to crash when opening an already open file in the script window.")
-NORMAL (L"##5.2.42# (18 September 2011)")
-LIST_ITEM (L"• Corrected a bug introduced in 5.2.36 that prevented formulas from working on FormantGrid objects.")
-NORMAL (L"##5.2.41# (17 September 2011)")
-LIST_ITEM (L"• Improved dashed-dotted lines in EPS files.")
-LIST_ITEM (L"• Corrected a bug introduced in 5.2.36 that caused Praat to crash when running an ExperimentMFC.")
-NORMAL (L"##5.2.40# (11 September 2011)")
-LIST_ITEM (L"• Corrected a bug in the 64-bit Windows edition that led to an incorrect location for the preferences files.")
-NORMAL (L"##5.2.39# (10 September 2011)")
-LIST_ITEM (L"• 64-bit edition for Windows.")
-LIST_ITEM (L"• Corrected a bug that caused Praat to crash instead of saying \"undefined\" when reporting the shimmer of a sound with fewer than 3 pulses.")
-NORMAL (L"##5.2.38# (6 September 2011)")
-LIST_ITEM (L"• Corrected several bugs that were introduced in 5.2.36 in the Inspect window.")
-NORMAL (L"##5.2.37# (2 September 2011)")
-LIST_ITEM (L"• Graphics: added the Chinese phonetic symbols \\id and \\ir. See @@Phonetic symbols: vowels at .")
-LIST_ITEM (L"• Corrected a bug introduced in 5.2.36 that caused Praat to crash when querying formant quantiles.")
-NORMAL (L"##5.2.36# (30 August 2011)")
-LIST_ITEM (L"• Graphics: added superscript diacritics as single symbols: \\^h (\\bs\\^ h), \\^j (\\bs\\^ j), "
+NORMAL (U"##5.2.44# (23 September 2011)")
+LIST_ITEM (U"• Corrected a very old bug in the history mechanism (the button title wouldn't always show up).")
+NORMAL (U"##5.2.43# (21 September 2011)")
+LIST_ITEM (U"• Linux: you can now change the font size of the script window.")
+LIST_ITEM (U"• Corrected a bug that could cause Praat to crash when opening an already open file in the script window.")
+NORMAL (U"##5.2.42# (18 September 2011)")
+LIST_ITEM (U"• Corrected a bug introduced in 5.2.36 that prevented formulas from working on FormantGrid objects.")
+NORMAL (U"##5.2.41# (17 September 2011)")
+LIST_ITEM (U"• Improved dashed-dotted lines in EPS files.")
+LIST_ITEM (U"• Corrected a bug introduced in 5.2.36 that caused Praat to crash when running an ExperimentMFC.")
+NORMAL (U"##5.2.40# (11 September 2011)")
+LIST_ITEM (U"• Corrected a bug in the 64-bit Windows edition that led to an incorrect location for the preferences files.")
+NORMAL (U"##5.2.39# (10 September 2011)")
+LIST_ITEM (U"• 64-bit edition for Windows.")
+LIST_ITEM (U"• Corrected a bug that caused Praat to crash instead of saying \"undefined\" when reporting the shimmer of a sound with fewer than 3 pulses.")
+NORMAL (U"##5.2.38# (6 September 2011)")
+LIST_ITEM (U"• Corrected several bugs that were introduced in 5.2.36 in the Inspect window.")
+NORMAL (U"##5.2.37# (2 September 2011)")
+LIST_ITEM (U"• Graphics: added the Chinese phonetic symbols \\id and \\ir. See @@Phonetic symbols: vowels at .")
+LIST_ITEM (U"• Corrected a bug introduced in 5.2.36 that caused Praat to crash when querying formant quantiles.")
+NORMAL (U"##5.2.36# (30 August 2011)")
+LIST_ITEM (U"• Graphics: added superscript diacritics as single symbols: \\^h (\\bs\\^ h), \\^j (\\bs\\^ j), "
 	"and many more; also \\_u (\\bs\\_ u). See @@Phonetic symbols: diacritics at .")
-LIST_ITEM (L"• Praat fully converted to C++ (this may initially cause some bugs, but will be more reliable in the end).")
-NORMAL (L"##5.2.35# (5 August 2011)")
-LIST_ITEM (L"• Corrected the menus of the Sound and TextGrid windows.")
-NORMAL (L"##5.2.34# (3 August 2011)")
-LIST_ITEM (L"• @@Insert picture from file...@ now works on Windows (as well as on the Mac).")
-LIST_ITEM (L"• Corrected a bug that could cause Praat to crash when playing a LongSound.")
-NORMAL (L"##5.2.33# (29 July 2011)")
-LIST_ITEM (L"• Improved the reliability of sound playing and several other things.")
-LIST_ITEM (L"• Improved several error messages.")
-NORMAL (L"##5.2.32# (22 July 2011)")
-LIST_ITEM (L"• Corrected several problems with error messages.")
-LIST_ITEM (L"• Corrected a bug that could cause slow execution of scripts with forms.")
-NORMAL (L"##5.2.31# (21 July 2011)")
-LIST_ITEM (L"• Corrected a bug that caused an incorrect window size in the VowelEditor.")
-LIST_ITEM (L"• Corrected a bug that caused incorrect error messages when opening a FLAC file as a LongSound.")
-LIST_ITEM (L"• Sound window: corrected a bug that could cause Praat to crash when zooming in on the left or right edge.")
-NORMAL (L"##5.2.30# (18 July 2011)")
-LIST_ITEM (L"• Corrected a bug introduced in 5.2.29 whereby the list of object actions could stay empty after an error message in a script.")
-LIST_ITEM (L"• Corrected a bug in Klatt synthesis whereby the generation of a sound could be refused.")
-NORMAL (L"##5.2.29# (12 July 2011)")
-LIST_ITEM (L"• More accurate error checking, due to Praat's conversion to C++ (last C-only version was 5.2.17).")
-NORMAL (L"##5.2.28# (28 June 2011)")
-LIST_ITEM (L"• Corrected some Polygon bugs.")
-NORMAL (L"##5.2.27# (19 June 2011)")
-LIST_ITEM (L"• @Polygon: ##Draw (closed)...#.")
-LIST_ITEM (L"• @@PointProcess: To Sound (phonation)...@: "
+LIST_ITEM (U"• Praat fully converted to C++ (this may initially cause some bugs, but will be more reliable in the end).")
+NORMAL (U"##5.2.35# (5 August 2011)")
+LIST_ITEM (U"• Corrected the menus of the Sound and TextGrid windows.")
+NORMAL (U"##5.2.34# (3 August 2011)")
+LIST_ITEM (U"• @@Insert picture from file...@ now works on Windows (as well as on the Mac).")
+LIST_ITEM (U"• Corrected a bug that could cause Praat to crash when playing a LongSound.")
+NORMAL (U"##5.2.33# (29 July 2011)")
+LIST_ITEM (U"• Improved the reliability of sound playing and several other things.")
+LIST_ITEM (U"• Improved several error messages.")
+NORMAL (U"##5.2.32# (22 July 2011)")
+LIST_ITEM (U"• Corrected several problems with error messages.")
+LIST_ITEM (U"• Corrected a bug that could cause slow execution of scripts with forms.")
+NORMAL (U"##5.2.31# (21 July 2011)")
+LIST_ITEM (U"• Corrected a bug that caused an incorrect window size in the VowelEditor.")
+LIST_ITEM (U"• Corrected a bug that caused incorrect error messages when opening a FLAC file as a LongSound.")
+LIST_ITEM (U"• Sound window: corrected a bug that could cause Praat to crash when zooming in on the left or right edge.")
+NORMAL (U"##5.2.30# (18 July 2011)")
+LIST_ITEM (U"• Corrected a bug introduced in 5.2.29 whereby the list of object actions could stay empty after an error message in a script.")
+LIST_ITEM (U"• Corrected a bug in Klatt synthesis whereby the generation of a sound could be refused.")
+NORMAL (U"##5.2.29# (12 July 2011)")
+LIST_ITEM (U"• More accurate error checking, due to Praat's conversion to C++ (last C-only version was 5.2.17).")
+NORMAL (U"##5.2.28# (28 June 2011)")
+LIST_ITEM (U"• Corrected some Polygon bugs.")
+NORMAL (U"##5.2.27# (19 June 2011)")
+LIST_ITEM (U"• @Polygon: ##Draw (closed)...#.")
+LIST_ITEM (U"• @@PointProcess: To Sound (phonation)...@: "
 	"corrected a bug that could cause Praat to crash if pulses lay outside the time domain.")
-NORMAL (L"##5.2.26# (24 May 2011)")
-LIST_ITEM (L"• Corrected a bug that could cause Praat to crash on some platforms when reading a Praat binary file.")
-LIST_ITEM (L"• @ExperimentMFC: corrected a bug that caused Praat to crash if an experiment contained zero trials.")
-LIST_ITEM (L"• Corrected a bug that caused Praat to crash when merging multiple IntervalTiers.")
-NORMAL (L"##5.2.25# (11 May 2011)")
-LIST_ITEM (L"• OT learning: corrected a crashing bug from ##Get candidate...#.")
-NORMAL (L"##5.2.24# (10 May 2011)")
-LIST_ITEM (L"• Ability to open WAV files that contain incorrect information about the number of samples.")
-LIST_ITEM (L"• Removed an old bug that could cause Praat to fail to read a chronological TextGrid text file.")
-NORMAL (L"##5.2.23# (1 May 2011)")
-LIST_ITEM (L"• Removed a bug introduced recently that could cause Praat to crash when working with derivatives of TableOfReal (such as Distributions).")
-NORMAL (L"##5.2.22# (14 April 2011)")
-LIST_ITEM (L"• @ExperimentMFC: reaction times for key presses.")
-LIST_ITEM (L"• Linux: more reliable start-up on German systems.")
-NORMAL (L"##5.2.21# (29 March 2011)")
-LIST_ITEM (L"• Scripting: removed a crashing bug introduced for colour names in 5.2.20.")
-NORMAL (L"##5.2.20# (25 March 2011)")
-LIST_ITEM (L"• Scripting: removed a large memory leak for indexed variables.")
-LIST_ITEM (L"• Scripting: removed a small memory leak for colour names.")
-LIST_ITEM (L"• Support for very long file paths on the Mac.")
-NORMAL (L"##5.2.19# (16 March 2011)")
-LIST_ITEM (L"• @ExperimentMFC: corrected a bug introduced in 5.2.18 that could cause Praat to crash when extracting results from an incomplete experiment.")
-NORMAL (L"##5.2.18# (9 March 2011)")
-LIST_ITEM (L"• @ExperimentMFC: incomplete experiments can nevertheless output their incomplete results.")
-NORMAL (L"##5.2.17# (2 March 2011)")
-LIST_ITEM (L"• Better names for Table opening and saving commands.")
-LIST_ITEM (L"• @ExperimentMFC: reaction times for mouse clicks.")
-LIST_ITEM (L"• Linux/GTK: corrected triple clicks in ExperimentMFC.")
-NORMAL (L"##5.2.16# (20 February 2011)")
-LIST_ITEM (L"• Better support for WAV files with special \"chunks\" in them.")
-LIST_ITEM (L"• Manual: documentation of explicit formulas for @@Voice 2. Jitter|jitter measurements at .")
-NORMAL (L"##5.2.15# (11 February 2011)")
-LIST_ITEM (L"• @@Sounds: Concatenate with overlap... at .")
-NORMAL (L"##5.2.14# (8 February 2011)")
-LIST_ITEM (L"• Repaired crashing bug in Manipulation window introduced in 5.2.13.")
-NORMAL (L"##5.2.13# (7 February 2011)")
-LIST_ITEM (L"• Renamed #Write commands to #Save commands.")
-LIST_ITEM (L"• Scripting: allow pause forms without #Stop button (see @@Scripting 6.6. Controlling the user@).")
-LIST_ITEM (L"• GTK: correct behaviour of default buttons.")
-NORMAL (L"##5.2.12# (28 January 2011)")
-LIST_ITEM (L"• Renamed #Edit buttons to ##View & Edit#.")
-LIST_ITEM (L"• Better visibility of dragged things on Linux.")
-NORMAL (L"##5.2.11# (18 January 2011)")
-LIST_ITEM (L"• Better visibility of dragged things (sound selection, tier points, TextGrid boundaries) on Windows and Linux.")
-NORMAL (L"##5.2.10# (11 January 2011)")
-LIST_ITEM (L"• Renamed #Read and #Write menus to #Open and #Save.")
-LIST_ITEM (L"• Sound: use of ##Formula (part)...# can speed up formulas appreciably.")
-NORMAL (L"##5.2.09# (9 January 2011)")
-LIST_ITEM (L"• Much improved scripting tutorial.")
-LIST_ITEM (L"• Listening experiments can now show pictures instead of just texts (on the Mac).")
-LIST_ITEM (L"• EPS files can now be many miles wide instead of just 55 inches.")
-NORMAL (L"##5.2.08# (1 January 2011)")
-LIST_ITEM (L"• Improved manual.")
-LIST_ITEM (L"• Improved memory allocation on 32-bit platforms: "
+NORMAL (U"##5.2.26# (24 May 2011)")
+LIST_ITEM (U"• Corrected a bug that could cause Praat to crash on some platforms when reading a Praat binary file.")
+LIST_ITEM (U"• @ExperimentMFC: corrected a bug that caused Praat to crash if an experiment contained zero trials.")
+LIST_ITEM (U"• Corrected a bug that caused Praat to crash when merging multiple IntervalTiers.")
+NORMAL (U"##5.2.25# (11 May 2011)")
+LIST_ITEM (U"• OT learning: corrected a crashing bug from ##Get candidate...#.")
+NORMAL (U"##5.2.24# (10 May 2011)")
+LIST_ITEM (U"• Ability to open WAV files that contain incorrect information about the number of samples.")
+LIST_ITEM (U"• Removed an old bug that could cause Praat to fail to read a chronological TextGrid text file.")
+NORMAL (U"##5.2.23# (1 May 2011)")
+LIST_ITEM (U"• Removed a bug introduced recently that could cause Praat to crash when working with derivatives of TableOfReal (such as Distributions).")
+NORMAL (U"##5.2.22# (14 April 2011)")
+LIST_ITEM (U"• @ExperimentMFC: reaction times for key presses.")
+LIST_ITEM (U"• Linux: more reliable start-up on German systems.")
+NORMAL (U"##5.2.21# (29 March 2011)")
+LIST_ITEM (U"• Scripting: removed a crashing bug introduced for colour names in 5.2.20.")
+NORMAL (U"##5.2.20# (25 March 2011)")
+LIST_ITEM (U"• Scripting: removed a large memory leak for indexed variables.")
+LIST_ITEM (U"• Scripting: removed a small memory leak for colour names.")
+LIST_ITEM (U"• Support for very long file paths on the Mac.")
+NORMAL (U"##5.2.19# (16 March 2011)")
+LIST_ITEM (U"• @ExperimentMFC: corrected a bug introduced in 5.2.18 that could cause Praat to crash when extracting results from an incomplete experiment.")
+NORMAL (U"##5.2.18# (9 March 2011)")
+LIST_ITEM (U"• @ExperimentMFC: incomplete experiments can nevertheless output their incomplete results.")
+NORMAL (U"##5.2.17# (2 March 2011)")
+LIST_ITEM (U"• Better names for Table opening and saving commands.")
+LIST_ITEM (U"• @ExperimentMFC: reaction times for mouse clicks.")
+LIST_ITEM (U"• Linux/GTK: corrected triple clicks in ExperimentMFC.")
+NORMAL (U"##5.2.16# (20 February 2011)")
+LIST_ITEM (U"• Better support for WAV files with special \"chunks\" in them.")
+LIST_ITEM (U"• Manual: documentation of explicit formulas for @@Voice 2. Jitter|jitter measurements at .")
+NORMAL (U"##5.2.15# (11 February 2011)")
+LIST_ITEM (U"• @@Sounds: Concatenate with overlap... at .")
+NORMAL (U"##5.2.14# (8 February 2011)")
+LIST_ITEM (U"• Repaired crashing bug in Manipulation window introduced in 5.2.13.")
+NORMAL (U"##5.2.13# (7 February 2011)")
+LIST_ITEM (U"• Renamed #Write commands to #Save commands.")
+LIST_ITEM (U"• Scripting: allow pause forms without #Stop button (see @@Scripting 6.6. Controlling the user@).")
+LIST_ITEM (U"• GTK: correct behaviour of default buttons.")
+NORMAL (U"##5.2.12# (28 January 2011)")
+LIST_ITEM (U"• Renamed #Edit buttons to ##View & Edit#.")
+LIST_ITEM (U"• Better visibility of dragged things on Linux.")
+NORMAL (U"##5.2.11# (18 January 2011)")
+LIST_ITEM (U"• Better visibility of dragged things (sound selection, tier points, TextGrid boundaries) on Windows and Linux.")
+NORMAL (U"##5.2.10# (11 January 2011)")
+LIST_ITEM (U"• Renamed #Read and #Write menus to #Open and #Save.")
+LIST_ITEM (U"• Sound: use of ##Formula (part)...# can speed up formulas appreciably.")
+NORMAL (U"##5.2.09# (9 January 2011)")
+LIST_ITEM (U"• Much improved scripting tutorial.")
+LIST_ITEM (U"• Listening experiments can now show pictures instead of just texts (on the Mac).")
+LIST_ITEM (U"• EPS files can now be many miles wide instead of just 55 inches.")
+NORMAL (U"##5.2.08# (1 January 2011)")
+LIST_ITEM (U"• Improved manual.")
+LIST_ITEM (U"• Improved memory allocation on 32-bit platforms: "
 	"less probability of crashes when you approach the 2 GB memory limit gradually, and a new \"low on memory; save your work now\" warning.")
-LIST_ITEM (L"• Removed IntervalTier and TextTier datatypes from Praat (old scripts that use them will continue to work).")
-NORMAL (L"##5.2.07# (24 December 2010)")
-LIST_ITEM (L"• Support for reading and writing multi-channel sound files (i.e. above two-channel stereo).")
-NORMAL (L"##5.2.06# (18 December 2010)")
-LIST_ITEM (L"• Picture window: a new (the fourth) line type, namely dashed-dotted.")
-LIST_ITEM (L"• Support for analysing and drawing multi-channel sounds (i.e. above two-channel stereo).")
-LIST_ITEM (L"• Can read some EEG files (BioSemi 24-bit BDF) as a Sound and a TextGrid object.")
-LIST_ITEM (L"• Linux: compatibility with computers without English language support.")
-LIST_ITEM (L"• Macintosh: support for high-plane (i.e. very uncommon) Unicode characters in file names (as already existed on Unix and Windows).")
-NORMAL (L"##5.2.05# (4 December 2010)")
-LIST_ITEM (L"• Regular expressions: better Unicode support.")
-LIST_ITEM (L"• Scripting window: command ##Convert to C string#.")
-NORMAL (L"##5.2.04# (27 November 2010)")
-LIST_ITEM (L"• Scripting: allow directory (folder) selector windows; see @@Scripting 6.6. Controlling the user at .")
-NORMAL (L"##5.2.03# (19 November 2010)")
-LIST_ITEM (L"• Scripting: support for string arrays.")
-NORMAL (L"##5.2.02# (17 November 2010)")
-LIST_ITEM (L"• TextGrid window: corrected a bug that caused Praat to crash (instead of doing nothing) when you tried to add boundaries "
+LIST_ITEM (U"• Removed IntervalTier and TextTier datatypes from Praat (old scripts that use them will continue to work).")
+NORMAL (U"##5.2.07# (24 December 2010)")
+LIST_ITEM (U"• Support for reading and writing multi-channel sound files (i.e. above two-channel stereo).")
+NORMAL (U"##5.2.06# (18 December 2010)")
+LIST_ITEM (U"• Picture window: a new (the fourth) line type, namely dashed-dotted.")
+LIST_ITEM (U"• Support for analysing and drawing multi-channel sounds (i.e. above two-channel stereo).")
+LIST_ITEM (U"• Can read some EEG files (BioSemi 24-bit BDF) as a Sound and a TextGrid object.")
+LIST_ITEM (U"• Linux: compatibility with computers without English language support.")
+LIST_ITEM (U"• Macintosh: support for high-plane (i.e. very uncommon) Unicode characters in file names (as already existed on Unix and Windows).")
+NORMAL (U"##5.2.05# (4 December 2010)")
+LIST_ITEM (U"• Regular expressions: better Unicode support.")
+LIST_ITEM (U"• Scripting window: command ##Convert to C string#.")
+NORMAL (U"##5.2.04# (27 November 2010)")
+LIST_ITEM (U"• Scripting: allow directory (folder) selector windows; see @@Scripting 6.6. Controlling the user at .")
+NORMAL (U"##5.2.03# (19 November 2010)")
+LIST_ITEM (U"• Scripting: support for string arrays.")
+NORMAL (U"##5.2.02# (17 November 2010)")
+LIST_ITEM (U"• TextGrid window: corrected a bug that caused Praat to crash (instead of doing nothing) when you tried to add boundaries "
 	"if the selection ran from the penultimate interval to the end of the TextGrid.")
-LIST_ITEM (L"• Scripting: support for arrays with multiple indexes.")
-LIST_ITEM (L"• Linux: made spectrogram drawing compatible with Ubuntu 10.10.")
-LIST_ITEM (L"• Linux: made sound more easily available on Ubuntu 10.10.")
-NORMAL (L"##5.2.01# (4 November 2010)")
-LIST_ITEM (L"• Scripting: support for numeric @@Scripting 5.6. Arrays|arrays at .")
-MAN_END
-
-MAN_BEGIN (L"What was new in 5.2?", L"ppgb", 20101029)
-NORMAL (L"##5.2# (29 October 2010)")
-NORMAL (L"##5.1.45# (26 October 2010)")
-LIST_ITEM (L"• Linux/GTK: allow Praat to run without an X display.")
-LIST_ITEM (L"• Sounds are played synchronously in scripts run from ManPages with \\bsSC.")
-NORMAL (L"##5.1.44# (4 October 2010)")
-LIST_ITEM (L"• Linux/GTK: visibility of ExperimentMFC window.")
-LIST_ITEM (L"• Linux/GTK: keyboard shortcuts.")
-NORMAL (L"##5.1.43# (4 August 2010)")
-LIST_ITEM (L"• Scripting: support for stand-alone programs; see @@Scripting 9.1. Turning a script into a stand-alone program at .")
-LIST_ITEM (L"• Table: allow drawing of ellipses even if irrelevant columns contain undefined data.")
-LIST_ITEM (L"• Linux/GTK: correct resizing of Table window.")
-LIST_ITEM (L"• Linux/GTK: prevented multiple storing of Picture window selection in scripting history.")
-NORMAL (L"##5.1.42# (26 July 2010)")
-LIST_ITEM (L"• Scripting: allow file selector windows; see @@Scripting 6.6. Controlling the user at .")
-LIST_ITEM (L"• Linux: multiple file selection.")
-NORMAL (L"##5.1.41# (15 July 2010)")
-LIST_ITEM (L"• OTGrammar: ##Compare candidates...#")
-LIST_ITEM (L"• GTK: support for the Doulos SIL and Charis SIL fonts.")
-LIST_ITEM (L"• GTK: working vowel editor.")
-LIST_ITEM (L"• Vowel editor: repaired memory leak.")
-//LIST_ITEM (L"• GTK: Picture window: front when drawing.")
-//LIST_ITEM (L"• GTK: correct scrolling in manuals.")
-NORMAL (L"##5.1.40# (13 July 2010)")
-LIST_ITEM (L"• GTK: working Demo window (drawing, clicks, keys).")
-LIST_ITEM (L"• GTK: pause forms.")
-LIST_ITEM (L"• GTK: manual pages: receive a white background, for compatibility with dark-background themes.")
-LIST_ITEM (L"• GTK: in settings windows, better alignment of labels to radio groups.")
-LIST_ITEM (L"• GTK: rotated text.")
-NORMAL (L"##5.1.39# (10 July 2010)")
-LIST_ITEM (L"• GTK beta version.")
-LIST_ITEM (L"• Linux: made ##Sound: Record fixed time...# work correctly (the sampling frequency was wrong).")
-LIST_ITEM (L"• GTK: list of objects: multiple selection, working Rename button.")
-LIST_ITEM (L"• GTK: running a script no longer deselects all objects at the start.")
-LIST_ITEM (L"• GTK: working Buttons editor.")
-LIST_ITEM (L"• GTK: correctly laid out settings windows.")
-NORMAL (L"##5.1.38# (2 July 2010)")
-LIST_ITEM (L"• Linux: made ##Sound: Record fixed time...# work correctly (the sampling frequency was wrong).")
-LIST_ITEM (L"• Mac: repaired a bug introduced in 5.1.35 that could cause Praat to crash if neither Doulos SIL nor Charis SIL were installed.")
-LIST_ITEM (L"• Mac: correct live scrolling in Picture window and DataEditor.")
-NORMAL (L"##5.1.37# (23 June 2010)")
-LIST_ITEM (L"• PitchTier window and similar windows: can drag multiple points simultaneously.")
-LIST_ITEM (L"• Table: %t-tests report the number of degrees of freedom.")
-LIST_ITEM (L"• GTK: correct progress bar again.")
-LIST_ITEM (L"• GTK: correct behaviour of Synth menu in manipulation window.")
-NORMAL (L"##5.1.36# (18 June 2010)")
-LIST_ITEM (L"• Mac: live scrolling.")
-LIST_ITEM (L"• Demo window: the Demo window can now run from the command line.")
-LIST_ITEM (L"• Motif: corrected a bug introduced in 5.1.33 whereby things in the Picture window could be placed incorrectly.")
-LIST_ITEM (L"• GTK: script window accepts Unicode again.")
-NORMAL (L"##5.1.35# (10 June 2010)")
-LIST_ITEM (L"• TextGrid window: removed a very old bug that could lead to reversed intervals and to crashes when you inserted a boundary after using Shift-arrow and Command-arrow.")
-LIST_ITEM (L"• Graphics: Praat now uses Doulos SIL instead of Charis SIL if your font setting is \"Times\" and the font is nonbold and nonitalic, "
+LIST_ITEM (U"• Scripting: support for arrays with multiple indexes.")
+LIST_ITEM (U"• Linux: made spectrogram drawing compatible with Ubuntu 10.10.")
+LIST_ITEM (U"• Linux: made sound more easily available on Ubuntu 10.10.")
+NORMAL (U"##5.2.01# (4 November 2010)")
+LIST_ITEM (U"• Scripting: support for numeric @@Scripting 5.6. Arrays|arrays at .")
+MAN_END
+
+MAN_BEGIN (U"What was new in 5.2?", U"ppgb", 20101029)
+NORMAL (U"##5.2# (29 October 2010)")
+NORMAL (U"##5.1.45# (26 October 2010)")
+LIST_ITEM (U"• Linux/GTK: allow Praat to run without an X display.")
+LIST_ITEM (U"• Sounds are played synchronously in scripts run from ManPages with \\bsSC.")
+NORMAL (U"##5.1.44# (4 October 2010)")
+LIST_ITEM (U"• Linux/GTK: visibility of ExperimentMFC window.")
+LIST_ITEM (U"• Linux/GTK: keyboard shortcuts.")
+NORMAL (U"##5.1.43# (4 August 2010)")
+LIST_ITEM (U"• Scripting: support for stand-alone programs; see @@Scripting 9.1. Turning a script into a stand-alone program at .")
+LIST_ITEM (U"• Table: allow drawing of ellipses even if irrelevant columns contain undefined data.")
+LIST_ITEM (U"• Linux/GTK: correct resizing of Table window.")
+LIST_ITEM (U"• Linux/GTK: prevented multiple storing of Picture window selection in scripting history.")
+NORMAL (U"##5.1.42# (26 July 2010)")
+LIST_ITEM (U"• Scripting: allow file selector windows; see @@Scripting 6.6. Controlling the user at .")
+LIST_ITEM (U"• Linux: multiple file selection.")
+NORMAL (U"##5.1.41# (15 July 2010)")
+LIST_ITEM (U"• OTGrammar: ##Compare candidates...#")
+LIST_ITEM (U"• GTK: support for the Doulos SIL and Charis SIL fonts.")
+LIST_ITEM (U"• GTK: working vowel editor.")
+LIST_ITEM (U"• Vowel editor: repaired memory leak.")
+//LIST_ITEM (U"• GTK: Picture window: front when drawing.")
+//LIST_ITEM (U"• GTK: correct scrolling in manuals.")
+NORMAL (U"##5.1.40# (13 July 2010)")
+LIST_ITEM (U"• GTK: working Demo window (drawing, clicks, keys).")
+LIST_ITEM (U"• GTK: pause forms.")
+LIST_ITEM (U"• GTK: manual pages: receive a white background, for compatibility with dark-background themes.")
+LIST_ITEM (U"• GTK: in settings windows, better alignment of labels to radio groups.")
+LIST_ITEM (U"• GTK: rotated text.")
+NORMAL (U"##5.1.39# (10 July 2010)")
+LIST_ITEM (U"• GTK beta version.")
+LIST_ITEM (U"• Linux: made ##Sound: Record fixed time...# work correctly (the sampling frequency was wrong).")
+LIST_ITEM (U"• GTK: list of objects: multiple selection, working Rename button.")
+LIST_ITEM (U"• GTK: running a script no longer deselects all objects at the start.")
+LIST_ITEM (U"• GTK: working Buttons editor.")
+LIST_ITEM (U"• GTK: correctly laid out settings windows.")
+NORMAL (U"##5.1.38# (2 July 2010)")
+LIST_ITEM (U"• Linux: made ##Sound: Record fixed time...# work correctly (the sampling frequency was wrong).")
+LIST_ITEM (U"• Mac: repaired a bug introduced in 5.1.35 that could cause Praat to crash if neither Doulos SIL nor Charis SIL were installed.")
+LIST_ITEM (U"• Mac: correct live scrolling in Picture window and DataEditor.")
+NORMAL (U"##5.1.37# (23 June 2010)")
+LIST_ITEM (U"• PitchTier window and similar windows: can drag multiple points simultaneously.")
+LIST_ITEM (U"• Table: %t-tests report the number of degrees of freedom.")
+LIST_ITEM (U"• GTK: correct progress bar again.")
+LIST_ITEM (U"• GTK: correct behaviour of Synth menu in manipulation window.")
+NORMAL (U"##5.1.36# (18 June 2010)")
+LIST_ITEM (U"• Mac: live scrolling.")
+LIST_ITEM (U"• Demo window: the Demo window can now run from the command line.")
+LIST_ITEM (U"• Motif: corrected a bug introduced in 5.1.33 whereby things in the Picture window could be placed incorrectly.")
+LIST_ITEM (U"• GTK: script window accepts Unicode again.")
+NORMAL (U"##5.1.35# (10 June 2010)")
+LIST_ITEM (U"• TextGrid window: removed a very old bug that could lead to reversed intervals and to crashes when you inserted a boundary after using Shift-arrow and Command-arrow.")
+LIST_ITEM (U"• Graphics: Praat now uses Doulos SIL instead of Charis SIL if your font setting is \"Times\" and the font is nonbold and nonitalic, "
 	"because Doulos SIL matches Times New Roman better.")
-LIST_ITEM (L"• kNN: made Ola Söder's k-nearest-neighbours classification compatible with Windows.")
-NORMAL (L"##5.1.34# (31 May 2010)")
-LIST_ITEM (L"• Sound window: corrected a bug that caused Praat to crash if the analysis window was shorter than 2 samples.")
-LIST_ITEM (L"• GTK: scrolling in the Info window and script window.")
-LIST_ITEM (L"• GTK: script editor: implemented searching, replacing, and change dialogs.")
-NORMAL (L"##5.1.33# (24 May 2010)")
-LIST_ITEM (L"• GTK alpha version.")
-LIST_ITEM (L"• Abolished resolution independence: the Sound window now looks the same on all platforms, "
+LIST_ITEM (U"• kNN: made Ola Söder's k-nearest-neighbours classification compatible with Windows.")
+NORMAL (U"##5.1.34# (31 May 2010)")
+LIST_ITEM (U"• Sound window: corrected a bug that caused Praat to crash if the analysis window was shorter than 2 samples.")
+LIST_ITEM (U"• GTK: scrolling in the Info window and script window.")
+LIST_ITEM (U"• GTK: script editor: implemented searching, replacing, and change dialogs.")
+NORMAL (U"##5.1.33# (24 May 2010)")
+LIST_ITEM (U"• GTK alpha version.")
+LIST_ITEM (U"• Abolished resolution independence: the Sound window now looks the same on all platforms, "
 	"and the Demo window has the same relative font size on your screen and on the video projector.")
-LIST_ITEM (L"• GTK: support for asynchronous audio output.")
-LIST_ITEM (L"• GTK: sound plays once rather than three times in Sound and other windows.")
-LIST_ITEM (L"• GTK: can click more than once in the manual.")
-LIST_ITEM (L"• GTK: correct pink selections in Sound and other windows.")
-LIST_ITEM (L"• GTK: correct dragging in TextGrid, Manipulation, and tier windows.")
-LIST_ITEM (L"• GTK: a working TextGrid window.")
-LIST_ITEM (L"• GTK: no automatic triple click in the manual (and many other windows).")
-LIST_ITEM (L"• GTK: moving cursor while sound is playing in Sound and other windows.")
-LIST_ITEM (L"• GTK: correct colours of the rectangles in Sound and other windows.")
-LIST_ITEM (L"• GTK: a working Group button.")
-LIST_ITEM (L"• GTK: correct font menus, font size menus, colour menus, line type menus.")
-LIST_ITEM (L"• GTK: scrolling in the manual (and many other windows).")
-LIST_ITEM (L"• GTK: erase old texts in manual windows.")
-LIST_ITEM (L"• GTK: made Picture window come back when drawing.")
-LIST_ITEM (L"• GTK: Info window is fronted automatically.")
-LIST_ITEM (L"• GTK: support sendpraat.")
-NORMAL (L"##5.1.32# (30 April 2010)")
-LIST_ITEM (L"• Scripting: command ##Expand include files#.")
-LIST_ITEM (L"• Scripting: accept lines that start with non-breaking spaces (as may occur in scripts copied from the web manual).")
-LIST_ITEM (L"• Sound files: accept MP3 files with extension written in capitals.")
-LIST_ITEM (L"• Linux audio recording: corrected input choice (microphone, line).")
-NORMAL (L"##5.1.31# (4 April 2010)")
-LIST_ITEM (L"• @@Sounds: Convolve...@, @@Sounds: Cross-correlate...@, @@Sound: Autocorrelate...@, with full documentation.")
-LIST_ITEM (L"• More query commands for IntensityTier.")
-NORMAL (L"##5.1.30# (25 March 2010)")
-LIST_ITEM (L"• Scripting: $$createDirectory ()$ can now work with absolute paths.")
-LIST_ITEM (L"• PointProcess: made it impossible to add a point where there is already a point.")
-NORMAL (L"##5.1.29# (11 March 2010)")
-LIST_ITEM (L"• Full support for unicode values above 0xFFFF on Macintosh.")
-NORMAL (L"##5.1.28# (10 March 2010)")
-LIST_ITEM (L"• TextGrid window: removed a recently introduced bug that could cause Praat to crash when inserting a boundary.")
-NORMAL (L"##5.1.27# (7 March 2010)")
-LIST_ITEM (L"• Table: Wilcoxon rank sum test.")
-LIST_ITEM (L"• Logistic regression: corrected a bug by which a boundary would sometimes not be drawn.")
-NORMAL (L"##5.1.26# (25 February 2010)")
-LIST_ITEM (L"• Experimental GTK version with the help of Franz Brauße.")
-LIST_ITEM (L"• Corrected a bug that could cause Praat to crash if sound playing failed twice.")
-NORMAL (L"##5.1.25# (20 January 2010)")
-LIST_ITEM (L"• Script window: the new command ##Reopen from disk# allows you to edit the script with an external editor.")
-LIST_ITEM (L"• Script window: removed a bug that could cause Praat to crash of you did ##Find again# before having done any #Find.")
-NORMAL (L"##5.1.24# (15 January 2010)")
-LIST_ITEM (L"• Formulas run 10 to 20 percent faster.")
-LIST_ITEM (L"• Macintosh: support for forward delete key and Command-`.")
-NORMAL (L"##5.1.23# (1 January 2010)")
-LIST_ITEM (L"• Allowed multiple files to be selected with e.g. @@Read from file... at .")
-LIST_ITEM (L"• Demo window: guarded against handling the Demo window from two scripts at a time.")
-NORMAL (L"##5.1.22# (15 December 2009)")
-LIST_ITEM (L"• Picture window: millions of @@colour|colours@ instead of just twelve.")
-LIST_ITEM (L"• Sound window: ##Move frequency cursor to...#")
-NORMAL (L"##5.1.21# (30 November 2009)")
-LIST_ITEM (L"• @@Sound: Draw where...@")
-LIST_ITEM (L"• ##Matrix: Draw contours...# and ##LogisticRegression: Draw boundary...# support reversed axes.")
-LIST_ITEM (L"• Sound window: ##Move frequency cursor to...#.")
-NORMAL (L"##5.1.20# (26 October 2009)")
-LIST_ITEM (L"• Editor windows: repaired the Synchronized Zoom And Scroll preference.")
-NORMAL (L"##5.1.19# (21 October 2009)")
-LIST_ITEM (L"• Table: Randomize rows")
-LIST_ITEM (L"• Tables: Append (vertically)")
-LIST_ITEM (L"• Scripting: corrected a bug that could cause Praat to crash if the name of a field in a form contained a colon.")
-LIST_ITEM (L"• Windows: corrected arc drawing.")
-NORMAL (L"##5.1.18# (9 October 2009)")
-LIST_ITEM (L"• The @@Demo window@ is less often automatically moved to the front "
+LIST_ITEM (U"• GTK: support for asynchronous audio output.")
+LIST_ITEM (U"• GTK: sound plays once rather than three times in Sound and other windows.")
+LIST_ITEM (U"• GTK: can click more than once in the manual.")
+LIST_ITEM (U"• GTK: correct pink selections in Sound and other windows.")
+LIST_ITEM (U"• GTK: correct dragging in TextGrid, Manipulation, and tier windows.")
+LIST_ITEM (U"• GTK: a working TextGrid window.")
+LIST_ITEM (U"• GTK: no automatic triple click in the manual (and many other windows).")
+LIST_ITEM (U"• GTK: moving cursor while sound is playing in Sound and other windows.")
+LIST_ITEM (U"• GTK: correct colours of the rectangles in Sound and other windows.")
+LIST_ITEM (U"• GTK: a working Group button.")
+LIST_ITEM (U"• GTK: correct font menus, font size menus, colour menus, line type menus.")
+LIST_ITEM (U"• GTK: scrolling in the manual (and many other windows).")
+LIST_ITEM (U"• GTK: erase old texts in manual windows.")
+LIST_ITEM (U"• GTK: made Picture window come back when drawing.")
+LIST_ITEM (U"• GTK: Info window is fronted automatically.")
+LIST_ITEM (U"• GTK: support sendpraat.")
+NORMAL (U"##5.1.32# (30 April 2010)")
+LIST_ITEM (U"• Scripting: command ##Expand include files#.")
+LIST_ITEM (U"• Scripting: accept lines that start with non-breaking spaces (as may occur in scripts copied from the web manual).")
+LIST_ITEM (U"• Sound files: accept MP3 files with extension written in capitals.")
+LIST_ITEM (U"• Linux audio recording: corrected input choice (microphone, line).")
+NORMAL (U"##5.1.31# (4 April 2010)")
+LIST_ITEM (U"• @@Sounds: Convolve...@, @@Sounds: Cross-correlate...@, @@Sound: Autocorrelate...@, with full documentation.")
+LIST_ITEM (U"• More query commands for IntensityTier.")
+NORMAL (U"##5.1.30# (25 March 2010)")
+LIST_ITEM (U"• Scripting: $$createDirectory ()$ can now work with absolute paths.")
+LIST_ITEM (U"• PointProcess: made it impossible to add a point where there is already a point.")
+NORMAL (U"##5.1.29# (11 March 2010)")
+LIST_ITEM (U"• Full support for unicode values above 0xFFFF on Macintosh.")
+NORMAL (U"##5.1.28# (10 March 2010)")
+LIST_ITEM (U"• TextGrid window: removed a recently introduced bug that could cause Praat to crash when inserting a boundary.")
+NORMAL (U"##5.1.27# (7 March 2010)")
+LIST_ITEM (U"• Table: Wilcoxon rank sum test.")
+LIST_ITEM (U"• Logistic regression: corrected a bug by which a boundary would sometimes not be drawn.")
+NORMAL (U"##5.1.26# (25 February 2010)")
+LIST_ITEM (U"• Experimental GTK version with the help of Franz Brauße.")
+LIST_ITEM (U"• Corrected a bug that could cause Praat to crash if sound playing failed twice.")
+NORMAL (U"##5.1.25# (20 January 2010)")
+LIST_ITEM (U"• Script window: the new command ##Reopen from disk# allows you to edit the script with an external editor.")
+LIST_ITEM (U"• Script window: removed a bug that could cause Praat to crash of you did ##Find again# before having done any #Find.")
+NORMAL (U"##5.1.24# (15 January 2010)")
+LIST_ITEM (U"• Formulas run 10 to 20 percent faster.")
+LIST_ITEM (U"• Macintosh: support for forward delete key and Command-`.")
+NORMAL (U"##5.1.23# (1 January 2010)")
+LIST_ITEM (U"• Allowed multiple files to be selected with e.g. @@Read from file... at .")
+LIST_ITEM (U"• Demo window: guarded against handling the Demo window from two scripts at a time.")
+NORMAL (U"##5.1.22# (15 December 2009)")
+LIST_ITEM (U"• Picture window: millions of @@colour|colours@ instead of just twelve.")
+LIST_ITEM (U"• Sound window: ##Move frequency cursor to...#")
+NORMAL (U"##5.1.21# (30 November 2009)")
+LIST_ITEM (U"• @@Sound: Draw where...@")
+LIST_ITEM (U"• ##Matrix: Draw contours...# and ##LogisticRegression: Draw boundary...# support reversed axes.")
+LIST_ITEM (U"• Sound window: ##Move frequency cursor to...#.")
+NORMAL (U"##5.1.20# (26 October 2009)")
+LIST_ITEM (U"• Editor windows: repaired the Synchronized Zoom And Scroll preference.")
+NORMAL (U"##5.1.19# (21 October 2009)")
+LIST_ITEM (U"• Table: Randomize rows")
+LIST_ITEM (U"• Tables: Append (vertically)")
+LIST_ITEM (U"• Scripting: corrected a bug that could cause Praat to crash if the name of a field in a form contained a colon.")
+LIST_ITEM (U"• Windows: corrected arc drawing.")
+NORMAL (U"##5.1.18# (9 October 2009)")
+LIST_ITEM (U"• The @@Demo window@ is less often automatically moved to the front "
 	"(in order to allow it to pop up other editor windows).")
-LIST_ITEM (L"• @@DTW & TextGrid: To TextGrid (warp times)@: corrected a bug that could "
+LIST_ITEM (U"• @@DTW & TextGrid: To TextGrid (warp times)@: corrected a bug that could "
 	"lead to an incorrect end time of the last interval in new IntervalTiers.")
-NORMAL (L"##5.1.17# (22 September 2009)")
-LIST_ITEM (L"• Made more stereo movies readable.")
-LIST_ITEM (L"• Editor windows now have a ##Zoom Back# button.")
-NORMAL (L"##5.1.16# (17 September 2009)")
-LIST_ITEM (L"• Macintosh: corrected a bug that caused incorrect phonetic symbols if Charis SIL was available but SIL Doulos IPA93 was not.")
-NORMAL (L"##5.1.15# (30 August 2009)")
-LIST_ITEM (L"• Corrected a bug in @@Sound: Change gender...@ introduced in 5.1.14.")
-NORMAL (L"##5.1.14# (27 August 2009)")
-LIST_ITEM (L"• Windows: corrected a bug introduced in 5.1.13 that caused Praat to crash during tab navigation.")
-LIST_ITEM (L"• Made @@Sound: Change gender...@ compatible with elephant calls (i.e. very low F0).")
-NORMAL (L"##5.1.13# (21 August 2009)")
-LIST_ITEM (L"• Script window: #Find and #Replace.")
-LIST_ITEM (L"• Picture window (and therefore Demo window!): @@Insert picture from file...@ (MacOS 10.4 and up).")
-LIST_ITEM (L"• @@Demo window@: full screen (on the Mac).")
-LIST_ITEM (L"• Scripting: faster object selection (scripts no longer slow down when there are many objects in the list).")
-LIST_ITEM (L"• Scripting: $$variableExists$.")
-LIST_ITEM (L"• Macintosh: PDF clipboard (MacOS 10.4 and up).")
-NORMAL (L"##5.1.12# (4 August 2009)")
-LIST_ITEM (L"• Macintosh: the Picture window can save to PDF file (you need MacOS 10.4 or up).")
-LIST_ITEM (L"• Macintosh: corrected a bug that caused Praat to crash at start-up on MacOS 10.3.")
-NORMAL (L"##5.1.11# (19 July 2009)")
-NORMAL (L"##5.1.10# (8 July 2009)")
-LIST_ITEM (L"• Corrected a bug that could cause Praat to crash if the Demo window was closed after an \"execute\".")
-LIST_ITEM (L"• OTGrammar & PairDistribution: added ##Get minimum number correct...#.")
-NORMAL (L"##5.1.09# (28 June 2009)")
-LIST_ITEM (L"• Made East-European Roman characters available in EPS files.")
-NORMAL (L"##5.1.08# (21 June 2009)")
-LIST_ITEM (L"• Removed a bug introduced in 5.1.07 that could cause strange pictures in manual.")
-LIST_ITEM (L"• Macintosh: execute @sendpraat messages immediately instead of waiting for the user to click the jumping Praat icon.")
-NORMAL (L"##5.1.07# (12 May 2009)")
-LIST_ITEM (L"• Demo window: navigation by arrow keys also on Windows.")
-LIST_ITEM (L"• Demo window: no longer crashes on Linux.")
-NORMAL (L"##5.1.06# (11 May 2009)")
-LIST_ITEM (L"• Demo window.")
-NORMAL (L"##5.1.05# (7 May 2009)")
-LIST_ITEM (L"• KlattGrid update.")
-NORMAL (L"##5.1.04# (4 April 2009)")
-LIST_ITEM (L"• Corrected a bug that could cause a missing text character in EPS files produced by a version of Praat running in batch.")
-LIST_ITEM (L"• Corrected a bug that could cause high values in a Matrix computed from a Pitch.")
-NORMAL (L"##5.1.03# (21 March 2009)")
-//LIST_ITEM (L"• OT learning: the \"Random up, highest down\" update rule.")
-LIST_ITEM (L"• ExperimentMFC: corrected a bug introduced in 5.0.36 that caused Praat to crash if a sound file did not exist.")
-LIST_ITEM (L"• Articulatory synthesis: corrected a bug that could cause Praat to crash when copying Artwords.")
-LIST_ITEM (L"• Macintosh: corrected a bug that could cause poor text alignment in picture.")
-NORMAL (L"##5.1.02# (9 March 2009)")
-LIST_ITEM (L"• Allow pause forms without fields.")
-LIST_ITEM (L"• The value \"undefined\" is disallowed from all fields in command windows "
+NORMAL (U"##5.1.17# (22 September 2009)")
+LIST_ITEM (U"• Made more stereo movies readable.")
+LIST_ITEM (U"• Editor windows now have a ##Zoom Back# button.")
+NORMAL (U"##5.1.16# (17 September 2009)")
+LIST_ITEM (U"• Macintosh: corrected a bug that caused incorrect phonetic symbols if Charis SIL was available but SIL Doulos IPA93 was not.")
+NORMAL (U"##5.1.15# (30 August 2009)")
+LIST_ITEM (U"• Corrected a bug in @@Sound: Change gender...@ introduced in 5.1.14.")
+NORMAL (U"##5.1.14# (27 August 2009)")
+LIST_ITEM (U"• Windows: corrected a bug introduced in 5.1.13 that caused Praat to crash during tab navigation.")
+LIST_ITEM (U"• Made @@Sound: Change gender...@ compatible with elephant calls (i.e. very low F0).")
+NORMAL (U"##5.1.13# (21 August 2009)")
+LIST_ITEM (U"• Script window: #Find and #Replace.")
+LIST_ITEM (U"• Picture window (and therefore Demo window!): @@Insert picture from file...@ (MacOS 10.4 and up).")
+LIST_ITEM (U"• @@Demo window@: full screen (on the Mac).")
+LIST_ITEM (U"• Scripting: faster object selection (scripts no longer slow down when there are many objects in the list).")
+LIST_ITEM (U"• Scripting: $$variableExists$.")
+LIST_ITEM (U"• Macintosh: PDF clipboard (MacOS 10.4 and up).")
+NORMAL (U"##5.1.12# (4 August 2009)")
+LIST_ITEM (U"• Macintosh: the Picture window can save to PDF file (you need MacOS 10.4 or up).")
+LIST_ITEM (U"• Macintosh: corrected a bug that caused Praat to crash at start-up on MacOS 10.3.")
+NORMAL (U"##5.1.11# (19 July 2009)")
+NORMAL (U"##5.1.10# (8 July 2009)")
+LIST_ITEM (U"• Corrected a bug that could cause Praat to crash if the Demo window was closed after an \"execute\".")
+LIST_ITEM (U"• OTGrammar & PairDistribution: added ##Get minimum number correct...#.")
+NORMAL (U"##5.1.09# (28 June 2009)")
+LIST_ITEM (U"• Made East-European Roman characters available in EPS files.")
+NORMAL (U"##5.1.08# (21 June 2009)")
+LIST_ITEM (U"• Removed a bug introduced in 5.1.07 that could cause strange pictures in manual.")
+LIST_ITEM (U"• Macintosh: execute @sendpraat messages immediately instead of waiting for the user to click the jumping Praat icon.")
+NORMAL (U"##5.1.07# (12 May 2009)")
+LIST_ITEM (U"• Demo window: navigation by arrow keys also on Windows.")
+LIST_ITEM (U"• Demo window: no longer crashes on Linux.")
+NORMAL (U"##5.1.06# (11 May 2009)")
+LIST_ITEM (U"• Demo window.")
+NORMAL (U"##5.1.05# (7 May 2009)")
+LIST_ITEM (U"• KlattGrid update.")
+NORMAL (U"##5.1.04# (4 April 2009)")
+LIST_ITEM (U"• Corrected a bug that could cause a missing text character in EPS files produced by a version of Praat running in batch.")
+LIST_ITEM (U"• Corrected a bug that could cause high values in a Matrix computed from a Pitch.")
+NORMAL (U"##5.1.03# (21 March 2009)")
+//LIST_ITEM (U"• OT learning: the \"Random up, highest down\" update rule.")
+LIST_ITEM (U"• ExperimentMFC: corrected a bug introduced in 5.0.36 that caused Praat to crash if a sound file did not exist.")
+LIST_ITEM (U"• Articulatory synthesis: corrected a bug that could cause Praat to crash when copying Artwords.")
+LIST_ITEM (U"• Macintosh: corrected a bug that could cause poor text alignment in picture.")
+NORMAL (U"##5.1.02# (9 March 2009)")
+LIST_ITEM (U"• Allow pause forms without fields.")
+LIST_ITEM (U"• The value \"undefined\" is disallowed from all fields in command windows "
 	"except ##Table: Set numeric value...# and ##TableOfReal: Set value...#.")
-LIST_ITEM (L"• TextGrid: ##List...# and ##Down to Table...#.")
-LIST_ITEM (L"• OT learning: Giorgio Magri's \"Weighted all up, highest down\" update rule.")
-NORMAL (L"##5.1.01# (26 February 2009)")
-LIST_ITEM (L"• Corrected several bugs in Klatt synthesis.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 5.1?", L"ppgb", 20090131)
-NORMAL (L"##5.1# (31 January 2009)")
-LIST_ITEM (L"• Editors for Klatt synthesis.")
-LIST_ITEM (L"• Corrected many bugs.")
-NORMAL (L"##5.0.47# (21 January 2009)")
-LIST_ITEM (L"• Extensive pause windows: @@Scripting 6.6. Controlling the user at .")
-NORMAL (L"##5.0.46# (7 January 2009)")
-LIST_ITEM (L"• More Klatt synthesizer.")
-LIST_ITEM (L"• First pause form support.")
-LIST_ITEM (L"• Renewed CategoriesEditor.")
-LIST_ITEM (L"• Repaired several memory leaks.")
-NORMAL (L"##5.0.45# (29 December 2008)")
-LIST_ITEM (L"• Bug fixes in Klatt synthesizer.")
-NORMAL (L"##5.0.44# (24 December 2008)")
-LIST_ITEM (L"• David's Klatt synthesizer: @KlattGrid.")
-NORMAL (L"##5.0.43# (9 December 2008)")
-LIST_ITEM (L"• Scripting tutorial: local variables in procedures.")
-NORMAL (L"##5.0.42# (26 November 2008)")
-LIST_ITEM (L"• Removed a bug that could cause Praat to crash when drawing pictures in the manual window.")
-LIST_ITEM (L"• Removed a bug that could cause Praat to crash when drawing multi-line text.")
-NORMAL (L"##5.0.41# (23 November 2008)")
-LIST_ITEM (L"• ExperimentMFC: allow multiple lines in all texts.")
-LIST_ITEM (L"• Regular expressions: removed a bug that could cause Praat to hang when using \".*\".")
-LIST_ITEM (L"• Table: Draw ellipses: removed a bug that could cause Praat to crash if some cells were undefined.")
-NORMAL (L"##5.0.40# (10 November 2008)")
-LIST_ITEM (L"• Improved reading and writing of text files (faster, bigger).")
-NORMAL (L"##5.0.39# (1 November 2008)")
-LIST_ITEM (L"• praatcon -a (for sending ANSI encoding when redirected)")
-NORMAL (L"##5.0.38# (28 October 2008)")
-LIST_ITEM (L"• @FormantGrid: To Formant...")
-NORMAL (L"##5.0.36# (20 October 2008)")
-LIST_ITEM (L"• @ExperimentMFC: accepts nonstandard sound files.")
-NORMAL (L"##5.0.35# (5 October 2008)")
-LIST_ITEM (L"• ##Scale times by...# and ##Scale times to...# (Modify menu).")
-NORMAL (L"##5.0.34# (22 September 2008)")
-LIST_ITEM (L"• ##Shift times by...# and ##Shift times to...# (Modify menu).")
-LIST_ITEM (L"• Sound: @@Combine to stereo@ works even if the two mono sounds have different durations or time domains.")
-NORMAL (L"##5.0.33# (9 September 2008)")
-LIST_ITEM (L"• Windows: prevented warning messages about \"Widget type\".")
-NORMAL (L"##5.0.32# (12 August 2008)")
-LIST_ITEM (L"• Contributed by Ola Söder: @@kNN classifiers@ and @@k-means clustering at .")
-LIST_ITEM (L"• Made UTF-16-encoded chronological TextGrid files readable.")
-NORMAL (L"##5.0.31# (6 August 2008)")
-LIST_ITEM (L"• Macintosh: corrected a bug introduced in 5.0.30 that caused Praat to crash when you pressed the Tab key "
+LIST_ITEM (U"• TextGrid: ##List...# and ##Down to Table...#.")
+LIST_ITEM (U"• OT learning: Giorgio Magri's \"Weighted all up, highest down\" update rule.")
+NORMAL (U"##5.1.01# (26 February 2009)")
+LIST_ITEM (U"• Corrected several bugs in Klatt synthesis.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 5.1?", U"ppgb", 20090131)
+NORMAL (U"##5.1# (31 January 2009)")
+LIST_ITEM (U"• Editors for Klatt synthesis.")
+LIST_ITEM (U"• Corrected many bugs.")
+NORMAL (U"##5.0.47# (21 January 2009)")
+LIST_ITEM (U"• Extensive pause windows: @@Scripting 6.6. Controlling the user at .")
+NORMAL (U"##5.0.46# (7 January 2009)")
+LIST_ITEM (U"• More Klatt synthesizer.")
+LIST_ITEM (U"• First pause form support.")
+LIST_ITEM (U"• Renewed CategoriesEditor.")
+LIST_ITEM (U"• Repaired several memory leaks.")
+NORMAL (U"##5.0.45# (29 December 2008)")
+LIST_ITEM (U"• Bug fixes in Klatt synthesizer.")
+NORMAL (U"##5.0.44# (24 December 2008)")
+LIST_ITEM (U"• David's Klatt synthesizer: @KlattGrid.")
+NORMAL (U"##5.0.43# (9 December 2008)")
+LIST_ITEM (U"• Scripting tutorial: local variables in procedures.")
+NORMAL (U"##5.0.42# (26 November 2008)")
+LIST_ITEM (U"• Removed a bug that could cause Praat to crash when drawing pictures in the manual window.")
+LIST_ITEM (U"• Removed a bug that could cause Praat to crash when drawing multi-line text.")
+NORMAL (U"##5.0.41# (23 November 2008)")
+LIST_ITEM (U"• ExperimentMFC: allow multiple lines in all texts.")
+LIST_ITEM (U"• Regular expressions: removed a bug that could cause Praat to hang when using \".*\".")
+LIST_ITEM (U"• Table: Draw ellipses: removed a bug that could cause Praat to crash if some cells were undefined.")
+NORMAL (U"##5.0.40# (10 November 2008)")
+LIST_ITEM (U"• Improved reading and writing of text files (faster, bigger).")
+NORMAL (U"##5.0.39# (1 November 2008)")
+LIST_ITEM (U"• praatcon -a (for sending ANSI encoding when redirected)")
+NORMAL (U"##5.0.38# (28 October 2008)")
+LIST_ITEM (U"• @FormantGrid: To Formant...")
+NORMAL (U"##5.0.36# (20 October 2008)")
+LIST_ITEM (U"• @ExperimentMFC: accepts nonstandard sound files.")
+NORMAL (U"##5.0.35# (5 October 2008)")
+LIST_ITEM (U"• ##Scale times by...# and ##Scale times to...# (Modify menu).")
+NORMAL (U"##5.0.34# (22 September 2008)")
+LIST_ITEM (U"• ##Shift times by...# and ##Shift times to...# (Modify menu).")
+LIST_ITEM (U"• Sound: @@Combine to stereo@ works even if the two mono sounds have different durations or time domains.")
+NORMAL (U"##5.0.33# (9 September 2008)")
+LIST_ITEM (U"• Windows: prevented warning messages about \"Widget type\".")
+NORMAL (U"##5.0.32# (12 August 2008)")
+LIST_ITEM (U"• Contributed by Ola Söder: @@kNN classifiers@ and @@k-means clustering at .")
+LIST_ITEM (U"• Made UTF-16-encoded chronological TextGrid files readable.")
+NORMAL (U"##5.0.31# (6 August 2008)")
+LIST_ITEM (U"• Macintosh: corrected a bug introduced in 5.0.30 that caused Praat to crash when you pressed the Tab key "
 	"in a window without text fields.")
-NORMAL (L"##5.0.30# (22 July 2008)")
-LIST_ITEM (L"• Macintosh and Windows: tab navigation.")
-NORMAL (L"##5.0.29# (8 July 2008)")
-LIST_ITEM (L"• OTMulti: can record history.")
-LIST_ITEM (L"• Picture window: corrected text in Praat picture files.")
-NORMAL (L"##5.0.28# (3 July 2008)")
-LIST_ITEM (L"• Windows: audio output uses DirectX (next to Multi-Media Extensions).")
-NORMAL (L"##5.0.27# (28 June 2008)")
-LIST_ITEM (L"• @@Phonetic symbols@: breve (a\\N^).")
-LIST_ITEM (L"• Annotation: improved some SpellingChecker commands.")
-LIST_ITEM (L"• Table: can now set string values that contain spaces.")
-NORMAL (L"##5.0.26# (15 June 2008)")
-LIST_ITEM (L"• Windows: sound recording no longer makes your laptop's fan spin.")
-LIST_ITEM (L"• Windows: no longer any 64 MB limit on recorded sounds.")
-LIST_ITEM (L"• Linux: audio input and output uses Alsa (next to OSS).")
-NORMAL (L"##5.0.25# (31 May 2008)")
-LIST_ITEM (L"• OT learning: added decision strategy ExponentialMaximumEntropy.")
-NORMAL (L"##5.0.24# (14 May 2008)")
-LIST_ITEM (L"• Linux: corrected a bug at start-up.")
-NORMAL (L"##5.0.23# (9 May 2008)")
-LIST_ITEM (L"• Corrected a bug that could cause Praat to crash when you edited an Artword that you had read from a file.")
-NORMAL (L"##5.0.22# (26 April 2008)")
-LIST_ITEM (L"• Editing formant contours: @FormantGrid.")
-NORMAL (L"##5.0.21# (22 April 2008)")
-LIST_ITEM (L"• Annotating with Cyrillic, Arabic, Chinese, Korean characters, and many more (on Macintosh and Windows).")
-NORMAL (L"##5.0.20# (8 April 2008)")
-LIST_ITEM (L"• @ExperimentMFC: prevented the OK key from working if no response (and goodness choice) had been made.")
-LIST_ITEM (L"• OT learning: sped up learning from partial outputs by a factor of five or more.")
-NORMAL (L"##5.0.19# (4 April 2008)")
-LIST_ITEM (L"• TextGrid window: corrected a bug introduced in 5.0.17 that could cause Praat to crash when handling point tiers.")
-NORMAL (L"##5.0.18# (31 March 2008)")
-LIST_ITEM (L"• Manipulation window: corrected a bug introduced in 5.0.17 that caused Praat to crash when adding the first duration point.")
-LIST_ITEM (L"• Sound: added ##Extract all channels#.")
-LIST_ITEM (L"• OT learning: added @@OTGrammar & PairDistribution: Find positive weights... at .")
-LIST_ITEM (L"• ExperimentMFC: corrected a bug that caused Praat to crash when the second of multiple experiments "
+NORMAL (U"##5.0.30# (22 July 2008)")
+LIST_ITEM (U"• Macintosh and Windows: tab navigation.")
+NORMAL (U"##5.0.29# (8 July 2008)")
+LIST_ITEM (U"• OTMulti: can record history.")
+LIST_ITEM (U"• Picture window: corrected text in Praat picture files.")
+NORMAL (U"##5.0.28# (3 July 2008)")
+LIST_ITEM (U"• Windows: audio output uses DirectX (next to Multi-Media Extensions).")
+NORMAL (U"##5.0.27# (28 June 2008)")
+LIST_ITEM (U"• @@Phonetic symbols@: breve (a\\N^).")
+LIST_ITEM (U"• Annotation: improved some SpellingChecker commands.")
+LIST_ITEM (U"• Table: can now set string values that contain spaces.")
+NORMAL (U"##5.0.26# (15 June 2008)")
+LIST_ITEM (U"• Windows: sound recording no longer makes your laptop's fan spin.")
+LIST_ITEM (U"• Windows: no longer any 64 MB limit on recorded sounds.")
+LIST_ITEM (U"• Linux: audio input and output uses Alsa (next to OSS).")
+NORMAL (U"##5.0.25# (31 May 2008)")
+LIST_ITEM (U"• OT learning: added decision strategy ExponentialMaximumEntropy.")
+NORMAL (U"##5.0.24# (14 May 2008)")
+LIST_ITEM (U"• Linux: corrected a bug at start-up.")
+NORMAL (U"##5.0.23# (9 May 2008)")
+LIST_ITEM (U"• Corrected a bug that could cause Praat to crash when you edited an Artword that you had read from a file.")
+NORMAL (U"##5.0.22# (26 April 2008)")
+LIST_ITEM (U"• Editing formant contours: @FormantGrid.")
+NORMAL (U"##5.0.21# (22 April 2008)")
+LIST_ITEM (U"• Annotating with Cyrillic, Arabic, Chinese, Korean characters, and many more (on Macintosh and Windows).")
+NORMAL (U"##5.0.20# (8 April 2008)")
+LIST_ITEM (U"• @ExperimentMFC: prevented the OK key from working if no response (and goodness choice) had been made.")
+LIST_ITEM (U"• OT learning: sped up learning from partial outputs by a factor of five or more.")
+NORMAL (U"##5.0.19# (4 April 2008)")
+LIST_ITEM (U"• TextGrid window: corrected a bug introduced in 5.0.17 that could cause Praat to crash when handling point tiers.")
+NORMAL (U"##5.0.18# (31 March 2008)")
+LIST_ITEM (U"• Manipulation window: corrected a bug introduced in 5.0.17 that caused Praat to crash when adding the first duration point.")
+LIST_ITEM (U"• Sound: added ##Extract all channels#.")
+LIST_ITEM (U"• OT learning: added @@OTGrammar & PairDistribution: Find positive weights... at .")
+LIST_ITEM (U"• ExperimentMFC: corrected a bug that caused Praat to crash when the second of multiple experiments "
 	"referred to non-existing sound files.")
-NORMAL (L"##5.0.17# (29 March 2008)")
-LIST_ITEM (L"• Sped up vowel editor by a large factor.")
-LIST_ITEM (L"• OT learning: corrected Exponential HG update rule from OT-GLA to HG-GLA.")
-LIST_ITEM (L"• OT learning: shift Exponential HG average constraint weight to zero after every learning step.")
-NORMAL (L"##5.0.16# (25 March 2008)")
-LIST_ITEM (L"• Macintosh: returned to old compiler because of incompatibility with MacOS X 10.4.")
-NORMAL (L"##5.0.15# (21 March 2008)")
-LIST_ITEM (L"• Windows: more reliable dropping of files on the Praat icon when Praat is already running.")
-NORMAL (L"##5.0.14# (20 March 2008)")
-LIST_ITEM (L"• David's vowel editor (New \\-> Sound).")
-LIST_ITEM (L"• Formulas: corrected scaling of sinc function.")
-NORMAL (L"##5.0.13# (18 March 2008)")
-LIST_ITEM (L"• Corrected drawing of histograms.")
-LIST_ITEM (L"• TextGrid window: selected part of the TextGrid can be extracted and saved.")
-LIST_ITEM (L"• TextGrid: more complete conversion between backslash trigraphs and Unicode.")
-LIST_ITEM (L"• Windows: more reliable dropping of files on the Praat icon when Praat is not running yet.")
-LIST_ITEM (L"• Formulas: sinc function.")
-NORMAL (L"##5.0.12# (12 March 2008)")
-LIST_ITEM (L"• Bigger ligature symbol (k\\lip).")
-NORMAL (L"##5.0.11# (7 March 2008)")
-LIST_ITEM (L"• Corrected saving of new binary Manipulation files (you can send any unreadable Manipulation files to Paul Boersma for correction).")
-NORMAL (L"##5.0.10# (27 February 2008)")
-LIST_ITEM (L"• Added the characters \\d- and \\D-.")
-LIST_ITEM (L"• Windows: made ##praatcon.exe# compatible with Unicode command lines.")
-NORMAL (L"##5.0.09# (16 February 2008)")
-LIST_ITEM (L"• Windows: corrected a bug by which Praat would not open files that were dragged on the Praat icon "
+NORMAL (U"##5.0.17# (29 March 2008)")
+LIST_ITEM (U"• Sped up vowel editor by a large factor.")
+LIST_ITEM (U"• OT learning: corrected Exponential HG update rule from OT-GLA to HG-GLA.")
+LIST_ITEM (U"• OT learning: shift Exponential HG average constraint weight to zero after every learning step.")
+NORMAL (U"##5.0.16# (25 March 2008)")
+LIST_ITEM (U"• Macintosh: returned to old compiler because of incompatibility with MacOS X 10.4.")
+NORMAL (U"##5.0.15# (21 March 2008)")
+LIST_ITEM (U"• Windows: more reliable dropping of files on the Praat icon when Praat is already running.")
+NORMAL (U"##5.0.14# (20 March 2008)")
+LIST_ITEM (U"• David's vowel editor (New \\-> Sound).")
+LIST_ITEM (U"• Formulas: corrected scaling of sinc function.")
+NORMAL (U"##5.0.13# (18 March 2008)")
+LIST_ITEM (U"• Corrected drawing of histograms.")
+LIST_ITEM (U"• TextGrid window: selected part of the TextGrid can be extracted and saved.")
+LIST_ITEM (U"• TextGrid: more complete conversion between backslash trigraphs and Unicode.")
+LIST_ITEM (U"• Windows: more reliable dropping of files on the Praat icon when Praat is not running yet.")
+LIST_ITEM (U"• Formulas: sinc function.")
+NORMAL (U"##5.0.12# (12 March 2008)")
+LIST_ITEM (U"• Bigger ligature symbol (k\\lip).")
+NORMAL (U"##5.0.11# (7 March 2008)")
+LIST_ITEM (U"• Corrected saving of new binary Manipulation files (you can send any unreadable Manipulation files to Paul Boersma for correction).")
+NORMAL (U"##5.0.10# (27 February 2008)")
+LIST_ITEM (U"• Added the characters \\d- and \\D-.")
+LIST_ITEM (U"• Windows: made ##praatcon.exe# compatible with Unicode command lines.")
+NORMAL (U"##5.0.09# (16 February 2008)")
+LIST_ITEM (U"• Windows: corrected a bug by which Praat would not open files that were dragged on the Praat icon "
 	"if the names of these files or their directory paths contained non-ASCII characters.")
-LIST_ITEM (L"• Linux: ignore the Mod2 key, because of its unpredictable assignment.")
-NORMAL (L"##5.0.08# (10 February 2008)")
-LIST_ITEM (L"• Corrected the minus sign (\\bs-m = \"\\-m\").")
-NORMAL (L"##5.0.07# (8 February 2008)")
-LIST_ITEM (L"• Object IDs are visible in editor windows.")
-NORMAL (L"##5.0.06# (31 January 2008)")
-LIST_ITEM (L"• Corrected a bug that caused ##Find again# in the TextGrid window not to work.")
-LIST_ITEM (L"• Macintosh: made Praat work correctly on 10.3 computers with missing fonts.")
-NORMAL (L"##5.0.05# (19 January 2008)")
-LIST_ITEM (L"• All Matrix, Sound, Spectrogram, Pitch, Ltas, and Spectrum objects (and more) are now in 52-bit relative precision (instead of the earlier 23 bits).")
-LIST_ITEM (L"• Corrected a bug that could lead to \"Unknown opcode (0)\" messages when drawing large sounds (more than 16 million samples) in the Picture window.")
-LIST_ITEM (L"• Macintosh: solved around a bug in the C library that could cause incorrect representation of non-ASCII characters (in the OTGrammar window).")
-NORMAL (L"##5.0.04# (12 January 2008)")
-LIST_ITEM (L"• Windows: corrected a bug introduced in 5.0.03 that caused Praat to crash if you pressed a key in the Sound window.")
-LIST_ITEM (L"• Macintosh: some cosmetic corrections.")
-NORMAL (L"##5.0.03# (9 January 2008)")
-LIST_ITEM (L"• Scripting: guard against opening the same file more than once.")
-LIST_ITEM (L"• Table: possibility of regarding a column as a distribution (#Generate menu).")
-LIST_ITEM (L"• Macintosh: corrected line colours.")
-NORMAL (L"##5.0.02# (27 December 2007)")
-LIST_ITEM (L"• TextGrid window: corrected the drawing of numbers to the right of the tiers.")
-LIST_ITEM (L"• Corrected a bug that caused Praat to crash when doing ##SpectrumTier: List#.")
-NORMAL (L"##5.0.01# (18 December 2007)")
-LIST_ITEM (L"• Corrected a bug that could cause Praat to crash when redrawing the sound or TextGrid window.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 5.0?", L"ppgb", 20071210)
-NORMAL (L"##5.0# (10 December 2007)")
-LIST_ITEM (L"• Corrected many bugs.")
-LIST_ITEM (L"• Display font sizes in points rather than pixels.")
-NORMAL (L"##4.6.41# (9 December 2007)")
-LIST_ITEM (L"• Windows: corrected a bug that could cause listening experiments not to run when the directory path included non-ASCII characters; "
+LIST_ITEM (U"• Linux: ignore the Mod2 key, because of its unpredictable assignment.")
+NORMAL (U"##5.0.08# (10 February 2008)")
+LIST_ITEM (U"• Corrected the minus sign (\\bs-m = \"\\-m\").")
+NORMAL (U"##5.0.07# (8 February 2008)")
+LIST_ITEM (U"• Object IDs are visible in editor windows.")
+NORMAL (U"##5.0.06# (31 January 2008)")
+LIST_ITEM (U"• Corrected a bug that caused ##Find again# in the TextGrid window not to work.")
+LIST_ITEM (U"• Macintosh: made Praat work correctly on 10.3 computers with missing fonts.")
+NORMAL (U"##5.0.05# (19 January 2008)")
+LIST_ITEM (U"• All Matrix, Sound, Spectrogram, Pitch, Ltas, and Spectrum objects (and more) are now in 52-bit relative precision (instead of the earlier 23 bits).")
+LIST_ITEM (U"• Corrected a bug that could lead to \"Unknown opcode (0)\" messages when drawing large sounds (more than 16 million samples) in the Picture window.")
+LIST_ITEM (U"• Macintosh: solved around a bug in the C library that could cause incorrect representation of non-ASCII characters (in the OTGrammar window).")
+NORMAL (U"##5.0.04# (12 January 2008)")
+LIST_ITEM (U"• Windows: corrected a bug introduced in 5.0.03 that caused Praat to crash if you pressed a key in the Sound window.")
+LIST_ITEM (U"• Macintosh: some cosmetic corrections.")
+NORMAL (U"##5.0.03# (9 January 2008)")
+LIST_ITEM (U"• Scripting: guard against opening the same file more than once.")
+LIST_ITEM (U"• Table: possibility of regarding a column as a distribution (#Generate menu).")
+LIST_ITEM (U"• Macintosh: corrected line colours.")
+NORMAL (U"##5.0.02# (27 December 2007)")
+LIST_ITEM (U"• TextGrid window: corrected the drawing of numbers to the right of the tiers.")
+LIST_ITEM (U"• Corrected a bug that caused Praat to crash when doing ##SpectrumTier: List#.")
+NORMAL (U"##5.0.01# (18 December 2007)")
+LIST_ITEM (U"• Corrected a bug that could cause Praat to crash when redrawing the sound or TextGrid window.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 5.0?", U"ppgb", 20071210)
+NORMAL (U"##5.0# (10 December 2007)")
+LIST_ITEM (U"• Corrected many bugs.")
+LIST_ITEM (U"• Display font sizes in points rather than pixels.")
+NORMAL (U"##4.6.41# (9 December 2007)")
+LIST_ITEM (U"• Windows: corrected a bug that could cause listening experiments not to run when the directory path included non-ASCII characters; "
 	"the same bug could (under comparable circumstances) cause scripted menu commands not to work.")
-LIST_ITEM (L"• Corrected a bug that could cause null bytes in data files when the text output encoding preference was ##try ISO Latin-1, then UTF-16#.")
-NORMAL (L"##4.6.40# (3 December 2007)")
-LIST_ITEM (L"• Corrected some minor bugs.")
-NORMAL (L"##4.6.39# (1 December 2007)")
-LIST_ITEM (L"• Manual: corrected a bug that could cause Praat to crash when viewing certain manual pages with pictures.")
-LIST_ITEM (L"• Scripting: corrected a bug that could cause Praat to crash when a long string was used as an argument to a procedure.")
-NORMAL (L"##4.6.38# (19 November 2007)")
-LIST_ITEM (L"• More extensive @@logistic regression at .")
-NORMAL (L"##4.6.37# (15 November 2007)")
-LIST_ITEM (L"• Object list shows numbers.")
-LIST_ITEM (L"• Macintosh: corrected saving of non-ASCII text settings.")
-NORMAL (L"##4.6.36# (2 November 2007)")
-LIST_ITEM (L"• Sound and TextGrid windows: direct drawing of intensity, formants, pulses, and TextGrid.")
-LIST_ITEM (L"• Regular expressions: corrected handling of newlines on Windows.")
-LIST_ITEM (L"• Scripting: improved positioning of settings windows for script commands in editors on Windows.")
-NORMAL (L"##4.6.35# (22 October 2007)")
-LIST_ITEM (L"• Windows and Linux: better positioning of form windows of editor scripts.")
-LIST_ITEM (L"• Macintosh: OTMulti learning window more compatible with non-ASCII characters.")
-NORMAL (L"##4.6.34# (18 October 2007)")
-LIST_ITEM (L"• Corrected a bug introduced in September that could cause Praat to crash when starting up "
+LIST_ITEM (U"• Corrected a bug that could cause null bytes in data files when the text output encoding preference was ##try ISO Latin-1, then UTF-16#.")
+NORMAL (U"##4.6.40# (3 December 2007)")
+LIST_ITEM (U"• Corrected some minor bugs.")
+NORMAL (U"##4.6.39# (1 December 2007)")
+LIST_ITEM (U"• Manual: corrected a bug that could cause Praat to crash when viewing certain manual pages with pictures.")
+LIST_ITEM (U"• Scripting: corrected a bug that could cause Praat to crash when a long string was used as an argument to a procedure.")
+NORMAL (U"##4.6.38# (19 November 2007)")
+LIST_ITEM (U"• More extensive @@logistic regression at .")
+NORMAL (U"##4.6.37# (15 November 2007)")
+LIST_ITEM (U"• Object list shows numbers.")
+LIST_ITEM (U"• Macintosh: corrected saving of non-ASCII text settings.")
+NORMAL (U"##4.6.36# (2 November 2007)")
+LIST_ITEM (U"• Sound and TextGrid windows: direct drawing of intensity, formants, pulses, and TextGrid.")
+LIST_ITEM (U"• Regular expressions: corrected handling of newlines on Windows.")
+LIST_ITEM (U"• Scripting: improved positioning of settings windows for script commands in editors on Windows.")
+NORMAL (U"##4.6.35# (22 October 2007)")
+LIST_ITEM (U"• Windows and Linux: better positioning of form windows of editor scripts.")
+LIST_ITEM (U"• Macintosh: OTMulti learning window more compatible with non-ASCII characters.")
+NORMAL (U"##4.6.34# (18 October 2007)")
+LIST_ITEM (U"• Corrected a bug introduced in September that could cause Praat to crash when starting up "
 	"if the user had explicitly made action commands visible or invisible in an earlier session.")
-NORMAL (L"##4.6.33# (16 October 2007)")
-LIST_ITEM (L"• Corrected a bug introduced in September that caused Praat to crash when a PointProcess window was opened without a Sound.")
-LIST_ITEM (L"• Macintosh: objects with non-ASCII names show up correctly in the list.")
-NORMAL (L"##4.6.32# (14 October 2007)")
-LIST_ITEM (L"• Unicode support for names of objects.")
-LIST_ITEM (L"• Linux: first Unicode support (in window titles).")
-LIST_ITEM (L"• Windows scripting: corrected a bug that caused weird characters in Paste History.")
-NORMAL (L"##4.6.31# (8 October 2007)")
-LIST_ITEM (L"• TextGrid window: made Save command available again for TextGrid windows without a sound.")
-LIST_ITEM (L"• Corrected a bug that caused binary Collection files with objects with names with non-ASCII characters to be unreadable.")
-NORMAL (L"##4.6.30# (3 October 2007)")
-LIST_ITEM (L"• OTMulti: added an evaluate command in the Objects window, so that paced learning becomes scriptable.")
-LIST_ITEM (L"• Macintosh: worked around a feature of a system library that could cause Praat to crash when reading a Collection text file "
+NORMAL (U"##4.6.33# (16 October 2007)")
+LIST_ITEM (U"• Corrected a bug introduced in September that caused Praat to crash when a PointProcess window was opened without a Sound.")
+LIST_ITEM (U"• Macintosh: objects with non-ASCII names show up correctly in the list.")
+NORMAL (U"##4.6.32# (14 October 2007)")
+LIST_ITEM (U"• Unicode support for names of objects.")
+LIST_ITEM (U"• Linux: first Unicode support (in window titles).")
+LIST_ITEM (U"• Windows scripting: corrected a bug that caused weird characters in Paste History.")
+NORMAL (U"##4.6.31# (8 October 2007)")
+LIST_ITEM (U"• TextGrid window: made Save command available again for TextGrid windows without a sound.")
+LIST_ITEM (U"• Corrected a bug that caused binary Collection files with objects with names with non-ASCII characters to be unreadable.")
+NORMAL (U"##4.6.30# (3 October 2007)")
+LIST_ITEM (U"• OTMulti: added an evaluate command in the Objects window, so that paced learning becomes scriptable.")
+LIST_ITEM (U"• Macintosh: worked around a feature of a system library that could cause Praat to crash when reading a Collection text file "
 	"that contained objects with non-ASCII names.")
-NORMAL (L"##4.6.29# (1 October 2007)")
-LIST_ITEM (L"• OT learning: leak and constraint in OTMulti.")
-LIST_ITEM (L"• Support for saving Table, TableOfReal, Strings, OTGrammar and OTMulti in Unicode.")
-NORMAL (L"##4.6.28# (1 October 2007)")
-LIST_ITEM (L"• OT learning: positive constraint satisfactions in OTMulti tableaus.")
-LIST_ITEM (L"• Corrected a bug that could cause Praat to crash when reading a non-UTF-8 text file "
+NORMAL (U"##4.6.29# (1 October 2007)")
+LIST_ITEM (U"• OT learning: leak and constraint in OTMulti.")
+LIST_ITEM (U"• Support for saving Table, TableOfReal, Strings, OTGrammar and OTMulti in Unicode.")
+NORMAL (U"##4.6.28# (1 October 2007)")
+LIST_ITEM (U"• OT learning: positive constraint satisfactions in OTMulti tableaus.")
+LIST_ITEM (U"• Corrected a bug that could cause Praat to crash when reading a non-UTF-8 text file "
 	"when the \"Text reading preference\" had been set to UTF-8.")
-NORMAL (L"##4.6.27# (29 September 2007)")
-LIST_ITEM (L"• Corrected redrawing of text with non-ASCII characters.")
-NORMAL (L"##4.6.26# (29 September 2007)")
-LIST_ITEM (L"• Corrected reading of high UTF-8 codes.")
-NORMAL (L"##4.6.25# (26 September 2007)")
-LIST_ITEM (L"• @ExperimentMFC: can set font size for response buttons.")
-NORMAL (L"##4.6.24# (24 September 2007)")
-LIST_ITEM (L"• Czech, Polish, Croatian, and Hungarian characters such as \\c< \\uo \\t< \\e; \\s' \\l/ \\c\' \\o: (see @@Special symbols@).")
-LIST_ITEM (L"• Some support for Hebrew characters such as \\?+ \\B+ \\sU (see @@Special symbols@).")
-NORMAL (L"##4.6.23# (22 September 2007)")
-LIST_ITEM (L"• Corrected a bug introduced in 4.6.13 that caused crashes in text handling (mainly on Linux).")
-LIST_ITEM (L"• Info commands in editors.")
-NORMAL (L"##4.6.22# (17 September 2007)")
-LIST_ITEM (L"• Phonetic symbols: added the nonsyllabicity diacritic (a\\nv).")
-LIST_ITEM (L"• Macintosh: worked around a feature of a system library that could cause strange behaviour of forms in scripts with non-ASCII characters.")
-NORMAL (L"##4.6.21# (5 September 2007)")
-LIST_ITEM (L"• Sound and TextGrid windows: direct drawing of selected sound to the picture window.")
-NORMAL (L"##4.6.20# (2 September 2007)")
-LIST_ITEM (L"• Introduced direct drawing of spectrogram and pitch to the Praat picture window from Sound windows and TextGrid windows.")
-LIST_ITEM (L"• Corrected a bug introduced in 4.6.13 by which Inspect did not show all data in a TextGrid.")
-NORMAL (L"##4.6.19# (31 August 2007)")
-LIST_ITEM (L"• Macintosh: worked around a bug in a system library that caused Praat to crash (since version 4.6.13) "
+NORMAL (U"##4.6.27# (29 September 2007)")
+LIST_ITEM (U"• Corrected redrawing of text with non-ASCII characters.")
+NORMAL (U"##4.6.26# (29 September 2007)")
+LIST_ITEM (U"• Corrected reading of high UTF-8 codes.")
+NORMAL (U"##4.6.25# (26 September 2007)")
+LIST_ITEM (U"• @ExperimentMFC: can set font size for response buttons.")
+NORMAL (U"##4.6.24# (24 September 2007)")
+LIST_ITEM (U"• Czech, Polish, Croatian, and Hungarian characters such as \\c< \\uo \\t< \\e; \\s' \\l/ \\c\' \\o: (see @@Special symbols@).")
+LIST_ITEM (U"• Some support for Hebrew characters such as \\?+ \\B+ \\sU (see @@Special symbols@).")
+NORMAL (U"##4.6.23# (22 September 2007)")
+LIST_ITEM (U"• Corrected a bug introduced in 4.6.13 that caused crashes in text handling (mainly on Linux).")
+LIST_ITEM (U"• Info commands in editors.")
+NORMAL (U"##4.6.22# (17 September 2007)")
+LIST_ITEM (U"• Phonetic symbols: added the nonsyllabicity diacritic (a\\nv).")
+LIST_ITEM (U"• Macintosh: worked around a feature of a system library that could cause strange behaviour of forms in scripts with non-ASCII characters.")
+NORMAL (U"##4.6.21# (5 September 2007)")
+LIST_ITEM (U"• Sound and TextGrid windows: direct drawing of selected sound to the picture window.")
+NORMAL (U"##4.6.20# (2 September 2007)")
+LIST_ITEM (U"• Introduced direct drawing of spectrogram and pitch to the Praat picture window from Sound windows and TextGrid windows.")
+LIST_ITEM (U"• Corrected a bug introduced in 4.6.13 by which Inspect did not show all data in a TextGrid.")
+NORMAL (U"##4.6.19# (31 August 2007)")
+LIST_ITEM (U"• Macintosh: worked around a bug in a system library that caused Praat to crash (since version 4.6.13) "
 	"when removing a boundary from a TextGrid interval in MacOS X 10.3 or earlier.")
-NORMAL (L"##4.6.18# (28 August 2007)")
-LIST_ITEM (L"• Sound: Filter (formula): now works in the same way as the other filter commands "
+NORMAL (U"##4.6.18# (28 August 2007)")
+LIST_ITEM (U"• Sound: Filter (formula): now works in the same way as the other filter commands "
 	"(without adding an empty space at the end), and on stereo sounds.")
-NORMAL (L"##4.6.17# (25 August 2007)")
-LIST_ITEM (L"• Windows: improved rotated text, also for copy-paste and printing.")
-LIST_ITEM (L"• Windows: phonetic characters on the screen now require the Charis SIL or Doulos SIL font.")
-LIST_ITEM (L"• Picture settings report (mainly for script writers).")
-LIST_ITEM (L"• Corrected a bug that could cause Praat to crash when closing a manual page that had been read from a file.")
-NORMAL (L"##4.6.16# (22 August 2007)")
-LIST_ITEM (L"• Macintosh: corrected a bug introduced in 4.6.13 that could cause Praat to crash when drawing a spectrogram in MacOS X 10.3 or earlier.")
-NORMAL (L"##4.6.15# (21 August 2007)")
-LIST_ITEM (L"• Corrected a bug introduced in 4.6.14 that prevented the use of Helvetica in the Picture window.")
-LIST_ITEM (L"• Corrected a bug in \"Read Table from table file...\", introduced in 4.6.13.")
-NORMAL (L"##4.6.14# (20 August 2007)")
-LIST_ITEM (L"• Corrected a bug introduced in 4.6.13 that prevented any other font than Palatino in the Picture window.")
-LIST_ITEM (L"• Macintosh: corrected height of subscripts and superscripts (broken in 4.6.13).")
-NORMAL (L"##4.6.13# (16 August 2007)")
-LIST_ITEM (L"• TextGrid: corrected reading of chronological files.")
-LIST_ITEM (L"• Macintosh: text looks better (and rotated text is now readable on Intel Macs).")
-LIST_ITEM (L"• Macintosh: phonetic characters on the screen now require the Charis SIL or Doulos SIL font.")
-NORMAL (L"##4.6.12# (27 July 2007)")
-LIST_ITEM (L"• OTGrammar bug fix: leak and constraint plasticity correctly written into OTGrammar text files.")
-NORMAL (L"##4.6.11# (25 July 2007)")
-LIST_ITEM (L"• OTGrammar: introduced %%constraint plasticity% for slowing down or halting the speed with which constraints are reranked.")
-LIST_ITEM (L"• OTGrammar: introduced %%leak% for implementing forgetful learning of correlations.")
-LIST_ITEM (L"• OTGrammar: positive constraint satisfactions are drawn as `+' in tableaus.")
-NORMAL (L"##4.6.10# (22 July 2007)")
-LIST_ITEM (L"• Improved reading of UTF-16 data files.")
-LIST_ITEM (L"• Improved error messages when reading text files (line numbers are mentioned).")
-LIST_ITEM (L"• Table: Get group mean (Student t)...")
-NORMAL (L"##4.6.09# (24 June 2007)")
-LIST_ITEM (L"• Corrected a bug introduced in 4.6.07 that caused a crash when reading Collections.")
-LIST_ITEM (L"• Corrected a bug introduced in 4.6.07 that caused incorrect Open buttons in Inspect.")
-LIST_ITEM (L"• How come 4.6.07 introduced those bugs? Because of large changes in the Praat source code as a result of the transition to Unicode.")
-NORMAL (L"##4.6.08# (22 June 2007)")
-LIST_ITEM (L"• Windows: worked around a `feature' of the C library that caused 3-byte line-breaks in the buttons file.")
-LIST_ITEM (L"• Windows: returned to smaller font in script window.")
-LIST_ITEM (L"• OT learning: corrected a bug in PositiveHG.")
-NORMAL (L"##4.6.07# (20 June 2007)")
-LIST_ITEM (L"• Sound files: MP3 as LongSound (implemented by Erez Volk).")
-LIST_ITEM (L"• Scripting: Unicode support for strings and script window (Mac and Windows only).")
-NORMAL (L"##4.6.06# (4 June 2007)")
-LIST_ITEM (L"• Script window: corrected a bug introduced in 4.6.05 that could cause incorrect symbols in saved files.")
-NORMAL (L"##4.6.05# (2 June 2007)")
-LIST_ITEM (L"• Sound files: reading MP3 audio files (implemented by Erez Volk).")
-NORMAL (L"##4.6.04# (29 May 2007)")
-LIST_ITEM (L"• OT learning: added decision strategy PositiveHG.")
-NORMAL (L"##4.6.03# (24 May 2007)")
-LIST_ITEM (L"• Spectral slices have better names.")
-NORMAL (L"##4.6.02# (17 May 2007)")
-LIST_ITEM (L"• Sound files: saving FLAC audio files (implemented by Erez Volk).")
-NORMAL (L"##4.6.01# (16 May 2007)")
-LIST_ITEM (L"• Removed a bug that caused downsampling (and therefore formant measurements) "
+NORMAL (U"##4.6.17# (25 August 2007)")
+LIST_ITEM (U"• Windows: improved rotated text, also for copy-paste and printing.")
+LIST_ITEM (U"• Windows: phonetic characters on the screen now require the Charis SIL or Doulos SIL font.")
+LIST_ITEM (U"• Picture settings report (mainly for script writers).")
+LIST_ITEM (U"• Corrected a bug that could cause Praat to crash when closing a manual page that had been read from a file.")
+NORMAL (U"##4.6.16# (22 August 2007)")
+LIST_ITEM (U"• Macintosh: corrected a bug introduced in 4.6.13 that could cause Praat to crash when drawing a spectrogram in MacOS X 10.3 or earlier.")
+NORMAL (U"##4.6.15# (21 August 2007)")
+LIST_ITEM (U"• Corrected a bug introduced in 4.6.14 that prevented the use of Helvetica in the Picture window.")
+LIST_ITEM (U"• Corrected a bug in \"Read Table from table file...\", introduced in 4.6.13.")
+NORMAL (U"##4.6.14# (20 August 2007)")
+LIST_ITEM (U"• Corrected a bug introduced in 4.6.13 that prevented any other font than Palatino in the Picture window.")
+LIST_ITEM (U"• Macintosh: corrected height of subscripts and superscripts (broken in 4.6.13).")
+NORMAL (U"##4.6.13# (16 August 2007)")
+LIST_ITEM (U"• TextGrid: corrected reading of chronological files.")
+LIST_ITEM (U"• Macintosh: text looks better (and rotated text is now readable on Intel Macs).")
+LIST_ITEM (U"• Macintosh: phonetic characters on the screen now require the Charis SIL or Doulos SIL font.")
+NORMAL (U"##4.6.12# (27 July 2007)")
+LIST_ITEM (U"• OTGrammar bug fix: leak and constraint plasticity correctly written into OTGrammar text files.")
+NORMAL (U"##4.6.11# (25 July 2007)")
+LIST_ITEM (U"• OTGrammar: introduced %%constraint plasticity% for slowing down or halting the speed with which constraints are reranked.")
+LIST_ITEM (U"• OTGrammar: introduced %%leak% for implementing forgetful learning of correlations.")
+LIST_ITEM (U"• OTGrammar: positive constraint satisfactions are drawn as `+' in tableaus.")
+NORMAL (U"##4.6.10# (22 July 2007)")
+LIST_ITEM (U"• Improved reading of UTF-16 data files.")
+LIST_ITEM (U"• Improved error messages when reading text files (line numbers are mentioned).")
+LIST_ITEM (U"• Table: Get group mean (Student t)...")
+NORMAL (U"##4.6.09# (24 June 2007)")
+LIST_ITEM (U"• Corrected a bug introduced in 4.6.07 that caused a crash when reading Collections.")
+LIST_ITEM (U"• Corrected a bug introduced in 4.6.07 that caused incorrect Open buttons in Inspect.")
+LIST_ITEM (U"• How come 4.6.07 introduced those bugs? Because of large changes in the Praat source code as a result of the transition to Unicode.")
+NORMAL (U"##4.6.08# (22 June 2007)")
+LIST_ITEM (U"• Windows: worked around a `feature' of the C library that caused 3-byte line-breaks in the buttons file.")
+LIST_ITEM (U"• Windows: returned to smaller font in script window.")
+LIST_ITEM (U"• OT learning: corrected a bug in PositiveHG.")
+NORMAL (U"##4.6.07# (20 June 2007)")
+LIST_ITEM (U"• Sound files: MP3 as LongSound (implemented by Erez Volk).")
+LIST_ITEM (U"• Scripting: Unicode support for strings and script window (Mac and Windows only).")
+NORMAL (U"##4.6.06# (4 June 2007)")
+LIST_ITEM (U"• Script window: corrected a bug introduced in 4.6.05 that could cause incorrect symbols in saved files.")
+NORMAL (U"##4.6.05# (2 June 2007)")
+LIST_ITEM (U"• Sound files: reading MP3 audio files (implemented by Erez Volk).")
+NORMAL (U"##4.6.04# (29 May 2007)")
+LIST_ITEM (U"• OT learning: added decision strategy PositiveHG.")
+NORMAL (U"##4.6.03# (24 May 2007)")
+LIST_ITEM (U"• Spectral slices have better names.")
+NORMAL (U"##4.6.02# (17 May 2007)")
+LIST_ITEM (U"• Sound files: saving FLAC audio files (implemented by Erez Volk).")
+NORMAL (U"##4.6.01# (16 May 2007)")
+LIST_ITEM (U"• Removed a bug that caused downsampling (and therefore formant measurements) "
 	"to be incorrect for stereo sounds.")
 MAN_END
 
-MAN_BEGIN (L"What was new in 4.6?", L"ppgb", 20070512)
-NORMAL (L"##4.6# (12 May 2007)")
-NORMAL (L"##4.5.26# (8 May 2007)")
-LIST_ITEM (L"• Sound files: reading FLAC audio files (implemented by Erez Volk).")
-NORMAL (L"##4.5.25# (7 May 2007)")
-LIST_ITEM (L"• Table: Rows to columns...")
-LIST_ITEM (L"• Table: Collapse rows... (renamed from Pool).")
-LIST_ITEM (L"• Table: Formula (column range)...")
-LIST_ITEM (L"• OT learning: OTGrammar window shows harmonies.")
-NORMAL (L"##4.5.24# (27 April 2007)")
-LIST_ITEM (L"• OT learning: added decision strategy MaximumEntropy; "
+MAN_BEGIN (U"What was new in 4.6?", U"ppgb", 20070512)
+NORMAL (U"##4.6# (12 May 2007)")
+NORMAL (U"##4.5.26# (8 May 2007)")
+LIST_ITEM (U"• Sound files: reading FLAC audio files (implemented by Erez Volk).")
+NORMAL (U"##4.5.25# (7 May 2007)")
+LIST_ITEM (U"• Table: Rows to columns...")
+LIST_ITEM (U"• Table: Collapse rows... (renamed from Pool).")
+LIST_ITEM (U"• Table: Formula (column range)...")
+LIST_ITEM (U"• OT learning: OTGrammar window shows harmonies.")
+NORMAL (U"##4.5.24# (27 April 2007)")
+LIST_ITEM (U"• OT learning: added decision strategy MaximumEntropy; "
 	"this has the same harmony determination method as Harmonic Grammar (include the additive constraint noise), "
 	"but there is some more variability, in that every candidate gets a relative probability of exp(harmony).")
-NORMAL (L"##4.5.23# (26 April 2007)")
-LIST_ITEM (L"• Macintosh: much smaller sizes (in kilobytes) of spectrograms for printing and clipboard; "
+NORMAL (U"##4.5.23# (26 April 2007)")
+LIST_ITEM (U"• Macintosh: much smaller sizes (in kilobytes) of spectrograms for printing and clipboard; "
 	"this improves the compatibility with other programs such as Microsoft Word for large spectrograms.")
-NORMAL (L"##4.5.22# (25 April 2007)")
-LIST_ITEM (L"• Macintosh: improved drawing of spectrograms for printing and clipboard "
+NORMAL (U"##4.5.22# (25 April 2007)")
+LIST_ITEM (U"• Macintosh: improved drawing of spectrograms for printing and clipboard "
 	"(this was crippled in 4.5.18, but now it is better than before 4.5.18).")
-NORMAL (L"##4.5.21# (24 April 2007)")
-LIST_ITEM (L"• OT learning: corrected HarmonicGrammar (and LinearOT) learning procedure "
+NORMAL (U"##4.5.21# (24 April 2007)")
+LIST_ITEM (U"• OT learning: corrected HarmonicGrammar (and LinearOT) learning procedure "
 	"to the stochastic gradient ascent method applied by @@Jäger (2003)@ to MaxEnt grammars.")
-LIST_ITEM (L"• Scripting: removed a bug that could make selection checking (in command windows) unreliable after a script was run.")
-NORMAL (L"##4.5.20# (19 April 2007)")
-LIST_ITEM (L"• Scripting: allow assignments like $$pitch = To Pitch... 0 75 600$.")
-LIST_ITEM (L"• PitchTier Formula: guard against undefined values.")
-NORMAL (L"##4.5.19# (2 April 2007)")
-LIST_ITEM (L"• Scripting: allow comments with \"\\# \" and \";\" in forms.")
-LIST_ITEM (L"• Windows audio playing: attempt at more compatibility with Vista.")
-NORMAL (L"##4.5.18# (30 March 2007)")
-LIST_ITEM (L"• Macintosh: better image drawing (more grey values).")
-LIST_ITEM (L"• More tabulation commands.")
-LIST_ITEM (L"• More SpectrumTier commands.")
-LIST_ITEM (L"• Picture window: keyboard shortcut for ##Erase all#.")
-NORMAL (L"##4.5.17# (19 March 2007)")
-LIST_ITEM (L"• Picture window: can change arrow size.")
-LIST_ITEM (L"• Several #List commands.")
-LIST_ITEM (L"• Spectrum: To SpectrumTier (peaks).")
-NORMAL (L"##4.5.16# (22 February 2007)")
-LIST_ITEM (L"• Sound-to-Intensity: made resistant against undefined settings.")
-LIST_ITEM (L"• Windows: made Ctrl-. available as a shortcut.")
-LIST_ITEM (L"• Linux: made it more likely to find the correct fonts.")
-NORMAL (L"##4.5.15# (12 February 2007)")
-LIST_ITEM (L"• Windows XP: worked around a bug in Windows XP that could cause Praat to crash "
+LIST_ITEM (U"• Scripting: removed a bug that could make selection checking (in command windows) unreliable after a script was run.")
+NORMAL (U"##4.5.20# (19 April 2007)")
+LIST_ITEM (U"• Scripting: allow assignments like $$pitch = To Pitch... 0 75 600$.")
+LIST_ITEM (U"• PitchTier Formula: guard against undefined values.")
+NORMAL (U"##4.5.19# (2 April 2007)")
+LIST_ITEM (U"• Scripting: allow comments with \"\\# \" and \";\" in forms.")
+LIST_ITEM (U"• Windows audio playing: attempt at more compatibility with Vista.")
+NORMAL (U"##4.5.18# (30 March 2007)")
+LIST_ITEM (U"• Macintosh: better image drawing (more grey values).")
+LIST_ITEM (U"• More tabulation commands.")
+LIST_ITEM (U"• More SpectrumTier commands.")
+LIST_ITEM (U"• Picture window: keyboard shortcut for ##Erase all#.")
+NORMAL (U"##4.5.17# (19 March 2007)")
+LIST_ITEM (U"• Picture window: can change arrow size.")
+LIST_ITEM (U"• Several #List commands.")
+LIST_ITEM (U"• Spectrum: To SpectrumTier (peaks).")
+NORMAL (U"##4.5.16# (22 February 2007)")
+LIST_ITEM (U"• Sound-to-Intensity: made resistant against undefined settings.")
+LIST_ITEM (U"• Windows: made Ctrl-. available as a shortcut.")
+LIST_ITEM (U"• Linux: made it more likely to find the correct fonts.")
+NORMAL (U"##4.5.15# (12 February 2007)")
+LIST_ITEM (U"• Windows XP: worked around a bug in Windows XP that could cause Praat to crash "
 	"when the user moved the mouse pointer over a file in the Desktop in the file selector. "
 	"The workaround is to temporarily disable file info tips when the file selector window is on the screen.")
-NORMAL (L"##4.5.14# (5 February 2007)")
-LIST_ITEM (L"• Scripting: some new predefined string variables like preferencesDirectory\\$ .")
-NORMAL (L"##4.5.13# (3 February 2007)")
-LIST_ITEM (L"• For stereo sounds, pitch analysis is based on correlations pooled over channels "
+NORMAL (U"##4.5.14# (5 February 2007)")
+LIST_ITEM (U"• Scripting: some new predefined string variables like preferencesDirectory\\$ .")
+NORMAL (U"##4.5.13# (3 February 2007)")
+LIST_ITEM (U"• For stereo sounds, pitch analysis is based on correlations pooled over channels "
 	"(rather than on correlations of the channel average).")
-LIST_ITEM (L"• For stereo sounds, spectrogram analysis is based on power density averaged across channels "
+LIST_ITEM (U"• For stereo sounds, spectrogram analysis is based on power density averaged across channels "
 	"(rather than on the power density of the channel average).")
-LIST_ITEM (L"• Scripting: removed a bug introduced in 4.5.06 that caused some variables not to be substituted.")
-NORMAL (L"##4.5.12# (30 January 2007)")
-LIST_ITEM (L"• Made cross-correlation pitch analysis as fast as it used to be before 4.5.11.")
-NORMAL (L"##4.5.11# (29 January 2007)")
-LIST_ITEM (L"• Sound objects can be stereo, for better playback quality "
+LIST_ITEM (U"• Scripting: removed a bug introduced in 4.5.06 that caused some variables not to be substituted.")
+NORMAL (U"##4.5.12# (30 January 2007)")
+LIST_ITEM (U"• Made cross-correlation pitch analysis as fast as it used to be before 4.5.11.")
+NORMAL (U"##4.5.11# (29 January 2007)")
+LIST_ITEM (U"• Sound objects can be stereo, for better playback quality "
 	"(most analyses will work on the averaged mono signal).")
-LIST_ITEM (L"• Macintosh: recording a sound now uses CoreAudio instead of SoundManager, "	
+LIST_ITEM (U"• Macintosh: recording a sound now uses CoreAudio instead of SoundManager, "	
 	"for more compatibility with modern recording devices, "
 	"and the possibility to record with a sampling frequency of 96 kHz.")
-LIST_ITEM (L"• @ManPages allow picture scripts with separate object lists.")
-LIST_ITEM (L"• Linux: better scroll bars in object list for Lesstif (Debian).")
-LIST_ITEM (L"• Linux: made @@Create Strings as file list...@ work on Reiser.")
-LIST_ITEM (L"• @sendpraat scripts correctly wait until sounds have played.")
-NORMAL (L"##4.5.08# (20 December 2006)")
-LIST_ITEM (L"• ExperimentMFC: can use stereo sounds.")
-NORMAL (L"##4.5.07# (16 December 2006)")
-LIST_ITEM (L"• Macintosh: playing a sound now uses CoreAudio instead of SoundManager.")
-LIST_ITEM (L"• Phonetic symbols: \\\'1primary stress and \\\'1secon\\\'2dary stress.")
-NORMAL (L"##4.5.06# (13 December 2006)")
-LIST_ITEM (L"• Support for 32-bit floating-point WAV files.")
-LIST_ITEM (L"• Scripting: removed several kinds of restrictions on string length.")
-LIST_ITEM (L"• SSCP: Draw confidence ellipse: corrected a bug that would sometimes not draw the ellipse when %N was very large.")
-NORMAL (L"##4.5.05# (5 December 2006)")
-LIST_ITEM (L"• Macintosh scripting: European symbols such as ö and é and ç are now allowed in file names in scripts "
+LIST_ITEM (U"• @ManPages allow picture scripts with separate object lists.")
+LIST_ITEM (U"• Linux: better scroll bars in object list for Lesstif (Debian).")
+LIST_ITEM (U"• Linux: made @@Create Strings as file list...@ work on Reiser.")
+LIST_ITEM (U"• @sendpraat scripts correctly wait until sounds have played.")
+NORMAL (U"##4.5.08# (20 December 2006)")
+LIST_ITEM (U"• ExperimentMFC: can use stereo sounds.")
+NORMAL (U"##4.5.07# (16 December 2006)")
+LIST_ITEM (U"• Macintosh: playing a sound now uses CoreAudio instead of SoundManager.")
+LIST_ITEM (U"• Phonetic symbols: \\\'1primary stress and \\\'1secon\\\'2dary stress.")
+NORMAL (U"##4.5.06# (13 December 2006)")
+LIST_ITEM (U"• Support for 32-bit floating-point WAV files.")
+LIST_ITEM (U"• Scripting: removed several kinds of restrictions on string length.")
+LIST_ITEM (U"• SSCP: Draw confidence ellipse: corrected a bug that would sometimes not draw the ellipse when %N was very large.")
+NORMAL (U"##4.5.05# (5 December 2006)")
+LIST_ITEM (U"• Macintosh scripting: European symbols such as ö and é and ç are now allowed in file names in scripts "
 	"and in MacRoman-encoded file names sent by other programs through the sendpraat subroutine.")
-NORMAL (L"##4.5.04# (1 December 2006)")
-LIST_ITEM (L"• @@Sound: Change gender...@: corrected a bug that often caused a female-to-male conversion to sound monotonous.")
-NORMAL (L"##4.5.03# (29 November 2006)")
-LIST_ITEM (L"• Table: added independent-samples t-test.")
-LIST_ITEM (L"• Linux: corrected a bug introduced in 4.5.02 that prevented sounds from playing and other weird things.")
-NORMAL (L"##4.5.02# (16 November 2006)")
-LIST_ITEM (L"• Corrected yet another bug in the new @@Sound: To TextGrid (silences)... at .")
-NORMAL (L"##4.5.01# (28 October 2006)")
-LIST_ITEM (L"• Sound window: the pitch drawing method is #Curves, #Speckles, or #Automatic.")
-LIST_ITEM (L"• Corrected another bug in the new @@Sound: To TextGrid (silences)... at .")
-MAN_END
-
-MAN_BEGIN (L"What was new in 4.5?", L"ppgb", 20061026)
-NORMAL (L"##4.5# (26 October 2006)")
-NORMAL (L"##4.4.35# (20 October 2006)")
-LIST_ITEM (L"• In @ManPages you can now draw pictures.")
-NORMAL (L"##4.4.34# (19 October 2006)")
-LIST_ITEM (L"• Corrected a bug in the new @@Sound: To TextGrid (silences)... at .")
-NORMAL (L"##4.4.33# (4 October 2006)")
-LIST_ITEM (L"• Windows: corrected a bug introduced in 4.4.31 that caused Praat to skip the first line of the Buttons file.")
-NORMAL (L"##4.4.32# (30 September 2006)")
-LIST_ITEM (L"• Scripting: more techniques for @@Scripting 4. Object selection|object selection at .")
-LIST_ITEM (L"• Scripting: more support for putting the results of the #Info command into a string variable.")
-NORMAL (L"##4.4.31# (23 September 2006)")
-LIST_ITEM (L"• Support for @@plug-ins at .")
-LIST_ITEM (L"• Split between @@Create Strings as file list...@ and @@Create Strings as directory list... at .")
-NORMAL (L"##4.4.30# (28 August 2006)")
-LIST_ITEM (L"• Table: Draw ellipse (standard deviation)...")
-NORMAL (L"##4.4.29# (21 August 2006)")
-LIST_ITEM (L"• Allowed \"European\" symbols in file names and object names.")
-NORMAL (L"##4.4.28# (10 August 2006)")
-LIST_ITEM (L"• Windows XP: Praat files can finally again be opened by double-clicking and by dragging them onto the Praat icon.")
-LIST_ITEM (L"• Scripting (Windows): removed a bug that caused Praat to crash if the script window was closed when a file selector window was open.")
-NORMAL (L"##4.4.27# (4 August 2006)")
-LIST_ITEM (L"• Table window: corrected vertical scroll bar (on Windows).")
-LIST_ITEM (L"• Formulas: invSigmoid.")
-LIST_ITEM (L"• Logging: added 'power' (and documented the 'freq' command).")
-LIST_ITEM (L"• Removed a bug that caused ##Read two Sounds from stereo file...# not to work in scripts.")
-NORMAL (L"##4.4.26# (24 July 2006)")
-LIST_ITEM (L"• ##Sound & FormantTier: Filter#: much more accurate.")
-NORMAL (L"##4.4.25# (16 July 2006)")
-LIST_ITEM (L"• TextGrid reading: don't set first boundary to zero for .wrd label files.")
-NORMAL (L"##4.4.24# (19 June 2006)")
-LIST_ITEM (L"• Scripting: regular expressions allow replacement with empty string.")
-NORMAL (L"##4.4.23# (1 June 2006)")
-LIST_ITEM (L"• Table: ignore more white space.")
-NORMAL (L"##4.4.22# (30 May 2006)")
-LIST_ITEM (L"• Scripting: replacing with regular expression. See @@Formulas 5. String functions at .")
-NORMAL (L"##4.4.21# (29 May 2006)")
-LIST_ITEM (L"• Made Manipulation objects readable again.")
-NORMAL (L"##4.4.20# (3 May 2006)")
-LIST_ITEM (L"• Removed limit on number of menus (Praat could crash if the number of open windows was high).")
-NORMAL (L"##4.4.19# (28 April 2006)")
-LIST_ITEM (L"• Table: ##Get mean#, ##Get standard deviation#, ##Get quantile#.")
-NORMAL (L"##4.4.18# (24 April 2006)")
-LIST_ITEM (L"• Table: ##View & Edit#: view the contents of a table.")
-LIST_ITEM (L"• Table: ##Scatter plot#.")
-LIST_ITEM (L"• Scripting: more warnings against missing or extra spaces.")
-NORMAL (L"##4.4.17# (19 April 2006)")
-LIST_ITEM (L"• Table: #Pool: computing averages and medians of dependent variables "
+NORMAL (U"##4.5.04# (1 December 2006)")
+LIST_ITEM (U"• @@Sound: Change gender...@: corrected a bug that often caused a female-to-male conversion to sound monotonous.")
+NORMAL (U"##4.5.03# (29 November 2006)")
+LIST_ITEM (U"• Table: added independent-samples t-test.")
+LIST_ITEM (U"• Linux: corrected a bug introduced in 4.5.02 that prevented sounds from playing and other weird things.")
+NORMAL (U"##4.5.02# (16 November 2006)")
+LIST_ITEM (U"• Corrected yet another bug in the new @@Sound: To TextGrid (silences)... at .")
+NORMAL (U"##4.5.01# (28 October 2006)")
+LIST_ITEM (U"• Sound window: the pitch drawing method is #Curves, #Speckles, or #Automatic.")
+LIST_ITEM (U"• Corrected another bug in the new @@Sound: To TextGrid (silences)... at .")
+MAN_END
+
+MAN_BEGIN (U"What was new in 4.5?", U"ppgb", 20061026)
+NORMAL (U"##4.5# (26 October 2006)")
+NORMAL (U"##4.4.35# (20 October 2006)")
+LIST_ITEM (U"• In @ManPages you can now draw pictures.")
+NORMAL (U"##4.4.34# (19 October 2006)")
+LIST_ITEM (U"• Corrected a bug in the new @@Sound: To TextGrid (silences)... at .")
+NORMAL (U"##4.4.33# (4 October 2006)")
+LIST_ITEM (U"• Windows: corrected a bug introduced in 4.4.31 that caused Praat to skip the first line of the Buttons file.")
+NORMAL (U"##4.4.32# (30 September 2006)")
+LIST_ITEM (U"• Scripting: more techniques for @@Scripting 4. Object selection|object selection at .")
+LIST_ITEM (U"• Scripting: more support for putting the results of the #Info command into a string variable.")
+NORMAL (U"##4.4.31# (23 September 2006)")
+LIST_ITEM (U"• Support for @@plug-ins at .")
+LIST_ITEM (U"• Split between @@Create Strings as file list...@ and @@Create Strings as directory list... at .")
+NORMAL (U"##4.4.30# (28 August 2006)")
+LIST_ITEM (U"• Table: Draw ellipse (standard deviation)...")
+NORMAL (U"##4.4.29# (21 August 2006)")
+LIST_ITEM (U"• Allowed \"European\" symbols in file names and object names.")
+NORMAL (U"##4.4.28# (10 August 2006)")
+LIST_ITEM (U"• Windows XP: Praat files can finally again be opened by double-clicking and by dragging them onto the Praat icon.")
+LIST_ITEM (U"• Scripting (Windows): removed a bug that caused Praat to crash if the script window was closed when a file selector window was open.")
+NORMAL (U"##4.4.27# (4 August 2006)")
+LIST_ITEM (U"• Table window: corrected vertical scroll bar (on Windows).")
+LIST_ITEM (U"• Formulas: invSigmoid.")
+LIST_ITEM (U"• Logging: added 'power' (and documented the 'freq' command).")
+LIST_ITEM (U"• Removed a bug that caused ##Read two Sounds from stereo file...# not to work in scripts.")
+NORMAL (U"##4.4.26# (24 July 2006)")
+LIST_ITEM (U"• ##Sound & FormantTier: Filter#: much more accurate.")
+NORMAL (U"##4.4.25# (16 July 2006)")
+LIST_ITEM (U"• TextGrid reading: don't set first boundary to zero for .wrd label files.")
+NORMAL (U"##4.4.24# (19 June 2006)")
+LIST_ITEM (U"• Scripting: regular expressions allow replacement with empty string.")
+NORMAL (U"##4.4.23# (1 June 2006)")
+LIST_ITEM (U"• Table: ignore more white space.")
+NORMAL (U"##4.4.22# (30 May 2006)")
+LIST_ITEM (U"• Scripting: replacing with regular expression. See @@Formulas 5. String functions at .")
+NORMAL (U"##4.4.21# (29 May 2006)")
+LIST_ITEM (U"• Made Manipulation objects readable again.")
+NORMAL (U"##4.4.20# (3 May 2006)")
+LIST_ITEM (U"• Removed limit on number of menus (Praat could crash if the number of open windows was high).")
+NORMAL (U"##4.4.19# (28 April 2006)")
+LIST_ITEM (U"• Table: ##Get mean#, ##Get standard deviation#, ##Get quantile#.")
+NORMAL (U"##4.4.18# (24 April 2006)")
+LIST_ITEM (U"• Table: ##View & Edit#: view the contents of a table.")
+LIST_ITEM (U"• Table: ##Scatter plot#.")
+LIST_ITEM (U"• Scripting: more warnings against missing or extra spaces.")
+NORMAL (U"##4.4.17# (19 April 2006)")
+LIST_ITEM (U"• Table: #Pool: computing averages and medians of dependent variables "
 	"for a selected combination of independent variables.")
-LIST_ITEM (L"• Table: #Formula accepts string expressions as well as numeric expressions.")
-LIST_ITEM (L"• Table: #Sort can sort by any number of columns.")
-LIST_ITEM (L"• Table: ##Create with column names#.")
-LIST_ITEM (L"• Table: ##Report mean#.")
-LIST_ITEM (L"• Formulas: @@Formulas 7. Attributes of objects|row\\$  and col\\$  attributes at .")
-LIST_ITEM (L"• Warning when trying to read data files whose format is newer than the Praat version.")
-NORMAL (L"##4.4.16# (1 April 2006)")
-LIST_ITEM (L"• Spectrum window: dynamic range setting.")
-LIST_ITEM (L"• SoundRecorder: corrected a bug in the Intel Mac edition.")
-NORMAL (L"##4.4.15# (30 March 2006)")
-LIST_ITEM (L"• Source code even more compatible with 64-bit compilers.")
-NORMAL (L"##4.4.14# (29 March 2006)")
-LIST_ITEM (L"• Source code more compatible with 64-bit compilers.")
-NORMAL (L"##4.4.13# (8 March 2006)")
-LIST_ITEM (L"• Table To TableOfReal: better handling of --undefined-- values (are now numeric).")
-LIST_ITEM (L"• MacOS X: TextGrid files can be double-clicked to open.")
-LIST_ITEM (L"• @@Create Strings as file list...@: now handles up to 1,000,000 files per directory.")
-NORMAL (L"##4.4.12# (24 February 2006)")
-LIST_ITEM (L"• TextGrid: removed a bug introduced in 4.4.10 that caused Praat to crash when converting an IntervalTier into a TextGrid.")
-NORMAL (L"##4.4.11# (23 February 2006)")
-LIST_ITEM (L"• Listening experiments: removed a bug that could cause Praat to crash when an ExperimentMFC object was removed.")
-NORMAL (L"##4.4.10# (20 February 2006)")
-LIST_ITEM (L"• Intel computers: corrected reading and writing of 24-bit sound files (error introduced in 4.4.09).")
-LIST_ITEM (L"• Create TextGrid: guard against zero tiers.")
-LIST_ITEM (L"• MacOS X: correct visibility of Praat icon.")
-LIST_ITEM (L"• MacOS X: correct dropping of Praat files on Praat icon.")
-NORMAL (L"##4.4.09# (19 February 2006)")
-LIST_ITEM (L"• Macintosh: first Intel Macintosh version.")
-LIST_ITEM (L"• Windows: Create Strings from directory list...")
-NORMAL (L"##4.4.08# (6 February 2006)")
-LIST_ITEM (L"• Much improved cepstral smoothing.")
-NORMAL (L"##4.4.07# (2 February 2006)")
-LIST_ITEM (L"• More scripting facilities (local variables in procedures, e.g. .x and .text\\$ ).")
-LIST_ITEM (L"• Faster formulas.")
-NORMAL (L"##4.4.06# (30 January 2006)")
-LIST_ITEM (L"• More scripting facilities (Object_xxx [ ], Self.nx, Table_xxx\\$  [ ], better messages).")
-LIST_ITEM (L"• Better reading and writing of Xwaves label files.")
-NORMAL (L"##4.4.05# (26 January 2006)")
-LIST_ITEM (L"• @ExperimentMFC: removed a bug that caused Praat to crash when the Oops button was pressed after the experiment finished.")
-LIST_ITEM (L"• TextGrid: an IntervalTier can be written to an Xwaves label file.")
-NORMAL (L"##4.4.04# (6 January 2006)")
-LIST_ITEM (L"• Windows: Quicktime support (see at 4.4.03).")
-NORMAL (L"##4.4.03# (6 January 2006)")
-LIST_ITEM (L"• Macintosh: Quicktime support, i.e., \"Read from file\" can now read the audio from several kinds of movie files (.mov, .avi).")
-NORMAL (L"##4.4.02# (5 January 2006)")
-LIST_ITEM (L"• OT learning: allow the decision strategies of Harmonic Grammar and Linear OT.")
-NORMAL (L"##4.4.01# (2 January 2006)")
-LIST_ITEM (L"• Picture window: \"Logarithmic marks\" allows reversed axes.")
-LIST_ITEM (L"• Manipulation window: removed a bug from \"Shift frequencies\" that caused much too small shifts in semitones.")
-LIST_ITEM (L"• TextGrid: \"Remove point...\".")
-MAN_END
-
-MAN_BEGIN (L"What was new in 4.4?", L"ppgb", 20051219)
-NORMAL (L"##4.4# (19 December 2005)")
-NORMAL (L"##4.3.37# (15 December 2005)")
-LIST_ITEM (L"• @@Principal component analysis@: now accepts tables with more variables (columns) than cases (rows).")
-LIST_ITEM (L"• TIMIT label files: removed a bug that caused Praat to crash for files whose first part was not labelled.")
-NORMAL (L"##4.3.36# (11 December 2005)")
-LIST_ITEM (L"• Ltas: Average.")
-LIST_ITEM (L"• Optimality Theory: compute crucial rankings (select OTGrammar + PairDistribution).")
-NORMAL (L"##4.3.35# (8 December 2005)")
-LIST_ITEM (L"• @ExperimentMFC: switched off warnings for stereo files.")
-NORMAL (L"##4.3.34# (8 December 2005)")
-LIST_ITEM (L"• Sound window: the arrow scroll step is settable.")
-LIST_ITEM (L"• You can now run multiple listening experiments (@ExperimentMFC) in one \"Run\".")
-LIST_ITEM (L"• Formant: Get quantile of bandwidth...")
-NORMAL (L"##4.3.33# (6 December 2005)")
-LIST_ITEM (L"• Removed three bugs introduced in 4.3.32 in @ExperimentMFC.")
-NORMAL (L"##4.3.32# (5 December 2005)")
-LIST_ITEM (L"• Many more possibilities in @ExperimentMFC.")
-NORMAL (L"##4.3.31# (27 November 2005)")
-LIST_ITEM (L"• @@Sound: To Ltas (pitch-corrected)...@")
-NORMAL (L"##4.3.30# (18 November 2005)")
-LIST_ITEM (L"• TableOfReal: Scatter plot: allows reversed axes.")
-NORMAL (L"##4.3.29# (11 November 2005)")
-LIST_ITEM (L"• Windows: many more font sizes.")
-NORMAL (L"##4.3.28# (7 November 2005)")
-LIST_ITEM (L"• Fontless EPS files: corrected character width for Symbol font (depended on SILIPA setting).")
-LIST_ITEM (L"• Windows: more reliable detection of home directory.")
-NORMAL (L"##4.3.27# (7 October 2005)")
-LIST_ITEM (L"• TextGrid & Pitch: draw with text alignment.")
-NORMAL (L"##4.3.26# (29 September 2005)")
-LIST_ITEM (L"• Macintosh: corrected error introduced in 4.3.25.")
-NORMAL (L"##4.3.25# (28 September 2005)")
-LIST_ITEM (L"• Macintosh: allowed recording with sample rates of 12 and 64 kHz.")
-NORMAL (L"##4.3.24# (26 September 2005)")
-LIST_ITEM (L"• Table: Down to TableOfReal...: one column of the Table can be used as the row labels for the TableOfReal, "
+LIST_ITEM (U"• Table: #Formula accepts string expressions as well as numeric expressions.")
+LIST_ITEM (U"• Table: #Sort can sort by any number of columns.")
+LIST_ITEM (U"• Table: ##Create with column names#.")
+LIST_ITEM (U"• Table: ##Report mean#.")
+LIST_ITEM (U"• Formulas: @@Formulas 7. Attributes of objects|row\\$  and col\\$  attributes at .")
+LIST_ITEM (U"• Warning when trying to read data files whose format is newer than the Praat version.")
+NORMAL (U"##4.4.16# (1 April 2006)")
+LIST_ITEM (U"• Spectrum window: dynamic range setting.")
+LIST_ITEM (U"• SoundRecorder: corrected a bug in the Intel Mac edition.")
+NORMAL (U"##4.4.15# (30 March 2006)")
+LIST_ITEM (U"• Source code even more compatible with 64-bit compilers.")
+NORMAL (U"##4.4.14# (29 March 2006)")
+LIST_ITEM (U"• Source code more compatible with 64-bit compilers.")
+NORMAL (U"##4.4.13# (8 March 2006)")
+LIST_ITEM (U"• Table To TableOfReal: better handling of --undefined-- values (are now numeric).")
+LIST_ITEM (U"• MacOS X: TextGrid files can be double-clicked to open.")
+LIST_ITEM (U"• @@Create Strings as file list...@: now handles up to 1,000,000 files per directory.")
+NORMAL (U"##4.4.12# (24 February 2006)")
+LIST_ITEM (U"• TextGrid: removed a bug introduced in 4.4.10 that caused Praat to crash when converting an IntervalTier into a TextGrid.")
+NORMAL (U"##4.4.11# (23 February 2006)")
+LIST_ITEM (U"• Listening experiments: removed a bug that could cause Praat to crash when an ExperimentMFC object was removed.")
+NORMAL (U"##4.4.10# (20 February 2006)")
+LIST_ITEM (U"• Intel computers: corrected reading and writing of 24-bit sound files (error introduced in 4.4.09).")
+LIST_ITEM (U"• Create TextGrid: guard against zero tiers.")
+LIST_ITEM (U"• MacOS X: correct visibility of Praat icon.")
+LIST_ITEM (U"• MacOS X: correct dropping of Praat files on Praat icon.")
+NORMAL (U"##4.4.09# (19 February 2006)")
+LIST_ITEM (U"• Macintosh: first Intel Macintosh version.")
+LIST_ITEM (U"• Windows: Create Strings from directory list...")
+NORMAL (U"##4.4.08# (6 February 2006)")
+LIST_ITEM (U"• Much improved cepstral smoothing.")
+NORMAL (U"##4.4.07# (2 February 2006)")
+LIST_ITEM (U"• More scripting facilities (local variables in procedures, e.g. .x and .text\\$ ).")
+LIST_ITEM (U"• Faster formulas.")
+NORMAL (U"##4.4.06# (30 January 2006)")
+LIST_ITEM (U"• More scripting facilities (Object_xxx [ ], Self.nx, Table_xxx\\$  [ ], better messages).")
+LIST_ITEM (U"• Better reading and writing of Xwaves label files.")
+NORMAL (U"##4.4.05# (26 January 2006)")
+LIST_ITEM (U"• @ExperimentMFC: removed a bug that caused Praat to crash when the Oops button was pressed after the experiment finished.")
+LIST_ITEM (U"• TextGrid: an IntervalTier can be written to an Xwaves label file.")
+NORMAL (U"##4.4.04# (6 January 2006)")
+LIST_ITEM (U"• Windows: Quicktime support (see at 4.4.03).")
+NORMAL (U"##4.4.03# (6 January 2006)")
+LIST_ITEM (U"• Macintosh: Quicktime support, i.e., \"Read from file\" can now read the audio from several kinds of movie files (.mov, .avi).")
+NORMAL (U"##4.4.02# (5 January 2006)")
+LIST_ITEM (U"• OT learning: allow the decision strategies of Harmonic Grammar and Linear OT.")
+NORMAL (U"##4.4.01# (2 January 2006)")
+LIST_ITEM (U"• Picture window: \"Logarithmic marks\" allows reversed axes.")
+LIST_ITEM (U"• Manipulation window: removed a bug from \"Shift frequencies\" that caused much too small shifts in semitones.")
+LIST_ITEM (U"• TextGrid: \"Remove point...\".")
+MAN_END
+
+MAN_BEGIN (U"What was new in 4.4?", U"ppgb", 20051219)
+NORMAL (U"##4.4# (19 December 2005)")
+NORMAL (U"##4.3.37# (15 December 2005)")
+LIST_ITEM (U"• @@Principal component analysis@: now accepts tables with more variables (columns) than cases (rows).")
+LIST_ITEM (U"• TIMIT label files: removed a bug that caused Praat to crash for files whose first part was not labelled.")
+NORMAL (U"##4.3.36# (11 December 2005)")
+LIST_ITEM (U"• Ltas: Average.")
+LIST_ITEM (U"• Optimality Theory: compute crucial rankings (select OTGrammar + PairDistribution).")
+NORMAL (U"##4.3.35# (8 December 2005)")
+LIST_ITEM (U"• @ExperimentMFC: switched off warnings for stereo files.")
+NORMAL (U"##4.3.34# (8 December 2005)")
+LIST_ITEM (U"• Sound window: the arrow scroll step is settable.")
+LIST_ITEM (U"• You can now run multiple listening experiments (@ExperimentMFC) in one \"Run\".")
+LIST_ITEM (U"• Formant: Get quantile of bandwidth...")
+NORMAL (U"##4.3.33# (6 December 2005)")
+LIST_ITEM (U"• Removed three bugs introduced in 4.3.32 in @ExperimentMFC.")
+NORMAL (U"##4.3.32# (5 December 2005)")
+LIST_ITEM (U"• Many more possibilities in @ExperimentMFC.")
+NORMAL (U"##4.3.31# (27 November 2005)")
+LIST_ITEM (U"• @@Sound: To Ltas (pitch-corrected)...@")
+NORMAL (U"##4.3.30# (18 November 2005)")
+LIST_ITEM (U"• TableOfReal: Scatter plot: allows reversed axes.")
+NORMAL (U"##4.3.29# (11 November 2005)")
+LIST_ITEM (U"• Windows: many more font sizes.")
+NORMAL (U"##4.3.28# (7 November 2005)")
+LIST_ITEM (U"• Fontless EPS files: corrected character width for Symbol font (depended on SILIPA setting).")
+LIST_ITEM (U"• Windows: more reliable detection of home directory.")
+NORMAL (U"##4.3.27# (7 October 2005)")
+LIST_ITEM (U"• TextGrid & Pitch: draw with text alignment.")
+NORMAL (U"##4.3.26# (29 September 2005)")
+LIST_ITEM (U"• Macintosh: corrected error introduced in 4.3.25.")
+NORMAL (U"##4.3.25# (28 September 2005)")
+LIST_ITEM (U"• Macintosh: allowed recording with sample rates of 12 and 64 kHz.")
+NORMAL (U"##4.3.24# (26 September 2005)")
+LIST_ITEM (U"• Table: Down to TableOfReal...: one column of the Table can be used as the row labels for the TableOfReal, "
 	"and the strings in the remaining columns of the Table are replaced with whole numbers assigned in alphabetical order.")
-NORMAL (L"##4.3.23# (24 September 2005)")
-LIST_ITEM (L"• Read Table from comma-separated file...")
-LIST_ITEM (L"• Read Table from tab-separated file...")
-LIST_ITEM (L"• Write picture as fontless EPS file: choice between XIPA and SILIPA93.")
-LIST_ITEM (L"• Bold IPA symbols in EPS files (fontless SILIPA93 only).")
-NORMAL (L"##4.3.22# (8 September 2005)")
-LIST_ITEM (L"• Macintosh: variable scroll bar size (finally, 7 years since System 8.5).")
-NORMAL (L"##4.3.21# (1 September 2005)")
-LIST_ITEM (L"• Macintosh: error message if any of the fonts Times, Helvetica, Courier and Symbol are unavailable at start-up.")
-LIST_ITEM (L"• Renamed \"Control\" menu to \"Praat\" on all platforms (as on the Mac), "
+NORMAL (U"##4.3.23# (24 September 2005)")
+LIST_ITEM (U"• Read Table from comma-separated file...")
+LIST_ITEM (U"• Read Table from tab-separated file...")
+LIST_ITEM (U"• Write picture as fontless EPS file: choice between XIPA and SILIPA93.")
+LIST_ITEM (U"• Bold IPA symbols in EPS files (fontless SILIPA93 only).")
+NORMAL (U"##4.3.22# (8 September 2005)")
+LIST_ITEM (U"• Macintosh: variable scroll bar size (finally, 7 years since System 8.5).")
+NORMAL (U"##4.3.21# (1 September 2005)")
+LIST_ITEM (U"• Macintosh: error message if any of the fonts Times, Helvetica, Courier and Symbol are unavailable at start-up.")
+LIST_ITEM (U"• Renamed \"Control\" menu to \"Praat\" on all platforms (as on the Mac), "
 	"to reflect the fact that no other programs than Praat have used the Praat shell for five years.")
-LIST_ITEM (L"• Script editor: Undo and Redo buttons (only on the Mac for now).")
-LIST_ITEM (L"• Manual: corrected a bug that sometimes caused Praat to crash when trying to print.")
-NORMAL (L"##4.3.20# (18 August 2005)")
-LIST_ITEM (L"• Log files: include name of editor window.")
-NORMAL (L"##4.3.19# (20 July 2005)")
-LIST_ITEM (L"• Improved buttons in manual.")
-LIST_ITEM (L"• TableOfReal: Read from headerless spreadsheet file: allow row and column labels to be 30,000 rather than 100 characters.")
-NORMAL (L"##4.3.18# (12 July 2005)")
-LIST_ITEM (L"• Glottal source for sound synthesis, corrected and documented.")
-NORMAL (L"##4.3.17# (7 July 2005)")
-LIST_ITEM (L"• Glottal source for sound synthesis.")
-LIST_ITEM (L"• Multi-level Optimality Theory: parallel evaluation and bidirectional learning.")
-NORMAL (L"##4.3.16# (22 June 2005)")
-LIST_ITEM (L"• Pitch drawing: corrected logarithmic scales.")
-NORMAL (L"##4.3.15# (22 June 2005)")
-LIST_ITEM (L"• Graphics: better dotted lines in pitch contours; clipped pitch curves in editor windows.")
-LIST_ITEM (L"• Pitch analysis: more different units (semitones %re 1 Hz).")
-NORMAL (L"##4.3.14# (14 June 2005)")
-LIST_ITEM (L"• Scripting: regular expressions.")
-LIST_ITEM (L"• Removed a bug that caused Praat to crash if a proposed object name was longer than 200 characters.")
-NORMAL (L"##4.3.13# (19 May 2005)")
-LIST_ITEM (L"• Macintosh: an option to switch off screen previews in EPS files.")
-LIST_ITEM (L"• Sources: compatibility of makefiles with MinGW (Minimalist GNU for Windows).")
-NORMAL (L"##4.3.12# (10 May 2005)")
-LIST_ITEM (L"• Some more manual tricks.")
-NORMAL (L"##4.3.11# (6 May 2005)")
-LIST_ITEM (L"• TextGrid editor: show number of intervals.")
-NORMAL (L"##4.3.10# (25 April 2005)")
-LIST_ITEM (L"• Table: Get logistic regression.")
-NORMAL (L"##4.3.08# (19 April 2005)")
-LIST_ITEM (L"• OT learning: store history with \"OTGrammar & Strings: Learn from partial outputs...\".")
-NORMAL (L"##4.3.07# (31 March 2005)")
-LIST_ITEM (L"• Linux: removed a bug that could cause a sound to stop playing.")
-NORMAL (L"##4.3.04# (9 March 2005)")
-LIST_ITEM (L"• Use SIL Doulos IPA 1993/1996 instead of 1989.")
-NORMAL (L"##4.3.03# (2 March 2005)")
-LIST_ITEM (L"• TextGrid window: green colouring of matching text.")
-LIST_ITEM (L"• Regular expressions can be used in many places.")
-LIST_ITEM (L"• Pitch analysis: switched off formant-pulling.")
-NORMAL (L"##4.3.02# (16 February 2005)")
-LIST_ITEM (L"• TextGrid: Remove boundary at time...")
-LIST_ITEM (L"• Scripting: corrected %nowarn.")
-LIST_ITEM (L"• Linux: guard against blocking audio device.")
-LIST_ITEM (L"• Macintosh: guard against out-of-range audio level meter.")
-NORMAL (L"##4.3.01# (9 February 2005)")
-LIST_ITEM (L"• Replaced PostScript font SILDoulosIPA with XIPA (adapted for Praat by Rafael Laboissière).")
-LIST_ITEM (L"• Sound: Set part to zero...")
-LIST_ITEM (L"• Pitch: To Sound (sine)...")
-LIST_ITEM (L"• Sound & TextGrid: Clone time domain.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 4.3?", L"ppgb", 20050126)
-ENTRY (L"Praat 4.3, 26 January 2005")
-	NORMAL (L"General:")
-	LIST_ITEM (L"• `Apply' button in settings windows for menu commands and in script forms.")
-	LIST_ITEM (L"• Info window can be saved.")
-	LIST_ITEM (L"• Removed 30,000-character limit in Info window.")
-	NORMAL (L"Phonetics:")
-	LIST_ITEM (L"• Speeded up intensity analysis by a factor of 10 "
+LIST_ITEM (U"• Script editor: Undo and Redo buttons (only on the Mac for now).")
+LIST_ITEM (U"• Manual: corrected a bug that sometimes caused Praat to crash when trying to print.")
+NORMAL (U"##4.3.20# (18 August 2005)")
+LIST_ITEM (U"• Log files: include name of editor window.")
+NORMAL (U"##4.3.19# (20 July 2005)")
+LIST_ITEM (U"• Improved buttons in manual.")
+LIST_ITEM (U"• TableOfReal: Read from headerless spreadsheet file: allow row and column labels to be 30,000 rather than 100 characters.")
+NORMAL (U"##4.3.18# (12 July 2005)")
+LIST_ITEM (U"• Glottal source for sound synthesis, corrected and documented.")
+NORMAL (U"##4.3.17# (7 July 2005)")
+LIST_ITEM (U"• Glottal source for sound synthesis.")
+LIST_ITEM (U"• Multi-level Optimality Theory: parallel evaluation and bidirectional learning.")
+NORMAL (U"##4.3.16# (22 June 2005)")
+LIST_ITEM (U"• Pitch drawing: corrected logarithmic scales.")
+NORMAL (U"##4.3.15# (22 June 2005)")
+LIST_ITEM (U"• Graphics: better dotted lines in pitch contours; clipped pitch curves in editor windows.")
+LIST_ITEM (U"• Pitch analysis: more different units (semitones %re 1 Hz).")
+NORMAL (U"##4.3.14# (14 June 2005)")
+LIST_ITEM (U"• Scripting: regular expressions.")
+LIST_ITEM (U"• Removed a bug that caused Praat to crash if a proposed object name was longer than 200 characters.")
+NORMAL (U"##4.3.13# (19 May 2005)")
+LIST_ITEM (U"• Macintosh: an option to switch off screen previews in EPS files.")
+LIST_ITEM (U"• Sources: compatibility of makefiles with MinGW (Minimalist GNU for Windows).")
+NORMAL (U"##4.3.12# (10 May 2005)")
+LIST_ITEM (U"• Some more manual tricks.")
+NORMAL (U"##4.3.11# (6 May 2005)")
+LIST_ITEM (U"• TextGrid editor: show number of intervals.")
+NORMAL (U"##4.3.10# (25 April 2005)")
+LIST_ITEM (U"• Table: Get logistic regression.")
+NORMAL (U"##4.3.08# (19 April 2005)")
+LIST_ITEM (U"• OT learning: store history with \"OTGrammar & Strings: Learn from partial outputs...\".")
+NORMAL (U"##4.3.07# (31 March 2005)")
+LIST_ITEM (U"• Linux: removed a bug that could cause a sound to stop playing.")
+NORMAL (U"##4.3.04# (9 March 2005)")
+LIST_ITEM (U"• Use SIL Doulos IPA 1993/1996 instead of 1989.")
+NORMAL (U"##4.3.03# (2 March 2005)")
+LIST_ITEM (U"• TextGrid window: green colouring of matching text.")
+LIST_ITEM (U"• Regular expressions can be used in many places.")
+LIST_ITEM (U"• Pitch analysis: switched off formant-pulling.")
+NORMAL (U"##4.3.02# (16 February 2005)")
+LIST_ITEM (U"• TextGrid: Remove boundary at time...")
+LIST_ITEM (U"• Scripting: corrected %nowarn.")
+LIST_ITEM (U"• Linux: guard against blocking audio device.")
+LIST_ITEM (U"• Macintosh: guard against out-of-range audio level meter.")
+NORMAL (U"##4.3.01# (9 February 2005)")
+LIST_ITEM (U"• Replaced PostScript font SILDoulosIPA with XIPA (adapted for Praat by Rafael Laboissière).")
+LIST_ITEM (U"• Sound: Set part to zero...")
+LIST_ITEM (U"• Pitch: To Sound (sine)...")
+LIST_ITEM (U"• Sound & TextGrid: Clone time domain.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 4.3?", U"ppgb", 20050126)
+ENTRY (U"Praat 4.3, 26 January 2005")
+	NORMAL (U"General:")
+	LIST_ITEM (U"• `Apply' button in settings windows for menu commands and in script forms.")
+	LIST_ITEM (U"• Info window can be saved.")
+	LIST_ITEM (U"• Removed 30,000-character limit in Info window.")
+	NORMAL (U"Phonetics:")
+	LIST_ITEM (U"• Speeded up intensity analysis by a factor of 10 "
 		"(by making its time resolution 0.01 ms rather than 0.0001 ms at a sampling frequency of 44 kHz).")
-	LIST_ITEM (L"• Speeded up pitch analysis and spectrogram analysis by a factor of two.")
-	LIST_ITEM (L"• Sound: To Spectrum... now has a reasonably fast non-FFT version.")
-	LIST_ITEM (L"• Calibrated long-term average spectrum (Sound: To Ltas...).")
-	LIST_ITEM (L"• Pitch-corrected LTAS analysis.")
-	LIST_ITEM (L"• Sound: Scale intensity.")
-	LIST_ITEM (L"• PitchTier: To Sound (sine).")
-	LIST_ITEM (L"• Better warnings against use of the LPC object.")
-	NORMAL (L"Voice:")
-	LIST_ITEM (L"• July 9, 2004 (4.2.08): Shimmer measurements: more accurate and less sensitive to additive noise.")
-	LIST_ITEM (L"• More extensive voice report: pitch statistics; harmonicity.")
-	NORMAL (L"Audio:")
-	LIST_ITEM (L"• Reading and opening 24-bit and 32-bit sound files (saving still goes in 16 bits).")
-	LIST_ITEM (L"• LongSound: save separate channels.")
-	LIST_ITEM (L"• Macintosh: much faster reading of WAV files.")
-	NORMAL (L"Listening experiments:")
-	LIST_ITEM (L"• Subjects can now respond with keyboard presses.")
-	NORMAL (L"Graphics:")
-	LIST_ITEM (L"• One can now drag the inner viewport in the Picture window, excluding the margins. "
+	LIST_ITEM (U"• Speeded up pitch analysis and spectrogram analysis by a factor of two.")
+	LIST_ITEM (U"• Sound: To Spectrum... now has a reasonably fast non-FFT version.")
+	LIST_ITEM (U"• Calibrated long-term average spectrum (Sound: To Ltas...).")
+	LIST_ITEM (U"• Pitch-corrected LTAS analysis.")
+	LIST_ITEM (U"• Sound: Scale intensity.")
+	LIST_ITEM (U"• PitchTier: To Sound (sine).")
+	LIST_ITEM (U"• Better warnings against use of the LPC object.")
+	NORMAL (U"Voice:")
+	LIST_ITEM (U"• July 9, 2004 (4.2.08): Shimmer measurements: more accurate and less sensitive to additive noise.")
+	LIST_ITEM (U"• More extensive voice report: pitch statistics; harmonicity.")
+	NORMAL (U"Audio:")
+	LIST_ITEM (U"• Reading and opening 24-bit and 32-bit sound files (saving still goes in 16 bits).")
+	LIST_ITEM (U"• LongSound: save separate channels.")
+	LIST_ITEM (U"• Macintosh: much faster reading of WAV files.")
+	NORMAL (U"Listening experiments:")
+	LIST_ITEM (U"• Subjects can now respond with keyboard presses.")
+	NORMAL (U"Graphics:")
+	LIST_ITEM (U"• One can now drag the inner viewport in the Picture window, excluding the margins. "
 		"This is nice e.g. for creating square viewports or for drawing a waveform and a spectrogram in close contact.")
-	LIST_ITEM (L"• Unix: picture highlighting as on Mac and Windows.")
-	LIST_ITEM (L"• More drawing methods for Sound and Ltas (curve, bars, poles, speckles).")
-	NORMAL (L"OT learning:")
-	LIST_ITEM (L"• Monitor rankings when learning.")
-	LIST_ITEM (L"• OTGrammar: Remove harmonically bounded candidates...")
-	LIST_ITEM (L"• OTGrammar: Save as headerless spreadsheet file...")
-	LIST_ITEM (L"• Metrics grammar: added *Clash, *Lapse, WeightByPosition and *MoraicConsonant.")
-	NORMAL (L"Scripting:")
-	LIST_ITEM (L"• nowarn, noprogress, nocheck.")
-	LIST_ITEM (L"• Line numbers.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 4.2?", L"ppgb", 20040304)
-ENTRY (L"Praat 4.2, 4 March 2004")
-	NORMAL (L"General:")
-	LIST_ITEM (L"• July 10, 2003: Open source code (General Public Licence).")
-	NORMAL (L"Phonetics:")
-	LIST_ITEM (L"• Faster computation of spectrum, spectrogram, and pitch.")
-	LIST_ITEM (L"• More precision in numeric libraries.")
-	LIST_ITEM (L"• PitchTier: Interpolate quadratically.")
-	LIST_ITEM (L"• TextGrids can be saved chronologically (and Praat can read that file again).")
-	LIST_ITEM (L"• Sound editor window @@Time step settings...@: \"Automatic\", \"Fixed\", and \"View-dependent\".")
-	LIST_ITEM (L"• Sound window: distinguish basic from advanced spectrogram and pitch settings.")
-	LIST_ITEM (L"• Read TableOfReal from headerless spreadsheet file...: cells with strings are considered zero.")
-	LIST_ITEM (L"• Sound window: introduced time step as advanced setting.")
-	LIST_ITEM (L"• Sound window: reintroduced view range as advanced setting.")
-	LIST_ITEM (L"• Ltas: Compute trend line, Subtract trend line.")
-	NORMAL (L"Audio:")
-	LIST_ITEM (L"• Sun workstations: support audio servers.")
-	NORMAL (L"Graphics:")
-	LIST_ITEM (L"• Better selections in Picture window and editor windows.")
-	LIST_ITEM (L"• Picture window: better handling of rectangles and ellipses for reversed axes.")
-	LIST_ITEM (L"• Windows: corrected positioning of pictures on clipboard and in metafiles.")
-	LIST_ITEM (L"• Windows: EPS files check availability of Times and TimesNewRomanPSMT.")
-	LIST_ITEM (L"• Polygon: can now also paint in colour instead of only in grey values.")
-	LIST_ITEM (L"• Unlimited number of points for polygons in PostScript (may not work on very old printers).")
-	LIST_ITEM (L"• Picture window: line widths on all printers and clipboards are now equal to line widths used on PostScript printers: "
+	LIST_ITEM (U"• Unix: picture highlighting as on Mac and Windows.")
+	LIST_ITEM (U"• More drawing methods for Sound and Ltas (curve, bars, poles, speckles).")
+	NORMAL (U"OT learning:")
+	LIST_ITEM (U"• Monitor rankings when learning.")
+	LIST_ITEM (U"• OTGrammar: Remove harmonically bounded candidates...")
+	LIST_ITEM (U"• OTGrammar: Save as headerless spreadsheet file...")
+	LIST_ITEM (U"• Metrics grammar: added *Clash, *Lapse, WeightByPosition and *MoraicConsonant.")
+	NORMAL (U"Scripting:")
+	LIST_ITEM (U"• nowarn, noprogress, nocheck.")
+	LIST_ITEM (U"• Line numbers.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 4.2?", U"ppgb", 20040304)
+ENTRY (U"Praat 4.2, 4 March 2004")
+	NORMAL (U"General:")
+	LIST_ITEM (U"• July 10, 2003: Open source code (General Public Licence).")
+	NORMAL (U"Phonetics:")
+	LIST_ITEM (U"• Faster computation of spectrum, spectrogram, and pitch.")
+	LIST_ITEM (U"• More precision in numeric libraries.")
+	LIST_ITEM (U"• PitchTier: Interpolate quadratically.")
+	LIST_ITEM (U"• TextGrids can be saved chronologically (and Praat can read that file again).")
+	LIST_ITEM (U"• Sound editor window @@Time step settings...@: \"Automatic\", \"Fixed\", and \"View-dependent\".")
+	LIST_ITEM (U"• Sound window: distinguish basic from advanced spectrogram and pitch settings.")
+	LIST_ITEM (U"• Read TableOfReal from headerless spreadsheet file...: cells with strings are considered zero.")
+	LIST_ITEM (U"• Sound window: introduced time step as advanced setting.")
+	LIST_ITEM (U"• Sound window: reintroduced view range as advanced setting.")
+	LIST_ITEM (U"• Ltas: Compute trend line, Subtract trend line.")
+	NORMAL (U"Audio:")
+	LIST_ITEM (U"• Sun workstations: support audio servers.")
+	NORMAL (U"Graphics:")
+	LIST_ITEM (U"• Better selections in Picture window and editor windows.")
+	LIST_ITEM (U"• Picture window: better handling of rectangles and ellipses for reversed axes.")
+	LIST_ITEM (U"• Windows: corrected positioning of pictures on clipboard and in metafiles.")
+	LIST_ITEM (U"• Windows: EPS files check availability of Times and TimesNewRomanPSMT.")
+	LIST_ITEM (U"• Polygon: can now also paint in colour instead of only in grey values.")
+	LIST_ITEM (U"• Unlimited number of points for polygons in PostScript (may not work on very old printers).")
+	LIST_ITEM (U"• Picture window: line widths on all printers and clipboards are now equal to line widths used on PostScript printers: "
 		"a line with a line width of \"1\" will be drawn with a width 3/8 points. This improves the looks of pictures printed "
 		"on non-PostScript printers, improves the looks of pictures copied to your wordprocessor when printed, "
 		"and changes the looks of pictures copied to your presentation program.")
-	NORMAL (L"OT learning:")
-	LIST_ITEM (L"• Metrics grammar supports \'impoverished overt forms\', "
+	NORMAL (U"OT learning:")
+	LIST_ITEM (U"• Metrics grammar supports \'impoverished overt forms\', "
 		"i.e. without secondary stress even if surface structures do have secondary stress.")
-	LIST_ITEM (L"• Support for crucially tied constraints and tied candidates.")
-	LIST_ITEM (L"• Support for backtracking in EDCD.")
-	LIST_ITEM (L"• Queries for testing grammaticality.")
-	NORMAL (L"Scripting:")
-	LIST_ITEM (L"• ManPages: script links can receive arguments.")
-	LIST_ITEM (L"• ManPages: variable duration of recording.")
-	LIST_ITEM (L"• Support for unlimited size of script files in editor window on Windows XP and MacOS X (the Unix editions already had this).")
-	LIST_ITEM (L"• Improved the reception of %sendpraat commands on Windows XP.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 4.1?", L"ppgb", 20030605)
-ENTRY (L"Praat 4.1, 5 June 2003")
-	NORMAL (L"General:")
-	LIST_ITEM (L"• MacOS X edition.")
-	LIST_ITEM (L"• Removed licensing.")
-	LIST_ITEM (L"• More than 99 percent of the source code distributed under the General Public Licence.")
-	LIST_ITEM (L"• Windows 2000 and XP: put preferences files in home directory.")
-	NORMAL (L"Phonetics:")
-	LIST_ITEM (L"• Spectrum: the sign of the Fourier transform has changed, to comply with common use "
+	LIST_ITEM (U"• Support for crucially tied constraints and tied candidates.")
+	LIST_ITEM (U"• Support for backtracking in EDCD.")
+	LIST_ITEM (U"• Queries for testing grammaticality.")
+	NORMAL (U"Scripting:")
+	LIST_ITEM (U"• ManPages: script links can receive arguments.")
+	LIST_ITEM (U"• ManPages: variable duration of recording.")
+	LIST_ITEM (U"• Support for unlimited size of script files in editor window on Windows XP and MacOS X (the Unix editions already had this).")
+	LIST_ITEM (U"• Improved the reception of %sendpraat commands on Windows XP.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 4.1?", U"ppgb", 20030605)
+ENTRY (U"Praat 4.1, 5 June 2003")
+	NORMAL (U"General:")
+	LIST_ITEM (U"• MacOS X edition.")
+	LIST_ITEM (U"• Removed licensing.")
+	LIST_ITEM (U"• More than 99 percent of the source code distributed under the General Public Licence.")
+	LIST_ITEM (U"• Windows 2000 and XP: put preferences files in home directory.")
+	NORMAL (U"Phonetics:")
+	LIST_ITEM (U"• Spectrum: the sign of the Fourier transform has changed, to comply with common use "
 		"in technology and physics. Old Spectrum files are converted when read.")
-	LIST_ITEM (L"• Spectral moments.")
-	LIST_ITEM (L"• Many jitter and shimmer measures, also in the Sound editor window.")
-	LIST_ITEM (L"• PitchTier: shift or multiply frequencies (also in ManipulationEditor).")
-	LIST_ITEM (L"• TextGrid: shift times, scale times.")
-	LIST_ITEM (L"• Overlap-add synthesis: reduced buzz in voiceless parts.")
-	LIST_ITEM (L"• @@Sound: Change gender...")
-	LIST_ITEM (L"• Editors: @@Intro 3.6. Viewing a spectral slice at .")
-	LIST_ITEM (L"• Editors: Get spectral power at cursor cross.")
-	LIST_ITEM (L"• @@Sound: To PointProcess (periodic, peaks)...@")
-	LIST_ITEM (L"• Ltas: merge.")
-	NORMAL (L"Listening experiments:")
-	LIST_ITEM (L"• Goodness judgments.")
-	LIST_ITEM (L"• Multiple ResultsMFC: ##To Table#, so that the whole experiment can go into a single statistics file.")
-	LIST_ITEM (L"• Stimulus file path can be relative to directory of experiment file.")
-	LIST_ITEM (L"• @ExperimentMFC: multiple substimuli for discrimination tests.")
-	NORMAL (L"Statistics:")
-	LIST_ITEM (L"• New @Table object for column @statistics: Pearson's %r, Kendall's %\\ta-%b, %t-test.")
-	LIST_ITEM (L"• Table: scatter plot.")
-	LIST_ITEM (L"• Table: column names as variables.")
-	LIST_ITEM (L"• @@T-test at .")
-	LIST_ITEM (L"• TableOfReal: Extract rows where column...")
-	LIST_ITEM (L"• TableOfReal: Get correlation....")
-	LIST_ITEM (L"• @@Correlation: Confidence intervals...")
-	LIST_ITEM (L"• @@SSCP: Get diagonality (bartlett)...")
-	NORMAL (L"OT learning:")
-	LIST_ITEM (L"• Tutorial for bidirectional learning.")
-	LIST_ITEM (L"• Random choice between equally violating candidates.")
-	LIST_ITEM (L"• More constraints in metrics grammar.")
-	LIST_ITEM (L"• Learning in editor.")
-	NORMAL (L"Graphics:")
-	LIST_ITEM (L"• Printing: hard-coded image interpolation for EPS files and PostScript printers.")
-	NORMAL (L"Scripting:")
-	LIST_ITEM (L"• New @Formulas tutorial.")
-	LIST_ITEM (L"• @Formulas: can use variables without quotes.")
-	LIST_ITEM (L"• Formulas for PitchTier, IntensityTier, AmplitudeTier, DurationTier.")
-	LIST_ITEM (L"• Refer to any matrices and tables in formulas, e.g. Sound_hello (x) or Table_everything [row, col] "
+	LIST_ITEM (U"• Spectral moments.")
+	LIST_ITEM (U"• Many jitter and shimmer measures, also in the Sound editor window.")
+	LIST_ITEM (U"• PitchTier: shift or multiply frequencies (also in ManipulationEditor).")
+	LIST_ITEM (U"• TextGrid: shift times, scale times.")
+	LIST_ITEM (U"• Overlap-add synthesis: reduced buzz in voiceless parts.")
+	LIST_ITEM (U"• @@Sound: Change gender...")
+	LIST_ITEM (U"• Editors: @@Intro 3.6. Viewing a spectral slice at .")
+	LIST_ITEM (U"• Editors: Get spectral power at cursor cross.")
+	LIST_ITEM (U"• @@Sound: To PointProcess (periodic, peaks)...@")
+	LIST_ITEM (U"• Ltas: merge.")
+	NORMAL (U"Listening experiments:")
+	LIST_ITEM (U"• Goodness judgments.")
+	LIST_ITEM (U"• Multiple ResultsMFC: ##To Table#, so that the whole experiment can go into a single statistics file.")
+	LIST_ITEM (U"• Stimulus file path can be relative to directory of experiment file.")
+	LIST_ITEM (U"• @ExperimentMFC: multiple substimuli for discrimination tests.")
+	NORMAL (U"Statistics:")
+	LIST_ITEM (U"• New @Table object for column @statistics: Pearson's %r, Kendall's %\\ta-%b, %t-test.")
+	LIST_ITEM (U"• Table: scatter plot.")
+	LIST_ITEM (U"• Table: column names as variables.")
+	LIST_ITEM (U"• @@T-test at .")
+	LIST_ITEM (U"• TableOfReal: Extract rows where column...")
+	LIST_ITEM (U"• TableOfReal: Get correlation....")
+	LIST_ITEM (U"• @@Correlation: Confidence intervals...")
+	LIST_ITEM (U"• @@SSCP: Get diagonality (bartlett)...")
+	NORMAL (U"OT learning:")
+	LIST_ITEM (U"• Tutorial for bidirectional learning.")
+	LIST_ITEM (U"• Random choice between equally violating candidates.")
+	LIST_ITEM (U"• More constraints in metrics grammar.")
+	LIST_ITEM (U"• Learning in editor.")
+	NORMAL (U"Graphics:")
+	LIST_ITEM (U"• Printing: hard-coded image interpolation for EPS files and PostScript printers.")
+	NORMAL (U"Scripting:")
+	LIST_ITEM (U"• New @Formulas tutorial.")
+	LIST_ITEM (U"• @Formulas: can use variables without quotes.")
+	LIST_ITEM (U"• Formulas for PitchTier, IntensityTier, AmplitudeTier, DurationTier.")
+	LIST_ITEM (U"• Refer to any matrices and tables in formulas, e.g. Sound_hello (x) or Table_everything [row, col] "
 		"or Table_tokens [i, \"F1\"].")
-	LIST_ITEM (L"• Assignment by modification, as with += -= *= /=.")
-	LIST_ITEM (L"• New functions: date\\$ (), extractNumber, extractWord\\$ , extractLine\\$ . See @@Formulas 5. String functions at .")
-	LIST_ITEM (L"• @@Scripting 5.7. Including other scripts at .")
-	LIST_ITEM (L"• String formulas in the calculator.")
-	LIST_ITEM (L"• Stopped support of things that had been undocumented for the last four years: "
+	LIST_ITEM (U"• Assignment by modification, as with += -= *= /=.")
+	LIST_ITEM (U"• New functions: date\\$ (), extractNumber, extractWord\\$ , extractLine\\$ . See @@Formulas 5. String functions at .")
+	LIST_ITEM (U"• @@Scripting 5.7. Including other scripts at .")
+	LIST_ITEM (U"• String formulas in the calculator.")
+	LIST_ITEM (U"• Stopped support of things that had been undocumented for the last four years: "
 		"#let, #getnumber, #getstring, #ARGS, #copy, #proc, variables with capitals, and strings in numeric variables; "
 		"there are messages about how to modify your old scripts.")
-	LIST_ITEM (L"• Disallowed ambiguous expressions like -3\\^ 2.")
+	LIST_ITEM (U"• Disallowed ambiguous expressions like -3\\^ 2.")
 MAN_END
 
-MAN_BEGIN (L"What was new in 4.0?", L"ppgb", 20011015)
-ENTRY (L"Praat 4.0, 15 October 2001")
-	NORMAL (L"Editors:")
-	LIST_ITEM (L"• Simplified selection and cursor in editor windows.")
-	LIST_ITEM (L"• Spectrogram, pitch contour, formant contour, and intensity available in the "
+MAN_BEGIN (U"What was new in 4.0?", U"ppgb", 20011015)
+ENTRY (U"Praat 4.0, 15 October 2001")
+	NORMAL (U"Editors:")
+	LIST_ITEM (U"• Simplified selection and cursor in editor windows.")
+	LIST_ITEM (U"• Spectrogram, pitch contour, formant contour, and intensity available in the "
 		"Sound, LongSound, and TextGrid editors.")
-	LIST_ITEM (L"• TextGrid editor: additions and improvements.")
-	LIST_ITEM (L"• @@Log files at .")
-	NORMAL (L"Phonetics library:")
-	LIST_ITEM (L"• @ExperimentMFC: multiple-forced-choice listening experiments.")
-	LIST_ITEM (L"• @@Sound: To Pitch (ac)...@: pitch contour less dependent on time resolution. "
+	LIST_ITEM (U"• TextGrid editor: additions and improvements.")
+	LIST_ITEM (U"• @@Log files at .")
+	NORMAL (U"Phonetics library:")
+	LIST_ITEM (U"• @ExperimentMFC: multiple-forced-choice listening experiments.")
+	LIST_ITEM (U"• @@Sound: To Pitch (ac)...@: pitch contour less dependent on time resolution. "
 		"This improves the constancy of the contours in the editors when zooming.")
-	LIST_ITEM (L"• TextGrid: additions and improvements.")
-	LIST_ITEM (L"• Sounds: Concatenate recoverably. Creates a TextGrid whose interval labels are the original "
+	LIST_ITEM (U"• TextGrid: additions and improvements.")
+	LIST_ITEM (U"• Sounds: Concatenate recoverably. Creates a TextGrid whose interval labels are the original "
 		"names of the sounds.")
-	LIST_ITEM (L"• Sound & TextGrid: Extract all intervals. The reverse of the previous command.")
-	LIST_ITEM (L"• Filterbank analyses, @MelFilter, @BarkFilter and "
+	LIST_ITEM (U"• Sound & TextGrid: Extract all intervals. The reverse of the previous command.")
+	LIST_ITEM (U"• Filterbank analyses, @MelFilter, @BarkFilter and "
 		"@FormantFilter, by @@band filtering in the frequency domain at ." )
-	LIST_ITEM (L"• Cepstrum by David Weenink: @MFCC, @LFCC. "
+	LIST_ITEM (U"• Cepstrum by David Weenink: @MFCC, @LFCC. "
 		"@Cepstrum object is a representation of the %%complex cepstrum%.")
-	LIST_ITEM (L"• Intensity: To IntensityTier (peaks, valleys).")
-	LIST_ITEM (L"• Replaced Analysis and AnalysisEditor with @Manipulation and @ManipulationEditor.")
-	NORMAL (L"Phonology library:")
-	LIST_ITEM (L"• PairDistribution: Get percentage correct (maximum likelihood, probability matching).")
-	LIST_ITEM (L"• OTGrammar & PairDistribution: Get percentage correct...")
-	NORMAL (L"Graphics:")
-	LIST_ITEM (L"• Improved spectrogram drawing.")
-	LIST_ITEM (L"• @@Special symbols@: háček.")
-	LIST_ITEM (L"• Macintosh: improved screen rendition of rotated text.")
-	NORMAL (L"Audio:")
-	LIST_ITEM (L"• Macintosh: support for multiple audio input devices (sound cards).")
-	NORMAL (L"Statistics and numerics library:")
-	LIST_ITEM (L"• More statistics by David Weenink.")
-	LIST_ITEM (L"• Improved random numbers and other numerical stuff.")
-	LIST_ITEM (L"• @@Regular expressions at .")
-	NORMAL (L"Scripting:")
-	LIST_ITEM (L"• Formatting in variable substitution, e.g. 'pitch:2' gives two digits after the decimal point.")
-	LIST_ITEM (L"• Added ##fixed\\$ # to scripting language for formatting of numbers.")
-	NORMAL (L"Documentation:")
-	LIST_ITEM (L"• @@Multidimensional scaling@ tutorial.")
-	LIST_ITEM (L"• Enabled debugging-at-a-distance.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 3.9?", L"ppgb", 20001018)
-ENTRY (L"Praat 3.9, 18 October 2000")
-	NORMAL (L"Editors:")
-	LIST_ITEM (L"• Shift-click and shift-drag extend or shrink selection in editor windows.")
-	LIST_ITEM (L"• Grouped editors can have separate zooming and scrolling (FunctionEditor preferences).")
-	LIST_ITEM (L"• Cursor follows playing sound in editors; interruption by Escape key moves the cursor.")
-	LIST_ITEM (L"• TextGridEditor: optimized for transcribing large corpora: text field, directly movable boundaries, "
+	LIST_ITEM (U"• Intensity: To IntensityTier (peaks, valleys).")
+	LIST_ITEM (U"• Replaced Analysis and AnalysisEditor with @Manipulation and @ManipulationEditor.")
+	NORMAL (U"Phonology library:")
+	LIST_ITEM (U"• PairDistribution: Get percentage correct (maximum likelihood, probability matching).")
+	LIST_ITEM (U"• OTGrammar & PairDistribution: Get percentage correct...")
+	NORMAL (U"Graphics:")
+	LIST_ITEM (U"• Improved spectrogram drawing.")
+	LIST_ITEM (U"• @@Special symbols@: háček.")
+	LIST_ITEM (U"• Macintosh: improved screen rendition of rotated text.")
+	NORMAL (U"Audio:")
+	LIST_ITEM (U"• Macintosh: support for multiple audio input devices (sound cards).")
+	NORMAL (U"Statistics and numerics library:")
+	LIST_ITEM (U"• More statistics by David Weenink.")
+	LIST_ITEM (U"• Improved random numbers and other numerical stuff.")
+	LIST_ITEM (U"• @@Regular expressions at .")
+	NORMAL (U"Scripting:")
+	LIST_ITEM (U"• Formatting in variable substitution, e.g. 'pitch:2' gives two digits after the decimal point.")
+	LIST_ITEM (U"• Added ##fixed\\$ # to scripting language for formatting of numbers.")
+	NORMAL (U"Documentation:")
+	LIST_ITEM (U"• @@Multidimensional scaling@ tutorial.")
+	LIST_ITEM (U"• Enabled debugging-at-a-distance.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 3.9?", U"ppgb", 20001018)
+ENTRY (U"Praat 3.9, 18 October 2000")
+	NORMAL (U"Editors:")
+	LIST_ITEM (U"• Shift-click and shift-drag extend or shrink selection in editor windows.")
+	LIST_ITEM (U"• Grouped editors can have separate zooming and scrolling (FunctionEditor preferences).")
+	LIST_ITEM (U"• Cursor follows playing sound in editors; interruption by Escape key moves the cursor.")
+	LIST_ITEM (U"• TextGridEditor: optimized for transcribing large corpora: text field, directly movable boundaries, "
 		"more visible text in tiers, @SpellingChecker, "
 		"type while the sound is playing, complete keyboard navigation, control font size, control text alignment, "
 		"shift-click near boundary adds interval to selection.")
-	LIST_ITEM (L"• Stereo display in LongSound and TextGrid editors.")
-	LIST_ITEM (L"• LongSoundEditor and TextGridEditor: write selection to audio file.")
-	LIST_ITEM (L"• SoundEditor: added command \"Extract selection (preserve times)\".")
-	LIST_ITEM (L"• IntervalTierEditor, DurationTierEditor.")
-	LIST_ITEM (L"• Added many query commands in editors.")
-	NORMAL (L"Phonetics library:")
-	LIST_ITEM (L"• Sound: To Formant...: sample-rate-independent formant analysis.")
-	LIST_ITEM (L"• Sound: To Harmonicity (glottal-to-noise excitation ratio).")
-	LIST_ITEM (L"• Pitch: support for ERB units, draw all combinations of line/speckle and linear/logarithmic/semitones/mels/erbs, "
+	LIST_ITEM (U"• Stereo display in LongSound and TextGrid editors.")
+	LIST_ITEM (U"• LongSoundEditor and TextGridEditor: write selection to audio file.")
+	LIST_ITEM (U"• SoundEditor: added command \"Extract selection (preserve times)\".")
+	LIST_ITEM (U"• IntervalTierEditor, DurationTierEditor.")
+	LIST_ITEM (U"• Added many query commands in editors.")
+	NORMAL (U"Phonetics library:")
+	LIST_ITEM (U"• Sound: To Formant...: sample-rate-independent formant analysis.")
+	LIST_ITEM (U"• Sound: To Harmonicity (glottal-to-noise excitation ratio).")
+	LIST_ITEM (U"• Pitch: support for ERB units, draw all combinations of line/speckle and linear/logarithmic/semitones/mels/erbs, "
 		"optionally with TextGrid, Subtract linear fit.")
-	LIST_ITEM (L"• Spectrum: Draw along logarithmic frequency axis.")
-	LIST_ITEM (L"• TextGrid:  modification commands, Extract part, Shift to zero, Scale times (with Sound or LongSound).")
-	LIST_ITEM (L"• @@Matrix: To TableOfReal@, Draw contour...")
-	LIST_ITEM (L"• Concatenate Sound and LongSound objects.")
-	LIST_ITEM (L"• File formats: save PitchTier in spreadsheet format, read CGN syntax files (XML version), "
+	LIST_ITEM (U"• Spectrum: Draw along logarithmic frequency axis.")
+	LIST_ITEM (U"• TextGrid:  modification commands, Extract part, Shift to zero, Scale times (with Sound or LongSound).")
+	LIST_ITEM (U"• @@Matrix: To TableOfReal@, Draw contour...")
+	LIST_ITEM (U"• Concatenate Sound and LongSound objects.")
+	LIST_ITEM (U"• File formats: save PitchTier in spreadsheet format, read CGN syntax files (XML version), "
 		"text files now completely file-server-safe (independent from Windows/Macintosh/Unix line separators).")
-	NORMAL (L"Statistics and numerics library:")
-	LIST_ITEM (L"• @@Principal component analysis at .")
-	LIST_ITEM (L"• @@Discriminant analysis at .")
-	LIST_ITEM (L"• @Polynomial: drawing, @@Roots|root@ finding etc.")
-	LIST_ITEM (L"• @@TableOfReal: Draw box plots... at .")
-	LIST_ITEM (L"• @@Covariance: To TableOfReal (random sampling)... at .")
-	LIST_ITEM (L"• @@SSCP: Get sigma ellipse area... at .")
-	LIST_ITEM (L"• Query @DTW for 'weighted distance' of time warp.")
-	LIST_ITEM (L"• Distributions: To Strings (exact)...")
-	LIST_ITEM (L"• Strings: Randomize.")
-	NORMAL (L"Phonology library:")
-	LIST_ITEM (L"• OTGrammar: To PairDistribution.")
-	NORMAL (L"Graphics:")
-	LIST_ITEM (L"• Full support for colour inkjet printers on Windows and Macintosh.")
-	LIST_ITEM (L"• Full support for high-resolution colour clipboards and metafiles for "
+	NORMAL (U"Statistics and numerics library:")
+	LIST_ITEM (U"• @@Principal component analysis at .")
+	LIST_ITEM (U"• @@Discriminant analysis at .")
+	LIST_ITEM (U"• @Polynomial: drawing, @@Roots|root@ finding etc.")
+	LIST_ITEM (U"• @@TableOfReal: Draw box plots... at .")
+	LIST_ITEM (U"• @@Covariance: To TableOfReal (random sampling)... at .")
+	LIST_ITEM (U"• @@SSCP: Get sigma ellipse area... at .")
+	LIST_ITEM (U"• Query @DTW for 'weighted distance' of time warp.")
+	LIST_ITEM (U"• Distributions: To Strings (exact)...")
+	LIST_ITEM (U"• Strings: Randomize.")
+	NORMAL (U"Phonology library:")
+	LIST_ITEM (U"• OTGrammar: To PairDistribution.")
+	NORMAL (U"Graphics:")
+	LIST_ITEM (U"• Full support for colour inkjet printers on Windows and Macintosh.")
+	LIST_ITEM (U"• Full support for high-resolution colour clipboards and metafiles for "
 		"Windows and Macintosh programs that support them (this include MS Word "
 		"for Windows, but unfortunately not MS Word for Macintosh).")
-	LIST_ITEM (L"• Colour in EPS files.")
-	LIST_ITEM (L"• Interpolating grey images, i.e. better zoomed spectrograms.")
-	LIST_ITEM (L"• Linux: support for 24-bits screens.")
-	NORMAL (L"Audio:")
-	LIST_ITEM (L"• Asynchronous sound play.")
-	LIST_ITEM (L"• Linux: solved problems with /dev/mixer (\"Cannot read MIC gain.\") on many computers.")
-	LIST_ITEM (L"• Added possibility of zero padding for sound playing, "
+	LIST_ITEM (U"• Colour in EPS files.")
+	LIST_ITEM (U"• Interpolating grey images, i.e. better zoomed spectrograms.")
+	LIST_ITEM (U"• Linux: support for 24-bits screens.")
+	NORMAL (U"Audio:")
+	LIST_ITEM (U"• Asynchronous sound play.")
+	LIST_ITEM (U"• Linux: solved problems with /dev/mixer (\"Cannot read MIC gain.\") on many computers.")
+	LIST_ITEM (U"• Added possibility of zero padding for sound playing, "
 		"in order to reduce clicks on some Linux and Sun computers.")
-	LIST_ITEM (L"• LongSound supports mono and stereo, 8-bit and 16-bit, %\\mu-law and A-law, "
+	LIST_ITEM (U"• LongSound supports mono and stereo, 8-bit and 16-bit, %\\mu-law and A-law, "
 		"big-endian and little-endian, AIFC, WAV, NeXT/Sun, and NIST files.")
-	LIST_ITEM (L"• \"Read two Sounds from stereo file...\" supports 8-bit and 16-bit, %\\mu-law and A-law, "
+	LIST_ITEM (U"• \"Read two Sounds from stereo file...\" supports 8-bit and 16-bit, %\\mu-law and A-law, "
 		"big-endian and little-endian, AIFC, WAV, NeXT/Sun, and NIST files.")
-	LIST_ITEM (L"• SoundRecorder writes to 16-bit AIFC, WAV, NeXT/Sun, and NIST mono and stereo files.")
-	LIST_ITEM (L"• Sound & LongSound: write part or whole to mono or stereo audio file.")
-	LIST_ITEM (L"• Read Sound from raw Alaw file.")
-	LIST_ITEM (L"• Artword & Speaker (& Sound) movie: real time on all platforms.")
-	NORMAL (L"Scripting:")
-	LIST_ITEM (L"• @@Formulas 4. Mathematical functions@: added statistical functions: %\\ci^2, Student T, Fisher F, binomial, "
+	LIST_ITEM (U"• SoundRecorder writes to 16-bit AIFC, WAV, NeXT/Sun, and NIST mono and stereo files.")
+	LIST_ITEM (U"• Sound & LongSound: write part or whole to mono or stereo audio file.")
+	LIST_ITEM (U"• Read Sound from raw Alaw file.")
+	LIST_ITEM (U"• Artword & Speaker (& Sound) movie: real time on all platforms.")
+	NORMAL (U"Scripting:")
+	LIST_ITEM (U"• @@Formulas 4. Mathematical functions@: added statistical functions: %\\ci^2, Student T, Fisher F, binomial, "
 		"and their inverse functions.")
-	LIST_ITEM (L"• Windows: program #praatcon for use as a Unix-style console application.")
-	LIST_ITEM (L"• Windows and Unix: Praat can be run with a command-line interface without quitting on errors.")
-	LIST_ITEM (L"• Unix & Windows: can use <stdout> as a file name (supports pipes for binary data).")
-	LIST_ITEM (L"• @sendpraat now also for Macintosh.")
-	LIST_ITEM (L"• @@Scripting 6.7. Sending a message to another program|sendsocket at .")
-	LIST_ITEM (L"• @@Read from file...@ recognizes script files if they begin with \"\\# !\".")
-	LIST_ITEM (L"• Script links in @ManPages.")
-	NORMAL (L"Documentation")
-	LIST_ITEM (L"• Tutorials on all subjects available through @Intro.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 3.8?", L"ppgb", 19990112)
-ENTRY (L"Praat 3.8, 12 January 1999")
-	NORMAL (L"Phonetics library")
-	LIST_ITEM (L"• New objects: @LongSound (view and label long sound files), with editor; PairDistribution.")
-	LIST_ITEM (L"• @@Overlap-add@ manipulation of voiceless intervals, version 2: quality much better now; "
+	LIST_ITEM (U"• Windows: program #praatcon for use as a Unix-style console application.")
+	LIST_ITEM (U"• Windows and Unix: Praat can be run with a command-line interface without quitting on errors.")
+	LIST_ITEM (U"• Unix & Windows: can use <stdout> as a file name (supports pipes for binary data).")
+	LIST_ITEM (U"• @sendpraat now also for Macintosh.")
+	LIST_ITEM (U"• @@Scripting 6.7. Sending a message to another program|sendsocket at .")
+	LIST_ITEM (U"• @@Read from file...@ recognizes script files if they begin with \"\\# !\".")
+	LIST_ITEM (U"• Script links in @ManPages.")
+	NORMAL (U"Documentation")
+	LIST_ITEM (U"• Tutorials on all subjects available through @Intro.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 3.8?", U"ppgb", 19990112)
+ENTRY (U"Praat 3.8, 12 January 1999")
+	NORMAL (U"Phonetics library")
+	LIST_ITEM (U"• New objects: @LongSound (view and label long sound files), with editor; PairDistribution.")
+	LIST_ITEM (U"• @@Overlap-add@ manipulation of voiceless intervals, version 2: quality much better now; "
 		"target duration is exactly as expected from Duration tier or specified lengthening in @@Sound: Lengthen (overlap-add)... at .")
-	LIST_ITEM (L"• Audio: Escape key stops audio playing (on Mac also Command-period).")
-	LIST_ITEM (L"• @SoundRecorder: allows multiple recordings without close; Play button; Write buttons; buffer size can be set.")
-	LIST_ITEM (L"• Reverse a Sound or a selection of a Sound.")
-	LIST_ITEM (L"• @@Sound: Get nearest zero crossing... at .")
-	LIST_ITEM (L"• Formant: \"Scatter plot (reversed axes)...\".")
-	LIST_ITEM (L"• TextGrid & Pitch: \"Speckle separately...\".")
-	LIST_ITEM (L"• \"Extract Sound selection (preserve times)\" in TextGridEditor.")
-	LIST_ITEM (L"• More query commands for Matrix, TableOfReal, Spectrum, PointProcess.")
-	NORMAL (L"Phonology library")
-	LIST_ITEM (L"• 25-page OT learning tutorial.")
-	LIST_ITEM (L"• Made the OT learner 14 times as fast.")
-	NORMAL (L"Platforms")
-	LIST_ITEM (L"• May 23: Windows beta version.")
-	LIST_ITEM (L"• April 24: Windows alpha version.")
-	NORMAL (L"Files")
-	LIST_ITEM (L"• Read more Kay, Sun (.au), and WAV sound files.")
-	LIST_ITEM (L"• \"Read Strings from raw text file...\"")
-	LIST_ITEM (L"• @@Create Strings as file list... at .")
-	LIST_ITEM (L"• \"Read IntervalTier from Xwaves...\"")
-	LIST_ITEM (L"• hidden \"Read from old Windows Praat picture file...\"")
-	NORMAL (L"Graphics")
-	LIST_ITEM (L"• Use colours (instead of only greys) in \"Paint ellipse...\" etc.")
-	LIST_ITEM (L"• More true colours (maroon, lime, navy, teal, purple, olive).")
-	LIST_ITEM (L"• Direct printing from Macintosh to PostScript printers.")
-	LIST_ITEM (L"• Hyperpage printing to PostScript printers and PostScript files.")
-	LIST_ITEM (L"• Phonetic symbols: raising sign, lowering sign, script g, corner, ligature, pointing finger.")
-	NORMAL (L"Shell")
-	LIST_ITEM (L"• November 4: all dialogs are modeless (which is new for Unix and Mac).")
-	LIST_ITEM (L"• September 27: @sendpraat for Windows.")
-	NORMAL (L"Scripting")
-	LIST_ITEM (L"• January 7: scriptable editors.")
-	LIST_ITEM (L"• October 7: file I/O in scripts.")
-	LIST_ITEM (L"• August 23: script language includes all the important functions for string handling.")
-	LIST_ITEM (L"• June 24: string variables in scripts.")
-	LIST_ITEM (L"• June 22: faster look-up of script variables.")
-	LIST_ITEM (L"• June 22: unlimited number of script variables.")
-	LIST_ITEM (L"• April 5: suspended chopping of trailing spaces.")
-	LIST_ITEM (L"• March 29: enabled formulas as arguments to dialogs (also interactive).")
-MAN_END
-
-MAN_BEGIN (L"What was new in 3.7?", L"ppgb", 19980324)
-ENTRY (L"Praat 3.7, 24 March 1998")
-	NORMAL (L"Editors:")
-	LIST_ITEM (L"• In all FunctionEditors: drag to get a selection.")
-	NORMAL (L"Phonetics library:")
-	LIST_ITEM (L"• Many new query (#Get) commands for @Sound, @Intensity, @Harmonicity, @Pitch, "
+	LIST_ITEM (U"• Audio: Escape key stops audio playing (on Mac also Command-period).")
+	LIST_ITEM (U"• @SoundRecorder: allows multiple recordings without close; Play button; Write buttons; buffer size can be set.")
+	LIST_ITEM (U"• Reverse a Sound or a selection of a Sound.")
+	LIST_ITEM (U"• @@Sound: Get nearest zero crossing... at .")
+	LIST_ITEM (U"• Formant: \"Scatter plot (reversed axes)...\".")
+	LIST_ITEM (U"• TextGrid & Pitch: \"Speckle separately...\".")
+	LIST_ITEM (U"• \"Extract Sound selection (preserve times)\" in TextGridEditor.")
+	LIST_ITEM (U"• More query commands for Matrix, TableOfReal, Spectrum, PointProcess.")
+	NORMAL (U"Phonology library")
+	LIST_ITEM (U"• 25-page OT learning tutorial.")
+	LIST_ITEM (U"• Made the OT learner 14 times as fast.")
+	NORMAL (U"Platforms")
+	LIST_ITEM (U"• May 23: Windows beta version.")
+	LIST_ITEM (U"• April 24: Windows alpha version.")
+	NORMAL (U"Files")
+	LIST_ITEM (U"• Read more Kay, Sun (.au), and WAV sound files.")
+	LIST_ITEM (U"• \"Read Strings from raw text file...\"")
+	LIST_ITEM (U"• @@Create Strings as file list... at .")
+	LIST_ITEM (U"• \"Read IntervalTier from Xwaves...\"")
+	LIST_ITEM (U"• hidden \"Read from old Windows Praat picture file...\"")
+	NORMAL (U"Graphics")
+	LIST_ITEM (U"• Use colours (instead of only greys) in \"Paint ellipse...\" etc.")
+	LIST_ITEM (U"• More true colours (maroon, lime, navy, teal, purple, olive).")
+	LIST_ITEM (U"• Direct printing from Macintosh to PostScript printers.")
+	LIST_ITEM (U"• Hyperpage printing to PostScript printers and PostScript files.")
+	LIST_ITEM (U"• Phonetic symbols: raising sign, lowering sign, script g, corner, ligature, pointing finger.")
+	NORMAL (U"Shell")
+	LIST_ITEM (U"• November 4: all dialogs are modeless (which is new for Unix and Mac).")
+	LIST_ITEM (U"• September 27: @sendpraat for Windows.")
+	NORMAL (U"Scripting")
+	LIST_ITEM (U"• January 7: scriptable editors.")
+	LIST_ITEM (U"• October 7: file I/O in scripts.")
+	LIST_ITEM (U"• August 23: script language includes all the important functions for string handling.")
+	LIST_ITEM (U"• June 24: string variables in scripts.")
+	LIST_ITEM (U"• June 22: faster look-up of script variables.")
+	LIST_ITEM (U"• June 22: unlimited number of script variables.")
+	LIST_ITEM (U"• April 5: suspended chopping of trailing spaces.")
+	LIST_ITEM (U"• March 29: enabled formulas as arguments to dialogs (also interactive).")
+MAN_END
+
+MAN_BEGIN (U"What was new in 3.7?", U"ppgb", 19980324)
+ENTRY (U"Praat 3.7, 24 March 1998")
+	NORMAL (U"Editors:")
+	LIST_ITEM (U"• In all FunctionEditors: drag to get a selection.")
+	NORMAL (U"Phonetics library:")
+	LIST_ITEM (U"• Many new query (#Get) commands for @Sound, @Intensity, @Harmonicity, @Pitch, "
 		"@Formant, @Ltas, @PitchTier, @IntensityTier, @DurationTier, #FormantTier.")
-	LIST_ITEM (L"• Many new modification commands.")
-	LIST_ITEM (L"• Many new interpolations.")
-	LIST_ITEM (L"• Sound enhancements: @@Sound: Lengthen (overlap-add)...@, @@Sound: Deepen band modulation...@")
-	LIST_ITEM (L"• @@Source-filter synthesis@ tutorial, @@Sound & IntensityTier: Multiply@, "
+	LIST_ITEM (U"• Many new modification commands.")
+	LIST_ITEM (U"• Many new interpolations.")
+	LIST_ITEM (U"• Sound enhancements: @@Sound: Lengthen (overlap-add)...@, @@Sound: Deepen band modulation...@")
+	LIST_ITEM (U"• @@Source-filter synthesis@ tutorial, @@Sound & IntensityTier: Multiply@, "
 		"##Sound & FormantTier: Filter#, @@Formant: Formula (frequencies)...@, @@Sound: Pre-emphasize (in-line)... at .")
-	NORMAL (L"Labelling")
-	LIST_ITEM (L"• TextGrid queries (#Get times and labels in a script).")
-	LIST_ITEM (L"• @@TextGrid: Count labels... at .")
-	LIST_ITEM (L"• @@PointProcess: To TextGrid (vuv)...@: get voiced/unvoiced information from a point process.")
-	LIST_ITEM (L"• IntervalTier to TableOfReal: labels become row labels.")
-	LIST_ITEM (L"• TextTier to TableOfReal.")
-	NORMAL (L"Numerics and statistics library")
-	LIST_ITEM (L"• Multidimensional scaling (Kruskal, INDSCAL, etc).")
-	LIST_ITEM (L"• @TableOfReal: Set value, Formula, Remove column, Insert column, Draw as squares, To Matrix.")
-	NORMAL (L"Phonology library")
-	LIST_ITEM (L"• OT learning: new strategies: weighted symmetric plasticity (uncancelled or all).")
-	NORMAL (L"Praat shell")
-	LIST_ITEM (L"• First Linux version.")
-	LIST_ITEM (L"• Eight new functions like e.g. %hertzToBark in @@Formulas 4. Mathematical functions at .")
-	LIST_ITEM (L"• @@Praat script@: procedure arguments; object names.")
-	NORMAL (L"Documentation:")
-	LIST_ITEM (L"• 230 more man pages (now 630).")
-	LIST_ITEM (L"• Hypertext: increased readability of formulas, navigation with keyboard.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 3.6?", L"ppgb", 19971027)
-ENTRY (L"Praat 3.6, 27 October 1997")
-	NORMAL (L"Editors:")
-	LIST_ITEM (L"• Intuitive position of B and E buttons on left-handed mice.")
-	LIST_ITEM (L"• @SoundEditor: copy %windowed selection to list of objects.")
-	LIST_ITEM (L"• @SoundEditor: undo Cut, Paste, Zero.")
-	LIST_ITEM (L"• @SpectrumEditor: copy band-filtered spectrum or sound to list of objects.")
-	LIST_ITEM (L"• @ManipulationEditor: LPC-based pitch manipulation.")
-	NORMAL (L"Objects:")
-	LIST_ITEM (L"• Use '-', and '+' in object names.")
-	NORMAL (L"Phonetics library")
-	LIST_ITEM (L"• LPC-based resynthesis in @ManipulationEditor.")
-	LIST_ITEM (L"• @Sound: direct modification without formulas (addition, multiplication, windowing)")
-	LIST_ITEM (L"• @Sound: filtering in spectral domain by formula.")
-	LIST_ITEM (L"• Create a simple @Pitch object from a @PitchTier (for %F__0_) and a @Pitch (for V/U).")
-	LIST_ITEM (L"• Semitones in @PitchTier tables.")
-	LIST_ITEM (L"• @PointProcess: transplant time domain from @Sound.")
-	LIST_ITEM (L"• Much more...")
-	NORMAL (L"Phonology library")
-	LIST_ITEM (L"• Computational Optimality Theory. See @@OT learning at .")
-	NORMAL (L"Hypertext")
-	LIST_ITEM (L"• You can use @ManPages files for creating your own tutorials. "
+	NORMAL (U"Labelling")
+	LIST_ITEM (U"• TextGrid queries (#Get times and labels in a script).")
+	LIST_ITEM (U"• @@TextGrid: Count labels... at .")
+	LIST_ITEM (U"• @@PointProcess: To TextGrid (vuv)...@: get voiced/unvoiced information from a point process.")
+	LIST_ITEM (U"• IntervalTier to TableOfReal: labels become row labels.")
+	LIST_ITEM (U"• TextTier to TableOfReal.")
+	NORMAL (U"Numerics and statistics library")
+	LIST_ITEM (U"• Multidimensional scaling (Kruskal, INDSCAL, etc).")
+	LIST_ITEM (U"• @TableOfReal: Set value, Formula, Remove column, Insert column, Draw as squares, To Matrix.")
+	NORMAL (U"Phonology library")
+	LIST_ITEM (U"• OT learning: new strategies: weighted symmetric plasticity (uncancelled or all).")
+	NORMAL (U"Praat shell")
+	LIST_ITEM (U"• First Linux version.")
+	LIST_ITEM (U"• Eight new functions like e.g. %hertzToBark in @@Formulas 4. Mathematical functions at .")
+	LIST_ITEM (U"• @@Praat script@: procedure arguments; object names.")
+	NORMAL (U"Documentation:")
+	LIST_ITEM (U"• 230 more man pages (now 630).")
+	LIST_ITEM (U"• Hypertext: increased readability of formulas, navigation with keyboard.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 3.6?", U"ppgb", 19971027)
+ENTRY (U"Praat 3.6, 27 October 1997")
+	NORMAL (U"Editors:")
+	LIST_ITEM (U"• Intuitive position of B and E buttons on left-handed mice.")
+	LIST_ITEM (U"• @SoundEditor: copy %windowed selection to list of objects.")
+	LIST_ITEM (U"• @SoundEditor: undo Cut, Paste, Zero.")
+	LIST_ITEM (U"• @SpectrumEditor: copy band-filtered spectrum or sound to list of objects.")
+	LIST_ITEM (U"• @ManipulationEditor: LPC-based pitch manipulation.")
+	NORMAL (U"Objects:")
+	LIST_ITEM (U"• Use '-', and '+' in object names.")
+	NORMAL (U"Phonetics library")
+	LIST_ITEM (U"• LPC-based resynthesis in @ManipulationEditor.")
+	LIST_ITEM (U"• @Sound: direct modification without formulas (addition, multiplication, windowing)")
+	LIST_ITEM (U"• @Sound: filtering in spectral domain by formula.")
+	LIST_ITEM (U"• Create a simple @Pitch object from a @PitchTier (for %F__0_) and a @Pitch (for V/U).")
+	LIST_ITEM (U"• Semitones in @PitchTier tables.")
+	LIST_ITEM (U"• @PointProcess: transplant time domain from @Sound.")
+	LIST_ITEM (U"• Much more...")
+	NORMAL (U"Phonology library")
+	LIST_ITEM (U"• Computational Optimality Theory. See @@OT learning at .")
+	NORMAL (U"Hypertext")
+	LIST_ITEM (U"• You can use @ManPages files for creating your own tutorials. "
 		"These contains buttons for playing and recording sounds, so you can use this for creating "
 		"an interactive IPA sound training course.")
-	NORMAL (L"Scripting:")
-	LIST_ITEM (L"• Programmable @@Praat script@ language: variables, expressions, control structures, "
+	NORMAL (U"Scripting:")
+	LIST_ITEM (U"• Programmable @@Praat script@ language: variables, expressions, control structures, "
 		"procedures, complete dialog box, exchange of information with Info window, continuation lines.")
-	LIST_ITEM (L"• Use platform-independent relative file paths in @@Praat script at .")
-	LIST_ITEM (L"• @ScriptEditor: Run selection.")
-	NORMAL (L"Graphics:")
-	LIST_ITEM (L"• Rotation and scaling while printing the @@Picture window at .")
-	LIST_ITEM (L"• Apart from bold and italic, now also bold-italic (see @@Text styles@).")
-	LIST_ITEM (L"• Rounded rectangles.")
-	LIST_ITEM (L"• Conversion of millimetres and world coordinates.")
-	LIST_ITEM (L"• Measurement of text widths (screen and PostScript).")
-	NORMAL (L"Unix:")
-	LIST_ITEM (L"• Use the @sendpraat program for sending messages to running Praat programs.")
-	NORMAL (L"Mac:")
-	LIST_ITEM (L"• Praat looks best with the new and beautiful System 8.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 3.5?", L"ppgb", 19970527)
-ENTRY (L"Praat 3.5, 27 May 1997")
-	NORMAL (L"New editors:")
-	LIST_ITEM (L"• #TextGridEditor replaces and extends LabelEditor: edit points as well as intervals.")
-	LIST_ITEM (L"• #AnalysisEditor replaces and extends PsolaEditor: view pitch, spectrum, formant, and intensity "
+	LIST_ITEM (U"• Use platform-independent relative file paths in @@Praat script at .")
+	LIST_ITEM (U"• @ScriptEditor: Run selection.")
+	NORMAL (U"Graphics:")
+	LIST_ITEM (U"• Rotation and scaling while printing the @@Picture window at .")
+	LIST_ITEM (U"• Apart from bold and italic, now also bold-italic (see @@Text styles@).")
+	LIST_ITEM (U"• Rounded rectangles.")
+	LIST_ITEM (U"• Conversion of millimetres and world coordinates.")
+	LIST_ITEM (U"• Measurement of text widths (screen and PostScript).")
+	NORMAL (U"Unix:")
+	LIST_ITEM (U"• Use the @sendpraat program for sending messages to running Praat programs.")
+	NORMAL (U"Mac:")
+	LIST_ITEM (U"• Praat looks best with the new and beautiful System 8.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 3.5?", U"ppgb", 19970527)
+ENTRY (U"Praat 3.5, 27 May 1997")
+	NORMAL (U"New editors:")
+	LIST_ITEM (U"• #TextGridEditor replaces and extends LabelEditor: edit points as well as intervals.")
+	LIST_ITEM (U"• #AnalysisEditor replaces and extends PsolaEditor: view pitch, spectrum, formant, and intensity "
 		"analyses in a single window, and allow pitch and duration resynthesis by overlap-add and more (would be undone in 3.9.19).")
-	LIST_ITEM (L"• #SpectrumEditor allows you to view and edit spectra.")
-	NORMAL (L"Praat shell:")
-	LIST_ITEM (L"• ##History mechanism# remembers all the commands that you have chosen, "
+	LIST_ITEM (U"• #SpectrumEditor allows you to view and edit spectra.")
+	NORMAL (U"Praat shell:")
+	LIST_ITEM (U"• ##History mechanism# remembers all the commands that you have chosen, "
 		"and allows you to put them into a script.")
-	LIST_ITEM (L"• #ScriptEditor allows you to edit and run any Praat script, and to put it under a button.")
-	LIST_ITEM (L"• All added and removed buttons are remembered across sessions.")
-	LIST_ITEM (L"• #ButtonEditor allows you to make buttons visible or invisible.")
-	NORMAL (L"Evaluations:")
-	LIST_ITEM (L"• In his 1996 doctoral thesis, Henning Reetz "
+	LIST_ITEM (U"• #ScriptEditor allows you to edit and run any Praat script, and to put it under a button.")
+	LIST_ITEM (U"• All added and removed buttons are remembered across sessions.")
+	LIST_ITEM (U"• #ButtonEditor allows you to make buttons visible or invisible.")
+	NORMAL (U"Evaluations:")
+	LIST_ITEM (U"• In his 1996 doctoral thesis, Henning Reetz "
 		"compared five pitch analysis routines; @@Sound: To Pitch (ac)...@ appeared to make the fewest errors. "
 		"H. Reetz (1996): %%Pitch Perception in Speech: a Time Domain Approach%, Studies in Language and Language Use #26, "
 		"IFOTT, Amsterdam (ICG Printing, Dordrecht).")
-	NORMAL (L"Documentation:")
-	LIST_ITEM (L"• 140 more man pages (now 330).")
-	LIST_ITEM (L"• Tables and pictures in manual.")
-	LIST_ITEM (L"• Printing the entire manual.")
-	LIST_ITEM (L"• Logo.")
-	NORMAL (L"New types:")
-	LIST_ITEM (L"• Labelling & segmentation: #TextGrid, #IntervalTier, #TextTier.")
-	LIST_ITEM (L"• Analysis & manipulation: #Analysis.")
-	LIST_ITEM (L"• Statistics: #TableOfReal, #Distributions, #Transition")
-	NORMAL (L"File formats:")
-	LIST_ITEM (L"• Read and write rational numbers in text files.")
-	LIST_ITEM (L"• Read 8-bit .au sound files.")
-	LIST_ITEM (L"• Read and write raw 8-bit two\'s-complement and offset-binary sound files.")
-	NORMAL (L"Audio:")
-	LIST_ITEM (L"• 16-bit interactive Sound I/O on Mac.")
-	LIST_ITEM (L"• Record sounds at 9.8 kHz on SGI.")
-	NORMAL (L"New commands:")
-	LIST_ITEM (L"• Two more pitch-analysis routines.")
-	LIST_ITEM (L"• Sound to PointProcess: collect all maxima, minima, zero crossings.")
-	LIST_ITEM (L"• PointProcess: set calculus.")
-	LIST_ITEM (L"• TextGrid: extract time-point information.")
-	LIST_ITEM (L"• Compute pitch or formants at given time points.")
-	LIST_ITEM (L"• Put pitch, formants etc. in tables en get statistics.")
-	LIST_ITEM (L"• Many more...")
-	NORMAL (L"Macintosh:")
-	LIST_ITEM (L"• 16-bit interactive sound I/O.")
-	LIST_ITEM (L"• Fast and interpolating spectrogram drawing.")
-	LIST_ITEM (L"• Phonetic Mac screen font included in source code (as a fallback to using SIL Doulos IPA).")
-	LIST_ITEM (L"• Keyboard shortcuts, text editor, help under question mark, etc.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 3.3?", L"ppgb", 19961006)
-ENTRY (L"Praat 3.3, 6 October 1996")
-	LIST_ITEM (L"• Documentation: hypertext help browser, including the first 190 man pages.")
-	LIST_ITEM (L"• New editors: type #TextTier for labelling times instead of intervals.")
-	LIST_ITEM (L"• New actions: #Formant: Viterbi tracker, Statistics menu, Scatter plot.")
-	LIST_ITEM (L"• Evaluation: For HNR analysis of speech, the cross-correlation method, "
+	NORMAL (U"Documentation:")
+	LIST_ITEM (U"• 140 more man pages (now 330).")
+	LIST_ITEM (U"• Tables and pictures in manual.")
+	LIST_ITEM (U"• Printing the entire manual.")
+	LIST_ITEM (U"• Logo.")
+	NORMAL (U"New types:")
+	LIST_ITEM (U"• Labelling & segmentation: #TextGrid, #IntervalTier, #TextTier.")
+	LIST_ITEM (U"• Analysis & manipulation: #Analysis.")
+	LIST_ITEM (U"• Statistics: #TableOfReal, #Distributions, #Transition")
+	NORMAL (U"File formats:")
+	LIST_ITEM (U"• Read and write rational numbers in text files.")
+	LIST_ITEM (U"• Read 8-bit .au sound files.")
+	LIST_ITEM (U"• Read and write raw 8-bit two\'s-complement and offset-binary sound files.")
+	NORMAL (U"Audio:")
+	LIST_ITEM (U"• 16-bit interactive Sound I/O on Mac.")
+	LIST_ITEM (U"• Record sounds at 9.8 kHz on SGI.")
+	NORMAL (U"New commands:")
+	LIST_ITEM (U"• Two more pitch-analysis routines.")
+	LIST_ITEM (U"• Sound to PointProcess: collect all maxima, minima, zero crossings.")
+	LIST_ITEM (U"• PointProcess: set calculus.")
+	LIST_ITEM (U"• TextGrid: extract time-point information.")
+	LIST_ITEM (U"• Compute pitch or formants at given time points.")
+	LIST_ITEM (U"• Put pitch, formants etc. in tables en get statistics.")
+	LIST_ITEM (U"• Many more...")
+	NORMAL (U"Macintosh:")
+	LIST_ITEM (U"• 16-bit interactive sound I/O.")
+	LIST_ITEM (U"• Fast and interpolating spectrogram drawing.")
+	LIST_ITEM (U"• Phonetic Mac screen font included in source code (as a fallback to using SIL Doulos IPA).")
+	LIST_ITEM (U"• Keyboard shortcuts, text editor, help under question mark, etc.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 3.3?", U"ppgb", 19961006)
+ENTRY (U"Praat 3.3, 6 October 1996")
+	LIST_ITEM (U"• Documentation: hypertext help browser, including the first 190 man pages.")
+	LIST_ITEM (U"• New editors: type #TextTier for labelling times instead of intervals.")
+	LIST_ITEM (U"• New actions: #Formant: Viterbi tracker, Statistics menu, Scatter plot.")
+	LIST_ITEM (U"• Evaluation: For HNR analysis of speech, the cross-correlation method, "
 		"which has a sensitivity of 60 dB and a typical time resolution of 12 milliseconds, "
 		"must be considered better than the autocorrelation method, "
 		"which has a better sensitivity (80 dB), but a much worse time resolution (30 ms). "
 		"For pitch analysis, the autocorrelation method still beats the cross-correlation method "
 		"because of its better resistance against noise and echos, "
 		"and despite its marginally poorer resolution (15 vs. 12 ms).")
-	LIST_ITEM (L"• User preferences are saved across sessions.")
-	LIST_ITEM (L"• The phonetic X screen font included in the source code.")
-	LIST_ITEM (L"• Xwindows resources included in the source code")
-	LIST_ITEM (L"• Graphics: eight colours, small caps, text rotation.")
-	LIST_ITEM (L"• File formats: Sun/NexT mu-law files, raw matrix text files, Xwaves mark files.")
-	LIST_ITEM (L"• Accelerations: keyboard shortcuts, faster dynamic menu, Shift-OK keeps file selector on screen.")
-	LIST_ITEM (L"• Object type changes: #StylPitch and #MarkTier are now called #PitchTier and #TextTier, respectively. "
+	LIST_ITEM (U"• User preferences are saved across sessions.")
+	LIST_ITEM (U"• The phonetic X screen font included in the source code.")
+	LIST_ITEM (U"• Xwindows resources included in the source code")
+	LIST_ITEM (U"• Graphics: eight colours, small caps, text rotation.")
+	LIST_ITEM (U"• File formats: Sun/NexT mu-law files, raw matrix text files, Xwaves mark files.")
+	LIST_ITEM (U"• Accelerations: keyboard shortcuts, faster dynamic menu, Shift-OK keeps file selector on screen.")
+	LIST_ITEM (U"• Object type changes: #StylPitch and #MarkTier are now called #PitchTier and #TextTier, respectively. "
 		"Old files can still be read.")
-	LIST_ITEM (L"• Script warning: all times in dialogs are in seconds now: milliseconds have gone.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 3.2?", L"ppgb", 19960429)
-ENTRY (L"Praat 3.2, 29 April 1996")
-	LIST_ITEM (L"• Sound I/O for HPUX, Sun Sparc 5, and Sun Sparc LX.")
-	LIST_ITEM (L"• Cross-correlation pitch and HNR analysis.")
-	LIST_ITEM (L"• Facilities for generating tables from scripts.")
-	LIST_ITEM (L"• Editing and playing stylized pitch contours and point processes.")
-	LIST_ITEM (L"• Overlap-add pitch manipulation.")
-	LIST_ITEM (L"• Spectral smoothing techniques: cepstrum and LPC.")
-	LIST_ITEM (L"• Time-domain pitch analysis with jitter measurement.")
-	LIST_ITEM (L"• Read and write Bell-Labs sound files and Kay CSL audio files.")
-	LIST_ITEM (L"• Replaced IpaTimes font by free SILDoulos-IPA font, and embedded phonetic font in PostScript picture.")
-	LIST_ITEM (L"• Completed main phonetic characters.")
-MAN_END
-
-MAN_BEGIN (L"What was new in 3.1?", L"ppgb", 19951205)
-ENTRY (L"Praat 3.1, 5 December 1995")
-	LIST_ITEM (L"• Add and remove buttons dynamically.")
-	LIST_ITEM (L"• DataEditor (Inspect button).")
-	LIST_ITEM (L"• Initialization scripts.")
-	LIST_ITEM (L"• Logarithmic axes.")
-	LIST_ITEM (L"• Call remote ADDA server directly.")
+	LIST_ITEM (U"• Script warning: all times in dialogs are in seconds now: milliseconds have gone.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 3.2?", U"ppgb", 19960429)
+ENTRY (U"Praat 3.2, 29 April 1996")
+	LIST_ITEM (U"• Sound I/O for HPUX, Sun Sparc 5, and Sun Sparc LX.")
+	LIST_ITEM (U"• Cross-correlation pitch and HNR analysis.")
+	LIST_ITEM (U"• Facilities for generating tables from scripts.")
+	LIST_ITEM (U"• Editing and playing stylized pitch contours and point processes.")
+	LIST_ITEM (U"• Overlap-add pitch manipulation.")
+	LIST_ITEM (U"• Spectral smoothing techniques: cepstrum and LPC.")
+	LIST_ITEM (U"• Time-domain pitch analysis with jitter measurement.")
+	LIST_ITEM (U"• Read and write Bell-Labs sound files and Kay CSL audio files.")
+	LIST_ITEM (U"• Replaced IpaTimes font by free SILDoulos-IPA font, and embedded phonetic font in PostScript picture.")
+	LIST_ITEM (U"• Completed main phonetic characters.")
+MAN_END
+
+MAN_BEGIN (U"What was new in 3.1?", U"ppgb", 19951205)
+ENTRY (U"Praat 3.1, 5 December 1995")
+	LIST_ITEM (U"• Add and remove buttons dynamically.")
+	LIST_ITEM (U"• DataEditor (Inspect button).")
+	LIST_ITEM (U"• Initialization scripts.")
+	LIST_ITEM (U"• Logarithmic axes.")
+	LIST_ITEM (U"• Call remote ADDA server directly.")
 MAN_END
 /*
    BUGBASE
@@ -1667,264 +1737,265 @@ MAN_END
 >option only works for dotted and dashed lines.  It's ignored for plain
 >lines (and is WAY too wide).
 
-ENTRY (L"To do")
-	LIST_ITEM (L"• TextGrid & Sound: Extract intervals with margins.")
-	LIST_ITEM (L"• Spectrum: draw power, re, im, phase.")
-	LIST_ITEM (L"• Formant: To Spectrum (slice)... (combines Formant-to-LPC and LPC-to-Spectrum-slice)")
-	LIST_ITEM (L"• Read and/or write Matlab files, MBROLA files, Xwaves files, CHAT files.") // Aix
-	LIST_ITEM (L"• Matrix: draw numbers.")
-	LIST_ITEM (L"• Fractions with \\bsf{a|b}.")
-	LIST_ITEM (L"• Move objects up and down list.")
-	LIST_ITEM (L"• Spectrogram cross-correlation.")
-	LIST_ITEM (L"• Labels in AIFC file.") // Theo Veenker 19980323
-	LIST_ITEM (L"• Improve scrolling and add selection in hyperpages.")
-	LIST_ITEM (L"• Segment spectrograph?") // Ton Wempe, Jul 16 1996
-	LIST_ITEM (L"• Phoneme-to-articulation conversion??") // Mirjam Ernestus, Jul 1 1996
-ENTRY (L"Known bugs in the Windows version")
-	LIST_ITEM (L"• Cannot stand infinitesimal zooming in SpectrogramEditor.")
-	LIST_ITEM (L"• Clipboards with greys sometimes become black-and-white after use of colour.")
-ENTRY (L"Known bugs in the Linux version")
-	LIST_ITEM (L"• Sounds shorter than 200 ms do not always play (workaround: add zeroes in prefs).")
-	LIST_ITEM (L"• Keyboard shortcuts do not work if NumLock is on.")
+ENTRY (U"To do")
+	LIST_ITEM (U"• TextGrid & Sound: Extract intervals with margins.")
+	LIST_ITEM (U"• Spectrum: draw power, re, im, phase.")
+	LIST_ITEM (U"• Formant: To Spectrum (slice)... (combines Formant-to-LPC and LPC-to-Spectrum-slice)")
+	LIST_ITEM (U"• Read and/or write Matlab files, MBROLA files, Xwaves files, CHAT files.") // Aix
+	LIST_ITEM (U"• Matrix: draw numbers.")
+	LIST_ITEM (U"• Fractions with \\bsf{a|b}.")
+	LIST_ITEM (U"• Move objects up and down list.")
+	LIST_ITEM (U"• Spectrogram cross-correlation.")
+	LIST_ITEM (U"• Labels in AIFC file.") // Theo Veenker 19980323
+	LIST_ITEM (U"• Improve scrolling and add selection in hyperpages.")
+	LIST_ITEM (U"• Segment spectrograph?") // Ton Wempe, Jul 16 1996
+	LIST_ITEM (U"• Phoneme-to-articulation conversion??") // Mirjam Ernestus, Jul 1 1996
+ENTRY (U"Known bugs in the Windows version")
+	LIST_ITEM (U"• Cannot stand infinitesimal zooming in SpectrogramEditor.")
+	LIST_ITEM (U"• Clipboards with greys sometimes become black-and-white after use of colour.")
+ENTRY (U"Known bugs in the Linux version")
+	LIST_ITEM (U"• Sounds shorter than 200 ms do not always play (workaround: add zeroes in prefs).")
+	LIST_ITEM (U"• Keyboard shortcuts do not work if NumLock is on.")
 */
  
-MAN_BEGIN (L"Acknowledgments", L"ppgb", 20140930)
-NORMAL (L"The following people contributed source code to Praat:")
-LIST_ITEM (L"Paul Boersma: user interface, graphics, @printing, @@Intro|sound@, "
+MAN_BEGIN (U"Acknowledgments", U"ppgb", 20150828)
+NORMAL (U"The following people contributed source code to Praat:")
+LIST_ITEM (U"Paul Boersma: user interface, graphics, @printing, @@Intro|sound@, "
 	"@@Intro 3. Spectral analysis|spectral analysis@, @@Intro 4. Pitch analysis|pitch analysis@, "
 	"@@Intro 5. Formant analysis|formant analysis@, @@Intro 6. Intensity analysis|intensity analysis@, "
 	"@@Intro 7. Annotation|annotation@, @@Intro 8. Manipulation|speech manipulation@, @@voice|voice report@, "
 	"@@ExperimentMFC|listening experiments@, "
 	"@@articulatory synthesis@, @@OT learning|optimality-theoretic learning@, "
 	"tables, @formulas, @scripting, and adaptation of PortAudio, GLPK, and regular expressions.")
-LIST_ITEM (L"David Weenink: "
+LIST_ITEM (U"David Weenink: "
 	"@@feedforward neural networks@, @@principal component analysis@, @@multidimensional scaling@, @@discriminant analysis@, @LPC, "
 	"@VowelEditor, "
 	"and adaptation of GSL, LAPACK, fftpack, regular expressions, and Espeak.")
-LIST_ITEM (L"Stefan de Konink and Franz Brauße: major help in port to GTK.")
-LIST_ITEM (L"Tom Naughton: major help in port to Cocoa.")
-LIST_ITEM (L"Erez Volk: adaptation of FLAC and MAD.")
-LIST_ITEM (L"Ola Söder: @@kNN classifiers@, @@k-means clustering at .")
-LIST_ITEM (L"Rafael Laboissière: adaptation of XIPA, audio bug fixes for Linux.")
-LIST_ITEM (L"Darryl Purnell created the first version of audio for Praat for Linux.")
-NORMAL (L"We included the following freely available software libraries in Praat (sometimes with adaptations):")
-LIST_ITEM (L"XIPA: IPA font for Unix by Fukui Rei (GPL).")
-LIST_ITEM (L"GSL: GNU Scientific Library by Gerard Jungman and Brian Gough (GPL).")
-LIST_ITEM (L"GLPK: GNU Linear Programming Kit by Andrew Makhorin (GPL).")
-LIST_ITEM (L"PortAudio: Portable Audio Library by Ross Bencina, Phil Burk, Bjorn Roche, Dominic Mazzoni, Darren Gibbs.")
-LIST_ITEM (L"Espeak: text-to-speech synthesizer by Jonathan Duddington (GPL).")
-LIST_ITEM (L"MAD: MPEG Audio Decoder by Underbit Technologies (GPL).")
-LIST_ITEM (L"FLAC: Free Lossless Audio Codec by Josh Coalson.")
-LIST_ITEM (L"fftpack: public domain Fourier transforms by Paul Swarztrauber and Monty.")
-LIST_ITEM (L"LAPACK: public domain numeric algorithms by Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., "
+LIST_ITEM (U"Stefan de Konink and Franz Brauße: major help in port to GTK.")
+LIST_ITEM (U"Tom Naughton: major help in port to Cocoa.")
+LIST_ITEM (U"Erez Volk: adaptation of FLAC and MAD.")
+LIST_ITEM (U"Ola Söder: @@kNN classifiers@, @@k-means clustering at .")
+LIST_ITEM (U"Rafael Laboissière: adaptation of XIPA, audio bug fixes for Linux.")
+LIST_ITEM (U"Darryl Purnell created the first version of audio for Praat for Linux.")
+NORMAL (U"We included the following freely available software libraries in Praat (sometimes with adaptations):")
+LIST_ITEM (U"XIPA: IPA font for Unix by Fukui Rei (GPL).")
+LIST_ITEM (U"GSL: GNU Scientific Library by Gerard Jungman and Brian Gough (GPL).")
+LIST_ITEM (U"GLPK: GNU Linear Programming Kit by Andrew Makhorin (GPL).")
+LIST_ITEM (U"PortAudio: Portable Audio Library by Ross Bencina, Phil Burk, Bjorn Roche, Dominic Mazzoni, Darren Gibbs.")
+LIST_ITEM (U"Espeak: text-to-speech synthesizer by Jonathan Duddington (GPL).")
+LIST_ITEM (U"MAD: MPEG Audio Decoder by Underbit Technologies (GPL).")
+LIST_ITEM (U"FLAC: Free Lossless Audio Codec by Josh Coalson.")
+LIST_ITEM (U"fftpack: public domain Fourier transforms by Paul Swarztrauber and Monty.")
+LIST_ITEM (U"LAPACK: public domain numeric algorithms by Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., "
 	"Courant Institute, Argonne National Lab, and Rice University.")
-LIST_ITEM (L"Regular expressions by Henry Spencer, Mark Edel, Christopher Conrad, Eddy De Greef (GPL).")
-NORMAL (L"For technical support and advice:")
-LIST_ITEM (L"Ton Wempe, Dirk Jan Vet.")
-NORMAL (L"For their financial support during the development of Praat:")
-LIST_ITEM (L"Netherlands Organization for Scientific Research (NWO) (1996–1999).")
-LIST_ITEM (L"Nederlandse Taalunie (2006–2008).")
-LIST_ITEM (L"Talkbank project, Carnegie Mellon / Linguistic Data Consortium (2002–2003).")
-LIST_ITEM (L"Stichting Spraaktechnologie (2014–2016).")
-LIST_ITEM (L"Spoken Dutch Corpus (CGN) (1999–2001).")
-LIST_ITEM (L"Laboratorium Experimentele OtoRhinoLaryngologie, KU Leuven.")
-LIST_ITEM (L"DFG-Projekt Dialektintonation, Universität Freiburg.")
-LIST_ITEM (L"Department of Linguistics and Phonetics, Lund University.")
-LIST_ITEM (L"Centre for Cognitive Neuroscience, University of Turku.")
-LIST_ITEM (L"Linguistics Department, University of Joensuu.")
-LIST_ITEM (L"Laboratoire de Sciences Cognitives et Psycholinguistique, Paris.")
-LIST_ITEM (L"Department of Linguistics, Northwestern University.")
-LIST_ITEM (L"Department of Finnish and General Linguistics, University of Tampere.")
-LIST_ITEM (L"Institute for Language and Speech Processing, Paradissos Amaroussiou.")
-LIST_ITEM (L"Jörg Jescheniak, Universität Leipzig.")
-LIST_ITEM (L"The Linguistics Teaching Laboratory, Ohio State University.")
-LIST_ITEM (L"Linguistics & Cognitive Science, Dartmouth College, Hanover NH.")
-LIST_ITEM (L"Cornell Phonetics Lab, Ithaca NY.")
-NORMAL (L"Finally:")
-LIST_ITEM (L"Daniel Hirst, for managing the Praat Discussion list.")
-MAN_END
-
-MAN_BEGIN (L"Praat menu", L"ppgb", 20050822)
-INTRO (L"The first menu in the @@Object window at . On MacOS X, this menu is in the main menu bar.")
-MAN_END
-
-MAN_BEGIN (L"Copy...", L"ppgb", 20111018)
-INTRO (L"One of the fixed buttons in the @@Object window at .")
-ENTRY (L"Availability")
-NORMAL (L"You can choose this command after selecting one object of any type.")
-ENTRY (L"Behaviour")
-NORMAL (L"The Object window copies the selected object, and all the data it contains, "
+LIST_ITEM (U"Regular expressions by Henry Spencer, Mark Edel, Christopher Conrad, Eddy De Greef (GPL).")
+NORMAL (U"For their financial support during the development of Praat:")
+LIST_ITEM (U"Netherlands Organization for Scientific Research (NWO) (1996–1999).")
+LIST_ITEM (U"Nederlandse Taalunie (2006–2008).")
+LIST_ITEM (U"Talkbank project, Carnegie Mellon / Linguistic Data Consortium (2002–2003).")
+LIST_ITEM (U"Stichting Spraaktechnologie (2014–2016).")
+LIST_ITEM (U"Spoken Dutch Corpus (CGN) (1999–2001).")
+LIST_ITEM (U"Laboratorium Experimentele OtoRhinoLaryngologie, KU Leuven.")
+LIST_ITEM (U"DFG-Projekt Dialektintonation, Universität Freiburg.")
+LIST_ITEM (U"Department of Linguistics and Phonetics, Lund University.")
+LIST_ITEM (U"Centre for Cognitive Neuroscience, University of Turku.")
+LIST_ITEM (U"Linguistics Department, University of Joensuu.")
+LIST_ITEM (U"Laboratoire de Sciences Cognitives et Psycholinguistique, Paris.")
+LIST_ITEM (U"Department of Linguistics, Northwestern University.")
+LIST_ITEM (U"Department of Finnish and General Linguistics, University of Tampere.")
+LIST_ITEM (U"Institute for Language and Speech Processing, Paradissos Amaroussiou.")
+LIST_ITEM (U"Jörg Jescheniak, Universität Leipzig.")
+LIST_ITEM (U"The Linguistics Teaching Laboratory, Ohio State University.")
+LIST_ITEM (U"Linguistics & Cognitive Science, Dartmouth College, Hanover NH.")
+LIST_ITEM (U"Cornell Phonetics Lab, Ithaca NY.")
+NORMAL (U"Finally we thank:")
+LIST_ITEM (U"Ton Wempe and Dirk Jan Vet, for technical support and advice.")
+LIST_ITEM (U"Daniel Hirst, for managing the Praat Discussion list.")
+LIST_ITEM (U"José Joaquín Atria and Ingmar Steiner, for setting up the source-code repository on GitHub.")
+LIST_ITEM (U"Hundreds of Praat users, for notifying us of problems and thus helping us to improve Praat.")
+MAN_END
+
+MAN_BEGIN (U"Praat menu", U"ppgb", 20050822)
+INTRO (U"The first menu in the @@Object window at . On MacOS X, this menu is in the main menu bar.")
+MAN_END
+
+MAN_BEGIN (U"Copy...", U"ppgb", 20111018)
+INTRO (U"One of the fixed buttons in the @@Object window at .")
+ENTRY (U"Availability")
+NORMAL (U"You can choose this command after selecting one object of any type.")
+ENTRY (U"Behaviour")
+NORMAL (U"The Object window copies the selected object, and all the data it contains, "
 	"to a new object, which will appear at the bottom of the List of Objects.")
-ENTRY (L"Example")
-NORMAL (L"If you select \"Sound hallo\" and click `Copy...', "
+ENTRY (U"Example")
+NORMAL (U"If you select \"Sound hallo\" and click `Copy...', "
 	"a command window will appear, which prompts you for a name; "
 	"after you click OK, a new object will appear in the list, bearing that name.")
 MAN_END
 
-MAN_BEGIN (L"Draw menu", L"ppgb", 20010417)
-INTRO (L"A menu that occurs in the @@Dynamic menu@ for many objects.")
-NORMAL (L"This menu contains commands for drawing the object to the @@Picture window@, "
+MAN_BEGIN (U"Draw menu", U"ppgb", 20010417)
+INTRO (U"A menu that occurs in the @@Dynamic menu@ for many objects.")
+NORMAL (U"This menu contains commands for drawing the object to the @@Picture window@, "
 	"which will allow you to print the drawing or to copy it to your word processor.")
 MAN_END
 
-MAN_BEGIN (L"Dynamic menu", L"ppgb", 20110131)
-INTRO (L"A column of buttons in the right-hand part of the @@Object window@, "
+MAN_BEGIN (U"Dynamic menu", U"ppgb", 20110131)
+INTRO (U"A column of buttons in the right-hand part of the @@Object window@, "
 	"plus the #Save menu in the Object window.")
-NORMAL (L"If you select one or more @objects in the list, "
+NORMAL (U"If you select one or more @objects in the list, "
 	"the possible actions that you can perform with the selected objects "
 	"will appear in the dynamic menu. "
 	"These actions can include viewing & editing, saving, drawing, "
 	"conversions to other types (including analysis and synthesis), and more.")
-ENTRY (L"Example of analysis:")
-NORMAL (L"Record a Sound, select it, and click on ##To Pitch...#. "
+ENTRY (U"Example of analysis:")
+NORMAL (U"Record a Sound, select it, and click on ##To Pitch...#. "
 	"This will create a new Pitch object and put it in the list of objects. "
 	"You can then edit, write, and draw this Pitch object.")
-ENTRY (L"Example of synthesis:")
-NORMAL (L"Create a #Speaker, create and edit an #Artword, and click on ##To Sound...#.")
+ENTRY (U"Example of synthesis:")
+NORMAL (U"Create a #Speaker, create and edit an #Artword, and click on ##To Sound...#.")
 MAN_END
 
-MAN_BEGIN (L"View & Edit", L"ppgb", 20110128)
-INTRO (L"A command in the @@Dynamic menu@ of several types of @objects.")
-NORMAL (L"This command puts an @@Editors|editor@ window on the screen, which shows the contents of the selected object. "
+MAN_BEGIN (U"View & Edit", U"ppgb", 20110128)
+INTRO (U"A command in the @@Dynamic menu@ of several types of @objects.")
+NORMAL (U"This command puts an @@Editors|editor@ window on the screen, which shows the contents of the selected object. "
 	"This window will allow your to view and modify the contents of this object.")
 MAN_END
 
-MAN_BEGIN (L"Extract visible formant contour", L"ppgb", 20030316)
-INTRO (L"One of the commands in the Formant menu of the @SoundEditor and the @TextGridEditor.")
-NORMAL (L"See @@Intro 5. Formant analysis@")
+MAN_BEGIN (U"Extract visible formant contour", U"ppgb", 20030316)
+INTRO (U"One of the commands in the Formant menu of the @SoundEditor and the @TextGridEditor.")
+NORMAL (U"See @@Intro 5. Formant analysis@")
 MAN_END
 
-MAN_BEGIN (L"Extract visible intensity contour", L"ppgb", 20030316)
-INTRO (L"One of the commands in the Intensity menu of the @SoundEditor and the @TextGridEditor.")
-NORMAL (L"See @@Intro 6. Intensity analysis@")
+MAN_BEGIN (U"Extract visible intensity contour", U"ppgb", 20030316)
+INTRO (U"One of the commands in the Intensity menu of the @SoundEditor and the @TextGridEditor.")
+NORMAL (U"See @@Intro 6. Intensity analysis@")
 MAN_END
 
-MAN_BEGIN (L"Extract visible pitch contour", L"ppgb", 20030316)
-INTRO (L"One of the commands in the Pitch menu of the @SoundEditor and the @TextGridEditor.")
-NORMAL (L"See @@Intro 4. Pitch analysis@")
+MAN_BEGIN (U"Extract visible pitch contour", U"ppgb", 20030316)
+INTRO (U"One of the commands in the Pitch menu of the @SoundEditor and the @TextGridEditor.")
+NORMAL (U"See @@Intro 4. Pitch analysis@")
 MAN_END
 
-MAN_BEGIN (L"Extract visible spectrogram", L"ppgb", 20030316)
-INTRO (L"One of the commands in the Spectrogram menu of the @SoundEditor and the @TextGridEditor.")
-NORMAL (L"See @@Intro 3. Spectral analysis@")
+MAN_BEGIN (U"Extract visible spectrogram", U"ppgb", 20030316)
+INTRO (U"One of the commands in the Spectrogram menu of the @SoundEditor and the @TextGridEditor.")
+NORMAL (U"See @@Intro 3. Spectral analysis@")
 MAN_END
 
-MAN_BEGIN (L"FAQ (Frequently Asked Questions)", L"ppgb", 20071210)
-LIST_ITEM (L"@@FAQ: How to cite Praat")
-LIST_ITEM (L"@Unicode")
-LIST_ITEM (L"@@FAQ: Formant analysis")
-LIST_ITEM (L"@@FAQ: Pitch analysis")
-LIST_ITEM (L"@@FAQ: Spectrograms")
-LIST_ITEM (L"@@FAQ: Scripts")
+MAN_BEGIN (U"FAQ (Frequently Asked Questions)", U"ppgb", 20071210)
+LIST_ITEM (U"@@FAQ: How to cite Praat")
+LIST_ITEM (U"@Unicode")
+LIST_ITEM (U"@@FAQ: Formant analysis")
+LIST_ITEM (U"@@FAQ: Pitch analysis")
+LIST_ITEM (U"@@FAQ: Spectrograms")
+LIST_ITEM (U"@@FAQ: Scripts")
 /* Hardware */
 /* Pitch: octave errors */
 MAN_END
 
-MAN_BEGIN (L"FAQ: Formant analysis", L"ppgb", 20030916)
-NORMAL (L"#Problem: I get different formant values if I choose to analyse 3 formants "
+MAN_BEGIN (U"FAQ: Formant analysis", U"ppgb", 20030916)
+NORMAL (U"#Problem: I get different formant values if I choose to analyse 3 formants "
 	"than if I choose to analyse 4 formants.")
-NORMAL (L"Solution: the \"number of formants\" in formant analysis determines the "
+NORMAL (U"Solution: the \"number of formants\" in formant analysis determines the "
 	"number of peaks with which the %entire spectrum is modelled. For an average "
 	"female voice, you should choose to analyse 5 formants in the region up to 5500 Hz, "
 	"even if you are interested only in the first three formants.")
-NORMAL (L"")
-NORMAL (L"#Problem: I often get only 1 formant in a region where I see clearly 2 formants "
+NORMAL (U"")
+NORMAL (U"#Problem: I often get only 1 formant in a region where I see clearly 2 formants "
 	"in the spectrogram.")
-NORMAL (L"This occurs mainly in back vowels (F1 and F2 close together) for male voices, "
+NORMAL (U"This occurs mainly in back vowels (F1 and F2 close together) for male voices, "
 	"if the \"maximum formant\" is set to the standard of 5500 Hz, which is appropriate "
 	"for female voices. Set the \"maximum formant\" down to 5000 Hz. "
 	"No, Praat comes without a guarantee: the formant analysis is based on LPC, "
 	"and this comes with several assumptions as to what a speech spectrum is like.")
-NORMAL (L"")
-NORMAL (L"#Question: what algorithm is used for formant analysis?")
-NORMAL (L"Answer: see @@Sound: To Formant (burg)... at .")
+NORMAL (U"")
+NORMAL (U"#Question: what algorithm is used for formant analysis?")
+NORMAL (U"Answer: see @@Sound: To Formant (burg)... at .")
 MAN_END
 
-MAN_BEGIN (L"FAQ: How to cite Praat", L"ppgb", 20140826)
-NORMAL (L"#Question: how do I cite Praat in my articles?")
-NORMAL (L"Answer: nowadays most journals allow you to cite computer programs and web sites. "
+MAN_BEGIN (U"FAQ: How to cite Praat", U"ppgb", 20140826)
+NORMAL (U"#Question: how do I cite Praat in my articles?")
+NORMAL (U"Answer: nowadays most journals allow you to cite computer programs and web sites. "
 	"The style approved by the American Psychological Association, "
 	"and therefore by many journals, is like the following "
 	"(change the dates and version number as needed):")
 #define xstr(s) str(s)
 #define str(s) #s
-NORMAL (L"Boersma, Paul & Weenink, David (" xstr(PRAAT_YEAR) "). "
+NORMAL (U"Boersma, Paul & Weenink, David (" xstr(PRAAT_YEAR) "). "
 	"Praat: doing phonetics by computer [Computer program]. "
 	"Version " xstr(PRAAT_VERSION_STR) ", retrieved " xstr(PRAAT_DAY) " " xstr(PRAAT_MONTH) " " xstr(PRAAT_YEAR) " from http://www.praat.org/")
-NORMAL (L"If the journal does not allow you to cite a web site, then try:")
-NORMAL (L"Boersma, Paul (2001). Praat, a system for doing phonetics by computer. "
+NORMAL (U"If the journal does not allow you to cite a web site, then try:")
+NORMAL (U"Boersma, Paul (2001). Praat, a system for doing phonetics by computer. "
 	"%%Glot International% ##5:9/10#, 341-345.")
-NORMAL (L"This paper can be downloaded from Boersma's website.")
+NORMAL (U"This paper can be downloaded from Boersma's website.")
 MAN_END
 
-MAN_BEGIN (L"FAQ: Pitch analysis", L"ppgb", 20060913)
-NORMAL (L"#Question: what algorithm is used for pitch analysis?")
-NORMAL (L"Answer: see @@Sound: To Pitch (ac)... at . The 1993 article is downloadable from "
+MAN_BEGIN (U"FAQ: Pitch analysis", U"ppgb", 20060913)
+NORMAL (U"#Question: what algorithm is used for pitch analysis?")
+NORMAL (U"Answer: see @@Sound: To Pitch (ac)... at . The 1993 article is downloadable from "
 	"http://www.fon.hum.uva.nl/paul/")
-NORMAL (L"#Question: why does Praat consider my sound voiceless while I hear it as voiced?")
-NORMAL (L"There are at least five possibilities. Most of them can be checked by zooming in on the @waveform.")
-NORMAL (L"The first possibility is that the pitch has fallen below the @@pitch floor at . For instance, "
+NORMAL (U"#Question: why does Praat consider my sound voiceless while I hear it as voiced?")
+NORMAL (U"There are at least five possibilities. Most of them can be checked by zooming in on the @waveform.")
+NORMAL (U"The first possibility is that the pitch has fallen below the @@pitch floor at . For instance, "
 	"your pitch floor could be 75 Hz but the English speaker produces creak at the end of the utterance. "
 	"Or your pitch floor could be 75 Hz but the Chinese speaker is in the middle of a third tone. "
 	"If this happens, it may help to lower the pitch floor to e.g. 40 Hz (@@Pitch settings...@), "
 	"although that may also smooth the pitch curve too much in other places.")
-NORMAL (L"The second possibility is that the pitch has moved too fast. This could happen at the end of a Chinese fourth tone, "
+NORMAL (U"The second possibility is that the pitch has moved too fast. This could happen at the end of a Chinese fourth tone, "
 	"which drops very fast. If this happens, it may help to use the \"optimize for voice analysis\" setting, "
 	"(@@Pitch settings...@), although Praat may then hallucinate pitches in other places that you would prefer to consider voiceless.")
-NORMAL (L"The third possibility is that the periods are very irregular, as in some pathological voices. "
+NORMAL (U"The third possibility is that the periods are very irregular, as in some pathological voices. "
 	"If you want to see a pitch in those cases, it may help to use the \"optimize for voice analysis\" setting "
 	"(@@Pitch settings...@). Or it may help to lower the \"voicing threshold\" setting (@@Advanced pitch settings...@) "
 	"to 0.25 (instead of the standard 0.45) or so.")
-NORMAL (L"The fourth possibility is that there is a lot of background noise, as in a recording on a busy street. "
+NORMAL (U"The fourth possibility is that there is a lot of background noise, as in a recording on a busy street. "
 	"In such a case, it may help to lower the \"voicing threshold\" setting (@@Advanced pitch settings...@) "
 	"to 0.25 (instead of the standard 0.45) or so. The disadvantage of lowering this setting is that for non-noisy "
 	"recordings, Praat will become too eager to find voicing in some places that you would prefer to consider voiceless; "
 	"so make sure to set it back to 0.45 once you have finished analysing the noisy recordings.")
-NORMAL (L"The fifth possibility is that the part analysed as voiceless is much less loud than the rest of the sound, "
+NORMAL (U"The fifth possibility is that the part analysed as voiceless is much less loud than the rest of the sound, "
 	"or that the sound contains a loud noise elsewhere. This can be checked by zooming in on the part analysed as voiceless: "
 	"if Praat suddenly considers it as voiced, this is a sign that this part is much quieter than the rest. "
 	"To make Praat analyse this part as voiced, you can lower the \"silence threshold\" setting to 0.01 "
 	"(instead of the standard 0.03) or so. The disadvantage of lowering this setting is that Praat may start to consider "
 	"some distant background sounds (and quiet echos, for instance) as voiced.")
-NORMAL (L"#Question: why do I get different results for the maximum pitch if...?")
-NORMAL (L"If you select a Sound and choose @@Sound: To Pitch...@, the time step will usually "
+NORMAL (U"#Question: why do I get different results for the maximum pitch if...?")
+NORMAL (U"If you select a Sound and choose @@Sound: To Pitch...@, the time step will usually "
 	"be 0.01 seconds. The resulting @Pitch object will have values for times that are "
 	"0.01 seconds apart. If you then click Info or choose ##Get maximum pitch# from the #Query menu, "
 	"the result is based on those time points. By contrast, if you choose ##Get maximum pitch# "
 	"from the #Pitch menu in the SoundEditor window, the result will be based on the visible points, "
 	"of which there tend to be a hundred in the visible window. These different time spacings will "
 	"lead to slightly different pitch contours.")
-NORMAL (L"If you choose ##Move cursor to maximum pitch#, then choose ##Get pitch# from the "
+NORMAL (U"If you choose ##Move cursor to maximum pitch#, then choose ##Get pitch# from the "
 	"#%Pitch menu, the result will be different again. This is because ##Get maximum pitch# "
 	"can do a parabolic interpolation around the maximum, whereas ##Get pitch#, not realizing "
 	"that the cursor is at a maximum, does a stupid linear interpolation, which tends to lead to "
 	"lower values.")
 MAN_END
 
-MAN_BEGIN (L"FAQ: Scripts", L"ppgb", 20140120)
-NORMAL (L"#Question: how do I do something to all the files in a directory?")
-NORMAL (L"Answer: look at @@Create Strings as file list... at .")
-NORMAL (L"")
-NORMAL (L"#Question: why doesn't the editor window react to my commands?")
-NORMAL (L"Your commands are probably something like:")
-CODE (L"Read from file: \"hello.wav\"")
-CODE (L"View & Edit")
-CODE (L"Zoom: 0.3, 0.5")
-NORMAL (L"Answer: Praat doesn't know it has to send the #Zoom command to the editor "
+MAN_BEGIN (U"FAQ: Scripts", U"ppgb", 20140120)
+NORMAL (U"#Question: how do I do something to all the files in a directory?")
+NORMAL (U"Answer: look at @@Create Strings as file list... at .")
+NORMAL (U"")
+NORMAL (U"#Question: why doesn't the editor window react to my commands?")
+NORMAL (U"Your commands are probably something like:")
+CODE (U"Read from file: \"hello.wav\"")
+CODE (U"View & Edit")
+CODE (U"Zoom: 0.3, 0.5")
+NORMAL (U"Answer: Praat doesn't know it has to send the #Zoom command to the editor "
 	"window called ##14. Sound hello#. There could be several Sound editor windows on your "
 	"screen. According to @@Scripting 7.1. Scripting an editor from a shell script@, "
 	"you will have to say this explicitly:")
-CODE (L"Read from file: \"hello.wav\"")
-CODE (L"View & Edit")
-CODE (L"editor: \"Sound hello\"")
-CODE (L"Zoom: 0.3, 0.5")
-NORMAL (L"")
-NORMAL (L"#Problem: a line like \"Number = 1\" does not work.")
-NORMAL (L"Solution: names of variables should start with a lower-case letter.")
-NORMAL (L"")
-NORMAL (L"#Question: why do names of variables have to start with a lower-case letter? "
+CODE (U"Read from file: \"hello.wav\"")
+CODE (U"View & Edit")
+CODE (U"editor: \"Sound hello\"")
+CODE (U"Zoom: 0.3, 0.5")
+NORMAL (U"")
+NORMAL (U"#Problem: a line like \"Number = 1\" does not work.")
+NORMAL (U"Solution: names of variables should start with a lower-case letter.")
+NORMAL (U"")
+NORMAL (U"#Question: why do names of variables have to start with a lower-case letter? "
 	"I would like to do things like \"F0 = Get mean pitch\".")
-NORMAL (L"Answer (using the shorthand script syntax): Praat scripts combine button commands with things that only occur "
+NORMAL (U"Answer (using the shorthand script syntax): Praat scripts combine button commands with things that only occur "
 	"in scripts. Button commands always start with a capital letter, e.g. \"Play\". "
 	"Script commands always start with lower case, e.g. \"echo Hello\". "
 	"A minimal pair is \"select\", which simulates a mouse click in the object list, "
@@ -1933,219 +2004,219 @@ NORMAL (L"Answer (using the shorthand script syntax): Praat scripts combine butt
 	"as in \"x = Get\", where \"Get\" would be a variable, versus \"x = Get mean\", "
 	"where \"Get mean\" is a button command. To prevent this, Praat enforces "
 	"a rigorous lower-case/upper-case distinction.")
-NORMAL (L"")
-NORMAL (L"#Question: how do I convert a number into a string?")
-NORMAL (L"Answer: a\\$  = string\\$  (a)")
-NORMAL (L"#Question: how do I convert a string into a number?")
-NORMAL (L"Answer: a = number (a\\$ )")
+NORMAL (U"")
+NORMAL (U"#Question: how do I convert a number into a string?")
+NORMAL (U"Answer: a\\$  = string\\$  (a)")
+NORMAL (U"#Question: how do I convert a string into a number?")
+NORMAL (U"Answer: a = number (a\\$ )")
 MAN_END
 
-MAN_BEGIN (L"FAQ: Spectrograms", L"ppgb", 20030916)
-NORMAL (L"#Problem: the background is grey instead of white (too little contrast)")
-NORMAL (L"Solution: reduce the \"dynamic range\" in the spectrogram settings. The standard value is 50 dB, "
+MAN_BEGIN (U"FAQ: Spectrograms", U"ppgb", 20030916)
+NORMAL (U"#Problem: the background is grey instead of white (too little contrast)")
+NORMAL (U"Solution: reduce the \"dynamic range\" in the spectrogram settings. The standard value is 50 dB, "
 	"which is fine for detecting small things like plosive voicing in well recorded speech. "
 	"For gross features like vowel formants, or for noisy speech, you may want to change the dynamic range "
 	"to 40 or even 30 dB.")
 MAN_END
 
-MAN_BEGIN (L"File menu", L"ppgb", 20021204)
-INTRO (L"One of the menus in all @editors, in the @manual, and in the @@Picture window at .")
+MAN_BEGIN (U"File menu", U"ppgb", 20021204)
+INTRO (U"One of the menus in all @editors, in the @manual, and in the @@Picture window at .")
 MAN_END
 
-MAN_BEGIN (L"Filtering", L"ppgb", 20100324)
-INTRO (L"This tutorial describes the use of filtering techniques in Praat. "
+MAN_BEGIN (U"Filtering", U"ppgb", 20100324)
+INTRO (U"This tutorial describes the use of filtering techniques in Praat. "
 	"It assumes you are familiar with the @Intro.")
-ENTRY (L"Frequency-domain filtering")
-NORMAL (L"Modern computer techniques make possible an especially simple batch filtering method: "
+ENTRY (U"Frequency-domain filtering")
+NORMAL (U"Modern computer techniques make possible an especially simple batch filtering method: "
 	"multiplying the complex spectrum in the frequency domain by any real-valued filter function. "
 	"This leads to a zero phase shift for each frequency component. The impulse response is symmetric "
 	"in the time domain, which also means that the filter is %acausal: the filtered signal will show components "
 	"before they start in the original.")
-LIST_ITEM (L"• @@Spectrum: Filter (pass Hann band)...@")
-LIST_ITEM (L"• @@Spectrum: Filter (stop Hann band)...@")
-LIST_ITEM (L"• @@Sound: Filter (pass Hann band)...@")
-LIST_ITEM (L"• @@Sound: Filter (stop Hann band)...@")
-LIST_ITEM (L"• @@Sound: Filter (formula)...@")
-NORMAL (L"Spectro-temporal:")
-LIST_ITEM (L"• @@band filtering in the frequency domain@")
-ENTRY (L"Fast time-domain filtering")
-NORMAL (L"Some very fast Infinite Impulse Response (IIR) filters can be defined in the time domain. "
+LIST_ITEM (U"• @@Spectrum: Filter (pass Hann band)...@")
+LIST_ITEM (U"• @@Spectrum: Filter (stop Hann band)...@")
+LIST_ITEM (U"• @@Sound: Filter (pass Hann band)...@")
+LIST_ITEM (U"• @@Sound: Filter (stop Hann band)...@")
+LIST_ITEM (U"• @@Sound: Filter (formula)...@")
+NORMAL (U"Spectro-temporal:")
+LIST_ITEM (U"• @@band filtering in the frequency domain@")
+ENTRY (U"Fast time-domain filtering")
+NORMAL (U"Some very fast Infinite Impulse Response (IIR) filters can be defined in the time domain. "
 	"These include recursive all-pole filters and pre-emphasis. These filters are causal but have non-zero phase shifts. "
 	"There are versions that create new Sound objects:")
-LIST_ITEM (L"• @@Sound: Filter (one formant)...@")
-LIST_ITEM (L"• @@Sound: Filter (pre-emphasis)...@")
-LIST_ITEM (L"• @@Sound: Filter (de-emphasis)...@")
-NORMAL (L"And there are in-line versions, which modify the existing Sound objects:")
-LIST_ITEM (L"• @@Sound: Filter with one formant (in-line)...@")
-LIST_ITEM (L"• @@Sound: Pre-emphasize (in-line)...@")
-LIST_ITEM (L"• @@Sound: De-emphasize (in-line)...@")
-ENTRY (L"Convolution")
-NORMAL (L"A Finite Impulse Response (FIR) filter can be described as a sampled sound. "
+LIST_ITEM (U"• @@Sound: Filter (one formant)...@")
+LIST_ITEM (U"• @@Sound: Filter (pre-emphasis)...@")
+LIST_ITEM (U"• @@Sound: Filter (de-emphasis)...@")
+NORMAL (U"And there are in-line versions, which modify the existing Sound objects:")
+LIST_ITEM (U"• @@Sound: Filter with one formant (in-line)...@")
+LIST_ITEM (U"• @@Sound: Pre-emphasize (in-line)...@")
+LIST_ITEM (U"• @@Sound: De-emphasize (in-line)...@")
+ENTRY (U"Convolution")
+NORMAL (U"A Finite Impulse Response (FIR) filter can be described as a sampled sound. "
 	"Filtering with such a filter amounts to a %#convolution of the original sound and the filter:")
-LIST_ITEM (L"• @@Sounds: Convolve...@")
-ENTRY (L"Described elsewhere")
-NORMAL (L"Described in the @@Source-filter synthesis@ tutorial:")
-LIST_ITEM (L"• @@Sound & Formant: Filter@")
-LIST_ITEM (L"• @@Sound & FormantGrid: Filter@")
-LIST_ITEM (L"• @@LPC & Sound: Filter...@")
-LIST_ITEM (L"• @@LPC & Sound: Filter (inverse)@")
+LIST_ITEM (U"• @@Sounds: Convolve...@")
+ENTRY (U"Described elsewhere")
+NORMAL (U"Described in the @@Source-filter synthesis@ tutorial:")
+LIST_ITEM (U"• @@Sound & Formant: Filter@")
+LIST_ITEM (U"• @@Sound & FormantGrid: Filter@")
+LIST_ITEM (U"• @@LPC & Sound: Filter...@")
+LIST_ITEM (U"• @@LPC & Sound: Filter (inverse)@")
 MAN_END
 
-MAN_BEGIN (L"Formants & LPC menu", L"ppgb", 20011107)
-INTRO (L"A menu that occurs in the @@Dynamic menu@ for a @Sound.")
-NORMAL (L"This menu contains commands for analysing the formant contours of the selected Sound:")
-LIST_ITEM (L"@@Sound: To Formant (burg)...")
-LIST_ITEM (L"@@Sound: To Formant (keep all)...")
-LIST_ITEM (L"@@Sound: To Formant (sl)...")
-LIST_ITEM (L"@@Sound: To LPC (autocorrelation)...")
-LIST_ITEM (L"@@Sound: To LPC (covariance)...")
-LIST_ITEM (L"@@Sound: To LPC (burg)...")
-LIST_ITEM (L"@@Sound: To LPC (marple)...")
-LIST_ITEM (L"@@Sound: To MFCC...")
+MAN_BEGIN (U"Formants & LPC menu", U"ppgb", 20011107)
+INTRO (U"A menu that occurs in the @@Dynamic menu@ for a @Sound.")
+NORMAL (U"This menu contains commands for analysing the formant contours of the selected Sound:")
+LIST_ITEM (U"@@Sound: To Formant (burg)...")
+LIST_ITEM (U"@@Sound: To Formant (keep all)...")
+LIST_ITEM (U"@@Sound: To Formant (sl)...")
+LIST_ITEM (U"@@Sound: To LPC (autocorrelation)...")
+LIST_ITEM (U"@@Sound: To LPC (covariance)...")
+LIST_ITEM (U"@@Sound: To LPC (burg)...")
+LIST_ITEM (U"@@Sound: To LPC (marple)...")
+LIST_ITEM (U"@@Sound: To MFCC...")
 MAN_END
 
-MAN_BEGIN (L"Get first formant", L"ppgb", 20011107)
-INTRO (L"One of the commands in the @@Query menu@ of the @SoundEditor and the @TextGridEditor.")
+MAN_BEGIN (U"Get first formant", U"ppgb", 20011107)
+INTRO (U"One of the commands in the @@Query menu@ of the @SoundEditor and the @TextGridEditor.")
 MAN_END
 
-MAN_BEGIN (L"Get pitch", L"ppgb", 20010417)
-INTRO (L"One of the commands in the @@Query menu@ of the @SoundEditor and the @TextGridEditor.")
+MAN_BEGIN (U"Get pitch", U"ppgb", 20010417)
+INTRO (U"One of the commands in the @@Query menu@ of the @SoundEditor and the @TextGridEditor.")
 MAN_END
 
-MAN_BEGIN (L"Get second formant", L"ppgb", 20011107)
-INTRO (L"One of the commands in the @@Query menu@ of the @SoundEditor and the @TextGridEditor.")
+MAN_BEGIN (U"Get second formant", U"ppgb", 20011107)
+INTRO (U"One of the commands in the @@Query menu@ of the @SoundEditor and the @TextGridEditor.")
 MAN_END
 
-MAN_BEGIN (L"Goodies", L"ppgb", 20050822)
-INTRO (L"The title of a submenu of the @@Praat menu at .")
+MAN_BEGIN (U"Goodies", U"ppgb", 20050822)
+INTRO (U"The title of a submenu of the @@Praat menu at .")
 MAN_END
 
-MAN_BEGIN (L"Info", L"ppgb", 19980101)
-INTRO (L"One of the fixed buttons in the @@Object window at .")
-ENTRY (L"Availability")
-NORMAL (L"You can choose this command after choosing one object.")
-ENTRY (L"Purpose")
-NORMAL (L"To get some information about the selected object.")
-ENTRY (L"Behaviour")
-NORMAL (L"The information will appear in the @@Info window at .")
+MAN_BEGIN (U"Info", U"ppgb", 19980101)
+INTRO (U"One of the fixed buttons in the @@Object window at .")
+ENTRY (U"Availability")
+NORMAL (U"You can choose this command after choosing one object.")
+ENTRY (U"Purpose")
+NORMAL (U"To get some information about the selected object.")
+ENTRY (U"Behaviour")
+NORMAL (U"The information will appear in the @@Info window at .")
 MAN_END
 
-MAN_BEGIN (L"Info window", L"ppgb", 20030528)
-INTRO (L"A text window into which many query commands write their answers.")
-NORMAL (L"You can select text from this window and copy it to other places.")
-NORMAL (L"In a @@Praat script@, you can bypass the Info window by having a query command "
+MAN_BEGIN (U"Info window", U"ppgb", 20030528)
+INTRO (U"A text window into which many query commands write their answers.")
+NORMAL (U"You can select text from this window and copy it to other places.")
+NORMAL (U"In a @@Praat script@, you can bypass the Info window by having a query command "
 	"writing directly into a script variable.")
-NORMAL (L"Apart from the @Info command, which writes general information about the selected object, "
+NORMAL (U"Apart from the @Info command, which writes general information about the selected object, "
 	"the following more specific commands also write into the Info window:")
 MAN_END
 
-MAN_BEGIN (L"Inspect", L"ppgb", 19960904)
-INTRO (L"One of the fixed buttons in the @@Object window at .")
-NORMAL (L"You can use this command after selecting one object in the list.")
-NORMAL (L"The contents of the selected object will become visible in a Data Editor. "
+MAN_BEGIN (U"Inspect", U"ppgb", 19960904)
+INTRO (U"One of the fixed buttons in the @@Object window at .")
+NORMAL (U"You can use this command after selecting one object in the list.")
+NORMAL (U"The contents of the selected object will become visible in a Data Editor. "
 	"You can then view and change the data in the object, "
 	"but beware: changing the data directly in this way may render them inconsistent.")
-NORMAL (L"Changes that you make to the data with another Editor (e.g., a SoundEditor), "
+NORMAL (U"Changes that you make to the data with another Editor (e.g., a SoundEditor), "
 	"or with the commands under #%Modify, "
 	"are immediately reflected in the top-level Data Editor; "
 	"any subeditors are destroyed, however, because they may now refer to invalid data.")
-NORMAL (L"Changes that you make to the data with a Data Editor, "
+NORMAL (U"Changes that you make to the data with a Data Editor, "
 	"are immediately reflected in any open type-specific Editors (e.g., a SoundEditor).")
 MAN_END
 
-MAN_BEGIN (L"Intro", L"ppgb", 20110131)
-INTRO (L"This is an introductory tutorial to Praat, a computer program "
+MAN_BEGIN (U"Intro", U"ppgb", 20110131)
+INTRO (U"This is an introductory tutorial to Praat, a computer program "
 	"with which you can analyse, synthesize, and manipulate speech, "
 	"and create high-quality pictures for your articles and thesis. "
 	"You are advised to work through all of this tutorial.")
-NORMAL (L"You can read this tutorial sequentially with the help of the \"1 >\" and \"< 1\" buttons, "
+NORMAL (U"You can read this tutorial sequentially with the help of the \"1 >\" and \"< 1\" buttons, "
 	"or go to the desired information by clicking on the blue links.")
-LIST_ITEM (L"@@Intro 1. How to get a sound@: "
+LIST_ITEM (U"@@Intro 1. How to get a sound@: "
 	"@@Intro 1.1. Recording a sound|record@, "
 	"@@Intro 1.2. Reading a sound from disk|read@, "
 	"@@Intro 1.3. Creating a sound from a formula|formula at .")
-LIST_ITEM (L"@@Intro 2. What to do with a sound@: "
+LIST_ITEM (U"@@Intro 2. What to do with a sound@: "
 	"@@Intro 2.1. Saving a sound to disk|write@, "
 	"@@Intro 2.2. Viewing and editing a sound|view at .")
-LIST_ITEM (L"@@Intro 3. Spectral analysis")
-LIST_ITEM1 (L"spectrograms: @@Intro 3.1. Viewing a spectrogram|view@, "
+LIST_ITEM (U"@@Intro 3. Spectral analysis")
+LIST_ITEM1 (U"spectrograms: @@Intro 3.1. Viewing a spectrogram|view@, "
 	"@@Intro 3.2. Configuring the spectrogram|configure@, "
 	"@@Intro 3.3. Querying the spectrogram|query@, "
 	"@@Intro 3.4. Printing the spectrogram|print@, "
 	"@@Intro 3.5. The Spectrogram object|the Spectrogram object at .")
-LIST_ITEM1 (L"spectral slices: @@Intro 3.6. Viewing a spectral slice|view@, "
+LIST_ITEM1 (U"spectral slices: @@Intro 3.6. Viewing a spectral slice|view@, "
 	"@@Intro 3.7. Configuring the spectral slice|configure@, "
 	"@@Intro 3.8. The Spectrum object|the Spectrum object at .")
-LIST_ITEM (L"@@Intro 4. Pitch analysis")
-LIST_ITEM1 (L"pitch contours: @@Intro 4.1. Viewing a pitch contour|view@, "
+LIST_ITEM (U"@@Intro 4. Pitch analysis")
+LIST_ITEM1 (U"pitch contours: @@Intro 4.1. Viewing a pitch contour|view@, "
 	"@@Intro 4.2. Configuring the pitch contour|configure@, "
 	"@@Intro 4.3. Querying the pitch contour|query@, "
 	"@@Intro 4.4. Printing the pitch contour|print@, "
 	"@@Intro 4.5. The Pitch object|the Pitch object at .")
-LIST_ITEM (L"@@Intro 5. Formant analysis")
-LIST_ITEM1 (L"formant contours: @@Intro 5.1. Viewing formant contours|view@, "
+LIST_ITEM (U"@@Intro 5. Formant analysis")
+LIST_ITEM1 (U"formant contours: @@Intro 5.1. Viewing formant contours|view@, "
 	"@@Intro 5.2. Configuring the formant contours|configure@, "
 	"@@Intro 5.3. Querying the formant contours|query@, "
 	"@@Intro 5.4. The Formant object|the Formant object at .")
-LIST_ITEM (L"@@Intro 6. Intensity analysis")
-LIST_ITEM1 (L"intensity contours: @@Intro 6.1. Viewing an intensity contour|view@, "
+LIST_ITEM (U"@@Intro 6. Intensity analysis")
+LIST_ITEM1 (U"intensity contours: @@Intro 6.1. Viewing an intensity contour|view@, "
 	"@@Intro 6.2. Configuring the intensity contour|configure@, "
 	"@@Intro 6.3. Querying the intensity contour|query@, "
 	"@@Intro 6.4. The Intensity object|the Intensity object at .")
-LIST_ITEM (L"@@Intro 7. Annotation")
-LIST_ITEM (L"@@Intro 8. Manipulation@: of "
+LIST_ITEM (U"@@Intro 7. Annotation")
+LIST_ITEM (U"@@Intro 8. Manipulation@: of "
 	"@@Intro 8.1. Manipulation of pitch|pitch@, "
 	"@@Intro 8.2. Manipulation of duration|duration@, "
 	"@@Intro 8.3. Manipulation of intensity|intensity@, "
 	"@@Intro 8.4. Manipulation of formants|formants at .")
-NORMAL (L"There are also more specialized tutorials:")
-LIST_ITEM (L"Phonetics:")
-LIST_ITEM1 (L"• Voice analysis (jitter, shimmer, noise): @Voice")
-LIST_ITEM1 (L"• Listening experiments: @@ExperimentMFC@")
-LIST_ITEM1 (L"• @@Sound files@")
-LIST_ITEM1 (L"• @@Filtering@")
-LIST_ITEM1 (L"• @@Source-filter synthesis@")
-LIST_ITEM1 (L"• @@Articulatory synthesis@")
-LIST_ITEM (L"Learning:")
-LIST_ITEM1 (L"• @@Feedforward neural networks@")
-LIST_ITEM1 (L"• @@OT learning@")
-LIST_ITEM (L"Statistics:")
-LIST_ITEM1 (L"• @@Principal component analysis@")
-LIST_ITEM1 (L"• @@Multidimensional scaling@")
-LIST_ITEM1 (L"• @@Discriminant analysis@")
-LIST_ITEM (L"General:")
-LIST_ITEM1 (L"• @@Printing@")
-LIST_ITEM1 (L"• @@Scripting@")
-LIST_ITEM1 (L"• @@Demo window@")
-ENTRY (L"The authors")
-NORMAL (L"The Praat program was created by Paul Boersma and David Weenink of "
+NORMAL (U"There are also more specialized tutorials:")
+LIST_ITEM (U"Phonetics:")
+LIST_ITEM1 (U"• Voice analysis (jitter, shimmer, noise): @Voice")
+LIST_ITEM1 (U"• Listening experiments: @@ExperimentMFC@")
+LIST_ITEM1 (U"• @@Sound files@")
+LIST_ITEM1 (U"• @@Filtering@")
+LIST_ITEM1 (U"• @@Source-filter synthesis@")
+LIST_ITEM1 (U"• @@Articulatory synthesis@")
+LIST_ITEM (U"Learning:")
+LIST_ITEM1 (U"• @@Feedforward neural networks@")
+LIST_ITEM1 (U"• @@OT learning@")
+LIST_ITEM (U"Statistics:")
+LIST_ITEM1 (U"• @@Principal component analysis@")
+LIST_ITEM1 (U"• @@Multidimensional scaling@")
+LIST_ITEM1 (U"• @@Discriminant analysis@")
+LIST_ITEM (U"General:")
+LIST_ITEM1 (U"• @@Printing@")
+LIST_ITEM1 (U"• @@Scripting@")
+LIST_ITEM1 (U"• @@Demo window@")
+ENTRY (U"The authors")
+NORMAL (U"The Praat program was created by Paul Boersma and David Weenink of "
 	"the Institute of Phonetics Sciences of the University of Amsterdam. "
 	"Home page: ##http://www.praat.org# or ##http://www.fon.hum.uva.nl/praat/#.")
-NORMAL (L"For questions and suggestions, mail to the Praat discussion list, "
+NORMAL (U"For questions and suggestions, mail to the Praat discussion list, "
 	"which is reachable from the Praat home page, or directly to ##paul.boersma\\@ uva.nl#.")
 MAN_END
 
-MAN_BEGIN (L"Intro 1. How to get a sound", L"ppgb", 20021212)
-INTRO (L"Most of the things most people do with Praat start with a sound. "
+MAN_BEGIN (U"Intro 1. How to get a sound", U"ppgb", 20021212)
+INTRO (U"Most of the things most people do with Praat start with a sound. "
 	"There are at least three ways to get a sound:")
-LIST_ITEM (L"@@Intro 1.1. Recording a sound")
-LIST_ITEM (L"@@Intro 1.2. Reading a sound from disk")
-LIST_ITEM (L"@@Intro 1.3. Creating a sound from a formula")
+LIST_ITEM (U"@@Intro 1.1. Recording a sound")
+LIST_ITEM (U"@@Intro 1.2. Reading a sound from disk")
+LIST_ITEM (U"@@Intro 1.3. Creating a sound from a formula")
 MAN_END
 
-MAN_BEGIN (L"Intro 1.1. Recording a sound", L"ppgb", 20110128)
+MAN_BEGIN (U"Intro 1.1. Recording a sound", U"ppgb", 20110128)
 #ifdef macintosh
-	INTRO (L"To record a speech sound into Praat, you need a computer with a microphone.")
-	NORMAL (L"To record from the microphone, perform the following steps:")
+	INTRO (U"To record a speech sound into Praat, you need a computer with a microphone.")
+	NORMAL (U"To record from the microphone, perform the following steps:")
 #else
-	INTRO (L"To record a speech sound into Praat, you need a computer with a microphone. "
+	INTRO (U"To record a speech sound into Praat, you need a computer with a microphone. "
 		"If you do not have a microphone, try to record from an audio CD instead.")
-	NORMAL (L"To record from the microphone (or the CD), perform the following steps:")
+	NORMAL (U"To record from the microphone (or the CD), perform the following steps:")
 #endif
-LIST_ITEM (L"1. Choose @@Record mono Sound...@ from the @@New menu@ in the @@Object window at . "
+LIST_ITEM (U"1. Choose @@Record mono Sound...@ from the @@New menu@ in the @@Object window at . "
 	"A @SoundRecorder window will appear on your screen.")
 #if defined (_WIN32)
-	LIST_ITEM (L"2. Choose the appropriate input device, namely the microphone, by the following steps. "
+	LIST_ITEM (U"2. Choose the appropriate input device, namely the microphone, by the following steps. "
 		"If there is a small loudspeaker symbol in the Windows Start bar, double click it and you will see the %playing mixer. "
 		"If there is no loudspeaker symbol, go to ##Control Panels#, then ##Sounds and Audio Devices#, then #Volume, then #Advanced, "
 		"and you will finally see the playing mixer. "
@@ -2153,64 +2224,64 @@ LIST_ITEM (L"1. Choose @@Record mono Sound...@ from the @@New menu@ in the @@Obj
 		"then click #Recording, then #OK. You now see the %recording mixer, where you can select the microphone "
 		"(if you do not like this complicated operation, try Praat on Macintosh or Linux instead of Windows).")
 #elif defined (macintosh)
-	LIST_ITEM (L"2. In the SoundRecorder window, choose the appropriate input device, e.g. choose ##Internal microphone#.")
+	LIST_ITEM (U"2. In the SoundRecorder window, choose the appropriate input device, e.g. choose ##Internal microphone#.")
 #else
-	LIST_ITEM (L"2. In the SoundRecorder window, choose the appropriate input device, i.e. choose #Microphone (or #CD, or #Line).")
+	LIST_ITEM (U"2. In the SoundRecorder window, choose the appropriate input device, i.e. choose #Microphone (or #CD, or #Line).")
 #endif
 #ifdef macintosh
-	LIST_ITEM (L"3. Use the #Record and #Stop buttons to record a few seconds of your speech.")
+	LIST_ITEM (U"3. Use the #Record and #Stop buttons to record a few seconds of your speech.")
 #else
-	LIST_ITEM (L"3. Use the #Record and #Stop buttons to record a few seconds of your speech "
+	LIST_ITEM (U"3. Use the #Record and #Stop buttons to record a few seconds of your speech "
 		"(or a few seconds of music from your playing CD).")
 #endif
-LIST_ITEM (L"4. Use the #Play button to hear what you have recorded.")
-LIST_ITEM (L"5. Repeat steps 3 and 4 until you are satisfied with your recording.")
-LIST_ITEM (L"6. Click the ##Save to list# button. Your recording will now appear in the Object window, "
+LIST_ITEM (U"4. Use the #Play button to hear what you have recorded.")
+LIST_ITEM (U"5. Repeat steps 3 and 4 until you are satisfied with your recording.")
+LIST_ITEM (U"6. Click the ##Save to list# button. Your recording will now appear in the Object window, "
 	"where it will be called \"Sound sound\".")
-LIST_ITEM (L"7. You can now close the SoundRecorder window.")
-LIST_ITEM (L"8. When you saved your sound to the Object window, some buttons appeared in that window. "
+LIST_ITEM (U"7. You can now close the SoundRecorder window.")
+LIST_ITEM (U"8. When you saved your sound to the Object window, some buttons appeared in that window. "
 	"These buttons show you what you can do with the sound. Try the #Play and @@View & Edit@ buttons.")
-NORMAL (L"For more information on recording, see the @SoundRecorder manual page.")
+NORMAL (U"For more information on recording, see the @SoundRecorder manual page.")
 MAN_END
 
-MAN_BEGIN (L"Intro 1.2. Reading a sound from disk", L"ppgb", 20041126)
-INTRO (L"Apart from recording a new sound from a microphone, you could read an existing sound file from your disk.")
-NORMAL (L"With @@Read from file...@ from the @@Open menu@, "
+MAN_BEGIN (U"Intro 1.2. Reading a sound from disk", U"ppgb", 20041126)
+INTRO (U"Apart from recording a new sound from a microphone, you could read an existing sound file from your disk.")
+NORMAL (U"With @@Read from file...@ from the @@Open menu@, "
 	"Praat will be able to read most standard types of sound files, e.g. WAV files. "
 	"They will appear as @Sound objects in the Object window. For instance, if you open the file ##hello.wav#, "
 	"an object called \"Sound hello\" will appear in the list.")
-NORMAL (L"If you do not have a sound file on your disk, you can download a WAV file (or so) from the Internet, "
+NORMAL (U"If you do not have a sound file on your disk, you can download a WAV file (or so) from the Internet, "
 	"then read that file into Praat with ##Read from file...#.")
 MAN_END
 
-MAN_BEGIN (L"Intro 1.3. Creating a sound from a formula", L"ppgb", 20070225)
-INTRO (L"If you have no microphone, no sound files on disk, and no access to the Internet, "
+MAN_BEGIN (U"Intro 1.3. Creating a sound from a formula", U"ppgb", 20070225)
+INTRO (U"If you have no microphone, no sound files on disk, and no access to the Internet, "
 	"you could still create a sound with @@Create Sound from formula...@ from the @@New menu at .")
 MAN_END
 
-MAN_BEGIN (L"Intro 2. What to do with a sound", L"ppgb", 20110131)
-INTRO (L"As soon as you have a @Sound in the @@List of Objects@, "
+MAN_BEGIN (U"Intro 2. What to do with a sound", U"ppgb", 20110131)
+INTRO (U"As soon as you have a @Sound in the @@List of Objects@, "
 	"the buttons in the @@Dynamic menu@ (the right-hand part of the @@Object window@) "
 	"will show you what you can do with it.")
-LIST_ITEM (L"@@Intro 2.1. Saving a sound to disk")
-LIST_ITEM (L"@@Intro 2.2. Viewing and editing a sound")
+LIST_ITEM (U"@@Intro 2.1. Saving a sound to disk")
+LIST_ITEM (U"@@Intro 2.2. Viewing and editing a sound")
 MAN_END
 
-MAN_BEGIN (L"Intro 2.1. Saving a sound to disk", L"ppgb", 20110131)
-INTRO (L"There are several ways to write a sound to disk.")
-NORMAL (L"First, the @@File menu@ of the @SoundRecorder window contains commands to save the left "
+MAN_BEGIN (U"Intro 2.1. Saving a sound to disk", U"ppgb", 20110131)
+INTRO (U"There are several ways to write a sound to disk.")
+NORMAL (U"First, the @@File menu@ of the @SoundRecorder window contains commands to save the left "
 	"channel, the right channel, or both channels of the recorded sound to any of four standard types "
 	"of sound files (WAV, AIFC, NeXT/Sun, NIST). These four file types are all equally good for Praat: "
 	"Praat will handle them equally well on every computer. The first three of these types will "
 	"also be recognized by nearly all other sound-playing programs.")
-NORMAL (L"Then, once you have a @Sound object in the @@List of Objects@, "
+NORMAL (U"Then, once you have a @Sound object in the @@List of Objects@, "
 	"you can save it in several formats with the commands in the @@Save menu at . "
 	"Again, the WAV, AIFF, AIFC, NeXT/Sun, and NIST formats are equally fine.")
-NORMAL (L"For more information, see the @@Sound files@ tutorial.")
+NORMAL (U"For more information, see the @@Sound files@ tutorial.")
 MAN_END
 
-MAN_BEGIN (L"Intro 2.2. Viewing and editing a sound", L"ppgb", 20110212)
-NORMAL (L"To see the wave form of a @Sound that is in the list of objects, "
+MAN_BEGIN (U"Intro 2.2. Viewing and editing a sound", U"ppgb", 20110212)
+NORMAL (U"To see the wave form of a @Sound that is in the list of objects, "
 	"select that Sound and click @@View & Edit at . A @SoundEditor window will appear on your screen. "
 	"You see a waveform (or two waveforms, if you have a stereo sound) and probably some \"analyses\" below it. "
 	"You can zoom in and scroll to see the various parts of the sound in detail. "
@@ -2219,7 +2290,7 @@ NORMAL (L"To see the wave form of a @Sound that is in the list of objects, "
 	"To move a selected part of the sound to another location, use #Cut and #Paste from the #Edit menu. "
 	"You can open sound windows for more than one sound, and then cut, copy, and paste between the sounds, "
 	"just as you are used to do with text and pictures in word processing programs.")
-NORMAL (L"If your sound file is longer than a couple of minutes, "
+NORMAL (U"If your sound file is longer than a couple of minutes, "
 	"or if you want to see and listen to both channels of a stereo sound, "
 	"you may prefer to open it with @@Open long sound file... at . "
 	"This puts a @LongSound object into the list. In this way, most of the sound will stay in the file on disk, "
@@ -2227,43 +2298,43 @@ NORMAL (L"If your sound file is longer than a couple of minutes, "
 	"To change these 60 seconds to something else, e.g. 500 seconds, choose ##LongSound prefs...# from the #Preferences submenu.")
 MAN_END
 
-MAN_BEGIN (L"Intro 3. Spectral analysis", L"ppgb", 20070905)
-INTRO (L"This section describes how you can analyse the spectral content of an existing sound. "
+MAN_BEGIN (U"Intro 3. Spectral analysis", U"ppgb", 20070905)
+INTRO (U"This section describes how you can analyse the spectral content of an existing sound. "
 	"You will learn how to use %spectrograms and %%spectral slices%.")
-LIST_ITEM (L"@@Intro 3.1. Viewing a spectrogram")
-LIST_ITEM (L"@@Intro 3.2. Configuring the spectrogram")
-LIST_ITEM (L"@@Intro 3.3. Querying the spectrogram")
-LIST_ITEM (L"@@Intro 3.4. Printing the spectrogram")
-LIST_ITEM (L"@@Intro 3.5. The Spectrogram object")
-LIST_ITEM (L"@@Intro 3.6. Viewing a spectral slice")
-LIST_ITEM (L"@@Intro 3.7. Configuring the spectral slice")
-LIST_ITEM (L"@@Intro 3.8. The Spectrum object")
-MAN_END
-
-MAN_BEGIN (L"Intro 3.1. Viewing a spectrogram", L"ppgb", 20110128)
-INTRO (L"To see the spectral content of a sound as a function of time, "
+LIST_ITEM (U"@@Intro 3.1. Viewing a spectrogram")
+LIST_ITEM (U"@@Intro 3.2. Configuring the spectrogram")
+LIST_ITEM (U"@@Intro 3.3. Querying the spectrogram")
+LIST_ITEM (U"@@Intro 3.4. Printing the spectrogram")
+LIST_ITEM (U"@@Intro 3.5. The Spectrogram object")
+LIST_ITEM (U"@@Intro 3.6. Viewing a spectral slice")
+LIST_ITEM (U"@@Intro 3.7. Configuring the spectral slice")
+LIST_ITEM (U"@@Intro 3.8. The Spectrum object")
+MAN_END
+
+MAN_BEGIN (U"Intro 3.1. Viewing a spectrogram", U"ppgb", 20110128)
+INTRO (U"To see the spectral content of a sound as a function of time, "
 	"select a @Sound or @LongSound object and choose @@View & Edit at . "
 	"A @SoundEditor or @LongSoundEditor window will appear on your screen. "
 	"In the entire bottom half of this window you will see a greyish image, which is called a %spectrogram. "
 	"If you do not see it, choose @@Show spectrogram@ from the #Spectrogram menu.")
-NORMAL (L"The spectrogram is a @@spectro-temporal representation@ of the sound. "
+NORMAL (U"The spectrogram is a @@spectro-temporal representation@ of the sound. "
 	"The horizontal direction of the spectrogram represents @time, the vertical direction represents @frequency. "
 	"The time scale of the spectrogram is the same as that of the waveform, so the spectrogram reacts "
 	"to your zooming and scrolling. "
 	"To the left of the spectrogram, you see the frequency scale. The frequency at the bottom of the spectrogram "
 	"is usually 0 Hz (hertz, cps, cycles per second), and a common value for the frequency at the top is 5000 Hz.")
-NORMAL (L"Darker parts of the spectrogram mean higher energy densities, lighter parts mean lower energy densities. "
+NORMAL (U"Darker parts of the spectrogram mean higher energy densities, lighter parts mean lower energy densities. "
 	"If the spectrogram has a dark area around a time of 1.2 seconds and a frequency of 4000 Hz, "
 	"this means that the sound has lots of energy for those high frequencies at that time. "
 	"For many examples of spectrograms of speech sounds, see the textbook by @@Ladefoged (2001)@ and "
 	"the reference work by @@Ladefoged & Maddieson (1996)@.")
-NORMAL (L"To see what time and frequency a certain part of the spectrogram is associated with, "
+NORMAL (U"To see what time and frequency a certain part of the spectrogram is associated with, "
 	"just click on the spectrogram and you will see the vertical time cursor showing the time above "
 	"the waveform and the horizontal frequency cursor showing the frequency to the left of the spectrogram. "
 	"This is one of the ways to find the %formant frequencies for vowels, or the main spectral peaks "
 	"for fricatives.")
-ENTRY (L"Hey, there are white vertical stripes at the edges!")
-NORMAL (L"This is normal. Spectral analysis requires an %%analysis window% of a certain duration. "
+ENTRY (U"Hey, there are white vertical stripes at the edges!")
+NORMAL (U"This is normal. Spectral analysis requires an %%analysis window% of a certain duration. "
 	"For instance, if Praat wants to know the spectrum at 1.342 seconds, it needs to include information "
 	"about the signal in a 10-milliseconds window around this time point, i.e., Praat will use "
 	"signal information about all times between 1.337 and 1.347 seconds. At the very edges of the sound, "
@@ -2271,13 +2342,13 @@ NORMAL (L"This is normal. Spectral analysis requires an %%analysis window% of a
 	"if the sound runs from 0 to 1.8 seconds, no spectrum can be computed between 0 and 0.005 "
 	"seconds or between 1.795 and 1.800 seconds. Hence the white stripes. If you do not see them "
 	"immediately when you open the sound, zoom in on the beginning or end of the sound.")
-NORMAL (L"When you zoom in on the middle of the sound (or anywhere not near the edges), the white stripes vanish. "
+NORMAL (U"When you zoom in on the middle of the sound (or anywhere not near the edges), the white stripes vanish. "
 	"Suddenly you see only the time stretch between 0.45 and 1.35 seconds, for instance. "
 	"But Praat did not forget what the signal looks like just outside the edges of this time window. "
 	"To display a spectrogram from 0.45 to 1.35 seconds, Praat will use information from the wave form "
 	"between 0.445 and 1.355 seconds, and if this is available, you will see no white stripes at the edges of the window.")
-ENTRY (L"Hey, it changes when I scroll!")
-NORMAL (L"This is normal as well, especially for long windows. If your visible time window is 20 seconds long, "
+ENTRY (U"Hey, it changes when I scroll!")
+NORMAL (U"This is normal as well, especially for long windows. If your visible time window is 20 seconds long, "
 	"and the window takes up 1000 screen pixels horizontally, "
 	"then you might think that every one-pixel-wide vertical line should represent the spectrum of 20 milliseconds of sound. "
 	"But for reasons of computation speed, Praat will only show the spectrum of the part of the sound "
@@ -2290,25 +2361,25 @@ NORMAL (L"This is normal as well, especially for long windows. If your visible t
 	"the centres of the pixels will fall in different parts of the spectrogram with each scroll. "
 	"Hence the apparent changes. If your visible window is shorter than a couple of seconds, "
 	"the scrolling spectrogram will appear much smoother.")
-NORMAL (L"The darkness of the spectrogram will also change when you scroll, because the visible part with the most "
+NORMAL (U"The darkness of the spectrogram will also change when you scroll, because the visible part with the most "
 	"energy is defined as black. When a very energetic part of the signal scrolls out of view, the spectrogram "
 	"will turn darker. The next section will describe a way to switch this off.")
 MAN_END
 
-MAN_BEGIN (L"Intro 3.2. Configuring the spectrogram", L"ppgb", 20110128)
-NORMAL (L"With @@Spectrogram settings...@ from the #Spectrogram menu, "
+MAN_BEGIN (U"Intro 3.2. Configuring the spectrogram", U"ppgb", 20110128)
+NORMAL (U"With @@Spectrogram settings...@ from the #Spectrogram menu, "
 	"you can determine how the spectrogram is computed and how it is displayed. "
 	"These settings will be remembered across Praat sessions. "
 	"All these settings have standard values (\"factory settings\"), which appear "
 	"when you click ##Standards#.")
-TAG (L"%%View range% (Hz)")
-DEFINITION (L"the range of frequencies to display. The standard is 0 Hz at the bottom and 5000 Hz at the top. "
+TAG (U"%%View range% (Hz)")
+DEFINITION (U"the range of frequencies to display. The standard is 0 Hz at the bottom and 5000 Hz at the top. "
 	"If this maximum frequency is higher than the Nyquist frequency of the Sound "
 	"(which is half its sampling frequency), some values in the spectrogram will be zero, and the higher "
 	"frequencies will be drawn in white. You can see this if you record a Sound at 44100 Hz and set the "
 	"view range from 0 Hz to 25000 Hz.")
-TAG (L"%%Window length")
-DEFINITION (L"the duration of the analysis window. If this is 0.005 seconds (the standard), "
+TAG (U"%%Window length")
+DEFINITION (U"the duration of the analysis window. If this is 0.005 seconds (the standard), "
 	"Praat uses for each frame the part of the sound that lies between 0.0025 seconds before "
 	"and 0.0025 seconds after the centre of that frame "
 	"(for Gaussian windows, Praat actually uses a bit more than that). "
@@ -2319,15 +2390,15 @@ DEFINITION (L"the duration of the analysis window. If this is 0.005 seconds (the
 	"To get a `broad-band' spectrogram (bandwidth 260 Hz), keep the standard window length of 5 ms; "
 	"to get a `narrow-band' spectrogram (bandwidth 43 Hz), set it to 30 ms (0.03 seconds). "
 	"The other window shapes give slightly different values.")
-TAG (L"%%Dynamic range% (dB)")
-DEFINITION (L"All values that are more than %%Dynamic range% dB below the maximum (perhaps after dynamic compression, "
+TAG (U"%%Dynamic range% (dB)")
+DEFINITION (U"All values that are more than %%Dynamic range% dB below the maximum (perhaps after dynamic compression, "
 	"see @@Advanced spectrogram settings...@) "
 	"will be drawn in white. Values in-between have appropriate shades of grey. Thus, if the highest "
 	"peak in the spectrogram has a height of 30 dB/Hz, and the dynamic range is 50 dB (which is the standard value), "
 	"then values below -20 dB/Hz will be drawn in white, and values between -20 dB/Hz and 30 dB/Hz will be drawn "
 	"in various shades of grey.")
-ENTRY (L"The bandwidth")
-NORMAL (L"To see how the window length influences the bandwidth, "
+ENTRY (U"The bandwidth")
+NORMAL (U"To see how the window length influences the bandwidth, "
 	"first create a 1000-Hz sine wave with @@Create Sound from formula...@ "
 	"by typing $$1/2 * sin (2*pi*1000*x)$ as the formula, then click ##View & Edit#. "
 	"The spectrogram will show a horizontal black line. "
@@ -2335,45 +2406,45 @@ NORMAL (L"To see how the window length influences the bandwidth, "
 	"of the lines varies. The line gets thinner if you raise the window length. "
 	"Apparently, if the analysis window comprises more periods of the wave, "
 	"the spectrogram can tell us the frequency of the wave with greater precision.")
-NORMAL (L"To see this more precisely, create a sum of two sine waves, with frequencies of 1000 and 1200 Hz. "
+NORMAL (U"To see this more precisely, create a sum of two sine waves, with frequencies of 1000 and 1200 Hz. "
 	"the formula is $$1/4 * sin (2*pi*1000*x) + 1/4 * sin (2*pi*1200*x)$. In the editor, you will see "
 	"a single thick band if the analysis window is short (5 ms), and two separate bands if the analysis "
 	"window is long (30 ms). Apparently, the frequency resolution gets better with longer analysis windows.")
-NORMAL (L"So why don't we always use long analysis windows? The answer is that their time resolution is poor. "
+NORMAL (U"So why don't we always use long analysis windows? The answer is that their time resolution is poor. "
 	"To see this, create a sound that consists of two sine waves and two short clicks. The formula is "
 	"$$0.02*(sin(2*pi*1000*x)+sin(2*pi*1200*x)) + (col=10000)+(col=10200)$. "
 	"If you view this sound, you can see that the two clicks will overlap "
 	"in time if the analysis window is long, and that the sine waves overlap in frequency if the "
 	"analysis window is short. Apparently, there is a trade-off between time resolution and "
 	"frequency resolution. One cannot know both the time and the frequency with great precision.")
-ENTRY (L"Advanced settings")
-NORMAL (L"The Spectrum menu also contains @@Advanced spectrogram settings... at .")
+ENTRY (U"Advanced settings")
+NORMAL (U"The Spectrum menu also contains @@Advanced spectrogram settings... at .")
 MAN_END
 
-MAN_BEGIN (L"Advanced spectrogram settings...", L"ppgb", 20120531)
-ENTRY (L"Optimization")
-TAG (L"%%Number of time steps%")
-DEFINITION (L"the maximum number of points along the time window for which Praat has to compute "
+MAN_BEGIN (U"Advanced spectrogram settings...", U"ppgb", 20120531)
+ENTRY (U"Optimization")
+TAG (U"%%Number of time steps%")
+DEFINITION (U"the maximum number of points along the time window for which Praat has to compute "
 	"the spectrum. If your screen is not wider than 1200 pixels, then the standard of 1000 is "
 	"appropriate, since there is no point in computing more than one spectrum per one-pixel-wide vertical line. "
 	"If you have a really wide screen, you may see improvement if you raise this number to 1500.")
-TAG (L"%%Number of frequency steps%")
-DEFINITION (L"the maximum number of points along the frequency axis for which Praat has to compute "
+TAG (U"%%Number of frequency steps%")
+DEFINITION (U"the maximum number of points along the frequency axis for which Praat has to compute "
 	"the spectrum. If your screen is not taller than 768 pixels, then the standard of 250 is "
 	"appropriate, since there is no point in computing more than one spectrum per one-pixel-height horizontal line. "
 	"If you have a really tall screen, you may see improvement if you raise this number.")
-NORMAL (L"For purposes of computation speed, Praat may decide to change the time step and the frequency step. "
+NORMAL (U"For purposes of computation speed, Praat may decide to change the time step and the frequency step. "
 	"This is because the time step never needs to be smaller than 1/(8\\Vr\\pi) of the window length, "
 	"and the frequency step never needs to be smaller than (\\Vr\\pi)/8 of the inverse of the window length. "
 	"For instance, if the window length is 5 ms, "
 	"the actual time step will never be less than 5/(8\\Vr\\pi) = 0.353 ms, "
 	"and the actual frequency step will never be less than (\\Vr\\pi)/8/0.005 = 44.31 Hz.")
-ENTRY (L"Spectrogram analysis settings")
-TAG (L"%%Method")
-DEFINITION (L"there is currently only one method available in this window for computing a spectrum from "
+ENTRY (U"Spectrogram analysis settings")
+TAG (U"%%Method")
+DEFINITION (U"there is currently only one method available in this window for computing a spectrum from "
 	"a sound: the Fourier transform.")
-TAG (L"%%Window shape")
-DEFINITION (L"the shape of the analysis window. To compute the spectrum at, say, 3.850 seconds, "
+TAG (U"%%Window shape")
+DEFINITION (U"the shape of the analysis window. To compute the spectrum at, say, 3.850 seconds, "
 	"samples that lie close to 3.850 seconds are given more weight than samples further away. "
 	"The relative extent to which each sample contributes to the spectrum is given by the window shape. "
 	"You can choose from: Gaussian, Square (none, rectangular), Hamming (raised sine-squared), "
@@ -2381,15 +2452,15 @@ DEFINITION (L"the shape of the analysis window. To compute the spectrum at, say,
 	"The Gaussian window is superior, as it gives no %sidelobes in your spectrogram (see below); "
 	"it analyzes a factor of 2 slower than the other window shapes, "
 	"because the analysis is actually performed on twice as many samples per frame.")
-ENTRY (L"Sidelobes; anybody wants to win a cake?")
-NORMAL (L"The Gaussian window is the only shape that we can consider seriously as a candidate for "
+ENTRY (U"Sidelobes; anybody wants to win a cake?")
+NORMAL (U"The Gaussian window is the only shape that we can consider seriously as a candidate for "
 	"the analysis window. To see this, create a 1000-Hz sine wave with @@Create Sound from formula...@ "
 	"by typing $$1/2 * sin (2*pi*1000*x)$ as the formula, then click ##View & Edit#. "
 	"If the window shape is Gaussian, the spectrogram will show a horizontal black line. "
 	"If the window shape is anything else, the spectrogram will show many horizontal grey lines (%sidelobes), "
 	"which do not represent anything that is available in the signal. They are artifacts of the "
 	"window shapes.")
-NORMAL (L"We include these other window shapes only for pedagogical purposes "
+NORMAL (U"We include these other window shapes only for pedagogical purposes "
 	"and because the Hanning and Hamming windows have traditionally been used in other programs before "
 	"computers were as fast as they are now (a spectrogram is computed twice as fast "
 	"with these other windows). Several other programs still use these inferior window shapes, and you are "
@@ -2397,23 +2468,23 @@ NORMAL (L"We include these other window shapes only for pedagogical purposes "
 	"We promise such people a large cake if they can come up with sounds that look better "
 	"with Hanning or Hamming windows than with a Gaussian window. An example of the reverse is easy "
 	"to find; we have just seen one.")
-ENTRY (L"Spectrogram blackness settings")
-TAG (L"%%Autoscaling%")
-TAG (L"%%Maximum% (dB/Hz)")
-DEFINITION (L"all parts of the spectrogram that have a power above %maximum (after preemphasis) "
+ENTRY (U"Spectrogram blackness settings")
+TAG (U"%%Autoscaling%")
+TAG (U"%%Maximum% (dB/Hz)")
+DEFINITION (U"all parts of the spectrogram that have a power above %maximum (after preemphasis) "
 	"will be drawn in black. The standard maximum is 100 dB/Hz, but if %autoscaling is on (which is the standard), "
 	"Praat will use the maximum of the visible part of the spectrogram instead; "
 	"this ensures that the window will always look well, but it also means that the blackness "
 	"of a certain part of the spectrogram will change as you scroll.")
-TAG (L"%%Preemphasis% (dB/octave)")
-DEFINITION (L"determines the steepness of a high-pass filter, "
+TAG (U"%%Preemphasis% (dB/octave)")
+DEFINITION (U"determines the steepness of a high-pass filter, "
 	"i.e., how much the power of higher frequencies will be raised before drawing, as compared to lower frequencies. "
 	"Since the spectral slope of human vowels is approximately -6 dB per octave, "
 	"the standard value for this setting is +6 dB per octave, "
 	"so that the spectrum is flattened and the higher formants look as strong as the lower ones. "
 	"When you raise the preemphasis, frequency bands above 1000 Hz will become darker, those below 1000 Hz will become lighter.")
-TAG (L"%%Dynamic compression")
-DEFINITION (L"determines how much stronger weak spectra should be made before drawing. "
+TAG (U"%%Dynamic compression")
+DEFINITION (U"determines how much stronger weak spectra should be made before drawing. "
 	"Normally, this parameter is between 0 and 1. If it is 0 (the standard value), there is no dynamic compression. "
 	"If it is 1, all spectra will be drawn equally strong, "
 	"i.e., all of them will contain frequencies that are drawn in black. "
@@ -2423,20 +2494,20 @@ DEFINITION (L"determines how much stronger weak spectra should be made before dr
 	"so that its maximum will be seen at 44 dB (thus making this frame visible).")
 MAN_END
 
-MAN_BEGIN (L"Intro 3.3. Querying the spectrogram", L"ppgb", 20030403)
-NORMAL (L"If you click anywhere inside the spectrogram, a cursor cross will appear, "
+MAN_BEGIN (U"Intro 3.3. Querying the spectrogram", U"ppgb", 20030403)
+NORMAL (U"If you click anywhere inside the spectrogram, a cursor cross will appear, "
 	"and you will see the time and frequency in red at the top and to the left of the window. "
 	"To see the time in the Info window, "
 	"choose ##Get cursor# from the #Query menu or press the F6 key. "
 	"To see the frequency in the Info window, "
 	"choose ##Get frequency# from the #Spectrum menu.")
-NORMAL (L"To query the power of the spectrogram at the cursor cross, "
+NORMAL (U"To query the power of the spectrogram at the cursor cross, "
 	"choose ##Get spectral power at cursor cross# from the #Spectrum menu or press the F9 key. "
 	"The Info window will show you the power density, expressed in Pascal^2/Hz.")
 MAN_END
 
-MAN_BEGIN (L"Intro 3.4. Printing the spectrogram", L"ppgb", 20070905)
-NORMAL (L"To print a spectrogram, or to put it in an EPS file or on the clipboard for inclusion in your word processor, "
+MAN_BEGIN (U"Intro 3.4. Printing the spectrogram", U"ppgb", 20070905)
+NORMAL (U"To print a spectrogram, or to put it in an EPS file or on the clipboard for inclusion in your word processor, "
 	"you first have to paint it into the @@Picture window at . "
 	"You do this by choosing ##Paint visible spectrogram...# "
 	"from the Spectrum menu in the Sound or TextGrid window. "
@@ -2444,8 +2515,8 @@ NORMAL (L"To print a spectrogram, or to put it in an EPS file or on the clipboar
 	"or copy it to the clipboard (to do Paste in your word processor, for instance).")
 MAN_END
 
-MAN_BEGIN (L"Intro 3.5. The Spectrogram object", L"ppgb", 20070905)
-NORMAL (L"To do more with spectrograms, you can create a @Spectrogram object in the @@List of Objects at . "
+MAN_BEGIN (U"Intro 3.5. The Spectrogram object", U"ppgb", 20070905)
+NORMAL (U"To do more with spectrograms, you can create a @Spectrogram object in the @@List of Objects at . "
 	"You do this either by choosing ##Extract visible spectrogram# "
 	"from the Spectrum menu in the Sound or TextGrid window, "
 	"or by selecting a Sound object in the list and choosing @@Sound: To Spectrogram...@ from the #Spectrum menu. "
@@ -2456,26 +2527,26 @@ NORMAL (L"To do more with spectrograms, you can create a @Spectrogram object in
 	"Many other commands are available in the @@dynamic menu at .")
 MAN_END
 
-MAN_BEGIN (L"Intro 3.6. Viewing a spectral slice", L"ppgb", 20030316)
-INTRO (L"With ##View spectral slice# from the #Spectrum menu in the @SoundEditor and the @TextGridEditor, "
+MAN_BEGIN (U"Intro 3.6. Viewing a spectral slice", U"ppgb", 20030316)
+INTRO (U"With ##View spectral slice# from the #Spectrum menu in the @SoundEditor and the @TextGridEditor, "
 	"you can see the frequency spectrum at the time cursor "
 	"or the average frequency spectrum in the time selection.")
-ENTRY (L"Spectral slice at the cursor")
-NORMAL (L"If you click anywhere in the wave form of the SoundEditor or TextGridEditor windows, "
+ENTRY (U"Spectral slice at the cursor")
+NORMAL (U"If you click anywhere in the wave form of the SoundEditor or TextGridEditor windows, "
 	"a cursor will appear at that time. If you then choose ##View spectral slice#, "
 	"Praat will create a @Spectrum object named %slice in the Objects window and show it in a @SpectrumEditor window. "
 	"In this way, you can inspect the frequency contents of the signal around the cursor position.")
-ENTRY (L"Spectral slice from a selection")
-NORMAL (L"If you drag the mouse through the wave form of the SoundEditor or TextGridEditor windows, "
+ENTRY (U"Spectral slice from a selection")
+NORMAL (U"If you drag the mouse through the wave form of the SoundEditor or TextGridEditor windows, "
 	"a @@time selection@ will appear. If you then choose ##View spectral slice#, "
 	"Praat will again create a @Spectrum object named %slice in the Objects window and show it in a @SpectrumEditor window. "
 	"In this way, you can inspect the frequency contents of the signal in the selection.")
 MAN_END
 
 
-MAN_BEGIN (L"Intro 3.7. Configuring the spectral slice", L"ppgb", 20110128)
-ENTRY (L"Spectral slice at the cursor")
-NORMAL (L"What Praat does precisely, depends on your Spectrogram settings. "
+MAN_BEGIN (U"Intro 3.7. Configuring the spectral slice", U"ppgb", 20110128)
+ENTRY (U"Spectral slice at the cursor")
+NORMAL (U"What Praat does precisely, depends on your Spectrogram settings. "
 	"Suppose that the %%window length% setting is 0.005 seconds (5 milliseconds). "
 	"If the %%window shape% is not Gaussian, Praat will extract the part of the sound "
 	"that runs from 2.5 milliseconds before the cursor to 2.5 ms after the cursor. "
@@ -2485,60 +2556,60 @@ NORMAL (L"What Praat does precisely, depends on your Spectrogram settings. "
 	"that runs from 5 milliseconds before the cursor to 5 ms after the cursor. The spectrum will then be based "
 	"on a `physical' window length of 10 ms, although the `effective' window length is still 5 ms "
 	"(see @@Intro 3.2. Configuring the spectrogram@ for details).")
-ENTRY (L"Spectral slice from a selection")
-NORMAL (L"What Praat does precisely, again depends on the %%window shape% of your Spectrogram settings. "
+ENTRY (U"Spectral slice from a selection")
+NORMAL (U"What Praat does precisely, again depends on the %%window shape% of your Spectrogram settings. "
 	"Suppose that your selection is 50 ms long. Praat will extract the entire selection, "
 	"then multiply this 50 ms long signal by the window shape, then compute a spectrum, put it into the Objects window and open it an editor window. "
 	"This procedure is equivalent to choosing ##Extract windowed selection...# (with a %%relative duration% of 1.0), "
 	"followed by ##To Spectrum...# (with %fast switched on), followed by #Edit.")
-NORMAL (L"If the window is Gaussian, Praat will still only use the selection, without doubling its duration. "
+NORMAL (U"If the window is Gaussian, Praat will still only use the selection, without doubling its duration. "
 	"This means that the spectrum that you see in this case will mainly be based on the centre half of the selection, "
 	"and the signal near the edges will be largely ignored.")
 MAN_END
 
-MAN_BEGIN (L"Intro 3.8. The Spectrum object", L"ppgb", 20030403)
-NORMAL (L"To compute a Fourier frequency spectrum of an entire sound, "
+MAN_BEGIN (U"Intro 3.8. The Spectrum object", U"ppgb", 20030403)
+NORMAL (U"To compute a Fourier frequency spectrum of an entire sound, "
 	"select a @Sound object and choose @@Sound: To Spectrum...|To Spectrum...@ from the #Spectrum menu. "
 	"A new @Spectrum object will appear in the @@List of Objects at . "
 	"To view or modify it (or listen to its parts), click @@View & Edit at . "
 	"To print it, choose one of the #Draw commands to draw the Spectrum object to the @@Picture window@ first.")
 MAN_END
 
-MAN_BEGIN (L"Intro 4. Pitch analysis", L"ppgb", 20070905)
-INTRO (L"This section describes how you can analyse the pitch contour of an existing sound.")
-LIST_ITEM (L"@@Intro 4.1. Viewing a pitch contour")
-LIST_ITEM (L"@@Intro 4.2. Configuring the pitch contour")
-LIST_ITEM (L"@@Intro 4.3. Querying the pitch contour")
-LIST_ITEM (L"@@Intro 4.4. Printing the pitch contour")
-LIST_ITEM (L"@@Intro 4.5. The Pitch object")
+MAN_BEGIN (U"Intro 4. Pitch analysis", U"ppgb", 20070905)
+INTRO (U"This section describes how you can analyse the pitch contour of an existing sound.")
+LIST_ITEM (U"@@Intro 4.1. Viewing a pitch contour")
+LIST_ITEM (U"@@Intro 4.2. Configuring the pitch contour")
+LIST_ITEM (U"@@Intro 4.3. Querying the pitch contour")
+LIST_ITEM (U"@@Intro 4.4. Printing the pitch contour")
+LIST_ITEM (U"@@Intro 4.5. The Pitch object")
 MAN_END
 
-MAN_BEGIN (L"Intro 4.1. Viewing a pitch contour", L"ppgb", 20110128)
-NORMAL (L"To see the pitch contour of an existing sound as a function of time, "
+MAN_BEGIN (U"Intro 4.1. Viewing a pitch contour", U"ppgb", 20110128)
+NORMAL (U"To see the pitch contour of an existing sound as a function of time, "
 	"select a @Sound or @LongSound object and choose @@View & Edit at . "
 	"A @SoundEditor window will appear on your screen. "
 	"The bottom half of this window will contain a pitch contour, drawn as a blue line or as a sequence of blue dots. "
 	"If you do not see the pitch contour, choose @@Show pitch@ from the #Pitch menu.")
-NORMAL (L"To the right of the window, you may see three pitch values, written with blue digits: "
+NORMAL (U"To the right of the window, you may see three pitch values, written with blue digits: "
 	"at the bottom, you see the floor of the viewable pitch range, perhaps 75 Hz; at the top, "
 	"you see the ceiling of the pitch range, perhaps 600 Hz; and somewhere in between, you see the pitch value "
 	"at the cursor, or the average pitch in the selection.")
 MAN_END
 
-MAN_BEGIN (L"Intro 4.2. Configuring the pitch contour", L"ppgb", 20050830)
-NORMAL (L"With @@Pitch settings...@ from the #Pitch menu, "
+MAN_BEGIN (U"Intro 4.2. Configuring the pitch contour", U"ppgb", 20050830)
+NORMAL (U"With @@Pitch settings...@ from the #Pitch menu, "
 	"you can determine how the pitch contour is displayed and how it is computed. "
 	"These settings will be remembered across Praat sessions. "
 	"All these settings have standard values (\"factory settings\"), which appear "
 	"when you click #Standards.")
-ENTRY (L"The %%pitch range% setting")
-NORMAL (L"This is the most important setting for pitch analysis. The standard range is from 75 to 500 hertz, "
+ENTRY (U"The %%pitch range% setting")
+NORMAL (U"This is the most important setting for pitch analysis. The standard range is from 75 to 500 hertz, "
 	"which means that the pitch analysis method will only find values between 75 and 500 Hz. "
 	"The range that you set here will be shown to the right of the analysis window.")
-NORMAL (L"For a male voice, you may want to set the floor to 75 Hz, and the ceiling to 300 Hz; "
+NORMAL (U"For a male voice, you may want to set the floor to 75 Hz, and the ceiling to 300 Hz; "
 	"for a female voice, set the range to 100-500 Hz instead. For creaky voice you will want to set it much "
 	"lower than 75 Hz.")
-NORMAL (L"Here is why you have to supply these settings. If the pitch floor is 75 Hz, "
+NORMAL (U"Here is why you have to supply these settings. If the pitch floor is 75 Hz, "
 	"the pitch analysis method requires a 40-millisecond analysis window, "
 	"i.e., in order to measure the F0 at a time of, say, 0.850 seconds, "
 	"Praat needs to consider a part of the sound that runs from 0.830 to 0.870 seconds. "
@@ -2546,50 +2617,50 @@ NORMAL (L"Here is why you have to supply these settings. If the pitch floor is 7
 	"If you set the pitch floor down to 25 Hz, the analysis window will grow to 120 milliseconds "
 	"(which is again 3 maximum pitch periods), i.e., all times between 0.790 and 0.910 seconds will be considered. "
 	"This makes it less easy to see fast F0 changes.")
-NORMAL (L"So setting the floor of the pitch range is a technical requirement for the pitch analysis. "
+NORMAL (U"So setting the floor of the pitch range is a technical requirement for the pitch analysis. "
 	"If you set it too low, you will miss very fast F0 changes, and if you set it too high, "
 	"you will miss very low F0 values. For children's voices you can often use 200 Hz, "
 	"although 75 Hz will still give you the same time resolution as you get for the males.")
-ENTRY (L"The %units setting")
-NORMAL (L"This setting determines the units of the vertical pitch scale. Most people like to see the pitch range "
+ENTRY (U"The %units setting")
+NORMAL (U"This setting determines the units of the vertical pitch scale. Most people like to see the pitch range "
 	"in hertz, but there are several other possibilities.")
-ENTRY (L"Advanced settings")
-NORMAL (L"The Pitch menu also contains @@Advanced pitch settings... at .")
+ENTRY (U"Advanced settings")
+NORMAL (U"The Pitch menu also contains @@Advanced pitch settings... at .")
 MAN_END
 
-MAN_BEGIN (L"Time step settings...", L"ppgb", 20031003)
-INTRO (L"A command in the #View menu of the @SoundEditor and @TextGridEditor "
+MAN_BEGIN (U"Time step settings...", U"ppgb", 20031003)
+INTRO (U"A command in the #View menu of the @SoundEditor and @TextGridEditor "
 	"to determine the time interval between consecutive measurements "
 	"of pitch, formants, and intensity.")
-ENTRY (L"Automatic time steps")
-NORMAL (L"It is recommended that you set the %%Time step strategy% to #Automatic. "
+ENTRY (U"Automatic time steps")
+NORMAL (U"It is recommended that you set the %%Time step strategy% to #Automatic. "
 	"In this way, Praat computes just enough pitch, formant, and intensity values to draw "
 	"reliable pitch, formant, and intensity contours. In general, Praat will compute 4 values "
 	"within an analysis window (\"four times oversampling\").")
-NORMAL (L"As described in @@Sound: To Pitch...@, Praat's standard time step for pitch analysis is 0.75 divided by the pitch floor, "
+NORMAL (U"As described in @@Sound: To Pitch...@, Praat's standard time step for pitch analysis is 0.75 divided by the pitch floor, "
 	"e.g., if the pitch floor is 75 Hz, the time step will be 0.01 seconds. "
 	"In this way, there will be 4 pitch measurements within an analysis window, which is 3 / (75 Hz) = 40 milliseconds long.")
-NORMAL (L"As described in @@Sound: To Formant (burg)...@, Praat's standard time step for formant measurements is the %%Window length% divided by 4, "
+NORMAL (U"As described in @@Sound: To Formant (burg)...@, Praat's standard time step for formant measurements is the %%Window length% divided by 4, "
 	"e.g. if the window length is 0.025 seconds, the time step will be 6.25 milliseconds.")
-NORMAL (L"As described in @@Sound: To Intensity...@, Praat's standard time step for intensity measurements is 0.8 divided by the pitch floor, "
+NORMAL (U"As described in @@Sound: To Intensity...@, Praat's standard time step for intensity measurements is 0.8 divided by the pitch floor, "
 	"e.g. if the pitch floor is 75 Hz, the time step will be 10.6666667 milliseconds. "
 	"In this way, there will be 4 intensity measurements within an intensity analysis window, "
 	"which is 3.2 / (75 Hz) = 42.6666667 milliseconds long.")
-ENTRY (L"Fixed time step")
-NORMAL (L"You can override the automatic time step by setting the %%Time step strategy% to #Fixed. "
+ENTRY (U"Fixed time step")
+NORMAL (U"You can override the automatic time step by setting the %%Time step strategy% to #Fixed. "
 	"The %%Fixed time step% setting then determines the time step that Praat will use: "
 	"if you set it to 0.001 seconds, Praat will compute pitch, formant, and intensity values for every millisecond. "
 	"Beware that this can slow down the editor window appreciably, because this step is much smaller "
 	"than usual values of the automatic time step (see above).")
-NORMAL (L"Enlarging the time step to e.g. 0.1 seconds will speed up the editor window "
+NORMAL (U"Enlarging the time step to e.g. 0.1 seconds will speed up the editor window "
 	"but may render the pitch, formant, and intensity curves less exact (they become %undersampled), "
 	"which will influence your measurements and the locations of the pulses.")
-NORMAL (L"If there are fewer than 2.0 pitch measurement points per analysis window, "
+NORMAL (U"If there are fewer than 2.0 pitch measurement points per analysis window, "
 	"Praat will draw the pitch curve as separate little blue disks "
 	"rather than as a continuous blue curve, in order to warn you of the undersampling. "
 	"E.g. if the pitch floor is 75 Hz, Praat will draw the pitch curve as disks if the time step is greater than 0.02 seconds.")
-ENTRY (L"View-dependent time step")
-NORMAL (L"Another way to override the standard time step is by setting the %%Time step strategy% to ##View-dependent#. "
+ENTRY (U"View-dependent time step")
+NORMAL (U"Another way to override the standard time step is by setting the %%Time step strategy% to ##View-dependent#. "
 	"The %%Number of time steps per view% setting then determines the time step that Praat will use: "
 	"if you set it to 100, Praat will always compute 100 pitch, formant, and intensity values within the view window. "
 	"More precisely: if you zoom the view window to 3 seconds, Praat will show you 100 pitch, formant, and intensity points at distances "
@@ -2599,12 +2670,12 @@ NORMAL (L"Another way to override the standard time step is by setting the %%Tim
 	"of zooming.")
 MAN_END
 
-MAN_BEGIN (L"Advanced pitch settings...", L"ppgb", 20110808)
-INTRO (L"A command in the #Pitch menu of the @SoundEditor or @TextGridEditor windows. "
+MAN_BEGIN (U"Advanced pitch settings...", U"ppgb", 20110808)
+INTRO (U"A command in the #Pitch menu of the @SoundEditor or @TextGridEditor windows. "
 	"Before changing the advanced pitch settings, make sure you understand "
 	"@@Intro 4.2. Configuring the pitch contour at .")
-ENTRY (L"View range different from analysis range")
-NORMAL (L"Normally, the range of pitch values that can be seen in the editor window is equal to the range of pitch values "
+ENTRY (U"View range different from analysis range")
+NORMAL (U"Normally, the range of pitch values that can be seen in the editor window is equal to the range of pitch values "
 	"that the analysis algorithm can determine. If you set the analysis range from 75 to 500 Hz, this will be the range "
 	"you see in the editor window as well. If the pitch values in the curve happen to be between 350 and 400 Hz, "
 	"you may want to zoom in to the 350-400 Hz pitch region. "
@@ -2612,14 +2683,14 @@ NORMAL (L"Normally, the range of pitch values that can be seen in the editor win
 	"However, the analysis range will also change in that case, so that the curve itself may change. "
 	"If you do not want that, you can change the %%View range% settings "
 	"from \"0.0 (= auto)\" - \"0.0 (=auto)\" to something else, perhaps \"350\" - \"400\".")
-ENTRY (L"Pitch analysis settings")
-NORMAL (L"For information about these, see @@Sound: To Pitch (ac)... at . The standard settings are best in most cases. "
+ENTRY (U"Pitch analysis settings")
+NORMAL (U"For information about these, see @@Sound: To Pitch (ac)... at . The standard settings are best in most cases. "
 	"For some pathological voices, you will want to set the voicing threshold to much less than the standard of 0.45, "
 	"in order to get pitch values even in irregular parts of the signal.")
 MAN_END
 
-MAN_BEGIN (L"Intro 4.3. Querying the pitch contour", L"ppgb", 20040614)
-NORMAL (L"With @@Get pitch@ from the #Pitch menu in the @SoundEditor or @TextGridEditor, "
+MAN_BEGIN (U"Intro 4.3. Querying the pitch contour", U"ppgb", 20040614)
+NORMAL (U"With @@Get pitch@ from the #Pitch menu in the @SoundEditor or @TextGridEditor, "
 	"you get information about the pitch at the cursor or in the selection. "
 	"If a cursor is visible in the window, ##Get pitch# writes to the @@Info window@ "
 	"the linearly interpolated pitch at that time; "
@@ -2628,8 +2699,8 @@ NORMAL (L"With @@Get pitch@ from the #Pitch menu in the @SoundEditor or @TextGri
 	"otherwise, ##Get pitch# writes the average pitch in the visible part of the sound.")
 MAN_END
 
-MAN_BEGIN (L"Intro 4.4. Printing the pitch contour", L"ppgb", 20070905)
-NORMAL (L"To print a pitch contour, or to put it in an EPS file or on the clipboard for inclusion in your word processor, "
+MAN_BEGIN (U"Intro 4.4. Printing the pitch contour", U"ppgb", 20070905)
+NORMAL (U"To print a pitch contour, or to put it in an EPS file or on the clipboard for inclusion in your word processor, "
 	"you first have to draw it into the @@Picture window at . "
 	"You do this by choosing ##Draw visible pitch contour...# "
 	"from the Pitch menu in the Sound or TextGrid window. "
@@ -2637,114 +2708,114 @@ NORMAL (L"To print a pitch contour, or to put it in an EPS file or on the clipbo
 	"or copy it to the clipboard (to do Paste in your word processor, for instance).")
 MAN_END
 
-MAN_BEGIN (L"Intro 4.5. The Pitch object", L"ppgb", 20110128)
-NORMAL (L"The pitch contour that is visible in the @SoundEditor or @TextGridEditor window, "
+MAN_BEGIN (U"Intro 4.5. The Pitch object", U"ppgb", 20110128)
+NORMAL (U"The pitch contour that is visible in the @SoundEditor or @TextGridEditor window, "
 	"can be copied as a separate @Pitch object to the @@List of Objects at . To do this, "
 	"choose @@Extract visible pitch contour@ from the #Pitch menu.")
-NORMAL (L"Another way to get a separate Pitch object is to select a @Sound object in the list "
+NORMAL (U"Another way to get a separate Pitch object is to select a @Sound object in the list "
 	"choose @@Sound: To Pitch...@ (preferred) or any of the other methods from the @@Periodicity menu at .")
-NORMAL (L"To view and modify the contents of a Pitch object, select it and choose @@View & Edit at . "
+NORMAL (U"To view and modify the contents of a Pitch object, select it and choose @@View & Edit at . "
 	"This creates a @PitchEditor window on your screen.")
-NORMAL (L"To save a pitch contour to disk, select the @Pitch object in the list and choose one of the commands in the @@Save menu at .")
-NORMAL (L"Later on, you can read the saved file again with @@Read from file...@ from the @@Open menu at .")
-NORMAL (L"To draw a @Pitch object to the @@Picture window@, select it and choose any of the commands in the @@Draw menu at . "
+NORMAL (U"To save a pitch contour to disk, select the @Pitch object in the list and choose one of the commands in the @@Save menu at .")
+NORMAL (U"Later on, you can read the saved file again with @@Read from file...@ from the @@Open menu at .")
+NORMAL (U"To draw a @Pitch object to the @@Picture window@, select it and choose any of the commands in the @@Draw menu at . "
 	"From the Picture window, you can print it, save it to an EPS file, or copy it to the clipboard for inclusion in your word processor.")
 MAN_END
 
-MAN_BEGIN (L"Advanced pulses settings...", L"ppgb", 20110220)
-INTRO (L"A command in the #Pulses menu of the @SoundEditor or @TextGridEditor windows. "
+MAN_BEGIN (U"Advanced pulses settings...", U"ppgb", 20110220)
+INTRO (U"A command in the #Pulses menu of the @SoundEditor or @TextGridEditor windows. "
 	"Before changing the advanced pulses settings, make sure you understand "
 	"the @@Voice@ tutorial.")
-NORMAL (L"For information about the ##Maximum period factor# setting, see @@PointProcess: Get jitter (local)... at . "
+NORMAL (U"For information about the ##Maximum period factor# setting, see @@PointProcess: Get jitter (local)... at . "
 	"The standard setting is best in most cases. "
 	"The ##Period floor# and ##Period ceiling# settings derive from the pitch floor and pitch ceiling (@@Pitch settings...@), "
 	"according to a formula given in @@Voice 2. Jitter at .")
 MAN_END
 
-MAN_BEGIN (L"Intro 5. Formant analysis", L"ppgb", 20030316)
-INTRO (L"This section describes how you can analyse the formant contours of an existing sound.")
-LIST_ITEM (L"@@Intro 5.1. Viewing formant contours")
-LIST_ITEM (L"@@Intro 5.2. Configuring the formant contours")
-LIST_ITEM (L"@@Intro 5.3. Querying the formant contours")
-LIST_ITEM (L"@@Intro 5.4. The Formant object")
+MAN_BEGIN (U"Intro 5. Formant analysis", U"ppgb", 20030316)
+INTRO (U"This section describes how you can analyse the formant contours of an existing sound.")
+LIST_ITEM (U"@@Intro 5.1. Viewing formant contours")
+LIST_ITEM (U"@@Intro 5.2. Configuring the formant contours")
+LIST_ITEM (U"@@Intro 5.3. Querying the formant contours")
+LIST_ITEM (U"@@Intro 5.4. The Formant object")
 MAN_END
 
-MAN_BEGIN (L"Intro 5.1. Viewing formant contours", L"ppgb", 20110128)
-NORMAL (L"To see the formant contours of a sound as functions of time, select a @Sound or @LongSound object and choose @@View & Edit at . "
+MAN_BEGIN (U"Intro 5.1. Viewing formant contours", U"ppgb", 20110128)
+NORMAL (U"To see the formant contours of a sound as functions of time, select a @Sound or @LongSound object and choose @@View & Edit at . "
 	"A @SoundEditor window will appear on your screen. "
 	"The analysis part of this window will contain formant contours, drawn as red speckles. "
 	"If you do not see the formant contours, choose @@Show formant@ from the #Formant menu.")
 MAN_END
 
-MAN_BEGIN (L"Intro 5.2. Configuring the formant contours", L"ppgb", 20030316)
-NORMAL (L"The formant analysis parameters, with you can set with the #Formant menu, are important. "
+MAN_BEGIN (U"Intro 5.2. Configuring the formant contours", U"ppgb", 20030316)
+NORMAL (U"The formant analysis parameters, with you can set with the #Formant menu, are important. "
 	"For a female voice, you may want to set the maximum frequency to 5500 Hz; "
 	"for a male voice, set it to 5000 Hz instead. "
 	"For more information about analysis parameters, see @@Sound: To Formant (burg)... at .")
 MAN_END
 
-MAN_BEGIN (L"Intro 5.3. Querying the formant contours", L"ppgb", 20040616)
-NORMAL (L"With @@Get first formant@ from the Formant menu in the @SoundEditor or @TextGridEditor, "
+MAN_BEGIN (U"Intro 5.3. Querying the formant contours", U"ppgb", 20040616)
+NORMAL (U"With @@Get first formant@ from the Formant menu in the @SoundEditor or @TextGridEditor, "
 	"you get information about the first formant at the cursor or in the selection. "
 	"If there is a cursor, ##Get first formant# writes to the @@Info window@ the linearly interpolated first formant at that time. "
 	"If there is a true selection, ##Get first formant# writes to the @@Info window@ the mean first formant in the visble part of that selection. "
 	"The same goes for @@Get second formant@ and so on.")
 MAN_END
 
-MAN_BEGIN (L"Intro 5.4. The Formant object", L"ppgb", 20030316)
-NORMAL (L"The formant contours that are visible in the @SoundEditor or @TextGridEditor window, "
+MAN_BEGIN (U"Intro 5.4. The Formant object", U"ppgb", 20030316)
+NORMAL (U"The formant contours that are visible in the @SoundEditor or @TextGridEditor window, "
 	"can be copied as a separate @Formant object to the @@List of Objects at . To do this, "
 	"choose @@Extract visible formant contour@ from the Formant menu.")
-NORMAL (L"Another way to get a separate Formant object is to select a @Sound object in the list "
+NORMAL (U"Another way to get a separate Formant object is to select a @Sound object in the list "
 	"choose @@Sound: To Formant (burg)...@ (preferred) or any of the other methods "
 	"from the @@Formants & LPC menu at .")
-ENTRY (L"Saving formant contours to disk")
-NORMAL (L"To save formant contours to disk, select the @Formant object in the list and choose one of the commands in the @@Save menu at .")
-NORMAL (L"Later on, you can read the saved file again with @@Read from file...@ from the @@Open menu at .")
-ENTRY (L"Drawing formant contours")
-NORMAL (L"To draw a @Formant object to the @@Picture window@, select it and choose any of the commands in the @@Draw menu at . "
+ENTRY (U"Saving formant contours to disk")
+NORMAL (U"To save formant contours to disk, select the @Formant object in the list and choose one of the commands in the @@Save menu at .")
+NORMAL (U"Later on, you can read the saved file again with @@Read from file...@ from the @@Open menu at .")
+ENTRY (U"Drawing formant contours")
+NORMAL (U"To draw a @Formant object to the @@Picture window@, select it and choose any of the commands in the @@Draw menu at . "
 	"From the Picture window, you can print it, save it to an EPS file, or copy it to the clipboard for inclusion in your word processor.")
 MAN_END
 
-MAN_BEGIN (L"Intro 6. Intensity analysis", L"ppgb", 20030316)
-INTRO (L"This section describes how you can analyse the intensity contour of an existing sound.")
-LIST_ITEM1 (L"@@Intro 6.1. Viewing an intensity contour")
-LIST_ITEM1 (L"@@Intro 6.2. Configuring the intensity contour")
-LIST_ITEM1 (L"@@Intro 6.3. Querying the intensity contour")
-LIST_ITEM1 (L"@@Intro 6.4. The Intensity object")
+MAN_BEGIN (U"Intro 6. Intensity analysis", U"ppgb", 20030316)
+INTRO (U"This section describes how you can analyse the intensity contour of an existing sound.")
+LIST_ITEM1 (U"@@Intro 6.1. Viewing an intensity contour")
+LIST_ITEM1 (U"@@Intro 6.2. Configuring the intensity contour")
+LIST_ITEM1 (U"@@Intro 6.3. Querying the intensity contour")
+LIST_ITEM1 (U"@@Intro 6.4. The Intensity object")
 MAN_END
 
-MAN_BEGIN (L"Intro 6.1. Viewing an intensity contour", L"ppgb", 20110128)
-INTRO (L"To see the intensity contour of a sound as a function of time, select a @Sound or @LongSound object and choose @@View & Edit at . "
+MAN_BEGIN (U"Intro 6.1. Viewing an intensity contour", U"ppgb", 20110128)
+INTRO (U"To see the intensity contour of a sound as a function of time, select a @Sound or @LongSound object and choose @@View & Edit at . "
 	"A @SoundEditor window will appear on your screen. "
 	"The analysis part of this window will contain an intensity contour, drawn as a yellow or green line "
 	"(choose ##Show intensity# from the #Intensity menu if it is not visible). "
 	"This also works in the @TextGridEditor.")
 MAN_END
 
-MAN_BEGIN (L"Intro 6.2. Configuring the intensity contour", L"ppgb", 20041123)
-INTRO (L"With ##Intensity settings...# from the #Intensity menu, "
+MAN_BEGIN (U"Intro 6.2. Configuring the intensity contour", U"ppgb", 20041123)
+INTRO (U"With ##Intensity settings...# from the #Intensity menu, "
 	"you can control how the intensity contour is computed and how it is shown.")
-ENTRY (L"The view range")
-NORMAL (L"By changing these two numbers you can set the vertical scale. "
+ENTRY (U"The view range")
+NORMAL (U"By changing these two numbers you can set the vertical scale. "
 	"The standard setting is from 50 to 100 dB, but if you are interested in the power of the background noise "
 	"you may want to set it to the range from 0 to 100 dB.")
-ENTRY (L"The averaging method")
-NORMAL (L"Averaging is what occurs if you make a @@time selection@ (rather than setting the cursor at a single time). "
+ENTRY (U"The averaging method")
+NORMAL (U"Averaging is what occurs if you make a @@time selection@ (rather than setting the cursor at a single time). "
 	"The green number in dB to the left or right side of the intensity contour will show the average "
 	"intensity in the selection. The same value is what you get when choosing ##Get intensity# from "
 	"the #Intensity menu. You can choose any of the three averaging methods "
 	"available for @@Intensity: Get mean...@, or choose for the #median value in the selection.")
-ENTRY (L"Pitch floor")
-NORMAL (L"The intensity curve is %smoothed, since you usually do not want the intensity curve to go up and down with "
+ENTRY (U"Pitch floor")
+NORMAL (U"The intensity curve is %smoothed, since you usually do not want the intensity curve to go up and down with "
 	"the intensity variations within a pitch period. To avoid such pitch-synchronous variations, "
 	"the intensity at every time point is a weighted average over many neighbouring time points. "
 	"The weighting is performed by a Gaussian (`double Kaiser') window that has a duration that is determined by the "
 	"##Minimum pitch# setting (see @@Intro 4.2. Configuring the pitch contour@). "
 	"To see more detail than usual, raise the minimum pitch; to get more smoothing than usual, lower it. "
 	"For more information, see @@Sound: To Intensity... at .")
-ENTRY (L"Subtract mean pressure or not?")
-NORMAL (L"Many microphones, microphone preamplifiers, or other components in the recording system "
+ENTRY (U"Subtract mean pressure or not?")
+NORMAL (U"Many microphones, microphone preamplifiers, or other components in the recording system "
 	"can add a constant level to the air pressure (a %%DC offset%). "
 	"You can see this at quiet locations in the wave form, "
 	"where the average pressure is not zero but the background noise hovers about some non-zero value. "
@@ -2755,14 +2826,14 @@ NORMAL (L"Many microphones, microphone preamplifiers, or other components in the
 	"and then applying the Gaussian window.")
 MAN_END
 
-MAN_BEGIN (L"Intro 6.3. Querying the intensity contour", L"ppgb", 20041123)
-INTRO (L"To ask for the intensity at the cursor, or the average intensity in the visible part of the selection, "
+MAN_BEGIN (U"Intro 6.3. Querying the intensity contour", U"ppgb", 20041123)
+INTRO (U"To ask for the intensity at the cursor, or the average intensity in the visible part of the selection, "
 	"choose ##Get intensity# from the #Intensity menu or press the F11 key. You get the same value in dB that is visible "
 	"to the left or right side of the intensity curve, but with more digits.")
 MAN_END
 
-MAN_BEGIN (L"Intro 6.4. The Intensity object", L"ppgb", 20041123)
-NORMAL (L"To print an intensity contour, or to put it in an EPS file or on the clipboard for inclusion in your word processor, "
+MAN_BEGIN (U"Intro 6.4. The Intensity object", U"ppgb", 20041123)
+NORMAL (U"To print an intensity contour, or to put it in an EPS file or on the clipboard for inclusion in your word processor, "
 	"you first have to create an @Intensity object in the @@List of Objects at . "
 	"You do this either by choosing ##Extract visible intensity contour# "
 	"from the #Intensity menu in the SoundEditor or TextGridEditor window, "
@@ -2772,24 +2843,24 @@ NORMAL (L"To print an intensity contour, or to put it in an EPS file or on the c
 	"From the Picture window, you can print it, save it to an EPS file, or copy it to the clipboard.")
 MAN_END
 
-MAN_BEGIN (L"Intro 7. Annotation", L"ppgb", 20110129)
-INTRO (L"You can annotate existing @Sound objects and sound files (@LongSound objects).")
-NORMAL (L"The labelling data will reside in a @TextGrid object. This object is separate "
+MAN_BEGIN (U"Intro 7. Annotation", U"ppgb", 20110129)
+INTRO (U"You can annotate existing @Sound objects and sound files (@LongSound objects).")
+NORMAL (U"The labelling data will reside in a @TextGrid object. This object is separate "
 	"from the sound, which means that you will often see two objects in the list: a Sound or LongSound, "
 	"and a TextGrid.")
-ENTRY (L"Creating a TextGrid")
-NORMAL (L"You create a new empty TextGrid from the Sound or LongSound with @@Sound: To TextGrid...@ "
+ENTRY (U"Creating a TextGrid")
+NORMAL (U"You create a new empty TextGrid from the Sound or LongSound with @@Sound: To TextGrid...@ "
 	"or @@LongSound: To TextGrid...@ from the #Annotate menu (which shows up in the Objects window if you select a Sound or LongSound). In this way, the time domain "
 	"of the @TextGrid will automatically equal that of the sound (if you choose @@Create TextGrid...@ from "
 	"the @@New menu@ instead, you will have to supply the time domain by yourself).")
-NORMAL (L"When you create a TextGrid, you specify the names of the %tiers. For instance, if you want to segment "
+NORMAL (U"When you create a TextGrid, you specify the names of the %tiers. For instance, if you want to segment "
 	"the sound into words and into phonemes, you may want to create two tiers and call them "
 	"\"words\" and \"phonemes\" (you can easily add, remove, and rename tiers later). "
 	"Since both of these tiers are %%interval tiers% (you label the intervals between the word and phoneme "
 	"boundaries, not the boundaries themselves), you specify \"phonemes words\" for %%Tier names%, "
 	"and you leave the %%Point tiers% empty.")
-ENTRY (L"View and edit")
-NORMAL (L"You can edit a TextGrid object all by itself, but you will normally want to see "
+ENTRY (U"View and edit")
+NORMAL (U"You can edit a TextGrid object all by itself, but you will normally want to see "
 	"the sound in the editor window as well. To achieve this, you select both the Sound (or LongSound) and "
 	"the TextGrid, and click @@View & Edit at . A @TextGridEditor will appear on your screen. "
 	"Like the Sound editor, the TextGrid editor will show you a spectrogram, a pitch contour, a formant contour, "
@@ -2797,21 +2868,21 @@ NORMAL (L"You can edit a TextGrid object all by itself, but you will normally wa
 	"you to add, remove, and edit labels, boundaries, and tiers. Under Help in the TextGridEditor, you will "
 	"find the @TextGridEditor manual page. You are strongly advised to read it, because it will show you "
 	"how you can quickly zoom (drag the mouse), play (click a rectangle), or edit a label (just type).")
-ENTRY (L"Save")
-NORMAL (L"You will normally write the TextGrid to disk with @@Save as text file...@ "
+ENTRY (U"Save")
+NORMAL (U"You will normally write the TextGrid to disk with @@Save as text file...@ "
 	"or @@Save as short text file... at . It is true that @@Save as binary file...@ will also work, but the others "
 	"give you a file you can read with any text editor.")
-NORMAL (L"However you saved it, you can read the TextGrid into Praat later with @@Read from file... at .")
+NORMAL (U"However you saved it, you can read the TextGrid into Praat later with @@Read from file... at .")
 MAN_END
 
-MAN_BEGIN (L"Intro 8. Manipulation", L"ppgb", 20021212)
-LIST_ITEM (L"@@Intro 8.1. Manipulation of pitch")
-LIST_ITEM (L"@@Intro 8.2. Manipulation of duration")
-LIST_ITEM (L"@@Intro 8.3. Manipulation of intensity")
+MAN_BEGIN (U"Intro 8. Manipulation", U"ppgb", 20021212)
+LIST_ITEM (U"@@Intro 8.1. Manipulation of pitch")
+LIST_ITEM (U"@@Intro 8.2. Manipulation of duration")
+LIST_ITEM (U"@@Intro 8.3. Manipulation of intensity")
 MAN_END
 
-MAN_BEGIN (L"Intro 8.1. Manipulation of pitch", L"ppgb", 20110128)
-INTRO (L"To modify the pitch contour of an existing @Sound object, "
+MAN_BEGIN (U"Intro 8.1. Manipulation of pitch", U"ppgb", 20110128)
+INTRO (U"To modify the pitch contour of an existing @Sound object, "
 	"you select this @Sound and click ##To Manipulation#. "
 	"A @Manipulation object will then appear in the list. "
 	"You can then click @@View & Edit@ to raise a @ManipulationEditor, "
@@ -2819,83 +2890,83 @@ INTRO (L"To modify the pitch contour of an existing @Sound object, "
 	"To reduce the number of dots, choose ##Stylize pitch (2 st)# "
 	"from the #Pitch menu; it will then be easy to drag the dots "
 	"about the time-pitch area.")
-NORMAL (L"If you click any of the rectangles "
+NORMAL (U"If you click any of the rectangles "
 	"(or choose any of the #Play commands from the #View menu), "
 	"you will hear the modified sound. By shift-clicking, you will hear "
 	"the original sound.")
-NORMAL (L"To get the modified sound as a separate object, "
+NORMAL (U"To get the modified sound as a separate object, "
 	"choose ##Publish resynthesis# from the @@File menu at .")
-NORMAL (L"If you modify the duration curve as well (see @@Intro 8.2. Manipulation of duration@), "
+NORMAL (U"If you modify the duration curve as well (see @@Intro 8.2. Manipulation of duration@), "
 	"the modified sound will be based on the modified pitch and duration.")
-ENTRY (L"Cloning a pitch contour")
-NORMAL (L"To use the pitch contour of one Manipulation object as the pitch contour of another Manipulation object, "
+ENTRY (U"Cloning a pitch contour")
+NORMAL (U"To use the pitch contour of one Manipulation object as the pitch contour of another Manipulation object, "
 	"you first choose ##Extract pitch tier# for the first Manipulation object, "
 	"then select the resulting PitchTier object together with the other Manipulation object "
 	"(e.g. by a click on the PitchTier and a Command-click on the Manipulation), "
 	"and choose ##Replace pitch tier#.")
-ENTRY (L"Precise manipulation of pitch")
-NORMAL (L"If you know exactly what pitch contour you want, "
+ENTRY (U"Precise manipulation of pitch")
+NORMAL (U"If you know exactly what pitch contour you want, "
 	"you can create an empty PitchTier with @@Create PitchTier...@ from the New menu, "
 	"then add points with @@PitchTier: Add point... at .")
-NORMAL (L"For instance, suppose you want to have a pitch that falls from 350 to 150 Hz in one second. "
+NORMAL (U"For instance, suppose you want to have a pitch that falls from 350 to 150 Hz in one second. "
 	"You create the PitchTier, then add a point at 0 seconds and a frequency of 350 Hz, "
 	"and a point at 1 second with a frequency of 150 Hz. "
 	"You can put this PitchTier into a Manipulation object in the way described above.")
 MAN_END
 
-MAN_BEGIN (L"Intro 8.2. Manipulation of duration", L"ppgb", 20140421)
-INTRO (L"You can use Praat to modify the relative durations in an existing sound.")
-NORMAL (L"First, you select a @Sound object and click \"To Manipulation\". "
+MAN_BEGIN (U"Intro 8.2. Manipulation of duration", U"ppgb", 20140421)
+INTRO (U"You can use Praat to modify the relative durations in an existing sound.")
+NORMAL (U"First, you select a @Sound object and click \"To Manipulation\". "
 	"A @Manipulation object will then appear in the list. "
 	"You can then click @@View & Edit@ to raise a @ManipulationEditor, "
 	"which will show an empty @DurationTier. "
 	"You can add targets to this tier by choosing \"Add duration point at cursor\" "
 	"from the \"Dur\" menu. The targets will show up as green dots, which you can easily drag "
 	"about the duration area.")
-NORMAL (L"If you click any of the rectangles "
+NORMAL (U"If you click any of the rectangles "
 	"(or choose any of the @Play commands from the @View menu), "
 	"you will hear the modified sound. By shift-clicking, you will hear "
 	"the original sound.")
-NORMAL (L"To get the modified sound as a separate object, "
+NORMAL (U"To get the modified sound as a separate object, "
 	"choose ##Publish resynthesis# from the @@File menu at .")
-NORMAL (L"If you modify the pitch curve as well (see @@Intro 8.1. Manipulation of pitch@), "
+NORMAL (U"If you modify the pitch curve as well (see @@Intro 8.1. Manipulation of pitch@), "
 	"the modified sound will be based on the modified duration and pitch.")
-ENTRY (L"Precise manipulation of duration")
-NORMAL (L"If you know exactly the times and relative durations, it is advisable to write a script (see @Scripting). "
+ENTRY (U"Precise manipulation of duration")
+NORMAL (U"If you know exactly the times and relative durations, it is advisable to write a script (see @Scripting). "
 	"Suppose, for instance, that you have a 355-ms piece of sound, and you want to shorten the first 85 ms to 70 ms, "
 	"and the remaining 270 ms to 200 ms.")
-NORMAL (L"In your first 85 ms, your relative duration should be 70/85, "
+NORMAL (U"In your first 85 ms, your relative duration should be 70/85, "
 	"and during the last 270 ms, it should be 200/270. "
 	"The DurationTier does linear interpolation, so it can only be approximate these precise times, "
 	"but fortunately to any precision you like:")
-CODE (L"Create DurationTier: \"shorten\", 0, 0.085 + 0.270")
-CODE (L"Add point: 0.000 70/85")
-CODE (L"Add point: 0.084999, 70/85")
-CODE (L"Add point: 0.085001, 200/270")
-CODE (L"Add point: 0.355, 200/270")
-NORMAL (L"To put this DurationTier back into a Manipulation object, you select the two objects together "
+CODE (U"Create DurationTier: \"shorten\", 0, 0.085 + 0.270")
+CODE (U"Add point: 0.000 70/85")
+CODE (U"Add point: 0.084999, 70/85")
+CODE (U"Add point: 0.085001, 200/270")
+CODE (U"Add point: 0.355, 200/270")
+NORMAL (U"To put this DurationTier back into a Manipulation object, you select the two objects together "
 	"(e.g. a click on the DurationTier and a Command-click on the Manipulation), "
 	"and choose ##Replace duration tier#.")
 MAN_END
 
-MAN_BEGIN (L"Intro 8.3. Manipulation of intensity", L"ppgb", 20110128)
-INTRO (L"You can modify the intensity contour of an existing sound.")
-NORMAL (L"While the pitch and duration of a sound can be modified with the @ManipulationEditor "
+MAN_BEGIN (U"Intro 8.3. Manipulation of intensity", U"ppgb", 20110128)
+INTRO (U"You can modify the intensity contour of an existing sound.")
+NORMAL (U"While the pitch and duration of a sound can be modified with the @ManipulationEditor "
 	"(see @@Intro 8.1. Manipulation of pitch@ and @@Intro 8.2. Manipulation of duration@), "
 	"the modification of the intensity curve is done in a different way.")
-NORMAL (L"You can create an @IntensityTier with the command @@Create IntensityTier...@ "
+NORMAL (U"You can create an @IntensityTier with the command @@Create IntensityTier...@ "
 	"from the @@New menu at . With @@View & Edit@, you can add points to this tier. "
 	"You can then \"multiply\" this tier with a sound, by selecting the @Sound and the "
 	"IntensityTier together and clicking @@Sound & IntensityTier: Multiply|Multiply at . "
 	"The points in the IntensityTier represent relative intensities in dB; "
 	"therefore, the sound pressure values in the Sound are multiplied by 10^^(dB/20)^.")
-NORMAL (L"Instead of an IntensityTier, you can use an @AmplitudeTier; "
+NORMAL (U"Instead of an IntensityTier, you can use an @AmplitudeTier; "
 	"when you click #Multiply for a selected Sound and AmplitudeTier, "
 	"the sound pressure values in the Sound are directly multiplied by the values in the AmplitudeTier.")
 MAN_END
 
-MAN_BEGIN (L"Intro 8.4. Manipulation of formants", L"ppgb", 20010408)
-INTRO (L"The manipulation of formant contours cannot be as straightforward as the manipulation "
+MAN_BEGIN (U"Intro 8.4. Manipulation of formants", U"ppgb", 20010408)
+INTRO (U"The manipulation of formant contours cannot be as straightforward as the manipulation "
 	"of pitch, duration, or intensity contours. See the @@Source-filter synthesis@ tutorial "
 	"for an explanation of how formants can be modified in Praat.")
 MAN_END
@@ -2914,334 +2985,334 @@ sparrow, meerkat, [fruit] bat, lion, parrot, red deer, sperm whale, [bearded] se
 * music
 */
 
-MAN_BEGIN (L"Labelling", L"ppgb", 20010408)
-INTRO (L"See @@Intro 7. Annotation at .")
+MAN_BEGIN (U"Labelling", U"ppgb", 20010408)
+INTRO (U"See @@Intro 7. Annotation at .")
 MAN_END
 
-MAN_BEGIN (L"List of Objects", L"ppgb", 19981024)
-INTRO (L"A list in the left-hand part of the @@Object window at .")
-ENTRY (L"Purpose")
-NORMAL (L"If you select one or more @objects in this list, "
+MAN_BEGIN (U"List of Objects", U"ppgb", 19981024)
+INTRO (U"A list in the left-hand part of the @@Object window at .")
+ENTRY (U"Purpose")
+NORMAL (U"If you select one or more @objects in this list, "
 	"the possible actions that you can perform with the selected objects "
 	"will appear in the @@Dynamic menu at .")
-ENTRY (L"How to select objects")
-NORMAL (L"To select one object (and deselect all the others), click on the object.")
-NORMAL (L"To extend the selection, drag the mouse (Unix, Windows) or use Shift-click (all platforms).")
-NORMAL (L"To change the selection of one object (without changing the others), "
+ENTRY (U"How to select objects")
+NORMAL (U"To select one object (and deselect all the others), click on the object.")
+NORMAL (U"To extend the selection, drag the mouse (Unix, Windows) or use Shift-click (all platforms).")
+NORMAL (U"To change the selection of one object (without changing the others), "
 	"use Control-click (Unix, Windows) or Command-click (Macintosh).")
 MAN_END
 
-MAN_BEGIN (L"New menu", L"ppgb", 20080427)
-INTRO (L"The ##New menu# is one of the menus in the @@Object window at . "
+MAN_BEGIN (U"New menu", U"ppgb", 20080427)
+INTRO (U"The ##New menu# is one of the menus in the @@Object window at . "
 	"You use this menu to create new objects from scratch. It contains the following commands:")
-LIST_ITEM (L"• @@Record mono Sound...@")
-LIST_ITEM (L"• @@Record stereo Sound...@")
-LIST_ITEM (L"• @@Create Sound from formula...@")
-LIST_ITEM (L"• @@Create Sound from tone complex...")
-LIST_ITEM (L"• @@Create Sound from gammatone...")
-LIST_ITEM (L"• @@Create Sound from Shepard tone...")
-LIST_ITEM (L"• @@Create Matrix...@ (from a formula)")
-LIST_ITEM (L"• @@Create simple Matrix...@ (from a formula)")
-LIST_ITEM (L"• @@Create empty PointProcess...@")
-LIST_ITEM (L"• @@Create Poisson process...@")
-LIST_ITEM (L"• @@Create PitchTier...@")
-LIST_ITEM (L"• @@Create DurationTier...@")
-LIST_ITEM (L"• @@Create IntensityTier...@")
-LIST_ITEM (L"• @@Create FormantGrid...@")
-LIST_ITEM (L"• @@Create Strings as file list...@")
-LIST_ITEM (L"• @@Create TextGrid...@")
-LIST_ITEM (L"• @@OT learning@ tutorial")
-LIST_ITEM (L"• @@Create tongue-root grammar...@")
-NORMAL (L"To create new objects from files on disk, use the @@Open menu@ instead. "
+LIST_ITEM (U"• @@Record mono Sound...@")
+LIST_ITEM (U"• @@Record stereo Sound...@")
+LIST_ITEM (U"• @@Create Sound from formula...@")
+LIST_ITEM (U"• @@Create Sound from tone complex...")
+LIST_ITEM (U"• @@Create Sound from gammatone...")
+LIST_ITEM (U"• @@Create Sound from Shepard tone...")
+LIST_ITEM (U"• @@Create Matrix...@ (from a formula)")
+LIST_ITEM (U"• @@Create simple Matrix...@ (from a formula)")
+LIST_ITEM (U"• @@Create empty PointProcess...@")
+LIST_ITEM (U"• @@Create Poisson process...@")
+LIST_ITEM (U"• @@Create PitchTier...@")
+LIST_ITEM (U"• @@Create DurationTier...@")
+LIST_ITEM (U"• @@Create IntensityTier...@")
+LIST_ITEM (U"• @@Create FormantGrid...@")
+LIST_ITEM (U"• @@Create Strings as file list...@")
+LIST_ITEM (U"• @@Create TextGrid...@")
+LIST_ITEM (U"• @@OT learning@ tutorial")
+LIST_ITEM (U"• @@Create tongue-root grammar...@")
+NORMAL (U"To create new objects from files on disk, use the @@Open menu@ instead. "
 	"Objects can also often be create from other objects, with commands that start with ##To#.")
 MAN_END
 
-MAN_BEGIN (L"Object window", L"ppgb", 20140212)
-INTRO (L"One of the two main windows in the Praat program.")
-ENTRY (L"Subdivision")
-LIST_ITEM (L"To the left: the @@List of Objects at .")
-LIST_ITEM (L"To the right: the @@Dynamic menu at .")
-ENTRY (L"Fixed buttons")
-NORMAL (L"The following buttons appear below the List of Objects:")
-LIST_ITEM (L"• @@Rename...")
-LIST_ITEM (L"• @@Info")
-LIST_ITEM (L"• @@Copy...")
-LIST_ITEM (L"• @@Remove")
-LIST_ITEM (L"• @@Inspect")
-ENTRY (L"Menus")
-LIST_ITEM (L"The Object window contains several fixed menus: "
+MAN_BEGIN (U"Object window", U"ppgb", 20140212)
+INTRO (U"One of the two main windows in the Praat program.")
+ENTRY (U"Subdivision")
+LIST_ITEM (U"To the left: the @@List of Objects at .")
+LIST_ITEM (U"To the right: the @@Dynamic menu at .")
+ENTRY (U"Fixed buttons")
+NORMAL (U"The following buttons appear below the List of Objects:")
+LIST_ITEM (U"• @@Rename...")
+LIST_ITEM (U"• @@Info")
+LIST_ITEM (U"• @@Copy...")
+LIST_ITEM (U"• @@Remove")
+LIST_ITEM (U"• @@Inspect")
+ENTRY (U"Menus")
+LIST_ITEM (U"The Object window contains several fixed menus: "
 	"the #Praat, #New, #Open, and #Help menus. "
 	"It also contains the #Save menu, whose contents vary with the kinds of selected objects, "
 	"and must, therefore, be considered part of the dynamic menu.")
-ENTRY (L"The Praat menu")
-LIST_ITEM (L"• @@New Praat script@: creates an empty @@ScriptEditor@")
-LIST_ITEM (L"• @@Open Praat script...@: creates a @@ScriptEditor@ with a script from disk")
-LIST_ITEM (L"• The ##Goodies submenu#: for doing things (like using the Calculator) "
+ENTRY (U"The Praat menu")
+LIST_ITEM (U"• @@New Praat script@: creates an empty @@ScriptEditor@")
+LIST_ITEM (U"• @@Open Praat script...@: creates a @@ScriptEditor@ with a script from disk")
+LIST_ITEM (U"• The ##Goodies submenu#: for doing things (like using the Calculator) "
 	"that do not create new objects and do not depend on the kinds of selected objects.")
-LIST_ITEM (L"• The ##Preferences submenu#: for program-wide preferences, "
+LIST_ITEM (U"• The ##Preferences submenu#: for program-wide preferences, "
 	"like audio input and output settings.")
-LIST_ITEM (L"• ##Buttons...#: raises a @@ButtonEditor@")
-LIST_ITEM (L"• (@@Add menu command...@)")
-LIST_ITEM (L"• (@@Add action command...@)")
-LIST_ITEM (L"• @@Quit")
-ENTRY (L"Other menus")
-LIST_ITEM (L"• The @@New menu@: for creating objects from scratch.")
-LIST_ITEM (L"• The @@Open menu@: for reading objects from file into memory.")
-LIST_ITEM (L"• The @@Save menu@: for writing objects from memory to file.")
-LIST_ITEM (L"• The ##Help menu#: for viewing the manual.")
-MAN_END
-
-MAN_BEGIN (L"Periodicity menu", L"ppgb", 20010417)
-INTRO (L"A menu that occurs in the @@Dynamic menu@ for a @Sound.")
-NORMAL (L"This menu contains commands for analysing the pitch contour of the selected Sound:")
-LIST_ITEM (L"@@Sound: To Pitch...")
-LIST_ITEM (L"@@Sound: To Pitch (ac)...")
-LIST_ITEM (L"@@Sound: To Pitch (cc)...")
-LIST_ITEM (L"@@Sound: To Harmonicity (cc)...")
-LIST_ITEM (L"@@Sound: To Harmonicity (ac)...")
-MAN_END
-
-MAN_BEGIN (L"Pitch settings...", L"ppgb", 20030316)
-INTRO (L"A command in the Pitch menu of the @SoundEditor and @TextGridEditor windows. "
+LIST_ITEM (U"• ##Buttons...#: raises a @@ButtonEditor@")
+LIST_ITEM (U"• (@@Add menu command...@)")
+LIST_ITEM (U"• (@@Add action command...@)")
+LIST_ITEM (U"• @@Quit")
+ENTRY (U"Other menus")
+LIST_ITEM (U"• The @@New menu@: for creating objects from scratch.")
+LIST_ITEM (U"• The @@Open menu@: for reading objects from file into memory.")
+LIST_ITEM (U"• The @@Save menu@: for writing objects from memory to file.")
+LIST_ITEM (U"• The ##Help menu#: for viewing the manual.")
+MAN_END
+
+MAN_BEGIN (U"Periodicity menu", U"ppgb", 20010417)
+INTRO (U"A menu that occurs in the @@Dynamic menu@ for a @Sound.")
+NORMAL (U"This menu contains commands for analysing the pitch contour of the selected Sound:")
+LIST_ITEM (U"@@Sound: To Pitch...")
+LIST_ITEM (U"@@Sound: To Pitch (ac)...")
+LIST_ITEM (U"@@Sound: To Pitch (cc)...")
+LIST_ITEM (U"@@Sound: To Harmonicity (cc)...")
+LIST_ITEM (U"@@Sound: To Harmonicity (ac)...")
+MAN_END
+
+MAN_BEGIN (U"Pitch settings...", U"ppgb", 20030316)
+INTRO (U"A command in the Pitch menu of the @SoundEditor and @TextGridEditor windows. "
 	"See @@Intro 4.2. Configuring the pitch contour at .")
 MAN_END
 
-MAN_BEGIN (L"Play", L"ppgb", 20021212)
-INTRO (L"A command that is available if you select a @Sound, @Pitch, or @PointProcess object. "
+MAN_BEGIN (U"Play", U"ppgb", 20021212)
+INTRO (U"A command that is available if you select a @Sound, @Pitch, or @PointProcess object. "
 	"It gives you an acoustic representation of the selected object, if your loudspeakers are on "
 	"and you did not \"mute\" your computer sound system.")
-NORMAL (L"A Play button is also available in the @SoundRecorder window "
+NORMAL (U"A Play button is also available in the @SoundRecorder window "
 	"and in the @View menu of the @SoundEditor or @TextGridEditor. In the editors, "
 	"you will usually play a sound by clicking on any of the rectangles around the data.")
 MAN_END
 
-MAN_BEGIN (L"Query", L"ppgb", 20021218)
-INTRO (L"Query commands give you information about objects.")
-NORMAL (L"Most query commands start with the word #%Get or sometimes the word #%Count. "
+MAN_BEGIN (U"Query", U"ppgb", 20021218)
+INTRO (U"Query commands give you information about objects.")
+NORMAL (U"Most query commands start with the word #%Get or sometimes the word #%Count. "
 	"You will find these commands in two places: under the #Query menu that usually appears if you "
 	"select an @@Objects|object@ in the list, and in the #Query menus of the @editors.")
-ENTRY (L"Behaviour")
-NORMAL (L"If you click a query command, the answer will be written to the @@Info window at .")
-ENTRY (L"Scripting")
-NORMAL (L"In a script, you can still use query commands to write the information to the Info window "
+ENTRY (U"Behaviour")
+NORMAL (U"If you click a query command, the answer will be written to the @@Info window at .")
+ENTRY (U"Scripting")
+NORMAL (U"In a script, you can still use query commands to write the information to the Info window "
 	"but you can also use any query command to put the information into a variable. "
 	"(see @@Scripting 6.3. Query commands@). In such a case, the value will not be written into the Info window.")
-ENTRY (L"Query commands in the Praat program")
-NORMAL (L"The Praat program contains the following query commands:")
+ENTRY (U"Query commands in the Praat program")
+NORMAL (U"The Praat program contains the following query commands:")
 MAN_END
 
-MAN_BEGIN (L"Query menu", L"ppgb", 20010417)
-INTRO (L"One of the menus in most @editors.")
+MAN_BEGIN (U"Query menu", U"ppgb", 20010417)
+INTRO (U"One of the menus in most @editors.")
 MAN_END
 
-MAN_BEGIN (L"Quit", L"ppgb", 20050822)
-INTRO (L"One of the commands in the @@Praat menu at .")
-ENTRY (L"Purpose")
-NORMAL (L"To leave the program.")
-ENTRY (L"Behaviour")
-NORMAL (L"All @objects not written to a file will be lost. "
+MAN_BEGIN (U"Quit", U"ppgb", 20050822)
+INTRO (U"One of the commands in the @@Praat menu at .")
+ENTRY (U"Purpose")
+NORMAL (U"To leave the program.")
+ENTRY (U"Behaviour")
+NORMAL (U"All @objects not written to a file will be lost. "
 	"However, file-based objects (like large lexica) will be saved correctly.")
-ENTRY (L"Usage")
-NORMAL (L"To save your data to a disk file before quitting, choose a command from the @@Save menu at .")
+ENTRY (U"Usage")
+NORMAL (U"To save your data to a disk file before quitting, choose a command from the @@Save menu at .")
 MAN_END
 
-MAN_BEGIN (L"Read from file...", L"ppgb", 20111018)
-INTRO (L"One of the commands in the @@Open menu at .")
-ENTRY (L"Purpose")
-NORMAL (L"To read one or more @objects from a file on disk.")
-ENTRY (L"Behaviour")
-NORMAL (L"Many kinds of files are recognized:")
-LIST_ITEM (L"1. Text files that are structured as described under @@Save as text file...@; "
+MAN_BEGIN (U"Read from file...", U"ppgb", 20111018)
+INTRO (U"One of the commands in the @@Open menu at .")
+ENTRY (U"Purpose")
+NORMAL (U"To read one or more @objects from a file on disk.")
+ENTRY (U"Behaviour")
+NORMAL (U"Many kinds of files are recognized:")
+LIST_ITEM (U"1. Text files that are structured as described under @@Save as text file...@; "
 	"these can contain an object of any type, or a collection of objects.")
-LIST_ITEM (L"2. Files that were produced by @@Save as binary file...@ (any type).")
-LIST_ITEM (L"3. Files in a LISP text format (only for object types that can be written to a LISP file).")
-LIST_ITEM (L"4. Files that were made recognizable by the libraries built on Praat. "
+LIST_ITEM (U"2. Files that were produced by @@Save as binary file...@ (any type).")
+LIST_ITEM (U"3. Files in a LISP text format (only for object types that can be written to a LISP file).")
+LIST_ITEM (U"4. Files that were made recognizable by the libraries built on Praat. "
 	"For instance, the phonetics library adds recognizers for many kinds of sound files.")
-NORMAL (L"If the file contains more than one object, these objects will appear in the list, "
+NORMAL (U"If the file contains more than one object, these objects will appear in the list, "
 	"and their names will be the same as the names that they had "
 	"when they were saved with ##Save as text file...# or ##Save as binary file...#.")
-ENTRY (L"Examples")
-LIST_ITEM (L"• If the file contains only one Pitch object and is called \"hallo.pit\", "
+ENTRY (U"Examples")
+LIST_ITEM (U"• If the file contains only one Pitch object and is called \"hallo.pit\", "
 	"an object with the name \"Pitch hallo\" will appear in the list of objects. "
 	"You may have more objects with the same name.")
-LIST_ITEM (L"• If the file contains one object of type Pitch, named \"hallo\", "
+LIST_ITEM (U"• If the file contains one object of type Pitch, named \"hallo\", "
 	"and one object of type Polygon, named \"kromme\", "
 	"there will appear two objects in the list, "
 	"called \"Pitch hallo\" and \"Polygon kromme\".")
 MAN_END
 
-MAN_BEGIN (L"Open menu", L"ppgb", 20110111)
-INTRO (L"One of the menus in the @@Object window at .")
-NORMAL (L"With the Open menu, you read one or more @objects from a file on disk into memory. "
+MAN_BEGIN (U"Open menu", U"ppgb", 20110111)
+INTRO (U"One of the menus in the @@Object window at .")
+NORMAL (U"With the Open menu, you read one or more @objects from a file on disk into memory. "
 	"The resulting object(s) will appear in the @@List of Objects at .")
-NORMAL (L"The Open menu contains the command @@Read from file...@, which recognizes most file types, "
+NORMAL (U"The Open menu contains the command @@Read from file...@, which recognizes most file types, "
 	"and perhaps several other commands for reading unrecognizable file types (e.g., raw sound data), "
 	"or for interpreting known file types in a different way "
 	"(e.g., reading two mono sounds from one stereo sound file):")
 MAN_END
 
-MAN_BEGIN (L"Remove", L"ppgb", 20021212)
-INTRO (L"One of the fixed buttons in the @@Object window at .")
-NORMAL (L"You can choose this command after selecting one or more @objects in the list.")
-NORMAL (L"The selected objects will permanently disappear from the list, "
+MAN_BEGIN (U"Remove", U"ppgb", 20021212)
+INTRO (U"One of the fixed buttons in the @@Object window at .")
+NORMAL (U"You can choose this command after selecting one or more @objects in the list.")
+NORMAL (U"The selected objects will permanently disappear from the list, "
 	"and the computer memory that they occupied will be freed.")
-NORMAL (L"To save your data before removing, choose a command from the @@Save menu at .")
+NORMAL (U"To save your data before removing, choose a command from the @@Save menu at .")
 MAN_END
 
-MAN_BEGIN (L"Rename...", L"ppgb", 20111018)
-INTRO (L"One of the fixed buttons in the @@Object window at .")
-ENTRY (L"Availability")
-NORMAL (L"You can choose this command after selecting one object of any type.")
-ENTRY (L"Purpose")
-NORMAL (L"You can give the selected object a new name.")
-ENTRY (L"Behaviour")
-NORMAL (L"If you type special symbols or spaces, the Object window will replace them with underscores.")
+MAN_BEGIN (U"Rename...", U"ppgb", 20111018)
+INTRO (U"One of the fixed buttons in the @@Object window at .")
+ENTRY (U"Availability")
+NORMAL (U"You can choose this command after selecting one object of any type.")
+ENTRY (U"Purpose")
+NORMAL (U"You can give the selected object a new name.")
+ENTRY (U"Behaviour")
+NORMAL (U"If you type special symbols or spaces, the Object window will replace them with underscores.")
 MAN_END
 
-MAN_BEGIN (L"Resource fork", L"ppgb", 20030316)
-INTRO (L"One of the two %forks of a Macintosh file (the other is the %%data fork%). "
+MAN_BEGIN (U"Resource fork", U"ppgb", 20030316)
+INTRO (U"One of the two %forks of a Macintosh file (the other is the %%data fork%). "
 	"If a Macintosh file is moved to another platform directly, the resource fork is lost. "
 	"To backup your Macintosh files, use compression, for instance with #DropStuff\\tm.")
 MAN_END
 
-MAN_BEGIN (L"Save menu", L"ppgb", 20111018)
-INTRO (L"One of the menus in the @@Object window at .")
-ENTRY (L"Purpose")
-NORMAL (L"With the #Save menu, you write one or more selected @objects from memory to a file on disk. "
+MAN_BEGIN (U"Save menu", U"ppgb", 20111018)
+INTRO (U"One of the menus in the @@Object window at .")
+ENTRY (U"Purpose")
+NORMAL (U"With the #Save menu, you write one or more selected @objects from memory to a file on disk. "
 	"The data can be read in again with one of the commands in the @@Open menu@ "
 	"(most often simply with @@Read from file...@).")
-ENTRY (L"Usage: save your work")
-NORMAL (L"You will often choose a command from this menu just before clicking the @Remove button "
+ENTRY (U"Usage: save your work")
+NORMAL (U"You will often choose a command from this menu just before clicking the @Remove button "
 	"or choosing the @Quit command.")
-ENTRY (L"Fixed commands")
-NORMAL (L"If no object is selected, the #Save menu is empty. "
+ENTRY (U"Fixed commands")
+NORMAL (U"If no object is selected, the #Save menu is empty. "
 	"If any object is selected, it will at least contain the following commands:")
-LIST_ITEM (L"• @@Write to console")
-LIST_ITEM (L"• @@Save as text file...")
-LIST_ITEM (L"• @@Save as short text file...")
-LIST_ITEM (L"• @@Save as binary file...")
-ENTRY (L"Dynamic commands")
-NORMAL (L"Depending on the type of the selected object, the following commands may be available "
+LIST_ITEM (U"• @@Write to console")
+LIST_ITEM (U"• @@Save as text file...")
+LIST_ITEM (U"• @@Save as short text file...")
+LIST_ITEM (U"• @@Save as binary file...")
+ENTRY (U"Dynamic commands")
+NORMAL (U"Depending on the type of the selected object, the following commands may be available "
 	"in the #Save menu:")
 MAN_END
 
-MAN_BEGIN (L"Save as binary file...", L"ppgb", 20110129)
-INTRO (L"One of the commands in the @@Save menu at .")
-ENTRY (L"Availability")
-NORMAL (L"You can choose this command after selecting one or more @objects.")
-ENTRY (L"Behaviour")
-NORMAL (L"The Object window will ask you for a file name. "
+MAN_BEGIN (U"Save as binary file...", U"ppgb", 20110129)
+INTRO (U"One of the commands in the @@Save menu at .")
+ENTRY (U"Availability")
+NORMAL (U"You can choose this command after selecting one or more @objects.")
+ENTRY (U"Behaviour")
+NORMAL (U"The Object window will ask you for a file name. "
 	"After you click OK, the objects will be written to a binary file on disk.")
-ENTRY (L"Usage")
-NORMAL (L"The file can be read again with @@Read from file... at .")
-ENTRY (L"File format")
-NORMAL (L"These files are in a device-independent binary format, "
+ENTRY (U"Usage")
+NORMAL (U"The file can be read again with @@Read from file... at .")
+ENTRY (U"File format")
+NORMAL (U"These files are in a device-independent binary format, "
 	"and can be written and read on any machine.")
 MAN_END
 
-MAN_BEGIN (L"Save as short text file...", L"ppgb", 20110129)
-INTRO (L"One of the commands in the @@Save menu at .")
-ENTRY (L"Availability")
-NORMAL (L"You can choose this command after selecting one or more @objects.")
-ENTRY (L"Behaviour")
-NORMAL (L"The Object window will ask you for a file name. "
+MAN_BEGIN (U"Save as short text file...", U"ppgb", 20110129)
+INTRO (U"One of the commands in the @@Save menu at .")
+ENTRY (U"Availability")
+NORMAL (U"You can choose this command after selecting one or more @objects.")
+ENTRY (U"Behaviour")
+NORMAL (U"The Object window will ask you for a file name. "
 	"After you click OK, the objects will be written to a text file on disk.")
-ENTRY (L"File format")
-NORMAL (L"The format is much shorter than the one described at @@Save as text file... at . "
+ENTRY (U"File format")
+NORMAL (U"The format is much shorter than the one described at @@Save as text file... at . "
 	"Most of the comments are gone, and there is normally one piece of data per line.")
-NORMAL (L"The file can be read again with the all-purpose @@Read from file... at .")
+NORMAL (U"The file can be read again with the all-purpose @@Read from file... at .")
 MAN_END
 
-MAN_BEGIN (L"Save as text file...", L"ppgb", 20110129)
-INTRO (L"One of the commands in the @@Save menu at .")
-ENTRY (L"Availability")
-NORMAL (L"You can choose this command after selecting one or more @objects.")
-ENTRY (L"Behaviour")
-NORMAL (L"The Object window will ask you for a file name. "
+MAN_BEGIN (U"Save as text file...", U"ppgb", 20110129)
+INTRO (U"One of the commands in the @@Save menu at .")
+ENTRY (U"Availability")
+NORMAL (U"You can choose this command after selecting one or more @objects.")
+ENTRY (U"Behaviour")
+NORMAL (U"The Object window will ask you for a file name. "
 	"After you click OK, the objects will be written to a text file on disk.")
-ENTRY (L"File format")
-NORMAL (L"If you selected a single object, e.g., of type Pitch, "
+ENTRY (U"File format")
+NORMAL (U"If you selected a single object, e.g., of type Pitch, "
 	"the file will start with the lines:")
-CODE (L"File type = \"ooTextFile\"")
-CODE (L"Object class = \"Pitch\"")
-NORMAL (L"After this, the pitch data will follow.")
-LIST_ITEM (L"If you selected more than one object, e.g., `Pitch hallo' and `Polygon kromme', "
+CODE (U"File type = \"ooTextFile\"")
+CODE (U"Object class = \"Pitch\"")
+NORMAL (U"After this, the pitch data will follow.")
+LIST_ITEM (U"If you selected more than one object, e.g., `Pitch hallo' and `Polygon kromme', "
 	"the file will look like:")
-CODE (L"File type = \"ooTextFile\"")
-CODE (L"Object class = \"Collection\"")
-CODE (L"size = 2")
-CODE (L"item []:")
-CODE (L"    item [1]:")
-CODE (L"        class = \"Pitch\"")
-CODE (L"        name = \"hallo\"")
-CODE (L"        (pitch data...)")
-CODE (L"    item [2]:")
-CODE (L"        class = \"Polygon\"")
-CODE (L"        name = \"kromme\"")
-CODE (L"        (polygon data...)")
-NORMAL (L"The file can be read again with @@Read from file...@, "
+CODE (U"File type = \"ooTextFile\"")
+CODE (U"Object class = \"Collection\"")
+CODE (U"size = 2")
+CODE (U"item []:")
+CODE (U"    item [1]:")
+CODE (U"        class = \"Pitch\"")
+CODE (U"        name = \"hallo\"")
+CODE (U"        (pitch data...)")
+CODE (U"    item [2]:")
+CODE (U"        class = \"Polygon\"")
+CODE (U"        name = \"kromme\"")
+CODE (U"        (polygon data...)")
+NORMAL (U"The file can be read again with @@Read from file...@, "
 	"which, by the way, does not need the verbosity of the above example. "
 	"The following minimal format will also be read correctly:")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"Collection\"  2")
-CODE (L"\"Pitch\"  \"hallo\"  (pitch data...)")
-CODE (L"\"Polygon\"  \"kromme\"  (polygon data...)")
-NORMAL (L"Thus, all text that is not a free-standing number and is not enclosed in double quotes or < >, "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"Collection\"  2")
+CODE (U"\"Pitch\"  \"hallo\"  (pitch data...)")
+CODE (U"\"Polygon\"  \"kromme\"  (polygon data...)")
+NORMAL (U"Thus, all text that is not a free-standing number and is not enclosed in double quotes or < >, "
 	"is considered a comment, as is all text following an exclamation mark (`!') on the same line.")
 MAN_END
 
-MAN_BEGIN (L"Segmentation", L"ppgb", 20010408)
-INTRO (L"See @@Intro 7. Annotation at .")
+MAN_BEGIN (U"Segmentation", U"ppgb", 20010408)
+INTRO (U"See @@Intro 7. Annotation at .")
 MAN_END
 
-MAN_BEGIN (L"Show formant", L"ppgb", 20030316)
-INTRO (L"One of the commands in the Formant menu of the @SoundEditor and the @TextGridEditor.")
-NORMAL (L"See @@Intro 5. Formant analysis at .")
+MAN_BEGIN (U"Show formant", U"ppgb", 20030316)
+INTRO (U"One of the commands in the Formant menu of the @SoundEditor and the @TextGridEditor.")
+NORMAL (U"See @@Intro 5. Formant analysis at .")
 MAN_END
 
-MAN_BEGIN (L"Show intensity", L"ppgb", 20030316)
-INTRO (L"One of the commands in the Intensity menu of the @SoundEditor and the @TextGridEditor.")
-NORMAL (L"See @@Intro 6. Intensity analysis at .")
+MAN_BEGIN (U"Show intensity", U"ppgb", 20030316)
+INTRO (U"One of the commands in the Intensity menu of the @SoundEditor and the @TextGridEditor.")
+NORMAL (U"See @@Intro 6. Intensity analysis at .")
 MAN_END
 
-MAN_BEGIN (L"Show pitch", L"ppgb", 20030316)
-INTRO (L"One of the commands in the Pitch menu of the @SoundEditor and the @TextGridEditor.")
-NORMAL (L"See @@Intro 4. Pitch analysis at .")
+MAN_BEGIN (U"Show pitch", U"ppgb", 20030316)
+INTRO (U"One of the commands in the Pitch menu of the @SoundEditor and the @TextGridEditor.")
+NORMAL (U"See @@Intro 4. Pitch analysis at .")
 MAN_END
 
-MAN_BEGIN (L"Show pulses", L"ppgb", 20030316)
-INTRO (L"One of the commands in the Pulses menu of the @SoundEditor and the @TextGridEditor.")
-NORMAL (L"See @Voice.")
+MAN_BEGIN (U"Show pulses", U"ppgb", 20030316)
+INTRO (U"One of the commands in the Pulses menu of the @SoundEditor and the @TextGridEditor.")
+NORMAL (U"See @Voice.")
 MAN_END
 
-MAN_BEGIN (L"Show spectrogram", L"ppgb", 20030316)
-INTRO (L"One of the commands in the Spectrogram menu of the @SoundEditor and the @TextGridEditor.")
-NORMAL (L"See @@Intro 3. Spectral analysis at .")
+MAN_BEGIN (U"Show spectrogram", U"ppgb", 20030316)
+INTRO (U"One of the commands in the Spectrogram menu of the @SoundEditor and the @TextGridEditor.")
+NORMAL (U"See @@Intro 3. Spectral analysis at .")
 MAN_END
 
-MAN_BEGIN (L"Source-filter synthesis", L"ppgb", 20050713)
-INTRO (L"This tutorial describes how you can do acoustic synthesis with Praat. "
+MAN_BEGIN (U"Source-filter synthesis", U"ppgb", 20050713)
+INTRO (U"This tutorial describes how you can do acoustic synthesis with Praat. "
 	"It assumes that you are familiar with the @Intro.")
-ENTRY (L"1. The source-filter theory of speech production")
-NORMAL (L"The source-filter theory (@@Fant (1960)|Fant 1960@) hypothesizes that an acoustic speech signal can be seen "
+ENTRY (U"1. The source-filter theory of speech production")
+NORMAL (U"The source-filter theory (@@Fant (1960)|Fant 1960@) hypothesizes that an acoustic speech signal can be seen "
 	"as a %source signal (the glottal source, or noise generated at a constriction in the vocal tract), "
 	"%filtered with the resonances in the cavities of the vocal tract downstream from the glottis "
 	"or the constriction. The %%Klatt synthesizer% (@@Klatt & Klatt (1990)|Klatt & Klatt 1990@), for instance, "
 	"is based on this idea.")
-NORMAL (L"In the Praat program, you can create a %source signal from scratch of from an existing "
+NORMAL (U"In the Praat program, you can create a %source signal from scratch of from an existing "
 	"speech signal, and you can create a %filter from scratch or extract it from an existing speech signal. "
 	"You can manipulate (change, adapt) both the source and the filter before doing "
 	"the actual synthesis, which combines the two.")
-LIST_ITEM (L"@@Source-filter synthesis 1. Creating a source from pitch targets")
-LIST_ITEM (L"@@Source-filter synthesis 2. Filtering a source")
-LIST_ITEM (L"@@Source-filter synthesis 3. The ba-da continuum")
-LIST_ITEM (L"@@Source-filter synthesis 4. Using existing sounds")
+LIST_ITEM (U"@@Source-filter synthesis 1. Creating a source from pitch targets")
+LIST_ITEM (U"@@Source-filter synthesis 2. Filtering a source")
+LIST_ITEM (U"@@Source-filter synthesis 3. The ba-da continuum")
+LIST_ITEM (U"@@Source-filter synthesis 4. Using existing sounds")
 MAN_END
 
-MAN_BEGIN (L"Source-filter synthesis 1. Creating a source from pitch targets", L"ppgb", 20140421)
-INTRO (L"Creating a glottal source signal for speech synthesis involves creating a @PointProcess, "
+MAN_BEGIN (U"Source-filter synthesis 1. Creating a source from pitch targets", U"ppgb", 20140421)
+INTRO (U"Creating a glottal source signal for speech synthesis involves creating a @PointProcess, "
 	"which is a series of time points that should represent the exact moments of glottal closure.")
-NORMAL (L"You may want to start with creating a well-defined pitch contour. "
+NORMAL (U"You may want to start with creating a well-defined pitch contour. "
 	"Suppose you want to create a sound with a duration of half a second with a pitch that falls from 300 to 200 Hz "
 	"during that time. You first create an empty @PitchTier by choosing @@Create PitchTier...@ from the #New menu "
 	"(I call this PitchTier \"empty\" because it does not contain any pitch information yet); "
@@ -3252,7 +3323,7 @@ NORMAL (L"You may want to start with creating a well-defined pitch contour. "
 	"In the PitchTier window, you can see that the pitch curve falls linearly "
 	"from 150 to 100 Hz during its time domain:")
 SCRIPT (4.5, 2.5,
-	L"Create PitchTier... source 0 0.5\n"
+	U"Create PitchTier... source 0 0.5\n"
 	"Add point... 0.0 150\n"
 	"Add point... 0.5 100\n"
 	"Draw... 0 0 0 200 yes lines and speckles\n"
@@ -3260,9 +3331,9 @@ SCRIPT (4.5, 2.5,
 	"One mark left... 100 yes yes no\n"
 	"Remove\n"
 )
-NORMAL (L"You can hear the falling pitch by clicking on the rectangles in the PitchTier window "
+NORMAL (U"You can hear the falling pitch by clicking on the rectangles in the PitchTier window "
 	"(or by clicking ##Play pulses#, #Hum, or ##Play sine# in the Objects window).")
-NORMAL (L"From this PitchTier, you can create a @PointProcess with @@PitchTier: To PointProcess at . "
+NORMAL (U"From this PitchTier, you can create a @PointProcess with @@PitchTier: To PointProcess at . "
 	"The resulting PointProcess now represents a series of glottal pulses. To make some parts of this "
 	"point process voiceless, you can use @@PointProcess: Remove points between... at . "
 	"It is advisable to make the very beginning and end of this point process voiceless, so that the filtered sound "
@@ -3270,7 +3341,7 @@ NORMAL (L"From this PitchTier, you can create a @PointProcess with @@PitchTier:
 	"and a stretch of 70 ms in the middle "
 	"is made voiceless as well, perhaps because you want to simulate a voiceless plosive there:")
 SCRIPT (4.5, 2.5,
-	L"pitchTier = Create PitchTier... source 0 0.5\n"
+	U"pitchTier = Create PitchTier... source 0 0.5\n"
 	"Add point... 0.0 150\n"
 	"Add point... 0.5 100\n"
 	"pulses = To PointProcess\n"
@@ -3284,13 +3355,13 @@ SCRIPT (4.5, 2.5,
 	"plus pitchTier\n"
 	"Remove\n"
 )
-NORMAL (L"Now that we have a glottal point process (a glottal pulse train), the only thing left "
+NORMAL (U"Now that we have a glottal point process (a glottal pulse train), the only thing left "
 	"is to turn it into a sound by choosing @@PointProcess: To Sound (phonation)... at . "
 	"If you use the standard settings of this command (but with ##Adaptation factor# set to 0.6), the result will be a @Sound with "
 	"reasonable glottal flow derivatives centred around each of the original pulses in the point process. "
 	"You can check this by selecting the Sound and choosing ##View & Edit#:")
 SCRIPT (4.5, 2.5,
-	L"pitchTier = Create PitchTier... source 0 0.5\n"
+	U"pitchTier = Create PitchTier... source 0 0.5\n"
 	"Add point... 0.0 150\n"
 	"Add point... 0.5 100\n"
 	"pulses = To PointProcess\n"
@@ -3306,177 +3377,177 @@ SCRIPT (4.5, 2.5,
 	"plus pulses\n"
 	"Remove\n"
 )
-NORMAL (L"You will also see that the amplitude of the first two glottal wave shapes of every voiced stretch "
+NORMAL (U"You will also see that the amplitude of the first two glottal wave shapes of every voiced stretch "
 	"is (realistically) somewhat smaller than the amplitudes of the following wave shapes; "
 	"This is the result of setting ##Adaptation factor# to 0.6.")
-NORMAL (L"What you have now is what we call a %%glottal source signal%. It does two things: it contains information on the glottal flow, "
+NORMAL (U"What you have now is what we call a %%glottal source signal%. It does two things: it contains information on the glottal flow, "
 	"and it already takes into account one aspect of the %filter, namely the radiation at the lips. "
 	"This combination is standard procedure in acoustic synthesis.")
-NORMAL (L"The glottal source signal sounds as a voice without a vocal tract. "
+NORMAL (U"The glottal source signal sounds as a voice without a vocal tract. "
 	"The following section describes how you add vocal-tract resonances, i.e. the %filter.")
-ENTRY (L"Automation")
-NORMAL (L"In a clean Praat script, the procedure described above will look as follows:")
-CODE (L"pitchTier = Create PitchTier: \"source\", 0, 0.5")
-CODE (L"Add point: 0.0, 150")
-CODE (L"Add point: 0.5, 100")
-CODE (L"pulses = To PointProcess")
-CODE (L"Remove points between: 0, 0.02")
-CODE (L"Remove points between: 0.24, 0.31")
-CODE (L"Remove points between: 0.48, 0.5")
-CODE (L"source = To Sound (phonation): 44100, 0.6, 0.05, 0.7, 0.03, 3.0, 4.0")
-CODE (L"removeObject: pitchTier, pulses")
-CODE (L"selectObject: source")
-MAN_END
-
-MAN_BEGIN (L"Source-filter synthesis 2. Filtering a source", L"ppgb", 20140421)
-INTRO (L"Once you have a glottal source signal, you are ready to create a filter that represents "
+ENTRY (U"Automation")
+NORMAL (U"In a clean Praat script, the procedure described above will look as follows:")
+CODE (U"pitchTier = Create PitchTier: \"source\", 0, 0.5")
+CODE (U"Add point: 0.0, 150")
+CODE (U"Add point: 0.5, 100")
+CODE (U"pulses = To PointProcess")
+CODE (U"Remove points between: 0, 0.02")
+CODE (U"Remove points between: 0.24, 0.31")
+CODE (U"Remove points between: 0.48, 0.5")
+CODE (U"source = To Sound (phonation): 44100, 0.6, 0.05, 0.7, 0.03, 3.0, 4.0")
+CODE (U"removeObject: pitchTier, pulses")
+CODE (U"selectObject: source")
+MAN_END
+
+MAN_BEGIN (U"Source-filter synthesis 2. Filtering a source", U"ppgb", 20140421)
+INTRO (U"Once you have a glottal source signal, you are ready to create a filter that represents "
 	"the resonances of the vocal tract, as a function of time. In other words, you create a @FormantGrid object.")
-NORMAL (L"For a vowel spoken by an average (i.e. adult female) human voice, tradition assumes five formants in the range "
+NORMAL (U"For a vowel spoken by an average (i.e. adult female) human voice, tradition assumes five formants in the range "
 	"between 0 and 5500 hertz. This number comes from a computation of the formants of a "
 	"straight tube, which has resonances at wavelengths of four tube lengths, four thirds of a tube length, "
 	"four fifths, and so on. For a straight tube 16 centimetres long, the shortest wavelength is 64 cm, "
 	"which, with a sound velocity of 352 m/s, means a resonance frequency of 352/0.64 = 550 hertz. "
 	"The other resonances will be at 1650, 2750, 3850, and 4950 hertz.")
-NORMAL (L"You can create a @FormantGrid object with @@Create FormantGrid...@ from the #New menu (submenu #Tiers):")
-CODE (L"Create FormantGrid: \"filter\", 0, 0.5, 10, 550, 1100, 60, 50")
-NORMAL (L"This creates a FormantGrid with 10 formants and a single frequency value for each formant: %F__1_ is 550 Hz "
+NORMAL (U"You can create a @FormantGrid object with @@Create FormantGrid...@ from the #New menu (submenu #Tiers):")
+CODE (U"Create FormantGrid: \"filter\", 0, 0.5, 10, 550, 1100, 60, 50")
+NORMAL (U"This creates a FormantGrid with 10 formants and a single frequency value for each formant: %F__1_ is 550 Hz "
 	"and the higher formants are spaced 1100 Hz apart, i.e., they are "
 	"1650, 2750, 3850, 4950, 6050, 7150, 8250, 9350, and 10450 hertz; "
 	"the ten bandwidths start at 60 Hz and have a spacing of 50 Hz, "
 	"i.e., they are 60, 110, 160, 210, 260, 310, 360, 410, 460, and 510 hertz.")
-NORMAL (L"You can then create formant contours with @@FormantGrid: Add formant point...@:")
-CODE (L"Remove formant points between: 1, 0, 0.5")
-CODE (L"Add formant point: 1, 0.00, 100")
-CODE (L"Add formant point: 1, 0.05, 700")
-CODE (L"Remove formant points between: 2, 0, 0.5")
-CODE (L"Add formant point: 2, 0.00, 500")
-CODE (L"Add formant point: 2, 0.05, 1100")
-NORMAL (L"This example creates a spectral specification whose %F__1_ rises from 100 to 700 hertz during the "
+NORMAL (U"You can then create formant contours with @@FormantGrid: Add formant point...@:")
+CODE (U"Remove formant points between: 1, 0, 0.5")
+CODE (U"Add formant point: 1, 0.00, 100")
+CODE (U"Add formant point: 1, 0.05, 700")
+CODE (U"Remove formant points between: 2, 0, 0.5")
+CODE (U"Add formant point: 2, 0.00, 500")
+CODE (U"Add formant point: 2, 0.05, 1100")
+NORMAL (U"This example creates a spectral specification whose %F__1_ rises from 100 to 700 hertz during the "
 	"first 50 milliseconds (as for any obstruent), and whose %F__2_ rises from 500 to 1100 hertz. "
 	"The other eight formants keep their original values, as do the ten bandwidths. "
 	"The resulting sound may be a [ba]-like formant transition.")
-NORMAL (L"To get the final acoustic result (the sound), you select the glottal source signal "
+NORMAL (U"To get the final acoustic result (the sound), you select the glottal source signal "
 	"together with the FormantGrid and choose @@Sound & FormantGrid: Filter at .")
-NORMAL (L"The resulting sound will have a fairly straight intensity contour. You can change this with "
+NORMAL (U"The resulting sound will have a fairly straight intensity contour. You can change this with "
 	"the #Formula command (@@Sound: Formula...@), or by multiplying the source signal or the "
 	"acoustic result with an @Intensity or @IntensityTier object.")
 MAN_END
 
-MAN_BEGIN (L"Source-filter synthesis 3. The ba-da continuum", L"ppgb", 20140421)
-INTRO (L"As an example, we are going to create a male [ba]-[da] continuum in six steps. The acoustic difference "
+MAN_BEGIN (U"Source-filter synthesis 3. The ba-da continuum", U"ppgb", 20140421)
+INTRO (U"As an example, we are going to create a male [ba]-[da] continuum in six steps. The acoustic difference "
 	"between [ba] and [da] is the initial %F__2_, which is 500 Hz for [ba], and 2500 Hz for [da].")
-NORMAL (L"We use the same @PitchTier throughout, to model a falling intonation contour:")
-CODE (L"Create PitchTier: \"f0\", 0.00, 0.50")
-CODE (L"Add point: 0.00, 150")
-CODE (L"Add point: 0.50, 100")
-NORMAL (L"The first and last 50 milliseconds are voiceless:")
-CODE (L"To PointProcess")
-CODE (L"Remove points between: 0.00, 0.05")
-CODE (L"Remove points between: 0.45, 0.50")
-NORMAL (L"Generate the glottal source signal:")
-CODE (L"To Sound (phonation): 44100, 0.6, 0.05, 0.7, 0.03, 3.0, 4.0")
-NORMAL (L"During the labial or coronal closure, the sound is almost silent, so we use an @IntensityTier "
+NORMAL (U"We use the same @PitchTier throughout, to model a falling intonation contour:")
+CODE (U"Create PitchTier: \"f0\", 0.00, 0.50")
+CODE (U"Add point: 0.00, 150")
+CODE (U"Add point: 0.50, 100")
+NORMAL (U"The first and last 50 milliseconds are voiceless:")
+CODE (U"To PointProcess")
+CODE (U"Remove points between: 0.00, 0.05")
+CODE (U"Remove points between: 0.45, 0.50")
+NORMAL (U"Generate the glottal source signal:")
+CODE (U"To Sound (phonation): 44100, 0.6, 0.05, 0.7, 0.03, 3.0, 4.0")
+NORMAL (U"During the labial or coronal closure, the sound is almost silent, so we use an @IntensityTier "
 	"that models this:")
-CODE (L"Create IntensityTier: \"intens\", 0.00, 0.50")
-CODE (L"Add point: 0.05, 60")
-CODE (L"Add point: 0.10, 80")
-NORMAL (L"Generate the source signal:")
-CODE (L"#plusObject: \"Sound f0\"")
-CODE (L"Multiply")
-CODE (L"Rename: \"source\"")
-NORMAL (L"The ten sounds are generated in a loop:")
-CODE (L"#for i #from 1 #to 10")
-	CODE1 (L"f2_locus = 500 + (2500/9) * (i - 1) ; variable names start with lower case!")
-	CODE1 (L"Create FormantGrid: \"filter\", 0.0, 0.5, 9, 800, 1000, 60, 80")
-	CODE1 (L"Remove formant points between: 1, 0.0, 0.5")
-	CODE1 (L"Add formant point: 1, 0.05, 100")
-	CODE1 (L"Add bandwidth point: 1, 0.05, 50")
-	CODE1 (L"Add formant point: 2, 0.05, f2_locus")
-	CODE1 (L"Add bandwidth point: 2, 0.05, 100")
-	CODE1 (L"#plusObject: \"Sound source\"")
-	CODE1 (L"Filter (no scale)")
-	CODE1 (L"Rename: \"bada\" + string\\$  (i)")
-	CODE1 (L"#removeObject: \"FormantGrid filter\"")
-CODE (L"#endfor")
-NORMAL (L"Clean up:")
-CODE (L"#removeObject: \"Sound source\", \"Sound f0\", \"IntensityTier intens\",")
-CODE (L"... \"PointProcess f0\", \"PitchTier f0\"")
-NORMAL (L"In this example, filtering was done without automatic scaling, so that "
+CODE (U"Create IntensityTier: \"intens\", 0.00, 0.50")
+CODE (U"Add point: 0.05, 60")
+CODE (U"Add point: 0.10, 80")
+NORMAL (U"Generate the source signal:")
+CODE (U"#plusObject: \"Sound f0\"")
+CODE (U"Multiply")
+CODE (U"Rename: \"source\"")
+NORMAL (U"The ten sounds are generated in a loop:")
+CODE (U"#for i #from 1 #to 10")
+	CODE1 (U"f2_locus = 500 + (2500/9) * (i - 1) ; variable names start with lower case!")
+	CODE1 (U"Create FormantGrid: \"filter\", 0.0, 0.5, 9, 800, 1000, 60, 80")
+	CODE1 (U"Remove formant points between: 1, 0.0, 0.5")
+	CODE1 (U"Add formant point: 1, 0.05, 100")
+	CODE1 (U"Add bandwidth point: 1, 0.05, 50")
+	CODE1 (U"Add formant point: 2, 0.05, f2_locus")
+	CODE1 (U"Add bandwidth point: 2, 0.05, 100")
+	CODE1 (U"#plusObject: \"Sound source\"")
+	CODE1 (U"Filter (no scale)")
+	CODE1 (U"Rename: \"bada\" + string\\$  (i)")
+	CODE1 (U"#removeObject: \"FormantGrid filter\"")
+CODE (U"#endfor")
+NORMAL (U"Clean up:")
+CODE (U"#removeObject: \"Sound source\", \"Sound f0\", \"IntensityTier intens\",")
+CODE (U"... \"PointProcess f0\", \"PitchTier f0\"")
+NORMAL (U"In this example, filtering was done without automatic scaling, so that "
 	"the resulting signals have equal intensities in the areas where they have "
 	"equal formants. You will probably want to multiply all these signals with "
 	"the same value in order to bring their amplitudes in a suitable range "
 	"between -1 and +1 Pascal.")
 MAN_END
 
-MAN_BEGIN (L"Source-filter synthesis 4. Using existing sounds", L"ppgb", 20140421)
-ENTRY (L"1. How to extract the %filter from an existing speech sound")
-NORMAL (L"You can separate source and filter with the help of the technique of %%linear prediction% "
+MAN_BEGIN (U"Source-filter synthesis 4. Using existing sounds", U"ppgb", 20140421)
+ENTRY (U"1. How to extract the %filter from an existing speech sound")
+NORMAL (U"You can separate source and filter with the help of the technique of %%linear prediction% "
 	"(see @@Sound: LPC analysis@). This technique tries to approximate a given frequency spectrum with "
 	"a small number of peaks, for which it finds the mid frequencies and the bandwidths. "
 	"If we do this for an overlapping sequence of windowed parts of a sound signal "
 	"(i.e. a %%short-term analysis%), we get a quasi-stationary approximation of the signal's "
 	"spectral characteristics as a function of time, i.e. a smoothed version of the @Spectrogram.")
-NORMAL (L"For a speech signal, the peaks are identified with the resonances (%formants) of the vocal tract. "
+NORMAL (U"For a speech signal, the peaks are identified with the resonances (%formants) of the vocal tract. "
 	"Since the spectrum of a vowel spoken by an average human being falls off with approximately "
 	"6 dB per octave, %%pre-emphasis% is applied to the signal before the linear-prediction analysis, "
 	"so that the algorithm will not try to match only the lower parts of the spectrum.")
-NORMAL (L"For an adult female human voice, tradition assumes five formants in the range "
+NORMAL (U"For an adult female human voice, tradition assumes five formants in the range "
 	"between 0 and 5500 hertz, say at 550, 1650, 2750, 3850, and 4950 hertz. For the linear prediction in "
 	"Praat, you will have to implement this 5500-Hz band-limiting by resampling the original "
 	"speech signal to 11 kHz. For a male voice, you would use 10 kHz; for a young child, 20 kHz.")
-NORMAL (L"To perform the resampling, you use @@Sound: Resample...@: "
+NORMAL (U"To perform the resampling, you use @@Sound: Resample...@: "
 	"you select a @Sound object, and click ##Resample...#. "
 	"In the rest of this tutorial, I will use the syntax that you would use in a script, "
 	"though you will usually do these things by clicking on objects and buttons. Thus:")
-CODE (L"#selectObject: \"Sound hallo\"")
-CODE (L"Resample: 11000, 50")
-NORMAL (L"You can then perform a linear-prediction analysis on the resampled sound "
+CODE (U"#selectObject: \"Sound hallo\"")
+CODE (U"Resample: 11000, 50")
+NORMAL (U"You can then perform a linear-prediction analysis on the resampled sound "
 	"with @@Sound: To LPC (burg)...@:")
-CODE (L"#selectObject: \"Sound hallo_11000\"")
-CODE (L"To LPC (burg): 10, 0.025, 0.005, 50")
-NORMAL (L"This says that your analysis is done with 10 linear-prediction parameters "
+CODE (U"#selectObject: \"Sound hallo_11000\"")
+CODE (U"To LPC (burg): 10, 0.025, 0.005, 50")
+NORMAL (U"This says that your analysis is done with 10 linear-prediction parameters "
 	"(which will yield at most five formant-bandwidth pairs), with an analysis window "
 	"effectively 25 milliseconds long, with time steps of 5 milliseconds (so that the windows "
 	"will appreciably overlap), and with a pre-emphasis frequency of 50 Hz (which is the point "
 	"above which the sound will be amplified by 6 dB/octave prior to the analysis proper).")
-NORMAL (L"As a result, an object called \"LPC hallo\" will appear in the list of objects. "
+NORMAL (U"As a result, an object called \"LPC hallo\" will appear in the list of objects. "
 	"This @LPC object is a time function with 10 %%linear-prediction coefficients% in each %%time frame%. "
 	"These coefficients are rather opaque even to the expert (try to view them with @Inspect), "
 	"but they are the raw material from which formant and bandwidth values can be computed. "
 	"To see the smoothed @Spectrogram associated with the LPC object, choose @@LPC: To Spectrogram...@:")
-CODE (L"#selectObject: \"LPC hallo_11000\"")
-CODE (L"To Spectrogram: 20, 0, 50")
-CODE (L"Paint: 0, 0, 0, 0, 50, 0, 0, \"yes\"")
-NORMAL (L"Note that when drawing this Spectrogram, you will want to set the pre-emphasis to zero "
+CODE (U"#selectObject: \"LPC hallo_11000\"")
+CODE (U"To Spectrogram: 20, 0, 50")
+CODE (U"Paint: 0, 0, 0, 0, 50, 0, 0, \"yes\"")
+NORMAL (U"Note that when drawing this Spectrogram, you will want to set the pre-emphasis to zero "
 	"(the fifth 0 in the last line), because pre-emphasis has already been applied in the analysis.")
-NORMAL (L"You can get and draw the formant-bandwidth pairs from the LPC object, "
+NORMAL (U"You can get and draw the formant-bandwidth pairs from the LPC object, "
 	"with @@LPC: To Formant@ and @@Formant: Speckle...@:")
-CODE (L"#selectObject: \"LPC hallo_11000\"")
-CODE (L"To Formant")
-CODE (L"Speckle: 0, 0, 5500, 30, \"yes\"")
-NORMAL (L"Note that in converting the @LPC into a @Formant object, you may have lost some "
+CODE (U"#selectObject: \"LPC hallo_11000\"")
+CODE (U"To Formant")
+CODE (U"Speckle: 0, 0, 5500, 30, \"yes\"")
+NORMAL (U"Note that in converting the @LPC into a @Formant object, you may have lost some "
 	"information about spectral peaks at very low frequencies (below 50 Hz) or at very high "
 	"frequencies (near the @@Nyquist frequency@ of 5500 Hz. Such peaks usually try to fit "
 	"an overall spectral slope (if the 6 dB/octave model is inappropriate), and are not seen "
 	"as related with resonances in the vocal tract, so they are ignored in a formant analysis. "
 	"For resynthesis purposes, they might still be important.")
-NORMAL (L"Instead of using the intermediate LPC object, you could have done a formant analysis "
+NORMAL (U"Instead of using the intermediate LPC object, you could have done a formant analysis "
 	"directly on the original Sound, with @@Sound: To Formant (burg)...@:")
-CODE (L"#selectObject: \"Sound hallo\"")
-CODE (L"To Formant (burg): 0.005, 5, 5500, 0.025, 50")
-NORMAL (L"A @Formant object has a fixed sampling (time step, frame length), and for every "
+CODE (U"#selectObject: \"Sound hallo\"")
+CODE (U"To Formant (burg): 0.005, 5, 5500, 0.025, 50")
+NORMAL (U"A @Formant object has a fixed sampling (time step, frame length), and for every "
 	"%%formant frame%, it contains a number of formant-bandwidth pairs.")
-NORMAL (L"From a Formant object, you can create a @FormantGrid with @@Formant: Down to FormantGrid at . "
+NORMAL (U"From a Formant object, you can create a @FormantGrid with @@Formant: Down to FormantGrid at . "
 	"A FormantGrid object contains a number of tiers with time-stamped %%formant points% and %%bandwidth points%.")
-NORMAL (L"Any of these three types (@LPC, @Formant, and @FormantGrid) can represent the %filter "
+NORMAL (U"Any of these three types (@LPC, @Formant, and @FormantGrid) can represent the %filter "
 	"in source-filter synthesis.")
-ENTRY (L"2. How to extract the %source from an existing speech sound")
-NORMAL (L"If you are only interested in the %filter characteristics, you can get by with @Formant objects. "
+ENTRY (U"2. How to extract the %source from an existing speech sound")
+NORMAL (U"If you are only interested in the %filter characteristics, you can get by with @Formant objects. "
 	"To get at the %source signal, however, you need the raw @LPC object: "
 	"you select it together with the resampled @Sound, and apply %%inverse filtering%:")
-CODE (L"#selectObject: \"Sound hallo_11000\", \"LPC hallo_11000\"")
-CODE (L"Filter (inverse)")
-NORMAL (L"A new Sound named \"hallo_11000\" will appear in the list of objects "
+CODE (U"#selectObject: \"Sound hallo_11000\", \"LPC hallo_11000\"")
+CODE (U"Filter (inverse)")
+NORMAL (U"A new Sound named \"hallo_11000\" will appear in the list of objects "
 	"(you could rename it to \"source\"). "
 	"This is the estimated source signal. Since the LPC analysis was designed to yield a spectrally "
 	"flat filter (through the use of pre-emphasis), this source signal represents everything in the "
@@ -3485,197 +3556,197 @@ NORMAL (L"A new Sound named \"hallo_11000\" will appear in the list of objects "
 	"-12 dB/octave for vowels) and the radiation characteristics at the lips, which cause a "
 	"6 dB/octave spectral rise, so that the resulting spectrum of the \"source signal\" "
 	"is actually the %derivative of the glottal flow, with an expected spectral slope of -6 dB/octave.")
-NORMAL (L"Note that with inverse filtering you cannot measure the actual spectral slope of the source signal. "
+NORMAL (U"Note that with inverse filtering you cannot measure the actual spectral slope of the source signal. "
 	"Even if the actual slope is very different from -6 dB/octave, formant extraction will try to "
 	"match the pre-emphasized spectrum. Thus, by choosing a pre-emhasis of -6 dB/octave, "
 	"you %impose a slope of -6 dB/octave on the source signal.")
-ENTRY (L"3. How to do the synthesis")
-NORMAL (L"You can create a new Sound from a source Sound and a filter, in at least four ways.")
-NORMAL (L"If your filter is an @LPC object, you select it and the source, and choose @@LPC & Sound: Filter...@:")
-CODE (L"#selectObject: \"Sound source\", \"LPC filter\"")
-CODE (L"Filter: \"no\"")
-NORMAL (L"If you had computed the source and filter from an LPC analysis, this procedure should give "
+ENTRY (U"3. How to do the synthesis")
+NORMAL (U"You can create a new Sound from a source Sound and a filter, in at least four ways.")
+NORMAL (U"If your filter is an @LPC object, you select it and the source, and choose @@LPC & Sound: Filter...@:")
+CODE (U"#selectObject: \"Sound source\", \"LPC filter\"")
+CODE (U"Filter: \"no\"")
+NORMAL (U"If you had computed the source and filter from an LPC analysis, this procedure should give "
 	"you back the original Sound, except that windowing has caused 25 milliseconds at the beginning "
 	"and end of the signal to be set to zero.")
-NORMAL (L"If your filter is a @Formant object, you select it and the source, and choose @@Sound & Formant: Filter@:")
-CODE (L"#selectObject: \"Sound source\", \"Formant filter\"")
-CODE (L"Filter")
-NORMAL (L"If you had computed the source and filter from an LPC analysis, this procedure will not generally give "
+NORMAL (U"If your filter is a @Formant object, you select it and the source, and choose @@Sound & Formant: Filter@:")
+CODE (U"#selectObject: \"Sound source\", \"Formant filter\"")
+CODE (U"Filter")
+NORMAL (U"If you had computed the source and filter from an LPC analysis, this procedure will not generally give "
 	"you back the original Sound, because some linear-prediction coefficients will have been ignored "
 	"in the conversion to formant-bandwidth pairs.")
-NORMAL (L"If your filter is a @FormantGrid object, you select it and the source, and choose @@Sound & FormantGrid: Filter@:")
-CODE (L"#selectObject: \"Sound source\", \"FormantGrid filter\"")
-CODE (L"Filter")
-NORMAL (L"Finally, you could just know the %%impulse response% of your filter (in a @Sound object). "
+NORMAL (U"If your filter is a @FormantGrid object, you select it and the source, and choose @@Sound & FormantGrid: Filter@:")
+CODE (U"#selectObject: \"Sound source\", \"FormantGrid filter\"")
+CODE (U"Filter")
+NORMAL (U"Finally, you could just know the %%impulse response% of your filter (in a @Sound object). "
 	"You then select both Sound objects, and choose @@Sounds: Convolve...@:")
-CODE (L"#selectObject: \"Sound source\", \"Sound filter\"")
-CODE (L"Convolve: \"integral\", \"zero\"")
-NORMAL (L"As a last step, you may want to bring the resulting sound within the [-1; +1] range:")
-CODE (L"Scale peak: 0.99")
-ENTRY (L"4. How to manipulate the filter")
-NORMAL (L"You can hardly change the values in an @LPC object in a meaningful way: "
+CODE (U"#selectObject: \"Sound source\", \"Sound filter\"")
+CODE (U"Convolve: \"integral\", \"zero\"")
+NORMAL (U"As a last step, you may want to bring the resulting sound within the [-1; +1] range:")
+CODE (U"Scale peak: 0.99")
+ENTRY (U"4. How to manipulate the filter")
+NORMAL (U"You can hardly change the values in an @LPC object in a meaningful way: "
 	"you would have to manually change its rather opaque data with the help of @Inspect.")
-NORMAL (L"A @Formant object can be changed in a friendlier way, with @@Formant: Formula (frequencies)...@ "
+NORMAL (U"A @Formant object can be changed in a friendlier way, with @@Formant: Formula (frequencies)...@ "
 	"and @@Formant: Formula (bandwidths)... at . For instance, to multiply all formant frequencies by 0.9, "
 	"you do")
-CODE (L"#selectObject: \"Formant filter\"")
-CODE (L"Formula (frequencies): \"self * 0.9\"")
-NORMAL (L"To add 200 hertz to all values of %F__2_, you do")
-CODE (L"Formula (frequencies): \"if row = 2 then self + 200 else self fi\"")
-NORMAL (L"A @FormantGrid object can be changed by adding or removing points:")
-LIST_ITEM (L"@@FormantGrid: Add formant point...@")
-LIST_ITEM (L"@@FormantGrid: Add bandwidth point...@")
-LIST_ITEM (L"@@FormantGrid: Remove formant points between...@")
-LIST_ITEM (L"@@FormantGrid: Remove bandwidth points between...@")
-ENTRY (L"5. How to manipulate the source signal")
-NORMAL (L"You can manipulate the source signal in the same way you that would manipulate any sound, "
+CODE (U"#selectObject: \"Formant filter\"")
+CODE (U"Formula (frequencies): \"self * 0.9\"")
+NORMAL (U"To add 200 hertz to all values of %F__2_, you do")
+CODE (U"Formula (frequencies): \"if row = 2 then self + 200 else self fi\"")
+NORMAL (U"A @FormantGrid object can be changed by adding or removing points:")
+LIST_ITEM (U"@@FormantGrid: Add formant point...@")
+LIST_ITEM (U"@@FormantGrid: Add bandwidth point...@")
+LIST_ITEM (U"@@FormantGrid: Remove formant points between...@")
+LIST_ITEM (U"@@FormantGrid: Remove bandwidth points between...@")
+ENTRY (U"5. How to manipulate the source signal")
+NORMAL (U"You can manipulate the source signal in the same way you that would manipulate any sound, "
 	"for instance with the @ManipulationEditor.")
 MAN_END
 
-MAN_BEGIN (L"Spectrogram settings...", L"ppgb", 20030316)
-INTRO (L"A command in the Spectrogram menu of the @SoundEditor and @TextGridEditor windows. "
+MAN_BEGIN (U"Spectrogram settings...", U"ppgb", 20030316)
+INTRO (U"A command in the Spectrogram menu of the @SoundEditor and @TextGridEditor windows. "
 	"See @@Intro 3.2. Configuring the spectrogram at .")
 MAN_END
 
-MAN_BEGIN (L"Technical", L"ppgb", 20120915)
-INTRO (L"The title of a submenu of the @@Praat menu at .")
+MAN_BEGIN (U"Technical", U"ppgb", 20120915)
+INTRO (U"The title of a submenu of the @@Praat menu at .")
 MAN_END
 
-MAN_BEGIN (L"Types of objects", L"ppgb", 20141109)
-INTRO (L"Praat contains the following types of objects and @Editors. "
+MAN_BEGIN (U"Types of objects", U"ppgb", 20141109)
+INTRO (U"Praat contains the following types of objects and @Editors. "
 	"For an introduction and tutorials, see @Intro.")
-NORMAL (L"General purpose:")
-LIST_ITEM (L"• @Matrix: a sampled real-valued function of two variables")
-LIST_ITEM (L"• @Polygon")
-LIST_ITEM (L"• @PointProcess: a point process (@PointEditor)")
-LIST_ITEM (L"• @Sound: a sampled continuous process (@SoundEditor, @SoundRecorder, @@Sound files@)")
-LIST_ITEM (L"• @LongSound: a file-based version of a sound (@LongSoundEditor)")
-LIST_ITEM (L"• @Strings")
-LIST_ITEM (L"• @Distributions, @PairDistribution")
-LIST_ITEM (L"• @Table, @TableOfReal")
-LIST_ITEM (L"• @Permutation")
-LIST_ITEM (L"• @ParamCurve")
-NORMAL (L"Periodicity analysis:")
-LIST_ITEM (L"• Tutorials:")
-LIST_ITEM1 (L"• @@Intro 4. Pitch analysis")
-LIST_ITEM1 (L"• @@Intro 6. Intensity analysis")
-LIST_ITEM1 (L"• @Voice (jitter, shimmer, noise)")
-LIST_ITEM (L"• @Pitch: articulatory fundamental frequency, acoustic periodicity, or perceptual pitch (@PitchEditor)")
-LIST_ITEM (L"• @Harmonicity: degree of periodicity")
-LIST_ITEM (L"• @Intensity, @IntensityTier: intensity contour")
-NORMAL (L"Spectral analysis:")
-LIST_ITEM (L"• Tutorials:")
-LIST_ITEM1 (L"• @@Intro 3. Spectral analysis")
-LIST_ITEM1 (L"• @@Intro 5. Formant analysis")
-LIST_ITEM (L"• @Spectrum: complex-valued equally spaced frequency spectrum (@SpectrumEditor)")
-LIST_ITEM (L"• @Ltas: long-term average spectrum")
-LIST_ITEM (L"• Spectro-temporal: @Spectrogram, @BarkSpectrogram, @MelSpectrogram")
-LIST_ITEM (L"• @Formant: acoustic formant contours")
-LIST_ITEM (L"• @LPC: coefficients of Linear Predictive Coding, as a function of time")
-LIST_ITEM (L"• @Cepstrum, @CC, @LFCC, @MFCC (cepstral coefficients)")
-LIST_ITEM (L"• @Excitation: excitation pattern of basilar membrane")
-LIST_ITEM (L"• @Excitations: an ensemble of #Excitation objects")
-LIST_ITEM (L"• @Cochleagram: excitation pattern as a function of time")
-NORMAL (L"Labelling and segmentation (see @@Intro 7. Annotation@):")
-LIST_ITEM (L"• @TextGrid (@TextGridEditor)")
-NORMAL (L"Listening experiments:")
-LIST_ITEM (L"• @ExperimentMFC")
-NORMAL (L"Manipulation of sound:")
-LIST_ITEM (L"• Tutorials:")
-LIST_ITEM1 (L"• @@Intro 8.1. Manipulation of pitch")
-LIST_ITEM1 (L"• @@Intro 8.2. Manipulation of duration")
-LIST_ITEM1 (L"• @@Intro 8.3. Manipulation of intensity")
-LIST_ITEM1 (L"• @@Filtering")
-LIST_ITEM1 (L"• @@Source-filter synthesis")
-LIST_ITEM (L"• @PitchTier (@PitchTierEditor)")
-LIST_ITEM (L"• @Manipulation (@ManipulationEditor): @@overlap-add@")
-LIST_ITEM (L"• @DurationTier")
-LIST_ITEM (L"• @FormantGrid")
-NORMAL (L"Articulatory synthesis (see the @@Articulatory synthesis@ tutorial):")
-LIST_ITEM (L"• @Speaker: speaker characteristics of a woman, a man, or a child")
-LIST_ITEM (L"• #Articulation: snapshot of articulatory specifications (muscle activities)")
-LIST_ITEM (L"• @Artword: articulatory target specifications as functions of time")
-LIST_ITEM (L"• (@VocalTract: area function)")
-NORMAL (L"Neural net package:")
-LIST_ITEM (L"• @FFNet: feed-forward neural net")
-LIST_ITEM (L"• @Pattern")
-LIST_ITEM (L"• @Categories: for classification (#CategoriesEditor)")
-NORMAL (L"Numerical and statistical analysis:")
-LIST_ITEM (L"• @Eigen: eigenvectors and eigenvalues")
-LIST_ITEM (L"• @Polynomial, @Roots, @ChebyshevSeries, @LegendreSeries, @ISpline, @MSpline")
-LIST_ITEM (L"• @Covariance: covariance matrix")
-LIST_ITEM (L"• @Confusion: confusion matrix")
-LIST_ITEM (L"• @@Discriminant analysis@: @Discriminant")
-LIST_ITEM (L"• @@Principal component analysis@: @PCA")
-LIST_ITEM (L"• @Correlation, @ClassificationTable, @SSCP")
-LIST_ITEM (L"• @DTW: dynamic time warping")
-NORMAL (L"@@Multidimensional scaling@:")
-LIST_ITEM (L"• @Configuration (@Salience)")
-LIST_ITEM (L"• @@Kruskal analysis@: @Dissimilarity (@Weight), @Similarity")
-LIST_ITEM (L"• @@INDSCAL analysis@: @Distance, @ScalarProduct")
-LIST_ITEM (L"• @@Correspondence analysis@: @ContingencyTable")
-NORMAL (L"Optimality-theoretic learning (see the @@OT learning@ tutorial)")
-LIST_ITEM (L"• @OTGrammar (@OTGrammarEditor)")
-NORMAL (L"Bureaucracy")
-LIST_ITEM (L"• @WordList, @SpellingChecker")
-MAN_END
-
-MAN_BEGIN (L"Unicode", L"ppgb", 20110129)
-INTRO (L"Praat is becoming a fully international program: "
+NORMAL (U"General purpose:")
+LIST_ITEM (U"• @Matrix: a sampled real-valued function of two variables")
+LIST_ITEM (U"• @Polygon")
+LIST_ITEM (U"• @PointProcess: a point process (@PointEditor)")
+LIST_ITEM (U"• @Sound: a sampled continuous process (@SoundEditor, @SoundRecorder, @@Sound files@)")
+LIST_ITEM (U"• @LongSound: a file-based version of a sound (@LongSoundEditor)")
+LIST_ITEM (U"• @Strings")
+LIST_ITEM (U"• @Distributions, @PairDistribution")
+LIST_ITEM (U"• @Table, @TableOfReal")
+LIST_ITEM (U"• @Permutation")
+LIST_ITEM (U"• @ParamCurve")
+NORMAL (U"Periodicity analysis:")
+LIST_ITEM (U"• Tutorials:")
+LIST_ITEM1 (U"• @@Intro 4. Pitch analysis")
+LIST_ITEM1 (U"• @@Intro 6. Intensity analysis")
+LIST_ITEM1 (U"• @Voice (jitter, shimmer, noise)")
+LIST_ITEM (U"• @Pitch: articulatory fundamental frequency, acoustic periodicity, or perceptual pitch (@PitchEditor)")
+LIST_ITEM (U"• @Harmonicity: degree of periodicity")
+LIST_ITEM (U"• @Intensity, @IntensityTier: intensity contour")
+NORMAL (U"Spectral analysis:")
+LIST_ITEM (U"• Tutorials:")
+LIST_ITEM1 (U"• @@Intro 3. Spectral analysis")
+LIST_ITEM1 (U"• @@Intro 5. Formant analysis")
+LIST_ITEM (U"• @Spectrum: complex-valued equally spaced frequency spectrum (@SpectrumEditor)")
+LIST_ITEM (U"• @Ltas: long-term average spectrum")
+LIST_ITEM (U"• Spectro-temporal: @Spectrogram, @BarkSpectrogram, @MelSpectrogram")
+LIST_ITEM (U"• @Formant: acoustic formant contours")
+LIST_ITEM (U"• @LPC: coefficients of Linear Predictive Coding, as a function of time")
+LIST_ITEM (U"• @Cepstrum, @CC, @LFCC, @MFCC (cepstral coefficients)")
+LIST_ITEM (U"• @Excitation: excitation pattern of basilar membrane")
+LIST_ITEM (U"• @Excitations: an ensemble of #Excitation objects")
+LIST_ITEM (U"• @Cochleagram: excitation pattern as a function of time")
+NORMAL (U"Labelling and segmentation (see @@Intro 7. Annotation@):")
+LIST_ITEM (U"• @TextGrid (@TextGridEditor)")
+NORMAL (U"Listening experiments:")
+LIST_ITEM (U"• @ExperimentMFC")
+NORMAL (U"Manipulation of sound:")
+LIST_ITEM (U"• Tutorials:")
+LIST_ITEM1 (U"• @@Intro 8.1. Manipulation of pitch")
+LIST_ITEM1 (U"• @@Intro 8.2. Manipulation of duration")
+LIST_ITEM1 (U"• @@Intro 8.3. Manipulation of intensity")
+LIST_ITEM1 (U"• @@Filtering")
+LIST_ITEM1 (U"• @@Source-filter synthesis")
+LIST_ITEM (U"• @PitchTier (@PitchTierEditor)")
+LIST_ITEM (U"• @Manipulation (@ManipulationEditor): @@overlap-add@")
+LIST_ITEM (U"• @DurationTier")
+LIST_ITEM (U"• @FormantGrid")
+NORMAL (U"Articulatory synthesis (see the @@Articulatory synthesis@ tutorial):")
+LIST_ITEM (U"• @Speaker: speaker characteristics of a woman, a man, or a child")
+LIST_ITEM (U"• #Articulation: snapshot of articulatory specifications (muscle activities)")
+LIST_ITEM (U"• @Artword: articulatory target specifications as functions of time")
+LIST_ITEM (U"• (@VocalTract: area function)")
+NORMAL (U"Neural net package:")
+LIST_ITEM (U"• @FFNet: feed-forward neural net")
+LIST_ITEM (U"• @Pattern")
+LIST_ITEM (U"• @Categories: for classification (#CategoriesEditor)")
+NORMAL (U"Numerical and statistical analysis:")
+LIST_ITEM (U"• @Eigen: eigenvectors and eigenvalues")
+LIST_ITEM (U"• @Polynomial, @Roots, @ChebyshevSeries, @LegendreSeries, @ISpline, @MSpline")
+LIST_ITEM (U"• @Covariance: covariance matrix")
+LIST_ITEM (U"• @Confusion: confusion matrix")
+LIST_ITEM (U"• @@Discriminant analysis@: @Discriminant")
+LIST_ITEM (U"• @@Principal component analysis@: @PCA")
+LIST_ITEM (U"• @Correlation, @ClassificationTable, @SSCP")
+LIST_ITEM (U"• @DTW: dynamic time warping")
+NORMAL (U"@@Multidimensional scaling@:")
+LIST_ITEM (U"• @Configuration (@Salience)")
+LIST_ITEM (U"• @@Kruskal analysis@: @Dissimilarity (@Weight), @Similarity")
+LIST_ITEM (U"• @@INDSCAL analysis@: @Distance, @ScalarProduct")
+LIST_ITEM (U"• @@Correspondence analysis@: @ContingencyTable")
+NORMAL (U"Optimality-theoretic learning (see the @@OT learning@ tutorial)")
+LIST_ITEM (U"• @OTGrammar (@OTGrammarEditor)")
+NORMAL (U"Bureaucracy")
+LIST_ITEM (U"• @WordList, @SpellingChecker")
+MAN_END
+
+MAN_BEGIN (U"Unicode", U"ppgb", 20110129)
+INTRO (U"Praat is becoming a fully international program: "
 	"the texts in Praat's TextGrids, Tables, scripts, or Info window (and elsewhere) can contain many types of characters "
 	"(see @@special symbols@). "
 	"For this reason, Praat saves its text files in one of two possible formats: ASCII or UTF-16.")
-ENTRY (L"ASCII text files")
-NORMAL (L"If your TextGrid (or Table, or script, or Info window...) contains only characters that can be encoded as ASCII, "
+ENTRY (U"ASCII text files")
+NORMAL (U"If your TextGrid (or Table, or script, or Info window...) contains only characters that can be encoded as ASCII, "
 	"namely the characters !\\\" \\# \\$ \\% &\\' ()*+,-./0123456789:;<=>?\\@  "
 	"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\bs]\\^ \\_ ` abcdefghijklmnopqrstuvwxyz{|}~, "
 	"then when you say @@Save as text file...@ or #Save, Praat will write an ASCII text file, "
 	"which is a text file in which every character is encoded in a single byte (8 bits). "
 	"All programs that can read plain text files can read such files produced by Praat.")
-ENTRY (L"UTF-16 text files")
-NORMAL (L"If your TextGrid (or Table, or script, or Info window...) contains one or more characters that cannot be encoded as ASCII, "
+ENTRY (U"UTF-16 text files")
+NORMAL (U"If your TextGrid (or Table, or script, or Info window...) contains one or more characters that cannot be encoded as ASCII, "
 	"for instance West-European characters such as \\ao\\c,\\e'\\o\"\\ss\\?d, East-European characters such as \\c<\\l/\\o:\\s<\\uo\\z', "
 	"or Hebrew characters such as \\?+\\B+\\G+\\M%\\vO\\sU, "
 	"then when you say @@Save as text file...@ or #Save, Praat will write an UTF-16 text file, "
 	"which is a text file in which every character is encoded in two bytes (and some very rare characters in four bytes). "
 	"Many programs can read such text files, for instance NotePad, WordPad, Microsoft Word, and TextWrangler.")
-ENTRY (L"What if my other programs cannot read UTF-16 text files?")
-NORMAL (L"If you want to export your Table to Microsoft Excel or to SPSS, or if you want your TextGrid file to be read "
+ENTRY (U"What if my other programs cannot read UTF-16 text files?")
+NORMAL (U"If you want to export your Table to Microsoft Excel or to SPSS, or if you want your TextGrid file to be read "
 	"by somebody else's Perl script, then there will be no problem if your Table contains only ASCII characters (see above). "
 	"But if your Table contains any other (i.e. non-ASCII) characters, you may be in trouble, because Praat will write the Table "
 	"as an UTF-16 text file, and not all of the programs just mentioned can read such files yet.")
-NORMAL (L"What you can do is go to ##Text writing preferences...# in the #Preferences submenu of the #Praat menu, "
+NORMAL (U"What you can do is go to ##Text writing preferences...# in the #Preferences submenu of the #Praat menu, "
 	"and there set the output encoding to ##UTF-8#. Praat will from then on save your text files in the UTF-8 format, "
 	"which means one byte for every ASCII character and 2 to 4 bytes for every non-ASCII character. "
 	"Especially on Linux, many programs understand UTF-8 text and will display the correct characters. "
 	"Programs such as SPSS do not understand UTF-8 but will still display ASCII characters correctly; "
 	"for instance, the names München and Wałęsa may appear as M\\A~\\:-nchen and Wa\\Ao,\\A\"\\TMsa or so.")
-NORMAL (L"If you can get by with West-European characters (on Windows), "
+NORMAL (U"If you can get by with West-European characters (on Windows), "
 	"then you may choose ##try ISO Latin-1, then UTF-16# for the output encoding. "
 	"It is possible (but not guaranteed) that programs like SPSS then display your West-European text correctly. "
 	"This trick is of limited use, because it will not work if your operating system is set to a \"codepage\" "
 	"differently from ISO Latin-1 (or \"ANSI\"), or if you need East-European or Hebrew characters, or if you want "
 	"to share your text files with Macintosh users.")
-NORMAL (L"If you already have some UTF-16 text files and you want to convert them to UTF-8 or ISO Latin-1 (the latter only if "
+NORMAL (U"If you already have some UTF-16 text files and you want to convert them to UTF-8 or ISO Latin-1 (the latter only if "
 	"they do not contain non-West-European characters), then you can read them into Praat and save them again "
 	"(with the appropriate output encoding setting). "
 	"Other programs, such a NotePad and TextWrangler, can also do this conversion.")
-NORMAL (L"Finally, it is still possible to make sure that all texts are ASCII, e.g. you type the characters ß and ő "
+NORMAL (U"Finally, it is still possible to make sure that all texts are ASCII, e.g. you type the characters ß and ő "
 	"as \\bsss and \\bso: respectively. See @@special symbols at .")
 MAN_END
 
-MAN_BEGIN (L"View", L"ppgb", 20010512)
-INTRO (L"One of the menus in several @editors and in the @manual.")
+MAN_BEGIN (U"View", U"ppgb", 20010512)
+INTRO (U"One of the menus in several @editors and in the @manual.")
 MAN_END
 
-MAN_BEGIN (L"Write to console", L"ppgb", 20110129)
-INTRO (L"One of the commands in the @@Save menu at .")
-NORMAL (L"You can choose this command after selecting one object. "
+MAN_BEGIN (U"Write to console", U"ppgb", 20110129)
+INTRO (U"One of the commands in the @@Save menu at .")
+NORMAL (U"You can choose this command after selecting one object. "
 	"The data that it contains, is written to the Console window "
 	"(the terminal window, if you started up Praat from a terminal window), "
 	"in the same format as with the @@Save as text file...@ command, "
 	"except for the first line, which reads something like:")
-CODE (L"Write to console: class Sound,  name \"hallo\"")
+CODE (U"Write to console: class Sound,  name \"hallo\"")
 MAN_END
 
 }
diff --git a/fon/manual_voice.cpp b/fon/manual_voice.cpp
index 4c4be5c..9d35a16 100644
--- a/fon/manual_voice.cpp
+++ b/fon/manual_voice.cpp
@@ -1,6 +1,6 @@
 /* manual_voice.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,137 +22,137 @@
 void manual_voice_init (ManPages me);
 void manual_voice_init (ManPages me) {
 
-MAN_BEGIN (L"Voice", L"ppgb", 20061028)
-INTRO (L"This tutorial describes how you can do voice analysis with Praat. "
+MAN_BEGIN (U"Voice", U"ppgb", 20061028)
+INTRO (U"This tutorial describes how you can do voice analysis with Praat. "
 	"To understand this tutorial, you have to be familiar with the @Intro, "
 	"which describes the more general features of the @SoundEditor window.")
-NORMAL (L"Most of Praat's voice analysis methods start from the glottal pulses that are visible in the @SoundEditor window "
+NORMAL (U"Most of Praat's voice analysis methods start from the glottal pulses that are visible in the @SoundEditor window "
 	"as blue vertical lines through the waveform. If you do not see these lines, "
 	"choose @@Show pulses@ from the #Pulses menu. If your sound is long, you may have to zoom in "
 	"in order to see the separate pulses. You may notice that for some sounds, the time location of the pulses "
 	"can vary when you zoom or scroll. This is because only the visible part of the sound is used for the analysis. "
 	"The measurement results will also vary slightly when you zoom or scroll.")
-NORMAL (L"The Pulse menu contains the command @@Voice report@, which will show in the Info window "
+NORMAL (U"The Pulse menu contains the command @@Voice report@, which will show in the Info window "
 	"the results of many voice measurements for the visible part of the selection "
 	"(or for the visible part of the whole sound, if there is a cursor instead of a selection or if the selection is not visible).")
-ENTRY (L"Pitch settings")
-NORMAL (L"The results of the voice measurements will depend on your @@Pitch settings...|Pitch settings at . "
+ENTRY (U"Pitch settings")
+NORMAL (U"The results of the voice measurements will depend on your @@Pitch settings...|Pitch settings at . "
 	"In general, you will want to be careful about the pitch range. The standard range is 75\\--600 Hertz, "
 	"but take a range of e.g. 50\\--200 Hertz for pathological male voices if that is the typical range. "
 	"You may also want to choose ##Optimize for voice analysis#; otherwise, the voice report will complain about possible inaccuracies. "
 	"The `advanced' pitch settings like ##Silence threshold# and ##Octave jump cost# can stay at their standard values.")
-LIST_ITEM (L"@@Voice 1. Voice breaks@")
-LIST_ITEM (L"@@Voice 2. Jitter@")
-LIST_ITEM (L"@@Voice 3. Shimmer@")
-LIST_ITEM (L"@@Voice 4. Additive noise@ (HNR, harmonicity)")
-LIST_ITEM (L"@@Voice 5. Comparison with other programs@")
-LIST_ITEM (L"@@Voice 6. Automating voice analysis with a script@")
+LIST_ITEM (U"@@Voice 1. Voice breaks@")
+LIST_ITEM (U"@@Voice 2. Jitter@")
+LIST_ITEM (U"@@Voice 3. Shimmer@")
+LIST_ITEM (U"@@Voice 4. Additive noise@ (HNR, harmonicity)")
+LIST_ITEM (U"@@Voice 5. Comparison with other programs@")
+LIST_ITEM (U"@@Voice 6. Automating voice analysis with a script@")
 MAN_END
 
-MAN_BEGIN (L"Voice 1. Voice breaks", L"ppgb", 20030916)
-INTRO (L"Normal voices can easily maintain phonation for some time when saying [a]. "
+MAN_BEGIN (U"Voice 1. Voice breaks", U"ppgb", 20030916)
+INTRO (U"Normal voices can easily maintain phonation for some time when saying [a]. "
 	"Some pathological voices have trouble with it. This can be measured in Praat "
 	"in two ways.")
-ENTRY (L"Fraction of locally unvoiced pitch frames")
-NORMAL (L"This is the fraction of pitch frames that are analysed as unvoiced (MDVP calls it DUV). If the pitch floor is 75 Hz, "
+ENTRY (U"Fraction of locally unvoiced pitch frames")
+NORMAL (U"This is the fraction of pitch frames that are analysed as unvoiced (MDVP calls it DUV). If the pitch floor is 75 Hz, "
 	"your Sound editor window will contain pitch measurements that are 0.01 seconds apart, so that if you select one second, "
 	"there will be 100 pitch frames. If 86 of these are locally voiced, the Fraction will be 14 percent.")
-NORMAL (L"The usual pitch analysis contains a %%path finder% that searches for a smooth path through the local "
+NORMAL (U"The usual pitch analysis contains a %%path finder% that searches for a smooth path through the local "
 	"pitch candidates. This path finder is temporarily switched off to determine the fraction of locally unvoiced frames. "
 	"A frame is regarded as %locally unvoiced if it has a voicing strength below the %%voicing threshold% (whose standard value is 0.45), "
 	"or a local peak below the %%silence threshold% (whose standard value is 0.03).")
-NORMAL (L"In the voice report, the fraction of unvoiced frames will be reported as follows:")
-CODE (L"Fraction of locally unvoiced frames: 14.000\\%  (14/100)")
-NORMAL (L"The numbers between parentheses are the number of unvoiced frames and the total number of frames, "
+NORMAL (U"In the voice report, the fraction of unvoiced frames will be reported as follows:")
+CODE (U"Fraction of locally unvoiced frames: 14.000\\%  (14/100)")
+NORMAL (U"The numbers between parentheses are the number of unvoiced frames and the total number of frames, "
 	"respectively (in MDVP, these are called NUV and SEG, respectively).")
-NORMAL (L"The normative value for the fraction of unvoiced frames is 0, i.e., normal healthy voices should "
+NORMAL (U"The normative value for the fraction of unvoiced frames is 0, i.e., normal healthy voices should "
 	"have no trouble maintaining voicing during a sustained vowel. Every non-zero value can be considered "
 	"a sign of pathology (like a common cold). "
 	"Naturally, you will not select the leading and trailing silences when measuring this parameter.")
-ENTRY (L"Number of voice breaks")
-NORMAL (L"The number of distances between consecutive pulses that are longer than 1.25 divided by the pitch floor. "
+ENTRY (U"Number of voice breaks")
+NORMAL (U"The number of distances between consecutive pulses that are longer than 1.25 divided by the pitch floor. "
 	"Thus, if the pitch floor is 75 Hz, all inter-pulse intervals longer than 16.6667 milliseconds are regarded as voice breaks.")
-ENTRY (L"Degree of voice breaks")
-NORMAL (L"This is the total duration of the breaks between the voiced parts of the signal, "
+ENTRY (U"Degree of voice breaks")
+NORMAL (U"This is the total duration of the breaks between the voiced parts of the signal, "
 	"divided by the total duration of the analysed part of the signal (MDVP calls it DVB). Since silences at the beginning "
 	"and the end of the signal are not considered breaks, you will probably not want to select these silences "
 	"when measuring this parameter.")
-NORMAL (L"In the voice report, the degree of voice breaks will be reported like this:")
-CODE (L"Degree of voice breaks: 29.529\\%  (1.163061 s / 3.938685 s)")
-NORMAL (L"The numbers between parentheses are the total duration of the voice breaks and the duration of the analysed part of the signal, "
+NORMAL (U"In the voice report, the degree of voice breaks will be reported like this:")
+CODE (U"Degree of voice breaks: 29.529\\%  (1.163061 s / 3.938685 s)")
+NORMAL (U"The numbers between parentheses are the total duration of the voice breaks and the duration of the analysed part of the signal, "
 	"respectively.")
 MAN_END
 
-MAN_BEGIN (L"Voice 2. Jitter", L"ppgb", 20110302)
-NORMAL (L"You can measure jitter in the Sound editor window, after choosing @@Show pulses@ from the #Pulses menu. "
+MAN_BEGIN (U"Voice 2. Jitter", U"ppgb", 20110302)
+NORMAL (U"You can measure jitter in the Sound editor window, after choosing @@Show pulses@ from the #Pulses menu. "
 	"You will see blue lines that can be thought of as representing the glottal closures. "
 	"Use @@Voice report@ from the #Pulses menu to get the jitter in the selected part. "
 	"You typically perform jitter measurements only on long sustained vowels.")
-NORMAL (L"The voice report gives five kinds of jitter measurements. "
+NORMAL (U"The voice report gives five kinds of jitter measurements. "
 	"All of these measurements are based on the computation of all %periods by the waveform-matching procedure "
 	"(see @@Voice 6. Automating voice analysis with a script@), "
 	"where the ##Period floor# setting is 0.8 divided by the pitch ceiling, "
 	"the ##Period ceiling# setting is 1.25 divided by the pitch floor, "
 	"and the ##Maximum period factor# is determined in @@Advanced pulses settings... at .")
-ENTRY (L"Jitter (local)")
-NORMAL (L"This is the average absolute difference between consecutive periods, divided by the average period. "
+ENTRY (U"Jitter (local)")
+NORMAL (U"This is the average absolute difference between consecutive periods, divided by the average period. "
 	"For the precise procedure, see @@PointProcess: Get jitter (local)... at .")
-NORMAL (L"MDVP calls this parameter %Jitt, and gives 1.040\\%  as a threshold for pathology. "
+NORMAL (U"MDVP calls this parameter %Jitt, and gives 1.040\\%  as a threshold for pathology. "
 	"As this number was based on jitter measurements influenced by noise (see @@Voice 5. Comparison with other programs@), the correct threshold is probably lower.")
-ENTRY (L"Jitter (local, absolute)")
-NORMAL (L"This is the average absolute difference between consecutive periods, in seconds. "
+ENTRY (U"Jitter (local, absolute)")
+NORMAL (U"This is the average absolute difference between consecutive periods, in seconds. "
 	"For the precise procedure, see @@PointProcess: Get jitter (local, absolute)... at .")
-NORMAL (L"MDVP calls this parameter %Jita, and gives 83.200 \\mus as a threshold for pathology. "
+NORMAL (U"MDVP calls this parameter %Jita, and gives 83.200 \\mus as a threshold for pathology. "
 	"As this number was based on jitter measurements influenced by noise (see @@Voice 5. Comparison with other programs@), the correct threshold is probably lower.")
-ENTRY (L"Jitter (rap)")
-NORMAL (L"This is the Relative Average Perturbation, "
+ENTRY (U"Jitter (rap)")
+NORMAL (U"This is the Relative Average Perturbation, "
 	"the average absolute difference between a period and the average of it and its two neighbours, divided by the average period. "
 	"For the precise procedure, see @@PointProcess: Get jitter (rap)... at .")
-NORMAL (L"MDVP gives 0.680\\%  as a threshold for pathology. "
+NORMAL (U"MDVP gives 0.680\\%  as a threshold for pathology. "
 	"As this number was based on jitter measurements influenced by noise (see @@Voice 5. Comparison with other programs@), the correct threshold is probably lower.")
-ENTRY (L"Jitter (ppq5)")
-NORMAL (L"This is the five-point Period Perturbation Quotient, "
+ENTRY (U"Jitter (ppq5)")
+NORMAL (U"This is the five-point Period Perturbation Quotient, "
 	"the average absolute difference between a period and the average of it and its four closest neighbours, divided by the average period. "
 	"For the precise procedure, see @@PointProcess: Get jitter (ppq5)... at .")
-NORMAL (L"MDVP calls this parameter %PPQ, and gives 0.840\\%  as a threshold for pathology; "
+NORMAL (U"MDVP calls this parameter %PPQ, and gives 0.840\\%  as a threshold for pathology; "
 	"as this number was based on jitter measurements influenced by noise (see @@Voice 5. Comparison with other programs@), the correct threshold is probably lower.")
-ENTRY (L"Jitter (ddp)")
-NORMAL (L"This is the average absolute difference between consecutive differences between consecutive periods, divided by the average period. "
+ENTRY (U"Jitter (ddp)")
+NORMAL (U"This is the average absolute difference between consecutive differences between consecutive periods, divided by the average period. "
 	"For the precise procedure, see @@PointProcess: Get jitter (ddp)... at .")
-NORMAL (L"This is Praat's original ##Get jitter#. The value is three times RAP.")
+NORMAL (U"This is Praat's original ##Get jitter#. The value is three times RAP.")
 MAN_END
 
-MAN_BEGIN (L"Voice 3. Shimmer", L"ppgb", 20030521)
-NORMAL (L"You can measure shimmer in the Sound editor window, after choosing @@Show pulses@ from the #Pulses menu. "
+MAN_BEGIN (U"Voice 3. Shimmer", U"ppgb", 20030521)
+NORMAL (U"You can measure shimmer in the Sound editor window, after choosing @@Show pulses@ from the #Pulses menu. "
 	"You will see blue lines that can be thought of as representing the glottal closures. "
 	"Use the Pulse menu to get the shimmer in the selected part. You typically perform shimmer measurements only on "
 	"long sustained vowels. The voice report gives six kinds of shimmer measurements.")
-ENTRY (L"Shimmer (local)")
-NORMAL (L"This is the average absolute difference between the amplitudes of consecutive periods, divided by the average amplitude. "
+ENTRY (U"Shimmer (local)")
+NORMAL (U"This is the average absolute difference between the amplitudes of consecutive periods, divided by the average amplitude. "
 	"MDVP calls this parameter %Shim, and gives 3.810\\%  as a threshold for pathology.")
-ENTRY (L"Shimmer (local, dB)")
-NORMAL (L"This is the average absolute base-10 logarithm of the difference between the amplitudes of consecutive periods, multiplied by 20. "
+ENTRY (U"Shimmer (local, dB)")
+NORMAL (U"This is the average absolute base-10 logarithm of the difference between the amplitudes of consecutive periods, multiplied by 20. "
 	"MDVP calls this parameter %ShdB, and gives 0.350 dB as a threshold for pathology.")
-ENTRY (L"Shimmer (apq3)")
-NORMAL (L"This is the three-point Amplitude Perturbation Quotient, "
+ENTRY (U"Shimmer (apq3)")
+NORMAL (U"This is the three-point Amplitude Perturbation Quotient, "
 	"the average absolute difference between the amplitude of a period and the average of the amplitudes of its neighbours, "
 	"divided by the average amplitude.")
-ENTRY (L"Shimmer (apq5)")
-NORMAL (L"This is the five-point Amplitude Perturbation Quotient, "
+ENTRY (U"Shimmer (apq5)")
+NORMAL (U"This is the five-point Amplitude Perturbation Quotient, "
 	"the average absolute difference between the amplitude of a period and the average of the amplitudes of it and its four closest neighbours, "
 	"divided by the average amplitude.")
-ENTRY (L"Shimmer (apq11)")
-NORMAL (L"This is the 11-point Amplitude Perturbation Quotient, "
+ENTRY (U"Shimmer (apq11)")
+NORMAL (U"This is the 11-point Amplitude Perturbation Quotient, "
 	"the average absolute difference between the amplitude of a period and the average of the amplitudes of it and its ten closest neighbours, "
 	"divided by the average amplitude. "
 	"MDVP calls this parameter %APQ, and gives 3.070\\%  as a threshold for pathology.")
-ENTRY (L"Shimmer (ddp)")
-NORMAL (L"This is the average absolute difference between consecutive differences between the amplitudes of consecutive periods. "
+ENTRY (U"Shimmer (ddp)")
+NORMAL (U"This is the average absolute difference between consecutive differences between the amplitudes of consecutive periods. "
 	"This is Praat's original ##Get shimmer#. The value is three times APQ3.")
 MAN_END
 
-MAN_BEGIN (L"Voice 4. Additive noise", L"ppgb", 20021206)
-NORMAL (L"For a signal that can be assumed periodic (i.e., a sustained vowel), "
+MAN_BEGIN (U"Voice 4. Additive noise", U"ppgb", 20021206)
+NORMAL (U"For a signal that can be assumed periodic (i.e., a sustained vowel), "
 	"the signal-to-noise ratio equals the harmonics-to-noise ratio, which you get can get "
 	"by selecting a Sound and choosing one of the \"To Harmonicity...\" commands from the Periodicity menu "
 	"(for the algorithm, see @@Sound: To Harmonicity (ac)...@ or @@Sound: To Harmonicity (cc)...@). "
@@ -160,11 +160,11 @@ NORMAL (L"For a signal that can be assumed periodic (i.e., a sustained vowel), "
 	"For more information, see the @Harmonicity manual page.")
 MAN_END
 
-MAN_BEGIN (L"Voice 5. Comparison with other programs", L"ppgb", 20100330)
-INTRO (L"Voicing, jitter, and shimmer measurements made by Praat cannot always be compared directly with those made by other "
+MAN_BEGIN (U"Voice 5. Comparison with other programs", U"ppgb", 20100330)
+INTRO (U"Voicing, jitter, and shimmer measurements made by Praat cannot always be compared directly with those made by other "
 	"programs such as MDVP. The causes are the voicing decision strategy and the accuracy of period and peak determination.")
-ENTRY (L"5.1. Voicing decisions: slightly different")
-NORMAL (L"Different programs use very different methods for deciding whether an irregular part of the signal is voiced or not. "
+ENTRY (U"5.1. Voicing decisions: slightly different")
+NORMAL (U"Different programs use very different methods for deciding whether an irregular part of the signal is voiced or not. "
 	"A comparison of @@Boersma (1993)@ for Praat and @@Deliyski (1993)@ for MDVP leads to the "
 	"following considerations. Both Praat and MDVP use an autocorrelation method for "
 	"pitch analysis, but MDVP quantizes the amplitudes into the values -1, 0, and +1 before computing "
@@ -181,20 +181,20 @@ NORMAL (L"Different programs use very different methods for deciding whether an
 	"may partly be explained by the fact that MDVP does not correct the autocorrelation function and that MDVP "
 	"does not do an accurate sinc interpolation: both of these properties cause "
 	"the measured height of the peak at 1/F0 (in MDVP) to be lower than the real height, as explained by @@Boersma (1993)@.")
-ENTRY (L"5.2. Jitter measurements: sometimes very different")
-NORMAL (L"The jitter measures in various programs may yield different results, with Praat often giving much lower values than MDVP, "
+ENTRY (U"5.2. Jitter measurements: sometimes very different")
+NORMAL (U"The jitter measures in various programs may yield different results, with Praat often giving much lower values than MDVP, "
 	"especially for noisy sounds. I will now explain where the difference comes from. "
 	"A more elaborate explanation with pictures is given in @@Boersma (2009a)@.")
-NORMAL (L"If a sound is computer-generated as a glottal source signal with a random period duration variation of 1 percent (around a constant F0), "
+NORMAL (U"If a sound is computer-generated as a glottal source signal with a random period duration variation of 1 percent (around a constant F0), "
 	"then filtered with the characteristics of a vocal tract configuration corresponding to a sustained vowel, "
 	"both Praat and MDVP will measure this sound as having a \"jitter\" of 1 percent. "
 	"For non-noisy jittery sginals, therefore, the two programs give equally accurate results.")
-NORMAL (L"If a sound is computer-generated as a glottal source signal with a constant period, "
+NORMAL (U"If a sound is computer-generated as a glottal source signal with a constant period, "
 	"then filtered with the characteristics of a vocal tract configuration corresponding to a sustained vowel, "
 	"both Praat and MDVP will measure this sound as having a \"jitter\" of less than 0.01 percent. "
 	"The two programs, therefore, have a comparable sensitivity in measuring small jitter values.")
-NORMAL (L"So far, the two programs give comparable results. The difference between the two programs comes when noise is added.")
-NORMAL (L"If a sound is computer-generated as a glottal source signal with a constant period, "
+NORMAL (U"So far, the two programs give comparable results. The difference between the two programs comes when noise is added.")
+NORMAL (U"If a sound is computer-generated as a glottal source signal with a constant period, "
 	"then filtered with the characteristics of a vocal tract configuration corresponding to a sustained vowel, "
 	"and if then 1 percent additive \"white\" noise (a quite usual amount) is added, "
 	"Praat will measure this sound as having a \"jitter\" of 0.02 percent, "
@@ -203,11 +203,11 @@ NORMAL (L"If a sound is computer-generated as a glottal source signal with a con
 	"whereas MDVP will tell you that the jitter is of an almost pathological level. "
 	"The relevant curves can be seen in my papers \"Stemmen meten met Praat\" and @@Boersma (2009a)@, "
 	"and the numbers are confirmed by Deliyski, Shaw & Evans (%%Journal of Voice%, 2005: 23).")
-NORMAL (L"One can see that Praat's \"jitter\" measure attempts to separate the influence of period duration variation "
+NORMAL (U"One can see that Praat's \"jitter\" measure attempts to separate the influence of period duration variation "
 	"(which it reports as \"jitter\") from the influence of additive noise (which is does not report as \"jitter\"), "
 	"and that MDVP's \"jitter\" measure combines the influence of period duration variation with the influence of additive noise "
 	"(both of which it reports as \"jitter\").")
-NORMAL (L"The difference between Praat's and MDVP's jitter measures is due to a difference between the way in which periods are measured. "
+NORMAL (U"The difference between Praat's and MDVP's jitter measures is due to a difference between the way in which periods are measured. "
 	"Praat uses %%waveform-matching%, in which the duration of a period is determined by looking for best matching wave shapes "
 	"(a \"cross-correlation\" maximum). MDVP uses %%peak-picking% instead, where the duration of a period is determined by "
 	"measuring the time difference between two locally highest peaks in the wave form. The waveform-matching method "
@@ -215,48 +215,48 @@ NORMAL (L"The difference between Praat's and MDVP's jitter measures is due to a
 	"For detailed illustrations, see @@Boersma (2009a)@.")
 MAN_END
 
-MAN_BEGIN (L"Voice 6. Automating voice analysis with a script", L"ppgb", 20140421)
-INTRO (L"In a Praat script you usually do not want to raise a Sound window. "
+MAN_BEGIN (U"Voice 6. Automating voice analysis with a script", U"ppgb", 20140421)
+INTRO (U"In a Praat script you usually do not want to raise a Sound window. "
 	"Instead, you probably want to work with objects in the Objects window only. "
 	"This page tells you how to do that for voice analysis.")
-ENTRY (L"1. Creating the pulses in the Objects window")
-NORMAL (L"The pulses you see as blue lines are a @PointProcess object. You can see this if "
+ENTRY (U"1. Creating the pulses in the Objects window")
+NORMAL (U"The pulses you see as blue lines are a @PointProcess object. You can see this if "
 	"you choose ##Extract visible pulses# from the #Pulses menu in the Sound window: "
 	"a PointProcess object will appear in the list.")
-NORMAL (L"You can also create a PointProcess in the Objects window directly. To do this, "
+NORMAL (U"You can also create a PointProcess in the Objects window directly. To do this, "
 	"select a Sound and choose @@Sound: To PointProcess (periodic, cc)...@ from the #Periodicity menu.")
-NORMAL (L"You can also do this in two steps. First you create a Pitch with "
+NORMAL (U"You can also do this in two steps. First you create a Pitch with "
 	"@@Sound: To Pitch...@ or @@Sound: To Pitch (ac)...@ or @@Sound: To Pitch (cc)... at . "
 	"Then you select the resulting Pitch %together with the original Sound "
 	"and choose @@Sound & Pitch: To PointProcess (cc)@.")
-NORMAL (L"Since the direct method of @@Sound: To PointProcess (periodic, cc)...@ actually uses the AC method "
+NORMAL (U"Since the direct method of @@Sound: To PointProcess (periodic, cc)...@ actually uses the AC method "
 	"for computing the Pitch (which is optimal for intonation analysis), "
 	"you may prefer the two-step version if your goal is to do voice analysis. "
 	"In that case, you use @@Sound: To Pitch (cc)...@ as the first step, "
 	"and @@Sound & Pitch: To PointProcess (cc)@ as the second step. "
 	"This is also how the Sound window does it: if you choose ##Optimize for voice analysis# in the @@Pitch settings...|Pitch settings@, "
 	"Praat uses @@Sound: To Pitch (cc)...@ for pitch analysis.")
-NORMAL (L"What you should %not do if you want to perform voice analysis is to create the PointProcess "
+NORMAL (U"What you should %not do if you want to perform voice analysis is to create the PointProcess "
 	"by selecting a Pitch only and then choosing @@Pitch: To PointProcess at . In that way, "
 	"the resulting pulses would not be aligned to the periods in the Sound.")
-ENTRY (L"2. Measuring jitter from a script")
-NORMAL (L"Once you have a PointProcess that represents the periods in the Sound, "
+ENTRY (U"2. Measuring jitter from a script")
+NORMAL (U"Once you have a PointProcess that represents the periods in the Sound, "
 	"you can select it and choose some ##Get jitter# commands from the #Query menu.")
-ENTRY (L"3. Measuring shimmer from a script")
-NORMAL (L"Once you have a PointProcess that represents the periods in the Sound, "
+ENTRY (U"3. Measuring shimmer from a script")
+NORMAL (U"Once you have a PointProcess that represents the periods in the Sound, "
 	"you can select it together with the Sound, then choose some ##Get shimmer# commands from the #Query menu.")
-ENTRY (L"4. Getting the whole voice report from a script")
-NORMAL (L"If you select the Sound, the Pitch, and the PointProcess together (all three), "
+ENTRY (U"4. Getting the whole voice report from a script")
+NORMAL (U"If you select the Sound, the Pitch, and the PointProcess together (all three), "
 	"there will be a button that says ##Voice report...#. If you press it, the voice report "
 	"will be written to the Info window. This is identical to the voice report in the Sound window, "
 	"although you will have to specify the time range by manually typing it.")
-NORMAL (L"In a script, you can get the jitter and shimmer from the voice report by doing something like:")
-CODE (L"voiceReport\\$  = Voice report: 0, 0, 75, 500, 1.3, 1.6, 0.03, 0.45")
-CODE (L"jitter = extractNumber (voiceReport\\$ , \"Jitter (local): \")")
-CODE (L"shimmer = extractNumber (voiceReport\\$ , \"Shimmer (local): \")")
-CODE (L"writeInfoLine: \"Jitter = \", percent\\$  (jitter, 3), \", shimmer = \", percent\\$  (shimmer, 3)")
-ENTRY (L"5. Disadvantage of automating voice analysis")
-NORMAL (L"In all the commands mentioned above, you have to guess the time range, "
+NORMAL (U"In a script, you can get the jitter and shimmer from the voice report by doing something like:")
+CODE (U"voiceReport\\$  = Voice report: 0, 0, 75, 500, 1.3, 1.6, 0.03, 0.45")
+CODE (U"jitter = extractNumber (voiceReport\\$ , \"Jitter (local): \")")
+CODE (U"shimmer = extractNumber (voiceReport\\$ , \"Shimmer (local): \")")
+CODE (U"writeInfoLine: \"Jitter = \", percent\\$  (jitter, 3), \", shimmer = \", percent\\$  (shimmer, 3)")
+ENTRY (U"5. Disadvantage of automating voice analysis")
+NORMAL (U"In all the commands mentioned above, you have to guess the time range, "
 	"and you would usually supply \"0.0\" and \"0.0\", in which case "
 	"you will get the average jitter and shimmer for the whole sound. "
 	"This may include parts of the sound that you are often not interested in, such as false starts. "
@@ -264,8 +264,8 @@ NORMAL (L"In all the commands mentioned above, you have to guess the time range,
 	"because there you would make an explicit time selection by hand after judging what part of the sound is relevant.")
 MAN_END
 
-MAN_BEGIN (L"Voice report", L"ppgb", 20030316)
-INTRO (L"A command in the #Pulses menu that will write to the Info window an extensive report "
+MAN_BEGIN (U"Voice report", U"ppgb", 20030316)
+INTRO (U"A command in the #Pulses menu that will write to the Info window an extensive report "
 	"about many voice parameters. See the @Voice tutorial.")
 MAN_END
 }
diff --git a/fon/praat_Exp.cpp b/fon/praat_Exp.cpp
index a7b5b73..bc2a4cd 100644
--- a/fon/praat_Exp.cpp
+++ b/fon/praat_Exp.cpp
@@ -1,6 +1,6 @@
 /* praat_Exp.cpp
  *
- * Copyright (C) 2001-2012 Paul Boersma
+ * Copyright (C) 2001-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,24 +24,24 @@
 
 /***** CATEGORIES *****/
 
-DIRECT (Categories_getEntropy)
+DIRECT2 (Categories_getEntropy) {
 	iam_ONLY (Categories);
 	double entropy = Categories_getEntropy (me);
-	Melder_informationReal (entropy, L"bits");
-END
+	Melder_informationReal (entropy, U"bits");
+END2 }
 
-DIRECT (Categories_sort)
+DIRECT2 (Categories_sort) {
 	WHERE (SELECTED) {
 		iam_LOOP (Categories);
 		Categories_sort (me);
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
 /***** EXPERIMENT_MFC *****/
 
-DIRECT (ExperimentMFC_run)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot run experiments from the command line.");
+DIRECT2 (ExperimentMFC_run) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot run experiments from the command line.");
 	autoOrdered experiments = Ordered_create ();
 	Collection_dontOwnItems (experiments.peek());
 	WHERE (SELECTED) {
@@ -49,78 +49,78 @@ DIRECT (ExperimentMFC_run)
 		Melder_assert (my classInfo == classExperimentMFC);
 		Collection_addItem (experiments.peek(), me);   // reference copy of me
 	}
-	Melder_assert (experiments-> size >= 1);
-	Melder_assert (((Data) experiments -> item [1]) -> classInfo == classExperimentMFC);
-	Melder_assert (((Data) experiments -> item [experiments -> size]) -> classInfo == classExperimentMFC);
+	Melder_assert (experiments -> size >= 1);
+	Melder_assert (((Daata) experiments -> item [1]) -> classInfo == classExperimentMFC);
+	Melder_assert (((Daata) experiments -> item [experiments -> size]) -> classInfo == classExperimentMFC);
 	autoOrdered experimentsCopy = experiments.clone();   // we need a copy, because we do a transfer, then a peek
 	Melder_assert (experimentsCopy -> size == experiments -> size);
 	Melder_assert (experimentsCopy -> item [1] == experiments -> item [1]);
 	Melder_assert (experimentsCopy -> item [experimentsCopy -> size] == experiments -> item [experiments -> size]);
-	autoRunnerMFC runner = RunnerMFC_create (L"listening experiments", experimentsCopy.transfer());
+	autoRunnerMFC runner = RunnerMFC_create (U"listening experiments", experimentsCopy.transfer());
 	praat_installEditorN (runner.transfer(), experiments.peek());
-END
+END2 }
 
-DIRECT (ExperimentMFC_extractResults)
+DIRECT2 (ExperimentMFC_extractResults) {
 	WHERE (SELECTED) {
 		iam_LOOP (ExperimentMFC);
 		autoResultsMFC thee = ExperimentMFC_extractResults (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** RESULTS_MFC *****/
 
-DIRECT (ResultsMFC_getNumberOfTrials)
+DIRECT2 (ResultsMFC_getNumberOfTrials) {
 	iam_ONLY (ResultsMFC);
-	Melder_information (Melder_integer (my numberOfTrials));
-END
+	Melder_information (my numberOfTrials);
+END2 }
 
-FORM (ResultsMFC_getResponse, L"ResultsMFC: Get response", 0)
-	NATURAL (L"Trial", L"1")
-	OK
+FORM (ResultsMFC_getResponse, U"ResultsMFC: Get response", 0) {
+	NATURAL (U"Trial", U"1")
+	OK2
 DO
 	iam_ONLY (ResultsMFC);
-	long trial = GET_INTEGER (L"Trial");
+	long trial = GET_INTEGER (U"Trial");
 	if (trial > my numberOfTrials)
-		Melder_throw ("Trial ", trial, " does not exist (maximum ", my numberOfTrials, ").");
+		Melder_throw (U"Trial ", trial, U" does not exist (maximum ", my numberOfTrials, U").");
 	Melder_information (my result [trial]. response);
-END
+END2 }
 
-FORM (ResultsMFC_getStimulus, L"ResultsMFC: Get stimulus", 0)
-	NATURAL (L"Trial", L"1")
-	OK
+FORM (ResultsMFC_getStimulus, U"ResultsMFC: Get stimulus", 0) {
+	NATURAL (U"Trial", U"1")
+	OK2
 DO
 	iam_ONLY (ResultsMFC);
-	long trial = GET_INTEGER (L"Trial");
+	long trial = GET_INTEGER (U"Trial");
 	if (trial > my numberOfTrials)
-		Melder_throw ("Trial ", trial, " does not exist (maximum ", my numberOfTrials, ").");
+		Melder_throw (U"Trial ", trial, U" does not exist (maximum ", my numberOfTrials, U").");
 	Melder_information (my result [trial]. stimulus);
-END
+END2 }
 
-DIRECT (ResultsMFC_removeUnsharedStimuli)
+DIRECT2 (ResultsMFC_removeUnsharedStimuli) {
 	ResultsMFC res1 = NULL, res2 = NULL;
 	WHERE (SELECTED) { if (res1) res2 = (ResultsMFC) OBJECT; else res1 = (ResultsMFC) OBJECT; }
 	Melder_assert (res1 && res2);
-	praat_new (ResultsMFC_removeUnsharedStimuli (res1, res2), res2 -> name, L"_shared");
-END
+	praat_new (ResultsMFC_removeUnsharedStimuli (res1, res2), res2 -> name, U"_shared");
+END2 }
 
-DIRECT (ResultsMFC_to_Categories_stimuli)
+DIRECT2 (ResultsMFC_to_Categories_stimuli) {
 	WHERE (SELECTED) {
 		iam_LOOP (ResultsMFC);
 		autoCategories thee = ResultsMFC_to_Categories_stimuli (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (ResultsMFC_to_Categories_responses)
+DIRECT2 (ResultsMFC_to_Categories_responses) {
 	WHERE (SELECTED) {
 		iam_LOOP (ResultsMFC);
 		autoCategories thee = ResultsMFC_to_Categories_responses (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (ResultsMFCs_to_Table)
+DIRECT2 (ResultsMFCs_to_Table) {
 	autoCollection collection = Collection_create (classResultsMFC, 100);
 	Collection_dontOwnItems (collection.peek());
 	WHERE (SELECTED) {
@@ -128,32 +128,32 @@ DIRECT (ResultsMFCs_to_Table)
 		Collection_addItem (collection.peek(), me);
 	}
 	autoTable thee = ResultsMFCs_to_Table (collection.peek());
-	praat_new (thee.transfer(), L"allResults");
-END
+	praat_new (thee.transfer(), U"allResults");
+END2 }
 
 /***** buttons *****/
 
-void praat_uvafon_Exp_init (void);
-void praat_uvafon_Exp_init (void) {
+void praat_uvafon_Exp_init ();
+void praat_uvafon_Exp_init () {
 	Thing_recognizeClassesByName (classExperimentMFC, classResultsMFC, NULL);
 
-	praat_addAction1 (classCategories, 0, L"Sort", 0, 0, DO_Categories_sort);
-	praat_addAction1 (classCategories, 1, L"Get entropy", 0, 0, DO_Categories_getEntropy);
-
-	praat_addAction1 (classExperimentMFC, 0, L"Run", 0, 0, DO_ExperimentMFC_run);
-	praat_addAction1 (classExperimentMFC, 0, L"Extract results", 0, 0, DO_ExperimentMFC_extractResults);
-
-	praat_addAction1 (classResultsMFC, 0, L"Query -", 0, 0, 0);
-	praat_addAction1 (classResultsMFC, 1, L"Get number of trials", 0, 1, DO_ResultsMFC_getNumberOfTrials);
-	praat_addAction1 (classResultsMFC, 1, L"Get stimulus...", 0, 1, DO_ResultsMFC_getStimulus);
-	praat_addAction1 (classResultsMFC, 1, L"Get response...", 0, 1, DO_ResultsMFC_getResponse);
-	praat_addAction1 (classResultsMFC, 0, L"Modify", 0, 0, 0);
-	praat_addAction1 (classResultsMFC, 2, L"Remove unshared stimuli", 0, 0, DO_ResultsMFC_removeUnsharedStimuli);
-	praat_addAction1 (classResultsMFC, 0, L"Convert", 0, 0, 0);
-	praat_addAction1 (classResultsMFC, 0, L"To Categories (stimuli)", 0, 0, DO_ResultsMFC_to_Categories_stimuli);
-	praat_addAction1 (classResultsMFC, 0, L"To Categories (responses)", 0, 0, DO_ResultsMFC_to_Categories_responses);
-	praat_addAction1 (classResultsMFC, 0, L"Collect", 0, 0, 0);
-	praat_addAction1 (classResultsMFC, 0, L"Collect to Table", 0, 0, DO_ResultsMFCs_to_Table);
+	praat_addAction1 (classCategories, 0, U"Sort", 0, 0, DO_Categories_sort);
+	praat_addAction1 (classCategories, 1, U"Get entropy", 0, 0, DO_Categories_getEntropy);
+
+	praat_addAction1 (classExperimentMFC, 0, U"Run", 0, 0, DO_ExperimentMFC_run);
+	praat_addAction1 (classExperimentMFC, 0, U"Extract results", 0, 0, DO_ExperimentMFC_extractResults);
+
+	praat_addAction1 (classResultsMFC, 0, U"Query -", 0, 0, 0);
+	praat_addAction1 (classResultsMFC, 1, U"Get number of trials", 0, 1, DO_ResultsMFC_getNumberOfTrials);
+	praat_addAction1 (classResultsMFC, 1, U"Get stimulus...", 0, 1, DO_ResultsMFC_getStimulus);
+	praat_addAction1 (classResultsMFC, 1, U"Get response...", 0, 1, DO_ResultsMFC_getResponse);
+	praat_addAction1 (classResultsMFC, 0, U"Modify", 0, 0, 0);
+	praat_addAction1 (classResultsMFC, 2, U"Remove unshared stimuli", 0, 0, DO_ResultsMFC_removeUnsharedStimuli);
+	praat_addAction1 (classResultsMFC, 0, U"Convert", 0, 0, 0);
+	praat_addAction1 (classResultsMFC, 0, U"To Categories (stimuli)", 0, 0, DO_ResultsMFC_to_Categories_stimuli);
+	praat_addAction1 (classResultsMFC, 0, U"To Categories (responses)", 0, 0, DO_ResultsMFC_to_Categories_responses);
+	praat_addAction1 (classResultsMFC, 0, U"Collect", 0, 0, 0);
+	praat_addAction1 (classResultsMFC, 0, U"Collect to Table", 0, 0, DO_ResultsMFCs_to_Table);
 }
 
-/* End of file praat_Exp.c */
+/* End of file praat_Exp.cpp */
diff --git a/fon/praat_Fon.cpp b/fon/praat_Fon.cpp
index 7e80822..073a3a4 100644
--- a/fon/praat_Fon.cpp
+++ b/fon/praat_Fon.cpp
@@ -1,6 +1,6 @@
 /* praat_Fon.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -73,61 +73,61 @@
 #undef iam
 #define iam iam_LOOP
 
-static const wchar_t *STRING_FROM_TIME_SECONDS = L"left Time range (s)";
-static const wchar_t *STRING_TO_TIME_SECONDS = L"right Time range (s)";
-static const wchar_t *STRING_FROM_TIME = L"left Time range";
-static const wchar_t *STRING_TO_TIME = L"right Time range";
-static const wchar_t *STRING_FROM_FREQUENCY_HZ = L"left Frequency range (Hz)";
-static const wchar_t *STRING_TO_FREQUENCY_HZ = L"right Frequency range (Hz)";
-static const wchar_t *STRING_FROM_FREQUENCY = L"left Frequency range";
-static const wchar_t *STRING_TO_FREQUENCY = L"right Frequency range";
+static const char32 *STRING_FROM_TIME_SECONDS = U"left Time range (s)";
+static const char32 *STRING_TO_TIME_SECONDS = U"right Time range (s)";
+static const char32 *STRING_FROM_TIME = U"left Time range";
+static const char32 *STRING_TO_TIME = U"right Time range";
+static const char32 *STRING_FROM_FREQUENCY_HZ = U"left Frequency range (Hz)";
+static const char32 *STRING_TO_FREQUENCY_HZ = U"right Frequency range (Hz)";
+static const char32 *STRING_FROM_FREQUENCY = U"left Frequency range";
+static const char32 *STRING_TO_FREQUENCY = U"right Frequency range";
 
 /***** Common dialog contents. *****/
 
-void praat_dia_timeRange (Any dia);
-void praat_dia_timeRange (Any dia) {
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
+void praat_dia_timeRange (UiForm dia);
+void praat_dia_timeRange (UiForm dia) {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
 }
-void praat_get_timeRange (Any dia, double *tmin, double *tmax);
-void praat_get_timeRange (Any dia, double *tmin, double *tmax) {
+void praat_get_timeRange (UiForm dia, double *tmin, double *tmax);
+void praat_get_timeRange (UiForm dia, double *tmin, double *tmax) {
 	*tmin = GET_REAL (STRING_FROM_TIME);
 	*tmax = GET_REAL (STRING_TO_TIME);
 }
-int praat_get_frequencyRange (Any dia, double *fmin, double *fmax);
-int praat_get_frequencyRange (Any dia, double *fmin, double *fmax) {
+int praat_get_frequencyRange (UiForm dia, double *fmin, double *fmax);
+int praat_get_frequencyRange (UiForm dia, double *fmin, double *fmax) {
 	*fmin = GET_REAL (STRING_FROM_FREQUENCY);
 	*fmax = GET_REAL (STRING_TO_FREQUENCY);
-	REQUIRE (*fmax > *fmin, L"Maximum frequency must be greater than minimum frequency.")
+	REQUIRE (*fmax > *fmin, U"Maximum frequency must be greater than minimum frequency.")
 	return 1;
 }
-static void dia_Vector_getExtremum (Any dia) {
+static void dia_Vector_getExtremum (UiForm dia) {
 	Any radio;
 	praat_dia_timeRange (dia);
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
-	RADIOBUTTON (L"Sinc700")
+	RADIO (U"Interpolation", 2)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
 }
-static void dia_Vector_getValue (Any dia) {
+static void dia_Vector_getValue (UiForm dia) {
 	Any radio;
-	REAL (L"Time (s)", L"0.5")
-	RADIO (L"Interpolation", 3)
-	RADIOBUTTON (L"Nearest")
-	RADIOBUTTON (L"Linear")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
-	RADIOBUTTON (L"Sinc700")
+	REAL (U"Time (s)", U"0.5")
+	RADIO (U"Interpolation", 3)
+		RADIOBUTTON (U"Nearest")
+		RADIOBUTTON (U"Linear")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
 }
 
-static void getTminTmaxFminFmax (Any dia, double *tmin, double *tmax, double *fmin, double *fmax) {
+static void getTminTmaxFminFmax (UiForm dia, double *tmin, double *tmax, double *fmin, double *fmax) {
 	*tmin = GET_REAL (STRING_FROM_TIME);
 	*tmax = GET_REAL (STRING_TO_TIME);
 	*fmin = GET_REAL (STRING_FROM_FREQUENCY);
 	*fmax = GET_REAL (STRING_TO_FREQUENCY);
-	REQUIRE (*fmax > *fmin, L"Maximum frequency must be greater than minimum frequency.")
+	REQUIRE (*fmax > *fmin, U"Maximum frequency must be greater than minimum frequency.")
 }
 #define GET_TMIN_TMAX_FMIN_FMAX \
 	double tmin, tmax, fmin, fmax; \
@@ -141,7 +141,7 @@ int praat_Fon_formula (UiForm dia, Interpreter interpreter) {
 	LOOP {
 		iam (Matrix);
 		try {
-			Matrix_formula (me, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);
@@ -151,226 +151,228 @@ int praat_Fon_formula (UiForm dia, Interpreter interpreter) {
 	return 1;
 }
 
-extern "C" Graphics Movie_create (const wchar_t *title, int width, int height);
-extern "C" Graphics Movie_create (const wchar_t *title, int width, int height) {
+extern "C" Graphics Movie_create (const char32 *title, int width, int height);
+extern "C" Graphics Movie_create (const char32 *title, int width, int height) {
 	static Graphics graphics;
 	static GuiDialog dialog;
 	static GuiDrawingArea drawingArea;
 	if (! graphics) {
 		dialog = GuiDialog_create (theCurrentPraatApplication -> topShell, 100, 100, width + 2, height + 2, title, NULL, NULL, 0);
 		drawingArea = GuiDrawingArea_createShown (dialog, 0, width, 0, height, NULL, NULL, NULL, NULL, NULL, 0);
-		dialog -> f_show ();
+		GuiThing_show (dialog);
 		graphics = Graphics_create_xmdrawingarea (drawingArea);
 	}
-	dialog -> f_setTitle (title);
-	dialog -> f_setSize (width + 2, height + 2);
-	drawingArea -> f_setSize (width, height);
-	dialog -> f_show ();
+	GuiShell_setTitle (dialog, title);
+	GuiControl_setSize (dialog, width + 2, height + 2);
+	GuiControl_setSize (drawingArea, width, height);
+	GuiThing_show (dialog);
 	return graphics;
 }
 
 /***** AMPLITUDETIER *****/
 
-FORM (AmplitudeTier_addPoint, L"Add one point", L"AmplitudeTier: Add point...")
-	REAL (L"Time (s)", L"0.5")
-	REAL (L"Sound pressure (Pa)", L"0.8")
-	OK
+FORM (AmplitudeTier_addPoint, U"Add one point", U"AmplitudeTier: Add point...") {
+	REAL (U"Time (s)", U"0.5")
+	REAL (U"Sound pressure (Pa)", U"0.8")
+	OK2
 DO
 	LOOP {
 		iam (AmplitudeTier);
-		RealTier_addPoint (me, GET_REAL (L"Time"), GET_REAL (L"Sound pressure"));
+		RealTier_addPoint (me, GET_REAL (U"Time"), GET_REAL (U"Sound pressure"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (AmplitudeTier_create, L"Create empty AmplitudeTier", NULL)
-	WORD (L"Name", L"empty")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	OK
+FORM (AmplitudeTier_create, U"Create empty AmplitudeTier", NULL) {
+	WORD (U"Name", U"empty")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	OK2
 DO
-	double startTime = GET_REAL (L"Start time"), endTime = GET_REAL (L"End time");
-	if (endTime <= startTime) Melder_throw ("End time must be greater than start time.");
+	double startTime = GET_REAL (U"Start time"), endTime = GET_REAL (U"End time");
+	if (endTime <= startTime) Melder_throw (U"End time must be greater than start time.");
 	autoAmplitudeTier thee = AmplitudeTier_create (startTime, endTime);
-	praat_new (thee.transfer(), GET_STRING (L"Name"));
-END
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
+END2 }
 
-DIRECT (AmplitudeTier_downto_PointProcess)
+DIRECT2 (AmplitudeTier_downto_PointProcess) {
 	LOOP {
 		iam (AmplitudeTier);
 		autoPointProcess thee = AnyTier_downto_PointProcess (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (AmplitudeTier_downto_TableOfReal)
+DIRECT2 (AmplitudeTier_downto_TableOfReal) {
 	LOOP {
 		iam (AmplitudeTier);
 		autoTableOfReal thee = AmplitudeTier_downto_TableOfReal (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (AmplitudeTier_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit an AmplitudeTier from batch.");
+DIRECT2 (AmplitudeTier_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit an AmplitudeTier from batch.");
 	Sound sound = NULL;
 	LOOP {
 		if (CLASS == classSound) sound = (Sound) OBJECT;   // may stay NULL
 	}
 	LOOP if (CLASS == classAmplitudeTier) {
 		iam (AmplitudeTier);
-		autoAmplitudeTierEditor editor = AmplitudeTierEditor_create (ID_AND_FULL_NAME, me, sound, TRUE);
+		autoAmplitudeTierEditor editor = AmplitudeTierEditor_create (ID_AND_FULL_NAME, me, sound, true);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-FORM (AmplitudeTier_formula, L"AmplitudeTier: Formula", L"AmplitudeTier: Formula...")
-	LABEL (L"", L"# ncol = the number of points")
-	LABEL (L"", L"for col from 1 to ncol")
-	LABEL (L"", L"   # x = the time of the colth point, in seconds")
-	LABEL (L"", L"   # self = the value of the colth point, in Pascal")
-	LABEL (L"", L"   self = `formula'")
-	LABEL (L"", L"endfor")
-	TEXTFIELD (L"formula", L"- self ; upside down")
-	OK
+FORM (AmplitudeTier_formula, U"AmplitudeTier: Formula", U"AmplitudeTier: Formula...") {
+	LABEL (U"", U"# ncol = the number of points")
+	LABEL (U"", U"for col from 1 to ncol")
+	LABEL (U"", U"   # x = the time of the colth point, in seconds")
+	LABEL (U"", U"   # self = the value of the colth point, in Pascal")
+	LABEL (U"", U"   self = `formula'")
+	LABEL (U"", U"endfor")
+	TEXTFIELD (U"formula", U"- self ; upside down")
+	OK2
 DO
 	LOOP {
 		iam (AmplitudeTier);
 		try {
-			RealTier_formula (me, GET_STRING (L"formula"), interpreter, NULL);
+			RealTier_formula (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);
 			throw;
 		}
 	}
-END
+END2 }
 
-static void dia_AmplitudeTier_getRangeProperty (Any dia) {
-	REAL (L"Shortest period (s)", L"0.0001")
-	REAL (L"Longest period (s)", L"0.02")
-	POSITIVE (L"Maximum amplitude factor", L"1.6")
+static void dia_AmplitudeTier_getRangeProperty (UiForm dia) {
+	REAL (U"Shortest period (s)", U"0.0001")
+	REAL (U"Longest period (s)", U"0.02")
+	POSITIVE (U"Maximum amplitude factor", U"1.6")
 }
 
-FORM (AmplitudeTier_getShimmer_local, L"AmplitudeTier: Get shimmer (local)", L"AmplitudeTier: Get shimmer (local)...")
+FORM (AmplitudeTier_getShimmer_local, U"AmplitudeTier: Get shimmer (local)", U"AmplitudeTier: Get shimmer (local)...") {
 	dia_AmplitudeTier_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (AmplitudeTier);
 		double shimmer = AmplitudeTier_getShimmer_local (me,
-			GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum amplitude factor"));
+			GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum amplitude factor"));
 		Melder_informationReal (shimmer, NULL);
 	}
-END
+END2 }
 
-FORM (AmplitudeTier_getShimmer_local_dB, L"AmplitudeTier: Get shimmer (local, dB)", L"AmplitudeTier: Get shimmer (local, dB)...")
+FORM (AmplitudeTier_getShimmer_local_dB, U"AmplitudeTier: Get shimmer (local, dB)", U"AmplitudeTier: Get shimmer (local, dB)...") {
 	dia_AmplitudeTier_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (AmplitudeTier);
 		double shimmer = AmplitudeTier_getShimmer_local_dB (me,
-			GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum amplitude factor"));
+			GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum amplitude factor"));
 		Melder_informationReal (shimmer, NULL);
 	}
-END
+END2 }
 
-FORM (AmplitudeTier_getShimmer_apq3, L"AmplitudeTier: Get shimmer (apq3)", L"AmplitudeTier: Get shimmer (apq3)...")
+FORM (AmplitudeTier_getShimmer_apq3, U"AmplitudeTier: Get shimmer (apq3)", U"AmplitudeTier: Get shimmer (apq3)...") {
 	dia_AmplitudeTier_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (AmplitudeTier);
 		double shimmer = AmplitudeTier_getShimmer_apq3 (me,
-			GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum amplitude factor"));
+			GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum amplitude factor"));
 		Melder_informationReal (shimmer, NULL);
 	}
-END
+END2 }
 
-FORM (AmplitudeTier_getShimmer_apq5, L"AmplitudeTier: Get shimmer (apq5)", L"AmplitudeTier: Get shimmer (apq5)...")
+FORM (AmplitudeTier_getShimmer_apq5, U"AmplitudeTier: Get shimmer (apq5)", U"AmplitudeTier: Get shimmer (apq5)...") {
 	dia_AmplitudeTier_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (AmplitudeTier);
 		double shimmer = AmplitudeTier_getShimmer_apq5 (me,
-			GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum amplitude factor"));
+			GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum amplitude factor"));
 		Melder_informationReal (shimmer, NULL);
 	}
-END
+END2 }
 
-FORM (AmplitudeTier_getShimmer_apq11, L"AmplitudeTier: Get shimmer (apq11)", L"AmplitudeTier: Get shimmer (apq11)...")
+FORM (AmplitudeTier_getShimmer_apq11, U"AmplitudeTier: Get shimmer (apq11)", U"AmplitudeTier: Get shimmer (apq11)...") {
 	dia_AmplitudeTier_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (AmplitudeTier);
 		double shimmer = AmplitudeTier_getShimmer_apq11 (me,
-			GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum amplitude factor"));
+			GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum amplitude factor"));
 		Melder_informationReal (shimmer, NULL);
 	}
-END
+END2 }
 
-FORM (AmplitudeTier_getShimmer_dda, L"AmplitudeTier: Get shimmer (dda)", L"AmplitudeTier: Get shimmer (dda)...")
+FORM (AmplitudeTier_getShimmer_dda, U"AmplitudeTier: Get shimmer (dda)", U"AmplitudeTier: Get shimmer (dda)...") {
 	dia_AmplitudeTier_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (AmplitudeTier);
 		double shimmer = AmplitudeTier_getShimmer_dda (me,
-			GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum amplitude factor"));
+			GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum amplitude factor"));
 		Melder_informationReal (shimmer, NULL);
 	}
-END
+END2 }
 
-/*FORM (AmplitudeTier_getValueAtTime, L"Get AmplitudeTier value", L"AmplitudeTier: Get value at time...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+/*FORM (AmplitudeTier_getValueAtTime, U"Get AmplitudeTier value", U"AmplitudeTier: Get value at time...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
-	Melder_informationReal (RealTier_getValueAtTime (ONLY_OBJECT, GET_REAL (L"Time")), L"Pa");
-END
+	Melder_informationReal (RealTier_getValueAtTime (ONLY_OBJECT, GET_REAL (U"Time")), U"Pa");
+END2 }
 	
-FORM (AmplitudeTier_getValueAtIndex, L"Get AmplitudeTier value", L"AmplitudeTier: Get value at index...")
-	INTEGER (L"Point number", L"10")
-	OK
+FORM (AmplitudeTier_getValueAtIndex, U"Get AmplitudeTier value", U"AmplitudeTier: Get value at index...") {
+	INTEGER (U"Point number", U"10")
+	OK2
 DO
-	Melder_informationReal (RealTier_getValueAtIndex (ONLY_OBJECT, GET_INTEGER (L"Point number")), L"Pa");
-END*/
+	Melder_informationReal (RealTier_getValueAtIndex (ONLY_OBJECT, GET_INTEGER (U"Point number")), U"Pa");
+END2 }*/
 
-DIRECT (AmplitudeTier_help) Melder_help (L"AmplitudeTier"); END
+DIRECT2 (AmplitudeTier_help) {
+	Melder_help (U"AmplitudeTier");
+END2 }
 
-FORM (AmplitudeTier_to_IntensityTier, L"AmplitudeTier: To IntensityTier", L"AmplitudeTier: To IntensityTier...")
-	REAL (L"Threshold (dB)", L"-10000.0")
-	OK
+FORM (AmplitudeTier_to_IntensityTier, U"AmplitudeTier: To IntensityTier", U"AmplitudeTier: To IntensityTier...") {
+	REAL (U"Threshold (dB)", U"-10000.0")
+	OK2
 DO
 	LOOP {
 		iam (AmplitudeTier);
-		autoIntensityTier thee = AmplitudeTier_to_IntensityTier (me, GET_REAL (L"Threshold"));
+		autoIntensityTier thee = AmplitudeTier_to_IntensityTier (me, GET_REAL (U"Threshold"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (AmplitudeTier_to_Sound, L"AmplitudeTier: To Sound (pulse train)", L"AmplitudeTier: To Sound (pulse train)...")
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
-	NATURAL (L"Interpolation depth (samples)", L"2000")
-	OK
+FORM (AmplitudeTier_to_Sound, U"AmplitudeTier: To Sound (pulse train)", U"AmplitudeTier: To Sound (pulse train)...") {
+	POSITIVE (U"Sampling frequency (Hz)", U"44100")
+	NATURAL (U"Interpolation depth (samples)", U"2000")
+	OK2
 DO
 	LOOP {
 		iam (AmplitudeTier);
-		autoSound thee = AmplitudeTier_to_Sound (me, GET_REAL (L"Sampling frequency"), GET_INTEGER (L"Interpolation depth"));
+		autoSound thee = AmplitudeTier_to_Sound (me, GET_REAL (U"Sampling frequency"), GET_INTEGER (U"Interpolation depth"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (info_AmplitudeTier_Sound_edit)
-	Melder_information (L"To include a copy of a Sound in your AmplitudeTier editor:\n"
+DIRECT2 (info_AmplitudeTier_Sound_edit) {
+	Melder_information (U"To include a copy of a Sound in your AmplitudeTier editor:\n"
 		"   select an AmplitudeTier and a Sound, and click \"View & Edit\".");
-END
+END2 }
 
 /***** AMPLITUDETIER & SOUND *****/
 
-DIRECT (Sound_AmplitudeTier_multiply)
+DIRECT2 (Sound_AmplitudeTier_multiply) {
 	Sound sound = NULL;
 	AmplitudeTier tier = NULL;
 	LOOP {
@@ -378,120 +380,122 @@ DIRECT (Sound_AmplitudeTier_multiply)
 		if (CLASS == classAmplitudeTier) tier = (AmplitudeTier) OBJECT;
 	}
 	autoSound thee = Sound_AmplitudeTier_multiply (sound, tier);
-	praat_new (thee.transfer(), sound -> name, L"_amp");
-END
+	praat_new (thee.transfer(), sound -> name, U"_amp");
+END2 }
 
 /***** COCHLEAGRAM *****/
 
-FORM (Cochleagram_difference, L"Cochleagram difference", 0)
+FORM (Cochleagram_difference, U"Cochleagram difference", 0) {
 	praat_dia_timeRange (dia);
-	OK
+	OK2
 DO
 	Cochleagram coch1 = NULL, coch2 = NULL;
 	LOOP (coch1 ? coch2 : coch1) = (Cochleagram) OBJECT;
 	Melder_informationReal (Cochleagram_difference (coch1, coch2,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range")), L"Hertz (root-mean-square)");
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range")), U"Hertz (root-mean-square)");
+END2 }
 
-FORM (Cochleagram_formula, L"Cochleagram Formula", L"Cochleagram: Formula...")
-	LABEL (L"label", L"`x' is time in seconds, `y' is place in Bark")
-	LABEL (L"label", L"y := y1; for row := 1 to nrow do { x := x1; "
+FORM (Cochleagram_formula, U"Cochleagram Formula", U"Cochleagram: Formula...") {
+	LABEL (U"label", U"`x' is time in seconds, `y' is place in Bark")
+	LABEL (U"label", U"y := y1; for row := 1 to nrow do { x := x1; "
 		"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + dx } y := y + dy }")
-	TEXTFIELD (L"formula", L"self")
-	OK
+	TEXTFIELD (U"formula", U"self")
+	OK2
 DO
 	LOOP {
 		iam (Cochleagram);
 		try {
-			Matrix_formula (reinterpret_cast <Matrix> (me), GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (reinterpret_cast <Matrix> (me), GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Cochleagram may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-DIRECT (Cochleagram_help) Melder_help (L"Cochleagram"); END
+DIRECT2 (Cochleagram_help) {
+	Melder_help (U"Cochleagram");
+END2 }
 
-DIRECT (Cochleagram_movie)
-	Graphics g = Movie_create (L"Cochleagram movie", 300, 300);
+DIRECT2 (Cochleagram_movie) {
+	Graphics g = Movie_create (U"Cochleagram movie", 300, 300);
 	LOOP {
 		iam (Cochleagram);
 		Matrix_movie (me, g);
 	}
-END
+END2 }
 
-FORM (Cochleagram_paint, L"Paint Cochleagram", 0)
+FORM (Cochleagram_paint, U"Paint Cochleagram", 0) {
 	praat_dia_timeRange (dia);
-	BOOLEAN (L"Garnish", 1)
-	OK
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (Cochleagram);
 		autoPraatPicture picture;
-		Cochleagram_paint (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Garnish"));
+		Cochleagram_paint (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-FORM (Cochleagram_to_Excitation, L"From Cochleagram to Excitation", 0)
-	REAL (L"Time (s)", L"0.0")
-	OK
+FORM (Cochleagram_to_Excitation, U"From Cochleagram to Excitation", 0) {
+	REAL (U"Time (s)", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Cochleagram);
-		autoExcitation thee = Cochleagram_to_Excitation (me, GET_REAL (L"Time"));
+		autoExcitation thee = Cochleagram_to_Excitation (me, GET_REAL (U"Time"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Cochleagram_to_Matrix)
+DIRECT2 (Cochleagram_to_Matrix) {
 	LOOP {
 		iam (Cochleagram);
 		autoMatrix thee = Cochleagram_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** CORPUS *****/
 
-FORM (Corpus_create, L"Create Corpus", L"Create Corpus...")
-	WORD (L"Name", L"myCorpus")
-	LABEL (L"", L"Folder with sound files:")
-	TEXTFIELD (L"folderWithSoundFiles", L"")
-	LABEL (L"", L"Folder with annotation files:")
-	TEXTFIELD (L"folderWithAnnotationFiles", L"")
-	OK
+FORM (Corpus_create, U"Create Corpus", U"Create Corpus...") {
+	WORD (U"Name", U"myCorpus")
+	LABEL (U"", U"Folder with sound files:")
+	TEXTFIELD (U"folderWithSoundFiles", U"")
+	LABEL (U"", U"Folder with annotation files:")
+	TEXTFIELD (U"folderWithAnnotationFiles", U"")
+	OK2
 DO
-END
+END2 }
 
-DIRECT (Corpus_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot edit a Corpus from batch.");
+DIRECT2 (Corpus_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot edit a Corpus from batch.");
 	LOOP {
 		iam (Corpus);
 		autoTableEditor editor = TableEditor_create (ID_AND_FULL_NAME, me);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
 /***** DISTRIBUTIONS *****/
 
-FORM (Distributions_to_Transition, L"To Transition", 0)
-	NATURAL (L"Environment", L"1")
-	BOOLEAN (L"Greedy", 1)
-	OK
+FORM (Distributions_to_Transition, U"To Transition", 0) {
+	NATURAL (U"Environment", U"1")
+	BOOLEAN (U"Greedy", 1)
+	OK2
 DO
 	LOOP {
 		iam (Distributions);
-		autoTransition thee = Distributions_to_Transition (me, NULL, GET_INTEGER (L"Environment"), NULL, GET_INTEGER (L"Greedy"));
+		autoTransition thee = Distributions_to_Transition (me, NULL, GET_INTEGER (U"Environment"), NULL, GET_INTEGER (U"Greedy"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Distributions_to_Transition_adj, L"To Transition", 0)
-	NATURAL (L"Environment", L"1")
-	BOOLEAN (L"Greedy", 1)
-	OK
+FORM (Distributions_to_Transition_adj, U"To Transition", 0) {
+	NATURAL (U"Environment", U"1")
+	BOOLEAN (U"Greedy", 1)
+	OK2
 DO
 	Distributions dist = NULL;
 	Transition trans = NULL;
@@ -499,25 +503,25 @@ DO
 		if (CLASS == classDistributions) dist = (Distributions) OBJECT;
 		if (CLASS == classTransition) trans = (Transition) OBJECT;
 	}
-	autoTransition thee = Distributions_to_Transition (dist, NULL, GET_INTEGER (L"Environment"), trans, GET_INTEGER (L"Greedy"));
-	praat_new (thee.transfer(), NULL);
-END
+	autoTransition thee = Distributions_to_Transition (dist, NULL, GET_INTEGER (U"Environment"), trans, GET_INTEGER (U"Greedy"));
+	praat_new (thee.transfer());
+END2 }
 
-FORM (Distributions_to_Transition_noise, L"To Transition (noise)", 0)
-	NATURAL (L"Environment", L"1")
-	BOOLEAN (L"Greedy", 1)
-	OK
+FORM (Distributions_to_Transition_noise, U"To Transition (noise)", 0) {
+	NATURAL (U"Environment", U"1")
+	BOOLEAN (U"Greedy", 1)
+	OK2
 DO
 	Distributions underlying = NULL, surface = NULL;
 	LOOP (underlying ? surface : underlying) = (Distributions) OBJECT;
-	autoTransition thee = Distributions_to_Transition (underlying, surface, GET_INTEGER (L"Environment"), NULL, GET_INTEGER (L"Greedy"));
-	praat_new (thee.transfer(), NULL);
-END
+	autoTransition thee = Distributions_to_Transition (underlying, surface, GET_INTEGER (U"Environment"), NULL, GET_INTEGER (U"Greedy"));
+	praat_new (thee.transfer());
+END2 }
 
-FORM (Distributions_to_Transition_noise_adj, L"To Transition (noise)", 0)
-	NATURAL (L"Environment", L"1")
-	BOOLEAN (L"Greedy", 1)
-	OK
+FORM (Distributions_to_Transition_noise_adj, U"To Transition (noise)", 0) {
+	NATURAL (U"Environment", U"1")
+	BOOLEAN (U"Greedy", 1)
+	OK2
 DO
 	Distributions underlying = NULL, surface = NULL;
 	Transition trans = NULL;
@@ -525,13 +529,13 @@ DO
 		if (CLASS == classDistributions) (underlying ? surface : underlying) = (Distributions) OBJECT;
 		if (CLASS == classTransition) trans = (Transition) OBJECT;
 	}
-	autoTransition thee = Distributions_to_Transition (underlying, surface, GET_INTEGER (L"Environment"), trans, GET_INTEGER (L"Greedy"));
-	praat_new (thee.transfer(), NULL);
-END
+	autoTransition thee = Distributions_to_Transition (underlying, surface, GET_INTEGER (U"Environment"), trans, GET_INTEGER (U"Greedy"));
+	praat_new (thee.transfer());
+END2 }
 
 /***** DISTRIBUTIONS & TRANSITION *****/
 
-DIRECT (Distributions_Transition_map)
+DIRECT2 (Distributions_Transition_map) {
 	Distributions dist = NULL;
 	Transition trans = NULL;
 	LOOP {
@@ -539,607 +543,613 @@ DIRECT (Distributions_Transition_map)
 		if (CLASS == classTransition) trans = (Transition) OBJECT;
 	}
 	autoDistributions thee = Distributions_Transition_map (dist, trans);
-	praat_new (thee.transfer(), L"surface");
-END
+	praat_new (thee.transfer(), U"surface");
+END2 }
 
 /***** DURATIONTIER *****/
 
-FORM (DurationTier_addPoint, L"Add one point to DurationTier", L"DurationTier: Add point...")
-	REAL (L"Time (s)", L"0.5")
-	REAL (L"Relative duration", L"1.5")
-	OK
+FORM (DurationTier_addPoint, U"Add one point to DurationTier", U"DurationTier: Add point...") {
+	REAL (U"Time (s)", U"0.5")
+	REAL (U"Relative duration", U"1.5")
+	OK2
 DO
 	LOOP {
 		iam (DurationTier);
-		RealTier_addPoint (me, GET_REAL (L"Time"), GET_REAL (L"Relative duration"));
+		RealTier_addPoint (me, GET_REAL (U"Time"), GET_REAL (U"Relative duration"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (DurationTier_create, L"Create empty DurationTier", L"Create DurationTier...")
-	WORD (L"Name", L"empty")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	OK
+FORM (DurationTier_create, U"Create empty DurationTier", U"Create DurationTier...") {
+	WORD (U"Name", U"empty")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	OK2
 DO
-	double startTime = GET_REAL (L"Start time"), endTime = GET_REAL (L"End time");
-	if (endTime <= startTime) Melder_throw ("End time must be greater than start time.");
+	double startTime = GET_REAL (U"Start time"), endTime = GET_REAL (U"End time");
+	if (endTime <= startTime) Melder_throw (U"End time must be greater than start time.");
 	autoDurationTier thee = DurationTier_create (startTime, endTime);
-	praat_new (thee.transfer(), GET_STRING (L"Name"));
-END
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
+END2 }
 
-DIRECT (DurationTier_downto_PointProcess)
+DIRECT2 (DurationTier_downto_PointProcess) {
 	LOOP {
 		iam (DurationTier);
 		autoPointProcess thee = AnyTier_downto_PointProcess (OBJECT);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (DurationTier_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a DurationTier from batch.");
+DIRECT2 (DurationTier_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a DurationTier from batch.");
 	Sound sound = NULL;
 	LOOP {
 		if (CLASS == classSound) sound = (Sound) OBJECT;   // may stay NULL
 	}
 	LOOP if (CLASS == classDurationTier) {
 		iam (DurationTier);
-		autoDurationTierEditor editor = DurationTierEditor_create (ID_AND_FULL_NAME, me, sound, TRUE);
+		autoDurationTierEditor editor = DurationTierEditor_create (ID_AND_FULL_NAME, me, sound, true);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-FORM (DurationTier_formula, L"DurationTier: Formula", L"DurationTier: Formula...")
-	LABEL (L"", L"# ncol = the number of points")
-	LABEL (L"", L"for col from 1 to ncol")
-	LABEL (L"", L"   # x = the time of the colth point, in seconds")
-	LABEL (L"", L"   # self = the value of the colth point, in relative units")
-	LABEL (L"", L"   self = `formula'")
-	LABEL (L"", L"endfor")
-	TEXTFIELD (L"formula", L"self * 1.5 ; slow down")
-	OK
+FORM (DurationTier_formula, U"DurationTier: Formula", U"DurationTier: Formula...") {
+	LABEL (U"", U"# ncol = the number of points")
+	LABEL (U"", U"for col from 1 to ncol")
+	LABEL (U"", U"   # x = the time of the colth point, in seconds")
+	LABEL (U"", U"   # self = the value of the colth point, in relative units")
+	LABEL (U"", U"   self = `formula'")
+	LABEL (U"", U"endfor")
+	TEXTFIELD (U"formula", U"self * 1.5 ; slow down")
+	OK2
 DO
 	LOOP {
 		iam (DurationTier);
 		try {
-			RealTier_formula (me, GET_STRING (L"formula"), interpreter, NULL);
+			RealTier_formula (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (DurationTier_getTargetDuration, L"Get target duration", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"1.0")
-	OK
+FORM (DurationTier_getTargetDuration, U"Get target duration", 0) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"1.0")
+	OK2
 DO
 	LOOP {
 		iam (DurationTier);
-		double area = RealTier_getArea (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"));
-		Melder_informationReal (area, L"seconds");
+		double area = RealTier_getArea (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"));
+		Melder_informationReal (area, U"seconds");
 	}
-END
+END2 }
 
-FORM (DurationTier_getValueAtTime, L"Get DurationTier value", L"DurationTier: Get value at time...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (DurationTier_getValueAtTime, U"Get DurationTier value", U"DurationTier: Get value at time...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (DurationTier);
-		double value = RealTier_getValueAtTime (me, GET_REAL (L"Time"));
+		double value = RealTier_getValueAtTime (me, GET_REAL (U"Time"));
 		Melder_informationReal (value, NULL);
 	}
-END
+END2 }
 	
-FORM (DurationTier_getValueAtIndex, L"Get DurationTier value", L"Duration: Get value at index...")
-	INTEGER (L"Point number", L"10")
-	OK
+FORM (DurationTier_getValueAtIndex, U"Get DurationTier value", U"Duration: Get value at index...") {
+	INTEGER (U"Point number", U"10")
+	OK2
 DO
 	LOOP {
 		iam (DurationTier);
-		double value = RealTier_getValueAtIndex (me, GET_INTEGER (L"Point number"));
+		double value = RealTier_getValueAtIndex (me, GET_INTEGER (U"Point number"));
 		Melder_informationReal (value, NULL);
 	}
-END
+END2 }
 
-DIRECT (DurationTier_help) Melder_help (L"DurationTier"); END
+DIRECT2 (DurationTier_help) {
+	Melder_help (U"DurationTier");
+END2 }
 
-DIRECT (info_DurationTier_Sound_edit)
-	Melder_information (L"To include a copy of a Sound in your DurationTier editor:\n"
+DIRECT2 (info_DurationTier_Sound_edit) {
+	Melder_information (U"To include a copy of a Sound in your DurationTier editor:\n"
 		"   select a DurationTier and a Sound, and click \"View & Edit\".");
-END
+END2 }
 
 /***** EXCITATION *****/
 
-FORM (Excitation_draw, L"Draw Excitation", 0)
-	REAL (L"From frequency (Bark)", L"0")
-	REAL (L"To frequency (Bark)", L"25.6")
-	REAL (L"Minimum (phon)", L"0")
-	REAL (L"Maximum (phon)", L"100")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Excitation_draw, U"Draw Excitation", 0) {
+	REAL (U"From frequency (Bark)", U"0")
+	REAL (U"To frequency (Bark)", U"25.6")
+	REAL (U"Minimum (phon)", U"0")
+	REAL (U"Maximum (phon)", U"100")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (Excitation);
 		autoPraatPicture picture;
 		Excitation_draw (me, GRAPHICS,
-			GET_REAL (L"From frequency"), GET_REAL (L"To frequency"),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"From frequency"), GET_REAL (U"To frequency"),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-FORM (Excitation_formula, L"Excitation Formula", L"Excitation: Formula...")
-	LABEL (L"label", L"`x' is the place in Bark, `col' is the bin number")
-	LABEL (L"label", L"x := 0;   for col := 1 to ncol do { self [1, col] := `formula' ; x := x + dx }")
-	TEXTFIELD (L"formula", L"self")
-	OK
+FORM (Excitation_formula, U"Excitation Formula", U"Excitation: Formula...") {
+	LABEL (U"label", U"`x' is the place in Bark, `col' is the bin number")
+	LABEL (U"label", U"x := 0;   for col := 1 to ncol do { self [1, col] := `formula' ; x := x + dx }")
+	TEXTFIELD (U"formula", U"self")
+	OK2
 DO
 	LOOP {
 		iam (Excitation);
 		try {
-			Matrix_formula (reinterpret_cast <Matrix> (me), GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (reinterpret_cast <Matrix> (me), GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);
 			throw;
 		}
 	}
-END
+END2 }
 
-DIRECT (Excitation_getLoudness)
+DIRECT2 (Excitation_getLoudness) {
 	LOOP {
 		iam (Excitation);
 		double loudness = Excitation_getLoudness (me);
-		Melder_informationReal (loudness, L"sones");
+		Melder_informationReal (loudness, U"sones");
 	}
-END
+END2 }
 
-DIRECT (Excitation_help) Melder_help (L"Excitation"); END
+DIRECT2 (Excitation_help) {
+	Melder_help (U"Excitation");
+END2 }
 
-FORM (Excitation_to_Formant, L"From Excitation to Formant", 0)
-	NATURAL (L"Maximum number of formants", L"20")
-	OK
+FORM (Excitation_to_Formant, U"From Excitation to Formant", 0) {
+	NATURAL (U"Maximum number of formants", U"20")
+	OK2
 DO
 	LOOP {
 		iam (Excitation);
-		autoFormant thee = Excitation_to_Formant (me, GET_INTEGER (L"Maximum number of formants"));
+		autoFormant thee = Excitation_to_Formant (me, GET_INTEGER (U"Maximum number of formants"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Excitation_to_Matrix)
+DIRECT2 (Excitation_to_Matrix) {
 	LOOP {
 		iam (Excitation);
 		autoMatrix thee = Excitation_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** FORMANT *****/
 
-DIRECT (Formant_downto_FormantGrid)
+DIRECT2 (Formant_downto_FormantGrid) {
 	LOOP {
 		iam (Formant);
 		autoFormantGrid thee = Formant_downto_FormantGrid (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Formant_downto_FormantTier)
+DIRECT2 (Formant_downto_FormantTier) {
 	LOOP {
 		iam (Formant);
 		autoFormantTier thee = Formant_downto_FormantTier (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Formant_drawSpeckles, L"Draw Formant", L"Formant: Draw speckles...")
+FORM (Formant_drawSpeckles, U"Draw Formant", U"Formant: Draw speckles...") {
 	praat_dia_timeRange (dia);
-	POSITIVE (L"Maximum frequency (Hz)", L"5500.0")
-	REAL (L"Dynamic range (dB)", L"30.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+	POSITIVE (U"Maximum frequency (Hz)", U"5500.0")
+	REAL (U"Dynamic range (dB)", U"30.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (Formant);
 		autoPraatPicture picture;
 		Formant_drawSpeckles (me, GRAPHICS,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_REAL (L"Maximum frequency"),
-			GET_REAL (L"Dynamic range"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_REAL (U"Maximum frequency"),
+			GET_REAL (U"Dynamic range"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-FORM (Formant_drawTracks, L"Draw formant tracks", L"Formant: Draw tracks...")
+FORM (Formant_drawTracks, U"Draw formant tracks", U"Formant: Draw tracks...") {
 	praat_dia_timeRange (dia);
-	POSITIVE (L"Maximum frequency (Hz)", L"5500.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+	POSITIVE (U"Maximum frequency (Hz)", U"5500.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (Formant);
 		autoPraatPicture picture;
 		Formant_drawTracks (me, GRAPHICS,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_REAL (L"Maximum frequency"),
-			GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_REAL (U"Maximum frequency"),
+			GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-FORM (Formant_formula_bandwidths, L"Formant: Formula (bandwidths)", L"Formant: Formula (bandwidths)...")
-	LABEL (L"", L"row is formant number, col is frame number: for row from 1 to nrow do for col from 1 to ncol do B (row, col) :=")
-	TEXTFIELD (L"formula", L"self / 2 ; sharpen all peaks")
-	OK
+FORM (Formant_formula_bandwidths, U"Formant: Formula (bandwidths)", U"Formant: Formula (bandwidths)...") {
+	LABEL (U"", U"row is formant number, col is frame number: for row from 1 to nrow do for col from 1 to ncol do B (row, col) :=")
+	TEXTFIELD (U"formula", U"self / 2 ; sharpen all peaks")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
 		try {
-			Formant_formula_bandwidths (me, GET_STRING (L"formula"), interpreter);
+			Formant_formula_bandwidths (me, GET_STRING (U"formula"), interpreter);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Formant may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Formant_formula_frequencies, L"Formant: Formula (frequencies)", L"Formant: Formula (frequencies)...")
-	LABEL (L"", L"row is formant number, col is frame number: for row from 1 to nrow do for col from 1 to ncol do F (row, col) :=")
-	TEXTFIELD (L"formula", L"if row = 2 then self + 200 else self fi")
-	OK
+FORM (Formant_formula_frequencies, U"Formant: Formula (frequencies)", U"Formant: Formula (frequencies)...") {
+	LABEL (U"", U"row is formant number, col is frame number: for row from 1 to nrow do for col from 1 to ncol do F (row, col) :=")
+	TEXTFIELD (U"formula", U"if row = 2 then self + 200 else self fi")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
 		try {
-			Formant_formula_frequencies (me, GET_STRING (L"formula"), interpreter);
+			Formant_formula_frequencies (me, GET_STRING (U"formula"), interpreter);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Formant may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Formant_getBandwidthAtTime, L"Formant: Get bandwidth", L"Formant: Get bandwidth at time...")
-	NATURAL (L"Formant number", L"1")
-	REAL (L"Time (s)", L"0.5")
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIO (L"Interpolation", 1)
-	RADIOBUTTON (L"Linear")
-	OK
+FORM (Formant_getBandwidthAtTime, U"Formant: Get bandwidth", U"Formant: Get bandwidth at time...") {
+	NATURAL (U"Formant number", U"1")
+	REAL (U"Time (s)", U"0.5")
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Bark")
+	RADIO (U"Interpolation", 1)
+		RADIOBUTTON (U"Linear")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		double bandwidth = Formant_getBandwidthAtTime (me, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"), GET_INTEGER (L"Unit") - 1);
-		Melder_informationReal (bandwidth, GET_STRING (L"Unit"));
+		double bandwidth = Formant_getBandwidthAtTime (me, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"), GET_INTEGER (U"Unit") - 1);
+		Melder_informationReal (bandwidth, GET_STRING (U"Unit"));
 		break;
 	}
-END
+END2 }
 	
-FORM (Formant_getMaximum, L"Formant: Get maximum", L"Formant: Get maximum...")
-	NATURAL (L"Formant number", L"1")
+FORM (Formant_getMaximum, U"Formant: Get maximum", U"Formant: Get maximum...") {
+	NATURAL (U"Formant number", U"1")
 	praat_dia_timeRange (dia);
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	OK
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Bark")
+	RADIO (U"Interpolation", 2)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		double maximum = Formant_getMaximum (me, GET_INTEGER (L"Formant number"),
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Unit") - 1, GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (maximum, GET_STRING (L"Unit"));
+		double maximum = Formant_getMaximum (me, GET_INTEGER (U"Formant number"),
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Unit") - 1, GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (maximum, GET_STRING (U"Unit"));
 		break;
 	}
-END
+END2 }
 
-DIRECT (Formant_getMaximumNumberOfFormants)
+DIRECT2 (Formant_getMaximumNumberOfFormants) {
 	LOOP {
 		iam (Formant);
 		long maximumNumberOfFormants = Formant_getMaxNumFormants (me);
-		Melder_information (Melder_integer (maximumNumberOfFormants), L" (there are at most this many formants in every frame)");
+		Melder_information (maximumNumberOfFormants, U" (there are at most this many formants in every frame)");
 		break;
 	}
-END
+END2 }
 
-FORM (Formant_getMean, L"Formant: Get mean", L"Formant: Get mean...")
-	NATURAL (L"Formant number", L"1")
+FORM (Formant_getMean, U"Formant: Get mean", U"Formant: Get mean...") {
+	NATURAL (U"Formant number", U"1")
 	praat_dia_timeRange (dia);
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	OK
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Bark")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		double mean = Formant_getMean (me, GET_INTEGER (L"Formant number"),
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Unit") - 1);
-		Melder_informationReal (mean, GET_STRING (L"Unit"));
+		double mean = Formant_getMean (me, GET_INTEGER (U"Formant number"),
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Unit") - 1);
+		Melder_informationReal (mean, GET_STRING (U"Unit"));
 		break;
 	}
-END
+END2 }
 
-FORM (Formant_getMinimum, L"Formant: Get minimum", L"Formant: Get minimum...")
-	NATURAL (L"Formant number", L"1")
+FORM (Formant_getMinimum, U"Formant: Get minimum", U"Formant: Get minimum...") {
+	NATURAL (U"Formant number", U"1")
 	praat_dia_timeRange (dia);
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	OK
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Bark")
+	RADIO (U"Interpolation", 2)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		double minimum = Formant_getMinimum (me, GET_INTEGER (L"Formant number"),
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Unit") - 1,
-			GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (minimum, GET_STRING (L"Unit"));
+		double minimum = Formant_getMinimum (me, GET_INTEGER (U"Formant number"),
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Unit") - 1,
+			GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (minimum, GET_STRING (U"Unit"));
 		break;
 	}
-END
+END2 }
 
-DIRECT (Formant_getMinimumNumberOfFormants)
+DIRECT2 (Formant_getMinimumNumberOfFormants) {
 	LOOP {
 		iam (Formant);
 		long minimumNumberOfFormants = Formant_getMinNumFormants (me);
-		Melder_information (Melder_integer (minimumNumberOfFormants), L" (there are at least this many formants in every frame)");
+		Melder_information (minimumNumberOfFormants, U" (there are at least this many formants in every frame)");
 		break;
 	}
-END
+END2 }
 
-FORM (Formant_getNumberOfFormants, L"Formant: Get number of formants", L"Formant: Get number of formants...")
-	NATURAL (L"Frame number", L"1")
-	OK
+FORM (Formant_getNumberOfFormants, U"Formant: Get number of formants", U"Formant: Get number of formants...") {
+	NATURAL (U"Frame number", U"1")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		long frame = GET_INTEGER (L"Frame number");
-		if (frame > my nx) Melder_throw ("There is no frame ", frame, " in a Formant with only ", my nx, " frames.");
-		Melder_information (Melder_integer (my d_frames [frame]. nFormants), L" formants");
+		long frame = GET_INTEGER (U"Frame number");
+		if (frame > my nx) Melder_throw (U"There is no frame ", frame, U" in a Formant with only ", my nx, U" frames.");
+		Melder_information (my d_frames [frame]. nFormants, U" formants");
 		break;
 	}
-END
+END2 }
 
-FORM (Formant_getQuantile, L"Formant: Get quantile", 0)
-	NATURAL (L"Formant number", L"1")
+FORM (Formant_getQuantile, U"Formant: Get quantile", 0) {
+	NATURAL (U"Formant number", U"1")
 	praat_dia_timeRange (dia);
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	REAL (L"Quantile", L"0.50 (= median)")
-	OK
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Bark")
+	REAL (U"Quantile", U"0.50 (= median)")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		double quantile = Formant_getQuantile (me, GET_INTEGER (L"Formant number"),
-			GET_REAL (L"Quantile"), GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Unit") - 1);
-		Melder_informationReal (quantile, GET_STRING (L"Unit"));
+		double quantile = Formant_getQuantile (me, GET_INTEGER (U"Formant number"),
+			GET_REAL (U"Quantile"), GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Unit") - 1);
+		Melder_informationReal (quantile, GET_STRING (U"Unit"));
 		break;
 	}
-END
+END2 }
 
-FORM (Formant_getQuantileOfBandwidth, L"Formant: Get quantile of bandwidth", 0)
-	NATURAL (L"Formant number", L"1")
+FORM (Formant_getQuantileOfBandwidth, U"Formant: Get quantile of bandwidth", 0) {
+	NATURAL (U"Formant number", U"1")
 	praat_dia_timeRange (dia);
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	REAL (L"Quantile", L"0.50 (= median)")
-	OK
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Bark")
+	REAL (U"Quantile", U"0.50 (= median)")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		double quantile = Formant_getQuantileOfBandwidth (me, GET_INTEGER (L"Formant number"),
-			GET_REAL (L"Quantile"), GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Unit") - 1);
-		Melder_informationReal (quantile, GET_STRING (L"Unit"));
+		double quantile = Formant_getQuantileOfBandwidth (me, GET_INTEGER (U"Formant number"),
+			GET_REAL (U"Quantile"), GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Unit") - 1);
+		Melder_informationReal (quantile, GET_STRING (U"Unit"));
 		break;
 	}
-END
+END2 }
 
-FORM (Formant_getStandardDeviation, L"Formant: Get standard deviation", 0)
-	NATURAL (L"Formant number", L"1")
+FORM (Formant_getStandardDeviation, U"Formant: Get standard deviation", 0) {
+	NATURAL (U"Formant number", U"1")
 	praat_dia_timeRange (dia);
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	OK
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Bark")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		double stdev = Formant_getStandardDeviation (me, GET_INTEGER (L"Formant number"),
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Unit") - 1);
-		Melder_informationReal (stdev, GET_STRING (L"Unit"));
+		double stdev = Formant_getStandardDeviation (me, GET_INTEGER (U"Formant number"),
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Unit") - 1);
+		Melder_informationReal (stdev, GET_STRING (U"Unit"));
 		break;
 	}
-END
+END2 }
 
-FORM (Formant_getTimeOfMaximum, L"Formant: Get time of maximum", L"Formant: Get time of maximum...")
-	NATURAL (L"Formant number", L"1")
+FORM (Formant_getTimeOfMaximum, U"Formant: Get time of maximum", U"Formant: Get time of maximum...") {
+	NATURAL (U"Formant number", U"1")
 	praat_dia_timeRange (dia);
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	OK
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Bark")
+	RADIO (U"Interpolation", 2)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		double time = Formant_getTimeOfMaximum (me, GET_INTEGER (L"Formant number"),
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_INTEGER (L"Unit") - 1, GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (time, L"seconds");
+		double time = Formant_getTimeOfMaximum (me, GET_INTEGER (U"Formant number"),
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_INTEGER (U"Unit") - 1, GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (time, U"seconds");
 		break;
 	}
-END
+END2 }
 
-FORM (Formant_getTimeOfMinimum, L"Formant: Get time of minimum", L"Formant: Get time of minimum...")
-	NATURAL (L"Formant number", L"1")
+FORM (Formant_getTimeOfMinimum, U"Formant: Get time of minimum", U"Formant: Get time of minimum...") {
+	NATURAL (U"Formant number", U"1")
 	praat_dia_timeRange (dia);
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	OK
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Bark")
+	RADIO (U"Interpolation", 2)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		double time = Formant_getTimeOfMinimum (me, GET_INTEGER (L"Formant number"),
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_INTEGER (L"Unit") - 1, GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (time, L"seconds");
+		double time = Formant_getTimeOfMinimum (me, GET_INTEGER (U"Formant number"),
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_INTEGER (U"Unit") - 1, GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (time, U"seconds");
 		break;
 	}
-END
+END2 }
 
-FORM (Formant_getValueAtTime, L"Formant: Get value", L"Formant: Get value at time...")
-	NATURAL (L"Formant number", L"1")
-	REAL (L"Time (s)", L"0.5")
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Bark")
-	RADIO (L"Interpolation", 1)
-	RADIOBUTTON (L"Linear")
-	OK
+FORM (Formant_getValueAtTime, U"Formant: Get value", U"Formant: Get value at time...") {
+	NATURAL (U"Formant number", U"1")
+	REAL (U"Time (s)", U"0.5")
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Bark")
+	RADIO (U"Interpolation", 1)
+		RADIOBUTTON (U"Linear")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		double value = Formant_getValueAtTime (me, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"), GET_INTEGER (L"Unit") - 1);
-		Melder_informationReal (value, GET_STRING (L"Unit"));
+		double value = Formant_getValueAtTime (me, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"), GET_INTEGER (U"Unit") - 1);
+		Melder_informationReal (value, GET_STRING (U"Unit"));
 		break;
 	}
-END
+END2 }
 	
-DIRECT (Formant_help) Melder_help (L"Formant"); END
-
-FORM (Formant_downto_Table, L"Formant: Down to Table", 0)
-	BOOLEAN (L"Include frame number", false)
-	BOOLEAN (L"Include time", true)
-	NATURAL (L"Time decimals", L"6")
-	BOOLEAN (L"Include intensity", false)
-	NATURAL (L"Intensity decimals", L"3")
-	BOOLEAN (L"Include number of formants", true)
-	NATURAL (L"Frequency decimals", L"3")
-	BOOLEAN (L"Include bandwidths", true)
-	OK
+DIRECT2 (Formant_help) {
+	Melder_help (U"Formant");
+END2 }
+
+FORM (Formant_downto_Table, U"Formant: Down to Table", 0) {
+	BOOLEAN (U"Include frame number", false)
+	BOOLEAN (U"Include time", true)
+	NATURAL (U"Time decimals", U"6")
+	BOOLEAN (U"Include intensity", false)
+	NATURAL (U"Intensity decimals", U"3")
+	BOOLEAN (U"Include number of formants", true)
+	NATURAL (U"Frequency decimals", U"3")
+	BOOLEAN (U"Include bandwidths", true)
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		autoTable thee = Formant_downto_Table (me, GET_INTEGER (L"Include frame number"),
-			GET_INTEGER (L"Include time"), GET_INTEGER (L"Time decimals"),
-			GET_INTEGER (L"Include intensity"), GET_INTEGER (L"Intensity decimals"),
-			GET_INTEGER (L"Include number of formants"), GET_INTEGER (L"Frequency decimals"),
-			GET_INTEGER (L"Include bandwidths"));
+		autoTable thee = Formant_downto_Table (me, GET_INTEGER (U"Include frame number"),
+			GET_INTEGER (U"Include time"), GET_INTEGER (U"Time decimals"),
+			GET_INTEGER (U"Include intensity"), GET_INTEGER (U"Intensity decimals"),
+			GET_INTEGER (U"Include number of formants"), GET_INTEGER (U"Frequency decimals"),
+			GET_INTEGER (U"Include bandwidths"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Formant_list, L"Formant: List", 0)
-	BOOLEAN (L"Include frame number", false)
-	BOOLEAN (L"Include time", true)
-	NATURAL (L"Time decimals", L"6")
-	BOOLEAN (L"Include intensity", false)
-	NATURAL (L"Intensity decimals", L"3")
-	BOOLEAN (L"Include number of formants", true)
-	NATURAL (L"Frequency decimals", L"3")
-	BOOLEAN (L"Include bandwidths", true)
-	OK
+FORM (Formant_list, U"Formant: List", 0) {
+	BOOLEAN (U"Include frame number", false)
+	BOOLEAN (U"Include time", true)
+	NATURAL (U"Time decimals", U"6")
+	BOOLEAN (U"Include intensity", false)
+	NATURAL (U"Intensity decimals", U"3")
+	BOOLEAN (U"Include number of formants", true)
+	NATURAL (U"Frequency decimals", U"3")
+	BOOLEAN (U"Include bandwidths", true)
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		Formant_list (me, GET_INTEGER (L"Include frame number"),
-			GET_INTEGER (L"Include time"), GET_INTEGER (L"Time decimals"),
-			GET_INTEGER (L"Include intensity"), GET_INTEGER (L"Intensity decimals"),
-			GET_INTEGER (L"Include number of formants"), GET_INTEGER (L"Frequency decimals"),
-			GET_INTEGER (L"Include bandwidths"));
+		Formant_list (me, GET_INTEGER (U"Include frame number"),
+			GET_INTEGER (U"Include time"), GET_INTEGER (U"Time decimals"),
+			GET_INTEGER (U"Include intensity"), GET_INTEGER (U"Intensity decimals"),
+			GET_INTEGER (U"Include number of formants"), GET_INTEGER (U"Frequency decimals"),
+			GET_INTEGER (U"Include bandwidths"));
 		break;
 	}
-END
+END2 }
 
-FORM (Formant_scatterPlot, L"Formant: Scatter plot", 0)
+FORM (Formant_scatterPlot, U"Formant: Scatter plot", 0) {
 	praat_dia_timeRange (dia);
-	NATURAL (L"Horizontal formant number", L"2")
-	REAL (L"left Horizontal range (Hz)", L"3000")
-	REAL (L"right Horizontal range (Hz)", L"400")
-	NATURAL (L"Vertical formant number", L"1")
-	REAL (L"left Vertical range (Hz)", L"1500")
-	REAL (L"right Vertical range (Hz)", L"100")
-	POSITIVE (L"Mark size (mm)", L"1.0")
-	BOOLEAN (L"Garnish", 1)
-	SENTENCE (L"Mark string (+xo.)", L"+")
-	OK
+	NATURAL (U"Horizontal formant number", U"2")
+	REAL (U"left Horizontal range (Hz)", U"3000")
+	REAL (U"right Horizontal range (Hz)", U"400")
+	NATURAL (U"Vertical formant number", U"1")
+	REAL (U"left Vertical range (Hz)", U"1500")
+	REAL (U"right Vertical range (Hz)", U"100")
+	POSITIVE (U"Mark size (mm)", U"1.0")
+	BOOLEAN (U"Garnish", 1)
+	SENTENCE (U"Mark string (+xo.)", U"+")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
 		autoPraatPicture picture;
 		Formant_scatterPlot (me, GRAPHICS,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_INTEGER (L"Horizontal formant number"),
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_INTEGER (L"Vertical formant number"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_REAL (L"Mark size"), GET_STRING (L"Mark string"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_INTEGER (U"Horizontal formant number"),
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_INTEGER (U"Vertical formant number"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_REAL (U"Mark size"), GET_STRING (U"Mark string"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-DIRECT (Formant_sort)
+DIRECT2 (Formant_sort) {
 	LOOP {
 		iam (Formant);
 		Formant_sort (me);
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (Formant_to_Matrix, L"From Formant to Matrix", 0)
-	INTEGER (L"Formant", L"1")
-	OK
+FORM (Formant_to_Matrix, U"From Formant to Matrix", 0) {
+	INTEGER (U"Formant", U"1")
+	OK2
 DO
 	LOOP {
 		iam (Formant);
-		autoMatrix thee = Formant_to_Matrix (me, GET_INTEGER (L"Formant"));
+		autoMatrix thee = Formant_to_Matrix (me, GET_INTEGER (U"Formant"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Formant_tracker, L"Formant tracker", L"Formant: Track...")
-	NATURAL (L"Number of tracks (1-5)", L"3")
-	REAL (L"Reference F1 (Hz)", L"550")
-	REAL (L"Reference F2 (Hz)", L"1650")
-	REAL (L"Reference F3 (Hz)", L"2750")
-	REAL (L"Reference F4 (Hz)", L"3850")
-	REAL (L"Reference F5 (Hz)", L"4950")
-	REAL (L"Frequency cost (/kHz)", L"1.0")
-	REAL (L"Bandwidth cost", L"1.0")
-	REAL (L"Transition cost (/octave)", L"1.0")
-	OK
-DO
-	long numberOfTracks = GET_INTEGER (L"Number of tracks");
-	if (numberOfTracks > 5) Melder_throw ("Number of tracks cannot be more than 5.");
+FORM (Formant_tracker, U"Formant tracker", U"Formant: Track...") {
+	NATURAL (U"Number of tracks (1-5)", U"3")
+	REAL (U"Reference F1 (Hz)", U"550")
+	REAL (U"Reference F2 (Hz)", U"1650")
+	REAL (U"Reference F3 (Hz)", U"2750")
+	REAL (U"Reference F4 (Hz)", U"3850")
+	REAL (U"Reference F5 (Hz)", U"4950")
+	REAL (U"Frequency cost (/kHz)", U"1.0")
+	REAL (U"Bandwidth cost", U"1.0")
+	REAL (U"Transition cost (/octave)", U"1.0")
+	OK2
+DO
+	long numberOfTracks = GET_INTEGER (U"Number of tracks");
+	if (numberOfTracks > 5) Melder_throw (U"Number of tracks cannot be more than 5.");
 	LOOP {
 		iam (Formant);
-		autoFormant thee = Formant_tracker (me, GET_INTEGER (L"Number of tracks"),
-			GET_REAL (L"Reference F1"), GET_REAL (L"Reference F2"),
-			GET_REAL (L"Reference F3"), GET_REAL (L"Reference F4"),
-			GET_REAL (L"Reference F5"), GET_REAL (L"Frequency cost"),
-			GET_REAL (L"Bandwidth cost"), GET_REAL (L"Transition cost"));
+		autoFormant thee = Formant_tracker (me, GET_INTEGER (U"Number of tracks"),
+			GET_REAL (U"Reference F1"), GET_REAL (U"Reference F2"),
+			GET_REAL (U"Reference F3"), GET_REAL (U"Reference F4"),
+			GET_REAL (U"Reference F5"), GET_REAL (U"Frequency cost"),
+			GET_REAL (U"Bandwidth cost"), GET_REAL (U"Transition cost"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** FORMANT & POINTPROCESS *****/
 
-DIRECT (Formant_PointProcess_to_FormantTier)
+DIRECT2 (Formant_PointProcess_to_FormantTier) {
 	Formant formant = NULL;
 	PointProcess point = NULL;
 	LOOP {
@@ -1148,12 +1158,12 @@ DIRECT (Formant_PointProcess_to_FormantTier)
 		if (formant && point) break;
 	}
 	autoFormantTier thee = Formant_PointProcess_to_FormantTier (formant, point);
-	praat_new (thee.transfer(), formant -> name, L"_", point -> name);
-END
+	praat_new (thee.transfer(), formant -> name, U"_", point -> name);
+END2 }
 
 /***** FORMANT & SOUND *****/
 
-DIRECT (Sound_Formant_filter)
+DIRECT2 (Sound_Formant_filter) {
 	Sound sound = NULL;
 	Formant formant = NULL;
 	LOOP {
@@ -1162,10 +1172,10 @@ DIRECT (Sound_Formant_filter)
 		if (sound && formant) break;
 	}
 	autoSound thee = Sound_Formant_filter (sound, formant);
-	praat_new (thee.transfer(), sound -> name, L"_filt");
-END
+	praat_new (thee.transfer(), sound -> name, U"_filt");
+END2 }
 
-DIRECT (Sound_Formant_filter_noscale)
+DIRECT2 (Sound_Formant_filter_noscale) {
 	Sound sound = NULL;
 	Formant formant = NULL;
 	LOOP {
@@ -1174,159 +1184,161 @@ DIRECT (Sound_Formant_filter_noscale)
 		if (sound && formant) break;
 	}
 	autoSound thee = Sound_Formant_filter_noscale (sound, formant);
-	praat_new (thee.transfer(), sound -> name, L"_filt");
-END
+	praat_new (thee.transfer(), sound -> name, U"_filt");
+END2 }
 
 /***** FORMANTGRID *****/
 
-FORM (FormantGrid_addBandwidthPoint, L"FormantGrid: Add bandwidth point", L"FormantGrid: Add bandwidth point...")
-	NATURAL (L"Formant number", L"1")
-	REAL (L"Time (s)", L"0.5")
-	POSITIVE (L"Bandwidth (Hz)", L"100")
-	OK
+FORM (FormantGrid_addBandwidthPoint, U"FormantGrid: Add bandwidth point", U"FormantGrid: Add bandwidth point...") {
+	NATURAL (U"Formant number", U"1")
+	REAL (U"Time (s)", U"0.5")
+	POSITIVE (U"Bandwidth (Hz)", U"100")
+	OK2
 DO
 	LOOP {
 		iam (FormantGrid);
-		FormantGrid_addBandwidthPoint (me, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"), GET_REAL (L"Bandwidth"));
+		FormantGrid_addBandwidthPoint (me, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"), GET_REAL (U"Bandwidth"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (FormantGrid_addFormantPoint, L"FormantGrid: Add formant point", L"FormantGrid: Add formant point...")
-	NATURAL (L"Formant number", L"1")
-	REAL (L"Time (s)", L"0.5")
-	POSITIVE (L"Frequency (Hz)", L"550")
-	OK
+FORM (FormantGrid_addFormantPoint, U"FormantGrid: Add formant point", U"FormantGrid: Add formant point...") {
+	NATURAL (U"Formant number", U"1")
+	REAL (U"Time (s)", U"0.5")
+	POSITIVE (U"Frequency (Hz)", U"550")
+	OK2
 DO
 	LOOP {
 		iam (FormantGrid);
-		FormantGrid_addFormantPoint (me, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"), GET_REAL (L"Frequency"));
+		FormantGrid_addFormantPoint (me, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"), GET_REAL (U"Frequency"));
 		praat_dataChanged (OBJECT);
 	}
-END
-
-FORM (FormantGrid_create, L"Create FormantGrid", NULL)
-	WORD (L"Name", L"schwa")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	NATURAL (L"Number of formants", L"10")
-	POSITIVE (L"Initial first formant (Hz)", L"550")
-	POSITIVE (L"Initial formant spacing (Hz)", L"1100")
-	REAL (L"Initial first bandwidth (Hz)", L"60")
-	REAL (L"Initial bandwidth spacing (Hz)", L"50")
-	OK
-DO
-	double startTime = GET_REAL (L"Start time"), endTime = GET_REAL (L"End time");
-	if (endTime <= startTime) Melder_throw ("End time must be greater than start time.");
-	autoFormantGrid thee = FormantGrid_create (startTime, endTime, GET_INTEGER (L"Number of formants"),
-		GET_REAL (L"Initial first formant"), GET_REAL (L"Initial formant spacing"),
-		GET_REAL (L"Initial first bandwidth"), GET_REAL (L"Initial bandwidth spacing"));
-	praat_new (thee.transfer(), GET_STRING (L"Name"));
-END
-
-static void cb_FormantGridEditor_publish (Editor me, void *closure, Data publish) {
+END2 }
+
+FORM (FormantGrid_create, U"Create FormantGrid", NULL) {
+	WORD (U"Name", U"schwa")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	NATURAL (U"Number of formants", U"10")
+	POSITIVE (U"Initial first formant (Hz)", U"550")
+	POSITIVE (U"Initial formant spacing (Hz)", U"1100")
+	REAL (U"Initial first bandwidth (Hz)", U"60")
+	REAL (U"Initial bandwidth spacing (Hz)", U"50")
+	OK2
+DO
+	double startTime = GET_REAL (U"Start time"), endTime = GET_REAL (U"End time");
+	if (endTime <= startTime) Melder_throw (U"End time must be greater than start time.");
+	autoFormantGrid thee = FormantGrid_create (startTime, endTime, GET_INTEGER (U"Number of formants"),
+		GET_REAL (U"Initial first formant"), GET_REAL (U"Initial formant spacing"),
+		GET_REAL (U"Initial first bandwidth"), GET_REAL (U"Initial bandwidth spacing"));
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
+END2 }
+
+static void cb_FormantGridEditor_publish (Editor me, void *closure, Daata publish) {
 	(void) me;
 	(void) closure;
 	/*
 	 * Keep the gate for error handling.
 	 */
 	try {
-		praat_new (publish, L"fromFormantGridEditor");
+		praat_new (publish, U"fromFormantGridEditor");
 		praat_updateSelection ();
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 }
-DIRECT (FormantGrid_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a FormantGrid from batch.");
+DIRECT2 (FormantGrid_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a FormantGrid from batch.");
 	LOOP {
 		iam (FormantGrid);
 		autoFormantGridEditor editor = FormantGridEditor_create (ID_AND_FULL_NAME, me);
-		editor -> setPublicationCallback (cb_FormantGridEditor_publish, NULL);
+		Editor_setPublicationCallback (editor.peek(), cb_FormantGridEditor_publish, NULL);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-FORM (FormantGrid_formula_bandwidths, L"FormantGrid: Formula (bandwidths)", L"Formant: Formula (bandwidths)...")
-	LABEL (L"", L"row is formant number, col is point number: for row from 1 to nrow do for col from 1 to ncol do B (row, col) :=")
-	LABEL (L"", L"self [] is the FormantGrid itself, so it returns frequencies, not bandwidths!")
-	TEXTFIELD (L"formula", L"self / 10 ; one tenth of the formant frequency")
-	OK
+FORM (FormantGrid_formula_bandwidths, U"FormantGrid: Formula (bandwidths)", U"Formant: Formula (bandwidths)...") {
+	LABEL (U"", U"row is formant number, col is point number: for row from 1 to nrow do for col from 1 to ncol do B (row, col) :=")
+	LABEL (U"", U"self [] is the FormantGrid itself, so it returns frequencies, not bandwidths!")
+	TEXTFIELD (U"formula", U"self / 10 ; one tenth of the formant frequency")
+	OK2
 DO
 	LOOP {
 		iam (FormantGrid);
 		try {
-			FormantGrid_formula_bandwidths (me, GET_STRING (L"formula"), interpreter, NULL);
+			FormantGrid_formula_bandwidths (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the FormantGrid may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (FormantGrid_formula_frequencies, L"FormantGrid: Formula (frequencies)", L"Formant: Formula (frequencies)...")
-	LABEL (L"", L"row is formant number, col is point number: for row from 1 to nrow do for col from 1 to ncol do F (row, col) :=")
-	TEXTFIELD (L"formula", L"if row = 2 then self + 200 else self fi")
-	OK
+FORM (FormantGrid_formula_frequencies, U"FormantGrid: Formula (frequencies)", U"Formant: Formula (frequencies)...") {
+	LABEL (U"", U"row is formant number, col is point number: for row from 1 to nrow do for col from 1 to ncol do F (row, col) :=")
+	TEXTFIELD (U"formula", U"if row = 2 then self + 200 else self fi")
+	OK2
 DO
 	LOOP {
 		iam (FormantGrid);
 		try {
-			FormantGrid_formula_frequencies (me, GET_STRING (L"formula"), interpreter, NULL);
+			FormantGrid_formula_frequencies (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the FormantGrid may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-DIRECT (FormantGrid_help) Melder_help (L"FormantGrid"); END
+DIRECT2 (FormantGrid_help) {
+	Melder_help (U"FormantGrid");
+END2 }
 
-FORM (FormantGrid_removeBandwidthPointsBetween, L"Remove bandwidth points between", L"FormantGrid: Remove bandwidth points between...")
-	NATURAL (L"Formant number", L"1")
-	REAL (L"From time (s)", L"0.3")
-	REAL (L"To time (s)", L"0.7")
-	OK
+FORM (FormantGrid_removeBandwidthPointsBetween, U"Remove bandwidth points between", U"FormantGrid: Remove bandwidth points between...") {
+	NATURAL (U"Formant number", U"1")
+	REAL (U"From time (s)", U"0.3")
+	REAL (U"To time (s)", U"0.7")
+	OK2
 DO
 	LOOP {
 		iam (FormantGrid);
-		FormantGrid_removeBandwidthPointsBetween (me, GET_INTEGER (L"Formant number"), GET_REAL (L"From time"), GET_REAL (L"To time"));
+		FormantGrid_removeBandwidthPointsBetween (me, GET_INTEGER (U"Formant number"), GET_REAL (U"From time"), GET_REAL (U"To time"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (FormantGrid_removeFormantPointsBetween, L"Remove formant points between", L"FormantGrid: Remove formant points between...")
-	NATURAL (L"Formant number", L"1")
-	REAL (L"From time (s)", L"0.3")
-	REAL (L"To time (s)", L"0.7")
-	OK
+FORM (FormantGrid_removeFormantPointsBetween, U"Remove formant points between", U"FormantGrid: Remove formant points between...") {
+	NATURAL (U"Formant number", U"1")
+	REAL (U"From time (s)", U"0.3")
+	REAL (U"To time (s)", U"0.7")
+	OK2
 DO
 	LOOP {
 		iam (FormantGrid);
-		FormantGrid_removeFormantPointsBetween (me, GET_INTEGER (L"Formant number"), GET_REAL (L"From time"), GET_REAL (L"To time"));
+		FormantGrid_removeFormantPointsBetween (me, GET_INTEGER (U"Formant number"), GET_REAL (U"From time"), GET_REAL (U"To time"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (FormantGrid_to_Formant, L"FormantGrid: To Formant", 0)
-	POSITIVE (L"Time step (s)", L"0.01")
-	REAL (L"Intensity (Pa\u00B2)", L"0.1")
-	OK
+FORM (FormantGrid_to_Formant, U"FormantGrid: To Formant", 0) {
+	POSITIVE (U"Time step (s)", U"0.01")
+	REAL (U"Intensity (Pa\u00B2)", U"0.1")
+	OK2
 DO
-	double intensity = GET_REAL (L"Intensity");
-	if (intensity < 0.0) Melder_throw ("Intensity cannot be negative.");
+	double intensity = GET_REAL (U"Intensity");
+	if (intensity < 0.0) Melder_throw (U"Intensity cannot be negative.");
 	LOOP {
 		iam (FormantGrid);
-		autoFormant thee = FormantGrid_to_Formant (me, GET_REAL (L"Time step"), intensity);
+		autoFormant thee = FormantGrid_to_Formant (me, GET_REAL (U"Time step"), intensity);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** FORMANTGRID & SOUND *****/
 
-DIRECT (Sound_FormantGrid_filter)
+DIRECT2 (Sound_FormantGrid_filter) {
 	Sound me = NULL;
 	FormantGrid grid = NULL;
 	LOOP {
@@ -1335,10 +1347,10 @@ DIRECT (Sound_FormantGrid_filter)
 		if (me && grid) break;   // OPTIMIZE
 	}
 	autoSound thee = Sound_FormantGrid_filter (me, grid);
-	praat_new (thee.transfer(), my name, L"_filt");
-END
+	praat_new (thee.transfer(), my name, U"_filt");
+END2 }
 
-DIRECT (Sound_FormantGrid_filter_noscale)
+DIRECT2 (Sound_FormantGrid_filter_noscale) {
 	Sound me = NULL;
 	FormantGrid grid = NULL;
 	LOOP {
@@ -1347,24 +1359,24 @@ DIRECT (Sound_FormantGrid_filter_noscale)
 		if (me && grid) break;   // OPTIMIZE
 	}
 	autoSound thee = Sound_FormantGrid_filter_noscale (me, grid);
-	praat_new (thee.transfer(), my name, L"_filt");
-END
+	praat_new (thee.transfer(), my name, U"_filt");
+END2 }
 
 /***** FORMANTTIER *****/
 
-FORM (FormantTier_addPoint, L"Add one point", L"FormantTier: Add point...")
-	REAL (L"Time (s)", L"0.5")
-	LABEL (L"", L"Frequencies and bandwidths (Hz):")
-	TEXTFIELD (L"fb pairs", L"500 50 1500 100 2500 150 3500 200 4500 300")
-	OK
+FORM (FormantTier_addPoint, U"Add one point", U"FormantTier: Add point...") {
+	REAL (U"Time (s)", U"0.5")
+	LABEL (U"", U"Frequencies and bandwidths (Hz):")
+	TEXTFIELD (U"fb pairs", U"500 50 1500 100 2500 150 3500 200 4500 300")
+	OK2
 DO
-	autoFormantPoint point = FormantPoint_create (GET_REAL (L"Time"));
+	autoFormantPoint point = FormantPoint_create (GET_REAL (U"Time"));
 	double *f = point -> formant, *b = point -> bandwidth;
-	char *fbpairs = Melder_peekWcsToUtf8 (GET_STRING (L"fb pairs"));
+	char *fbpairs = Melder_peek32to8 (GET_STRING (U"fb pairs"));
 	int numberOfFormants = sscanf (fbpairs, "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
 		f, b, f+1, b+1, f+2, b+2, f+3, b+3, f+4, b+4, f+5, b+5, f+6, b+6, f+7, b+7, f+8, b+8, f+9, b+9) / 2;
 	if (numberOfFormants < 1)
-		Melder_throw (L"Number of formant-bandwidth pairs must be at least 1.");
+		Melder_throw (U"Number of formant-bandwidth pairs must be at least 1.");
 	point -> numberOfFormants = numberOfFormants;
 	LOOP {
 		iam (FormantTier);
@@ -1372,74 +1384,76 @@ DO
 		AnyTier_addPoint (me, point2.transfer());
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (FormantTier_create, L"Create empty FormantTier", NULL)
-	WORD (L"Name", L"empty")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	OK
+FORM (FormantTier_create, U"Create empty FormantTier", NULL) {
+	WORD (U"Name", U"empty")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	OK2
 DO
-	double startTime = GET_REAL (L"Start time"), endTime = GET_REAL (L"End time");
-	if (endTime <= startTime) Melder_throw ("End time must be greater than start time.");
+	double startTime = GET_REAL (U"Start time"), endTime = GET_REAL (U"End time");
+	if (endTime <= startTime) Melder_throw (U"End time must be greater than start time.");
 	autoFormantTier thee = FormantTier_create (startTime, endTime);
-	praat_new (thee.transfer(), GET_STRING (L"Name"));
-END
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
+END2 }
 
-FORM (FormantTier_downto_TableOfReal, L"Down to TableOfReal", 0)
-	BOOLEAN (L"Include formants", 1)
-	BOOLEAN (L"Include bandwidths", 0)
-	OK
+FORM (FormantTier_downto_TableOfReal, U"Down to TableOfReal", 0) {
+	BOOLEAN (U"Include formants", 1)
+	BOOLEAN (U"Include bandwidths", 0)
+	OK2
 DO
 	LOOP {
 		iam (FormantTier);
-		autoTableOfReal thee = FormantTier_downto_TableOfReal (me, GET_INTEGER (L"Include formants"), GET_INTEGER (L"Include bandwidths"));
+		autoTableOfReal thee = FormantTier_downto_TableOfReal (me, GET_INTEGER (U"Include formants"), GET_INTEGER (U"Include bandwidths"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (FormantTier_getBandwidthAtTime, L"FormantTier: Get bandwidth", L"FormantTier: Get bandwidth at time...")
-	NATURAL (L"Formant number", L"1")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (FormantTier_getBandwidthAtTime, U"FormantTier: Get bandwidth", U"FormantTier: Get bandwidth at time...") {
+	NATURAL (U"Formant number", U"1")
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (FormantTier);
-		double bandwidth = FormantTier_getBandwidthAtTime (me, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"));
-		Melder_informationReal (bandwidth, L"hertz");
+		double bandwidth = FormantTier_getBandwidthAtTime (me, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"));
+		Melder_informationReal (bandwidth, U"hertz");
 	}
-END
+END2 }
 	
-FORM (FormantTier_getValueAtTime, L"FormantTier: Get value", L"FormantTier: Get value at time...")
-	NATURAL (L"Formant number", L"1")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (FormantTier_getValueAtTime, U"FormantTier: Get value", U"FormantTier: Get value at time...") {
+	NATURAL (U"Formant number", U"1")
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (FormantTier);
-		double value = FormantTier_getValueAtTime (me, GET_INTEGER (L"Formant number"), GET_REAL (L"Time"));
-		Melder_informationReal (value, L"hertz");
+		double value = FormantTier_getValueAtTime (me, GET_INTEGER (U"Formant number"), GET_REAL (U"Time"));
+		Melder_informationReal (value, U"hertz");
 	}
-END
+END2 }
 	
-DIRECT (FormantTier_help) Melder_help (L"FormantTier"); END
+DIRECT2 (FormantTier_help) {
+	Melder_help (U"FormantTier");
+END2 }
 
-FORM (FormantTier_speckle, L"Draw FormantTier", 0)
+FORM (FormantTier_speckle, U"Draw FormantTier", 0) {
 	praat_dia_timeRange (dia);
-	POSITIVE (L"Maximum frequency (Hz)", L"5500.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+	POSITIVE (U"Maximum frequency (Hz)", U"5500.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (FormantTier);
 		autoPraatPicture picture;
-		FormantTier_speckle (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_REAL (L"Maximum frequency"), GET_INTEGER (L"Garnish"));
+		FormantTier_speckle (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_REAL (U"Maximum frequency"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
 /***** FORMANTTIER & SOUND *****/
 
-DIRECT (Sound_FormantTier_filter)
+DIRECT2 (Sound_FormantTier_filter) {
 	Sound me = NULL;
 	FormantTier tier = NULL;
 	LOOP {
@@ -1448,10 +1462,10 @@ DIRECT (Sound_FormantTier_filter)
 		if (me && tier) break;   // OPTIMIZE
 	}
 	autoSound thee = Sound_FormantTier_filter (me, tier);
-	praat_new (thee.transfer(), my name, L"_filt");
-END
+	praat_new (thee.transfer(), my name, U"_filt");
+END2 }
 
-DIRECT (Sound_FormantTier_filter_noscale)
+DIRECT2 (Sound_FormantTier_filter_noscale) {
 	Sound me = NULL;
 	FormantTier tier = NULL;
 	LOOP {
@@ -1460,353 +1474,357 @@ DIRECT (Sound_FormantTier_filter_noscale)
 		if (me && tier) break;   // OPTIMIZE
 	}
 	autoSound thee = Sound_FormantTier_filter_noscale (me, tier);
-	praat_new (thee.transfer(), my name, L"_filt");
-END
+	praat_new (thee.transfer(), my name, U"_filt");
+END2 }
 
 /***** HARMONICITY *****/
 
-FORM (Harmonicity_draw, L"Draw harmonicity", 0)
+FORM (Harmonicity_draw, U"Draw harmonicity", 0) {
 	praat_dia_timeRange (dia);
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0 (= auto)")
-	OK
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0 (= auto)")
+	OK2
 DO
 	LOOP {
 		iam (Harmonicity);
 		autoPraatPicture picture;
 		Matrix_drawRows (me, GRAPHICS,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), 0.0, 0.0,
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"));
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), 0.0, 0.0,
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"));
 	}
-END
+END2 }
 
-FORM (Harmonicity_formula, L"Harmonicity Formula", L"Harmonicity: Formula...")
-	LABEL (L"label", L"x is time")
-	LABEL (L"label", L"for col := 1 to ncol do { self [col] := `formula' ; x := x + dx }")
-	TEXTFIELD (L"formula", L"self")
-	OK
+FORM (Harmonicity_formula, U"Harmonicity Formula", U"Harmonicity: Formula...") {
+	LABEL (U"label", U"x is time")
+	LABEL (U"label", U"for col := 1 to ncol do { self [col] := `formula' ; x := x + dx }")
+	TEXTFIELD (U"formula", U"self")
+	OK2
 DO
 	LOOP {
 		iam (Harmonicity);
 		try {
-			Matrix_formula ((Matrix) me, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula ((Matrix) me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Harmonicity may have partically changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Harmonicity_getMaximum, L"Harmonicity: Get maximum", L"Harmonicity: Get maximum...")
+FORM (Harmonicity_getMaximum, U"Harmonicity: Get maximum", U"Harmonicity: Get maximum...") {
 	dia_Vector_getExtremum (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Harmonicity);
 		double maximum = Vector_getMaximum (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (maximum, L"dB");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (maximum, U"dB");
 	}
-END
+END2 }
 
-FORM (Harmonicity_getMean, L"Harmonicity: Get mean", L"Harmonicity: Get mean...")
+FORM (Harmonicity_getMean, U"Harmonicity: Get mean", U"Harmonicity: Get mean...") {
 	praat_dia_timeRange (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Harmonicity);
-		double mean = Harmonicity_getMean (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"));
-		Melder_informationReal (mean, L"dB");
+		double mean = Harmonicity_getMean (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"));
+		Melder_informationReal (mean, U"dB");
 	}
-END
+END2 }
 
-FORM (Harmonicity_getMinimum, L"Harmonicity: Get minimum", L"Harmonicity: Get minimum...")
+FORM (Harmonicity_getMinimum, U"Harmonicity: Get minimum", U"Harmonicity: Get minimum...") {
 	dia_Vector_getExtremum (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Harmonicity);
 		double minimum = Vector_getMinimum (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (minimum, L"dB");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (minimum, U"dB");
 	}
-END
+END2 }
 
-FORM (Harmonicity_getStandardDeviation, L"Harmonicity: Get standard deviation", L"Harmonicity: Get standard deviation...")
+FORM (Harmonicity_getStandardDeviation, U"Harmonicity: Get standard deviation", U"Harmonicity: Get standard deviation...") {
 	praat_dia_timeRange (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Harmonicity);
 		double stdev = Harmonicity_getStandardDeviation (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"));
-		Melder_informationReal (stdev, L"dB");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"));
+		Melder_informationReal (stdev, U"dB");
 	}
-END
+END2 }
 
-FORM (Harmonicity_getTimeOfMaximum, L"Harmonicity: Get time of maximum", L"Harmonicity: Get time of maximum...")
+FORM (Harmonicity_getTimeOfMaximum, U"Harmonicity: Get time of maximum", U"Harmonicity: Get time of maximum...") {
 	dia_Vector_getExtremum (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Harmonicity);
 		double maximum = Vector_getXOfMaximum (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (maximum, L"seconds");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (maximum, U"seconds");
 	}
-END
+END2 }
 
-FORM (Harmonicity_getTimeOfMinimum, L"Harmonicity: Get time of minimum", L"Harmonicity: Get time of minimum...")
+FORM (Harmonicity_getTimeOfMinimum, U"Harmonicity: Get time of minimum", U"Harmonicity: Get time of minimum...") {
 	dia_Vector_getExtremum (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Harmonicity);
 		double minimum = Vector_getXOfMinimum (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (minimum, L"seconds");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (minimum, U"seconds");
 	}
-END
+END2 }
 
-FORM (Harmonicity_getValueAtTime, L"Harmonicity: Get value", L"Harmonicity: Get value at time...")
+FORM (Harmonicity_getValueAtTime, U"Harmonicity: Get value", U"Harmonicity: Get value at time...") {
 	dia_Vector_getValue (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Harmonicity);
-		double value = Vector_getValueAtX (me, GET_REAL (L"Time"), 1, GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (value, L"dB");
+		double value = Vector_getValueAtX (me, GET_REAL (U"Time"), 1, GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (value, U"dB");
 	}
-END
+END2 }
 	
-FORM (Harmonicity_getValueInFrame, L"Get value in frame", L"Harmonicity: Get value in frame...")
-	INTEGER (L"Frame number", L"10")
-	OK
+FORM (Harmonicity_getValueInFrame, U"Get value in frame", U"Harmonicity: Get value in frame...") {
+	INTEGER (U"Frame number", U"10")
+	OK2
 DO
 	LOOP {
 		iam (Harmonicity);
-		long frameNumber = GET_INTEGER (L"Frame number");
-		Melder_informationReal (frameNumber < 1 || frameNumber > my nx ? NUMundefined : my z [1] [frameNumber], L"dB");
+		long frameNumber = GET_INTEGER (U"Frame number");
+		Melder_informationReal (frameNumber < 1 || frameNumber > my nx ? NUMundefined : my z [1] [frameNumber], U"dB");
 	}
-END
+END2 }
 
-DIRECT (Harmonicity_help) Melder_help (L"Harmonicity"); END
+DIRECT2 (Harmonicity_help) {
+	Melder_help (U"Harmonicity");
+END2 }
 
-DIRECT (Harmonicity_to_Matrix)
+DIRECT2 (Harmonicity_to_Matrix) {
 	LOOP {
 		iam (Harmonicity);
 		autoMatrix thee = Harmonicity_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** INTENSITY *****/
 
-FORM (Intensity_draw, L"Draw Intensity", 0)
+FORM (Intensity_draw, U"Draw Intensity", 0) {
 	praat_dia_timeRange (dia);
-	REAL (L"Minimum (dB)", L"0.0")
-	REAL (L"Maximum (dB)", L"0.0 (= auto)")
-	BOOLEAN (L"Garnish", 1)
-	OK
+	REAL (U"Minimum (dB)", U"0.0")
+	REAL (U"Maximum (dB)", U"0.0 (= auto)")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
 		autoPraatPicture picture;
-		Intensity_draw (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"), GET_INTEGER (L"Garnish"));
+		Intensity_draw (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-DIRECT (Intensity_downto_IntensityTier)
+DIRECT2 (Intensity_downto_IntensityTier) {
 	LOOP {
 		iam (Intensity);
 		autoIntensityTier thee = Intensity_downto_IntensityTier (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Intensity_downto_Matrix)
+DIRECT2 (Intensity_downto_Matrix) {
 	LOOP {
 		iam (Intensity);
 		autoMatrix thee = Intensity_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Intensity_formula, L"Intensity Formula", 0)
-	LABEL (L"label", L"`x' is the time in seconds, `col' is the frame number, `self' is in dB")
-	LABEL (L"label", L"x := x1;   for col := 1 to ncol do { self [col] := `formula' ; x := x + dx }")
-	TEXTFIELD (L"formula", L"0")
-	OK
+FORM (Intensity_formula, U"Intensity Formula", 0) {
+	LABEL (U"label", U"`x' is the time in seconds, `col' is the frame number, `self' is in dB")
+	LABEL (U"label", U"x := x1;   for col := 1 to ncol do { self [col] := `formula' ; x := x + dx }")
+	TEXTFIELD (U"formula", U"0")
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
 		try {
-			Matrix_formula ((Matrix) me, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula ((Matrix) me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Intensity may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Intensity_getMaximum, L"Intensity: Get maximum", L"Intensity: Get maximum...")
+FORM (Intensity_getMaximum, U"Intensity: Get maximum", U"Intensity: Get maximum...") {
 	dia_Vector_getExtremum (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
 		double maximum = Vector_getMaximum (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (maximum, L"dB");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (maximum, U"dB");
 		break;   // OPTIMIZE
 	}
-END
+END2 }
 
-FORM (old_Intensity_getMean, L"Intensity: Get mean", L"Intensity: Get mean...")
+FORM (old_Intensity_getMean, U"Intensity: Get mean", U"Intensity: Get mean...") {
 	praat_dia_timeRange (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
-		double mean = Sampled_getMean_standardUnit (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), 0, 0, TRUE);
-		Melder_informationReal (mean, L"dB");
+		double mean = Sampled_getMean_standardUnit (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), 0, 0, true);
+		Melder_informationReal (mean, U"dB");
 		break;   // OPTIMIZE
 	}
-END
+END2 }
 
-FORM (Intensity_getMean, L"Intensity: Get mean", L"Intensity: Get mean...")
+FORM (Intensity_getMean, U"Intensity: Get mean", U"Intensity: Get mean...") {
 	praat_dia_timeRange (dia);
-	RADIO (L"Averaging method", 1)
-		RADIOBUTTON (L"energy")
-		RADIOBUTTON (L"sones")
-		RADIOBUTTON (L"dB")
-	OK
+	RADIO (U"Averaging method", 1)
+		RADIOBUTTON (U"energy")
+		RADIOBUTTON (U"sones")
+		RADIOBUTTON (U"dB")
+	OK2
 DO_ALTERNATIVE (old_Intensity_getMean)
 	LOOP {
 		iam (Intensity);
-		double mean = Sampled_getMean_standardUnit (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			0, GET_INTEGER (L"Averaging method"), TRUE);
-		Melder_informationReal (mean, L"dB");
+		double mean = Sampled_getMean_standardUnit (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			0, GET_INTEGER (U"Averaging method"), true);
+		Melder_informationReal (mean, U"dB");
 		break;   // OPTIMIZE
 	}
-END
+END2 }
 
-FORM (Intensity_getMinimum, L"Intensity: Get minimum", L"Intensity: Get minimum...")
+FORM (Intensity_getMinimum, U"Intensity: Get minimum", U"Intensity: Get minimum...") {
 	dia_Vector_getExtremum (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
 		double minimum = Vector_getMinimum (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (minimum, L"dB");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (minimum, U"dB");
 		break;   // OPTIMIZE
 	}
-END
+END2 }
 
-FORM (Intensity_getQuantile, L"Intensity: Get quantile", 0)
+FORM (Intensity_getQuantile, U"Intensity: Get quantile", 0) {
 	praat_dia_timeRange (dia);
-	REAL (L"Quantile (0-1)", L"0.50")
-	OK
+	REAL (U"Quantile (0-1)", U"0.50")
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
-		double quantile = Intensity_getQuantile (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_REAL (L"Quantile"));
-		Melder_informationReal (quantile, L"dB");
+		double quantile = Intensity_getQuantile (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_REAL (U"Quantile"));
+		Melder_informationReal (quantile, U"dB");
 	}
-END
+END2 }
 
-FORM (Intensity_getStandardDeviation, L"Intensity: Get standard deviation", L"Intensity: Get standard deviation...")
+FORM (Intensity_getStandardDeviation, U"Intensity: Get standard deviation", U"Intensity: Get standard deviation...") {
 	praat_dia_timeRange (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
-		double stdev = Vector_getStandardDeviation (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), 1);
-		Melder_informationReal (stdev, L"dB");
+		double stdev = Vector_getStandardDeviation (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), 1);
+		Melder_informationReal (stdev, U"dB");
 	}
-END
+END2 }
 
-FORM (Intensity_getTimeOfMaximum, L"Intensity: Get time of maximum", L"Intensity: Get time of maximum...")
+FORM (Intensity_getTimeOfMaximum, U"Intensity: Get time of maximum", U"Intensity: Get time of maximum...") {
 	dia_Vector_getExtremum (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
 		double time = Vector_getXOfMaximum (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (time, L"seconds");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (time, U"seconds");
 	}
-END
+END2 }
 
-FORM (Intensity_getTimeOfMinimum, L"Intensity: Get time of minimum", L"Intensity: Get time of minimum...")
+FORM (Intensity_getTimeOfMinimum, U"Intensity: Get time of minimum", U"Intensity: Get time of minimum...") {
 	dia_Vector_getExtremum (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
 		double time = Vector_getXOfMinimum (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (time, L"seconds");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (time, U"seconds");
 	}
-END
+END2 }
 
-FORM (Intensity_getValueAtTime, L"Intensity: Get value", L"Intensity: Get value at time...")
+FORM (Intensity_getValueAtTime, U"Intensity: Get value", U"Intensity: Get value at time...") {
 	dia_Vector_getValue (dia);
-	OK
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
-		double value = Vector_getValueAtX (me, GET_REAL (L"Time"), 1, GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (value, L"dB");
+		double value = Vector_getValueAtX (me, GET_REAL (U"Time"), 1, GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (value, U"dB");
 	}
-END
+END2 }
 	
-FORM (Intensity_getValueInFrame, L"Get value in frame", L"Intensity: Get value in frame...")
-	INTEGER (L"Frame number", L"10")
-	OK
+FORM (Intensity_getValueInFrame, U"Get value in frame", U"Intensity: Get value in frame...") {
+	INTEGER (U"Frame number", U"10")
+	OK2
 DO
 	LOOP {
 		iam (Intensity);
-		long frameNumber = GET_INTEGER (L"Frame number");
-		Melder_informationReal (frameNumber < 1 || frameNumber > my nx ? NUMundefined : my z [1] [frameNumber], L"dB");
+		long frameNumber = GET_INTEGER (U"Frame number");
+		Melder_informationReal (frameNumber < 1 || frameNumber > my nx ? NUMundefined : my z [1] [frameNumber], U"dB");
 	}
-END
+END2 }
 
-DIRECT (Intensity_help) Melder_help (L"Intensity"); END
+DIRECT2 (Intensity_help) {
+	Melder_help (U"Intensity");
+END2 }
 
-DIRECT (Intensity_to_IntensityTier_peaks)
+DIRECT2 (Intensity_to_IntensityTier_peaks) {
 	LOOP {
 		iam (Intensity);
 		autoIntensityTier thee = Intensity_to_IntensityTier_peaks (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Intensity_to_IntensityTier_valleys)
+DIRECT2 (Intensity_to_IntensityTier_valleys) {
 	LOOP {
 		iam (Intensity);
 		autoIntensityTier thee = Intensity_to_IntensityTier_valleys (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** INTENSITY & PITCH *****/
 
-FORM (Pitch_Intensity_draw, L"Plot intensity by pitch", 0)
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"0.0 (= auto)")
-	REAL (L"From intensity (dB)", L"0.0")
-	REAL (L"To intensity (dB)", L"100.0")
-	BOOLEAN (L"Garnish", 1)
-	RADIO (L"Drawing method", 1)
-	RADIOBUTTON (L"Speckles")
-	RADIOBUTTON (L"Curve")
-	RADIOBUTTON (L"Speckles and curve")
-	OK
+FORM (Pitch_Intensity_draw, U"Plot intensity by pitch", 0) {
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"0.0 (= auto)")
+	REAL (U"From intensity (dB)", U"0.0")
+	REAL (U"To intensity (dB)", U"100.0")
+	BOOLEAN (U"Garnish", 1)
+	RADIO (U"Drawing method", 1)
+		RADIOBUTTON (U"Speckles")
+		RADIOBUTTON (U"Curve")
+		RADIOBUTTON (U"Speckles and curve")
+	OK2
 DO
 	Pitch pitch = NULL;
 	Intensity intensity = NULL;
@@ -1817,17 +1835,17 @@ DO
 	}
 	autoPraatPicture picture;
 	Pitch_Intensity_draw (pitch, intensity, GRAPHICS,
-		GET_REAL (L"From frequency"), GET_REAL (L"To frequency"),
-		GET_REAL (L"From intensity"), GET_REAL (L"To intensity"), GET_INTEGER (L"Garnish"), GET_INTEGER (L"Drawing method"));
-END
-
-FORM (Pitch_Intensity_speckle, L"Plot intensity by pitch", 0)
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"0.0 (= auto)")
-	REAL (L"From intensity (dB)", L"0.0")
-	REAL (L"To intensity (dB)", L"100.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+		GET_REAL (U"From frequency"), GET_REAL (U"To frequency"),
+		GET_REAL (U"From intensity"), GET_REAL (U"To intensity"), GET_INTEGER (U"Garnish"), GET_INTEGER (U"Drawing method"));
+END2 }
+
+FORM (Pitch_Intensity_speckle, U"Plot intensity by pitch", 0) {
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"0.0 (= auto)")
+	REAL (U"From intensity (dB)", U"0.0")
+	REAL (U"To intensity (dB)", U"100.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	Pitch pitch = NULL;
 	Intensity intensity = NULL;
@@ -1838,13 +1856,13 @@ DO
 	}
 	autoPraatPicture picture;
 	Pitch_Intensity_draw (pitch, intensity, GRAPHICS,
-		GET_REAL (L"From frequency"), GET_REAL (L"To frequency"),
-		GET_REAL (L"From intensity"), GET_REAL (L"To intensity"), GET_INTEGER (L"Garnish"), 1);
-END
+		GET_REAL (U"From frequency"), GET_REAL (U"To frequency"),
+		GET_REAL (U"From intensity"), GET_REAL (U"To intensity"), GET_INTEGER (U"Garnish"), 1);
+END2 }
 
 /***** INTENSITY & POINTPROCESS *****/
 
-DIRECT (Intensity_PointProcess_to_IntensityTier)
+DIRECT2 (Intensity_PointProcess_to_IntensityTier) {
 	Intensity intensity = NULL;
 	PointProcess point = NULL;
 	LOOP {
@@ -1854,52 +1872,52 @@ DIRECT (Intensity_PointProcess_to_IntensityTier)
 	}
 	autoIntensityTier thee = Intensity_PointProcess_to_IntensityTier (intensity, point);
 	praat_new (thee.transfer(), intensity -> name);
-END
+END2 }
 
 /***** INTENSITYTIER *****/
 
-FORM (IntensityTier_addPoint, L"Add one point", L"IntensityTier: Add point...")
-	REAL (L"Time (s)", L"0.5")
-	REAL (L"Intensity (dB)", L"75")
-	OK
+FORM (IntensityTier_addPoint, U"Add one point", U"IntensityTier: Add point...") {
+	REAL (U"Time (s)", U"0.5")
+	REAL (U"Intensity (dB)", U"75")
+	OK2
 DO
 	LOOP {
 		iam (IntensityTier);
-		RealTier_addPoint (me, GET_REAL (L"Time"), GET_REAL (L"Intensity"));
+		RealTier_addPoint (me, GET_REAL (U"Time"), GET_REAL (U"Intensity"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (IntensityTier_create, L"Create empty IntensityTier", NULL)
-	WORD (L"Name", L"empty")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	OK
+FORM (IntensityTier_create, U"Create empty IntensityTier", NULL) {
+	WORD (U"Name", U"empty")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	OK2
 DO
-	double startTime = GET_REAL (L"Start time"), endTime = GET_REAL (L"End time");
-	if (endTime <= startTime) Melder_throw ("End time must be greater than start time.");
+	double startTime = GET_REAL (U"Start time"), endTime = GET_REAL (U"End time");
+	if (endTime <= startTime) Melder_throw (U"End time must be greater than start time.");
 	autoIntensityTier thee = IntensityTier_create (startTime, endTime);
-	praat_new (thee.transfer(), GET_STRING (L"Name"));
-END
+	praat_new (thee.transfer(), GET_STRING (U"Name"));
+END2 }
 
-DIRECT (IntensityTier_downto_PointProcess)
+DIRECT2 (IntensityTier_downto_PointProcess) {
 	LOOP {
 		iam (IntensityTier);
 		autoPointProcess thee = AnyTier_downto_PointProcess (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (IntensityTier_downto_TableOfReal)
+DIRECT2 (IntensityTier_downto_TableOfReal) {
 	LOOP {
 		iam (IntensityTier);
 		autoTableOfReal thee = IntensityTier_downto_TableOfReal (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (IntensityTier_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit an IntensityTier from batch.");
+DIRECT2 (IntensityTier_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit an IntensityTier from batch.");
 	Sound sound = NULL;
 	LOOP {
 		if (CLASS == classSound) sound = (Sound) OBJECT;   // may stay NULL
@@ -1907,73 +1925,75 @@ DIRECT (IntensityTier_edit)
 	}
 	LOOP if (CLASS == classIntensityTier) {
 		iam (IntensityTier);
-		autoIntensityTierEditor editor = IntensityTierEditor_create (ID_AND_FULL_NAME, me, sound, TRUE);
+		autoIntensityTierEditor editor = IntensityTierEditor_create (ID_AND_FULL_NAME, me, sound, true);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-FORM (IntensityTier_formula, L"IntensityTier: Formula", L"IntensityTier: Formula...")
-	LABEL (L"", L"# ncol = the number of points")
-	LABEL (L"", L"for col from 1 to ncol")
-	LABEL (L"", L"   # x = the time of the colth point, in seconds")
-	LABEL (L"", L"   # self = the value of the colth point, in dB")
-	LABEL (L"", L"   self = `formula'")
-	LABEL (L"", L"endfor")
-	TEXTFIELD (L"formula", L"self + 3.0")
-	OK
+FORM (IntensityTier_formula, U"IntensityTier: Formula", U"IntensityTier: Formula...") {
+	LABEL (U"", U"# ncol = the number of points")
+	LABEL (U"", U"for col from 1 to ncol")
+	LABEL (U"", U"   # x = the time of the colth point, in seconds")
+	LABEL (U"", U"   # self = the value of the colth point, in dB")
+	LABEL (U"", U"   self = `formula'")
+	LABEL (U"", U"endfor")
+	TEXTFIELD (U"formula", U"self + 3.0")
+	OK2
 DO
 	LOOP {
 		iam (IntensityTier);
 		try {
-			RealTier_formula (me, GET_STRING (L"formula"), interpreter, NULL);
+			RealTier_formula (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the IntensityTier may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (IntensityTier_getValueAtTime, L"Get IntensityTier value", L"IntensityTier: Get value at time...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (IntensityTier_getValueAtTime, U"Get IntensityTier value", U"IntensityTier: Get value at time...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (IntensityTier);
-		double value = RealTier_getValueAtTime (me, GET_REAL (L"Time"));
-		Melder_informationReal (value, L"dB");
+		double value = RealTier_getValueAtTime (me, GET_REAL (U"Time"));
+		Melder_informationReal (value, U"dB");
 	}
-END
+END2 }
 	
-FORM (IntensityTier_getValueAtIndex, L"Get IntensityTier value", L"IntensityTier: Get value at index...")
-	INTEGER (L"Point number", L"10")
-	OK
+FORM (IntensityTier_getValueAtIndex, U"Get IntensityTier value", U"IntensityTier: Get value at index...") {
+	INTEGER (U"Point number", U"10")
+	OK2
 DO
 	LOOP {
 		iam (IntensityTier);
-		double value = RealTier_getValueAtIndex (me, GET_INTEGER (L"Point number"));
-		Melder_informationReal (value, L"dB");
+		double value = RealTier_getValueAtIndex (me, GET_INTEGER (U"Point number"));
+		Melder_informationReal (value, U"dB");
 	}
-END
+END2 }
 
-DIRECT (IntensityTier_help) Melder_help (L"IntensityTier"); END
+DIRECT2 (IntensityTier_help) {
+	Melder_help (U"IntensityTier");
+END2 }
 
-DIRECT (IntensityTier_to_AmplitudeTier)
+DIRECT2 (IntensityTier_to_AmplitudeTier) {
 	LOOP {
 		iam (IntensityTier);
 		autoAmplitudeTier thee = IntensityTier_to_AmplitudeTier (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (info_IntensityTier_Sound_edit)
-	Melder_information (L"To include a copy of a Sound in your IntensityTier editor:\n"
+DIRECT2 (info_IntensityTier_Sound_edit) {
+	Melder_information (U"To include a copy of a Sound in your IntensityTier editor:\n"
 		"   select an IntensityTier and a Sound, and click \"View & Edit\".");
-END
+END2 }
 
 /***** INTENSITYTIER & POINTPROCESS *****/
 
-DIRECT (IntensityTier_PointProcess_to_IntensityTier)
+DIRECT2 (IntensityTier_PointProcess_to_IntensityTier) {
 	IntensityTier intensity = NULL;
 	PointProcess point = NULL;
 	LOOP {
@@ -1983,11 +2003,11 @@ DIRECT (IntensityTier_PointProcess_to_IntensityTier)
 	}
 	autoIntensityTier thee = IntensityTier_PointProcess_to_IntensityTier (intensity, point);
 	praat_new (thee.transfer(), intensity -> name);
-END
+END2 }
 
 /***** INTENSITYTIER & SOUND *****/
 
-DIRECT (Sound_IntensityTier_multiply_old)
+DIRECT2 (Sound_IntensityTier_multiply_old) {
 	Sound sound = NULL;
 	IntensityTier intensity = NULL;
 	LOOP {
@@ -1995,13 +2015,13 @@ DIRECT (Sound_IntensityTier_multiply_old)
 		if (CLASS == classIntensityTier) intensity = (IntensityTier) OBJECT;
 		if (sound && intensity) break;   // OPTIMIZE
 	}
-	autoSound thee = Sound_IntensityTier_multiply (sound, intensity, TRUE);
-	praat_new (thee.transfer(), sound -> name, L"_int");
-END
+	autoSound thee = Sound_IntensityTier_multiply (sound, intensity, true);
+	praat_new (thee.transfer(), sound -> name, U"_int");
+END2 }
 
-FORM (Sound_IntensityTier_multiply, L"Sound & IntervalTier: Multiply", 0)
-	BOOLEAN (L"Scale to 0.9", 1)
-	OK
+FORM (Sound_IntensityTier_multiply, U"Sound & IntervalTier: Multiply", 0) {
+	BOOLEAN (U"Scale to 0.9", 1)
+	OK2
 DO
 	Sound sound = NULL;
 	IntensityTier intensity = NULL;
@@ -2010,1289 +2030,1299 @@ DO
 		if (CLASS == classIntensityTier) intensity = (IntensityTier) OBJECT;
 		if (sound && intensity) break;   // OPTIMIZE
 	}
-	autoSound thee = Sound_IntensityTier_multiply (sound, intensity, GET_INTEGER (L"Scale to 0.9"));
-	praat_new (thee.transfer(), sound -> name, L"_int");
-END
+	autoSound thee = Sound_IntensityTier_multiply (sound, intensity, GET_INTEGER (U"Scale to 0.9"));
+	praat_new (thee.transfer(), sound -> name, U"_int");
+END2 }
 
 /***** INTERVALTIER, rest in praat_TextGrid_init.cpp *****/
 
-FORM_READ (IntervalTier_readFromXwaves, L"Read IntervalTier from Xwaves", 0, true)
+FORM_READ2 (IntervalTier_readFromXwaves, U"Read IntervalTier from Xwaves", 0, true) {
 	autoIntervalTier me = IntervalTier_readFromXwaves (file);
-	praat_new (me.transfer(), MelderFile_name (file));
-END
+	praat_newWithFile (me.transfer(), file, MelderFile_name (file));
+END2 }
 
 /***** LTAS *****/
 
-DIRECT (Ltases_average)
+DIRECT2 (Ltases_average) {
 	autoCollection ltases = praat_getSelectedObjects ();
 	autoLtas thee = Ltases_average (ltases.peek());
-	praat_new (thee.transfer(), L"averaged");
-END
+	praat_new (thee.transfer(), U"averaged");
+END2 }
 
-FORM (Ltas_computeTrendLine, L"Ltas: Compute trend line", L"Ltas: Compute trend line...")
-	REAL (L"left Frequency range (Hz)", L"600.0")
-	POSITIVE (L"right Frequency range (Hz)", L"4000.0")
-	OK
+FORM (Ltas_computeTrendLine, U"Ltas: Compute trend line", U"Ltas: Compute trend line...") {
+	REAL (U"left Frequency range (Hz)", U"600.0")
+	POSITIVE (U"right Frequency range (Hz)", U"4000.0")
+	OK2
 DO
 	LOOP {
 		iam (Ltas);
-		autoLtas thee = Ltas_computeTrendLine (me, GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"));
-		praat_new (thee.transfer(), my name, L"_trend");
+		autoLtas thee = Ltas_computeTrendLine (me, GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"));
+		praat_new (thee.transfer(), my name, U"_trend");
 	}
-END
+END2 }
 
-FORM (old_Ltas_draw, L"Ltas: Draw", 0)
-	REAL (L"left Frequency range (Hz)", L"0.0")
-	REAL (L"right Frequency range (Hz)", L"0.0 (= all)")
-	REAL (L"left Power range (dB/Hz)", L"-20.0")
-	REAL (L"right Power range (dB/Hz)", L"80.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (old_Ltas_draw, U"Ltas: Draw", 0) {
+	REAL (U"left Frequency range (Hz)", U"0.0")
+	REAL (U"right Frequency range (Hz)", U"0.0 (= all)")
+	REAL (U"left Power range (dB/Hz)", U"-20.0")
+	REAL (U"right Power range (dB/Hz)", U"80.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (Ltas);
 		autoPraatPicture picture;
-		Ltas_draw (me, GRAPHICS, GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_REAL (L"left Power range"), GET_REAL (L"right Power range"), GET_INTEGER (L"Garnish"), L"Bars");
-	}
-END
-
-FORM (Ltas_draw, L"Ltas: Draw", 0)
-	REAL (L"left Frequency range (Hz)", L"0.0")
-	REAL (L"right Frequency range (Hz)", L"0.0 (= all)")
-	REAL (L"left Power range (dB/Hz)", L"-20.0")
-	REAL (L"right Power range (dB/Hz)", L"80.0")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"")
-	OPTIONMENU (L"Drawing method", 2)
-		OPTION (L"Curve")
-		OPTION (L"Bars")
-		OPTION (L"Poles")
-		OPTION (L"Speckles")
-	OK
+		Ltas_draw (me, GRAPHICS, GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_REAL (U"left Power range"), GET_REAL (U"right Power range"), GET_INTEGER (U"Garnish"), U"Bars");
+	}
+END2 }
+
+FORM (Ltas_draw, U"Ltas: Draw", 0) {
+	REAL (U"left Frequency range (Hz)", U"0.0")
+	REAL (U"right Frequency range (Hz)", U"0.0 (= all)")
+	REAL (U"left Power range (dB/Hz)", U"-20.0")
+	REAL (U"right Power range (dB/Hz)", U"80.0")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"")
+	OPTIONMENU (U"Drawing method", 2)
+		OPTION (U"Curve")
+		OPTION (U"Bars")
+		OPTION (U"Poles")
+		OPTION (U"Speckles")
+	OK2
 DO_ALTERNATIVE (old_Ltas_draw)
 	LOOP {
 		iam (Ltas);
 		autoPraatPicture picture;
-		Ltas_draw (me, GRAPHICS, GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_REAL (L"left Power range"), GET_REAL (L"right Power range"), GET_INTEGER (L"Garnish"), GET_STRING (L"Drawing method"));
+		Ltas_draw (me, GRAPHICS, GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_REAL (U"left Power range"), GET_REAL (U"right Power range"), GET_INTEGER (U"Garnish"), GET_STRING (U"Drawing method"));
 	}
-END
+END2 }
 
-FORM (Ltas_formula, L"Ltas Formula", 0)
-	LABEL (L"label", L"`x' is the frequency in hertz, `col' is the bin number")
-	LABEL (L"label", L"x := x1;   for col := 1 to ncol do { self [1, col] := `formula' ; x := x + dx }")
-	TEXTFIELD (L"formula", L"0")
-	OK
+FORM (Ltas_formula, U"Ltas Formula", 0) {
+	LABEL (U"label", U"`x' is the frequency in hertz, `col' is the bin number")
+	LABEL (U"label", U"x := x1;   for col := 1 to ncol do { self [1, col] := `formula' ; x := x + dx }")
+	TEXTFIELD (U"formula", U"0")
+	OK2
 DO
 	LOOP {
 		iam (Ltas);
 		try {
-			Matrix_formula (reinterpret_cast <Matrix> (me), GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (reinterpret_cast <Matrix> (me), GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Ltas may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Ltas_getBinNumberFromFrequency, L"Ltas: Get band from frequency", L"Ltas: Get band from frequency...")
-	REAL (L"Frequency (Hz)", L"2000")
-	OK
+FORM (Ltas_getBinNumberFromFrequency, U"Ltas: Get band from frequency", U"Ltas: Get band from frequency...") {
+	REAL (U"Frequency (Hz)", U"2000")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
-	double binNumber = Sampled_xToIndex (me, GET_REAL (L"Frequency"));
+	double binNumber = Sampled_xToIndex (me, GET_REAL (U"Frequency"));
 	Melder_informationReal (binNumber, NULL);
-END
+END2 }
 
-DIRECT (Ltas_getBinWidth)
+DIRECT2 (Ltas_getBinWidth) {
 	Ltas me = FIRST (Ltas);
-	Melder_informationReal (my dx, L"hertz");
-END
+	Melder_informationReal (my dx, U"hertz");
+END2 }
 
-FORM (Ltas_getFrequencyFromBinNumber, L"Ltas: Get frequency from bin number", L"Ltas: Get frequency from bin number...")
-	NATURAL (L"Bin number", L"1")
-	OK
+FORM (Ltas_getFrequencyFromBinNumber, U"Ltas: Get frequency from bin number", U"Ltas: Get frequency from bin number...") {
+	NATURAL (U"Bin number", U"1")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
-	double frequency = Sampled_indexToX (me, GET_INTEGER (L"Bin number"));
-	Melder_informationReal (frequency, L"hertz");
-END
-
-FORM (Ltas_getFrequencyOfMaximum, L"Ltas: Get frequency of maximum", L"Ltas: Get frequency of maximum...")
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 1)
-		RADIOBUTTON (L"None")
-		RADIOBUTTON (L"Parabolic")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
-	OK
+	double frequency = Sampled_indexToX (me, GET_INTEGER (U"Bin number"));
+	Melder_informationReal (frequency, U"hertz");
+END2 }
+
+FORM (Ltas_getFrequencyOfMaximum, U"Ltas: Get frequency of maximum", U"Ltas: Get frequency of maximum...") {
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 1)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
 	double frequency = Vector_getXOfMaximum (me,
-		GET_REAL (L"From frequency"), GET_REAL (L"To frequency"), GET_INTEGER (L"Interpolation") - 1);
-	Melder_informationReal (frequency, L"hertz");
-END
-
-FORM (Ltas_getFrequencyOfMinimum, L"Ltas: Get frequency of minimum", L"Ltas: Get frequency of minimum...")
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 1)
-		RADIOBUTTON (L"None")
-		RADIOBUTTON (L"Parabolic")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
-	OK
+		GET_REAL (U"From frequency"), GET_REAL (U"To frequency"), GET_INTEGER (U"Interpolation") - 1);
+	Melder_informationReal (frequency, U"hertz");
+END2 }
+
+FORM (Ltas_getFrequencyOfMinimum, U"Ltas: Get frequency of minimum", U"Ltas: Get frequency of minimum...") {
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 1)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
 	double frequency = Vector_getXOfMinimum (me,
-		GET_REAL (L"From frequency"), GET_REAL (L"To frequency"), GET_INTEGER (L"Interpolation") - 1);
-	Melder_informationReal (frequency, L"hertz");
-END
+		GET_REAL (U"From frequency"), GET_REAL (U"To frequency"), GET_INTEGER (U"Interpolation") - 1);
+	Melder_informationReal (frequency, U"hertz");
+END2 }
 
-DIRECT (Ltas_getHighestFrequency)
+DIRECT2 (Ltas_getHighestFrequency) {
 	Ltas me = FIRST (Ltas);
-	Melder_informationReal (my xmax, L"Hz");
-END
-
-FORM (Ltas_getLocalPeakHeight, L"Ltas: Get local peak height", 0)
-	REAL (L"left Environment (Hz)", L"1700.0")
-	REAL (L"right Environment (Hz)", L"4200.0")
-	REAL (L"left Peak (Hz)", L"2400.0")
-	REAL (L"right Peak (Hz)", L"3200.0")
-	RADIO (L"Averaging method", 1)
-		RADIOBUTTON (L"energy")
-		RADIOBUTTON (L"sones")
-		RADIOBUTTON (L"dB")
-	OK
+	Melder_informationReal (my xmax, U"Hz");
+END2 }
+
+FORM (Ltas_getLocalPeakHeight, U"Ltas: Get local peak height", 0) {
+	REAL (U"left Environment (Hz)", U"1700.0")
+	REAL (U"right Environment (Hz)", U"4200.0")
+	REAL (U"left Peak (Hz)", U"2400.0")
+	REAL (U"right Peak (Hz)", U"3200.0")
+	RADIO (U"Averaging method", 1)
+		RADIOBUTTON (U"energy")
+		RADIOBUTTON (U"sones")
+		RADIOBUTTON (U"dB")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
-	double environmentMin = GET_REAL (L"left Environment"), environmentMax = GET_REAL (L"right Environment");
-	double peakMin = GET_REAL (L"left Peak"), peakMax = GET_REAL (L"right Peak");
-	if (environmentMin >= peakMin) Melder_throw ("The beginning of the environment must lie before the peak.");
-	if (peakMin >= peakMax) Melder_throw ("The end of the peak must lie after its beginning.");
-	if (environmentMax <= peakMax) Melder_throw ("The end of the environment must lie after the peak.");
+	double environmentMin = GET_REAL (U"left Environment"), environmentMax = GET_REAL (U"right Environment");
+	double peakMin = GET_REAL (U"left Peak"), peakMax = GET_REAL (U"right Peak");
+	if (environmentMin >= peakMin) Melder_throw (U"The beginning of the environment must lie before the peak.");
+	if (peakMin >= peakMax) Melder_throw (U"The end of the peak must lie after its beginning.");
+	if (environmentMax <= peakMax) Melder_throw (U"The end of the environment must lie after the peak.");
 	double localPeakHeight = Ltas_getLocalPeakHeight (me, environmentMin, environmentMax,
-		peakMin, peakMax, GET_INTEGER (L"Averaging method"));
-	Melder_informationReal (localPeakHeight, L"dB");
-END
+		peakMin, peakMax, GET_INTEGER (U"Averaging method"));
+	Melder_informationReal (localPeakHeight, U"dB");
+END2 }
 
-DIRECT (Ltas_getLowestFrequency)
+DIRECT2 (Ltas_getLowestFrequency) {
 	Ltas me = FIRST (Ltas);
-	Melder_informationReal (my xmin, L"hertz");
-END
-
-FORM (Ltas_getMaximum, L"Ltas: Get maximum", L"Ltas: Get maximum...")
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 1)
-		RADIOBUTTON (L"None")
-		RADIOBUTTON (L"Parabolic")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
-	OK
+	Melder_informationReal (my xmin, U"hertz");
+END2 }
+
+FORM (Ltas_getMaximum, U"Ltas: Get maximum", U"Ltas: Get maximum...") {
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 1)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
 	double maximum = Vector_getMaximum (me,
-		GET_REAL (L"From frequency"), GET_REAL (L"To frequency"), GET_INTEGER (L"Interpolation") - 1);
-	Melder_informationReal (maximum, L"dB");
-END
-
-FORM (Ltas_getMean, L"Ltas: Get mean", L"Ltas: Get mean...")
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"0.0 (= all)")
-	RADIO (L"Averaging method", 1)
-		RADIOBUTTON (L"energy")
-		RADIOBUTTON (L"sones")
-		RADIOBUTTON (L"dB")
-	OK
+		GET_REAL (U"From frequency"), GET_REAL (U"To frequency"), GET_INTEGER (U"Interpolation") - 1);
+	Melder_informationReal (maximum, U"dB");
+END2 }
+
+FORM (Ltas_getMean, U"Ltas: Get mean", U"Ltas: Get mean...") {
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"0.0 (= all)")
+	RADIO (U"Averaging method", 1)
+		RADIOBUTTON (U"energy")
+		RADIOBUTTON (U"sones")
+		RADIOBUTTON (U"dB")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
-	double mean = Sampled_getMean_standardUnit (me, GET_REAL (L"From frequency"), GET_REAL (L"To frequency"),
-		0, GET_INTEGER (L"Averaging method"), FALSE);
-	Melder_informationReal (mean, L"dB");
-END
-
-FORM (Ltas_getMinimum, L"Ltas: Get minimum", L"Ltas: Get minimum...")
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 1)
-		RADIOBUTTON (L"None")
-		RADIOBUTTON (L"Parabolic")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
-	OK
+	double mean = Sampled_getMean_standardUnit (me, GET_REAL (U"From frequency"), GET_REAL (U"To frequency"),
+		0, GET_INTEGER (U"Averaging method"), false);
+	Melder_informationReal (mean, U"dB");
+END2 }
+
+FORM (Ltas_getMinimum, U"Ltas: Get minimum", U"Ltas: Get minimum...") {
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 1)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
 	double minimum = Vector_getMinimum (me,
-		GET_REAL (L"From frequency"), GET_REAL (L"To frequency"), GET_INTEGER (L"Interpolation") - 1);
-	Melder_informationReal (minimum, L"dB");
-END
+		GET_REAL (U"From frequency"), GET_REAL (U"To frequency"), GET_INTEGER (U"Interpolation") - 1);
+	Melder_informationReal (minimum, U"dB");
+END2 }
 
-DIRECT (Ltas_getNumberOfBins)
+DIRECT2 (Ltas_getNumberOfBins) {
 	Ltas me = FIRST (Ltas);
 	long numberOfBins = my nx;
-	Melder_information (Melder_integer (numberOfBins), L" bins");
-END
-
-FORM (Ltas_getSlope, L"Ltas: Get slope", 0)
-	REAL (L"left Low band (Hz)", L"0.0")
-	REAL (L"right Low band (Hz)", L"1000.0")
-	REAL (L"left High band (Hz)", L"1000.0")
-	REAL (L"right High band (Hz)", L"4000.0")
-	RADIO (L"Averaging method", 1)
-		RADIOBUTTON (L"energy")
-		RADIOBUTTON (L"sones")
-		RADIOBUTTON (L"dB")
-	OK
+	Melder_information (numberOfBins, U" bins");
+END2 }
+
+FORM (Ltas_getSlope, U"Ltas: Get slope", 0) {
+	REAL (U"left Low band (Hz)", U"0.0")
+	REAL (U"right Low band (Hz)", U"1000.0")
+	REAL (U"left High band (Hz)", U"1000.0")
+	REAL (U"right High band (Hz)", U"4000.0")
+	RADIO (U"Averaging method", 1)
+		RADIOBUTTON (U"energy")
+		RADIOBUTTON (U"sones")
+		RADIOBUTTON (U"dB")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
-	double slope = Ltas_getSlope (me, GET_REAL (L"left Low band"), GET_REAL (L"right Low band"),
-		GET_REAL (L"left High band"), GET_REAL (L"right High band"), GET_INTEGER (L"Averaging method"));
-	Melder_informationReal (slope, L"dB");
-END
-
-FORM (Ltas_getStandardDeviation, L"Ltas: Get standard deviation", L"Ltas: Get standard deviation...")
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"0.0 (= all)")
-	RADIO (L"Averaging method", 1)
-		RADIOBUTTON (L"energy")
-		RADIOBUTTON (L"sones")
-		RADIOBUTTON (L"dB")
-	OK
+	double slope = Ltas_getSlope (me, GET_REAL (U"left Low band"), GET_REAL (U"right Low band"),
+		GET_REAL (U"left High band"), GET_REAL (U"right High band"), GET_INTEGER (U"Averaging method"));
+	Melder_informationReal (slope, U"dB");
+END2 }
+
+FORM (Ltas_getStandardDeviation, U"Ltas: Get standard deviation", U"Ltas: Get standard deviation...") {
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"0.0 (= all)")
+	RADIO (U"Averaging method", 1)
+		RADIOBUTTON (U"energy")
+		RADIOBUTTON (U"sones")
+		RADIOBUTTON (U"dB")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
-	double stdev = Sampled_getStandardDeviation_standardUnit (me, GET_REAL (L"From frequency"), GET_REAL (L"To frequency"),
-		0, GET_INTEGER (L"Averaging method"), FALSE);
-	Melder_informationReal (stdev, L"dB");
-END
-
-FORM (Ltas_getValueAtFrequency, L"Ltas: Get value", L"Ltas: Get value at frequency...")
-	REAL (L"Frequency (Hz)", L"1500")
-	RADIO (L"Interpolation", 1)
-		RADIOBUTTON (L"Nearest")
-		RADIOBUTTON (L"Linear")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
-	OK
+	double stdev = Sampled_getStandardDeviation_standardUnit (me, GET_REAL (U"From frequency"), GET_REAL (U"To frequency"),
+		0, GET_INTEGER (U"Averaging method"), false);
+	Melder_informationReal (stdev, U"dB");
+END2 }
+
+FORM (Ltas_getValueAtFrequency, U"Ltas: Get value", U"Ltas: Get value at frequency...") {
+	REAL (U"Frequency (Hz)", U"1500")
+	RADIO (U"Interpolation", 1)
+		RADIOBUTTON (U"Nearest")
+		RADIOBUTTON (U"Linear")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
-	double value = Vector_getValueAtX (me, GET_REAL (L"Frequency"), 1, GET_INTEGER (L"Interpolation") - 1);
-	Melder_informationReal (value, L"dB");
-END
+	double value = Vector_getValueAtX (me, GET_REAL (U"Frequency"), 1, GET_INTEGER (U"Interpolation") - 1);
+	Melder_informationReal (value, U"dB");
+END2 }
 	
-FORM (Ltas_getValueInBin, L"Get value in bin", L"Ltas: Get value in bin...")
-	INTEGER (L"Bin number", L"100")
-	OK
+FORM (Ltas_getValueInBin, U"Get value in bin", U"Ltas: Get value in bin...") {
+	INTEGER (U"Bin number", U"100")
+	OK2
 DO
 	Ltas me = FIRST (Ltas);
-	long binNumber = GET_INTEGER (L"Bin number");
+	long binNumber = GET_INTEGER (U"Bin number");
 	double value = binNumber < 1 || binNumber > my nx ? NUMundefined : my z [1] [binNumber];
-	Melder_informationReal (value, L"dB");
-END
+	Melder_informationReal (value, U"dB");
+END2 }
 
-DIRECT (Ltas_help) Melder_help (L"Ltas"); END
+DIRECT2 (Ltas_help) {
+	Melder_help (U"Ltas");
+END2 }
 
-DIRECT (Ltases_merge)
+DIRECT2 (Ltases_merge) {
 	autoCollection ltases = praat_getSelectedObjects ();
 	autoLtas thee = Ltases_merge (ltases.peek());
-	praat_new (thee.transfer(), L"merged");
-END
+	praat_new (thee.transfer(), U"merged");
+END2 }
 
-FORM (Ltas_subtractTrendLine, L"Ltas: Subtract trend line", L"Ltas: Subtract trend line...")
-	REAL (L"left Frequency range (Hz)", L"600.0")
-	POSITIVE (L"right Frequency range (Hz)", L"4000.0")
-	OK
+FORM (Ltas_subtractTrendLine, U"Ltas: Subtract trend line", U"Ltas: Subtract trend line...") {
+	REAL (U"left Frequency range (Hz)", U"600.0")
+	POSITIVE (U"right Frequency range (Hz)", U"4000.0")
+	OK2
 DO
 	LOOP {
 		iam (Ltas);
-		autoLtas thee = Ltas_subtractTrendLine (me, GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"));
-		praat_new (thee.transfer(), my name, L"_fit");
+		autoLtas thee = Ltas_subtractTrendLine (me, GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"));
+		praat_new (thee.transfer(), my name, U"_fit");
 	}
-END
+END2 }
 
-DIRECT (Ltas_to_Matrix)
+DIRECT2 (Ltas_to_Matrix) {
 	LOOP {
 		iam (Ltas);
 		autoMatrix thee = Ltas_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Ltas_to_SpectrumTier_peaks)
+DIRECT2 (Ltas_to_SpectrumTier_peaks) {
 	LOOP {
 		iam (Ltas);
 		autoSpectrumTier thee = Ltas_to_SpectrumTier_peaks (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** MANIPULATION *****/
 
-static void cb_ManipulationEditor_publication (Editor editor, void *closure, Data publication) {
+static void cb_ManipulationEditor_publication (Editor editor, void *closure, Daata publication) {
 	(void) editor;
 	(void) closure;
 	try {
-		praat_new (publication, L"fromManipulationEditor");
+		praat_new (publication, U"fromManipulationEditor");
 		praat_updateSelection ();
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 }
-DIRECT (Manipulation_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a Manipulation from batch.");
+DIRECT2 (Manipulation_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a Manipulation from batch.");
 	LOOP {
 		iam (Manipulation);
 		autoManipulationEditor editor = ManipulationEditor_create (ID_AND_FULL_NAME, me);
-		editor -> setPublicationCallback (cb_ManipulationEditor_publication, NULL);
+		Editor_setPublicationCallback (editor.peek(), cb_ManipulationEditor_publication, NULL);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-DIRECT (Manipulation_extractDurationTier)
+DIRECT2 (Manipulation_extractDurationTier) {
 	LOOP {
 		iam (Manipulation);
-		if (! my duration) Melder_throw (me, ": I don't contain a DurationTier.");
-		autoDurationTier thee = Data_copy (my duration);
+		if (! my duration) Melder_throw (me, U": I don't contain a DurationTier.");
+		autoDurationTier thee = Data_copy (my duration.get());
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Manipulation_extractOriginalSound)
+DIRECT2 (Manipulation_extractOriginalSound) {
 	LOOP {
 		iam (Manipulation);
-		if (! my sound) Melder_throw (me, ": I don't contain a Sound.");
-		autoSound thee = Data_copy (my sound);
+		if (! my sound) Melder_throw (me, U": I don't contain a Sound.");
+		autoSound thee = Data_copy (my sound.get());
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Manipulation_extractPitchTier)
+DIRECT2 (Manipulation_extractPitchTier) {
 	LOOP {
 		iam (Manipulation);
-		if (! my pitch) Melder_throw (me, ": I don't contain a PitchTier.");
-		autoPitchTier thee = Data_copy (my pitch);
+		if (! my pitch) Melder_throw (me, U": I don't contain a PitchTier.");
+		autoPitchTier thee = Data_copy (my pitch.get());
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Manipulation_extractPulses)
+DIRECT2 (Manipulation_extractPulses) {
 	LOOP {
 		iam (Manipulation);
-		if (! my pulses) Melder_throw (me, ": I don't contain a PointProcess.");
-		autoPointProcess thee = Data_copy (my pulses);
+		if (! my pulses) Melder_throw (me, U": I don't contain a PointProcess.");
+		autoPointProcess thee = Data_copy (my pulses.get());
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Manipulation_getResynthesis_lpc)
+DIRECT2 (Manipulation_getResynthesis_lpc) {
 	LOOP {
 		iam (Manipulation);
 		autoSound thee = Manipulation_to_Sound (me, Manipulation_PITCH_LPC);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Manipulation_getResynthesis_overlapAdd)
+DIRECT2 (Manipulation_getResynthesis_overlapAdd) {
 	LOOP {
 		iam (Manipulation);
 		autoSound thee = Manipulation_to_Sound (me, Manipulation_OVERLAPADD);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Manipulation_help) Melder_help (L"Manipulation"); END
+DIRECT2 (Manipulation_help) {
+	Melder_help (U"Manipulation");
+END2 }
 
-DIRECT (Manipulation_play_lpc)
+DIRECT2 (Manipulation_play_lpc) {
 	LOOP {
 		iam (Manipulation);
 		Manipulation_play (me, Manipulation_PITCH_LPC);
 	}
-END
+END2 }
 
-DIRECT (Manipulation_play_overlapAdd)
+DIRECT2 (Manipulation_play_overlapAdd) {
 	LOOP {
 		iam (Manipulation);
 		Manipulation_play (me, Manipulation_OVERLAPADD);
 	}
-END
+END2 }
 
-DIRECT (Manipulation_removeDuration)
+DIRECT2 (Manipulation_removeDuration) {
 	LOOP {
 		iam (Manipulation);
-		forget (my duration);
+		my duration = nullptr;
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-DIRECT (Manipulation_removeOriginalSound)
+DIRECT2 (Manipulation_removeOriginalSound) {
 	LOOP {
 		iam (Manipulation);
-		forget (my sound);
+		my sound = nullptr;
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM_WRITE (Manipulation_writeToBinaryFileWithoutSound, L"Binary file without Sound", 0, 0)
+FORM_WRITE (Manipulation_writeToBinaryFileWithoutSound, U"Binary file without Sound", 0, 0)
 	Manipulation_writeToBinaryFileWithoutSound (FIRST_ANY (Manipulation), file);
 END
 
-FORM_WRITE (Manipulation_writeToTextFileWithoutSound, L"Text file without Sound", 0, 0)
+FORM_WRITE (Manipulation_writeToTextFileWithoutSound, U"Text file without Sound", 0, 0)
 	Manipulation_writeToTextFileWithoutSound (FIRST_ANY (Manipulation), file);
 END
 
-DIRECT (info_DurationTier_Manipulation_replace)
-	Melder_information (L"To replace the DurationTier in a Manipulation object,\n"
+DIRECT2 (info_DurationTier_Manipulation_replace) {
+	Melder_information (U"To replace the DurationTier in a Manipulation object,\n"
 		"select a DurationTier object and a Manipulation object\nand choose \"Replace duration\".");
-END
+END2 }
 
-DIRECT (info_PitchTier_Manipulation_replace)
-	Melder_information (L"To replace the PitchTier in a Manipulation object,\n"
+DIRECT2 (info_PitchTier_Manipulation_replace) {
+	Melder_information (U"To replace the PitchTier in a Manipulation object,\n"
 		"select a PitchTier object and a Manipulation object\nand choose \"Replace pitch\".");
-END
+END2 }
 
 /***** MANIPULATION & DURATIONTIER *****/
 
-DIRECT (Manipulation_replaceDurationTier)
+DIRECT2 (Manipulation_replaceDurationTier) {
 	Manipulation me = FIRST (Manipulation);
 	Manipulation_replaceDurationTier (me, FIRST (DurationTier));
 	praat_dataChanged (me);
-END
+END2 }
 
-DIRECT (Manipulation_replaceDurationTier_help) Melder_help (L"Manipulation: Replace duration tier"); END
+DIRECT2 (Manipulation_replaceDurationTier_help) {
+	Melder_help (U"Manipulation: Replace duration tier");
+END2 }
 
 /***** MANIPULATION & PITCHTIER *****/
 
-DIRECT (Manipulation_replacePitchTier)
+DIRECT2 (Manipulation_replacePitchTier) {
 	Manipulation me = FIRST (Manipulation);
 	Manipulation_replacePitchTier (me, FIRST (PitchTier));
 	praat_dataChanged (me);
-END
+END2 }
 
-DIRECT (Manipulation_replacePitchTier_help) Melder_help (L"Manipulation: Replace pitch tier"); END
+DIRECT2 (Manipulation_replacePitchTier_help) {
+	Melder_help (U"Manipulation: Replace pitch tier");
+END2 }
 
 /***** MANIPULATION & POINTPROCESS *****/
 
-DIRECT (Manipulation_replacePulses)
+DIRECT2 (Manipulation_replacePulses) {
 	Manipulation me = FIRST (Manipulation);
 	Manipulation_replacePulses (me, FIRST (PointProcess));
 	praat_dataChanged (me);
-END
+END2 }
 
 /***** MANIPULATION & SOUND *****/
 
-DIRECT (Manipulation_replaceOriginalSound)
+DIRECT2 (Manipulation_replaceOriginalSound) {
 	Manipulation me = FIRST (Manipulation);
 	Manipulation_replaceOriginalSound (me, FIRST (Sound));
 	praat_dataChanged (me);
-END
+END2 }
 
 /***** MANIPULATION & TEXTTIER *****/
 
-DIRECT (Manipulation_TextTier_to_Manipulation)
+DIRECT2 (Manipulation_TextTier_to_Manipulation) {
 	Manipulation me = FIRST (Manipulation);
 	TextTier thee = FIRST (TextTier);
 	autoManipulation him = Manipulation_AnyTier_to_Manipulation (me, reinterpret_cast <AnyTier> (thee));
 	praat_new (him.transfer(), my name);	
-END
+END2 }
 
 /***** MATRIX *****/
 
-DIRECT (Matrix_appendRows)
+DIRECT2 (Matrix_appendRows) {
 	Matrix m1 = NULL, m2 = NULL;
 	LOOP (m1 ? m2 : m1) = (Matrix) OBJECT;
 	autoMatrix thee = Matrix_appendRows (m1, m2, classMatrix);
-	praat_new (thee.transfer(), m1 -> name, L"_", m2 -> name);
-END
-
-FORM (Matrix_create, L"Create Matrix", L"Create Matrix...")
-	WORD (L"Name", L"xy")
-	REAL (L"xmin", L"1.0")
-	REAL (L"xmax", L"1.0")
-	NATURAL (L"Number of columns", L"1")
-	POSITIVE (L"dx", L"1.0")
-	REAL (L"x1", L"1.0")
-	REAL (L"ymin", L"1.0")
-	REAL (L"ymax", L"1.0")
-	NATURAL (L"Number of rows", L"1")
-	POSITIVE (L"dy", L"1.0")
-	REAL (L"y1", L"1.0")
-	LABEL (L"", L"Formula:")
-	TEXTFIELD (L"formula", L"x*y")
-	OK
-DO
-	double xmin = GET_REAL (L"xmin"), xmax = GET_REAL (L"xmax");
-	double ymin = GET_REAL (L"ymin"), ymax = GET_REAL (L"ymax");
-	if (xmax < xmin) Melder_throw ("xmax (", Melder_single (xmax), ") should not be less than xmin (", Melder_single (xmin), ").");
-	if (ymax < ymin) Melder_throw ("ymax (", Melder_single (ymax), ") should not be less than ymin (", Melder_single (ymin), ").");
+	praat_new (thee.transfer(), m1 -> name, U"_", m2 -> name);
+END2 }
+
+FORM (Matrix_create, U"Create Matrix", U"Create Matrix...") {
+	WORD (U"Name", U"xy")
+	REAL (U"xmin", U"1.0")
+	REAL (U"xmax", U"1.0")
+	NATURAL (U"Number of columns", U"1")
+	POSITIVE (U"dx", U"1.0")
+	REAL (U"x1", U"1.0")
+	REAL (U"ymin", U"1.0")
+	REAL (U"ymax", U"1.0")
+	NATURAL (U"Number of rows", U"1")
+	POSITIVE (U"dy", U"1.0")
+	REAL (U"y1", U"1.0")
+	LABEL (U"", U"Formula:")
+	TEXTFIELD (U"formula", U"x*y")
+	OK2
+DO
+	double xmin = GET_REAL (U"xmin"), xmax = GET_REAL (U"xmax");
+	double ymin = GET_REAL (U"ymin"), ymax = GET_REAL (U"ymax");
+	if (xmax < xmin) Melder_throw (U"xmax (", Melder_single (xmax), U") should not be less than xmin (", Melder_single (xmin), U").");
+	if (ymax < ymin) Melder_throw (U"ymax (", Melder_single (ymax), U") should not be less than ymin (", Melder_single (ymin), U").");
 	autoMatrix me = Matrix_create (
-		xmin, xmax, GET_INTEGER (L"Number of columns"), GET_REAL (L"dx"), GET_REAL (L"x1"),
-		ymin, ymax, GET_INTEGER (L"Number of rows"), GET_REAL (L"dy"), GET_REAL (L"y1"));
-	Matrix_formula (me.peek(), GET_STRING (L"formula"), interpreter, NULL);
-	praat_new (me.transfer(), GET_STRING (L"Name"));
-END
-
-FORM (Matrix_createSimple, L"Create simple Matrix", L"Create simple Matrix...")
-	WORD (L"Name", L"xy")
-	NATURAL (L"Number of rows", L"10")
-	NATURAL (L"Number of columns", L"10")
-	LABEL (L"", L"Formula:")
-	TEXTFIELD (L"formula", L"x*y")
-	OK
-DO
-	autoMatrix me = Matrix_createSimple (GET_INTEGER (L"Number of rows"), GET_INTEGER (L"Number of columns"));
-	Matrix_formula (me.peek(), GET_STRING (L"formula"), interpreter, NULL);
-	praat_new (me.transfer(), GET_STRING (L"Name"));
-END
-
-FORM (Matrix_drawOneContour, L"Draw one altitude contour", 0)
-	REAL (L"From x =", L"0.0")
-	REAL (L"To x =", L"0.0")
-	REAL (L"From y =", L"0.0")
-	REAL (L"To y =", L"0.0")
-	REAL (L"Height", L"0.5")
-	OK
+		xmin, xmax, GET_INTEGER (U"Number of columns"), GET_REAL (U"dx"), GET_REAL (U"x1"),
+		ymin, ymax, GET_INTEGER (U"Number of rows"), GET_REAL (U"dy"), GET_REAL (U"y1"));
+	Matrix_formula (me.peek(), GET_STRING (U"formula"), interpreter, NULL);
+	praat_new (me.transfer(), GET_STRING (U"Name"));
+END2 }
+
+FORM (Matrix_createSimple, U"Create simple Matrix", U"Create simple Matrix...") {
+	WORD (U"Name", U"xy")
+	NATURAL (U"Number of rows", U"10")
+	NATURAL (U"Number of columns", U"10")
+	LABEL (U"", U"Formula:")
+	TEXTFIELD (U"formula", U"x*y")
+	OK2
+DO
+	autoMatrix me = Matrix_createSimple (GET_INTEGER (U"Number of rows"), GET_INTEGER (U"Number of columns"));
+	Matrix_formula (me.peek(), GET_STRING (U"formula"), interpreter, NULL);
+	praat_new (me.transfer(), GET_STRING (U"Name"));
+END2 }
+
+FORM (Matrix_drawOneContour, U"Draw one altitude contour", 0) {
+	REAL (U"From x =", U"0.0")
+	REAL (U"To x =", U"0.0")
+	REAL (U"From y =", U"0.0")
+	REAL (U"To y =", U"0.0")
+	REAL (U"Height", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
 		autoPraatPicture picture;
 		Matrix_drawOneContour (me, GRAPHICS,
-			GET_REAL (L"From x ="), GET_REAL (L"To x ="), GET_REAL (L"From y ="), GET_REAL (L"To y ="),
-			GET_REAL (L"Height"));
+			GET_REAL (U"From x ="), GET_REAL (U"To x ="), GET_REAL (U"From y ="), GET_REAL (U"To y ="),
+			GET_REAL (U"Height"));
 	}
-END
+END2 }
 
-FORM (Matrix_drawContours, L"Draw altitude contours", 0)
-	REAL (L"From x =", L"0.0")
-	REAL (L"To x =", L"0.0")
-	REAL (L"From y =", L"0.0")
-	REAL (L"To y =", L"0.0")
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0")
-	OK
+FORM (Matrix_drawContours, U"Draw altitude contours", 0) {
+	REAL (U"From x =", U"0.0")
+	REAL (U"To x =", U"0.0")
+	REAL (U"From y =", U"0.0")
+	REAL (U"To y =", U"0.0")
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
 		autoPraatPicture picture;
 		Matrix_drawContours (me, GRAPHICS,
-			GET_REAL (L"From x ="), GET_REAL (L"To x ="), GET_REAL (L"From y ="), GET_REAL (L"To y ="),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"));
+			GET_REAL (U"From x ="), GET_REAL (U"To x ="), GET_REAL (U"From y ="), GET_REAL (U"To y ="),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"));
 	}
-END
+END2 }
 
-FORM (Matrix_drawRows, L"Draw rows", 0)
-	REAL (L"From x =", L"0.0")
-	REAL (L"To x =", L"0.0")
-	REAL (L"From y =", L"0.0")
-	REAL (L"To y =", L"0.0")
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0")
-	OK
+FORM (Matrix_drawRows, U"Draw rows", 0) {
+	REAL (U"From x =", U"0.0")
+	REAL (U"To x =", U"0.0")
+	REAL (U"From y =", U"0.0")
+	REAL (U"To y =", U"0.0")
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
 		autoPraatPicture picture;
 		Matrix_drawRows (me, GRAPHICS,
-			GET_REAL (L"From x ="), GET_REAL (L"To x ="),
-			GET_REAL (L"From y ="), GET_REAL (L"To y ="),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"));
+			GET_REAL (U"From x ="), GET_REAL (U"To x ="),
+			GET_REAL (U"From y ="), GET_REAL (U"To y ="),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"));
 	}
-END
+END2 }
 
-DIRECT (Matrix_eigen)
+DIRECT2 (Matrix_eigen) {
 	LOOP {
 		iam (Matrix);
 		Matrix vec_ = NULL, val_ = NULL;
 		Matrix_eigen (me, & vec_, & val_);
 		autoMatrix vec = vec_;
 		autoMatrix val = val_;
-		praat_new (vec.transfer(), L"eigenvectors");
-		praat_new (val.transfer(), L"eigenvalues");
+		praat_new (vec.transfer(), U"eigenvectors");
+		praat_new (val.transfer(), U"eigenvalues");
 	}
-END
+END2 }
 
-FORM (Matrix_formula, L"Matrix Formula", L"Formula...")
-	LABEL (L"label", L"y := y1; for row := 1 to nrow do { x := x1; "
+FORM (Matrix_formula, U"Matrix Formula", U"Formula...") {
+	LABEL (U"label", U"y := y1; for row := 1 to nrow do { x := x1; "
 		"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + dx } y := y + dy }")
-	TEXTFIELD (L"formula", L"self")
-	OK
+	TEXTFIELD (U"formula", U"self")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
 		try {
-			Matrix_formula (me, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Matrix may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-DIRECT (Matrix_getHighestX)
+DIRECT2 (Matrix_getHighestX) {
 	Matrix me = FIRST_ANY (Matrix);
 	Melder_informationReal (my xmax, NULL);
-END
+END2 }
 
-DIRECT (Matrix_getHighestY)
+DIRECT2 (Matrix_getHighestY) {
 	Matrix me = FIRST_ANY (Matrix);
 	Melder_informationReal (my ymax, NULL);
-END
+END2 }
 
-DIRECT (Matrix_getLowestX)
+DIRECT2 (Matrix_getLowestX) {
 	Matrix me = FIRST_ANY (Matrix);
 	Melder_informationReal (my xmin, NULL);
-END
+END2 }
 
-DIRECT (Matrix_getLowestY)
+DIRECT2 (Matrix_getLowestY) {
 	Matrix me = FIRST_ANY (Matrix);
 	Melder_informationReal (my ymin, NULL);
-END
+END2 }
 
-DIRECT (Matrix_getNumberOfColumns)
+DIRECT2 (Matrix_getNumberOfColumns) {
 	Matrix me = FIRST_ANY (Matrix);
-	Melder_information (Melder_integer (my nx));
-END
+	Melder_information (my nx);
+END2 }
 
-DIRECT (Matrix_getNumberOfRows)
+DIRECT2 (Matrix_getNumberOfRows) {
 	Matrix me = FIRST_ANY (Matrix);
-	Melder_information (Melder_integer (my ny));
-END
+	Melder_information (my ny);
+END2 }
 
-DIRECT (Matrix_getColumnDistance)
+DIRECT2 (Matrix_getColumnDistance) {
 	Matrix me = FIRST_ANY (Matrix);
 	Melder_informationReal (my dx, NULL);
-END
+END2 }
 
-DIRECT (Matrix_getRowDistance)
+DIRECT2 (Matrix_getRowDistance) {
 	Matrix me = FIRST_ANY (Matrix);
 	Melder_informationReal (my dy, NULL);
-END
+END2 }
 
-DIRECT (Matrix_getSum)
+DIRECT2 (Matrix_getSum) {
 	Matrix me = FIRST_ANY (Matrix);
 	double sum = Matrix_getSum (me);
 	Melder_informationReal (sum, NULL);
-END
+END2 }
 
-DIRECT (Matrix_getMaximum)
+DIRECT2 (Matrix_getMaximum) {
 	Matrix me = FIRST_ANY (Matrix);
 	double minimum = NUMundefined, maximum = NUMundefined;
 	Matrix_getWindowExtrema (me, 0, 0, 0, 0, & minimum, & maximum);
 	Melder_informationReal (maximum, NULL);
-END
+END2 }
 
-DIRECT (Matrix_getMinimum)
+DIRECT2 (Matrix_getMinimum) {
 	Matrix me = FIRST_ANY (Matrix);
 	double minimum = NUMundefined, maximum = NUMundefined;
 	Matrix_getWindowExtrema (me, 0, 0, 0, 0, & minimum, & maximum);
 	Melder_informationReal (minimum, NULL);
-END
+END2 }
 
-FORM (Matrix_getValueAtXY, L"Matrix: Get value at xy", 0)
-	REAL (L"X", L"0")
-	REAL (L"Y", L"0")
-	OK
+FORM (Matrix_getValueAtXY, U"Matrix: Get value at xy", 0) {
+	REAL (U"X", U"0")
+	REAL (U"Y", U"0")
+	OK2
 DO
 	Matrix me = FIRST_ANY (Matrix);
-	double x = GET_REAL (L"X"), y = GET_REAL (L"Y");
+	double x = GET_REAL (U"X"), y = GET_REAL (U"Y");
 	double value = Matrix_getValueAtXY (me, x, y);
-	Melder_information (Melder_double (value), L" (at x = ", Melder_double (x), L" and y = ", Melder_double (y), L")");
-END
+	Melder_information (value, U" (at x = ", x, U" and y = ", y, U")");
+END2 }
 
-FORM (Matrix_getValueInCell, L"Matrix: Get value in cell", 0)
-	NATURAL (L"Row number", L"1")
-	NATURAL (L"Column number", L"1")
-	OK
+FORM (Matrix_getValueInCell, U"Matrix: Get value in cell", 0) {
+	NATURAL (U"Row number", U"1")
+	NATURAL (U"Column number", U"1")
+	OK2
 DO
 	Matrix me = FIRST_ANY (Matrix);
-	long row = GET_INTEGER (L"Row number"), column = GET_INTEGER (L"Column number");
-	if (row > my ny) Melder_throw ("Row number must not exceed number of rows.");
-	if (column > my nx) Melder_throw ("Column number must not exceed number of columns.");
+	long row = GET_INTEGER (U"Row number"), column = GET_INTEGER (U"Column number");
+	if (row > my ny) Melder_throw (U"Row number must not exceed number of rows.");
+	if (column > my nx) Melder_throw (U"Column number must not exceed number of columns.");
 	Melder_informationReal (my z [row] [column], NULL);
-END
+END2 }
 
-FORM (Matrix_getXofColumn, L"Matrix: Get x of column", 0)
-	NATURAL (L"Column number", L"1")
-	OK
+FORM (Matrix_getXofColumn, U"Matrix: Get x of column", 0) {
+	NATURAL (U"Column number", U"1")
+	OK2
 DO
 	Matrix me = FIRST_ANY (Matrix);
-	double x = Matrix_columnToX (me, GET_INTEGER (L"Column number"));
+	double x = Matrix_columnToX (me, GET_INTEGER (U"Column number"));
 	Melder_informationReal (x, NULL);
-END
+END2 }
 
-FORM (Matrix_getYofRow, L"Matrix: Get y of row", 0)
-	NATURAL (L"Row number", L"1")
-	OK
+FORM (Matrix_getYofRow, U"Matrix: Get y of row", 0) {
+	NATURAL (U"Row number", U"1")
+	OK2
 DO
 	Matrix me = FIRST_ANY (Matrix);
-	double y = Matrix_rowToY (me, GET_INTEGER (L"Row number"));
+	double y = Matrix_rowToY (me, GET_INTEGER (U"Row number"));
 	Melder_informationReal (y, NULL);
-END
+END2 }
 
-DIRECT (Matrix_help) Melder_help (L"Matrix"); END
+DIRECT2 (Matrix_help) {
+	Melder_help (U"Matrix");
+END2 }
 
-DIRECT (Matrix_movie)
-	Graphics g = Movie_create (L"Matrix movie", 300, 300);
+DIRECT2 (Matrix_movie) {
+	Graphics g = Movie_create (U"Matrix movie", 300, 300);
 	LOOP {
 		iam (Matrix);
 		Matrix_movie (me, g);
 	}
-END
+END2 }
 
-FORM (Matrix_paintCells, L"Matrix: Paint cells with greys", L"Matrix: Paint cells...")
-	REAL (L"From x =", L"0.0")
-	REAL (L"To x =", L"0.0")
-	REAL (L"From y =", L"0.0")
-	REAL (L"To y =", L"0.0")
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0")
-	OK
+FORM (Matrix_paintCells, U"Matrix: Paint cells with greys", U"Matrix: Paint cells...") {
+	REAL (U"From x =", U"0.0")
+	REAL (U"To x =", U"0.0")
+	REAL (U"From y =", U"0.0")
+	REAL (U"To y =", U"0.0")
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
 		autoPraatPicture picture;
 		Matrix_paintCells (me, GRAPHICS,
-			GET_REAL (L"From x ="), GET_REAL (L"To x ="), GET_REAL (L"From y ="), GET_REAL (L"To y ="),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"));
+			GET_REAL (U"From x ="), GET_REAL (U"To x ="), GET_REAL (U"From y ="), GET_REAL (U"To y ="),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"));
 	}
-END
+END2 }
 
-FORM (Matrix_paintContours, L"Matrix: Paint altitude contours with greys", 0)
-	REAL (L"From x =", L"0.0")
-	REAL (L"To x =", L"0.0")
-	REAL (L"From y =", L"0.0")
-	REAL (L"To y =", L"0.0")
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0")
-	OK
+FORM (Matrix_paintContours, U"Matrix: Paint altitude contours with greys", 0) {
+	REAL (U"From x =", U"0.0")
+	REAL (U"To x =", U"0.0")
+	REAL (U"From y =", U"0.0")
+	REAL (U"To y =", U"0.0")
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
 		autoPraatPicture picture;
 		Matrix_paintContours (me, GRAPHICS,
-			GET_REAL (L"From x ="), GET_REAL (L"To x ="), GET_REAL (L"From y ="), GET_REAL (L"To y ="),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"));
+			GET_REAL (U"From x ="), GET_REAL (U"To x ="), GET_REAL (U"From y ="), GET_REAL (U"To y ="),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"));
 	}
-END
+END2 }
 
-FORM (Matrix_paintImage, L"Matrix: Paint grey image", 0)
-	REAL (L"From x =", L"0.0")
-	REAL (L"To x =", L"0.0")
-	REAL (L"From y =", L"0.0")
-	REAL (L"To y =", L"0.0")
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0")
-	OK
+FORM (Matrix_paintImage, U"Matrix: Paint grey image", 0) {
+	REAL (U"From x =", U"0.0")
+	REAL (U"To x =", U"0.0")
+	REAL (U"From y =", U"0.0")
+	REAL (U"To y =", U"0.0")
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
 		autoPraatPicture picture;
 		Matrix_paintImage (me, GRAPHICS,
-			GET_REAL (L"From x ="), GET_REAL (L"To x ="), GET_REAL (L"From y ="), GET_REAL (L"To y ="),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"));
+			GET_REAL (U"From x ="), GET_REAL (U"To x ="), GET_REAL (U"From y ="), GET_REAL (U"To y ="),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"));
 	}
-END
+END2 }
 
-FORM (Matrix_paintSurface, L"Matrix: Paint 3-D surface plot", 0)
-	REAL (L"From x =", L"0.0")
-	REAL (L"To x =", L"0.0")
-	REAL (L"From y =", L"0.0")
-	REAL (L"To y =", L"0.0")
-	REAL (L"Minimum", L"0.0")
-	REAL (L"Maximum", L"0.0")
-	OK
+FORM (Matrix_paintSurface, U"Matrix: Paint 3-D surface plot", 0) {
+	REAL (U"From x =", U"0.0")
+	REAL (U"To x =", U"0.0")
+	REAL (U"From y =", U"0.0")
+	REAL (U"To y =", U"0.0")
+	REAL (U"Minimum", U"0.0")
+	REAL (U"Maximum", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
 		autoPraatPicture picture;
 		Matrix_paintSurface (me, GRAPHICS,
-			GET_REAL (L"From x ="), GET_REAL (L"To x ="), GET_REAL (L"From y ="), GET_REAL (L"To y ="),
-			GET_REAL (L"Minimum"), GET_REAL (L"Maximum"), 30, 45);
+			GET_REAL (U"From x ="), GET_REAL (U"To x ="), GET_REAL (U"From y ="), GET_REAL (U"To y ="),
+			GET_REAL (U"Minimum"), GET_REAL (U"Maximum"), 30, 45);
 	}
-END
+END2 }
 
-FORM (Matrix_power, L"Matrix: Power...", 0)
-	NATURAL (L"Power", L"2")
-	OK
+FORM (Matrix_power, U"Matrix: Power...", 0) {
+	NATURAL (U"Power", U"2")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
-		autoMatrix thee = Matrix_power (me, GET_INTEGER (L"Power"));
+		autoMatrix thee = Matrix_power (me, GET_INTEGER (U"Power"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM_READ (Matrix_readFromRawTextFile, L"Read Matrix from raw text file", 0, true)
+FORM_READ2 (Matrix_readFromRawTextFile, U"Read Matrix from raw text file", 0, true) {
 	autoMatrix me = Matrix_readFromRawTextFile (file);
 	praat_new (me.transfer(), MelderFile_name (file));
-END
+END2 }
 
-FORM_READ (Matrix_readAP, L"Read Matrix from LVS AP file", 0, true)
+FORM_READ2 (Matrix_readAP, U"Read Matrix from LVS AP file", 0, true) {
 	autoMatrix me = Matrix_readAP (file);
 	praat_new (me.transfer(), MelderFile_name (file));
-END
+END2 }
 
-FORM (Matrix_setValue, L"Matrix: Set value", L"Matrix: Set value...")
-	NATURAL (L"Row number", L"1")
-	NATURAL (L"Column number", L"1")
-	REAL (L"New value", L"0.0")
-	OK
+FORM (Matrix_setValue, U"Matrix: Set value", U"Matrix: Set value...") {
+	NATURAL (U"Row number", U"1")
+	NATURAL (U"Column number", U"1")
+	REAL (U"New value", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
-		long row = GET_INTEGER (L"Row number"), column = GET_INTEGER (L"Column number");
-		if (row > my ny) Melder_throw ("Row number must not be greater than number of rows.");
-		if (column > my nx) Melder_throw ("Column number must not be greater than number of columns.");
-		my z [row] [column] = GET_REAL (L"New value");
+		long row = GET_INTEGER (U"Row number"), column = GET_INTEGER (U"Column number");
+		if (row > my ny) Melder_throw (U"Row number must not be greater than number of rows.");
+		if (column > my nx) Melder_throw (U"Column number must not be greater than number of columns.");
+		my z [row] [column] = GET_REAL (U"New value");
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Cochleagram)
+DIRECT2 (Matrix_to_Cochleagram) {
 	LOOP {
 		iam (Matrix);
 		autoCochleagram thee = Matrix_to_Cochleagram (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Excitation)
+DIRECT2 (Matrix_to_Excitation) {
 	LOOP {
 		iam (Matrix);
 		autoExcitation thee = Matrix_to_Excitation (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Harmonicity)
+DIRECT2 (Matrix_to_Harmonicity) {
 	LOOP {
 		iam (Matrix);
 		autoHarmonicity thee = Matrix_to_Harmonicity (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Intensity)
+DIRECT2 (Matrix_to_Intensity) {
 	LOOP {
 		iam (Matrix);
 		autoIntensity thee = Matrix_to_Intensity (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Pitch)
+DIRECT2 (Matrix_to_Pitch) {
 	LOOP {
 		iam (Matrix);
 		autoPitch thee = Matrix_to_Pitch (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Spectrogram)
+DIRECT2 (Matrix_to_Spectrogram) {
 	LOOP {
 		iam (Matrix);
 		autoSpectrogram thee = Matrix_to_Spectrogram (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Spectrum)
+DIRECT2 (Matrix_to_Spectrum) {
 	LOOP {
 		iam (Matrix);
 		autoSpectrum thee = Matrix_to_Spectrum (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Ltas)
+DIRECT2 (Matrix_to_Ltas) {
 	LOOP {
 		iam (Matrix);
 		autoLtas thee = Matrix_to_Ltas (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_ParamCurve)
+DIRECT2 (Matrix_to_ParamCurve) {
 	Matrix m1 = NULL, m2 = NULL;
 	LOOP (m1 ? m2 : m1) = (Matrix) OBJECT;
 	autoSound sound1 = Matrix_to_Sound (m1), sound2 = Matrix_to_Sound (m2);
 	autoParamCurve thee = ParamCurve_create (sound1.peek(), sound2.peek());
-	praat_new (thee.transfer(), m1 -> name, L"_", m2 -> name);
-END
+	praat_new (thee.transfer(), m1 -> name, U"_", m2 -> name);
+END2 }
 
-DIRECT (Matrix_to_PointProcess)
+DIRECT2 (Matrix_to_PointProcess) {
 	LOOP {
 		iam (Matrix);
 		autoPointProcess thee = Matrix_to_PointProcess (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Polygon)
+DIRECT2 (Matrix_to_Polygon) {
 	LOOP {
 		iam (Matrix);
 		autoPolygon thee = Matrix_to_Polygon (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Sound)
+DIRECT2 (Matrix_to_Sound) {
 	LOOP {
 		iam (Matrix);
 		autoSound thee = Matrix_to_Sound (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Matrix_to_Sound_mono, L"Matrix: To Sound (mono)", 0)
-	INTEGER (L"Row", L"1")
-	LABEL (L"", L"(negative values count from last row)")
-	OK
+FORM (Matrix_to_Sound_mono, U"Matrix: To Sound (mono)", 0) {
+	INTEGER (U"Row", U"1")
+	LABEL (U"", U"(negative values count from last row)")
+	OK2
 DO
 	LOOP {
 		iam (Matrix);
-		autoSound thee = Matrix_to_Sound_mono (me, GET_INTEGER (L"Row"));
+		autoSound thee = Matrix_to_Sound_mono (me, GET_INTEGER (U"Row"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_TableOfReal)
+DIRECT2 (Matrix_to_TableOfReal) {
 	LOOP {
 		iam (Matrix);
 		autoTableOfReal thee = Matrix_to_TableOfReal (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_Transition)
+DIRECT2 (Matrix_to_Transition) {
 	LOOP {
 		iam (Matrix);
 		autoTransition thee = Matrix_to_Transition (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Matrix_to_VocalTract)
+DIRECT2 (Matrix_to_VocalTract) {
 	LOOP {
 		iam (Matrix);
 		autoVocalTract thee = Matrix_to_VocalTract (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM_WRITE (Matrix_writeToMatrixTextFile, L"Save Matrix as matrix text file", 0, L"mat")
+FORM_WRITE (Matrix_writeToMatrixTextFile, U"Save Matrix as matrix text file", 0, U"mat")
 	Matrix me = FIRST (Matrix);
 	Matrix_writeToMatrixTextFile (me, file);
 END
 
-FORM_WRITE (Matrix_writeToHeaderlessSpreadsheetFile, L"Save Matrix as spreadsheet", 0, L"txt")
+FORM_WRITE (Matrix_writeToHeaderlessSpreadsheetFile, U"Save Matrix as spreadsheet", 0, U"txt")
 	Matrix me = FIRST (Matrix);
 	Matrix_writeToHeaderlessSpreadsheetFile (me, file);
 END
 
 /***** MOVIE *****/
 
-FORM_READ (Movie_openFromSoundFile, L"Open movie file", 0, true)
+FORM_READ2 (Movie_openFromSoundFile, U"Open movie file", 0, true) {
 	autoMovie me = Movie_openFromSoundFile (file);
 	praat_new (me.transfer(), MelderFile_name (file));
-END
+END2 }
 
-FORM (Movie_paintOneImage, L"Movie: Paint one image", 0)
-	NATURAL (L"Frame number", L"1")
-	REAL (L"From x =", L"0.0")
-	REAL (L"To x =", L"1.0")
-	REAL (L"From y =", L"0.0")
-	REAL (L"To y =", L"1.0")
-	OK
+FORM (Movie_paintOneImage, U"Movie: Paint one image", 0) {
+	NATURAL (U"Frame number", U"1")
+	REAL (U"From x =", U"0.0")
+	REAL (U"To x =", U"1.0")
+	REAL (U"From y =", U"0.0")
+	REAL (U"To y =", U"1.0")
+	OK2
 DO
 	LOOP {
 		iam (Movie);
 		autoPraatPicture picture;
-		Movie_paintOneImage (me, GRAPHICS, GET_INTEGER (L"Frame number"),
-			GET_REAL (L"From x ="), GET_REAL (L"To x ="), GET_REAL (L"From y ="), GET_REAL (L"To y ="));
+		Movie_paintOneImage (me, GRAPHICS, GET_INTEGER (U"Frame number"),
+			GET_REAL (U"From x ="), GET_REAL (U"To x ="), GET_REAL (U"From y ="), GET_REAL (U"To y ="));
 	}
-END
+END2 }
 
-DIRECT (Movie_viewAndEdit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a Movie from batch.");
+DIRECT2 (Movie_viewAndEdit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a Movie from batch.");
 	LOOP {
 		iam (Movie);
 		autoMovieWindow editor = MovieWindow_create (ID_AND_FULL_NAME, me);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
 /***** PARAMCURVE *****/
 
-FORM (ParamCurve_draw, L"Draw parametrized curve", 0)
-	REAL (L"Tmin", L"0.0")
-	REAL (L"Tmax", L"0.0")
-	REAL (L"Step", L"0.0")
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
-	REAL (L"Ymin", L"0.0")
-	REAL (L"Ymax", L"0.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (ParamCurve_draw, U"Draw parametrized curve", 0) {
+	REAL (U"Tmin", U"0.0")
+	REAL (U"Tmax", U"0.0")
+	REAL (U"Step", U"0.0")
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
+	REAL (U"Ymin", U"0.0")
+	REAL (U"Ymax", U"0.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (ParamCurve);
 		autoPraatPicture picture;
 		ParamCurve_draw (me, GRAPHICS,
-			GET_REAL (L"Tmin"), GET_REAL (L"Tmax"), GET_REAL (L"Step"),
-			GET_REAL (L"Xmin"), GET_REAL (L"Xmax"), GET_REAL (L"Ymin"), GET_REAL (L"Ymax"),
-			GET_INTEGER (L"Garnish"));
+			GET_REAL (U"Tmin"), GET_REAL (U"Tmax"), GET_REAL (U"Step"),
+			GET_REAL (U"Xmin"), GET_REAL (U"Xmax"), GET_REAL (U"Ymin"), GET_REAL (U"Ymax"),
+			GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-DIRECT (ParamCurve_help) Melder_help (L"ParamCurve"); END
+DIRECT (ParamCurve_help) Melder_help (U"ParamCurve"); END
 
 /***** PHOTO *****/
 
-FORM (Photo_create, L"Create Photo", L"Create Photo...")
-	WORD (L"Name", L"xy")
-	REAL (L"xmin", L"1.0")
-	REAL (L"xmax", L"1.0")
-	NATURAL (L"Number of columns", L"1")
-	POSITIVE (L"dx", L"1.0")
-	REAL (L"x1", L"1.0")
-	REAL (L"ymin", L"1.0")
-	REAL (L"ymax", L"1.0")
-	NATURAL (L"Number of rows", L"1")
-	POSITIVE (L"dy", L"1.0")
-	REAL (L"y1", L"1.0")
-	LABEL (L"", L"Red formula:")
-	TEXTFIELD (L"redFormula", L"x*y/100")
-	LABEL (L"", L"Green formula:")
-	TEXTFIELD (L"greenFormula", L"x*y/1000")
-	LABEL (L"", L"Blue formula:")
-	TEXTFIELD (L"blueFormula", L"x*y/100")
-	OK
-DO
-	double xmin = GET_REAL (L"xmin"), xmax = GET_REAL (L"xmax");
-	double ymin = GET_REAL (L"ymin"), ymax = GET_REAL (L"ymax");
-	if (xmax < xmin) Melder_throw ("xmax (", Melder_single (xmax), ") should not be less than xmin (", Melder_single (xmin), ").");
-	if (ymax < ymin) Melder_throw ("ymax (", Melder_single (ymax), ") should not be less than ymin (", Melder_single (ymin), ").");
+FORM (Photo_create, U"Create Photo", U"Create Photo...") {
+	WORD (U"Name", U"xy")
+	REAL (U"xmin", U"1.0")
+	REAL (U"xmax", U"1.0")
+	NATURAL (U"Number of columns", U"1")
+	POSITIVE (U"dx", U"1.0")
+	REAL (U"x1", U"1.0")
+	REAL (U"ymin", U"1.0")
+	REAL (U"ymax", U"1.0")
+	NATURAL (U"Number of rows", U"1")
+	POSITIVE (U"dy", U"1.0")
+	REAL (U"y1", U"1.0")
+	LABEL (U"", U"Red formula:")
+	TEXTFIELD (U"redFormula", U"x*y/100")
+	LABEL (U"", U"Green formula:")
+	TEXTFIELD (U"greenFormula", U"x*y/1000")
+	LABEL (U"", U"Blue formula:")
+	TEXTFIELD (U"blueFormula", U"x*y/100")
+	OK2
+DO
+	double xmin = GET_REAL (U"xmin"), xmax = GET_REAL (U"xmax");
+	double ymin = GET_REAL (U"ymin"), ymax = GET_REAL (U"ymax");
+	if (xmax < xmin) Melder_throw (U"xmax (", Melder_single (xmax), U") should not be less than xmin (", Melder_single (xmin), U").");
+	if (ymax < ymin) Melder_throw (U"ymax (", Melder_single (ymax), U") should not be less than ymin (", Melder_single (ymin), U").");
 	autoPhoto me = Photo_create (
-		xmin, xmax, GET_INTEGER (L"Number of columns"), GET_REAL (L"dx"), GET_REAL (L"x1"),
-		ymin, ymax, GET_INTEGER (L"Number of rows"), GET_REAL (L"dy"), GET_REAL (L"y1"));
-	Matrix_formula (my d_red,   GET_STRING (L"redFormula"),   interpreter, NULL);
-	Matrix_formula (my d_green, GET_STRING (L"greenFormula"), interpreter, NULL);
-	Matrix_formula (my d_blue,  GET_STRING (L"blueFormula"),  interpreter, NULL);
-	praat_new (me.transfer(), GET_STRING (L"Name"));
-END
-
-FORM (Photo_createSimple, L"Create simple Photo", L"Create simple Photo...")
-	WORD (L"Name", L"xy")
-	NATURAL (L"Number of rows", L"10")
-	NATURAL (L"Number of columns", L"10")
-	LABEL (L"", L"Red formula:")
-	TEXTFIELD (L"redFormula", L"x*y/100")
-	LABEL (L"", L"Green formula:")
-	TEXTFIELD (L"greenFormula", L"x*y/1000")
-	LABEL (L"", L"Blue formula:")
-	TEXTFIELD (L"blueFormula", L"x*y/100")
-	OK
-DO
-	autoPhoto me = Photo_createSimple (GET_INTEGER (L"Number of rows"), GET_INTEGER (L"Number of columns"));
-	Matrix_formula (my d_red,   GET_STRING (L"redFormula"),   interpreter, NULL);
-	Matrix_formula (my d_green, GET_STRING (L"greenFormula"), interpreter, NULL);
-	Matrix_formula (my d_blue,  GET_STRING (L"blueFormula"),  interpreter, NULL);
-	praat_new (me.transfer(), GET_STRING (L"Name"));
-END
-
-DIRECT (Photo_extractBlue)
+		xmin, xmax, GET_INTEGER (U"Number of columns"), GET_REAL (U"dx"), GET_REAL (U"x1"),
+		ymin, ymax, GET_INTEGER (U"Number of rows"), GET_REAL (U"dy"), GET_REAL (U"y1"));
+	Matrix_formula (my d_red  .get(), GET_STRING (U"redFormula"),   interpreter, NULL);
+	Matrix_formula (my d_green.get(), GET_STRING (U"greenFormula"), interpreter, NULL);
+	Matrix_formula (my d_blue .get(), GET_STRING (U"blueFormula"),  interpreter, NULL);
+	praat_new (me.transfer(), GET_STRING (U"Name"));
+END2 }
+
+FORM (Photo_createSimple, U"Create simple Photo", U"Create simple Photo...") {
+	WORD (U"Name", U"xy")
+	NATURAL (U"Number of rows", U"10")
+	NATURAL (U"Number of columns", U"10")
+	LABEL (U"", U"Red formula:")
+	TEXTFIELD (U"redFormula", U"x*y/100")
+	LABEL (U"", U"Green formula:")
+	TEXTFIELD (U"greenFormula", U"x*y/1000")
+	LABEL (U"", U"Blue formula:")
+	TEXTFIELD (U"blueFormula", U"x*y/100")
+	OK2
+DO
+	autoPhoto me = Photo_createSimple (GET_INTEGER (U"Number of rows"), GET_INTEGER (U"Number of columns"));
+	Matrix_formula (my d_red.get(),   GET_STRING (U"redFormula"),   interpreter, NULL);
+	Matrix_formula (my d_green.get(), GET_STRING (U"greenFormula"), interpreter, NULL);
+	Matrix_formula (my d_blue.get(),  GET_STRING (U"blueFormula"),  interpreter, NULL);
+	praat_new (me.transfer(), GET_STRING (U"Name"));
+END2 }
+
+DIRECT2 (Photo_extractBlue) {
 	LOOP {
 		iam (Photo);
-		autoMatrix thee = Data_copy (my d_blue);
-		praat_new (thee.transfer(), my name, L"_blue");
+		autoMatrix thee = Data_copy (my d_blue.get());
+		praat_new (thee.transfer(), my name, U"_blue");
 	}
-END
+END2 }
 
-DIRECT (Photo_extractGreen)
+DIRECT2 (Photo_extractGreen) {
 	LOOP {
 		iam (Photo);
-		autoMatrix thee = Data_copy (my d_green);
-		praat_new (thee.transfer(), my name, L"_green");
+		autoMatrix thee = Data_copy (my d_green.get());
+		praat_new (thee.transfer(), my name, U"_green");
 	}
-END
+END2 }
 
-DIRECT (Photo_extractRed)
+DIRECT2 (Photo_extractRed) {
 	LOOP {
 		iam (Photo);
-		autoMatrix thee = Data_copy (my d_red);
-		praat_new (thee.transfer(), my name, L"_red");
+		autoMatrix thee = Data_copy (my d_red.get());
+		praat_new (thee.transfer(), my name, U"_red");
 	}
-END
+END2 }
 
-DIRECT (Photo_extractTransparency)
+DIRECT2 (Photo_extractTransparency) {
 	LOOP {
 		iam (Photo);
-		autoMatrix thee = Data_copy (my d_transparency);
-		praat_new (thee.transfer(), my name, L"_transparency");
+		autoMatrix thee = Data_copy (my d_transparency.get());
+		praat_new (thee.transfer(), my name, U"_transparency");
 	}
-END
+END2 }
 
-FORM (Photo_formula_red, L"Photo Formula (red)", L"Formula (red)...")
-	LABEL (L"label", L"y := y1; for row := 1 to nrow do { x := x1; "
+FORM (Photo_formula_red, U"Photo Formula (red)", U"Formula (red)...") {
+	LABEL (U"label", U"y := y1; for row := 1 to nrow do { x := x1; "
 		"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + dx } y := y + dy }")
-	TEXTFIELD (L"formula", L"self")
-	OK
+	TEXTFIELD (U"formula", U"self")
+	OK2
 DO
 	LOOP {
 		iam (Photo);
 		try {
-			Matrix_formula (my d_red, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (my d_red.get(), GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Photo may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Photo_formula_green, L"Photo Formula (green)", L"Formula (green)...")
-	LABEL (L"label", L"y := y1; for row := 1 to nrow do { x := x1; "
+FORM (Photo_formula_green, U"Photo Formula (green)", U"Formula (green)...") {
+	LABEL (U"label", U"y := y1; for row := 1 to nrow do { x := x1; "
 		"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + dx } y := y + dy }")
-	TEXTFIELD (L"formula", L"self")
-	OK
+	TEXTFIELD (U"formula", U"self")
+	OK2
 DO
 	LOOP {
 		iam (Photo);
 		try {
-			Matrix_formula (my d_green, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (my d_green.get(), GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Photo may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Photo_formula_blue, L"Photo Formula (blue)", L"Formula (blue)...")
-	LABEL (L"label", L"y := y1; for row := 1 to nrow do { x := x1; "
+FORM (Photo_formula_blue, U"Photo Formula (blue)", U"Formula (blue)...") {
+	LABEL (U"label", U"y := y1; for row := 1 to nrow do { x := x1; "
 		"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + dx } y := y + dy }")
-	TEXTFIELD (L"formula", L"self")
-	OK
+	TEXTFIELD (U"formula", U"self")
+	OK2
 DO
 	LOOP {
 		iam (Photo);
 		try {
-			Matrix_formula (my d_blue, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (my d_blue.get(), GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Photo may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Photo_formula_transparency, L"Photo Formula (transparency)", L"Formula (transparency)...")
-	LABEL (L"label", L"y := y1; for row := 1 to nrow do { x := x1; "
+FORM (Photo_formula_transparency, U"Photo Formula (transparency)", U"Formula (transparency)...") {
+	LABEL (U"label", U"y := y1; for row := 1 to nrow do { x := x1; "
 		"for col := 1 to ncol do { self [row, col] := `formula' ; x := x + dx } y := y + dy }")
-	TEXTFIELD (L"formula", L"self")
-	OK
+	TEXTFIELD (U"formula", U"self")
+	OK2
 DO
 	LOOP {
 		iam (Photo);
 		try {
-			Matrix_formula (my d_transparency, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula (my d_transparency.get(), GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Photo may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Photo_paintCells, L"Photo: Paint cells with colour", L"Photo: Paint cells...")
-	REAL (L"From x =", L"0.0")
-	REAL (L"To x =", L"0.0")
-	REAL (L"From y =", L"0.0")
-	REAL (L"To y =", L"0.0")
-	OK
+FORM (Photo_paintCells, U"Photo: Paint cells with colour", U"Photo: Paint cells...") {
+	REAL (U"From x =", U"0.0")
+	REAL (U"To x =", U"0.0")
+	REAL (U"From y =", U"0.0")
+	REAL (U"To y =", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Photo);
 		autoPraatPicture picture;
 		Photo_paintCells (me, GRAPHICS,
-			GET_REAL (L"From x ="), GET_REAL (L"To x ="), GET_REAL (L"From y ="), GET_REAL (L"To y ="));
+			GET_REAL (U"From x ="), GET_REAL (U"To x ="), GET_REAL (U"From y ="), GET_REAL (U"To y ="));
 	}
-END
+END2 }
 
-FORM (Photo_paintImage, L"Photo: Paint colour image", 0)
-	REAL (L"From x =", L"0.0")
-	REAL (L"To x =", L"0.0")
-	REAL (L"From y =", L"0.0")
-	REAL (L"To y =", L"0.0")
-	OK
+FORM (Photo_paintImage, U"Photo: Paint colour image", 0) {
+	REAL (U"From x =", U"0.0")
+	REAL (U"To x =", U"0.0")
+	REAL (U"From y =", U"0.0")
+	REAL (U"To y =", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Photo);
 		autoPraatPicture picture;
 		Photo_paintImage (me, GRAPHICS,
-			GET_REAL (L"From x ="), GET_REAL (L"To x ="), GET_REAL (L"From y ="), GET_REAL (L"To y ="));
+			GET_REAL (U"From x ="), GET_REAL (U"To x ="), GET_REAL (U"From y ="), GET_REAL (U"To y ="));
 	}
-END
+END2 }
 
-FORM_WRITE (Photo_saveAsAppleIconFile, L"Save as Apple icon file", 0, L"icns")
+FORM_WRITE (Photo_saveAsAppleIconFile, U"Save as Apple icon file", 0, U"icns")
 	LOOP {
 		iam (Photo);
 		Photo_saveAsAppleIconFile (me, file);
 	}
 END
 
-FORM_WRITE (Photo_saveAsGIF, L"Save as GIF file", 0, L"gif")
+FORM_WRITE (Photo_saveAsGIF, U"Save as GIF file", 0, U"gif")
 	LOOP {
 		iam (Photo);
 		Photo_saveAsGIF (me, file);
 	}
 END
 
-FORM_WRITE (Photo_saveAsJPEG, L"Save as JPEG file", 0, L"jpg")
+FORM_WRITE (Photo_saveAsJPEG, U"Save as JPEG file", 0, U"jpg")
 	LOOP {
 		iam (Photo);
 		Photo_saveAsJPEG (me, file);
 	}
 END
 
-FORM_WRITE (Photo_saveAsJPEG2000, L"Save as JPEG-2000 file", 0, L"jpg")
+FORM_WRITE (Photo_saveAsJPEG2000, U"Save as JPEG-2000 file", 0, U"jpg")
 	LOOP {
 		iam (Photo);
 		Photo_saveAsJPEG2000 (me, file);
 	}
 END
 
-FORM_WRITE (Photo_saveAsPNG, L"Save as PNG file", 0, L"png")
+FORM_WRITE (Photo_saveAsPNG, U"Save as PNG file", 0, U"png")
 	LOOP {
 		iam (Photo);
 		Photo_saveAsPNG (me, file);
 	}
 END
 
-FORM_WRITE (Photo_saveAsTIFF, L"Save as TIFF file", 0, L"tiff")
+FORM_WRITE (Photo_saveAsTIFF, U"Save as TIFF file", 0, U"tiff")
 	LOOP {
 		iam (Photo);
 		Photo_saveAsTIFF (me, file);
 	}
 END
 
-FORM_WRITE (Photo_saveAsWindowsBitmapFile, L"Save as Windows bitmap file", 0, L"bmp")
+FORM_WRITE (Photo_saveAsWindowsBitmapFile, U"Save as Windows bitmap file", 0, U"bmp")
 	LOOP {
 		iam (Photo);
 		Photo_saveAsWindowsBitmapFile (me, file);
 	}
 END
 
-FORM_WRITE (Photo_saveAsWindowsIconFile, L"Save as Windows icon file", 0, L"ico")
+FORM_WRITE (Photo_saveAsWindowsIconFile, U"Save as Windows icon file", 0, U"ico")
 	LOOP {
 		iam (Photo);
 		Photo_saveAsWindowsIconFile (me, file);
@@ -3301,289 +3331,289 @@ END
 
 /***** PHOTO & MATRIX *****/
 
-DIRECT (Photo_Matrix_replaceBlue)
+DIRECT2 (Photo_Matrix_replaceBlue) {
 	Photo me = FIRST (Photo);
 	Matrix thee = FIRST (Matrix);
 	Photo_replaceBlue (me, thee);
 	praat_dataChanged (me);
-END
+END2 }
 
-DIRECT (Photo_Matrix_replaceGreen)
+DIRECT2 (Photo_Matrix_replaceGreen) {
 	Photo me = FIRST (Photo);
 	Matrix thee = FIRST (Matrix);
 	Photo_replaceGreen (me, thee);
 	praat_dataChanged (me);
-END
+END2 }
 
-DIRECT (Photo_Matrix_replaceRed)
+DIRECT2 (Photo_Matrix_replaceRed) {
 	Photo me = FIRST (Photo);
 	Matrix thee = FIRST (Matrix);
 	Photo_replaceRed (me, thee);
 	praat_dataChanged (me);
-END
+END2 }
 
-DIRECT (Photo_Matrix_replaceTransparency)
+DIRECT2 (Photo_Matrix_replaceTransparency) {
 	Photo me = FIRST (Photo);
 	Matrix thee = FIRST (Matrix);
 	Photo_replaceTransparency (me, thee);
 	praat_dataChanged (me);
-END
+END2 }
 
 /***** PITCH *****/
 
-DIRECT (Pitch_getNumberOfVoicedFrames)
+DIRECT2 (Pitch_getNumberOfVoicedFrames) {
 	Pitch me = FIRST (Pitch);
-	Melder_information (Melder_integer (Pitch_countVoicedFrames (me)), L" voiced frames");
-END
+	Melder_information (Pitch_countVoicedFrames (me), U" voiced frames");
+END2 }
 
-DIRECT (Pitch_difference)
+DIRECT2 (Pitch_difference) {
 	Pitch pit1 = NULL, pit2 = NULL;
 	LOOP (pit1 ? pit2 : pit1) = (Pitch) OBJECT;
 	Pitch_difference (pit1, pit2);
-END
+END2 }
 
-FORM (Pitch_draw, L"Pitch: Draw", L"Pitch: Draw...")
+FORM (Pitch_draw, U"Pitch: Draw", U"Pitch: Draw...") {
 	praat_dia_timeRange (dia);
-	REAL (STRING_FROM_FREQUENCY_HZ, L"0.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+	REAL (STRING_FROM_FREQUENCY_HZ, U"0.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
 		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax,
-			GET_INTEGER (L"Garnish"), Pitch_speckle_NO, kPitch_unit_HERTZ);
+			GET_INTEGER (U"Garnish"), Pitch_speckle_NO, kPitch_unit_HERTZ);
 	}
-END
+END2 }
 
-FORM (Pitch_drawErb, L"Pitch: Draw erb", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	REAL (L"left Frequency range (ERB)", L"0")
-	REAL (L"right Frequency range (ERB)", L"10.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_drawErb, U"Pitch: Draw erb", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	REAL (U"left Frequency range (ERB)", U"0")
+	REAL (U"right Frequency range (ERB)", U"10.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
 		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax,
-			GET_INTEGER (L"Garnish"), Pitch_speckle_NO, kPitch_unit_ERB);
+			GET_INTEGER (U"Garnish"), Pitch_speckle_NO, kPitch_unit_ERB);
 	}
-END
+END2 }
 
-FORM (Pitch_drawLogarithmic, L"Pitch: Draw logarithmic", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	POSITIVE (STRING_FROM_FREQUENCY_HZ, L"50.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_drawLogarithmic, U"Pitch: Draw logarithmic", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	POSITIVE (STRING_FROM_FREQUENCY_HZ, U"50.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
 		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax,
-			GET_INTEGER (L"Garnish"), Pitch_speckle_NO, kPitch_unit_HERTZ_LOGARITHMIC);
+			GET_INTEGER (U"Garnish"), Pitch_speckle_NO, kPitch_unit_HERTZ_LOGARITHMIC);
 	}
-END
+END2 }
 
-FORM (Pitch_drawMel, L"Pitch: Draw mel", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	REAL (L"left Frequency range (mel)", L"0.0")
-	REAL (L"right Frequency range (mel)", L"500.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_drawMel, U"Pitch: Draw mel", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	REAL (U"left Frequency range (mel)", U"0.0")
+	REAL (U"right Frequency range (mel)", U"500.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
 		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax,
-			GET_INTEGER (L"Garnish"), Pitch_speckle_NO, kPitch_unit_MEL);
+			GET_INTEGER (U"Garnish"), Pitch_speckle_NO, kPitch_unit_MEL);
 	}
-END
+END2 }
 
-FORM (Pitch_drawSemitones100, L"Pitch: Draw semitones (re 100 Hz)", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	LABEL (L"", L"Range in semitones re 100 Hz:")
-	REAL (L"left Frequency range (st)", L"-12.0")
-	REAL (L"right Frequency range (st)", L"30.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_drawSemitones100, U"Pitch: Draw semitones (re 100 Hz)", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	LABEL (U"", U"Range in semitones re 100 Hz:")
+	REAL (U"left Frequency range (st)", U"-12.0")
+	REAL (U"right Frequency range (st)", U"30.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
 		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax,
-			GET_INTEGER (L"Garnish"), Pitch_speckle_NO, kPitch_unit_SEMITONES_100);
+			GET_INTEGER (U"Garnish"), Pitch_speckle_NO, kPitch_unit_SEMITONES_100);
 	}
-END
+END2 }
 
-FORM (Pitch_drawSemitones200, L"Pitch: Draw semitones (re 200 Hz)", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	LABEL (L"", L"Range in semitones re 200 Hz:")
-	REAL (L"left Frequency range (st)", L"-24.0")
-	REAL (L"right Frequency range (st)", L"18.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_drawSemitones200, U"Pitch: Draw semitones (re 200 Hz)", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	LABEL (U"", U"Range in semitones re 200 Hz:")
+	REAL (U"left Frequency range (st)", U"-24.0")
+	REAL (U"right Frequency range (st)", U"18.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
 		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax,
-			GET_INTEGER (L"Garnish"), Pitch_speckle_NO, kPitch_unit_SEMITONES_200);
+			GET_INTEGER (U"Garnish"), Pitch_speckle_NO, kPitch_unit_SEMITONES_200);
 	}
-END
+END2 }
 
-FORM (Pitch_drawSemitones440, L"Pitch: Draw semitones (re 440 Hz)", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	LABEL (L"", L"Range in semitones re 440 Hz:")
-	REAL (L"left Frequency range (st)", L"-36.0")
-	REAL (L"right Frequency range (st)", L"6.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_drawSemitones440, U"Pitch: Draw semitones (re 440 Hz)", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	LABEL (U"", U"Range in semitones re 440 Hz:")
+	REAL (U"left Frequency range (st)", U"-36.0")
+	REAL (U"right Frequency range (st)", U"6.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
 		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax,
-			GET_INTEGER (L"Garnish"), Pitch_speckle_NO, kPitch_unit_SEMITONES_440);
+			GET_INTEGER (U"Garnish"), Pitch_speckle_NO, kPitch_unit_SEMITONES_440);
 	}
-END
+END2 }
 
-DIRECT (Pitch_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a Pitch from batch.");
+DIRECT2 (Pitch_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a Pitch from batch.");
 	LOOP {
 		iam (Pitch);
 		autoPitchEditor editor = PitchEditor_create (ID_AND_FULL_NAME, me);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-FORM (Pitch_formula, L"Pitch: Formula", L"Formula...")
-	LABEL (L"", L"x = time; col = frame; row = candidate (1 = current path); frequency (time, candidate) :=")
-	TEXTFIELD (L"formula", L"self*2; Example: octave jump up")
-	OK
+FORM (Pitch_formula, U"Pitch: Formula", U"Formula...") {
+	LABEL (U"", U"x = time; col = frame; row = candidate (1 = current path); frequency (time, candidate) :=")
+	TEXTFIELD (U"formula", U"self*2; Example: octave jump up")
+	OK2
 DO
 	LOOP {
 		iam (Pitch);
 		try {
-			Pitch_formula (me, GET_STRING (L"formula"), interpreter);
+			Pitch_formula (me, GET_STRING (U"formula"), interpreter);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Pitch may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Pitch_getMaximum, L"Pitch: Get maximum", 0)
+FORM (Pitch_getMaximum, U"Pitch: Get maximum", 0) {
 	praat_dia_timeRange (dia);
-	OPTIONMENU_ENUM (L"Unit", kPitch_unit, DEFAULT)
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	OK
+	OPTIONMENU_ENUM (U"Unit", kPitch_unit, DEFAULT)
+	RADIO (U"Interpolation", 2)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+	OK2
 DO
-	enum kPitch_unit unit = GET_ENUM (kPitch_unit, L"Unit");
+	enum kPitch_unit unit = GET_ENUM (kPitch_unit, U"Unit");
 	Pitch me = FIRST (Pitch);
-	double value = Pitch_getMaximum (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), unit, GET_INTEGER (L"Interpolation") - 1);
+	double value = Pitch_getMaximum (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), unit, GET_INTEGER (U"Interpolation") - 1);
 	value = Function_convertToNonlogarithmic (me, value, Pitch_LEVEL_FREQUENCY, unit);
 	Melder_informationReal (value, Function_getUnitText (me, Pitch_LEVEL_FREQUENCY, unit, 0));
-END
+END2 }
 
-FORM (Pitch_getMean, L"Pitch: Get mean", 0)
+FORM (Pitch_getMean, U"Pitch: Get mean", 0) {
 	praat_dia_timeRange (dia);
-	OPTIONMENU_ENUM (L"Unit", kPitch_unit, DEFAULT)
-	OK
+	OPTIONMENU_ENUM (U"Unit", kPitch_unit, DEFAULT)
+	OK2
 DO
-	enum kPitch_unit unit = GET_ENUM (kPitch_unit, L"Unit");
+	enum kPitch_unit unit = GET_ENUM (kPitch_unit, U"Unit");
 	Pitch me = FIRST (Pitch);
-	double value = Pitch_getMean (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), unit);
+	double value = Pitch_getMean (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), unit);
 	value = Function_convertToNonlogarithmic (me, value, Pitch_LEVEL_FREQUENCY, unit);
 	Melder_informationReal (value, Function_getUnitText (me, Pitch_LEVEL_FREQUENCY, unit, 0));
-END
+END2 }
 
-FORM (Pitch_getMeanAbsoluteSlope, L"Pitch: Get mean absolute slope", 0)
-	RADIO (L"Unit", 1)
-		RADIOBUTTON (L"Hertz")
-		RADIOBUTTON (L"Mel")
-		RADIOBUTTON (L"Semitones")
-		RADIOBUTTON (L"ERB")
-	OK
+FORM (Pitch_getMeanAbsoluteSlope, U"Pitch: Get mean absolute slope", 0) {
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Mel")
+		RADIOBUTTON (U"Semitones")
+		RADIOBUTTON (U"ERB")
+	OK2
 DO
-	int unit = GET_INTEGER (L"Unit");
+	int unit = GET_INTEGER (U"Unit");
 	Pitch me = FIRST (Pitch);
 	double slope;
 	long nVoiced = (unit == 1 ? Pitch_getMeanAbsSlope_hertz : unit == 2 ? Pitch_getMeanAbsSlope_mel : unit == 3 ? Pitch_getMeanAbsSlope_semitones : Pitch_getMeanAbsSlope_erb)
 		(me, & slope);
 	if (nVoiced < 2) {
-		Melder_information (L"--undefined--");
+		Melder_information (U"--undefined--");
 	} else {
-		Melder_information (Melder_double (slope), L" ", GET_STRING (L"Unit"), L"/s");
+		Melder_information (slope, U" ", GET_STRING (U"Unit"), U"/s");
 	}
-END
+END2 }
 
-DIRECT (Pitch_getMeanAbsSlope_noOctave)
+DIRECT2 (Pitch_getMeanAbsSlope_noOctave) {
 	Pitch me = FIRST (Pitch);
 	double slope;
 	(void) Pitch_getMeanAbsSlope_noOctave (me, & slope);
-	Melder_informationReal (slope, L"Semitones/s");
-END
+	Melder_informationReal (slope, U"Semitones/s");
+END2 }
 
-FORM (Pitch_getMinimum, L"Pitch: Get minimum", 0)
+FORM (Pitch_getMinimum, U"Pitch: Get minimum", 0) {
 	praat_dia_timeRange (dia);
-	OPTIONMENU_ENUM (L"Unit", kPitch_unit, DEFAULT)
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	OK
+	OPTIONMENU_ENUM (U"Unit", kPitch_unit, DEFAULT)
+	RADIO (U"Interpolation", 2)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+	OK2
 DO
-	enum kPitch_unit unit = GET_ENUM (kPitch_unit, L"Unit");
+	enum kPitch_unit unit = GET_ENUM (kPitch_unit, U"Unit");
 	Pitch me = FIRST (Pitch);
-	double value = Sampled_getMinimum (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		Pitch_LEVEL_FREQUENCY, unit, GET_INTEGER (L"Interpolation") - 1);
+	double value = Sampled_getMinimum (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		Pitch_LEVEL_FREQUENCY, unit, GET_INTEGER (U"Interpolation") - 1);
 	value = Function_convertToNonlogarithmic (me, value, Pitch_LEVEL_FREQUENCY, unit);
 	Melder_informationReal (value, Function_getUnitText (me, Pitch_LEVEL_FREQUENCY, unit, 0));
-END
+END2 }
 
-FORM (Pitch_getQuantile, L"Pitch: Get quantile", 0)
+FORM (Pitch_getQuantile, U"Pitch: Get quantile", 0) {
 	praat_dia_timeRange (dia);
-	REAL (L"Quantile", L"0.50 (= median)")
-	OPTIONMENU_ENUM (L"Unit", kPitch_unit, DEFAULT)
-	OK
+	REAL (U"Quantile", U"0.50 (= median)")
+	OPTIONMENU_ENUM (U"Unit", kPitch_unit, DEFAULT)
+	OK2
 DO
-	enum kPitch_unit unit = GET_ENUM (kPitch_unit, L"Unit");
+	enum kPitch_unit unit = GET_ENUM (kPitch_unit, U"Unit");
 	Pitch me = FIRST (Pitch);
-	double value = Sampled_getQuantile (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Quantile"), Pitch_LEVEL_FREQUENCY, unit);
+	double value = Sampled_getQuantile (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Quantile"), Pitch_LEVEL_FREQUENCY, unit);
 	value = Function_convertToNonlogarithmic (me, value, Pitch_LEVEL_FREQUENCY, unit);
 	Melder_informationReal (value, Function_getUnitText (me, Pitch_LEVEL_FREQUENCY, unit, 0));
-END
+END2 }
 
-FORM (Pitch_getStandardDeviation, L"Pitch: Get standard deviation", 0)
+FORM (Pitch_getStandardDeviation, U"Pitch: Get standard deviation", 0) {
 	praat_dia_timeRange (dia);
-	OPTIONMENU (L"Unit", 1)
-		OPTION (L"Hertz")
-		OPTION (L"mel")
-		OPTION (L"logHertz")
-		OPTION (L"semitones")
-		OPTION (L"ERB")
-	OK
-DO
-	int unit = GET_INTEGER (L"Unit");
+	OPTIONMENU (U"Unit", 1)
+		OPTION (U"Hertz")
+		OPTION (U"mel")
+		OPTION (U"logHertz")
+		OPTION (U"semitones")
+		OPTION (U"ERB")
+	OK2
+DO
+	int unit = GET_INTEGER (U"Unit");
 	unit =
 		unit == 1 ? kPitch_unit_HERTZ :
 		unit == 2 ? kPitch_unit_MEL :
@@ -3591,635 +3621,639 @@ DO
 		unit == 4 ? kPitch_unit_SEMITONES_1 :
 		kPitch_unit_ERB;
 	Pitch me = FIRST (Pitch);
-	double value = Pitch_getStandardDeviation (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), unit);
-	const wchar_t *unitText =
-		unit == kPitch_unit_HERTZ ? L"Hz" :
-		unit == kPitch_unit_MEL ? L"mel" :
-		unit == kPitch_unit_LOG_HERTZ ? L"logHz" :
-		unit == kPitch_unit_SEMITONES_1 ? L"semitones" :
-		L"ERB";
+	double value = Pitch_getStandardDeviation (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), unit);
+	const char32 *unitText =
+		unit == kPitch_unit_HERTZ ? U"Hz" :
+		unit == kPitch_unit_MEL ? U"mel" :
+		unit == kPitch_unit_LOG_HERTZ ? U"logHz" :
+		unit == kPitch_unit_SEMITONES_1 ? U"semitones" :
+		U"ERB";
 	Melder_informationReal (value, unitText);
-END
+END2 }
 
-FORM (Pitch_getTimeOfMaximum, L"Pitch: Get time of maximum", 0)
+FORM (Pitch_getTimeOfMaximum, U"Pitch: Get time of maximum", 0) {
 	praat_dia_timeRange (dia);
-	OPTIONMENU_ENUM (L"Unit", kPitch_unit, DEFAULT)
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	OK
+	OPTIONMENU_ENUM (U"Unit", kPitch_unit, DEFAULT)
+	RADIO (U"Interpolation", 2)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+	OK2
 DO
 	Pitch me = FIRST (Pitch);
 	double time = Pitch_getTimeOfMaximum (me,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_ENUM (kPitch_unit, L"Unit"), GET_INTEGER (L"Interpolation") - 1);
-	Melder_informationReal (time, L"seconds");
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_ENUM (kPitch_unit, U"Unit"), GET_INTEGER (U"Interpolation") - 1);
+	Melder_informationReal (time, U"seconds");
+END2 }
 
-FORM (Pitch_getTimeOfMinimum, L"Pitch: Get time of minimum", 0)
+FORM (Pitch_getTimeOfMinimum, U"Pitch: Get time of minimum", 0) {
 	praat_dia_timeRange (dia);
-	OPTIONMENU_ENUM (L"Unit", kPitch_unit, DEFAULT)
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	OK
+	OPTIONMENU_ENUM (U"Unit", kPitch_unit, DEFAULT)
+	RADIO (U"Interpolation", 2)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+	OK2
 DO
 	Pitch me = FIRST (Pitch);
 	double time = Pitch_getTimeOfMinimum (me,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_ENUM (kPitch_unit, L"Unit"), GET_INTEGER (L"Interpolation") - 1);
-	Melder_informationReal (time, L"seconds");
-END
-
-FORM (Pitch_getValueAtTime, L"Pitch: Get value at time", L"Pitch: Get value at time...")
-	REAL (L"Time (s)", L"0.5")
-	OPTIONMENU_ENUM (L"Unit", kPitch_unit, DEFAULT)
-	RADIO (L"Interpolation", 2)
-	RADIOBUTTON (L"Nearest")
-	RADIOBUTTON (L"Linear")
-	OK
-DO
-	enum kPitch_unit unit = GET_ENUM (kPitch_unit, L"Unit");
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_ENUM (kPitch_unit, U"Unit"), GET_INTEGER (U"Interpolation") - 1);
+	Melder_informationReal (time, U"seconds");
+END2 }
+
+FORM (Pitch_getValueAtTime, U"Pitch: Get value at time", U"Pitch: Get value at time...") {
+	REAL (U"Time (s)", U"0.5")
+	OPTIONMENU_ENUM (U"Unit", kPitch_unit, DEFAULT)
+	RADIO (U"Interpolation", 2)
+		RADIOBUTTON (U"Nearest")
+		RADIOBUTTON (U"Linear")
+	OK2
+DO
+	enum kPitch_unit unit = GET_ENUM (kPitch_unit, U"Unit");
 	Pitch me = FIRST (Pitch);
-	double value = Sampled_getValueAtX (me, GET_REAL (L"Time"), Pitch_LEVEL_FREQUENCY, unit, GET_INTEGER (L"Interpolation") - 1);
+	double value = Sampled_getValueAtX (me, GET_REAL (U"Time"), Pitch_LEVEL_FREQUENCY, unit, GET_INTEGER (U"Interpolation") - 1);
 	value = Function_convertToNonlogarithmic (me, value, Pitch_LEVEL_FREQUENCY, unit);
 	Melder_informationReal (value, Function_getUnitText (me, Pitch_LEVEL_FREQUENCY, unit, 0));
-END
+END2 }
 	
-FORM (Pitch_getValueInFrame, L"Pitch: Get value in frame", L"Pitch: Get value in frame...")
-	INTEGER (L"Frame number", L"10")
-	OPTIONMENU_ENUM (L"Unit", kPitch_unit, DEFAULT)
-	OK
+FORM (Pitch_getValueInFrame, U"Pitch: Get value in frame", U"Pitch: Get value in frame...") {
+	INTEGER (U"Frame number", U"10")
+	OPTIONMENU_ENUM (U"Unit", kPitch_unit, DEFAULT)
+	OK2
 DO
-	enum kPitch_unit unit = GET_ENUM (kPitch_unit, L"Unit");
+	enum kPitch_unit unit = GET_ENUM (kPitch_unit, U"Unit");
 	Pitch me = FIRST (Pitch);
-	double value = Sampled_getValueAtSample (me, GET_INTEGER (L"Frame number"), Pitch_LEVEL_FREQUENCY, unit);
+	double value = Sampled_getValueAtSample (me, GET_INTEGER (U"Frame number"), Pitch_LEVEL_FREQUENCY, unit);
 	value = Function_convertToNonlogarithmic (me, value, Pitch_LEVEL_FREQUENCY, unit);
 	Melder_informationReal (value, Function_getUnitText (me, Pitch_LEVEL_FREQUENCY, unit, 0));
-END
+END2 }
 
-DIRECT (Pitch_help) Melder_help (L"Pitch"); END
+DIRECT2 (Pitch_help) {
+	Melder_help (U"Pitch");
+END2 }
 
-DIRECT (Pitch_hum)
+DIRECT2 (Pitch_hum) {
 	LOOP {
 		iam (Pitch);
 		Pitch_hum (me, 0, 0);
 	}
-END
+END2 }
 
-DIRECT (Pitch_interpolate)
+DIRECT2 (Pitch_interpolate) {
 	LOOP {
 		iam (Pitch);
 		autoPitch thee = Pitch_interpolate (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Pitch_killOctaveJumps)
+DIRECT2 (Pitch_killOctaveJumps) {
 	LOOP {
 		iam (Pitch);
 		autoPitch thee = Pitch_killOctaveJumps (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Pitch_play)
+DIRECT2 (Pitch_play) {
 	LOOP {
 		iam (Pitch);
 		Pitch_play (me, 0, 0);
 	}
-END
+END2 }
 
-FORM (Pitch_smooth, L"Pitch: Smooth", L"Pitch: Smooth...")
-	REAL (L"Bandwidth (Hz)", L"10.0")
-	OK
+FORM (Pitch_smooth, U"Pitch: Smooth", U"Pitch: Smooth...") {
+	REAL (U"Bandwidth (Hz)", U"10.0")
+	OK2
 DO
 	LOOP {
 		iam (Pitch);
-		autoPitch thee = Pitch_smooth (me, GET_REAL (L"Bandwidth"));
+		autoPitch thee = Pitch_smooth (me, GET_REAL (U"Bandwidth"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Pitch_speckle, L"Pitch: Speckle", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	REAL (STRING_FROM_FREQUENCY_HZ, L"0.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_speckle, U"Pitch: Speckle", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	REAL (STRING_FROM_FREQUENCY_HZ, U"0.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
-		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (L"Garnish"), Pitch_speckle_YES, kPitch_unit_HERTZ);
+		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (U"Garnish"), Pitch_speckle_YES, kPitch_unit_HERTZ);
 	}
-END
+END2 }
 
-FORM (Pitch_speckleErb, L"Pitch: Speckle erb", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	REAL (L"left Frequency range (ERB)", L"0")
-	REAL (L"right Frequency range (ERB)", L"10.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_speckleErb, U"Pitch: Speckle erb", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	REAL (U"left Frequency range (ERB)", U"0")
+	REAL (U"right Frequency range (ERB)", U"10.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
-		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (L"Garnish"), Pitch_speckle_YES, kPitch_unit_ERB);
+		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (U"Garnish"), Pitch_speckle_YES, kPitch_unit_ERB);
 	}
-END
+END2 }
 
-FORM (Pitch_speckleLogarithmic, L"Pitch: Speckle logarithmic", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	POSITIVE (STRING_FROM_FREQUENCY_HZ, L"50.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_speckleLogarithmic, U"Pitch: Speckle logarithmic", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	POSITIVE (STRING_FROM_FREQUENCY_HZ, U"50.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
-		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (L"Garnish"), Pitch_speckle_YES, kPitch_unit_HERTZ_LOGARITHMIC);
+		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (U"Garnish"), Pitch_speckle_YES, kPitch_unit_HERTZ_LOGARITHMIC);
 	}
-END
+END2 }
 
-FORM (Pitch_speckleMel, L"Pitch: Speckle mel", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	REAL (L"left Frequency range (mel)", L"0")
-	REAL (L"right Frequency range (mel)", L"500")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_speckleMel, U"Pitch: Speckle mel", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	REAL (U"left Frequency range (mel)", U"0")
+	REAL (U"right Frequency range (mel)", U"500")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
-		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (L"Garnish"), Pitch_speckle_YES, kPitch_unit_MEL);
+		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (U"Garnish"), Pitch_speckle_YES, kPitch_unit_MEL);
 	}
-END
+END2 }
 
-FORM (Pitch_speckleSemitones100, L"Pitch: Speckle semitones (re 100 Hz)", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	LABEL (L"", L"Range in semitones re 100 hertz:")
-	REAL (L"left Frequency range (st)", L"-12.0")
-	REAL (L"right Frequency range (st)", L"30.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_speckleSemitones100, U"Pitch: Speckle semitones (re 100 Hz)", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	LABEL (U"", U"Range in semitones re 100 hertz:")
+	REAL (U"left Frequency range (st)", U"-12.0")
+	REAL (U"right Frequency range (st)", U"30.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
-		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (L"Garnish"), Pitch_speckle_YES, kPitch_unit_SEMITONES_100);
+		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (U"Garnish"), Pitch_speckle_YES, kPitch_unit_SEMITONES_100);
 	}
-END
+END2 }
 
-FORM (Pitch_speckleSemitones200, L"Pitch: Speckle semitones (re 200 Hz)", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	LABEL (L"", L"Range in semitones re 200 hertz:")
-	REAL (L"left Frequency range (st)", L"-24.0")
-	REAL (L"right Frequency range (st)", L"18.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_speckleSemitones200, U"Pitch: Speckle semitones (re 200 Hz)", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	LABEL (U"", U"Range in semitones re 200 hertz:")
+	REAL (U"left Frequency range (st)", U"-24.0")
+	REAL (U"right Frequency range (st)", U"18.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
-		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (L"Garnish"), Pitch_speckle_YES, kPitch_unit_SEMITONES_200);
+		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (U"Garnish"), Pitch_speckle_YES, kPitch_unit_SEMITONES_200);
 	}
-END
+END2 }
 
-FORM (Pitch_speckleSemitones440, L"Pitch: Speckle semitones (re 440 Hz)", L"Pitch: Draw...")
-	REAL (STRING_FROM_TIME_SECONDS, L"0.0")
-	REAL (STRING_TO_TIME_SECONDS, L"0.0 (= all)")
-	LABEL (L"", L"Range in semitones re 440 hertz:")
-	REAL (L"left Frequency range (st)", L"-36.0")
-	REAL (L"right Frequency range (st)", L"6.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Pitch_speckleSemitones440, U"Pitch: Speckle semitones (re 440 Hz)", U"Pitch: Draw...") {
+	REAL (STRING_FROM_TIME_SECONDS, U"0.0")
+	REAL (STRING_TO_TIME_SECONDS, U"0.0 (= all)")
+	LABEL (U"", U"Range in semitones re 440 hertz:")
+	REAL (U"left Frequency range (st)", U"-36.0")
+	REAL (U"right Frequency range (st)", U"6.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	GET_TMIN_TMAX_FMIN_FMAX
 	LOOP {
 		iam (Pitch);
 		autoPraatPicture picture;
-		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (L"Garnish"), Pitch_speckle_YES, kPitch_unit_SEMITONES_440);
+		Pitch_draw (me, GRAPHICS, tmin, tmax, fmin, fmax, GET_INTEGER (U"Garnish"), Pitch_speckle_YES, kPitch_unit_SEMITONES_440);
 	}
-END
+END2 }
 
-FORM (Pitch_subtractLinearFit, L"Pitch: subtract linear fit", 0)
-	RADIO (L"Unit", 1)
-		RADIOBUTTON (L"Hertz")
-		RADIOBUTTON (L"Hertz (logarithmic)")
-		RADIOBUTTON (L"Mel")
-		RADIOBUTTON (L"Semitones")
-		RADIOBUTTON (L"ERB")
-	OK
+FORM (Pitch_subtractLinearFit, U"Pitch: subtract linear fit", 0) {
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Hertz (logarithmic)")
+		RADIOBUTTON (U"Mel")
+		RADIOBUTTON (U"Semitones")
+		RADIOBUTTON (U"ERB")
+	OK2
 DO
 	LOOP {
 		iam (Pitch);
-		autoPitch thee = Pitch_subtractLinearFit (me, GET_INTEGER (L"Unit") - 1);
+		autoPitch thee = Pitch_subtractLinearFit (me, GET_INTEGER (U"Unit") - 1);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Pitch_to_IntervalTier)
+DIRECT2 (Pitch_to_IntervalTier) {
 	LOOP {
 		iam (Pitch);
 		autoIntervalTier thee = IntervalTier_create (my xmin, my xmax);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Pitch_to_Matrix)
+DIRECT2 (Pitch_to_Matrix) {
 	LOOP {
 		iam (Pitch);
 		autoMatrix thee = Pitch_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Pitch_to_PitchTier)
+DIRECT2 (Pitch_to_PitchTier) {
 	LOOP {
 		iam (Pitch);
 		autoPitchTier thee = Pitch_to_PitchTier (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Pitch_to_PointProcess)
+DIRECT2 (Pitch_to_PointProcess) {
 	LOOP {
 		iam (Pitch);
 		autoPointProcess thee = Pitch_to_PointProcess (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Pitch_to_Sound_pulses)
+DIRECT2 (Pitch_to_Sound_pulses) {
 	LOOP {
 		iam (Pitch);
-		autoSound thee = Pitch_to_Sound (me, 0, 0, FALSE);
+		autoSound thee = Pitch_to_Sound (me, 0, 0, false);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Pitch_to_Sound_hum)
+DIRECT2 (Pitch_to_Sound_hum) {
 	LOOP {
 		iam (Pitch);
-		autoSound thee = Pitch_to_Sound (me, 0, 0, TRUE);
+		autoSound thee = Pitch_to_Sound (me, 0, 0, true);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Pitch_to_Sound_sine, L"Pitch: To Sound (sine)", 0)
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
-	RADIO (L"Cut voiceless stretches", 2)
-		OPTION (L"exactly")
-		OPTION (L"at nearest zero crossings")
-	OK
+FORM (Pitch_to_Sound_sine, U"Pitch: To Sound (sine)", 0) {
+	POSITIVE (U"Sampling frequency (Hz)", U"44100")
+	RADIO (U"Cut voiceless stretches", 2)
+		OPTION (U"exactly")
+		OPTION (U"at nearest zero crossings")
+	OK2
 DO
 	LOOP {
 		iam (Pitch);
-		autoSound thee = Pitch_to_Sound_sine (me, 0, 0, GET_REAL (L"Sampling frequency"), GET_INTEGER (L"Cut voiceless stretches") - 1);
+		autoSound thee = Pitch_to_Sound_sine (me, 0, 0, GET_REAL (U"Sampling frequency"), GET_INTEGER (U"Cut voiceless stretches") - 1);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Pitch_to_TextGrid, L"To TextGrid...", L"Pitch: To TextGrid...")
-	SENTENCE (L"Tier names", L"Mary John bell")
-	SENTENCE (L"Point tiers", L"bell")
-	OK
+FORM (Pitch_to_TextGrid, U"To TextGrid...", U"Pitch: To TextGrid...") {
+	SENTENCE (U"Tier names", U"Mary John bell")
+	SENTENCE (U"Point tiers", U"bell")
+	OK2
 DO
 	LOOP {
 		iam (Pitch);
-		autoTextGrid thee = TextGrid_create (my xmin, my xmax, GET_STRING (L"Tier names"), GET_STRING (L"Point tiers"));
+		autoTextGrid thee = TextGrid_create (my xmin, my xmax, GET_STRING (U"Tier names"), GET_STRING (U"Point tiers"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Pitch_to_TextTier)
+DIRECT2 (Pitch_to_TextTier) {
 	LOOP {
 		iam (Pitch);
 		autoTextTier thee = TextTier_create (my xmin, my xmax);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** PITCH & PITCHTIER *****/
 
-FORM (old_PitchTier_Pitch_draw, L"PitchTier & Pitch: Draw", 0)
+FORM (old_PitchTier_Pitch_draw, U"PitchTier & Pitch: Draw", 0) {
 	praat_dia_timeRange (dia);
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"500.0")
-	RADIO (L"Line type for non-periodic intervals", 2)
-		RADIOBUTTON (L"Normal")
-		RADIOBUTTON (L"Dotted")
-		RADIOBUTTON (L"Blank")
-	BOOLEAN (L"Garnish", 1)
-	OK
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"500.0")
+	RADIO (U"Line type for non-periodic intervals", 2)
+		RADIOBUTTON (U"Normal")
+		RADIOBUTTON (U"Dotted")
+		RADIOBUTTON (U"Blank")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	PitchTier me = FIRST (PitchTier);
 	Pitch thee = FIRST (Pitch);
 	autoPraatPicture picture;
 	PitchTier_Pitch_draw (me, thee, GRAPHICS,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"From frequency"), GET_REAL (L"To frequency"),
-		GET_INTEGER (L"Line type for non-periodic intervals") - 1,
-		GET_INTEGER (L"Garnish"), L"lines and speckles");
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"From frequency"), GET_REAL (U"To frequency"),
+		GET_INTEGER (U"Line type for non-periodic intervals") - 1,
+		GET_INTEGER (U"Garnish"), U"lines and speckles");
+END2 }
 
-FORM (PitchTier_Pitch_draw, L"PitchTier & Pitch: Draw", 0)
+FORM (PitchTier_Pitch_draw, U"PitchTier & Pitch: Draw", 0) {
 	praat_dia_timeRange (dia);
-	REAL (L"From frequency (Hz)", L"0.0")
-	REAL (L"To frequency (Hz)", L"500.0")
-	RADIO (L"Line type for non-periodic intervals", 2)
-		RADIOBUTTON (L"Normal")
-		RADIOBUTTON (L"Dotted")
-		RADIOBUTTON (L"Blank")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"")
-	OPTIONMENU (L"Drawing method", 1)
-		OPTION (L"lines")
-		OPTION (L"speckles")
-		OPTION (L"lines and speckles")
-	OK
+	REAL (U"From frequency (Hz)", U"0.0")
+	REAL (U"To frequency (Hz)", U"500.0")
+	RADIO (U"Line type for non-periodic intervals", 2)
+		RADIOBUTTON (U"Normal")
+		RADIOBUTTON (U"Dotted")
+		RADIOBUTTON (U"Blank")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"")
+	OPTIONMENU (U"Drawing method", 1)
+		OPTION (U"lines")
+		OPTION (U"speckles")
+		OPTION (U"lines and speckles")
+	OK2
 DO_ALTERNATIVE (old_PitchTier_Pitch_draw)
 	PitchTier me = FIRST (PitchTier);
 	Pitch thee = FIRST (Pitch);
 	autoPraatPicture picture;
 	PitchTier_Pitch_draw (me, thee, GRAPHICS,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"From frequency"), GET_REAL (L"To frequency"),
-		GET_INTEGER (L"Line type for non-periodic intervals") - 1,
-		GET_INTEGER (L"Garnish"), GET_STRING (L"Drawing method"));
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"From frequency"), GET_REAL (U"To frequency"),
+		GET_INTEGER (U"Line type for non-periodic intervals") - 1,
+		GET_INTEGER (U"Garnish"), GET_STRING (U"Drawing method"));
+END2 }
 
-DIRECT (Pitch_PitchTier_to_Pitch)
+DIRECT2 (Pitch_PitchTier_to_Pitch) {
 	Pitch pitch = FIRST (Pitch);
 	PitchTier tier = FIRST (PitchTier);
 	autoPitch thee = Pitch_PitchTier_to_Pitch (pitch, tier);
-	praat_new (thee.transfer(), pitch -> name, L"_stylized");
-END
+	praat_new (thee.transfer(), pitch -> name, U"_stylized");
+END2 }
 
 /***** PITCH & POINTPROCESS *****/
 
-DIRECT (Pitch_PointProcess_to_PitchTier)
+DIRECT2 (Pitch_PointProcess_to_PitchTier) {
 	Pitch pitch = FIRST (Pitch);
 	PointProcess point = FIRST (PointProcess);
 	autoPitchTier thee = Pitch_PointProcess_to_PitchTier (pitch, point);
 	praat_new (thee.transfer(), pitch -> name);
-END
+END2 }
 
 /***** PITCH & SOUND *****/
 
-DIRECT (Sound_Pitch_to_Manipulation)
+DIRECT2 (Sound_Pitch_to_Manipulation) {
 	Pitch pitch = FIRST (Pitch);
 	Sound sound = FIRST (Sound);
 	autoManipulation thee = Sound_Pitch_to_Manipulation (sound, pitch);
 	praat_new (thee.transfer(), pitch -> name);
-END
+END2 }
 
-DIRECT (Sound_Pitch_to_PointProcess_cc)
+DIRECT2 (Sound_Pitch_to_PointProcess_cc) {
 	Sound sound = FIRST (Sound);
 	Pitch pitch = FIRST (Pitch);
 	autoPointProcess thee = Sound_Pitch_to_PointProcess_cc (sound, pitch);
-	praat_new (thee.transfer(), sound -> name, L"_", pitch -> name);
-END
+	praat_new (thee.transfer(), sound -> name, U"_", pitch -> name);
+END2 }
 
-FORM (Sound_Pitch_to_PointProcess_peaks, L"Sound & Pitch: To PointProcess (peaks)", 0)
-	BOOLEAN (L"Include maxima", 1)
-	BOOLEAN (L"Include minima", 0)
-	OK
+FORM (Sound_Pitch_to_PointProcess_peaks, U"Sound & Pitch: To PointProcess (peaks)", 0) {
+	BOOLEAN (U"Include maxima", 1)
+	BOOLEAN (U"Include minima", 0)
+	OK2
 DO
 	Sound sound = FIRST (Sound);
 	Pitch pitch = FIRST (Pitch);
-	autoPointProcess thee = Sound_Pitch_to_PointProcess_peaks (sound, pitch, GET_INTEGER (L"Include maxima"), GET_INTEGER (L"Include minima"));
-	praat_new (thee.transfer(), sound -> name, L"_", pitch -> name);
-END
+	autoPointProcess thee = Sound_Pitch_to_PointProcess_peaks (sound, pitch, GET_INTEGER (U"Include maxima"), GET_INTEGER (U"Include minima"));
+	praat_new (thee.transfer(), sound -> name, U"_", pitch -> name);
+END2 }
 
 /***** PITCHTIER *****/
 
-FORM (PitchTier_addPoint, L"PitchTier: Add point", L"PitchTier: Add point...")
-	REAL (L"Time (s)", L"0.5")
-	REAL (L"Pitch (Hz)", L"200")
-	OK
+FORM (PitchTier_addPoint, U"PitchTier: Add point", U"PitchTier: Add point...") {
+	REAL (U"Time (s)", U"0.5")
+	REAL (U"Pitch (Hz)", U"200")
+	OK2
 DO
 	LOOP {
 		iam (PitchTier);
-		RealTier_addPoint (me, GET_REAL (L"Time"), GET_REAL (L"Pitch"));
+		RealTier_addPoint (me, GET_REAL (U"Time"), GET_REAL (U"Pitch"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (PitchTier_create, L"Create empty PitchTier", NULL)
-	WORD (L"Name", L"empty")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	OK
+FORM (PitchTier_create, U"Create empty PitchTier", NULL) {
+	WORD (U"Name", U"empty")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	OK2
 DO
-	double startTime = GET_REAL (L"Start time"), endTime = GET_REAL (L"End time");
-	if (endTime <= startTime) Melder_throw ("End time must be greater than start time.");
+	double startTime = GET_REAL (U"Start time"), endTime = GET_REAL (U"End time");
+	if (endTime <= startTime) Melder_throw (U"End time must be greater than start time.");
 	autoPitchTier me = PitchTier_create (startTime, endTime);
-	praat_new (me.transfer(), GET_STRING (L"Name"));
-END
+	praat_new (me.transfer(), GET_STRING (U"Name"));
+END2 }
 
-DIRECT (PitchTier_downto_PointProcess)
+DIRECT2 (PitchTier_downto_PointProcess) {
 	LOOP {
 		iam (PitchTier);
 		autoPointProcess thee = AnyTier_downto_PointProcess (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PitchTier_downto_TableOfReal, L"PitchTier: Down to TableOfReal", NULL)
-	RADIO (L"Unit", 1)
-	RADIOBUTTON (L"Hertz")
-	RADIOBUTTON (L"Semitones")
-	OK
+FORM (PitchTier_downto_TableOfReal, U"PitchTier: Down to TableOfReal", NULL) {
+	RADIO (U"Unit", 1)
+		RADIOBUTTON (U"Hertz")
+		RADIOBUTTON (U"Semitones")
+	OK2
 DO
 	LOOP {
 		iam (PitchTier);
-		autoTableOfReal thee = PitchTier_downto_TableOfReal (me, GET_INTEGER (L"Unit") - 1);
+		autoTableOfReal thee = PitchTier_downto_TableOfReal (me, GET_INTEGER (U"Unit") - 1);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (old_PitchTier_draw, L"PitchTier: Draw", 0)
+FORM (old_PitchTier_draw, U"PitchTier: Draw", 0) {
 	praat_dia_timeRange (dia);
-	REAL (STRING_FROM_FREQUENCY_HZ, L"0.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+	REAL (STRING_FROM_FREQUENCY_HZ, U"0.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	double minimumFrequency = GET_REAL (STRING_FROM_FREQUENCY);
 	double maximumFrequency = GET_REAL (STRING_TO_FREQUENCY);
-	if (maximumFrequency <= minimumFrequency) Melder_throw ("Maximum frequency must be greater than minimum frequency.");
+	if (maximumFrequency <= minimumFrequency) Melder_throw (U"Maximum frequency must be greater than minimum frequency.");
 	LOOP {
 		iam (PitchTier);
 		autoPraatPicture picture;
 		PitchTier_draw (me, GRAPHICS,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), minimumFrequency, maximumFrequency,
-			GET_INTEGER (L"Garnish"), L"lines and speckles");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), minimumFrequency, maximumFrequency,
+			GET_INTEGER (U"Garnish"), U"lines and speckles");
 	}
-END
+END2 }
 
-FORM (PitchTier_draw, L"PitchTier: Draw", 0)
+FORM (PitchTier_draw, U"PitchTier: Draw", 0) {
 	praat_dia_timeRange (dia);
-	REAL (STRING_FROM_FREQUENCY_HZ, L"0.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"")
-	OPTIONMENU (L"Drawing method", 1)
-		OPTION (L"lines")
-		OPTION (L"speckles")
-		OPTION (L"lines and speckles")
-	OK
+	REAL (STRING_FROM_FREQUENCY_HZ, U"0.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"")
+	OPTIONMENU (U"Drawing method", 1)
+		OPTION (U"lines")
+		OPTION (U"speckles")
+		OPTION (U"lines and speckles")
+	OK2
 DO_ALTERNATIVE (old_PitchTier_draw)
 	double minimumFrequency = GET_REAL (STRING_FROM_FREQUENCY);
 	double maximumFrequency = GET_REAL (STRING_TO_FREQUENCY);
-	if (maximumFrequency <= minimumFrequency) Melder_throw ("Maximum frequency must be greater than minimum frequency.");
+	if (maximumFrequency <= minimumFrequency) Melder_throw (U"Maximum frequency must be greater than minimum frequency.");
 	LOOP {
 		iam (PitchTier);
 		autoPraatPicture picture;
 		PitchTier_draw (me, GRAPHICS,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), minimumFrequency, maximumFrequency,
-			GET_INTEGER (L"Garnish"), GET_STRING (L"Drawing method"));
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), minimumFrequency, maximumFrequency,
+			GET_INTEGER (U"Garnish"), GET_STRING (U"Drawing method"));
 	}
-END
+END2 }
 
-DIRECT (PitchTier_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a PitchTier from batch.");
+DIRECT2 (PitchTier_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a PitchTier from batch.");
 	Sound sound = FIRST (Sound);
 	LOOP if (CLASS == classPitchTier) {
 		iam (PitchTier);
-		autoPitchTierEditor editor = PitchTierEditor_create (ID_AND_FULL_NAME, me, sound, TRUE);
+		autoPitchTierEditor editor = PitchTierEditor_create (ID_AND_FULL_NAME, me, sound, true);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-FORM (PitchTier_formula, L"PitchTier: Formula", L"PitchTier: Formula...")
-	LABEL (L"", L"# ncol = the number of points")
-	LABEL (L"", L"for col from 1 to ncol")
-	LABEL (L"", L"   # x = the time of the colth point, in seconds")
-	LABEL (L"", L"   # self = the value of the colth point, in hertz")
-	LABEL (L"", L"   self = `formula'")
-	LABEL (L"", L"endfor")
-	TEXTFIELD (L"formula", L"self * 2 ; one octave up")
-	OK
+FORM (PitchTier_formula, U"PitchTier: Formula", U"PitchTier: Formula...") {
+	LABEL (U"", U"# ncol = the number of points")
+	LABEL (U"", U"for col from 1 to ncol")
+	LABEL (U"", U"   # x = the time of the colth point, in seconds")
+	LABEL (U"", U"   # self = the value of the colth point, in hertz")
+	LABEL (U"", U"   self = `formula'")
+	LABEL (U"", U"endfor")
+	TEXTFIELD (U"formula", U"self * 2 ; one octave up")
+	OK2
 DO
 	LOOP {
 		iam (PitchTier);
 		try {
-			RealTier_formula (me, GET_STRING (L"formula"), interpreter, NULL);
+			RealTier_formula (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the PitchTier may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (PitchTier_getMean_curve, L"PitchTier: Get mean (curve)", L"PitchTier: Get mean (curve)...")
+FORM (PitchTier_getMean_curve, U"PitchTier: Get mean (curve)", U"PitchTier: Get mean (curve)...") {
 	praat_dia_timeRange (dia);
-	OK
+	OK2
 DO
-	Melder_informationReal (RealTier_getMean_curve (FIRST_ANY (PitchTier), GET_REAL (L"left Time range"), GET_REAL (L"right Time range")), L"Hz");
-END
+	Melder_informationReal (RealTier_getMean_curve (FIRST_ANY (PitchTier), GET_REAL (U"left Time range"), GET_REAL (U"right Time range")), U"Hz");
+END2 }
 	
-FORM (PitchTier_getMean_points, L"PitchTier: Get mean (points)", L"PitchTier: Get mean (points)...")
+FORM (PitchTier_getMean_points, U"PitchTier: Get mean (points)", U"PitchTier: Get mean (points)...") {
 	praat_dia_timeRange (dia);
-	OK
+	OK2
 DO
-	Melder_informationReal (RealTier_getMean_points (FIRST_ANY (PitchTier), GET_REAL (L"left Time range"), GET_REAL (L"right Time range")), L"Hz");
-END
+	Melder_informationReal (RealTier_getMean_points (FIRST_ANY (PitchTier), GET_REAL (U"left Time range"), GET_REAL (U"right Time range")), U"Hz");
+END2 }
 	
-FORM (PitchTier_getStandardDeviation_curve, L"PitchTier: Get standard deviation (curve)", L"PitchTier: Get standard deviation (curve)...")
+FORM (PitchTier_getStandardDeviation_curve, U"PitchTier: Get standard deviation (curve)", U"PitchTier: Get standard deviation (curve)...") {
 	praat_dia_timeRange (dia);
-	OK
+	OK2
 DO
-	Melder_informationReal (RealTier_getStandardDeviation_curve (FIRST_ANY (PitchTier), GET_REAL (L"left Time range"), GET_REAL (L"right Time range")), L"Hz");
-END
+	Melder_informationReal (RealTier_getStandardDeviation_curve (FIRST_ANY (PitchTier), GET_REAL (U"left Time range"), GET_REAL (U"right Time range")), U"Hz");
+END2 }
 	
-FORM (PitchTier_getStandardDeviation_points, L"PitchTier: Get standard deviation (points)", L"PitchTier: Get standard deviation (points)...")
+FORM (PitchTier_getStandardDeviation_points, U"PitchTier: Get standard deviation (points)", U"PitchTier: Get standard deviation (points)...") {
 	praat_dia_timeRange (dia);
-	OK
+	OK2
 DO
-	Melder_informationReal (RealTier_getStandardDeviation_points (FIRST_ANY (PitchTier), GET_REAL (L"left Time range"), GET_REAL (L"right Time range")), L"Hz");
-END
+	Melder_informationReal (RealTier_getStandardDeviation_points (FIRST_ANY (PitchTier), GET_REAL (U"left Time range"), GET_REAL (U"right Time range")), U"Hz");
+END2 }
 	
-FORM (PitchTier_getValueAtTime, L"PitchTier: Get value at time", L"PitchTier: Get value at time...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (PitchTier_getValueAtTime, U"PitchTier: Get value at time", U"PitchTier: Get value at time...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
-	Melder_informationReal (RealTier_getValueAtTime (FIRST_ANY (PitchTier), GET_REAL (L"Time")), L"Hz");
-END
+	Melder_informationReal (RealTier_getValueAtTime (FIRST_ANY (PitchTier), GET_REAL (U"Time")), U"Hz");
+END2 }
 	
-FORM (PitchTier_getValueAtIndex, L"PitchTier: Get value at index", L"PitchTier: Get value at index...")
-	INTEGER (L"Point number", L"10")
-	OK
+FORM (PitchTier_getValueAtIndex, U"PitchTier: Get value at index", U"PitchTier: Get value at index...") {
+	INTEGER (U"Point number", U"10")
+	OK2
 DO
-	Melder_informationReal (RealTier_getValueAtIndex (FIRST_ANY (PitchTier), GET_INTEGER (L"Point number")), L"Hz");
-END
+	Melder_informationReal (RealTier_getValueAtIndex (FIRST_ANY (PitchTier), GET_INTEGER (U"Point number")), U"Hz");
+END2 }
 
-DIRECT (PitchTier_help) Melder_help (L"PitchTier"); END
+DIRECT2 (PitchTier_help) {
+	Melder_help (U"PitchTier");
+END2 }
 
-DIRECT (PitchTier_hum)
+DIRECT2 (PitchTier_hum) {
 	LOOP {
 		iam (PitchTier);
 		PitchTier_hum (me);
 	}
-END
+END2 }
 
-FORM (PitchTier_interpolateQuadratically, L"PitchTier: Interpolate quadratically", 0)
-	NATURAL (L"Number of points per parabola", L"4")
-	RADIO (L"Unit", 2)
-	RADIOBUTTON (L"Hz")
-	RADIOBUTTON (L"Semitones")
-	OK
+FORM (PitchTier_interpolateQuadratically, U"PitchTier: Interpolate quadratically", 0) {
+	NATURAL (U"Number of points per parabola", U"4")
+	RADIO (U"Unit", 2)
+		RADIOBUTTON (U"Hz")
+		RADIOBUTTON (U"Semitones")
+	OK2
 DO
 	LOOP {
 		iam (PitchTier);
-		RealTier_interpolateQuadratically (me, GET_INTEGER (L"Number of points per parabola"), GET_INTEGER (L"Unit") - 1);
+		RealTier_interpolateQuadratically (me, GET_INTEGER (U"Number of points per parabola"), GET_INTEGER (U"Unit") - 1);
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-DIRECT (PitchTier_play)
+DIRECT2 (PitchTier_play) {
 	LOOP {
 		iam (PitchTier);
 		PitchTier_play (me);
 	}
-END
+END2 }
 
-DIRECT (PitchTier_playSine)
+DIRECT2 (PitchTier_playSine) {
 	LOOP {
 		iam (PitchTier);
 		PitchTier_playPart_sine (me, 0.0, 0.0);
 	}
-END
-
-FORM (PitchTier_shiftFrequencies, L"PitchTier: Shift frequencies", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"1000.0")
-	REAL (L"Frequency shift", L"-20.0")
-	OPTIONMENU (L"Unit", 1)
-		OPTION (L"Hertz")
-		OPTION (L"mel")
-		OPTION (L"logHertz")
-		OPTION (L"semitones")
-		OPTION (L"ERB")
-	OK
-DO
-	int unit = GET_INTEGER (L"Unit");
+END2 }
+
+FORM (PitchTier_shiftFrequencies, U"PitchTier: Shift frequencies", 0) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"1000.0")
+	REAL (U"Frequency shift", U"-20.0")
+	OPTIONMENU (U"Unit", 1)
+		OPTION (U"Hertz")
+		OPTION (U"mel")
+		OPTION (U"logHertz")
+		OPTION (U"semitones")
+		OPTION (U"ERB")
+	OK2
+DO
+	int unit = GET_INTEGER (U"Unit");
 	unit =
 		unit == 1 ? kPitch_unit_HERTZ :
 		unit == 2 ? kPitch_unit_MEL :
@@ -4229,111 +4263,111 @@ DO
 	LOOP {
 		iam (PitchTier);
 		try {
-			PitchTier_shiftFrequencies (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_REAL (L"Frequency shift"), unit);
+			PitchTier_shiftFrequencies (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_REAL (U"Frequency shift"), unit);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the PitchTier may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (PitchTier_multiplyFrequencies, L"PitchTier: Multiply frequencies", 0)
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"1000.0")
-	POSITIVE (L"Factor", L"1.2")
-	OK
+FORM (PitchTier_multiplyFrequencies, U"PitchTier: Multiply frequencies", 0) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"1000.0")
+	POSITIVE (U"Factor", U"1.2")
+	OK2
 DO
 	LOOP {
 		iam (PitchTier);
-		PitchTier_multiplyFrequencies (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_REAL (L"Factor"));
+		PitchTier_multiplyFrequencies (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_REAL (U"Factor"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (PitchTier_stylize, L"PitchTier: Stylize", L"PitchTier: Stylize...")
-	REAL (L"Frequency resolution", L"4.0")
-	RADIO (L"Unit", 2)
-	RADIOBUTTON (L"Hz")
-	RADIOBUTTON (L"Semitones")
-	OK
+FORM (PitchTier_stylize, U"PitchTier: Stylize", U"PitchTier: Stylize...") {
+	REAL (U"Frequency resolution", U"4.0")
+	RADIO (U"Unit", 2)
+		RADIOBUTTON (U"Hz")
+		RADIOBUTTON (U"Semitones")
+	OK2
 DO
 	LOOP {
 		iam (PitchTier);
-		PitchTier_stylize (me, GET_REAL (L"Frequency resolution"), GET_INTEGER (L"Unit") - 1);
+		PitchTier_stylize (me, GET_REAL (U"Frequency resolution"), GET_INTEGER (U"Unit") - 1);
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-DIRECT (PitchTier_to_PointProcess)
+DIRECT2 (PitchTier_to_PointProcess) {
 	LOOP {
 		iam (PitchTier);
 		autoPointProcess thee = PitchTier_to_PointProcess (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PitchTier_to_Sound_phonation, L"PitchTier: To Sound (phonation)", 0)
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
-	POSITIVE (L"Adaptation factor", L"1.0")
-	POSITIVE (L"Maximum period (s)", L"0.05")
-	POSITIVE (L"Open phase", L"0.7")
-	REAL (L"Collision phase", L"0.03")
-	POSITIVE (L"Power 1", L"3.0")
-	POSITIVE (L"Power 2", L"4.0")
-	BOOLEAN (L"Hum", 0)
-	OK
+FORM (PitchTier_to_Sound_phonation, U"PitchTier: To Sound (phonation)", 0) {
+	POSITIVE (U"Sampling frequency (Hz)", U"44100")
+	POSITIVE (U"Adaptation factor", U"1.0")
+	POSITIVE (U"Maximum period (s)", U"0.05")
+	POSITIVE (U"Open phase", U"0.7")
+	REAL (U"Collision phase", U"0.03")
+	POSITIVE (U"Power 1", U"3.0")
+	POSITIVE (U"Power 2", U"4.0")
+	BOOLEAN (U"Hum", 0)
+	OK2
 DO
 	LOOP {
 		iam (PitchTier);
-		autoSound thee = PitchTier_to_Sound_phonation (me, GET_REAL (L"Sampling frequency"),
-			GET_REAL (L"Adaptation factor"), GET_REAL (L"Maximum period"),
-			GET_REAL (L"Open phase"), GET_REAL (L"Collision phase"), GET_REAL (L"Power 1"), GET_REAL (L"Power 2"), GET_INTEGER (L"Hum"));
+		autoSound thee = PitchTier_to_Sound_phonation (me, GET_REAL (U"Sampling frequency"),
+			GET_REAL (U"Adaptation factor"), GET_REAL (U"Maximum period"),
+			GET_REAL (U"Open phase"), GET_REAL (U"Collision phase"), GET_REAL (U"Power 1"), GET_REAL (U"Power 2"), GET_INTEGER (U"Hum"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PitchTier_to_Sound_pulseTrain, L"PitchTier: To Sound (pulse train)", 0)
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
-	POSITIVE (L"Adaptation factor", L"1.0")
-	POSITIVE (L"Adaptation time", L"0.05")
-	NATURAL (L"Interpolation depth (samples)", L"2000")
-	BOOLEAN (L"Hum", 0)
-	OK
+FORM (PitchTier_to_Sound_pulseTrain, U"PitchTier: To Sound (pulse train)", 0) {
+	POSITIVE (U"Sampling frequency (Hz)", U"44100")
+	POSITIVE (U"Adaptation factor", U"1.0")
+	POSITIVE (U"Adaptation time", U"0.05")
+	NATURAL (U"Interpolation depth (samples)", U"2000")
+	BOOLEAN (U"Hum", 0)
+	OK2
 DO
 	LOOP {
 		iam (PitchTier);
-		autoSound thee = PitchTier_to_Sound_pulseTrain (me, GET_REAL (L"Sampling frequency"),
-			GET_REAL (L"Adaptation factor"), GET_REAL (L"Adaptation time"),
-			GET_INTEGER (L"Interpolation depth"), GET_INTEGER (L"Hum"));
+		autoSound thee = PitchTier_to_Sound_pulseTrain (me, GET_REAL (U"Sampling frequency"),
+			GET_REAL (U"Adaptation factor"), GET_REAL (U"Adaptation time"),
+			GET_INTEGER (U"Interpolation depth"), GET_INTEGER (U"Hum"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PitchTier_to_Sound_sine, L"PitchTier: To Sound (sine)", 0)
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
-	OK
+FORM (PitchTier_to_Sound_sine, U"PitchTier: To Sound (sine)", 0) {
+	POSITIVE (U"Sampling frequency (Hz)", U"44100")
+	OK2
 DO
 	LOOP {
 		iam (PitchTier);
-		autoSound thee = PitchTier_to_Sound_sine (me, 0.0, 0.0, GET_REAL (L"Sampling frequency"));
+		autoSound thee = PitchTier_to_Sound_sine (me, 0.0, 0.0, GET_REAL (U"Sampling frequency"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (info_PitchTier_Sound_edit)
-	Melder_information (L"To include a copy of a Sound in your PitchTier editor:\n"
+DIRECT2 (info_PitchTier_Sound_edit) {
+	Melder_information (U"To include a copy of a Sound in your PitchTier editor:\n"
 		"   select a PitchTier and a Sound, and click \"View & Edit\".");
-END
+END2 }
 
-FORM_WRITE (PitchTier_writeToPitchTierSpreadsheetFile, L"Save PitchTier as spreadsheet", 0, L"PitchTier")
+FORM_WRITE (PitchTier_writeToPitchTierSpreadsheetFile, U"Save PitchTier as spreadsheet", 0, U"PitchTier")
 	LOOP {
 		iam (PitchTier);
 		PitchTier_writeToPitchTierSpreadsheetFile (me, file);
 	}
 END
 
-FORM_WRITE (PitchTier_writeToHeaderlessSpreadsheetFile, L"Save PitchTier as spreadsheet", 0, L"txt")
+FORM_WRITE (PitchTier_writeToHeaderlessSpreadsheetFile, U"Save PitchTier as spreadsheet", 0, U"txt")
 	LOOP {
 		iam (PitchTier);
 		PitchTier_writeToHeaderlessSpreadsheetFile (me, file);
@@ -4342,453 +4376,455 @@ END
 
 /***** PITCHTIER & POINTPROCESS *****/
 
-DIRECT (PitchTier_PointProcess_to_PitchTier)
+DIRECT2 (PitchTier_PointProcess_to_PitchTier) {
 	PitchTier pitch = FIRST (PitchTier);
 	PointProcess point = FIRST (PointProcess);
 	autoPitchTier thee = PitchTier_PointProcess_to_PitchTier (pitch, point);
 	praat_new (thee.transfer(), pitch -> name);
-END
+END2 }
 
 /***** POINTPROCESS *****/
 
-FORM (PointProcess_addPoint, L"PointProcess: Add point", L"PointProcess: Add point...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (PointProcess_addPoint, U"PointProcess: Add point", U"PointProcess: Add point...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		PointProcess_addPoint (me, GET_REAL (L"Time"));
+		PointProcess_addPoint (me, GET_REAL (U"Time"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (PointProcess_createEmpty, L"Create an empty PointProcess", L"Create empty PointProcess...")
-	WORD (L"Name", L"empty")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	OK
+FORM (PointProcess_createEmpty, U"Create an empty PointProcess", U"Create empty PointProcess...") {
+	WORD (U"Name", U"empty")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	OK2
 DO
-	double tmin = GET_REAL (L"Start time"), tmax = GET_REAL (L"End time");
-	if (tmax < tmin) Melder_throw ("End time (", tmax, ") should not be less than start time (", tmin, ").");
+	double tmin = GET_REAL (U"Start time"), tmax = GET_REAL (U"End time");
+	if (tmax < tmin) Melder_throw (U"End time (", tmax, U") should not be less than start time (", tmin, U").");
 	autoPointProcess me = PointProcess_create (tmin, tmax, 0);
-	praat_new (me.transfer(), GET_STRING (L"Name"));
-END
+	praat_new (me.transfer(), GET_STRING (U"Name"));
+END2 }
 
-FORM (PointProcess_createPoissonProcess, L"Create Poisson process", L"Create Poisson process...")
-	WORD (L"Name", L"poisson")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	POSITIVE (L"Density (/s)", L"100.0")
-	OK
+FORM (PointProcess_createPoissonProcess, U"Create Poisson process", U"Create Poisson process...") {
+	WORD (U"Name", U"poisson")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	POSITIVE (U"Density (/s)", U"100.0")
+	OK2
 DO
-	double tmin = GET_REAL (L"Start time"), tmax = GET_REAL (L"End time");
+	double tmin = GET_REAL (U"Start time"), tmax = GET_REAL (U"End time");
 	if (tmax < tmin)
-		Melder_throw ("End time (", tmax, ") should not be less than start time (", tmin, ").");
-	autoPointProcess me = PointProcess_createPoissonProcess (tmin, tmax, GET_REAL (L"Density"));
-	praat_new (me.transfer(), GET_STRING (L"Name"));
-END
+		Melder_throw (U"End time (", tmax, U") should not be less than start time (", tmin, U").");
+	autoPointProcess me = PointProcess_createPoissonProcess (tmin, tmax, GET_REAL (U"Density"));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
+END2 }
 
-DIRECT (PointProcess_difference)
+DIRECT2 (PointProcess_difference) {
 	PointProcess point1 = NULL, point2 = NULL;
 	LOOP (point1 ? point2 : point1) = (PointProcess) OBJECT;
 	autoPointProcess thee = PointProcesses_difference (point1, point2);
-	praat_new (thee.transfer(), L"difference");
-END
+	praat_new (thee.transfer(), U"difference");
+END2 }
 
-FORM (PointProcess_draw, L"PointProcess: Draw", 0)
+FORM (PointProcess_draw, U"PointProcess: Draw", 0) {
 	praat_dia_timeRange (dia);
-	BOOLEAN (L"Garnish", 1)
-	OK
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
 		autoPraatPicture picture;
 		PointProcess_draw (me, GRAPHICS,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-DIRECT (PointProcess_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a PointProcess from batch.");
+DIRECT2 (PointProcess_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a PointProcess from batch.");
 	Sound sound = FIRST (Sound);
 	LOOP if (CLASS == classPointProcess) {
 		iam (PointProcess);
 		autoPointEditor editor = PointEditor_create (ID_AND_FULL_NAME, me, sound);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-FORM (PointProcess_fill, L"PointProcess: Fill", 0)
+FORM (PointProcess_fill, U"PointProcess: Fill", 0) {
 	praat_dia_timeRange (dia);
-	POSITIVE (L"Period (s)", L"0.01")
-	OK
+	POSITIVE (U"Period (s)", U"0.01")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
 		try {
-			PointProcess_fill (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_REAL (L"Period"));
+			PointProcess_fill (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_REAL (U"Period"));
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the PointProcess may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (PointProcess_getInterval, L"PointProcess: Get interval", L"PointProcess: Get interval...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (PointProcess_getInterval, U"PointProcess: Get interval", U"PointProcess: Get interval...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
-	Melder_informationReal (PointProcess_getInterval (FIRST_ANY (PointProcess), GET_REAL (L"Time")), L"seconds");
-END
+	Melder_informationReal (PointProcess_getInterval (FIRST_ANY (PointProcess), GET_REAL (U"Time")), U"seconds");
+END2 }
 
-static void dia_PointProcess_getRangeProperty (Any dia) {
+static void dia_PointProcess_getRangeProperty (UiForm dia) {
 	praat_dia_timeRange (dia);
-	REAL (L"Shortest period (s)", L"0.0001")
-	REAL (L"Longest period (s)", L"0.02")
-	POSITIVE (L"Maximum period factor", L"1.3")
+	REAL (U"Shortest period (s)", U"0.0001")
+	REAL (U"Longest period (s)", U"0.02")
+	POSITIVE (U"Maximum period factor", U"1.3")
 }
 
-FORM (PointProcess_getJitter_local, L"PointProcess: Get jitter (local)", L"PointProcess: Get jitter (local)...")
+FORM (PointProcess_getJitter_local, U"PointProcess: Get jitter (local)", U"PointProcess: Get jitter (local)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	Melder_informationReal (PointProcess_getJitter_local (FIRST_ANY (PointProcess),
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor")), NULL);
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor")), NULL);
+END2 }
 
-FORM (PointProcess_getJitter_local_absolute, L"PointProcess: Get jitter (local, absolute)", L"PointProcess: Get jitter (local, absolute)...")
+FORM (PointProcess_getJitter_local_absolute, U"PointProcess: Get jitter (local, absolute)", U"PointProcess: Get jitter (local, absolute)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	Melder_informationReal (PointProcess_getJitter_local_absolute (FIRST_ANY (PointProcess),
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor")), L"seconds");
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor")), U"seconds");
+END2 }
 
-FORM (PointProcess_getJitter_rap, L"PointProcess: Get jitter (rap)", L"PointProcess: Get jitter (rap)...")
+FORM (PointProcess_getJitter_rap, U"PointProcess: Get jitter (rap)", U"PointProcess: Get jitter (rap)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	Melder_informationReal (PointProcess_getJitter_rap (FIRST_ANY (PointProcess),
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor")), NULL);
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor")), NULL);
+END2 }
 
-FORM (PointProcess_getJitter_ppq5, L"PointProcess: Get jitter (ppq5)", L"PointProcess: Get jitter (ppq5)...")
+FORM (PointProcess_getJitter_ppq5, U"PointProcess: Get jitter (ppq5)", U"PointProcess: Get jitter (ppq5)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	Melder_informationReal (PointProcess_getJitter_ppq5 (FIRST_ANY (PointProcess),
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor")), NULL);
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor")), NULL);
+END2 }
 
-FORM (PointProcess_getJitter_ddp, L"PointProcess: Get jitter (ddp)", L"PointProcess: Get jitter (ddp)...")
+FORM (PointProcess_getJitter_ddp, U"PointProcess: Get jitter (ddp)", U"PointProcess: Get jitter (ddp)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	Melder_informationReal (PointProcess_getJitter_ddp (FIRST_ANY (PointProcess),
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor")), NULL);
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor")), NULL);
+END2 }
 
-FORM (PointProcess_getMeanPeriod, L"PointProcess: Get mean period", L"PointProcess: Get mean period...")
+FORM (PointProcess_getMeanPeriod, U"PointProcess: Get mean period", U"PointProcess: Get mean period...") {
 	dia_PointProcess_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	Melder_informationReal (PointProcess_getMeanPeriod (FIRST_ANY (PointProcess),
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor")), L"seconds");
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor")), U"seconds");
+END2 }
 
-FORM (PointProcess_getStdevPeriod, L"PointProcess: Get stdev period", L"PointProcess: Get stdev period...")
+FORM (PointProcess_getStdevPeriod, U"PointProcess: Get stdev period", U"PointProcess: Get stdev period...") {
 	dia_PointProcess_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	Melder_informationReal (PointProcess_getStdevPeriod (FIRST_ANY (PointProcess),
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor")), L"seconds");
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor")), U"seconds");
+END2 }
 
-FORM (PointProcess_getLowIndex, L"PointProcess: Get low index", L"PointProcess: Get low index...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (PointProcess_getLowIndex, U"PointProcess: Get low index", U"PointProcess: Get low index...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
-	Melder_information (Melder_integer (PointProcess_getLowIndex (FIRST_ANY (PointProcess), GET_REAL (L"Time"))));
-END
+	Melder_information (PointProcess_getLowIndex (FIRST_ANY (PointProcess), GET_REAL (U"Time")));
+END2 }
 
-FORM (PointProcess_getHighIndex, L"PointProcess: Get high index", L"PointProcess: Get high index...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (PointProcess_getHighIndex, U"PointProcess: Get high index", U"PointProcess: Get high index...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
-	Melder_information (Melder_integer (PointProcess_getHighIndex (FIRST_ANY (PointProcess), GET_REAL (L"Time"))));
-END
+	Melder_information (PointProcess_getHighIndex (FIRST_ANY (PointProcess), GET_REAL (U"Time")));
+END2 }
 
-FORM (PointProcess_getNearestIndex, L"PointProcess: Get nearest index", L"PointProcess: Get nearest index...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (PointProcess_getNearestIndex, U"PointProcess: Get nearest index", U"PointProcess: Get nearest index...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
-	Melder_information (Melder_integer (PointProcess_getNearestIndex (FIRST_ANY (PointProcess), GET_REAL (L"Time"))));
-END
+	Melder_information (PointProcess_getNearestIndex (FIRST_ANY (PointProcess), GET_REAL (U"Time")));
+END2 }
 
-DIRECT (PointProcess_getNumberOfPoints)
+DIRECT2 (PointProcess_getNumberOfPoints) {
 	PointProcess me = FIRST_ANY (PointProcess);
-	Melder_information (Melder_integer (my nt));
-END
+	Melder_information (my nt);
+END2 }
 
-FORM (PointProcess_getNumberOfPeriods, L"PointProcess: Get number of periods", L"PointProcess: Get number of periods...")
+FORM (PointProcess_getNumberOfPeriods, U"PointProcess: Get number of periods", U"PointProcess: Get number of periods...") {
 	dia_PointProcess_getRangeProperty (dia);
-	OK
+	OK2
 DO
-	Melder_information (Melder_integer (PointProcess_getNumberOfPeriods (FIRST_ANY (PointProcess),
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor"))));
-END
+	Melder_information (PointProcess_getNumberOfPeriods (FIRST_ANY (PointProcess),
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor")));
+END2 }
 
-FORM (PointProcess_getTimeFromIndex, L"Get time", 0 /*"PointProcess: Get time from index..."*/)
-	NATURAL (L"Point number", L"10")
-	OK
+FORM (PointProcess_getTimeFromIndex, U"Get time", 0 /*"PointProcess: Get time from index..."*/) {
+	NATURAL (U"Point number", U"10")
+	OK2
 DO
 	PointProcess me = FIRST_ANY (PointProcess);
-	long i = GET_INTEGER (L"Point number");
-	if (i > my nt) Melder_information (L"--undefined--");
-	else Melder_informationReal (my t [i], L"seconds");
-END
+	long i = GET_INTEGER (U"Point number");
+	if (i > my nt) Melder_information (U"--undefined--");
+	else Melder_informationReal (my t [i], U"seconds");
+END2 }
 
-DIRECT (PointProcess_help) Melder_help (L"PointProcess"); END
+DIRECT2 (PointProcess_help) {
+	Melder_help (U"PointProcess");
+END2 }
 
-DIRECT (PointProcess_hum)
+DIRECT2 (PointProcess_hum) {
 	LOOP {
 		iam (PointProcess);
 		PointProcess_hum (me, my xmin, my xmax);
 	}
-END
+END2 }
 
-DIRECT (PointProcess_intersection)
+DIRECT2 (PointProcess_intersection) {
 	PointProcess point1 = NULL, point2 = NULL;
 	LOOP (point1 ? point2 : point1) = (PointProcess) OBJECT;
 	autoPointProcess thee = PointProcesses_intersection (point1, point2);
-	praat_new (thee.transfer(), L"intersection");
-END
+	praat_new (thee.transfer(), U"intersection");
+END2 }
 
-DIRECT (PointProcess_play)
+DIRECT2 (PointProcess_play) {
 	LOOP {
 		iam (PointProcess);
 		PointProcess_play (me);
 	}
-END
+END2 }
 
-FORM (PointProcess_removePoint, L"PointProcess: Remove point", L"PointProcess: Remove point...")
-	NATURAL (L"Index", L"1")
-	OK
+FORM (PointProcess_removePoint, U"PointProcess: Remove point", U"PointProcess: Remove point...") {
+	NATURAL (U"Index", U"1")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		PointProcess_removePoint (me, GET_INTEGER (L"Index"));
+		PointProcess_removePoint (me, GET_INTEGER (U"Index"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (PointProcess_removePointNear, L"PointProcess: Remove point near", L"PointProcess: Remove point near...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (PointProcess_removePointNear, U"PointProcess: Remove point near", U"PointProcess: Remove point near...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		PointProcess_removePointNear (me, GET_REAL (L"Time"));
+		PointProcess_removePointNear (me, GET_REAL (U"Time"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (PointProcess_removePoints, L"PointProcess: Remove points", L"PointProcess: Remove points...")
-	NATURAL (L"From index", L"1")
-	NATURAL (L"To index", L"10")
-	OK
+FORM (PointProcess_removePoints, U"PointProcess: Remove points", U"PointProcess: Remove points...") {
+	NATURAL (U"From index", U"1")
+	NATURAL (U"To index", U"10")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		PointProcess_removePoints (me, GET_INTEGER (L"From index"), GET_INTEGER (L"To index"));
+		PointProcess_removePoints (me, GET_INTEGER (U"From index"), GET_INTEGER (U"To index"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (PointProcess_removePointsBetween, L"PointProcess: Remove points between", L"PointProcess: Remove points between...")
-	REAL (L"left Time range (s)", L"0.3")
-	REAL (L"right Time range (s)", L"0.7")
-	OK
+FORM (PointProcess_removePointsBetween, U"PointProcess: Remove points between", U"PointProcess: Remove points between...") {
+	REAL (U"left Time range (s)", U"0.3")
+	REAL (U"right Time range (s)", U"0.7")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		PointProcess_removePointsBetween (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"));
+		PointProcess_removePointsBetween (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-DIRECT (PointProcess_to_IntervalTier)
+DIRECT2 (PointProcess_to_IntervalTier) {
 	LOOP {
 		iam (PointProcess);
 		autoIntervalTier thee = IntervalTier_create (my xmin, my xmax);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (PointProcess_to_Matrix)
+DIRECT2 (PointProcess_to_Matrix) {
 	LOOP {
 		iam (PointProcess);
 		autoMatrix thee = PointProcess_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PointProcess_to_PitchTier, L"PointProcess: To PitchTier", L"PointProcess: To PitchTier...")
-	POSITIVE (L"Maximum interval (s)", L"0.02")
-	OK
+FORM (PointProcess_to_PitchTier, U"PointProcess: To PitchTier", U"PointProcess: To PitchTier...") {
+	POSITIVE (U"Maximum interval (s)", U"0.02")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		autoPitchTier thee = PointProcess_to_PitchTier (me, GET_REAL (L"Maximum interval"));
+		autoPitchTier thee = PointProcess_to_PitchTier (me, GET_REAL (U"Maximum interval"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PointProcess_to_TextGrid, L"PointProcess: To TextGrid...", L"PointProcess: To TextGrid...")
-	SENTENCE (L"Tier names", L"Mary John bell")
-	SENTENCE (L"Point tiers", L"bell")
-	OK
+FORM (PointProcess_to_TextGrid, U"PointProcess: To TextGrid...", U"PointProcess: To TextGrid...") {
+	SENTENCE (U"Tier names", U"Mary John bell")
+	SENTENCE (U"Point tiers", U"bell")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		autoTextGrid thee = TextGrid_create (my xmin, my xmax, GET_STRING (L"Tier names"), GET_STRING (L"Point tiers"));
+		autoTextGrid thee = TextGrid_create (my xmin, my xmax, GET_STRING (U"Tier names"), GET_STRING (U"Point tiers"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PointProcess_to_TextGrid_vuv, L"PointProcess: To TextGrid (vuv)...", L"PointProcess: To TextGrid (vuv)...")
-	POSITIVE (L"Maximum period (s)", L"0.02")
-	REAL (L"Mean period (s)", L"0.01")
-	OK
+FORM (PointProcess_to_TextGrid_vuv, U"PointProcess: To TextGrid (vuv)...", U"PointProcess: To TextGrid (vuv)...") {
+	POSITIVE (U"Maximum period (s)", U"0.02")
+	REAL (U"Mean period (s)", U"0.01")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		autoTextGrid thee = PointProcess_to_TextGrid_vuv (me, GET_REAL (L"Maximum period"), GET_REAL (L"Mean period"));
+		autoTextGrid thee = PointProcess_to_TextGrid_vuv (me, GET_REAL (U"Maximum period"), GET_REAL (U"Mean period"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (PointProcess_to_TextTier)
+DIRECT2 (PointProcess_to_TextTier) {
 	LOOP {
 		iam (PointProcess);
 		autoTextTier thee = TextTier_create (my xmin, my xmax);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PointProcess_to_Sound_phonation, L"PointProcess: To Sound (phonation)", L"PointProcess: To Sound (phonation)...")
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
-	POSITIVE (L"Adaptation factor", L"1.0")
-	POSITIVE (L"Maximum period (s)", L"0.05")
-	POSITIVE (L"Open phase", L"0.7")
-	REAL (L"Collision phase", L"0.03")
-	POSITIVE (L"Power 1", L"3.0")
-	POSITIVE (L"Power 2", L"4.0")
-	OK
+FORM (PointProcess_to_Sound_phonation, U"PointProcess: To Sound (phonation)", U"PointProcess: To Sound (phonation)...") {
+	POSITIVE (U"Sampling frequency (Hz)", U"44100")
+	POSITIVE (U"Adaptation factor", U"1.0")
+	POSITIVE (U"Maximum period (s)", U"0.05")
+	POSITIVE (U"Open phase", U"0.7")
+	REAL (U"Collision phase", U"0.03")
+	POSITIVE (U"Power 1", U"3.0")
+	POSITIVE (U"Power 2", U"4.0")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		autoSound thee = PointProcess_to_Sound_phonation (me, GET_REAL (L"Sampling frequency"),
-			GET_REAL (L"Adaptation factor"), GET_REAL (L"Maximum period"),
-			GET_REAL (L"Open phase"), GET_REAL (L"Collision phase"), GET_REAL (L"Power 1"), GET_REAL (L"Power 2"));
+		autoSound thee = PointProcess_to_Sound_phonation (me, GET_REAL (U"Sampling frequency"),
+			GET_REAL (U"Adaptation factor"), GET_REAL (U"Maximum period"),
+			GET_REAL (U"Open phase"), GET_REAL (U"Collision phase"), GET_REAL (U"Power 1"), GET_REAL (U"Power 2"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PointProcess_to_Sound_pulseTrain, L"PointProcess: To Sound (pulse train)", L"PointProcess: To Sound (pulse train)...")
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
-	POSITIVE (L"Adaptation factor", L"1.0")
-	POSITIVE (L"Adaptation time (s)", L"0.05")
-	NATURAL (L"Interpolation depth (samples)", L"2000")
-	OK
+FORM (PointProcess_to_Sound_pulseTrain, U"PointProcess: To Sound (pulse train)", U"PointProcess: To Sound (pulse train)...") {
+	POSITIVE (U"Sampling frequency (Hz)", U"44100")
+	POSITIVE (U"Adaptation factor", U"1.0")
+	POSITIVE (U"Adaptation time (s)", U"0.05")
+	NATURAL (U"Interpolation depth (samples)", U"2000")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		autoSound thee = PointProcess_to_Sound_pulseTrain (me, GET_REAL (L"Sampling frequency"),
-			GET_REAL (L"Adaptation factor"), GET_REAL (L"Adaptation time"),
-			GET_INTEGER (L"Interpolation depth"));
+		autoSound thee = PointProcess_to_Sound_pulseTrain (me, GET_REAL (U"Sampling frequency"),
+			GET_REAL (U"Adaptation factor"), GET_REAL (U"Adaptation time"),
+			GET_INTEGER (U"Interpolation depth"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (PointProcess_to_Sound_hum)
+DIRECT2 (PointProcess_to_Sound_hum) {
 	LOOP {
 		iam (PointProcess);
 		autoSound thee = PointProcess_to_Sound_hum (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (PointProcess_union)
+DIRECT2 (PointProcess_union) {
 	PointProcess point1 = NULL, point2 = NULL;
 	LOOP (point1 ? point2 : point1) = (PointProcess) OBJECT;
 	autoPointProcess thee = PointProcesses_union (point1, point2);
-	praat_new (thee.transfer(), L"union");
-END
+	praat_new (thee.transfer(), U"union");
+END2 }
 
-FORM (PointProcess_upto_IntensityTier, L"PointProcess: Up to IntensityTier", L"PointProcess: Up to IntensityTier...")
-	POSITIVE (L"Intensity (dB)", L"70.0")
-	OK
+FORM (PointProcess_upto_IntensityTier, U"PointProcess: Up to IntensityTier", U"PointProcess: Up to IntensityTier...") {
+	POSITIVE (U"Intensity (dB)", U"70.0")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		autoIntensityTier thee = PointProcess_upto_IntensityTier (me, GET_REAL (L"Intensity"));
+		autoIntensityTier thee = PointProcess_upto_IntensityTier (me, GET_REAL (U"Intensity"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PointProcess_upto_PitchTier, L"PointProcess: Up to PitchTier", L"PointProcess: Up to PitchTier...")
-	POSITIVE (L"Frequency (Hz)", L"190.0")
-	OK
+FORM (PointProcess_upto_PitchTier, U"PointProcess: Up to PitchTier", U"PointProcess: Up to PitchTier...") {
+	POSITIVE (U"Frequency (Hz)", U"190.0")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		autoPitchTier thee = PointProcess_upto_PitchTier (me, GET_REAL (L"Frequency"));
+		autoPitchTier thee = PointProcess_upto_PitchTier (me, GET_REAL (U"Frequency"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PointProcess_upto_TextTier, L"PointProcess: Up to TextTier", L"PointProcess: Up to TextTier...")
-	SENTENCE (L"Text", L"")
-	OK
+FORM (PointProcess_upto_TextTier, U"PointProcess: Up to TextTier", U"PointProcess: Up to TextTier...") {
+	SENTENCE (U"Text", U"")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
-		autoTextTier thee = PointProcess_upto_TextTier (me, GET_STRING (L"Text"));
+		autoTextTier thee = PointProcess_upto_TextTier (me, GET_STRING (U"Text"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (PointProcess_voice, L"PointProcess: Fill unvoiced parts", 0)
-	POSITIVE (L"Period (s)", L"0.01")
-	POSITIVE (L"Maximum voiced period (s)", L"0.02000000001")
-	OK
+FORM (PointProcess_voice, U"PointProcess: Fill unvoiced parts", 0) {
+	POSITIVE (U"Period (s)", U"0.01")
+	POSITIVE (U"Maximum voiced period (s)", U"0.02000000001")
+	OK2
 DO
 	LOOP {
 		iam (PointProcess);
 		try {
-			PointProcess_voice (me, GET_REAL (L"Period"), GET_REAL (L"Maximum voiced period"));
+			PointProcess_voice (me, GET_REAL (U"Period"), GET_REAL (U"Maximum voiced period"));
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the PointProcess may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-DIRECT (info_PointProcess_Sound_edit)
-	Melder_information (L"To include a copy of a Sound in your PointProcess editor:\n"
+DIRECT2 (info_PointProcess_Sound_edit) {
+	Melder_information (U"To include a copy of a Sound in your PointProcess editor:\n"
 		"   select a PointProcess and a Sound, and click \"View & Edit\".");
-END
+END2 }
 
 /***** POINTPROCESS & SOUND *****/
 
@@ -4798,967 +4834,973 @@ END
 	if (! praat_new1 (Sound_PointProcess_to_Manipulation (sound, point), point -> name)) return 0;
 END*/
 
-DIRECT (Point_Sound_transplantDomain)
+DIRECT2 (Point_Sound_transplantDomain) {
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	point -> xmin = sound -> xmin;
 	point -> xmax = sound -> xmax;
 	praat_dataChanged (point);
-END
+END2 }
 
-FORM (Point_Sound_getShimmer_local, L"PointProcess & Sound: Get shimmer (local)", L"PointProcess & Sound: Get shimmer (local)...")
+FORM (Point_Sound_getShimmer_local, U"PointProcess & Sound: Get shimmer (local)", U"PointProcess & Sound: Get shimmer (local)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	POSITIVE (L"Maximum amplitude factor", L"1.6")
-	OK
+	POSITIVE (U"Maximum amplitude factor", U"1.6")
+	OK2
 DO
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	double shimmer = PointProcess_Sound_getShimmer_local (point, sound,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"),
-		GET_REAL (L"Maximum period factor"), GET_REAL (L"Maximum amplitude factor"));
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"),
+		GET_REAL (U"Maximum period factor"), GET_REAL (U"Maximum amplitude factor"));
 	Melder_informationReal (shimmer, NULL);
-END
+END2 }
 
-FORM (Point_Sound_getShimmer_local_dB, L"PointProcess & Sound: Get shimmer (local, dB)", L"PointProcess & Sound: Get shimmer (local, dB)...")
+FORM (Point_Sound_getShimmer_local_dB, U"PointProcess & Sound: Get shimmer (local, dB)", U"PointProcess & Sound: Get shimmer (local, dB)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	POSITIVE (L"Maximum amplitude factor", L"1.6")
-	OK
+	POSITIVE (U"Maximum amplitude factor", U"1.6")
+	OK2
 DO
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	double shimmer = PointProcess_Sound_getShimmer_local_dB (point, sound,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"),
-		GET_REAL (L"Maximum period factor"), GET_REAL (L"Maximum amplitude factor"));
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"),
+		GET_REAL (U"Maximum period factor"), GET_REAL (U"Maximum amplitude factor"));
 	Melder_informationReal (shimmer, NULL);
-END
+END2 }
 
-FORM (Point_Sound_getShimmer_apq3, L"PointProcess & Sound: Get shimmer (apq3)", L"PointProcess & Sound: Get shimmer (apq3)...")
+FORM (Point_Sound_getShimmer_apq3, U"PointProcess & Sound: Get shimmer (apq3)", U"PointProcess & Sound: Get shimmer (apq3)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	POSITIVE (L"Maximum amplitude factor", L"1.6")
-	OK
+	POSITIVE (U"Maximum amplitude factor", U"1.6")
+	OK2
 DO
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	double shimmer = PointProcess_Sound_getShimmer_apq3 (point, sound,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"),
-		GET_REAL (L"Maximum period factor"), GET_REAL (L"Maximum amplitude factor"));
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"),
+		GET_REAL (U"Maximum period factor"), GET_REAL (U"Maximum amplitude factor"));
 	Melder_informationReal (shimmer, NULL);
-END
+END2 }
 
-FORM (Point_Sound_getShimmer_apq5, L"PointProcess & Sound: Get shimmer (apq)", L"PointProcess & Sound: Get shimmer (apq5)...")
+FORM (Point_Sound_getShimmer_apq5, U"PointProcess & Sound: Get shimmer (apq)", U"PointProcess & Sound: Get shimmer (apq5)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	POSITIVE (L"Maximum amplitude factor", L"1.6")
-	OK
+	POSITIVE (U"Maximum amplitude factor", U"1.6")
+	OK2
 DO
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	double shimmer = PointProcess_Sound_getShimmer_apq5 (point, sound,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"),
-		GET_REAL (L"Maximum period factor"), GET_REAL (L"Maximum amplitude factor"));
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"),
+		GET_REAL (U"Maximum period factor"), GET_REAL (U"Maximum amplitude factor"));
 	Melder_informationReal (shimmer, NULL);
-END
+END2 }
 
-FORM (Point_Sound_getShimmer_apq11, L"PointProcess & Sound: Get shimmer (apq11)", L"PointProcess & Sound: Get shimmer (apq11)...")
+FORM (Point_Sound_getShimmer_apq11, U"PointProcess & Sound: Get shimmer (apq11)", U"PointProcess & Sound: Get shimmer (apq11)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	POSITIVE (L"Maximum amplitude factor", L"1.6")
-	OK
+	POSITIVE (U"Maximum amplitude factor", U"1.6")
+	OK2
 DO
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	double shimmer = PointProcess_Sound_getShimmer_apq11 (point, sound,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"),
-		GET_REAL (L"Maximum period factor"), GET_REAL (L"Maximum amplitude factor"));
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"),
+		GET_REAL (U"Maximum period factor"), GET_REAL (U"Maximum amplitude factor"));
 	Melder_informationReal (shimmer, NULL);
-END
+END2 }
 
-FORM (Point_Sound_getShimmer_dda, L"PointProcess & Sound: Get shimmer (dda)", L"PointProcess & Sound: Get shimmer (dda)...")
+FORM (Point_Sound_getShimmer_dda, U"PointProcess & Sound: Get shimmer (dda)", U"PointProcess & Sound: Get shimmer (dda)...") {
 	dia_PointProcess_getRangeProperty (dia);
-	POSITIVE (L"Maximum amplitude factor", L"1.6")
-	OK
+	POSITIVE (U"Maximum amplitude factor", U"1.6")
+	OK2
 DO
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	double shimmer = PointProcess_Sound_getShimmer_dda (point, sound,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"),
-		GET_REAL (L"Maximum period factor"), GET_REAL (L"Maximum amplitude factor"));
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"),
+		GET_REAL (U"Maximum period factor"), GET_REAL (U"Maximum amplitude factor"));
 	Melder_informationReal (shimmer, NULL);
-END
+END2 }
 
-FORM (PointProcess_Sound_to_AmplitudeTier_period, L"PointProcess & Sound: To AmplitudeTier (period)", 0)
+FORM (PointProcess_Sound_to_AmplitudeTier_period, U"PointProcess & Sound: To AmplitudeTier (period)", 0) {
 	dia_PointProcess_getRangeProperty (dia);
-	OK
+	OK2
 DO
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	autoAmplitudeTier thee = PointProcess_Sound_to_AmplitudeTier_period (point, sound,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor"));
-	praat_new (thee.transfer(), sound -> name, L"_", point -> name);
-END
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor"));
+	praat_new (thee.transfer(), sound -> name, U"_", point -> name);
+END2 }
 
-DIRECT (PointProcess_Sound_to_AmplitudeTier_point)
+DIRECT2 (PointProcess_Sound_to_AmplitudeTier_point) {
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	autoAmplitudeTier thee = PointProcess_Sound_to_AmplitudeTier_point (point, sound);
-	praat_new (thee.transfer(), sound -> name, L"_", point -> name);
-END
+	praat_new (thee.transfer(), sound -> name, U"_", point -> name);
+END2 }
 
-FORM (PointProcess_Sound_to_Ltas, L"PointProcess & Sound: To Ltas", 0)
-	POSITIVE (L"Maximum frequency (Hz)", L"5000")
-	POSITIVE (L"Band width (Hz)", L"100")
-	REAL (L"Shortest period (s)", L"0.0001")
-	REAL (L"Longest period (s)", L"0.02")
-	POSITIVE (L"Maximum period factor", L"1.3")
-	OK
+FORM (PointProcess_Sound_to_Ltas, U"PointProcess & Sound: To Ltas", 0) {
+	POSITIVE (U"Maximum frequency (Hz)", U"5000")
+	POSITIVE (U"Band width (Hz)", U"100")
+	REAL (U"Shortest period (s)", U"0.0001")
+	REAL (U"Longest period (s)", U"0.02")
+	POSITIVE (U"Maximum period factor", U"1.3")
+	OK2
 DO
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	autoLtas thee = PointProcess_Sound_to_Ltas (point, sound,
-		GET_REAL (L"Maximum frequency"), GET_REAL (L"Band width"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor"));
+		GET_REAL (U"Maximum frequency"), GET_REAL (U"Band width"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor"));
 	praat_new (thee.transfer(), sound -> name);
-END
+END2 }
 
-FORM (PointProcess_Sound_to_Ltas_harmonics, L"PointProcess & Sound: To Ltas (harmonics", 0)
-	NATURAL (L"Maximum harmonic", L"20")
-	REAL (L"Shortest period (s)", L"0.0001")
-	REAL (L"Longest period (s)", L"0.02")
-	POSITIVE (L"Maximum period factor", L"1.3")
-	OK
+FORM (PointProcess_Sound_to_Ltas_harmonics, U"PointProcess & Sound: To Ltas (harmonics", 0) {
+	NATURAL (U"Maximum harmonic", U"20")
+	REAL (U"Shortest period (s)", U"0.0001")
+	REAL (U"Longest period (s)", U"0.02")
+	POSITIVE (U"Maximum period factor", U"1.3")
+	OK2
 DO
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
 	autoLtas thee = PointProcess_Sound_to_Ltas_harmonics (point, sound,
-		GET_INTEGER (L"Maximum harmonic"),
-		GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor"));
+		GET_INTEGER (U"Maximum harmonic"),
+		GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor"));
 	praat_new (thee.transfer(), sound -> name);
-END
+END2 }
 
-FORM (Sound_PointProcess_to_SoundEnsemble_correlate, L"Sound & PointProcess: To SoundEnsemble (correlate)", 0)
-	REAL (L"From time (s)", L"-0.1")
-	REAL (L"To time (s)", L"1.0")
-	OK
+FORM (Sound_PointProcess_to_SoundEnsemble_correlate, U"Sound & PointProcess: To SoundEnsemble (correlate)", 0) {
+	REAL (U"From time (s)", U"-0.1")
+	REAL (U"To time (s)", U"1.0")
+	OK2
 DO
 	PointProcess point = FIRST (PointProcess);
 	Sound sound = FIRST (Sound);
-	autoSound thee = Sound_PointProcess_to_SoundEnsemble_correlate (sound, point, GET_REAL (L"From time"), GET_REAL (L"To time"));
+	autoSound thee = Sound_PointProcess_to_SoundEnsemble_correlate (sound, point, GET_REAL (U"From time"), GET_REAL (U"To time"));
 	praat_new (thee.transfer(), point -> name);
-END
+END2 }
 
 /***** POLYGON *****/
 
-FORM (Polygon_draw, L"Polygon: Draw", 0)
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
-	REAL (L"Ymin", L"0.0")
-	REAL (L"Ymax", L"0.0")
-	OK
+FORM (Polygon_draw, U"Polygon: Draw", 0) {
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
+	REAL (U"Ymin", U"0.0")
+	REAL (U"Ymax", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Polygon);
 		autoPraatPicture picture;
-		Polygon_draw (me, GRAPHICS, GET_REAL (L"Xmin"), GET_REAL (L"Xmax"), GET_REAL (L"Ymin"), GET_REAL (L"Ymax"));
+		Polygon_draw (me, GRAPHICS, GET_REAL (U"Xmin"), GET_REAL (U"Xmax"), GET_REAL (U"Ymin"), GET_REAL (U"Ymax"));
 	}
-END
+END2 }
 
-FORM (Polygon_drawCircles, L"Polygon: Draw circles", 0)
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0 (= all)")
-	REAL (L"Ymin", L"0.0")
-	REAL (L"Ymax", L"0.0 (= all)")
-	POSITIVE (L"Diameter (mm)", L"3")
-	OK
+FORM (Polygon_drawCircles, U"Polygon: Draw circles", 0) {
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0 (= all)")
+	REAL (U"Ymin", U"0.0")
+	REAL (U"Ymax", U"0.0 (= all)")
+	POSITIVE (U"Diameter (mm)", U"3")
+	OK2
 DO
 	LOOP {
 		iam (Polygon);
 		autoPraatPicture picture;
 		Polygon_drawCircles (me, GRAPHICS,
-			GET_REAL (L"Xmin"), GET_REAL (L"Xmax"), GET_REAL (L"Ymin"), GET_REAL (L"Ymax"),
-			GET_REAL (L"Diameter"));
+			GET_REAL (U"Xmin"), GET_REAL (U"Xmax"), GET_REAL (U"Ymin"), GET_REAL (U"Ymax"),
+			GET_REAL (U"Diameter"));
 	}
-END
+END2 }
 
-FORM (Polygon_drawClosed, L"Polygon: Draw", 0)
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0")
-	REAL (L"Ymin", L"0.0")
-	REAL (L"Ymax", L"0.0")
-	OK
+FORM (Polygon_drawClosed, U"Polygon: Draw", 0) {
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0")
+	REAL (U"Ymin", U"0.0")
+	REAL (U"Ymax", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Polygon);
 		autoPraatPicture picture;
-		Polygon_drawClosed (me, GRAPHICS, GET_REAL (L"Xmin"), GET_REAL (L"Xmax"), GET_REAL (L"Ymin"), GET_REAL (L"Ymax"));
+		Polygon_drawClosed (me, GRAPHICS, GET_REAL (U"Xmin"), GET_REAL (U"Xmax"), GET_REAL (U"Ymin"), GET_REAL (U"Ymax"));
 	}
-END
+END2 }
 
-FORM (Polygons_drawConnection, L"Polygons: Draw connection", 0)
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0 (= all)")
-	REAL (L"Ymin", L"0.0")
-	REAL (L"Ymax", L"0.0 (= all)")
-	BOOLEAN (L"Arrow", 0)
-	POSITIVE (L"Relative length", L"0.9")
-	OK
+FORM (Polygons_drawConnection, U"Polygons: Draw connection", 0) {
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0 (= all)")
+	REAL (U"Ymin", U"0.0")
+	REAL (U"Ymax", U"0.0 (= all)")
+	BOOLEAN (U"Arrow", 0)
+	POSITIVE (U"Relative length", U"0.9")
+	OK2
 DO
 	Polygon polygon1 = NULL, polygon2 = NULL;
 	LOOP (polygon1 ? polygon2 : polygon1) = (Polygon) OBJECT;
 	autoPraatPicture picture;
 	Polygons_drawConnection (polygon1, polygon2, GRAPHICS,
-		GET_REAL (L"Xmin"), GET_REAL (L"Xmax"), GET_REAL (L"Ymin"), GET_REAL (L"Ymax"),
-		GET_INTEGER (L"Arrow"), GET_REAL (L"Relative length"));
-END
+		GET_REAL (U"Xmin"), GET_REAL (U"Xmax"), GET_REAL (U"Ymin"), GET_REAL (U"Ymax"),
+		GET_INTEGER (U"Arrow"), GET_REAL (U"Relative length"));
+END2 }
 
-DIRECT (Polygon_help) Melder_help (L"Polygon"); END
+DIRECT2 (Polygon_help) {
+	Melder_help (U"Polygon");
+END2 }
 
-FORM (Polygon_paint, L"Polygon: Paint", 0)
-	COLOUR (L"Colour (0-1, name, or {r,g,b})", L"0.5")
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0 (= all)")
-	REAL (L"Ymin", L"0.0")
-	REAL (L"Ymax", L"0.0 (= all)")
-	OK
+FORM (Polygon_paint, U"Polygon: Paint", 0) {
+	COLOUR (U"Colour (0-1, name, or {r,g,b})", U"0.5")
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0 (= all)")
+	REAL (U"Ymin", U"0.0")
+	REAL (U"Ymax", U"0.0 (= all)")
+	OK2
 DO
 	LOOP {
 		iam (Polygon);
 		autoPraatPicture picture;
-		Polygon_paint (me, GRAPHICS, GET_COLOUR (L"Colour"), GET_REAL (L"Xmin"), GET_REAL (L"Xmax"), GET_REAL (L"Ymin"), GET_REAL (L"Ymax"));
+		Polygon_paint (me, GRAPHICS, GET_COLOUR (U"Colour"), GET_REAL (U"Xmin"), GET_REAL (U"Xmax"), GET_REAL (U"Ymin"), GET_REAL (U"Ymax"));
 	}
-END
+END2 }
 
-FORM (Polygon_paintCircles, L"Polygon: Paint circles", 0)
-	REAL (L"Xmin", L"0.0")
-	REAL (L"Xmax", L"0.0 (= all)")
-	REAL (L"Ymin", L"0.0")
-	REAL (L"Ymax", L"0.0 (= all)")
-	POSITIVE (L"Diameter (mm)", L"3")
-	OK
+FORM (Polygon_paintCircles, U"Polygon: Paint circles", 0) {
+	REAL (U"Xmin", U"0.0")
+	REAL (U"Xmax", U"0.0 (= all)")
+	REAL (U"Ymin", U"0.0")
+	REAL (U"Ymax", U"0.0 (= all)")
+	POSITIVE (U"Diameter (mm)", U"3")
+	OK2
 DO
 	LOOP {
 		iam (Polygon);
 		autoPraatPicture picture;
 		Polygon_paintCircles (me, GRAPHICS,
-			GET_REAL (L"Xmin"), GET_REAL (L"Xmax"), GET_REAL (L"Ymin"), GET_REAL (L"Ymax"), GET_REAL (L"Diameter"));
+			GET_REAL (U"Xmin"), GET_REAL (U"Xmax"), GET_REAL (U"Ymin"), GET_REAL (U"Ymax"), GET_REAL (U"Diameter"));
 	}
-END
+END2 }
 
-DIRECT (Polygon_randomize)
+DIRECT2 (Polygon_randomize) {
 	LOOP {
 		iam (Polygon);
 		Polygon_randomize (me);
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (Polygon_salesperson, L"Polygon: Find shortest path", 0)
-	NATURAL (L"Number of iterations", L"1")
-	OK
+FORM (Polygon_salesperson, U"Polygon: Find shortest path", 0) {
+	NATURAL (U"Number of iterations", U"1")
+	OK2
 DO
 	LOOP {
 		iam (Polygon);
-		Polygon_salesperson (me, GET_INTEGER (L"Number of iterations"));
+		Polygon_salesperson (me, GET_INTEGER (U"Number of iterations"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-DIRECT (Polygon_to_Matrix)
+DIRECT2 (Polygon_to_Matrix) {
 	LOOP {
 		iam (Polygon);
 		autoMatrix thee = Polygon_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** SOUND & PITCH & POINTPROCESS *****/
 
-FORM (Sound_Pitch_PointProcess_voiceReport, L"Voice report", L"Voice")
+FORM (Sound_Pitch_PointProcess_voiceReport, U"Voice report", U"Voice") {
 	praat_dia_timeRange (dia);
-	POSITIVE (L"left Pitch range (Hz)", L"75.0")
-	POSITIVE (L"right Pitch range (Hz)", L"600.0")
-	POSITIVE (L"Maximum period factor", L"1.3")
-	POSITIVE (L"Maximum amplitude factor", L"1.6")
-	REAL (L"Silence threshold", L"0.03")
-	REAL (L"Voicing threshold", L"0.45")
-	OK
+	POSITIVE (U"left Pitch range (Hz)", U"75.0")
+	POSITIVE (U"right Pitch range (Hz)", U"600.0")
+	POSITIVE (U"Maximum period factor", U"1.3")
+	POSITIVE (U"Maximum amplitude factor", U"1.6")
+	REAL (U"Silence threshold", U"0.03")
+	REAL (U"Voicing threshold", U"0.45")
+	OK2
 DO
 	MelderInfo_open ();
 	Sound_Pitch_PointProcess_voiceReport (FIRST (Sound), FIRST (Pitch), FIRST (PointProcess),
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-		GET_REAL (L"left Pitch range"), GET_REAL (L"right Pitch range"),
-		GET_REAL (L"Maximum period factor"), GET_REAL (L"Maximum amplitude factor"),
-		GET_REAL (L"Silence threshold"), GET_REAL (L"Voicing threshold"));
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+		GET_REAL (U"left Pitch range"), GET_REAL (U"right Pitch range"),
+		GET_REAL (U"Maximum period factor"), GET_REAL (U"Maximum amplitude factor"),
+		GET_REAL (U"Silence threshold"), GET_REAL (U"Voicing threshold"));
 	MelderInfo_close ();
-END
+END2 }
 
 /***** SOUND & POINTPROCESS & PITCHTIER & DURATIONTIER *****/
 
-FORM (Sound_Point_Pitch_Duration_to_Sound, L"To Sound", 0)
-	POSITIVE (L"Longest period (s)", L"0.02")
-	OK
+FORM (Sound_Point_Pitch_Duration_to_Sound, U"To Sound", 0) {
+	POSITIVE (U"Longest period (s)", U"0.02")
+	OK2
 DO
 	autoSound thee = Sound_Point_Pitch_Duration_to_Sound (FIRST (Sound), FIRST (PointProcess),
-		FIRST (PitchTier), FIRST (DurationTier), GET_REAL (L"Longest period"));
-	praat_new (thee.transfer(), L"manip");
-END
+		FIRST (PitchTier), FIRST (DurationTier), GET_REAL (U"Longest period"));
+	praat_new (thee.transfer(), U"manip");
+END2 }
 
 /***** SPECTROGRAM *****/
 
-FORM (Spectrogram_paint, L"Spectrogram: Paint", L"Spectrogram: Paint...")
+FORM (Spectrogram_paint, U"Spectrogram: Paint", U"Spectrogram: Paint...") {
 	praat_dia_timeRange (dia);
-	REAL (L"left Frequency range (Hz)", L"0.0")
-	REAL (L"right Frequency range (Hz)", L"0.0 (= all)")
-	REAL (L"Maximum (dB/Hz)", L"100.0")
-	BOOLEAN (L"Autoscaling", 1)
-	POSITIVE (L"Dynamic range (dB)", L"50.0")
-	REAL (L"Pre-emphasis (dB/oct)", L"6.0")
-	REAL (L"Dynamic compression (0-1)", L"0.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+	REAL (U"left Frequency range (Hz)", U"0.0")
+	REAL (U"right Frequency range (Hz)", U"0.0 (= all)")
+	REAL (U"Maximum (dB/Hz)", U"100.0")
+	BOOLEAN (U"Autoscaling", 1)
+	POSITIVE (U"Dynamic range (dB)", U"50.0")
+	REAL (U"Pre-emphasis (dB/oct)", U"6.0")
+	REAL (U"Dynamic compression (0-1)", U"0.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (Spectrogram);
 		autoPraatPicture picture;
-		Spectrogram_paint (me, GRAPHICS, GET_REAL (L"left Time range"),
-			GET_REAL (L"right Time range"), GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_REAL (L"Maximum"), GET_INTEGER (L"Autoscaling"),
-			GET_REAL (L"Dynamic range"), GET_REAL (L"Pre-emphasis"),
-			GET_REAL (L"Dynamic compression"), GET_INTEGER (L"Garnish"));
+		Spectrogram_paint (me, GRAPHICS, GET_REAL (U"left Time range"),
+			GET_REAL (U"right Time range"), GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_REAL (U"Maximum"), GET_INTEGER (U"Autoscaling"),
+			GET_REAL (U"Dynamic range"), GET_REAL (U"Pre-emphasis"),
+			GET_REAL (U"Dynamic compression"), GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-FORM (Spectrogram_formula, L"Spectrogram: Formula", L"Spectrogram: Formula...")
-	LABEL (L"label", L"Do for all times and frequencies:")
-	LABEL (L"label", L"   `x' is the time in seconds")
-	LABEL (L"label", L"   `y' is the frequency in hertz")
-	LABEL (L"label", L"   `self' is the current value in Pa\u00B2/Hz")
-	LABEL (L"label", L"   Replace all values with:")
-	TEXTFIELD (L"formula", L"self * exp (- x / 0.1)")
-	OK
+FORM (Spectrogram_formula, U"Spectrogram: Formula", U"Spectrogram: Formula...") {
+	LABEL (U"label", U"Do for all times and frequencies:")
+	LABEL (U"label", U"   `x' is the time in seconds")
+	LABEL (U"label", U"   `y' is the frequency in hertz")
+	LABEL (U"label", U"   `self' is the current value in Pa\u00B2/Hz")
+	LABEL (U"label", U"   Replace all values with:")
+	TEXTFIELD (U"formula", U"self * exp (- x / 0.1)")
+	OK2
 DO
 	LOOP {
 		iam (Spectrogram);
 		try {
-			Matrix_formula ((Matrix) me, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula ((Matrix) me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Spectrogram may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Spectrogram_getPowerAt, L"Spectrogram: Get power at (time, frequency)", 0)
-	REAL (L"Time (s)", L"0.5")
-	REAL (L"Frequency (Hz)", L"1000")
-	OK
+FORM (Spectrogram_getPowerAt, U"Spectrogram: Get power at (time, frequency)", 0) {
+	REAL (U"Time (s)", U"0.5")
+	REAL (U"Frequency (Hz)", U"1000")
+	OK2
 DO
 	Spectrogram me = FIRST_ANY (Spectrogram);
-	double time = GET_REAL (L"Time"), frequency = GET_REAL (L"Frequency");
+	double time = GET_REAL (U"Time"), frequency = GET_REAL (U"Frequency");
 	MelderInfo_open ();
-	MelderInfo_write (Melder_double (Matrix_getValueAtXY (me, time, frequency)));
-	MelderInfo_write (L" Pa2/Hz (at time = ", Melder_double (time), L" seconds and frequency = ", Melder_double (frequency), L" Hz)");
+	MelderInfo_write (Matrix_getValueAtXY (me, time, frequency));
+	MelderInfo_write (U" Pa2/Hz (at time = ", time, U" seconds and frequency = ", frequency, U" Hz)");
 	MelderInfo_close ();
-END
+END2 }
 
-DIRECT (Spectrogram_help) Melder_help (L"Spectrogram"); END
+DIRECT2 (Spectrogram_help) {
+	Melder_help (U"Spectrogram");
+END2 }
 
-DIRECT (Spectrogram_movie)
-	Graphics g = Movie_create (L"Spectrogram movie", 300, 300);
+DIRECT2 (Spectrogram_movie) {
+	Graphics g = Movie_create (U"Spectrogram movie", 300, 300);
 	LOOP {
 		iam (Spectrogram);
 		Matrix_movie (me, g);
 	}
-END
+END2 }
 
-DIRECT (Spectrogram_to_Matrix)
+DIRECT2 (Spectrogram_to_Matrix) {
 	LOOP {
 		iam (Spectrogram);
 		autoMatrix thee = Spectrogram_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Spectrogram_to_Sound, L"Spectrogram: To Sound", 0)
-	REAL (L"Sampling frequency (Hz)", L"44100")
-	OK
+FORM (Spectrogram_to_Sound, U"Spectrogram: To Sound", 0) {
+	REAL (U"Sampling frequency (Hz)", U"44100")
+	OK2
 DO
 	LOOP {
 		iam (Spectrogram);
-		autoSound thee = Spectrogram_to_Sound (me, GET_REAL (L"Sampling frequency"));
+		autoSound thee = Spectrogram_to_Sound (me, GET_REAL (U"Sampling frequency"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Spectrogram_to_Spectrum, L"Spectrogram: To Spectrum (slice)", 0)
-	REAL (L"Time (seconds)", L"0.0")
-	OK
+FORM (Spectrogram_to_Spectrum, U"Spectrogram: To Spectrum (slice)", 0) {
+	REAL (U"Time (seconds)", U"0.0")
+	OK2
 DO
 	LOOP {
 		iam (Spectrogram);
-		autoSpectrum thee = Spectrogram_to_Spectrum (me, GET_REAL (L"Time"));
+		autoSpectrum thee = Spectrogram_to_Spectrum (me, GET_REAL (U"Time"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Spectrogram_view)
-	if (theCurrentPraatApplication -> batch) Melder_throw (L"Cannot view or edit a Spectrogram from batch.");
+DIRECT2 (Spectrogram_view) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a Spectrogram from batch.");
 	LOOP {
 		iam (Spectrogram);
 		autoSpectrogramEditor editor = SpectrogramEditor_create (ID_AND_FULL_NAME, me);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
 /***** SPECTRUM *****/
 
-FORM (Spectrum_cepstralSmoothing, L"Spectrum: Cepstral smoothing", 0)
-	POSITIVE (L"Bandwidth (Hz)", L"500.0")
-	OK
+FORM (Spectrum_cepstralSmoothing, U"Spectrum: Cepstral smoothing", 0) {
+	POSITIVE (U"Bandwidth (Hz)", U"500.0")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		autoSpectrum thee = Spectrum_cepstralSmoothing (me, GET_REAL (L"Bandwidth"));
+		autoSpectrum thee = Spectrum_cepstralSmoothing (me, GET_REAL (U"Bandwidth"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Spectrum_draw, L"Spectrum: Draw", 0)
-	REAL (L"left Frequency range (Hz)", L"0.0")
-	REAL (L"right Frequency range (Hz)", L"0.0 (= all)")
-	REAL (L"Minimum power (dB/Hz)", L"0 (= auto)")
-	REAL (L"Maximum power (dB/Hz)", L"0 (= auto)")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Spectrum_draw, U"Spectrum: Draw", 0) {
+	REAL (U"left Frequency range (Hz)", U"0.0")
+	REAL (U"right Frequency range (Hz)", U"0.0 (= all)")
+	REAL (U"Minimum power (dB/Hz)", U"0 (= auto)")
+	REAL (U"Maximum power (dB/Hz)", U"0 (= auto)")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
 		autoPraatPicture picture;
-		Spectrum_draw (me, GRAPHICS, GET_REAL (L"left Frequency range"),
-			GET_REAL (L"right Frequency range"), GET_REAL (L"Minimum power"), GET_REAL (L"Maximum power"),
-			GET_INTEGER (L"Garnish"));
+		Spectrum_draw (me, GRAPHICS, GET_REAL (U"left Frequency range"),
+			GET_REAL (U"right Frequency range"), GET_REAL (U"Minimum power"), GET_REAL (U"Maximum power"),
+			GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-FORM (Spectrum_drawLogFreq, L"Spectrum: Draw (log freq)", 0)
-	POSITIVE (L"left Frequency range (Hz)", L"10.0")
-	POSITIVE (L"right Frequency range (Hz)", L"10000.0")
-	REAL (L"Minimum power (dB/Hz)", L"0 (= auto)")
-	REAL (L"Maximum power (dB/Hz)", L"0 (= auto)")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (Spectrum_drawLogFreq, U"Spectrum: Draw (log freq)", 0) {
+	POSITIVE (U"left Frequency range (Hz)", U"10.0")
+	POSITIVE (U"right Frequency range (Hz)", U"10000.0")
+	REAL (U"Minimum power (dB/Hz)", U"0 (= auto)")
+	REAL (U"Maximum power (dB/Hz)", U"0 (= auto)")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
 		autoPraatPicture picture;
-		Spectrum_drawLogFreq (me, GRAPHICS, GET_REAL (L"left Frequency range"),
-			GET_REAL (L"right Frequency range"), GET_REAL (L"Minimum power"), GET_REAL (L"Maximum power"),
-			GET_INTEGER (L"Garnish"));
+		Spectrum_drawLogFreq (me, GRAPHICS, GET_REAL (U"left Frequency range"),
+			GET_REAL (U"right Frequency range"), GET_REAL (U"Minimum power"), GET_REAL (U"Maximum power"),
+			GET_INTEGER (U"Garnish"));
 	}
-END
+END2 }
 
-DIRECT (Spectrum_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a Spectrum from batch.");
+DIRECT2 (Spectrum_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a Spectrum from batch.");
 	LOOP {
 		iam (Spectrum);
 		autoSpectrumEditor editor = SpectrumEditor_create (ID_AND_FULL_NAME, me);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-FORM (Spectrum_formula, L"Spectrum: Formula", L"Spectrum: Formula...")
-	LABEL (L"label", L"`x' is the frequency in hertz, `col' is the bin number;   "
+FORM (Spectrum_formula, U"Spectrum: Formula", U"Spectrum: Formula...") {
+	LABEL (U"label", U"`x' is the frequency in hertz, `col' is the bin number;   "
 		"`y' = `row' is 1 (real part) or 2 (imaginary part)")
-	LABEL (L"label", L"y := 1;   row := 1;   "
+	LABEL (U"label", U"y := 1;   row := 1;   "
 		"x := 0;   for col := 1 to ncol do { self [1, col] := `formula' ; x := x + dx }")
-	LABEL (L"label", L"y := 2;   row := 2;   "
+	LABEL (U"label", U"y := 2;   row := 2;   "
 		"x := 0;   for col := 1 to ncol do { self [2, col] := `formula' ; x := x + dx }")
-	TEXTFIELD (L"formula", L"0")
-	OK
+	TEXTFIELD (U"formula", U"0")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
 		try {
-			Matrix_formula ((Matrix) me, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula ((Matrix) me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Spectrum may have partially changed
 			throw;
 		}
 	}
-END
+END2 }
 
-FORM (Spectrum_getBandDensity, L"Spectrum: Get band density", 0)
-	REAL (L"Band floor (Hz)", L"200.0")
-	REAL (L"Band ceiling (Hz)", L"1000")
-	OK
+FORM (Spectrum_getBandDensity, U"Spectrum: Get band density", 0) {
+	REAL (U"Band floor (Hz)", U"200.0")
+	REAL (U"Band ceiling (Hz)", U"1000")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		double density = Spectrum_getBandDensity (me, GET_REAL (L"Band floor"), GET_REAL (L"Band ceiling"));
-		Melder_informationReal (density, L"Pa2 / Hz2");
+		double density = Spectrum_getBandDensity (me, GET_REAL (U"Band floor"), GET_REAL (U"Band ceiling"));
+		Melder_informationReal (density, U"Pa2 / Hz2");
 	}
-END
+END2 }
 
-FORM (Spectrum_getBandDensityDifference, L"Spectrum: Get band density difference", 0)
-	REAL (L"Low band floor (Hz)", L"0")
-	REAL (L"Low band ceiling (Hz)", L"500")
-	REAL (L"High band floor (Hz)", L"500")
-	REAL (L"High band ceiling (Hz)", L"4000")
-	OK
+FORM (Spectrum_getBandDensityDifference, U"Spectrum: Get band density difference", 0) {
+	REAL (U"Low band floor (Hz)", U"0")
+	REAL (U"Low band ceiling (Hz)", U"500")
+	REAL (U"High band floor (Hz)", U"500")
+	REAL (U"High band ceiling (Hz)", U"4000")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
 		double difference = Spectrum_getBandDensityDifference (me,
-			GET_REAL (L"Low band floor"), GET_REAL (L"Low band ceiling"), GET_REAL (L"High band floor"), GET_REAL (L"High band ceiling"));
-		Melder_informationReal (difference, L"dB");
+			GET_REAL (U"Low band floor"), GET_REAL (U"Low band ceiling"), GET_REAL (U"High band floor"), GET_REAL (U"High band ceiling"));
+		Melder_informationReal (difference, U"dB");
 	}
-END
+END2 }
 
-FORM (Spectrum_getBandEnergy, L"Spectrum: Get band energy", 0)
-	REAL (L"Band floor (Hz)", L"200.0")
-	REAL (L"Band ceiling (Hz)", L"1000")
-	OK
+FORM (Spectrum_getBandEnergy, U"Spectrum: Get band energy", 0) {
+	REAL (U"Band floor (Hz)", U"200.0")
+	REAL (U"Band ceiling (Hz)", U"1000")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		double energy = Spectrum_getBandEnergy (me, GET_REAL (L"Band floor"), GET_REAL (L"Band ceiling"));
-		Melder_informationReal (energy, L"Pa2 sec");
+		double energy = Spectrum_getBandEnergy (me, GET_REAL (U"Band floor"), GET_REAL (U"Band ceiling"));
+		Melder_informationReal (energy, U"Pa2 sec");
 	}
-END
+END2 }
 
-FORM (Spectrum_getBandEnergyDifference, L"Spectrum: Get band energy difference", 0)
-	REAL (L"Low band floor (Hz)", L"0")
-	REAL (L"Low band ceiling (Hz)", L"500")
-	REAL (L"High band floor (Hz)", L"500")
-	REAL (L"High band ceiling (Hz)", L"4000")
-	OK
+FORM (Spectrum_getBandEnergyDifference, U"Spectrum: Get band energy difference", 0) {
+	REAL (U"Low band floor (Hz)", U"0")
+	REAL (U"Low band ceiling (Hz)", U"500")
+	REAL (U"High band floor (Hz)", U"500")
+	REAL (U"High band ceiling (Hz)", U"4000")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
 		double difference = Spectrum_getBandEnergyDifference (me,
-			GET_REAL (L"Low band floor"), GET_REAL (L"Low band ceiling"), GET_REAL (L"High band floor"), GET_REAL (L"High band ceiling"));
-		Melder_informationReal (difference, L"dB");
+			GET_REAL (U"Low band floor"), GET_REAL (U"Low band ceiling"), GET_REAL (U"High band floor"), GET_REAL (U"High band ceiling"));
+		Melder_informationReal (difference, U"dB");
 	}
-END	
+END2 }
 
-FORM (Spectrum_getBinFromFrequency, L"Spectrum: Get bin from frequency", 0)
-	REAL (L"Frequency (Hz)", L"2000")
-	OK
+FORM (Spectrum_getBinFromFrequency, U"Spectrum: Get bin from frequency", 0) {
+	REAL (U"Frequency (Hz)", U"2000")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		double bin = Sampled_xToIndex (me, GET_REAL (L"Frequency"));
+		double bin = Sampled_xToIndex (me, GET_REAL (U"Frequency"));
 		Melder_informationReal (bin, NULL);
 	}
-END
+END2 }
 
-DIRECT (Spectrum_getBinWidth)
+DIRECT2 (Spectrum_getBinWidth) {
 	LOOP {
 		iam (Spectrum);
-		Melder_informationReal (my dx, L"hertz");
+		Melder_informationReal (my dx, U"hertz");
 	}
-END
+END2 }
 
-FORM (Spectrum_getCentralMoment, L"Spectrum: Get central moment", L"Spectrum: Get central moment...")
-	POSITIVE (L"Moment", L"3.0")
-	POSITIVE (L"Power", L"2.0")
-	OK
+FORM (Spectrum_getCentralMoment, U"Spectrum: Get central moment", U"Spectrum: Get central moment...") {
+	POSITIVE (U"Moment", U"3.0")
+	POSITIVE (U"Power", U"2.0")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		double moment = Spectrum_getCentralMoment (me, GET_REAL (L"Moment"), GET_REAL (L"Power"));
-		Melder_informationReal (moment, L"hertz to the power 'moment'");
+		double moment = Spectrum_getCentralMoment (me, GET_REAL (U"Moment"), GET_REAL (U"Power"));
+		Melder_informationReal (moment, U"hertz to the power 'moment'");
 	}
-END
+END2 }
 
-FORM (Spectrum_getCentreOfGravity, L"Spectrum: Get centre of gravity", L"Spectrum: Get centre of gravity...")
-	POSITIVE (L"Power", L"2.0")
-	OK
+FORM (Spectrum_getCentreOfGravity, U"Spectrum: Get centre of gravity", U"Spectrum: Get centre of gravity...") {
+	POSITIVE (U"Power", U"2.0")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		double centreOfGravity = Spectrum_getCentreOfGravity (me, GET_REAL (L"Power"));
-		Melder_informationReal (centreOfGravity, L"hertz");
+		double centreOfGravity = Spectrum_getCentreOfGravity (me, GET_REAL (U"Power"));
+		Melder_informationReal (centreOfGravity, U"hertz");
 	}
-END
+END2 }
 
-FORM (Spectrum_getFrequencyFromBin, L"Spectrum: Get frequency from bin", 0)
-	NATURAL (L"Band number", L"1")
-	OK
+FORM (Spectrum_getFrequencyFromBin, U"Spectrum: Get frequency from bin", 0) {
+	NATURAL (U"Band number", U"1")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		double frequency = Sampled_indexToX (me, GET_INTEGER (L"Band number"));
-		Melder_informationReal (frequency, L"hertz");
+		double frequency = Sampled_indexToX (me, GET_INTEGER (U"Band number"));
+		Melder_informationReal (frequency, U"hertz");
 	}
-END
+END2 }
 
-DIRECT (Spectrum_getHighestFrequency)
+DIRECT2 (Spectrum_getHighestFrequency) {
 	LOOP {
 		iam (Spectrum);
-		Melder_informationReal (my xmax, L"hertz");
+		Melder_informationReal (my xmax, U"hertz");
 	}
-END
+END2 }
 
-FORM (Spectrum_getImaginaryValueInBin, L"Spectrum: Get imaginary value in bin", 0)
-	NATURAL (L"Bin number", L"100")
-	OK
+FORM (Spectrum_getImaginaryValueInBin, U"Spectrum: Get imaginary value in bin", 0) {
+	NATURAL (U"Bin number", U"100")
+	OK2
 DO
-	long binNumber = GET_INTEGER (L"Bin number");
+	long binNumber = GET_INTEGER (U"Bin number");
 	LOOP {
 		iam (Spectrum);
-		if (binNumber > my nx) Melder_throw ("Bin number must not exceed number of bins.");
+		if (binNumber > my nx) Melder_throw (U"Bin number must not exceed number of bins.");
 		Melder_informationReal (my z [2] [binNumber], NULL);
 	}
-END
+END2 }
 
-FORM (Spectrum_getKurtosis, L"Spectrum: Get kurtosis", L"Spectrum: Get kurtosis...")
-	POSITIVE (L"Power", L"2.0")
-	OK
+FORM (Spectrum_getKurtosis, U"Spectrum: Get kurtosis", U"Spectrum: Get kurtosis...") {
+	POSITIVE (U"Power", U"2.0")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		double kurtosis = Spectrum_getKurtosis (me, GET_REAL (L"Power"));
+		double kurtosis = Spectrum_getKurtosis (me, GET_REAL (U"Power"));
 		Melder_informationReal (kurtosis, NULL);
 	}
-END
+END2 }
 
-DIRECT (Spectrum_getLowestFrequency)
+DIRECT2 (Spectrum_getLowestFrequency) {
 	LOOP {
 		iam (Spectrum);
-		Melder_informationReal (my xmin, L"hertz");
+		Melder_informationReal (my xmin, U"hertz");
 	}
-END
+END2 }
 
-DIRECT (Spectrum_getNumberOfBins)
+DIRECT2 (Spectrum_getNumberOfBins) {
 	LOOP {
 		iam (Spectrum);
-		Melder_information (Melder_integer (my nx), L" bins");
+		Melder_information (my nx, U" bins");
 	}
-END
+END2 }
 
-FORM (Spectrum_getRealValueInBin, L"Spectrum: Get real value in bin", 0)
-	NATURAL (L"Bin number", L"100")
-	OK
+FORM (Spectrum_getRealValueInBin, U"Spectrum: Get real value in bin", 0) {
+	NATURAL (U"Bin number", U"100")
+	OK2
 DO
-	long binNumber = GET_INTEGER (L"Bin number");
+	long binNumber = GET_INTEGER (U"Bin number");
 	LOOP {
 		iam (Spectrum);
-		if (binNumber > my nx) Melder_throw ("Bin number must not exceed number of bins.");
+		if (binNumber > my nx) Melder_throw (U"Bin number must not exceed number of bins.");
 		Melder_informationReal (my z [1] [binNumber], NULL);
 	}
-END
+END2 }
 
-FORM (Spectrum_getSkewness, L"Spectrum: Get skewness", L"Spectrum: Get skewness...")
-	POSITIVE (L"Power", L"2.0")
-	OK
+FORM (Spectrum_getSkewness, U"Spectrum: Get skewness", U"Spectrum: Get skewness...") {
+	POSITIVE (U"Power", U"2.0")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		double skewness = Spectrum_getSkewness (me, GET_REAL (L"Power"));
+		double skewness = Spectrum_getSkewness (me, GET_REAL (U"Power"));
 		Melder_informationReal (skewness, NULL);
 	}
-END
+END2 }
 
-FORM (Spectrum_getStandardDeviation, L"Spectrum: Get standard deviation", L"Spectrum: Get standard deviation...")
-	POSITIVE (L"Power", L"2.0")
-	OK
+FORM (Spectrum_getStandardDeviation, U"Spectrum: Get standard deviation", U"Spectrum: Get standard deviation...") {
+	POSITIVE (U"Power", U"2.0")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		double stdev = Spectrum_getStandardDeviation (me, GET_REAL (L"Power"));
-		Melder_informationReal (stdev, L"hertz");
+		double stdev = Spectrum_getStandardDeviation (me, GET_REAL (U"Power"));
+		Melder_informationReal (stdev, U"hertz");
 	}
-END
+END2 }
 
-DIRECT (Spectrum_help) Melder_help (L"Spectrum"); END
+DIRECT2 (Spectrum_help) {
+	Melder_help (U"Spectrum");
+END2 }
 
-FORM (Spectrum_list, L"Spectrum: List", 0)
-	BOOLEAN (L"Include bin number", false)
-	BOOLEAN (L"Include frequency", true)
-	BOOLEAN (L"Include real part", false)
-	BOOLEAN (L"Include imaginary part", false)
-	BOOLEAN (L"Include energy density", false)
-	BOOLEAN (L"Include power density", true)
-	OK
+FORM (Spectrum_list, U"Spectrum: List", 0) {
+	BOOLEAN (U"Include bin number", false)
+	BOOLEAN (U"Include frequency", true)
+	BOOLEAN (U"Include real part", false)
+	BOOLEAN (U"Include imaginary part", false)
+	BOOLEAN (U"Include energy density", false)
+	BOOLEAN (U"Include power density", true)
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		Spectrum_list (me, GET_INTEGER (L"Include bin number"), GET_INTEGER (L"Include frequency"),
-			GET_INTEGER (L"Include real part"), GET_INTEGER (L"Include imaginary part"),
-			GET_INTEGER (L"Include energy density"), GET_INTEGER (L"Include power density"));
+		Spectrum_list (me, GET_INTEGER (U"Include bin number"), GET_INTEGER (U"Include frequency"),
+			GET_INTEGER (U"Include real part"), GET_INTEGER (U"Include imaginary part"),
+			GET_INTEGER (U"Include energy density"), GET_INTEGER (U"Include power density"));
 	}
-END
+END2 }
 
-FORM (Spectrum_lpcSmoothing, L"Spectrum: LPC smoothing", 0)
-	NATURAL (L"Number of peaks", L"5")
-	POSITIVE (L"Pre-emphasis from (Hz)", L"50.0")
-	OK
+FORM (Spectrum_lpcSmoothing, U"Spectrum: LPC smoothing", 0) {
+	NATURAL (U"Number of peaks", U"5")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50.0")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		autoSpectrum thee = Spectrum_lpcSmoothing (me, GET_INTEGER (L"Number of peaks"), GET_REAL (L"Pre-emphasis from"));
+		autoSpectrum thee = Spectrum_lpcSmoothing (me, GET_INTEGER (U"Number of peaks"), GET_REAL (U"Pre-emphasis from"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Spectrum_passHannBand, L"Spectrum: Filter (pass Hann band)", L"Spectrum: Filter (pass Hann band)...")
-	REAL (L"From frequency (Hz)", L"500")
-	REAL (L"To frequency (Hz)", L"1000")
-	POSITIVE (L"Smoothing (Hz)", L"100")
-	OK
+FORM (Spectrum_passHannBand, U"Spectrum: Filter (pass Hann band)", U"Spectrum: Filter (pass Hann band)...") {
+	REAL (U"From frequency (Hz)", U"500")
+	REAL (U"To frequency (Hz)", U"1000")
+	POSITIVE (U"Smoothing (Hz)", U"100")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		Spectrum_passHannBand (me, GET_REAL (L"From frequency"), GET_REAL (L"To frequency"), GET_REAL (L"Smoothing"));
+		Spectrum_passHannBand (me, GET_REAL (U"From frequency"), GET_REAL (U"To frequency"), GET_REAL (U"Smoothing"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (Spectrum_stopHannBand, L"Spectrum: Filter (stop Hann band)", L"Spectrum: Filter (stop Hann band)...")
-	REAL (L"From frequency (Hz)", L"500")
-	REAL (L"To frequency (Hz)", L"1000")
-	POSITIVE (L"Smoothing (Hz)", L"100")
-	OK
+FORM (Spectrum_stopHannBand, U"Spectrum: Filter (stop Hann band)", U"Spectrum: Filter (stop Hann band)...") {
+	REAL (U"From frequency (Hz)", U"500")
+	REAL (U"To frequency (Hz)", U"1000")
+	POSITIVE (U"Smoothing (Hz)", U"100")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		Spectrum_stopHannBand (me, GET_REAL (L"From frequency"), GET_REAL (L"To frequency"), GET_REAL (L"Smoothing"));
+		Spectrum_stopHannBand (me, GET_REAL (U"From frequency"), GET_REAL (U"To frequency"), GET_REAL (U"Smoothing"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (Spectrum_to_Excitation, L"Spectrum: To Excitation", 0)
-	POSITIVE (L"Frequency resolution (Bark)", L"0.1")
-	OK
+FORM (Spectrum_to_Excitation, U"Spectrum: To Excitation", 0) {
+	POSITIVE (U"Frequency resolution (Bark)", U"0.1")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		autoExcitation thee = Spectrum_to_Excitation (me, GET_REAL (L"Frequency resolution"));
+		autoExcitation thee = Spectrum_to_Excitation (me, GET_REAL (U"Frequency resolution"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Spectrum_to_Formant_peaks, L"Spectrum: To Formant (peaks)", 0)
-	LABEL (L"", L"Warning: this simply picks peaks from 0 Hz up!")
-	NATURAL (L"Maximum number of formants", L"1000")
-	OK
+FORM (Spectrum_to_Formant_peaks, U"Spectrum: To Formant (peaks)", 0) {
+	LABEL (U"", U"Warning: this simply picks peaks from 0 Hz up!")
+	NATURAL (U"Maximum number of formants", U"1000")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		autoFormant thee = Spectrum_to_Formant (me, GET_INTEGER (L"Maximum number of formants"));
+		autoFormant thee = Spectrum_to_Formant (me, GET_INTEGER (U"Maximum number of formants"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Spectrum_to_Ltas, L"Spectrum: To Long-term average spectrum", 0)
-	POSITIVE (L"Bandwidth (Hz)", L"1000")
-	OK
+FORM (Spectrum_to_Ltas, U"Spectrum: To Long-term average spectrum", 0) {
+	POSITIVE (U"Bandwidth (Hz)", U"1000")
+	OK2
 DO
 	LOOP {
 		iam (Spectrum);
-		autoLtas thee = Spectrum_to_Ltas (me, GET_REAL (L"Bandwidth"));
+		autoLtas thee = Spectrum_to_Ltas (me, GET_REAL (U"Bandwidth"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Spectrum_to_Ltas_1to1)
+DIRECT2 (Spectrum_to_Ltas_1to1) {
 	LOOP {
 		iam (Spectrum);
 		autoLtas thee = Spectrum_to_Ltas_1to1 (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Spectrum_to_Matrix)
+DIRECT2 (Spectrum_to_Matrix) {
 	LOOP {
 		iam (Spectrum);
 		autoMatrix thee = Spectrum_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Spectrum_to_Sound)
+DIRECT2 (Spectrum_to_Sound) {
 	LOOP {
 		iam (Spectrum);
 		autoSound thee = Spectrum_to_Sound (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Spectrum_to_Spectrogram)
+DIRECT2 (Spectrum_to_Spectrogram) {
 	LOOP {
 		iam (Spectrum);
 		autoSpectrogram thee = Spectrum_to_Spectrogram (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Spectrum_to_SpectrumTier_peaks)
+DIRECT2 (Spectrum_to_SpectrumTier_peaks) {
 	LOOP {
 		iam (Spectrum);
 		autoSpectrumTier thee = Spectrum_to_SpectrumTier_peaks (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** SPECTRUMTIER *****/
 
-DIRECT (SpectrumTier_downto_Table)
+DIRECT2 (SpectrumTier_downto_Table) {
 	LOOP {
 		iam (SpectrumTier);
 		autoTable thee = SpectrumTier_downto_Table (me, true, true, true);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (old_SpectrumTier_draw, L"SpectrumTier: Draw", 0)   // 2010/10/19
-	REAL (L"left Frequency range (Hz)", L"0.0")
-	REAL (L"right Frequency range (Hz)", L"10000.0")
-	REAL (L"left Power range (dB)", L"20.0")
-	REAL (L"right Power range (dB)", L"80.0")
-	BOOLEAN (L"Garnish", 1)
-	OK
+FORM (old_SpectrumTier_draw, U"SpectrumTier: Draw", 0) {   // 2010/10/19
+	REAL (U"left Frequency range (Hz)", U"0.0")
+	REAL (U"right Frequency range (Hz)", U"10000.0")
+	REAL (U"left Power range (dB)", U"20.0")
+	REAL (U"right Power range (dB)", U"80.0")
+	BOOLEAN (U"Garnish", 1)
+	OK2
 DO
 	LOOP {
 		iam (SpectrumTier);
 		autoPraatPicture picture;
 		SpectrumTier_draw (me, GRAPHICS,
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_REAL (L"left Power range"), GET_REAL (L"right Power range"),
-			GET_INTEGER (L"Garnish"), L"lines and speckles");
-	}
-END
-
-FORM (SpectrumTier_draw, L"SpectrumTier: Draw", 0)
-	REAL (L"left Frequency range (Hz)", L"0.0")
-	REAL (L"right Frequency range (Hz)", L"10000.0")
-	REAL (L"left Power range (dB)", L"20.0")
-	REAL (L"right Power range (dB)", L"80.0")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"")
-	OPTIONMENU (L"Drawing method", 1)
-		OPTION (L"lines")
-		OPTION (L"speckles")
-		OPTION (L"lines and speckles")
-	OK
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_REAL (U"left Power range"), GET_REAL (U"right Power range"),
+			GET_INTEGER (U"Garnish"), U"lines and speckles");
+	}
+END2 }
+
+FORM (SpectrumTier_draw, U"SpectrumTier: Draw", 0) {
+	REAL (U"left Frequency range (Hz)", U"0.0")
+	REAL (U"right Frequency range (Hz)", U"10000.0")
+	REAL (U"left Power range (dB)", U"20.0")
+	REAL (U"right Power range (dB)", U"80.0")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"")
+	OPTIONMENU (U"Drawing method", 1)
+		OPTION (U"lines")
+		OPTION (U"speckles")
+		OPTION (U"lines and speckles")
+	OK2
 DO_ALTERNATIVE (old_SpectrumTier_draw)
 	LOOP {
 		iam (SpectrumTier);
 		autoPraatPicture picture;
 		SpectrumTier_draw (me, GRAPHICS,
-			GET_REAL (L"left Frequency range"), GET_REAL (L"right Frequency range"),
-			GET_REAL (L"left Power range"), GET_REAL (L"right Power range"),
-			GET_INTEGER (L"Garnish"), GET_STRING (L"Drawing method"));
+			GET_REAL (U"left Frequency range"), GET_REAL (U"right Frequency range"),
+			GET_REAL (U"left Power range"), GET_REAL (U"right Power range"),
+			GET_INTEGER (U"Garnish"), GET_STRING (U"Drawing method"));
 	}
-END
+END2 }
 
-FORM (SpectrumTier_list, L"SpectrumTier: List", 0)
-	BOOLEAN (L"Include indexes", true)
-	BOOLEAN (L"Include frequency", true)
-	BOOLEAN (L"Include power density", true)
-	OK
+FORM (SpectrumTier_list, U"SpectrumTier: List", 0) {
+	BOOLEAN (U"Include indexes", true)
+	BOOLEAN (U"Include frequency", true)
+	BOOLEAN (U"Include power density", true)
+	OK2
 DO
 	LOOP {
 		iam (SpectrumTier);
-		SpectrumTier_list (me, GET_INTEGER (L"Include indexes"), GET_INTEGER (L"Include frequency"), GET_INTEGER (L"Include power density"));
+		SpectrumTier_list (me, GET_INTEGER (U"Include indexes"), GET_INTEGER (U"Include frequency"), GET_INTEGER (U"Include power density"));
 	}
-END
+END2 }
 
-FORM (SpectrumTier_removePointsBelow, L"SpectrumTier: Remove points below", 0)
-	REAL (L"Remove all points below (dB)", L"40.0")
-	OK
+FORM (SpectrumTier_removePointsBelow, U"SpectrumTier: Remove points below", 0) {
+	REAL (U"Remove all points below (dB)", U"40.0")
+	OK2
 DO
 	LOOP {
 		iam (SpectrumTier);
-		RealTier_removePointsBelow ((RealTier) me, GET_REAL (L"Remove all points below"));
+		RealTier_removePointsBelow ((RealTier) me, GET_REAL (U"Remove all points below"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
 /***** STRINGS *****/
 
-FORM (Strings_createAsFileList, L"Create Strings as file list", L"Create Strings as file list...")
-	SENTENCE (L"Name", L"fileList")
-	LABEL (L"", L"File path:")
-	TEXTFIELD (L"path", L"/people/Miep/*.wav")
-	OK
-static int inited;
+FORM (Strings_createAsFileList, U"Create Strings as file list", U"Create Strings as file list...") {
+	SENTENCE (U"Name", U"fileList")
+	LABEL (U"", U"File path:")
+	TEXTFIELD (U"path", U"/people/Miep/*.wav")
+	OK2
+static bool inited;
 if (! inited) {
 	structMelderDir defaultDir = { { 0 } };
-	wchar_t *workingDirectory, path [kMelder_MAXPATH+1];
 	Melder_getDefaultDir (& defaultDir);
-	workingDirectory = Melder_dirToPath (& defaultDir);
+	char32 *workingDirectory = Melder_dirToPath (& defaultDir);
+	char32 path [kMelder_MAXPATH+1];
 	#if defined (UNIX)
-		swprintf (path, kMelder_MAXPATH+1, L"%ls/*.wav", workingDirectory);
+		Melder_sprint (path, kMelder_MAXPATH+1, workingDirectory, U"/*.wav");
 	#elif defined (_WIN32)
 	{
-		int len = wcslen (workingDirectory);
-		swprintf (path, kMelder_MAXPATH+1, L"%ls%ls*.wav", workingDirectory, len == 0 || workingDirectory [len - 1] != '\\' ? L"\\" : L"");
+		int len = str32len (workingDirectory);
+		Melder_sprint (path, kMelder_MAXPATH+1, workingDirectory, len == 0 || workingDirectory [len - 1] != U'\\' ? U"\\" : U"", U"*.wav");
 	}
 	#else
-		swprintf (path, kMelder_MAXPATH+1, L"%ls*.wav", workingDirectory);
+		Melder_sprint (path, kMelder_MAXPATH+1, workingDirectory, U"*.wav");
 	#endif
-	SET_STRING (L"path", path);
-	inited = TRUE;
+	SET_STRING (U"path", path);
+	inited = true;
 }
 DO
-	autoStrings me = Strings_createAsFileList (GET_STRING (L"path"));
-	praat_new (me.transfer(), GET_STRING (L"Name"));
-END
+	autoStrings me = Strings_createAsFileList (GET_STRING (U"path"));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
+END2 }
 
-FORM (Strings_createAsDirectoryList, L"Create Strings as directory list", L"Create Strings as directory list...")
-	SENTENCE (L"Name", L"directoryList")
-	LABEL (L"", L"Path:")
-	TEXTFIELD (L"path", L"/people/Miep/*")
-	OK
-static int inited;
+FORM (Strings_createAsDirectoryList, U"Create Strings as directory list", U"Create Strings as directory list...") {
+	SENTENCE (U"Name", U"directoryList")
+	LABEL (U"", U"Path:")
+	TEXTFIELD (U"path", U"/people/Miep/*")
+	OK2
+static bool inited;
 if (! inited) {
 	structMelderDir defaultDir = { { 0 } };
-	wchar_t *workingDirectory, path [kMelder_MAXPATH+1];
 	Melder_getDefaultDir (& defaultDir);
-	workingDirectory = Melder_dirToPath (& defaultDir);
+	char32 *workingDirectory = Melder_dirToPath (& defaultDir);
+	char32 path [kMelder_MAXPATH+1];
 	#if defined (UNIX)
-		swprintf (path, kMelder_MAXPATH+1, L"%ls/*", workingDirectory);
+		Melder_sprint (path, kMelder_MAXPATH+1, workingDirectory, U"/*");
 	#elif defined (_WIN32)
 	{
-		int len = wcslen (workingDirectory);
-		swprintf (path, kMelder_MAXPATH+1, L"%ls%ls*", workingDirectory, len == 0 || workingDirectory [len - 1] != '\\' ? L"\\" : L"");
+		int len = str32len (workingDirectory);
+		Melder_sprint (path, kMelder_MAXPATH+1, workingDirectory, len == 0 || workingDirectory [len - 1] != U'\\' ? U"\\" : U"");
 	}
 	#else
-		swprintf (path, 300, L"%ls*", workingDirectory);
+		Melder_sprint (path, kMelder_MAXPATH+1, workingDirectory, U"*");
 	#endif
-	SET_STRING (L"path", path);
-	inited = TRUE;
+	SET_STRING (U"path", path);
+	inited = true;
 }
 DO
-	autoStrings me = Strings_createAsDirectoryList (GET_STRING (L"path"));
-	praat_new (me.transfer(), GET_STRING (L"Name"));
-END
+	autoStrings me = Strings_createAsDirectoryList (GET_STRING (U"path"));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
+END2 }
 
-DIRECT (Strings_edit)
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a Strings from batch.");
+DIRECT2 (Strings_edit) {
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a Strings from batch.");
 	LOOP {
 		iam (Strings);
 		autoStringsEditor editor = StringsEditor_create (ID_AND_FULL_NAME, me);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
-END
+END2 }
 
-DIRECT (Strings_equal)
+DIRECT2 (Strings_equal) {
 	Strings s1 = NULL, s2 = NULL;
 	LOOP (s1 ? s2 : s1) = (Strings) OBJECT;
 	bool equal = Data_equal (s1, s2);
-	Melder_information (Melder_integer (equal));
-END
+	Melder_information ((int) equal);   // we need a 0 or 1
+END2 }
 
-DIRECT (Strings_genericize)
+DIRECT2 (Strings_genericize) {
 	LOOP {
 		iam (Strings);
 		try {
@@ -5769,42 +5811,44 @@ DIRECT (Strings_genericize)
 			throw;
 		}
 	}
-END
+END2 }
 
-DIRECT (Strings_getNumberOfStrings)
+DIRECT2 (Strings_getNumberOfStrings) {
 	LOOP {
 		iam (Strings);
-		Melder_information (Melder_integer (my numberOfStrings));
+		Melder_information (my numberOfStrings);
 	}
-END
+END2 }
 
-FORM (Strings_getString, L"Get string", 0)
-	NATURAL (L"Position", L"1")
-	OK
+FORM (Strings_getString, U"Get string", 0) {
+	NATURAL (U"Position", U"1")
+	OK2
 DO
 	LOOP {
 		iam (Strings);
-		long index = GET_INTEGER (L"Position");
-		Melder_information (index > my numberOfStrings ? L"" : my strings [index]);   // TODO
+		long index = GET_INTEGER (U"Position");
+		Melder_information (index > my numberOfStrings ? U"" : my strings [index]);   // TODO
 	}
-END
+END2 }
 
-DIRECT (Strings_help) Melder_help (L"Strings"); END
+DIRECT2 (Strings_help) {
+	Melder_help (U"Strings");
+END2 }
 
-FORM (Strings_insertString, L"Strings: Insert string", 0)
-	NATURAL (L"At position", L"1")
-	LABEL (L"", L"String:")
-	TEXTFIELD (L"string", L"")
-	OK
+FORM (Strings_insertString, U"Strings: Insert string", 0) {
+	NATURAL (U"At position", U"1")
+	LABEL (U"", U"String:")
+	TEXTFIELD (U"string", U"")
+	OK2
 DO
 	LOOP {
 		iam (Strings);
-		Strings_insert (me, GET_INTEGER (L"At position"), GET_STRING (L"string"));
+		Strings_insert (me, GET_INTEGER (U"At position"), GET_STRING (U"string"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-DIRECT (Strings_nativize)
+DIRECT2 (Strings_nativize) {
 	LOOP {
 		iam (Strings);
 		try {
@@ -5815,87 +5859,87 @@ DIRECT (Strings_nativize)
 			throw;
 		}
 	}
-END
+END2 }
 
-DIRECT (Strings_randomize)
+DIRECT2 (Strings_randomize) {
 	LOOP {
 		iam (Strings);
 		Strings_randomize (me);
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM_READ (Strings_readFromRawTextFile, L"Read Strings from raw text file", 0, true)
+FORM_READ2 (Strings_readFromRawTextFile, U"Read Strings from raw text file", 0, true) {
 	autoStrings me = Strings_readFromRawTextFile (file);
 	praat_new (me.transfer(), MelderFile_name (file));
-END
+END2 }
 
-FORM (Strings_removeString, L"Strings: Remove string", 0)
-	NATURAL (L"Position", L"1")
-	OK
+FORM (Strings_removeString, U"Strings: Remove string", 0) {
+	NATURAL (U"Position", U"1")
+	OK2
 DO
 	LOOP {
 		iam (Strings);
-		Strings_remove (me, GET_INTEGER (L"Position"));
+		Strings_remove (me, GET_INTEGER (U"Position"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (Strings_replaceAll, L"Strings: Replace all", 0)
-	SENTENCE (L"Find", L"a")
-	SENTENCE (L"Replace with", L"b")
-	INTEGER (L"Replace limit per string", L"0 (=unlimited)")
-	RADIO (L"Find and replace strings are", 1)
-	RADIOBUTTON (L"literals")
-	RADIOBUTTON (L"regular expressions")
-	OK
+FORM (Strings_replaceAll, U"Strings: Replace all", 0) {
+	SENTENCE (U"Find", U"a")
+	SENTENCE (U"Replace with", U"b")
+	INTEGER (U"Replace limit per string", U"0 (=unlimited)")
+	RADIO (U"Find and replace strings are", 1)
+		RADIOBUTTON (U"literals")
+		RADIOBUTTON (U"regular expressions")
+	OK2
 DO
 	long numberOfMatches, numberOfStringMatches;
 	LOOP {
 		iam (Strings);
-		praat_new (Strings_change (me, GET_STRING (L"Find"), GET_STRING (L"Replace with"),
-			GET_INTEGER (L"Replace limit per string"), & numberOfMatches, & numberOfStringMatches, GET_INTEGER (L"Find and replace strings are") - 1), 0);
+		praat_new (Strings_change (me, GET_STRING (U"Find"), GET_STRING (U"Replace with"),
+			GET_INTEGER (U"Replace limit per string"), & numberOfMatches, & numberOfStringMatches, GET_INTEGER (U"Find and replace strings are") - 1), 0);
 	}
-END
+END2 }
 
-FORM (Strings_setString, L"Strings: Set string", 0)
-	NATURAL (L"Position", L"1")
-	LABEL (L"", L"New string:")
-	TEXTFIELD (L"newString", L"")
-	OK
+FORM (Strings_setString, U"Strings: Set string", 0) {
+	NATURAL (U"Position", U"1")
+	LABEL (U"", U"New string:")
+	TEXTFIELD (U"newString", U"")
+	OK2
 DO
 	LOOP {
 		iam (Strings);
-		Strings_replace (me, GET_INTEGER (L"Position"), GET_STRING (L"newString"));
+		Strings_replace (me, GET_INTEGER (U"Position"), GET_STRING (U"newString"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-DIRECT (Strings_sort)
+DIRECT2 (Strings_sort) {
 	LOOP {
 		iam (Strings);
 		Strings_sort (me);
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-DIRECT (Strings_to_Distributions)
+DIRECT2 (Strings_to_Distributions) {
 	LOOP {
 		iam (Strings);
 		autoDistributions thee = Strings_to_Distributions (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Strings_to_WordList)
+DIRECT2 (Strings_to_WordList) {
 	LOOP {
 		iam (Strings);
 		autoWordList thee = Strings_to_WordList (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM_WRITE (Strings_writeToRawTextFile, L"Save Strings as text file", 0, L"txt")
+FORM_WRITE (Strings_writeToRawTextFile, U"Save Strings as text file", 0, U"txt")
 	LOOP {
 		iam (Strings);
 		Strings_writeToRawTextFile (me, file);
@@ -5904,335 +5948,337 @@ END
 
 /***** TABLE, rest in praat_Stat.cpp *****/
 
-DIRECT (Table_to_Matrix)
+DIRECT2 (Table_to_Matrix) {
 	LOOP {
 		iam (Table);
 		autoMatrix thee = Table_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** TEXTGRID, rest in praat_TextGrid_init.cpp *****/
 
-FORM (TextGrid_create, L"Create TextGrid", L"Create TextGrid...")
-	LABEL (L"", L"Hint: to label or segment an existing Sound,")
-	LABEL (L"", L"select that Sound and choose \"To TextGrid...\".")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	SENTENCE (L"All tier names", L"Mary John bell")
-	SENTENCE (L"Which of these are point tiers?", L"bell")
-	OK
-DO
-	double tmin = GET_REAL (L"Start time"), tmax = GET_REAL (L"End time");
-	if (tmax <= tmin) Melder_throw ("End time should be greater than start time");
-	autoTextGrid thee = TextGrid_create (tmin, tmax, GET_STRING (L"All tier names"), GET_STRING (L"Which of these are point tiers?"));
-	praat_new (thee.transfer(), GET_STRING (L"All tier names"));
-END
+FORM (TextGrid_create, U"Create TextGrid", U"Create TextGrid...") {
+	LABEL (U"", U"Hint: to label or segment an existing Sound,")
+	LABEL (U"", U"select that Sound and choose \"To TextGrid...\".")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	SENTENCE (U"All tier names", U"Mary John bell")
+	SENTENCE (U"Which of these are point tiers?", U"bell")
+	OK2
+DO
+	double tmin = GET_REAL (U"Start time"), tmax = GET_REAL (U"End time");
+	if (tmax <= tmin) Melder_throw (U"End time should be greater than start time");
+	autoTextGrid thee = TextGrid_create (tmin, tmax, GET_STRING (U"All tier names"), GET_STRING (U"Which of these are point tiers?"));
+	praat_new (thee.transfer(), GET_STRING (U"All tier names"));
+END2 }
 
 /***** TEXTTIER, rest in praat_TextGrid_init.cpp *****/
 
-FORM_READ (TextTier_readFromXwaves, L"Read TextTier from Xwaves", 0, true)
+FORM_READ2 (TextTier_readFromXwaves, U"Read TextTier from Xwaves", 0, true) {
 	autoTextTier me = TextTier_readFromXwaves (file);
 	praat_new (me.transfer(), MelderFile_name (file));
-END
+END2 }
 
 /***** TIMEFRAMESAMPLED *****/
 
-DIRECT (TimeFrameSampled_getNumberOfFrames)
+DIRECT2 (TimeFrameSampled_getNumberOfFrames) {
 	LOOP {
 		iam (Sampled);
 		long numberOfFrames = my nx;
-		Melder_information (Melder_integer (numberOfFrames), L" frames");
+		Melder_information (numberOfFrames, U" frames");
 	}
-END
+END2 }
 
-FORM (TimeFrameSampled_getFrameFromTime, L"Get frame number from time", L"Get frame number from time...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (TimeFrameSampled_getFrameFromTime, U"Get frame number from time", U"Get frame number from time...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (Sampled);
-		double frame = Sampled_xToIndex (me, GET_REAL (L"Time"));
+		double frame = Sampled_xToIndex (me, GET_REAL (U"Time"));
 		Melder_informationReal (frame, NULL);
 	}
-END
+END2 }
 
-DIRECT (TimeFrameSampled_getFrameLength)
+DIRECT2 (TimeFrameSampled_getFrameLength) {
 	LOOP {
 		iam (Sampled);
 		double frameLength = my dx;
-		Melder_informationReal (frameLength, L"seconds");
+		Melder_informationReal (frameLength, U"seconds");
 	}
-END
+END2 }
 
-FORM (TimeFrameSampled_getTimeFromFrame, L"Get time from frame number", L"Get time from frame number...")
-	NATURAL (L"Frame number", L"1")
-	OK
+FORM (TimeFrameSampled_getTimeFromFrame, U"Get time from frame number", U"Get time from frame number...") {
+	NATURAL (U"Frame number", U"1")
+	OK2
 DO
 	LOOP {
 		iam (Sampled);
-		double time = Sampled_indexToX (me, GET_INTEGER (L"Frame number"));
-		Melder_informationReal (time, L"seconds");
+		double time = Sampled_indexToX (me, GET_INTEGER (U"Frame number"));
+		Melder_informationReal (time, U"seconds");
 	}
-END
+END2 }
 
 /***** TIMEFUNCTION *****/
 
-DIRECT (TimeFunction_getDuration)
+DIRECT2 (TimeFunction_getDuration) {
 	LOOP {
 		iam (Function);
 		double duration = my xmax - my xmin;
-		Melder_informationReal (duration, L"seconds");
+		Melder_informationReal (duration, U"seconds");
 	}
-END
+END2 }
 
-DIRECT (TimeFunction_getEndTime)
+DIRECT2 (TimeFunction_getEndTime) {
 	LOOP {
 		iam (Function);
 		double endTime = my xmax;
-		Melder_informationReal (endTime, L"seconds");
+		Melder_informationReal (endTime, U"seconds");
 	}
-END
+END2 }
 
-DIRECT (TimeFunction_getStartTime)
+DIRECT2 (TimeFunction_getStartTime) {
 	LOOP {
 		iam (Function);
 		double startTime = my xmin;
-		Melder_informationReal (startTime, L"seconds");
+		Melder_informationReal (startTime, U"seconds");
 	}
-END
+END2 }
 
-FORM (TimeFunction_scaleTimesBy, L"Scale times by", 0)
-	POSITIVE (L"Factor", L"2.0")
-	OK
+FORM (TimeFunction_scaleTimesBy, U"Scale times by", 0) {
+	POSITIVE (U"Factor", U"2.0")
+	OK2
 DO
 	LOOP {
 		iam (Function);
-		Function_scaleXBy (me, GET_REAL (L"Factor"));
+		Function_scaleXBy (me, GET_REAL (U"Factor"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (TimeFunction_scaleTimesTo, L"Scale times to", 0)
-	REAL (L"New start time (s)", L"0.0")
-	REAL (L"New end time (s)", L"1.0")
-	OK
+FORM (TimeFunction_scaleTimesTo, U"Scale times to", 0) {
+	REAL (U"New start time (s)", U"0.0")
+	REAL (U"New end time (s)", U"1.0")
+	OK2
 DO
-	double tminto = GET_REAL (L"New start time"), tmaxto = GET_REAL (L"New end time");
-	if (tminto >= tmaxto) Melder_throw ("New end time should be greater than new start time.");
+	double tminto = GET_REAL (U"New start time"), tmaxto = GET_REAL (U"New end time");
+	if (tminto >= tmaxto) Melder_throw (U"New end time should be greater than new start time.");
 	LOOP {
 		iam (Function);
 		Function_scaleXTo (me, tminto, tmaxto);
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (TimeFunction_shiftTimesBy, L"Shift times by", 0)
-	REAL (L"Shift (s)", L"0.5")
-	OK
+FORM (TimeFunction_shiftTimesBy, U"Shift times by", 0) {
+	REAL (U"Shift (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (Function);
-		Function_shiftXBy (me, GET_REAL (L"Shift"));
+		Function_shiftXBy (me, GET_REAL (U"Shift"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (TimeFunction_shiftTimesTo, L"Shift times to", 0)
-	RADIO (L"Shift", 1)
-		OPTION (L"start time")
-		OPTION (L"centre time")
-		OPTION (L"end time")
-	REAL (L"To time (s)", L"0.0")
-	OK
+FORM (TimeFunction_shiftTimesTo, U"Shift times to", 0) {
+	RADIO (U"Shift", 1)
+		OPTION (U"start time")
+		OPTION (U"centre time")
+		OPTION (U"end time")
+	REAL (U"To time (s)", U"0.0")
+	OK2
 DO
-	int shift = GET_INTEGER (L"Shift");
+	int shift = GET_INTEGER (U"Shift");
 	LOOP {
 		iam (Function);
-		Function_shiftXTo (me, shift == 1 ? my xmin : shift == 2 ? 0.5 * (my xmin + my xmax) : my xmax, GET_REAL (L"To time"));
+		Function_shiftXTo (me, shift == 1 ? my xmin : shift == 2 ? 0.5 * (my xmin + my xmax) : my xmax, GET_REAL (U"To time"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-DIRECT (TimeFunction_shiftToZero)
+DIRECT2 (TimeFunction_shiftToZero) {
 	LOOP {
 		iam (Function);
 		Function_shiftXTo (me, my xmin, 0.0);
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
 /***** TIMETIER *****/
 
-FORM (TimeTier_getHighIndexFromTime, L"Get high index", L"AnyTier: Get high index from time...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (TimeTier_getHighIndexFromTime, U"Get high index", U"AnyTier: Get high index from time...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (AnyTier);
-		Melder_information (my points -> size == 0 ? L"--undefined--" : Melder_integer (AnyTier_timeToHighIndex (me, GET_REAL (L"Time"))));
+		Melder_information (my points -> size == 0 ? U"--undefined--" : Melder_integer (AnyTier_timeToHighIndex (me, GET_REAL (U"Time"))));
 	}
-END
+END2 }
 
-FORM (TimeTier_getLowIndexFromTime, L"Get low index", L"AnyTier: Get low index from time...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (TimeTier_getLowIndexFromTime, U"Get low index", U"AnyTier: Get low index from time...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (AnyTier);
-		Melder_information (my points -> size == 0 ? L"--undefined--" : Melder_integer (AnyTier_timeToLowIndex (me, GET_REAL (L"Time"))));
+		Melder_information (my points -> size == 0 ? U"--undefined--" : Melder_integer (AnyTier_timeToLowIndex (me, GET_REAL (U"Time"))));
 	}
-END
+END2 }
 
-FORM (TimeTier_getNearestIndexFromTime, L"Get nearest index", L"AnyTier: Get nearest index from time...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (TimeTier_getNearestIndexFromTime, U"Get nearest index", U"AnyTier: Get nearest index from time...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (AnyTier);
-		Melder_information (my points -> size == 0 ? L"--undefined--" : Melder_integer (AnyTier_timeToNearestIndex (me, GET_REAL (L"Time"))));
+		Melder_information (my points -> size == 0 ? U"--undefined--" : Melder_integer (AnyTier_timeToNearestIndex (me, GET_REAL (U"Time"))));
 	}
-END
+END2 }
 
-DIRECT (TimeTier_getNumberOfPoints)
+DIRECT2 (TimeTier_getNumberOfPoints) {
 	LOOP {
 		iam (AnyTier);
-		Melder_information (Melder_integer (my points -> size), L" points");
+		Melder_information (my points -> size, U" points");
 	}
-END
+END2 }
 
-FORM (TimeTier_getTimeFromIndex, L"Get time", 0 /*"AnyTier: Get time from index..."*/)
-	NATURAL (L"Point number", L"10")
-	OK
+FORM (TimeTier_getTimeFromIndex, U"Get time", 0 /*"AnyTier: Get time from index..."*/) {
+	NATURAL (U"Point number", U"10")
+	OK2
 DO
 	LOOP {
 		iam (AnyTier);
-		long i = GET_INTEGER (L"Point number");
-		if (i > my points -> size) Melder_information (L"--undefined--");
-		else Melder_informationReal (((AnyPoint) my points -> item [i]) -> number, L"seconds");
+		long i = GET_INTEGER (U"Point number");
+		if (i > my points -> size) Melder_information (U"--undefined--");
+		else Melder_informationReal (((AnyPoint) my points -> item [i]) -> number, U"seconds");
 	}
-END
+END2 }
 
-FORM (TimeTier_removePoint, L"Remove one point", L"AnyTier: Remove point...")
-	NATURAL (L"Point number", L"1")
-	OK
+FORM (TimeTier_removePoint, U"Remove one point", U"AnyTier: Remove point...") {
+	NATURAL (U"Point number", U"1")
+	OK2
 DO
 	LOOP {
 		iam (AnyTier);
-		AnyTier_removePoint (me, GET_INTEGER (L"Point number"));
+		AnyTier_removePoint (me, GET_INTEGER (U"Point number"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (TimeTier_removePointNear, L"Remove one point", L"AnyTier: Remove point near...")
-	REAL (L"Time (s)", L"0.5")
-	OK
+FORM (TimeTier_removePointNear, U"Remove one point", U"AnyTier: Remove point near...") {
+	REAL (U"Time (s)", U"0.5")
+	OK2
 DO
 	LOOP {
 		iam (AnyTier);
-		AnyTier_removePointNear (me, GET_REAL (L"Time"));
+		AnyTier_removePointNear (me, GET_REAL (U"Time"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
-FORM (TimeTier_removePointsBetween, L"Remove points", L"AnyTier: Remove points between...")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"1.0")
-	OK
+FORM (TimeTier_removePointsBetween, U"Remove points", U"AnyTier: Remove points between...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"1.0")
+	OK2
 DO
 	LOOP {
 		iam (AnyTier);
-		AnyTier_removePointsBetween (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"));
+		AnyTier_removePointsBetween (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"));
 		praat_dataChanged (me);
 	}
-END
+END2 }
 
 /***** TRANSITION *****/
 
-DIRECT (Transition_conflate)
+DIRECT2 (Transition_conflate) {
 	LOOP {
 		iam (Transition);
 		autoDistributions thee = Transition_to_Distributions_conflate (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-FORM (Transition_drawAsNumbers, L"Draw as numbers", 0)
-	RADIO (L"Format", 1)
-	RADIOBUTTON (L"decimal")
-	RADIOBUTTON (L"exponential")
-	RADIOBUTTON (L"free")
-	RADIOBUTTON (L"rational")
-	NATURAL (L"Precision", L"2")
-	OK
+FORM (Transition_drawAsNumbers, U"Draw as numbers", 0) {
+	RADIO (U"Format", 1)
+		RADIOBUTTON (U"decimal")
+		RADIOBUTTON (U"exponential")
+		RADIOBUTTON (U"free")
+		RADIOBUTTON (U"rational")
+	NATURAL (U"Precision", U"2")
+	OK2
 DO
 	LOOP {
 		iam (Transition);
 		autoPraatPicture picture;
-		Transition_drawAsNumbers (me, GRAPHICS, GET_INTEGER (L"Format"), GET_INTEGER (L"Precision"));
+		Transition_drawAsNumbers (me, GRAPHICS, GET_INTEGER (U"Format"), GET_INTEGER (U"Precision"));
 	}
-END
+END2 }
 
-DIRECT (Transition_eigen)
+DIRECT2 (Transition_eigen) {
 	LOOP {
 		iam (Transition);
 		Matrix vec_, val_;
 		Transition_eigen (me, & vec_, & val_);
 		autoMatrix vec = vec_;
 		autoMatrix val = val_;
-		praat_new (vec.transfer(), L"eigenvectors");
-		praat_new (val.transfer(), L"eigenvalues");
+		praat_new (vec.transfer(), U"eigenvectors");
+		praat_new (val.transfer(), U"eigenvalues");
 	}
-END
+END2 }
 
-DIRECT (Transition_help) Melder_help (L"Transition"); END
+DIRECT2 (Transition_help) {
+	Melder_help (U"Transition");
+END2 }
 
-FORM (Transition_power, L"Transition: Power...", 0)
-	NATURAL (L"Power", L"2")
-	OK
+FORM (Transition_power, U"Transition: Power...", 0) {
+	NATURAL (U"Power", U"2")
+	OK2
 DO
 	LOOP {
 		iam (Transition);
-		autoTransition thee = Transition_power (me, GET_INTEGER (L"Power"));
+		autoTransition thee = Transition_power (me, GET_INTEGER (U"Power"));
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
-DIRECT (Transition_to_Matrix)
+DIRECT2 (Transition_to_Matrix) {
 	LOOP {
 		iam (Transition);
 		autoMatrix thee = Transition_to_Matrix (me);
 		praat_new (thee.transfer(), my name);
 	}
-END
+END2 }
 
 /***** Praat menu *****/
 
-FORM (Praat_test, L"Praat test", 0)
-	OPTIONMENU_ENUM (L"Test", kPraatTests, DEFAULT)
-	SENTENCE (L"arg1", L"1000000")
-	SENTENCE (L"arg2", L"")
-	SENTENCE (L"arg3", L"")
-	SENTENCE (L"arg4", L"")
-	OK
+FORM (Praat_test, U"Praat test", 0) {
+	OPTIONMENU_ENUM (U"Test", kPraatTests, DEFAULT)
+	SENTENCE (U"arg1", U"1000000")
+	SENTENCE (U"arg2", U"")
+	SENTENCE (U"arg3", U"")
+	SENTENCE (U"arg4", U"")
+	OK2
 DO
-	Praat_tests (GET_ENUM (kPraatTests, L"Test"), GET_STRING (L"arg1"),
-		GET_STRING (L"arg2"), GET_STRING (L"arg3"), GET_STRING (L"arg4"));
-END
+	Praat_tests (GET_ENUM (kPraatTests, U"Test"), GET_STRING (U"arg1"),
+		GET_STRING (U"arg2"), GET_STRING (U"arg3"), GET_STRING (U"arg4"));
+END2 }
 
 /***** Help menu *****/
 
-DIRECT (ObjectWindow) Melder_help (L"Object window"); END
-DIRECT (Intro) Melder_help (L"Intro"); END
-DIRECT (WhatsNew) Melder_help (L"What's new?"); END
-DIRECT (TypesOfObjects) Melder_help (L"Types of objects"); END
-DIRECT (Editors) Melder_help (L"Editors"); END
-DIRECT (FrequentlyAskedQuestions) Melder_help (L"FAQ (Frequently Asked Questions)"); END
-DIRECT (Acknowledgments) Melder_help (L"Acknowledgments"); END
-DIRECT (FormulasTutorial) Melder_help (L"Formulas"); END
-DIRECT (ScriptingTutorial) Melder_help (L"Scripting"); END
-DIRECT (DemoWindow) Melder_help (L"Demo window"); END
-DIRECT (Programming) Melder_help (L"Programming with Praat"); END
+DIRECT (ObjectWindow) Melder_help (U"Object window"); END
+DIRECT (Intro) Melder_help (U"Intro"); END
+DIRECT (WhatsNew) Melder_help (U"What's new?"); END
+DIRECT (TypesOfObjects) Melder_help (U"Types of objects"); END
+DIRECT (Editors) Melder_help (U"Editors"); END
+DIRECT (FrequentlyAskedQuestions) Melder_help (U"FAQ (Frequently Asked Questions)"); END
+DIRECT (Acknowledgments) Melder_help (U"Acknowledgments"); END
+DIRECT (FormulasTutorial) Melder_help (U"Formulas"); END
+DIRECT (ScriptingTutorial) Melder_help (U"Scripting"); END
+DIRECT (DemoWindow) Melder_help (U"Demo window"); END
+DIRECT (Programming) Melder_help (U"Programming with Praat"); END
 DIRECT (SearchManual) Melder_search (); END
 
 /***** file recognizers *****/
@@ -6264,19 +6310,18 @@ static Any chronologicalTextGridTextFileRecognizer (int nread, const char *heade
 	return NULL;
 }
 
-static Any imageFileRecognizer (int nread, const char *header, MelderFile file) {
-	const wchar_t *fileName = MelderFile_name (file);
-	(void) header;
-	if (Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".jpg") ||
-	    Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".JPG") ||
-	    Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".jpeg") ||
-		Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".JPEG") ||
-	    Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".png") ||
-		Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".PNG") ||
-	    Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".tiff") ||
-		Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".TIFF") ||
-		Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".tif") ||
-		Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".TIF"))
+static Any imageFileRecognizer (int /* nread */, const char * /* header */, MelderFile file) {
+	const char32 *fileName = MelderFile_name (file);
+	if (Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".jpg") ||
+	    Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".JPG") ||
+	    Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".jpeg") ||
+		Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".JPEG") ||
+	    Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".png") ||
+		Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".PNG") ||
+	    Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".tiff") ||
+		Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".TIFF") ||
+		Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".tif") ||
+		Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".TIF"))
 	{
 		return Photo_readFromImageFile (file);
 	}
@@ -6289,56 +6334,56 @@ void praat_TableOfReal_init (ClassInfo klas);   // Buttons for TableOfReal and f
 
 void praat_TimeFunction_query_init (ClassInfo klas);   // Query buttons for time-based subclasses of Function.
 void praat_TimeFunction_query_init (ClassInfo klas) {
-	praat_addAction1 (klas, 1, L"Query time domain", 0, 1, 0);
-	praat_addAction1 (klas, 1, L"Get start time", 0, 2, DO_TimeFunction_getStartTime);
-						praat_addAction1 (klas, 1, L"Get starting time", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFunction_getStartTime);
-	praat_addAction1 (klas, 1, L"Get end time", 0, 2, DO_TimeFunction_getEndTime);
-						praat_addAction1 (klas, 1, L"Get finishing time", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFunction_getEndTime);
-	praat_addAction1 (klas, 1, L"Get total duration", 0, 2, DO_TimeFunction_getDuration);
-						praat_addAction1 (klas, 1, L"Get duration", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFunction_getDuration);
+	praat_addAction1 (klas, 1, U"Query time domain", 0, 1, 0);
+	praat_addAction1 (klas, 1, U"Get start time", 0, 2, DO_TimeFunction_getStartTime);
+						praat_addAction1 (klas, 1, U"Get starting time", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFunction_getStartTime);
+	praat_addAction1 (klas, 1, U"Get end time", 0, 2, DO_TimeFunction_getEndTime);
+						praat_addAction1 (klas, 1, U"Get finishing time", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFunction_getEndTime);
+	praat_addAction1 (klas, 1, U"Get total duration", 0, 2, DO_TimeFunction_getDuration);
+						praat_addAction1 (klas, 1, U"Get duration", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFunction_getDuration);
 }
 
 void praat_TimeFunction_modify_init (ClassInfo klas);   // Modify buttons for time-based subclasses of Function.
 void praat_TimeFunction_modify_init (ClassInfo klas) {
-	praat_addAction1 (klas, 0, L"Modify times", 0, 1, 0);
-	praat_addAction1 (klas, 0, L"Shift times by...", 0, 2, DO_TimeFunction_shiftTimesBy);
-	praat_addAction1 (klas, 0, L"Shift times to...", 0, 2, DO_TimeFunction_shiftTimesTo);
-						praat_addAction1 (klas, 0, L"Shift to zero", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFunction_shiftToZero);   // hidden 2008
-	praat_addAction1 (klas, 0, L"Scale times by...", 0, 2, DO_TimeFunction_scaleTimesBy);
-	praat_addAction1 (klas, 0, L"Scale times to...", 0, 2, DO_TimeFunction_scaleTimesTo);
-						praat_addAction1 (klas, 0, L"Scale times...", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFunction_scaleTimesTo);   // hidden 2008
+	praat_addAction1 (klas, 0, U"Modify times", 0, 1, 0);
+	praat_addAction1 (klas, 0, U"Shift times by...", 0, 2, DO_TimeFunction_shiftTimesBy);
+	praat_addAction1 (klas, 0, U"Shift times to...", 0, 2, DO_TimeFunction_shiftTimesTo);
+						praat_addAction1 (klas, 0, U"Shift to zero", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFunction_shiftToZero);   // hidden 2008
+	praat_addAction1 (klas, 0, U"Scale times by...", 0, 2, DO_TimeFunction_scaleTimesBy);
+	praat_addAction1 (klas, 0, U"Scale times to...", 0, 2, DO_TimeFunction_scaleTimesTo);
+						praat_addAction1 (klas, 0, U"Scale times...", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFunction_scaleTimesTo);   // hidden 2008
 }
 
 void praat_TimeFrameSampled_query_init (ClassInfo klas);   // Query buttons for frame-based time-based subclasses of Sampled.
 void praat_TimeFrameSampled_query_init (ClassInfo klas) {
 	praat_TimeFunction_query_init (klas);
-	praat_addAction1 (klas, 1, L"Query time sampling", 0, 1, 0);
-	praat_addAction1 (klas, 1, L"Get number of frames", 0, 2, DO_TimeFrameSampled_getNumberOfFrames);
-	praat_addAction1 (klas, 1, L"Get time step", 0, 2, DO_TimeFrameSampled_getFrameLength);
-						praat_addAction1 (klas, 1, L"Get frame length", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFrameSampled_getFrameLength);
-						praat_addAction1 (klas, 1, L"Get frame duration", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFrameSampled_getFrameLength);
-	praat_addAction1 (klas, 1, L"Get time from frame number...", 0, 2, DO_TimeFrameSampled_getTimeFromFrame);
-						praat_addAction1 (klas, 1, L"Get time from frame...", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFrameSampled_getTimeFromFrame);
-	praat_addAction1 (klas, 1, L"Get frame number from time...", 0, 2, DO_TimeFrameSampled_getFrameFromTime);
-						praat_addAction1 (klas, 1, L"Get frame from time...", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFrameSampled_getFrameFromTime);
+	praat_addAction1 (klas, 1, U"Query time sampling", 0, 1, 0);
+	praat_addAction1 (klas, 1, U"Get number of frames", 0, 2, DO_TimeFrameSampled_getNumberOfFrames);
+	praat_addAction1 (klas, 1, U"Get time step", 0, 2, DO_TimeFrameSampled_getFrameLength);
+						praat_addAction1 (klas, 1, U"Get frame length", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFrameSampled_getFrameLength);
+						praat_addAction1 (klas, 1, U"Get frame duration", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFrameSampled_getFrameLength);
+	praat_addAction1 (klas, 1, U"Get time from frame number...", 0, 2, DO_TimeFrameSampled_getTimeFromFrame);
+						praat_addAction1 (klas, 1, U"Get time from frame...", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFrameSampled_getTimeFromFrame);
+	praat_addAction1 (klas, 1, U"Get frame number from time...", 0, 2, DO_TimeFrameSampled_getFrameFromTime);
+						praat_addAction1 (klas, 1, U"Get frame from time...", 0, praat_HIDDEN + praat_DEPTH_2, DO_TimeFrameSampled_getFrameFromTime);
 }
 
 void praat_TimeTier_query_init (ClassInfo klas);   // Query buttons for time-based subclasses of AnyTier.
 void praat_TimeTier_query_init (ClassInfo klas) {
 	praat_TimeFunction_query_init (klas);
-	praat_addAction1 (klas, 1, L"Get number of points", 0, 1, DO_TimeTier_getNumberOfPoints);
-	praat_addAction1 (klas, 1, L"Get low index from time...", 0, 1, DO_TimeTier_getLowIndexFromTime);
-	praat_addAction1 (klas, 1, L"Get high index from time...", 0, 1, DO_TimeTier_getHighIndexFromTime);
-	praat_addAction1 (klas, 1, L"Get nearest index from time...", 0, 1, DO_TimeTier_getNearestIndexFromTime);
-	praat_addAction1 (klas, 1, L"Get time from index...", 0, 1, DO_TimeTier_getTimeFromIndex);
+	praat_addAction1 (klas, 1, U"Get number of points", 0, 1, DO_TimeTier_getNumberOfPoints);
+	praat_addAction1 (klas, 1, U"Get low index from time...", 0, 1, DO_TimeTier_getLowIndexFromTime);
+	praat_addAction1 (klas, 1, U"Get high index from time...", 0, 1, DO_TimeTier_getHighIndexFromTime);
+	praat_addAction1 (klas, 1, U"Get nearest index from time...", 0, 1, DO_TimeTier_getNearestIndexFromTime);
+	praat_addAction1 (klas, 1, U"Get time from index...", 0, 1, DO_TimeTier_getTimeFromIndex);
 }
 
 void praat_TimeTier_modify_init (ClassInfo klas);   // Modification buttons for time-based subclasses of AnyTier.
 void praat_TimeTier_modify_init (ClassInfo klas) {
 	praat_TimeFunction_modify_init (klas);
-	praat_addAction1 (klas, 0, L"Remove point...", 0, 1, DO_TimeTier_removePoint);
-	praat_addAction1 (klas, 0, L"Remove point near...", 0, 1, DO_TimeTier_removePointNear);
-	praat_addAction1 (klas, 0, L"Remove points between...", 0, 1, DO_TimeTier_removePointsBetween);
+	praat_addAction1 (klas, 0, U"Remove point...", 0, 1, DO_TimeTier_removePoint);
+	praat_addAction1 (klas, 0, U"Remove point near...", 0, 1, DO_TimeTier_removePointNear);
+	praat_addAction1 (klas, 0, U"Remove points between...", 0, 1, DO_TimeTier_removePointsBetween);
 }
 
 void praat_uvafon_init ();
@@ -6354,9 +6399,9 @@ void praat_uvafon_init () {
 		classIntervalTier, classTextGrid, classLongSound, classWordList, classSpellingChecker,
 		classMovie, classCorpus, classPhoto,
 		NULL);
-	Thing_recognizeClassByOtherName (classManipulation, L"Psola");
-	Thing_recognizeClassByOtherName (classManipulation, L"Analysis");
-	Thing_recognizeClassByOtherName (classPitchTier, L"StylPitch");
+	Thing_recognizeClassByOtherName (classManipulation, U"Psola");
+	Thing_recognizeClassByOtherName (classManipulation, U"Analysis");
+	Thing_recognizeClassByOtherName (classPitchTier, U"StylPitch");
 
 	Data_recognizeFileType (cgnSyntaxFileRecognizer);
 	Data_recognizeFileType (chronologicalTextGridTextFileRecognizer);
@@ -6369,790 +6414,790 @@ void praat_uvafon_init () {
 	INCLUDE_LIBRARY (praat_uvafon_Sound_init)
 	INCLUDE_LIBRARY (praat_uvafon_TextGrid_init)
 
-	praat_addMenuCommand (L"Objects", L"Technical", L"Praat test...", 0, 0, DO_Praat_test);
-
-	praat_addMenuCommand (L"Objects", L"New", L"-- new numerics --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Matrix", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Matrix...", 0, 1, DO_Matrix_create);
-		praat_addMenuCommand (L"Objects", L"New", L"Create simple Matrix...", 0, 1, DO_Matrix_createSimple);
-		praat_addMenuCommand (L"Objects", L"New", L"-- colour matrix --", 0, 1, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Photo...", 0, 1, DO_Photo_create);
-		praat_addMenuCommand (L"Objects", L"New", L"Create simple Photo...", 0, 1, DO_Photo_createSimple);
-	praat_addMenuCommand (L"Objects", L"Open", L"-- read movie --", 0, praat_HIDDEN, 0);
-	praat_addMenuCommand (L"Objects", L"Open", L"Open movie file...", 0, praat_HIDDEN, DO_Movie_openFromSoundFile);
-	praat_addMenuCommand (L"Objects", L"Open", L"-- read raw --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read Matrix from raw text file...", 0, 0, DO_Matrix_readFromRawTextFile);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read Matrix from LVS AP file...", 0, praat_HIDDEN, DO_Matrix_readAP);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read Strings from raw text file...", 0, 0, DO_Strings_readFromRawTextFile);
+	praat_addMenuCommand (U"Objects", U"Technical", U"Praat test...", 0, 0, DO_Praat_test);
+
+	praat_addMenuCommand (U"Objects", U"New", U"-- new numerics --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Matrix", 0, 0, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Matrix...", 0, 1, DO_Matrix_create);
+		praat_addMenuCommand (U"Objects", U"New", U"Create simple Matrix...", 0, 1, DO_Matrix_createSimple);
+		praat_addMenuCommand (U"Objects", U"New", U"-- colour matrix --", 0, 1, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Photo...", 0, 1, DO_Photo_create);
+		praat_addMenuCommand (U"Objects", U"New", U"Create simple Photo...", 0, 1, DO_Photo_createSimple);
+	praat_addMenuCommand (U"Objects", U"Open", U"-- read movie --", 0, praat_HIDDEN, 0);
+	praat_addMenuCommand (U"Objects", U"Open", U"Open movie file...", 0, praat_HIDDEN, DO_Movie_openFromSoundFile);
+	praat_addMenuCommand (U"Objects", U"Open", U"-- read raw --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read Matrix from raw text file...", 0, 0, DO_Matrix_readFromRawTextFile);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read Matrix from LVS AP file...", 0, praat_HIDDEN, DO_Matrix_readAP);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read Strings from raw text file...", 0, 0, DO_Strings_readFromRawTextFile);
 
 	INCLUDE_LIBRARY (praat_uvafon_stat_init)
 
-	praat_addMenuCommand (L"Objects", L"New", L"Tiers", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"Create empty PointProcess...", 0, 1, DO_PointProcess_createEmpty);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Poisson process...", 0, 1, DO_PointProcess_createPoissonProcess);
-		praat_addMenuCommand (L"Objects", L"New", L"-- new tiers ---", 0, 1, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"Create PitchTier...", 0, 1, DO_PitchTier_create);
-		praat_addMenuCommand (L"Objects", L"New", L"Create FormantGrid...", 0, 1, DO_FormantGrid_create);
-		praat_addMenuCommand (L"Objects", L"New", L"Create FormantTier...", 0, praat_HIDDEN | praat_DEPTH_1, DO_FormantTier_create);
-		praat_addMenuCommand (L"Objects", L"New", L"Create IntensityTier...", 0, 1, DO_IntensityTier_create);
-		praat_addMenuCommand (L"Objects", L"New", L"Create DurationTier...", 0, 1, DO_DurationTier_create);
-		praat_addMenuCommand (L"Objects", L"New", L"Create AmplitudeTier...", 0, 1, DO_AmplitudeTier_create);
-	praat_addMenuCommand (L"Objects", L"New", L"-- new textgrid --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"New", L"Create TextGrid...", 0, 0, DO_TextGrid_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Corpus...", 0, praat_HIDDEN, DO_Corpus_create);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Strings as file list...", 0, 0, DO_Strings_createAsFileList);
-	praat_addMenuCommand (L"Objects", L"New", L"Create Strings as directory list...", 0, 0, DO_Strings_createAsDirectoryList);
-
-	praat_addMenuCommand (L"Objects", L"Open", L"-- read tier --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read from special tier file...", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"Open", L"Read TextTier from Xwaves...", 0, 1, DO_TextTier_readFromXwaves);
-		praat_addMenuCommand (L"Objects", L"Open", L"Read IntervalTier from Xwaves...", 0, 1, DO_IntervalTier_readFromXwaves);
-
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Praat Intro", 0, '?', DO_Intro);
+	praat_addMenuCommand (U"Objects", U"New", U"Tiers", 0, 0, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"Create empty PointProcess...", 0, 1, DO_PointProcess_createEmpty);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Poisson process...", 0, 1, DO_PointProcess_createPoissonProcess);
+		praat_addMenuCommand (U"Objects", U"New", U"-- new tiers ---", 0, 1, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"Create PitchTier...", 0, 1, DO_PitchTier_create);
+		praat_addMenuCommand (U"Objects", U"New", U"Create FormantGrid...", 0, 1, DO_FormantGrid_create);
+		praat_addMenuCommand (U"Objects", U"New", U"Create FormantTier...", 0, praat_HIDDEN | praat_DEPTH_1, DO_FormantTier_create);
+		praat_addMenuCommand (U"Objects", U"New", U"Create IntensityTier...", 0, 1, DO_IntensityTier_create);
+		praat_addMenuCommand (U"Objects", U"New", U"Create DurationTier...", 0, 1, DO_DurationTier_create);
+		praat_addMenuCommand (U"Objects", U"New", U"Create AmplitudeTier...", 0, 1, DO_AmplitudeTier_create);
+	praat_addMenuCommand (U"Objects", U"New", U"-- new textgrid --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Create TextGrid...", 0, 0, DO_TextGrid_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Corpus...", 0, praat_HIDDEN, DO_Corpus_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Strings as file list...", 0, 0, DO_Strings_createAsFileList);
+	praat_addMenuCommand (U"Objects", U"New", U"Create Strings as directory list...", 0, 0, DO_Strings_createAsDirectoryList);
+
+	praat_addMenuCommand (U"Objects", U"Open", U"-- read tier --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read from special tier file...", 0, 0, 0);
+		praat_addMenuCommand (U"Objects", U"Open", U"Read TextTier from Xwaves...", 0, 1, DO_TextTier_readFromXwaves);
+		praat_addMenuCommand (U"Objects", U"Open", U"Read IntervalTier from Xwaves...", 0, 1, DO_IntervalTier_readFromXwaves);
+
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Praat Intro", 0, '?', DO_Intro);
 	#ifndef macintosh
-		praat_addMenuCommand (L"Objects", L"Help", L"Object window", 0, 0, DO_ObjectWindow);
+		praat_addMenuCommand (U"Objects", U"Help", U"Object window", 0, 0, DO_ObjectWindow);
 	#endif
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Frequently asked questions", 0, 0, DO_FrequentlyAskedQuestions);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"What's new?", 0, 0, DO_WhatsNew);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Types of objects", 0, 0, DO_TypesOfObjects);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Editors", 0, 0, DO_Editors);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Acknowledgments", 0, 0, DO_Acknowledgments);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"-- shell help --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Formulas tutorial", 0, 0, DO_FormulasTutorial);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Scripting tutorial", 0, 0, DO_ScriptingTutorial);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Demo window", 0, 0, DO_DemoWindow);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Programming", 0, 0, DO_Programming);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Frequently asked questions", 0, 0, DO_FrequentlyAskedQuestions);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"What's new?", 0, 0, DO_WhatsNew);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Types of objects", 0, 0, DO_TypesOfObjects);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Editors", 0, 0, DO_Editors);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Acknowledgments", 0, 0, DO_Acknowledgments);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"-- shell help --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Formulas tutorial", 0, 0, DO_FormulasTutorial);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Scripting tutorial", 0, 0, DO_ScriptingTutorial);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Demo window", 0, 0, DO_DemoWindow);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Programming", 0, 0, DO_Programming);
 	#ifdef macintosh
-		praat_addMenuCommand (L"Objects", L"Help", L"Praat Intro", 0, '?', DO_Intro);
-		praat_addMenuCommand (L"Objects", L"Help", L"Object window help", 0, 0, DO_ObjectWindow);
-		praat_addMenuCommand (L"Objects", L"Help", L"-- manual --", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"Help", L"Search Praat manual...", 0, 'M', DO_SearchManual);
+		praat_addMenuCommand (U"Objects", U"Help", U"Praat Intro", 0, '?', DO_Intro);
+		praat_addMenuCommand (U"Objects", U"Help", U"Object window help", 0, 0, DO_ObjectWindow);
+		praat_addMenuCommand (U"Objects", U"Help", U"-- manual --", 0, 0, 0);
+		praat_addMenuCommand (U"Objects", U"Help", U"Search Praat manual...", 0, 'M', DO_SearchManual);
 	#endif
 
-	praat_addAction1 (classAmplitudeTier, 0, L"AmplitudeTier help", 0, 0, DO_AmplitudeTier_help);
-	praat_addAction1 (classAmplitudeTier, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_AmplitudeTier_edit);
-	praat_addAction1 (classAmplitudeTier, 1, L"Edit", 0, praat_HIDDEN, DO_AmplitudeTier_edit);
-	praat_addAction1 (classAmplitudeTier, 0, L"View & Edit with Sound?", 0, 0, DO_info_AmplitudeTier_Sound_edit);
-	praat_addAction1 (classAmplitudeTier, 0, L"Query -", 0, 0, 0);
+	praat_addAction1 (classAmplitudeTier, 0, U"AmplitudeTier help", 0, 0, DO_AmplitudeTier_help);
+	praat_addAction1 (classAmplitudeTier, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_AmplitudeTier_edit);
+	praat_addAction1 (classAmplitudeTier, 1, U"Edit", 0, praat_HIDDEN, DO_AmplitudeTier_edit);
+	praat_addAction1 (classAmplitudeTier, 0, U"View & Edit with Sound?", 0, 0, DO_info_AmplitudeTier_Sound_edit);
+	praat_addAction1 (classAmplitudeTier, 0, U"Query -", 0, 0, 0);
 		praat_TimeTier_query_init (classAmplitudeTier);
-		praat_addAction1 (classAmplitudeTier, 1, L"Get shimmer (local)...", 0, 1, DO_AmplitudeTier_getShimmer_local);
-		praat_addAction1 (classAmplitudeTier, 1, L"Get shimmer (local_dB)...", 0, 1, DO_AmplitudeTier_getShimmer_local_dB);
-		praat_addAction1 (classAmplitudeTier, 1, L"Get shimmer (apq3)...", 0, 1, DO_AmplitudeTier_getShimmer_apq3);
-		praat_addAction1 (classAmplitudeTier, 1, L"Get shimmer (apq5)...", 0, 1, DO_AmplitudeTier_getShimmer_apq5);
-		praat_addAction1 (classAmplitudeTier, 1, L"Get shimmer (apq11)...", 0, 1, DO_AmplitudeTier_getShimmer_apq11);
-		praat_addAction1 (classAmplitudeTier, 1, L"Get shimmer (dda)...", 0, 1, DO_AmplitudeTier_getShimmer_dda);
-	praat_addAction1 (classAmplitudeTier, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classAmplitudeTier, 1, U"Get shimmer (local)...", 0, 1, DO_AmplitudeTier_getShimmer_local);
+		praat_addAction1 (classAmplitudeTier, 1, U"Get shimmer (local_dB)...", 0, 1, DO_AmplitudeTier_getShimmer_local_dB);
+		praat_addAction1 (classAmplitudeTier, 1, U"Get shimmer (apq3)...", 0, 1, DO_AmplitudeTier_getShimmer_apq3);
+		praat_addAction1 (classAmplitudeTier, 1, U"Get shimmer (apq5)...", 0, 1, DO_AmplitudeTier_getShimmer_apq5);
+		praat_addAction1 (classAmplitudeTier, 1, U"Get shimmer (apq11)...", 0, 1, DO_AmplitudeTier_getShimmer_apq11);
+		praat_addAction1 (classAmplitudeTier, 1, U"Get shimmer (dda)...", 0, 1, DO_AmplitudeTier_getShimmer_dda);
+	praat_addAction1 (classAmplitudeTier, 0, U"Modify -", 0, 0, 0);
 		praat_TimeTier_modify_init (classAmplitudeTier);
-		praat_addAction1 (classAmplitudeTier, 0, L"Add point...", 0, 1, DO_AmplitudeTier_addPoint);
-		praat_addAction1 (classAmplitudeTier, 0, L"Formula...", 0, 1, DO_AmplitudeTier_formula);
-praat_addAction1 (classAmplitudeTier, 0, L"Synthesize", 0, 0, 0);
-	praat_addAction1 (classAmplitudeTier, 0, L"To Sound (pulse train)...", 0, 0, DO_AmplitudeTier_to_Sound);
-praat_addAction1 (classAmplitudeTier, 0, L"Convert", 0, 0, 0);
-	praat_addAction1 (classAmplitudeTier, 0, L"To IntensityTier...", 0, 0, DO_AmplitudeTier_to_IntensityTier);
-	praat_addAction1 (classAmplitudeTier, 0, L"Down to PointProcess", 0, 0, DO_AmplitudeTier_downto_PointProcess);
-	praat_addAction1 (classAmplitudeTier, 0, L"Down to TableOfReal", 0, 0, DO_AmplitudeTier_downto_TableOfReal);
-
-	praat_addAction1 (classCochleagram, 0, L"Cochleagram help", 0, 0, DO_Cochleagram_help);
-	praat_addAction1 (classCochleagram, 1, L"Movie", 0, 0, DO_Cochleagram_movie);
-praat_addAction1 (classCochleagram, 0, L"Info", 0, 0, 0);
-	praat_addAction1 (classCochleagram, 2, L"Difference...", 0, 0, DO_Cochleagram_difference);
-praat_addAction1 (classCochleagram, 0, L"Draw", 0, 0, 0);
-	praat_addAction1 (classCochleagram, 0, L"Paint...", 0, 0, DO_Cochleagram_paint);
-praat_addAction1 (classCochleagram, 0, L"Modify", 0, 0, 0);
-	praat_addAction1 (classCochleagram, 0, L"Formula...", 0, 0, DO_Cochleagram_formula);
-praat_addAction1 (classCochleagram, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classCochleagram, 0, L"To Excitation (slice)...", 0, 0, DO_Cochleagram_to_Excitation);
-praat_addAction1 (classCochleagram, 0, L"Hack", 0, 0, 0);
-	praat_addAction1 (classCochleagram, 0, L"To Matrix", 0, 0, DO_Cochleagram_to_Matrix);
-
-	praat_addAction1 (classCorpus, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_Corpus_edit);
-
-praat_addAction1 (classDistributions, 0, L"Learn", 0, 0, 0);
-	praat_addAction1 (classDistributions, 1, L"To Transition...", 0, 0, DO_Distributions_to_Transition);
-	praat_addAction1 (classDistributions, 2, L"To Transition (noise)...", 0, 0, DO_Distributions_to_Transition_noise);
-
-	praat_addAction1 (classDurationTier, 0, L"DurationTier help", 0, 0, DO_DurationTier_help);
-	praat_addAction1 (classDurationTier, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_DurationTier_edit);
-	praat_addAction1 (classDurationTier, 1, L"Edit", 0, praat_HIDDEN, DO_DurationTier_edit);
-	praat_addAction1 (classDurationTier, 0, L"View & Edit with Sound?", 0, 0, DO_info_DurationTier_Sound_edit);
-	praat_addAction1 (classDurationTier, 0, L"& Manipulation: Replace?", 0, 0, DO_info_DurationTier_Manipulation_replace);
-	praat_addAction1 (classDurationTier, 0, L"Query -", 0, 0, 0);
+		praat_addAction1 (classAmplitudeTier, 0, U"Add point...", 0, 1, DO_AmplitudeTier_addPoint);
+		praat_addAction1 (classAmplitudeTier, 0, U"Formula...", 0, 1, DO_AmplitudeTier_formula);
+praat_addAction1 (classAmplitudeTier, 0, U"Synthesize", 0, 0, 0);
+	praat_addAction1 (classAmplitudeTier, 0, U"To Sound (pulse train)...", 0, 0, DO_AmplitudeTier_to_Sound);
+praat_addAction1 (classAmplitudeTier, 0, U"Convert", 0, 0, 0);
+	praat_addAction1 (classAmplitudeTier, 0, U"To IntensityTier...", 0, 0, DO_AmplitudeTier_to_IntensityTier);
+	praat_addAction1 (classAmplitudeTier, 0, U"Down to PointProcess", 0, 0, DO_AmplitudeTier_downto_PointProcess);
+	praat_addAction1 (classAmplitudeTier, 0, U"Down to TableOfReal", 0, 0, DO_AmplitudeTier_downto_TableOfReal);
+
+	praat_addAction1 (classCochleagram, 0, U"Cochleagram help", 0, 0, DO_Cochleagram_help);
+	praat_addAction1 (classCochleagram, 1, U"Movie", 0, 0, DO_Cochleagram_movie);
+praat_addAction1 (classCochleagram, 0, U"Info", 0, 0, 0);
+	praat_addAction1 (classCochleagram, 2, U"Difference...", 0, 0, DO_Cochleagram_difference);
+praat_addAction1 (classCochleagram, 0, U"Draw", 0, 0, 0);
+	praat_addAction1 (classCochleagram, 0, U"Paint...", 0, 0, DO_Cochleagram_paint);
+praat_addAction1 (classCochleagram, 0, U"Modify", 0, 0, 0);
+	praat_addAction1 (classCochleagram, 0, U"Formula...", 0, 0, DO_Cochleagram_formula);
+praat_addAction1 (classCochleagram, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classCochleagram, 0, U"To Excitation (slice)...", 0, 0, DO_Cochleagram_to_Excitation);
+praat_addAction1 (classCochleagram, 0, U"Hack", 0, 0, 0);
+	praat_addAction1 (classCochleagram, 0, U"To Matrix", 0, 0, DO_Cochleagram_to_Matrix);
+
+	praat_addAction1 (classCorpus, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_Corpus_edit);
+
+praat_addAction1 (classDistributions, 0, U"Learn", 0, 0, 0);
+	praat_addAction1 (classDistributions, 1, U"To Transition...", 0, 0, DO_Distributions_to_Transition);
+	praat_addAction1 (classDistributions, 2, U"To Transition (noise)...", 0, 0, DO_Distributions_to_Transition_noise);
+
+	praat_addAction1 (classDurationTier, 0, U"DurationTier help", 0, 0, DO_DurationTier_help);
+	praat_addAction1 (classDurationTier, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_DurationTier_edit);
+	praat_addAction1 (classDurationTier, 1, U"Edit", 0, praat_HIDDEN, DO_DurationTier_edit);
+	praat_addAction1 (classDurationTier, 0, U"View & Edit with Sound?", 0, 0, DO_info_DurationTier_Sound_edit);
+	praat_addAction1 (classDurationTier, 0, U"& Manipulation: Replace?", 0, 0, DO_info_DurationTier_Manipulation_replace);
+	praat_addAction1 (classDurationTier, 0, U"Query -", 0, 0, 0);
 		praat_TimeTier_query_init (classDurationTier);
-		praat_addAction1 (classDurationTier, 1, L"-- get content --", 0, 1, 0);
-		praat_addAction1 (classDurationTier, 1, L"Get value at time...", 0, 1, DO_DurationTier_getValueAtTime);
-		praat_addAction1 (classDurationTier, 1, L"Get value at index...", 0, 1, DO_DurationTier_getValueAtIndex);
-		praat_addAction1 (classDurationTier, 1, L"Get target duration...", 0, 1, DO_DurationTier_getTargetDuration);
-	praat_addAction1 (classDurationTier, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classDurationTier, 1, U"-- get content --", 0, 1, 0);
+		praat_addAction1 (classDurationTier, 1, U"Get value at time...", 0, 1, DO_DurationTier_getValueAtTime);
+		praat_addAction1 (classDurationTier, 1, U"Get value at index...", 0, 1, DO_DurationTier_getValueAtIndex);
+		praat_addAction1 (classDurationTier, 1, U"Get target duration...", 0, 1, DO_DurationTier_getTargetDuration);
+	praat_addAction1 (classDurationTier, 0, U"Modify -", 0, 0, 0);
 		praat_TimeTier_modify_init (classDurationTier);
-		praat_addAction1 (classDurationTier, 0, L"Add point...", 0, 1, DO_DurationTier_addPoint);
-		praat_addAction1 (classDurationTier, 0, L"Formula...", 0, 1, DO_DurationTier_formula);
-praat_addAction1 (classDurationTier, 0, L"Convert", 0, 0, 0);
-	praat_addAction1 (classDurationTier, 0, L"Down to PointProcess", 0, 0, DO_DurationTier_downto_PointProcess);
-
-	praat_addAction1 (classExcitation, 0, L"Excitation help", 0, 0, DO_Excitation_help);
-praat_addAction1 (classExcitation, 0, L"Draw", 0, 0, 0);
-	praat_addAction1 (classExcitation, 0, L"Draw...", 0, 0, DO_Excitation_draw);
-praat_addAction1 (classExcitation, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classExcitation, 0, L"To Formant...", 0, 0, DO_Excitation_to_Formant);
-praat_addAction1 (classExcitation, 1, L"Query -", 0, 0, 0);
-	praat_addAction1 (classExcitation, 1, L"Get loudness", 0, 0, DO_Excitation_getLoudness);
-praat_addAction1 (classExcitation, 0, L"Modify", 0, 0, 0);
-	praat_addAction1 (classExcitation, 0, L"Formula...", 0, 0, DO_Excitation_formula);
-praat_addAction1 (classExcitation, 0, L"Hack", 0, 0, 0);
-	praat_addAction1 (classExcitation, 0, L"To Matrix", 0, 0, DO_Excitation_to_Matrix);
-
-	praat_addAction1 (classFormant, 0, L"Formant help", 0, 0, DO_Formant_help);
-	praat_addAction1 (classFormant, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classFormant, 0, L"Speckle...", 0, 1, DO_Formant_drawSpeckles);
-		praat_addAction1 (classFormant, 0, L"Draw tracks...", 0, 1, DO_Formant_drawTracks);
-		praat_addAction1 (classFormant, 0, L"Scatter plot...", 0, 1, DO_Formant_scatterPlot);
-	praat_addAction1 (classFormant, 0, L"Tabulate -", 0, 0, 0);
-		praat_addAction1 (classFormant, 1, L"List...", 0, 1, DO_Formant_list);
-		praat_addAction1 (classFormant, 0, L"Down to Table...", 0, 1, DO_Formant_downto_Table);
-	praat_addAction1 (classFormant, 0, L"Query -", 0, 0, 0);
+		praat_addAction1 (classDurationTier, 0, U"Add point...", 0, 1, DO_DurationTier_addPoint);
+		praat_addAction1 (classDurationTier, 0, U"Formula...", 0, 1, DO_DurationTier_formula);
+praat_addAction1 (classDurationTier, 0, U"Convert", 0, 0, 0);
+	praat_addAction1 (classDurationTier, 0, U"Down to PointProcess", 0, 0, DO_DurationTier_downto_PointProcess);
+
+	praat_addAction1 (classExcitation, 0, U"Excitation help", 0, 0, DO_Excitation_help);
+praat_addAction1 (classExcitation, 0, U"Draw", 0, 0, 0);
+	praat_addAction1 (classExcitation, 0, U"Draw...", 0, 0, DO_Excitation_draw);
+praat_addAction1 (classExcitation, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classExcitation, 0, U"To Formant...", 0, 0, DO_Excitation_to_Formant);
+praat_addAction1 (classExcitation, 1, U"Query -", 0, 0, 0);
+	praat_addAction1 (classExcitation, 1, U"Get loudness", 0, 0, DO_Excitation_getLoudness);
+praat_addAction1 (classExcitation, 0, U"Modify", 0, 0, 0);
+	praat_addAction1 (classExcitation, 0, U"Formula...", 0, 0, DO_Excitation_formula);
+praat_addAction1 (classExcitation, 0, U"Hack", 0, 0, 0);
+	praat_addAction1 (classExcitation, 0, U"To Matrix", 0, 0, DO_Excitation_to_Matrix);
+
+	praat_addAction1 (classFormant, 0, U"Formant help", 0, 0, DO_Formant_help);
+	praat_addAction1 (classFormant, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classFormant, 0, U"Speckle...", 0, 1, DO_Formant_drawSpeckles);
+		praat_addAction1 (classFormant, 0, U"Draw tracks...", 0, 1, DO_Formant_drawTracks);
+		praat_addAction1 (classFormant, 0, U"Scatter plot...", 0, 1, DO_Formant_scatterPlot);
+	praat_addAction1 (classFormant, 0, U"Tabulate -", 0, 0, 0);
+		praat_addAction1 (classFormant, 1, U"List...", 0, 1, DO_Formant_list);
+		praat_addAction1 (classFormant, 0, U"Down to Table...", 0, 1, DO_Formant_downto_Table);
+	praat_addAction1 (classFormant, 0, U"Query -", 0, 0, 0);
 		praat_TimeFrameSampled_query_init (classFormant);
-		praat_addAction1 (classFormant, 1, L"Get number of formants...", 0, 1, DO_Formant_getNumberOfFormants);
-		praat_addAction1 (classFormant, 1, L"Get minimum number of formants", 0, 1, DO_Formant_getMinimumNumberOfFormants);
-		praat_addAction1 (classFormant, 1, L"Get maximum number of formants", 0, 1, DO_Formant_getMaximumNumberOfFormants);
-		praat_addAction1 (classFormant, 1, L"-- get value --", 0, 1, 0);
-		praat_addAction1 (classFormant, 1, L"Get value at time...", 0, 1, DO_Formant_getValueAtTime);
-		praat_addAction1 (classFormant, 1, L"Get bandwidth at time...", 0, 1, DO_Formant_getBandwidthAtTime);
-		praat_addAction1 (classFormant, 1, L"-- get extreme --", 0, 1, 0);
-		praat_addAction1 (classFormant, 1, L"Get minimum...", 0, 1, DO_Formant_getMinimum);
-		praat_addAction1 (classFormant, 1, L"Get time of minimum...", 0, 1, DO_Formant_getTimeOfMinimum);
-		praat_addAction1 (classFormant, 1, L"Get maximum...", 0, 1, DO_Formant_getMaximum);
-		praat_addAction1 (classFormant, 1, L"Get time of maximum...", 0, 1, DO_Formant_getTimeOfMaximum);
-		praat_addAction1 (classFormant, 1, L"-- get distribution --", 0, 1, 0);
-		praat_addAction1 (classFormant, 1, L"Get quantile...", 0, 1, DO_Formant_getQuantile);
-		praat_addAction1 (classFormant, 1, L"Get quantile of bandwidth...", 0, 1, DO_Formant_getQuantileOfBandwidth);
-		praat_addAction1 (classFormant, 1, L"Get mean...", 0, 1, DO_Formant_getMean);
-		praat_addAction1 (classFormant, 1, L"Get standard deviation...", 0, 1, DO_Formant_getStandardDeviation);
-	praat_addAction1 (classFormant, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classFormant, 1, U"Get number of formants...", 0, 1, DO_Formant_getNumberOfFormants);
+		praat_addAction1 (classFormant, 1, U"Get minimum number of formants", 0, 1, DO_Formant_getMinimumNumberOfFormants);
+		praat_addAction1 (classFormant, 1, U"Get maximum number of formants", 0, 1, DO_Formant_getMaximumNumberOfFormants);
+		praat_addAction1 (classFormant, 1, U"-- get value --", 0, 1, 0);
+		praat_addAction1 (classFormant, 1, U"Get value at time...", 0, 1, DO_Formant_getValueAtTime);
+		praat_addAction1 (classFormant, 1, U"Get bandwidth at time...", 0, 1, DO_Formant_getBandwidthAtTime);
+		praat_addAction1 (classFormant, 1, U"-- get extreme --", 0, 1, 0);
+		praat_addAction1 (classFormant, 1, U"Get minimum...", 0, 1, DO_Formant_getMinimum);
+		praat_addAction1 (classFormant, 1, U"Get time of minimum...", 0, 1, DO_Formant_getTimeOfMinimum);
+		praat_addAction1 (classFormant, 1, U"Get maximum...", 0, 1, DO_Formant_getMaximum);
+		praat_addAction1 (classFormant, 1, U"Get time of maximum...", 0, 1, DO_Formant_getTimeOfMaximum);
+		praat_addAction1 (classFormant, 1, U"-- get distribution --", 0, 1, 0);
+		praat_addAction1 (classFormant, 1, U"Get quantile...", 0, 1, DO_Formant_getQuantile);
+		praat_addAction1 (classFormant, 1, U"Get quantile of bandwidth...", 0, 1, DO_Formant_getQuantileOfBandwidth);
+		praat_addAction1 (classFormant, 1, U"Get mean...", 0, 1, DO_Formant_getMean);
+		praat_addAction1 (classFormant, 1, U"Get standard deviation...", 0, 1, DO_Formant_getStandardDeviation);
+	praat_addAction1 (classFormant, 0, U"Modify -", 0, 0, 0);
 		praat_TimeFunction_modify_init (classFormant);
-		praat_addAction1 (classFormant, 0, L"Sort", 0, 1, DO_Formant_sort);
-		praat_addAction1 (classFormant, 0, L"Formula (frequencies)...", 0, 1, DO_Formant_formula_frequencies);
-		praat_addAction1 (classFormant, 0, L"Formula (bandwidths)...", 0, 1, DO_Formant_formula_bandwidths);
-praat_addAction1 (classFormant, 0, L"Convert", 0, 0, 0);
-	praat_addAction1 (classFormant, 0, L"Track...", 0, 0, DO_Formant_tracker);
-	praat_addAction1 (classFormant, 0, L"Down to FormantTier", 0, praat_HIDDEN, DO_Formant_downto_FormantTier);
-	praat_addAction1 (classFormant, 0, L"Down to FormantGrid", 0, 0, DO_Formant_downto_FormantGrid);
-praat_addAction1 (classFormant, 0, L"Hack", 0, 0, 0);
-	praat_addAction1 (classFormant, 0, L"To Matrix...", 0, 0, DO_Formant_to_Matrix);
-
-	praat_addAction1 (classFormantGrid, 0, L"FormantGrid help", 0, 0, DO_FormantGrid_help);
-	praat_addAction1 (classFormantGrid, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_FormantGrid_edit);
-	praat_addAction1 (classFormantGrid, 1, L"Edit", 0, praat_HIDDEN, DO_FormantGrid_edit);
-	praat_addAction1 (classFormantGrid, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classFormant, 0, U"Sort", 0, 1, DO_Formant_sort);
+		praat_addAction1 (classFormant, 0, U"Formula (frequencies)...", 0, 1, DO_Formant_formula_frequencies);
+		praat_addAction1 (classFormant, 0, U"Formula (bandwidths)...", 0, 1, DO_Formant_formula_bandwidths);
+praat_addAction1 (classFormant, 0, U"Convert", 0, 0, 0);
+	praat_addAction1 (classFormant, 0, U"Track...", 0, 0, DO_Formant_tracker);
+	praat_addAction1 (classFormant, 0, U"Down to FormantTier", 0, praat_HIDDEN, DO_Formant_downto_FormantTier);
+	praat_addAction1 (classFormant, 0, U"Down to FormantGrid", 0, 0, DO_Formant_downto_FormantGrid);
+praat_addAction1 (classFormant, 0, U"Hack", 0, 0, 0);
+	praat_addAction1 (classFormant, 0, U"To Matrix...", 0, 0, DO_Formant_to_Matrix);
+
+	praat_addAction1 (classFormantGrid, 0, U"FormantGrid help", 0, 0, DO_FormantGrid_help);
+	praat_addAction1 (classFormantGrid, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_FormantGrid_edit);
+	praat_addAction1 (classFormantGrid, 1, U"Edit", 0, praat_HIDDEN, DO_FormantGrid_edit);
+	praat_addAction1 (classFormantGrid, 0, U"Modify -", 0, 0, 0);
 		praat_TimeFunction_modify_init (classFormantGrid);
-		praat_addAction1 (classFormantGrid, 0, L"Formula (frequencies)...", 0, 1, DO_FormantGrid_formula_frequencies);
-		//praat_addAction1 (classFormantGrid, 0, L"Formula (bandwidths)...", 0, 1, DO_FormantGrid_formula_bandwidths);
-		praat_addAction1 (classFormantGrid, 0, L"Add formant point...", 0, 1, DO_FormantGrid_addFormantPoint);
-		praat_addAction1 (classFormantGrid, 0, L"Add bandwidth point...", 0, 1, DO_FormantGrid_addBandwidthPoint);
-		praat_addAction1 (classFormantGrid, 0, L"Remove formant points between...", 0, 1, DO_FormantGrid_removeFormantPointsBetween);
-		praat_addAction1 (classFormantGrid, 0, L"Remove bandwidth points between...", 0, 1, DO_FormantGrid_removeBandwidthPointsBetween);
-	praat_addAction1 (classFormantGrid, 0, L"Convert -", 0, 0, 0);
-		praat_addAction1 (classFormantGrid, 0, L"To Formant...", 0, 1, DO_FormantGrid_to_Formant);
-
-	praat_addAction1 (classFormantTier, 0, L"FormantTier help", 0, 0, DO_FormantTier_help);
-	praat_addAction1 (classFormantTier, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classFormantTier, 0, L"Speckle...", 0, 1, DO_FormantTier_speckle);
-	praat_addAction1 (classFormantTier, 0, L"Query -", 0, 0, 0);
+		praat_addAction1 (classFormantGrid, 0, U"Formula (frequencies)...", 0, 1, DO_FormantGrid_formula_frequencies);
+		//praat_addAction1 (classFormantGrid, 0, U"Formula (bandwidths)...", 0, 1, DO_FormantGrid_formula_bandwidths);
+		praat_addAction1 (classFormantGrid, 0, U"Add formant point...", 0, 1, DO_FormantGrid_addFormantPoint);
+		praat_addAction1 (classFormantGrid, 0, U"Add bandwidth point...", 0, 1, DO_FormantGrid_addBandwidthPoint);
+		praat_addAction1 (classFormantGrid, 0, U"Remove formant points between...", 0, 1, DO_FormantGrid_removeFormantPointsBetween);
+		praat_addAction1 (classFormantGrid, 0, U"Remove bandwidth points between...", 0, 1, DO_FormantGrid_removeBandwidthPointsBetween);
+	praat_addAction1 (classFormantGrid, 0, U"Convert -", 0, 0, 0);
+		praat_addAction1 (classFormantGrid, 0, U"To Formant...", 0, 1, DO_FormantGrid_to_Formant);
+
+	praat_addAction1 (classFormantTier, 0, U"FormantTier help", 0, 0, DO_FormantTier_help);
+	praat_addAction1 (classFormantTier, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classFormantTier, 0, U"Speckle...", 0, 1, DO_FormantTier_speckle);
+	praat_addAction1 (classFormantTier, 0, U"Query -", 0, 0, 0);
 		praat_TimeTier_query_init (classFormantTier);
-		praat_addAction1 (classFormantTier, 1, L"-- get value --", 0, 1, 0);
-		praat_addAction1 (classFormantTier, 1, L"Get value at time...", 0, 1, DO_FormantTier_getValueAtTime);
-		praat_addAction1 (classFormantTier, 1, L"Get bandwidth at time...", 0, 1, DO_FormantTier_getBandwidthAtTime);
-	praat_addAction1 (classFormantTier, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classFormantTier, 1, U"-- get value --", 0, 1, 0);
+		praat_addAction1 (classFormantTier, 1, U"Get value at time...", 0, 1, DO_FormantTier_getValueAtTime);
+		praat_addAction1 (classFormantTier, 1, U"Get bandwidth at time...", 0, 1, DO_FormantTier_getBandwidthAtTime);
+	praat_addAction1 (classFormantTier, 0, U"Modify -", 0, 0, 0);
 		praat_TimeTier_modify_init (classFormantTier);
-		praat_addAction1 (classFormantTier, 0, L"Add point...", 0, 1, DO_FormantTier_addPoint);
-praat_addAction1 (classFormantTier, 0, L"Down", 0, 0, 0);
-	praat_addAction1 (classFormantTier, 0, L"Down to TableOfReal...", 0, 0, DO_FormantTier_downto_TableOfReal);
-
-	praat_addAction1 (classHarmonicity, 0, L"Harmonicity help", 0, 0, DO_Harmonicity_help);
-	praat_addAction1 (classHarmonicity, 0, L"Draw", 0, 0, 0);
-		praat_addAction1 (classHarmonicity, 0, L"Draw...", 0, 0, DO_Harmonicity_draw);
-	praat_addAction1 (classHarmonicity, 1, L"Query -", 0, 0, 0);
+		praat_addAction1 (classFormantTier, 0, U"Add point...", 0, 1, DO_FormantTier_addPoint);
+praat_addAction1 (classFormantTier, 0, U"Down", 0, 0, 0);
+	praat_addAction1 (classFormantTier, 0, U"Down to TableOfReal...", 0, 0, DO_FormantTier_downto_TableOfReal);
+
+	praat_addAction1 (classHarmonicity, 0, U"Harmonicity help", 0, 0, DO_Harmonicity_help);
+	praat_addAction1 (classHarmonicity, 0, U"Draw", 0, 0, 0);
+		praat_addAction1 (classHarmonicity, 0, U"Draw...", 0, 0, DO_Harmonicity_draw);
+	praat_addAction1 (classHarmonicity, 1, U"Query -", 0, 0, 0);
 		praat_TimeFrameSampled_query_init (classHarmonicity);
-		praat_addAction1 (classHarmonicity, 1, L"-- get content --", 0, 1, 0);
-		praat_addAction1 (classHarmonicity, 1, L"Get value at time...", 0, 1, DO_Harmonicity_getValueAtTime);
-		praat_addAction1 (classHarmonicity, 1, L"Get value in frame...", 0, 1, DO_Harmonicity_getValueInFrame);
-		praat_addAction1 (classHarmonicity, 1, L"-- get extreme --", 0, 1, 0);
-		praat_addAction1 (classHarmonicity, 1, L"Get minimum...", 0, 1, DO_Harmonicity_getMinimum);
-		praat_addAction1 (classHarmonicity, 1, L"Get time of minimum...", 0, 1, DO_Harmonicity_getTimeOfMinimum);
-		praat_addAction1 (classHarmonicity, 1, L"Get maximum...", 0, 1, DO_Harmonicity_getMaximum);
-		praat_addAction1 (classHarmonicity, 1, L"Get time of maximum...", 0, 1, DO_Harmonicity_getTimeOfMaximum);
-		praat_addAction1 (classHarmonicity, 1, L"-- get statistics --", 0, 1, 0);
-		praat_addAction1 (classHarmonicity, 1, L"Get mean...", 0, 1, DO_Harmonicity_getMean);
-		praat_addAction1 (classHarmonicity, 1, L"Get standard deviation...", 0, 1, DO_Harmonicity_getStandardDeviation);
-	praat_addAction1 (classHarmonicity, 0, L"Modify", 0, 0, 0);
+		praat_addAction1 (classHarmonicity, 1, U"-- get content --", 0, 1, 0);
+		praat_addAction1 (classHarmonicity, 1, U"Get value at time...", 0, 1, DO_Harmonicity_getValueAtTime);
+		praat_addAction1 (classHarmonicity, 1, U"Get value in frame...", 0, 1, DO_Harmonicity_getValueInFrame);
+		praat_addAction1 (classHarmonicity, 1, U"-- get extreme --", 0, 1, 0);
+		praat_addAction1 (classHarmonicity, 1, U"Get minimum...", 0, 1, DO_Harmonicity_getMinimum);
+		praat_addAction1 (classHarmonicity, 1, U"Get time of minimum...", 0, 1, DO_Harmonicity_getTimeOfMinimum);
+		praat_addAction1 (classHarmonicity, 1, U"Get maximum...", 0, 1, DO_Harmonicity_getMaximum);
+		praat_addAction1 (classHarmonicity, 1, U"Get time of maximum...", 0, 1, DO_Harmonicity_getTimeOfMaximum);
+		praat_addAction1 (classHarmonicity, 1, U"-- get statistics --", 0, 1, 0);
+		praat_addAction1 (classHarmonicity, 1, U"Get mean...", 0, 1, DO_Harmonicity_getMean);
+		praat_addAction1 (classHarmonicity, 1, U"Get standard deviation...", 0, 1, DO_Harmonicity_getStandardDeviation);
+	praat_addAction1 (classHarmonicity, 0, U"Modify", 0, 0, 0);
 		praat_TimeFunction_modify_init (classHarmonicity);
-		praat_addAction1 (classHarmonicity, 0, L"Formula...", 0, 0, DO_Harmonicity_formula);
-	praat_addAction1 (classHarmonicity, 0, L"Hack", 0, 0, 0);
-		praat_addAction1 (classHarmonicity, 0, L"To Matrix", 0, 0, DO_Harmonicity_to_Matrix);
+		praat_addAction1 (classHarmonicity, 0, U"Formula...", 0, 0, DO_Harmonicity_formula);
+	praat_addAction1 (classHarmonicity, 0, U"Hack", 0, 0, 0);
+		praat_addAction1 (classHarmonicity, 0, U"To Matrix", 0, 0, DO_Harmonicity_to_Matrix);
 
-	praat_addAction1 (classIntensity, 0, L"Intensity help", 0, 0, DO_Intensity_help);
-	praat_addAction1 (classIntensity, 0, L"Draw...", 0, 0, DO_Intensity_draw);
-	praat_addAction1 (classIntensity, 1, L"Query -", 0, 0, 0);
+	praat_addAction1 (classIntensity, 0, U"Intensity help", 0, 0, DO_Intensity_help);
+	praat_addAction1 (classIntensity, 0, U"Draw...", 0, 0, DO_Intensity_draw);
+	praat_addAction1 (classIntensity, 1, U"Query -", 0, 0, 0);
 		praat_TimeFrameSampled_query_init (classIntensity);
-		praat_addAction1 (classIntensity, 1, L"-- get content --", 0, 1, 0);
-		praat_addAction1 (classIntensity, 1, L"Get value at time...", 0, 1, DO_Intensity_getValueAtTime);
-		praat_addAction1 (classIntensity, 1, L"Get value in frame...", 0, 1, DO_Intensity_getValueInFrame);
-		praat_addAction1 (classIntensity, 1, L"-- get extreme --", 0, 1, 0);
-		praat_addAction1 (classIntensity, 1, L"Get minimum...", 0, 1, DO_Intensity_getMinimum);
-		praat_addAction1 (classIntensity, 1, L"Get time of minimum...", 0, 1, DO_Intensity_getTimeOfMinimum);
-		praat_addAction1 (classIntensity, 1, L"Get maximum...", 0, 1, DO_Intensity_getMaximum);
-		praat_addAction1 (classIntensity, 1, L"Get time of maximum...", 0, 1, DO_Intensity_getTimeOfMaximum);
-		praat_addAction1 (classIntensity, 1, L"-- get statistics --", 0, 1, 0);
-		praat_addAction1 (classIntensity, 1, L"Get quantile...", 0, 1, DO_Intensity_getQuantile);
-		praat_addAction1 (classIntensity, 1, L"Get mean...", 0, 1, DO_Intensity_getMean);
-		praat_addAction1 (classIntensity, 1, L"Get standard deviation...", 0, 1, DO_Intensity_getStandardDeviation);
-	praat_addAction1 (classIntensity, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classIntensity, 1, U"-- get content --", 0, 1, 0);
+		praat_addAction1 (classIntensity, 1, U"Get value at time...", 0, 1, DO_Intensity_getValueAtTime);
+		praat_addAction1 (classIntensity, 1, U"Get value in frame...", 0, 1, DO_Intensity_getValueInFrame);
+		praat_addAction1 (classIntensity, 1, U"-- get extreme --", 0, 1, 0);
+		praat_addAction1 (classIntensity, 1, U"Get minimum...", 0, 1, DO_Intensity_getMinimum);
+		praat_addAction1 (classIntensity, 1, U"Get time of minimum...", 0, 1, DO_Intensity_getTimeOfMinimum);
+		praat_addAction1 (classIntensity, 1, U"Get maximum...", 0, 1, DO_Intensity_getMaximum);
+		praat_addAction1 (classIntensity, 1, U"Get time of maximum...", 0, 1, DO_Intensity_getTimeOfMaximum);
+		praat_addAction1 (classIntensity, 1, U"-- get statistics --", 0, 1, 0);
+		praat_addAction1 (classIntensity, 1, U"Get quantile...", 0, 1, DO_Intensity_getQuantile);
+		praat_addAction1 (classIntensity, 1, U"Get mean...", 0, 1, DO_Intensity_getMean);
+		praat_addAction1 (classIntensity, 1, U"Get standard deviation...", 0, 1, DO_Intensity_getStandardDeviation);
+	praat_addAction1 (classIntensity, 0, U"Modify -", 0, 0, 0);
 		praat_TimeFunction_modify_init (classIntensity);
-		praat_addAction1 (classIntensity, 0, L"Formula...", 0, 1, DO_Intensity_formula);
-	praat_addAction1 (classIntensity, 0, L"Analyse", 0, 0, 0);
-		praat_addAction1 (classIntensity, 0, L"To IntensityTier (peaks)", 0, 0, DO_Intensity_to_IntensityTier_peaks);
-		praat_addAction1 (classIntensity, 0, L"To IntensityTier (valleys)", 0, 0, DO_Intensity_to_IntensityTier_valleys);
-	praat_addAction1 (classIntensity, 0, L"Convert", 0, 0, 0);
-		praat_addAction1 (classIntensity, 0, L"Down to IntensityTier", 0, 0, DO_Intensity_downto_IntensityTier);
-		praat_addAction1 (classIntensity, 0, L"Down to Matrix", 0, 0, DO_Intensity_downto_Matrix);
-
-	praat_addAction1 (classIntensityTier, 0, L"IntensityTier help", 0, 0, DO_IntensityTier_help);
-	praat_addAction1 (classIntensityTier, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_IntensityTier_edit);
-	praat_addAction1 (classIntensityTier, 1, L"Edit", 0, praat_HIDDEN, DO_IntensityTier_edit);
-	praat_addAction1 (classIntensityTier, 0, L"View & Edit with Sound?", 0, 0, DO_info_IntensityTier_Sound_edit);
-	praat_addAction1 (classIntensityTier, 0, L"Query -", 0, 0, 0);
+		praat_addAction1 (classIntensity, 0, U"Formula...", 0, 1, DO_Intensity_formula);
+	praat_addAction1 (classIntensity, 0, U"Analyse", 0, 0, 0);
+		praat_addAction1 (classIntensity, 0, U"To IntensityTier (peaks)", 0, 0, DO_Intensity_to_IntensityTier_peaks);
+		praat_addAction1 (classIntensity, 0, U"To IntensityTier (valleys)", 0, 0, DO_Intensity_to_IntensityTier_valleys);
+	praat_addAction1 (classIntensity, 0, U"Convert", 0, 0, 0);
+		praat_addAction1 (classIntensity, 0, U"Down to IntensityTier", 0, 0, DO_Intensity_downto_IntensityTier);
+		praat_addAction1 (classIntensity, 0, U"Down to Matrix", 0, 0, DO_Intensity_downto_Matrix);
+
+	praat_addAction1 (classIntensityTier, 0, U"IntensityTier help", 0, 0, DO_IntensityTier_help);
+	praat_addAction1 (classIntensityTier, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_IntensityTier_edit);
+	praat_addAction1 (classIntensityTier, 1, U"Edit", 0, praat_HIDDEN, DO_IntensityTier_edit);
+	praat_addAction1 (classIntensityTier, 0, U"View & Edit with Sound?", 0, 0, DO_info_IntensityTier_Sound_edit);
+	praat_addAction1 (classIntensityTier, 0, U"Query -", 0, 0, 0);
 		praat_TimeTier_query_init (classIntensityTier);
-		praat_addAction1 (classIntensityTier, 1, L"-- get content --", 0, 1, 0);
-		praat_addAction1 (classIntensityTier, 1, L"Get value at time...", 0, 1, DO_IntensityTier_getValueAtTime);
-		praat_addAction1 (classIntensityTier, 1, L"Get value at index...", 0, 1, DO_IntensityTier_getValueAtIndex);
-	praat_addAction1 (classIntensityTier, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classIntensityTier, 1, U"-- get content --", 0, 1, 0);
+		praat_addAction1 (classIntensityTier, 1, U"Get value at time...", 0, 1, DO_IntensityTier_getValueAtTime);
+		praat_addAction1 (classIntensityTier, 1, U"Get value at index...", 0, 1, DO_IntensityTier_getValueAtIndex);
+	praat_addAction1 (classIntensityTier, 0, U"Modify -", 0, 0, 0);
 		praat_TimeTier_modify_init (classIntensityTier);
-		praat_addAction1 (classIntensityTier, 0, L"Add point...", 0, 1, DO_IntensityTier_addPoint);
-		praat_addAction1 (classIntensityTier, 0, L"Formula...", 0, 1, DO_IntensityTier_formula);
-praat_addAction1 (classIntensityTier, 0, L"Convert", 0, 0, 0);
-	praat_addAction1 (classIntensityTier, 0, L"To AmplitudeTier", 0, 0, DO_IntensityTier_to_AmplitudeTier);
-	praat_addAction1 (classIntensityTier, 0, L"Down to PointProcess", 0, 0, DO_IntensityTier_downto_PointProcess);
-	praat_addAction1 (classIntensityTier, 0, L"Down to TableOfReal", 0, 0, DO_IntensityTier_downto_TableOfReal);
-
-	praat_addAction1 (classLtas, 0, L"Ltas help", 0, 0, DO_Ltas_help);
-	praat_addAction1 (classLtas, 0, L"Draw...", 0, 0, DO_Ltas_draw);
-	praat_addAction1 (classLtas, 1, L"Query -", 0, 0, 0);
-		praat_addAction1 (classLtas, 1, L"Frequency domain", 0, 1, 0);
-		praat_addAction1 (classLtas, 1, L"Get lowest frequency", 0, 2, DO_Ltas_getLowestFrequency);
-		praat_addAction1 (classLtas, 1, L"Get highest frequency", 0, 2, DO_Ltas_getHighestFrequency);
-		praat_addAction1 (classLtas, 1, L"Frequency sampling", 0, 1, 0);
-		praat_addAction1 (classLtas, 1, L"Get number of bins", 0, 2, DO_Ltas_getNumberOfBins);
-			praat_addAction1 (classLtas, 1, L"Get number of bands", 0, praat_HIDDEN + praat_DEPTH_2, DO_Ltas_getNumberOfBins);
-		praat_addAction1 (classLtas, 1, L"Get bin width", 0, 2, DO_Ltas_getBinWidth);
-			praat_addAction1 (classLtas, 1, L"Get band width", 0, praat_HIDDEN + praat_DEPTH_2, DO_Ltas_getBinWidth);
-		praat_addAction1 (classLtas, 1, L"Get frequency from bin number...", 0, 2, DO_Ltas_getFrequencyFromBinNumber);
-			praat_addAction1 (classLtas, 1, L"Get frequency from band...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Ltas_getFrequencyFromBinNumber);
-		praat_addAction1 (classLtas, 1, L"Get bin number from frequency...", 0, 2, DO_Ltas_getBinNumberFromFrequency);
-			praat_addAction1 (classLtas, 1, L"Get band from frequency...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Ltas_getBinNumberFromFrequency);
-		praat_addAction1 (classLtas, 1, L"-- get content --", 0, 1, 0);
-		praat_addAction1 (classLtas, 1, L"Get value at frequency...", 0, 1, DO_Ltas_getValueAtFrequency);
-		praat_addAction1 (classLtas, 1, L"Get value in bin...", 0, 1, DO_Ltas_getValueInBin);
-			praat_addAction1 (classLtas, 1, L"Get value in band...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Ltas_getValueInBin);
-		praat_addAction1 (classLtas, 1, L"-- get extreme --", 0, 1, 0);
-		praat_addAction1 (classLtas, 1, L"Get minimum...", 0, 1, DO_Ltas_getMinimum);
-		praat_addAction1 (classLtas, 1, L"Get frequency of minimum...", 0, 1, DO_Ltas_getFrequencyOfMinimum);
-		praat_addAction1 (classLtas, 1, L"Get maximum...", 0, 1, DO_Ltas_getMaximum);
-		praat_addAction1 (classLtas, 1, L"Get frequency of maximum...", 0, 1, DO_Ltas_getFrequencyOfMaximum);
-		praat_addAction1 (classLtas, 1, L"-- get statistics --", 0, 1, 0);
-		praat_addAction1 (classLtas, 1, L"Get mean...", 0, 1, DO_Ltas_getMean);
-		praat_addAction1 (classLtas, 1, L"Get slope...", 0, 1, DO_Ltas_getSlope);
-		praat_addAction1 (classLtas, 1, L"Get local peak height...", 0, 1, DO_Ltas_getLocalPeakHeight);
-		praat_addAction1 (classLtas, 1, L"Get standard deviation...", 0, 1, DO_Ltas_getStandardDeviation);
-	praat_addAction1 (classLtas, 0, L"Modify", 0, 0, 0);
-	praat_addAction1 (classLtas, 0, L"Formula...", 0, 0, DO_Ltas_formula);
-	praat_addAction1 (classLtas, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classLtas, 0, L"To SpectrumTier (peaks)", 0, 0, DO_Ltas_to_SpectrumTier_peaks);
-	praat_addAction1 (classLtas, 0, L"Convert", 0, 0, 0);
-	praat_addAction1 (classLtas, 0, L"Compute trend line...", 0, 0, DO_Ltas_computeTrendLine);
-	praat_addAction1 (classLtas, 0, L"Subtract trend line...", 0, 0, DO_Ltas_subtractTrendLine);
-	praat_addAction1 (classLtas, 0, L"Combine", 0, 0, 0);
-	praat_addAction1 (classLtas, 0, L"Merge", 0, praat_HIDDEN, DO_Ltases_merge);
-	praat_addAction1 (classLtas, 0, L"Average", 0, 0, DO_Ltases_average);
-	praat_addAction1 (classLtas, 0, L"Hack", 0, 0, 0);
-	praat_addAction1 (classLtas, 0, L"To Matrix", 0, 0, DO_Ltas_to_Matrix);
-
-	praat_addAction1 (classManipulation, 0, L"Manipulation help", 0, 0, DO_Manipulation_help);
-	praat_addAction1 (classManipulation, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_Manipulation_edit);
-	praat_addAction1 (classManipulation, 1, L"Edit", 0, praat_HIDDEN, DO_Manipulation_edit);
-	praat_addAction1 (classManipulation, 0, L"Play (overlap-add)", 0, 0, DO_Manipulation_play_overlapAdd);
-	praat_addAction1 (classManipulation, 0, L"Play (PSOLA)", 0, praat_HIDDEN, DO_Manipulation_play_overlapAdd);
-	praat_addAction1 (classManipulation, 0, L"Play (LPC)", 0, 0, DO_Manipulation_play_lpc);
-	praat_addAction1 (classManipulation, 0, L"Get resynthesis (overlap-add)", 0, 0, DO_Manipulation_getResynthesis_overlapAdd);
-	praat_addAction1 (classManipulation, 0, L"Get resynthesis (PSOLA)", 0, praat_HIDDEN, DO_Manipulation_getResynthesis_overlapAdd);
-	praat_addAction1 (classManipulation, 0, L"Get resynthesis (LPC)", 0, 0, DO_Manipulation_getResynthesis_lpc);
-	praat_addAction1 (classManipulation, 0, L"Extract original sound", 0, 0, DO_Manipulation_extractOriginalSound);
-	praat_addAction1 (classManipulation, 0, L"Extract pulses", 0, 0, DO_Manipulation_extractPulses);
-	praat_addAction1 (classManipulation, 0, L"Extract pitch tier", 0, 0, DO_Manipulation_extractPitchTier);
-	praat_addAction1 (classManipulation, 0, L"Extract duration tier", 0, 0, DO_Manipulation_extractDurationTier);
-	praat_addAction1 (classManipulation, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classIntensityTier, 0, U"Add point...", 0, 1, DO_IntensityTier_addPoint);
+		praat_addAction1 (classIntensityTier, 0, U"Formula...", 0, 1, DO_IntensityTier_formula);
+praat_addAction1 (classIntensityTier, 0, U"Convert", 0, 0, 0);
+	praat_addAction1 (classIntensityTier, 0, U"To AmplitudeTier", 0, 0, DO_IntensityTier_to_AmplitudeTier);
+	praat_addAction1 (classIntensityTier, 0, U"Down to PointProcess", 0, 0, DO_IntensityTier_downto_PointProcess);
+	praat_addAction1 (classIntensityTier, 0, U"Down to TableOfReal", 0, 0, DO_IntensityTier_downto_TableOfReal);
+
+	praat_addAction1 (classLtas, 0, U"Ltas help", 0, 0, DO_Ltas_help);
+	praat_addAction1 (classLtas, 0, U"Draw...", 0, 0, DO_Ltas_draw);
+	praat_addAction1 (classLtas, 1, U"Query -", 0, 0, 0);
+		praat_addAction1 (classLtas, 1, U"Frequency domain", 0, 1, 0);
+		praat_addAction1 (classLtas, 1, U"Get lowest frequency", 0, 2, DO_Ltas_getLowestFrequency);
+		praat_addAction1 (classLtas, 1, U"Get highest frequency", 0, 2, DO_Ltas_getHighestFrequency);
+		praat_addAction1 (classLtas, 1, U"Frequency sampling", 0, 1, 0);
+		praat_addAction1 (classLtas, 1, U"Get number of bins", 0, 2, DO_Ltas_getNumberOfBins);
+			praat_addAction1 (classLtas, 1, U"Get number of bands", 0, praat_HIDDEN + praat_DEPTH_2, DO_Ltas_getNumberOfBins);
+		praat_addAction1 (classLtas, 1, U"Get bin width", 0, 2, DO_Ltas_getBinWidth);
+			praat_addAction1 (classLtas, 1, U"Get band width", 0, praat_HIDDEN + praat_DEPTH_2, DO_Ltas_getBinWidth);
+		praat_addAction1 (classLtas, 1, U"Get frequency from bin number...", 0, 2, DO_Ltas_getFrequencyFromBinNumber);
+			praat_addAction1 (classLtas, 1, U"Get frequency from band...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Ltas_getFrequencyFromBinNumber);
+		praat_addAction1 (classLtas, 1, U"Get bin number from frequency...", 0, 2, DO_Ltas_getBinNumberFromFrequency);
+			praat_addAction1 (classLtas, 1, U"Get band from frequency...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Ltas_getBinNumberFromFrequency);
+		praat_addAction1 (classLtas, 1, U"-- get content --", 0, 1, 0);
+		praat_addAction1 (classLtas, 1, U"Get value at frequency...", 0, 1, DO_Ltas_getValueAtFrequency);
+		praat_addAction1 (classLtas, 1, U"Get value in bin...", 0, 1, DO_Ltas_getValueInBin);
+			praat_addAction1 (classLtas, 1, U"Get value in band...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Ltas_getValueInBin);
+		praat_addAction1 (classLtas, 1, U"-- get extreme --", 0, 1, 0);
+		praat_addAction1 (classLtas, 1, U"Get minimum...", 0, 1, DO_Ltas_getMinimum);
+		praat_addAction1 (classLtas, 1, U"Get frequency of minimum...", 0, 1, DO_Ltas_getFrequencyOfMinimum);
+		praat_addAction1 (classLtas, 1, U"Get maximum...", 0, 1, DO_Ltas_getMaximum);
+		praat_addAction1 (classLtas, 1, U"Get frequency of maximum...", 0, 1, DO_Ltas_getFrequencyOfMaximum);
+		praat_addAction1 (classLtas, 1, U"-- get statistics --", 0, 1, 0);
+		praat_addAction1 (classLtas, 1, U"Get mean...", 0, 1, DO_Ltas_getMean);
+		praat_addAction1 (classLtas, 1, U"Get slope...", 0, 1, DO_Ltas_getSlope);
+		praat_addAction1 (classLtas, 1, U"Get local peak height...", 0, 1, DO_Ltas_getLocalPeakHeight);
+		praat_addAction1 (classLtas, 1, U"Get standard deviation...", 0, 1, DO_Ltas_getStandardDeviation);
+	praat_addAction1 (classLtas, 0, U"Modify", 0, 0, 0);
+	praat_addAction1 (classLtas, 0, U"Formula...", 0, 0, DO_Ltas_formula);
+	praat_addAction1 (classLtas, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classLtas, 0, U"To SpectrumTier (peaks)", 0, 0, DO_Ltas_to_SpectrumTier_peaks);
+	praat_addAction1 (classLtas, 0, U"Convert", 0, 0, 0);
+	praat_addAction1 (classLtas, 0, U"Compute trend line...", 0, 0, DO_Ltas_computeTrendLine);
+	praat_addAction1 (classLtas, 0, U"Subtract trend line...", 0, 0, DO_Ltas_subtractTrendLine);
+	praat_addAction1 (classLtas, 0, U"Combine", 0, 0, 0);
+	praat_addAction1 (classLtas, 0, U"Merge", 0, praat_HIDDEN, DO_Ltases_merge);
+	praat_addAction1 (classLtas, 0, U"Average", 0, 0, DO_Ltases_average);
+	praat_addAction1 (classLtas, 0, U"Hack", 0, 0, 0);
+	praat_addAction1 (classLtas, 0, U"To Matrix", 0, 0, DO_Ltas_to_Matrix);
+
+	praat_addAction1 (classManipulation, 0, U"Manipulation help", 0, 0, DO_Manipulation_help);
+	praat_addAction1 (classManipulation, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_Manipulation_edit);
+	praat_addAction1 (classManipulation, 1, U"Edit", 0, praat_HIDDEN, DO_Manipulation_edit);
+	praat_addAction1 (classManipulation, 0, U"Play (overlap-add)", 0, 0, DO_Manipulation_play_overlapAdd);
+	praat_addAction1 (classManipulation, 0, U"Play (PSOLA)", 0, praat_HIDDEN, DO_Manipulation_play_overlapAdd);
+	praat_addAction1 (classManipulation, 0, U"Play (LPC)", 0, 0, DO_Manipulation_play_lpc);
+	praat_addAction1 (classManipulation, 0, U"Get resynthesis (overlap-add)", 0, 0, DO_Manipulation_getResynthesis_overlapAdd);
+	praat_addAction1 (classManipulation, 0, U"Get resynthesis (PSOLA)", 0, praat_HIDDEN, DO_Manipulation_getResynthesis_overlapAdd);
+	praat_addAction1 (classManipulation, 0, U"Get resynthesis (LPC)", 0, 0, DO_Manipulation_getResynthesis_lpc);
+	praat_addAction1 (classManipulation, 0, U"Extract original sound", 0, 0, DO_Manipulation_extractOriginalSound);
+	praat_addAction1 (classManipulation, 0, U"Extract pulses", 0, 0, DO_Manipulation_extractPulses);
+	praat_addAction1 (classManipulation, 0, U"Extract pitch tier", 0, 0, DO_Manipulation_extractPitchTier);
+	praat_addAction1 (classManipulation, 0, U"Extract duration tier", 0, 0, DO_Manipulation_extractDurationTier);
+	praat_addAction1 (classManipulation, 0, U"Modify -", 0, 0, 0);
 		praat_TimeFunction_modify_init (classManipulation);
-		praat_addAction1 (classManipulation, 0, L"Replace pitch tier?", 0, 1, DO_Manipulation_replacePitchTier_help);
-		praat_addAction1 (classManipulation, 0, L"Replace duration tier?", 0, 1, DO_Manipulation_replaceDurationTier_help);
-	praat_addAction1 (classManipulation, 1, L"Save as text file without Sound...", 0, 0, DO_Manipulation_writeToTextFileWithoutSound);
-	praat_addAction1 (classManipulation, 1, L"Write to text file without Sound...", 0, praat_HIDDEN, DO_Manipulation_writeToTextFileWithoutSound);
-	praat_addAction1 (classManipulation, 1, L"Save as binary file without Sound...", 0, 0, DO_Manipulation_writeToBinaryFileWithoutSound);
-	praat_addAction1 (classManipulation, 1, L"Write to binary file without Sound...", 0, praat_HIDDEN, DO_Manipulation_writeToBinaryFileWithoutSound);
-
-	praat_addAction1 (classMatrix, 0, L"Matrix help", 0, 0, DO_Matrix_help);
-	praat_addAction1 (classMatrix, 1, L"Save as matrix text file...", 0, 0, DO_Matrix_writeToMatrixTextFile);
-	praat_addAction1 (classMatrix, 1, L"Write to matrix text file...", 0, praat_HIDDEN, DO_Matrix_writeToMatrixTextFile);
-	praat_addAction1 (classMatrix, 1, L"Save as headerless spreadsheet file...", 0, 0, DO_Matrix_writeToHeaderlessSpreadsheetFile);
-	praat_addAction1 (classMatrix, 1, L"Write to headerless spreadsheet file...", 0, praat_HIDDEN, DO_Matrix_writeToHeaderlessSpreadsheetFile);
-	praat_addAction1 (classMatrix, 1, L"Play movie", 0, 0, DO_Matrix_movie);
-	praat_addAction1 (classMatrix, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classMatrix, 0, L"Draw rows...", 0, 1, DO_Matrix_drawRows);
-		praat_addAction1 (classMatrix, 0, L"Draw one contour...", 0, 1, DO_Matrix_drawOneContour);
-		praat_addAction1 (classMatrix, 0, L"Draw contours...", 0, 1, DO_Matrix_drawContours);
-		praat_addAction1 (classMatrix, 0, L"Paint image...", 0, 1, DO_Matrix_paintImage);
-		praat_addAction1 (classMatrix, 0, L"Paint contours...", 0, 1, DO_Matrix_paintContours);
-		praat_addAction1 (classMatrix, 0, L"Paint cells...", 0, 1, DO_Matrix_paintCells);
-		praat_addAction1 (classMatrix, 0, L"Paint surface...", 0, 1, DO_Matrix_paintSurface);
-	praat_addAction1 (classMatrix, 1, L"Query -", 0, 0, 0);
-		praat_addAction1 (classMatrix, 1, L"Get lowest x", 0, 1, DO_Matrix_getLowestX);
-		praat_addAction1 (classMatrix, 1, L"Get highest x", 0, 1, DO_Matrix_getHighestX);
-		praat_addAction1 (classMatrix, 1, L"Get lowest y", 0, 1, DO_Matrix_getLowestY);
-		praat_addAction1 (classMatrix, 1, L"Get highest y", 0, 1, DO_Matrix_getHighestY);
-		praat_addAction1 (classMatrix, 1, L"-- get structure --", 0, 1, 0);
-		praat_addAction1 (classMatrix, 1, L"Get number of rows", 0, 1, DO_Matrix_getNumberOfRows);
-		praat_addAction1 (classMatrix, 1, L"Get number of columns", 0, 1, DO_Matrix_getNumberOfColumns);
-		praat_addAction1 (classMatrix, 1, L"Get row distance", 0, 1, DO_Matrix_getRowDistance);
-		praat_addAction1 (classMatrix, 1, L"Get column distance", 0, 1, DO_Matrix_getColumnDistance);
-		praat_addAction1 (classMatrix, 1, L"Get y of row...", 0, 1, DO_Matrix_getYofRow);
-		praat_addAction1 (classMatrix, 1, L"Get x of column...", 0, 1, DO_Matrix_getXofColumn);
-		praat_addAction1 (classMatrix, 1, L"-- get value --", 0, 1, 0);
-		praat_addAction1 (classMatrix, 1, L"Get value in cell...", 0, 1, DO_Matrix_getValueInCell);
-		praat_addAction1 (classMatrix, 1, L"Get value at xy...", 0, 1, DO_Matrix_getValueAtXY);
-		praat_addAction1 (classMatrix, 1, L"Get minimum", 0, 1, DO_Matrix_getMinimum);
-		praat_addAction1 (classMatrix, 1, L"Get maximum", 0, 1, DO_Matrix_getMaximum);
-		praat_addAction1 (classMatrix, 1, L"Get sum", 0, 1, DO_Matrix_getSum);
-	praat_addAction1 (classMatrix, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classMatrix, 0, L"Formula...", 0, 1, DO_Matrix_formula);
-		praat_addAction1 (classMatrix, 0, L"Set value...", 0, 1, DO_Matrix_setValue);
-praat_addAction1 (classMatrix, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classMatrix, 0, L"Eigen", 0, 0, DO_Matrix_eigen);
-	praat_addAction1 (classMatrix, 0, L"Synthesize", 0, 0, 0);
-	praat_addAction1 (classMatrix, 0, L"Power...", 0, 0, DO_Matrix_power);
-	praat_addAction1 (classMatrix, 0, L"Combine two Matrices -", 0, 0, 0);
-		praat_addAction1 (classMatrix, 2, L"Merge (append rows)", 0, 1, DO_Matrix_appendRows);
-		praat_addAction1 (classMatrix, 2, L"To ParamCurve", 0, 1, DO_Matrix_to_ParamCurve);
-	praat_addAction1 (classMatrix, 0, L"Cast -", 0, 0, 0);
-		praat_addAction1 (classMatrix, 0, L"To Cochleagram", 0, 1, DO_Matrix_to_Cochleagram);
-		praat_addAction1 (classMatrix, 0, L"To Excitation", 0, 1, DO_Matrix_to_Excitation);
-		praat_addAction1 (classMatrix, 0, L"To Harmonicity", 0, 1, DO_Matrix_to_Harmonicity);
-		praat_addAction1 (classMatrix, 0, L"To Intensity", 0, 1, DO_Matrix_to_Intensity);
-		praat_addAction1 (classMatrix, 0, L"To Ltas", 0, 1, DO_Matrix_to_Ltas);
-		praat_addAction1 (classMatrix, 0, L"To Pitch", 0, 1, DO_Matrix_to_Pitch);
-		praat_addAction1 (classMatrix, 0, L"To PointProcess", 0, 1, DO_Matrix_to_PointProcess);
-		praat_addAction1 (classMatrix, 0, L"To Polygon", 0, 1, DO_Matrix_to_Polygon);
-		praat_addAction1 (classMatrix, 0, L"To Sound", 0, 1, DO_Matrix_to_Sound);
-		praat_addAction1 (classMatrix, 0, L"To Sound (slice)...", 0, 1, DO_Matrix_to_Sound_mono);
-		praat_addAction1 (classMatrix, 0, L"To Spectrogram", 0, 1, DO_Matrix_to_Spectrogram);
-		praat_addAction1 (classMatrix, 0, L"To TableOfReal", 0, 1, DO_Matrix_to_TableOfReal);
-		praat_addAction1 (classMatrix, 0, L"To Spectrum", 0, 1, DO_Matrix_to_Spectrum);
-		praat_addAction1 (classMatrix, 0, L"To Transition", 0, 1, DO_Matrix_to_Transition);
-		praat_addAction1 (classMatrix, 0, L"To VocalTract", 0, 1, DO_Matrix_to_VocalTract);
-
-	praat_addAction1 (classMovie, 1, L"Paint one image...", 0, 1, DO_Movie_paintOneImage);
-	praat_addAction1 (classMovie, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_Movie_viewAndEdit);
-
-	praat_addAction1 (classParamCurve, 0, L"ParamCurve help", 0, 0, DO_ParamCurve_help);
-	praat_addAction1 (classParamCurve, 0, L"Draw", 0, 0, 0);
-	praat_addAction1 (classParamCurve, 0, L"Draw...", 0, 0, DO_ParamCurve_draw);
-
-	praat_addAction1 (classPhoto, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classPhoto, 0, L"Paint image...", 0, 1, DO_Photo_paintImage);
-		praat_addAction1 (classPhoto, 0, L"Paint cells...", 0, 1, DO_Photo_paintCells);
-	praat_addAction1 (classPhoto, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classPhoto, 0, L"Formula (red)...", 0, 1, DO_Photo_formula_red);
-		praat_addAction1 (classPhoto, 0, L"Formula (green)...", 0, 1, DO_Photo_formula_green);
-		praat_addAction1 (classPhoto, 0, L"Formula (blue)...", 0, 1, DO_Photo_formula_blue);
-		praat_addAction1 (classPhoto, 0, L"Formula (transparency)...", 0, 1, DO_Photo_formula_transparency);
-	praat_addAction1 (classPhoto, 0, L"Extract -", 0, 0, 0);
-		praat_addAction1 (classPhoto, 0, L"Extract red", 0, 1, DO_Photo_extractRed);
-		praat_addAction1 (classPhoto, 0, L"Extract green", 0, 1, DO_Photo_extractGreen);
-		praat_addAction1 (classPhoto, 0, L"Extract blue", 0, 1, DO_Photo_extractBlue);
-		praat_addAction1 (classPhoto, 0, L"Extract transparency", 0, 1, DO_Photo_extractTransparency);
-	praat_addAction1 (classPhoto, 1, L"Save as PNG file...", 0, 0, DO_Photo_saveAsPNG);
+		praat_addAction1 (classManipulation, 0, U"Replace pitch tier?", 0, 1, DO_Manipulation_replacePitchTier_help);
+		praat_addAction1 (classManipulation, 0, U"Replace duration tier?", 0, 1, DO_Manipulation_replaceDurationTier_help);
+	praat_addAction1 (classManipulation, 1, U"Save as text file without Sound...", 0, 0, DO_Manipulation_writeToTextFileWithoutSound);
+	praat_addAction1 (classManipulation, 1, U"Write to text file without Sound...", 0, praat_HIDDEN, DO_Manipulation_writeToTextFileWithoutSound);
+	praat_addAction1 (classManipulation, 1, U"Save as binary file without Sound...", 0, 0, DO_Manipulation_writeToBinaryFileWithoutSound);
+	praat_addAction1 (classManipulation, 1, U"Write to binary file without Sound...", 0, praat_HIDDEN, DO_Manipulation_writeToBinaryFileWithoutSound);
+
+	praat_addAction1 (classMatrix, 0, U"Matrix help", 0, 0, DO_Matrix_help);
+	praat_addAction1 (classMatrix, 1, U"Save as matrix text file...", 0, 0, DO_Matrix_writeToMatrixTextFile);
+	praat_addAction1 (classMatrix, 1, U"Write to matrix text file...", 0, praat_HIDDEN, DO_Matrix_writeToMatrixTextFile);
+	praat_addAction1 (classMatrix, 1, U"Save as headerless spreadsheet file...", 0, 0, DO_Matrix_writeToHeaderlessSpreadsheetFile);
+	praat_addAction1 (classMatrix, 1, U"Write to headerless spreadsheet file...", 0, praat_HIDDEN, DO_Matrix_writeToHeaderlessSpreadsheetFile);
+	praat_addAction1 (classMatrix, 1, U"Play movie", 0, 0, DO_Matrix_movie);
+	praat_addAction1 (classMatrix, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classMatrix, 0, U"Draw rows...", 0, 1, DO_Matrix_drawRows);
+		praat_addAction1 (classMatrix, 0, U"Draw one contour...", 0, 1, DO_Matrix_drawOneContour);
+		praat_addAction1 (classMatrix, 0, U"Draw contours...", 0, 1, DO_Matrix_drawContours);
+		praat_addAction1 (classMatrix, 0, U"Paint image...", 0, 1, DO_Matrix_paintImage);
+		praat_addAction1 (classMatrix, 0, U"Paint contours...", 0, 1, DO_Matrix_paintContours);
+		praat_addAction1 (classMatrix, 0, U"Paint cells...", 0, 1, DO_Matrix_paintCells);
+		praat_addAction1 (classMatrix, 0, U"Paint surface...", 0, 1, DO_Matrix_paintSurface);
+	praat_addAction1 (classMatrix, 1, U"Query -", 0, 0, 0);
+		praat_addAction1 (classMatrix, 1, U"Get lowest x", 0, 1, DO_Matrix_getLowestX);
+		praat_addAction1 (classMatrix, 1, U"Get highest x", 0, 1, DO_Matrix_getHighestX);
+		praat_addAction1 (classMatrix, 1, U"Get lowest y", 0, 1, DO_Matrix_getLowestY);
+		praat_addAction1 (classMatrix, 1, U"Get highest y", 0, 1, DO_Matrix_getHighestY);
+		praat_addAction1 (classMatrix, 1, U"-- get structure --", 0, 1, 0);
+		praat_addAction1 (classMatrix, 1, U"Get number of rows", 0, 1, DO_Matrix_getNumberOfRows);
+		praat_addAction1 (classMatrix, 1, U"Get number of columns", 0, 1, DO_Matrix_getNumberOfColumns);
+		praat_addAction1 (classMatrix, 1, U"Get row distance", 0, 1, DO_Matrix_getRowDistance);
+		praat_addAction1 (classMatrix, 1, U"Get column distance", 0, 1, DO_Matrix_getColumnDistance);
+		praat_addAction1 (classMatrix, 1, U"Get y of row...", 0, 1, DO_Matrix_getYofRow);
+		praat_addAction1 (classMatrix, 1, U"Get x of column...", 0, 1, DO_Matrix_getXofColumn);
+		praat_addAction1 (classMatrix, 1, U"-- get value --", 0, 1, 0);
+		praat_addAction1 (classMatrix, 1, U"Get value in cell...", 0, 1, DO_Matrix_getValueInCell);
+		praat_addAction1 (classMatrix, 1, U"Get value at xy...", 0, 1, DO_Matrix_getValueAtXY);
+		praat_addAction1 (classMatrix, 1, U"Get minimum", 0, 1, DO_Matrix_getMinimum);
+		praat_addAction1 (classMatrix, 1, U"Get maximum", 0, 1, DO_Matrix_getMaximum);
+		praat_addAction1 (classMatrix, 1, U"Get sum", 0, 1, DO_Matrix_getSum);
+	praat_addAction1 (classMatrix, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classMatrix, 0, U"Formula...", 0, 1, DO_Matrix_formula);
+		praat_addAction1 (classMatrix, 0, U"Set value...", 0, 1, DO_Matrix_setValue);
+praat_addAction1 (classMatrix, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classMatrix, 0, U"Eigen", 0, 0, DO_Matrix_eigen);
+	praat_addAction1 (classMatrix, 0, U"Synthesize", 0, 0, 0);
+	praat_addAction1 (classMatrix, 0, U"Power...", 0, 0, DO_Matrix_power);
+	praat_addAction1 (classMatrix, 0, U"Combine two Matrices -", 0, 0, 0);
+		praat_addAction1 (classMatrix, 2, U"Merge (append rows)", 0, 1, DO_Matrix_appendRows);
+		praat_addAction1 (classMatrix, 2, U"To ParamCurve", 0, 1, DO_Matrix_to_ParamCurve);
+	praat_addAction1 (classMatrix, 0, U"Cast -", 0, 0, 0);
+		praat_addAction1 (classMatrix, 0, U"To Cochleagram", 0, 1, DO_Matrix_to_Cochleagram);
+		praat_addAction1 (classMatrix, 0, U"To Excitation", 0, 1, DO_Matrix_to_Excitation);
+		praat_addAction1 (classMatrix, 0, U"To Harmonicity", 0, 1, DO_Matrix_to_Harmonicity);
+		praat_addAction1 (classMatrix, 0, U"To Intensity", 0, 1, DO_Matrix_to_Intensity);
+		praat_addAction1 (classMatrix, 0, U"To Ltas", 0, 1, DO_Matrix_to_Ltas);
+		praat_addAction1 (classMatrix, 0, U"To Pitch", 0, 1, DO_Matrix_to_Pitch);
+		praat_addAction1 (classMatrix, 0, U"To PointProcess", 0, 1, DO_Matrix_to_PointProcess);
+		praat_addAction1 (classMatrix, 0, U"To Polygon", 0, 1, DO_Matrix_to_Polygon);
+		praat_addAction1 (classMatrix, 0, U"To Sound", 0, 1, DO_Matrix_to_Sound);
+		praat_addAction1 (classMatrix, 0, U"To Sound (slice)...", 0, 1, DO_Matrix_to_Sound_mono);
+		praat_addAction1 (classMatrix, 0, U"To Spectrogram", 0, 1, DO_Matrix_to_Spectrogram);
+		praat_addAction1 (classMatrix, 0, U"To TableOfReal", 0, 1, DO_Matrix_to_TableOfReal);
+		praat_addAction1 (classMatrix, 0, U"To Spectrum", 0, 1, DO_Matrix_to_Spectrum);
+		praat_addAction1 (classMatrix, 0, U"To Transition", 0, 1, DO_Matrix_to_Transition);
+		praat_addAction1 (classMatrix, 0, U"To VocalTract", 0, 1, DO_Matrix_to_VocalTract);
+
+	praat_addAction1 (classMovie, 1, U"Paint one image...", 0, 1, DO_Movie_paintOneImage);
+	praat_addAction1 (classMovie, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_Movie_viewAndEdit);
+
+	praat_addAction1 (classParamCurve, 0, U"ParamCurve help", 0, 0, DO_ParamCurve_help);
+	praat_addAction1 (classParamCurve, 0, U"Draw", 0, 0, 0);
+	praat_addAction1 (classParamCurve, 0, U"Draw...", 0, 0, DO_ParamCurve_draw);
+
+	praat_addAction1 (classPhoto, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classPhoto, 0, U"Paint image...", 0, 1, DO_Photo_paintImage);
+		praat_addAction1 (classPhoto, 0, U"Paint cells...", 0, 1, DO_Photo_paintCells);
+	praat_addAction1 (classPhoto, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classPhoto, 0, U"Formula (red)...", 0, 1, DO_Photo_formula_red);
+		praat_addAction1 (classPhoto, 0, U"Formula (green)...", 0, 1, DO_Photo_formula_green);
+		praat_addAction1 (classPhoto, 0, U"Formula (blue)...", 0, 1, DO_Photo_formula_blue);
+		praat_addAction1 (classPhoto, 0, U"Formula (transparency)...", 0, 1, DO_Photo_formula_transparency);
+	praat_addAction1 (classPhoto, 0, U"Extract -", 0, 0, 0);
+		praat_addAction1 (classPhoto, 0, U"Extract red", 0, 1, DO_Photo_extractRed);
+		praat_addAction1 (classPhoto, 0, U"Extract green", 0, 1, DO_Photo_extractGreen);
+		praat_addAction1 (classPhoto, 0, U"Extract blue", 0, 1, DO_Photo_extractBlue);
+		praat_addAction1 (classPhoto, 0, U"Extract transparency", 0, 1, DO_Photo_extractTransparency);
+	praat_addAction1 (classPhoto, 1, U"Save as PNG file...", 0, 0, DO_Photo_saveAsPNG);
 	#if defined (macintosh) || defined (_WIN32)
-		praat_addAction1 (classPhoto, 1, L"Save as TIFF file...", 0, 0, DO_Photo_saveAsTIFF);
-		praat_addAction1 (classPhoto, 1, L"Save as GIF file...", 0, 0, DO_Photo_saveAsGIF);
-		praat_addAction1 (classPhoto, 1, L"Save as Windows bitmap file...", 0, 0, DO_Photo_saveAsWindowsBitmapFile);
-		praat_addAction1 (classPhoto, 1, L"Save as lossy JPEG file...", 0, 0, DO_Photo_saveAsJPEG);
+		praat_addAction1 (classPhoto, 1, U"Save as TIFF file...", 0, 0, DO_Photo_saveAsTIFF);
+		praat_addAction1 (classPhoto, 1, U"Save as GIF file...", 0, 0, DO_Photo_saveAsGIF);
+		praat_addAction1 (classPhoto, 1, U"Save as Windows bitmap file...", 0, 0, DO_Photo_saveAsWindowsBitmapFile);
+		praat_addAction1 (classPhoto, 1, U"Save as lossy JPEG file...", 0, 0, DO_Photo_saveAsJPEG);
 	#endif
 	#if defined (macintosh)
-		praat_addAction1 (classPhoto, 1, L"Save as JPEG-2000 file...", 0, 0, DO_Photo_saveAsJPEG2000);
-		praat_addAction1 (classPhoto, 1, L"Save as Apple icon file...", 0, 0, DO_Photo_saveAsAppleIconFile);
-		praat_addAction1 (classPhoto, 1, L"Save as Windows icon file...", 0, 0, DO_Photo_saveAsWindowsIconFile);
+		praat_addAction1 (classPhoto, 1, U"Save as JPEG-2000 file...", 0, 0, DO_Photo_saveAsJPEG2000);
+		praat_addAction1 (classPhoto, 1, U"Save as Apple icon file...", 0, 0, DO_Photo_saveAsAppleIconFile);
+		praat_addAction1 (classPhoto, 1, U"Save as Windows icon file...", 0, 0, DO_Photo_saveAsWindowsIconFile);
 	#endif
 
-	praat_addAction1 (classPitch, 0, L"Pitch help", 0, 0, DO_Pitch_help);
-	praat_addAction1 (classPitch, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_Pitch_edit);
-	praat_addAction1 (classPitch, 1, L"Edit", 0, praat_HIDDEN, DO_Pitch_edit);
-	praat_addAction1 (classPitch, 0, L"Sound -", 0, 0, 0);
-		praat_addAction1 (classPitch, 0, L"Play pulses", 0, 1, DO_Pitch_play);
-		praat_addAction1 (classPitch, 0, L"Hum", 0, 1, DO_Pitch_hum);
-		praat_addAction1 (classPitch, 0, L"-- to sound --", 0, 1, 0);
-		praat_addAction1 (classPitch, 0, L"To Sound (pulses)", 0, 1, DO_Pitch_to_Sound_pulses);
-		praat_addAction1 (classPitch, 0, L"To Sound (hum)", 0, 1, DO_Pitch_to_Sound_hum);
-		praat_addAction1 (classPitch, 0, L"To Sound (sine)...", 0, 1, DO_Pitch_to_Sound_sine);
-	praat_addAction1 (classPitch, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classPitch, 0, L"Draw...", 0, 1, DO_Pitch_draw);
-		praat_addAction1 (classPitch, 0, L"Draw logarithmic...", 0, 1, DO_Pitch_drawLogarithmic);
-		praat_addAction1 (classPitch, 0, L"Draw semitones (re 100 Hz)...", 0, 1, DO_Pitch_drawSemitones100);
-		praat_addAction1 (classPitch, 0, L"Draw semitones...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Pitch_drawSemitones100);
-		praat_addAction1 (classPitch, 0, L"Draw semitones (re 200 Hz)...", 0, 1, DO_Pitch_drawSemitones200);
-		praat_addAction1 (classPitch, 0, L"Draw semitones (re 440 Hz)...", 0, 1, DO_Pitch_drawSemitones440);
-		praat_addAction1 (classPitch, 0, L"Draw mel...", 0, 1, DO_Pitch_drawMel);
-		praat_addAction1 (classPitch, 0, L"Draw erb...", 0, 1, DO_Pitch_drawErb);
-		praat_addAction1 (classPitch, 0, L"Speckle...", 0, 1, DO_Pitch_speckle);
-		praat_addAction1 (classPitch, 0, L"Speckle logarithmic...", 0, 1, DO_Pitch_speckleLogarithmic);
-		praat_addAction1 (classPitch, 0, L"Speckle semitones (re 100 Hz)...", 0, 1, DO_Pitch_speckleSemitones100);
-		praat_addAction1 (classPitch, 0, L"Speckle semitones...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Pitch_speckleSemitones100);
-		praat_addAction1 (classPitch, 0, L"Speckle semitones (re 200 Hz)...", 0, 1, DO_Pitch_speckleSemitones200);
-		praat_addAction1 (classPitch, 0, L"Speckle semitones (re 440 Hz)...", 0, 1, DO_Pitch_speckleSemitones440);
-		praat_addAction1 (classPitch, 0, L"Speckle mel...", 0, 1, DO_Pitch_speckleMel);
-		praat_addAction1 (classPitch, 0, L"Speckle erb...", 0, 1, DO_Pitch_speckleErb);
-	praat_addAction1 (classPitch, 0, L"Query -", 0, 0, 0);
+	praat_addAction1 (classPitch, 0, U"Pitch help", 0, 0, DO_Pitch_help);
+	praat_addAction1 (classPitch, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_Pitch_edit);
+	praat_addAction1 (classPitch, 1, U"Edit", 0, praat_HIDDEN, DO_Pitch_edit);
+	praat_addAction1 (classPitch, 0, U"Sound -", 0, 0, 0);
+		praat_addAction1 (classPitch, 0, U"Play pulses", 0, 1, DO_Pitch_play);
+		praat_addAction1 (classPitch, 0, U"Hum", 0, 1, DO_Pitch_hum);
+		praat_addAction1 (classPitch, 0, U"-- to sound --", 0, 1, 0);
+		praat_addAction1 (classPitch, 0, U"To Sound (pulses)", 0, 1, DO_Pitch_to_Sound_pulses);
+		praat_addAction1 (classPitch, 0, U"To Sound (hum)", 0, 1, DO_Pitch_to_Sound_hum);
+		praat_addAction1 (classPitch, 0, U"To Sound (sine)...", 0, 1, DO_Pitch_to_Sound_sine);
+	praat_addAction1 (classPitch, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classPitch, 0, U"Draw...", 0, 1, DO_Pitch_draw);
+		praat_addAction1 (classPitch, 0, U"Draw logarithmic...", 0, 1, DO_Pitch_drawLogarithmic);
+		praat_addAction1 (classPitch, 0, U"Draw semitones (re 100 Hz)...", 0, 1, DO_Pitch_drawSemitones100);
+		praat_addAction1 (classPitch, 0, U"Draw semitones...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Pitch_drawSemitones100);
+		praat_addAction1 (classPitch, 0, U"Draw semitones (re 200 Hz)...", 0, 1, DO_Pitch_drawSemitones200);
+		praat_addAction1 (classPitch, 0, U"Draw semitones (re 440 Hz)...", 0, 1, DO_Pitch_drawSemitones440);
+		praat_addAction1 (classPitch, 0, U"Draw mel...", 0, 1, DO_Pitch_drawMel);
+		praat_addAction1 (classPitch, 0, U"Draw erb...", 0, 1, DO_Pitch_drawErb);
+		praat_addAction1 (classPitch, 0, U"Speckle...", 0, 1, DO_Pitch_speckle);
+		praat_addAction1 (classPitch, 0, U"Speckle logarithmic...", 0, 1, DO_Pitch_speckleLogarithmic);
+		praat_addAction1 (classPitch, 0, U"Speckle semitones (re 100 Hz)...", 0, 1, DO_Pitch_speckleSemitones100);
+		praat_addAction1 (classPitch, 0, U"Speckle semitones...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Pitch_speckleSemitones100);
+		praat_addAction1 (classPitch, 0, U"Speckle semitones (re 200 Hz)...", 0, 1, DO_Pitch_speckleSemitones200);
+		praat_addAction1 (classPitch, 0, U"Speckle semitones (re 440 Hz)...", 0, 1, DO_Pitch_speckleSemitones440);
+		praat_addAction1 (classPitch, 0, U"Speckle mel...", 0, 1, DO_Pitch_speckleMel);
+		praat_addAction1 (classPitch, 0, U"Speckle erb...", 0, 1, DO_Pitch_speckleErb);
+	praat_addAction1 (classPitch, 0, U"Query -", 0, 0, 0);
 		praat_TimeFrameSampled_query_init (classPitch);
-		praat_addAction1 (classPitch, 1, L"-- get content --", 0, 1, 0);
-		praat_addAction1 (classPitch, 1, L"Count voiced frames", 0, 1, DO_Pitch_getNumberOfVoicedFrames);
-		praat_addAction1 (classPitch, 1, L"Get value at time...", 0, 1, DO_Pitch_getValueAtTime);
-		praat_addAction1 (classPitch, 1, L"Get value in frame...", 0, 1, DO_Pitch_getValueInFrame);
-		praat_addAction1 (classPitch, 1, L"-- get extreme --", 0, 1, 0);
-		praat_addAction1 (classPitch, 1, L"Get minimum...", 0, 1, DO_Pitch_getMinimum);
-		praat_addAction1 (classPitch, 1, L"Get time of minimum...", 0, 1, DO_Pitch_getTimeOfMinimum);
-		praat_addAction1 (classPitch, 1, L"Get maximum...", 0, 1, DO_Pitch_getMaximum);
-		praat_addAction1 (classPitch, 1, L"Get time of maximum...", 0, 1, DO_Pitch_getTimeOfMaximum);
-		praat_addAction1 (classPitch, 1, L"-- get statistics --", 0, 1, 0);
-		praat_addAction1 (classPitch, 1, L"Get quantile...", 0, 1, DO_Pitch_getQuantile);
-		/*praat_addAction1 (classPitch, 1, L"Get spreading...", 0, 1, DO_Pitch_getSpreading);*/
-		praat_addAction1 (classPitch, 1, L"Get mean...", 0, 1, DO_Pitch_getMean);
-		praat_addAction1 (classPitch, 1, L"Get standard deviation...", 0, 1, DO_Pitch_getStandardDeviation);
-		praat_addAction1 (classPitch, 1, L"-- get slope --", 0, 1, 0);
-		praat_addAction1 (classPitch, 1, L"Get mean absolute slope...", 0, 1, DO_Pitch_getMeanAbsoluteSlope);
-		praat_addAction1 (classPitch, 1, L"Get slope without octave jumps", 0, 1, DO_Pitch_getMeanAbsSlope_noOctave);
-		praat_addAction1 (classPitch, 2, L"-- query two --", 0, 1, 0);
-		praat_addAction1 (classPitch, 2, L"Count differences", 0, 1, DO_Pitch_difference);
-	praat_addAction1 (classPitch, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classPitch, 1, U"-- get content --", 0, 1, 0);
+		praat_addAction1 (classPitch, 1, U"Count voiced frames", 0, 1, DO_Pitch_getNumberOfVoicedFrames);
+		praat_addAction1 (classPitch, 1, U"Get value at time...", 0, 1, DO_Pitch_getValueAtTime);
+		praat_addAction1 (classPitch, 1, U"Get value in frame...", 0, 1, DO_Pitch_getValueInFrame);
+		praat_addAction1 (classPitch, 1, U"-- get extreme --", 0, 1, 0);
+		praat_addAction1 (classPitch, 1, U"Get minimum...", 0, 1, DO_Pitch_getMinimum);
+		praat_addAction1 (classPitch, 1, U"Get time of minimum...", 0, 1, DO_Pitch_getTimeOfMinimum);
+		praat_addAction1 (classPitch, 1, U"Get maximum...", 0, 1, DO_Pitch_getMaximum);
+		praat_addAction1 (classPitch, 1, U"Get time of maximum...", 0, 1, DO_Pitch_getTimeOfMaximum);
+		praat_addAction1 (classPitch, 1, U"-- get statistics --", 0, 1, 0);
+		praat_addAction1 (classPitch, 1, U"Get quantile...", 0, 1, DO_Pitch_getQuantile);
+		/*praat_addAction1 (classPitch, 1, U"Get spreading...", 0, 1, DO_Pitch_getSpreading);*/
+		praat_addAction1 (classPitch, 1, U"Get mean...", 0, 1, DO_Pitch_getMean);
+		praat_addAction1 (classPitch, 1, U"Get standard deviation...", 0, 1, DO_Pitch_getStandardDeviation);
+		praat_addAction1 (classPitch, 1, U"-- get slope --", 0, 1, 0);
+		praat_addAction1 (classPitch, 1, U"Get mean absolute slope...", 0, 1, DO_Pitch_getMeanAbsoluteSlope);
+		praat_addAction1 (classPitch, 1, U"Get slope without octave jumps", 0, 1, DO_Pitch_getMeanAbsSlope_noOctave);
+		praat_addAction1 (classPitch, 2, U"-- query two --", 0, 1, 0);
+		praat_addAction1 (classPitch, 2, U"Count differences", 0, 1, DO_Pitch_difference);
+	praat_addAction1 (classPitch, 0, U"Modify -", 0, 0, 0);
 		praat_TimeFunction_modify_init (classPitch);
-		praat_addAction1 (classPitch, 0, L"Formula...", 0, 1, DO_Pitch_formula);
-	praat_addAction1 (classPitch, 0, L"Annotate -", 0, 0, 0);
-		praat_addAction1 (classPitch, 0, L"To TextGrid...", 0, 1, DO_Pitch_to_TextGrid);
-		praat_addAction1 (classPitch, 0, L"-- to single tier --", 0, praat_HIDDEN + praat_DEPTH_1, 0);
-		praat_addAction1 (classPitch, 0, L"To TextTier", 0, praat_HIDDEN + praat_DEPTH_1, DO_Pitch_to_TextTier);
-		praat_addAction1 (classPitch, 0, L"To IntervalTier", 0, praat_HIDDEN + praat_DEPTH_1, DO_Pitch_to_IntervalTier);
-	praat_addAction1 (classPitch, 0, L"Analyse -", 0, 0, 0);
-		praat_addAction1 (classPitch, 0, L"To PointProcess", 0, 1, DO_Pitch_to_PointProcess);
-	praat_addAction1 (classPitch, 0, L"Convert -", 0, 0, 0);
-		praat_addAction1 (classPitch, 0, L"Interpolate", 0, 1, DO_Pitch_interpolate);
-		praat_addAction1 (classPitch, 0, L"Smooth...", 0, 1, DO_Pitch_smooth);
-		praat_addAction1 (classPitch, 0, L"Subtract linear fit...", 0, 1, DO_Pitch_subtractLinearFit);
-		praat_addAction1 (classPitch, 0, L"Hack", 0, 1, 0);
-		praat_addAction1 (classPitch, 0, L"Kill octave jumps", 0, 2, DO_Pitch_killOctaveJumps);
-		praat_addAction1 (classPitch, 0, L"-- to other types --", 0, 1, 0);
-		praat_addAction1 (classPitch, 0, L"Down to PitchTier", 0, 1, DO_Pitch_to_PitchTier);
-		praat_addAction1 (classPitch, 0, L"To Matrix", 0, 1, DO_Pitch_to_Matrix);
-
-	praat_addAction1 (classPitchTier, 1, L"Save as PitchTier spreadsheet file...", 0, 0, DO_PitchTier_writeToPitchTierSpreadsheetFile);
-	praat_addAction1 (classPitchTier, 1, L"Write to PitchTier spreadsheet file...", 0, praat_HIDDEN, DO_PitchTier_writeToPitchTierSpreadsheetFile);
-	praat_addAction1 (classPitchTier, 1, L"Save as headerless spreadsheet file...", 0, 0, DO_PitchTier_writeToHeaderlessSpreadsheetFile);
-	praat_addAction1 (classPitchTier, 1, L"Write to headerless spreadsheet file...", 0, praat_HIDDEN, DO_PitchTier_writeToHeaderlessSpreadsheetFile);
-	praat_addAction1 (classPitchTier, 0, L"PitchTier help", 0, 0, DO_PitchTier_help);
-	praat_addAction1 (classPitchTier, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_PitchTier_edit);
-	praat_addAction1 (classPitchTier, 1, L"Edit", 0, praat_HIDDEN, DO_PitchTier_edit);
-	praat_addAction1 (classPitchTier, 0, L"View & Edit with Sound?", 0, 0, DO_info_PitchTier_Sound_edit);
-	praat_addAction1 (classPitchTier, 0, L"Play pulses", 0, 0, DO_PitchTier_play);
-	praat_addAction1 (classPitchTier, 0, L"Hum", 0, 0, DO_PitchTier_hum);
-	praat_addAction1 (classPitchTier, 0, L"Play sine", 0, 0, DO_PitchTier_playSine);
-	praat_addAction1 (classPitchTier, 0, L"Draw...", 0, 0, DO_PitchTier_draw);
-	praat_addAction1 (classPitchTier, 0, L"& Manipulation: Replace?", 0, 0, DO_info_PitchTier_Manipulation_replace);
-	praat_addAction1 (classPitchTier, 0, L"Query -", 0, 0, 0);
+		praat_addAction1 (classPitch, 0, U"Formula...", 0, 1, DO_Pitch_formula);
+	praat_addAction1 (classPitch, 0, U"Annotate -", 0, 0, 0);
+		praat_addAction1 (classPitch, 0, U"To TextGrid...", 0, 1, DO_Pitch_to_TextGrid);
+		praat_addAction1 (classPitch, 0, U"-- to single tier --", 0, praat_HIDDEN + praat_DEPTH_1, 0);
+		praat_addAction1 (classPitch, 0, U"To TextTier", 0, praat_HIDDEN + praat_DEPTH_1, DO_Pitch_to_TextTier);
+		praat_addAction1 (classPitch, 0, U"To IntervalTier", 0, praat_HIDDEN + praat_DEPTH_1, DO_Pitch_to_IntervalTier);
+	praat_addAction1 (classPitch, 0, U"Analyse -", 0, 0, 0);
+		praat_addAction1 (classPitch, 0, U"To PointProcess", 0, 1, DO_Pitch_to_PointProcess);
+	praat_addAction1 (classPitch, 0, U"Convert -", 0, 0, 0);
+		praat_addAction1 (classPitch, 0, U"Interpolate", 0, 1, DO_Pitch_interpolate);
+		praat_addAction1 (classPitch, 0, U"Smooth...", 0, 1, DO_Pitch_smooth);
+		praat_addAction1 (classPitch, 0, U"Subtract linear fit...", 0, 1, DO_Pitch_subtractLinearFit);
+		praat_addAction1 (classPitch, 0, U"Hack", 0, 1, 0);
+		praat_addAction1 (classPitch, 0, U"Kill octave jumps", 0, 2, DO_Pitch_killOctaveJumps);
+		praat_addAction1 (classPitch, 0, U"-- to other types --", 0, 1, 0);
+		praat_addAction1 (classPitch, 0, U"Down to PitchTier", 0, 1, DO_Pitch_to_PitchTier);
+		praat_addAction1 (classPitch, 0, U"To Matrix", 0, 1, DO_Pitch_to_Matrix);
+
+	praat_addAction1 (classPitchTier, 1, U"Save as PitchTier spreadsheet file...", 0, 0, DO_PitchTier_writeToPitchTierSpreadsheetFile);
+	praat_addAction1 (classPitchTier, 1, U"Write to PitchTier spreadsheet file...", 0, praat_HIDDEN, DO_PitchTier_writeToPitchTierSpreadsheetFile);
+	praat_addAction1 (classPitchTier, 1, U"Save as headerless spreadsheet file...", 0, 0, DO_PitchTier_writeToHeaderlessSpreadsheetFile);
+	praat_addAction1 (classPitchTier, 1, U"Write to headerless spreadsheet file...", 0, praat_HIDDEN, DO_PitchTier_writeToHeaderlessSpreadsheetFile);
+	praat_addAction1 (classPitchTier, 0, U"PitchTier help", 0, 0, DO_PitchTier_help);
+	praat_addAction1 (classPitchTier, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_PitchTier_edit);
+	praat_addAction1 (classPitchTier, 1, U"Edit", 0, praat_HIDDEN, DO_PitchTier_edit);
+	praat_addAction1 (classPitchTier, 0, U"View & Edit with Sound?", 0, 0, DO_info_PitchTier_Sound_edit);
+	praat_addAction1 (classPitchTier, 0, U"Play pulses", 0, 0, DO_PitchTier_play);
+	praat_addAction1 (classPitchTier, 0, U"Hum", 0, 0, DO_PitchTier_hum);
+	praat_addAction1 (classPitchTier, 0, U"Play sine", 0, 0, DO_PitchTier_playSine);
+	praat_addAction1 (classPitchTier, 0, U"Draw...", 0, 0, DO_PitchTier_draw);
+	praat_addAction1 (classPitchTier, 0, U"& Manipulation: Replace?", 0, 0, DO_info_PitchTier_Manipulation_replace);
+	praat_addAction1 (classPitchTier, 0, U"Query -", 0, 0, 0);
 		praat_TimeTier_query_init (classPitchTier);
-		praat_addAction1 (classPitchTier, 1, L"-- get content --", 0, 1, 0);
-		praat_addAction1 (classPitchTier, 1, L"Get value at time...", 0, 1, DO_PitchTier_getValueAtTime);
-		praat_addAction1 (classPitchTier, 1, L"Get value at index...", 0, 1, DO_PitchTier_getValueAtIndex);
-		praat_addAction1 (classPitchTier, 1, L"-- get statistics --", 0, 1, 0);
-		praat_addAction1 (classPitchTier, 1, L"Get mean (curve)...", 0, 1, DO_PitchTier_getMean_curve);
-		praat_addAction1 (classPitchTier, 1, L"Get mean (points)...", 0, 1, DO_PitchTier_getMean_points);
-		praat_addAction1 (classPitchTier, 1, L"Get standard deviation (curve)...", 0, 1, DO_PitchTier_getStandardDeviation_curve);
-		praat_addAction1 (classPitchTier, 1, L"Get standard deviation (points)...", 0, 1, DO_PitchTier_getStandardDeviation_points);
-	praat_addAction1 (classPitchTier, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classPitchTier, 1, U"-- get content --", 0, 1, 0);
+		praat_addAction1 (classPitchTier, 1, U"Get value at time...", 0, 1, DO_PitchTier_getValueAtTime);
+		praat_addAction1 (classPitchTier, 1, U"Get value at index...", 0, 1, DO_PitchTier_getValueAtIndex);
+		praat_addAction1 (classPitchTier, 1, U"-- get statistics --", 0, 1, 0);
+		praat_addAction1 (classPitchTier, 1, U"Get mean (curve)...", 0, 1, DO_PitchTier_getMean_curve);
+		praat_addAction1 (classPitchTier, 1, U"Get mean (points)...", 0, 1, DO_PitchTier_getMean_points);
+		praat_addAction1 (classPitchTier, 1, U"Get standard deviation (curve)...", 0, 1, DO_PitchTier_getStandardDeviation_curve);
+		praat_addAction1 (classPitchTier, 1, U"Get standard deviation (points)...", 0, 1, DO_PitchTier_getStandardDeviation_points);
+	praat_addAction1 (classPitchTier, 0, U"Modify -", 0, 0, 0);
 		praat_TimeTier_modify_init (classPitchTier);
-		praat_addAction1 (classPitchTier, 0, L"Add point...", 0, 1, DO_PitchTier_addPoint);
-		praat_addAction1 (classPitchTier, 0, L"Formula...", 0, 1, DO_PitchTier_formula);
-		praat_addAction1 (classPitchTier, 0, L"-- stylize --", 0, 1, 0);
-		praat_addAction1 (classPitchTier, 0, L"Stylize...", 0, 1, DO_PitchTier_stylize);
-		praat_addAction1 (classPitchTier, 0, L"Interpolate quadratically...", 0, 1, DO_PitchTier_interpolateQuadratically);
-		praat_addAction1 (classPitchTier, 0, L"-- modify frequencies --", 0, 1, 0);
-		praat_addAction1 (classPitchTier, 0, L"Shift frequencies...", 0, 1, DO_PitchTier_shiftFrequencies);
-		praat_addAction1 (classPitchTier, 0, L"Multiply frequencies...", 0, 1, DO_PitchTier_multiplyFrequencies);
-	praat_addAction1 (classPitchTier, 0, L"Synthesize -", 0, 0, 0);
-		praat_addAction1 (classPitchTier, 0, L"To PointProcess", 0, 1, DO_PitchTier_to_PointProcess);
-		praat_addAction1 (classPitchTier, 0, L"To Sound (pulse train)...", 0, 1, DO_PitchTier_to_Sound_pulseTrain);
-		praat_addAction1 (classPitchTier, 0, L"To Sound (phonation)...", 0, 1, DO_PitchTier_to_Sound_phonation);
-		praat_addAction1 (classPitchTier, 0, L"To Sound (sine)...", 0, 1, DO_PitchTier_to_Sound_sine);
-	praat_addAction1 (classPitchTier, 0, L"Convert -", 0, 0, 0);
-		praat_addAction1 (classPitchTier, 0, L"Down to PointProcess", 0, 1, DO_PitchTier_downto_PointProcess);
-		praat_addAction1 (classPitchTier, 0, L"Down to TableOfReal...", 0, 1, DO_PitchTier_downto_TableOfReal);
-
-	praat_addAction1 (classPointProcess, 0, L"PointProcess help", 0, 0, DO_PointProcess_help);
-	praat_addAction1 (classPointProcess, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_PointProcess_edit);
-	praat_addAction1 (classPointProcess, 1, L"View & Edit alone", 0, praat_HIDDEN, DO_PointProcess_edit);
-	praat_addAction1 (classPointProcess, 1, L"Edit alone", 0, praat_HIDDEN, DO_PointProcess_edit);
-	praat_addAction1 (classPointProcess, 0, L"View & Edit with Sound?", 0, 0, DO_info_PointProcess_Sound_edit);
-	praat_addAction1 (classPointProcess, 0, L"Play -", 0, 0, 0);
-		praat_addAction1 (classPointProcess, 0, L"Play as pulse train", 0, 1, DO_PointProcess_play);
-		praat_addAction1 (classPointProcess, 0, L"Hum", 0, 1, DO_PointProcess_hum);
-		praat_addAction1 (classPointProcess, 0, L"-- to sound --", 0, 1, 0);
-		praat_addAction1 (classPointProcess, 0, L"To Sound (pulse train)...", 0, 1, DO_PointProcess_to_Sound_pulseTrain);
-		praat_addAction1 (classPointProcess, 0, L"To Sound (phonation)...", 0, 1, DO_PointProcess_to_Sound_phonation);
-		praat_addAction1 (classPointProcess, 0, L"To Sound (hum)", 0, 1, DO_PointProcess_to_Sound_hum);
-	praat_addAction1 (classPointProcess, 0, L"Draw...", 0, 0, DO_PointProcess_draw);
-	praat_addAction1 (classPointProcess, 0, L"Query -", 0, 0, 0);
+		praat_addAction1 (classPitchTier, 0, U"Add point...", 0, 1, DO_PitchTier_addPoint);
+		praat_addAction1 (classPitchTier, 0, U"Formula...", 0, 1, DO_PitchTier_formula);
+		praat_addAction1 (classPitchTier, 0, U"-- stylize --", 0, 1, 0);
+		praat_addAction1 (classPitchTier, 0, U"Stylize...", 0, 1, DO_PitchTier_stylize);
+		praat_addAction1 (classPitchTier, 0, U"Interpolate quadratically...", 0, 1, DO_PitchTier_interpolateQuadratically);
+		praat_addAction1 (classPitchTier, 0, U"-- modify frequencies --", 0, 1, 0);
+		praat_addAction1 (classPitchTier, 0, U"Shift frequencies...", 0, 1, DO_PitchTier_shiftFrequencies);
+		praat_addAction1 (classPitchTier, 0, U"Multiply frequencies...", 0, 1, DO_PitchTier_multiplyFrequencies);
+	praat_addAction1 (classPitchTier, 0, U"Synthesize -", 0, 0, 0);
+		praat_addAction1 (classPitchTier, 0, U"To PointProcess", 0, 1, DO_PitchTier_to_PointProcess);
+		praat_addAction1 (classPitchTier, 0, U"To Sound (pulse train)...", 0, 1, DO_PitchTier_to_Sound_pulseTrain);
+		praat_addAction1 (classPitchTier, 0, U"To Sound (phonation)...", 0, 1, DO_PitchTier_to_Sound_phonation);
+		praat_addAction1 (classPitchTier, 0, U"To Sound (sine)...", 0, 1, DO_PitchTier_to_Sound_sine);
+	praat_addAction1 (classPitchTier, 0, U"Convert -", 0, 0, 0);
+		praat_addAction1 (classPitchTier, 0, U"Down to PointProcess", 0, 1, DO_PitchTier_downto_PointProcess);
+		praat_addAction1 (classPitchTier, 0, U"Down to TableOfReal...", 0, 1, DO_PitchTier_downto_TableOfReal);
+
+	praat_addAction1 (classPointProcess, 0, U"PointProcess help", 0, 0, DO_PointProcess_help);
+	praat_addAction1 (classPointProcess, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_PointProcess_edit);
+	praat_addAction1 (classPointProcess, 1, U"View & Edit alone", 0, praat_HIDDEN, DO_PointProcess_edit);
+	praat_addAction1 (classPointProcess, 1, U"Edit alone", 0, praat_HIDDEN, DO_PointProcess_edit);
+	praat_addAction1 (classPointProcess, 0, U"View & Edit with Sound?", 0, 0, DO_info_PointProcess_Sound_edit);
+	praat_addAction1 (classPointProcess, 0, U"Play -", 0, 0, 0);
+		praat_addAction1 (classPointProcess, 0, U"Play as pulse train", 0, 1, DO_PointProcess_play);
+		praat_addAction1 (classPointProcess, 0, U"Hum", 0, 1, DO_PointProcess_hum);
+		praat_addAction1 (classPointProcess, 0, U"-- to sound --", 0, 1, 0);
+		praat_addAction1 (classPointProcess, 0, U"To Sound (pulse train)...", 0, 1, DO_PointProcess_to_Sound_pulseTrain);
+		praat_addAction1 (classPointProcess, 0, U"To Sound (phonation)...", 0, 1, DO_PointProcess_to_Sound_phonation);
+		praat_addAction1 (classPointProcess, 0, U"To Sound (hum)", 0, 1, DO_PointProcess_to_Sound_hum);
+	praat_addAction1 (classPointProcess, 0, U"Draw...", 0, 0, DO_PointProcess_draw);
+	praat_addAction1 (classPointProcess, 0, U"Query -", 0, 0, 0);
 		praat_TimeFunction_query_init (classPointProcess);
-		praat_addAction1 (classPointProcess, 1, L"-- script get --", 0, 1, 0);
-		praat_addAction1 (classPointProcess, 1, L"Get number of points", 0, 1, DO_PointProcess_getNumberOfPoints);
-		praat_addAction1 (classPointProcess, 1, L"Get low index...", 0, 1, DO_PointProcess_getLowIndex);
-		praat_addAction1 (classPointProcess, 1, L"Get high index...", 0, 1, DO_PointProcess_getHighIndex);
-		praat_addAction1 (classPointProcess, 1, L"Get nearest index...", 0, 1, DO_PointProcess_getNearestIndex);
-		praat_addAction1 (classPointProcess, 1, L"Get time from index...", 0, 1, DO_PointProcess_getTimeFromIndex);
-		praat_addAction1 (classPointProcess, 1, L"Get interval...", 0, 1, DO_PointProcess_getInterval);
-		praat_addAction1 (classPointProcess, 1, L"-- periods --", 0, 1, 0);
-		praat_addAction1 (classPointProcess, 1, L"Get number of periods...", 0, 1, DO_PointProcess_getNumberOfPeriods);
-		praat_addAction1 (classPointProcess, 1, L"Get mean period...", 0, 1, DO_PointProcess_getMeanPeriod);
-		praat_addAction1 (classPointProcess, 1, L"Get stdev period...", 0, 1, DO_PointProcess_getStdevPeriod);
-		praat_addAction1 (classPointProcess, 1, L"Get jitter (local)...", 0, 1, DO_PointProcess_getJitter_local);
-		praat_addAction1 (classPointProcess, 1, L"Get jitter (local, absolute)...", 0, 1, DO_PointProcess_getJitter_local_absolute);
-		praat_addAction1 (classPointProcess, 1, L"Get jitter (rap)...", 0, 1, DO_PointProcess_getJitter_rap);
-		praat_addAction1 (classPointProcess, 1, L"Get jitter (ppq5)...", 0, 1, DO_PointProcess_getJitter_ppq5);
-		praat_addAction1 (classPointProcess, 1, L"Get jitter (ddp)...", 0, 1, DO_PointProcess_getJitter_ddp);
-	praat_addAction1 (classPointProcess, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classPointProcess, 1, U"-- script get --", 0, 1, 0);
+		praat_addAction1 (classPointProcess, 1, U"Get number of points", 0, 1, DO_PointProcess_getNumberOfPoints);
+		praat_addAction1 (classPointProcess, 1, U"Get low index...", 0, 1, DO_PointProcess_getLowIndex);
+		praat_addAction1 (classPointProcess, 1, U"Get high index...", 0, 1, DO_PointProcess_getHighIndex);
+		praat_addAction1 (classPointProcess, 1, U"Get nearest index...", 0, 1, DO_PointProcess_getNearestIndex);
+		praat_addAction1 (classPointProcess, 1, U"Get time from index...", 0, 1, DO_PointProcess_getTimeFromIndex);
+		praat_addAction1 (classPointProcess, 1, U"Get interval...", 0, 1, DO_PointProcess_getInterval);
+		praat_addAction1 (classPointProcess, 1, U"-- periods --", 0, 1, 0);
+		praat_addAction1 (classPointProcess, 1, U"Get number of periods...", 0, 1, DO_PointProcess_getNumberOfPeriods);
+		praat_addAction1 (classPointProcess, 1, U"Get mean period...", 0, 1, DO_PointProcess_getMeanPeriod);
+		praat_addAction1 (classPointProcess, 1, U"Get stdev period...", 0, 1, DO_PointProcess_getStdevPeriod);
+		praat_addAction1 (classPointProcess, 1, U"Get jitter (local)...", 0, 1, DO_PointProcess_getJitter_local);
+		praat_addAction1 (classPointProcess, 1, U"Get jitter (local, absolute)...", 0, 1, DO_PointProcess_getJitter_local_absolute);
+		praat_addAction1 (classPointProcess, 1, U"Get jitter (rap)...", 0, 1, DO_PointProcess_getJitter_rap);
+		praat_addAction1 (classPointProcess, 1, U"Get jitter (ppq5)...", 0, 1, DO_PointProcess_getJitter_ppq5);
+		praat_addAction1 (classPointProcess, 1, U"Get jitter (ddp)...", 0, 1, DO_PointProcess_getJitter_ddp);
+	praat_addAction1 (classPointProcess, 0, U"Modify -", 0, 0, 0);
 		praat_TimeFunction_modify_init (classPointProcess);
-		praat_addAction1 (classPointProcess, 0, L"Add point...", 0, 1, DO_PointProcess_addPoint);
-		praat_addAction1 (classPointProcess, 0, L"Remove point...", 0, 1, DO_PointProcess_removePoint);
-		praat_addAction1 (classPointProcess, 0, L"Remove point near...", 0, 1, DO_PointProcess_removePointNear);
-		praat_addAction1 (classPointProcess, 0, L"Remove points...", 0, 1, DO_PointProcess_removePoints);
-		praat_addAction1 (classPointProcess, 0, L"Remove points between...", 0, 1, DO_PointProcess_removePointsBetween);
-		praat_addAction1 (classPointProcess, 0, L"-- voice --", 0, 1, 0);
-		praat_addAction1 (classPointProcess, 0, L"Fill...", 0, 1, DO_PointProcess_fill);
-		praat_addAction1 (classPointProcess, 0, L"Voice...", 0, 1, DO_PointProcess_voice);
-	praat_addAction1 (classPointProcess, 0, L"Annotate -", 0, 0, 0);
-		praat_addAction1 (classPointProcess, 0, L"To TextGrid...", 0, 1, DO_PointProcess_to_TextGrid);
-		praat_addAction1 (classPointProcess, 0, L"-- to single tier --", 0, 1, 0);
-		praat_addAction1 (classPointProcess, 0, L"To TextTier", 0, 1, DO_PointProcess_to_TextTier);
-		praat_addAction1 (classPointProcess, 0, L"To IntervalTier", 0, 1, DO_PointProcess_to_IntervalTier);
-	praat_addAction1 (classPointProcess, 0, L"Analyse -", 0, 0, 0);
-		praat_addAction1 (classPointProcess, 0, L"To PitchTier...", 0, 1, DO_PointProcess_to_PitchTier);
-		praat_addAction1 (classPointProcess, 0, L"To TextGrid (vuv)...", 0, 1, DO_PointProcess_to_TextGrid_vuv);
-	praat_addAction1 (classPointProcess, 0, L"Convert -", 0, 0, 0);
-		praat_addAction1 (classPointProcess, 0, L"Hack", 0, 1, 0);
-			praat_addAction1 (classPointProcess, 0, L"To Matrix", 0, 2, DO_PointProcess_to_Matrix);
-			praat_addAction1 (classPointProcess, 0, L"Up to TextTier...", 0, 2, DO_PointProcess_upto_TextTier);
-			praat_addAction1 (classPointProcess, 0, L"Up to PitchTier...", 0, 2, DO_PointProcess_upto_PitchTier);
-			praat_addAction1 (classPointProcess, 0, L"Up to IntensityTier...", 0, 2, DO_PointProcess_upto_IntensityTier);
-	praat_addAction1 (classPointProcess, 0, L"Combine -", 0, 0, 0);
-		praat_addAction1 (classPointProcess, 2, L"Union", 0, 1, DO_PointProcess_union);
-		praat_addAction1 (classPointProcess, 2, L"Intersection", 0, 1, DO_PointProcess_intersection);
-		praat_addAction1 (classPointProcess, 2, L"Difference", 0, 1, DO_PointProcess_difference);
-
-	praat_addAction1 (classPolygon, 0, L"Polygon help", 0, 0, DO_Polygon_help);
-praat_addAction1 (classPolygon, 0, L"Draw -", 0, 0, 0);
-	praat_addAction1 (classPolygon, 0, L"Draw...", 0, 1, DO_Polygon_draw);
-	praat_addAction1 (classPolygon, 0, L"Draw closed...", 0, 1, DO_Polygon_drawClosed);
-	praat_addAction1 (classPolygon, 0, L"Paint...", 0, 1, DO_Polygon_paint);
-	praat_addAction1 (classPolygon, 0, L"Draw circles...", 0, 1, DO_Polygon_drawCircles);
-	praat_addAction1 (classPolygon, 0, L"Paint circles...", 0, 1, DO_Polygon_paintCircles);
-	praat_addAction1 (classPolygon, 2, L"Draw connection...", 0, 1, DO_Polygons_drawConnection);
-praat_addAction1 (classPolygon, 0, L"Modify -", 0, 0, 0);
-	praat_addAction1 (classPolygon, 0, L"Randomize", 0, 1, DO_Polygon_randomize);
-	praat_addAction1 (classPolygon, 0, L"Salesperson...", 0, 1, DO_Polygon_salesperson);
-praat_addAction1 (classPolygon, 0, L"Hack -", 0, 0, 0);
-	praat_addAction1 (classPolygon, 0, L"To Matrix", 0, 1, DO_Polygon_to_Matrix);
-
-	praat_addAction1 (classSpectrogram, 0, L"Spectrogram help", 0, 0, DO_Spectrogram_help);
-	praat_addAction1 (classSpectrogram, 1, L"View", 0, 0, DO_Spectrogram_view);
-	praat_addAction1 (classSpectrogram, 1, L"Movie", 0, 0, DO_Spectrogram_movie);
-	praat_addAction1 (classSpectrogram, 0, L"Query -", 0, 0, 0);
+		praat_addAction1 (classPointProcess, 0, U"Add point...", 0, 1, DO_PointProcess_addPoint);
+		praat_addAction1 (classPointProcess, 0, U"Remove point...", 0, 1, DO_PointProcess_removePoint);
+		praat_addAction1 (classPointProcess, 0, U"Remove point near...", 0, 1, DO_PointProcess_removePointNear);
+		praat_addAction1 (classPointProcess, 0, U"Remove points...", 0, 1, DO_PointProcess_removePoints);
+		praat_addAction1 (classPointProcess, 0, U"Remove points between...", 0, 1, DO_PointProcess_removePointsBetween);
+		praat_addAction1 (classPointProcess, 0, U"-- voice --", 0, 1, 0);
+		praat_addAction1 (classPointProcess, 0, U"Fill...", 0, 1, DO_PointProcess_fill);
+		praat_addAction1 (classPointProcess, 0, U"Voice...", 0, 1, DO_PointProcess_voice);
+	praat_addAction1 (classPointProcess, 0, U"Annotate -", 0, 0, 0);
+		praat_addAction1 (classPointProcess, 0, U"To TextGrid...", 0, 1, DO_PointProcess_to_TextGrid);
+		praat_addAction1 (classPointProcess, 0, U"-- to single tier --", 0, 1, 0);
+		praat_addAction1 (classPointProcess, 0, U"To TextTier", 0, 1, DO_PointProcess_to_TextTier);
+		praat_addAction1 (classPointProcess, 0, U"To IntervalTier", 0, 1, DO_PointProcess_to_IntervalTier);
+	praat_addAction1 (classPointProcess, 0, U"Analyse -", 0, 0, 0);
+		praat_addAction1 (classPointProcess, 0, U"To PitchTier...", 0, 1, DO_PointProcess_to_PitchTier);
+		praat_addAction1 (classPointProcess, 0, U"To TextGrid (vuv)...", 0, 1, DO_PointProcess_to_TextGrid_vuv);
+	praat_addAction1 (classPointProcess, 0, U"Convert -", 0, 0, 0);
+		praat_addAction1 (classPointProcess, 0, U"Hack", 0, 1, 0);
+			praat_addAction1 (classPointProcess, 0, U"To Matrix", 0, 2, DO_PointProcess_to_Matrix);
+			praat_addAction1 (classPointProcess, 0, U"Up to TextTier...", 0, 2, DO_PointProcess_upto_TextTier);
+			praat_addAction1 (classPointProcess, 0, U"Up to PitchTier...", 0, 2, DO_PointProcess_upto_PitchTier);
+			praat_addAction1 (classPointProcess, 0, U"Up to IntensityTier...", 0, 2, DO_PointProcess_upto_IntensityTier);
+	praat_addAction1 (classPointProcess, 0, U"Combine -", 0, 0, 0);
+		praat_addAction1 (classPointProcess, 2, U"Union", 0, 1, DO_PointProcess_union);
+		praat_addAction1 (classPointProcess, 2, U"Intersection", 0, 1, DO_PointProcess_intersection);
+		praat_addAction1 (classPointProcess, 2, U"Difference", 0, 1, DO_PointProcess_difference);
+
+	praat_addAction1 (classPolygon, 0, U"Polygon help", 0, 0, DO_Polygon_help);
+praat_addAction1 (classPolygon, 0, U"Draw -", 0, 0, 0);
+	praat_addAction1 (classPolygon, 0, U"Draw...", 0, 1, DO_Polygon_draw);
+	praat_addAction1 (classPolygon, 0, U"Draw closed...", 0, 1, DO_Polygon_drawClosed);
+	praat_addAction1 (classPolygon, 0, U"Paint...", 0, 1, DO_Polygon_paint);
+	praat_addAction1 (classPolygon, 0, U"Draw circles...", 0, 1, DO_Polygon_drawCircles);
+	praat_addAction1 (classPolygon, 0, U"Paint circles...", 0, 1, DO_Polygon_paintCircles);
+	praat_addAction1 (classPolygon, 2, U"Draw connection...", 0, 1, DO_Polygons_drawConnection);
+praat_addAction1 (classPolygon, 0, U"Modify -", 0, 0, 0);
+	praat_addAction1 (classPolygon, 0, U"Randomize", 0, 1, DO_Polygon_randomize);
+	praat_addAction1 (classPolygon, 0, U"Salesperson...", 0, 1, DO_Polygon_salesperson);
+praat_addAction1 (classPolygon, 0, U"Hack -", 0, 0, 0);
+	praat_addAction1 (classPolygon, 0, U"To Matrix", 0, 1, DO_Polygon_to_Matrix);
+
+	praat_addAction1 (classSpectrogram, 0, U"Spectrogram help", 0, 0, DO_Spectrogram_help);
+	praat_addAction1 (classSpectrogram, 1, U"View", 0, 0, DO_Spectrogram_view);
+	praat_addAction1 (classSpectrogram, 1, U"Movie", 0, 0, DO_Spectrogram_movie);
+	praat_addAction1 (classSpectrogram, 0, U"Query -", 0, 0, 0);
 		praat_TimeFrameSampled_query_init (classSpectrogram);
-		praat_addAction1 (classSpectrogram, 1, L"Get power at...", 0, 1, DO_Spectrogram_getPowerAt);
-	praat_addAction1 (classSpectrogram, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classSpectrogram, 0, L"Paint...", 0, 1, DO_Spectrogram_paint);
-	praat_addAction1 (classSpectrogram, 0, L"Analyse -", 0, 0, 0);
-		praat_addAction1 (classSpectrogram, 0, L"To Spectrum (slice)...", 0, 1, DO_Spectrogram_to_Spectrum);
-	praat_addAction1 (classSpectrogram, 0, L"Synthesize -", 0, 0, 0);
-		praat_addAction1 (classSpectrogram, 0, L"To Sound...", 0, 1, DO_Spectrogram_to_Sound);
-	praat_addAction1 (classSpectrogram, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classSpectrogram, 1, U"Get power at...", 0, 1, DO_Spectrogram_getPowerAt);
+	praat_addAction1 (classSpectrogram, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classSpectrogram, 0, U"Paint...", 0, 1, DO_Spectrogram_paint);
+	praat_addAction1 (classSpectrogram, 0, U"Analyse -", 0, 0, 0);
+		praat_addAction1 (classSpectrogram, 0, U"To Spectrum (slice)...", 0, 1, DO_Spectrogram_to_Spectrum);
+	praat_addAction1 (classSpectrogram, 0, U"Synthesize -", 0, 0, 0);
+		praat_addAction1 (classSpectrogram, 0, U"To Sound...", 0, 1, DO_Spectrogram_to_Sound);
+	praat_addAction1 (classSpectrogram, 0, U"Modify -", 0, 0, 0);
 		praat_TimeFunction_modify_init (classSpectrogram);
-		praat_addAction1 (classSpectrogram, 0, L"Formula...", 0, 1, DO_Spectrogram_formula);
-	praat_addAction1 (classSpectrogram, 0, L"Hack -", 0, 0, 0);
-		praat_addAction1 (classSpectrogram, 0, L"To Matrix", 0, 1, DO_Spectrogram_to_Matrix);
-
-	praat_addAction1 (classSpectrum, 0, L"Spectrum help", 0, 0, DO_Spectrum_help);
-	praat_addAction1 (classSpectrum, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_Spectrum_edit);
-	praat_addAction1 (classSpectrum, 1, L"Edit", 0, praat_HIDDEN, DO_Spectrum_edit);
-	praat_addAction1 (classSpectrum, 0, L"Sound -", 0, 0, 0);
-		praat_addAction1 (classSpectrum, 0, L"To Sound", 0, 1, DO_Spectrum_to_Sound);
-						praat_addAction1 (classSpectrum, 0, L"To Sound (fft)", 0, praat_HIDDEN + praat_DEPTH_1, DO_Spectrum_to_Sound);
-	praat_addAction1 (classSpectrum, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classSpectrum, 0, L"Draw...", 0, 1, DO_Spectrum_draw);
-		praat_addAction1 (classSpectrum, 0, L"Draw (log freq)...", 0, 1, DO_Spectrum_drawLogFreq);
-	praat_addAction1 (classSpectrum, 1, L"Tabulate -", 0, 0, 0);
-		praat_addAction1 (classSpectrum, 1, L"List...", 0, 1, DO_Spectrum_list);
-	praat_addAction1 (classSpectrum, 1, L"Query -", 0, 0, 0);
-		praat_addAction1 (classSpectrum, 1, L"Frequency domain", 0, 1, 0);
-			praat_addAction1 (classSpectrum, 1, L"Get lowest frequency", 0, 2, DO_Spectrum_getLowestFrequency);
-			praat_addAction1 (classSpectrum, 1, L"Get highest frequency", 0, 2, DO_Spectrum_getHighestFrequency);
-		praat_addAction1 (classSpectrum, 1, L"Frequency sampling", 0, 1, 0);
-			praat_addAction1 (classSpectrum, 1, L"Get number of bins", 0, 2, DO_Spectrum_getNumberOfBins);
-			praat_addAction1 (classSpectrum, 1, L"Get bin width", 0, 2, DO_Spectrum_getBinWidth);
-			praat_addAction1 (classSpectrum, 1, L"Get frequency from bin number...", 0, 2, DO_Spectrum_getFrequencyFromBin);
-						praat_addAction1 (classSpectrum, 1, L"Get frequency from bin...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Spectrum_getFrequencyFromBin);
-			praat_addAction1 (classSpectrum, 1, L"Get bin number from frequency...", 0, 2, DO_Spectrum_getBinFromFrequency);
-						praat_addAction1 (classSpectrum, 1, L"Get bin from frequency...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Spectrum_getBinFromFrequency);
-		praat_addAction1 (classSpectrum, 1, L"-- get content --", 0, 1, 0);
-		praat_addAction1 (classSpectrum, 1, L"Get real value in bin...", 0, 1, DO_Spectrum_getRealValueInBin);
-		praat_addAction1 (classSpectrum, 1, L"Get imaginary value in bin...", 0, 1, DO_Spectrum_getImaginaryValueInBin);
-		praat_addAction1 (classSpectrum, 1, L"-- get energy --", 0, 1, 0);
-		praat_addAction1 (classSpectrum, 1, L"Get band energy...", 0, 1, DO_Spectrum_getBandEnergy);
-		praat_addAction1 (classSpectrum, 1, L"Get band density...", 0, 1, DO_Spectrum_getBandDensity);
-		praat_addAction1 (classSpectrum, 1, L"Get band energy difference...", 0, 1, DO_Spectrum_getBandEnergyDifference);
-		praat_addAction1 (classSpectrum, 1, L"Get band density difference...", 0, 1, DO_Spectrum_getBandDensityDifference);
-		praat_addAction1 (classSpectrum, 1, L"-- get moments --", 0, 1, 0);
-		praat_addAction1 (classSpectrum, 1, L"Get centre of gravity...", 0, 1, DO_Spectrum_getCentreOfGravity);
-		praat_addAction1 (classSpectrum, 1, L"Get standard deviation...", 0, 1, DO_Spectrum_getStandardDeviation);
-		praat_addAction1 (classSpectrum, 1, L"Get skewness...", 0, 1, DO_Spectrum_getSkewness);
-		praat_addAction1 (classSpectrum, 1, L"Get kurtosis...", 0, 1, DO_Spectrum_getKurtosis);
-		praat_addAction1 (classSpectrum, 1, L"Get central moment...", 0, 1, DO_Spectrum_getCentralMoment);
-	praat_addAction1 (classSpectrum, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classSpectrum, 0, L"Formula...", 0, 1, DO_Spectrum_formula);
-		praat_addAction1 (classSpectrum, 0, L"Filter (pass Hann band)...", 0, 1, DO_Spectrum_passHannBand);
-		praat_addAction1 (classSpectrum, 0, L"Filter (stop Hann band)...", 0, 1, DO_Spectrum_stopHannBand);
-	praat_addAction1 (classSpectrum, 0, L"Analyse -", 0, 0, 0);
-		praat_addAction1 (classSpectrum, 0, L"To Excitation...", 0, 1, DO_Spectrum_to_Excitation);
-		praat_addAction1 (classSpectrum, 0, L"To SpectrumTier (peaks)", 0, 1, DO_Spectrum_to_SpectrumTier_peaks);
-		praat_addAction1 (classSpectrum, 0, L"To Formant (peaks)...", 0, 1, DO_Spectrum_to_Formant_peaks);
-		praat_addAction1 (classSpectrum, 0, L"To Ltas...", 0, 1, DO_Spectrum_to_Ltas);
-		praat_addAction1 (classSpectrum, 0, L"To Ltas (1-to-1)", 0, 1, DO_Spectrum_to_Ltas_1to1);
-		praat_addAction1 (classSpectrum, 0, L"To Spectrogram", 0, 1, DO_Spectrum_to_Spectrogram);
-	praat_addAction1 (classSpectrum, 0, L"Convert -", 0, 0, 0);
-		praat_addAction1 (classSpectrum, 0, L"Cepstral smoothing...", 0, 1, DO_Spectrum_cepstralSmoothing);
-		praat_addAction1 (classSpectrum, 0, L"LPC smoothing...", 0, 1, DO_Spectrum_lpcSmoothing);
-		praat_addAction1 (classSpectrum, 0, L"Hack", 0, 1, 0);
-			praat_addAction1 (classSpectrum, 0, L"To Matrix", 0, 2, DO_Spectrum_to_Matrix);
-
-	praat_addAction1 (classSpectrumTier, 0, L"Draw...", 0, 0, DO_SpectrumTier_draw);
-	praat_addAction1 (classSpectrumTier, 0, L"Tabulate -", 0, 0, 0);
-		praat_addAction1 (classSpectrumTier, 1, L"List...", 0, 1, DO_SpectrumTier_list);
-		praat_addAction1 (classSpectrumTier, 0, L"Down to Table", 0, 1, DO_SpectrumTier_downto_Table);
-	praat_addAction1 (classSpectrumTier, 0, L"Remove points below...", 0, 0, DO_SpectrumTier_removePointsBelow);
-
-	praat_addAction1 (classStrings, 0, L"Strings help", 0, 0, DO_Strings_help);
-	praat_addAction1 (classStrings, 1, L"Save as raw text file...", 0, 0, DO_Strings_writeToRawTextFile);
-	praat_addAction1 (classStrings, 1, L"Write to raw text file...", 0, praat_HIDDEN, DO_Strings_writeToRawTextFile);
-	praat_addAction1 (classStrings, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_Strings_edit);
-	praat_addAction1 (classStrings, 1, L"Edit", 0, praat_HIDDEN, DO_Strings_edit);
-	praat_addAction1 (classStrings, 0, L"Query -", 0, 0, 0);
-		praat_addAction1 (classStrings, 2, L"Equal?", 0, 1, DO_Strings_equal);
-		praat_addAction1 (classStrings, 1, L"Get number of strings", 0, 1, DO_Strings_getNumberOfStrings);
-		praat_addAction1 (classStrings, 1, L"Get string...", 0, 1, DO_Strings_getString);
-	praat_addAction1 (classStrings, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classStrings, 0, L"Set string...", 0, 1, DO_Strings_setString);
-		praat_addAction1 (classStrings, 0, L"Insert string...", 0, 1, DO_Strings_insertString);
-		praat_addAction1 (classStrings, 0, L"Remove string...", 0, 1, DO_Strings_removeString);
-		praat_addAction1 (classStrings, 0, L"-- modify order --", 0, 1, 0);
-		praat_addAction1 (classStrings, 0, L"Randomize", 0, 1, DO_Strings_randomize);
-		praat_addAction1 (classStrings, 0, L"Sort", 0, 1, DO_Strings_sort);
-		praat_addAction1 (classStrings, 0, L"-- convert --", 0, 1, 0);
-		praat_addAction1 (classStrings, 0, L"Replace all...", 0, 1, DO_Strings_replaceAll);
-		praat_addAction1 (classStrings, 0, L"Genericize", 0, 1, DO_Strings_genericize);
-		praat_addAction1 (classStrings, 0, L"Nativize", 0, 1, DO_Strings_nativize);
-	praat_addAction1 (classStrings, 0, L"Analyze", 0, 0, 0);
-		praat_addAction1 (classStrings, 0, L"To Distributions", 0, 0, DO_Strings_to_Distributions);
-	praat_addAction1 (classStrings, 0, L"Synthesize", 0, 0, 0);
-		praat_addAction1 (classStrings, 0, L"To WordList", 0, 0, DO_Strings_to_WordList);
-
-	praat_addAction1 (classTable, 0, L"Down to Matrix", 0, 0, DO_Table_to_Matrix);
-
-	praat_addAction1 (classTransition, 0, L"Transition help", 0, 0, DO_Transition_help);
-praat_addAction1 (classTransition, 0, L"Draw", 0, 0, 0);
-	praat_addAction1 (classTransition, 0, L"Draw as numbers...", 0, 0, DO_Transition_drawAsNumbers);
-praat_addAction1 (classTransition, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classTransition, 0, L"Eigen", 0, 0, DO_Transition_eigen);
-	praat_addAction1 (classTransition, 0, L"Conflate", 0, 0, DO_Transition_conflate);
-praat_addAction1 (classTransition, 0, L"Synthesize", 0, 0, 0);
-	praat_addAction1 (classTransition, 0, L"Power...", 0, 0, DO_Transition_power);
-praat_addAction1 (classTransition, 0, L"Cast", 0, 0, 0);
-	praat_addAction1 (classTransition, 0, L"To Matrix", 0, 0, DO_Transition_to_Matrix);
-
-	praat_addAction2 (classAmplitudeTier, 1, classSound, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_AmplitudeTier_edit);
-	praat_addAction2 (classAmplitudeTier, 1, classSound, 1, L"Edit", 0, praat_HIDDEN, DO_AmplitudeTier_edit);   // hidden 2011
-	praat_addAction2 (classAmplitudeTier, 1, classSound, 1, L"Multiply", 0, 0, DO_Sound_AmplitudeTier_multiply);
-	praat_addAction2 (classDistributions, 1, classTransition, 1, L"Map", 0, 0, DO_Distributions_Transition_map);
-	praat_addAction2 (classDistributions, 1, classTransition, 1, L"To Transition...", 0, 0, DO_Distributions_to_Transition_adj);
-	praat_addAction2 (classDistributions, 2, classTransition, 1, L"To Transition (noise)...", 0, 0, DO_Distributions_to_Transition_noise_adj);
-	praat_addAction2 (classDurationTier, 1, classSound, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_DurationTier_edit);
-	praat_addAction2 (classDurationTier, 1, classSound, 1, L"Edit", 0, praat_HIDDEN, DO_DurationTier_edit);
-	praat_addAction2 (classFormant, 1, classPointProcess, 1, L"To FormantTier", 0, 0, DO_Formant_PointProcess_to_FormantTier);
-	praat_addAction2 (classFormant, 1, classSound, 1, L"Filter", 0, 0, DO_Sound_Formant_filter);
-	praat_addAction2 (classFormant, 1, classSound, 1, L"Filter (no scale)", 0, 0, DO_Sound_Formant_filter_noscale);
-	praat_addAction2 (classFormantGrid, 1, classSound, 1, L"Filter", 0, 0, DO_Sound_FormantGrid_filter);
-	praat_addAction2 (classFormantGrid, 1, classSound, 1, L"Filter (no scale)", 0, 0, DO_Sound_FormantGrid_filter_noscale);
-	praat_addAction2 (classFormantTier, 1, classSound, 1, L"Filter", 0, 0, DO_Sound_FormantTier_filter);
-	praat_addAction2 (classFormantTier, 1, classSound, 1, L"Filter (no scale)", 0, 0, DO_Sound_FormantTier_filter_noscale);
-	praat_addAction2 (classIntensity, 1, classPitch, 1, L"Draw", 0, 0, 0);
-	praat_addAction2 (classIntensity, 1, classPitch, 1, L"Draw (phonetogram)...", 0, 0, DO_Pitch_Intensity_draw);
-	praat_addAction2 (classIntensity, 1, classPitch, 1, L"Speckle (phonetogram)...", 0, praat_HIDDEN, DO_Pitch_Intensity_speckle);   /* grandfathered 2005 */
-	praat_addAction2 (classIntensity, 1, classPointProcess, 1, L"To IntensityTier", 0, 0, DO_Intensity_PointProcess_to_IntensityTier);
-	praat_addAction2 (classIntensityTier, 1, classPointProcess, 1, L"To IntensityTier", 0, 0, DO_IntensityTier_PointProcess_to_IntensityTier);
-	praat_addAction2 (classIntensityTier, 1, classSound, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_IntensityTier_edit);
-	praat_addAction2 (classIntensityTier, 1, classSound, 1, L"Edit", 0, praat_HIDDEN, DO_IntensityTier_edit);
-	praat_addAction2 (classIntensityTier, 1, classSound, 1, L"Multiply", 0, praat_HIDDEN, DO_Sound_IntensityTier_multiply_old);
-	praat_addAction2 (classIntensityTier, 1, classSound, 1, L"Multiply...", 0, 0, DO_Sound_IntensityTier_multiply);
-	praat_addAction2 (classManipulation, 1, classSound, 1, L"Replace original sound", 0, 0, DO_Manipulation_replaceOriginalSound);
-	praat_addAction2 (classManipulation, 1, classPointProcess, 1, L"Replace pulses", 0, 0, DO_Manipulation_replacePulses);
-	praat_addAction2 (classManipulation, 1, classPitchTier, 1, L"Replace pitch tier", 0, 0, DO_Manipulation_replacePitchTier);
-	praat_addAction2 (classManipulation, 1, classDurationTier, 1, L"Replace duration tier", 0, 0, DO_Manipulation_replaceDurationTier);
-	praat_addAction2 (classManipulation, 1, classTextTier, 1, L"To Manipulation", 0, 0, DO_Manipulation_TextTier_to_Manipulation);
-	praat_addAction2 (classMatrix, 1, classSound, 1, L"To ParamCurve", 0, 0, DO_Matrix_to_ParamCurve);
-	praat_addAction2 (classPhoto, 1, classMatrix, 1, L"Replace red", 0, 0, DO_Photo_Matrix_replaceRed);
-	praat_addAction2 (classPhoto, 1, classMatrix, 1, L"Replace green", 0, 0, DO_Photo_Matrix_replaceGreen);
-	praat_addAction2 (classPhoto, 1, classMatrix, 1, L"Replace blue", 0, 0, DO_Photo_Matrix_replaceBlue);
-	praat_addAction2 (classPhoto, 1, classMatrix, 1, L"Replace transparency", 0, 0, DO_Photo_Matrix_replaceTransparency);
-	praat_addAction2 (classPitch, 1, classPitchTier, 1, L"Draw...", 0, 0, DO_PitchTier_Pitch_draw);
-	praat_addAction2 (classPitch, 1, classPitchTier, 1, L"To Pitch", 0, 0, DO_Pitch_PitchTier_to_Pitch);
-	praat_addAction2 (classPitch, 1, classPointProcess, 1, L"To PitchTier", 0, 0, DO_Pitch_PointProcess_to_PitchTier);
-	praat_addAction3 (classPitch, 1, classPointProcess, 1, classSound, 1, L"Voice report...", 0, 0, DO_Sound_Pitch_PointProcess_voiceReport);
-	praat_addAction2 (classPitch, 1, classSound, 1, L"To PointProcess (cc)", 0, 0, DO_Sound_Pitch_to_PointProcess_cc);
-	praat_addAction2 (classPitch, 1, classSound, 1, L"To PointProcess (peaks)...", 0, 0, DO_Sound_Pitch_to_PointProcess_peaks);
-	praat_addAction2 (classPitch, 1, classSound, 1, L"To Manipulation", 0, 0, DO_Sound_Pitch_to_Manipulation);
-	praat_addAction2 (classPitchTier, 1, classPointProcess, 1, L"To PitchTier", 0, 0, DO_PitchTier_PointProcess_to_PitchTier);
-	praat_addAction2 (classPitchTier, 1, classSound, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_PitchTier_edit);
-	praat_addAction2 (classPitchTier, 1, classSound, 1, L"Edit", 0, praat_HIDDEN, DO_PitchTier_edit);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_PointProcess_edit);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"Edit", 0, praat_HIDDEN, DO_PointProcess_edit);
-praat_addAction2 (classPointProcess, 1, classSound, 1, L"Query", 0, 0, 0);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"Get shimmer (local)...", 0, 0, DO_Point_Sound_getShimmer_local);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"Get shimmer (local_dB)...", 0, 0, DO_Point_Sound_getShimmer_local_dB);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"Get shimmer (apq3)...", 0, 0, DO_Point_Sound_getShimmer_apq3);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"Get shimmer (apq5)...", 0, 0, DO_Point_Sound_getShimmer_apq5);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"Get shimmer (apq11)...", 0, 0, DO_Point_Sound_getShimmer_apq11);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"Get shimmer (dda)...", 0, 0, DO_Point_Sound_getShimmer_dda);
-praat_addAction2 (classPointProcess, 1, classSound, 1, L"Modify", 0, 0, 0);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"Transplant time domain", 0, 0, DO_Point_Sound_transplantDomain);
-praat_addAction2 (classPointProcess, 1, classSound, 1, L"Analyse", 0, 0, 0);
-	/*praat_addAction2 (classPointProcess, 1, classSound, 1, L"To Manipulation", 0, 0, DO_Sound_PointProcess_to_Manipulation);*/
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"To AmplitudeTier (point)", 0, 0, DO_PointProcess_Sound_to_AmplitudeTier_point);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"To AmplitudeTier (period)...", 0, 0, DO_PointProcess_Sound_to_AmplitudeTier_period);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"To Ltas...", 0, 0, DO_PointProcess_Sound_to_Ltas);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"To Ltas (only harmonics)...", 0, 0, DO_PointProcess_Sound_to_Ltas_harmonics);
-praat_addAction2 (classPointProcess, 1, classSound, 1, L"Synthesize", 0, 0, 0);
-	praat_addAction2 (classPointProcess, 1, classSound, 1, L"To Sound ensemble...", 0, 0, DO_Sound_PointProcess_to_SoundEnsemble_correlate);
-
-	praat_addAction4 (classDurationTier, 1, classPitchTier, 1, classPointProcess, 1, classSound, 1, L"To Sound...", 0, 0, DO_Sound_Point_Pitch_Duration_to_Sound);
+		praat_addAction1 (classSpectrogram, 0, U"Formula...", 0, 1, DO_Spectrogram_formula);
+	praat_addAction1 (classSpectrogram, 0, U"Hack -", 0, 0, 0);
+		praat_addAction1 (classSpectrogram, 0, U"To Matrix", 0, 1, DO_Spectrogram_to_Matrix);
+
+	praat_addAction1 (classSpectrum, 0, U"Spectrum help", 0, 0, DO_Spectrum_help);
+	praat_addAction1 (classSpectrum, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_Spectrum_edit);
+	praat_addAction1 (classSpectrum, 1, U"Edit", 0, praat_HIDDEN, DO_Spectrum_edit);
+	praat_addAction1 (classSpectrum, 0, U"Sound -", 0, 0, 0);
+		praat_addAction1 (classSpectrum, 0, U"To Sound", 0, 1, DO_Spectrum_to_Sound);
+						praat_addAction1 (classSpectrum, 0, U"To Sound (fft)", 0, praat_HIDDEN + praat_DEPTH_1, DO_Spectrum_to_Sound);
+	praat_addAction1 (classSpectrum, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classSpectrum, 0, U"Draw...", 0, 1, DO_Spectrum_draw);
+		praat_addAction1 (classSpectrum, 0, U"Draw (log freq)...", 0, 1, DO_Spectrum_drawLogFreq);
+	praat_addAction1 (classSpectrum, 1, U"Tabulate -", 0, 0, 0);
+		praat_addAction1 (classSpectrum, 1, U"List...", 0, 1, DO_Spectrum_list);
+	praat_addAction1 (classSpectrum, 1, U"Query -", 0, 0, 0);
+		praat_addAction1 (classSpectrum, 1, U"Frequency domain", 0, 1, 0);
+			praat_addAction1 (classSpectrum, 1, U"Get lowest frequency", 0, 2, DO_Spectrum_getLowestFrequency);
+			praat_addAction1 (classSpectrum, 1, U"Get highest frequency", 0, 2, DO_Spectrum_getHighestFrequency);
+		praat_addAction1 (classSpectrum, 1, U"Frequency sampling", 0, 1, 0);
+			praat_addAction1 (classSpectrum, 1, U"Get number of bins", 0, 2, DO_Spectrum_getNumberOfBins);
+			praat_addAction1 (classSpectrum, 1, U"Get bin width", 0, 2, DO_Spectrum_getBinWidth);
+			praat_addAction1 (classSpectrum, 1, U"Get frequency from bin number...", 0, 2, DO_Spectrum_getFrequencyFromBin);
+						praat_addAction1 (classSpectrum, 1, U"Get frequency from bin...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Spectrum_getFrequencyFromBin);
+			praat_addAction1 (classSpectrum, 1, U"Get bin number from frequency...", 0, 2, DO_Spectrum_getBinFromFrequency);
+						praat_addAction1 (classSpectrum, 1, U"Get bin from frequency...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Spectrum_getBinFromFrequency);
+		praat_addAction1 (classSpectrum, 1, U"-- get content --", 0, 1, 0);
+		praat_addAction1 (classSpectrum, 1, U"Get real value in bin...", 0, 1, DO_Spectrum_getRealValueInBin);
+		praat_addAction1 (classSpectrum, 1, U"Get imaginary value in bin...", 0, 1, DO_Spectrum_getImaginaryValueInBin);
+		praat_addAction1 (classSpectrum, 1, U"-- get energy --", 0, 1, 0);
+		praat_addAction1 (classSpectrum, 1, U"Get band energy...", 0, 1, DO_Spectrum_getBandEnergy);
+		praat_addAction1 (classSpectrum, 1, U"Get band density...", 0, 1, DO_Spectrum_getBandDensity);
+		praat_addAction1 (classSpectrum, 1, U"Get band energy difference...", 0, 1, DO_Spectrum_getBandEnergyDifference);
+		praat_addAction1 (classSpectrum, 1, U"Get band density difference...", 0, 1, DO_Spectrum_getBandDensityDifference);
+		praat_addAction1 (classSpectrum, 1, U"-- get moments --", 0, 1, 0);
+		praat_addAction1 (classSpectrum, 1, U"Get centre of gravity...", 0, 1, DO_Spectrum_getCentreOfGravity);
+		praat_addAction1 (classSpectrum, 1, U"Get standard deviation...", 0, 1, DO_Spectrum_getStandardDeviation);
+		praat_addAction1 (classSpectrum, 1, U"Get skewness...", 0, 1, DO_Spectrum_getSkewness);
+		praat_addAction1 (classSpectrum, 1, U"Get kurtosis...", 0, 1, DO_Spectrum_getKurtosis);
+		praat_addAction1 (classSpectrum, 1, U"Get central moment...", 0, 1, DO_Spectrum_getCentralMoment);
+	praat_addAction1 (classSpectrum, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classSpectrum, 0, U"Formula...", 0, 1, DO_Spectrum_formula);
+		praat_addAction1 (classSpectrum, 0, U"Filter (pass Hann band)...", 0, 1, DO_Spectrum_passHannBand);
+		praat_addAction1 (classSpectrum, 0, U"Filter (stop Hann band)...", 0, 1, DO_Spectrum_stopHannBand);
+	praat_addAction1 (classSpectrum, 0, U"Analyse -", 0, 0, 0);
+		praat_addAction1 (classSpectrum, 0, U"To Excitation...", 0, 1, DO_Spectrum_to_Excitation);
+		praat_addAction1 (classSpectrum, 0, U"To SpectrumTier (peaks)", 0, 1, DO_Spectrum_to_SpectrumTier_peaks);
+		praat_addAction1 (classSpectrum, 0, U"To Formant (peaks)...", 0, 1, DO_Spectrum_to_Formant_peaks);
+		praat_addAction1 (classSpectrum, 0, U"To Ltas...", 0, 1, DO_Spectrum_to_Ltas);
+		praat_addAction1 (classSpectrum, 0, U"To Ltas (1-to-1)", 0, 1, DO_Spectrum_to_Ltas_1to1);
+		praat_addAction1 (classSpectrum, 0, U"To Spectrogram", 0, 1, DO_Spectrum_to_Spectrogram);
+	praat_addAction1 (classSpectrum, 0, U"Convert -", 0, 0, 0);
+		praat_addAction1 (classSpectrum, 0, U"Cepstral smoothing...", 0, 1, DO_Spectrum_cepstralSmoothing);
+		praat_addAction1 (classSpectrum, 0, U"LPC smoothing...", 0, 1, DO_Spectrum_lpcSmoothing);
+		praat_addAction1 (classSpectrum, 0, U"Hack", 0, 1, 0);
+			praat_addAction1 (classSpectrum, 0, U"To Matrix", 0, 2, DO_Spectrum_to_Matrix);
+
+	praat_addAction1 (classSpectrumTier, 0, U"Draw...", 0, 0, DO_SpectrumTier_draw);
+	praat_addAction1 (classSpectrumTier, 0, U"Tabulate -", 0, 0, 0);
+		praat_addAction1 (classSpectrumTier, 1, U"List...", 0, 1, DO_SpectrumTier_list);
+		praat_addAction1 (classSpectrumTier, 0, U"Down to Table", 0, 1, DO_SpectrumTier_downto_Table);
+	praat_addAction1 (classSpectrumTier, 0, U"Remove points below...", 0, 0, DO_SpectrumTier_removePointsBelow);
+
+	praat_addAction1 (classStrings, 0, U"Strings help", 0, 0, DO_Strings_help);
+	praat_addAction1 (classStrings, 1, U"Save as raw text file...", 0, 0, DO_Strings_writeToRawTextFile);
+	praat_addAction1 (classStrings, 1, U"Write to raw text file...", 0, praat_HIDDEN, DO_Strings_writeToRawTextFile);
+	praat_addAction1 (classStrings, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_Strings_edit);
+	praat_addAction1 (classStrings, 1, U"Edit", 0, praat_HIDDEN, DO_Strings_edit);
+	praat_addAction1 (classStrings, 0, U"Query -", 0, 0, 0);
+		praat_addAction1 (classStrings, 2, U"Equal?", 0, 1, DO_Strings_equal);
+		praat_addAction1 (classStrings, 1, U"Get number of strings", 0, 1, DO_Strings_getNumberOfStrings);
+		praat_addAction1 (classStrings, 1, U"Get string...", 0, 1, DO_Strings_getString);
+	praat_addAction1 (classStrings, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classStrings, 0, U"Set string...", 0, 1, DO_Strings_setString);
+		praat_addAction1 (classStrings, 0, U"Insert string...", 0, 1, DO_Strings_insertString);
+		praat_addAction1 (classStrings, 0, U"Remove string...", 0, 1, DO_Strings_removeString);
+		praat_addAction1 (classStrings, 0, U"-- modify order --", 0, 1, 0);
+		praat_addAction1 (classStrings, 0, U"Randomize", 0, 1, DO_Strings_randomize);
+		praat_addAction1 (classStrings, 0, U"Sort", 0, 1, DO_Strings_sort);
+		praat_addAction1 (classStrings, 0, U"-- convert --", 0, 1, 0);
+		praat_addAction1 (classStrings, 0, U"Replace all...", 0, 1, DO_Strings_replaceAll);
+		praat_addAction1 (classStrings, 0, U"Genericize", 0, 1, DO_Strings_genericize);
+		praat_addAction1 (classStrings, 0, U"Nativize", 0, 1, DO_Strings_nativize);
+	praat_addAction1 (classStrings, 0, U"Analyze", 0, 0, 0);
+		praat_addAction1 (classStrings, 0, U"To Distributions", 0, 0, DO_Strings_to_Distributions);
+	praat_addAction1 (classStrings, 0, U"Synthesize", 0, 0, 0);
+		praat_addAction1 (classStrings, 0, U"To WordList", 0, 0, DO_Strings_to_WordList);
+
+	praat_addAction1 (classTable, 0, U"Down to Matrix", 0, 0, DO_Table_to_Matrix);
+
+	praat_addAction1 (classTransition, 0, U"Transition help", 0, 0, DO_Transition_help);
+praat_addAction1 (classTransition, 0, U"Draw", 0, 0, 0);
+	praat_addAction1 (classTransition, 0, U"Draw as numbers...", 0, 0, DO_Transition_drawAsNumbers);
+praat_addAction1 (classTransition, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classTransition, 0, U"Eigen", 0, 0, DO_Transition_eigen);
+	praat_addAction1 (classTransition, 0, U"Conflate", 0, 0, DO_Transition_conflate);
+praat_addAction1 (classTransition, 0, U"Synthesize", 0, 0, 0);
+	praat_addAction1 (classTransition, 0, U"Power...", 0, 0, DO_Transition_power);
+praat_addAction1 (classTransition, 0, U"Cast", 0, 0, 0);
+	praat_addAction1 (classTransition, 0, U"To Matrix", 0, 0, DO_Transition_to_Matrix);
+
+	praat_addAction2 (classAmplitudeTier, 1, classSound, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_AmplitudeTier_edit);
+	praat_addAction2 (classAmplitudeTier, 1, classSound, 1, U"Edit", 0, praat_HIDDEN, DO_AmplitudeTier_edit);   // hidden 2011
+	praat_addAction2 (classAmplitudeTier, 1, classSound, 1, U"Multiply", 0, 0, DO_Sound_AmplitudeTier_multiply);
+	praat_addAction2 (classDistributions, 1, classTransition, 1, U"Map", 0, 0, DO_Distributions_Transition_map);
+	praat_addAction2 (classDistributions, 1, classTransition, 1, U"To Transition...", 0, 0, DO_Distributions_to_Transition_adj);
+	praat_addAction2 (classDistributions, 2, classTransition, 1, U"To Transition (noise)...", 0, 0, DO_Distributions_to_Transition_noise_adj);
+	praat_addAction2 (classDurationTier, 1, classSound, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_DurationTier_edit);
+	praat_addAction2 (classDurationTier, 1, classSound, 1, U"Edit", 0, praat_HIDDEN, DO_DurationTier_edit);
+	praat_addAction2 (classFormant, 1, classPointProcess, 1, U"To FormantTier", 0, 0, DO_Formant_PointProcess_to_FormantTier);
+	praat_addAction2 (classFormant, 1, classSound, 1, U"Filter", 0, 0, DO_Sound_Formant_filter);
+	praat_addAction2 (classFormant, 1, classSound, 1, U"Filter (no scale)", 0, 0, DO_Sound_Formant_filter_noscale);
+	praat_addAction2 (classFormantGrid, 1, classSound, 1, U"Filter", 0, 0, DO_Sound_FormantGrid_filter);
+	praat_addAction2 (classFormantGrid, 1, classSound, 1, U"Filter (no scale)", 0, 0, DO_Sound_FormantGrid_filter_noscale);
+	praat_addAction2 (classFormantTier, 1, classSound, 1, U"Filter", 0, 0, DO_Sound_FormantTier_filter);
+	praat_addAction2 (classFormantTier, 1, classSound, 1, U"Filter (no scale)", 0, 0, DO_Sound_FormantTier_filter_noscale);
+	praat_addAction2 (classIntensity, 1, classPitch, 1, U"Draw", 0, 0, 0);
+	praat_addAction2 (classIntensity, 1, classPitch, 1, U"Draw (phonetogram)...", 0, 0, DO_Pitch_Intensity_draw);
+	praat_addAction2 (classIntensity, 1, classPitch, 1, U"Speckle (phonetogram)...", 0, praat_HIDDEN, DO_Pitch_Intensity_speckle);   /* grandfathered 2005 */
+	praat_addAction2 (classIntensity, 1, classPointProcess, 1, U"To IntensityTier", 0, 0, DO_Intensity_PointProcess_to_IntensityTier);
+	praat_addAction2 (classIntensityTier, 1, classPointProcess, 1, U"To IntensityTier", 0, 0, DO_IntensityTier_PointProcess_to_IntensityTier);
+	praat_addAction2 (classIntensityTier, 1, classSound, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_IntensityTier_edit);
+	praat_addAction2 (classIntensityTier, 1, classSound, 1, U"Edit", 0, praat_HIDDEN, DO_IntensityTier_edit);
+	praat_addAction2 (classIntensityTier, 1, classSound, 1, U"Multiply", 0, praat_HIDDEN, DO_Sound_IntensityTier_multiply_old);
+	praat_addAction2 (classIntensityTier, 1, classSound, 1, U"Multiply...", 0, 0, DO_Sound_IntensityTier_multiply);
+	praat_addAction2 (classManipulation, 1, classSound, 1, U"Replace original sound", 0, 0, DO_Manipulation_replaceOriginalSound);
+	praat_addAction2 (classManipulation, 1, classPointProcess, 1, U"Replace pulses", 0, 0, DO_Manipulation_replacePulses);
+	praat_addAction2 (classManipulation, 1, classPitchTier, 1, U"Replace pitch tier", 0, 0, DO_Manipulation_replacePitchTier);
+	praat_addAction2 (classManipulation, 1, classDurationTier, 1, U"Replace duration tier", 0, 0, DO_Manipulation_replaceDurationTier);
+	praat_addAction2 (classManipulation, 1, classTextTier, 1, U"To Manipulation", 0, 0, DO_Manipulation_TextTier_to_Manipulation);
+	praat_addAction2 (classMatrix, 1, classSound, 1, U"To ParamCurve", 0, 0, DO_Matrix_to_ParamCurve);
+	praat_addAction2 (classPhoto, 1, classMatrix, 1, U"Replace red", 0, 0, DO_Photo_Matrix_replaceRed);
+	praat_addAction2 (classPhoto, 1, classMatrix, 1, U"Replace green", 0, 0, DO_Photo_Matrix_replaceGreen);
+	praat_addAction2 (classPhoto, 1, classMatrix, 1, U"Replace blue", 0, 0, DO_Photo_Matrix_replaceBlue);
+	praat_addAction2 (classPhoto, 1, classMatrix, 1, U"Replace transparency", 0, 0, DO_Photo_Matrix_replaceTransparency);
+	praat_addAction2 (classPitch, 1, classPitchTier, 1, U"Draw...", 0, 0, DO_PitchTier_Pitch_draw);
+	praat_addAction2 (classPitch, 1, classPitchTier, 1, U"To Pitch", 0, 0, DO_Pitch_PitchTier_to_Pitch);
+	praat_addAction2 (classPitch, 1, classPointProcess, 1, U"To PitchTier", 0, 0, DO_Pitch_PointProcess_to_PitchTier);
+	praat_addAction3 (classPitch, 1, classPointProcess, 1, classSound, 1, U"Voice report...", 0, 0, DO_Sound_Pitch_PointProcess_voiceReport);
+	praat_addAction2 (classPitch, 1, classSound, 1, U"To PointProcess (cc)", 0, 0, DO_Sound_Pitch_to_PointProcess_cc);
+	praat_addAction2 (classPitch, 1, classSound, 1, U"To PointProcess (peaks)...", 0, 0, DO_Sound_Pitch_to_PointProcess_peaks);
+	praat_addAction2 (classPitch, 1, classSound, 1, U"To Manipulation", 0, 0, DO_Sound_Pitch_to_Manipulation);
+	praat_addAction2 (classPitchTier, 1, classPointProcess, 1, U"To PitchTier", 0, 0, DO_PitchTier_PointProcess_to_PitchTier);
+	praat_addAction2 (classPitchTier, 1, classSound, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_PitchTier_edit);
+	praat_addAction2 (classPitchTier, 1, classSound, 1, U"Edit", 0, praat_HIDDEN, DO_PitchTier_edit);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_PointProcess_edit);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"Edit", 0, praat_HIDDEN, DO_PointProcess_edit);
+praat_addAction2 (classPointProcess, 1, classSound, 1, U"Query", 0, 0, 0);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"Get shimmer (local)...", 0, 0, DO_Point_Sound_getShimmer_local);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"Get shimmer (local_dB)...", 0, 0, DO_Point_Sound_getShimmer_local_dB);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"Get shimmer (apq3)...", 0, 0, DO_Point_Sound_getShimmer_apq3);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"Get shimmer (apq5)...", 0, 0, DO_Point_Sound_getShimmer_apq5);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"Get shimmer (apq11)...", 0, 0, DO_Point_Sound_getShimmer_apq11);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"Get shimmer (dda)...", 0, 0, DO_Point_Sound_getShimmer_dda);
+praat_addAction2 (classPointProcess, 1, classSound, 1, U"Modify", 0, 0, 0);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"Transplant time domain", 0, 0, DO_Point_Sound_transplantDomain);
+praat_addAction2 (classPointProcess, 1, classSound, 1, U"Analyse", 0, 0, 0);
+	/*praat_addAction2 (classPointProcess, 1, classSound, 1, U"To Manipulation", 0, 0, DO_Sound_PointProcess_to_Manipulation);*/
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"To AmplitudeTier (point)", 0, 0, DO_PointProcess_Sound_to_AmplitudeTier_point);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"To AmplitudeTier (period)...", 0, 0, DO_PointProcess_Sound_to_AmplitudeTier_period);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"To Ltas...", 0, 0, DO_PointProcess_Sound_to_Ltas);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"To Ltas (only harmonics)...", 0, 0, DO_PointProcess_Sound_to_Ltas_harmonics);
+praat_addAction2 (classPointProcess, 1, classSound, 1, U"Synthesize", 0, 0, 0);
+	praat_addAction2 (classPointProcess, 1, classSound, 1, U"To Sound ensemble...", 0, 0, DO_Sound_PointProcess_to_SoundEnsemble_correlate);
+
+	praat_addAction4 (classDurationTier, 1, classPitchTier, 1, classPointProcess, 1, classSound, 1, U"To Sound...", 0, 0, DO_Sound_Point_Pitch_Duration_to_Sound);
 
 	INCLUDE_MANPAGES (manual_Manual_init)
 	INCLUDE_MANPAGES (manual_Script_init)
@@ -7171,10 +7216,10 @@ praat_addAction2 (classPointProcess, 1, classSound, 1, L"Synthesize", 0, 0, 0);
 	INCLUDE_MANPAGES (manual_EEG_init)
 
 	INCLUDE_LIBRARY (praat_EEG_init)
-	praat_addMenuCommand (L"Objects", L"New", L"-- new synthesis --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"-- new synthesis --", 0, 0, 0);
 	INCLUDE_LIBRARY (praat_uvafon_Artsynth_init)
 	INCLUDE_LIBRARY (praat_uvafon_David_init)
-	praat_addMenuCommand (L"Objects", L"New", L"-- new grammars --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"-- new grammars --", 0, 0, 0);
 	INCLUDE_LIBRARY (praat_uvafon_gram_init)
 	INCLUDE_LIBRARY (praat_uvafon_FFNet_init)
 	INCLUDE_LIBRARY (praat_uvafon_LPC_init)
diff --git a/fon/praat_Sound_init.cpp b/fon/praat_Sound_init.cpp
index a2931b4..9249ae9 100644
--- a/fon/praat_Sound_init.cpp
+++ b/fon/praat_Sound_init.cpp
@@ -1,6 +1,6 @@
 /* praat_Sound_init.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -51,30 +51,30 @@ void praat_TimeFunction_modify_init (ClassInfo klas);
 /***** LONGSOUND *****/
 
 DIRECT2 (LongSound_concatenate) {
-	Melder_information (L"To concatenate LongSound objects, select them in the list\nand choose \"Save as WAV file...\" or a similar command.\n"
+	Melder_information (U"To concatenate LongSound objects, select them in the list\nand choose \"Save as WAV file...\" or a similar command.\n"
 		"The result will be a sound file that contains\nthe concatenation of the selected sounds.");
 END2 }
 
-FORM (LongSound_extractPart, L"LongSound: Extract part", 0) {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"1.0")
-	BOOLEAN (L"Preserve times", 1)
+FORM (LongSound_extractPart, U"LongSound: Extract part", nullptr) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"1.0")
+	BOOLEAN (U"Preserve times", true)
 	OK2
 DO
 	LOOP {
 		iam (LongSound);
-		autoSound thee = LongSound_extractPart (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Preserve times"));
+		autoSound thee = LongSound_extractPart (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Preserve times"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (LongSound_getIndexFromTime, L"LongSound: Get sample index from time", L"Sound: Get index from time...") {
-	REAL (L"Time (s)", L"0.5")
+FORM (LongSound_getIndexFromTime, U"LongSound: Get sample index from time", U"Sound: Get index from time...") {
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	LOOP {
 		iam (LongSound);
-		double index = Sampled_xToIndex (me, GET_REAL (L"Time"));
+		double index = Sampled_xToIndex (me, GET_REAL (U"Time"));
 		Melder_informationReal (index, NULL);
 	}
 END2 }
@@ -82,44 +82,44 @@ END2 }
 DIRECT2 (LongSound_getSamplePeriod) {
 	LOOP {
 		iam (LongSound);
-		Melder_informationReal (my dx, L"seconds");
+		Melder_informationReal (my dx, U"seconds");
 	}
 END2 }
 
 DIRECT2 (LongSound_getSampleRate) {
 	LOOP {
 		iam (LongSound);
-		Melder_informationReal (1.0 / my dx, L"Hz");
+		Melder_informationReal (1.0 / my dx, U"Hz");
 	}
 END2 }
 
-FORM (LongSound_getTimeFromIndex, L"LongSound: Get time from sample index", L"Sound: Get time from index...") {
-	INTEGER (L"Sample index", L"100")
+FORM (LongSound_getTimeFromIndex, U"LongSound: Get time from sample index", U"Sound: Get time from index...") {
+	INTEGER (U"Sample index", U"100")
 	OK2
 DO
 	LOOP {
 		iam (LongSound);
-		Melder_informationReal (Sampled_indexToX (me, GET_INTEGER (L"Sample index")), L"seconds");
+		Melder_informationReal (Sampled_indexToX (me, GET_INTEGER (U"Sample index")), U"seconds");
 	}
 END2 }
 
 DIRECT2 (LongSound_getNumberOfSamples) {
 	LOOP {
 		iam (LongSound);
-		Melder_information (Melder_integer (my nx), L" samples");
+		Melder_information (my nx, U" samples");
 	}
 END2 }
 
-DIRECT2 (LongSound_help) { Melder_help (L"LongSound"); END2 }
+DIRECT2 (LongSound_help) { Melder_help (U"LongSound"); END2 }
 
-FORM_READ2 (LongSound_open, L"Open long sound file", 0, true) {
+FORM_READ2 (LongSound_open, U"Open long sound file", nullptr, true) {
 	autoLongSound me = LongSound_open (file);
 	praat_new (me.transfer(), MelderFile_name (file));
 END2 }
 
-FORM (LongSound_playPart, L"LongSound: Play part", 0) {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
+FORM (LongSound_playPart, U"LongSound: Play part", nullptr) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
 	OK2
 DO
 	int n = 0;
@@ -127,52 +127,52 @@ DO
 	if (n == 1 || MelderAudio_getOutputMaximumAsynchronicity () < kMelder_asynchronicityLevel_ASYNCHRONOUS) {
 		LOOP {
 			iam (LongSound);
-			LongSound_playPart (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), NULL, NULL);
+			LongSound_playPart (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), NULL, NULL);
 		}
 	} else {
 		MelderAudio_setOutputMaximumAsynchronicity (kMelder_asynchronicityLevel_INTERRUPTABLE);
 		LOOP {
 			iam (LongSound);
-			LongSound_playPart (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), NULL, NULL);
+			LongSound_playPart (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), NULL, NULL);
 		}
 		MelderAudio_setOutputMaximumAsynchronicity (kMelder_asynchronicityLevel_ASYNCHRONOUS);
 	}
 END2 }
 
-FORM (LongSound_writePartToAudioFile, L"LongSound: Save part as audio file", 0) {
-	LABEL (L"", L"Audio file:")
-	TEXTFIELD (L"Audio file", L"")
-	RADIO (L"Type", 3)
+FORM (LongSound_writePartToAudioFile, U"LongSound: Save part as audio file", 0) {
+	LABEL (U"", U"Audio file:")
+	TEXTFIELD (U"Audio file", U"")
+	RADIO (U"Type", 3)
 	{ int i; for (i = 1; i <= Melder_NUMBER_OF_AUDIO_FILE_TYPES; i ++) {
 		RADIOBUTTON (Melder_audioFileTypeString (i))
 	}}
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"10.0")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"10.0")
 	OK2
 DO
 	LOOP {
 		iam (LongSound);
 		structMelderFile file = { 0 };
-		Melder_relativePathToFile (GET_STRING (L"Audio file"), & file);
-		LongSound_writePartToAudioFile (me, GET_INTEGER (L"Type"),
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), & file);
+		Melder_relativePathToFile (GET_STRING (U"Audio file"), & file);
+		LongSound_writePartToAudioFile (me, GET_INTEGER (U"Type"),
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), & file, 16);
 	}
 END2 }
 	
-FORM (LongSound_to_TextGrid, L"LongSound: To TextGrid...", L"LongSound: To TextGrid...") {
-	SENTENCE (L"Tier names", L"Mary John bell")
-	SENTENCE (L"Point tiers", L"bell")
+FORM (LongSound_to_TextGrid, U"LongSound: To TextGrid...", U"LongSound: To TextGrid...") {
+	SENTENCE (U"Tier names", U"Mary John bell")
+	SENTENCE (U"Point tiers", U"bell")
 	OK2
 DO
 	LOOP {
 		iam (LongSound);
-		autoTextGrid thee = TextGrid_create (my xmin, my xmax, GET_STRING (L"Tier names"), GET_STRING (L"Point tiers"));
+		autoTextGrid thee = TextGrid_create (my xmin, my xmax, GET_STRING (U"Tier names"), GET_STRING (U"Point tiers"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
 DIRECT2 (LongSound_view) {
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a LongSound from batch.");
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a LongSound from batch.");
 	LOOP {
 		iam (LongSound);
 		autoSoundEditor editor = SoundEditor_create (ID_AND_FULL_NAME, me);
@@ -180,191 +180,191 @@ DIRECT2 (LongSound_view) {
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeToAifcFile, L"Save as AIFC file", 0, L"aifc") {
+FORM_WRITE2 (LongSound_writeToAifcFile, U"Save as AIFC file", 0, U"aifc") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_AIFC, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_writeToAiffFile, L"Save as AIFF file", 0, L"aiff") {
+FORM_WRITE2 (LongSound_writeToAiffFile, U"Save as AIFF file", 0, U"aiff") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_AIFF, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_writeToNextSunFile, L"Save as NeXT/Sun file", 0, L"au") {
+FORM_WRITE2 (LongSound_writeToNextSunFile, U"Save as NeXT/Sun file", 0, U"au") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_NEXT_SUN, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_writeToNistFile, L"Save as NIST file", 0, L"nist") {
+FORM_WRITE2 (LongSound_writeToNistFile, U"Save as NIST file", 0, U"nist") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_NIST, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_writeToFlacFile, L"Save as FLAC file", 0, L"flac") {
+FORM_WRITE2 (LongSound_writeToFlacFile, U"Save as FLAC file", 0, U"flac") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_FLAC, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_writeToWavFile, L"Save as WAV file", 0, L"wav") {
+FORM_WRITE2 (LongSound_writeToWavFile, U"Save as WAV file", 0, U"wav") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_WAV, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_writeLeftChannelToAifcFile, L"Save left channel as AIFC file", 0, L"aifc") {
+FORM_WRITE2 (LongSound_writeLeftChannelToAifcFile, U"Save left channel as AIFC file", 0, U"aifc") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_AIFC, 0, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeLeftChannelToAiffFile, L"Save left channel as AIFF file", 0, L"aiff") {
+FORM_WRITE2 (LongSound_writeLeftChannelToAiffFile, U"Save left channel as AIFF file", 0, U"aiff") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_AIFF, 0, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeLeftChannelToNextSunFile, L"Save left channel as NeXT/Sun file", 0, L"au") {
+FORM_WRITE2 (LongSound_writeLeftChannelToNextSunFile, U"Save left channel as NeXT/Sun file", 0, U"au") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_NEXT_SUN, 0, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeLeftChannelToNistFile, L"Save left channel as NIST file", 0, L"nist") {
+FORM_WRITE2 (LongSound_writeLeftChannelToNistFile, U"Save left channel as NIST file", 0, U"nist") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_NIST, 0, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeLeftChannelToFlacFile, L"Save left channel as FLAC file", 0, L"flac") {
+FORM_WRITE2 (LongSound_writeLeftChannelToFlacFile, U"Save left channel as FLAC file", 0, U"flac") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_FLAC, 0, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeLeftChannelToWavFile, L"Save left channel as WAV file", 0, L"wav") {
+FORM_WRITE2 (LongSound_writeLeftChannelToWavFile, U"Save left channel as WAV file", 0, U"wav") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_WAV, 0, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeRightChannelToAifcFile, L"Save right channel as AIFC file", 0, L"aifc") {
+FORM_WRITE2 (LongSound_writeRightChannelToAifcFile, U"Save right channel as AIFC file", 0, U"aifc") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_AIFC, 1, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeRightChannelToAiffFile, L"Save right channel as AIFF file", 0, L"aiff") {
+FORM_WRITE2 (LongSound_writeRightChannelToAiffFile, U"Save right channel as AIFF file", 0, U"aiff") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_AIFF, 1, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeRightChannelToNextSunFile, L"Save right channel as NeXT/Sun file", 0, L"au") {
+FORM_WRITE2 (LongSound_writeRightChannelToNextSunFile, U"Save right channel as NeXT/Sun file", 0, U"au") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_NEXT_SUN, 1, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeRightChannelToNistFile, L"Save right channel as NIST file", 0, L"nist") {
+FORM_WRITE2 (LongSound_writeRightChannelToNistFile, U"Save right channel as NIST file", 0, U"nist") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_NIST, 1, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeRightChannelToFlacFile, L"Save right channel as FLAC file", 0, L"flac") {
+FORM_WRITE2 (LongSound_writeRightChannelToFlacFile, U"Save right channel as FLAC file", 0, U"flac") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_FLAC, 1, file);
 	}
 END2 }
 
-FORM_WRITE2 (LongSound_writeRightChannelToWavFile, L"Save right channel as WAV file", 0, L"wav") {
+FORM_WRITE2 (LongSound_writeRightChannelToWavFile, U"Save right channel as WAV file", 0, U"wav") {
 	LOOP {
 		iam (LongSound);
 		LongSound_writeChannelToAudioFile (me, Melder_WAV, 1, file);
 	}
 END2 }
 
-FORM (LongSoundPrefs, L"LongSound preferences", L"LongSound") {
-	LABEL (L"", L"This setting determines the maximum number of seconds")
-	LABEL (L"", L"for viewing the waveform and playing a sound in the LongSound window.")
-	LABEL (L"", L"The LongSound window can become very slow if you set it too high.")
-	NATURAL (L"Maximum viewable part (seconds)", L"60")
-	LABEL (L"", L"Note: this setting works for the next long sound file that you open,")
-	LABEL (L"", L"not for currently existing LongSound objects.")
+FORM (LongSoundPrefs, U"LongSound preferences", U"LongSound") {
+	LABEL (U"", U"This setting determines the maximum number of seconds")
+	LABEL (U"", U"for viewing the waveform and playing a sound in the LongSound window.")
+	LABEL (U"", U"The LongSound window can become very slow if you set it too high.")
+	NATURAL (U"Maximum viewable part (seconds)", U"60")
+	LABEL (U"", U"Note: this setting works for the next long sound file that you open,")
+	LABEL (U"", U"not for currently existing LongSound objects.")
 	OK2
-SET_INTEGER (L"Maximum viewable part", LongSound_getBufferSizePref_seconds ())
+SET_INTEGER (U"Maximum viewable part", LongSound_getBufferSizePref_seconds ())
 DO
-	LongSound_setBufferSizePref_seconds (GET_INTEGER (L"Maximum viewable part"));
+	LongSound_setBufferSizePref_seconds (GET_INTEGER (U"Maximum viewable part"));
 END2 }
 
 /********** LONGSOUND & SOUND **********/
 
-FORM_WRITE2 (LongSound_Sound_writeToAifcFile, L"Save as AIFC file", 0, L"aifc") {
+FORM_WRITE2 (LongSound_Sound_writeToAifcFile, U"Save as AIFC file", 0, U"aifc") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_AIFC, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_Sound_writeToAiffFile, L"Save as AIFF file", 0, L"aiff") {
+FORM_WRITE2 (LongSound_Sound_writeToAiffFile, U"Save as AIFF file", 0, U"aiff") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_AIFF, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_Sound_writeToNextSunFile, L"Save as NeXT/Sun file", 0, L"au") {
+FORM_WRITE2 (LongSound_Sound_writeToNextSunFile, U"Save as NeXT/Sun file", 0, U"au") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_NEXT_SUN, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_Sound_writeToNistFile, L"Save as NIST file", 0, L"nist") {
+FORM_WRITE2 (LongSound_Sound_writeToNistFile, U"Save as NIST file", 0, U"nist") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_NIST, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_Sound_writeToFlacFile, L"Save as FLAC file", 0, L"flac") {
+FORM_WRITE2 (LongSound_Sound_writeToFlacFile, U"Save as FLAC file", 0, U"flac") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_FLAC, 16);
 END2 }
 
-FORM_WRITE2 (LongSound_Sound_writeToWavFile, L"Save as WAV file", 0, L"wav") {
+FORM_WRITE2 (LongSound_Sound_writeToWavFile, U"Save as WAV file", 0, U"wav") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_WAV, 16);
 END2 }
 
 /********** SOUND **********/
 
-FORM (Sound_add, L"Sound: Add", 0) {
-	LABEL (L"", L"The following number will be added to the amplitudes of ")
-	LABEL (L"", L"all samples of the sound.")
-	REAL (L"Number", L"0.1")
+FORM (Sound_add, U"Sound: Add", 0) {
+	LABEL (U"", U"The following number will be added to the amplitudes of ")
+	LABEL (U"", U"all samples of the sound.")
+	REAL (U"Number", U"0.1")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		Vector_addScalar (me, GET_REAL (L"Number"));
+		Vector_addScalar (me, GET_REAL (U"Number"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Sound_autoCorrelate, L"Sound: autocorrelate", L"Sound: Autocorrelate...") {
-	RADIO_ENUM (L"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
-	RADIO_ENUM (L"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
+FORM (Sound_autoCorrelate, U"Sound: autocorrelate", U"Sound: Autocorrelate...") {
+	RADIO_ENUM (U"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
+	RADIO_ENUM (U"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
  	OK2
 DO
 	LOOP {
 		iam (Sound);
 		autoSound thee = Sound_autoCorrelate (me,
-			GET_ENUM (kSounds_convolve_scaling, L"Amplitude scaling"),
-			GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, L"Signal outside time domain is..."));
-		praat_new (thee.transfer(), L"ac_", my name);
+			GET_ENUM (kSounds_convolve_scaling, U"Amplitude scaling"),
+			GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, U"Signal outside time domain is..."));
+		praat_new (thee.transfer(), U"ac_", my name);
 	}
 END2 }
 
@@ -372,22 +372,22 @@ DIRECT2 (Sounds_combineToStereo) {
 	autoCollection set = praat_getSelectedObjects ();
 	autoSound result = Sounds_combineToStereo (set.peek());
 	long numberOfChannels = result -> ny;   // dereference before transferring
-	praat_new (result.transfer(), L"combined_", Melder_integer (numberOfChannels));
+	praat_new (result.transfer(), U"combined_", numberOfChannels);
 END2 }
 
 DIRECT2 (Sounds_concatenate) {
 	autoCollection set = praat_getSelectedObjects ();
 	autoSound result = Sounds_concatenate_e (set.peek(), 0.0);
-	praat_new (result.transfer(), L"chain");
+	praat_new (result.transfer(), U"chain");
 END2 }
 
-FORM (Sounds_concatenateWithOverlap, L"Sounds: Concatenate with overlap", L"Sounds: Concatenate with overlap...") {
-	POSITIVE (L"Overlap (s)", L"0.01")
+FORM (Sounds_concatenateWithOverlap, U"Sounds: Concatenate with overlap", U"Sounds: Concatenate with overlap...") {
+	POSITIVE (U"Overlap (s)", U"0.01")
 	OK2
 DO
 	autoCollection set = praat_getSelectedObjects ();
-	autoSound result = Sounds_concatenate_e (set.peek(), GET_REAL (L"Overlap"));
-	praat_new (result.transfer(), L"chain");
+	autoSound result = Sounds_concatenate_e (set.peek(), GET_REAL (U"Overlap"));
+	praat_new (result.transfer(), U"chain");
 END2 }
 
 DIRECT2 (Sounds_concatenateRecoverably) {
@@ -398,18 +398,18 @@ DIRECT2 (Sounds_concatenateRecoverably) {
 		if (numberOfChannels == 0) {
 			numberOfChannels = my ny;
 		} else if (my ny != numberOfChannels) {
-			Melder_throw ("To concatenate sounds, their numbers of channels (mono, stereo) must be equal.");
+			Melder_throw (U"To concatenate sounds, their numbers of channels (mono, stereo) must be equal.");
 		}
 		if (dx == 0.0) {
 			dx = my dx;
 		} else if (my dx != dx) {
-			Melder_throw ("To concatenate sounds, their sampling frequencies must be equal.\n"
+			Melder_throw (U"To concatenate sounds, their sampling frequencies must be equal.\n"
 				"You could resample one or more of the sounds before concatenating.");
 		}
 		nx += my nx;
 	}
 	autoSound thee = Sound_create (numberOfChannels, 0.0, nx * dx, nx, dx, 0.5 * dx);
-	autoTextGrid him = TextGrid_create (0.0, nx * dx, L"labels", L"");
+	autoTextGrid him = TextGrid_create (0.0, nx * dx, U"labels", U"");
 	nx = 0;
 	LOOP {
 		iam (Sound);
@@ -425,15 +425,15 @@ DIRECT2 (Sounds_concatenateRecoverably) {
 		nx += my nx;
 		tmin = tmax;
 	}
-	praat_new (thee.transfer(), L"chain");
-	praat_new (him.transfer(), L"chain");
+	praat_new (thee.transfer(), U"chain");
+	praat_new (him.transfer(), U"chain");
 END2 }
 
 DIRECT2 (Sound_convertToMono) {
 	LOOP {
 		iam (Sound);
 		autoSound thee = Sound_convertToMono (me);
-		praat_new (thee.transfer(), my name, L"_mono");
+		praat_new (thee.transfer(), my name, U"_mono");
 	}
 END2 }
 
@@ -441,7 +441,7 @@ DIRECT2 (Sound_convertToStereo) {
 	LOOP {
 		iam (Sound);
 		autoSound thee = Sound_convertToStereo (me);
-		praat_new (thee.transfer(), my name, L"_stereo");
+		praat_new (thee.transfer(), my name, U"_stereo");
 	}
 END2 }
 
@@ -453,12 +453,12 @@ DIRECT2 (Sounds_convolve_old) {
 	}
 	Melder_assert (s1 != NULL && s2 != NULL);
 	autoSound thee = Sounds_convolve (s1, s2, kSounds_convolve_scaling_SUM, kSounds_convolve_signalOutsideTimeDomain_ZERO);
-	praat_new (thee.transfer(), s1 -> name, L"_", s2 -> name);
+	praat_new (thee.transfer(), s1 -> name, U"_", s2 -> name);
 END2 }
 
-FORM (Sounds_convolve, L"Sounds: Convolve", L"Sounds: Convolve...") {
-	RADIO_ENUM (L"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
-	RADIO_ENUM (L"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
+FORM (Sounds_convolve, U"Sounds: Convolve", U"Sounds: Convolve...") {
+	RADIO_ENUM (U"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
+	RADIO_ENUM (U"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
 	OK2
 DO
 	Sound s1 = NULL, s2 = NULL;
@@ -468,138 +468,137 @@ DO
 	}
 	Melder_assert (s1 != NULL && s2 != NULL);
 	autoSound thee = Sounds_convolve (s1, s2,
-		GET_ENUM (kSounds_convolve_scaling, L"Amplitude scaling"),
-		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, L"Signal outside time domain is..."));
-	praat_new (thee.transfer(), s1 -> name, L"_", s2 -> name);
+		GET_ENUM (kSounds_convolve_scaling, U"Amplitude scaling"),
+		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, U"Signal outside time domain is..."));
+	praat_new (thee.transfer(), s1 -> name, U"_", s2 -> name);
 END2 }
 
-static void common_Sound_create (void *dia, Interpreter interpreter, bool allowMultipleChannels) {
-	long numberOfChannels = allowMultipleChannels ? GET_INTEGER (L"Number of channels") : 1;
-	double startTime = GET_REAL (L"Start time");
-	double endTime = GET_REAL (L"End time");
-	double samplingFrequency = GET_REAL (L"Sampling frequency");
+static void common_Sound_create (UiForm dia, Interpreter interpreter, bool allowMultipleChannels) {
+	long numberOfChannels = allowMultipleChannels ? GET_INTEGER (U"Number of channels") : 1;
+	double startTime = GET_REAL (U"Start time");
+	double endTime = GET_REAL (U"End time");
+	double samplingFrequency = GET_REAL (U"Sampling frequency");
 	double numberOfSamples_real = round ((endTime - startTime) * samplingFrequency);
-	long numberOfSamples;
 	if (endTime <= startTime) {
 		if (endTime == startTime)
-			Melder_error_ ("A Sound cannot have a duration of zero.");
+			Melder_appendError (U"A Sound cannot have a duration of zero.");
 		else
-			Melder_error_ ("A Sound cannot have a duration less than zero.");
+			Melder_appendError (U"A Sound cannot have a duration less than zero.");
 		if (startTime == 0.0)
-			Melder_throw ("Please set the end time to something greater than 0 seconds.");
+			Melder_throw (U"Please set the end time to something greater than 0 seconds.");
 		else
-			Melder_throw ("Please lower the start time or raise the end time.");
+			Melder_throw (U"Please lower the start time or raise the end time.");
 	}
 	if (samplingFrequency <= 0.0) {
-		Melder_error_ ("A Sound cannot have a negative sampling frequency.");
-		Melder_throw ("Please set the sampling frequency to something greater than zero, e.g. 44100 Hz.");
+		Melder_appendError (U"A Sound cannot have a negative sampling frequency.");
+		Melder_throw (U"Please set the sampling frequency to something greater than zero, e.g. 44100 Hz.");
 	}
 	if (numberOfChannels < 1)
-		Melder_throw ("A Sound cannot have zero channels.");
+		Melder_throw (U"A Sound cannot have zero channels.");
 	if (numberOfSamples_real < 1.0) {
-		Melder_error_ ("A Sound cannot have zero samples.");
+		Melder_appendError (U"A Sound cannot have zero samples.");
 		if (startTime == 0.0)
-			Melder_throw ("Please raise the end time.");
+			Melder_throw (U"Please raise the end time.");
 		else
-			Melder_throw ("Please lower the start time or raise the end time.");
+			Melder_throw (U"Please lower the start time or raise the end time.");
 	}
-	if (numberOfSamples_real > LONG_MAX) {
-		Melder_error_ ("A Sound cannot have ", Melder_bigInteger (numberOfSamples_real), " samples; the maximum is ",
-			Melder_bigInteger (LONG_MAX), " samples (or less, depending on your computer's memory).");
+	if (numberOfSamples_real > INT54_MAX) {
+		Melder_appendError (U"A Sound cannot have ", numberOfSamples_real, U" samples; the maximum is ",
+			Melder_bigInteger (INT54_MAX), U" samples (or less, depending on your computer's memory).");
 		if (startTime == 0.0)
-			Melder_throw ("Please lower the end time or the sampling frequency.");
+			Melder_throw (U"Please lower the end time or the sampling frequency.");
 		else
-			Melder_throw ("Please raise the start time, lower the end time, or lower the sampling frequency.");
+			Melder_throw (U"Please raise the start time, lower the end time, or lower the sampling frequency.");
 	}
-	numberOfSamples = (long) numberOfSamples_real;
+	int64 numberOfSamples = (int64) numberOfSamples_real;
 	autoSound sound;
 	try {
-		sound.reset (Sound_create (numberOfChannels, startTime, endTime, numberOfSamples, 1.0 / samplingFrequency,
-			startTime + 0.5 * (endTime - startTime - (numberOfSamples - 1) / samplingFrequency)));
+		sound = Sound_create (numberOfChannels, startTime, endTime, numberOfSamples, 1.0 / samplingFrequency,
+			startTime + 0.5 * (endTime - startTime - (numberOfSamples - 1) / samplingFrequency));
 	} catch (MelderError) {
-		if (wcsstr (Melder_getError (), L"memory")) {
+		if (str32str (Melder_getError (), U"memory")) {
 			Melder_clearError ();
-			Melder_error_ ("There is not enough memory to create a Sound that contains ", Melder_bigInteger (numberOfSamples_real), " samples.");
+			Melder_appendError (U"There is not enough memory to create a Sound that contains ", Melder_bigInteger (numberOfSamples), U" samples.");
 			if (startTime == 0.0)
-				Melder_throw ("You could lower the end time or the sampling frequency and try again.");
+				Melder_throw (U"You could lower the end time or the sampling frequency and try again.");
 			else
-				Melder_throw ("You could raise the start time or lower the end time or the sampling frequency, and try again.");
+				Melder_throw (U"You could raise the start time or lower the end time or the sampling frequency, and try again.");
 		} else {
 			throw;   // unexpected error; wait for generic message
 		}
 	}
-	Matrix_formula ((Matrix) sound.peek(), GET_STRING (L"formula"), interpreter, NULL);
-	praat_new (sound.transfer(), GET_STRING (L"Name"));
+	Matrix_formula ((Matrix) sound.peek(), GET_STRING (U"formula"), interpreter, NULL);
+	praat_new (sound.transfer(), GET_STRING (U"Name"));
 	//praat_updateSelection ();
 }
 
-FORM (Sound_create, L"Create mono Sound", L"Create Sound from formula...") {
-	WORD (L"Name", L"sineWithNoise")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	REAL (L"Sampling frequency (Hz)", L"44100")
-	LABEL (L"", L"Formula:")
-	TEXTFIELD (L"formula", L"1/2 * sin(2*pi*377*x) + randomGauss(0,0.1)")
+FORM (Sound_create, U"Create mono Sound", U"Create Sound from formula...") {
+	WORD (U"Name", U"sineWithNoise")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	REAL (U"Sampling frequency (Hz)", U"44100")
+	LABEL (U"", U"Formula:")
+	TEXTFIELD (U"formula", U"1/2 * sin(2*pi*377*x) + randomGauss(0,0.1)")
 	OK2
 DO
 	common_Sound_create (dia, interpreter, false);
 END2 }
 
-FORM (Sound_createFromFormula, L"Create Sound from formula", L"Create Sound from formula...") {
-	WORD (L"Name", L"sineWithNoise")
-	CHANNEL (L"Number of channels", L"1 (= mono)")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	REAL (L"Sampling frequency (Hz)", L"44100")
-	LABEL (L"", L"Formula:")
-	TEXTFIELD (L"formula", L"1/2 * sin(2*pi*377*x) + randomGauss(0,0.1)")
+FORM (Sound_createFromFormula, U"Create Sound from formula", U"Create Sound from formula...") {
+	WORD (U"Name", U"sineWithNoise")
+	CHANNEL (U"Number of channels", U"1 (= mono)")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	REAL (U"Sampling frequency (Hz)", U"44100")
+	LABEL (U"", U"Formula:")
+	TEXTFIELD (U"formula", U"1/2 * sin(2*pi*377*x) + randomGauss(0,0.1)")
 	OK2
 DO
 	common_Sound_create (dia, interpreter, true);
 END2 }
 
-FORM (Sound_createAsPureTone, L"Create Sound as pure tone", L"Create Sound as pure tone...") {
-	WORD (L"Name", L"tone")
-	CHANNEL (L"Number of channels", L"1 (= mono)")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"0.4")
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
-	POSITIVE (L"Tone frequency (Hz)", L"440.0")
-	POSITIVE (L"Amplitude (Pa)", L"0.2")
-	POSITIVE (L"Fade-in duration (s)", L"0.01")
-	POSITIVE (L"Fade-out duration (s)", L"0.01")
+FORM (Sound_createAsPureTone, U"Create Sound as pure tone", U"Create Sound as pure tone...") {
+	WORD (U"Name", U"tone")
+	CHANNEL (U"Number of channels", U"1 (= mono)")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"0.4")
+	POSITIVE (U"Sampling frequency (Hz)", U"44100.0")
+	POSITIVE (U"Tone frequency (Hz)", U"440.0")
+	POSITIVE (U"Amplitude (Pa)", U"0.2")
+	POSITIVE (U"Fade-in duration (s)", U"0.01")
+	POSITIVE (U"Fade-out duration (s)", U"0.01")
 	OK2
 DO
-	autoSound me = Sound_createAsPureTone (GET_INTEGER (L"Number of channels"), GET_REAL (L"Start time"), GET_REAL (L"End time"),
-		GET_REAL (L"Sampling frequency"), GET_REAL (L"Tone frequency"), GET_REAL (L"Amplitude"),
-		GET_REAL (L"Fade-in duration"), GET_REAL (L"Fade-out duration"));
-	praat_new (me.transfer(), GET_STRING (L"Name"));
+	autoSound me = Sound_createAsPureTone (GET_INTEGER (U"Number of channels"), GET_REAL (U"Start time"), GET_REAL (U"End time"),
+		GET_REAL (U"Sampling frequency"), GET_REAL (U"Tone frequency"), GET_REAL (U"Amplitude"),
+		GET_REAL (U"Fade-in duration"), GET_REAL (U"Fade-out duration"));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
 END2 }
 
-FORM (Sound_createFromToneComplex, L"Create Sound from tone complex", L"Create Sound from tone complex...") {
-	WORD (L"Name", L"toneComplex")
-	REAL (L"Start time (s)", L"0.0")
-	REAL (L"End time (s)", L"1.0")
-	POSITIVE (L"Sampling frequency (Hz)", L"44100")
-	RADIO (L"Phase", 2)
-		RADIOBUTTON (L"Sine")
-		RADIOBUTTON (L"Cosine")
-	POSITIVE (L"Frequency step (Hz)", L"100")
-	REAL (L"First frequency (Hz)", L"0 (= frequency step)")
-	REAL (L"Ceiling (Hz)", L"0 (= Nyquist)")
-	INTEGER (L"Number of components", L"0 (= maximum)")
+FORM (Sound_createFromToneComplex, U"Create Sound from tone complex", U"Create Sound from tone complex...") {
+	WORD (U"Name", U"toneComplex")
+	REAL (U"Start time (s)", U"0.0")
+	REAL (U"End time (s)", U"1.0")
+	POSITIVE (U"Sampling frequency (Hz)", U"44100.0")
+	RADIO (U"Phase", 2)
+		RADIOBUTTON (U"Sine")
+		RADIOBUTTON (U"Cosine")
+	POSITIVE (U"Frequency step (Hz)", U"100")
+	REAL (U"First frequency (Hz)", U"0 (= frequency step)")
+	REAL (U"Ceiling (Hz)", U"0 (= Nyquist)")
+	INTEGER (U"Number of components", U"0 (= maximum)")
 	OK2
 DO
-	autoSound me = Sound_createFromToneComplex (GET_REAL (L"Start time"), GET_REAL (L"End time"),
-		GET_REAL (L"Sampling frequency"), GET_INTEGER (L"Phase") - 1, GET_REAL (L"Frequency step"),
-		GET_REAL (L"First frequency"), GET_REAL (L"Ceiling"), GET_INTEGER (L"Number of components"));
-	praat_new (me.transfer(), GET_STRING (L"Name"));
+	autoSound me = Sound_createFromToneComplex (GET_REAL (U"Start time"), GET_REAL (U"End time"),
+		GET_REAL (U"Sampling frequency"), GET_INTEGER (U"Phase") - 1, GET_REAL (U"Frequency step"),
+		GET_REAL (U"First frequency"), GET_REAL (U"Ceiling"), GET_INTEGER (U"Number of components"));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
 END2 }
 
-FORM (old_Sounds_crossCorrelate, L"Cross-correlate (short)", 0) {
-	REAL (L"From lag (s)", L"-0.1")
-	REAL (L"To lag (s)", L"0.1")
-	BOOLEAN (L"Normalize", 1)
+FORM (old_Sounds_crossCorrelate, U"Cross-correlate (short)", 0) {
+	REAL (U"From lag (s)", U"-0.1")
+	REAL (U"To lag (s)", U"0.1")
+	BOOLEAN (U"Normalize", 1)
 	OK2
 DO
 	Sound s1 = NULL, s2 = NULL;
@@ -607,13 +606,13 @@ DO
 		iam (Sound);
 		( s1 ? s2 : s1 ) = me;
 	}
-	autoSound thee = Sounds_crossCorrelate_short (s1, s2, GET_REAL (L"From lag"), GET_REAL (L"To lag"), GET_INTEGER (L"Normalize"));
-	praat_new (thee.transfer(), L"cc_", s1 -> name, L"_", s2 -> name);
+	autoSound thee = Sounds_crossCorrelate_short (s1, s2, GET_REAL (U"From lag"), GET_REAL (U"To lag"), GET_INTEGER (U"Normalize"));
+	praat_new (thee.transfer(), U"cc_", s1 -> name, U"_", s2 -> name);
 END2 }
 
-FORM (Sounds_crossCorrelate, L"Sounds: Cross-correlate", L"Sounds: Cross-correlate...") {
-	RADIO_ENUM (L"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
-	RADIO_ENUM (L"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
+FORM (Sounds_crossCorrelate, U"Sounds: Cross-correlate", U"Sounds: Cross-correlate...") {
+	RADIO_ENUM (U"Amplitude scaling", kSounds_convolve_scaling, DEFAULT)
+	RADIO_ENUM (U"Signal outside time domain is...", kSounds_convolve_signalOutsideTimeDomain, DEFAULT)
 	OK2
 DO_ALTERNATIVE (old_Sounds_crossCorrelate)
 	Sound s1 = NULL, s2 = NULL;
@@ -623,89 +622,89 @@ DO_ALTERNATIVE (old_Sounds_crossCorrelate)
 	}
 	Melder_assert (s1 != NULL && s2 != NULL);
 	autoSound thee = Sounds_crossCorrelate (s1, s2,
-		GET_ENUM (kSounds_convolve_scaling, L"Amplitude scaling"),
-		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, L"Signal outside time domain is..."));
-	praat_new (thee.transfer(), s1 -> name, L"_", s2 -> name);
+		GET_ENUM (kSounds_convolve_scaling, U"Amplitude scaling"),
+		GET_ENUM (kSounds_convolve_signalOutsideTimeDomain, U"Signal outside time domain is..."));
+	praat_new (thee.transfer(), s1 -> name, U"_", s2 -> name);
 END2 }
 
-FORM (Sound_deemphasizeInline, L"Sound: De-emphasize (in-line)", L"Sound: De-emphasize (in-line)...") {
-	REAL (L"From frequency (Hz)", L"50.0")
+FORM (Sound_deemphasizeInline, U"Sound: De-emphasize (in-line)", U"Sound: De-emphasize (in-line)...") {
+	REAL (U"From frequency (Hz)", U"50.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		Sound_deEmphasis (me, GET_REAL (L"From frequency"));
+		Sound_deEmphasis (me, GET_REAL (U"From frequency"));
 		Vector_scale (me, 0.99);
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Sound_deepenBandModulation, L"Deepen band modulation", L"Sound: Deepen band modulation...") {
-	POSITIVE (L"Enhancement (dB)", L"20")
-	POSITIVE (L"From frequency (Hz)", L"300")
-	POSITIVE (L"To frequency (Hz)", L"8000")
-	POSITIVE (L"Slow modulation (Hz)", L"3")
-	POSITIVE (L"Fast modulation (Hz)", L"30")
-	POSITIVE (L"Band smoothing (Hz)", L"100")
+FORM (Sound_deepenBandModulation, U"Deepen band modulation", U"Sound: Deepen band modulation...") {
+	POSITIVE (U"Enhancement (dB)", U"20")
+	POSITIVE (U"From frequency (Hz)", U"300")
+	POSITIVE (U"To frequency (Hz)", U"8000")
+	POSITIVE (U"Slow modulation (Hz)", U"3")
+	POSITIVE (U"Fast modulation (Hz)", U"30")
+	POSITIVE (U"Band smoothing (Hz)", U"100")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoSound thee = Sound_deepenBandModulation (me, GET_REAL (L"Enhancement"),
-			GET_REAL (L"From frequency"), GET_REAL (L"To frequency"),
-			GET_REAL (L"Slow modulation"), GET_REAL (L"Fast modulation"), GET_REAL (L"Band smoothing"));
-		praat_new (thee.transfer(), my name, L"_", Melder_integer ((long) GET_REAL (L"Enhancement")));
+		autoSound thee = Sound_deepenBandModulation (me, GET_REAL (U"Enhancement"),
+			GET_REAL (U"From frequency"), GET_REAL (U"To frequency"),
+			GET_REAL (U"Slow modulation"), GET_REAL (U"Fast modulation"), GET_REAL (U"Band smoothing"));
+		praat_new (thee.transfer(), my name, U"_", (long) (GET_REAL (U"Enhancement")));   // truncate number toward zero for visual effect
 	}
 END2 }
 
-FORM (old_Sound_draw, L"Sound: Draw", 0) {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range", L"0.0 (= all)")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	BOOLEAN (L"Garnish", 1)
+FORM (old_Sound_draw, U"Sound: Draw", nullptr) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range", U"0.0 (= all)")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Sound);
-		Sound_draw (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"), L"curve");
+		Sound_draw (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"), U"curve");
 	}
 END2 }
 
-FORM (Sound_draw, L"Sound: Draw", 0) {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range", L"0.0 (= all)")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	BOOLEAN (L"Garnish", 1)
-	LABEL (L"", L"")
-	OPTIONMENU (L"Drawing method", 1)
-		OPTION (L"Curve")
-		OPTION (L"Bars")
-		OPTION (L"Poles")
-		OPTION (L"Speckles")
+FORM (Sound_draw, U"Sound: Draw", nullptr) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range", U"0.0 (= all)")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	BOOLEAN (U"Garnish", 1)
+	LABEL (U"", U"")
+	OPTIONMENU (U"Drawing method", 1)
+		OPTION (U"Curve")
+		OPTION (U"Bars")
+		OPTION (U"Poles")
+		OPTION (U"Speckles")
 	OK2
 DO_ALTERNATIVE (old_Sound_draw)
 	autoPraatPicture picture;
 	LOOP {
 		iam (Sound);
-		Sound_draw (me, GRAPHICS, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"), GET_INTEGER (L"Garnish"), GET_STRING (L"Drawing method"));
+		Sound_draw (me, GRAPHICS, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"), GET_INTEGER (U"Garnish"), GET_STRING (U"Drawing method"));
 	}
 END2 }
 
-static void cb_SoundEditor_publication (Editor editor, void *closure, Data publication) {
+static void cb_SoundEditor_publication (Editor editor, void *closure, Daata publication) {
 	(void) editor;
 	(void) closure;
 	/*
 	 * Keep the gate for error handling.
 	 */
 	try {
-		praat_new (publication, NULL);
+		praat_new (publication, U"");
 		praat_updateSelection ();
-		if (Thing_member (publication, classSpectrum)) {
+		if (Thing_isa (publication, classSpectrum)) {
 			int IOBJECT;
 			LOOP {
 				iam (Spectrum);
@@ -714,15 +713,15 @@ static void cb_SoundEditor_publication (Editor editor, void *closure, Data publi
 			}
 		}
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 }
 DIRECT2 (Sound_edit) {
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a Sound from batch.");
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a Sound from batch.");
 	LOOP {
 		iam (Sound);
 		autoSoundEditor editor = SoundEditor_create (ID_AND_FULL_NAME, me);
-		editor -> setPublicationCallback (cb_SoundEditor_publication, NULL);
+		Editor_setPublicationCallback (editor.peek(), cb_SoundEditor_publication, NULL);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
 END2 }
@@ -732,20 +731,20 @@ DIRECT2 (Sound_extractAllChannels) {
 		iam (Sound);
 		for (long channel = 1; channel <= my ny; channel ++) {
 			autoSound thee = Sound_extractChannel (me, channel);
-			praat_new (thee.transfer(), my name, L"_ch", Melder_integer (channel));
+			praat_new (thee.transfer(), my name, U"_ch", channel);
 		}
 	}
 END2 }
 
-FORM (Sound_extractChannel, L"Sound: Extract channel", 0) {
-	CHANNEL (L"Channel (number, Left, or Right)", L"1")
+FORM (Sound_extractChannel, U"Sound: Extract channel", nullptr) {
+	CHANNEL (U"Channel (number, Left, or Right)", U"1")
 	OK2
 DO
-	long channel = GET_INTEGER (L"Channel");
+	long channel = GET_INTEGER (U"Channel");
 	LOOP {
 		iam (Sound);
 		autoSound thee = Sound_extractChannel (me, channel);
-		praat_new (thee.transfer(), my name, L"_ch", Melder_integer (channel));
+		praat_new (thee.transfer(), my name, U"_ch", channel);
 	}
 END2 }
 
@@ -753,40 +752,40 @@ DIRECT2 (Sound_extractLeftChannel) {
 	LOOP {
 		iam (Sound);
 		autoSound thee = Sound_extractChannel (me, 1);
-		praat_new (thee.transfer(), my name, L"_left");
+		praat_new (thee.transfer(), my name, U"_left");
 	}
 END2 }
 
-FORM (Sound_extractPart, L"Sound: Extract part", 0) {
-	REAL (L"left Time range (s)", L"0")
-	REAL (L"right Time range (s)", L"0.1")
-	OPTIONMENU_ENUM (L"Window shape", kSound_windowShape, DEFAULT)
-	POSITIVE (L"Relative width", L"1.0")
-	BOOLEAN (L"Preserve times", 0)
+FORM (Sound_extractPart, U"Sound: Extract part", nullptr) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.1")
+	OPTIONMENU_ENUM (U"Window shape", kSound_windowShape, DEFAULT)
+	POSITIVE (U"Relative width", U"1.0")
+	BOOLEAN (U"Preserve times", 0)
 	OK2
 DO
 	LOOP {
 		iam (Sound);
 		autoSound thee = Sound_extractPart (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_ENUM (kSound_windowShape, L"Window shape"), GET_REAL (L"Relative width"),
-			GET_INTEGER (L"Preserve times"));
-		praat_new (thee.transfer(), my name, L"_part");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_ENUM (kSound_windowShape, U"Window shape"), GET_REAL (U"Relative width"),
+			GET_INTEGER (U"Preserve times"));
+		praat_new (thee.transfer(), my name, U"_part");
 	}
 END2 }
 
-FORM (Sound_extractPartForOverlap, L"Sound: Extract part for overlap", 0) {
-	REAL (L"left Time range (s)", L"0")
-	REAL (L"right Time range (s)", L"0.1")
-	POSITIVE (L"Overlap (s)", L"0.01")
+FORM (Sound_extractPartForOverlap, U"Sound: Extract part for overlap", nullptr) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.1")
+	POSITIVE (U"Overlap (s)", U"0.01")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
 		autoSound thee = Sound_extractPartForOverlap (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"),
-			GET_REAL (L"Overlap"));
-		praat_new (thee.transfer(), my name, L"_part");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"),
+			GET_REAL (U"Overlap"));
+		praat_new (thee.transfer(), my name, U"_part");
 	}
 END2 }
 
@@ -794,109 +793,109 @@ DIRECT2 (Sound_extractRightChannel) {
 	LOOP {
 		iam (Sound);
 		autoSound thee = Sound_extractChannel (me, 2);
-		praat_new (thee.transfer(), my name, L"_right");
+		praat_new (thee.transfer(), my name, U"_right");
 	}
 END2 }
 
-FORM (Sound_filter_deemphasis, L"Sound: Filter (de-emphasis)", L"Sound: Filter (de-emphasis)...") {
-	REAL (L"From frequency (Hz)", L"50.0")
+FORM (Sound_filter_deemphasis, U"Sound: Filter (de-emphasis)", U"Sound: Filter (de-emphasis)...") {
+	REAL (U"From frequency (Hz)", U"50.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoSound thee = Sound_filter_deemphasis (me, GET_REAL (L"From frequency"));
-		praat_new (thee.transfer(), my name, L"_deemp");
+		autoSound thee = Sound_filter_deemphasis (me, GET_REAL (U"From frequency"));
+		praat_new (thee.transfer(), my name, U"_deemp");
 	}
 END2 }
 
-FORM (Sound_filter_formula, L"Sound: Filter (formula)...", L"Formula...") {
-	LABEL (L"", L"Frequency-domain filtering with a formula (uses Sound-to-Spectrum and Spectrum-to-Sound): x is frequency in hertz")
-	TEXTFIELD (L"formula", L"if x<500 or x>1000 then 0 else self fi; rectangular band filter")
+FORM (Sound_filter_formula, U"Sound: Filter (formula)...", U"Formula...") {
+	LABEL (U"", U"Frequency-domain filtering with a formula (uses Sound-to-Spectrum and Spectrum-to-Sound): x is frequency in hertz")
+	TEXTFIELD (U"formula", U"if x<500 or x>1000 then 0 else self fi; rectangular band filter")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoSound thee = Sound_filter_formula (me, GET_STRING (L"formula"), interpreter);
-		praat_new (thee.transfer(), my name, L"_filt");
+		autoSound thee = Sound_filter_formula (me, GET_STRING (U"formula"), interpreter);
+		praat_new (thee.transfer(), my name, U"_filt");
 	}
 END2 }
 
-FORM (Sound_filter_oneFormant, L"Sound: Filter (one formant)", L"Sound: Filter (one formant)...") {
-	REAL (L"Frequency (Hz)", L"1000")
-	POSITIVE (L"Bandwidth (Hz)", L"100")
+FORM (Sound_filter_oneFormant, U"Sound: Filter (one formant)", U"Sound: Filter (one formant)...") {
+	REAL (U"Frequency (Hz)", U"1000.0")
+	POSITIVE (U"Bandwidth (Hz)", U"100.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoSound thee = Sound_filter_oneFormant (me, GET_REAL (L"Frequency"), GET_REAL (L"Bandwidth"));
-		praat_new (thee.transfer(), my name, L"_filt");
+		autoSound thee = Sound_filter_oneFormant (me, GET_REAL (U"Frequency"), GET_REAL (U"Bandwidth"));
+		praat_new (thee.transfer(), my name, U"_filt");
 	}
 END2 }
 
-FORM (Sound_filterWithOneFormantInline, L"Sound: Filter with one formant (in-line)", L"Sound: Filter with one formant (in-line)...") {
-	REAL (L"Frequency (Hz)", L"1000")
-	POSITIVE (L"Bandwidth (Hz)", L"100")
+FORM (Sound_filterWithOneFormantInline, U"Sound: Filter with one formant (in-line)", U"Sound: Filter with one formant (in-line)...") {
+	REAL (U"Frequency (Hz)", U"1000.0")
+	POSITIVE (U"Bandwidth (Hz)", U"100.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		Sound_filterWithOneFormantInline (me, GET_REAL (L"Frequency"), GET_REAL (L"Bandwidth"));
+		Sound_filterWithOneFormantInline (me, GET_REAL (U"Frequency"), GET_REAL (U"Bandwidth"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Sound_filter_passHannBand, L"Sound: Filter (pass Hann band)", L"Sound: Filter (pass Hann band)...") {
-	REAL (L"From frequency (Hz)", L"500")
-	REAL (L"To frequency (Hz)", L"1000")
-	POSITIVE (L"Smoothing (Hz)", L"100")
+FORM (Sound_filter_passHannBand, U"Sound: Filter (pass Hann band)", U"Sound: Filter (pass Hann band)...") {
+	REAL (U"From frequency (Hz)", U"500.0")
+	REAL (U"To frequency (Hz)", U"1000.0")
+	POSITIVE (U"Smoothing (Hz)", U"100.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
 		autoSound thee = Sound_filter_passHannBand (me,
-			GET_REAL (L"From frequency"), GET_REAL (L"To frequency"), GET_REAL (L"Smoothing"));
-		praat_new (thee.transfer(), my name, L"_band");
+			GET_REAL (U"From frequency"), GET_REAL (U"To frequency"), GET_REAL (U"Smoothing"));
+		praat_new (thee.transfer(), my name, U"_band");
 	}
 END2 }
 
-FORM (Sound_filter_preemphasis, L"Sound: Filter (pre-emphasis)", L"Sound: Filter (pre-emphasis)...") {
-	REAL (L"From frequency (Hz)", L"50.0")
+FORM (Sound_filter_preemphasis, U"Sound: Filter (pre-emphasis)", U"Sound: Filter (pre-emphasis)...") {
+	REAL (U"From frequency (Hz)", U"50.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoSound thee = Sound_filter_preemphasis (me, GET_REAL (L"From frequency"));
-		praat_new (thee.transfer(), my name, L"_preemp");
+		autoSound thee = Sound_filter_preemphasis (me, GET_REAL (U"From frequency"));
+		praat_new (thee.transfer(), my name, U"_preemp");
 	}
 END2 }
 
-FORM (Sound_filter_stopHannBand, L"Sound: Filter (stop Hann band)", L"Sound: Filter (stop Hann band)...") {
-	REAL (L"From frequency (Hz)", L"500")
-	REAL (L"To frequency (Hz)", L"1000")
-	POSITIVE (L"Smoothing (Hz)", L"100")
+FORM (Sound_filter_stopHannBand, U"Sound: Filter (stop Hann band)", U"Sound: Filter (stop Hann band)...") {
+	REAL (U"From frequency (Hz)", U"500.0")
+	REAL (U"To frequency (Hz)", U"1000.0")
+	POSITIVE (U"Smoothing (Hz)", U"100.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoSound thee = Sound_filter_stopHannBand (me, GET_REAL (L"From frequency"), GET_REAL (L"To frequency"), GET_REAL (L"Smoothing"));
-		praat_new (thee.transfer(), my name, L"_band");
+		autoSound thee = Sound_filter_stopHannBand (me, GET_REAL (U"From frequency"), GET_REAL (U"To frequency"), GET_REAL (U"Smoothing"));
+		praat_new (thee.transfer(), my name, U"_band");
 	}
 END2 }
 
-FORM (Sound_formula, L"Sound: Formula", L"Sound: Formula...") {
-	LABEL (L"label1", L"! `x' is the time in seconds, `col' is the sample number.")
-	LABEL (L"label2", L"x = x1   ! time associated with first sample")
-	LABEL (L"label3", L"for col from 1 to ncol")
-	LABEL (L"label4", L"   self [col] = ...")
-	TEXTFIELD (L"formula", L"self")
-	LABEL (L"label5", L"   x = x + dx")
-	LABEL (L"label6", L"endfor")
+FORM (Sound_formula, U"Sound: Formula", U"Sound: Formula...") {
+	LABEL (U"label1", U"! `x' is the time in seconds, `col' is the sample number.")
+	LABEL (U"label2", U"x = x1   ! time associated with first sample")
+	LABEL (U"label3", U"for col from 1 to ncol")
+	LABEL (U"label4", U"   self [col] = ...")
+	TEXTFIELD (U"formula", U"self")
+	LABEL (U"label5", U"   x = x + dx")
+	LABEL (U"label6", U"endfor")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
 		try {
-			Matrix_formula ((Matrix) me, GET_STRING (L"formula"), interpreter, NULL);
+			Matrix_formula ((Matrix) me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Sound may have partially changed
@@ -905,21 +904,21 @@ DO
 	}
 END2 }
 
-FORM (Sound_formula_part, L"Sound: Formula (part)", L"Sound: Formula...") {
-	REAL (L"From time", L"0.0")
-	REAL (L"To time", L"0.0 (= all)")
-	NATURAL (L"From channel", L"1")
-	NATURAL (L"To channel", L"2")
-	TEXTFIELD (L"formula", L"2 * self")
+FORM (Sound_formula_part, U"Sound: Formula (part)", U"Sound: Formula...") {
+	REAL (U"From time", U"0.0")
+	REAL (U"To time", U"0.0 (= all)")
+	NATURAL (U"From channel", U"1")
+	NATURAL (U"To channel", U"2")
+	TEXTFIELD (U"formula", U"2 * self")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
 		try {
 			Matrix_formula_part ((Matrix) me,
-				GET_REAL (L"From time"), GET_REAL (L"To time"),
-				GET_INTEGER (L"From channel") - 0.5, GET_INTEGER (L"To channel") + 0.5,
-				GET_STRING (L"formula"), interpreter, NULL);
+				GET_REAL (U"From time"), GET_REAL (U"To time"),
+				GET_INTEGER (U"From channel") - 0.5, GET_INTEGER (U"To channel") + 0.5,
+				GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Sound may have partially changed
@@ -928,34 +927,34 @@ DO
 	}
 END2 }
 
-FORM (Sound_getAbsoluteExtremum, L"Sound: Get absolute extremum", L"Sound: Get absolute extremum...") {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 4)
-		RADIOBUTTON (L"None")
-		RADIOBUTTON (L"Parabolic")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
+FORM (Sound_getAbsoluteExtremum, U"Sound: Get absolute extremum", U"Sound: Get absolute extremum...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
 		double absoluteExtremum = Vector_getAbsoluteExtremum (me,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (absoluteExtremum, L"Pascal");
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (absoluteExtremum, U"Pascal");
 	}
 END2 }
 
-FORM (Sound_getEnergy, L"Sound: Get energy", L"Sound: Get energy...") {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
+FORM (Sound_getEnergy, U"Sound: Get energy", U"Sound: Get energy...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double energy = Sound_getEnergy (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"));
-		Melder_informationReal (energy, L"Pa2 sec");
+		double energy = Sound_getEnergy (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"));
+		Melder_informationReal (energy, U"Pa2 sec");
 	}
 END2 }
 
@@ -963,17 +962,17 @@ DIRECT2 (Sound_getEnergyInAir) {
 	LOOP {
 		iam (Sound);
 		double energyInAir = Sound_getEnergyInAir (me);
-		Melder_informationReal (energyInAir, L"Joule/m2");
+		Melder_informationReal (energyInAir, U"Joule/m2");
 	}
 END2 }
 
-FORM (Sound_getIndexFromTime, L"Get sample number from time", L"Get sample number from time...") {
-	REAL (L"Time (s)", L"0.5")
+FORM (Sound_getIndexFromTime, U"Get sample number from time", U"Get sample number from time...") {
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double realIndex = Sampled_xToIndex (me, GET_REAL (L"Time"));
+		double realIndex = Sampled_xToIndex (me, GET_REAL (U"Time"));
 		Melder_informationReal (realIndex, NULL);
 	}
 END2 }
@@ -982,96 +981,96 @@ DIRECT2 (Sound_getIntensity_dB) {
 	LOOP {
 		iam (Sound);
 		double intensity = Sound_getIntensity_dB (me);
-		Melder_informationReal (intensity, L"dB");
+		Melder_informationReal (intensity, U"dB");
 	}
 END2 }
 
-FORM (Sound_getMaximum, L"Sound: Get maximum", L"Sound: Get maximum...") {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 4)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
-	RADIOBUTTON (L"Sinc700")
+FORM (Sound_getMaximum, U"Sound: Get maximum", U"Sound: Get maximum...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double maximum = Vector_getMaximum (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (maximum, L"Pascal");
+		double maximum = Vector_getMaximum (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (maximum, U"Pascal");
 	}
 END2 }
 
-FORM (old_Sound_getMean, L"Sound: Get mean", L"Sound: Get mean...") {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
+FORM (old_Sound_getMean, U"Sound: Get mean", U"Sound: Get mean...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double mean = Vector_getMean (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), Vector_CHANNEL_AVERAGE);
-		Melder_informationReal (mean, L"Pascal");
+		double mean = Vector_getMean (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), Vector_CHANNEL_AVERAGE);
+		Melder_informationReal (mean, U"Pascal");
 	}
 END2 }
 
-FORM (Sound_getMean, L"Sound: Get mean", L"Sound: Get mean...") {
-	CHANNEL (L"Channel", L"0 (= all)")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
+FORM (Sound_getMean, U"Sound: Get mean", U"Sound: Get mean...") {
+	CHANNEL (U"Channel", U"0 (= all)")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
 	OK2
 DO_ALTERNATIVE (old_Sound_getMean)
 	LOOP {
 		iam (Sound);
-		long channel = GET_INTEGER (L"Channel");
+		long channel = GET_INTEGER (U"Channel");
 		if (channel > my ny) channel = 1;
-		double mean = Vector_getMean (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), channel);
-		Melder_informationReal (mean, L"Pascal");
+		double mean = Vector_getMean (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), channel);
+		Melder_informationReal (mean, U"Pascal");
 	}
 END2 }
 
-FORM (Sound_getMinimum, L"Sound: Get minimum", L"Sound: Get minimum...") {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 4)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
-	RADIOBUTTON (L"Sinc700")
+FORM (Sound_getMinimum, U"Sound: Get minimum", U"Sound: Get minimum...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double minimum = Vector_getMinimum (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (minimum, L"Pascal");
+		double minimum = Vector_getMinimum (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (minimum, U"Pascal");
 	}
 END2 }
 
-FORM (old_Sound_getNearestZeroCrossing, L"Sound: Get nearest zero crossing", L"Sound: Get nearest zero crossing...") {
-	REAL (L"Time (s)", L"0.5")
+FORM (old_Sound_getNearestZeroCrossing, U"Sound: Get nearest zero crossing", U"Sound: Get nearest zero crossing...") {
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		if (my ny > 1) Melder_throw ("Cannot determine a zero crossing for a stereo sound.");
-		double zeroCrossing = Sound_getNearestZeroCrossing (me, GET_REAL (L"Time"), 1);
-		Melder_informationReal (zeroCrossing, L"seconds");
+		if (my ny > 1) Melder_throw (U"Cannot determine a zero crossing for a stereo sound.");
+		double zeroCrossing = Sound_getNearestZeroCrossing (me, GET_REAL (U"Time"), 1);
+		Melder_informationReal (zeroCrossing, U"seconds");
 	}
 END2 }
 
-FORM (Sound_getNearestZeroCrossing, L"Sound: Get nearest zero crossing", L"Sound: Get nearest zero crossing...") {
-	CHANNEL (L"Channel (number, Left, or Right)", L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (Sound_getNearestZeroCrossing, U"Sound: Get nearest zero crossing", U"Sound: Get nearest zero crossing...") {
+	CHANNEL (U"Channel (number, Left, or Right)", U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO_ALTERNATIVE (old_Sound_getNearestZeroCrossing)
 	LOOP {
 		iam (Sound);
-		long channel = GET_INTEGER (L"Channel");
+		long channel = GET_INTEGER (U"Channel");
 		if (channel > my ny) channel = 1;
-		double zeroCrossing = Sound_getNearestZeroCrossing (me, GET_REAL (L"Time"), channel);
-		Melder_informationReal (zeroCrossing, L"seconds");
+		double zeroCrossing = Sound_getNearestZeroCrossing (me, GET_REAL (U"Time"), channel);
+		Melder_informationReal (zeroCrossing, U"seconds");
 	}
 END2 }
 
@@ -1079,7 +1078,7 @@ DIRECT2 (Sound_getNumberOfChannels) {
 	LOOP {
 		iam (Sound);
 		long numberOfChannels = my ny;
-		Melder_information (Melder_integer (numberOfChannels), numberOfChannels == 1 ? L" channel (mono)" : numberOfChannels == 2 ? L" channels (stereo)" : L"channels");
+		Melder_information (numberOfChannels, numberOfChannels == 1 ? U" channel (mono)" : numberOfChannels == 2 ? U" channels (stereo)" : U"channels");
 	}
 END2 }
 
@@ -1087,19 +1086,19 @@ DIRECT2 (Sound_getNumberOfSamples) {
 	LOOP {
 		iam (Sound);
 		long numberOfSamples = my nx;
-		Melder_information (Melder_integer (numberOfSamples), L" samples");
+		Melder_information (numberOfSamples, U" samples");
 	}
 END2 }
 
-FORM (Sound_getPower, L"Sound: Get power", L"Sound: Get power...") {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
+FORM (Sound_getPower, U"Sound: Get power", U"Sound: Get power...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double power = Sound_getPower (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"));
-		Melder_informationReal (power, L"Pa2");
+		double power = Sound_getPower (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"));
+		Melder_informationReal (power, U"Pa2");
 	}
 END2 }
 
@@ -1107,19 +1106,19 @@ DIRECT2 (Sound_getPowerInAir) {
 	LOOP {
 		iam (Sound);
 		double powerInAir = Sound_getPowerInAir (me);
-		Melder_informationReal (powerInAir, L"Watt/m2");
+		Melder_informationReal (powerInAir, U"Watt/m2");
 	}
 END2 }
 
-FORM (Sound_getRootMeanSquare, L"Sound: Get root-mean-square", L"Sound: Get root-mean-square...") {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
+FORM (Sound_getRootMeanSquare, U"Sound: Get root-mean-square", U"Sound: Get root-mean-square...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double rootMeanSquare = Sound_getRootMeanSquare (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"));
-		Melder_informationReal (rootMeanSquare, L"Pascal");
+		double rootMeanSquare = Sound_getRootMeanSquare (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"));
+		Melder_informationReal (rootMeanSquare, U"Pascal");
 	}
 END2 }
 
@@ -1127,7 +1126,7 @@ DIRECT2 (Sound_getSamplePeriod) {
 	LOOP {
 		iam (Sound);
 		double samplePeriod = my dx;
-		Melder_informationReal (samplePeriod, L"seconds");
+		Melder_informationReal (samplePeriod, U"seconds");
 	}
 END2 }
 
@@ -1135,195 +1134,197 @@ DIRECT2 (Sound_getSampleRate) {
 	LOOP {
 		iam (Sound);
 		double samplingFrequency = 1.0 / my dx;
-		Melder_informationReal (samplingFrequency, L"Hz");
+		Melder_informationReal (samplingFrequency, U"Hz");
 	}
 END2 }
 
-FORM (old_Sound_getStandardDeviation, L"Sound: Get standard deviation", L"Sound: Get standard deviation...") {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
+FORM (old_Sound_getStandardDeviation, U"Sound: Get standard deviation", U"Sound: Get standard deviation...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double stdev = Vector_getStandardDeviation (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), Vector_CHANNEL_AVERAGE);
-		Melder_informationReal (stdev, L"Pascal");
+		double stdev = Vector_getStandardDeviation (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), Vector_CHANNEL_AVERAGE);
+		Melder_informationReal (stdev, U"Pascal");
 	}
 END2 }
 
-FORM (Sound_getStandardDeviation, L"Sound: Get standard deviation", L"Sound: Get standard deviation...") {
-	CHANNEL (L"Channel", L"0 (= average)")
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
+FORM (Sound_getStandardDeviation, U"Sound: Get standard deviation", U"Sound: Get standard deviation...") {
+	CHANNEL (U"Channel", U"0 (= average)")
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
 	OK2
 DO_ALTERNATIVE (old_Sound_getStandardDeviation)
 	LOOP {
 		iam (Sound);
-		long channel = GET_INTEGER (L"Channel");
+		long channel = GET_INTEGER (U"Channel");
 		if (channel > my ny) channel = 1;
-		double stdev = Vector_getStandardDeviation (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), channel);
-		Melder_informationReal (stdev, L"Pascal");
+		double stdev = Vector_getStandardDeviation (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), channel);
+		Melder_informationReal (stdev, U"Pascal");
 	}
 END2 }
 
-FORM (Sound_getTimeFromIndex, L"Get time from sample number", L"Get time from sample number...") {
-	INTEGER (L"Sample number", L"100")
+FORM (Sound_getTimeFromIndex, U"Get time from sample number", U"Get time from sample number...") {
+	INTEGER (U"Sample number", U"100")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double time = Sampled_indexToX (me, GET_INTEGER (L"Sample number"));
-		Melder_informationReal (time, L"seconds");
+		double time = Sampled_indexToX (me, GET_INTEGER (U"Sample number"));
+		Melder_informationReal (time, U"seconds");
 	}
 END2 }
 
-FORM (Sound_getTimeOfMaximum, L"Sound: Get time of maximum", L"Sound: Get time of maximum...") {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 4)
-		RADIOBUTTON (L"None")
-		RADIOBUTTON (L"Parabolic")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
+FORM (Sound_getTimeOfMaximum, U"Sound: Get time of maximum", U"Sound: Get time of maximum...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double time = Vector_getXOfMaximum (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (time, L"seconds");
+		double time = Vector_getXOfMaximum (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (time, U"seconds");
 	}
 END2 }
 
-FORM (Sound_getTimeOfMinimum, L"Sound: Get time of minimum", L"Sound: Get time of minimum...") {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	RADIO (L"Interpolation", 4)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
-	RADIOBUTTON (L"Sinc700")
+FORM (Sound_getTimeOfMinimum, U"Sound: Get time of minimum", U"Sound: Get time of minimum...") {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double time = Vector_getXOfMinimum (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (time, L"seconds");
+		double time = Vector_getXOfMinimum (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (time, U"seconds");
 	}
 END2 }
 
-FORM (old_Sound_getValueAtIndex, L"Sound: Get value at sample number", L"Sound: Get value at sample number...") {
-	INTEGER (L"Sample number", L"100")
+FORM (old_Sound_getValueAtIndex, U"Sound: Get value at sample number", U"Sound: Get value at sample number...") {
+	INTEGER (U"Sample number", U"100")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		long sampleIndex = GET_INTEGER (L"Sample number");
+		long sampleIndex = GET_INTEGER (U"Sample number");
 		Melder_informationReal (sampleIndex < 1 || sampleIndex > my nx ? NUMundefined :
-			my ny == 1 ? my z [1] [sampleIndex] : 0.5 * (my z [1] [sampleIndex] + my z [2] [sampleIndex]), L"Pascal");
+			my ny == 1 ? my z [1] [sampleIndex] : 0.5 * (my z [1] [sampleIndex] + my z [2] [sampleIndex]), U"Pascal");
 	}
 END2 }
 
-FORM (Sound_getValueAtIndex, L"Sound: Get value at sample number", L"Sound: Get value at sample number...") {
-	CHANNEL (L"Channel", L"0 (= average)")
-	INTEGER (L"Sample number", L"100")
+FORM (Sound_getValueAtIndex, U"Sound: Get value at sample number", U"Sound: Get value at sample number...") {
+	CHANNEL (U"Channel", U"0 (= average)")
+	INTEGER (U"Sample number", U"100")
 	OK2
 DO_ALTERNATIVE (old_Sound_getValueAtIndex)
 	LOOP {
 		iam (Sound);
-		long sampleIndex = GET_INTEGER (L"Sample number");
-		long channel = GET_INTEGER (L"Channel");
+		long sampleIndex = GET_INTEGER (U"Sample number");
+		long channel = GET_INTEGER (U"Channel");
 		if (channel > my ny) channel = 1;
 		Melder_informationReal (sampleIndex < 1 || sampleIndex > my nx ? NUMundefined :
-			Sampled_getValueAtSample (me, sampleIndex, channel, 0), L"Pascal");
+			Sampled_getValueAtSample (me, sampleIndex, channel, 0), U"Pascal");
 	}
 END2 }
 
-FORM (old_Sound_getValueAtTime, L"Sound: Get value at time", L"Sound: Get value at time...") {
-	REAL (L"Time (s)", L"0.5")
-	RADIO (L"Interpolation", 4)
-		RADIOBUTTON (L"Nearest")
-		RADIOBUTTON (L"Linear")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
+FORM (old_Sound_getValueAtTime, U"Sound: Get value at time", U"Sound: Get value at time...") {
+	REAL (U"Time (s)", U"0.5")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"Nearest")
+		RADIOBUTTON (U"Linear")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		double value = Vector_getValueAtX (me, GET_REAL (L"Time"), Vector_CHANNEL_AVERAGE, GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (value, L"Pascal");
+		double value = Vector_getValueAtX (me, GET_REAL (U"Time"), Vector_CHANNEL_AVERAGE, GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (value, U"Pascal");
 	}
 END2 }
 
-FORM (Sound_getValueAtTime, L"Sound: Get value at time", L"Sound: Get value at time...") {
-	CHANNEL (L"Channel", L"0 (= average)")
-	REAL (L"Time (s)", L"0.5")
-	RADIO (L"Interpolation", 4)
-		RADIOBUTTON (L"Nearest")
-		RADIOBUTTON (L"Linear")
-		RADIOBUTTON (L"Cubic")
-		RADIOBUTTON (L"Sinc70")
-		RADIOBUTTON (L"Sinc700")
+FORM (Sound_getValueAtTime, U"Sound: Get value at time", U"Sound: Get value at time...") {
+	CHANNEL (U"Channel", U"0 (= average)")
+	REAL (U"Time (s)", U"0.5")
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"Nearest")
+		RADIOBUTTON (U"Linear")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
 	OK2
 DO_ALTERNATIVE (old_Sound_getValueAtTime)
 	LOOP {
 		iam (Sound);
-		long channel = GET_INTEGER (L"Channel");
+		long channel = GET_INTEGER (U"Channel");
 		if (channel > my ny) channel = 1;
-		double value = Vector_getValueAtX (me, GET_REAL (L"Time"), channel, GET_INTEGER (L"Interpolation") - 1);
-		Melder_informationReal (value, L"Pascal");
+		double value = Vector_getValueAtX (me, GET_REAL (U"Time"), channel, GET_INTEGER (U"Interpolation") - 1);
+		Melder_informationReal (value, U"Pascal");
 	}
 END2 }
 
-DIRECT2 (Sound_help) { Melder_help (L"Sound"); END2 }
+DIRECT2 (Sound_help) {
+	Melder_help (U"Sound");
+END2 }
 
-FORM (Sound_lengthen_overlapAdd, L"Sound: Lengthen (overlap-add)", L"Sound: Lengthen (overlap-add)...") {
-	POSITIVE (L"Minimum pitch (Hz)", L"75")
-	POSITIVE (L"Maximum pitch (Hz)", L"600")
-	POSITIVE (L"Factor", L"1.5")
+FORM (Sound_lengthen_overlapAdd, U"Sound: Lengthen (overlap-add)", U"Sound: Lengthen (overlap-add)...") {
+	POSITIVE (U"Minimum pitch (Hz)", U"75")
+	POSITIVE (U"Maximum pitch (Hz)", U"600")
+	POSITIVE (U"Factor", U"1.5")
 	OK2
 DO
-	double minimumPitch = GET_REAL (L"Minimum pitch"), maximumPitch = GET_REAL (L"Maximum pitch");
-	double factor = GET_REAL (L"Factor");
-	if (minimumPitch >= maximumPitch) Melder_throw ("Maximum pitch should be greater than minimum pitch.");
+	double minimumPitch = GET_REAL (U"Minimum pitch"), maximumPitch = GET_REAL (U"Maximum pitch");
+	double factor = GET_REAL (U"Factor");
+	if (minimumPitch >= maximumPitch) Melder_throw (U"Maximum pitch should be greater than minimum pitch.");
 	LOOP {
 		iam (Sound);
 		autoSound thee = Sound_lengthen_overlapAdd (me, minimumPitch, maximumPitch, factor);
-		praat_new (thee.transfer(), my name, L"_", Melder_fixed (factor, 2));
+		praat_new (thee.transfer(), my name, U"_", Melder_fixed (factor, 2));
 	}
 END2 }
 
-FORM (Sound_multiply, L"Sound: Multiply", 0) {
-	REAL (L"Multiplication factor", L"1.5")
+FORM (Sound_multiply, U"Sound: Multiply", 0) {
+	REAL (U"Multiplication factor", U"1.5")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		Vector_multiplyByScalar (me, GET_REAL (L"Multiplication factor"));
+		Vector_multiplyByScalar (me, GET_REAL (U"Multiplication factor"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Sound_multiplyByWindow, L"Sound: Multiply by window", 0) {
-	OPTIONMENU_ENUM (L"Window shape", kSound_windowShape, HANNING)
+FORM (Sound_multiplyByWindow, U"Sound: Multiply by window", 0) {
+	OPTIONMENU_ENUM (U"Window shape", kSound_windowShape, HANNING)
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		Sound_multiplyByWindow (me, GET_ENUM (kSound_windowShape, L"Window shape"));
+		Sound_multiplyByWindow (me, GET_ENUM (kSound_windowShape, U"Window shape"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Sound_overrideSamplingFrequency, L"Sound: Override sampling frequency", 0) {
-	POSITIVE (L"New sampling frequency (Hz)", L"16000.0")
+FORM (Sound_overrideSamplingFrequency, U"Sound: Override sampling frequency", 0) {
+	POSITIVE (U"New sampling frequency (Hz)", U"16000.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		Sound_overrideSamplingFrequency (me, GET_REAL (L"New sampling frequency"));
+		Sound_overrideSamplingFrequency (me, GET_REAL (U"New sampling frequency"));
 		praat_dataChanged (me);
 	}
 END2 }
@@ -1336,80 +1337,76 @@ DIRECT2 (Sound_play) {
 	if (n == 1 || MelderAudio_getOutputMaximumAsynchronicity () < kMelder_asynchronicityLevel_ASYNCHRONOUS) {
 		LOOP {
 			iam (Sound);
-			Sound_play (me, NULL, NULL);
+			Sound_play (me, nullptr, nullptr);
 		}
 	} else {
 		MelderAudio_setOutputMaximumAsynchronicity (kMelder_asynchronicityLevel_INTERRUPTABLE);
 		LOOP {
 			iam (Sound);
-			Sound_play (me, NULL, NULL);   // BUG: exception-safe?
+			Sound_play (me, nullptr, nullptr);   // BUG: exception-safe?
 		}
 		MelderAudio_setOutputMaximumAsynchronicity (kMelder_asynchronicityLevel_ASYNCHRONOUS);
 	}
 END2 }
 
-FORM (Sound_preemphasizeInline, L"Sound: Pre-emphasize (in-line)", L"Sound: Pre-emphasize (in-line)...") {
-	REAL (L"From frequency (Hz)", L"50.0")
+FORM (Sound_preemphasizeInline, U"Sound: Pre-emphasize (in-line)", U"Sound: Pre-emphasize (in-line)...") {
+	REAL (U"From frequency (Hz)", U"50.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		Sound_preEmphasis (me, GET_REAL (L"From frequency"));
+		Sound_preEmphasis (me, GET_REAL (U"From frequency"));
 		Vector_scale (me, 0.99);
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM_READ2 (Sound_readSeparateChannelsFromSoundFile, L"Read separate channels from sound file", 0, true) {
+FORM_READ2 (Sound_readSeparateChannelsFromSoundFile, U"Read separate channels from sound file", 0, true) {
 	autoSound sound = Sound_readFromSoundFile (file);
-	wchar_t name [300];
-	wcscpy (name, MelderFile_name (file));
-	wchar_t *lastPeriod = wcsrchr (name, '.');
+	char32 name [300];
+	Melder_sprint (name,300, MelderFile_name (file));
+	char32 *lastPeriod = str32rchr (name, U'.');
 	if (lastPeriod != NULL) {
 		*lastPeriod = '\0';
 	}
 	for (long ichan = 1; ichan <= sound -> ny; ichan ++) {
 		autoSound thee = Sound_extractChannel (sound.peek(), ichan);
-		praat_new (thee.transfer(), name, L"_ch", Melder_integer (ichan));
+		praat_new (thee.transfer(), name, U"_ch", ichan);
 	}
 END2 }
 
-FORM_READ2 (Sound_readFromRawAlawFile, L"Read Sound from raw Alaw file", 0, true) {
+FORM_READ2 (Sound_readFromRawAlawFile, U"Read Sound from raw Alaw file", 0, true) {
 	autoSound me = Sound_readFromRawAlawFile (file);
 	praat_new (me.transfer(), MelderFile_name (file));
 END2 }
 
-static SoundRecorder theSoundRecorder;   // only one at a time can exist
+static autoSoundRecorder theSoundRecorder;   // only one at a time can exist
 static int thePreviousNumberOfChannels;
-static void cb_SoundRecorder_destruction (Editor editor, void *closure) {
-	(void) editor;
-	(void) closure;
-	theSoundRecorder = NULL;
+static void cb_SoundRecorder_destruction (Editor /*editor*/, void* /*closure*/) {
+	theSoundRecorder = nullptr;
 }
-static void cb_SoundRecorder_publication (Editor editor, void *closure, Data publication) {
-	(void) editor;
-	(void) closure;
+static void cb_SoundRecorder_publication (Editor /*editor*/, void* /*closure*/, Daata publication) {
 	try {
-		praat_new (publication, NULL);
+		praat_new (publication);
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 	praat_updateSelection ();
 }
 static void do_Sound_record (int numberOfChannels) {
 	if (theCurrentPraatApplication -> batch)
-		Melder_throw ("Cannot record a Sound from batch.");
+		Melder_throw (U"Cannot record a Sound from batch.");
 	if (theSoundRecorder) {
 		if (numberOfChannels == thePreviousNumberOfChannels) {
-			theSoundRecorder -> raise ();
+			Editor_raise (theSoundRecorder.get());
 		} else {
-			forget (theSoundRecorder);
+			theSoundRecorder.reset();
 		}
 	}
 	if (! theSoundRecorder) {
 		theSoundRecorder = SoundRecorder_create (numberOfChannels);
-		theSoundRecorder -> setDestructionCallback (cb_SoundRecorder_destruction, NULL);
-		theSoundRecorder -> setPublicationCallback (cb_SoundRecorder_publication, NULL);
+		Editor_setDestructionCallback (theSoundRecorder.get(), cb_SoundRecorder_destruction, nullptr);
+		Editor_setPublicationCallback (theSoundRecorder.get(), cb_SoundRecorder_publication, nullptr);
 	}
 	thePreviousNumberOfChannels = numberOfChannels;
 }
@@ -1420,144 +1417,144 @@ DIRECT2 (Sound_record_stereo) {
 	do_Sound_record (2);
 END2 }
 
-FORM (Sound_recordFixedTime, L"Record Sound", 0) {
-	RADIO (L"Input source", 1)
-		RADIOBUTTON (L"Microphone")
-		RADIOBUTTON (L"Line")
-		REAL (L"Gain (0-1)", L"0.1")
-	REAL (L"Balance (0-1)", L"0.5")
-	RADIO (L"Sampling frequency", 1)
+FORM (Sound_recordFixedTime, U"Record Sound", 0) {
+	RADIO (U"Input source", 1)
+		RADIOBUTTON (U"Microphone")
+		RADIOBUTTON (U"Line")
+	REAL (U"Gain (0-1)", U"0.1")
+	REAL (U"Balance (0-1)", U"0.5")
+	RADIO (U"Sampling frequency", 1)
 		#ifdef UNIX
-		RADIOBUTTON (L"8000")
+		RADIOBUTTON (U"8000")
 		#endif
 		#ifndef macintosh
-		RADIOBUTTON (L"11025")
+		RADIOBUTTON (U"11025")
 		#endif
 		#ifdef UNIX
-		RADIOBUTTON (L"16000")
+		RADIOBUTTON (U"16000")
 		#endif
 		#ifndef macintosh
-		RADIOBUTTON (L"22050")
+		RADIOBUTTON (U"22050")
 		#endif
 		#ifdef UNIX
-		RADIOBUTTON (L"32000")
+		RADIOBUTTON (U"32000")
 		#endif
-		RADIOBUTTON (L"44100")
-		RADIOBUTTON (L"48000")
-		RADIOBUTTON (L"96000")
-	POSITIVE (L"Duration (seconds)", L"1.0")
+		RADIOBUTTON (U"44100")
+		RADIOBUTTON (U"48000")
+		RADIOBUTTON (U"96000")
+	POSITIVE (U"Duration (seconds)", U"1.0")
 	OK2
 DO
-	autoSound me = Sound_recordFixedTime (GET_INTEGER (L"Input source"),
-		GET_REAL (L"Gain"), GET_REAL (L"Balance"),
-		wcstod (GET_STRING (L"Sampling frequency"), NULL), GET_REAL (L"Duration"));
-	praat_new (me.transfer(), L"untitled");
+	autoSound me = Sound_recordFixedTime (GET_INTEGER (U"Input source"),
+		GET_REAL (U"Gain"), GET_REAL (U"Balance"),
+		Melder_atof (GET_STRING (U"Sampling frequency")), GET_REAL (U"Duration"));
+	praat_new (me.transfer(), U"untitled");
 END2 }
 
-FORM (Sound_resample, L"Sound: Resample", L"Sound: Resample...") {
-	POSITIVE (L"New sampling frequency (Hz)", L"10000")
-	NATURAL (L"Precision (samples)", L"50")
+FORM (Sound_resample, U"Sound: Resample", U"Sound: Resample...") {
+	POSITIVE (U"New sampling frequency (Hz)", U"10000")
+	NATURAL (U"Precision (samples)", U"50")
 	OK2
 DO
-	double samplingFrequency = GET_REAL (L"New sampling frequency");
+	double samplingFrequency = GET_REAL (U"New sampling frequency");
 	LOOP {
 		iam (Sound);
-		autoSound thee = Sound_resample (me, samplingFrequency, GET_INTEGER (L"Precision"));
-		praat_new (thee.transfer(), my name, L"_", Melder_integer ((long) round (samplingFrequency)));
+		autoSound thee = Sound_resample (me, samplingFrequency, GET_INTEGER (U"Precision"));
+		praat_new (thee.transfer(), my name, U"_", (long) round (samplingFrequency));
 	}
 END2 }
 
 DIRECT2 (Sound_reverse) {
 	LOOP {
 		iam (Sound);
-		Sound_reverse (me, 0, 0);
+		Sound_reverse (me, 0.0, 0.0);
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_saveAs24BitWavFile, L"Save as 24-bit WAV file", 0, L"wav") {
+FORM_WRITE2 (Sound_saveAs24BitWavFile, U"Save as 24-bit WAV file", 0, U"wav") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_WAV, 24);
 END2 }
 
-FORM_WRITE2 (Sound_saveAs32BitWavFile, L"Save as 32-bit WAV file", 0, L"wav") {
+FORM_WRITE2 (Sound_saveAs32BitWavFile, U"Save as 32-bit WAV file", 0, U"wav") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_WAV, 32);
 END2 }
 
-FORM (Sound_scalePeak, L"Sound: Scale peak", L"Sound: Scale peak...") {
-	POSITIVE (L"New absolute peak", L"0.99")
+FORM (Sound_scalePeak, U"Sound: Scale peak", U"Sound: Scale peak...") {
+	POSITIVE (U"New absolute peak", U"0.99")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		Vector_scale (me, GET_REAL (L"New absolute peak"));
+		Vector_scale (me, GET_REAL (U"New absolute peak"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Sound_scaleIntensity, L"Sound: Scale intensity", L"Sound: Scale intensity") {
-	POSITIVE (L"New average intensity (dB SPL)", L"70.0")
+FORM (Sound_scaleIntensity, U"Sound: Scale intensity", U"Sound: Scale intensity") {
+	POSITIVE (U"New average intensity (dB SPL)", U"70.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		Sound_scaleIntensity (me, GET_REAL (L"New average intensity"));
+		Sound_scaleIntensity (me, GET_REAL (U"New average intensity"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (old_Sound_setValueAtIndex, L"Sound: Set value at sample number", L"Sound: Set value at sample number...") {
-	NATURAL (L"Sample number", L"100")
-	REAL (L"New value", L"0")
+FORM (old_Sound_setValueAtIndex, U"Sound: Set value at sample number", U"Sound: Set value at sample number...") {
+	NATURAL (U"Sample number", U"100")
+	REAL (U"New value", U"0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		long index = GET_INTEGER (L"Sample number");
+		long index = GET_INTEGER (U"Sample number");
 		if (index > my nx)
-			Melder_throw ("The sample number should not exceed the number of samples, which is ", my nx, ".");
+			Melder_throw (U"The sample number should not exceed the number of samples, which is ", my nx, U".");
 		for (long channel = 1; channel <= my ny; channel ++)
-			my z [channel] [index] = GET_REAL (L"New value");
+			my z [channel] [index] = GET_REAL (U"New value");
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Sound_setValueAtIndex, L"Sound: Set value at sample number", L"Sound: Set value at sample number...") {
-	CHANNEL (L"Channel", L"0 (= all)")
-	NATURAL (L"Sample number", L"100")
-	REAL (L"New value", L"0")
+FORM (Sound_setValueAtIndex, U"Sound: Set value at sample number", U"Sound: Set value at sample number...") {
+	CHANNEL (U"Channel", U"0 (= all)")
+	NATURAL (U"Sample number", U"100")
+	REAL (U"New value", U"0")
 	OK2
 DO_ALTERNATIVE (old_Sound_setValueAtIndex)
 	LOOP {
 		iam (Sound);
-		long index = GET_INTEGER (L"Sample number");
+		long index = GET_INTEGER (U"Sample number");
 		if (index > my nx)
-			Melder_throw ("The sample number should not exceed the number of samples, which is ", my nx, ".");
-		long channel = GET_INTEGER (L"Channel");
+			Melder_throw (U"The sample number should not exceed the number of samples, which is ", my nx, U".");
+		long channel = GET_INTEGER (U"Channel");
 		if (channel > my ny) channel = 1;
 		if (channel > 0) {
-			my z [channel] [index] = GET_REAL (L"New value");
+			my z [channel] [index] = GET_REAL (U"New value");
 		} else {
 			for (channel = 1; channel <= my ny; channel ++) {
-				my z [channel] [index] = GET_REAL (L"New value");
+				my z [channel] [index] = GET_REAL (U"New value");
 			}
 		}
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Sound_setPartToZero, L"Sound: Set part to zero", 0) {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"0.0 (= all)")
-	RADIO (L"Cut", 2)
-		OPTION (L"at exactly these times")
-		OPTION (L"at nearest zero crossing")
+FORM (Sound_setPartToZero, U"Sound: Set part to zero", 0) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"0.0 (= all)")
+	RADIO (U"Cut", 2)
+		OPTION (U"at exactly these times")
+		OPTION (U"at nearest zero crossing")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		Sound_setZero (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Cut") - 1);
+		Sound_setZero (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Cut") - 1);
 		praat_dataChanged (me);
 	}
 END2 }
@@ -1570,194 +1567,194 @@ DIRECT2 (Sound_subtractMean) {
 	}
 END2 }
 
-FORM (Sound_to_Manipulation, L"Sound: To Manipulation", L"Manipulation") {
-	POSITIVE (L"Time step (s)", L"0.01")
-	POSITIVE (L"Minimum pitch (Hz)", L"75")
-	POSITIVE (L"Maximum pitch (Hz)", L"600")
+FORM (Sound_to_Manipulation, U"Sound: To Manipulation", U"Manipulation") {
+	POSITIVE (U"Time step (s)", U"0.01")
+	POSITIVE (U"Minimum pitch (Hz)", U"75")
+	POSITIVE (U"Maximum pitch (Hz)", U"600")
 	OK2
 DO
-	double fmin = GET_REAL (L"Minimum pitch"), fmax = GET_REAL (L"Maximum pitch");
-	if (fmax <= fmin) Melder_throw ("Maximum pitch must be greater than minimum pitch.");
+	double fmin = GET_REAL (U"Minimum pitch"), fmax = GET_REAL (U"Maximum pitch");
+	if (fmax <= fmin) Melder_throw (U"Maximum pitch must be greater than minimum pitch.");
 	LOOP {
 		iam (Sound);
-		autoManipulation thee = Sound_to_Manipulation (me, GET_REAL (L"Time step"), fmin, fmax);
+		autoManipulation thee = Sound_to_Manipulation (me, GET_REAL (U"Time step"), fmin, fmax);
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Cochleagram, L"Sound: To Cochleagram", 0) {
-	POSITIVE (L"Time step (s)", L"0.01")
-	POSITIVE (L"Frequency resolution (Bark)", L"0.1")
-	POSITIVE (L"Window length (s)", L"0.03")
-	REAL (L"Forward-masking time (s)", L"0.03")
+FORM (Sound_to_Cochleagram, U"Sound: To Cochleagram", 0) {
+	POSITIVE (U"Time step (s)", U"0.01")
+	POSITIVE (U"Frequency resolution (Bark)", U"0.1")
+	POSITIVE (U"Window length (s)", U"0.03")
+	REAL (U"Forward-masking time (s)", U"0.03")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoCochleagram thee = Sound_to_Cochleagram (me, GET_REAL (L"Time step"),
-			GET_REAL (L"Frequency resolution"), GET_REAL (L"Window length"), GET_REAL (L"Forward-masking time"));
+		autoCochleagram thee = Sound_to_Cochleagram (me, GET_REAL (U"Time step"),
+			GET_REAL (U"Frequency resolution"), GET_REAL (U"Window length"), GET_REAL (U"Forward-masking time"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Cochleagram_edb, L"Sound: To Cochleagram (De Boer, Meddis & Hewitt)", 0) {
-	POSITIVE (L"Time step (s)", L"0.01")
-	POSITIVE (L"Frequency resolution (Bark)", L"0.1")
-	BOOLEAN (L"Has synapse", 1)
-	LABEL (L"", L"Meddis synapse properties")
-	POSITIVE (L"   replenishment rate (/sec)", L"5.05")
-	POSITIVE (L"   loss rate (/sec)", L"2500")
-	POSITIVE (L"   return rate (/sec)", L"6580")
-	POSITIVE (L"   reprocessing rate (/sec)", L"66.31")
+FORM (Sound_to_Cochleagram_edb, U"Sound: To Cochleagram (De Boer, Meddis & Hewitt)", 0) {
+	POSITIVE (U"Time step (s)", U"0.01")
+	POSITIVE (U"Frequency resolution (Bark)", U"0.1")
+	BOOLEAN (U"Has synapse", true)
+	LABEL (U"", U"Meddis synapse properties")
+	POSITIVE (U"   replenishment rate (/sec)", U"5.05")
+	POSITIVE (U"   loss rate (/sec)", U"2500.0")
+	POSITIVE (U"   return rate (/sec)", U"6580.0")
+	POSITIVE (U"   reprocessing rate (/sec)", U"66.31")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoCochleagram thee = Sound_to_Cochleagram_edb (me, GET_REAL (L"Time step"),
-			GET_REAL (L"Frequency resolution"), GET_INTEGER (L"Has synapse"),
-			GET_REAL (L"   replenishment rate"), GET_REAL (L"   loss rate"),
-			GET_REAL (L"   return rate"), GET_REAL (L"   reprocessing rate"));
+		autoCochleagram thee = Sound_to_Cochleagram_edb (me, GET_REAL (U"Time step"),
+			GET_REAL (U"Frequency resolution"), GET_INTEGER (U"Has synapse"),
+			GET_REAL (U"   replenishment rate"), GET_REAL (U"   loss rate"),
+			GET_REAL (U"   return rate"), GET_REAL (U"   reprocessing rate"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Formant_burg, L"Sound: To Formant (Burg method)", L"Sound: To Formant (burg)...") {
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	POSITIVE (L"Max. number of formants", L"5")
-	REAL (L"Maximum formant (Hz)", L"5500 (= adult female)")
-	POSITIVE (L"Window length (s)", L"0.025")
-	POSITIVE (L"Pre-emphasis from (Hz)", L"50")
+FORM (Sound_to_Formant_burg, U"Sound: To Formant (Burg method)", U"Sound: To Formant (burg)...") {
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	POSITIVE (U"Max. number of formants", U"5.0")
+	REAL (U"Maximum formant (Hz)", U"5500.0 (= adult female)")
+	POSITIVE (U"Window length (s)", U"0.025")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoFormant thee = Sound_to_Formant_burg (me, GET_REAL (L"Time step"),
-			GET_REAL (L"Max. number of formants"), GET_REAL (L"Maximum formant"),
-			GET_REAL (L"Window length"), GET_REAL (L"Pre-emphasis from"));
+		autoFormant thee = Sound_to_Formant_burg (me, GET_REAL (U"Time step"),
+			GET_REAL (U"Max. number of formants"), GET_REAL (U"Maximum formant"),
+			GET_REAL (U"Window length"), GET_REAL (U"Pre-emphasis from"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Formant_keepAll, L"Sound: To Formant (keep all)", L"Sound: To Formant (keep all)...") {
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	POSITIVE (L"Max. number of formants", L"5")
-	REAL (L"Maximum formant (Hz)", L"5500 (= adult female)")
-	POSITIVE (L"Window length (s)", L"0.025")
-	POSITIVE (L"Pre-emphasis from (Hz)", L"50")
+FORM (Sound_to_Formant_keepAll, U"Sound: To Formant (keep all)", U"Sound: To Formant (keep all)...") {
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	POSITIVE (U"Max. number of formants", U"5.0")
+	REAL (U"Maximum formant (Hz)", U"5500.0 (= adult female)")
+	POSITIVE (U"Window length (s)", U"0.025")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoFormant thee = Sound_to_Formant_keepAll (me, GET_REAL (L"Time step"),
-			GET_REAL (L"Max. number of formants"), GET_REAL (L"Maximum formant"),
-			GET_REAL (L"Window length"), GET_REAL (L"Pre-emphasis from"));
+		autoFormant thee = Sound_to_Formant_keepAll (me, GET_REAL (U"Time step"),
+			GET_REAL (U"Max. number of formants"), GET_REAL (U"Maximum formant"),
+			GET_REAL (U"Window length"), GET_REAL (U"Pre-emphasis from"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Formant_willems, L"Sound: To Formant (split Levinson (Willems))", L"Sound: To Formant (sl)...") {
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	POSITIVE (L"Number of formants", L"5")
-	REAL (L"Maximum formant (Hz)", L"5500 (= adult female)")
-	POSITIVE (L"Window length (s)", L"0.025")
-	POSITIVE (L"Pre-emphasis from (Hz)", L"50")
+FORM (Sound_to_Formant_willems, U"Sound: To Formant (split Levinson (Willems))", U"Sound: To Formant (sl)...") {
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	POSITIVE (U"Number of formants", U"5.0")
+	REAL (U"Maximum formant (Hz)", U"5500.0 (= adult female)")
+	POSITIVE (U"Window length (s)", U"0.025")
+	POSITIVE (U"Pre-emphasis from (Hz)", U"50.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoFormant thee = Sound_to_Formant_willems (me, GET_REAL (L"Time step"),
-			GET_REAL (L"Number of formants"), GET_REAL (L"Maximum formant"),
-			GET_REAL (L"Window length"), GET_REAL (L"Pre-emphasis from"));
+		autoFormant thee = Sound_to_Formant_willems (me, GET_REAL (U"Time step"),
+			GET_REAL (U"Number of formants"), GET_REAL (U"Maximum formant"),
+			GET_REAL (U"Window length"), GET_REAL (U"Pre-emphasis from"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Harmonicity_ac, L"Sound: To Harmonicity (ac)", L"Sound: To Harmonicity (ac)...") {
-	POSITIVE (L"Time step (s)", L"0.01")
-	POSITIVE (L"Minimum pitch (Hz)", L"75")
-	REAL (L"Silence threshold", L"0.1")
-	POSITIVE (L"Periods per window", L"4.5")
+FORM (Sound_to_Harmonicity_ac, U"Sound: To Harmonicity (ac)", U"Sound: To Harmonicity (ac)...") {
+	POSITIVE (U"Time step (s)", U"0.01")
+	POSITIVE (U"Minimum pitch (Hz)", U"75.0")
+	REAL (U"Silence threshold", U"0.1")
+	POSITIVE (U"Periods per window", U"4.5")
 	OK2
 DO
-	double periodsPerWindow = GET_REAL (L"Periods per window");
-	if (periodsPerWindow < 3.0) Melder_throw ("Number of periods per window must be at least 3.0.");
+	double periodsPerWindow = GET_REAL (U"Periods per window");
+	if (periodsPerWindow < 3.0) Melder_throw (U"Number of periods per window must be at least 3.0.");
 	LOOP {
 		iam (Sound);
-		autoHarmonicity thee = Sound_to_Harmonicity_ac (me, GET_REAL (L"Time step"),
-			GET_REAL (L"Minimum pitch"), GET_REAL (L"Silence threshold"), periodsPerWindow);
+		autoHarmonicity thee = Sound_to_Harmonicity_ac (me, GET_REAL (U"Time step"),
+			GET_REAL (U"Minimum pitch"), GET_REAL (U"Silence threshold"), periodsPerWindow);
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Harmonicity_cc, L"Sound: To Harmonicity (cc)", L"Sound: To Harmonicity (cc)...") {
-	POSITIVE (L"Time step (s)", L"0.01")
-	POSITIVE (L"Minimum pitch (Hz)", L"75")
-	REAL (L"Silence threshold", L"0.1")
-	POSITIVE (L"Periods per window", L"1.0")
+FORM (Sound_to_Harmonicity_cc, U"Sound: To Harmonicity (cc)", U"Sound: To Harmonicity (cc)...") {
+	POSITIVE (U"Time step (s)", U"0.01")
+	POSITIVE (U"Minimum pitch (Hz)", U"75.0")
+	REAL (U"Silence threshold", U"0.1")
+	POSITIVE (U"Periods per window", U"1.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoHarmonicity thee = Sound_to_Harmonicity_cc (me, GET_REAL (L"Time step"),
-			GET_REAL (L"Minimum pitch"), GET_REAL (L"Silence threshold"),
-			GET_REAL (L"Periods per window"));
+		autoHarmonicity thee = Sound_to_Harmonicity_cc (me, GET_REAL (U"Time step"),
+			GET_REAL (U"Minimum pitch"), GET_REAL (U"Silence threshold"),
+			GET_REAL (U"Periods per window"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Harmonicity_gne, L"Sound: To Harmonicity (gne)", 0) {
-	POSITIVE (L"Minimum frequency (Hz)", L"500")
-	POSITIVE (L"Maximum frequency (Hz)", L"4500")
-	POSITIVE (L"Bandwidth (Hz)", L"1000")
-	POSITIVE (L"Step (Hz)", L"80")
+FORM (Sound_to_Harmonicity_gne, U"Sound: To Harmonicity (gne)", 0) {
+	POSITIVE (U"Minimum frequency (Hz)", U"500.0")
+	POSITIVE (U"Maximum frequency (Hz)", U"4500.0")
+	POSITIVE (U"Bandwidth (Hz)", U"1000.0")
+	POSITIVE (U"Step (Hz)", U"80.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoMatrix thee = Sound_to_Harmonicity_GNE (me, GET_REAL (L"Minimum frequency"),
-			GET_REAL (L"Maximum frequency"), GET_REAL (L"Bandwidth"),
-			GET_REAL (L"Step"));
+		autoMatrix thee = Sound_to_Harmonicity_GNE (me, GET_REAL (U"Minimum frequency"),
+			GET_REAL (U"Maximum frequency"), GET_REAL (U"Bandwidth"),
+			GET_REAL (U"Step"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (old_Sound_to_Intensity, L"Sound: To Intensity", L"Sound: To Intensity...") {
-	POSITIVE (L"Minimum pitch (Hz)", L"100")
-	REAL (L"Time step (s)", L"0.0 (= auto)")
+FORM (old_Sound_to_Intensity, U"Sound: To Intensity", U"Sound: To Intensity...") {
+	POSITIVE (U"Minimum pitch (Hz)", U"100.0")
+	REAL (U"Time step (s)", U"0.0 (= auto)")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
 		autoIntensity thee = Sound_to_Intensity (me,
-			GET_REAL (L"Minimum pitch"), GET_REAL (L"Time step"), FALSE);
+			GET_REAL (U"Minimum pitch"), GET_REAL (U"Time step"), false);
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Intensity, L"Sound: To Intensity", L"Sound: To Intensity...") {
-	POSITIVE (L"Minimum pitch (Hz)", L"100")
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	BOOLEAN (L"Subtract mean", 1)
+FORM (Sound_to_Intensity, U"Sound: To Intensity", U"Sound: To Intensity...") {
+	POSITIVE (U"Minimum pitch (Hz)", U"100.0")
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	BOOLEAN (U"Subtract mean", true)
 	OK2
 DO_ALTERNATIVE (old_Sound_to_Intensity)
 	LOOP {
 		iam (Sound);
 		autoIntensity thee = Sound_to_Intensity (me,
-			GET_REAL (L"Minimum pitch"), GET_REAL (L"Time step"), GET_INTEGER (L"Subtract mean"));
+			GET_REAL (U"Minimum pitch"), GET_REAL (U"Time step"), GET_INTEGER (U"Subtract mean"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_IntensityTier, L"Sound: To IntensityTier", NULL) {
-	POSITIVE (L"Minimum pitch (Hz)", L"100")
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	BOOLEAN (L"Subtract mean", 1)
+FORM (Sound_to_IntensityTier, U"Sound: To IntensityTier", NULL) {
+	POSITIVE (U"Minimum pitch (Hz)", U"100.0")
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	BOOLEAN (U"Subtract mean", true)
 	OK2
 DO
 	LOOP {
 		iam (Sound);
 		autoIntensityTier thee = Sound_to_IntensityTier (me,
-			GET_REAL (L"Minimum pitch"), GET_REAL (L"Time step"), GET_INTEGER (L"Subtract mean"));
+			GET_REAL (U"Minimum pitch"), GET_REAL (U"Time step"), GET_INTEGER (U"Subtract mean"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
@@ -1770,34 +1767,34 @@ DIRECT2 (Sound_to_IntervalTier) {
 	}
 END2 }
 
-FORM (Sound_to_Ltas, L"Sound: To long-term average spectrum", 0) {
-	POSITIVE (L"Bandwidth (Hz)", L"100")
+FORM (Sound_to_Ltas, U"Sound: To long-term average spectrum", 0) {
+	POSITIVE (U"Bandwidth (Hz)", U"100")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoLtas thee = Sound_to_Ltas (me, GET_REAL (L"Bandwidth"));
+		autoLtas thee = Sound_to_Ltas (me, GET_REAL (U"Bandwidth"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Ltas_pitchCorrected, L"Sound: To Ltas (pitch-corrected)", L"Sound: To Ltas (pitch-corrected)...") {
-	POSITIVE (L"Minimum pitch (Hz)", L"75")
-	POSITIVE (L"Maximum pitch (Hz)", L"600")
-	POSITIVE (L"Maximum frequency (Hz)", L"5000")
-	POSITIVE (L"Bandwidth (Hz)", L"100")
-	REAL (L"Shortest period (s)", L"0.0001")
-	REAL (L"Longest period (s)", L"0.02")
-	POSITIVE (L"Maximum period factor", L"1.3")
+FORM (Sound_to_Ltas_pitchCorrected, U"Sound: To Ltas (pitch-corrected)", U"Sound: To Ltas (pitch-corrected)...") {
+	POSITIVE (U"Minimum pitch (Hz)", U"75.0")
+	POSITIVE (U"Maximum pitch (Hz)", U"600.0")
+	POSITIVE (U"Maximum frequency (Hz)", U"5000.0")
+	POSITIVE (U"Bandwidth (Hz)", U"100.0")
+	REAL (U"Shortest period (s)", U"0.0001")
+	REAL (U"Longest period (s)", U"0.02")
+	POSITIVE (U"Maximum period factor", U"1.3")
 	OK2
 DO
-	double fmin = GET_REAL (L"Minimum pitch"), fmax = GET_REAL (L"Maximum pitch");
-	if (fmax <= fmin) Melder_throw ("Maximum pitch must be greater than minimum pitch.");
+	double fmin = GET_REAL (U"Minimum pitch"), fmax = GET_REAL (U"Maximum pitch");
+	if (fmax <= fmin) Melder_throw (U"Maximum pitch must be greater than minimum pitch.");
 	LOOP {
 		iam (Sound);
 		autoLtas thee = Sound_to_Ltas_pitchCorrected (me, fmin, fmax,
-			GET_REAL (L"Maximum frequency"), GET_REAL (L"Bandwidth"),
-			GET_REAL (L"Shortest period"), GET_REAL (L"Longest period"), GET_REAL (L"Maximum period factor"));
+			GET_REAL (U"Maximum frequency"), GET_REAL (U"Bandwidth"),
+			GET_REAL (U"Shortest period"), GET_REAL (U"Longest period"), GET_REAL (U"Maximum period factor"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
@@ -1817,106 +1814,106 @@ DIRECT2 (Sounds_to_ParamCurve) {
 		( s1 ? s2 : s1 ) = me;
 	}
 	autoParamCurve thee = ParamCurve_create (s1, s2);
-	praat_new (thee.transfer(), s1 -> name, L"_", s2 -> name);
+	praat_new (thee.transfer(), s1 -> name, U"_", s2 -> name);
 END2 }
 
-FORM (Sound_to_Pitch, L"Sound: To Pitch", L"Sound: To Pitch...") {
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	POSITIVE (L"Pitch floor (Hz)", L"75.0")
-	POSITIVE (L"Pitch ceiling (Hz)", L"600.0")
+FORM (Sound_to_Pitch, U"Sound: To Pitch", U"Sound: To Pitch...") {
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	POSITIVE (U"Pitch floor (Hz)", U"75.0")
+	POSITIVE (U"Pitch ceiling (Hz)", U"600.0")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoPitch thee = Sound_to_Pitch (me, GET_REAL (L"Time step"), GET_REAL (L"Pitch floor"), GET_REAL (L"Pitch ceiling"));
+		autoPitch thee = Sound_to_Pitch (me, GET_REAL (U"Time step"), GET_REAL (U"Pitch floor"), GET_REAL (U"Pitch ceiling"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Pitch_ac, L"Sound: To Pitch (ac)", L"Sound: To Pitch (ac)...") {
-	LABEL (L"", L"Finding the candidates")
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	POSITIVE (L"Pitch floor (Hz)", L"75.0")
-	NATURAL (L"Max. number of candidates", L"15")
-	BOOLEAN (L"Very accurate", 0)
-	LABEL (L"", L"Finding a path")
-	REAL (L"Silence threshold", L"0.03")
-	REAL (L"Voicing threshold", L"0.45")
-	REAL (L"Octave cost", L"0.01")
-	REAL (L"Octave-jump cost", L"0.35")
-	REAL (L"Voiced / unvoiced cost", L"0.14")
-	POSITIVE (L"Pitch ceiling (Hz)", L"600.0")
+FORM (Sound_to_Pitch_ac, U"Sound: To Pitch (ac)", U"Sound: To Pitch (ac)...") {
+	LABEL (U"", U"Finding the candidates")
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	POSITIVE (U"Pitch floor (Hz)", U"75.0")
+	NATURAL (U"Max. number of candidates", U"15")
+	BOOLEAN (U"Very accurate", false)
+	LABEL (U"", U"Finding a path")
+	REAL (U"Silence threshold", U"0.03")
+	REAL (U"Voicing threshold", U"0.45")
+	REAL (U"Octave cost", U"0.01")
+	REAL (U"Octave-jump cost", U"0.35")
+	REAL (U"Voiced / unvoiced cost", U"0.14")
+	POSITIVE (U"Pitch ceiling (Hz)", U"600.0")
 	OK2
 DO
-	long maxnCandidates = GET_INTEGER (L"Max. number of candidates");
-	if (maxnCandidates <= 1) Melder_throw ("Maximum number of candidates must be greater than 1.");
+	long maxnCandidates = GET_INTEGER (U"Max. number of candidates");
+	if (maxnCandidates <= 1) Melder_throw (U"Maximum number of candidates must be greater than 1.");
 	LOOP {
 		iam (Sound);
-		autoPitch thee = Sound_to_Pitch_ac (me, GET_REAL (L"Time step"),
-			GET_REAL (L"Pitch floor"), 3.0, maxnCandidates, GET_INTEGER (L"Very accurate"),
-			GET_REAL (L"Silence threshold"), GET_REAL (L"Voicing threshold"),
-			GET_REAL (L"Octave cost"), GET_REAL (L"Octave-jump cost"),
-			GET_REAL (L"Voiced / unvoiced cost"), GET_REAL (L"Pitch ceiling"));
+		autoPitch thee = Sound_to_Pitch_ac (me, GET_REAL (U"Time step"),
+			GET_REAL (U"Pitch floor"), 3.0, maxnCandidates, GET_INTEGER (U"Very accurate"),
+			GET_REAL (U"Silence threshold"), GET_REAL (U"Voicing threshold"),
+			GET_REAL (U"Octave cost"), GET_REAL (U"Octave-jump cost"),
+			GET_REAL (U"Voiced / unvoiced cost"), GET_REAL (U"Pitch ceiling"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Pitch_cc, L"Sound: To Pitch (cc)", L"Sound: To Pitch (cc)...") {
-	LABEL (L"", L"Finding the candidates")
-	REAL (L"Time step (s)", L"0.0 (= auto)")
-	POSITIVE (L"Pitch floor (Hz)", L"75")
-	NATURAL (L"Max. number of candidates", L"15")
-	BOOLEAN (L"Very accurate", 0)
-	LABEL (L"", L"Finding a path")
-	REAL (L"Silence threshold", L"0.03")
-	REAL (L"Voicing threshold", L"0.45")
-	REAL (L"Octave cost", L"0.01")
-	REAL (L"Octave-jump cost", L"0.35")
-	REAL (L"Voiced / unvoiced cost", L"0.14")
-	POSITIVE (L"Pitch ceiling (Hz)", L"600")
+FORM (Sound_to_Pitch_cc, U"Sound: To Pitch (cc)", U"Sound: To Pitch (cc)...") {
+	LABEL (U"", U"Finding the candidates")
+	REAL (U"Time step (s)", U"0.0 (= auto)")
+	POSITIVE (U"Pitch floor (Hz)", U"75.0")
+	NATURAL (U"Max. number of candidates", U"15")
+	BOOLEAN (U"Very accurate", false)
+	LABEL (U"", U"Finding a path")
+	REAL (U"Silence threshold", U"0.03")
+	REAL (U"Voicing threshold", U"0.45")
+	REAL (U"Octave cost", U"0.01")
+	REAL (U"Octave-jump cost", U"0.35")
+	REAL (U"Voiced / unvoiced cost", U"0.14")
+	POSITIVE (U"Pitch ceiling (Hz)", U"600")
 	OK2
 DO
-	long maxnCandidates = GET_INTEGER (L"Max. number of candidates");
-	if (maxnCandidates <= 1) Melder_throw ("Maximum number of candidates must be greater than 1.");
+	long maxnCandidates = GET_INTEGER (U"Max. number of candidates");
+	if (maxnCandidates <= 1) Melder_throw (U"Maximum number of candidates must be greater than 1.");
 	LOOP {
 		iam (Sound);
-		autoPitch thee = Sound_to_Pitch_cc (me, GET_REAL (L"Time step"),
-			GET_REAL (L"Pitch floor"), 1.0, maxnCandidates, GET_INTEGER (L"Very accurate"),
-			GET_REAL (L"Silence threshold"), GET_REAL (L"Voicing threshold"),
-			GET_REAL (L"Octave cost"), GET_REAL (L"Octave-jump cost"),
-			GET_REAL (L"Voiced / unvoiced cost"), GET_REAL (L"Pitch ceiling"));
+		autoPitch thee = Sound_to_Pitch_cc (me, GET_REAL (U"Time step"),
+			GET_REAL (U"Pitch floor"), 1.0, maxnCandidates, GET_INTEGER (U"Very accurate"),
+			GET_REAL (U"Silence threshold"), GET_REAL (U"Voicing threshold"),
+			GET_REAL (U"Octave cost"), GET_REAL (U"Octave-jump cost"),
+			GET_REAL (U"Voiced / unvoiced cost"), GET_REAL (U"Pitch ceiling"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_PointProcess_extrema, L"Sound: To PointProcess (extrema)", 0) {
-	CHANNEL (L"Channel (number, Left, or Right)", L"1")
-	BOOLEAN (L"Include maxima", 1)
-	BOOLEAN (L"Include minima", 0)
-	RADIO (L"Interpolation", 4)
-	RADIOBUTTON (L"None")
-	RADIOBUTTON (L"Parabolic")
-	RADIOBUTTON (L"Cubic")
-	RADIOBUTTON (L"Sinc70")
-	RADIOBUTTON (L"Sinc700")
+FORM (Sound_to_PointProcess_extrema, U"Sound: To PointProcess (extrema)", nullptr) {
+	CHANNEL (U"Channel (number, Left, or Right)", U"1")
+	BOOLEAN (U"Include maxima", true)
+	BOOLEAN (U"Include minima", false)
+	RADIO (U"Interpolation", 4)
+		RADIOBUTTON (U"None")
+		RADIOBUTTON (U"Parabolic")
+		RADIOBUTTON (U"Cubic")
+		RADIOBUTTON (U"Sinc70")
+		RADIOBUTTON (U"Sinc700")
 	OK2
 DO
-	long channel = GET_INTEGER (L"Channel");
+	long channel = GET_INTEGER (U"Channel");
 	LOOP {
 		iam (Sound);
-		autoPointProcess thee = Sound_to_PointProcess_extrema (me, channel > my ny ? 1 : channel, GET_INTEGER (L"Interpolation") - 1,
-			GET_INTEGER (L"Include maxima"), GET_INTEGER (L"Include minima"));
+		autoPointProcess thee = Sound_to_PointProcess_extrema (me, channel > my ny ? 1 : channel, GET_INTEGER (U"Interpolation") - 1,
+			GET_INTEGER (U"Include maxima"), GET_INTEGER (U"Include minima"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_PointProcess_periodic_cc, L"Sound: To PointProcess (periodic, cc)", L"Sound: To PointProcess (periodic, cc)...") {
-	POSITIVE (L"Minimum pitch (Hz)", L"75")
-	POSITIVE (L"Maximum pitch (Hz)", L"600")
+FORM (Sound_to_PointProcess_periodic_cc, U"Sound: To PointProcess (periodic, cc)", U"Sound: To PointProcess (periodic, cc)...") {
+	POSITIVE (U"Minimum pitch (Hz)", U"75")
+	POSITIVE (U"Maximum pitch (Hz)", U"600")
 	OK2
 DO
-	double fmin = GET_REAL (L"Minimum pitch"), fmax = GET_REAL (L"Maximum pitch");
-	if (fmax <= fmin) Melder_throw ("Maximum pitch must be greater than minimum pitch.");
+	double fmin = GET_REAL (U"Minimum pitch"), fmax = GET_REAL (U"Maximum pitch");
+	if (fmax <= fmin) Melder_throw (U"Maximum pitch must be greater than minimum pitch.");
 	LOOP {
 		iam (Sound);
 		autoPointProcess thee = Sound_to_PointProcess_periodic_cc (me, fmin, fmax);
@@ -1924,60 +1921,60 @@ DO
 	}
 END2 }
 
-FORM (Sound_to_PointProcess_periodic_peaks, L"Sound: To PointProcess (periodic, peaks)", L"Sound: To PointProcess (periodic, peaks)...") {
-	POSITIVE (L"Minimum pitch (Hz)", L"75")
-	POSITIVE (L"Maximum pitch (Hz)", L"600")
-	BOOLEAN (L"Include maxima", 1)
-	BOOLEAN (L"Include minima", 0)
+FORM (Sound_to_PointProcess_periodic_peaks, U"Sound: To PointProcess (periodic, peaks)", U"Sound: To PointProcess (periodic, peaks)...") {
+	POSITIVE (U"Minimum pitch (Hz)", U"75")
+	POSITIVE (U"Maximum pitch (Hz)", U"600")
+	BOOLEAN (U"Include maxima", true)
+	BOOLEAN (U"Include minima", false)
 	OK2
 DO
-	double fmin = GET_REAL (L"Minimum pitch"), fmax = GET_REAL (L"Maximum pitch");
-	if (fmax <= fmin) Melder_throw ("Maximum pitch must be greater than minimum pitch.");
+	double fmin = GET_REAL (U"Minimum pitch"), fmax = GET_REAL (U"Maximum pitch");
+	if (fmax <= fmin) Melder_throw (U"Maximum pitch must be greater than minimum pitch.");
 	LOOP {
 		iam (Sound);
-		autoPointProcess thee = Sound_to_PointProcess_periodic_peaks (me, fmin, fmax, GET_INTEGER (L"Include maxima"), GET_INTEGER (L"Include minima"));
+		autoPointProcess thee = Sound_to_PointProcess_periodic_peaks (me, fmin, fmax, GET_INTEGER (U"Include maxima"), GET_INTEGER (U"Include minima"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_PointProcess_zeroes, L"Get zeroes", 0) {
-	CHANNEL (L"Channel (number, Left, or Right)", L"1")
-	BOOLEAN (L"Include raisers", 1)
-	BOOLEAN (L"Include fallers", 0)
+FORM (Sound_to_PointProcess_zeroes, U"Get zeroes", nullptr) {
+	CHANNEL (U"Channel (number, Left, or Right)", U"1")
+	BOOLEAN (U"Include raisers", true)
+	BOOLEAN (U"Include fallers", false)
 	OK2
 DO
-	long channel = GET_INTEGER (L"Channel");
+	long channel = GET_INTEGER (U"Channel");
 	LOOP {
 		iam (Sound);
-		autoPointProcess thee = Sound_to_PointProcess_zeroes (me, channel > my ny ? 1 : channel, GET_INTEGER (L"Include raisers"), GET_INTEGER (L"Include fallers"));
+		autoPointProcess thee = Sound_to_PointProcess_zeroes (me, channel > my ny ? 1 : channel, GET_INTEGER (U"Include raisers"), GET_INTEGER (U"Include fallers"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Spectrogram, L"Sound: To Spectrogram", L"Sound: To Spectrogram...") {
-	POSITIVE (L"Window length (s)", L"0.005")
-	POSITIVE (L"Maximum frequency (Hz)", L"5000")
-	POSITIVE (L"Time step (s)", L"0.002")
-	POSITIVE (L"Frequency step (Hz)", L"20")
-	RADIO_ENUM (L"Window shape", kSound_to_Spectrogram_windowShape, DEFAULT)
+FORM (Sound_to_Spectrogram, U"Sound: To Spectrogram", U"Sound: To Spectrogram...") {
+	POSITIVE (U"Window length (s)", U"0.005")
+	POSITIVE (U"Maximum frequency (Hz)", U"5000.0")
+	POSITIVE (U"Time step (s)", U"0.002")
+	POSITIVE (U"Frequency step (Hz)", U"20.0")
+	RADIO_ENUM (U"Window shape", kSound_to_Spectrogram_windowShape, DEFAULT)
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoSpectrogram thee = Sound_to_Spectrogram (me, GET_REAL (L"Window length"),
-			GET_REAL (L"Maximum frequency"), GET_REAL (L"Time step"),
-			GET_REAL (L"Frequency step"), GET_ENUM (kSound_to_Spectrogram_windowShape, L"Window shape"), 8.0, 8.0);
+		autoSpectrogram thee = Sound_to_Spectrogram (me, GET_REAL (U"Window length"),
+			GET_REAL (U"Maximum frequency"), GET_REAL (U"Time step"),
+			GET_REAL (U"Frequency step"), GET_ENUM (kSound_to_Spectrogram_windowShape, U"Window shape"), 8.0, 8.0);
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_Spectrum, L"Sound: To Spectrum", L"Sound: To Spectrum...") {
-	BOOLEAN (L"Fast", 1)
+FORM (Sound_to_Spectrum, U"Sound: To Spectrum", U"Sound: To Spectrum...") {
+	BOOLEAN (U"Fast", 1)
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoSpectrum thee = Sound_to_Spectrum (me, GET_INTEGER (L"Fast"));
+		autoSpectrum thee = Sound_to_Spectrum (me, GET_INTEGER (U"Fast"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
@@ -1985,7 +1982,7 @@ END2 }
 DIRECT2 (Sound_to_Spectrum_dft) {
 	LOOP {
 		iam (Sound);
-		autoSpectrum thee = Sound_to_Spectrum (me, FALSE);
+		autoSpectrum thee = Sound_to_Spectrum (me, false);
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
@@ -1993,19 +1990,19 @@ END2 }
 DIRECT2 (Sound_to_Spectrum_fft) {
 	LOOP {
 		iam (Sound);
-		autoSpectrum thee = Sound_to_Spectrum (me, TRUE);
+		autoSpectrum thee = Sound_to_Spectrum (me, true);
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Sound_to_TextGrid, L"Sound: To TextGrid", L"Sound: To TextGrid...") {
-	SENTENCE (L"All tier names", L"Mary John bell")
-	SENTENCE (L"Which of these are point tiers?", L"bell")
+FORM (Sound_to_TextGrid, U"Sound: To TextGrid", U"Sound: To TextGrid...") {
+	SENTENCE (U"All tier names", U"Mary John bell")
+	SENTENCE (U"Which of these are point tiers?", U"bell")
 	OK2
 DO
 	LOOP {
 		iam (Sound);
-		autoTextGrid thee = TextGrid_create (my xmin, my xmax, GET_STRING (L"All tier names"), GET_STRING (L"Which of these are point tiers?"));
+		autoTextGrid thee = TextGrid_create (my xmin, my xmax, GET_STRING (U"All tier names"), GET_STRING (U"Which of these are point tiers?"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
@@ -2018,173 +2015,186 @@ DIRECT2 (Sound_to_TextTier) {
 	}
 END2 }
 
-FORM (SoundInputPrefs, L"Sound recording preferences", L"SoundRecorder") {
-	NATURAL (L"Buffer size (MB)", L"20")
+FORM (SoundInputPrefs, U"Sound recording preferences", U"SoundRecorder") {
+	NATURAL (U"Buffer size (MB)", U"60")
+	OPTIONMENU_ENUM (U"Input sound system", kMelder_inputSoundSystem, DEFAULT)
 	OK2
-SET_INTEGER (L"Buffer size", SoundRecorder_getBufferSizePref_MB ())
+SET_INTEGER (U"Buffer size", SoundRecorder_getBufferSizePref_MB ())
+SET_ENUM (U"Input sound system", kMelder_inputSoundSystem, MelderAudio_getInputSoundSystem())
 DO
-	long size = GET_INTEGER (L"Buffer size");
-	if (size > 1000) Melder_throw ("Buffer size cannot exceed 1000 megabytes.");
+	long size = GET_INTEGER (U"Buffer size");
+	if (size > 1000) Melder_throw (U"Buffer size cannot exceed 1000 megabytes.");
 	SoundRecorder_setBufferSizePref_MB (size);
+	MelderAudio_setInputSoundSystem (GET_ENUM (kMelder_inputSoundSystem, U"Input sound system"));
 END2 }
 
-FORM (SoundOutputPrefs, L"Sound playing preferences", 0) {
-	LABEL (L"", L"The following determines how sounds are played.")
-	LABEL (L"", L"Between parentheses, you find what you can do simultaneously.")
-	LABEL (L"", L"Decrease asynchronicity if sound plays with discontinuities.")
-	OPTIONMENU_ENUM (L"Maximum asynchronicity", kMelder_asynchronicityLevel, DEFAULT)
+FORM (SoundOutputPrefs, U"Sound playing preferences", 0) {
+	LABEL (U"", U"The following determines how sounds are played.")
+	LABEL (U"", U"Between parentheses, you find what you can do simultaneously.")
+	LABEL (U"", U"Decrease asynchronicity if sound plays with discontinuities.")
+	OPTIONMENU_ENUM (U"Maximum asynchronicity", kMelder_asynchronicityLevel, DEFAULT)
 	#define xstr(s) str(s)
 	#define str(s) #s
-	REAL (L"Silence before (s)", L"" xstr (kMelderAudio_outputSilenceBefore_DEFAULT))
-	REAL (L"Silence after (s)", L"" xstr (kMelderAudio_outputSilenceAfter_DEFAULT))
+	REAL (U"Silence before (s)", U"" xstr (kMelderAudio_outputSilenceBefore_DEFAULT))
+	REAL (U"Silence after (s)", U"" xstr (kMelderAudio_outputSilenceAfter_DEFAULT))
+	OPTIONMENU_ENUM (U"Output sound system", kMelder_outputSoundSystem, DEFAULT)
 	OK2
-SET_ENUM (L"Maximum asynchronicity", kMelder_asynchronicityLevel, MelderAudio_getOutputMaximumAsynchronicity ())
-SET_REAL (L"Silence before", MelderAudio_getOutputSilenceBefore ())
-SET_REAL (L"Silence after", MelderAudio_getOutputSilenceAfter ())
+SET_ENUM (U"Maximum asynchronicity", kMelder_asynchronicityLevel, MelderAudio_getOutputMaximumAsynchronicity ())
+SET_REAL (U"Silence before", MelderAudio_getOutputSilenceBefore ())
+SET_REAL (U"Silence after", MelderAudio_getOutputSilenceAfter ())
+SET_ENUM (U"Output sound system", kMelder_outputSoundSystem, MelderAudio_getOutputSoundSystem())
 DO
 	MelderAudio_stopPlaying (MelderAudio_IMPLICIT);
-	MelderAudio_setOutputMaximumAsynchronicity (GET_ENUM (kMelder_asynchronicityLevel, L"Maximum asynchronicity"));
-	MelderAudio_setOutputSilenceBefore (GET_REAL (L"Silence before"));
-	MelderAudio_setOutputSilenceAfter (GET_REAL (L"Silence after"));
+	MelderAudio_setOutputMaximumAsynchronicity (GET_ENUM (kMelder_asynchronicityLevel, U"Maximum asynchronicity"));
+	MelderAudio_setOutputSilenceBefore (GET_REAL (U"Silence before"));
+	MelderAudio_setOutputSilenceAfter (GET_REAL (U"Silence after"));
+	MelderAudio_setOutputSoundSystem (GET_ENUM (kMelder_outputSoundSystem, U"Output sound system"));
 END2 }
 
-FORM_WRITE2 (Sound_writeToAifcFile, L"Save as AIFC file", 0, L"aifc") {
+#ifdef HAVE_PULSEAUDIO
+void pulseAudio_serverReport ();
+DIRECT (Praat_reportSoundServerProperties)
+	pulseAudio_serverReport ();
+END
+#endif
+
+FORM_WRITE2 (Sound_writeToAifcFile, U"Save as AIFC file", 0, U"aifc") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_AIFC, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToAiffFile, L"Save as AIFF file", 0, L"aiff") {
+FORM_WRITE2 (Sound_writeToAiffFile, U"Save as AIFF file", 0, U"aiff") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_AIFF, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToFlacFile, L"Save as FLAC file", 0, L"flac") {
+FORM_WRITE2 (Sound_writeToFlacFile, U"Save as FLAC file", 0, U"flac") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_FLAC, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToKayFile, L"Save as Kay sound file", 0, L"kay") {
+FORM_WRITE2 (Sound_writeToKayFile, U"Save as Kay sound file", 0, U"kay") {
 	LOOP {
 		iam (Sound);
 		Sound_writeToKayFile (me, file);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_writeToNextSunFile, L"Save as NeXT/Sun file", 0, L"au") {
+FORM_WRITE2 (Sound_writeToNextSunFile, U"Save as NeXT/Sun file", 0, U"au") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_NEXT_SUN, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToNistFile, L"Save as NIST file", 0, L"nist") {
+FORM_WRITE2 (Sound_writeToNistFile, U"Save as NIST file", 0, U"nist") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_NIST, 16);
 END2 }
 
-FORM_WRITE2 (Sound_saveAsRaw8bitSignedFile, L"Save as raw 8-bit signed sound file", 0, L"8sig") {
+FORM_WRITE2 (Sound_saveAsRaw8bitSignedFile, U"Save as raw 8-bit signed sound file", 0, U"8sig") {
 	LOOP {
 		iam (Sound);
 		Sound_writeToRawSoundFile (me, file, Melder_LINEAR_8_SIGNED);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_saveAsRaw8bitUnsignedFile, L"Save as raw 8-bit unsigned sound file", 0, L"8uns") {
+FORM_WRITE2 (Sound_saveAsRaw8bitUnsignedFile, U"Save as raw 8-bit unsigned sound file", 0, U"8uns") {
 	LOOP {
 		iam (Sound);
 		Sound_writeToRawSoundFile (me, file, Melder_LINEAR_8_UNSIGNED);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_saveAsRaw16bitBigEndianFile, L"Save as raw 16-bit big-endian sound file", 0, L"16be") {
+FORM_WRITE2 (Sound_saveAsRaw16bitBigEndianFile, U"Save as raw 16-bit big-endian sound file", 0, U"16be") {
 	LOOP {
 		iam (Sound);
 		Sound_writeToRawSoundFile (me, file, Melder_LINEAR_16_BIG_ENDIAN);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_saveAsRaw16bitLittleEndianFile, L"Save as raw 16-bit little-endian sound file", 0, L"16le") {
+FORM_WRITE2 (Sound_saveAsRaw16bitLittleEndianFile, U"Save as raw 16-bit little-endian sound file", 0, U"16le") {
 	LOOP {
 		iam (Sound);
 		Sound_writeToRawSoundFile (me, file, Melder_LINEAR_16_LITTLE_ENDIAN);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_saveAsRaw24bitBigEndianFile, L"Save as raw 24-bit big-endian sound file", 0, L"24be") {
+FORM_WRITE2 (Sound_saveAsRaw24bitBigEndianFile, U"Save as raw 24-bit big-endian sound file", 0, U"24be") {
 	LOOP {
 		iam (Sound);
 		Sound_writeToRawSoundFile (me, file, Melder_LINEAR_24_BIG_ENDIAN);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_saveAsRaw24bitLittleEndianFile, L"Save as raw 24-bit little-endian sound file", 0, L"24le") {
+FORM_WRITE2 (Sound_saveAsRaw24bitLittleEndianFile, U"Save as raw 24-bit little-endian sound file", 0, U"24le") {
 	LOOP {
 		iam (Sound);
 		Sound_writeToRawSoundFile (me, file, Melder_LINEAR_24_LITTLE_ENDIAN);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_saveAsRaw32bitBigEndianFile, L"Save as raw 32-bit big-endian sound file", 0, L"32be") {
+FORM_WRITE2 (Sound_saveAsRaw32bitBigEndianFile, U"Save as raw 32-bit big-endian sound file", 0, U"32be") {
 	LOOP {
 		iam (Sound);
 		Sound_writeToRawSoundFile (me, file, Melder_LINEAR_32_BIG_ENDIAN);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_saveAsRaw32bitLittleEndianFile, L"Save as raw 32-bit little-endian sound file", 0, L"32le") {
+FORM_WRITE2 (Sound_saveAsRaw32bitLittleEndianFile, U"Save as raw 32-bit little-endian sound file", 0, U"32le") {
 	LOOP {
 		iam (Sound);
 		Sound_writeToRawSoundFile (me, file, Melder_LINEAR_32_LITTLE_ENDIAN);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_writeToSesamFile, L"Save as Sesam file", 0, L"sdf") {
+FORM_WRITE2 (Sound_writeToSesamFile, U"Save as Sesam file", 0, U"sdf") {
 	LOOP {
 		iam (Sound);
 		Sound_writeToSesamFile (me, file);
 	}
 END2 }
 
-FORM_WRITE2 (Sound_writeToStereoAifcFile, L"Save as stereo AIFC file", 0, L"aifc") {
+FORM_WRITE2 (Sound_writeToStereoAifcFile, U"Save as stereo AIFC file", 0, U"aifc") {
 	autoCollection set = praat_getSelectedObjects ();
 	autoSound stereo = Sounds_combineToStereo (set.peek());
 	Sound_writeToAudioFile (stereo.peek(), file, Melder_AIFC, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToStereoAiffFile, L"Save as stereo AIFF file", 0, L"aiff") {
+FORM_WRITE2 (Sound_writeToStereoAiffFile, U"Save as stereo AIFF file", 0, U"aiff") {
 	autoCollection set = praat_getSelectedObjects ();
 	autoSound stereo = Sounds_combineToStereo (set.peek());
 	Sound_writeToAudioFile (stereo.peek(), file, Melder_AIFF, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToStereoNextSunFile, L"Save as stereo NeXT/Sun file", 0, L"au") {
+FORM_WRITE2 (Sound_writeToStereoNextSunFile, U"Save as stereo NeXT/Sun file", 0, U"au") {
 	autoCollection set = praat_getSelectedObjects ();
 	autoSound stereo = Sounds_combineToStereo (set.peek());
 	Sound_writeToAudioFile (stereo.peek(), file, Melder_NEXT_SUN, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToStereoNistFile, L"Save as stereo NIST file", 0, L"nist") {
+FORM_WRITE2 (Sound_writeToStereoNistFile, U"Save as stereo NIST file", 0, U"nist") {
 	autoCollection set = praat_getSelectedObjects ();
 	autoSound stereo = Sounds_combineToStereo (set.peek());
 	Sound_writeToAudioFile (stereo.peek(), file, Melder_NIST, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToStereoFlacFile, L"Save as stereo FLAC file", 0, L"flac") {
+FORM_WRITE2 (Sound_writeToStereoFlacFile, U"Save as stereo FLAC file", 0, U"flac") {
 	autoCollection set = praat_getSelectedObjects ();
 	autoSound stereo = Sounds_combineToStereo (set.peek());
 	Sound_writeToAudioFile (stereo.peek(), file, Melder_FLAC, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToStereoWavFile, L"Save as stereo WAV file", 0, L"wav") {
+FORM_WRITE2 (Sound_writeToStereoWavFile, U"Save as stereo WAV file", 0, U"wav") {
 	autoCollection set = praat_getSelectedObjects ();
 	autoSound stereo = Sounds_combineToStereo (set.peek());
 	Sound_writeToAudioFile (stereo.peek(), file, Melder_WAV, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToSunAudioFile, L"Save as NeXT/Sun file", 0, L"au") {
+FORM_WRITE2 (Sound_writeToSunAudioFile, U"Save as NeXT/Sun file", 0, U"au") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_NEXT_SUN, 16);
 END2 }
 
-FORM_WRITE2 (Sound_writeToWavFile, L"Save as WAV file", 0, L"wav") {
+FORM_WRITE2 (Sound_writeToWavFile, U"Save as WAV file", 0, U"wav") {
 	autoCollection set = praat_getSelectedObjects ();
 	LongSound_concatenate (set.peek(), file, Melder_WAV, 16);
 END2 }
@@ -2197,8 +2207,13 @@ END2 }
 
 /***** Help menus *****/
 
-DIRECT2 (AnnotationTutorial) { Melder_help (L"Intro 7. Annotation"); END2 }
-DIRECT2 (FilteringTutorial) { Melder_help (L"Filtering"); END2 }
+DIRECT2 (AnnotationTutorial) {
+	Melder_help (U"Intro 7. Annotation");
+END2 }
+
+DIRECT2 (FilteringTutorial) {
+	Melder_help (U"Filtering");
+END2 }
 
 /***** file recognizers *****/
 
@@ -2206,7 +2221,7 @@ static Any macSoundOrEmptyFileRecognizer (int nread, const char *header, MelderF
 	/***** No data in file? This may be a Macintosh sound file with only a resource fork. *****/
 	(void) header;
 	if (nread > 0) return NULL;
-	Melder_throw ("File ", file, " contains no audio data.");   // !!!
+	Melder_throw (U"File ", file, U" contains no audio data.");   // !!!
 }
 
 static Any soundFileRecognizer (int nread, const char *header, MelderFile file) {
@@ -2216,32 +2231,32 @@ static Any soundFileRecognizer (int nread, const char *header, MelderFile file)
 	if (strnequ (header, ".snd", 4)) return Sound_readFromSoundFile (file);
 	if (strnequ (header, "NIST_1A", 7)) return Sound_readFromSoundFile (file);
 	if (strnequ (header, "fLaC", 4)) return Sound_readFromSoundFile (file);   // Erez Volk, March 2007
-	if ((Melder_stringMatchesCriterion (MelderFile_name (file), kMelder_string_ENDS_WITH, L".mp3") ||
-	     Melder_stringMatchesCriterion (MelderFile_name (file), kMelder_string_ENDS_WITH, L".MP3"))
+	if ((Melder_stringMatchesCriterion (MelderFile_name (file), kMelder_string_ENDS_WITH, U".mp3") ||
+	     Melder_stringMatchesCriterion (MelderFile_name (file), kMelder_string_ENDS_WITH, U".MP3"))
 		&& mp3_recognize (nread, header)) return Sound_readFromSoundFile (file);   // Erez Volk, May 2007
 	return NULL;
 }
 
 static Any movieFileRecognizer (int nread, const char *header, MelderFile file) {
-	const wchar_t *fileName = MelderFile_name (file);
+	const char32 *fileName = MelderFile_name (file);
 	(void) header;
 	/*Melder_casual ("%d %d %d %d %d %d %d %d %d %d", header [0],
 		header [1], header [2], header [3],
 		header [4], header [5], header [6],
 		header [7], header [8], header [9]);*/
-	if (nread < 512 || (! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".mov") &&
-	                    ! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".MOV") &&
-	                    ! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".avi") &&
-	                    ! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".AVI"))) return NULL;
-	Melder_throw ("This Praat version cannot open movie files.");
+	if (nread < 512 || (! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".mov") &&
+	                    ! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".MOV") &&
+	                    ! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".avi") &&
+	                    ! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".AVI"))) return NULL;
+	Melder_throw (U"This Praat version cannot open movie files.");
 	return NULL;
 }
 
 static Any sesamFileRecognizer (int nread, const char *header, MelderFile file) {
-	const wchar_t *fileName = MelderFile_name (file);
+	const char32 *fileName = MelderFile_name (file);
 	(void) header;
-	if (nread < 512 || (! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".sdf") &&
-	                    ! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, L".SDF"))) return NULL;
+	if (nread < 512 || (! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".sdf") &&
+	                    ! Melder_stringMatchesCriterion (fileName, kMelder_string_ENDS_WITH, U".SDF"))) return NULL;
 	return Sound_readFromSesamFile (file);
 }
 
@@ -2274,29 +2289,29 @@ static int recordFromFileProc (MelderFile file) {
 	melderSoundFromFile = (Sound) Data_readFromFile (file);
 	Melder_warningOn ();
 	if (! melderSoundFromFile) return 0;
-	if (! Thing_member (melderSoundFromFile, classSound)) { forget (melderSoundFromFile); return 0; }
+	if (! Thing_isa (melderSoundFromFile, classSound)) { forget (melderSoundFromFile); return 0; }
 	last = melderSoundFromFile;
 	Sound_play (melderSoundFromFile, NULL, NULL);
 	return 1;
 }
-static void playProc (void) {
+static void playProc () {
 	if (melderSound) {
 		Sound_play (melderSound, NULL, NULL);
 		last = melderSound;
 	}
 }
-static void playReverseProc (void) {
+static void playReverseProc () {
 	/*if (melderSound) Sound_playReverse (melderSound);*/
 }
-static int publishPlayedProc (void) {
+static int publishPlayedProc () {
 	if (! last) return 0;
 	return Melder_publish (Data_copy (last));
 }
 
 /***** buttons *****/
 
-void praat_uvafon_Sound_init (void);
-void praat_uvafon_Sound_init (void) {
+void praat_uvafon_Sound_init ();
+void praat_uvafon_Sound_init () {
 
 	Data_recognizeFileType (macSoundOrEmptyFileRecognizer);
 	Data_recognizeFileType (soundFileRecognizer);
@@ -2318,290 +2333,293 @@ void praat_uvafon_Sound_init (void) {
 	Melder_setPlayReverseProc (playReverseProc);
 	Melder_setPublishPlayedProc (publishPlayedProc);
 
-	praat_addMenuCommand (L"Objects", L"New", L"Record mono Sound...", 0, praat_ATTRACTIVE + 'R', DO_Sound_record_mono);
-	praat_addMenuCommand (L"Objects", L"New", L"Record stereo Sound...", 0, 0, DO_Sound_record_stereo);
-	praat_addMenuCommand (L"Objects", L"New", L"Record Sound (fixed time)...", 0, praat_HIDDEN, DO_Sound_recordFixedTime);
-	praat_addMenuCommand (L"Objects", L"New", L"Sound", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Sound...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_create);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Sound as pure tone...", 0, 1, DO_Sound_createAsPureTone);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Sound from formula...", 0, 1, DO_Sound_createFromFormula);
-		praat_addMenuCommand (L"Objects", L"New", L"-- create sound advanced --", 0, 1, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Sound as tone complex...", 0, 1, DO_Sound_createFromToneComplex);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Sound from tone complex...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_createFromToneComplex);
-
-	praat_addMenuCommand (L"Objects", L"Open", L"-- read sound --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"Open", L"Open long sound file...", 0, 'L', DO_LongSound_open);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read two Sounds from stereo file...", 0, praat_HIDDEN, DO_Sound_readSeparateChannelsFromSoundFile);   // deprecated 2010
-	praat_addMenuCommand (L"Objects", L"Open", L"Read separate channels from sound file...", 0, 0, DO_Sound_readSeparateChannelsFromSoundFile);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read from special sound file", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"Open", L"Read Sound from raw Alaw file...", 0, 1, DO_Sound_readFromRawAlawFile);
-
-	praat_addMenuCommand (L"Objects", L"Goodies", L"Stop playing sound", 0, GuiMenu_ESCAPE, DO_stopPlayingSound);
-	praat_addMenuCommand (L"Objects", L"Preferences", L"-- sound prefs --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"Preferences", L"Sound recording preferences...", 0, 0, DO_SoundInputPrefs);
-	praat_addMenuCommand (L"Objects", L"Preferences", L"Sound playing preferences...", 0, 0, DO_SoundOutputPrefs);
-	praat_addMenuCommand (L"Objects", L"Preferences", L"LongSound preferences...", 0, 0, DO_LongSoundPrefs);
-
-	praat_addAction1 (classLongSound, 0, L"LongSound help", 0, 0, DO_LongSound_help);
-	praat_addAction1 (classLongSound, 1, L"View", 0, praat_ATTRACTIVE, DO_LongSound_view);
-	praat_addAction1 (classLongSound, 1, L"Open", 0, praat_HIDDEN, DO_LongSound_view);   // deprecated 2011
-	praat_addAction1 (classLongSound, 0, L"Play part...", 0, 0, DO_LongSound_playPart);
-	praat_addAction1 (classLongSound, 1, L"Query -", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"New", U"Record mono Sound...", 0, praat_ATTRACTIVE + 'R', DO_Sound_record_mono);
+	praat_addMenuCommand (U"Objects", U"New", U"Record stereo Sound...", 0, 0, DO_Sound_record_stereo);
+	praat_addMenuCommand (U"Objects", U"New", U"Record Sound (fixed time)...", 0, praat_HIDDEN, DO_Sound_recordFixedTime);
+	praat_addMenuCommand (U"Objects", U"New", U"Sound", 0, 0, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Sound...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_create);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Sound as pure tone...", 0, 1, DO_Sound_createAsPureTone);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Sound from formula...", 0, 1, DO_Sound_createFromFormula);
+		praat_addMenuCommand (U"Objects", U"New", U"-- create sound advanced --", 0, 1, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Sound as tone complex...", 0, 1, DO_Sound_createFromToneComplex);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Sound from tone complex...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_createFromToneComplex);
+
+	praat_addMenuCommand (U"Objects", U"Open", U"-- read sound --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"Open", U"Open long sound file...", 0, 'L', DO_LongSound_open);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read two Sounds from stereo file...", 0, praat_HIDDEN, DO_Sound_readSeparateChannelsFromSoundFile);   // deprecated 2010
+	praat_addMenuCommand (U"Objects", U"Open", U"Read separate channels from sound file...", 0, 0, DO_Sound_readSeparateChannelsFromSoundFile);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read from special sound file", 0, 0, 0);
+		praat_addMenuCommand (U"Objects", U"Open", U"Read Sound from raw Alaw file...", 0, 1, DO_Sound_readFromRawAlawFile);
+
+	praat_addMenuCommand (U"Objects", U"Goodies", U"Stop playing sound", 0, GuiMenu_ESCAPE, DO_stopPlayingSound);
+	praat_addMenuCommand (U"Objects", U"Preferences", U"-- sound prefs --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"Preferences", U"Sound recording preferences...", 0, 0, DO_SoundInputPrefs);
+	praat_addMenuCommand (U"Objects", U"Preferences", U"Sound playing preferences...", 0, 0, DO_SoundOutputPrefs);
+	praat_addMenuCommand (U"Objects", U"Preferences", U"LongSound preferences...", 0, 0, DO_LongSoundPrefs);
+#ifdef HAVE_PULSEAUDIO
+	praat_addMenuCommand (U"Objects", U"Technical", U"Report sound server properties", U"Report system properties", 0, DO_Praat_reportSoundServerProperties);
+#endif
+
+	praat_addAction1 (classLongSound, 0, U"LongSound help", 0, 0, DO_LongSound_help);
+	praat_addAction1 (classLongSound, 1, U"View", 0, praat_ATTRACTIVE, DO_LongSound_view);
+	praat_addAction1 (classLongSound, 1, U"Open", 0, praat_HIDDEN, DO_LongSound_view);   // deprecated 2011
+	praat_addAction1 (classLongSound, 0, U"Play part...", 0, 0, DO_LongSound_playPart);
+	praat_addAction1 (classLongSound, 1, U"Query -", 0, 0, 0);
 		praat_TimeFunction_query_init (classLongSound);
-		praat_addAction1 (classLongSound, 1, L"Sampling", 0, 1, 0);
-		praat_addAction1 (classLongSound, 1, L"Get number of samples", 0, 2, DO_LongSound_getNumberOfSamples);
-		praat_addAction1 (classLongSound, 1, L"Get sampling period", 0, 2, DO_LongSound_getSamplePeriod);
-							praat_addAction1 (classLongSound, 1, L"Get sample duration", 0, praat_HIDDEN + praat_DEPTH_2, DO_LongSound_getSamplePeriod);
-							praat_addAction1 (classLongSound, 1, L"Get sample period", 0, praat_HIDDEN + praat_DEPTH_2, DO_LongSound_getSamplePeriod);
-		praat_addAction1 (classLongSound, 1, L"Get sampling frequency", 0, 2, DO_LongSound_getSampleRate);
-							praat_addAction1 (classLongSound, 1, L"Get sample rate", 0, praat_HIDDEN + praat_DEPTH_2, DO_LongSound_getSampleRate);   // deprecated 2004
-		praat_addAction1 (classLongSound, 1, L"-- get time discretization --", 0, 2, 0);
-		praat_addAction1 (classLongSound, 1, L"Get time from sample number...", 0, 2, DO_LongSound_getTimeFromIndex);
-							praat_addAction1 (classLongSound, 1, L"Get time from index...", 0, praat_HIDDEN + praat_DEPTH_2, DO_LongSound_getTimeFromIndex);
-		praat_addAction1 (classLongSound, 1, L"Get sample number from time...", 0, 2, DO_LongSound_getIndexFromTime);
-							praat_addAction1 (classLongSound, 1, L"Get index from time...", 0, praat_HIDDEN + praat_DEPTH_2, DO_LongSound_getIndexFromTime);
-	praat_addAction1 (classLongSound, 0, L"Annotate -", 0, 0, 0);
-		praat_addAction1 (classLongSound, 0, L"Annotation tutorial", 0, 1, DO_AnnotationTutorial);
-		praat_addAction1 (classLongSound, 0, L"-- to text grid --", 0, 1, 0);
-		praat_addAction1 (classLongSound, 0, L"To TextGrid...", 0, 1, DO_LongSound_to_TextGrid);
-	praat_addAction1 (classLongSound, 0, L"Convert to Sound", 0, 0, 0);
-	praat_addAction1 (classLongSound, 0, L"Extract part...", 0, 0, DO_LongSound_extractPart);
-	praat_addAction1 (classLongSound, 0, L"Concatenate?", 0, 0, DO_LongSound_concatenate);
-	praat_addAction1 (classLongSound, 0, L"Save as WAV file...", 0, 0, DO_LongSound_writeToWavFile);
-	praat_addAction1 (classLongSound, 0, L"Write to WAV file...", 0, praat_HIDDEN, DO_LongSound_writeToWavFile);
-	praat_addAction1 (classLongSound, 0, L"Save as AIFF file...", 0, 0, DO_LongSound_writeToAiffFile);
-	praat_addAction1 (classLongSound, 0, L"Write to AIFF file...", 0, praat_HIDDEN, DO_LongSound_writeToAiffFile);
-	praat_addAction1 (classLongSound, 0, L"Save as AIFC file...", 0, 0, DO_LongSound_writeToAifcFile);
-	praat_addAction1 (classLongSound, 0, L"Write to AIFC file...", 0, praat_HIDDEN, DO_LongSound_writeToAifcFile);
-	praat_addAction1 (classLongSound, 0, L"Save as Next/Sun file...", 0, 0, DO_LongSound_writeToNextSunFile);
-	praat_addAction1 (classLongSound, 0, L"Write to Next/Sun file...", 0, praat_HIDDEN, DO_LongSound_writeToNextSunFile);
-	praat_addAction1 (classLongSound, 0, L"Save as NIST file...", 0, 0, DO_LongSound_writeToNistFile);
-	praat_addAction1 (classLongSound, 0, L"Write to NIST file...", 0, praat_HIDDEN, DO_LongSound_writeToNistFile);
-	praat_addAction1 (classLongSound, 0, L"Save as FLAC file...", 0, 0, DO_LongSound_writeToFlacFile);
-	praat_addAction1 (classLongSound, 0, L"Write to FLAC file...", 0, praat_HIDDEN, DO_LongSound_writeToFlacFile);
-	praat_addAction1 (classLongSound, 0, L"Save left channel as WAV file...", 0, 0, DO_LongSound_writeLeftChannelToWavFile);
-	praat_addAction1 (classLongSound, 0, L"Write left channel to WAV file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToWavFile);
-	praat_addAction1 (classLongSound, 0, L"Save left channel as AIFF file...", 0, 0, DO_LongSound_writeLeftChannelToAiffFile);
-	praat_addAction1 (classLongSound, 0, L"Write left channel to AIFF file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToAiffFile);
-	praat_addAction1 (classLongSound, 0, L"Save left channel as AIFC file...", 0, 0, DO_LongSound_writeLeftChannelToAifcFile);
-	praat_addAction1 (classLongSound, 0, L"Write left channel to AIFC file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToAifcFile);
-	praat_addAction1 (classLongSound, 0, L"Save left channel as Next/Sun file...", 0, 0, DO_LongSound_writeLeftChannelToNextSunFile);
-	praat_addAction1 (classLongSound, 0, L"Write left channel to Next/Sun file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToNextSunFile);
-	praat_addAction1 (classLongSound, 0, L"Save left channel as NIST file...", 0, 0, DO_LongSound_writeLeftChannelToNistFile);
-	praat_addAction1 (classLongSound, 0, L"Write left channel to NIST file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToNistFile);
-	praat_addAction1 (classLongSound, 0, L"Save left channel as FLAC file...", 0, 0, DO_LongSound_writeLeftChannelToFlacFile);
-	praat_addAction1 (classLongSound, 0, L"Write left channel to FLAC file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToFlacFile);
-	praat_addAction1 (classLongSound, 0, L"Save right channel as WAV file...", 0, 0, DO_LongSound_writeRightChannelToWavFile);
-	praat_addAction1 (classLongSound, 0, L"Write right channel to WAV file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToWavFile);
-	praat_addAction1 (classLongSound, 0, L"Save right channel as AIFF file...", 0, 0, DO_LongSound_writeRightChannelToAiffFile);
-	praat_addAction1 (classLongSound, 0, L"Write right channel to AIFF file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToAiffFile);
-	praat_addAction1 (classLongSound, 0, L"Save right channel as AIFC file...", 0, 0, DO_LongSound_writeRightChannelToAifcFile);
-	praat_addAction1 (classLongSound, 0, L"Write right channel to AIFC file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToAifcFile);
-	praat_addAction1 (classLongSound, 0, L"Save right channel as Next/Sun file...", 0, 0, DO_LongSound_writeRightChannelToNextSunFile);
-	praat_addAction1 (classLongSound, 0, L"Write right channel to Next/Sun file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToNextSunFile);
-	praat_addAction1 (classLongSound, 0, L"Save right channel as NIST file...", 0, 0, DO_LongSound_writeRightChannelToNistFile);
-	praat_addAction1 (classLongSound, 0, L"Write right channel to NIST file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToNistFile);
-	praat_addAction1 (classLongSound, 0, L"Save right channel as FLAC file...", 0, 0, DO_LongSound_writeRightChannelToFlacFile);
-	praat_addAction1 (classLongSound, 0, L"Write right channel to FLAC file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToFlacFile);
-	praat_addAction1 (classLongSound, 0, L"Save part as audio file...", 0, 0, DO_LongSound_writePartToAudioFile);
-	praat_addAction1 (classLongSound, 0, L"Write part to audio file...", 0, praat_HIDDEN, DO_LongSound_writePartToAudioFile);
-
-	praat_addAction1 (classSound, 0, L"Save as WAV file...", 0, 0, DO_Sound_writeToWavFile);
-	praat_addAction1 (classSound, 0, L"Write to WAV file...", 0, praat_HIDDEN, DO_Sound_writeToWavFile);   // hidden 2011
-	praat_addAction1 (classSound, 0, L"Save as AIFF file...", 0, 0, DO_Sound_writeToAiffFile);
-	praat_addAction1 (classSound, 0, L"Write to AIFF file...", 0, praat_HIDDEN, DO_Sound_writeToAiffFile);
-	praat_addAction1 (classSound, 0, L"Save as AIFC file...", 0, 0, DO_Sound_writeToAifcFile);
-	praat_addAction1 (classSound, 0, L"Write to AIFC file...", 0, praat_HIDDEN, DO_Sound_writeToAifcFile);
-	praat_addAction1 (classSound, 0, L"Save as Next/Sun file...", 0, 0, DO_Sound_writeToNextSunFile);
-	praat_addAction1 (classSound, 0, L"Write to Next/Sun file...", 0, praat_HIDDEN, DO_Sound_writeToNextSunFile);
-	praat_addAction1 (classSound, 0, L"Save as Sun audio file...", 0, praat_HIDDEN, DO_Sound_writeToSunAudioFile);
-	praat_addAction1 (classSound, 0, L"Write to Sun audio file...", 0, praat_HIDDEN, DO_Sound_writeToSunAudioFile);
-	praat_addAction1 (classSound, 0, L"Save as NIST file...", 0, 0, DO_Sound_writeToNistFile);
-	praat_addAction1 (classSound, 0, L"Write to NIST file...", 0, praat_HIDDEN, DO_Sound_writeToNistFile);
-	praat_addAction1 (classSound, 0, L"Save as FLAC file...", 0, 0, DO_Sound_writeToFlacFile);
-	praat_addAction1 (classSound, 0, L"Write to FLAC file...", 0, praat_HIDDEN, DO_Sound_writeToFlacFile);
-	praat_addAction1 (classSound, 1, L"Save as Kay sound file...", 0, 0, DO_Sound_writeToKayFile);
-	praat_addAction1 (classSound, 1, L"Write to Kay sound file...", 0, praat_HIDDEN, DO_Sound_writeToKayFile);
-	praat_addAction1 (classSound, 1, L"Save as Sesam file...", 0, praat_HIDDEN, DO_Sound_writeToSesamFile);
-	praat_addAction1 (classSound, 1, L"Write to Sesam file...", 0, praat_HIDDEN, DO_Sound_writeToSesamFile);
-	praat_addAction1 (classSound, 0, L"Save as 24-bit WAV file...", 0, 0, DO_Sound_saveAs24BitWavFile);
-	praat_addAction1 (classSound, 0, L"Save as 32-bit WAV file...", 0, 0, DO_Sound_saveAs32BitWavFile);
-	praat_addAction1 (classSound, 2, L"Write to stereo WAV file...", 0, praat_HIDDEN, DO_Sound_writeToStereoWavFile);   // deprecated 2007
-	praat_addAction1 (classSound, 2, L"Write to stereo AIFF file...", 0, praat_HIDDEN, DO_Sound_writeToStereoAiffFile);   // deprecated 2007
-	praat_addAction1 (classSound, 2, L"Write to stereo AIFC file...", 0, praat_HIDDEN, DO_Sound_writeToStereoAifcFile);   // deprecated 2007
-	praat_addAction1 (classSound, 2, L"Write to stereo Next/Sun file...", 0, praat_HIDDEN, DO_Sound_writeToStereoNextSunFile);   // deprecated 2007
-	praat_addAction1 (classSound, 2, L"Write to stereo NIST file...", 0, praat_HIDDEN, DO_Sound_writeToStereoNistFile);   // deprecated 2007
-	praat_addAction1 (classSound, 2, L"Write to stereo FLAC file...", 0, praat_HIDDEN, DO_Sound_writeToStereoFlacFile);
-	//praat_addAction1 (classSound, 1, L"Save as raw sound file", 0, 0, 0);
-	praat_addAction1 (classSound, 1, L"Save as raw 8-bit signed file...", 0, 0, DO_Sound_saveAsRaw8bitSignedFile);
-	praat_addAction1 (classSound, 1, L"Write to raw 8-bit signed file...", 0, praat_HIDDEN, DO_Sound_saveAsRaw8bitSignedFile);
-	praat_addAction1 (classSound, 1, L"Save as raw 8-bit unsigned file...", 0, 0, DO_Sound_saveAsRaw8bitUnsignedFile);
-	praat_addAction1 (classSound, 1, L"Write to raw 8-bit unsigned file...", 0, praat_HIDDEN, DO_Sound_saveAsRaw8bitUnsignedFile);
-	praat_addAction1 (classSound, 1, L"Save as raw 16-bit big-endian file...", 0, 0, DO_Sound_saveAsRaw16bitBigEndianFile);
-	praat_addAction1 (classSound, 1, L"Save as raw 16-bit little-endian file...", 0, 0, DO_Sound_saveAsRaw16bitLittleEndianFile);
-	praat_addAction1 (classSound, 1, L"Save as raw 24-bit big-endian file...", 0, 0, DO_Sound_saveAsRaw24bitBigEndianFile);
-	praat_addAction1 (classSound, 1, L"Save as raw 24-bit little-endian file...", 0, 0, DO_Sound_saveAsRaw24bitLittleEndianFile);
-	praat_addAction1 (classSound, 1, L"Save as raw 32-bit big-endian file...", 0, 0, DO_Sound_saveAsRaw32bitBigEndianFile);
-	praat_addAction1 (classSound, 1, L"Save as raw 32-bit little-endian file...", 0, 0, DO_Sound_saveAsRaw32bitLittleEndianFile);
-	praat_addAction1 (classSound, 0, L"Sound help", 0, 0, DO_Sound_help);
-	praat_addAction1 (classSound, 1, L"Edit", 0, praat_HIDDEN, DO_Sound_edit);   // deprecated 2011
-	praat_addAction1 (classSound, 1, L"Open", 0, praat_HIDDEN, DO_Sound_edit);   // deprecated 2011
-	praat_addAction1 (classSound, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_Sound_edit);
-	praat_addAction1 (classSound, 0, L"Play", 0, 0, DO_Sound_play);
-	praat_addAction1 (classSound, 1, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classSound, 0, L"Draw...", 0, 1, DO_Sound_draw);
-	praat_addAction1 (classSound, 1, L"Query -", 0, 0, 0);
+		praat_addAction1 (classLongSound, 1, U"Sampling", 0, 1, 0);
+		praat_addAction1 (classLongSound, 1, U"Get number of samples", 0, 2, DO_LongSound_getNumberOfSamples);
+		praat_addAction1 (classLongSound, 1, U"Get sampling period", 0, 2, DO_LongSound_getSamplePeriod);
+							praat_addAction1 (classLongSound, 1, U"Get sample duration", 0, praat_HIDDEN + praat_DEPTH_2, DO_LongSound_getSamplePeriod);
+							praat_addAction1 (classLongSound, 1, U"Get sample period", 0, praat_HIDDEN + praat_DEPTH_2, DO_LongSound_getSamplePeriod);
+		praat_addAction1 (classLongSound, 1, U"Get sampling frequency", 0, 2, DO_LongSound_getSampleRate);
+							praat_addAction1 (classLongSound, 1, U"Get sample rate", 0, praat_HIDDEN + praat_DEPTH_2, DO_LongSound_getSampleRate);   // deprecated 2004
+		praat_addAction1 (classLongSound, 1, U"-- get time discretization --", 0, 2, 0);
+		praat_addAction1 (classLongSound, 1, U"Get time from sample number...", 0, 2, DO_LongSound_getTimeFromIndex);
+							praat_addAction1 (classLongSound, 1, U"Get time from index...", 0, praat_HIDDEN + praat_DEPTH_2, DO_LongSound_getTimeFromIndex);
+		praat_addAction1 (classLongSound, 1, U"Get sample number from time...", 0, 2, DO_LongSound_getIndexFromTime);
+							praat_addAction1 (classLongSound, 1, U"Get index from time...", 0, praat_HIDDEN + praat_DEPTH_2, DO_LongSound_getIndexFromTime);
+	praat_addAction1 (classLongSound, 0, U"Annotate -", 0, 0, 0);
+		praat_addAction1 (classLongSound, 0, U"Annotation tutorial", 0, 1, DO_AnnotationTutorial);
+		praat_addAction1 (classLongSound, 0, U"-- to text grid --", 0, 1, 0);
+		praat_addAction1 (classLongSound, 0, U"To TextGrid...", 0, 1, DO_LongSound_to_TextGrid);
+	praat_addAction1 (classLongSound, 0, U"Convert to Sound", 0, 0, 0);
+	praat_addAction1 (classLongSound, 0, U"Extract part...", 0, 0, DO_LongSound_extractPart);
+	praat_addAction1 (classLongSound, 0, U"Concatenate?", 0, 0, DO_LongSound_concatenate);
+	praat_addAction1 (classLongSound, 0, U"Save as WAV file...", 0, 0, DO_LongSound_writeToWavFile);
+	praat_addAction1 (classLongSound, 0, U"Write to WAV file...", 0, praat_HIDDEN, DO_LongSound_writeToWavFile);
+	praat_addAction1 (classLongSound, 0, U"Save as AIFF file...", 0, 0, DO_LongSound_writeToAiffFile);
+	praat_addAction1 (classLongSound, 0, U"Write to AIFF file...", 0, praat_HIDDEN, DO_LongSound_writeToAiffFile);
+	praat_addAction1 (classLongSound, 0, U"Save as AIFC file...", 0, 0, DO_LongSound_writeToAifcFile);
+	praat_addAction1 (classLongSound, 0, U"Write to AIFC file...", 0, praat_HIDDEN, DO_LongSound_writeToAifcFile);
+	praat_addAction1 (classLongSound, 0, U"Save as Next/Sun file...", 0, 0, DO_LongSound_writeToNextSunFile);
+	praat_addAction1 (classLongSound, 0, U"Write to Next/Sun file...", 0, praat_HIDDEN, DO_LongSound_writeToNextSunFile);
+	praat_addAction1 (classLongSound, 0, U"Save as NIST file...", 0, 0, DO_LongSound_writeToNistFile);
+	praat_addAction1 (classLongSound, 0, U"Write to NIST file...", 0, praat_HIDDEN, DO_LongSound_writeToNistFile);
+	praat_addAction1 (classLongSound, 0, U"Save as FLAC file...", 0, 0, DO_LongSound_writeToFlacFile);
+	praat_addAction1 (classLongSound, 0, U"Write to FLAC file...", 0, praat_HIDDEN, DO_LongSound_writeToFlacFile);
+	praat_addAction1 (classLongSound, 0, U"Save left channel as WAV file...", 0, 0, DO_LongSound_writeLeftChannelToWavFile);
+	praat_addAction1 (classLongSound, 0, U"Write left channel to WAV file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToWavFile);
+	praat_addAction1 (classLongSound, 0, U"Save left channel as AIFF file...", 0, 0, DO_LongSound_writeLeftChannelToAiffFile);
+	praat_addAction1 (classLongSound, 0, U"Write left channel to AIFF file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToAiffFile);
+	praat_addAction1 (classLongSound, 0, U"Save left channel as AIFC file...", 0, 0, DO_LongSound_writeLeftChannelToAifcFile);
+	praat_addAction1 (classLongSound, 0, U"Write left channel to AIFC file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToAifcFile);
+	praat_addAction1 (classLongSound, 0, U"Save left channel as Next/Sun file...", 0, 0, DO_LongSound_writeLeftChannelToNextSunFile);
+	praat_addAction1 (classLongSound, 0, U"Write left channel to Next/Sun file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToNextSunFile);
+	praat_addAction1 (classLongSound, 0, U"Save left channel as NIST file...", 0, 0, DO_LongSound_writeLeftChannelToNistFile);
+	praat_addAction1 (classLongSound, 0, U"Write left channel to NIST file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToNistFile);
+	praat_addAction1 (classLongSound, 0, U"Save left channel as FLAC file...", 0, 0, DO_LongSound_writeLeftChannelToFlacFile);
+	praat_addAction1 (classLongSound, 0, U"Write left channel to FLAC file...", 0, praat_HIDDEN, DO_LongSound_writeLeftChannelToFlacFile);
+	praat_addAction1 (classLongSound, 0, U"Save right channel as WAV file...", 0, 0, DO_LongSound_writeRightChannelToWavFile);
+	praat_addAction1 (classLongSound, 0, U"Write right channel to WAV file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToWavFile);
+	praat_addAction1 (classLongSound, 0, U"Save right channel as AIFF file...", 0, 0, DO_LongSound_writeRightChannelToAiffFile);
+	praat_addAction1 (classLongSound, 0, U"Write right channel to AIFF file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToAiffFile);
+	praat_addAction1 (classLongSound, 0, U"Save right channel as AIFC file...", 0, 0, DO_LongSound_writeRightChannelToAifcFile);
+	praat_addAction1 (classLongSound, 0, U"Write right channel to AIFC file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToAifcFile);
+	praat_addAction1 (classLongSound, 0, U"Save right channel as Next/Sun file...", 0, 0, DO_LongSound_writeRightChannelToNextSunFile);
+	praat_addAction1 (classLongSound, 0, U"Write right channel to Next/Sun file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToNextSunFile);
+	praat_addAction1 (classLongSound, 0, U"Save right channel as NIST file...", 0, 0, DO_LongSound_writeRightChannelToNistFile);
+	praat_addAction1 (classLongSound, 0, U"Write right channel to NIST file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToNistFile);
+	praat_addAction1 (classLongSound, 0, U"Save right channel as FLAC file...", 0, 0, DO_LongSound_writeRightChannelToFlacFile);
+	praat_addAction1 (classLongSound, 0, U"Write right channel to FLAC file...", 0, praat_HIDDEN, DO_LongSound_writeRightChannelToFlacFile);
+	praat_addAction1 (classLongSound, 0, U"Save part as audio file...", 0, 0, DO_LongSound_writePartToAudioFile);
+	praat_addAction1 (classLongSound, 0, U"Write part to audio file...", 0, praat_HIDDEN, DO_LongSound_writePartToAudioFile);
+
+	praat_addAction1 (classSound, 0, U"Save as WAV file...", 0, 0, DO_Sound_writeToWavFile);
+	praat_addAction1 (classSound, 0, U"Write to WAV file...", 0, praat_HIDDEN, DO_Sound_writeToWavFile);   // hidden 2011
+	praat_addAction1 (classSound, 0, U"Save as AIFF file...", 0, 0, DO_Sound_writeToAiffFile);
+	praat_addAction1 (classSound, 0, U"Write to AIFF file...", 0, praat_HIDDEN, DO_Sound_writeToAiffFile);
+	praat_addAction1 (classSound, 0, U"Save as AIFC file...", 0, 0, DO_Sound_writeToAifcFile);
+	praat_addAction1 (classSound, 0, U"Write to AIFC file...", 0, praat_HIDDEN, DO_Sound_writeToAifcFile);
+	praat_addAction1 (classSound, 0, U"Save as Next/Sun file...", 0, 0, DO_Sound_writeToNextSunFile);
+	praat_addAction1 (classSound, 0, U"Write to Next/Sun file...", 0, praat_HIDDEN, DO_Sound_writeToNextSunFile);
+	praat_addAction1 (classSound, 0, U"Save as Sun audio file...", 0, praat_HIDDEN, DO_Sound_writeToSunAudioFile);
+	praat_addAction1 (classSound, 0, U"Write to Sun audio file...", 0, praat_HIDDEN, DO_Sound_writeToSunAudioFile);
+	praat_addAction1 (classSound, 0, U"Save as NIST file...", 0, 0, DO_Sound_writeToNistFile);
+	praat_addAction1 (classSound, 0, U"Write to NIST file...", 0, praat_HIDDEN, DO_Sound_writeToNistFile);
+	praat_addAction1 (classSound, 0, U"Save as FLAC file...", 0, 0, DO_Sound_writeToFlacFile);
+	praat_addAction1 (classSound, 0, U"Write to FLAC file...", 0, praat_HIDDEN, DO_Sound_writeToFlacFile);
+	praat_addAction1 (classSound, 1, U"Save as Kay sound file...", 0, 0, DO_Sound_writeToKayFile);
+	praat_addAction1 (classSound, 1, U"Write to Kay sound file...", 0, praat_HIDDEN, DO_Sound_writeToKayFile);
+	praat_addAction1 (classSound, 1, U"Save as Sesam file...", 0, praat_HIDDEN, DO_Sound_writeToSesamFile);
+	praat_addAction1 (classSound, 1, U"Write to Sesam file...", 0, praat_HIDDEN, DO_Sound_writeToSesamFile);
+	praat_addAction1 (classSound, 0, U"Save as 24-bit WAV file...", 0, 0, DO_Sound_saveAs24BitWavFile);
+	praat_addAction1 (classSound, 0, U"Save as 32-bit WAV file...", 0, 0, DO_Sound_saveAs32BitWavFile);
+	praat_addAction1 (classSound, 2, U"Write to stereo WAV file...", 0, praat_HIDDEN, DO_Sound_writeToStereoWavFile);   // deprecated 2007
+	praat_addAction1 (classSound, 2, U"Write to stereo AIFF file...", 0, praat_HIDDEN, DO_Sound_writeToStereoAiffFile);   // deprecated 2007
+	praat_addAction1 (classSound, 2, U"Write to stereo AIFC file...", 0, praat_HIDDEN, DO_Sound_writeToStereoAifcFile);   // deprecated 2007
+	praat_addAction1 (classSound, 2, U"Write to stereo Next/Sun file...", 0, praat_HIDDEN, DO_Sound_writeToStereoNextSunFile);   // deprecated 2007
+	praat_addAction1 (classSound, 2, U"Write to stereo NIST file...", 0, praat_HIDDEN, DO_Sound_writeToStereoNistFile);   // deprecated 2007
+	praat_addAction1 (classSound, 2, U"Write to stereo FLAC file...", 0, praat_HIDDEN, DO_Sound_writeToStereoFlacFile);
+	//praat_addAction1 (classSound, 1, U"Save as raw sound file", 0, 0, 0);
+	praat_addAction1 (classSound, 1, U"Save as raw 8-bit signed file...", 0, 0, DO_Sound_saveAsRaw8bitSignedFile);
+	praat_addAction1 (classSound, 1, U"Write to raw 8-bit signed file...", 0, praat_HIDDEN, DO_Sound_saveAsRaw8bitSignedFile);
+	praat_addAction1 (classSound, 1, U"Save as raw 8-bit unsigned file...", 0, 0, DO_Sound_saveAsRaw8bitUnsignedFile);
+	praat_addAction1 (classSound, 1, U"Write to raw 8-bit unsigned file...", 0, praat_HIDDEN, DO_Sound_saveAsRaw8bitUnsignedFile);
+	praat_addAction1 (classSound, 1, U"Save as raw 16-bit big-endian file...", 0, 0, DO_Sound_saveAsRaw16bitBigEndianFile);
+	praat_addAction1 (classSound, 1, U"Save as raw 16-bit little-endian file...", 0, 0, DO_Sound_saveAsRaw16bitLittleEndianFile);
+	praat_addAction1 (classSound, 1, U"Save as raw 24-bit big-endian file...", 0, 0, DO_Sound_saveAsRaw24bitBigEndianFile);
+	praat_addAction1 (classSound, 1, U"Save as raw 24-bit little-endian file...", 0, 0, DO_Sound_saveAsRaw24bitLittleEndianFile);
+	praat_addAction1 (classSound, 1, U"Save as raw 32-bit big-endian file...", 0, 0, DO_Sound_saveAsRaw32bitBigEndianFile);
+	praat_addAction1 (classSound, 1, U"Save as raw 32-bit little-endian file...", 0, 0, DO_Sound_saveAsRaw32bitLittleEndianFile);
+	praat_addAction1 (classSound, 0, U"Sound help", 0, 0, DO_Sound_help);
+	praat_addAction1 (classSound, 1, U"Edit", 0, praat_HIDDEN, DO_Sound_edit);   // deprecated 2011
+	praat_addAction1 (classSound, 1, U"Open", 0, praat_HIDDEN, DO_Sound_edit);   // deprecated 2011
+	praat_addAction1 (classSound, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_Sound_edit);
+	praat_addAction1 (classSound, 0, U"Play", 0, 0, DO_Sound_play);
+	praat_addAction1 (classSound, 1, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classSound, 0, U"Draw...", 0, 1, DO_Sound_draw);
+	praat_addAction1 (classSound, 1, U"Query -", 0, 0, 0);
 		praat_TimeFunction_query_init (classSound);
-		praat_addAction1 (classSound, 1, L"Get number of channels", 0, 1, DO_Sound_getNumberOfChannels);
-		praat_addAction1 (classSound, 1, L"Query time sampling", 0, 1, 0);
-		praat_addAction1 (classSound, 1, L"Get number of samples", 0, 2, DO_Sound_getNumberOfSamples);
-		praat_addAction1 (classSound, 1, L"Get sampling period", 0, 2, DO_Sound_getSamplePeriod);
-							praat_addAction1 (classSound, 1, L"Get sample duration", 0, praat_HIDDEN + praat_DEPTH_2, DO_Sound_getSamplePeriod);
-							praat_addAction1 (classSound, 1, L"Get sample period", 0, praat_HIDDEN + praat_DEPTH_2, DO_Sound_getSamplePeriod);
-		praat_addAction1 (classSound, 1, L"Get sampling frequency", 0, 2, DO_Sound_getSampleRate);
-							praat_addAction1 (classSound, 1, L"Get sample rate", 0, praat_HIDDEN + praat_DEPTH_2, DO_Sound_getSampleRate);   // deprecated 2004
-		praat_addAction1 (classSound, 1, L"-- get time discretization --", 0, 2, 0);
-		praat_addAction1 (classSound, 1, L"Get time from sample number...", 0, 2, DO_Sound_getTimeFromIndex);
-							praat_addAction1 (classSound, 1, L"Get time from index...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Sound_getTimeFromIndex);
-		praat_addAction1 (classSound, 1, L"Get sample number from time...", 0, 2, DO_Sound_getIndexFromTime);
-							praat_addAction1 (classSound, 1, L"Get index from time...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Sound_getIndexFromTime);
-		praat_addAction1 (classSound, 1, L"-- get content --", 0, 1, 0);
-		praat_addAction1 (classSound, 1, L"Get value at time...", 0, 1, DO_Sound_getValueAtTime);
-		praat_addAction1 (classSound, 1, L"Get value at sample number...", 0, 1, DO_Sound_getValueAtIndex);
-							praat_addAction1 (classSound, 1, L"Get value at index...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_getValueAtIndex);
-		praat_addAction1 (classSound, 1, L"-- get shape --", 0, 1, 0);
-		praat_addAction1 (classSound, 1, L"Get minimum...", 0, 1, DO_Sound_getMinimum);
-		praat_addAction1 (classSound, 1, L"Get time of minimum...", 0, 1, DO_Sound_getTimeOfMinimum);
-		praat_addAction1 (classSound, 1, L"Get maximum...", 0, 1, DO_Sound_getMaximum);
-		praat_addAction1 (classSound, 1, L"Get time of maximum...", 0, 1, DO_Sound_getTimeOfMaximum);
-		praat_addAction1 (classSound, 1, L"Get absolute extremum...", 0, 1, DO_Sound_getAbsoluteExtremum);
-		praat_addAction1 (classSound, 1, L"Get nearest zero crossing...", 0, 1, DO_Sound_getNearestZeroCrossing);
-		praat_addAction1 (classSound, 1, L"-- get statistics --", 0, 1, 0);
-		praat_addAction1 (classSound, 1, L"Get mean...", 0, 1, DO_Sound_getMean);
-		praat_addAction1 (classSound, 1, L"Get root-mean-square...", 0, 1, DO_Sound_getRootMeanSquare);
-		praat_addAction1 (classSound, 1, L"Get standard deviation...", 0, 1, DO_Sound_getStandardDeviation);
-		praat_addAction1 (classSound, 1, L"-- get energy --", 0, 1, 0);
-		praat_addAction1 (classSound, 1, L"Get energy...", 0, 1, DO_Sound_getEnergy);
-		praat_addAction1 (classSound, 1, L"Get power...", 0, 1, DO_Sound_getPower);
-		praat_addAction1 (classSound, 1, L"-- get energy in air --", 0, 1, 0);
-		praat_addAction1 (classSound, 1, L"Get energy in air", 0, 1, DO_Sound_getEnergyInAir);
-		praat_addAction1 (classSound, 1, L"Get power in air", 0, 1, DO_Sound_getPowerInAir);
-		praat_addAction1 (classSound, 1, L"Get intensity (dB)", 0, 1, DO_Sound_getIntensity_dB);
-	praat_addAction1 (classSound, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classSound, 1, U"Get number of channels", 0, 1, DO_Sound_getNumberOfChannels);
+		praat_addAction1 (classSound, 1, U"Query time sampling", 0, 1, 0);
+		praat_addAction1 (classSound, 1, U"Get number of samples", 0, 2, DO_Sound_getNumberOfSamples);
+		praat_addAction1 (classSound, 1, U"Get sampling period", 0, 2, DO_Sound_getSamplePeriod);
+							praat_addAction1 (classSound, 1, U"Get sample duration", 0, praat_HIDDEN + praat_DEPTH_2, DO_Sound_getSamplePeriod);
+							praat_addAction1 (classSound, 1, U"Get sample period", 0, praat_HIDDEN + praat_DEPTH_2, DO_Sound_getSamplePeriod);
+		praat_addAction1 (classSound, 1, U"Get sampling frequency", 0, 2, DO_Sound_getSampleRate);
+							praat_addAction1 (classSound, 1, U"Get sample rate", 0, praat_HIDDEN + praat_DEPTH_2, DO_Sound_getSampleRate);   // deprecated 2004
+		praat_addAction1 (classSound, 1, U"-- get time discretization --", 0, 2, 0);
+		praat_addAction1 (classSound, 1, U"Get time from sample number...", 0, 2, DO_Sound_getTimeFromIndex);
+							praat_addAction1 (classSound, 1, U"Get time from index...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Sound_getTimeFromIndex);
+		praat_addAction1 (classSound, 1, U"Get sample number from time...", 0, 2, DO_Sound_getIndexFromTime);
+							praat_addAction1 (classSound, 1, U"Get index from time...", 0, praat_HIDDEN + praat_DEPTH_2, DO_Sound_getIndexFromTime);
+		praat_addAction1 (classSound, 1, U"-- get content --", 0, 1, 0);
+		praat_addAction1 (classSound, 1, U"Get value at time...", 0, 1, DO_Sound_getValueAtTime);
+		praat_addAction1 (classSound, 1, U"Get value at sample number...", 0, 1, DO_Sound_getValueAtIndex);
+							praat_addAction1 (classSound, 1, U"Get value at index...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_getValueAtIndex);
+		praat_addAction1 (classSound, 1, U"-- get shape --", 0, 1, 0);
+		praat_addAction1 (classSound, 1, U"Get minimum...", 0, 1, DO_Sound_getMinimum);
+		praat_addAction1 (classSound, 1, U"Get time of minimum...", 0, 1, DO_Sound_getTimeOfMinimum);
+		praat_addAction1 (classSound, 1, U"Get maximum...", 0, 1, DO_Sound_getMaximum);
+		praat_addAction1 (classSound, 1, U"Get time of maximum...", 0, 1, DO_Sound_getTimeOfMaximum);
+		praat_addAction1 (classSound, 1, U"Get absolute extremum...", 0, 1, DO_Sound_getAbsoluteExtremum);
+		praat_addAction1 (classSound, 1, U"Get nearest zero crossing...", 0, 1, DO_Sound_getNearestZeroCrossing);
+		praat_addAction1 (classSound, 1, U"-- get statistics --", 0, 1, 0);
+		praat_addAction1 (classSound, 1, U"Get mean...", 0, 1, DO_Sound_getMean);
+		praat_addAction1 (classSound, 1, U"Get root-mean-square...", 0, 1, DO_Sound_getRootMeanSquare);
+		praat_addAction1 (classSound, 1, U"Get standard deviation...", 0, 1, DO_Sound_getStandardDeviation);
+		praat_addAction1 (classSound, 1, U"-- get energy --", 0, 1, 0);
+		praat_addAction1 (classSound, 1, U"Get energy...", 0, 1, DO_Sound_getEnergy);
+		praat_addAction1 (classSound, 1, U"Get power...", 0, 1, DO_Sound_getPower);
+		praat_addAction1 (classSound, 1, U"-- get energy in air --", 0, 1, 0);
+		praat_addAction1 (classSound, 1, U"Get energy in air", 0, 1, DO_Sound_getEnergyInAir);
+		praat_addAction1 (classSound, 1, U"Get power in air", 0, 1, DO_Sound_getPowerInAir);
+		praat_addAction1 (classSound, 1, U"Get intensity (dB)", 0, 1, DO_Sound_getIntensity_dB);
+	praat_addAction1 (classSound, 0, U"Modify -", 0, 0, 0);
 		praat_TimeFunction_modify_init (classSound);
-		praat_addAction1 (classSound, 0, L"-- modify generic --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"Reverse", 0, 1, DO_Sound_reverse);
-		praat_addAction1 (classSound, 0, L"Formula...", 0, 1, DO_Sound_formula);
-		praat_addAction1 (classSound, 0, L"Formula (part)...", 0, 1, DO_Sound_formula_part);
-		praat_addAction1 (classSound, 0, L"-- add & mul --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"Add...", 0, 1, DO_Sound_add);
-		praat_addAction1 (classSound, 0, L"Subtract mean", 0, 1, DO_Sound_subtractMean);
-		praat_addAction1 (classSound, 0, L"Multiply...", 0, 1, DO_Sound_multiply);
-		praat_addAction1 (classSound, 0, L"Multiply by window...", 0, 1, DO_Sound_multiplyByWindow);
-		praat_addAction1 (classSound, 0, L"Scale peak...", 0, 1, DO_Sound_scalePeak);
-		praat_addAction1 (classSound, 0, L"Scale...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_scalePeak);
-		praat_addAction1 (classSound, 0, L"Scale intensity...", 0, 1, DO_Sound_scaleIntensity);
-		praat_addAction1 (classSound, 0, L"-- set --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"Set value at sample number...", 0, 1, DO_Sound_setValueAtIndex);
-							praat_addAction1 (classSound, 0, L"Set value at index...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_setValueAtIndex);
-		praat_addAction1 (classSound, 0, L"Set part to zero...", 0, 1, DO_Sound_setPartToZero);
-		praat_addAction1 (classSound, 0, L"-- modify hack --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"Override sampling frequency...", 0, 1, DO_Sound_overrideSamplingFrequency);
-							praat_addAction1 (classSound, 0, L"Override sample rate...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_overrideSamplingFrequency);
-		praat_addAction1 (classSound, 0, L"-- in-line filters --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"In-line filters", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"Filter with one formant (in-line)...", 0, 2, DO_Sound_filterWithOneFormantInline);
-		praat_addAction1 (classSound, 0, L"Pre-emphasize (in-line)...", 0, 2, DO_Sound_preemphasizeInline);
-		praat_addAction1 (classSound, 0, L"De-emphasize (in-line)...", 0, 2, DO_Sound_deemphasizeInline);
-	praat_addAction1 (classSound, 0, L"Annotate -", 0, 0, 0);
-		praat_addAction1 (classSound, 0, L"Annotation tutorial", 0, 1, DO_AnnotationTutorial);
-		praat_addAction1 (classSound, 0, L"-- to text grid --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"To TextGrid...", 0, 1, DO_Sound_to_TextGrid);
-		praat_addAction1 (classSound, 0, L"To TextTier", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_TextTier);
-		praat_addAction1 (classSound, 0, L"To IntervalTier", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_IntervalTier);
-	praat_addAction1 (classSound, 0, L"Analyse periodicity -", 0, 0, 0);
-		praat_addAction1 (classSound, 0, L"To Pitch...", 0, 1, DO_Sound_to_Pitch);
-		praat_addAction1 (classSound, 0, L"To Pitch (ac)...", 0, 1, DO_Sound_to_Pitch_ac);
-		praat_addAction1 (classSound, 0, L"To Pitch (cc)...", 0, 1, DO_Sound_to_Pitch_cc);
-		praat_addAction1 (classSound, 0, L"To PointProcess (periodic, cc)...", 0, 1, DO_Sound_to_PointProcess_periodic_cc);
-		praat_addAction1 (classSound, 0, L"To PointProcess (periodic, peaks)...", 0, 1, DO_Sound_to_PointProcess_periodic_peaks);
-		praat_addAction1 (classSound, 0, L"-- points --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"To PointProcess (extrema)...", 0, 1, DO_Sound_to_PointProcess_extrema);
-		praat_addAction1 (classSound, 0, L"To PointProcess (zeroes)...", 0, 1, DO_Sound_to_PointProcess_zeroes);
-		praat_addAction1 (classSound, 0, L"-- hnr --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"To Harmonicity (cc)...", 0, 1, DO_Sound_to_Harmonicity_cc);
-		praat_addAction1 (classSound, 0, L"To Harmonicity (ac)...", 0, 1, DO_Sound_to_Harmonicity_ac);
-		praat_addAction1 (classSound, 0, L"To Harmonicity (gne)...", 0, 1, DO_Sound_to_Harmonicity_gne);
-		praat_addAction1 (classSound, 0, L"-- autocorrelation --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"Autocorrelate...", 0, 1, DO_Sound_autoCorrelate);
-	praat_addAction1 (classSound, 0, L"Analyse spectrum -", 0, 0, 0);
-		praat_addAction1 (classSound, 0, L"To Spectrum...", 0, 1, DO_Sound_to_Spectrum);
-							praat_addAction1 (classSound, 0, L"To Spectrum (fft)", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_to_Spectrum_fft);
-							praat_addAction1 (classSound, 0, L"To Spectrum", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_to_Spectrum_fft);
-							praat_addAction1 (classSound, 0, L"To Spectrum (dft)", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_to_Spectrum_dft);
-		praat_addAction1 (classSound, 0, L"To Ltas...", 0, 1, DO_Sound_to_Ltas);
-		praat_addAction1 (classSound, 0, L"To Ltas (pitch-corrected)...", 0, 1, DO_Sound_to_Ltas_pitchCorrected);
-		praat_addAction1 (classSound, 0, L"-- spectrotemporal --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"To Spectrogram...", 0, 1, DO_Sound_to_Spectrogram);
-		praat_addAction1 (classSound, 0, L"To Cochleagram...", 0, 1, DO_Sound_to_Cochleagram);
-		praat_addAction1 (classSound, 0, L"To Cochleagram (edb)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_to_Cochleagram_edb);
-		praat_addAction1 (classSound, 0, L"-- formants --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"To Formant (burg)...", 0, 1, DO_Sound_to_Formant_burg);
-		praat_addAction1 (classSound, 0, L"To Formant (hack)", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"To Formant (keep all)...", 0, 2, DO_Sound_to_Formant_keepAll);
-		praat_addAction1 (classSound, 0, L"To Formant (sl)...", 0, 2, DO_Sound_to_Formant_willems);
-	praat_addAction1 (classSound, 0, L"To Intensity...", 0, 0, DO_Sound_to_Intensity);
-	praat_addAction1 (classSound, 0, L"To IntensityTier...", 0, praat_HIDDEN, DO_Sound_to_IntensityTier);
-	praat_addAction1 (classSound, 0, L"Manipulate -", 0, 0, 0);
-	praat_addAction1 (classSound, 0, L"To Manipulation...", 0, 1, DO_Sound_to_Manipulation);
-	praat_addAction1 (classSound, 0, L"Convert -", 0, 0, 0);
-		praat_addAction1 (classSound, 0, L"Convert to mono", 0, 1, DO_Sound_convertToMono);
-		praat_addAction1 (classSound, 0, L"Convert to stereo", 0, 1, DO_Sound_convertToStereo);
-		praat_addAction1 (classSound, 0, L"Extract all channels", 0, 1, DO_Sound_extractAllChannels);
-		praat_addAction1 (classSound, 0, L"Extract left channel", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_extractLeftChannel);   // deprecated 2010
-		praat_addAction1 (classSound, 0, L"Extract right channel", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_extractRightChannel);   // deprecated 2010
-		praat_addAction1 (classSound, 0, L"Extract one channel...", 0, 1, DO_Sound_extractChannel);
-		praat_addAction1 (classSound, 0, L"Extract part...", 0, 1, DO_Sound_extractPart);
-		praat_addAction1 (classSound, 0, L"Extract part for overlap...", 0, 1, DO_Sound_extractPartForOverlap);
-		praat_addAction1 (classSound, 0, L"Resample...", 0, 1, DO_Sound_resample);
-		praat_addAction1 (classSound, 0, L"-- enhance --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"Lengthen (overlap-add)...", 0, 1, DO_Sound_lengthen_overlapAdd);
-		praat_addAction1 (classSound, 0, L"Lengthen (PSOLA)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_lengthen_overlapAdd);
-		praat_addAction1 (classSound, 0, L"Deepen band modulation...", 0, 1, DO_Sound_deepenBandModulation);
-		praat_addAction1 (classSound, 0, L"-- cast --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"Down to Matrix", 0, 1, DO_Sound_to_Matrix);
-	praat_addAction1 (classSound, 0, L"Filter -", 0, 0, 0);
-		praat_addAction1 (classSound, 0, L"Filtering tutorial", 0, 1, DO_FilteringTutorial);
-		praat_addAction1 (classSound, 0, L"-- frequency-domain filter --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"Filter (pass Hann band)...", 0, 1, DO_Sound_filter_passHannBand);
-		praat_addAction1 (classSound, 0, L"Filter (stop Hann band)...", 0, 1, DO_Sound_filter_stopHannBand);
-		praat_addAction1 (classSound, 0, L"Filter (formula)...", 0, 1, DO_Sound_filter_formula);
-		praat_addAction1 (classSound, 0, L"-- time-domain filter --", 0, 1, 0);
-		praat_addAction1 (classSound, 0, L"Filter (one formant)...", 0, 1, DO_Sound_filter_oneFormant);
-		praat_addAction1 (classSound, 0, L"Filter (pre-emphasis)...", 0, 1, DO_Sound_filter_preemphasis);
-		praat_addAction1 (classSound, 0, L"Filter (de-emphasis)...", 0, 1, DO_Sound_filter_deemphasis);
-	praat_addAction1 (classSound, 0, L"Combine -", 0, 0, 0);
-		praat_addAction1 (classSound, 0, L"Combine to stereo", 0, 1, DO_Sounds_combineToStereo);
-		praat_addAction1 (classSound, 0, L"Concatenate", 0, 1, DO_Sounds_concatenate);
-		praat_addAction1 (classSound, 0, L"Concatenate recoverably", 0, 1, DO_Sounds_concatenateRecoverably);
-		praat_addAction1 (classSound, 0, L"Concatenate with overlap...", 0, 1, DO_Sounds_concatenateWithOverlap);
-		praat_addAction1 (classSound, 2, L"Convolve", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sounds_convolve_old);
-		praat_addAction1 (classSound, 2, L"Convolve...", 0, 1, DO_Sounds_convolve);
-		praat_addAction1 (classSound, 2, L"Cross-correlate...", 0, 1, DO_Sounds_crossCorrelate);
-		praat_addAction1 (classSound, 2, L"To ParamCurve", 0, 1, DO_Sounds_to_ParamCurve);
-
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Save as WAV file...", 0, 0, DO_LongSound_Sound_writeToWavFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Write to WAV file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToWavFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Save as AIFF file...", 0, 0, DO_LongSound_Sound_writeToAiffFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Write to AIFF file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToAiffFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Save as AIFC file...", 0, 0, DO_LongSound_Sound_writeToAifcFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Write to AIFC file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToAifcFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Save as NeXT/Sun file...", 0, 0, DO_LongSound_Sound_writeToNextSunFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Write to NeXT/Sun file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToNextSunFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Save as NIST file...", 0, 0, DO_LongSound_Sound_writeToNistFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Write to NIST file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToNistFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Save as FLAC file...", 0, 0, DO_LongSound_Sound_writeToFlacFile);
-	praat_addAction2 (classLongSound, 0, classSound, 0, L"Write to FLAC file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToFlacFile);
+		praat_addAction1 (classSound, 0, U"-- modify generic --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"Reverse", 0, 1, DO_Sound_reverse);
+		praat_addAction1 (classSound, 0, U"Formula...", 0, 1, DO_Sound_formula);
+		praat_addAction1 (classSound, 0, U"Formula (part)...", 0, 1, DO_Sound_formula_part);
+		praat_addAction1 (classSound, 0, U"-- add & mul --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"Add...", 0, 1, DO_Sound_add);
+		praat_addAction1 (classSound, 0, U"Subtract mean", 0, 1, DO_Sound_subtractMean);
+		praat_addAction1 (classSound, 0, U"Multiply...", 0, 1, DO_Sound_multiply);
+		praat_addAction1 (classSound, 0, U"Multiply by window...", 0, 1, DO_Sound_multiplyByWindow);
+		praat_addAction1 (classSound, 0, U"Scale peak...", 0, 1, DO_Sound_scalePeak);
+		praat_addAction1 (classSound, 0, U"Scale...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_scalePeak);
+		praat_addAction1 (classSound, 0, U"Scale intensity...", 0, 1, DO_Sound_scaleIntensity);
+		praat_addAction1 (classSound, 0, U"-- set --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"Set value at sample number...", 0, 1, DO_Sound_setValueAtIndex);
+							praat_addAction1 (classSound, 0, U"Set value at index...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_setValueAtIndex);
+		praat_addAction1 (classSound, 0, U"Set part to zero...", 0, 1, DO_Sound_setPartToZero);
+		praat_addAction1 (classSound, 0, U"-- modify hack --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"Override sampling frequency...", 0, 1, DO_Sound_overrideSamplingFrequency);
+							praat_addAction1 (classSound, 0, U"Override sample rate...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_overrideSamplingFrequency);
+		praat_addAction1 (classSound, 0, U"-- in-line filters --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"In-line filters", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"Filter with one formant (in-line)...", 0, 2, DO_Sound_filterWithOneFormantInline);
+		praat_addAction1 (classSound, 0, U"Pre-emphasize (in-line)...", 0, 2, DO_Sound_preemphasizeInline);
+		praat_addAction1 (classSound, 0, U"De-emphasize (in-line)...", 0, 2, DO_Sound_deemphasizeInline);
+	praat_addAction1 (classSound, 0, U"Annotate -", 0, 0, 0);
+		praat_addAction1 (classSound, 0, U"Annotation tutorial", 0, 1, DO_AnnotationTutorial);
+		praat_addAction1 (classSound, 0, U"-- to text grid --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"To TextGrid...", 0, 1, DO_Sound_to_TextGrid);
+		praat_addAction1 (classSound, 0, U"To TextTier", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_TextTier);
+		praat_addAction1 (classSound, 0, U"To IntervalTier", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_to_IntervalTier);
+	praat_addAction1 (classSound, 0, U"Analyse periodicity -", 0, 0, 0);
+		praat_addAction1 (classSound, 0, U"To Pitch...", 0, 1, DO_Sound_to_Pitch);
+		praat_addAction1 (classSound, 0, U"To Pitch (ac)...", 0, 1, DO_Sound_to_Pitch_ac);
+		praat_addAction1 (classSound, 0, U"To Pitch (cc)...", 0, 1, DO_Sound_to_Pitch_cc);
+		praat_addAction1 (classSound, 0, U"To PointProcess (periodic, cc)...", 0, 1, DO_Sound_to_PointProcess_periodic_cc);
+		praat_addAction1 (classSound, 0, U"To PointProcess (periodic, peaks)...", 0, 1, DO_Sound_to_PointProcess_periodic_peaks);
+		praat_addAction1 (classSound, 0, U"-- points --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"To PointProcess (extrema)...", 0, 1, DO_Sound_to_PointProcess_extrema);
+		praat_addAction1 (classSound, 0, U"To PointProcess (zeroes)...", 0, 1, DO_Sound_to_PointProcess_zeroes);
+		praat_addAction1 (classSound, 0, U"-- hnr --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"To Harmonicity (cc)...", 0, 1, DO_Sound_to_Harmonicity_cc);
+		praat_addAction1 (classSound, 0, U"To Harmonicity (ac)...", 0, 1, DO_Sound_to_Harmonicity_ac);
+		praat_addAction1 (classSound, 0, U"To Harmonicity (gne)...", 0, 1, DO_Sound_to_Harmonicity_gne);
+		praat_addAction1 (classSound, 0, U"-- autocorrelation --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"Autocorrelate...", 0, 1, DO_Sound_autoCorrelate);
+	praat_addAction1 (classSound, 0, U"Analyse spectrum -", 0, 0, 0);
+		praat_addAction1 (classSound, 0, U"To Spectrum...", 0, 1, DO_Sound_to_Spectrum);
+							praat_addAction1 (classSound, 0, U"To Spectrum (fft)", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_to_Spectrum_fft);
+							praat_addAction1 (classSound, 0, U"To Spectrum", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_to_Spectrum_fft);
+							praat_addAction1 (classSound, 0, U"To Spectrum (dft)", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_to_Spectrum_dft);
+		praat_addAction1 (classSound, 0, U"To Ltas...", 0, 1, DO_Sound_to_Ltas);
+		praat_addAction1 (classSound, 0, U"To Ltas (pitch-corrected)...", 0, 1, DO_Sound_to_Ltas_pitchCorrected);
+		praat_addAction1 (classSound, 0, U"-- spectrotemporal --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"To Spectrogram...", 0, 1, DO_Sound_to_Spectrogram);
+		praat_addAction1 (classSound, 0, U"To Cochleagram...", 0, 1, DO_Sound_to_Cochleagram);
+		praat_addAction1 (classSound, 0, U"To Cochleagram (edb)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_to_Cochleagram_edb);
+		praat_addAction1 (classSound, 0, U"-- formants --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"To Formant (burg)...", 0, 1, DO_Sound_to_Formant_burg);
+		praat_addAction1 (classSound, 0, U"To Formant (hack)", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"To Formant (keep all)...", 0, 2, DO_Sound_to_Formant_keepAll);
+		praat_addAction1 (classSound, 0, U"To Formant (sl)...", 0, 2, DO_Sound_to_Formant_willems);
+	praat_addAction1 (classSound, 0, U"To Intensity...", 0, 0, DO_Sound_to_Intensity);
+	praat_addAction1 (classSound, 0, U"To IntensityTier...", 0, praat_HIDDEN, DO_Sound_to_IntensityTier);
+	praat_addAction1 (classSound, 0, U"Manipulate -", 0, 0, 0);
+	praat_addAction1 (classSound, 0, U"To Manipulation...", 0, 1, DO_Sound_to_Manipulation);
+	praat_addAction1 (classSound, 0, U"Convert -", 0, 0, 0);
+		praat_addAction1 (classSound, 0, U"Convert to mono", 0, 1, DO_Sound_convertToMono);
+		praat_addAction1 (classSound, 0, U"Convert to stereo", 0, 1, DO_Sound_convertToStereo);
+		praat_addAction1 (classSound, 0, U"Extract all channels", 0, 1, DO_Sound_extractAllChannels);
+		praat_addAction1 (classSound, 0, U"Extract left channel", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_extractLeftChannel);   // deprecated 2010
+		praat_addAction1 (classSound, 0, U"Extract right channel", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sound_extractRightChannel);   // deprecated 2010
+		praat_addAction1 (classSound, 0, U"Extract one channel...", 0, 1, DO_Sound_extractChannel);
+		praat_addAction1 (classSound, 0, U"Extract part...", 0, 1, DO_Sound_extractPart);
+		praat_addAction1 (classSound, 0, U"Extract part for overlap...", 0, 1, DO_Sound_extractPartForOverlap);
+		praat_addAction1 (classSound, 0, U"Resample...", 0, 1, DO_Sound_resample);
+		praat_addAction1 (classSound, 0, U"-- enhance --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"Lengthen (overlap-add)...", 0, 1, DO_Sound_lengthen_overlapAdd);
+		praat_addAction1 (classSound, 0, U"Lengthen (PSOLA)...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Sound_lengthen_overlapAdd);
+		praat_addAction1 (classSound, 0, U"Deepen band modulation...", 0, 1, DO_Sound_deepenBandModulation);
+		praat_addAction1 (classSound, 0, U"-- cast --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"Down to Matrix", 0, 1, DO_Sound_to_Matrix);
+	praat_addAction1 (classSound, 0, U"Filter -", 0, 0, 0);
+		praat_addAction1 (classSound, 0, U"Filtering tutorial", 0, 1, DO_FilteringTutorial);
+		praat_addAction1 (classSound, 0, U"-- frequency-domain filter --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"Filter (pass Hann band)...", 0, 1, DO_Sound_filter_passHannBand);
+		praat_addAction1 (classSound, 0, U"Filter (stop Hann band)...", 0, 1, DO_Sound_filter_stopHannBand);
+		praat_addAction1 (classSound, 0, U"Filter (formula)...", 0, 1, DO_Sound_filter_formula);
+		praat_addAction1 (classSound, 0, U"-- time-domain filter --", 0, 1, 0);
+		praat_addAction1 (classSound, 0, U"Filter (one formant)...", 0, 1, DO_Sound_filter_oneFormant);
+		praat_addAction1 (classSound, 0, U"Filter (pre-emphasis)...", 0, 1, DO_Sound_filter_preemphasis);
+		praat_addAction1 (classSound, 0, U"Filter (de-emphasis)...", 0, 1, DO_Sound_filter_deemphasis);
+	praat_addAction1 (classSound, 0, U"Combine -", 0, 0, 0);
+		praat_addAction1 (classSound, 0, U"Combine to stereo", 0, 1, DO_Sounds_combineToStereo);
+		praat_addAction1 (classSound, 0, U"Concatenate", 0, 1, DO_Sounds_concatenate);
+		praat_addAction1 (classSound, 0, U"Concatenate recoverably", 0, 1, DO_Sounds_concatenateRecoverably);
+		praat_addAction1 (classSound, 0, U"Concatenate with overlap...", 0, 1, DO_Sounds_concatenateWithOverlap);
+		praat_addAction1 (classSound, 2, U"Convolve", 0, praat_HIDDEN + praat_DEPTH_1, DO_Sounds_convolve_old);
+		praat_addAction1 (classSound, 2, U"Convolve...", 0, 1, DO_Sounds_convolve);
+		praat_addAction1 (classSound, 2, U"Cross-correlate...", 0, 1, DO_Sounds_crossCorrelate);
+		praat_addAction1 (classSound, 2, U"To ParamCurve", 0, 1, DO_Sounds_to_ParamCurve);
+
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Save as WAV file...", 0, 0, DO_LongSound_Sound_writeToWavFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Write to WAV file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToWavFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Save as AIFF file...", 0, 0, DO_LongSound_Sound_writeToAiffFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Write to AIFF file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToAiffFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Save as AIFC file...", 0, 0, DO_LongSound_Sound_writeToAifcFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Write to AIFC file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToAifcFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Save as NeXT/Sun file...", 0, 0, DO_LongSound_Sound_writeToNextSunFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Write to NeXT/Sun file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToNextSunFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Save as NIST file...", 0, 0, DO_LongSound_Sound_writeToNistFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Write to NIST file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToNistFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Save as FLAC file...", 0, 0, DO_LongSound_Sound_writeToFlacFile);
+	praat_addAction2 (classLongSound, 0, classSound, 0, U"Write to FLAC file...", 0, praat_HIDDEN, DO_LongSound_Sound_writeToFlacFile);
 }
 
 /* End of file praat_Sound.cpp */
diff --git a/fon/praat_TextGrid_init.cpp b/fon/praat_TextGrid_init.cpp
index 609b413..eb06f4d 100644
--- a/fon/praat_TextGrid_init.cpp
+++ b/fon/praat_TextGrid_init.cpp
@@ -1,6 +1,6 @@
 /* praat_TextGrid_init.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,15 +30,15 @@
 #undef iam
 #define iam iam_LOOP
 
-void praat_dia_timeRange (Any dia);
-void praat_get_timeRange (Any dia, double *tmin, double *tmax);
-int praat_get_frequencyRange (Any dia, double *fmin, double *fmax);
+void praat_dia_timeRange (UiForm dia);
+void praat_get_timeRange (UiForm dia, double *tmin, double *tmax);
+int praat_get_frequencyRange (UiForm dia, double *fmin, double *fmax);
 
-static const wchar_t *STRING_FROM_FREQUENCY_HZ = L"left Frequency range (Hz)";
-static const wchar_t *STRING_TO_FREQUENCY_HZ = L"right Frequency range (Hz)";
-static const wchar_t *STRING_TIER_NUMBER = L"Tier number";
-static const wchar_t *STRING_INTERVAL_NUMBER = L"Interval number";
-static const wchar_t *STRING_POINT_NUMBER = L"Point number";
+static const char32 *STRING_FROM_FREQUENCY_HZ = U"left Frequency range (Hz)";
+static const char32 *STRING_TO_FREQUENCY_HZ = U"right Frequency range (Hz)";
+static const char32 *STRING_TIER_NUMBER = U"Tier number";
+static const char32 *STRING_INTERVAL_NUMBER = U"Interval number";
+static const char32 *STRING_POINT_NUMBER = U"Point number";
 
 void praat_TimeFunction_modify_init (ClassInfo klas);   // Modify buttons for time-based subclasses of Function.
 
@@ -48,20 +48,20 @@ DIRECT2 (AnyTier_into_TextGrid) {
 	autoTextGrid grid = TextGrid_createWithoutTiers (1e30, -1e30);
 	LOOP {
 		iam (AnyTier);
-		TextGrid_addTier (grid.peek(), me);
+		TextGrid_addTier_copy (grid.peek(), me);
 	}
-	praat_new (grid.transfer(), L"grid");
+	praat_new (grid.transfer(), U"grid");
 END2 }
 
 /***** INTERVALTIER *****/
 
-FORM (IntervalTier_downto_TableOfReal, L"IntervalTier: Down to TableOfReal", 0) {
-	SENTENCE (L"Label", L"")
+FORM (IntervalTier_downto_TableOfReal, U"IntervalTier: Down to TableOfReal", 0) {
+	SENTENCE (U"Label", U"")
 	OK2
 DO
 	LOOP {
 		iam (IntervalTier);
-		autoTableOfReal thee = IntervalTier_downto_TableOfReal (me, GET_STRING (L"Label"));
+		autoTableOfReal thee = IntervalTier_downto_TableOfReal (me, GET_STRING (U"Label"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
@@ -74,42 +74,44 @@ DIRECT2 (IntervalTier_downto_TableOfReal_any) {
 	}
 END2 }
 
-FORM (IntervalTier_getCentrePoints, L"IntervalTier: Get centre points", 0) {
-	SENTENCE (L"Text", L"")
+FORM (IntervalTier_getCentrePoints, U"IntervalTier: Get centre points", 0) {
+	SENTENCE (U"Text", U"")
 	OK2
 DO
 	LOOP {
 		iam (IntervalTier);
-		autoPointProcess thee = IntervalTier_getCentrePoints (me, GET_STRING (L"Text"));
-		praat_new (thee.transfer(), GET_STRING (L"Text"));
+		autoPointProcess thee = IntervalTier_getCentrePoints (me, GET_STRING (U"Text"));
+		praat_new (thee.transfer(), GET_STRING (U"Text"));
 	}
 END2 }
 
-FORM (IntervalTier_getEndPoints, L"IntervalTier: Get end points", 0) {
-	SENTENCE (L"Text", L"")
+FORM (IntervalTier_getEndPoints, U"IntervalTier: Get end points", 0) {
+	SENTENCE (U"Text", U"")
 	OK2
 DO
 	LOOP {
 		iam (IntervalTier);
-		autoPointProcess thee = IntervalTier_getEndPoints (me, GET_STRING (L"Text"));
-		praat_new (thee.transfer(), GET_STRING (L"Text"));
+		autoPointProcess thee = IntervalTier_getEndPoints (me, GET_STRING (U"Text"));
+		praat_new (thee.transfer(), GET_STRING (U"Text"));
 	}
 END2 }
 
-FORM (IntervalTier_getStartingPoints, L"IntervalTier: Get starting points", 0) {
-	SENTENCE (L"Text", L"")
+FORM (IntervalTier_getStartingPoints, U"IntervalTier: Get starting points", 0) {
+	SENTENCE (U"Text", U"")
 	OK2
 DO
 	LOOP {
 		iam (IntervalTier);
-		autoPointProcess thee = IntervalTier_getStartingPoints (me, GET_STRING (L"Text"));
-		praat_new (thee.transfer(), GET_STRING (L"Text"));
+		autoPointProcess thee = IntervalTier_getStartingPoints (me, GET_STRING (U"Text"));
+		praat_new (thee.transfer(), GET_STRING (U"Text"));
 	}
 END2 }
 
-DIRECT2 (IntervalTier_help) { Melder_help (L"IntervalTier"); END2 }
+DIRECT2 (IntervalTier_help) {
+	Melder_help (U"IntervalTier");
+END2 }
 
-FORM_WRITE2 (IntervalTier_writeToXwaves, L"Xwaves label file", 0, 0) {
+FORM_WRITE2 (IntervalTier_writeToXwaves, U"Xwaves label file", 0, 0) {
 	LOOP {
 		iam (IntervalTier);
 		IntervalTier_writeToXwaves (me, file);
@@ -118,8 +120,8 @@ END2 }
 
 /***** INTERVALTIER & POINTPROCESS *****/
 
-FORM (IntervalTier_PointProcess_endToCentre, L"From end to centre", L"IntervalTier & PointProcess: End to centre...") {
-	REAL (L"Phase (0-1)", L"0.5")
+FORM (IntervalTier_PointProcess_endToCentre, U"From end to centre", U"IntervalTier & PointProcess: End to centre...") {
+	REAL (U"Phase (0-1)", U"0.5")
 	OK2
 DO
 	IntervalTier tier = NULL;
@@ -128,13 +130,13 @@ DO
 		if (CLASS == classIntervalTier) tier = (IntervalTier) OBJECT;
 		if (CLASS == classPointProcess) point = (PointProcess) OBJECT;
 	}
-	double phase = GET_REAL (L"Phase");
+	double phase = GET_REAL (U"Phase");
 	autoPointProcess thee = IntervalTier_PointProcess_endToCentre (tier, point, phase);
-	praat_new (thee.transfer(), tier -> name, L"_", point -> name, L"_", Melder_integer ((long) (100 * phase)));
+	praat_new (thee.transfer(), tier -> name, U"_", point -> name, U"_", lround (100.0 * phase));
 END2 }
 
-FORM (IntervalTier_PointProcess_startToCentre, L"From start to centre", L"IntervalTier & PointProcess: Start to centre...") {
-	REAL (L"Phase (0-1)", L"0.5")
+FORM (IntervalTier_PointProcess_startToCentre, U"From start to centre", U"IntervalTier & PointProcess: Start to centre...") {
+	REAL (U"Phase (0-1)", U"0.5")
 	OK2
 DO
 	IntervalTier tier = NULL;
@@ -143,9 +145,9 @@ DO
 		if (CLASS == classIntervalTier) tier = (IntervalTier) OBJECT;
 		if (CLASS == classPointProcess) point = (PointProcess) OBJECT;
 	}
-	double phase = GET_REAL (L"Phase");
+	double phase = GET_REAL (U"Phase");
 	autoPointProcess thee = IntervalTier_PointProcess_startToCentre (tier, point, phase);
-	praat_new (thee.transfer(), tier -> name, L"_", point -> name, L"_", Melder_integer ((long) (100 * phase)));
+	praat_new (thee.transfer(), tier -> name, U"_", point -> name, U"_", lround (100.0 * phase));
 END2 }
 
 /***** LABEL (obsolete) *****/
@@ -162,13 +164,13 @@ DIRECT2 (Label_Sound_to_TextGrid) {
 END2 }
 
 DIRECT2 (info_Label_Sound_to_TextGrid) {
-	Melder_information (L"This is an old-style Label object. To turn it into a TextGrid, L"
+	Melder_information (U"This is an old-style Label object. To turn it into a TextGrid, U"
 		"select it together with a Sound of the appropriate duration, and click \"To TextGrid\".");
 END2 }
 
 /***** PITCH & TEXTGRID *****/
 
-static void pr_TextGrid_Pitch_draw (Any dia, int speckle, int unit) {
+static void pr_TextGrid_Pitch_draw (UiForm dia, int speckle, int unit) {
 	TextGrid grid = NULL;
 	Pitch pitch = NULL;
 	int IOBJECT;
@@ -181,82 +183,82 @@ static void pr_TextGrid_Pitch_draw (Any dia, int speckle, int unit) {
 	praat_get_frequencyRange (dia, & fmin, & fmax);
 	autoPraatPicture picture;
 	TextGrid_Pitch_draw (grid, pitch, GRAPHICS,
-		GET_INTEGER (STRING_TIER_NUMBER), tmin, tmax, fmin, fmax, GET_INTEGER (L"Font size"),
-		GET_INTEGER (L"Use text styles"), GET_INTEGER (L"Text alignment") - 1, GET_INTEGER (L"Garnish"), speckle, unit);
+		GET_INTEGER (STRING_TIER_NUMBER), tmin, tmax, fmin, fmax, GET_INTEGER (U"Font size"),
+		GET_INTEGER (U"Use text styles"), GET_INTEGER (U"Text alignment") - 1, GET_INTEGER (U"Garnish"), speckle, unit);
 }
 
-FORM (TextGrid_Pitch_draw, L"TextGrid & Pitch: Draw", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_Pitch_draw, U"TextGrid & Pitch: Draw", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
 	praat_dia_timeRange (dia);
-	REAL (STRING_FROM_FREQUENCY_HZ, L"0.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	INTEGER (L"Font size (points)", L"18")
-	BOOLEAN (L"Use text styles", 1)
-	OPTIONMENU (L"Text alignment", 2) OPTION (L"Left") OPTION (L"Centre") OPTION (L"Right")
-	BOOLEAN (L"Garnish", 1)
+	REAL (STRING_FROM_FREQUENCY_HZ, U"0.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	INTEGER (U"Font size (points)", U"18")
+	BOOLEAN (U"Use text styles", 1)
+	OPTIONMENU (U"Text alignment", 2) OPTION (U"Left") OPTION (U"Centre") OPTION (U"Right")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_draw (dia, Pitch_speckle_NO, kPitch_unit_HERTZ);
 END2 }
 
-FORM (TextGrid_Pitch_drawErb, L"TextGrid & Pitch: Draw erb", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_Pitch_drawErb, U"TextGrid & Pitch: Draw erb", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
 	praat_dia_timeRange (dia);
-	REAL (L"left Frequency range (ERB)", L"0")
-	REAL (L"right Frequency range (ERB)", L"10.0")
-	INTEGER (L"Font size (points)", L"18")
-	BOOLEAN (L"Use text styles", 1)
-	OPTIONMENU (L"Text alignment", 2) OPTION (L"Left") OPTION (L"Centre") OPTION (L"Right")
-	BOOLEAN (L"Garnish", 1)
+	REAL (U"left Frequency range (ERB)", U"0")
+	REAL (U"right Frequency range (ERB)", U"10.0")
+	INTEGER (U"Font size (points)", U"18")
+	BOOLEAN (U"Use text styles", 1)
+	OPTIONMENU (U"Text alignment", 2) OPTION (U"Left") OPTION (U"Centre") OPTION (U"Right")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_draw (dia, Pitch_speckle_NO, kPitch_unit_ERB);
 END2 }
 
-FORM (TextGrid_Pitch_drawLogarithmic, L"TextGrid & Pitch: Draw logarithmic", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_Pitch_drawLogarithmic, U"TextGrid & Pitch: Draw logarithmic", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
 	praat_dia_timeRange (dia);
-	POSITIVE (STRING_FROM_FREQUENCY_HZ, L"50.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	INTEGER (L"Font size (points)", L"18")
-	BOOLEAN (L"Use text styles", 1)
-	OPTIONMENU (L"Text alignment", 2) OPTION (L"Left") OPTION (L"Centre") OPTION (L"Right")
-	BOOLEAN (L"Garnish", 1)
+	POSITIVE (STRING_FROM_FREQUENCY_HZ, U"50.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	INTEGER (U"Font size (points)", U"18")
+	BOOLEAN (U"Use text styles", 1)
+	OPTIONMENU (U"Text alignment", 2) OPTION (U"Left") OPTION (U"Centre") OPTION (U"Right")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_draw (dia, Pitch_speckle_NO, kPitch_unit_HERTZ_LOGARITHMIC);
 END2 }
 
-FORM (TextGrid_Pitch_drawMel, L"TextGrid & Pitch: Draw mel", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_Pitch_drawMel, U"TextGrid & Pitch: Draw mel", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
 	praat_dia_timeRange (dia);
-	REAL (L"left Frequency range (mel)", L"0")
-	REAL (L"right Frequency range (mel)", L"500")
-	INTEGER (L"Font size (points)", L"18")
-	BOOLEAN (L"Use text styles", 1)
-	OPTIONMENU (L"Text alignment", 2) OPTION (L"Left") OPTION (L"Centre") OPTION (L"Right")
-	BOOLEAN (L"Garnish", 1)
+	REAL (U"left Frequency range (mel)", U"0")
+	REAL (U"right Frequency range (mel)", U"500")
+	INTEGER (U"Font size (points)", U"18")
+	BOOLEAN (U"Use text styles", 1)
+	OPTIONMENU (U"Text alignment", 2) OPTION (U"Left") OPTION (U"Centre") OPTION (U"Right")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_draw (dia, Pitch_speckle_NO, kPitch_unit_MEL);
 END2 }
 
-FORM (TextGrid_Pitch_drawSemitones, L"TextGrid & Pitch: Draw semitones", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_Pitch_drawSemitones, U"TextGrid & Pitch: Draw semitones", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
 	praat_dia_timeRange (dia);
-	LABEL (L"", L"Range in semitones re 100 hertz:")
-	REAL (L"left Frequency range (st)", L"-12.0")
-	REAL (L"right Frequency range (st)", L"30.0")
-	INTEGER (L"Font size (points)", L"18")
-	BOOLEAN (L"Use text styles", 1)
-	OPTIONMENU (L"Text alignment", 2) OPTION (L"Left") OPTION (L"Centre") OPTION (L"Right")
-	BOOLEAN (L"Garnish", 1)
+	LABEL (U"", U"Range in semitones re 100 hertz:")
+	REAL (U"left Frequency range (st)", U"-12.0")
+	REAL (U"right Frequency range (st)", U"30.0")
+	INTEGER (U"Font size (points)", U"18")
+	BOOLEAN (U"Use text styles", 1)
+	OPTIONMENU (U"Text alignment", 2) OPTION (U"Left") OPTION (U"Centre") OPTION (U"Right")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_draw (dia, Pitch_speckle_NO, kPitch_unit_SEMITONES_100);
 END2 }
 
-static void pr_TextGrid_Pitch_drawSeparately (Any dia, int speckle, int unit) {
+static void pr_TextGrid_Pitch_drawSeparately (UiForm dia, int speckle, int unit) {
 	TextGrid grid = NULL;
 	Pitch pitch = NULL;
 	int IOBJECT;
@@ -269,198 +271,198 @@ static void pr_TextGrid_Pitch_drawSeparately (Any dia, int speckle, int unit) {
 	praat_get_frequencyRange (dia, & fmin, & fmax);
 	autoPraatPicture picture;
 	TextGrid_Pitch_drawSeparately (grid, pitch, GRAPHICS,
-		tmin, tmax, fmin, fmax, GET_INTEGER (L"Show boundaries"),
-		GET_INTEGER (L"Use text styles"), GET_INTEGER (L"Garnish"), speckle, unit);
+		tmin, tmax, fmin, fmax, GET_INTEGER (U"Show boundaries"),
+		GET_INTEGER (U"Use text styles"), GET_INTEGER (U"Garnish"), speckle, unit);
 }
 
-FORM (TextGrid_Pitch_drawSeparately, L"TextGrid & Pitch: Draw separately", 0) {
+FORM (TextGrid_Pitch_drawSeparately, U"TextGrid & Pitch: Draw separately", 0) {
 	praat_dia_timeRange (dia);
-	REAL (STRING_FROM_FREQUENCY_HZ, L"0.0")
-	REAL (STRING_TO_FREQUENCY_HZ, L"500.0")
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	REAL (STRING_FROM_FREQUENCY_HZ, U"0.0")
+	REAL (STRING_TO_FREQUENCY_HZ, U"500.0")
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_drawSeparately (dia, Pitch_speckle_NO, kPitch_unit_HERTZ);
 END2 }
 
-FORM (TextGrid_Pitch_drawSeparatelyErb, L"TextGrid & Pitch: Draw separately erb", 0) {
+FORM (TextGrid_Pitch_drawSeparatelyErb, U"TextGrid & Pitch: Draw separately erb", 0) {
 	praat_dia_timeRange (dia);
-	REAL (L"left Frequency range (ERB)", L"0")
-	REAL (L"right Frequency range (ERB)", L"10.0")
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	REAL (U"left Frequency range (ERB)", U"0")
+	REAL (U"right Frequency range (ERB)", U"10.0")
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_drawSeparately (dia, Pitch_speckle_NO, kPitch_unit_ERB);
 END2 }
 
-FORM (TextGrid_Pitch_drawSeparatelyLogarithmic, L"TextGrid & Pitch: Draw separately logarithmic", 0) {
+FORM (TextGrid_Pitch_drawSeparatelyLogarithmic, U"TextGrid & Pitch: Draw separately logarithmic", 0) {
 	praat_dia_timeRange (dia);
-	POSITIVE (STRING_FROM_FREQUENCY_HZ, L"50.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	POSITIVE (STRING_FROM_FREQUENCY_HZ, U"50.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_drawSeparately (dia, Pitch_speckle_NO, kPitch_unit_HERTZ_LOGARITHMIC);
 END2 }
 
-FORM (TextGrid_Pitch_drawSeparatelyMel, L"TextGrid & Pitch: Draw separately mel", 0) {
+FORM (TextGrid_Pitch_drawSeparatelyMel, U"TextGrid & Pitch: Draw separately mel", 0) {
 	praat_dia_timeRange (dia);
-	REAL (L"left Frequency range (mel)", L"0")
-	REAL (L"right Frequency range (mel)", L"500")
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	REAL (U"left Frequency range (mel)", U"0")
+	REAL (U"right Frequency range (mel)", U"500")
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_drawSeparately (dia, Pitch_speckle_NO, kPitch_unit_MEL);
 END2 }
 
-FORM (TextGrid_Pitch_drawSeparatelySemitones, L"TextGrid & Pitch: Draw separately semitones", 0) {
+FORM (TextGrid_Pitch_drawSeparatelySemitones, U"TextGrid & Pitch: Draw separately semitones", 0) {
 	praat_dia_timeRange (dia);
-	LABEL (L"", L"Range in semitones re 100 hertz:")
-	REAL (L"left Frequency range (st)", L"-12.0")
-	REAL (L"right Frequency range (st)", L"30.0")
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	LABEL (U"", U"Range in semitones re 100 hertz:")
+	REAL (U"left Frequency range (st)", U"-12.0")
+	REAL (U"right Frequency range (st)", U"30.0")
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_drawSeparately (dia, Pitch_speckle_NO, kPitch_unit_SEMITONES_100);
 END2 }
 
-FORM (TextGrid_Pitch_speckle, L"TextGrid & Pitch: Speckle", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_Pitch_speckle, U"TextGrid & Pitch: Speckle", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
 	praat_dia_timeRange (dia);
-	REAL (STRING_FROM_FREQUENCY_HZ, L"0.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	INTEGER (L"Font size (points)", L"18")
-	BOOLEAN (L"Use text styles", 1)
-	OPTIONMENU (L"Text alignment", 2) OPTION (L"Left") OPTION (L"Centre") OPTION (L"Right")
-	BOOLEAN (L"Garnish", 1)
+	REAL (STRING_FROM_FREQUENCY_HZ, U"0.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	INTEGER (U"Font size (points)", U"18")
+	BOOLEAN (U"Use text styles", 1)
+	OPTIONMENU (U"Text alignment", 2) OPTION (U"Left") OPTION (U"Centre") OPTION (U"Right")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_draw (dia, Pitch_speckle_YES, kPitch_unit_HERTZ);
 END2 }
 
-FORM (TextGrid_Pitch_speckleErb, L"TextGrid & Pitch: Speckle erb", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_Pitch_speckleErb, U"TextGrid & Pitch: Speckle erb", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
 	praat_dia_timeRange (dia);
-	REAL (L"left Frequency range (ERB)", L"0")
-	REAL (L"right Frequency range (ERB)", L"10.0")
-	INTEGER (L"Font size (points)", L"18")
-	BOOLEAN (L"Use text styles", 1)
-	OPTIONMENU (L"Text alignment", 2) OPTION (L"Left") OPTION (L"Centre") OPTION (L"Right")
-	BOOLEAN (L"Garnish", 1)
+	REAL (U"left Frequency range (ERB)", U"0")
+	REAL (U"right Frequency range (ERB)", U"10.0")
+	INTEGER (U"Font size (points)", U"18")
+	BOOLEAN (U"Use text styles", 1)
+	OPTIONMENU (U"Text alignment", 2) OPTION (U"Left") OPTION (U"Centre") OPTION (U"Right")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_draw (dia, Pitch_speckle_YES, kPitch_unit_ERB);
 END2 }
 
-FORM (TextGrid_Pitch_speckleLogarithmic, L"TextGrid & Pitch: Speckle logarithmic", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_Pitch_speckleLogarithmic, U"TextGrid & Pitch: Speckle logarithmic", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
 	praat_dia_timeRange (dia);
-	POSITIVE (STRING_FROM_FREQUENCY_HZ, L"50.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	INTEGER (L"Font size (points)", L"18")
-	BOOLEAN (L"Use text styles", 1)
-	OPTIONMENU (L"Text alignment", 2) OPTION (L"Left") OPTION (L"Centre") OPTION (L"Right")
-	BOOLEAN (L"Garnish", 1)
+	POSITIVE (STRING_FROM_FREQUENCY_HZ, U"50.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	INTEGER (U"Font size (points)", U"18")
+	BOOLEAN (U"Use text styles", 1)
+	OPTIONMENU (U"Text alignment", 2) OPTION (U"Left") OPTION (U"Centre") OPTION (U"Right")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_draw (dia, Pitch_speckle_YES, kPitch_unit_HERTZ_LOGARITHMIC);
 END2 }
 
-FORM (TextGrid_Pitch_speckleMel, L"TextGrid & Pitch: Speckle mel", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_Pitch_speckleMel, U"TextGrid & Pitch: Speckle mel", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
 	praat_dia_timeRange (dia);
-	REAL (L"left Frequency range (mel)", L"0")
-	REAL (L"right Frequency range (mel)", L"500")
-	INTEGER (L"Font size (points)", L"18")
-	BOOLEAN (L"Use text styles", 1)
-	OPTIONMENU (L"Text alignment", 2) OPTION (L"Left") OPTION (L"Centre") OPTION (L"Right")
-	BOOLEAN (L"Garnish", 1)
+	REAL (U"left Frequency range (mel)", U"0")
+	REAL (U"right Frequency range (mel)", U"500")
+	INTEGER (U"Font size (points)", U"18")
+	BOOLEAN (U"Use text styles", 1)
+	OPTIONMENU (U"Text alignment", 2) OPTION (U"Left") OPTION (U"Centre") OPTION (U"Right")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_draw (dia, Pitch_speckle_YES, kPitch_unit_MEL);
 END2 }
 
-FORM (TextGrid_Pitch_speckleSemitones, L"TextGrid & Pitch: Speckle semitones", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_Pitch_speckleSemitones, U"TextGrid & Pitch: Speckle semitones", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
 	praat_dia_timeRange (dia);
-	LABEL (L"", L"Range in semitones re 100 hertz:")
-	REAL (L"left Frequency range (st)", L"-12.0")
-	REAL (L"right Frequency range (st)", L"30.0")
-	INTEGER (L"Font size (points)", L"18")
-	BOOLEAN (L"Use text styles", 1)
-	OPTIONMENU (L"Text alignment", 2) OPTION (L"Left") OPTION (L"Centre") OPTION (L"Right")
-	BOOLEAN (L"Garnish", 1)
+	LABEL (U"", U"Range in semitones re 100 hertz:")
+	REAL (U"left Frequency range (st)", U"-12.0")
+	REAL (U"right Frequency range (st)", U"30.0")
+	INTEGER (U"Font size (points)", U"18")
+	BOOLEAN (U"Use text styles", 1)
+	OPTIONMENU (U"Text alignment", 2) OPTION (U"Left") OPTION (U"Centre") OPTION (U"Right")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_draw (dia, Pitch_speckle_YES, kPitch_unit_SEMITONES_100);
 END2 }
 
-FORM (TextGrid_Pitch_speckleSeparately, L"TextGrid & Pitch: Speckle separately", 0) {
+FORM (TextGrid_Pitch_speckleSeparately, U"TextGrid & Pitch: Speckle separately", 0) {
 	praat_dia_timeRange (dia);
-	REAL (STRING_FROM_FREQUENCY_HZ, L"0.0")
-	REAL (STRING_TO_FREQUENCY_HZ, L"500.0")
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	REAL (STRING_FROM_FREQUENCY_HZ, U"0.0")
+	REAL (STRING_TO_FREQUENCY_HZ, U"500.0")
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_drawSeparately (dia, Pitch_speckle_YES, kPitch_unit_HERTZ);
 END2 }
 
-FORM (TextGrid_Pitch_speckleSeparatelyErb, L"TextGrid & Pitch: Speckle separately erb", 0) {
+FORM (TextGrid_Pitch_speckleSeparatelyErb, U"TextGrid & Pitch: Speckle separately erb", 0) {
 	praat_dia_timeRange (dia);
-	REAL (L"left Frequency range (ERB)", L"0")
-	REAL (L"right Frequency range (ERB)", L"10.0")
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	REAL (U"left Frequency range (ERB)", U"0")
+	REAL (U"right Frequency range (ERB)", U"10.0")
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_drawSeparately (dia, Pitch_speckle_YES, kPitch_unit_ERB);
 END2 }
 
-FORM (TextGrid_Pitch_speckleSeparatelyLogarithmic, L"TextGrid & Pitch: Speckle separately logarithmic", 0) {
+FORM (TextGrid_Pitch_speckleSeparatelyLogarithmic, U"TextGrid & Pitch: Speckle separately logarithmic", 0) {
 	praat_dia_timeRange (dia);
-	POSITIVE (STRING_FROM_FREQUENCY_HZ, L"50.0")
-	POSITIVE (STRING_TO_FREQUENCY_HZ, L"500.0")
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	POSITIVE (STRING_FROM_FREQUENCY_HZ, U"50.0")
+	POSITIVE (STRING_TO_FREQUENCY_HZ, U"500.0")
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_drawSeparately (dia, Pitch_speckle_YES, kPitch_unit_HERTZ_LOGARITHMIC);
 END2 }
 
-FORM (TextGrid_Pitch_speckleSeparatelyMel, L"TextGrid & Pitch: Speckle separately mel", 0) {
+FORM (TextGrid_Pitch_speckleSeparatelyMel, U"TextGrid & Pitch: Speckle separately mel", 0) {
 	praat_dia_timeRange (dia);
-	REAL (L"left Frequency range (mel)", L"0")
-	REAL (L"right Frequency range (mel)", L"500")
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	REAL (U"left Frequency range (mel)", U"0")
+	REAL (U"right Frequency range (mel)", U"500")
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_drawSeparately (dia, Pitch_speckle_YES, kPitch_unit_MEL);
 END2 }
 
-FORM (TextGrid_Pitch_speckleSeparatelySemitones, L"TextGrid & Pitch: Speckle separately semitones", 0) {
+FORM (TextGrid_Pitch_speckleSeparatelySemitones, U"TextGrid & Pitch: Speckle separately semitones", 0) {
 	praat_dia_timeRange (dia);
-	LABEL (L"", L"Range in semitones re 100 hertz:")
-	REAL (L"left Frequency range (st)", L"-12.0")
-	REAL (L"right Frequency range (st)", L"30.0")
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	LABEL (U"", U"Range in semitones re 100 hertz:")
+	REAL (U"left Frequency range (st)", U"-12.0")
+	REAL (U"right Frequency range (st)", U"30.0")
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	pr_TextGrid_Pitch_drawSeparately (dia, Pitch_speckle_YES, kPitch_unit_SEMITONES_100);
@@ -468,31 +470,31 @@ END2 }
 
 /***** PITCH & TEXTTIER *****/
 
-FORM (Pitch_TextTier_to_PitchTier, L"Pitch & TextTier to PitchTier", L"Pitch & TextTier: To PitchTier...") {
-	RADIO (L"Unvoiced strategy", 3)
-		RADIOBUTTON (L"Zero")
-		RADIOBUTTON (L"Error")
-		RADIOBUTTON (L"Interpolate")
+FORM (Pitch_TextTier_to_PitchTier, U"Pitch & TextTier to PitchTier", U"Pitch & TextTier: To PitchTier...") {
+	RADIO (U"Unvoiced strategy", 3)
+		RADIOBUTTON (U"Zero")
+		RADIOBUTTON (U"Error")
+		RADIOBUTTON (U"Interpolate")
 	OK2
 DO
 	Pitch pitch = NULL;
 	TextTier tier = NULL;
 	LOOP {
-		iam (Data);
+		iam (Daata);
 		if (CLASS == classPitch) pitch = (Pitch) me;
 		if (CLASS == classTextTier) tier = (TextTier) me;
 	}
-	autoPitchTier thee = Pitch_AnyTier_to_PitchTier (pitch, (AnyTier) tier, GET_INTEGER (L"Unvoiced strategy") - 1);
+	autoPitchTier thee = Pitch_AnyTier_to_PitchTier (pitch, (AnyTier) tier, GET_INTEGER (U"Unvoiced strategy") - 1);
 	praat_new (thee.transfer(), pitch -> name);
 END2 }
 
 /***** SOUND & TEXTGRID *****/
 
-FORM (TextGrid_Sound_draw, L"TextGrid & Sound: Draw...", 0) {
+FORM (TextGrid_Sound_draw, U"TextGrid & Sound: Draw...", 0) {
 	praat_dia_timeRange (dia);
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	TextGrid textgrid = NULL;
@@ -503,13 +505,13 @@ DO
 	}
 	autoPraatPicture picture;
 	TextGrid_Sound_draw (textgrid, sound, GRAPHICS,
-		GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Show boundaries"),
-		GET_INTEGER (L"Use text styles"), GET_INTEGER (L"Garnish"));
+		GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Show boundaries"),
+		GET_INTEGER (U"Use text styles"), GET_INTEGER (U"Garnish"));
 END2 }
 
-FORM (TextGrid_Sound_extractAllIntervals, L"TextGrid & Sound: Extract all intervals", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
-	BOOLEAN (L"Preserve times", 0)
+FORM (TextGrid_Sound_extractAllIntervals, U"TextGrid & Sound: Extract all intervals", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
+	BOOLEAN (U"Preserve times", 0)
 	OK2
 DO
 	TextGrid textgrid = NULL;
@@ -519,13 +521,13 @@ DO
 		if (CLASS == classSound) sound = (Sound) OBJECT;
 	}
 	autoCollection thee = TextGrid_Sound_extractAllIntervals (textgrid, sound,
-		GET_INTEGER (STRING_TIER_NUMBER), GET_INTEGER (L"Preserve times"));
-	praat_new (thee.transfer(), L"dummy");
+		GET_INTEGER (STRING_TIER_NUMBER), GET_INTEGER (U"Preserve times"));
+	praat_new (thee.transfer(), U"dummy");
 END2 }
 
-FORM (TextGrid_Sound_extractNonemptyIntervals, L"TextGrid & Sound: Extract non-empty intervals", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
-	BOOLEAN (L"Preserve times", 0)
+FORM (TextGrid_Sound_extractNonemptyIntervals, U"TextGrid & Sound: Extract non-empty intervals", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
+	BOOLEAN (U"Preserve times", 0)
 	OK2
 DO
 	TextGrid textgrid = NULL;
@@ -535,14 +537,14 @@ DO
 		if (CLASS == classSound) sound = (Sound) OBJECT;
 	}
 	autoCollection thee = TextGrid_Sound_extractNonemptyIntervals (textgrid, sound,
-		GET_INTEGER (STRING_TIER_NUMBER), GET_INTEGER (L"Preserve times"));
-	praat_new (thee.transfer(), L"dummy");
+		GET_INTEGER (STRING_TIER_NUMBER), GET_INTEGER (U"Preserve times"));
+	praat_new (thee.transfer(), U"dummy");
 END2 }
 
-FORM (TextGrid_Sound_extractIntervals, L"TextGrid & Sound: Extract intervals", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
-	BOOLEAN (L"Preserve times", 0)
-	SENTENCE (L"Label text", L"")
+FORM (TextGrid_Sound_extractIntervals, U"TextGrid & Sound: Extract intervals", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
+	BOOLEAN (U"Preserve times", 0)
+	SENTENCE (U"Label text", U"")
 	OK2
 DO
 	TextGrid textgrid = NULL;
@@ -552,16 +554,16 @@ DO
 		if (CLASS == classSound) sound = (Sound) OBJECT;
 	}
 	autoCollection thee = TextGrid_Sound_extractIntervalsWhere (textgrid, sound,
-		GET_INTEGER (STRING_TIER_NUMBER), kMelder_string_EQUAL_TO, GET_STRING (L"Label text"),
-		GET_INTEGER (L"Preserve times"));
-	praat_new (thee.transfer(), GET_STRING (L"Label text"));
+		GET_INTEGER (STRING_TIER_NUMBER), kMelder_string_EQUAL_TO, GET_STRING (U"Label text"),
+		GET_INTEGER (U"Preserve times"));
+	praat_new (thee.transfer(), GET_STRING (U"Label text"));
 END2 }
 
-FORM (TextGrid_Sound_extractIntervalsWhere, L"TextGrid & Sound: Extract intervals", 0) {
-	INTEGER (STRING_TIER_NUMBER, L"1")
-	BOOLEAN (L"Preserve times", 0)
-	OPTIONMENU_ENUM (L"Extract every interval whose label...", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"")
+FORM (TextGrid_Sound_extractIntervalsWhere, U"TextGrid & Sound: Extract intervals", 0) {
+	INTEGER (STRING_TIER_NUMBER, U"1")
+	BOOLEAN (U"Preserve times", 0)
+	OPTIONMENU_ENUM (U"Extract every interval whose label...", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"")
 	OK2
 DO
 	TextGrid textgrid = NULL;
@@ -572,10 +574,10 @@ DO
 	}
 	autoCollection thee = TextGrid_Sound_extractIntervalsWhere (textgrid, sound,
 		GET_INTEGER (STRING_TIER_NUMBER),
-		GET_ENUM (kMelder_string, L"Extract every interval whose label..."),
-		GET_STRING (L"...the text"),
-		GET_INTEGER (L"Preserve times"));
-	praat_new (thee.transfer(), GET_STRING (L"...the text"));
+		GET_ENUM (kMelder_string, U"Extract every interval whose label..."),
+		GET_STRING (U"...the text"),
+		GET_INTEGER (U"Preserve times"));
+	praat_new (thee.transfer(), GET_STRING (U"...the text"));
 END2 }
 
 DIRECT2 (TextGrid_Sound_scaleTimes) {
@@ -604,66 +606,66 @@ END2 }
 
 /***** SPELLINGCHECKER *****/
 
-FORM (SpellingChecker_addNewWord, L"Add word to user dictionary", L"SpellingChecker") {
-	SENTENCE (L"New word", L"")
+FORM (SpellingChecker_addNewWord, U"Add word to user dictionary", U"SpellingChecker") {
+	SENTENCE (U"New word", U"")
 	OK2
 DO
 	LOOP {
 		iam (SpellingChecker);
-		SpellingChecker_addNewWord (me, GET_STRING (L"New word"));
+		SpellingChecker_addNewWord (me, GET_STRING (U"New word"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (SpellingChecker_edit, L"Edit spelling checker", L"SpellingChecker") {
-	LABEL (L"", L"-- Syntax --")
-	SENTENCE (L"Forbidden strings", L"")
-	BOOLEAN (L"Check matching parentheses", 0)
-	SENTENCE (L"Separating characters", L"")
-	BOOLEAN (L"Allow all parenthesized", 0)
-	LABEL (L"", L"-- Capitals --")
-	BOOLEAN (L"Allow all names", 0)
-	SENTENCE (L"Name prefixes", L"")
-	BOOLEAN (L"Allow all abbreviations", 0)
-	LABEL (L"", L"-- Capitalization --")
-	BOOLEAN (L"Allow caps sentence-initially", 0)
-	BOOLEAN (L"Allow caps after colon", 0)
-	LABEL (L"", L"-- Word parts --")
-	SENTENCE (L"Allow all words containing", L"")
-	SENTENCE (L"Allow all words starting with", L"")
-	SENTENCE (L"Allow all words ending in", L"")
+FORM (SpellingChecker_edit, U"Edit spelling checker", U"SpellingChecker") {
+	LABEL (U"", U"-- Syntax --")
+	SENTENCE (U"Forbidden strings", U"")
+	BOOLEAN (U"Check matching parentheses", 0)
+	SENTENCE (U"Separating characters", U"")
+	BOOLEAN (U"Allow all parenthesized", 0)
+	LABEL (U"", U"-- Capitals --")
+	BOOLEAN (U"Allow all names", 0)
+	SENTENCE (U"Name prefixes", U"")
+	BOOLEAN (U"Allow all abbreviations", 0)
+	LABEL (U"", U"-- Capitalization --")
+	BOOLEAN (U"Allow caps sentence-initially", 0)
+	BOOLEAN (U"Allow caps after colon", 0)
+	LABEL (U"", U"-- Word parts --")
+	SENTENCE (U"Allow all words containing", U"")
+	SENTENCE (U"Allow all words starting with", U"")
+	SENTENCE (U"Allow all words ending in", U"")
 	OK2
 int IOBJECT;
 LOOP {
 	iam (SpellingChecker);
-	SET_STRING (L"Forbidden strings", my forbiddenStrings)
-	SET_INTEGER (L"Check matching parentheses", my checkMatchingParentheses)
-	SET_STRING (L"Separating characters", my separatingCharacters)
-	SET_INTEGER (L"Allow all parenthesized", my allowAllParenthesized)
-	SET_INTEGER (L"Allow all names", my allowAllNames)
-	SET_STRING (L"Name prefixes", my namePrefixes)
-	SET_INTEGER (L"Allow all abbreviations", my allowAllAbbreviations)
-	SET_INTEGER (L"Allow caps sentence-initially", my allowCapsSentenceInitially)
-	SET_INTEGER (L"Allow caps after colon", my allowCapsAfterColon)
-	SET_STRING (L"Allow all words containing", my allowAllWordsContaining)
-	SET_STRING (L"Allow all words starting with", my allowAllWordsStartingWith)
-	SET_STRING (L"Allow all words ending in", my allowAllWordsEndingIn)
+	SET_STRING (U"Forbidden strings", my forbiddenStrings)
+	SET_INTEGER (U"Check matching parentheses", my checkMatchingParentheses)
+	SET_STRING (U"Separating characters", my separatingCharacters)
+	SET_INTEGER (U"Allow all parenthesized", my allowAllParenthesized)
+	SET_INTEGER (U"Allow all names", my allowAllNames)
+	SET_STRING (U"Name prefixes", my namePrefixes)
+	SET_INTEGER (U"Allow all abbreviations", my allowAllAbbreviations)
+	SET_INTEGER (U"Allow caps sentence-initially", my allowCapsSentenceInitially)
+	SET_INTEGER (U"Allow caps after colon", my allowCapsAfterColon)
+	SET_STRING (U"Allow all words containing", my allowAllWordsContaining)
+	SET_STRING (U"Allow all words starting with", my allowAllWordsStartingWith)
+	SET_STRING (U"Allow all words ending in", my allowAllWordsEndingIn)
 }
 DO
 	LOOP {
 		iam (SpellingChecker);
-		Melder_free (my forbiddenStrings); my forbiddenStrings = Melder_wcsdup_f (GET_STRING (L"Forbidden strings"));
-		my checkMatchingParentheses = GET_INTEGER (L"Check matching parentheses");
-		Melder_free (my separatingCharacters); my separatingCharacters = Melder_wcsdup_f (GET_STRING (L"Separating characters"));
-		my allowAllParenthesized = GET_INTEGER (L"Allow all parenthesized");
-		my allowAllNames = GET_INTEGER (L"Allow all names");
-		Melder_free (my namePrefixes); my namePrefixes = Melder_wcsdup_f (GET_STRING (L"Name prefixes"));
-		my allowAllAbbreviations = GET_INTEGER (L"Allow all abbreviations");
-		my allowCapsSentenceInitially = GET_INTEGER (L"Allow caps sentence-initially");
-		my allowCapsAfterColon = GET_INTEGER (L"Allow caps after colon");
-		Melder_free (my allowAllWordsContaining); my allowAllWordsContaining = Melder_wcsdup_f (GET_STRING (L"Allow all words containing"));
-		Melder_free (my allowAllWordsStartingWith); my allowAllWordsStartingWith = Melder_wcsdup_f (GET_STRING (L"Allow all words starting with"));
-		Melder_free (my allowAllWordsEndingIn); my allowAllWordsEndingIn = Melder_wcsdup_f (GET_STRING (L"Allow all words ending in"));
+		Melder_free (my forbiddenStrings); my forbiddenStrings = Melder_dup_f (GET_STRING (U"Forbidden strings"));
+		my checkMatchingParentheses = GET_INTEGER (U"Check matching parentheses");
+		Melder_free (my separatingCharacters); my separatingCharacters = Melder_dup_f (GET_STRING (U"Separating characters"));
+		my allowAllParenthesized = GET_INTEGER (U"Allow all parenthesized");
+		my allowAllNames = GET_INTEGER (U"Allow all names");
+		Melder_free (my namePrefixes); my namePrefixes = Melder_dup_f (GET_STRING (U"Name prefixes"));
+		my allowAllAbbreviations = GET_INTEGER (U"Allow all abbreviations");
+		my allowCapsSentenceInitially = GET_INTEGER (U"Allow caps sentence-initially");
+		my allowCapsAfterColon = GET_INTEGER (U"Allow caps after colon");
+		Melder_free (my allowAllWordsContaining); my allowAllWordsContaining = Melder_dup_f (GET_STRING (U"Allow all words containing"));
+		Melder_free (my allowAllWordsStartingWith); my allowAllWordsStartingWith = Melder_dup_f (GET_STRING (U"Allow all words starting with"));
+		Melder_free (my allowAllWordsEndingIn); my allowAllWordsEndingIn = Melder_dup_f (GET_STRING (U"Allow all words ending in"));
 		praat_dataChanged (me);
 	}
 END2 }
@@ -684,30 +686,30 @@ DIRECT2 (SpellingChecker_extractUserDictionary) {
 	}
 END2 }
 
-FORM (SpellingChecker_isWordAllowed, L"Is word allowed?", L"SpellingChecker") {
-	SENTENCE (L"Word", L"")
+FORM (SpellingChecker_isWordAllowed, U"Is word allowed?", U"SpellingChecker") {
+	SENTENCE (U"Word", U"")
 	OK2
 DO
 	LOOP {
 		iam (SpellingChecker);
-		bool isWordAllowed = SpellingChecker_isWordAllowed (me, GET_STRING (L"Word"));
-		Melder_information (isWordAllowed ? L"1 (allowed)" : L"0 (not allowed)");
+		bool isWordAllowed = SpellingChecker_isWordAllowed (me, GET_STRING (U"Word"));
+		Melder_information (isWordAllowed ? U"1 (allowed)" : U"0 (not allowed)");
 	}
 END2 }
 
-FORM (SpellingChecker_nextNotAllowedWord, L"Next not allowed word?", L"SpellingChecker") {
-	LABEL (L"", L"Sentence:")
-	TEXTFIELD (L"sentence", L"")
-	INTEGER (L"Starting character", L"0")
+FORM (SpellingChecker_nextNotAllowedWord, U"Next not allowed word?", U"SpellingChecker") {
+	LABEL (U"", U"Sentence:")
+	TEXTFIELD (U"sentence", U"")
+	INTEGER (U"Starting character", U"0")
 	OK2
 DO
 	LOOP {
 		iam (SpellingChecker);
-		wchar_t *sentence = GET_STRING (L"sentence");
-		long startingCharacter = GET_INTEGER (L"Starting character");
-		if (startingCharacter < 0) Melder_throw ("Starting character should be 0 or positive.");
-		if (startingCharacter > (int) wcslen (sentence)) Melder_throw ("Starting character should not exceed end of sentence.");
-		wchar_t *nextNotAllowedWord = SpellingChecker_nextNotAllowedWord (me, sentence, & startingCharacter);
+		char32 *sentence = GET_STRING (U"sentence");
+		long startingCharacter = GET_INTEGER (U"Starting character");
+		if (startingCharacter < 0) Melder_throw (U"Starting character should be 0 or positive.");
+		if (startingCharacter > (int) str32len (sentence)) Melder_throw (U"Starting character should not exceed end of sentence.");
+		char32 *nextNotAllowedWord = SpellingChecker_nextNotAllowedWord (me, sentence, & startingCharacter);
 		Melder_information (nextNotAllowedWord);
 	}
 END2 }
@@ -724,9 +726,9 @@ DIRECT2 (SpellingChecker_replaceWordList) {
 END2 }
 
 DIRECT2 (SpellingChecker_replaceWordList_help) {
-	Melder_information (L"To replace the checker's word list\nby the contents of a Strings object:\n"
-		"1. select the Strings;\n2. convert to a WordList object;\n3. select the SpellingChecker and the WordList;\n"
-		"4. choose Replace.");
+	Melder_information (U"To replace the checker's word list\nby the contents of a Strings object:\n"
+		U"1. select the Strings;\n2. convert to a WordList object;\n3. select the SpellingChecker and the WordList;\n"
+		U"4. choose Replace.");
 END2 }
 
 DIRECT2 (SpellingChecker_replaceUserDictionary) {
@@ -741,60 +743,90 @@ END2 }
 
 /***** TEXTGRID *****/
 
-FORM (TextGrid_countLabels, L"Count labels", L"TextGrid: Count labels...") {
-	INTEGER (STRING_TIER_NUMBER, L"1")
-	SENTENCE (L"Label text", L"a")
+FORM (TextGrid_countIntervalsWhere, U"Count intervals", U"TextGrid: Count intervals where...") {
+	INTEGER (STRING_TIER_NUMBER, U"1")
+	OPTIONMENU_ENUM (U"Count intervals whose label", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
 	OK2
 DO
+	const char32 *text = GET_STRING (U"...the text");
 	LOOP {
 		iam (TextGrid);
-		long numberOfLabels = TextGrid_countLabels (me, GET_INTEGER (STRING_TIER_NUMBER), GET_STRING (L"Label text"));
-		Melder_information (Melder_integer (numberOfLabels), L" labels");
+		long numberOfLabels = TextGrid_countIntervalsWhere (me, GET_INTEGER (STRING_TIER_NUMBER),
+			GET_ENUM (kMelder_string, U"Count intervals whose label"), text);
+		Melder_information (numberOfLabels, U" intervals");
 	}
 END2 }
 
-FORM (TextGrid_downto_Table, L"TextGrid: Down to Table", 0) {
-	BOOLEAN (L"Include line number", false)
-	NATURAL (L"Time decimals", L"6")
-	BOOLEAN (L"Include tier names", true)
-	BOOLEAN (L"Include empty intervals", false)
+FORM (TextGrid_countLabels, U"Count labels", U"TextGrid: Count labels...") {
+	INTEGER (STRING_TIER_NUMBER, U"1")
+	SENTENCE (U"Label text", U"a")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		autoTable thee = TextGrid_downto_Table (me, GET_INTEGER (L"Include line number"), GET_INTEGER (L"Time decimals"),
-			GET_INTEGER (L"Include tier names"), GET_INTEGER (L"Include empty intervals"));
+		long numberOfLabels = TextGrid_countLabels (me, GET_INTEGER (STRING_TIER_NUMBER), GET_STRING (U"Label text"));
+		Melder_information (numberOfLabels, U" labels");
+	}
+END2 }
+
+FORM (TextGrid_countPointsWhere, U"Count points", U"TextGrid: Count points where...") {
+	INTEGER (STRING_TIER_NUMBER, U"1")
+	OPTIONMENU_ENUM (U"Count points whose label", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
+	OK2
+DO
+	const char32 *text = GET_STRING (U"...the text");
+	LOOP {
+		iam (TextGrid);
+		long numberOfLabels = TextGrid_countPointsWhere (me, GET_INTEGER (STRING_TIER_NUMBER),
+			GET_ENUM (kMelder_string, U"Count points whose label"), text);
+		Melder_information (numberOfLabels, U" points");
+	}
+END2 }
+
+FORM (TextGrid_downto_Table, U"TextGrid: Down to Table", 0) {
+	BOOLEAN (U"Include line number", false)
+	NATURAL (U"Time decimals", U"6")
+	BOOLEAN (U"Include tier names", true)
+	BOOLEAN (U"Include empty intervals", false)
+	OK2
+DO
+	LOOP {
+		iam (TextGrid);
+		autoTable thee = TextGrid_downto_Table (me, GET_INTEGER (U"Include line number"), GET_INTEGER (U"Time decimals"),
+			GET_INTEGER (U"Include tier names"), GET_INTEGER (U"Include empty intervals"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (TextGrid_draw, L"TextGrid: Draw", 0) {
+FORM (TextGrid_draw, U"TextGrid: Draw", 0) {
 	praat_dia_timeRange (dia);
-	BOOLEAN (L"Show boundaries", 1)
-	BOOLEAN (L"Use text styles", 1)
-	BOOLEAN (L"Garnish", 1)
+	BOOLEAN (U"Show boundaries", 1)
+	BOOLEAN (U"Use text styles", 1)
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TextGrid);
 		TextGrid_Sound_draw (me, NULL, GRAPHICS,
-			GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Show boundaries"),
-			GET_INTEGER (L"Use text styles"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Show boundaries"),
+			GET_INTEGER (U"Use text styles"), GET_INTEGER (U"Garnish"));
 	}
 END2 }
 
-FORM (TextGrid_duplicateTier, L"TextGrid: Duplicate tier", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (L"Position", L"1 (= at top)")
-	WORD (L"Name", L"")
+FORM (TextGrid_duplicateTier, U"TextGrid: Duplicate tier", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (U"Position", U"1 (= at top)")
+	WORD (U"Name", U"")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
 		int itier = GET_INTEGER (STRING_TIER_NUMBER);
-		int position = GET_INTEGER (L"Position");
-		const wchar_t *name = GET_STRING (L"Name");
+		int position = GET_INTEGER (U"Position");
+		const char32 *name = GET_STRING (U"Name");
 		if (itier > my tiers -> size) itier = my tiers -> size;
 		autoAnyTier newTier = Data_copy ((AnyTier) my tiers -> item [itier]);
 		Thing_setName (newTier.peek(), name);
@@ -803,16 +835,16 @@ DO
 	}
 END2 }
 
-static void cb_TextGridEditor_publication (Editor editor, void *closure, Data publication) {
+static void cb_TextGridEditor_publication (Editor editor, void *closure, Daata publication) {
 	(void) editor;
 	(void) closure;
 	/*
 	 * Keep the gate for error handling.
 	 */
 	try {
-		praat_new (publication, NULL);
+		praat_new (publication);
 		praat_updateSelection ();
-		if (Thing_member (publication, classSpectrum) && wcsequ (Thing_getName (publication), L"slice")) {
+		if (Thing_isa (publication, classSpectrum) && str32equ (Thing_getName (publication), U"slice")) {
 			int IOBJECT;
 			LOOP {
 				iam (Spectrum);
@@ -821,11 +853,11 @@ static void cb_TextGridEditor_publication (Editor editor, void *closure, Data pu
 			}
 		}
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 }
 DIRECT2 (TextGrid_edit) {
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a TextGrid from batch.");
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a TextGrid from batch.");
 	Sound sound = NULL;
 	LOOP {
 		if (CLASS == classSound) sound = (Sound) OBJECT;   // may stay NULL
@@ -833,30 +865,30 @@ DIRECT2 (TextGrid_edit) {
 	LOOP if (CLASS == classTextGrid) {
 		iam (TextGrid);
 		autoTextGridEditor editor = TextGridEditor_create (ID_AND_FULL_NAME, me, sound, true, NULL, NULL);
-		editor -> setPublicationCallback (cb_TextGridEditor_publication, NULL);
+		Editor_setPublicationCallback (editor.peek(), cb_TextGridEditor_publication, NULL);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
 END2 }
 
-FORM (TextGrid_editWithCallback, L"TextGrid: View & Edit with callback", 0) {
-	SENTENCE (L"Callback text", L"r1")
+FORM (TextGrid_editWithCallback, U"TextGrid: View & Edit with callback", 0) {
+	SENTENCE (U"Callback text", U"r1")
 	OK2
 DO
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a TextGrid from batch.");
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a TextGrid from batch.");
 	Sound sound = NULL;
 	LOOP {
 		if (CLASS == classSound) sound = (Sound) OBJECT;   // may stay NULL
 	}
 	LOOP if (CLASS == classTextGrid) {
 		iam (TextGrid);
-		autoTextGridEditor editor = TextGridEditor_create (ID_AND_FULL_NAME, me, sound, true, NULL, Melder_peekWcsToUtf8 (GET_STRING (L"Callback text")));
-		editor -> setPublicationCallback (cb_TextGridEditor_publication, NULL);
+		autoTextGridEditor editor = TextGridEditor_create (ID_AND_FULL_NAME, me, sound, true, NULL, Melder_peek32to8 (GET_STRING (U"Callback text")));
+		Editor_setPublicationCallback (editor.peek(), cb_TextGridEditor_publication, NULL);
 		praat_installEditor (editor.transfer(), IOBJECT);
 	}
 END2 }
 
 DIRECT2 (TextGrid_LongSound_edit) {
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a TextGrid from batch.");
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a TextGrid from batch.");
 	LongSound longSound = NULL;
 	int ilongSound = 0;
 	LOOP {
@@ -866,13 +898,13 @@ DIRECT2 (TextGrid_LongSound_edit) {
 	LOOP if (CLASS == classTextGrid) {
 		iam (TextGrid);
 		autoTextGridEditor editor = TextGridEditor_create (ID_AND_FULL_NAME, me, longSound, false, NULL, NULL);
-		editor -> setPublicationCallback (cb_TextGridEditor_publication, NULL);
+		Editor_setPublicationCallback (editor.peek(), cb_TextGridEditor_publication, NULL);
 		praat_installEditor2 (editor.transfer(), IOBJECT, ilongSound);
 	}
 END2 }
 
 DIRECT2 (TextGrid_SpellingChecker_edit) {
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a TextGrid from batch.");
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a TextGrid from batch.");
 	SpellingChecker spellingChecker = NULL;
 	int ispellingChecker = 0;
 	Sound sound = NULL;
@@ -889,7 +921,7 @@ DIRECT2 (TextGrid_SpellingChecker_edit) {
 END2 }
 
 DIRECT2 (TextGrid_LongSound_SpellingChecker_edit) {
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot view or edit a TextGrid from batch.");
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot view or edit a TextGrid from batch.");
 	LongSound longSound = NULL;
 	SpellingChecker spellingChecker = NULL;
 	int ilongSound = 0, ispellingChecker = 0;
@@ -905,70 +937,70 @@ DIRECT2 (TextGrid_LongSound_SpellingChecker_edit) {
 	}
 END2 }
 
-FORM (TextGrid_extractPart, L"TextGrid: Extract part", 0) {
-	REAL (L"left Time range (s)", L"0.0")
-	REAL (L"right Time range (s)", L"1.0")
-	BOOLEAN (L"Preserve times", 0)
+FORM (TextGrid_extractPart, U"TextGrid: Extract part", 0) {
+	REAL (U"left Time range (s)", U"0.0")
+	REAL (U"right Time range (s)", U"1.0")
+	BOOLEAN (U"Preserve times", 0)
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		autoTextGrid thee = TextGrid_extractPart (me, GET_REAL (L"left Time range"), GET_REAL (L"right Time range"), GET_INTEGER (L"Preserve times"));
-		praat_new (thee.transfer(), my name, L"_part");
+		autoTextGrid thee = TextGrid_extractPart (me, GET_REAL (U"left Time range"), GET_REAL (U"right Time range"), GET_INTEGER (U"Preserve times"));
+		praat_new (thee.transfer(), my name, U"_part");
 	}
 END2 }
 
-static Function pr_TextGrid_peekTier (Any dia) {
+static Function pr_TextGrid_peekTier (UiForm dia) {
 	int IOBJECT;
 	LOOP {
 		iam (TextGrid);
 		long tierNumber = GET_INTEGER (STRING_TIER_NUMBER);
 		if (tierNumber > my tiers -> size)
-			Melder_throw ("Tier number (", tierNumber, ") should not be larger than number of tiers (", my tiers -> size, ").");
+			Melder_throw (U"Tier number (", tierNumber, U") should not be larger than number of tiers (", my tiers -> size, U").");
 		return (Function) my tiers -> item [tierNumber];
 	}
 	return NULL;   // should not occur
 }
 
-static IntervalTier pr_TextGrid_peekIntervalTier (Any dia) {
+static IntervalTier pr_TextGrid_peekIntervalTier (UiForm dia) {
 	Function tier = pr_TextGrid_peekTier (dia);
-	if (tier -> classInfo != classIntervalTier) Melder_throw ("Tier should be interval tier.");
+	if (tier -> classInfo != classIntervalTier) Melder_throw (U"Tier should be interval tier.");
 	return (IntervalTier) tier;
 }
 
-static TextTier pr_TextGrid_peekTextTier (Any dia) {
+static TextTier pr_TextGrid_peekTextTier (UiForm dia) {
 	Function tier = pr_TextGrid_peekTier (dia);
 	if (! tier) return NULL;
-	if (tier -> classInfo != classTextTier) Melder_throw ("Tier should be point tier (TextTier).");
+	if (tier -> classInfo != classTextTier) Melder_throw (U"Tier should be point tier (TextTier).");
 	return (TextTier) tier;
 }
 
-static TextInterval pr_TextGrid_peekInterval (Any dia) {
+static TextInterval pr_TextGrid_peekInterval (UiForm dia) {
 	int intervalNumber = GET_INTEGER (STRING_INTERVAL_NUMBER);
 	IntervalTier intervalTier = pr_TextGrid_peekIntervalTier (dia);
-	if (intervalNumber > intervalTier -> intervals -> size) Melder_throw ("Interval number too large.");
+	if (intervalNumber > intervalTier -> intervals -> size) Melder_throw (U"Interval number too large.");
 	return (TextInterval) intervalTier -> intervals -> item [intervalNumber];
 }
 
-static TextPoint pr_TextGrid_peekPoint (Any dia) {	
+static TextPoint pr_TextGrid_peekPoint (UiForm dia) {	
 	long pointNumber = GET_INTEGER (STRING_POINT_NUMBER);
 	TextTier textTier = pr_TextGrid_peekTextTier (dia);
-	if (pointNumber > textTier -> points -> size) Melder_throw ("Point number too large.");
+	if (pointNumber > textTier -> points -> size) Melder_throw (U"Point number too large.");
 	return (TextPoint) textTier -> points -> item [pointNumber];
 }
 
-FORM (TextGrid_extractOneTier, L"TextGrid: Extract one tier", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_extractOneTier, U"TextGrid: Extract one tier", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
 	OK2
 DO
 	Function tier = pr_TextGrid_peekTier (dia);   // a reference
 	autoTextGrid grid = TextGrid_createWithoutTiers (1e30, -1e30);
-	TextGrid_addTier (grid.peek(), tier);   // no transfer of tier ownership, because a copy is made
+	TextGrid_addTier_copy (grid.peek(), tier);   // no transfer of tier ownership, because a copy is made
 	praat_new (grid.transfer(), tier -> name);
 END2 }
 
-FORM (TextGrid_extractTier, L"TextGrid: Extract tier", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_extractTier, U"TextGrid: Extract tier", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
 	OK2
 DO
 	Function tier = pr_TextGrid_peekTier (dia);
@@ -992,126 +1024,126 @@ DIRECT2 (TextGrid_nativize) {
 	}
 END2 }
 
-FORM (TextGrid_getHighIndexFromTime, L"Get high index", L"AnyTier: Get high index from time...") {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (TextGrid_getHighIndexFromTime, U"Get high index", U"AnyTier: Get high index from time...") {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	TextTier textTier = pr_TextGrid_peekTextTier (dia);
-	long highIndex = AnyTier_timeToHighIndex (textTier, GET_REAL (L"Time"));
-	Melder_information (Melder_integer (highIndex));
+	long highIndex = AnyTier_timeToHighIndex (textTier, GET_REAL (U"Time"));
+	Melder_information (highIndex);
 END2 }
 
-FORM (TextGrid_getHighIntervalAtTime, L"TextGrid: Get high interval at time", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (TextGrid_getHighIntervalAtTime, U"TextGrid: Get high interval at time", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	IntervalTier intervalTier = pr_TextGrid_peekIntervalTier (dia);
-	long index = IntervalTier_timeToLowIndex (intervalTier, GET_REAL (L"Time"));
-	Melder_information (Melder_integer (index));
+	long index = IntervalTier_timeToLowIndex (intervalTier, GET_REAL (U"Time"));
+	Melder_information (index);
 END2 }
 
-FORM (TextGrid_getIntervalBoundaryFromTime, L"TextGrid: Get interval boundary from time", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (TextGrid_getIntervalBoundaryFromTime, U"TextGrid: Get interval boundary from time", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	IntervalTier intervalTier = pr_TextGrid_peekIntervalTier (dia);
-	long index = IntervalTier_hasBoundary (intervalTier, GET_REAL (L"Time"));
-	Melder_information (Melder_integer (index));
+	long index = IntervalTier_hasBoundary (intervalTier, GET_REAL (U"Time"));
+	Melder_information (index);
 END2 }
 
-FORM (TextGrid_getIntervalEdgeFromTime, L"TextGrid: Get interval edge from time", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (TextGrid_getIntervalEdgeFromTime, U"TextGrid: Get interval edge from time", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	IntervalTier intervalTier = pr_TextGrid_peekIntervalTier (dia);
-	long index = IntervalTier_hasTime (intervalTier, GET_REAL (L"Time"));
-	Melder_information (Melder_integer (index));
+	long index = IntervalTier_hasTime (intervalTier, GET_REAL (U"Time"));
+	Melder_information (index);
 END2 }
 
-FORM (TextGrid_getLowIndexFromTime, L"Get low index", L"AnyTier: Get low index from time...") {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (TextGrid_getLowIndexFromTime, U"Get low index", U"AnyTier: Get low index from time...") {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	TextTier textTier = pr_TextGrid_peekTextTier (dia);
-	long lowIndex = AnyTier_timeToLowIndex (textTier, GET_REAL (L"Time"));
-	Melder_information (Melder_integer (lowIndex));
+	long lowIndex = AnyTier_timeToLowIndex (textTier, GET_REAL (U"Time"));
+	Melder_information (lowIndex);
 END2 }
 
-FORM (TextGrid_getLowIntervalAtTime, L"TextGrid: Get low interval at time", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (TextGrid_getLowIntervalAtTime, U"TextGrid: Get low interval at time", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	IntervalTier intervalTier = pr_TextGrid_peekIntervalTier (dia);
-	long index = IntervalTier_timeToHighIndex (intervalTier, GET_REAL (L"Time"));
-	Melder_information (Melder_integer (index));
+	long index = IntervalTier_timeToHighIndex (intervalTier, GET_REAL (U"Time"));
+	Melder_information (index);
 END2 }
 
-FORM (TextGrid_getNearestIndexFromTime, L"Get nearest index", L"AnyTier: Get nearest index from time...") {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (TextGrid_getNearestIndexFromTime, U"Get nearest index", U"AnyTier: Get nearest index from time...") {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	TextTier textTier = pr_TextGrid_peekTextTier (dia);
-	long nearestIndex = AnyTier_timeToNearestIndex (textTier, GET_REAL (L"Time"));
-	Melder_information (Melder_integer (nearestIndex));
+	long nearestIndex = AnyTier_timeToNearestIndex (textTier, GET_REAL (U"Time"));
+	Melder_information (nearestIndex);
 END2 }
 
-FORM (TextGrid_getIntervalAtTime, L"TextGrid: Get interval at time", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (TextGrid_getIntervalAtTime, U"TextGrid: Get interval at time", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	IntervalTier intervalTier = pr_TextGrid_peekIntervalTier (dia);
-	long index = IntervalTier_timeToIndex (intervalTier, GET_REAL (L"Time"));
-	Melder_information (Melder_integer (index));
+	long index = IntervalTier_timeToIndex (intervalTier, GET_REAL (U"Time"));
+	Melder_information (index);
 END2 }
 
-FORM (TextGrid_getNumberOfIntervals, L"TextGrid: Get number of intervals", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_getNumberOfIntervals, U"TextGrid: Get number of intervals", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
 	OK2
 DO
 	IntervalTier intervalTier = pr_TextGrid_peekIntervalTier (dia);
 	long numberOfIntervals = intervalTier -> intervals -> size;
-	Melder_information (Melder_integer (numberOfIntervals));
+	Melder_information (numberOfIntervals);
 END2 }
 
 DIRECT2 (TextGrid_getNumberOfTiers) {
 	LOOP {
 		iam (TextGrid);
 		long numberOfTiers = my tiers -> size;
-		Melder_information (Melder_integer (numberOfTiers));
+		Melder_information (numberOfTiers);
 	}
 END2 }
 
-FORM (TextGrid_getStartingPoint, L"TextGrid: Get start point", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (STRING_INTERVAL_NUMBER, L"1")
+FORM (TextGrid_getStartingPoint, U"TextGrid: Get starting point", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (STRING_INTERVAL_NUMBER, U"1")
 	OK2
 DO
 	TextInterval interval = pr_TextGrid_peekInterval (dia);
 	double startingPoint = interval -> xmin;
-	Melder_informationReal (startingPoint, L"seconds");
+	Melder_informationReal (startingPoint, U"seconds");
 END2 }
 
-FORM (TextGrid_getEndPoint, L"TextGrid: Get end point", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (STRING_INTERVAL_NUMBER, L"1")
+FORM (TextGrid_getEndPoint, U"TextGrid: Get end point", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (STRING_INTERVAL_NUMBER, U"1")
 	OK2
 DO
 	TextInterval interval = pr_TextGrid_peekInterval (dia);
 	double endPoint = interval -> xmax;
-	Melder_informationReal (endPoint, L"seconds");
+	Melder_informationReal (endPoint, U"seconds");
 END2 }
 
-FORM (TextGrid_getLabelOfInterval, L"TextGrid: Get label of interval", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (STRING_INTERVAL_NUMBER, L"1")
+FORM (TextGrid_getLabelOfInterval, U"TextGrid: Get label of interval", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (STRING_INTERVAL_NUMBER, U"1")
 	OK2
 DO
 	TextInterval interval = pr_TextGrid_peekInterval (dia);
@@ -1120,64 +1152,66 @@ DO
 	MelderInfo_close ();
 END2 }
 
-FORM (TextGrid_getNumberOfPoints, L"TextGrid: Get number of points", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_getNumberOfPoints, U"TextGrid: Get number of points", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
 	OK2
 DO
 	TextTier textTier = pr_TextGrid_peekTextTier (dia);
 	long numberOfPoints = textTier -> points -> size;
-	Melder_information (Melder_integer (numberOfPoints));
+	Melder_information (numberOfPoints);
 END2 }
 
-FORM (TextGrid_getTierName, L"TextGrid: Get tier name", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_getTierName, U"TextGrid: Get tier name", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
 	OK2
 DO
-	Data tier = pr_TextGrid_peekTier (dia);
+	Daata tier = pr_TextGrid_peekTier (dia);
 	Melder_information (tier -> name);
 END2 }
 
-FORM (TextGrid_getTimeOfPoint, L"TextGrid: Get time of point", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (STRING_POINT_NUMBER, L"1")
+FORM (TextGrid_getTimeOfPoint, U"TextGrid: Get time of point", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (STRING_POINT_NUMBER, U"1")
 	OK2
 DO
 	TextPoint point = pr_TextGrid_peekPoint (dia);
-	Melder_informationReal (point -> number, L"seconds");
+	Melder_informationReal (point -> number, U"seconds");
 END2 }
 
-FORM (TextGrid_getLabelOfPoint, L"TextGrid: Get label of point", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (STRING_POINT_NUMBER, L"1")
+FORM (TextGrid_getLabelOfPoint, U"TextGrid: Get label of point", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (STRING_POINT_NUMBER, U"1")
 	OK2
 DO
 	TextPoint point = pr_TextGrid_peekPoint (dia);
 	Melder_information (point -> mark);
 END2 }
 
-DIRECT2 (TextGrid_help) { Melder_help (L"TextGrid"); END2 }
+DIRECT2 (TextGrid_help) {
+	Melder_help (U"TextGrid");
+END2 }
 
-FORM (TextGrid_insertBoundary, L"TextGrid: Insert boundary", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (TextGrid_insertBoundary, U"TextGrid: Insert boundary", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		TextGrid_insertBoundary (me, GET_INTEGER (STRING_TIER_NUMBER), GET_REAL (L"Time"));
+		TextGrid_insertBoundary (me, GET_INTEGER (STRING_TIER_NUMBER), GET_REAL (U"Time"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TextGrid_insertIntervalTier, L"TextGrid: Insert interval tier", 0) {
-	NATURAL (L"Position", L"1 (= at top)")
-	WORD (L"Name", L"")
+FORM (TextGrid_insertIntervalTier, U"TextGrid: Insert interval tier", 0) {
+	NATURAL (U"Position", U"1 (= at top)")
+	WORD (U"Name", U"")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		int position = GET_INTEGER (L"Position");
-		wchar_t *name = GET_STRING (L"Name");
+		int position = GET_INTEGER (U"Position");
+		const char32 *name = GET_STRING (U"Name");
 		autoIntervalTier tier = IntervalTier_create (my xmin, my xmax);
 		if (position > my tiers -> size) position = my tiers -> size + 1;
 		Thing_setName (tier.peek(), name);
@@ -1186,29 +1220,29 @@ DO
 	}
 END2 }
 
-FORM (TextGrid_insertPoint, L"TextGrid: Insert point", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
-	LABEL (L"", L"Text:")
-	TEXTFIELD (L"text", L"")
+FORM (TextGrid_insertPoint, U"TextGrid: Insert point", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
+	LABEL (U"", U"Text:")
+	TEXTFIELD (U"text", U"")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		TextGrid_insertPoint (me, GET_INTEGER (STRING_TIER_NUMBER), GET_REAL (L"Time"), GET_STRING (L"text"));
+		TextGrid_insertPoint (me, GET_INTEGER (STRING_TIER_NUMBER), GET_REAL (U"Time"), GET_STRING (U"text"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TextGrid_insertPointTier, L"TextGrid: Insert point tier", 0) {
-	NATURAL (L"Position", L"1 (= at top)")
-	WORD (L"Name", L"")
+FORM (TextGrid_insertPointTier, U"TextGrid: Insert point tier", 0) {
+	NATURAL (U"Position", U"1 (= at top)")
+	WORD (U"Name", U"")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		int position = GET_INTEGER (L"Position");
-		wchar_t *name = GET_STRING (L"Name");
+		int position = GET_INTEGER (U"Position");
+		const char32 *name = GET_STRING (U"Name");
 		autoTextTier tier = TextTier_create (my xmin, my xmax);
 		if (position > my tiers -> size) position = my tiers -> size + 1;
 		Thing_setName (tier.peek(), name);
@@ -1217,161 +1251,161 @@ DO
 	}
 END2 }
 
-FORM (TextGrid_isIntervalTier, L"TextGrid: Is interval tier?", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_isIntervalTier, U"TextGrid: Is interval tier?", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
 	OK2
 DO
-	Data tier = pr_TextGrid_peekTier (dia);
+	Daata tier = pr_TextGrid_peekTier (dia);
 	if (tier -> classInfo == classIntervalTier) {
-		Melder_information (L"1 (yes, tier ", Melder_integer (GET_INTEGER (STRING_TIER_NUMBER)), L" is an interval tier)");
+		Melder_information (U"1 (yes, tier ", GET_INTEGER (STRING_TIER_NUMBER), U" is an interval tier)");
 	} else {
-		Melder_information (L"0 (no, tier ", Melder_integer (GET_INTEGER (STRING_TIER_NUMBER)), L" is a point tier)");
+		Melder_information (U"0 (no, tier ", GET_INTEGER (STRING_TIER_NUMBER), U" is a point tier)");
 	}
 END2 }
 
-FORM (TextGrid_list, L"TextGrid: List", 0) {
-	BOOLEAN (L"Include line number", false)
-	NATURAL (L"Time decimals", L"6")
-	BOOLEAN (L"Include tier names", true)
-	BOOLEAN (L"Include empty intervals", false)
+FORM (TextGrid_list, U"TextGrid: List", 0) {
+	BOOLEAN (U"Include line number", false)
+	NATURAL (U"Time decimals", U"6")
+	BOOLEAN (U"Include tier names", true)
+	BOOLEAN (U"Include empty intervals", false)
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		TextGrid_list (me, GET_INTEGER (L"Include line number"), GET_INTEGER (L"Time decimals"),
-			GET_INTEGER (L"Include tier names"), GET_INTEGER (L"Include empty intervals"));
+		TextGrid_list (me, GET_INTEGER (U"Include line number"), GET_INTEGER (U"Time decimals"),
+			GET_INTEGER (U"Include tier names"), GET_INTEGER (U"Include empty intervals"));
 	}
 END2 }
 
 DIRECT2 (TextGrids_concatenate) {
 	autoCollection textGrids = praat_getSelectedObjects ();
 	autoTextGrid thee = TextGrids_concatenate (textGrids.peek());
-	praat_new (thee.transfer(), L"chain");
+	praat_new (thee.transfer(), U"chain");
 END2 }
 
 DIRECT2 (TextGrids_merge) {
 	autoCollection textGrids = praat_getSelectedObjects ();
 	autoTextGrid thee = TextGrid_merge (textGrids.peek());
-	praat_new (thee.transfer(), L"merged");
+	praat_new (thee.transfer(), U"merged");
 END2 }
 
 DIRECT2 (info_TextGrid_Pitch_draw) {
-	Melder_information (L"You can draw a TextGrid together with a Pitch after selecting them both.");
+	Melder_information (U"You can draw a TextGrid together with a Pitch after selecting them both.");
 END2 }
 
-FORM (TextGrid_removeBoundaryAtTime, L"TextGrid: Remove boundary at time", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	REAL (L"Time (s)", L"0.5")
+FORM (TextGrid_removeBoundaryAtTime, U"TextGrid: Remove boundary at time", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	REAL (U"Time (s)", U"0.5")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		TextGrid_removeBoundaryAtTime (me, GET_INTEGER (STRING_TIER_NUMBER), GET_REAL (L"Time"));
+		TextGrid_removeBoundaryAtTime (me, GET_INTEGER (STRING_TIER_NUMBER), GET_REAL (U"Time"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TextGrid_getCentrePoints, L"TextGrid: Get centre points", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	OPTIONMENU_ENUM (L"Get centre points whose label", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"hi")
+FORM (TextGrid_getCentrePoints, U"TextGrid: Get centre points", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	OPTIONMENU_ENUM (U"Get centre points whose label", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
 	OK2
 DO
-	wchar_t *text = GET_STRING (L"...the text");
+	const char32 *text = GET_STRING (U"...the text");
 	LOOP {
 		iam (TextGrid);
 		autoPointProcess thee = TextGrid_getCentrePoints (me, GET_INTEGER (STRING_TIER_NUMBER),
-			GET_ENUM (kMelder_string, L"Get centre points whose label"), text);
-		praat_new (thee.transfer(), my name, L"_", text);
+			GET_ENUM (kMelder_string, U"Get centre points whose label"), text);
+		praat_new (thee.transfer(), my name, U"_", text);
 	}
 END2 }
 
-FORM (TextGrid_getEndPoints, L"TextGrid: Get end points", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	OPTIONMENU_ENUM (L"Get end points whose label", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"hi")
+FORM (TextGrid_getEndPoints, U"TextGrid: Get end points", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	OPTIONMENU_ENUM (U"Get end points whose label", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
 	OK2
 DO
-	wchar_t *text = GET_STRING (L"...the text");
+	const char32 *text = GET_STRING (U"...the text");
 	LOOP {
 		iam (TextGrid);
 		autoPointProcess thee = TextGrid_getEndPoints (me, GET_INTEGER (STRING_TIER_NUMBER),
-			GET_ENUM (kMelder_string, L"Get end points whose label"), text);
-		praat_new (thee.transfer(), my name, L"_", text);
+			GET_ENUM (kMelder_string, U"Get end points whose label"), text);
+		praat_new (thee.transfer(), my name, U"_", text);
 	}
 END2 }
 
-FORM (TextGrid_getStartingPoints, L"TextGrid: Get starting points", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	OPTIONMENU_ENUM (L"Get starting points whose label", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"hi")
+FORM (TextGrid_getStartingPoints, U"TextGrid: Get starting points", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	OPTIONMENU_ENUM (U"Get starting points whose label", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
 	OK2
 DO
-	wchar_t *text = GET_STRING (L"...the text");
+	const char32 *text = GET_STRING (U"...the text");
 	LOOP {
 		iam (TextGrid);
 		autoPointProcess thee = TextGrid_getStartingPoints (me, GET_INTEGER (STRING_TIER_NUMBER),
-			GET_ENUM (kMelder_string, L"Get starting points whose label"), text);
-		praat_new (thee.transfer(), my name, L"_", text);
+			GET_ENUM (kMelder_string, U"Get starting points whose label"), text);
+		praat_new (thee.transfer(), my name, U"_", text);
 	}
 END2 }
 
-FORM (TextGrid_getPoints, L"Get points", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	OPTIONMENU_ENUM (L"Get points whose label", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"hi")
+FORM (TextGrid_getPoints, U"Get points", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	OPTIONMENU_ENUM (U"Get points whose label", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
 	OK2
 DO
-	wchar_t *text = GET_STRING (L"...the text");
+	const char32 *text = GET_STRING (U"...the text");
 	LOOP {
 		iam (TextGrid);
 		autoPointProcess thee = TextGrid_getPoints (me, GET_INTEGER (STRING_TIER_NUMBER),
-			GET_ENUM (kMelder_string, L"Get points whose label"), text);
-		praat_new (thee.transfer(), my name, L"_", text);
+			GET_ENUM (kMelder_string, U"Get points whose label"), text);
+		praat_new (thee.transfer(), my name, U"_", text);
 	}
 END2 }
 
-FORM (TextGrid_getPoints_followed, L"Get points (followed)", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	OPTIONMENU_ENUM (L"Get points whose label", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"hi")
-	OPTIONMENU_ENUM (L"followed by a label that", kMelder_string, DEFAULT)
-	SENTENCE (L" ...the text", L"there")
+FORM (TextGrid_getPoints_followed, U"Get points (followed)", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	OPTIONMENU_ENUM (U"Get points whose label", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
+	OPTIONMENU_ENUM (U"followed by a label that", kMelder_string, DEFAULT)
+	SENTENCE (U" ...the text", U"there")
 	OK2
 DO
-	wchar_t *text = GET_STRING (L"...the text");
-	wchar_t *following = GET_STRING (L" ...the text");
+	const char32 *text = GET_STRING (U"...the text");
+	const char32 *following = GET_STRING (U" ...the text");
 	LOOP {
 		iam (TextGrid);
 		autoPointProcess thee = TextGrid_getPoints_followed (me, GET_INTEGER (STRING_TIER_NUMBER),
-			GET_ENUM (kMelder_string, L"Get points whose label"), text,
-			GET_ENUM (kMelder_string, L"followed by a label that"), following);
-		praat_new (thee.transfer(), my name, L"_", text);
+			GET_ENUM (kMelder_string, U"Get points whose label"), text,
+			GET_ENUM (kMelder_string, U"followed by a label that"), following);
+		praat_new (thee.transfer(), my name, U"_", text);
 	}
 END2 }
 
-FORM (TextGrid_getPoints_preceded, L"Get points (preceded)", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	OPTIONMENU_ENUM (L"Get points whose label", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"there")
-	OPTIONMENU_ENUM (L"preceded by a label that", kMelder_string, DEFAULT)
-	SENTENCE (L" ...the text", L"hi")
+FORM (TextGrid_getPoints_preceded, U"Get points (preceded)", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	OPTIONMENU_ENUM (U"Get points whose label", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"there")
+	OPTIONMENU_ENUM (U"preceded by a label that", kMelder_string, DEFAULT)
+	SENTENCE (U" ...the text", U"hi")
 	OK2
 DO
-	wchar_t *text = GET_STRING (L"...the text");
-	wchar_t *preceding = GET_STRING (L" ...the text");
+	const char32 *text = GET_STRING (U"...the text");
+	const char32 *preceding = GET_STRING (U" ...the text");
 	LOOP {
 		iam (TextGrid);
 		autoPointProcess thee = TextGrid_getPoints_preceded (me, GET_INTEGER (STRING_TIER_NUMBER),
-			GET_ENUM (kMelder_string, L"Get points whose label"), text,
-			GET_ENUM (kMelder_string, L"preceded by a label that"), preceding);
-		praat_new (thee.transfer(), my name, L"_", text);
+			GET_ENUM (kMelder_string, U"Get points whose label"), text,
+			GET_ENUM (kMelder_string, U"preceded by a label that"), preceding);
+		praat_new (thee.transfer(), my name, U"_", text);
 	}
 END2 }
 
-FORM (TextGrid_removeLeftBoundary, L"TextGrid: Remove left boundary", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (STRING_INTERVAL_NUMBER, L"2")
+FORM (TextGrid_removeLeftBoundary, U"TextGrid: Remove left boundary", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (STRING_INTERVAL_NUMBER, U"2")
 	OK2
 DO
 	long itier = GET_INTEGER (STRING_TIER_NUMBER);
@@ -1380,26 +1414,26 @@ DO
 		iam (TextGrid);
 		IntervalTier intervalTier;
 		if (itier > my tiers -> size)
-			Melder_throw ("You cannot remove a boundary from tier ", itier, " of ", me,
-				", because that TextGrid has only ", my tiers -> size, " tiers.");
+			Melder_throw (U"You cannot remove a boundary from tier ", itier, U" of ", me,
+				U", because that TextGrid has only ", my tiers -> size, U" tiers.");
 		intervalTier = (IntervalTier) my tiers -> item [itier];
 		if (intervalTier -> classInfo != classIntervalTier)
-			Melder_throw ("You cannot remove a boundary from tier ", itier, " of ", me,
-				", because that tier is a point tier instead of an interval tier.");
+			Melder_throw (U"You cannot remove a boundary from tier ", itier, U" of ", me,
+				U", because that tier is a point tier instead of an interval tier.");
 		if (iinterval > intervalTier -> intervals -> size)
-			Melder_throw ("You cannot remove a boundary from interval ", iinterval, " of tier ", itier, " of ", me,
-				", because that tier has only ", intervalTier -> intervals -> size, " intervals.");
+			Melder_throw (U"You cannot remove a boundary from interval ", iinterval, U" of tier ", itier, U" of ", me,
+				U", because that tier has only ", intervalTier -> intervals -> size, U" intervals.");
 		if (iinterval == 1)
-			Melder_throw ("You cannot remove the left boundary from interval 1 of tier ", itier, " of ", me,
-				", because this is at the left edge of the tier.");
+			Melder_throw (U"You cannot remove the left boundary from interval 1 of tier ", itier, U" of ", me,
+				U", because this is at the left edge of the tier.");
 		IntervalTier_removeLeftBoundary (intervalTier, iinterval);
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TextGrid_removePoint, L"TextGrid: Remove point", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (STRING_POINT_NUMBER, L"2")
+FORM (TextGrid_removePoint, U"TextGrid: Remove point", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (STRING_POINT_NUMBER, U"2")
 	OK2
 DO
 	long itier = GET_INTEGER (STRING_TIER_NUMBER);
@@ -1408,36 +1442,36 @@ DO
 		iam (TextGrid);
 		TextTier pointTier;
 		if (itier > my tiers -> size)
-			Melder_throw ("You cannot remove a point from tier ", itier, " of ", me,
-				", because that TextGrid has only ", my tiers -> size, " tiers.");
+			Melder_throw (U"You cannot remove a point from tier ", itier, U" of ", me,
+				U", because that TextGrid has only ", my tiers -> size, U" tiers.");
 		pointTier = (TextTier) my tiers -> item [itier];
 		if (pointTier -> classInfo != classTextTier)
-			Melder_throw ("You cannot remove a point from tier ", itier, " of ", me,
-				", because that tier is an interval tier instead of a point tier.");
+			Melder_throw (U"You cannot remove a point from tier ", itier, U" of ", me,
+				U", because that tier is an interval tier instead of a point tier.");
 		if (ipoint > pointTier -> points -> size)
-			Melder_throw ("You cannot remove point ", ipoint, " from tier ", itier, " of ", me,
-				", because that tier has only ", pointTier -> points -> size, " points.");
+			Melder_throw (U"You cannot remove point ", ipoint, U" from tier ", itier, U" of ", me,
+				U", because that tier has only ", pointTier -> points -> size, U" points.");
 		TextTier_removePoint (pointTier, ipoint);
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TextGrid_removePoints, L"Remove points", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	OPTIONMENU_ENUM (L"Remove every point whose label...", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"hi")
+FORM (TextGrid_removePoints, U"Remove points", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	OPTIONMENU_ENUM (U"Remove every point whose label...", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		my removePoints (GET_INTEGER (STRING_TIER_NUMBER), GET_ENUM (kMelder_string, L"Remove every point whose label..."), GET_STRING (L"...the text"));
+		TextGrid_removePoints (me, GET_INTEGER (STRING_TIER_NUMBER), GET_ENUM (kMelder_string, U"Remove every point whose label..."), GET_STRING (U"...the text"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TextGrid_removeRightBoundary, L"TextGrid: Remove right boundary", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (STRING_INTERVAL_NUMBER, L"1")
+FORM (TextGrid_removeRightBoundary, U"TextGrid: Remove right boundary", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (STRING_INTERVAL_NUMBER, U"1")
 	OK2
 DO
 	long itier = GET_INTEGER (STRING_TIER_NUMBER);
@@ -1446,32 +1480,32 @@ DO
 		iam (TextGrid);
 		IntervalTier intervalTier;
 		if (itier > my tiers -> size)
-			Melder_throw ("You cannot remove a boundary from tier ", itier, " of ", me,
-				", because that TextGrid has only ", my tiers -> size, " tiers.");
+			Melder_throw (U"You cannot remove a boundary from tier ", itier, U" of ", me,
+				U", because that TextGrid has only ", my tiers -> size, U" tiers.");
 		intervalTier = (IntervalTier) my tiers -> item [itier];
 		if (intervalTier -> classInfo != classIntervalTier)
-			Melder_throw ("You cannot remove a boundary from tier ", itier, " of ", me,
-				L", because that tier is a point tier instead of an interval tier.");
+			Melder_throw (U"You cannot remove a boundary from tier ", itier, U" of ", me,
+				U", because that tier is a point tier instead of an interval tier.");
 		if (iinterval > intervalTier -> intervals -> size)
-			Melder_throw ("You cannot remove a boundary from interval ", iinterval, " of tier ", itier, " of ", me,
-				", because that tier has only ", intervalTier -> intervals -> size, " intervals.");
+			Melder_throw (U"You cannot remove a boundary from interval ", iinterval, U" of tier ", itier, U" of ", me,
+				U", because that tier has only ", intervalTier -> intervals -> size, U" intervals.");
 		if (iinterval == intervalTier -> intervals -> size)
-			Melder_throw ("You cannot remove the right boundary from interval ", iinterval, " of tier ", itier, " of ", me,
-				", because this is at the right edge of the tier.");
+			Melder_throw (U"You cannot remove the right boundary from interval ", iinterval, U" of tier ", itier, U" of ", me,
+				U", because this is at the right edge of the tier.");
 		IntervalTier_removeLeftBoundary (intervalTier, iinterval + 1);
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TextGrid_removeTier, L"TextGrid: Remove tier", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
+FORM (TextGrid_removeTier, U"TextGrid: Remove tier", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
 		int itier = GET_INTEGER (STRING_TIER_NUMBER);
 		if (my tiers -> size <= 1)
-			Melder_throw (L"Sorry, I refuse to remove the last tier.");
+			Melder_throw (U"Sorry, I refuse to remove the last tier.");
 		if (itier > my tiers -> size) itier = my tiers -> size;
 		Collection_removeItem (my tiers, itier);
 		praat_dataChanged (me);
@@ -1479,43 +1513,43 @@ DO
 END2 }
 
 DIRECT2 (info_TextGrid_Sound_edit) {
-	Melder_information (L"To include a copy of a Sound in your TextGrid editor:\n"
-		"   select a TextGrid and a Sound, and click \"View & Edit\".");
+	Melder_information (U"To include a copy of a Sound in your TextGrid editor:\n"
+		U"   select a TextGrid and a Sound, and click \"View & Edit\".");
 END2 }
 
 DIRECT2 (info_TextGrid_Sound_draw) {
-	Melder_information (L"You can draw a TextGrid together with a Sound after selecting them both.");
+	Melder_information (U"You can draw a TextGrid together with a Sound after selecting them both.");
 END2 }
 
-FORM (TextGrid_setIntervalText, L"TextGrid: Set interval text", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (STRING_INTERVAL_NUMBER, L"1")
-	LABEL (L"", L"Text:")
-	TEXTFIELD (L"text", L"")
+FORM (TextGrid_setIntervalText, U"TextGrid: Set interval text", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (STRING_INTERVAL_NUMBER, U"1")
+	LABEL (U"", U"Text:")
+	TEXTFIELD (U"text", U"")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		TextGrid_setIntervalText (me, GET_INTEGER (STRING_TIER_NUMBER), GET_INTEGER (STRING_INTERVAL_NUMBER), GET_STRING (L"text"));
+		TextGrid_setIntervalText (me, GET_INTEGER (STRING_TIER_NUMBER), GET_INTEGER (STRING_INTERVAL_NUMBER), GET_STRING (U"text"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TextGrid_setPointText, L"TextGrid: Set point text", 0) {
-	NATURAL (STRING_TIER_NUMBER, L"1")
-	NATURAL (STRING_POINT_NUMBER, L"1")
-	LABEL (L"", L"Text:")
-	TEXTFIELD (L"text", L"")
+FORM (TextGrid_setPointText, U"TextGrid: Set point text", 0) {
+	NATURAL (STRING_TIER_NUMBER, U"1")
+	NATURAL (STRING_POINT_NUMBER, U"1")
+	LABEL (U"", U"Text:")
+	TEXTFIELD (U"text", U"")
 	OK2
 DO
 	LOOP {
 		iam (TextGrid);
-		TextGrid_setPointText (me, GET_INTEGER (STRING_TIER_NUMBER), GET_INTEGER (STRING_POINT_NUMBER), GET_STRING (L"text"));
+		TextGrid_setPointText (me, GET_INTEGER (STRING_TIER_NUMBER), GET_INTEGER (STRING_POINT_NUMBER), GET_STRING (U"text"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM_WRITE2 (TextGrid_writeToChronologicalTextFile, L"Text file", 0, 0) {
+FORM_WRITE2 (TextGrid_writeToChronologicalTextFile, U"Text file", 0, 0) {
 	LOOP {
 		iam (TextGrid);
 		TextGrid_writeToChronologicalTextFile (me, file);
@@ -1532,7 +1566,7 @@ DIRECT2 (TextGrid_AnyTier_append) {
 	autoTextGrid newGrid = Data_copy (oldGrid);
 	LOOP if (OBJECT != oldGrid) {
 		iam (AnyTier);
-		TextGrid_addTier (newGrid.peek(), me);
+		TextGrid_addTier_copy (newGrid.peek(), me);
 	}
 	praat_new (newGrid.transfer(), oldGrid -> name);
 END2 }
@@ -1552,14 +1586,14 @@ END2 }
 
 /***** TEXTTIER *****/
 
-FORM (TextTier_addPoint, L"TextTier: Add point", L"TextTier: Add point...") {
-	REAL (L"Time (s)", L"0.5")
-	SENTENCE (L"Text", L"")
+FORM (TextTier_addPoint, U"TextTier: Add point", U"TextTier: Add point...") {
+	REAL (U"Time (s)", U"0.5")
+	SENTENCE (U"Text", U"")
 	OK2
 DO
 	LOOP {
 		iam (TextTier);
-		TextTier_addPoint (me, GET_REAL (L"Time"), GET_STRING (L"Text"));
+		TextTier_addPoint (me, GET_REAL (U"Time"), GET_STRING (U"Text"));
 		praat_dataChanged (me);
 	}
 END2 }
@@ -1572,13 +1606,13 @@ DIRECT2 (TextTier_downto_PointProcess) {
 	}
 END2 }
 
-FORM (TextTier_downto_TableOfReal, L"TextTier: Down to TableOfReal", 0) {
-	SENTENCE (L"Label", L"")
+FORM (TextTier_downto_TableOfReal, U"TextTier: Down to TableOfReal", 0) {
+	SENTENCE (U"Label", U"")
 	OK2
 DO
 	LOOP {
 		iam (TextTier);
-		autoTableOfReal thee = TextTier_downto_TableOfReal (me, GET_STRING (L"Label"));
+		autoTableOfReal thee = TextTier_downto_TableOfReal (me, GET_STRING (U"Label"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
@@ -1591,42 +1625,44 @@ DIRECT2 (TextTier_downto_TableOfReal_any) {
 	}
 END2 }
 
-FORM (TextTier_getLabelOfPoint, L"Get label of point", 0) {
-	NATURAL (L"Point number", L"1")
+FORM (TextTier_getLabelOfPoint, U"Get label of point", 0) {
+	NATURAL (U"Point number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TextTier);
-		long ipoint = GET_INTEGER (L"Point number");
-		if (ipoint > my points -> size) Melder_throw ("No such point.");
+		long ipoint = GET_INTEGER (U"Point number");
+		if (ipoint > my points -> size) Melder_throw (U"No such point.");
 		TextPoint point = (TextPoint) my points -> item [ipoint];
 		Melder_information (point -> mark);
 	}
 END2 }
 
-FORM (TextTier_getPoints, L"Get points", 0) {
-	SENTENCE (L"Text", L"")
+FORM (TextTier_getPoints, U"Get points", 0) {
+	SENTENCE (U"Text", U"")
 	OK2
 DO
 	LOOP {
 		iam (TextTier);
-		autoPointProcess thee = TextTier_getPoints (me, GET_STRING (L"Text"));
-		praat_new (thee.transfer(), GET_STRING (L"Text"));
+		autoPointProcess thee = TextTier_getPoints (me, GET_STRING (U"Text"));
+		praat_new (thee.transfer(), GET_STRING (U"Text"));
 	}
 END2 }
 
-DIRECT2 (TextTier_help) { Melder_help (L"TextTier"); END2 }
+DIRECT2 (TextTier_help) {
+	Melder_help (U"TextTier");
+END2 }
 
 /***** WORDLIST *****/
 
-FORM (WordList_hasWord, L"Does word occur in list?", L"WordList") {
-	SENTENCE (L"Word", L"")
+FORM (WordList_hasWord, U"Does word occur in list?", U"WordList") {
+	SENTENCE (U"Word", U"")
 	OK2
 DO
 	LOOP {
 		iam (WordList);
-		bool hasWord = WordList_hasWord (me, GET_STRING (L"Word"));
-		Melder_information (hasWord ? L"1" : L"0");
+		bool hasWord = WordList_hasWord (me, GET_STRING (U"Word"));
+		Melder_information (hasWord ? U"1" : U"0");
 	}
 END2 }
 
@@ -1652,198 +1688,202 @@ void praat_TimeFunction_query_init (ClassInfo klas);
 void praat_TimeTier_query_init (ClassInfo klas);
 void praat_TimeTier_modify_init (ClassInfo klas);
 
-void praat_uvafon_TextGrid_init (void);
-void praat_uvafon_TextGrid_init (void) {
-	Thing_recognizeClassByOtherName (classTextTier, L"MarkTier");
+void praat_uvafon_TextGrid_init ();
+void praat_uvafon_TextGrid_init () {
+	Thing_recognizeClassByOtherName (classTextTier, U"MarkTier");
 
 	structTextGridEditor :: f_preferences ();
 
-	praat_addAction1 (classIntervalTier, 0, L"IntervalTier help", 0, 0, DO_IntervalTier_help);
-	praat_addAction1 (classIntervalTier, 1, L"Save as Xwaves label file...", 0, 0, DO_IntervalTier_writeToXwaves);
-	praat_addAction1 (classIntervalTier, 1, L"Write to Xwaves label file...", 0, praat_HIDDEN, DO_IntervalTier_writeToXwaves);
-	praat_addAction1 (classIntervalTier, 0, L"Collect", 0, 0, 0);
-	praat_addAction1 (classIntervalTier, 0, L"Into TextGrid", 0, 0, DO_AnyTier_into_TextGrid);
-	praat_addAction1 (classIntervalTier, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classIntervalTier, 0, L"Get starting points...", 0, 0, DO_IntervalTier_getStartingPoints);
-	praat_addAction1 (classIntervalTier, 0, L"Get centre points...", 0, 0, DO_IntervalTier_getCentrePoints);
-	praat_addAction1 (classIntervalTier, 0, L"Get end points...", 0, 0, DO_IntervalTier_getEndPoints);
-	praat_addAction1 (classIntervalTier, 0, L"Convert", 0, 0, 0);
-	praat_addAction1 (classIntervalTier, 0, L"Down to TableOfReal (any)", 0, 0, DO_IntervalTier_downto_TableOfReal_any);
-	praat_addAction1 (classIntervalTier, 0, L"Down to TableOfReal...", 0, 0, DO_IntervalTier_downto_TableOfReal);
-
-	praat_addAction1 (classLabel, 0, L"& Sound: To TextGrid?", 0, 0, DO_info_Label_Sound_to_TextGrid);
-
-	praat_addAction1 (classSpellingChecker, 1, L"View & Edit...", 0, praat_ATTRACTIVE, DO_SpellingChecker_edit);
-	praat_addAction1 (classSpellingChecker, 1, L"Edit...", 0, praat_HIDDEN, DO_SpellingChecker_edit);
-	praat_addAction1 (classSpellingChecker, 0, L"Query", 0, 0, 0);
-	praat_addAction1 (classSpellingChecker, 1, L"Is word allowed...", 0, 0, DO_SpellingChecker_isWordAllowed);
-	praat_addAction1 (classSpellingChecker, 1, L"Next not allowed word...", 0, 0, DO_SpellingChecker_nextNotAllowedWord);
-	praat_addAction1 (classSpellingChecker, 0, L"Modify", 0, 0, 0);
-	praat_addAction1 (classSpellingChecker, 0, L"Add new word...", 0, 0, DO_SpellingChecker_addNewWord);
-	praat_addAction1 (classSpellingChecker, 0, L"Analyze", 0, 0, 0);
-	praat_addAction1 (classSpellingChecker, 0, L"Extract WordList", 0, 0, DO_SpellingChecker_extractWordList);
-	praat_addAction1 (classSpellingChecker, 0, L"Extract user dictionary", 0, 0, DO_SpellingChecker_extractUserDictionary);
-
-	praat_addAction1 (classTextGrid, 0, L"TextGrid help", 0, 0, DO_TextGrid_help);
-	praat_addAction1 (classTextGrid, 1, L"Save as chronological text file...", 0, 0, DO_TextGrid_writeToChronologicalTextFile);
-	praat_addAction1 (classTextGrid, 1, L"Write to chronological text file...", 0, praat_HIDDEN, DO_TextGrid_writeToChronologicalTextFile);
-	praat_addAction1 (classTextGrid, 1, L"View & Edit alone", 0, 0, DO_TextGrid_edit);
-	praat_addAction1 (classTextGrid, 1, L"View & Edit", 0, praat_HIDDEN, DO_TextGrid_edit);
-	praat_addAction1 (classTextGrid, 1, L"Edit", 0, praat_HIDDEN, DO_TextGrid_edit);
-	praat_addAction1 (classTextGrid, 1, L"View & Edit with Sound?", 0, praat_ATTRACTIVE, DO_info_TextGrid_Sound_edit);
-	praat_addAction1 (classTextGrid, 0, L"Draw -", 0, 0, 0);
-	praat_addAction1 (classTextGrid, 0, L"Draw...", 0, 1, DO_TextGrid_draw);
-	praat_addAction1 (classTextGrid, 1, L"Draw with Sound?", 0, 1, DO_info_TextGrid_Sound_draw);
-	praat_addAction1 (classTextGrid, 1, L"Draw with Pitch?", 0, 1, DO_info_TextGrid_Pitch_draw);
-	praat_addAction1 (classTextGrid, 1, L"List...", 0, 0, DO_TextGrid_list);
-	praat_addAction1 (classTextGrid, 0, L"Down to Table...", 0, 0, DO_TextGrid_downto_Table);
-	praat_addAction1 (classTextGrid, 0, L"Query -", 0, 0, 0);
+	praat_addAction1 (classIntervalTier, 0, U"IntervalTier help", 0, 0, DO_IntervalTier_help);
+	praat_addAction1 (classIntervalTier, 1, U"Save as Xwaves label file...", 0, 0, DO_IntervalTier_writeToXwaves);
+	praat_addAction1 (classIntervalTier, 1, U"Write to Xwaves label file...", 0, praat_HIDDEN, DO_IntervalTier_writeToXwaves);
+	praat_addAction1 (classIntervalTier, 0, U"Collect", 0, 0, 0);
+	praat_addAction1 (classIntervalTier, 0, U"Into TextGrid", 0, 0, DO_AnyTier_into_TextGrid);
+	praat_addAction1 (classIntervalTier, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classIntervalTier, 0, U"Get starting points...", 0, 0, DO_IntervalTier_getStartingPoints);
+	praat_addAction1 (classIntervalTier, 0, U"Get centre points...", 0, 0, DO_IntervalTier_getCentrePoints);
+	praat_addAction1 (classIntervalTier, 0, U"Get end points...", 0, 0, DO_IntervalTier_getEndPoints);
+	praat_addAction1 (classIntervalTier, 0, U"Convert", 0, 0, 0);
+	praat_addAction1 (classIntervalTier, 0, U"Down to TableOfReal (any)", 0, 0, DO_IntervalTier_downto_TableOfReal_any);
+	praat_addAction1 (classIntervalTier, 0, U"Down to TableOfReal...", 0, 0, DO_IntervalTier_downto_TableOfReal);
+
+	praat_addAction1 (classLabel, 0, U"& Sound: To TextGrid?", 0, 0, DO_info_Label_Sound_to_TextGrid);
+
+	praat_addAction1 (classSpellingChecker, 1, U"View & Edit...", 0, praat_ATTRACTIVE, DO_SpellingChecker_edit);
+	praat_addAction1 (classSpellingChecker, 1, U"Edit...", 0, praat_HIDDEN, DO_SpellingChecker_edit);
+	praat_addAction1 (classSpellingChecker, 0, U"Query", 0, 0, 0);
+	praat_addAction1 (classSpellingChecker, 1, U"Is word allowed...", 0, 0, DO_SpellingChecker_isWordAllowed);
+	praat_addAction1 (classSpellingChecker, 1, U"Next not allowed word...", 0, 0, DO_SpellingChecker_nextNotAllowedWord);
+	praat_addAction1 (classSpellingChecker, 0, U"Modify", 0, 0, 0);
+	praat_addAction1 (classSpellingChecker, 0, U"Add new word...", 0, 0, DO_SpellingChecker_addNewWord);
+	praat_addAction1 (classSpellingChecker, 0, U"Analyze", 0, 0, 0);
+	praat_addAction1 (classSpellingChecker, 0, U"Extract WordList", 0, 0, DO_SpellingChecker_extractWordList);
+	praat_addAction1 (classSpellingChecker, 0, U"Extract user dictionary", 0, 0, DO_SpellingChecker_extractUserDictionary);
+
+	praat_addAction1 (classTextGrid, 0, U"TextGrid help", 0, 0, DO_TextGrid_help);
+	praat_addAction1 (classTextGrid, 1, U"Save as chronological text file...", 0, 0, DO_TextGrid_writeToChronologicalTextFile);
+	praat_addAction1 (classTextGrid, 1, U"Write to chronological text file...", 0, praat_HIDDEN, DO_TextGrid_writeToChronologicalTextFile);
+	praat_addAction1 (classTextGrid, 1, U"View & Edit alone", 0, 0, DO_TextGrid_edit);
+	praat_addAction1 (classTextGrid, 1, U"View & Edit", 0, praat_HIDDEN, DO_TextGrid_edit);
+	praat_addAction1 (classTextGrid, 1, U"Edit", 0, praat_HIDDEN, DO_TextGrid_edit);
+	praat_addAction1 (classTextGrid, 1, U"View & Edit with Sound?", 0, praat_ATTRACTIVE, DO_info_TextGrid_Sound_edit);
+	praat_addAction1 (classTextGrid, 0, U"Draw -", 0, 0, 0);
+	praat_addAction1 (classTextGrid, 0, U"Draw...", 0, 1, DO_TextGrid_draw);
+	praat_addAction1 (classTextGrid, 1, U"Draw with Sound?", 0, 1, DO_info_TextGrid_Sound_draw);
+	praat_addAction1 (classTextGrid, 1, U"Draw with Pitch?", 0, 1, DO_info_TextGrid_Pitch_draw);
+	praat_addAction1 (classTextGrid, 1, U"List...", 0, 0, DO_TextGrid_list);
+	praat_addAction1 (classTextGrid, 0, U"Down to Table...", 0, 0, DO_TextGrid_downto_Table);
+	praat_addAction1 (classTextGrid, 0, U"Query -", 0, 0, 0);
 		praat_TimeFunction_query_init (classTextGrid);
-		praat_addAction1 (classTextGrid, 1, L"-- query textgrid --", 0, 1, 0);
-		praat_addAction1 (classTextGrid, 1, L"Get number of tiers", 0, 1, DO_TextGrid_getNumberOfTiers);
-		praat_addAction1 (classTextGrid, 1, L"Get tier name...", 0, 1, DO_TextGrid_getTierName);
-		praat_addAction1 (classTextGrid, 1, L"Is interval tier...", 0, 1, DO_TextGrid_isIntervalTier);
-		praat_addAction1 (classTextGrid, 1, L"-- query tier --", 0, 1, 0);
-		praat_addAction1 (classTextGrid, 1, L"Query interval tier", 0, 1, 0);
-			praat_addAction1 (classTextGrid, 1, L"Get number of intervals...", 0, 2, DO_TextGrid_getNumberOfIntervals);
-			praat_addAction1 (classTextGrid, 1, L"Get start point...", 0, 2, DO_TextGrid_getStartingPoint);
-			praat_addAction1 (classTextGrid, 1, L"Get starting point...", 0, praat_HIDDEN + praat_DEPTH_2, DO_TextGrid_getStartingPoint);   // hidden 2008
-			praat_addAction1 (classTextGrid, 1, L"Get end point...", 0, 2, DO_TextGrid_getEndPoint);
-			praat_addAction1 (classTextGrid, 1, L"Get label of interval...", 0, 2, DO_TextGrid_getLabelOfInterval);
-			praat_addAction1 (classTextGrid, 1, L"-- query interval from time --", 0, 2, 0);
-			praat_addAction1 (classTextGrid, 1, L"Get interval at time...", 0, 2, DO_TextGrid_getIntervalAtTime);
-			praat_addAction1 (classTextGrid, 1, L"Get low interval at time...", 0, 2, DO_TextGrid_getLowIntervalAtTime);
-			praat_addAction1 (classTextGrid, 1, L"Get high interval at time...", 0, 2, DO_TextGrid_getHighIntervalAtTime);
-			praat_addAction1 (classTextGrid, 1, L"Get interval edge from time...", 0, 2, DO_TextGrid_getIntervalEdgeFromTime);
-			praat_addAction1 (classTextGrid, 1, L"Get interval boundary from time...", 0, 2, DO_TextGrid_getIntervalBoundaryFromTime);
-		praat_addAction1 (classTextGrid, 1, L"Query point tier", 0, 1, 0);
-			praat_addAction1 (classTextGrid, 1, L"Get number of points...", 0, 2, DO_TextGrid_getNumberOfPoints);
-			praat_addAction1 (classTextGrid, 1, L"Get time of point...", 0, 2, DO_TextGrid_getTimeOfPoint);
-			praat_addAction1 (classTextGrid, 1, L"Get label of point...", 0, 2, DO_TextGrid_getLabelOfPoint);
-			praat_addAction1 (classTextGrid, 1, L"-- query point from time --", 0, 2, 0);
-			praat_addAction1 (classTextGrid, 1, L"Get low index from time...", 0, 2, DO_TextGrid_getLowIndexFromTime);
-			praat_addAction1 (classTextGrid, 1, L"Get high index from time...", 0, 2, DO_TextGrid_getHighIndexFromTime);
-			praat_addAction1 (classTextGrid, 1, L"Get nearest index from time...", 0, 2, DO_TextGrid_getNearestIndexFromTime);
-		praat_addAction1 (classTextGrid, 1, L"-- query labels --", 0, 1, 0);
-		praat_addAction1 (classTextGrid, 1, L"Count labels...", 0, 1, DO_TextGrid_countLabels);
-	praat_addAction1 (classTextGrid, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classTextGrid, 0, L"Convert to backslash trigraphs", 0, 1, DO_TextGrid_genericize);
-		praat_addAction1 (classTextGrid, 0, L"Genericize", 0, praat_HIDDEN + praat_DEPTH_1, DO_TextGrid_genericize);   // hidden 2007
-		praat_addAction1 (classTextGrid, 0, L"Convert to Unicode", 0, 1, DO_TextGrid_nativize);
-		praat_addAction1 (classTextGrid, 0, L"Nativize", 0, praat_HIDDEN + praat_DEPTH_1, DO_TextGrid_nativize);   // hidden 2007
+		praat_addAction1 (classTextGrid, 1, U"-- query textgrid --", 0, 1, 0);
+		praat_addAction1 (classTextGrid, 1, U"Get number of tiers", 0, 1, DO_TextGrid_getNumberOfTiers);
+		praat_addAction1 (classTextGrid, 1, U"Get tier name...", 0, 1, DO_TextGrid_getTierName);
+		praat_addAction1 (classTextGrid, 1, U"Is interval tier...", 0, 1, DO_TextGrid_isIntervalTier);
+		praat_addAction1 (classTextGrid, 1, U"-- query tier --", 0, 1, 0);
+		praat_addAction1 (classTextGrid, 1, U"Query interval tier", 0, 1, 0);
+			praat_addAction1 (classTextGrid, 1, U"Get number of intervals...", 0, 2, DO_TextGrid_getNumberOfIntervals);
+			praat_addAction1 (classTextGrid, 1, U"Get starting point...", 0, 2, DO_TextGrid_getStartingPoint);
+			praat_addAction1 (classTextGrid, 1, U"Get start point...", 0, praat_HIDDEN + praat_DEPTH_2, DO_TextGrid_getStartingPoint);
+			praat_addAction1 (classTextGrid, 1, U"Get end point...", 0, 2, DO_TextGrid_getEndPoint);
+			praat_addAction1 (classTextGrid, 1, U"Get label of interval...", 0, 2, DO_TextGrid_getLabelOfInterval);
+			praat_addAction1 (classTextGrid, 1, U"-- query interval from time --", 0, 2, 0);
+			praat_addAction1 (classTextGrid, 1, U"Get interval at time...", 0, 2, DO_TextGrid_getIntervalAtTime);
+			praat_addAction1 (classTextGrid, 1, U"Get low interval at time...", 0, 2, DO_TextGrid_getLowIntervalAtTime);
+			praat_addAction1 (classTextGrid, 1, U"Get high interval at time...", 0, 2, DO_TextGrid_getHighIntervalAtTime);
+			praat_addAction1 (classTextGrid, 1, U"Get interval edge from time...", 0, 2, DO_TextGrid_getIntervalEdgeFromTime);
+			praat_addAction1 (classTextGrid, 1, U"Get interval boundary from time...", 0, 2, DO_TextGrid_getIntervalBoundaryFromTime);
+			praat_addAction1 (classTextGrid, 1, U"-- query interval labels --", 0, 2, 0);
+			praat_addAction1 (classTextGrid, 1, U"Count intervals where...", 0, 2, DO_TextGrid_countIntervalsWhere);
+		praat_addAction1 (classTextGrid, 1, U"Query point tier", 0, 1, 0);
+			praat_addAction1 (classTextGrid, 1, U"Get number of points...", 0, 2, DO_TextGrid_getNumberOfPoints);
+			praat_addAction1 (classTextGrid, 1, U"Get time of point...", 0, 2, DO_TextGrid_getTimeOfPoint);
+			praat_addAction1 (classTextGrid, 1, U"Get label of point...", 0, 2, DO_TextGrid_getLabelOfPoint);
+			praat_addAction1 (classTextGrid, 1, U"-- query point from time --", 0, 2, 0);
+			praat_addAction1 (classTextGrid, 1, U"Get low index from time...", 0, 2, DO_TextGrid_getLowIndexFromTime);
+			praat_addAction1 (classTextGrid, 1, U"Get high index from time...", 0, 2, DO_TextGrid_getHighIndexFromTime);
+			praat_addAction1 (classTextGrid, 1, U"Get nearest index from time...", 0, 2, DO_TextGrid_getNearestIndexFromTime);
+			praat_addAction1 (classTextGrid, 1, U"-- query point labels --", 0, 2, 0);
+			praat_addAction1 (classTextGrid, 1, U"Count points where...", 0, 2, DO_TextGrid_countPointsWhere);
+		praat_addAction1 (classTextGrid, 1, U"-- query labels --", 0, praat_HIDDEN + praat_DEPTH_1, 0);
+		praat_addAction1 (classTextGrid, 1, U"Count labels...", 0, praat_HIDDEN + praat_DEPTH_1, DO_TextGrid_countLabels);   // hidden 2015
+	praat_addAction1 (classTextGrid, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classTextGrid, 0, U"Convert to backslash trigraphs", 0, 1, DO_TextGrid_genericize);
+		praat_addAction1 (classTextGrid, 0, U"Genericize", 0, praat_HIDDEN + praat_DEPTH_1, DO_TextGrid_genericize);   // hidden 2007
+		praat_addAction1 (classTextGrid, 0, U"Convert to Unicode", 0, 1, DO_TextGrid_nativize);
+		praat_addAction1 (classTextGrid, 0, U"Nativize", 0, praat_HIDDEN + praat_DEPTH_1, DO_TextGrid_nativize);   // hidden 2007
 		praat_TimeFunction_modify_init (classTextGrid);
-		praat_addAction1 (classTextGrid, 0, L"-- modify tiers --", 0, 1, 0);
-		praat_addAction1 (classTextGrid, 0, L"Insert interval tier...", 0, 1, DO_TextGrid_insertIntervalTier);
-		praat_addAction1 (classTextGrid, 0, L"Insert point tier...", 0, 1, DO_TextGrid_insertPointTier);
-		praat_addAction1 (classTextGrid, 0, L"Duplicate tier...", 0, 1, DO_TextGrid_duplicateTier);
-		praat_addAction1 (classTextGrid, 0, L"Remove tier...", 0, 1, DO_TextGrid_removeTier);
-		praat_addAction1 (classTextGrid, 1, L"-- modify tier --", 0, 1, 0);
-		praat_addAction1 (classTextGrid, 0, L"Modify interval tier", 0, 1, 0);
-			praat_addAction1 (classTextGrid, 0, L"Insert boundary...", 0, 2, DO_TextGrid_insertBoundary);
-			praat_addAction1 (classTextGrid, 0, L"Remove left boundary...", 0, 2, DO_TextGrid_removeLeftBoundary);
-			praat_addAction1 (classTextGrid, 0, L"Remove right boundary...", 0, 2, DO_TextGrid_removeRightBoundary);
-			praat_addAction1 (classTextGrid, 0, L"Remove boundary at time...", 0, 2, DO_TextGrid_removeBoundaryAtTime);
-			praat_addAction1 (classTextGrid, 0, L"Set interval text...", 0, 2, DO_TextGrid_setIntervalText);
-		praat_addAction1 (classTextGrid, 0, L"Modify point tier", 0, 1, 0);
-			praat_addAction1 (classTextGrid, 0, L"Insert point...", 0, 2, DO_TextGrid_insertPoint);
-			praat_addAction1 (classTextGrid, 0, L"Remove point...", 0, 2, DO_TextGrid_removePoint);
-			praat_addAction1 (classTextGrid, 0, L"Remove points...", 0, 2, DO_TextGrid_removePoints);
-			praat_addAction1 (classTextGrid, 0, L"Set point text...", 0, 2, DO_TextGrid_setPointText);
-praat_addAction1 (classTextGrid, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classTextGrid, 1, L"Extract one tier...", 0, 0, DO_TextGrid_extractOneTier);
-	praat_addAction1 (classTextGrid, 1, L"Extract tier...", 0, praat_HIDDEN, DO_TextGrid_extractTier);   // hidden 2010
-	praat_addAction1 (classTextGrid, 1, L"Extract part...", 0, 0, DO_TextGrid_extractPart);
-	praat_addAction1 (classTextGrid, 1, L"Analyse interval tier -", 0, 0, 0);
-		praat_addAction1 (classTextGrid, 1, L"Get starting points...", 0, 1, DO_TextGrid_getStartingPoints);
-		praat_addAction1 (classTextGrid, 1, L"Get end points...", 0, 1, DO_TextGrid_getEndPoints);
-		praat_addAction1 (classTextGrid, 1, L"Get centre points...", 0, 1, DO_TextGrid_getCentrePoints);
-	praat_addAction1 (classTextGrid, 1, L"Analyse point tier -", 0, 0, 0);
-		praat_addAction1 (classTextGrid, 1, L"Get points...", 0, 1, DO_TextGrid_getPoints);
-		praat_addAction1 (classTextGrid, 1, L"Get points (preceded)...", 0, 1, DO_TextGrid_getPoints_preceded);
-		praat_addAction1 (classTextGrid, 1, L"Get points (followed)...", 0, 1, DO_TextGrid_getPoints_followed);
-praat_addAction1 (classTextGrid, 0, L"Synthesize", 0, 0, 0);
-	praat_addAction1 (classTextGrid, 0, L"Merge", 0, 0, DO_TextGrids_merge);
-	praat_addAction1 (classTextGrid, 0, L"Concatenate", 0, 0, DO_TextGrids_concatenate);
-
-	praat_addAction1 (classTextTier, 0, L"TextTier help", 0, 0, DO_TextTier_help);
-	praat_addAction1 (classTextTier, 0, L"Query -", 0, 0, 0);
+		praat_addAction1 (classTextGrid, 0, U"-- modify tiers --", 0, 1, 0);
+		praat_addAction1 (classTextGrid, 0, U"Insert interval tier...", 0, 1, DO_TextGrid_insertIntervalTier);
+		praat_addAction1 (classTextGrid, 0, U"Insert point tier...", 0, 1, DO_TextGrid_insertPointTier);
+		praat_addAction1 (classTextGrid, 0, U"Duplicate tier...", 0, 1, DO_TextGrid_duplicateTier);
+		praat_addAction1 (classTextGrid, 0, U"Remove tier...", 0, 1, DO_TextGrid_removeTier);
+		praat_addAction1 (classTextGrid, 1, U"-- modify tier --", 0, 1, 0);
+		praat_addAction1 (classTextGrid, 0, U"Modify interval tier", 0, 1, 0);
+			praat_addAction1 (classTextGrid, 0, U"Insert boundary...", 0, 2, DO_TextGrid_insertBoundary);
+			praat_addAction1 (classTextGrid, 0, U"Remove left boundary...", 0, 2, DO_TextGrid_removeLeftBoundary);
+			praat_addAction1 (classTextGrid, 0, U"Remove right boundary...", 0, 2, DO_TextGrid_removeRightBoundary);
+			praat_addAction1 (classTextGrid, 0, U"Remove boundary at time...", 0, 2, DO_TextGrid_removeBoundaryAtTime);
+			praat_addAction1 (classTextGrid, 0, U"Set interval text...", 0, 2, DO_TextGrid_setIntervalText);
+		praat_addAction1 (classTextGrid, 0, U"Modify point tier", 0, 1, 0);
+			praat_addAction1 (classTextGrid, 0, U"Insert point...", 0, 2, DO_TextGrid_insertPoint);
+			praat_addAction1 (classTextGrid, 0, U"Remove point...", 0, 2, DO_TextGrid_removePoint);
+			praat_addAction1 (classTextGrid, 0, U"Remove points...", 0, 2, DO_TextGrid_removePoints);
+			praat_addAction1 (classTextGrid, 0, U"Set point text...", 0, 2, DO_TextGrid_setPointText);
+praat_addAction1 (classTextGrid, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classTextGrid, 1, U"Extract one tier...", 0, 0, DO_TextGrid_extractOneTier);
+	praat_addAction1 (classTextGrid, 1, U"Extract tier...", 0, praat_HIDDEN, DO_TextGrid_extractTier);   // hidden 2010
+	praat_addAction1 (classTextGrid, 1, U"Extract part...", 0, 0, DO_TextGrid_extractPart);
+	praat_addAction1 (classTextGrid, 1, U"Analyse interval tier -", 0, 0, 0);
+		praat_addAction1 (classTextGrid, 1, U"Get starting points...", 0, 1, DO_TextGrid_getStartingPoints);
+		praat_addAction1 (classTextGrid, 1, U"Get end points...", 0, 1, DO_TextGrid_getEndPoints);
+		praat_addAction1 (classTextGrid, 1, U"Get centre points...", 0, 1, DO_TextGrid_getCentrePoints);
+	praat_addAction1 (classTextGrid, 1, U"Analyse point tier -", 0, 0, 0);
+		praat_addAction1 (classTextGrid, 1, U"Get points...", 0, 1, DO_TextGrid_getPoints);
+		praat_addAction1 (classTextGrid, 1, U"Get points (preceded)...", 0, 1, DO_TextGrid_getPoints_preceded);
+		praat_addAction1 (classTextGrid, 1, U"Get points (followed)...", 0, 1, DO_TextGrid_getPoints_followed);
+praat_addAction1 (classTextGrid, 0, U"Synthesize", 0, 0, 0);
+	praat_addAction1 (classTextGrid, 0, U"Merge", 0, 0, DO_TextGrids_merge);
+	praat_addAction1 (classTextGrid, 0, U"Concatenate", 0, 0, DO_TextGrids_concatenate);
+
+	praat_addAction1 (classTextTier, 0, U"TextTier help", 0, 0, DO_TextTier_help);
+	praat_addAction1 (classTextTier, 0, U"Query -", 0, 0, 0);
 		praat_TimeTier_query_init (classTextTier);
-		praat_addAction1 (classTextTier, 0, L"Get label of point...", 0, 1, DO_TextTier_getLabelOfPoint);
-	praat_addAction1 (classTextTier, 0, L"Modify -", 0, 0, 0);
+		praat_addAction1 (classTextTier, 0, U"Get label of point...", 0, 1, DO_TextTier_getLabelOfPoint);
+	praat_addAction1 (classTextTier, 0, U"Modify -", 0, 0, 0);
 		praat_TimeTier_modify_init (classTextTier);
-		praat_addAction1 (classTextTier, 0, L"Add point...", 0, 1, DO_TextTier_addPoint);
-	praat_addAction1 (classTextTier, 0, L"Analyse", 0, 0, 0);
-	praat_addAction1 (classTextTier, 0, L"Get points...", 0, 0, DO_TextTier_getPoints);
-	praat_addAction1 (classTextTier, 0, L"Collect", 0, 0, 0);
-	praat_addAction1 (classTextTier, 0, L"Into TextGrid", 0, 0, DO_AnyTier_into_TextGrid);
-	praat_addAction1 (classTextTier, 0, L"Convert", 0, 0, 0);
-	praat_addAction1 (classTextTier, 0, L"Down to PointProcess", 0, 0, DO_TextTier_downto_PointProcess);
-	praat_addAction1 (classTextTier, 0, L"Down to TableOfReal (any)", 0, 0, DO_TextTier_downto_TableOfReal_any);
-	praat_addAction1 (classTextTier, 0, L"Down to TableOfReal...", 0, 0, DO_TextTier_downto_TableOfReal);
-
-	praat_addAction1 (classWordList, 0, L"Query", 0, 0, 0);
-		praat_addAction1 (classWordList, 1, L"Has word...", 0, 0, DO_WordList_hasWord);
-	praat_addAction1 (classWordList, 0, L"Analyze", 0, 0, 0);
-		praat_addAction1 (classWordList, 0, L"To Strings", 0, 0, DO_WordList_to_Strings);
-	praat_addAction1 (classWordList, 0, L"Synthesize", 0, 0, 0);
-		praat_addAction1 (classWordList, 0, L"Up to SpellingChecker", 0, 0, DO_WordList_upto_SpellingChecker);
-
-	praat_addAction2 (classIntervalTier, 1, classPointProcess, 1, L"Start to centre...", 0, 0, DO_IntervalTier_PointProcess_startToCentre);
-	praat_addAction2 (classIntervalTier, 1, classPointProcess, 1, L"End to centre...", 0, 0, DO_IntervalTier_PointProcess_endToCentre);
-	praat_addAction2 (classIntervalTier, 0, classTextTier, 0, L"Collect", 0, 0, 0);
-	praat_addAction2 (classIntervalTier, 0, classTextTier, 0, L"Into TextGrid", 0, 0, DO_AnyTier_into_TextGrid);
-	praat_addAction2 (classLabel, 1, classSound, 1, L"To TextGrid", 0, 0, DO_Label_Sound_to_TextGrid);
-	praat_addAction2 (classLongSound, 1, classTextGrid, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_TextGrid_LongSound_edit);
-	praat_addAction2 (classLongSound, 1, classTextGrid, 1, L"Edit", 0, praat_HIDDEN, DO_TextGrid_LongSound_edit);   // hidden 2011
-	praat_addAction2 (classLongSound, 1, classTextGrid, 1, L"Scale times", 0, 0, DO_TextGrid_LongSound_scaleTimes);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw -", 0, 0, 0);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw...", 0, 1, DO_TextGrid_Pitch_draw);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw logarithmic...", 0, 1, DO_TextGrid_Pitch_drawLogarithmic);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw semitones...", 0, 1, DO_TextGrid_Pitch_drawSemitones);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw mel...", 0, 1, DO_TextGrid_Pitch_drawMel);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw erb...", 0, 1, DO_TextGrid_Pitch_drawErb);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Speckle...", 0, 1, DO_TextGrid_Pitch_speckle);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Speckle logarithmic...", 0, 1, DO_TextGrid_Pitch_speckleLogarithmic);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Speckle semitones...", 0, 1, DO_TextGrid_Pitch_speckleSemitones);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Speckle mel...", 0, 1, DO_TextGrid_Pitch_speckleMel);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Speckle erb...", 0, 1, DO_TextGrid_Pitch_speckleErb);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"-- draw separately --", 0, 1, 0);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw separately...", 0, 1, DO_TextGrid_Pitch_drawSeparately);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw separately (logarithmic)...", 0, 1, DO_TextGrid_Pitch_drawSeparatelyLogarithmic);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw separately (semitones)...", 0, 1, DO_TextGrid_Pitch_drawSeparatelySemitones);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw separately (mel)...", 0, 1, DO_TextGrid_Pitch_drawSeparatelyMel);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Draw separately (erb)...", 0, 1, DO_TextGrid_Pitch_drawSeparatelyErb);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Speckle separately...", 0, 1, DO_TextGrid_Pitch_speckleSeparately);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Speckle separately (logarithmic)...", 0, 1, DO_TextGrid_Pitch_speckleSeparatelyLogarithmic);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Speckle separately (semitones)...", 0, 1, DO_TextGrid_Pitch_speckleSeparatelySemitones);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Speckle separately (mel)...", 0, 1, DO_TextGrid_Pitch_speckleSeparatelyMel);
-	praat_addAction2 (classPitch, 1, classTextGrid, 1, L"Speckle separately (erb)...", 0, 1, DO_TextGrid_Pitch_speckleSeparatelyErb);
-	praat_addAction2 (classPitch, 1, classTextTier, 1, L"To PitchTier...", 0, 0, DO_Pitch_TextTier_to_PitchTier);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_TextGrid_edit);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"View & Edit with callback...", 0, praat_HIDDEN, DO_TextGrid_editWithCallback);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Edit", 0, praat_HIDDEN, DO_TextGrid_edit);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Draw...", 0, 0, DO_TextGrid_Sound_draw);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Extract -", 0, 0, 0);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Extract all intervals...", 0, praat_DEPTH_1, DO_TextGrid_Sound_extractAllIntervals);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Extract non-empty intervals...", 0, praat_DEPTH_1, DO_TextGrid_Sound_extractNonemptyIntervals);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Extract intervals...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_TextGrid_Sound_extractIntervals);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Extract intervals where...", 0, praat_DEPTH_1, DO_TextGrid_Sound_extractIntervalsWhere);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Modify TextGrid", 0, 0, 0);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Scale times", 0, 0, DO_TextGrid_Sound_scaleTimes);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Modify Sound", 0, 0, 0);
-	praat_addAction2 (classSound, 1, classTextGrid, 1, L"Clone time domain", 0, 0, DO_TextGrid_Sound_cloneTimeDomain);
-	praat_addAction2 (classSpellingChecker, 1, classWordList, 1, L"Replace WordList", 0, 0, DO_SpellingChecker_replaceWordList);
-	praat_addAction2 (classSpellingChecker, 1, classSortedSetOfString, 1, L"Replace user dictionary", 0, 0, DO_SpellingChecker_replaceUserDictionary);
-	praat_addAction2 (classSpellingChecker, 1, classStrings, 1, L"Replace word list?", 0, 0, DO_SpellingChecker_replaceWordList_help);
-	praat_addAction2 (classSpellingChecker, 1, classTextGrid, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_TextGrid_SpellingChecker_edit);
-	praat_addAction2 (classSpellingChecker, 1, classTextGrid, 1, L"Edit", 0, praat_HIDDEN, DO_TextGrid_SpellingChecker_edit);   // hidden 2011
-	praat_addAction2 (classTextGrid, 1, classTextTier, 1, L"Append", 0, 0, DO_TextGrid_AnyTier_append);
-	praat_addAction2 (classTextGrid, 1, classIntervalTier, 1, L"Append", 0, 0, DO_TextGrid_AnyTier_append);
-
-	praat_addAction3 (classLongSound, 1, classSpellingChecker, 1, classTextGrid, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_TextGrid_LongSound_SpellingChecker_edit);
-	praat_addAction3 (classLongSound, 1, classSpellingChecker, 1, classTextGrid, 1, L"Edit", 0, praat_HIDDEN, DO_TextGrid_LongSound_SpellingChecker_edit);
-	praat_addAction3 (classSound, 1, classSpellingChecker, 1, classTextGrid, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_TextGrid_SpellingChecker_edit);
-	praat_addAction3 (classSound, 1, classSpellingChecker, 1, classTextGrid, 1, L"Edit", 0, praat_HIDDEN, DO_TextGrid_SpellingChecker_edit);
+		praat_addAction1 (classTextTier, 0, U"Add point...", 0, 1, DO_TextTier_addPoint);
+	praat_addAction1 (classTextTier, 0, U"Analyse", 0, 0, 0);
+	praat_addAction1 (classTextTier, 0, U"Get points...", 0, 0, DO_TextTier_getPoints);
+	praat_addAction1 (classTextTier, 0, U"Collect", 0, 0, 0);
+	praat_addAction1 (classTextTier, 0, U"Into TextGrid", 0, 0, DO_AnyTier_into_TextGrid);
+	praat_addAction1 (classTextTier, 0, U"Convert", 0, 0, 0);
+	praat_addAction1 (classTextTier, 0, U"Down to PointProcess", 0, 0, DO_TextTier_downto_PointProcess);
+	praat_addAction1 (classTextTier, 0, U"Down to TableOfReal (any)", 0, 0, DO_TextTier_downto_TableOfReal_any);
+	praat_addAction1 (classTextTier, 0, U"Down to TableOfReal...", 0, 0, DO_TextTier_downto_TableOfReal);
+
+	praat_addAction1 (classWordList, 0, U"Query", 0, 0, 0);
+		praat_addAction1 (classWordList, 1, U"Has word...", 0, 0, DO_WordList_hasWord);
+	praat_addAction1 (classWordList, 0, U"Analyze", 0, 0, 0);
+		praat_addAction1 (classWordList, 0, U"To Strings", 0, 0, DO_WordList_to_Strings);
+	praat_addAction1 (classWordList, 0, U"Synthesize", 0, 0, 0);
+		praat_addAction1 (classWordList, 0, U"Up to SpellingChecker", 0, 0, DO_WordList_upto_SpellingChecker);
+
+	praat_addAction2 (classIntervalTier, 1, classPointProcess, 1, U"Start to centre...", 0, 0, DO_IntervalTier_PointProcess_startToCentre);
+	praat_addAction2 (classIntervalTier, 1, classPointProcess, 1, U"End to centre...", 0, 0, DO_IntervalTier_PointProcess_endToCentre);
+	praat_addAction2 (classIntervalTier, 0, classTextTier, 0, U"Collect", 0, 0, 0);
+	praat_addAction2 (classIntervalTier, 0, classTextTier, 0, U"Into TextGrid", 0, 0, DO_AnyTier_into_TextGrid);
+	praat_addAction2 (classLabel, 1, classSound, 1, U"To TextGrid", 0, 0, DO_Label_Sound_to_TextGrid);
+	praat_addAction2 (classLongSound, 1, classTextGrid, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_TextGrid_LongSound_edit);
+	praat_addAction2 (classLongSound, 1, classTextGrid, 1, U"Edit", 0, praat_HIDDEN, DO_TextGrid_LongSound_edit);   // hidden 2011
+	praat_addAction2 (classLongSound, 1, classTextGrid, 1, U"Scale times", 0, 0, DO_TextGrid_LongSound_scaleTimes);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw -", 0, 0, 0);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw...", 0, 1, DO_TextGrid_Pitch_draw);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw logarithmic...", 0, 1, DO_TextGrid_Pitch_drawLogarithmic);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw semitones...", 0, 1, DO_TextGrid_Pitch_drawSemitones);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw mel...", 0, 1, DO_TextGrid_Pitch_drawMel);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw erb...", 0, 1, DO_TextGrid_Pitch_drawErb);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Speckle...", 0, 1, DO_TextGrid_Pitch_speckle);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Speckle logarithmic...", 0, 1, DO_TextGrid_Pitch_speckleLogarithmic);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Speckle semitones...", 0, 1, DO_TextGrid_Pitch_speckleSemitones);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Speckle mel...", 0, 1, DO_TextGrid_Pitch_speckleMel);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Speckle erb...", 0, 1, DO_TextGrid_Pitch_speckleErb);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"-- draw separately --", 0, 1, 0);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw separately...", 0, 1, DO_TextGrid_Pitch_drawSeparately);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw separately (logarithmic)...", 0, 1, DO_TextGrid_Pitch_drawSeparatelyLogarithmic);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw separately (semitones)...", 0, 1, DO_TextGrid_Pitch_drawSeparatelySemitones);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw separately (mel)...", 0, 1, DO_TextGrid_Pitch_drawSeparatelyMel);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Draw separately (erb)...", 0, 1, DO_TextGrid_Pitch_drawSeparatelyErb);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Speckle separately...", 0, 1, DO_TextGrid_Pitch_speckleSeparately);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Speckle separately (logarithmic)...", 0, 1, DO_TextGrid_Pitch_speckleSeparatelyLogarithmic);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Speckle separately (semitones)...", 0, 1, DO_TextGrid_Pitch_speckleSeparatelySemitones);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Speckle separately (mel)...", 0, 1, DO_TextGrid_Pitch_speckleSeparatelyMel);
+	praat_addAction2 (classPitch, 1, classTextGrid, 1, U"Speckle separately (erb)...", 0, 1, DO_TextGrid_Pitch_speckleSeparatelyErb);
+	praat_addAction2 (classPitch, 1, classTextTier, 1, U"To PitchTier...", 0, 0, DO_Pitch_TextTier_to_PitchTier);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_TextGrid_edit);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"View & Edit with callback...", 0, praat_HIDDEN, DO_TextGrid_editWithCallback);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Edit", 0, praat_HIDDEN, DO_TextGrid_edit);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Draw...", 0, 0, DO_TextGrid_Sound_draw);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Extract -", 0, 0, 0);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Extract all intervals...", 0, praat_DEPTH_1, DO_TextGrid_Sound_extractAllIntervals);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Extract non-empty intervals...", 0, praat_DEPTH_1, DO_TextGrid_Sound_extractNonemptyIntervals);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Extract intervals...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_TextGrid_Sound_extractIntervals);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Extract intervals where...", 0, praat_DEPTH_1, DO_TextGrid_Sound_extractIntervalsWhere);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Modify TextGrid", 0, 0, 0);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Scale times", 0, 0, DO_TextGrid_Sound_scaleTimes);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Modify Sound", 0, 0, 0);
+	praat_addAction2 (classSound, 1, classTextGrid, 1, U"Clone time domain", 0, 0, DO_TextGrid_Sound_cloneTimeDomain);
+	praat_addAction2 (classSpellingChecker, 1, classWordList, 1, U"Replace WordList", 0, 0, DO_SpellingChecker_replaceWordList);
+	praat_addAction2 (classSpellingChecker, 1, classSortedSetOfString, 1, U"Replace user dictionary", 0, 0, DO_SpellingChecker_replaceUserDictionary);
+	praat_addAction2 (classSpellingChecker, 1, classStrings, 1, U"Replace word list?", 0, 0, DO_SpellingChecker_replaceWordList_help);
+	praat_addAction2 (classSpellingChecker, 1, classTextGrid, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_TextGrid_SpellingChecker_edit);
+	praat_addAction2 (classSpellingChecker, 1, classTextGrid, 1, U"Edit", 0, praat_HIDDEN, DO_TextGrid_SpellingChecker_edit);   // hidden 2011
+	praat_addAction2 (classTextGrid, 1, classTextTier, 1, U"Append", 0, 0, DO_TextGrid_AnyTier_append);
+	praat_addAction2 (classTextGrid, 1, classIntervalTier, 1, U"Append", 0, 0, DO_TextGrid_AnyTier_append);
+
+	praat_addAction3 (classLongSound, 1, classSpellingChecker, 1, classTextGrid, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_TextGrid_LongSound_SpellingChecker_edit);
+	praat_addAction3 (classLongSound, 1, classSpellingChecker, 1, classTextGrid, 1, U"Edit", 0, praat_HIDDEN, DO_TextGrid_LongSound_SpellingChecker_edit);
+	praat_addAction3 (classSound, 1, classSpellingChecker, 1, classTextGrid, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_TextGrid_SpellingChecker_edit);
+	praat_addAction3 (classSound, 1, classSpellingChecker, 1, classTextGrid, 1, U"Edit", 0, praat_HIDDEN, DO_TextGrid_SpellingChecker_edit);
 }
 
 /* End of file praat_TextGrid_init.cpp */
diff --git a/gram/Network.cpp b/gram/Network.cpp
index b17e28c..5c0ce18 100644
--- a/gram/Network.cpp
+++ b/gram/Network.cpp
@@ -1,6 +1,6 @@
 /* Network.cpp
  *
- * Copyright (C) 2009-2012,2013,2014 Paul Boersma
+ * Copyright (C) 2009-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -56,21 +56,21 @@
 
 void structNetwork :: v_info ()
 {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Spreading rate: ", Melder_double (our spreadingRate));
-	MelderInfo_writeLine (L"Activity clipping rule: ", kNetwork_activityClippingRule_getText (our activityClippingRule));
-	MelderInfo_writeLine (L"Minimum activity: ", Melder_double (our minimumActivity));
-	MelderInfo_writeLine (L"Maximum activity: ", Melder_double (our maximumActivity));
-	MelderInfo_writeLine (L"Activity leak: ", Melder_double (our activityLeak));
-	MelderInfo_writeLine (L"Learning rate: ", Melder_double (our learningRate));
-	MelderInfo_writeLine (L"Minimum weight: ", Melder_double (our minimumWeight));
-	MelderInfo_writeLine (L"Maximum weight: ", Melder_double (our maximumWeight));
-	MelderInfo_writeLine (L"Weight leak: ", Melder_double (our weightLeak));
-	MelderInfo_writeLine (L"Number of nodes: ", Melder_integer (our numberOfNodes));
-	MelderInfo_writeLine (L"Number of connections: ", Melder_integer (our numberOfConnections));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Spreading rate: ", our spreadingRate);
+	MelderInfo_writeLine (U"Activity clipping rule: ", kNetwork_activityClippingRule_getText (our activityClippingRule));
+	MelderInfo_writeLine (U"Minimum activity: ", our minimumActivity);
+	MelderInfo_writeLine (U"Maximum activity: ", our maximumActivity);
+	MelderInfo_writeLine (U"Activity leak: ", our activityLeak);
+	MelderInfo_writeLine (U"Learning rate: ", our learningRate);
+	MelderInfo_writeLine (U"Minimum weight: ", our minimumWeight);
+	MelderInfo_writeLine (U"Maximum weight: ", our maximumWeight);
+	MelderInfo_writeLine (U"Weight leak: ", our weightLeak);
+	MelderInfo_writeLine (U"Number of nodes: ", our numberOfNodes);
+	MelderInfo_writeLine (U"Number of connections: ", our numberOfConnections);
 }
 
-Thing_implement (Network, Data, 6);
+Thing_implement (Network, Daata, 6);
 
 void Network_init (Network me, double spreadingRate, enum kNetwork_activityClippingRule activityClippingRule,
 	double minimumActivity, double maximumActivity, double activityLeak,
@@ -110,57 +110,57 @@ Network Network_create (double spreadingRate, enum kNetwork_activityClippingRule
 			xmin, xmax, ymin, ymax, numberOfNodes, numberOfConnections);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Network not created.");
+		Melder_throw (U"Network not created.");
 	}
 }
 
 double Network_getActivity (Network me, long nodeNumber) {
 	try {
 		if (nodeNumber <= 0 || nodeNumber > my numberOfNodes)
-			Melder_throw (me, ": node number (", nodeNumber, ") out of the range 1..", my numberOfNodes, ".");
+			Melder_throw (me, U": node number (", nodeNumber, U") out of the range 1..", my numberOfNodes, U".");
 		return my nodes [nodeNumber]. activity;
 	} catch (MelderError) {
-		Melder_throw (me, ": activity not gotten.");
+		Melder_throw (me, U": activity not gotten.");
 	}
 }
 
 void Network_setActivity (Network me, long nodeNumber, double activity) {
 	try {
 		if (nodeNumber <= 0 || nodeNumber > my numberOfNodes)
-			Melder_throw (me, ": node number (", nodeNumber, ") out of the range 1..", my numberOfNodes, ".");
+			Melder_throw (me, U": node number (", nodeNumber, U") out of the range 1..", my numberOfNodes, U".");
 		my nodes [nodeNumber]. activity = my nodes [nodeNumber]. excitation = activity;
 	} catch (MelderError) {
-		Melder_throw (me, ": activity not set.");
+		Melder_throw (me, U": activity not set.");
 	}
 }
 
 double Network_getWeight (Network me, long connectionNumber) {
 	try {
 		if (connectionNumber <= 0 || connectionNumber > my numberOfConnections)
-			Melder_throw (me, ": connection number (", connectionNumber, ") out of the range 1..", my numberOfConnections, ".");
+			Melder_throw (me, U": connection number (", connectionNumber, U") out of the range 1..", my numberOfConnections, U".");
 		return my connections [connectionNumber]. weight;
 	} catch (MelderError) {
-		Melder_throw (me, ": weight not gotten.");
+		Melder_throw (me, U": weight not gotten.");
 	}
 }
 
 void Network_setWeight (Network me, long connectionNumber, double weight) {
 	try {
 		if (connectionNumber <= 0 || connectionNumber > my numberOfConnections)
-			Melder_throw (me, ": connection number (", connectionNumber, ") out of the range 1..", my numberOfConnections, ".");
+			Melder_throw (me, U": connection number (", connectionNumber, U") out of the range 1..", my numberOfConnections, U".");
 		my connections [connectionNumber]. weight = weight;
 	} catch (MelderError) {
-		Melder_throw (me, ": weight not set.");
+		Melder_throw (me, U": weight not set.");
 	}
 }
 
 void Network_setClamping (Network me, long nodeNumber, bool clamped) {
 	try {
 		if (nodeNumber <= 0 || nodeNumber > my numberOfNodes)
-			Melder_throw (me, ": node number (", nodeNumber, ") out of the range 1..", my numberOfNodes, ".");
+			Melder_throw (me, U": node number (", nodeNumber, U") out of the range 1..", my numberOfNodes, U".");
 		my nodes [nodeNumber]. clamped = clamped;
 	} catch (MelderError) {
-		Melder_throw (me, ": clamping not set.");
+		Melder_throw (me, U": clamping not set.");
 	}
 }
 
@@ -204,7 +204,7 @@ void Network_spreadActivities (Network me, long numberOfSteps) {
 						} else {
 							node -> activity = my minimumActivity +
 								(my maximumActivity - my minimumActivity) * (2.0 * NUMsigmoid (2.0 * (node -> excitation - my minimumActivity) / (my maximumActivity - my minimumActivity)) - 1.0);
-							trace ("excitation %f, activity %f", node -> excitation, node -> activity);
+							trace (U"excitation ", node -> excitation, U", activity ", node -> activity);
 						}
 					break;
 				}
@@ -323,7 +323,7 @@ Network Network_create_rectangle (double spreadingRate, enum kNetwork_activityCl
 		Melder_assert (iconn == my numberOfConnections);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Rectangular network not created.");
+		Melder_throw (U"Rectangular network not created.");
 	}
 }
 
@@ -366,7 +366,7 @@ Network Network_create_rectangle_vertical (double spreadingRate, enum kNetwork_a
 		Melder_assert (iconn == my numberOfConnections);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Vertical rectangular network not created.");
+		Melder_throw (U"Vertical rectangular network not created.");
 	}
 }
 
@@ -439,7 +439,7 @@ void Network_addNode (Network me, double x, double y, double activity, bool clam
 		my nodes [my numberOfNodes]. activity = my nodes [my numberOfNodes]. excitation = activity;
 		my nodes [my numberOfNodes]. clamped = clamped;
 	} catch (MelderError) {
-		Melder_throw (me, ": node not added.");
+		Melder_throw (me, U": node not added.");
 	}
 }
 
@@ -451,7 +451,7 @@ void Network_addConnection (Network me, long nodeFrom, long nodeTo, double weigh
 		my connections [my numberOfConnections]. weight = weight;
 		my connections [my numberOfConnections]. plasticity = plasticity;
 	} catch (MelderError) {
-		Melder_throw (me, ": connection not added.");
+		Melder_throw (me, U": connection not added.");
 	}
 }
 
@@ -498,12 +498,12 @@ Table Network_nodes_downto_Table (Network me, long fromNodeNumber, long toNodeNu
 		autoTable thee = Table_createWithoutColumnNames (numberOfNodes,
 			includeNodeNumbers + includeX + includeY + includeClamped + includeActivity + includeExcitation);
 		long icol = 0;
-		if (includeNodeNumbers) Table_setColumnLabel (thee.peek(), ++ icol, L"node");
-		if (includeX)           Table_setColumnLabel (thee.peek(), ++ icol, L"x");
-		if (includeY)           Table_setColumnLabel (thee.peek(), ++ icol, L"y");
-		if (includeClamped)     Table_setColumnLabel (thee.peek(), ++ icol, L"clamped");
-		if (includeActivity)    Table_setColumnLabel (thee.peek(), ++ icol, L"activity");
-		if (includeExcitation)  Table_setColumnLabel (thee.peek(), ++ icol, L"excitation");
+		if (includeNodeNumbers) Table_setColumnLabel (thee.peek(), ++ icol, U"node");
+		if (includeX)           Table_setColumnLabel (thee.peek(), ++ icol, U"x");
+		if (includeY)           Table_setColumnLabel (thee.peek(), ++ icol, U"y");
+		if (includeClamped)     Table_setColumnLabel (thee.peek(), ++ icol, U"clamped");
+		if (includeActivity)    Table_setColumnLabel (thee.peek(), ++ icol, U"activity");
+		if (includeExcitation)  Table_setColumnLabel (thee.peek(), ++ icol, U"excitation");
 		for (long inode = fromNodeNumber; inode <= toNodeNumber; inode ++) {
 			NetworkNode node = & my nodes [inode];
 			icol = 0;
@@ -516,7 +516,7 @@ Table Network_nodes_downto_Table (Network me, long fromNodeNumber, long toNodeNu
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Table.");
+		Melder_throw (me, U": not converted to Table.");
 	}
 }
 
@@ -531,7 +531,7 @@ void Network_listNodes (Network me, long fromNodeNumber, long toNodeNumber,
 			includeX, includeY, positionDecimals, includeClamped, includeActivity, includeExcitation, activityDecimals);
 		Table_list (table.peek(), false);
 	} catch (MelderError) {
-		Melder_throw (me, ": not listed.");
+		Melder_throw (me, U": not listed.");
 	}
 }
 
diff --git a/gram/Network.h b/gram/Network.h
index 0e18e7f..bdba30e 100644
--- a/gram/Network.h
+++ b/gram/Network.h
@@ -24,7 +24,7 @@
 #include "Network_enums.h"
 
 #include "Network_def.h"
-oo_CLASS_CREATE (Network, Data);
+oo_CLASS_CREATE (Network, Daata);
 
 void Network_init (Network me,
 	double spreadingRate, enum kNetwork_activityClippingRule activityClippingRule,
diff --git a/gram/Network_def.h b/gram/Network_def.h
index 7173f64..dfa5fec 100644
--- a/gram/Network_def.h
+++ b/gram/Network_def.h
@@ -1,6 +1,6 @@
 /* Network_def.h
  *
- * Copyright (C) 2009-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 2009-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -43,7 +43,7 @@ oo_DEFINE_STRUCT (NetworkConnection)
 		oo_DOUBLE (plasticity)
 	oo_ENDFROM
 	#if oo_READING
-		if (localVersion < 1) {
+		if (formatVersion < 1) {
 			plasticity = 1.0;
 		}
 	#endif
@@ -53,7 +53,7 @@ oo_END_STRUCT (NetworkConnection)
 
 
 #define ooSTRUCT Network
-oo_DEFINE_CLASS (Network, Data)
+oo_DEFINE_CLASS (Network, Daata)
 
 	oo_DOUBLE (minimumActivity)
 	oo_DOUBLE (maximumActivity)
@@ -78,8 +78,8 @@ oo_DEFINE_CLASS (Network, Data)
 	oo_ENDFROM
 	oo_DOUBLE (weightLeak)
 	#if oo_READING
-		if (localVersion < 6) {
-			if (localVersion < 5) {
+		if (formatVersion < 6) {
+			if (formatVersion < 5) {
 				if (our learningRate != 0.0) our weightLeak /= our learningRate;
 				if (our dummyWeightUpdateRule == 1) our instar = 1.0, our outstar = 0.0;
 				if (our dummyWeightUpdateRule == 2) our instar = 0.0, our outstar = 1.0;
@@ -98,8 +98,8 @@ oo_DEFINE_CLASS (Network, Data)
 	oo_STRUCT_VECTOR (NetworkConnection, connections, numberOfConnections)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (Network)
diff --git a/gram/Network_enums.h b/gram/Network_enums.h
index b6a1704..41e36c5 100644
--- a/gram/Network_enums.h
+++ b/gram/Network_enums.h
@@ -1,6 +1,6 @@
 /* Network_enums.h
  *
- * Copyright (C) 2012 Paul Boersma
+ * Copyright (C) 2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,9 +18,9 @@
  */
 
 enums_begin (kNetwork_activityClippingRule, 0)
-	enums_add (kNetwork_activityClippingRule, 0, SIGMOID, L"sigmoid")
-	enums_add (kNetwork_activityClippingRule, 1, LINEAR, L"linear")
-	enums_add (kNetwork_activityClippingRule, 2, TOP_SIGMOID, L"top-sigmoid")
+	enums_add (kNetwork_activityClippingRule, 0, SIGMOID, U"sigmoid")
+	enums_add (kNetwork_activityClippingRule, 1, LINEAR, U"linear")
+	enums_add (kNetwork_activityClippingRule, 2, TOP_SIGMOID, U"top-sigmoid")
 enums_end (kNetwork_activityClippingRule, 2, LINEAR)
 
 /* End of file Network_enums.h */
diff --git a/gram/OTGrammar.cpp b/gram/OTGrammar.cpp
index 75ca576..cf06d69 100644
--- a/gram/OTGrammar.cpp
+++ b/gram/OTGrammar.cpp
@@ -1,6 +1,6 @@
 /* OTGrammar.cpp
  *
- * Copyright (C) 1997-2012,2014 Paul Boersma
+ * Copyright (C) 1997-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -51,7 +51,7 @@
  * pb 2007/06/21 made spreadsheet file readable as Table
  * pb 2007/07/24 leak and constraint plasticity
  * pb 2007/07/27 leak and constraint plasticity also written...
- * pb 2007/08/08 wchar_t
+ * pb 2007/08/08 wchar
  * pb 2007/10/01 can write as encoding
  * pb 2008/03/03 EDCD with vacation
  * pb 2008/03/07 Demote one with vacation
@@ -98,7 +98,7 @@
 
 void structOTGrammar :: v_info ()
 {
-	structData :: v_info ();
+	structDaata :: v_info ();
 	long numberOfCandidates = 0, numberOfViolations = 0;
 	for (long itab = 1; itab <= numberOfTableaus; itab ++) {
 		numberOfCandidates += tableaus [itab]. numberOfCandidates;
@@ -106,56 +106,56 @@ void structOTGrammar :: v_info ()
 			for (long icons = 1; icons <= numberOfConstraints; icons ++)
 				numberOfViolations += tableaus [itab]. candidates [icand]. marks [icons];
 	}
-	MelderInfo_writeLine (L"Decision strategy: ", kOTGrammar_decisionStrategy_getText (decisionStrategy));
-	MelderInfo_writeLine (L"Number of constraints: ", Melder_integer (numberOfConstraints));
-	MelderInfo_writeLine (L"Number of tableaus: ", Melder_integer (numberOfTableaus));
-	MelderInfo_writeLine (L"Number of candidates: ", Melder_integer (numberOfCandidates));
-	MelderInfo_writeLine (L"Number of violation marks: ", Melder_integer (numberOfViolations));
+	MelderInfo_writeLine (U"Decision strategy: ", kOTGrammar_decisionStrategy_getText (decisionStrategy));
+	MelderInfo_writeLine (U"Number of constraints: ", numberOfConstraints);
+	MelderInfo_writeLine (U"Number of tableaus: ", numberOfTableaus);
+	MelderInfo_writeLine (U"Number of candidates: ", numberOfCandidates);
+	MelderInfo_writeLine (U"Number of violation marks: ", numberOfViolations);
 }
 
 void structOTGrammar :: v_writeText (MelderFile file) {
-	MelderFile_write (file, L"\n<", kOTGrammar_decisionStrategy_getText (decisionStrategy),
-		L">\n", Melder_double (leak), L" ! leak\n", Melder_integer (numberOfConstraints), L" constraints");
+	MelderFile_write (file, U"\n<", kOTGrammar_decisionStrategy_getText (decisionStrategy),
+		U">\n", leak, U" ! leak\n", numberOfConstraints, U" constraints");
 	for (long icons = 1; icons <= numberOfConstraints; icons ++) {
 		OTGrammarConstraint constraint = & constraints [icons];
-		MelderFile_write (file, L"\nconstraint [", Melder_integer (icons), L"]: \"");
-		for (const wchar_t *p = & constraint -> name [0]; *p; p ++) {
-			if (*p =='\"') MelderFile_writeCharacter (file, '\"');   // Double any quotes within quotes.
+		MelderFile_write (file, U"\nconstraint [", icons, U"]: \"");
+		for (const char32 *p = & constraint -> name [0]; *p; p ++) {
+			if (*p == '\"') MelderFile_writeCharacter (file, U'\"');   // Double any quotes within quotes.
 			MelderFile_writeCharacter (file, *p);
 		}
-		MelderFile_write (file, L"\" ", Melder_double (constraint -> ranking),
-			L" ", Melder_double (constraint -> disharmony), L" ", Melder_double (constraint -> plasticity), L" ! ");
-		for (const wchar_t *p = & constraint -> name [0]; *p; p ++) {
-			if (*p == '\n') MelderFile_writeCharacter (file, ' ');
+		MelderFile_write (file, U"\" ", constraint -> ranking,
+			U" ", constraint -> disharmony, U" ", constraint -> plasticity, U" ! ");
+		for (const char32 *p = & constraint -> name [0]; *p; p ++) {
+			if (*p == '\n') MelderFile_writeCharacter (file, U' ');
 			else if (*p == '\\' && p [1] == 's' && p [2] == '{') p += 2;
 			else if (*p == '}') { }
 			else MelderFile_writeCharacter (file, *p);
 		}
 	}
-	MelderFile_write (file, L"\n\n", Melder_integer (numberOfFixedRankings), L" fixed rankings");
+	MelderFile_write (file, U"\n\n", numberOfFixedRankings, U" fixed rankings");
 	for (long irank = 1; irank <= numberOfFixedRankings; irank ++) {
 		OTGrammarFixedRanking fixedRanking = & fixedRankings [irank];
-		MelderFile_write (file, L"\n   ", Melder_integer (fixedRanking -> higher), L" ", Melder_integer (fixedRanking -> lower));
+		MelderFile_write (file, U"\n   ", fixedRanking -> higher, U" ", fixedRanking -> lower);
 	}
-	MelderFile_write (file, L"\n\n", Melder_integer (numberOfTableaus), L" tableaus");
+	MelderFile_write (file, U"\n\n", numberOfTableaus, U" tableaus");
 	for (long itab = 1; itab <= numberOfTableaus; itab ++) {
 		OTGrammarTableau tableau = & tableaus [itab];
-		MelderFile_write (file, L"\ninput [", Melder_integer (itab), L"]: \"");
-		for (const wchar_t *p = & tableau -> input [0]; *p; p ++) {
-			if (*p =='\"') MelderFile_writeCharacter (file, '\"');   // Double any quotes within quotes.
+		MelderFile_write (file, U"\ninput [", itab, U"]: \"");
+		for (const char32 *p = & tableau -> input [0]; *p; p ++) {
+			if (*p == '\"') MelderFile_writeCharacter (file, U'\"');   // Double any quotes within quotes.
 			MelderFile_writeCharacter (file, *p);
 		}
-		MelderFile_write (file, L"\" ", Melder_integer (tableau -> numberOfCandidates));
+		MelderFile_write (file, U"\" ", tableau -> numberOfCandidates);
 		for (long icand = 1; icand <= tableau -> numberOfCandidates; icand ++) {
 			OTGrammarCandidate candidate = & tableau -> candidates [icand];
-			MelderFile_write (file, L"\n   candidate [", Melder_integer (icand), L"]: \"");
-			for (const wchar_t *p = & candidate -> output [0]; *p; p ++) {
-				if (*p =='\"') MelderFile_writeCharacter (file, '\"');   // Double any quotes within quotes.
+			MelderFile_write (file, U"\n   candidate [", icand, U"]: \"");
+			for (const char32 *p = & candidate -> output [0]; *p; p ++) {
+				if (*p =='\"') MelderFile_writeCharacter (file, U'\"');   // Double any quotes within quotes.
 				MelderFile_writeCharacter (file, *p);
 			}
-			MelderFile_writeCharacter (file, '\"');
+			MelderFile_writeCharacter (file, U'\"');
 			for (long icons = 1; icons <= candidate -> numberOfConstraints; icons ++) {
-				MelderFile_write (file, L" ", Melder_integer (candidate -> marks [icons]));
+				MelderFile_write (file, U" ", candidate -> marks [icons]);
 			}
 		}
 	}
@@ -169,61 +169,60 @@ void OTGrammar_checkIndex (OTGrammar me) {
 	OTGrammar_sort (me);
 }
 
-void structOTGrammar :: v_readText (MelderReadText text) {
-	int localVersion = Thing_version;
-	OTGrammar_Parent :: v_readText (text);
-	if (localVersion >= 1) {
+void structOTGrammar :: v_readText (MelderReadText text, int formatVersion) {
+	OTGrammar_Parent :: v_readText (text, formatVersion);
+	if (formatVersion >= 1) {
 		try {
 			decisionStrategy = texgete1 (text, kOTGrammar_decisionStrategy_getValue);
 		} catch (MelderError) {
-			Melder_throw ("Trying to read decision strategy.");
+			Melder_throw (U"Trying to read decision strategy.");
 		}
 	}
-	if (localVersion >= 2) {
+	if (formatVersion >= 2) {
 		try {
 			leak = texgetr8 (text);
 		} catch (MelderError) {
-			Melder_throw ("Trying to read leak.");
+			Melder_throw (U"Trying to read leak.");
 		}
 	}
 	try {
 		numberOfConstraints = texgeti4 (text);
 	} catch (MelderError) {
-		Melder_throw ("Trying to read number of constraints.");
+		Melder_throw (U"Trying to read number of constraints.");
 	}
-	if (numberOfConstraints < 1) Melder_throw ("No constraints.");
+	if (numberOfConstraints < 1) Melder_throw (U"No constraints.");
 	constraints = NUMvector <structOTGrammarConstraint> (1, numberOfConstraints);
 	for (long icons = 1; icons <= numberOfConstraints; icons ++) {
 		OTGrammarConstraint constraint = & constraints [icons];
 		try {
 			constraint -> name = texgetw2 (text);
 		} catch (MelderError) {
-			Melder_throw ("Trying to read name of constraint ", icons, ".");
+			Melder_throw (U"Trying to read name of constraint ", icons, U".");
 		}
 		try {
 			constraint -> ranking = texgetr8 (text);
 		} catch (MelderError) {
-			Melder_throw ("Trying to read ranking of constraint ", icons, ".");
+			Melder_throw (U"Trying to read ranking of constraint ", icons, U".");
 		}
 		try {
 			constraint -> disharmony = texgetr8 (text);
 		} catch (MelderError) {
-			Melder_throw ("Trying to read disharmony of constraint ", icons, ".");
+			Melder_throw (U"Trying to read disharmony of constraint ", icons, U".");
 		}
-		if (localVersion < 2) {
+		if (formatVersion < 2) {
 			constraint -> plasticity = 1.0;
 		} else {
 			try {
 				constraint -> plasticity = texgetr8 (text);
 			} catch (MelderError) {
-				Melder_throw ("Trying to read plasticity of constraint ", icons, ".");
+				Melder_throw (U"Trying to read plasticity of constraint ", icons, U".");
 			}
 		}
 	}
 	try {
 		numberOfFixedRankings = texgeti4 (text);
 	} catch (MelderError) {
-		Melder_throw ("Trying to read number of fixed rankings.");
+		Melder_throw (U"Trying to read number of fixed rankings.");
 	}
 	if (numberOfFixedRankings >= 1) {
 		fixedRankings = NUMvector <structOTGrammarFixedRanking> (1, numberOfFixedRankings);
@@ -232,49 +231,49 @@ void structOTGrammar :: v_readText (MelderReadText text) {
 			try {
 				fixedRanking -> higher = texgeti4 (text);
 			} catch (MelderError) {
-				Melder_throw ("Trying to read the higher of constraint pair ", irank, ".");
+				Melder_throw (U"Trying to read the higher of constraint pair ", irank, U".");
 			}
 			try {
 				fixedRanking -> lower = texgeti4 (text);
 			} catch (MelderError) {
-				Melder_throw ("Trying to read the lower of constraint pair ", irank, ".");
+				Melder_throw (U"Trying to read the lower of constraint pair ", irank, U".");
 			}
 		}
 	}
 	try {
 		numberOfTableaus = texgeti4 (text);
 	} catch (MelderError) {
-		Melder_throw ("Trying to read number of tableaus.");
+		Melder_throw (U"Trying to read number of tableaus.");
 	}
-	if (numberOfTableaus < 1) Melder_throw (L"No tableaus.");
+	if (numberOfTableaus < 1) Melder_throw (U"No tableaus.");
 	tableaus = NUMvector <structOTGrammarTableau> (1, numberOfTableaus);
 	for (long itab = 1; itab <= numberOfTableaus; itab ++) {
 		OTGrammarTableau tableau = & tableaus [itab];
 		try {
 			tableau -> input = texgetw2 (text);
 		} catch (MelderError) {
-			Melder_throw ("Trying to read input of tableau ", itab, ".");
+			Melder_throw (U"Trying to read input of tableau ", itab, U".");
 		}
 		try {
 			tableau -> numberOfCandidates = texgeti4 (text);
 		} catch (MelderError) {
-			Melder_throw ("Trying to read number of candidates of tableau ", itab, ".");
+			Melder_throw (U"Trying to read number of candidates of tableau ", itab, U".");
 		}
 		if (tableau -> numberOfCandidates < 1) Melder_throw
-			("No candidates in tableau ", itab,
-			 " (input: ", tableau -> input, ")"
-			 " in line ", MelderReadText_getLineNumber (text),
-			 itab == 1 ? L"." : ", or perhaps wrong number of candidates for input " L_LEFT_GUILLEMET,
-			 itab == 1 ? NULL : tableaus [itab - 1]. input,
-			 itab == 1 ? NULL : L_RIGHT_GUILLEMET L".");
+			(U"No candidates in tableau ", itab,
+			 U" (input: ", tableau -> input, U")"
+			 U" in line ", MelderReadText_getLineNumber (text),
+			 itab == 1 ? U"." : U", or perhaps wrong number of candidates for input " U_LEFT_GUILLEMET,
+			 itab == 1 ? nullptr : tableaus [itab - 1]. input,
+			 itab == 1 ? nullptr : U_RIGHT_GUILLEMET U".");
 		tableau -> candidates = NUMvector <structOTGrammarCandidate> (1, tableau -> numberOfCandidates);
 		for (long icand = 1; icand <= tableau -> numberOfCandidates; icand ++) {
 			OTGrammarCandidate candidate = & tableau -> candidates [icand];
 			try {
 				candidate -> output = texgetw2 (text);
 			} catch (MelderError) {
-				Melder_throw ("Trying to read candidate ", icand, " of tableau ", itab,
-					" (input: ", tableau -> input, ") in line ", MelderReadText_getLineNumber (text), ".");
+				Melder_throw (U"Trying to read candidate ", icand, U" of tableau ", itab,
+					U" (input: ", tableau -> input, U") in line ", MelderReadText_getLineNumber (text), U".");
 			}
 			candidate -> numberOfConstraints = numberOfConstraints;   // redundancy, needed for writing binary
 			candidate -> marks = NUMvector <int> (1, candidate -> numberOfConstraints);
@@ -283,13 +282,13 @@ void structOTGrammar :: v_readText (MelderReadText text) {
 					candidate -> marks [icons] = texgeti2 (text);
 				} catch (MelderError) {
 					Melder_throw
-					("Trying to read number of violations of constraint ", icons,
-					 " (", constraints [icons]. name, ")"
-					 " of candidate ", icand,
-					 " (", candidate -> output, ")"
-					 " of tableau ", itab,
-					 " (input: ", tableau -> input, ")"
-					 " in line ", MelderReadText_getLineNumber (text), L".");
+					(U"Trying to read number of violations of constraint ", icons,
+					 U" (", constraints [icons]. name, U")"
+					 U" of candidate ", icand,
+					 U" (", candidate -> output, U")"
+					 U" of tableau ", itab,
+					 U" (input: ", tableau -> input, U")"
+					 U" in line ", MelderReadText_getLineNumber (text), U".");
 				}
 			}
 		}
@@ -297,7 +296,7 @@ void structOTGrammar :: v_readText (MelderReadText text) {
 	OTGrammar_checkIndex (this);
 }
 
-Thing_implement (OTGrammar, Data, 2);
+Thing_implement (OTGrammar, Daata, 2);
 
 Thing_implement (OTHistory, TableOfReal, 0);
 
@@ -315,7 +314,7 @@ static int constraintCompare (const void *first, const void *second) {
 	/*
 	 * Tied constraints are sorted alphabetically.
 	 */
-	return wcscmp (my constraints [icons]. name, my constraints [jcons]. name);
+	return str32cmp (my constraints [icons]. name, my constraints [jcons]. name);
 }
 
 void OTGrammar_sort (OTGrammar me) {
@@ -339,12 +338,12 @@ void OTGrammar_newDisharmonies (OTGrammar me, double spreading) {
 	OTGrammar_sort (me);
 }
 
-long OTGrammar_getTableau (OTGrammar me, const wchar_t *input) {
+long OTGrammar_getTableau (OTGrammar me, const char32 *input) {
 	long n = my numberOfTableaus;
 	for (long i = 1; i <= n; i ++)
-		if (wcsequ (my tableaus [i]. input, input))
+		if (str32equ (my tableaus [i]. input, input))
 			return i;
-	Melder_throw ("Input \"", input, "\" not in list of tableaus.");
+	Melder_throw (U"Input \"", input, U"\" not in list of tableaus.");
 }
 
 static void _OTGrammar_fillInHarmonies (OTGrammar me, long itab) {
@@ -378,7 +377,7 @@ static void _OTGrammar_fillInHarmonies (OTGrammar me, long itab) {
 				disharmony += constraintDisharmony * marks [icons];
 			}
 		} else {
-			Melder_fatal ("_OTGrammar_fillInHarmonies: unimplemented decision strategy.");
+			Melder_fatal (U"_OTGrammar_fillInHarmonies: unimplemented decision strategy.");
 		}
 		candidate -> harmony = - disharmony;
 	}
@@ -399,8 +398,8 @@ int OTGrammar_compareCandidates (OTGrammar me, long itab1, long icand1, long ita
 				numberOfMarks1 += marks1 [my index [icons]];
 				numberOfMarks2 += marks2 [my index [icons]];
 			}
-			if (numberOfMarks1 < numberOfMarks2) return -1;   /* Candidate 1 is better than candidate 2. */
-			if (numberOfMarks1 > numberOfMarks2) return +1;   /* Candidate 2 is better than candidate 1. */
+			if (numberOfMarks1 < numberOfMarks2) return -1;   // candidate 1 is better than candidate 2
+			if (numberOfMarks1 > numberOfMarks2) return +1;   // candidate 2 is better than candidate 1
 		}
 		/* If we arrive here, None of the comparisons found a difference between the two candidates. Hence, they are equally good. */
 		return 0;
@@ -412,8 +411,8 @@ int OTGrammar_compareCandidates (OTGrammar me, long itab1, long icand1, long ita
 			disharmony1 += my constraints [icons]. disharmony * marks1 [icons];
 			disharmony2 += my constraints [icons]. disharmony * marks2 [icons];
 		}
-		if (disharmony1 < disharmony2) return -1;   /* Candidate 1 is better than candidate 2. */
-		if (disharmony1 > disharmony2) return +1;   /* Candidate 2 is better than candidate 1. */
+		if (disharmony1 < disharmony2) return -1;   // candidate 1 is better than candidate 2
+		if (disharmony1 > disharmony2) return +1;   // candidate 2 is better than candidate 1
 	} else if (my decisionStrategy == kOTGrammar_decisionStrategy_LINEAR_OT) {
 		double disharmony1 = 0.0, disharmony2 = 0.0;
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
@@ -422,8 +421,8 @@ int OTGrammar_compareCandidates (OTGrammar me, long itab1, long icand1, long ita
 				disharmony2 += my constraints [icons]. disharmony * marks2 [icons];
 			}
 		}
-		if (disharmony1 < disharmony2) return -1;   /* Candidate 1 is better than candidate 2. */
-		if (disharmony1 > disharmony2) return +1;   /* Candidate 2 is better than candidate 1. */
+		if (disharmony1 < disharmony2) return -1;   // candidate 1 is better than candidate 2
+		if (disharmony1 > disharmony2) return +1;   // candidate 2 is better than candidate 1
 	} else if (my decisionStrategy == kOTGrammar_decisionStrategy_EXPONENTIAL_HG ||
 		my decisionStrategy == kOTGrammar_decisionStrategy_EXPONENTIAL_MAXIMUM_ENTROPY)
 	{
@@ -432,8 +431,8 @@ int OTGrammar_compareCandidates (OTGrammar me, long itab1, long icand1, long ita
 			disharmony1 += exp (my constraints [icons]. disharmony) * marks1 [icons];
 			disharmony2 += exp (my constraints [icons]. disharmony) * marks2 [icons];
 		}
-		if (disharmony1 < disharmony2) return -1;   /* Candidate 1 is better than candidate 2. */
-		if (disharmony1 > disharmony2) return +1;   /* Candidate 2 is better than candidate 1. */
+		if (disharmony1 < disharmony2) return -1;   // candidate 1 is better than candidate 2
+		if (disharmony1 > disharmony2) return +1;   // candidate 2 is better than candidate 1
 	} else if (my decisionStrategy == kOTGrammar_decisionStrategy_POSITIVE_HG) {
 		double disharmony1 = 0.0, disharmony2 = 0.0;
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
@@ -441,10 +440,10 @@ int OTGrammar_compareCandidates (OTGrammar me, long itab1, long icand1, long ita
 			disharmony1 += constraintDisharmony * marks1 [icons];
 			disharmony2 += constraintDisharmony * marks2 [icons];
 		}
-		if (disharmony1 < disharmony2) return -1;   /* Candidate 1 is better than candidate 2. */
-		if (disharmony1 > disharmony2) return +1;   /* Candidate 2 is better than candidate 1. */
-	} else Melder_fatal ("Unimplemented decision strategy.");
-	return 0;   /* The two total disharmonies are equal. */
+		if (disharmony1 < disharmony2) return -1;   // candidate 1 is better than candidate 2
+		if (disharmony1 > disharmony2) return +1;   // candidate 2 is better than candidate 1
+	} else Melder_fatal (U"Unimplemented decision strategy.");
+	return 0;   // the two total disharmonies are equal
 }
 
 static void _OTGrammar_fillInProbabilities (OTGrammar me, long itab) {
@@ -466,7 +465,7 @@ static void _OTGrammar_fillInProbabilities (OTGrammar me, long itab) {
 		OTGrammarCandidate candidate = & tableau -> candidates [icand];
 		sumOfProbabilities += candidate -> probability;
 	}
-	Melder_assert (sumOfProbabilities > 0.0);   // Because at least one of them is 1.0.
+	Melder_assert (sumOfProbabilities > 0.0);   // because at least one of them is 1.0
 	for (long icand = 1; icand <= tableau -> numberOfCandidates; icand ++) {
 		OTGrammarCandidate candidate = & tableau -> candidates [icand];
 		candidate -> probability /= sumOfProbabilities;
@@ -521,10 +520,10 @@ long OTGrammar_getNumberOfOptimalCandidates (OTGrammar me, long itab) {
 	for (icand = 2; icand <= my tableaus [itab]. numberOfCandidates; icand ++) {
 		int comparison = OTGrammar_compareCandidates (me, itab, icand, itab, icand_best);
 		if (comparison == -1) {
-			icand_best = icand;   /* The current candidate is the best candidate found so far. */
+			icand_best = icand;   // the current candidate is the best candidate found so far
 			numberOfBestCandidates = 1;
 		} else if (comparison == 0) {
-			numberOfBestCandidates += 1;   /* The current candidate is equally good as the best found before. */
+			numberOfBestCandidates += 1;   // the current candidate is equally good as the best found before
 		}
 	}
 	return numberOfBestCandidates;
@@ -546,26 +545,26 @@ bool OTGrammar_isCandidateSinglyGrammatical (OTGrammar me, long itab, long icand
 	return true;
 }
 
-void OTGrammar_getInterpretiveParse (OTGrammar me, const wchar_t *partialOutput, long *bestTableau, long *bestCandidate) {
+void OTGrammar_getInterpretiveParse (OTGrammar me, const char32 *partialOutput, long *bestTableau, long *bestCandidate) {
 	try {
 		long itab_best = 0, icand_best = 0, numberOfBestCandidates = 0;
 		for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
 			OTGrammarTableau tableau = & my tableaus [itab];
 			for (long icand = 1; icand <= tableau -> numberOfCandidates; icand ++) {
 				OTGrammarCandidate cand = & tableau -> candidates [icand];
-				if (wcsstr (cand -> output, partialOutput)) {   /* T&S idea of surface->overt mapping */
+				if (str32str (cand -> output, partialOutput)) {   // T&S' idea of surface->overt mapping
 					if (itab_best == 0) {
-						itab_best = itab;   /* The first compatible input/output pair found is the first guess for the best candidate. */
+						itab_best = itab;   // the first compatible input/output pair found is the first guess for the best candidate
 						icand_best = icand;
 						numberOfBestCandidates = 1;
 					} else {
 						int comparison = OTGrammar_compareCandidates (me, itab, icand, itab_best, icand_best);
 						if (comparison == -1) {
-							itab_best = itab;   /* The current input/output pair is the best candidate found so far. */
+							itab_best = itab;   // the current input/output pair is the best candidate found so far
 							icand_best = icand;
 							numberOfBestCandidates = 1;
 						} else if (comparison == 0) {
-							numberOfBestCandidates += 1;   /* The current input/output pair is equally good as the best found before. */
+							numberOfBestCandidates += 1;   // the current input/output pair is equally good as the best found before
 							/*
 							 * Give all candidates that are equally good an equal chance to become the winner.
 							 */
@@ -584,11 +583,11 @@ void OTGrammar_getInterpretiveParse (OTGrammar me, const wchar_t *partialOutput,
 				}
 			}
 		}
-		if (itab_best == 0) Melder_throw ("The partial output \"", partialOutput, "\" does not match any candidate for any input form.");
-		if (bestTableau != NULL) *bestTableau = itab_best;
-		if (bestCandidate != NULL) *bestCandidate = icand_best;
+		if (itab_best == 0) Melder_throw (U"The partial output \"", partialOutput, U"\" does not match any candidate for any input form.");
+		if (bestTableau) *bestTableau = itab_best;
+		if (bestCandidate) *bestCandidate = icand_best;
 	} catch (MelderError) {
-		Melder_throw ("Interpretive parse not computed.");
+		Melder_throw (U"Interpretive parse not computed.");
 	}
 }
 
@@ -599,20 +598,20 @@ static void OTGrammar_getInterpretiveParse_opt (OTGrammar me, long ipartialOutpu
 			OTGrammarTableau tableau = & my tableaus [itab];
 			for (long icand = 1; icand <= tableau -> numberOfCandidates; icand ++) {
 				OTGrammarCandidate cand = & tableau -> candidates [icand];
-				Melder_assert (cand -> partialOutputMatches != NULL);
-				if (cand -> partialOutputMatches [ipartialOutput]) {   /* T&S idea of surface->overt mapping */
+				Melder_assert (cand -> partialOutputMatches);
+				if (cand -> partialOutputMatches [ipartialOutput]) {   // T&S' idea of surface->overt mapping
 					if (itab_best == 0) {
-						itab_best = itab;   /* The first compatible input/output pair found is the first guess for the best candidate. */
+						itab_best = itab;   // the first compatible input/output pair found is the first guess for the best candidate
 						icand_best = icand;
 						numberOfBestCandidates = 1;
 					} else {
 						int comparison = OTGrammar_compareCandidates (me, itab, icand, itab_best, icand_best);
 						if (comparison == -1) {
-							itab_best = itab;   /* The current input/output pair is the best candidate found so far. */
+							itab_best = itab;   // the current input/output pair is the best candidate found so far
 							icand_best = icand;
 							numberOfBestCandidates = 1;
 						} else if (comparison == 0) {
-							numberOfBestCandidates += 1;   /* The current input/output pair is equally good as the best found before. */
+							numberOfBestCandidates += 1;   // the current input/output pair is equally good as the best found before
 							/*
 							 * Give all candidates that are equally good an equal chance to become the winner.
 							 */
@@ -632,18 +631,18 @@ static void OTGrammar_getInterpretiveParse_opt (OTGrammar me, long ipartialOutpu
 			}
 		}
 		Melder_assert (itab_best != 0);
-		if (bestTableau != NULL) *bestTableau = itab_best;
-		if (bestCandidate != NULL) *bestCandidate = icand_best;
+		if (bestTableau) *bestTableau = itab_best;
+		if (bestCandidate) *bestCandidate = icand_best;
 	} catch (MelderError) {
-		Melder_throw ("Interpretive parse not computed.");
+		Melder_throw (U"Interpretive parse not computed.");
 	}
 }
 
-bool OTGrammar_isPartialOutputGrammatical (OTGrammar me, const wchar_t *partialOutput) {
+bool OTGrammar_isPartialOutputGrammatical (OTGrammar me, const char32 *partialOutput) {
 	for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
 		OTGrammarTableau tableau = & my tableaus [itab];
 		for (long icand = 1; icand <= tableau -> numberOfCandidates; icand ++) {
-			if (wcsstr (tableau -> candidates [icand]. output, partialOutput)) {
+			if (str32str (tableau -> candidates [icand]. output, partialOutput)) {
 				if (OTGrammar_isCandidateGrammatical (me, itab, icand)) {
 					return true;
 				}
@@ -655,7 +654,7 @@ bool OTGrammar_isPartialOutputGrammatical (OTGrammar me, const wchar_t *partialO
 
 bool OTGrammar_areAllPartialOutputsGrammatical (OTGrammar me, Strings thee) {
 	for (long ioutput = 1; ioutput <= thy numberOfStrings; ioutput ++) {
-		const wchar_t *partialOutput = thy strings [ioutput];
+		const char32 *partialOutput = thy strings [ioutput];
 		if (! OTGrammar_isPartialOutputGrammatical (me, partialOutput)) {
 			return false;
 		}
@@ -663,12 +662,12 @@ bool OTGrammar_areAllPartialOutputsGrammatical (OTGrammar me, Strings thee) {
 	return true;
 }
 
-bool OTGrammar_isPartialOutputSinglyGrammatical (OTGrammar me, const wchar_t *partialOutput) {
+bool OTGrammar_isPartialOutputSinglyGrammatical (OTGrammar me, const char32 *partialOutput) {
 	bool found = false;
 	for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
 		OTGrammarTableau tableau = & my tableaus [itab];
 		for (long icand = 1; icand <= tableau -> numberOfCandidates; icand ++) {
-			if (wcsstr (tableau -> candidates [icand]. output, partialOutput)) {
+			if (str32str (tableau -> candidates [icand]. output, partialOutput)) {
 				if (OTGrammar_isCandidateGrammatical (me, itab, icand)) {
 					found = true;
 					/*
@@ -676,8 +675,8 @@ bool OTGrammar_isPartialOutputSinglyGrammatical (OTGrammar me, const wchar_t *pa
 					 */
 					for (long jcand = 1; jcand <= tableau -> numberOfCandidates; jcand ++) {
 						if (OTGrammar_compareCandidates (me, itab, jcand, itab, icand) == 0) {
-							if (wcsstr (tableau -> candidates [jcand]. output, partialOutput) == NULL) {
-								return false;   // Partial output is multiply optimal.
+							if (! str32str (tableau -> candidates [jcand]. output, partialOutput)) {
+								return false;   // partial output is multiply optimal
 							}
 						}
 					}
@@ -690,7 +689,7 @@ bool OTGrammar_isPartialOutputSinglyGrammatical (OTGrammar me, const wchar_t *pa
 
 bool OTGrammar_areAllPartialOutputsSinglyGrammatical (OTGrammar me, Strings thee) {
 	for (long ioutput = 1; ioutput <= thy numberOfStrings; ioutput ++) {
-		const wchar_t *partialOutput = thy strings [ioutput];
+		const char32 *partialOutput = thy strings [ioutput];
 		if (! OTGrammar_isPartialOutputSinglyGrammatical (me, partialOutput)) {
 			return false;
 		}
@@ -701,15 +700,15 @@ bool OTGrammar_areAllPartialOutputsSinglyGrammatical (OTGrammar me, Strings thee
 static int OTGrammar_crucialCell (OTGrammar me, long itab, long icand, long iwinner, long numberOfOptimalCandidates) {
 	int icons;
 	OTGrammarTableau tableau = & my tableaus [itab];
-	if (tableau -> numberOfCandidates < 2) return 0;   /* If there is only one candidate, all cells can be greyed. */
-	if (my decisionStrategy != kOTGrammar_decisionStrategy_OPTIMALITY_THEORY) return my numberOfConstraints;   /* Nothing grey. */
-	if (OTGrammar_compareCandidates (me, itab, icand, itab, iwinner) == 0) {   /* Candidate equally good as winner? */
+	if (tableau -> numberOfCandidates < 2) return 0;   // if there is only one candidate, all cells can be greyed
+	if (my decisionStrategy != kOTGrammar_decisionStrategy_OPTIMALITY_THEORY) return my numberOfConstraints;   // nothing grey
+	if (OTGrammar_compareCandidates (me, itab, icand, itab, iwinner) == 0) {   // candidate equally good as winner?
 		if (numberOfOptimalCandidates > 1) {
 			/* All cells are important. */
 		} else {
 			long jcand, secondBest = 0;
 			for (jcand = 1; jcand <= tableau -> numberOfCandidates; jcand ++) {
-				if (OTGrammar_compareCandidates (me, itab, jcand, itab, iwinner) != 0) {   /* A non-optimal candidate? */
+				if (OTGrammar_compareCandidates (me, itab, jcand, itab, iwinner) != 0) {   // a non-optimal candidate?
 					if (secondBest == 0) {
 						secondBest = jcand;   /* First guess. */
 					} else if (OTGrammar_compareCandidates (me, itab, jcand, itab, secondBest) < 0) {
@@ -717,7 +716,7 @@ static int OTGrammar_crucialCell (OTGrammar me, long itab, long icand, long iwin
 					}
 				}
 			}
-			if (secondBest == 0) return 0;   /* If all candidates are equally good, all cells can be greyed. */
+			if (secondBest == 0) return 0;   // if all candidates are equally good, all cells can be greyed
 			return OTGrammar_crucialCell (me, itab, secondBest, iwinner, 1);
 		}
 	} else {
@@ -736,13 +735,13 @@ static int OTGrammar_crucialCell (OTGrammar me, long itab, long icand, long iwin
 				return icons;
 		}
 	}
-	return my numberOfConstraints;   /* Nothing grey. */
+	return my numberOfConstraints;   // nothing grey
 }
 
-static double OTGrammar_constraintWidth (Graphics g, const wchar_t *name) {
-	wchar_t text [100], *newLine;
-	wcscpy (text, name);
-	newLine = wcschr (text, '\n');
+static double OTGrammar_constraintWidth (Graphics g, const char32 *name) {
+	char32 text [100], *newLine;
+	str32cpy (text, name);
+	newLine = str32chr (text, '\n');
 	if (newLine) {
 		double firstWidth, secondWidth;
 		*newLine = '\0';
@@ -753,11 +752,10 @@ static double OTGrammar_constraintWidth (Graphics g, const wchar_t *name) {
 	return Graphics_textWidth (g, text);
 }
 
-void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const wchar_t *input) {
+void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const char32 *input) {
 	try {
 		double x, y, fontSize = Graphics_inqFontSize (g);
 		Graphics_Colour colour = Graphics_inqColour (g);
-		wchar_t text [200];
 		const long itab = OTGrammar_getTableau (me, input);
 		_OTGrammar_fillInHarmonies (me, itab);
 		const long winner = OTGrammar_getWinner (me, itab);
@@ -788,7 +786,7 @@ void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const wchar
 			headerHeight = rowHeight;
 			for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 				OTGrammarConstraint constraint = & my constraints [icons];
-				if (wcschr (constraint -> name, '\n')) {
+				if (str32chr (constraint -> name, U'\n')) {
 					headerHeight *= 1.6;
 					break;
 				}
@@ -845,13 +843,13 @@ void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const wchar
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			OTGrammarConstraint constraint = & my constraints [my index [icons]];
 			double width = vertical ? rowHeight / worldAspectRatio : OTGrammar_constraintWidth (g, constraint -> name) + margin * 2;
-			if (wcschr (constraint -> name, '\n') && ! vertical) {
-				wchar_t *newLine;
-				wcscpy (text, constraint -> name);
-				newLine = wcschr (text, '\n');
-				*newLine = '\0';
+			if (str32chr (constraint -> name, U'\n') && ! vertical) {
+				autoMelderString text;
+				MelderString_copy (& text, constraint -> name);
+				char32 *newLine = str32chr (text.string, U'\n');
+				*newLine = U'\0';
 				Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_TOP);
-				Graphics_text (g, x + 0.5 * width, y + headerHeight, text);
+				Graphics_text (g, x + 0.5 * width, y + headerHeight, text.string);
 				Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_BOTTOM);
 				Graphics_text (g, x + 0.5 * width, y, newLine + 1);
 			} else if (vertical) {
@@ -887,7 +885,7 @@ void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const wchar
 				Graphics_setTextAlignment (g, Graphics_LEFT, Graphics_HALF);
 				Graphics_setFontSize (g, (int) (1.5 * fontSize));
 				if (numberOfOptimalCandidates > 1) Graphics_setColour (g, Graphics_RED);
-				Graphics_text (g, x + margin, y + descent - Graphics_dyMMtoWC (g, 1.0) * fontSize / 12.0, L"☞");
+				Graphics_text (g, x + margin, y + descent - Graphics_dyMMtoWC (g, 1.0) * fontSize / 12.0, U"☞");
 				Graphics_setColour (g, colour);
 				Graphics_setFontSize (g, (int) fontSize);
 			}
@@ -915,8 +913,8 @@ void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const wchar
 				int index = my index [icons];
 				OTGrammarConstraint constraint = & my constraints [index];
 				double width = vertical ? rowHeight / worldAspectRatio : OTGrammar_constraintWidth (g, constraint -> name) + margin * 2;
-				wchar_t markString [40];
-				markString [0] = '\0';
+				static MelderString markString;
+				MelderString_empty (& markString);
 				if (my decisionStrategy == kOTGrammar_decisionStrategy_OPTIMALITY_THEORY) {
 					/*
 					 * An exclamation mark can be drawn in this cell only if all of the following conditions are met:
@@ -927,12 +925,12 @@ void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const wchar
 					if (icons == crucialCell && ! candidateIsOptimal && ! constraint -> tiedToTheLeft && ! constraint -> tiedToTheRight) {
 						int winnerMarks = tableau -> candidates [winner]. marks [index];
 						for (long imark = 1; imark <= winnerMarks + 1; imark ++)
-							wcscat (markString, L"*");
+							MelderString_appendCharacter (& markString, U'*');
 						for (long imark = tableau -> candidates [icand]. marks [index]; imark < 0; imark ++)
-							wcscat (markString, L"+");
-						wcscat (markString, L"!");
+							MelderString_appendCharacter (& markString, U'+');
+						MelderString_appendCharacter (& markString, U'!');
 						for (long imark = winnerMarks + 2; imark <= tableau -> candidates [icand]. marks [index]; imark ++)
-							wcscat (markString, L"*");
+							MelderString_appendCharacter (& markString, U'*');
 					} else {
 						if (! candidateIsOptimal && (constraint -> tiedToTheLeft || constraint -> tiedToTheRight) &&
 							crucialCell >= 1 && constraint -> disharmony == my constraints [my index [crucialCell]]. disharmony)
@@ -940,17 +938,17 @@ void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const wchar
 							Graphics_setColour (g, Graphics_RED);
 						}
 						for (long imark = 1; imark <= tableau -> candidates [icand]. marks [index]; imark ++)
-							wcscat (markString, L"*");
+							MelderString_appendCharacter (& markString, U'*');
 						for (long imark = tableau -> candidates [icand]. marks [index]; imark < 0; imark ++)
-							wcscat (markString, L"+");
+							MelderString_appendCharacter (& markString, U'+');
 					}
 				} else {
 					for (long imark = 1; imark <= tableau -> candidates [icand]. marks [index]; imark ++)
-						wcscat (markString, L"*");
+						MelderString_appendCharacter (& markString, U'*');
 					for (long imark = tableau -> candidates [icand]. marks [index]; imark < 0; imark ++)
-						wcscat (markString, L"+");
+						MelderString_appendCharacter (& markString, U'+');
 				}
-				Graphics_text (g, x + 0.5 * width, y + descent, markString);
+				Graphics_text (g, x + 0.5 * width, y + descent, markString.string);
 				Graphics_setColour (g, colour);
 				if (constraint -> tiedToTheLeft)
 					Graphics_setLineType (g, Graphics_DOTTED);
@@ -968,7 +966,7 @@ void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const wchar
 				if (my decisionStrategy == kOTGrammar_decisionStrategy_EXPONENTIAL_HG ||
 					my decisionStrategy == kOTGrammar_decisionStrategy_EXPONENTIAL_MAXIMUM_ENTROPY)
 				{
-					//value = value > -1e-300 ? 1000 : value < -1e300 ? -1000 : - log (- value);
+					//value = value > 1e-308 ? 1000 : value < -1e308 ? -1000 : - log (- value);
 					Graphics_text (g, x, y + descent, Melder_float (Melder_half (value)));
 				} else {
 					Graphics_text (g, x, y + descent, Melder_fixed (value, 3));
@@ -983,47 +981,47 @@ void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const wchar
 		Graphics_rectangle (g, x, x + tableauWidth,
 			y - headerHeight - tableau -> numberOfCandidates * rowHeight - doubleLineDy, y);
 	} catch (MelderError) {
-		Melder_throw (me, ": tableau not drawn.");
+		Melder_throw (me, U": tableau not drawn.");
 	}
 }
 
 Strings OTGrammar_generateInputs (OTGrammar me, long numberOfTrials) {
 	try {
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector <wchar_t*> (1, thy numberOfStrings = numberOfTrials);
+		thy strings = NUMvector <char32 *> (1, thy numberOfStrings = numberOfTrials);
 		for (long i = 1; i <= numberOfTrials; i ++) {
 			long itab = NUMrandomInteger (1, my numberOfTableaus);
-			thy strings [i] = Melder_wcsdup (my tableaus [itab]. input);
+			thy strings [i] = Melder_dup (my tableaus [itab]. input);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": inputs not generated.");
+		Melder_throw (me, U": inputs not generated.");
 	}
 }
 
 Strings OTGrammar_getInputs (OTGrammar me) {
 	try {
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector <wchar_t *> (1, thy numberOfStrings = my numberOfTableaus);
+		thy strings = NUMvector <char32 *> (1, thy numberOfStrings = my numberOfTableaus);
 		for (long i = 1; i <= my numberOfTableaus; i ++) {
-			thy strings [i] = Melder_wcsdup (my tableaus [i]. input);
+			thy strings [i] = Melder_dup (my tableaus [i]. input);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": inputs not gotten.");
+		Melder_throw (me, U": inputs not gotten.");
 	}
 }
 
-void OTGrammar_inputToOutput (OTGrammar me, const wchar_t *input, wchar_t *output, double evaluationNoise) {
+void OTGrammar_inputToOutput (OTGrammar me, const char32 *input, char32 *output, double evaluationNoise) {
 	try {
 		OTGrammar_newDisharmonies (me, evaluationNoise);
 		long itab = OTGrammar_getTableau (me, input);
 		long winner = OTGrammar_getWinner (me, itab);
 		if (winner == 0)
-			Melder_throw ("No winner");
-		wcscpy (output, my tableaus [itab]. candidates [winner]. output);
+			Melder_throw (U"No winner");
+		str32cpy (output, my tableaus [itab]. candidates [winner]. output);
 	} catch (MelderError) {
-		Melder_throw (me, ": output not computed from input \"", input, "\".");
+		Melder_throw (me, U": output not computed from input \"", input, U"\".");
 	}
 }
 
@@ -1032,31 +1030,31 @@ Strings OTGrammar_inputsToOutputs (OTGrammar me, Strings inputs, double evaluati
 		autoStrings him = Thing_new (Strings);
 		long n = inputs -> numberOfStrings;
 		his numberOfStrings = n;
-		his strings = NUMvector <wchar_t*> (1, n);
+		his strings = NUMvector <char32 *> (1, n);
 		for (long i = 1; i <= n; i ++) {
-			wchar_t output [100];
+			char32 output [100];
 			OTGrammar_inputToOutput (me, inputs -> strings [i], output, evaluationNoise);
-			his strings [i] = Melder_wcsdup (output);
+			his strings [i] = Melder_dup (output);
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": outputs not computed.");
+		Melder_throw (me, U": outputs not computed.");
 	}
 }
 
-Strings OTGrammar_inputToOutputs (OTGrammar me, const wchar_t *input, long n, double evaluationNoise) {
+Strings OTGrammar_inputToOutputs (OTGrammar me, const char32 *input, long n, double evaluationNoise) {
 	try {
 		autoStrings thee = Thing_new (Strings);
 		thy numberOfStrings = n;
-		thy strings = NUMvector <wchar_t*> (1, n);
+		thy strings = NUMvector <char32 *> (1, n);
 		for (long i = 1; i <= n; i ++) {
-			wchar_t output [100];
+			char32 output [100];
 			OTGrammar_inputToOutput (me, input, output, evaluationNoise);
-			thy strings [i] = Melder_wcsdup (output);
+			thy strings [i] = Melder_dup (output);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": output not computed.");
+		Melder_throw (me, U": output not computed.");
 	}
 }
 
@@ -1075,18 +1073,15 @@ Distributions OTGrammar_to_Distribution (OTGrammar me, long trialsPerInput, doub
 		/*
 		 * Measure every input form.
 		 */
-		autoMelderProgress progress (L"OTGrammar: compute output distribution.");
+		autoMelderProgress progress (U"OTGrammar: compute output distribution.");
 		for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
 			OTGrammarTableau tableau = & my tableaus [itab];
-			Melder_progress ((itab - 0.5) / my numberOfTableaus, L"Measuring input \"", tableau -> input, L"\"");
+			Melder_progress ((itab - 0.5) / my numberOfTableaus, U"Measuring input \"", tableau -> input, U"\"");
 			/*
 			 * Set the row labels to the output strings.
 			 */
 			for (long icand = 1; icand <= tableau -> numberOfCandidates; icand ++) {
-				static MelderString buffer = { 0 };
-				MelderString_empty (& buffer);
-				MelderString_append (& buffer, tableau -> input, L" \\-> ", tableau -> candidates [icand]. output);
-				thy rowLabels [nout + icand] = Melder_wcsdup (buffer.string);
+				thy rowLabels [nout + icand] = Melder_dup (Melder_cat (tableau -> input, U" \\-> ", tableau -> candidates [icand]. output));
 			}
 			/*
 			 * Compute a number of outputs and store the results.
@@ -1103,7 +1098,7 @@ Distributions OTGrammar_to_Distribution (OTGrammar me, long trialsPerInput, doub
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": output distribution not computed.");
+		Melder_throw (me, U": output distribution not computed.");
 	}
 }
 
@@ -1122,10 +1117,10 @@ PairDistribution OTGrammar_to_PairDistribution (OTGrammar me, long trialsPerInpu
 		/*
 		 * Measure every input form.
 		 */
-		autoMelderProgress progress (L"OTGrammar: compute output distribution.");
+		autoMelderProgress progress (U"OTGrammar: compute output distribution.");
 		for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
 			OTGrammarTableau tableau = & my tableaus [itab];
-			Melder_progress ((itab - 0.5) / my numberOfTableaus, L"Measuring input \"", tableau -> input, L"\"");
+			Melder_progress ((itab - 0.5) / my numberOfTableaus, U"Measuring input \"", tableau -> input, U"\"");
 			/*
 			 * Copy the input and output strings to the target object.
 			 */
@@ -1148,7 +1143,7 @@ PairDistribution OTGrammar_to_PairDistribution (OTGrammar me, long trialsPerInpu
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": output distribution not computed.");
+		Melder_throw (me, U": output distribution not computed.");
 	}
 }
 
@@ -1167,7 +1162,7 @@ Distributions OTGrammar_measureTypology (OTGrammar me) {
 	try {
 		long totalNumberOfOutputs = 0, nout = 0, ncons = my numberOfConstraints, nperm, factorial [1+12];
 		if (ncons > 12)
-			Melder_throw ("Cannot handle more than 12 constraints.");
+			Melder_throw (U"Cannot handle more than 12 constraints.");
 		factorial [0] = 1;
 		for (long icons = 1; icons <= ncons; icons ++) {
 			factorial [icons] = factorial [icons - 1] * icons;
@@ -1185,18 +1180,15 @@ Distributions OTGrammar_measureTypology (OTGrammar me) {
 		/*
 		 * Measure every input form.
 		 */
-		autoMelderProgress progress (L"Measuring typology...");
+		autoMelderProgress progress (U"Measuring typology...");
 		for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
 			OTGrammarTableau tableau = & my tableaus [itab];
-			Melder_progress ((itab - 0.5) / my numberOfTableaus, L"Measuring input \"", tableau -> input, L"\"");
+			Melder_progress ((itab - 0.5) / my numberOfTableaus, U"Measuring input \"", tableau -> input, U"\"");
 			/*
 			 * Set the row labels to the output strings.
 			 */
 			for (long icand = 1; icand <= tableau -> numberOfCandidates; icand ++) {
-				static MelderString buffer = { 0 };
-				MelderString_empty (& buffer);
-				MelderString_append (& buffer, tableau -> input, L" \\-> ", tableau -> candidates [icand]. output);
-				thy rowLabels [nout + icand] = Melder_wcsdup_f (buffer.string);
+				thy rowLabels [nout + icand] = Melder_dup (Melder_cat (tableau -> input, U" \\-> ", tableau -> candidates [icand]. output));
 			}
 			/*
 			 * Compute a number of outputs and store the results.
@@ -1229,7 +1221,7 @@ Distributions OTGrammar_measureTypology (OTGrammar me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": typology not measured.");
+		Melder_throw (me, U": typology not measured.");
 	}
 }
 
@@ -1237,17 +1229,17 @@ static double learningStep (double mean, double relativeSpreading) {
 	return relativeSpreading == 0.0 ? mean : NUMrandomGauss (mean, relativeSpreading * mean);
 }
 
-static void OTGrammar_honourLocalRankings (OTGrammar me, double plasticity, double relativePlasticityNoise, int *grammarHasChanged) {
-	int improved;
+static void OTGrammar_honourLocalRankings (OTGrammar me, double plasticity, double relativePlasticityNoise, bool *grammarHasChanged) {
+	bool improved;
 	do {
-		improved = FALSE;
+		improved = false;
 		for (long irank = 1; irank <= my numberOfFixedRankings; irank ++) {
 			OTGrammarFixedRanking fixedRanking = & my fixedRankings [irank];
 			OTGrammarConstraint higher = & my constraints [fixedRanking -> higher], lower = & my constraints [fixedRanking -> lower];
 			while (higher -> ranking <= lower -> ranking) {
 				lower -> ranking -= learningStep (plasticity, relativePlasticityNoise);
-				if (grammarHasChanged != NULL) *grammarHasChanged = TRUE;
-				improved = TRUE;
+				if (grammarHasChanged) *grammarHasChanged = true;
+				improved = true;
 			}
 		}
 	} while (improved);
@@ -1255,7 +1247,7 @@ static void OTGrammar_honourLocalRankings (OTGrammar me, double plasticity, doub
 
 static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, long iadult,
 	int updateRule, int honourLocalRankings,
-	double plasticity, double relativePlasticityNoise, int warnIfStalled, int *grammarHasChanged)
+	double plasticity, double relativePlasticityNoise, int warnIfStalled, bool *grammarHasChanged)
 {
 	try {
 		OTGrammarTableau tableau = & my tableaus [itab];
@@ -1284,12 +1276,12 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 			if (adultMarks > winnerMarks) {
 				if (multiplyStepByNumberOfViolations) constraintStep *= adultMarks - winnerMarks;
 				constraint -> ranking -= constraintStep * (1.0 + constraint -> ranking * my leak);
-				if (grammarHasChanged != NULL) *grammarHasChanged = true;
+				if (grammarHasChanged) *grammarHasChanged = true;
 			}
 			if (winnerMarks > adultMarks) {
 				if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - adultMarks;
 				constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak);
-				if (grammarHasChanged != NULL) *grammarHasChanged = true;
+				if (grammarHasChanged) *grammarHasChanged = true;
 			}
 		} else if (updateRule == kOTGrammar_rerankingStrategy_SYMMETRIC_ALL) {
 			bool changed = false;
@@ -1320,7 +1312,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 					my constraints [icons]. ranking -= averageWeight;
 				}
 			}
-			if (grammarHasChanged != NULL) *grammarHasChanged = changed;
+			if (grammarHasChanged) *grammarHasChanged = changed;
 		} else if (updateRule == kOTGrammar_rerankingStrategy_SYMMETRIC_ALL_SKIPPABLE) {
 			bool changed = false;
 			int winningConstraints = 0, adultConstraints = 0;
@@ -1357,7 +1349,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 					my constraints [icons]. ranking -= averageWeight;
 				}
 			}
-			if (grammarHasChanged != NULL) *grammarHasChanged = changed;
+			if (grammarHasChanged) *grammarHasChanged = changed;
 		} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_UNCANCELLED) {
 			int winningConstraints = 0, adultConstraints = 0;
 			for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
@@ -1375,13 +1367,13 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 					if (multiplyStepByNumberOfViolations) constraintStep *= adultMarks - winnerMarks;
 					constraint -> ranking -= constraintStep * (1.0 + constraint -> ranking * my leak) / adultConstraints;
 					//constraint -> ranking -= constraintStep * (1.0 + constraint -> ranking * my leak) * winningConstraints;
-					if (grammarHasChanged != NULL) *grammarHasChanged = true;
+					if (grammarHasChanged) *grammarHasChanged = true;
 				}
 				if (winnerMarks > adultMarks) {
 					if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - adultMarks;
 					constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) / winningConstraints;
 					//constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) * adultConstraints;
-					if (grammarHasChanged != NULL) *grammarHasChanged = true;
+					if (grammarHasChanged) *grammarHasChanged = true;
 				}
 			}
 		} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_ALL) {
@@ -1400,12 +1392,12 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 				if (adultMarks > 0) {
 					if (multiplyStepByNumberOfViolations) constraintStep *= adultMarks /*- winnerMarks*/;
 					constraint -> ranking -= constraintStep * (1.0 + constraint -> ranking * my leak) / adultConstraints;
-					if (grammarHasChanged != NULL) *grammarHasChanged = true;
+					if (grammarHasChanged) *grammarHasChanged = true;
 				}
 				if (winnerMarks > 0) {
 					if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks /*- adultMarks*/;
 					constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) / winningConstraints;
-					if (grammarHasChanged != NULL) *grammarHasChanged = true;
+					if (grammarHasChanged) *grammarHasChanged = true;
 				}
 			}
 		} else if (updateRule == kOTGrammar_rerankingStrategy_EDCD || updateRule == kOTGrammar_rerankingStrategy_EDCD_WITH_VACATION) {
@@ -1423,8 +1415,8 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 			}
 			if (icons > my numberOfConstraints) {   // completed the loop?
 				if (warnIfStalled && ! equivalent)
-					Melder_warning ("Correct output is harmonically bounded (by having strict superset violations as compared to the learner's output)! EDCD stalls.\n"
-						"Input: ", tableau -> input, "\nCorrect output: ", adult -> output, "\nLearner's output: ", winner -> output);
+					Melder_warning (U"Correct output is harmonically bounded (by having strict superset violations as compared to the learner's output)! EDCD stalls.\n"
+						U"Input: ", tableau -> input, U"\nCorrect output: ", adult -> output, U"\nLearner's output: ", winner -> output);
 				return;   // Tesar & Smolensky (2000: 67): "stopped dead in its tracks"
 			}
 			/*
@@ -1448,7 +1440,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 						OTGrammarConstraint constraint = & my constraints [icons];
 						if (constraint -> ranking < pivotRanking) {
 							constraint -> ranking -= numberOfConstraintsToDemote * step * constraint -> plasticity;
-							if (grammarHasChanged != NULL) *grammarHasChanged = true;
+							if (grammarHasChanged) *grammarHasChanged = true;
 						}
 					}
 				}
@@ -1467,7 +1459,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 					if (constraint -> ranking >= pivotRanking) {
 						numberOfConstraintsDemoted += 1;
 						constraint -> ranking = pivotRanking - numberOfConstraintsDemoted * constraintStep;   // this preserves the order of the demotees
-						if (grammarHasChanged != NULL) *grammarHasChanged = true;
+						if (grammarHasChanged) *grammarHasChanged = true;
 					}
 				}
 			}
@@ -1482,13 +1474,13 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 				int winnerMarks = winner -> marks [my index [icons]];   // the order is important, so we indirect
 				int adultMarks = adult -> marks [my index [icons]];
 				if (my constraints [my index [icons]]. tiedToTheRight)
-					Melder_throw ("Demotion-only learning cannot handle tied constraints.");
+					Melder_throw (U"Demotion-only learning cannot handle tied constraints.");
 				if (adultMarks < winnerMarks)
-					Melder_throw ("Demotion-only learning step: Adult form wins! Should never happen.");
+					Melder_throw (U"Demotion-only learning step: Adult form wins! Should never happen.");
 				if (adultMarks > winnerMarks) break;
 			}
 			if (icons > my numberOfConstraints)   // completed the loop?
-				Melder_throw ("Adult form equals correct candidate.");
+				Melder_throw (U"Adult form equals correct candidate.");
 			crucialAdultMark = icons;
 			/*
 			 * Demote the highest uniquely violated constraint in the adult form.
@@ -1496,7 +1488,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 			offendingConstraint = & my constraints [my index [crucialAdultMark]];
 			double constraintStep = step * offendingConstraint -> plasticity;
 			offendingConstraint -> ranking -= constraintStep;
-			if (grammarHasChanged != NULL) *grammarHasChanged = true;
+			if (grammarHasChanged) *grammarHasChanged = true;
 		} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_ALL_UP_HIGHEST_DOWN) {
 			long numberOfUp = 0;
 			for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
@@ -1515,7 +1507,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 					if (winnerMarks > adultMarks) {
 						if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - adultMarks;
 						constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) / numberOfUp;
-						if (grammarHasChanged != NULL) *grammarHasChanged = true;
+						if (grammarHasChanged) *grammarHasChanged = true;
 					}
 				}
 				long crucialAdultMark, winnerMarks = 0, adultMarks = 0;
@@ -1525,13 +1517,13 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 					winnerMarks = winner -> marks [my index [icons]];   // the order is important, therefore indirect
 					adultMarks = adult -> marks [my index [icons]];
 					if (my constraints [my index [icons]]. tiedToTheRight)
-						Melder_throw ("Demotion-only learning cannot handle tied constraints.");
+						Melder_throw (U"Demotion-only learning cannot handle tied constraints.");
 					if (adultMarks < winnerMarks)
-						Melder_throw ("Demotion-only learning step: Adult form wins! Should never happen.");
+						Melder_throw (U"Demotion-only learning step: Adult form wins! Should never happen.");
 					if (adultMarks > winnerMarks) break;
 				}
 				if (icons > my numberOfConstraints)   // completed the loop?
-					Melder_throw ("Adult form equals correct candidate.");
+					Melder_throw (U"Adult form equals correct candidate.");
 				crucialAdultMark = icons;
 				/*
 				 * Demote the highest uniquely violated constraint in the adult form.
@@ -1540,7 +1532,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 				double constraintStep = step * offendingConstraint -> plasticity;
 				if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - adultMarks;
 				offendingConstraint -> ranking -= /*numberOfUp **/ constraintStep * (1.0 - offendingConstraint -> ranking * my leak);
-				if (grammarHasChanged != NULL) *grammarHasChanged = true;
+				if (grammarHasChanged) *grammarHasChanged = true;
 			}
 		} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_ALL_UP_HIGHEST_DOWN_2012) {
 			long numberOfUp = 0;
@@ -1560,7 +1552,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 					if (winnerMarks > adultMarks) {
 						if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - adultMarks;
 						constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) / (numberOfUp + 1);
-						if (grammarHasChanged != NULL) *grammarHasChanged = true;
+						if (grammarHasChanged) *grammarHasChanged = true;
 					}
 				}
 				long crucialAdultMark, winnerMarks = 0, adultMarks = 0;
@@ -1570,13 +1562,13 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 					winnerMarks = winner -> marks [my index [icons]];   // the order is important, therefore indirect
 					adultMarks = adult -> marks [my index [icons]];
 					if (my constraints [my index [icons]]. tiedToTheRight)
-						Melder_throw ("Demotion-only learning cannot handle tied constraints.");
+						Melder_throw (U"Demotion-only learning cannot handle tied constraints.");
 					if (adultMarks < winnerMarks)
-						Melder_throw ("Demotion-only learning step: Adult form wins! Should never happen.");
+						Melder_throw (U"Demotion-only learning step: Adult form wins! Should never happen.");
 					if (adultMarks > winnerMarks) break;
 				}
 				if (icons > my numberOfConstraints)   // completed the loop?
-					Melder_throw ("Adult form equals correct candidate.");
+					Melder_throw (U"Adult form equals correct candidate.");
 				crucialAdultMark = icons;
 				/*
 				 * Demote the highest uniquely violated constraint in the adult form.
@@ -1585,7 +1577,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 				double constraintStep = step * offendingConstraint -> plasticity;
 				if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - adultMarks;
 				offendingConstraint -> ranking -= /*numberOfUp **/ constraintStep * (1.0 - offendingConstraint -> ranking * my leak);
-				if (grammarHasChanged != NULL) *grammarHasChanged = true;
+				if (grammarHasChanged) *grammarHasChanged = true;
 			}
 		} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_ALL_UP_HIGH_DOWN) {
 			long numberOfDown = 0, numberOfUp = 0, lowestDemotableConstraint = 0;
@@ -1602,8 +1594,8 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 				}
 			}
 			if (warnIfStalled && numberOfDown == 0) {
-				Melder_warning ("Correct output is harmonically bounded (by having strict superset violations as compared to the learner's output)! EDCD stalls.\n"
-					"Input: ", tableau -> input, "\nCorrect output: ", adult -> output, "\nLearner's output: ", winner -> output);
+				Melder_warning (U"Correct output is harmonically bounded (by having strict superset violations as compared to the learner's output)! EDCD stalls.\n"
+					U"Input: ", tableau -> input, U"\nCorrect output: ", adult -> output, U"\nLearner's output: ", winner -> output);
 				return;
 			}
 			if (numberOfUp > 0) {
@@ -1614,7 +1606,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 					int winnerMarks = winner -> marks [constraintIndex];   // the order is important, therefore indirect
 					int adultMarks = adult -> marks [constraintIndex];
 					if (my constraints [constraintIndex]. tiedToTheRight)
-						Melder_throw ("Demotion-only learning cannot handle tied constraints.");
+						Melder_throw (U"Demotion-only learning cannot handle tied constraints.");
 					if (adultMarks < winnerMarks) {
 						if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - adultMarks;
 						constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) * numberOfDown / (numberOfUp + 0.0);
@@ -1625,7 +1617,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 						}
 					}
 				}
-				if (grammarHasChanged != NULL) *grammarHasChanged = true;
+				if (grammarHasChanged) *grammarHasChanged = true;
 			}
 		} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_ALL_UP_HIGH_DOWN_2012) {
 			long numberOfDown = 0, numberOfUp = 0, lowestDemotableConstraint = 0;
@@ -1642,8 +1634,8 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 				}
 			}
 			if (warnIfStalled && numberOfDown == 0) {
-				Melder_warning ("Correct output is harmonically bounded (by having strict superset violations as compared to the learner's output)! EDCD stalls.\n"
-					"Input: ", tableau -> input, "\nCorrect output: ", adult -> output, "\nLearner's output: ", winner -> output);
+				Melder_warning (U"Correct output is harmonically bounded (by having strict superset violations as compared to the learner's output)! EDCD stalls.\n"
+					U"Input: ", tableau -> input, U"\nCorrect output: ", adult -> output, U"\nLearner's output: ", winner -> output);
 				return;
 			}
 			if (numberOfUp > 0) {
@@ -1654,7 +1646,7 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 					int winnerMarks = winner -> marks [constraintIndex];   // the order is important, therefore indirect
 					int adultMarks = adult -> marks [constraintIndex];
 					if (my constraints [constraintIndex]. tiedToTheRight)
-						Melder_throw ("Demotion-only learning cannot handle tied constraints.");
+						Melder_throw (U"Demotion-only learning cannot handle tied constraints.");
 					if (adultMarks < winnerMarks) {
 						if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - adultMarks;
 						constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) * numberOfDown / (numberOfUp + 1.0);
@@ -1665,24 +1657,24 @@ static void OTGrammar_modifyRankings (OTGrammar me, long itab, long iwinner, lon
 						}
 					}
 				}
-				if (grammarHasChanged != NULL) *grammarHasChanged = true;
+				if (grammarHasChanged) *grammarHasChanged = true;
 			}
 		}
 		if (honourLocalRankings && my numberOfFixedRankings) {
 			OTGrammar_honourLocalRankings (me, plasticity, relativePlasticityNoise, grammarHasChanged);
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": rankings not modified.");
+		Melder_throw (me, U": rankings not modified.");
 	}
 }
 
-void OTGrammar_learnOne (OTGrammar me, const wchar_t *input, const wchar_t *adultOutput,
-	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
-	double plasticity, double relativePlasticityNoise, int newDisharmonies, int warnIfStalled, int *grammarHasChanged)
+void OTGrammar_learnOne (OTGrammar me, const char32 *input, const char32 *adultOutput,
+	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
+	double plasticity, double relativePlasticityNoise, bool newDisharmonies, bool warnIfStalled, bool *grammarHasChanged)
 {
 	try {
 		if (newDisharmonies) OTGrammar_newDisharmonies (me, evaluationNoise);
-		if (grammarHasChanged != NULL) *grammarHasChanged = FALSE;
+		if (grammarHasChanged) *grammarHasChanged = false;
 
 		/*
 		 * Evaluate the input in the learner's hypothesis.
@@ -1700,7 +1692,7 @@ void OTGrammar_learnOne (OTGrammar me, const wchar_t *input, const wchar_t *adul
 		/*
 		 * Error-driven: compare the adult winner (the correct candidate) and the learner's winner.
 		 */
-		if (wcsequ (winner -> output, adultOutput)) return;   // as far as we know, the grammar is already correct: don't update rankings
+		if (str32equ (winner -> output, adultOutput)) return;   // as far as we know, the grammar is already correct: don't update rankings
 
 		/*
 		 * Find (perhaps the learner's interpretation of) the adult output in the learner's own tableau
@@ -1709,10 +1701,10 @@ void OTGrammar_learnOne (OTGrammar me, const wchar_t *input, const wchar_t *adul
 		long iadult = 1;
 		for (; iadult <= tableau -> numberOfCandidates; iadult ++) {
 			OTGrammarCandidate cand = & tableau -> candidates [iadult];
-			if (wcsequ (cand -> output, adultOutput)) break;
+			if (str32equ (cand -> output, adultOutput)) break;
 		}
 		if (iadult > tableau -> numberOfCandidates)
-			Melder_throw ("Cannot generate adult output \"", adultOutput, L"\".");
+			Melder_throw (U"Cannot generate adult output \"", adultOutput, U"\".");
 
 		/*
 		 * Now we know that the current hypothesis prefers the (wrong) learner's winner over the (correct) adult output.
@@ -1721,46 +1713,46 @@ void OTGrammar_learnOne (OTGrammar me, const wchar_t *input, const wchar_t *adul
 		OTGrammar_modifyRankings (me, itab, iwinner, iadult, updateRule, honourLocalRankings,
 			plasticity, relativePlasticityNoise, warnIfStalled, grammarHasChanged);
 	} catch (MelderError) {
-		Melder_throw (me, ": not learned from input \"", input, "\" and adult output \"", adultOutput, "\".");
+		Melder_throw (me, U": not learned from input \"", input, U"\" and adult output \"", adultOutput, U"\".");
 	}
 }
 
 void OTGrammar_learn (OTGrammar me, Strings inputs, Strings outputs,
-	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
+	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
 	double plasticity, double relativePlasticityNoise, long numberOfChews)
 {
 	if (! inputs) inputs = outputs;
 	try {
 		long n = inputs -> numberOfStrings;
 		if (outputs -> numberOfStrings != n)
-			Melder_throw ("Numbers of strings in input and output are not equal.");
+			Melder_throw (U"Numbers of strings in input and output are not equal.");
 		for (long i = 1; i <= n; i ++) {
 			for (long ichew = 1; ichew <= numberOfChews; ichew ++) {
 				OTGrammar_learnOne (me, inputs -> strings [i], outputs -> strings [i],
 					evaluationNoise, updateRule, honourLocalRankings,
-					plasticity, relativePlasticityNoise, TRUE, TRUE, NULL);
+					plasticity, relativePlasticityNoise, true, true, nullptr);
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not learned from ", inputs, " (inputs) and ", outputs, " (outputs).");
+		Melder_throw (me, U": not learned from ", inputs, U" (inputs) and ", outputs, U" (outputs).");
 	}
 }
 
 void OTGrammar_PairDistribution_learn (OTGrammar me, PairDistribution thee,
-	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
+	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
 	double initialPlasticity, long replicationsPerPlasticity, double plasticityDecrement,
 	long numberOfPlasticities, double relativePlasticityNoise, long numberOfChews)
 {
 	long idatum = 0, numberOfData = numberOfPlasticities * replicationsPerPlasticity;
 	try {
 		double plasticity = initialPlasticity;
-		autoMelderMonitor monitor (L"Learning with full knowledge...");
+		autoMelderMonitor monitor (U"Learning with full knowledge...");
 		if (monitor.graphics()) {
 			Graphics_clearWs (monitor.graphics());
 		}
 		for (long iplasticity = 1; iplasticity <= numberOfPlasticities; iplasticity ++) {
 			for (long ireplication = 1; ireplication <= replicationsPerPlasticity; ireplication ++) {
-				wchar_t *input, *output;
+				char32 *input, *output;
 				PairDistribution_peekPair (thee, & input, & output);
 				++ idatum;
 				if (monitor.graphics() && idatum % (numberOfData / 400 + 1) == 0) {
@@ -1773,29 +1765,29 @@ void OTGrammar_PairDistribution_learn (OTGrammar me, PairDistribution thee,
 					Graphics_flushWs (monitor.graphics());   // because drawing is faster than progress loop
 				}
 				Melder_monitor ((double) idatum / numberOfData,
-					L"Processing input-output pair ", Melder_integer (idatum),
-					L" out of ", Melder_integer (numberOfData), L": ", input, L" -> ", output);
+					U"Processing input-output pair ", idatum,
+					U" out of ", numberOfData, U": ", input, U" -> ", output);
 				for (long ichew = 1; ichew <= numberOfChews; ichew ++) {
 					OTGrammar_learnOne (me, input, output,
 						evaluationNoise, updateRule, honourLocalRankings,
-						plasticity, relativePlasticityNoise, TRUE, TRUE, NULL);
+						plasticity, relativePlasticityNoise, true, true, nullptr);
 				}
 			}
 			plasticity *= plasticityDecrement;
 		}
 	} catch (MelderError) {
 		if (idatum > 1)
-			Melder_error_ ("Only ", idatum - 1, " input-output pairs out of ", numberOfData, " were processed.");
-		Melder_throw (me, ": did not complete learning from ", thee, ".");
+			Melder_appendError (U"Only ", idatum - 1, U" input-output pairs out of ", numberOfData, U" were processed.");
+		Melder_throw (me, U": did not complete learning from ", thee, U".");
 	}
 }
 
-static long PairDistribution_getNumberOfAttestedOutputs (PairDistribution me, const wchar_t *input, wchar_t **attestedOutput) {
+static long PairDistribution_getNumberOfAttestedOutputs (PairDistribution me, const char32 *input, char32 **attestedOutput) {
 	long result = 0;
 	for (long ipair = 1; ipair <= my pairs -> size; ipair ++) {
 		PairProbability pair = (PairProbability) my pairs -> item [ipair];
-		if (wcsequ (pair -> string1, input) && pair -> weight > 0.0) {
-			if (attestedOutput != NULL) *attestedOutput = pair -> string2;
+		if (str32equ (pair -> string1, input) && pair -> weight > 0.0) {
+			if (attestedOutput) *attestedOutput = pair -> string2;
 			result ++;
 		}
 	}
@@ -1803,7 +1795,7 @@ static long PairDistribution_getNumberOfAttestedOutputs (PairDistribution me, co
 }
 
 bool OTGrammar_PairDistribution_findPositiveWeights_e (OTGrammar me, PairDistribution thee, double weightFloor, double marginOfSeparation) {
-	NUMlinprog linprog = NULL;
+	NUMlinprog linprog = nullptr;
 	try {
 		bool result = false;
 		if (my decisionStrategy != kOTGrammar_decisionStrategy_HARMONIC_GRAMMAR &&
@@ -1811,7 +1803,7 @@ bool OTGrammar_PairDistribution_findPositiveWeights_e (OTGrammar me, PairDistrib
 			my decisionStrategy != kOTGrammar_decisionStrategy_POSITIVE_HG &&
 			my decisionStrategy != kOTGrammar_decisionStrategy_EXPONENTIAL_HG)
 		{
-			Melder_throw ("To find positive weights, the decision strategy has to be HarmonicGrammar, LinearOT, PositiveHG, or ExponentialHG.");
+			Melder_throw (U"To find positive weights, the decision strategy has to be HarmonicGrammar, LinearOT, PositiveHG, or ExponentialHG.");
 		}
 		autoNUMvector <long> optimalCandidates (1, my numberOfTableaus);
 		/*
@@ -1819,17 +1811,17 @@ bool OTGrammar_PairDistribution_findPositiveWeights_e (OTGrammar me, PairDistrib
 		 */
 		for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
 			OTGrammarTableau tab = & my tableaus [itab];
-			wchar_t *attestedOutput = NULL;
+			char32 *attestedOutput = nullptr;
 			long numberOfAttestedOutputs = PairDistribution_getNumberOfAttestedOutputs (thee, tab -> input, & attestedOutput);
 			if (numberOfAttestedOutputs == 0) {
-				Melder_throw ("Input \"", my tableaus [itab]. input, "\" has no attested output.");
+				Melder_throw (U"Input \"", my tableaus [itab]. input, U"\" has no attested output.");
 			} else if (numberOfAttestedOutputs > 1) {
-				Melder_throw ("Input \"", my tableaus [itab]. input, "\" has more than one attested output.");
+				Melder_throw (U"Input \"", my tableaus [itab]. input, U"\" has more than one attested output.");
 			} else {
-				Melder_assert (attestedOutput != NULL);
+				Melder_assert (attestedOutput);
 				for (long icand = 1; icand <= tab -> numberOfCandidates; icand ++) {
 					OTGrammarCandidate cand = & tab -> candidates [icand];
-					if (wcsequ (attestedOutput, cand -> output)) {
+					if (str32equ (attestedOutput, cand -> output)) {
 						optimalCandidates [itab] = icand;
 					}
 				}
@@ -1868,7 +1860,7 @@ bool OTGrammar_PairDistribution_findPositiveWeights_e (OTGrammar me, PairDistrib
 		return result;
 	} catch (MelderError) {
 		NUMlinprog_delete (linprog);
-		Melder_throw (me, ": positive weights not found.");
+		Melder_throw (me, U": positive weights not found.");
 	}
 }
 
@@ -1910,22 +1902,22 @@ void OTGrammar_resetToRandomTotalRanking (OTGrammar me, double maximumRanking, d
 void OTGrammar_setRanking (OTGrammar me, long constraint, double ranking, double disharmony) {
 	try {
 		if (constraint < 1 || constraint > my numberOfConstraints)
-			Melder_throw ("There is no constraint with number ", constraint, ".");
+			Melder_throw (U"There is no constraint with number ", constraint, U".");
 		my constraints [constraint]. ranking = ranking;
 		my constraints [constraint]. disharmony = disharmony;
 		OTGrammar_sort (me);
 	} catch (MelderError) {
-		Melder_throw (me, ": ranking of constraint ", constraint, " not set.");
+		Melder_throw (me, U": ranking of constraint ", constraint, U" not set.");
 	}
 }
 
 void OTGrammar_setConstraintPlasticity (OTGrammar me, long constraint, double plasticity) {
 	try {
 		if (constraint < 1 || constraint > my numberOfConstraints)
-			Melder_throw ("There is no constraint with number ", constraint, ".");
+			Melder_throw (U"There is no constraint with number ", constraint, U".");
 		my constraints [constraint]. plasticity = plasticity;
 	} catch (MelderError) {
-		Melder_throw (me, ": plasticity of constraint ", constraint, " not set.");
+		Melder_throw (me, U": plasticity of constraint ", constraint, U" not set.");
 	}
 }
 
@@ -1934,18 +1926,18 @@ double *theSaveRankings, *theSaveDisharmonies;
 int *theSaveTiedToTheLeft, *theSaveTiedToTheRight;
 static void OTGrammar_save (OTGrammar me) {
 	if (my numberOfConstraints != theSaveNumberOfConstraints) {
-		NUMvector_free (theSaveIndex, 1); theSaveIndex = NULL;
-		NUMvector_free (theSaveRankings, 1); theSaveRankings = NULL;
-		NUMvector_free (theSaveDisharmonies, 1); theSaveDisharmonies = NULL;
-		NUMvector_free (theSaveTiedToTheLeft, 1); theSaveTiedToTheLeft = NULL;
-		NUMvector_free (theSaveTiedToTheRight, 1); theSaveTiedToTheRight = NULL;
+		NUMvector_free (theSaveIndex, 1); theSaveIndex = nullptr;
+		NUMvector_free (theSaveRankings, 1); theSaveRankings = nullptr;
+		NUMvector_free (theSaveDisharmonies, 1); theSaveDisharmonies = nullptr;
+		NUMvector_free (theSaveTiedToTheLeft, 1); theSaveTiedToTheLeft = nullptr;
+		NUMvector_free (theSaveTiedToTheRight, 1); theSaveTiedToTheRight = nullptr;
 		theSaveNumberOfConstraints = my numberOfConstraints;
 	}
-	if (theSaveIndex == NULL) theSaveIndex = NUMvector <long> (1, my numberOfConstraints);
-	if (theSaveRankings == NULL) theSaveRankings = NUMvector <double> (1, my numberOfConstraints);
-	if (theSaveDisharmonies == NULL) theSaveDisharmonies = NUMvector <double> (1, my numberOfConstraints);
-	if (theSaveTiedToTheLeft == NULL) theSaveTiedToTheLeft = NUMvector <int> (1, my numberOfConstraints);
-	if (theSaveTiedToTheRight == NULL) theSaveTiedToTheRight = NUMvector <int> (1, my numberOfConstraints);
+	if (! theSaveIndex) theSaveIndex = NUMvector <long> (1, my numberOfConstraints);
+	if (! theSaveRankings) theSaveRankings = NUMvector <double> (1, my numberOfConstraints);
+	if (! theSaveDisharmonies) theSaveDisharmonies = NUMvector <double> (1, my numberOfConstraints);
+	if (! theSaveTiedToTheLeft) theSaveTiedToTheLeft = NUMvector <int> (1, my numberOfConstraints);
+	if (! theSaveTiedToTheRight) theSaveTiedToTheRight = NUMvector <int> (1, my numberOfConstraints);
 	for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 		theSaveIndex [icons] = my index [icons];
 		theSaveRankings [icons] = my constraints [icons]. ranking;
@@ -1964,9 +1956,9 @@ static void OTGrammar_restore (OTGrammar me) {
 	}
 }
 
-void OTGrammar_learnOneFromPartialOutput (OTGrammar me, const wchar_t *partialAdultOutput,
-	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
-	double plasticity, double relativePlasticityNoise, long numberOfChews, int warnIfStalled)
+void OTGrammar_learnOneFromPartialOutput (OTGrammar me, const char32 *partialAdultOutput,
+	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
+	double plasticity, double relativePlasticityNoise, long numberOfChews, bool warnIfStalled)
 {
 	try {
 		OTGrammar_newDisharmonies (me, evaluationNoise);
@@ -1977,7 +1969,7 @@ void OTGrammar_learnOneFromPartialOutput (OTGrammar me, const wchar_t *partialAd
 		for (; ichew <= numberOfChews; ichew ++) {
 			long assumedAdultInputTableau, assumedAdultCandidate;
 			OTGrammar_getInterpretiveParse (me, partialAdultOutput, & assumedAdultInputTableau, & assumedAdultCandidate);
-			int grammarHasChanged;
+			bool grammarHasChanged = false;
 			OTGrammar_learnOne (me,
 				my tableaus [assumedAdultInputTableau]. input,
 				my tableaus [assumedAdultInputTableau]. candidates [assumedAdultCandidate]. output,
@@ -1992,7 +1984,7 @@ void OTGrammar_learnOneFromPartialOutput (OTGrammar me, const wchar_t *partialAd
 			long assumedAdultInputTableau, assumedAdultCandidate;
 			OTGrammar_getInterpretiveParse (me, partialAdultOutput, & assumedAdultInputTableau, & assumedAdultCandidate);
 			OTGrammarCandidate learnerCandidate = & my tableaus [assumedAdultInputTableau]. candidates [OTGrammar_getWinner (me, assumedAdultInputTableau)];
-			if (! wcsequ (learnerCandidate -> output,
+			if (! str32equ (learnerCandidate -> output,
 				my tableaus [assumedAdultInputTableau]. candidates [assumedAdultCandidate]. output))
 			{   /* Still ungrammatical? */
 				/*
@@ -2002,13 +1994,13 @@ void OTGrammar_learnOneFromPartialOutput (OTGrammar me, const wchar_t *partialAd
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not learned from partial adult output \"", partialAdultOutput, "\".");
+		Melder_throw (me, U": not learned from partial adult output \"", partialAdultOutput, U"\".");
 	}
 }
 
-static void OTGrammar_learnOneFromPartialOutput_opt (OTGrammar me, const wchar_t *partialAdultOutput, long ipartialAdultOutput,
-	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
-	double plasticity, double relativePlasticityNoise, long numberOfChews, int warnIfStalled,
+static void OTGrammar_learnOneFromPartialOutput_opt (OTGrammar me, const char32 *partialAdultOutput, long ipartialAdultOutput,
+	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
+	double plasticity, double relativePlasticityNoise, long numberOfChews, bool warnIfStalled,
 	bool resampleForVirtualProduction, bool compareOnlyPartialOutput, long resampleForCorrectForm)
 {
 	try {
@@ -2035,9 +2027,9 @@ static void OTGrammar_learnOneFromPartialOutput_opt (OTGrammar me, const wchar_t
 			 * Error-driven: compare the adult winner (the correct candidate) and the learner's winner.
 			 */
 			if (compareOnlyPartialOutput) {
-				if (wcsstr (winner -> output, partialAdultOutput)) return;   // as far as we know, the grammar is already correct: don't update rankings
+				if (str32str (winner -> output, partialAdultOutput)) return;   // as far as we know, the grammar is already correct: don't update rankings
 			} else {
-				if (wcsequ (winner -> output, assumedCorrect -> output)) return;   // as far as we know, the grammar is already correct: don't update rankings
+				if (str32equ (winner -> output, assumedCorrect -> output)) return;   // as far as we know, the grammar is already correct: don't update rankings
 			}
 			if (resampleForCorrectForm) {
 				long itry = 1;
@@ -2046,9 +2038,9 @@ static void OTGrammar_learnOneFromPartialOutput_opt (OTGrammar me, const wchar_t
 					long iwinner2 = OTGrammar_getWinner (me, assumedAdultInputTableau);
 					OTGrammarCandidate winner2 = & tableau -> candidates [iwinner2];
 					if (compareOnlyPartialOutput) {
-						if (wcsstr (winner2 -> output, partialAdultOutput)) { assumedAdultCandidate = iwinner2; break; }
+						if (str32str (winner2 -> output, partialAdultOutput)) { assumedAdultCandidate = iwinner2; break; }
 					} else {
-						if (wcsequ (winner2 -> output, assumedCorrect -> output)) { assumedAdultCandidate = iwinner2; break; }
+						if (str32equ (winner2 -> output, assumedCorrect -> output)) { assumedAdultCandidate = iwinner2; break; }
 					}
 				}
 				if (itry > resampleForCorrectForm) return;   // no match, so bail out
@@ -2058,7 +2050,7 @@ static void OTGrammar_learnOneFromPartialOutput_opt (OTGrammar me, const wchar_t
 			 * Now we know that the current hypothesis prefers the (wrong) learner's winner over the (correct) adult output.
 			 * The grammar will have to change.
 			 */
-			int grammarHasChanged = FALSE;
+			bool grammarHasChanged = false;
 			OTGrammar_modifyRankings (me, assumedAdultInputTableau, iwinner, assumedAdultCandidate, updateRule, honourLocalRankings,
 				plasticity, relativePlasticityNoise, warnIfStalled, & grammarHasChanged);
 			if (! grammarHasChanged) return;
@@ -2070,7 +2062,7 @@ static void OTGrammar_learnOneFromPartialOutput_opt (OTGrammar me, const wchar_t
 			long assumedAdultInputTableau, assumedAdultCandidate;
 			OTGrammar_getInterpretiveParse_opt (me, ipartialAdultOutput, & assumedAdultInputTableau, & assumedAdultCandidate);
 			OTGrammarCandidate learnerCandidate = & my tableaus [assumedAdultInputTableau]. candidates [OTGrammar_getWinner (me, assumedAdultInputTableau)];
-			if (! wcsequ (learnerCandidate -> output,
+			if (! str32equ (learnerCandidate -> output,
 				my tableaus [assumedAdultInputTableau]. candidates [assumedAdultCandidate]. output))
 			{   /* Still ungrammatical? */
 				/*
@@ -2080,7 +2072,7 @@ static void OTGrammar_learnOneFromPartialOutput_opt (OTGrammar me, const wchar_t
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not learned from partial adult output ", partialAdultOutput, ".");
+		Melder_throw (me, U": not learned from partial adult output ", partialAdultOutput, U".");
 	}
 }
 
@@ -2089,22 +2081,22 @@ static OTHistory OTGrammar_createHistory (OTGrammar me, long storeHistoryEvery,
 		long numberOfSamplingPoints = numberOfData / storeHistoryEvery, icons;   // e.g. 0, 20, 40, ...
 		autoOTHistory thee = Thing_new (OTHistory);
 		TableOfReal_init (thee.peek(), 2 + numberOfSamplingPoints * 2, 1 + my numberOfConstraints);
-		TableOfReal_setColumnLabel (thee.peek(), 1, L"Datum");
+		TableOfReal_setColumnLabel (thee.peek(), 1, U"Datum");
 		for (icons = 1; icons <= my numberOfConstraints; icons ++) {
 			TableOfReal_setColumnLabel (thee.peek(), icons + 1, my constraints [icons]. name);
 		}
-		TableOfReal_setRowLabel (thee.peek(), 1, L"Initial state");
+		TableOfReal_setRowLabel (thee.peek(), 1, U"Initial state");
 		thy data [1] [1] = 0;
 		for (icons = 1; icons <= my numberOfConstraints; icons ++) {
 			thy data [1] [icons + 1] = my constraints [icons]. ranking;
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": history not created.");
+		Melder_throw (me, U": history not created.");
 	}
 }
 
-static void OTGrammar_updateHistory (OTGrammar me, OTHistory thee, long storeHistoryEvery, long idatum, const wchar_t *input) {
+static void OTGrammar_updateHistory (OTGrammar me, OTHistory thee, long storeHistoryEvery, long idatum, const char32 *input) {
 	try {
 		if (idatum % storeHistoryEvery == 0) {
 			long irow = 2 * idatum / storeHistoryEvery;
@@ -2117,24 +2109,24 @@ static void OTGrammar_updateHistory (OTGrammar me, OTHistory thee, long storeHis
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": history not updated.");
+		Melder_throw (me, U": history not updated.");
 	}
 }
 
 static void OTGrammar_finalizeHistory (OTGrammar me, OTHistory thee, long idatum) {
 	try {
-		TableOfReal_setRowLabel (thee, thy numberOfRows, L"Final state");
+		TableOfReal_setRowLabel (thee, thy numberOfRows, U"Final state");
 		thy data [thy numberOfRows] [1] = idatum;
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			thy data [thy numberOfRows] [icons + 1] = my constraints [icons]. ranking;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": history not finalized.");
+		Melder_throw (me, U": history not finalized.");
 	}
 }
 
 void OTGrammar_learnFromPartialOutputs (OTGrammar me, Strings partialOutputs,
-	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
+	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
 	double plasticity, double relativePlasticityNoise, long numberOfChews,
 	long storeHistoryEvery, OTHistory *history_out)
 {
@@ -2148,7 +2140,7 @@ void OTGrammar_learnFromPartialOutputs (OTGrammar me, Strings partialOutputs,
 				try {
 					OTGrammar_learnOneFromPartialOutput (me, partialOutputs -> strings [idatum],
 						evaluationNoise, updateRule, honourLocalRankings,
-						plasticity, relativePlasticityNoise, numberOfChews, FALSE);
+						plasticity, relativePlasticityNoise, numberOfChews, false);
 				} catch (MelderError) {
 					if (history.peek()) {
 						OTGrammar_updateHistory (me, history.peek(), storeHistoryEvery, idatum, partialOutputs -> strings [idatum]);   // so that we can inspect
@@ -2168,7 +2160,7 @@ void OTGrammar_learnFromPartialOutputs (OTGrammar me, Strings partialOutputs,
 			throw;
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not learned from partial outputs ", partialOutputs, ".");
+		Melder_throw (me, U": not learned from partial outputs ", partialOutputs, U".");
 	}
 }
 
@@ -2179,7 +2171,7 @@ static void OTGrammar_opt_deleteOutputMatching (OTGrammar me) {
 			OTGrammarCandidate cand = & tab -> candidates [icand];
 			cand -> numberOfPotentialPartialOutputsMatching = 0;
 			NUMvector_free (cand -> partialOutputMatches, 1);
-			cand -> partialOutputMatches = NULL;
+			cand -> partialOutputMatches = nullptr;
 		}
 	}
 }
@@ -2187,9 +2179,9 @@ static void OTGrammar_opt_deleteOutputMatching (OTGrammar me) {
 static void OTGrammar_Distributions_opt_createOutputMatching (OTGrammar me, Distributions thee, long columnNumber) {
 	try {
 		if (columnNumber > thy numberOfColumns)
-			Melder_throw ("No column ", columnNumber, " in Distributions.");
+			Melder_throw (U"No column ", columnNumber, U" in Distributions.");
 		if (thy numberOfRows < 1)
-			Melder_throw ("No candidates in Distributions.");
+			Melder_throw (U"No candidates in Distributions.");
 		for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
 			OTGrammarTableau tab = & my tableaus [itab];
 			for (long icand = 1; icand <= tab -> numberOfCandidates; icand ++) {
@@ -2200,20 +2192,20 @@ static void OTGrammar_Distributions_opt_createOutputMatching (OTGrammar me, Dist
 		}
 		for (long ipartialOutput = 1; ipartialOutput <= thy numberOfRows; ipartialOutput ++) {
 			if (thy data [ipartialOutput] [columnNumber] > 0.0) {
-				wchar_t *partialOutput = thy rowLabels [ipartialOutput];
+				char32 *partialOutput = thy rowLabels [ipartialOutput];
 				bool foundPartialOutput = false;
 				for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
 					OTGrammarTableau tab = & my tableaus [itab];
 					for (long icand = 1; icand <= tab -> numberOfCandidates; icand ++) {
 						OTGrammarCandidate cand = & tab -> candidates [icand];
-						if (wcsstr (cand -> output, partialOutput)) {
+						if (str32str (cand -> output, partialOutput)) {
 							foundPartialOutput = true;
 							cand -> partialOutputMatches [ipartialOutput] = true;
 						}
 					}
 				}
 				if (! foundPartialOutput)
-					Melder_throw ("The partial output \"", partialOutput, "\" does not match any candidate for any input form.");
+					Melder_throw (U"The partial output \"", partialOutput, U"\" does not match any candidate for any input form.");
 			}
 		}
 	} catch (MelderError) {
@@ -2223,7 +2215,7 @@ static void OTGrammar_Distributions_opt_createOutputMatching (OTGrammar me, Dist
 }
 
 void OTGrammar_Distributions_learnFromPartialOutputs (OTGrammar me, Distributions thee, long columnNumber,
-	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
+	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
 	double initialPlasticity, long replicationsPerPlasticity, double plasticityDecrement,
 	long numberOfPlasticities, double relativePlasticityNoise, long numberOfChews,
 	long storeHistoryEvery, OTHistory *history_out,
@@ -2234,7 +2226,7 @@ void OTGrammar_Distributions_learnFromPartialOutputs (OTGrammar me, Distribution
 	try {
 		autoOTHistory history;
 		OTGrammar_Distributions_opt_createOutputMatching (me, thee, columnNumber);
-		autoMelderMonitor monitor (L"Learning with limited knowledge...");
+		autoMelderMonitor monitor (U"Learning with limited knowledge...");
 		if (monitor.graphics()) {
 			Graphics_clearWs (monitor.graphics());
 		}
@@ -2245,7 +2237,7 @@ void OTGrammar_Distributions_learnFromPartialOutputs (OTGrammar me, Distribution
 			double plasticity = initialPlasticity;
 			for (long iplasticity = 1; iplasticity <= numberOfPlasticities; iplasticity ++) {
 				for (long ireplication = 1; ireplication <= replicationsPerPlasticity; ireplication ++) {
-					wchar_t *partialOutput;
+					char32 *partialOutput;
 					long ipartialOutput;
 					Distributions_peek (thee, columnNumber, & partialOutput, & ipartialOutput);
 					++ idatum;
@@ -2259,12 +2251,12 @@ void OTGrammar_Distributions_learnFromPartialOutputs (OTGrammar me, Distribution
 						Graphics_flushWs (monitor.graphics());   /* Because drawing is faster than progress loop. */
 					}
 					Melder_monitor ((double) idatum / numberOfData,
-						L"Processing partial output ", Melder_integer (idatum), L" out of ", Melder_integer (numberOfData), L": ",
+						U"Processing partial output ", idatum, U" out of ", numberOfData, U": ",
 						thy rowLabels [ipartialOutput]);
 					try {
 						OTGrammar_learnOneFromPartialOutput_opt (me, partialOutput, ipartialOutput,
 							evaluationNoise, updateRule, honourLocalRankings,
-							plasticity, relativePlasticityNoise, numberOfChews, FALSE,
+							plasticity, relativePlasticityNoise, numberOfChews, false,
 							resampleForVirtualProduction, compareOnlyPartialOutput, resampleForCorrectForm);   // no warning if stalled: RIP form is allowed to be harmonically bounded
 					} catch (MelderError) {
 						if (history.peek()) {
@@ -2292,8 +2284,8 @@ void OTGrammar_Distributions_learnFromPartialOutputs (OTGrammar me, Distribution
 		}
 	} catch (MelderError) {
 		if (idatum > 1)
-			Melder_error_ ("Only ", idatum - 1, " input-output pairs out of ", numberOfData, " were processed.");
-		Melder_throw (me, " & ", thee, ": not learned from partial outputs.");
+			Melder_appendError (U"Only ", idatum - 1, U" input-output pairs out of ", numberOfData, U" were processed.");
+		Melder_throw (me, U" & ", thee, U": not learned from partial outputs.");
 	}
 }
 
@@ -2303,17 +2295,17 @@ double OTGrammar_PairDistribution_getFractionCorrect (OTGrammar me, PairDistribu
 	try {
 		long numberOfCorrect = 0;
 		for (long ireplication = 1; ireplication <= numberOfInputs; ireplication ++) {
-			wchar_t *input, *adultOutput;
+			char32 *input, *adultOutput;
 			PairDistribution_peekPair (thee, & input, & adultOutput);
 			OTGrammar_newDisharmonies (me, evaluationNoise);
 			long inputTableau = OTGrammar_getTableau (me, input);
 			OTGrammarCandidate learnerCandidate = & my tableaus [inputTableau]. candidates [OTGrammar_getWinner (me, inputTableau)];
-			if (wcsequ (learnerCandidate -> output, adultOutput))
+			if (str32equ (learnerCandidate -> output, adultOutput))
 				numberOfCorrect ++;
 		}
 		return (double) numberOfCorrect / numberOfInputs;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": fraction correct not computed.");
+		Melder_throw (me, U" & ", thee, U": fraction correct not computed.");
 	}
 }
 
@@ -2326,12 +2318,12 @@ long OTGrammar_PairDistribution_getMinimumNumberCorrect (OTGrammar me, PairDistr
 			PairProbability prob = (PairProbability) thy pairs -> item [ipair];
 			if (prob -> weight > 0.0) {
 				long numberOfCorrect = 0;
-				wchar_t *input = prob -> string1, *adultOutput = prob -> string2;
+				char32 *input = prob -> string1, *adultOutput = prob -> string2;
 				long inputTableau = OTGrammar_getTableau (me, input);
 				for (long ireplication = 1; ireplication <= numberOfReplications; ireplication ++) {
 					OTGrammar_newDisharmonies (me, evaluationNoise);
 					OTGrammarCandidate learnerCandidate = & my tableaus [inputTableau]. candidates [OTGrammar_getWinner (me, inputTableau)];
-					if (wcsequ (learnerCandidate -> output, adultOutput))
+					if (str32equ (learnerCandidate -> output, adultOutput))
 						numberOfCorrect ++;
 				}
 				if (numberOfCorrect < minimumNumberCorrect)
@@ -2340,7 +2332,7 @@ long OTGrammar_PairDistribution_getMinimumNumberCorrect (OTGrammar me, PairDistr
 		}
 		return minimumNumberCorrect;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": minimum number correct not computed.");
+		Melder_throw (me, U" & ", thee, U": minimum number correct not computed.");
 	}
 }
 
@@ -2352,40 +2344,40 @@ double OTGrammar_Distributions_getFractionCorrect (OTGrammar me, Distributions t
 		OTGrammar_Distributions_opt_createOutputMatching (me, thee, columnNumber);
 		for (long ireplication = 1; ireplication <= numberOfInputs; ireplication ++) {
 			long ipartialOutput;
-			Distributions_peek (thee, columnNumber, NULL, & ipartialOutput);
+			Distributions_peek (thee, columnNumber, nullptr, & ipartialOutput);
 			OTGrammar_newDisharmonies (me, evaluationNoise);
 			long assumedAdultInputTableau, assumedAdultCandidate;
 			OTGrammar_getInterpretiveParse_opt (me, ipartialOutput, & assumedAdultInputTableau, & assumedAdultCandidate);
 			OTGrammarCandidate learnerCandidate = & my tableaus [assumedAdultInputTableau]. candidates [OTGrammar_getWinner (me, assumedAdultInputTableau)];
-			if (wcsequ (learnerCandidate -> output, my tableaus [assumedAdultInputTableau]. candidates [assumedAdultCandidate]. output))
+			if (str32equ (learnerCandidate -> output, my tableaus [assumedAdultInputTableau]. candidates [assumedAdultCandidate]. output))
 				numberOfCorrect ++;
 		}
 		OTGrammar_opt_deleteOutputMatching (me);
 		return (double) numberOfCorrect / numberOfInputs;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": fraction correct not computed.");
+		Melder_throw (me, U" & ", thee, U": fraction correct not computed.");
 	}
 }
 
-void OTGrammar_removeConstraint (OTGrammar me, const wchar_t *constraintName) {
+void OTGrammar_removeConstraint (OTGrammar me, const char32 *constraintName) {
 	try {
 		long removed = 0;
 
 		if (my numberOfConstraints <= 1)
-			Melder_throw ("Cannot remove last remaining constraint.");
+			Melder_throw (U"Cannot remove last remaining constraint.");
 
 		/*
 		 * Look for the constraint to be removed.
 		 */
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			OTGrammarConstraint constraint = & my constraints [icons];
-			if (wcsequ (constraint -> name, constraintName)) {
+			if (str32equ (constraint -> name, constraintName)) {
 				removed = icons;
 				break;
 			}
 		}
 		if (removed == 0)
-			Melder_throw ("No such constraint.");
+			Melder_throw (U"No such constraint.");
 		/*
 		 * Remove the constraint while reusing the memory space.
 		 */
@@ -2409,7 +2401,7 @@ void OTGrammar_removeConstraint (OTGrammar me, const wchar_t *constraintName) {
 				my numberOfFixedRankings -= 1;
 				if (my numberOfFixedRankings == 0) {
 					NUMvector_free <structOTGrammarFixedRanking> (my fixedRankings, 1);
-					my fixedRankings = NULL;
+					my fixedRankings = nullptr;
 				}
 				for (long jfixed = ifixed; jfixed <= my numberOfFixedRankings; jfixed ++) {
 					my fixedRankings [jfixed] = my fixedRankings [jfixed + 1];
@@ -2441,13 +2433,13 @@ void OTGrammar_removeConstraint (OTGrammar me, const wchar_t *constraintName) {
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) my index [icons] = icons;
 		OTGrammar_sort (me);
 	} catch (MelderError) {
-		Melder_throw (me, ": constraint \"", constraintName, "\" not removed.");
+		Melder_throw (me, U": constraint \"", constraintName, U"\" not removed.");
 	}
 }
 
 static void OTGrammarTableau_removeCandidate_unstripped (OTGrammarTableau me, long candidateNumber) {
 	Melder_assert (candidateNumber >= 1);
-	if (candidateNumber > my numberOfCandidates) Melder_fatal ("icand %ld, ncand %ld", candidateNumber, my numberOfCandidates);
+	if (candidateNumber > my numberOfCandidates) Melder_fatal (U"icand ", candidateNumber, U", ncand ", my numberOfCandidates);
 	/*
 	 * Free up memory associated with this candidate.
 	 */
@@ -2483,14 +2475,14 @@ static bool OTGrammarTableau_candidateIsPossibleWinner (OTGrammar me, long itab,
 	OTGrammar_save (me);
 	OTGrammar_reset (me, 100.0);
 	for (;;) {
-		int grammarHasChanged;
-		double previousStratum = 101.0;
+		bool grammarHasChanged = false;
 		OTGrammar_learnOne (me, my tableaus [itab]. input, my tableaus [itab]. candidates [icand]. output,
-			1e-3, kOTGrammar_rerankingStrategy_EDCD, FALSE, 1.0, 0.0, TRUE, TRUE, & grammarHasChanged);
+			1e-3, kOTGrammar_rerankingStrategy_EDCD, false, 1.0, 0.0, true, true, & grammarHasChanged);
 		if (! grammarHasChanged) {
 			OTGrammar_restore (me);
 			return true;
 		}
+		double previousStratum = 101.0;
 		OTGrammar_newDisharmonies (me, 0.0);
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			double stratum = my constraints [my index [icons]]. ranking;
@@ -2510,10 +2502,10 @@ static bool OTGrammarTableau_candidateIsPossibleWinner (OTGrammar me, long itab,
 			#endif
 		}
 	}
-	return false;   /* Cannot occur. */
+	return false;   // cannot occur
 }
 
-void OTGrammar_removeHarmonicallyBoundedCandidates (OTGrammar me, int singly) {
+void OTGrammar_removeHarmonicallyBoundedCandidates (OTGrammar me, bool singly) {
 	try {
 		/*
 		 * First, the candidates that are harmonically bounded by one or more single other candidates have to be removed;
@@ -2543,30 +2535,30 @@ void OTGrammar_removeHarmonicallyBoundedCandidates (OTGrammar me, int singly) {
 			}	
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": not all harmonically bounded candidates were removed.");
+		Melder_throw (me, U": not all harmonically bounded candidates were removed.");
 	}
 }
 
-Thing_define (OTGrammar_List4, Data) {
+Thing_define (OTGrammar_List4, Daata) {
 	// new data:
 	public:
 		long hi1, lo1, hi2, lo2;
 };
 
-Thing_implement (OTGrammar_List4, Data, 0);
+Thing_implement (OTGrammar_List4, Daata, 0);
 
 void OTGrammar_PairDistribution_listObligatoryRankings (OTGrammar me, PairDistribution thee) {
 	/*
 	 * Save.
 	 */
 	OTGrammarFixedRanking savedFixedRankings = my fixedRankings;   // dangle...
-	my fixedRankings = NULL;   // ...undangle
+	my fixedRankings = nullptr;   // ...undangle
 	long savedNumberOfFixedRankings = my numberOfFixedRankings;
 	OTGrammar_save (me);
 	try {
 		long ifixedRanking, icons, jcons, kcons, lcons, ipair = 0, npair = my numberOfConstraints * (my numberOfConstraints - 1);
 		long ilist, jlist, itrial, iform;
-		int improved;
+		bool improved;
 		double evaluationNoise = 1e-9;
 		/*
 		 * Add room for two more fixed rankings.
@@ -2581,16 +2573,16 @@ void OTGrammar_PairDistribution_listObligatoryRankings (OTGrammar me, PairDistri
 		 */
 		OTGrammar_reset (me, 100.0);
 		for (itrial = 1; itrial <= 40; itrial ++) {
-			int grammarHasChangedDuringCycle = FALSE;
+			bool grammarHasChangedDuringCycle = false;
 			OTGrammar_honourLocalRankings (me, 1.0, 0.0, & grammarHasChangedDuringCycle);
 			OTGrammar_newDisharmonies (me, evaluationNoise);
 			for (iform = 1; iform <= thy pairs -> size; iform ++) {
 				PairProbability prob = (PairProbability) thy pairs -> item [iform];
 				if (prob -> weight > 0.0) {
-					int grammarHasChanged;
+					bool grammarHasChanged = false;
 					OTGrammar_learnOne (me, prob -> string1, prob -> string2,
-						evaluationNoise, kOTGrammar_rerankingStrategy_EDCD, TRUE /* honour fixed rankings; very important */,
-						1.0, 0.0, FALSE, TRUE, & grammarHasChanged);
+						evaluationNoise, kOTGrammar_rerankingStrategy_EDCD, true /* honour fixed rankings; very important */,
+						1.0, 0.0, false, true, & grammarHasChanged);
 					if (grammarHasChanged) {
 						OTGrammar_newDisharmonies (me, evaluationNoise);
 					}
@@ -2600,35 +2592,35 @@ void OTGrammar_PairDistribution_listObligatoryRankings (OTGrammar me, PairDistri
 			if (! grammarHasChangedDuringCycle) break;
 		}
 		if (itrial > 40) {
-			MelderInfo_writeLine (L"There are no total rankings that generate these input-output pairs.");
+			MelderInfo_writeLine (U"There are no total rankings that generate these input-output pairs.");
 			throw MelderError ();
 		}
 		/*
 		 * Test learnability of every possible ranked pair.
 		 */
 		my numberOfFixedRankings ++;
-		autoNUMmatrix <int> obligatory (1, my numberOfConstraints, 1, my numberOfConstraints);
+		autoNUMmatrix <bool> obligatory (1, my numberOfConstraints, 1, my numberOfConstraints);
 		MelderInfo_open ();
-		autoMelderProgress progress (L"Finding obligatory rankings.");
+		autoMelderProgress progress (U"Finding obligatory rankings.");
 		for (icons = 1; icons <= my numberOfConstraints; icons ++) {
 			for (jcons = 1; jcons <= my numberOfConstraints; jcons ++) if (icons != jcons) {
 				my fixedRankings [my numberOfFixedRankings]. higher = icons;
 				my fixedRankings [my numberOfFixedRankings]. lower = jcons;
 				OTGrammar_reset (me, 100.0);
-				Melder_progress ((double) ipair / npair, Melder_integer (ipair + 1), L"/", Melder_integer (npair), L": Trying ranking ",
-					my constraints [icons]. name, L" >> ", my constraints [jcons]. name);
+				Melder_progress ((double) ipair / npair, ipair + 1, U"/", npair, U": Trying ranking ",
+					my constraints [icons]. name, U" >> ", my constraints [jcons]. name);
 				ipair ++;
 				for (itrial = 1; itrial <= 40; itrial ++) {
-					int grammarHasChangedDuringCycle = FALSE;
+					bool grammarHasChangedDuringCycle = false;
 					OTGrammar_honourLocalRankings (me, 1.0, 0.0, & grammarHasChangedDuringCycle);
 					OTGrammar_newDisharmonies (me, evaluationNoise);
 					for (iform = 1; iform <= thy pairs -> size; iform ++) {
 						PairProbability prob = (PairProbability) thy pairs -> item [iform];
 						if (prob -> weight > 0.0) {
-							int grammarHasChanged;
+							bool grammarHasChanged = false;
 							OTGrammar_learnOne (me, prob -> string1, prob -> string2,
-								evaluationNoise, kOTGrammar_rerankingStrategy_EDCD, TRUE /* honour fixed rankings; very important */,
-								1.0, 0.0, FALSE, TRUE, & grammarHasChanged);
+								evaluationNoise, kOTGrammar_rerankingStrategy_EDCD, true /* honour fixed rankings; very important */,
+								1.0, 0.0, false, true, & grammarHasChanged);
 							if (grammarHasChanged) {
 								OTGrammar_newDisharmonies (me, evaluationNoise);
 							}
@@ -2638,14 +2630,14 @@ void OTGrammar_PairDistribution_listObligatoryRankings (OTGrammar me, PairDistri
 					if (! grammarHasChangedDuringCycle) break;
 				}
 				if (itrial > 40) {
-					obligatory [jcons] [icons] = TRUE;
-					MelderInfo_writeLine (my constraints [jcons]. name, L" >> ", my constraints [icons]. name);
+					obligatory [jcons] [icons] = true;
+					MelderInfo_writeLine (my constraints [jcons]. name, U" >> ", my constraints [icons]. name);
 					MelderInfo_close ();
 				}
 			}
 		}
 		my numberOfFixedRankings ++;
-		Melder_progress (0.0, L"");
+		Melder_progress (0.0, U"");
 		npair = npair * npair;
 		autoOrdered list = Ordered_create ();
 		for (icons = 1; icons <= my numberOfConstraints; icons ++) {
@@ -2662,19 +2654,19 @@ void OTGrammar_PairDistribution_listObligatoryRankings (OTGrammar me, PairDistri
 						my fixedRankings [my numberOfFixedRankings]. higher = kcons;
 						my fixedRankings [my numberOfFixedRankings]. lower = lcons;
 						OTGrammar_reset (me, 100.0);
-						Melder_progress ((double) ipair / npair, Melder_integer (ipair + 1), L"/", Melder_integer (npair));
+						Melder_progress ((double) ipair / npair, ipair + 1, U"/", npair);
 						ipair ++;
 						for (itrial = 1; itrial <= 40; itrial ++) {
-							int grammarHasChangedDuringCycle = FALSE;
+							bool grammarHasChangedDuringCycle = false;
 							OTGrammar_honourLocalRankings (me, 1.0, 0.0, & grammarHasChangedDuringCycle);
 							OTGrammar_newDisharmonies (me, evaluationNoise);
 							for (iform = 1; iform <= thy pairs -> size; iform ++) {
 								PairProbability prob = (PairProbability) thy pairs -> item [iform];
 								if (prob -> weight > 0.0) {
-									int grammarHasChanged;
+									bool grammarHasChanged = false;
 									OTGrammar_learnOne (me, prob -> string1, prob -> string2,
-										evaluationNoise, kOTGrammar_rerankingStrategy_EDCD, TRUE /* honour fixed rankings; very important */,
-										1.0, 0.0, FALSE, TRUE, & grammarHasChanged);
+										evaluationNoise, kOTGrammar_rerankingStrategy_EDCD, true /* honour fixed rankings; very important */,
+										1.0, 0.0, false, true, & grammarHasChanged);
 									if (grammarHasChanged) {
 										OTGrammar_newDisharmonies (me, evaluationNoise);
 									}
@@ -2695,13 +2687,13 @@ void OTGrammar_PairDistribution_listObligatoryRankings (OTGrammar me, PairDistri
 				}
 			}
 		}
-		Melder_progress (1.0, L"");
+		Melder_progress (1.0);
 		/*
 		 * Improve list.
 		 */
-		improved = TRUE;
+		improved = true;
 		while (improved) {
-			improved = FALSE;
+			improved = false;
 			for (ilist = 1; ilist <= list -> size; ilist ++) {
 				for (jlist = 1; jlist <= list -> size; jlist ++) if (ilist != jlist) {
 					OTGrammar_List4 elA = (OTGrammar_List4) list -> item [ilist], elB = (OTGrammar_List4) list -> item [jlist];
@@ -2719,9 +2711,9 @@ void OTGrammar_PairDistribution_listObligatoryRankings (OTGrammar me, PairDistri
 				if (improved) break;
 			}
 		}
-		improved = TRUE;
+		improved = true;
 		while (improved) {
-			improved = FALSE;
+			improved = false;
 			for (ilist = 1; ilist <= list -> size; ilist ++) {
 				for (jlist = 1; jlist <= list -> size; jlist ++) if (ilist != jlist) {
 					OTGrammar_List4 elA = (OTGrammar_List4) list -> item [ilist], elB = (OTGrammar_List4) list -> item [jlist];
@@ -2741,8 +2733,8 @@ void OTGrammar_PairDistribution_listObligatoryRankings (OTGrammar me, PairDistri
 		}
 		for (ilist = 1; ilist <= list -> size; ilist ++) {
 			OTGrammar_List4 el = (OTGrammar_List4) list -> item [ilist];
-			MelderInfo_write (my constraints [el -> hi1]. name, L" >> ", my constraints [el -> lo1]. name, L" OR ");
-			MelderInfo_writeLine (my constraints [el -> hi2]. name, L" >> ", my constraints [el -> lo2]. name);
+			MelderInfo_write (my constraints [el -> hi1]. name, U" >> ", my constraints [el -> lo1]. name, U" OR ");
+			MelderInfo_writeLine (my constraints [el -> hi2]. name, U" >> ", my constraints [el -> lo2]. name);
 			MelderInfo_close ();
 		}
 		MelderInfo_close ();
@@ -2768,7 +2760,7 @@ void OTGrammar_PairDistribution_listObligatoryRankings (OTGrammar me, PairDistri
 		my numberOfFixedRankings = savedNumberOfFixedRankings;
 		my fixedRankings = savedFixedRankings;   // undangle
 		OTGrammar_restore (me);
-		Melder_throw (me, ": obligatory rankings not listed.");
+		Melder_throw (me, U": obligatory rankings not listed.");
 	}
 }
 
@@ -2777,7 +2769,7 @@ void OTGrammar_Distributions_listObligatoryRankings (OTGrammar me, Distributions
 	 * Save.
 	 */
 	OTGrammarFixedRanking savedFixedRankings = my fixedRankings;
-	my fixedRankings = NULL;
+	my fixedRankings = nullptr;
 	OTGrammar_save (me);
 	try {
 		long ifixedRanking, icons, jcons, kcons, ipair = 0, npair = my numberOfConstraints * (my numberOfConstraints - 1);
@@ -2794,23 +2786,23 @@ void OTGrammar_Distributions_listObligatoryRankings (OTGrammar me, Distributions
 		 * Test learnability of every possible ranked pair.
 		 */
 		MelderInfo_open ();
-		autoMelderProgress progress (L"Finding obligatory rankings.");
+		autoMelderProgress progress (U"Finding obligatory rankings.");
 		for (icons = 1; icons <= my numberOfConstraints; icons ++) {
 			for (jcons = 1; jcons <= my numberOfConstraints; jcons ++) if (icons != jcons) {
 				my fixedRankings [my numberOfFixedRankings]. higher = icons;
 				my fixedRankings [my numberOfFixedRankings]. lower = jcons;
 				OTGrammar_reset (me, 100.0);
-				Melder_progress ((double) ipair / npair, Melder_integer (ipair + 1), L"/", Melder_integer (npair), L": Trying ranking ",
-					my constraints [icons]. name, L" >> ", my constraints [jcons]. name);
+				Melder_progress ((double) ipair / npair, ipair + 1, U"/", npair, U": Trying ranking ",
+					my constraints [icons]. name, U" >> ", my constraints [jcons]. name);
 				ipair ++;
 				Melder_progressOff ();
 				OTGrammar_Distributions_learnFromPartialOutputs (me, thee, columnNumber,
-					1e-9, kOTGrammar_rerankingStrategy_EDCD, TRUE /* honour fixed rankings; very important */,
-					1.0, 1000, 0.0, 1, 0.0, 1, 0, NULL, false, false, 0);
+					1e-9, kOTGrammar_rerankingStrategy_EDCD, true /* honour fixed rankings; very important */,
+					1.0, 1000, 0.0, 1, 0.0, 1, 0, nullptr, false, false, 0);
 				Melder_progressOn ();
 				for (kcons = 1; kcons <= my numberOfConstraints; kcons ++) {
 					if (my constraints [kcons]. ranking < 0.0) {
-						MelderInfo_writeLine (my constraints [jcons]. name, L" >> ", my constraints [icons]. name);
+						MelderInfo_writeLine (my constraints [jcons]. name, U" >> ", my constraints [icons]. name);
 						break;
 					}
 				}
@@ -2839,61 +2831,61 @@ void OTGrammar_Distributions_listObligatoryRankings (OTGrammar me, Distributions
 		my numberOfFixedRankings --;
 		my fixedRankings = savedFixedRankings;   // undangle
 		OTGrammar_restore (me);
-		Melder_throw (me, ": obligatory rankings not listed.");
+		Melder_throw (me, U": obligatory rankings not listed.");
 	}
 }
 
 static void printConstraintNames (OTGrammar me, MelderString *buffer) {
-	wchar_t text [200];
+	char32 text [200];
 	bool secondLine = false;
 	for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 		OTGrammarConstraint constraint = & my constraints [my index [icons]];
-		if (wcschr (constraint -> name, '\n')) {
-			wchar_t *newLine;
-			wcscpy (text, constraint -> name);
-			newLine = wcschr (text, '\n');
+		if (str32chr (constraint -> name, U'\n')) {
+			char32 *newLine;
+			str32cpy (text, constraint -> name);
+			newLine = str32chr (text, U'\n');
 			*newLine = '\0';
-			MelderString_append (buffer, L"\t", text);
+			MelderString_append (buffer, U"\t", text);
 			secondLine = true;
 		} else {
-			MelderString_append (buffer, L"\t", constraint -> name);
+			MelderString_append (buffer, U"\t", constraint -> name);
 		}
 	}
-	MelderString_appendCharacter (buffer, '\n');
+	MelderString_appendCharacter (buffer, U'\n');
 	if (secondLine) {
-		MelderString_appendCharacter (buffer, '\t');
+		MelderString_appendCharacter (buffer, U'\t');
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			OTGrammarConstraint constraint = & my constraints [my index [icons]];
-			wchar_t *newLine = wcschr (constraint -> name, '\n');
-			MelderString_append (buffer, L"\t", newLine ? newLine + 1 : L"");
+			char32 *newLine = str32chr (constraint -> name, U'\n');
+			MelderString_append (buffer, U"\t", newLine ? newLine + 1 : U"");
 		}
-		MelderString_appendCharacter (buffer, '\n');
+		MelderString_appendCharacter (buffer, U'\n');
 	}
 }
 
 void OTGrammar_writeToHeaderlessSpreadsheetFile (OTGrammar me, MelderFile file) {
 	try {
 		autoMelderString buffer;
-		MelderString_append (& buffer, L"CONSTRAINTS\t");
+		MelderString_copy (& buffer, U"CONSTRAINTS\t");
 		printConstraintNames (me, & buffer);
-		MelderString_append (& buffer, L"rankings\t");
+		MelderString_append (& buffer, U"rankings\t");
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			OTGrammarConstraint constraint = & my constraints [my index [icons]];
-			MelderString_append (& buffer, L"\t", Melder_double (constraint -> ranking));
+			MelderString_append (& buffer, U"\t", constraint -> ranking);
 		}
-		MelderString_append (& buffer, L"\ndisharmonies\t");
+		MelderString_append (& buffer, U"\ndisharmonies\t");
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			OTGrammarConstraint constraint = & my constraints [my index [icons]];
-			MelderString_append (& buffer, L"\t", Melder_double (constraint -> disharmony));
+			MelderString_append (& buffer, U"\t", constraint -> disharmony);
 		}
-		MelderString_appendCharacter (& buffer, '\n');
+		MelderString_appendCharacter (& buffer, U'\n');
 		for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
 			OTGrammarTableau tableau = & my tableaus [itab];
 			long winner = OTGrammar_getWinner (me, itab), numberOfOptimalCandidates = 0;
 			for (long icons = 1; icons <= my numberOfConstraints + 1; icons ++) {
-				MelderString_appendCharacter (& buffer, '\t');
+				MelderString_appendCharacter (& buffer, U'\t');
 			}
-			MelderString_append (& buffer, L"\nINPUT\t", tableau -> input);
+			MelderString_append (& buffer, U"\nINPUT\t", tableau -> input);
 			printConstraintNames (me, & buffer);
 			for (long icand = 1; icand <= tableau -> numberOfCandidates; icand ++) {
 				if (OTGrammar_compareCandidates (me, itab, icand, itab, winner) == 0) {
@@ -2905,14 +2897,14 @@ void OTGrammar_writeToHeaderlessSpreadsheetFile (OTGrammar me, MelderFile file)
 				bool candidateIsOptimal = OTGrammar_compareCandidates (me, itab, icand, itab, winner) == 0;
 				long crucialCell = OTGrammar_crucialCell (me, itab, icand, winner, numberOfOptimalCandidates);
 				MelderString_append (& buffer,
-					candidateIsOptimal == false ? L"loser" : numberOfOptimalCandidates > 1 ? L"co-winner" : L"winner",
-					L"\t",
+					candidateIsOptimal == false ? U"loser" : numberOfOptimalCandidates > 1 ? U"co-winner" : U"winner",
+					U"\t",
 					candidate -> output);
 				for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 					int index = my index [icons];
 					OTGrammarConstraint constraint = & my constraints [index];
-					wchar_t markString [40];
-					markString [0] = '\0';
+					static MelderString markString;
+					MelderString_empty (& markString);
 					/*
 					 * An exclamation mark can be drawn in this cell only if all of the following conditions are met:
 					 * 1. the candidate is not optimal;
@@ -2922,27 +2914,27 @@ void OTGrammar_writeToHeaderlessSpreadsheetFile (OTGrammar me, MelderFile file)
 					if (icons == crucialCell && ! candidateIsOptimal && ! constraint -> tiedToTheLeft && ! constraint -> tiedToTheRight) {
 						int winnerMarks = tableau -> candidates [winner]. marks [index];
 						for (long imark = 1; imark <= winnerMarks + 1; imark ++)
-							wcscat (markString, L"*");
-						wcscat (markString, L"!");
+							MelderString_appendCharacter (& markString, U'*');
+						MelderString_appendCharacter (& markString, U'!');
 						for (long imark = winnerMarks + 2; imark <= candidate -> marks [index]; imark ++)
-							wcscat (markString, L"*");
+							MelderString_appendCharacter (& markString, U'*');
 					} else {
 						if (! candidateIsOptimal && (constraint -> tiedToTheLeft || constraint -> tiedToTheRight) &&
 							crucialCell >= 1 && constraint -> disharmony == my constraints [my index [crucialCell]]. disharmony)
 						{
-							wcscat (markString, L"=");
+							MelderString_appendCharacter (& markString, U'=');
 						}
 						for (long imark = 1; imark <= candidate -> marks [index]; imark ++)
-							wcscat (markString, L"*");
+							MelderString_appendCharacter (& markString, U'*');
 					}
-					MelderString_append (& buffer, L"\t", markString);
+					MelderString_append (& buffer, U"\t", markString.string);
 				}
-				MelderString_appendCharacter (& buffer, '\n');
+				MelderString_appendCharacter (& buffer, U'\n');
 			}
 		}
 		MelderFile_writeText (file, buffer.string, Melder_getOutputEncoding ());
 	} catch (MelderError) {
-		Melder_throw (me, ": not saved to tab-separated file ", file, ".");
+		Melder_throw (me, U": not saved to tab-separated file ", file, U".");
 	}
 }
 
diff --git a/gram/OTGrammar.h b/gram/OTGrammar.h
index 0db7640..b509a1a 100644
--- a/gram/OTGrammar.h
+++ b/gram/OTGrammar.h
@@ -2,7 +2,7 @@
 #define _OTGrammar_h_
 /* OTGrammar.h
  *
- * Copyright (C) 1997-2011,2014 Paul Boersma
+ * Copyright (C) 1997-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@
 #include "OTGrammar_enums.h"
 
 #include "OTGrammar_def.h"
-oo_CLASS_CREATE (OTGrammar, Data);
+oo_CLASS_CREATE (OTGrammar, Daata);
 
 Thing_define (OTHistory, TableOfReal) {
 };
@@ -42,7 +42,7 @@ void OTGrammar_sort (OTGrammar me);
 
 void OTGrammar_newDisharmonies (OTGrammar me, double spreading);
 
-long OTGrammar_getTableau (OTGrammar me, const wchar_t *input);
+long OTGrammar_getTableau (OTGrammar me, const char32 *input);
 int OTGrammar_compareCandidates (OTGrammar me, long itab1, long icand1, long itab2, long icand2);
 	/*
 	 * Function:
@@ -71,46 +71,46 @@ bool OTGrammar_isCandidateSinglyGrammatical (OTGrammar me, long itab, long icand
 
 /* Interpretive parsing. */
 void OTGrammar_getInterpretiveParse
-	(OTGrammar me, const wchar_t *partialOutput, long *bestTableau, long *bestCandidate);
+	(OTGrammar me, const char32 *partialOutput, long *bestTableau, long *bestCandidate);
 	/* Gives randomized results in case of tied candidates. */
-bool OTGrammar_isPartialOutputGrammatical (OTGrammar me, const wchar_t *partialOutput);
+bool OTGrammar_isPartialOutputGrammatical (OTGrammar me, const char32 *partialOutput);
 	/* Is there an input for which this partial output is contained in any of the optimal outputs? */
-bool OTGrammar_isPartialOutputSinglyGrammatical (OTGrammar me, const wchar_t *partialOutput);
+bool OTGrammar_isPartialOutputSinglyGrammatical (OTGrammar me, const char32 *partialOutput);
 	/* Is every optimal output that contains this partial output the only optimal output in its tableau? */
 bool OTGrammar_areAllPartialOutputsGrammatical (OTGrammar me, Strings thee);
 bool OTGrammar_areAllPartialOutputsSinglyGrammatical (OTGrammar me, Strings thee);
 
-void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const wchar_t *input);
+void OTGrammar_drawTableau (OTGrammar me, Graphics g, bool vertical, const char32 *input);
 
 Strings OTGrammar_generateInputs (OTGrammar me, long numberOfTrials);
 Strings OTGrammar_getInputs (OTGrammar me);
-void OTGrammar_inputToOutput (OTGrammar me, const wchar_t *input, wchar_t *output, double evaluationNoise);
+void OTGrammar_inputToOutput (OTGrammar me, const char32 *input, char32 *output, double evaluationNoise);
 Strings OTGrammar_inputsToOutputs (OTGrammar me, Strings inputs, double evaluationNoise);
-Strings OTGrammar_inputToOutputs (OTGrammar me, const wchar_t *input, long n, double evaluationNoise);
+Strings OTGrammar_inputToOutputs (OTGrammar me, const char32 *input, long n, double evaluationNoise);
 Distributions OTGrammar_to_Distribution (OTGrammar me, long trialsPerInput, double evaluationNoise);
 PairDistribution OTGrammar_to_PairDistribution (OTGrammar me, long trialsPerInput, double evaluationNoise);
 Distributions OTGrammar_measureTypology (OTGrammar me);
 
-void OTGrammar_learnOne (OTGrammar me, const wchar_t *input, const wchar_t *adultOutput,
-	double rankingSpreading, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
-	double demotionMean, double relativeDemotionSpreading, int newDisharmonies,
-	int warnIfStalled, int *grammarHasChanged);
+void OTGrammar_learnOne (OTGrammar me, const char32 *input, const char32 *adultOutput,
+	double rankingSpreading, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
+	double demotionMean, double relativeDemotionSpreading, bool newDisharmonies,
+	bool warnIfStalled, bool *grammarHasChanged);
 void OTGrammar_learn (OTGrammar me, Strings inputs, Strings outputs,
-	double rankingSpreading, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
+	double rankingSpreading, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
 	double demotionMean, double relativeDemotionSpreading, long numberOfChews);
 void OTGrammar_PairDistribution_learn (OTGrammar me, PairDistribution thee,
-	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
+	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
 	double initialPlasticity, long replicationsPerPlasticity, double plasticityDecrement,
 	long numberOfPlasticities, double relativePlasticityNoise, long numberOfChews);
 bool OTGrammar_PairDistribution_findPositiveWeights_e (OTGrammar me, PairDistribution thee, double weightFloor, double marginOfSeparation);
-void OTGrammar_learnOneFromPartialOutput (OTGrammar me, const wchar_t *partialAdultOutput,
-	double rankingSpreading, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
-	double demotionMean, double relativeDemotionSpreading, long numberOfChews, int warnIfStalled);
+void OTGrammar_learnOneFromPartialOutput (OTGrammar me, const char32 *partialAdultOutput,
+	double rankingSpreading, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
+	double demotionMean, double relativeDemotionSpreading, long numberOfChews, bool warnIfStalled);
 void OTGrammar_learnFromPartialOutputs (OTGrammar me, Strings partialOutputs,
-	double rankingSpreading, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
+	double rankingSpreading, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
 	double demotionMean, double relativeDemotionSpreading, long numberOfChews, long storeHistoryEvery, OTHistory *history);
 void OTGrammar_Distributions_learnFromPartialOutputs (OTGrammar me, Distributions thee, long columnNumber,
-	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, int honourLocalRankings,
+	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, bool honourLocalRankings,
 	double initialPlasticity, long replicationsPerPlasticity, double plasticityDecrement,
 	long numberOfPlasticities, double relativePlasticityNoise, long numberOfChews,
 	long storeHistoryEvery, OTHistory *history_out,
@@ -124,14 +124,14 @@ double OTGrammar_Distributions_getFractionCorrect (OTGrammar me, Distributions t
 
 void OTGrammar_checkIndex (OTGrammar me);
 
-OTGrammar OTGrammar_create_NoCoda_grammar (void);
-OTGrammar OTGrammar_create_NPA_grammar (void);
-PairDistribution OTGrammar_create_NPA_distribution (void);
+OTGrammar OTGrammar_create_NoCoda_grammar ();
+OTGrammar OTGrammar_create_NPA_grammar ();
+PairDistribution OTGrammar_create_NPA_distribution ();
 OTGrammar OTGrammar_create_tongueRoot_grammar (int small_large, int equal_random_infant_Wolof);
 OTGrammar OTGrammar_create_metrics (int equal_footForm_wsp,
 	int trochaicityConstraint, int includeFootBimoraic, int includeFootBisyllabic,
 	int includePeripheral, int nonfinalityConstraint, int overtFormsHaveSecondaryStress, int includeClashAndLapse, int includeCodas);
-	/* T&S: 1, FALSE, FALSE, FALSE, 1, TRUE, FALSE, FALSE */
+	/* T&S: 1, false, false, false, 1, true, false, false */
 
 void OTGrammar_reset (OTGrammar me, double ranking);
 void OTGrammar_resetToRandomRanking (OTGrammar me, double mean, double standardDeviation);
@@ -139,8 +139,8 @@ void OTGrammar_resetToRandomTotalRanking (OTGrammar me, double maximumRanking, d
 void OTGrammar_setRanking (OTGrammar me, long constraint, double ranking, double disharmony);
 void OTGrammar_setConstraintPlasticity (OTGrammar me, long constraint, double plasticity);
 
-void OTGrammar_removeConstraint (OTGrammar me, const wchar_t *constraintName);
-void OTGrammar_removeHarmonicallyBoundedCandidates (OTGrammar me, int singly);
+void OTGrammar_removeConstraint (OTGrammar me, const char32 *constraintName);
+void OTGrammar_removeHarmonicallyBoundedCandidates (OTGrammar me, bool singly);
 void OTGrammar_PairDistribution_listObligatoryRankings (OTGrammar me, PairDistribution thee);
 void OTGrammar_Distributions_listObligatoryRankings (OTGrammar me, Distributions thee, long columnNumber);
 
diff --git a/gram/OTGrammarEditor.cpp b/gram/OTGrammarEditor.cpp
index b599874..7ab84fb 100644
--- a/gram/OTGrammarEditor.cpp
+++ b/gram/OTGrammarEditor.cpp
@@ -1,6 +1,6 @@
 /* OTGrammarEditor.cpp
  *
- * Copyright (C) 1997-2011,2012,2013 Paul Boersma
+ * Copyright (C) 1997-2011,2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,115 +30,115 @@ Thing_implement (OTGrammarEditor, HyperPage, 0);
 
 static void menu_cb_evaluate (EDITOR_ARGS) {
 	EDITOR_IAM (OTGrammarEditor);
-	EDITOR_FORM (L"Evaluate", 0)
-		REAL (L"Noise", L"2.0")
+	EDITOR_FORM (U"Evaluate", 0)
+		REAL (U"Noise", U"2.0")
 	EDITOR_OK
 	EDITOR_DO
-		Editor_save (me, L"Evaluate");
-		OTGrammar_newDisharmonies ((OTGrammar) my data, GET_REAL (L"Noise"));
+		Editor_save (me, U"Evaluate");
+		OTGrammar_newDisharmonies ((OTGrammar) my data, GET_REAL (U"Noise"));
 		Graphics_updateWs (my g);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_evaluate_noise_2_0 (EDITOR_ARGS) {
 	EDITOR_IAM (OTGrammarEditor);
-	Editor_save (me, L"Evaluate (noise 2.0)");
+	Editor_save (me, U"Evaluate (noise 2.0)");
 	OTGrammar_newDisharmonies ((OTGrammar) my data, 2.0);
 	Graphics_updateWs (my g);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_evaluate_tinyNoise (EDITOR_ARGS) {
 	EDITOR_IAM (OTGrammarEditor);
-	Editor_save (me, L"Evaluate (tiny noise)");
+	Editor_save (me, U"Evaluate (tiny noise)");
 	OTGrammar_newDisharmonies ((OTGrammar) my data, 1e-9);
 	Graphics_updateWs (my g);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_evaluate_zeroNoise (EDITOR_ARGS) {
 	EDITOR_IAM (OTGrammarEditor);
-	Editor_save (me, L"Evaluate (zero noise)");
+	Editor_save (me, U"Evaluate (zero noise)");
 	OTGrammar_newDisharmonies ((OTGrammar) my data, 0.0);
 	Graphics_updateWs (my g);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_editConstraint (EDITOR_ARGS) {
 	EDITOR_IAM (OTGrammarEditor);
-	EDITOR_FORM (L"Edit constraint", 0)
-		LABEL (L"constraint", L"");
-		REAL (L"Ranking value", L"100.0");
-		REAL (L"Disharmony", L"100.0");
-		REAL (L"Plasticity", L"1.0");
+	EDITOR_FORM (U"Edit constraint", 0)
+		LABEL (U"constraint", U"");
+		REAL (U"Ranking value", U"100.0");
+		REAL (U"Disharmony", U"100.0");
+		REAL (U"Plasticity", U"1.0");
 	EDITOR_OK
 		OTGrammar ot = (OTGrammar) my data;
 		OTGrammarConstraint constraint;
 		if (my selected < 1 || my selected > ot -> numberOfConstraints)
-			Melder_throw ("Select a constraint first.");
+			Melder_throw (U"Select a constraint first.");
 		constraint = & ot -> constraints [ot -> index [my selected]];
-		SET_STRING (L"constraint", constraint -> name)
-		SET_REAL (L"Ranking value", constraint -> ranking)
-		SET_REAL (L"Disharmony", constraint -> disharmony)
-		SET_REAL (L"Plasticity", constraint -> plasticity)
+		SET_STRING (U"constraint", constraint -> name)
+		SET_REAL (U"Ranking value", constraint -> ranking)
+		SET_REAL (U"Disharmony", constraint -> disharmony)
+		SET_REAL (U"Plasticity", constraint -> plasticity)
 	EDITOR_DO
 		OTGrammar ot = (OTGrammar) my data;
 		OTGrammarConstraint constraint = & ot -> constraints [ot -> index [my selected]];
-		Editor_save (me, L"Edit constraint");
-		constraint -> ranking = GET_REAL (L"Ranking value");
-		constraint -> disharmony = GET_REAL (L"Disharmony");
-		constraint -> plasticity = GET_REAL (L"Plasticity");
+		Editor_save (me, U"Edit constraint");
+		constraint -> ranking = GET_REAL (U"Ranking value");
+		constraint -> disharmony = GET_REAL (U"Disharmony");
+		constraint -> plasticity = GET_REAL (U"Plasticity");
 		OTGrammar_sort (ot);
 		Graphics_updateWs (my g);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_learnOne (EDITOR_ARGS) {
 	EDITOR_IAM (OTGrammarEditor);
-	EDITOR_FORM (L"Learn one", L"OTGrammar: Learn one...")
-		LABEL (L"", L"Underlying form:")
-		SENTENCE (L"Input string", L"")
-		LABEL (L"", L"Adult surface form:")
-		SENTENCE (L"Output string", L"")
-		REAL (L"Evaluation noise", L"2.0")
-		OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, kOTGrammar_rerankingStrategy_SYMMETRIC_ALL)
-		REAL (L"Plasticity", L"0.1")
-		REAL (L"Rel. plasticity spreading", L"0.1")
-		BOOLEAN (L"Honour local rankings", 1)
+	EDITOR_FORM (U"Learn one", U"OTGrammar: Learn one...")
+		LABEL (U"", U"Underlying form:")
+		SENTENCE (U"Input string", U"")
+		LABEL (U"", U"Adult surface form:")
+		SENTENCE (U"Output string", U"")
+		REAL (U"Evaluation noise", U"2.0")
+		OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, kOTGrammar_rerankingStrategy_SYMMETRIC_ALL)
+		REAL (U"Plasticity", U"0.1")
+		REAL (U"Rel. plasticity spreading", U"0.1")
+		BOOLEAN (U"Honour local rankings", 1)
 	EDITOR_OK
 	EDITOR_DO
-		Editor_save (me, L"Learn one");
-		OTGrammar_learnOne ((OTGrammar) my data, GET_STRING (L"Input string"), GET_STRING (L"Output string"),
-			GET_REAL (L"Evaluation noise"), GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"), GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Plasticity"), GET_REAL (L"Rel. plasticity spreading"), TRUE, TRUE, NULL);
+		Editor_save (me, U"Learn one");
+		OTGrammar_learnOne ((OTGrammar) my data, GET_STRING (U"Input string"), GET_STRING (U"Output string"),
+			GET_REAL (U"Evaluation noise"), GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"), GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Plasticity"), GET_REAL (U"Rel. plasticity spreading"), true, true, nullptr);
 		OTGrammar_sort ((OTGrammar) my data);
 		Graphics_updateWs (my g);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_learnOneFromPartialOutput (EDITOR_ARGS) {
 	EDITOR_IAM (OTGrammarEditor);
-	EDITOR_FORM (L"Learn one from partial adult output", 0)
-		LABEL (L"", L"Partial adult surface form (e.g. overt form):")
-		SENTENCE (L"Partial output", L"")
-		REAL (L"Evaluation noise", L"2.0")
-		OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, kOTGrammar_rerankingStrategy_SYMMETRIC_ALL)
-		REAL (L"Plasticity", L"0.1")
-		REAL (L"Rel. plasticity spreading", L"0.1")
-		BOOLEAN (L"Honour local rankings", 1)
-		NATURAL (L"Number of chews", L"1")
+	EDITOR_FORM (U"Learn one from partial adult output", 0)
+		LABEL (U"", U"Partial adult surface form (e.g. overt form):")
+		SENTENCE (U"Partial output", U"")
+		REAL (U"Evaluation noise", U"2.0")
+		OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, kOTGrammar_rerankingStrategy_SYMMETRIC_ALL)
+		REAL (U"Plasticity", U"0.1")
+		REAL (U"Rel. plasticity spreading", U"0.1")
+		BOOLEAN (U"Honour local rankings", 1)
+		NATURAL (U"Number of chews", U"1")
 	EDITOR_OK
 	EDITOR_DO
-		Editor_save (me, L"Learn one from partial output");
-		OTGrammar_learnOneFromPartialOutput ((OTGrammar) my data, GET_STRING (L"Partial output"),
-			GET_REAL (L"Evaluation noise"), GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"), GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Plasticity"), GET_REAL (L"Rel. plasticity spreading"), GET_INTEGER (L"Number of chews"), TRUE);
+		Editor_save (me, U"Learn one from partial output");
+		OTGrammar_learnOneFromPartialOutput ((OTGrammar) my data, GET_STRING (U"Partial output"),
+			GET_REAL (U"Evaluation noise"), GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"), GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Plasticity"), GET_REAL (U"Rel. plasticity spreading"), GET_INTEGER (U"Number of chews"), true);
 		OTGrammar_sort ((OTGrammar) my data);
 		Graphics_updateWs (my g);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
@@ -147,55 +147,55 @@ static void menu_cb_removeConstraint (EDITOR_ARGS) {
 	OTGrammar ot = (OTGrammar) my data;
 	OTGrammarConstraint constraint;
 	if (my selected < 1 || my selected > ot -> numberOfConstraints)
-		Melder_throw ("Select a constraint first.");
+		Melder_throw (U"Select a constraint first.");
 	constraint = & ot -> constraints [ot -> index [my selected]];
-	Editor_save (me, L"Remove constraint");
+	Editor_save (me, U"Remove constraint");
 	OTGrammar_removeConstraint (ot, constraint -> name);
 	Graphics_updateWs (my g);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_resetAllRankings (EDITOR_ARGS) {
 	EDITOR_IAM (OTGrammarEditor);
-	EDITOR_FORM (L"Reset all rankings", 0)
-		REAL (L"Ranking", L"100.0")
+	EDITOR_FORM (U"Reset all rankings", 0)
+		REAL (U"Ranking", U"100.0")
 	EDITOR_OK
 	EDITOR_DO
-		Editor_save (me, L"Reset all rankings");
-		OTGrammar_reset ((OTGrammar) my data, GET_REAL (L"Ranking"));
+		Editor_save (me, U"Reset all rankings");
+		OTGrammar_reset ((OTGrammar) my data, GET_REAL (U"Ranking"));
 		Graphics_updateWs (my g);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
-static void menu_cb_OTGrammarEditor_help (EDITOR_ARGS) { EDITOR_IAM (OTGrammarEditor); Melder_help (L"OTGrammarEditor"); }
-static void menu_cb_OTGrammar_help (EDITOR_ARGS) { EDITOR_IAM (OTGrammarEditor); Melder_help (L"OTGrammar"); }
-static void menu_cb_OTLearningTutorial (EDITOR_ARGS) { EDITOR_IAM (OTGrammarEditor); Melder_help (L"OT learning"); }
+static void menu_cb_OTGrammarEditor_help (EDITOR_ARGS) { EDITOR_IAM (OTGrammarEditor); Melder_help (U"OTGrammarEditor"); }
+static void menu_cb_OTGrammar_help (EDITOR_ARGS) { EDITOR_IAM (OTGrammarEditor); Melder_help (U"OTGrammar"); }
+static void menu_cb_OTLearningTutorial (EDITOR_ARGS) { EDITOR_IAM (OTGrammarEditor); Melder_help (U"OT learning"); }
 
 void structOTGrammarEditor :: v_createMenus () {
 	OTGrammarEditor_Parent :: v_createMenus ();
-	Editor_addCommand (this, L"Edit", L"-- edit ot --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Evaluate...", 0, menu_cb_evaluate);
-	Editor_addCommand (this, L"Edit", L"Evaluate (noise 2.0)", '2', menu_cb_evaluate_noise_2_0);
-	Editor_addCommand (this, L"Edit", L"Evaluate (zero noise)", '0', menu_cb_evaluate_zeroNoise);
-	Editor_addCommand (this, L"Edit", L"Evaluate (tiny noise)", '9', menu_cb_evaluate_tinyNoise);
-	Editor_addCommand (this, L"Edit", L"Edit constraint...", 'E', menu_cb_editConstraint);
-	Editor_addCommand (this, L"Edit", L"Reset all rankings...", 'R', menu_cb_resetAllRankings);
-	Editor_addCommand (this, L"Edit", L"Learn one...", 0, menu_cb_learnOne);
-	Editor_addCommand (this, L"Edit", L"Learn one from partial output...", '1', menu_cb_learnOneFromPartialOutput);
-	Editor_addCommand (this, L"Edit", L"-- remove ot --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Remove constraint", 0, menu_cb_removeConstraint);
+	Editor_addCommand (this, U"Edit", U"-- edit ot --", 0, nullptr);
+	Editor_addCommand (this, U"Edit", U"Evaluate...", 0, menu_cb_evaluate);
+	Editor_addCommand (this, U"Edit", U"Evaluate (noise 2.0)", '2', menu_cb_evaluate_noise_2_0);
+	Editor_addCommand (this, U"Edit", U"Evaluate (zero noise)", '0', menu_cb_evaluate_zeroNoise);
+	Editor_addCommand (this, U"Edit", U"Evaluate (tiny noise)", '9', menu_cb_evaluate_tinyNoise);
+	Editor_addCommand (this, U"Edit", U"Edit constraint...", 'E', menu_cb_editConstraint);
+	Editor_addCommand (this, U"Edit", U"Reset all rankings...", 'R', menu_cb_resetAllRankings);
+	Editor_addCommand (this, U"Edit", U"Learn one...", 0, menu_cb_learnOne);
+	Editor_addCommand (this, U"Edit", U"Learn one from partial output...", '1', menu_cb_learnOneFromPartialOutput);
+	Editor_addCommand (this, U"Edit", U"-- remove ot --", 0, nullptr);
+	Editor_addCommand (this, U"Edit", U"Remove constraint", 0, menu_cb_removeConstraint);
 }
 
 void structOTGrammarEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	OTGrammarEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"OTGrammarEditor help", '?', menu_cb_OTGrammarEditor_help);
-	EditorMenu_addCommand (menu, L"OTGrammar help", 0, menu_cb_OTGrammar_help);
-	EditorMenu_addCommand (menu, L"OT learning tutorial", 0, menu_cb_OTLearningTutorial);
+	EditorMenu_addCommand (menu, U"OTGrammarEditor help", '?', menu_cb_OTGrammarEditor_help);
+	EditorMenu_addCommand (menu, U"OTGrammar help", 0, menu_cb_OTGrammar_help);
+	EditorMenu_addCommand (menu, U"OT learning tutorial", 0, menu_cb_OTLearningTutorial);
 }
 
 static OTGrammar drawTableau_ot;
-static const wchar_t *drawTableau_input;
+static const char32 *drawTableau_input;
 static bool drawTableau_constraintsAreDrawnVertically;
 static void drawTableau (Graphics g) {
 	OTGrammar_drawTableau (drawTableau_ot, g, drawTableau_constraintsAreDrawnVertically, drawTableau_input);
@@ -203,32 +203,40 @@ static void drawTableau (Graphics g) {
 
 void structOTGrammarEditor :: v_draw () {
 	OTGrammar ot = (OTGrammar) data;
-	static wchar_t text [1000];
+	static char32 text [1000];
 	Graphics_clearWs (g);
 	if (ot -> decisionStrategy == kOTGrammar_decisionStrategy_EXPONENTIAL_HG ||
 		ot -> decisionStrategy == kOTGrammar_decisionStrategy_EXPONENTIAL_MAXIMUM_ENTROPY)
 	{
-		HyperPage_listItem (this, L"\t\t      %%ranking value\t      %disharmony\t      %plasticity\t   %%e^^disharmony");
+		HyperPage_listItem (this, U"\t\t      %%ranking value\t      %disharmony\t      %plasticity\t   %%e^^disharmony");
 	} else {
-		HyperPage_listItem (this, L"\t\t      %%ranking value\t      %disharmony\t      %plasticity");
+		HyperPage_listItem (this, U"\t\t      %%ranking value\t      %disharmony\t      %plasticity");
 	}
 	for (long icons = 1; icons <= ot -> numberOfConstraints; icons ++) {
 		OTGrammarConstraint constraint = & ot -> constraints [ot -> index [icons]];
 		if (ot -> decisionStrategy == kOTGrammar_decisionStrategy_EXPONENTIAL_HG ||
 			ot -> decisionStrategy == kOTGrammar_decisionStrategy_EXPONENTIAL_MAXIMUM_ENTROPY)
 		{
-			swprintf (text, 1000, L"\t%ls@@%ld|%ls@\t      %.3f\t      %.3f\t      %.6f\t %ls",
-				icons == selected ? L"♠︎ " : L"   ", icons, constraint -> name,
-				constraint -> ranking, constraint -> disharmony, constraint -> plasticity,
-				Melder_float (Melder_half (exp (constraint -> disharmony))));
+			Melder_sprint (text,1000,
+				U"\t", icons == selected ? U"♠︎ " : U"   ",
+				U"@@", icons,
+				U"|", constraint -> name,
+				U"@\t      ", Melder_fixed (constraint -> ranking, 3),
+				U"\t      ", Melder_fixed (constraint -> disharmony, 3),
+				U"\t      ", Melder_fixed (constraint -> plasticity, 6),
+				U"\t ", Melder_float (Melder_half (exp (constraint -> disharmony))));
 		} else {
-			swprintf (text, 1000, L"\t%ls@@%ld|%ls@\t      %.3f\t      %.3f\t      %.6f",
-				icons == selected ? L"♠︎ " : L"   ", icons, constraint -> name,
-				constraint -> ranking, constraint -> disharmony, constraint -> plasticity);
+			Melder_sprint (text,1000,
+				U"\t", icons == selected ? U"♠︎ " : U"   ",
+				U"@@", icons,
+				U"|", constraint -> name,
+				U"@\t      ", Melder_fixed (constraint -> ranking, 3),
+				U"\t      ", Melder_fixed (constraint -> disharmony, 3),
+				U"\t      ", Melder_fixed (constraint -> plasticity, 6));
 		}
 		HyperPage_listItem (this, text);
 	}
-	Graphics_setAtSignIsLink (g, FALSE);
+	Graphics_setAtSignIsLink (g, false);
 	for (long itab = 1; itab <= ot -> numberOfTableaus; itab ++) {
 		OTGrammarTableau tableau = & ot -> tableaus [itab];
 		double rowHeight = 0.25;
@@ -238,23 +246,23 @@ void structOTGrammarEditor :: v_draw () {
 		drawTableau_constraintsAreDrawnVertically = d_constraintsAreDrawnVertically;
 		HyperPage_picture (this, 20, tableauHeight, drawTableau);
 	}
-	Graphics_setAtSignIsLink (g, TRUE);
+	Graphics_setAtSignIsLink (g, true);
 }
 
-int structOTGrammarEditor :: v_goToPage (const wchar_t *title) {
-	if (title == NULL) return 1;
-	selected = wcstol (title, NULL, 10);
+int structOTGrammarEditor :: v_goToPage (const char32 *title) {
+	if (! title) return 1;
+	selected = Melder_atoi (title);
 	return 1;
 }
 
-OTGrammarEditor OTGrammarEditor_create (const wchar_t *title, OTGrammar ot) {
+autoOTGrammarEditor OTGrammarEditor_create (const char32 *title, OTGrammar ot) {
 	try {
 		autoOTGrammarEditor me = Thing_new (OTGrammarEditor);
 		my data = ot;
 		HyperPage_init (me.peek(), title, ot);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("OTGrammar window not created.");
+		Melder_throw (U"OTGrammar window not created.");
 	}
 }
 
diff --git a/gram/OTGrammarEditor.h b/gram/OTGrammarEditor.h
index cdf66da..de00b33 100644
--- a/gram/OTGrammarEditor.h
+++ b/gram/OTGrammarEditor.h
@@ -2,7 +2,7 @@
 #define _OTGrammarEditor_h_
 /* OTGrammar.h
  *
- * Copyright (C) 1997-2011,2012 Paul Boersma
+ * Copyright (C) 1997-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,19 +23,22 @@
 #include "OTGrammar.h"
 
 Thing_define (OTGrammarEditor, HyperPage) {
-	// new data:
-	public:
-		long selected;
-		bool d_constraintsAreDrawnVertically;
-	// overridden methods:
-		virtual bool v_editable () { return true; }
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_draw ();
-		virtual int v_goToPage (const wchar_t *title);
+	long selected;
+	bool d_constraintsAreDrawnVertically;
+
+	bool v_editable ()
+		override { return true; }
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_draw ()
+		override;
+	int v_goToPage (const char32 *title)
+		override;
 };
 
-OTGrammarEditor OTGrammarEditor_create (const wchar_t *title, OTGrammar ot);
+autoOTGrammarEditor OTGrammarEditor_create (const char32 *title, OTGrammar ot);
 
 /* End of file OTGrammarEditor.h */
 #endif
diff --git a/gram/OTGrammar_def.h b/gram/OTGrammar_def.h
index 0e15ebc..82b5c47 100644
--- a/gram/OTGrammar_def.h
+++ b/gram/OTGrammar_def.h
@@ -1,6 +1,6 @@
 /* OTGrammar_def.h
  *
- * Copyright (C) 1997-2011 Paul Boersma
+ * Copyright (C) 1997-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@ oo_DEFINE_STRUCT (OTGrammarConstraint)
 		oo_DOUBLE (plasticity)
 	oo_ENDFROM
 	#if oo_READING
-		if (localVersion < 2) {
+		if (formatVersion < 2) {
 			plasticity = 1.0;
 		}
 	#endif
@@ -80,7 +80,7 @@ oo_END_STRUCT (OTGrammarTableau)
 
 
 #define ooSTRUCT OTGrammar
-oo_DEFINE_CLASS (OTGrammar, Data)
+oo_DEFINE_CLASS (OTGrammar, Daata)
 
 	oo_FROM (1)
 		oo_ENUM (kOTGrammar_decisionStrategy, decisionStrategy)
@@ -100,8 +100,8 @@ oo_DEFINE_CLASS (OTGrammar, Data)
 	#endif
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (OTGrammar)
diff --git a/gram/OTGrammar_enums.h b/gram/OTGrammar_enums.h
index b1bb4b7..1a361af 100644
--- a/gram/OTGrammar_enums.h
+++ b/gram/OTGrammar_enums.h
@@ -1,6 +1,6 @@
 /* OTGrammar_enums.h
  *
- * Copyright (C) 2006-2011,2013,2014 Paul Boersma
+ * Copyright (C) 2006-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,28 +18,28 @@
  */
 
 enums_begin (kOTGrammar_decisionStrategy, 0)
-	enums_add (kOTGrammar_decisionStrategy, 0, OPTIMALITY_THEORY, L"OptimalityTheory")
-	enums_add (kOTGrammar_decisionStrategy, 1, HARMONIC_GRAMMAR, L"HarmonicGrammar")
-	enums_add (kOTGrammar_decisionStrategy, 2, LINEAR_OT, L"LinearOT")
-	enums_add (kOTGrammar_decisionStrategy, 3, EXPONENTIAL_HG, L"ExponentialHG")
-	enums_add (kOTGrammar_decisionStrategy, 4, MAXIMUM_ENTROPY, L"MaximumEntropy")
-	enums_add (kOTGrammar_decisionStrategy, 5, POSITIVE_HG, L"PositiveHG")
-	enums_add (kOTGrammar_decisionStrategy, 6, EXPONENTIAL_MAXIMUM_ENTROPY, L"ExponentialMaximumEntropy")
+	enums_add (kOTGrammar_decisionStrategy, 0, OPTIMALITY_THEORY, U"OptimalityTheory")
+	enums_add (kOTGrammar_decisionStrategy, 1, HARMONIC_GRAMMAR, U"HarmonicGrammar")
+	enums_add (kOTGrammar_decisionStrategy, 2, LINEAR_OT, U"LinearOT")
+	enums_add (kOTGrammar_decisionStrategy, 3, EXPONENTIAL_HG, U"ExponentialHG")
+	enums_add (kOTGrammar_decisionStrategy, 4, MAXIMUM_ENTROPY, U"MaximumEntropy")
+	enums_add (kOTGrammar_decisionStrategy, 5, POSITIVE_HG, U"PositiveHG")
+	enums_add (kOTGrammar_decisionStrategy, 6, EXPONENTIAL_MAXIMUM_ENTROPY, U"ExponentialMaximumEntropy")
 enums_end (kOTGrammar_decisionStrategy, 6, OPTIMALITY_THEORY)
 
 enums_begin (kOTGrammar_rerankingStrategy, 0)
-	enums_add (kOTGrammar_rerankingStrategy, 0, DEMOTION_ONLY, L"Demotion only")
-	enums_add (kOTGrammar_rerankingStrategy, 1, SYMMETRIC_ONE, L"Symmetric one")
-	enums_add (kOTGrammar_rerankingStrategy, 2, SYMMETRIC_ALL, L"Symmetric all")
-	enums_add (kOTGrammar_rerankingStrategy, 3, SYMMETRIC_ALL_SKIPPABLE, L"Symmetric all (skippable)")
-	enums_add (kOTGrammar_rerankingStrategy, 4, WEIGHTED_UNCANCELLED, L"Weighted uncancelled")
-	enums_add (kOTGrammar_rerankingStrategy, 5, WEIGHTED_ALL, L"Weighted all")
-	enums_add (kOTGrammar_rerankingStrategy, 6, EDCD, L"EDCD")
-	enums_add (kOTGrammar_rerankingStrategy, 7, EDCD_WITH_VACATION, L"EDCD with vacation")
-	enums_add (kOTGrammar_rerankingStrategy, 8, WEIGHTED_ALL_UP_HIGHEST_DOWN, L"Weighted all up, highest down")
-	enums_add (kOTGrammar_rerankingStrategy, 9, WEIGHTED_ALL_UP_HIGHEST_DOWN_2012, L"Weighted all up, highest down (2012)")
-	enums_add (kOTGrammar_rerankingStrategy, 10, WEIGHTED_ALL_UP_HIGH_DOWN, L"Weighted all up, high down")
-	enums_add (kOTGrammar_rerankingStrategy, 11, WEIGHTED_ALL_UP_HIGH_DOWN_2012, L"Weighted all up, high down (2012)")
+	enums_add (kOTGrammar_rerankingStrategy, 0, DEMOTION_ONLY, U"Demotion only")
+	enums_add (kOTGrammar_rerankingStrategy, 1, SYMMETRIC_ONE, U"Symmetric one")
+	enums_add (kOTGrammar_rerankingStrategy, 2, SYMMETRIC_ALL, U"Symmetric all")
+	enums_add (kOTGrammar_rerankingStrategy, 3, SYMMETRIC_ALL_SKIPPABLE, U"Symmetric all (skippable)")
+	enums_add (kOTGrammar_rerankingStrategy, 4, WEIGHTED_UNCANCELLED, U"Weighted uncancelled")
+	enums_add (kOTGrammar_rerankingStrategy, 5, WEIGHTED_ALL, U"Weighted all")
+	enums_add (kOTGrammar_rerankingStrategy, 6, EDCD, U"EDCD")
+	enums_add (kOTGrammar_rerankingStrategy, 7, EDCD_WITH_VACATION, U"EDCD with vacation")
+	enums_add (kOTGrammar_rerankingStrategy, 8, WEIGHTED_ALL_UP_HIGHEST_DOWN, U"Weighted all up, highest down")
+	enums_add (kOTGrammar_rerankingStrategy, 9, WEIGHTED_ALL_UP_HIGHEST_DOWN_2012, U"Weighted all up, highest down (2012)")
+	enums_add (kOTGrammar_rerankingStrategy, 10, WEIGHTED_ALL_UP_HIGH_DOWN, U"Weighted all up, high down")
+	enums_add (kOTGrammar_rerankingStrategy, 11, WEIGHTED_ALL_UP_HIGH_DOWN_2012, U"Weighted all up, high down (2012)")
 enums_end (kOTGrammar_rerankingStrategy, 11, SYMMETRIC_ALL)
 
 /* End of file OTGrammar_enums.h */
diff --git a/gram/OTGrammar_ex_NPA.cpp b/gram/OTGrammar_ex_NPA.cpp
index aecfc87..4582992 100644
--- a/gram/OTGrammar_ex_NPA.cpp
+++ b/gram/OTGrammar_ex_NPA.cpp
@@ -1,6 +1,6 @@
 /* OTGrammar_ex_NPA.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,14 +20,15 @@
 /*
  * pb 2002/07/16 GPL
  * pb 2007/07/23 constraint plasticity
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2011/03/29 C++
  * pb 2011/07/12 C++
+ * pb 2015/06/03 char32
  */
 
 #include "OTGrammar.h"
 
-OTGrammar OTGrammar_create_NPA_grammar (void) {
+OTGrammar OTGrammar_create_NPA_grammar () {
 	try {
 		OTGrammarCandidate candidate;
 		OTGrammarTableau tableau;
@@ -35,58 +36,58 @@ OTGrammar OTGrammar_create_NPA_grammar (void) {
 		autoOTGrammar me = Thing_new (OTGrammar);
 		my constraints = NUMvector <structOTGrammarConstraint> (1, my numberOfConstraints = 3);
 		constraint = & my constraints [1];
-			constraint -> name = Melder_wcsdup (L"*G\\s{ESTURE}");
+			constraint -> name = Melder_dup (U"*G\\s{ESTURE}");
 			constraint -> ranking = 102.7;
 			constraint -> plasticity = 1.0;
 		constraint = & my constraints [2];
-			constraint -> name = Melder_wcsdup (L"*R\\s{EPLACE} (n, m)");
+			constraint -> name = Melder_dup (U"*R\\s{EPLACE} (n, m)");
 			constraint -> ranking = 100.0;
 			constraint -> plasticity = 1.0;
 		constraint = & my constraints [3];
-			constraint -> name = Melder_wcsdup (L"*R\\s{EPLACE} (t, p)");
+			constraint -> name = Melder_dup (U"*R\\s{EPLACE} (t, p)");
 			constraint -> ranking = 112.0;
 			constraint -> plasticity = 1.0;
 		my tableaus = NUMvector <structOTGrammarTableau> (1, my numberOfTableaus = 2);
 		tableau = & my tableaus [1];
-			tableau -> input = Melder_wcsdup (L"an+pa");
+			tableau -> input = Melder_dup (U"an+pa");
 			tableau -> candidates = NUMvector <structOTGrammarCandidate> (1, tableau -> numberOfCandidates = 2);
 			candidate = & tableau -> candidates [1];
-				candidate -> output = Melder_wcsdup (L"anpa");
+				candidate -> output = Melder_dup (U"anpa");
 				candidate -> marks = NUMvector <int> (1, candidate -> numberOfConstraints = 3);
 				candidate -> marks [1] = 1;
 			candidate = & tableau -> candidates [2];
-				candidate -> output = Melder_wcsdup (L"ampa");
+				candidate -> output = Melder_dup (U"ampa");
 				candidate -> marks = NUMvector <int> (1, candidate -> numberOfConstraints = 3);
 				candidate -> marks [2] = 1;
 		tableau = & my tableaus [2];
-			tableau -> input = Melder_wcsdup (L"at+ma");
+			tableau -> input = Melder_dup (U"at+ma");
 			tableau -> candidates = NUMvector <structOTGrammarCandidate> (1, tableau -> numberOfCandidates = 2);
 			candidate = & tableau -> candidates [1];
-				candidate -> output = Melder_wcsdup (L"atma");
+				candidate -> output = Melder_dup (U"atma");
 				candidate -> marks = NUMvector <int> (1, candidate -> numberOfConstraints = 3);
 				candidate -> marks [1] = 1;
 			candidate = & tableau -> candidates [2];
-				candidate -> output = Melder_wcsdup (L"apma");
+				candidate -> output = Melder_dup (U"apma");
 				candidate -> marks = NUMvector <int> (1, candidate -> numberOfConstraints = 3);
 				candidate -> marks [3] = 1;
 		OTGrammar_checkIndex (me.peek());
 		OTGrammar_newDisharmonies (me.peek(), 0.0);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Nasal place assimilation grammar not created.");
+		Melder_throw (U"Nasal place assimilation grammar not created.");
 	}
 }
 
-PairDistribution OTGrammar_create_NPA_distribution (void) {
+PairDistribution OTGrammar_create_NPA_distribution () {
 	try {
 		autoPairDistribution me = PairDistribution_create ();
-		PairDistribution_add (me.peek(), L"at+ma", L"atma", 100);
-		PairDistribution_add (me.peek(), L"at+ma", L"apma",   0);
-		PairDistribution_add (me.peek(), L"an+pa", L"anpa",  20);
-		PairDistribution_add (me.peek(), L"an+pa", L"ampa",  80);
+		PairDistribution_add (me.peek(), U"at+ma", U"atma", 100);
+		PairDistribution_add (me.peek(), U"at+ma", U"apma",   0);
+		PairDistribution_add (me.peek(), U"an+pa", U"anpa",  20);
+		PairDistribution_add (me.peek(), U"an+pa", U"ampa",  80);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Nasal place assimilation distribution not created.");
+		Melder_throw (U"Nasal place assimilation distribution not created.");
 	}
 }
 
diff --git a/gram/OTGrammar_ex_NoCoda.cpp b/gram/OTGrammar_ex_NoCoda.cpp
index 120b780..43447c5 100644
--- a/gram/OTGrammar_ex_NoCoda.cpp
+++ b/gram/OTGrammar_ex_NoCoda.cpp
@@ -1,6 +1,6 @@
 /* OTGrammar_ex_NoCoda.cpp
  *
- * Copyright (C) 1997-2011 Paul Boersma
+ * Copyright (C) 1997-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 #include "OTGrammar.h"
 
-OTGrammar OTGrammar_create_NoCoda_grammar (void) {
+OTGrammar OTGrammar_create_NoCoda_grammar () {
 	try {
 		OTGrammarCandidate candidate;
 		OTGrammarTableau tableau;
@@ -27,36 +27,36 @@ OTGrammar OTGrammar_create_NoCoda_grammar (void) {
 		autoOTGrammar me = Thing_new (OTGrammar);
 		my constraints = NUMvector <structOTGrammarConstraint> (1, my numberOfConstraints = 2);
 		constraint = & my constraints [1];
-			constraint -> name = Melder_wcsdup (L"N\\s{O}C\\s{ODA}");
+			constraint -> name = Melder_dup (U"N\\s{O}C\\s{ODA}");
 			constraint -> ranking = 100.0;
 			constraint -> plasticity = 1.0;
 		constraint = & my constraints [2];
-			constraint -> name = Melder_wcsdup (L"P\\s{ARSE}");
+			constraint -> name = Melder_dup (U"P\\s{ARSE}");
 			constraint -> ranking = 90.0;
 			constraint -> plasticity = 1.0;
 		my tableaus = NUMvector <structOTGrammarTableau> (1, my numberOfTableaus = 2);
 		tableau = & my tableaus [1];
-			tableau -> input = Melder_wcsdup (L"pat");
+			tableau -> input = Melder_dup (U"pat");
 			tableau -> candidates = NUMvector <structOTGrammarCandidate> (1, tableau -> numberOfCandidates =  2);
 			candidate = & tableau -> candidates [1];
-				candidate -> output = Melder_wcsdup (L"pa");
+				candidate -> output = Melder_dup (U"pa");
 				candidate -> marks = NUMvector <int> (1, candidate -> numberOfConstraints = 2);
 				candidate -> marks [2] = 1;
 			candidate = & tableau -> candidates [2];
-				candidate -> output = Melder_wcsdup (L"pat");
+				candidate -> output = Melder_dup (U"pat");
 				candidate -> marks = NUMvector <int> (1, candidate -> numberOfConstraints = 2);
 				candidate -> marks [1] = 1;
 		tableau = & my tableaus [2];
-			tableau -> input = Melder_wcsdup (L"pa");
+			tableau -> input = Melder_dup (U"pa");
 			tableau -> candidates = NUMvector <structOTGrammarCandidate> (1, tableau -> numberOfCandidates =  1);
 			candidate = & tableau -> candidates [1];
-				candidate -> output = Melder_wcsdup (L"pa");
+				candidate -> output = Melder_dup (U"pa");
 				candidate -> marks = NUMvector <int> (1, candidate -> numberOfConstraints = 2);
 		OTGrammar_checkIndex (me.peek());
 		OTGrammar_newDisharmonies (me.peek(), 0.0);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("NoCoda grammar not created.");
+		Melder_throw (U"NoCoda grammar not created.");
 	}
 }
 
diff --git a/gram/OTGrammar_ex_metrics.cpp b/gram/OTGrammar_ex_metrics.cpp
index 848f580..acf2de4 100644
--- a/gram/OTGrammar_ex_metrics.cpp
+++ b/gram/OTGrammar_ex_metrics.cpp
@@ -1,6 +1,6 @@
 /* OTGrammar_ex_metrics.cpp
  *
- * Copyright (C) 2001-2011,2014 Paul Boersma
+ * Copyright (C) 2001-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@
  * pb 2004/08/11 complete rewrite in order to include WeightByPosition and *MoraicConsonant
  * pb 2004/12/03 corrected *Lapse
  * pb 2007/07/23 constraint plasticity
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2011/03/29 C++
  * pb 2011/06/29 C++
  */
@@ -62,48 +62,48 @@
 
 #define NUMBER_OF_CONSTRAINTS  22
 
-static const wchar_t *constraintNames [1+NUMBER_OF_CONSTRAINTS] = { 0,
-	L"WSP", L"FtNonfinal", L"Iambic", L"Parse", L"FootBin", L"WFL", L"WFR", L"Main-L", L"Main-R", L"AFL", L"AFR", L"Nonfinal",
-	L"Trochaic", L"FtBimor", L"FtBisyl", L"Peripheral", L"MainNonfinal", L"HeadNonfinal", L"*Clash", L"*Lapse", L"WeightByPosition", L"*C\\mu" };
+static const char32 *constraintNames [1+NUMBER_OF_CONSTRAINTS] = { 0,
+	U"WSP", U"FtNonfinal", U"Iambic", U"Parse", U"FootBin", U"WFL", U"WFR", U"Main-L", U"Main-R", U"AFL", U"AFR", U"Nonfinal",
+	U"Trochaic", U"FtBimor", U"FtBisyl", U"Peripheral", U"MainNonfinal", U"HeadNonfinal", U"*Clash", U"*Lapse", U"WeightByPosition", U"*C\\mu" };
 
 static void addCandidate (OTGrammarTableau me, long numberOfSyllables, int stress [],
-	int footedToTheLeft [], int footedToTheRight [], int surfaceWeightPattern [],
+	bool footedToTheLeft [], bool footedToTheRight [], int surfaceWeightPattern [],
 	int overtFormsHaveSecondaryStress)
 {
-	static const wchar_t *syllable [] = { L"L", L"L1", L"L2", L"H", L"H1", L"H2", L"K", L"K1", L"K2", L"J", L"J1", L"J2" };
-	static const wchar_t *syllableWithoutSecondaryStress [] = { L"L", L"L1", L"L", L"H", L"H1", L"H", L"K", L"K1", L"K", L"J", L"J1", L"J" };
-	wchar_t output [100];
-	wcscpy (output, L"[");
+	static const char32 *syllable [] = { U"L", U"L1", U"L2", U"H", U"H1", U"H2", U"K", U"K1", U"K2", U"J", U"J1", U"J2" };
+	static const char32 *syllableWithoutSecondaryStress [] = { U"L", U"L1", U"L", U"H", U"H1", U"H", U"K", U"K1", U"K", U"J", U"J1", U"J" };
+	char32 output [100];
+	str32cpy (output, U"[");
 	for (long isyll = 1; isyll <= numberOfSyllables; isyll ++) {
-		if (isyll > 1) wcscat (output, L" ");
-		wcscat (output, ( overtFormsHaveSecondaryStress ? syllable : syllableWithoutSecondaryStress )
+		if (isyll > 1) str32cpy (output + str32len (output), U" ");
+		str32cpy (output + str32len (output), ( overtFormsHaveSecondaryStress ? syllable : syllableWithoutSecondaryStress )
 				[stress [isyll] + 3 * (surfaceWeightPattern [isyll] - 1)]);
 	}
-	wcscat (output, L"] \\-> /");
+	str32cpy (output + str32len (output), U"] \\-> /");
 	for (long isyll = 1; isyll <= numberOfSyllables; isyll ++) {
-		if (isyll > 1) wcscat (output, L" ");
-		if (footedToTheRight [isyll] || (! footedToTheLeft [isyll] && stress [isyll] != 0)) wcscat (output, L"(");
-		wcscat (output, syllable [stress [isyll] + 3 * (surfaceWeightPattern [isyll] - 1)]);
-		if (footedToTheLeft [isyll] || (! footedToTheRight [isyll] && stress [isyll] != 0)) wcscat (output, L")");
+		if (isyll > 1) str32cpy (output + str32len (output), U" ");
+		if (footedToTheRight [isyll] || (! footedToTheLeft [isyll] && stress [isyll] != 0)) str32cpy (output + str32len (output), U"(");
+		str32cpy (output + str32len (output), syllable [stress [isyll] + 3 * (surfaceWeightPattern [isyll] - 1)]);
+		if (footedToTheLeft [isyll] || (! footedToTheRight [isyll] && stress [isyll] != 0)) str32cpy (output + str32len (output), U")");
 	}
-	wcscat (output, L"/");
-	my candidates [++ my numberOfCandidates]. output = Melder_wcsdup (output);
+	str32cpy (output + str32len (output), U"/");
+	my candidates [++ my numberOfCandidates]. output = Melder_dup (output);
 }
 
 static void fillSurfaceWeightPattern (OTGrammarTableau me, long numberOfSyllables, int stress [],
-	int footedToTheLeft [], int footedToTheRight [], int underlyingWeightPattern [],
+	bool footedToTheLeft [], bool footedToTheRight [], int underlyingWeightPattern [],
 	int overtFormsHaveSecondaryStress)
 {
 	int surfaceWeightPattern [1+7], minSurfaceWeight [1+7], maxSurfaceWeight [1+7];
 	int weight1, weight2, weight3, weight4, weight5;
 	for (long isyll = 1; isyll <= numberOfSyllables; isyll ++) {
 		if (underlyingWeightPattern [isyll] < 3) {
-			minSurfaceWeight [isyll] = maxSurfaceWeight [isyll] = underlyingWeightPattern [isyll];   /* L -> L; H -> H */
+			minSurfaceWeight [isyll] = maxSurfaceWeight [isyll] = underlyingWeightPattern [isyll];   // L -> L; H -> H
 		} else {
-			minSurfaceWeight [isyll] = 3, maxSurfaceWeight [isyll] = 4;   /* C -> { J, K } */ 
+			minSurfaceWeight [isyll] = 3, maxSurfaceWeight [isyll] = 4;   // C -> { J, K }
 		}
 	}
-	surfaceWeightPattern [6] = surfaceWeightPattern [7] = 1;   /* Constant L. */
+	surfaceWeightPattern [6] = surfaceWeightPattern [7] = 1;   // constant L
 	for (weight1 = minSurfaceWeight [1]; weight1 <= maxSurfaceWeight [1]; weight1 ++) {
 		surfaceWeightPattern [1] = weight1;
 		for (weight2 = minSurfaceWeight [2]; weight2 <= maxSurfaceWeight [2]; weight2 ++) {
@@ -129,17 +129,16 @@ static void fillSurfaceWeightPattern (OTGrammarTableau me, long numberOfSyllable
 }
 
 static void path (OTGrammarTableau me, long numberOfSyllables, int stress [],
-	int startingSyllable, int footedToTheLeft_in [], int footedToTheRight_in [], int underlyingWeightPattern [],
+	int startingSyllable, bool footedToTheLeft_in [], bool footedToTheRight_in [], int underlyingWeightPattern [],
 	int overtFormsHaveSecondaryStress)
 {
-	int footedToTheLeft [10], footedToTheRight [10];
-	long isyll;
+	bool footedToTheLeft [10], footedToTheRight [10];
 	/* Localize all arguments. */
-	for (isyll = 1; isyll <= startingSyllable; isyll ++) {
+	for (long isyll = 1; isyll <= startingSyllable; isyll ++) {
 		footedToTheLeft [isyll] = footedToTheLeft_in [isyll];
 		footedToTheRight [isyll] = footedToTheRight_in [isyll];
 	}
-	for (isyll = startingSyllable + 1; isyll <= numberOfSyllables; isyll ++)
+	for (long isyll = startingSyllable + 1; isyll <= numberOfSyllables; isyll ++)
 		footedToTheLeft [isyll] = footedToTheRight [isyll] = 0;
 	if (startingSyllable > numberOfSyllables) {
 		fillSurfaceWeightPattern (me, numberOfSyllables, stress, footedToTheLeft, footedToTheRight, underlyingWeightPattern, overtFormsHaveSecondaryStress);
@@ -147,18 +146,18 @@ static void path (OTGrammarTableau me, long numberOfSyllables, int stress [],
 		path (me, numberOfSyllables, stress, startingSyllable + 1,
 			footedToTheLeft, footedToTheRight, underlyingWeightPattern, overtFormsHaveSecondaryStress);
 		if (stress [startingSyllable] == 0 && startingSyllable < numberOfSyllables && stress [startingSyllable + 1] != 0) {
-			footedToTheLeft [startingSyllable + 1] = TRUE;
-			footedToTheRight [startingSyllable] = TRUE;
+			footedToTheLeft [startingSyllable + 1] = true;
+			footedToTheRight [startingSyllable] = true;
 			path (me, numberOfSyllables, stress, startingSyllable + 1,
 				footedToTheLeft, footedToTheRight, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-			footedToTheLeft [startingSyllable + 1] = FALSE;
-			footedToTheRight [startingSyllable] = FALSE;
+			footedToTheLeft [startingSyllable + 1] = false;
+			footedToTheRight [startingSyllable] = false;
 		}
 		if (stress [startingSyllable] == 0 && startingSyllable > 1 && stress [startingSyllable - 1] != 0
 		    && ! footedToTheLeft [startingSyllable - 1])
 		{
-			footedToTheRight [startingSyllable - 1] = TRUE;
-			footedToTheLeft [startingSyllable] = TRUE;
+			footedToTheRight [startingSyllable - 1] = true;
+			footedToTheLeft [startingSyllable] = true;
 			path (me, numberOfSyllables, stress, startingSyllable + 1,
 				footedToTheLeft, footedToTheRight, underlyingWeightPattern, overtFormsHaveSecondaryStress);
 		}
@@ -168,50 +167,50 @@ static void path (OTGrammarTableau me, long numberOfSyllables, int stress [],
 static void fillOvertStressPattern (OTGrammarTableau me, long numberOfSyllables, int stress [], int underlyingWeightPattern [],
 	int overtFormsHaveSecondaryStress)
 {
-	int footedToTheLeft [10], footedToTheRight [10];
+	bool footedToTheLeft [10], footedToTheRight [10];
 	for (int isyll = 1; isyll <= numberOfSyllables; isyll ++)
 		footedToTheLeft [isyll] = footedToTheRight [isyll] = 0;
 	path (me, numberOfSyllables, stress, 1, footedToTheLeft, footedToTheRight, underlyingWeightPattern, overtFormsHaveSecondaryStress);
 }
 
 static void fillTableau (OTGrammarTableau me, long numberOfSyllables, int underlyingWeightPattern [], int overtFormsHaveSecondaryStress, int includeCodas) {
-	wchar_t input [100];
+	char32 input [100];
 	static int numberOfCandidates_noCodas [1+7] = { 0, 1, 6, 24, 88, 300, 984, 3136 };
 	static int numberOfCandidates_codas [1+7] = { 0, 1, 24, 192, 1408, 9600, 984, 3136 };
-	wcscpy (input, L"|");
+	str32cpy (input, U"|");
 	for (long isyll = 1; isyll <= numberOfSyllables; isyll ++) {
-		static const wchar_t *syllable_noCodas [] = { L"", L"L", L"H" };
-		static const wchar_t *syllable_codas [] = { L"", L"cv", L"cv:", L"cvc" };
-		if (isyll > 1) wcscat (input, includeCodas ? L"." : L" ");
-		wcscat (input, ( includeCodas ? syllable_codas : syllable_noCodas ) [underlyingWeightPattern [isyll]]);
+		static const char32 *syllable_noCodas [] = { U"", U"L", U"H" };
+		static const char32 *syllable_codas [] = { U"", U"cv", U"cv:", U"cvc" };
+		if (isyll > 1) str32cpy (input + str32len (input), includeCodas ? U"." : U" ");
+		str32cpy (input + str32len (input), ( includeCodas ? syllable_codas : syllable_noCodas ) [underlyingWeightPattern [isyll]]);
 	}
-	wcscat (input, L"|");
-	my input = Melder_wcsdup (input);
+	str32cpy (input + str32len (input), U"|");
+	my input = Melder_dup (input);
 	my candidates = NUMvector <structOTGrammarCandidate> (1, ( includeCodas ? numberOfCandidates_codas : numberOfCandidates_noCodas ) [numberOfSyllables]);
 	for (long mainStressed = 1; mainStressed <= numberOfSyllables; mainStressed ++) {
 		int stress [10];
 		stress [mainStressed] = 1;
-		for (int secondary1 = FALSE; secondary1 <= TRUE; secondary1 ++) {
+		for (int secondary1 = false; secondary1 <= true; secondary1 ++) {
 			stress [mainStressed <= 1 ? 2 : 1] = secondary1 ? 2 : 0;
 			if (numberOfSyllables == 2) {
 				fillOvertStressPattern (me, 2, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-			} else for (int secondary2 = FALSE; secondary2 <= TRUE; secondary2 ++) {
+			} else for (int secondary2 = false; secondary2 <= true; secondary2 ++) {
 				stress [mainStressed <= 2 ? 3 : 2] = secondary2 ? 2 : 0;
 				if (numberOfSyllables == 3) {
 					fillOvertStressPattern (me, 3, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-				} else for (int secondary3 = FALSE; secondary3 <= TRUE; secondary3 ++) {
+				} else for (int secondary3 = false; secondary3 <= true; secondary3 ++) {
 					stress [mainStressed <= 3 ? 4 : 3] = secondary3 ? 2 : 0;
 					if (numberOfSyllables == 4) {
 						fillOvertStressPattern (me, 4, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-					} else for (int secondary4 = FALSE; secondary4 <= TRUE; secondary4 ++) {
+					} else for (int secondary4 = false; secondary4 <= true; secondary4 ++) {
 						stress [mainStressed <= 4 ? 5 : 4] = secondary4 ? 2 : 0;
 						if (numberOfSyllables == 5) {
 							fillOvertStressPattern (me, 5, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-						} else for (int secondary5 = FALSE; secondary5 <= TRUE; secondary5 ++) {
+						} else for (int secondary5 = false; secondary5 <= true; secondary5 ++) {
 							stress [mainStressed <= 5 ? 6 : 5] = secondary5 ? 2 : 0;
 							if (numberOfSyllables == 6) {
 								fillOvertStressPattern (me, 6, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-							} else for (int secondary6 = FALSE; secondary6 <= TRUE; secondary6 ++) {
+							} else for (int secondary6 = false; secondary6 <= true; secondary6 ++) {
 								stress [mainStressed <= 6 ? 7 : 6] = secondary6 ? 2 : 0;
 								fillOvertStressPattern (me, 7, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
 							}
@@ -229,29 +228,29 @@ static void computeViolationMarks (OTGrammarCandidate me) {
 	#define isSyllable(s)  (isHeavy (s) || isLight (s))
 	#define isStress(s)  ((s) == '1' || (s) == '2')
 	int depth;
-	wchar_t *firstSlash = wcschr (my output, '/');
-	wchar_t *lastSlash = & my output [wcslen (my output) - 1];
+	char32 *firstSlash = str32chr (my output, U'/');
+	char32 *lastSlash = & my output [str32len (my output) - 1];
 	my marks = NUMvector <int> (1, my numberOfConstraints = NUMBER_OF_CONSTRAINTS);
 	/* Violations of WSP: count all H not followed by 1 or 2. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
 		if (isHeavy (p [0]) && ! isStress (p [1]))
 			my marks [WSP] ++;
 	}
 	/* Violations of FtNonfinal: count all heads followed by ). */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (isStress (p [0]) && p [1] == ')')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (isStress (p [0]) && p [1] == U')')
 			my marks [FtNonfinal] ++;
 	}
 	/* Violations of Iambic: count all heads not followed by ). */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (isStress (p [0]) && p [1] != ')')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (isStress (p [0]) && p [1] != U')')
 			my marks [Iambic] ++;
 	}
 	/* Violations of Parse and Peripheral: count all syllables not between (). */
 	depth = 0;
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == '(') depth ++;
-		else if (p [0] == ')') depth --;
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U'(') depth ++;
+		else if (p [0] == U')') depth --;
 		else if (isSyllable (p [0]) && depth != 1) {
 			my marks [Parse] ++;
 			if (p != firstSlash + 1 && p != lastSlash - 1)
@@ -259,8 +258,8 @@ static void computeViolationMarks (OTGrammarCandidate me) {
 		}
 	}
 	/* Violations of FootBin: count all (L1) and (L2). */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (isLight (p [0]) && p [-1] == '(' && isStress (p [1]) && p [2] == ')')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (isLight (p [0]) && p [-1] == U'(' && isStress (p [1]) && p [2] == ')')
 			my marks [FootBin] ++;
 	}
 	/* Violations of WFL: count all initial / not followed by (. */
@@ -271,8 +270,8 @@ static void computeViolationMarks (OTGrammarCandidate me) {
 		my marks [WFR] = 1;
 	/* Violations of Main_L: count syllables from foot containing X1 to left edge. */
 	{
-		wchar_t *p = wcschr (firstSlash, '1');
-		for (; *p != '('; p --) { }
+		char32 *p = str32chr (firstSlash, U'1');
+		for (; *p != U'('; p --) { }
 		for (; p != firstSlash; p --) {
 			if (isSyllable (p [0]))
 				my marks [Main_L] ++;
@@ -280,44 +279,44 @@ static void computeViolationMarks (OTGrammarCandidate me) {
 	}
 	/* Violations of Main_R: count syllables from foot containing X1 to right edge. */
 	{
-		wchar_t *p = wcschr (firstSlash, '1');
-		for (; *p != ')'; p ++) { }
+		char32 *p = str32chr (firstSlash, U'1');
+		for (; *p != U')'; p ++) { }
 		for (; p != lastSlash; p ++) {
 			if (isSyllable (p [0]))
 				my marks [Main_R] ++;
 		}
 	}
 	/* Violations of AFL: count syllables from every foot to left edge. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == '(') {
-			for (wchar_t *q = p; q != firstSlash; q --) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U'(') {
+			for (char32 *q = p; q != firstSlash; q --) {
 				if (isSyllable (q [0]))
 					my marks [AFL] ++;
 			}
 		}
 	}
 	/* Violations of AFR: count syllables from every foot to right edge. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == ')') {
-			for (wchar_t *q = p; q != lastSlash; q ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U')') {
+			for (char32 *q = p; q != lastSlash; q ++) {
 				if (isSyllable (q [0]))
 					my marks [AFR] ++;
 			}
 		}
 	}
 	/* Violations of Nonfinal: count all final / preceded by ). */
-	if (lastSlash [-1] == ')')
+	if (lastSlash [-1] == U')')
 		my marks [Nonfinal] = 1;
 	/* Violations of Trochaic: count all heads not preceded by (. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (isStress (p [0]) && p [-2] != '(')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (isStress (p [0]) && p [-2] != U'(')
 			my marks [Trochaic] ++;
 	}
 	/* Violations of FootBimoraic: count weight between (). */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == '(') {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U'(') {
 			int weight = 0;
-			for (p ++; p [0] != ')'; p ++) {
+			for (p ++; p [0] != U')'; p ++) {
 				if (isHeavy (p [0])) weight += 2;
 				else if (isLight (p [0])) weight += 1;
 			}
@@ -325,28 +324,28 @@ static void computeViolationMarks (OTGrammarCandidate me) {
 		}
 	}
 	/* Violations of FootBisyllabic: count all (X1) and (X2). */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (isSyllable (p [0]) && p [-1] == '(' && isStress (p [1]) && p [2] == ')')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (isSyllable (p [0]) && p [-1] == U'(' && isStress (p [1]) && p [2] == U')')
 			my marks [FootBisyllabic] ++;
 	}
 	/* Violations of MainNonfinal: count all final / preceded by ) preceded by 1 in the same foot. */
-	if (lastSlash [-1] == ')') {
-		for (wchar_t *p = lastSlash - 2; ; p --) {
-			if (p [0] == '2') break;
-			if (p [0] == '1') {
+	if (lastSlash [-1] == U')') {
+		for (char32 *p = lastSlash - 2; ; p --) {
+			if (p [0] == U'2') break;
+			if (p [0] == U'1') {
 				my marks [MainNonfinal] = 1;
 				break;
 			}
 		}
 	}
 	/* Violations of HeadNonfinal: count all final / preceded by ) directly preceded by 1, plus MainNonfinal. */
-	if (lastSlash [-1] == ')') {
-		if (lastSlash [-2] == '1') {
+	if (lastSlash [-1] == U')') {
+		if (lastSlash [-2] == U'1') {
 			my marks [HeadNonfinal] = 2;
 		} else {
-			for (wchar_t *p = lastSlash - 2; ; p --) {
-				if (p [0] == '2') break;
-				if (p [0] == '1') {
+			for (char32 *p = lastSlash - 2; ; p --) {
+				if (p [0] == U'2') break;
+				if (p [0] == U'1') {
 					my marks [HeadNonfinal] = 1;
 					break;
 				}
@@ -354,9 +353,9 @@ static void computeViolationMarks (OTGrammarCandidate me) {
 		}
 	}
 	/* Violations of *Clash: count all 1 and 2 followed by an 1 or 2 after the next L or H. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
 		if (isStress (p [0])) {
-			for (wchar_t *q = p + 1; q != lastSlash; q ++) {
+			for (char32 *q = p + 1; q != lastSlash; q ++) {
 				if (isSyllable (q [0])) {
 					if (isStress (q [1])) {
 						my marks [Clash] ++;
@@ -368,7 +367,7 @@ static void computeViolationMarks (OTGrammarCandidate me) {
 	}
 	/* Violations of *Lapse: count all sequences of three unstressed syllables. */
 	depth = 0;
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
 		if (isSyllable (p [0])) {
 			if (isStress (p [1])) {
 				depth = 0;
@@ -380,60 +379,60 @@ static void computeViolationMarks (OTGrammarCandidate me) {
 		}
 	}
 	/* Violations of WeightByPosition: count all K. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == 'K')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U'K')
 			my marks [WeightByPosition] ++;
 	}
 	/* Violations of *MoraicConsonant: count all J. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == 'J')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U'J')
 			my marks [MoraicConsonant] ++;
 	}
 }
 
 static void replaceOutput (OTGrammarCandidate me) {
-	int abstract = FALSE;
-	Melder_assert (my output != NULL);
-	wchar_t newOutput [100], *q = & newOutput [0];
-	for (const wchar_t *p = & my output [0]; *p != '\0'; p ++) {
-		if (p [0] == ' ') {
-			*q ++ = p [-1] == ']' || p [1] == '/' ? ' ' : '.';
+	bool abstract = false;
+	Melder_assert (my output);
+	char32 newOutput [100], *q = & newOutput [0];
+	for (const char32 *p = & my output [0]; *p != U'\0'; p ++) {
+		if (p [0] == U' ') {
+			*q ++ = p [-1] == U']' || p [1] == U'/' ? U' ' : U'.';
 		} else if (isSyllable (p [0])) {
-			*q ++ = 'c';
+			*q ++ = U'c';
 			if (abstract) {
-				*q ++ = 'V';
+				*q ++ = U'V';
 				if (isStress (p [1])) {
 					*q ++ = p [1];
 				}
-				if (p [0] == 'L') {
+				if (p [0] == U'L') {
 					;
-				} else if (p [0] == 'H') {
-					*q ++ = 'V';
-				} else if (p [0] == 'K') {
-					*q ++ = 'c';
+				} else if (p [0] == U'H') {
+					*q ++ = U'V';
+				} else if (p [0] == U'K') {
+					*q ++ = U'c';
 				} else {
-					*q ++ = 'C';
+					*q ++ = U'C';
 				}
 			} else {
-				*q ++ = 'v';
-				if (p [0] == 'L') {
+				*q ++ = U'v';
+				if (p [0] == U'L') {
 					;
-				} else if (p [0] == 'H') {
-					*q ++ = ':';
+				} else if (p [0] == U'H') {
+					*q ++ = U':';
 				} else {
-					*q ++ = 'c';
+					*q ++ = U'c';
 				}
 			}
 		} else if (isStress (p [0]) && abstract) {
 			;
 		} else {
-			if (p [0] == '/') abstract = TRUE;
+			if (p [0] == U'/') abstract = true;
 			*q ++ = p [0];
 		}
 	}
-	*q = '\0';
+	*q = U'\0';
 	Melder_free (my output);
-	my output = Melder_wcsdup_f (newOutput);
+	my output = Melder_dup (newOutput);
 }
 
 OTGrammar OTGrammar_create_metrics (int equal_footForm_wsp, int trochaicityConstraint, int includeFootBimoraic, int includeFootBisyllabic,
@@ -447,7 +446,7 @@ OTGrammar OTGrammar_create_metrics (int equal_footForm_wsp, int trochaicityConst
 		my constraints = NUMvector <structOTGrammarConstraint> (1, my numberOfConstraints = NUMBER_OF_CONSTRAINTS);
 		for (long icons = 1; icons <= NUMBER_OF_CONSTRAINTS; icons ++) {
 			OTGrammarConstraint constraint = & my constraints [icons];
-			constraint -> name = Melder_wcsdup (constraintNames [icons]);
+			constraint -> name = Melder_dup (constraintNames [icons]);
 			constraint -> ranking = 100.0;
 			constraint -> plasticity = 1.0;
 		}
@@ -463,7 +462,7 @@ OTGrammar OTGrammar_create_metrics (int equal_footForm_wsp, int trochaicityConst
 		}
 		my tableaus = NUMvector <structOTGrammarTableau> (1, numberOfTableaus);
 		for (int numberOfSyllables = 2; numberOfSyllables <= 7; numberOfSyllables ++) {
-			long numberOfUnderlyingWeightPatterns = numberOfSyllables > 5 ? 1 : (long) floor (pow (maximumUnderlyingWeight, numberOfSyllables) + 0.5);
+			long numberOfUnderlyingWeightPatterns = numberOfSyllables > 5 ? 1 : lround (pow (maximumUnderlyingWeight, numberOfSyllables));
 			for (long isyll = 1; isyll <= numberOfSyllables; isyll ++) {
 				underlyingWeightPattern [isyll] = 1;   /* L or cv */
 			}
@@ -491,30 +490,30 @@ OTGrammar OTGrammar_create_metrics (int equal_footForm_wsp, int trochaicityConst
 		OTGrammar_checkIndex (me.peek());
 		OTGrammar_newDisharmonies (me.peek(), 0.0);
 		if (trochaicityConstraint == 1) {
-			OTGrammar_removeConstraint (me.peek(), L"Trochaic");
+			OTGrammar_removeConstraint (me.peek(), U"Trochaic");
 		} else {
-			OTGrammar_removeConstraint (me.peek(), L"FtNonfinal");
+			OTGrammar_removeConstraint (me.peek(), U"FtNonfinal");
 		}
-		if (! includeFootBimoraic) OTGrammar_removeConstraint (me.peek(), L"FtBimor");
-		if (! includeFootBisyllabic) OTGrammar_removeConstraint (me.peek(), L"FtBisyl");
-		if (! includePeripheral) OTGrammar_removeConstraint (me.peek(), L"Peripheral");
+		if (! includeFootBimoraic) OTGrammar_removeConstraint (me.peek(), U"FtBimor");
+		if (! includeFootBisyllabic) OTGrammar_removeConstraint (me.peek(), U"FtBisyl");
+		if (! includePeripheral) OTGrammar_removeConstraint (me.peek(), U"Peripheral");
 		if (nonfinalityConstraint == 1) {
-			OTGrammar_removeConstraint (me.peek(), L"MainNonfinal");
-			OTGrammar_removeConstraint (me.peek(), L"HeadNonfinal");
+			OTGrammar_removeConstraint (me.peek(), U"MainNonfinal");
+			OTGrammar_removeConstraint (me.peek(), U"HeadNonfinal");
 		} else if (nonfinalityConstraint == 2) {
-			OTGrammar_removeConstraint (me.peek(), L"HeadNonfinal");
-			OTGrammar_removeConstraint (me.peek(), L"Nonfinal");
+			OTGrammar_removeConstraint (me.peek(), U"HeadNonfinal");
+			OTGrammar_removeConstraint (me.peek(), U"Nonfinal");
 		} else {
-			OTGrammar_removeConstraint (me.peek(), L"MainNonfinal");
-			OTGrammar_removeConstraint (me.peek(), L"Nonfinal");
+			OTGrammar_removeConstraint (me.peek(), U"MainNonfinal");
+			OTGrammar_removeConstraint (me.peek(), U"Nonfinal");
 		}
 		if (! includeClashAndLapse) {
-			OTGrammar_removeConstraint (me.peek(), L"*Clash");
-			OTGrammar_removeConstraint (me.peek(), L"*Lapse");
+			OTGrammar_removeConstraint (me.peek(), U"*Clash");
+			OTGrammar_removeConstraint (me.peek(), U"*Lapse");
 		}
 		if (! includeCodas) {
-			OTGrammar_removeConstraint (me.peek(), L"WeightByPosition");
-			OTGrammar_removeConstraint (me.peek(), L"*C\\mu");
+			OTGrammar_removeConstraint (me.peek(), U"WeightByPosition");
+			OTGrammar_removeConstraint (me.peek(), U"*C\\mu");
 		}
 		if (includeCodas) {
 			for (long itab = 1; itab <= my numberOfTableaus; itab ++) {
@@ -526,7 +525,7 @@ OTGrammar OTGrammar_create_metrics (int equal_footForm_wsp, int trochaicityConst
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Metrics grammar not created.");
+		Melder_throw (U"Metrics grammar not created.");
 	}
 }
 
diff --git a/gram/OTGrammar_ex_tongueRoot.cpp b/gram/OTGrammar_ex_tongueRoot.cpp
index 2e6bc23..1577057 100644
--- a/gram/OTGrammar_ex_tongueRoot.cpp
+++ b/gram/OTGrammar_ex_tongueRoot.cpp
@@ -1,6 +1,6 @@
 /* OTGrammar_ex_tongueRoot.cpp
  *
- * Copyright (C) 1997-2011,2013 Paul Boersma
+ * Copyright (C) 1997-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 #include "OTGrammar.h"
 
-static const wchar_t *vowels [] = { L"i", L"e", L"\\sw", L"\\ic", L"\\ef", L"a" };
+static const char32 *vowels [] = { U"i", U"e", U"\\sw", U"\\ic", U"\\ef", U"a" };
 #define i  0
 #define e  1
 #define schwa  2
@@ -43,9 +43,7 @@ static void countVowelViolations (int *marks, int ncons, int v) {
 }
 
 static void OTGrammarCandidate_init (OTGrammarCandidate me, int ncons, int v1, int v2) {
-	wchar_t buffer [100];
-	swprintf (buffer, 100, L"%lst%ls", vowels [v1], vowels [v2]);
-	my output = Melder_wcsdup (buffer);
+	my output = Melder_dup (Melder_cat (vowels [v1], U"t", vowels [v2]));
 	my marks = NUMvector <int> (1, my numberOfConstraints = ncons);
 	/*
 	 * Count vowel-gesture violations.
@@ -63,29 +61,29 @@ OTGrammar OTGrammar_create_tongueRoot_grammar (int small_large, int equal_random
 		int ncons = small_large == 1 ? 5 : 9, itab, v1, v2;
 		autoOTGrammar me = Thing_new (OTGrammar);
 		my constraints = NUMvector <structOTGrammarConstraint> (1, my numberOfConstraints = ncons);
-		my constraints [1]. name = Melder_wcsdup (L"*[rtr / hi]");
-		my constraints [2]. name = Melder_wcsdup (L"*[atr / lo]");
-		my constraints [3]. name = Melder_wcsdup (L"P\\s{ARSE}\n(rtr)");
-		my constraints [4]. name = Melder_wcsdup (L"P\\s{ARSE}\n(atr)");
-		my constraints [5]. name = Melder_wcsdup (L"*G\\s{ESTURE}\n(contour)");
+		my constraints [1]. name = Melder_dup (U"*[rtr / hi]");
+		my constraints [2]. name = Melder_dup (U"*[atr / lo]");
+		my constraints [3]. name = Melder_dup (U"P\\s{ARSE}\n(rtr)");
+		my constraints [4]. name = Melder_dup (U"P\\s{ARSE}\n(atr)");
+		my constraints [5]. name = Melder_dup (U"*G\\s{ESTURE}\n(contour)");
 		if (ncons == 9) {
-			my constraints [6]. name = Melder_wcsdup (L"*[rtr / mid]");
-			my constraints [7]. name = Melder_wcsdup (L"*[rtr / lo]");
-			my constraints [8]. name = Melder_wcsdup (L"*[atr / mid]");
-			my constraints [9]. name = Melder_wcsdup (L"*[atr / hi]");
+			my constraints [6]. name = Melder_dup (U"*[rtr / mid]");
+			my constraints [7]. name = Melder_dup (U"*[rtr / lo]");
+			my constraints [8]. name = Melder_dup (U"*[atr / mid]");
+			my constraints [9]. name = Melder_dup (U"*[atr / hi]");
 		}
-		if (equal_random_infant_Wolof == 1) {   /* equal? */
+		if (equal_random_infant_Wolof == 1) {   // equal?
 			for (long icons = 1; icons <= ncons; icons ++)
 				my constraints [icons]. ranking = 100.0;
-		} else if (equal_random_infant_Wolof == 2) {   /* random? */
+		} else if (equal_random_infant_Wolof == 2) {   // random?
 			for (long icons = 1; icons <= ncons; icons ++)
 				my constraints [icons]. ranking = NUMrandomGauss (100.0, 10.0);
-		} else if (equal_random_infant_Wolof == 3) {   /* infant (= cannot speak) ? */
+		} else if (equal_random_infant_Wolof == 3) {   // infant (= cannot speak) ?
 			for (long icons = 1; icons <= ncons; icons ++)
-				my constraints [icons]. ranking = 100.0;   /* Structural constraints. */
-			my constraints [3]. ranking = 50.0;   /* Faithfulness constraints. */
+				my constraints [icons]. ranking = 100.0;   // structural constraints
+			my constraints [3]. ranking = 50.0;   // faithfulness constraints
 			my constraints [4]. ranking = 50.0;
-		} else {   /* adult Wolof */
+		} else {   // adult Wolof
 			my constraints [1]. ranking = 100.0;
 			my constraints [2]. ranking =  10.0;
 			my constraints [3]. ranking =  50.0;
@@ -109,9 +107,7 @@ OTGrammar OTGrammar_create_tongueRoot_grammar (int small_large, int equal_random
 		itab = 1;
 		for (v1 = 0; v1 < 6; v1 ++) for (v2 = 0; v2 < 6; v2 ++) {
 			OTGrammarTableau tableau = & my tableaus [itab];
-			wchar_t buffer [100];
-			swprintf (buffer, 100, L"%lst%ls", vowels [v1], vowels [v2]);
-			tableau -> input = Melder_wcsdup (buffer);
+			tableau -> input = Melder_dup (Melder_cat (vowels [v1], U"t", vowels [v2]));
 			tableau -> candidates = NUMvector <structOTGrammarCandidate> (1, tableau -> numberOfCandidates = 4);
 			/*
 			 * Generate the four tongue-root variants as output candidates.
@@ -149,7 +145,7 @@ OTGrammar OTGrammar_create_tongueRoot_grammar (int small_large, int equal_random
 			my constraints [icons]. plasticity = 1.0;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Tongue root grammar not created.");
+		Melder_throw (U"Tongue root grammar not created.");
 	}
 }
 
diff --git a/gram/OTMulti.cpp b/gram/OTMulti.cpp
index 245ec20..b6c3c2f 100644
--- a/gram/OTMulti.cpp
+++ b/gram/OTMulti.cpp
@@ -1,6 +1,6 @@
 /* OTMulti.cpp
  *
- * Copyright (C) 2005-2012,2013 Paul Boersma
+ * Copyright (C) 2005-2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,7 +22,7 @@
  * pb 2006/05/16 guarded against cells with many violations
  * pb 2006/05/17 draw disharmonies above tableau
  * pb 2007/05/19 decision strategies
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2007/10/01 leak and constraint plasticity
  * pb 2007/10/01 can write as encoding
  * pb 2007/11/14 drawTableau: corrected direction of arrows for positive satisfactions
@@ -54,43 +54,43 @@
 
 void structOTMulti :: v_info ()
 {
-	structData :: v_info ();
+	structDaata :: v_info ();
 	long numberOfViolations = 0;
 	for (long icand = 1; icand <= numberOfCandidates; icand ++) {
 		for (long icons = 1; icons <= numberOfConstraints; icons ++) {
 			numberOfViolations += candidates [icand]. marks [icons];
 		}
 	}
-	MelderInfo_writeLine (L"Decision strategy: ", kOTGrammar_decisionStrategy_getText (decisionStrategy));
-	MelderInfo_writeLine (L"Number of constraints: ", Melder_integer (numberOfConstraints));
-	MelderInfo_writeLine (L"Number of candidates: ", Melder_integer (numberOfCandidates));
-	MelderInfo_writeLine (L"Number of violation marks: ", Melder_integer (numberOfViolations));
+	MelderInfo_writeLine (U"Decision strategy: ", kOTGrammar_decisionStrategy_getText (decisionStrategy));
+	MelderInfo_writeLine (U"Number of constraints: ", numberOfConstraints);
+	MelderInfo_writeLine (U"Number of candidates: ", numberOfCandidates);
+	MelderInfo_writeLine (U"Number of violation marks: ", numberOfViolations);
 }
 
 void structOTMulti :: v_writeText (MelderFile file) {
-	MelderFile_write (file, L"\n<", kOTGrammar_decisionStrategy_getText (decisionStrategy),
-		L">\n", Melder_double (leak), L" ! leak\n", Melder_integer (numberOfConstraints), L" constraints");
+	MelderFile_write (file, U"\n<", kOTGrammar_decisionStrategy_getText (decisionStrategy),
+		U">\n", leak, U" ! leak\n", numberOfConstraints, U" constraints");
 	for (long icons = 1; icons <= numberOfConstraints; icons ++) {
 		OTConstraint constraint = & constraints [icons];
-		MelderFile_write (file, L"\n\t\"");
-		for (const wchar_t *p = & constraint -> name [0]; *p; p ++) {
-			if (*p =='\"') MelderFile_writeCharacter (file, '\"');   // double any quotes within quotes
+		MelderFile_write (file, U"\n\t\"");
+		for (const char32 *p = & constraint -> name [0]; *p; p ++) {
+			if (*p == U'\"') MelderFile_writeCharacter (file, U'\"');   // double any quotes within quotes
 			MelderFile_writeCharacter (file, *p);
 		}
-		MelderFile_write (file, L"\" ", Melder_double (constraint -> ranking),
-			L" ", Melder_double (constraint -> disharmony), L" ", Melder_double (constraint -> plasticity));
+		MelderFile_write (file, U"\" ", constraint -> ranking,
+			U" ", constraint -> disharmony, U" ", constraint -> plasticity);
 	}
-	MelderFile_write (file, L"\n\n", Melder_integer (numberOfCandidates), L" candidates");
+	MelderFile_write (file, U"\n\n", numberOfCandidates, U" candidates");
 	for (long icand = 1; icand <= numberOfCandidates; icand ++) {
 		OTCandidate candidate = & candidates [icand];
-		MelderFile_write (file, L"\n\t\"");
-		for (const wchar_t *p = & candidate -> string [0]; *p; p ++) {
-			if (*p =='\"') MelderFile_writeCharacter (file, '\"');   // double any quotes within quotes
+		MelderFile_write (file, U"\n\t\"");
+		for (const char32 *p = & candidate -> string [0]; *p; p ++) {
+			if (*p == U'\"') MelderFile_writeCharacter (file, U'\"');   // double any quotes within quotes
 			MelderFile_writeCharacter (file, *p);
 		}
-		MelderFile_write (file, L"\"  ");
+		MelderFile_write (file, U"\"  ");
 		for (long icons = 1; icons <= candidate -> numberOfConstraints; icons ++) {
-			MelderFile_write (file, L" ", Melder_integer (candidate -> marks [icons]));
+			MelderFile_write (file, U" ", candidate -> marks [icons]);
 		}
 	}
 }
@@ -102,41 +102,40 @@ void OTMulti_checkIndex (OTMulti me) {
 	OTMulti_sort (me);
 }
 
-void structOTMulti :: v_readText (MelderReadText text) {
-	int localVersion = Thing_version;
-	OTMulti_Parent :: v_readText (text);
-	if (localVersion >= 1) {
+void structOTMulti :: v_readText (MelderReadText text, int formatVersion) {
+	OTMulti_Parent :: v_readText (text, formatVersion);
+	if (formatVersion >= 1) {
 		try {
 			decisionStrategy = texgete1 (text, kOTGrammar_decisionStrategy_getValue);
 		} catch (MelderError) {
-			Melder_throw ("Decision strategy not read.");
+			Melder_throw (U"Decision strategy not read.");
 		}
 	}
-	if (localVersion >= 2) {
+	if (formatVersion >= 2) {
 		try {
 			leak = texgetr8 (text);
 		} catch (MelderError) {
-			Melder_throw ("Trying to read leak.");
+			Melder_throw (U"Trying to read leak.");
 		}
 	}
-	if ((numberOfConstraints = texgeti4 (text)) < 1) Melder_throw ("No constraints.");
+	if ((numberOfConstraints = texgeti4 (text)) < 1) Melder_throw (U"No constraints.");
 	constraints = NUMvector <structOTConstraint> (1, numberOfConstraints);
 	for (long icons = 1; icons <= numberOfConstraints; icons ++) {
 		OTConstraint constraint = & constraints [icons];
 		constraint -> name = texgetw2 (text);
 		constraint -> ranking = texgetr8 (text);
 		constraint -> disharmony = texgetr8 (text);
-		if (localVersion < 2) {
+		if (formatVersion < 2) {
 			constraint -> plasticity = 1.0;
 		} else {
 			try {
 				constraint -> plasticity = texgetr8 (text);
 			} catch (MelderError) {
-				Melder_throw ("Plasticity of constraint ", icons, " not read.");
+				Melder_throw (U"Plasticity of constraint ", icons, U" not read.");
 			}
 		}
 	}
-	if ((numberOfCandidates = texgeti4 (text)) < 1) Melder_throw ("No candidates.");
+	if ((numberOfCandidates = texgeti4 (text)) < 1) Melder_throw (U"No candidates.");
 	candidates = NUMvector <structOTCandidate> (1, numberOfCandidates);
 	for (long icand = 1; icand <= numberOfCandidates; icand ++) {
 		OTCandidate candidate = & candidates [icand];
@@ -150,11 +149,11 @@ void structOTMulti :: v_readText (MelderReadText text) {
 	OTMulti_checkIndex (this);
 }
 
-Thing_implement (OTMulti, Data, 2);
+Thing_implement (OTMulti, Daata, 2);
 
-long OTMulti_getConstraintIndexFromName (OTMulti me, const wchar_t *name) {
+long OTMulti_getConstraintIndexFromName (OTMulti me, const char32 *name) {
 	for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
-		if (Melder_wcsequ (my constraints [icons]. name, name)) {
+		if (Melder_equ (my constraints [icons]. name, name)) {
 			return icons;
 		}
 	}
@@ -175,7 +174,7 @@ static int constraintCompare (const void *first, const void *second) {
 	/*
 	 * Tied constraints are sorted alphabetically.
 	 */
-	return wcscmp (my constraints [icons]. name, my constraints [jcons]. name);
+	return str32cmp (my constraints [icons]. name, my constraints [jcons]. name);
 }
 
 void OTMulti_sort (OTMulti me) {
@@ -256,17 +255,17 @@ int OTMulti_compareCandidates (OTMulti me, long icand1, long icand2) {
 		if (disharmony1 < disharmony2) return -1;   /* Candidate 1 is better than candidate 2. */
 		if (disharmony1 > disharmony2) return +1;   /* Candidate 2 is better than candidate 1. */
 	} else {
-		Melder_fatal ("Unimplemented decision strategy.");
+		Melder_fatal (U"Unimplemented decision strategy.");
 	}
 	return 0;   /* None of the comparisons found a difference between the two candidates. Hence, they are equally good. */
 }
 
-int OTMulti_candidateMatches (OTMulti me, long icand, const wchar_t *form1, const wchar_t *form2) {
-	const wchar_t *string = my candidates [icand]. string;
-	return (form1 [0] == '\0' || wcsstr (string, form1)) && (form2 [0] == '\0' || wcsstr (string, form2));
+int OTMulti_candidateMatches (OTMulti me, long icand, const char32 *form1, const char32 *form2) {
+	const char32 *string = my candidates [icand]. string;
+	return (form1 [0] == '\0' || str32str (string, form1)) && (form2 [0] == '\0' || str32str (string, form2));
 }
 
-static void _OTMulti_fillInHarmonies (OTMulti me, const wchar_t *form1, const wchar_t *form2) {
+static void _OTMulti_fillInHarmonies (OTMulti me, const char32 *form1, const char32 *form2) {
 	if (my decisionStrategy == kOTGrammar_decisionStrategy_OPTIMALITY_THEORY) return;
 	for (long icand = 1; icand <= my numberOfCandidates; icand ++) if (OTMulti_candidateMatches (me, icand, form1, form2)) {
 		OTCandidate candidate = & my candidates [icand];
@@ -296,14 +295,14 @@ static void _OTMulti_fillInHarmonies (OTMulti me, const wchar_t *form1, const wc
 				disharmony += constraintDisharmony * marks [icons];
 			}
 		} else {
-			Melder_fatal ("_OTMulti_fillInHarmonies: unimplemented decision strategy.");
+			Melder_fatal (U"_OTMulti_fillInHarmonies: unimplemented decision strategy.");
 		}
 		candidate -> harmony = - disharmony;
 	}
 }
 
-static void _OTMulti_fillInProbabilities (OTMulti me, const wchar_t *form1, const wchar_t *form2) {
-	double maximumHarmony = -1e300;
+static void _OTMulti_fillInProbabilities (OTMulti me, const char32 *form1, const char32 *form2) {
+	double maximumHarmony = -1e308;
 	for (long icand = 1; icand <= my numberOfCandidates; icand ++) if (OTMulti_candidateMatches (me, icand, form1, form2)) {
 		OTCandidate candidate = & my candidates [icand];
 		if (candidate -> harmony > maximumHarmony) {
@@ -329,7 +328,7 @@ static void _OTMulti_fillInProbabilities (OTMulti me, const wchar_t *form1, cons
 
 class MelderError_OTMulti_NoMatchingCandidate: public MelderError {};
 
-long OTMulti_getWinner (OTMulti me, const wchar_t *form1, const wchar_t *form2) {
+long OTMulti_getWinner (OTMulti me, const char32 *form1, const char32 *form2) {
 	try {
 		long icand_best = 0;
 		if (my decisionStrategy == kOTGrammar_decisionStrategy_MAXIMUM_ENTROPY ||
@@ -374,12 +373,12 @@ long OTMulti_getWinner (OTMulti me, const wchar_t *form1, const wchar_t *form2)
 			}
 		}
 		if (icand_best == 0) {
-			Melder_error_ ("The forms ", form1, " and ", form2, " do not match any candidate.");
+			Melder_appendError (U"The forms ", form1, U" and ", form2, U" do not match any candidate.");
 			throw MelderError_OTMulti_NoMatchingCandidate ();   // BUG: NYI
 		}
 		return icand_best;
 	} catch (MelderError) {
-		Melder_throw (me, ": winner not determined.");
+		Melder_throw (me, U": winner not determined.");
 	}
 }
 
@@ -387,7 +386,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 	enum kOTGrammar_rerankingStrategy updateRule,
 	double plasticity, double relativePlasticityNoise)
 {
-	bool *grammarHasChanged = NULL;   // to be implemented
+	bool *grammarHasChanged = nullptr;   // to be implemented
 	bool warnIfStalled = false;   // to be implemented
 	if (iwinner == iloser) return;
 	OTCandidate winner = & my candidates [iwinner], loser = & my candidates [iloser];
@@ -415,12 +414,12 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 		if (loserMarks > winnerMarks) {
 			if (multiplyStepByNumberOfViolations) constraintStep *= loserMarks - winnerMarks;
 			constraint -> ranking -= constraintStep * (1.0 + constraint -> ranking * my leak);
-			if (grammarHasChanged != NULL) *grammarHasChanged = true;
+			if (grammarHasChanged) *grammarHasChanged = true;
 		}
 		if (winnerMarks > loserMarks) {
 			if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - loserMarks;
 			constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak);
-			if (grammarHasChanged != NULL) *grammarHasChanged = true;
+			if (grammarHasChanged) *grammarHasChanged = true;
 		}
 	} else if (updateRule == kOTGrammar_rerankingStrategy_SYMMETRIC_ALL) {
 		bool changed = false;
@@ -450,7 +449,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 				my constraints [icons]. ranking -= averageWeight;
 			}
 		}
-		if (grammarHasChanged != NULL) *grammarHasChanged = changed;
+		if (grammarHasChanged) *grammarHasChanged = changed;
 	} else if (updateRule == kOTGrammar_rerankingStrategy_SYMMETRIC_ALL_SKIPPABLE) {
 		bool changed = false;
 		int winningConstraints = 0, losingConstraints = 0;
@@ -486,7 +485,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 				my constraints [icons]. ranking -= averageWeight;
 			}
 		}
-		if (grammarHasChanged != NULL) *grammarHasChanged = changed;
+		if (grammarHasChanged) *grammarHasChanged = changed;
 	} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_UNCANCELLED) {
 		int winningConstraints = 0, losingConstraints = 0;
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
@@ -505,13 +504,13 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 					if (multiplyStepByNumberOfViolations) constraintStep *= loserMarks - winnerMarks;
 					constraint -> ranking -= constraintStep * (1.0 + constraint -> ranking * my leak) / losingConstraints;
 					//constraint -> ranking -= constraintStep * (1.0 + constraint -> ranking * my leak) * winningConstraints;
-					if (grammarHasChanged != NULL) *grammarHasChanged = true;
+					if (grammarHasChanged) *grammarHasChanged = true;
 				}
 				if (winnerMarks > loserMarks) {
 					if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - loserMarks;
 					constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) / winningConstraints;
 					//constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) * losingConstraints;
-					if (grammarHasChanged != NULL) *grammarHasChanged = true;
+					if (grammarHasChanged) *grammarHasChanged = true;
 				}
 			}
 		}
@@ -531,12 +530,12 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 			if (loserMarks > 0) {
 				if (multiplyStepByNumberOfViolations) constraintStep *= loserMarks - winnerMarks;
 				constraint -> ranking -= constraintStep * (1.0 + constraint -> ranking * my leak) / losingConstraints;
-				if (grammarHasChanged != NULL) *grammarHasChanged = true;
+				if (grammarHasChanged) *grammarHasChanged = true;
 			}
 			if (winnerMarks > 0) {
 				if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - loserMarks;
 				constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) / winningConstraints;
-				if (grammarHasChanged != NULL) *grammarHasChanged = true;
+				if (grammarHasChanged) *grammarHasChanged = true;
 			}
 		}
 	} else if (updateRule == kOTGrammar_rerankingStrategy_EDCD || updateRule == kOTGrammar_rerankingStrategy_EDCD_WITH_VACATION) {
@@ -554,8 +553,8 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 		}
 		if (icons > my numberOfConstraints) {   // completed the loop?
 			if (warnIfStalled && ! equivalent)
-				Melder_warning ("Correct output is harmonically bounded (by having strict superset violations as compared to the learner's output)! EDCD stalls.\n"
-					"Correct output: ", loser -> string, "\nLearner's output: ", winner -> string);
+				Melder_warning (U"Correct output is harmonically bounded (by having strict superset violations as compared to the learner's output)! EDCD stalls.\n"
+					U"Correct output: ", loser -> string, U"\nLearner's output: ", winner -> string);
 			return;
 		}
 		/*
@@ -579,7 +578,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 					OTConstraint constraint = & my constraints [icons];
 					if (constraint -> ranking < pivotRanking) {
 						constraint -> ranking -= numberOfConstraintsToDemote * step * constraint -> plasticity;
-						if (grammarHasChanged != NULL) *grammarHasChanged = true;
+						if (grammarHasChanged) *grammarHasChanged = true;
 					}
 				}
 			}
@@ -598,7 +597,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 				if (constraint -> ranking >= pivotRanking) {
 					numberOfConstraintsDemoted += 1;
 					constraint -> ranking = pivotRanking - numberOfConstraintsDemoted * constraintStep;   // This preserves the order of the demotees.
-					if (grammarHasChanged != NULL) *grammarHasChanged = true;
+					if (grammarHasChanged) *grammarHasChanged = true;
 				}
 			}
 		}
@@ -613,10 +612,10 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 			int winnerMarks = winner -> marks [my index [icons]];   /* Order is important, so indirect. */
 			int loserMarks = loser -> marks [my index [icons]];
 			if (my constraints [my index [icons]]. tiedToTheRight)
-				Melder_throw ("Demotion-only learning cannot handle tied constraints.");
+				Melder_throw (U"Demotion-only learning cannot handle tied constraints.");
 			if (loserMarks < winnerMarks) {
 				if (my decisionStrategy == kOTGrammar_decisionStrategy_OPTIMALITY_THEORY) {
-					Melder_throw ("Demotion-only learning step: Loser wins! Should never happen.");
+					Melder_throw (U"Demotion-only learning step: Loser wins! Should never happen.");
 				} else {
 					// do nothing; the whole demotion-only idea does not really apply very well to non-OT decision strategies
 				}
@@ -625,7 +624,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 		}
 		if (icons > my numberOfConstraints) {   // completed the loop?
 			if (my decisionStrategy == kOTGrammar_decisionStrategy_OPTIMALITY_THEORY) {
-				Melder_throw ("(OTGrammar_step:) Loser equals correct candidate: loser \"", loser -> string, "\", winner \"", winner -> string, "\".");
+				Melder_throw (U"(OTGrammar_step:) Loser equals correct candidate: loser \"", loser -> string, U"\", winner \"", winner -> string, U"\".");
 			} else {
 				// do nothing
 			}
@@ -637,7 +636,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 			offendingConstraint = & my constraints [my index [crucialLoserMark]];
 			double constraintStep = step * offendingConstraint -> plasticity;
 			offendingConstraint -> ranking -= constraintStep;
-			if (grammarHasChanged != NULL) *grammarHasChanged = true;
+			if (grammarHasChanged) *grammarHasChanged = true;
 		}
 	} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_ALL_UP_HIGHEST_DOWN) {
 		bool changed = false;
@@ -664,13 +663,13 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 			OTConstraint offendingConstraint;
 			long icons = 1;
 			for (; icons <= my numberOfConstraints; icons ++) {
-				winnerMarks = winner -> marks [my index [icons]];   /* Order is important, so indirect. */
+				winnerMarks = winner -> marks [my index [icons]];   // order is important, so indirect
 				loserMarks = loser -> marks [my index [icons]];
 				if (my constraints [my index [icons]]. tiedToTheRight)
-					Melder_throw ("Demotion-only learning cannot handle tied constraints.");
+					Melder_throw (U"Demotion-only learning cannot handle tied constraints.");
 				if (loserMarks < winnerMarks) {
 					if (my decisionStrategy == kOTGrammar_decisionStrategy_OPTIMALITY_THEORY) {
-						Melder_throw ("Demotion-only learning step: Loser wins! Should never happen.");
+						Melder_throw (U"Demotion-only learning step: Loser wins! Should never happen.");
 					} else {
 						// do nothing; the whole demotion-only idea does not really apply very well to non-OT decision strategies
 					}
@@ -679,7 +678,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 			}
 			if (icons > my numberOfConstraints) {   // completed the loop?
 				if (my decisionStrategy == kOTGrammar_decisionStrategy_OPTIMALITY_THEORY) {
-					Melder_throw ("(OTGrammar_step:) Loser equals correct candidate: loser \"", loser -> string, "\", winner \"", winner -> string, "\".");
+					Melder_throw (U"(OTGrammar_step:) Loser equals correct candidate: loser \"", loser -> string, U"\", winner \"", winner -> string, U"\".");
 				} else {
 					// do nothing
 				}
@@ -694,7 +693,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 				offendingConstraint -> ranking -= /*numberOfUp **/ constraintStep * (1.0 - offendingConstraint -> ranking * my leak);
 			}
 		}
-		if (grammarHasChanged != NULL) *grammarHasChanged = changed;
+		if (grammarHasChanged) *grammarHasChanged = changed;
 	} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_ALL_UP_HIGHEST_DOWN_2012) {
 		bool changed = false;
 		long numberOfUp = 0;
@@ -723,10 +722,10 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 				winnerMarks = winner -> marks [my index [icons]];   /* Order is important, so indirect. */
 				loserMarks = loser -> marks [my index [icons]];
 				if (my constraints [my index [icons]]. tiedToTheRight)
-					Melder_throw ("Demotion-only learning cannot handle tied constraints.");
+					Melder_throw (U"Demotion-only learning cannot handle tied constraints.");
 				if (loserMarks < winnerMarks) {
 					if (my decisionStrategy == kOTGrammar_decisionStrategy_OPTIMALITY_THEORY) {
-						Melder_throw ("Demotion-only learning step: Loser wins! Should never happen.");
+						Melder_throw (U"Demotion-only learning step: Loser wins! Should never happen.");
 					} else {
 						// do nothing; the whole demotion-only idea does not really apply very well to non-OT decision strategies
 					}
@@ -735,7 +734,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 			}
 			if (icons > my numberOfConstraints) {   // completed the loop?
 				if (my decisionStrategy == kOTGrammar_decisionStrategy_OPTIMALITY_THEORY) {
-					Melder_throw ("(OTGrammar_step:) Loser equals correct candidate: loser \"", loser -> string, "\", winner \"", winner -> string, "\".");
+					Melder_throw (U"(OTGrammar_step:) Loser equals correct candidate: loser \"", loser -> string, U"\", winner \"", winner -> string, U"\".");
 				} else {
 					// do nothing
 				}
@@ -750,7 +749,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 				offendingConstraint -> ranking -= /*numberOfUp **/ constraintStep * (1.0 - offendingConstraint -> ranking * my leak);
 			}
 		}
-		if (grammarHasChanged != NULL) *grammarHasChanged = changed;
+		if (grammarHasChanged) *grammarHasChanged = changed;
 	} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_ALL_UP_HIGH_DOWN) {
 		long numberOfDown = 0, numberOfUp = 0, lowestDemotableConstraint = 0;
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
@@ -773,7 +772,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 				int winnerMarks = winner -> marks [constraintIndex];   // the order is important, therefore indirect
 				int loserMarks = loser -> marks [constraintIndex];
 				if (my constraints [constraintIndex]. tiedToTheRight)
-					Melder_throw ("Demotion-only learning cannot handle tied constraints.");
+					Melder_throw (U"Demotion-only learning cannot handle tied constraints.");
 				if (loserMarks < winnerMarks) {
 					if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - loserMarks;
 					constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) * numberOfDown / (numberOfUp + 0.0);
@@ -784,7 +783,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 					}
 				}
 			}
-			if (grammarHasChanged != NULL) *grammarHasChanged = true;
+			if (grammarHasChanged) *grammarHasChanged = true;
 		}
 	} else if (updateRule == kOTGrammar_rerankingStrategy_WEIGHTED_ALL_UP_HIGH_DOWN_2012) {
 		long numberOfDown = 0, numberOfUp = 0, lowestDemotableConstraint = 0;
@@ -808,7 +807,7 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 				int winnerMarks = winner -> marks [constraintIndex];   // the order is important, therefore indirect
 				int loserMarks = loser -> marks [constraintIndex];
 				if (my constraints [constraintIndex]. tiedToTheRight)
-					Melder_throw ("Demotion-only learning cannot handle tied constraints.");
+					Melder_throw (U"Demotion-only learning cannot handle tied constraints.");
 				if (loserMarks < winnerMarks) {
 					if (multiplyStepByNumberOfViolations) constraintStep *= winnerMarks - loserMarks;
 					constraint -> ranking += constraintStep * (1.0 - constraint -> ranking * my leak) * numberOfDown / (numberOfUp + 1.0);
@@ -819,25 +818,25 @@ static void OTMulti_modifyRankings (OTMulti me, long iwinner, long iloser,
 					}
 				}
 			}
-			if (grammarHasChanged != NULL) *grammarHasChanged = true;
+			if (grammarHasChanged) *grammarHasChanged = true;
 		}
 	}
 }
 
-int OTMulti_learnOne (OTMulti me, const wchar_t *form1, const wchar_t *form2,
+int OTMulti_learnOne (OTMulti me, const char32 *form1, const char32 *form2,
 	enum kOTGrammar_rerankingStrategy updateRule, int direction, double plasticity, double relativePlasticityNoise)
 {
 	long iloser = OTMulti_getWinner (me, form1, form2);
 	if (direction & OTMulti_LEARN_FORWARD) {
 		if (Melder_debug == 47) OTMulti_newDisharmonies (me, 2.0);
-		long iwinner = OTMulti_getWinner (me, form1, L"");
-		if (Melder_debug != 47 || ! OTMulti_candidateMatches (me, iwinner, form2, L""))
+		long iwinner = OTMulti_getWinner (me, form1, U"");
+		if (Melder_debug != 47 || ! OTMulti_candidateMatches (me, iwinner, form2, U""))
 			OTMulti_modifyRankings (me, iwinner, iloser, updateRule, plasticity, relativePlasticityNoise);
 	}
 	if (direction & OTMulti_LEARN_BACKWARD) {
 		if (Melder_debug == 47) OTMulti_newDisharmonies (me, 2.0);
-		long iwinner = OTMulti_getWinner (me, form2, L"");
-		if (Melder_debug != 47 || ! OTMulti_candidateMatches (me, iwinner, form1, L""))
+		long iwinner = OTMulti_getWinner (me, form2, U"");
+		if (Melder_debug != 47 || ! OTMulti_candidateMatches (me, iwinner, form1, U""))
 			OTMulti_modifyRankings (me, iwinner, iloser, updateRule, plasticity, relativePlasticityNoise);
 	}
 	return 1;
@@ -846,27 +845,27 @@ int OTMulti_learnOne (OTMulti me, const wchar_t *form1, const wchar_t *form2,
 static Table OTMulti_createHistory (OTMulti me, long storeHistoryEvery, long numberOfData)
 {
 	try {
-		long numberOfSamplingPoints = numberOfData / storeHistoryEvery;   /* E.g. 0, 20, 40, ... */
+		long numberOfSamplingPoints = numberOfData / storeHistoryEvery;   // e.g. 0, 20, 40, ...
 		autoTable thee = Table_createWithoutColumnNames (1 + numberOfSamplingPoints, 3 + my numberOfConstraints);
-		Table_setColumnLabel (thee.peek(), 1, L"Datum");
-		Table_setColumnLabel (thee.peek(), 2, L"Form1");
-		Table_setColumnLabel (thee.peek(), 3, L"Form2");
+		Table_setColumnLabel (thee.peek(), 1, U"Datum");
+		Table_setColumnLabel (thee.peek(), 2, U"Form1");
+		Table_setColumnLabel (thee.peek(), 3, U"Form2");
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			Table_setColumnLabel (thee.peek(), 3 + icons, my constraints [icons]. name);
 		}
 		Table_setNumericValue (thee.peek(), 1, 1, 0);
-		Table_setStringValue (thee.peek(), 1, 2, L"(initial)");
-		Table_setStringValue (thee.peek(), 1, 3, L"(initial)");
+		Table_setStringValue (thee.peek(), 1, 2, U"(initial)");
+		Table_setStringValue (thee.peek(), 1, 3, U"(initial)");
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			Table_setNumericValue (thee.peek(), 1, 3 + icons, my constraints [icons]. ranking);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": history not created.");
+		Melder_throw (me, U": history not created.");
 	}
 }
 
-static int OTMulti_updateHistory (OTMulti me, Table thee, long storeHistoryEvery, long idatum, const wchar_t *form1, const wchar_t *form2)
+static int OTMulti_updateHistory (OTMulti me, Table thee, long storeHistoryEvery, long idatum, const char32 *form1, const char32 *form2)
 {
 	try {
 		if (idatum % storeHistoryEvery == 0) {
@@ -880,7 +879,7 @@ static int OTMulti_updateHistory (OTMulti me, Table thee, long storeHistoryEvery
 		}
 		return 1;
 	} catch (MelderError) {
-		Melder_throw (me, ": history not updated.");
+		Melder_throw (me, U": history not updated.");
 	}
 }
 
@@ -892,7 +891,7 @@ void OTMulti_PairDistribution_learn (OTMulti me, PairDistribution thee, double e
 	long idatum = 0, numberOfData = numberOfPlasticities * replicationsPerPlasticity;
 	try {
 		double plasticity = initialPlasticity;
-		autoMelderMonitor monitor (L"Learning from partial pairs...");
+		autoMelderMonitor monitor (U"Learning from partial pairs...");
 		if (monitor.graphics()) {
 			Graphics_clearWs (monitor.graphics());
 		}
@@ -902,7 +901,7 @@ void OTMulti_PairDistribution_learn (OTMulti me, PairDistribution thee, double e
 		}
 		for (long iplasticity = 1; iplasticity <= numberOfPlasticities; iplasticity ++) {
 			for (long ireplication = 1; ireplication <= replicationsPerPlasticity; ireplication ++) {
-				wchar_t *form1, *form2;
+				char32 *form1, *form2;
 				PairDistribution_peekPair (thee, & form1, & form2);
 				++ idatum;
 				if (monitor.graphics() && idatum % (numberOfData / 400 + 1) == 0) {
@@ -924,8 +923,8 @@ void OTMulti_PairDistribution_learn (OTMulti me, PairDistribution thee, double e
 				}
 				try {
 					Melder_monitor ((double) idatum / numberOfData,
-						L"Processing partial pair ", Melder_integer (idatum), L" out of ", Melder_integer (numberOfData),
-						L":\n      ", form1, L"     ", form2);
+						U"Processing partial pair ", idatum, U" out of ", numberOfData,
+						U":\n      ", form1, U"     ", form2);
 				} catch (MelderError) {
 					if (history_out)
 						*history_out = history.transfer();   // so that we can inspect
@@ -950,12 +949,12 @@ void OTMulti_PairDistribution_learn (OTMulti me, PairDistribution thee, double e
 			*history_out = history.transfer();
 	} catch (MelderError) {
 		if (idatum > 1)
-			Melder_error_ ("Only ", idatum - 1, " input-output pairs out of ", numberOfData, " were processed.");
-		Melder_throw (me, " & ", thee, ": learning from partial pairs not completed.");
+			Melder_appendError (U"Only ", idatum - 1, U" input-output pairs out of ", numberOfData, U" were processed.");
+		Melder_throw (me, U" & ", thee, U": learning from partial pairs not completed.");
 	}
 }
 
-static long OTMulti_crucialCell (OTMulti me, long icand, long iwinner, long numberOfOptimalCandidates, const wchar_t *form1, const wchar_t *form2)
+static long OTMulti_crucialCell (OTMulti me, long icand, long iwinner, long numberOfOptimalCandidates, const char32 *form1, const char32 *form2)
 {
 	if (my numberOfCandidates < 2) return 0;   // if there is only one candidate, all cells can be greyed
 	if (OTMulti_compareCandidates (me, icand, iwinner) == 0) {   // candidate equally good as winner?
@@ -990,11 +989,11 @@ static long OTMulti_crucialCell (OTMulti me, long icand, long iwinner, long numb
 }
 
 static double OTMulti_constraintWidth (Graphics g, OTConstraint constraint, bool showDisharmony) {
-	wchar_t text [100], *newLine;
-	double maximumWidth = showDisharmony ? 0.8 * Graphics_textWidth_ps (g, Melder_fixed (constraint -> disharmony, 1), TRUE) : 0.0,
+	char32 text [100], *newLine;
+	double maximumWidth = showDisharmony ? 0.8 * Graphics_textWidth_ps (g, Melder_fixed (constraint -> disharmony, 1), true) : 0.0,
 		firstWidth, secondWidth;
-	wcscpy (text, constraint -> name);
-	newLine = wcschr (text, '\n');
+	str32cpy (text, constraint -> name);
+	newLine = str32chr (text, U'\n');
 	if (newLine) {
 		*newLine = '\0';
 		firstWidth = Graphics_textWidth_ps (g, text, true);
@@ -1008,12 +1007,12 @@ static double OTMulti_constraintWidth (Graphics g, OTConstraint constraint, bool
 	return maximumWidth;
 }
 
-void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wchar_t *form2, bool vertical, bool showDisharmonies) {
+void OTMulti_drawTableau (OTMulti me, Graphics g, const char32 *form1, const char32 *form2, bool vertical, bool showDisharmonies) {
 	long winner, winner1 = 0, winner2 = 0;
 	double x, y, fontSize = Graphics_inqFontSize (g);
 	Graphics_Colour colour = Graphics_inqColour (g);
-	wchar_t text [200];
-	bool bidirectional = form1 [0] != '\0' && form2 [0] != '\0';
+	char32 text [200];
+	bool bidirectional = form1 [0] != U'\0' && form2 [0] != U'\0';
 	try {
 		winner = OTMulti_getWinner (me, form1, form2);
 	} catch (MelderError) {
@@ -1021,13 +1020,13 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 		Graphics_setWindow (g, 0.0, 1.0, 0.0, 1.0);
 		Graphics_setTextAlignment (g, Graphics_LEFT, Graphics_HALF);
 		Graphics_rectangle (g, 0, 1, 0, 1);
-		Graphics_text (g, 0.0, 0.5, L"(no matching candidates)");
+		Graphics_text (g, 0.0, 0.5, U"(no matching candidates)");
 		return;
 	}
 
 	if (bidirectional) {
-		winner1 = OTMulti_getWinner (me, form1, L"");
-		winner2 = OTMulti_getWinner (me, form2, L"");
+		winner1 = OTMulti_getWinner (me, form1, U"");
+		winner2 = OTMulti_getWinner (me, form2, U"");
 	}
 	Graphics_setWindow (g, 0.0, 1.0, 0.0, 1.0);
 	const double margin = Graphics_dxMMtoWC (g, 1.0);
@@ -1055,7 +1054,7 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 		headerHeight = rowHeight;
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			OTConstraint constraint = & my constraints [icons];
-			if (wcschr (constraint -> name, '\n')) {
+			if (str32chr (constraint -> name, U'\n')) {
 				headerHeight += 0.7 * rowHeight;
 				break;
 			}
@@ -1065,15 +1064,15 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 	 * Compute longest candidate string.
 	 * Also count the number of optimal candidates (if there are more than one, the fingers will be drawn in red).
 	 */
-	double candWidth = Graphics_textWidth_ps (g, form1, TRUE) + Graphics_textWidth_ps (g, form2, true);
+	double candWidth = Graphics_textWidth_ps (g, form1, true) + Graphics_textWidth_ps (g, form2, true);
 	long numberOfMatchingCandidates = 0;
 	long numberOfOptimalCandidates = 0;
 	long numberOfOptimalCandidates1 = 0;
 	long numberOfOptimalCandidates2 = 0;
 	for (long icand = 1; icand <= my numberOfCandidates; icand ++) {
-		if ((form1 [0] != '\0' && OTMulti_candidateMatches (me, icand, form1, L"")) ||
-		    (form2 [0] != '\0' && OTMulti_candidateMatches (me, icand, form2, L"")) ||
-		    (form1 [0] == '\0' && form2 [0] == '\0'))
+		if ((form1 [0] != U'\0' && OTMulti_candidateMatches (me, icand, form1, U"")) ||
+		    (form2 [0] != U'\0' && OTMulti_candidateMatches (me, icand, form2, U"")) ||
+		    (form1 [0] == U'\0' && form2 [0] == U'\0'))
 		{
 			double width = Graphics_textWidth_ps (g, my candidates [icand]. string, true);
 			if (width > candWidth) candWidth = width;
@@ -1116,7 +1115,7 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 	 */
 	y -= headerHeight;
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-	Graphics_text2 (g, x + 0.5 * candWidth, y + 0.5 * headerHeight, form1, form2);
+	Graphics_text (g, x + 0.5 * candWidth, y + 0.5 * headerHeight,   form1, form2);
 	Graphics_rectangle (g, x, x + candWidth, y, y + headerHeight);
 	/*
 	 * Draw constraint names.
@@ -1126,11 +1125,11 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 	for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 		OTConstraint constraint = & my constraints [my index [icons]];
 		double width = vertical ? rowHeight / worldAspectRatio : OTMulti_constraintWidth (g, constraint, showDisharmonies) + margin * 2;
-		if (wcschr (constraint -> name, '\n')) {
-			wchar_t *newLine;
-			wcscpy (text, constraint -> name);
-			newLine = wcschr (text, '\n');
-			*newLine = '\0';
+		if (str32chr (constraint -> name, U'\n')) {
+			char32 *newLine;
+			Melder_sprint (text,200, constraint -> name);
+			newLine = str32chr (text, U'\n');
+			*newLine = U'\0';
 			Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_TOP);
 			Graphics_text (g, x + 0.5 * width, y + headerHeight, text);
 			Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_BOTTOM);
@@ -1158,9 +1157,9 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 	 */
 	y -= doubleLineDy;
 	for (long icand = 1; icand <= my numberOfCandidates; icand ++)
-		if ((form1 [0] != '\0' && OTMulti_candidateMatches (me, icand, form1, L"")) ||
-		    (form2 [0] != '\0' && OTMulti_candidateMatches (me, icand, form2, L"")) ||
-		    (form1 [0] == '\0' && form2 [0] == '\0'))
+		if ((form1 [0] != U'\0' && OTMulti_candidateMatches (me, icand, form1, U"")) ||
+		    (form2 [0] != U'\0' && OTMulti_candidateMatches (me, icand, form2, U"")) ||
+		    (form1 [0] == U'\0' && form2 [0] == U'\0'))
 	{
 		long crucialCell = OTMulti_crucialCell (me, icand, winner, numberOfOptimalCandidates, form1, form2);
 		int candidateIsOptimal = OTMulti_compareCandidates (me, icand, winner) == 0;
@@ -1177,7 +1176,7 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 			Graphics_setTextAlignment (g, Graphics_LEFT, Graphics_HALF);
 			Graphics_setFontSize (g, (int) ((bidirectional ? 1.2 : 1.5) * fontSize));
 			if (numberOfOptimalCandidates > 1) Graphics_setColour (g, Graphics_RED);
-			Graphics_text (g, x + margin, y + descent - Graphics_dyMMtoWC (g, 0.5) * fontSize / 12.0, bidirectional ? L"\\Vr" : L"\\pf");
+			Graphics_text (g, x + margin, y + descent - Graphics_dyMMtoWC (g, 0.5) * fontSize / 12.0, bidirectional ? U"\\Vr" : U"\\pf");
 			Graphics_setColour (g, colour);
 			Graphics_setFontSize (g, (int) fontSize);
 		}
@@ -1185,7 +1184,7 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 			Graphics_setTextAlignment (g, Graphics_LEFT, Graphics_HALF);
 			Graphics_setFontSize (g, (int) (1.5 * fontSize));
 			if (numberOfOptimalCandidates1 > 1) Graphics_setColour (g, Graphics_RED);
-			Graphics_text (g, x + margin + fingerWidth, y + descent - Graphics_dyMMtoWC (g, 0.5) * fontSize / 12.0, L"\\pf");
+			Graphics_text (g, x + margin + fingerWidth, y + descent - Graphics_dyMMtoWC (g, 0.5) * fontSize / 12.0, U"\\pf");
 			Graphics_setColour (g, colour);
 			Graphics_setFontSize (g, (int) fontSize);
 		}
@@ -1194,7 +1193,7 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 			Graphics_setFontSize (g, (int) (1.5 * fontSize));
 			if (numberOfOptimalCandidates2 > 1) Graphics_setColour (g, Graphics_RED);
 			Graphics_setTextRotation (g, 180);
-			Graphics_text (g, x + margin + fingerWidth * 2, y + descent - Graphics_dyMMtoWC (g, 0.0) * fontSize / 12.0, L"\\pf");
+			Graphics_text (g, x + margin + fingerWidth * 2, y + descent - Graphics_dyMMtoWC (g, 0.0) * fontSize / 12.0, U"\\pf");
 			Graphics_setTextRotation (g, 0);
 			Graphics_setColour (g, colour);
 			Graphics_setFontSize (g, (int) fontSize);
@@ -1225,19 +1224,19 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 			int index = my index [icons];
 			OTConstraint constraint = & my constraints [index];
 			double width = vertical ? rowHeight / worldAspectRatio : OTMulti_constraintWidth (g, constraint, showDisharmonies) + margin * 2;
-			wchar_t markString [40];
-			markString [0] = '\0';
+			char32 markString [40];
+			markString [0] = U'\0';
 			if (bidirectional && my candidates [icand]. marks [index] > 0) {
 				if ((candidateIsOptimal1 || candidateIsOptimal2) && ! candidateIsOptimal) {
-					wcscat (markString, L"\\<-");
+					str32cpy (markString + str32len (markString), U"\\<-");
 				}
 			}
 			if (bidirectional && my candidates [icand]. marks [index] < 0) {
 				if (candidateIsOptimal && ! candidateIsOptimal1) {
-					wcscat (markString, L"\\<-");
+					str32cpy (markString + str32len (markString), U"\\<-");
 				}
 				if (candidateIsOptimal && ! candidateIsOptimal2) {
-					wcscat (markString, L"\\<-");
+					str32cpy (markString + str32len (markString), U"\\<-");
 				}
 			}
 			/*
@@ -1250,41 +1249,41 @@ void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wc
 			{
 				int winnerMarks = my candidates [winner]. marks [index];
 				if (winnerMarks + 1 > 5) {
-					wcscat (markString, Melder_integer (winnerMarks + 1));
+					str32cpy (markString + str32len (markString), Melder_integer (winnerMarks + 1));
 				} else {
 					for (long imark = 1; imark <= winnerMarks + 1; imark ++)
-						wcscat (markString, L"*");
+						str32cpy (markString + str32len (markString), U"*");
 				}
 				for (long imark = my candidates [icand]. marks [index]; imark < 0; imark ++)
-					wcscat (markString, L"+");
-				wcscat (markString, L"!");
+					str32cpy (markString + str32len (markString), U"+");
+				str32cpy (markString + str32len (markString), U"!");
 				if (my candidates [icand]. marks [index] - (winnerMarks + 2) + 1 > 5) {
-					wcscat (markString, Melder_integer (my candidates [icand]. marks [index] - (winnerMarks + 2) + 1));
+					str32cpy (markString + str32len (markString), Melder_integer (my candidates [icand]. marks [index] - (winnerMarks + 2) + 1));
 				} else {
 					for (long imark = winnerMarks + 2; imark <= my candidates [icand]. marks [index]; imark ++)
-						wcscat (markString, L"*");
+						str32cpy (markString + str32len (markString), U"*");
 				}
 			} else {
 				if (my candidates [icand]. marks [index] > 5) {
-					wcscat (markString, Melder_integer (my candidates [icand]. marks [index]));
+					str32cpy (markString + str32len (markString), Melder_integer (my candidates [icand]. marks [index]));
 				} else {
 					for (long imark = 1; imark <= my candidates [icand]. marks [index]; imark ++)
-						wcscat (markString, L"*");
+						str32cpy (markString + str32len (markString), U"*");
 					for (long imark = my candidates [icand]. marks [index]; imark < 0; imark ++)
-						wcscat (markString, L"+");
+						str32cpy (markString + str32len (markString), U"+");
 				}
 			}
 			if (bidirectional && my candidates [icand]. marks [index] > 0) {
 				if (candidateIsOptimal && ! candidateIsOptimal1) {
-					wcscat (markString, L"\\->");
+					str32cpy (markString + str32len (markString), U"\\->");
 				}
 				if (candidateIsOptimal && ! candidateIsOptimal2) {
-					wcscat (markString, L"\\->");
+					str32cpy (markString + str32len (markString), U"\\->");
 				}
 			}
 			if (bidirectional && my candidates [icand]. marks [index] < 0) {
 				if ((candidateIsOptimal1 || candidateIsOptimal2) && ! candidateIsOptimal) {
-					wcscat (markString, L"\\->");
+					str32cpy (markString + str32len (markString), U"\\->");
 				}
 			}
 			Graphics_text (g, x + 0.5 * width, y + descent, markString);
@@ -1315,48 +1314,48 @@ void OTMulti_reset (OTMulti me, double ranking) {
 void OTMulti_setRanking (OTMulti me, long constraint, double ranking, double disharmony) {
 	try {
 		if (constraint < 1)
-			Melder_throw ("The constraint number should be positive, not ", constraint, ".");
+			Melder_throw (U"The constraint number should be positive, not ", constraint, U".");
 		if (constraint > my numberOfConstraints)
-			Melder_throw ("Constraint ", constraint, " does not exist (there are only ", my numberOfConstraints, " constraints).");
+			Melder_throw (U"Constraint ", constraint, U" does not exist (there are only ", my numberOfConstraints, U" constraints).");
 		my constraints [constraint]. ranking = ranking;
 		my constraints [constraint]. disharmony = disharmony;
 		OTMulti_sort (me);
 	} catch (MelderError) {
-		Melder_throw (me, ": ranking not set.");
+		Melder_throw (me, U": ranking not set.");
 	}
 }
 
 void OTMulti_setConstraintPlasticity (OTMulti me, long constraint, double plasticity) {
 	try {
 		if (constraint < 1)
-			Melder_throw ("The constraint number should be positive, not ", constraint, ".");
+			Melder_throw (U"The constraint number should be positive, not ", constraint, U".");
 		if (constraint > my numberOfConstraints)
-			Melder_throw ("Constraint ", constraint, " does not exist (there are only ", my numberOfConstraints, " constraints).");
+			Melder_throw (U"Constraint ", constraint, U" does not exist (there are only ", my numberOfConstraints, U" constraints).");
 		my constraints [constraint]. plasticity = plasticity;
 	} catch (MelderError) {
-		Melder_throw (me, ": constraint plasticity not set.");
+		Melder_throw (me, U": constraint plasticity not set.");
 	}
 }
 
-void OTMulti_removeConstraint (OTMulti me, const wchar_t *constraintName) {
+void OTMulti_removeConstraint (OTMulti me, const char32 *constraintName) {
 	try {
 		long removed = 0;
 
 		if (my numberOfConstraints <= 1)
-			Melder_throw (me, ": cannot remove last constraint.");
+			Melder_throw (me, U": cannot remove last constraint.");
 
 		/*
 		 * Look for the constraint to be removed.
 		 */
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) {
 			OTConstraint constraint = & my constraints [icons];
-			if (wcsequ (constraint -> name, constraintName)) {
+			if (str32equ (constraint -> name, constraintName)) {
 				removed = icons;
 				break;
 			}
 		}
 		if (removed == 0)
-			Melder_throw ("No constraint \"", constraintName, "\".");
+			Melder_throw (U"No constraint \"", constraintName, U"\".");
 		/*
 		 * Remove the constraint while reusing the memory space.
 		 */
@@ -1384,17 +1383,17 @@ void OTMulti_removeConstraint (OTMulti me, const wchar_t *constraintName) {
 		for (long icons = 1; icons <= my numberOfConstraints; icons ++) my index [icons] = icons;
 		OTMulti_sort (me);
 	} catch (MelderError) {
-		Melder_throw (me, ": constraint not removed.");
+		Melder_throw (me, U": constraint not removed.");
 	}
 }
 
-void OTMulti_generateOptimalForm (OTMulti me, const wchar_t *form1, const wchar_t *form2, wchar_t *optimalForm, double evaluationNoise) {
+void OTMulti_generateOptimalForm (OTMulti me, const char32 *form1, const char32 *form2, char32 *optimalForm, double evaluationNoise) {
 	try {
 		OTMulti_newDisharmonies (me, evaluationNoise);
 		long winner = OTMulti_getWinner (me, form1, form2);
-		wcscpy (optimalForm, my candidates [winner]. string);
+		str32cpy (optimalForm, my candidates [winner]. string);
 	} catch (MelderError) {
-		Melder_throw (me, ": optimal form not generated.");
+		Melder_throw (me, U": optimal form not generated.");
 	}
 }
 
@@ -1403,35 +1402,35 @@ Strings OTMulti_Strings_generateOptimalForms (OTMulti me, Strings thee, double e
 		autoStrings outputs = Thing_new (Strings);
 		long n = thy numberOfStrings;
 		outputs -> numberOfStrings = n;
-		outputs -> strings = NUMvector <wchar_t*> (1, n);
+		outputs -> strings = NUMvector <char32 *> (1, n);
 		for (long i = 1; i <= n; i ++) {
-			wchar_t output [100];
-			OTMulti_generateOptimalForm (me, thy strings [i], L"", output, evaluationNoise);
-			outputs -> strings [i] = Melder_wcsdup (output);
+			char32 output [100];
+			OTMulti_generateOptimalForm (me, thy strings [i], U"", output, evaluationNoise);
+			outputs -> strings [i] = Melder_dup (output);
 		}
 		return outputs.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": optimal forms not generated.");
+		Melder_throw (me, U" & ", thee, U": optimal forms not generated.");
 	}
 }
 
-Strings OTMulti_generateOptimalForms (OTMulti me, const wchar_t *form1, const wchar_t *form2, long numberOfTrials, double evaluationNoise) {
+Strings OTMulti_generateOptimalForms (OTMulti me, const char32 *form1, const char32 *form2, long numberOfTrials, double evaluationNoise) {
 	try {
 		autoStrings outputs = Thing_new (Strings);
 		outputs -> numberOfStrings = numberOfTrials;
-		outputs -> strings = NUMvector <wchar_t*> (1, numberOfTrials);
+		outputs -> strings = NUMvector <char32 *> (1, numberOfTrials);
 		for (long i = 1; i <= numberOfTrials; i ++) {
-			wchar_t output [100];
+			char32 output [100];
 			OTMulti_generateOptimalForm (me, form1, form2, output, evaluationNoise);
-			outputs -> strings [i] = Melder_wcsdup (output);
+			outputs -> strings [i] = Melder_dup (output);
 		}
 		return outputs.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": optimal forms not generated.");
+		Melder_throw (me, U": optimal forms not generated.");
 	}
 }
 
-Distributions OTMulti_to_Distribution (OTMulti me, const wchar_t *form1, const wchar_t *form2,
+Distributions OTMulti_to_Distribution (OTMulti me, const char32 *form1, const char32 *form2,
 	long numberOfTrials, double evaluationNoise)
 {
 	try {
@@ -1455,7 +1454,7 @@ Distributions OTMulti_to_Distribution (OTMulti me, const wchar_t *form1, const w
 		iout = 0;
 		for (long icand = 1; icand <= my numberOfCandidates; icand ++) {
 			if (OTMulti_candidateMatches (me, icand, form1, form2)) {
-				thy rowLabels [++ iout] = Melder_wcsdup (my candidates [icand]. string);
+				thy rowLabels [++ iout] = Melder_dup (my candidates [icand]. string);
 				index [icand] = iout;
 			}
 		}
@@ -1469,7 +1468,7 @@ Distributions OTMulti_to_Distribution (OTMulti me, const wchar_t *form1, const w
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": distribution not computed.");
+		Melder_throw (me, U": distribution not computed.");
 	}
 }
 
diff --git a/gram/OTMulti.h b/gram/OTMulti.h
index 4f01065..4521f63 100644
--- a/gram/OTMulti.h
+++ b/gram/OTMulti.h
@@ -2,7 +2,7 @@
 #define _OTMulti_h_
 /* OTMulti.h
  *
- * Copyright (C) 2005-2011,2014 Paul Boersma
+ * Copyright (C) 2005-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,9 +25,9 @@
 #include "OTGrammar.h"
 
 #include "OTMulti_def.h"
-oo_CLASS_CREATE (OTMulti, Data);
+oo_CLASS_CREATE (OTMulti, Daata);
 
-long OTMulti_getConstraintIndexFromName (OTMulti me, const wchar_t *name);
+long OTMulti_getConstraintIndexFromName (OTMulti me, const char32 *name);
 
 void OTMulti_checkIndex (OTMulti me);
 
@@ -40,21 +40,21 @@ void OTMulti_sort (OTMulti me);
 
 void OTMulti_newDisharmonies (OTMulti me, double evaluationNoise);
 
-int OTMulti_candidateMatches (OTMulti me, long icand, const wchar_t *form1, const wchar_t *form2);
+int OTMulti_candidateMatches (OTMulti me, long icand, const char32 *form1, const char32 *form2);
 int OTMulti_compareCandidates (OTMulti me, long icand1, long icand2);
-long OTMulti_getWinner (OTMulti me, const wchar_t *form1, const wchar_t *form2);
+long OTMulti_getWinner (OTMulti me, const char32 *form1, const char32 *form2);
 
 #define OTMulti_LEARN_FORWARD  1
 #define OTMulti_LEARN_BACKWARD  2
 #define OTMulti_LEARN_BIDIRECTIONALLY  3
-int OTMulti_learnOne (OTMulti me, const wchar_t *form1, const wchar_t *form2,
+int OTMulti_learnOne (OTMulti me, const char32 *form1, const char32 *form2,
 	enum kOTGrammar_rerankingStrategy updateRule, int direction, double plasticity, double relativePlasticityNoise);
 void OTMulti_PairDistribution_learn (OTMulti me, PairDistribution thee,
 	double evaluationNoise, enum kOTGrammar_rerankingStrategy updateRule, int direction,
 	double initialPlasticity, long replicationsPerPlasticity, double plasticityDecrement,
 	long numberOfPlasticities, double relativePlasticityNoise, long storeHistoryEvery, Table *history_out);
 
-void OTMulti_drawTableau (OTMulti me, Graphics g, const wchar_t *form1, const wchar_t *form2, bool vertical, bool showDisharmonies);
+void OTMulti_drawTableau (OTMulti me, Graphics g, const char32 *form1, const char32 *form2, bool vertical, bool showDisharmonies);
 
 OTMulti OTMulti_create_metrics (int equal_footForm_wsp, int trochaicityConstraint, int includeFootBimoraic, int includeFootBisyllabic,
 	int includePeripheral, int nonfinalityConstraint, int overtFormsHaveSecondaryStress,
@@ -63,11 +63,11 @@ OTMulti OTMulti_create_metrics (int equal_footForm_wsp, int trochaicityConstrain
 void OTMulti_reset (OTMulti me, double ranking);
 void OTMulti_setRanking (OTMulti me, long constraint, double ranking, double disharmony);
 void OTMulti_setConstraintPlasticity (OTMulti me, long constraint, double plasticity);
-void OTMulti_removeConstraint (OTMulti me, const wchar_t *constraintName);
+void OTMulti_removeConstraint (OTMulti me, const char32 *constraintName);
 
-void OTMulti_generateOptimalForm (OTMulti me, const wchar_t *form1, const wchar_t *form2, wchar_t *optimalForm, double evaluationNoise);
-Strings OTMulti_generateOptimalForms (OTMulti me, const wchar_t *form1, const wchar_t *form2, long numberOfTrials, double evaluationNoise);
-Distributions OTMulti_to_Distribution (OTMulti me, const wchar_t *form1, const wchar_t *form2, long numberOfTrials, double evaluationNoise);
+void OTMulti_generateOptimalForm (OTMulti me, const char32 *form1, const char32 *form2, char32 *optimalForm, double evaluationNoise);
+Strings OTMulti_generateOptimalForms (OTMulti me, const char32 *form1, const char32 *form2, long numberOfTrials, double evaluationNoise);
+Distributions OTMulti_to_Distribution (OTMulti me, const char32 *form1, const char32 *form2, long numberOfTrials, double evaluationNoise);
 Strings OTMulti_Strings_generateOptimalForms (OTMulti me, Strings forms, double evaluationNoise);
 
 /* End of file OTMulti.h */
diff --git a/gram/OTMultiEditor.cpp b/gram/OTMultiEditor.cpp
index ea6179f..2a024a3 100644
--- a/gram/OTMultiEditor.cpp
+++ b/gram/OTMultiEditor.cpp
@@ -1,6 +1,6 @@
 /* OTMultiEditor.cpp
  *
- * Copyright (C) 2005-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 2005-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,82 +32,82 @@ Thing_implement (OTMultiEditor, HyperPage, 0);
 
 static void menu_cb_evaluate (EDITOR_ARGS) {
 	EDITOR_IAM (OTMultiEditor);
-	EDITOR_FORM (L"Evaluate", 0)
-		REAL (L"Evaluation noise", L"2.0")
+	EDITOR_FORM (U"Evaluate", 0)
+		REAL (U"Evaluation noise", U"2.0")
 	EDITOR_OK
 	EDITOR_DO
-		Editor_save (me, L"Evaluate");
-		OTMulti_newDisharmonies ((OTMulti) my data, GET_REAL (L"Evaluation noise"));
+		Editor_save (me, U"Evaluate");
+		OTMulti_newDisharmonies ((OTMulti) my data, GET_REAL (U"Evaluation noise"));
 		Graphics_updateWs (my g);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_evaluate_noise_2_0 (EDITOR_ARGS) {
 	EDITOR_IAM (OTMultiEditor);
-	Editor_save (me, L"Evaluate (noise 2.0)");
+	Editor_save (me, U"Evaluate (noise 2.0)");
 	OTMulti_newDisharmonies ((OTMulti) my data, 2.0);
 	Graphics_updateWs (my g);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_evaluate_tinyNoise (EDITOR_ARGS) {
 	EDITOR_IAM (OTMultiEditor);
-	Editor_save (me, L"Evaluate (tiny noise)");
+	Editor_save (me, U"Evaluate (tiny noise)");
 	OTMulti_newDisharmonies ((OTMulti) my data, 1e-9);
 	Graphics_updateWs (my g);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_editRanking (EDITOR_ARGS) {
 	EDITOR_IAM (OTMultiEditor);
-	EDITOR_FORM (L"Edit ranking", 0)
-		LABEL (L"constraint", L"");
-		REAL (L"Ranking value", L"100.0");
-		REAL (L"Disharmony", L"100.0");
+	EDITOR_FORM (U"Edit ranking", 0)
+		LABEL (U"constraint", U"");
+		REAL (U"Ranking value", U"100.0");
+		REAL (U"Disharmony", U"100.0");
 	EDITOR_OK
 		OTMulti grammar = (OTMulti) my data;
 		OTConstraint constraint;
 		if (my selectedConstraint < 1 || my selectedConstraint > grammar -> numberOfConstraints)
-			Melder_throw ("Select a constraint first.");
+			Melder_throw (U"Select a constraint first.");
 		constraint = & grammar -> constraints [grammar -> index [my selectedConstraint]];
-		SET_STRING (L"constraint", constraint -> name)
-		SET_REAL (L"Ranking value", constraint -> ranking)
-		SET_REAL (L"Disharmony", constraint -> disharmony)
+		SET_STRING (U"constraint", constraint -> name)
+		SET_REAL (U"Ranking value", constraint -> ranking)
+		SET_REAL (U"Disharmony", constraint -> disharmony)
 	EDITOR_DO
 		OTMulti grammar = (OTMulti) my data;
 		OTConstraint constraint = & grammar -> constraints [grammar -> index [my selectedConstraint]];
-		Editor_save (me, L"Edit ranking");
-		constraint -> ranking = GET_REAL (L"Ranking value");
-		constraint -> disharmony = GET_REAL (L"Disharmony");
+		Editor_save (me, U"Edit ranking");
+		constraint -> ranking = GET_REAL (U"Ranking value");
+		constraint -> disharmony = GET_REAL (U"Disharmony");
 		OTMulti_sort (grammar);
 		Graphics_updateWs (my g);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_learnOne (EDITOR_ARGS) {
 	EDITOR_IAM (OTMultiEditor);
-	EDITOR_FORM (L"Learn one", L"OTGrammar: Learn one...")
-		OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, kOTGrammar_rerankingStrategy_SYMMETRIC_ALL)
-		OPTIONMENU (L"Direction", 3)
-			OPTION (L"forward")
-			OPTION (L"backward")
-			OPTION (L"bidirectionally")
-		REAL (L"Plasticity", L"0.1")
-		REAL (L"Rel. plasticity spreading", L"0.1")
+	EDITOR_FORM (U"Learn one", U"OTGrammar: Learn one...")
+		OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, kOTGrammar_rerankingStrategy_SYMMETRIC_ALL)
+		OPTIONMENU (U"Direction", 3)
+			OPTION (U"forward")
+			OPTION (U"backward")
+			OPTION (U"bidirectionally")
+		REAL (U"Plasticity", U"0.1")
+		REAL (U"Rel. plasticity spreading", U"0.1")
 	EDITOR_OK
 	EDITOR_DO
-		Editor_save (me, L"Learn one");
+		Editor_save (me, U"Learn one");
 		Melder_free (my form1);
 		Melder_free (my form2);
-		my form1 = my form1Text -> f_getString ();
-		my form2 = my form2Text -> f_getString ();
+		my form1 = GuiText_getString (my form1Text);
+		my form2 = GuiText_getString (my form2Text);
 		OTMulti_learnOne ((OTMulti) my data, my form1, my form2,
-			GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"), GET_INTEGER (L"Direction"),
-			GET_REAL (L"Plasticity"), GET_REAL (L"Rel. plasticity spreading"));
+			GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"), GET_INTEGER (U"Direction"),
+			GET_REAL (U"Plasticity"), GET_REAL (U"Rel. plasticity spreading"));
 		Graphics_updateWs (my g);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
@@ -115,38 +115,38 @@ static void menu_cb_removeConstraint (EDITOR_ARGS) {
 	EDITOR_IAM (OTMultiEditor);
 	OTMulti grammar = (OTMulti) my data;
 	if (my selectedConstraint < 1 || my selectedConstraint > grammar -> numberOfConstraints)
-		Melder_throw ("Select a constraint first.");
+		Melder_throw (U"Select a constraint first.");
 	OTConstraint constraint = & grammar -> constraints [grammar -> index [my selectedConstraint]];
-	Editor_save (me, L"Remove constraint");
+	Editor_save (me, U"Remove constraint");
 	OTMulti_removeConstraint (grammar, constraint -> name);
 	Graphics_updateWs (my g);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_resetAllRankings (EDITOR_ARGS) {
 	EDITOR_IAM (OTMultiEditor);
-	EDITOR_FORM (L"Reset all rankings", 0)
-		REAL (L"Ranking", L"100.0")
+	EDITOR_FORM (U"Reset all rankings", 0)
+		REAL (U"Ranking", U"100.0")
 	EDITOR_OK
 	EDITOR_DO
-		Editor_save (me, L"Reset all rankings");
-		OTMulti_reset ((OTMulti) my data, GET_REAL (L"Ranking"));
+		Editor_save (me, U"Reset all rankings");
+		OTMulti_reset ((OTMulti) my data, GET_REAL (U"Ranking"));
 		Graphics_updateWs (my g);
-		my broadcastDataChanged ();
+		Editor_broadcastDataChanged (me);
 	EDITOR_END
 }
 
 static void menu_cb_OTLearningTutorial (EDITOR_ARGS) {
 	EDITOR_IAM (OTMultiEditor);
 	(void) me;
-	Melder_help (L"OT learning");
+	Melder_help (U"OT learning");
 }
 
 static void do_limit (OTMultiEditor me) {
 	Melder_free (my form1);
 	Melder_free (my form2);
-	my form1 = my form1Text -> f_getString ();
-	my form2 = my form2Text -> f_getString ();
+	my form1 = GuiText_getString (my form1Text);
+	my form2 = GuiText_getString (my form2Text);
 	Graphics_updateWs (my g);
 }
 
@@ -170,7 +170,7 @@ void structOTMultiEditor :: v_createChildren () {
 	#endif
 	int height = Machine_getTextHeight (), y = Machine_getMenuBarHeight () + 4;
 	GuiButton_createShown (d_windowForm, 4, 124, y, y + height,
-		L"Partial forms:", gui_button_cb_limit, this, GuiButton_DEFAULT);
+		U"Partial forms:", gui_button_cb_limit, this, GuiButton_DEFAULT);
 	form1Text = GuiText_createShown (d_windowForm,
 		124 + STRING_SPACING, 274 + STRING_SPACING, y, y + Gui_TEXTFIELD_HEIGHT, 0);
 	form2Text = GuiText_createShown (d_windowForm,
@@ -179,24 +179,24 @@ void structOTMultiEditor :: v_createChildren () {
 
 void structOTMultiEditor :: v_createMenus () {
 	OTMultiEditor_Parent :: v_createMenus ();
-	Editor_addCommand (this, L"Edit", L"-- edit ot --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Evaluate...", 0, menu_cb_evaluate);
-	Editor_addCommand (this, L"Edit", L"Evaluate (noise 2.0)", '2', menu_cb_evaluate_noise_2_0);
-	Editor_addCommand (this, L"Edit", L"Evaluate (tiny noise)", '9', menu_cb_evaluate_tinyNoise);
-	Editor_addCommand (this, L"Edit", L"Edit ranking...", 'E', menu_cb_editRanking);
-	Editor_addCommand (this, L"Edit", L"Reset all rankings...", 'R', menu_cb_resetAllRankings);
-	Editor_addCommand (this, L"Edit", L"Learn one...", '1', menu_cb_learnOne);
-	Editor_addCommand (this, L"Edit", L"-- remove --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Remove constraint", 0, menu_cb_removeConstraint);
+	Editor_addCommand (this, U"Edit", U"-- edit ot --", 0, nullptr);
+	Editor_addCommand (this, U"Edit", U"Evaluate...", 0, menu_cb_evaluate);
+	Editor_addCommand (this, U"Edit", U"Evaluate (noise 2.0)", '2', menu_cb_evaluate_noise_2_0);
+	Editor_addCommand (this, U"Edit", U"Evaluate (tiny noise)", '9', menu_cb_evaluate_tinyNoise);
+	Editor_addCommand (this, U"Edit", U"Edit ranking...", 'E', menu_cb_editRanking);
+	Editor_addCommand (this, U"Edit", U"Reset all rankings...", 'R', menu_cb_resetAllRankings);
+	Editor_addCommand (this, U"Edit", U"Learn one...", '1', menu_cb_learnOne);
+	Editor_addCommand (this, U"Edit", U"-- remove --", 0, nullptr);
+	Editor_addCommand (this, U"Edit", U"Remove constraint", 0, menu_cb_removeConstraint);
 }
 
 void structOTMultiEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	OTMultiEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"OT learning tutorial", 0, menu_cb_OTLearningTutorial);
+	EditorMenu_addCommand (menu, U"OT learning tutorial", 0, menu_cb_OTLearningTutorial);
 }
 
 static OTMulti drawTableau_grammar;
-static const wchar_t *drawTableau_form1, *drawTableau_form2;
+static const char32 *drawTableau_form1, *drawTableau_form2;
 static bool drawTableau_constraintsAreDrawnVertically;
 static void drawTableau (Graphics g) {
 	OTMulti_drawTableau (drawTableau_grammar, g, drawTableau_form1, drawTableau_form2, drawTableau_constraintsAreDrawnVertically, true);
@@ -204,20 +204,20 @@ static void drawTableau (Graphics g) {
 
 void structOTMultiEditor :: v_draw () {
 	OTMulti grammar = (OTMulti) data;
-	static MelderString buffer = { 0 };
+	static MelderString buffer { 0 };
 	double rowHeight = 0.25, tableauHeight = 2 * rowHeight;
 	Graphics_clearWs (g);
-	HyperPage_listItem (this, L"\t\t      %%ranking value\t      %disharmony\t      %plasticity");
+	HyperPage_listItem (this, U"\t\t      %%ranking value\t      %disharmony\t      %plasticity");
 	for (long icons = 1; icons <= grammar -> numberOfConstraints; icons ++) {
 		OTConstraint constraint = & grammar -> constraints [grammar -> index [icons]];
-		MelderString_empty (& buffer);
-		MelderString_append (& buffer, L"\t", icons == selectedConstraint ? L"♠︎ " : L"   ", L"@@", Melder_integer (icons),
-			L"|", constraint -> name, L"@\t      ", Melder_fixed (constraint -> ranking, 3));
-		MelderString_append (& buffer, L"\t      ", Melder_fixed (constraint -> disharmony, 3));
-		MelderString_append (& buffer, L"\t      ", Melder_fixed (constraint -> plasticity, 6));
+		MelderString_copy (& buffer, U"\t", ( icons == selectedConstraint ? U"♠︎ " : U"   " ), U"@@", icons,
+			U"|", constraint -> name, U"@\t      ", Melder_fixed (constraint -> ranking, 3),
+			U"\t      ", Melder_fixed (constraint -> disharmony, 3),
+			U"\t      ", Melder_fixed (constraint -> plasticity, 6)
+		);
 		HyperPage_listItem (this, buffer.string);
 	}
-	Graphics_setAtSignIsLink (g, FALSE);
+	Graphics_setAtSignIsLink (g, false);
 	drawTableau_grammar = grammar;
 	for (long icand = 1; icand <= grammar -> numberOfCandidates; icand ++) {
 		if (OTMulti_candidateMatches (grammar, icand, form1, form2)) {
@@ -228,25 +228,25 @@ void structOTMultiEditor :: v_draw () {
 	drawTableau_form2 = form2;
 	drawTableau_constraintsAreDrawnVertically = d_constraintsAreDrawnVertically;
 	HyperPage_picture (this, 20, tableauHeight, drawTableau);
-	Graphics_setAtSignIsLink (g, TRUE);
+	Graphics_setAtSignIsLink (g, true);
 }
 
-int structOTMultiEditor :: v_goToPage (const wchar_t *title) {
-	if (title == NULL) return 1;
-	selectedConstraint = wcstol (title, NULL, 10);
+int structOTMultiEditor :: v_goToPage (const char32 *title) {
+	if (! title) return 1;
+	selectedConstraint = Melder_atoi (title);
 	return 1;
 }
 
-OTMultiEditor OTMultiEditor_create (const wchar_t *title, OTMulti grammar) {
+autoOTMultiEditor OTMultiEditor_create (const char32 *title, OTMulti grammar) {
 	try {
 		autoOTMultiEditor me = Thing_new (OTMultiEditor);
 		my data = grammar;
-		my form1 = Melder_wcsdup (L"");
-		my form2 = Melder_wcsdup (L"");
+		my form1 = Melder_dup (U"");
+		my form2 = Melder_dup (U"");
 		HyperPage_init (me.peek(), title, grammar);
-		return me.transfer();
+		return me;
 	} catch (MelderError) {
-		Melder_throw ("OTMulti window not created.");
+		Melder_throw (U"OTMulti window not created.");
 	}
 }
 
diff --git a/gram/OTMultiEditor.h b/gram/OTMultiEditor.h
index e0d0569..39c04dd 100644
--- a/gram/OTMultiEditor.h
+++ b/gram/OTMultiEditor.h
@@ -2,7 +2,7 @@
 #define _OTMultiEditor_h_
 /* OTMultiEditor.h
  *
- * Copyright (C) 2005-2011,2012 Paul Boersma
+ * Copyright (C) 2005-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,22 +23,26 @@
 #include "OTMulti.h"
 
 Thing_define (OTMultiEditor, HyperPage) {
-	// new data:
-	public:
-		const wchar_t *form1, *form2;
-		GuiText form1Text, form2Text;
-		long selectedConstraint;
-		bool d_constraintsAreDrawnVertically;
-	// overridden methods:
-		virtual bool v_editable () { return true; }
-		virtual void v_createChildren ();
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_draw ();
-		virtual int v_goToPage (const wchar_t *title);
+	const char32 *form1, *form2;
+	GuiText form1Text, form2Text;
+	long selectedConstraint;
+	bool d_constraintsAreDrawnVertically;
+
+	bool v_editable ()
+		override { return true; }
+	void v_createChildren ()
+		override;
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_draw ()
+		override;
+	int v_goToPage (const char32 *title)
+		override;
 };
 
-OTMultiEditor OTMultiEditor_create (const wchar_t *title, OTMulti grammar);
+autoOTMultiEditor OTMultiEditor_create (const char32 *title, OTMulti grammar);
 
 /* End of file OTMultiEditor.h */
 #endif
diff --git a/gram/OTMulti_def.h b/gram/OTMulti_def.h
index 46682ed..b6a4a45 100644
--- a/gram/OTMulti_def.h
+++ b/gram/OTMulti_def.h
@@ -1,6 +1,6 @@
 /* OTMulti_def.h
  *
- * Copyright (C) 2005-2011 Paul Boersma
+ * Copyright (C) 2005-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@ oo_DEFINE_STRUCT (OTConstraint)
 		oo_DOUBLE (plasticity)
 	oo_ENDFROM
 	#if oo_READING
-		if (localVersion < 2) {
+		if (formatVersion < 2) {
 			plasticity = 1.0;
 		}
 	#endif
@@ -57,7 +57,7 @@ oo_END_STRUCT (OTCandidate)
 
 
 #define ooSTRUCT OTMulti
-oo_DEFINE_CLASS (OTMulti, Data)
+oo_DEFINE_CLASS (OTMulti, Daata)
 
 	oo_FROM (1)
 		oo_ENUM (kOTGrammar_decisionStrategy, decisionStrategy)
@@ -75,8 +75,8 @@ oo_DEFINE_CLASS (OTMulti, Data)
 	#endif
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (OTMulti)
diff --git a/gram/OTMulti_ex_metrics.cpp b/gram/OTMulti_ex_metrics.cpp
index 04b40e1..24cedfe 100644
--- a/gram/OTMulti_ex_metrics.cpp
+++ b/gram/OTMulti_ex_metrics.cpp
@@ -1,6 +1,6 @@
 /* OTMulti_ex_metrics.cpp
  *
- * Copyright (C) 2014 Paul Boersma
+ * Copyright (C) 2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,49 +46,49 @@
 
 #define NUMBER_OF_CONSTRAINTS  22
 
-static const wchar_t *constraintNames [1+NUMBER_OF_CONSTRAINTS] = { 0,
-	L"WSP", L"FtNonfinal", L"Iambic", L"Parse", L"FootBin", L"WFL", L"WFR", L"Main-L", L"Main-R", L"AFL", L"AFR", L"Nonfinal",
-	L"Trochaic", L"FtBimor", L"FtBisyl", L"Peripheral", L"MainNonfinal", L"HeadNonfinal", L"*Clash", L"*Lapse", L"WeightByPosition", L"*C\\mu" };
+static const char32 *constraintNames [1+NUMBER_OF_CONSTRAINTS] { 0,
+	U"WSP", U"FtNonfinal", U"Iambic", U"Parse", U"FootBin", U"WFL", U"WFR", U"Main-L", U"Main-R", U"AFL", U"AFR", U"Nonfinal",
+	U"Trochaic", U"FtBimor", U"FtBisyl", U"Peripheral", U"MainNonfinal", U"HeadNonfinal", U"*Clash", U"*Lapse", U"WeightByPosition", U"*C\\mu" };
 
-static void addCandidate (OTMulti me, const wchar_t *underlyingForm, long numberOfSyllables, int stress [],
-	int footedToTheLeft [], int footedToTheRight [], int surfaceWeightPattern [],
+static void addCandidate (OTMulti me, const char32 *underlyingForm, long numberOfSyllables, int stress [],
+	bool footedToTheLeft [], bool footedToTheRight [], int surfaceWeightPattern [],
 	int overtFormsHaveSecondaryStress)
 {
-	static const wchar_t *syllable [] = { L"L", L"L1", L"L2", L"H", L"H1", L"H2", L"K", L"K1", L"K2", L"J", L"J1", L"J2" };
-	static const wchar_t *syllableWithoutSecondaryStress [] = { L"L", L"L1", L"L", L"H", L"H1", L"H", L"K", L"K1", L"K", L"J", L"J1", L"J" };
-	wchar_t string [150];
-	wcscpy (string, underlyingForm);
-	wcscat (string, L" /");
+	static const char32 *syllable [] { U"L", U"L1", U"L2", U"H", U"H1", U"H2", U"K", U"K1", U"K2", U"J", U"J1", U"J2" };
+	static const char32 *syllableWithoutSecondaryStress [] { U"L", U"L1", U"L", U"H", U"H1", U"H", U"K", U"K1", U"K", U"J", U"J1", U"J" };
+	char32 string [150];
+	str32cpy (string, underlyingForm);
+	str32cpy (string + str32len (string), U" /");
 	for (long isyll = 1; isyll <= numberOfSyllables; isyll ++) {
-		if (isyll > 1) wcscat (string, L" ");
-		if (footedToTheRight [isyll] || (! footedToTheLeft [isyll] && stress [isyll] != 0)) wcscat (string, L"(");
-		wcscat (string, syllable [stress [isyll] + 3 * (surfaceWeightPattern [isyll] - 1)]);
-		if (footedToTheLeft [isyll] || (! footedToTheRight [isyll] && stress [isyll] != 0)) wcscat (string, L")");
+		if (isyll > 1) str32cpy (string + str32len (string), U" ");
+		if (footedToTheRight [isyll] || (! footedToTheLeft [isyll] && stress [isyll] != 0)) str32cpy (string + str32len (string), U"(");
+		str32cpy (string + str32len (string), syllable [stress [isyll] + 3 * (surfaceWeightPattern [isyll] - 1)]);
+		if (footedToTheLeft [isyll] || (! footedToTheRight [isyll] && stress [isyll] != 0)) str32cpy (string + str32len (string), U")");
 	}
-	wcscat (string, L"/ [");
+	str32cpy (string + str32len (string), U"/ [");
 	for (long isyll = 1; isyll <= numberOfSyllables; isyll ++) {
-		if (isyll > 1) wcscat (string, L" ");
-		wcscat (string, ( overtFormsHaveSecondaryStress ? syllable : syllableWithoutSecondaryStress )
+		if (isyll > 1) str32cpy (string + str32len (string), U" ");
+		str32cpy (string + str32len (string), ( overtFormsHaveSecondaryStress ? syllable : syllableWithoutSecondaryStress )
 				[stress [isyll] + 3 * (surfaceWeightPattern [isyll] - 1)]);
 	}
-	wcscat (string, L"]");
-	my candidates [++ my numberOfCandidates]. string = Melder_wcsdup (string);
+	str32cpy (string + str32len (string), U"]");
+	my candidates [++ my numberOfCandidates]. string = Melder_dup (string);
 }
 
-static void fillSurfaceWeightPattern (OTMulti me, const wchar_t *underlyingForm, long numberOfSyllables, int stress [],
-	int footedToTheLeft [], int footedToTheRight [], int underlyingWeightPattern [],
+static void fillSurfaceWeightPattern (OTMulti me, const char32 *underlyingForm, long numberOfSyllables, int stress [],
+	bool footedToTheLeft [], bool footedToTheRight [], int underlyingWeightPattern [],
 	int overtFormsHaveSecondaryStress)
 {
 	int surfaceWeightPattern [1+7], minSurfaceWeight [1+7], maxSurfaceWeight [1+7];
 	int weight1, weight2, weight3, weight4, weight5;
 	for (long isyll = 1; isyll <= numberOfSyllables; isyll ++) {
 		if (underlyingWeightPattern [isyll] < 3) {
-			minSurfaceWeight [isyll] = maxSurfaceWeight [isyll] = underlyingWeightPattern [isyll];   /* L -> L; H -> H */
+			minSurfaceWeight [isyll] = maxSurfaceWeight [isyll] = underlyingWeightPattern [isyll];   // L -> L; H -> H
 		} else {
-			minSurfaceWeight [isyll] = 3, maxSurfaceWeight [isyll] = 4;   /* C -> { J, K } */ 
+			minSurfaceWeight [isyll] = 3, maxSurfaceWeight [isyll] = 4;   // C -> { J, K }
 		}
 	}
-	surfaceWeightPattern [6] = surfaceWeightPattern [7] = 1;   /* Constant L. */
+	surfaceWeightPattern [6] = surfaceWeightPattern [7] = 1;   // constant L
 	for (weight1 = minSurfaceWeight [1]; weight1 <= maxSurfaceWeight [1]; weight1 ++) {
 		surfaceWeightPattern [1] = weight1;
 		for (weight2 = minSurfaceWeight [2]; weight2 <= maxSurfaceWeight [2]; weight2 ++) {
@@ -113,11 +113,11 @@ static void fillSurfaceWeightPattern (OTMulti me, const wchar_t *underlyingForm,
 	}
 }
 
-static void path (OTMulti me, const wchar_t *underlyingForm, long numberOfSyllables, int stress [],
-	int startingSyllable, int footedToTheLeft_in [], int footedToTheRight_in [], int underlyingWeightPattern [],
+static void path (OTMulti me, const char32 *underlyingForm, long numberOfSyllables, int stress [],
+	int startingSyllable, bool footedToTheLeft_in [], bool footedToTheRight_in [], int underlyingWeightPattern [],
 	int overtFormsHaveSecondaryStress)
 {
-	int footedToTheLeft [10], footedToTheRight [10];
+	bool footedToTheLeft [10], footedToTheRight [10];
 	long isyll;
 	/* Localize all arguments. */
 	for (isyll = 1; isyll <= startingSyllable; isyll ++) {
@@ -132,70 +132,70 @@ static void path (OTMulti me, const wchar_t *underlyingForm, long numberOfSyllab
 		path (me, underlyingForm, numberOfSyllables, stress, startingSyllable + 1,
 			footedToTheLeft, footedToTheRight, underlyingWeightPattern, overtFormsHaveSecondaryStress);
 		if (stress [startingSyllable] == 0 && startingSyllable < numberOfSyllables && stress [startingSyllable + 1] != 0) {
-			footedToTheLeft [startingSyllable + 1] = TRUE;
-			footedToTheRight [startingSyllable] = TRUE;
+			footedToTheLeft [startingSyllable + 1] = true;
+			footedToTheRight [startingSyllable] = true;
 			path (me, underlyingForm, numberOfSyllables, stress, startingSyllable + 1,
 				footedToTheLeft, footedToTheRight, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-			footedToTheLeft [startingSyllable + 1] = FALSE;
-			footedToTheRight [startingSyllable] = FALSE;
+			footedToTheLeft [startingSyllable + 1] = false;
+			footedToTheRight [startingSyllable] = false;
 		}
 		if (stress [startingSyllable] == 0 && startingSyllable > 1 && stress [startingSyllable - 1] != 0
 		    && ! footedToTheLeft [startingSyllable - 1])
 		{
-			footedToTheRight [startingSyllable - 1] = TRUE;
-			footedToTheLeft [startingSyllable] = TRUE;
+			footedToTheRight [startingSyllable - 1] = true;
+			footedToTheLeft [startingSyllable] = true;
 			path (me, underlyingForm, numberOfSyllables, stress, startingSyllable + 1,
 				footedToTheLeft, footedToTheRight, underlyingWeightPattern, overtFormsHaveSecondaryStress);
 		}
 	}
 }
 
-static void fillOvertStressPattern (OTMulti me, const wchar_t *underlyingForm, long numberOfSyllables, int stress [], int underlyingWeightPattern [],
+static void fillOvertStressPattern (OTMulti me, const char32 *underlyingForm, long numberOfSyllables, int stress [], int underlyingWeightPattern [],
 	int overtFormsHaveSecondaryStress)
 {
-	int footedToTheLeft [10], footedToTheRight [10];
+	bool footedToTheLeft [10], footedToTheRight [10];
 	for (int isyll = 1; isyll <= numberOfSyllables; isyll ++)
 		footedToTheLeft [isyll] = footedToTheRight [isyll] = 0;
 	path (me, underlyingForm, numberOfSyllables, stress, 1, footedToTheLeft, footedToTheRight, underlyingWeightPattern, overtFormsHaveSecondaryStress);
 }
 
-static int numberOfCandidates_noCodas [1+7] = { 0, 1, 6, 24, 88, 300, 984, 3136 };
-static int numberOfCandidates_codas [1+7] = { 0, 1, 24, 192, 1408, 9600, 984, 3136 };
+static int numberOfCandidates_noCodas [1+7] { 0, 1, 6, 24, 88, 300, 984, 3136 };
+static int numberOfCandidates_codas [1+7] { 0, 1, 24, 192, 1408, 9600, 984, 3136 };
 
 static void fillTableau (OTMulti me, long numberOfSyllables, int underlyingWeightPattern [], int overtFormsHaveSecondaryStress, int includeCodas) {
-	wchar_t underlyingForm [100];
-	wcscpy (underlyingForm, L"|");
+	char32 underlyingForm [100];
+	str32cpy (underlyingForm, U"|");
 	for (long isyll = 1; isyll <= numberOfSyllables; isyll ++) {
-		static const wchar_t *syllable_noCodas [] = { L"", L"L", L"H" };
-		static const wchar_t *syllable_codas [] = { L"", L"cv", L"cv:", L"cvc" };
-		if (isyll > 1) wcscat (underlyingForm, includeCodas ? L"." : L" ");
-		wcscat (underlyingForm, ( includeCodas ? syllable_codas : syllable_noCodas ) [underlyingWeightPattern [isyll]]);
+		static const char32 *syllable_noCodas [] = { U"", U"L", U"H" };
+		static const char32 *syllable_codas [] = { U"", U"cv", U"cv:", U"cvc" };
+		if (isyll > 1) str32cpy (underlyingForm + str32len (underlyingForm), includeCodas ? U"." : U" ");
+		str32cpy (underlyingForm + str32len (underlyingForm), ( includeCodas ? syllable_codas : syllable_noCodas ) [underlyingWeightPattern [isyll]]);
 	}
-	wcscat (underlyingForm, L"|");
+	str32cpy (underlyingForm + str32len (underlyingForm), U"|");
 	for (long mainStressed = 1; mainStressed <= numberOfSyllables; mainStressed ++) {
 		int stress [10];
 		stress [mainStressed] = 1;
-		for (int secondary1 = FALSE; secondary1 <= TRUE; secondary1 ++) {
+		for (int secondary1 = false; secondary1 <= true; secondary1 ++) {
 			stress [mainStressed <= 1 ? 2 : 1] = secondary1 ? 2 : 0;
 			if (numberOfSyllables == 2) {
 				fillOvertStressPattern (me, underlyingForm, 2, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-			} else for (int secondary2 = FALSE; secondary2 <= TRUE; secondary2 ++) {
+			} else for (int secondary2 = false; secondary2 <= true; secondary2 ++) {
 				stress [mainStressed <= 2 ? 3 : 2] = secondary2 ? 2 : 0;
 				if (numberOfSyllables == 3) {
 					fillOvertStressPattern (me, underlyingForm, 3, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-				} else for (int secondary3 = FALSE; secondary3 <= TRUE; secondary3 ++) {
+				} else for (int secondary3 = false; secondary3 <= true; secondary3 ++) {
 					stress [mainStressed <= 3 ? 4 : 3] = secondary3 ? 2 : 0;
 					if (numberOfSyllables == 4) {
 						fillOvertStressPattern (me, underlyingForm, 4, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-					} else for (int secondary4 = FALSE; secondary4 <= TRUE; secondary4 ++) {
+					} else for (int secondary4 = false; secondary4 <= true; secondary4 ++) {
 						stress [mainStressed <= 4 ? 5 : 4] = secondary4 ? 2 : 0;
 						if (numberOfSyllables == 5) {
 							fillOvertStressPattern (me, underlyingForm, 5, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-						} else for (int secondary5 = FALSE; secondary5 <= TRUE; secondary5 ++) {
+						} else for (int secondary5 = false; secondary5 <= true; secondary5 ++) {
 							stress [mainStressed <= 5 ? 6 : 5] = secondary5 ? 2 : 0;
 							if (numberOfSyllables == 6) {
 								fillOvertStressPattern (me, underlyingForm, 6, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
-							} else for (int secondary6 = FALSE; secondary6 <= TRUE; secondary6 ++) {
+							} else for (int secondary6 = false; secondary6 <= true; secondary6 ++) {
 								stress [mainStressed <= 6 ? 7 : 6] = secondary6 ? 2 : 0;
 								fillOvertStressPattern (me, underlyingForm, 7, stress, underlyingWeightPattern, overtFormsHaveSecondaryStress);
 							}
@@ -208,34 +208,34 @@ static void fillTableau (OTMulti me, long numberOfSyllables, int underlyingWeigh
 }
 
 static void computeViolationMarks (OTCandidate me) {
-	#define isHeavy(s)  ((s) == 'H' || (s) == 'J')
-	#define isLight(s)  ((s) == 'L' || (s) == 'K')
+	#define isHeavy(s)  ((s) == U'H' || (s) == U'J')
+	#define isLight(s)  ((s) == U'L' || (s) == U'K')
 	#define isSyllable(s)  (isHeavy (s) || isLight (s))
-	#define isStress(s)  ((s) == '1' || (s) == '2')
+	#define isStress(s)  ((s) == U'1' || (s) == U'2')
 	int depth;
-	wchar_t *firstSlash = wcschr (my string, '/');
-	wchar_t *lastSlash = wcschr (firstSlash + 1, '/');
+	char32 *firstSlash = str32chr (my string, U'/');
+	char32 *lastSlash = str32chr (firstSlash + 1, U'/');
 	my marks = NUMvector <int> (1, my numberOfConstraints = NUMBER_OF_CONSTRAINTS);
 	/* Violations of WSP: count all H not followed by 1 or 2. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
 		if (isHeavy (p [0]) && ! isStress (p [1]))
 			my marks [WSP] ++;
 	}
 	/* Violations of FtNonfinal: count all heads followed by ). */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
 		if (isStress (p [0]) && p [1] == ')')
 			my marks [FtNonfinal] ++;
 	}
 	/* Violations of Iambic: count all heads not followed by ). */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
 		if (isStress (p [0]) && p [1] != ')')
 			my marks [Iambic] ++;
 	}
 	/* Violations of Parse and Peripheral: count all syllables not between (). */
 	depth = 0;
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == '(') depth ++;
-		else if (p [0] == ')') depth --;
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U'(') depth ++;
+		else if (p [0] == U')') depth --;
 		else if (isSyllable (p [0]) && depth != 1) {
 			my marks [Parse] ++;
 			if (p != firstSlash + 1 && p != lastSlash - 1)
@@ -243,20 +243,20 @@ static void computeViolationMarks (OTCandidate me) {
 		}
 	}
 	/* Violations of FootBin: count all (L1) and (L2). */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (isLight (p [0]) && p [-1] == '(' && isStress (p [1]) && p [2] == ')')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (isLight (p [0]) && p [-1] == '(' && isStress (p [1]) && p [2] == U')')
 			my marks [FootBin] ++;
 	}
 	/* Violations of WFL: count all initial / not followed by (. */
-	if (firstSlash [1] != '(')
+	if (firstSlash [1] != U'(')
 		my marks [WFL] = 1;
 	/* Violations of WFR: count all final / not preceded by ). */
 	if (lastSlash [-1] != ')')
 		my marks [WFR] = 1;
 	/* Violations of Main_L: count syllables from foot containing X1 to left edge. */
 	{
-		wchar_t *p = wcschr (firstSlash, '1');
-		for (; *p != '('; p --) { }
+		char32 *p = str32chr (firstSlash, U'1');
+		for (; *p != U'('; p --) { }
 		for (; p != firstSlash; p --) {
 			if (isSyllable (p [0]))
 				my marks [Main_L] ++;
@@ -264,42 +264,42 @@ static void computeViolationMarks (OTCandidate me) {
 	}
 	/* Violations of Main_R: count syllables from foot containing X1 to right edge. */
 	{
-		wchar_t *p = wcschr (firstSlash, '1');
-		for (; *p != ')'; p ++) { }
+		char32 *p = str32chr (firstSlash, U'1');
+		for (; *p != U')'; p ++) { }
 		for (; p != lastSlash; p ++) {
 			if (isSyllable (p [0]))
 				my marks [Main_R] ++;
 		}
 	}
 	/* Violations of AFL: count syllables from every foot to left edge. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == '(') {
-			for (wchar_t *q = p; q != firstSlash; q --) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U'(') {
+			for (char32 *q = p; q != firstSlash; q --) {
 				if (isSyllable (q [0]))
 					my marks [AFL] ++;
 			}
 		}
 	}
 	/* Violations of AFR: count syllables from every foot to right edge. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == ')') {
-			for (wchar_t *q = p; q != lastSlash; q ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U')') {
+			for (char32 *q = p; q != lastSlash; q ++) {
 				if (isSyllable (q [0]))
 					my marks [AFR] ++;
 			}
 		}
 	}
 	/* Violations of Nonfinal: count all final / preceded by ). */
-	if (lastSlash [-1] == ')')
+	if (lastSlash [-1] == U')')
 		my marks [Nonfinal] = 1;
 	/* Violations of Trochaic: count all heads not preceded by (. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
 		if (isStress (p [0]) && p [-2] != '(')
 			my marks [Trochaic] ++;
 	}
 	/* Violations of FootBimoraic: count weight between (). */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == '(') {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U'(') {
 			int weight = 0;
 			for (p ++; p [0] != ')'; p ++) {
 				if (isHeavy (p [0])) weight += 2;
@@ -309,13 +309,13 @@ static void computeViolationMarks (OTCandidate me) {
 		}
 	}
 	/* Violations of FootBisyllabic: count all (X1) and (X2). */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (isSyllable (p [0]) && p [-1] == '(' && isStress (p [1]) && p [2] == ')')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (isSyllable (p [0]) && p [-1] == U'(' && isStress (p [1]) && p [2] == U')')
 			my marks [FootBisyllabic] ++;
 	}
 	/* Violations of MainNonfinal: count all final / preceded by ) preceded by 1 in the same foot. */
-	if (lastSlash [-1] == ')') {
-		for (wchar_t *p = lastSlash - 2; ; p --) {
+	if (lastSlash [-1] == U')') {
+		for (char32 *p = lastSlash - 2; ; p --) {
 			if (p [0] == '2') break;
 			if (p [0] == '1') {
 				my marks [MainNonfinal] = 1;
@@ -324,13 +324,13 @@ static void computeViolationMarks (OTCandidate me) {
 		}
 	}
 	/* Violations of HeadNonfinal: count all final / preceded by ) directly preceded by 1, plus MainNonfinal. */
-	if (lastSlash [-1] == ')') {
-		if (lastSlash [-2] == '1') {
+	if (lastSlash [-1] == U')') {
+		if (lastSlash [-2] == U'1') {
 			my marks [HeadNonfinal] = 2;
 		} else {
-			for (wchar_t *p = lastSlash - 2; ; p --) {
-				if (p [0] == '2') break;
-				if (p [0] == '1') {
+			for (char32 *p = lastSlash - 2; ; p --) {
+				if (p [0] == U'2') break;
+				if (p [0] == U'1') {
 					my marks [HeadNonfinal] = 1;
 					break;
 				}
@@ -338,9 +338,9 @@ static void computeViolationMarks (OTCandidate me) {
 		}
 	}
 	/* Violations of *Clash: count all 1 and 2 followed by an 1 or 2 after the next L or H. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
 		if (isStress (p [0])) {
-			for (wchar_t *q = p + 1; q != lastSlash; q ++) {
+			for (char32 *q = p + 1; q != lastSlash; q ++) {
 				if (isSyllable (q [0])) {
 					if (isStress (q [1])) {
 						my marks [Clash] ++;
@@ -352,7 +352,7 @@ static void computeViolationMarks (OTCandidate me) {
 	}
 	/* Violations of *Lapse: count all sequences of three unstressed syllables. */
 	depth = 0;
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
 		if (isSyllable (p [0])) {
 			if (isStress (p [1])) {
 				depth = 0;
@@ -364,60 +364,60 @@ static void computeViolationMarks (OTCandidate me) {
 		}
 	}
 	/* Violations of WeightByPosition: count all K. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == 'K')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U'K')
 			my marks [WeightByPosition] ++;
 	}
 	/* Violations of *MoraicConsonant: count all J. */
-	for (wchar_t *p = firstSlash + 1; p != lastSlash; p ++) {
-		if (p [0] == 'J')
+	for (char32 *p = firstSlash + 1; p != lastSlash; p ++) {
+		if (p [0] == U'J')
 			my marks [MoraicConsonant] ++;
 	}
 }
 
 static void replaceOutput (OTCandidate me) {
-	int abstract = FALSE;
-	Melder_assert (my string != NULL);
-	wchar_t newString [150], *q = & newString [0];
-	for (const wchar_t *p = & my string [0]; *p != '\0'; p ++) {
-		if (p [0] == ' ') {
-			*q ++ = p [-1] == ']' || p [1] == '/' ? ' ' : '.';
+	bool abstract = false;
+	Melder_assert (my string);
+	char32 newString [150], *q = & newString [0];
+	for (const char32 *p = & my string [0]; *p != U'\0'; p ++) {
+		if (p [0] == U' ') {
+			*q ++ = p [-1] == U']' || p [1] == U'/' ? U' ' : U'.';
 		} else if (isSyllable (p [0])) {
-			*q ++ = 'c';
+			*q ++ = U'c';
 			if (abstract) {
-				*q ++ = 'V';
+				*q ++ = U'V';
 				if (isStress (p [1])) {
 					*q ++ = p [1];
 				}
-				if (p [0] == 'L') {
+				if (p [0] == U'L') {
 					;
-				} else if (p [0] == 'H') {
-					*q ++ = 'V';
-				} else if (p [0] == 'K') {
-					*q ++ = 'c';
+				} else if (p [0] == U'H') {
+					*q ++ = U'V';
+				} else if (p [0] == U'K') {
+					*q ++ = U'c';
 				} else {
-					*q ++ = 'C';
+					*q ++ = U'C';
 				}
 			} else {
-				*q ++ = 'v';
-				if (p [0] == 'L') {
+				*q ++ = U'v';
+				if (p [0] == U'L') {
 					;
 				} else if (p [0] == 'H') {
-					*q ++ = ':';
+					*q ++ = U':';
 				} else {
-					*q ++ = 'c';
+					*q ++ = U'c';
 				}
 			}
 		} else if (isStress (p [0]) && abstract) {
 			;
 		} else {
-			if (p [0] == '/') abstract = TRUE;
+			if (p [0] == U'/') abstract = true;
 			*q ++ = p [0];
 		}
 	}
-	*q = '\0';
+	*q = U'\0';
 	Melder_free (my string);
-	my string = Melder_wcsdup_f (newString);
+	my string = Melder_dup (newString);
 }
 
 OTMulti OTMulti_create_metrics (int equal_footForm_wsp, int trochaicityConstraint, int includeFootBimoraic, int includeFootBisyllabic,
@@ -430,7 +430,7 @@ OTMulti OTMulti_create_metrics (int equal_footForm_wsp, int trochaicityConstrain
 		my constraints = NUMvector <structOTConstraint> (1, my numberOfConstraints = NUMBER_OF_CONSTRAINTS);
 		for (long icons = 1; icons <= NUMBER_OF_CONSTRAINTS; icons ++) {
 			OTConstraint constraint = & my constraints [icons];
-			constraint -> name = Melder_wcsdup (constraintNames [icons]);
+			constraint -> name = Melder_dup (constraintNames [icons]);
 			constraint -> ranking = 100.0;
 			constraint -> plasticity = 1.0;
 		}
@@ -446,13 +446,13 @@ OTMulti OTMulti_create_metrics (int equal_footForm_wsp, int trochaicityConstrain
 		}
 		long numberOfCandidates = 0;
 		for (int numberOfSyllables = 2; numberOfSyllables <= 7; numberOfSyllables ++) {
-			long numberOfUnderlyingWeightPatterns = numberOfSyllables > 5 ? 1 : (long) floor (pow (maximumUnderlyingWeight, numberOfSyllables) + 0.5);
+			long numberOfUnderlyingWeightPatterns = numberOfSyllables > 5 ? 1 : lround (pow (maximumUnderlyingWeight, numberOfSyllables));
 			numberOfCandidates += ( includeCodas ? numberOfCandidates_codas : numberOfCandidates_noCodas ) [numberOfSyllables] * numberOfUnderlyingWeightPatterns;
 		}
 		my candidates = NUMvector <structOTCandidate> (1, numberOfCandidates);
 		my numberOfCandidates = 0;
 		for (int numberOfSyllables = 2; numberOfSyllables <= 7; numberOfSyllables ++) {
-			long numberOfUnderlyingWeightPatterns = numberOfSyllables > 5 ? 1 : (long) floor (pow (maximumUnderlyingWeight, numberOfSyllables) + 0.5);
+			long numberOfUnderlyingWeightPatterns = numberOfSyllables > 5 ? 1 : lround (pow (maximumUnderlyingWeight, numberOfSyllables));
 			for (long isyll = 1; isyll <= numberOfSyllables; isyll ++) {
 				underlyingWeightPattern [isyll] = 1;   /* L or cv */
 			}
@@ -478,30 +478,30 @@ OTMulti OTMulti_create_metrics (int equal_footForm_wsp, int trochaicityConstrain
 		OTMulti_checkIndex (me.peek());
 		OTMulti_newDisharmonies (me.peek(), 0.0);
 		if (trochaicityConstraint == 1) {
-			OTMulti_removeConstraint (me.peek(), L"Trochaic");
+			OTMulti_removeConstraint (me.peek(), U"Trochaic");
 		} else {
-			OTMulti_removeConstraint (me.peek(), L"FtNonfinal");
+			OTMulti_removeConstraint (me.peek(), U"FtNonfinal");
 		}
-		if (! includeFootBimoraic) OTMulti_removeConstraint (me.peek(), L"FtBimor");
-		if (! includeFootBisyllabic) OTMulti_removeConstraint (me.peek(), L"FtBisyl");
-		if (! includePeripheral) OTMulti_removeConstraint (me.peek(), L"Peripheral");
+		if (! includeFootBimoraic) OTMulti_removeConstraint (me.peek(), U"FtBimor");
+		if (! includeFootBisyllabic) OTMulti_removeConstraint (me.peek(), U"FtBisyl");
+		if (! includePeripheral) OTMulti_removeConstraint (me.peek(), U"Peripheral");
 		if (nonfinalityConstraint == 1) {
-			OTMulti_removeConstraint (me.peek(), L"MainNonfinal");
-			OTMulti_removeConstraint (me.peek(), L"HeadNonfinal");
+			OTMulti_removeConstraint (me.peek(), U"MainNonfinal");
+			OTMulti_removeConstraint (me.peek(), U"HeadNonfinal");
 		} else if (nonfinalityConstraint == 2) {
-			OTMulti_removeConstraint (me.peek(), L"HeadNonfinal");
-			OTMulti_removeConstraint (me.peek(), L"Nonfinal");
+			OTMulti_removeConstraint (me.peek(), U"HeadNonfinal");
+			OTMulti_removeConstraint (me.peek(), U"Nonfinal");
 		} else {
-			OTMulti_removeConstraint (me.peek(), L"MainNonfinal");
-			OTMulti_removeConstraint (me.peek(), L"Nonfinal");
+			OTMulti_removeConstraint (me.peek(), U"MainNonfinal");
+			OTMulti_removeConstraint (me.peek(), U"Nonfinal");
 		}
 		if (! includeClashAndLapse) {
-			OTMulti_removeConstraint (me.peek(), L"*Clash");
-			OTMulti_removeConstraint (me.peek(), L"*Lapse");
+			OTMulti_removeConstraint (me.peek(), U"*Clash");
+			OTMulti_removeConstraint (me.peek(), U"*Lapse");
 		}
 		if (! includeCodas) {
-			OTMulti_removeConstraint (me.peek(), L"WeightByPosition");
-			OTMulti_removeConstraint (me.peek(), L"*C\\mu");
+			OTMulti_removeConstraint (me.peek(), U"WeightByPosition");
+			OTMulti_removeConstraint (me.peek(), U"*C\\mu");
 		}
 		if (includeCodas) {
 			for (long icand = 1; icand <= my numberOfCandidates; icand ++) {
@@ -510,7 +510,7 @@ OTMulti OTMulti_create_metrics (int equal_footForm_wsp, int trochaicityConstrain
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Metrics grammar not created.");
+		Melder_throw (U"Metrics grammar not created.");
 	}
 }
 
diff --git a/gram/manual_gram.cpp b/gram/manual_gram.cpp
index fb1e037..cb31790 100644
--- a/gram/manual_gram.cpp
+++ b/gram/manual_gram.cpp
@@ -1,6 +1,6 @@
 /* manual_gram.cpp
  *
- * Copyright (C) 1997-2011,2014 Paul Boersma
+ * Copyright (C) 1997-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,19 +22,19 @@
 
 static void draw_NoCoda_pat (Graphics g) {
 	OTGrammar ot = OTGrammar_create_NoCoda_grammar ();
-	OTGrammar_drawTableau (ot, g, false, L"pat");
+	OTGrammar_drawTableau (ot, g, false, U"pat");
 	forget (ot);
 }
 static void draw_NoCoda_pa (Graphics g) {
 	OTGrammar ot = OTGrammar_create_NoCoda_grammar ();
-	OTGrammar_drawTableau (ot, g, false, L"pa");
+	OTGrammar_drawTableau (ot, g, false, U"pa");
 	forget (ot);
 }
 static void draw_NoCoda_reverse (Graphics g) {
 	OTGrammar ot = OTGrammar_create_NoCoda_grammar ();
 	ot -> index [1] = 2;
 	ot -> index [2] = 1;
-	OTGrammar_drawTableau (ot, g, false, L"pat");
+	OTGrammar_drawTableau (ot, g, false, U"pat");
 	forget (ot);
 }
 static void draw_NPA_assimilate_anpa (Graphics g) {
@@ -42,7 +42,7 @@ static void draw_NPA_assimilate_anpa (Graphics g) {
 	ot -> index [1] = 3;
 	ot -> index [2] = 1;
 	ot -> index [3] = 2;
-	OTGrammar_drawTableau (ot, g, false, L"an+pa");
+	OTGrammar_drawTableau (ot, g, false, U"an+pa");
 	forget (ot);
 }
 static void draw_NPA_assimilate_atma (Graphics g) {
@@ -50,7 +50,7 @@ static void draw_NPA_assimilate_atma (Graphics g) {
 	ot -> index [1] = 3;
 	ot -> index [2] = 1;
 	ot -> index [3] = 2;
-	OTGrammar_drawTableau (ot, g, false, L"at+ma");
+	OTGrammar_drawTableau (ot, g, false, U"at+ma");
 	forget (ot);
 }
 static void draw_NPA_faithful_anpa (Graphics g) {
@@ -58,7 +58,7 @@ static void draw_NPA_faithful_anpa (Graphics g) {
 	ot -> index [1] = 3;
 	ot -> index [2] = 2;
 	ot -> index [3] = 1;
-	OTGrammar_drawTableau (ot, g, false, L"an+pa");
+	OTGrammar_drawTableau (ot, g, false, U"an+pa");
 	forget (ot);
 }
 static void draw_NPA_faithful_atma (Graphics g) {
@@ -66,27 +66,27 @@ static void draw_NPA_faithful_atma (Graphics g) {
 	ot -> index [1] = 3;
 	ot -> index [2] = 2;
 	ot -> index [3] = 1;
-	OTGrammar_drawTableau (ot, g, false, L"at+ma");
+	OTGrammar_drawTableau (ot, g, false, U"at+ma");
 	forget (ot);
 }
 static void draw_Wolof_ItI (Graphics g) {
 	OTGrammar ot = OTGrammar_create_tongueRoot_grammar (1, 4);
-	OTGrammar_drawTableau (ot, g, false, L"\\ict\\ic");
+	OTGrammar_drawTableau (ot, g, false, U"\\ict\\ic");
 	forget (ot);
 }
 static void draw_Wolof_itE (Graphics g) {
 	OTGrammar ot = OTGrammar_create_tongueRoot_grammar (1, 4);
-	OTGrammar_drawTableau (ot, g, false, L"it\\ef");
+	OTGrammar_drawTableau (ot, g, false, U"it\\ef");
 	forget (ot);
 }
 static void draw_Wolof_etE (Graphics g) {
 	OTGrammar ot = OTGrammar_create_tongueRoot_grammar (1, 4);
-	OTGrammar_drawTableau (ot, g, false, L"et\\ef");
+	OTGrammar_drawTableau (ot, g, false, U"et\\ef");
 	forget (ot);
 }
 static void draw_Wolof_schwatschwa (Graphics g) {
 	OTGrammar ot = OTGrammar_create_tongueRoot_grammar (1, 4);
-	OTGrammar_drawTableau (ot, g, false, L"\\swt\\sw");
+	OTGrammar_drawTableau (ot, g, false, U"\\swt\\sw");
 	forget (ot);
 }
 static void draw_Infant_swtI (Graphics g) {
@@ -97,134 +97,134 @@ static void draw_Infant_swtI (Graphics g) {
 	ot -> constraints [4]. disharmony = 1;
 	ot -> constraints [5]. disharmony = 5;
 	OTGrammar_sort (ot);
-	OTGrammar_drawTableau (ot, g, false, L"\\swt\\ic");
+	OTGrammar_drawTableau (ot, g, false, U"\\swt\\ic");
 	forget (ot);
 }
 
 void manual_gram_init (ManPages me);
 void manual_gram_init (ManPages me) {
 
-MAN_BEGIN (L"constraints", L"ppgb", 20021105)
-INTRO (L"In @@Optimality Theory@, the `rules' that an output form has to satisfy. Since there can be many constraints "
+MAN_BEGIN (U"constraints", U"ppgb", 20021105)
+INTRO (U"In @@Optimality Theory@, the `rules' that an output form has to satisfy. Since there can be many constraints "
 	"and these constraints can conflict with each other, the constraints are %violable and the highest-ranked constraints "
 	"have the largest say in determining the optimal output.")
-NORMAL (L"See the @@OT learning@ tutorial for many examples.")
+NORMAL (U"See the @@OT learning@ tutorial for many examples.")
 MAN_END
 
-MAN_BEGIN (L"Create tongue-root grammar...", L"ppgb", 20141001)
-INTRO (L"A command in the @@New menu@ for creating an @OTGrammar object with a tongue-root-harmony grammar.")
-NORMAL (L"These OTGrammar grammars only accept inputs of the form V__1_tV__2_, where V__1_ and V__2_ are "
+MAN_BEGIN (U"Create tongue-root grammar...", U"ppgb", 20141001)
+INTRO (U"A command in the @@New menu@ for creating an @OTGrammar object with a tongue-root-harmony grammar.")
+NORMAL (U"These OTGrammar grammars only accept inputs of the form V__1_tV__2_, where V__1_ and V__2_ are "
 	"chosen from the six front vowels i, ɪ, e, ɛ, ə, and a.")
-NORMAL (L"The following phonological features are relevant:")
-LIST_ITEM (L"\t\tATR\tRTR")
-LIST_ITEM (L"\thigh\ti\tɪ")
-LIST_ITEM (L"\tmid\te\tɛ")
-LIST_ITEM (L"\tlow\tə\ta")
-ENTRY (L"Constraints")
-NORMAL (L"The resulting OTGrammar will usually contain at least the following five constraints:")
-TAG (L"*[rtr / hi]")
-DEFINITION (L"\"do not implement [retracted tongue root] if the vowel is high.\"")
-TAG (L"*[atr / lo]")
-DEFINITION (L"\"do not implement [advanced tongue root] if the vowel is low.\"")
-TAG (L"P\\s{ARSE} (rtr)")
-DEFINITION (L"\"make an underlying [retracted tongue root] specification surface.\"")
-TAG (L"P\\s{ARSE} (atr)")
-DEFINITION (L"\"make an underlying [advanced tongue root] specification surface.\"")
-TAG (L"*G\\s{ESTURE} (contour)")
-DEFINITION (L"\"do not go from advanced to retracted tongue root, nor the other way around, within a word.\"")
-NORMAL (L"This set of constraints thus comprises: ")
-LIST_ITEM (L"• two %%##grounding conditions#% (@@Archangeli & Pulleyblank (1994)@), "
+NORMAL (U"The following phonological features are relevant:")
+LIST_ITEM (U"\t\tATR\tRTR")
+LIST_ITEM (U"\thigh\ti\tɪ")
+LIST_ITEM (U"\tmid\te\tɛ")
+LIST_ITEM (U"\tlow\tə\ta")
+ENTRY (U"Constraints")
+NORMAL (U"The resulting OTGrammar will usually contain at least the following five constraints:")
+TAG (U"*[rtr / hi]")
+DEFINITION (U"\"do not implement [retracted tongue root] if the vowel is high.\"")
+TAG (U"*[atr / lo]")
+DEFINITION (U"\"do not implement [advanced tongue root] if the vowel is low.\"")
+TAG (U"P\\s{ARSE} (rtr)")
+DEFINITION (U"\"make an underlying [retracted tongue root] specification surface.\"")
+TAG (U"P\\s{ARSE} (atr)")
+DEFINITION (U"\"make an underlying [advanced tongue root] specification surface.\"")
+TAG (U"*G\\s{ESTURE} (contour)")
+DEFINITION (U"\"do not go from advanced to retracted tongue root, nor the other way around, within a word.\"")
+NORMAL (U"This set of constraints thus comprises: ")
+LIST_ITEM (U"• two %%##grounding conditions#% (@@Archangeli & Pulleyblank (1994)@), "
 	"which we can see as gestural constraints;")
-LIST_ITEM (L"• two %%##faithfulness constraints#%, which favour the similarity between input and output, "
+LIST_ITEM (U"• two %%##faithfulness constraints#%, which favour the similarity between input and output, "
 	"and can be seen as implementing the principle of maximization of perceptual contrast;")
-LIST_ITEM (L"• a %%##harmony constraint#%, which, if crucially ranked higher than at least one faithfulness constraint, "
+LIST_ITEM (U"• a %%##harmony constraint#%, which, if crucially ranked higher than at least one faithfulness constraint, "
 	"forces %%##tongue-root harmony#%.")
-NORMAL (L"In addition, there may be the following four constraints:")
-TAG (L"*[rtr / mid]")
-DEFINITION (L"\"do not implement [retracted tongue root] if the vowel is mid; universally ranked lower "
+NORMAL (U"In addition, there may be the following four constraints:")
+TAG (U"*[rtr / mid]")
+DEFINITION (U"\"do not implement [retracted tongue root] if the vowel is mid; universally ranked lower "
 	"than *[rtr / hi].\"")
-TAG (L"*[rtr / lo]")
-DEFINITION (L"\"do not implement [retracted tongue root] if the vowel is low; universally ranked lower "
+TAG (U"*[rtr / lo]")
+DEFINITION (U"\"do not implement [retracted tongue root] if the vowel is low; universally ranked lower "
 	"than *[rtr / mid].\"")
-TAG (L"*[atr / mid]")
-DEFINITION (L"\"do not implement [advanced tongue root] if the vowel is mid; universally ranked lower "
+TAG (U"*[atr / mid]")
+DEFINITION (U"\"do not implement [advanced tongue root] if the vowel is mid; universally ranked lower "
 	"than *[atr / lo].\"")
-TAG (L"*[atr / hi]")
-DEFINITION (L"\"do not implement [advanced tongue root] if the vowel is high; universally ranked lower "
+TAG (U"*[atr / hi]")
+DEFINITION (U"\"do not implement [advanced tongue root] if the vowel is high; universally ranked lower "
 	"than *[atr / mid].\"")
-NORMAL (L"The universal rankings referred to are due to the %%##local-ranking principle#% (@@Boersma (1998)@). "
+NORMAL (U"The universal rankings referred to are due to the %%##local-ranking principle#% (@@Boersma (1998)@). "
 	"A learning algorithm may enforce this principle, e.g., if *[rtr / hi] falls down the ranking scale, "
 	"*[rtr / mid] may be pushed along.")
-NORMAL (L"For information on learning these tongue-root grammars, see @@OT learning@ "
+NORMAL (U"For information on learning these tongue-root grammars, see @@OT learning@ "
 	"and @@Boersma (2000)@.")
 MAN_END
 
-MAN_BEGIN (L"Optimality Theory", L"ppgb", 20021105)
-INTRO (L"A framework for transferring one linguistic representation into another, "
+MAN_BEGIN (U"Optimality Theory", U"ppgb", 20021105)
+INTRO (U"A framework for transferring one linguistic representation into another, "
 	"e.g. transferring an underlying form into a surface form. Before @@Prince & Smolensky (1993)@, "
 	"phonologists tended to this with a sequentially ordered set of rules, each of which transferred a representation "
 	"into another. With @OT (that's the abbreviation), there are no intermediate steps in the derivation, but a set of ranked "
 	"@constraints chooses the optimal output form from a set of candidates.")
-NORMAL (L"In Praat, you can draw Optimality-Theoretic tableaus and simulate Optimality-Theoretic learning. "
+NORMAL (U"In Praat, you can draw Optimality-Theoretic tableaus and simulate Optimality-Theoretic learning. "
 	"See the @@OT learning@ tutorial.")
 MAN_END
 
-MAN_BEGIN (L"OT", L"ppgb", 20021105)
-INTRO (L"An abbreviation for @@Optimality Theory at .")
+MAN_BEGIN (U"OT", U"ppgb", 20021105)
+INTRO (U"An abbreviation for @@Optimality Theory at .")
 MAN_END
 
-MAN_BEGIN (L"OT learning", L"ppgb", 20070423)
-INTRO (L"This tutorial describes how you can draw Optimality-Theoretic and Harmonic-Grammar tableaus and "
+MAN_BEGIN (U"OT learning", U"ppgb", 20070423)
+INTRO (U"This tutorial describes how you can draw Optimality-Theoretic and Harmonic-Grammar tableaus and "
 	"simulate Optimality-Theoretic and Harmonic-Grammar learning with Praat.")
-NORMAL (L"You can read this tutorial sequentially with the help of the \"< 1\" and \"1 >\" buttons.")
-LIST_ITEM (L"1. @@OT learning 1. Kinds of grammars|Kinds of grammars@ (ordinal and stochastic, @OTGrammar)")
-LIST_ITEM (L"2. @@OT learning 2. The grammar|The grammar@")
-LIST_ITEM1 (L"2.1. @@OT learning 2.1. Viewing a grammar|Viewing a grammar@ (N\\s{O}C\\s{ODA} example, @OTGrammarEditor)")
-LIST_ITEM1 (L"2.2. @@OT learning 2.2. Inside the grammar|Inside the grammar@ (saving, inspecting)")
-LIST_ITEM1 (L"2.3. @@OT learning 2.3. Defining your own grammar|Defining your own grammar@")
-LIST_ITEM1 (L"2.4. @@OT learning 2.4. Evaluation|Evaluation@ (noise)")
-LIST_ITEM1 (L"2.5. @@OT learning 2.5. Editing a grammar|Editing a grammar@")
-LIST_ITEM1 (L"2.6. @@OT learning 2.6. Variable output|Variable output@ (place assimilation example)")
-LIST_ITEM1 (L"2.7. @@OT learning 2.7. Tableau pictures|Tableau pictures@ (printing, EPS)")
-LIST_ITEM1 (L"2.8. @@OT learning 2.8. Asking for one output|Asking for one output@")
-LIST_ITEM1 (L"2.9. @@OT learning 2.9. Output distributions|Output distributions@")
-LIST_ITEM (L"3. @@OT learning 3. Generating language data|Generating language data@")
-LIST_ITEM1 (L"3.1. @@OT learning 3.1. Data from a pair distribution|Data from a pair distribution@")
-LIST_ITEM1 (L"3.2. @@OT learning 3.2. Data from another grammar|Data from another grammar@ (tongue-root-harmony example)")
-LIST_ITEM (L"4. @@OT learning 4. Learning an ordinal grammar|Learning an ordinal grammar@")
-LIST_ITEM (L"5. @@OT learning 5. Learning a stochastic grammar|Learning a stochastic grammar@")
-LIST_ITEM (L"6. @@OT learning 6. Shortcut to grammar learning|Shortcut to grammar learning@")
-LIST_ITEM (L"7. @@OT learning 7. Learning from overt forms|Learning from overt forms@")
+NORMAL (U"You can read this tutorial sequentially with the help of the \"< 1\" and \"1 >\" buttons.")
+LIST_ITEM (U"1. @@OT learning 1. Kinds of grammars|Kinds of grammars@ (ordinal and stochastic, @OTGrammar)")
+LIST_ITEM (U"2. @@OT learning 2. The grammar|The grammar@")
+LIST_ITEM1 (U"2.1. @@OT learning 2.1. Viewing a grammar|Viewing a grammar@ (N\\s{O}C\\s{ODA} example, @OTGrammarEditor)")
+LIST_ITEM1 (U"2.2. @@OT learning 2.2. Inside the grammar|Inside the grammar@ (saving, inspecting)")
+LIST_ITEM1 (U"2.3. @@OT learning 2.3. Defining your own grammar|Defining your own grammar@")
+LIST_ITEM1 (U"2.4. @@OT learning 2.4. Evaluation|Evaluation@ (noise)")
+LIST_ITEM1 (U"2.5. @@OT learning 2.5. Editing a grammar|Editing a grammar@")
+LIST_ITEM1 (U"2.6. @@OT learning 2.6. Variable output|Variable output@ (place assimilation example)")
+LIST_ITEM1 (U"2.7. @@OT learning 2.7. Tableau pictures|Tableau pictures@ (printing, EPS)")
+LIST_ITEM1 (U"2.8. @@OT learning 2.8. Asking for one output|Asking for one output@")
+LIST_ITEM1 (U"2.9. @@OT learning 2.9. Output distributions|Output distributions@")
+LIST_ITEM (U"3. @@OT learning 3. Generating language data|Generating language data@")
+LIST_ITEM1 (U"3.1. @@OT learning 3.1. Data from a pair distribution|Data from a pair distribution@")
+LIST_ITEM1 (U"3.2. @@OT learning 3.2. Data from another grammar|Data from another grammar@ (tongue-root-harmony example)")
+LIST_ITEM (U"4. @@OT learning 4. Learning an ordinal grammar|Learning an ordinal grammar@")
+LIST_ITEM (U"5. @@OT learning 5. Learning a stochastic grammar|Learning a stochastic grammar@")
+LIST_ITEM (U"6. @@OT learning 6. Shortcut to grammar learning|Shortcut to grammar learning@")
+LIST_ITEM (U"7. @@OT learning 7. Learning from overt forms|Learning from overt forms@")
 MAN_END
 
-MAN_BEGIN (L"OT learning 1. Kinds of grammars", L"ppgb", 20100330)
-INTRO (L"This is chapter 1 of the @@OT learning@ tutorial.")
-NORMAL (L"According to @@Prince & Smolensky (1993)@, an @@Optimality Theory|Optimality-Theoretic@ (@OT) grammar "
+MAN_BEGIN (U"OT learning 1. Kinds of grammars", U"ppgb", 20100330)
+INTRO (U"This is chapter 1 of the @@OT learning@ tutorial.")
+NORMAL (U"According to @@Prince & Smolensky (1993)@, an @@Optimality Theory|Optimality-Theoretic@ (@OT) grammar "
 	"consists of a number of ranked @constraints. "
 	"For every possible input (usually an underlying form), GEN (the generator) generates a (possibly very large) number of "
 	"%%output candidates%, and the ranking order of the constraints determines the winning candidate, "
 	"which becomes the single optimal output.")
-NORMAL (L"According to @@Prince & Smolensky (1993)@ and @@Smolensky & Legendre (2006)@, a Harmonic Grammar (HG) "
+NORMAL (U"According to @@Prince & Smolensky (1993)@ and @@Smolensky & Legendre (2006)@, a Harmonic Grammar (HG) "
 	"consists of a number of weighted @constraints. "
 	"The winning candidate, which becomes the single optimal output, is the one with the greatest %harmony, which "
 	"is a measure of goodness determined by the weights of the constraints violated by each candidate.")
-NORMAL (L"In OT, ranking is %strict, i.e., if a constraint %A is ranked higher than the constraints %B, %C, and %D, "
+NORMAL (U"In OT, ranking is %strict, i.e., if a constraint %A is ranked higher than the constraints %B, %C, and %D, "
 	"a candidate that violates only constraint %A will always be beaten by any candidate that respects %A "
 	"(and any higher constraints), even if it violates %B, %C, and %D.")
-NORMAL (L"In HG, weighting is %additive, i.e., a candidate that only violates a constraint %A with a weight of 100 "
+NORMAL (U"In HG, weighting is %additive, i.e., a candidate that only violates a constraint %A with a weight of 100 "
 	"has a harmony of -100 and will therefore beat a candidate that violates both a constraint %B with a weight of 70 "
 	"and a constraint %C with a weight of 40 and therefore has a harmony of only -110. Also, two violations of constraint %B "
 	"(harmony 2 * -70 = -140) are worse than one violation of constraint %A (harmony -100).")
-ENTRY (L"1. Ordinal OT grammars")
-NORMAL (L"Because only the ranking order of the constraints plays a role in evaluating the output candidates, "
+ENTRY (U"1. Ordinal OT grammars")
+NORMAL (U"Because only the ranking order of the constraints plays a role in evaluating the output candidates, "
 	"Prince & Smolensky took an OT grammar to contain no absolute ranking values, i.e., they accepted only an ordinal relation "
 	"between the constraint rankings. For such a grammar, @@Tesar & Smolensky (1998)@ devised an on-line learning algorithm "
 	"(Error-Driven Constraint Demotion, EDCD) that changes the ranking order "
 	"whenever the form produced by the learner is different from the adult form "
 	"(a corrected version of the algorithm can be found in @@Boersma (2009b)@). Such a learning step "
 	"can sometimes lead to a large change in the behaviour of the grammar.")
-ENTRY (L"2. Stochastic OT grammars")
-NORMAL (L"The EDCD algorithm is fast and convergent. As a model of language acquisition, however, its drawbacks are that it "
+ENTRY (U"2. Stochastic OT grammars")
+NORMAL (U"The EDCD algorithm is fast and convergent. As a model of language acquisition, however, its drawbacks are that it "
 	"is extremely sensitive to errors in the learning data and that it does not show realistic gradual learning curves. "
 	"For these reasons, @@Boersma (1997)@ "
 	"proposed stochastic OT grammars in which every constraint has a %%ranking value% along a continuous ranking scale, "
@@ -233,132 +233,132 @@ NORMAL (L"The EDCD algorithm is fast and convergent. As a model of language acqu
 	"ranking values of the constraints with every learning step. An added virtue of the GLA is that it can learn "
 	"languages with optionality and variation, which was something that EDCD could not do. "
 	"For how this algorithm works on some traditional phonological problems, see @@Boersma & Hayes (2001)@.")
-NORMAL (L"Ordinal OT grammars can be seen as a special case of the more general stochastic OT grammars: "
+NORMAL (U"Ordinal OT grammars can be seen as a special case of the more general stochastic OT grammars: "
 	"they have integer ranking values (%strata) and zero evaluation noise. "
 	"In Praat, therefore, every constraint is taken to have a ranking value, "
 	"so that you can do stochastic as well as ordinal OT.")
-ENTRY (L"3. Categorical Harmonic Grammars")
-NORMAL (L"@@Jäger (2003)@ and @@Soderstrom, Mathis & Smolensky (2006)@ devised an on-line learning algorithm "
+ENTRY (U"3. Categorical Harmonic Grammars")
+NORMAL (U"@@Jäger (2003)@ and @@Soderstrom, Mathis & Smolensky (2006)@ devised an on-line learning algorithm "
 	"for Harmonic Grammars (stochastic gradient ascent). As proven by @@Fischer (2005)@, "
 	"this algorithm is guaranteed to converge upon a correct grammar, if there exists one that handles the data.")
-ENTRY (L"4. Stochastic Harmonic Grammars")
-NORMAL (L"There are two kinds of stochastic models of HG, namely MaxEnt (= Maximum Entropy) grammars "
+ENTRY (U"4. Stochastic Harmonic Grammars")
+NORMAL (U"There are two kinds of stochastic models of HG, namely MaxEnt (= Maximum Entropy) grammars "
 	"(@@Smolensky (1986)@, @@Jäger (2003)@), in which the probablity of a candidate winning depends on its harmony, "
 	"and Noisy HG (@@Boersma & Escudero (2008)@, @@Boersma & Pater (2008)@), in which noise is added to constraint weights "
 	"at evaluation time, as in Stochastic OT.")
-NORMAL (L"The algorithm by @@Jäger (2003)@ and @@Soderstrom, Mathis & Smolensky (2006)@ "
+NORMAL (U"The algorithm by @@Jäger (2003)@ and @@Soderstrom, Mathis & Smolensky (2006)@ "
 	"can learn languages with optionality and variation (@@Boersma & Pater (2008)@).")
-ENTRY (L"The OTGrammar object")
-NORMAL (L"An OT grammar is implemented as an @OTGrammar object. "
+ENTRY (U"The OTGrammar object")
+NORMAL (U"An OT grammar is implemented as an @OTGrammar object. "
 	"In an OTGrammar object, you specify all the constraints, all the possible inputs and all their possible outputs.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 2. The grammar", L"ppgb", 20000122)
-INTRO (L"This is chapter 2 of the @@OT learning@ tutorial.")
-NORMAL (L"We can ask the grammar to produce an output form for any input form that is in its list of tableaus.")
-LIST_ITEM (L"2.1. @@OT learning 2.1. Viewing a grammar|Viewing a grammar@ (N\\s{O}C\\s{ODA} example, @OTGrammarEditor)")
-LIST_ITEM (L"2.2. @@OT learning 2.2. Inside the grammar|Inside the grammar@ (saving, inspecting)")
-LIST_ITEM (L"2.3. @@OT learning 2.3. Defining your own grammar|Defining your own grammar@")
-LIST_ITEM (L"2.4. @@OT learning 2.4. Evaluation|Evaluation@ (noise)")
-LIST_ITEM (L"2.5. @@OT learning 2.5. Editing a grammar|Editing a grammar@")
-LIST_ITEM (L"2.6. @@OT learning 2.6. Variable output|Variable output@ (place assimilation example)")
-LIST_ITEM (L"2.7. @@OT learning 2.7. Tableau pictures|Tableau pictures@ (printing, EPS files)")
-LIST_ITEM (L"2.8. @@OT learning 2.8. Asking for one output|Asking for one output@")
-LIST_ITEM (L"2.9. @@OT learning 2.9. Output distributions|Output distributions@")
+MAN_BEGIN (U"OT learning 2. The grammar", U"ppgb", 20000122)
+INTRO (U"This is chapter 2 of the @@OT learning@ tutorial.")
+NORMAL (U"We can ask the grammar to produce an output form for any input form that is in its list of tableaus.")
+LIST_ITEM (U"2.1. @@OT learning 2.1. Viewing a grammar|Viewing a grammar@ (N\\s{O}C\\s{ODA} example, @OTGrammarEditor)")
+LIST_ITEM (U"2.2. @@OT learning 2.2. Inside the grammar|Inside the grammar@ (saving, inspecting)")
+LIST_ITEM (U"2.3. @@OT learning 2.3. Defining your own grammar|Defining your own grammar@")
+LIST_ITEM (U"2.4. @@OT learning 2.4. Evaluation|Evaluation@ (noise)")
+LIST_ITEM (U"2.5. @@OT learning 2.5. Editing a grammar|Editing a grammar@")
+LIST_ITEM (U"2.6. @@OT learning 2.6. Variable output|Variable output@ (place assimilation example)")
+LIST_ITEM (U"2.7. @@OT learning 2.7. Tableau pictures|Tableau pictures@ (printing, EPS files)")
+LIST_ITEM (U"2.8. @@OT learning 2.8. Asking for one output|Asking for one output@")
+LIST_ITEM (U"2.9. @@OT learning 2.9. Output distributions|Output distributions@")
 MAN_END
 
-MAN_BEGIN (L"OT learning 2.1. Viewing a grammar", L"ppgb", 20070725)
-NORMAL (L"Consider a language where the underlying form /pat/ leads to the surface form [pa], "
+MAN_BEGIN (U"OT learning 2.1. Viewing a grammar", U"ppgb", 20070725)
+NORMAL (U"Consider a language where the underlying form /pat/ leads to the surface form [pa], "
 	"presumably because the structural constraint N\\s{O}C\\s{ODA} outranks the faithfulness constraint P\\s{ARSE}.")
-NORMAL (L"To create such a grammar in Praat, choose ##Create NoCoda grammar# from the Optimality Theory submenu of the @@New menu at . "
+NORMAL (U"To create such a grammar in Praat, choose ##Create NoCoda grammar# from the Optimality Theory submenu of the @@New menu at . "
 	"An @OTGrammar object will then appear in the list of objects. "
 	"If you click ##View & Edit#, an @OTGrammarEditor will show up, containing:")
-LIST_ITEM (L"1. the constraint list, sorted by %#disharmony (= ranking value + noise):")
-LIST_ITEM1 (L" ")
-LIST_ITEM1 (L"\t\t      %%ranking value%\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      100.000\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      90.000\t      90.000\t       1.000")
-LIST_ITEM1 (L" ")
-LIST_ITEM (L"2. the tableaus for the two possible inputs /pat/ and /pa/:")
+LIST_ITEM (U"1. the constraint list, sorted by %#disharmony (= ranking value + noise):")
+LIST_ITEM1 (U" ")
+LIST_ITEM1 (U"\t\t      %%ranking value%\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      100.000\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      90.000\t      90.000\t       1.000")
+LIST_ITEM1 (U" ")
+LIST_ITEM (U"2. the tableaus for the two possible inputs /pat/ and /pa/:")
 PICTURE (3.0, 1.0, draw_NoCoda_pat)
 PICTURE (3.0, 0.7, draw_NoCoda_pa)
-NORMAL (L"From the first tableau, we see that the underlying form /pat/ will surface as [pa], "
+NORMAL (U"From the first tableau, we see that the underlying form /pat/ will surface as [pa], "
 	"because the alternative [pat] violates a constraint (namely, N\\s{O}C\\s{ODA}) with a higher disharmony than does [pa], "
 	"which only violates P\\s{ARSE}, which has a lower disharmony.")
-NORMAL (L"Note the standard OT tableau layout: asterisks (*) showing violations, exclamation marks (!) showing crucial violations, "
+NORMAL (U"Note the standard OT tableau layout: asterisks (*) showing violations, exclamation marks (!) showing crucial violations, "
 	"greying of cells that do not contribute to determining the winning candidate, and a finger (☞) pointing to the winner "
 	"(this may look like a plus sign (+) if you don't have the Zapf Dingbats font installed on your computer or printer). "
 	"An HG tableau contains asterisks and a pointing finger, but no exclamation marks or grey cells.")
-NORMAL (L"The second tableau shows that /pa/ always surfaces as [pa], which is no wonder since this is "
+NORMAL (U"The second tableau shows that /pa/ always surfaces as [pa], which is no wonder since this is "
 	"the only candidate. All cells are grey because none of them contributes to the determination of the winner.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 2.2. Inside the grammar", L"ppgb", 20110129)
-NORMAL (L"You can save an @OTGrammar grammar as a text file by choosing @@Save as text file...@ from the #Save menu "
+MAN_BEGIN (U"OT learning 2.2. Inside the grammar", U"ppgb", 20110129)
+NORMAL (U"You can save an @OTGrammar grammar as a text file by choosing @@Save as text file...@ from the #Save menu "
 	"of the Objects window. For the N\\s{O}C\\s{ODA} example, the contents of the file will look like:")
-CODE (L"File type = \"ooTextFile\"")
-CODE (L"Object class = \"OTGrammar 2\"")
-CODE (L"decisionStrategy = <OptimalityTheory>")
-CODE (L"leak = 0")
-CODE (L"2 constraints")
-CODE (L"constraint [1]: \"N\\bss{O}C\\bss{ODA}\" 100 100 1 ! NOCODA")
-CODE (L"constraint [2]: \"P\\bss{ARSE}\" 90 90 1 ! PARSE")
-CODE (L" ")
-CODE (L"0 fixed rankings")
-CODE (L" ")
-CODE (L"2 tableaus")
-CODE (L"input [1]: \"pat\" 2")
-CODE1 (L"candidate [1]: \"pa\" 0 1")
-CODE1 (L"candidate [2]: \"pat\" 1 0")
-CODE (L"input [2]: \"pa\" 1")
-CODE1 (L"candidate [1]: \"pa\" 0 0")
-NORMAL (L"To understand more about this data structure, consult the @OTGrammar class description "
+CODE (U"File type = \"ooTextFile\"")
+CODE (U"Object class = \"OTGrammar 2\"")
+CODE (U"decisionStrategy = <OptimalityTheory>")
+CODE (U"leak = 0")
+CODE (U"2 constraints")
+CODE (U"constraint [1]: \"N\\bss{O}C\\bss{ODA}\" 100 100 1 ! NOCODA")
+CODE (U"constraint [2]: \"P\\bss{ARSE}\" 90 90 1 ! PARSE")
+CODE (U" ")
+CODE (U"0 fixed rankings")
+CODE (U" ")
+CODE (U"2 tableaus")
+CODE (U"input [1]: \"pat\" 2")
+CODE1 (U"candidate [1]: \"pa\" 0 1")
+CODE1 (U"candidate [2]: \"pat\" 1 0")
+CODE (U"input [2]: \"pa\" 1")
+CODE1 (U"candidate [1]: \"pa\" 0 0")
+NORMAL (U"To understand more about this data structure, consult the @OTGrammar class description "
 	"or click #Inspect after selecting the OTGrammar object. The $$\"\\bss{...}\"$ braces ensure that "
 	"the constraint names show up with their traditional small capitals (see @@Text styles@).")
-NORMAL (L"You can read this text file into Praat again with @@Read from file...@ from the #Open menu in the Objects window.")
+NORMAL (U"You can read this text file into Praat again with @@Read from file...@ from the #Open menu in the Objects window.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 2.3. Defining your own grammar", L"ppgb", 20110129)
-NORMAL (L"By editing a text file created from an example in the @@New menu@, you can define your own OT grammars.")
-NORMAL (L"As explained at @@Save as text file...@, Praat is quite resilient about its text file formats. "
+MAN_BEGIN (U"OT learning 2.3. Defining your own grammar", U"ppgb", 20110129)
+NORMAL (U"By editing a text file created from an example in the @@New menu@, you can define your own OT grammars.")
+NORMAL (U"As explained at @@Save as text file...@, Praat is quite resilient about its text file formats. "
 	"As long as the strings and numbers appear in the correct order, you can redistribute the data "
 	"across the lines, add all kinds of comments, or leave the comments out. "
 	"For the N\\s{O}C\\s{ODA} example, the text file could also have looked like:")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"OTGrammar 2\"")
-CODE (L"<OptimalityTheory>")
-CODE (L"0.0   ! leak")
-CODE (L"2   ! number of constraints")
-CODE (L"\"N\\bss{O}C\\bss{ODA}\" 100 100  1")
-CODE (L"\"P\\bss{ARSE}\"       90  90  1")
-CODE (L"0   ! number of fixed rankings")
-CODE (L"2   ! number of accepted inputs")
-CODE (L"\"pat\" 2      ! input form with number of output candidates")
-CODE1 (L"\"pa\"  0 1   ! first candidate with violations")
-CODE1 (L"\"pat\" 1 0   ! second candidate with violations")
-CODE (L"\"pa\" 1       ! input form with number of candidates")
-CODE1 (L"\"pa\"  0 0")
-NORMAL (L"To define your own grammar, you just provide a number of constraints and their rankings, "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"OTGrammar 2\"")
+CODE (U"<OptimalityTheory>")
+CODE (U"0.0   ! leak")
+CODE (U"2   ! number of constraints")
+CODE (U"\"N\\bss{O}C\\bss{ODA}\" 100 100  1")
+CODE (U"\"P\\bss{ARSE}\"       90  90  1")
+CODE (U"0   ! number of fixed rankings")
+CODE (U"2   ! number of accepted inputs")
+CODE (U"\"pat\" 2      ! input form with number of output candidates")
+CODE1 (U"\"pa\"  0 1   ! first candidate with violations")
+CODE1 (U"\"pat\" 1 0   ! second candidate with violations")
+CODE (U"\"pa\" 1       ! input form with number of candidates")
+CODE1 (U"\"pa\"  0 0")
+NORMAL (U"To define your own grammar, you just provide a number of constraints and their rankings, "
 	"and all the possible input forms with all their output candidates, and all the constraint violations "
 	"for each candidate. The order in which you specify the constraints is free (you don't have to specify "
 	"the highest-ranked first), as long as the violations are in the same order; you could also have reversed "
 	"the order of the two input forms, as long as the corresponding candidates follow them; "
 	"and, you could also have reversed the order of the candidates within the /pat/ tableau, "
 	"as long as the violations follow the output forms. Thus, you could just as well have written:")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"OTGrammar 2\"")
-CODE (L"<OptimalityTheory> 0.0")
-CODE (L"2")
-CODE (L"\"P\\bss{ARSE}\"       90  90 1.0")
-CODE (L"\"N\\bss{O}C\\bss{ODA}\" 100 100 1.0")
-CODE (L"0")
-CODE (L"2")
-CODE (L"\"pa\" 1")
-CODE1 (L"\"pa\"  0 0")
-CODE (L"\"pat\" 2")
-CODE1 (L"\"pat\" 0 1")
-CODE1 (L"\"pa\"  1 0")
-NORMAL (L"The $$<OptimalityTheory>$ thing in the above refers to the %%decision strategy%. "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"OTGrammar 2\"")
+CODE (U"<OptimalityTheory> 0.0")
+CODE (U"2")
+CODE (U"\"P\\bss{ARSE}\"       90  90 1.0")
+CODE (U"\"N\\bss{O}C\\bss{ODA}\" 100 100 1.0")
+CODE (U"0")
+CODE (U"2")
+CODE (U"\"pa\" 1")
+CODE1 (U"\"pa\"  0 0")
+CODE (U"\"pat\" 2")
+CODE1 (U"\"pat\" 0 1")
+CODE1 (U"\"pa\"  1 0")
+NORMAL (U"The $$<OptimalityTheory>$ thing in the above refers to the %%decision strategy%. "
 	"In this tutorial I mostly assume OT's strict ranking, "
 	"but you can experiment with Smolensky's $$<HarmonicGrammar>$ (where the constraint disharmonies represent addable, "
 	"possibly negative weights), or with Frank Keller's $$<LinearOT>$ (like Harmonic Grammar, but with the restriction "
@@ -366,356 +366,356 @@ NORMAL (L"The $$<OptimalityTheory>$ thing in the above refers to the %%decision
 	"that disharmonies below 1.0 have weight 1.0), or with $$<ExponentialHG>$ (where the weights are exp(disharmony), somewhere "
 	"between Harmonic Grammar and Linear OT), or with a $$<MaximumEntropy>$ grammar "
 	"(where the probability that a candidate is chosen is proportional to exp(-disharmony)).")
-NORMAL (L"The $$leak$ thing in the above refers to the amount to which constraint weights (especially in Harmonic Grammar) "
+NORMAL (U"The $$leak$ thing in the above refers to the amount to which constraint weights (especially in Harmonic Grammar) "
 	"can leak while learning.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 2.4. Evaluation", L"ppgb", 20070725)
-NORMAL (L"In an Optimality-Theoretic model of grammar, %#evaluation refers to the determination "
+MAN_BEGIN (U"OT learning 2.4. Evaluation", U"ppgb", 20070725)
+NORMAL (U"In an Optimality-Theoretic model of grammar, %#evaluation refers to the determination "
 	"of the winning candidate on the basis of the constraint ranking.")
-NORMAL (L"In an ordinal OT model of grammar, repeated evaluations will yield the same winner again and again. "
+NORMAL (U"In an ordinal OT model of grammar, repeated evaluations will yield the same winner again and again. "
 	"We can simulate this behaviour with our N\\s{O}C\\s{ODA} example. "
 	"In the editor, you can choose ##Evaluate (zero noise)# or use its keyboard shortcut Command-0 (= Command-zero). "
 	"Repeated evaluations (keep Command-0 pressed) will always yield the following grammar:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      100.000\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      90.000\t      90.000\t       1.000")
-NORMAL (L"In a stochastic OT model of grammar, repeated evaluations will yield different disharmonies each time. "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      100.000\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      90.000\t      90.000\t       1.000")
+NORMAL (U"In a stochastic OT model of grammar, repeated evaluations will yield different disharmonies each time. "
 	"To see this, choose ##Evaluate (noise 2.0)# or use its keyboard shortcut Command-2. "
 	"Repeated evaluations will yield grammars like the following:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      100.427\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      90.000\t      87.502\t       1.000")
-NORMAL (L"and")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      101.041\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      90.000\t      90.930\t       1.000")
-NORMAL (L"and")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      96.398\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      90.000\t      89.482\t       1.000")
-NORMAL (L"The disharmonies vary around the ranking values, "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      100.427\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      90.000\t      87.502\t       1.000")
+NORMAL (U"and")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      101.041\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      90.000\t      90.930\t       1.000")
+NORMAL (U"and")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      96.398\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      90.000\t      89.482\t       1.000")
+NORMAL (U"The disharmonies vary around the ranking values, "
 	"according to a Gaussian distribution with a standard deviation of 2.0. "
 	"The winner will still be [pa] in almost all cases, because the probability of bridging "
 	"the gap between the two ranking values is very low, namely 0.02 per cent according "
 	"to @@Boersma (1998)@, page 332.")
-NORMAL (L"With a noise much higher than 2.0, the chances of P\\s{ARSE} outranking N\\s{O}C\\s{ODA} will rise. "
+NORMAL (U"With a noise much higher than 2.0, the chances of P\\s{ARSE} outranking N\\s{O}C\\s{ODA} will rise. "
 	"To see this, choose ##Evaluate...# and supply 5.0 for the noise. Typical outcomes are:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      92.634\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      90.000\t      86.931\t       1.000")
-NORMAL (L"and")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      101.162\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      90.000\t      85.311\t       1.000")
-NORMAL (L"and")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      90.000\t      99.778\t       1.000")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      98.711\t       1.000")
-NORMAL (L"In the last case, the order of the constraints has been reversed. "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      92.634\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      90.000\t      86.931\t       1.000")
+NORMAL (U"and")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      101.162\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      90.000\t      85.311\t       1.000")
+NORMAL (U"and")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      90.000\t      99.778\t       1.000")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      100.000\t      98.711\t       1.000")
+NORMAL (U"In the last case, the order of the constraints has been reversed. "
 	"You will see that [pat] has become the winning candidate:")
 PICTURE (3.0, 1.0, draw_NoCoda_reverse)
-NORMAL (L"However, in the remaining part of this tutorial, we will stick with a noise "
+NORMAL (U"However, in the remaining part of this tutorial, we will stick with a noise "
 	"with a standard deviation of 2.0. This specific number ensures that we can "
 	"model fairly rigid rankings by giving the constraints a ranking difference of 10, a nice round number. "
 	"Also, the learning algorithm will separate many constraints in such a way that "
 	"the differences between their ranking values are in the vicinity of 10.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 2.5. Editing a grammar", L"ppgb", 20110808)
-NORMAL (L"In the N\\s{O}C\\s{ODA} example, the winning candidate for the input /pat/ was always [pa].")
-NORMAL (L"To make [pat] the winner instead, N\\s{O}C\\s{ODA} should be ranked lower than P\\s{ARSE}. "
+MAN_BEGIN (U"OT learning 2.5. Editing a grammar", U"ppgb", 20110808)
+NORMAL (U"In the N\\s{O}C\\s{ODA} example, the winning candidate for the input /pat/ was always [pa].")
+NORMAL (U"To make [pat] the winner instead, N\\s{O}C\\s{ODA} should be ranked lower than P\\s{ARSE}. "
 	"To achieve this even with zero noise, go to the editor and select the N\\s{O}C\\s{ODA} constraint by clicking on it "
 	"(a spade symbol ♠︎ will mark the selected constraint), "
 	"and choose ##Edit ranking...# from the #Edit menu, or use the keyboard shortcut Command-E.")
-NORMAL (L"In the resulting command window, we lower the ranking of the constraint from 100 to 80, and click OK. "
+NORMAL (U"In the resulting command window, we lower the ranking of the constraint from 100 to 80, and click OK. "
 	"This is what you will see in the editor:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t♠︎ ##N\\s{O}C\\s{ODA}#\t      80.000\t      103.429\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      90.000\t      88.083\t       1.000")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t♠︎ ##N\\s{O}C\\s{ODA}#\t      80.000\t      103.429\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      90.000\t      88.083\t       1.000")
 PICTURE (3.0, 1.0, draw_NoCoda_pat)
-NORMAL (L"Nothing has happened to the tableau, because the disharmonies still have their old values. So choose "
+NORMAL (U"Nothing has happened to the tableau, because the disharmonies still have their old values. So choose "
 	"##Evaluate (noise 2.0)# (Command-2) or ##Evaluate (zero noise)# (Command-0). The new disharmonies "
 	"will centre around the new ranking values, and we see that [pat] becomes the new winner:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      90.000\t      90.743\t       1.000")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      80.000\t      81.581\t       1.000")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      90.000\t      90.743\t       1.000")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      80.000\t      81.581\t       1.000")
 PICTURE (3.0, 1.0, draw_NoCoda_reverse)
 MAN_END
 
-MAN_BEGIN (L"OT learning 2.6. Variable output", L"ppgb", 20070725)
-NORMAL (L"Each time you press Command-2, which invokes the command ##Evaluate (noise 2.0)# from the #Edit menu, "
+MAN_BEGIN (U"OT learning 2.6. Variable output", U"ppgb", 20070725)
+NORMAL (U"Each time you press Command-2, which invokes the command ##Evaluate (noise 2.0)# from the #Edit menu, "
 	"you will see the disharmonies changing. If the distance between the constraint rankings is 10, however, "
 	"the winning candidates will very probably stay the same.")
-NORMAL (L"So starting from the N\\s{O}C\\s{ODA} example, we edit the rankings of the constraints again, "
+NORMAL (U"So starting from the N\\s{O}C\\s{ODA} example, we edit the rankings of the constraints again, "
 	"setting the ranking value of P\\s{ARSE} to 88 and that of N\\s{O}C\\s{ODA} to 85. If we now press Command-2 "
 	"repeatedly, we will get [pat] in most of the cases, "
 	"but we will see the finger pointing at [pa] in 14 percent of the cases:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      88.000\t      87.421\t       1.000")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      85.000\t      85.585\t       1.000")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      88.000\t      87.421\t       1.000")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      85.000\t      85.585\t       1.000")
 PICTURE (3.0, 1.0, draw_NoCoda_reverse)
-NORMAL (L"but")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##N\\s{O}C\\s{ODA}#\t      85.000\t      87.128\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE}#\t      88.000\t      85.076\t       1.000")
+NORMAL (U"but")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##N\\s{O}C\\s{ODA}#\t      85.000\t      87.128\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE}#\t      88.000\t      85.076\t       1.000")
 PICTURE (3.0, 1.0, draw_NoCoda_pat)
-NORMAL (L"As a more functionally oriented example, we consider nasal place assimilation. "
+NORMAL (U"As a more functionally oriented example, we consider nasal place assimilation. "
 	"Suppose that the underlying sequence /an+pa/ surfaces as the assimilated [ampa] "
 	"in 80 percent of the cases, and as the faithful [anpa] in the remaining 20 percent, "
 	"while the non-nasal stop /t/ never assimilates. "
 	"This can be achieved by having the articulatory constraint *G\\s{ESTURE} "
 	"ranked at a short distance above *R\\s{EPLACE} (n, m):")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"OTGrammar 2\"")
-CODE (L"decisionStrategy = <OptimalityTheory>")
-CODE (L"leak = 0.0")
-CODE (L"3 constraints")
-CODE (L"\"*G\\bss{ESTURE}\"          102.7 0 1")
-CODE (L"\"*R\\bss{EPLACE} (n, m)\"   100.0 0 1")
-CODE (L"\"*R\\bss{EPLACE} (t, p)\"   112.0 0 1")
-CODE (L"0 fixed rankings")
-CODE (L"2 tableaus")
-CODE (L"\"an+pa\" 2")
-CODE1 (L"\"anpa\"  1 0 0")
-CODE1 (L"\"ampa\"  0 1 0")
-CODE (L"\"at+ma\" 2")
-CODE1 (L"\"atma\"  1 0 0")
-CODE1 (L"\"apma\"  0 0 1")
-NORMAL (L"You can create this grammar with ##Create place assimilation grammar# from the @@New menu at . "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"OTGrammar 2\"")
+CODE (U"decisionStrategy = <OptimalityTheory>")
+CODE (U"leak = 0.0")
+CODE (U"3 constraints")
+CODE (U"\"*G\\bss{ESTURE}\"          102.7 0 1")
+CODE (U"\"*R\\bss{EPLACE} (n, m)\"   100.0 0 1")
+CODE (U"\"*R\\bss{EPLACE} (t, p)\"   112.0 0 1")
+CODE (U"0 fixed rankings")
+CODE (U"2 tableaus")
+CODE (U"\"an+pa\" 2")
+CODE1 (U"\"anpa\"  1 0 0")
+CODE1 (U"\"ampa\"  0 1 0")
+CODE (U"\"at+ma\" 2")
+CODE1 (U"\"atma\"  1 0 0")
+CODE1 (U"\"apma\"  0 0 1")
+NORMAL (U"You can create this grammar with ##Create place assimilation grammar# from the @@New menu at . "
 	"In the editor, it will often look like follows:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (t, p)#\t      112.000\t      109.806\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE}#\t      102.700\t      102.742\t       1.000")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (n, m)#\t      100.000\t      101.044\t       1.000")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (t, p)#\t      112.000\t      109.806\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE}#\t      102.700\t      102.742\t       1.000")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (n, m)#\t      100.000\t      101.044\t       1.000")
 PICTURE (4.0, 1.0, draw_NPA_assimilate_anpa)
 PICTURE (4.0, 1.0, draw_NPA_assimilate_atma)
-NORMAL (L"If you keep the Command-2 keys pressed, however, you will see that the tableaus change "
+NORMAL (U"If you keep the Command-2 keys pressed, however, you will see that the tableaus change "
 	"into something like the following in approximately 20 percent of the cases:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (t, p)#\t      112.000\t      113.395\t       1.000")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (n, m)#\t      100.000\t      103.324\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE}#\t      102.700\t      101.722\t       1.000")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (t, p)#\t      112.000\t      113.395\t       1.000")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (n, m)#\t      100.000\t      103.324\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE}#\t      102.700\t      101.722\t       1.000")
 PICTURE (4.0, 1.0, draw_NPA_faithful_anpa)
 PICTURE (4.0, 1.0, draw_NPA_faithful_atma)
-NORMAL (L"We see that /at+ma/ always surfaces at [atma], because *R\\s{EPLACE} (t, p) is ranked much higher "
+NORMAL (U"We see that /at+ma/ always surfaces at [atma], because *R\\s{EPLACE} (t, p) is ranked much higher "
 	"than the other two, and that the output of /an+pa/ is variable because of the close rankings "
 	"of *G\\s{ESTURE} and *R\\s{EPLACE} (n, m).")
-NORMAL (L"If you try this with a Harmonic Grammar or in Linear OT, you will see the same kind of variation. "
+NORMAL (U"If you try this with a Harmonic Grammar or in Linear OT, you will see the same kind of variation. "
 	"Although in HG, e.g. in @@Smolensky & Legendre (2006)@, the variation is usually obtained at the candidate level, "
 	"namely by giving each candidate a probability proportional to exp(%harmony/%temperature), "
 	"in our version of HG the variation comes about at the constraint level, "
 	"namely by the noise that is temporarily added to the ranking of each constraint at evaluation time.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 2.7. Tableau pictures", L"ppgb", 20110129)
-NORMAL (L"To show a tableau in the @@Picture window@ instead of in the editor, "
+MAN_BEGIN (U"OT learning 2.7. Tableau pictures", U"ppgb", 20110129)
+NORMAL (U"To show a tableau in the @@Picture window@ instead of in the editor, "
 	"you select an @OTGrammar object and click ##Draw tableau...#. "
 	"After you specify the input form, a tableau is drawn with the current font and size "
 	"at the location of the current selection (%viewport) in the Picture window. The top left corner of the tableau "
 	"is aligned with the top left corner of the selection. You can draw more than one object into the Picture "
 	"window, whose menus also allow you to add a lot of graphics of your own design.")
-NORMAL (L"Besides printing the entire picture (with @@Print...@), you can save a part of it to an EPS file "
+NORMAL (U"Besides printing the entire picture (with @@Print...@), you can save a part of it to an EPS file "
 	"for inclusion into your favourite word processor (with @@Save as EPS file...@). "
 	"For the latter to succeed, make sure that the selection includes at least your tableau; "
 	"otherwise, some part of your tableau may end up truncated.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 2.8. Asking for one output", L"ppgb", 20110808)
-NORMAL (L"To ask the grammar to produce a single output for a specified input form, "
+MAN_BEGIN (U"OT learning 2.8. Asking for one output", U"ppgb", 20110808)
+NORMAL (U"To ask the grammar to produce a single output for a specified input form, "
 	"you can choose @@OTGrammar: Input to output... at . The command window will ask you to provide "
 	"an input form and the strength of the noise (the standard value is 2.0 again). "
 	"This will perform an evaluation and write the result into the Info window.")
-NORMAL (L"If you are viewing the grammar in the @OTGrammarEditor, you will see the disharmonies change, "
+NORMAL (U"If you are viewing the grammar in the @OTGrammarEditor, you will see the disharmonies change, "
 	"and if the grammar allows variation, you will see that the winner in the tableau in the editor "
 	"varies with the winner shown in the Info window.")
-NORMAL (L"Since the editor shows more information than the Info window, "
+NORMAL (U"Since the editor shows more information than the Info window, "
 	"this command is not very useful except for purposes of scripting. "
 	"See the following page for some related but more useful commands.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 2.9. Output distributions", L"ppgb", 20110808)
-NORMAL (L"To ask the grammar to produce %many outputs for a specified input form, "
+MAN_BEGIN (U"OT learning 2.9. Output distributions", U"ppgb", 20110808)
+NORMAL (U"To ask the grammar to produce %many outputs for a specified input form, "
 	"and collect them in a @Strings object, "
 	"you select an @OTGrammar and choose @@OTGrammar: Input to outputs...|Input to outputs... at .")
-NORMAL (L"For example, select the object \"OTGrammar assimilation\" from our place assimilation example "
+NORMAL (U"For example, select the object \"OTGrammar assimilation\" from our place assimilation example "
 	"(@@OT learning 2.6. Variable output|§2.6@), and click ##Input to outputs...#. "
 	"In the resulting command window, you specify 1000 trials, a noise strength of 2.0, and \"an+pa\" for the input form.")
-NORMAL (L"After you click OK, a @Strings object will appear in the list. "
+NORMAL (U"After you click OK, a @Strings object will appear in the list. "
 	"If you click Info, you will see that it contains 1000 strings. "
 	"If you click Inspect, you will see that most of the strings are \"ampa\", "
 	"but some of them are \"anpa\". These are the output forms computed from 1000 evaluations "
 	"for the input /an+pa/.")
-NORMAL (L"To count how many instances of [ampa] and [anpa] were generated, you select the @Strings object "
+NORMAL (U"To count how many instances of [ampa] and [anpa] were generated, you select the @Strings object "
 	"and click @@Strings: To Distributions|To Distributions at . You will see a new @Distributions object appear in the list. "
 	"If you draw this to the Picture window (with ##Draw as numbers...#), you will see something like:")
-LIST_ITEM (L"\tampa\t815")
-LIST_ITEM (L"\tanpa\t185")
-NORMAL (L"which means that our grammar, when fed with 1000 /an+pa/ inputs, produced [ampa] 815 times, "
+LIST_ITEM (U"\tampa\t815")
+LIST_ITEM (U"\tanpa\t185")
+NORMAL (U"which means that our grammar, when fed with 1000 /an+pa/ inputs, produced [ampa] 815 times, "
 	"and [anpa] 185 times, which is consistent with our initial guess that a ranking difference of 2.7 "
 	"would cause approximately an 80\\%  - 20\\%  distribution of [ampa] and [anpa].")
-ENTRY (L"Checking the distribution hypothesis")
-NORMAL (L"To see whether the guess of a 2.7 ranking difference is correct, we perform 1,000,000 trials instead of 1000. "
+ENTRY (U"Checking the distribution hypothesis")
+NORMAL (U"To see whether the guess of a 2.7 ranking difference is correct, we perform 1,000,000 trials instead of 1000. "
 	"The output distribution (if you have enough memory in your computer) becomes something like "
 	"(set the %Precision to 7 in the #Draw command window):")
-LIST_ITEM (L"\tampa\t830080")
-LIST_ITEM (L"\tanpa\t169920")
-NORMAL (L"The expected values under the 80\\%  - 20\\%  distribution hypothesis are:")
-LIST_ITEM (L"\tampa\t800000")
-LIST_ITEM (L"\tanpa\t200000")
-NORMAL (L"We compute (e.g. with @@Calculator...@) a %χ^2 of 30080^2/800000 + 30080^2/200000 = 5655.04, "
+LIST_ITEM (U"\tampa\t830080")
+LIST_ITEM (U"\tanpa\t169920")
+NORMAL (U"The expected values under the 80\\%  - 20\\%  distribution hypothesis are:")
+LIST_ITEM (U"\tampa\t800000")
+LIST_ITEM (U"\tanpa\t200000")
+NORMAL (U"We compute (e.g. with @@Calculator...@) a %χ^2 of 30080^2/800000 + 30080^2/200000 = 5655.04, "
 	"which, of course, is much too high for a distribution with a single degree of freedom. "
 	"So the ranking difference must be smaller. If it is 2.4 (change the ranking of *G\\s{ESTURE} to 102.4), "
 	"the numbers become something like")
-LIST_ITEM (L"\tampa\t801974")
-LIST_ITEM (L"\tanpa\t198026")
-NORMAL (L"which gives a %χ^2 of 24.35. By using the Calculator with the formula $$chiSquareQ (24.35, 1)$, "
+LIST_ITEM (U"\tampa\t801974")
+LIST_ITEM (U"\tanpa\t198026")
+NORMAL (U"which gives a %χ^2 of 24.35. By using the Calculator with the formula $$chiSquareQ (24.35, 1)$, "
 	"we find that values larger than this have a probability of 8·10^^-7^ "
 	"under the 80\\%  - 20\\%  distribution hypothesis, which must therefore be rejected again.")
-NORMAL (L"Rather than continuing this iterative procedure to find the correct ranking values for an "
+NORMAL (U"Rather than continuing this iterative procedure to find the correct ranking values for an "
 	"80\\%  - 20\\%  grammar, we will use the Gradual Learning Algorithm "
 	"(@@OT learning 5. Learning a stochastic grammar|§5@) to determine the rankings automatically, "
 	"without any memory of past events other than the memory associated with maintaining the ranking values.")
-ENTRY (L"Measuring all inputs")
-NORMAL (L"To measure the outcomes of all the possible inputs at once, you select an @OTGrammar "
+ENTRY (U"Measuring all inputs")
+NORMAL (U"To measure the outcomes of all the possible inputs at once, you select an @OTGrammar "
 	"and choose @@OTGrammar: To output Distributions...|To output Distributions... at . "
 	"As an example, try this on our place assimilation grammar. You can supply 1000000 for the number of trials, "
 	"and the usual 2.0 for the standard deviation of the noise. "
 	"After you click OK, a @Distributions object will appear in the list. "
 	"If you draw this to the Picture window, the result will look like:")
-LIST_ITEM (L"\t/an+pa/ \\-> anpa\t169855")
-LIST_ITEM (L"\t/an+pa/ \\-> ampa\t830145")
-LIST_ITEM (L"\t/at+ma/ \\-> atma\t999492")
-LIST_ITEM (L"\t/at+ma/ \\-> apma\t508")
-NORMAL (L"We see that the number of [apma] outputs is not zero. This is due to the difference of 9.3 "
+LIST_ITEM (U"\t/an+pa/ \\-> anpa\t169855")
+LIST_ITEM (U"\t/an+pa/ \\-> ampa\t830145")
+LIST_ITEM (U"\t/at+ma/ \\-> atma\t999492")
+LIST_ITEM (U"\t/at+ma/ \\-> apma\t508")
+NORMAL (U"We see that the number of [apma] outputs is not zero. This is due to the difference of 9.3 "
 	"between the rankings of *R\\s{EPLACE} (t, p) and *G\\s{ESTURE}. If you rank "
 	"*R\\s{EPLACE} (t, p) at 116.0, the number of produced [apma] reduces to about one in a million, "
 	"as you can easily check with some patience.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 3. Generating language data", L"ppgb", 20021204)
-NORMAL (L"A learner needs two things: a grammar that she can adjust (@@OT learning 2. The grammar|\\SS2@), and language data.")
-LIST_ITEM (L"3.1. @@OT learning 3.1. Data from a pair distribution|Data from a pair distribution@")
-LIST_ITEM (L"3.2. @@OT learning 3.2. Data from another grammar|Data from another grammar@ (tongue-root-harmony example)")
+MAN_BEGIN (U"OT learning 3. Generating language data", U"ppgb", 20021204)
+NORMAL (U"A learner needs two things: a grammar that she can adjust (@@OT learning 2. The grammar|\\SS2@), and language data.")
+LIST_ITEM (U"3.1. @@OT learning 3.1. Data from a pair distribution|Data from a pair distribution@")
+LIST_ITEM (U"3.2. @@OT learning 3.2. Data from another grammar|Data from another grammar@ (tongue-root-harmony example)")
 MAN_END
 
-MAN_BEGIN (L"OT learning 3.1. Data from a pair distribution", L"ppgb", 20110131)
-NORMAL (L"If the grammar contains faithfulness constraints, the learner needs pairs of "
+MAN_BEGIN (U"OT learning 3.1. Data from a pair distribution", U"ppgb", 20110131)
+NORMAL (U"If the grammar contains faithfulness constraints, the learner needs pairs of "
 	"underlying and adult surface forms. For our place assimilation example, she needs a lot of "
 	"/at+ma/ - [atma] pairs, and four times as many /an+pa/ - [ampa] pairs as /an+pa/ - [anpa] pairs. "
 	"We can specify this language-data distribution in a @PairDistribution object, "
 	"which we could simply save as a text file:")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"PairDistribution\"")
-CODE (L"4 pairs")
-CODE (L"\"at+ma\"  \"atma\"  100")
-CODE (L"\"at+ma\"  \"apma\"    0")
-CODE (L"\"an+pa\"  \"anpa\"   20")
-CODE (L"\"an+pa\"  \"ampa\"   80")
-NORMAL (L"The values appear to represent percentages, but they could also have been 1.0, 0.0, 0.2, and 0.8, "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"PairDistribution\"")
+CODE (U"4 pairs")
+CODE (U"\"at+ma\"  \"atma\"  100")
+CODE (U"\"at+ma\"  \"apma\"    0")
+CODE (U"\"an+pa\"  \"anpa\"   20")
+CODE (U"\"an+pa\"  \"ampa\"   80")
+NORMAL (U"The values appear to represent percentages, but they could also have been 1.0, 0.0, 0.2, and 0.8, "
 	"or any other values with the same proportions. We could also have left out the second pair "
 	"and specified \"3 pairs\" instead of \"4 pairs\" in the third line.")
-NORMAL (L"We can create this pair distribution with ##Create place assimilation distribution# from the "
+NORMAL (U"We can create this pair distribution with ##Create place assimilation distribution# from the "
 	"Optimality Theory submenu of the @@New menu@ in the Objects window. To see that it really contains "
 	"the above data, you can draw it to the Picture window. To change the values, use Inspect "
 	"(in which case you should remember to click Change after any change).")
-NORMAL (L"To generate input-output pairs from the above distribution, select the @PairDistribution and click "
+NORMAL (U"To generate input-output pairs from the above distribution, select the @PairDistribution and click "
 	"@@PairDistribution: To Stringses...|To Stringses... at . "
 	"If you then just click OK, there will appear two @Strings objects in the list, called \"input\" "
 	"(underlying forms) and \"output\" (surface forms). Both contain 1000 strings. If you Inspect them both, "
 	"you can see that e.g. the 377th string in \"input\" corresponds to the 377th string in \"output\", "
 	"i.e., the two series of strings are aligned. See also the example at @@PairDistribution: To Stringses... at .")
-NORMAL (L"These two Strings objects are sufficient to help an @OTGrammar grammar to change its constraint rankings "
+NORMAL (U"These two Strings objects are sufficient to help an @OTGrammar grammar to change its constraint rankings "
 	"in such a way that the output distributions generated by the grammar match the output distributions "
 	"in the language data. See @@OT learning 5. Learning a stochastic grammar|§5 at .")
 MAN_END
 
-MAN_BEGIN (L"OT learning 3.2. Data from another grammar", L"ppgb", 20110128)
-NORMAL (L"Instead of generating input-output pairs directly from a @PairDistribution object, "
+MAN_BEGIN (U"OT learning 3.2. Data from another grammar", U"ppgb", 20110128)
+NORMAL (U"Instead of generating input-output pairs directly from a @PairDistribution object, "
 	"you can also generate input forms and their winning outputs from an @OTGrammar grammar. Of course, "
 	"that's what the language data presented to real children comes from. Our example will be "
 	"a tongue-root harmony grammar.")
-NORMAL (L"Choose @@Create tongue-root grammar...@ from the Optimality Theory submenu of the @@New menu at . "
+NORMAL (U"Choose @@Create tongue-root grammar...@ from the Optimality Theory submenu of the @@New menu at . "
 	"Set %%Constraint set% to \"Five\", and %Ranking to \"Wolof\". Click OK. An object called "
 	"\"OTGrammar Wolof\" will appear in the list. Click ##View & Edit#. You will see the following grammar "
 	"appear in the @OTGrammarEditor:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*[rtr / hi]#\t      100.000\t      100.000\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (rtr)#\t      50.000\t      50.000\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE} (contour)#\t      30.000\t      30.000\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (atr)#\t      20.000\t      20.000\t       1.000")
-LIST_ITEM1 (L"\t##*[atr / lo]#\t      10.000\t      10.000\t       1.000")
-NORMAL (L"This simplified Wolof grammar, with five constraints with clearly different rankings, is equivalent "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*[rtr / hi]#\t      100.000\t      100.000\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (rtr)#\t      50.000\t      50.000\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE} (contour)#\t      30.000\t      30.000\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (atr)#\t      20.000\t      20.000\t       1.000")
+LIST_ITEM1 (U"\t##*[atr / lo]#\t      10.000\t      10.000\t       1.000")
+NORMAL (U"This simplified Wolof grammar, with five constraints with clearly different rankings, is equivalent "
 	"to the traditional OT ranking")
-FORMULA (L"*[rtr / hi] >> P\\s{ARSE} (rtr) >> *G\\s{ESTURE} (contour) >> P\\s{ARSE} (atr) >> *[atr / lo]")
-NORMAL (L"These constraints are based on a description of Wolof by "
+FORMULA (U"*[rtr / hi] >> P\\s{ARSE} (rtr) >> *G\\s{ESTURE} (contour) >> P\\s{ARSE} (atr) >> *[atr / lo]")
+NORMAL (U"These constraints are based on a description of Wolof by "
 	"@@Archangeli & Pulleyblank (1994)|Archangeli & Pulleyblank (1994: 225–239)@. "
 	"For the meaning of these constraints, see @@Boersma (1998)|Boersma (1998: 295)@, "
 	"or the @@Create tongue-root grammar...@ manual page.")
-NORMAL (L"For each input, there are four output candidates: "
+NORMAL (U"For each input, there are four output candidates: "
 	"the vowel heights will be the same as those in the input, but the tongue-root values of V__1_ and V__2_ are varied. "
 	"For example, for the input [ita] we will have the four candidates "
 	"[ita], [itə], [ɪta], and [ɪtə].")
-NORMAL (L"With this way of generating candidates, we see that the five constraints are completely ranked. "
+NORMAL (U"With this way of generating candidates, we see that the five constraints are completely ranked. "
 	"First, the absolute prohibition on surface [ɪ] shows that *[rtr / hi] outranks RTR faithfulness "
 	"(otherwise, [ɪtɪ] would have been the winner):")
 PICTURE (4.0, 1.5, draw_Wolof_ItI)
-NORMAL (L"Second, the faithful surfacing of the disharmonic /itɛ/ shows that RTR faithfulness must outrank "
+NORMAL (U"Second, the faithful surfacing of the disharmonic /itɛ/ shows that RTR faithfulness must outrank "
 	"the harmony (anti-contour) constraint (otherwise, [ite] would have been the winner):")
 PICTURE (4.0, 1.5, draw_Wolof_itE)
-NORMAL (L"Third, the RTR-dominant harmonicization of underlying disharmonic /etɛ/ shows that harmony must outrank ATR faithfulness "
+NORMAL (U"Third, the RTR-dominant harmonicization of underlying disharmonic /etɛ/ shows that harmony must outrank ATR faithfulness "
 	"(otherwise, [etɛ] would have won):")
 PICTURE (4.0, 1.5, draw_Wolof_etE)
-NORMAL (L"Finally, the faithful surfacing of the low ATR vowel /ə/ even if not forced by harmony, shows that "
+NORMAL (U"Finally, the faithful surfacing of the low ATR vowel /ə/ even if not forced by harmony, shows that "
 	"ATR faithfulness outranks *[atr / lo] (otherwise, [ata] would have been the winning candidate):")
 PICTURE (4.0, 1.5, draw_Wolof_schwatschwa)
-NORMAL (L"These four ranking arguments clearly establish the crucial rankings of all five constraints.")
-ENTRY (L"Generating inputs from the grammar")
-NORMAL (L"According to @@Prince & Smolensky (1993)@, the input to an OT grammar can be %anything. "
+NORMAL (U"These four ranking arguments clearly establish the crucial rankings of all five constraints.")
+ENTRY (U"Generating inputs from the grammar")
+NORMAL (U"According to @@Prince & Smolensky (1993)@, the input to an OT grammar can be %anything. "
 	"This is the idea of %%##richness of the base%#. "
 	"When doing a practical investigation, however, we are only interested in the inputs "
 	"that will illustrate the properties of our partial grammars. "
 	"In the case of simplified Wolof, this means the 36 possible V__1_tV__2_ sequences "
 	"where V__1_ and V__2_ are any of the six front vowels i, ɪ, e, ɛ, ə, and a "
 	"(see @@Create tongue-root grammar...@).")
-NORMAL (L"A set of inputs can be generated from an @OTGrammar object by inspecting the list of tableaus. "
+NORMAL (U"A set of inputs can be generated from an @OTGrammar object by inspecting the list of tableaus. "
 	"So select the Wolof tongue-root grammar and choose @@OTGrammar: Generate inputs...|Generate inputs... at . "
 	"Set %%Number of trials% to 100, and click OK. A @Strings object named \"Wolof_in\" "
 	"will appear in the list. Click Inspect and examine the 100 input strings. "
 	"You will see that they have been randomly chosen from the 36 possible V__1_tV__2_ sequences "
 	"as described at @@Create tongue-root grammar...@:")
-FORMULA (L"ɛta, etɛ, ɛti, itɛ, ɛtɛ, iti, ɛtɪ, itɪ, ɪti, etɛ, ...")
-NORMAL (L"Thus, when asked to generate a random input, these grammars produce any of the 36 possible V__1_tV__2_ "
+FORMULA (U"ɛta, etɛ, ɛti, itɛ, ɛtɛ, iti, ɛtɪ, itɪ, ɪti, etɛ, ...")
+NORMAL (U"Thus, when asked to generate a random input, these grammars produce any of the 36 possible V__1_tV__2_ "
 	"sequences, all with equal probability.")
-ENTRY (L"Generating outputs from the grammar")
-NORMAL (L"To compute the outputs for the above set of input forms, select %both the @OTGrammar object "
+ENTRY (U"Generating outputs from the grammar")
+NORMAL (U"To compute the outputs for the above set of input forms, select %both the @OTGrammar object "
 	"%and the input @Strings object, and choose @@OTGrammar & Strings: Inputs to outputs...|Inputs to outputs...@, "
 	"perhaps specifying zero evaluation noise. "
 	"A new Strings objects called \"Wolof_out\" will appear in the list. "
 	"If you Inspect it, you will see that it contains a string sequence aligned with the original input strings:")
-FORMULA (L"ɛta, ɛtɛ, ɛti, itɛ, ɛtɛ, iti, ɛti, iti, iti, ɛtɛ, ...")
-NORMAL (L"In this way, we have created two Strings objects, which together form a series of input-output pairs "
+FORMULA (U"ɛta, ɛtɛ, ɛti, itɛ, ɛtɛ, iti, ɛti, iti, iti, ɛtɛ, ...")
+NORMAL (U"In this way, we have created two Strings objects, which together form a series of input-output pairs "
 	"needed for learning a grammar that contains faithfulness constraints.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 4. Learning an ordinal grammar", L"ppgb", 20100331)
-NORMAL (L"With the data from a tongue-root-harmony language with five completely ranked constraints, "
+MAN_BEGIN (U"OT learning 4. Learning an ordinal grammar", U"ppgb", 20100331)
+NORMAL (U"With the data from a tongue-root-harmony language with five completely ranked constraints, "
 	"we can have a throw at learning this language, starting with a grammar in which all the constraints "
 	"are ranked at the same height, or randomly ranked, or with articulatory constraints outranking "
 	"faithfulness constraints.")
-NORMAL (L"Let's try the third of these. Create an infant tongue-root grammar by choosing "
+NORMAL (U"Let's try the third of these. Create an infant tongue-root grammar by choosing "
 	"@@Create tongue-root grammar...@ and specifying \"Five\" for the constraint set "
 	"and \"Infant\" for the ranking. The result after a single evaluation will be like:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE} (contour)#\t      100.000\t      100.631\t       1.000")
-LIST_ITEM1 (L"\t##*[atr / lo]#\t      100.000\t      100.244\t       1.000")
-LIST_ITEM1 (L"\t##*[rtr / hi]#\t      100.000\t      97.086\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (rtr)#\t      50.000\t      51.736\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (atr)#\t      50.000\t      46.959\t       1.000")
-NORMAL (L"Such a grammar produces all kinds of non-adult results. For instance, the input /ətɪ/ "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE} (contour)#\t      100.000\t      100.631\t       1.000")
+LIST_ITEM1 (U"\t##*[atr / lo]#\t      100.000\t      100.244\t       1.000")
+LIST_ITEM1 (U"\t##*[rtr / hi]#\t      100.000\t      97.086\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (rtr)#\t      50.000\t      51.736\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (atr)#\t      50.000\t      46.959\t       1.000")
+NORMAL (U"Such a grammar produces all kinds of non-adult results. For instance, the input /ətɪ/ "
 	"will surface as [atɪ]:")
 PICTURE (4.0, 1.5, draw_Infant_swtI)
-NORMAL (L"The adult form is very different: [əti]. The cause of the discrepancy is in the order of "
+NORMAL (U"The adult form is very different: [əti]. The cause of the discrepancy is in the order of "
 	"the constraints *[atr / lo] and *[rtr / hi], which militate against [ə] and [ɪ], respectively. "
 	"Simply reversing the rankings of these two constraints would solve the problem in this case. "
 	"More generally, @@Tesar & Smolensky (1998)@ claim that demoting all the constraints that cause the "
@@ -725,46 +725,46 @@ NORMAL (L"The adult form is very different: [əti]. The cause of the discrepancy
 	"will guarantee convergence to the target grammar, "
 	"%%if there is no variation in the data% (Tesar & Smolensky's algorithm is actually incorrect, "
 	"but can be repaired easily, as shown by @@Boersma (2009b)@).")
-NORMAL (L"But Tesar & Smolensky's algorithm cannot be used for variable data, since all constraints would be "
+NORMAL (U"But Tesar & Smolensky's algorithm cannot be used for variable data, since all constraints would be "
 	"tumbling down, exchanging places and producing wildly different grammars at each learning step. "
 	"Since language data do tend to be variable, we need a gradual and balanced learning algorithm, "
 	"and the following algorithm is guaranteed to converge "
 	"to the target language, if that language can be described by a stochastic OT grammar.")
-NORMAL (L"The reaction of the learner to hearing the mismatch between the adult [əti] and her own [atɪ], "
+NORMAL (U"The reaction of the learner to hearing the mismatch between the adult [əti] and her own [atɪ], "
 	"is simply:")
-LIST_ITEM (L"1. to move the constraints violated in her own form, i.e. *[rtr / hi] and P\\s{ARSE} (atr), "
+LIST_ITEM (U"1. to move the constraints violated in her own form, i.e. *[rtr / hi] and P\\s{ARSE} (atr), "
 	"up by a small step along the ranking scale, thus decreasing the probability that her form will be the winner "
 	"at the next evaluation of the same input;")
-LIST_ITEM (L"2. and to move the constraints violated in the adult form, namely *[atr / lo] and P\\s{ARSE} (rtr), "
+LIST_ITEM (U"2. and to move the constraints violated in the adult form, namely *[atr / lo] and P\\s{ARSE} (rtr), "
 	"down along the ranking scale, thus increasing the probability that the adult form will be the learner's "
 	"winner the next time.")
-NORMAL (L"If the small reranking step (the %#plasticity) is 0.1, the grammar will become:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE} (contour)#\t      100.000\t      100.631\t       1.000")
-LIST_ITEM1 (L"\t##*[atr / lo]#\t      99.900\t      100.244\t       1.000")
-LIST_ITEM1 (L"\t##*[rtr / hi]#\t      100.100\t      97.086\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (rtr)#\t      49.900\t      51.736\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (atr)#\t      50.100\t      46.959\t       1.000")
-NORMAL (L"The disharmonies, of course, will be different at the next evaluation, with a probability slightly higher "
+NORMAL (U"If the small reranking step (the %#plasticity) is 0.1, the grammar will become:")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE} (contour)#\t      100.000\t      100.631\t       1.000")
+LIST_ITEM1 (U"\t##*[atr / lo]#\t      99.900\t      100.244\t       1.000")
+LIST_ITEM1 (U"\t##*[rtr / hi]#\t      100.100\t      97.086\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (rtr)#\t      49.900\t      51.736\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (atr)#\t      50.100\t      46.959\t       1.000")
+NORMAL (U"The disharmonies, of course, will be different at the next evaluation, with a probability slightly higher "
 	"than 50\\%  that *[rtr / hi] will outrank *[atr / lo]. Thus the relative rankings of these two grounding "
 	"constraints have moved into the direction of the adult grammar, in which they are ranked at opposite "
 	"ends of the grammar.")
-NORMAL (L"Note that the relative rankings of P\\s{ARSE} (atr) and P\\s{ARSE} (rtr) are "
+NORMAL (U"Note that the relative rankings of P\\s{ARSE} (atr) and P\\s{ARSE} (rtr) are "
 	"now moving in a direction opposite to where they will have to end up in this RTR-dominant language. "
 	"This does not matter: the procedure will converge nevertheless.")
-NORMAL (L"We are now going to simulate the infant who learns simplified Wolof. Take an adult Wolof grammar "
+NORMAL (U"We are now going to simulate the infant who learns simplified Wolof. Take an adult Wolof grammar "
 	"and generate 1000 input strings and the corresponding 1000 output strings "
 	"following the procedure described in @@OT learning 3.2. Data from another grammar|§3.2 at . "
 	"Now select the infant @OTGrammar and both @Strings objects, and choose @@OTGrammar & 2 Strings: Learn...|Learn... at . "
 	"After you click OK, the learner processes each of the 1000 input-output pairs in succession, "
 	"gradually changing the constraint ranking in case of a mismatch. The resulting grammar may look like:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*[rtr / hi]#\t      100.800\t      98.644\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE} (contour)#\t      89.728\t      94.774\t       1.000")
-LIST_ITEM1 (L"\t##*[atr / lo]#\t      89.544\t      86.442\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (rtr)#\t      66.123\t      65.010\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (atr)#\t      63.553\t      64.622\t       1.000")
-NORMAL (L"We already see some features of the target grammar, namely the top ranking of *[rtr / hi] "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*[rtr / hi]#\t      100.800\t      98.644\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE} (contour)#\t      89.728\t      94.774\t       1.000")
+LIST_ITEM1 (U"\t##*[atr / lo]#\t      89.544\t      86.442\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (rtr)#\t      66.123\t      65.010\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (atr)#\t      63.553\t      64.622\t       1.000")
+NORMAL (U"We already see some features of the target grammar, namely the top ranking of *[rtr / hi] "
 	"and RTR dominance (the mutual ranking of the P\\s{ARSE} constraints). The steps have not been exactly 0.1, "
 	"because we also specified a relative plasticity spreading of 0.1, thus giving steps typically in the range of 0.7 to 1.3. "
 	"The step is also multiplied by the %%constraint plasticity%, which is simply 1.000 in all examples in this tutorial; "
@@ -772,49 +772,49 @@ NORMAL (L"We already see some features of the target grammar, namely the top ran
 	"The %leak is the part of the constraint weight (especially in Harmonic Grammar) that is thrown away whenever a constraint is reranked; "
 	"e.g if the leak is 0.01 and the step is 0.11, the constraint weight is multiplied by (1 – 0.01·0.11) = 0.9989 before "
 	"the learning step is taken; in this way you could implement forgetful learning of correlations.")
-NORMAL (L"After learning once more with the same data, the result is:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*[rtr / hi]#\t      100.800\t      104.320\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (rtr)#\t      81.429\t      82.684\t       1.000")
-LIST_ITEM1 (L"\t##*[atr / lo]#\t      79.966\t      78.764\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE} (contour)#\t      81.316\t      78.166\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (atr)#\t      77.991\t      77.875\t       1.000")
-NORMAL (L"This grammar now sometimes produces faithful disharmonic utterances, because the P\\s{ARSE} now often "
+NORMAL (U"After learning once more with the same data, the result is:")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*[rtr / hi]#\t      100.800\t      104.320\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (rtr)#\t      81.429\t      82.684\t       1.000")
+LIST_ITEM1 (U"\t##*[atr / lo]#\t      79.966\t      78.764\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE} (contour)#\t      81.316\t      78.166\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (atr)#\t      77.991\t      77.875\t       1.000")
+NORMAL (U"This grammar now sometimes produces faithful disharmonic utterances, because the P\\s{ARSE} now often "
 	"outrank the gestural constraints at evaluation time. But there is still a lot of variation produced. "
 	"Learning once more with the same data gives:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*[rtr / hi]#\t      100.800\t      100.835\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (rtr)#\t      86.392\t      82.937\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE} (contour)#\t      81.855\t      81.018\t       1.000")
-LIST_ITEM1 (L"\t##*[atr / lo]#\t      78.447\t      78.457\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (atr)#\t      79.409\t      76.853\t       1.000")
-NORMAL (L"By inspecting the first column, you can see that the ranking values are already in the same order as in the target grammar, "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*[rtr / hi]#\t      100.800\t      100.835\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (rtr)#\t      86.392\t      82.937\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE} (contour)#\t      81.855\t      81.018\t       1.000")
+LIST_ITEM1 (U"\t##*[atr / lo]#\t      78.447\t      78.457\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (atr)#\t      79.409\t      76.853\t       1.000")
+NORMAL (U"By inspecting the first column, you can see that the ranking values are already in the same order as in the target grammar, "
 	"so that the learner will produce 100 percent correct adult utterances if her evaluation noise is zero. However, "
 	"with a noise of 2.0, there will still be variation. For instance, the disharmonies above will "
 	"produce [ata] instead of [ətə] for underlying /ətə/. Learning seven times more "
 	"with the same data gives a reasonable proficiency:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*[rtr / hi]#\t      100.800\t      99.167\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (rtr)#\t      91.580\t      93.388\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE} (contour)#\t      85.487\t      86.925\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (atr)#\t      80.369\t      78.290\t       1.000")
-LIST_ITEM1 (L"\t##*[atr / lo]#\t      75.407\t      74.594\t       1.000")
-NORMAL (L"No input forms have error rates above 4 percent now, so the child has learned a lot with only 10,000 data, "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*[rtr / hi]#\t      100.800\t      99.167\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (rtr)#\t      91.580\t      93.388\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE} (contour)#\t      85.487\t      86.925\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (atr)#\t      80.369\t      78.290\t       1.000")
+LIST_ITEM1 (U"\t##*[atr / lo]#\t      75.407\t      74.594\t       1.000")
+NORMAL (U"No input forms have error rates above 4 percent now, so the child has learned a lot with only 10,000 data, "
 	"which may be on the order of the number of input data she receives every day.")
-NORMAL (L"We could have sped up the learning process appreciably by using a plasticity of 1.0 instead of 0.1. "
+NORMAL (U"We could have sped up the learning process appreciably by using a plasticity of 1.0 instead of 0.1. "
 	"This would have given a comparable grammar after only 1000 data. After 10,000 data, we would have")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*[rtr / hi]#\t      107.013\t      104.362\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (rtr)#\t      97.924\t      99.984\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE} (contour)#\t      89.679\t      89.473\t       1.000")
-LIST_ITEM1 (L"\t##P\\s{ARSE} (atr)#\t      81.479\t      83.510\t       1.000")
-LIST_ITEM1 (L"\t##*[atr / lo]#\t      73.067\t      72.633\t       1.000")
-NORMAL (L"With this grammar, all the error rates are below 0.2 percent. We see that crucially ranked constraints "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*[rtr / hi]#\t      107.013\t      104.362\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (rtr)#\t      97.924\t      99.984\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE} (contour)#\t      89.679\t      89.473\t       1.000")
+LIST_ITEM1 (U"\t##P\\s{ARSE} (atr)#\t      81.479\t      83.510\t       1.000")
+LIST_ITEM1 (U"\t##*[atr / lo]#\t      73.067\t      72.633\t       1.000")
+NORMAL (U"With this grammar, all the error rates are below 0.2 percent. We see that crucially ranked constraints "
 	"will become separated after a while by a gap of about 10 along the ranking scale.")
-NORMAL (L"If we have three constraints obligatorily ranked as A >> B >> C in the adult grammar, with ranking differences of 8 between "
+NORMAL (U"If we have three constraints obligatorily ranked as A >> B >> C in the adult grammar, with ranking differences of 8 between "
 	"A and B and between B and C in the learner's grammar (giving an error rate of 0.2\\% ), the ranking A >> C has a chance of less than 1 in 100 million "
 	"to be reversed at evaluation time. This relativity of error rates is an empirical prediction of our stochastic OT grammar model.")
-NORMAL (L"Our Harmonic Grammars with constraint noise (Noisy HG) are slightly different in that respect, "
+NORMAL (U"Our Harmonic Grammars with constraint noise (Noisy HG) are slightly different in that respect, "
 	"but are capable of learning a constraint ranking for any language that can be generated from an ordinal ranking. "
 	"As proved by @@Boersma & Pater (2008)@, the same learning rule as was devised for MaxEnt grammars by @@Jäger (2003)@ "
 	"is able to learn all languages generated by %nonnoisy HG grammars as well; "
@@ -834,114 +834,114 @@ NORMAL (L"Our Harmonic Grammars with constraint noise (Noisy HG) are slightly di
 	"for classifying continuous inputs.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 5. Learning a stochastic grammar", L"ppgb", 20070725)
-NORMAL (L"Having shown that the algorithm can learn deep obligatory rankings, we will now see "
+MAN_BEGIN (U"OT learning 5. Learning a stochastic grammar", U"ppgb", 20070725)
+NORMAL (U"Having shown that the algorithm can learn deep obligatory rankings, we will now see "
 	"that it also performs well in replicating the variation in the language environment.")
-NORMAL (L"Create a place assimilation grammar as described in @@OT learning 2.6. Variable output|§2.6@, "
+NORMAL (U"Create a place assimilation grammar as described in @@OT learning 2.6. Variable output|§2.6@, "
 	"and set all its rankings to 100.000:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE}#\t      100.000\t      100.000\t       1.000")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (t, p)#\t      100.000\t      100.000\t       1.000")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (n, m)#\t      100.000\t      100.000\t       1.000")
-NORMAL (L"Create a place assimilation distribution and generate 1000 string pairs (@@OT learning 3.1. Data from a pair distribution|§3.1@). "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE}#\t      100.000\t      100.000\t       1.000")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (t, p)#\t      100.000\t      100.000\t       1.000")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (n, m)#\t      100.000\t      100.000\t       1.000")
+NORMAL (U"Create a place assimilation distribution and generate 1000 string pairs (@@OT learning 3.1. Data from a pair distribution|§3.1@). "
 	"Select the grammar and the two @Strings objects, and learn with a plasticity of 0.1:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (t, p)#\t      104.540\t      103.140\t       1.000")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (n, m)#\t      96.214\t      99.321\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE}#\t      99.246\t      97.861")
-NORMAL (L"The output distributions are now (using @@OTGrammar: To output Distributions...@, see @@OT learning 2.9. Output distributions|§2.9@):")
-LIST_ITEM1 (L"\t/an+pa/ \\-> anpa\t14.3\\% ")
-LIST_ITEM1 (L"\t/an+pa/ \\-> ampa\t85.7\\% ")
-LIST_ITEM1 (L"\t/at+ma/ \\-> atma\t96.9\\% ")
-LIST_ITEM1 (L"\t/at+ma/ \\-> apma\t3.1\\% ")
-NORMAL (L"After another 10,000 new string pairs, we have:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (t, p)#\t      106.764\t      107.154\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE}#\t      97.899\t      97.161\t       1.000")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (n, m)#\t      95.337\t      96.848\t       1.000")
-NORMAL (L"With the following output distributions (measured with a million draws):")
-LIST_ITEM1 (L"\t/an+pa/ \\-> anpa\t18.31\\% ")
-LIST_ITEM1 (L"\t/an+pa/ \\-> ampa\t81.69\\% ")
-LIST_ITEM1 (L"\t/at+ma/ \\-> atma\t99.91\\% ")
-LIST_ITEM1 (L"\t/at+ma/ \\-> apma\t0.09\\% ")
-NORMAL (L"The error rate is acceptably low, but the accuracy in reproducing the 80\\%  - 20\\%  "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (t, p)#\t      104.540\t      103.140\t       1.000")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (n, m)#\t      96.214\t      99.321\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE}#\t      99.246\t      97.861")
+NORMAL (U"The output distributions are now (using @@OTGrammar: To output Distributions...@, see @@OT learning 2.9. Output distributions|§2.9@):")
+LIST_ITEM1 (U"\t/an+pa/ \\-> anpa\t14.3\\% ")
+LIST_ITEM1 (U"\t/an+pa/ \\-> ampa\t85.7\\% ")
+LIST_ITEM1 (U"\t/at+ma/ \\-> atma\t96.9\\% ")
+LIST_ITEM1 (U"\t/at+ma/ \\-> apma\t3.1\\% ")
+NORMAL (U"After another 10,000 new string pairs, we have:")
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (t, p)#\t      106.764\t      107.154\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE}#\t      97.899\t      97.161\t       1.000")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (n, m)#\t      95.337\t      96.848\t       1.000")
+NORMAL (U"With the following output distributions (measured with a million draws):")
+LIST_ITEM1 (U"\t/an+pa/ \\-> anpa\t18.31\\% ")
+LIST_ITEM1 (U"\t/an+pa/ \\-> ampa\t81.69\\% ")
+LIST_ITEM1 (U"\t/at+ma/ \\-> atma\t99.91\\% ")
+LIST_ITEM1 (U"\t/at+ma/ \\-> apma\t0.09\\% ")
+NORMAL (U"The error rate is acceptably low, but the accuracy in reproducing the 80\\%  - 20\\%  "
 	"distribution could be better. This is because the relatively high plasticity of 0.1 "
 	"can only give a coarse approximation. So we lower the plasticity to 0.001, "
 	"and supply 100,000 new data:")
-LIST_ITEM1 (L"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (t, p)#\t      106.810\t      107.184\t       1.000")
-LIST_ITEM1 (L"\t##*G\\s{ESTURE}#\t      97.782\t      99.682\t       1.000")
-LIST_ITEM1 (L"\t##*R\\s{EPLACE} (n, m)#\t      95.407\t      98.760\t       1.000")
-NORMAL (L"With the following output distributions:")
-LIST_ITEM1 (L"\t/an+pa/ \\-> anpa\t20.08\\% ")
-LIST_ITEM1 (L"\t/an+pa/ \\-> ampa\t79.92\\% ")
-LIST_ITEM1 (L"\t/at+ma/ \\-> atma\t99.94\\% ")
-LIST_ITEM1 (L"\t/at+ma/ \\-> apma\t0.06\\% ")
-NORMAL (L"So besides learning obligatory rankings like a child does, "
+LIST_ITEM1 (U"\t\t      %%ranking value\t      %disharmony\t      %plasticity")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (t, p)#\t      106.810\t      107.184\t       1.000")
+LIST_ITEM1 (U"\t##*G\\s{ESTURE}#\t      97.782\t      99.682\t       1.000")
+LIST_ITEM1 (U"\t##*R\\s{EPLACE} (n, m)#\t      95.407\t      98.760\t       1.000")
+NORMAL (U"With the following output distributions:")
+LIST_ITEM1 (U"\t/an+pa/ \\-> anpa\t20.08\\% ")
+LIST_ITEM1 (U"\t/an+pa/ \\-> ampa\t79.92\\% ")
+LIST_ITEM1 (U"\t/at+ma/ \\-> atma\t99.94\\% ")
+LIST_ITEM1 (U"\t/at+ma/ \\-> apma\t0.06\\% ")
+NORMAL (U"So besides learning obligatory rankings like a child does, "
 	"the algorithm can also replicate very well the probabilities of the environment. "
 	"This means that a GLA learner can learn stochastic grammars.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 6. Shortcut to grammar learning", L"ppgb", 20070523)
-INTRO (L"Once you have mastered the tedious procedures of making Praat learn stochastic grammars, "
+MAN_BEGIN (U"OT learning 6. Shortcut to grammar learning", U"ppgb", 20070523)
+INTRO (U"Once you have mastered the tedious procedures of making Praat learn stochastic grammars, "
 	"as described in the previous chapters of this tutorial, you can try a faster procedure, "
 	"which simply involves selecting an @OTGrammar object together with a @PairDistribution object, "
 	"and clicking ##Learn...#. Once you click OK, Praat will feed the selected grammar with input/output "
 	"pairs drawn from the selected distribution, and the grammar will be modified every time its output "
 	"is different from the given output. Here is the meaning of the arguments:")
-TAG (L"%%Evaluation noise% (standard value: 2.0)")
-DEFINITION (L"the standard deviation of the noise added to the ranking of each constraint at evaluation time.")
-TAG (L"%%Strategy% (standard value: Symmetric all)")
-DEFINITION (L"what to do when the learner's output is different from the given output. Possibilities:")
-LIST_ITEM1 (L"Demotion only: lower the ranking of every constraint that is violated more in the correct output "
+TAG (U"%%Evaluation noise% (standard value: 2.0)")
+DEFINITION (U"the standard deviation of the noise added to the ranking of each constraint at evaluation time.")
+TAG (U"%%Strategy% (standard value: Symmetric all)")
+DEFINITION (U"what to do when the learner's output is different from the given output. Possibilities:")
+LIST_ITEM1 (U"Demotion only: lower the ranking of every constraint that is violated more in the correct output "
 	"than in the learner's output. This algorithm crashes if there is variation in the data, i.e. if some inputs "
 	"can have more than one possible adult outputs.")
-LIST_ITEM1 (L"Symmetric one: lower the ranking of the highest-ranked constraint that is violated more in the adult output "
+LIST_ITEM1 (U"Symmetric one: lower the ranking of the highest-ranked constraint that is violated more in the adult output "
 	"than in the learner's output, and raise the ranking of the highest-ranked constraint that is violated more "
 	"in the learner's output than in the adult output. This is the \"minimal\" algorithm described and refuted in "
 	"@@Boersma (1998)@, chapters 14-15.")
-LIST_ITEM1 (L"Symmetric all: lower the ranking of all constraints that are violated more in the adult output "
+LIST_ITEM1 (U"Symmetric all: lower the ranking of all constraints that are violated more in the adult output "
 	"than in the learner's output, and raise the ranking of all constraints that are violated more "
 	"in the learner's output than in the adult output. This is the algorithm described in @@Boersma & Hayes (2001)@.")
-LIST_ITEM1 (L"Weighted uncancelled: the same as \"Symmetric all\", but the size of the learning step "
+LIST_ITEM1 (U"Weighted uncancelled: the same as \"Symmetric all\", but the size of the learning step "
 	"is divided by the number of moving constraints. This makes sure that the average ranking of all the constraints "
 	"is constant.")
-LIST_ITEM1 (L"Weighted all: the \"Symmetric all\" strategy can reworded as follows: \"lower the ranking of all constraints "
+LIST_ITEM1 (U"Weighted all: the \"Symmetric all\" strategy can reworded as follows: \"lower the ranking of all constraints "
 	"that are violated in the adult output, and raise the ranking of all constraints that are violated in the learner's output\". "
 	"Do that, but divide the size of the learning step by the number of moving constraints.")
-LIST_ITEM1 (L"EDCD: Error-Driven Constraint Demotion, the algorithm described by @@Tesar & Smolensky (1998)@. "
+LIST_ITEM1 (U"EDCD: Error-Driven Constraint Demotion, the algorithm described by @@Tesar & Smolensky (1998)@. "
 	"All constraints that prefer the adult form and are ranked above the highest-ranked constraint that prefers the learner's form, "
 	"are demoted to the ranking of that last constraint minus 1.0.")
-TAG (L"%%Initial plasticity% (standard value: 1.0)")
-TAG (L"%%Replications per plasticity% (standard value: 100000)")
-TAG (L"%%Plasticity decrement% (standard value: 0.1)")
-TAG (L"%%Number of plasticities% (standard value: 4)")
-DEFINITION (L"these four arguments determine the %%learning scheme%, i.e. the number of times the grammar will "
+TAG (U"%%Initial plasticity% (standard value: 1.0)")
+TAG (U"%%Replications per plasticity% (standard value: 100000)")
+TAG (U"%%Plasticity decrement% (standard value: 0.1)")
+TAG (U"%%Number of plasticities% (standard value: 4)")
+DEFINITION (U"these four arguments determine the %%learning scheme%, i.e. the number of times the grammar will "
 	"receive data at a certain plasticity. With the standard values, there will be 100000 data while the plasticity is 1.0 "
 	"(the initial plasticity), 100000 data while the plasticity is 0.1, 100000 data while the plasticity is 0.01, "
 	"and 100000 data while the plasticity is 0.001. If you want learning at a constant plasticity, set the "
 	"%%number of plasticities% to 1. Note that for the decision strategies of HarmonicGrammar, LinearOT, PositiveHG or MaximumEntropy "
 	"the learning step for a constraint equals the plasticity multiplied by the difference between the "
 	"numbers of violations of this constraint in the adult output and in the learner's output.")
-TAG (L"%%Rel. plasticity spreading% (standard value: 0.1)")
-DEFINITION (L"if this is not 0, the size of the learning step will vary randomly. For instance, if the plasticity is set to 0.01, "
+TAG (U"%%Rel. plasticity spreading% (standard value: 0.1)")
+DEFINITION (U"if this is not 0, the size of the learning step will vary randomly. For instance, if the plasticity is set to 0.01, "
 	"and the relative plasticity spreading is 0.1, you will get actual learning steps that could be anywhere between 0.007 "
 	"and 0.013, according to a Gaussian distribution with mean 0.01 and standard deviation 0.001.")
-TAG (L"%%Honour local rankings% (standard value: on)")
-DEFINITION (L"if this is on, the fixed rankings that you supplied in the grammar will be maintained during learning: "
+TAG (U"%%Honour local rankings% (standard value: on)")
+DEFINITION (U"if this is on, the fixed rankings that you supplied in the grammar will be maintained during learning: "
 	"if a constraint falls below a constraint that is supposed to be universally lower-ranked, this second constraint "
 	"will be demoted as well.")
-TAG (L"%%Number of chews% (standard value: 1)")
-DEFINITION (L"the number of times that each input-output pair is fed to the grammar. Setting this number to 20 "
+TAG (U"%%Number of chews% (standard value: 1)")
+DEFINITION (U"the number of times that each input-output pair is fed to the grammar. Setting this number to 20 "
 	"will give a slightly different (perhaps more accurate) result than simply raising the plasticity by a factor of 20.")
 MAN_END
 
-MAN_BEGIN (L"OT learning 7. Learning from overt forms", L"ppgb", 20031220)
-INTRO (L"In order to be able to learn phonological production, both EDCD and GLA require pairs of underlying form "
+MAN_BEGIN (U"OT learning 7. Learning from overt forms", U"ppgb", 20031220)
+INTRO (U"In order to be able to learn phonological production, both EDCD and GLA require pairs of underlying form "
 	"and surface form. However, the language-learning child hears neither of these forms: she only hears ##%%overt forms%#, "
 	"with less structural information than the underlying and surface forms contain.")
-ENTRY (L"Interpretive parsing")
-NORMAL (L"The language-learning child has to construct both the surface form and the underlying form from the overt form "
+ENTRY (U"Interpretive parsing")
+NORMAL (U"The language-learning child has to construct both the surface form and the underlying form from the overt form "
 	"that she hears. @@Tesar & Smolensky (1998)@ proposed that the child computes a surface form from the "
 	"overt form by using the same constraint ranking as in production. For instance, the overt form [σ σ σ], which "
 	"is a sequence of three syllables with stress on the second syllable, will be interpreted as the surface form "
@@ -953,7 +953,7 @@ NORMAL (L"The language-learning child has to construct both the surface form and
 	"for any trisyllabic underlying form, though she will still interpret [σ σˈ σ] as /(σ σˈ) σ/, "
 	"which is illegal in her own grammar. Hearing forms that are illegal in one's own grammar is of course a common "
 	"situation for language-learning children.")
-NORMAL (L"In Tesar & Smolensky's view, the underlying form can be trivially computed from the surface form, "
+NORMAL (U"In Tesar & Smolensky's view, the underlying form can be trivially computed from the surface form, "
 	"since the surface form %contains enough information. For instance, the surface form /(σ σˈ) σ/ must "
 	"lead to the underlying form |σ σ σ| if all parentheses and stress marks are removed. Since "
 	"@@McCarthy & Prince (1995)@, this %containment view of surface representations has been abandoned. "
@@ -968,60 +968,60 @@ NORMAL (L"In Tesar & Smolensky's view, the underlying form can be trivially comp
 	"|σ σ σ| (the ‘winning tableau’) and to the surface form /(σ σˈ) σ/ (to be sure, "
 	"this is the same result as in Tesar & Smolensky's "
 	"version, but crucial differences between the two versions will appear when faithfulness constraints are involved).")
-NORMAL (L"In Praat, you can do interpretive parsing. For example, create a grammar with ##Create metrics grammar...# "
+NORMAL (U"In Praat, you can do interpretive parsing. For example, create a grammar with ##Create metrics grammar...# "
 	"from the @@New menu at . Then choose ##Get interpretive parse...# from the #Query submenu and supply \"[L1 L L]\" for the "
 	"overt form, which means a sequence of three light syllables with a main stress on the first. The Info window will show you "
 	"the optimal underlying and surface forms, given the current constraint ranking.")
-ENTRY (L"Learning from partial forms")
-NORMAL (L"Now that the learning child can convert an overt form to an underlying-surface pair, she can compare this "
+ENTRY (U"Learning from partial forms")
+NORMAL (U"Now that the learning child can convert an overt form to an underlying-surface pair, she can compare this "
 	"surface form to the surface form that she herself would have derived from this underlying form. For instance, "
 	"If I\\s{AMBIC} >> A\\s{LL}F\\s{EET}R\\s{IGHT} >> T\\s{ROCHAIC} >> A\\s{LL}F\\s{EET}L\\s{EFT}, the winning "
 	"tableau is |σ σ σ|, and the perceived adult surface form is /(σ σˈ) σ/. "
 	"But from the underlying form |σ σ σ|, the learner will derive /σ (σ σˈ)/ as her own surface form. "
 	"The two surface forms are different, so that the learner can take action by reranking one or more constraints, "
 	"perhaps with EDCD or GLA.")
-NORMAL (L"In Praat, you can learn from partial forms. Select the metrics grammar and choose ##Learn from one partial output...#, "
+NORMAL (U"In Praat, you can learn from partial forms. Select the metrics grammar and choose ##Learn from one partial output...#, "
 	"and supply \"[L1 L L]\". If you do this several times, you will see that the winner for the tableau \"|L L L|\" will become one of "
 	"the two forms with overt part \"[L1 L L]\".")
-NORMAL (L"To run a whole simulation, you supply a @Distributions object with one column, perhaps from a text file. The following "
+NORMAL (U"To run a whole simulation, you supply a @Distributions object with one column, perhaps from a text file. The following "
 	"text file shows the overt forms for Latin, with the bisyllabic forms occurring more often than the trisyllabic forms:")
-CODE (L"\"ooTextFile\"")
-CODE (L"\"Distributions\"")
-CODE (L"1 column with numeric data")
-CODE (L"   \"Latin\"")
-CODE (L"28 rows")
-CODE (L"\"[L1 L]\" 25")
-CODE (L"\"[L1 H]\" 25")
-CODE (L"\"[H1 L]\" 25")
-CODE (L"\"[H1 H]\" 25")
-CODE (L"\"[L1 L L]\" 5")
-CODE (L"\"[H1 L L]\" 5")
-CODE (L"\"[L H1 L]\" 5")
-CODE (L"\"[H H1 L]\" 5")
-CODE (L"\"[L1 L H]\" 5")
-CODE (L"\"[H1 L H]\" 5")
-CODE (L"\"[L H1 H]\" 5")
-CODE (L"\"[H H1 H]\" 5")
-CODE (L"\"[L L1 L L]\" 1")
-CODE (L"\"[L H1 L L]\" 1")
-CODE (L"\"[L L H1 L]\" 1")
-CODE (L"\"[L H H1 L]\" 1")
-CODE (L"\"[L L1 L H]\" 1")
-CODE (L"\"[L H1 L H]\" 1")
-CODE (L"\"[L L H1 H]\" 1")
-CODE (L"\"[L H H1 H]\" 1")
-CODE (L"\"[H L1 L L]\" 1")
-CODE (L"\"[H H1 L L]\" 1")
-CODE (L"\"[H L H1 L]\" 1")
-CODE (L"\"[H H H1 L]\" 1")
-CODE (L"\"[H L1 L H]\" 1")
-CODE (L"\"[H H1 L H]\" 1")
-CODE (L"\"[H L H1 H]\" 1")
-CODE (L"\"[H H H1 H]\" 1")
-NORMAL (L"Read this file into Praat with @@Read from file... at . A @Distributions object then appears in the object list. "
+CODE (U"\"ooTextFile\"")
+CODE (U"\"Distributions\"")
+CODE (U"1 column with numeric data")
+CODE (U"   \"Latin\"")
+CODE (U"28 rows")
+CODE (U"\"[L1 L]\" 25")
+CODE (U"\"[L1 H]\" 25")
+CODE (U"\"[H1 L]\" 25")
+CODE (U"\"[H1 H]\" 25")
+CODE (U"\"[L1 L L]\" 5")
+CODE (U"\"[H1 L L]\" 5")
+CODE (U"\"[L H1 L]\" 5")
+CODE (U"\"[H H1 L]\" 5")
+CODE (U"\"[L1 L H]\" 5")
+CODE (U"\"[H1 L H]\" 5")
+CODE (U"\"[L H1 H]\" 5")
+CODE (U"\"[H H1 H]\" 5")
+CODE (U"\"[L L1 L L]\" 1")
+CODE (U"\"[L H1 L L]\" 1")
+CODE (U"\"[L L H1 L]\" 1")
+CODE (U"\"[L H H1 L]\" 1")
+CODE (U"\"[L L1 L H]\" 1")
+CODE (U"\"[L H1 L H]\" 1")
+CODE (U"\"[L L H1 H]\" 1")
+CODE (U"\"[L H H1 H]\" 1")
+CODE (U"\"[H L1 L L]\" 1")
+CODE (U"\"[H H1 L L]\" 1")
+CODE (U"\"[H L H1 L]\" 1")
+CODE (U"\"[H H H1 L]\" 1")
+CODE (U"\"[H L1 L H]\" 1")
+CODE (U"\"[H H1 L H]\" 1")
+CODE (U"\"[H L H1 H]\" 1")
+CODE (U"\"[H H H1 H]\" 1")
+NORMAL (U"Read this file into Praat with @@Read from file... at . A @Distributions object then appears in the object list. "
 	"Click @@Distributions: To Strings...|To Strings...@, then OK. A @Strings object containing 1000 strings, drawn randomly "
 	"from the distribution, with relative frequencies as in the text file, will appear in the list. Click @Inspect to check the contents.")
-NORMAL (L"You can now select the @OTGrammar together with the @Strings and choose ##Learn from partial outputs...#. "
+NORMAL (U"You can now select the @OTGrammar together with the @Strings and choose ##Learn from partial outputs...#. "
 	"A thousand times, Praat will construct a surface form from the overt form by interpretive parsing, "
 	"and also construct the underlying form in the same way, from which it will construct another surface form by evaluating the "
 	"tableau. Whenever the two surface forms are not identical, some constraints will be reranked. In the current implementation, "
@@ -1031,17 +1031,17 @@ NORMAL (L"You can now select the @OTGrammar together with the @Strings and choos
 MAN_END
 
 /*
-MAN_BEGIN (L"OTGrammar examples", L"ppgb", 20001027)
-ENTRY (L"Safety margin and stochastic evaluation")
-NORMAL (L"What is a %small demotion step? This must be taken relative to another quantity. "
+MAN_BEGIN (U"OTGrammar examples", U"ppgb", 20001027)
+ENTRY (U"Safety margin and stochastic evaluation")
+NORMAL (U"What is a %small demotion step? This must be taken relative to another quantity. "
 	"This quantity is the evaluation noise.")
-NORMAL (L"If the %%ranking spreading% were zero, the demotions in the GLA would immediately stop once that "
+NORMAL (U"If the %%ranking spreading% were zero, the demotions in the GLA would immediately stop once that "
 	"a constraint has fallen below its competitors. If the data contain an error, the grammar "
 	"will change to an incorrect state, and the learner has to make an error to correct it. "
 	"Though the error ratio is now one (because of the constant demotion step), "
 	"the learner's behaviour can still be described as a `tit-for-tat' strategy, "
 	"which is an unknown phenomenon in human speech variation.")
-NORMAL (L"The solution is to have a finite ranking spreading: in this way, the learner will continue making "
+NORMAL (U"The solution is to have a finite ranking spreading: in this way, the learner will continue making "
 	"errors (though less than 50\\% ) after the constraint has fallen below its competitors. "
 	"For instance, with a ranking spreading of 2.0, the distance between the constraints will be about "
 	"10 after a few thousand relevant data: the %%safety margin%. "
@@ -1051,68 +1051,68 @@ NORMAL (L"The solution is to have a finite ranking spreading: in this way, the l
 	"make one mistake herself to restore the original distance. But this is only natural, "
 	"as she may well wait a long time before doing this: "
 	"on the average, the same number of thousands of data. This is the %%patient error-matching learner%.")
-ENTRY (L"Learning from surface data alone")
-NORMAL (L"Many a young learner will take the adult surface forms, as perceived by herself, "
+ENTRY (U"Learning from surface data alone")
+NORMAL (U"Many a young learner will take the adult surface forms, as perceived by herself, "
 	"as her underlying forms. In other words, the input to her grammar will equal "
 	"the output of the adult grammar.")
-NORMAL (L"We can simulate what happens here by taking the adult output as the input to the learning algorithms:")
-LIST_ITEM (L"1. Create a five-constraint Wolof grammar.")
-LIST_ITEM (L"2. Generate 1000 input strings.")
-LIST_ITEM (L"3. Compute the 1000 output strings.")
-LIST_ITEM (L"4. Create a five-constraint \"equal\" grammar.")
-LIST_ITEM (L"5. Select this monostratal grammar and the output strings only, "
+NORMAL (U"We can simulate what happens here by taking the adult output as the input to the learning algorithms:")
+LIST_ITEM (U"1. Create a five-constraint Wolof grammar.")
+LIST_ITEM (U"2. Generate 1000 input strings.")
+LIST_ITEM (U"3. Compute the 1000 output strings.")
+LIST_ITEM (U"4. Create a five-constraint \"equal\" grammar.")
+LIST_ITEM (U"5. Select this monostratal grammar and the output strings only, "
 	"and click ##Learn output (T&S)#. See @@OTAnyGrammar & Strings: Learn output (T&S)@.")
-NORMAL (L"The result will be a grammar where the faithfulness constraints outrank all the "
+NORMAL (U"The result will be a grammar where the faithfulness constraints outrank all the "
 	"gestural constraints that can be violated in any output string:")
-LIST_ITEM (L"##*[rtr / hi]#  100.000  100.000")
-LIST_ITEM (L"##P\\s{ARSE} (atr)#  100.000  100.000")
-LIST_ITEM (L"##P\\s{ARSE} (rtr)#  100.000  100.000")
-LIST_ITEM (L"##*G\\s{ESTURE} (contour)#  99.000  99.000")
-LIST_ITEM (L"##*[atr / lo]#  99.000  99.000")
-NORMAL (L"You will get a comparable result with @@OTAnyGrammar & Strings: Learn output (GLA)... at .")
-NORMAL (L"The resulting grammar represents the learner's state after the acquisition of "
+LIST_ITEM (U"##*[rtr / hi]#  100.000  100.000")
+LIST_ITEM (U"##P\\s{ARSE} (atr)#  100.000  100.000")
+LIST_ITEM (U"##P\\s{ARSE} (rtr)#  100.000  100.000")
+LIST_ITEM (U"##*G\\s{ESTURE} (contour)#  99.000  99.000")
+LIST_ITEM (U"##*[atr / lo]#  99.000  99.000")
+NORMAL (U"You will get a comparable result with @@OTAnyGrammar & Strings: Learn output (GLA)... at .")
+NORMAL (U"The resulting grammar represents the learner's state after the acquisition of "
 	"all the relevant gestures. The learner will now faithfully reproduce /etɛ/ "
 	"if that were in her lexicon. Before being able to render such an underlying form as [ɛtɛ], "
 	"she must learn that faithfulness can be violated.")
-ENTRY (L"Example 2: When underlying forms are irrelevant")
-NORMAL (L"Underlying forms are relevant only if faithfulness constraints are involved. "
+ENTRY (U"Example 2: When underlying forms are irrelevant")
+NORMAL (U"Underlying forms are relevant only if faithfulness constraints are involved. "
 	"If a grammar only contains constraints that evaluate the output, "
 	"we need no input strings for our simulations. However, "
 	"if the relevant constraint had fixed rankings, there would only be a single possible output, "
 	"which seems uninteresting. An interesting output-only grammar, therefore, necessarily "
 	"features stochastic evaluation, and at least some of the constraints wil have rankings that "
 	"are close to each other.")
-NORMAL (L"#%Example. @@Hayes & MacEachern (1998)@ identify 11 output-oriented constraints "
+NORMAL (U"#%Example. @@Hayes & MacEachern (1998)@ identify 11 output-oriented constraints "
 	"for the forms of quatrains in English folk verse.")
-LIST_ITEM (L"1. Create a folk-verse grammar with equal constraint rankings (all 100). "
+LIST_ITEM (U"1. Create a folk-verse grammar with equal constraint rankings (all 100). "
 	"You may find it in the file ##folkVerse.OTGrammar# in the #demo directory of your #Praat distribution, "
 	"or get it from ##http://www.fon.hum.uva.nl/praat/folkVerse.OTGrammar#.")
-LIST_ITEM (L"2. Generate 1000 input strings. They will all be empty strings.")
-LIST_ITEM (L"3. Read the file that contains the surface distribution of the possible outputs. "
+LIST_ITEM (U"2. Generate 1000 input strings. They will all be empty strings.")
+LIST_ITEM (U"3. Read the file that contains the surface distribution of the possible outputs. "
 	"It is in the #demo folder or at ##http://www.fon.hum.uva.nl/praat/folkVerse.Distributions#. "
 	"A @Distributions object will appear in the list. "
 	"Column \"Actual\" is the last column of table (10) in Hayes & MacEachern (1998).")
-LIST_ITEM (L"4. From this surface distribution, create a list of 1000 output strings, "
+LIST_ITEM (U"4. From this surface distribution, create a list of 1000 output strings, "
 	"using @@Distributions: To Strings...@ (set %column to 1).")
-LIST_ITEM (L"5. Select the grammar, the \"input strings\", and the output strings, "
+LIST_ITEM (U"5. Select the grammar, the \"input strings\", and the output strings, "
 	"and learn in the usual way. After learning, you can see that some constraints have risen above 100, "
 	"and some have fallen below 100.")
-NORMAL (L"With each of the 1000 outputs, the learner can be regarded as having generated a quatrain herself "
+NORMAL (U"With each of the 1000 outputs, the learner can be regarded as having generated a quatrain herself "
 	"and compared it to a quatrain in her folk-verse environment. If these quatrains are equal "
 	"(a 10\\%  chance or so), nothing happens. Otherwise, the learner will demote the highest "
 	"violated constraint (i.e., the one that is most disharmonic during her stochastic evaluation) "
 	"in the heard quatrain that is not (or less) violated in the winner (the quatrain that she generated herself). "
 	"She will also promote the highest violated constraint in the winner "
 	"that is not (or less) violated in the heard quatrain.")
-NORMAL (L"We are next going to generate a set of 589 quatrains, in order to be able to compare "
+NORMAL (U"We are next going to generate a set of 589 quatrains, in order to be able to compare "
 	"the behaviours of our folk-verse grammar and the English folk-verse writers:")
-LIST_ITEM (L"1. Select the learned grammar and generate 589 (empty) input strings.")
-LIST_ITEM (L"2. Select the learned grammar and the so-called input strings, "
+LIST_ITEM (U"1. Select the learned grammar and generate 589 (empty) input strings.")
+LIST_ITEM (U"2. Select the learned grammar and the so-called input strings, "
 	"and generate the output strings.")
-LIST_ITEM (L"3. To see the distribution of the output strings, choose @@Strings: To Distributions@, "
+LIST_ITEM (U"3. To see the distribution of the output strings, choose @@Strings: To Distributions@, "
 	"and draw the resulting @Distributions object to your Picture window.")
-LIST_ITEM (L"4. You can now compare the two distributions.")
-NORMAL (L"Instead of generating the data from a @Distributions, you could have generated them from "
+LIST_ITEM (U"4. You can now compare the two distributions.")
+NORMAL (U"Instead of generating the data from a @Distributions, you could have generated them from "
 	"the target grammar in table (9) of Hayes & MacEachern (1998). "
 	"Such a grammar is in your #demo folder (##folkVerse59.OTGrammar#) "
 	"or at ##http://www.fon.hum.uva.nl/praat/folkVerse59.OTGrammar#. "
@@ -1123,155 +1123,155 @@ NORMAL (L"Instead of generating the data from a @Distributions, you could have g
 MAN_END
 */
 
-MAN_BEGIN (L"OTGrammar", L"ppgb", 20141001)
-INTRO (L"One of the @@types of objects@ in Praat. See the @@OT learning@ tutorial.")
-ENTRY (L"Inside an OTGrammar")
-NORMAL (L"With @Inspect, you will see the following attributes:")
-TAG (L"%constraints")
-DEFINITION (L"a list of constraints. Each constraint contains the following attributes:")
-TAG1 (L"%name")
-DEFINITION1 (L"the fixed name of the constraint, for instance \"P\\s{ARSE}\".")
-TAG1 (L"%ranking")
-DEFINITION1 (L"the continuous ranking value; will change during learning.")
-TAG1 (L"%disharmony")
-DEFINITION1 (L"the effective ranking value during stochastic evaluation; with a non-zero evaluation noise, "
+MAN_BEGIN (U"OTGrammar", U"ppgb", 20141001)
+INTRO (U"One of the @@types of objects@ in Praat. See the @@OT learning@ tutorial.")
+ENTRY (U"Inside an OTGrammar")
+NORMAL (U"With @Inspect, you will see the following attributes:")
+TAG (U"%constraints")
+DEFINITION (U"a list of constraints. Each constraint contains the following attributes:")
+TAG1 (U"%name")
+DEFINITION1 (U"the fixed name of the constraint, for instance \"P\\s{ARSE}\".")
+TAG1 (U"%ranking")
+DEFINITION1 (U"the continuous ranking value; will change during learning.")
+TAG1 (U"%disharmony")
+DEFINITION1 (U"the effective ranking value during stochastic evaluation; with a non-zero evaluation noise, "
 	"this will be different from %ranking.")
-TAG (L"%fixedRankings")
-DEFINITION (L"an often empty list of locally ranked pairs of constraints. "
+TAG (U"%fixedRankings")
+DEFINITION (U"an often empty list of locally ranked pairs of constraints. "
 	"Each local-ranking pair contains the following attributes:")
-TAG1 (L"%higher")
-DEFINITION1 (L"the index of the universally higher-ranked of the two constraints, "
+TAG1 (U"%higher")
+DEFINITION1 (U"the index of the universally higher-ranked of the two constraints, "
 	"a number between 1 and the number of constraints.")
-TAG1 (L"%lower")
-DEFINITION1 (L"the index of the universally lower-ranked of the two constraints.")
-TAG (L"%tableaus")
-DEFINITION (L"a list of tableaus. Each tableau contains the following attributes:")
-TAG1 (L"%input")
-DEFINITION1 (L"the input string of the tableau. For production grammaras, the underlying form of the utterance, for example "
+TAG1 (U"%lower")
+DEFINITION1 (U"the index of the universally lower-ranked of the two constraints.")
+TAG (U"%tableaus")
+DEFINITION (U"a list of tableaus. Each tableau contains the following attributes:")
+TAG1 (U"%input")
+DEFINITION1 (U"the input string of the tableau. For production grammaras, the underlying form of the utterance, for example "
 	"|an+pa| or |bɹɪŋ + \\s{PAST}|.")
-TAG1 (L"%candidates")
-DEFINITION1 (L"a list of output candidates. Each output candidate consists of:")
-TAG2 (L"%output")
-DEFINITION2 (L"the output string of the tableau. In two-level phonology: the surface form of the utterance, for example "
+TAG1 (U"%candidates")
+DEFINITION1 (U"a list of output candidates. Each output candidate consists of:")
+TAG2 (U"%output")
+DEFINITION2 (U"the output string of the tableau. In two-level phonology: the surface form of the utterance, for example "
 	"[anpa] or [ampa] or [bɹɔːt] or [bɹæŋ]. In multi-level phonology: the combination of phonological surface "
 	"and phonetic results, for example /anpa/[anpa] or /ampa/[ampa] or /bɹɔːt/[bɹɔːt] or "
 	"/bɹæŋ/[bɹæŋ].")
-TAG2 (L"%marks")
-DEFINITION2 (L"a list of the number of violations of each constraint for this output form. If there are 13 constraints, "
+TAG2 (U"%marks")
+DEFINITION2 (U"a list of the number of violations of each constraint for this output form. If there are 13 constraints, "
 	"this list will contain 13 integer numbers for each candidate.")
-ENTRY (L"OTGrammar creation")
-NORMAL (L"You can easily create some #OTGrammar examples from the @@New menu@, "
+ENTRY (U"OTGrammar creation")
+NORMAL (U"You can easily create some #OTGrammar examples from the @@New menu@, "
 	"or type your own grammars into a text file and read the file into Praat. See the @@OT learning@ tutorial.")
-ENTRY (L"OTGrammar actions")
-NORMAL (L"You can perform the following actions on selected #OTGrammar objects:")
-LIST_ITEM (L"@@OTGrammar: Generate inputs...@")
-/*LIST_ITEM (L"@@OTGrammar: Sort...@")*/
-LIST_ITEM (L"@@OTGrammar: Input to output...@")
-LIST_ITEM (L"@@OTGrammar: Input to outputs...@ (compute the output distribution for a given input)")
-LIST_ITEM (L"@@OTGrammar: To output Distributions...@")
-LIST_ITEM (L"@@OTGrammar & Strings: Inputs to outputs...@")
-LIST_ITEM (L"@@OTGrammar: Learn one...@")
-LIST_ITEM (L"@@OTGrammar & 2 Strings: Learn...@")
-NORMAL (L"You can view an #OTGrammar in an @OTGrammarEditor.")
+ENTRY (U"OTGrammar actions")
+NORMAL (U"You can perform the following actions on selected #OTGrammar objects:")
+LIST_ITEM (U"@@OTGrammar: Generate inputs...@")
+/*LIST_ITEM (U"@@OTGrammar: Sort...@")*/
+LIST_ITEM (U"@@OTGrammar: Input to output...@")
+LIST_ITEM (U"@@OTGrammar: Input to outputs...@ (compute the output distribution for a given input)")
+LIST_ITEM (U"@@OTGrammar: To output Distributions...@")
+LIST_ITEM (U"@@OTGrammar & Strings: Inputs to outputs...@")
+LIST_ITEM (U"@@OTGrammar: Learn one...@")
+LIST_ITEM (U"@@OTGrammar & 2 Strings: Learn...@")
+NORMAL (U"You can view an #OTGrammar in an @OTGrammarEditor.")
 MAN_END
 
-MAN_BEGIN (L"OTGrammar: Generate inputs...", L"ppgb", 19981230)
-INTRO (L"A command to create a @Strings object from a selected @OTGrammar.")
-NORMAL (L"A practical grammar-specific implementation of the %%richness of the base%: "
+MAN_BEGIN (U"OTGrammar: Generate inputs...", U"ppgb", 19981230)
+INTRO (U"A command to create a @Strings object from a selected @OTGrammar.")
+NORMAL (U"A practical grammar-specific implementation of the %%richness of the base%: "
 	"the inputs are drawn at random with equal probabilities from the inputs associated with the tableaus. "
 	"For an example, see @@OT learning 3.2. Data from another grammar at .")
-ENTRY (L"Setting")
-TAG (L"##Number of trials")
-DEFINITION (L"the number of times a string will be drawn from the possible inputs to the grammar.")
+ENTRY (U"Setting")
+TAG (U"##Number of trials")
+DEFINITION (U"the number of times a string will be drawn from the possible inputs to the grammar.")
 MAN_END
 
-MAN_BEGIN (L"OTGrammar: Input to output...", L"ppgb", 20030916)
-INTRO (L"A command to ask the selected @OTGrammar object to evaluate the candidates associated with a specified input form.")
-NORMAL (L"See @@OT learning 2.8. Asking for one output@ for tutorial information.")
-ENTRY (L"Settings")
-TAG (L"##Input form")
-DEFINITION (L"the input form whose surface form you want to know. If this string is not in the list "
+MAN_BEGIN (U"OTGrammar: Input to output...", U"ppgb", 20030916)
+INTRO (U"A command to ask the selected @OTGrammar object to evaluate the candidates associated with a specified input form.")
+NORMAL (U"See @@OT learning 2.8. Asking for one output@ for tutorial information.")
+ENTRY (U"Settings")
+TAG (U"##Input form")
+DEFINITION (U"the input form whose surface form you want to know. If this string is not in the list "
 	"of the possible inputs of the selected OTGrammar, you will get an error message.")
-TAG (L"##Noise# (standard value: 2.0)")
-DEFINITION (L"the standard deviation of the noise added to the ranking value of every constraint during evaluation. "
+TAG (U"##Noise# (standard value: 2.0)")
+DEFINITION (U"the standard deviation of the noise added to the ranking value of every constraint during evaluation. "
 	"See @@OT learning 2.4. Evaluation at .")
 MAN_END
 
-MAN_BEGIN (L"OTGrammar: Input to outputs...", L"ppgb", 20030916)
-INTRO (L"A command to ask the selected @OTGrammar object to evaluate a number of times the candidates associated "
+MAN_BEGIN (U"OTGrammar: Input to outputs...", U"ppgb", 20030916)
+INTRO (U"A command to ask the selected @OTGrammar object to evaluate a number of times the candidates associated "
 	"with a specified input form. The result is a @Distributions object.")
-NORMAL (L"See @@OT learning 2.9. Output distributions@ for tutorial information and examples.")
-ENTRY (L"Settings")
-TAG (L"##Trials# (standard value: 1000)")
-DEFINITION (L"the number of evaluations that you want to perform.")
-TAG (L"##Noise# (standard value: 2.0)")
-DEFINITION (L"the standard deviation of the noise added to the ranking value of every constraint during the evaluations. "
+NORMAL (U"See @@OT learning 2.9. Output distributions@ for tutorial information and examples.")
+ENTRY (U"Settings")
+TAG (U"##Trials# (standard value: 1000)")
+DEFINITION (U"the number of evaluations that you want to perform.")
+TAG (U"##Noise# (standard value: 2.0)")
+DEFINITION (U"the standard deviation of the noise added to the ranking value of every constraint during the evaluations. "
 	"See @@OT learning 2.4. Evaluation at .")
-TAG (L"##Input form")
-DEFINITION (L"the input form whose surface forms you want to measure. If this string is not in the list "
+TAG (U"##Input form")
+DEFINITION (U"the input form whose surface forms you want to measure. If this string is not in the list "
 	"of the possible inputs of the selected OTGrammar, you will get an error message.")
 MAN_END
 
-MAN_BEGIN (L"OTGrammar: Learn one...", L"ppgb", 20011120)
-INTRO (L"Causes every selected @OTGrammar object to process one input/output pair "
+MAN_BEGIN (U"OTGrammar: Learn one...", U"ppgb", 20011120)
+INTRO (U"Causes every selected @OTGrammar object to process one input/output pair "
 	"according to the Gradual Learning Algorithm "
 	"by @@Boersma (1998)@ and @@Boersma (2000)@. See @@OT learning 4. Learning an ordinal grammar@ "
 	"and @@OT learning 5. Learning a stochastic grammar at .")
 MAN_END
 
-MAN_BEGIN (L"OTGrammar: To output Distributions...", L"ppgb", 19981230)
-INTRO (L"A command to ask the selected @OTGrammar object to evaluate a number of times the candidates associated "
+MAN_BEGIN (U"OTGrammar: To output Distributions...", U"ppgb", 19981230)
+INTRO (U"A command to ask the selected @OTGrammar object to evaluate a number of times the candidates associated "
 	"with every input form. The result is a @Distributions object. See @@OT learning 2.9. Output distributions at .")
 MAN_END
 
-MAN_BEGIN (L"OTGrammar & PairDistribution: Find positive weights...", L"ppgb", 20080331)
-INTRO (L"A command to change the weights of the selected @OTGrammar on the basis of the language data "
+MAN_BEGIN (U"OTGrammar & PairDistribution: Find positive weights...", U"ppgb", 20080331)
+INTRO (U"A command to change the weights of the selected @OTGrammar on the basis of the language data "
 	"in the selected @PairDistribution.")
-NORMAL (L"This command works only if the decision strategy of the selected OTGrammar is "
+NORMAL (U"This command works only if the decision strategy of the selected OTGrammar is "
 	"HarmonicGrammar, LinearOT, PositiveHG, or ExponentialHG. Also, "
 	"the selected PairDistribution must contain exactly one non-zero-probability output for every possible input of the grammar.")
-NORMAL (L"The procedure follows the linear programming method by @@Pater, Potts & Bhatt (2007)@. "
+NORMAL (U"The procedure follows the linear programming method by @@Pater, Potts & Bhatt (2007)@. "
 	"This method tries to find a special correct weighting of the constraints, "
 	"namely one that minimizes the sum of the constraint weights.")
-ENTRY (L"Settings")
-TAG (L"##Weight floor# (standard value: 1.0)")
-DEFINITION (L"After the command finishes, every weight will have at least this value.")
-TAG (L"##Margin of separation# (standard value: 1.0)")
-DEFINITION (L"After the command finishes, the harmony of every optimal (and correct) output candidate "
+ENTRY (U"Settings")
+TAG (U"##Weight floor# (standard value: 1.0)")
+DEFINITION (U"After the command finishes, every weight will have at least this value.")
+TAG (U"##Margin of separation# (standard value: 1.0)")
+DEFINITION (U"After the command finishes, the harmony of every optimal (and correct) output candidate "
 	"will be at least this much greater than the harmony of any competitor in the same tableau.")
 MAN_END
 
-MAN_BEGIN (L"OTGrammar & Strings: Inputs to outputs...", L"ppgb", 19981230)
-INTRO (L"An action that creates a @Strings object from a selected @OTGrammar and a selected @Strings.")
-NORMAL (L"The selected Strings object is considered as a list of inputs to the OTGrammar grammar.")
-ENTRY (L"Settings")
-TAG (L"##Noise")
-DEFINITION (L"the standard deviation of the noise that will be temporarily added to the ranking value at each evaluation.")
-NORMAL (L"The resulting Strings object will contain the output string of the grammar for each of the input strings.")
-NORMAL (L"See @@OT learning 3.2. Data from another grammar at .")
+MAN_BEGIN (U"OTGrammar & Strings: Inputs to outputs...", U"ppgb", 19981230)
+INTRO (U"An action that creates a @Strings object from a selected @OTGrammar and a selected @Strings.")
+NORMAL (U"The selected Strings object is considered as a list of inputs to the OTGrammar grammar.")
+ENTRY (U"Settings")
+TAG (U"##Noise")
+DEFINITION (U"the standard deviation of the noise that will be temporarily added to the ranking value at each evaluation.")
+NORMAL (U"The resulting Strings object will contain the output string of the grammar for each of the input strings.")
+NORMAL (U"See @@OT learning 3.2. Data from another grammar at .")
 MAN_END
 
-MAN_BEGIN (L"OTGrammar & 2 Strings: Learn...", L"ppgb", 20100331)
-INTRO (L"Causes the selected @OTGrammar object to process a number of input/output pairs "
+MAN_BEGIN (U"OTGrammar & 2 Strings: Learn...", U"ppgb", 20100331)
+INTRO (U"Causes the selected @OTGrammar object to process a number of input/output pairs "
 	"according to the Gradual Learning Algorithm by @@Boersma (1997)@ and @@Boersma & Hayes (2001)@ "
 	"or with any other reranking strategies. See @@OT learning 4. Learning an ordinal grammar@ "
 	"and @@OT learning 5. Learning a stochastic grammar at .")
 MAN_END
 
-MAN_BEGIN (L"OTGrammarEditor", L"ppgb", 20030316)
-INTRO (L"One of the @editors in Praat, for viewing and editing the grammar in an @OTGrammar object.")
-NORMAL (L"See the @@OT learning@ tutorial for examples.")
-ENTRY (L"Usage")
-NORMAL (L"The menu command that you will probably use most often if you investigate variation, "
+MAN_BEGIN (U"OTGrammarEditor", U"ppgb", 20030316)
+INTRO (U"One of the @editors in Praat, for viewing and editing the grammar in an @OTGrammar object.")
+NORMAL (U"See the @@OT learning@ tutorial for examples.")
+ENTRY (U"Usage")
+NORMAL (U"The menu command that you will probably use most often if you investigate variation, "
 	"is the ##Evaluate (noise 2.0)# command, which you can invoke from the #Edit menu or by pressing Command-2.")
-NORMAL (L"This command performs a new evaluation with the current ranking values. Some noise is added to the "
+NORMAL (U"This command performs a new evaluation with the current ranking values. Some noise is added to the "
 	"ranking values, so that the %#disharmonies of the constraint will change. This may cause a change in the "
 	"ranking order of the constraints, which in its turn may cause a different candidate to win in some tableaus.")
 MAN_END
 
-MAN_BEGIN (L"Robust Interpretive Parsing", L"ppgb", 20021105)
-INTRO (L"The mapping from overt forms to surface forms in the acquisition model by @@Tesar & Smolensky (1998)@.")
-NORMAL (L"In Praat, you can do robust interpretive parsing on any @OTGrammar object. "
+MAN_BEGIN (U"Robust Interpretive Parsing", U"ppgb", 20021105)
+INTRO (U"The mapping from overt forms to surface forms in the acquisition model by @@Tesar & Smolensky (1998)@.")
+NORMAL (U"In Praat, you can do robust interpretive parsing on any @OTGrammar object. "
 	"See @@OT learning 7. Learning from overt forms at .")
 MAN_END
 
diff --git a/gram/praat_gram.cpp b/gram/praat_gram.cpp
index 43eef21..dfd7ffb 100644
--- a/gram/praat_gram.cpp
+++ b/gram/praat_gram.cpp
@@ -1,6 +1,6 @@
 /* praat_gram.cpp
  *
- * Copyright (C) 1997-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1997-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,330 +35,330 @@
 
 static void UiForm_addNetworkFields (UiForm dia) {
 	Any radio;
-	LABEL (L"", L"Activity spreading settings:")
-	REAL (L"Spreading rate", L"0.01")
-	OPTIONMENU_ENUM (L"Activity clipping rule", kNetwork_activityClippingRule, DEFAULT)
-	REAL (L"left Activity range", L"0.0")
-	REAL (L"right Activity range", L"1.0")
-	REAL (L"Activity leak", L"1.0")
-	LABEL (L"", L"Weight update settings:")
-	REAL (L"Learning rate", L"0.1")
-	REAL (L"left Weight range", L"-1.0")
-	REAL (L"right Weight range", L"1.0")
-	REAL (L"Weight leak", L"0.0")
+	LABEL (U"", U"Activity spreading settings:")
+	REAL (U"Spreading rate", U"0.01")
+	OPTIONMENU_ENUM (U"Activity clipping rule", kNetwork_activityClippingRule, DEFAULT)
+	REAL (U"left Activity range", U"0.0")
+	REAL (U"right Activity range", U"1.0")
+	REAL (U"Activity leak", U"1.0")
+	LABEL (U"", U"Weight update settings:")
+	REAL (U"Learning rate", U"0.1")
+	REAL (U"left Weight range", U"-1.0")
+	REAL (U"right Weight range", U"1.0")
+	REAL (U"Weight leak", U"0.0")
 }
 
-FORM (Create_empty_Network, L"Create empty Network", 0) {
-	WORD (L"Name", L"network")
+FORM (Create_empty_Network, U"Create empty Network", 0) {
+	WORD (U"Name", U"network")
 	UiForm_addNetworkFields (dia);
-	LABEL (L"", L"World coordinates:")
-	REAL (L"left x range", L"0.0")
-	REAL (L"right x range", L"10.0")
-	REAL (L"left y range", L"0.0")
-	REAL (L"right y range", L"10.0")
+	LABEL (U"", U"World coordinates:")
+	REAL (U"left x range", U"0.0")
+	REAL (U"right x range", U"10.0")
+	REAL (U"left y range", U"0.0")
+	REAL (U"right y range", U"10.0")
 	OK2
 DO
-	autoNetwork me = Network_create (GET_REAL (L"Spreading rate"), GET_ENUM (kNetwork_activityClippingRule, L"Activity clipping rule"),
-		GET_REAL (L"left Activity range"), GET_REAL (L"right Activity range"), GET_REAL (L"Activity leak"),
-		GET_REAL (L"Learning rate"), GET_REAL (L"left Weight range"), GET_REAL (L"right Weight range"), GET_REAL (L"Weight leak"),
-		GET_REAL (L"left x range"), GET_REAL (L"right x range"), GET_REAL (L"left y range"), GET_REAL (L"right y range"),
+	autoNetwork me = Network_create (GET_REAL (U"Spreading rate"), GET_ENUM (kNetwork_activityClippingRule, U"Activity clipping rule"),
+		GET_REAL (U"left Activity range"), GET_REAL (U"right Activity range"), GET_REAL (U"Activity leak"),
+		GET_REAL (U"Learning rate"), GET_REAL (U"left Weight range"), GET_REAL (U"right Weight range"), GET_REAL (U"Weight leak"),
+		GET_REAL (U"left x range"), GET_REAL (U"right x range"), GET_REAL (U"left y range"), GET_REAL (U"right y range"),
 		0, 0);
-	praat_new (me.transfer(), GET_STRING (L"Name"));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
 END2 }
 
-FORM (Create_rectangular_Network, L"Create rectangular Network", 0) {
+FORM (Create_rectangular_Network, U"Create rectangular Network", 0) {
 	UiForm_addNetworkFields (dia);
-	LABEL (L"", L"Structure settings:")
-	NATURAL (L"Number of rows", L"10")
-	NATURAL (L"Number of columns", L"10")
-	BOOLEAN (L"Bottom row clamped", 1)
-	LABEL (L"", L"Initial state settings:")
-	REAL (L"left Initial weight range", L"-0.1")
-	REAL (L"right Initial weight range", L"0.1")
-	OK2
-DO
-	autoNetwork me = Network_create_rectangle (GET_REAL (L"Spreading rate"), GET_ENUM (kNetwork_activityClippingRule, L"Activity clipping rule"),
-		GET_REAL (L"left Activity range"), GET_REAL (L"right Activity range"), GET_REAL (L"Activity leak"),
-		GET_REAL (L"Learning rate"), GET_REAL (L"left Weight range"), GET_REAL (L"right Weight range"), GET_REAL (L"Weight leak"),
-		GET_INTEGER (L"Number of rows"), GET_INTEGER (L"Number of columns"),
-		GET_INTEGER (L"Bottom row clamped"),
-		GET_REAL (L"left Initial weight range"), GET_REAL (L"right Initial weight range"));
+	LABEL (U"", U"Structure settings:")
+	NATURAL (U"Number of rows", U"10")
+	NATURAL (U"Number of columns", U"10")
+	BOOLEAN (U"Bottom row clamped", 1)
+	LABEL (U"", U"Initial state settings:")
+	REAL (U"left Initial weight range", U"-0.1")
+	REAL (U"right Initial weight range", U"0.1")
+	OK2
+DO
+	autoNetwork me = Network_create_rectangle (GET_REAL (U"Spreading rate"), GET_ENUM (kNetwork_activityClippingRule, U"Activity clipping rule"),
+		GET_REAL (U"left Activity range"), GET_REAL (U"right Activity range"), GET_REAL (U"Activity leak"),
+		GET_REAL (U"Learning rate"), GET_REAL (U"left Weight range"), GET_REAL (U"right Weight range"), GET_REAL (U"Weight leak"),
+		GET_INTEGER (U"Number of rows"), GET_INTEGER (U"Number of columns"),
+		GET_INTEGER (U"Bottom row clamped"),
+		GET_REAL (U"left Initial weight range"), GET_REAL (U"right Initial weight range"));
 	praat_new (me.transfer(),
-			L"rectangle_", Melder_integer (GET_INTEGER (L"Number of rows")),
-			L"_", Melder_integer (GET_INTEGER (L"Number of columns")));
+			U"rectangle_", GET_INTEGER (U"Number of rows"),
+			U"_", GET_INTEGER (U"Number of columns"));
 END2 }
 
-FORM (Create_rectangular_Network_vertical, L"Create rectangular Network (vertical)", 0) {
+FORM (Create_rectangular_Network_vertical, U"Create rectangular Network (vertical)", 0) {
 	UiForm_addNetworkFields (dia);
-	LABEL (L"", L"Structure settings:")
-	NATURAL (L"Number of rows", L"10")
-	NATURAL (L"Number of columns", L"10")
-	BOOLEAN (L"Bottom row clamped", 1)
-	LABEL (L"", L"Initial state settings:")
-	REAL (L"left Initial weight range", L"-0.1")
-	REAL (L"right Initial weight range", L"0.1")
-	OK2
-DO
-	autoNetwork me = Network_create_rectangle_vertical (GET_REAL (L"Spreading rate"), GET_ENUM (kNetwork_activityClippingRule, L"Activity clipping rule"),
-		GET_REAL (L"left Activity range"), GET_REAL (L"right Activity range"), GET_REAL (L"Activity leak"),
-		GET_REAL (L"Learning rate"), GET_REAL (L"left Weight range"), GET_REAL (L"right Weight range"), GET_REAL (L"Weight leak"),
-		GET_INTEGER (L"Number of rows"), GET_INTEGER (L"Number of columns"),
-		GET_INTEGER (L"Bottom row clamped"),
-		GET_REAL (L"left Initial weight range"), GET_REAL (L"right Initial weight range"));
+	LABEL (U"", U"Structure settings:")
+	NATURAL (U"Number of rows", U"10")
+	NATURAL (U"Number of columns", U"10")
+	BOOLEAN (U"Bottom row clamped", 1)
+	LABEL (U"", U"Initial state settings:")
+	REAL (U"left Initial weight range", U"-0.1")
+	REAL (U"right Initial weight range", U"0.1")
+	OK2
+DO
+	autoNetwork me = Network_create_rectangle_vertical (GET_REAL (U"Spreading rate"), GET_ENUM (kNetwork_activityClippingRule, U"Activity clipping rule"),
+		GET_REAL (U"left Activity range"), GET_REAL (U"right Activity range"), GET_REAL (U"Activity leak"),
+		GET_REAL (U"Learning rate"), GET_REAL (U"left Weight range"), GET_REAL (U"right Weight range"), GET_REAL (U"Weight leak"),
+		GET_INTEGER (U"Number of rows"), GET_INTEGER (U"Number of columns"),
+		GET_INTEGER (U"Bottom row clamped"),
+		GET_REAL (U"left Initial weight range"), GET_REAL (U"right Initial weight range"));
 	praat_new (me.transfer(),
-			L"rectangle_", Melder_integer (GET_INTEGER (L"Number of rows")),
-			L"_", Melder_integer (GET_INTEGER (L"Number of columns")));
+			U"rectangle_", GET_INTEGER (U"Number of rows"),
+			U"_", GET_INTEGER (U"Number of columns"));
 END2 }
 
 #pragma mark Draw
 
-FORM (Network_draw, L"Draw Network", 0) {
-	BOOLEAN (L"Colour", 1)
+FORM (Network_draw, U"Draw Network", 0) {
+	BOOLEAN (U"Colour", 1)
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam_LOOP (Network);
-		Network_draw (me, GRAPHICS, GET_INTEGER (L"Colour"));
+		Network_draw (me, GRAPHICS, GET_INTEGER (U"Colour"));
 	}
 END2 }
 
 #pragma mark Tabulate
 
-FORM (Network_listNodes, L"Network: List nodes", 0) {
-	INTEGER (L"From node number", L"1")
-	INTEGER (L"To node number", L"1000")
-	BOOLEAN (L"Include node numbers", true)
-	BOOLEAN (L"Include x", false)
-	BOOLEAN (L"Include y", false)
-	INTEGER (L"Position decimals", L"6")
-	BOOLEAN (L"Include clamped", false)
-	BOOLEAN (L"Include activity", true)
-	BOOLEAN (L"Include excitation", false)
-	INTEGER (L"Activity decimals", L"6")
+FORM (Network_listNodes, U"Network: List nodes", 0) {
+	INTEGER (U"From node number", U"1")
+	INTEGER (U"To node number", U"1000")
+	BOOLEAN (U"Include node numbers", true)
+	BOOLEAN (U"Include x", false)
+	BOOLEAN (U"Include y", false)
+	INTEGER (U"Position decimals", U"6")
+	BOOLEAN (U"Include clamped", false)
+	BOOLEAN (U"Include activity", true)
+	BOOLEAN (U"Include excitation", false)
+	INTEGER (U"Activity decimals", U"6")
 	OK2
 DO
 	LOOP {
 		iam (Network);
-		Network_listNodes (me, GET_INTEGER (L"From node number"), GET_INTEGER (L"To node number"),
-			GET_INTEGER (L"Include node numbers"),
-			GET_INTEGER (L"Include x"), GET_INTEGER (L"Include y"), GET_INTEGER (L"Position decimals"),
-			GET_INTEGER (L"Include clamped"),
-			GET_INTEGER (L"Include activity"), GET_INTEGER (L"Include excitation"), GET_INTEGER (L"Activity decimals"));
+		Network_listNodes (me, GET_INTEGER (U"From node number"), GET_INTEGER (U"To node number"),
+			GET_INTEGER (U"Include node numbers"),
+			GET_INTEGER (U"Include x"), GET_INTEGER (U"Include y"), GET_INTEGER (U"Position decimals"),
+			GET_INTEGER (U"Include clamped"),
+			GET_INTEGER (U"Include activity"), GET_INTEGER (U"Include excitation"), GET_INTEGER (U"Activity decimals"));
 	}
 END2 }
 
-FORM (Network_nodes_downto_Table, L"Network: Nodes down to Table", 0) {
-	INTEGER (L"From node number", L"1")
-	INTEGER (L"To node number", L"1000")
-	BOOLEAN (L"Include node numbers", true)
-	BOOLEAN (L"Include x", false)
-	BOOLEAN (L"Include y", false)
-	INTEGER (L"Position decimals", L"6")
-	BOOLEAN (L"Include clamped", false)
-	BOOLEAN (L"Include activity", true)
-	BOOLEAN (L"Include excitation", false)
-	INTEGER (L"Activity decimals", L"6")
+FORM (Network_nodes_downto_Table, U"Network: Nodes down to Table", 0) {
+	INTEGER (U"From node number", U"1")
+	INTEGER (U"To node number", U"1000")
+	BOOLEAN (U"Include node numbers", true)
+	BOOLEAN (U"Include x", false)
+	BOOLEAN (U"Include y", false)
+	INTEGER (U"Position decimals", U"6")
+	BOOLEAN (U"Include clamped", false)
+	BOOLEAN (U"Include activity", true)
+	BOOLEAN (U"Include excitation", false)
+	INTEGER (U"Activity decimals", U"6")
 	OK2
 DO
 	LOOP {
 		iam (Network);
-		autoTable thee = Network_nodes_downto_Table (me, GET_INTEGER (L"From node number"), GET_INTEGER (L"To node number"),
-			GET_INTEGER (L"Include node numbers"),
-			GET_INTEGER (L"Include x"), GET_INTEGER (L"Include y"), GET_INTEGER (L"Position decimals"),
-			GET_INTEGER (L"Include clamped"),
-			GET_INTEGER (L"Include activity"), GET_INTEGER (L"Include excitation"), GET_INTEGER (L"Activity decimals"));
+		autoTable thee = Network_nodes_downto_Table (me, GET_INTEGER (U"From node number"), GET_INTEGER (U"To node number"),
+			GET_INTEGER (U"Include node numbers"),
+			GET_INTEGER (U"Include x"), GET_INTEGER (U"Include y"), GET_INTEGER (U"Position decimals"),
+			GET_INTEGER (U"Include clamped"),
+			GET_INTEGER (U"Include activity"), GET_INTEGER (U"Include excitation"), GET_INTEGER (U"Activity decimals"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
 #pragma mark Query
 
-FORM (Network_getActivity, L"Network: Get activity", 0) {
-	NATURAL (L"Node", L"1")
+FORM (Network_getActivity, U"Network: Get activity", 0) {
+	NATURAL (U"Node", U"1")
 	OK2
 DO
 	iam_ONLY (Network);
-	double activity = Network_getActivity (me, GET_INTEGER (L"Node"));
-	Melder_information (Melder_double (activity));
+	double activity = Network_getActivity (me, GET_INTEGER (U"Node"));
+	Melder_information (activity);
 END2 }
 
-FORM (Network_getWeight, L"Network: Get weight", 0) {
-	NATURAL (L"Connection", L"1")
+FORM (Network_getWeight, U"Network: Get weight", 0) {
+	NATURAL (U"Connection", U"1")
 	OK2
 DO
 	iam_ONLY (Network);
-	double weight = Network_getWeight (me, GET_INTEGER (L"Connection"));
-	Melder_information (Melder_double (weight));
+	double weight = Network_getWeight (me, GET_INTEGER (U"Connection"));
+	Melder_information (weight);
 END2 }
 
 #pragma mark Modify
 
-FORM (Network_addConnection, L"Network: Add connection", 0) {
-	NATURAL (L"From node", L"1")
-	NATURAL (L"To node", L"2")
-	REAL (L"Weight", L"0.0")
-	REAL (L"Plasticity", L"1.0")
+FORM (Network_addConnection, U"Network: Add connection", 0) {
+	NATURAL (U"From node", U"1")
+	NATURAL (U"To node", U"2")
+	REAL (U"Weight", U"0.0")
+	REAL (U"Plasticity", U"1.0")
 	OK2
 DO
 	LOOP {
 		iam_LOOP (Network);
-		Network_addConnection (me, GET_INTEGER (L"From node"), GET_INTEGER (L"To node"), GET_REAL (L"Weight"), GET_REAL (L"Plasticity"));
+		Network_addConnection (me, GET_INTEGER (U"From node"), GET_INTEGER (U"To node"), GET_REAL (U"Weight"), GET_REAL (U"Plasticity"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Network_addNode, L"Network: Add node", 0) {
-	REAL (L"x", L"5.0")
-	REAL (L"y", L"5.0")
-	REAL (L"Activity", L"0.0")
-	BOOLEAN (L"Clamping", 0)
+FORM (Network_addNode, U"Network: Add node", 0) {
+	REAL (U"x", U"5.0")
+	REAL (U"y", U"5.0")
+	REAL (U"Activity", U"0.0")
+	BOOLEAN (U"Clamping", 0)
 	OK2
 DO
 	LOOP {
 		iam_LOOP (Network);
-		Network_addNode (me, GET_REAL (L"x"), GET_REAL (L"y"), GET_REAL (L"Activity"), GET_INTEGER (L"Clamping"));
+		Network_addNode (me, GET_REAL (U"x"), GET_REAL (U"y"), GET_REAL (U"Activity"), GET_INTEGER (U"Clamping"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Network_normalizeActivities, L"Network: Normalize activities", 0) {
-	INTEGER (L"From node", L"1")
-	INTEGER (L"To node", L"0 (= all)")
+FORM (Network_normalizeActivities, U"Network: Normalize activities", 0) {
+	INTEGER (U"From node", U"1")
+	INTEGER (U"To node", U"0 (= all)")
 	OK2
 DO
 	LOOP {
 		iam_LOOP (Network);
-		Network_normalizeActivities (me, GET_INTEGER (L"From node"), GET_INTEGER (L"To node"));
+		Network_normalizeActivities (me, GET_INTEGER (U"From node"), GET_INTEGER (U"To node"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Network_normalizeWeights, L"Network: Normalize weights", 0) {
-	INTEGER (L"From node", L"1")
-	INTEGER (L"To node", L"0 (= all)")
-	INTEGER (L"From incoming node", L"1")
-	INTEGER (L"To incoming node", L"10")
-	REAL (L"New sum", L"1.0")
+FORM (Network_normalizeWeights, U"Network: Normalize weights", 0) {
+	INTEGER (U"From node", U"1")
+	INTEGER (U"To node", U"0 (= all)")
+	INTEGER (U"From incoming node", U"1")
+	INTEGER (U"To incoming node", U"10")
+	REAL (U"New sum", U"1.0")
 	OK2
 DO
 	LOOP {
 		iam_LOOP (Network);
-		Network_normalizeWeights (me, GET_INTEGER (L"From node"), GET_INTEGER (L"To node"),
-			GET_INTEGER (L"From incoming node"), GET_INTEGER (L"To incoming node"), GET_REAL (L"New sum"));
+		Network_normalizeWeights (me, GET_INTEGER (U"From node"), GET_INTEGER (U"To node"),
+			GET_INTEGER (U"From incoming node"), GET_INTEGER (U"To incoming node"), GET_REAL (U"New sum"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Network_setActivity, L"Network: Set activity", 0) {
-	NATURAL (L"Node", L"1")
-	REAL (L"Activity", L"1.0")
+FORM (Network_setActivity, U"Network: Set activity", 0) {
+	NATURAL (U"Node", U"1")
+	REAL (U"Activity", U"1.0")
 	OK2
 DO
 	LOOP {
 		iam_LOOP (Network);
-		Network_setActivity (me, GET_INTEGER (L"Node"), GET_REAL (L"Activity"));
+		Network_setActivity (me, GET_INTEGER (U"Node"), GET_REAL (U"Activity"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Network_setActivityClippingRule, L"Network: Set activity clipping rule", 0) {
-	RADIO_ENUM (L"Activity clipping rule", kNetwork_activityClippingRule, DEFAULT)
+FORM (Network_setActivityClippingRule, U"Network: Set activity clipping rule", 0) {
+	RADIO_ENUM (U"Activity clipping rule", kNetwork_activityClippingRule, DEFAULT)
 	OK2
 iam_ONLY (Network);
-SET_ENUM (L"Activity clipping rule", kNetwork_activityClippingRule, my activityClippingRule);
+SET_ENUM (U"Activity clipping rule", kNetwork_activityClippingRule, my activityClippingRule);
 DO
 	iam_ONLY (Network);
-	Network_setActivityClippingRule (me, GET_ENUM (kNetwork_activityClippingRule, L"Activity clipping rule"));
+	Network_setActivityClippingRule (me, GET_ENUM (kNetwork_activityClippingRule, U"Activity clipping rule"));
 	praat_dataChanged (me);
 END2 }
 
-FORM (Network_setActivityLeak, L"Network: Set activity leak", 0) {
-	REAL (L"Activity leak", L"1.0")
+FORM (Network_setActivityLeak, U"Network: Set activity leak", 0) {
+	REAL (U"Activity leak", U"1.0")
 	OK2
 iam_ONLY (Network);
-SET_REAL (L"Activity leak", my activityLeak);
+SET_REAL (U"Activity leak", my activityLeak);
 DO
 	iam_ONLY (Network);
-	Network_setActivityLeak (me, GET_REAL (L"Activity leak"));
+	Network_setActivityLeak (me, GET_REAL (U"Activity leak"));
 	praat_dataChanged (me);
 END2 }
 
-FORM (Network_setClamping, L"Network: Set clamping", 0) {
-	NATURAL (L"Node", L"1")
-	BOOLEAN (L"Clamping", 1)
+FORM (Network_setClamping, U"Network: Set clamping", 0) {
+	NATURAL (U"Node", U"1")
+	BOOLEAN (U"Clamping", 1)
 	OK2
 DO
 	LOOP {
 		iam_LOOP (Network);
-		Network_setClamping (me, GET_INTEGER (L"Node"), GET_INTEGER (L"Clamping"));
+		Network_setClamping (me, GET_INTEGER (U"Node"), GET_INTEGER (U"Clamping"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Network_setInstar, L"Network: Set instar", 0) {
-	REAL (L"Instar", L"0.0")
+FORM (Network_setInstar, U"Network: Set instar", 0) {
+	REAL (U"Instar", U"0.0")
 	OK2
 iam_ONLY (Network);
-SET_REAL (L"Instar", my instar);
+SET_REAL (U"Instar", my instar);
 DO
 	iam_ONLY (Network);
-	Network_setInstar (me, GET_REAL (L"Instar"));
+	Network_setInstar (me, GET_REAL (U"Instar"));
 	praat_dataChanged (me);
 END2 }
 
-FORM (Network_setWeightLeak, L"Network: Set weight leak", 0) {
-	REAL (L"Weight leak", L"0.0")
+FORM (Network_setWeightLeak, U"Network: Set weight leak", 0) {
+	REAL (U"Weight leak", U"0.0")
 	OK2
 iam_ONLY (Network);
-SET_REAL (L"Weight leak", my weightLeak);
+SET_REAL (U"Weight leak", my weightLeak);
 DO
 	iam_ONLY (Network);
-	Network_setWeightLeak (me, GET_REAL (L"Weight leak"));
+	Network_setWeightLeak (me, GET_REAL (U"Weight leak"));
 	praat_dataChanged (me);
 END2 }
 
-FORM (Network_setOutstar, L"Network: Set outstar", 0) {
-	REAL (L"Outstar", L"0.0")
+FORM (Network_setOutstar, U"Network: Set outstar", 0) {
+	REAL (U"Outstar", U"0.0")
 	OK2
 iam_ONLY (Network);
-SET_REAL (L"Outstar", my outstar);
+SET_REAL (U"Outstar", my outstar);
 DO
 	iam_ONLY (Network);
-	Network_setOutstar (me, GET_REAL (L"Outstar"));
+	Network_setOutstar (me, GET_REAL (U"Outstar"));
 	praat_dataChanged (me);
 END2 }
 
-FORM (Network_setShunting, L"Network: Set shunting", 0) {
-	REAL (L"Shunting", L"1.0")
+FORM (Network_setShunting, U"Network: Set shunting", 0) {
+	REAL (U"Shunting", U"1.0")
 	OK2
 DO
 	LOOP {
 		iam_LOOP (Network);
-		Network_setShunting (me, GET_REAL (L"Shunting"));
+		Network_setShunting (me, GET_REAL (U"Shunting"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Network_setWeight, L"Network: Set weight", 0) {
-	NATURAL (L"Connection", L"1")
-	REAL (L"Weight", L"1.0")
+FORM (Network_setWeight, U"Network: Set weight", 0) {
+	NATURAL (U"Connection", U"1")
+	REAL (U"Weight", U"1.0")
 	OK2
 DO
 	LOOP {
 		iam_LOOP (Network);
-		Network_setWeight (me, GET_INTEGER (L"Connection"), GET_REAL (L"Weight"));
+		Network_setWeight (me, GET_INTEGER (U"Connection"), GET_REAL (U"Weight"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Network_spreadActivities, L"Network: Spread activities", 0) {
-	NATURAL (L"Number of steps", L"20")
+FORM (Network_spreadActivities, U"Network: Spread activities", 0) {
+	NATURAL (U"Number of steps", U"20")
 	OK2
 DO
 	LOOP {
 		iam_LOOP (Network);
-		Network_spreadActivities (me, GET_INTEGER (L"Number of steps"));
+		Network_spreadActivities (me, GET_INTEGER (U"Number of steps"));
 		praat_dataChanged (me);
 	}
 END2 }
@@ -371,14 +371,14 @@ DIRECT2 (Network_updateWeights) {
 	}
 END2 }
 
-FORM (Network_zeroActivities, L"Network: Zero activities", 0) {
-	INTEGER (L"From node", L"1")
-	INTEGER (L"To node", L"0 (= all)")
+FORM (Network_zeroActivities, U"Network: Zero activities", 0) {
+	INTEGER (U"From node", U"1")
+	INTEGER (U"To node", U"0 (= all)")
 	OK2
 DO
 	LOOP {
 		iam (Network);
-		Network_zeroActivities (me, GET_INTEGER (L"From node"), GET_INTEGER (L"To node"));
+		Network_zeroActivities (me, GET_INTEGER (U"From node"), GET_INTEGER (U"To node"));
 		praat_dataChanged (me);
 	}
 END2 }
@@ -388,79 +388,83 @@ END2 }
 
 #pragma mark New
 
-DIRECT2 (OT_learning_tutorial) { Melder_help (L"OT learning"); END2 }
+DIRECT2 (OT_learning_tutorial) {
+	Melder_help (U"OT learning");
+END2 }
 
 DIRECT2 (Create_NoCoda_grammar) {
 	autoOTGrammar me = OTGrammar_create_NoCoda_grammar ();
-	praat_new (me.transfer(), L"NoCoda");
+	praat_new (me.transfer(), U"NoCoda");
 END2 }
 
 DIRECT2 (Create_NPA_grammar) {
 	autoOTGrammar me = OTGrammar_create_NPA_grammar ();
-	praat_new (me.transfer(), L"assimilation");
+	praat_new (me.transfer(), U"assimilation");
 END2 }
 
 DIRECT2 (Create_NPA_distribution) {
 	autoPairDistribution me = OTGrammar_create_NPA_distribution ();
-	praat_new (me.transfer(), L"assimilation");
-END2 }
-
-FORM (Create_tongue_root_grammar, L"Create tongue-root grammar", L"Create tongue-root grammar...") {
-	RADIO (L"Constraint set", 1)
-		RADIOBUTTON (L"Five")
-		RADIOBUTTON (L"Nine")
-	RADIO (L"Ranking", 3)
-		RADIOBUTTON (L"Equal")
-		RADIOBUTTON (L"Random")
-		RADIOBUTTON (L"Infant")
-		RADIOBUTTON (L"Wolof")
-	OK2
-DO
-	autoOTGrammar me = OTGrammar_create_tongueRoot_grammar (GET_INTEGER (L"Constraint set"), GET_INTEGER (L"Ranking"));
-	praat_new (me.transfer(), GET_STRING (L"Ranking"));
-END2 }
-
-FORM (Create_metrics_grammar, L"Create metrics grammar", 0) {
-	OPTIONMENU (L"Initial ranking", 1)
-		OPTION (L"Equal")
-		OPTION (L"Foot form high")
-		OPTION (L"WSP high")
-	OPTIONMENU (L"Trochaicity constraint", 1)
-		OPTION (L"FtNonfinal")
-		OPTION (L"Trochaic")
-	BOOLEAN (L"Include FootBimoraic", 0)
-	BOOLEAN (L"Include FootBisyllabic", 0)
-	BOOLEAN (L"Include Peripheral", 0)
-	OPTIONMENU (L"Nonfinality constraint", 1)
-		OPTION (L"Nonfinal")
-		OPTION (L"MainNonfinal")
-		OPTION (L"HeadNonfinal")
-	BOOLEAN (L"Overt forms have secondary stress", 1)
-	BOOLEAN (L"Include *Clash and *Lapse", 0)
-	BOOLEAN (L"Include codas", 0)
-	OK2
-DO
-	praat_new (OTGrammar_create_metrics (GET_INTEGER (L"Initial ranking"), GET_INTEGER (L"Trochaicity constraint"),
-		GET_INTEGER (L"Include FootBimoraic"), GET_INTEGER (L"Include FootBisyllabic"),
-		GET_INTEGER (L"Include Peripheral"), GET_INTEGER (L"Nonfinality constraint"),
-		GET_INTEGER (L"Overt forms have secondary stress"), GET_INTEGER (L"Include *Clash and *Lapse"), GET_INTEGER (L"Include codas")),
-		GET_STRING (L"Initial ranking"));
+	praat_new (me.transfer(), U"assimilation");
+END2 }
+
+FORM (Create_tongue_root_grammar, U"Create tongue-root grammar", U"Create tongue-root grammar...") {
+	RADIO (U"Constraint set", 1)
+		RADIOBUTTON (U"Five")
+		RADIOBUTTON (U"Nine")
+	RADIO (U"Ranking", 3)
+		RADIOBUTTON (U"Equal")
+		RADIOBUTTON (U"Random")
+		RADIOBUTTON (U"Infant")
+		RADIOBUTTON (U"Wolof")
+	OK2
+DO
+	autoOTGrammar me = OTGrammar_create_tongueRoot_grammar (GET_INTEGER (U"Constraint set"), GET_INTEGER (U"Ranking"));
+	praat_new (me.transfer(), GET_STRING (U"Ranking"));
+END2 }
+
+FORM (Create_metrics_grammar, U"Create metrics grammar", 0) {
+	OPTIONMENU (U"Initial ranking", 1)
+		OPTION (U"Equal")
+		OPTION (U"Foot form high")
+		OPTION (U"WSP high")
+	OPTIONMENU (U"Trochaicity constraint", 1)
+		OPTION (U"FtNonfinal")
+		OPTION (U"Trochaic")
+	BOOLEAN (U"Include FootBimoraic", 0)
+	BOOLEAN (U"Include FootBisyllabic", 0)
+	BOOLEAN (U"Include Peripheral", 0)
+	OPTIONMENU (U"Nonfinality constraint", 1)
+		OPTION (U"Nonfinal")
+		OPTION (U"MainNonfinal")
+		OPTION (U"HeadNonfinal")
+	BOOLEAN (U"Overt forms have secondary stress", 1)
+	BOOLEAN (U"Include *Clash and *Lapse", 0)
+	BOOLEAN (U"Include codas", 0)
+	OK2
+DO
+	praat_new (OTGrammar_create_metrics (GET_INTEGER (U"Initial ranking"), GET_INTEGER (U"Trochaicity constraint"),
+		GET_INTEGER (U"Include FootBimoraic"), GET_INTEGER (U"Include FootBisyllabic"),
+		GET_INTEGER (U"Include Peripheral"), GET_INTEGER (U"Nonfinality constraint"),
+		GET_INTEGER (U"Overt forms have secondary stress"), GET_INTEGER (U"Include *Clash and *Lapse"), GET_INTEGER (U"Include codas")),
+		GET_STRING (U"Initial ranking"));
 END2 }
 
 #pragma mark Save
-FORM_WRITE2 (OTGrammar_writeToHeaderlessSpreadsheetFile, L"Write OTGrammar to spreadsheet", 0, L"txt") {
+FORM_WRITE2 (OTGrammar_writeToHeaderlessSpreadsheetFile, U"Write OTGrammar to spreadsheet", 0, U"txt") {
 	iam_ONLY (OTGrammar);
 	OTGrammar_writeToHeaderlessSpreadsheetFile (me, file);
 END2 }
 
 #pragma mark Help
 
-DIRECT2 (OTGrammar_help) { Melder_help (L"OTGrammar"); END2 }
+DIRECT2 (OTGrammar_help) {
+	Melder_help (U"OTGrammar");
+END2 }
 
 #pragma mark Edit
 
 DIRECT2 (OTGrammar_edit) {
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot edit from batch.");
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot edit from batch.");
 	LOOP {
 		iam (OTGrammar);
 		autoOTGrammarEditor editor = OTGrammarEditor_create (ID_AND_FULL_NAME, me);
@@ -470,25 +474,25 @@ END2 }
 
 #pragma mark Draw
 
-FORM (OTGrammar_drawTableau, L"Draw tableau", L"OT learning") {
-	SENTENCE (L"Input string", L"")
+FORM (OTGrammar_drawTableau, U"Draw tableau", U"OT learning") {
+	SENTENCE (U"Input string", U"")
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (OTGrammar);
-		OTGrammar_drawTableau (me, GRAPHICS, false, GET_STRING (L"Input string"));
+		OTGrammar_drawTableau (me, GRAPHICS, false, GET_STRING (U"Input string"));
 	}
 END2 }
 
-FORM (OTGrammar_drawTableau_narrowly, L"Draw tableau (narrowly)", L"OT learning") {
-	SENTENCE (L"Input string", L"")
+FORM (OTGrammar_drawTableau_narrowly, U"Draw tableau (narrowly)", U"OT learning") {
+	SENTENCE (U"Input string", U"")
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (OTGrammar);
-		OTGrammar_drawTableau (me, GRAPHICS, true, GET_STRING (L"Input string"));
+		OTGrammar_drawTableau (me, GRAPHICS, true, GET_STRING (U"Input string"));
 	}
 END2 }
 
@@ -496,214 +500,214 @@ END2 }
 
 DIRECT2 (OTGrammar_getNumberOfConstraints) {
 	iam_ONLY (OTGrammar);
-	Melder_information (Melder_integer (my numberOfConstraints));
+	Melder_information (my numberOfConstraints);
 END2 }
 
-FORM (OTGrammar_getConstraint, L"Get constraint name", 0) {
-	NATURAL (L"Constraint number", L"1")
+FORM (OTGrammar_getConstraint, U"Get constraint name", 0) {
+	NATURAL (U"Constraint number", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long icons = GET_INTEGER (L"Constraint number");
+	long icons = GET_INTEGER (U"Constraint number");
 	if (icons > my numberOfConstraints)
-		Melder_throw ("The specified constraint number should not exceed the number of constraints.");
+		Melder_throw (U"The specified constraint number should not exceed the number of constraints.");
 	Melder_information (my constraints [icons]. name);
 END2 }
 
-FORM (OTGrammar_getRankingValue, L"Get ranking value", 0) {
-	NATURAL (L"Constraint number", L"1")
+FORM (OTGrammar_getRankingValue, U"Get ranking value", 0) {
+	NATURAL (U"Constraint number", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long icons = GET_INTEGER (L"Constraint number");
+	long icons = GET_INTEGER (U"Constraint number");
 	if (icons > my numberOfConstraints)
-		Melder_throw ("The specified constraint number should not exceed the number of constraints.");
-	Melder_information (Melder_double (my constraints [icons]. ranking));
+		Melder_throw (U"The specified constraint number should not exceed the number of constraints.");
+	Melder_information (my constraints [icons]. ranking);
 END2 }
 
-FORM (OTGrammar_getDisharmony, L"Get disharmony", 0) {
-	NATURAL (L"Constraint number", L"1")
+FORM (OTGrammar_getDisharmony, U"Get disharmony", 0) {
+	NATURAL (U"Constraint number", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long icons = GET_INTEGER (L"Constraint number");
+	long icons = GET_INTEGER (U"Constraint number");
 	if (icons > my numberOfConstraints)
-		Melder_throw ("The specified constraint number should not exceed the number of constraints.");
-	Melder_information (Melder_double (my constraints [icons]. disharmony));
+		Melder_throw (U"The specified constraint number should not exceed the number of constraints.");
+	Melder_information (my constraints [icons]. disharmony);
 END2 }
 
 DIRECT2 (OTGrammar_getNumberOfTableaus) {
 	iam_ONLY (OTGrammar);
-	Melder_information (Melder_integer (my numberOfTableaus));
+	Melder_information (my numberOfTableaus);
 END2 }
 
-FORM (OTGrammar_getInput, L"Get input", 0) {
-	NATURAL (L"Tableau number", L"1")
+FORM (OTGrammar_getInput, U"Get input", 0) {
+	NATURAL (U"Tableau number", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long itab = GET_INTEGER (L"Tableau number");
+	long itab = GET_INTEGER (U"Tableau number");
 	if (itab > my numberOfTableaus)
-		Melder_throw ("The specified tableau number should not exceed the number of tableaus.");
+		Melder_throw (U"The specified tableau number should not exceed the number of tableaus.");
 	Melder_information (my tableaus [itab]. input);
 END2 }
 
-FORM (OTGrammar_getNumberOfCandidates, L"Get number of candidates", 0) {
-	NATURAL (L"Tableau number", L"1")
+FORM (OTGrammar_getNumberOfCandidates, U"Get number of candidates", 0) {
+	NATURAL (U"Tableau number", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long itab = GET_INTEGER (L"Tableau number");
+	long itab = GET_INTEGER (U"Tableau number");
 	if (itab > my numberOfTableaus)
-		Melder_throw ("The specified tableau number should not exceed the number of tableaus.");
-	Melder_information (Melder_integer (my tableaus [itab]. numberOfCandidates));
+		Melder_throw (U"The specified tableau number should not exceed the number of tableaus.");
+	Melder_information (my tableaus [itab]. numberOfCandidates);
 END2 }
 
-FORM (OTGrammar_getCandidate, L"Get candidate", 0) {
-	NATURAL (L"Tableau number", L"1")
-	NATURAL (L"Candidate number", L"1")
+FORM (OTGrammar_getCandidate, U"Get candidate", 0) {
+	NATURAL (U"Tableau number", U"1")
+	NATURAL (U"Candidate number", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	OTGrammarTableau tableau;
-	long itab = GET_INTEGER (L"Tableau number"), icand = GET_INTEGER (L"Candidate number");
+	long itab = GET_INTEGER (U"Tableau number"), icand = GET_INTEGER (U"Candidate number");
 	if (itab > my numberOfTableaus)
-		Melder_throw ("The specified tableau number should not exceed the number of tableaus.");
+		Melder_throw (U"The specified tableau number should not exceed the number of tableaus.");
 	tableau = & my tableaus [itab];
 	if (icand > tableau -> numberOfCandidates)
-		Melder_throw ("The specified candidate should not exceed the number of candidates.");
+		Melder_throw (U"The specified candidate should not exceed the number of candidates.");
 	Melder_information (tableau -> candidates [icand]. output);
 END2 }
 
-FORM (OTGrammar_getNumberOfViolations, L"Get number of violations", 0) {
-	NATURAL (L"Tableau number", L"1")
-	NATURAL (L"Candidate number", L"1")
-	NATURAL (L"Constraint number", L"1")
+FORM (OTGrammar_getNumberOfViolations, U"Get number of violations", 0) {
+	NATURAL (U"Tableau number", U"1")
+	NATURAL (U"Candidate number", U"1")
+	NATURAL (U"Constraint number", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long itab = GET_INTEGER (L"Tableau number"), icand = GET_INTEGER (L"Candidate number"), icons = GET_INTEGER (L"Constraint number");
+	long itab = GET_INTEGER (U"Tableau number"), icand = GET_INTEGER (U"Candidate number"), icons = GET_INTEGER (U"Constraint number");
 	if (itab > my numberOfTableaus)
-		Melder_throw ("The specified tableau number should not exceed the number of tableaus.");
+		Melder_throw (U"The specified tableau number should not exceed the number of tableaus.");
 	if (icand > my tableaus [itab]. numberOfCandidates)
-		Melder_throw ("The specified candidate should not exceed the number of candidates.");
+		Melder_throw (U"The specified candidate should not exceed the number of candidates.");
 	if (icons > my numberOfConstraints)
-		Melder_throw ("The specified constraint number should not exceed the number of constraints.");
-	Melder_information (Melder_integer (my tableaus [itab]. candidates [icand]. marks [icons]));
+		Melder_throw (U"The specified constraint number should not exceed the number of constraints.");
+	Melder_information (my tableaus [itab]. candidates [icand]. marks [icons]);
 END2 }
 
 #pragma mark Query (parse)
 
-FORM (OTGrammar_getWinner, L"Get winner", 0) {
-	NATURAL (L"Tableau", L"1")
+FORM (OTGrammar_getWinner, U"Get winner", 0) {
+	NATURAL (U"Tableau", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long itab = GET_INTEGER (L"Tableau");
+	long itab = GET_INTEGER (U"Tableau");
 	if (itab > my numberOfTableaus)
-		Melder_throw ("The specified tableau number should not exceed the number of tableaus.");
-	Melder_information (Melder_integer (OTGrammar_getWinner (me, itab)));
+		Melder_throw (U"The specified tableau number should not exceed the number of tableaus.");
+	Melder_information (OTGrammar_getWinner (me, itab));
 END2 }
 
-FORM (OTGrammar_compareCandidates, L"Compare candidates", 0) {
-	NATURAL (L"Tableau number 1", L"1")
-	NATURAL (L"Candidate number 1", L"1")
-	NATURAL (L"Tableau number 2", L"1")
-	NATURAL (L"Candidate number 2", L"2")
+FORM (OTGrammar_compareCandidates, U"Compare candidates", 0) {
+	NATURAL (U"Tableau number 1", U"1")
+	NATURAL (U"Candidate number 1", U"1")
+	NATURAL (U"Tableau number 2", U"1")
+	NATURAL (U"Candidate number 2", U"2")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long itab1 = GET_INTEGER (L"Tableau number 1"), icand1 = GET_INTEGER (L"Candidate number 1");
-	long itab2 = GET_INTEGER (L"Tableau number 2"), icand2 = GET_INTEGER (L"Candidate number 2");
+	long itab1 = GET_INTEGER (U"Tableau number 1"), icand1 = GET_INTEGER (U"Candidate number 1");
+	long itab2 = GET_INTEGER (U"Tableau number 2"), icand2 = GET_INTEGER (U"Candidate number 2");
 	if (itab1 > my numberOfTableaus)
-		Melder_throw ("The specified tableau (number 1) should not exceed the number of tableaus.");
+		Melder_throw (U"The specified tableau (number 1) should not exceed the number of tableaus.");
 	if (itab2 > my numberOfTableaus)
-		Melder_throw ("The specified tableau (number 2) should not exceed the number of tableaus.");
+		Melder_throw (U"The specified tableau (number 2) should not exceed the number of tableaus.");
 	if (icand1 > my tableaus [itab1]. numberOfCandidates)
-		Melder_throw ("The specified candidate (number 1) should not exceed the number of candidates for this tableau.");
+		Melder_throw (U"The specified candidate (number 1) should not exceed the number of candidates for this tableau.");
 	if (icand2 > my tableaus [itab1]. numberOfCandidates)
-		Melder_throw ("The specified candidate (number 2) should not exceed the number of candidates for this tableau.");
-	Melder_information (Melder_integer (OTGrammar_compareCandidates (me, itab1, icand1, itab2, icand2)));
+		Melder_throw (U"The specified candidate (number 2) should not exceed the number of candidates for this tableau.");
+	Melder_information (OTGrammar_compareCandidates (me, itab1, icand1, itab2, icand2));
 END2 }
 
-FORM (OTGrammar_getNumberOfOptimalCandidates, L"Get number of optimal candidates", 0) {
-	NATURAL (L"Tableau number", L"1")
+FORM (OTGrammar_getNumberOfOptimalCandidates, U"Get number of optimal candidates", 0) {
+	NATURAL (U"Tableau number", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long itab = GET_INTEGER (L"Tableau number");
+	long itab = GET_INTEGER (U"Tableau number");
 	if (itab > my numberOfTableaus)
-		Melder_throw ("The specified tableau number should not exceed the number of tableaus.");
-	Melder_information (Melder_integer (OTGrammar_getNumberOfOptimalCandidates (me, itab)));
+		Melder_throw (U"The specified tableau number should not exceed the number of tableaus.");
+	Melder_information (OTGrammar_getNumberOfOptimalCandidates (me, itab));
 END2 }
 
-FORM (OTGrammar_isCandidateGrammatical, L"Is candidate grammatical?", 0) {
-	NATURAL (L"Tableau", L"1")
-	NATURAL (L"Candidate", L"1")
+FORM (OTGrammar_isCandidateGrammatical, U"Is candidate grammatical?", 0) {
+	NATURAL (U"Tableau", U"1")
+	NATURAL (U"Candidate", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long itab = GET_INTEGER (L"Tableau");
+	long itab = GET_INTEGER (U"Tableau");
 	if (itab > my numberOfTableaus)
-		Melder_throw ("The specified tableau number should not exceed the number of tableaus.");
-	long icand = GET_INTEGER (L"Candidate");
+		Melder_throw (U"The specified tableau number should not exceed the number of tableaus.");
+	long icand = GET_INTEGER (U"Candidate");
 	if (icand > my tableaus [itab]. numberOfCandidates)
-		Melder_throw ("The specified candidate should not exceed the number of candidates.");
-	Melder_information (Melder_integer (OTGrammar_isCandidateGrammatical (me, itab, icand)));
+		Melder_throw (U"The specified candidate should not exceed the number of candidates.");
+	Melder_information ((int) OTGrammar_isCandidateGrammatical (me, itab, icand));   // 0 or 1
 END2 }
 
-FORM (OTGrammar_isCandidateSinglyGrammatical, L"Is candidate singly grammatical?", 0) {
-	NATURAL (L"Tableau", L"1")
-	NATURAL (L"Candidate", L"1")
+FORM (OTGrammar_isCandidateSinglyGrammatical, U"Is candidate singly grammatical?", 0) {
+	NATURAL (U"Tableau", U"1")
+	NATURAL (U"Candidate", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	long itab = GET_INTEGER (L"Tableau");
+	long itab = GET_INTEGER (U"Tableau");
 	if (itab > my numberOfTableaus)
-		Melder_throw ("The specified tableau number should not exceed the number of tableaus.");
-	long icand = GET_INTEGER (L"Candidate");
+		Melder_throw (U"The specified tableau number should not exceed the number of tableaus.");
+	long icand = GET_INTEGER (U"Candidate");
 	if (icand > my tableaus [itab]. numberOfCandidates)
-		Melder_throw ("The specified candidate should not exceed the number of candidates.");
-	Melder_information (Melder_integer (OTGrammar_isCandidateSinglyGrammatical (me, itab, icand)));
+		Melder_throw (U"The specified candidate should not exceed the number of candidates.");
+	Melder_information ((int) OTGrammar_isCandidateSinglyGrammatical (me, itab, icand));   // 0 or 1
 END2 }
 
-FORM (OTGrammar_getInterpretiveParse, L"OTGrammar: Interpretive parse", 0) {
-	SENTENCE (L"Partial output", L"")
+FORM (OTGrammar_getInterpretiveParse, U"OTGrammar: Interpretive parse", 0) {
+	SENTENCE (U"Partial output", U"")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	long bestInput, bestOutput;
-	OTGrammar_getInterpretiveParse (me, GET_STRING (L"Partial output"), & bestInput, & bestOutput);
-	Melder_information (L"Best input = ", Melder_integer (bestInput), L": ", my tableaus [bestInput]. input,
-		L"\nBest output = ", Melder_integer (bestOutput), L": ", my tableaus [bestInput]. candidates [bestOutput]. output);
+	OTGrammar_getInterpretiveParse (me, GET_STRING (U"Partial output"), & bestInput, & bestOutput);
+	Melder_information (U"Best input = ", bestInput, U": ", my tableaus [bestInput]. input,
+		U"\nBest output = ", bestOutput, U": ", my tableaus [bestInput]. candidates [bestOutput]. output);
 END2 }
 
-FORM (OTGrammar_isPartialOutputGrammatical, L"Is partial output grammatical?", 0) {
-	SENTENCE (L"Partial output", L"")
+FORM (OTGrammar_isPartialOutputGrammatical, U"Is partial output grammatical?", 0) {
+	SENTENCE (U"Partial output", U"")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	Melder_information (Melder_integer (OTGrammar_isPartialOutputGrammatical (me, GET_STRING (L"Partial output"))));
+	Melder_information ((int) OTGrammar_isPartialOutputGrammatical (me, GET_STRING (U"Partial output")));   // "0" or "1"
 END2 }
 
-FORM (OTGrammar_isPartialOutputSinglyGrammatical, L"Is partial output singly grammatical?", 0) {
-	SENTENCE (L"Partial output", L"")
+FORM (OTGrammar_isPartialOutputSinglyGrammatical, U"Is partial output singly grammatical?", 0) {
+	SENTENCE (U"Partial output", U"")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	Melder_information (Melder_integer (OTGrammar_isPartialOutputSinglyGrammatical (me, GET_STRING (L"Partial output"))));
+	Melder_information ((int) OTGrammar_isPartialOutputSinglyGrammatical (me, GET_STRING (U"Partial output")));   // "0" or "1"
 END2 }
 
 #pragma mark -
 
-FORM (OTGrammar_generateInputs, L"Generate inputs", L"OTGrammar: Generate inputs...") {
-	NATURAL (L"Number of trials", L"1000")
+FORM (OTGrammar_generateInputs, U"Generate inputs", U"OTGrammar: Generate inputs...") {
+	NATURAL (U"Number of trials", U"1000")
 	OK2
 DO
 	LOOP {
 		iam (OTGrammar);
-		autoStrings thee = OTGrammar_generateInputs (me, GET_INTEGER (L"Number of trials"));
-		praat_new (thee.transfer(), my name, L"_in");
+		autoStrings thee = OTGrammar_generateInputs (me, GET_INTEGER (U"Number of trials"));
+		praat_new (thee.transfer(), my name, U"_in");
 	}
 END2 }
 
@@ -711,7 +715,7 @@ DIRECT2 (OTGrammar_getInputs) {
 	LOOP {
 		iam (OTGrammar);
 		autoStrings thee = OTGrammar_getInputs (me);
-		praat_new (thee.transfer(), my name, L"_in");
+		praat_new (thee.transfer(), my name, U"_in");
 	}
 END2 }
 
@@ -719,7 +723,7 @@ DIRECT2 (OTGrammar_measureTypology) {
 	LOOP try {
 		iam (OTGrammar);
 		autoDistributions thee = OTGrammar_measureTypology (me);
-		praat_new (thee.transfer(), my name, L"_out");
+		praat_new (thee.transfer(), my name, U"_out");
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (OBJECT);
@@ -729,51 +733,51 @@ END2 }
 
 #pragma mark Evaluate
 
-FORM (OTGrammar_evaluate, L"OTGrammar: Evaluate", 0) {
-	REAL (L"Evaluation noise", L"2.0")
+FORM (OTGrammar_evaluate, U"OTGrammar: Evaluate", 0) {
+	REAL (U"Evaluation noise", U"2.0")
 	OK2
 DO
 	LOOP {
 		iam (OTGrammar);
-		OTGrammar_newDisharmonies (me, GET_REAL (L"Evaluation noise"));
+		OTGrammar_newDisharmonies (me, GET_REAL (U"Evaluation noise"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (OTGrammar_inputToOutput, L"OTGrammar: Input to output", L"OTGrammar: Input to output...") {
-	SENTENCE (L"Input form", L"")
-	REAL (L"Evaluation noise", L"2.0")
+FORM (OTGrammar_inputToOutput, U"OTGrammar: Input to output", U"OTGrammar: Input to output...") {
+	SENTENCE (U"Input form", U"")
+	REAL (U"Evaluation noise", U"2.0")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	wchar_t output [100];
-	OTGrammar_inputToOutput (me, GET_STRING (L"Input form"), output, GET_REAL (L"Evaluation noise"));
+	char32 output [100];
+	OTGrammar_inputToOutput (me, GET_STRING (U"Input form"), output, GET_REAL (U"Evaluation noise"));
 	Melder_information (output);
 	praat_dataChanged (me);
 END2 }
 
-FORM (OTGrammar_inputToOutputs, L"OTGrammar: Input to outputs", L"OTGrammar: Input to outputs...") {
-	NATURAL (L"Trials", L"1000")
-	REAL (L"Evaluation noise", L"2.0")
-	SENTENCE (L"Input form", L"")
+FORM (OTGrammar_inputToOutputs, U"OTGrammar: Input to outputs", U"OTGrammar: Input to outputs...") {
+	NATURAL (U"Trials", U"1000")
+	REAL (U"Evaluation noise", U"2.0")
+	SENTENCE (U"Input form", U"")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
-	autoStrings thee = OTGrammar_inputToOutputs (me, GET_STRING (L"Input form"), GET_INTEGER (L"Trials"), GET_REAL (L"Evaluation noise"));
-	praat_new (thee.transfer(), my name, L"_out");
+	autoStrings thee = OTGrammar_inputToOutputs (me, GET_STRING (U"Input form"), GET_INTEGER (U"Trials"), GET_REAL (U"Evaluation noise"));
+	praat_new (thee.transfer(), my name, U"_out");
 	praat_dataChanged (me);
 END2 }
 
-FORM (OTGrammar_to_Distributions, L"OTGrammar: Compute output distributions", L"OTGrammar: To output Distributions...") {
-	NATURAL (L"Trials per input", L"100000")
-	REAL (L"Evaluation noise", L"2.0")
+FORM (OTGrammar_to_Distributions, U"OTGrammar: Compute output distributions", U"OTGrammar: To output Distributions...") {
+	NATURAL (U"Trials per input", U"100000")
+	REAL (U"Evaluation noise", U"2.0")
 	OK2
 DO
 	LOOP {
 		iam (OTGrammar);
 		try {
-			autoDistributions thee = OTGrammar_to_Distribution (me, GET_INTEGER (L"Trials per input"), GET_REAL (L"Evaluation noise"));
-			praat_new (thee.transfer(), my name, L"_out");
+			autoDistributions thee = OTGrammar_to_Distribution (me, GET_INTEGER (U"Trials per input"), GET_REAL (U"Evaluation noise"));
+			praat_new (thee.transfer(), my name, U"_out");
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);
@@ -782,15 +786,15 @@ DO
 	}
 END2 }
 
-FORM (OTGrammar_to_PairDistribution, L"OTGrammar: Compute output distributions", 0) {
-	NATURAL (L"Trials per input", L"100000")
-	REAL (L"Evaluation noise", L"2.0")
+FORM (OTGrammar_to_PairDistribution, U"OTGrammar: Compute output distributions", 0) {
+	NATURAL (U"Trials per input", U"100000")
+	REAL (U"Evaluation noise", U"2.0")
 	OK2
 DO
 	LOOP try {
 		iam (OTGrammar);
-		autoPairDistribution thee = OTGrammar_to_PairDistribution (me, GET_INTEGER (L"Trials per input"), GET_REAL (L"Evaluation noise"));
-		praat_new (thee.transfer(), my name, L"_out");
+		autoPairDistribution thee = OTGrammar_to_PairDistribution (me, GET_INTEGER (U"Trials per input"), GET_REAL (U"Evaluation noise"));
+		praat_new (thee.transfer(), my name, U"_out");
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (OBJECT);
@@ -800,71 +804,71 @@ END2 }
 
 #pragma mark Modify ranking
 
-FORM (OTGrammar_setRanking, L"OTGrammar: Set ranking", 0) {
-	NATURAL (L"Constraint", L"1")
-	REAL (L"Ranking", L"100.0")
-	REAL (L"Disharmony", L"100.0")
+FORM (OTGrammar_setRanking, U"OTGrammar: Set ranking", 0) {
+	NATURAL (U"Constraint", U"1")
+	REAL (U"Ranking", U"100.0")
+	REAL (U"Disharmony", U"100.0")
 	OK2
 DO
 	LOOP {
 		iam (OTGrammar);
-		OTGrammar_setRanking (me, GET_INTEGER (L"Constraint"), GET_REAL (L"Ranking"), GET_REAL (L"Disharmony"));
+		OTGrammar_setRanking (me, GET_INTEGER (U"Constraint"), GET_REAL (U"Ranking"), GET_REAL (U"Disharmony"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (OTGrammar_resetAllRankings, L"OTGrammar: Reset all rankings", 0) {
-	REAL (L"Ranking", L"100.0")
+FORM (OTGrammar_resetAllRankings, U"OTGrammar: Reset all rankings", 0) {
+	REAL (U"Ranking", U"100.0")
 	OK2
 DO
 	LOOP {
 		iam (OTGrammar);
-		OTGrammar_reset (me, GET_REAL (L"Ranking"));
+		OTGrammar_reset (me, GET_REAL (U"Ranking"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (OTGrammar_resetToRandomRanking, L"OTGrammar: Reset to random ranking", 0) {
-	REAL (L"Mean", L"10.0")
-	POSITIVE (L"Standard deviation", L"0.0001")
+FORM (OTGrammar_resetToRandomRanking, U"OTGrammar: Reset to random ranking", 0) {
+	REAL (U"Mean", U"10.0")
+	POSITIVE (U"Standard deviation", U"0.0001")
 	OK2
 DO
 	LOOP {
 		iam (OTGrammar);
-		OTGrammar_resetToRandomRanking (me, GET_REAL (L"Mean"), GET_REAL (L"Standard deviation"));
+		OTGrammar_resetToRandomRanking (me, GET_REAL (U"Mean"), GET_REAL (U"Standard deviation"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (OTGrammar_resetToRandomTotalRanking, L"OTGrammar: Reset to random total ranking", 0) {
-	REAL (L"Maximum ranking", L"100.0")
-	POSITIVE (L"Ranking distance", L"1.0")
+FORM (OTGrammar_resetToRandomTotalRanking, U"OTGrammar: Reset to random total ranking", 0) {
+	REAL (U"Maximum ranking", U"100.0")
+	POSITIVE (U"Ranking distance", U"1.0")
 	OK2
 DO
 	LOOP {
 		iam (OTGrammar);
-		OTGrammar_resetToRandomTotalRanking (me, GET_REAL (L"Maximum ranking"), GET_REAL (L"Ranking distance"));
+		OTGrammar_resetToRandomTotalRanking (me, GET_REAL (U"Maximum ranking"), GET_REAL (U"Ranking distance"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (OTGrammar_learnOne, L"OTGrammar: Learn one", L"OTGrammar: Learn one...") {
-	SENTENCE (L"Input string", L"")
-	SENTENCE (L"Output string", L"")
-	REAL (L"Evaluation noise", L"2.0")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	REAL (L"Plasticity", L"0.1")
-	REAL (L"Rel. plasticity spreading", L"0.1")
-	BOOLEAN (L"Honour local rankings", 1)
+FORM (OTGrammar_learnOne, U"OTGrammar: Learn one", U"OTGrammar: Learn one...") {
+	SENTENCE (U"Input string", U"")
+	SENTENCE (U"Output string", U"")
+	REAL (U"Evaluation noise", U"2.0")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	REAL (U"Plasticity", U"0.1")
+	REAL (U"Rel. plasticity spreading", U"0.1")
+	BOOLEAN (U"Honour local rankings", 1)
 	OK2
 DO
 	LOOP try {
 		iam (OTGrammar);
-		OTGrammar_learnOne (me, GET_STRING (L"Input string"), GET_STRING (L"Output string"),
-			GET_REAL (L"Evaluation noise"),
-			GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"),
-			GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Plasticity"), GET_REAL (L"Rel. plasticity spreading"), TRUE, TRUE, NULL);
+		OTGrammar_learnOne (me, GET_STRING (U"Input string"), GET_STRING (U"Output string"),
+			GET_REAL (U"Evaluation noise"),
+			GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"),
+			GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Plasticity"), GET_REAL (U"Rel. plasticity spreading"), true, true, nullptr);
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (OBJECT);
@@ -872,24 +876,24 @@ DO
 	}
 END2 }
 
-FORM (OTGrammar_learnOneFromPartialOutput, L"OTGrammar: Learn one from partial adult output", 0) {
-	LABEL (L"", L"Partial adult surface form (e.g. overt form):")
-	SENTENCE (L"Partial output", L"")
-	REAL (L"Evaluation noise", L"2.0")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	REAL (L"Plasticity", L"0.1")
-	REAL (L"Rel. plasticity spreading", L"0.1")
-	BOOLEAN (L"Honour local rankings", 1)
-	NATURAL (L"Number of chews", L"1")
+FORM (OTGrammar_learnOneFromPartialOutput, U"OTGrammar: Learn one from partial adult output", 0) {
+	LABEL (U"", U"Partial adult surface form (e.g. overt form):")
+	SENTENCE (U"Partial output", U"")
+	REAL (U"Evaluation noise", U"2.0")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	REAL (U"Plasticity", U"0.1")
+	REAL (U"Rel. plasticity spreading", U"0.1")
+	BOOLEAN (U"Honour local rankings", 1)
+	NATURAL (U"Number of chews", U"1")
 	OK2
 DO
 	LOOP try {
 		iam (OTGrammar);
-		OTGrammar_learnOneFromPartialOutput (me, GET_STRING (L"Partial output"),
-			GET_REAL (L"Evaluation noise"),
-			GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"),
-			GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Plasticity"), GET_REAL (L"Rel. plasticity spreading"), GET_INTEGER (L"Number of chews"), TRUE);
+		OTGrammar_learnOneFromPartialOutput (me, GET_STRING (U"Partial output"),
+			GET_REAL (U"Evaluation noise"),
+			GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"),
+			GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Plasticity"), GET_REAL (U"Rel. plasticity spreading"), GET_INTEGER (U"Number of chews"), true);
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (OBJECT);
@@ -899,96 +903,96 @@ END2 }
 
 #pragma mark Modify behaviour
 
-FORM (OTGrammar_setDecisionStrategy, L"OTGrammar: Set decision strategy", 0) {
-	RADIO_ENUM (L"Decision strategy", kOTGrammar_decisionStrategy, DEFAULT)
+FORM (OTGrammar_setDecisionStrategy, U"OTGrammar: Set decision strategy", 0) {
+	RADIO_ENUM (U"Decision strategy", kOTGrammar_decisionStrategy, DEFAULT)
 	OK2
 iam_ONLY (OTGrammar);
-SET_ENUM (L"Decision strategy", kOTGrammar_decisionStrategy, my decisionStrategy);
+SET_ENUM (U"Decision strategy", kOTGrammar_decisionStrategy, my decisionStrategy);
 DO
 	iam_ONLY (OTGrammar);
-	my decisionStrategy = GET_ENUM (kOTGrammar_decisionStrategy, L"Decision strategy");
+	my decisionStrategy = GET_ENUM (kOTGrammar_decisionStrategy, U"Decision strategy");
 	praat_dataChanged (me);
 END2 }
 
-FORM (OTGrammar_setLeak, L"OTGrammar: Set leak", 0) {
-	REAL (L"Leak", L"0.0")
+FORM (OTGrammar_setLeak, U"OTGrammar: Set leak", 0) {
+	REAL (U"Leak", U"0.0")
 	OK2
 iam_ONLY (OTGrammar);
-SET_REAL (L"Leak", my leak);
+SET_REAL (U"Leak", my leak);
 DO
 	iam_ONLY (OTGrammar);
-	my leak = GET_REAL (L"Leak");
+	my leak = GET_REAL (U"Leak");
 	praat_dataChanged (me);
 END2 }
 
-FORM (OTGrammar_setConstraintPlasticity, L"OTGrammar: Set constraint plasticity", 0) {
-	NATURAL (L"Constraint", L"1")
-	REAL (L"Plasticity", L"1.0")
+FORM (OTGrammar_setConstraintPlasticity, U"OTGrammar: Set constraint plasticity", 0) {
+	NATURAL (U"Constraint", U"1")
+	REAL (U"Plasticity", U"1.0")
 	OK2
 DO
 	LOOP {
 		iam (OTGrammar);
-		OTGrammar_setConstraintPlasticity (me, GET_INTEGER (L"Constraint"), GET_REAL (L"Plasticity"));
+		OTGrammar_setConstraintPlasticity (me, GET_INTEGER (U"Constraint"), GET_REAL (U"Plasticity"));
 		praat_dataChanged (OBJECT);
 	}
 END2 }
 
 #pragma mark Modify structure
 
-FORM (OTGrammar_removeConstraint, L"OTGrammar: Remove constraint", 0) {
-	SENTENCE (L"Constraint name", L"")
+FORM (OTGrammar_removeConstraint, U"OTGrammar: Remove constraint", 0) {
+	SENTENCE (U"Constraint name", U"")
 	OK2
 DO
 	LOOP {
 		iam (OTGrammar);
-		OTGrammar_removeConstraint (me, GET_STRING (L"Constraint name"));
+		OTGrammar_removeConstraint (me, GET_STRING (U"Constraint name"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (OTGrammar_removeHarmonicallyBoundedCandidates, L"OTGrammar: Remove harmonically bounded candidates", 0) {
-	BOOLEAN (L"Singly", 0)
+FORM (OTGrammar_removeHarmonicallyBoundedCandidates, U"OTGrammar: Remove harmonically bounded candidates", 0) {
+	BOOLEAN (U"Singly", 0)
 	OK2
 DO
 	LOOP {
 		iam (OTGrammar);
-		OTGrammar_removeHarmonicallyBoundedCandidates (me, GET_INTEGER (L"Singly"));
+		OTGrammar_removeHarmonicallyBoundedCandidates (me, GET_INTEGER (U"Singly"));
 		praat_dataChanged (me);
 	}
 END2 }
 
 #pragma mark OTGRAMMAR & STRINGS
 
-FORM (OTGrammar_Strings_inputsToOutputs, L"OTGrammar: Inputs to outputs", L"OTGrammar: Inputs to outputs...") {
-	REAL (L"Evaluation noise", L"2.0")
+FORM (OTGrammar_Strings_inputsToOutputs, U"OTGrammar: Inputs to outputs", U"OTGrammar: Inputs to outputs...") {
+	REAL (U"Evaluation noise", U"2.0")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (Strings);
-	autoStrings him = OTGrammar_inputsToOutputs (me, thee, GET_REAL (L"Evaluation noise"));
-	praat_new (him.transfer(), my name, L"_out");
+	autoStrings him = OTGrammar_inputsToOutputs (me, thee, GET_REAL (U"Evaluation noise"));
+	praat_new (him.transfer(), my name, U"_out");
 	praat_dataChanged (me);
 END2 }
 
 DIRECT2 (OTGrammar_Strings_areAllPartialOutputsGrammatical) {
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (Strings);
-	Melder_information (Melder_integer (OTGrammar_areAllPartialOutputsGrammatical (me, thee)));
+	Melder_information ((int) OTGrammar_areAllPartialOutputsGrammatical (me, thee));   // "0" or "1"
 END2 }
 
 DIRECT2 (OTGrammar_Strings_areAllPartialOutputsSinglyGrammatical) {
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (Strings);
-	Melder_information (Melder_integer (OTGrammar_areAllPartialOutputsSinglyGrammatical (me, thee)));
+	Melder_information ((int) OTGrammar_areAllPartialOutputsSinglyGrammatical (me, thee));   // "0" or "1"
 END2 }
 
-FORM (OTGrammar_Stringses_learn, L"OTGrammar: Learn", L"OTGrammar & 2 Strings: Learn...") {
-	REAL (L"Evaluation noise", L"2.0")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	REAL (L"Plasticity", L"0.1")
-	REAL (L"Rel. plasticity spreading", L"0.1")
-	BOOLEAN (L"Honour local rankings", 1)
-	NATURAL (L"Number of chews", L"1")
+FORM (OTGrammar_Stringses_learn, U"OTGrammar: Learn", U"OTGrammar & 2 Strings: Learn...") {
+	REAL (U"Evaluation noise", U"2.0")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	REAL (U"Plasticity", U"0.1")
+	REAL (U"Rel. plasticity spreading", U"0.1")
+	BOOLEAN (U"Honour local rankings", 1)
+	NATURAL (U"Number of chews", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
@@ -996,10 +1000,10 @@ DO
 	WHERE (SELECTED && CLASS == classStrings) { if (! inputs) inputs = (Strings) OBJECT; else outputs = (Strings) OBJECT; }
 	try {
 		OTGrammar_learn (me, inputs, outputs,
-			GET_REAL (L"Evaluation noise"),
-			GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"),
-			GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Plasticity"), GET_REAL (L"Rel. plasticity spreading"), GET_INTEGER (L"Number of chews"));
+			GET_REAL (U"Evaluation noise"),
+			GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"),
+			GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Plasticity"), GET_REAL (U"Rel. plasticity spreading"), GET_INTEGER (U"Number of chews"));
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (me);   // partial change
@@ -1007,14 +1011,14 @@ DO
 	}
 END2 }
 
-FORM (OTGrammar_Strings_learnFromPartialOutputs, L"OTGrammar: Learn from partial adult outputs", 0) {
-	REAL (L"Evaluation noise", L"2.0")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	REAL (L"Plasticity", L"0.1")
-	REAL (L"Rel. plasticity spreading", L"0.1")
-	BOOLEAN (L"Honour local rankings", 1)
-	NATURAL (L"Number of chews", L"1")
-	INTEGER (L"Store history every", L"0")
+FORM (OTGrammar_Strings_learnFromPartialOutputs, U"OTGrammar: Learn from partial adult outputs", 0) {
+	REAL (U"Evaluation noise", U"2.0")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	REAL (U"Plasticity", U"0.1")
+	REAL (U"Rel. plasticity spreading", U"0.1")
+	BOOLEAN (U"Honour local rankings", 1)
+	NATURAL (U"Number of chews", U"1")
+	INTEGER (U"Store history every", U"0")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
@@ -1022,15 +1026,15 @@ DO
 	OTHistory history = NULL;
 	try {
 		OTGrammar_learnFromPartialOutputs (me, thee,
-			GET_REAL (L"Evaluation noise"),
-			GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"),
-			GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Plasticity"), GET_REAL (L"Rel. plasticity spreading"), GET_INTEGER (L"Number of chews"),
-			GET_INTEGER (L"Store history every"), & history);
+			GET_REAL (U"Evaluation noise"),
+			GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"),
+			GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Plasticity"), GET_REAL (U"Rel. plasticity spreading"), GET_INTEGER (U"Number of chews"),
+			GET_INTEGER (U"Store history every"), & history);
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (me);   // e.g. in case of partial learning
-		Melder_flushError (NULL);
+		Melder_flushError ();
 		// trickle down to save history
 	}
 	if (history) praat_new (history, my name);
@@ -1038,182 +1042,182 @@ END2 }
 
 #pragma mark OTGRAMMAR & DISTRIBUTIONS
 
-FORM (OTGrammar_Distributions_getFractionCorrect, L"OTGrammar & Distributions: Get fraction correct...", 0) {
-	NATURAL (L"Column number", L"1")
-	REAL (L"Evaluation noise", L"2.0")
-	INTEGER (L"Replications", L"100000")
+FORM (OTGrammar_Distributions_getFractionCorrect, U"OTGrammar & Distributions: Get fraction correct...", 0) {
+	NATURAL (U"Column number", U"1")
+	REAL (U"Evaluation noise", U"2.0")
+	INTEGER (U"Replications", U"100000")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (Distributions);
-	double result = OTGrammar_Distributions_getFractionCorrect (me, thee, GET_INTEGER (L"Column number"),
-		GET_REAL (L"Evaluation noise"), GET_INTEGER (L"Replications"));
+	double result = OTGrammar_Distributions_getFractionCorrect (me, thee, GET_INTEGER (U"Column number"),
+		GET_REAL (U"Evaluation noise"), GET_INTEGER (U"Replications"));
 	praat_dataChanged (me);
 	Melder_informationReal (result, NULL);
 END2 }
 
-FORM (OTGrammar_Distributions_learnFromPartialOutputs, L"OTGrammar & Distributions: Learn from partial outputs", L"OT learning 6. Shortcut to grammar learning") {
-	NATURAL (L"Column number", L"1")
-	REAL (L"Evaluation noise", L"2.0")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	REAL (L"Initial plasticity", L"1.0")
-	NATURAL (L"Replications per plasticity", L"100000")
-	REAL (L"Plasticity decrement", L"0.1")
-	NATURAL (L"Number of plasticities", L"4")
-	REAL (L"Rel. plasticity spreading", L"0.1")
-	BOOLEAN (L"Honour local rankings", 1)
-	NATURAL (L"Number of chews", L"1")
-	INTEGER (L"Store history every", L"0")
+FORM (OTGrammar_Distributions_learnFromPartialOutputs, U"OTGrammar & Distributions: Learn from partial outputs", U"OT learning 6. Shortcut to grammar learning") {
+	NATURAL (U"Column number", U"1")
+	REAL (U"Evaluation noise", U"2.0")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	REAL (U"Initial plasticity", U"1.0")
+	NATURAL (U"Replications per plasticity", U"100000")
+	REAL (U"Plasticity decrement", U"0.1")
+	NATURAL (U"Number of plasticities", U"4")
+	REAL (U"Rel. plasticity spreading", U"0.1")
+	BOOLEAN (U"Honour local rankings", 1)
+	NATURAL (U"Number of chews", U"1")
+	INTEGER (U"Store history every", U"0")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (Distributions);
 	OTHistory history = NULL;
 	try {
-		OTGrammar_Distributions_learnFromPartialOutputs (me, thee, GET_INTEGER (L"Column number"),
-			GET_REAL (L"Evaluation noise"),
-			GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"),
-			GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Initial plasticity"), GET_INTEGER (L"Replications per plasticity"),
-			GET_REAL (L"Plasticity decrement"), GET_INTEGER (L"Number of plasticities"),
-			GET_REAL (L"Rel. plasticity spreading"), GET_INTEGER (L"Number of chews"),
-			GET_INTEGER (L"Store history every"), & history, false, false, 0);
+		OTGrammar_Distributions_learnFromPartialOutputs (me, thee, GET_INTEGER (U"Column number"),
+			GET_REAL (U"Evaluation noise"),
+			GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"),
+			GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Initial plasticity"), GET_INTEGER (U"Replications per plasticity"),
+			GET_REAL (U"Plasticity decrement"), GET_INTEGER (U"Number of plasticities"),
+			GET_REAL (U"Rel. plasticity spreading"), GET_INTEGER (U"Number of chews"),
+			GET_INTEGER (U"Store history every"), & history, false, false, 0);
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (me);
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 	if (history) praat_new (history, my name);
 END2 }
 
-FORM (OTGrammar_Distributions_learnFromPartialOutputs_rrip, L"OTGrammar & Distributions: Learn from partial outputs (rrip)", L"OT learning 6. Shortcut to grammar learning") {
-	NATURAL (L"Column number", L"1")
-	REAL (L"Evaluation noise", L"2.0")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	REAL (L"Initial plasticity", L"1.0")
-	NATURAL (L"Replications per plasticity", L"100000")
-	REAL (L"Plasticity decrement", L"0.1")
-	NATURAL (L"Number of plasticities", L"4")
-	REAL (L"Rel. plasticity spreading", L"0.1")
-	BOOLEAN (L"Honour local rankings", 1)
-	NATURAL (L"Number of chews", L"1")
-	INTEGER (L"Store history every", L"0")
+FORM (OTGrammar_Distributions_learnFromPartialOutputs_rrip, U"OTGrammar & Distributions: Learn from partial outputs (rrip)", U"OT learning 6. Shortcut to grammar learning") {
+	NATURAL (U"Column number", U"1")
+	REAL (U"Evaluation noise", U"2.0")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	REAL (U"Initial plasticity", U"1.0")
+	NATURAL (U"Replications per plasticity", U"100000")
+	REAL (U"Plasticity decrement", U"0.1")
+	NATURAL (U"Number of plasticities", U"4")
+	REAL (U"Rel. plasticity spreading", U"0.1")
+	BOOLEAN (U"Honour local rankings", 1)
+	NATURAL (U"Number of chews", U"1")
+	INTEGER (U"Store history every", U"0")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (Distributions);
 	OTHistory history = NULL;
 	try {
-		OTGrammar_Distributions_learnFromPartialOutputs (me, thee, GET_INTEGER (L"Column number"),
-			GET_REAL (L"Evaluation noise"),
-			GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"),
-			GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Initial plasticity"), GET_INTEGER (L"Replications per plasticity"),
-			GET_REAL (L"Plasticity decrement"), GET_INTEGER (L"Number of plasticities"),
-			GET_REAL (L"Rel. plasticity spreading"), GET_INTEGER (L"Number of chews"),
-			GET_INTEGER (L"Store history every"), & history, true, true, 0);
+		OTGrammar_Distributions_learnFromPartialOutputs (me, thee, GET_INTEGER (U"Column number"),
+			GET_REAL (U"Evaluation noise"),
+			GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"),
+			GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Initial plasticity"), GET_INTEGER (U"Replications per plasticity"),
+			GET_REAL (U"Plasticity decrement"), GET_INTEGER (U"Number of plasticities"),
+			GET_REAL (U"Rel. plasticity spreading"), GET_INTEGER (U"Number of chews"),
+			GET_INTEGER (U"Store history every"), & history, true, true, 0);
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (me);
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 	if (history) praat_new (history, my name);
 END2 }
 
-FORM (OTGrammar_Distributions_learnFromPartialOutputs_eip, L"OTGrammar & Distributions: Learn from partial outputs (eip)", L"OT learning 6. Shortcut to grammar learning") {
-	NATURAL (L"Column number", L"1")
-	REAL (L"Evaluation noise", L"2.0")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	REAL (L"Initial plasticity", L"1.0")
-	NATURAL (L"Replications per plasticity", L"100000")
-	REAL (L"Plasticity decrement", L"0.1")
-	NATURAL (L"Number of plasticities", L"4")
-	REAL (L"Rel. plasticity spreading", L"0.1")
-	BOOLEAN (L"Honour local rankings", 1)
-	NATURAL (L"Number of chews", L"1")
-	INTEGER (L"Store history every", L"0")
+FORM (OTGrammar_Distributions_learnFromPartialOutputs_eip, U"OTGrammar & Distributions: Learn from partial outputs (eip)", U"OT learning 6. Shortcut to grammar learning") {
+	NATURAL (U"Column number", U"1")
+	REAL (U"Evaluation noise", U"2.0")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	REAL (U"Initial plasticity", U"1.0")
+	NATURAL (U"Replications per plasticity", U"100000")
+	REAL (U"Plasticity decrement", U"0.1")
+	NATURAL (U"Number of plasticities", U"4")
+	REAL (U"Rel. plasticity spreading", U"0.1")
+	BOOLEAN (U"Honour local rankings", 1)
+	NATURAL (U"Number of chews", U"1")
+	INTEGER (U"Store history every", U"0")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (Distributions);
 	OTHistory history = NULL;
 	try {
-		OTGrammar_Distributions_learnFromPartialOutputs (me, thee, GET_INTEGER (L"Column number"),
-			GET_REAL (L"Evaluation noise"),
-			GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"),
-			GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Initial plasticity"), GET_INTEGER (L"Replications per plasticity"),
-			GET_REAL (L"Plasticity decrement"), GET_INTEGER (L"Number of plasticities"),
-			GET_REAL (L"Rel. plasticity spreading"), GET_INTEGER (L"Number of chews"),
-			GET_INTEGER (L"Store history every"), & history, true, true, 1000);
+		OTGrammar_Distributions_learnFromPartialOutputs (me, thee, GET_INTEGER (U"Column number"),
+			GET_REAL (U"Evaluation noise"),
+			GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"),
+			GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Initial plasticity"), GET_INTEGER (U"Replications per plasticity"),
+			GET_REAL (U"Plasticity decrement"), GET_INTEGER (U"Number of plasticities"),
+			GET_REAL (U"Rel. plasticity spreading"), GET_INTEGER (U"Number of chews"),
+			GET_INTEGER (U"Store history every"), & history, true, true, 1000);
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (me);
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 	if (history) praat_new (history, my name);
 END2 }
 
-FORM (OTGrammar_Distributions_learnFromPartialOutputs_wrip, L"OTGrammar & Distributions: Learn from partial outputs (wrip)", L"OT learning 6. Shortcut to grammar learning") {
-	NATURAL (L"Column number", L"1")
-	REAL (L"Evaluation noise", L"2.0")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	REAL (L"Initial plasticity", L"1.0")
-	NATURAL (L"Replications per plasticity", L"100000")
-	REAL (L"Plasticity decrement", L"0.1")
-	NATURAL (L"Number of plasticities", L"4")
-	REAL (L"Rel. plasticity spreading", L"0.1")
-	BOOLEAN (L"Honour local rankings", 1)
-	NATURAL (L"Number of chews", L"1")
-	INTEGER (L"Store history every", L"0")
+FORM (OTGrammar_Distributions_learnFromPartialOutputs_wrip, U"OTGrammar & Distributions: Learn from partial outputs (wrip)", U"OT learning 6. Shortcut to grammar learning") {
+	NATURAL (U"Column number", U"1")
+	REAL (U"Evaluation noise", U"2.0")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	REAL (U"Initial plasticity", U"1.0")
+	NATURAL (U"Replications per plasticity", U"100000")
+	REAL (U"Plasticity decrement", U"0.1")
+	NATURAL (U"Number of plasticities", U"4")
+	REAL (U"Rel. plasticity spreading", U"0.1")
+	BOOLEAN (U"Honour local rankings", 1)
+	NATURAL (U"Number of chews", U"1")
+	INTEGER (U"Store history every", U"0")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (Distributions);
 	OTHistory history = NULL;
 	try {
-		OTGrammar_Distributions_learnFromPartialOutputs (me, thee, GET_INTEGER (L"Column number"),
-			GET_REAL (L"Evaluation noise"),
-			GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"),
-			GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Initial plasticity"), GET_INTEGER (L"Replications per plasticity"),
-			GET_REAL (L"Plasticity decrement"), GET_INTEGER (L"Number of plasticities"),
-			GET_REAL (L"Rel. plasticity spreading"), GET_INTEGER (L"Number of chews"),
-			GET_INTEGER (L"Store history every"), & history, true, true, 1);
+		OTGrammar_Distributions_learnFromPartialOutputs (me, thee, GET_INTEGER (U"Column number"),
+			GET_REAL (U"Evaluation noise"),
+			GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"),
+			GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Initial plasticity"), GET_INTEGER (U"Replications per plasticity"),
+			GET_REAL (U"Plasticity decrement"), GET_INTEGER (U"Number of plasticities"),
+			GET_REAL (U"Rel. plasticity spreading"), GET_INTEGER (U"Number of chews"),
+			GET_INTEGER (U"Store history every"), & history, true, true, 1);
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (me);
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 	if (history) praat_new (history, my name);
 END2 }
 
-FORM (OTGrammar_Distributions_listObligatoryRankings, L"OTGrammar & Distributions: Get fraction correct...", 0) {
-	NATURAL (L"Column number", L"1")
+FORM (OTGrammar_Distributions_listObligatoryRankings, U"OTGrammar & Distributions: Get fraction correct...", 0) {
+	NATURAL (U"Column number", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (Distributions);
-	OTGrammar_Distributions_listObligatoryRankings (me, thee, GET_INTEGER (L"Column number"));
+	OTGrammar_Distributions_listObligatoryRankings (me, thee, GET_INTEGER (U"Column number"));
 END2 }
 
 #pragma mark OTGRAMMAR & PAIRDISTRIBUTION
 
-FORM (OTGrammar_PairDistribution_findPositiveWeights, L"OTGrammar & PairDistribution: Find positive weights", L"OTGrammar & PairDistribution: Find positive weights...") {
-	POSITIVE (L"Weight floor", L"1.0")
-	POSITIVE (L"Margin of separation", L"1.0")
+FORM (OTGrammar_PairDistribution_findPositiveWeights, U"OTGrammar & PairDistribution: Find positive weights", U"OTGrammar & PairDistribution: Find positive weights...") {
+	POSITIVE (U"Weight floor", U"1.0")
+	POSITIVE (U"Margin of separation", U"1.0")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (PairDistribution);
 	OTGrammar_PairDistribution_findPositiveWeights_e (me, thee,
-		GET_REAL (L"Weight floor"), GET_REAL (L"Margin of separation"));
+		GET_REAL (U"Weight floor"), GET_REAL (U"Margin of separation"));
 	praat_dataChanged (me);
 END2 }
 
-FORM (OTGrammar_PairDistribution_getFractionCorrect, L"OTGrammar & PairDistribution: Get fraction correct...", 0) {
-	REAL (L"Evaluation noise", L"2.0")
-	INTEGER (L"Replications", L"100000")
+FORM (OTGrammar_PairDistribution_getFractionCorrect, U"OTGrammar & PairDistribution: Get fraction correct...", 0) {
+	REAL (U"Evaluation noise", U"2.0")
+	INTEGER (U"Replications", U"100000")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
@@ -1221,7 +1225,7 @@ DO
 	double result;
 	try {
 		result = OTGrammar_PairDistribution_getFractionCorrect (me, thee,
-			GET_REAL (L"Evaluation noise"), GET_INTEGER (L"Replications"));
+			GET_REAL (U"Evaluation noise"), GET_INTEGER (U"Replications"));
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (me);
@@ -1230,9 +1234,9 @@ DO
 	Melder_informationReal (result, NULL);
 END2 }
 
-FORM (OTGrammar_PairDistribution_getMinimumNumberCorrect, L"OTGrammar & PairDistribution: Get minimum number correct...", 0) {
-	REAL (L"Evaluation noise", L"2.0")
-	INTEGER (L"Replications per input", L"1000")
+FORM (OTGrammar_PairDistribution_getMinimumNumberCorrect, U"OTGrammar & PairDistribution: Get minimum number correct...", 0) {
+	REAL (U"Evaluation noise", U"2.0")
+	INTEGER (U"Replications per input", U"1000")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
@@ -1240,35 +1244,35 @@ DO
 	long result;
 	try {
 		result = OTGrammar_PairDistribution_getMinimumNumberCorrect (me, thee,
-			GET_REAL (L"Evaluation noise"), GET_INTEGER (L"Replications per input"));
+			GET_REAL (U"Evaluation noise"), GET_INTEGER (U"Replications per input"));
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (me);
 		throw;
 	}
-	Melder_information (Melder_integer (result));
+	Melder_information (result);
 END2 }
 
-FORM (OTGrammar_PairDistribution_learn, L"OTGrammar & PairDistribution: Learn", L"OT learning 6. Shortcut to grammar learning") {
-	REAL (L"Evaluation noise", L"2.0")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	POSITIVE (L"Initial plasticity", L"1.0")
-	NATURAL (L"Replications per plasticity", L"100000")
-	REAL (L"Plasticity decrement", L"0.1")
-	NATURAL (L"Number of plasticities", L"4")
-	REAL (L"Rel. plasticity spreading", L"0.1")
-	BOOLEAN (L"Honour local rankings", 1)
-	NATURAL (L"Number of chews", L"1")
+FORM (OTGrammar_PairDistribution_learn, U"OTGrammar & PairDistribution: Learn", U"OT learning 6. Shortcut to grammar learning") {
+	REAL (U"Evaluation noise", U"2.0")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	POSITIVE (U"Initial plasticity", U"1.0")
+	NATURAL (U"Replications per plasticity", U"100000")
+	REAL (U"Plasticity decrement", U"0.1")
+	NATURAL (U"Number of plasticities", U"4")
+	REAL (U"Rel. plasticity spreading", U"0.1")
+	BOOLEAN (U"Honour local rankings", 1)
+	NATURAL (U"Number of chews", U"1")
 	OK2
 DO
 	iam_ONLY (OTGrammar);
 	thouart_ONLY (PairDistribution);
 	try {
 		OTGrammar_PairDistribution_learn (me, thee,
-			GET_REAL (L"Evaluation noise"), GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"), GET_INTEGER (L"Honour local rankings"),
-			GET_REAL (L"Initial plasticity"), GET_INTEGER (L"Replications per plasticity"),
-			GET_REAL (L"Plasticity decrement"), GET_INTEGER (L"Number of plasticities"),
-			GET_REAL (L"Rel. plasticity spreading"), GET_INTEGER (L"Number of chews"));
+			GET_REAL (U"Evaluation noise"), GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"), GET_INTEGER (U"Honour local rankings"),
+			GET_REAL (U"Initial plasticity"), GET_INTEGER (U"Replications per plasticity"),
+			GET_REAL (U"Plasticity decrement"), GET_INTEGER (U"Number of plasticities"),
+			GET_REAL (U"Rel. plasticity spreading"), GET_INTEGER (U"Number of chews"));
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (me);
@@ -1285,63 +1289,63 @@ END2 }
 #pragma mark -
 #pragma mark OTMULTI
 
-FORM (Create_multi_level_metrics_grammar, L"Create multi-level metrics grammar", 0) {
-	OPTIONMENU (L"Initial ranking", 1)
-		OPTION (L"Equal")
-		OPTION (L"Foot form high")
-		OPTION (L"WSP high")
-	OPTIONMENU (L"Trochaicity constraint", 1)
-		OPTION (L"FtNonfinal")
-		OPTION (L"Trochaic")
-	BOOLEAN (L"Include FootBimoraic", 0)
-	BOOLEAN (L"Include FootBisyllabic", 0)
-	BOOLEAN (L"Include Peripheral", 0)
-	OPTIONMENU (L"Nonfinality constraint", 1)
-		OPTION (L"Nonfinal")
-		OPTION (L"MainNonfinal")
-		OPTION (L"HeadNonfinal")
-	BOOLEAN (L"Overt forms have secondary stress", 1)
-	BOOLEAN (L"Include *Clash and *Lapse", 0)
-	BOOLEAN (L"Include codas", 0)
-	OK2
-DO
-	praat_new (OTMulti_create_metrics (GET_INTEGER (L"Initial ranking"), GET_INTEGER (L"Trochaicity constraint"),
-		GET_INTEGER (L"Include FootBimoraic"), GET_INTEGER (L"Include FootBisyllabic"),
-		GET_INTEGER (L"Include Peripheral"), GET_INTEGER (L"Nonfinality constraint"),
-		GET_INTEGER (L"Overt forms have secondary stress"), GET_INTEGER (L"Include *Clash and *Lapse"), GET_INTEGER (L"Include codas")),
-		GET_STRING (L"Initial ranking"));
-END2 }
-
-FORM (OTMulti_drawTableau, L"Draw tableau", L"OT learning") {
-	SENTENCE (L"Partial form 1", L"")
-	SENTENCE (L"Partial form 2", L"")
-	BOOLEAN (L"Show disharmonies", 1)
+FORM (Create_multi_level_metrics_grammar, U"Create multi-level metrics grammar", 0) {
+	OPTIONMENU (U"Initial ranking", 1)
+		OPTION (U"Equal")
+		OPTION (U"Foot form high")
+		OPTION (U"WSP high")
+	OPTIONMENU (U"Trochaicity constraint", 1)
+		OPTION (U"FtNonfinal")
+		OPTION (U"Trochaic")
+	BOOLEAN (U"Include FootBimoraic", 0)
+	BOOLEAN (U"Include FootBisyllabic", 0)
+	BOOLEAN (U"Include Peripheral", 0)
+	OPTIONMENU (U"Nonfinality constraint", 1)
+		OPTION (U"Nonfinal")
+		OPTION (U"MainNonfinal")
+		OPTION (U"HeadNonfinal")
+	BOOLEAN (U"Overt forms have secondary stress", 1)
+	BOOLEAN (U"Include *Clash and *Lapse", 0)
+	BOOLEAN (U"Include codas", 0)
+	OK2
+DO
+	praat_new (OTMulti_create_metrics (GET_INTEGER (U"Initial ranking"), GET_INTEGER (U"Trochaicity constraint"),
+		GET_INTEGER (U"Include FootBimoraic"), GET_INTEGER (U"Include FootBisyllabic"),
+		GET_INTEGER (U"Include Peripheral"), GET_INTEGER (U"Nonfinality constraint"),
+		GET_INTEGER (U"Overt forms have secondary stress"), GET_INTEGER (U"Include *Clash and *Lapse"), GET_INTEGER (U"Include codas")),
+		GET_STRING (U"Initial ranking"));
+END2 }
+
+FORM (OTMulti_drawTableau, U"Draw tableau", U"OT learning") {
+	SENTENCE (U"Partial form 1", U"")
+	SENTENCE (U"Partial form 2", U"")
+	BOOLEAN (U"Show disharmonies", 1)
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (OTMulti);
-		OTMulti_drawTableau (me, GRAPHICS, GET_STRING (L"Partial form 1"), GET_STRING (L"Partial form 2"),
-			false, GET_INTEGER (L"Show disharmonies"));
+		OTMulti_drawTableau (me, GRAPHICS, GET_STRING (U"Partial form 1"), GET_STRING (U"Partial form 2"),
+			false, GET_INTEGER (U"Show disharmonies"));
 	}
 END2 }
 
-FORM (OTMulti_drawTableau_narrowly, L"Draw tableau (narrowly)", L"OT learning") {
-	SENTENCE (L"Partial form 1", L"")
-	SENTENCE (L"Partial form 2", L"")
-	BOOLEAN (L"Show disharmonies", 1)
+FORM (OTMulti_drawTableau_narrowly, U"Draw tableau (narrowly)", U"OT learning") {
+	SENTENCE (U"Partial form 1", U"")
+	SENTENCE (U"Partial form 2", U"")
+	BOOLEAN (U"Show disharmonies", 1)
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (OTMulti);
-		OTMulti_drawTableau (me, GRAPHICS, GET_STRING (L"Partial form 1"), GET_STRING (L"Partial form 2"),
-			true, GET_INTEGER (L"Show disharmonies"));
+		OTMulti_drawTableau (me, GRAPHICS, GET_STRING (U"Partial form 1"), GET_STRING (U"Partial form 2"),
+			true, GET_INTEGER (U"Show disharmonies"));
 	}
 END2 }
 
 DIRECT2 (OTMulti_edit) {
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot edit an OTMulti from batch.");
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot edit an OTMulti from batch.");
 	LOOP {
 		iam (OTMulti);
 		autoOTMultiEditor editor = OTMultiEditor_create (ID_AND_FULL_NAME, me);
@@ -1349,147 +1353,147 @@ DIRECT2 (OTMulti_edit) {
 	}
 END2 }
 
-FORM (OTMulti_evaluate, L"OTMulti: Evaluate", 0) {
-	REAL (L"Evaluation noise", L"2.0")
+FORM (OTMulti_evaluate, U"OTMulti: Evaluate", 0) {
+	REAL (U"Evaluation noise", U"2.0")
 	OK2
 DO
 	iam_ONLY (OTMulti);
-	OTMulti_newDisharmonies (me, GET_REAL (L"Evaluation noise"));
+	OTMulti_newDisharmonies (me, GET_REAL (U"Evaluation noise"));
 	praat_dataChanged (me);
 END2 }
 
-FORM (OTMulti_generateOptimalForms, L"OTMulti: Generate optimal forms", 0) {
-	SENTENCE (L"Partial form 1", L"")
-	SENTENCE (L"Partial form 2", L"")
-	NATURAL (L"Number of trials", L"1000")
-	REAL (L"Evaluation noise", L"2.0")
+FORM (OTMulti_generateOptimalForms, U"OTMulti: Generate optimal forms", 0) {
+	SENTENCE (U"Partial form 1", U"")
+	SENTENCE (U"Partial form 2", U"")
+	NATURAL (U"Number of trials", U"1000")
+	REAL (U"Evaluation noise", U"2.0")
 	OK2
 DO
 	iam_ONLY (OTMulti);
-	autoStrings thee = OTMulti_generateOptimalForms (me, GET_STRING (L"Partial form 1"), GET_STRING (L"Partial form 2"),
-		GET_INTEGER (L"Number of trials"), GET_REAL (L"Evaluation noise"));
-	praat_new (thee.transfer(), my name, L"_out");
+	autoStrings thee = OTMulti_generateOptimalForms (me, GET_STRING (U"Partial form 1"), GET_STRING (U"Partial form 2"),
+		GET_INTEGER (U"Number of trials"), GET_REAL (U"Evaluation noise"));
+	praat_new (thee.transfer(), my name, U"_out");
 	praat_dataChanged (me);
 END2 }
 
-FORM (OTMulti_getCandidate, L"Get candidate", 0) {
-	NATURAL (L"Candidate", L"1")
+FORM (OTMulti_getCandidate, U"Get candidate", 0) {
+	NATURAL (U"Candidate", U"1")
 	OK2
 DO
 	iam_ONLY (OTMulti);
-	long icand = GET_INTEGER (L"Candidate");
+	long icand = GET_INTEGER (U"Candidate");
 	if (icand > my numberOfCandidates)
-		Melder_throw ("The specified candidate number should not exceed the number of candidates.");
+		Melder_throw (U"The specified candidate number should not exceed the number of candidates.");
 	Melder_information (my candidates [icand]. string);
 END2 }
 
-FORM (OTMulti_getConstraint, L"Get constraint name", 0) {
-	NATURAL (L"Constraint number", L"1")
+FORM (OTMulti_getConstraint, U"Get constraint name", 0) {
+	NATURAL (U"Constraint number", U"1")
 	OK2
 DO
 	iam_ONLY (OTMulti);
-	long icons = GET_INTEGER (L"Constraint number");
+	long icons = GET_INTEGER (U"Constraint number");
 	if (icons > my numberOfConstraints)
-		Melder_throw ("The specified constraint number should not exceed the number of constraints.");
+		Melder_throw (U"The specified constraint number should not exceed the number of constraints.");
 	Melder_information (my constraints [icons]. name);
 END2 }
 
-FORM (OTMulti_getConstraintIndexFromName, L"OTMulti: Get constraint number", 0) {
-	SENTENCE (L"Constraint name", L"")
+FORM (OTMulti_getConstraintIndexFromName, U"OTMulti: Get constraint number", 0) {
+	SENTENCE (U"Constraint name", U"")
 	OK2
 DO
 	iam_ONLY (OTMulti);
-	Melder_information (Melder_integer (OTMulti_getConstraintIndexFromName (me, GET_STRING (L"Constraint name"))));
+	Melder_information (OTMulti_getConstraintIndexFromName (me, GET_STRING (U"Constraint name")));
 END2 }
 
-FORM (OTMulti_getDisharmony, L"Get disharmony", 0) {
-	NATURAL (L"Constraint number", L"1")
+FORM (OTMulti_getDisharmony, U"Get disharmony", 0) {
+	NATURAL (U"Constraint number", U"1")
 	OK2
 DO
 	iam_ONLY (OTMulti);
-	long icons = GET_INTEGER (L"Constraint number");
+	long icons = GET_INTEGER (U"Constraint number");
 	if (icons > my numberOfConstraints)
-		Melder_throw ("The specified constraint number should not exceed the number of constraints.");
-	Melder_information (Melder_double (my constraints [icons]. disharmony));
+		Melder_throw (U"The specified constraint number should not exceed the number of constraints.");
+	Melder_information (my constraints [icons]. disharmony);
 END2 }
 
 DIRECT2 (OTMulti_getNumberOfCandidates) {
 	iam_ONLY (OTMulti);
-	Melder_information (Melder_integer (my numberOfCandidates));
+	Melder_information (my numberOfCandidates);
 END2 }
 
 DIRECT2 (OTMulti_getNumberOfConstraints) {
 	iam_ONLY (OTMulti);
-	Melder_information (Melder_integer (my numberOfConstraints));
+	Melder_information (my numberOfConstraints);
 END2 }
 
-FORM (OTMulti_getNumberOfViolations, L"Get number of violations", 0) {
-	NATURAL (L"Candidate number", L"1")
-	NATURAL (L"Constraint number", L"1")
+FORM (OTMulti_getNumberOfViolations, U"Get number of violations", 0) {
+	NATURAL (U"Candidate number", U"1")
+	NATURAL (U"Constraint number", U"1")
 	OK2
 DO
 	iam_ONLY (OTMulti);
-	long icand = GET_INTEGER (L"Candidate number");
+	long icand = GET_INTEGER (U"Candidate number");
 	if (icand > my numberOfCandidates)
-		Melder_throw ("The specified candidate number should not exceed the number of candidates.");
-	long icons = GET_INTEGER (L"Constraint number");
+		Melder_throw (U"The specified candidate number should not exceed the number of candidates.");
+	long icons = GET_INTEGER (U"Constraint number");
 	if (icons > my numberOfConstraints)
-		Melder_throw ("The specified constraint number should not exceed the number of constraints.");
-	Melder_information (Melder_integer (my candidates [icand]. marks [icons]));
+		Melder_throw (U"The specified constraint number should not exceed the number of constraints.");
+	Melder_information (my candidates [icand]. marks [icons]);
 END2 }
 
-FORM (OTMulti_getRankingValue, L"Get ranking value", 0) {
-	NATURAL (L"Constraint number", L"1")
+FORM (OTMulti_getRankingValue, U"Get ranking value", 0) {
+	NATURAL (U"Constraint number", U"1")
 	OK2
 DO
 	iam_ONLY (OTMulti);
-	long icons = GET_INTEGER (L"Constraint number");
+	long icons = GET_INTEGER (U"Constraint number");
 	if (icons > my numberOfConstraints)
-		Melder_throw ("The specified constraint number should not exceed the number of constraints.");
-	Melder_information (Melder_double (my constraints [icons]. ranking));
+		Melder_throw (U"The specified constraint number should not exceed the number of constraints.");
+	Melder_information (my constraints [icons]. ranking);
 END2 }
 
-FORM (OTMulti_getWinner, L"OTMulti: Get winner", 0) {
-	SENTENCE (L"Partial form 1", L"")
-	SENTENCE (L"Partial form 2", L"")
+FORM (OTMulti_getWinner, U"OTMulti: Get winner", 0) {
+	SENTENCE (U"Partial form 1", U"")
+	SENTENCE (U"Partial form 2", U"")
 	OK2
 DO
 	iam_ONLY (OTMulti);
-	Melder_information (Melder_integer (OTMulti_getWinner (me, GET_STRING (L"Partial form 1"), GET_STRING (L"Partial form 2"))));
+	Melder_information (OTMulti_getWinner (me, GET_STRING (U"Partial form 1"), GET_STRING (U"Partial form 2")));
 END2 }
 
-FORM (OTMulti_generateOptimalForm, L"OTMulti: Generate optimal form", 0) {
-	SENTENCE (L"Partial form 1", L"")
-	SENTENCE (L"Partial form 2", L"")
-	REAL (L"Evaluation noise", L"2.0")
+FORM (OTMulti_generateOptimalForm, U"OTMulti: Generate optimal form", 0) {
+	SENTENCE (U"Partial form 1", U"")
+	SENTENCE (U"Partial form 2", U"")
+	REAL (U"Evaluation noise", U"2.0")
 	OK2
 DO
 	iam_ONLY (OTMulti);
-	wchar_t output [100];
-	OTMulti_generateOptimalForm (me, GET_STRING (L"Partial form 1"), GET_STRING (L"Partial form 2"),
-		output, GET_REAL (L"Evaluation noise"));
+	char32 output [100];
+	OTMulti_generateOptimalForm (me, GET_STRING (U"Partial form 1"), GET_STRING (U"Partial form 2"),
+		output, GET_REAL (U"Evaluation noise"));
 	Melder_information (output);
 	praat_dataChanged (me);
 END2 }
 
-FORM (OTMulti_learnOne, L"OTMulti: Learn one", 0) {
-	SENTENCE (L"Partial form 1", L"")
-	SENTENCE (L"Partial form 2", L"")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	OPTIONMENU (L"Direction", 3)
-		OPTION (L"forward")
-		OPTION (L"backward")
-		OPTION (L"bidirectionally")
-	POSITIVE (L"Plasticity", L"0.1")
-	REAL (L"Rel. plasticity spreading", L"0.1")
+FORM (OTMulti_learnOne, U"OTMulti: Learn one", 0) {
+	SENTENCE (U"Partial form 1", U"")
+	SENTENCE (U"Partial form 2", U"")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	OPTIONMENU (U"Direction", 3)
+		OPTION (U"forward")
+		OPTION (U"backward")
+		OPTION (U"bidirectionally")
+	POSITIVE (U"Plasticity", U"0.1")
+	REAL (U"Rel. plasticity spreading", U"0.1")
 	OK2
 DO
 	LOOP {
 		iam (OTMulti);
 		try {
-			OTMulti_learnOne (me, GET_STRING (L"Partial form 1"), GET_STRING (L"Partial form 2"),
-				GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"),
-				GET_INTEGER (L"Direction"), GET_REAL (L"Plasticity"), GET_REAL (L"Rel. plasticity spreading"));
+			OTMulti_learnOne (me, GET_STRING (U"Partial form 1"), GET_STRING (U"Partial form 2"),
+				GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"),
+				GET_INTEGER (U"Direction"), GET_REAL (U"Plasticity"), GET_REAL (U"Rel. plasticity spreading"));
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);
@@ -1498,88 +1502,88 @@ DO
 	}
 END2 }
 
-FORM (OTMulti_removeConstraint, L"OTMulti: Remove constraint", 0) {
-	SENTENCE (L"Constraint name", L"")
+FORM (OTMulti_removeConstraint, U"OTMulti: Remove constraint", 0) {
+	SENTENCE (U"Constraint name", U"")
 	OK2
 DO
 	LOOP {
 		iam (OTMulti);
-		OTMulti_removeConstraint (me, GET_STRING (L"Constraint name"));
+		OTMulti_removeConstraint (me, GET_STRING (U"Constraint name"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (OTMulti_resetAllRankings, L"OTMulti: Reset all rankings", 0) {
-	REAL (L"Ranking", L"100.0")
+FORM (OTMulti_resetAllRankings, U"OTMulti: Reset all rankings", 0) {
+	REAL (U"Ranking", U"100.0")
 	OK2
 DO
 	LOOP {
 		iam (OTMulti);
-		OTMulti_reset (me, GET_REAL (L"Ranking"));
+		OTMulti_reset (me, GET_REAL (U"Ranking"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (OTMulti_setConstraintPlasticity, L"OTMulti: Set constraint plasticity", 0) {
-	NATURAL (L"Constraint", L"1")
-	REAL (L"Plasticity", L"1.0")
+FORM (OTMulti_setConstraintPlasticity, U"OTMulti: Set constraint plasticity", 0) {
+	NATURAL (U"Constraint", U"1")
+	REAL (U"Plasticity", U"1.0")
 	OK2
 DO
 	LOOP {
 		iam (OTMulti);
-		OTMulti_setConstraintPlasticity (me, GET_INTEGER (L"Constraint"), GET_REAL (L"Plasticity"));
+		OTMulti_setConstraintPlasticity (me, GET_INTEGER (U"Constraint"), GET_REAL (U"Plasticity"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (OTMulti_setDecisionStrategy, L"OTMulti: Set decision strategy", 0) {
-	RADIO_ENUM (L"Decision strategy", kOTGrammar_decisionStrategy, DEFAULT)
+FORM (OTMulti_setDecisionStrategy, U"OTMulti: Set decision strategy", 0) {
+	RADIO_ENUM (U"Decision strategy", kOTGrammar_decisionStrategy, DEFAULT)
 	OK2
 iam_ONLY (OTMulti);
-SET_ENUM (L"Decision strategy", kOTGrammar_decisionStrategy, my decisionStrategy);
+SET_ENUM (U"Decision strategy", kOTGrammar_decisionStrategy, my decisionStrategy);
 DO
 	iam_ONLY (OTMulti);
-	my decisionStrategy = GET_ENUM (kOTGrammar_decisionStrategy, L"Decision strategy");
+	my decisionStrategy = GET_ENUM (kOTGrammar_decisionStrategy, U"Decision strategy");
 	praat_dataChanged (me);
 END2 }
 
-FORM (OTMulti_setLeak, L"OTGrammar: Set leak", 0) {
-	REAL (L"Leak", L"0.0")
+FORM (OTMulti_setLeak, U"OTGrammar: Set leak", 0) {
+	REAL (U"Leak", U"0.0")
 	OK2
 iam_ONLY (OTMulti);
-SET_REAL (L"Leak", my leak);
+SET_REAL (U"Leak", my leak);
 DO
 	iam_ONLY (OTMulti);
-	my leak = GET_REAL (L"Leak");
+	my leak = GET_REAL (U"Leak");
 	praat_dataChanged (me);
 END2 }
 
-FORM (OTMulti_setRanking, L"OTMulti: Set ranking", 0) {
-	NATURAL (L"Constraint", L"1")
-	REAL (L"Ranking", L"100.0")
-	REAL (L"Disharmony", L"100.0")
+FORM (OTMulti_setRanking, U"OTMulti: Set ranking", 0) {
+	NATURAL (U"Constraint", U"1")
+	REAL (U"Ranking", U"100.0")
+	REAL (U"Disharmony", U"100.0")
 	OK2
 DO
 	LOOP {
 		iam (OTMulti);
-		OTMulti_setRanking (me, GET_INTEGER (L"Constraint"), GET_REAL (L"Ranking"), GET_REAL (L"Disharmony"));
+		OTMulti_setRanking (me, GET_INTEGER (U"Constraint"), GET_REAL (U"Ranking"), GET_REAL (U"Disharmony"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (OTMulti_to_Distribution, L"OTMulti: Compute output distribution", 0) {
-	SENTENCE (L"Partial form 1", L"")
-	SENTENCE (L"Partial form 2", L"")
-	NATURAL (L"Number of trials", L"100000")
-	POSITIVE (L"Evaluation noise", L"2.0")
+FORM (OTMulti_to_Distribution, U"OTMulti: Compute output distribution", 0) {
+	SENTENCE (U"Partial form 1", U"")
+	SENTENCE (U"Partial form 2", U"")
+	NATURAL (U"Number of trials", U"100000")
+	POSITIVE (U"Evaluation noise", U"2.0")
 	OK2
 DO
 	LOOP {
 		iam (OTMulti);
 		try {
-			autoDistributions thee = OTMulti_to_Distribution (me, GET_STRING (L"Partial form 1"), GET_STRING (L"Partial form 2"),
-			GET_INTEGER (L"Number of trials"), GET_REAL (L"Evaluation noise"));
-			praat_new (thee.transfer(), my name, L"_out");
+			autoDistributions thee = OTMulti_to_Distribution (me, GET_STRING (U"Partial form 1"), GET_STRING (U"Partial form 2"),
+				GET_INTEGER (U"Number of trials"), GET_REAL (U"Evaluation noise"));
+			praat_new (thee.transfer(), my name, U"_out");
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);
@@ -1588,19 +1592,19 @@ DO
 	}
 END2 }
 
-FORM (OTMulti_PairDistribution_learn, L"OTMulti & PairDistribution: Learn", 0) {
-	REAL (L"Evaluation noise", L"2.0")
-	OPTIONMENU_ENUM (L"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
-	OPTIONMENU (L"Direction", 3)
-		OPTION (L"forward")
-		OPTION (L"backward")
-		OPTION (L"bidirectionally")
-	POSITIVE (L"Initial plasticity", L"1.0")
-	NATURAL (L"Replications per plasticity", L"100000")
-	REAL (L"Plasticity decrement", L"0.1")
-	NATURAL (L"Number of plasticities", L"4")
-	REAL (L"Rel. plasticity spreading", L"0.1")
-	INTEGER (L"Store history every", L"0")
+FORM (OTMulti_PairDistribution_learn, U"OTMulti & PairDistribution: Learn", 0) {
+	REAL (U"Evaluation noise", U"2.0")
+	OPTIONMENU_ENUM (U"Update rule", kOTGrammar_rerankingStrategy, SYMMETRIC_ALL)
+	OPTIONMENU (U"Direction", 3)
+		OPTION (U"forward")
+		OPTION (U"backward")
+		OPTION (U"bidirectionally")
+	POSITIVE (U"Initial plasticity", U"1.0")
+	NATURAL (U"Replications per plasticity", U"100000")
+	REAL (U"Plasticity decrement", U"0.1")
+	NATURAL (U"Number of plasticities", U"4")
+	REAL (U"Rel. plasticity spreading", U"0.1")
+	INTEGER (U"Store history every", U"0")
 	OK2
 DO
 	iam_ONLY (OTMulti);
@@ -1608,186 +1612,186 @@ DO
 	Table history = NULL;
 	try {
 		OTMulti_PairDistribution_learn (me, thee,
-			GET_REAL (L"Evaluation noise"),
-			GET_ENUM (kOTGrammar_rerankingStrategy, L"Update rule"),
-			GET_INTEGER (L"Direction"),
-			GET_REAL (L"Initial plasticity"), GET_INTEGER (L"Replications per plasticity"),
-			GET_REAL (L"Plasticity decrement"), GET_INTEGER (L"Number of plasticities"),
-			GET_REAL (L"Rel. plasticity spreading"),
-			GET_INTEGER (L"Store history every"), & history);
+			GET_REAL (U"Evaluation noise"),
+			GET_ENUM (kOTGrammar_rerankingStrategy, U"Update rule"),
+			GET_INTEGER (U"Direction"),
+			GET_REAL (U"Initial plasticity"), GET_INTEGER (U"Replications per plasticity"),
+			GET_REAL (U"Plasticity decrement"), GET_INTEGER (U"Number of plasticities"),
+			GET_REAL (U"Rel. plasticity spreading"),
+			GET_INTEGER (U"Store history every"), & history);
 		praat_dataChanged (me);
 	} catch (MelderError) {
 		praat_dataChanged (me);   // e.g. in case of partial learning
-		Melder_flushError (NULL);
+		Melder_flushError ();
 		// trickle down to save history
 	}
 	if (history) praat_new (history, my name);
 END2 }
 
-FORM (OTMulti_Strings_generateOptimalForms, L"OTGrammar: Inputs to outputs", L"OTGrammar: Inputs to outputs...") {
-	REAL (L"Evaluation noise", L"2.0")
+FORM (OTMulti_Strings_generateOptimalForms, U"OTGrammar: Inputs to outputs", U"OTGrammar: Inputs to outputs...") {
+	REAL (U"Evaluation noise", U"2.0")
 	OK2
 DO
 	iam_ONLY (OTMulti);
 	thouart_ONLY (Strings);
-	autoStrings him = OTMulti_Strings_generateOptimalForms (me, thee, GET_REAL (L"Evaluation noise"));
-	praat_new (him.transfer(), my name, L"_out");
+	autoStrings him = OTMulti_Strings_generateOptimalForms (me, thee, GET_REAL (U"Evaluation noise"));
+	praat_new (him.transfer(), my name, U"_out");
 	praat_dataChanged (me);
 END2 }
 
 /***** buttons *****/
 
-void praat_uvafon_gram_init (void);
-void praat_uvafon_gram_init (void) {
+void praat_uvafon_gram_init ();
+void praat_uvafon_gram_init () {
 	Thing_recognizeClassesByName (classNetwork, classOTGrammar, classOTHistory, classOTMulti, NULL);
-	Thing_recognizeClassByOtherName (classOTGrammar, L"OTCase");
-
-	praat_addMenuCommand (L"Objects", L"New", L"Constraint grammars", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"OT learning tutorial", 0, 1, DO_OT_learning_tutorial);
-		praat_addMenuCommand (L"Objects", L"New", L"-- tableau grammars --", 0, 1, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"Create NoCoda grammar", 0, 1, DO_Create_NoCoda_grammar);
-		praat_addMenuCommand (L"Objects", L"New", L"Create place assimilation grammar", 0, 1, DO_Create_NPA_grammar);
-		praat_addMenuCommand (L"Objects", L"New", L"Create place assimilation distribution", 0, 1, DO_Create_NPA_distribution);
-		praat_addMenuCommand (L"Objects", L"New", L"Create tongue-root grammar...", 0, 1, DO_Create_tongue_root_grammar);
-		praat_addMenuCommand (L"Objects", L"New", L"Create metrics grammar...", 0, 1, DO_Create_metrics_grammar);
-		praat_addMenuCommand (L"Objects", L"New", L"Create multi-level metrics grammar...", 0, 1, DO_Create_multi_level_metrics_grammar);
-	praat_addAction1 (classOTGrammar, 1, L"Save as headerless spreadsheet file...", 0, 0, DO_OTGrammar_writeToHeaderlessSpreadsheetFile);
-	praat_addAction1 (classOTGrammar, 1, L"Write to headerless spreadsheet file...", 0, praat_HIDDEN, DO_OTGrammar_writeToHeaderlessSpreadsheetFile);
-
-	praat_addAction1 (classOTGrammar, 0, L"OTGrammar help", 0, 0, DO_OTGrammar_help);
-	praat_addAction1 (classOTGrammar, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classOTGrammar, 0, L"Draw tableau...", 0, 0, DO_OTGrammar_drawTableau);
-		praat_addAction1 (classOTGrammar, 0, L"Draw tableau (narrowly)...", 0, 0, DO_OTGrammar_drawTableau_narrowly);
-	praat_addAction1 (classOTGrammar, 0, L"View & Edit", 0, praat_ATTRACTIVE, DO_OTGrammar_edit);
-	praat_addAction1 (classOTGrammar, 0, L"Edit", 0, praat_HIDDEN, DO_OTGrammar_edit);
-	praat_addAction1 (classOTGrammar, 0, L"Query -", 0, 0, 0);
-		praat_addAction1 (classOTGrammar, 1, L"Get number of constraints", 0, 1, DO_OTGrammar_getNumberOfConstraints);
-		praat_addAction1 (classOTGrammar, 1, L"Get constraint...", 0, 1, DO_OTGrammar_getConstraint);
-		praat_addAction1 (classOTGrammar, 1, L"Get ranking value...", 0, 1, DO_OTGrammar_getRankingValue);
-		praat_addAction1 (classOTGrammar, 1, L"Get disharmony...", 0, 1, DO_OTGrammar_getDisharmony);
-		praat_addAction1 (classOTGrammar, 1, L"Get number of tableaus", 0, 1, DO_OTGrammar_getNumberOfTableaus);
-		praat_addAction1 (classOTGrammar, 1, L"Get input...", 0, 1, DO_OTGrammar_getInput);
-		praat_addAction1 (classOTGrammar, 1, L"Get number of candidates...", 0, 1, DO_OTGrammar_getNumberOfCandidates);
-		praat_addAction1 (classOTGrammar, 1, L"Get candidate...", 0, 1, DO_OTGrammar_getCandidate);
-		praat_addAction1 (classOTGrammar, 1, L"Get number of violations...", 0, 1, DO_OTGrammar_getNumberOfViolations);
-		praat_addAction1 (classOTGrammar, 1, L"-- parse --", 0, 1, 0);
-		praat_addAction1 (classOTGrammar, 1, L"Get winner...", 0, 1, DO_OTGrammar_getWinner);
-		praat_addAction1 (classOTGrammar, 1, L"Compare candidates...", 0, 1, DO_OTGrammar_compareCandidates);
-		praat_addAction1 (classOTGrammar, 1, L"Get number of optimal candidates...", 0, 1, DO_OTGrammar_getNumberOfOptimalCandidates);
-		praat_addAction1 (classOTGrammar, 1, L"Is candidate grammatical...", 0, 1, DO_OTGrammar_isCandidateGrammatical);
-		praat_addAction1 (classOTGrammar, 1, L"Is candidate singly grammatical...", 0, 1, DO_OTGrammar_isCandidateSinglyGrammatical);
-		praat_addAction1 (classOTGrammar, 1, L"Get interpretive parse...", 0, 1, DO_OTGrammar_getInterpretiveParse);
-		praat_addAction1 (classOTGrammar, 1, L"Is partial output grammatical...", 0, 1, DO_OTGrammar_isPartialOutputGrammatical);
-		praat_addAction1 (classOTGrammar, 1, L"Is partial output singly grammatical...", 0, 1, DO_OTGrammar_isPartialOutputSinglyGrammatical);
-	praat_addAction1 (classOTGrammar, 0, L"Generate inputs...", 0, 0, DO_OTGrammar_generateInputs);
-	praat_addAction1 (classOTGrammar, 0, L"Get inputs", 0, 0, DO_OTGrammar_getInputs);
-	praat_addAction1 (classOTGrammar, 0, L"Measure typology", 0, 0, DO_OTGrammar_measureTypology);
-	praat_addAction1 (classOTGrammar, 0, L"Evaluate", 0, 0, 0);
-		praat_addAction1 (classOTGrammar, 0, L"Evaluate...", 0, 0, DO_OTGrammar_evaluate);
-		praat_addAction1 (classOTGrammar, 0, L"Input to output...", 0, 0, DO_OTGrammar_inputToOutput);
-		praat_addAction1 (classOTGrammar, 0, L"Input to outputs...", 0, 0, DO_OTGrammar_inputToOutputs);
-		praat_addAction1 (classOTGrammar, 0, L"To output Distributions...", 0, 0, DO_OTGrammar_to_Distributions);
-		praat_addAction1 (classOTGrammar, 0, L"To PairDistribution...", 0, 0, DO_OTGrammar_to_PairDistribution);
-	praat_addAction1 (classOTGrammar, 0, L"Modify ranking -", 0, 0, 0);
-		praat_addAction1 (classOTGrammar, 0, L"Set ranking...", 0, 1, DO_OTGrammar_setRanking);
-		praat_addAction1 (classOTGrammar, 0, L"Reset all rankings...", 0, 1, DO_OTGrammar_resetAllRankings);
-		praat_addAction1 (classOTGrammar, 0, L"Reset to random ranking...", 0, 1, DO_OTGrammar_resetToRandomRanking);
-		praat_addAction1 (classOTGrammar, 0, L"Reset to random total ranking...", 0, 1, DO_OTGrammar_resetToRandomTotalRanking);
-		praat_addAction1 (classOTGrammar, 0, L"Learn one...", 0, 1, DO_OTGrammar_learnOne);
-		praat_addAction1 (classOTGrammar, 0, L"Learn one from partial output...", 0, 1, DO_OTGrammar_learnOneFromPartialOutput);
-	praat_addAction1 (classOTGrammar, 0, L"Modify behaviour -", 0, 0, 0);
-		praat_addAction1 (classOTGrammar, 1, L"Set harmony computation method...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_OTGrammar_setDecisionStrategy);
-		praat_addAction1 (classOTGrammar, 1, L"Set decision strategy...", 0, 1, DO_OTGrammar_setDecisionStrategy);
-		praat_addAction1 (classOTGrammar, 1, L"Set leak...", 0, 1, DO_OTGrammar_setLeak);
-		praat_addAction1 (classOTGrammar, 1, L"Set constraint plasticity...", 0, 1, DO_OTGrammar_setConstraintPlasticity);
-	praat_addAction1 (classOTGrammar, 0, L"Modify structure -", 0, 0, 0);
-		praat_addAction1 (classOTGrammar, 0, L"Remove constraint...", 0, 1, DO_OTGrammar_removeConstraint);
-		praat_addAction1 (classOTGrammar, 0, L"Remove harmonically bounded candidates...", 0, 1, DO_OTGrammar_removeHarmonicallyBoundedCandidates);
+	Thing_recognizeClassByOtherName (classOTGrammar, U"OTCase");
+
+	praat_addMenuCommand (U"Objects", U"New", U"Constraint grammars", 0, 0, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"OT learning tutorial", 0, 1, DO_OT_learning_tutorial);
+		praat_addMenuCommand (U"Objects", U"New", U"-- tableau grammars --", 0, 1, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"Create NoCoda grammar", 0, 1, DO_Create_NoCoda_grammar);
+		praat_addMenuCommand (U"Objects", U"New", U"Create place assimilation grammar", 0, 1, DO_Create_NPA_grammar);
+		praat_addMenuCommand (U"Objects", U"New", U"Create place assimilation distribution", 0, 1, DO_Create_NPA_distribution);
+		praat_addMenuCommand (U"Objects", U"New", U"Create tongue-root grammar...", 0, 1, DO_Create_tongue_root_grammar);
+		praat_addMenuCommand (U"Objects", U"New", U"Create metrics grammar...", 0, 1, DO_Create_metrics_grammar);
+		praat_addMenuCommand (U"Objects", U"New", U"Create multi-level metrics grammar...", 0, 1, DO_Create_multi_level_metrics_grammar);
+	praat_addAction1 (classOTGrammar, 1, U"Save as headerless spreadsheet file...", 0, 0, DO_OTGrammar_writeToHeaderlessSpreadsheetFile);
+	praat_addAction1 (classOTGrammar, 1, U"Write to headerless spreadsheet file...", 0, praat_HIDDEN, DO_OTGrammar_writeToHeaderlessSpreadsheetFile);
+
+	praat_addAction1 (classOTGrammar, 0, U"OTGrammar help", 0, 0, DO_OTGrammar_help);
+	praat_addAction1 (classOTGrammar, 0, U"View & Edit", 0, praat_ATTRACTIVE, DO_OTGrammar_edit);
+	praat_addAction1 (classOTGrammar, 0, U"Edit", 0, praat_HIDDEN, DO_OTGrammar_edit);
+	praat_addAction1 (classOTGrammar, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classOTGrammar, 0, U"Draw tableau...", 0, 0, DO_OTGrammar_drawTableau);
+		praat_addAction1 (classOTGrammar, 0, U"Draw tableau (narrowly)...", 0, 0, DO_OTGrammar_drawTableau_narrowly);
+	praat_addAction1 (classOTGrammar, 0, U"Query -", 0, 0, 0);
+		praat_addAction1 (classOTGrammar, 1, U"Get number of constraints", 0, 1, DO_OTGrammar_getNumberOfConstraints);
+		praat_addAction1 (classOTGrammar, 1, U"Get constraint...", 0, 1, DO_OTGrammar_getConstraint);
+		praat_addAction1 (classOTGrammar, 1, U"Get ranking value...", 0, 1, DO_OTGrammar_getRankingValue);
+		praat_addAction1 (classOTGrammar, 1, U"Get disharmony...", 0, 1, DO_OTGrammar_getDisharmony);
+		praat_addAction1 (classOTGrammar, 1, U"Get number of tableaus", 0, 1, DO_OTGrammar_getNumberOfTableaus);
+		praat_addAction1 (classOTGrammar, 1, U"Get input...", 0, 1, DO_OTGrammar_getInput);
+		praat_addAction1 (classOTGrammar, 1, U"Get number of candidates...", 0, 1, DO_OTGrammar_getNumberOfCandidates);
+		praat_addAction1 (classOTGrammar, 1, U"Get candidate...", 0, 1, DO_OTGrammar_getCandidate);
+		praat_addAction1 (classOTGrammar, 1, U"Get number of violations...", 0, 1, DO_OTGrammar_getNumberOfViolations);
+		praat_addAction1 (classOTGrammar, 1, U"-- parse --", 0, 1, 0);
+		praat_addAction1 (classOTGrammar, 1, U"Get winner...", 0, 1, DO_OTGrammar_getWinner);
+		praat_addAction1 (classOTGrammar, 1, U"Compare candidates...", 0, 1, DO_OTGrammar_compareCandidates);
+		praat_addAction1 (classOTGrammar, 1, U"Get number of optimal candidates...", 0, 1, DO_OTGrammar_getNumberOfOptimalCandidates);
+		praat_addAction1 (classOTGrammar, 1, U"Is candidate grammatical...", 0, 1, DO_OTGrammar_isCandidateGrammatical);
+		praat_addAction1 (classOTGrammar, 1, U"Is candidate singly grammatical...", 0, 1, DO_OTGrammar_isCandidateSinglyGrammatical);
+		praat_addAction1 (classOTGrammar, 1, U"Get interpretive parse...", 0, 1, DO_OTGrammar_getInterpretiveParse);
+		praat_addAction1 (classOTGrammar, 1, U"Is partial output grammatical...", 0, 1, DO_OTGrammar_isPartialOutputGrammatical);
+		praat_addAction1 (classOTGrammar, 1, U"Is partial output singly grammatical...", 0, 1, DO_OTGrammar_isPartialOutputSinglyGrammatical);
+	praat_addAction1 (classOTGrammar, 0, U"Generate inputs...", 0, 0, DO_OTGrammar_generateInputs);
+	praat_addAction1 (classOTGrammar, 0, U"Get inputs", 0, 0, DO_OTGrammar_getInputs);
+	praat_addAction1 (classOTGrammar, 0, U"Measure typology", 0, 0, DO_OTGrammar_measureTypology);
+	praat_addAction1 (classOTGrammar, 0, U"Evaluate", 0, 0, 0);
+		praat_addAction1 (classOTGrammar, 0, U"Evaluate...", 0, 0, DO_OTGrammar_evaluate);
+		praat_addAction1 (classOTGrammar, 0, U"Input to output...", 0, 0, DO_OTGrammar_inputToOutput);
+		praat_addAction1 (classOTGrammar, 0, U"Input to outputs...", 0, 0, DO_OTGrammar_inputToOutputs);
+		praat_addAction1 (classOTGrammar, 0, U"To output Distributions...", 0, 0, DO_OTGrammar_to_Distributions);
+		praat_addAction1 (classOTGrammar, 0, U"To PairDistribution...", 0, 0, DO_OTGrammar_to_PairDistribution);
+	praat_addAction1 (classOTGrammar, 0, U"Modify ranking -", 0, 0, 0);
+		praat_addAction1 (classOTGrammar, 0, U"Set ranking...", 0, 1, DO_OTGrammar_setRanking);
+		praat_addAction1 (classOTGrammar, 0, U"Reset all rankings...", 0, 1, DO_OTGrammar_resetAllRankings);
+		praat_addAction1 (classOTGrammar, 0, U"Reset to random ranking...", 0, 1, DO_OTGrammar_resetToRandomRanking);
+		praat_addAction1 (classOTGrammar, 0, U"Reset to random total ranking...", 0, 1, DO_OTGrammar_resetToRandomTotalRanking);
+		praat_addAction1 (classOTGrammar, 0, U"Learn one...", 0, 1, DO_OTGrammar_learnOne);
+		praat_addAction1 (classOTGrammar, 0, U"Learn one from partial output...", 0, 1, DO_OTGrammar_learnOneFromPartialOutput);
+	praat_addAction1 (classOTGrammar, 0, U"Modify behaviour -", 0, 0, 0);
+		praat_addAction1 (classOTGrammar, 1, U"Set harmony computation method...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_OTGrammar_setDecisionStrategy);
+		praat_addAction1 (classOTGrammar, 1, U"Set decision strategy...", 0, 1, DO_OTGrammar_setDecisionStrategy);
+		praat_addAction1 (classOTGrammar, 1, U"Set leak...", 0, 1, DO_OTGrammar_setLeak);
+		praat_addAction1 (classOTGrammar, 1, U"Set constraint plasticity...", 0, 1, DO_OTGrammar_setConstraintPlasticity);
+	praat_addAction1 (classOTGrammar, 0, U"Modify structure -", 0, 0, 0);
+		praat_addAction1 (classOTGrammar, 0, U"Remove constraint...", 0, 1, DO_OTGrammar_removeConstraint);
+		praat_addAction1 (classOTGrammar, 0, U"Remove harmonically bounded candidates...", 0, 1, DO_OTGrammar_removeHarmonicallyBoundedCandidates);
 
 	{ void praat_TableOfReal_init (ClassInfo klas); praat_TableOfReal_init (classOTHistory); }
 
-	praat_addAction1 (classOTMulti, 0, L"View & Edit", 0, praat_ATTRACTIVE, DO_OTMulti_edit);
-	praat_addAction1 (classOTMulti, 0, L"Edit", 0, praat_HIDDEN, DO_OTMulti_edit);
-	praat_addAction1 (classOTMulti, 0, L"Draw tableau...", 0, 0, DO_OTMulti_drawTableau);
-	praat_addAction1 (classOTMulti, 0, L"Draw tableau (narrowly)...", 0, 0, DO_OTMulti_drawTableau_narrowly);
-	praat_addAction1 (classOTMulti, 0, L"Query -", 0, 0, 0);
-	praat_addAction1 (classOTMulti, 1, L"Get number of constraints", 0, 1, DO_OTMulti_getNumberOfConstraints);
-	praat_addAction1 (classOTMulti, 1, L"Get constraint...", 0, 1, DO_OTMulti_getConstraint);
-	praat_addAction1 (classOTMulti, 1, L"Get constraint number...", 0, 1, DO_OTMulti_getConstraintIndexFromName);
-	praat_addAction1 (classOTMulti, 1, L"Get ranking value...", 0, 1, DO_OTMulti_getRankingValue);
-	praat_addAction1 (classOTMulti, 1, L"Get disharmony...", 0, 1, DO_OTMulti_getDisharmony);
-	praat_addAction1 (classOTMulti, 1, L"Get number of candidates", 0, 1, DO_OTMulti_getNumberOfCandidates);
-	praat_addAction1 (classOTMulti, 1, L"Get candidate...", 0, 1, DO_OTMulti_getCandidate);
-	praat_addAction1 (classOTMulti, 1, L"Get number of violations...", 0, 1, DO_OTMulti_getNumberOfViolations);
-	praat_addAction1 (classOTMulti, 1, L"-- parse --", 0, 1, 0);
-	praat_addAction1 (classOTMulti, 1, L"Get winner...", 0, 1, DO_OTMulti_getWinner);
-	praat_addAction1 (classOTMulti, 0, L"Evaluate", 0, 0, 0);
-	praat_addAction1 (classOTMulti, 0, L"Evaluate...", 0, 0, DO_OTMulti_evaluate);
-	praat_addAction1 (classOTMulti, 0, L"Get output...", 0, 0, DO_OTMulti_generateOptimalForm);
-	praat_addAction1 (classOTMulti, 0, L"Get outputs...", 0, 0, DO_OTMulti_generateOptimalForms);
-	praat_addAction1 (classOTMulti, 0, L"To output Distribution...", 0, 0, DO_OTMulti_to_Distribution);
-	praat_addAction1 (classOTMulti, 0, L"Modify ranking", 0, 0, 0);
-	praat_addAction1 (classOTMulti, 0, L"Set ranking...", 0, 0, DO_OTMulti_setRanking);
-	praat_addAction1 (classOTMulti, 0, L"Reset all rankings...", 0, 0, DO_OTMulti_resetAllRankings);
-	praat_addAction1 (classOTMulti, 0, L"Learn one...", 0, 0, DO_OTMulti_learnOne);
-	praat_addAction1 (classOTMulti, 0, L"Modify behaviour -", 0, 0, 0);
-	praat_addAction1 (classOTMulti, 1, L"Set decision strategy...", 0, 1, DO_OTMulti_setDecisionStrategy);
-	praat_addAction1 (classOTMulti, 1, L"Set leak...", 0, 1, DO_OTMulti_setLeak);
-	praat_addAction1 (classOTMulti, 1, L"Set constraint plasticity...", 0, 1, DO_OTMulti_setConstraintPlasticity);
-	praat_addAction1 (classOTMulti, 0, L"Modify structure -", 0, 0, 0);
-	praat_addAction1 (classOTMulti, 0, L"Remove constraint...", 0, 1, DO_OTMulti_removeConstraint);
-
-	praat_addAction2 (classOTGrammar, 1, classStrings, 1, L"Query -", 0, 0, 0);
-		praat_addAction2 (classOTGrammar, 1, classStrings, 1, L"Are all partial outputs grammatical?", 0, 1, DO_OTGrammar_Strings_areAllPartialOutputsGrammatical);
-		praat_addAction2 (classOTGrammar, 1, classStrings, 1, L"Are all partial outputs singly grammatical?", 0, 1, DO_OTGrammar_Strings_areAllPartialOutputsSinglyGrammatical);
-	praat_addAction2 (classOTGrammar, 1, classStrings, 1, L"Inputs to outputs...", 0, 0, DO_OTGrammar_Strings_inputsToOutputs);
-	praat_addAction2 (classOTGrammar, 1, classStrings, 1, L"Learn from partial outputs...", 0, 0, DO_OTGrammar_Strings_learnFromPartialOutputs);
-	praat_addAction2 (classOTGrammar, 1, classStrings, 2, L"Learn...", 0, 0, DO_OTGrammar_Stringses_learn);
-	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, L"Learn from partial outputs...", 0, 0, DO_OTGrammar_Distributions_learnFromPartialOutputs);
-	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, L"Learn from partial outputs (rrip)...", 0, 0, DO_OTGrammar_Distributions_learnFromPartialOutputs_rrip);
-	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, L"Learn from partial outputs (eip)...", 0, 0, DO_OTGrammar_Distributions_learnFromPartialOutputs_eip);
-	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, L"Learn from partial outputs (wrip)...", 0, 0, DO_OTGrammar_Distributions_learnFromPartialOutputs_wrip);
-	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, L"Get fraction correct...", 0, 0, DO_OTGrammar_Distributions_getFractionCorrect);
-	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, L"List obligatory rankings...", 0, praat_HIDDEN, DO_OTGrammar_Distributions_listObligatoryRankings);
-	praat_addAction2 (classOTGrammar, 1, classPairDistribution, 1, L"Learn...", 0, 0, DO_OTGrammar_PairDistribution_learn);
-	praat_addAction2 (classOTGrammar, 1, classPairDistribution, 1, L"Find positive weights...", 0, 0, DO_OTGrammar_PairDistribution_findPositiveWeights);
-	praat_addAction2 (classOTGrammar, 1, classPairDistribution, 1, L"Get fraction correct...", 0, 0, DO_OTGrammar_PairDistribution_getFractionCorrect);
-	praat_addAction2 (classOTGrammar, 1, classPairDistribution, 1, L"Get minimum number correct...", 0, 0, DO_OTGrammar_PairDistribution_getMinimumNumberCorrect);
-	praat_addAction2 (classOTGrammar, 1, classPairDistribution, 1, L"List obligatory rankings", 0, 0, DO_OTGrammar_PairDistribution_listObligatoryRankings);
-	praat_addAction2 (classOTMulti, 1, classPairDistribution, 1, L"Learn...", 0, 0, DO_OTMulti_PairDistribution_learn);
-	praat_addAction2 (classOTMulti, 1, classStrings, 1, L"Get outputs...", 0, 0, DO_OTMulti_Strings_generateOptimalForms);
-
-	praat_addMenuCommand (L"Objects", L"New", L"Symmetric networks", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"Create empty Network...", 0, 1, DO_Create_empty_Network);
-		praat_addMenuCommand (L"Objects", L"New", L"Create rectangular Network...", 0, 1, DO_Create_rectangular_Network);
-		praat_addMenuCommand (L"Objects", L"New", L"Create rectangular Network (vertical)...", 0, 1, DO_Create_rectangular_Network_vertical);
-
-	praat_addAction1 (classNetwork, 0, L"Draw...", 0, 0, DO_Network_draw);
-	praat_addAction1 (classNetwork, 1, L"Tabulate -", 0, 0, 0);
-		praat_addAction1 (classNetwork, 1, L"List nodes...", 0, 1, DO_Network_listNodes);
-		praat_addAction1 (classNetwork, 1, L"Nodes down to table...", 0, 1, DO_Network_nodes_downto_Table);
-	praat_addAction1 (classNetwork, 0, L"Query -", 0, 0, 0);
-		praat_addAction1 (classNetwork, 1, L"Get activity...", 0, 1, DO_Network_getActivity);
-		praat_addAction1 (classNetwork, 1, L"Get weight...", 0, 1, DO_Network_getWeight);
-	praat_addAction1 (classNetwork, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classNetwork, 0, L"Add node...", 0, 1, DO_Network_addNode);
-		praat_addAction1 (classNetwork, 0, L"Add connection...", 0, 1, DO_Network_addConnection);
-		praat_addAction1 (classNetwork, 1, L"-- activity --", 0, 1, 0);
-		praat_addAction1 (classNetwork, 0, L"Set activity...", 0, 1, DO_Network_setActivity);
-		praat_addAction1 (classNetwork, 0, L"Set clamping...", 0, 1, DO_Network_setClamping);
-		praat_addAction1 (classNetwork, 0, L"Zero activities...", 0, 1, DO_Network_zeroActivities);
-		praat_addAction1 (classNetwork, 0, L"Normalize activities...", 0, 1, DO_Network_normalizeActivities);
-		praat_addAction1 (classNetwork, 0, L"Spread activities...", 0, 1, DO_Network_spreadActivities);
-		praat_addAction1 (classNetwork, 1, L"Set activity clipping rule...", 0, 1, DO_Network_setActivityClippingRule);
-		praat_addAction1 (classNetwork, 1, L"Set activity leak...", 0, 1, DO_Network_setActivityLeak);
-		praat_addAction1 (classNetwork, 1, L"Set shunting...", 0, 1, DO_Network_setShunting);
-		praat_addAction1 (classNetwork, 1, L"-- weight --", 0, 1, 0);
-		praat_addAction1 (classNetwork, 0, L"Set weight...", 0, 1, DO_Network_setWeight);
-		praat_addAction1 (classNetwork, 0, L"Update weights", 0, 1, DO_Network_updateWeights);
-		praat_addAction1 (classNetwork, 0, L"Normalize weights...", 0, 1, DO_Network_normalizeWeights);
-		praat_addAction1 (classNetwork, 1, L"Set instar...", 0, 1, DO_Network_setInstar);
-		praat_addAction1 (classNetwork, 1, L"Set outstar...", 0, 1, DO_Network_setOutstar);
-		praat_addAction1 (classNetwork, 1, L"Set weight leak...", 0, 1, DO_Network_setWeightLeak);
+	praat_addAction1 (classOTMulti, 0, U"View & Edit", 0, praat_ATTRACTIVE, DO_OTMulti_edit);
+	praat_addAction1 (classOTMulti, 0, U"Edit", 0, praat_HIDDEN, DO_OTMulti_edit);
+	praat_addAction1 (classOTMulti, 0, U"Draw tableau...", 0, 0, DO_OTMulti_drawTableau);
+	praat_addAction1 (classOTMulti, 0, U"Draw tableau (narrowly)...", 0, 0, DO_OTMulti_drawTableau_narrowly);
+	praat_addAction1 (classOTMulti, 0, U"Query -", 0, 0, 0);
+	praat_addAction1 (classOTMulti, 1, U"Get number of constraints", 0, 1, DO_OTMulti_getNumberOfConstraints);
+	praat_addAction1 (classOTMulti, 1, U"Get constraint...", 0, 1, DO_OTMulti_getConstraint);
+	praat_addAction1 (classOTMulti, 1, U"Get constraint number...", 0, 1, DO_OTMulti_getConstraintIndexFromName);
+	praat_addAction1 (classOTMulti, 1, U"Get ranking value...", 0, 1, DO_OTMulti_getRankingValue);
+	praat_addAction1 (classOTMulti, 1, U"Get disharmony...", 0, 1, DO_OTMulti_getDisharmony);
+	praat_addAction1 (classOTMulti, 1, U"Get number of candidates", 0, 1, DO_OTMulti_getNumberOfCandidates);
+	praat_addAction1 (classOTMulti, 1, U"Get candidate...", 0, 1, DO_OTMulti_getCandidate);
+	praat_addAction1 (classOTMulti, 1, U"Get number of violations...", 0, 1, DO_OTMulti_getNumberOfViolations);
+	praat_addAction1 (classOTMulti, 1, U"-- parse --", 0, 1, 0);
+	praat_addAction1 (classOTMulti, 1, U"Get winner...", 0, 1, DO_OTMulti_getWinner);
+	praat_addAction1 (classOTMulti, 0, U"Evaluate", 0, 0, 0);
+	praat_addAction1 (classOTMulti, 0, U"Evaluate...", 0, 0, DO_OTMulti_evaluate);
+	praat_addAction1 (classOTMulti, 0, U"Get output...", 0, 0, DO_OTMulti_generateOptimalForm);
+	praat_addAction1 (classOTMulti, 0, U"Get outputs...", 0, 0, DO_OTMulti_generateOptimalForms);
+	praat_addAction1 (classOTMulti, 0, U"To output Distribution...", 0, 0, DO_OTMulti_to_Distribution);
+	praat_addAction1 (classOTMulti, 0, U"Modify ranking", 0, 0, 0);
+	praat_addAction1 (classOTMulti, 0, U"Set ranking...", 0, 0, DO_OTMulti_setRanking);
+	praat_addAction1 (classOTMulti, 0, U"Reset all rankings...", 0, 0, DO_OTMulti_resetAllRankings);
+	praat_addAction1 (classOTMulti, 0, U"Learn one...", 0, 0, DO_OTMulti_learnOne);
+	praat_addAction1 (classOTMulti, 0, U"Modify behaviour -", 0, 0, 0);
+	praat_addAction1 (classOTMulti, 1, U"Set decision strategy...", 0, 1, DO_OTMulti_setDecisionStrategy);
+	praat_addAction1 (classOTMulti, 1, U"Set leak...", 0, 1, DO_OTMulti_setLeak);
+	praat_addAction1 (classOTMulti, 1, U"Set constraint plasticity...", 0, 1, DO_OTMulti_setConstraintPlasticity);
+	praat_addAction1 (classOTMulti, 0, U"Modify structure -", 0, 0, 0);
+	praat_addAction1 (classOTMulti, 0, U"Remove constraint...", 0, 1, DO_OTMulti_removeConstraint);
+
+	praat_addAction2 (classOTGrammar, 1, classStrings, 1, U"Query -", 0, 0, 0);
+		praat_addAction2 (classOTGrammar, 1, classStrings, 1, U"Are all partial outputs grammatical?", 0, 1, DO_OTGrammar_Strings_areAllPartialOutputsGrammatical);
+		praat_addAction2 (classOTGrammar, 1, classStrings, 1, U"Are all partial outputs singly grammatical?", 0, 1, DO_OTGrammar_Strings_areAllPartialOutputsSinglyGrammatical);
+	praat_addAction2 (classOTGrammar, 1, classStrings, 1, U"Inputs to outputs...", 0, 0, DO_OTGrammar_Strings_inputsToOutputs);
+	praat_addAction2 (classOTGrammar, 1, classStrings, 1, U"Learn from partial outputs...", 0, 0, DO_OTGrammar_Strings_learnFromPartialOutputs);
+	praat_addAction2 (classOTGrammar, 1, classStrings, 2, U"Learn...", 0, 0, DO_OTGrammar_Stringses_learn);
+	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, U"Learn from partial outputs...", 0, 0, DO_OTGrammar_Distributions_learnFromPartialOutputs);
+	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, U"Learn from partial outputs (rrip)...", 0, 0, DO_OTGrammar_Distributions_learnFromPartialOutputs_rrip);
+	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, U"Learn from partial outputs (eip)...", 0, 0, DO_OTGrammar_Distributions_learnFromPartialOutputs_eip);
+	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, U"Learn from partial outputs (wrip)...", 0, 0, DO_OTGrammar_Distributions_learnFromPartialOutputs_wrip);
+	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, U"Get fraction correct...", 0, 0, DO_OTGrammar_Distributions_getFractionCorrect);
+	praat_addAction2 (classOTGrammar, 1, classDistributions, 1, U"List obligatory rankings...", 0, praat_HIDDEN, DO_OTGrammar_Distributions_listObligatoryRankings);
+	praat_addAction2 (classOTGrammar, 1, classPairDistribution, 1, U"Learn...", 0, 0, DO_OTGrammar_PairDistribution_learn);
+	praat_addAction2 (classOTGrammar, 1, classPairDistribution, 1, U"Find positive weights...", 0, 0, DO_OTGrammar_PairDistribution_findPositiveWeights);
+	praat_addAction2 (classOTGrammar, 1, classPairDistribution, 1, U"Get fraction correct...", 0, 0, DO_OTGrammar_PairDistribution_getFractionCorrect);
+	praat_addAction2 (classOTGrammar, 1, classPairDistribution, 1, U"Get minimum number correct...", 0, 0, DO_OTGrammar_PairDistribution_getMinimumNumberCorrect);
+	praat_addAction2 (classOTGrammar, 1, classPairDistribution, 1, U"List obligatory rankings", 0, 0, DO_OTGrammar_PairDistribution_listObligatoryRankings);
+	praat_addAction2 (classOTMulti, 1, classPairDistribution, 1, U"Learn...", 0, 0, DO_OTMulti_PairDistribution_learn);
+	praat_addAction2 (classOTMulti, 1, classStrings, 1, U"Get outputs...", 0, 0, DO_OTMulti_Strings_generateOptimalForms);
+
+	praat_addMenuCommand (U"Objects", U"New", U"Symmetric networks", 0, 0, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"Create empty Network...", 0, 1, DO_Create_empty_Network);
+		praat_addMenuCommand (U"Objects", U"New", U"Create rectangular Network...", 0, 1, DO_Create_rectangular_Network);
+		praat_addMenuCommand (U"Objects", U"New", U"Create rectangular Network (vertical)...", 0, 1, DO_Create_rectangular_Network_vertical);
+
+	praat_addAction1 (classNetwork, 0, U"Draw...", 0, 0, DO_Network_draw);
+	praat_addAction1 (classNetwork, 1, U"Tabulate -", 0, 0, 0);
+		praat_addAction1 (classNetwork, 1, U"List nodes...", 0, 1, DO_Network_listNodes);
+		praat_addAction1 (classNetwork, 1, U"Nodes down to table...", 0, 1, DO_Network_nodes_downto_Table);
+	praat_addAction1 (classNetwork, 0, U"Query -", 0, 0, 0);
+		praat_addAction1 (classNetwork, 1, U"Get activity...", 0, 1, DO_Network_getActivity);
+		praat_addAction1 (classNetwork, 1, U"Get weight...", 0, 1, DO_Network_getWeight);
+	praat_addAction1 (classNetwork, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classNetwork, 0, U"Add node...", 0, 1, DO_Network_addNode);
+		praat_addAction1 (classNetwork, 0, U"Add connection...", 0, 1, DO_Network_addConnection);
+		praat_addAction1 (classNetwork, 1, U"-- activity --", 0, 1, 0);
+		praat_addAction1 (classNetwork, 0, U"Set activity...", 0, 1, DO_Network_setActivity);
+		praat_addAction1 (classNetwork, 0, U"Set clamping...", 0, 1, DO_Network_setClamping);
+		praat_addAction1 (classNetwork, 0, U"Zero activities...", 0, 1, DO_Network_zeroActivities);
+		praat_addAction1 (classNetwork, 0, U"Normalize activities...", 0, 1, DO_Network_normalizeActivities);
+		praat_addAction1 (classNetwork, 0, U"Spread activities...", 0, 1, DO_Network_spreadActivities);
+		praat_addAction1 (classNetwork, 1, U"Set activity clipping rule...", 0, 1, DO_Network_setActivityClippingRule);
+		praat_addAction1 (classNetwork, 1, U"Set activity leak...", 0, 1, DO_Network_setActivityLeak);
+		praat_addAction1 (classNetwork, 1, U"Set shunting...", 0, 1, DO_Network_setShunting);
+		praat_addAction1 (classNetwork, 1, U"-- weight --", 0, 1, 0);
+		praat_addAction1 (classNetwork, 0, U"Set weight...", 0, 1, DO_Network_setWeight);
+		praat_addAction1 (classNetwork, 0, U"Update weights", 0, 1, DO_Network_updateWeights);
+		praat_addAction1 (classNetwork, 0, U"Normalize weights...", 0, 1, DO_Network_normalizeWeights);
+		praat_addAction1 (classNetwork, 1, U"Set instar...", 0, 1, DO_Network_setInstar);
+		praat_addAction1 (classNetwork, 1, U"Set outstar...", 0, 1, DO_Network_setOutstar);
+		praat_addAction1 (classNetwork, 1, U"Set weight leak...", 0, 1, DO_Network_setWeightLeak);
 }
 
 /* End of file praat_gram.cpp */
diff --git a/kar/Makefile b/kar/Makefile
index 7b8c6cd..e8956d3 100644
--- a/kar/Makefile
+++ b/kar/Makefile
@@ -1,9 +1,9 @@
 # Makefile of the library "kar"
-# Paul Boersma, 24 August 2013
+# Paul Boersma, 16 July 2015
 
 include ../makefile.defs
 
-OBJECTS = ipaSerifRegularPS.o ipaSerifRegular24.o longchar.o
+OBJECTS = ipaSerifRegularPS.o longchar.o
 
 .PHONY: all clean
 
diff --git a/kar/UnicodeData.h b/kar/UnicodeData.h
index 8e5a3f3..30485ab 100644
--- a/kar/UnicodeData.h
+++ b/kar/UnicodeData.h
@@ -1,26677 +1,26677 @@
 #define UNICODE_SPACE  0x0020
-#define UNITEXT_SPACE  L"\u0020"
+#define UNITEXT_SPACE  U"\u0020"
 #define UNICODE_EXCLAMATION_MARK  0x0021
-#define UNITEXT_EXCLAMATION_MARK  L"\u0021"
+#define UNITEXT_EXCLAMATION_MARK  U"\u0021"
 #define UNICODE_QUOTATION_MARK  0x0022
-#define UNITEXT_QUOTATION_MARK  L"\u0022"
+#define UNITEXT_QUOTATION_MARK  U"\u0022"
 #define UNICODE_NUMBER_SIGN  0x0023
-#define UNITEXT_NUMBER_SIGN  L"\u0023"
+#define UNITEXT_NUMBER_SIGN  U"\u0023"
 #define UNICODE_DOLLAR_SIGN  0x0024
-#define UNITEXT_DOLLAR_SIGN  L"\u0024"
+#define UNITEXT_DOLLAR_SIGN  U"\u0024"
 #define UNICODE_PERCENT_SIGN  0x0025
-#define UNITEXT_PERCENT_SIGN  L"\u0025"
+#define UNITEXT_PERCENT_SIGN  U"\u0025"
 #define UNICODE_AMPERSAND  0x0026
-#define UNITEXT_AMPERSAND  L"\u0026"
+#define UNITEXT_AMPERSAND  U"\u0026"
 #define UNICODE_APOSTROPHE  0x0027
-#define UNITEXT_APOSTROPHE  L"\u0027"
+#define UNITEXT_APOSTROPHE  U"\u0027"
 #define UNICODE_LEFT_PARENTHESIS  0x0028
-#define UNITEXT_LEFT_PARENTHESIS  L"\u0028"
+#define UNITEXT_LEFT_PARENTHESIS  U"\u0028"
 #define UNICODE_RIGHT_PARENTHESIS  0x0029
-#define UNITEXT_RIGHT_PARENTHESIS  L"\u0029"
+#define UNITEXT_RIGHT_PARENTHESIS  U"\u0029"
 #define UNICODE_ASTERISK  0x002a
-#define UNITEXT_ASTERISK  L"\u002a"
+#define UNITEXT_ASTERISK  U"\u002a"
 #define UNICODE_PLUS_SIGN  0x002b
-#define UNITEXT_PLUS_SIGN  L"\u002b"
+#define UNITEXT_PLUS_SIGN  U"\u002b"
 #define UNICODE_COMMA  0x002c
-#define UNITEXT_COMMA  L"\u002c"
+#define UNITEXT_COMMA  U"\u002c"
 #define UNICODE_HYPHEN_MINUS  0x002d
-#define UNITEXT_HYPHEN_MINUS  L"\u002d"
+#define UNITEXT_HYPHEN_MINUS  U"\u002d"
 #define UNICODE_FULL_STOP  0x002e
-#define UNITEXT_FULL_STOP  L"\u002e"
+#define UNITEXT_FULL_STOP  U"\u002e"
 #define UNICODE_SOLIDUS  0x002f
-#define UNITEXT_SOLIDUS  L"\u002f"
+#define UNITEXT_SOLIDUS  U"\u002f"
 #define UNICODE_DIGIT_ZERO  0x0030
-#define UNITEXT_DIGIT_ZERO  L"\u0030"
+#define UNITEXT_DIGIT_ZERO  U"\u0030"
 #define UNICODE_DIGIT_ONE  0x0031
-#define UNITEXT_DIGIT_ONE  L"\u0031"
+#define UNITEXT_DIGIT_ONE  U"\u0031"
 #define UNICODE_DIGIT_TWO  0x0032
-#define UNITEXT_DIGIT_TWO  L"\u0032"
+#define UNITEXT_DIGIT_TWO  U"\u0032"
 #define UNICODE_DIGIT_THREE  0x0033
-#define UNITEXT_DIGIT_THREE  L"\u0033"
+#define UNITEXT_DIGIT_THREE  U"\u0033"
 #define UNICODE_DIGIT_FOUR  0x0034
-#define UNITEXT_DIGIT_FOUR  L"\u0034"
+#define UNITEXT_DIGIT_FOUR  U"\u0034"
 #define UNICODE_DIGIT_FIVE  0x0035
-#define UNITEXT_DIGIT_FIVE  L"\u0035"
+#define UNITEXT_DIGIT_FIVE  U"\u0035"
 #define UNICODE_DIGIT_SIX  0x0036
-#define UNITEXT_DIGIT_SIX  L"\u0036"
+#define UNITEXT_DIGIT_SIX  U"\u0036"
 #define UNICODE_DIGIT_SEVEN  0x0037
-#define UNITEXT_DIGIT_SEVEN  L"\u0037"
+#define UNITEXT_DIGIT_SEVEN  U"\u0037"
 #define UNICODE_DIGIT_EIGHT  0x0038
-#define UNITEXT_DIGIT_EIGHT  L"\u0038"
+#define UNITEXT_DIGIT_EIGHT  U"\u0038"
 #define UNICODE_DIGIT_NINE  0x0039
-#define UNITEXT_DIGIT_NINE  L"\u0039"
+#define UNITEXT_DIGIT_NINE  U"\u0039"
 #define UNICODE_COLON  0x003a
-#define UNITEXT_COLON  L"\u003a"
+#define UNITEXT_COLON  U"\u003a"
 #define UNICODE_SEMICOLON  0x003b
-#define UNITEXT_SEMICOLON  L"\u003b"
+#define UNITEXT_SEMICOLON  U"\u003b"
 #define UNICODE_LESS_THAN_SIGN  0x003c
-#define UNITEXT_LESS_THAN_SIGN  L"\u003c"
+#define UNITEXT_LESS_THAN_SIGN  U"\u003c"
 #define UNICODE_EQUALS_SIGN  0x003d
-#define UNITEXT_EQUALS_SIGN  L"\u003d"
+#define UNITEXT_EQUALS_SIGN  U"\u003d"
 #define UNICODE_GREATER_THAN_SIGN  0x003e
-#define UNITEXT_GREATER_THAN_SIGN  L"\u003e"
+#define UNITEXT_GREATER_THAN_SIGN  U"\u003e"
 #define UNICODE_QUESTION_MARK  0x003f
-#define UNITEXT_QUESTION_MARK  L"\u003f"
+#define UNITEXT_QUESTION_MARK  U"\u003f"
 #define UNICODE_COMMERCIAL_AT  0x0040
-#define UNITEXT_COMMERCIAL_AT  L"\u0040"
+#define UNITEXT_COMMERCIAL_AT  U"\u0040"
 #define UNICODE_LATIN_CAPITAL_LETTER_A  0x0041
-#define UNITEXT_LATIN_CAPITAL_LETTER_A  L"\u0041"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A  U"\u0041"
 #define UNICODE_LATIN_CAPITAL_LETTER_B  0x0042
-#define UNITEXT_LATIN_CAPITAL_LETTER_B  L"\u0042"
+#define UNITEXT_LATIN_CAPITAL_LETTER_B  U"\u0042"
 #define UNICODE_LATIN_CAPITAL_LETTER_C  0x0043
-#define UNITEXT_LATIN_CAPITAL_LETTER_C  L"\u0043"
+#define UNITEXT_LATIN_CAPITAL_LETTER_C  U"\u0043"
 #define UNICODE_LATIN_CAPITAL_LETTER_D  0x0044
-#define UNITEXT_LATIN_CAPITAL_LETTER_D  L"\u0044"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D  U"\u0044"
 #define UNICODE_LATIN_CAPITAL_LETTER_E  0x0045
-#define UNITEXT_LATIN_CAPITAL_LETTER_E  L"\u0045"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E  U"\u0045"
 #define UNICODE_LATIN_CAPITAL_LETTER_F  0x0046
-#define UNITEXT_LATIN_CAPITAL_LETTER_F  L"\u0046"
+#define UNITEXT_LATIN_CAPITAL_LETTER_F  U"\u0046"
 #define UNICODE_LATIN_CAPITAL_LETTER_G  0x0047
-#define UNITEXT_LATIN_CAPITAL_LETTER_G  L"\u0047"
+#define UNITEXT_LATIN_CAPITAL_LETTER_G  U"\u0047"
 #define UNICODE_LATIN_CAPITAL_LETTER_H  0x0048
-#define UNITEXT_LATIN_CAPITAL_LETTER_H  L"\u0048"
+#define UNITEXT_LATIN_CAPITAL_LETTER_H  U"\u0048"
 #define UNICODE_LATIN_CAPITAL_LETTER_I  0x0049
-#define UNITEXT_LATIN_CAPITAL_LETTER_I  L"\u0049"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I  U"\u0049"
 #define UNICODE_LATIN_CAPITAL_LETTER_J  0x004a
-#define UNITEXT_LATIN_CAPITAL_LETTER_J  L"\u004a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_J  U"\u004a"
 #define UNICODE_LATIN_CAPITAL_LETTER_K  0x004b
-#define UNITEXT_LATIN_CAPITAL_LETTER_K  L"\u004b"
+#define UNITEXT_LATIN_CAPITAL_LETTER_K  U"\u004b"
 #define UNICODE_LATIN_CAPITAL_LETTER_L  0x004c
-#define UNITEXT_LATIN_CAPITAL_LETTER_L  L"\u004c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L  U"\u004c"
 #define UNICODE_LATIN_CAPITAL_LETTER_M  0x004d
-#define UNITEXT_LATIN_CAPITAL_LETTER_M  L"\u004d"
+#define UNITEXT_LATIN_CAPITAL_LETTER_M  U"\u004d"
 #define UNICODE_LATIN_CAPITAL_LETTER_N  0x004e
-#define UNITEXT_LATIN_CAPITAL_LETTER_N  L"\u004e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N  U"\u004e"
 #define UNICODE_LATIN_CAPITAL_LETTER_O  0x004f
-#define UNITEXT_LATIN_CAPITAL_LETTER_O  L"\u004f"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O  U"\u004f"
 #define UNICODE_LATIN_CAPITAL_LETTER_P  0x0050
-#define UNITEXT_LATIN_CAPITAL_LETTER_P  L"\u0050"
+#define UNITEXT_LATIN_CAPITAL_LETTER_P  U"\u0050"
 #define UNICODE_LATIN_CAPITAL_LETTER_Q  0x0051
-#define UNITEXT_LATIN_CAPITAL_LETTER_Q  L"\u0051"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Q  U"\u0051"
 #define UNICODE_LATIN_CAPITAL_LETTER_R  0x0052
-#define UNITEXT_LATIN_CAPITAL_LETTER_R  L"\u0052"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R  U"\u0052"
 #define UNICODE_LATIN_CAPITAL_LETTER_S  0x0053
-#define UNITEXT_LATIN_CAPITAL_LETTER_S  L"\u0053"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S  U"\u0053"
 #define UNICODE_LATIN_CAPITAL_LETTER_T  0x0054
-#define UNITEXT_LATIN_CAPITAL_LETTER_T  L"\u0054"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T  U"\u0054"
 #define UNICODE_LATIN_CAPITAL_LETTER_U  0x0055
-#define UNITEXT_LATIN_CAPITAL_LETTER_U  L"\u0055"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U  U"\u0055"
 #define UNICODE_LATIN_CAPITAL_LETTER_V  0x0056
-#define UNITEXT_LATIN_CAPITAL_LETTER_V  L"\u0056"
+#define UNITEXT_LATIN_CAPITAL_LETTER_V  U"\u0056"
 #define UNICODE_LATIN_CAPITAL_LETTER_W  0x0057
-#define UNITEXT_LATIN_CAPITAL_LETTER_W  L"\u0057"
+#define UNITEXT_LATIN_CAPITAL_LETTER_W  U"\u0057"
 #define UNICODE_LATIN_CAPITAL_LETTER_X  0x0058
-#define UNITEXT_LATIN_CAPITAL_LETTER_X  L"\u0058"
+#define UNITEXT_LATIN_CAPITAL_LETTER_X  U"\u0058"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y  0x0059
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y  L"\u0059"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y  U"\u0059"
 #define UNICODE_LATIN_CAPITAL_LETTER_Z  0x005a
-#define UNITEXT_LATIN_CAPITAL_LETTER_Z  L"\u005a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Z  U"\u005a"
 #define UNICODE_LEFT_SQUARE_BRACKET  0x005b
-#define UNITEXT_LEFT_SQUARE_BRACKET  L"\u005b"
+#define UNITEXT_LEFT_SQUARE_BRACKET  U"\u005b"
 #define UNICODE_REVERSE_SOLIDUS  0x005c
-#define UNITEXT_REVERSE_SOLIDUS  L"\u005c"
+#define UNITEXT_REVERSE_SOLIDUS  U"\u005c"
 #define UNICODE_RIGHT_SQUARE_BRACKET  0x005d
-#define UNITEXT_RIGHT_SQUARE_BRACKET  L"\u005d"
+#define UNITEXT_RIGHT_SQUARE_BRACKET  U"\u005d"
 #define UNICODE_CIRCUMFLEX_ACCENT  0x005e
-#define UNITEXT_CIRCUMFLEX_ACCENT  L"\u005e"
+#define UNITEXT_CIRCUMFLEX_ACCENT  U"\u005e"
 #define UNICODE_LOW_LINE  0x005f
-#define UNITEXT_LOW_LINE  L"\u005f"
+#define UNITEXT_LOW_LINE  U"\u005f"
 #define UNICODE_GRAVE_ACCENT  0x0060
-#define UNITEXT_GRAVE_ACCENT  L"\u0060"
+#define UNITEXT_GRAVE_ACCENT  U"\u0060"
 #define UNICODE_LATIN_SMALL_LETTER_A  0x0061
-#define UNITEXT_LATIN_SMALL_LETTER_A  L"\u0061"
+#define UNITEXT_LATIN_SMALL_LETTER_A  U"\u0061"
 #define UNICODE_LATIN_SMALL_LETTER_B  0x0062
-#define UNITEXT_LATIN_SMALL_LETTER_B  L"\u0062"
+#define UNITEXT_LATIN_SMALL_LETTER_B  U"\u0062"
 #define UNICODE_LATIN_SMALL_LETTER_C  0x0063
-#define UNITEXT_LATIN_SMALL_LETTER_C  L"\u0063"
+#define UNITEXT_LATIN_SMALL_LETTER_C  U"\u0063"
 #define UNICODE_LATIN_SMALL_LETTER_D  0x0064
-#define UNITEXT_LATIN_SMALL_LETTER_D  L"\u0064"
+#define UNITEXT_LATIN_SMALL_LETTER_D  U"\u0064"
 #define UNICODE_LATIN_SMALL_LETTER_E  0x0065
-#define UNITEXT_LATIN_SMALL_LETTER_E  L"\u0065"
+#define UNITEXT_LATIN_SMALL_LETTER_E  U"\u0065"
 #define UNICODE_LATIN_SMALL_LETTER_F  0x0066
-#define UNITEXT_LATIN_SMALL_LETTER_F  L"\u0066"
+#define UNITEXT_LATIN_SMALL_LETTER_F  U"\u0066"
 #define UNICODE_LATIN_SMALL_LETTER_G  0x0067
-#define UNITEXT_LATIN_SMALL_LETTER_G  L"\u0067"
+#define UNITEXT_LATIN_SMALL_LETTER_G  U"\u0067"
 #define UNICODE_LATIN_SMALL_LETTER_H  0x0068
-#define UNITEXT_LATIN_SMALL_LETTER_H  L"\u0068"
+#define UNITEXT_LATIN_SMALL_LETTER_H  U"\u0068"
 #define UNICODE_LATIN_SMALL_LETTER_I  0x0069
-#define UNITEXT_LATIN_SMALL_LETTER_I  L"\u0069"
+#define UNITEXT_LATIN_SMALL_LETTER_I  U"\u0069"
 #define UNICODE_LATIN_SMALL_LETTER_J  0x006a
-#define UNITEXT_LATIN_SMALL_LETTER_J  L"\u006a"
+#define UNITEXT_LATIN_SMALL_LETTER_J  U"\u006a"
 #define UNICODE_LATIN_SMALL_LETTER_K  0x006b
-#define UNITEXT_LATIN_SMALL_LETTER_K  L"\u006b"
+#define UNITEXT_LATIN_SMALL_LETTER_K  U"\u006b"
 #define UNICODE_LATIN_SMALL_LETTER_L  0x006c
-#define UNITEXT_LATIN_SMALL_LETTER_L  L"\u006c"
+#define UNITEXT_LATIN_SMALL_LETTER_L  U"\u006c"
 #define UNICODE_LATIN_SMALL_LETTER_M  0x006d
-#define UNITEXT_LATIN_SMALL_LETTER_M  L"\u006d"
+#define UNITEXT_LATIN_SMALL_LETTER_M  U"\u006d"
 #define UNICODE_LATIN_SMALL_LETTER_N  0x006e
-#define UNITEXT_LATIN_SMALL_LETTER_N  L"\u006e"
+#define UNITEXT_LATIN_SMALL_LETTER_N  U"\u006e"
 #define UNICODE_LATIN_SMALL_LETTER_O  0x006f
-#define UNITEXT_LATIN_SMALL_LETTER_O  L"\u006f"
+#define UNITEXT_LATIN_SMALL_LETTER_O  U"\u006f"
 #define UNICODE_LATIN_SMALL_LETTER_P  0x0070
-#define UNITEXT_LATIN_SMALL_LETTER_P  L"\u0070"
+#define UNITEXT_LATIN_SMALL_LETTER_P  U"\u0070"
 #define UNICODE_LATIN_SMALL_LETTER_Q  0x0071
-#define UNITEXT_LATIN_SMALL_LETTER_Q  L"\u0071"
+#define UNITEXT_LATIN_SMALL_LETTER_Q  U"\u0071"
 #define UNICODE_LATIN_SMALL_LETTER_R  0x0072
-#define UNITEXT_LATIN_SMALL_LETTER_R  L"\u0072"
+#define UNITEXT_LATIN_SMALL_LETTER_R  U"\u0072"
 #define UNICODE_LATIN_SMALL_LETTER_S  0x0073
-#define UNITEXT_LATIN_SMALL_LETTER_S  L"\u0073"
+#define UNITEXT_LATIN_SMALL_LETTER_S  U"\u0073"
 #define UNICODE_LATIN_SMALL_LETTER_T  0x0074
-#define UNITEXT_LATIN_SMALL_LETTER_T  L"\u0074"
+#define UNITEXT_LATIN_SMALL_LETTER_T  U"\u0074"
 #define UNICODE_LATIN_SMALL_LETTER_U  0x0075
-#define UNITEXT_LATIN_SMALL_LETTER_U  L"\u0075"
+#define UNITEXT_LATIN_SMALL_LETTER_U  U"\u0075"
 #define UNICODE_LATIN_SMALL_LETTER_V  0x0076
-#define UNITEXT_LATIN_SMALL_LETTER_V  L"\u0076"
+#define UNITEXT_LATIN_SMALL_LETTER_V  U"\u0076"
 #define UNICODE_LATIN_SMALL_LETTER_W  0x0077
-#define UNITEXT_LATIN_SMALL_LETTER_W  L"\u0077"
+#define UNITEXT_LATIN_SMALL_LETTER_W  U"\u0077"
 #define UNICODE_LATIN_SMALL_LETTER_X  0x0078
-#define UNITEXT_LATIN_SMALL_LETTER_X  L"\u0078"
+#define UNITEXT_LATIN_SMALL_LETTER_X  U"\u0078"
 #define UNICODE_LATIN_SMALL_LETTER_Y  0x0079
-#define UNITEXT_LATIN_SMALL_LETTER_Y  L"\u0079"
+#define UNITEXT_LATIN_SMALL_LETTER_Y  U"\u0079"
 #define UNICODE_LATIN_SMALL_LETTER_Z  0x007a
-#define UNITEXT_LATIN_SMALL_LETTER_Z  L"\u007a"
+#define UNITEXT_LATIN_SMALL_LETTER_Z  U"\u007a"
 #define UNICODE_LEFT_CURLY_BRACKET  0x007b
-#define UNITEXT_LEFT_CURLY_BRACKET  L"\u007b"
+#define UNITEXT_LEFT_CURLY_BRACKET  U"\u007b"
 #define UNICODE_VERTICAL_LINE  0x007c
-#define UNITEXT_VERTICAL_LINE  L"\u007c"
+#define UNITEXT_VERTICAL_LINE  U"\u007c"
 #define UNICODE_RIGHT_CURLY_BRACKET  0x007d
-#define UNITEXT_RIGHT_CURLY_BRACKET  L"\u007d"
+#define UNITEXT_RIGHT_CURLY_BRACKET  U"\u007d"
 #define UNICODE_TILDE  0x007e
-#define UNITEXT_TILDE  L"\u007e"
+#define UNITEXT_TILDE  U"\u007e"
 #define UNICODE_NO_BREAK_SPACE  0x00a0
-#define UNITEXT_NO_BREAK_SPACE  L"\u00a0"
+#define UNITEXT_NO_BREAK_SPACE  U"\u00a0"
 #define UNICODE_INVERTED_EXCLAMATION_MARK  0x00a1
-#define UNITEXT_INVERTED_EXCLAMATION_MARK  L"\u00a1"
+#define UNITEXT_INVERTED_EXCLAMATION_MARK  U"\u00a1"
 #define UNICODE_CENT_SIGN  0x00a2
-#define UNITEXT_CENT_SIGN  L"\u00a2"
+#define UNITEXT_CENT_SIGN  U"\u00a2"
 #define UNICODE_POUND_SIGN  0x00a3
-#define UNITEXT_POUND_SIGN  L"\u00a3"
+#define UNITEXT_POUND_SIGN  U"\u00a3"
 #define UNICODE_CURRENCY_SIGN  0x00a4
-#define UNITEXT_CURRENCY_SIGN  L"\u00a4"
+#define UNITEXT_CURRENCY_SIGN  U"\u00a4"
 #define UNICODE_YEN_SIGN  0x00a5
-#define UNITEXT_YEN_SIGN  L"\u00a5"
+#define UNITEXT_YEN_SIGN  U"\u00a5"
 #define UNICODE_BROKEN_BAR  0x00a6
-#define UNITEXT_BROKEN_BAR  L"\u00a6"
+#define UNITEXT_BROKEN_BAR  U"\u00a6"
 #define UNICODE_SECTION_SIGN  0x00a7
-#define UNITEXT_SECTION_SIGN  L"\u00a7"
+#define UNITEXT_SECTION_SIGN  U"\u00a7"
 #define UNICODE_DIAERESIS  0x00a8
-#define UNITEXT_DIAERESIS  L"\u00a8"
+#define UNITEXT_DIAERESIS  U"\u00a8"
 #define UNICODE_COPYRIGHT_SIGN  0x00a9
-#define UNITEXT_COPYRIGHT_SIGN  L"\u00a9"
+#define UNITEXT_COPYRIGHT_SIGN  U"\u00a9"
 #define UNICODE_FEMININE_ORDINAL_INDICATOR  0x00aa
-#define UNITEXT_FEMININE_ORDINAL_INDICATOR  L"\u00aa"
+#define UNITEXT_FEMININE_ORDINAL_INDICATOR  U"\u00aa"
 #define UNICODE_LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK  0x00ab
-#define UNITEXT_LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK  L"\u00ab"
+#define UNITEXT_LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK  U"\u00ab"
 #define UNICODE_NOT_SIGN  0x00ac
-#define UNITEXT_NOT_SIGN  L"\u00ac"
+#define UNITEXT_NOT_SIGN  U"\u00ac"
 #define UNICODE_SOFT_HYPHEN  0x00ad
-#define UNITEXT_SOFT_HYPHEN  L"\u00ad"
+#define UNITEXT_SOFT_HYPHEN  U"\u00ad"
 #define UNICODE_REGISTERED_SIGN  0x00ae
-#define UNITEXT_REGISTERED_SIGN  L"\u00ae"
+#define UNITEXT_REGISTERED_SIGN  U"\u00ae"
 #define UNICODE_MACRON  0x00af
-#define UNITEXT_MACRON  L"\u00af"
+#define UNITEXT_MACRON  U"\u00af"
 #define UNICODE_DEGREE_SIGN  0x00b0
-#define UNITEXT_DEGREE_SIGN  L"\u00b0"
+#define UNITEXT_DEGREE_SIGN  U"\u00b0"
 #define UNICODE_PLUS_MINUS_SIGN  0x00b1
-#define UNITEXT_PLUS_MINUS_SIGN  L"\u00b1"
+#define UNITEXT_PLUS_MINUS_SIGN  U"\u00b1"
 #define UNICODE_SUPERSCRIPT_TWO  0x00b2
-#define UNITEXT_SUPERSCRIPT_TWO  L"\u00b2"
+#define UNITEXT_SUPERSCRIPT_TWO  U"\u00b2"
 #define UNICODE_SUPERSCRIPT_THREE  0x00b3
-#define UNITEXT_SUPERSCRIPT_THREE  L"\u00b3"
+#define UNITEXT_SUPERSCRIPT_THREE  U"\u00b3"
 #define UNICODE_ACUTE_ACCENT  0x00b4
-#define UNITEXT_ACUTE_ACCENT  L"\u00b4"
+#define UNITEXT_ACUTE_ACCENT  U"\u00b4"
 #define UNICODE_MICRO_SIGN  0x00b5
-#define UNITEXT_MICRO_SIGN  L"\u00b5"
+#define UNITEXT_MICRO_SIGN  U"\u00b5"
 #define UNICODE_PILCROW_SIGN  0x00b6
-#define UNITEXT_PILCROW_SIGN  L"\u00b6"
+#define UNITEXT_PILCROW_SIGN  U"\u00b6"
 #define UNICODE_MIDDLE_DOT  0x00b7
-#define UNITEXT_MIDDLE_DOT  L"\u00b7"
+#define UNITEXT_MIDDLE_DOT  U"\u00b7"
 #define UNICODE_CEDILLA  0x00b8
-#define UNITEXT_CEDILLA  L"\u00b8"
+#define UNITEXT_CEDILLA  U"\u00b8"
 #define UNICODE_SUPERSCRIPT_ONE  0x00b9
-#define UNITEXT_SUPERSCRIPT_ONE  L"\u00b9"
+#define UNITEXT_SUPERSCRIPT_ONE  U"\u00b9"
 #define UNICODE_MASCULINE_ORDINAL_INDICATOR  0x00ba
-#define UNITEXT_MASCULINE_ORDINAL_INDICATOR  L"\u00ba"
+#define UNITEXT_MASCULINE_ORDINAL_INDICATOR  U"\u00ba"
 #define UNICODE_RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK  0x00bb
-#define UNITEXT_RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK  L"\u00bb"
+#define UNITEXT_RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK  U"\u00bb"
 #define UNICODE_VULGAR_FRACTION_ONE_QUARTER  0x00bc
-#define UNITEXT_VULGAR_FRACTION_ONE_QUARTER  L"\u00bc"
+#define UNITEXT_VULGAR_FRACTION_ONE_QUARTER  U"\u00bc"
 #define UNICODE_VULGAR_FRACTION_ONE_HALF  0x00bd
-#define UNITEXT_VULGAR_FRACTION_ONE_HALF  L"\u00bd"
+#define UNITEXT_VULGAR_FRACTION_ONE_HALF  U"\u00bd"
 #define UNICODE_VULGAR_FRACTION_THREE_QUARTERS  0x00be
-#define UNITEXT_VULGAR_FRACTION_THREE_QUARTERS  L"\u00be"
+#define UNITEXT_VULGAR_FRACTION_THREE_QUARTERS  U"\u00be"
 #define UNICODE_INVERTED_QUESTION_MARK  0x00bf
-#define UNITEXT_INVERTED_QUESTION_MARK  L"\u00bf"
+#define UNITEXT_INVERTED_QUESTION_MARK  U"\u00bf"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_GRAVE  0x00c0
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_GRAVE  L"\u00c0"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_GRAVE  U"\u00c0"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_ACUTE  0x00c1
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_ACUTE  L"\u00c1"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_ACUTE  U"\u00c1"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX  0x00c2
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX  L"\u00c2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX  U"\u00c2"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_TILDE  0x00c3
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_TILDE  L"\u00c3"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_TILDE  U"\u00c3"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS  0x00c4
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS  L"\u00c4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS  U"\u00c4"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE  0x00c5
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE  L"\u00c5"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE  U"\u00c5"
 #define UNICODE_LATIN_CAPITAL_LETTER_AE  0x00c6
-#define UNITEXT_LATIN_CAPITAL_LETTER_AE  L"\u00c6"
+#define UNITEXT_LATIN_CAPITAL_LETTER_AE  U"\u00c6"
 #define UNICODE_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA  0x00c7
-#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA  L"\u00c7"
+#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA  U"\u00c7"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_GRAVE  0x00c8
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_GRAVE  L"\u00c8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_GRAVE  U"\u00c8"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_ACUTE  0x00c9
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_ACUTE  L"\u00c9"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_ACUTE  U"\u00c9"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX  0x00ca
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX  L"\u00ca"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX  U"\u00ca"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS  0x00cb
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS  L"\u00cb"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS  U"\u00cb"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_GRAVE  0x00cc
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_GRAVE  L"\u00cc"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_GRAVE  U"\u00cc"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_ACUTE  0x00cd
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_ACUTE  L"\u00cd"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_ACUTE  U"\u00cd"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX  0x00ce
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX  L"\u00ce"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX  U"\u00ce"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS  0x00cf
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS  L"\u00cf"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS  U"\u00cf"
 #define UNICODE_LATIN_CAPITAL_LETTER_ETH  0x00d0
-#define UNITEXT_LATIN_CAPITAL_LETTER_ETH  L"\u00d0"
+#define UNITEXT_LATIN_CAPITAL_LETTER_ETH  U"\u00d0"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_TILDE  0x00d1
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_TILDE  L"\u00d1"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_TILDE  U"\u00d1"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_GRAVE  0x00d2
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_GRAVE  L"\u00d2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_GRAVE  U"\u00d2"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_ACUTE  0x00d3
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_ACUTE  L"\u00d3"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_ACUTE  U"\u00d3"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX  0x00d4
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX  L"\u00d4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX  U"\u00d4"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_TILDE  0x00d5
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_TILDE  L"\u00d5"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_TILDE  U"\u00d5"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS  0x00d6
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS  L"\u00d6"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS  U"\u00d6"
 #define UNICODE_MULTIPLICATION_SIGN  0x00d7
-#define UNITEXT_MULTIPLICATION_SIGN  L"\u00d7"
+#define UNITEXT_MULTIPLICATION_SIGN  U"\u00d7"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_STROKE  0x00d8
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_STROKE  L"\u00d8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_STROKE  U"\u00d8"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_GRAVE  0x00d9
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_GRAVE  L"\u00d9"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_GRAVE  U"\u00d9"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_ACUTE  0x00da
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_ACUTE  L"\u00da"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_ACUTE  U"\u00da"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX  0x00db
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX  L"\u00db"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX  U"\u00db"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS  0x00dc
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS  L"\u00dc"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS  U"\u00dc"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_ACUTE  0x00dd
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_ACUTE  L"\u00dd"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_ACUTE  U"\u00dd"
 #define UNICODE_LATIN_CAPITAL_LETTER_THORN  0x00de
-#define UNITEXT_LATIN_CAPITAL_LETTER_THORN  L"\u00de"
+#define UNITEXT_LATIN_CAPITAL_LETTER_THORN  U"\u00de"
 #define UNICODE_LATIN_SMALL_LETTER_SHARP_S  0x00df
-#define UNITEXT_LATIN_SMALL_LETTER_SHARP_S  L"\u00df"
+#define UNITEXT_LATIN_SMALL_LETTER_SHARP_S  U"\u00df"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_GRAVE  0x00e0
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_GRAVE  L"\u00e0"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_GRAVE  U"\u00e0"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_ACUTE  0x00e1
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_ACUTE  L"\u00e1"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_ACUTE  U"\u00e1"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX  0x00e2
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX  L"\u00e2"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX  U"\u00e2"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_TILDE  0x00e3
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_TILDE  L"\u00e3"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_TILDE  U"\u00e3"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_DIAERESIS  0x00e4
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DIAERESIS  L"\u00e4"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DIAERESIS  U"\u00e4"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE  0x00e5
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE  L"\u00e5"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE  U"\u00e5"
 #define UNICODE_LATIN_SMALL_LETTER_AE  0x00e6
-#define UNITEXT_LATIN_SMALL_LETTER_AE  L"\u00e6"
+#define UNITEXT_LATIN_SMALL_LETTER_AE  U"\u00e6"
 #define UNICODE_LATIN_SMALL_LETTER_C_WITH_CEDILLA  0x00e7
-#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_CEDILLA  L"\u00e7"
+#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_CEDILLA  U"\u00e7"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_GRAVE  0x00e8
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_GRAVE  L"\u00e8"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_GRAVE  U"\u00e8"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_ACUTE  0x00e9
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_ACUTE  L"\u00e9"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_ACUTE  U"\u00e9"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX  0x00ea
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX  L"\u00ea"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX  U"\u00ea"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_DIAERESIS  0x00eb
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_DIAERESIS  L"\u00eb"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_DIAERESIS  U"\u00eb"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_GRAVE  0x00ec
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_GRAVE  L"\u00ec"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_GRAVE  U"\u00ec"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_ACUTE  0x00ed
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_ACUTE  L"\u00ed"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_ACUTE  U"\u00ed"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX  0x00ee
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX  L"\u00ee"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX  U"\u00ee"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_DIAERESIS  0x00ef
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_DIAERESIS  L"\u00ef"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_DIAERESIS  U"\u00ef"
 #define UNICODE_LATIN_SMALL_LETTER_ETH  0x00f0
-#define UNITEXT_LATIN_SMALL_LETTER_ETH  L"\u00f0"
+#define UNITEXT_LATIN_SMALL_LETTER_ETH  U"\u00f0"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_TILDE  0x00f1
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_TILDE  L"\u00f1"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_TILDE  U"\u00f1"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_GRAVE  0x00f2
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_GRAVE  L"\u00f2"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_GRAVE  U"\u00f2"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_ACUTE  0x00f3
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_ACUTE  L"\u00f3"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_ACUTE  U"\u00f3"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX  0x00f4
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX  L"\u00f4"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX  U"\u00f4"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_TILDE  0x00f5
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_TILDE  L"\u00f5"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_TILDE  U"\u00f5"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_DIAERESIS  0x00f6
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DIAERESIS  L"\u00f6"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DIAERESIS  U"\u00f6"
 #define UNICODE_DIVISION_SIGN  0x00f7
-#define UNITEXT_DIVISION_SIGN  L"\u00f7"
+#define UNITEXT_DIVISION_SIGN  U"\u00f7"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_STROKE  0x00f8
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_STROKE  L"\u00f8"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_STROKE  U"\u00f8"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_GRAVE  0x00f9
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_GRAVE  L"\u00f9"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_GRAVE  U"\u00f9"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_ACUTE  0x00fa
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_ACUTE  L"\u00fa"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_ACUTE  U"\u00fa"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX  0x00fb
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX  L"\u00fb"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX  U"\u00fb"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS  0x00fc
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS  L"\u00fc"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS  U"\u00fc"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_ACUTE  0x00fd
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_ACUTE  L"\u00fd"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_ACUTE  U"\u00fd"
 #define UNICODE_LATIN_SMALL_LETTER_THORN  0x00fe
-#define UNITEXT_LATIN_SMALL_LETTER_THORN  L"\u00fe"
+#define UNITEXT_LATIN_SMALL_LETTER_THORN  U"\u00fe"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS  0x00ff
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS  L"\u00ff"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS  U"\u00ff"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_MACRON  0x0100
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_MACRON  L"\u0100"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_MACRON  U"\u0100"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_MACRON  0x0101
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_MACRON  L"\u0101"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_MACRON  U"\u0101"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_BREVE  0x0102
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE  L"\u0102"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE  U"\u0102"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_BREVE  0x0103
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE  L"\u0103"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE  U"\u0103"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_OGONEK  0x0104
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_OGONEK  L"\u0104"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_OGONEK  U"\u0104"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_OGONEK  0x0105
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_OGONEK  L"\u0105"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_OGONEK  U"\u0105"
 #define UNICODE_LATIN_CAPITAL_LETTER_C_WITH_ACUTE  0x0106
-#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_ACUTE  L"\u0106"
+#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_ACUTE  U"\u0106"
 #define UNICODE_LATIN_SMALL_LETTER_C_WITH_ACUTE  0x0107
-#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_ACUTE  L"\u0107"
+#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_ACUTE  U"\u0107"
 #define UNICODE_LATIN_CAPITAL_LETTER_C_WITH_CIRCUMFLEX  0x0108
-#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_CIRCUMFLEX  L"\u0108"
+#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_CIRCUMFLEX  U"\u0108"
 #define UNICODE_LATIN_SMALL_LETTER_C_WITH_CIRCUMFLEX  0x0109
-#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_CIRCUMFLEX  L"\u0109"
+#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_CIRCUMFLEX  U"\u0109"
 #define UNICODE_LATIN_CAPITAL_LETTER_C_WITH_DOT_ABOVE  0x010a
-#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_DOT_ABOVE  L"\u010a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_DOT_ABOVE  U"\u010a"
 #define UNICODE_LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE  0x010b
-#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE  L"\u010b"
+#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_DOT_ABOVE  U"\u010b"
 #define UNICODE_LATIN_CAPITAL_LETTER_C_WITH_CARON  0x010c
-#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_CARON  L"\u010c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_CARON  U"\u010c"
 #define UNICODE_LATIN_SMALL_LETTER_C_WITH_CARON  0x010d
-#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_CARON  L"\u010d"
+#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_CARON  U"\u010d"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_CARON  0x010e
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_CARON  L"\u010e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_CARON  U"\u010e"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_CARON  0x010f
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_CARON  L"\u010f"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_CARON  U"\u010f"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_STROKE  0x0110
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_STROKE  L"\u0110"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_STROKE  U"\u0110"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_STROKE  0x0111
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_STROKE  L"\u0111"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_STROKE  U"\u0111"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_MACRON  0x0112
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_MACRON  L"\u0112"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_MACRON  U"\u0112"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_MACRON  0x0113
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_MACRON  L"\u0113"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_MACRON  U"\u0113"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_BREVE  0x0114
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_BREVE  L"\u0114"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_BREVE  U"\u0114"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_BREVE  0x0115
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_BREVE  L"\u0115"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_BREVE  U"\u0115"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE  0x0116
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE  L"\u0116"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_DOT_ABOVE  U"\u0116"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE  0x0117
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE  L"\u0117"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_DOT_ABOVE  U"\u0117"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_OGONEK  0x0118
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_OGONEK  L"\u0118"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_OGONEK  U"\u0118"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_OGONEK  0x0119
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_OGONEK  L"\u0119"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_OGONEK  U"\u0119"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CARON  0x011a
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CARON  L"\u011a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CARON  U"\u011a"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_CARON  0x011b
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CARON  L"\u011b"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CARON  U"\u011b"
 #define UNICODE_LATIN_CAPITAL_LETTER_G_WITH_CIRCUMFLEX  0x011c
-#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_CIRCUMFLEX  L"\u011c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_CIRCUMFLEX  U"\u011c"
 #define UNICODE_LATIN_SMALL_LETTER_G_WITH_CIRCUMFLEX  0x011d
-#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_CIRCUMFLEX  L"\u011d"
+#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_CIRCUMFLEX  U"\u011d"
 #define UNICODE_LATIN_CAPITAL_LETTER_G_WITH_BREVE  0x011e
-#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_BREVE  L"\u011e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_BREVE  U"\u011e"
 #define UNICODE_LATIN_SMALL_LETTER_G_WITH_BREVE  0x011f
-#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_BREVE  L"\u011f"
+#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_BREVE  U"\u011f"
 #define UNICODE_LATIN_CAPITAL_LETTER_G_WITH_DOT_ABOVE  0x0120
-#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_DOT_ABOVE  L"\u0120"
+#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_DOT_ABOVE  U"\u0120"
 #define UNICODE_LATIN_SMALL_LETTER_G_WITH_DOT_ABOVE  0x0121
-#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_DOT_ABOVE  L"\u0121"
+#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_DOT_ABOVE  U"\u0121"
 #define UNICODE_LATIN_CAPITAL_LETTER_G_WITH_CEDILLA  0x0122
-#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_CEDILLA  L"\u0122"
+#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_CEDILLA  U"\u0122"
 #define UNICODE_LATIN_SMALL_LETTER_G_WITH_CEDILLA  0x0123
-#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_CEDILLA  L"\u0123"
+#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_CEDILLA  U"\u0123"
 #define UNICODE_LATIN_CAPITAL_LETTER_H_WITH_CIRCUMFLEX  0x0124
-#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_CIRCUMFLEX  L"\u0124"
+#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_CIRCUMFLEX  U"\u0124"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_CIRCUMFLEX  0x0125
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_CIRCUMFLEX  L"\u0125"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_CIRCUMFLEX  U"\u0125"
 #define UNICODE_LATIN_CAPITAL_LETTER_H_WITH_STROKE  0x0126
-#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_STROKE  L"\u0126"
+#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_STROKE  U"\u0126"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_STROKE  0x0127
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_STROKE  L"\u0127"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_STROKE  U"\u0127"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_TILDE  0x0128
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_TILDE  L"\u0128"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_TILDE  U"\u0128"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_TILDE  0x0129
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_TILDE  L"\u0129"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_TILDE  U"\u0129"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_MACRON  0x012a
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_MACRON  L"\u012a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_MACRON  U"\u012a"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_MACRON  0x012b
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_MACRON  L"\u012b"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_MACRON  U"\u012b"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_BREVE  0x012c
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_BREVE  L"\u012c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_BREVE  U"\u012c"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_BREVE  0x012d
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_BREVE  L"\u012d"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_BREVE  U"\u012d"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_OGONEK  0x012e
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_OGONEK  L"\u012e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_OGONEK  U"\u012e"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_OGONEK  0x012f
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_OGONEK  L"\u012f"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_OGONEK  U"\u012f"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE  0x0130
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE  L"\u0130"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE  U"\u0130"
 #define UNICODE_LATIN_SMALL_LETTER_DOTLESS_I  0x0131
-#define UNITEXT_LATIN_SMALL_LETTER_DOTLESS_I  L"\u0131"
+#define UNITEXT_LATIN_SMALL_LETTER_DOTLESS_I  U"\u0131"
 #define UNICODE_LATIN_CAPITAL_LIGATURE_IJ  0x0132
-#define UNITEXT_LATIN_CAPITAL_LIGATURE_IJ  L"\u0132"
+#define UNITEXT_LATIN_CAPITAL_LIGATURE_IJ  U"\u0132"
 #define UNICODE_LATIN_SMALL_LIGATURE_IJ  0x0133
-#define UNITEXT_LATIN_SMALL_LIGATURE_IJ  L"\u0133"
+#define UNITEXT_LATIN_SMALL_LIGATURE_IJ  U"\u0133"
 #define UNICODE_LATIN_CAPITAL_LETTER_J_WITH_CIRCUMFLEX  0x0134
-#define UNITEXT_LATIN_CAPITAL_LETTER_J_WITH_CIRCUMFLEX  L"\u0134"
+#define UNITEXT_LATIN_CAPITAL_LETTER_J_WITH_CIRCUMFLEX  U"\u0134"
 #define UNICODE_LATIN_SMALL_LETTER_J_WITH_CIRCUMFLEX  0x0135
-#define UNITEXT_LATIN_SMALL_LETTER_J_WITH_CIRCUMFLEX  L"\u0135"
+#define UNITEXT_LATIN_SMALL_LETTER_J_WITH_CIRCUMFLEX  U"\u0135"
 #define UNICODE_LATIN_CAPITAL_LETTER_K_WITH_CEDILLA  0x0136
-#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_CEDILLA  L"\u0136"
+#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_CEDILLA  U"\u0136"
 #define UNICODE_LATIN_SMALL_LETTER_K_WITH_CEDILLA  0x0137
-#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_CEDILLA  L"\u0137"
+#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_CEDILLA  U"\u0137"
 #define UNICODE_LATIN_SMALL_LETTER_KRA  0x0138
-#define UNITEXT_LATIN_SMALL_LETTER_KRA  L"\u0138"
+#define UNITEXT_LATIN_SMALL_LETTER_KRA  U"\u0138"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_ACUTE  0x0139
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_ACUTE  L"\u0139"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_ACUTE  U"\u0139"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_ACUTE  0x013a
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_ACUTE  L"\u013a"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_ACUTE  U"\u013a"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_CEDILLA  0x013b
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_CEDILLA  L"\u013b"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_CEDILLA  U"\u013b"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_CEDILLA  0x013c
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_CEDILLA  L"\u013c"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_CEDILLA  U"\u013c"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_CARON  0x013d
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_CARON  L"\u013d"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_CARON  U"\u013d"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_CARON  0x013e
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_CARON  L"\u013e"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_CARON  U"\u013e"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_MIDDLE_DOT  0x013f
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_MIDDLE_DOT  L"\u013f"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_MIDDLE_DOT  U"\u013f"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_MIDDLE_DOT  0x0140
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_MIDDLE_DOT  L"\u0140"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_MIDDLE_DOT  U"\u0140"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_STROKE  0x0141
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_STROKE  L"\u0141"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_STROKE  U"\u0141"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_STROKE  0x0142
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_STROKE  L"\u0142"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_STROKE  U"\u0142"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_ACUTE  0x0143
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_ACUTE  L"\u0143"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_ACUTE  U"\u0143"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_ACUTE  0x0144
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_ACUTE  L"\u0144"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_ACUTE  U"\u0144"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_CEDILLA  0x0145
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_CEDILLA  L"\u0145"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_CEDILLA  U"\u0145"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_CEDILLA  0x0146
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_CEDILLA  L"\u0146"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_CEDILLA  U"\u0146"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_CARON  0x0147
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_CARON  L"\u0147"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_CARON  U"\u0147"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_CARON  0x0148
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_CARON  L"\u0148"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_CARON  U"\u0148"
 #define UNICODE_LATIN_SMALL_LETTER_N_PRECEDED_BY_APOSTROPHE  0x0149
-#define UNITEXT_LATIN_SMALL_LETTER_N_PRECEDED_BY_APOSTROPHE  L"\u0149"
+#define UNITEXT_LATIN_SMALL_LETTER_N_PRECEDED_BY_APOSTROPHE  U"\u0149"
 #define UNICODE_LATIN_CAPITAL_LETTER_ENG  0x014a
-#define UNITEXT_LATIN_CAPITAL_LETTER_ENG  L"\u014a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_ENG  U"\u014a"
 #define UNICODE_LATIN_SMALL_LETTER_ENG  0x014b
-#define UNITEXT_LATIN_SMALL_LETTER_ENG  L"\u014b"
+#define UNITEXT_LATIN_SMALL_LETTER_ENG  U"\u014b"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_MACRON  0x014c
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_MACRON  L"\u014c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_MACRON  U"\u014c"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_MACRON  0x014d
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_MACRON  L"\u014d"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_MACRON  U"\u014d"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_BREVE  0x014e
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_BREVE  L"\u014e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_BREVE  U"\u014e"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_BREVE  0x014f
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_BREVE  L"\u014f"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_BREVE  U"\u014f"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_ACUTE  0x0150
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_ACUTE  L"\u0150"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_ACUTE  U"\u0150"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_DOUBLE_ACUTE  0x0151
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DOUBLE_ACUTE  L"\u0151"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DOUBLE_ACUTE  U"\u0151"
 #define UNICODE_LATIN_CAPITAL_LIGATURE_OE  0x0152
-#define UNITEXT_LATIN_CAPITAL_LIGATURE_OE  L"\u0152"
+#define UNITEXT_LATIN_CAPITAL_LIGATURE_OE  U"\u0152"
 #define UNICODE_LATIN_SMALL_LIGATURE_OE  0x0153
-#define UNITEXT_LATIN_SMALL_LIGATURE_OE  L"\u0153"
+#define UNITEXT_LATIN_SMALL_LIGATURE_OE  U"\u0153"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_ACUTE  0x0154
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_ACUTE  L"\u0154"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_ACUTE  U"\u0154"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_ACUTE  0x0155
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_ACUTE  L"\u0155"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_ACUTE  U"\u0155"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_CEDILLA  0x0156
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_CEDILLA  L"\u0156"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_CEDILLA  U"\u0156"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_CEDILLA  0x0157
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_CEDILLA  L"\u0157"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_CEDILLA  U"\u0157"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_CARON  0x0158
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_CARON  L"\u0158"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_CARON  U"\u0158"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_CARON  0x0159
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_CARON  L"\u0159"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_CARON  U"\u0159"
 #define UNICODE_LATIN_CAPITAL_LETTER_S_WITH_ACUTE  0x015a
-#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_ACUTE  L"\u015a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_ACUTE  U"\u015a"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_ACUTE  0x015b
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_ACUTE  L"\u015b"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_ACUTE  U"\u015b"
 #define UNICODE_LATIN_CAPITAL_LETTER_S_WITH_CIRCUMFLEX  0x015c
-#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_CIRCUMFLEX  L"\u015c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_CIRCUMFLEX  U"\u015c"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_CIRCUMFLEX  0x015d
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_CIRCUMFLEX  L"\u015d"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_CIRCUMFLEX  U"\u015d"
 #define UNICODE_LATIN_CAPITAL_LETTER_S_WITH_CEDILLA  0x015e
-#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_CEDILLA  L"\u015e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_CEDILLA  U"\u015e"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_CEDILLA  0x015f
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_CEDILLA  L"\u015f"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_CEDILLA  U"\u015f"
 #define UNICODE_LATIN_CAPITAL_LETTER_S_WITH_CARON  0x0160
-#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_CARON  L"\u0160"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_CARON  U"\u0160"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_CARON  0x0161
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_CARON  L"\u0161"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_CARON  U"\u0161"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_CEDILLA  0x0162
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_CEDILLA  L"\u0162"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_CEDILLA  U"\u0162"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_CEDILLA  0x0163
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_CEDILLA  L"\u0163"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_CEDILLA  U"\u0163"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_CARON  0x0164
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_CARON  L"\u0164"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_CARON  U"\u0164"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_CARON  0x0165
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_CARON  L"\u0165"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_CARON  U"\u0165"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_STROKE  0x0166
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_STROKE  L"\u0166"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_STROKE  U"\u0166"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_STROKE  0x0167
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_STROKE  L"\u0167"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_STROKE  U"\u0167"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_TILDE  0x0168
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_TILDE  L"\u0168"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_TILDE  U"\u0168"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_TILDE  0x0169
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_TILDE  L"\u0169"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_TILDE  U"\u0169"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_MACRON  0x016a
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_MACRON  L"\u016a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_MACRON  U"\u016a"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_MACRON  0x016b
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_MACRON  L"\u016b"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_MACRON  U"\u016b"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_BREVE  0x016c
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_BREVE  L"\u016c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_BREVE  U"\u016c"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_BREVE  0x016d
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_BREVE  L"\u016d"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_BREVE  U"\u016d"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE  0x016e
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE  L"\u016e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_RING_ABOVE  U"\u016e"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_RING_ABOVE  0x016f
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_RING_ABOVE  L"\u016f"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_RING_ABOVE  U"\u016f"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE  0x0170
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE  L"\u0170"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE  U"\u0170"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_DOUBLE_ACUTE  0x0171
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DOUBLE_ACUTE  L"\u0171"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DOUBLE_ACUTE  U"\u0171"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_OGONEK  0x0172
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_OGONEK  L"\u0172"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_OGONEK  U"\u0172"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_OGONEK  0x0173
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_OGONEK  L"\u0173"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_OGONEK  U"\u0173"
 #define UNICODE_LATIN_CAPITAL_LETTER_W_WITH_CIRCUMFLEX  0x0174
-#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_CIRCUMFLEX  L"\u0174"
+#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_CIRCUMFLEX  U"\u0174"
 #define UNICODE_LATIN_SMALL_LETTER_W_WITH_CIRCUMFLEX  0x0175
-#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_CIRCUMFLEX  L"\u0175"
+#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_CIRCUMFLEX  U"\u0175"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_CIRCUMFLEX  0x0176
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_CIRCUMFLEX  L"\u0176"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_CIRCUMFLEX  U"\u0176"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_CIRCUMFLEX  0x0177
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_CIRCUMFLEX  L"\u0177"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_CIRCUMFLEX  U"\u0177"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS  0x0178
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS  L"\u0178"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS  U"\u0178"
 #define UNICODE_LATIN_CAPITAL_LETTER_Z_WITH_ACUTE  0x0179
-#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_ACUTE  L"\u0179"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_ACUTE  U"\u0179"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_ACUTE  0x017a
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_ACUTE  L"\u017a"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_ACUTE  U"\u017a"
 #define UNICODE_LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE  0x017b
-#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE  L"\u017b"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_DOT_ABOVE  U"\u017b"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE  0x017c
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE  L"\u017c"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_DOT_ABOVE  U"\u017c"
 #define UNICODE_LATIN_CAPITAL_LETTER_Z_WITH_CARON  0x017d
-#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_CARON  L"\u017d"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_CARON  U"\u017d"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_CARON  0x017e
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_CARON  L"\u017e"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_CARON  U"\u017e"
 #define UNICODE_LATIN_SMALL_LETTER_LONG_S  0x017f
-#define UNITEXT_LATIN_SMALL_LETTER_LONG_S  L"\u017f"
+#define UNITEXT_LATIN_SMALL_LETTER_LONG_S  U"\u017f"
 #define UNICODE_LATIN_SMALL_LETTER_B_WITH_STROKE  0x0180
-#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_STROKE  L"\u0180"
+#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_STROKE  U"\u0180"
 #define UNICODE_LATIN_CAPITAL_LETTER_B_WITH_HOOK  0x0181
-#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_HOOK  L"\u0181"
+#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_HOOK  U"\u0181"
 #define UNICODE_LATIN_CAPITAL_LETTER_B_WITH_TOPBAR  0x0182
-#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_TOPBAR  L"\u0182"
+#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_TOPBAR  U"\u0182"
 #define UNICODE_LATIN_SMALL_LETTER_B_WITH_TOPBAR  0x0183
-#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_TOPBAR  L"\u0183"
+#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_TOPBAR  U"\u0183"
 #define UNICODE_LATIN_CAPITAL_LETTER_TONE_SIX  0x0184
-#define UNITEXT_LATIN_CAPITAL_LETTER_TONE_SIX  L"\u0184"
+#define UNITEXT_LATIN_CAPITAL_LETTER_TONE_SIX  U"\u0184"
 #define UNICODE_LATIN_SMALL_LETTER_TONE_SIX  0x0185
-#define UNITEXT_LATIN_SMALL_LETTER_TONE_SIX  L"\u0185"
+#define UNITEXT_LATIN_SMALL_LETTER_TONE_SIX  U"\u0185"
 #define UNICODE_LATIN_CAPITAL_LETTER_OPEN_O  0x0186
-#define UNITEXT_LATIN_CAPITAL_LETTER_OPEN_O  L"\u0186"
+#define UNITEXT_LATIN_CAPITAL_LETTER_OPEN_O  U"\u0186"
 #define UNICODE_LATIN_CAPITAL_LETTER_C_WITH_HOOK  0x0187
-#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_HOOK  L"\u0187"
+#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_HOOK  U"\u0187"
 #define UNICODE_LATIN_SMALL_LETTER_C_WITH_HOOK  0x0188
-#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_HOOK  L"\u0188"
+#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_HOOK  U"\u0188"
 #define UNICODE_LATIN_CAPITAL_LETTER_AFRICAN_D  0x0189
-#define UNITEXT_LATIN_CAPITAL_LETTER_AFRICAN_D  L"\u0189"
+#define UNITEXT_LATIN_CAPITAL_LETTER_AFRICAN_D  U"\u0189"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_HOOK  0x018a
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_HOOK  L"\u018a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_HOOK  U"\u018a"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_TOPBAR  0x018b
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_TOPBAR  L"\u018b"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_TOPBAR  U"\u018b"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_TOPBAR  0x018c
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_TOPBAR  L"\u018c"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_TOPBAR  U"\u018c"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_DELTA  0x018d
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_DELTA  L"\u018d"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_DELTA  U"\u018d"
 #define UNICODE_LATIN_CAPITAL_LETTER_REVERSED_E  0x018e
-#define UNITEXT_LATIN_CAPITAL_LETTER_REVERSED_E  L"\u018e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_REVERSED_E  U"\u018e"
 #define UNICODE_LATIN_CAPITAL_LETTER_SCHWA  0x018f
-#define UNITEXT_LATIN_CAPITAL_LETTER_SCHWA  L"\u018f"
+#define UNITEXT_LATIN_CAPITAL_LETTER_SCHWA  U"\u018f"
 #define UNICODE_LATIN_CAPITAL_LETTER_OPEN_E  0x0190
-#define UNITEXT_LATIN_CAPITAL_LETTER_OPEN_E  L"\u0190"
+#define UNITEXT_LATIN_CAPITAL_LETTER_OPEN_E  U"\u0190"
 #define UNICODE_LATIN_CAPITAL_LETTER_F_WITH_HOOK  0x0191
-#define UNITEXT_LATIN_CAPITAL_LETTER_F_WITH_HOOK  L"\u0191"
+#define UNITEXT_LATIN_CAPITAL_LETTER_F_WITH_HOOK  U"\u0191"
 #define UNICODE_LATIN_SMALL_LETTER_F_WITH_HOOK  0x0192
-#define UNITEXT_LATIN_SMALL_LETTER_F_WITH_HOOK  L"\u0192"
+#define UNITEXT_LATIN_SMALL_LETTER_F_WITH_HOOK  U"\u0192"
 #define UNICODE_LATIN_CAPITAL_LETTER_G_WITH_HOOK  0x0193
-#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_HOOK  L"\u0193"
+#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_HOOK  U"\u0193"
 #define UNICODE_LATIN_CAPITAL_LETTER_GAMMA  0x0194
-#define UNITEXT_LATIN_CAPITAL_LETTER_GAMMA  L"\u0194"
+#define UNITEXT_LATIN_CAPITAL_LETTER_GAMMA  U"\u0194"
 #define UNICODE_LATIN_SMALL_LETTER_HV  0x0195
-#define UNITEXT_LATIN_SMALL_LETTER_HV  L"\u0195"
+#define UNITEXT_LATIN_SMALL_LETTER_HV  U"\u0195"
 #define UNICODE_LATIN_CAPITAL_LETTER_IOTA  0x0196
-#define UNITEXT_LATIN_CAPITAL_LETTER_IOTA  L"\u0196"
+#define UNITEXT_LATIN_CAPITAL_LETTER_IOTA  U"\u0196"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_STROKE  0x0197
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_STROKE  L"\u0197"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_STROKE  U"\u0197"
 #define UNICODE_LATIN_CAPITAL_LETTER_K_WITH_HOOK  0x0198
-#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_HOOK  L"\u0198"
+#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_HOOK  U"\u0198"
 #define UNICODE_LATIN_SMALL_LETTER_K_WITH_HOOK  0x0199
-#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_HOOK  L"\u0199"
+#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_HOOK  U"\u0199"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_BAR  0x019a
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_BAR  L"\u019a"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_BAR  U"\u019a"
 #define UNICODE_LATIN_SMALL_LETTER_LAMBDA_WITH_STROKE  0x019b
-#define UNITEXT_LATIN_SMALL_LETTER_LAMBDA_WITH_STROKE  L"\u019b"
+#define UNITEXT_LATIN_SMALL_LETTER_LAMBDA_WITH_STROKE  U"\u019b"
 #define UNICODE_LATIN_CAPITAL_LETTER_TURNED_M  0x019c
-#define UNITEXT_LATIN_CAPITAL_LETTER_TURNED_M  L"\u019c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_TURNED_M  U"\u019c"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_LEFT_HOOK  0x019d
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_LEFT_HOOK  L"\u019d"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_LEFT_HOOK  U"\u019d"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_LONG_RIGHT_LEG  0x019e
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_LONG_RIGHT_LEG  L"\u019e"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_LONG_RIGHT_LEG  U"\u019e"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_MIDDLE_TILDE  0x019f
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_MIDDLE_TILDE  L"\u019f"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_MIDDLE_TILDE  U"\u019f"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_HORN  0x01a0
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN  L"\u01a0"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN  U"\u01a0"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_HORN  0x01a1
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN  L"\u01a1"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN  U"\u01a1"
 #define UNICODE_LATIN_CAPITAL_LETTER_OI  0x01a2
-#define UNITEXT_LATIN_CAPITAL_LETTER_OI  L"\u01a2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_OI  U"\u01a2"
 #define UNICODE_LATIN_SMALL_LETTER_OI  0x01a3
-#define UNITEXT_LATIN_SMALL_LETTER_OI  L"\u01a3"
+#define UNITEXT_LATIN_SMALL_LETTER_OI  U"\u01a3"
 #define UNICODE_LATIN_CAPITAL_LETTER_P_WITH_HOOK  0x01a4
-#define UNITEXT_LATIN_CAPITAL_LETTER_P_WITH_HOOK  L"\u01a4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_P_WITH_HOOK  U"\u01a4"
 #define UNICODE_LATIN_SMALL_LETTER_P_WITH_HOOK  0x01a5
-#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_HOOK  L"\u01a5"
+#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_HOOK  U"\u01a5"
 #define UNICODE_LATIN_LETTER_YR  0x01a6
-#define UNITEXT_LATIN_LETTER_YR  L"\u01a6"
+#define UNITEXT_LATIN_LETTER_YR  U"\u01a6"
 #define UNICODE_LATIN_CAPITAL_LETTER_TONE_TWO  0x01a7
-#define UNITEXT_LATIN_CAPITAL_LETTER_TONE_TWO  L"\u01a7"
+#define UNITEXT_LATIN_CAPITAL_LETTER_TONE_TWO  U"\u01a7"
 #define UNICODE_LATIN_SMALL_LETTER_TONE_TWO  0x01a8
-#define UNITEXT_LATIN_SMALL_LETTER_TONE_TWO  L"\u01a8"
+#define UNITEXT_LATIN_SMALL_LETTER_TONE_TWO  U"\u01a8"
 #define UNICODE_LATIN_CAPITAL_LETTER_ESH  0x01a9
-#define UNITEXT_LATIN_CAPITAL_LETTER_ESH  L"\u01a9"
+#define UNITEXT_LATIN_CAPITAL_LETTER_ESH  U"\u01a9"
 #define UNICODE_LATIN_LETTER_REVERSED_ESH_LOOP  0x01aa
-#define UNITEXT_LATIN_LETTER_REVERSED_ESH_LOOP  L"\u01aa"
+#define UNITEXT_LATIN_LETTER_REVERSED_ESH_LOOP  U"\u01aa"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_PALATAL_HOOK  0x01ab
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_PALATAL_HOOK  L"\u01ab"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_PALATAL_HOOK  U"\u01ab"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_HOOK  0x01ac
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_HOOK  L"\u01ac"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_HOOK  U"\u01ac"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_HOOK  0x01ad
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_HOOK  L"\u01ad"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_HOOK  U"\u01ad"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_RETROFLEX_HOOK  0x01ae
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_RETROFLEX_HOOK  L"\u01ae"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_RETROFLEX_HOOK  U"\u01ae"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_HORN  0x01af
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN  L"\u01af"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN  U"\u01af"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_HORN  0x01b0
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN  L"\u01b0"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN  U"\u01b0"
 #define UNICODE_LATIN_CAPITAL_LETTER_UPSILON  0x01b1
-#define UNITEXT_LATIN_CAPITAL_LETTER_UPSILON  L"\u01b1"
+#define UNITEXT_LATIN_CAPITAL_LETTER_UPSILON  U"\u01b1"
 #define UNICODE_LATIN_CAPITAL_LETTER_V_WITH_HOOK  0x01b2
-#define UNITEXT_LATIN_CAPITAL_LETTER_V_WITH_HOOK  L"\u01b2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_V_WITH_HOOK  U"\u01b2"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_HOOK  0x01b3
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_HOOK  L"\u01b3"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_HOOK  U"\u01b3"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_HOOK  0x01b4
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_HOOK  L"\u01b4"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_HOOK  U"\u01b4"
 #define UNICODE_LATIN_CAPITAL_LETTER_Z_WITH_STROKE  0x01b5
-#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_STROKE  L"\u01b5"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_STROKE  U"\u01b5"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_STROKE  0x01b6
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_STROKE  L"\u01b6"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_STROKE  U"\u01b6"
 #define UNICODE_LATIN_CAPITAL_LETTER_EZH  0x01b7
-#define UNITEXT_LATIN_CAPITAL_LETTER_EZH  L"\u01b7"
+#define UNITEXT_LATIN_CAPITAL_LETTER_EZH  U"\u01b7"
 #define UNICODE_LATIN_CAPITAL_LETTER_EZH_REVERSED  0x01b8
-#define UNITEXT_LATIN_CAPITAL_LETTER_EZH_REVERSED  L"\u01b8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_EZH_REVERSED  U"\u01b8"
 #define UNICODE_LATIN_SMALL_LETTER_EZH_REVERSED  0x01b9
-#define UNITEXT_LATIN_SMALL_LETTER_EZH_REVERSED  L"\u01b9"
+#define UNITEXT_LATIN_SMALL_LETTER_EZH_REVERSED  U"\u01b9"
 #define UNICODE_LATIN_SMALL_LETTER_EZH_WITH_TAIL  0x01ba
-#define UNITEXT_LATIN_SMALL_LETTER_EZH_WITH_TAIL  L"\u01ba"
+#define UNITEXT_LATIN_SMALL_LETTER_EZH_WITH_TAIL  U"\u01ba"
 #define UNICODE_LATIN_LETTER_TWO_WITH_STROKE  0x01bb
-#define UNITEXT_LATIN_LETTER_TWO_WITH_STROKE  L"\u01bb"
+#define UNITEXT_LATIN_LETTER_TWO_WITH_STROKE  U"\u01bb"
 #define UNICODE_LATIN_CAPITAL_LETTER_TONE_FIVE  0x01bc
-#define UNITEXT_LATIN_CAPITAL_LETTER_TONE_FIVE  L"\u01bc"
+#define UNITEXT_LATIN_CAPITAL_LETTER_TONE_FIVE  U"\u01bc"
 #define UNICODE_LATIN_SMALL_LETTER_TONE_FIVE  0x01bd
-#define UNITEXT_LATIN_SMALL_LETTER_TONE_FIVE  L"\u01bd"
+#define UNITEXT_LATIN_SMALL_LETTER_TONE_FIVE  U"\u01bd"
 #define UNICODE_LATIN_LETTER_INVERTED_GLOTTAL_STOP_WITH_STROKE  0x01be
-#define UNITEXT_LATIN_LETTER_INVERTED_GLOTTAL_STOP_WITH_STROKE  L"\u01be"
+#define UNITEXT_LATIN_LETTER_INVERTED_GLOTTAL_STOP_WITH_STROKE  U"\u01be"
 #define UNICODE_LATIN_LETTER_WYNN  0x01bf
-#define UNITEXT_LATIN_LETTER_WYNN  L"\u01bf"
+#define UNITEXT_LATIN_LETTER_WYNN  U"\u01bf"
 #define UNICODE_LATIN_LETTER_DENTAL_CLICK  0x01c0
-#define UNITEXT_LATIN_LETTER_DENTAL_CLICK  L"\u01c0"
+#define UNITEXT_LATIN_LETTER_DENTAL_CLICK  U"\u01c0"
 #define UNICODE_LATIN_LETTER_LATERAL_CLICK  0x01c1
-#define UNITEXT_LATIN_LETTER_LATERAL_CLICK  L"\u01c1"
+#define UNITEXT_LATIN_LETTER_LATERAL_CLICK  U"\u01c1"
 #define UNICODE_LATIN_LETTER_ALVEOLAR_CLICK  0x01c2
-#define UNITEXT_LATIN_LETTER_ALVEOLAR_CLICK  L"\u01c2"
+#define UNITEXT_LATIN_LETTER_ALVEOLAR_CLICK  U"\u01c2"
 #define UNICODE_LATIN_LETTER_RETROFLEX_CLICK  0x01c3
-#define UNITEXT_LATIN_LETTER_RETROFLEX_CLICK  L"\u01c3"
+#define UNITEXT_LATIN_LETTER_RETROFLEX_CLICK  U"\u01c3"
 #define UNICODE_LATIN_CAPITAL_LETTER_DZ_WITH_CARON  0x01c4
-#define UNITEXT_LATIN_CAPITAL_LETTER_DZ_WITH_CARON  L"\u01c4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_DZ_WITH_CARON  U"\u01c4"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_SMALL_LETTER_Z_WITH_CARON  0x01c5
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_SMALL_LETTER_Z_WITH_CARON  L"\u01c5"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_SMALL_LETTER_Z_WITH_CARON  U"\u01c5"
 #define UNICODE_LATIN_SMALL_LETTER_DZ_WITH_CARON  0x01c6
-#define UNITEXT_LATIN_SMALL_LETTER_DZ_WITH_CARON  L"\u01c6"
+#define UNITEXT_LATIN_SMALL_LETTER_DZ_WITH_CARON  U"\u01c6"
 #define UNICODE_LATIN_CAPITAL_LETTER_LJ  0x01c7
-#define UNITEXT_LATIN_CAPITAL_LETTER_LJ  L"\u01c7"
+#define UNITEXT_LATIN_CAPITAL_LETTER_LJ  U"\u01c7"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_SMALL_LETTER_J  0x01c8
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_SMALL_LETTER_J  L"\u01c8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_SMALL_LETTER_J  U"\u01c8"
 #define UNICODE_LATIN_SMALL_LETTER_LJ  0x01c9
-#define UNITEXT_LATIN_SMALL_LETTER_LJ  L"\u01c9"
+#define UNITEXT_LATIN_SMALL_LETTER_LJ  U"\u01c9"
 #define UNICODE_LATIN_CAPITAL_LETTER_NJ  0x01ca
-#define UNITEXT_LATIN_CAPITAL_LETTER_NJ  L"\u01ca"
+#define UNITEXT_LATIN_CAPITAL_LETTER_NJ  U"\u01ca"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_SMALL_LETTER_J  0x01cb
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_SMALL_LETTER_J  L"\u01cb"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_SMALL_LETTER_J  U"\u01cb"
 #define UNICODE_LATIN_SMALL_LETTER_NJ  0x01cc
-#define UNITEXT_LATIN_SMALL_LETTER_NJ  L"\u01cc"
+#define UNITEXT_LATIN_SMALL_LETTER_NJ  U"\u01cc"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CARON  0x01cd
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CARON  L"\u01cd"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CARON  U"\u01cd"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_CARON  0x01ce
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CARON  L"\u01ce"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CARON  U"\u01ce"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_CARON  0x01cf
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_CARON  L"\u01cf"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_CARON  U"\u01cf"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_CARON  0x01d0
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_CARON  L"\u01d0"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_CARON  U"\u01d0"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CARON  0x01d1
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CARON  L"\u01d1"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CARON  U"\u01d1"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_CARON  0x01d2
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CARON  L"\u01d2"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CARON  U"\u01d2"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_CARON  0x01d3
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_CARON  L"\u01d3"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_CARON  U"\u01d3"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_CARON  0x01d4
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_CARON  L"\u01d4"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_CARON  U"\u01d4"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_MACRON  0x01d5
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_MACRON  L"\u01d5"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_MACRON  U"\u01d5"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_MACRON  0x01d6
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_MACRON  L"\u01d6"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_MACRON  U"\u01d6"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_ACUTE  0x01d7
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_ACUTE  L"\u01d7"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_ACUTE  U"\u01d7"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_ACUTE  0x01d8
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_ACUTE  L"\u01d8"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_ACUTE  U"\u01d8"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_CARON  0x01d9
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_CARON  L"\u01d9"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_CARON  U"\u01d9"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_CARON  0x01da
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_CARON  L"\u01da"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_CARON  U"\u01da"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_GRAVE  0x01db
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_GRAVE  L"\u01db"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_AND_GRAVE  U"\u01db"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_GRAVE  0x01dc
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_GRAVE  L"\u01dc"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_AND_GRAVE  U"\u01dc"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_E  0x01dd
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_E  L"\u01dd"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_E  U"\u01dd"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS_AND_MACRON  0x01de
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS_AND_MACRON  L"\u01de"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS_AND_MACRON  U"\u01de"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_DIAERESIS_AND_MACRON  0x01df
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DIAERESIS_AND_MACRON  L"\u01df"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DIAERESIS_AND_MACRON  U"\u01df"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON  0x01e0
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON  L"\u01e0"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON  U"\u01e0"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON  0x01e1
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON  L"\u01e1"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE_AND_MACRON  U"\u01e1"
 #define UNICODE_LATIN_CAPITAL_LETTER_AE_WITH_MACRON  0x01e2
-#define UNITEXT_LATIN_CAPITAL_LETTER_AE_WITH_MACRON  L"\u01e2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_AE_WITH_MACRON  U"\u01e2"
 #define UNICODE_LATIN_SMALL_LETTER_AE_WITH_MACRON  0x01e3
-#define UNITEXT_LATIN_SMALL_LETTER_AE_WITH_MACRON  L"\u01e3"
+#define UNITEXT_LATIN_SMALL_LETTER_AE_WITH_MACRON  U"\u01e3"
 #define UNICODE_LATIN_CAPITAL_LETTER_G_WITH_STROKE  0x01e4
-#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_STROKE  L"\u01e4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_STROKE  U"\u01e4"
 #define UNICODE_LATIN_SMALL_LETTER_G_WITH_STROKE  0x01e5
-#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_STROKE  L"\u01e5"
+#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_STROKE  U"\u01e5"
 #define UNICODE_LATIN_CAPITAL_LETTER_G_WITH_CARON  0x01e6
-#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_CARON  L"\u01e6"
+#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_CARON  U"\u01e6"
 #define UNICODE_LATIN_SMALL_LETTER_G_WITH_CARON  0x01e7
-#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_CARON  L"\u01e7"
+#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_CARON  U"\u01e7"
 #define UNICODE_LATIN_CAPITAL_LETTER_K_WITH_CARON  0x01e8
-#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_CARON  L"\u01e8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_CARON  U"\u01e8"
 #define UNICODE_LATIN_SMALL_LETTER_K_WITH_CARON  0x01e9
-#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_CARON  L"\u01e9"
+#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_CARON  U"\u01e9"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_OGONEK  0x01ea
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_OGONEK  L"\u01ea"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_OGONEK  U"\u01ea"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_OGONEK  0x01eb
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_OGONEK  L"\u01eb"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_OGONEK  U"\u01eb"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_OGONEK_AND_MACRON  0x01ec
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_OGONEK_AND_MACRON  L"\u01ec"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_OGONEK_AND_MACRON  U"\u01ec"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_OGONEK_AND_MACRON  0x01ed
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_OGONEK_AND_MACRON  L"\u01ed"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_OGONEK_AND_MACRON  U"\u01ed"
 #define UNICODE_LATIN_CAPITAL_LETTER_EZH_WITH_CARON  0x01ee
-#define UNITEXT_LATIN_CAPITAL_LETTER_EZH_WITH_CARON  L"\u01ee"
+#define UNITEXT_LATIN_CAPITAL_LETTER_EZH_WITH_CARON  U"\u01ee"
 #define UNICODE_LATIN_SMALL_LETTER_EZH_WITH_CARON  0x01ef
-#define UNITEXT_LATIN_SMALL_LETTER_EZH_WITH_CARON  L"\u01ef"
+#define UNITEXT_LATIN_SMALL_LETTER_EZH_WITH_CARON  U"\u01ef"
 #define UNICODE_LATIN_SMALL_LETTER_J_WITH_CARON  0x01f0
-#define UNITEXT_LATIN_SMALL_LETTER_J_WITH_CARON  L"\u01f0"
+#define UNITEXT_LATIN_SMALL_LETTER_J_WITH_CARON  U"\u01f0"
 #define UNICODE_LATIN_CAPITAL_LETTER_DZ  0x01f1
-#define UNITEXT_LATIN_CAPITAL_LETTER_DZ  L"\u01f1"
+#define UNITEXT_LATIN_CAPITAL_LETTER_DZ  U"\u01f1"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_SMALL_LETTER_Z  0x01f2
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_SMALL_LETTER_Z  L"\u01f2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_SMALL_LETTER_Z  U"\u01f2"
 #define UNICODE_LATIN_SMALL_LETTER_DZ  0x01f3
-#define UNITEXT_LATIN_SMALL_LETTER_DZ  L"\u01f3"
+#define UNITEXT_LATIN_SMALL_LETTER_DZ  U"\u01f3"
 #define UNICODE_LATIN_CAPITAL_LETTER_G_WITH_ACUTE  0x01f4
-#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_ACUTE  L"\u01f4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_ACUTE  U"\u01f4"
 #define UNICODE_LATIN_SMALL_LETTER_G_WITH_ACUTE  0x01f5
-#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_ACUTE  L"\u01f5"
+#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_ACUTE  U"\u01f5"
 #define UNICODE_LATIN_CAPITAL_LETTER_HWAIR  0x01f6
-#define UNITEXT_LATIN_CAPITAL_LETTER_HWAIR  L"\u01f6"
+#define UNITEXT_LATIN_CAPITAL_LETTER_HWAIR  U"\u01f6"
 #define UNICODE_LATIN_CAPITAL_LETTER_WYNN  0x01f7
-#define UNITEXT_LATIN_CAPITAL_LETTER_WYNN  L"\u01f7"
+#define UNITEXT_LATIN_CAPITAL_LETTER_WYNN  U"\u01f7"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_GRAVE  0x01f8
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_GRAVE  L"\u01f8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_GRAVE  U"\u01f8"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_GRAVE  0x01f9
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_GRAVE  L"\u01f9"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_GRAVE  U"\u01f9"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE  0x01fa
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE  L"\u01fa"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE  U"\u01fa"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE  0x01fb
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE  L"\u01fb"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE_AND_ACUTE  U"\u01fb"
 #define UNICODE_LATIN_CAPITAL_LETTER_AE_WITH_ACUTE  0x01fc
-#define UNITEXT_LATIN_CAPITAL_LETTER_AE_WITH_ACUTE  L"\u01fc"
+#define UNITEXT_LATIN_CAPITAL_LETTER_AE_WITH_ACUTE  U"\u01fc"
 #define UNICODE_LATIN_SMALL_LETTER_AE_WITH_ACUTE  0x01fd
-#define UNITEXT_LATIN_SMALL_LETTER_AE_WITH_ACUTE  L"\u01fd"
+#define UNITEXT_LATIN_SMALL_LETTER_AE_WITH_ACUTE  U"\u01fd"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_STROKE_AND_ACUTE  0x01fe
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_STROKE_AND_ACUTE  L"\u01fe"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_STROKE_AND_ACUTE  U"\u01fe"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_STROKE_AND_ACUTE  0x01ff
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_STROKE_AND_ACUTE  L"\u01ff"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_STROKE_AND_ACUTE  U"\u01ff"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DOUBLE_GRAVE  0x0200
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DOUBLE_GRAVE  L"\u0200"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DOUBLE_GRAVE  U"\u0200"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_DOUBLE_GRAVE  0x0201
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DOUBLE_GRAVE  L"\u0201"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DOUBLE_GRAVE  U"\u0201"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_INVERTED_BREVE  0x0202
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_INVERTED_BREVE  L"\u0202"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_INVERTED_BREVE  U"\u0202"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_INVERTED_BREVE  0x0203
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_INVERTED_BREVE  L"\u0203"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_INVERTED_BREVE  U"\u0203"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_DOUBLE_GRAVE  0x0204
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_DOUBLE_GRAVE  L"\u0204"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_DOUBLE_GRAVE  U"\u0204"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_DOUBLE_GRAVE  0x0205
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_DOUBLE_GRAVE  L"\u0205"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_DOUBLE_GRAVE  U"\u0205"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_INVERTED_BREVE  0x0206
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_INVERTED_BREVE  L"\u0206"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_INVERTED_BREVE  U"\u0206"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_INVERTED_BREVE  0x0207
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_INVERTED_BREVE  L"\u0207"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_INVERTED_BREVE  U"\u0207"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DOUBLE_GRAVE  0x0208
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_DOUBLE_GRAVE  L"\u0208"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_DOUBLE_GRAVE  U"\u0208"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_DOUBLE_GRAVE  0x0209
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_DOUBLE_GRAVE  L"\u0209"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_DOUBLE_GRAVE  U"\u0209"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_INVERTED_BREVE  0x020a
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_INVERTED_BREVE  L"\u020a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_INVERTED_BREVE  U"\u020a"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_INVERTED_BREVE  0x020b
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_INVERTED_BREVE  L"\u020b"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_INVERTED_BREVE  U"\u020b"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_GRAVE  0x020c
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_GRAVE  L"\u020c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DOUBLE_GRAVE  U"\u020c"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_DOUBLE_GRAVE  0x020d
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DOUBLE_GRAVE  L"\u020d"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DOUBLE_GRAVE  U"\u020d"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_INVERTED_BREVE  0x020e
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_INVERTED_BREVE  L"\u020e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_INVERTED_BREVE  U"\u020e"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_INVERTED_BREVE  0x020f
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_INVERTED_BREVE  L"\u020f"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_INVERTED_BREVE  U"\u020f"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_DOUBLE_GRAVE  0x0210
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_DOUBLE_GRAVE  L"\u0210"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_DOUBLE_GRAVE  U"\u0210"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_DOUBLE_GRAVE  0x0211
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_DOUBLE_GRAVE  L"\u0211"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_DOUBLE_GRAVE  U"\u0211"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_INVERTED_BREVE  0x0212
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_INVERTED_BREVE  L"\u0212"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_INVERTED_BREVE  U"\u0212"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_INVERTED_BREVE  0x0213
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_INVERTED_BREVE  L"\u0213"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_INVERTED_BREVE  U"\u0213"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_GRAVE  0x0214
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_GRAVE  L"\u0214"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DOUBLE_GRAVE  U"\u0214"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_DOUBLE_GRAVE  0x0215
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DOUBLE_GRAVE  L"\u0215"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DOUBLE_GRAVE  U"\u0215"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_INVERTED_BREVE  0x0216
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_INVERTED_BREVE  L"\u0216"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_INVERTED_BREVE  U"\u0216"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_INVERTED_BREVE  0x0217
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_INVERTED_BREVE  L"\u0217"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_INVERTED_BREVE  U"\u0217"
 #define UNICODE_LATIN_CAPITAL_LETTER_S_WITH_COMMA_BELOW  0x0218
-#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_COMMA_BELOW  L"\u0218"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_COMMA_BELOW  U"\u0218"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_COMMA_BELOW  0x0219
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_COMMA_BELOW  L"\u0219"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_COMMA_BELOW  U"\u0219"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_COMMA_BELOW  0x021a
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_COMMA_BELOW  L"\u021a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_COMMA_BELOW  U"\u021a"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_COMMA_BELOW  0x021b
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_COMMA_BELOW  L"\u021b"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_COMMA_BELOW  U"\u021b"
 #define UNICODE_LATIN_CAPITAL_LETTER_YOGH  0x021c
-#define UNITEXT_LATIN_CAPITAL_LETTER_YOGH  L"\u021c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_YOGH  U"\u021c"
 #define UNICODE_LATIN_SMALL_LETTER_YOGH  0x021d
-#define UNITEXT_LATIN_SMALL_LETTER_YOGH  L"\u021d"
+#define UNITEXT_LATIN_SMALL_LETTER_YOGH  U"\u021d"
 #define UNICODE_LATIN_CAPITAL_LETTER_H_WITH_CARON  0x021e
-#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_CARON  L"\u021e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_CARON  U"\u021e"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_CARON  0x021f
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_CARON  L"\u021f"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_CARON  U"\u021f"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_LONG_RIGHT_LEG  0x0220
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_LONG_RIGHT_LEG  L"\u0220"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_LONG_RIGHT_LEG  U"\u0220"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_CURL  0x0221
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_CURL  L"\u0221"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_CURL  U"\u0221"
 #define UNICODE_LATIN_CAPITAL_LETTER_OU  0x0222
-#define UNITEXT_LATIN_CAPITAL_LETTER_OU  L"\u0222"
+#define UNITEXT_LATIN_CAPITAL_LETTER_OU  U"\u0222"
 #define UNICODE_LATIN_SMALL_LETTER_OU  0x0223
-#define UNITEXT_LATIN_SMALL_LETTER_OU  L"\u0223"
+#define UNITEXT_LATIN_SMALL_LETTER_OU  U"\u0223"
 #define UNICODE_LATIN_CAPITAL_LETTER_Z_WITH_HOOK  0x0224
-#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_HOOK  L"\u0224"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_HOOK  U"\u0224"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_HOOK  0x0225
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_HOOK  L"\u0225"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_HOOK  U"\u0225"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE  0x0226
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE  L"\u0226"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DOT_ABOVE  U"\u0226"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE  0x0227
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE  L"\u0227"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DOT_ABOVE  U"\u0227"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CEDILLA  0x0228
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CEDILLA  L"\u0228"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CEDILLA  U"\u0228"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_CEDILLA  0x0229
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CEDILLA  L"\u0229"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CEDILLA  U"\u0229"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS_AND_MACRON  0x022a
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS_AND_MACRON  L"\u022a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS_AND_MACRON  U"\u022a"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_DIAERESIS_AND_MACRON  0x022b
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DIAERESIS_AND_MACRON  L"\u022b"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DIAERESIS_AND_MACRON  U"\u022b"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_MACRON  0x022c
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_MACRON  L"\u022c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_MACRON  U"\u022c"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_TILDE_AND_MACRON  0x022d
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_TILDE_AND_MACRON  L"\u022d"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_TILDE_AND_MACRON  U"\u022d"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE  0x022e
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE  L"\u022e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE  U"\u022e"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE  0x022f
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE  L"\u022f"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE  U"\u022f"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON  0x0230
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON  L"\u0230"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON  U"\u0230"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON  0x0231
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON  L"\u0231"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DOT_ABOVE_AND_MACRON  U"\u0231"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_MACRON  0x0232
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_MACRON  L"\u0232"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_MACRON  U"\u0232"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_MACRON  0x0233
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_MACRON  L"\u0233"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_MACRON  U"\u0233"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_CURL  0x0234
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_CURL  L"\u0234"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_CURL  U"\u0234"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_CURL  0x0235
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_CURL  L"\u0235"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_CURL  U"\u0235"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_CURL  0x0236
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_CURL  L"\u0236"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_CURL  U"\u0236"
 #define UNICODE_LATIN_SMALL_LETTER_DOTLESS_J  0x0237
-#define UNITEXT_LATIN_SMALL_LETTER_DOTLESS_J  L"\u0237"
+#define UNITEXT_LATIN_SMALL_LETTER_DOTLESS_J  U"\u0237"
 #define UNICODE_LATIN_SMALL_LETTER_DB_DIGRAPH  0x0238
-#define UNITEXT_LATIN_SMALL_LETTER_DB_DIGRAPH  L"\u0238"
+#define UNITEXT_LATIN_SMALL_LETTER_DB_DIGRAPH  U"\u0238"
 #define UNICODE_LATIN_SMALL_LETTER_QP_DIGRAPH  0x0239
-#define UNITEXT_LATIN_SMALL_LETTER_QP_DIGRAPH  L"\u0239"
+#define UNITEXT_LATIN_SMALL_LETTER_QP_DIGRAPH  U"\u0239"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_STROKE  0x023a
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_STROKE  L"\u023a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_STROKE  U"\u023a"
 #define UNICODE_LATIN_CAPITAL_LETTER_C_WITH_STROKE  0x023b
-#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_STROKE  L"\u023b"
+#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_STROKE  U"\u023b"
 #define UNICODE_LATIN_SMALL_LETTER_C_WITH_STROKE  0x023c
-#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_STROKE  L"\u023c"
+#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_STROKE  U"\u023c"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_BAR  0x023d
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_BAR  L"\u023d"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_BAR  U"\u023d"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_DIAGONAL_STROKE  0x023e
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_DIAGONAL_STROKE  L"\u023e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_DIAGONAL_STROKE  U"\u023e"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_SWASH_TAIL  0x023f
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_SWASH_TAIL  L"\u023f"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_SWASH_TAIL  U"\u023f"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_SWASH_TAIL  0x0240
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_SWASH_TAIL  L"\u0240"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_SWASH_TAIL  U"\u0240"
 #define UNICODE_LATIN_CAPITAL_LETTER_GLOTTAL_STOP  0x0241
-#define UNITEXT_LATIN_CAPITAL_LETTER_GLOTTAL_STOP  L"\u0241"
+#define UNITEXT_LATIN_CAPITAL_LETTER_GLOTTAL_STOP  U"\u0241"
 #define UNICODE_LATIN_SMALL_LETTER_GLOTTAL_STOP  0x0242
-#define UNITEXT_LATIN_SMALL_LETTER_GLOTTAL_STOP  L"\u0242"
+#define UNITEXT_LATIN_SMALL_LETTER_GLOTTAL_STOP  U"\u0242"
 #define UNICODE_LATIN_CAPITAL_LETTER_B_WITH_STROKE  0x0243
-#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_STROKE  L"\u0243"
+#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_STROKE  U"\u0243"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_BAR  0x0244
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_BAR  L"\u0244"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_BAR  U"\u0244"
 #define UNICODE_LATIN_CAPITAL_LETTER_TURNED_V  0x0245
-#define UNITEXT_LATIN_CAPITAL_LETTER_TURNED_V  L"\u0245"
+#define UNITEXT_LATIN_CAPITAL_LETTER_TURNED_V  U"\u0245"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_STROKE  0x0246
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_STROKE  L"\u0246"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_STROKE  U"\u0246"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_STROKE  0x0247
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_STROKE  L"\u0247"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_STROKE  U"\u0247"
 #define UNICODE_LATIN_CAPITAL_LETTER_J_WITH_STROKE  0x0248
-#define UNITEXT_LATIN_CAPITAL_LETTER_J_WITH_STROKE  L"\u0248"
+#define UNITEXT_LATIN_CAPITAL_LETTER_J_WITH_STROKE  U"\u0248"
 #define UNICODE_LATIN_SMALL_LETTER_J_WITH_STROKE  0x0249
-#define UNITEXT_LATIN_SMALL_LETTER_J_WITH_STROKE  L"\u0249"
+#define UNITEXT_LATIN_SMALL_LETTER_J_WITH_STROKE  U"\u0249"
 #define UNICODE_LATIN_CAPITAL_LETTER_SMALL_Q_WITH_HOOK_TAIL  0x024a
-#define UNITEXT_LATIN_CAPITAL_LETTER_SMALL_Q_WITH_HOOK_TAIL  L"\u024a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_SMALL_Q_WITH_HOOK_TAIL  U"\u024a"
 #define UNICODE_LATIN_SMALL_LETTER_Q_WITH_HOOK_TAIL  0x024b
-#define UNITEXT_LATIN_SMALL_LETTER_Q_WITH_HOOK_TAIL  L"\u024b"
+#define UNITEXT_LATIN_SMALL_LETTER_Q_WITH_HOOK_TAIL  U"\u024b"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_STROKE  0x024c
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_STROKE  L"\u024c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_STROKE  U"\u024c"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_STROKE  0x024d
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_STROKE  L"\u024d"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_STROKE  U"\u024d"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_STROKE  0x024e
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_STROKE  L"\u024e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_STROKE  U"\u024e"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_STROKE  0x024f
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_STROKE  L"\u024f"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_STROKE  U"\u024f"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_A  0x0250
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_A  L"\u0250"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_A  U"\u0250"
 #define UNICODE_LATIN_SMALL_LETTER_ALPHA  0x0251
-#define UNITEXT_LATIN_SMALL_LETTER_ALPHA  L"\u0251"
+#define UNITEXT_LATIN_SMALL_LETTER_ALPHA  U"\u0251"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_ALPHA  0x0252
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_ALPHA  L"\u0252"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_ALPHA  U"\u0252"
 #define UNICODE_LATIN_SMALL_LETTER_B_WITH_HOOK  0x0253
-#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_HOOK  L"\u0253"
+#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_HOOK  U"\u0253"
 #define UNICODE_LATIN_SMALL_LETTER_OPEN_O  0x0254
-#define UNITEXT_LATIN_SMALL_LETTER_OPEN_O  L"\u0254"
+#define UNITEXT_LATIN_SMALL_LETTER_OPEN_O  U"\u0254"
 #define UNICODE_LATIN_SMALL_LETTER_C_WITH_CURL  0x0255
-#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_CURL  L"\u0255"
+#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_CURL  U"\u0255"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_TAIL  0x0256
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_TAIL  L"\u0256"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_TAIL  U"\u0256"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_HOOK  0x0257
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_HOOK  L"\u0257"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_HOOK  U"\u0257"
 #define UNICODE_LATIN_SMALL_LETTER_REVERSED_E  0x0258
-#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_E  L"\u0258"
+#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_E  U"\u0258"
 #define UNICODE_LATIN_SMALL_LETTER_SCHWA  0x0259
-#define UNITEXT_LATIN_SMALL_LETTER_SCHWA  L"\u0259"
+#define UNITEXT_LATIN_SMALL_LETTER_SCHWA  U"\u0259"
 #define UNICODE_LATIN_SMALL_LETTER_SCHWA_WITH_HOOK  0x025a
-#define UNITEXT_LATIN_SMALL_LETTER_SCHWA_WITH_HOOK  L"\u025a"
+#define UNITEXT_LATIN_SMALL_LETTER_SCHWA_WITH_HOOK  U"\u025a"
 #define UNICODE_LATIN_SMALL_LETTER_OPEN_E  0x025b
-#define UNITEXT_LATIN_SMALL_LETTER_OPEN_E  L"\u025b"
+#define UNITEXT_LATIN_SMALL_LETTER_OPEN_E  U"\u025b"
 #define UNICODE_LATIN_SMALL_LETTER_REVERSED_OPEN_E  0x025c
-#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_OPEN_E  L"\u025c"
+#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_OPEN_E  U"\u025c"
 #define UNICODE_LATIN_SMALL_LETTER_REVERSED_OPEN_E_WITH_HOOK  0x025d
-#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_OPEN_E_WITH_HOOK  L"\u025d"
+#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_OPEN_E_WITH_HOOK  U"\u025d"
 #define UNICODE_LATIN_SMALL_LETTER_CLOSED_REVERSED_OPEN_E  0x025e
-#define UNITEXT_LATIN_SMALL_LETTER_CLOSED_REVERSED_OPEN_E  L"\u025e"
+#define UNITEXT_LATIN_SMALL_LETTER_CLOSED_REVERSED_OPEN_E  U"\u025e"
 #define UNICODE_LATIN_SMALL_LETTER_DOTLESS_J_WITH_STROKE  0x025f
-#define UNITEXT_LATIN_SMALL_LETTER_DOTLESS_J_WITH_STROKE  L"\u025f"
+#define UNITEXT_LATIN_SMALL_LETTER_DOTLESS_J_WITH_STROKE  U"\u025f"
 #define UNICODE_LATIN_SMALL_LETTER_G_WITH_HOOK  0x0260
-#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_HOOK  L"\u0260"
+#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_HOOK  U"\u0260"
 #define UNICODE_LATIN_SMALL_LETTER_SCRIPT_G  0x0261
-#define UNITEXT_LATIN_SMALL_LETTER_SCRIPT_G  L"\u0261"
+#define UNITEXT_LATIN_SMALL_LETTER_SCRIPT_G  U"\u0261"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_G  0x0262
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_G  L"\u0262"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_G  U"\u0262"
 #define UNICODE_LATIN_SMALL_LETTER_GAMMA  0x0263
-#define UNITEXT_LATIN_SMALL_LETTER_GAMMA  L"\u0263"
+#define UNITEXT_LATIN_SMALL_LETTER_GAMMA  U"\u0263"
 #define UNICODE_LATIN_SMALL_LETTER_RAMS_HORN  0x0264
-#define UNITEXT_LATIN_SMALL_LETTER_RAMS_HORN  L"\u0264"
+#define UNITEXT_LATIN_SMALL_LETTER_RAMS_HORN  U"\u0264"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_H  0x0265
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_H  L"\u0265"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_H  U"\u0265"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_HOOK  0x0266
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_HOOK  L"\u0266"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_HOOK  U"\u0266"
 #define UNICODE_LATIN_SMALL_LETTER_HENG_WITH_HOOK  0x0267
-#define UNITEXT_LATIN_SMALL_LETTER_HENG_WITH_HOOK  L"\u0267"
+#define UNITEXT_LATIN_SMALL_LETTER_HENG_WITH_HOOK  U"\u0267"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_STROKE  0x0268
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_STROKE  L"\u0268"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_STROKE  U"\u0268"
 #define UNICODE_LATIN_SMALL_LETTER_IOTA  0x0269
-#define UNITEXT_LATIN_SMALL_LETTER_IOTA  L"\u0269"
+#define UNITEXT_LATIN_SMALL_LETTER_IOTA  U"\u0269"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_I  0x026a
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_I  L"\u026a"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_I  U"\u026a"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_MIDDLE_TILDE  0x026b
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_MIDDLE_TILDE  L"\u026b"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_MIDDLE_TILDE  U"\u026b"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_BELT  0x026c
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_BELT  L"\u026c"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_BELT  U"\u026c"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_RETROFLEX_HOOK  0x026d
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_RETROFLEX_HOOK  L"\u026d"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_RETROFLEX_HOOK  U"\u026d"
 #define UNICODE_LATIN_SMALL_LETTER_LEZH  0x026e
-#define UNITEXT_LATIN_SMALL_LETTER_LEZH  L"\u026e"
+#define UNITEXT_LATIN_SMALL_LETTER_LEZH  U"\u026e"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_M  0x026f
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_M  L"\u026f"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_M  U"\u026f"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_M_WITH_LONG_LEG  0x0270
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_M_WITH_LONG_LEG  L"\u0270"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_M_WITH_LONG_LEG  U"\u0270"
 #define UNICODE_LATIN_SMALL_LETTER_M_WITH_HOOK  0x0271
-#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_HOOK  L"\u0271"
+#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_HOOK  U"\u0271"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_LEFT_HOOK  0x0272
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_LEFT_HOOK  L"\u0272"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_LEFT_HOOK  U"\u0272"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_RETROFLEX_HOOK  0x0273
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_RETROFLEX_HOOK  L"\u0273"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_RETROFLEX_HOOK  U"\u0273"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_N  0x0274
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_N  L"\u0274"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_N  U"\u0274"
 #define UNICODE_LATIN_SMALL_LETTER_BARRED_O  0x0275
-#define UNITEXT_LATIN_SMALL_LETTER_BARRED_O  L"\u0275"
+#define UNITEXT_LATIN_SMALL_LETTER_BARRED_O  U"\u0275"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_OE  0x0276
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_OE  L"\u0276"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_OE  U"\u0276"
 #define UNICODE_LATIN_SMALL_LETTER_CLOSED_OMEGA  0x0277
-#define UNITEXT_LATIN_SMALL_LETTER_CLOSED_OMEGA  L"\u0277"
+#define UNITEXT_LATIN_SMALL_LETTER_CLOSED_OMEGA  U"\u0277"
 #define UNICODE_LATIN_SMALL_LETTER_PHI  0x0278
-#define UNITEXT_LATIN_SMALL_LETTER_PHI  L"\u0278"
+#define UNITEXT_LATIN_SMALL_LETTER_PHI  U"\u0278"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_R  0x0279
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_R  L"\u0279"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_R  U"\u0279"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_R_WITH_LONG_LEG  0x027a
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_R_WITH_LONG_LEG  L"\u027a"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_R_WITH_LONG_LEG  U"\u027a"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_R_WITH_HOOK  0x027b
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_R_WITH_HOOK  L"\u027b"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_R_WITH_HOOK  U"\u027b"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_LONG_LEG  0x027c
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_LONG_LEG  L"\u027c"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_LONG_LEG  U"\u027c"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_TAIL  0x027d
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_TAIL  L"\u027d"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_TAIL  U"\u027d"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_FISHHOOK  0x027e
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_FISHHOOK  L"\u027e"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_FISHHOOK  U"\u027e"
 #define UNICODE_LATIN_SMALL_LETTER_REVERSED_R_WITH_FISHHOOK  0x027f
-#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_R_WITH_FISHHOOK  L"\u027f"
+#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_R_WITH_FISHHOOK  U"\u027f"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_R  0x0280
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_R  L"\u0280"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_R  U"\u0280"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_INVERTED_R  0x0281
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_INVERTED_R  L"\u0281"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_INVERTED_R  U"\u0281"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_HOOK  0x0282
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_HOOK  L"\u0282"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_HOOK  U"\u0282"
 #define UNICODE_LATIN_SMALL_LETTER_ESH  0x0283
-#define UNITEXT_LATIN_SMALL_LETTER_ESH  L"\u0283"
+#define UNITEXT_LATIN_SMALL_LETTER_ESH  U"\u0283"
 #define UNICODE_LATIN_SMALL_LETTER_DOTLESS_J_WITH_STROKE_AND_HOOK  0x0284
-#define UNITEXT_LATIN_SMALL_LETTER_DOTLESS_J_WITH_STROKE_AND_HOOK  L"\u0284"
+#define UNITEXT_LATIN_SMALL_LETTER_DOTLESS_J_WITH_STROKE_AND_HOOK  U"\u0284"
 #define UNICODE_LATIN_SMALL_LETTER_SQUAT_REVERSED_ESH  0x0285
-#define UNITEXT_LATIN_SMALL_LETTER_SQUAT_REVERSED_ESH  L"\u0285"
+#define UNITEXT_LATIN_SMALL_LETTER_SQUAT_REVERSED_ESH  U"\u0285"
 #define UNICODE_LATIN_SMALL_LETTER_ESH_WITH_CURL  0x0286
-#define UNITEXT_LATIN_SMALL_LETTER_ESH_WITH_CURL  L"\u0286"
+#define UNITEXT_LATIN_SMALL_LETTER_ESH_WITH_CURL  U"\u0286"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_T  0x0287
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_T  L"\u0287"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_T  U"\u0287"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_RETROFLEX_HOOK  0x0288
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_RETROFLEX_HOOK  L"\u0288"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_RETROFLEX_HOOK  U"\u0288"
 #define UNICODE_LATIN_SMALL_LETTER_U_BAR  0x0289
-#define UNITEXT_LATIN_SMALL_LETTER_U_BAR  L"\u0289"
+#define UNITEXT_LATIN_SMALL_LETTER_U_BAR  U"\u0289"
 #define UNICODE_LATIN_SMALL_LETTER_UPSILON  0x028a
-#define UNITEXT_LATIN_SMALL_LETTER_UPSILON  L"\u028a"
+#define UNITEXT_LATIN_SMALL_LETTER_UPSILON  U"\u028a"
 #define UNICODE_LATIN_SMALL_LETTER_V_WITH_HOOK  0x028b
-#define UNITEXT_LATIN_SMALL_LETTER_V_WITH_HOOK  L"\u028b"
+#define UNITEXT_LATIN_SMALL_LETTER_V_WITH_HOOK  U"\u028b"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_V  0x028c
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_V  L"\u028c"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_V  U"\u028c"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_W  0x028d
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_W  L"\u028d"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_W  U"\u028d"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_Y  0x028e
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_Y  L"\u028e"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_Y  U"\u028e"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_Y  0x028f
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_Y  L"\u028f"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_Y  U"\u028f"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_RETROFLEX_HOOK  0x0290
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_RETROFLEX_HOOK  L"\u0290"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_RETROFLEX_HOOK  U"\u0290"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_CURL  0x0291
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_CURL  L"\u0291"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_CURL  U"\u0291"
 #define UNICODE_LATIN_SMALL_LETTER_EZH  0x0292
-#define UNITEXT_LATIN_SMALL_LETTER_EZH  L"\u0292"
+#define UNITEXT_LATIN_SMALL_LETTER_EZH  U"\u0292"
 #define UNICODE_LATIN_SMALL_LETTER_EZH_WITH_CURL  0x0293
-#define UNITEXT_LATIN_SMALL_LETTER_EZH_WITH_CURL  L"\u0293"
+#define UNITEXT_LATIN_SMALL_LETTER_EZH_WITH_CURL  U"\u0293"
 #define UNICODE_LATIN_LETTER_GLOTTAL_STOP  0x0294
-#define UNITEXT_LATIN_LETTER_GLOTTAL_STOP  L"\u0294"
+#define UNITEXT_LATIN_LETTER_GLOTTAL_STOP  U"\u0294"
 #define UNICODE_LATIN_LETTER_PHARYNGEAL_VOICED_FRICATIVE  0x0295
-#define UNITEXT_LATIN_LETTER_PHARYNGEAL_VOICED_FRICATIVE  L"\u0295"
+#define UNITEXT_LATIN_LETTER_PHARYNGEAL_VOICED_FRICATIVE  U"\u0295"
 #define UNICODE_LATIN_LETTER_INVERTED_GLOTTAL_STOP  0x0296
-#define UNITEXT_LATIN_LETTER_INVERTED_GLOTTAL_STOP  L"\u0296"
+#define UNITEXT_LATIN_LETTER_INVERTED_GLOTTAL_STOP  U"\u0296"
 #define UNICODE_LATIN_LETTER_STRETCHED_C  0x0297
-#define UNITEXT_LATIN_LETTER_STRETCHED_C  L"\u0297"
+#define UNITEXT_LATIN_LETTER_STRETCHED_C  U"\u0297"
 #define UNICODE_LATIN_LETTER_BILABIAL_CLICK  0x0298
-#define UNITEXT_LATIN_LETTER_BILABIAL_CLICK  L"\u0298"
+#define UNITEXT_LATIN_LETTER_BILABIAL_CLICK  U"\u0298"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_B  0x0299
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_B  L"\u0299"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_B  U"\u0299"
 #define UNICODE_LATIN_SMALL_LETTER_CLOSED_OPEN_E  0x029a
-#define UNITEXT_LATIN_SMALL_LETTER_CLOSED_OPEN_E  L"\u029a"
+#define UNITEXT_LATIN_SMALL_LETTER_CLOSED_OPEN_E  U"\u029a"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_G_WITH_HOOK  0x029b
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_G_WITH_HOOK  L"\u029b"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_G_WITH_HOOK  U"\u029b"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_H  0x029c
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_H  L"\u029c"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_H  U"\u029c"
 #define UNICODE_LATIN_SMALL_LETTER_J_WITH_CROSSED_TAIL  0x029d
-#define UNITEXT_LATIN_SMALL_LETTER_J_WITH_CROSSED_TAIL  L"\u029d"
+#define UNITEXT_LATIN_SMALL_LETTER_J_WITH_CROSSED_TAIL  U"\u029d"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_K  0x029e
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_K  L"\u029e"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_K  U"\u029e"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_L  0x029f
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_L  L"\u029f"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_L  U"\u029f"
 #define UNICODE_LATIN_SMALL_LETTER_Q_WITH_HOOK  0x02a0
-#define UNITEXT_LATIN_SMALL_LETTER_Q_WITH_HOOK  L"\u02a0"
+#define UNITEXT_LATIN_SMALL_LETTER_Q_WITH_HOOK  U"\u02a0"
 #define UNICODE_LATIN_LETTER_GLOTTAL_STOP_WITH_STROKE  0x02a1
-#define UNITEXT_LATIN_LETTER_GLOTTAL_STOP_WITH_STROKE  L"\u02a1"
+#define UNITEXT_LATIN_LETTER_GLOTTAL_STOP_WITH_STROKE  U"\u02a1"
 #define UNICODE_LATIN_LETTER_REVERSED_GLOTTAL_STOP_WITH_STROKE  0x02a2
-#define UNITEXT_LATIN_LETTER_REVERSED_GLOTTAL_STOP_WITH_STROKE  L"\u02a2"
+#define UNITEXT_LATIN_LETTER_REVERSED_GLOTTAL_STOP_WITH_STROKE  U"\u02a2"
 #define UNICODE_LATIN_SMALL_LETTER_DZ_DIGRAPH  0x02a3
-#define UNITEXT_LATIN_SMALL_LETTER_DZ_DIGRAPH  L"\u02a3"
+#define UNITEXT_LATIN_SMALL_LETTER_DZ_DIGRAPH  U"\u02a3"
 #define UNICODE_LATIN_SMALL_LETTER_DEZH_DIGRAPH  0x02a4
-#define UNITEXT_LATIN_SMALL_LETTER_DEZH_DIGRAPH  L"\u02a4"
+#define UNITEXT_LATIN_SMALL_LETTER_DEZH_DIGRAPH  U"\u02a4"
 #define UNICODE_LATIN_SMALL_LETTER_DZ_DIGRAPH_WITH_CURL  0x02a5
-#define UNITEXT_LATIN_SMALL_LETTER_DZ_DIGRAPH_WITH_CURL  L"\u02a5"
+#define UNITEXT_LATIN_SMALL_LETTER_DZ_DIGRAPH_WITH_CURL  U"\u02a5"
 #define UNICODE_LATIN_SMALL_LETTER_TS_DIGRAPH  0x02a6
-#define UNITEXT_LATIN_SMALL_LETTER_TS_DIGRAPH  L"\u02a6"
+#define UNITEXT_LATIN_SMALL_LETTER_TS_DIGRAPH  U"\u02a6"
 #define UNICODE_LATIN_SMALL_LETTER_TESH_DIGRAPH  0x02a7
-#define UNITEXT_LATIN_SMALL_LETTER_TESH_DIGRAPH  L"\u02a7"
+#define UNITEXT_LATIN_SMALL_LETTER_TESH_DIGRAPH  U"\u02a7"
 #define UNICODE_LATIN_SMALL_LETTER_TC_DIGRAPH_WITH_CURL  0x02a8
-#define UNITEXT_LATIN_SMALL_LETTER_TC_DIGRAPH_WITH_CURL  L"\u02a8"
+#define UNITEXT_LATIN_SMALL_LETTER_TC_DIGRAPH_WITH_CURL  U"\u02a8"
 #define UNICODE_LATIN_SMALL_LETTER_FENG_DIGRAPH  0x02a9
-#define UNITEXT_LATIN_SMALL_LETTER_FENG_DIGRAPH  L"\u02a9"
+#define UNITEXT_LATIN_SMALL_LETTER_FENG_DIGRAPH  U"\u02a9"
 #define UNICODE_LATIN_SMALL_LETTER_LS_DIGRAPH  0x02aa
-#define UNITEXT_LATIN_SMALL_LETTER_LS_DIGRAPH  L"\u02aa"
+#define UNITEXT_LATIN_SMALL_LETTER_LS_DIGRAPH  U"\u02aa"
 #define UNICODE_LATIN_SMALL_LETTER_LZ_DIGRAPH  0x02ab
-#define UNITEXT_LATIN_SMALL_LETTER_LZ_DIGRAPH  L"\u02ab"
+#define UNITEXT_LATIN_SMALL_LETTER_LZ_DIGRAPH  U"\u02ab"
 #define UNICODE_LATIN_LETTER_BILABIAL_PERCUSSIVE  0x02ac
-#define UNITEXT_LATIN_LETTER_BILABIAL_PERCUSSIVE  L"\u02ac"
+#define UNITEXT_LATIN_LETTER_BILABIAL_PERCUSSIVE  U"\u02ac"
 #define UNICODE_LATIN_LETTER_BIDENTAL_PERCUSSIVE  0x02ad
-#define UNITEXT_LATIN_LETTER_BIDENTAL_PERCUSSIVE  L"\u02ad"
+#define UNITEXT_LATIN_LETTER_BIDENTAL_PERCUSSIVE  U"\u02ad"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_H_WITH_FISHHOOK  0x02ae
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_H_WITH_FISHHOOK  L"\u02ae"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_H_WITH_FISHHOOK  U"\u02ae"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_H_WITH_FISHHOOK_AND_TAIL  0x02af
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_H_WITH_FISHHOOK_AND_TAIL  L"\u02af"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_H_WITH_FISHHOOK_AND_TAIL  U"\u02af"
 #define UNICODE_MODIFIER_LETTER_SMALL_H  0x02b0
-#define UNITEXT_MODIFIER_LETTER_SMALL_H  L"\u02b0"
+#define UNITEXT_MODIFIER_LETTER_SMALL_H  U"\u02b0"
 #define UNICODE_MODIFIER_LETTER_SMALL_H_WITH_HOOK  0x02b1
-#define UNITEXT_MODIFIER_LETTER_SMALL_H_WITH_HOOK  L"\u02b1"
+#define UNITEXT_MODIFIER_LETTER_SMALL_H_WITH_HOOK  U"\u02b1"
 #define UNICODE_MODIFIER_LETTER_SMALL_J  0x02b2
-#define UNITEXT_MODIFIER_LETTER_SMALL_J  L"\u02b2"
+#define UNITEXT_MODIFIER_LETTER_SMALL_J  U"\u02b2"
 #define UNICODE_MODIFIER_LETTER_SMALL_R  0x02b3
-#define UNITEXT_MODIFIER_LETTER_SMALL_R  L"\u02b3"
+#define UNITEXT_MODIFIER_LETTER_SMALL_R  U"\u02b3"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_R  0x02b4
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_R  L"\u02b4"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_R  U"\u02b4"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_R_WITH_HOOK  0x02b5
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_R_WITH_HOOK  L"\u02b5"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_R_WITH_HOOK  U"\u02b5"
 #define UNICODE_MODIFIER_LETTER_SMALL_CAPITAL_INVERTED_R  0x02b6
-#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_INVERTED_R  L"\u02b6"
+#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_INVERTED_R  U"\u02b6"
 #define UNICODE_MODIFIER_LETTER_SMALL_W  0x02b7
-#define UNITEXT_MODIFIER_LETTER_SMALL_W  L"\u02b7"
+#define UNITEXT_MODIFIER_LETTER_SMALL_W  U"\u02b7"
 #define UNICODE_MODIFIER_LETTER_SMALL_Y  0x02b8
-#define UNITEXT_MODIFIER_LETTER_SMALL_Y  L"\u02b8"
+#define UNITEXT_MODIFIER_LETTER_SMALL_Y  U"\u02b8"
 #define UNICODE_MODIFIER_LETTER_PRIME  0x02b9
-#define UNITEXT_MODIFIER_LETTER_PRIME  L"\u02b9"
+#define UNITEXT_MODIFIER_LETTER_PRIME  U"\u02b9"
 #define UNICODE_MODIFIER_LETTER_DOUBLE_PRIME  0x02ba
-#define UNITEXT_MODIFIER_LETTER_DOUBLE_PRIME  L"\u02ba"
+#define UNITEXT_MODIFIER_LETTER_DOUBLE_PRIME  U"\u02ba"
 #define UNICODE_MODIFIER_LETTER_TURNED_COMMA  0x02bb
-#define UNITEXT_MODIFIER_LETTER_TURNED_COMMA  L"\u02bb"
+#define UNITEXT_MODIFIER_LETTER_TURNED_COMMA  U"\u02bb"
 #define UNICODE_MODIFIER_LETTER_APOSTROPHE  0x02bc
-#define UNITEXT_MODIFIER_LETTER_APOSTROPHE  L"\u02bc"
+#define UNITEXT_MODIFIER_LETTER_APOSTROPHE  U"\u02bc"
 #define UNICODE_MODIFIER_LETTER_REVERSED_COMMA  0x02bd
-#define UNITEXT_MODIFIER_LETTER_REVERSED_COMMA  L"\u02bd"
+#define UNITEXT_MODIFIER_LETTER_REVERSED_COMMA  U"\u02bd"
 #define UNICODE_MODIFIER_LETTER_RIGHT_HALF_RING  0x02be
-#define UNITEXT_MODIFIER_LETTER_RIGHT_HALF_RING  L"\u02be"
+#define UNITEXT_MODIFIER_LETTER_RIGHT_HALF_RING  U"\u02be"
 #define UNICODE_MODIFIER_LETTER_LEFT_HALF_RING  0x02bf
-#define UNITEXT_MODIFIER_LETTER_LEFT_HALF_RING  L"\u02bf"
+#define UNITEXT_MODIFIER_LETTER_LEFT_HALF_RING  U"\u02bf"
 #define UNICODE_MODIFIER_LETTER_GLOTTAL_STOP  0x02c0
-#define UNITEXT_MODIFIER_LETTER_GLOTTAL_STOP  L"\u02c0"
+#define UNITEXT_MODIFIER_LETTER_GLOTTAL_STOP  U"\u02c0"
 #define UNICODE_MODIFIER_LETTER_REVERSED_GLOTTAL_STOP  0x02c1
-#define UNITEXT_MODIFIER_LETTER_REVERSED_GLOTTAL_STOP  L"\u02c1"
+#define UNITEXT_MODIFIER_LETTER_REVERSED_GLOTTAL_STOP  U"\u02c1"
 #define UNICODE_MODIFIER_LETTER_LEFT_ARROWHEAD  0x02c2
-#define UNITEXT_MODIFIER_LETTER_LEFT_ARROWHEAD  L"\u02c2"
+#define UNITEXT_MODIFIER_LETTER_LEFT_ARROWHEAD  U"\u02c2"
 #define UNICODE_MODIFIER_LETTER_RIGHT_ARROWHEAD  0x02c3
-#define UNITEXT_MODIFIER_LETTER_RIGHT_ARROWHEAD  L"\u02c3"
+#define UNITEXT_MODIFIER_LETTER_RIGHT_ARROWHEAD  U"\u02c3"
 #define UNICODE_MODIFIER_LETTER_UP_ARROWHEAD  0x02c4
-#define UNITEXT_MODIFIER_LETTER_UP_ARROWHEAD  L"\u02c4"
+#define UNITEXT_MODIFIER_LETTER_UP_ARROWHEAD  U"\u02c4"
 #define UNICODE_MODIFIER_LETTER_DOWN_ARROWHEAD  0x02c5
-#define UNITEXT_MODIFIER_LETTER_DOWN_ARROWHEAD  L"\u02c5"
+#define UNITEXT_MODIFIER_LETTER_DOWN_ARROWHEAD  U"\u02c5"
 #define UNICODE_MODIFIER_LETTER_CIRCUMFLEX_ACCENT  0x02c6
-#define UNITEXT_MODIFIER_LETTER_CIRCUMFLEX_ACCENT  L"\u02c6"
+#define UNITEXT_MODIFIER_LETTER_CIRCUMFLEX_ACCENT  U"\u02c6"
 #define UNICODE_CARON  0x02c7
-#define UNITEXT_CARON  L"\u02c7"
+#define UNITEXT_CARON  U"\u02c7"
 #define UNICODE_MODIFIER_LETTER_VERTICAL_LINE  0x02c8
-#define UNITEXT_MODIFIER_LETTER_VERTICAL_LINE  L"\u02c8"
+#define UNITEXT_MODIFIER_LETTER_VERTICAL_LINE  U"\u02c8"
 #define UNICODE_MODIFIER_LETTER_MACRON  0x02c9
-#define UNITEXT_MODIFIER_LETTER_MACRON  L"\u02c9"
+#define UNITEXT_MODIFIER_LETTER_MACRON  U"\u02c9"
 #define UNICODE_MODIFIER_LETTER_ACUTE_ACCENT  0x02ca
-#define UNITEXT_MODIFIER_LETTER_ACUTE_ACCENT  L"\u02ca"
+#define UNITEXT_MODIFIER_LETTER_ACUTE_ACCENT  U"\u02ca"
 #define UNICODE_MODIFIER_LETTER_GRAVE_ACCENT  0x02cb
-#define UNITEXT_MODIFIER_LETTER_GRAVE_ACCENT  L"\u02cb"
+#define UNITEXT_MODIFIER_LETTER_GRAVE_ACCENT  U"\u02cb"
 #define UNICODE_MODIFIER_LETTER_LOW_VERTICAL_LINE  0x02cc
-#define UNITEXT_MODIFIER_LETTER_LOW_VERTICAL_LINE  L"\u02cc"
+#define UNITEXT_MODIFIER_LETTER_LOW_VERTICAL_LINE  U"\u02cc"
 #define UNICODE_MODIFIER_LETTER_LOW_MACRON  0x02cd
-#define UNITEXT_MODIFIER_LETTER_LOW_MACRON  L"\u02cd"
+#define UNITEXT_MODIFIER_LETTER_LOW_MACRON  U"\u02cd"
 #define UNICODE_MODIFIER_LETTER_LOW_GRAVE_ACCENT  0x02ce
-#define UNITEXT_MODIFIER_LETTER_LOW_GRAVE_ACCENT  L"\u02ce"
+#define UNITEXT_MODIFIER_LETTER_LOW_GRAVE_ACCENT  U"\u02ce"
 #define UNICODE_MODIFIER_LETTER_LOW_ACUTE_ACCENT  0x02cf
-#define UNITEXT_MODIFIER_LETTER_LOW_ACUTE_ACCENT  L"\u02cf"
+#define UNITEXT_MODIFIER_LETTER_LOW_ACUTE_ACCENT  U"\u02cf"
 #define UNICODE_MODIFIER_LETTER_TRIANGULAR_COLON  0x02d0
-#define UNITEXT_MODIFIER_LETTER_TRIANGULAR_COLON  L"\u02d0"
+#define UNITEXT_MODIFIER_LETTER_TRIANGULAR_COLON  U"\u02d0"
 #define UNICODE_MODIFIER_LETTER_HALF_TRIANGULAR_COLON  0x02d1
-#define UNITEXT_MODIFIER_LETTER_HALF_TRIANGULAR_COLON  L"\u02d1"
+#define UNITEXT_MODIFIER_LETTER_HALF_TRIANGULAR_COLON  U"\u02d1"
 #define UNICODE_MODIFIER_LETTER_CENTRED_RIGHT_HALF_RING  0x02d2
-#define UNITEXT_MODIFIER_LETTER_CENTRED_RIGHT_HALF_RING  L"\u02d2"
+#define UNITEXT_MODIFIER_LETTER_CENTRED_RIGHT_HALF_RING  U"\u02d2"
 #define UNICODE_MODIFIER_LETTER_CENTRED_LEFT_HALF_RING  0x02d3
-#define UNITEXT_MODIFIER_LETTER_CENTRED_LEFT_HALF_RING  L"\u02d3"
+#define UNITEXT_MODIFIER_LETTER_CENTRED_LEFT_HALF_RING  U"\u02d3"
 #define UNICODE_MODIFIER_LETTER_UP_TACK  0x02d4
-#define UNITEXT_MODIFIER_LETTER_UP_TACK  L"\u02d4"
+#define UNITEXT_MODIFIER_LETTER_UP_TACK  U"\u02d4"
 #define UNICODE_MODIFIER_LETTER_DOWN_TACK  0x02d5
-#define UNITEXT_MODIFIER_LETTER_DOWN_TACK  L"\u02d5"
+#define UNITEXT_MODIFIER_LETTER_DOWN_TACK  U"\u02d5"
 #define UNICODE_MODIFIER_LETTER_PLUS_SIGN  0x02d6
-#define UNITEXT_MODIFIER_LETTER_PLUS_SIGN  L"\u02d6"
+#define UNITEXT_MODIFIER_LETTER_PLUS_SIGN  U"\u02d6"
 #define UNICODE_MODIFIER_LETTER_MINUS_SIGN  0x02d7
-#define UNITEXT_MODIFIER_LETTER_MINUS_SIGN  L"\u02d7"
+#define UNITEXT_MODIFIER_LETTER_MINUS_SIGN  U"\u02d7"
 #define UNICODE_BREVE  0x02d8
-#define UNITEXT_BREVE  L"\u02d8"
+#define UNITEXT_BREVE  U"\u02d8"
 #define UNICODE_DOT_ABOVE  0x02d9
-#define UNITEXT_DOT_ABOVE  L"\u02d9"
+#define UNITEXT_DOT_ABOVE  U"\u02d9"
 #define UNICODE_RING_ABOVE  0x02da
-#define UNITEXT_RING_ABOVE  L"\u02da"
+#define UNITEXT_RING_ABOVE  U"\u02da"
 #define UNICODE_OGONEK  0x02db
-#define UNITEXT_OGONEK  L"\u02db"
+#define UNITEXT_OGONEK  U"\u02db"
 #define UNICODE_SMALL_TILDE  0x02dc
-#define UNITEXT_SMALL_TILDE  L"\u02dc"
+#define UNITEXT_SMALL_TILDE  U"\u02dc"
 #define UNICODE_DOUBLE_ACUTE_ACCENT  0x02dd
-#define UNITEXT_DOUBLE_ACUTE_ACCENT  L"\u02dd"
+#define UNITEXT_DOUBLE_ACUTE_ACCENT  U"\u02dd"
 #define UNICODE_MODIFIER_LETTER_RHOTIC_HOOK  0x02de
-#define UNITEXT_MODIFIER_LETTER_RHOTIC_HOOK  L"\u02de"
+#define UNITEXT_MODIFIER_LETTER_RHOTIC_HOOK  U"\u02de"
 #define UNICODE_MODIFIER_LETTER_CROSS_ACCENT  0x02df
-#define UNITEXT_MODIFIER_LETTER_CROSS_ACCENT  L"\u02df"
+#define UNITEXT_MODIFIER_LETTER_CROSS_ACCENT  U"\u02df"
 #define UNICODE_MODIFIER_LETTER_SMALL_GAMMA  0x02e0
-#define UNITEXT_MODIFIER_LETTER_SMALL_GAMMA  L"\u02e0"
+#define UNITEXT_MODIFIER_LETTER_SMALL_GAMMA  U"\u02e0"
 #define UNICODE_MODIFIER_LETTER_SMALL_L  0x02e1
-#define UNITEXT_MODIFIER_LETTER_SMALL_L  L"\u02e1"
+#define UNITEXT_MODIFIER_LETTER_SMALL_L  U"\u02e1"
 #define UNICODE_MODIFIER_LETTER_SMALL_S  0x02e2
-#define UNITEXT_MODIFIER_LETTER_SMALL_S  L"\u02e2"
+#define UNITEXT_MODIFIER_LETTER_SMALL_S  U"\u02e2"
 #define UNICODE_MODIFIER_LETTER_SMALL_X  0x02e3
-#define UNITEXT_MODIFIER_LETTER_SMALL_X  L"\u02e3"
+#define UNITEXT_MODIFIER_LETTER_SMALL_X  U"\u02e3"
 #define UNICODE_MODIFIER_LETTER_SMALL_REVERSED_GLOTTAL_STOP  0x02e4
-#define UNITEXT_MODIFIER_LETTER_SMALL_REVERSED_GLOTTAL_STOP  L"\u02e4"
+#define UNITEXT_MODIFIER_LETTER_SMALL_REVERSED_GLOTTAL_STOP  U"\u02e4"
 #define UNICODE_MODIFIER_LETTER_EXTRA_HIGH_TONE_BAR  0x02e5
-#define UNITEXT_MODIFIER_LETTER_EXTRA_HIGH_TONE_BAR  L"\u02e5"
+#define UNITEXT_MODIFIER_LETTER_EXTRA_HIGH_TONE_BAR  U"\u02e5"
 #define UNICODE_MODIFIER_LETTER_HIGH_TONE_BAR  0x02e6
-#define UNITEXT_MODIFIER_LETTER_HIGH_TONE_BAR  L"\u02e6"
+#define UNITEXT_MODIFIER_LETTER_HIGH_TONE_BAR  U"\u02e6"
 #define UNICODE_MODIFIER_LETTER_MID_TONE_BAR  0x02e7
-#define UNITEXT_MODIFIER_LETTER_MID_TONE_BAR  L"\u02e7"
+#define UNITEXT_MODIFIER_LETTER_MID_TONE_BAR  U"\u02e7"
 #define UNICODE_MODIFIER_LETTER_LOW_TONE_BAR  0x02e8
-#define UNITEXT_MODIFIER_LETTER_LOW_TONE_BAR  L"\u02e8"
+#define UNITEXT_MODIFIER_LETTER_LOW_TONE_BAR  U"\u02e8"
 #define UNICODE_MODIFIER_LETTER_EXTRA_LOW_TONE_BAR  0x02e9
-#define UNITEXT_MODIFIER_LETTER_EXTRA_LOW_TONE_BAR  L"\u02e9"
+#define UNITEXT_MODIFIER_LETTER_EXTRA_LOW_TONE_BAR  U"\u02e9"
 #define UNICODE_MODIFIER_LETTER_YIN_DEPARTING_TONE_MARK  0x02ea
-#define UNITEXT_MODIFIER_LETTER_YIN_DEPARTING_TONE_MARK  L"\u02ea"
+#define UNITEXT_MODIFIER_LETTER_YIN_DEPARTING_TONE_MARK  U"\u02ea"
 #define UNICODE_MODIFIER_LETTER_YANG_DEPARTING_TONE_MARK  0x02eb
-#define UNITEXT_MODIFIER_LETTER_YANG_DEPARTING_TONE_MARK  L"\u02eb"
+#define UNITEXT_MODIFIER_LETTER_YANG_DEPARTING_TONE_MARK  U"\u02eb"
 #define UNICODE_MODIFIER_LETTER_VOICING  0x02ec
-#define UNITEXT_MODIFIER_LETTER_VOICING  L"\u02ec"
+#define UNITEXT_MODIFIER_LETTER_VOICING  U"\u02ec"
 #define UNICODE_MODIFIER_LETTER_UNASPIRATED  0x02ed
-#define UNITEXT_MODIFIER_LETTER_UNASPIRATED  L"\u02ed"
+#define UNITEXT_MODIFIER_LETTER_UNASPIRATED  U"\u02ed"
 #define UNICODE_MODIFIER_LETTER_DOUBLE_APOSTROPHE  0x02ee
-#define UNITEXT_MODIFIER_LETTER_DOUBLE_APOSTROPHE  L"\u02ee"
+#define UNITEXT_MODIFIER_LETTER_DOUBLE_APOSTROPHE  U"\u02ee"
 #define UNICODE_MODIFIER_LETTER_LOW_DOWN_ARROWHEAD  0x02ef
-#define UNITEXT_MODIFIER_LETTER_LOW_DOWN_ARROWHEAD  L"\u02ef"
+#define UNITEXT_MODIFIER_LETTER_LOW_DOWN_ARROWHEAD  U"\u02ef"
 #define UNICODE_MODIFIER_LETTER_LOW_UP_ARROWHEAD  0x02f0
-#define UNITEXT_MODIFIER_LETTER_LOW_UP_ARROWHEAD  L"\u02f0"
+#define UNITEXT_MODIFIER_LETTER_LOW_UP_ARROWHEAD  U"\u02f0"
 #define UNICODE_MODIFIER_LETTER_LOW_LEFT_ARROWHEAD  0x02f1
-#define UNITEXT_MODIFIER_LETTER_LOW_LEFT_ARROWHEAD  L"\u02f1"
+#define UNITEXT_MODIFIER_LETTER_LOW_LEFT_ARROWHEAD  U"\u02f1"
 #define UNICODE_MODIFIER_LETTER_LOW_RIGHT_ARROWHEAD  0x02f2
-#define UNITEXT_MODIFIER_LETTER_LOW_RIGHT_ARROWHEAD  L"\u02f2"
+#define UNITEXT_MODIFIER_LETTER_LOW_RIGHT_ARROWHEAD  U"\u02f2"
 #define UNICODE_MODIFIER_LETTER_LOW_RING  0x02f3
-#define UNITEXT_MODIFIER_LETTER_LOW_RING  L"\u02f3"
+#define UNITEXT_MODIFIER_LETTER_LOW_RING  U"\u02f3"
 #define UNICODE_MODIFIER_LETTER_MIDDLE_GRAVE_ACCENT  0x02f4
-#define UNITEXT_MODIFIER_LETTER_MIDDLE_GRAVE_ACCENT  L"\u02f4"
+#define UNITEXT_MODIFIER_LETTER_MIDDLE_GRAVE_ACCENT  U"\u02f4"
 #define UNICODE_MODIFIER_LETTER_MIDDLE_DOUBLE_GRAVE_ACCENT  0x02f5
-#define UNITEXT_MODIFIER_LETTER_MIDDLE_DOUBLE_GRAVE_ACCENT  L"\u02f5"
+#define UNITEXT_MODIFIER_LETTER_MIDDLE_DOUBLE_GRAVE_ACCENT  U"\u02f5"
 #define UNICODE_MODIFIER_LETTER_MIDDLE_DOUBLE_ACUTE_ACCENT  0x02f6
-#define UNITEXT_MODIFIER_LETTER_MIDDLE_DOUBLE_ACUTE_ACCENT  L"\u02f6"
+#define UNITEXT_MODIFIER_LETTER_MIDDLE_DOUBLE_ACUTE_ACCENT  U"\u02f6"
 #define UNICODE_MODIFIER_LETTER_LOW_TILDE  0x02f7
-#define UNITEXT_MODIFIER_LETTER_LOW_TILDE  L"\u02f7"
+#define UNITEXT_MODIFIER_LETTER_LOW_TILDE  U"\u02f7"
 #define UNICODE_MODIFIER_LETTER_RAISED_COLON  0x02f8
-#define UNITEXT_MODIFIER_LETTER_RAISED_COLON  L"\u02f8"
+#define UNITEXT_MODIFIER_LETTER_RAISED_COLON  U"\u02f8"
 #define UNICODE_MODIFIER_LETTER_BEGIN_HIGH_TONE  0x02f9
-#define UNITEXT_MODIFIER_LETTER_BEGIN_HIGH_TONE  L"\u02f9"
+#define UNITEXT_MODIFIER_LETTER_BEGIN_HIGH_TONE  U"\u02f9"
 #define UNICODE_MODIFIER_LETTER_END_HIGH_TONE  0x02fa
-#define UNITEXT_MODIFIER_LETTER_END_HIGH_TONE  L"\u02fa"
+#define UNITEXT_MODIFIER_LETTER_END_HIGH_TONE  U"\u02fa"
 #define UNICODE_MODIFIER_LETTER_BEGIN_LOW_TONE  0x02fb
-#define UNITEXT_MODIFIER_LETTER_BEGIN_LOW_TONE  L"\u02fb"
+#define UNITEXT_MODIFIER_LETTER_BEGIN_LOW_TONE  U"\u02fb"
 #define UNICODE_MODIFIER_LETTER_END_LOW_TONE  0x02fc
-#define UNITEXT_MODIFIER_LETTER_END_LOW_TONE  L"\u02fc"
+#define UNITEXT_MODIFIER_LETTER_END_LOW_TONE  U"\u02fc"
 #define UNICODE_MODIFIER_LETTER_SHELF  0x02fd
-#define UNITEXT_MODIFIER_LETTER_SHELF  L"\u02fd"
+#define UNITEXT_MODIFIER_LETTER_SHELF  U"\u02fd"
 #define UNICODE_MODIFIER_LETTER_OPEN_SHELF  0x02fe
-#define UNITEXT_MODIFIER_LETTER_OPEN_SHELF  L"\u02fe"
+#define UNITEXT_MODIFIER_LETTER_OPEN_SHELF  U"\u02fe"
 #define UNICODE_MODIFIER_LETTER_LOW_LEFT_ARROW  0x02ff
-#define UNITEXT_MODIFIER_LETTER_LOW_LEFT_ARROW  L"\u02ff"
+#define UNITEXT_MODIFIER_LETTER_LOW_LEFT_ARROW  U"\u02ff"
 #define UNICODE_COMBINING_GRAVE_ACCENT  0x0300
-#define UNITEXT_COMBINING_GRAVE_ACCENT  L"\u0300"
+#define UNITEXT_COMBINING_GRAVE_ACCENT  U"\u0300"
 #define UNICODE_COMBINING_ACUTE_ACCENT  0x0301
-#define UNITEXT_COMBINING_ACUTE_ACCENT  L"\u0301"
+#define UNITEXT_COMBINING_ACUTE_ACCENT  U"\u0301"
 #define UNICODE_COMBINING_CIRCUMFLEX_ACCENT  0x0302
-#define UNITEXT_COMBINING_CIRCUMFLEX_ACCENT  L"\u0302"
+#define UNITEXT_COMBINING_CIRCUMFLEX_ACCENT  U"\u0302"
 #define UNICODE_COMBINING_TILDE  0x0303
-#define UNITEXT_COMBINING_TILDE  L"\u0303"
+#define UNITEXT_COMBINING_TILDE  U"\u0303"
 #define UNICODE_COMBINING_MACRON  0x0304
-#define UNITEXT_COMBINING_MACRON  L"\u0304"
+#define UNITEXT_COMBINING_MACRON  U"\u0304"
 #define UNICODE_COMBINING_OVERLINE  0x0305
-#define UNITEXT_COMBINING_OVERLINE  L"\u0305"
+#define UNITEXT_COMBINING_OVERLINE  U"\u0305"
 #define UNICODE_COMBINING_BREVE  0x0306
-#define UNITEXT_COMBINING_BREVE  L"\u0306"
+#define UNITEXT_COMBINING_BREVE  U"\u0306"
 #define UNICODE_COMBINING_DOT_ABOVE  0x0307
-#define UNITEXT_COMBINING_DOT_ABOVE  L"\u0307"
+#define UNITEXT_COMBINING_DOT_ABOVE  U"\u0307"
 #define UNICODE_COMBINING_DIAERESIS  0x0308
-#define UNITEXT_COMBINING_DIAERESIS  L"\u0308"
+#define UNITEXT_COMBINING_DIAERESIS  U"\u0308"
 #define UNICODE_COMBINING_HOOK_ABOVE  0x0309
-#define UNITEXT_COMBINING_HOOK_ABOVE  L"\u0309"
+#define UNITEXT_COMBINING_HOOK_ABOVE  U"\u0309"
 #define UNICODE_COMBINING_RING_ABOVE  0x030a
-#define UNITEXT_COMBINING_RING_ABOVE  L"\u030a"
+#define UNITEXT_COMBINING_RING_ABOVE  U"\u030a"
 #define UNICODE_COMBINING_DOUBLE_ACUTE_ACCENT  0x030b
-#define UNITEXT_COMBINING_DOUBLE_ACUTE_ACCENT  L"\u030b"
+#define UNITEXT_COMBINING_DOUBLE_ACUTE_ACCENT  U"\u030b"
 #define UNICODE_COMBINING_CARON  0x030c
-#define UNITEXT_COMBINING_CARON  L"\u030c"
+#define UNITEXT_COMBINING_CARON  U"\u030c"
 #define UNICODE_COMBINING_VERTICAL_LINE_ABOVE  0x030d
-#define UNITEXT_COMBINING_VERTICAL_LINE_ABOVE  L"\u030d"
+#define UNITEXT_COMBINING_VERTICAL_LINE_ABOVE  U"\u030d"
 #define UNICODE_COMBINING_DOUBLE_VERTICAL_LINE_ABOVE  0x030e
-#define UNITEXT_COMBINING_DOUBLE_VERTICAL_LINE_ABOVE  L"\u030e"
+#define UNITEXT_COMBINING_DOUBLE_VERTICAL_LINE_ABOVE  U"\u030e"
 #define UNICODE_COMBINING_DOUBLE_GRAVE_ACCENT  0x030f
-#define UNITEXT_COMBINING_DOUBLE_GRAVE_ACCENT  L"\u030f"
+#define UNITEXT_COMBINING_DOUBLE_GRAVE_ACCENT  U"\u030f"
 #define UNICODE_COMBINING_CANDRABINDU  0x0310
-#define UNITEXT_COMBINING_CANDRABINDU  L"\u0310"
+#define UNITEXT_COMBINING_CANDRABINDU  U"\u0310"
 #define UNICODE_COMBINING_INVERTED_BREVE  0x0311
-#define UNITEXT_COMBINING_INVERTED_BREVE  L"\u0311"
+#define UNITEXT_COMBINING_INVERTED_BREVE  U"\u0311"
 #define UNICODE_COMBINING_TURNED_COMMA_ABOVE  0x0312
-#define UNITEXT_COMBINING_TURNED_COMMA_ABOVE  L"\u0312"
+#define UNITEXT_COMBINING_TURNED_COMMA_ABOVE  U"\u0312"
 #define UNICODE_COMBINING_COMMA_ABOVE  0x0313
-#define UNITEXT_COMBINING_COMMA_ABOVE  L"\u0313"
+#define UNITEXT_COMBINING_COMMA_ABOVE  U"\u0313"
 #define UNICODE_COMBINING_REVERSED_COMMA_ABOVE  0x0314
-#define UNITEXT_COMBINING_REVERSED_COMMA_ABOVE  L"\u0314"
+#define UNITEXT_COMBINING_REVERSED_COMMA_ABOVE  U"\u0314"
 #define UNICODE_COMBINING_COMMA_ABOVE_RIGHT  0x0315
-#define UNITEXT_COMBINING_COMMA_ABOVE_RIGHT  L"\u0315"
+#define UNITEXT_COMBINING_COMMA_ABOVE_RIGHT  U"\u0315"
 #define UNICODE_COMBINING_GRAVE_ACCENT_BELOW  0x0316
-#define UNITEXT_COMBINING_GRAVE_ACCENT_BELOW  L"\u0316"
+#define UNITEXT_COMBINING_GRAVE_ACCENT_BELOW  U"\u0316"
 #define UNICODE_COMBINING_ACUTE_ACCENT_BELOW  0x0317
-#define UNITEXT_COMBINING_ACUTE_ACCENT_BELOW  L"\u0317"
+#define UNITEXT_COMBINING_ACUTE_ACCENT_BELOW  U"\u0317"
 #define UNICODE_COMBINING_LEFT_TACK_BELOW  0x0318
-#define UNITEXT_COMBINING_LEFT_TACK_BELOW  L"\u0318"
+#define UNITEXT_COMBINING_LEFT_TACK_BELOW  U"\u0318"
 #define UNICODE_COMBINING_RIGHT_TACK_BELOW  0x0319
-#define UNITEXT_COMBINING_RIGHT_TACK_BELOW  L"\u0319"
+#define UNITEXT_COMBINING_RIGHT_TACK_BELOW  U"\u0319"
 #define UNICODE_COMBINING_LEFT_ANGLE_ABOVE  0x031a
-#define UNITEXT_COMBINING_LEFT_ANGLE_ABOVE  L"\u031a"
+#define UNITEXT_COMBINING_LEFT_ANGLE_ABOVE  U"\u031a"
 #define UNICODE_COMBINING_HORN  0x031b
-#define UNITEXT_COMBINING_HORN  L"\u031b"
+#define UNITEXT_COMBINING_HORN  U"\u031b"
 #define UNICODE_COMBINING_LEFT_HALF_RING_BELOW  0x031c
-#define UNITEXT_COMBINING_LEFT_HALF_RING_BELOW  L"\u031c"
+#define UNITEXT_COMBINING_LEFT_HALF_RING_BELOW  U"\u031c"
 #define UNICODE_COMBINING_UP_TACK_BELOW  0x031d
-#define UNITEXT_COMBINING_UP_TACK_BELOW  L"\u031d"
+#define UNITEXT_COMBINING_UP_TACK_BELOW  U"\u031d"
 #define UNICODE_COMBINING_DOWN_TACK_BELOW  0x031e
-#define UNITEXT_COMBINING_DOWN_TACK_BELOW  L"\u031e"
+#define UNITEXT_COMBINING_DOWN_TACK_BELOW  U"\u031e"
 #define UNICODE_COMBINING_PLUS_SIGN_BELOW  0x031f
-#define UNITEXT_COMBINING_PLUS_SIGN_BELOW  L"\u031f"
+#define UNITEXT_COMBINING_PLUS_SIGN_BELOW  U"\u031f"
 #define UNICODE_COMBINING_MINUS_SIGN_BELOW  0x0320
-#define UNITEXT_COMBINING_MINUS_SIGN_BELOW  L"\u0320"
+#define UNITEXT_COMBINING_MINUS_SIGN_BELOW  U"\u0320"
 #define UNICODE_COMBINING_PALATALIZED_HOOK_BELOW  0x0321
-#define UNITEXT_COMBINING_PALATALIZED_HOOK_BELOW  L"\u0321"
+#define UNITEXT_COMBINING_PALATALIZED_HOOK_BELOW  U"\u0321"
 #define UNICODE_COMBINING_RETROFLEX_HOOK_BELOW  0x0322
-#define UNITEXT_COMBINING_RETROFLEX_HOOK_BELOW  L"\u0322"
+#define UNITEXT_COMBINING_RETROFLEX_HOOK_BELOW  U"\u0322"
 #define UNICODE_COMBINING_DOT_BELOW  0x0323
-#define UNITEXT_COMBINING_DOT_BELOW  L"\u0323"
+#define UNITEXT_COMBINING_DOT_BELOW  U"\u0323"
 #define UNICODE_COMBINING_DIAERESIS_BELOW  0x0324
-#define UNITEXT_COMBINING_DIAERESIS_BELOW  L"\u0324"
+#define UNITEXT_COMBINING_DIAERESIS_BELOW  U"\u0324"
 #define UNICODE_COMBINING_RING_BELOW  0x0325
-#define UNITEXT_COMBINING_RING_BELOW  L"\u0325"
+#define UNITEXT_COMBINING_RING_BELOW  U"\u0325"
 #define UNICODE_COMBINING_COMMA_BELOW  0x0326
-#define UNITEXT_COMBINING_COMMA_BELOW  L"\u0326"
+#define UNITEXT_COMBINING_COMMA_BELOW  U"\u0326"
 #define UNICODE_COMBINING_CEDILLA  0x0327
-#define UNITEXT_COMBINING_CEDILLA  L"\u0327"
+#define UNITEXT_COMBINING_CEDILLA  U"\u0327"
 #define UNICODE_COMBINING_OGONEK  0x0328
-#define UNITEXT_COMBINING_OGONEK  L"\u0328"
+#define UNITEXT_COMBINING_OGONEK  U"\u0328"
 #define UNICODE_COMBINING_VERTICAL_LINE_BELOW  0x0329
-#define UNITEXT_COMBINING_VERTICAL_LINE_BELOW  L"\u0329"
+#define UNITEXT_COMBINING_VERTICAL_LINE_BELOW  U"\u0329"
 #define UNICODE_COMBINING_BRIDGE_BELOW  0x032a
-#define UNITEXT_COMBINING_BRIDGE_BELOW  L"\u032a"
+#define UNITEXT_COMBINING_BRIDGE_BELOW  U"\u032a"
 #define UNICODE_COMBINING_INVERTED_DOUBLE_ARCH_BELOW  0x032b
-#define UNITEXT_COMBINING_INVERTED_DOUBLE_ARCH_BELOW  L"\u032b"
+#define UNITEXT_COMBINING_INVERTED_DOUBLE_ARCH_BELOW  U"\u032b"
 #define UNICODE_COMBINING_CARON_BELOW  0x032c
-#define UNITEXT_COMBINING_CARON_BELOW  L"\u032c"
+#define UNITEXT_COMBINING_CARON_BELOW  U"\u032c"
 #define UNICODE_COMBINING_CIRCUMFLEX_ACCENT_BELOW  0x032d
-#define UNITEXT_COMBINING_CIRCUMFLEX_ACCENT_BELOW  L"\u032d"
+#define UNITEXT_COMBINING_CIRCUMFLEX_ACCENT_BELOW  U"\u032d"
 #define UNICODE_COMBINING_BREVE_BELOW  0x032e
-#define UNITEXT_COMBINING_BREVE_BELOW  L"\u032e"
+#define UNITEXT_COMBINING_BREVE_BELOW  U"\u032e"
 #define UNICODE_COMBINING_INVERTED_BREVE_BELOW  0x032f
-#define UNITEXT_COMBINING_INVERTED_BREVE_BELOW  L"\u032f"
+#define UNITEXT_COMBINING_INVERTED_BREVE_BELOW  U"\u032f"
 #define UNICODE_COMBINING_TILDE_BELOW  0x0330
-#define UNITEXT_COMBINING_TILDE_BELOW  L"\u0330"
+#define UNITEXT_COMBINING_TILDE_BELOW  U"\u0330"
 #define UNICODE_COMBINING_MACRON_BELOW  0x0331
-#define UNITEXT_COMBINING_MACRON_BELOW  L"\u0331"
+#define UNITEXT_COMBINING_MACRON_BELOW  U"\u0331"
 #define UNICODE_COMBINING_LOW_LINE  0x0332
-#define UNITEXT_COMBINING_LOW_LINE  L"\u0332"
+#define UNITEXT_COMBINING_LOW_LINE  U"\u0332"
 #define UNICODE_COMBINING_DOUBLE_LOW_LINE  0x0333
-#define UNITEXT_COMBINING_DOUBLE_LOW_LINE  L"\u0333"
+#define UNITEXT_COMBINING_DOUBLE_LOW_LINE  U"\u0333"
 #define UNICODE_COMBINING_TILDE_OVERLAY  0x0334
-#define UNITEXT_COMBINING_TILDE_OVERLAY  L"\u0334"
+#define UNITEXT_COMBINING_TILDE_OVERLAY  U"\u0334"
 #define UNICODE_COMBINING_SHORT_STROKE_OVERLAY  0x0335
-#define UNITEXT_COMBINING_SHORT_STROKE_OVERLAY  L"\u0335"
+#define UNITEXT_COMBINING_SHORT_STROKE_OVERLAY  U"\u0335"
 #define UNICODE_COMBINING_LONG_STROKE_OVERLAY  0x0336
-#define UNITEXT_COMBINING_LONG_STROKE_OVERLAY  L"\u0336"
+#define UNITEXT_COMBINING_LONG_STROKE_OVERLAY  U"\u0336"
 #define UNICODE_COMBINING_SHORT_SOLIDUS_OVERLAY  0x0337
-#define UNITEXT_COMBINING_SHORT_SOLIDUS_OVERLAY  L"\u0337"
+#define UNITEXT_COMBINING_SHORT_SOLIDUS_OVERLAY  U"\u0337"
 #define UNICODE_COMBINING_LONG_SOLIDUS_OVERLAY  0x0338
-#define UNITEXT_COMBINING_LONG_SOLIDUS_OVERLAY  L"\u0338"
+#define UNITEXT_COMBINING_LONG_SOLIDUS_OVERLAY  U"\u0338"
 #define UNICODE_COMBINING_RIGHT_HALF_RING_BELOW  0x0339
-#define UNITEXT_COMBINING_RIGHT_HALF_RING_BELOW  L"\u0339"
+#define UNITEXT_COMBINING_RIGHT_HALF_RING_BELOW  U"\u0339"
 #define UNICODE_COMBINING_INVERTED_BRIDGE_BELOW  0x033a
-#define UNITEXT_COMBINING_INVERTED_BRIDGE_BELOW  L"\u033a"
+#define UNITEXT_COMBINING_INVERTED_BRIDGE_BELOW  U"\u033a"
 #define UNICODE_COMBINING_SQUARE_BELOW  0x033b
-#define UNITEXT_COMBINING_SQUARE_BELOW  L"\u033b"
+#define UNITEXT_COMBINING_SQUARE_BELOW  U"\u033b"
 #define UNICODE_COMBINING_SEAGULL_BELOW  0x033c
-#define UNITEXT_COMBINING_SEAGULL_BELOW  L"\u033c"
+#define UNITEXT_COMBINING_SEAGULL_BELOW  U"\u033c"
 #define UNICODE_COMBINING_X_ABOVE  0x033d
-#define UNITEXT_COMBINING_X_ABOVE  L"\u033d"
+#define UNITEXT_COMBINING_X_ABOVE  U"\u033d"
 #define UNICODE_COMBINING_VERTICAL_TILDE  0x033e
-#define UNITEXT_COMBINING_VERTICAL_TILDE  L"\u033e"
+#define UNITEXT_COMBINING_VERTICAL_TILDE  U"\u033e"
 #define UNICODE_COMBINING_DOUBLE_OVERLINE  0x033f
-#define UNITEXT_COMBINING_DOUBLE_OVERLINE  L"\u033f"
+#define UNITEXT_COMBINING_DOUBLE_OVERLINE  U"\u033f"
 #define UNICODE_COMBINING_GRAVE_TONE_MARK  0x0340
-#define UNITEXT_COMBINING_GRAVE_TONE_MARK  L"\u0340"
+#define UNITEXT_COMBINING_GRAVE_TONE_MARK  U"\u0340"
 #define UNICODE_COMBINING_ACUTE_TONE_MARK  0x0341
-#define UNITEXT_COMBINING_ACUTE_TONE_MARK  L"\u0341"
+#define UNITEXT_COMBINING_ACUTE_TONE_MARK  U"\u0341"
 #define UNICODE_COMBINING_GREEK_PERISPOMENI  0x0342
-#define UNITEXT_COMBINING_GREEK_PERISPOMENI  L"\u0342"
+#define UNITEXT_COMBINING_GREEK_PERISPOMENI  U"\u0342"
 #define UNICODE_COMBINING_GREEK_KORONIS  0x0343
-#define UNITEXT_COMBINING_GREEK_KORONIS  L"\u0343"
+#define UNITEXT_COMBINING_GREEK_KORONIS  U"\u0343"
 #define UNICODE_COMBINING_GREEK_DIALYTIKA_TONOS  0x0344
-#define UNITEXT_COMBINING_GREEK_DIALYTIKA_TONOS  L"\u0344"
+#define UNITEXT_COMBINING_GREEK_DIALYTIKA_TONOS  U"\u0344"
 #define UNICODE_COMBINING_GREEK_YPOGEGRAMMENI  0x0345
-#define UNITEXT_COMBINING_GREEK_YPOGEGRAMMENI  L"\u0345"
+#define UNITEXT_COMBINING_GREEK_YPOGEGRAMMENI  U"\u0345"
 #define UNICODE_COMBINING_BRIDGE_ABOVE  0x0346
-#define UNITEXT_COMBINING_BRIDGE_ABOVE  L"\u0346"
+#define UNITEXT_COMBINING_BRIDGE_ABOVE  U"\u0346"
 #define UNICODE_COMBINING_EQUALS_SIGN_BELOW  0x0347
-#define UNITEXT_COMBINING_EQUALS_SIGN_BELOW  L"\u0347"
+#define UNITEXT_COMBINING_EQUALS_SIGN_BELOW  U"\u0347"
 #define UNICODE_COMBINING_DOUBLE_VERTICAL_LINE_BELOW  0x0348
-#define UNITEXT_COMBINING_DOUBLE_VERTICAL_LINE_BELOW  L"\u0348"
+#define UNITEXT_COMBINING_DOUBLE_VERTICAL_LINE_BELOW  U"\u0348"
 #define UNICODE_COMBINING_LEFT_ANGLE_BELOW  0x0349
-#define UNITEXT_COMBINING_LEFT_ANGLE_BELOW  L"\u0349"
+#define UNITEXT_COMBINING_LEFT_ANGLE_BELOW  U"\u0349"
 #define UNICODE_COMBINING_NOT_TILDE_ABOVE  0x034a
-#define UNITEXT_COMBINING_NOT_TILDE_ABOVE  L"\u034a"
+#define UNITEXT_COMBINING_NOT_TILDE_ABOVE  U"\u034a"
 #define UNICODE_COMBINING_HOMOTHETIC_ABOVE  0x034b
-#define UNITEXT_COMBINING_HOMOTHETIC_ABOVE  L"\u034b"
+#define UNITEXT_COMBINING_HOMOTHETIC_ABOVE  U"\u034b"
 #define UNICODE_COMBINING_ALMOST_EQUAL_TO_ABOVE  0x034c
-#define UNITEXT_COMBINING_ALMOST_EQUAL_TO_ABOVE  L"\u034c"
+#define UNITEXT_COMBINING_ALMOST_EQUAL_TO_ABOVE  U"\u034c"
 #define UNICODE_COMBINING_LEFT_RIGHT_ARROW_BELOW  0x034d
-#define UNITEXT_COMBINING_LEFT_RIGHT_ARROW_BELOW  L"\u034d"
+#define UNITEXT_COMBINING_LEFT_RIGHT_ARROW_BELOW  U"\u034d"
 #define UNICODE_COMBINING_UPWARDS_ARROW_BELOW  0x034e
-#define UNITEXT_COMBINING_UPWARDS_ARROW_BELOW  L"\u034e"
+#define UNITEXT_COMBINING_UPWARDS_ARROW_BELOW  U"\u034e"
 #define UNICODE_COMBINING_GRAPHEME_JOINER  0x034f
-#define UNITEXT_COMBINING_GRAPHEME_JOINER  L"\u034f"
+#define UNITEXT_COMBINING_GRAPHEME_JOINER  U"\u034f"
 #define UNICODE_COMBINING_RIGHT_ARROWHEAD_ABOVE  0x0350
-#define UNITEXT_COMBINING_RIGHT_ARROWHEAD_ABOVE  L"\u0350"
+#define UNITEXT_COMBINING_RIGHT_ARROWHEAD_ABOVE  U"\u0350"
 #define UNICODE_COMBINING_LEFT_HALF_RING_ABOVE  0x0351
-#define UNITEXT_COMBINING_LEFT_HALF_RING_ABOVE  L"\u0351"
+#define UNITEXT_COMBINING_LEFT_HALF_RING_ABOVE  U"\u0351"
 #define UNICODE_COMBINING_FERMATA  0x0352
-#define UNITEXT_COMBINING_FERMATA  L"\u0352"
+#define UNITEXT_COMBINING_FERMATA  U"\u0352"
 #define UNICODE_COMBINING_X_BELOW  0x0353
-#define UNITEXT_COMBINING_X_BELOW  L"\u0353"
+#define UNITEXT_COMBINING_X_BELOW  U"\u0353"
 #define UNICODE_COMBINING_LEFT_ARROWHEAD_BELOW  0x0354
-#define UNITEXT_COMBINING_LEFT_ARROWHEAD_BELOW  L"\u0354"
+#define UNITEXT_COMBINING_LEFT_ARROWHEAD_BELOW  U"\u0354"
 #define UNICODE_COMBINING_RIGHT_ARROWHEAD_BELOW  0x0355
-#define UNITEXT_COMBINING_RIGHT_ARROWHEAD_BELOW  L"\u0355"
+#define UNITEXT_COMBINING_RIGHT_ARROWHEAD_BELOW  U"\u0355"
 #define UNICODE_COMBINING_RIGHT_ARROWHEAD_AND_UP_ARROWHEAD_BELOW  0x0356
-#define UNITEXT_COMBINING_RIGHT_ARROWHEAD_AND_UP_ARROWHEAD_BELOW  L"\u0356"
+#define UNITEXT_COMBINING_RIGHT_ARROWHEAD_AND_UP_ARROWHEAD_BELOW  U"\u0356"
 #define UNICODE_COMBINING_RIGHT_HALF_RING_ABOVE  0x0357
-#define UNITEXT_COMBINING_RIGHT_HALF_RING_ABOVE  L"\u0357"
+#define UNITEXT_COMBINING_RIGHT_HALF_RING_ABOVE  U"\u0357"
 #define UNICODE_COMBINING_DOT_ABOVE_RIGHT  0x0358
-#define UNITEXT_COMBINING_DOT_ABOVE_RIGHT  L"\u0358"
+#define UNITEXT_COMBINING_DOT_ABOVE_RIGHT  U"\u0358"
 #define UNICODE_COMBINING_ASTERISK_BELOW  0x0359
-#define UNITEXT_COMBINING_ASTERISK_BELOW  L"\u0359"
+#define UNITEXT_COMBINING_ASTERISK_BELOW  U"\u0359"
 #define UNICODE_COMBINING_DOUBLE_RING_BELOW  0x035a
-#define UNITEXT_COMBINING_DOUBLE_RING_BELOW  L"\u035a"
+#define UNITEXT_COMBINING_DOUBLE_RING_BELOW  U"\u035a"
 #define UNICODE_COMBINING_ZIGZAG_ABOVE  0x035b
-#define UNITEXT_COMBINING_ZIGZAG_ABOVE  L"\u035b"
+#define UNITEXT_COMBINING_ZIGZAG_ABOVE  U"\u035b"
 #define UNICODE_COMBINING_DOUBLE_BREVE_BELOW  0x035c
-#define UNITEXT_COMBINING_DOUBLE_BREVE_BELOW  L"\u035c"
+#define UNITEXT_COMBINING_DOUBLE_BREVE_BELOW  U"\u035c"
 #define UNICODE_COMBINING_DOUBLE_BREVE  0x035d
-#define UNITEXT_COMBINING_DOUBLE_BREVE  L"\u035d"
+#define UNITEXT_COMBINING_DOUBLE_BREVE  U"\u035d"
 #define UNICODE_COMBINING_DOUBLE_MACRON  0x035e
-#define UNITEXT_COMBINING_DOUBLE_MACRON  L"\u035e"
+#define UNITEXT_COMBINING_DOUBLE_MACRON  U"\u035e"
 #define UNICODE_COMBINING_DOUBLE_MACRON_BELOW  0x035f
-#define UNITEXT_COMBINING_DOUBLE_MACRON_BELOW  L"\u035f"
+#define UNITEXT_COMBINING_DOUBLE_MACRON_BELOW  U"\u035f"
 #define UNICODE_COMBINING_DOUBLE_TILDE  0x0360
-#define UNITEXT_COMBINING_DOUBLE_TILDE  L"\u0360"
+#define UNITEXT_COMBINING_DOUBLE_TILDE  U"\u0360"
 #define UNICODE_COMBINING_DOUBLE_INVERTED_BREVE  0x0361
-#define UNITEXT_COMBINING_DOUBLE_INVERTED_BREVE  L"\u0361"
+#define UNITEXT_COMBINING_DOUBLE_INVERTED_BREVE  U"\u0361"
 #define UNICODE_COMBINING_DOUBLE_RIGHTWARDS_ARROW_BELOW  0x0362
-#define UNITEXT_COMBINING_DOUBLE_RIGHTWARDS_ARROW_BELOW  L"\u0362"
+#define UNITEXT_COMBINING_DOUBLE_RIGHTWARDS_ARROW_BELOW  U"\u0362"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_A  0x0363
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_A  L"\u0363"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_A  U"\u0363"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_E  0x0364
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_E  L"\u0364"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_E  U"\u0364"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_I  0x0365
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_I  L"\u0365"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_I  U"\u0365"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_O  0x0366
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_O  L"\u0366"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_O  U"\u0366"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_U  0x0367
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_U  L"\u0367"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_U  U"\u0367"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_C  0x0368
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_C  L"\u0368"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_C  U"\u0368"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_D  0x0369
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_D  L"\u0369"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_D  U"\u0369"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_H  0x036a
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_H  L"\u036a"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_H  U"\u036a"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_M  0x036b
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_M  L"\u036b"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_M  U"\u036b"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_R  0x036c
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_R  L"\u036c"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_R  U"\u036c"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_T  0x036d
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_T  L"\u036d"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_T  U"\u036d"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_V  0x036e
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_V  L"\u036e"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_V  U"\u036e"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_X  0x036f
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_X  L"\u036f"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_X  U"\u036f"
 #define UNICODE_GREEK_NUMERAL_SIGN  0x0374
-#define UNITEXT_GREEK_NUMERAL_SIGN  L"\u0374"
+#define UNITEXT_GREEK_NUMERAL_SIGN  U"\u0374"
 #define UNICODE_GREEK_LOWER_NUMERAL_SIGN  0x0375
-#define UNITEXT_GREEK_LOWER_NUMERAL_SIGN  L"\u0375"
+#define UNITEXT_GREEK_LOWER_NUMERAL_SIGN  U"\u0375"
 #define UNICODE_GREEK_YPOGEGRAMMENI  0x037a
-#define UNITEXT_GREEK_YPOGEGRAMMENI  L"\u037a"
+#define UNITEXT_GREEK_YPOGEGRAMMENI  U"\u037a"
 #define UNICODE_GREEK_SMALL_REVERSED_LUNATE_SIGMA_SYMBOL  0x037b
-#define UNITEXT_GREEK_SMALL_REVERSED_LUNATE_SIGMA_SYMBOL  L"\u037b"
+#define UNITEXT_GREEK_SMALL_REVERSED_LUNATE_SIGMA_SYMBOL  U"\u037b"
 #define UNICODE_GREEK_SMALL_DOTTED_LUNATE_SIGMA_SYMBOL  0x037c
-#define UNITEXT_GREEK_SMALL_DOTTED_LUNATE_SIGMA_SYMBOL  L"\u037c"
+#define UNITEXT_GREEK_SMALL_DOTTED_LUNATE_SIGMA_SYMBOL  U"\u037c"
 #define UNICODE_GREEK_SMALL_REVERSED_DOTTED_LUNATE_SIGMA_SYMBOL  0x037d
-#define UNITEXT_GREEK_SMALL_REVERSED_DOTTED_LUNATE_SIGMA_SYMBOL  L"\u037d"
+#define UNITEXT_GREEK_SMALL_REVERSED_DOTTED_LUNATE_SIGMA_SYMBOL  U"\u037d"
 #define UNICODE_GREEK_QUESTION_MARK  0x037e
-#define UNITEXT_GREEK_QUESTION_MARK  L"\u037e"
+#define UNITEXT_GREEK_QUESTION_MARK  U"\u037e"
 #define UNICODE_GREEK_TONOS  0x0384
-#define UNITEXT_GREEK_TONOS  L"\u0384"
+#define UNITEXT_GREEK_TONOS  U"\u0384"
 #define UNICODE_GREEK_DIALYTIKA_TONOS  0x0385
-#define UNITEXT_GREEK_DIALYTIKA_TONOS  L"\u0385"
+#define UNITEXT_GREEK_DIALYTIKA_TONOS  U"\u0385"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS  0x0386
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS  L"\u0386"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS  U"\u0386"
 #define UNICODE_GREEK_ANO_TELEIA  0x0387
-#define UNITEXT_GREEK_ANO_TELEIA  L"\u0387"
+#define UNITEXT_GREEK_ANO_TELEIA  U"\u0387"
 #define UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS  0x0388
-#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS  L"\u0388"
+#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS  U"\u0388"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_TONOS  0x0389
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_TONOS  L"\u0389"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_TONOS  U"\u0389"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS  0x038a
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS  L"\u038a"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS  U"\u038a"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS  0x038c
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS  L"\u038c"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS  U"\u038c"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS  0x038e
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS  L"\u038e"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS  U"\u038e"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS  0x038f
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS  L"\u038f"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS  U"\u038f"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS  0x0390
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS  L"\u0390"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS  U"\u0390"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA  0x0391
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA  L"\u0391"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA  U"\u0391"
 #define UNICODE_GREEK_CAPITAL_LETTER_BETA  0x0392
-#define UNITEXT_GREEK_CAPITAL_LETTER_BETA  L"\u0392"
+#define UNITEXT_GREEK_CAPITAL_LETTER_BETA  U"\u0392"
 #define UNICODE_GREEK_CAPITAL_LETTER_GAMMA  0x0393
-#define UNITEXT_GREEK_CAPITAL_LETTER_GAMMA  L"\u0393"
+#define UNITEXT_GREEK_CAPITAL_LETTER_GAMMA  U"\u0393"
 #define UNICODE_GREEK_CAPITAL_LETTER_DELTA  0x0394
-#define UNITEXT_GREEK_CAPITAL_LETTER_DELTA  L"\u0394"
+#define UNITEXT_GREEK_CAPITAL_LETTER_DELTA  U"\u0394"
 #define UNICODE_GREEK_CAPITAL_LETTER_EPSILON  0x0395
-#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON  L"\u0395"
+#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON  U"\u0395"
 #define UNICODE_GREEK_CAPITAL_LETTER_ZETA  0x0396
-#define UNITEXT_GREEK_CAPITAL_LETTER_ZETA  L"\u0396"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ZETA  U"\u0396"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA  0x0397
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA  L"\u0397"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA  U"\u0397"
 #define UNICODE_GREEK_CAPITAL_LETTER_THETA  0x0398
-#define UNITEXT_GREEK_CAPITAL_LETTER_THETA  L"\u0398"
+#define UNITEXT_GREEK_CAPITAL_LETTER_THETA  U"\u0398"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA  0x0399
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA  L"\u0399"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA  U"\u0399"
 #define UNICODE_GREEK_CAPITAL_LETTER_KAPPA  0x039a
-#define UNITEXT_GREEK_CAPITAL_LETTER_KAPPA  L"\u039a"
+#define UNITEXT_GREEK_CAPITAL_LETTER_KAPPA  U"\u039a"
 #define UNICODE_GREEK_CAPITAL_LETTER_LAMDA  0x039b
-#define UNITEXT_GREEK_CAPITAL_LETTER_LAMDA  L"\u039b"
+#define UNITEXT_GREEK_CAPITAL_LETTER_LAMDA  U"\u039b"
 #define UNICODE_GREEK_CAPITAL_LETTER_MU  0x039c
-#define UNITEXT_GREEK_CAPITAL_LETTER_MU  L"\u039c"
+#define UNITEXT_GREEK_CAPITAL_LETTER_MU  U"\u039c"
 #define UNICODE_GREEK_CAPITAL_LETTER_NU  0x039d
-#define UNITEXT_GREEK_CAPITAL_LETTER_NU  L"\u039d"
+#define UNITEXT_GREEK_CAPITAL_LETTER_NU  U"\u039d"
 #define UNICODE_GREEK_CAPITAL_LETTER_XI  0x039e
-#define UNITEXT_GREEK_CAPITAL_LETTER_XI  L"\u039e"
+#define UNITEXT_GREEK_CAPITAL_LETTER_XI  U"\u039e"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMICRON  0x039f
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON  L"\u039f"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON  U"\u039f"
 #define UNICODE_GREEK_CAPITAL_LETTER_PI  0x03a0
-#define UNITEXT_GREEK_CAPITAL_LETTER_PI  L"\u03a0"
+#define UNITEXT_GREEK_CAPITAL_LETTER_PI  U"\u03a0"
 #define UNICODE_GREEK_CAPITAL_LETTER_RHO  0x03a1
-#define UNITEXT_GREEK_CAPITAL_LETTER_RHO  L"\u03a1"
+#define UNITEXT_GREEK_CAPITAL_LETTER_RHO  U"\u03a1"
 #define UNICODE_GREEK_CAPITAL_LETTER_SIGMA  0x03a3
-#define UNITEXT_GREEK_CAPITAL_LETTER_SIGMA  L"\u03a3"
+#define UNITEXT_GREEK_CAPITAL_LETTER_SIGMA  U"\u03a3"
 #define UNICODE_GREEK_CAPITAL_LETTER_TAU  0x03a4
-#define UNITEXT_GREEK_CAPITAL_LETTER_TAU  L"\u03a4"
+#define UNITEXT_GREEK_CAPITAL_LETTER_TAU  U"\u03a4"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON  0x03a5
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON  L"\u03a5"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON  U"\u03a5"
 #define UNICODE_GREEK_CAPITAL_LETTER_PHI  0x03a6
-#define UNITEXT_GREEK_CAPITAL_LETTER_PHI  L"\u03a6"
+#define UNITEXT_GREEK_CAPITAL_LETTER_PHI  U"\u03a6"
 #define UNICODE_GREEK_CAPITAL_LETTER_CHI  0x03a7
-#define UNITEXT_GREEK_CAPITAL_LETTER_CHI  L"\u03a7"
+#define UNITEXT_GREEK_CAPITAL_LETTER_CHI  U"\u03a7"
 #define UNICODE_GREEK_CAPITAL_LETTER_PSI  0x03a8
-#define UNITEXT_GREEK_CAPITAL_LETTER_PSI  L"\u03a8"
+#define UNITEXT_GREEK_CAPITAL_LETTER_PSI  U"\u03a8"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA  0x03a9
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA  L"\u03a9"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA  U"\u03a9"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA  0x03aa
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA  L"\u03aa"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA  U"\u03aa"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA  0x03ab
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA  L"\u03ab"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA  U"\u03ab"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_TONOS  0x03ac
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_TONOS  L"\u03ac"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_TONOS  U"\u03ac"
 #define UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_TONOS  0x03ad
-#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_TONOS  L"\u03ad"
+#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_TONOS  U"\u03ad"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_TONOS  0x03ae
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_TONOS  L"\u03ae"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_TONOS  U"\u03ae"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_TONOS  0x03af
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_TONOS  L"\u03af"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_TONOS  U"\u03af"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS  0x03b0
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS  L"\u03b0"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS  U"\u03b0"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA  0x03b1
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA  L"\u03b1"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA  U"\u03b1"
 #define UNICODE_GREEK_SMALL_LETTER_BETA  0x03b2
-#define UNITEXT_GREEK_SMALL_LETTER_BETA  L"\u03b2"
+#define UNITEXT_GREEK_SMALL_LETTER_BETA  U"\u03b2"
 #define UNICODE_GREEK_SMALL_LETTER_GAMMA  0x03b3
-#define UNITEXT_GREEK_SMALL_LETTER_GAMMA  L"\u03b3"
+#define UNITEXT_GREEK_SMALL_LETTER_GAMMA  U"\u03b3"
 #define UNICODE_GREEK_SMALL_LETTER_DELTA  0x03b4
-#define UNITEXT_GREEK_SMALL_LETTER_DELTA  L"\u03b4"
+#define UNITEXT_GREEK_SMALL_LETTER_DELTA  U"\u03b4"
 #define UNICODE_GREEK_SMALL_LETTER_EPSILON  0x03b5
-#define UNITEXT_GREEK_SMALL_LETTER_EPSILON  L"\u03b5"
+#define UNITEXT_GREEK_SMALL_LETTER_EPSILON  U"\u03b5"
 #define UNICODE_GREEK_SMALL_LETTER_ZETA  0x03b6
-#define UNITEXT_GREEK_SMALL_LETTER_ZETA  L"\u03b6"
+#define UNITEXT_GREEK_SMALL_LETTER_ZETA  U"\u03b6"
 #define UNICODE_GREEK_SMALL_LETTER_ETA  0x03b7
-#define UNITEXT_GREEK_SMALL_LETTER_ETA  L"\u03b7"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA  U"\u03b7"
 #define UNICODE_GREEK_SMALL_LETTER_THETA  0x03b8
-#define UNITEXT_GREEK_SMALL_LETTER_THETA  L"\u03b8"
+#define UNITEXT_GREEK_SMALL_LETTER_THETA  U"\u03b8"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA  0x03b9
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA  L"\u03b9"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA  U"\u03b9"
 #define UNICODE_GREEK_SMALL_LETTER_KAPPA  0x03ba
-#define UNITEXT_GREEK_SMALL_LETTER_KAPPA  L"\u03ba"
+#define UNITEXT_GREEK_SMALL_LETTER_KAPPA  U"\u03ba"
 #define UNICODE_GREEK_SMALL_LETTER_LAMDA  0x03bb
-#define UNITEXT_GREEK_SMALL_LETTER_LAMDA  L"\u03bb"
+#define UNITEXT_GREEK_SMALL_LETTER_LAMDA  U"\u03bb"
 #define UNICODE_GREEK_SMALL_LETTER_MU  0x03bc
-#define UNITEXT_GREEK_SMALL_LETTER_MU  L"\u03bc"
+#define UNITEXT_GREEK_SMALL_LETTER_MU  U"\u03bc"
 #define UNICODE_GREEK_SMALL_LETTER_NU  0x03bd
-#define UNITEXT_GREEK_SMALL_LETTER_NU  L"\u03bd"
+#define UNITEXT_GREEK_SMALL_LETTER_NU  U"\u03bd"
 #define UNICODE_GREEK_SMALL_LETTER_XI  0x03be
-#define UNITEXT_GREEK_SMALL_LETTER_XI  L"\u03be"
+#define UNITEXT_GREEK_SMALL_LETTER_XI  U"\u03be"
 #define UNICODE_GREEK_SMALL_LETTER_OMICRON  0x03bf
-#define UNITEXT_GREEK_SMALL_LETTER_OMICRON  L"\u03bf"
+#define UNITEXT_GREEK_SMALL_LETTER_OMICRON  U"\u03bf"
 #define UNICODE_GREEK_SMALL_LETTER_PI  0x03c0
-#define UNITEXT_GREEK_SMALL_LETTER_PI  L"\u03c0"
+#define UNITEXT_GREEK_SMALL_LETTER_PI  U"\u03c0"
 #define UNICODE_GREEK_SMALL_LETTER_RHO  0x03c1
-#define UNITEXT_GREEK_SMALL_LETTER_RHO  L"\u03c1"
+#define UNITEXT_GREEK_SMALL_LETTER_RHO  U"\u03c1"
 #define UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA  0x03c2
-#define UNITEXT_GREEK_SMALL_LETTER_FINAL_SIGMA  L"\u03c2"
+#define UNITEXT_GREEK_SMALL_LETTER_FINAL_SIGMA  U"\u03c2"
 #define UNICODE_GREEK_SMALL_LETTER_SIGMA  0x03c3
-#define UNITEXT_GREEK_SMALL_LETTER_SIGMA  L"\u03c3"
+#define UNITEXT_GREEK_SMALL_LETTER_SIGMA  U"\u03c3"
 #define UNICODE_GREEK_SMALL_LETTER_TAU  0x03c4
-#define UNITEXT_GREEK_SMALL_LETTER_TAU  L"\u03c4"
+#define UNITEXT_GREEK_SMALL_LETTER_TAU  U"\u03c4"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON  0x03c5
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON  L"\u03c5"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON  U"\u03c5"
 #define UNICODE_GREEK_SMALL_LETTER_PHI  0x03c6
-#define UNITEXT_GREEK_SMALL_LETTER_PHI  L"\u03c6"
+#define UNITEXT_GREEK_SMALL_LETTER_PHI  U"\u03c6"
 #define UNICODE_GREEK_SMALL_LETTER_CHI  0x03c7
-#define UNITEXT_GREEK_SMALL_LETTER_CHI  L"\u03c7"
+#define UNITEXT_GREEK_SMALL_LETTER_CHI  U"\u03c7"
 #define UNICODE_GREEK_SMALL_LETTER_PSI  0x03c8
-#define UNITEXT_GREEK_SMALL_LETTER_PSI  L"\u03c8"
+#define UNITEXT_GREEK_SMALL_LETTER_PSI  U"\u03c8"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA  0x03c9
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA  L"\u03c9"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA  U"\u03c9"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA  0x03ca
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA  L"\u03ca"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA  U"\u03ca"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA  0x03cb
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA  L"\u03cb"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA  U"\u03cb"
 #define UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_TONOS  0x03cc
-#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_TONOS  L"\u03cc"
+#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_TONOS  U"\u03cc"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_TONOS  0x03cd
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_TONOS  L"\u03cd"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_TONOS  U"\u03cd"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_TONOS  0x03ce
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_TONOS  L"\u03ce"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_TONOS  U"\u03ce"
 #define UNICODE_GREEK_BETA_SYMBOL  0x03d0
-#define UNITEXT_GREEK_BETA_SYMBOL  L"\u03d0"
+#define UNITEXT_GREEK_BETA_SYMBOL  U"\u03d0"
 #define UNICODE_GREEK_THETA_SYMBOL  0x03d1
-#define UNITEXT_GREEK_THETA_SYMBOL  L"\u03d1"
+#define UNITEXT_GREEK_THETA_SYMBOL  U"\u03d1"
 #define UNICODE_GREEK_UPSILON_WITH_HOOK_SYMBOL  0x03d2
-#define UNITEXT_GREEK_UPSILON_WITH_HOOK_SYMBOL  L"\u03d2"
+#define UNITEXT_GREEK_UPSILON_WITH_HOOK_SYMBOL  U"\u03d2"
 #define UNICODE_GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL  0x03d3
-#define UNITEXT_GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL  L"\u03d3"
+#define UNITEXT_GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL  U"\u03d3"
 #define UNICODE_GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL  0x03d4
-#define UNITEXT_GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL  L"\u03d4"
+#define UNITEXT_GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL  U"\u03d4"
 #define UNICODE_GREEK_PHI_SYMBOL  0x03d5
-#define UNITEXT_GREEK_PHI_SYMBOL  L"\u03d5"
+#define UNITEXT_GREEK_PHI_SYMBOL  U"\u03d5"
 #define UNICODE_GREEK_PI_SYMBOL  0x03d6
-#define UNITEXT_GREEK_PI_SYMBOL  L"\u03d6"
+#define UNITEXT_GREEK_PI_SYMBOL  U"\u03d6"
 #define UNICODE_GREEK_KAI_SYMBOL  0x03d7
-#define UNITEXT_GREEK_KAI_SYMBOL  L"\u03d7"
+#define UNITEXT_GREEK_KAI_SYMBOL  U"\u03d7"
 #define UNICODE_GREEK_LETTER_ARCHAIC_KOPPA  0x03d8
-#define UNITEXT_GREEK_LETTER_ARCHAIC_KOPPA  L"\u03d8"
+#define UNITEXT_GREEK_LETTER_ARCHAIC_KOPPA  U"\u03d8"
 #define UNICODE_GREEK_SMALL_LETTER_ARCHAIC_KOPPA  0x03d9
-#define UNITEXT_GREEK_SMALL_LETTER_ARCHAIC_KOPPA  L"\u03d9"
+#define UNITEXT_GREEK_SMALL_LETTER_ARCHAIC_KOPPA  U"\u03d9"
 #define UNICODE_GREEK_LETTER_STIGMA  0x03da
-#define UNITEXT_GREEK_LETTER_STIGMA  L"\u03da"
+#define UNITEXT_GREEK_LETTER_STIGMA  U"\u03da"
 #define UNICODE_GREEK_SMALL_LETTER_STIGMA  0x03db
-#define UNITEXT_GREEK_SMALL_LETTER_STIGMA  L"\u03db"
+#define UNITEXT_GREEK_SMALL_LETTER_STIGMA  U"\u03db"
 #define UNICODE_GREEK_LETTER_DIGAMMA  0x03dc
-#define UNITEXT_GREEK_LETTER_DIGAMMA  L"\u03dc"
+#define UNITEXT_GREEK_LETTER_DIGAMMA  U"\u03dc"
 #define UNICODE_GREEK_SMALL_LETTER_DIGAMMA  0x03dd
-#define UNITEXT_GREEK_SMALL_LETTER_DIGAMMA  L"\u03dd"
+#define UNITEXT_GREEK_SMALL_LETTER_DIGAMMA  U"\u03dd"
 #define UNICODE_GREEK_LETTER_KOPPA  0x03de
-#define UNITEXT_GREEK_LETTER_KOPPA  L"\u03de"
+#define UNITEXT_GREEK_LETTER_KOPPA  U"\u03de"
 #define UNICODE_GREEK_SMALL_LETTER_KOPPA  0x03df
-#define UNITEXT_GREEK_SMALL_LETTER_KOPPA  L"\u03df"
+#define UNITEXT_GREEK_SMALL_LETTER_KOPPA  U"\u03df"
 #define UNICODE_GREEK_LETTER_SAMPI  0x03e0
-#define UNITEXT_GREEK_LETTER_SAMPI  L"\u03e0"
+#define UNITEXT_GREEK_LETTER_SAMPI  U"\u03e0"
 #define UNICODE_GREEK_SMALL_LETTER_SAMPI  0x03e1
-#define UNITEXT_GREEK_SMALL_LETTER_SAMPI  L"\u03e1"
+#define UNITEXT_GREEK_SMALL_LETTER_SAMPI  U"\u03e1"
 #define UNICODE_COPTIC_CAPITAL_LETTER_SHEI  0x03e2
-#define UNITEXT_COPTIC_CAPITAL_LETTER_SHEI  L"\u03e2"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_SHEI  U"\u03e2"
 #define UNICODE_COPTIC_SMALL_LETTER_SHEI  0x03e3
-#define UNITEXT_COPTIC_SMALL_LETTER_SHEI  L"\u03e3"
+#define UNITEXT_COPTIC_SMALL_LETTER_SHEI  U"\u03e3"
 #define UNICODE_COPTIC_CAPITAL_LETTER_FEI  0x03e4
-#define UNITEXT_COPTIC_CAPITAL_LETTER_FEI  L"\u03e4"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_FEI  U"\u03e4"
 #define UNICODE_COPTIC_SMALL_LETTER_FEI  0x03e5
-#define UNITEXT_COPTIC_SMALL_LETTER_FEI  L"\u03e5"
+#define UNITEXT_COPTIC_SMALL_LETTER_FEI  U"\u03e5"
 #define UNICODE_COPTIC_CAPITAL_LETTER_KHEI  0x03e6
-#define UNITEXT_COPTIC_CAPITAL_LETTER_KHEI  L"\u03e6"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_KHEI  U"\u03e6"
 #define UNICODE_COPTIC_SMALL_LETTER_KHEI  0x03e7
-#define UNITEXT_COPTIC_SMALL_LETTER_KHEI  L"\u03e7"
+#define UNITEXT_COPTIC_SMALL_LETTER_KHEI  U"\u03e7"
 #define UNICODE_COPTIC_CAPITAL_LETTER_HORI  0x03e8
-#define UNITEXT_COPTIC_CAPITAL_LETTER_HORI  L"\u03e8"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_HORI  U"\u03e8"
 #define UNICODE_COPTIC_SMALL_LETTER_HORI  0x03e9
-#define UNITEXT_COPTIC_SMALL_LETTER_HORI  L"\u03e9"
+#define UNITEXT_COPTIC_SMALL_LETTER_HORI  U"\u03e9"
 #define UNICODE_COPTIC_CAPITAL_LETTER_GANGIA  0x03ea
-#define UNITEXT_COPTIC_CAPITAL_LETTER_GANGIA  L"\u03ea"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_GANGIA  U"\u03ea"
 #define UNICODE_COPTIC_SMALL_LETTER_GANGIA  0x03eb
-#define UNITEXT_COPTIC_SMALL_LETTER_GANGIA  L"\u03eb"
+#define UNITEXT_COPTIC_SMALL_LETTER_GANGIA  U"\u03eb"
 #define UNICODE_COPTIC_CAPITAL_LETTER_SHIMA  0x03ec
-#define UNITEXT_COPTIC_CAPITAL_LETTER_SHIMA  L"\u03ec"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_SHIMA  U"\u03ec"
 #define UNICODE_COPTIC_SMALL_LETTER_SHIMA  0x03ed
-#define UNITEXT_COPTIC_SMALL_LETTER_SHIMA  L"\u03ed"
+#define UNITEXT_COPTIC_SMALL_LETTER_SHIMA  U"\u03ed"
 #define UNICODE_COPTIC_CAPITAL_LETTER_DEI  0x03ee
-#define UNITEXT_COPTIC_CAPITAL_LETTER_DEI  L"\u03ee"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_DEI  U"\u03ee"
 #define UNICODE_COPTIC_SMALL_LETTER_DEI  0x03ef
-#define UNITEXT_COPTIC_SMALL_LETTER_DEI  L"\u03ef"
+#define UNITEXT_COPTIC_SMALL_LETTER_DEI  U"\u03ef"
 #define UNICODE_GREEK_KAPPA_SYMBOL  0x03f0
-#define UNITEXT_GREEK_KAPPA_SYMBOL  L"\u03f0"
+#define UNITEXT_GREEK_KAPPA_SYMBOL  U"\u03f0"
 #define UNICODE_GREEK_RHO_SYMBOL  0x03f1
-#define UNITEXT_GREEK_RHO_SYMBOL  L"\u03f1"
+#define UNITEXT_GREEK_RHO_SYMBOL  U"\u03f1"
 #define UNICODE_GREEK_LUNATE_SIGMA_SYMBOL  0x03f2
-#define UNITEXT_GREEK_LUNATE_SIGMA_SYMBOL  L"\u03f2"
+#define UNITEXT_GREEK_LUNATE_SIGMA_SYMBOL  U"\u03f2"
 #define UNICODE_GREEK_LETTER_YOT  0x03f3
-#define UNITEXT_GREEK_LETTER_YOT  L"\u03f3"
+#define UNITEXT_GREEK_LETTER_YOT  U"\u03f3"
 #define UNICODE_GREEK_CAPITAL_THETA_SYMBOL  0x03f4
-#define UNITEXT_GREEK_CAPITAL_THETA_SYMBOL  L"\u03f4"
+#define UNITEXT_GREEK_CAPITAL_THETA_SYMBOL  U"\u03f4"
 #define UNICODE_GREEK_LUNATE_EPSILON_SYMBOL  0x03f5
-#define UNITEXT_GREEK_LUNATE_EPSILON_SYMBOL  L"\u03f5"
+#define UNITEXT_GREEK_LUNATE_EPSILON_SYMBOL  U"\u03f5"
 #define UNICODE_GREEK_REVERSED_LUNATE_EPSILON_SYMBOL  0x03f6
-#define UNITEXT_GREEK_REVERSED_LUNATE_EPSILON_SYMBOL  L"\u03f6"
+#define UNITEXT_GREEK_REVERSED_LUNATE_EPSILON_SYMBOL  U"\u03f6"
 #define UNICODE_GREEK_CAPITAL_LETTER_SHO  0x03f7
-#define UNITEXT_GREEK_CAPITAL_LETTER_SHO  L"\u03f7"
+#define UNITEXT_GREEK_CAPITAL_LETTER_SHO  U"\u03f7"
 #define UNICODE_GREEK_SMALL_LETTER_SHO  0x03f8
-#define UNITEXT_GREEK_SMALL_LETTER_SHO  L"\u03f8"
+#define UNITEXT_GREEK_SMALL_LETTER_SHO  U"\u03f8"
 #define UNICODE_GREEK_CAPITAL_LUNATE_SIGMA_SYMBOL  0x03f9
-#define UNITEXT_GREEK_CAPITAL_LUNATE_SIGMA_SYMBOL  L"\u03f9"
+#define UNITEXT_GREEK_CAPITAL_LUNATE_SIGMA_SYMBOL  U"\u03f9"
 #define UNICODE_GREEK_CAPITAL_LETTER_SAN  0x03fa
-#define UNITEXT_GREEK_CAPITAL_LETTER_SAN  L"\u03fa"
+#define UNITEXT_GREEK_CAPITAL_LETTER_SAN  U"\u03fa"
 #define UNICODE_GREEK_SMALL_LETTER_SAN  0x03fb
-#define UNITEXT_GREEK_SMALL_LETTER_SAN  L"\u03fb"
+#define UNITEXT_GREEK_SMALL_LETTER_SAN  U"\u03fb"
 #define UNICODE_GREEK_RHO_WITH_STROKE_SYMBOL  0x03fc
-#define UNITEXT_GREEK_RHO_WITH_STROKE_SYMBOL  L"\u03fc"
+#define UNITEXT_GREEK_RHO_WITH_STROKE_SYMBOL  U"\u03fc"
 #define UNICODE_GREEK_CAPITAL_REVERSED_LUNATE_SIGMA_SYMBOL  0x03fd
-#define UNITEXT_GREEK_CAPITAL_REVERSED_LUNATE_SIGMA_SYMBOL  L"\u03fd"
+#define UNITEXT_GREEK_CAPITAL_REVERSED_LUNATE_SIGMA_SYMBOL  U"\u03fd"
 #define UNICODE_GREEK_CAPITAL_DOTTED_LUNATE_SIGMA_SYMBOL  0x03fe
-#define UNITEXT_GREEK_CAPITAL_DOTTED_LUNATE_SIGMA_SYMBOL  L"\u03fe"
+#define UNITEXT_GREEK_CAPITAL_DOTTED_LUNATE_SIGMA_SYMBOL  U"\u03fe"
 #define UNICODE_GREEK_CAPITAL_REVERSED_DOTTED_LUNATE_SIGMA_SYMBOL  0x03ff
-#define UNITEXT_GREEK_CAPITAL_REVERSED_DOTTED_LUNATE_SIGMA_SYMBOL  L"\u03ff"
+#define UNITEXT_GREEK_CAPITAL_REVERSED_DOTTED_LUNATE_SIGMA_SYMBOL  U"\u03ff"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_IE_WITH_GRAVE  0x0400
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IE_WITH_GRAVE  L"\u0400"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IE_WITH_GRAVE  U"\u0400"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_IO  0x0401
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IO  L"\u0401"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IO  U"\u0401"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_DJE  0x0402
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_DJE  L"\u0402"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_DJE  U"\u0402"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_GJE  0x0403
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GJE  L"\u0403"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GJE  U"\u0403"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_UKRAINIAN_IE  0x0404
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_UKRAINIAN_IE  L"\u0404"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_UKRAINIAN_IE  U"\u0404"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_DZE  0x0405
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_DZE  L"\u0405"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_DZE  U"\u0405"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_BYELORUSSIAN_UKRAINIAN_I  0x0406
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BYELORUSSIAN_UKRAINIAN_I  L"\u0406"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BYELORUSSIAN_UKRAINIAN_I  U"\u0406"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_YI  0x0407
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YI  L"\u0407"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YI  U"\u0407"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_JE  0x0408
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_JE  L"\u0408"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_JE  U"\u0408"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_LJE  0x0409
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_LJE  L"\u0409"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_LJE  U"\u0409"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_NJE  0x040a
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_NJE  L"\u040a"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_NJE  U"\u040a"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_TSHE  0x040b
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_TSHE  L"\u040b"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_TSHE  U"\u040b"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KJE  0x040c
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KJE  L"\u040c"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KJE  U"\u040c"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_I_WITH_GRAVE  0x040d
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_I_WITH_GRAVE  L"\u040d"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_I_WITH_GRAVE  U"\u040d"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_SHORT_U  0x040e
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHORT_U  L"\u040e"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHORT_U  U"\u040e"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_DZHE  0x040f
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_DZHE  L"\u040f"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_DZHE  U"\u040f"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_A  0x0410
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_A  L"\u0410"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_A  U"\u0410"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_BE  0x0411
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BE  L"\u0411"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BE  U"\u0411"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_VE  0x0412
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_VE  L"\u0412"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_VE  U"\u0412"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_GHE  0x0413
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE  L"\u0413"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE  U"\u0413"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_DE  0x0414
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_DE  L"\u0414"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_DE  U"\u0414"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_IE  0x0415
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IE  L"\u0415"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IE  U"\u0415"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ZHE  0x0416
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZHE  L"\u0416"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZHE  U"\u0416"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ZE  0x0417
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZE  L"\u0417"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZE  U"\u0417"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_I  0x0418
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_I  L"\u0418"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_I  U"\u0418"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_SHORT_I  0x0419
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHORT_I  L"\u0419"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHORT_I  U"\u0419"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KA  0x041a
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KA  L"\u041a"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KA  U"\u041a"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_EL  0x041b
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EL  L"\u041b"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EL  U"\u041b"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_EM  0x041c
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EM  L"\u041c"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EM  U"\u041c"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_EN  0x041d
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EN  L"\u041d"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EN  U"\u041d"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_O  0x041e
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_O  L"\u041e"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_O  U"\u041e"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_PE  0x041f
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_PE  L"\u041f"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_PE  U"\u041f"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ER  0x0420
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ER  L"\u0420"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ER  U"\u0420"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ES  0x0421
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ES  L"\u0421"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ES  U"\u0421"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_TE  0x0422
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_TE  L"\u0422"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_TE  U"\u0422"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_U  0x0423
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_U  L"\u0423"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_U  U"\u0423"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_EF  0x0424
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EF  L"\u0424"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EF  U"\u0424"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_HA  0x0425
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_HA  L"\u0425"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_HA  U"\u0425"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_TSE  0x0426
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_TSE  L"\u0426"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_TSE  U"\u0426"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_CHE  0x0427
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_CHE  L"\u0427"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_CHE  U"\u0427"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_SHA  0x0428
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHA  L"\u0428"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHA  U"\u0428"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_SHCHA  0x0429
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHCHA  L"\u0429"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHCHA  U"\u0429"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_HARD_SIGN  0x042a
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_HARD_SIGN  L"\u042a"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_HARD_SIGN  U"\u042a"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_YERU  0x042b
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YERU  L"\u042b"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YERU  U"\u042b"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_SOFT_SIGN  0x042c
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SOFT_SIGN  L"\u042c"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SOFT_SIGN  U"\u042c"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_E  0x042d
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_E  L"\u042d"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_E  U"\u042d"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_YU  0x042e
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YU  L"\u042e"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YU  U"\u042e"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_YA  0x042f
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YA  L"\u042f"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YA  U"\u042f"
 #define UNICODE_CYRILLIC_SMALL_LETTER_A  0x0430
-#define UNITEXT_CYRILLIC_SMALL_LETTER_A  L"\u0430"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_A  U"\u0430"
 #define UNICODE_CYRILLIC_SMALL_LETTER_BE  0x0431
-#define UNITEXT_CYRILLIC_SMALL_LETTER_BE  L"\u0431"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_BE  U"\u0431"
 #define UNICODE_CYRILLIC_SMALL_LETTER_VE  0x0432
-#define UNITEXT_CYRILLIC_SMALL_LETTER_VE  L"\u0432"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_VE  U"\u0432"
 #define UNICODE_CYRILLIC_SMALL_LETTER_GHE  0x0433
-#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE  L"\u0433"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE  U"\u0433"
 #define UNICODE_CYRILLIC_SMALL_LETTER_DE  0x0434
-#define UNITEXT_CYRILLIC_SMALL_LETTER_DE  L"\u0434"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_DE  U"\u0434"
 #define UNICODE_CYRILLIC_SMALL_LETTER_IE  0x0435
-#define UNITEXT_CYRILLIC_SMALL_LETTER_IE  L"\u0435"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_IE  U"\u0435"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ZHE  0x0436
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ZHE  L"\u0436"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ZHE  U"\u0436"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ZE  0x0437
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ZE  L"\u0437"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ZE  U"\u0437"
 #define UNICODE_CYRILLIC_SMALL_LETTER_I  0x0438
-#define UNITEXT_CYRILLIC_SMALL_LETTER_I  L"\u0438"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_I  U"\u0438"
 #define UNICODE_CYRILLIC_SMALL_LETTER_SHORT_I  0x0439
-#define UNITEXT_CYRILLIC_SMALL_LETTER_SHORT_I  L"\u0439"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_SHORT_I  U"\u0439"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KA  0x043a
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KA  L"\u043a"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KA  U"\u043a"
 #define UNICODE_CYRILLIC_SMALL_LETTER_EL  0x043b
-#define UNITEXT_CYRILLIC_SMALL_LETTER_EL  L"\u043b"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_EL  U"\u043b"
 #define UNICODE_CYRILLIC_SMALL_LETTER_EM  0x043c
-#define UNITEXT_CYRILLIC_SMALL_LETTER_EM  L"\u043c"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_EM  U"\u043c"
 #define UNICODE_CYRILLIC_SMALL_LETTER_EN  0x043d
-#define UNITEXT_CYRILLIC_SMALL_LETTER_EN  L"\u043d"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_EN  U"\u043d"
 #define UNICODE_CYRILLIC_SMALL_LETTER_O  0x043e
-#define UNITEXT_CYRILLIC_SMALL_LETTER_O  L"\u043e"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_O  U"\u043e"
 #define UNICODE_CYRILLIC_SMALL_LETTER_PE  0x043f
-#define UNITEXT_CYRILLIC_SMALL_LETTER_PE  L"\u043f"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_PE  U"\u043f"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ER  0x0440
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ER  L"\u0440"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ER  U"\u0440"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ES  0x0441
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ES  L"\u0441"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ES  U"\u0441"
 #define UNICODE_CYRILLIC_SMALL_LETTER_TE  0x0442
-#define UNITEXT_CYRILLIC_SMALL_LETTER_TE  L"\u0442"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_TE  U"\u0442"
 #define UNICODE_CYRILLIC_SMALL_LETTER_U  0x0443
-#define UNITEXT_CYRILLIC_SMALL_LETTER_U  L"\u0443"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_U  U"\u0443"
 #define UNICODE_CYRILLIC_SMALL_LETTER_EF  0x0444
-#define UNITEXT_CYRILLIC_SMALL_LETTER_EF  L"\u0444"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_EF  U"\u0444"
 #define UNICODE_CYRILLIC_SMALL_LETTER_HA  0x0445
-#define UNITEXT_CYRILLIC_SMALL_LETTER_HA  L"\u0445"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_HA  U"\u0445"
 #define UNICODE_CYRILLIC_SMALL_LETTER_TSE  0x0446
-#define UNITEXT_CYRILLIC_SMALL_LETTER_TSE  L"\u0446"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_TSE  U"\u0446"
 #define UNICODE_CYRILLIC_SMALL_LETTER_CHE  0x0447
-#define UNITEXT_CYRILLIC_SMALL_LETTER_CHE  L"\u0447"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_CHE  U"\u0447"
 #define UNICODE_CYRILLIC_SMALL_LETTER_SHA  0x0448
-#define UNITEXT_CYRILLIC_SMALL_LETTER_SHA  L"\u0448"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_SHA  U"\u0448"
 #define UNICODE_CYRILLIC_SMALL_LETTER_SHCHA  0x0449
-#define UNITEXT_CYRILLIC_SMALL_LETTER_SHCHA  L"\u0449"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_SHCHA  U"\u0449"
 #define UNICODE_CYRILLIC_SMALL_LETTER_HARD_SIGN  0x044a
-#define UNITEXT_CYRILLIC_SMALL_LETTER_HARD_SIGN  L"\u044a"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_HARD_SIGN  U"\u044a"
 #define UNICODE_CYRILLIC_SMALL_LETTER_YERU  0x044b
-#define UNITEXT_CYRILLIC_SMALL_LETTER_YERU  L"\u044b"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_YERU  U"\u044b"
 #define UNICODE_CYRILLIC_SMALL_LETTER_SOFT_SIGN  0x044c
-#define UNITEXT_CYRILLIC_SMALL_LETTER_SOFT_SIGN  L"\u044c"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_SOFT_SIGN  U"\u044c"
 #define UNICODE_CYRILLIC_SMALL_LETTER_E  0x044d
-#define UNITEXT_CYRILLIC_SMALL_LETTER_E  L"\u044d"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_E  U"\u044d"
 #define UNICODE_CYRILLIC_SMALL_LETTER_YU  0x044e
-#define UNITEXT_CYRILLIC_SMALL_LETTER_YU  L"\u044e"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_YU  U"\u044e"
 #define UNICODE_CYRILLIC_SMALL_LETTER_YA  0x044f
-#define UNITEXT_CYRILLIC_SMALL_LETTER_YA  L"\u044f"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_YA  U"\u044f"
 #define UNICODE_CYRILLIC_SMALL_LETTER_IE_WITH_GRAVE  0x0450
-#define UNITEXT_CYRILLIC_SMALL_LETTER_IE_WITH_GRAVE  L"\u0450"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_IE_WITH_GRAVE  U"\u0450"
 #define UNICODE_CYRILLIC_SMALL_LETTER_IO  0x0451
-#define UNITEXT_CYRILLIC_SMALL_LETTER_IO  L"\u0451"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_IO  U"\u0451"
 #define UNICODE_CYRILLIC_SMALL_LETTER_DJE  0x0452
-#define UNITEXT_CYRILLIC_SMALL_LETTER_DJE  L"\u0452"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_DJE  U"\u0452"
 #define UNICODE_CYRILLIC_SMALL_LETTER_GJE  0x0453
-#define UNITEXT_CYRILLIC_SMALL_LETTER_GJE  L"\u0453"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_GJE  U"\u0453"
 #define UNICODE_CYRILLIC_SMALL_LETTER_UKRAINIAN_IE  0x0454
-#define UNITEXT_CYRILLIC_SMALL_LETTER_UKRAINIAN_IE  L"\u0454"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_UKRAINIAN_IE  U"\u0454"
 #define UNICODE_CYRILLIC_SMALL_LETTER_DZE  0x0455
-#define UNITEXT_CYRILLIC_SMALL_LETTER_DZE  L"\u0455"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_DZE  U"\u0455"
 #define UNICODE_CYRILLIC_SMALL_LETTER_BYELORUSSIAN_UKRAINIAN_I  0x0456
-#define UNITEXT_CYRILLIC_SMALL_LETTER_BYELORUSSIAN_UKRAINIAN_I  L"\u0456"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_BYELORUSSIAN_UKRAINIAN_I  U"\u0456"
 #define UNICODE_CYRILLIC_SMALL_LETTER_YI  0x0457
-#define UNITEXT_CYRILLIC_SMALL_LETTER_YI  L"\u0457"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_YI  U"\u0457"
 #define UNICODE_CYRILLIC_SMALL_LETTER_JE  0x0458
-#define UNITEXT_CYRILLIC_SMALL_LETTER_JE  L"\u0458"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_JE  U"\u0458"
 #define UNICODE_CYRILLIC_SMALL_LETTER_LJE  0x0459
-#define UNITEXT_CYRILLIC_SMALL_LETTER_LJE  L"\u0459"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_LJE  U"\u0459"
 #define UNICODE_CYRILLIC_SMALL_LETTER_NJE  0x045a
-#define UNITEXT_CYRILLIC_SMALL_LETTER_NJE  L"\u045a"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_NJE  U"\u045a"
 #define UNICODE_CYRILLIC_SMALL_LETTER_TSHE  0x045b
-#define UNITEXT_CYRILLIC_SMALL_LETTER_TSHE  L"\u045b"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_TSHE  U"\u045b"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KJE  0x045c
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KJE  L"\u045c"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KJE  U"\u045c"
 #define UNICODE_CYRILLIC_SMALL_LETTER_I_WITH_GRAVE  0x045d
-#define UNITEXT_CYRILLIC_SMALL_LETTER_I_WITH_GRAVE  L"\u045d"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_I_WITH_GRAVE  U"\u045d"
 #define UNICODE_CYRILLIC_SMALL_LETTER_SHORT_U  0x045e
-#define UNITEXT_CYRILLIC_SMALL_LETTER_SHORT_U  L"\u045e"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_SHORT_U  U"\u045e"
 #define UNICODE_CYRILLIC_SMALL_LETTER_DZHE  0x045f
-#define UNITEXT_CYRILLIC_SMALL_LETTER_DZHE  L"\u045f"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_DZHE  U"\u045f"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_OMEGA  0x0460
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_OMEGA  L"\u0460"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_OMEGA  U"\u0460"
 #define UNICODE_CYRILLIC_SMALL_LETTER_OMEGA  0x0461
-#define UNITEXT_CYRILLIC_SMALL_LETTER_OMEGA  L"\u0461"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_OMEGA  U"\u0461"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_YAT  0x0462
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YAT  L"\u0462"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YAT  U"\u0462"
 #define UNICODE_CYRILLIC_SMALL_LETTER_YAT  0x0463
-#define UNITEXT_CYRILLIC_SMALL_LETTER_YAT  L"\u0463"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_YAT  U"\u0463"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_IOTIFIED_E  0x0464
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IOTIFIED_E  L"\u0464"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IOTIFIED_E  U"\u0464"
 #define UNICODE_CYRILLIC_SMALL_LETTER_IOTIFIED_E  0x0465
-#define UNITEXT_CYRILLIC_SMALL_LETTER_IOTIFIED_E  L"\u0465"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_IOTIFIED_E  U"\u0465"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_LITTLE_YUS  0x0466
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_LITTLE_YUS  L"\u0466"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_LITTLE_YUS  U"\u0466"
 #define UNICODE_CYRILLIC_SMALL_LETTER_LITTLE_YUS  0x0467
-#define UNITEXT_CYRILLIC_SMALL_LETTER_LITTLE_YUS  L"\u0467"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_LITTLE_YUS  U"\u0467"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_IOTIFIED_LITTLE_YUS  0x0468
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IOTIFIED_LITTLE_YUS  L"\u0468"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IOTIFIED_LITTLE_YUS  U"\u0468"
 #define UNICODE_CYRILLIC_SMALL_LETTER_IOTIFIED_LITTLE_YUS  0x0469
-#define UNITEXT_CYRILLIC_SMALL_LETTER_IOTIFIED_LITTLE_YUS  L"\u0469"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_IOTIFIED_LITTLE_YUS  U"\u0469"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_BIG_YUS  0x046a
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BIG_YUS  L"\u046a"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BIG_YUS  U"\u046a"
 #define UNICODE_CYRILLIC_SMALL_LETTER_BIG_YUS  0x046b
-#define UNITEXT_CYRILLIC_SMALL_LETTER_BIG_YUS  L"\u046b"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_BIG_YUS  U"\u046b"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_IOTIFIED_BIG_YUS  0x046c
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IOTIFIED_BIG_YUS  L"\u046c"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IOTIFIED_BIG_YUS  U"\u046c"
 #define UNICODE_CYRILLIC_SMALL_LETTER_IOTIFIED_BIG_YUS  0x046d
-#define UNITEXT_CYRILLIC_SMALL_LETTER_IOTIFIED_BIG_YUS  L"\u046d"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_IOTIFIED_BIG_YUS  U"\u046d"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KSI  0x046e
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KSI  L"\u046e"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KSI  U"\u046e"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KSI  0x046f
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KSI  L"\u046f"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KSI  U"\u046f"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_PSI  0x0470
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_PSI  L"\u0470"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_PSI  U"\u0470"
 #define UNICODE_CYRILLIC_SMALL_LETTER_PSI  0x0471
-#define UNITEXT_CYRILLIC_SMALL_LETTER_PSI  L"\u0471"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_PSI  U"\u0471"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_FITA  0x0472
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_FITA  L"\u0472"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_FITA  U"\u0472"
 #define UNICODE_CYRILLIC_SMALL_LETTER_FITA  0x0473
-#define UNITEXT_CYRILLIC_SMALL_LETTER_FITA  L"\u0473"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_FITA  U"\u0473"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_IZHITSA  0x0474
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IZHITSA  L"\u0474"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IZHITSA  U"\u0474"
 #define UNICODE_CYRILLIC_SMALL_LETTER_IZHITSA  0x0475
-#define UNITEXT_CYRILLIC_SMALL_LETTER_IZHITSA  L"\u0475"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_IZHITSA  U"\u0475"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_IZHITSA_WITH_DOUBLE_GRAVE_ACCENT  0x0476
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IZHITSA_WITH_DOUBLE_GRAVE_ACCENT  L"\u0476"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IZHITSA_WITH_DOUBLE_GRAVE_ACCENT  U"\u0476"
 #define UNICODE_CYRILLIC_SMALL_LETTER_IZHITSA_WITH_DOUBLE_GRAVE_ACCENT  0x0477
-#define UNITEXT_CYRILLIC_SMALL_LETTER_IZHITSA_WITH_DOUBLE_GRAVE_ACCENT  L"\u0477"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_IZHITSA_WITH_DOUBLE_GRAVE_ACCENT  U"\u0477"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_UK  0x0478
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_UK  L"\u0478"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_UK  U"\u0478"
 #define UNICODE_CYRILLIC_SMALL_LETTER_UK  0x0479
-#define UNITEXT_CYRILLIC_SMALL_LETTER_UK  L"\u0479"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_UK  U"\u0479"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ROUND_OMEGA  0x047a
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ROUND_OMEGA  L"\u047a"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ROUND_OMEGA  U"\u047a"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ROUND_OMEGA  0x047b
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ROUND_OMEGA  L"\u047b"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ROUND_OMEGA  U"\u047b"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_OMEGA_WITH_TITLO  0x047c
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_OMEGA_WITH_TITLO  L"\u047c"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_OMEGA_WITH_TITLO  U"\u047c"
 #define UNICODE_CYRILLIC_SMALL_LETTER_OMEGA_WITH_TITLO  0x047d
-#define UNITEXT_CYRILLIC_SMALL_LETTER_OMEGA_WITH_TITLO  L"\u047d"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_OMEGA_WITH_TITLO  U"\u047d"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_OT  0x047e
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_OT  L"\u047e"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_OT  U"\u047e"
 #define UNICODE_CYRILLIC_SMALL_LETTER_OT  0x047f
-#define UNITEXT_CYRILLIC_SMALL_LETTER_OT  L"\u047f"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_OT  U"\u047f"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KOPPA  0x0480
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOPPA  L"\u0480"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOPPA  U"\u0480"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KOPPA  0x0481
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KOPPA  L"\u0481"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KOPPA  U"\u0481"
 #define UNICODE_CYRILLIC_THOUSANDS_SIGN  0x0482
-#define UNITEXT_CYRILLIC_THOUSANDS_SIGN  L"\u0482"
+#define UNITEXT_CYRILLIC_THOUSANDS_SIGN  U"\u0482"
 #define UNICODE_COMBINING_CYRILLIC_TITLO  0x0483
-#define UNITEXT_COMBINING_CYRILLIC_TITLO  L"\u0483"
+#define UNITEXT_COMBINING_CYRILLIC_TITLO  U"\u0483"
 #define UNICODE_COMBINING_CYRILLIC_PALATALIZATION  0x0484
-#define UNITEXT_COMBINING_CYRILLIC_PALATALIZATION  L"\u0484"
+#define UNITEXT_COMBINING_CYRILLIC_PALATALIZATION  U"\u0484"
 #define UNICODE_COMBINING_CYRILLIC_DASIA_PNEUMATA  0x0485
-#define UNITEXT_COMBINING_CYRILLIC_DASIA_PNEUMATA  L"\u0485"
+#define UNITEXT_COMBINING_CYRILLIC_DASIA_PNEUMATA  U"\u0485"
 #define UNICODE_COMBINING_CYRILLIC_PSILI_PNEUMATA  0x0486
-#define UNITEXT_COMBINING_CYRILLIC_PSILI_PNEUMATA  L"\u0486"
+#define UNITEXT_COMBINING_CYRILLIC_PSILI_PNEUMATA  U"\u0486"
 #define UNICODE_COMBINING_CYRILLIC_HUNDRED_THOUSANDS_SIGN  0x0488
-#define UNITEXT_COMBINING_CYRILLIC_HUNDRED_THOUSANDS_SIGN  L"\u0488"
+#define UNITEXT_COMBINING_CYRILLIC_HUNDRED_THOUSANDS_SIGN  U"\u0488"
 #define UNICODE_COMBINING_CYRILLIC_MILLIONS_SIGN  0x0489
-#define UNITEXT_COMBINING_CYRILLIC_MILLIONS_SIGN  L"\u0489"
+#define UNITEXT_COMBINING_CYRILLIC_MILLIONS_SIGN  U"\u0489"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_SHORT_I_WITH_TAIL  0x048a
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHORT_I_WITH_TAIL  L"\u048a"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHORT_I_WITH_TAIL  U"\u048a"
 #define UNICODE_CYRILLIC_SMALL_LETTER_SHORT_I_WITH_TAIL  0x048b
-#define UNITEXT_CYRILLIC_SMALL_LETTER_SHORT_I_WITH_TAIL  L"\u048b"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_SHORT_I_WITH_TAIL  U"\u048b"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_SEMISOFT_SIGN  0x048c
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SEMISOFT_SIGN  L"\u048c"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SEMISOFT_SIGN  U"\u048c"
 #define UNICODE_CYRILLIC_SMALL_LETTER_SEMISOFT_SIGN  0x048d
-#define UNITEXT_CYRILLIC_SMALL_LETTER_SEMISOFT_SIGN  L"\u048d"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_SEMISOFT_SIGN  U"\u048d"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ER_WITH_TICK  0x048e
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ER_WITH_TICK  L"\u048e"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ER_WITH_TICK  U"\u048e"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ER_WITH_TICK  0x048f
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ER_WITH_TICK  L"\u048f"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ER_WITH_TICK  U"\u048f"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_GHE_WITH_UPTURN  0x0490
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE_WITH_UPTURN  L"\u0490"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE_WITH_UPTURN  U"\u0490"
 #define UNICODE_CYRILLIC_SMALL_LETTER_GHE_WITH_UPTURN  0x0491
-#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE_WITH_UPTURN  L"\u0491"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE_WITH_UPTURN  U"\u0491"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_GHE_WITH_STROKE  0x0492
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE_WITH_STROKE  L"\u0492"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE_WITH_STROKE  U"\u0492"
 #define UNICODE_CYRILLIC_SMALL_LETTER_GHE_WITH_STROKE  0x0493
-#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE_WITH_STROKE  L"\u0493"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE_WITH_STROKE  U"\u0493"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_GHE_WITH_MIDDLE_HOOK  0x0494
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE_WITH_MIDDLE_HOOK  L"\u0494"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE_WITH_MIDDLE_HOOK  U"\u0494"
 #define UNICODE_CYRILLIC_SMALL_LETTER_GHE_WITH_MIDDLE_HOOK  0x0495
-#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE_WITH_MIDDLE_HOOK  L"\u0495"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE_WITH_MIDDLE_HOOK  U"\u0495"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ZHE_WITH_DESCENDER  0x0496
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZHE_WITH_DESCENDER  L"\u0496"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZHE_WITH_DESCENDER  U"\u0496"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ZHE_WITH_DESCENDER  0x0497
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ZHE_WITH_DESCENDER  L"\u0497"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ZHE_WITH_DESCENDER  U"\u0497"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ZE_WITH_DESCENDER  0x0498
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZE_WITH_DESCENDER  L"\u0498"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZE_WITH_DESCENDER  U"\u0498"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ZE_WITH_DESCENDER  0x0499
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ZE_WITH_DESCENDER  L"\u0499"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ZE_WITH_DESCENDER  U"\u0499"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KA_WITH_DESCENDER  0x049a
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KA_WITH_DESCENDER  L"\u049a"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KA_WITH_DESCENDER  U"\u049a"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KA_WITH_DESCENDER  0x049b
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KA_WITH_DESCENDER  L"\u049b"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KA_WITH_DESCENDER  U"\u049b"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KA_WITH_VERTICAL_STROKE  0x049c
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KA_WITH_VERTICAL_STROKE  L"\u049c"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KA_WITH_VERTICAL_STROKE  U"\u049c"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KA_WITH_VERTICAL_STROKE  0x049d
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KA_WITH_VERTICAL_STROKE  L"\u049d"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KA_WITH_VERTICAL_STROKE  U"\u049d"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KA_WITH_STROKE  0x049e
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KA_WITH_STROKE  L"\u049e"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KA_WITH_STROKE  U"\u049e"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KA_WITH_STROKE  0x049f
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KA_WITH_STROKE  L"\u049f"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KA_WITH_STROKE  U"\u049f"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_BASHKIR_KA  0x04a0
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BASHKIR_KA  L"\u04a0"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BASHKIR_KA  U"\u04a0"
 #define UNICODE_CYRILLIC_SMALL_LETTER_BASHKIR_KA  0x04a1
-#define UNITEXT_CYRILLIC_SMALL_LETTER_BASHKIR_KA  L"\u04a1"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_BASHKIR_KA  U"\u04a1"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_EN_WITH_DESCENDER  0x04a2
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EN_WITH_DESCENDER  L"\u04a2"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EN_WITH_DESCENDER  U"\u04a2"
 #define UNICODE_CYRILLIC_SMALL_LETTER_EN_WITH_DESCENDER  0x04a3
-#define UNITEXT_CYRILLIC_SMALL_LETTER_EN_WITH_DESCENDER  L"\u04a3"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_EN_WITH_DESCENDER  U"\u04a3"
 #define UNICODE_CYRILLIC_CAPITAL_LIGATURE_EN_GHE  0x04a4
-#define UNITEXT_CYRILLIC_CAPITAL_LIGATURE_EN_GHE  L"\u04a4"
+#define UNITEXT_CYRILLIC_CAPITAL_LIGATURE_EN_GHE  U"\u04a4"
 #define UNICODE_CYRILLIC_SMALL_LIGATURE_EN_GHE  0x04a5
-#define UNITEXT_CYRILLIC_SMALL_LIGATURE_EN_GHE  L"\u04a5"
+#define UNITEXT_CYRILLIC_SMALL_LIGATURE_EN_GHE  U"\u04a5"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_PE_WITH_MIDDLE_HOOK  0x04a6
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_PE_WITH_MIDDLE_HOOK  L"\u04a6"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_PE_WITH_MIDDLE_HOOK  U"\u04a6"
 #define UNICODE_CYRILLIC_SMALL_LETTER_PE_WITH_MIDDLE_HOOK  0x04a7
-#define UNITEXT_CYRILLIC_SMALL_LETTER_PE_WITH_MIDDLE_HOOK  L"\u04a7"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_PE_WITH_MIDDLE_HOOK  U"\u04a7"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_HA  0x04a8
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_HA  L"\u04a8"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_HA  U"\u04a8"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ABKHASIAN_HA  0x04a9
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ABKHASIAN_HA  L"\u04a9"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ABKHASIAN_HA  U"\u04a9"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ES_WITH_DESCENDER  0x04aa
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ES_WITH_DESCENDER  L"\u04aa"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ES_WITH_DESCENDER  U"\u04aa"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ES_WITH_DESCENDER  0x04ab
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ES_WITH_DESCENDER  L"\u04ab"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ES_WITH_DESCENDER  U"\u04ab"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_TE_WITH_DESCENDER  0x04ac
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_TE_WITH_DESCENDER  L"\u04ac"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_TE_WITH_DESCENDER  U"\u04ac"
 #define UNICODE_CYRILLIC_SMALL_LETTER_TE_WITH_DESCENDER  0x04ad
-#define UNITEXT_CYRILLIC_SMALL_LETTER_TE_WITH_DESCENDER  L"\u04ad"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_TE_WITH_DESCENDER  U"\u04ad"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_STRAIGHT_U  0x04ae
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_STRAIGHT_U  L"\u04ae"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_STRAIGHT_U  U"\u04ae"
 #define UNICODE_CYRILLIC_SMALL_LETTER_STRAIGHT_U  0x04af
-#define UNITEXT_CYRILLIC_SMALL_LETTER_STRAIGHT_U  L"\u04af"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_STRAIGHT_U  U"\u04af"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_STRAIGHT_U_WITH_STROKE  0x04b0
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_STRAIGHT_U_WITH_STROKE  L"\u04b0"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_STRAIGHT_U_WITH_STROKE  U"\u04b0"
 #define UNICODE_CYRILLIC_SMALL_LETTER_STRAIGHT_U_WITH_STROKE  0x04b1
-#define UNITEXT_CYRILLIC_SMALL_LETTER_STRAIGHT_U_WITH_STROKE  L"\u04b1"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_STRAIGHT_U_WITH_STROKE  U"\u04b1"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_HA_WITH_DESCENDER  0x04b2
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_HA_WITH_DESCENDER  L"\u04b2"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_HA_WITH_DESCENDER  U"\u04b2"
 #define UNICODE_CYRILLIC_SMALL_LETTER_HA_WITH_DESCENDER  0x04b3
-#define UNITEXT_CYRILLIC_SMALL_LETTER_HA_WITH_DESCENDER  L"\u04b3"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_HA_WITH_DESCENDER  U"\u04b3"
 #define UNICODE_CYRILLIC_CAPITAL_LIGATURE_TE_TSE  0x04b4
-#define UNITEXT_CYRILLIC_CAPITAL_LIGATURE_TE_TSE  L"\u04b4"
+#define UNITEXT_CYRILLIC_CAPITAL_LIGATURE_TE_TSE  U"\u04b4"
 #define UNICODE_CYRILLIC_SMALL_LIGATURE_TE_TSE  0x04b5
-#define UNITEXT_CYRILLIC_SMALL_LIGATURE_TE_TSE  L"\u04b5"
+#define UNITEXT_CYRILLIC_SMALL_LIGATURE_TE_TSE  U"\u04b5"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_CHE_WITH_DESCENDER  0x04b6
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_CHE_WITH_DESCENDER  L"\u04b6"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_CHE_WITH_DESCENDER  U"\u04b6"
 #define UNICODE_CYRILLIC_SMALL_LETTER_CHE_WITH_DESCENDER  0x04b7
-#define UNITEXT_CYRILLIC_SMALL_LETTER_CHE_WITH_DESCENDER  L"\u04b7"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_CHE_WITH_DESCENDER  U"\u04b7"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_CHE_WITH_VERTICAL_STROKE  0x04b8
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_CHE_WITH_VERTICAL_STROKE  L"\u04b8"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_CHE_WITH_VERTICAL_STROKE  U"\u04b8"
 #define UNICODE_CYRILLIC_SMALL_LETTER_CHE_WITH_VERTICAL_STROKE  0x04b9
-#define UNITEXT_CYRILLIC_SMALL_LETTER_CHE_WITH_VERTICAL_STROKE  L"\u04b9"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_CHE_WITH_VERTICAL_STROKE  U"\u04b9"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_SHHA  0x04ba
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHHA  L"\u04ba"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SHHA  U"\u04ba"
 #define UNICODE_CYRILLIC_SMALL_LETTER_SHHA  0x04bb
-#define UNITEXT_CYRILLIC_SMALL_LETTER_SHHA  L"\u04bb"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_SHHA  U"\u04bb"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_CHE  0x04bc
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_CHE  L"\u04bc"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_CHE  U"\u04bc"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ABKHASIAN_CHE  0x04bd
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ABKHASIAN_CHE  L"\u04bd"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ABKHASIAN_CHE  U"\u04bd"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_CHE_WITH_DESCENDER  0x04be
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_CHE_WITH_DESCENDER  L"\u04be"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_CHE_WITH_DESCENDER  U"\u04be"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ABKHASIAN_CHE_WITH_DESCENDER  0x04bf
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ABKHASIAN_CHE_WITH_DESCENDER  L"\u04bf"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ABKHASIAN_CHE_WITH_DESCENDER  U"\u04bf"
 #define UNICODE_CYRILLIC_LETTER_PALOCHKA  0x04c0
-#define UNITEXT_CYRILLIC_LETTER_PALOCHKA  L"\u04c0"
+#define UNITEXT_CYRILLIC_LETTER_PALOCHKA  U"\u04c0"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ZHE_WITH_BREVE  0x04c1
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZHE_WITH_BREVE  L"\u04c1"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZHE_WITH_BREVE  U"\u04c1"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ZHE_WITH_BREVE  0x04c2
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ZHE_WITH_BREVE  L"\u04c2"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ZHE_WITH_BREVE  U"\u04c2"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KA_WITH_HOOK  0x04c3
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KA_WITH_HOOK  L"\u04c3"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KA_WITH_HOOK  U"\u04c3"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KA_WITH_HOOK  0x04c4
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KA_WITH_HOOK  L"\u04c4"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KA_WITH_HOOK  U"\u04c4"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_EL_WITH_TAIL  0x04c5
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EL_WITH_TAIL  L"\u04c5"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EL_WITH_TAIL  U"\u04c5"
 #define UNICODE_CYRILLIC_SMALL_LETTER_EL_WITH_TAIL  0x04c6
-#define UNITEXT_CYRILLIC_SMALL_LETTER_EL_WITH_TAIL  L"\u04c6"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_EL_WITH_TAIL  U"\u04c6"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_EN_WITH_HOOK  0x04c7
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EN_WITH_HOOK  L"\u04c7"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EN_WITH_HOOK  U"\u04c7"
 #define UNICODE_CYRILLIC_SMALL_LETTER_EN_WITH_HOOK  0x04c8
-#define UNITEXT_CYRILLIC_SMALL_LETTER_EN_WITH_HOOK  L"\u04c8"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_EN_WITH_HOOK  U"\u04c8"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_EN_WITH_TAIL  0x04c9
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EN_WITH_TAIL  L"\u04c9"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EN_WITH_TAIL  U"\u04c9"
 #define UNICODE_CYRILLIC_SMALL_LETTER_EN_WITH_TAIL  0x04ca
-#define UNITEXT_CYRILLIC_SMALL_LETTER_EN_WITH_TAIL  L"\u04ca"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_EN_WITH_TAIL  U"\u04ca"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KHAKASSIAN_CHE  0x04cb
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KHAKASSIAN_CHE  L"\u04cb"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KHAKASSIAN_CHE  U"\u04cb"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KHAKASSIAN_CHE  0x04cc
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KHAKASSIAN_CHE  L"\u04cc"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KHAKASSIAN_CHE  U"\u04cc"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_EM_WITH_TAIL  0x04cd
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EM_WITH_TAIL  L"\u04cd"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EM_WITH_TAIL  U"\u04cd"
 #define UNICODE_CYRILLIC_SMALL_LETTER_EM_WITH_TAIL  0x04ce
-#define UNITEXT_CYRILLIC_SMALL_LETTER_EM_WITH_TAIL  L"\u04ce"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_EM_WITH_TAIL  U"\u04ce"
 #define UNICODE_CYRILLIC_SMALL_LETTER_PALOCHKA  0x04cf
-#define UNITEXT_CYRILLIC_SMALL_LETTER_PALOCHKA  L"\u04cf"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_PALOCHKA  U"\u04cf"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_A_WITH_BREVE  0x04d0
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_A_WITH_BREVE  L"\u04d0"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_A_WITH_BREVE  U"\u04d0"
 #define UNICODE_CYRILLIC_SMALL_LETTER_A_WITH_BREVE  0x04d1
-#define UNITEXT_CYRILLIC_SMALL_LETTER_A_WITH_BREVE  L"\u04d1"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_A_WITH_BREVE  U"\u04d1"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_A_WITH_DIAERESIS  0x04d2
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_A_WITH_DIAERESIS  L"\u04d2"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_A_WITH_DIAERESIS  U"\u04d2"
 #define UNICODE_CYRILLIC_SMALL_LETTER_A_WITH_DIAERESIS  0x04d3
-#define UNITEXT_CYRILLIC_SMALL_LETTER_A_WITH_DIAERESIS  L"\u04d3"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_A_WITH_DIAERESIS  U"\u04d3"
 #define UNICODE_CYRILLIC_CAPITAL_LIGATURE_A_IE  0x04d4
-#define UNITEXT_CYRILLIC_CAPITAL_LIGATURE_A_IE  L"\u04d4"
+#define UNITEXT_CYRILLIC_CAPITAL_LIGATURE_A_IE  U"\u04d4"
 #define UNICODE_CYRILLIC_SMALL_LIGATURE_A_IE  0x04d5
-#define UNITEXT_CYRILLIC_SMALL_LIGATURE_A_IE  L"\u04d5"
+#define UNITEXT_CYRILLIC_SMALL_LIGATURE_A_IE  U"\u04d5"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_IE_WITH_BREVE  0x04d6
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IE_WITH_BREVE  L"\u04d6"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_IE_WITH_BREVE  U"\u04d6"
 #define UNICODE_CYRILLIC_SMALL_LETTER_IE_WITH_BREVE  0x04d7
-#define UNITEXT_CYRILLIC_SMALL_LETTER_IE_WITH_BREVE  L"\u04d7"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_IE_WITH_BREVE  U"\u04d7"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_SCHWA  0x04d8
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SCHWA  L"\u04d8"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SCHWA  U"\u04d8"
 #define UNICODE_CYRILLIC_SMALL_LETTER_SCHWA  0x04d9
-#define UNITEXT_CYRILLIC_SMALL_LETTER_SCHWA  L"\u04d9"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_SCHWA  U"\u04d9"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_SCHWA_WITH_DIAERESIS  0x04da
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SCHWA_WITH_DIAERESIS  L"\u04da"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_SCHWA_WITH_DIAERESIS  U"\u04da"
 #define UNICODE_CYRILLIC_SMALL_LETTER_SCHWA_WITH_DIAERESIS  0x04db
-#define UNITEXT_CYRILLIC_SMALL_LETTER_SCHWA_WITH_DIAERESIS  L"\u04db"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_SCHWA_WITH_DIAERESIS  U"\u04db"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ZHE_WITH_DIAERESIS  0x04dc
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZHE_WITH_DIAERESIS  L"\u04dc"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZHE_WITH_DIAERESIS  U"\u04dc"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ZHE_WITH_DIAERESIS  0x04dd
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ZHE_WITH_DIAERESIS  L"\u04dd"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ZHE_WITH_DIAERESIS  U"\u04dd"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ZE_WITH_DIAERESIS  0x04de
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZE_WITH_DIAERESIS  L"\u04de"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ZE_WITH_DIAERESIS  U"\u04de"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ZE_WITH_DIAERESIS  0x04df
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ZE_WITH_DIAERESIS  L"\u04df"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ZE_WITH_DIAERESIS  U"\u04df"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_DZE  0x04e0
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_DZE  L"\u04e0"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_ABKHASIAN_DZE  U"\u04e0"
 #define UNICODE_CYRILLIC_SMALL_LETTER_ABKHASIAN_DZE  0x04e1
-#define UNITEXT_CYRILLIC_SMALL_LETTER_ABKHASIAN_DZE  L"\u04e1"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_ABKHASIAN_DZE  U"\u04e1"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_I_WITH_MACRON  0x04e2
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_I_WITH_MACRON  L"\u04e2"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_I_WITH_MACRON  U"\u04e2"
 #define UNICODE_CYRILLIC_SMALL_LETTER_I_WITH_MACRON  0x04e3
-#define UNITEXT_CYRILLIC_SMALL_LETTER_I_WITH_MACRON  L"\u04e3"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_I_WITH_MACRON  U"\u04e3"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_I_WITH_DIAERESIS  0x04e4
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_I_WITH_DIAERESIS  L"\u04e4"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_I_WITH_DIAERESIS  U"\u04e4"
 #define UNICODE_CYRILLIC_SMALL_LETTER_I_WITH_DIAERESIS  0x04e5
-#define UNITEXT_CYRILLIC_SMALL_LETTER_I_WITH_DIAERESIS  L"\u04e5"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_I_WITH_DIAERESIS  U"\u04e5"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_O_WITH_DIAERESIS  0x04e6
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_O_WITH_DIAERESIS  L"\u04e6"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_O_WITH_DIAERESIS  U"\u04e6"
 #define UNICODE_CYRILLIC_SMALL_LETTER_O_WITH_DIAERESIS  0x04e7
-#define UNITEXT_CYRILLIC_SMALL_LETTER_O_WITH_DIAERESIS  L"\u04e7"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_O_WITH_DIAERESIS  U"\u04e7"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_BARRED_O  0x04e8
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BARRED_O  L"\u04e8"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BARRED_O  U"\u04e8"
 #define UNICODE_CYRILLIC_SMALL_LETTER_BARRED_O  0x04e9
-#define UNITEXT_CYRILLIC_SMALL_LETTER_BARRED_O  L"\u04e9"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_BARRED_O  U"\u04e9"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_BARRED_O_WITH_DIAERESIS  0x04ea
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BARRED_O_WITH_DIAERESIS  L"\u04ea"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_BARRED_O_WITH_DIAERESIS  U"\u04ea"
 #define UNICODE_CYRILLIC_SMALL_LETTER_BARRED_O_WITH_DIAERESIS  0x04eb
-#define UNITEXT_CYRILLIC_SMALL_LETTER_BARRED_O_WITH_DIAERESIS  L"\u04eb"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_BARRED_O_WITH_DIAERESIS  U"\u04eb"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_E_WITH_DIAERESIS  0x04ec
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_E_WITH_DIAERESIS  L"\u04ec"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_E_WITH_DIAERESIS  U"\u04ec"
 #define UNICODE_CYRILLIC_SMALL_LETTER_E_WITH_DIAERESIS  0x04ed
-#define UNITEXT_CYRILLIC_SMALL_LETTER_E_WITH_DIAERESIS  L"\u04ed"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_E_WITH_DIAERESIS  U"\u04ed"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_U_WITH_MACRON  0x04ee
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_U_WITH_MACRON  L"\u04ee"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_U_WITH_MACRON  U"\u04ee"
 #define UNICODE_CYRILLIC_SMALL_LETTER_U_WITH_MACRON  0x04ef
-#define UNITEXT_CYRILLIC_SMALL_LETTER_U_WITH_MACRON  L"\u04ef"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_U_WITH_MACRON  U"\u04ef"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_U_WITH_DIAERESIS  0x04f0
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_U_WITH_DIAERESIS  L"\u04f0"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_U_WITH_DIAERESIS  U"\u04f0"
 #define UNICODE_CYRILLIC_SMALL_LETTER_U_WITH_DIAERESIS  0x04f1
-#define UNITEXT_CYRILLIC_SMALL_LETTER_U_WITH_DIAERESIS  L"\u04f1"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_U_WITH_DIAERESIS  U"\u04f1"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE  0x04f2
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE  L"\u04f2"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_U_WITH_DOUBLE_ACUTE  U"\u04f2"
 #define UNICODE_CYRILLIC_SMALL_LETTER_U_WITH_DOUBLE_ACUTE  0x04f3
-#define UNITEXT_CYRILLIC_SMALL_LETTER_U_WITH_DOUBLE_ACUTE  L"\u04f3"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_U_WITH_DOUBLE_ACUTE  U"\u04f3"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_CHE_WITH_DIAERESIS  0x04f4
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_CHE_WITH_DIAERESIS  L"\u04f4"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_CHE_WITH_DIAERESIS  U"\u04f4"
 #define UNICODE_CYRILLIC_SMALL_LETTER_CHE_WITH_DIAERESIS  0x04f5
-#define UNITEXT_CYRILLIC_SMALL_LETTER_CHE_WITH_DIAERESIS  L"\u04f5"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_CHE_WITH_DIAERESIS  U"\u04f5"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_GHE_WITH_DESCENDER  0x04f6
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE_WITH_DESCENDER  L"\u04f6"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE_WITH_DESCENDER  U"\u04f6"
 #define UNICODE_CYRILLIC_SMALL_LETTER_GHE_WITH_DESCENDER  0x04f7
-#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE_WITH_DESCENDER  L"\u04f7"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE_WITH_DESCENDER  U"\u04f7"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_YERU_WITH_DIAERESIS  0x04f8
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YERU_WITH_DIAERESIS  L"\u04f8"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_YERU_WITH_DIAERESIS  U"\u04f8"
 #define UNICODE_CYRILLIC_SMALL_LETTER_YERU_WITH_DIAERESIS  0x04f9
-#define UNITEXT_CYRILLIC_SMALL_LETTER_YERU_WITH_DIAERESIS  L"\u04f9"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_YERU_WITH_DIAERESIS  U"\u04f9"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_GHE_WITH_STROKE_AND_HOOK  0x04fa
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE_WITH_STROKE_AND_HOOK  L"\u04fa"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_GHE_WITH_STROKE_AND_HOOK  U"\u04fa"
 #define UNICODE_CYRILLIC_SMALL_LETTER_GHE_WITH_STROKE_AND_HOOK  0x04fb
-#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE_WITH_STROKE_AND_HOOK  L"\u04fb"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_GHE_WITH_STROKE_AND_HOOK  U"\u04fb"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_HA_WITH_HOOK  0x04fc
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_HA_WITH_HOOK  L"\u04fc"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_HA_WITH_HOOK  U"\u04fc"
 #define UNICODE_CYRILLIC_SMALL_LETTER_HA_WITH_HOOK  0x04fd
-#define UNITEXT_CYRILLIC_SMALL_LETTER_HA_WITH_HOOK  L"\u04fd"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_HA_WITH_HOOK  U"\u04fd"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_HA_WITH_STROKE  0x04fe
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_HA_WITH_STROKE  L"\u04fe"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_HA_WITH_STROKE  U"\u04fe"
 #define UNICODE_CYRILLIC_SMALL_LETTER_HA_WITH_STROKE  0x04ff
-#define UNITEXT_CYRILLIC_SMALL_LETTER_HA_WITH_STROKE  L"\u04ff"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_HA_WITH_STROKE  U"\u04ff"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KOMI_DE  0x0500
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_DE  L"\u0500"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_DE  U"\u0500"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KOMI_DE  0x0501
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_DE  L"\u0501"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_DE  U"\u0501"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KOMI_DJE  0x0502
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_DJE  L"\u0502"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_DJE  U"\u0502"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KOMI_DJE  0x0503
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_DJE  L"\u0503"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_DJE  U"\u0503"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KOMI_ZJE  0x0504
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_ZJE  L"\u0504"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_ZJE  U"\u0504"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KOMI_ZJE  0x0505
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_ZJE  L"\u0505"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_ZJE  U"\u0505"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KOMI_DZJE  0x0506
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_DZJE  L"\u0506"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_DZJE  U"\u0506"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KOMI_DZJE  0x0507
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_DZJE  L"\u0507"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_DZJE  U"\u0507"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KOMI_LJE  0x0508
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_LJE  L"\u0508"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_LJE  U"\u0508"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KOMI_LJE  0x0509
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_LJE  L"\u0509"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_LJE  U"\u0509"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KOMI_NJE  0x050a
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_NJE  L"\u050a"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_NJE  U"\u050a"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KOMI_NJE  0x050b
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_NJE  L"\u050b"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_NJE  U"\u050b"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KOMI_SJE  0x050c
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_SJE  L"\u050c"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_SJE  U"\u050c"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KOMI_SJE  0x050d
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_SJE  L"\u050d"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_SJE  U"\u050d"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_KOMI_TJE  0x050e
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_TJE  L"\u050e"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_KOMI_TJE  U"\u050e"
 #define UNICODE_CYRILLIC_SMALL_LETTER_KOMI_TJE  0x050f
-#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_TJE  L"\u050f"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_KOMI_TJE  U"\u050f"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_REVERSED_ZE  0x0510
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_REVERSED_ZE  L"\u0510"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_REVERSED_ZE  U"\u0510"
 #define UNICODE_CYRILLIC_SMALL_LETTER_REVERSED_ZE  0x0511
-#define UNITEXT_CYRILLIC_SMALL_LETTER_REVERSED_ZE  L"\u0511"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_REVERSED_ZE  U"\u0511"
 #define UNICODE_CYRILLIC_CAPITAL_LETTER_EL_WITH_HOOK  0x0512
-#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EL_WITH_HOOK  L"\u0512"
+#define UNITEXT_CYRILLIC_CAPITAL_LETTER_EL_WITH_HOOK  U"\u0512"
 #define UNICODE_CYRILLIC_SMALL_LETTER_EL_WITH_HOOK  0x0513
-#define UNITEXT_CYRILLIC_SMALL_LETTER_EL_WITH_HOOK  L"\u0513"
+#define UNITEXT_CYRILLIC_SMALL_LETTER_EL_WITH_HOOK  U"\u0513"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_AYB  0x0531
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_AYB  L"\u0531"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_AYB  U"\u0531"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_BEN  0x0532
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_BEN  L"\u0532"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_BEN  U"\u0532"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_GIM  0x0533
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_GIM  L"\u0533"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_GIM  U"\u0533"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_DA  0x0534
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_DA  L"\u0534"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_DA  U"\u0534"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_ECH  0x0535
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_ECH  L"\u0535"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_ECH  U"\u0535"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_ZA  0x0536
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_ZA  L"\u0536"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_ZA  U"\u0536"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_EH  0x0537
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_EH  L"\u0537"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_EH  U"\u0537"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_ET  0x0538
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_ET  L"\u0538"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_ET  U"\u0538"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_TO  0x0539
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_TO  L"\u0539"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_TO  U"\u0539"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_ZHE  0x053a
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_ZHE  L"\u053a"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_ZHE  U"\u053a"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_INI  0x053b
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_INI  L"\u053b"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_INI  U"\u053b"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_LIWN  0x053c
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_LIWN  L"\u053c"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_LIWN  U"\u053c"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_XEH  0x053d
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_XEH  L"\u053d"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_XEH  U"\u053d"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_CA  0x053e
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_CA  L"\u053e"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_CA  U"\u053e"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_KEN  0x053f
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_KEN  L"\u053f"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_KEN  U"\u053f"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_HO  0x0540
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_HO  L"\u0540"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_HO  U"\u0540"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_JA  0x0541
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_JA  L"\u0541"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_JA  U"\u0541"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_GHAD  0x0542
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_GHAD  L"\u0542"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_GHAD  U"\u0542"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_CHEH  0x0543
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_CHEH  L"\u0543"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_CHEH  U"\u0543"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_MEN  0x0544
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_MEN  L"\u0544"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_MEN  U"\u0544"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_YI  0x0545
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_YI  L"\u0545"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_YI  U"\u0545"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_NOW  0x0546
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_NOW  L"\u0546"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_NOW  U"\u0546"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_SHA  0x0547
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_SHA  L"\u0547"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_SHA  U"\u0547"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_VO  0x0548
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_VO  L"\u0548"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_VO  U"\u0548"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_CHA  0x0549
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_CHA  L"\u0549"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_CHA  U"\u0549"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_PEH  0x054a
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_PEH  L"\u054a"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_PEH  U"\u054a"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_JHEH  0x054b
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_JHEH  L"\u054b"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_JHEH  U"\u054b"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_RA  0x054c
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_RA  L"\u054c"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_RA  U"\u054c"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_SEH  0x054d
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_SEH  L"\u054d"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_SEH  U"\u054d"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_VEW  0x054e
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_VEW  L"\u054e"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_VEW  U"\u054e"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_TIWN  0x054f
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_TIWN  L"\u054f"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_TIWN  U"\u054f"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_REH  0x0550
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_REH  L"\u0550"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_REH  U"\u0550"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_CO  0x0551
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_CO  L"\u0551"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_CO  U"\u0551"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_YIWN  0x0552
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_YIWN  L"\u0552"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_YIWN  U"\u0552"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_PIWR  0x0553
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_PIWR  L"\u0553"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_PIWR  U"\u0553"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_KEH  0x0554
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_KEH  L"\u0554"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_KEH  U"\u0554"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_OH  0x0555
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_OH  L"\u0555"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_OH  U"\u0555"
 #define UNICODE_ARMENIAN_CAPITAL_LETTER_FEH  0x0556
-#define UNITEXT_ARMENIAN_CAPITAL_LETTER_FEH  L"\u0556"
+#define UNITEXT_ARMENIAN_CAPITAL_LETTER_FEH  U"\u0556"
 #define UNICODE_ARMENIAN_MODIFIER_LETTER_LEFT_HALF_RING  0x0559
-#define UNITEXT_ARMENIAN_MODIFIER_LETTER_LEFT_HALF_RING  L"\u0559"
+#define UNITEXT_ARMENIAN_MODIFIER_LETTER_LEFT_HALF_RING  U"\u0559"
 #define UNICODE_ARMENIAN_APOSTROPHE  0x055a
-#define UNITEXT_ARMENIAN_APOSTROPHE  L"\u055a"
+#define UNITEXT_ARMENIAN_APOSTROPHE  U"\u055a"
 #define UNICODE_ARMENIAN_EMPHASIS_MARK  0x055b
-#define UNITEXT_ARMENIAN_EMPHASIS_MARK  L"\u055b"
+#define UNITEXT_ARMENIAN_EMPHASIS_MARK  U"\u055b"
 #define UNICODE_ARMENIAN_EXCLAMATION_MARK  0x055c
-#define UNITEXT_ARMENIAN_EXCLAMATION_MARK  L"\u055c"
+#define UNITEXT_ARMENIAN_EXCLAMATION_MARK  U"\u055c"
 #define UNICODE_ARMENIAN_COMMA  0x055d
-#define UNITEXT_ARMENIAN_COMMA  L"\u055d"
+#define UNITEXT_ARMENIAN_COMMA  U"\u055d"
 #define UNICODE_ARMENIAN_QUESTION_MARK  0x055e
-#define UNITEXT_ARMENIAN_QUESTION_MARK  L"\u055e"
+#define UNITEXT_ARMENIAN_QUESTION_MARK  U"\u055e"
 #define UNICODE_ARMENIAN_ABBREVIATION_MARK  0x055f
-#define UNITEXT_ARMENIAN_ABBREVIATION_MARK  L"\u055f"
+#define UNITEXT_ARMENIAN_ABBREVIATION_MARK  U"\u055f"
 #define UNICODE_ARMENIAN_SMALL_LETTER_AYB  0x0561
-#define UNITEXT_ARMENIAN_SMALL_LETTER_AYB  L"\u0561"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_AYB  U"\u0561"
 #define UNICODE_ARMENIAN_SMALL_LETTER_BEN  0x0562
-#define UNITEXT_ARMENIAN_SMALL_LETTER_BEN  L"\u0562"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_BEN  U"\u0562"
 #define UNICODE_ARMENIAN_SMALL_LETTER_GIM  0x0563
-#define UNITEXT_ARMENIAN_SMALL_LETTER_GIM  L"\u0563"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_GIM  U"\u0563"
 #define UNICODE_ARMENIAN_SMALL_LETTER_DA  0x0564
-#define UNITEXT_ARMENIAN_SMALL_LETTER_DA  L"\u0564"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_DA  U"\u0564"
 #define UNICODE_ARMENIAN_SMALL_LETTER_ECH  0x0565
-#define UNITEXT_ARMENIAN_SMALL_LETTER_ECH  L"\u0565"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_ECH  U"\u0565"
 #define UNICODE_ARMENIAN_SMALL_LETTER_ZA  0x0566
-#define UNITEXT_ARMENIAN_SMALL_LETTER_ZA  L"\u0566"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_ZA  U"\u0566"
 #define UNICODE_ARMENIAN_SMALL_LETTER_EH  0x0567
-#define UNITEXT_ARMENIAN_SMALL_LETTER_EH  L"\u0567"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_EH  U"\u0567"
 #define UNICODE_ARMENIAN_SMALL_LETTER_ET  0x0568
-#define UNITEXT_ARMENIAN_SMALL_LETTER_ET  L"\u0568"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_ET  U"\u0568"
 #define UNICODE_ARMENIAN_SMALL_LETTER_TO  0x0569
-#define UNITEXT_ARMENIAN_SMALL_LETTER_TO  L"\u0569"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_TO  U"\u0569"
 #define UNICODE_ARMENIAN_SMALL_LETTER_ZHE  0x056a
-#define UNITEXT_ARMENIAN_SMALL_LETTER_ZHE  L"\u056a"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_ZHE  U"\u056a"
 #define UNICODE_ARMENIAN_SMALL_LETTER_INI  0x056b
-#define UNITEXT_ARMENIAN_SMALL_LETTER_INI  L"\u056b"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_INI  U"\u056b"
 #define UNICODE_ARMENIAN_SMALL_LETTER_LIWN  0x056c
-#define UNITEXT_ARMENIAN_SMALL_LETTER_LIWN  L"\u056c"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_LIWN  U"\u056c"
 #define UNICODE_ARMENIAN_SMALL_LETTER_XEH  0x056d
-#define UNITEXT_ARMENIAN_SMALL_LETTER_XEH  L"\u056d"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_XEH  U"\u056d"
 #define UNICODE_ARMENIAN_SMALL_LETTER_CA  0x056e
-#define UNITEXT_ARMENIAN_SMALL_LETTER_CA  L"\u056e"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_CA  U"\u056e"
 #define UNICODE_ARMENIAN_SMALL_LETTER_KEN  0x056f
-#define UNITEXT_ARMENIAN_SMALL_LETTER_KEN  L"\u056f"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_KEN  U"\u056f"
 #define UNICODE_ARMENIAN_SMALL_LETTER_HO  0x0570
-#define UNITEXT_ARMENIAN_SMALL_LETTER_HO  L"\u0570"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_HO  U"\u0570"
 #define UNICODE_ARMENIAN_SMALL_LETTER_JA  0x0571
-#define UNITEXT_ARMENIAN_SMALL_LETTER_JA  L"\u0571"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_JA  U"\u0571"
 #define UNICODE_ARMENIAN_SMALL_LETTER_GHAD  0x0572
-#define UNITEXT_ARMENIAN_SMALL_LETTER_GHAD  L"\u0572"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_GHAD  U"\u0572"
 #define UNICODE_ARMENIAN_SMALL_LETTER_CHEH  0x0573
-#define UNITEXT_ARMENIAN_SMALL_LETTER_CHEH  L"\u0573"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_CHEH  U"\u0573"
 #define UNICODE_ARMENIAN_SMALL_LETTER_MEN  0x0574
-#define UNITEXT_ARMENIAN_SMALL_LETTER_MEN  L"\u0574"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_MEN  U"\u0574"
 #define UNICODE_ARMENIAN_SMALL_LETTER_YI  0x0575
-#define UNITEXT_ARMENIAN_SMALL_LETTER_YI  L"\u0575"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_YI  U"\u0575"
 #define UNICODE_ARMENIAN_SMALL_LETTER_NOW  0x0576
-#define UNITEXT_ARMENIAN_SMALL_LETTER_NOW  L"\u0576"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_NOW  U"\u0576"
 #define UNICODE_ARMENIAN_SMALL_LETTER_SHA  0x0577
-#define UNITEXT_ARMENIAN_SMALL_LETTER_SHA  L"\u0577"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_SHA  U"\u0577"
 #define UNICODE_ARMENIAN_SMALL_LETTER_VO  0x0578
-#define UNITEXT_ARMENIAN_SMALL_LETTER_VO  L"\u0578"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_VO  U"\u0578"
 #define UNICODE_ARMENIAN_SMALL_LETTER_CHA  0x0579
-#define UNITEXT_ARMENIAN_SMALL_LETTER_CHA  L"\u0579"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_CHA  U"\u0579"
 #define UNICODE_ARMENIAN_SMALL_LETTER_PEH  0x057a
-#define UNITEXT_ARMENIAN_SMALL_LETTER_PEH  L"\u057a"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_PEH  U"\u057a"
 #define UNICODE_ARMENIAN_SMALL_LETTER_JHEH  0x057b
-#define UNITEXT_ARMENIAN_SMALL_LETTER_JHEH  L"\u057b"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_JHEH  U"\u057b"
 #define UNICODE_ARMENIAN_SMALL_LETTER_RA  0x057c
-#define UNITEXT_ARMENIAN_SMALL_LETTER_RA  L"\u057c"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_RA  U"\u057c"
 #define UNICODE_ARMENIAN_SMALL_LETTER_SEH  0x057d
-#define UNITEXT_ARMENIAN_SMALL_LETTER_SEH  L"\u057d"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_SEH  U"\u057d"
 #define UNICODE_ARMENIAN_SMALL_LETTER_VEW  0x057e
-#define UNITEXT_ARMENIAN_SMALL_LETTER_VEW  L"\u057e"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_VEW  U"\u057e"
 #define UNICODE_ARMENIAN_SMALL_LETTER_TIWN  0x057f
-#define UNITEXT_ARMENIAN_SMALL_LETTER_TIWN  L"\u057f"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_TIWN  U"\u057f"
 #define UNICODE_ARMENIAN_SMALL_LETTER_REH  0x0580
-#define UNITEXT_ARMENIAN_SMALL_LETTER_REH  L"\u0580"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_REH  U"\u0580"
 #define UNICODE_ARMENIAN_SMALL_LETTER_CO  0x0581
-#define UNITEXT_ARMENIAN_SMALL_LETTER_CO  L"\u0581"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_CO  U"\u0581"
 #define UNICODE_ARMENIAN_SMALL_LETTER_YIWN  0x0582
-#define UNITEXT_ARMENIAN_SMALL_LETTER_YIWN  L"\u0582"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_YIWN  U"\u0582"
 #define UNICODE_ARMENIAN_SMALL_LETTER_PIWR  0x0583
-#define UNITEXT_ARMENIAN_SMALL_LETTER_PIWR  L"\u0583"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_PIWR  U"\u0583"
 #define UNICODE_ARMENIAN_SMALL_LETTER_KEH  0x0584
-#define UNITEXT_ARMENIAN_SMALL_LETTER_KEH  L"\u0584"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_KEH  U"\u0584"
 #define UNICODE_ARMENIAN_SMALL_LETTER_OH  0x0585
-#define UNITEXT_ARMENIAN_SMALL_LETTER_OH  L"\u0585"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_OH  U"\u0585"
 #define UNICODE_ARMENIAN_SMALL_LETTER_FEH  0x0586
-#define UNITEXT_ARMENIAN_SMALL_LETTER_FEH  L"\u0586"
+#define UNITEXT_ARMENIAN_SMALL_LETTER_FEH  U"\u0586"
 #define UNICODE_ARMENIAN_SMALL_LIGATURE_ECH_YIWN  0x0587
-#define UNITEXT_ARMENIAN_SMALL_LIGATURE_ECH_YIWN  L"\u0587"
+#define UNITEXT_ARMENIAN_SMALL_LIGATURE_ECH_YIWN  U"\u0587"
 #define UNICODE_ARMENIAN_FULL_STOP  0x0589
-#define UNITEXT_ARMENIAN_FULL_STOP  L"\u0589"
+#define UNITEXT_ARMENIAN_FULL_STOP  U"\u0589"
 #define UNICODE_ARMENIAN_HYPHEN  0x058a
-#define UNITEXT_ARMENIAN_HYPHEN  L"\u058a"
+#define UNITEXT_ARMENIAN_HYPHEN  U"\u058a"
 #define UNICODE_HEBREW_ACCENT_ETNAHTA  0x0591
-#define UNITEXT_HEBREW_ACCENT_ETNAHTA  L"\u0591"
+#define UNITEXT_HEBREW_ACCENT_ETNAHTA  U"\u0591"
 #define UNICODE_HEBREW_ACCENT_SEGOL  0x0592
-#define UNITEXT_HEBREW_ACCENT_SEGOL  L"\u0592"
+#define UNITEXT_HEBREW_ACCENT_SEGOL  U"\u0592"
 #define UNICODE_HEBREW_ACCENT_SHALSHELET  0x0593
-#define UNITEXT_HEBREW_ACCENT_SHALSHELET  L"\u0593"
+#define UNITEXT_HEBREW_ACCENT_SHALSHELET  U"\u0593"
 #define UNICODE_HEBREW_ACCENT_ZAQEF_QATAN  0x0594
-#define UNITEXT_HEBREW_ACCENT_ZAQEF_QATAN  L"\u0594"
+#define UNITEXT_HEBREW_ACCENT_ZAQEF_QATAN  U"\u0594"
 #define UNICODE_HEBREW_ACCENT_ZAQEF_GADOL  0x0595
-#define UNITEXT_HEBREW_ACCENT_ZAQEF_GADOL  L"\u0595"
+#define UNITEXT_HEBREW_ACCENT_ZAQEF_GADOL  U"\u0595"
 #define UNICODE_HEBREW_ACCENT_TIPEHA  0x0596
-#define UNITEXT_HEBREW_ACCENT_TIPEHA  L"\u0596"
+#define UNITEXT_HEBREW_ACCENT_TIPEHA  U"\u0596"
 #define UNICODE_HEBREW_ACCENT_REVIA  0x0597
-#define UNITEXT_HEBREW_ACCENT_REVIA  L"\u0597"
+#define UNITEXT_HEBREW_ACCENT_REVIA  U"\u0597"
 #define UNICODE_HEBREW_ACCENT_ZARQA  0x0598
-#define UNITEXT_HEBREW_ACCENT_ZARQA  L"\u0598"
+#define UNITEXT_HEBREW_ACCENT_ZARQA  U"\u0598"
 #define UNICODE_HEBREW_ACCENT_PASHTA  0x0599
-#define UNITEXT_HEBREW_ACCENT_PASHTA  L"\u0599"
+#define UNITEXT_HEBREW_ACCENT_PASHTA  U"\u0599"
 #define UNICODE_HEBREW_ACCENT_YETIV  0x059a
-#define UNITEXT_HEBREW_ACCENT_YETIV  L"\u059a"
+#define UNITEXT_HEBREW_ACCENT_YETIV  U"\u059a"
 #define UNICODE_HEBREW_ACCENT_TEVIR  0x059b
-#define UNITEXT_HEBREW_ACCENT_TEVIR  L"\u059b"
+#define UNITEXT_HEBREW_ACCENT_TEVIR  U"\u059b"
 #define UNICODE_HEBREW_ACCENT_GERESH  0x059c
-#define UNITEXT_HEBREW_ACCENT_GERESH  L"\u059c"
+#define UNITEXT_HEBREW_ACCENT_GERESH  U"\u059c"
 #define UNICODE_HEBREW_ACCENT_GERESH_MUQDAM  0x059d
-#define UNITEXT_HEBREW_ACCENT_GERESH_MUQDAM  L"\u059d"
+#define UNITEXT_HEBREW_ACCENT_GERESH_MUQDAM  U"\u059d"
 #define UNICODE_HEBREW_ACCENT_GERSHAYIM  0x059e
-#define UNITEXT_HEBREW_ACCENT_GERSHAYIM  L"\u059e"
+#define UNITEXT_HEBREW_ACCENT_GERSHAYIM  U"\u059e"
 #define UNICODE_HEBREW_ACCENT_QARNEY_PARA  0x059f
-#define UNITEXT_HEBREW_ACCENT_QARNEY_PARA  L"\u059f"
+#define UNITEXT_HEBREW_ACCENT_QARNEY_PARA  U"\u059f"
 #define UNICODE_HEBREW_ACCENT_TELISHA_GEDOLA  0x05a0
-#define UNITEXT_HEBREW_ACCENT_TELISHA_GEDOLA  L"\u05a0"
+#define UNITEXT_HEBREW_ACCENT_TELISHA_GEDOLA  U"\u05a0"
 #define UNICODE_HEBREW_ACCENT_PAZER  0x05a1
-#define UNITEXT_HEBREW_ACCENT_PAZER  L"\u05a1"
+#define UNITEXT_HEBREW_ACCENT_PAZER  U"\u05a1"
 #define UNICODE_HEBREW_ACCENT_ATNAH_HAFUKH  0x05a2
-#define UNITEXT_HEBREW_ACCENT_ATNAH_HAFUKH  L"\u05a2"
+#define UNITEXT_HEBREW_ACCENT_ATNAH_HAFUKH  U"\u05a2"
 #define UNICODE_HEBREW_ACCENT_MUNAH  0x05a3
-#define UNITEXT_HEBREW_ACCENT_MUNAH  L"\u05a3"
+#define UNITEXT_HEBREW_ACCENT_MUNAH  U"\u05a3"
 #define UNICODE_HEBREW_ACCENT_MAHAPAKH  0x05a4
-#define UNITEXT_HEBREW_ACCENT_MAHAPAKH  L"\u05a4"
+#define UNITEXT_HEBREW_ACCENT_MAHAPAKH  U"\u05a4"
 #define UNICODE_HEBREW_ACCENT_MERKHA  0x05a5
-#define UNITEXT_HEBREW_ACCENT_MERKHA  L"\u05a5"
+#define UNITEXT_HEBREW_ACCENT_MERKHA  U"\u05a5"
 #define UNICODE_HEBREW_ACCENT_MERKHA_KEFULA  0x05a6
-#define UNITEXT_HEBREW_ACCENT_MERKHA_KEFULA  L"\u05a6"
+#define UNITEXT_HEBREW_ACCENT_MERKHA_KEFULA  U"\u05a6"
 #define UNICODE_HEBREW_ACCENT_DARGA  0x05a7
-#define UNITEXT_HEBREW_ACCENT_DARGA  L"\u05a7"
+#define UNITEXT_HEBREW_ACCENT_DARGA  U"\u05a7"
 #define UNICODE_HEBREW_ACCENT_QADMA  0x05a8
-#define UNITEXT_HEBREW_ACCENT_QADMA  L"\u05a8"
+#define UNITEXT_HEBREW_ACCENT_QADMA  U"\u05a8"
 #define UNICODE_HEBREW_ACCENT_TELISHA_QETANA  0x05a9
-#define UNITEXT_HEBREW_ACCENT_TELISHA_QETANA  L"\u05a9"
+#define UNITEXT_HEBREW_ACCENT_TELISHA_QETANA  U"\u05a9"
 #define UNICODE_HEBREW_ACCENT_YERAH_BEN_YOMO  0x05aa
-#define UNITEXT_HEBREW_ACCENT_YERAH_BEN_YOMO  L"\u05aa"
+#define UNITEXT_HEBREW_ACCENT_YERAH_BEN_YOMO  U"\u05aa"
 #define UNICODE_HEBREW_ACCENT_OLE  0x05ab
-#define UNITEXT_HEBREW_ACCENT_OLE  L"\u05ab"
+#define UNITEXT_HEBREW_ACCENT_OLE  U"\u05ab"
 #define UNICODE_HEBREW_ACCENT_ILUY  0x05ac
-#define UNITEXT_HEBREW_ACCENT_ILUY  L"\u05ac"
+#define UNITEXT_HEBREW_ACCENT_ILUY  U"\u05ac"
 #define UNICODE_HEBREW_ACCENT_DEHI  0x05ad
-#define UNITEXT_HEBREW_ACCENT_DEHI  L"\u05ad"
+#define UNITEXT_HEBREW_ACCENT_DEHI  U"\u05ad"
 #define UNICODE_HEBREW_ACCENT_ZINOR  0x05ae
-#define UNITEXT_HEBREW_ACCENT_ZINOR  L"\u05ae"
+#define UNITEXT_HEBREW_ACCENT_ZINOR  U"\u05ae"
 #define UNICODE_HEBREW_MARK_MASORA_CIRCLE  0x05af
-#define UNITEXT_HEBREW_MARK_MASORA_CIRCLE  L"\u05af"
+#define UNITEXT_HEBREW_MARK_MASORA_CIRCLE  U"\u05af"
 #define UNICODE_HEBREW_POINT_SHEVA  0x05b0
-#define UNITEXT_HEBREW_POINT_SHEVA  L"\u05b0"
+#define UNITEXT_HEBREW_POINT_SHEVA  U"\u05b0"
 #define UNICODE_HEBREW_POINT_HATAF_SEGOL  0x05b1
-#define UNITEXT_HEBREW_POINT_HATAF_SEGOL  L"\u05b1"
+#define UNITEXT_HEBREW_POINT_HATAF_SEGOL  U"\u05b1"
 #define UNICODE_HEBREW_POINT_HATAF_PATAH  0x05b2
-#define UNITEXT_HEBREW_POINT_HATAF_PATAH  L"\u05b2"
+#define UNITEXT_HEBREW_POINT_HATAF_PATAH  U"\u05b2"
 #define UNICODE_HEBREW_POINT_HATAF_QAMATS  0x05b3
-#define UNITEXT_HEBREW_POINT_HATAF_QAMATS  L"\u05b3"
+#define UNITEXT_HEBREW_POINT_HATAF_QAMATS  U"\u05b3"
 #define UNICODE_HEBREW_POINT_HIRIQ  0x05b4
-#define UNITEXT_HEBREW_POINT_HIRIQ  L"\u05b4"
+#define UNITEXT_HEBREW_POINT_HIRIQ  U"\u05b4"
 #define UNICODE_HEBREW_POINT_TSERE  0x05b5
-#define UNITEXT_HEBREW_POINT_TSERE  L"\u05b5"
+#define UNITEXT_HEBREW_POINT_TSERE  U"\u05b5"
 #define UNICODE_HEBREW_POINT_SEGOL  0x05b6
-#define UNITEXT_HEBREW_POINT_SEGOL  L"\u05b6"
+#define UNITEXT_HEBREW_POINT_SEGOL  U"\u05b6"
 #define UNICODE_HEBREW_POINT_PATAH  0x05b7
-#define UNITEXT_HEBREW_POINT_PATAH  L"\u05b7"
+#define UNITEXT_HEBREW_POINT_PATAH  U"\u05b7"
 #define UNICODE_HEBREW_POINT_QAMATS  0x05b8
-#define UNITEXT_HEBREW_POINT_QAMATS  L"\u05b8"
+#define UNITEXT_HEBREW_POINT_QAMATS  U"\u05b8"
 #define UNICODE_HEBREW_POINT_HOLAM  0x05b9
-#define UNITEXT_HEBREW_POINT_HOLAM  L"\u05b9"
+#define UNITEXT_HEBREW_POINT_HOLAM  U"\u05b9"
 #define UNICODE_HEBREW_POINT_HOLAM_HASER_FOR_VAV  0x05ba
-#define UNITEXT_HEBREW_POINT_HOLAM_HASER_FOR_VAV  L"\u05ba"
+#define UNITEXT_HEBREW_POINT_HOLAM_HASER_FOR_VAV  U"\u05ba"
 #define UNICODE_HEBREW_POINT_QUBUTS  0x05bb
-#define UNITEXT_HEBREW_POINT_QUBUTS  L"\u05bb"
+#define UNITEXT_HEBREW_POINT_QUBUTS  U"\u05bb"
 #define UNICODE_HEBREW_POINT_DAGESH_OR_MAPIQ  0x05bc
-#define UNITEXT_HEBREW_POINT_DAGESH_OR_MAPIQ  L"\u05bc"
+#define UNITEXT_HEBREW_POINT_DAGESH_OR_MAPIQ  U"\u05bc"
 #define UNICODE_HEBREW_POINT_METEG  0x05bd
-#define UNITEXT_HEBREW_POINT_METEG  L"\u05bd"
+#define UNITEXT_HEBREW_POINT_METEG  U"\u05bd"
 #define UNICODE_HEBREW_PUNCTUATION_MAQAF  0x05be
-#define UNITEXT_HEBREW_PUNCTUATION_MAQAF  L"\u05be"
+#define UNITEXT_HEBREW_PUNCTUATION_MAQAF  U"\u05be"
 #define UNICODE_HEBREW_POINT_RAFE  0x05bf
-#define UNITEXT_HEBREW_POINT_RAFE  L"\u05bf"
+#define UNITEXT_HEBREW_POINT_RAFE  U"\u05bf"
 #define UNICODE_HEBREW_PUNCTUATION_PASEQ  0x05c0
-#define UNITEXT_HEBREW_PUNCTUATION_PASEQ  L"\u05c0"
+#define UNITEXT_HEBREW_PUNCTUATION_PASEQ  U"\u05c0"
 #define UNICODE_HEBREW_POINT_SHIN_DOT  0x05c1
-#define UNITEXT_HEBREW_POINT_SHIN_DOT  L"\u05c1"
+#define UNITEXT_HEBREW_POINT_SHIN_DOT  U"\u05c1"
 #define UNICODE_HEBREW_POINT_SIN_DOT  0x05c2
-#define UNITEXT_HEBREW_POINT_SIN_DOT  L"\u05c2"
+#define UNITEXT_HEBREW_POINT_SIN_DOT  U"\u05c2"
 #define UNICODE_HEBREW_PUNCTUATION_SOF_PASUQ  0x05c3
-#define UNITEXT_HEBREW_PUNCTUATION_SOF_PASUQ  L"\u05c3"
+#define UNITEXT_HEBREW_PUNCTUATION_SOF_PASUQ  U"\u05c3"
 #define UNICODE_HEBREW_MARK_UPPER_DOT  0x05c4
-#define UNITEXT_HEBREW_MARK_UPPER_DOT  L"\u05c4"
+#define UNITEXT_HEBREW_MARK_UPPER_DOT  U"\u05c4"
 #define UNICODE_HEBREW_MARK_LOWER_DOT  0x05c5
-#define UNITEXT_HEBREW_MARK_LOWER_DOT  L"\u05c5"
+#define UNITEXT_HEBREW_MARK_LOWER_DOT  U"\u05c5"
 #define UNICODE_HEBREW_PUNCTUATION_NUN_HAFUKHA  0x05c6
-#define UNITEXT_HEBREW_PUNCTUATION_NUN_HAFUKHA  L"\u05c6"
+#define UNITEXT_HEBREW_PUNCTUATION_NUN_HAFUKHA  U"\u05c6"
 #define UNICODE_HEBREW_POINT_QAMATS_QATAN  0x05c7
-#define UNITEXT_HEBREW_POINT_QAMATS_QATAN  L"\u05c7"
+#define UNITEXT_HEBREW_POINT_QAMATS_QATAN  U"\u05c7"
 #define UNICODE_HEBREW_LETTER_ALEF  0x05d0
-#define UNITEXT_HEBREW_LETTER_ALEF  L"\u05d0"
+#define UNITEXT_HEBREW_LETTER_ALEF  U"\u05d0"
 #define UNICODE_HEBREW_LETTER_BET  0x05d1
-#define UNITEXT_HEBREW_LETTER_BET  L"\u05d1"
+#define UNITEXT_HEBREW_LETTER_BET  U"\u05d1"
 #define UNICODE_HEBREW_LETTER_GIMEL  0x05d2
-#define UNITEXT_HEBREW_LETTER_GIMEL  L"\u05d2"
+#define UNITEXT_HEBREW_LETTER_GIMEL  U"\u05d2"
 #define UNICODE_HEBREW_LETTER_DALET  0x05d3
-#define UNITEXT_HEBREW_LETTER_DALET  L"\u05d3"
+#define UNITEXT_HEBREW_LETTER_DALET  U"\u05d3"
 #define UNICODE_HEBREW_LETTER_HE  0x05d4
-#define UNITEXT_HEBREW_LETTER_HE  L"\u05d4"
+#define UNITEXT_HEBREW_LETTER_HE  U"\u05d4"
 #define UNICODE_HEBREW_LETTER_VAV  0x05d5
-#define UNITEXT_HEBREW_LETTER_VAV  L"\u05d5"
+#define UNITEXT_HEBREW_LETTER_VAV  U"\u05d5"
 #define UNICODE_HEBREW_LETTER_ZAYIN  0x05d6
-#define UNITEXT_HEBREW_LETTER_ZAYIN  L"\u05d6"
+#define UNITEXT_HEBREW_LETTER_ZAYIN  U"\u05d6"
 #define UNICODE_HEBREW_LETTER_HET  0x05d7
-#define UNITEXT_HEBREW_LETTER_HET  L"\u05d7"
+#define UNITEXT_HEBREW_LETTER_HET  U"\u05d7"
 #define UNICODE_HEBREW_LETTER_TET  0x05d8
-#define UNITEXT_HEBREW_LETTER_TET  L"\u05d8"
+#define UNITEXT_HEBREW_LETTER_TET  U"\u05d8"
 #define UNICODE_HEBREW_LETTER_YOD  0x05d9
-#define UNITEXT_HEBREW_LETTER_YOD  L"\u05d9"
+#define UNITEXT_HEBREW_LETTER_YOD  U"\u05d9"
 #define UNICODE_HEBREW_LETTER_FINAL_KAF  0x05da
-#define UNITEXT_HEBREW_LETTER_FINAL_KAF  L"\u05da"
+#define UNITEXT_HEBREW_LETTER_FINAL_KAF  U"\u05da"
 #define UNICODE_HEBREW_LETTER_KAF  0x05db
-#define UNITEXT_HEBREW_LETTER_KAF  L"\u05db"
+#define UNITEXT_HEBREW_LETTER_KAF  U"\u05db"
 #define UNICODE_HEBREW_LETTER_LAMED  0x05dc
-#define UNITEXT_HEBREW_LETTER_LAMED  L"\u05dc"
+#define UNITEXT_HEBREW_LETTER_LAMED  U"\u05dc"
 #define UNICODE_HEBREW_LETTER_FINAL_MEM  0x05dd
-#define UNITEXT_HEBREW_LETTER_FINAL_MEM  L"\u05dd"
+#define UNITEXT_HEBREW_LETTER_FINAL_MEM  U"\u05dd"
 #define UNICODE_HEBREW_LETTER_MEM  0x05de
-#define UNITEXT_HEBREW_LETTER_MEM  L"\u05de"
+#define UNITEXT_HEBREW_LETTER_MEM  U"\u05de"
 #define UNICODE_HEBREW_LETTER_FINAL_NUN  0x05df
-#define UNITEXT_HEBREW_LETTER_FINAL_NUN  L"\u05df"
+#define UNITEXT_HEBREW_LETTER_FINAL_NUN  U"\u05df"
 #define UNICODE_HEBREW_LETTER_NUN  0x05e0
-#define UNITEXT_HEBREW_LETTER_NUN  L"\u05e0"
+#define UNITEXT_HEBREW_LETTER_NUN  U"\u05e0"
 #define UNICODE_HEBREW_LETTER_SAMEKH  0x05e1
-#define UNITEXT_HEBREW_LETTER_SAMEKH  L"\u05e1"
+#define UNITEXT_HEBREW_LETTER_SAMEKH  U"\u05e1"
 #define UNICODE_HEBREW_LETTER_AYIN  0x05e2
-#define UNITEXT_HEBREW_LETTER_AYIN  L"\u05e2"
+#define UNITEXT_HEBREW_LETTER_AYIN  U"\u05e2"
 #define UNICODE_HEBREW_LETTER_FINAL_PE  0x05e3
-#define UNITEXT_HEBREW_LETTER_FINAL_PE  L"\u05e3"
+#define UNITEXT_HEBREW_LETTER_FINAL_PE  U"\u05e3"
 #define UNICODE_HEBREW_LETTER_PE  0x05e4
-#define UNITEXT_HEBREW_LETTER_PE  L"\u05e4"
+#define UNITEXT_HEBREW_LETTER_PE  U"\u05e4"
 #define UNICODE_HEBREW_LETTER_FINAL_TSADI  0x05e5
-#define UNITEXT_HEBREW_LETTER_FINAL_TSADI  L"\u05e5"
+#define UNITEXT_HEBREW_LETTER_FINAL_TSADI  U"\u05e5"
 #define UNICODE_HEBREW_LETTER_TSADI  0x05e6
-#define UNITEXT_HEBREW_LETTER_TSADI  L"\u05e6"
+#define UNITEXT_HEBREW_LETTER_TSADI  U"\u05e6"
 #define UNICODE_HEBREW_LETTER_QOF  0x05e7
-#define UNITEXT_HEBREW_LETTER_QOF  L"\u05e7"
+#define UNITEXT_HEBREW_LETTER_QOF  U"\u05e7"
 #define UNICODE_HEBREW_LETTER_RESH  0x05e8
-#define UNITEXT_HEBREW_LETTER_RESH  L"\u05e8"
+#define UNITEXT_HEBREW_LETTER_RESH  U"\u05e8"
 #define UNICODE_HEBREW_LETTER_SHIN  0x05e9
-#define UNITEXT_HEBREW_LETTER_SHIN  L"\u05e9"
+#define UNITEXT_HEBREW_LETTER_SHIN  U"\u05e9"
 #define UNICODE_HEBREW_LETTER_TAV  0x05ea
-#define UNITEXT_HEBREW_LETTER_TAV  L"\u05ea"
+#define UNITEXT_HEBREW_LETTER_TAV  U"\u05ea"
 #define UNICODE_HEBREW_LIGATURE_YIDDISH_DOUBLE_VAV  0x05f0
-#define UNITEXT_HEBREW_LIGATURE_YIDDISH_DOUBLE_VAV  L"\u05f0"
+#define UNITEXT_HEBREW_LIGATURE_YIDDISH_DOUBLE_VAV  U"\u05f0"
 #define UNICODE_HEBREW_LIGATURE_YIDDISH_VAV_YOD  0x05f1
-#define UNITEXT_HEBREW_LIGATURE_YIDDISH_VAV_YOD  L"\u05f1"
+#define UNITEXT_HEBREW_LIGATURE_YIDDISH_VAV_YOD  U"\u05f1"
 #define UNICODE_HEBREW_LIGATURE_YIDDISH_DOUBLE_YOD  0x05f2
-#define UNITEXT_HEBREW_LIGATURE_YIDDISH_DOUBLE_YOD  L"\u05f2"
+#define UNITEXT_HEBREW_LIGATURE_YIDDISH_DOUBLE_YOD  U"\u05f2"
 #define UNICODE_HEBREW_PUNCTUATION_GERESH  0x05f3
-#define UNITEXT_HEBREW_PUNCTUATION_GERESH  L"\u05f3"
+#define UNITEXT_HEBREW_PUNCTUATION_GERESH  U"\u05f3"
 #define UNICODE_HEBREW_PUNCTUATION_GERSHAYIM  0x05f4
-#define UNITEXT_HEBREW_PUNCTUATION_GERSHAYIM  L"\u05f4"
+#define UNITEXT_HEBREW_PUNCTUATION_GERSHAYIM  U"\u05f4"
 #define UNICODE_ARABIC_NUMBER_SIGN  0x0600
-#define UNITEXT_ARABIC_NUMBER_SIGN  L"\u0600"
+#define UNITEXT_ARABIC_NUMBER_SIGN  U"\u0600"
 #define UNICODE_ARABIC_SIGN_SANAH  0x0601
-#define UNITEXT_ARABIC_SIGN_SANAH  L"\u0601"
+#define UNITEXT_ARABIC_SIGN_SANAH  U"\u0601"
 #define UNICODE_ARABIC_FOOTNOTE_MARKER  0x0602
-#define UNITEXT_ARABIC_FOOTNOTE_MARKER  L"\u0602"
+#define UNITEXT_ARABIC_FOOTNOTE_MARKER  U"\u0602"
 #define UNICODE_ARABIC_SIGN_SAFHA  0x0603
-#define UNITEXT_ARABIC_SIGN_SAFHA  L"\u0603"
+#define UNITEXT_ARABIC_SIGN_SAFHA  U"\u0603"
 #define UNICODE_AFGHANI_SIGN  0x060b
-#define UNITEXT_AFGHANI_SIGN  L"\u060b"
+#define UNITEXT_AFGHANI_SIGN  U"\u060b"
 #define UNICODE_ARABIC_COMMA  0x060c
-#define UNITEXT_ARABIC_COMMA  L"\u060c"
+#define UNITEXT_ARABIC_COMMA  U"\u060c"
 #define UNICODE_ARABIC_DATE_SEPARATOR  0x060d
-#define UNITEXT_ARABIC_DATE_SEPARATOR  L"\u060d"
+#define UNITEXT_ARABIC_DATE_SEPARATOR  U"\u060d"
 #define UNICODE_ARABIC_POETIC_VERSE_SIGN  0x060e
-#define UNITEXT_ARABIC_POETIC_VERSE_SIGN  L"\u060e"
+#define UNITEXT_ARABIC_POETIC_VERSE_SIGN  U"\u060e"
 #define UNICODE_ARABIC_SIGN_MISRA  0x060f
-#define UNITEXT_ARABIC_SIGN_MISRA  L"\u060f"
+#define UNITEXT_ARABIC_SIGN_MISRA  U"\u060f"
 #define UNICODE_ARABIC_SIGN_SALLALLAHOU_ALAYHE_WASSALLAM  0x0610
-#define UNITEXT_ARABIC_SIGN_SALLALLAHOU_ALAYHE_WASSALLAM  L"\u0610"
+#define UNITEXT_ARABIC_SIGN_SALLALLAHOU_ALAYHE_WASSALLAM  U"\u0610"
 #define UNICODE_ARABIC_SIGN_ALAYHE_ASSALLAM  0x0611
-#define UNITEXT_ARABIC_SIGN_ALAYHE_ASSALLAM  L"\u0611"
+#define UNITEXT_ARABIC_SIGN_ALAYHE_ASSALLAM  U"\u0611"
 #define UNICODE_ARABIC_SIGN_RAHMATULLAH_ALAYHE  0x0612
-#define UNITEXT_ARABIC_SIGN_RAHMATULLAH_ALAYHE  L"\u0612"
+#define UNITEXT_ARABIC_SIGN_RAHMATULLAH_ALAYHE  U"\u0612"
 #define UNICODE_ARABIC_SIGN_RADI_ALLAHOU_ANHU  0x0613
-#define UNITEXT_ARABIC_SIGN_RADI_ALLAHOU_ANHU  L"\u0613"
+#define UNITEXT_ARABIC_SIGN_RADI_ALLAHOU_ANHU  U"\u0613"
 #define UNICODE_ARABIC_SIGN_TAKHALLUS  0x0614
-#define UNITEXT_ARABIC_SIGN_TAKHALLUS  L"\u0614"
+#define UNITEXT_ARABIC_SIGN_TAKHALLUS  U"\u0614"
 #define UNICODE_ARABIC_SMALL_HIGH_TAH  0x0615
-#define UNITEXT_ARABIC_SMALL_HIGH_TAH  L"\u0615"
+#define UNITEXT_ARABIC_SMALL_HIGH_TAH  U"\u0615"
 #define UNICODE_ARABIC_SEMICOLON  0x061b
-#define UNITEXT_ARABIC_SEMICOLON  L"\u061b"
+#define UNITEXT_ARABIC_SEMICOLON  U"\u061b"
 #define UNICODE_ARABIC_TRIPLE_DOT_PUNCTUATION_MARK  0x061e
-#define UNITEXT_ARABIC_TRIPLE_DOT_PUNCTUATION_MARK  L"\u061e"
+#define UNITEXT_ARABIC_TRIPLE_DOT_PUNCTUATION_MARK  U"\u061e"
 #define UNICODE_ARABIC_QUESTION_MARK  0x061f
-#define UNITEXT_ARABIC_QUESTION_MARK  L"\u061f"
+#define UNITEXT_ARABIC_QUESTION_MARK  U"\u061f"
 #define UNICODE_ARABIC_LETTER_HAMZA  0x0621
-#define UNITEXT_ARABIC_LETTER_HAMZA  L"\u0621"
+#define UNITEXT_ARABIC_LETTER_HAMZA  U"\u0621"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_MADDA_ABOVE  0x0622
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_MADDA_ABOVE  L"\u0622"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_MADDA_ABOVE  U"\u0622"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_HAMZA_ABOVE  0x0623
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_ABOVE  L"\u0623"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_ABOVE  U"\u0623"
 #define UNICODE_ARABIC_LETTER_WAW_WITH_HAMZA_ABOVE  0x0624
-#define UNITEXT_ARABIC_LETTER_WAW_WITH_HAMZA_ABOVE  L"\u0624"
+#define UNITEXT_ARABIC_LETTER_WAW_WITH_HAMZA_ABOVE  U"\u0624"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_HAMZA_BELOW  0x0625
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_BELOW  L"\u0625"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_BELOW  U"\u0625"
 #define UNICODE_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE  0x0626
-#define UNITEXT_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE  L"\u0626"
+#define UNITEXT_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE  U"\u0626"
 #define UNICODE_ARABIC_LETTER_ALEF  0x0627
-#define UNITEXT_ARABIC_LETTER_ALEF  L"\u0627"
+#define UNITEXT_ARABIC_LETTER_ALEF  U"\u0627"
 #define UNICODE_ARABIC_LETTER_BEH  0x0628
-#define UNITEXT_ARABIC_LETTER_BEH  L"\u0628"
+#define UNITEXT_ARABIC_LETTER_BEH  U"\u0628"
 #define UNICODE_ARABIC_LETTER_TEH_MARBUTA  0x0629
-#define UNITEXT_ARABIC_LETTER_TEH_MARBUTA  L"\u0629"
+#define UNITEXT_ARABIC_LETTER_TEH_MARBUTA  U"\u0629"
 #define UNICODE_ARABIC_LETTER_TEH  0x062a
-#define UNITEXT_ARABIC_LETTER_TEH  L"\u062a"
+#define UNITEXT_ARABIC_LETTER_TEH  U"\u062a"
 #define UNICODE_ARABIC_LETTER_THEH  0x062b
-#define UNITEXT_ARABIC_LETTER_THEH  L"\u062b"
+#define UNITEXT_ARABIC_LETTER_THEH  U"\u062b"
 #define UNICODE_ARABIC_LETTER_JEEM  0x062c
-#define UNITEXT_ARABIC_LETTER_JEEM  L"\u062c"
+#define UNITEXT_ARABIC_LETTER_JEEM  U"\u062c"
 #define UNICODE_ARABIC_LETTER_HAH  0x062d
-#define UNITEXT_ARABIC_LETTER_HAH  L"\u062d"
+#define UNITEXT_ARABIC_LETTER_HAH  U"\u062d"
 #define UNICODE_ARABIC_LETTER_KHAH  0x062e
-#define UNITEXT_ARABIC_LETTER_KHAH  L"\u062e"
+#define UNITEXT_ARABIC_LETTER_KHAH  U"\u062e"
 #define UNICODE_ARABIC_LETTER_DAL  0x062f
-#define UNITEXT_ARABIC_LETTER_DAL  L"\u062f"
+#define UNITEXT_ARABIC_LETTER_DAL  U"\u062f"
 #define UNICODE_ARABIC_LETTER_THAL  0x0630
-#define UNITEXT_ARABIC_LETTER_THAL  L"\u0630"
+#define UNITEXT_ARABIC_LETTER_THAL  U"\u0630"
 #define UNICODE_ARABIC_LETTER_REH  0x0631
-#define UNITEXT_ARABIC_LETTER_REH  L"\u0631"
+#define UNITEXT_ARABIC_LETTER_REH  U"\u0631"
 #define UNICODE_ARABIC_LETTER_ZAIN  0x0632
-#define UNITEXT_ARABIC_LETTER_ZAIN  L"\u0632"
+#define UNITEXT_ARABIC_LETTER_ZAIN  U"\u0632"
 #define UNICODE_ARABIC_LETTER_SEEN  0x0633
-#define UNITEXT_ARABIC_LETTER_SEEN  L"\u0633"
+#define UNITEXT_ARABIC_LETTER_SEEN  U"\u0633"
 #define UNICODE_ARABIC_LETTER_SHEEN  0x0634
-#define UNITEXT_ARABIC_LETTER_SHEEN  L"\u0634"
+#define UNITEXT_ARABIC_LETTER_SHEEN  U"\u0634"
 #define UNICODE_ARABIC_LETTER_SAD  0x0635
-#define UNITEXT_ARABIC_LETTER_SAD  L"\u0635"
+#define UNITEXT_ARABIC_LETTER_SAD  U"\u0635"
 #define UNICODE_ARABIC_LETTER_DAD  0x0636
-#define UNITEXT_ARABIC_LETTER_DAD  L"\u0636"
+#define UNITEXT_ARABIC_LETTER_DAD  U"\u0636"
 #define UNICODE_ARABIC_LETTER_TAH  0x0637
-#define UNITEXT_ARABIC_LETTER_TAH  L"\u0637"
+#define UNITEXT_ARABIC_LETTER_TAH  U"\u0637"
 #define UNICODE_ARABIC_LETTER_ZAH  0x0638
-#define UNITEXT_ARABIC_LETTER_ZAH  L"\u0638"
+#define UNITEXT_ARABIC_LETTER_ZAH  U"\u0638"
 #define UNICODE_ARABIC_LETTER_AIN  0x0639
-#define UNITEXT_ARABIC_LETTER_AIN  L"\u0639"
+#define UNITEXT_ARABIC_LETTER_AIN  U"\u0639"
 #define UNICODE_ARABIC_LETTER_GHAIN  0x063a
-#define UNITEXT_ARABIC_LETTER_GHAIN  L"\u063a"
+#define UNITEXT_ARABIC_LETTER_GHAIN  U"\u063a"
 #define UNICODE_ARABIC_TATWEEL  0x0640
-#define UNITEXT_ARABIC_TATWEEL  L"\u0640"
+#define UNITEXT_ARABIC_TATWEEL  U"\u0640"
 #define UNICODE_ARABIC_LETTER_FEH  0x0641
-#define UNITEXT_ARABIC_LETTER_FEH  L"\u0641"
+#define UNITEXT_ARABIC_LETTER_FEH  U"\u0641"
 #define UNICODE_ARABIC_LETTER_QAF  0x0642
-#define UNITEXT_ARABIC_LETTER_QAF  L"\u0642"
+#define UNITEXT_ARABIC_LETTER_QAF  U"\u0642"
 #define UNICODE_ARABIC_LETTER_KAF  0x0643
-#define UNITEXT_ARABIC_LETTER_KAF  L"\u0643"
+#define UNITEXT_ARABIC_LETTER_KAF  U"\u0643"
 #define UNICODE_ARABIC_LETTER_LAM  0x0644
-#define UNITEXT_ARABIC_LETTER_LAM  L"\u0644"
+#define UNITEXT_ARABIC_LETTER_LAM  U"\u0644"
 #define UNICODE_ARABIC_LETTER_MEEM  0x0645
-#define UNITEXT_ARABIC_LETTER_MEEM  L"\u0645"
+#define UNITEXT_ARABIC_LETTER_MEEM  U"\u0645"
 #define UNICODE_ARABIC_LETTER_NOON  0x0646
-#define UNITEXT_ARABIC_LETTER_NOON  L"\u0646"
+#define UNITEXT_ARABIC_LETTER_NOON  U"\u0646"
 #define UNICODE_ARABIC_LETTER_HEH  0x0647
-#define UNITEXT_ARABIC_LETTER_HEH  L"\u0647"
+#define UNITEXT_ARABIC_LETTER_HEH  U"\u0647"
 #define UNICODE_ARABIC_LETTER_WAW  0x0648
-#define UNITEXT_ARABIC_LETTER_WAW  L"\u0648"
+#define UNITEXT_ARABIC_LETTER_WAW  U"\u0648"
 #define UNICODE_ARABIC_LETTER_ALEF_MAKSURA  0x0649
-#define UNITEXT_ARABIC_LETTER_ALEF_MAKSURA  L"\u0649"
+#define UNITEXT_ARABIC_LETTER_ALEF_MAKSURA  U"\u0649"
 #define UNICODE_ARABIC_LETTER_YEH  0x064a
-#define UNITEXT_ARABIC_LETTER_YEH  L"\u064a"
+#define UNITEXT_ARABIC_LETTER_YEH  U"\u064a"
 #define UNICODE_ARABIC_FATHATAN  0x064b
-#define UNITEXT_ARABIC_FATHATAN  L"\u064b"
+#define UNITEXT_ARABIC_FATHATAN  U"\u064b"
 #define UNICODE_ARABIC_DAMMATAN  0x064c
-#define UNITEXT_ARABIC_DAMMATAN  L"\u064c"
+#define UNITEXT_ARABIC_DAMMATAN  U"\u064c"
 #define UNICODE_ARABIC_KASRATAN  0x064d
-#define UNITEXT_ARABIC_KASRATAN  L"\u064d"
+#define UNITEXT_ARABIC_KASRATAN  U"\u064d"
 #define UNICODE_ARABIC_FATHA  0x064e
-#define UNITEXT_ARABIC_FATHA  L"\u064e"
+#define UNITEXT_ARABIC_FATHA  U"\u064e"
 #define UNICODE_ARABIC_DAMMA  0x064f
-#define UNITEXT_ARABIC_DAMMA  L"\u064f"
+#define UNITEXT_ARABIC_DAMMA  U"\u064f"
 #define UNICODE_ARABIC_KASRA  0x0650
-#define UNITEXT_ARABIC_KASRA  L"\u0650"
+#define UNITEXT_ARABIC_KASRA  U"\u0650"
 #define UNICODE_ARABIC_SHADDA  0x0651
-#define UNITEXT_ARABIC_SHADDA  L"\u0651"
+#define UNITEXT_ARABIC_SHADDA  U"\u0651"
 #define UNICODE_ARABIC_SUKUN  0x0652
-#define UNITEXT_ARABIC_SUKUN  L"\u0652"
+#define UNITEXT_ARABIC_SUKUN  U"\u0652"
 #define UNICODE_ARABIC_MADDAH_ABOVE  0x0653
-#define UNITEXT_ARABIC_MADDAH_ABOVE  L"\u0653"
+#define UNITEXT_ARABIC_MADDAH_ABOVE  U"\u0653"
 #define UNICODE_ARABIC_HAMZA_ABOVE  0x0654
-#define UNITEXT_ARABIC_HAMZA_ABOVE  L"\u0654"
+#define UNITEXT_ARABIC_HAMZA_ABOVE  U"\u0654"
 #define UNICODE_ARABIC_HAMZA_BELOW  0x0655
-#define UNITEXT_ARABIC_HAMZA_BELOW  L"\u0655"
+#define UNITEXT_ARABIC_HAMZA_BELOW  U"\u0655"
 #define UNICODE_ARABIC_SUBSCRIPT_ALEF  0x0656
-#define UNITEXT_ARABIC_SUBSCRIPT_ALEF  L"\u0656"
+#define UNITEXT_ARABIC_SUBSCRIPT_ALEF  U"\u0656"
 #define UNICODE_ARABIC_INVERTED_DAMMA  0x0657
-#define UNITEXT_ARABIC_INVERTED_DAMMA  L"\u0657"
+#define UNITEXT_ARABIC_INVERTED_DAMMA  U"\u0657"
 #define UNICODE_ARABIC_MARK_NOON_GHUNNA  0x0658
-#define UNITEXT_ARABIC_MARK_NOON_GHUNNA  L"\u0658"
+#define UNITEXT_ARABIC_MARK_NOON_GHUNNA  U"\u0658"
 #define UNICODE_ARABIC_ZWARAKAY  0x0659
-#define UNITEXT_ARABIC_ZWARAKAY  L"\u0659"
+#define UNITEXT_ARABIC_ZWARAKAY  U"\u0659"
 #define UNICODE_ARABIC_VOWEL_SIGN_SMALL_V_ABOVE  0x065a
-#define UNITEXT_ARABIC_VOWEL_SIGN_SMALL_V_ABOVE  L"\u065a"
+#define UNITEXT_ARABIC_VOWEL_SIGN_SMALL_V_ABOVE  U"\u065a"
 #define UNICODE_ARABIC_VOWEL_SIGN_INVERTED_SMALL_V_ABOVE  0x065b
-#define UNITEXT_ARABIC_VOWEL_SIGN_INVERTED_SMALL_V_ABOVE  L"\u065b"
+#define UNITEXT_ARABIC_VOWEL_SIGN_INVERTED_SMALL_V_ABOVE  U"\u065b"
 #define UNICODE_ARABIC_VOWEL_SIGN_DOT_BELOW  0x065c
-#define UNITEXT_ARABIC_VOWEL_SIGN_DOT_BELOW  L"\u065c"
+#define UNITEXT_ARABIC_VOWEL_SIGN_DOT_BELOW  U"\u065c"
 #define UNICODE_ARABIC_REVERSED_DAMMA  0x065d
-#define UNITEXT_ARABIC_REVERSED_DAMMA  L"\u065d"
+#define UNITEXT_ARABIC_REVERSED_DAMMA  U"\u065d"
 #define UNICODE_ARABIC_FATHA_WITH_TWO_DOTS  0x065e
-#define UNITEXT_ARABIC_FATHA_WITH_TWO_DOTS  L"\u065e"
+#define UNITEXT_ARABIC_FATHA_WITH_TWO_DOTS  U"\u065e"
 #define UNICODE_ARABIC_INDIC_DIGIT_ZERO  0x0660
-#define UNITEXT_ARABIC_INDIC_DIGIT_ZERO  L"\u0660"
+#define UNITEXT_ARABIC_INDIC_DIGIT_ZERO  U"\u0660"
 #define UNICODE_ARABIC_INDIC_DIGIT_ONE  0x0661
-#define UNITEXT_ARABIC_INDIC_DIGIT_ONE  L"\u0661"
+#define UNITEXT_ARABIC_INDIC_DIGIT_ONE  U"\u0661"
 #define UNICODE_ARABIC_INDIC_DIGIT_TWO  0x0662
-#define UNITEXT_ARABIC_INDIC_DIGIT_TWO  L"\u0662"
+#define UNITEXT_ARABIC_INDIC_DIGIT_TWO  U"\u0662"
 #define UNICODE_ARABIC_INDIC_DIGIT_THREE  0x0663
-#define UNITEXT_ARABIC_INDIC_DIGIT_THREE  L"\u0663"
+#define UNITEXT_ARABIC_INDIC_DIGIT_THREE  U"\u0663"
 #define UNICODE_ARABIC_INDIC_DIGIT_FOUR  0x0664
-#define UNITEXT_ARABIC_INDIC_DIGIT_FOUR  L"\u0664"
+#define UNITEXT_ARABIC_INDIC_DIGIT_FOUR  U"\u0664"
 #define UNICODE_ARABIC_INDIC_DIGIT_FIVE  0x0665
-#define UNITEXT_ARABIC_INDIC_DIGIT_FIVE  L"\u0665"
+#define UNITEXT_ARABIC_INDIC_DIGIT_FIVE  U"\u0665"
 #define UNICODE_ARABIC_INDIC_DIGIT_SIX  0x0666
-#define UNITEXT_ARABIC_INDIC_DIGIT_SIX  L"\u0666"
+#define UNITEXT_ARABIC_INDIC_DIGIT_SIX  U"\u0666"
 #define UNICODE_ARABIC_INDIC_DIGIT_SEVEN  0x0667
-#define UNITEXT_ARABIC_INDIC_DIGIT_SEVEN  L"\u0667"
+#define UNITEXT_ARABIC_INDIC_DIGIT_SEVEN  U"\u0667"
 #define UNICODE_ARABIC_INDIC_DIGIT_EIGHT  0x0668
-#define UNITEXT_ARABIC_INDIC_DIGIT_EIGHT  L"\u0668"
+#define UNITEXT_ARABIC_INDIC_DIGIT_EIGHT  U"\u0668"
 #define UNICODE_ARABIC_INDIC_DIGIT_NINE  0x0669
-#define UNITEXT_ARABIC_INDIC_DIGIT_NINE  L"\u0669"
+#define UNITEXT_ARABIC_INDIC_DIGIT_NINE  U"\u0669"
 #define UNICODE_ARABIC_PERCENT_SIGN  0x066a
-#define UNITEXT_ARABIC_PERCENT_SIGN  L"\u066a"
+#define UNITEXT_ARABIC_PERCENT_SIGN  U"\u066a"
 #define UNICODE_ARABIC_DECIMAL_SEPARATOR  0x066b
-#define UNITEXT_ARABIC_DECIMAL_SEPARATOR  L"\u066b"
+#define UNITEXT_ARABIC_DECIMAL_SEPARATOR  U"\u066b"
 #define UNICODE_ARABIC_THOUSANDS_SEPARATOR  0x066c
-#define UNITEXT_ARABIC_THOUSANDS_SEPARATOR  L"\u066c"
+#define UNITEXT_ARABIC_THOUSANDS_SEPARATOR  U"\u066c"
 #define UNICODE_ARABIC_FIVE_POINTED_STAR  0x066d
-#define UNITEXT_ARABIC_FIVE_POINTED_STAR  L"\u066d"
+#define UNITEXT_ARABIC_FIVE_POINTED_STAR  U"\u066d"
 #define UNICODE_ARABIC_LETTER_DOTLESS_BEH  0x066e
-#define UNITEXT_ARABIC_LETTER_DOTLESS_BEH  L"\u066e"
+#define UNITEXT_ARABIC_LETTER_DOTLESS_BEH  U"\u066e"
 #define UNICODE_ARABIC_LETTER_DOTLESS_QAF  0x066f
-#define UNITEXT_ARABIC_LETTER_DOTLESS_QAF  L"\u066f"
+#define UNITEXT_ARABIC_LETTER_DOTLESS_QAF  U"\u066f"
 #define UNICODE_ARABIC_LETTER_SUPERSCRIPT_ALEF  0x0670
-#define UNITEXT_ARABIC_LETTER_SUPERSCRIPT_ALEF  L"\u0670"
+#define UNITEXT_ARABIC_LETTER_SUPERSCRIPT_ALEF  U"\u0670"
 #define UNICODE_ARABIC_LETTER_ALEF_WASLA  0x0671
-#define UNITEXT_ARABIC_LETTER_ALEF_WASLA  L"\u0671"
+#define UNITEXT_ARABIC_LETTER_ALEF_WASLA  U"\u0671"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_WAVY_HAMZA_ABOVE  0x0672
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_WAVY_HAMZA_ABOVE  L"\u0672"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_WAVY_HAMZA_ABOVE  U"\u0672"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_WAVY_HAMZA_BELOW  0x0673
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_WAVY_HAMZA_BELOW  L"\u0673"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_WAVY_HAMZA_BELOW  U"\u0673"
 #define UNICODE_ARABIC_LETTER_HIGH_HAMZA  0x0674
-#define UNITEXT_ARABIC_LETTER_HIGH_HAMZA  L"\u0674"
+#define UNITEXT_ARABIC_LETTER_HIGH_HAMZA  U"\u0674"
 #define UNICODE_ARABIC_LETTER_HIGH_HAMZA_ALEF  0x0675
-#define UNITEXT_ARABIC_LETTER_HIGH_HAMZA_ALEF  L"\u0675"
+#define UNITEXT_ARABIC_LETTER_HIGH_HAMZA_ALEF  U"\u0675"
 #define UNICODE_ARABIC_LETTER_HIGH_HAMZA_WAW  0x0676
-#define UNITEXT_ARABIC_LETTER_HIGH_HAMZA_WAW  L"\u0676"
+#define UNITEXT_ARABIC_LETTER_HIGH_HAMZA_WAW  U"\u0676"
 #define UNICODE_ARABIC_LETTER_U_WITH_HAMZA_ABOVE  0x0677
-#define UNITEXT_ARABIC_LETTER_U_WITH_HAMZA_ABOVE  L"\u0677"
+#define UNITEXT_ARABIC_LETTER_U_WITH_HAMZA_ABOVE  U"\u0677"
 #define UNICODE_ARABIC_LETTER_HIGH_HAMZA_YEH  0x0678
-#define UNITEXT_ARABIC_LETTER_HIGH_HAMZA_YEH  L"\u0678"
+#define UNITEXT_ARABIC_LETTER_HIGH_HAMZA_YEH  U"\u0678"
 #define UNICODE_ARABIC_LETTER_TTEH  0x0679
-#define UNITEXT_ARABIC_LETTER_TTEH  L"\u0679"
+#define UNITEXT_ARABIC_LETTER_TTEH  U"\u0679"
 #define UNICODE_ARABIC_LETTER_TTEHEH  0x067a
-#define UNITEXT_ARABIC_LETTER_TTEHEH  L"\u067a"
+#define UNITEXT_ARABIC_LETTER_TTEHEH  U"\u067a"
 #define UNICODE_ARABIC_LETTER_BEEH  0x067b
-#define UNITEXT_ARABIC_LETTER_BEEH  L"\u067b"
+#define UNITEXT_ARABIC_LETTER_BEEH  U"\u067b"
 #define UNICODE_ARABIC_LETTER_TEH_WITH_RING  0x067c
-#define UNITEXT_ARABIC_LETTER_TEH_WITH_RING  L"\u067c"
+#define UNITEXT_ARABIC_LETTER_TEH_WITH_RING  U"\u067c"
 #define UNICODE_ARABIC_LETTER_TEH_WITH_THREE_DOTS_ABOVE_DOWNWARDS  0x067d
-#define UNITEXT_ARABIC_LETTER_TEH_WITH_THREE_DOTS_ABOVE_DOWNWARDS  L"\u067d"
+#define UNITEXT_ARABIC_LETTER_TEH_WITH_THREE_DOTS_ABOVE_DOWNWARDS  U"\u067d"
 #define UNICODE_ARABIC_LETTER_PEH  0x067e
-#define UNITEXT_ARABIC_LETTER_PEH  L"\u067e"
+#define UNITEXT_ARABIC_LETTER_PEH  U"\u067e"
 #define UNICODE_ARABIC_LETTER_TEHEH  0x067f
-#define UNITEXT_ARABIC_LETTER_TEHEH  L"\u067f"
+#define UNITEXT_ARABIC_LETTER_TEHEH  U"\u067f"
 #define UNICODE_ARABIC_LETTER_BEHEH  0x0680
-#define UNITEXT_ARABIC_LETTER_BEHEH  L"\u0680"
+#define UNITEXT_ARABIC_LETTER_BEHEH  U"\u0680"
 #define UNICODE_ARABIC_LETTER_HAH_WITH_HAMZA_ABOVE  0x0681
-#define UNITEXT_ARABIC_LETTER_HAH_WITH_HAMZA_ABOVE  L"\u0681"
+#define UNITEXT_ARABIC_LETTER_HAH_WITH_HAMZA_ABOVE  U"\u0681"
 #define UNICODE_ARABIC_LETTER_HAH_WITH_TWO_DOTS_VERTICAL_ABOVE  0x0682
-#define UNITEXT_ARABIC_LETTER_HAH_WITH_TWO_DOTS_VERTICAL_ABOVE  L"\u0682"
+#define UNITEXT_ARABIC_LETTER_HAH_WITH_TWO_DOTS_VERTICAL_ABOVE  U"\u0682"
 #define UNICODE_ARABIC_LETTER_NYEH  0x0683
-#define UNITEXT_ARABIC_LETTER_NYEH  L"\u0683"
+#define UNITEXT_ARABIC_LETTER_NYEH  U"\u0683"
 #define UNICODE_ARABIC_LETTER_DYEH  0x0684
-#define UNITEXT_ARABIC_LETTER_DYEH  L"\u0684"
+#define UNITEXT_ARABIC_LETTER_DYEH  U"\u0684"
 #define UNICODE_ARABIC_LETTER_HAH_WITH_THREE_DOTS_ABOVE  0x0685
-#define UNITEXT_ARABIC_LETTER_HAH_WITH_THREE_DOTS_ABOVE  L"\u0685"
+#define UNITEXT_ARABIC_LETTER_HAH_WITH_THREE_DOTS_ABOVE  U"\u0685"
 #define UNICODE_ARABIC_LETTER_TCHEH  0x0686
-#define UNITEXT_ARABIC_LETTER_TCHEH  L"\u0686"
+#define UNITEXT_ARABIC_LETTER_TCHEH  U"\u0686"
 #define UNICODE_ARABIC_LETTER_TCHEHEH  0x0687
-#define UNITEXT_ARABIC_LETTER_TCHEHEH  L"\u0687"
+#define UNITEXT_ARABIC_LETTER_TCHEHEH  U"\u0687"
 #define UNICODE_ARABIC_LETTER_DDAL  0x0688
-#define UNITEXT_ARABIC_LETTER_DDAL  L"\u0688"
+#define UNITEXT_ARABIC_LETTER_DDAL  U"\u0688"
 #define UNICODE_ARABIC_LETTER_DAL_WITH_RING  0x0689
-#define UNITEXT_ARABIC_LETTER_DAL_WITH_RING  L"\u0689"
+#define UNITEXT_ARABIC_LETTER_DAL_WITH_RING  U"\u0689"
 #define UNICODE_ARABIC_LETTER_DAL_WITH_DOT_BELOW  0x068a
-#define UNITEXT_ARABIC_LETTER_DAL_WITH_DOT_BELOW  L"\u068a"
+#define UNITEXT_ARABIC_LETTER_DAL_WITH_DOT_BELOW  U"\u068a"
 #define UNICODE_ARABIC_LETTER_DAL_WITH_DOT_BELOW_AND_SMALL_TAH  0x068b
-#define UNITEXT_ARABIC_LETTER_DAL_WITH_DOT_BELOW_AND_SMALL_TAH  L"\u068b"
+#define UNITEXT_ARABIC_LETTER_DAL_WITH_DOT_BELOW_AND_SMALL_TAH  U"\u068b"
 #define UNICODE_ARABIC_LETTER_DAHAL  0x068c
-#define UNITEXT_ARABIC_LETTER_DAHAL  L"\u068c"
+#define UNITEXT_ARABIC_LETTER_DAHAL  U"\u068c"
 #define UNICODE_ARABIC_LETTER_DDAHAL  0x068d
-#define UNITEXT_ARABIC_LETTER_DDAHAL  L"\u068d"
+#define UNITEXT_ARABIC_LETTER_DDAHAL  U"\u068d"
 #define UNICODE_ARABIC_LETTER_DUL  0x068e
-#define UNITEXT_ARABIC_LETTER_DUL  L"\u068e"
+#define UNITEXT_ARABIC_LETTER_DUL  U"\u068e"
 #define UNICODE_ARABIC_LETTER_DAL_WITH_THREE_DOTS_ABOVE_DOWNWARDS  0x068f
-#define UNITEXT_ARABIC_LETTER_DAL_WITH_THREE_DOTS_ABOVE_DOWNWARDS  L"\u068f"
+#define UNITEXT_ARABIC_LETTER_DAL_WITH_THREE_DOTS_ABOVE_DOWNWARDS  U"\u068f"
 #define UNICODE_ARABIC_LETTER_DAL_WITH_FOUR_DOTS_ABOVE  0x0690
-#define UNITEXT_ARABIC_LETTER_DAL_WITH_FOUR_DOTS_ABOVE  L"\u0690"
+#define UNITEXT_ARABIC_LETTER_DAL_WITH_FOUR_DOTS_ABOVE  U"\u0690"
 #define UNICODE_ARABIC_LETTER_RREH  0x0691
-#define UNITEXT_ARABIC_LETTER_RREH  L"\u0691"
+#define UNITEXT_ARABIC_LETTER_RREH  U"\u0691"
 #define UNICODE_ARABIC_LETTER_REH_WITH_SMALL_V  0x0692
-#define UNITEXT_ARABIC_LETTER_REH_WITH_SMALL_V  L"\u0692"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_SMALL_V  U"\u0692"
 #define UNICODE_ARABIC_LETTER_REH_WITH_RING  0x0693
-#define UNITEXT_ARABIC_LETTER_REH_WITH_RING  L"\u0693"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_RING  U"\u0693"
 #define UNICODE_ARABIC_LETTER_REH_WITH_DOT_BELOW  0x0694
-#define UNITEXT_ARABIC_LETTER_REH_WITH_DOT_BELOW  L"\u0694"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_DOT_BELOW  U"\u0694"
 #define UNICODE_ARABIC_LETTER_REH_WITH_SMALL_V_BELOW  0x0695
-#define UNITEXT_ARABIC_LETTER_REH_WITH_SMALL_V_BELOW  L"\u0695"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_SMALL_V_BELOW  U"\u0695"
 #define UNICODE_ARABIC_LETTER_REH_WITH_DOT_BELOW_AND_DOT_ABOVE  0x0696
-#define UNITEXT_ARABIC_LETTER_REH_WITH_DOT_BELOW_AND_DOT_ABOVE  L"\u0696"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_DOT_BELOW_AND_DOT_ABOVE  U"\u0696"
 #define UNICODE_ARABIC_LETTER_REH_WITH_TWO_DOTS_ABOVE  0x0697
-#define UNITEXT_ARABIC_LETTER_REH_WITH_TWO_DOTS_ABOVE  L"\u0697"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_TWO_DOTS_ABOVE  U"\u0697"
 #define UNICODE_ARABIC_LETTER_JEH  0x0698
-#define UNITEXT_ARABIC_LETTER_JEH  L"\u0698"
+#define UNITEXT_ARABIC_LETTER_JEH  U"\u0698"
 #define UNICODE_ARABIC_LETTER_REH_WITH_FOUR_DOTS_ABOVE  0x0699
-#define UNITEXT_ARABIC_LETTER_REH_WITH_FOUR_DOTS_ABOVE  L"\u0699"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_FOUR_DOTS_ABOVE  U"\u0699"
 #define UNICODE_ARABIC_LETTER_SEEN_WITH_DOT_BELOW_AND_DOT_ABOVE  0x069a
-#define UNITEXT_ARABIC_LETTER_SEEN_WITH_DOT_BELOW_AND_DOT_ABOVE  L"\u069a"
+#define UNITEXT_ARABIC_LETTER_SEEN_WITH_DOT_BELOW_AND_DOT_ABOVE  U"\u069a"
 #define UNICODE_ARABIC_LETTER_SEEN_WITH_THREE_DOTS_BELOW  0x069b
-#define UNITEXT_ARABIC_LETTER_SEEN_WITH_THREE_DOTS_BELOW  L"\u069b"
+#define UNITEXT_ARABIC_LETTER_SEEN_WITH_THREE_DOTS_BELOW  U"\u069b"
 #define UNICODE_ARABIC_LETTER_SEEN_WITH_THREE_DOTS_BELOW_AND_THREE_DOTS_ABOVE  0x069c
-#define UNITEXT_ARABIC_LETTER_SEEN_WITH_THREE_DOTS_BELOW_AND_THREE_DOTS_ABOVE  L"\u069c"
+#define UNITEXT_ARABIC_LETTER_SEEN_WITH_THREE_DOTS_BELOW_AND_THREE_DOTS_ABOVE  U"\u069c"
 #define UNICODE_ARABIC_LETTER_SAD_WITH_TWO_DOTS_BELOW  0x069d
-#define UNITEXT_ARABIC_LETTER_SAD_WITH_TWO_DOTS_BELOW  L"\u069d"
+#define UNITEXT_ARABIC_LETTER_SAD_WITH_TWO_DOTS_BELOW  U"\u069d"
 #define UNICODE_ARABIC_LETTER_SAD_WITH_THREE_DOTS_ABOVE  0x069e
-#define UNITEXT_ARABIC_LETTER_SAD_WITH_THREE_DOTS_ABOVE  L"\u069e"
+#define UNITEXT_ARABIC_LETTER_SAD_WITH_THREE_DOTS_ABOVE  U"\u069e"
 #define UNICODE_ARABIC_LETTER_TAH_WITH_THREE_DOTS_ABOVE  0x069f
-#define UNITEXT_ARABIC_LETTER_TAH_WITH_THREE_DOTS_ABOVE  L"\u069f"
+#define UNITEXT_ARABIC_LETTER_TAH_WITH_THREE_DOTS_ABOVE  U"\u069f"
 #define UNICODE_ARABIC_LETTER_AIN_WITH_THREE_DOTS_ABOVE  0x06a0
-#define UNITEXT_ARABIC_LETTER_AIN_WITH_THREE_DOTS_ABOVE  L"\u06a0"
+#define UNITEXT_ARABIC_LETTER_AIN_WITH_THREE_DOTS_ABOVE  U"\u06a0"
 #define UNICODE_ARABIC_LETTER_DOTLESS_FEH  0x06a1
-#define UNITEXT_ARABIC_LETTER_DOTLESS_FEH  L"\u06a1"
+#define UNITEXT_ARABIC_LETTER_DOTLESS_FEH  U"\u06a1"
 #define UNICODE_ARABIC_LETTER_FEH_WITH_DOT_MOVED_BELOW  0x06a2
-#define UNITEXT_ARABIC_LETTER_FEH_WITH_DOT_MOVED_BELOW  L"\u06a2"
+#define UNITEXT_ARABIC_LETTER_FEH_WITH_DOT_MOVED_BELOW  U"\u06a2"
 #define UNICODE_ARABIC_LETTER_FEH_WITH_DOT_BELOW  0x06a3
-#define UNITEXT_ARABIC_LETTER_FEH_WITH_DOT_BELOW  L"\u06a3"
+#define UNITEXT_ARABIC_LETTER_FEH_WITH_DOT_BELOW  U"\u06a3"
 #define UNICODE_ARABIC_LETTER_VEH  0x06a4
-#define UNITEXT_ARABIC_LETTER_VEH  L"\u06a4"
+#define UNITEXT_ARABIC_LETTER_VEH  U"\u06a4"
 #define UNICODE_ARABIC_LETTER_FEH_WITH_THREE_DOTS_BELOW  0x06a5
-#define UNITEXT_ARABIC_LETTER_FEH_WITH_THREE_DOTS_BELOW  L"\u06a5"
+#define UNITEXT_ARABIC_LETTER_FEH_WITH_THREE_DOTS_BELOW  U"\u06a5"
 #define UNICODE_ARABIC_LETTER_PEHEH  0x06a6
-#define UNITEXT_ARABIC_LETTER_PEHEH  L"\u06a6"
+#define UNITEXT_ARABIC_LETTER_PEHEH  U"\u06a6"
 #define UNICODE_ARABIC_LETTER_QAF_WITH_DOT_ABOVE  0x06a7
-#define UNITEXT_ARABIC_LETTER_QAF_WITH_DOT_ABOVE  L"\u06a7"
+#define UNITEXT_ARABIC_LETTER_QAF_WITH_DOT_ABOVE  U"\u06a7"
 #define UNICODE_ARABIC_LETTER_QAF_WITH_THREE_DOTS_ABOVE  0x06a8
-#define UNITEXT_ARABIC_LETTER_QAF_WITH_THREE_DOTS_ABOVE  L"\u06a8"
+#define UNITEXT_ARABIC_LETTER_QAF_WITH_THREE_DOTS_ABOVE  U"\u06a8"
 #define UNICODE_ARABIC_LETTER_KEHEH  0x06a9
-#define UNITEXT_ARABIC_LETTER_KEHEH  L"\u06a9"
+#define UNITEXT_ARABIC_LETTER_KEHEH  U"\u06a9"
 #define UNICODE_ARABIC_LETTER_SWASH_KAF  0x06aa
-#define UNITEXT_ARABIC_LETTER_SWASH_KAF  L"\u06aa"
+#define UNITEXT_ARABIC_LETTER_SWASH_KAF  U"\u06aa"
 #define UNICODE_ARABIC_LETTER_KAF_WITH_RING  0x06ab
-#define UNITEXT_ARABIC_LETTER_KAF_WITH_RING  L"\u06ab"
+#define UNITEXT_ARABIC_LETTER_KAF_WITH_RING  U"\u06ab"
 #define UNICODE_ARABIC_LETTER_KAF_WITH_DOT_ABOVE  0x06ac
-#define UNITEXT_ARABIC_LETTER_KAF_WITH_DOT_ABOVE  L"\u06ac"
+#define UNITEXT_ARABIC_LETTER_KAF_WITH_DOT_ABOVE  U"\u06ac"
 #define UNICODE_ARABIC_LETTER_NG  0x06ad
-#define UNITEXT_ARABIC_LETTER_NG  L"\u06ad"
+#define UNITEXT_ARABIC_LETTER_NG  U"\u06ad"
 #define UNICODE_ARABIC_LETTER_KAF_WITH_THREE_DOTS_BELOW  0x06ae
-#define UNITEXT_ARABIC_LETTER_KAF_WITH_THREE_DOTS_BELOW  L"\u06ae"
+#define UNITEXT_ARABIC_LETTER_KAF_WITH_THREE_DOTS_BELOW  U"\u06ae"
 #define UNICODE_ARABIC_LETTER_GAF  0x06af
-#define UNITEXT_ARABIC_LETTER_GAF  L"\u06af"
+#define UNITEXT_ARABIC_LETTER_GAF  U"\u06af"
 #define UNICODE_ARABIC_LETTER_GAF_WITH_RING  0x06b0
-#define UNITEXT_ARABIC_LETTER_GAF_WITH_RING  L"\u06b0"
+#define UNITEXT_ARABIC_LETTER_GAF_WITH_RING  U"\u06b0"
 #define UNICODE_ARABIC_LETTER_NGOEH  0x06b1
-#define UNITEXT_ARABIC_LETTER_NGOEH  L"\u06b1"
+#define UNITEXT_ARABIC_LETTER_NGOEH  U"\u06b1"
 #define UNICODE_ARABIC_LETTER_GAF_WITH_TWO_DOTS_BELOW  0x06b2
-#define UNITEXT_ARABIC_LETTER_GAF_WITH_TWO_DOTS_BELOW  L"\u06b2"
+#define UNITEXT_ARABIC_LETTER_GAF_WITH_TWO_DOTS_BELOW  U"\u06b2"
 #define UNICODE_ARABIC_LETTER_GUEH  0x06b3
-#define UNITEXT_ARABIC_LETTER_GUEH  L"\u06b3"
+#define UNITEXT_ARABIC_LETTER_GUEH  U"\u06b3"
 #define UNICODE_ARABIC_LETTER_GAF_WITH_THREE_DOTS_ABOVE  0x06b4
-#define UNITEXT_ARABIC_LETTER_GAF_WITH_THREE_DOTS_ABOVE  L"\u06b4"
+#define UNITEXT_ARABIC_LETTER_GAF_WITH_THREE_DOTS_ABOVE  U"\u06b4"
 #define UNICODE_ARABIC_LETTER_LAM_WITH_SMALL_V  0x06b5
-#define UNITEXT_ARABIC_LETTER_LAM_WITH_SMALL_V  L"\u06b5"
+#define UNITEXT_ARABIC_LETTER_LAM_WITH_SMALL_V  U"\u06b5"
 #define UNICODE_ARABIC_LETTER_LAM_WITH_DOT_ABOVE  0x06b6
-#define UNITEXT_ARABIC_LETTER_LAM_WITH_DOT_ABOVE  L"\u06b6"
+#define UNITEXT_ARABIC_LETTER_LAM_WITH_DOT_ABOVE  U"\u06b6"
 #define UNICODE_ARABIC_LETTER_LAM_WITH_THREE_DOTS_ABOVE  0x06b7
-#define UNITEXT_ARABIC_LETTER_LAM_WITH_THREE_DOTS_ABOVE  L"\u06b7"
+#define UNITEXT_ARABIC_LETTER_LAM_WITH_THREE_DOTS_ABOVE  U"\u06b7"
 #define UNICODE_ARABIC_LETTER_LAM_WITH_THREE_DOTS_BELOW  0x06b8
-#define UNITEXT_ARABIC_LETTER_LAM_WITH_THREE_DOTS_BELOW  L"\u06b8"
+#define UNITEXT_ARABIC_LETTER_LAM_WITH_THREE_DOTS_BELOW  U"\u06b8"
 #define UNICODE_ARABIC_LETTER_NOON_WITH_DOT_BELOW  0x06b9
-#define UNITEXT_ARABIC_LETTER_NOON_WITH_DOT_BELOW  L"\u06b9"
+#define UNITEXT_ARABIC_LETTER_NOON_WITH_DOT_BELOW  U"\u06b9"
 #define UNICODE_ARABIC_LETTER_NOON_GHUNNA  0x06ba
-#define UNITEXT_ARABIC_LETTER_NOON_GHUNNA  L"\u06ba"
+#define UNITEXT_ARABIC_LETTER_NOON_GHUNNA  U"\u06ba"
 #define UNICODE_ARABIC_LETTER_RNOON  0x06bb
-#define UNITEXT_ARABIC_LETTER_RNOON  L"\u06bb"
+#define UNITEXT_ARABIC_LETTER_RNOON  U"\u06bb"
 #define UNICODE_ARABIC_LETTER_NOON_WITH_RING  0x06bc
-#define UNITEXT_ARABIC_LETTER_NOON_WITH_RING  L"\u06bc"
+#define UNITEXT_ARABIC_LETTER_NOON_WITH_RING  U"\u06bc"
 #define UNICODE_ARABIC_LETTER_NOON_WITH_THREE_DOTS_ABOVE  0x06bd
-#define UNITEXT_ARABIC_LETTER_NOON_WITH_THREE_DOTS_ABOVE  L"\u06bd"
+#define UNITEXT_ARABIC_LETTER_NOON_WITH_THREE_DOTS_ABOVE  U"\u06bd"
 #define UNICODE_ARABIC_LETTER_HEH_DOACHASHMEE  0x06be
-#define UNITEXT_ARABIC_LETTER_HEH_DOACHASHMEE  L"\u06be"
+#define UNITEXT_ARABIC_LETTER_HEH_DOACHASHMEE  U"\u06be"
 #define UNICODE_ARABIC_LETTER_TCHEH_WITH_DOT_ABOVE  0x06bf
-#define UNITEXT_ARABIC_LETTER_TCHEH_WITH_DOT_ABOVE  L"\u06bf"
+#define UNITEXT_ARABIC_LETTER_TCHEH_WITH_DOT_ABOVE  U"\u06bf"
 #define UNICODE_ARABIC_LETTER_HEH_WITH_YEH_ABOVE  0x06c0
-#define UNITEXT_ARABIC_LETTER_HEH_WITH_YEH_ABOVE  L"\u06c0"
+#define UNITEXT_ARABIC_LETTER_HEH_WITH_YEH_ABOVE  U"\u06c0"
 #define UNICODE_ARABIC_LETTER_HEH_GOAL  0x06c1
-#define UNITEXT_ARABIC_LETTER_HEH_GOAL  L"\u06c1"
+#define UNITEXT_ARABIC_LETTER_HEH_GOAL  U"\u06c1"
 #define UNICODE_ARABIC_LETTER_HEH_GOAL_WITH_HAMZA_ABOVE  0x06c2
-#define UNITEXT_ARABIC_LETTER_HEH_GOAL_WITH_HAMZA_ABOVE  L"\u06c2"
+#define UNITEXT_ARABIC_LETTER_HEH_GOAL_WITH_HAMZA_ABOVE  U"\u06c2"
 #define UNICODE_ARABIC_LETTER_TEH_MARBUTA_GOAL  0x06c3
-#define UNITEXT_ARABIC_LETTER_TEH_MARBUTA_GOAL  L"\u06c3"
+#define UNITEXT_ARABIC_LETTER_TEH_MARBUTA_GOAL  U"\u06c3"
 #define UNICODE_ARABIC_LETTER_WAW_WITH_RING  0x06c4
-#define UNITEXT_ARABIC_LETTER_WAW_WITH_RING  L"\u06c4"
+#define UNITEXT_ARABIC_LETTER_WAW_WITH_RING  U"\u06c4"
 #define UNICODE_ARABIC_LETTER_KIRGHIZ_OE  0x06c5
-#define UNITEXT_ARABIC_LETTER_KIRGHIZ_OE  L"\u06c5"
+#define UNITEXT_ARABIC_LETTER_KIRGHIZ_OE  U"\u06c5"
 #define UNICODE_ARABIC_LETTER_OE  0x06c6
-#define UNITEXT_ARABIC_LETTER_OE  L"\u06c6"
+#define UNITEXT_ARABIC_LETTER_OE  U"\u06c6"
 #define UNICODE_ARABIC_LETTER_U  0x06c7
-#define UNITEXT_ARABIC_LETTER_U  L"\u06c7"
+#define UNITEXT_ARABIC_LETTER_U  U"\u06c7"
 #define UNICODE_ARABIC_LETTER_YU  0x06c8
-#define UNITEXT_ARABIC_LETTER_YU  L"\u06c8"
+#define UNITEXT_ARABIC_LETTER_YU  U"\u06c8"
 #define UNICODE_ARABIC_LETTER_KIRGHIZ_YU  0x06c9
-#define UNITEXT_ARABIC_LETTER_KIRGHIZ_YU  L"\u06c9"
+#define UNITEXT_ARABIC_LETTER_KIRGHIZ_YU  U"\u06c9"
 #define UNICODE_ARABIC_LETTER_WAW_WITH_TWO_DOTS_ABOVE  0x06ca
-#define UNITEXT_ARABIC_LETTER_WAW_WITH_TWO_DOTS_ABOVE  L"\u06ca"
+#define UNITEXT_ARABIC_LETTER_WAW_WITH_TWO_DOTS_ABOVE  U"\u06ca"
 #define UNICODE_ARABIC_LETTER_VE  0x06cb
-#define UNITEXT_ARABIC_LETTER_VE  L"\u06cb"
+#define UNITEXT_ARABIC_LETTER_VE  U"\u06cb"
 #define UNICODE_ARABIC_LETTER_FARSI_YEH  0x06cc
-#define UNITEXT_ARABIC_LETTER_FARSI_YEH  L"\u06cc"
+#define UNITEXT_ARABIC_LETTER_FARSI_YEH  U"\u06cc"
 #define UNICODE_ARABIC_LETTER_YEH_WITH_TAIL  0x06cd
-#define UNITEXT_ARABIC_LETTER_YEH_WITH_TAIL  L"\u06cd"
+#define UNITEXT_ARABIC_LETTER_YEH_WITH_TAIL  U"\u06cd"
 #define UNICODE_ARABIC_LETTER_YEH_WITH_SMALL_V  0x06ce
-#define UNITEXT_ARABIC_LETTER_YEH_WITH_SMALL_V  L"\u06ce"
+#define UNITEXT_ARABIC_LETTER_YEH_WITH_SMALL_V  U"\u06ce"
 #define UNICODE_ARABIC_LETTER_WAW_WITH_DOT_ABOVE  0x06cf
-#define UNITEXT_ARABIC_LETTER_WAW_WITH_DOT_ABOVE  L"\u06cf"
+#define UNITEXT_ARABIC_LETTER_WAW_WITH_DOT_ABOVE  U"\u06cf"
 #define UNICODE_ARABIC_LETTER_E  0x06d0
-#define UNITEXT_ARABIC_LETTER_E  L"\u06d0"
+#define UNITEXT_ARABIC_LETTER_E  U"\u06d0"
 #define UNICODE_ARABIC_LETTER_YEH_WITH_THREE_DOTS_BELOW  0x06d1
-#define UNITEXT_ARABIC_LETTER_YEH_WITH_THREE_DOTS_BELOW  L"\u06d1"
+#define UNITEXT_ARABIC_LETTER_YEH_WITH_THREE_DOTS_BELOW  U"\u06d1"
 #define UNICODE_ARABIC_LETTER_YEH_BARREE  0x06d2
-#define UNITEXT_ARABIC_LETTER_YEH_BARREE  L"\u06d2"
+#define UNITEXT_ARABIC_LETTER_YEH_BARREE  U"\u06d2"
 #define UNICODE_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE  0x06d3
-#define UNITEXT_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE  L"\u06d3"
+#define UNITEXT_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE  U"\u06d3"
 #define UNICODE_ARABIC_FULL_STOP  0x06d4
-#define UNITEXT_ARABIC_FULL_STOP  L"\u06d4"
+#define UNITEXT_ARABIC_FULL_STOP  U"\u06d4"
 #define UNICODE_ARABIC_LETTER_AE  0x06d5
-#define UNITEXT_ARABIC_LETTER_AE  L"\u06d5"
+#define UNITEXT_ARABIC_LETTER_AE  U"\u06d5"
 #define UNICODE_ARABIC_SMALL_HIGH_LIGATURE_SAD_WITH_LAM_WITH_ALEF_MAKSURA  0x06d6
-#define UNITEXT_ARABIC_SMALL_HIGH_LIGATURE_SAD_WITH_LAM_WITH_ALEF_MAKSURA  L"\u06d6"
+#define UNITEXT_ARABIC_SMALL_HIGH_LIGATURE_SAD_WITH_LAM_WITH_ALEF_MAKSURA  U"\u06d6"
 #define UNICODE_ARABIC_SMALL_HIGH_LIGATURE_QAF_WITH_LAM_WITH_ALEF_MAKSURA  0x06d7
-#define UNITEXT_ARABIC_SMALL_HIGH_LIGATURE_QAF_WITH_LAM_WITH_ALEF_MAKSURA  L"\u06d7"
+#define UNITEXT_ARABIC_SMALL_HIGH_LIGATURE_QAF_WITH_LAM_WITH_ALEF_MAKSURA  U"\u06d7"
 #define UNICODE_ARABIC_SMALL_HIGH_MEEM_INITIAL_FORM  0x06d8
-#define UNITEXT_ARABIC_SMALL_HIGH_MEEM_INITIAL_FORM  L"\u06d8"
+#define UNITEXT_ARABIC_SMALL_HIGH_MEEM_INITIAL_FORM  U"\u06d8"
 #define UNICODE_ARABIC_SMALL_HIGH_LAM_ALEF  0x06d9
-#define UNITEXT_ARABIC_SMALL_HIGH_LAM_ALEF  L"\u06d9"
+#define UNITEXT_ARABIC_SMALL_HIGH_LAM_ALEF  U"\u06d9"
 #define UNICODE_ARABIC_SMALL_HIGH_JEEM  0x06da
-#define UNITEXT_ARABIC_SMALL_HIGH_JEEM  L"\u06da"
+#define UNITEXT_ARABIC_SMALL_HIGH_JEEM  U"\u06da"
 #define UNICODE_ARABIC_SMALL_HIGH_THREE_DOTS  0x06db
-#define UNITEXT_ARABIC_SMALL_HIGH_THREE_DOTS  L"\u06db"
+#define UNITEXT_ARABIC_SMALL_HIGH_THREE_DOTS  U"\u06db"
 #define UNICODE_ARABIC_SMALL_HIGH_SEEN  0x06dc
-#define UNITEXT_ARABIC_SMALL_HIGH_SEEN  L"\u06dc"
+#define UNITEXT_ARABIC_SMALL_HIGH_SEEN  U"\u06dc"
 #define UNICODE_ARABIC_END_OF_AYAH  0x06dd
-#define UNITEXT_ARABIC_END_OF_AYAH  L"\u06dd"
+#define UNITEXT_ARABIC_END_OF_AYAH  U"\u06dd"
 #define UNICODE_ARABIC_START_OF_RUB_EL_HIZB  0x06de
-#define UNITEXT_ARABIC_START_OF_RUB_EL_HIZB  L"\u06de"
+#define UNITEXT_ARABIC_START_OF_RUB_EL_HIZB  U"\u06de"
 #define UNICODE_ARABIC_SMALL_HIGH_ROUNDED_ZERO  0x06df
-#define UNITEXT_ARABIC_SMALL_HIGH_ROUNDED_ZERO  L"\u06df"
+#define UNITEXT_ARABIC_SMALL_HIGH_ROUNDED_ZERO  U"\u06df"
 #define UNICODE_ARABIC_SMALL_HIGH_UPRIGHT_RECTANGULAR_ZERO  0x06e0
-#define UNITEXT_ARABIC_SMALL_HIGH_UPRIGHT_RECTANGULAR_ZERO  L"\u06e0"
+#define UNITEXT_ARABIC_SMALL_HIGH_UPRIGHT_RECTANGULAR_ZERO  U"\u06e0"
 #define UNICODE_ARABIC_SMALL_HIGH_DOTLESS_HEAD_OF_KHAH  0x06e1
-#define UNITEXT_ARABIC_SMALL_HIGH_DOTLESS_HEAD_OF_KHAH  L"\u06e1"
+#define UNITEXT_ARABIC_SMALL_HIGH_DOTLESS_HEAD_OF_KHAH  U"\u06e1"
 #define UNICODE_ARABIC_SMALL_HIGH_MEEM_ISOLATED_FORM  0x06e2
-#define UNITEXT_ARABIC_SMALL_HIGH_MEEM_ISOLATED_FORM  L"\u06e2"
+#define UNITEXT_ARABIC_SMALL_HIGH_MEEM_ISOLATED_FORM  U"\u06e2"
 #define UNICODE_ARABIC_SMALL_LOW_SEEN  0x06e3
-#define UNITEXT_ARABIC_SMALL_LOW_SEEN  L"\u06e3"
+#define UNITEXT_ARABIC_SMALL_LOW_SEEN  U"\u06e3"
 #define UNICODE_ARABIC_SMALL_HIGH_MADDA  0x06e4
-#define UNITEXT_ARABIC_SMALL_HIGH_MADDA  L"\u06e4"
+#define UNITEXT_ARABIC_SMALL_HIGH_MADDA  U"\u06e4"
 #define UNICODE_ARABIC_SMALL_WAW  0x06e5
-#define UNITEXT_ARABIC_SMALL_WAW  L"\u06e5"
+#define UNITEXT_ARABIC_SMALL_WAW  U"\u06e5"
 #define UNICODE_ARABIC_SMALL_YEH  0x06e6
-#define UNITEXT_ARABIC_SMALL_YEH  L"\u06e6"
+#define UNITEXT_ARABIC_SMALL_YEH  U"\u06e6"
 #define UNICODE_ARABIC_SMALL_HIGH_YEH  0x06e7
-#define UNITEXT_ARABIC_SMALL_HIGH_YEH  L"\u06e7"
+#define UNITEXT_ARABIC_SMALL_HIGH_YEH  U"\u06e7"
 #define UNICODE_ARABIC_SMALL_HIGH_NOON  0x06e8
-#define UNITEXT_ARABIC_SMALL_HIGH_NOON  L"\u06e8"
+#define UNITEXT_ARABIC_SMALL_HIGH_NOON  U"\u06e8"
 #define UNICODE_ARABIC_PLACE_OF_SAJDAH  0x06e9
-#define UNITEXT_ARABIC_PLACE_OF_SAJDAH  L"\u06e9"
+#define UNITEXT_ARABIC_PLACE_OF_SAJDAH  U"\u06e9"
 #define UNICODE_ARABIC_EMPTY_CENTRE_LOW_STOP  0x06ea
-#define UNITEXT_ARABIC_EMPTY_CENTRE_LOW_STOP  L"\u06ea"
+#define UNITEXT_ARABIC_EMPTY_CENTRE_LOW_STOP  U"\u06ea"
 #define UNICODE_ARABIC_EMPTY_CENTRE_HIGH_STOP  0x06eb
-#define UNITEXT_ARABIC_EMPTY_CENTRE_HIGH_STOP  L"\u06eb"
+#define UNITEXT_ARABIC_EMPTY_CENTRE_HIGH_STOP  U"\u06eb"
 #define UNICODE_ARABIC_ROUNDED_HIGH_STOP_WITH_FILLED_CENTRE  0x06ec
-#define UNITEXT_ARABIC_ROUNDED_HIGH_STOP_WITH_FILLED_CENTRE  L"\u06ec"
+#define UNITEXT_ARABIC_ROUNDED_HIGH_STOP_WITH_FILLED_CENTRE  U"\u06ec"
 #define UNICODE_ARABIC_SMALL_LOW_MEEM  0x06ed
-#define UNITEXT_ARABIC_SMALL_LOW_MEEM  L"\u06ed"
+#define UNITEXT_ARABIC_SMALL_LOW_MEEM  U"\u06ed"
 #define UNICODE_ARABIC_LETTER_DAL_WITH_INVERTED_V  0x06ee
-#define UNITEXT_ARABIC_LETTER_DAL_WITH_INVERTED_V  L"\u06ee"
+#define UNITEXT_ARABIC_LETTER_DAL_WITH_INVERTED_V  U"\u06ee"
 #define UNICODE_ARABIC_LETTER_REH_WITH_INVERTED_V  0x06ef
-#define UNITEXT_ARABIC_LETTER_REH_WITH_INVERTED_V  L"\u06ef"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_INVERTED_V  U"\u06ef"
 #define UNICODE_EXTENDED_ARABIC_INDIC_DIGIT_ZERO  0x06f0
-#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_ZERO  L"\u06f0"
+#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_ZERO  U"\u06f0"
 #define UNICODE_EXTENDED_ARABIC_INDIC_DIGIT_ONE  0x06f1
-#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_ONE  L"\u06f1"
+#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_ONE  U"\u06f1"
 #define UNICODE_EXTENDED_ARABIC_INDIC_DIGIT_TWO  0x06f2
-#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_TWO  L"\u06f2"
+#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_TWO  U"\u06f2"
 #define UNICODE_EXTENDED_ARABIC_INDIC_DIGIT_THREE  0x06f3
-#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_THREE  L"\u06f3"
+#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_THREE  U"\u06f3"
 #define UNICODE_EXTENDED_ARABIC_INDIC_DIGIT_FOUR  0x06f4
-#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_FOUR  L"\u06f4"
+#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_FOUR  U"\u06f4"
 #define UNICODE_EXTENDED_ARABIC_INDIC_DIGIT_FIVE  0x06f5
-#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_FIVE  L"\u06f5"
+#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_FIVE  U"\u06f5"
 #define UNICODE_EXTENDED_ARABIC_INDIC_DIGIT_SIX  0x06f6
-#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_SIX  L"\u06f6"
+#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_SIX  U"\u06f6"
 #define UNICODE_EXTENDED_ARABIC_INDIC_DIGIT_SEVEN  0x06f7
-#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_SEVEN  L"\u06f7"
+#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_SEVEN  U"\u06f7"
 #define UNICODE_EXTENDED_ARABIC_INDIC_DIGIT_EIGHT  0x06f8
-#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_EIGHT  L"\u06f8"
+#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_EIGHT  U"\u06f8"
 #define UNICODE_EXTENDED_ARABIC_INDIC_DIGIT_NINE  0x06f9
-#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_NINE  L"\u06f9"
+#define UNITEXT_EXTENDED_ARABIC_INDIC_DIGIT_NINE  U"\u06f9"
 #define UNICODE_ARABIC_LETTER_SHEEN_WITH_DOT_BELOW  0x06fa
-#define UNITEXT_ARABIC_LETTER_SHEEN_WITH_DOT_BELOW  L"\u06fa"
+#define UNITEXT_ARABIC_LETTER_SHEEN_WITH_DOT_BELOW  U"\u06fa"
 #define UNICODE_ARABIC_LETTER_DAD_WITH_DOT_BELOW  0x06fb
-#define UNITEXT_ARABIC_LETTER_DAD_WITH_DOT_BELOW  L"\u06fb"
+#define UNITEXT_ARABIC_LETTER_DAD_WITH_DOT_BELOW  U"\u06fb"
 #define UNICODE_ARABIC_LETTER_GHAIN_WITH_DOT_BELOW  0x06fc
-#define UNITEXT_ARABIC_LETTER_GHAIN_WITH_DOT_BELOW  L"\u06fc"
+#define UNITEXT_ARABIC_LETTER_GHAIN_WITH_DOT_BELOW  U"\u06fc"
 #define UNICODE_ARABIC_SIGN_SINDHI_AMPERSAND  0x06fd
-#define UNITEXT_ARABIC_SIGN_SINDHI_AMPERSAND  L"\u06fd"
+#define UNITEXT_ARABIC_SIGN_SINDHI_AMPERSAND  U"\u06fd"
 #define UNICODE_ARABIC_SIGN_SINDHI_POSTPOSITION_MEN  0x06fe
-#define UNITEXT_ARABIC_SIGN_SINDHI_POSTPOSITION_MEN  L"\u06fe"
+#define UNITEXT_ARABIC_SIGN_SINDHI_POSTPOSITION_MEN  U"\u06fe"
 #define UNICODE_ARABIC_LETTER_HEH_WITH_INVERTED_V  0x06ff
-#define UNITEXT_ARABIC_LETTER_HEH_WITH_INVERTED_V  L"\u06ff"
+#define UNITEXT_ARABIC_LETTER_HEH_WITH_INVERTED_V  U"\u06ff"
 #define UNICODE_SYRIAC_END_OF_PARAGRAPH  0x0700
-#define UNITEXT_SYRIAC_END_OF_PARAGRAPH  L"\u0700"
+#define UNITEXT_SYRIAC_END_OF_PARAGRAPH  U"\u0700"
 #define UNICODE_SYRIAC_SUPRALINEAR_FULL_STOP  0x0701
-#define UNITEXT_SYRIAC_SUPRALINEAR_FULL_STOP  L"\u0701"
+#define UNITEXT_SYRIAC_SUPRALINEAR_FULL_STOP  U"\u0701"
 #define UNICODE_SYRIAC_SUBLINEAR_FULL_STOP  0x0702
-#define UNITEXT_SYRIAC_SUBLINEAR_FULL_STOP  L"\u0702"
+#define UNITEXT_SYRIAC_SUBLINEAR_FULL_STOP  U"\u0702"
 #define UNICODE_SYRIAC_SUPRALINEAR_COLON  0x0703
-#define UNITEXT_SYRIAC_SUPRALINEAR_COLON  L"\u0703"
+#define UNITEXT_SYRIAC_SUPRALINEAR_COLON  U"\u0703"
 #define UNICODE_SYRIAC_SUBLINEAR_COLON  0x0704
-#define UNITEXT_SYRIAC_SUBLINEAR_COLON  L"\u0704"
+#define UNITEXT_SYRIAC_SUBLINEAR_COLON  U"\u0704"
 #define UNICODE_SYRIAC_HORIZONTAL_COLON  0x0705
-#define UNITEXT_SYRIAC_HORIZONTAL_COLON  L"\u0705"
+#define UNITEXT_SYRIAC_HORIZONTAL_COLON  U"\u0705"
 #define UNICODE_SYRIAC_COLON_SKEWED_LEFT  0x0706
-#define UNITEXT_SYRIAC_COLON_SKEWED_LEFT  L"\u0706"
+#define UNITEXT_SYRIAC_COLON_SKEWED_LEFT  U"\u0706"
 #define UNICODE_SYRIAC_COLON_SKEWED_RIGHT  0x0707
-#define UNITEXT_SYRIAC_COLON_SKEWED_RIGHT  L"\u0707"
+#define UNITEXT_SYRIAC_COLON_SKEWED_RIGHT  U"\u0707"
 #define UNICODE_SYRIAC_SUPRALINEAR_COLON_SKEWED_LEFT  0x0708
-#define UNITEXT_SYRIAC_SUPRALINEAR_COLON_SKEWED_LEFT  L"\u0708"
+#define UNITEXT_SYRIAC_SUPRALINEAR_COLON_SKEWED_LEFT  U"\u0708"
 #define UNICODE_SYRIAC_SUBLINEAR_COLON_SKEWED_RIGHT  0x0709
-#define UNITEXT_SYRIAC_SUBLINEAR_COLON_SKEWED_RIGHT  L"\u0709"
+#define UNITEXT_SYRIAC_SUBLINEAR_COLON_SKEWED_RIGHT  U"\u0709"
 #define UNICODE_SYRIAC_CONTRACTION  0x070a
-#define UNITEXT_SYRIAC_CONTRACTION  L"\u070a"
+#define UNITEXT_SYRIAC_CONTRACTION  U"\u070a"
 #define UNICODE_SYRIAC_HARKLEAN_OBELUS  0x070b
-#define UNITEXT_SYRIAC_HARKLEAN_OBELUS  L"\u070b"
+#define UNITEXT_SYRIAC_HARKLEAN_OBELUS  U"\u070b"
 #define UNICODE_SYRIAC_HARKLEAN_METOBELUS  0x070c
-#define UNITEXT_SYRIAC_HARKLEAN_METOBELUS  L"\u070c"
+#define UNITEXT_SYRIAC_HARKLEAN_METOBELUS  U"\u070c"
 #define UNICODE_SYRIAC_HARKLEAN_ASTERISCUS  0x070d
-#define UNITEXT_SYRIAC_HARKLEAN_ASTERISCUS  L"\u070d"
+#define UNITEXT_SYRIAC_HARKLEAN_ASTERISCUS  U"\u070d"
 #define UNICODE_SYRIAC_ABBREVIATION_MARK  0x070f
-#define UNITEXT_SYRIAC_ABBREVIATION_MARK  L"\u070f"
+#define UNITEXT_SYRIAC_ABBREVIATION_MARK  U"\u070f"
 #define UNICODE_SYRIAC_LETTER_ALAPH  0x0710
-#define UNITEXT_SYRIAC_LETTER_ALAPH  L"\u0710"
+#define UNITEXT_SYRIAC_LETTER_ALAPH  U"\u0710"
 #define UNICODE_SYRIAC_LETTER_SUPERSCRIPT_ALAPH  0x0711
-#define UNITEXT_SYRIAC_LETTER_SUPERSCRIPT_ALAPH  L"\u0711"
+#define UNITEXT_SYRIAC_LETTER_SUPERSCRIPT_ALAPH  U"\u0711"
 #define UNICODE_SYRIAC_LETTER_BETH  0x0712
-#define UNITEXT_SYRIAC_LETTER_BETH  L"\u0712"
+#define UNITEXT_SYRIAC_LETTER_BETH  U"\u0712"
 #define UNICODE_SYRIAC_LETTER_GAMAL  0x0713
-#define UNITEXT_SYRIAC_LETTER_GAMAL  L"\u0713"
+#define UNITEXT_SYRIAC_LETTER_GAMAL  U"\u0713"
 #define UNICODE_SYRIAC_LETTER_GAMAL_GARSHUNI  0x0714
-#define UNITEXT_SYRIAC_LETTER_GAMAL_GARSHUNI  L"\u0714"
+#define UNITEXT_SYRIAC_LETTER_GAMAL_GARSHUNI  U"\u0714"
 #define UNICODE_SYRIAC_LETTER_DALATH  0x0715
-#define UNITEXT_SYRIAC_LETTER_DALATH  L"\u0715"
+#define UNITEXT_SYRIAC_LETTER_DALATH  U"\u0715"
 #define UNICODE_SYRIAC_LETTER_DOTLESS_DALATH_RISH  0x0716
-#define UNITEXT_SYRIAC_LETTER_DOTLESS_DALATH_RISH  L"\u0716"
+#define UNITEXT_SYRIAC_LETTER_DOTLESS_DALATH_RISH  U"\u0716"
 #define UNICODE_SYRIAC_LETTER_HE  0x0717
-#define UNITEXT_SYRIAC_LETTER_HE  L"\u0717"
+#define UNITEXT_SYRIAC_LETTER_HE  U"\u0717"
 #define UNICODE_SYRIAC_LETTER_WAW  0x0718
-#define UNITEXT_SYRIAC_LETTER_WAW  L"\u0718"
+#define UNITEXT_SYRIAC_LETTER_WAW  U"\u0718"
 #define UNICODE_SYRIAC_LETTER_ZAIN  0x0719
-#define UNITEXT_SYRIAC_LETTER_ZAIN  L"\u0719"
+#define UNITEXT_SYRIAC_LETTER_ZAIN  U"\u0719"
 #define UNICODE_SYRIAC_LETTER_HETH  0x071a
-#define UNITEXT_SYRIAC_LETTER_HETH  L"\u071a"
+#define UNITEXT_SYRIAC_LETTER_HETH  U"\u071a"
 #define UNICODE_SYRIAC_LETTER_TETH  0x071b
-#define UNITEXT_SYRIAC_LETTER_TETH  L"\u071b"
+#define UNITEXT_SYRIAC_LETTER_TETH  U"\u071b"
 #define UNICODE_SYRIAC_LETTER_TETH_GARSHUNI  0x071c
-#define UNITEXT_SYRIAC_LETTER_TETH_GARSHUNI  L"\u071c"
+#define UNITEXT_SYRIAC_LETTER_TETH_GARSHUNI  U"\u071c"
 #define UNICODE_SYRIAC_LETTER_YUDH  0x071d
-#define UNITEXT_SYRIAC_LETTER_YUDH  L"\u071d"
+#define UNITEXT_SYRIAC_LETTER_YUDH  U"\u071d"
 #define UNICODE_SYRIAC_LETTER_YUDH_HE  0x071e
-#define UNITEXT_SYRIAC_LETTER_YUDH_HE  L"\u071e"
+#define UNITEXT_SYRIAC_LETTER_YUDH_HE  U"\u071e"
 #define UNICODE_SYRIAC_LETTER_KAPH  0x071f
-#define UNITEXT_SYRIAC_LETTER_KAPH  L"\u071f"
+#define UNITEXT_SYRIAC_LETTER_KAPH  U"\u071f"
 #define UNICODE_SYRIAC_LETTER_LAMADH  0x0720
-#define UNITEXT_SYRIAC_LETTER_LAMADH  L"\u0720"
+#define UNITEXT_SYRIAC_LETTER_LAMADH  U"\u0720"
 #define UNICODE_SYRIAC_LETTER_MIM  0x0721
-#define UNITEXT_SYRIAC_LETTER_MIM  L"\u0721"
+#define UNITEXT_SYRIAC_LETTER_MIM  U"\u0721"
 #define UNICODE_SYRIAC_LETTER_NUN  0x0722
-#define UNITEXT_SYRIAC_LETTER_NUN  L"\u0722"
+#define UNITEXT_SYRIAC_LETTER_NUN  U"\u0722"
 #define UNICODE_SYRIAC_LETTER_SEMKATH  0x0723
-#define UNITEXT_SYRIAC_LETTER_SEMKATH  L"\u0723"
+#define UNITEXT_SYRIAC_LETTER_SEMKATH  U"\u0723"
 #define UNICODE_SYRIAC_LETTER_FINAL_SEMKATH  0x0724
-#define UNITEXT_SYRIAC_LETTER_FINAL_SEMKATH  L"\u0724"
+#define UNITEXT_SYRIAC_LETTER_FINAL_SEMKATH  U"\u0724"
 #define UNICODE_SYRIAC_LETTER_E  0x0725
-#define UNITEXT_SYRIAC_LETTER_E  L"\u0725"
+#define UNITEXT_SYRIAC_LETTER_E  U"\u0725"
 #define UNICODE_SYRIAC_LETTER_PE  0x0726
-#define UNITEXT_SYRIAC_LETTER_PE  L"\u0726"
+#define UNITEXT_SYRIAC_LETTER_PE  U"\u0726"
 #define UNICODE_SYRIAC_LETTER_REVERSED_PE  0x0727
-#define UNITEXT_SYRIAC_LETTER_REVERSED_PE  L"\u0727"
+#define UNITEXT_SYRIAC_LETTER_REVERSED_PE  U"\u0727"
 #define UNICODE_SYRIAC_LETTER_SADHE  0x0728
-#define UNITEXT_SYRIAC_LETTER_SADHE  L"\u0728"
+#define UNITEXT_SYRIAC_LETTER_SADHE  U"\u0728"
 #define UNICODE_SYRIAC_LETTER_QAPH  0x0729
-#define UNITEXT_SYRIAC_LETTER_QAPH  L"\u0729"
+#define UNITEXT_SYRIAC_LETTER_QAPH  U"\u0729"
 #define UNICODE_SYRIAC_LETTER_RISH  0x072a
-#define UNITEXT_SYRIAC_LETTER_RISH  L"\u072a"
+#define UNITEXT_SYRIAC_LETTER_RISH  U"\u072a"
 #define UNICODE_SYRIAC_LETTER_SHIN  0x072b
-#define UNITEXT_SYRIAC_LETTER_SHIN  L"\u072b"
+#define UNITEXT_SYRIAC_LETTER_SHIN  U"\u072b"
 #define UNICODE_SYRIAC_LETTER_TAW  0x072c
-#define UNITEXT_SYRIAC_LETTER_TAW  L"\u072c"
+#define UNITEXT_SYRIAC_LETTER_TAW  U"\u072c"
 #define UNICODE_SYRIAC_LETTER_PERSIAN_BHETH  0x072d
-#define UNITEXT_SYRIAC_LETTER_PERSIAN_BHETH  L"\u072d"
+#define UNITEXT_SYRIAC_LETTER_PERSIAN_BHETH  U"\u072d"
 #define UNICODE_SYRIAC_LETTER_PERSIAN_GHAMAL  0x072e
-#define UNITEXT_SYRIAC_LETTER_PERSIAN_GHAMAL  L"\u072e"
+#define UNITEXT_SYRIAC_LETTER_PERSIAN_GHAMAL  U"\u072e"
 #define UNICODE_SYRIAC_LETTER_PERSIAN_DHALATH  0x072f
-#define UNITEXT_SYRIAC_LETTER_PERSIAN_DHALATH  L"\u072f"
+#define UNITEXT_SYRIAC_LETTER_PERSIAN_DHALATH  U"\u072f"
 #define UNICODE_SYRIAC_PTHAHA_ABOVE  0x0730
-#define UNITEXT_SYRIAC_PTHAHA_ABOVE  L"\u0730"
+#define UNITEXT_SYRIAC_PTHAHA_ABOVE  U"\u0730"
 #define UNICODE_SYRIAC_PTHAHA_BELOW  0x0731
-#define UNITEXT_SYRIAC_PTHAHA_BELOW  L"\u0731"
+#define UNITEXT_SYRIAC_PTHAHA_BELOW  U"\u0731"
 #define UNICODE_SYRIAC_PTHAHA_DOTTED  0x0732
-#define UNITEXT_SYRIAC_PTHAHA_DOTTED  L"\u0732"
+#define UNITEXT_SYRIAC_PTHAHA_DOTTED  U"\u0732"
 #define UNICODE_SYRIAC_ZQAPHA_ABOVE  0x0733
-#define UNITEXT_SYRIAC_ZQAPHA_ABOVE  L"\u0733"
+#define UNITEXT_SYRIAC_ZQAPHA_ABOVE  U"\u0733"
 #define UNICODE_SYRIAC_ZQAPHA_BELOW  0x0734
-#define UNITEXT_SYRIAC_ZQAPHA_BELOW  L"\u0734"
+#define UNITEXT_SYRIAC_ZQAPHA_BELOW  U"\u0734"
 #define UNICODE_SYRIAC_ZQAPHA_DOTTED  0x0735
-#define UNITEXT_SYRIAC_ZQAPHA_DOTTED  L"\u0735"
+#define UNITEXT_SYRIAC_ZQAPHA_DOTTED  U"\u0735"
 #define UNICODE_SYRIAC_RBASA_ABOVE  0x0736
-#define UNITEXT_SYRIAC_RBASA_ABOVE  L"\u0736"
+#define UNITEXT_SYRIAC_RBASA_ABOVE  U"\u0736"
 #define UNICODE_SYRIAC_RBASA_BELOW  0x0737
-#define UNITEXT_SYRIAC_RBASA_BELOW  L"\u0737"
+#define UNITEXT_SYRIAC_RBASA_BELOW  U"\u0737"
 #define UNICODE_SYRIAC_DOTTED_ZLAMA_HORIZONTAL  0x0738
-#define UNITEXT_SYRIAC_DOTTED_ZLAMA_HORIZONTAL  L"\u0738"
+#define UNITEXT_SYRIAC_DOTTED_ZLAMA_HORIZONTAL  U"\u0738"
 #define UNICODE_SYRIAC_DOTTED_ZLAMA_ANGULAR  0x0739
-#define UNITEXT_SYRIAC_DOTTED_ZLAMA_ANGULAR  L"\u0739"
+#define UNITEXT_SYRIAC_DOTTED_ZLAMA_ANGULAR  U"\u0739"
 #define UNICODE_SYRIAC_HBASA_ABOVE  0x073a
-#define UNITEXT_SYRIAC_HBASA_ABOVE  L"\u073a"
+#define UNITEXT_SYRIAC_HBASA_ABOVE  U"\u073a"
 #define UNICODE_SYRIAC_HBASA_BELOW  0x073b
-#define UNITEXT_SYRIAC_HBASA_BELOW  L"\u073b"
+#define UNITEXT_SYRIAC_HBASA_BELOW  U"\u073b"
 #define UNICODE_SYRIAC_HBASA_ESASA_DOTTED  0x073c
-#define UNITEXT_SYRIAC_HBASA_ESASA_DOTTED  L"\u073c"
+#define UNITEXT_SYRIAC_HBASA_ESASA_DOTTED  U"\u073c"
 #define UNICODE_SYRIAC_ESASA_ABOVE  0x073d
-#define UNITEXT_SYRIAC_ESASA_ABOVE  L"\u073d"
+#define UNITEXT_SYRIAC_ESASA_ABOVE  U"\u073d"
 #define UNICODE_SYRIAC_ESASA_BELOW  0x073e
-#define UNITEXT_SYRIAC_ESASA_BELOW  L"\u073e"
+#define UNITEXT_SYRIAC_ESASA_BELOW  U"\u073e"
 #define UNICODE_SYRIAC_RWAHA  0x073f
-#define UNITEXT_SYRIAC_RWAHA  L"\u073f"
+#define UNITEXT_SYRIAC_RWAHA  U"\u073f"
 #define UNICODE_SYRIAC_FEMININE_DOT  0x0740
-#define UNITEXT_SYRIAC_FEMININE_DOT  L"\u0740"
+#define UNITEXT_SYRIAC_FEMININE_DOT  U"\u0740"
 #define UNICODE_SYRIAC_QUSHSHAYA  0x0741
-#define UNITEXT_SYRIAC_QUSHSHAYA  L"\u0741"
+#define UNITEXT_SYRIAC_QUSHSHAYA  U"\u0741"
 #define UNICODE_SYRIAC_RUKKAKHA  0x0742
-#define UNITEXT_SYRIAC_RUKKAKHA  L"\u0742"
+#define UNITEXT_SYRIAC_RUKKAKHA  U"\u0742"
 #define UNICODE_SYRIAC_TWO_VERTICAL_DOTS_ABOVE  0x0743
-#define UNITEXT_SYRIAC_TWO_VERTICAL_DOTS_ABOVE  L"\u0743"
+#define UNITEXT_SYRIAC_TWO_VERTICAL_DOTS_ABOVE  U"\u0743"
 #define UNICODE_SYRIAC_TWO_VERTICAL_DOTS_BELOW  0x0744
-#define UNITEXT_SYRIAC_TWO_VERTICAL_DOTS_BELOW  L"\u0744"
+#define UNITEXT_SYRIAC_TWO_VERTICAL_DOTS_BELOW  U"\u0744"
 #define UNICODE_SYRIAC_THREE_DOTS_ABOVE  0x0745
-#define UNITEXT_SYRIAC_THREE_DOTS_ABOVE  L"\u0745"
+#define UNITEXT_SYRIAC_THREE_DOTS_ABOVE  U"\u0745"
 #define UNICODE_SYRIAC_THREE_DOTS_BELOW  0x0746
-#define UNITEXT_SYRIAC_THREE_DOTS_BELOW  L"\u0746"
+#define UNITEXT_SYRIAC_THREE_DOTS_BELOW  U"\u0746"
 #define UNICODE_SYRIAC_OBLIQUE_LINE_ABOVE  0x0747
-#define UNITEXT_SYRIAC_OBLIQUE_LINE_ABOVE  L"\u0747"
+#define UNITEXT_SYRIAC_OBLIQUE_LINE_ABOVE  U"\u0747"
 #define UNICODE_SYRIAC_OBLIQUE_LINE_BELOW  0x0748
-#define UNITEXT_SYRIAC_OBLIQUE_LINE_BELOW  L"\u0748"
+#define UNITEXT_SYRIAC_OBLIQUE_LINE_BELOW  U"\u0748"
 #define UNICODE_SYRIAC_MUSIC  0x0749
-#define UNITEXT_SYRIAC_MUSIC  L"\u0749"
+#define UNITEXT_SYRIAC_MUSIC  U"\u0749"
 #define UNICODE_SYRIAC_BARREKH  0x074a
-#define UNITEXT_SYRIAC_BARREKH  L"\u074a"
+#define UNITEXT_SYRIAC_BARREKH  U"\u074a"
 #define UNICODE_SYRIAC_LETTER_SOGDIAN_ZHAIN  0x074d
-#define UNITEXT_SYRIAC_LETTER_SOGDIAN_ZHAIN  L"\u074d"
+#define UNITEXT_SYRIAC_LETTER_SOGDIAN_ZHAIN  U"\u074d"
 #define UNICODE_SYRIAC_LETTER_SOGDIAN_KHAPH  0x074e
-#define UNITEXT_SYRIAC_LETTER_SOGDIAN_KHAPH  L"\u074e"
+#define UNITEXT_SYRIAC_LETTER_SOGDIAN_KHAPH  U"\u074e"
 #define UNICODE_SYRIAC_LETTER_SOGDIAN_FE  0x074f
-#define UNITEXT_SYRIAC_LETTER_SOGDIAN_FE  L"\u074f"
+#define UNITEXT_SYRIAC_LETTER_SOGDIAN_FE  U"\u074f"
 #define UNICODE_ARABIC_LETTER_BEH_WITH_THREE_DOTS_HORIZONTALLY_BELOW  0x0750
-#define UNITEXT_ARABIC_LETTER_BEH_WITH_THREE_DOTS_HORIZONTALLY_BELOW  L"\u0750"
+#define UNITEXT_ARABIC_LETTER_BEH_WITH_THREE_DOTS_HORIZONTALLY_BELOW  U"\u0750"
 #define UNICODE_ARABIC_LETTER_BEH_WITH_DOT_BELOW_AND_THREE_DOTS_ABOVE  0x0751
-#define UNITEXT_ARABIC_LETTER_BEH_WITH_DOT_BELOW_AND_THREE_DOTS_ABOVE  L"\u0751"
+#define UNITEXT_ARABIC_LETTER_BEH_WITH_DOT_BELOW_AND_THREE_DOTS_ABOVE  U"\u0751"
 #define UNICODE_ARABIC_LETTER_BEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  0x0752
-#define UNITEXT_ARABIC_LETTER_BEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  L"\u0752"
+#define UNITEXT_ARABIC_LETTER_BEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  U"\u0752"
 #define UNICODE_ARABIC_LETTER_BEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW_AND_TWO_DOTS_ABOVE  0x0753
-#define UNITEXT_ARABIC_LETTER_BEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW_AND_TWO_DOTS_ABOVE  L"\u0753"
+#define UNITEXT_ARABIC_LETTER_BEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW_AND_TWO_DOTS_ABOVE  U"\u0753"
 #define UNICODE_ARABIC_LETTER_BEH_WITH_TWO_DOTS_BELOW_AND_DOT_ABOVE  0x0754
-#define UNITEXT_ARABIC_LETTER_BEH_WITH_TWO_DOTS_BELOW_AND_DOT_ABOVE  L"\u0754"
+#define UNITEXT_ARABIC_LETTER_BEH_WITH_TWO_DOTS_BELOW_AND_DOT_ABOVE  U"\u0754"
 #define UNICODE_ARABIC_LETTER_BEH_WITH_INVERTED_SMALL_V_BELOW  0x0755
-#define UNITEXT_ARABIC_LETTER_BEH_WITH_INVERTED_SMALL_V_BELOW  L"\u0755"
+#define UNITEXT_ARABIC_LETTER_BEH_WITH_INVERTED_SMALL_V_BELOW  U"\u0755"
 #define UNICODE_ARABIC_LETTER_BEH_WITH_SMALL_V  0x0756
-#define UNITEXT_ARABIC_LETTER_BEH_WITH_SMALL_V  L"\u0756"
+#define UNITEXT_ARABIC_LETTER_BEH_WITH_SMALL_V  U"\u0756"
 #define UNICODE_ARABIC_LETTER_HAH_WITH_TWO_DOTS_ABOVE  0x0757
-#define UNITEXT_ARABIC_LETTER_HAH_WITH_TWO_DOTS_ABOVE  L"\u0757"
+#define UNITEXT_ARABIC_LETTER_HAH_WITH_TWO_DOTS_ABOVE  U"\u0757"
 #define UNICODE_ARABIC_LETTER_HAH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  0x0758
-#define UNITEXT_ARABIC_LETTER_HAH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  L"\u0758"
+#define UNITEXT_ARABIC_LETTER_HAH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  U"\u0758"
 #define UNICODE_ARABIC_LETTER_DAL_WITH_TWO_DOTS_VERTICALLY_BELOW_AND_SMALL_TAH  0x0759
-#define UNITEXT_ARABIC_LETTER_DAL_WITH_TWO_DOTS_VERTICALLY_BELOW_AND_SMALL_TAH  L"\u0759"
+#define UNITEXT_ARABIC_LETTER_DAL_WITH_TWO_DOTS_VERTICALLY_BELOW_AND_SMALL_TAH  U"\u0759"
 #define UNICODE_ARABIC_LETTER_DAL_WITH_INVERTED_SMALL_V_BELOW  0x075a
-#define UNITEXT_ARABIC_LETTER_DAL_WITH_INVERTED_SMALL_V_BELOW  L"\u075a"
+#define UNITEXT_ARABIC_LETTER_DAL_WITH_INVERTED_SMALL_V_BELOW  U"\u075a"
 #define UNICODE_ARABIC_LETTER_REH_WITH_STROKE  0x075b
-#define UNITEXT_ARABIC_LETTER_REH_WITH_STROKE  L"\u075b"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_STROKE  U"\u075b"
 #define UNICODE_ARABIC_LETTER_SEEN_WITH_FOUR_DOTS_ABOVE  0x075c
-#define UNITEXT_ARABIC_LETTER_SEEN_WITH_FOUR_DOTS_ABOVE  L"\u075c"
+#define UNITEXT_ARABIC_LETTER_SEEN_WITH_FOUR_DOTS_ABOVE  U"\u075c"
 #define UNICODE_ARABIC_LETTER_AIN_WITH_TWO_DOTS_ABOVE  0x075d
-#define UNITEXT_ARABIC_LETTER_AIN_WITH_TWO_DOTS_ABOVE  L"\u075d"
+#define UNITEXT_ARABIC_LETTER_AIN_WITH_TWO_DOTS_ABOVE  U"\u075d"
 #define UNICODE_ARABIC_LETTER_AIN_WITH_THREE_DOTS_POINTING_DOWNWARDS_ABOVE  0x075e
-#define UNITEXT_ARABIC_LETTER_AIN_WITH_THREE_DOTS_POINTING_DOWNWARDS_ABOVE  L"\u075e"
+#define UNITEXT_ARABIC_LETTER_AIN_WITH_THREE_DOTS_POINTING_DOWNWARDS_ABOVE  U"\u075e"
 #define UNICODE_ARABIC_LETTER_AIN_WITH_TWO_DOTS_VERTICALLY_ABOVE  0x075f
-#define UNITEXT_ARABIC_LETTER_AIN_WITH_TWO_DOTS_VERTICALLY_ABOVE  L"\u075f"
+#define UNITEXT_ARABIC_LETTER_AIN_WITH_TWO_DOTS_VERTICALLY_ABOVE  U"\u075f"
 #define UNICODE_ARABIC_LETTER_FEH_WITH_TWO_DOTS_BELOW  0x0760
-#define UNITEXT_ARABIC_LETTER_FEH_WITH_TWO_DOTS_BELOW  L"\u0760"
+#define UNITEXT_ARABIC_LETTER_FEH_WITH_TWO_DOTS_BELOW  U"\u0760"
 #define UNICODE_ARABIC_LETTER_FEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  0x0761
-#define UNITEXT_ARABIC_LETTER_FEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  L"\u0761"
+#define UNITEXT_ARABIC_LETTER_FEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  U"\u0761"
 #define UNICODE_ARABIC_LETTER_KEHEH_WITH_DOT_ABOVE  0x0762
-#define UNITEXT_ARABIC_LETTER_KEHEH_WITH_DOT_ABOVE  L"\u0762"
+#define UNITEXT_ARABIC_LETTER_KEHEH_WITH_DOT_ABOVE  U"\u0762"
 #define UNICODE_ARABIC_LETTER_KEHEH_WITH_THREE_DOTS_ABOVE  0x0763
-#define UNITEXT_ARABIC_LETTER_KEHEH_WITH_THREE_DOTS_ABOVE  L"\u0763"
+#define UNITEXT_ARABIC_LETTER_KEHEH_WITH_THREE_DOTS_ABOVE  U"\u0763"
 #define UNICODE_ARABIC_LETTER_KEHEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  0x0764
-#define UNITEXT_ARABIC_LETTER_KEHEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  L"\u0764"
+#define UNITEXT_ARABIC_LETTER_KEHEH_WITH_THREE_DOTS_POINTING_UPWARDS_BELOW  U"\u0764"
 #define UNICODE_ARABIC_LETTER_MEEM_WITH_DOT_ABOVE  0x0765
-#define UNITEXT_ARABIC_LETTER_MEEM_WITH_DOT_ABOVE  L"\u0765"
+#define UNITEXT_ARABIC_LETTER_MEEM_WITH_DOT_ABOVE  U"\u0765"
 #define UNICODE_ARABIC_LETTER_MEEM_WITH_DOT_BELOW  0x0766
-#define UNITEXT_ARABIC_LETTER_MEEM_WITH_DOT_BELOW  L"\u0766"
+#define UNITEXT_ARABIC_LETTER_MEEM_WITH_DOT_BELOW  U"\u0766"
 #define UNICODE_ARABIC_LETTER_NOON_WITH_TWO_DOTS_BELOW  0x0767
-#define UNITEXT_ARABIC_LETTER_NOON_WITH_TWO_DOTS_BELOW  L"\u0767"
+#define UNITEXT_ARABIC_LETTER_NOON_WITH_TWO_DOTS_BELOW  U"\u0767"
 #define UNICODE_ARABIC_LETTER_NOON_WITH_SMALL_TAH  0x0768
-#define UNITEXT_ARABIC_LETTER_NOON_WITH_SMALL_TAH  L"\u0768"
+#define UNITEXT_ARABIC_LETTER_NOON_WITH_SMALL_TAH  U"\u0768"
 #define UNICODE_ARABIC_LETTER_NOON_WITH_SMALL_V  0x0769
-#define UNITEXT_ARABIC_LETTER_NOON_WITH_SMALL_V  L"\u0769"
+#define UNITEXT_ARABIC_LETTER_NOON_WITH_SMALL_V  U"\u0769"
 #define UNICODE_ARABIC_LETTER_LAM_WITH_BAR  0x076a
-#define UNITEXT_ARABIC_LETTER_LAM_WITH_BAR  L"\u076a"
+#define UNITEXT_ARABIC_LETTER_LAM_WITH_BAR  U"\u076a"
 #define UNICODE_ARABIC_LETTER_REH_WITH_TWO_DOTS_VERTICALLY_ABOVE  0x076b
-#define UNITEXT_ARABIC_LETTER_REH_WITH_TWO_DOTS_VERTICALLY_ABOVE  L"\u076b"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_TWO_DOTS_VERTICALLY_ABOVE  U"\u076b"
 #define UNICODE_ARABIC_LETTER_REH_WITH_HAMZA_ABOVE  0x076c
-#define UNITEXT_ARABIC_LETTER_REH_WITH_HAMZA_ABOVE  L"\u076c"
+#define UNITEXT_ARABIC_LETTER_REH_WITH_HAMZA_ABOVE  U"\u076c"
 #define UNICODE_ARABIC_LETTER_SEEN_WITH_TWO_DOTS_VERTICALLY_ABOVE  0x076d
-#define UNITEXT_ARABIC_LETTER_SEEN_WITH_TWO_DOTS_VERTICALLY_ABOVE  L"\u076d"
+#define UNITEXT_ARABIC_LETTER_SEEN_WITH_TWO_DOTS_VERTICALLY_ABOVE  U"\u076d"
 #define UNICODE_THAANA_LETTER_HAA  0x0780
-#define UNITEXT_THAANA_LETTER_HAA  L"\u0780"
+#define UNITEXT_THAANA_LETTER_HAA  U"\u0780"
 #define UNICODE_THAANA_LETTER_SHAVIYANI  0x0781
-#define UNITEXT_THAANA_LETTER_SHAVIYANI  L"\u0781"
+#define UNITEXT_THAANA_LETTER_SHAVIYANI  U"\u0781"
 #define UNICODE_THAANA_LETTER_NOONU  0x0782
-#define UNITEXT_THAANA_LETTER_NOONU  L"\u0782"
+#define UNITEXT_THAANA_LETTER_NOONU  U"\u0782"
 #define UNICODE_THAANA_LETTER_RAA  0x0783
-#define UNITEXT_THAANA_LETTER_RAA  L"\u0783"
+#define UNITEXT_THAANA_LETTER_RAA  U"\u0783"
 #define UNICODE_THAANA_LETTER_BAA  0x0784
-#define UNITEXT_THAANA_LETTER_BAA  L"\u0784"
+#define UNITEXT_THAANA_LETTER_BAA  U"\u0784"
 #define UNICODE_THAANA_LETTER_LHAVIYANI  0x0785
-#define UNITEXT_THAANA_LETTER_LHAVIYANI  L"\u0785"
+#define UNITEXT_THAANA_LETTER_LHAVIYANI  U"\u0785"
 #define UNICODE_THAANA_LETTER_KAAFU  0x0786
-#define UNITEXT_THAANA_LETTER_KAAFU  L"\u0786"
+#define UNITEXT_THAANA_LETTER_KAAFU  U"\u0786"
 #define UNICODE_THAANA_LETTER_ALIFU  0x0787
-#define UNITEXT_THAANA_LETTER_ALIFU  L"\u0787"
+#define UNITEXT_THAANA_LETTER_ALIFU  U"\u0787"
 #define UNICODE_THAANA_LETTER_VAAVU  0x0788
-#define UNITEXT_THAANA_LETTER_VAAVU  L"\u0788"
+#define UNITEXT_THAANA_LETTER_VAAVU  U"\u0788"
 #define UNICODE_THAANA_LETTER_MEEMU  0x0789
-#define UNITEXT_THAANA_LETTER_MEEMU  L"\u0789"
+#define UNITEXT_THAANA_LETTER_MEEMU  U"\u0789"
 #define UNICODE_THAANA_LETTER_FAAFU  0x078a
-#define UNITEXT_THAANA_LETTER_FAAFU  L"\u078a"
+#define UNITEXT_THAANA_LETTER_FAAFU  U"\u078a"
 #define UNICODE_THAANA_LETTER_DHAALU  0x078b
-#define UNITEXT_THAANA_LETTER_DHAALU  L"\u078b"
+#define UNITEXT_THAANA_LETTER_DHAALU  U"\u078b"
 #define UNICODE_THAANA_LETTER_THAA  0x078c
-#define UNITEXT_THAANA_LETTER_THAA  L"\u078c"
+#define UNITEXT_THAANA_LETTER_THAA  U"\u078c"
 #define UNICODE_THAANA_LETTER_LAAMU  0x078d
-#define UNITEXT_THAANA_LETTER_LAAMU  L"\u078d"
+#define UNITEXT_THAANA_LETTER_LAAMU  U"\u078d"
 #define UNICODE_THAANA_LETTER_GAAFU  0x078e
-#define UNITEXT_THAANA_LETTER_GAAFU  L"\u078e"
+#define UNITEXT_THAANA_LETTER_GAAFU  U"\u078e"
 #define UNICODE_THAANA_LETTER_GNAVIYANI  0x078f
-#define UNITEXT_THAANA_LETTER_GNAVIYANI  L"\u078f"
+#define UNITEXT_THAANA_LETTER_GNAVIYANI  U"\u078f"
 #define UNICODE_THAANA_LETTER_SEENU  0x0790
-#define UNITEXT_THAANA_LETTER_SEENU  L"\u0790"
+#define UNITEXT_THAANA_LETTER_SEENU  U"\u0790"
 #define UNICODE_THAANA_LETTER_DAVIYANI  0x0791
-#define UNITEXT_THAANA_LETTER_DAVIYANI  L"\u0791"
+#define UNITEXT_THAANA_LETTER_DAVIYANI  U"\u0791"
 #define UNICODE_THAANA_LETTER_ZAVIYANI  0x0792
-#define UNITEXT_THAANA_LETTER_ZAVIYANI  L"\u0792"
+#define UNITEXT_THAANA_LETTER_ZAVIYANI  U"\u0792"
 #define UNICODE_THAANA_LETTER_TAVIYANI  0x0793
-#define UNITEXT_THAANA_LETTER_TAVIYANI  L"\u0793"
+#define UNITEXT_THAANA_LETTER_TAVIYANI  U"\u0793"
 #define UNICODE_THAANA_LETTER_YAA  0x0794
-#define UNITEXT_THAANA_LETTER_YAA  L"\u0794"
+#define UNITEXT_THAANA_LETTER_YAA  U"\u0794"
 #define UNICODE_THAANA_LETTER_PAVIYANI  0x0795
-#define UNITEXT_THAANA_LETTER_PAVIYANI  L"\u0795"
+#define UNITEXT_THAANA_LETTER_PAVIYANI  U"\u0795"
 #define UNICODE_THAANA_LETTER_JAVIYANI  0x0796
-#define UNITEXT_THAANA_LETTER_JAVIYANI  L"\u0796"
+#define UNITEXT_THAANA_LETTER_JAVIYANI  U"\u0796"
 #define UNICODE_THAANA_LETTER_CHAVIYANI  0x0797
-#define UNITEXT_THAANA_LETTER_CHAVIYANI  L"\u0797"
+#define UNITEXT_THAANA_LETTER_CHAVIYANI  U"\u0797"
 #define UNICODE_THAANA_LETTER_TTAA  0x0798
-#define UNITEXT_THAANA_LETTER_TTAA  L"\u0798"
+#define UNITEXT_THAANA_LETTER_TTAA  U"\u0798"
 #define UNICODE_THAANA_LETTER_HHAA  0x0799
-#define UNITEXT_THAANA_LETTER_HHAA  L"\u0799"
+#define UNITEXT_THAANA_LETTER_HHAA  U"\u0799"
 #define UNICODE_THAANA_LETTER_KHAA  0x079a
-#define UNITEXT_THAANA_LETTER_KHAA  L"\u079a"
+#define UNITEXT_THAANA_LETTER_KHAA  U"\u079a"
 #define UNICODE_THAANA_LETTER_THAALU  0x079b
-#define UNITEXT_THAANA_LETTER_THAALU  L"\u079b"
+#define UNITEXT_THAANA_LETTER_THAALU  U"\u079b"
 #define UNICODE_THAANA_LETTER_ZAA  0x079c
-#define UNITEXT_THAANA_LETTER_ZAA  L"\u079c"
+#define UNITEXT_THAANA_LETTER_ZAA  U"\u079c"
 #define UNICODE_THAANA_LETTER_SHEENU  0x079d
-#define UNITEXT_THAANA_LETTER_SHEENU  L"\u079d"
+#define UNITEXT_THAANA_LETTER_SHEENU  U"\u079d"
 #define UNICODE_THAANA_LETTER_SAADHU  0x079e
-#define UNITEXT_THAANA_LETTER_SAADHU  L"\u079e"
+#define UNITEXT_THAANA_LETTER_SAADHU  U"\u079e"
 #define UNICODE_THAANA_LETTER_DAADHU  0x079f
-#define UNITEXT_THAANA_LETTER_DAADHU  L"\u079f"
+#define UNITEXT_THAANA_LETTER_DAADHU  U"\u079f"
 #define UNICODE_THAANA_LETTER_TO  0x07a0
-#define UNITEXT_THAANA_LETTER_TO  L"\u07a0"
+#define UNITEXT_THAANA_LETTER_TO  U"\u07a0"
 #define UNICODE_THAANA_LETTER_ZO  0x07a1
-#define UNITEXT_THAANA_LETTER_ZO  L"\u07a1"
+#define UNITEXT_THAANA_LETTER_ZO  U"\u07a1"
 #define UNICODE_THAANA_LETTER_AINU  0x07a2
-#define UNITEXT_THAANA_LETTER_AINU  L"\u07a2"
+#define UNITEXT_THAANA_LETTER_AINU  U"\u07a2"
 #define UNICODE_THAANA_LETTER_GHAINU  0x07a3
-#define UNITEXT_THAANA_LETTER_GHAINU  L"\u07a3"
+#define UNITEXT_THAANA_LETTER_GHAINU  U"\u07a3"
 #define UNICODE_THAANA_LETTER_QAAFU  0x07a4
-#define UNITEXT_THAANA_LETTER_QAAFU  L"\u07a4"
+#define UNITEXT_THAANA_LETTER_QAAFU  U"\u07a4"
 #define UNICODE_THAANA_LETTER_WAAVU  0x07a5
-#define UNITEXT_THAANA_LETTER_WAAVU  L"\u07a5"
+#define UNITEXT_THAANA_LETTER_WAAVU  U"\u07a5"
 #define UNICODE_THAANA_ABAFILI  0x07a6
-#define UNITEXT_THAANA_ABAFILI  L"\u07a6"
+#define UNITEXT_THAANA_ABAFILI  U"\u07a6"
 #define UNICODE_THAANA_AABAAFILI  0x07a7
-#define UNITEXT_THAANA_AABAAFILI  L"\u07a7"
+#define UNITEXT_THAANA_AABAAFILI  U"\u07a7"
 #define UNICODE_THAANA_IBIFILI  0x07a8
-#define UNITEXT_THAANA_IBIFILI  L"\u07a8"
+#define UNITEXT_THAANA_IBIFILI  U"\u07a8"
 #define UNICODE_THAANA_EEBEEFILI  0x07a9
-#define UNITEXT_THAANA_EEBEEFILI  L"\u07a9"
+#define UNITEXT_THAANA_EEBEEFILI  U"\u07a9"
 #define UNICODE_THAANA_UBUFILI  0x07aa
-#define UNITEXT_THAANA_UBUFILI  L"\u07aa"
+#define UNITEXT_THAANA_UBUFILI  U"\u07aa"
 #define UNICODE_THAANA_OOBOOFILI  0x07ab
-#define UNITEXT_THAANA_OOBOOFILI  L"\u07ab"
+#define UNITEXT_THAANA_OOBOOFILI  U"\u07ab"
 #define UNICODE_THAANA_EBEFILI  0x07ac
-#define UNITEXT_THAANA_EBEFILI  L"\u07ac"
+#define UNITEXT_THAANA_EBEFILI  U"\u07ac"
 #define UNICODE_THAANA_EYBEYFILI  0x07ad
-#define UNITEXT_THAANA_EYBEYFILI  L"\u07ad"
+#define UNITEXT_THAANA_EYBEYFILI  U"\u07ad"
 #define UNICODE_THAANA_OBOFILI  0x07ae
-#define UNITEXT_THAANA_OBOFILI  L"\u07ae"
+#define UNITEXT_THAANA_OBOFILI  U"\u07ae"
 #define UNICODE_THAANA_OABOAFILI  0x07af
-#define UNITEXT_THAANA_OABOAFILI  L"\u07af"
+#define UNITEXT_THAANA_OABOAFILI  U"\u07af"
 #define UNICODE_THAANA_SUKUN  0x07b0
-#define UNITEXT_THAANA_SUKUN  L"\u07b0"
+#define UNITEXT_THAANA_SUKUN  U"\u07b0"
 #define UNICODE_THAANA_LETTER_NAA  0x07b1
-#define UNITEXT_THAANA_LETTER_NAA  L"\u07b1"
+#define UNITEXT_THAANA_LETTER_NAA  U"\u07b1"
 #define UNICODE_NKO_DIGIT_ZERO  0x07c0
-#define UNITEXT_NKO_DIGIT_ZERO  L"\u07c0"
+#define UNITEXT_NKO_DIGIT_ZERO  U"\u07c0"
 #define UNICODE_NKO_DIGIT_ONE  0x07c1
-#define UNITEXT_NKO_DIGIT_ONE  L"\u07c1"
+#define UNITEXT_NKO_DIGIT_ONE  U"\u07c1"
 #define UNICODE_NKO_DIGIT_TWO  0x07c2
-#define UNITEXT_NKO_DIGIT_TWO  L"\u07c2"
+#define UNITEXT_NKO_DIGIT_TWO  U"\u07c2"
 #define UNICODE_NKO_DIGIT_THREE  0x07c3
-#define UNITEXT_NKO_DIGIT_THREE  L"\u07c3"
+#define UNITEXT_NKO_DIGIT_THREE  U"\u07c3"
 #define UNICODE_NKO_DIGIT_FOUR  0x07c4
-#define UNITEXT_NKO_DIGIT_FOUR  L"\u07c4"
+#define UNITEXT_NKO_DIGIT_FOUR  U"\u07c4"
 #define UNICODE_NKO_DIGIT_FIVE  0x07c5
-#define UNITEXT_NKO_DIGIT_FIVE  L"\u07c5"
+#define UNITEXT_NKO_DIGIT_FIVE  U"\u07c5"
 #define UNICODE_NKO_DIGIT_SIX  0x07c6
-#define UNITEXT_NKO_DIGIT_SIX  L"\u07c6"
+#define UNITEXT_NKO_DIGIT_SIX  U"\u07c6"
 #define UNICODE_NKO_DIGIT_SEVEN  0x07c7
-#define UNITEXT_NKO_DIGIT_SEVEN  L"\u07c7"
+#define UNITEXT_NKO_DIGIT_SEVEN  U"\u07c7"
 #define UNICODE_NKO_DIGIT_EIGHT  0x07c8
-#define UNITEXT_NKO_DIGIT_EIGHT  L"\u07c8"
+#define UNITEXT_NKO_DIGIT_EIGHT  U"\u07c8"
 #define UNICODE_NKO_DIGIT_NINE  0x07c9
-#define UNITEXT_NKO_DIGIT_NINE  L"\u07c9"
+#define UNITEXT_NKO_DIGIT_NINE  U"\u07c9"
 #define UNICODE_NKO_LETTER_A  0x07ca
-#define UNITEXT_NKO_LETTER_A  L"\u07ca"
+#define UNITEXT_NKO_LETTER_A  U"\u07ca"
 #define UNICODE_NKO_LETTER_EE  0x07cb
-#define UNITEXT_NKO_LETTER_EE  L"\u07cb"
+#define UNITEXT_NKO_LETTER_EE  U"\u07cb"
 #define UNICODE_NKO_LETTER_I  0x07cc
-#define UNITEXT_NKO_LETTER_I  L"\u07cc"
+#define UNITEXT_NKO_LETTER_I  U"\u07cc"
 #define UNICODE_NKO_LETTER_E  0x07cd
-#define UNITEXT_NKO_LETTER_E  L"\u07cd"
+#define UNITEXT_NKO_LETTER_E  U"\u07cd"
 #define UNICODE_NKO_LETTER_U  0x07ce
-#define UNITEXT_NKO_LETTER_U  L"\u07ce"
+#define UNITEXT_NKO_LETTER_U  U"\u07ce"
 #define UNICODE_NKO_LETTER_OO  0x07cf
-#define UNITEXT_NKO_LETTER_OO  L"\u07cf"
+#define UNITEXT_NKO_LETTER_OO  U"\u07cf"
 #define UNICODE_NKO_LETTER_O  0x07d0
-#define UNITEXT_NKO_LETTER_O  L"\u07d0"
+#define UNITEXT_NKO_LETTER_O  U"\u07d0"
 #define UNICODE_NKO_LETTER_DAGBASINNA  0x07d1
-#define UNITEXT_NKO_LETTER_DAGBASINNA  L"\u07d1"
+#define UNITEXT_NKO_LETTER_DAGBASINNA  U"\u07d1"
 #define UNICODE_NKO_LETTER_N  0x07d2
-#define UNITEXT_NKO_LETTER_N  L"\u07d2"
+#define UNITEXT_NKO_LETTER_N  U"\u07d2"
 #define UNICODE_NKO_LETTER_BA  0x07d3
-#define UNITEXT_NKO_LETTER_BA  L"\u07d3"
+#define UNITEXT_NKO_LETTER_BA  U"\u07d3"
 #define UNICODE_NKO_LETTER_PA  0x07d4
-#define UNITEXT_NKO_LETTER_PA  L"\u07d4"
+#define UNITEXT_NKO_LETTER_PA  U"\u07d4"
 #define UNICODE_NKO_LETTER_TA  0x07d5
-#define UNITEXT_NKO_LETTER_TA  L"\u07d5"
+#define UNITEXT_NKO_LETTER_TA  U"\u07d5"
 #define UNICODE_NKO_LETTER_JA  0x07d6
-#define UNITEXT_NKO_LETTER_JA  L"\u07d6"
+#define UNITEXT_NKO_LETTER_JA  U"\u07d6"
 #define UNICODE_NKO_LETTER_CHA  0x07d7
-#define UNITEXT_NKO_LETTER_CHA  L"\u07d7"
+#define UNITEXT_NKO_LETTER_CHA  U"\u07d7"
 #define UNICODE_NKO_LETTER_DA  0x07d8
-#define UNITEXT_NKO_LETTER_DA  L"\u07d8"
+#define UNITEXT_NKO_LETTER_DA  U"\u07d8"
 #define UNICODE_NKO_LETTER_RA  0x07d9
-#define UNITEXT_NKO_LETTER_RA  L"\u07d9"
+#define UNITEXT_NKO_LETTER_RA  U"\u07d9"
 #define UNICODE_NKO_LETTER_RRA  0x07da
-#define UNITEXT_NKO_LETTER_RRA  L"\u07da"
+#define UNITEXT_NKO_LETTER_RRA  U"\u07da"
 #define UNICODE_NKO_LETTER_SA  0x07db
-#define UNITEXT_NKO_LETTER_SA  L"\u07db"
+#define UNITEXT_NKO_LETTER_SA  U"\u07db"
 #define UNICODE_NKO_LETTER_GBA  0x07dc
-#define UNITEXT_NKO_LETTER_GBA  L"\u07dc"
+#define UNITEXT_NKO_LETTER_GBA  U"\u07dc"
 #define UNICODE_NKO_LETTER_FA  0x07dd
-#define UNITEXT_NKO_LETTER_FA  L"\u07dd"
+#define UNITEXT_NKO_LETTER_FA  U"\u07dd"
 #define UNICODE_NKO_LETTER_KA  0x07de
-#define UNITEXT_NKO_LETTER_KA  L"\u07de"
+#define UNITEXT_NKO_LETTER_KA  U"\u07de"
 #define UNICODE_NKO_LETTER_LA  0x07df
-#define UNITEXT_NKO_LETTER_LA  L"\u07df"
+#define UNITEXT_NKO_LETTER_LA  U"\u07df"
 #define UNICODE_NKO_LETTER_NA_WOLOSO  0x07e0
-#define UNITEXT_NKO_LETTER_NA_WOLOSO  L"\u07e0"
+#define UNITEXT_NKO_LETTER_NA_WOLOSO  U"\u07e0"
 #define UNICODE_NKO_LETTER_MA  0x07e1
-#define UNITEXT_NKO_LETTER_MA  L"\u07e1"
+#define UNITEXT_NKO_LETTER_MA  U"\u07e1"
 #define UNICODE_NKO_LETTER_NYA  0x07e2
-#define UNITEXT_NKO_LETTER_NYA  L"\u07e2"
+#define UNITEXT_NKO_LETTER_NYA  U"\u07e2"
 #define UNICODE_NKO_LETTER_NA  0x07e3
-#define UNITEXT_NKO_LETTER_NA  L"\u07e3"
+#define UNITEXT_NKO_LETTER_NA  U"\u07e3"
 #define UNICODE_NKO_LETTER_HA  0x07e4
-#define UNITEXT_NKO_LETTER_HA  L"\u07e4"
+#define UNITEXT_NKO_LETTER_HA  U"\u07e4"
 #define UNICODE_NKO_LETTER_WA  0x07e5
-#define UNITEXT_NKO_LETTER_WA  L"\u07e5"
+#define UNITEXT_NKO_LETTER_WA  U"\u07e5"
 #define UNICODE_NKO_LETTER_YA  0x07e6
-#define UNITEXT_NKO_LETTER_YA  L"\u07e6"
+#define UNITEXT_NKO_LETTER_YA  U"\u07e6"
 #define UNICODE_NKO_LETTER_NYA_WOLOSO  0x07e7
-#define UNITEXT_NKO_LETTER_NYA_WOLOSO  L"\u07e7"
+#define UNITEXT_NKO_LETTER_NYA_WOLOSO  U"\u07e7"
 #define UNICODE_NKO_LETTER_JONA_JA  0x07e8
-#define UNITEXT_NKO_LETTER_JONA_JA  L"\u07e8"
+#define UNITEXT_NKO_LETTER_JONA_JA  U"\u07e8"
 #define UNICODE_NKO_LETTER_JONA_CHA  0x07e9
-#define UNITEXT_NKO_LETTER_JONA_CHA  L"\u07e9"
+#define UNITEXT_NKO_LETTER_JONA_CHA  U"\u07e9"
 #define UNICODE_NKO_LETTER_JONA_RA  0x07ea
-#define UNITEXT_NKO_LETTER_JONA_RA  L"\u07ea"
+#define UNITEXT_NKO_LETTER_JONA_RA  U"\u07ea"
 #define UNICODE_NKO_COMBINING_SHORT_HIGH_TONE  0x07eb
-#define UNITEXT_NKO_COMBINING_SHORT_HIGH_TONE  L"\u07eb"
+#define UNITEXT_NKO_COMBINING_SHORT_HIGH_TONE  U"\u07eb"
 #define UNICODE_NKO_COMBINING_SHORT_LOW_TONE  0x07ec
-#define UNITEXT_NKO_COMBINING_SHORT_LOW_TONE  L"\u07ec"
+#define UNITEXT_NKO_COMBINING_SHORT_LOW_TONE  U"\u07ec"
 #define UNICODE_NKO_COMBINING_SHORT_RISING_TONE  0x07ed
-#define UNITEXT_NKO_COMBINING_SHORT_RISING_TONE  L"\u07ed"
+#define UNITEXT_NKO_COMBINING_SHORT_RISING_TONE  U"\u07ed"
 #define UNICODE_NKO_COMBINING_LONG_DESCENDING_TONE  0x07ee
-#define UNITEXT_NKO_COMBINING_LONG_DESCENDING_TONE  L"\u07ee"
+#define UNITEXT_NKO_COMBINING_LONG_DESCENDING_TONE  U"\u07ee"
 #define UNICODE_NKO_COMBINING_LONG_HIGH_TONE  0x07ef
-#define UNITEXT_NKO_COMBINING_LONG_HIGH_TONE  L"\u07ef"
+#define UNITEXT_NKO_COMBINING_LONG_HIGH_TONE  U"\u07ef"
 #define UNICODE_NKO_COMBINING_LONG_LOW_TONE  0x07f0
-#define UNITEXT_NKO_COMBINING_LONG_LOW_TONE  L"\u07f0"
+#define UNITEXT_NKO_COMBINING_LONG_LOW_TONE  U"\u07f0"
 #define UNICODE_NKO_COMBINING_LONG_RISING_TONE  0x07f1
-#define UNITEXT_NKO_COMBINING_LONG_RISING_TONE  L"\u07f1"
+#define UNITEXT_NKO_COMBINING_LONG_RISING_TONE  U"\u07f1"
 #define UNICODE_NKO_COMBINING_NASALIZATION_MARK  0x07f2
-#define UNITEXT_NKO_COMBINING_NASALIZATION_MARK  L"\u07f2"
+#define UNITEXT_NKO_COMBINING_NASALIZATION_MARK  U"\u07f2"
 #define UNICODE_NKO_COMBINING_DOUBLE_DOT_ABOVE  0x07f3
-#define UNITEXT_NKO_COMBINING_DOUBLE_DOT_ABOVE  L"\u07f3"
+#define UNITEXT_NKO_COMBINING_DOUBLE_DOT_ABOVE  U"\u07f3"
 #define UNICODE_NKO_HIGH_TONE_APOSTROPHE  0x07f4
-#define UNITEXT_NKO_HIGH_TONE_APOSTROPHE  L"\u07f4"
+#define UNITEXT_NKO_HIGH_TONE_APOSTROPHE  U"\u07f4"
 #define UNICODE_NKO_LOW_TONE_APOSTROPHE  0x07f5
-#define UNITEXT_NKO_LOW_TONE_APOSTROPHE  L"\u07f5"
+#define UNITEXT_NKO_LOW_TONE_APOSTROPHE  U"\u07f5"
 #define UNICODE_NKO_SYMBOL_OO_DENNEN  0x07f6
-#define UNITEXT_NKO_SYMBOL_OO_DENNEN  L"\u07f6"
+#define UNITEXT_NKO_SYMBOL_OO_DENNEN  U"\u07f6"
 #define UNICODE_NKO_SYMBOL_GBAKURUNEN  0x07f7
-#define UNITEXT_NKO_SYMBOL_GBAKURUNEN  L"\u07f7"
+#define UNITEXT_NKO_SYMBOL_GBAKURUNEN  U"\u07f7"
 #define UNICODE_NKO_COMMA  0x07f8
-#define UNITEXT_NKO_COMMA  L"\u07f8"
+#define UNITEXT_NKO_COMMA  U"\u07f8"
 #define UNICODE_NKO_EXCLAMATION_MARK  0x07f9
-#define UNITEXT_NKO_EXCLAMATION_MARK  L"\u07f9"
+#define UNITEXT_NKO_EXCLAMATION_MARK  U"\u07f9"
 #define UNICODE_NKO_LAJANYALAN  0x07fa
-#define UNITEXT_NKO_LAJANYALAN  L"\u07fa"
+#define UNITEXT_NKO_LAJANYALAN  U"\u07fa"
 #define UNICODE_DEVANAGARI_SIGN_CANDRABINDU  0x0901
-#define UNITEXT_DEVANAGARI_SIGN_CANDRABINDU  L"\u0901"
+#define UNITEXT_DEVANAGARI_SIGN_CANDRABINDU  U"\u0901"
 #define UNICODE_DEVANAGARI_SIGN_ANUSVARA  0x0902
-#define UNITEXT_DEVANAGARI_SIGN_ANUSVARA  L"\u0902"
+#define UNITEXT_DEVANAGARI_SIGN_ANUSVARA  U"\u0902"
 #define UNICODE_DEVANAGARI_SIGN_VISARGA  0x0903
-#define UNITEXT_DEVANAGARI_SIGN_VISARGA  L"\u0903"
+#define UNITEXT_DEVANAGARI_SIGN_VISARGA  U"\u0903"
 #define UNICODE_DEVANAGARI_LETTER_SHORT_A  0x0904
-#define UNITEXT_DEVANAGARI_LETTER_SHORT_A  L"\u0904"
+#define UNITEXT_DEVANAGARI_LETTER_SHORT_A  U"\u0904"
 #define UNICODE_DEVANAGARI_LETTER_A  0x0905
-#define UNITEXT_DEVANAGARI_LETTER_A  L"\u0905"
+#define UNITEXT_DEVANAGARI_LETTER_A  U"\u0905"
 #define UNICODE_DEVANAGARI_LETTER_AA  0x0906
-#define UNITEXT_DEVANAGARI_LETTER_AA  L"\u0906"
+#define UNITEXT_DEVANAGARI_LETTER_AA  U"\u0906"
 #define UNICODE_DEVANAGARI_LETTER_I  0x0907
-#define UNITEXT_DEVANAGARI_LETTER_I  L"\u0907"
+#define UNITEXT_DEVANAGARI_LETTER_I  U"\u0907"
 #define UNICODE_DEVANAGARI_LETTER_II  0x0908
-#define UNITEXT_DEVANAGARI_LETTER_II  L"\u0908"
+#define UNITEXT_DEVANAGARI_LETTER_II  U"\u0908"
 #define UNICODE_DEVANAGARI_LETTER_U  0x0909
-#define UNITEXT_DEVANAGARI_LETTER_U  L"\u0909"
+#define UNITEXT_DEVANAGARI_LETTER_U  U"\u0909"
 #define UNICODE_DEVANAGARI_LETTER_UU  0x090a
-#define UNITEXT_DEVANAGARI_LETTER_UU  L"\u090a"
+#define UNITEXT_DEVANAGARI_LETTER_UU  U"\u090a"
 #define UNICODE_DEVANAGARI_LETTER_VOCALIC_R  0x090b
-#define UNITEXT_DEVANAGARI_LETTER_VOCALIC_R  L"\u090b"
+#define UNITEXT_DEVANAGARI_LETTER_VOCALIC_R  U"\u090b"
 #define UNICODE_DEVANAGARI_LETTER_VOCALIC_L  0x090c
-#define UNITEXT_DEVANAGARI_LETTER_VOCALIC_L  L"\u090c"
+#define UNITEXT_DEVANAGARI_LETTER_VOCALIC_L  U"\u090c"
 #define UNICODE_DEVANAGARI_LETTER_CANDRA_E  0x090d
-#define UNITEXT_DEVANAGARI_LETTER_CANDRA_E  L"\u090d"
+#define UNITEXT_DEVANAGARI_LETTER_CANDRA_E  U"\u090d"
 #define UNICODE_DEVANAGARI_LETTER_SHORT_E  0x090e
-#define UNITEXT_DEVANAGARI_LETTER_SHORT_E  L"\u090e"
+#define UNITEXT_DEVANAGARI_LETTER_SHORT_E  U"\u090e"
 #define UNICODE_DEVANAGARI_LETTER_E  0x090f
-#define UNITEXT_DEVANAGARI_LETTER_E  L"\u090f"
+#define UNITEXT_DEVANAGARI_LETTER_E  U"\u090f"
 #define UNICODE_DEVANAGARI_LETTER_AI  0x0910
-#define UNITEXT_DEVANAGARI_LETTER_AI  L"\u0910"
+#define UNITEXT_DEVANAGARI_LETTER_AI  U"\u0910"
 #define UNICODE_DEVANAGARI_LETTER_CANDRA_O  0x0911
-#define UNITEXT_DEVANAGARI_LETTER_CANDRA_O  L"\u0911"
+#define UNITEXT_DEVANAGARI_LETTER_CANDRA_O  U"\u0911"
 #define UNICODE_DEVANAGARI_LETTER_SHORT_O  0x0912
-#define UNITEXT_DEVANAGARI_LETTER_SHORT_O  L"\u0912"
+#define UNITEXT_DEVANAGARI_LETTER_SHORT_O  U"\u0912"
 #define UNICODE_DEVANAGARI_LETTER_O  0x0913
-#define UNITEXT_DEVANAGARI_LETTER_O  L"\u0913"
+#define UNITEXT_DEVANAGARI_LETTER_O  U"\u0913"
 #define UNICODE_DEVANAGARI_LETTER_AU  0x0914
-#define UNITEXT_DEVANAGARI_LETTER_AU  L"\u0914"
+#define UNITEXT_DEVANAGARI_LETTER_AU  U"\u0914"
 #define UNICODE_DEVANAGARI_LETTER_KA  0x0915
-#define UNITEXT_DEVANAGARI_LETTER_KA  L"\u0915"
+#define UNITEXT_DEVANAGARI_LETTER_KA  U"\u0915"
 #define UNICODE_DEVANAGARI_LETTER_KHA  0x0916
-#define UNITEXT_DEVANAGARI_LETTER_KHA  L"\u0916"
+#define UNITEXT_DEVANAGARI_LETTER_KHA  U"\u0916"
 #define UNICODE_DEVANAGARI_LETTER_GA  0x0917
-#define UNITEXT_DEVANAGARI_LETTER_GA  L"\u0917"
+#define UNITEXT_DEVANAGARI_LETTER_GA  U"\u0917"
 #define UNICODE_DEVANAGARI_LETTER_GHA  0x0918
-#define UNITEXT_DEVANAGARI_LETTER_GHA  L"\u0918"
+#define UNITEXT_DEVANAGARI_LETTER_GHA  U"\u0918"
 #define UNICODE_DEVANAGARI_LETTER_NGA  0x0919
-#define UNITEXT_DEVANAGARI_LETTER_NGA  L"\u0919"
+#define UNITEXT_DEVANAGARI_LETTER_NGA  U"\u0919"
 #define UNICODE_DEVANAGARI_LETTER_CA  0x091a
-#define UNITEXT_DEVANAGARI_LETTER_CA  L"\u091a"
+#define UNITEXT_DEVANAGARI_LETTER_CA  U"\u091a"
 #define UNICODE_DEVANAGARI_LETTER_CHA  0x091b
-#define UNITEXT_DEVANAGARI_LETTER_CHA  L"\u091b"
+#define UNITEXT_DEVANAGARI_LETTER_CHA  U"\u091b"
 #define UNICODE_DEVANAGARI_LETTER_JA  0x091c
-#define UNITEXT_DEVANAGARI_LETTER_JA  L"\u091c"
+#define UNITEXT_DEVANAGARI_LETTER_JA  U"\u091c"
 #define UNICODE_DEVANAGARI_LETTER_JHA  0x091d
-#define UNITEXT_DEVANAGARI_LETTER_JHA  L"\u091d"
+#define UNITEXT_DEVANAGARI_LETTER_JHA  U"\u091d"
 #define UNICODE_DEVANAGARI_LETTER_NYA  0x091e
-#define UNITEXT_DEVANAGARI_LETTER_NYA  L"\u091e"
+#define UNITEXT_DEVANAGARI_LETTER_NYA  U"\u091e"
 #define UNICODE_DEVANAGARI_LETTER_TTA  0x091f
-#define UNITEXT_DEVANAGARI_LETTER_TTA  L"\u091f"
+#define UNITEXT_DEVANAGARI_LETTER_TTA  U"\u091f"
 #define UNICODE_DEVANAGARI_LETTER_TTHA  0x0920
-#define UNITEXT_DEVANAGARI_LETTER_TTHA  L"\u0920"
+#define UNITEXT_DEVANAGARI_LETTER_TTHA  U"\u0920"
 #define UNICODE_DEVANAGARI_LETTER_DDA  0x0921
-#define UNITEXT_DEVANAGARI_LETTER_DDA  L"\u0921"
+#define UNITEXT_DEVANAGARI_LETTER_DDA  U"\u0921"
 #define UNICODE_DEVANAGARI_LETTER_DDHA  0x0922
-#define UNITEXT_DEVANAGARI_LETTER_DDHA  L"\u0922"
+#define UNITEXT_DEVANAGARI_LETTER_DDHA  U"\u0922"
 #define UNICODE_DEVANAGARI_LETTER_NNA  0x0923
-#define UNITEXT_DEVANAGARI_LETTER_NNA  L"\u0923"
+#define UNITEXT_DEVANAGARI_LETTER_NNA  U"\u0923"
 #define UNICODE_DEVANAGARI_LETTER_TA  0x0924
-#define UNITEXT_DEVANAGARI_LETTER_TA  L"\u0924"
+#define UNITEXT_DEVANAGARI_LETTER_TA  U"\u0924"
 #define UNICODE_DEVANAGARI_LETTER_THA  0x0925
-#define UNITEXT_DEVANAGARI_LETTER_THA  L"\u0925"
+#define UNITEXT_DEVANAGARI_LETTER_THA  U"\u0925"
 #define UNICODE_DEVANAGARI_LETTER_DA  0x0926
-#define UNITEXT_DEVANAGARI_LETTER_DA  L"\u0926"
+#define UNITEXT_DEVANAGARI_LETTER_DA  U"\u0926"
 #define UNICODE_DEVANAGARI_LETTER_DHA  0x0927
-#define UNITEXT_DEVANAGARI_LETTER_DHA  L"\u0927"
+#define UNITEXT_DEVANAGARI_LETTER_DHA  U"\u0927"
 #define UNICODE_DEVANAGARI_LETTER_NA  0x0928
-#define UNITEXT_DEVANAGARI_LETTER_NA  L"\u0928"
+#define UNITEXT_DEVANAGARI_LETTER_NA  U"\u0928"
 #define UNICODE_DEVANAGARI_LETTER_NNNA  0x0929
-#define UNITEXT_DEVANAGARI_LETTER_NNNA  L"\u0929"
+#define UNITEXT_DEVANAGARI_LETTER_NNNA  U"\u0929"
 #define UNICODE_DEVANAGARI_LETTER_PA  0x092a
-#define UNITEXT_DEVANAGARI_LETTER_PA  L"\u092a"
+#define UNITEXT_DEVANAGARI_LETTER_PA  U"\u092a"
 #define UNICODE_DEVANAGARI_LETTER_PHA  0x092b
-#define UNITEXT_DEVANAGARI_LETTER_PHA  L"\u092b"
+#define UNITEXT_DEVANAGARI_LETTER_PHA  U"\u092b"
 #define UNICODE_DEVANAGARI_LETTER_BA  0x092c
-#define UNITEXT_DEVANAGARI_LETTER_BA  L"\u092c"
+#define UNITEXT_DEVANAGARI_LETTER_BA  U"\u092c"
 #define UNICODE_DEVANAGARI_LETTER_BHA  0x092d
-#define UNITEXT_DEVANAGARI_LETTER_BHA  L"\u092d"
+#define UNITEXT_DEVANAGARI_LETTER_BHA  U"\u092d"
 #define UNICODE_DEVANAGARI_LETTER_MA  0x092e
-#define UNITEXT_DEVANAGARI_LETTER_MA  L"\u092e"
+#define UNITEXT_DEVANAGARI_LETTER_MA  U"\u092e"
 #define UNICODE_DEVANAGARI_LETTER_YA  0x092f
-#define UNITEXT_DEVANAGARI_LETTER_YA  L"\u092f"
+#define UNITEXT_DEVANAGARI_LETTER_YA  U"\u092f"
 #define UNICODE_DEVANAGARI_LETTER_RA  0x0930
-#define UNITEXT_DEVANAGARI_LETTER_RA  L"\u0930"
+#define UNITEXT_DEVANAGARI_LETTER_RA  U"\u0930"
 #define UNICODE_DEVANAGARI_LETTER_RRA  0x0931
-#define UNITEXT_DEVANAGARI_LETTER_RRA  L"\u0931"
+#define UNITEXT_DEVANAGARI_LETTER_RRA  U"\u0931"
 #define UNICODE_DEVANAGARI_LETTER_LA  0x0932
-#define UNITEXT_DEVANAGARI_LETTER_LA  L"\u0932"
+#define UNITEXT_DEVANAGARI_LETTER_LA  U"\u0932"
 #define UNICODE_DEVANAGARI_LETTER_LLA  0x0933
-#define UNITEXT_DEVANAGARI_LETTER_LLA  L"\u0933"
+#define UNITEXT_DEVANAGARI_LETTER_LLA  U"\u0933"
 #define UNICODE_DEVANAGARI_LETTER_LLLA  0x0934
-#define UNITEXT_DEVANAGARI_LETTER_LLLA  L"\u0934"
+#define UNITEXT_DEVANAGARI_LETTER_LLLA  U"\u0934"
 #define UNICODE_DEVANAGARI_LETTER_VA  0x0935
-#define UNITEXT_DEVANAGARI_LETTER_VA  L"\u0935"
+#define UNITEXT_DEVANAGARI_LETTER_VA  U"\u0935"
 #define UNICODE_DEVANAGARI_LETTER_SHA  0x0936
-#define UNITEXT_DEVANAGARI_LETTER_SHA  L"\u0936"
+#define UNITEXT_DEVANAGARI_LETTER_SHA  U"\u0936"
 #define UNICODE_DEVANAGARI_LETTER_SSA  0x0937
-#define UNITEXT_DEVANAGARI_LETTER_SSA  L"\u0937"
+#define UNITEXT_DEVANAGARI_LETTER_SSA  U"\u0937"
 #define UNICODE_DEVANAGARI_LETTER_SA  0x0938
-#define UNITEXT_DEVANAGARI_LETTER_SA  L"\u0938"
+#define UNITEXT_DEVANAGARI_LETTER_SA  U"\u0938"
 #define UNICODE_DEVANAGARI_LETTER_HA  0x0939
-#define UNITEXT_DEVANAGARI_LETTER_HA  L"\u0939"
+#define UNITEXT_DEVANAGARI_LETTER_HA  U"\u0939"
 #define UNICODE_DEVANAGARI_SIGN_NUKTA  0x093c
-#define UNITEXT_DEVANAGARI_SIGN_NUKTA  L"\u093c"
+#define UNITEXT_DEVANAGARI_SIGN_NUKTA  U"\u093c"
 #define UNICODE_DEVANAGARI_SIGN_AVAGRAHA  0x093d
-#define UNITEXT_DEVANAGARI_SIGN_AVAGRAHA  L"\u093d"
+#define UNITEXT_DEVANAGARI_SIGN_AVAGRAHA  U"\u093d"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_AA  0x093e
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_AA  L"\u093e"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_AA  U"\u093e"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_I  0x093f
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_I  L"\u093f"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_I  U"\u093f"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_II  0x0940
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_II  L"\u0940"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_II  U"\u0940"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_U  0x0941
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_U  L"\u0941"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_U  U"\u0941"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_UU  0x0942
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_UU  L"\u0942"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_UU  U"\u0942"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_VOCALIC_R  0x0943
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_VOCALIC_R  L"\u0943"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_VOCALIC_R  U"\u0943"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_VOCALIC_RR  0x0944
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_VOCALIC_RR  L"\u0944"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_VOCALIC_RR  U"\u0944"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_CANDRA_E  0x0945
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_CANDRA_E  L"\u0945"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_CANDRA_E  U"\u0945"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_SHORT_E  0x0946
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_SHORT_E  L"\u0946"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_SHORT_E  U"\u0946"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_E  0x0947
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_E  L"\u0947"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_E  U"\u0947"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_AI  0x0948
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_AI  L"\u0948"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_AI  U"\u0948"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_CANDRA_O  0x0949
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_CANDRA_O  L"\u0949"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_CANDRA_O  U"\u0949"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_SHORT_O  0x094a
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_SHORT_O  L"\u094a"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_SHORT_O  U"\u094a"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_O  0x094b
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_O  L"\u094b"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_O  U"\u094b"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_AU  0x094c
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_AU  L"\u094c"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_AU  U"\u094c"
 #define UNICODE_DEVANAGARI_SIGN_VIRAMA  0x094d
-#define UNITEXT_DEVANAGARI_SIGN_VIRAMA  L"\u094d"
+#define UNITEXT_DEVANAGARI_SIGN_VIRAMA  U"\u094d"
 #define UNICODE_DEVANAGARI_OM  0x0950
-#define UNITEXT_DEVANAGARI_OM  L"\u0950"
+#define UNITEXT_DEVANAGARI_OM  U"\u0950"
 #define UNICODE_DEVANAGARI_STRESS_SIGN_UDATTA  0x0951
-#define UNITEXT_DEVANAGARI_STRESS_SIGN_UDATTA  L"\u0951"
+#define UNITEXT_DEVANAGARI_STRESS_SIGN_UDATTA  U"\u0951"
 #define UNICODE_DEVANAGARI_STRESS_SIGN_ANUDATTA  0x0952
-#define UNITEXT_DEVANAGARI_STRESS_SIGN_ANUDATTA  L"\u0952"
+#define UNITEXT_DEVANAGARI_STRESS_SIGN_ANUDATTA  U"\u0952"
 #define UNICODE_DEVANAGARI_GRAVE_ACCENT  0x0953
-#define UNITEXT_DEVANAGARI_GRAVE_ACCENT  L"\u0953"
+#define UNITEXT_DEVANAGARI_GRAVE_ACCENT  U"\u0953"
 #define UNICODE_DEVANAGARI_ACUTE_ACCENT  0x0954
-#define UNITEXT_DEVANAGARI_ACUTE_ACCENT  L"\u0954"
+#define UNITEXT_DEVANAGARI_ACUTE_ACCENT  U"\u0954"
 #define UNICODE_DEVANAGARI_LETTER_QA  0x0958
-#define UNITEXT_DEVANAGARI_LETTER_QA  L"\u0958"
+#define UNITEXT_DEVANAGARI_LETTER_QA  U"\u0958"
 #define UNICODE_DEVANAGARI_LETTER_KHHA  0x0959
-#define UNITEXT_DEVANAGARI_LETTER_KHHA  L"\u0959"
+#define UNITEXT_DEVANAGARI_LETTER_KHHA  U"\u0959"
 #define UNICODE_DEVANAGARI_LETTER_GHHA  0x095a
-#define UNITEXT_DEVANAGARI_LETTER_GHHA  L"\u095a"
+#define UNITEXT_DEVANAGARI_LETTER_GHHA  U"\u095a"
 #define UNICODE_DEVANAGARI_LETTER_ZA  0x095b
-#define UNITEXT_DEVANAGARI_LETTER_ZA  L"\u095b"
+#define UNITEXT_DEVANAGARI_LETTER_ZA  U"\u095b"
 #define UNICODE_DEVANAGARI_LETTER_DDDHA  0x095c
-#define UNITEXT_DEVANAGARI_LETTER_DDDHA  L"\u095c"
+#define UNITEXT_DEVANAGARI_LETTER_DDDHA  U"\u095c"
 #define UNICODE_DEVANAGARI_LETTER_RHA  0x095d
-#define UNITEXT_DEVANAGARI_LETTER_RHA  L"\u095d"
+#define UNITEXT_DEVANAGARI_LETTER_RHA  U"\u095d"
 #define UNICODE_DEVANAGARI_LETTER_FA  0x095e
-#define UNITEXT_DEVANAGARI_LETTER_FA  L"\u095e"
+#define UNITEXT_DEVANAGARI_LETTER_FA  U"\u095e"
 #define UNICODE_DEVANAGARI_LETTER_YYA  0x095f
-#define UNITEXT_DEVANAGARI_LETTER_YYA  L"\u095f"
+#define UNITEXT_DEVANAGARI_LETTER_YYA  U"\u095f"
 #define UNICODE_DEVANAGARI_LETTER_VOCALIC_RR  0x0960
-#define UNITEXT_DEVANAGARI_LETTER_VOCALIC_RR  L"\u0960"
+#define UNITEXT_DEVANAGARI_LETTER_VOCALIC_RR  U"\u0960"
 #define UNICODE_DEVANAGARI_LETTER_VOCALIC_LL  0x0961
-#define UNITEXT_DEVANAGARI_LETTER_VOCALIC_LL  L"\u0961"
+#define UNITEXT_DEVANAGARI_LETTER_VOCALIC_LL  U"\u0961"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_VOCALIC_L  0x0962
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_VOCALIC_L  L"\u0962"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_VOCALIC_L  U"\u0962"
 #define UNICODE_DEVANAGARI_VOWEL_SIGN_VOCALIC_LL  0x0963
-#define UNITEXT_DEVANAGARI_VOWEL_SIGN_VOCALIC_LL  L"\u0963"
+#define UNITEXT_DEVANAGARI_VOWEL_SIGN_VOCALIC_LL  U"\u0963"
 #define UNICODE_DEVANAGARI_DANDA  0x0964
-#define UNITEXT_DEVANAGARI_DANDA  L"\u0964"
+#define UNITEXT_DEVANAGARI_DANDA  U"\u0964"
 #define UNICODE_DEVANAGARI_DOUBLE_DANDA  0x0965
-#define UNITEXT_DEVANAGARI_DOUBLE_DANDA  L"\u0965"
+#define UNITEXT_DEVANAGARI_DOUBLE_DANDA  U"\u0965"
 #define UNICODE_DEVANAGARI_DIGIT_ZERO  0x0966
-#define UNITEXT_DEVANAGARI_DIGIT_ZERO  L"\u0966"
+#define UNITEXT_DEVANAGARI_DIGIT_ZERO  U"\u0966"
 #define UNICODE_DEVANAGARI_DIGIT_ONE  0x0967
-#define UNITEXT_DEVANAGARI_DIGIT_ONE  L"\u0967"
+#define UNITEXT_DEVANAGARI_DIGIT_ONE  U"\u0967"
 #define UNICODE_DEVANAGARI_DIGIT_TWO  0x0968
-#define UNITEXT_DEVANAGARI_DIGIT_TWO  L"\u0968"
+#define UNITEXT_DEVANAGARI_DIGIT_TWO  U"\u0968"
 #define UNICODE_DEVANAGARI_DIGIT_THREE  0x0969
-#define UNITEXT_DEVANAGARI_DIGIT_THREE  L"\u0969"
+#define UNITEXT_DEVANAGARI_DIGIT_THREE  U"\u0969"
 #define UNICODE_DEVANAGARI_DIGIT_FOUR  0x096a
-#define UNITEXT_DEVANAGARI_DIGIT_FOUR  L"\u096a"
+#define UNITEXT_DEVANAGARI_DIGIT_FOUR  U"\u096a"
 #define UNICODE_DEVANAGARI_DIGIT_FIVE  0x096b
-#define UNITEXT_DEVANAGARI_DIGIT_FIVE  L"\u096b"
+#define UNITEXT_DEVANAGARI_DIGIT_FIVE  U"\u096b"
 #define UNICODE_DEVANAGARI_DIGIT_SIX  0x096c
-#define UNITEXT_DEVANAGARI_DIGIT_SIX  L"\u096c"
+#define UNITEXT_DEVANAGARI_DIGIT_SIX  U"\u096c"
 #define UNICODE_DEVANAGARI_DIGIT_SEVEN  0x096d
-#define UNITEXT_DEVANAGARI_DIGIT_SEVEN  L"\u096d"
+#define UNITEXT_DEVANAGARI_DIGIT_SEVEN  U"\u096d"
 #define UNICODE_DEVANAGARI_DIGIT_EIGHT  0x096e
-#define UNITEXT_DEVANAGARI_DIGIT_EIGHT  L"\u096e"
+#define UNITEXT_DEVANAGARI_DIGIT_EIGHT  U"\u096e"
 #define UNICODE_DEVANAGARI_DIGIT_NINE  0x096f
-#define UNITEXT_DEVANAGARI_DIGIT_NINE  L"\u096f"
+#define UNITEXT_DEVANAGARI_DIGIT_NINE  U"\u096f"
 #define UNICODE_DEVANAGARI_ABBREVIATION_SIGN  0x0970
-#define UNITEXT_DEVANAGARI_ABBREVIATION_SIGN  L"\u0970"
+#define UNITEXT_DEVANAGARI_ABBREVIATION_SIGN  U"\u0970"
 #define UNICODE_DEVANAGARI_LETTER_GGA  0x097b
-#define UNITEXT_DEVANAGARI_LETTER_GGA  L"\u097b"
+#define UNITEXT_DEVANAGARI_LETTER_GGA  U"\u097b"
 #define UNICODE_DEVANAGARI_LETTER_JJA  0x097c
-#define UNITEXT_DEVANAGARI_LETTER_JJA  L"\u097c"
+#define UNITEXT_DEVANAGARI_LETTER_JJA  U"\u097c"
 #define UNICODE_DEVANAGARI_LETTER_GLOTTAL_STOP  0x097d
-#define UNITEXT_DEVANAGARI_LETTER_GLOTTAL_STOP  L"\u097d"
+#define UNITEXT_DEVANAGARI_LETTER_GLOTTAL_STOP  U"\u097d"
 #define UNICODE_DEVANAGARI_LETTER_DDDA  0x097e
-#define UNITEXT_DEVANAGARI_LETTER_DDDA  L"\u097e"
+#define UNITEXT_DEVANAGARI_LETTER_DDDA  U"\u097e"
 #define UNICODE_DEVANAGARI_LETTER_BBA  0x097f
-#define UNITEXT_DEVANAGARI_LETTER_BBA  L"\u097f"
+#define UNITEXT_DEVANAGARI_LETTER_BBA  U"\u097f"
 #define UNICODE_BENGALI_SIGN_CANDRABINDU  0x0981
-#define UNITEXT_BENGALI_SIGN_CANDRABINDU  L"\u0981"
+#define UNITEXT_BENGALI_SIGN_CANDRABINDU  U"\u0981"
 #define UNICODE_BENGALI_SIGN_ANUSVARA  0x0982
-#define UNITEXT_BENGALI_SIGN_ANUSVARA  L"\u0982"
+#define UNITEXT_BENGALI_SIGN_ANUSVARA  U"\u0982"
 #define UNICODE_BENGALI_SIGN_VISARGA  0x0983
-#define UNITEXT_BENGALI_SIGN_VISARGA  L"\u0983"
+#define UNITEXT_BENGALI_SIGN_VISARGA  U"\u0983"
 #define UNICODE_BENGALI_LETTER_A  0x0985
-#define UNITEXT_BENGALI_LETTER_A  L"\u0985"
+#define UNITEXT_BENGALI_LETTER_A  U"\u0985"
 #define UNICODE_BENGALI_LETTER_AA  0x0986
-#define UNITEXT_BENGALI_LETTER_AA  L"\u0986"
+#define UNITEXT_BENGALI_LETTER_AA  U"\u0986"
 #define UNICODE_BENGALI_LETTER_I  0x0987
-#define UNITEXT_BENGALI_LETTER_I  L"\u0987"
+#define UNITEXT_BENGALI_LETTER_I  U"\u0987"
 #define UNICODE_BENGALI_LETTER_II  0x0988
-#define UNITEXT_BENGALI_LETTER_II  L"\u0988"
+#define UNITEXT_BENGALI_LETTER_II  U"\u0988"
 #define UNICODE_BENGALI_LETTER_U  0x0989
-#define UNITEXT_BENGALI_LETTER_U  L"\u0989"
+#define UNITEXT_BENGALI_LETTER_U  U"\u0989"
 #define UNICODE_BENGALI_LETTER_UU  0x098a
-#define UNITEXT_BENGALI_LETTER_UU  L"\u098a"
+#define UNITEXT_BENGALI_LETTER_UU  U"\u098a"
 #define UNICODE_BENGALI_LETTER_VOCALIC_R  0x098b
-#define UNITEXT_BENGALI_LETTER_VOCALIC_R  L"\u098b"
+#define UNITEXT_BENGALI_LETTER_VOCALIC_R  U"\u098b"
 #define UNICODE_BENGALI_LETTER_VOCALIC_L  0x098c
-#define UNITEXT_BENGALI_LETTER_VOCALIC_L  L"\u098c"
+#define UNITEXT_BENGALI_LETTER_VOCALIC_L  U"\u098c"
 #define UNICODE_BENGALI_LETTER_E  0x098f
-#define UNITEXT_BENGALI_LETTER_E  L"\u098f"
+#define UNITEXT_BENGALI_LETTER_E  U"\u098f"
 #define UNICODE_BENGALI_LETTER_AI  0x0990
-#define UNITEXT_BENGALI_LETTER_AI  L"\u0990"
+#define UNITEXT_BENGALI_LETTER_AI  U"\u0990"
 #define UNICODE_BENGALI_LETTER_O  0x0993
-#define UNITEXT_BENGALI_LETTER_O  L"\u0993"
+#define UNITEXT_BENGALI_LETTER_O  U"\u0993"
 #define UNICODE_BENGALI_LETTER_AU  0x0994
-#define UNITEXT_BENGALI_LETTER_AU  L"\u0994"
+#define UNITEXT_BENGALI_LETTER_AU  U"\u0994"
 #define UNICODE_BENGALI_LETTER_KA  0x0995
-#define UNITEXT_BENGALI_LETTER_KA  L"\u0995"
+#define UNITEXT_BENGALI_LETTER_KA  U"\u0995"
 #define UNICODE_BENGALI_LETTER_KHA  0x0996
-#define UNITEXT_BENGALI_LETTER_KHA  L"\u0996"
+#define UNITEXT_BENGALI_LETTER_KHA  U"\u0996"
 #define UNICODE_BENGALI_LETTER_GA  0x0997
-#define UNITEXT_BENGALI_LETTER_GA  L"\u0997"
+#define UNITEXT_BENGALI_LETTER_GA  U"\u0997"
 #define UNICODE_BENGALI_LETTER_GHA  0x0998
-#define UNITEXT_BENGALI_LETTER_GHA  L"\u0998"
+#define UNITEXT_BENGALI_LETTER_GHA  U"\u0998"
 #define UNICODE_BENGALI_LETTER_NGA  0x0999
-#define UNITEXT_BENGALI_LETTER_NGA  L"\u0999"
+#define UNITEXT_BENGALI_LETTER_NGA  U"\u0999"
 #define UNICODE_BENGALI_LETTER_CA  0x099a
-#define UNITEXT_BENGALI_LETTER_CA  L"\u099a"
+#define UNITEXT_BENGALI_LETTER_CA  U"\u099a"
 #define UNICODE_BENGALI_LETTER_CHA  0x099b
-#define UNITEXT_BENGALI_LETTER_CHA  L"\u099b"
+#define UNITEXT_BENGALI_LETTER_CHA  U"\u099b"
 #define UNICODE_BENGALI_LETTER_JA  0x099c
-#define UNITEXT_BENGALI_LETTER_JA  L"\u099c"
+#define UNITEXT_BENGALI_LETTER_JA  U"\u099c"
 #define UNICODE_BENGALI_LETTER_JHA  0x099d
-#define UNITEXT_BENGALI_LETTER_JHA  L"\u099d"
+#define UNITEXT_BENGALI_LETTER_JHA  U"\u099d"
 #define UNICODE_BENGALI_LETTER_NYA  0x099e
-#define UNITEXT_BENGALI_LETTER_NYA  L"\u099e"
+#define UNITEXT_BENGALI_LETTER_NYA  U"\u099e"
 #define UNICODE_BENGALI_LETTER_TTA  0x099f
-#define UNITEXT_BENGALI_LETTER_TTA  L"\u099f"
+#define UNITEXT_BENGALI_LETTER_TTA  U"\u099f"
 #define UNICODE_BENGALI_LETTER_TTHA  0x09a0
-#define UNITEXT_BENGALI_LETTER_TTHA  L"\u09a0"
+#define UNITEXT_BENGALI_LETTER_TTHA  U"\u09a0"
 #define UNICODE_BENGALI_LETTER_DDA  0x09a1
-#define UNITEXT_BENGALI_LETTER_DDA  L"\u09a1"
+#define UNITEXT_BENGALI_LETTER_DDA  U"\u09a1"
 #define UNICODE_BENGALI_LETTER_DDHA  0x09a2
-#define UNITEXT_BENGALI_LETTER_DDHA  L"\u09a2"
+#define UNITEXT_BENGALI_LETTER_DDHA  U"\u09a2"
 #define UNICODE_BENGALI_LETTER_NNA  0x09a3
-#define UNITEXT_BENGALI_LETTER_NNA  L"\u09a3"
+#define UNITEXT_BENGALI_LETTER_NNA  U"\u09a3"
 #define UNICODE_BENGALI_LETTER_TA  0x09a4
-#define UNITEXT_BENGALI_LETTER_TA  L"\u09a4"
+#define UNITEXT_BENGALI_LETTER_TA  U"\u09a4"
 #define UNICODE_BENGALI_LETTER_THA  0x09a5
-#define UNITEXT_BENGALI_LETTER_THA  L"\u09a5"
+#define UNITEXT_BENGALI_LETTER_THA  U"\u09a5"
 #define UNICODE_BENGALI_LETTER_DA  0x09a6
-#define UNITEXT_BENGALI_LETTER_DA  L"\u09a6"
+#define UNITEXT_BENGALI_LETTER_DA  U"\u09a6"
 #define UNICODE_BENGALI_LETTER_DHA  0x09a7
-#define UNITEXT_BENGALI_LETTER_DHA  L"\u09a7"
+#define UNITEXT_BENGALI_LETTER_DHA  U"\u09a7"
 #define UNICODE_BENGALI_LETTER_NA  0x09a8
-#define UNITEXT_BENGALI_LETTER_NA  L"\u09a8"
+#define UNITEXT_BENGALI_LETTER_NA  U"\u09a8"
 #define UNICODE_BENGALI_LETTER_PA  0x09aa
-#define UNITEXT_BENGALI_LETTER_PA  L"\u09aa"
+#define UNITEXT_BENGALI_LETTER_PA  U"\u09aa"
 #define UNICODE_BENGALI_LETTER_PHA  0x09ab
-#define UNITEXT_BENGALI_LETTER_PHA  L"\u09ab"
+#define UNITEXT_BENGALI_LETTER_PHA  U"\u09ab"
 #define UNICODE_BENGALI_LETTER_BA  0x09ac
-#define UNITEXT_BENGALI_LETTER_BA  L"\u09ac"
+#define UNITEXT_BENGALI_LETTER_BA  U"\u09ac"
 #define UNICODE_BENGALI_LETTER_BHA  0x09ad
-#define UNITEXT_BENGALI_LETTER_BHA  L"\u09ad"
+#define UNITEXT_BENGALI_LETTER_BHA  U"\u09ad"
 #define UNICODE_BENGALI_LETTER_MA  0x09ae
-#define UNITEXT_BENGALI_LETTER_MA  L"\u09ae"
+#define UNITEXT_BENGALI_LETTER_MA  U"\u09ae"
 #define UNICODE_BENGALI_LETTER_YA  0x09af
-#define UNITEXT_BENGALI_LETTER_YA  L"\u09af"
+#define UNITEXT_BENGALI_LETTER_YA  U"\u09af"
 #define UNICODE_BENGALI_LETTER_RA  0x09b0
-#define UNITEXT_BENGALI_LETTER_RA  L"\u09b0"
+#define UNITEXT_BENGALI_LETTER_RA  U"\u09b0"
 #define UNICODE_BENGALI_LETTER_LA  0x09b2
-#define UNITEXT_BENGALI_LETTER_LA  L"\u09b2"
+#define UNITEXT_BENGALI_LETTER_LA  U"\u09b2"
 #define UNICODE_BENGALI_LETTER_SHA  0x09b6
-#define UNITEXT_BENGALI_LETTER_SHA  L"\u09b6"
+#define UNITEXT_BENGALI_LETTER_SHA  U"\u09b6"
 #define UNICODE_BENGALI_LETTER_SSA  0x09b7
-#define UNITEXT_BENGALI_LETTER_SSA  L"\u09b7"
+#define UNITEXT_BENGALI_LETTER_SSA  U"\u09b7"
 #define UNICODE_BENGALI_LETTER_SA  0x09b8
-#define UNITEXT_BENGALI_LETTER_SA  L"\u09b8"
+#define UNITEXT_BENGALI_LETTER_SA  U"\u09b8"
 #define UNICODE_BENGALI_LETTER_HA  0x09b9
-#define UNITEXT_BENGALI_LETTER_HA  L"\u09b9"
+#define UNITEXT_BENGALI_LETTER_HA  U"\u09b9"
 #define UNICODE_BENGALI_SIGN_NUKTA  0x09bc
-#define UNITEXT_BENGALI_SIGN_NUKTA  L"\u09bc"
+#define UNITEXT_BENGALI_SIGN_NUKTA  U"\u09bc"
 #define UNICODE_BENGALI_SIGN_AVAGRAHA  0x09bd
-#define UNITEXT_BENGALI_SIGN_AVAGRAHA  L"\u09bd"
+#define UNITEXT_BENGALI_SIGN_AVAGRAHA  U"\u09bd"
 #define UNICODE_BENGALI_VOWEL_SIGN_AA  0x09be
-#define UNITEXT_BENGALI_VOWEL_SIGN_AA  L"\u09be"
+#define UNITEXT_BENGALI_VOWEL_SIGN_AA  U"\u09be"
 #define UNICODE_BENGALI_VOWEL_SIGN_I  0x09bf
-#define UNITEXT_BENGALI_VOWEL_SIGN_I  L"\u09bf"
+#define UNITEXT_BENGALI_VOWEL_SIGN_I  U"\u09bf"
 #define UNICODE_BENGALI_VOWEL_SIGN_II  0x09c0
-#define UNITEXT_BENGALI_VOWEL_SIGN_II  L"\u09c0"
+#define UNITEXT_BENGALI_VOWEL_SIGN_II  U"\u09c0"
 #define UNICODE_BENGALI_VOWEL_SIGN_U  0x09c1
-#define UNITEXT_BENGALI_VOWEL_SIGN_U  L"\u09c1"
+#define UNITEXT_BENGALI_VOWEL_SIGN_U  U"\u09c1"
 #define UNICODE_BENGALI_VOWEL_SIGN_UU  0x09c2
-#define UNITEXT_BENGALI_VOWEL_SIGN_UU  L"\u09c2"
+#define UNITEXT_BENGALI_VOWEL_SIGN_UU  U"\u09c2"
 #define UNICODE_BENGALI_VOWEL_SIGN_VOCALIC_R  0x09c3
-#define UNITEXT_BENGALI_VOWEL_SIGN_VOCALIC_R  L"\u09c3"
+#define UNITEXT_BENGALI_VOWEL_SIGN_VOCALIC_R  U"\u09c3"
 #define UNICODE_BENGALI_VOWEL_SIGN_VOCALIC_RR  0x09c4
-#define UNITEXT_BENGALI_VOWEL_SIGN_VOCALIC_RR  L"\u09c4"
+#define UNITEXT_BENGALI_VOWEL_SIGN_VOCALIC_RR  U"\u09c4"
 #define UNICODE_BENGALI_VOWEL_SIGN_E  0x09c7
-#define UNITEXT_BENGALI_VOWEL_SIGN_E  L"\u09c7"
+#define UNITEXT_BENGALI_VOWEL_SIGN_E  U"\u09c7"
 #define UNICODE_BENGALI_VOWEL_SIGN_AI  0x09c8
-#define UNITEXT_BENGALI_VOWEL_SIGN_AI  L"\u09c8"
+#define UNITEXT_BENGALI_VOWEL_SIGN_AI  U"\u09c8"
 #define UNICODE_BENGALI_VOWEL_SIGN_O  0x09cb
-#define UNITEXT_BENGALI_VOWEL_SIGN_O  L"\u09cb"
+#define UNITEXT_BENGALI_VOWEL_SIGN_O  U"\u09cb"
 #define UNICODE_BENGALI_VOWEL_SIGN_AU  0x09cc
-#define UNITEXT_BENGALI_VOWEL_SIGN_AU  L"\u09cc"
+#define UNITEXT_BENGALI_VOWEL_SIGN_AU  U"\u09cc"
 #define UNICODE_BENGALI_SIGN_VIRAMA  0x09cd
-#define UNITEXT_BENGALI_SIGN_VIRAMA  L"\u09cd"
+#define UNITEXT_BENGALI_SIGN_VIRAMA  U"\u09cd"
 #define UNICODE_BENGALI_LETTER_KHANDA_TA  0x09ce
-#define UNITEXT_BENGALI_LETTER_KHANDA_TA  L"\u09ce"
+#define UNITEXT_BENGALI_LETTER_KHANDA_TA  U"\u09ce"
 #define UNICODE_BENGALI_AU_LENGTH_MARK  0x09d7
-#define UNITEXT_BENGALI_AU_LENGTH_MARK  L"\u09d7"
+#define UNITEXT_BENGALI_AU_LENGTH_MARK  U"\u09d7"
 #define UNICODE_BENGALI_LETTER_RRA  0x09dc
-#define UNITEXT_BENGALI_LETTER_RRA  L"\u09dc"
+#define UNITEXT_BENGALI_LETTER_RRA  U"\u09dc"
 #define UNICODE_BENGALI_LETTER_RHA  0x09dd
-#define UNITEXT_BENGALI_LETTER_RHA  L"\u09dd"
+#define UNITEXT_BENGALI_LETTER_RHA  U"\u09dd"
 #define UNICODE_BENGALI_LETTER_YYA  0x09df
-#define UNITEXT_BENGALI_LETTER_YYA  L"\u09df"
+#define UNITEXT_BENGALI_LETTER_YYA  U"\u09df"
 #define UNICODE_BENGALI_LETTER_VOCALIC_RR  0x09e0
-#define UNITEXT_BENGALI_LETTER_VOCALIC_RR  L"\u09e0"
+#define UNITEXT_BENGALI_LETTER_VOCALIC_RR  U"\u09e0"
 #define UNICODE_BENGALI_LETTER_VOCALIC_LL  0x09e1
-#define UNITEXT_BENGALI_LETTER_VOCALIC_LL  L"\u09e1"
+#define UNITEXT_BENGALI_LETTER_VOCALIC_LL  U"\u09e1"
 #define UNICODE_BENGALI_VOWEL_SIGN_VOCALIC_L  0x09e2
-#define UNITEXT_BENGALI_VOWEL_SIGN_VOCALIC_L  L"\u09e2"
+#define UNITEXT_BENGALI_VOWEL_SIGN_VOCALIC_L  U"\u09e2"
 #define UNICODE_BENGALI_VOWEL_SIGN_VOCALIC_LL  0x09e3
-#define UNITEXT_BENGALI_VOWEL_SIGN_VOCALIC_LL  L"\u09e3"
+#define UNITEXT_BENGALI_VOWEL_SIGN_VOCALIC_LL  U"\u09e3"
 #define UNICODE_BENGALI_DIGIT_ZERO  0x09e6
-#define UNITEXT_BENGALI_DIGIT_ZERO  L"\u09e6"
+#define UNITEXT_BENGALI_DIGIT_ZERO  U"\u09e6"
 #define UNICODE_BENGALI_DIGIT_ONE  0x09e7
-#define UNITEXT_BENGALI_DIGIT_ONE  L"\u09e7"
+#define UNITEXT_BENGALI_DIGIT_ONE  U"\u09e7"
 #define UNICODE_BENGALI_DIGIT_TWO  0x09e8
-#define UNITEXT_BENGALI_DIGIT_TWO  L"\u09e8"
+#define UNITEXT_BENGALI_DIGIT_TWO  U"\u09e8"
 #define UNICODE_BENGALI_DIGIT_THREE  0x09e9
-#define UNITEXT_BENGALI_DIGIT_THREE  L"\u09e9"
+#define UNITEXT_BENGALI_DIGIT_THREE  U"\u09e9"
 #define UNICODE_BENGALI_DIGIT_FOUR  0x09ea
-#define UNITEXT_BENGALI_DIGIT_FOUR  L"\u09ea"
+#define UNITEXT_BENGALI_DIGIT_FOUR  U"\u09ea"
 #define UNICODE_BENGALI_DIGIT_FIVE  0x09eb
-#define UNITEXT_BENGALI_DIGIT_FIVE  L"\u09eb"
+#define UNITEXT_BENGALI_DIGIT_FIVE  U"\u09eb"
 #define UNICODE_BENGALI_DIGIT_SIX  0x09ec
-#define UNITEXT_BENGALI_DIGIT_SIX  L"\u09ec"
+#define UNITEXT_BENGALI_DIGIT_SIX  U"\u09ec"
 #define UNICODE_BENGALI_DIGIT_SEVEN  0x09ed
-#define UNITEXT_BENGALI_DIGIT_SEVEN  L"\u09ed"
+#define UNITEXT_BENGALI_DIGIT_SEVEN  U"\u09ed"
 #define UNICODE_BENGALI_DIGIT_EIGHT  0x09ee
-#define UNITEXT_BENGALI_DIGIT_EIGHT  L"\u09ee"
+#define UNITEXT_BENGALI_DIGIT_EIGHT  U"\u09ee"
 #define UNICODE_BENGALI_DIGIT_NINE  0x09ef
-#define UNITEXT_BENGALI_DIGIT_NINE  L"\u09ef"
+#define UNITEXT_BENGALI_DIGIT_NINE  U"\u09ef"
 #define UNICODE_BENGALI_LETTER_RA_WITH_MIDDLE_DIAGONAL  0x09f0
-#define UNITEXT_BENGALI_LETTER_RA_WITH_MIDDLE_DIAGONAL  L"\u09f0"
+#define UNITEXT_BENGALI_LETTER_RA_WITH_MIDDLE_DIAGONAL  U"\u09f0"
 #define UNICODE_BENGALI_LETTER_RA_WITH_LOWER_DIAGONAL  0x09f1
-#define UNITEXT_BENGALI_LETTER_RA_WITH_LOWER_DIAGONAL  L"\u09f1"
+#define UNITEXT_BENGALI_LETTER_RA_WITH_LOWER_DIAGONAL  U"\u09f1"
 #define UNICODE_BENGALI_RUPEE_MARK  0x09f2
-#define UNITEXT_BENGALI_RUPEE_MARK  L"\u09f2"
+#define UNITEXT_BENGALI_RUPEE_MARK  U"\u09f2"
 #define UNICODE_BENGALI_RUPEE_SIGN  0x09f3
-#define UNITEXT_BENGALI_RUPEE_SIGN  L"\u09f3"
+#define UNITEXT_BENGALI_RUPEE_SIGN  U"\u09f3"
 #define UNICODE_BENGALI_CURRENCY_NUMERATOR_ONE  0x09f4
-#define UNITEXT_BENGALI_CURRENCY_NUMERATOR_ONE  L"\u09f4"
+#define UNITEXT_BENGALI_CURRENCY_NUMERATOR_ONE  U"\u09f4"
 #define UNICODE_BENGALI_CURRENCY_NUMERATOR_TWO  0x09f5
-#define UNITEXT_BENGALI_CURRENCY_NUMERATOR_TWO  L"\u09f5"
+#define UNITEXT_BENGALI_CURRENCY_NUMERATOR_TWO  U"\u09f5"
 #define UNICODE_BENGALI_CURRENCY_NUMERATOR_THREE  0x09f6
-#define UNITEXT_BENGALI_CURRENCY_NUMERATOR_THREE  L"\u09f6"
+#define UNITEXT_BENGALI_CURRENCY_NUMERATOR_THREE  U"\u09f6"
 #define UNICODE_BENGALI_CURRENCY_NUMERATOR_FOUR  0x09f7
-#define UNITEXT_BENGALI_CURRENCY_NUMERATOR_FOUR  L"\u09f7"
+#define UNITEXT_BENGALI_CURRENCY_NUMERATOR_FOUR  U"\u09f7"
 #define UNICODE_BENGALI_CURRENCY_NUMERATOR_ONE_LESS_THAN_THE_DENOMINATOR  0x09f8
-#define UNITEXT_BENGALI_CURRENCY_NUMERATOR_ONE_LESS_THAN_THE_DENOMINATOR  L"\u09f8"
+#define UNITEXT_BENGALI_CURRENCY_NUMERATOR_ONE_LESS_THAN_THE_DENOMINATOR  U"\u09f8"
 #define UNICODE_BENGALI_CURRENCY_DENOMINATOR_SIXTEEN  0x09f9
-#define UNITEXT_BENGALI_CURRENCY_DENOMINATOR_SIXTEEN  L"\u09f9"
+#define UNITEXT_BENGALI_CURRENCY_DENOMINATOR_SIXTEEN  U"\u09f9"
 #define UNICODE_BENGALI_ISSHAR  0x09fa
-#define UNITEXT_BENGALI_ISSHAR  L"\u09fa"
+#define UNITEXT_BENGALI_ISSHAR  U"\u09fa"
 #define UNICODE_GURMUKHI_SIGN_ADAK_BINDI  0x0a01
-#define UNITEXT_GURMUKHI_SIGN_ADAK_BINDI  L"\u0a01"
+#define UNITEXT_GURMUKHI_SIGN_ADAK_BINDI  U"\u0a01"
 #define UNICODE_GURMUKHI_SIGN_BINDI  0x0a02
-#define UNITEXT_GURMUKHI_SIGN_BINDI  L"\u0a02"
+#define UNITEXT_GURMUKHI_SIGN_BINDI  U"\u0a02"
 #define UNICODE_GURMUKHI_SIGN_VISARGA  0x0a03
-#define UNITEXT_GURMUKHI_SIGN_VISARGA  L"\u0a03"
+#define UNITEXT_GURMUKHI_SIGN_VISARGA  U"\u0a03"
 #define UNICODE_GURMUKHI_LETTER_A  0x0a05
-#define UNITEXT_GURMUKHI_LETTER_A  L"\u0a05"
+#define UNITEXT_GURMUKHI_LETTER_A  U"\u0a05"
 #define UNICODE_GURMUKHI_LETTER_AA  0x0a06
-#define UNITEXT_GURMUKHI_LETTER_AA  L"\u0a06"
+#define UNITEXT_GURMUKHI_LETTER_AA  U"\u0a06"
 #define UNICODE_GURMUKHI_LETTER_I  0x0a07
-#define UNITEXT_GURMUKHI_LETTER_I  L"\u0a07"
+#define UNITEXT_GURMUKHI_LETTER_I  U"\u0a07"
 #define UNICODE_GURMUKHI_LETTER_II  0x0a08
-#define UNITEXT_GURMUKHI_LETTER_II  L"\u0a08"
+#define UNITEXT_GURMUKHI_LETTER_II  U"\u0a08"
 #define UNICODE_GURMUKHI_LETTER_U  0x0a09
-#define UNITEXT_GURMUKHI_LETTER_U  L"\u0a09"
+#define UNITEXT_GURMUKHI_LETTER_U  U"\u0a09"
 #define UNICODE_GURMUKHI_LETTER_UU  0x0a0a
-#define UNITEXT_GURMUKHI_LETTER_UU  L"\u0a0a"
+#define UNITEXT_GURMUKHI_LETTER_UU  U"\u0a0a"
 #define UNICODE_GURMUKHI_LETTER_EE  0x0a0f
-#define UNITEXT_GURMUKHI_LETTER_EE  L"\u0a0f"
+#define UNITEXT_GURMUKHI_LETTER_EE  U"\u0a0f"
 #define UNICODE_GURMUKHI_LETTER_AI  0x0a10
-#define UNITEXT_GURMUKHI_LETTER_AI  L"\u0a10"
+#define UNITEXT_GURMUKHI_LETTER_AI  U"\u0a10"
 #define UNICODE_GURMUKHI_LETTER_OO  0x0a13
-#define UNITEXT_GURMUKHI_LETTER_OO  L"\u0a13"
+#define UNITEXT_GURMUKHI_LETTER_OO  U"\u0a13"
 #define UNICODE_GURMUKHI_LETTER_AU  0x0a14
-#define UNITEXT_GURMUKHI_LETTER_AU  L"\u0a14"
+#define UNITEXT_GURMUKHI_LETTER_AU  U"\u0a14"
 #define UNICODE_GURMUKHI_LETTER_KA  0x0a15
-#define UNITEXT_GURMUKHI_LETTER_KA  L"\u0a15"
+#define UNITEXT_GURMUKHI_LETTER_KA  U"\u0a15"
 #define UNICODE_GURMUKHI_LETTER_KHA  0x0a16
-#define UNITEXT_GURMUKHI_LETTER_KHA  L"\u0a16"
+#define UNITEXT_GURMUKHI_LETTER_KHA  U"\u0a16"
 #define UNICODE_GURMUKHI_LETTER_GA  0x0a17
-#define UNITEXT_GURMUKHI_LETTER_GA  L"\u0a17"
+#define UNITEXT_GURMUKHI_LETTER_GA  U"\u0a17"
 #define UNICODE_GURMUKHI_LETTER_GHA  0x0a18
-#define UNITEXT_GURMUKHI_LETTER_GHA  L"\u0a18"
+#define UNITEXT_GURMUKHI_LETTER_GHA  U"\u0a18"
 #define UNICODE_GURMUKHI_LETTER_NGA  0x0a19
-#define UNITEXT_GURMUKHI_LETTER_NGA  L"\u0a19"
+#define UNITEXT_GURMUKHI_LETTER_NGA  U"\u0a19"
 #define UNICODE_GURMUKHI_LETTER_CA  0x0a1a
-#define UNITEXT_GURMUKHI_LETTER_CA  L"\u0a1a"
+#define UNITEXT_GURMUKHI_LETTER_CA  U"\u0a1a"
 #define UNICODE_GURMUKHI_LETTER_CHA  0x0a1b
-#define UNITEXT_GURMUKHI_LETTER_CHA  L"\u0a1b"
+#define UNITEXT_GURMUKHI_LETTER_CHA  U"\u0a1b"
 #define UNICODE_GURMUKHI_LETTER_JA  0x0a1c
-#define UNITEXT_GURMUKHI_LETTER_JA  L"\u0a1c"
+#define UNITEXT_GURMUKHI_LETTER_JA  U"\u0a1c"
 #define UNICODE_GURMUKHI_LETTER_JHA  0x0a1d
-#define UNITEXT_GURMUKHI_LETTER_JHA  L"\u0a1d"
+#define UNITEXT_GURMUKHI_LETTER_JHA  U"\u0a1d"
 #define UNICODE_GURMUKHI_LETTER_NYA  0x0a1e
-#define UNITEXT_GURMUKHI_LETTER_NYA  L"\u0a1e"
+#define UNITEXT_GURMUKHI_LETTER_NYA  U"\u0a1e"
 #define UNICODE_GURMUKHI_LETTER_TTA  0x0a1f
-#define UNITEXT_GURMUKHI_LETTER_TTA  L"\u0a1f"
+#define UNITEXT_GURMUKHI_LETTER_TTA  U"\u0a1f"
 #define UNICODE_GURMUKHI_LETTER_TTHA  0x0a20
-#define UNITEXT_GURMUKHI_LETTER_TTHA  L"\u0a20"
+#define UNITEXT_GURMUKHI_LETTER_TTHA  U"\u0a20"
 #define UNICODE_GURMUKHI_LETTER_DDA  0x0a21
-#define UNITEXT_GURMUKHI_LETTER_DDA  L"\u0a21"
+#define UNITEXT_GURMUKHI_LETTER_DDA  U"\u0a21"
 #define UNICODE_GURMUKHI_LETTER_DDHA  0x0a22
-#define UNITEXT_GURMUKHI_LETTER_DDHA  L"\u0a22"
+#define UNITEXT_GURMUKHI_LETTER_DDHA  U"\u0a22"
 #define UNICODE_GURMUKHI_LETTER_NNA  0x0a23
-#define UNITEXT_GURMUKHI_LETTER_NNA  L"\u0a23"
+#define UNITEXT_GURMUKHI_LETTER_NNA  U"\u0a23"
 #define UNICODE_GURMUKHI_LETTER_TA  0x0a24
-#define UNITEXT_GURMUKHI_LETTER_TA  L"\u0a24"
+#define UNITEXT_GURMUKHI_LETTER_TA  U"\u0a24"
 #define UNICODE_GURMUKHI_LETTER_THA  0x0a25
-#define UNITEXT_GURMUKHI_LETTER_THA  L"\u0a25"
+#define UNITEXT_GURMUKHI_LETTER_THA  U"\u0a25"
 #define UNICODE_GURMUKHI_LETTER_DA  0x0a26
-#define UNITEXT_GURMUKHI_LETTER_DA  L"\u0a26"
+#define UNITEXT_GURMUKHI_LETTER_DA  U"\u0a26"
 #define UNICODE_GURMUKHI_LETTER_DHA  0x0a27
-#define UNITEXT_GURMUKHI_LETTER_DHA  L"\u0a27"
+#define UNITEXT_GURMUKHI_LETTER_DHA  U"\u0a27"
 #define UNICODE_GURMUKHI_LETTER_NA  0x0a28
-#define UNITEXT_GURMUKHI_LETTER_NA  L"\u0a28"
+#define UNITEXT_GURMUKHI_LETTER_NA  U"\u0a28"
 #define UNICODE_GURMUKHI_LETTER_PA  0x0a2a
-#define UNITEXT_GURMUKHI_LETTER_PA  L"\u0a2a"
+#define UNITEXT_GURMUKHI_LETTER_PA  U"\u0a2a"
 #define UNICODE_GURMUKHI_LETTER_PHA  0x0a2b
-#define UNITEXT_GURMUKHI_LETTER_PHA  L"\u0a2b"
+#define UNITEXT_GURMUKHI_LETTER_PHA  U"\u0a2b"
 #define UNICODE_GURMUKHI_LETTER_BA  0x0a2c
-#define UNITEXT_GURMUKHI_LETTER_BA  L"\u0a2c"
+#define UNITEXT_GURMUKHI_LETTER_BA  U"\u0a2c"
 #define UNICODE_GURMUKHI_LETTER_BHA  0x0a2d
-#define UNITEXT_GURMUKHI_LETTER_BHA  L"\u0a2d"
+#define UNITEXT_GURMUKHI_LETTER_BHA  U"\u0a2d"
 #define UNICODE_GURMUKHI_LETTER_MA  0x0a2e
-#define UNITEXT_GURMUKHI_LETTER_MA  L"\u0a2e"
+#define UNITEXT_GURMUKHI_LETTER_MA  U"\u0a2e"
 #define UNICODE_GURMUKHI_LETTER_YA  0x0a2f
-#define UNITEXT_GURMUKHI_LETTER_YA  L"\u0a2f"
+#define UNITEXT_GURMUKHI_LETTER_YA  U"\u0a2f"
 #define UNICODE_GURMUKHI_LETTER_RA  0x0a30
-#define UNITEXT_GURMUKHI_LETTER_RA  L"\u0a30"
+#define UNITEXT_GURMUKHI_LETTER_RA  U"\u0a30"
 #define UNICODE_GURMUKHI_LETTER_LA  0x0a32
-#define UNITEXT_GURMUKHI_LETTER_LA  L"\u0a32"
+#define UNITEXT_GURMUKHI_LETTER_LA  U"\u0a32"
 #define UNICODE_GURMUKHI_LETTER_LLA  0x0a33
-#define UNITEXT_GURMUKHI_LETTER_LLA  L"\u0a33"
+#define UNITEXT_GURMUKHI_LETTER_LLA  U"\u0a33"
 #define UNICODE_GURMUKHI_LETTER_VA  0x0a35
-#define UNITEXT_GURMUKHI_LETTER_VA  L"\u0a35"
+#define UNITEXT_GURMUKHI_LETTER_VA  U"\u0a35"
 #define UNICODE_GURMUKHI_LETTER_SHA  0x0a36
-#define UNITEXT_GURMUKHI_LETTER_SHA  L"\u0a36"
+#define UNITEXT_GURMUKHI_LETTER_SHA  U"\u0a36"
 #define UNICODE_GURMUKHI_LETTER_SA  0x0a38
-#define UNITEXT_GURMUKHI_LETTER_SA  L"\u0a38"
+#define UNITEXT_GURMUKHI_LETTER_SA  U"\u0a38"
 #define UNICODE_GURMUKHI_LETTER_HA  0x0a39
-#define UNITEXT_GURMUKHI_LETTER_HA  L"\u0a39"
+#define UNITEXT_GURMUKHI_LETTER_HA  U"\u0a39"
 #define UNICODE_GURMUKHI_SIGN_NUKTA  0x0a3c
-#define UNITEXT_GURMUKHI_SIGN_NUKTA  L"\u0a3c"
+#define UNITEXT_GURMUKHI_SIGN_NUKTA  U"\u0a3c"
 #define UNICODE_GURMUKHI_VOWEL_SIGN_AA  0x0a3e
-#define UNITEXT_GURMUKHI_VOWEL_SIGN_AA  L"\u0a3e"
+#define UNITEXT_GURMUKHI_VOWEL_SIGN_AA  U"\u0a3e"
 #define UNICODE_GURMUKHI_VOWEL_SIGN_I  0x0a3f
-#define UNITEXT_GURMUKHI_VOWEL_SIGN_I  L"\u0a3f"
+#define UNITEXT_GURMUKHI_VOWEL_SIGN_I  U"\u0a3f"
 #define UNICODE_GURMUKHI_VOWEL_SIGN_II  0x0a40
-#define UNITEXT_GURMUKHI_VOWEL_SIGN_II  L"\u0a40"
+#define UNITEXT_GURMUKHI_VOWEL_SIGN_II  U"\u0a40"
 #define UNICODE_GURMUKHI_VOWEL_SIGN_U  0x0a41
-#define UNITEXT_GURMUKHI_VOWEL_SIGN_U  L"\u0a41"
+#define UNITEXT_GURMUKHI_VOWEL_SIGN_U  U"\u0a41"
 #define UNICODE_GURMUKHI_VOWEL_SIGN_UU  0x0a42
-#define UNITEXT_GURMUKHI_VOWEL_SIGN_UU  L"\u0a42"
+#define UNITEXT_GURMUKHI_VOWEL_SIGN_UU  U"\u0a42"
 #define UNICODE_GURMUKHI_VOWEL_SIGN_EE  0x0a47
-#define UNITEXT_GURMUKHI_VOWEL_SIGN_EE  L"\u0a47"
+#define UNITEXT_GURMUKHI_VOWEL_SIGN_EE  U"\u0a47"
 #define UNICODE_GURMUKHI_VOWEL_SIGN_AI  0x0a48
-#define UNITEXT_GURMUKHI_VOWEL_SIGN_AI  L"\u0a48"
+#define UNITEXT_GURMUKHI_VOWEL_SIGN_AI  U"\u0a48"
 #define UNICODE_GURMUKHI_VOWEL_SIGN_OO  0x0a4b
-#define UNITEXT_GURMUKHI_VOWEL_SIGN_OO  L"\u0a4b"
+#define UNITEXT_GURMUKHI_VOWEL_SIGN_OO  U"\u0a4b"
 #define UNICODE_GURMUKHI_VOWEL_SIGN_AU  0x0a4c
-#define UNITEXT_GURMUKHI_VOWEL_SIGN_AU  L"\u0a4c"
+#define UNITEXT_GURMUKHI_VOWEL_SIGN_AU  U"\u0a4c"
 #define UNICODE_GURMUKHI_SIGN_VIRAMA  0x0a4d
-#define UNITEXT_GURMUKHI_SIGN_VIRAMA  L"\u0a4d"
+#define UNITEXT_GURMUKHI_SIGN_VIRAMA  U"\u0a4d"
 #define UNICODE_GURMUKHI_LETTER_KHHA  0x0a59
-#define UNITEXT_GURMUKHI_LETTER_KHHA  L"\u0a59"
+#define UNITEXT_GURMUKHI_LETTER_KHHA  U"\u0a59"
 #define UNICODE_GURMUKHI_LETTER_GHHA  0x0a5a
-#define UNITEXT_GURMUKHI_LETTER_GHHA  L"\u0a5a"
+#define UNITEXT_GURMUKHI_LETTER_GHHA  U"\u0a5a"
 #define UNICODE_GURMUKHI_LETTER_ZA  0x0a5b
-#define UNITEXT_GURMUKHI_LETTER_ZA  L"\u0a5b"
+#define UNITEXT_GURMUKHI_LETTER_ZA  U"\u0a5b"
 #define UNICODE_GURMUKHI_LETTER_RRA  0x0a5c
-#define UNITEXT_GURMUKHI_LETTER_RRA  L"\u0a5c"
+#define UNITEXT_GURMUKHI_LETTER_RRA  U"\u0a5c"
 #define UNICODE_GURMUKHI_LETTER_FA  0x0a5e
-#define UNITEXT_GURMUKHI_LETTER_FA  L"\u0a5e"
+#define UNITEXT_GURMUKHI_LETTER_FA  U"\u0a5e"
 #define UNICODE_GURMUKHI_DIGIT_ZERO  0x0a66
-#define UNITEXT_GURMUKHI_DIGIT_ZERO  L"\u0a66"
+#define UNITEXT_GURMUKHI_DIGIT_ZERO  U"\u0a66"
 #define UNICODE_GURMUKHI_DIGIT_ONE  0x0a67
-#define UNITEXT_GURMUKHI_DIGIT_ONE  L"\u0a67"
+#define UNITEXT_GURMUKHI_DIGIT_ONE  U"\u0a67"
 #define UNICODE_GURMUKHI_DIGIT_TWO  0x0a68
-#define UNITEXT_GURMUKHI_DIGIT_TWO  L"\u0a68"
+#define UNITEXT_GURMUKHI_DIGIT_TWO  U"\u0a68"
 #define UNICODE_GURMUKHI_DIGIT_THREE  0x0a69
-#define UNITEXT_GURMUKHI_DIGIT_THREE  L"\u0a69"
+#define UNITEXT_GURMUKHI_DIGIT_THREE  U"\u0a69"
 #define UNICODE_GURMUKHI_DIGIT_FOUR  0x0a6a
-#define UNITEXT_GURMUKHI_DIGIT_FOUR  L"\u0a6a"
+#define UNITEXT_GURMUKHI_DIGIT_FOUR  U"\u0a6a"
 #define UNICODE_GURMUKHI_DIGIT_FIVE  0x0a6b
-#define UNITEXT_GURMUKHI_DIGIT_FIVE  L"\u0a6b"
+#define UNITEXT_GURMUKHI_DIGIT_FIVE  U"\u0a6b"
 #define UNICODE_GURMUKHI_DIGIT_SIX  0x0a6c
-#define UNITEXT_GURMUKHI_DIGIT_SIX  L"\u0a6c"
+#define UNITEXT_GURMUKHI_DIGIT_SIX  U"\u0a6c"
 #define UNICODE_GURMUKHI_DIGIT_SEVEN  0x0a6d
-#define UNITEXT_GURMUKHI_DIGIT_SEVEN  L"\u0a6d"
+#define UNITEXT_GURMUKHI_DIGIT_SEVEN  U"\u0a6d"
 #define UNICODE_GURMUKHI_DIGIT_EIGHT  0x0a6e
-#define UNITEXT_GURMUKHI_DIGIT_EIGHT  L"\u0a6e"
+#define UNITEXT_GURMUKHI_DIGIT_EIGHT  U"\u0a6e"
 #define UNICODE_GURMUKHI_DIGIT_NINE  0x0a6f
-#define UNITEXT_GURMUKHI_DIGIT_NINE  L"\u0a6f"
+#define UNITEXT_GURMUKHI_DIGIT_NINE  U"\u0a6f"
 #define UNICODE_GURMUKHI_TIPPI  0x0a70
-#define UNITEXT_GURMUKHI_TIPPI  L"\u0a70"
+#define UNITEXT_GURMUKHI_TIPPI  U"\u0a70"
 #define UNICODE_GURMUKHI_ADDAK  0x0a71
-#define UNITEXT_GURMUKHI_ADDAK  L"\u0a71"
+#define UNITEXT_GURMUKHI_ADDAK  U"\u0a71"
 #define UNICODE_GURMUKHI_IRI  0x0a72
-#define UNITEXT_GURMUKHI_IRI  L"\u0a72"
+#define UNITEXT_GURMUKHI_IRI  U"\u0a72"
 #define UNICODE_GURMUKHI_URA  0x0a73
-#define UNITEXT_GURMUKHI_URA  L"\u0a73"
+#define UNITEXT_GURMUKHI_URA  U"\u0a73"
 #define UNICODE_GURMUKHI_EK_ONKAR  0x0a74
-#define UNITEXT_GURMUKHI_EK_ONKAR  L"\u0a74"
+#define UNITEXT_GURMUKHI_EK_ONKAR  U"\u0a74"
 #define UNICODE_GUJARATI_SIGN_CANDRABINDU  0x0a81
-#define UNITEXT_GUJARATI_SIGN_CANDRABINDU  L"\u0a81"
+#define UNITEXT_GUJARATI_SIGN_CANDRABINDU  U"\u0a81"
 #define UNICODE_GUJARATI_SIGN_ANUSVARA  0x0a82
-#define UNITEXT_GUJARATI_SIGN_ANUSVARA  L"\u0a82"
+#define UNITEXT_GUJARATI_SIGN_ANUSVARA  U"\u0a82"
 #define UNICODE_GUJARATI_SIGN_VISARGA  0x0a83
-#define UNITEXT_GUJARATI_SIGN_VISARGA  L"\u0a83"
+#define UNITEXT_GUJARATI_SIGN_VISARGA  U"\u0a83"
 #define UNICODE_GUJARATI_LETTER_A  0x0a85
-#define UNITEXT_GUJARATI_LETTER_A  L"\u0a85"
+#define UNITEXT_GUJARATI_LETTER_A  U"\u0a85"
 #define UNICODE_GUJARATI_LETTER_AA  0x0a86
-#define UNITEXT_GUJARATI_LETTER_AA  L"\u0a86"
+#define UNITEXT_GUJARATI_LETTER_AA  U"\u0a86"
 #define UNICODE_GUJARATI_LETTER_I  0x0a87
-#define UNITEXT_GUJARATI_LETTER_I  L"\u0a87"
+#define UNITEXT_GUJARATI_LETTER_I  U"\u0a87"
 #define UNICODE_GUJARATI_LETTER_II  0x0a88
-#define UNITEXT_GUJARATI_LETTER_II  L"\u0a88"
+#define UNITEXT_GUJARATI_LETTER_II  U"\u0a88"
 #define UNICODE_GUJARATI_LETTER_U  0x0a89
-#define UNITEXT_GUJARATI_LETTER_U  L"\u0a89"
+#define UNITEXT_GUJARATI_LETTER_U  U"\u0a89"
 #define UNICODE_GUJARATI_LETTER_UU  0x0a8a
-#define UNITEXT_GUJARATI_LETTER_UU  L"\u0a8a"
+#define UNITEXT_GUJARATI_LETTER_UU  U"\u0a8a"
 #define UNICODE_GUJARATI_LETTER_VOCALIC_R  0x0a8b
-#define UNITEXT_GUJARATI_LETTER_VOCALIC_R  L"\u0a8b"
+#define UNITEXT_GUJARATI_LETTER_VOCALIC_R  U"\u0a8b"
 #define UNICODE_GUJARATI_LETTER_VOCALIC_L  0x0a8c
-#define UNITEXT_GUJARATI_LETTER_VOCALIC_L  L"\u0a8c"
+#define UNITEXT_GUJARATI_LETTER_VOCALIC_L  U"\u0a8c"
 #define UNICODE_GUJARATI_VOWEL_CANDRA_E  0x0a8d
-#define UNITEXT_GUJARATI_VOWEL_CANDRA_E  L"\u0a8d"
+#define UNITEXT_GUJARATI_VOWEL_CANDRA_E  U"\u0a8d"
 #define UNICODE_GUJARATI_LETTER_E  0x0a8f
-#define UNITEXT_GUJARATI_LETTER_E  L"\u0a8f"
+#define UNITEXT_GUJARATI_LETTER_E  U"\u0a8f"
 #define UNICODE_GUJARATI_LETTER_AI  0x0a90
-#define UNITEXT_GUJARATI_LETTER_AI  L"\u0a90"
+#define UNITEXT_GUJARATI_LETTER_AI  U"\u0a90"
 #define UNICODE_GUJARATI_VOWEL_CANDRA_O  0x0a91
-#define UNITEXT_GUJARATI_VOWEL_CANDRA_O  L"\u0a91"
+#define UNITEXT_GUJARATI_VOWEL_CANDRA_O  U"\u0a91"
 #define UNICODE_GUJARATI_LETTER_O  0x0a93
-#define UNITEXT_GUJARATI_LETTER_O  L"\u0a93"
+#define UNITEXT_GUJARATI_LETTER_O  U"\u0a93"
 #define UNICODE_GUJARATI_LETTER_AU  0x0a94
-#define UNITEXT_GUJARATI_LETTER_AU  L"\u0a94"
+#define UNITEXT_GUJARATI_LETTER_AU  U"\u0a94"
 #define UNICODE_GUJARATI_LETTER_KA  0x0a95
-#define UNITEXT_GUJARATI_LETTER_KA  L"\u0a95"
+#define UNITEXT_GUJARATI_LETTER_KA  U"\u0a95"
 #define UNICODE_GUJARATI_LETTER_KHA  0x0a96
-#define UNITEXT_GUJARATI_LETTER_KHA  L"\u0a96"
+#define UNITEXT_GUJARATI_LETTER_KHA  U"\u0a96"
 #define UNICODE_GUJARATI_LETTER_GA  0x0a97
-#define UNITEXT_GUJARATI_LETTER_GA  L"\u0a97"
+#define UNITEXT_GUJARATI_LETTER_GA  U"\u0a97"
 #define UNICODE_GUJARATI_LETTER_GHA  0x0a98
-#define UNITEXT_GUJARATI_LETTER_GHA  L"\u0a98"
+#define UNITEXT_GUJARATI_LETTER_GHA  U"\u0a98"
 #define UNICODE_GUJARATI_LETTER_NGA  0x0a99
-#define UNITEXT_GUJARATI_LETTER_NGA  L"\u0a99"
+#define UNITEXT_GUJARATI_LETTER_NGA  U"\u0a99"
 #define UNICODE_GUJARATI_LETTER_CA  0x0a9a
-#define UNITEXT_GUJARATI_LETTER_CA  L"\u0a9a"
+#define UNITEXT_GUJARATI_LETTER_CA  U"\u0a9a"
 #define UNICODE_GUJARATI_LETTER_CHA  0x0a9b
-#define UNITEXT_GUJARATI_LETTER_CHA  L"\u0a9b"
+#define UNITEXT_GUJARATI_LETTER_CHA  U"\u0a9b"
 #define UNICODE_GUJARATI_LETTER_JA  0x0a9c
-#define UNITEXT_GUJARATI_LETTER_JA  L"\u0a9c"
+#define UNITEXT_GUJARATI_LETTER_JA  U"\u0a9c"
 #define UNICODE_GUJARATI_LETTER_JHA  0x0a9d
-#define UNITEXT_GUJARATI_LETTER_JHA  L"\u0a9d"
+#define UNITEXT_GUJARATI_LETTER_JHA  U"\u0a9d"
 #define UNICODE_GUJARATI_LETTER_NYA  0x0a9e
-#define UNITEXT_GUJARATI_LETTER_NYA  L"\u0a9e"
+#define UNITEXT_GUJARATI_LETTER_NYA  U"\u0a9e"
 #define UNICODE_GUJARATI_LETTER_TTA  0x0a9f
-#define UNITEXT_GUJARATI_LETTER_TTA  L"\u0a9f"
+#define UNITEXT_GUJARATI_LETTER_TTA  U"\u0a9f"
 #define UNICODE_GUJARATI_LETTER_TTHA  0x0aa0
-#define UNITEXT_GUJARATI_LETTER_TTHA  L"\u0aa0"
+#define UNITEXT_GUJARATI_LETTER_TTHA  U"\u0aa0"
 #define UNICODE_GUJARATI_LETTER_DDA  0x0aa1
-#define UNITEXT_GUJARATI_LETTER_DDA  L"\u0aa1"
+#define UNITEXT_GUJARATI_LETTER_DDA  U"\u0aa1"
 #define UNICODE_GUJARATI_LETTER_DDHA  0x0aa2
-#define UNITEXT_GUJARATI_LETTER_DDHA  L"\u0aa2"
+#define UNITEXT_GUJARATI_LETTER_DDHA  U"\u0aa2"
 #define UNICODE_GUJARATI_LETTER_NNA  0x0aa3
-#define UNITEXT_GUJARATI_LETTER_NNA  L"\u0aa3"
+#define UNITEXT_GUJARATI_LETTER_NNA  U"\u0aa3"
 #define UNICODE_GUJARATI_LETTER_TA  0x0aa4
-#define UNITEXT_GUJARATI_LETTER_TA  L"\u0aa4"
+#define UNITEXT_GUJARATI_LETTER_TA  U"\u0aa4"
 #define UNICODE_GUJARATI_LETTER_THA  0x0aa5
-#define UNITEXT_GUJARATI_LETTER_THA  L"\u0aa5"
+#define UNITEXT_GUJARATI_LETTER_THA  U"\u0aa5"
 #define UNICODE_GUJARATI_LETTER_DA  0x0aa6
-#define UNITEXT_GUJARATI_LETTER_DA  L"\u0aa6"
+#define UNITEXT_GUJARATI_LETTER_DA  U"\u0aa6"
 #define UNICODE_GUJARATI_LETTER_DHA  0x0aa7
-#define UNITEXT_GUJARATI_LETTER_DHA  L"\u0aa7"
+#define UNITEXT_GUJARATI_LETTER_DHA  U"\u0aa7"
 #define UNICODE_GUJARATI_LETTER_NA  0x0aa8
-#define UNITEXT_GUJARATI_LETTER_NA  L"\u0aa8"
+#define UNITEXT_GUJARATI_LETTER_NA  U"\u0aa8"
 #define UNICODE_GUJARATI_LETTER_PA  0x0aaa
-#define UNITEXT_GUJARATI_LETTER_PA  L"\u0aaa"
+#define UNITEXT_GUJARATI_LETTER_PA  U"\u0aaa"
 #define UNICODE_GUJARATI_LETTER_PHA  0x0aab
-#define UNITEXT_GUJARATI_LETTER_PHA  L"\u0aab"
+#define UNITEXT_GUJARATI_LETTER_PHA  U"\u0aab"
 #define UNICODE_GUJARATI_LETTER_BA  0x0aac
-#define UNITEXT_GUJARATI_LETTER_BA  L"\u0aac"
+#define UNITEXT_GUJARATI_LETTER_BA  U"\u0aac"
 #define UNICODE_GUJARATI_LETTER_BHA  0x0aad
-#define UNITEXT_GUJARATI_LETTER_BHA  L"\u0aad"
+#define UNITEXT_GUJARATI_LETTER_BHA  U"\u0aad"
 #define UNICODE_GUJARATI_LETTER_MA  0x0aae
-#define UNITEXT_GUJARATI_LETTER_MA  L"\u0aae"
+#define UNITEXT_GUJARATI_LETTER_MA  U"\u0aae"
 #define UNICODE_GUJARATI_LETTER_YA  0x0aaf
-#define UNITEXT_GUJARATI_LETTER_YA  L"\u0aaf"
+#define UNITEXT_GUJARATI_LETTER_YA  U"\u0aaf"
 #define UNICODE_GUJARATI_LETTER_RA  0x0ab0
-#define UNITEXT_GUJARATI_LETTER_RA  L"\u0ab0"
+#define UNITEXT_GUJARATI_LETTER_RA  U"\u0ab0"
 #define UNICODE_GUJARATI_LETTER_LA  0x0ab2
-#define UNITEXT_GUJARATI_LETTER_LA  L"\u0ab2"
+#define UNITEXT_GUJARATI_LETTER_LA  U"\u0ab2"
 #define UNICODE_GUJARATI_LETTER_LLA  0x0ab3
-#define UNITEXT_GUJARATI_LETTER_LLA  L"\u0ab3"
+#define UNITEXT_GUJARATI_LETTER_LLA  U"\u0ab3"
 #define UNICODE_GUJARATI_LETTER_VA  0x0ab5
-#define UNITEXT_GUJARATI_LETTER_VA  L"\u0ab5"
+#define UNITEXT_GUJARATI_LETTER_VA  U"\u0ab5"
 #define UNICODE_GUJARATI_LETTER_SHA  0x0ab6
-#define UNITEXT_GUJARATI_LETTER_SHA  L"\u0ab6"
+#define UNITEXT_GUJARATI_LETTER_SHA  U"\u0ab6"
 #define UNICODE_GUJARATI_LETTER_SSA  0x0ab7
-#define UNITEXT_GUJARATI_LETTER_SSA  L"\u0ab7"
+#define UNITEXT_GUJARATI_LETTER_SSA  U"\u0ab7"
 #define UNICODE_GUJARATI_LETTER_SA  0x0ab8
-#define UNITEXT_GUJARATI_LETTER_SA  L"\u0ab8"
+#define UNITEXT_GUJARATI_LETTER_SA  U"\u0ab8"
 #define UNICODE_GUJARATI_LETTER_HA  0x0ab9
-#define UNITEXT_GUJARATI_LETTER_HA  L"\u0ab9"
+#define UNITEXT_GUJARATI_LETTER_HA  U"\u0ab9"
 #define UNICODE_GUJARATI_SIGN_NUKTA  0x0abc
-#define UNITEXT_GUJARATI_SIGN_NUKTA  L"\u0abc"
+#define UNITEXT_GUJARATI_SIGN_NUKTA  U"\u0abc"
 #define UNICODE_GUJARATI_SIGN_AVAGRAHA  0x0abd
-#define UNITEXT_GUJARATI_SIGN_AVAGRAHA  L"\u0abd"
+#define UNITEXT_GUJARATI_SIGN_AVAGRAHA  U"\u0abd"
 #define UNICODE_GUJARATI_VOWEL_SIGN_AA  0x0abe
-#define UNITEXT_GUJARATI_VOWEL_SIGN_AA  L"\u0abe"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_AA  U"\u0abe"
 #define UNICODE_GUJARATI_VOWEL_SIGN_I  0x0abf
-#define UNITEXT_GUJARATI_VOWEL_SIGN_I  L"\u0abf"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_I  U"\u0abf"
 #define UNICODE_GUJARATI_VOWEL_SIGN_II  0x0ac0
-#define UNITEXT_GUJARATI_VOWEL_SIGN_II  L"\u0ac0"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_II  U"\u0ac0"
 #define UNICODE_GUJARATI_VOWEL_SIGN_U  0x0ac1
-#define UNITEXT_GUJARATI_VOWEL_SIGN_U  L"\u0ac1"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_U  U"\u0ac1"
 #define UNICODE_GUJARATI_VOWEL_SIGN_UU  0x0ac2
-#define UNITEXT_GUJARATI_VOWEL_SIGN_UU  L"\u0ac2"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_UU  U"\u0ac2"
 #define UNICODE_GUJARATI_VOWEL_SIGN_VOCALIC_R  0x0ac3
-#define UNITEXT_GUJARATI_VOWEL_SIGN_VOCALIC_R  L"\u0ac3"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_VOCALIC_R  U"\u0ac3"
 #define UNICODE_GUJARATI_VOWEL_SIGN_VOCALIC_RR  0x0ac4
-#define UNITEXT_GUJARATI_VOWEL_SIGN_VOCALIC_RR  L"\u0ac4"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_VOCALIC_RR  U"\u0ac4"
 #define UNICODE_GUJARATI_VOWEL_SIGN_CANDRA_E  0x0ac5
-#define UNITEXT_GUJARATI_VOWEL_SIGN_CANDRA_E  L"\u0ac5"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_CANDRA_E  U"\u0ac5"
 #define UNICODE_GUJARATI_VOWEL_SIGN_E  0x0ac7
-#define UNITEXT_GUJARATI_VOWEL_SIGN_E  L"\u0ac7"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_E  U"\u0ac7"
 #define UNICODE_GUJARATI_VOWEL_SIGN_AI  0x0ac8
-#define UNITEXT_GUJARATI_VOWEL_SIGN_AI  L"\u0ac8"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_AI  U"\u0ac8"
 #define UNICODE_GUJARATI_VOWEL_SIGN_CANDRA_O  0x0ac9
-#define UNITEXT_GUJARATI_VOWEL_SIGN_CANDRA_O  L"\u0ac9"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_CANDRA_O  U"\u0ac9"
 #define UNICODE_GUJARATI_VOWEL_SIGN_O  0x0acb
-#define UNITEXT_GUJARATI_VOWEL_SIGN_O  L"\u0acb"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_O  U"\u0acb"
 #define UNICODE_GUJARATI_VOWEL_SIGN_AU  0x0acc
-#define UNITEXT_GUJARATI_VOWEL_SIGN_AU  L"\u0acc"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_AU  U"\u0acc"
 #define UNICODE_GUJARATI_SIGN_VIRAMA  0x0acd
-#define UNITEXT_GUJARATI_SIGN_VIRAMA  L"\u0acd"
+#define UNITEXT_GUJARATI_SIGN_VIRAMA  U"\u0acd"
 #define UNICODE_GUJARATI_OM  0x0ad0
-#define UNITEXT_GUJARATI_OM  L"\u0ad0"
+#define UNITEXT_GUJARATI_OM  U"\u0ad0"
 #define UNICODE_GUJARATI_LETTER_VOCALIC_RR  0x0ae0
-#define UNITEXT_GUJARATI_LETTER_VOCALIC_RR  L"\u0ae0"
+#define UNITEXT_GUJARATI_LETTER_VOCALIC_RR  U"\u0ae0"
 #define UNICODE_GUJARATI_LETTER_VOCALIC_LL  0x0ae1
-#define UNITEXT_GUJARATI_LETTER_VOCALIC_LL  L"\u0ae1"
+#define UNITEXT_GUJARATI_LETTER_VOCALIC_LL  U"\u0ae1"
 #define UNICODE_GUJARATI_VOWEL_SIGN_VOCALIC_L  0x0ae2
-#define UNITEXT_GUJARATI_VOWEL_SIGN_VOCALIC_L  L"\u0ae2"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_VOCALIC_L  U"\u0ae2"
 #define UNICODE_GUJARATI_VOWEL_SIGN_VOCALIC_LL  0x0ae3
-#define UNITEXT_GUJARATI_VOWEL_SIGN_VOCALIC_LL  L"\u0ae3"
+#define UNITEXT_GUJARATI_VOWEL_SIGN_VOCALIC_LL  U"\u0ae3"
 #define UNICODE_GUJARATI_DIGIT_ZERO  0x0ae6
-#define UNITEXT_GUJARATI_DIGIT_ZERO  L"\u0ae6"
+#define UNITEXT_GUJARATI_DIGIT_ZERO  U"\u0ae6"
 #define UNICODE_GUJARATI_DIGIT_ONE  0x0ae7
-#define UNITEXT_GUJARATI_DIGIT_ONE  L"\u0ae7"
+#define UNITEXT_GUJARATI_DIGIT_ONE  U"\u0ae7"
 #define UNICODE_GUJARATI_DIGIT_TWO  0x0ae8
-#define UNITEXT_GUJARATI_DIGIT_TWO  L"\u0ae8"
+#define UNITEXT_GUJARATI_DIGIT_TWO  U"\u0ae8"
 #define UNICODE_GUJARATI_DIGIT_THREE  0x0ae9
-#define UNITEXT_GUJARATI_DIGIT_THREE  L"\u0ae9"
+#define UNITEXT_GUJARATI_DIGIT_THREE  U"\u0ae9"
 #define UNICODE_GUJARATI_DIGIT_FOUR  0x0aea
-#define UNITEXT_GUJARATI_DIGIT_FOUR  L"\u0aea"
+#define UNITEXT_GUJARATI_DIGIT_FOUR  U"\u0aea"
 #define UNICODE_GUJARATI_DIGIT_FIVE  0x0aeb
-#define UNITEXT_GUJARATI_DIGIT_FIVE  L"\u0aeb"
+#define UNITEXT_GUJARATI_DIGIT_FIVE  U"\u0aeb"
 #define UNICODE_GUJARATI_DIGIT_SIX  0x0aec
-#define UNITEXT_GUJARATI_DIGIT_SIX  L"\u0aec"
+#define UNITEXT_GUJARATI_DIGIT_SIX  U"\u0aec"
 #define UNICODE_GUJARATI_DIGIT_SEVEN  0x0aed
-#define UNITEXT_GUJARATI_DIGIT_SEVEN  L"\u0aed"
+#define UNITEXT_GUJARATI_DIGIT_SEVEN  U"\u0aed"
 #define UNICODE_GUJARATI_DIGIT_EIGHT  0x0aee
-#define UNITEXT_GUJARATI_DIGIT_EIGHT  L"\u0aee"
+#define UNITEXT_GUJARATI_DIGIT_EIGHT  U"\u0aee"
 #define UNICODE_GUJARATI_DIGIT_NINE  0x0aef
-#define UNITEXT_GUJARATI_DIGIT_NINE  L"\u0aef"
+#define UNITEXT_GUJARATI_DIGIT_NINE  U"\u0aef"
 #define UNICODE_GUJARATI_RUPEE_SIGN  0x0af1
-#define UNITEXT_GUJARATI_RUPEE_SIGN  L"\u0af1"
+#define UNITEXT_GUJARATI_RUPEE_SIGN  U"\u0af1"
 #define UNICODE_ORIYA_SIGN_CANDRABINDU  0x0b01
-#define UNITEXT_ORIYA_SIGN_CANDRABINDU  L"\u0b01"
+#define UNITEXT_ORIYA_SIGN_CANDRABINDU  U"\u0b01"
 #define UNICODE_ORIYA_SIGN_ANUSVARA  0x0b02
-#define UNITEXT_ORIYA_SIGN_ANUSVARA  L"\u0b02"
+#define UNITEXT_ORIYA_SIGN_ANUSVARA  U"\u0b02"
 #define UNICODE_ORIYA_SIGN_VISARGA  0x0b03
-#define UNITEXT_ORIYA_SIGN_VISARGA  L"\u0b03"
+#define UNITEXT_ORIYA_SIGN_VISARGA  U"\u0b03"
 #define UNICODE_ORIYA_LETTER_A  0x0b05
-#define UNITEXT_ORIYA_LETTER_A  L"\u0b05"
+#define UNITEXT_ORIYA_LETTER_A  U"\u0b05"
 #define UNICODE_ORIYA_LETTER_AA  0x0b06
-#define UNITEXT_ORIYA_LETTER_AA  L"\u0b06"
+#define UNITEXT_ORIYA_LETTER_AA  U"\u0b06"
 #define UNICODE_ORIYA_LETTER_I  0x0b07
-#define UNITEXT_ORIYA_LETTER_I  L"\u0b07"
+#define UNITEXT_ORIYA_LETTER_I  U"\u0b07"
 #define UNICODE_ORIYA_LETTER_II  0x0b08
-#define UNITEXT_ORIYA_LETTER_II  L"\u0b08"
+#define UNITEXT_ORIYA_LETTER_II  U"\u0b08"
 #define UNICODE_ORIYA_LETTER_U  0x0b09
-#define UNITEXT_ORIYA_LETTER_U  L"\u0b09"
+#define UNITEXT_ORIYA_LETTER_U  U"\u0b09"
 #define UNICODE_ORIYA_LETTER_UU  0x0b0a
-#define UNITEXT_ORIYA_LETTER_UU  L"\u0b0a"
+#define UNITEXT_ORIYA_LETTER_UU  U"\u0b0a"
 #define UNICODE_ORIYA_LETTER_VOCALIC_R  0x0b0b
-#define UNITEXT_ORIYA_LETTER_VOCALIC_R  L"\u0b0b"
+#define UNITEXT_ORIYA_LETTER_VOCALIC_R  U"\u0b0b"
 #define UNICODE_ORIYA_LETTER_VOCALIC_L  0x0b0c
-#define UNITEXT_ORIYA_LETTER_VOCALIC_L  L"\u0b0c"
+#define UNITEXT_ORIYA_LETTER_VOCALIC_L  U"\u0b0c"
 #define UNICODE_ORIYA_LETTER_E  0x0b0f
-#define UNITEXT_ORIYA_LETTER_E  L"\u0b0f"
+#define UNITEXT_ORIYA_LETTER_E  U"\u0b0f"
 #define UNICODE_ORIYA_LETTER_AI  0x0b10
-#define UNITEXT_ORIYA_LETTER_AI  L"\u0b10"
+#define UNITEXT_ORIYA_LETTER_AI  U"\u0b10"
 #define UNICODE_ORIYA_LETTER_O  0x0b13
-#define UNITEXT_ORIYA_LETTER_O  L"\u0b13"
+#define UNITEXT_ORIYA_LETTER_O  U"\u0b13"
 #define UNICODE_ORIYA_LETTER_AU  0x0b14
-#define UNITEXT_ORIYA_LETTER_AU  L"\u0b14"
+#define UNITEXT_ORIYA_LETTER_AU  U"\u0b14"
 #define UNICODE_ORIYA_LETTER_KA  0x0b15
-#define UNITEXT_ORIYA_LETTER_KA  L"\u0b15"
+#define UNITEXT_ORIYA_LETTER_KA  U"\u0b15"
 #define UNICODE_ORIYA_LETTER_KHA  0x0b16
-#define UNITEXT_ORIYA_LETTER_KHA  L"\u0b16"
+#define UNITEXT_ORIYA_LETTER_KHA  U"\u0b16"
 #define UNICODE_ORIYA_LETTER_GA  0x0b17
-#define UNITEXT_ORIYA_LETTER_GA  L"\u0b17"
+#define UNITEXT_ORIYA_LETTER_GA  U"\u0b17"
 #define UNICODE_ORIYA_LETTER_GHA  0x0b18
-#define UNITEXT_ORIYA_LETTER_GHA  L"\u0b18"
+#define UNITEXT_ORIYA_LETTER_GHA  U"\u0b18"
 #define UNICODE_ORIYA_LETTER_NGA  0x0b19
-#define UNITEXT_ORIYA_LETTER_NGA  L"\u0b19"
+#define UNITEXT_ORIYA_LETTER_NGA  U"\u0b19"
 #define UNICODE_ORIYA_LETTER_CA  0x0b1a
-#define UNITEXT_ORIYA_LETTER_CA  L"\u0b1a"
+#define UNITEXT_ORIYA_LETTER_CA  U"\u0b1a"
 #define UNICODE_ORIYA_LETTER_CHA  0x0b1b
-#define UNITEXT_ORIYA_LETTER_CHA  L"\u0b1b"
+#define UNITEXT_ORIYA_LETTER_CHA  U"\u0b1b"
 #define UNICODE_ORIYA_LETTER_JA  0x0b1c
-#define UNITEXT_ORIYA_LETTER_JA  L"\u0b1c"
+#define UNITEXT_ORIYA_LETTER_JA  U"\u0b1c"
 #define UNICODE_ORIYA_LETTER_JHA  0x0b1d
-#define UNITEXT_ORIYA_LETTER_JHA  L"\u0b1d"
+#define UNITEXT_ORIYA_LETTER_JHA  U"\u0b1d"
 #define UNICODE_ORIYA_LETTER_NYA  0x0b1e
-#define UNITEXT_ORIYA_LETTER_NYA  L"\u0b1e"
+#define UNITEXT_ORIYA_LETTER_NYA  U"\u0b1e"
 #define UNICODE_ORIYA_LETTER_TTA  0x0b1f
-#define UNITEXT_ORIYA_LETTER_TTA  L"\u0b1f"
+#define UNITEXT_ORIYA_LETTER_TTA  U"\u0b1f"
 #define UNICODE_ORIYA_LETTER_TTHA  0x0b20
-#define UNITEXT_ORIYA_LETTER_TTHA  L"\u0b20"
+#define UNITEXT_ORIYA_LETTER_TTHA  U"\u0b20"
 #define UNICODE_ORIYA_LETTER_DDA  0x0b21
-#define UNITEXT_ORIYA_LETTER_DDA  L"\u0b21"
+#define UNITEXT_ORIYA_LETTER_DDA  U"\u0b21"
 #define UNICODE_ORIYA_LETTER_DDHA  0x0b22
-#define UNITEXT_ORIYA_LETTER_DDHA  L"\u0b22"
+#define UNITEXT_ORIYA_LETTER_DDHA  U"\u0b22"
 #define UNICODE_ORIYA_LETTER_NNA  0x0b23
-#define UNITEXT_ORIYA_LETTER_NNA  L"\u0b23"
+#define UNITEXT_ORIYA_LETTER_NNA  U"\u0b23"
 #define UNICODE_ORIYA_LETTER_TA  0x0b24
-#define UNITEXT_ORIYA_LETTER_TA  L"\u0b24"
+#define UNITEXT_ORIYA_LETTER_TA  U"\u0b24"
 #define UNICODE_ORIYA_LETTER_THA  0x0b25
-#define UNITEXT_ORIYA_LETTER_THA  L"\u0b25"
+#define UNITEXT_ORIYA_LETTER_THA  U"\u0b25"
 #define UNICODE_ORIYA_LETTER_DA  0x0b26
-#define UNITEXT_ORIYA_LETTER_DA  L"\u0b26"
+#define UNITEXT_ORIYA_LETTER_DA  U"\u0b26"
 #define UNICODE_ORIYA_LETTER_DHA  0x0b27
-#define UNITEXT_ORIYA_LETTER_DHA  L"\u0b27"
+#define UNITEXT_ORIYA_LETTER_DHA  U"\u0b27"
 #define UNICODE_ORIYA_LETTER_NA  0x0b28
-#define UNITEXT_ORIYA_LETTER_NA  L"\u0b28"
+#define UNITEXT_ORIYA_LETTER_NA  U"\u0b28"
 #define UNICODE_ORIYA_LETTER_PA  0x0b2a
-#define UNITEXT_ORIYA_LETTER_PA  L"\u0b2a"
+#define UNITEXT_ORIYA_LETTER_PA  U"\u0b2a"
 #define UNICODE_ORIYA_LETTER_PHA  0x0b2b
-#define UNITEXT_ORIYA_LETTER_PHA  L"\u0b2b"
+#define UNITEXT_ORIYA_LETTER_PHA  U"\u0b2b"
 #define UNICODE_ORIYA_LETTER_BA  0x0b2c
-#define UNITEXT_ORIYA_LETTER_BA  L"\u0b2c"
+#define UNITEXT_ORIYA_LETTER_BA  U"\u0b2c"
 #define UNICODE_ORIYA_LETTER_BHA  0x0b2d
-#define UNITEXT_ORIYA_LETTER_BHA  L"\u0b2d"
+#define UNITEXT_ORIYA_LETTER_BHA  U"\u0b2d"
 #define UNICODE_ORIYA_LETTER_MA  0x0b2e
-#define UNITEXT_ORIYA_LETTER_MA  L"\u0b2e"
+#define UNITEXT_ORIYA_LETTER_MA  U"\u0b2e"
 #define UNICODE_ORIYA_LETTER_YA  0x0b2f
-#define UNITEXT_ORIYA_LETTER_YA  L"\u0b2f"
+#define UNITEXT_ORIYA_LETTER_YA  U"\u0b2f"
 #define UNICODE_ORIYA_LETTER_RA  0x0b30
-#define UNITEXT_ORIYA_LETTER_RA  L"\u0b30"
+#define UNITEXT_ORIYA_LETTER_RA  U"\u0b30"
 #define UNICODE_ORIYA_LETTER_LA  0x0b32
-#define UNITEXT_ORIYA_LETTER_LA  L"\u0b32"
+#define UNITEXT_ORIYA_LETTER_LA  U"\u0b32"
 #define UNICODE_ORIYA_LETTER_LLA  0x0b33
-#define UNITEXT_ORIYA_LETTER_LLA  L"\u0b33"
+#define UNITEXT_ORIYA_LETTER_LLA  U"\u0b33"
 #define UNICODE_ORIYA_LETTER_VA  0x0b35
-#define UNITEXT_ORIYA_LETTER_VA  L"\u0b35"
+#define UNITEXT_ORIYA_LETTER_VA  U"\u0b35"
 #define UNICODE_ORIYA_LETTER_SHA  0x0b36
-#define UNITEXT_ORIYA_LETTER_SHA  L"\u0b36"
+#define UNITEXT_ORIYA_LETTER_SHA  U"\u0b36"
 #define UNICODE_ORIYA_LETTER_SSA  0x0b37
-#define UNITEXT_ORIYA_LETTER_SSA  L"\u0b37"
+#define UNITEXT_ORIYA_LETTER_SSA  U"\u0b37"
 #define UNICODE_ORIYA_LETTER_SA  0x0b38
-#define UNITEXT_ORIYA_LETTER_SA  L"\u0b38"
+#define UNITEXT_ORIYA_LETTER_SA  U"\u0b38"
 #define UNICODE_ORIYA_LETTER_HA  0x0b39
-#define UNITEXT_ORIYA_LETTER_HA  L"\u0b39"
+#define UNITEXT_ORIYA_LETTER_HA  U"\u0b39"
 #define UNICODE_ORIYA_SIGN_NUKTA  0x0b3c
-#define UNITEXT_ORIYA_SIGN_NUKTA  L"\u0b3c"
+#define UNITEXT_ORIYA_SIGN_NUKTA  U"\u0b3c"
 #define UNICODE_ORIYA_SIGN_AVAGRAHA  0x0b3d
-#define UNITEXT_ORIYA_SIGN_AVAGRAHA  L"\u0b3d"
+#define UNITEXT_ORIYA_SIGN_AVAGRAHA  U"\u0b3d"
 #define UNICODE_ORIYA_VOWEL_SIGN_AA  0x0b3e
-#define UNITEXT_ORIYA_VOWEL_SIGN_AA  L"\u0b3e"
+#define UNITEXT_ORIYA_VOWEL_SIGN_AA  U"\u0b3e"
 #define UNICODE_ORIYA_VOWEL_SIGN_I  0x0b3f
-#define UNITEXT_ORIYA_VOWEL_SIGN_I  L"\u0b3f"
+#define UNITEXT_ORIYA_VOWEL_SIGN_I  U"\u0b3f"
 #define UNICODE_ORIYA_VOWEL_SIGN_II  0x0b40
-#define UNITEXT_ORIYA_VOWEL_SIGN_II  L"\u0b40"
+#define UNITEXT_ORIYA_VOWEL_SIGN_II  U"\u0b40"
 #define UNICODE_ORIYA_VOWEL_SIGN_U  0x0b41
-#define UNITEXT_ORIYA_VOWEL_SIGN_U  L"\u0b41"
+#define UNITEXT_ORIYA_VOWEL_SIGN_U  U"\u0b41"
 #define UNICODE_ORIYA_VOWEL_SIGN_UU  0x0b42
-#define UNITEXT_ORIYA_VOWEL_SIGN_UU  L"\u0b42"
+#define UNITEXT_ORIYA_VOWEL_SIGN_UU  U"\u0b42"
 #define UNICODE_ORIYA_VOWEL_SIGN_VOCALIC_R  0x0b43
-#define UNITEXT_ORIYA_VOWEL_SIGN_VOCALIC_R  L"\u0b43"
+#define UNITEXT_ORIYA_VOWEL_SIGN_VOCALIC_R  U"\u0b43"
 #define UNICODE_ORIYA_VOWEL_SIGN_E  0x0b47
-#define UNITEXT_ORIYA_VOWEL_SIGN_E  L"\u0b47"
+#define UNITEXT_ORIYA_VOWEL_SIGN_E  U"\u0b47"
 #define UNICODE_ORIYA_VOWEL_SIGN_AI  0x0b48
-#define UNITEXT_ORIYA_VOWEL_SIGN_AI  L"\u0b48"
+#define UNITEXT_ORIYA_VOWEL_SIGN_AI  U"\u0b48"
 #define UNICODE_ORIYA_VOWEL_SIGN_O  0x0b4b
-#define UNITEXT_ORIYA_VOWEL_SIGN_O  L"\u0b4b"
+#define UNITEXT_ORIYA_VOWEL_SIGN_O  U"\u0b4b"
 #define UNICODE_ORIYA_VOWEL_SIGN_AU  0x0b4c
-#define UNITEXT_ORIYA_VOWEL_SIGN_AU  L"\u0b4c"
+#define UNITEXT_ORIYA_VOWEL_SIGN_AU  U"\u0b4c"
 #define UNICODE_ORIYA_SIGN_VIRAMA  0x0b4d
-#define UNITEXT_ORIYA_SIGN_VIRAMA  L"\u0b4d"
+#define UNITEXT_ORIYA_SIGN_VIRAMA  U"\u0b4d"
 #define UNICODE_ORIYA_AI_LENGTH_MARK  0x0b56
-#define UNITEXT_ORIYA_AI_LENGTH_MARK  L"\u0b56"
+#define UNITEXT_ORIYA_AI_LENGTH_MARK  U"\u0b56"
 #define UNICODE_ORIYA_AU_LENGTH_MARK  0x0b57
-#define UNITEXT_ORIYA_AU_LENGTH_MARK  L"\u0b57"
+#define UNITEXT_ORIYA_AU_LENGTH_MARK  U"\u0b57"
 #define UNICODE_ORIYA_LETTER_RRA  0x0b5c
-#define UNITEXT_ORIYA_LETTER_RRA  L"\u0b5c"
+#define UNITEXT_ORIYA_LETTER_RRA  U"\u0b5c"
 #define UNICODE_ORIYA_LETTER_RHA  0x0b5d
-#define UNITEXT_ORIYA_LETTER_RHA  L"\u0b5d"
+#define UNITEXT_ORIYA_LETTER_RHA  U"\u0b5d"
 #define UNICODE_ORIYA_LETTER_YYA  0x0b5f
-#define UNITEXT_ORIYA_LETTER_YYA  L"\u0b5f"
+#define UNITEXT_ORIYA_LETTER_YYA  U"\u0b5f"
 #define UNICODE_ORIYA_LETTER_VOCALIC_RR  0x0b60
-#define UNITEXT_ORIYA_LETTER_VOCALIC_RR  L"\u0b60"
+#define UNITEXT_ORIYA_LETTER_VOCALIC_RR  U"\u0b60"
 #define UNICODE_ORIYA_LETTER_VOCALIC_LL  0x0b61
-#define UNITEXT_ORIYA_LETTER_VOCALIC_LL  L"\u0b61"
+#define UNITEXT_ORIYA_LETTER_VOCALIC_LL  U"\u0b61"
 #define UNICODE_ORIYA_DIGIT_ZERO  0x0b66
-#define UNITEXT_ORIYA_DIGIT_ZERO  L"\u0b66"
+#define UNITEXT_ORIYA_DIGIT_ZERO  U"\u0b66"
 #define UNICODE_ORIYA_DIGIT_ONE  0x0b67
-#define UNITEXT_ORIYA_DIGIT_ONE  L"\u0b67"
+#define UNITEXT_ORIYA_DIGIT_ONE  U"\u0b67"
 #define UNICODE_ORIYA_DIGIT_TWO  0x0b68
-#define UNITEXT_ORIYA_DIGIT_TWO  L"\u0b68"
+#define UNITEXT_ORIYA_DIGIT_TWO  U"\u0b68"
 #define UNICODE_ORIYA_DIGIT_THREE  0x0b69
-#define UNITEXT_ORIYA_DIGIT_THREE  L"\u0b69"
+#define UNITEXT_ORIYA_DIGIT_THREE  U"\u0b69"
 #define UNICODE_ORIYA_DIGIT_FOUR  0x0b6a
-#define UNITEXT_ORIYA_DIGIT_FOUR  L"\u0b6a"
+#define UNITEXT_ORIYA_DIGIT_FOUR  U"\u0b6a"
 #define UNICODE_ORIYA_DIGIT_FIVE  0x0b6b
-#define UNITEXT_ORIYA_DIGIT_FIVE  L"\u0b6b"
+#define UNITEXT_ORIYA_DIGIT_FIVE  U"\u0b6b"
 #define UNICODE_ORIYA_DIGIT_SIX  0x0b6c
-#define UNITEXT_ORIYA_DIGIT_SIX  L"\u0b6c"
+#define UNITEXT_ORIYA_DIGIT_SIX  U"\u0b6c"
 #define UNICODE_ORIYA_DIGIT_SEVEN  0x0b6d
-#define UNITEXT_ORIYA_DIGIT_SEVEN  L"\u0b6d"
+#define UNITEXT_ORIYA_DIGIT_SEVEN  U"\u0b6d"
 #define UNICODE_ORIYA_DIGIT_EIGHT  0x0b6e
-#define UNITEXT_ORIYA_DIGIT_EIGHT  L"\u0b6e"
+#define UNITEXT_ORIYA_DIGIT_EIGHT  U"\u0b6e"
 #define UNICODE_ORIYA_DIGIT_NINE  0x0b6f
-#define UNITEXT_ORIYA_DIGIT_NINE  L"\u0b6f"
+#define UNITEXT_ORIYA_DIGIT_NINE  U"\u0b6f"
 #define UNICODE_ORIYA_ISSHAR  0x0b70
-#define UNITEXT_ORIYA_ISSHAR  L"\u0b70"
+#define UNITEXT_ORIYA_ISSHAR  U"\u0b70"
 #define UNICODE_ORIYA_LETTER_WA  0x0b71
-#define UNITEXT_ORIYA_LETTER_WA  L"\u0b71"
+#define UNITEXT_ORIYA_LETTER_WA  U"\u0b71"
 #define UNICODE_TAMIL_SIGN_ANUSVARA  0x0b82
-#define UNITEXT_TAMIL_SIGN_ANUSVARA  L"\u0b82"
+#define UNITEXT_TAMIL_SIGN_ANUSVARA  U"\u0b82"
 #define UNICODE_TAMIL_SIGN_VISARGA  0x0b83
-#define UNITEXT_TAMIL_SIGN_VISARGA  L"\u0b83"
+#define UNITEXT_TAMIL_SIGN_VISARGA  U"\u0b83"
 #define UNICODE_TAMIL_LETTER_A  0x0b85
-#define UNITEXT_TAMIL_LETTER_A  L"\u0b85"
+#define UNITEXT_TAMIL_LETTER_A  U"\u0b85"
 #define UNICODE_TAMIL_LETTER_AA  0x0b86
-#define UNITEXT_TAMIL_LETTER_AA  L"\u0b86"
+#define UNITEXT_TAMIL_LETTER_AA  U"\u0b86"
 #define UNICODE_TAMIL_LETTER_I  0x0b87
-#define UNITEXT_TAMIL_LETTER_I  L"\u0b87"
+#define UNITEXT_TAMIL_LETTER_I  U"\u0b87"
 #define UNICODE_TAMIL_LETTER_II  0x0b88
-#define UNITEXT_TAMIL_LETTER_II  L"\u0b88"
+#define UNITEXT_TAMIL_LETTER_II  U"\u0b88"
 #define UNICODE_TAMIL_LETTER_U  0x0b89
-#define UNITEXT_TAMIL_LETTER_U  L"\u0b89"
+#define UNITEXT_TAMIL_LETTER_U  U"\u0b89"
 #define UNICODE_TAMIL_LETTER_UU  0x0b8a
-#define UNITEXT_TAMIL_LETTER_UU  L"\u0b8a"
+#define UNITEXT_TAMIL_LETTER_UU  U"\u0b8a"
 #define UNICODE_TAMIL_LETTER_E  0x0b8e
-#define UNITEXT_TAMIL_LETTER_E  L"\u0b8e"
+#define UNITEXT_TAMIL_LETTER_E  U"\u0b8e"
 #define UNICODE_TAMIL_LETTER_EE  0x0b8f
-#define UNITEXT_TAMIL_LETTER_EE  L"\u0b8f"
+#define UNITEXT_TAMIL_LETTER_EE  U"\u0b8f"
 #define UNICODE_TAMIL_LETTER_AI  0x0b90
-#define UNITEXT_TAMIL_LETTER_AI  L"\u0b90"
+#define UNITEXT_TAMIL_LETTER_AI  U"\u0b90"
 #define UNICODE_TAMIL_LETTER_O  0x0b92
-#define UNITEXT_TAMIL_LETTER_O  L"\u0b92"
+#define UNITEXT_TAMIL_LETTER_O  U"\u0b92"
 #define UNICODE_TAMIL_LETTER_OO  0x0b93
-#define UNITEXT_TAMIL_LETTER_OO  L"\u0b93"
+#define UNITEXT_TAMIL_LETTER_OO  U"\u0b93"
 #define UNICODE_TAMIL_LETTER_AU  0x0b94
-#define UNITEXT_TAMIL_LETTER_AU  L"\u0b94"
+#define UNITEXT_TAMIL_LETTER_AU  U"\u0b94"
 #define UNICODE_TAMIL_LETTER_KA  0x0b95
-#define UNITEXT_TAMIL_LETTER_KA  L"\u0b95"
+#define UNITEXT_TAMIL_LETTER_KA  U"\u0b95"
 #define UNICODE_TAMIL_LETTER_NGA  0x0b99
-#define UNITEXT_TAMIL_LETTER_NGA  L"\u0b99"
+#define UNITEXT_TAMIL_LETTER_NGA  U"\u0b99"
 #define UNICODE_TAMIL_LETTER_CA  0x0b9a
-#define UNITEXT_TAMIL_LETTER_CA  L"\u0b9a"
+#define UNITEXT_TAMIL_LETTER_CA  U"\u0b9a"
 #define UNICODE_TAMIL_LETTER_JA  0x0b9c
-#define UNITEXT_TAMIL_LETTER_JA  L"\u0b9c"
+#define UNITEXT_TAMIL_LETTER_JA  U"\u0b9c"
 #define UNICODE_TAMIL_LETTER_NYA  0x0b9e
-#define UNITEXT_TAMIL_LETTER_NYA  L"\u0b9e"
+#define UNITEXT_TAMIL_LETTER_NYA  U"\u0b9e"
 #define UNICODE_TAMIL_LETTER_TTA  0x0b9f
-#define UNITEXT_TAMIL_LETTER_TTA  L"\u0b9f"
+#define UNITEXT_TAMIL_LETTER_TTA  U"\u0b9f"
 #define UNICODE_TAMIL_LETTER_NNA  0x0ba3
-#define UNITEXT_TAMIL_LETTER_NNA  L"\u0ba3"
+#define UNITEXT_TAMIL_LETTER_NNA  U"\u0ba3"
 #define UNICODE_TAMIL_LETTER_TA  0x0ba4
-#define UNITEXT_TAMIL_LETTER_TA  L"\u0ba4"
+#define UNITEXT_TAMIL_LETTER_TA  U"\u0ba4"
 #define UNICODE_TAMIL_LETTER_NA  0x0ba8
-#define UNITEXT_TAMIL_LETTER_NA  L"\u0ba8"
+#define UNITEXT_TAMIL_LETTER_NA  U"\u0ba8"
 #define UNICODE_TAMIL_LETTER_NNNA  0x0ba9
-#define UNITEXT_TAMIL_LETTER_NNNA  L"\u0ba9"
+#define UNITEXT_TAMIL_LETTER_NNNA  U"\u0ba9"
 #define UNICODE_TAMIL_LETTER_PA  0x0baa
-#define UNITEXT_TAMIL_LETTER_PA  L"\u0baa"
+#define UNITEXT_TAMIL_LETTER_PA  U"\u0baa"
 #define UNICODE_TAMIL_LETTER_MA  0x0bae
-#define UNITEXT_TAMIL_LETTER_MA  L"\u0bae"
+#define UNITEXT_TAMIL_LETTER_MA  U"\u0bae"
 #define UNICODE_TAMIL_LETTER_YA  0x0baf
-#define UNITEXT_TAMIL_LETTER_YA  L"\u0baf"
+#define UNITEXT_TAMIL_LETTER_YA  U"\u0baf"
 #define UNICODE_TAMIL_LETTER_RA  0x0bb0
-#define UNITEXT_TAMIL_LETTER_RA  L"\u0bb0"
+#define UNITEXT_TAMIL_LETTER_RA  U"\u0bb0"
 #define UNICODE_TAMIL_LETTER_RRA  0x0bb1
-#define UNITEXT_TAMIL_LETTER_RRA  L"\u0bb1"
+#define UNITEXT_TAMIL_LETTER_RRA  U"\u0bb1"
 #define UNICODE_TAMIL_LETTER_LA  0x0bb2
-#define UNITEXT_TAMIL_LETTER_LA  L"\u0bb2"
+#define UNITEXT_TAMIL_LETTER_LA  U"\u0bb2"
 #define UNICODE_TAMIL_LETTER_LLA  0x0bb3
-#define UNITEXT_TAMIL_LETTER_LLA  L"\u0bb3"
+#define UNITEXT_TAMIL_LETTER_LLA  U"\u0bb3"
 #define UNICODE_TAMIL_LETTER_LLLA  0x0bb4
-#define UNITEXT_TAMIL_LETTER_LLLA  L"\u0bb4"
+#define UNITEXT_TAMIL_LETTER_LLLA  U"\u0bb4"
 #define UNICODE_TAMIL_LETTER_VA  0x0bb5
-#define UNITEXT_TAMIL_LETTER_VA  L"\u0bb5"
+#define UNITEXT_TAMIL_LETTER_VA  U"\u0bb5"
 #define UNICODE_TAMIL_LETTER_SHA  0x0bb6
-#define UNITEXT_TAMIL_LETTER_SHA  L"\u0bb6"
+#define UNITEXT_TAMIL_LETTER_SHA  U"\u0bb6"
 #define UNICODE_TAMIL_LETTER_SSA  0x0bb7
-#define UNITEXT_TAMIL_LETTER_SSA  L"\u0bb7"
+#define UNITEXT_TAMIL_LETTER_SSA  U"\u0bb7"
 #define UNICODE_TAMIL_LETTER_SA  0x0bb8
-#define UNITEXT_TAMIL_LETTER_SA  L"\u0bb8"
+#define UNITEXT_TAMIL_LETTER_SA  U"\u0bb8"
 #define UNICODE_TAMIL_LETTER_HA  0x0bb9
-#define UNITEXT_TAMIL_LETTER_HA  L"\u0bb9"
+#define UNITEXT_TAMIL_LETTER_HA  U"\u0bb9"
 #define UNICODE_TAMIL_VOWEL_SIGN_AA  0x0bbe
-#define UNITEXT_TAMIL_VOWEL_SIGN_AA  L"\u0bbe"
+#define UNITEXT_TAMIL_VOWEL_SIGN_AA  U"\u0bbe"
 #define UNICODE_TAMIL_VOWEL_SIGN_I  0x0bbf
-#define UNITEXT_TAMIL_VOWEL_SIGN_I  L"\u0bbf"
+#define UNITEXT_TAMIL_VOWEL_SIGN_I  U"\u0bbf"
 #define UNICODE_TAMIL_VOWEL_SIGN_II  0x0bc0
-#define UNITEXT_TAMIL_VOWEL_SIGN_II  L"\u0bc0"
+#define UNITEXT_TAMIL_VOWEL_SIGN_II  U"\u0bc0"
 #define UNICODE_TAMIL_VOWEL_SIGN_U  0x0bc1
-#define UNITEXT_TAMIL_VOWEL_SIGN_U  L"\u0bc1"
+#define UNITEXT_TAMIL_VOWEL_SIGN_U  U"\u0bc1"
 #define UNICODE_TAMIL_VOWEL_SIGN_UU  0x0bc2
-#define UNITEXT_TAMIL_VOWEL_SIGN_UU  L"\u0bc2"
+#define UNITEXT_TAMIL_VOWEL_SIGN_UU  U"\u0bc2"
 #define UNICODE_TAMIL_VOWEL_SIGN_E  0x0bc6
-#define UNITEXT_TAMIL_VOWEL_SIGN_E  L"\u0bc6"
+#define UNITEXT_TAMIL_VOWEL_SIGN_E  U"\u0bc6"
 #define UNICODE_TAMIL_VOWEL_SIGN_EE  0x0bc7
-#define UNITEXT_TAMIL_VOWEL_SIGN_EE  L"\u0bc7"
+#define UNITEXT_TAMIL_VOWEL_SIGN_EE  U"\u0bc7"
 #define UNICODE_TAMIL_VOWEL_SIGN_AI  0x0bc8
-#define UNITEXT_TAMIL_VOWEL_SIGN_AI  L"\u0bc8"
+#define UNITEXT_TAMIL_VOWEL_SIGN_AI  U"\u0bc8"
 #define UNICODE_TAMIL_VOWEL_SIGN_O  0x0bca
-#define UNITEXT_TAMIL_VOWEL_SIGN_O  L"\u0bca"
+#define UNITEXT_TAMIL_VOWEL_SIGN_O  U"\u0bca"
 #define UNICODE_TAMIL_VOWEL_SIGN_OO  0x0bcb
-#define UNITEXT_TAMIL_VOWEL_SIGN_OO  L"\u0bcb"
+#define UNITEXT_TAMIL_VOWEL_SIGN_OO  U"\u0bcb"
 #define UNICODE_TAMIL_VOWEL_SIGN_AU  0x0bcc
-#define UNITEXT_TAMIL_VOWEL_SIGN_AU  L"\u0bcc"
+#define UNITEXT_TAMIL_VOWEL_SIGN_AU  U"\u0bcc"
 #define UNICODE_TAMIL_SIGN_VIRAMA  0x0bcd
-#define UNITEXT_TAMIL_SIGN_VIRAMA  L"\u0bcd"
+#define UNITEXT_TAMIL_SIGN_VIRAMA  U"\u0bcd"
 #define UNICODE_TAMIL_AU_LENGTH_MARK  0x0bd7
-#define UNITEXT_TAMIL_AU_LENGTH_MARK  L"\u0bd7"
+#define UNITEXT_TAMIL_AU_LENGTH_MARK  U"\u0bd7"
 #define UNICODE_TAMIL_DIGIT_ZERO  0x0be6
-#define UNITEXT_TAMIL_DIGIT_ZERO  L"\u0be6"
+#define UNITEXT_TAMIL_DIGIT_ZERO  U"\u0be6"
 #define UNICODE_TAMIL_DIGIT_ONE  0x0be7
-#define UNITEXT_TAMIL_DIGIT_ONE  L"\u0be7"
+#define UNITEXT_TAMIL_DIGIT_ONE  U"\u0be7"
 #define UNICODE_TAMIL_DIGIT_TWO  0x0be8
-#define UNITEXT_TAMIL_DIGIT_TWO  L"\u0be8"
+#define UNITEXT_TAMIL_DIGIT_TWO  U"\u0be8"
 #define UNICODE_TAMIL_DIGIT_THREE  0x0be9
-#define UNITEXT_TAMIL_DIGIT_THREE  L"\u0be9"
+#define UNITEXT_TAMIL_DIGIT_THREE  U"\u0be9"
 #define UNICODE_TAMIL_DIGIT_FOUR  0x0bea
-#define UNITEXT_TAMIL_DIGIT_FOUR  L"\u0bea"
+#define UNITEXT_TAMIL_DIGIT_FOUR  U"\u0bea"
 #define UNICODE_TAMIL_DIGIT_FIVE  0x0beb
-#define UNITEXT_TAMIL_DIGIT_FIVE  L"\u0beb"
+#define UNITEXT_TAMIL_DIGIT_FIVE  U"\u0beb"
 #define UNICODE_TAMIL_DIGIT_SIX  0x0bec
-#define UNITEXT_TAMIL_DIGIT_SIX  L"\u0bec"
+#define UNITEXT_TAMIL_DIGIT_SIX  U"\u0bec"
 #define UNICODE_TAMIL_DIGIT_SEVEN  0x0bed
-#define UNITEXT_TAMIL_DIGIT_SEVEN  L"\u0bed"
+#define UNITEXT_TAMIL_DIGIT_SEVEN  U"\u0bed"
 #define UNICODE_TAMIL_DIGIT_EIGHT  0x0bee
-#define UNITEXT_TAMIL_DIGIT_EIGHT  L"\u0bee"
+#define UNITEXT_TAMIL_DIGIT_EIGHT  U"\u0bee"
 #define UNICODE_TAMIL_DIGIT_NINE  0x0bef
-#define UNITEXT_TAMIL_DIGIT_NINE  L"\u0bef"
+#define UNITEXT_TAMIL_DIGIT_NINE  U"\u0bef"
 #define UNICODE_TAMIL_NUMBER_TEN  0x0bf0
-#define UNITEXT_TAMIL_NUMBER_TEN  L"\u0bf0"
+#define UNITEXT_TAMIL_NUMBER_TEN  U"\u0bf0"
 #define UNICODE_TAMIL_NUMBER_ONE_HUNDRED  0x0bf1
-#define UNITEXT_TAMIL_NUMBER_ONE_HUNDRED  L"\u0bf1"
+#define UNITEXT_TAMIL_NUMBER_ONE_HUNDRED  U"\u0bf1"
 #define UNICODE_TAMIL_NUMBER_ONE_THOUSAND  0x0bf2
-#define UNITEXT_TAMIL_NUMBER_ONE_THOUSAND  L"\u0bf2"
+#define UNITEXT_TAMIL_NUMBER_ONE_THOUSAND  U"\u0bf2"
 #define UNICODE_TAMIL_DAY_SIGN  0x0bf3
-#define UNITEXT_TAMIL_DAY_SIGN  L"\u0bf3"
+#define UNITEXT_TAMIL_DAY_SIGN  U"\u0bf3"
 #define UNICODE_TAMIL_MONTH_SIGN  0x0bf4
-#define UNITEXT_TAMIL_MONTH_SIGN  L"\u0bf4"
+#define UNITEXT_TAMIL_MONTH_SIGN  U"\u0bf4"
 #define UNICODE_TAMIL_YEAR_SIGN  0x0bf5
-#define UNITEXT_TAMIL_YEAR_SIGN  L"\u0bf5"
+#define UNITEXT_TAMIL_YEAR_SIGN  U"\u0bf5"
 #define UNICODE_TAMIL_DEBIT_SIGN  0x0bf6
-#define UNITEXT_TAMIL_DEBIT_SIGN  L"\u0bf6"
+#define UNITEXT_TAMIL_DEBIT_SIGN  U"\u0bf6"
 #define UNICODE_TAMIL_CREDIT_SIGN  0x0bf7
-#define UNITEXT_TAMIL_CREDIT_SIGN  L"\u0bf7"
+#define UNITEXT_TAMIL_CREDIT_SIGN  U"\u0bf7"
 #define UNICODE_TAMIL_AS_ABOVE_SIGN  0x0bf8
-#define UNITEXT_TAMIL_AS_ABOVE_SIGN  L"\u0bf8"
+#define UNITEXT_TAMIL_AS_ABOVE_SIGN  U"\u0bf8"
 #define UNICODE_TAMIL_RUPEE_SIGN  0x0bf9
-#define UNITEXT_TAMIL_RUPEE_SIGN  L"\u0bf9"
+#define UNITEXT_TAMIL_RUPEE_SIGN  U"\u0bf9"
 #define UNICODE_TAMIL_NUMBER_SIGN  0x0bfa
-#define UNITEXT_TAMIL_NUMBER_SIGN  L"\u0bfa"
+#define UNITEXT_TAMIL_NUMBER_SIGN  U"\u0bfa"
 #define UNICODE_TELUGU_SIGN_CANDRABINDU  0x0c01
-#define UNITEXT_TELUGU_SIGN_CANDRABINDU  L"\u0c01"
+#define UNITEXT_TELUGU_SIGN_CANDRABINDU  U"\u0c01"
 #define UNICODE_TELUGU_SIGN_ANUSVARA  0x0c02
-#define UNITEXT_TELUGU_SIGN_ANUSVARA  L"\u0c02"
+#define UNITEXT_TELUGU_SIGN_ANUSVARA  U"\u0c02"
 #define UNICODE_TELUGU_SIGN_VISARGA  0x0c03
-#define UNITEXT_TELUGU_SIGN_VISARGA  L"\u0c03"
+#define UNITEXT_TELUGU_SIGN_VISARGA  U"\u0c03"
 #define UNICODE_TELUGU_LETTER_A  0x0c05
-#define UNITEXT_TELUGU_LETTER_A  L"\u0c05"
+#define UNITEXT_TELUGU_LETTER_A  U"\u0c05"
 #define UNICODE_TELUGU_LETTER_AA  0x0c06
-#define UNITEXT_TELUGU_LETTER_AA  L"\u0c06"
+#define UNITEXT_TELUGU_LETTER_AA  U"\u0c06"
 #define UNICODE_TELUGU_LETTER_I  0x0c07
-#define UNITEXT_TELUGU_LETTER_I  L"\u0c07"
+#define UNITEXT_TELUGU_LETTER_I  U"\u0c07"
 #define UNICODE_TELUGU_LETTER_II  0x0c08
-#define UNITEXT_TELUGU_LETTER_II  L"\u0c08"
+#define UNITEXT_TELUGU_LETTER_II  U"\u0c08"
 #define UNICODE_TELUGU_LETTER_U  0x0c09
-#define UNITEXT_TELUGU_LETTER_U  L"\u0c09"
+#define UNITEXT_TELUGU_LETTER_U  U"\u0c09"
 #define UNICODE_TELUGU_LETTER_UU  0x0c0a
-#define UNITEXT_TELUGU_LETTER_UU  L"\u0c0a"
+#define UNITEXT_TELUGU_LETTER_UU  U"\u0c0a"
 #define UNICODE_TELUGU_LETTER_VOCALIC_R  0x0c0b
-#define UNITEXT_TELUGU_LETTER_VOCALIC_R  L"\u0c0b"
+#define UNITEXT_TELUGU_LETTER_VOCALIC_R  U"\u0c0b"
 #define UNICODE_TELUGU_LETTER_VOCALIC_L  0x0c0c
-#define UNITEXT_TELUGU_LETTER_VOCALIC_L  L"\u0c0c"
+#define UNITEXT_TELUGU_LETTER_VOCALIC_L  U"\u0c0c"
 #define UNICODE_TELUGU_LETTER_E  0x0c0e
-#define UNITEXT_TELUGU_LETTER_E  L"\u0c0e"
+#define UNITEXT_TELUGU_LETTER_E  U"\u0c0e"
 #define UNICODE_TELUGU_LETTER_EE  0x0c0f
-#define UNITEXT_TELUGU_LETTER_EE  L"\u0c0f"
+#define UNITEXT_TELUGU_LETTER_EE  U"\u0c0f"
 #define UNICODE_TELUGU_LETTER_AI  0x0c10
-#define UNITEXT_TELUGU_LETTER_AI  L"\u0c10"
+#define UNITEXT_TELUGU_LETTER_AI  U"\u0c10"
 #define UNICODE_TELUGU_LETTER_O  0x0c12
-#define UNITEXT_TELUGU_LETTER_O  L"\u0c12"
+#define UNITEXT_TELUGU_LETTER_O  U"\u0c12"
 #define UNICODE_TELUGU_LETTER_OO  0x0c13
-#define UNITEXT_TELUGU_LETTER_OO  L"\u0c13"
+#define UNITEXT_TELUGU_LETTER_OO  U"\u0c13"
 #define UNICODE_TELUGU_LETTER_AU  0x0c14
-#define UNITEXT_TELUGU_LETTER_AU  L"\u0c14"
+#define UNITEXT_TELUGU_LETTER_AU  U"\u0c14"
 #define UNICODE_TELUGU_LETTER_KA  0x0c15
-#define UNITEXT_TELUGU_LETTER_KA  L"\u0c15"
+#define UNITEXT_TELUGU_LETTER_KA  U"\u0c15"
 #define UNICODE_TELUGU_LETTER_KHA  0x0c16
-#define UNITEXT_TELUGU_LETTER_KHA  L"\u0c16"
+#define UNITEXT_TELUGU_LETTER_KHA  U"\u0c16"
 #define UNICODE_TELUGU_LETTER_GA  0x0c17
-#define UNITEXT_TELUGU_LETTER_GA  L"\u0c17"
+#define UNITEXT_TELUGU_LETTER_GA  U"\u0c17"
 #define UNICODE_TELUGU_LETTER_GHA  0x0c18
-#define UNITEXT_TELUGU_LETTER_GHA  L"\u0c18"
+#define UNITEXT_TELUGU_LETTER_GHA  U"\u0c18"
 #define UNICODE_TELUGU_LETTER_NGA  0x0c19
-#define UNITEXT_TELUGU_LETTER_NGA  L"\u0c19"
+#define UNITEXT_TELUGU_LETTER_NGA  U"\u0c19"
 #define UNICODE_TELUGU_LETTER_CA  0x0c1a
-#define UNITEXT_TELUGU_LETTER_CA  L"\u0c1a"
+#define UNITEXT_TELUGU_LETTER_CA  U"\u0c1a"
 #define UNICODE_TELUGU_LETTER_CHA  0x0c1b
-#define UNITEXT_TELUGU_LETTER_CHA  L"\u0c1b"
+#define UNITEXT_TELUGU_LETTER_CHA  U"\u0c1b"
 #define UNICODE_TELUGU_LETTER_JA  0x0c1c
-#define UNITEXT_TELUGU_LETTER_JA  L"\u0c1c"
+#define UNITEXT_TELUGU_LETTER_JA  U"\u0c1c"
 #define UNICODE_TELUGU_LETTER_JHA  0x0c1d
-#define UNITEXT_TELUGU_LETTER_JHA  L"\u0c1d"
+#define UNITEXT_TELUGU_LETTER_JHA  U"\u0c1d"
 #define UNICODE_TELUGU_LETTER_NYA  0x0c1e
-#define UNITEXT_TELUGU_LETTER_NYA  L"\u0c1e"
+#define UNITEXT_TELUGU_LETTER_NYA  U"\u0c1e"
 #define UNICODE_TELUGU_LETTER_TTA  0x0c1f
-#define UNITEXT_TELUGU_LETTER_TTA  L"\u0c1f"
+#define UNITEXT_TELUGU_LETTER_TTA  U"\u0c1f"
 #define UNICODE_TELUGU_LETTER_TTHA  0x0c20
-#define UNITEXT_TELUGU_LETTER_TTHA  L"\u0c20"
+#define UNITEXT_TELUGU_LETTER_TTHA  U"\u0c20"
 #define UNICODE_TELUGU_LETTER_DDA  0x0c21
-#define UNITEXT_TELUGU_LETTER_DDA  L"\u0c21"
+#define UNITEXT_TELUGU_LETTER_DDA  U"\u0c21"
 #define UNICODE_TELUGU_LETTER_DDHA  0x0c22
-#define UNITEXT_TELUGU_LETTER_DDHA  L"\u0c22"
+#define UNITEXT_TELUGU_LETTER_DDHA  U"\u0c22"
 #define UNICODE_TELUGU_LETTER_NNA  0x0c23
-#define UNITEXT_TELUGU_LETTER_NNA  L"\u0c23"
+#define UNITEXT_TELUGU_LETTER_NNA  U"\u0c23"
 #define UNICODE_TELUGU_LETTER_TA  0x0c24
-#define UNITEXT_TELUGU_LETTER_TA  L"\u0c24"
+#define UNITEXT_TELUGU_LETTER_TA  U"\u0c24"
 #define UNICODE_TELUGU_LETTER_THA  0x0c25
-#define UNITEXT_TELUGU_LETTER_THA  L"\u0c25"
+#define UNITEXT_TELUGU_LETTER_THA  U"\u0c25"
 #define UNICODE_TELUGU_LETTER_DA  0x0c26
-#define UNITEXT_TELUGU_LETTER_DA  L"\u0c26"
+#define UNITEXT_TELUGU_LETTER_DA  U"\u0c26"
 #define UNICODE_TELUGU_LETTER_DHA  0x0c27
-#define UNITEXT_TELUGU_LETTER_DHA  L"\u0c27"
+#define UNITEXT_TELUGU_LETTER_DHA  U"\u0c27"
 #define UNICODE_TELUGU_LETTER_NA  0x0c28
-#define UNITEXT_TELUGU_LETTER_NA  L"\u0c28"
+#define UNITEXT_TELUGU_LETTER_NA  U"\u0c28"
 #define UNICODE_TELUGU_LETTER_PA  0x0c2a
-#define UNITEXT_TELUGU_LETTER_PA  L"\u0c2a"
+#define UNITEXT_TELUGU_LETTER_PA  U"\u0c2a"
 #define UNICODE_TELUGU_LETTER_PHA  0x0c2b
-#define UNITEXT_TELUGU_LETTER_PHA  L"\u0c2b"
+#define UNITEXT_TELUGU_LETTER_PHA  U"\u0c2b"
 #define UNICODE_TELUGU_LETTER_BA  0x0c2c
-#define UNITEXT_TELUGU_LETTER_BA  L"\u0c2c"
+#define UNITEXT_TELUGU_LETTER_BA  U"\u0c2c"
 #define UNICODE_TELUGU_LETTER_BHA  0x0c2d
-#define UNITEXT_TELUGU_LETTER_BHA  L"\u0c2d"
+#define UNITEXT_TELUGU_LETTER_BHA  U"\u0c2d"
 #define UNICODE_TELUGU_LETTER_MA  0x0c2e
-#define UNITEXT_TELUGU_LETTER_MA  L"\u0c2e"
+#define UNITEXT_TELUGU_LETTER_MA  U"\u0c2e"
 #define UNICODE_TELUGU_LETTER_YA  0x0c2f
-#define UNITEXT_TELUGU_LETTER_YA  L"\u0c2f"
+#define UNITEXT_TELUGU_LETTER_YA  U"\u0c2f"
 #define UNICODE_TELUGU_LETTER_RA  0x0c30
-#define UNITEXT_TELUGU_LETTER_RA  L"\u0c30"
+#define UNITEXT_TELUGU_LETTER_RA  U"\u0c30"
 #define UNICODE_TELUGU_LETTER_RRA  0x0c31
-#define UNITEXT_TELUGU_LETTER_RRA  L"\u0c31"
+#define UNITEXT_TELUGU_LETTER_RRA  U"\u0c31"
 #define UNICODE_TELUGU_LETTER_LA  0x0c32
-#define UNITEXT_TELUGU_LETTER_LA  L"\u0c32"
+#define UNITEXT_TELUGU_LETTER_LA  U"\u0c32"
 #define UNICODE_TELUGU_LETTER_LLA  0x0c33
-#define UNITEXT_TELUGU_LETTER_LLA  L"\u0c33"
+#define UNITEXT_TELUGU_LETTER_LLA  U"\u0c33"
 #define UNICODE_TELUGU_LETTER_VA  0x0c35
-#define UNITEXT_TELUGU_LETTER_VA  L"\u0c35"
+#define UNITEXT_TELUGU_LETTER_VA  U"\u0c35"
 #define UNICODE_TELUGU_LETTER_SHA  0x0c36
-#define UNITEXT_TELUGU_LETTER_SHA  L"\u0c36"
+#define UNITEXT_TELUGU_LETTER_SHA  U"\u0c36"
 #define UNICODE_TELUGU_LETTER_SSA  0x0c37
-#define UNITEXT_TELUGU_LETTER_SSA  L"\u0c37"
+#define UNITEXT_TELUGU_LETTER_SSA  U"\u0c37"
 #define UNICODE_TELUGU_LETTER_SA  0x0c38
-#define UNITEXT_TELUGU_LETTER_SA  L"\u0c38"
+#define UNITEXT_TELUGU_LETTER_SA  U"\u0c38"
 #define UNICODE_TELUGU_LETTER_HA  0x0c39
-#define UNITEXT_TELUGU_LETTER_HA  L"\u0c39"
+#define UNITEXT_TELUGU_LETTER_HA  U"\u0c39"
 #define UNICODE_TELUGU_VOWEL_SIGN_AA  0x0c3e
-#define UNITEXT_TELUGU_VOWEL_SIGN_AA  L"\u0c3e"
+#define UNITEXT_TELUGU_VOWEL_SIGN_AA  U"\u0c3e"
 #define UNICODE_TELUGU_VOWEL_SIGN_I  0x0c3f
-#define UNITEXT_TELUGU_VOWEL_SIGN_I  L"\u0c3f"
+#define UNITEXT_TELUGU_VOWEL_SIGN_I  U"\u0c3f"
 #define UNICODE_TELUGU_VOWEL_SIGN_II  0x0c40
-#define UNITEXT_TELUGU_VOWEL_SIGN_II  L"\u0c40"
+#define UNITEXT_TELUGU_VOWEL_SIGN_II  U"\u0c40"
 #define UNICODE_TELUGU_VOWEL_SIGN_U  0x0c41
-#define UNITEXT_TELUGU_VOWEL_SIGN_U  L"\u0c41"
+#define UNITEXT_TELUGU_VOWEL_SIGN_U  U"\u0c41"
 #define UNICODE_TELUGU_VOWEL_SIGN_UU  0x0c42
-#define UNITEXT_TELUGU_VOWEL_SIGN_UU  L"\u0c42"
+#define UNITEXT_TELUGU_VOWEL_SIGN_UU  U"\u0c42"
 #define UNICODE_TELUGU_VOWEL_SIGN_VOCALIC_R  0x0c43
-#define UNITEXT_TELUGU_VOWEL_SIGN_VOCALIC_R  L"\u0c43"
+#define UNITEXT_TELUGU_VOWEL_SIGN_VOCALIC_R  U"\u0c43"
 #define UNICODE_TELUGU_VOWEL_SIGN_VOCALIC_RR  0x0c44
-#define UNITEXT_TELUGU_VOWEL_SIGN_VOCALIC_RR  L"\u0c44"
+#define UNITEXT_TELUGU_VOWEL_SIGN_VOCALIC_RR  U"\u0c44"
 #define UNICODE_TELUGU_VOWEL_SIGN_E  0x0c46
-#define UNITEXT_TELUGU_VOWEL_SIGN_E  L"\u0c46"
+#define UNITEXT_TELUGU_VOWEL_SIGN_E  U"\u0c46"
 #define UNICODE_TELUGU_VOWEL_SIGN_EE  0x0c47
-#define UNITEXT_TELUGU_VOWEL_SIGN_EE  L"\u0c47"
+#define UNITEXT_TELUGU_VOWEL_SIGN_EE  U"\u0c47"
 #define UNICODE_TELUGU_VOWEL_SIGN_AI  0x0c48
-#define UNITEXT_TELUGU_VOWEL_SIGN_AI  L"\u0c48"
+#define UNITEXT_TELUGU_VOWEL_SIGN_AI  U"\u0c48"
 #define UNICODE_TELUGU_VOWEL_SIGN_O  0x0c4a
-#define UNITEXT_TELUGU_VOWEL_SIGN_O  L"\u0c4a"
+#define UNITEXT_TELUGU_VOWEL_SIGN_O  U"\u0c4a"
 #define UNICODE_TELUGU_VOWEL_SIGN_OO  0x0c4b
-#define UNITEXT_TELUGU_VOWEL_SIGN_OO  L"\u0c4b"
+#define UNITEXT_TELUGU_VOWEL_SIGN_OO  U"\u0c4b"
 #define UNICODE_TELUGU_VOWEL_SIGN_AU  0x0c4c
-#define UNITEXT_TELUGU_VOWEL_SIGN_AU  L"\u0c4c"
+#define UNITEXT_TELUGU_VOWEL_SIGN_AU  U"\u0c4c"
 #define UNICODE_TELUGU_SIGN_VIRAMA  0x0c4d
-#define UNITEXT_TELUGU_SIGN_VIRAMA  L"\u0c4d"
+#define UNITEXT_TELUGU_SIGN_VIRAMA  U"\u0c4d"
 #define UNICODE_TELUGU_LENGTH_MARK  0x0c55
-#define UNITEXT_TELUGU_LENGTH_MARK  L"\u0c55"
+#define UNITEXT_TELUGU_LENGTH_MARK  U"\u0c55"
 #define UNICODE_TELUGU_AI_LENGTH_MARK  0x0c56
-#define UNITEXT_TELUGU_AI_LENGTH_MARK  L"\u0c56"
+#define UNITEXT_TELUGU_AI_LENGTH_MARK  U"\u0c56"
 #define UNICODE_TELUGU_LETTER_VOCALIC_RR  0x0c60
-#define UNITEXT_TELUGU_LETTER_VOCALIC_RR  L"\u0c60"
+#define UNITEXT_TELUGU_LETTER_VOCALIC_RR  U"\u0c60"
 #define UNICODE_TELUGU_LETTER_VOCALIC_LL  0x0c61
-#define UNITEXT_TELUGU_LETTER_VOCALIC_LL  L"\u0c61"
+#define UNITEXT_TELUGU_LETTER_VOCALIC_LL  U"\u0c61"
 #define UNICODE_TELUGU_DIGIT_ZERO  0x0c66
-#define UNITEXT_TELUGU_DIGIT_ZERO  L"\u0c66"
+#define UNITEXT_TELUGU_DIGIT_ZERO  U"\u0c66"
 #define UNICODE_TELUGU_DIGIT_ONE  0x0c67
-#define UNITEXT_TELUGU_DIGIT_ONE  L"\u0c67"
+#define UNITEXT_TELUGU_DIGIT_ONE  U"\u0c67"
 #define UNICODE_TELUGU_DIGIT_TWO  0x0c68
-#define UNITEXT_TELUGU_DIGIT_TWO  L"\u0c68"
+#define UNITEXT_TELUGU_DIGIT_TWO  U"\u0c68"
 #define UNICODE_TELUGU_DIGIT_THREE  0x0c69
-#define UNITEXT_TELUGU_DIGIT_THREE  L"\u0c69"
+#define UNITEXT_TELUGU_DIGIT_THREE  U"\u0c69"
 #define UNICODE_TELUGU_DIGIT_FOUR  0x0c6a
-#define UNITEXT_TELUGU_DIGIT_FOUR  L"\u0c6a"
+#define UNITEXT_TELUGU_DIGIT_FOUR  U"\u0c6a"
 #define UNICODE_TELUGU_DIGIT_FIVE  0x0c6b
-#define UNITEXT_TELUGU_DIGIT_FIVE  L"\u0c6b"
+#define UNITEXT_TELUGU_DIGIT_FIVE  U"\u0c6b"
 #define UNICODE_TELUGU_DIGIT_SIX  0x0c6c
-#define UNITEXT_TELUGU_DIGIT_SIX  L"\u0c6c"
+#define UNITEXT_TELUGU_DIGIT_SIX  U"\u0c6c"
 #define UNICODE_TELUGU_DIGIT_SEVEN  0x0c6d
-#define UNITEXT_TELUGU_DIGIT_SEVEN  L"\u0c6d"
+#define UNITEXT_TELUGU_DIGIT_SEVEN  U"\u0c6d"
 #define UNICODE_TELUGU_DIGIT_EIGHT  0x0c6e
-#define UNITEXT_TELUGU_DIGIT_EIGHT  L"\u0c6e"
+#define UNITEXT_TELUGU_DIGIT_EIGHT  U"\u0c6e"
 #define UNICODE_TELUGU_DIGIT_NINE  0x0c6f
-#define UNITEXT_TELUGU_DIGIT_NINE  L"\u0c6f"
+#define UNITEXT_TELUGU_DIGIT_NINE  U"\u0c6f"
 #define UNICODE_KANNADA_SIGN_ANUSVARA  0x0c82
-#define UNITEXT_KANNADA_SIGN_ANUSVARA  L"\u0c82"
+#define UNITEXT_KANNADA_SIGN_ANUSVARA  U"\u0c82"
 #define UNICODE_KANNADA_SIGN_VISARGA  0x0c83
-#define UNITEXT_KANNADA_SIGN_VISARGA  L"\u0c83"
+#define UNITEXT_KANNADA_SIGN_VISARGA  U"\u0c83"
 #define UNICODE_KANNADA_LETTER_A  0x0c85
-#define UNITEXT_KANNADA_LETTER_A  L"\u0c85"
+#define UNITEXT_KANNADA_LETTER_A  U"\u0c85"
 #define UNICODE_KANNADA_LETTER_AA  0x0c86
-#define UNITEXT_KANNADA_LETTER_AA  L"\u0c86"
+#define UNITEXT_KANNADA_LETTER_AA  U"\u0c86"
 #define UNICODE_KANNADA_LETTER_I  0x0c87
-#define UNITEXT_KANNADA_LETTER_I  L"\u0c87"
+#define UNITEXT_KANNADA_LETTER_I  U"\u0c87"
 #define UNICODE_KANNADA_LETTER_II  0x0c88
-#define UNITEXT_KANNADA_LETTER_II  L"\u0c88"
+#define UNITEXT_KANNADA_LETTER_II  U"\u0c88"
 #define UNICODE_KANNADA_LETTER_U  0x0c89
-#define UNITEXT_KANNADA_LETTER_U  L"\u0c89"
+#define UNITEXT_KANNADA_LETTER_U  U"\u0c89"
 #define UNICODE_KANNADA_LETTER_UU  0x0c8a
-#define UNITEXT_KANNADA_LETTER_UU  L"\u0c8a"
+#define UNITEXT_KANNADA_LETTER_UU  U"\u0c8a"
 #define UNICODE_KANNADA_LETTER_VOCALIC_R  0x0c8b
-#define UNITEXT_KANNADA_LETTER_VOCALIC_R  L"\u0c8b"
+#define UNITEXT_KANNADA_LETTER_VOCALIC_R  U"\u0c8b"
 #define UNICODE_KANNADA_LETTER_VOCALIC_L  0x0c8c
-#define UNITEXT_KANNADA_LETTER_VOCALIC_L  L"\u0c8c"
+#define UNITEXT_KANNADA_LETTER_VOCALIC_L  U"\u0c8c"
 #define UNICODE_KANNADA_LETTER_E  0x0c8e
-#define UNITEXT_KANNADA_LETTER_E  L"\u0c8e"
+#define UNITEXT_KANNADA_LETTER_E  U"\u0c8e"
 #define UNICODE_KANNADA_LETTER_EE  0x0c8f
-#define UNITEXT_KANNADA_LETTER_EE  L"\u0c8f"
+#define UNITEXT_KANNADA_LETTER_EE  U"\u0c8f"
 #define UNICODE_KANNADA_LETTER_AI  0x0c90
-#define UNITEXT_KANNADA_LETTER_AI  L"\u0c90"
+#define UNITEXT_KANNADA_LETTER_AI  U"\u0c90"
 #define UNICODE_KANNADA_LETTER_O  0x0c92
-#define UNITEXT_KANNADA_LETTER_O  L"\u0c92"
+#define UNITEXT_KANNADA_LETTER_O  U"\u0c92"
 #define UNICODE_KANNADA_LETTER_OO  0x0c93
-#define UNITEXT_KANNADA_LETTER_OO  L"\u0c93"
+#define UNITEXT_KANNADA_LETTER_OO  U"\u0c93"
 #define UNICODE_KANNADA_LETTER_AU  0x0c94
-#define UNITEXT_KANNADA_LETTER_AU  L"\u0c94"
+#define UNITEXT_KANNADA_LETTER_AU  U"\u0c94"
 #define UNICODE_KANNADA_LETTER_KA  0x0c95
-#define UNITEXT_KANNADA_LETTER_KA  L"\u0c95"
+#define UNITEXT_KANNADA_LETTER_KA  U"\u0c95"
 #define UNICODE_KANNADA_LETTER_KHA  0x0c96
-#define UNITEXT_KANNADA_LETTER_KHA  L"\u0c96"
+#define UNITEXT_KANNADA_LETTER_KHA  U"\u0c96"
 #define UNICODE_KANNADA_LETTER_GA  0x0c97
-#define UNITEXT_KANNADA_LETTER_GA  L"\u0c97"
+#define UNITEXT_KANNADA_LETTER_GA  U"\u0c97"
 #define UNICODE_KANNADA_LETTER_GHA  0x0c98
-#define UNITEXT_KANNADA_LETTER_GHA  L"\u0c98"
+#define UNITEXT_KANNADA_LETTER_GHA  U"\u0c98"
 #define UNICODE_KANNADA_LETTER_NGA  0x0c99
-#define UNITEXT_KANNADA_LETTER_NGA  L"\u0c99"
+#define UNITEXT_KANNADA_LETTER_NGA  U"\u0c99"
 #define UNICODE_KANNADA_LETTER_CA  0x0c9a
-#define UNITEXT_KANNADA_LETTER_CA  L"\u0c9a"
+#define UNITEXT_KANNADA_LETTER_CA  U"\u0c9a"
 #define UNICODE_KANNADA_LETTER_CHA  0x0c9b
-#define UNITEXT_KANNADA_LETTER_CHA  L"\u0c9b"
+#define UNITEXT_KANNADA_LETTER_CHA  U"\u0c9b"
 #define UNICODE_KANNADA_LETTER_JA  0x0c9c
-#define UNITEXT_KANNADA_LETTER_JA  L"\u0c9c"
+#define UNITEXT_KANNADA_LETTER_JA  U"\u0c9c"
 #define UNICODE_KANNADA_LETTER_JHA  0x0c9d
-#define UNITEXT_KANNADA_LETTER_JHA  L"\u0c9d"
+#define UNITEXT_KANNADA_LETTER_JHA  U"\u0c9d"
 #define UNICODE_KANNADA_LETTER_NYA  0x0c9e
-#define UNITEXT_KANNADA_LETTER_NYA  L"\u0c9e"
+#define UNITEXT_KANNADA_LETTER_NYA  U"\u0c9e"
 #define UNICODE_KANNADA_LETTER_TTA  0x0c9f
-#define UNITEXT_KANNADA_LETTER_TTA  L"\u0c9f"
+#define UNITEXT_KANNADA_LETTER_TTA  U"\u0c9f"
 #define UNICODE_KANNADA_LETTER_TTHA  0x0ca0
-#define UNITEXT_KANNADA_LETTER_TTHA  L"\u0ca0"
+#define UNITEXT_KANNADA_LETTER_TTHA  U"\u0ca0"
 #define UNICODE_KANNADA_LETTER_DDA  0x0ca1
-#define UNITEXT_KANNADA_LETTER_DDA  L"\u0ca1"
+#define UNITEXT_KANNADA_LETTER_DDA  U"\u0ca1"
 #define UNICODE_KANNADA_LETTER_DDHA  0x0ca2
-#define UNITEXT_KANNADA_LETTER_DDHA  L"\u0ca2"
+#define UNITEXT_KANNADA_LETTER_DDHA  U"\u0ca2"
 #define UNICODE_KANNADA_LETTER_NNA  0x0ca3
-#define UNITEXT_KANNADA_LETTER_NNA  L"\u0ca3"
+#define UNITEXT_KANNADA_LETTER_NNA  U"\u0ca3"
 #define UNICODE_KANNADA_LETTER_TA  0x0ca4
-#define UNITEXT_KANNADA_LETTER_TA  L"\u0ca4"
+#define UNITEXT_KANNADA_LETTER_TA  U"\u0ca4"
 #define UNICODE_KANNADA_LETTER_THA  0x0ca5
-#define UNITEXT_KANNADA_LETTER_THA  L"\u0ca5"
+#define UNITEXT_KANNADA_LETTER_THA  U"\u0ca5"
 #define UNICODE_KANNADA_LETTER_DA  0x0ca6
-#define UNITEXT_KANNADA_LETTER_DA  L"\u0ca6"
+#define UNITEXT_KANNADA_LETTER_DA  U"\u0ca6"
 #define UNICODE_KANNADA_LETTER_DHA  0x0ca7
-#define UNITEXT_KANNADA_LETTER_DHA  L"\u0ca7"
+#define UNITEXT_KANNADA_LETTER_DHA  U"\u0ca7"
 #define UNICODE_KANNADA_LETTER_NA  0x0ca8
-#define UNITEXT_KANNADA_LETTER_NA  L"\u0ca8"
+#define UNITEXT_KANNADA_LETTER_NA  U"\u0ca8"
 #define UNICODE_KANNADA_LETTER_PA  0x0caa
-#define UNITEXT_KANNADA_LETTER_PA  L"\u0caa"
+#define UNITEXT_KANNADA_LETTER_PA  U"\u0caa"
 #define UNICODE_KANNADA_LETTER_PHA  0x0cab
-#define UNITEXT_KANNADA_LETTER_PHA  L"\u0cab"
+#define UNITEXT_KANNADA_LETTER_PHA  U"\u0cab"
 #define UNICODE_KANNADA_LETTER_BA  0x0cac
-#define UNITEXT_KANNADA_LETTER_BA  L"\u0cac"
+#define UNITEXT_KANNADA_LETTER_BA  U"\u0cac"
 #define UNICODE_KANNADA_LETTER_BHA  0x0cad
-#define UNITEXT_KANNADA_LETTER_BHA  L"\u0cad"
+#define UNITEXT_KANNADA_LETTER_BHA  U"\u0cad"
 #define UNICODE_KANNADA_LETTER_MA  0x0cae
-#define UNITEXT_KANNADA_LETTER_MA  L"\u0cae"
+#define UNITEXT_KANNADA_LETTER_MA  U"\u0cae"
 #define UNICODE_KANNADA_LETTER_YA  0x0caf
-#define UNITEXT_KANNADA_LETTER_YA  L"\u0caf"
+#define UNITEXT_KANNADA_LETTER_YA  U"\u0caf"
 #define UNICODE_KANNADA_LETTER_RA  0x0cb0
-#define UNITEXT_KANNADA_LETTER_RA  L"\u0cb0"
+#define UNITEXT_KANNADA_LETTER_RA  U"\u0cb0"
 #define UNICODE_KANNADA_LETTER_RRA  0x0cb1
-#define UNITEXT_KANNADA_LETTER_RRA  L"\u0cb1"
+#define UNITEXT_KANNADA_LETTER_RRA  U"\u0cb1"
 #define UNICODE_KANNADA_LETTER_LA  0x0cb2
-#define UNITEXT_KANNADA_LETTER_LA  L"\u0cb2"
+#define UNITEXT_KANNADA_LETTER_LA  U"\u0cb2"
 #define UNICODE_KANNADA_LETTER_LLA  0x0cb3
-#define UNITEXT_KANNADA_LETTER_LLA  L"\u0cb3"
+#define UNITEXT_KANNADA_LETTER_LLA  U"\u0cb3"
 #define UNICODE_KANNADA_LETTER_VA  0x0cb5
-#define UNITEXT_KANNADA_LETTER_VA  L"\u0cb5"
+#define UNITEXT_KANNADA_LETTER_VA  U"\u0cb5"
 #define UNICODE_KANNADA_LETTER_SHA  0x0cb6
-#define UNITEXT_KANNADA_LETTER_SHA  L"\u0cb6"
+#define UNITEXT_KANNADA_LETTER_SHA  U"\u0cb6"
 #define UNICODE_KANNADA_LETTER_SSA  0x0cb7
-#define UNITEXT_KANNADA_LETTER_SSA  L"\u0cb7"
+#define UNITEXT_KANNADA_LETTER_SSA  U"\u0cb7"
 #define UNICODE_KANNADA_LETTER_SA  0x0cb8
-#define UNITEXT_KANNADA_LETTER_SA  L"\u0cb8"
+#define UNITEXT_KANNADA_LETTER_SA  U"\u0cb8"
 #define UNICODE_KANNADA_LETTER_HA  0x0cb9
-#define UNITEXT_KANNADA_LETTER_HA  L"\u0cb9"
+#define UNITEXT_KANNADA_LETTER_HA  U"\u0cb9"
 #define UNICODE_KANNADA_SIGN_NUKTA  0x0cbc
-#define UNITEXT_KANNADA_SIGN_NUKTA  L"\u0cbc"
+#define UNITEXT_KANNADA_SIGN_NUKTA  U"\u0cbc"
 #define UNICODE_KANNADA_SIGN_AVAGRAHA  0x0cbd
-#define UNITEXT_KANNADA_SIGN_AVAGRAHA  L"\u0cbd"
+#define UNITEXT_KANNADA_SIGN_AVAGRAHA  U"\u0cbd"
 #define UNICODE_KANNADA_VOWEL_SIGN_AA  0x0cbe
-#define UNITEXT_KANNADA_VOWEL_SIGN_AA  L"\u0cbe"
+#define UNITEXT_KANNADA_VOWEL_SIGN_AA  U"\u0cbe"
 #define UNICODE_KANNADA_VOWEL_SIGN_I  0x0cbf
-#define UNITEXT_KANNADA_VOWEL_SIGN_I  L"\u0cbf"
+#define UNITEXT_KANNADA_VOWEL_SIGN_I  U"\u0cbf"
 #define UNICODE_KANNADA_VOWEL_SIGN_II  0x0cc0
-#define UNITEXT_KANNADA_VOWEL_SIGN_II  L"\u0cc0"
+#define UNITEXT_KANNADA_VOWEL_SIGN_II  U"\u0cc0"
 #define UNICODE_KANNADA_VOWEL_SIGN_U  0x0cc1
-#define UNITEXT_KANNADA_VOWEL_SIGN_U  L"\u0cc1"
+#define UNITEXT_KANNADA_VOWEL_SIGN_U  U"\u0cc1"
 #define UNICODE_KANNADA_VOWEL_SIGN_UU  0x0cc2
-#define UNITEXT_KANNADA_VOWEL_SIGN_UU  L"\u0cc2"
+#define UNITEXT_KANNADA_VOWEL_SIGN_UU  U"\u0cc2"
 #define UNICODE_KANNADA_VOWEL_SIGN_VOCALIC_R  0x0cc3
-#define UNITEXT_KANNADA_VOWEL_SIGN_VOCALIC_R  L"\u0cc3"
+#define UNITEXT_KANNADA_VOWEL_SIGN_VOCALIC_R  U"\u0cc3"
 #define UNICODE_KANNADA_VOWEL_SIGN_VOCALIC_RR  0x0cc4
-#define UNITEXT_KANNADA_VOWEL_SIGN_VOCALIC_RR  L"\u0cc4"
+#define UNITEXT_KANNADA_VOWEL_SIGN_VOCALIC_RR  U"\u0cc4"
 #define UNICODE_KANNADA_VOWEL_SIGN_E  0x0cc6
-#define UNITEXT_KANNADA_VOWEL_SIGN_E  L"\u0cc6"
+#define UNITEXT_KANNADA_VOWEL_SIGN_E  U"\u0cc6"
 #define UNICODE_KANNADA_VOWEL_SIGN_EE  0x0cc7
-#define UNITEXT_KANNADA_VOWEL_SIGN_EE  L"\u0cc7"
+#define UNITEXT_KANNADA_VOWEL_SIGN_EE  U"\u0cc7"
 #define UNICODE_KANNADA_VOWEL_SIGN_AI  0x0cc8
-#define UNITEXT_KANNADA_VOWEL_SIGN_AI  L"\u0cc8"
+#define UNITEXT_KANNADA_VOWEL_SIGN_AI  U"\u0cc8"
 #define UNICODE_KANNADA_VOWEL_SIGN_O  0x0cca
-#define UNITEXT_KANNADA_VOWEL_SIGN_O  L"\u0cca"
+#define UNITEXT_KANNADA_VOWEL_SIGN_O  U"\u0cca"
 #define UNICODE_KANNADA_VOWEL_SIGN_OO  0x0ccb
-#define UNITEXT_KANNADA_VOWEL_SIGN_OO  L"\u0ccb"
+#define UNITEXT_KANNADA_VOWEL_SIGN_OO  U"\u0ccb"
 #define UNICODE_KANNADA_VOWEL_SIGN_AU  0x0ccc
-#define UNITEXT_KANNADA_VOWEL_SIGN_AU  L"\u0ccc"
+#define UNITEXT_KANNADA_VOWEL_SIGN_AU  U"\u0ccc"
 #define UNICODE_KANNADA_SIGN_VIRAMA  0x0ccd
-#define UNITEXT_KANNADA_SIGN_VIRAMA  L"\u0ccd"
+#define UNITEXT_KANNADA_SIGN_VIRAMA  U"\u0ccd"
 #define UNICODE_KANNADA_LENGTH_MARK  0x0cd5
-#define UNITEXT_KANNADA_LENGTH_MARK  L"\u0cd5"
+#define UNITEXT_KANNADA_LENGTH_MARK  U"\u0cd5"
 #define UNICODE_KANNADA_AI_LENGTH_MARK  0x0cd6
-#define UNITEXT_KANNADA_AI_LENGTH_MARK  L"\u0cd6"
+#define UNITEXT_KANNADA_AI_LENGTH_MARK  U"\u0cd6"
 #define UNICODE_KANNADA_LETTER_FA  0x0cde
-#define UNITEXT_KANNADA_LETTER_FA  L"\u0cde"
+#define UNITEXT_KANNADA_LETTER_FA  U"\u0cde"
 #define UNICODE_KANNADA_LETTER_VOCALIC_RR  0x0ce0
-#define UNITEXT_KANNADA_LETTER_VOCALIC_RR  L"\u0ce0"
+#define UNITEXT_KANNADA_LETTER_VOCALIC_RR  U"\u0ce0"
 #define UNICODE_KANNADA_LETTER_VOCALIC_LL  0x0ce1
-#define UNITEXT_KANNADA_LETTER_VOCALIC_LL  L"\u0ce1"
+#define UNITEXT_KANNADA_LETTER_VOCALIC_LL  U"\u0ce1"
 #define UNICODE_KANNADA_VOWEL_SIGN_VOCALIC_L  0x0ce2
-#define UNITEXT_KANNADA_VOWEL_SIGN_VOCALIC_L  L"\u0ce2"
+#define UNITEXT_KANNADA_VOWEL_SIGN_VOCALIC_L  U"\u0ce2"
 #define UNICODE_KANNADA_VOWEL_SIGN_VOCALIC_LL  0x0ce3
-#define UNITEXT_KANNADA_VOWEL_SIGN_VOCALIC_LL  L"\u0ce3"
+#define UNITEXT_KANNADA_VOWEL_SIGN_VOCALIC_LL  U"\u0ce3"
 #define UNICODE_KANNADA_DIGIT_ZERO  0x0ce6
-#define UNITEXT_KANNADA_DIGIT_ZERO  L"\u0ce6"
+#define UNITEXT_KANNADA_DIGIT_ZERO  U"\u0ce6"
 #define UNICODE_KANNADA_DIGIT_ONE  0x0ce7
-#define UNITEXT_KANNADA_DIGIT_ONE  L"\u0ce7"
+#define UNITEXT_KANNADA_DIGIT_ONE  U"\u0ce7"
 #define UNICODE_KANNADA_DIGIT_TWO  0x0ce8
-#define UNITEXT_KANNADA_DIGIT_TWO  L"\u0ce8"
+#define UNITEXT_KANNADA_DIGIT_TWO  U"\u0ce8"
 #define UNICODE_KANNADA_DIGIT_THREE  0x0ce9
-#define UNITEXT_KANNADA_DIGIT_THREE  L"\u0ce9"
+#define UNITEXT_KANNADA_DIGIT_THREE  U"\u0ce9"
 #define UNICODE_KANNADA_DIGIT_FOUR  0x0cea
-#define UNITEXT_KANNADA_DIGIT_FOUR  L"\u0cea"
+#define UNITEXT_KANNADA_DIGIT_FOUR  U"\u0cea"
 #define UNICODE_KANNADA_DIGIT_FIVE  0x0ceb
-#define UNITEXT_KANNADA_DIGIT_FIVE  L"\u0ceb"
+#define UNITEXT_KANNADA_DIGIT_FIVE  U"\u0ceb"
 #define UNICODE_KANNADA_DIGIT_SIX  0x0cec
-#define UNITEXT_KANNADA_DIGIT_SIX  L"\u0cec"
+#define UNITEXT_KANNADA_DIGIT_SIX  U"\u0cec"
 #define UNICODE_KANNADA_DIGIT_SEVEN  0x0ced
-#define UNITEXT_KANNADA_DIGIT_SEVEN  L"\u0ced"
+#define UNITEXT_KANNADA_DIGIT_SEVEN  U"\u0ced"
 #define UNICODE_KANNADA_DIGIT_EIGHT  0x0cee
-#define UNITEXT_KANNADA_DIGIT_EIGHT  L"\u0cee"
+#define UNITEXT_KANNADA_DIGIT_EIGHT  U"\u0cee"
 #define UNICODE_KANNADA_DIGIT_NINE  0x0cef
-#define UNITEXT_KANNADA_DIGIT_NINE  L"\u0cef"
+#define UNITEXT_KANNADA_DIGIT_NINE  U"\u0cef"
 #define UNICODE_KANNADA_SIGN_JIHVAMULIYA  0x0cf1
-#define UNITEXT_KANNADA_SIGN_JIHVAMULIYA  L"\u0cf1"
+#define UNITEXT_KANNADA_SIGN_JIHVAMULIYA  U"\u0cf1"
 #define UNICODE_KANNADA_SIGN_UPADHMANIYA  0x0cf2
-#define UNITEXT_KANNADA_SIGN_UPADHMANIYA  L"\u0cf2"
+#define UNITEXT_KANNADA_SIGN_UPADHMANIYA  U"\u0cf2"
 #define UNICODE_MALAYALAM_SIGN_ANUSVARA  0x0d02
-#define UNITEXT_MALAYALAM_SIGN_ANUSVARA  L"\u0d02"
+#define UNITEXT_MALAYALAM_SIGN_ANUSVARA  U"\u0d02"
 #define UNICODE_MALAYALAM_SIGN_VISARGA  0x0d03
-#define UNITEXT_MALAYALAM_SIGN_VISARGA  L"\u0d03"
+#define UNITEXT_MALAYALAM_SIGN_VISARGA  U"\u0d03"
 #define UNICODE_MALAYALAM_LETTER_A  0x0d05
-#define UNITEXT_MALAYALAM_LETTER_A  L"\u0d05"
+#define UNITEXT_MALAYALAM_LETTER_A  U"\u0d05"
 #define UNICODE_MALAYALAM_LETTER_AA  0x0d06
-#define UNITEXT_MALAYALAM_LETTER_AA  L"\u0d06"
+#define UNITEXT_MALAYALAM_LETTER_AA  U"\u0d06"
 #define UNICODE_MALAYALAM_LETTER_I  0x0d07
-#define UNITEXT_MALAYALAM_LETTER_I  L"\u0d07"
+#define UNITEXT_MALAYALAM_LETTER_I  U"\u0d07"
 #define UNICODE_MALAYALAM_LETTER_II  0x0d08
-#define UNITEXT_MALAYALAM_LETTER_II  L"\u0d08"
+#define UNITEXT_MALAYALAM_LETTER_II  U"\u0d08"
 #define UNICODE_MALAYALAM_LETTER_U  0x0d09
-#define UNITEXT_MALAYALAM_LETTER_U  L"\u0d09"
+#define UNITEXT_MALAYALAM_LETTER_U  U"\u0d09"
 #define UNICODE_MALAYALAM_LETTER_UU  0x0d0a
-#define UNITEXT_MALAYALAM_LETTER_UU  L"\u0d0a"
+#define UNITEXT_MALAYALAM_LETTER_UU  U"\u0d0a"
 #define UNICODE_MALAYALAM_LETTER_VOCALIC_R  0x0d0b
-#define UNITEXT_MALAYALAM_LETTER_VOCALIC_R  L"\u0d0b"
+#define UNITEXT_MALAYALAM_LETTER_VOCALIC_R  U"\u0d0b"
 #define UNICODE_MALAYALAM_LETTER_VOCALIC_L  0x0d0c
-#define UNITEXT_MALAYALAM_LETTER_VOCALIC_L  L"\u0d0c"
+#define UNITEXT_MALAYALAM_LETTER_VOCALIC_L  U"\u0d0c"
 #define UNICODE_MALAYALAM_LETTER_E  0x0d0e
-#define UNITEXT_MALAYALAM_LETTER_E  L"\u0d0e"
+#define UNITEXT_MALAYALAM_LETTER_E  U"\u0d0e"
 #define UNICODE_MALAYALAM_LETTER_EE  0x0d0f
-#define UNITEXT_MALAYALAM_LETTER_EE  L"\u0d0f"
+#define UNITEXT_MALAYALAM_LETTER_EE  U"\u0d0f"
 #define UNICODE_MALAYALAM_LETTER_AI  0x0d10
-#define UNITEXT_MALAYALAM_LETTER_AI  L"\u0d10"
+#define UNITEXT_MALAYALAM_LETTER_AI  U"\u0d10"
 #define UNICODE_MALAYALAM_LETTER_O  0x0d12
-#define UNITEXT_MALAYALAM_LETTER_O  L"\u0d12"
+#define UNITEXT_MALAYALAM_LETTER_O  U"\u0d12"
 #define UNICODE_MALAYALAM_LETTER_OO  0x0d13
-#define UNITEXT_MALAYALAM_LETTER_OO  L"\u0d13"
+#define UNITEXT_MALAYALAM_LETTER_OO  U"\u0d13"
 #define UNICODE_MALAYALAM_LETTER_AU  0x0d14
-#define UNITEXT_MALAYALAM_LETTER_AU  L"\u0d14"
+#define UNITEXT_MALAYALAM_LETTER_AU  U"\u0d14"
 #define UNICODE_MALAYALAM_LETTER_KA  0x0d15
-#define UNITEXT_MALAYALAM_LETTER_KA  L"\u0d15"
+#define UNITEXT_MALAYALAM_LETTER_KA  U"\u0d15"
 #define UNICODE_MALAYALAM_LETTER_KHA  0x0d16
-#define UNITEXT_MALAYALAM_LETTER_KHA  L"\u0d16"
+#define UNITEXT_MALAYALAM_LETTER_KHA  U"\u0d16"
 #define UNICODE_MALAYALAM_LETTER_GA  0x0d17
-#define UNITEXT_MALAYALAM_LETTER_GA  L"\u0d17"
+#define UNITEXT_MALAYALAM_LETTER_GA  U"\u0d17"
 #define UNICODE_MALAYALAM_LETTER_GHA  0x0d18
-#define UNITEXT_MALAYALAM_LETTER_GHA  L"\u0d18"
+#define UNITEXT_MALAYALAM_LETTER_GHA  U"\u0d18"
 #define UNICODE_MALAYALAM_LETTER_NGA  0x0d19
-#define UNITEXT_MALAYALAM_LETTER_NGA  L"\u0d19"
+#define UNITEXT_MALAYALAM_LETTER_NGA  U"\u0d19"
 #define UNICODE_MALAYALAM_LETTER_CA  0x0d1a
-#define UNITEXT_MALAYALAM_LETTER_CA  L"\u0d1a"
+#define UNITEXT_MALAYALAM_LETTER_CA  U"\u0d1a"
 #define UNICODE_MALAYALAM_LETTER_CHA  0x0d1b
-#define UNITEXT_MALAYALAM_LETTER_CHA  L"\u0d1b"
+#define UNITEXT_MALAYALAM_LETTER_CHA  U"\u0d1b"
 #define UNICODE_MALAYALAM_LETTER_JA  0x0d1c
-#define UNITEXT_MALAYALAM_LETTER_JA  L"\u0d1c"
+#define UNITEXT_MALAYALAM_LETTER_JA  U"\u0d1c"
 #define UNICODE_MALAYALAM_LETTER_JHA  0x0d1d
-#define UNITEXT_MALAYALAM_LETTER_JHA  L"\u0d1d"
+#define UNITEXT_MALAYALAM_LETTER_JHA  U"\u0d1d"
 #define UNICODE_MALAYALAM_LETTER_NYA  0x0d1e
-#define UNITEXT_MALAYALAM_LETTER_NYA  L"\u0d1e"
+#define UNITEXT_MALAYALAM_LETTER_NYA  U"\u0d1e"
 #define UNICODE_MALAYALAM_LETTER_TTA  0x0d1f
-#define UNITEXT_MALAYALAM_LETTER_TTA  L"\u0d1f"
+#define UNITEXT_MALAYALAM_LETTER_TTA  U"\u0d1f"
 #define UNICODE_MALAYALAM_LETTER_TTHA  0x0d20
-#define UNITEXT_MALAYALAM_LETTER_TTHA  L"\u0d20"
+#define UNITEXT_MALAYALAM_LETTER_TTHA  U"\u0d20"
 #define UNICODE_MALAYALAM_LETTER_DDA  0x0d21
-#define UNITEXT_MALAYALAM_LETTER_DDA  L"\u0d21"
+#define UNITEXT_MALAYALAM_LETTER_DDA  U"\u0d21"
 #define UNICODE_MALAYALAM_LETTER_DDHA  0x0d22
-#define UNITEXT_MALAYALAM_LETTER_DDHA  L"\u0d22"
+#define UNITEXT_MALAYALAM_LETTER_DDHA  U"\u0d22"
 #define UNICODE_MALAYALAM_LETTER_NNA  0x0d23
-#define UNITEXT_MALAYALAM_LETTER_NNA  L"\u0d23"
+#define UNITEXT_MALAYALAM_LETTER_NNA  U"\u0d23"
 #define UNICODE_MALAYALAM_LETTER_TA  0x0d24
-#define UNITEXT_MALAYALAM_LETTER_TA  L"\u0d24"
+#define UNITEXT_MALAYALAM_LETTER_TA  U"\u0d24"
 #define UNICODE_MALAYALAM_LETTER_THA  0x0d25
-#define UNITEXT_MALAYALAM_LETTER_THA  L"\u0d25"
+#define UNITEXT_MALAYALAM_LETTER_THA  U"\u0d25"
 #define UNICODE_MALAYALAM_LETTER_DA  0x0d26
-#define UNITEXT_MALAYALAM_LETTER_DA  L"\u0d26"
+#define UNITEXT_MALAYALAM_LETTER_DA  U"\u0d26"
 #define UNICODE_MALAYALAM_LETTER_DHA  0x0d27
-#define UNITEXT_MALAYALAM_LETTER_DHA  L"\u0d27"
+#define UNITEXT_MALAYALAM_LETTER_DHA  U"\u0d27"
 #define UNICODE_MALAYALAM_LETTER_NA  0x0d28
-#define UNITEXT_MALAYALAM_LETTER_NA  L"\u0d28"
+#define UNITEXT_MALAYALAM_LETTER_NA  U"\u0d28"
 #define UNICODE_MALAYALAM_LETTER_PA  0x0d2a
-#define UNITEXT_MALAYALAM_LETTER_PA  L"\u0d2a"
+#define UNITEXT_MALAYALAM_LETTER_PA  U"\u0d2a"
 #define UNICODE_MALAYALAM_LETTER_PHA  0x0d2b
-#define UNITEXT_MALAYALAM_LETTER_PHA  L"\u0d2b"
+#define UNITEXT_MALAYALAM_LETTER_PHA  U"\u0d2b"
 #define UNICODE_MALAYALAM_LETTER_BA  0x0d2c
-#define UNITEXT_MALAYALAM_LETTER_BA  L"\u0d2c"
+#define UNITEXT_MALAYALAM_LETTER_BA  U"\u0d2c"
 #define UNICODE_MALAYALAM_LETTER_BHA  0x0d2d
-#define UNITEXT_MALAYALAM_LETTER_BHA  L"\u0d2d"
+#define UNITEXT_MALAYALAM_LETTER_BHA  U"\u0d2d"
 #define UNICODE_MALAYALAM_LETTER_MA  0x0d2e
-#define UNITEXT_MALAYALAM_LETTER_MA  L"\u0d2e"
+#define UNITEXT_MALAYALAM_LETTER_MA  U"\u0d2e"
 #define UNICODE_MALAYALAM_LETTER_YA  0x0d2f
-#define UNITEXT_MALAYALAM_LETTER_YA  L"\u0d2f"
+#define UNITEXT_MALAYALAM_LETTER_YA  U"\u0d2f"
 #define UNICODE_MALAYALAM_LETTER_RA  0x0d30
-#define UNITEXT_MALAYALAM_LETTER_RA  L"\u0d30"
+#define UNITEXT_MALAYALAM_LETTER_RA  U"\u0d30"
 #define UNICODE_MALAYALAM_LETTER_RRA  0x0d31
-#define UNITEXT_MALAYALAM_LETTER_RRA  L"\u0d31"
+#define UNITEXT_MALAYALAM_LETTER_RRA  U"\u0d31"
 #define UNICODE_MALAYALAM_LETTER_LA  0x0d32
-#define UNITEXT_MALAYALAM_LETTER_LA  L"\u0d32"
+#define UNITEXT_MALAYALAM_LETTER_LA  U"\u0d32"
 #define UNICODE_MALAYALAM_LETTER_LLA  0x0d33
-#define UNITEXT_MALAYALAM_LETTER_LLA  L"\u0d33"
+#define UNITEXT_MALAYALAM_LETTER_LLA  U"\u0d33"
 #define UNICODE_MALAYALAM_LETTER_LLLA  0x0d34
-#define UNITEXT_MALAYALAM_LETTER_LLLA  L"\u0d34"
+#define UNITEXT_MALAYALAM_LETTER_LLLA  U"\u0d34"
 #define UNICODE_MALAYALAM_LETTER_VA  0x0d35
-#define UNITEXT_MALAYALAM_LETTER_VA  L"\u0d35"
+#define UNITEXT_MALAYALAM_LETTER_VA  U"\u0d35"
 #define UNICODE_MALAYALAM_LETTER_SHA  0x0d36
-#define UNITEXT_MALAYALAM_LETTER_SHA  L"\u0d36"
+#define UNITEXT_MALAYALAM_LETTER_SHA  U"\u0d36"
 #define UNICODE_MALAYALAM_LETTER_SSA  0x0d37
-#define UNITEXT_MALAYALAM_LETTER_SSA  L"\u0d37"
+#define UNITEXT_MALAYALAM_LETTER_SSA  U"\u0d37"
 #define UNICODE_MALAYALAM_LETTER_SA  0x0d38
-#define UNITEXT_MALAYALAM_LETTER_SA  L"\u0d38"
+#define UNITEXT_MALAYALAM_LETTER_SA  U"\u0d38"
 #define UNICODE_MALAYALAM_LETTER_HA  0x0d39
-#define UNITEXT_MALAYALAM_LETTER_HA  L"\u0d39"
+#define UNITEXT_MALAYALAM_LETTER_HA  U"\u0d39"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_AA  0x0d3e
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_AA  L"\u0d3e"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_AA  U"\u0d3e"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_I  0x0d3f
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_I  L"\u0d3f"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_I  U"\u0d3f"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_II  0x0d40
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_II  L"\u0d40"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_II  U"\u0d40"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_U  0x0d41
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_U  L"\u0d41"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_U  U"\u0d41"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_UU  0x0d42
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_UU  L"\u0d42"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_UU  U"\u0d42"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_VOCALIC_R  0x0d43
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_VOCALIC_R  L"\u0d43"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_VOCALIC_R  U"\u0d43"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_E  0x0d46
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_E  L"\u0d46"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_E  U"\u0d46"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_EE  0x0d47
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_EE  L"\u0d47"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_EE  U"\u0d47"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_AI  0x0d48
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_AI  L"\u0d48"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_AI  U"\u0d48"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_O  0x0d4a
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_O  L"\u0d4a"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_O  U"\u0d4a"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_OO  0x0d4b
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_OO  L"\u0d4b"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_OO  U"\u0d4b"
 #define UNICODE_MALAYALAM_VOWEL_SIGN_AU  0x0d4c
-#define UNITEXT_MALAYALAM_VOWEL_SIGN_AU  L"\u0d4c"
+#define UNITEXT_MALAYALAM_VOWEL_SIGN_AU  U"\u0d4c"
 #define UNICODE_MALAYALAM_SIGN_VIRAMA  0x0d4d
-#define UNITEXT_MALAYALAM_SIGN_VIRAMA  L"\u0d4d"
+#define UNITEXT_MALAYALAM_SIGN_VIRAMA  U"\u0d4d"
 #define UNICODE_MALAYALAM_AU_LENGTH_MARK  0x0d57
-#define UNITEXT_MALAYALAM_AU_LENGTH_MARK  L"\u0d57"
+#define UNITEXT_MALAYALAM_AU_LENGTH_MARK  U"\u0d57"
 #define UNICODE_MALAYALAM_LETTER_VOCALIC_RR  0x0d60
-#define UNITEXT_MALAYALAM_LETTER_VOCALIC_RR  L"\u0d60"
+#define UNITEXT_MALAYALAM_LETTER_VOCALIC_RR  U"\u0d60"
 #define UNICODE_MALAYALAM_LETTER_VOCALIC_LL  0x0d61
-#define UNITEXT_MALAYALAM_LETTER_VOCALIC_LL  L"\u0d61"
+#define UNITEXT_MALAYALAM_LETTER_VOCALIC_LL  U"\u0d61"
 #define UNICODE_MALAYALAM_DIGIT_ZERO  0x0d66
-#define UNITEXT_MALAYALAM_DIGIT_ZERO  L"\u0d66"
+#define UNITEXT_MALAYALAM_DIGIT_ZERO  U"\u0d66"
 #define UNICODE_MALAYALAM_DIGIT_ONE  0x0d67
-#define UNITEXT_MALAYALAM_DIGIT_ONE  L"\u0d67"
+#define UNITEXT_MALAYALAM_DIGIT_ONE  U"\u0d67"
 #define UNICODE_MALAYALAM_DIGIT_TWO  0x0d68
-#define UNITEXT_MALAYALAM_DIGIT_TWO  L"\u0d68"
+#define UNITEXT_MALAYALAM_DIGIT_TWO  U"\u0d68"
 #define UNICODE_MALAYALAM_DIGIT_THREE  0x0d69
-#define UNITEXT_MALAYALAM_DIGIT_THREE  L"\u0d69"
+#define UNITEXT_MALAYALAM_DIGIT_THREE  U"\u0d69"
 #define UNICODE_MALAYALAM_DIGIT_FOUR  0x0d6a
-#define UNITEXT_MALAYALAM_DIGIT_FOUR  L"\u0d6a"
+#define UNITEXT_MALAYALAM_DIGIT_FOUR  U"\u0d6a"
 #define UNICODE_MALAYALAM_DIGIT_FIVE  0x0d6b
-#define UNITEXT_MALAYALAM_DIGIT_FIVE  L"\u0d6b"
+#define UNITEXT_MALAYALAM_DIGIT_FIVE  U"\u0d6b"
 #define UNICODE_MALAYALAM_DIGIT_SIX  0x0d6c
-#define UNITEXT_MALAYALAM_DIGIT_SIX  L"\u0d6c"
+#define UNITEXT_MALAYALAM_DIGIT_SIX  U"\u0d6c"
 #define UNICODE_MALAYALAM_DIGIT_SEVEN  0x0d6d
-#define UNITEXT_MALAYALAM_DIGIT_SEVEN  L"\u0d6d"
+#define UNITEXT_MALAYALAM_DIGIT_SEVEN  U"\u0d6d"
 #define UNICODE_MALAYALAM_DIGIT_EIGHT  0x0d6e
-#define UNITEXT_MALAYALAM_DIGIT_EIGHT  L"\u0d6e"
+#define UNITEXT_MALAYALAM_DIGIT_EIGHT  U"\u0d6e"
 #define UNICODE_MALAYALAM_DIGIT_NINE  0x0d6f
-#define UNITEXT_MALAYALAM_DIGIT_NINE  L"\u0d6f"
+#define UNITEXT_MALAYALAM_DIGIT_NINE  U"\u0d6f"
 #define UNICODE_SINHALA_SIGN_ANUSVARAYA  0x0d82
-#define UNITEXT_SINHALA_SIGN_ANUSVARAYA  L"\u0d82"
+#define UNITEXT_SINHALA_SIGN_ANUSVARAYA  U"\u0d82"
 #define UNICODE_SINHALA_SIGN_VISARGAYA  0x0d83
-#define UNITEXT_SINHALA_SIGN_VISARGAYA  L"\u0d83"
+#define UNITEXT_SINHALA_SIGN_VISARGAYA  U"\u0d83"
 #define UNICODE_SINHALA_LETTER_AYANNA  0x0d85
-#define UNITEXT_SINHALA_LETTER_AYANNA  L"\u0d85"
+#define UNITEXT_SINHALA_LETTER_AYANNA  U"\u0d85"
 #define UNICODE_SINHALA_LETTER_AAYANNA  0x0d86
-#define UNITEXT_SINHALA_LETTER_AAYANNA  L"\u0d86"
+#define UNITEXT_SINHALA_LETTER_AAYANNA  U"\u0d86"
 #define UNICODE_SINHALA_LETTER_AEYANNA  0x0d87
-#define UNITEXT_SINHALA_LETTER_AEYANNA  L"\u0d87"
+#define UNITEXT_SINHALA_LETTER_AEYANNA  U"\u0d87"
 #define UNICODE_SINHALA_LETTER_AEEYANNA  0x0d88
-#define UNITEXT_SINHALA_LETTER_AEEYANNA  L"\u0d88"
+#define UNITEXT_SINHALA_LETTER_AEEYANNA  U"\u0d88"
 #define UNICODE_SINHALA_LETTER_IYANNA  0x0d89
-#define UNITEXT_SINHALA_LETTER_IYANNA  L"\u0d89"
+#define UNITEXT_SINHALA_LETTER_IYANNA  U"\u0d89"
 #define UNICODE_SINHALA_LETTER_IIYANNA  0x0d8a
-#define UNITEXT_SINHALA_LETTER_IIYANNA  L"\u0d8a"
+#define UNITEXT_SINHALA_LETTER_IIYANNA  U"\u0d8a"
 #define UNICODE_SINHALA_LETTER_UYANNA  0x0d8b
-#define UNITEXT_SINHALA_LETTER_UYANNA  L"\u0d8b"
+#define UNITEXT_SINHALA_LETTER_UYANNA  U"\u0d8b"
 #define UNICODE_SINHALA_LETTER_UUYANNA  0x0d8c
-#define UNITEXT_SINHALA_LETTER_UUYANNA  L"\u0d8c"
+#define UNITEXT_SINHALA_LETTER_UUYANNA  U"\u0d8c"
 #define UNICODE_SINHALA_LETTER_IRUYANNA  0x0d8d
-#define UNITEXT_SINHALA_LETTER_IRUYANNA  L"\u0d8d"
+#define UNITEXT_SINHALA_LETTER_IRUYANNA  U"\u0d8d"
 #define UNICODE_SINHALA_LETTER_IRUUYANNA  0x0d8e
-#define UNITEXT_SINHALA_LETTER_IRUUYANNA  L"\u0d8e"
+#define UNITEXT_SINHALA_LETTER_IRUUYANNA  U"\u0d8e"
 #define UNICODE_SINHALA_LETTER_ILUYANNA  0x0d8f
-#define UNITEXT_SINHALA_LETTER_ILUYANNA  L"\u0d8f"
+#define UNITEXT_SINHALA_LETTER_ILUYANNA  U"\u0d8f"
 #define UNICODE_SINHALA_LETTER_ILUUYANNA  0x0d90
-#define UNITEXT_SINHALA_LETTER_ILUUYANNA  L"\u0d90"
+#define UNITEXT_SINHALA_LETTER_ILUUYANNA  U"\u0d90"
 #define UNICODE_SINHALA_LETTER_EYANNA  0x0d91
-#define UNITEXT_SINHALA_LETTER_EYANNA  L"\u0d91"
+#define UNITEXT_SINHALA_LETTER_EYANNA  U"\u0d91"
 #define UNICODE_SINHALA_LETTER_EEYANNA  0x0d92
-#define UNITEXT_SINHALA_LETTER_EEYANNA  L"\u0d92"
+#define UNITEXT_SINHALA_LETTER_EEYANNA  U"\u0d92"
 #define UNICODE_SINHALA_LETTER_AIYANNA  0x0d93
-#define UNITEXT_SINHALA_LETTER_AIYANNA  L"\u0d93"
+#define UNITEXT_SINHALA_LETTER_AIYANNA  U"\u0d93"
 #define UNICODE_SINHALA_LETTER_OYANNA  0x0d94
-#define UNITEXT_SINHALA_LETTER_OYANNA  L"\u0d94"
+#define UNITEXT_SINHALA_LETTER_OYANNA  U"\u0d94"
 #define UNICODE_SINHALA_LETTER_OOYANNA  0x0d95
-#define UNITEXT_SINHALA_LETTER_OOYANNA  L"\u0d95"
+#define UNITEXT_SINHALA_LETTER_OOYANNA  U"\u0d95"
 #define UNICODE_SINHALA_LETTER_AUYANNA  0x0d96
-#define UNITEXT_SINHALA_LETTER_AUYANNA  L"\u0d96"
+#define UNITEXT_SINHALA_LETTER_AUYANNA  U"\u0d96"
 #define UNICODE_SINHALA_LETTER_ALPAPRAANA_KAYANNA  0x0d9a
-#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_KAYANNA  L"\u0d9a"
+#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_KAYANNA  U"\u0d9a"
 #define UNICODE_SINHALA_LETTER_MAHAAPRAANA_KAYANNA  0x0d9b
-#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_KAYANNA  L"\u0d9b"
+#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_KAYANNA  U"\u0d9b"
 #define UNICODE_SINHALA_LETTER_ALPAPRAANA_GAYANNA  0x0d9c
-#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_GAYANNA  L"\u0d9c"
+#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_GAYANNA  U"\u0d9c"
 #define UNICODE_SINHALA_LETTER_MAHAAPRAANA_GAYANNA  0x0d9d
-#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_GAYANNA  L"\u0d9d"
+#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_GAYANNA  U"\u0d9d"
 #define UNICODE_SINHALA_LETTER_KANTAJA_NAASIKYAYA  0x0d9e
-#define UNITEXT_SINHALA_LETTER_KANTAJA_NAASIKYAYA  L"\u0d9e"
+#define UNITEXT_SINHALA_LETTER_KANTAJA_NAASIKYAYA  U"\u0d9e"
 #define UNICODE_SINHALA_LETTER_SANYAKA_GAYANNA  0x0d9f
-#define UNITEXT_SINHALA_LETTER_SANYAKA_GAYANNA  L"\u0d9f"
+#define UNITEXT_SINHALA_LETTER_SANYAKA_GAYANNA  U"\u0d9f"
 #define UNICODE_SINHALA_LETTER_ALPAPRAANA_CAYANNA  0x0da0
-#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_CAYANNA  L"\u0da0"
+#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_CAYANNA  U"\u0da0"
 #define UNICODE_SINHALA_LETTER_MAHAAPRAANA_CAYANNA  0x0da1
-#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_CAYANNA  L"\u0da1"
+#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_CAYANNA  U"\u0da1"
 #define UNICODE_SINHALA_LETTER_ALPAPRAANA_JAYANNA  0x0da2
-#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_JAYANNA  L"\u0da2"
+#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_JAYANNA  U"\u0da2"
 #define UNICODE_SINHALA_LETTER_MAHAAPRAANA_JAYANNA  0x0da3
-#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_JAYANNA  L"\u0da3"
+#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_JAYANNA  U"\u0da3"
 #define UNICODE_SINHALA_LETTER_TAALUJA_NAASIKYAYA  0x0da4
-#define UNITEXT_SINHALA_LETTER_TAALUJA_NAASIKYAYA  L"\u0da4"
+#define UNITEXT_SINHALA_LETTER_TAALUJA_NAASIKYAYA  U"\u0da4"
 #define UNICODE_SINHALA_LETTER_TAALUJA_SANYOOGA_NAAKSIKYAYA  0x0da5
-#define UNITEXT_SINHALA_LETTER_TAALUJA_SANYOOGA_NAAKSIKYAYA  L"\u0da5"
+#define UNITEXT_SINHALA_LETTER_TAALUJA_SANYOOGA_NAAKSIKYAYA  U"\u0da5"
 #define UNICODE_SINHALA_LETTER_SANYAKA_JAYANNA  0x0da6
-#define UNITEXT_SINHALA_LETTER_SANYAKA_JAYANNA  L"\u0da6"
+#define UNITEXT_SINHALA_LETTER_SANYAKA_JAYANNA  U"\u0da6"
 #define UNICODE_SINHALA_LETTER_ALPAPRAANA_TTAYANNA  0x0da7
-#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_TTAYANNA  L"\u0da7"
+#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_TTAYANNA  U"\u0da7"
 #define UNICODE_SINHALA_LETTER_MAHAAPRAANA_TTAYANNA  0x0da8
-#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_TTAYANNA  L"\u0da8"
+#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_TTAYANNA  U"\u0da8"
 #define UNICODE_SINHALA_LETTER_ALPAPRAANA_DDAYANNA  0x0da9
-#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_DDAYANNA  L"\u0da9"
+#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_DDAYANNA  U"\u0da9"
 #define UNICODE_SINHALA_LETTER_MAHAAPRAANA_DDAYANNA  0x0daa
-#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_DDAYANNA  L"\u0daa"
+#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_DDAYANNA  U"\u0daa"
 #define UNICODE_SINHALA_LETTER_MUURDHAJA_NAYANNA  0x0dab
-#define UNITEXT_SINHALA_LETTER_MUURDHAJA_NAYANNA  L"\u0dab"
+#define UNITEXT_SINHALA_LETTER_MUURDHAJA_NAYANNA  U"\u0dab"
 #define UNICODE_SINHALA_LETTER_SANYAKA_DDAYANNA  0x0dac
-#define UNITEXT_SINHALA_LETTER_SANYAKA_DDAYANNA  L"\u0dac"
+#define UNITEXT_SINHALA_LETTER_SANYAKA_DDAYANNA  U"\u0dac"
 #define UNICODE_SINHALA_LETTER_ALPAPRAANA_TAYANNA  0x0dad
-#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_TAYANNA  L"\u0dad"
+#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_TAYANNA  U"\u0dad"
 #define UNICODE_SINHALA_LETTER_MAHAAPRAANA_TAYANNA  0x0dae
-#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_TAYANNA  L"\u0dae"
+#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_TAYANNA  U"\u0dae"
 #define UNICODE_SINHALA_LETTER_ALPAPRAANA_DAYANNA  0x0daf
-#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_DAYANNA  L"\u0daf"
+#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_DAYANNA  U"\u0daf"
 #define UNICODE_SINHALA_LETTER_MAHAAPRAANA_DAYANNA  0x0db0
-#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_DAYANNA  L"\u0db0"
+#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_DAYANNA  U"\u0db0"
 #define UNICODE_SINHALA_LETTER_DANTAJA_NAYANNA  0x0db1
-#define UNITEXT_SINHALA_LETTER_DANTAJA_NAYANNA  L"\u0db1"
+#define UNITEXT_SINHALA_LETTER_DANTAJA_NAYANNA  U"\u0db1"
 #define UNICODE_SINHALA_LETTER_SANYAKA_DAYANNA  0x0db3
-#define UNITEXT_SINHALA_LETTER_SANYAKA_DAYANNA  L"\u0db3"
+#define UNITEXT_SINHALA_LETTER_SANYAKA_DAYANNA  U"\u0db3"
 #define UNICODE_SINHALA_LETTER_ALPAPRAANA_PAYANNA  0x0db4
-#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_PAYANNA  L"\u0db4"
+#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_PAYANNA  U"\u0db4"
 #define UNICODE_SINHALA_LETTER_MAHAAPRAANA_PAYANNA  0x0db5
-#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_PAYANNA  L"\u0db5"
+#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_PAYANNA  U"\u0db5"
 #define UNICODE_SINHALA_LETTER_ALPAPRAANA_BAYANNA  0x0db6
-#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_BAYANNA  L"\u0db6"
+#define UNITEXT_SINHALA_LETTER_ALPAPRAANA_BAYANNA  U"\u0db6"
 #define UNICODE_SINHALA_LETTER_MAHAAPRAANA_BAYANNA  0x0db7
-#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_BAYANNA  L"\u0db7"
+#define UNITEXT_SINHALA_LETTER_MAHAAPRAANA_BAYANNA  U"\u0db7"
 #define UNICODE_SINHALA_LETTER_MAYANNA  0x0db8
-#define UNITEXT_SINHALA_LETTER_MAYANNA  L"\u0db8"
+#define UNITEXT_SINHALA_LETTER_MAYANNA  U"\u0db8"
 #define UNICODE_SINHALA_LETTER_AMBA_BAYANNA  0x0db9
-#define UNITEXT_SINHALA_LETTER_AMBA_BAYANNA  L"\u0db9"
+#define UNITEXT_SINHALA_LETTER_AMBA_BAYANNA  U"\u0db9"
 #define UNICODE_SINHALA_LETTER_YAYANNA  0x0dba
-#define UNITEXT_SINHALA_LETTER_YAYANNA  L"\u0dba"
+#define UNITEXT_SINHALA_LETTER_YAYANNA  U"\u0dba"
 #define UNICODE_SINHALA_LETTER_RAYANNA  0x0dbb
-#define UNITEXT_SINHALA_LETTER_RAYANNA  L"\u0dbb"
+#define UNITEXT_SINHALA_LETTER_RAYANNA  U"\u0dbb"
 #define UNICODE_SINHALA_LETTER_DANTAJA_LAYANNA  0x0dbd
-#define UNITEXT_SINHALA_LETTER_DANTAJA_LAYANNA  L"\u0dbd"
+#define UNITEXT_SINHALA_LETTER_DANTAJA_LAYANNA  U"\u0dbd"
 #define UNICODE_SINHALA_LETTER_VAYANNA  0x0dc0
-#define UNITEXT_SINHALA_LETTER_VAYANNA  L"\u0dc0"
+#define UNITEXT_SINHALA_LETTER_VAYANNA  U"\u0dc0"
 #define UNICODE_SINHALA_LETTER_TAALUJA_SAYANNA  0x0dc1
-#define UNITEXT_SINHALA_LETTER_TAALUJA_SAYANNA  L"\u0dc1"
+#define UNITEXT_SINHALA_LETTER_TAALUJA_SAYANNA  U"\u0dc1"
 #define UNICODE_SINHALA_LETTER_MUURDHAJA_SAYANNA  0x0dc2
-#define UNITEXT_SINHALA_LETTER_MUURDHAJA_SAYANNA  L"\u0dc2"
+#define UNITEXT_SINHALA_LETTER_MUURDHAJA_SAYANNA  U"\u0dc2"
 #define UNICODE_SINHALA_LETTER_DANTAJA_SAYANNA  0x0dc3
-#define UNITEXT_SINHALA_LETTER_DANTAJA_SAYANNA  L"\u0dc3"
+#define UNITEXT_SINHALA_LETTER_DANTAJA_SAYANNA  U"\u0dc3"
 #define UNICODE_SINHALA_LETTER_HAYANNA  0x0dc4
-#define UNITEXT_SINHALA_LETTER_HAYANNA  L"\u0dc4"
+#define UNITEXT_SINHALA_LETTER_HAYANNA  U"\u0dc4"
 #define UNICODE_SINHALA_LETTER_MUURDHAJA_LAYANNA  0x0dc5
-#define UNITEXT_SINHALA_LETTER_MUURDHAJA_LAYANNA  L"\u0dc5"
+#define UNITEXT_SINHALA_LETTER_MUURDHAJA_LAYANNA  U"\u0dc5"
 #define UNICODE_SINHALA_LETTER_FAYANNA  0x0dc6
-#define UNITEXT_SINHALA_LETTER_FAYANNA  L"\u0dc6"
+#define UNITEXT_SINHALA_LETTER_FAYANNA  U"\u0dc6"
 #define UNICODE_SINHALA_SIGN_AL_LAKUNA  0x0dca
-#define UNITEXT_SINHALA_SIGN_AL_LAKUNA  L"\u0dca"
+#define UNITEXT_SINHALA_SIGN_AL_LAKUNA  U"\u0dca"
 #define UNICODE_SINHALA_VOWEL_SIGN_AELA_PILLA  0x0dcf
-#define UNITEXT_SINHALA_VOWEL_SIGN_AELA_PILLA  L"\u0dcf"
+#define UNITEXT_SINHALA_VOWEL_SIGN_AELA_PILLA  U"\u0dcf"
 #define UNICODE_SINHALA_VOWEL_SIGN_KETTI_AEDA_PILLA  0x0dd0
-#define UNITEXT_SINHALA_VOWEL_SIGN_KETTI_AEDA_PILLA  L"\u0dd0"
+#define UNITEXT_SINHALA_VOWEL_SIGN_KETTI_AEDA_PILLA  U"\u0dd0"
 #define UNICODE_SINHALA_VOWEL_SIGN_DIGA_AEDA_PILLA  0x0dd1
-#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_AEDA_PILLA  L"\u0dd1"
+#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_AEDA_PILLA  U"\u0dd1"
 #define UNICODE_SINHALA_VOWEL_SIGN_KETTI_IS_PILLA  0x0dd2
-#define UNITEXT_SINHALA_VOWEL_SIGN_KETTI_IS_PILLA  L"\u0dd2"
+#define UNITEXT_SINHALA_VOWEL_SIGN_KETTI_IS_PILLA  U"\u0dd2"
 #define UNICODE_SINHALA_VOWEL_SIGN_DIGA_IS_PILLA  0x0dd3
-#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_IS_PILLA  L"\u0dd3"
+#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_IS_PILLA  U"\u0dd3"
 #define UNICODE_SINHALA_VOWEL_SIGN_KETTI_PAA_PILLA  0x0dd4
-#define UNITEXT_SINHALA_VOWEL_SIGN_KETTI_PAA_PILLA  L"\u0dd4"
+#define UNITEXT_SINHALA_VOWEL_SIGN_KETTI_PAA_PILLA  U"\u0dd4"
 #define UNICODE_SINHALA_VOWEL_SIGN_DIGA_PAA_PILLA  0x0dd6
-#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_PAA_PILLA  L"\u0dd6"
+#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_PAA_PILLA  U"\u0dd6"
 #define UNICODE_SINHALA_VOWEL_SIGN_GAETTA_PILLA  0x0dd8
-#define UNITEXT_SINHALA_VOWEL_SIGN_GAETTA_PILLA  L"\u0dd8"
+#define UNITEXT_SINHALA_VOWEL_SIGN_GAETTA_PILLA  U"\u0dd8"
 #define UNICODE_SINHALA_VOWEL_SIGN_KOMBUVA  0x0dd9
-#define UNITEXT_SINHALA_VOWEL_SIGN_KOMBUVA  L"\u0dd9"
+#define UNITEXT_SINHALA_VOWEL_SIGN_KOMBUVA  U"\u0dd9"
 #define UNICODE_SINHALA_VOWEL_SIGN_DIGA_KOMBUVA  0x0dda
-#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_KOMBUVA  L"\u0dda"
+#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_KOMBUVA  U"\u0dda"
 #define UNICODE_SINHALA_VOWEL_SIGN_KOMBU_DEKA  0x0ddb
-#define UNITEXT_SINHALA_VOWEL_SIGN_KOMBU_DEKA  L"\u0ddb"
+#define UNITEXT_SINHALA_VOWEL_SIGN_KOMBU_DEKA  U"\u0ddb"
 #define UNICODE_SINHALA_VOWEL_SIGN_KOMBUVA_HAA_AELA_PILLA  0x0ddc
-#define UNITEXT_SINHALA_VOWEL_SIGN_KOMBUVA_HAA_AELA_PILLA  L"\u0ddc"
+#define UNITEXT_SINHALA_VOWEL_SIGN_KOMBUVA_HAA_AELA_PILLA  U"\u0ddc"
 #define UNICODE_SINHALA_VOWEL_SIGN_KOMBUVA_HAA_DIGA_AELA_PILLA  0x0ddd
-#define UNITEXT_SINHALA_VOWEL_SIGN_KOMBUVA_HAA_DIGA_AELA_PILLA  L"\u0ddd"
+#define UNITEXT_SINHALA_VOWEL_SIGN_KOMBUVA_HAA_DIGA_AELA_PILLA  U"\u0ddd"
 #define UNICODE_SINHALA_VOWEL_SIGN_KOMBUVA_HAA_GAYANUKITTA  0x0dde
-#define UNITEXT_SINHALA_VOWEL_SIGN_KOMBUVA_HAA_GAYANUKITTA  L"\u0dde"
+#define UNITEXT_SINHALA_VOWEL_SIGN_KOMBUVA_HAA_GAYANUKITTA  U"\u0dde"
 #define UNICODE_SINHALA_VOWEL_SIGN_GAYANUKITTA  0x0ddf
-#define UNITEXT_SINHALA_VOWEL_SIGN_GAYANUKITTA  L"\u0ddf"
+#define UNITEXT_SINHALA_VOWEL_SIGN_GAYANUKITTA  U"\u0ddf"
 #define UNICODE_SINHALA_VOWEL_SIGN_DIGA_GAETTA_PILLA  0x0df2
-#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_GAETTA_PILLA  L"\u0df2"
+#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_GAETTA_PILLA  U"\u0df2"
 #define UNICODE_SINHALA_VOWEL_SIGN_DIGA_GAYANUKITTA  0x0df3
-#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_GAYANUKITTA  L"\u0df3"
+#define UNITEXT_SINHALA_VOWEL_SIGN_DIGA_GAYANUKITTA  U"\u0df3"
 #define UNICODE_SINHALA_PUNCTUATION_KUNDDALIYA  0x0df4
-#define UNITEXT_SINHALA_PUNCTUATION_KUNDDALIYA  L"\u0df4"
+#define UNITEXT_SINHALA_PUNCTUATION_KUNDDALIYA  U"\u0df4"
 #define UNICODE_THAI_CHARACTER_KO_KAI  0x0e01
-#define UNITEXT_THAI_CHARACTER_KO_KAI  L"\u0e01"
+#define UNITEXT_THAI_CHARACTER_KO_KAI  U"\u0e01"
 #define UNICODE_THAI_CHARACTER_KHO_KHAI  0x0e02
-#define UNITEXT_THAI_CHARACTER_KHO_KHAI  L"\u0e02"
+#define UNITEXT_THAI_CHARACTER_KHO_KHAI  U"\u0e02"
 #define UNICODE_THAI_CHARACTER_KHO_KHUAT  0x0e03
-#define UNITEXT_THAI_CHARACTER_KHO_KHUAT  L"\u0e03"
+#define UNITEXT_THAI_CHARACTER_KHO_KHUAT  U"\u0e03"
 #define UNICODE_THAI_CHARACTER_KHO_KHWAI  0x0e04
-#define UNITEXT_THAI_CHARACTER_KHO_KHWAI  L"\u0e04"
+#define UNITEXT_THAI_CHARACTER_KHO_KHWAI  U"\u0e04"
 #define UNICODE_THAI_CHARACTER_KHO_KHON  0x0e05
-#define UNITEXT_THAI_CHARACTER_KHO_KHON  L"\u0e05"
+#define UNITEXT_THAI_CHARACTER_KHO_KHON  U"\u0e05"
 #define UNICODE_THAI_CHARACTER_KHO_RAKHANG  0x0e06
-#define UNITEXT_THAI_CHARACTER_KHO_RAKHANG  L"\u0e06"
+#define UNITEXT_THAI_CHARACTER_KHO_RAKHANG  U"\u0e06"
 #define UNICODE_THAI_CHARACTER_NGO_NGU  0x0e07
-#define UNITEXT_THAI_CHARACTER_NGO_NGU  L"\u0e07"
+#define UNITEXT_THAI_CHARACTER_NGO_NGU  U"\u0e07"
 #define UNICODE_THAI_CHARACTER_CHO_CHAN  0x0e08
-#define UNITEXT_THAI_CHARACTER_CHO_CHAN  L"\u0e08"
+#define UNITEXT_THAI_CHARACTER_CHO_CHAN  U"\u0e08"
 #define UNICODE_THAI_CHARACTER_CHO_CHING  0x0e09
-#define UNITEXT_THAI_CHARACTER_CHO_CHING  L"\u0e09"
+#define UNITEXT_THAI_CHARACTER_CHO_CHING  U"\u0e09"
 #define UNICODE_THAI_CHARACTER_CHO_CHANG  0x0e0a
-#define UNITEXT_THAI_CHARACTER_CHO_CHANG  L"\u0e0a"
+#define UNITEXT_THAI_CHARACTER_CHO_CHANG  U"\u0e0a"
 #define UNICODE_THAI_CHARACTER_SO_SO  0x0e0b
-#define UNITEXT_THAI_CHARACTER_SO_SO  L"\u0e0b"
+#define UNITEXT_THAI_CHARACTER_SO_SO  U"\u0e0b"
 #define UNICODE_THAI_CHARACTER_CHO_CHOE  0x0e0c
-#define UNITEXT_THAI_CHARACTER_CHO_CHOE  L"\u0e0c"
+#define UNITEXT_THAI_CHARACTER_CHO_CHOE  U"\u0e0c"
 #define UNICODE_THAI_CHARACTER_YO_YING  0x0e0d
-#define UNITEXT_THAI_CHARACTER_YO_YING  L"\u0e0d"
+#define UNITEXT_THAI_CHARACTER_YO_YING  U"\u0e0d"
 #define UNICODE_THAI_CHARACTER_DO_CHADA  0x0e0e
-#define UNITEXT_THAI_CHARACTER_DO_CHADA  L"\u0e0e"
+#define UNITEXT_THAI_CHARACTER_DO_CHADA  U"\u0e0e"
 #define UNICODE_THAI_CHARACTER_TO_PATAK  0x0e0f
-#define UNITEXT_THAI_CHARACTER_TO_PATAK  L"\u0e0f"
+#define UNITEXT_THAI_CHARACTER_TO_PATAK  U"\u0e0f"
 #define UNICODE_THAI_CHARACTER_THO_THAN  0x0e10
-#define UNITEXT_THAI_CHARACTER_THO_THAN  L"\u0e10"
+#define UNITEXT_THAI_CHARACTER_THO_THAN  U"\u0e10"
 #define UNICODE_THAI_CHARACTER_THO_NANGMONTHO  0x0e11
-#define UNITEXT_THAI_CHARACTER_THO_NANGMONTHO  L"\u0e11"
+#define UNITEXT_THAI_CHARACTER_THO_NANGMONTHO  U"\u0e11"
 #define UNICODE_THAI_CHARACTER_THO_PHUTHAO  0x0e12
-#define UNITEXT_THAI_CHARACTER_THO_PHUTHAO  L"\u0e12"
+#define UNITEXT_THAI_CHARACTER_THO_PHUTHAO  U"\u0e12"
 #define UNICODE_THAI_CHARACTER_NO_NEN  0x0e13
-#define UNITEXT_THAI_CHARACTER_NO_NEN  L"\u0e13"
+#define UNITEXT_THAI_CHARACTER_NO_NEN  U"\u0e13"
 #define UNICODE_THAI_CHARACTER_DO_DEK  0x0e14
-#define UNITEXT_THAI_CHARACTER_DO_DEK  L"\u0e14"
+#define UNITEXT_THAI_CHARACTER_DO_DEK  U"\u0e14"
 #define UNICODE_THAI_CHARACTER_TO_TAO  0x0e15
-#define UNITEXT_THAI_CHARACTER_TO_TAO  L"\u0e15"
+#define UNITEXT_THAI_CHARACTER_TO_TAO  U"\u0e15"
 #define UNICODE_THAI_CHARACTER_THO_THUNG  0x0e16
-#define UNITEXT_THAI_CHARACTER_THO_THUNG  L"\u0e16"
+#define UNITEXT_THAI_CHARACTER_THO_THUNG  U"\u0e16"
 #define UNICODE_THAI_CHARACTER_THO_THAHAN  0x0e17
-#define UNITEXT_THAI_CHARACTER_THO_THAHAN  L"\u0e17"
+#define UNITEXT_THAI_CHARACTER_THO_THAHAN  U"\u0e17"
 #define UNICODE_THAI_CHARACTER_THO_THONG  0x0e18
-#define UNITEXT_THAI_CHARACTER_THO_THONG  L"\u0e18"
+#define UNITEXT_THAI_CHARACTER_THO_THONG  U"\u0e18"
 #define UNICODE_THAI_CHARACTER_NO_NU  0x0e19
-#define UNITEXT_THAI_CHARACTER_NO_NU  L"\u0e19"
+#define UNITEXT_THAI_CHARACTER_NO_NU  U"\u0e19"
 #define UNICODE_THAI_CHARACTER_BO_BAIMAI  0x0e1a
-#define UNITEXT_THAI_CHARACTER_BO_BAIMAI  L"\u0e1a"
+#define UNITEXT_THAI_CHARACTER_BO_BAIMAI  U"\u0e1a"
 #define UNICODE_THAI_CHARACTER_PO_PLA  0x0e1b
-#define UNITEXT_THAI_CHARACTER_PO_PLA  L"\u0e1b"
+#define UNITEXT_THAI_CHARACTER_PO_PLA  U"\u0e1b"
 #define UNICODE_THAI_CHARACTER_PHO_PHUNG  0x0e1c
-#define UNITEXT_THAI_CHARACTER_PHO_PHUNG  L"\u0e1c"
+#define UNITEXT_THAI_CHARACTER_PHO_PHUNG  U"\u0e1c"
 #define UNICODE_THAI_CHARACTER_FO_FA  0x0e1d
-#define UNITEXT_THAI_CHARACTER_FO_FA  L"\u0e1d"
+#define UNITEXT_THAI_CHARACTER_FO_FA  U"\u0e1d"
 #define UNICODE_THAI_CHARACTER_PHO_PHAN  0x0e1e
-#define UNITEXT_THAI_CHARACTER_PHO_PHAN  L"\u0e1e"
+#define UNITEXT_THAI_CHARACTER_PHO_PHAN  U"\u0e1e"
 #define UNICODE_THAI_CHARACTER_FO_FAN  0x0e1f
-#define UNITEXT_THAI_CHARACTER_FO_FAN  L"\u0e1f"
+#define UNITEXT_THAI_CHARACTER_FO_FAN  U"\u0e1f"
 #define UNICODE_THAI_CHARACTER_PHO_SAMPHAO  0x0e20
-#define UNITEXT_THAI_CHARACTER_PHO_SAMPHAO  L"\u0e20"
+#define UNITEXT_THAI_CHARACTER_PHO_SAMPHAO  U"\u0e20"
 #define UNICODE_THAI_CHARACTER_MO_MA  0x0e21
-#define UNITEXT_THAI_CHARACTER_MO_MA  L"\u0e21"
+#define UNITEXT_THAI_CHARACTER_MO_MA  U"\u0e21"
 #define UNICODE_THAI_CHARACTER_YO_YAK  0x0e22
-#define UNITEXT_THAI_CHARACTER_YO_YAK  L"\u0e22"
+#define UNITEXT_THAI_CHARACTER_YO_YAK  U"\u0e22"
 #define UNICODE_THAI_CHARACTER_RO_RUA  0x0e23
-#define UNITEXT_THAI_CHARACTER_RO_RUA  L"\u0e23"
+#define UNITEXT_THAI_CHARACTER_RO_RUA  U"\u0e23"
 #define UNICODE_THAI_CHARACTER_RU  0x0e24
-#define UNITEXT_THAI_CHARACTER_RU  L"\u0e24"
+#define UNITEXT_THAI_CHARACTER_RU  U"\u0e24"
 #define UNICODE_THAI_CHARACTER_LO_LING  0x0e25
-#define UNITEXT_THAI_CHARACTER_LO_LING  L"\u0e25"
+#define UNITEXT_THAI_CHARACTER_LO_LING  U"\u0e25"
 #define UNICODE_THAI_CHARACTER_LU  0x0e26
-#define UNITEXT_THAI_CHARACTER_LU  L"\u0e26"
+#define UNITEXT_THAI_CHARACTER_LU  U"\u0e26"
 #define UNICODE_THAI_CHARACTER_WO_WAEN  0x0e27
-#define UNITEXT_THAI_CHARACTER_WO_WAEN  L"\u0e27"
+#define UNITEXT_THAI_CHARACTER_WO_WAEN  U"\u0e27"
 #define UNICODE_THAI_CHARACTER_SO_SALA  0x0e28
-#define UNITEXT_THAI_CHARACTER_SO_SALA  L"\u0e28"
+#define UNITEXT_THAI_CHARACTER_SO_SALA  U"\u0e28"
 #define UNICODE_THAI_CHARACTER_SO_RUSI  0x0e29
-#define UNITEXT_THAI_CHARACTER_SO_RUSI  L"\u0e29"
+#define UNITEXT_THAI_CHARACTER_SO_RUSI  U"\u0e29"
 #define UNICODE_THAI_CHARACTER_SO_SUA  0x0e2a
-#define UNITEXT_THAI_CHARACTER_SO_SUA  L"\u0e2a"
+#define UNITEXT_THAI_CHARACTER_SO_SUA  U"\u0e2a"
 #define UNICODE_THAI_CHARACTER_HO_HIP  0x0e2b
-#define UNITEXT_THAI_CHARACTER_HO_HIP  L"\u0e2b"
+#define UNITEXT_THAI_CHARACTER_HO_HIP  U"\u0e2b"
 #define UNICODE_THAI_CHARACTER_LO_CHULA  0x0e2c
-#define UNITEXT_THAI_CHARACTER_LO_CHULA  L"\u0e2c"
+#define UNITEXT_THAI_CHARACTER_LO_CHULA  U"\u0e2c"
 #define UNICODE_THAI_CHARACTER_O_ANG  0x0e2d
-#define UNITEXT_THAI_CHARACTER_O_ANG  L"\u0e2d"
+#define UNITEXT_THAI_CHARACTER_O_ANG  U"\u0e2d"
 #define UNICODE_THAI_CHARACTER_HO_NOKHUK  0x0e2e
-#define UNITEXT_THAI_CHARACTER_HO_NOKHUK  L"\u0e2e"
+#define UNITEXT_THAI_CHARACTER_HO_NOKHUK  U"\u0e2e"
 #define UNICODE_THAI_CHARACTER_PAIYANNOI  0x0e2f
-#define UNITEXT_THAI_CHARACTER_PAIYANNOI  L"\u0e2f"
+#define UNITEXT_THAI_CHARACTER_PAIYANNOI  U"\u0e2f"
 #define UNICODE_THAI_CHARACTER_SARA_A  0x0e30
-#define UNITEXT_THAI_CHARACTER_SARA_A  L"\u0e30"
+#define UNITEXT_THAI_CHARACTER_SARA_A  U"\u0e30"
 #define UNICODE_THAI_CHARACTER_MAI_HAN_AKAT  0x0e31
-#define UNITEXT_THAI_CHARACTER_MAI_HAN_AKAT  L"\u0e31"
+#define UNITEXT_THAI_CHARACTER_MAI_HAN_AKAT  U"\u0e31"
 #define UNICODE_THAI_CHARACTER_SARA_AA  0x0e32
-#define UNITEXT_THAI_CHARACTER_SARA_AA  L"\u0e32"
+#define UNITEXT_THAI_CHARACTER_SARA_AA  U"\u0e32"
 #define UNICODE_THAI_CHARACTER_SARA_AM  0x0e33
-#define UNITEXT_THAI_CHARACTER_SARA_AM  L"\u0e33"
+#define UNITEXT_THAI_CHARACTER_SARA_AM  U"\u0e33"
 #define UNICODE_THAI_CHARACTER_SARA_I  0x0e34
-#define UNITEXT_THAI_CHARACTER_SARA_I  L"\u0e34"
+#define UNITEXT_THAI_CHARACTER_SARA_I  U"\u0e34"
 #define UNICODE_THAI_CHARACTER_SARA_II  0x0e35
-#define UNITEXT_THAI_CHARACTER_SARA_II  L"\u0e35"
+#define UNITEXT_THAI_CHARACTER_SARA_II  U"\u0e35"
 #define UNICODE_THAI_CHARACTER_SARA_UE  0x0e36
-#define UNITEXT_THAI_CHARACTER_SARA_UE  L"\u0e36"
+#define UNITEXT_THAI_CHARACTER_SARA_UE  U"\u0e36"
 #define UNICODE_THAI_CHARACTER_SARA_UEE  0x0e37
-#define UNITEXT_THAI_CHARACTER_SARA_UEE  L"\u0e37"
+#define UNITEXT_THAI_CHARACTER_SARA_UEE  U"\u0e37"
 #define UNICODE_THAI_CHARACTER_SARA_U  0x0e38
-#define UNITEXT_THAI_CHARACTER_SARA_U  L"\u0e38"
+#define UNITEXT_THAI_CHARACTER_SARA_U  U"\u0e38"
 #define UNICODE_THAI_CHARACTER_SARA_UU  0x0e39
-#define UNITEXT_THAI_CHARACTER_SARA_UU  L"\u0e39"
+#define UNITEXT_THAI_CHARACTER_SARA_UU  U"\u0e39"
 #define UNICODE_THAI_CHARACTER_PHINTHU  0x0e3a
-#define UNITEXT_THAI_CHARACTER_PHINTHU  L"\u0e3a"
+#define UNITEXT_THAI_CHARACTER_PHINTHU  U"\u0e3a"
 #define UNICODE_THAI_CURRENCY_SYMBOL_BAHT  0x0e3f
-#define UNITEXT_THAI_CURRENCY_SYMBOL_BAHT  L"\u0e3f"
+#define UNITEXT_THAI_CURRENCY_SYMBOL_BAHT  U"\u0e3f"
 #define UNICODE_THAI_CHARACTER_SARA_E  0x0e40
-#define UNITEXT_THAI_CHARACTER_SARA_E  L"\u0e40"
+#define UNITEXT_THAI_CHARACTER_SARA_E  U"\u0e40"
 #define UNICODE_THAI_CHARACTER_SARA_AE  0x0e41
-#define UNITEXT_THAI_CHARACTER_SARA_AE  L"\u0e41"
+#define UNITEXT_THAI_CHARACTER_SARA_AE  U"\u0e41"
 #define UNICODE_THAI_CHARACTER_SARA_O  0x0e42
-#define UNITEXT_THAI_CHARACTER_SARA_O  L"\u0e42"
+#define UNITEXT_THAI_CHARACTER_SARA_O  U"\u0e42"
 #define UNICODE_THAI_CHARACTER_SARA_AI_MAIMUAN  0x0e43
-#define UNITEXT_THAI_CHARACTER_SARA_AI_MAIMUAN  L"\u0e43"
+#define UNITEXT_THAI_CHARACTER_SARA_AI_MAIMUAN  U"\u0e43"
 #define UNICODE_THAI_CHARACTER_SARA_AI_MAIMALAI  0x0e44
-#define UNITEXT_THAI_CHARACTER_SARA_AI_MAIMALAI  L"\u0e44"
+#define UNITEXT_THAI_CHARACTER_SARA_AI_MAIMALAI  U"\u0e44"
 #define UNICODE_THAI_CHARACTER_LAKKHANGYAO  0x0e45
-#define UNITEXT_THAI_CHARACTER_LAKKHANGYAO  L"\u0e45"
+#define UNITEXT_THAI_CHARACTER_LAKKHANGYAO  U"\u0e45"
 #define UNICODE_THAI_CHARACTER_MAIYAMOK  0x0e46
-#define UNITEXT_THAI_CHARACTER_MAIYAMOK  L"\u0e46"
+#define UNITEXT_THAI_CHARACTER_MAIYAMOK  U"\u0e46"
 #define UNICODE_THAI_CHARACTER_MAITAIKHU  0x0e47
-#define UNITEXT_THAI_CHARACTER_MAITAIKHU  L"\u0e47"
+#define UNITEXT_THAI_CHARACTER_MAITAIKHU  U"\u0e47"
 #define UNICODE_THAI_CHARACTER_MAI_EK  0x0e48
-#define UNITEXT_THAI_CHARACTER_MAI_EK  L"\u0e48"
+#define UNITEXT_THAI_CHARACTER_MAI_EK  U"\u0e48"
 #define UNICODE_THAI_CHARACTER_MAI_THO  0x0e49
-#define UNITEXT_THAI_CHARACTER_MAI_THO  L"\u0e49"
+#define UNITEXT_THAI_CHARACTER_MAI_THO  U"\u0e49"
 #define UNICODE_THAI_CHARACTER_MAI_TRI  0x0e4a
-#define UNITEXT_THAI_CHARACTER_MAI_TRI  L"\u0e4a"
+#define UNITEXT_THAI_CHARACTER_MAI_TRI  U"\u0e4a"
 #define UNICODE_THAI_CHARACTER_MAI_CHATTAWA  0x0e4b
-#define UNITEXT_THAI_CHARACTER_MAI_CHATTAWA  L"\u0e4b"
+#define UNITEXT_THAI_CHARACTER_MAI_CHATTAWA  U"\u0e4b"
 #define UNICODE_THAI_CHARACTER_THANTHAKHAT  0x0e4c
-#define UNITEXT_THAI_CHARACTER_THANTHAKHAT  L"\u0e4c"
+#define UNITEXT_THAI_CHARACTER_THANTHAKHAT  U"\u0e4c"
 #define UNICODE_THAI_CHARACTER_NIKHAHIT  0x0e4d
-#define UNITEXT_THAI_CHARACTER_NIKHAHIT  L"\u0e4d"
+#define UNITEXT_THAI_CHARACTER_NIKHAHIT  U"\u0e4d"
 #define UNICODE_THAI_CHARACTER_YAMAKKAN  0x0e4e
-#define UNITEXT_THAI_CHARACTER_YAMAKKAN  L"\u0e4e"
+#define UNITEXT_THAI_CHARACTER_YAMAKKAN  U"\u0e4e"
 #define UNICODE_THAI_CHARACTER_FONGMAN  0x0e4f
-#define UNITEXT_THAI_CHARACTER_FONGMAN  L"\u0e4f"
+#define UNITEXT_THAI_CHARACTER_FONGMAN  U"\u0e4f"
 #define UNICODE_THAI_DIGIT_ZERO  0x0e50
-#define UNITEXT_THAI_DIGIT_ZERO  L"\u0e50"
+#define UNITEXT_THAI_DIGIT_ZERO  U"\u0e50"
 #define UNICODE_THAI_DIGIT_ONE  0x0e51
-#define UNITEXT_THAI_DIGIT_ONE  L"\u0e51"
+#define UNITEXT_THAI_DIGIT_ONE  U"\u0e51"
 #define UNICODE_THAI_DIGIT_TWO  0x0e52
-#define UNITEXT_THAI_DIGIT_TWO  L"\u0e52"
+#define UNITEXT_THAI_DIGIT_TWO  U"\u0e52"
 #define UNICODE_THAI_DIGIT_THREE  0x0e53
-#define UNITEXT_THAI_DIGIT_THREE  L"\u0e53"
+#define UNITEXT_THAI_DIGIT_THREE  U"\u0e53"
 #define UNICODE_THAI_DIGIT_FOUR  0x0e54
-#define UNITEXT_THAI_DIGIT_FOUR  L"\u0e54"
+#define UNITEXT_THAI_DIGIT_FOUR  U"\u0e54"
 #define UNICODE_THAI_DIGIT_FIVE  0x0e55
-#define UNITEXT_THAI_DIGIT_FIVE  L"\u0e55"
+#define UNITEXT_THAI_DIGIT_FIVE  U"\u0e55"
 #define UNICODE_THAI_DIGIT_SIX  0x0e56
-#define UNITEXT_THAI_DIGIT_SIX  L"\u0e56"
+#define UNITEXT_THAI_DIGIT_SIX  U"\u0e56"
 #define UNICODE_THAI_DIGIT_SEVEN  0x0e57
-#define UNITEXT_THAI_DIGIT_SEVEN  L"\u0e57"
+#define UNITEXT_THAI_DIGIT_SEVEN  U"\u0e57"
 #define UNICODE_THAI_DIGIT_EIGHT  0x0e58
-#define UNITEXT_THAI_DIGIT_EIGHT  L"\u0e58"
+#define UNITEXT_THAI_DIGIT_EIGHT  U"\u0e58"
 #define UNICODE_THAI_DIGIT_NINE  0x0e59
-#define UNITEXT_THAI_DIGIT_NINE  L"\u0e59"
+#define UNITEXT_THAI_DIGIT_NINE  U"\u0e59"
 #define UNICODE_THAI_CHARACTER_ANGKHANKHU  0x0e5a
-#define UNITEXT_THAI_CHARACTER_ANGKHANKHU  L"\u0e5a"
+#define UNITEXT_THAI_CHARACTER_ANGKHANKHU  U"\u0e5a"
 #define UNICODE_THAI_CHARACTER_KHOMUT  0x0e5b
-#define UNITEXT_THAI_CHARACTER_KHOMUT  L"\u0e5b"
+#define UNITEXT_THAI_CHARACTER_KHOMUT  U"\u0e5b"
 #define UNICODE_LAO_LETTER_KO  0x0e81
-#define UNITEXT_LAO_LETTER_KO  L"\u0e81"
+#define UNITEXT_LAO_LETTER_KO  U"\u0e81"
 #define UNICODE_LAO_LETTER_KHO_SUNG  0x0e82
-#define UNITEXT_LAO_LETTER_KHO_SUNG  L"\u0e82"
+#define UNITEXT_LAO_LETTER_KHO_SUNG  U"\u0e82"
 #define UNICODE_LAO_LETTER_KHO_TAM  0x0e84
-#define UNITEXT_LAO_LETTER_KHO_TAM  L"\u0e84"
+#define UNITEXT_LAO_LETTER_KHO_TAM  U"\u0e84"
 #define UNICODE_LAO_LETTER_NGO  0x0e87
-#define UNITEXT_LAO_LETTER_NGO  L"\u0e87"
+#define UNITEXT_LAO_LETTER_NGO  U"\u0e87"
 #define UNICODE_LAO_LETTER_CO  0x0e88
-#define UNITEXT_LAO_LETTER_CO  L"\u0e88"
+#define UNITEXT_LAO_LETTER_CO  U"\u0e88"
 #define UNICODE_LAO_LETTER_SO_TAM  0x0e8a
-#define UNITEXT_LAO_LETTER_SO_TAM  L"\u0e8a"
+#define UNITEXT_LAO_LETTER_SO_TAM  U"\u0e8a"
 #define UNICODE_LAO_LETTER_NYO  0x0e8d
-#define UNITEXT_LAO_LETTER_NYO  L"\u0e8d"
+#define UNITEXT_LAO_LETTER_NYO  U"\u0e8d"
 #define UNICODE_LAO_LETTER_DO  0x0e94
-#define UNITEXT_LAO_LETTER_DO  L"\u0e94"
+#define UNITEXT_LAO_LETTER_DO  U"\u0e94"
 #define UNICODE_LAO_LETTER_TO  0x0e95
-#define UNITEXT_LAO_LETTER_TO  L"\u0e95"
+#define UNITEXT_LAO_LETTER_TO  U"\u0e95"
 #define UNICODE_LAO_LETTER_THO_SUNG  0x0e96
-#define UNITEXT_LAO_LETTER_THO_SUNG  L"\u0e96"
+#define UNITEXT_LAO_LETTER_THO_SUNG  U"\u0e96"
 #define UNICODE_LAO_LETTER_THO_TAM  0x0e97
-#define UNITEXT_LAO_LETTER_THO_TAM  L"\u0e97"
+#define UNITEXT_LAO_LETTER_THO_TAM  U"\u0e97"
 #define UNICODE_LAO_LETTER_NO  0x0e99
-#define UNITEXT_LAO_LETTER_NO  L"\u0e99"
+#define UNITEXT_LAO_LETTER_NO  U"\u0e99"
 #define UNICODE_LAO_LETTER_BO  0x0e9a
-#define UNITEXT_LAO_LETTER_BO  L"\u0e9a"
+#define UNITEXT_LAO_LETTER_BO  U"\u0e9a"
 #define UNICODE_LAO_LETTER_PO  0x0e9b
-#define UNITEXT_LAO_LETTER_PO  L"\u0e9b"
+#define UNITEXT_LAO_LETTER_PO  U"\u0e9b"
 #define UNICODE_LAO_LETTER_PHO_SUNG  0x0e9c
-#define UNITEXT_LAO_LETTER_PHO_SUNG  L"\u0e9c"
+#define UNITEXT_LAO_LETTER_PHO_SUNG  U"\u0e9c"
 #define UNICODE_LAO_LETTER_FO_TAM  0x0e9d
-#define UNITEXT_LAO_LETTER_FO_TAM  L"\u0e9d"
+#define UNITEXT_LAO_LETTER_FO_TAM  U"\u0e9d"
 #define UNICODE_LAO_LETTER_PHO_TAM  0x0e9e
-#define UNITEXT_LAO_LETTER_PHO_TAM  L"\u0e9e"
+#define UNITEXT_LAO_LETTER_PHO_TAM  U"\u0e9e"
 #define UNICODE_LAO_LETTER_FO_SUNG  0x0e9f
-#define UNITEXT_LAO_LETTER_FO_SUNG  L"\u0e9f"
+#define UNITEXT_LAO_LETTER_FO_SUNG  U"\u0e9f"
 #define UNICODE_LAO_LETTER_MO  0x0ea1
-#define UNITEXT_LAO_LETTER_MO  L"\u0ea1"
+#define UNITEXT_LAO_LETTER_MO  U"\u0ea1"
 #define UNICODE_LAO_LETTER_YO  0x0ea2
-#define UNITEXT_LAO_LETTER_YO  L"\u0ea2"
+#define UNITEXT_LAO_LETTER_YO  U"\u0ea2"
 #define UNICODE_LAO_LETTER_LO_LING  0x0ea3
-#define UNITEXT_LAO_LETTER_LO_LING  L"\u0ea3"
+#define UNITEXT_LAO_LETTER_LO_LING  U"\u0ea3"
 #define UNICODE_LAO_LETTER_LO_LOOT  0x0ea5
-#define UNITEXT_LAO_LETTER_LO_LOOT  L"\u0ea5"
+#define UNITEXT_LAO_LETTER_LO_LOOT  U"\u0ea5"
 #define UNICODE_LAO_LETTER_WO  0x0ea7
-#define UNITEXT_LAO_LETTER_WO  L"\u0ea7"
+#define UNITEXT_LAO_LETTER_WO  U"\u0ea7"
 #define UNICODE_LAO_LETTER_SO_SUNG  0x0eaa
-#define UNITEXT_LAO_LETTER_SO_SUNG  L"\u0eaa"
+#define UNITEXT_LAO_LETTER_SO_SUNG  U"\u0eaa"
 #define UNICODE_LAO_LETTER_HO_SUNG  0x0eab
-#define UNITEXT_LAO_LETTER_HO_SUNG  L"\u0eab"
+#define UNITEXT_LAO_LETTER_HO_SUNG  U"\u0eab"
 #define UNICODE_LAO_LETTER_O  0x0ead
-#define UNITEXT_LAO_LETTER_O  L"\u0ead"
+#define UNITEXT_LAO_LETTER_O  U"\u0ead"
 #define UNICODE_LAO_LETTER_HO_TAM  0x0eae
-#define UNITEXT_LAO_LETTER_HO_TAM  L"\u0eae"
+#define UNITEXT_LAO_LETTER_HO_TAM  U"\u0eae"
 #define UNICODE_LAO_ELLIPSIS  0x0eaf
-#define UNITEXT_LAO_ELLIPSIS  L"\u0eaf"
+#define UNITEXT_LAO_ELLIPSIS  U"\u0eaf"
 #define UNICODE_LAO_VOWEL_SIGN_A  0x0eb0
-#define UNITEXT_LAO_VOWEL_SIGN_A  L"\u0eb0"
+#define UNITEXT_LAO_VOWEL_SIGN_A  U"\u0eb0"
 #define UNICODE_LAO_VOWEL_SIGN_MAI_KAN  0x0eb1
-#define UNITEXT_LAO_VOWEL_SIGN_MAI_KAN  L"\u0eb1"
+#define UNITEXT_LAO_VOWEL_SIGN_MAI_KAN  U"\u0eb1"
 #define UNICODE_LAO_VOWEL_SIGN_AA  0x0eb2
-#define UNITEXT_LAO_VOWEL_SIGN_AA  L"\u0eb2"
+#define UNITEXT_LAO_VOWEL_SIGN_AA  U"\u0eb2"
 #define UNICODE_LAO_VOWEL_SIGN_AM  0x0eb3
-#define UNITEXT_LAO_VOWEL_SIGN_AM  L"\u0eb3"
+#define UNITEXT_LAO_VOWEL_SIGN_AM  U"\u0eb3"
 #define UNICODE_LAO_VOWEL_SIGN_I  0x0eb4
-#define UNITEXT_LAO_VOWEL_SIGN_I  L"\u0eb4"
+#define UNITEXT_LAO_VOWEL_SIGN_I  U"\u0eb4"
 #define UNICODE_LAO_VOWEL_SIGN_II  0x0eb5
-#define UNITEXT_LAO_VOWEL_SIGN_II  L"\u0eb5"
+#define UNITEXT_LAO_VOWEL_SIGN_II  U"\u0eb5"
 #define UNICODE_LAO_VOWEL_SIGN_Y  0x0eb6
-#define UNITEXT_LAO_VOWEL_SIGN_Y  L"\u0eb6"
+#define UNITEXT_LAO_VOWEL_SIGN_Y  U"\u0eb6"
 #define UNICODE_LAO_VOWEL_SIGN_YY  0x0eb7
-#define UNITEXT_LAO_VOWEL_SIGN_YY  L"\u0eb7"
+#define UNITEXT_LAO_VOWEL_SIGN_YY  U"\u0eb7"
 #define UNICODE_LAO_VOWEL_SIGN_U  0x0eb8
-#define UNITEXT_LAO_VOWEL_SIGN_U  L"\u0eb8"
+#define UNITEXT_LAO_VOWEL_SIGN_U  U"\u0eb8"
 #define UNICODE_LAO_VOWEL_SIGN_UU  0x0eb9
-#define UNITEXT_LAO_VOWEL_SIGN_UU  L"\u0eb9"
+#define UNITEXT_LAO_VOWEL_SIGN_UU  U"\u0eb9"
 #define UNICODE_LAO_VOWEL_SIGN_MAI_KON  0x0ebb
-#define UNITEXT_LAO_VOWEL_SIGN_MAI_KON  L"\u0ebb"
+#define UNITEXT_LAO_VOWEL_SIGN_MAI_KON  U"\u0ebb"
 #define UNICODE_LAO_SEMIVOWEL_SIGN_LO  0x0ebc
-#define UNITEXT_LAO_SEMIVOWEL_SIGN_LO  L"\u0ebc"
+#define UNITEXT_LAO_SEMIVOWEL_SIGN_LO  U"\u0ebc"
 #define UNICODE_LAO_SEMIVOWEL_SIGN_NYO  0x0ebd
-#define UNITEXT_LAO_SEMIVOWEL_SIGN_NYO  L"\u0ebd"
+#define UNITEXT_LAO_SEMIVOWEL_SIGN_NYO  U"\u0ebd"
 #define UNICODE_LAO_VOWEL_SIGN_E  0x0ec0
-#define UNITEXT_LAO_VOWEL_SIGN_E  L"\u0ec0"
+#define UNITEXT_LAO_VOWEL_SIGN_E  U"\u0ec0"
 #define UNICODE_LAO_VOWEL_SIGN_EI  0x0ec1
-#define UNITEXT_LAO_VOWEL_SIGN_EI  L"\u0ec1"
+#define UNITEXT_LAO_VOWEL_SIGN_EI  U"\u0ec1"
 #define UNICODE_LAO_VOWEL_SIGN_O  0x0ec2
-#define UNITEXT_LAO_VOWEL_SIGN_O  L"\u0ec2"
+#define UNITEXT_LAO_VOWEL_SIGN_O  U"\u0ec2"
 #define UNICODE_LAO_VOWEL_SIGN_AY  0x0ec3
-#define UNITEXT_LAO_VOWEL_SIGN_AY  L"\u0ec3"
+#define UNITEXT_LAO_VOWEL_SIGN_AY  U"\u0ec3"
 #define UNICODE_LAO_VOWEL_SIGN_AI  0x0ec4
-#define UNITEXT_LAO_VOWEL_SIGN_AI  L"\u0ec4"
+#define UNITEXT_LAO_VOWEL_SIGN_AI  U"\u0ec4"
 #define UNICODE_LAO_KO_LA  0x0ec6
-#define UNITEXT_LAO_KO_LA  L"\u0ec6"
+#define UNITEXT_LAO_KO_LA  U"\u0ec6"
 #define UNICODE_LAO_TONE_MAI_EK  0x0ec8
-#define UNITEXT_LAO_TONE_MAI_EK  L"\u0ec8"
+#define UNITEXT_LAO_TONE_MAI_EK  U"\u0ec8"
 #define UNICODE_LAO_TONE_MAI_THO  0x0ec9
-#define UNITEXT_LAO_TONE_MAI_THO  L"\u0ec9"
+#define UNITEXT_LAO_TONE_MAI_THO  U"\u0ec9"
 #define UNICODE_LAO_TONE_MAI_TI  0x0eca
-#define UNITEXT_LAO_TONE_MAI_TI  L"\u0eca"
+#define UNITEXT_LAO_TONE_MAI_TI  U"\u0eca"
 #define UNICODE_LAO_TONE_MAI_CATAWA  0x0ecb
-#define UNITEXT_LAO_TONE_MAI_CATAWA  L"\u0ecb"
+#define UNITEXT_LAO_TONE_MAI_CATAWA  U"\u0ecb"
 #define UNICODE_LAO_CANCELLATION_MARK  0x0ecc
-#define UNITEXT_LAO_CANCELLATION_MARK  L"\u0ecc"
+#define UNITEXT_LAO_CANCELLATION_MARK  U"\u0ecc"
 #define UNICODE_LAO_NIGGAHITA  0x0ecd
-#define UNITEXT_LAO_NIGGAHITA  L"\u0ecd"
+#define UNITEXT_LAO_NIGGAHITA  U"\u0ecd"
 #define UNICODE_LAO_DIGIT_ZERO  0x0ed0
-#define UNITEXT_LAO_DIGIT_ZERO  L"\u0ed0"
+#define UNITEXT_LAO_DIGIT_ZERO  U"\u0ed0"
 #define UNICODE_LAO_DIGIT_ONE  0x0ed1
-#define UNITEXT_LAO_DIGIT_ONE  L"\u0ed1"
+#define UNITEXT_LAO_DIGIT_ONE  U"\u0ed1"
 #define UNICODE_LAO_DIGIT_TWO  0x0ed2
-#define UNITEXT_LAO_DIGIT_TWO  L"\u0ed2"
+#define UNITEXT_LAO_DIGIT_TWO  U"\u0ed2"
 #define UNICODE_LAO_DIGIT_THREE  0x0ed3
-#define UNITEXT_LAO_DIGIT_THREE  L"\u0ed3"
+#define UNITEXT_LAO_DIGIT_THREE  U"\u0ed3"
 #define UNICODE_LAO_DIGIT_FOUR  0x0ed4
-#define UNITEXT_LAO_DIGIT_FOUR  L"\u0ed4"
+#define UNITEXT_LAO_DIGIT_FOUR  U"\u0ed4"
 #define UNICODE_LAO_DIGIT_FIVE  0x0ed5
-#define UNITEXT_LAO_DIGIT_FIVE  L"\u0ed5"
+#define UNITEXT_LAO_DIGIT_FIVE  U"\u0ed5"
 #define UNICODE_LAO_DIGIT_SIX  0x0ed6
-#define UNITEXT_LAO_DIGIT_SIX  L"\u0ed6"
+#define UNITEXT_LAO_DIGIT_SIX  U"\u0ed6"
 #define UNICODE_LAO_DIGIT_SEVEN  0x0ed7
-#define UNITEXT_LAO_DIGIT_SEVEN  L"\u0ed7"
+#define UNITEXT_LAO_DIGIT_SEVEN  U"\u0ed7"
 #define UNICODE_LAO_DIGIT_EIGHT  0x0ed8
-#define UNITEXT_LAO_DIGIT_EIGHT  L"\u0ed8"
+#define UNITEXT_LAO_DIGIT_EIGHT  U"\u0ed8"
 #define UNICODE_LAO_DIGIT_NINE  0x0ed9
-#define UNITEXT_LAO_DIGIT_NINE  L"\u0ed9"
+#define UNITEXT_LAO_DIGIT_NINE  U"\u0ed9"
 #define UNICODE_LAO_HO_NO  0x0edc
-#define UNITEXT_LAO_HO_NO  L"\u0edc"
+#define UNITEXT_LAO_HO_NO  U"\u0edc"
 #define UNICODE_LAO_HO_MO  0x0edd
-#define UNITEXT_LAO_HO_MO  L"\u0edd"
+#define UNITEXT_LAO_HO_MO  U"\u0edd"
 #define UNICODE_TIBETAN_SYLLABLE_OM  0x0f00
-#define UNITEXT_TIBETAN_SYLLABLE_OM  L"\u0f00"
+#define UNITEXT_TIBETAN_SYLLABLE_OM  U"\u0f00"
 #define UNICODE_TIBETAN_MARK_GTER_YIG_MGO_TRUNCATED_A  0x0f01
-#define UNITEXT_TIBETAN_MARK_GTER_YIG_MGO_TRUNCATED_A  L"\u0f01"
+#define UNITEXT_TIBETAN_MARK_GTER_YIG_MGO_TRUNCATED_A  U"\u0f01"
 #define UNICODE_TIBETAN_MARK_GTER_YIG_MGO__UM_RNAM_BCAD_MA  0x0f02
-#define UNITEXT_TIBETAN_MARK_GTER_YIG_MGO__UM_RNAM_BCAD_MA  L"\u0f02"
+#define UNITEXT_TIBETAN_MARK_GTER_YIG_MGO__UM_RNAM_BCAD_MA  U"\u0f02"
 #define UNICODE_TIBETAN_MARK_GTER_YIG_MGO__UM_GTER_TSHEG_MA  0x0f03
-#define UNITEXT_TIBETAN_MARK_GTER_YIG_MGO__UM_GTER_TSHEG_MA  L"\u0f03"
+#define UNITEXT_TIBETAN_MARK_GTER_YIG_MGO__UM_GTER_TSHEG_MA  U"\u0f03"
 #define UNICODE_TIBETAN_MARK_INITIAL_YIG_MGO_MDUN_MA  0x0f04
-#define UNITEXT_TIBETAN_MARK_INITIAL_YIG_MGO_MDUN_MA  L"\u0f04"
+#define UNITEXT_TIBETAN_MARK_INITIAL_YIG_MGO_MDUN_MA  U"\u0f04"
 #define UNICODE_TIBETAN_MARK_CLOSING_YIG_MGO_SGAB_MA  0x0f05
-#define UNITEXT_TIBETAN_MARK_CLOSING_YIG_MGO_SGAB_MA  L"\u0f05"
+#define UNITEXT_TIBETAN_MARK_CLOSING_YIG_MGO_SGAB_MA  U"\u0f05"
 #define UNICODE_TIBETAN_MARK_CARET_YIG_MGO_PHUR_SHAD_MA  0x0f06
-#define UNITEXT_TIBETAN_MARK_CARET_YIG_MGO_PHUR_SHAD_MA  L"\u0f06"
+#define UNITEXT_TIBETAN_MARK_CARET_YIG_MGO_PHUR_SHAD_MA  U"\u0f06"
 #define UNICODE_TIBETAN_MARK_YIG_MGO_TSHEG_SHAD_MA  0x0f07
-#define UNITEXT_TIBETAN_MARK_YIG_MGO_TSHEG_SHAD_MA  L"\u0f07"
+#define UNITEXT_TIBETAN_MARK_YIG_MGO_TSHEG_SHAD_MA  U"\u0f07"
 #define UNICODE_TIBETAN_MARK_SBRUL_SHAD  0x0f08
-#define UNITEXT_TIBETAN_MARK_SBRUL_SHAD  L"\u0f08"
+#define UNITEXT_TIBETAN_MARK_SBRUL_SHAD  U"\u0f08"
 #define UNICODE_TIBETAN_MARK_BSKUR_YIG_MGO  0x0f09
-#define UNITEXT_TIBETAN_MARK_BSKUR_YIG_MGO  L"\u0f09"
+#define UNITEXT_TIBETAN_MARK_BSKUR_YIG_MGO  U"\u0f09"
 #define UNICODE_TIBETAN_MARK_BKA__SHOG_YIG_MGO  0x0f0a
-#define UNITEXT_TIBETAN_MARK_BKA__SHOG_YIG_MGO  L"\u0f0a"
+#define UNITEXT_TIBETAN_MARK_BKA__SHOG_YIG_MGO  U"\u0f0a"
 #define UNICODE_TIBETAN_MARK_INTERSYLLABIC_TSHEG  0x0f0b
-#define UNITEXT_TIBETAN_MARK_INTERSYLLABIC_TSHEG  L"\u0f0b"
+#define UNITEXT_TIBETAN_MARK_INTERSYLLABIC_TSHEG  U"\u0f0b"
 #define UNICODE_TIBETAN_MARK_DELIMITER_TSHEG_BSTAR  0x0f0c
-#define UNITEXT_TIBETAN_MARK_DELIMITER_TSHEG_BSTAR  L"\u0f0c"
+#define UNITEXT_TIBETAN_MARK_DELIMITER_TSHEG_BSTAR  U"\u0f0c"
 #define UNICODE_TIBETAN_MARK_SHAD  0x0f0d
-#define UNITEXT_TIBETAN_MARK_SHAD  L"\u0f0d"
+#define UNITEXT_TIBETAN_MARK_SHAD  U"\u0f0d"
 #define UNICODE_TIBETAN_MARK_NYIS_SHAD  0x0f0e
-#define UNITEXT_TIBETAN_MARK_NYIS_SHAD  L"\u0f0e"
+#define UNITEXT_TIBETAN_MARK_NYIS_SHAD  U"\u0f0e"
 #define UNICODE_TIBETAN_MARK_TSHEG_SHAD  0x0f0f
-#define UNITEXT_TIBETAN_MARK_TSHEG_SHAD  L"\u0f0f"
+#define UNITEXT_TIBETAN_MARK_TSHEG_SHAD  U"\u0f0f"
 #define UNICODE_TIBETAN_MARK_NYIS_TSHEG_SHAD  0x0f10
-#define UNITEXT_TIBETAN_MARK_NYIS_TSHEG_SHAD  L"\u0f10"
+#define UNITEXT_TIBETAN_MARK_NYIS_TSHEG_SHAD  U"\u0f10"
 #define UNICODE_TIBETAN_MARK_RIN_CHEN_SPUNGS_SHAD  0x0f11
-#define UNITEXT_TIBETAN_MARK_RIN_CHEN_SPUNGS_SHAD  L"\u0f11"
+#define UNITEXT_TIBETAN_MARK_RIN_CHEN_SPUNGS_SHAD  U"\u0f11"
 #define UNICODE_TIBETAN_MARK_RGYA_GRAM_SHAD  0x0f12
-#define UNITEXT_TIBETAN_MARK_RGYA_GRAM_SHAD  L"\u0f12"
+#define UNITEXT_TIBETAN_MARK_RGYA_GRAM_SHAD  U"\u0f12"
 #define UNICODE_TIBETAN_MARK_CARET__DZUD_RTAGS_ME_LONG_CAN  0x0f13
-#define UNITEXT_TIBETAN_MARK_CARET__DZUD_RTAGS_ME_LONG_CAN  L"\u0f13"
+#define UNITEXT_TIBETAN_MARK_CARET__DZUD_RTAGS_ME_LONG_CAN  U"\u0f13"
 #define UNICODE_TIBETAN_MARK_GTER_TSHEG  0x0f14
-#define UNITEXT_TIBETAN_MARK_GTER_TSHEG  L"\u0f14"
+#define UNITEXT_TIBETAN_MARK_GTER_TSHEG  U"\u0f14"
 #define UNICODE_TIBETAN_LOGOTYPE_SIGN_CHAD_RTAGS  0x0f15
-#define UNITEXT_TIBETAN_LOGOTYPE_SIGN_CHAD_RTAGS  L"\u0f15"
+#define UNITEXT_TIBETAN_LOGOTYPE_SIGN_CHAD_RTAGS  U"\u0f15"
 #define UNICODE_TIBETAN_LOGOTYPE_SIGN_LHAG_RTAGS  0x0f16
-#define UNITEXT_TIBETAN_LOGOTYPE_SIGN_LHAG_RTAGS  L"\u0f16"
+#define UNITEXT_TIBETAN_LOGOTYPE_SIGN_LHAG_RTAGS  U"\u0f16"
 #define UNICODE_TIBETAN_ASTROLOGICAL_SIGN_SGRA_GCAN__CHAR_RTAGS  0x0f17
-#define UNITEXT_TIBETAN_ASTROLOGICAL_SIGN_SGRA_GCAN__CHAR_RTAGS  L"\u0f17"
+#define UNITEXT_TIBETAN_ASTROLOGICAL_SIGN_SGRA_GCAN__CHAR_RTAGS  U"\u0f17"
 #define UNICODE_TIBETAN_ASTROLOGICAL_SIGN__KHYUD_PA  0x0f18
-#define UNITEXT_TIBETAN_ASTROLOGICAL_SIGN__KHYUD_PA  L"\u0f18"
+#define UNITEXT_TIBETAN_ASTROLOGICAL_SIGN__KHYUD_PA  U"\u0f18"
 #define UNICODE_TIBETAN_ASTROLOGICAL_SIGN_SDONG_TSHUGS  0x0f19
-#define UNITEXT_TIBETAN_ASTROLOGICAL_SIGN_SDONG_TSHUGS  L"\u0f19"
+#define UNITEXT_TIBETAN_ASTROLOGICAL_SIGN_SDONG_TSHUGS  U"\u0f19"
 #define UNICODE_TIBETAN_SIGN_RDEL_DKAR_GCIG  0x0f1a
-#define UNITEXT_TIBETAN_SIGN_RDEL_DKAR_GCIG  L"\u0f1a"
+#define UNITEXT_TIBETAN_SIGN_RDEL_DKAR_GCIG  U"\u0f1a"
 #define UNICODE_TIBETAN_SIGN_RDEL_DKAR_GNYIS  0x0f1b
-#define UNITEXT_TIBETAN_SIGN_RDEL_DKAR_GNYIS  L"\u0f1b"
+#define UNITEXT_TIBETAN_SIGN_RDEL_DKAR_GNYIS  U"\u0f1b"
 #define UNICODE_TIBETAN_SIGN_RDEL_DKAR_GSUM  0x0f1c
-#define UNITEXT_TIBETAN_SIGN_RDEL_DKAR_GSUM  L"\u0f1c"
+#define UNITEXT_TIBETAN_SIGN_RDEL_DKAR_GSUM  U"\u0f1c"
 #define UNICODE_TIBETAN_SIGN_RDEL_NAG_GCIG  0x0f1d
-#define UNITEXT_TIBETAN_SIGN_RDEL_NAG_GCIG  L"\u0f1d"
+#define UNITEXT_TIBETAN_SIGN_RDEL_NAG_GCIG  U"\u0f1d"
 #define UNICODE_TIBETAN_SIGN_RDEL_NAG_GNYIS  0x0f1e
-#define UNITEXT_TIBETAN_SIGN_RDEL_NAG_GNYIS  L"\u0f1e"
+#define UNITEXT_TIBETAN_SIGN_RDEL_NAG_GNYIS  U"\u0f1e"
 #define UNICODE_TIBETAN_SIGN_RDEL_DKAR_RDEL_NAG  0x0f1f
-#define UNITEXT_TIBETAN_SIGN_RDEL_DKAR_RDEL_NAG  L"\u0f1f"
+#define UNITEXT_TIBETAN_SIGN_RDEL_DKAR_RDEL_NAG  U"\u0f1f"
 #define UNICODE_TIBETAN_DIGIT_ZERO  0x0f20
-#define UNITEXT_TIBETAN_DIGIT_ZERO  L"\u0f20"
+#define UNITEXT_TIBETAN_DIGIT_ZERO  U"\u0f20"
 #define UNICODE_TIBETAN_DIGIT_ONE  0x0f21
-#define UNITEXT_TIBETAN_DIGIT_ONE  L"\u0f21"
+#define UNITEXT_TIBETAN_DIGIT_ONE  U"\u0f21"
 #define UNICODE_TIBETAN_DIGIT_TWO  0x0f22
-#define UNITEXT_TIBETAN_DIGIT_TWO  L"\u0f22"
+#define UNITEXT_TIBETAN_DIGIT_TWO  U"\u0f22"
 #define UNICODE_TIBETAN_DIGIT_THREE  0x0f23
-#define UNITEXT_TIBETAN_DIGIT_THREE  L"\u0f23"
+#define UNITEXT_TIBETAN_DIGIT_THREE  U"\u0f23"
 #define UNICODE_TIBETAN_DIGIT_FOUR  0x0f24
-#define UNITEXT_TIBETAN_DIGIT_FOUR  L"\u0f24"
+#define UNITEXT_TIBETAN_DIGIT_FOUR  U"\u0f24"
 #define UNICODE_TIBETAN_DIGIT_FIVE  0x0f25
-#define UNITEXT_TIBETAN_DIGIT_FIVE  L"\u0f25"
+#define UNITEXT_TIBETAN_DIGIT_FIVE  U"\u0f25"
 #define UNICODE_TIBETAN_DIGIT_SIX  0x0f26
-#define UNITEXT_TIBETAN_DIGIT_SIX  L"\u0f26"
+#define UNITEXT_TIBETAN_DIGIT_SIX  U"\u0f26"
 #define UNICODE_TIBETAN_DIGIT_SEVEN  0x0f27
-#define UNITEXT_TIBETAN_DIGIT_SEVEN  L"\u0f27"
+#define UNITEXT_TIBETAN_DIGIT_SEVEN  U"\u0f27"
 #define UNICODE_TIBETAN_DIGIT_EIGHT  0x0f28
-#define UNITEXT_TIBETAN_DIGIT_EIGHT  L"\u0f28"
+#define UNITEXT_TIBETAN_DIGIT_EIGHT  U"\u0f28"
 #define UNICODE_TIBETAN_DIGIT_NINE  0x0f29
-#define UNITEXT_TIBETAN_DIGIT_NINE  L"\u0f29"
+#define UNITEXT_TIBETAN_DIGIT_NINE  U"\u0f29"
 #define UNICODE_TIBETAN_DIGIT_HALF_ONE  0x0f2a
-#define UNITEXT_TIBETAN_DIGIT_HALF_ONE  L"\u0f2a"
+#define UNITEXT_TIBETAN_DIGIT_HALF_ONE  U"\u0f2a"
 #define UNICODE_TIBETAN_DIGIT_HALF_TWO  0x0f2b
-#define UNITEXT_TIBETAN_DIGIT_HALF_TWO  L"\u0f2b"
+#define UNITEXT_TIBETAN_DIGIT_HALF_TWO  U"\u0f2b"
 #define UNICODE_TIBETAN_DIGIT_HALF_THREE  0x0f2c
-#define UNITEXT_TIBETAN_DIGIT_HALF_THREE  L"\u0f2c"
+#define UNITEXT_TIBETAN_DIGIT_HALF_THREE  U"\u0f2c"
 #define UNICODE_TIBETAN_DIGIT_HALF_FOUR  0x0f2d
-#define UNITEXT_TIBETAN_DIGIT_HALF_FOUR  L"\u0f2d"
+#define UNITEXT_TIBETAN_DIGIT_HALF_FOUR  U"\u0f2d"
 #define UNICODE_TIBETAN_DIGIT_HALF_FIVE  0x0f2e
-#define UNITEXT_TIBETAN_DIGIT_HALF_FIVE  L"\u0f2e"
+#define UNITEXT_TIBETAN_DIGIT_HALF_FIVE  U"\u0f2e"
 #define UNICODE_TIBETAN_DIGIT_HALF_SIX  0x0f2f
-#define UNITEXT_TIBETAN_DIGIT_HALF_SIX  L"\u0f2f"
+#define UNITEXT_TIBETAN_DIGIT_HALF_SIX  U"\u0f2f"
 #define UNICODE_TIBETAN_DIGIT_HALF_SEVEN  0x0f30
-#define UNITEXT_TIBETAN_DIGIT_HALF_SEVEN  L"\u0f30"
+#define UNITEXT_TIBETAN_DIGIT_HALF_SEVEN  U"\u0f30"
 #define UNICODE_TIBETAN_DIGIT_HALF_EIGHT  0x0f31
-#define UNITEXT_TIBETAN_DIGIT_HALF_EIGHT  L"\u0f31"
+#define UNITEXT_TIBETAN_DIGIT_HALF_EIGHT  U"\u0f31"
 #define UNICODE_TIBETAN_DIGIT_HALF_NINE  0x0f32
-#define UNITEXT_TIBETAN_DIGIT_HALF_NINE  L"\u0f32"
+#define UNITEXT_TIBETAN_DIGIT_HALF_NINE  U"\u0f32"
 #define UNICODE_TIBETAN_DIGIT_HALF_ZERO  0x0f33
-#define UNITEXT_TIBETAN_DIGIT_HALF_ZERO  L"\u0f33"
+#define UNITEXT_TIBETAN_DIGIT_HALF_ZERO  U"\u0f33"
 #define UNICODE_TIBETAN_MARK_BSDUS_RTAGS  0x0f34
-#define UNITEXT_TIBETAN_MARK_BSDUS_RTAGS  L"\u0f34"
+#define UNITEXT_TIBETAN_MARK_BSDUS_RTAGS  U"\u0f34"
 #define UNICODE_TIBETAN_MARK_NGAS_BZUNG_NYI_ZLA  0x0f35
-#define UNITEXT_TIBETAN_MARK_NGAS_BZUNG_NYI_ZLA  L"\u0f35"
+#define UNITEXT_TIBETAN_MARK_NGAS_BZUNG_NYI_ZLA  U"\u0f35"
 #define UNICODE_TIBETAN_MARK_CARET__DZUD_RTAGS_BZHI_MIG_CAN  0x0f36
-#define UNITEXT_TIBETAN_MARK_CARET__DZUD_RTAGS_BZHI_MIG_CAN  L"\u0f36"
+#define UNITEXT_TIBETAN_MARK_CARET__DZUD_RTAGS_BZHI_MIG_CAN  U"\u0f36"
 #define UNICODE_TIBETAN_MARK_NGAS_BZUNG_SGOR_RTAGS  0x0f37
-#define UNITEXT_TIBETAN_MARK_NGAS_BZUNG_SGOR_RTAGS  L"\u0f37"
+#define UNITEXT_TIBETAN_MARK_NGAS_BZUNG_SGOR_RTAGS  U"\u0f37"
 #define UNICODE_TIBETAN_MARK_CHE_MGO  0x0f38
-#define UNITEXT_TIBETAN_MARK_CHE_MGO  L"\u0f38"
+#define UNITEXT_TIBETAN_MARK_CHE_MGO  U"\u0f38"
 #define UNICODE_TIBETAN_MARK_TSA__PHRU  0x0f39
-#define UNITEXT_TIBETAN_MARK_TSA__PHRU  L"\u0f39"
+#define UNITEXT_TIBETAN_MARK_TSA__PHRU  U"\u0f39"
 #define UNICODE_TIBETAN_MARK_GUG_RTAGS_GYON  0x0f3a
-#define UNITEXT_TIBETAN_MARK_GUG_RTAGS_GYON  L"\u0f3a"
+#define UNITEXT_TIBETAN_MARK_GUG_RTAGS_GYON  U"\u0f3a"
 #define UNICODE_TIBETAN_MARK_GUG_RTAGS_GYAS  0x0f3b
-#define UNITEXT_TIBETAN_MARK_GUG_RTAGS_GYAS  L"\u0f3b"
+#define UNITEXT_TIBETAN_MARK_GUG_RTAGS_GYAS  U"\u0f3b"
 #define UNICODE_TIBETAN_MARK_ANG_KHANG_GYON  0x0f3c
-#define UNITEXT_TIBETAN_MARK_ANG_KHANG_GYON  L"\u0f3c"
+#define UNITEXT_TIBETAN_MARK_ANG_KHANG_GYON  U"\u0f3c"
 #define UNICODE_TIBETAN_MARK_ANG_KHANG_GYAS  0x0f3d
-#define UNITEXT_TIBETAN_MARK_ANG_KHANG_GYAS  L"\u0f3d"
+#define UNITEXT_TIBETAN_MARK_ANG_KHANG_GYAS  U"\u0f3d"
 #define UNICODE_TIBETAN_SIGN_YAR_TSHES  0x0f3e
-#define UNITEXT_TIBETAN_SIGN_YAR_TSHES  L"\u0f3e"
+#define UNITEXT_TIBETAN_SIGN_YAR_TSHES  U"\u0f3e"
 #define UNICODE_TIBETAN_SIGN_MAR_TSHES  0x0f3f
-#define UNITEXT_TIBETAN_SIGN_MAR_TSHES  L"\u0f3f"
+#define UNITEXT_TIBETAN_SIGN_MAR_TSHES  U"\u0f3f"
 #define UNICODE_TIBETAN_LETTER_KA  0x0f40
-#define UNITEXT_TIBETAN_LETTER_KA  L"\u0f40"
+#define UNITEXT_TIBETAN_LETTER_KA  U"\u0f40"
 #define UNICODE_TIBETAN_LETTER_KHA  0x0f41
-#define UNITEXT_TIBETAN_LETTER_KHA  L"\u0f41"
+#define UNITEXT_TIBETAN_LETTER_KHA  U"\u0f41"
 #define UNICODE_TIBETAN_LETTER_GA  0x0f42
-#define UNITEXT_TIBETAN_LETTER_GA  L"\u0f42"
+#define UNITEXT_TIBETAN_LETTER_GA  U"\u0f42"
 #define UNICODE_TIBETAN_LETTER_GHA  0x0f43
-#define UNITEXT_TIBETAN_LETTER_GHA  L"\u0f43"
+#define UNITEXT_TIBETAN_LETTER_GHA  U"\u0f43"
 #define UNICODE_TIBETAN_LETTER_NGA  0x0f44
-#define UNITEXT_TIBETAN_LETTER_NGA  L"\u0f44"
+#define UNITEXT_TIBETAN_LETTER_NGA  U"\u0f44"
 #define UNICODE_TIBETAN_LETTER_CA  0x0f45
-#define UNITEXT_TIBETAN_LETTER_CA  L"\u0f45"
+#define UNITEXT_TIBETAN_LETTER_CA  U"\u0f45"
 #define UNICODE_TIBETAN_LETTER_CHA  0x0f46
-#define UNITEXT_TIBETAN_LETTER_CHA  L"\u0f46"
+#define UNITEXT_TIBETAN_LETTER_CHA  U"\u0f46"
 #define UNICODE_TIBETAN_LETTER_JA  0x0f47
-#define UNITEXT_TIBETAN_LETTER_JA  L"\u0f47"
+#define UNITEXT_TIBETAN_LETTER_JA  U"\u0f47"
 #define UNICODE_TIBETAN_LETTER_NYA  0x0f49
-#define UNITEXT_TIBETAN_LETTER_NYA  L"\u0f49"
+#define UNITEXT_TIBETAN_LETTER_NYA  U"\u0f49"
 #define UNICODE_TIBETAN_LETTER_TTA  0x0f4a
-#define UNITEXT_TIBETAN_LETTER_TTA  L"\u0f4a"
+#define UNITEXT_TIBETAN_LETTER_TTA  U"\u0f4a"
 #define UNICODE_TIBETAN_LETTER_TTHA  0x0f4b
-#define UNITEXT_TIBETAN_LETTER_TTHA  L"\u0f4b"
+#define UNITEXT_TIBETAN_LETTER_TTHA  U"\u0f4b"
 #define UNICODE_TIBETAN_LETTER_DDA  0x0f4c
-#define UNITEXT_TIBETAN_LETTER_DDA  L"\u0f4c"
+#define UNITEXT_TIBETAN_LETTER_DDA  U"\u0f4c"
 #define UNICODE_TIBETAN_LETTER_DDHA  0x0f4d
-#define UNITEXT_TIBETAN_LETTER_DDHA  L"\u0f4d"
+#define UNITEXT_TIBETAN_LETTER_DDHA  U"\u0f4d"
 #define UNICODE_TIBETAN_LETTER_NNA  0x0f4e
-#define UNITEXT_TIBETAN_LETTER_NNA  L"\u0f4e"
+#define UNITEXT_TIBETAN_LETTER_NNA  U"\u0f4e"
 #define UNICODE_TIBETAN_LETTER_TA  0x0f4f
-#define UNITEXT_TIBETAN_LETTER_TA  L"\u0f4f"
+#define UNITEXT_TIBETAN_LETTER_TA  U"\u0f4f"
 #define UNICODE_TIBETAN_LETTER_THA  0x0f50
-#define UNITEXT_TIBETAN_LETTER_THA  L"\u0f50"
+#define UNITEXT_TIBETAN_LETTER_THA  U"\u0f50"
 #define UNICODE_TIBETAN_LETTER_DA  0x0f51
-#define UNITEXT_TIBETAN_LETTER_DA  L"\u0f51"
+#define UNITEXT_TIBETAN_LETTER_DA  U"\u0f51"
 #define UNICODE_TIBETAN_LETTER_DHA  0x0f52
-#define UNITEXT_TIBETAN_LETTER_DHA  L"\u0f52"
+#define UNITEXT_TIBETAN_LETTER_DHA  U"\u0f52"
 #define UNICODE_TIBETAN_LETTER_NA  0x0f53
-#define UNITEXT_TIBETAN_LETTER_NA  L"\u0f53"
+#define UNITEXT_TIBETAN_LETTER_NA  U"\u0f53"
 #define UNICODE_TIBETAN_LETTER_PA  0x0f54
-#define UNITEXT_TIBETAN_LETTER_PA  L"\u0f54"
+#define UNITEXT_TIBETAN_LETTER_PA  U"\u0f54"
 #define UNICODE_TIBETAN_LETTER_PHA  0x0f55
-#define UNITEXT_TIBETAN_LETTER_PHA  L"\u0f55"
+#define UNITEXT_TIBETAN_LETTER_PHA  U"\u0f55"
 #define UNICODE_TIBETAN_LETTER_BA  0x0f56
-#define UNITEXT_TIBETAN_LETTER_BA  L"\u0f56"
+#define UNITEXT_TIBETAN_LETTER_BA  U"\u0f56"
 #define UNICODE_TIBETAN_LETTER_BHA  0x0f57
-#define UNITEXT_TIBETAN_LETTER_BHA  L"\u0f57"
+#define UNITEXT_TIBETAN_LETTER_BHA  U"\u0f57"
 #define UNICODE_TIBETAN_LETTER_MA  0x0f58
-#define UNITEXT_TIBETAN_LETTER_MA  L"\u0f58"
+#define UNITEXT_TIBETAN_LETTER_MA  U"\u0f58"
 #define UNICODE_TIBETAN_LETTER_TSA  0x0f59
-#define UNITEXT_TIBETAN_LETTER_TSA  L"\u0f59"
+#define UNITEXT_TIBETAN_LETTER_TSA  U"\u0f59"
 #define UNICODE_TIBETAN_LETTER_TSHA  0x0f5a
-#define UNITEXT_TIBETAN_LETTER_TSHA  L"\u0f5a"
+#define UNITEXT_TIBETAN_LETTER_TSHA  U"\u0f5a"
 #define UNICODE_TIBETAN_LETTER_DZA  0x0f5b
-#define UNITEXT_TIBETAN_LETTER_DZA  L"\u0f5b"
+#define UNITEXT_TIBETAN_LETTER_DZA  U"\u0f5b"
 #define UNICODE_TIBETAN_LETTER_DZHA  0x0f5c
-#define UNITEXT_TIBETAN_LETTER_DZHA  L"\u0f5c"
+#define UNITEXT_TIBETAN_LETTER_DZHA  U"\u0f5c"
 #define UNICODE_TIBETAN_LETTER_WA  0x0f5d
-#define UNITEXT_TIBETAN_LETTER_WA  L"\u0f5d"
+#define UNITEXT_TIBETAN_LETTER_WA  U"\u0f5d"
 #define UNICODE_TIBETAN_LETTER_ZHA  0x0f5e
-#define UNITEXT_TIBETAN_LETTER_ZHA  L"\u0f5e"
+#define UNITEXT_TIBETAN_LETTER_ZHA  U"\u0f5e"
 #define UNICODE_TIBETAN_LETTER_ZA  0x0f5f
-#define UNITEXT_TIBETAN_LETTER_ZA  L"\u0f5f"
+#define UNITEXT_TIBETAN_LETTER_ZA  U"\u0f5f"
 #define UNICODE_TIBETAN_LETTER__A  0x0f60
-#define UNITEXT_TIBETAN_LETTER__A  L"\u0f60"
+#define UNITEXT_TIBETAN_LETTER__A  U"\u0f60"
 #define UNICODE_TIBETAN_LETTER_YA  0x0f61
-#define UNITEXT_TIBETAN_LETTER_YA  L"\u0f61"
+#define UNITEXT_TIBETAN_LETTER_YA  U"\u0f61"
 #define UNICODE_TIBETAN_LETTER_RA  0x0f62
-#define UNITEXT_TIBETAN_LETTER_RA  L"\u0f62"
+#define UNITEXT_TIBETAN_LETTER_RA  U"\u0f62"
 #define UNICODE_TIBETAN_LETTER_LA  0x0f63
-#define UNITEXT_TIBETAN_LETTER_LA  L"\u0f63"
+#define UNITEXT_TIBETAN_LETTER_LA  U"\u0f63"
 #define UNICODE_TIBETAN_LETTER_SHA  0x0f64
-#define UNITEXT_TIBETAN_LETTER_SHA  L"\u0f64"
+#define UNITEXT_TIBETAN_LETTER_SHA  U"\u0f64"
 #define UNICODE_TIBETAN_LETTER_SSA  0x0f65
-#define UNITEXT_TIBETAN_LETTER_SSA  L"\u0f65"
+#define UNITEXT_TIBETAN_LETTER_SSA  U"\u0f65"
 #define UNICODE_TIBETAN_LETTER_SA  0x0f66
-#define UNITEXT_TIBETAN_LETTER_SA  L"\u0f66"
+#define UNITEXT_TIBETAN_LETTER_SA  U"\u0f66"
 #define UNICODE_TIBETAN_LETTER_HA  0x0f67
-#define UNITEXT_TIBETAN_LETTER_HA  L"\u0f67"
+#define UNITEXT_TIBETAN_LETTER_HA  U"\u0f67"
 #define UNICODE_TIBETAN_LETTER_A  0x0f68
-#define UNITEXT_TIBETAN_LETTER_A  L"\u0f68"
+#define UNITEXT_TIBETAN_LETTER_A  U"\u0f68"
 #define UNICODE_TIBETAN_LETTER_KSSA  0x0f69
-#define UNITEXT_TIBETAN_LETTER_KSSA  L"\u0f69"
+#define UNITEXT_TIBETAN_LETTER_KSSA  U"\u0f69"
 #define UNICODE_TIBETAN_LETTER_FIXED_FORM_RA  0x0f6a
-#define UNITEXT_TIBETAN_LETTER_FIXED_FORM_RA  L"\u0f6a"
+#define UNITEXT_TIBETAN_LETTER_FIXED_FORM_RA  U"\u0f6a"
 #define UNICODE_TIBETAN_VOWEL_SIGN_AA  0x0f71
-#define UNITEXT_TIBETAN_VOWEL_SIGN_AA  L"\u0f71"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_AA  U"\u0f71"
 #define UNICODE_TIBETAN_VOWEL_SIGN_I  0x0f72
-#define UNITEXT_TIBETAN_VOWEL_SIGN_I  L"\u0f72"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_I  U"\u0f72"
 #define UNICODE_TIBETAN_VOWEL_SIGN_II  0x0f73
-#define UNITEXT_TIBETAN_VOWEL_SIGN_II  L"\u0f73"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_II  U"\u0f73"
 #define UNICODE_TIBETAN_VOWEL_SIGN_U  0x0f74
-#define UNITEXT_TIBETAN_VOWEL_SIGN_U  L"\u0f74"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_U  U"\u0f74"
 #define UNICODE_TIBETAN_VOWEL_SIGN_UU  0x0f75
-#define UNITEXT_TIBETAN_VOWEL_SIGN_UU  L"\u0f75"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_UU  U"\u0f75"
 #define UNICODE_TIBETAN_VOWEL_SIGN_VOCALIC_R  0x0f76
-#define UNITEXT_TIBETAN_VOWEL_SIGN_VOCALIC_R  L"\u0f76"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_VOCALIC_R  U"\u0f76"
 #define UNICODE_TIBETAN_VOWEL_SIGN_VOCALIC_RR  0x0f77
-#define UNITEXT_TIBETAN_VOWEL_SIGN_VOCALIC_RR  L"\u0f77"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_VOCALIC_RR  U"\u0f77"
 #define UNICODE_TIBETAN_VOWEL_SIGN_VOCALIC_L  0x0f78
-#define UNITEXT_TIBETAN_VOWEL_SIGN_VOCALIC_L  L"\u0f78"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_VOCALIC_L  U"\u0f78"
 #define UNICODE_TIBETAN_VOWEL_SIGN_VOCALIC_LL  0x0f79
-#define UNITEXT_TIBETAN_VOWEL_SIGN_VOCALIC_LL  L"\u0f79"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_VOCALIC_LL  U"\u0f79"
 #define UNICODE_TIBETAN_VOWEL_SIGN_E  0x0f7a
-#define UNITEXT_TIBETAN_VOWEL_SIGN_E  L"\u0f7a"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_E  U"\u0f7a"
 #define UNICODE_TIBETAN_VOWEL_SIGN_EE  0x0f7b
-#define UNITEXT_TIBETAN_VOWEL_SIGN_EE  L"\u0f7b"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_EE  U"\u0f7b"
 #define UNICODE_TIBETAN_VOWEL_SIGN_O  0x0f7c
-#define UNITEXT_TIBETAN_VOWEL_SIGN_O  L"\u0f7c"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_O  U"\u0f7c"
 #define UNICODE_TIBETAN_VOWEL_SIGN_OO  0x0f7d
-#define UNITEXT_TIBETAN_VOWEL_SIGN_OO  L"\u0f7d"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_OO  U"\u0f7d"
 #define UNICODE_TIBETAN_SIGN_RJES_SU_NGA_RO  0x0f7e
-#define UNITEXT_TIBETAN_SIGN_RJES_SU_NGA_RO  L"\u0f7e"
+#define UNITEXT_TIBETAN_SIGN_RJES_SU_NGA_RO  U"\u0f7e"
 #define UNICODE_TIBETAN_SIGN_RNAM_BCAD  0x0f7f
-#define UNITEXT_TIBETAN_SIGN_RNAM_BCAD  L"\u0f7f"
+#define UNITEXT_TIBETAN_SIGN_RNAM_BCAD  U"\u0f7f"
 #define UNICODE_TIBETAN_VOWEL_SIGN_REVERSED_I  0x0f80
-#define UNITEXT_TIBETAN_VOWEL_SIGN_REVERSED_I  L"\u0f80"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_REVERSED_I  U"\u0f80"
 #define UNICODE_TIBETAN_VOWEL_SIGN_REVERSED_II  0x0f81
-#define UNITEXT_TIBETAN_VOWEL_SIGN_REVERSED_II  L"\u0f81"
+#define UNITEXT_TIBETAN_VOWEL_SIGN_REVERSED_II  U"\u0f81"
 #define UNICODE_TIBETAN_SIGN_NYI_ZLA_NAA_DA  0x0f82
-#define UNITEXT_TIBETAN_SIGN_NYI_ZLA_NAA_DA  L"\u0f82"
+#define UNITEXT_TIBETAN_SIGN_NYI_ZLA_NAA_DA  U"\u0f82"
 #define UNICODE_TIBETAN_SIGN_SNA_LDAN  0x0f83
-#define UNITEXT_TIBETAN_SIGN_SNA_LDAN  L"\u0f83"
+#define UNITEXT_TIBETAN_SIGN_SNA_LDAN  U"\u0f83"
 #define UNICODE_TIBETAN_MARK_HALANTA  0x0f84
-#define UNITEXT_TIBETAN_MARK_HALANTA  L"\u0f84"
+#define UNITEXT_TIBETAN_MARK_HALANTA  U"\u0f84"
 #define UNICODE_TIBETAN_MARK_PALUTA  0x0f85
-#define UNITEXT_TIBETAN_MARK_PALUTA  L"\u0f85"
+#define UNITEXT_TIBETAN_MARK_PALUTA  U"\u0f85"
 #define UNICODE_TIBETAN_SIGN_LCI_RTAGS  0x0f86
-#define UNITEXT_TIBETAN_SIGN_LCI_RTAGS  L"\u0f86"
+#define UNITEXT_TIBETAN_SIGN_LCI_RTAGS  U"\u0f86"
 #define UNICODE_TIBETAN_SIGN_YANG_RTAGS  0x0f87
-#define UNITEXT_TIBETAN_SIGN_YANG_RTAGS  L"\u0f87"
+#define UNITEXT_TIBETAN_SIGN_YANG_RTAGS  U"\u0f87"
 #define UNICODE_TIBETAN_SIGN_LCE_TSA_CAN  0x0f88
-#define UNITEXT_TIBETAN_SIGN_LCE_TSA_CAN  L"\u0f88"
+#define UNITEXT_TIBETAN_SIGN_LCE_TSA_CAN  U"\u0f88"
 #define UNICODE_TIBETAN_SIGN_MCHU_CAN  0x0f89
-#define UNITEXT_TIBETAN_SIGN_MCHU_CAN  L"\u0f89"
+#define UNITEXT_TIBETAN_SIGN_MCHU_CAN  U"\u0f89"
 #define UNICODE_TIBETAN_SIGN_GRU_CAN_RGYINGS  0x0f8a
-#define UNITEXT_TIBETAN_SIGN_GRU_CAN_RGYINGS  L"\u0f8a"
+#define UNITEXT_TIBETAN_SIGN_GRU_CAN_RGYINGS  U"\u0f8a"
 #define UNICODE_TIBETAN_SIGN_GRU_MED_RGYINGS  0x0f8b
-#define UNITEXT_TIBETAN_SIGN_GRU_MED_RGYINGS  L"\u0f8b"
+#define UNITEXT_TIBETAN_SIGN_GRU_MED_RGYINGS  U"\u0f8b"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_KA  0x0f90
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_KA  L"\u0f90"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_KA  U"\u0f90"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_KHA  0x0f91
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_KHA  L"\u0f91"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_KHA  U"\u0f91"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_GA  0x0f92
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_GA  L"\u0f92"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_GA  U"\u0f92"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_GHA  0x0f93
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_GHA  L"\u0f93"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_GHA  U"\u0f93"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_NGA  0x0f94
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_NGA  L"\u0f94"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_NGA  U"\u0f94"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_CA  0x0f95
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_CA  L"\u0f95"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_CA  U"\u0f95"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_CHA  0x0f96
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_CHA  L"\u0f96"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_CHA  U"\u0f96"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_JA  0x0f97
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_JA  L"\u0f97"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_JA  U"\u0f97"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_NYA  0x0f99
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_NYA  L"\u0f99"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_NYA  U"\u0f99"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_TTA  0x0f9a
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_TTA  L"\u0f9a"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_TTA  U"\u0f9a"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_TTHA  0x0f9b
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_TTHA  L"\u0f9b"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_TTHA  U"\u0f9b"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_DDA  0x0f9c
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DDA  L"\u0f9c"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DDA  U"\u0f9c"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_DDHA  0x0f9d
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DDHA  L"\u0f9d"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DDHA  U"\u0f9d"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_NNA  0x0f9e
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_NNA  L"\u0f9e"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_NNA  U"\u0f9e"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_TA  0x0f9f
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_TA  L"\u0f9f"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_TA  U"\u0f9f"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_THA  0x0fa0
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_THA  L"\u0fa0"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_THA  U"\u0fa0"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_DA  0x0fa1
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DA  L"\u0fa1"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DA  U"\u0fa1"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_DHA  0x0fa2
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DHA  L"\u0fa2"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DHA  U"\u0fa2"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_NA  0x0fa3
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_NA  L"\u0fa3"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_NA  U"\u0fa3"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_PA  0x0fa4
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_PA  L"\u0fa4"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_PA  U"\u0fa4"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_PHA  0x0fa5
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_PHA  L"\u0fa5"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_PHA  U"\u0fa5"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_BA  0x0fa6
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_BA  L"\u0fa6"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_BA  U"\u0fa6"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_BHA  0x0fa7
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_BHA  L"\u0fa7"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_BHA  U"\u0fa7"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_MA  0x0fa8
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_MA  L"\u0fa8"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_MA  U"\u0fa8"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_TSA  0x0fa9
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_TSA  L"\u0fa9"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_TSA  U"\u0fa9"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_TSHA  0x0faa
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_TSHA  L"\u0faa"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_TSHA  U"\u0faa"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_DZA  0x0fab
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DZA  L"\u0fab"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DZA  U"\u0fab"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_DZHA  0x0fac
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DZHA  L"\u0fac"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_DZHA  U"\u0fac"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_WA  0x0fad
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_WA  L"\u0fad"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_WA  U"\u0fad"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_ZHA  0x0fae
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_ZHA  L"\u0fae"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_ZHA  U"\u0fae"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_ZA  0x0faf
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_ZA  L"\u0faf"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_ZA  U"\u0faf"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER__A  0x0fb0
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER__A  L"\u0fb0"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER__A  U"\u0fb0"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_YA  0x0fb1
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_YA  L"\u0fb1"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_YA  U"\u0fb1"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_RA  0x0fb2
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_RA  L"\u0fb2"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_RA  U"\u0fb2"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_LA  0x0fb3
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_LA  L"\u0fb3"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_LA  U"\u0fb3"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_SHA  0x0fb4
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_SHA  L"\u0fb4"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_SHA  U"\u0fb4"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_SSA  0x0fb5
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_SSA  L"\u0fb5"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_SSA  U"\u0fb5"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_SA  0x0fb6
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_SA  L"\u0fb6"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_SA  U"\u0fb6"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_HA  0x0fb7
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_HA  L"\u0fb7"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_HA  U"\u0fb7"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_A  0x0fb8
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_A  L"\u0fb8"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_A  U"\u0fb8"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_KSSA  0x0fb9
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_KSSA  L"\u0fb9"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_KSSA  U"\u0fb9"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_FIXED_FORM_WA  0x0fba
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_FIXED_FORM_WA  L"\u0fba"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_FIXED_FORM_WA  U"\u0fba"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_FIXED_FORM_YA  0x0fbb
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_FIXED_FORM_YA  L"\u0fbb"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_FIXED_FORM_YA  U"\u0fbb"
 #define UNICODE_TIBETAN_SUBJOINED_LETTER_FIXED_FORM_RA  0x0fbc
-#define UNITEXT_TIBETAN_SUBJOINED_LETTER_FIXED_FORM_RA  L"\u0fbc"
+#define UNITEXT_TIBETAN_SUBJOINED_LETTER_FIXED_FORM_RA  U"\u0fbc"
 #define UNICODE_TIBETAN_KU_RU_KHA  0x0fbe
-#define UNITEXT_TIBETAN_KU_RU_KHA  L"\u0fbe"
+#define UNITEXT_TIBETAN_KU_RU_KHA  U"\u0fbe"
 #define UNICODE_TIBETAN_KU_RU_KHA_BZHI_MIG_CAN  0x0fbf
-#define UNITEXT_TIBETAN_KU_RU_KHA_BZHI_MIG_CAN  L"\u0fbf"
+#define UNITEXT_TIBETAN_KU_RU_KHA_BZHI_MIG_CAN  U"\u0fbf"
 #define UNICODE_TIBETAN_CANTILLATION_SIGN_HEAVY_BEAT  0x0fc0
-#define UNITEXT_TIBETAN_CANTILLATION_SIGN_HEAVY_BEAT  L"\u0fc0"
+#define UNITEXT_TIBETAN_CANTILLATION_SIGN_HEAVY_BEAT  U"\u0fc0"
 #define UNICODE_TIBETAN_CANTILLATION_SIGN_LIGHT_BEAT  0x0fc1
-#define UNITEXT_TIBETAN_CANTILLATION_SIGN_LIGHT_BEAT  L"\u0fc1"
+#define UNITEXT_TIBETAN_CANTILLATION_SIGN_LIGHT_BEAT  U"\u0fc1"
 #define UNICODE_TIBETAN_CANTILLATION_SIGN_CANG_TE_U  0x0fc2
-#define UNITEXT_TIBETAN_CANTILLATION_SIGN_CANG_TE_U  L"\u0fc2"
+#define UNITEXT_TIBETAN_CANTILLATION_SIGN_CANG_TE_U  U"\u0fc2"
 #define UNICODE_TIBETAN_CANTILLATION_SIGN_SBUB__CHAL  0x0fc3
-#define UNITEXT_TIBETAN_CANTILLATION_SIGN_SBUB__CHAL  L"\u0fc3"
+#define UNITEXT_TIBETAN_CANTILLATION_SIGN_SBUB__CHAL  U"\u0fc3"
 #define UNICODE_TIBETAN_SYMBOL_DRIL_BU  0x0fc4
-#define UNITEXT_TIBETAN_SYMBOL_DRIL_BU  L"\u0fc4"
+#define UNITEXT_TIBETAN_SYMBOL_DRIL_BU  U"\u0fc4"
 #define UNICODE_TIBETAN_SYMBOL_RDO_RJE  0x0fc5
-#define UNITEXT_TIBETAN_SYMBOL_RDO_RJE  L"\u0fc5"
+#define UNITEXT_TIBETAN_SYMBOL_RDO_RJE  U"\u0fc5"
 #define UNICODE_TIBETAN_SYMBOL_PADMA_GDAN  0x0fc6
-#define UNITEXT_TIBETAN_SYMBOL_PADMA_GDAN  L"\u0fc6"
+#define UNITEXT_TIBETAN_SYMBOL_PADMA_GDAN  U"\u0fc6"
 #define UNICODE_TIBETAN_SYMBOL_RDO_RJE_RGYA_GRAM  0x0fc7
-#define UNITEXT_TIBETAN_SYMBOL_RDO_RJE_RGYA_GRAM  L"\u0fc7"
+#define UNITEXT_TIBETAN_SYMBOL_RDO_RJE_RGYA_GRAM  U"\u0fc7"
 #define UNICODE_TIBETAN_SYMBOL_PHUR_PA  0x0fc8
-#define UNITEXT_TIBETAN_SYMBOL_PHUR_PA  L"\u0fc8"
+#define UNITEXT_TIBETAN_SYMBOL_PHUR_PA  U"\u0fc8"
 #define UNICODE_TIBETAN_SYMBOL_NOR_BU  0x0fc9
-#define UNITEXT_TIBETAN_SYMBOL_NOR_BU  L"\u0fc9"
+#define UNITEXT_TIBETAN_SYMBOL_NOR_BU  U"\u0fc9"
 #define UNICODE_TIBETAN_SYMBOL_NOR_BU_NYIS__KHYIL  0x0fca
-#define UNITEXT_TIBETAN_SYMBOL_NOR_BU_NYIS__KHYIL  L"\u0fca"
+#define UNITEXT_TIBETAN_SYMBOL_NOR_BU_NYIS__KHYIL  U"\u0fca"
 #define UNICODE_TIBETAN_SYMBOL_NOR_BU_GSUM__KHYIL  0x0fcb
-#define UNITEXT_TIBETAN_SYMBOL_NOR_BU_GSUM__KHYIL  L"\u0fcb"
+#define UNITEXT_TIBETAN_SYMBOL_NOR_BU_GSUM__KHYIL  U"\u0fcb"
 #define UNICODE_TIBETAN_SYMBOL_NOR_BU_BZHI__KHYIL  0x0fcc
-#define UNITEXT_TIBETAN_SYMBOL_NOR_BU_BZHI__KHYIL  L"\u0fcc"
+#define UNITEXT_TIBETAN_SYMBOL_NOR_BU_BZHI__KHYIL  U"\u0fcc"
 #define UNICODE_TIBETAN_SIGN_RDEL_NAG_GSUM  0x0fcf
-#define UNITEXT_TIBETAN_SIGN_RDEL_NAG_GSUM  L"\u0fcf"
+#define UNITEXT_TIBETAN_SIGN_RDEL_NAG_GSUM  U"\u0fcf"
 #define UNICODE_TIBETAN_MARK_BSKA__SHOG_GI_MGO_RGYAN  0x0fd0
-#define UNITEXT_TIBETAN_MARK_BSKA__SHOG_GI_MGO_RGYAN  L"\u0fd0"
+#define UNITEXT_TIBETAN_MARK_BSKA__SHOG_GI_MGO_RGYAN  U"\u0fd0"
 #define UNICODE_TIBETAN_MARK_MNYAM_YIG_GI_MGO_RGYAN  0x0fd1
-#define UNITEXT_TIBETAN_MARK_MNYAM_YIG_GI_MGO_RGYAN  L"\u0fd1"
+#define UNITEXT_TIBETAN_MARK_MNYAM_YIG_GI_MGO_RGYAN  U"\u0fd1"
 #define UNICODE_MYANMAR_LETTER_KA  0x1000
-#define UNITEXT_MYANMAR_LETTER_KA  L"\u1000"
+#define UNITEXT_MYANMAR_LETTER_KA  U"\u1000"
 #define UNICODE_MYANMAR_LETTER_KHA  0x1001
-#define UNITEXT_MYANMAR_LETTER_KHA  L"\u1001"
+#define UNITEXT_MYANMAR_LETTER_KHA  U"\u1001"
 #define UNICODE_MYANMAR_LETTER_GA  0x1002
-#define UNITEXT_MYANMAR_LETTER_GA  L"\u1002"
+#define UNITEXT_MYANMAR_LETTER_GA  U"\u1002"
 #define UNICODE_MYANMAR_LETTER_GHA  0x1003
-#define UNITEXT_MYANMAR_LETTER_GHA  L"\u1003"
+#define UNITEXT_MYANMAR_LETTER_GHA  U"\u1003"
 #define UNICODE_MYANMAR_LETTER_NGA  0x1004
-#define UNITEXT_MYANMAR_LETTER_NGA  L"\u1004"
+#define UNITEXT_MYANMAR_LETTER_NGA  U"\u1004"
 #define UNICODE_MYANMAR_LETTER_CA  0x1005
-#define UNITEXT_MYANMAR_LETTER_CA  L"\u1005"
+#define UNITEXT_MYANMAR_LETTER_CA  U"\u1005"
 #define UNICODE_MYANMAR_LETTER_CHA  0x1006
-#define UNITEXT_MYANMAR_LETTER_CHA  L"\u1006"
+#define UNITEXT_MYANMAR_LETTER_CHA  U"\u1006"
 #define UNICODE_MYANMAR_LETTER_JA  0x1007
-#define UNITEXT_MYANMAR_LETTER_JA  L"\u1007"
+#define UNITEXT_MYANMAR_LETTER_JA  U"\u1007"
 #define UNICODE_MYANMAR_LETTER_JHA  0x1008
-#define UNITEXT_MYANMAR_LETTER_JHA  L"\u1008"
+#define UNITEXT_MYANMAR_LETTER_JHA  U"\u1008"
 #define UNICODE_MYANMAR_LETTER_NYA  0x1009
-#define UNITEXT_MYANMAR_LETTER_NYA  L"\u1009"
+#define UNITEXT_MYANMAR_LETTER_NYA  U"\u1009"
 #define UNICODE_MYANMAR_LETTER_NNYA  0x100a
-#define UNITEXT_MYANMAR_LETTER_NNYA  L"\u100a"
+#define UNITEXT_MYANMAR_LETTER_NNYA  U"\u100a"
 #define UNICODE_MYANMAR_LETTER_TTA  0x100b
-#define UNITEXT_MYANMAR_LETTER_TTA  L"\u100b"
+#define UNITEXT_MYANMAR_LETTER_TTA  U"\u100b"
 #define UNICODE_MYANMAR_LETTER_TTHA  0x100c
-#define UNITEXT_MYANMAR_LETTER_TTHA  L"\u100c"
+#define UNITEXT_MYANMAR_LETTER_TTHA  U"\u100c"
 #define UNICODE_MYANMAR_LETTER_DDA  0x100d
-#define UNITEXT_MYANMAR_LETTER_DDA  L"\u100d"
+#define UNITEXT_MYANMAR_LETTER_DDA  U"\u100d"
 #define UNICODE_MYANMAR_LETTER_DDHA  0x100e
-#define UNITEXT_MYANMAR_LETTER_DDHA  L"\u100e"
+#define UNITEXT_MYANMAR_LETTER_DDHA  U"\u100e"
 #define UNICODE_MYANMAR_LETTER_NNA  0x100f
-#define UNITEXT_MYANMAR_LETTER_NNA  L"\u100f"
+#define UNITEXT_MYANMAR_LETTER_NNA  U"\u100f"
 #define UNICODE_MYANMAR_LETTER_TA  0x1010
-#define UNITEXT_MYANMAR_LETTER_TA  L"\u1010"
+#define UNITEXT_MYANMAR_LETTER_TA  U"\u1010"
 #define UNICODE_MYANMAR_LETTER_THA  0x1011
-#define UNITEXT_MYANMAR_LETTER_THA  L"\u1011"
+#define UNITEXT_MYANMAR_LETTER_THA  U"\u1011"
 #define UNICODE_MYANMAR_LETTER_DA  0x1012
-#define UNITEXT_MYANMAR_LETTER_DA  L"\u1012"
+#define UNITEXT_MYANMAR_LETTER_DA  U"\u1012"
 #define UNICODE_MYANMAR_LETTER_DHA  0x1013
-#define UNITEXT_MYANMAR_LETTER_DHA  L"\u1013"
+#define UNITEXT_MYANMAR_LETTER_DHA  U"\u1013"
 #define UNICODE_MYANMAR_LETTER_NA  0x1014
-#define UNITEXT_MYANMAR_LETTER_NA  L"\u1014"
+#define UNITEXT_MYANMAR_LETTER_NA  U"\u1014"
 #define UNICODE_MYANMAR_LETTER_PA  0x1015
-#define UNITEXT_MYANMAR_LETTER_PA  L"\u1015"
+#define UNITEXT_MYANMAR_LETTER_PA  U"\u1015"
 #define UNICODE_MYANMAR_LETTER_PHA  0x1016
-#define UNITEXT_MYANMAR_LETTER_PHA  L"\u1016"
+#define UNITEXT_MYANMAR_LETTER_PHA  U"\u1016"
 #define UNICODE_MYANMAR_LETTER_BA  0x1017
-#define UNITEXT_MYANMAR_LETTER_BA  L"\u1017"
+#define UNITEXT_MYANMAR_LETTER_BA  U"\u1017"
 #define UNICODE_MYANMAR_LETTER_BHA  0x1018
-#define UNITEXT_MYANMAR_LETTER_BHA  L"\u1018"
+#define UNITEXT_MYANMAR_LETTER_BHA  U"\u1018"
 #define UNICODE_MYANMAR_LETTER_MA  0x1019
-#define UNITEXT_MYANMAR_LETTER_MA  L"\u1019"
+#define UNITEXT_MYANMAR_LETTER_MA  U"\u1019"
 #define UNICODE_MYANMAR_LETTER_YA  0x101a
-#define UNITEXT_MYANMAR_LETTER_YA  L"\u101a"
+#define UNITEXT_MYANMAR_LETTER_YA  U"\u101a"
 #define UNICODE_MYANMAR_LETTER_RA  0x101b
-#define UNITEXT_MYANMAR_LETTER_RA  L"\u101b"
+#define UNITEXT_MYANMAR_LETTER_RA  U"\u101b"
 #define UNICODE_MYANMAR_LETTER_LA  0x101c
-#define UNITEXT_MYANMAR_LETTER_LA  L"\u101c"
+#define UNITEXT_MYANMAR_LETTER_LA  U"\u101c"
 #define UNICODE_MYANMAR_LETTER_WA  0x101d
-#define UNITEXT_MYANMAR_LETTER_WA  L"\u101d"
+#define UNITEXT_MYANMAR_LETTER_WA  U"\u101d"
 #define UNICODE_MYANMAR_LETTER_SA  0x101e
-#define UNITEXT_MYANMAR_LETTER_SA  L"\u101e"
+#define UNITEXT_MYANMAR_LETTER_SA  U"\u101e"
 #define UNICODE_MYANMAR_LETTER_HA  0x101f
-#define UNITEXT_MYANMAR_LETTER_HA  L"\u101f"
+#define UNITEXT_MYANMAR_LETTER_HA  U"\u101f"
 #define UNICODE_MYANMAR_LETTER_LLA  0x1020
-#define UNITEXT_MYANMAR_LETTER_LLA  L"\u1020"
+#define UNITEXT_MYANMAR_LETTER_LLA  U"\u1020"
 #define UNICODE_MYANMAR_LETTER_A  0x1021
-#define UNITEXT_MYANMAR_LETTER_A  L"\u1021"
+#define UNITEXT_MYANMAR_LETTER_A  U"\u1021"
 #define UNICODE_MYANMAR_LETTER_I  0x1023
-#define UNITEXT_MYANMAR_LETTER_I  L"\u1023"
+#define UNITEXT_MYANMAR_LETTER_I  U"\u1023"
 #define UNICODE_MYANMAR_LETTER_II  0x1024
-#define UNITEXT_MYANMAR_LETTER_II  L"\u1024"
+#define UNITEXT_MYANMAR_LETTER_II  U"\u1024"
 #define UNICODE_MYANMAR_LETTER_U  0x1025
-#define UNITEXT_MYANMAR_LETTER_U  L"\u1025"
+#define UNITEXT_MYANMAR_LETTER_U  U"\u1025"
 #define UNICODE_MYANMAR_LETTER_UU  0x1026
-#define UNITEXT_MYANMAR_LETTER_UU  L"\u1026"
+#define UNITEXT_MYANMAR_LETTER_UU  U"\u1026"
 #define UNICODE_MYANMAR_LETTER_E  0x1027
-#define UNITEXT_MYANMAR_LETTER_E  L"\u1027"
+#define UNITEXT_MYANMAR_LETTER_E  U"\u1027"
 #define UNICODE_MYANMAR_LETTER_O  0x1029
-#define UNITEXT_MYANMAR_LETTER_O  L"\u1029"
+#define UNITEXT_MYANMAR_LETTER_O  U"\u1029"
 #define UNICODE_MYANMAR_LETTER_AU  0x102a
-#define UNITEXT_MYANMAR_LETTER_AU  L"\u102a"
+#define UNITEXT_MYANMAR_LETTER_AU  U"\u102a"
 #define UNICODE_MYANMAR_VOWEL_SIGN_AA  0x102c
-#define UNITEXT_MYANMAR_VOWEL_SIGN_AA  L"\u102c"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_AA  U"\u102c"
 #define UNICODE_MYANMAR_VOWEL_SIGN_I  0x102d
-#define UNITEXT_MYANMAR_VOWEL_SIGN_I  L"\u102d"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_I  U"\u102d"
 #define UNICODE_MYANMAR_VOWEL_SIGN_II  0x102e
-#define UNITEXT_MYANMAR_VOWEL_SIGN_II  L"\u102e"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_II  U"\u102e"
 #define UNICODE_MYANMAR_VOWEL_SIGN_U  0x102f
-#define UNITEXT_MYANMAR_VOWEL_SIGN_U  L"\u102f"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_U  U"\u102f"
 #define UNICODE_MYANMAR_VOWEL_SIGN_UU  0x1030
-#define UNITEXT_MYANMAR_VOWEL_SIGN_UU  L"\u1030"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_UU  U"\u1030"
 #define UNICODE_MYANMAR_VOWEL_SIGN_E  0x1031
-#define UNITEXT_MYANMAR_VOWEL_SIGN_E  L"\u1031"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_E  U"\u1031"
 #define UNICODE_MYANMAR_VOWEL_SIGN_AI  0x1032
-#define UNITEXT_MYANMAR_VOWEL_SIGN_AI  L"\u1032"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_AI  U"\u1032"
 #define UNICODE_MYANMAR_SIGN_ANUSVARA  0x1036
-#define UNITEXT_MYANMAR_SIGN_ANUSVARA  L"\u1036"
+#define UNITEXT_MYANMAR_SIGN_ANUSVARA  U"\u1036"
 #define UNICODE_MYANMAR_SIGN_DOT_BELOW  0x1037
-#define UNITEXT_MYANMAR_SIGN_DOT_BELOW  L"\u1037"
+#define UNITEXT_MYANMAR_SIGN_DOT_BELOW  U"\u1037"
 #define UNICODE_MYANMAR_SIGN_VISARGA  0x1038
-#define UNITEXT_MYANMAR_SIGN_VISARGA  L"\u1038"
+#define UNITEXT_MYANMAR_SIGN_VISARGA  U"\u1038"
 #define UNICODE_MYANMAR_SIGN_VIRAMA  0x1039
-#define UNITEXT_MYANMAR_SIGN_VIRAMA  L"\u1039"
+#define UNITEXT_MYANMAR_SIGN_VIRAMA  U"\u1039"
 #define UNICODE_MYANMAR_DIGIT_ZERO  0x1040
-#define UNITEXT_MYANMAR_DIGIT_ZERO  L"\u1040"
+#define UNITEXT_MYANMAR_DIGIT_ZERO  U"\u1040"
 #define UNICODE_MYANMAR_DIGIT_ONE  0x1041
-#define UNITEXT_MYANMAR_DIGIT_ONE  L"\u1041"
+#define UNITEXT_MYANMAR_DIGIT_ONE  U"\u1041"
 #define UNICODE_MYANMAR_DIGIT_TWO  0x1042
-#define UNITEXT_MYANMAR_DIGIT_TWO  L"\u1042"
+#define UNITEXT_MYANMAR_DIGIT_TWO  U"\u1042"
 #define UNICODE_MYANMAR_DIGIT_THREE  0x1043
-#define UNITEXT_MYANMAR_DIGIT_THREE  L"\u1043"
+#define UNITEXT_MYANMAR_DIGIT_THREE  U"\u1043"
 #define UNICODE_MYANMAR_DIGIT_FOUR  0x1044
-#define UNITEXT_MYANMAR_DIGIT_FOUR  L"\u1044"
+#define UNITEXT_MYANMAR_DIGIT_FOUR  U"\u1044"
 #define UNICODE_MYANMAR_DIGIT_FIVE  0x1045
-#define UNITEXT_MYANMAR_DIGIT_FIVE  L"\u1045"
+#define UNITEXT_MYANMAR_DIGIT_FIVE  U"\u1045"
 #define UNICODE_MYANMAR_DIGIT_SIX  0x1046
-#define UNITEXT_MYANMAR_DIGIT_SIX  L"\u1046"
+#define UNITEXT_MYANMAR_DIGIT_SIX  U"\u1046"
 #define UNICODE_MYANMAR_DIGIT_SEVEN  0x1047
-#define UNITEXT_MYANMAR_DIGIT_SEVEN  L"\u1047"
+#define UNITEXT_MYANMAR_DIGIT_SEVEN  U"\u1047"
 #define UNICODE_MYANMAR_DIGIT_EIGHT  0x1048
-#define UNITEXT_MYANMAR_DIGIT_EIGHT  L"\u1048"
+#define UNITEXT_MYANMAR_DIGIT_EIGHT  U"\u1048"
 #define UNICODE_MYANMAR_DIGIT_NINE  0x1049
-#define UNITEXT_MYANMAR_DIGIT_NINE  L"\u1049"
+#define UNITEXT_MYANMAR_DIGIT_NINE  U"\u1049"
 #define UNICODE_MYANMAR_SIGN_LITTLE_SECTION  0x104a
-#define UNITEXT_MYANMAR_SIGN_LITTLE_SECTION  L"\u104a"
+#define UNITEXT_MYANMAR_SIGN_LITTLE_SECTION  U"\u104a"
 #define UNICODE_MYANMAR_SIGN_SECTION  0x104b
-#define UNITEXT_MYANMAR_SIGN_SECTION  L"\u104b"
+#define UNITEXT_MYANMAR_SIGN_SECTION  U"\u104b"
 #define UNICODE_MYANMAR_SYMBOL_LOCATIVE  0x104c
-#define UNITEXT_MYANMAR_SYMBOL_LOCATIVE  L"\u104c"
+#define UNITEXT_MYANMAR_SYMBOL_LOCATIVE  U"\u104c"
 #define UNICODE_MYANMAR_SYMBOL_COMPLETED  0x104d
-#define UNITEXT_MYANMAR_SYMBOL_COMPLETED  L"\u104d"
+#define UNITEXT_MYANMAR_SYMBOL_COMPLETED  U"\u104d"
 #define UNICODE_MYANMAR_SYMBOL_AFOREMENTIONED  0x104e
-#define UNITEXT_MYANMAR_SYMBOL_AFOREMENTIONED  L"\u104e"
+#define UNITEXT_MYANMAR_SYMBOL_AFOREMENTIONED  U"\u104e"
 #define UNICODE_MYANMAR_SYMBOL_GENITIVE  0x104f
-#define UNITEXT_MYANMAR_SYMBOL_GENITIVE  L"\u104f"
+#define UNITEXT_MYANMAR_SYMBOL_GENITIVE  U"\u104f"
 #define UNICODE_MYANMAR_LETTER_SHA  0x1050
-#define UNITEXT_MYANMAR_LETTER_SHA  L"\u1050"
+#define UNITEXT_MYANMAR_LETTER_SHA  U"\u1050"
 #define UNICODE_MYANMAR_LETTER_SSA  0x1051
-#define UNITEXT_MYANMAR_LETTER_SSA  L"\u1051"
+#define UNITEXT_MYANMAR_LETTER_SSA  U"\u1051"
 #define UNICODE_MYANMAR_LETTER_VOCALIC_R  0x1052
-#define UNITEXT_MYANMAR_LETTER_VOCALIC_R  L"\u1052"
+#define UNITEXT_MYANMAR_LETTER_VOCALIC_R  U"\u1052"
 #define UNICODE_MYANMAR_LETTER_VOCALIC_RR  0x1053
-#define UNITEXT_MYANMAR_LETTER_VOCALIC_RR  L"\u1053"
+#define UNITEXT_MYANMAR_LETTER_VOCALIC_RR  U"\u1053"
 #define UNICODE_MYANMAR_LETTER_VOCALIC_L  0x1054
-#define UNITEXT_MYANMAR_LETTER_VOCALIC_L  L"\u1054"
+#define UNITEXT_MYANMAR_LETTER_VOCALIC_L  U"\u1054"
 #define UNICODE_MYANMAR_LETTER_VOCALIC_LL  0x1055
-#define UNITEXT_MYANMAR_LETTER_VOCALIC_LL  L"\u1055"
+#define UNITEXT_MYANMAR_LETTER_VOCALIC_LL  U"\u1055"
 #define UNICODE_MYANMAR_VOWEL_SIGN_VOCALIC_R  0x1056
-#define UNITEXT_MYANMAR_VOWEL_SIGN_VOCALIC_R  L"\u1056"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_VOCALIC_R  U"\u1056"
 #define UNICODE_MYANMAR_VOWEL_SIGN_VOCALIC_RR  0x1057
-#define UNITEXT_MYANMAR_VOWEL_SIGN_VOCALIC_RR  L"\u1057"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_VOCALIC_RR  U"\u1057"
 #define UNICODE_MYANMAR_VOWEL_SIGN_VOCALIC_L  0x1058
-#define UNITEXT_MYANMAR_VOWEL_SIGN_VOCALIC_L  L"\u1058"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_VOCALIC_L  U"\u1058"
 #define UNICODE_MYANMAR_VOWEL_SIGN_VOCALIC_LL  0x1059
-#define UNITEXT_MYANMAR_VOWEL_SIGN_VOCALIC_LL  L"\u1059"
+#define UNITEXT_MYANMAR_VOWEL_SIGN_VOCALIC_LL  U"\u1059"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_AN  0x10a0
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_AN  L"\u10a0"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_AN  U"\u10a0"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_BAN  0x10a1
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_BAN  L"\u10a1"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_BAN  U"\u10a1"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_GAN  0x10a2
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_GAN  L"\u10a2"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_GAN  U"\u10a2"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_DON  0x10a3
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_DON  L"\u10a3"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_DON  U"\u10a3"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_EN  0x10a4
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_EN  L"\u10a4"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_EN  U"\u10a4"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_VIN  0x10a5
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_VIN  L"\u10a5"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_VIN  U"\u10a5"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_ZEN  0x10a6
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_ZEN  L"\u10a6"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_ZEN  U"\u10a6"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_TAN  0x10a7
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_TAN  L"\u10a7"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_TAN  U"\u10a7"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_IN  0x10a8
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_IN  L"\u10a8"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_IN  U"\u10a8"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_KAN  0x10a9
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_KAN  L"\u10a9"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_KAN  U"\u10a9"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_LAS  0x10aa
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_LAS  L"\u10aa"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_LAS  U"\u10aa"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_MAN  0x10ab
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_MAN  L"\u10ab"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_MAN  U"\u10ab"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_NAR  0x10ac
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_NAR  L"\u10ac"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_NAR  U"\u10ac"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_ON  0x10ad
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_ON  L"\u10ad"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_ON  U"\u10ad"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_PAR  0x10ae
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_PAR  L"\u10ae"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_PAR  U"\u10ae"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_ZHAR  0x10af
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_ZHAR  L"\u10af"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_ZHAR  U"\u10af"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_RAE  0x10b0
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_RAE  L"\u10b0"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_RAE  U"\u10b0"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_SAN  0x10b1
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_SAN  L"\u10b1"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_SAN  U"\u10b1"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_TAR  0x10b2
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_TAR  L"\u10b2"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_TAR  U"\u10b2"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_UN  0x10b3
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_UN  L"\u10b3"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_UN  U"\u10b3"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_PHAR  0x10b4
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_PHAR  L"\u10b4"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_PHAR  U"\u10b4"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_KHAR  0x10b5
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_KHAR  L"\u10b5"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_KHAR  U"\u10b5"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_GHAN  0x10b6
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_GHAN  L"\u10b6"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_GHAN  U"\u10b6"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_QAR  0x10b7
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_QAR  L"\u10b7"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_QAR  U"\u10b7"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_SHIN  0x10b8
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_SHIN  L"\u10b8"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_SHIN  U"\u10b8"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_CHIN  0x10b9
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_CHIN  L"\u10b9"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_CHIN  U"\u10b9"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_CAN  0x10ba
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_CAN  L"\u10ba"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_CAN  U"\u10ba"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_JIL  0x10bb
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_JIL  L"\u10bb"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_JIL  U"\u10bb"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_CIL  0x10bc
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_CIL  L"\u10bc"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_CIL  U"\u10bc"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_CHAR  0x10bd
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_CHAR  L"\u10bd"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_CHAR  U"\u10bd"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_XAN  0x10be
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_XAN  L"\u10be"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_XAN  U"\u10be"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_JHAN  0x10bf
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_JHAN  L"\u10bf"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_JHAN  U"\u10bf"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_HAE  0x10c0
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_HAE  L"\u10c0"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_HAE  U"\u10c0"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_HE  0x10c1
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_HE  L"\u10c1"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_HE  U"\u10c1"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_HIE  0x10c2
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_HIE  L"\u10c2"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_HIE  U"\u10c2"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_WE  0x10c3
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_WE  L"\u10c3"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_WE  U"\u10c3"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_HAR  0x10c4
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_HAR  L"\u10c4"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_HAR  U"\u10c4"
 #define UNICODE_GEORGIAN_CAPITAL_LETTER_HOE  0x10c5
-#define UNITEXT_GEORGIAN_CAPITAL_LETTER_HOE  L"\u10c5"
+#define UNITEXT_GEORGIAN_CAPITAL_LETTER_HOE  U"\u10c5"
 #define UNICODE_GEORGIAN_LETTER_AN  0x10d0
-#define UNITEXT_GEORGIAN_LETTER_AN  L"\u10d0"
+#define UNITEXT_GEORGIAN_LETTER_AN  U"\u10d0"
 #define UNICODE_GEORGIAN_LETTER_BAN  0x10d1
-#define UNITEXT_GEORGIAN_LETTER_BAN  L"\u10d1"
+#define UNITEXT_GEORGIAN_LETTER_BAN  U"\u10d1"
 #define UNICODE_GEORGIAN_LETTER_GAN  0x10d2
-#define UNITEXT_GEORGIAN_LETTER_GAN  L"\u10d2"
+#define UNITEXT_GEORGIAN_LETTER_GAN  U"\u10d2"
 #define UNICODE_GEORGIAN_LETTER_DON  0x10d3
-#define UNITEXT_GEORGIAN_LETTER_DON  L"\u10d3"
+#define UNITEXT_GEORGIAN_LETTER_DON  U"\u10d3"
 #define UNICODE_GEORGIAN_LETTER_EN  0x10d4
-#define UNITEXT_GEORGIAN_LETTER_EN  L"\u10d4"
+#define UNITEXT_GEORGIAN_LETTER_EN  U"\u10d4"
 #define UNICODE_GEORGIAN_LETTER_VIN  0x10d5
-#define UNITEXT_GEORGIAN_LETTER_VIN  L"\u10d5"
+#define UNITEXT_GEORGIAN_LETTER_VIN  U"\u10d5"
 #define UNICODE_GEORGIAN_LETTER_ZEN  0x10d6
-#define UNITEXT_GEORGIAN_LETTER_ZEN  L"\u10d6"
+#define UNITEXT_GEORGIAN_LETTER_ZEN  U"\u10d6"
 #define UNICODE_GEORGIAN_LETTER_TAN  0x10d7
-#define UNITEXT_GEORGIAN_LETTER_TAN  L"\u10d7"
+#define UNITEXT_GEORGIAN_LETTER_TAN  U"\u10d7"
 #define UNICODE_GEORGIAN_LETTER_IN  0x10d8
-#define UNITEXT_GEORGIAN_LETTER_IN  L"\u10d8"
+#define UNITEXT_GEORGIAN_LETTER_IN  U"\u10d8"
 #define UNICODE_GEORGIAN_LETTER_KAN  0x10d9
-#define UNITEXT_GEORGIAN_LETTER_KAN  L"\u10d9"
+#define UNITEXT_GEORGIAN_LETTER_KAN  U"\u10d9"
 #define UNICODE_GEORGIAN_LETTER_LAS  0x10da
-#define UNITEXT_GEORGIAN_LETTER_LAS  L"\u10da"
+#define UNITEXT_GEORGIAN_LETTER_LAS  U"\u10da"
 #define UNICODE_GEORGIAN_LETTER_MAN  0x10db
-#define UNITEXT_GEORGIAN_LETTER_MAN  L"\u10db"
+#define UNITEXT_GEORGIAN_LETTER_MAN  U"\u10db"
 #define UNICODE_GEORGIAN_LETTER_NAR  0x10dc
-#define UNITEXT_GEORGIAN_LETTER_NAR  L"\u10dc"
+#define UNITEXT_GEORGIAN_LETTER_NAR  U"\u10dc"
 #define UNICODE_GEORGIAN_LETTER_ON  0x10dd
-#define UNITEXT_GEORGIAN_LETTER_ON  L"\u10dd"
+#define UNITEXT_GEORGIAN_LETTER_ON  U"\u10dd"
 #define UNICODE_GEORGIAN_LETTER_PAR  0x10de
-#define UNITEXT_GEORGIAN_LETTER_PAR  L"\u10de"
+#define UNITEXT_GEORGIAN_LETTER_PAR  U"\u10de"
 #define UNICODE_GEORGIAN_LETTER_ZHAR  0x10df
-#define UNITEXT_GEORGIAN_LETTER_ZHAR  L"\u10df"
+#define UNITEXT_GEORGIAN_LETTER_ZHAR  U"\u10df"
 #define UNICODE_GEORGIAN_LETTER_RAE  0x10e0
-#define UNITEXT_GEORGIAN_LETTER_RAE  L"\u10e0"
+#define UNITEXT_GEORGIAN_LETTER_RAE  U"\u10e0"
 #define UNICODE_GEORGIAN_LETTER_SAN  0x10e1
-#define UNITEXT_GEORGIAN_LETTER_SAN  L"\u10e1"
+#define UNITEXT_GEORGIAN_LETTER_SAN  U"\u10e1"
 #define UNICODE_GEORGIAN_LETTER_TAR  0x10e2
-#define UNITEXT_GEORGIAN_LETTER_TAR  L"\u10e2"
+#define UNITEXT_GEORGIAN_LETTER_TAR  U"\u10e2"
 #define UNICODE_GEORGIAN_LETTER_UN  0x10e3
-#define UNITEXT_GEORGIAN_LETTER_UN  L"\u10e3"
+#define UNITEXT_GEORGIAN_LETTER_UN  U"\u10e3"
 #define UNICODE_GEORGIAN_LETTER_PHAR  0x10e4
-#define UNITEXT_GEORGIAN_LETTER_PHAR  L"\u10e4"
+#define UNITEXT_GEORGIAN_LETTER_PHAR  U"\u10e4"
 #define UNICODE_GEORGIAN_LETTER_KHAR  0x10e5
-#define UNITEXT_GEORGIAN_LETTER_KHAR  L"\u10e5"
+#define UNITEXT_GEORGIAN_LETTER_KHAR  U"\u10e5"
 #define UNICODE_GEORGIAN_LETTER_GHAN  0x10e6
-#define UNITEXT_GEORGIAN_LETTER_GHAN  L"\u10e6"
+#define UNITEXT_GEORGIAN_LETTER_GHAN  U"\u10e6"
 #define UNICODE_GEORGIAN_LETTER_QAR  0x10e7
-#define UNITEXT_GEORGIAN_LETTER_QAR  L"\u10e7"
+#define UNITEXT_GEORGIAN_LETTER_QAR  U"\u10e7"
 #define UNICODE_GEORGIAN_LETTER_SHIN  0x10e8
-#define UNITEXT_GEORGIAN_LETTER_SHIN  L"\u10e8"
+#define UNITEXT_GEORGIAN_LETTER_SHIN  U"\u10e8"
 #define UNICODE_GEORGIAN_LETTER_CHIN  0x10e9
-#define UNITEXT_GEORGIAN_LETTER_CHIN  L"\u10e9"
+#define UNITEXT_GEORGIAN_LETTER_CHIN  U"\u10e9"
 #define UNICODE_GEORGIAN_LETTER_CAN  0x10ea
-#define UNITEXT_GEORGIAN_LETTER_CAN  L"\u10ea"
+#define UNITEXT_GEORGIAN_LETTER_CAN  U"\u10ea"
 #define UNICODE_GEORGIAN_LETTER_JIL  0x10eb
-#define UNITEXT_GEORGIAN_LETTER_JIL  L"\u10eb"
+#define UNITEXT_GEORGIAN_LETTER_JIL  U"\u10eb"
 #define UNICODE_GEORGIAN_LETTER_CIL  0x10ec
-#define UNITEXT_GEORGIAN_LETTER_CIL  L"\u10ec"
+#define UNITEXT_GEORGIAN_LETTER_CIL  U"\u10ec"
 #define UNICODE_GEORGIAN_LETTER_CHAR  0x10ed
-#define UNITEXT_GEORGIAN_LETTER_CHAR  L"\u10ed"
+#define UNITEXT_GEORGIAN_LETTER_CHAR  U"\u10ed"
 #define UNICODE_GEORGIAN_LETTER_XAN  0x10ee
-#define UNITEXT_GEORGIAN_LETTER_XAN  L"\u10ee"
+#define UNITEXT_GEORGIAN_LETTER_XAN  U"\u10ee"
 #define UNICODE_GEORGIAN_LETTER_JHAN  0x10ef
-#define UNITEXT_GEORGIAN_LETTER_JHAN  L"\u10ef"
+#define UNITEXT_GEORGIAN_LETTER_JHAN  U"\u10ef"
 #define UNICODE_GEORGIAN_LETTER_HAE  0x10f0
-#define UNITEXT_GEORGIAN_LETTER_HAE  L"\u10f0"
+#define UNITEXT_GEORGIAN_LETTER_HAE  U"\u10f0"
 #define UNICODE_GEORGIAN_LETTER_HE  0x10f1
-#define UNITEXT_GEORGIAN_LETTER_HE  L"\u10f1"
+#define UNITEXT_GEORGIAN_LETTER_HE  U"\u10f1"
 #define UNICODE_GEORGIAN_LETTER_HIE  0x10f2
-#define UNITEXT_GEORGIAN_LETTER_HIE  L"\u10f2"
+#define UNITEXT_GEORGIAN_LETTER_HIE  U"\u10f2"
 #define UNICODE_GEORGIAN_LETTER_WE  0x10f3
-#define UNITEXT_GEORGIAN_LETTER_WE  L"\u10f3"
+#define UNITEXT_GEORGIAN_LETTER_WE  U"\u10f3"
 #define UNICODE_GEORGIAN_LETTER_HAR  0x10f4
-#define UNITEXT_GEORGIAN_LETTER_HAR  L"\u10f4"
+#define UNITEXT_GEORGIAN_LETTER_HAR  U"\u10f4"
 #define UNICODE_GEORGIAN_LETTER_HOE  0x10f5
-#define UNITEXT_GEORGIAN_LETTER_HOE  L"\u10f5"
+#define UNITEXT_GEORGIAN_LETTER_HOE  U"\u10f5"
 #define UNICODE_GEORGIAN_LETTER_FI  0x10f6
-#define UNITEXT_GEORGIAN_LETTER_FI  L"\u10f6"
+#define UNITEXT_GEORGIAN_LETTER_FI  U"\u10f6"
 #define UNICODE_GEORGIAN_LETTER_YN  0x10f7
-#define UNITEXT_GEORGIAN_LETTER_YN  L"\u10f7"
+#define UNITEXT_GEORGIAN_LETTER_YN  U"\u10f7"
 #define UNICODE_GEORGIAN_LETTER_ELIFI  0x10f8
-#define UNITEXT_GEORGIAN_LETTER_ELIFI  L"\u10f8"
+#define UNITEXT_GEORGIAN_LETTER_ELIFI  U"\u10f8"
 #define UNICODE_GEORGIAN_LETTER_TURNED_GAN  0x10f9
-#define UNITEXT_GEORGIAN_LETTER_TURNED_GAN  L"\u10f9"
+#define UNITEXT_GEORGIAN_LETTER_TURNED_GAN  U"\u10f9"
 #define UNICODE_GEORGIAN_LETTER_AIN  0x10fa
-#define UNITEXT_GEORGIAN_LETTER_AIN  L"\u10fa"
+#define UNITEXT_GEORGIAN_LETTER_AIN  U"\u10fa"
 #define UNICODE_GEORGIAN_PARAGRAPH_SEPARATOR  0x10fb
-#define UNITEXT_GEORGIAN_PARAGRAPH_SEPARATOR  L"\u10fb"
+#define UNITEXT_GEORGIAN_PARAGRAPH_SEPARATOR  U"\u10fb"
 #define UNICODE_MODIFIER_LETTER_GEORGIAN_NAR  0x10fc
-#define UNITEXT_MODIFIER_LETTER_GEORGIAN_NAR  L"\u10fc"
+#define UNITEXT_MODIFIER_LETTER_GEORGIAN_NAR  U"\u10fc"
 #define UNICODE_HANGUL_CHOSEONG_KIYEOK  0x1100
-#define UNITEXT_HANGUL_CHOSEONG_KIYEOK  L"\u1100"
+#define UNITEXT_HANGUL_CHOSEONG_KIYEOK  U"\u1100"
 #define UNICODE_HANGUL_CHOSEONG_SSANGKIYEOK  0x1101
-#define UNITEXT_HANGUL_CHOSEONG_SSANGKIYEOK  L"\u1101"
+#define UNITEXT_HANGUL_CHOSEONG_SSANGKIYEOK  U"\u1101"
 #define UNICODE_HANGUL_CHOSEONG_NIEUN  0x1102
-#define UNITEXT_HANGUL_CHOSEONG_NIEUN  L"\u1102"
+#define UNITEXT_HANGUL_CHOSEONG_NIEUN  U"\u1102"
 #define UNICODE_HANGUL_CHOSEONG_TIKEUT  0x1103
-#define UNITEXT_HANGUL_CHOSEONG_TIKEUT  L"\u1103"
+#define UNITEXT_HANGUL_CHOSEONG_TIKEUT  U"\u1103"
 #define UNICODE_HANGUL_CHOSEONG_SSANGTIKEUT  0x1104
-#define UNITEXT_HANGUL_CHOSEONG_SSANGTIKEUT  L"\u1104"
+#define UNITEXT_HANGUL_CHOSEONG_SSANGTIKEUT  U"\u1104"
 #define UNICODE_HANGUL_CHOSEONG_RIEUL  0x1105
-#define UNITEXT_HANGUL_CHOSEONG_RIEUL  L"\u1105"
+#define UNITEXT_HANGUL_CHOSEONG_RIEUL  U"\u1105"
 #define UNICODE_HANGUL_CHOSEONG_MIEUM  0x1106
-#define UNITEXT_HANGUL_CHOSEONG_MIEUM  L"\u1106"
+#define UNITEXT_HANGUL_CHOSEONG_MIEUM  U"\u1106"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP  0x1107
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP  L"\u1107"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP  U"\u1107"
 #define UNICODE_HANGUL_CHOSEONG_SSANGPIEUP  0x1108
-#define UNITEXT_HANGUL_CHOSEONG_SSANGPIEUP  L"\u1108"
+#define UNITEXT_HANGUL_CHOSEONG_SSANGPIEUP  U"\u1108"
 #define UNICODE_HANGUL_CHOSEONG_SIOS  0x1109
-#define UNITEXT_HANGUL_CHOSEONG_SIOS  L"\u1109"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS  U"\u1109"
 #define UNICODE_HANGUL_CHOSEONG_SSANGSIOS  0x110a
-#define UNITEXT_HANGUL_CHOSEONG_SSANGSIOS  L"\u110a"
+#define UNITEXT_HANGUL_CHOSEONG_SSANGSIOS  U"\u110a"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG  0x110b
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG  L"\u110b"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG  U"\u110b"
 #define UNICODE_HANGUL_CHOSEONG_CIEUC  0x110c
-#define UNITEXT_HANGUL_CHOSEONG_CIEUC  L"\u110c"
+#define UNITEXT_HANGUL_CHOSEONG_CIEUC  U"\u110c"
 #define UNICODE_HANGUL_CHOSEONG_SSANGCIEUC  0x110d
-#define UNITEXT_HANGUL_CHOSEONG_SSANGCIEUC  L"\u110d"
+#define UNITEXT_HANGUL_CHOSEONG_SSANGCIEUC  U"\u110d"
 #define UNICODE_HANGUL_CHOSEONG_CHIEUCH  0x110e
-#define UNITEXT_HANGUL_CHOSEONG_CHIEUCH  L"\u110e"
+#define UNITEXT_HANGUL_CHOSEONG_CHIEUCH  U"\u110e"
 #define UNICODE_HANGUL_CHOSEONG_KHIEUKH  0x110f
-#define UNITEXT_HANGUL_CHOSEONG_KHIEUKH  L"\u110f"
+#define UNITEXT_HANGUL_CHOSEONG_KHIEUKH  U"\u110f"
 #define UNICODE_HANGUL_CHOSEONG_THIEUTH  0x1110
-#define UNITEXT_HANGUL_CHOSEONG_THIEUTH  L"\u1110"
+#define UNITEXT_HANGUL_CHOSEONG_THIEUTH  U"\u1110"
 #define UNICODE_HANGUL_CHOSEONG_PHIEUPH  0x1111
-#define UNITEXT_HANGUL_CHOSEONG_PHIEUPH  L"\u1111"
+#define UNITEXT_HANGUL_CHOSEONG_PHIEUPH  U"\u1111"
 #define UNICODE_HANGUL_CHOSEONG_HIEUH  0x1112
-#define UNITEXT_HANGUL_CHOSEONG_HIEUH  L"\u1112"
+#define UNITEXT_HANGUL_CHOSEONG_HIEUH  U"\u1112"
 #define UNICODE_HANGUL_CHOSEONG_NIEUN_KIYEOK  0x1113
-#define UNITEXT_HANGUL_CHOSEONG_NIEUN_KIYEOK  L"\u1113"
+#define UNITEXT_HANGUL_CHOSEONG_NIEUN_KIYEOK  U"\u1113"
 #define UNICODE_HANGUL_CHOSEONG_SSANGNIEUN  0x1114
-#define UNITEXT_HANGUL_CHOSEONG_SSANGNIEUN  L"\u1114"
+#define UNITEXT_HANGUL_CHOSEONG_SSANGNIEUN  U"\u1114"
 #define UNICODE_HANGUL_CHOSEONG_NIEUN_TIKEUT  0x1115
-#define UNITEXT_HANGUL_CHOSEONG_NIEUN_TIKEUT  L"\u1115"
+#define UNITEXT_HANGUL_CHOSEONG_NIEUN_TIKEUT  U"\u1115"
 #define UNICODE_HANGUL_CHOSEONG_NIEUN_PIEUP  0x1116
-#define UNITEXT_HANGUL_CHOSEONG_NIEUN_PIEUP  L"\u1116"
+#define UNITEXT_HANGUL_CHOSEONG_NIEUN_PIEUP  U"\u1116"
 #define UNICODE_HANGUL_CHOSEONG_TIKEUT_KIYEOK  0x1117
-#define UNITEXT_HANGUL_CHOSEONG_TIKEUT_KIYEOK  L"\u1117"
+#define UNITEXT_HANGUL_CHOSEONG_TIKEUT_KIYEOK  U"\u1117"
 #define UNICODE_HANGUL_CHOSEONG_RIEUL_NIEUN  0x1118
-#define UNITEXT_HANGUL_CHOSEONG_RIEUL_NIEUN  L"\u1118"
+#define UNITEXT_HANGUL_CHOSEONG_RIEUL_NIEUN  U"\u1118"
 #define UNICODE_HANGUL_CHOSEONG_SSANGRIEUL  0x1119
-#define UNITEXT_HANGUL_CHOSEONG_SSANGRIEUL  L"\u1119"
+#define UNITEXT_HANGUL_CHOSEONG_SSANGRIEUL  U"\u1119"
 #define UNICODE_HANGUL_CHOSEONG_RIEUL_HIEUH  0x111a
-#define UNITEXT_HANGUL_CHOSEONG_RIEUL_HIEUH  L"\u111a"
+#define UNITEXT_HANGUL_CHOSEONG_RIEUL_HIEUH  U"\u111a"
 #define UNICODE_HANGUL_CHOSEONG_KAPYEOUNRIEUL  0x111b
-#define UNITEXT_HANGUL_CHOSEONG_KAPYEOUNRIEUL  L"\u111b"
+#define UNITEXT_HANGUL_CHOSEONG_KAPYEOUNRIEUL  U"\u111b"
 #define UNICODE_HANGUL_CHOSEONG_MIEUM_PIEUP  0x111c
-#define UNITEXT_HANGUL_CHOSEONG_MIEUM_PIEUP  L"\u111c"
+#define UNITEXT_HANGUL_CHOSEONG_MIEUM_PIEUP  U"\u111c"
 #define UNICODE_HANGUL_CHOSEONG_KAPYEOUNMIEUM  0x111d
-#define UNITEXT_HANGUL_CHOSEONG_KAPYEOUNMIEUM  L"\u111d"
+#define UNITEXT_HANGUL_CHOSEONG_KAPYEOUNMIEUM  U"\u111d"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_KIYEOK  0x111e
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_KIYEOK  L"\u111e"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_KIYEOK  U"\u111e"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_NIEUN  0x111f
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_NIEUN  L"\u111f"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_NIEUN  U"\u111f"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_TIKEUT  0x1120
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_TIKEUT  L"\u1120"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_TIKEUT  U"\u1120"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_SIOS  0x1121
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SIOS  L"\u1121"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SIOS  U"\u1121"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_SIOS_KIYEOK  0x1122
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SIOS_KIYEOK  L"\u1122"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SIOS_KIYEOK  U"\u1122"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_SIOS_TIKEUT  0x1123
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SIOS_TIKEUT  L"\u1123"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SIOS_TIKEUT  U"\u1123"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_SIOS_PIEUP  0x1124
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SIOS_PIEUP  L"\u1124"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SIOS_PIEUP  U"\u1124"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_SSANGSIOS  0x1125
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SSANGSIOS  L"\u1125"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SSANGSIOS  U"\u1125"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_SIOS_CIEUC  0x1126
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SIOS_CIEUC  L"\u1126"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_SIOS_CIEUC  U"\u1126"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_CIEUC  0x1127
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_CIEUC  L"\u1127"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_CIEUC  U"\u1127"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_CHIEUCH  0x1128
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_CHIEUCH  L"\u1128"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_CHIEUCH  U"\u1128"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_THIEUTH  0x1129
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_THIEUTH  L"\u1129"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_THIEUTH  U"\u1129"
 #define UNICODE_HANGUL_CHOSEONG_PIEUP_PHIEUPH  0x112a
-#define UNITEXT_HANGUL_CHOSEONG_PIEUP_PHIEUPH  L"\u112a"
+#define UNITEXT_HANGUL_CHOSEONG_PIEUP_PHIEUPH  U"\u112a"
 #define UNICODE_HANGUL_CHOSEONG_KAPYEOUNPIEUP  0x112b
-#define UNITEXT_HANGUL_CHOSEONG_KAPYEOUNPIEUP  L"\u112b"
+#define UNITEXT_HANGUL_CHOSEONG_KAPYEOUNPIEUP  U"\u112b"
 #define UNICODE_HANGUL_CHOSEONG_KAPYEOUNSSANGPIEUP  0x112c
-#define UNITEXT_HANGUL_CHOSEONG_KAPYEOUNSSANGPIEUP  L"\u112c"
+#define UNITEXT_HANGUL_CHOSEONG_KAPYEOUNSSANGPIEUP  U"\u112c"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_KIYEOK  0x112d
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_KIYEOK  L"\u112d"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_KIYEOK  U"\u112d"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_NIEUN  0x112e
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_NIEUN  L"\u112e"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_NIEUN  U"\u112e"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_TIKEUT  0x112f
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_TIKEUT  L"\u112f"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_TIKEUT  U"\u112f"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_RIEUL  0x1130
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_RIEUL  L"\u1130"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_RIEUL  U"\u1130"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_MIEUM  0x1131
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_MIEUM  L"\u1131"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_MIEUM  U"\u1131"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_PIEUP  0x1132
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_PIEUP  L"\u1132"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_PIEUP  U"\u1132"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_PIEUP_KIYEOK  0x1133
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_PIEUP_KIYEOK  L"\u1133"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_PIEUP_KIYEOK  U"\u1133"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_SSANGSIOS  0x1134
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_SSANGSIOS  L"\u1134"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_SSANGSIOS  U"\u1134"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_IEUNG  0x1135
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_IEUNG  L"\u1135"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_IEUNG  U"\u1135"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_CIEUC  0x1136
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_CIEUC  L"\u1136"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_CIEUC  U"\u1136"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_CHIEUCH  0x1137
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_CHIEUCH  L"\u1137"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_CHIEUCH  U"\u1137"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_KHIEUKH  0x1138
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_KHIEUKH  L"\u1138"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_KHIEUKH  U"\u1138"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_THIEUTH  0x1139
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_THIEUTH  L"\u1139"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_THIEUTH  U"\u1139"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_PHIEUPH  0x113a
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_PHIEUPH  L"\u113a"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_PHIEUPH  U"\u113a"
 #define UNICODE_HANGUL_CHOSEONG_SIOS_HIEUH  0x113b
-#define UNITEXT_HANGUL_CHOSEONG_SIOS_HIEUH  L"\u113b"
+#define UNITEXT_HANGUL_CHOSEONG_SIOS_HIEUH  U"\u113b"
 #define UNICODE_HANGUL_CHOSEONG_CHITUEUMSIOS  0x113c
-#define UNITEXT_HANGUL_CHOSEONG_CHITUEUMSIOS  L"\u113c"
+#define UNITEXT_HANGUL_CHOSEONG_CHITUEUMSIOS  U"\u113c"
 #define UNICODE_HANGUL_CHOSEONG_CHITUEUMSSANGSIOS  0x113d
-#define UNITEXT_HANGUL_CHOSEONG_CHITUEUMSSANGSIOS  L"\u113d"
+#define UNITEXT_HANGUL_CHOSEONG_CHITUEUMSSANGSIOS  U"\u113d"
 #define UNICODE_HANGUL_CHOSEONG_CEONGCHIEUMSIOS  0x113e
-#define UNITEXT_HANGUL_CHOSEONG_CEONGCHIEUMSIOS  L"\u113e"
+#define UNITEXT_HANGUL_CHOSEONG_CEONGCHIEUMSIOS  U"\u113e"
 #define UNICODE_HANGUL_CHOSEONG_CEONGCHIEUMSSANGSIOS  0x113f
-#define UNITEXT_HANGUL_CHOSEONG_CEONGCHIEUMSSANGSIOS  L"\u113f"
+#define UNITEXT_HANGUL_CHOSEONG_CEONGCHIEUMSSANGSIOS  U"\u113f"
 #define UNICODE_HANGUL_CHOSEONG_PANSIOS  0x1140
-#define UNITEXT_HANGUL_CHOSEONG_PANSIOS  L"\u1140"
+#define UNITEXT_HANGUL_CHOSEONG_PANSIOS  U"\u1140"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG_KIYEOK  0x1141
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG_KIYEOK  L"\u1141"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG_KIYEOK  U"\u1141"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG_TIKEUT  0x1142
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG_TIKEUT  L"\u1142"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG_TIKEUT  U"\u1142"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG_MIEUM  0x1143
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG_MIEUM  L"\u1143"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG_MIEUM  U"\u1143"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG_PIEUP  0x1144
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG_PIEUP  L"\u1144"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG_PIEUP  U"\u1144"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG_SIOS  0x1145
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG_SIOS  L"\u1145"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG_SIOS  U"\u1145"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG_PANSIOS  0x1146
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG_PANSIOS  L"\u1146"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG_PANSIOS  U"\u1146"
 #define UNICODE_HANGUL_CHOSEONG_SSANGIEUNG  0x1147
-#define UNITEXT_HANGUL_CHOSEONG_SSANGIEUNG  L"\u1147"
+#define UNITEXT_HANGUL_CHOSEONG_SSANGIEUNG  U"\u1147"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG_CIEUC  0x1148
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG_CIEUC  L"\u1148"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG_CIEUC  U"\u1148"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG_CHIEUCH  0x1149
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG_CHIEUCH  L"\u1149"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG_CHIEUCH  U"\u1149"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG_THIEUTH  0x114a
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG_THIEUTH  L"\u114a"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG_THIEUTH  U"\u114a"
 #define UNICODE_HANGUL_CHOSEONG_IEUNG_PHIEUPH  0x114b
-#define UNITEXT_HANGUL_CHOSEONG_IEUNG_PHIEUPH  L"\u114b"
+#define UNITEXT_HANGUL_CHOSEONG_IEUNG_PHIEUPH  U"\u114b"
 #define UNICODE_HANGUL_CHOSEONG_YESIEUNG  0x114c
-#define UNITEXT_HANGUL_CHOSEONG_YESIEUNG  L"\u114c"
+#define UNITEXT_HANGUL_CHOSEONG_YESIEUNG  U"\u114c"
 #define UNICODE_HANGUL_CHOSEONG_CIEUC_IEUNG  0x114d
-#define UNITEXT_HANGUL_CHOSEONG_CIEUC_IEUNG  L"\u114d"
+#define UNITEXT_HANGUL_CHOSEONG_CIEUC_IEUNG  U"\u114d"
 #define UNICODE_HANGUL_CHOSEONG_CHITUEUMCIEUC  0x114e
-#define UNITEXT_HANGUL_CHOSEONG_CHITUEUMCIEUC  L"\u114e"
+#define UNITEXT_HANGUL_CHOSEONG_CHITUEUMCIEUC  U"\u114e"
 #define UNICODE_HANGUL_CHOSEONG_CHITUEUMSSANGCIEUC  0x114f
-#define UNITEXT_HANGUL_CHOSEONG_CHITUEUMSSANGCIEUC  L"\u114f"
+#define UNITEXT_HANGUL_CHOSEONG_CHITUEUMSSANGCIEUC  U"\u114f"
 #define UNICODE_HANGUL_CHOSEONG_CEONGCHIEUMCIEUC  0x1150
-#define UNITEXT_HANGUL_CHOSEONG_CEONGCHIEUMCIEUC  L"\u1150"
+#define UNITEXT_HANGUL_CHOSEONG_CEONGCHIEUMCIEUC  U"\u1150"
 #define UNICODE_HANGUL_CHOSEONG_CEONGCHIEUMSSANGCIEUC  0x1151
-#define UNITEXT_HANGUL_CHOSEONG_CEONGCHIEUMSSANGCIEUC  L"\u1151"
+#define UNITEXT_HANGUL_CHOSEONG_CEONGCHIEUMSSANGCIEUC  U"\u1151"
 #define UNICODE_HANGUL_CHOSEONG_CHIEUCH_KHIEUKH  0x1152
-#define UNITEXT_HANGUL_CHOSEONG_CHIEUCH_KHIEUKH  L"\u1152"
+#define UNITEXT_HANGUL_CHOSEONG_CHIEUCH_KHIEUKH  U"\u1152"
 #define UNICODE_HANGUL_CHOSEONG_CHIEUCH_HIEUH  0x1153
-#define UNITEXT_HANGUL_CHOSEONG_CHIEUCH_HIEUH  L"\u1153"
+#define UNITEXT_HANGUL_CHOSEONG_CHIEUCH_HIEUH  U"\u1153"
 #define UNICODE_HANGUL_CHOSEONG_CHITUEUMCHIEUCH  0x1154
-#define UNITEXT_HANGUL_CHOSEONG_CHITUEUMCHIEUCH  L"\u1154"
+#define UNITEXT_HANGUL_CHOSEONG_CHITUEUMCHIEUCH  U"\u1154"
 #define UNICODE_HANGUL_CHOSEONG_CEONGCHIEUMCHIEUCH  0x1155
-#define UNITEXT_HANGUL_CHOSEONG_CEONGCHIEUMCHIEUCH  L"\u1155"
+#define UNITEXT_HANGUL_CHOSEONG_CEONGCHIEUMCHIEUCH  U"\u1155"
 #define UNICODE_HANGUL_CHOSEONG_PHIEUPH_PIEUP  0x1156
-#define UNITEXT_HANGUL_CHOSEONG_PHIEUPH_PIEUP  L"\u1156"
+#define UNITEXT_HANGUL_CHOSEONG_PHIEUPH_PIEUP  U"\u1156"
 #define UNICODE_HANGUL_CHOSEONG_KAPYEOUNPHIEUPH  0x1157
-#define UNITEXT_HANGUL_CHOSEONG_KAPYEOUNPHIEUPH  L"\u1157"
+#define UNITEXT_HANGUL_CHOSEONG_KAPYEOUNPHIEUPH  U"\u1157"
 #define UNICODE_HANGUL_CHOSEONG_SSANGHIEUH  0x1158
-#define UNITEXT_HANGUL_CHOSEONG_SSANGHIEUH  L"\u1158"
+#define UNITEXT_HANGUL_CHOSEONG_SSANGHIEUH  U"\u1158"
 #define UNICODE_HANGUL_CHOSEONG_YEORINHIEUH  0x1159
-#define UNITEXT_HANGUL_CHOSEONG_YEORINHIEUH  L"\u1159"
+#define UNITEXT_HANGUL_CHOSEONG_YEORINHIEUH  U"\u1159"
 #define UNICODE_HANGUL_CHOSEONG_FILLER  0x115f
-#define UNITEXT_HANGUL_CHOSEONG_FILLER  L"\u115f"
+#define UNITEXT_HANGUL_CHOSEONG_FILLER  U"\u115f"
 #define UNICODE_HANGUL_JUNGSEONG_FILLER  0x1160
-#define UNITEXT_HANGUL_JUNGSEONG_FILLER  L"\u1160"
+#define UNITEXT_HANGUL_JUNGSEONG_FILLER  U"\u1160"
 #define UNICODE_HANGUL_JUNGSEONG_A  0x1161
-#define UNITEXT_HANGUL_JUNGSEONG_A  L"\u1161"
+#define UNITEXT_HANGUL_JUNGSEONG_A  U"\u1161"
 #define UNICODE_HANGUL_JUNGSEONG_AE  0x1162
-#define UNITEXT_HANGUL_JUNGSEONG_AE  L"\u1162"
+#define UNITEXT_HANGUL_JUNGSEONG_AE  U"\u1162"
 #define UNICODE_HANGUL_JUNGSEONG_YA  0x1163
-#define UNITEXT_HANGUL_JUNGSEONG_YA  L"\u1163"
+#define UNITEXT_HANGUL_JUNGSEONG_YA  U"\u1163"
 #define UNICODE_HANGUL_JUNGSEONG_YAE  0x1164
-#define UNITEXT_HANGUL_JUNGSEONG_YAE  L"\u1164"
+#define UNITEXT_HANGUL_JUNGSEONG_YAE  U"\u1164"
 #define UNICODE_HANGUL_JUNGSEONG_EO  0x1165
-#define UNITEXT_HANGUL_JUNGSEONG_EO  L"\u1165"
+#define UNITEXT_HANGUL_JUNGSEONG_EO  U"\u1165"
 #define UNICODE_HANGUL_JUNGSEONG_E  0x1166
-#define UNITEXT_HANGUL_JUNGSEONG_E  L"\u1166"
+#define UNITEXT_HANGUL_JUNGSEONG_E  U"\u1166"
 #define UNICODE_HANGUL_JUNGSEONG_YEO  0x1167
-#define UNITEXT_HANGUL_JUNGSEONG_YEO  L"\u1167"
+#define UNITEXT_HANGUL_JUNGSEONG_YEO  U"\u1167"
 #define UNICODE_HANGUL_JUNGSEONG_YE  0x1168
-#define UNITEXT_HANGUL_JUNGSEONG_YE  L"\u1168"
+#define UNITEXT_HANGUL_JUNGSEONG_YE  U"\u1168"
 #define UNICODE_HANGUL_JUNGSEONG_O  0x1169
-#define UNITEXT_HANGUL_JUNGSEONG_O  L"\u1169"
+#define UNITEXT_HANGUL_JUNGSEONG_O  U"\u1169"
 #define UNICODE_HANGUL_JUNGSEONG_WA  0x116a
-#define UNITEXT_HANGUL_JUNGSEONG_WA  L"\u116a"
+#define UNITEXT_HANGUL_JUNGSEONG_WA  U"\u116a"
 #define UNICODE_HANGUL_JUNGSEONG_WAE  0x116b
-#define UNITEXT_HANGUL_JUNGSEONG_WAE  L"\u116b"
+#define UNITEXT_HANGUL_JUNGSEONG_WAE  U"\u116b"
 #define UNICODE_HANGUL_JUNGSEONG_OE  0x116c
-#define UNITEXT_HANGUL_JUNGSEONG_OE  L"\u116c"
+#define UNITEXT_HANGUL_JUNGSEONG_OE  U"\u116c"
 #define UNICODE_HANGUL_JUNGSEONG_YO  0x116d
-#define UNITEXT_HANGUL_JUNGSEONG_YO  L"\u116d"
+#define UNITEXT_HANGUL_JUNGSEONG_YO  U"\u116d"
 #define UNICODE_HANGUL_JUNGSEONG_U  0x116e
-#define UNITEXT_HANGUL_JUNGSEONG_U  L"\u116e"
+#define UNITEXT_HANGUL_JUNGSEONG_U  U"\u116e"
 #define UNICODE_HANGUL_JUNGSEONG_WEO  0x116f
-#define UNITEXT_HANGUL_JUNGSEONG_WEO  L"\u116f"
+#define UNITEXT_HANGUL_JUNGSEONG_WEO  U"\u116f"
 #define UNICODE_HANGUL_JUNGSEONG_WE  0x1170
-#define UNITEXT_HANGUL_JUNGSEONG_WE  L"\u1170"
+#define UNITEXT_HANGUL_JUNGSEONG_WE  U"\u1170"
 #define UNICODE_HANGUL_JUNGSEONG_WI  0x1171
-#define UNITEXT_HANGUL_JUNGSEONG_WI  L"\u1171"
+#define UNITEXT_HANGUL_JUNGSEONG_WI  U"\u1171"
 #define UNICODE_HANGUL_JUNGSEONG_YU  0x1172
-#define UNITEXT_HANGUL_JUNGSEONG_YU  L"\u1172"
+#define UNITEXT_HANGUL_JUNGSEONG_YU  U"\u1172"
 #define UNICODE_HANGUL_JUNGSEONG_EU  0x1173
-#define UNITEXT_HANGUL_JUNGSEONG_EU  L"\u1173"
+#define UNITEXT_HANGUL_JUNGSEONG_EU  U"\u1173"
 #define UNICODE_HANGUL_JUNGSEONG_YI  0x1174
-#define UNITEXT_HANGUL_JUNGSEONG_YI  L"\u1174"
+#define UNITEXT_HANGUL_JUNGSEONG_YI  U"\u1174"
 #define UNICODE_HANGUL_JUNGSEONG_I  0x1175
-#define UNITEXT_HANGUL_JUNGSEONG_I  L"\u1175"
+#define UNITEXT_HANGUL_JUNGSEONG_I  U"\u1175"
 #define UNICODE_HANGUL_JUNGSEONG_A_O  0x1176
-#define UNITEXT_HANGUL_JUNGSEONG_A_O  L"\u1176"
+#define UNITEXT_HANGUL_JUNGSEONG_A_O  U"\u1176"
 #define UNICODE_HANGUL_JUNGSEONG_A_U  0x1177
-#define UNITEXT_HANGUL_JUNGSEONG_A_U  L"\u1177"
+#define UNITEXT_HANGUL_JUNGSEONG_A_U  U"\u1177"
 #define UNICODE_HANGUL_JUNGSEONG_YA_O  0x1178
-#define UNITEXT_HANGUL_JUNGSEONG_YA_O  L"\u1178"
+#define UNITEXT_HANGUL_JUNGSEONG_YA_O  U"\u1178"
 #define UNICODE_HANGUL_JUNGSEONG_YA_YO  0x1179
-#define UNITEXT_HANGUL_JUNGSEONG_YA_YO  L"\u1179"
+#define UNITEXT_HANGUL_JUNGSEONG_YA_YO  U"\u1179"
 #define UNICODE_HANGUL_JUNGSEONG_EO_O  0x117a
-#define UNITEXT_HANGUL_JUNGSEONG_EO_O  L"\u117a"
+#define UNITEXT_HANGUL_JUNGSEONG_EO_O  U"\u117a"
 #define UNICODE_HANGUL_JUNGSEONG_EO_U  0x117b
-#define UNITEXT_HANGUL_JUNGSEONG_EO_U  L"\u117b"
+#define UNITEXT_HANGUL_JUNGSEONG_EO_U  U"\u117b"
 #define UNICODE_HANGUL_JUNGSEONG_EO_EU  0x117c
-#define UNITEXT_HANGUL_JUNGSEONG_EO_EU  L"\u117c"
+#define UNITEXT_HANGUL_JUNGSEONG_EO_EU  U"\u117c"
 #define UNICODE_HANGUL_JUNGSEONG_YEO_O  0x117d
-#define UNITEXT_HANGUL_JUNGSEONG_YEO_O  L"\u117d"
+#define UNITEXT_HANGUL_JUNGSEONG_YEO_O  U"\u117d"
 #define UNICODE_HANGUL_JUNGSEONG_YEO_U  0x117e
-#define UNITEXT_HANGUL_JUNGSEONG_YEO_U  L"\u117e"
+#define UNITEXT_HANGUL_JUNGSEONG_YEO_U  U"\u117e"
 #define UNICODE_HANGUL_JUNGSEONG_O_EO  0x117f
-#define UNITEXT_HANGUL_JUNGSEONG_O_EO  L"\u117f"
+#define UNITEXT_HANGUL_JUNGSEONG_O_EO  U"\u117f"
 #define UNICODE_HANGUL_JUNGSEONG_O_E  0x1180
-#define UNITEXT_HANGUL_JUNGSEONG_O_E  L"\u1180"
+#define UNITEXT_HANGUL_JUNGSEONG_O_E  U"\u1180"
 #define UNICODE_HANGUL_JUNGSEONG_O_YE  0x1181
-#define UNITEXT_HANGUL_JUNGSEONG_O_YE  L"\u1181"
+#define UNITEXT_HANGUL_JUNGSEONG_O_YE  U"\u1181"
 #define UNICODE_HANGUL_JUNGSEONG_O_O  0x1182
-#define UNITEXT_HANGUL_JUNGSEONG_O_O  L"\u1182"
+#define UNITEXT_HANGUL_JUNGSEONG_O_O  U"\u1182"
 #define UNICODE_HANGUL_JUNGSEONG_O_U  0x1183
-#define UNITEXT_HANGUL_JUNGSEONG_O_U  L"\u1183"
+#define UNITEXT_HANGUL_JUNGSEONG_O_U  U"\u1183"
 #define UNICODE_HANGUL_JUNGSEONG_YO_YA  0x1184
-#define UNITEXT_HANGUL_JUNGSEONG_YO_YA  L"\u1184"
+#define UNITEXT_HANGUL_JUNGSEONG_YO_YA  U"\u1184"
 #define UNICODE_HANGUL_JUNGSEONG_YO_YAE  0x1185
-#define UNITEXT_HANGUL_JUNGSEONG_YO_YAE  L"\u1185"
+#define UNITEXT_HANGUL_JUNGSEONG_YO_YAE  U"\u1185"
 #define UNICODE_HANGUL_JUNGSEONG_YO_YEO  0x1186
-#define UNITEXT_HANGUL_JUNGSEONG_YO_YEO  L"\u1186"
+#define UNITEXT_HANGUL_JUNGSEONG_YO_YEO  U"\u1186"
 #define UNICODE_HANGUL_JUNGSEONG_YO_O  0x1187
-#define UNITEXT_HANGUL_JUNGSEONG_YO_O  L"\u1187"
+#define UNITEXT_HANGUL_JUNGSEONG_YO_O  U"\u1187"
 #define UNICODE_HANGUL_JUNGSEONG_YO_I  0x1188
-#define UNITEXT_HANGUL_JUNGSEONG_YO_I  L"\u1188"
+#define UNITEXT_HANGUL_JUNGSEONG_YO_I  U"\u1188"
 #define UNICODE_HANGUL_JUNGSEONG_U_A  0x1189
-#define UNITEXT_HANGUL_JUNGSEONG_U_A  L"\u1189"
+#define UNITEXT_HANGUL_JUNGSEONG_U_A  U"\u1189"
 #define UNICODE_HANGUL_JUNGSEONG_U_AE  0x118a
-#define UNITEXT_HANGUL_JUNGSEONG_U_AE  L"\u118a"
+#define UNITEXT_HANGUL_JUNGSEONG_U_AE  U"\u118a"
 #define UNICODE_HANGUL_JUNGSEONG_U_EO_EU  0x118b
-#define UNITEXT_HANGUL_JUNGSEONG_U_EO_EU  L"\u118b"
+#define UNITEXT_HANGUL_JUNGSEONG_U_EO_EU  U"\u118b"
 #define UNICODE_HANGUL_JUNGSEONG_U_YE  0x118c
-#define UNITEXT_HANGUL_JUNGSEONG_U_YE  L"\u118c"
+#define UNITEXT_HANGUL_JUNGSEONG_U_YE  U"\u118c"
 #define UNICODE_HANGUL_JUNGSEONG_U_U  0x118d
-#define UNITEXT_HANGUL_JUNGSEONG_U_U  L"\u118d"
+#define UNITEXT_HANGUL_JUNGSEONG_U_U  U"\u118d"
 #define UNICODE_HANGUL_JUNGSEONG_YU_A  0x118e
-#define UNITEXT_HANGUL_JUNGSEONG_YU_A  L"\u118e"
+#define UNITEXT_HANGUL_JUNGSEONG_YU_A  U"\u118e"
 #define UNICODE_HANGUL_JUNGSEONG_YU_EO  0x118f
-#define UNITEXT_HANGUL_JUNGSEONG_YU_EO  L"\u118f"
+#define UNITEXT_HANGUL_JUNGSEONG_YU_EO  U"\u118f"
 #define UNICODE_HANGUL_JUNGSEONG_YU_E  0x1190
-#define UNITEXT_HANGUL_JUNGSEONG_YU_E  L"\u1190"
+#define UNITEXT_HANGUL_JUNGSEONG_YU_E  U"\u1190"
 #define UNICODE_HANGUL_JUNGSEONG_YU_YEO  0x1191
-#define UNITEXT_HANGUL_JUNGSEONG_YU_YEO  L"\u1191"
+#define UNITEXT_HANGUL_JUNGSEONG_YU_YEO  U"\u1191"
 #define UNICODE_HANGUL_JUNGSEONG_YU_YE  0x1192
-#define UNITEXT_HANGUL_JUNGSEONG_YU_YE  L"\u1192"
+#define UNITEXT_HANGUL_JUNGSEONG_YU_YE  U"\u1192"
 #define UNICODE_HANGUL_JUNGSEONG_YU_U  0x1193
-#define UNITEXT_HANGUL_JUNGSEONG_YU_U  L"\u1193"
+#define UNITEXT_HANGUL_JUNGSEONG_YU_U  U"\u1193"
 #define UNICODE_HANGUL_JUNGSEONG_YU_I  0x1194
-#define UNITEXT_HANGUL_JUNGSEONG_YU_I  L"\u1194"
+#define UNITEXT_HANGUL_JUNGSEONG_YU_I  U"\u1194"
 #define UNICODE_HANGUL_JUNGSEONG_EU_U  0x1195
-#define UNITEXT_HANGUL_JUNGSEONG_EU_U  L"\u1195"
+#define UNITEXT_HANGUL_JUNGSEONG_EU_U  U"\u1195"
 #define UNICODE_HANGUL_JUNGSEONG_EU_EU  0x1196
-#define UNITEXT_HANGUL_JUNGSEONG_EU_EU  L"\u1196"
+#define UNITEXT_HANGUL_JUNGSEONG_EU_EU  U"\u1196"
 #define UNICODE_HANGUL_JUNGSEONG_YI_U  0x1197
-#define UNITEXT_HANGUL_JUNGSEONG_YI_U  L"\u1197"
+#define UNITEXT_HANGUL_JUNGSEONG_YI_U  U"\u1197"
 #define UNICODE_HANGUL_JUNGSEONG_I_A  0x1198
-#define UNITEXT_HANGUL_JUNGSEONG_I_A  L"\u1198"
+#define UNITEXT_HANGUL_JUNGSEONG_I_A  U"\u1198"
 #define UNICODE_HANGUL_JUNGSEONG_I_YA  0x1199
-#define UNITEXT_HANGUL_JUNGSEONG_I_YA  L"\u1199"
+#define UNITEXT_HANGUL_JUNGSEONG_I_YA  U"\u1199"
 #define UNICODE_HANGUL_JUNGSEONG_I_O  0x119a
-#define UNITEXT_HANGUL_JUNGSEONG_I_O  L"\u119a"
+#define UNITEXT_HANGUL_JUNGSEONG_I_O  U"\u119a"
 #define UNICODE_HANGUL_JUNGSEONG_I_U  0x119b
-#define UNITEXT_HANGUL_JUNGSEONG_I_U  L"\u119b"
+#define UNITEXT_HANGUL_JUNGSEONG_I_U  U"\u119b"
 #define UNICODE_HANGUL_JUNGSEONG_I_EU  0x119c
-#define UNITEXT_HANGUL_JUNGSEONG_I_EU  L"\u119c"
+#define UNITEXT_HANGUL_JUNGSEONG_I_EU  U"\u119c"
 #define UNICODE_HANGUL_JUNGSEONG_I_ARAEA  0x119d
-#define UNITEXT_HANGUL_JUNGSEONG_I_ARAEA  L"\u119d"
+#define UNITEXT_HANGUL_JUNGSEONG_I_ARAEA  U"\u119d"
 #define UNICODE_HANGUL_JUNGSEONG_ARAEA  0x119e
-#define UNITEXT_HANGUL_JUNGSEONG_ARAEA  L"\u119e"
+#define UNITEXT_HANGUL_JUNGSEONG_ARAEA  U"\u119e"
 #define UNICODE_HANGUL_JUNGSEONG_ARAEA_EO  0x119f
-#define UNITEXT_HANGUL_JUNGSEONG_ARAEA_EO  L"\u119f"
+#define UNITEXT_HANGUL_JUNGSEONG_ARAEA_EO  U"\u119f"
 #define UNICODE_HANGUL_JUNGSEONG_ARAEA_U  0x11a0
-#define UNITEXT_HANGUL_JUNGSEONG_ARAEA_U  L"\u11a0"
+#define UNITEXT_HANGUL_JUNGSEONG_ARAEA_U  U"\u11a0"
 #define UNICODE_HANGUL_JUNGSEONG_ARAEA_I  0x11a1
-#define UNITEXT_HANGUL_JUNGSEONG_ARAEA_I  L"\u11a1"
+#define UNITEXT_HANGUL_JUNGSEONG_ARAEA_I  U"\u11a1"
 #define UNICODE_HANGUL_JUNGSEONG_SSANGARAEA  0x11a2
-#define UNITEXT_HANGUL_JUNGSEONG_SSANGARAEA  L"\u11a2"
+#define UNITEXT_HANGUL_JUNGSEONG_SSANGARAEA  U"\u11a2"
 #define UNICODE_HANGUL_JONGSEONG_KIYEOK  0x11a8
-#define UNITEXT_HANGUL_JONGSEONG_KIYEOK  L"\u11a8"
+#define UNITEXT_HANGUL_JONGSEONG_KIYEOK  U"\u11a8"
 #define UNICODE_HANGUL_JONGSEONG_SSANGKIYEOK  0x11a9
-#define UNITEXT_HANGUL_JONGSEONG_SSANGKIYEOK  L"\u11a9"
+#define UNITEXT_HANGUL_JONGSEONG_SSANGKIYEOK  U"\u11a9"
 #define UNICODE_HANGUL_JONGSEONG_KIYEOK_SIOS  0x11aa
-#define UNITEXT_HANGUL_JONGSEONG_KIYEOK_SIOS  L"\u11aa"
+#define UNITEXT_HANGUL_JONGSEONG_KIYEOK_SIOS  U"\u11aa"
 #define UNICODE_HANGUL_JONGSEONG_NIEUN  0x11ab
-#define UNITEXT_HANGUL_JONGSEONG_NIEUN  L"\u11ab"
+#define UNITEXT_HANGUL_JONGSEONG_NIEUN  U"\u11ab"
 #define UNICODE_HANGUL_JONGSEONG_NIEUN_CIEUC  0x11ac
-#define UNITEXT_HANGUL_JONGSEONG_NIEUN_CIEUC  L"\u11ac"
+#define UNITEXT_HANGUL_JONGSEONG_NIEUN_CIEUC  U"\u11ac"
 #define UNICODE_HANGUL_JONGSEONG_NIEUN_HIEUH  0x11ad
-#define UNITEXT_HANGUL_JONGSEONG_NIEUN_HIEUH  L"\u11ad"
+#define UNITEXT_HANGUL_JONGSEONG_NIEUN_HIEUH  U"\u11ad"
 #define UNICODE_HANGUL_JONGSEONG_TIKEUT  0x11ae
-#define UNITEXT_HANGUL_JONGSEONG_TIKEUT  L"\u11ae"
+#define UNITEXT_HANGUL_JONGSEONG_TIKEUT  U"\u11ae"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL  0x11af
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL  L"\u11af"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL  U"\u11af"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_KIYEOK  0x11b0
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_KIYEOK  L"\u11b0"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_KIYEOK  U"\u11b0"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_MIEUM  0x11b1
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_MIEUM  L"\u11b1"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_MIEUM  U"\u11b1"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_PIEUP  0x11b2
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_PIEUP  L"\u11b2"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_PIEUP  U"\u11b2"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_SIOS  0x11b3
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_SIOS  L"\u11b3"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_SIOS  U"\u11b3"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_THIEUTH  0x11b4
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_THIEUTH  L"\u11b4"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_THIEUTH  U"\u11b4"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_PHIEUPH  0x11b5
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_PHIEUPH  L"\u11b5"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_PHIEUPH  U"\u11b5"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_HIEUH  0x11b6
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_HIEUH  L"\u11b6"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_HIEUH  U"\u11b6"
 #define UNICODE_HANGUL_JONGSEONG_MIEUM  0x11b7
-#define UNITEXT_HANGUL_JONGSEONG_MIEUM  L"\u11b7"
+#define UNITEXT_HANGUL_JONGSEONG_MIEUM  U"\u11b7"
 #define UNICODE_HANGUL_JONGSEONG_PIEUP  0x11b8
-#define UNITEXT_HANGUL_JONGSEONG_PIEUP  L"\u11b8"
+#define UNITEXT_HANGUL_JONGSEONG_PIEUP  U"\u11b8"
 #define UNICODE_HANGUL_JONGSEONG_PIEUP_SIOS  0x11b9
-#define UNITEXT_HANGUL_JONGSEONG_PIEUP_SIOS  L"\u11b9"
+#define UNITEXT_HANGUL_JONGSEONG_PIEUP_SIOS  U"\u11b9"
 #define UNICODE_HANGUL_JONGSEONG_SIOS  0x11ba
-#define UNITEXT_HANGUL_JONGSEONG_SIOS  L"\u11ba"
+#define UNITEXT_HANGUL_JONGSEONG_SIOS  U"\u11ba"
 #define UNICODE_HANGUL_JONGSEONG_SSANGSIOS  0x11bb
-#define UNITEXT_HANGUL_JONGSEONG_SSANGSIOS  L"\u11bb"
+#define UNITEXT_HANGUL_JONGSEONG_SSANGSIOS  U"\u11bb"
 #define UNICODE_HANGUL_JONGSEONG_IEUNG  0x11bc
-#define UNITEXT_HANGUL_JONGSEONG_IEUNG  L"\u11bc"
+#define UNITEXT_HANGUL_JONGSEONG_IEUNG  U"\u11bc"
 #define UNICODE_HANGUL_JONGSEONG_CIEUC  0x11bd
-#define UNITEXT_HANGUL_JONGSEONG_CIEUC  L"\u11bd"
+#define UNITEXT_HANGUL_JONGSEONG_CIEUC  U"\u11bd"
 #define UNICODE_HANGUL_JONGSEONG_CHIEUCH  0x11be
-#define UNITEXT_HANGUL_JONGSEONG_CHIEUCH  L"\u11be"
+#define UNITEXT_HANGUL_JONGSEONG_CHIEUCH  U"\u11be"
 #define UNICODE_HANGUL_JONGSEONG_KHIEUKH  0x11bf
-#define UNITEXT_HANGUL_JONGSEONG_KHIEUKH  L"\u11bf"
+#define UNITEXT_HANGUL_JONGSEONG_KHIEUKH  U"\u11bf"
 #define UNICODE_HANGUL_JONGSEONG_THIEUTH  0x11c0
-#define UNITEXT_HANGUL_JONGSEONG_THIEUTH  L"\u11c0"
+#define UNITEXT_HANGUL_JONGSEONG_THIEUTH  U"\u11c0"
 #define UNICODE_HANGUL_JONGSEONG_PHIEUPH  0x11c1
-#define UNITEXT_HANGUL_JONGSEONG_PHIEUPH  L"\u11c1"
+#define UNITEXT_HANGUL_JONGSEONG_PHIEUPH  U"\u11c1"
 #define UNICODE_HANGUL_JONGSEONG_HIEUH  0x11c2
-#define UNITEXT_HANGUL_JONGSEONG_HIEUH  L"\u11c2"
+#define UNITEXT_HANGUL_JONGSEONG_HIEUH  U"\u11c2"
 #define UNICODE_HANGUL_JONGSEONG_KIYEOK_RIEUL  0x11c3
-#define UNITEXT_HANGUL_JONGSEONG_KIYEOK_RIEUL  L"\u11c3"
+#define UNITEXT_HANGUL_JONGSEONG_KIYEOK_RIEUL  U"\u11c3"
 #define UNICODE_HANGUL_JONGSEONG_KIYEOK_SIOS_KIYEOK  0x11c4
-#define UNITEXT_HANGUL_JONGSEONG_KIYEOK_SIOS_KIYEOK  L"\u11c4"
+#define UNITEXT_HANGUL_JONGSEONG_KIYEOK_SIOS_KIYEOK  U"\u11c4"
 #define UNICODE_HANGUL_JONGSEONG_NIEUN_KIYEOK  0x11c5
-#define UNITEXT_HANGUL_JONGSEONG_NIEUN_KIYEOK  L"\u11c5"
+#define UNITEXT_HANGUL_JONGSEONG_NIEUN_KIYEOK  U"\u11c5"
 #define UNICODE_HANGUL_JONGSEONG_NIEUN_TIKEUT  0x11c6
-#define UNITEXT_HANGUL_JONGSEONG_NIEUN_TIKEUT  L"\u11c6"
+#define UNITEXT_HANGUL_JONGSEONG_NIEUN_TIKEUT  U"\u11c6"
 #define UNICODE_HANGUL_JONGSEONG_NIEUN_SIOS  0x11c7
-#define UNITEXT_HANGUL_JONGSEONG_NIEUN_SIOS  L"\u11c7"
+#define UNITEXT_HANGUL_JONGSEONG_NIEUN_SIOS  U"\u11c7"
 #define UNICODE_HANGUL_JONGSEONG_NIEUN_PANSIOS  0x11c8
-#define UNITEXT_HANGUL_JONGSEONG_NIEUN_PANSIOS  L"\u11c8"
+#define UNITEXT_HANGUL_JONGSEONG_NIEUN_PANSIOS  U"\u11c8"
 #define UNICODE_HANGUL_JONGSEONG_NIEUN_THIEUTH  0x11c9
-#define UNITEXT_HANGUL_JONGSEONG_NIEUN_THIEUTH  L"\u11c9"
+#define UNITEXT_HANGUL_JONGSEONG_NIEUN_THIEUTH  U"\u11c9"
 #define UNICODE_HANGUL_JONGSEONG_TIKEUT_KIYEOK  0x11ca
-#define UNITEXT_HANGUL_JONGSEONG_TIKEUT_KIYEOK  L"\u11ca"
+#define UNITEXT_HANGUL_JONGSEONG_TIKEUT_KIYEOK  U"\u11ca"
 #define UNICODE_HANGUL_JONGSEONG_TIKEUT_RIEUL  0x11cb
-#define UNITEXT_HANGUL_JONGSEONG_TIKEUT_RIEUL  L"\u11cb"
+#define UNITEXT_HANGUL_JONGSEONG_TIKEUT_RIEUL  U"\u11cb"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_KIYEOK_SIOS  0x11cc
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_KIYEOK_SIOS  L"\u11cc"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_KIYEOK_SIOS  U"\u11cc"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_NIEUN  0x11cd
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_NIEUN  L"\u11cd"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_NIEUN  U"\u11cd"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_TIKEUT  0x11ce
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_TIKEUT  L"\u11ce"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_TIKEUT  U"\u11ce"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_TIKEUT_HIEUH  0x11cf
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_TIKEUT_HIEUH  L"\u11cf"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_TIKEUT_HIEUH  U"\u11cf"
 #define UNICODE_HANGUL_JONGSEONG_SSANGRIEUL  0x11d0
-#define UNITEXT_HANGUL_JONGSEONG_SSANGRIEUL  L"\u11d0"
+#define UNITEXT_HANGUL_JONGSEONG_SSANGRIEUL  U"\u11d0"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_MIEUM_KIYEOK  0x11d1
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_MIEUM_KIYEOK  L"\u11d1"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_MIEUM_KIYEOK  U"\u11d1"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_MIEUM_SIOS  0x11d2
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_MIEUM_SIOS  L"\u11d2"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_MIEUM_SIOS  U"\u11d2"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_PIEUP_SIOS  0x11d3
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_PIEUP_SIOS  L"\u11d3"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_PIEUP_SIOS  U"\u11d3"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_PIEUP_HIEUH  0x11d4
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_PIEUP_HIEUH  L"\u11d4"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_PIEUP_HIEUH  U"\u11d4"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_KAPYEOUNPIEUP  0x11d5
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_KAPYEOUNPIEUP  L"\u11d5"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_KAPYEOUNPIEUP  U"\u11d5"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_SSANGSIOS  0x11d6
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_SSANGSIOS  L"\u11d6"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_SSANGSIOS  U"\u11d6"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_PANSIOS  0x11d7
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_PANSIOS  L"\u11d7"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_PANSIOS  U"\u11d7"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_KHIEUKH  0x11d8
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_KHIEUKH  L"\u11d8"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_KHIEUKH  U"\u11d8"
 #define UNICODE_HANGUL_JONGSEONG_RIEUL_YEORINHIEUH  0x11d9
-#define UNITEXT_HANGUL_JONGSEONG_RIEUL_YEORINHIEUH  L"\u11d9"
+#define UNITEXT_HANGUL_JONGSEONG_RIEUL_YEORINHIEUH  U"\u11d9"
 #define UNICODE_HANGUL_JONGSEONG_MIEUM_KIYEOK  0x11da
-#define UNITEXT_HANGUL_JONGSEONG_MIEUM_KIYEOK  L"\u11da"
+#define UNITEXT_HANGUL_JONGSEONG_MIEUM_KIYEOK  U"\u11da"
 #define UNICODE_HANGUL_JONGSEONG_MIEUM_RIEUL  0x11db
-#define UNITEXT_HANGUL_JONGSEONG_MIEUM_RIEUL  L"\u11db"
+#define UNITEXT_HANGUL_JONGSEONG_MIEUM_RIEUL  U"\u11db"
 #define UNICODE_HANGUL_JONGSEONG_MIEUM_PIEUP  0x11dc
-#define UNITEXT_HANGUL_JONGSEONG_MIEUM_PIEUP  L"\u11dc"
+#define UNITEXT_HANGUL_JONGSEONG_MIEUM_PIEUP  U"\u11dc"
 #define UNICODE_HANGUL_JONGSEONG_MIEUM_SIOS  0x11dd
-#define UNITEXT_HANGUL_JONGSEONG_MIEUM_SIOS  L"\u11dd"
+#define UNITEXT_HANGUL_JONGSEONG_MIEUM_SIOS  U"\u11dd"
 #define UNICODE_HANGUL_JONGSEONG_MIEUM_SSANGSIOS  0x11de
-#define UNITEXT_HANGUL_JONGSEONG_MIEUM_SSANGSIOS  L"\u11de"
+#define UNITEXT_HANGUL_JONGSEONG_MIEUM_SSANGSIOS  U"\u11de"
 #define UNICODE_HANGUL_JONGSEONG_MIEUM_PANSIOS  0x11df
-#define UNITEXT_HANGUL_JONGSEONG_MIEUM_PANSIOS  L"\u11df"
+#define UNITEXT_HANGUL_JONGSEONG_MIEUM_PANSIOS  U"\u11df"
 #define UNICODE_HANGUL_JONGSEONG_MIEUM_CHIEUCH  0x11e0
-#define UNITEXT_HANGUL_JONGSEONG_MIEUM_CHIEUCH  L"\u11e0"
+#define UNITEXT_HANGUL_JONGSEONG_MIEUM_CHIEUCH  U"\u11e0"
 #define UNICODE_HANGUL_JONGSEONG_MIEUM_HIEUH  0x11e1
-#define UNITEXT_HANGUL_JONGSEONG_MIEUM_HIEUH  L"\u11e1"
+#define UNITEXT_HANGUL_JONGSEONG_MIEUM_HIEUH  U"\u11e1"
 #define UNICODE_HANGUL_JONGSEONG_KAPYEOUNMIEUM  0x11e2
-#define UNITEXT_HANGUL_JONGSEONG_KAPYEOUNMIEUM  L"\u11e2"
+#define UNITEXT_HANGUL_JONGSEONG_KAPYEOUNMIEUM  U"\u11e2"
 #define UNICODE_HANGUL_JONGSEONG_PIEUP_RIEUL  0x11e3
-#define UNITEXT_HANGUL_JONGSEONG_PIEUP_RIEUL  L"\u11e3"
+#define UNITEXT_HANGUL_JONGSEONG_PIEUP_RIEUL  U"\u11e3"
 #define UNICODE_HANGUL_JONGSEONG_PIEUP_PHIEUPH  0x11e4
-#define UNITEXT_HANGUL_JONGSEONG_PIEUP_PHIEUPH  L"\u11e4"
+#define UNITEXT_HANGUL_JONGSEONG_PIEUP_PHIEUPH  U"\u11e4"
 #define UNICODE_HANGUL_JONGSEONG_PIEUP_HIEUH  0x11e5
-#define UNITEXT_HANGUL_JONGSEONG_PIEUP_HIEUH  L"\u11e5"
+#define UNITEXT_HANGUL_JONGSEONG_PIEUP_HIEUH  U"\u11e5"
 #define UNICODE_HANGUL_JONGSEONG_KAPYEOUNPIEUP  0x11e6
-#define UNITEXT_HANGUL_JONGSEONG_KAPYEOUNPIEUP  L"\u11e6"
+#define UNITEXT_HANGUL_JONGSEONG_KAPYEOUNPIEUP  U"\u11e6"
 #define UNICODE_HANGUL_JONGSEONG_SIOS_KIYEOK  0x11e7
-#define UNITEXT_HANGUL_JONGSEONG_SIOS_KIYEOK  L"\u11e7"
+#define UNITEXT_HANGUL_JONGSEONG_SIOS_KIYEOK  U"\u11e7"
 #define UNICODE_HANGUL_JONGSEONG_SIOS_TIKEUT  0x11e8
-#define UNITEXT_HANGUL_JONGSEONG_SIOS_TIKEUT  L"\u11e8"
+#define UNITEXT_HANGUL_JONGSEONG_SIOS_TIKEUT  U"\u11e8"
 #define UNICODE_HANGUL_JONGSEONG_SIOS_RIEUL  0x11e9
-#define UNITEXT_HANGUL_JONGSEONG_SIOS_RIEUL  L"\u11e9"
+#define UNITEXT_HANGUL_JONGSEONG_SIOS_RIEUL  U"\u11e9"
 #define UNICODE_HANGUL_JONGSEONG_SIOS_PIEUP  0x11ea
-#define UNITEXT_HANGUL_JONGSEONG_SIOS_PIEUP  L"\u11ea"
+#define UNITEXT_HANGUL_JONGSEONG_SIOS_PIEUP  U"\u11ea"
 #define UNICODE_HANGUL_JONGSEONG_PANSIOS  0x11eb
-#define UNITEXT_HANGUL_JONGSEONG_PANSIOS  L"\u11eb"
+#define UNITEXT_HANGUL_JONGSEONG_PANSIOS  U"\u11eb"
 #define UNICODE_HANGUL_JONGSEONG_IEUNG_KIYEOK  0x11ec
-#define UNITEXT_HANGUL_JONGSEONG_IEUNG_KIYEOK  L"\u11ec"
+#define UNITEXT_HANGUL_JONGSEONG_IEUNG_KIYEOK  U"\u11ec"
 #define UNICODE_HANGUL_JONGSEONG_IEUNG_SSANGKIYEOK  0x11ed
-#define UNITEXT_HANGUL_JONGSEONG_IEUNG_SSANGKIYEOK  L"\u11ed"
+#define UNITEXT_HANGUL_JONGSEONG_IEUNG_SSANGKIYEOK  U"\u11ed"
 #define UNICODE_HANGUL_JONGSEONG_SSANGIEUNG  0x11ee
-#define UNITEXT_HANGUL_JONGSEONG_SSANGIEUNG  L"\u11ee"
+#define UNITEXT_HANGUL_JONGSEONG_SSANGIEUNG  U"\u11ee"
 #define UNICODE_HANGUL_JONGSEONG_IEUNG_KHIEUKH  0x11ef
-#define UNITEXT_HANGUL_JONGSEONG_IEUNG_KHIEUKH  L"\u11ef"
+#define UNITEXT_HANGUL_JONGSEONG_IEUNG_KHIEUKH  U"\u11ef"
 #define UNICODE_HANGUL_JONGSEONG_YESIEUNG  0x11f0
-#define UNITEXT_HANGUL_JONGSEONG_YESIEUNG  L"\u11f0"
+#define UNITEXT_HANGUL_JONGSEONG_YESIEUNG  U"\u11f0"
 #define UNICODE_HANGUL_JONGSEONG_YESIEUNG_SIOS  0x11f1
-#define UNITEXT_HANGUL_JONGSEONG_YESIEUNG_SIOS  L"\u11f1"
+#define UNITEXT_HANGUL_JONGSEONG_YESIEUNG_SIOS  U"\u11f1"
 #define UNICODE_HANGUL_JONGSEONG_YESIEUNG_PANSIOS  0x11f2
-#define UNITEXT_HANGUL_JONGSEONG_YESIEUNG_PANSIOS  L"\u11f2"
+#define UNITEXT_HANGUL_JONGSEONG_YESIEUNG_PANSIOS  U"\u11f2"
 #define UNICODE_HANGUL_JONGSEONG_PHIEUPH_PIEUP  0x11f3
-#define UNITEXT_HANGUL_JONGSEONG_PHIEUPH_PIEUP  L"\u11f3"
+#define UNITEXT_HANGUL_JONGSEONG_PHIEUPH_PIEUP  U"\u11f3"
 #define UNICODE_HANGUL_JONGSEONG_KAPYEOUNPHIEUPH  0x11f4
-#define UNITEXT_HANGUL_JONGSEONG_KAPYEOUNPHIEUPH  L"\u11f4"
+#define UNITEXT_HANGUL_JONGSEONG_KAPYEOUNPHIEUPH  U"\u11f4"
 #define UNICODE_HANGUL_JONGSEONG_HIEUH_NIEUN  0x11f5
-#define UNITEXT_HANGUL_JONGSEONG_HIEUH_NIEUN  L"\u11f5"
+#define UNITEXT_HANGUL_JONGSEONG_HIEUH_NIEUN  U"\u11f5"
 #define UNICODE_HANGUL_JONGSEONG_HIEUH_RIEUL  0x11f6
-#define UNITEXT_HANGUL_JONGSEONG_HIEUH_RIEUL  L"\u11f6"
+#define UNITEXT_HANGUL_JONGSEONG_HIEUH_RIEUL  U"\u11f6"
 #define UNICODE_HANGUL_JONGSEONG_HIEUH_MIEUM  0x11f7
-#define UNITEXT_HANGUL_JONGSEONG_HIEUH_MIEUM  L"\u11f7"
+#define UNITEXT_HANGUL_JONGSEONG_HIEUH_MIEUM  U"\u11f7"
 #define UNICODE_HANGUL_JONGSEONG_HIEUH_PIEUP  0x11f8
-#define UNITEXT_HANGUL_JONGSEONG_HIEUH_PIEUP  L"\u11f8"
+#define UNITEXT_HANGUL_JONGSEONG_HIEUH_PIEUP  U"\u11f8"
 #define UNICODE_HANGUL_JONGSEONG_YEORINHIEUH  0x11f9
-#define UNITEXT_HANGUL_JONGSEONG_YEORINHIEUH  L"\u11f9"
+#define UNITEXT_HANGUL_JONGSEONG_YEORINHIEUH  U"\u11f9"
 #define UNICODE_ETHIOPIC_SYLLABLE_HA  0x1200
-#define UNITEXT_ETHIOPIC_SYLLABLE_HA  L"\u1200"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HA  U"\u1200"
 #define UNICODE_ETHIOPIC_SYLLABLE_HU  0x1201
-#define UNITEXT_ETHIOPIC_SYLLABLE_HU  L"\u1201"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HU  U"\u1201"
 #define UNICODE_ETHIOPIC_SYLLABLE_HI  0x1202
-#define UNITEXT_ETHIOPIC_SYLLABLE_HI  L"\u1202"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HI  U"\u1202"
 #define UNICODE_ETHIOPIC_SYLLABLE_HAA  0x1203
-#define UNITEXT_ETHIOPIC_SYLLABLE_HAA  L"\u1203"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HAA  U"\u1203"
 #define UNICODE_ETHIOPIC_SYLLABLE_HEE  0x1204
-#define UNITEXT_ETHIOPIC_SYLLABLE_HEE  L"\u1204"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HEE  U"\u1204"
 #define UNICODE_ETHIOPIC_SYLLABLE_HE  0x1205
-#define UNITEXT_ETHIOPIC_SYLLABLE_HE  L"\u1205"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HE  U"\u1205"
 #define UNICODE_ETHIOPIC_SYLLABLE_HO  0x1206
-#define UNITEXT_ETHIOPIC_SYLLABLE_HO  L"\u1206"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HO  U"\u1206"
 #define UNICODE_ETHIOPIC_SYLLABLE_HOA  0x1207
-#define UNITEXT_ETHIOPIC_SYLLABLE_HOA  L"\u1207"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HOA  U"\u1207"
 #define UNICODE_ETHIOPIC_SYLLABLE_LA  0x1208
-#define UNITEXT_ETHIOPIC_SYLLABLE_LA  L"\u1208"
+#define UNITEXT_ETHIOPIC_SYLLABLE_LA  U"\u1208"
 #define UNICODE_ETHIOPIC_SYLLABLE_LU  0x1209
-#define UNITEXT_ETHIOPIC_SYLLABLE_LU  L"\u1209"
+#define UNITEXT_ETHIOPIC_SYLLABLE_LU  U"\u1209"
 #define UNICODE_ETHIOPIC_SYLLABLE_LI  0x120a
-#define UNITEXT_ETHIOPIC_SYLLABLE_LI  L"\u120a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_LI  U"\u120a"
 #define UNICODE_ETHIOPIC_SYLLABLE_LAA  0x120b
-#define UNITEXT_ETHIOPIC_SYLLABLE_LAA  L"\u120b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_LAA  U"\u120b"
 #define UNICODE_ETHIOPIC_SYLLABLE_LEE  0x120c
-#define UNITEXT_ETHIOPIC_SYLLABLE_LEE  L"\u120c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_LEE  U"\u120c"
 #define UNICODE_ETHIOPIC_SYLLABLE_LE  0x120d
-#define UNITEXT_ETHIOPIC_SYLLABLE_LE  L"\u120d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_LE  U"\u120d"
 #define UNICODE_ETHIOPIC_SYLLABLE_LO  0x120e
-#define UNITEXT_ETHIOPIC_SYLLABLE_LO  L"\u120e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_LO  U"\u120e"
 #define UNICODE_ETHIOPIC_SYLLABLE_LWA  0x120f
-#define UNITEXT_ETHIOPIC_SYLLABLE_LWA  L"\u120f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_LWA  U"\u120f"
 #define UNICODE_ETHIOPIC_SYLLABLE_HHA  0x1210
-#define UNITEXT_ETHIOPIC_SYLLABLE_HHA  L"\u1210"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HHA  U"\u1210"
 #define UNICODE_ETHIOPIC_SYLLABLE_HHU  0x1211
-#define UNITEXT_ETHIOPIC_SYLLABLE_HHU  L"\u1211"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HHU  U"\u1211"
 #define UNICODE_ETHIOPIC_SYLLABLE_HHI  0x1212
-#define UNITEXT_ETHIOPIC_SYLLABLE_HHI  L"\u1212"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HHI  U"\u1212"
 #define UNICODE_ETHIOPIC_SYLLABLE_HHAA  0x1213
-#define UNITEXT_ETHIOPIC_SYLLABLE_HHAA  L"\u1213"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HHAA  U"\u1213"
 #define UNICODE_ETHIOPIC_SYLLABLE_HHEE  0x1214
-#define UNITEXT_ETHIOPIC_SYLLABLE_HHEE  L"\u1214"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HHEE  U"\u1214"
 #define UNICODE_ETHIOPIC_SYLLABLE_HHE  0x1215
-#define UNITEXT_ETHIOPIC_SYLLABLE_HHE  L"\u1215"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HHE  U"\u1215"
 #define UNICODE_ETHIOPIC_SYLLABLE_HHO  0x1216
-#define UNITEXT_ETHIOPIC_SYLLABLE_HHO  L"\u1216"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HHO  U"\u1216"
 #define UNICODE_ETHIOPIC_SYLLABLE_HHWA  0x1217
-#define UNITEXT_ETHIOPIC_SYLLABLE_HHWA  L"\u1217"
+#define UNITEXT_ETHIOPIC_SYLLABLE_HHWA  U"\u1217"
 #define UNICODE_ETHIOPIC_SYLLABLE_MA  0x1218
-#define UNITEXT_ETHIOPIC_SYLLABLE_MA  L"\u1218"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MA  U"\u1218"
 #define UNICODE_ETHIOPIC_SYLLABLE_MU  0x1219
-#define UNITEXT_ETHIOPIC_SYLLABLE_MU  L"\u1219"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MU  U"\u1219"
 #define UNICODE_ETHIOPIC_SYLLABLE_MI  0x121a
-#define UNITEXT_ETHIOPIC_SYLLABLE_MI  L"\u121a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MI  U"\u121a"
 #define UNICODE_ETHIOPIC_SYLLABLE_MAA  0x121b
-#define UNITEXT_ETHIOPIC_SYLLABLE_MAA  L"\u121b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MAA  U"\u121b"
 #define UNICODE_ETHIOPIC_SYLLABLE_MEE  0x121c
-#define UNITEXT_ETHIOPIC_SYLLABLE_MEE  L"\u121c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MEE  U"\u121c"
 #define UNICODE_ETHIOPIC_SYLLABLE_ME  0x121d
-#define UNITEXT_ETHIOPIC_SYLLABLE_ME  L"\u121d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ME  U"\u121d"
 #define UNICODE_ETHIOPIC_SYLLABLE_MO  0x121e
-#define UNITEXT_ETHIOPIC_SYLLABLE_MO  L"\u121e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MO  U"\u121e"
 #define UNICODE_ETHIOPIC_SYLLABLE_MWA  0x121f
-#define UNITEXT_ETHIOPIC_SYLLABLE_MWA  L"\u121f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MWA  U"\u121f"
 #define UNICODE_ETHIOPIC_SYLLABLE_SZA  0x1220
-#define UNITEXT_ETHIOPIC_SYLLABLE_SZA  L"\u1220"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SZA  U"\u1220"
 #define UNICODE_ETHIOPIC_SYLLABLE_SZU  0x1221
-#define UNITEXT_ETHIOPIC_SYLLABLE_SZU  L"\u1221"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SZU  U"\u1221"
 #define UNICODE_ETHIOPIC_SYLLABLE_SZI  0x1222
-#define UNITEXT_ETHIOPIC_SYLLABLE_SZI  L"\u1222"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SZI  U"\u1222"
 #define UNICODE_ETHIOPIC_SYLLABLE_SZAA  0x1223
-#define UNITEXT_ETHIOPIC_SYLLABLE_SZAA  L"\u1223"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SZAA  U"\u1223"
 #define UNICODE_ETHIOPIC_SYLLABLE_SZEE  0x1224
-#define UNITEXT_ETHIOPIC_SYLLABLE_SZEE  L"\u1224"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SZEE  U"\u1224"
 #define UNICODE_ETHIOPIC_SYLLABLE_SZE  0x1225
-#define UNITEXT_ETHIOPIC_SYLLABLE_SZE  L"\u1225"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SZE  U"\u1225"
 #define UNICODE_ETHIOPIC_SYLLABLE_SZO  0x1226
-#define UNITEXT_ETHIOPIC_SYLLABLE_SZO  L"\u1226"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SZO  U"\u1226"
 #define UNICODE_ETHIOPIC_SYLLABLE_SZWA  0x1227
-#define UNITEXT_ETHIOPIC_SYLLABLE_SZWA  L"\u1227"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SZWA  U"\u1227"
 #define UNICODE_ETHIOPIC_SYLLABLE_RA  0x1228
-#define UNITEXT_ETHIOPIC_SYLLABLE_RA  L"\u1228"
+#define UNITEXT_ETHIOPIC_SYLLABLE_RA  U"\u1228"
 #define UNICODE_ETHIOPIC_SYLLABLE_RU  0x1229
-#define UNITEXT_ETHIOPIC_SYLLABLE_RU  L"\u1229"
+#define UNITEXT_ETHIOPIC_SYLLABLE_RU  U"\u1229"
 #define UNICODE_ETHIOPIC_SYLLABLE_RI  0x122a
-#define UNITEXT_ETHIOPIC_SYLLABLE_RI  L"\u122a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_RI  U"\u122a"
 #define UNICODE_ETHIOPIC_SYLLABLE_RAA  0x122b
-#define UNITEXT_ETHIOPIC_SYLLABLE_RAA  L"\u122b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_RAA  U"\u122b"
 #define UNICODE_ETHIOPIC_SYLLABLE_REE  0x122c
-#define UNITEXT_ETHIOPIC_SYLLABLE_REE  L"\u122c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_REE  U"\u122c"
 #define UNICODE_ETHIOPIC_SYLLABLE_RE  0x122d
-#define UNITEXT_ETHIOPIC_SYLLABLE_RE  L"\u122d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_RE  U"\u122d"
 #define UNICODE_ETHIOPIC_SYLLABLE_RO  0x122e
-#define UNITEXT_ETHIOPIC_SYLLABLE_RO  L"\u122e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_RO  U"\u122e"
 #define UNICODE_ETHIOPIC_SYLLABLE_RWA  0x122f
-#define UNITEXT_ETHIOPIC_SYLLABLE_RWA  L"\u122f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_RWA  U"\u122f"
 #define UNICODE_ETHIOPIC_SYLLABLE_SA  0x1230
-#define UNITEXT_ETHIOPIC_SYLLABLE_SA  L"\u1230"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SA  U"\u1230"
 #define UNICODE_ETHIOPIC_SYLLABLE_SU  0x1231
-#define UNITEXT_ETHIOPIC_SYLLABLE_SU  L"\u1231"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SU  U"\u1231"
 #define UNICODE_ETHIOPIC_SYLLABLE_SI  0x1232
-#define UNITEXT_ETHIOPIC_SYLLABLE_SI  L"\u1232"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SI  U"\u1232"
 #define UNICODE_ETHIOPIC_SYLLABLE_SAA  0x1233
-#define UNITEXT_ETHIOPIC_SYLLABLE_SAA  L"\u1233"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SAA  U"\u1233"
 #define UNICODE_ETHIOPIC_SYLLABLE_SEE  0x1234
-#define UNITEXT_ETHIOPIC_SYLLABLE_SEE  L"\u1234"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SEE  U"\u1234"
 #define UNICODE_ETHIOPIC_SYLLABLE_SE  0x1235
-#define UNITEXT_ETHIOPIC_SYLLABLE_SE  L"\u1235"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SE  U"\u1235"
 #define UNICODE_ETHIOPIC_SYLLABLE_SO  0x1236
-#define UNITEXT_ETHIOPIC_SYLLABLE_SO  L"\u1236"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SO  U"\u1236"
 #define UNICODE_ETHIOPIC_SYLLABLE_SWA  0x1237
-#define UNITEXT_ETHIOPIC_SYLLABLE_SWA  L"\u1237"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SWA  U"\u1237"
 #define UNICODE_ETHIOPIC_SYLLABLE_SHA  0x1238
-#define UNITEXT_ETHIOPIC_SYLLABLE_SHA  L"\u1238"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SHA  U"\u1238"
 #define UNICODE_ETHIOPIC_SYLLABLE_SHU  0x1239
-#define UNITEXT_ETHIOPIC_SYLLABLE_SHU  L"\u1239"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SHU  U"\u1239"
 #define UNICODE_ETHIOPIC_SYLLABLE_SHI  0x123a
-#define UNITEXT_ETHIOPIC_SYLLABLE_SHI  L"\u123a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SHI  U"\u123a"
 #define UNICODE_ETHIOPIC_SYLLABLE_SHAA  0x123b
-#define UNITEXT_ETHIOPIC_SYLLABLE_SHAA  L"\u123b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SHAA  U"\u123b"
 #define UNICODE_ETHIOPIC_SYLLABLE_SHEE  0x123c
-#define UNITEXT_ETHIOPIC_SYLLABLE_SHEE  L"\u123c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SHEE  U"\u123c"
 #define UNICODE_ETHIOPIC_SYLLABLE_SHE  0x123d
-#define UNITEXT_ETHIOPIC_SYLLABLE_SHE  L"\u123d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SHE  U"\u123d"
 #define UNICODE_ETHIOPIC_SYLLABLE_SHO  0x123e
-#define UNITEXT_ETHIOPIC_SYLLABLE_SHO  L"\u123e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SHO  U"\u123e"
 #define UNICODE_ETHIOPIC_SYLLABLE_SHWA  0x123f
-#define UNITEXT_ETHIOPIC_SYLLABLE_SHWA  L"\u123f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SHWA  U"\u123f"
 #define UNICODE_ETHIOPIC_SYLLABLE_QA  0x1240
-#define UNITEXT_ETHIOPIC_SYLLABLE_QA  L"\u1240"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QA  U"\u1240"
 #define UNICODE_ETHIOPIC_SYLLABLE_QU  0x1241
-#define UNITEXT_ETHIOPIC_SYLLABLE_QU  L"\u1241"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QU  U"\u1241"
 #define UNICODE_ETHIOPIC_SYLLABLE_QI  0x1242
-#define UNITEXT_ETHIOPIC_SYLLABLE_QI  L"\u1242"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QI  U"\u1242"
 #define UNICODE_ETHIOPIC_SYLLABLE_QAA  0x1243
-#define UNITEXT_ETHIOPIC_SYLLABLE_QAA  L"\u1243"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QAA  U"\u1243"
 #define UNICODE_ETHIOPIC_SYLLABLE_QEE  0x1244
-#define UNITEXT_ETHIOPIC_SYLLABLE_QEE  L"\u1244"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QEE  U"\u1244"
 #define UNICODE_ETHIOPIC_SYLLABLE_QE  0x1245
-#define UNITEXT_ETHIOPIC_SYLLABLE_QE  L"\u1245"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QE  U"\u1245"
 #define UNICODE_ETHIOPIC_SYLLABLE_QO  0x1246
-#define UNITEXT_ETHIOPIC_SYLLABLE_QO  L"\u1246"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QO  U"\u1246"
 #define UNICODE_ETHIOPIC_SYLLABLE_QOA  0x1247
-#define UNITEXT_ETHIOPIC_SYLLABLE_QOA  L"\u1247"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QOA  U"\u1247"
 #define UNICODE_ETHIOPIC_SYLLABLE_QWA  0x1248
-#define UNITEXT_ETHIOPIC_SYLLABLE_QWA  L"\u1248"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QWA  U"\u1248"
 #define UNICODE_ETHIOPIC_SYLLABLE_QWI  0x124a
-#define UNITEXT_ETHIOPIC_SYLLABLE_QWI  L"\u124a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QWI  U"\u124a"
 #define UNICODE_ETHIOPIC_SYLLABLE_QWAA  0x124b
-#define UNITEXT_ETHIOPIC_SYLLABLE_QWAA  L"\u124b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QWAA  U"\u124b"
 #define UNICODE_ETHIOPIC_SYLLABLE_QWEE  0x124c
-#define UNITEXT_ETHIOPIC_SYLLABLE_QWEE  L"\u124c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QWEE  U"\u124c"
 #define UNICODE_ETHIOPIC_SYLLABLE_QWE  0x124d
-#define UNITEXT_ETHIOPIC_SYLLABLE_QWE  L"\u124d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QWE  U"\u124d"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHA  0x1250
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHA  L"\u1250"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHA  U"\u1250"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHU  0x1251
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHU  L"\u1251"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHU  U"\u1251"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHI  0x1252
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHI  L"\u1252"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHI  U"\u1252"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHAA  0x1253
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHAA  L"\u1253"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHAA  U"\u1253"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHEE  0x1254
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHEE  L"\u1254"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHEE  U"\u1254"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHE  0x1255
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHE  L"\u1255"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHE  U"\u1255"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHO  0x1256
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHO  L"\u1256"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHO  U"\u1256"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHWA  0x1258
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHWA  L"\u1258"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHWA  U"\u1258"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHWI  0x125a
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHWI  L"\u125a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHWI  U"\u125a"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHWAA  0x125b
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHWAA  L"\u125b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHWAA  U"\u125b"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHWEE  0x125c
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHWEE  L"\u125c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHWEE  U"\u125c"
 #define UNICODE_ETHIOPIC_SYLLABLE_QHWE  0x125d
-#define UNITEXT_ETHIOPIC_SYLLABLE_QHWE  L"\u125d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QHWE  U"\u125d"
 #define UNICODE_ETHIOPIC_SYLLABLE_BA  0x1260
-#define UNITEXT_ETHIOPIC_SYLLABLE_BA  L"\u1260"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BA  U"\u1260"
 #define UNICODE_ETHIOPIC_SYLLABLE_BU  0x1261
-#define UNITEXT_ETHIOPIC_SYLLABLE_BU  L"\u1261"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BU  U"\u1261"
 #define UNICODE_ETHIOPIC_SYLLABLE_BI  0x1262
-#define UNITEXT_ETHIOPIC_SYLLABLE_BI  L"\u1262"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BI  U"\u1262"
 #define UNICODE_ETHIOPIC_SYLLABLE_BAA  0x1263
-#define UNITEXT_ETHIOPIC_SYLLABLE_BAA  L"\u1263"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BAA  U"\u1263"
 #define UNICODE_ETHIOPIC_SYLLABLE_BEE  0x1264
-#define UNITEXT_ETHIOPIC_SYLLABLE_BEE  L"\u1264"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BEE  U"\u1264"
 #define UNICODE_ETHIOPIC_SYLLABLE_BE  0x1265
-#define UNITEXT_ETHIOPIC_SYLLABLE_BE  L"\u1265"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BE  U"\u1265"
 #define UNICODE_ETHIOPIC_SYLLABLE_BO  0x1266
-#define UNITEXT_ETHIOPIC_SYLLABLE_BO  L"\u1266"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BO  U"\u1266"
 #define UNICODE_ETHIOPIC_SYLLABLE_BWA  0x1267
-#define UNITEXT_ETHIOPIC_SYLLABLE_BWA  L"\u1267"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BWA  U"\u1267"
 #define UNICODE_ETHIOPIC_SYLLABLE_VA  0x1268
-#define UNITEXT_ETHIOPIC_SYLLABLE_VA  L"\u1268"
+#define UNITEXT_ETHIOPIC_SYLLABLE_VA  U"\u1268"
 #define UNICODE_ETHIOPIC_SYLLABLE_VU  0x1269
-#define UNITEXT_ETHIOPIC_SYLLABLE_VU  L"\u1269"
+#define UNITEXT_ETHIOPIC_SYLLABLE_VU  U"\u1269"
 #define UNICODE_ETHIOPIC_SYLLABLE_VI  0x126a
-#define UNITEXT_ETHIOPIC_SYLLABLE_VI  L"\u126a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_VI  U"\u126a"
 #define UNICODE_ETHIOPIC_SYLLABLE_VAA  0x126b
-#define UNITEXT_ETHIOPIC_SYLLABLE_VAA  L"\u126b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_VAA  U"\u126b"
 #define UNICODE_ETHIOPIC_SYLLABLE_VEE  0x126c
-#define UNITEXT_ETHIOPIC_SYLLABLE_VEE  L"\u126c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_VEE  U"\u126c"
 #define UNICODE_ETHIOPIC_SYLLABLE_VE  0x126d
-#define UNITEXT_ETHIOPIC_SYLLABLE_VE  L"\u126d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_VE  U"\u126d"
 #define UNICODE_ETHIOPIC_SYLLABLE_VO  0x126e
-#define UNITEXT_ETHIOPIC_SYLLABLE_VO  L"\u126e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_VO  U"\u126e"
 #define UNICODE_ETHIOPIC_SYLLABLE_VWA  0x126f
-#define UNITEXT_ETHIOPIC_SYLLABLE_VWA  L"\u126f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_VWA  U"\u126f"
 #define UNICODE_ETHIOPIC_SYLLABLE_TA  0x1270
-#define UNITEXT_ETHIOPIC_SYLLABLE_TA  L"\u1270"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TA  U"\u1270"
 #define UNICODE_ETHIOPIC_SYLLABLE_TU  0x1271
-#define UNITEXT_ETHIOPIC_SYLLABLE_TU  L"\u1271"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TU  U"\u1271"
 #define UNICODE_ETHIOPIC_SYLLABLE_TI  0x1272
-#define UNITEXT_ETHIOPIC_SYLLABLE_TI  L"\u1272"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TI  U"\u1272"
 #define UNICODE_ETHIOPIC_SYLLABLE_TAA  0x1273
-#define UNITEXT_ETHIOPIC_SYLLABLE_TAA  L"\u1273"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TAA  U"\u1273"
 #define UNICODE_ETHIOPIC_SYLLABLE_TEE  0x1274
-#define UNITEXT_ETHIOPIC_SYLLABLE_TEE  L"\u1274"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TEE  U"\u1274"
 #define UNICODE_ETHIOPIC_SYLLABLE_TE  0x1275
-#define UNITEXT_ETHIOPIC_SYLLABLE_TE  L"\u1275"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TE  U"\u1275"
 #define UNICODE_ETHIOPIC_SYLLABLE_TO  0x1276
-#define UNITEXT_ETHIOPIC_SYLLABLE_TO  L"\u1276"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TO  U"\u1276"
 #define UNICODE_ETHIOPIC_SYLLABLE_TWA  0x1277
-#define UNITEXT_ETHIOPIC_SYLLABLE_TWA  L"\u1277"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TWA  U"\u1277"
 #define UNICODE_ETHIOPIC_SYLLABLE_CA  0x1278
-#define UNITEXT_ETHIOPIC_SYLLABLE_CA  L"\u1278"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CA  U"\u1278"
 #define UNICODE_ETHIOPIC_SYLLABLE_CU  0x1279
-#define UNITEXT_ETHIOPIC_SYLLABLE_CU  L"\u1279"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CU  U"\u1279"
 #define UNICODE_ETHIOPIC_SYLLABLE_CI  0x127a
-#define UNITEXT_ETHIOPIC_SYLLABLE_CI  L"\u127a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CI  U"\u127a"
 #define UNICODE_ETHIOPIC_SYLLABLE_CAA  0x127b
-#define UNITEXT_ETHIOPIC_SYLLABLE_CAA  L"\u127b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CAA  U"\u127b"
 #define UNICODE_ETHIOPIC_SYLLABLE_CEE  0x127c
-#define UNITEXT_ETHIOPIC_SYLLABLE_CEE  L"\u127c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CEE  U"\u127c"
 #define UNICODE_ETHIOPIC_SYLLABLE_CE  0x127d
-#define UNITEXT_ETHIOPIC_SYLLABLE_CE  L"\u127d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CE  U"\u127d"
 #define UNICODE_ETHIOPIC_SYLLABLE_CO  0x127e
-#define UNITEXT_ETHIOPIC_SYLLABLE_CO  L"\u127e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CO  U"\u127e"
 #define UNICODE_ETHIOPIC_SYLLABLE_CWA  0x127f
-#define UNITEXT_ETHIOPIC_SYLLABLE_CWA  L"\u127f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CWA  U"\u127f"
 #define UNICODE_ETHIOPIC_SYLLABLE_XA  0x1280
-#define UNITEXT_ETHIOPIC_SYLLABLE_XA  L"\u1280"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XA  U"\u1280"
 #define UNICODE_ETHIOPIC_SYLLABLE_XU  0x1281
-#define UNITEXT_ETHIOPIC_SYLLABLE_XU  L"\u1281"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XU  U"\u1281"
 #define UNICODE_ETHIOPIC_SYLLABLE_XI  0x1282
-#define UNITEXT_ETHIOPIC_SYLLABLE_XI  L"\u1282"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XI  U"\u1282"
 #define UNICODE_ETHIOPIC_SYLLABLE_XAA  0x1283
-#define UNITEXT_ETHIOPIC_SYLLABLE_XAA  L"\u1283"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XAA  U"\u1283"
 #define UNICODE_ETHIOPIC_SYLLABLE_XEE  0x1284
-#define UNITEXT_ETHIOPIC_SYLLABLE_XEE  L"\u1284"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XEE  U"\u1284"
 #define UNICODE_ETHIOPIC_SYLLABLE_XE  0x1285
-#define UNITEXT_ETHIOPIC_SYLLABLE_XE  L"\u1285"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XE  U"\u1285"
 #define UNICODE_ETHIOPIC_SYLLABLE_XO  0x1286
-#define UNITEXT_ETHIOPIC_SYLLABLE_XO  L"\u1286"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XO  U"\u1286"
 #define UNICODE_ETHIOPIC_SYLLABLE_XOA  0x1287
-#define UNITEXT_ETHIOPIC_SYLLABLE_XOA  L"\u1287"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XOA  U"\u1287"
 #define UNICODE_ETHIOPIC_SYLLABLE_XWA  0x1288
-#define UNITEXT_ETHIOPIC_SYLLABLE_XWA  L"\u1288"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XWA  U"\u1288"
 #define UNICODE_ETHIOPIC_SYLLABLE_XWI  0x128a
-#define UNITEXT_ETHIOPIC_SYLLABLE_XWI  L"\u128a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XWI  U"\u128a"
 #define UNICODE_ETHIOPIC_SYLLABLE_XWAA  0x128b
-#define UNITEXT_ETHIOPIC_SYLLABLE_XWAA  L"\u128b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XWAA  U"\u128b"
 #define UNICODE_ETHIOPIC_SYLLABLE_XWEE  0x128c
-#define UNITEXT_ETHIOPIC_SYLLABLE_XWEE  L"\u128c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XWEE  U"\u128c"
 #define UNICODE_ETHIOPIC_SYLLABLE_XWE  0x128d
-#define UNITEXT_ETHIOPIC_SYLLABLE_XWE  L"\u128d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XWE  U"\u128d"
 #define UNICODE_ETHIOPIC_SYLLABLE_NA  0x1290
-#define UNITEXT_ETHIOPIC_SYLLABLE_NA  L"\u1290"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NA  U"\u1290"
 #define UNICODE_ETHIOPIC_SYLLABLE_NU  0x1291
-#define UNITEXT_ETHIOPIC_SYLLABLE_NU  L"\u1291"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NU  U"\u1291"
 #define UNICODE_ETHIOPIC_SYLLABLE_NI  0x1292
-#define UNITEXT_ETHIOPIC_SYLLABLE_NI  L"\u1292"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NI  U"\u1292"
 #define UNICODE_ETHIOPIC_SYLLABLE_NAA  0x1293
-#define UNITEXT_ETHIOPIC_SYLLABLE_NAA  L"\u1293"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NAA  U"\u1293"
 #define UNICODE_ETHIOPIC_SYLLABLE_NEE  0x1294
-#define UNITEXT_ETHIOPIC_SYLLABLE_NEE  L"\u1294"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NEE  U"\u1294"
 #define UNICODE_ETHIOPIC_SYLLABLE_NE  0x1295
-#define UNITEXT_ETHIOPIC_SYLLABLE_NE  L"\u1295"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NE  U"\u1295"
 #define UNICODE_ETHIOPIC_SYLLABLE_NO  0x1296
-#define UNITEXT_ETHIOPIC_SYLLABLE_NO  L"\u1296"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NO  U"\u1296"
 #define UNICODE_ETHIOPIC_SYLLABLE_NWA  0x1297
-#define UNITEXT_ETHIOPIC_SYLLABLE_NWA  L"\u1297"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NWA  U"\u1297"
 #define UNICODE_ETHIOPIC_SYLLABLE_NYA  0x1298
-#define UNITEXT_ETHIOPIC_SYLLABLE_NYA  L"\u1298"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NYA  U"\u1298"
 #define UNICODE_ETHIOPIC_SYLLABLE_NYU  0x1299
-#define UNITEXT_ETHIOPIC_SYLLABLE_NYU  L"\u1299"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NYU  U"\u1299"
 #define UNICODE_ETHIOPIC_SYLLABLE_NYI  0x129a
-#define UNITEXT_ETHIOPIC_SYLLABLE_NYI  L"\u129a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NYI  U"\u129a"
 #define UNICODE_ETHIOPIC_SYLLABLE_NYAA  0x129b
-#define UNITEXT_ETHIOPIC_SYLLABLE_NYAA  L"\u129b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NYAA  U"\u129b"
 #define UNICODE_ETHIOPIC_SYLLABLE_NYEE  0x129c
-#define UNITEXT_ETHIOPIC_SYLLABLE_NYEE  L"\u129c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NYEE  U"\u129c"
 #define UNICODE_ETHIOPIC_SYLLABLE_NYE  0x129d
-#define UNITEXT_ETHIOPIC_SYLLABLE_NYE  L"\u129d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NYE  U"\u129d"
 #define UNICODE_ETHIOPIC_SYLLABLE_NYO  0x129e
-#define UNITEXT_ETHIOPIC_SYLLABLE_NYO  L"\u129e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NYO  U"\u129e"
 #define UNICODE_ETHIOPIC_SYLLABLE_NYWA  0x129f
-#define UNITEXT_ETHIOPIC_SYLLABLE_NYWA  L"\u129f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NYWA  U"\u129f"
 #define UNICODE_ETHIOPIC_SYLLABLE_GLOTTAL_A  0x12a0
-#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_A  L"\u12a0"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_A  U"\u12a0"
 #define UNICODE_ETHIOPIC_SYLLABLE_GLOTTAL_U  0x12a1
-#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_U  L"\u12a1"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_U  U"\u12a1"
 #define UNICODE_ETHIOPIC_SYLLABLE_GLOTTAL_I  0x12a2
-#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_I  L"\u12a2"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_I  U"\u12a2"
 #define UNICODE_ETHIOPIC_SYLLABLE_GLOTTAL_AA  0x12a3
-#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_AA  L"\u12a3"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_AA  U"\u12a3"
 #define UNICODE_ETHIOPIC_SYLLABLE_GLOTTAL_EE  0x12a4
-#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_EE  L"\u12a4"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_EE  U"\u12a4"
 #define UNICODE_ETHIOPIC_SYLLABLE_GLOTTAL_E  0x12a5
-#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_E  L"\u12a5"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_E  U"\u12a5"
 #define UNICODE_ETHIOPIC_SYLLABLE_GLOTTAL_O  0x12a6
-#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_O  L"\u12a6"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_O  U"\u12a6"
 #define UNICODE_ETHIOPIC_SYLLABLE_GLOTTAL_WA  0x12a7
-#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_WA  L"\u12a7"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_WA  U"\u12a7"
 #define UNICODE_ETHIOPIC_SYLLABLE_KA  0x12a8
-#define UNITEXT_ETHIOPIC_SYLLABLE_KA  L"\u12a8"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KA  U"\u12a8"
 #define UNICODE_ETHIOPIC_SYLLABLE_KU  0x12a9
-#define UNITEXT_ETHIOPIC_SYLLABLE_KU  L"\u12a9"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KU  U"\u12a9"
 #define UNICODE_ETHIOPIC_SYLLABLE_KI  0x12aa
-#define UNITEXT_ETHIOPIC_SYLLABLE_KI  L"\u12aa"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KI  U"\u12aa"
 #define UNICODE_ETHIOPIC_SYLLABLE_KAA  0x12ab
-#define UNITEXT_ETHIOPIC_SYLLABLE_KAA  L"\u12ab"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KAA  U"\u12ab"
 #define UNICODE_ETHIOPIC_SYLLABLE_KEE  0x12ac
-#define UNITEXT_ETHIOPIC_SYLLABLE_KEE  L"\u12ac"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KEE  U"\u12ac"
 #define UNICODE_ETHIOPIC_SYLLABLE_KE  0x12ad
-#define UNITEXT_ETHIOPIC_SYLLABLE_KE  L"\u12ad"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KE  U"\u12ad"
 #define UNICODE_ETHIOPIC_SYLLABLE_KO  0x12ae
-#define UNITEXT_ETHIOPIC_SYLLABLE_KO  L"\u12ae"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KO  U"\u12ae"
 #define UNICODE_ETHIOPIC_SYLLABLE_KOA  0x12af
-#define UNITEXT_ETHIOPIC_SYLLABLE_KOA  L"\u12af"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KOA  U"\u12af"
 #define UNICODE_ETHIOPIC_SYLLABLE_KWA  0x12b0
-#define UNITEXT_ETHIOPIC_SYLLABLE_KWA  L"\u12b0"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KWA  U"\u12b0"
 #define UNICODE_ETHIOPIC_SYLLABLE_KWI  0x12b2
-#define UNITEXT_ETHIOPIC_SYLLABLE_KWI  L"\u12b2"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KWI  U"\u12b2"
 #define UNICODE_ETHIOPIC_SYLLABLE_KWAA  0x12b3
-#define UNITEXT_ETHIOPIC_SYLLABLE_KWAA  L"\u12b3"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KWAA  U"\u12b3"
 #define UNICODE_ETHIOPIC_SYLLABLE_KWEE  0x12b4
-#define UNITEXT_ETHIOPIC_SYLLABLE_KWEE  L"\u12b4"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KWEE  U"\u12b4"
 #define UNICODE_ETHIOPIC_SYLLABLE_KWE  0x12b5
-#define UNITEXT_ETHIOPIC_SYLLABLE_KWE  L"\u12b5"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KWE  U"\u12b5"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXA  0x12b8
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXA  L"\u12b8"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXA  U"\u12b8"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXU  0x12b9
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXU  L"\u12b9"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXU  U"\u12b9"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXI  0x12ba
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXI  L"\u12ba"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXI  U"\u12ba"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXAA  0x12bb
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXAA  L"\u12bb"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXAA  U"\u12bb"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXEE  0x12bc
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXEE  L"\u12bc"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXEE  U"\u12bc"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXE  0x12bd
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXE  L"\u12bd"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXE  U"\u12bd"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXO  0x12be
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXO  L"\u12be"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXO  U"\u12be"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXWA  0x12c0
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXWA  L"\u12c0"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXWA  U"\u12c0"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXWI  0x12c2
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXWI  L"\u12c2"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXWI  U"\u12c2"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXWAA  0x12c3
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXWAA  L"\u12c3"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXWAA  U"\u12c3"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXWEE  0x12c4
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXWEE  L"\u12c4"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXWEE  U"\u12c4"
 #define UNICODE_ETHIOPIC_SYLLABLE_KXWE  0x12c5
-#define UNITEXT_ETHIOPIC_SYLLABLE_KXWE  L"\u12c5"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KXWE  U"\u12c5"
 #define UNICODE_ETHIOPIC_SYLLABLE_WA  0x12c8
-#define UNITEXT_ETHIOPIC_SYLLABLE_WA  L"\u12c8"
+#define UNITEXT_ETHIOPIC_SYLLABLE_WA  U"\u12c8"
 #define UNICODE_ETHIOPIC_SYLLABLE_WU  0x12c9
-#define UNITEXT_ETHIOPIC_SYLLABLE_WU  L"\u12c9"
+#define UNITEXT_ETHIOPIC_SYLLABLE_WU  U"\u12c9"
 #define UNICODE_ETHIOPIC_SYLLABLE_WI  0x12ca
-#define UNITEXT_ETHIOPIC_SYLLABLE_WI  L"\u12ca"
+#define UNITEXT_ETHIOPIC_SYLLABLE_WI  U"\u12ca"
 #define UNICODE_ETHIOPIC_SYLLABLE_WAA  0x12cb
-#define UNITEXT_ETHIOPIC_SYLLABLE_WAA  L"\u12cb"
+#define UNITEXT_ETHIOPIC_SYLLABLE_WAA  U"\u12cb"
 #define UNICODE_ETHIOPIC_SYLLABLE_WEE  0x12cc
-#define UNITEXT_ETHIOPIC_SYLLABLE_WEE  L"\u12cc"
+#define UNITEXT_ETHIOPIC_SYLLABLE_WEE  U"\u12cc"
 #define UNICODE_ETHIOPIC_SYLLABLE_WE  0x12cd
-#define UNITEXT_ETHIOPIC_SYLLABLE_WE  L"\u12cd"
+#define UNITEXT_ETHIOPIC_SYLLABLE_WE  U"\u12cd"
 #define UNICODE_ETHIOPIC_SYLLABLE_WO  0x12ce
-#define UNITEXT_ETHIOPIC_SYLLABLE_WO  L"\u12ce"
+#define UNITEXT_ETHIOPIC_SYLLABLE_WO  U"\u12ce"
 #define UNICODE_ETHIOPIC_SYLLABLE_WOA  0x12cf
-#define UNITEXT_ETHIOPIC_SYLLABLE_WOA  L"\u12cf"
+#define UNITEXT_ETHIOPIC_SYLLABLE_WOA  U"\u12cf"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHARYNGEAL_A  0x12d0
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_A  L"\u12d0"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_A  U"\u12d0"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHARYNGEAL_U  0x12d1
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_U  L"\u12d1"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_U  U"\u12d1"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHARYNGEAL_I  0x12d2
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_I  L"\u12d2"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_I  U"\u12d2"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHARYNGEAL_AA  0x12d3
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_AA  L"\u12d3"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_AA  U"\u12d3"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHARYNGEAL_EE  0x12d4
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_EE  L"\u12d4"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_EE  U"\u12d4"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHARYNGEAL_E  0x12d5
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_E  L"\u12d5"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_E  U"\u12d5"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHARYNGEAL_O  0x12d6
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_O  L"\u12d6"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHARYNGEAL_O  U"\u12d6"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZA  0x12d8
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZA  L"\u12d8"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZA  U"\u12d8"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZU  0x12d9
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZU  L"\u12d9"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZU  U"\u12d9"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZI  0x12da
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZI  L"\u12da"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZI  U"\u12da"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZAA  0x12db
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZAA  L"\u12db"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZAA  U"\u12db"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZEE  0x12dc
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZEE  L"\u12dc"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZEE  U"\u12dc"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZE  0x12dd
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZE  L"\u12dd"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZE  U"\u12dd"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZO  0x12de
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZO  L"\u12de"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZO  U"\u12de"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZWA  0x12df
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZWA  L"\u12df"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZWA  U"\u12df"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZHA  0x12e0
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZHA  L"\u12e0"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZHA  U"\u12e0"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZHU  0x12e1
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZHU  L"\u12e1"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZHU  U"\u12e1"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZHI  0x12e2
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZHI  L"\u12e2"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZHI  U"\u12e2"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZHAA  0x12e3
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZHAA  L"\u12e3"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZHAA  U"\u12e3"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZHEE  0x12e4
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZHEE  L"\u12e4"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZHEE  U"\u12e4"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZHE  0x12e5
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZHE  L"\u12e5"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZHE  U"\u12e5"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZHO  0x12e6
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZHO  L"\u12e6"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZHO  U"\u12e6"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZHWA  0x12e7
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZHWA  L"\u12e7"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZHWA  U"\u12e7"
 #define UNICODE_ETHIOPIC_SYLLABLE_YA  0x12e8
-#define UNITEXT_ETHIOPIC_SYLLABLE_YA  L"\u12e8"
+#define UNITEXT_ETHIOPIC_SYLLABLE_YA  U"\u12e8"
 #define UNICODE_ETHIOPIC_SYLLABLE_YU  0x12e9
-#define UNITEXT_ETHIOPIC_SYLLABLE_YU  L"\u12e9"
+#define UNITEXT_ETHIOPIC_SYLLABLE_YU  U"\u12e9"
 #define UNICODE_ETHIOPIC_SYLLABLE_YI  0x12ea
-#define UNITEXT_ETHIOPIC_SYLLABLE_YI  L"\u12ea"
+#define UNITEXT_ETHIOPIC_SYLLABLE_YI  U"\u12ea"
 #define UNICODE_ETHIOPIC_SYLLABLE_YAA  0x12eb
-#define UNITEXT_ETHIOPIC_SYLLABLE_YAA  L"\u12eb"
+#define UNITEXT_ETHIOPIC_SYLLABLE_YAA  U"\u12eb"
 #define UNICODE_ETHIOPIC_SYLLABLE_YEE  0x12ec
-#define UNITEXT_ETHIOPIC_SYLLABLE_YEE  L"\u12ec"
+#define UNITEXT_ETHIOPIC_SYLLABLE_YEE  U"\u12ec"
 #define UNICODE_ETHIOPIC_SYLLABLE_YE  0x12ed
-#define UNITEXT_ETHIOPIC_SYLLABLE_YE  L"\u12ed"
+#define UNITEXT_ETHIOPIC_SYLLABLE_YE  U"\u12ed"
 #define UNICODE_ETHIOPIC_SYLLABLE_YO  0x12ee
-#define UNITEXT_ETHIOPIC_SYLLABLE_YO  L"\u12ee"
+#define UNITEXT_ETHIOPIC_SYLLABLE_YO  U"\u12ee"
 #define UNICODE_ETHIOPIC_SYLLABLE_YOA  0x12ef
-#define UNITEXT_ETHIOPIC_SYLLABLE_YOA  L"\u12ef"
+#define UNITEXT_ETHIOPIC_SYLLABLE_YOA  U"\u12ef"
 #define UNICODE_ETHIOPIC_SYLLABLE_DA  0x12f0
-#define UNITEXT_ETHIOPIC_SYLLABLE_DA  L"\u12f0"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DA  U"\u12f0"
 #define UNICODE_ETHIOPIC_SYLLABLE_DU  0x12f1
-#define UNITEXT_ETHIOPIC_SYLLABLE_DU  L"\u12f1"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DU  U"\u12f1"
 #define UNICODE_ETHIOPIC_SYLLABLE_DI  0x12f2
-#define UNITEXT_ETHIOPIC_SYLLABLE_DI  L"\u12f2"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DI  U"\u12f2"
 #define UNICODE_ETHIOPIC_SYLLABLE_DAA  0x12f3
-#define UNITEXT_ETHIOPIC_SYLLABLE_DAA  L"\u12f3"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DAA  U"\u12f3"
 #define UNICODE_ETHIOPIC_SYLLABLE_DEE  0x12f4
-#define UNITEXT_ETHIOPIC_SYLLABLE_DEE  L"\u12f4"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DEE  U"\u12f4"
 #define UNICODE_ETHIOPIC_SYLLABLE_DE  0x12f5
-#define UNITEXT_ETHIOPIC_SYLLABLE_DE  L"\u12f5"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DE  U"\u12f5"
 #define UNICODE_ETHIOPIC_SYLLABLE_DO  0x12f6
-#define UNITEXT_ETHIOPIC_SYLLABLE_DO  L"\u12f6"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DO  U"\u12f6"
 #define UNICODE_ETHIOPIC_SYLLABLE_DWA  0x12f7
-#define UNITEXT_ETHIOPIC_SYLLABLE_DWA  L"\u12f7"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DWA  U"\u12f7"
 #define UNICODE_ETHIOPIC_SYLLABLE_DDA  0x12f8
-#define UNITEXT_ETHIOPIC_SYLLABLE_DDA  L"\u12f8"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DDA  U"\u12f8"
 #define UNICODE_ETHIOPIC_SYLLABLE_DDU  0x12f9
-#define UNITEXT_ETHIOPIC_SYLLABLE_DDU  L"\u12f9"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DDU  U"\u12f9"
 #define UNICODE_ETHIOPIC_SYLLABLE_DDI  0x12fa
-#define UNITEXT_ETHIOPIC_SYLLABLE_DDI  L"\u12fa"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DDI  U"\u12fa"
 #define UNICODE_ETHIOPIC_SYLLABLE_DDAA  0x12fb
-#define UNITEXT_ETHIOPIC_SYLLABLE_DDAA  L"\u12fb"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DDAA  U"\u12fb"
 #define UNICODE_ETHIOPIC_SYLLABLE_DDEE  0x12fc
-#define UNITEXT_ETHIOPIC_SYLLABLE_DDEE  L"\u12fc"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DDEE  U"\u12fc"
 #define UNICODE_ETHIOPIC_SYLLABLE_DDE  0x12fd
-#define UNITEXT_ETHIOPIC_SYLLABLE_DDE  L"\u12fd"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DDE  U"\u12fd"
 #define UNICODE_ETHIOPIC_SYLLABLE_DDO  0x12fe
-#define UNITEXT_ETHIOPIC_SYLLABLE_DDO  L"\u12fe"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DDO  U"\u12fe"
 #define UNICODE_ETHIOPIC_SYLLABLE_DDWA  0x12ff
-#define UNITEXT_ETHIOPIC_SYLLABLE_DDWA  L"\u12ff"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DDWA  U"\u12ff"
 #define UNICODE_ETHIOPIC_SYLLABLE_JA  0x1300
-#define UNITEXT_ETHIOPIC_SYLLABLE_JA  L"\u1300"
+#define UNITEXT_ETHIOPIC_SYLLABLE_JA  U"\u1300"
 #define UNICODE_ETHIOPIC_SYLLABLE_JU  0x1301
-#define UNITEXT_ETHIOPIC_SYLLABLE_JU  L"\u1301"
+#define UNITEXT_ETHIOPIC_SYLLABLE_JU  U"\u1301"
 #define UNICODE_ETHIOPIC_SYLLABLE_JI  0x1302
-#define UNITEXT_ETHIOPIC_SYLLABLE_JI  L"\u1302"
+#define UNITEXT_ETHIOPIC_SYLLABLE_JI  U"\u1302"
 #define UNICODE_ETHIOPIC_SYLLABLE_JAA  0x1303
-#define UNITEXT_ETHIOPIC_SYLLABLE_JAA  L"\u1303"
+#define UNITEXT_ETHIOPIC_SYLLABLE_JAA  U"\u1303"
 #define UNICODE_ETHIOPIC_SYLLABLE_JEE  0x1304
-#define UNITEXT_ETHIOPIC_SYLLABLE_JEE  L"\u1304"
+#define UNITEXT_ETHIOPIC_SYLLABLE_JEE  U"\u1304"
 #define UNICODE_ETHIOPIC_SYLLABLE_JE  0x1305
-#define UNITEXT_ETHIOPIC_SYLLABLE_JE  L"\u1305"
+#define UNITEXT_ETHIOPIC_SYLLABLE_JE  U"\u1305"
 #define UNICODE_ETHIOPIC_SYLLABLE_JO  0x1306
-#define UNITEXT_ETHIOPIC_SYLLABLE_JO  L"\u1306"
+#define UNITEXT_ETHIOPIC_SYLLABLE_JO  U"\u1306"
 #define UNICODE_ETHIOPIC_SYLLABLE_JWA  0x1307
-#define UNITEXT_ETHIOPIC_SYLLABLE_JWA  L"\u1307"
+#define UNITEXT_ETHIOPIC_SYLLABLE_JWA  U"\u1307"
 #define UNICODE_ETHIOPIC_SYLLABLE_GA  0x1308
-#define UNITEXT_ETHIOPIC_SYLLABLE_GA  L"\u1308"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GA  U"\u1308"
 #define UNICODE_ETHIOPIC_SYLLABLE_GU  0x1309
-#define UNITEXT_ETHIOPIC_SYLLABLE_GU  L"\u1309"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GU  U"\u1309"
 #define UNICODE_ETHIOPIC_SYLLABLE_GI  0x130a
-#define UNITEXT_ETHIOPIC_SYLLABLE_GI  L"\u130a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GI  U"\u130a"
 #define UNICODE_ETHIOPIC_SYLLABLE_GAA  0x130b
-#define UNITEXT_ETHIOPIC_SYLLABLE_GAA  L"\u130b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GAA  U"\u130b"
 #define UNICODE_ETHIOPIC_SYLLABLE_GEE  0x130c
-#define UNITEXT_ETHIOPIC_SYLLABLE_GEE  L"\u130c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GEE  U"\u130c"
 #define UNICODE_ETHIOPIC_SYLLABLE_GE  0x130d
-#define UNITEXT_ETHIOPIC_SYLLABLE_GE  L"\u130d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GE  U"\u130d"
 #define UNICODE_ETHIOPIC_SYLLABLE_GO  0x130e
-#define UNITEXT_ETHIOPIC_SYLLABLE_GO  L"\u130e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GO  U"\u130e"
 #define UNICODE_ETHIOPIC_SYLLABLE_GOA  0x130f
-#define UNITEXT_ETHIOPIC_SYLLABLE_GOA  L"\u130f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GOA  U"\u130f"
 #define UNICODE_ETHIOPIC_SYLLABLE_GWA  0x1310
-#define UNITEXT_ETHIOPIC_SYLLABLE_GWA  L"\u1310"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GWA  U"\u1310"
 #define UNICODE_ETHIOPIC_SYLLABLE_GWI  0x1312
-#define UNITEXT_ETHIOPIC_SYLLABLE_GWI  L"\u1312"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GWI  U"\u1312"
 #define UNICODE_ETHIOPIC_SYLLABLE_GWAA  0x1313
-#define UNITEXT_ETHIOPIC_SYLLABLE_GWAA  L"\u1313"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GWAA  U"\u1313"
 #define UNICODE_ETHIOPIC_SYLLABLE_GWEE  0x1314
-#define UNITEXT_ETHIOPIC_SYLLABLE_GWEE  L"\u1314"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GWEE  U"\u1314"
 #define UNICODE_ETHIOPIC_SYLLABLE_GWE  0x1315
-#define UNITEXT_ETHIOPIC_SYLLABLE_GWE  L"\u1315"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GWE  U"\u1315"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGA  0x1318
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGA  L"\u1318"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGA  U"\u1318"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGU  0x1319
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGU  L"\u1319"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGU  U"\u1319"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGI  0x131a
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGI  L"\u131a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGI  U"\u131a"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGAA  0x131b
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGAA  L"\u131b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGAA  U"\u131b"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGEE  0x131c
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGEE  L"\u131c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGEE  U"\u131c"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGE  0x131d
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGE  L"\u131d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGE  U"\u131d"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGO  0x131e
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGO  L"\u131e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGO  U"\u131e"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGWAA  0x131f
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGWAA  L"\u131f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGWAA  U"\u131f"
 #define UNICODE_ETHIOPIC_SYLLABLE_THA  0x1320
-#define UNITEXT_ETHIOPIC_SYLLABLE_THA  L"\u1320"
+#define UNITEXT_ETHIOPIC_SYLLABLE_THA  U"\u1320"
 #define UNICODE_ETHIOPIC_SYLLABLE_THU  0x1321
-#define UNITEXT_ETHIOPIC_SYLLABLE_THU  L"\u1321"
+#define UNITEXT_ETHIOPIC_SYLLABLE_THU  U"\u1321"
 #define UNICODE_ETHIOPIC_SYLLABLE_THI  0x1322
-#define UNITEXT_ETHIOPIC_SYLLABLE_THI  L"\u1322"
+#define UNITEXT_ETHIOPIC_SYLLABLE_THI  U"\u1322"
 #define UNICODE_ETHIOPIC_SYLLABLE_THAA  0x1323
-#define UNITEXT_ETHIOPIC_SYLLABLE_THAA  L"\u1323"
+#define UNITEXT_ETHIOPIC_SYLLABLE_THAA  U"\u1323"
 #define UNICODE_ETHIOPIC_SYLLABLE_THEE  0x1324
-#define UNITEXT_ETHIOPIC_SYLLABLE_THEE  L"\u1324"
+#define UNITEXT_ETHIOPIC_SYLLABLE_THEE  U"\u1324"
 #define UNICODE_ETHIOPIC_SYLLABLE_THE  0x1325
-#define UNITEXT_ETHIOPIC_SYLLABLE_THE  L"\u1325"
+#define UNITEXT_ETHIOPIC_SYLLABLE_THE  U"\u1325"
 #define UNICODE_ETHIOPIC_SYLLABLE_THO  0x1326
-#define UNITEXT_ETHIOPIC_SYLLABLE_THO  L"\u1326"
+#define UNITEXT_ETHIOPIC_SYLLABLE_THO  U"\u1326"
 #define UNICODE_ETHIOPIC_SYLLABLE_THWA  0x1327
-#define UNITEXT_ETHIOPIC_SYLLABLE_THWA  L"\u1327"
+#define UNITEXT_ETHIOPIC_SYLLABLE_THWA  U"\u1327"
 #define UNICODE_ETHIOPIC_SYLLABLE_CHA  0x1328
-#define UNITEXT_ETHIOPIC_SYLLABLE_CHA  L"\u1328"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CHA  U"\u1328"
 #define UNICODE_ETHIOPIC_SYLLABLE_CHU  0x1329
-#define UNITEXT_ETHIOPIC_SYLLABLE_CHU  L"\u1329"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CHU  U"\u1329"
 #define UNICODE_ETHIOPIC_SYLLABLE_CHI  0x132a
-#define UNITEXT_ETHIOPIC_SYLLABLE_CHI  L"\u132a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CHI  U"\u132a"
 #define UNICODE_ETHIOPIC_SYLLABLE_CHAA  0x132b
-#define UNITEXT_ETHIOPIC_SYLLABLE_CHAA  L"\u132b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CHAA  U"\u132b"
 #define UNICODE_ETHIOPIC_SYLLABLE_CHEE  0x132c
-#define UNITEXT_ETHIOPIC_SYLLABLE_CHEE  L"\u132c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CHEE  U"\u132c"
 #define UNICODE_ETHIOPIC_SYLLABLE_CHE  0x132d
-#define UNITEXT_ETHIOPIC_SYLLABLE_CHE  L"\u132d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CHE  U"\u132d"
 #define UNICODE_ETHIOPIC_SYLLABLE_CHO  0x132e
-#define UNITEXT_ETHIOPIC_SYLLABLE_CHO  L"\u132e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CHO  U"\u132e"
 #define UNICODE_ETHIOPIC_SYLLABLE_CHWA  0x132f
-#define UNITEXT_ETHIOPIC_SYLLABLE_CHWA  L"\u132f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CHWA  U"\u132f"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHA  0x1330
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHA  L"\u1330"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHA  U"\u1330"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHU  0x1331
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHU  L"\u1331"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHU  U"\u1331"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHI  0x1332
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHI  L"\u1332"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHI  U"\u1332"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHAA  0x1333
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHAA  L"\u1333"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHAA  U"\u1333"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHEE  0x1334
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHEE  L"\u1334"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHEE  U"\u1334"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHE  0x1335
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHE  L"\u1335"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHE  U"\u1335"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHO  0x1336
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHO  L"\u1336"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHO  U"\u1336"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHWA  0x1337
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHWA  L"\u1337"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHWA  U"\u1337"
 #define UNICODE_ETHIOPIC_SYLLABLE_TSA  0x1338
-#define UNITEXT_ETHIOPIC_SYLLABLE_TSA  L"\u1338"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TSA  U"\u1338"
 #define UNICODE_ETHIOPIC_SYLLABLE_TSU  0x1339
-#define UNITEXT_ETHIOPIC_SYLLABLE_TSU  L"\u1339"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TSU  U"\u1339"
 #define UNICODE_ETHIOPIC_SYLLABLE_TSI  0x133a
-#define UNITEXT_ETHIOPIC_SYLLABLE_TSI  L"\u133a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TSI  U"\u133a"
 #define UNICODE_ETHIOPIC_SYLLABLE_TSAA  0x133b
-#define UNITEXT_ETHIOPIC_SYLLABLE_TSAA  L"\u133b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TSAA  U"\u133b"
 #define UNICODE_ETHIOPIC_SYLLABLE_TSEE  0x133c
-#define UNITEXT_ETHIOPIC_SYLLABLE_TSEE  L"\u133c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TSEE  U"\u133c"
 #define UNICODE_ETHIOPIC_SYLLABLE_TSE  0x133d
-#define UNITEXT_ETHIOPIC_SYLLABLE_TSE  L"\u133d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TSE  U"\u133d"
 #define UNICODE_ETHIOPIC_SYLLABLE_TSO  0x133e
-#define UNITEXT_ETHIOPIC_SYLLABLE_TSO  L"\u133e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TSO  U"\u133e"
 #define UNICODE_ETHIOPIC_SYLLABLE_TSWA  0x133f
-#define UNITEXT_ETHIOPIC_SYLLABLE_TSWA  L"\u133f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TSWA  U"\u133f"
 #define UNICODE_ETHIOPIC_SYLLABLE_TZA  0x1340
-#define UNITEXT_ETHIOPIC_SYLLABLE_TZA  L"\u1340"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TZA  U"\u1340"
 #define UNICODE_ETHIOPIC_SYLLABLE_TZU  0x1341
-#define UNITEXT_ETHIOPIC_SYLLABLE_TZU  L"\u1341"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TZU  U"\u1341"
 #define UNICODE_ETHIOPIC_SYLLABLE_TZI  0x1342
-#define UNITEXT_ETHIOPIC_SYLLABLE_TZI  L"\u1342"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TZI  U"\u1342"
 #define UNICODE_ETHIOPIC_SYLLABLE_TZAA  0x1343
-#define UNITEXT_ETHIOPIC_SYLLABLE_TZAA  L"\u1343"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TZAA  U"\u1343"
 #define UNICODE_ETHIOPIC_SYLLABLE_TZEE  0x1344
-#define UNITEXT_ETHIOPIC_SYLLABLE_TZEE  L"\u1344"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TZEE  U"\u1344"
 #define UNICODE_ETHIOPIC_SYLLABLE_TZE  0x1345
-#define UNITEXT_ETHIOPIC_SYLLABLE_TZE  L"\u1345"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TZE  U"\u1345"
 #define UNICODE_ETHIOPIC_SYLLABLE_TZO  0x1346
-#define UNITEXT_ETHIOPIC_SYLLABLE_TZO  L"\u1346"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TZO  U"\u1346"
 #define UNICODE_ETHIOPIC_SYLLABLE_TZOA  0x1347
-#define UNITEXT_ETHIOPIC_SYLLABLE_TZOA  L"\u1347"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TZOA  U"\u1347"
 #define UNICODE_ETHIOPIC_SYLLABLE_FA  0x1348
-#define UNITEXT_ETHIOPIC_SYLLABLE_FA  L"\u1348"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FA  U"\u1348"
 #define UNICODE_ETHIOPIC_SYLLABLE_FU  0x1349
-#define UNITEXT_ETHIOPIC_SYLLABLE_FU  L"\u1349"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FU  U"\u1349"
 #define UNICODE_ETHIOPIC_SYLLABLE_FI  0x134a
-#define UNITEXT_ETHIOPIC_SYLLABLE_FI  L"\u134a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FI  U"\u134a"
 #define UNICODE_ETHIOPIC_SYLLABLE_FAA  0x134b
-#define UNITEXT_ETHIOPIC_SYLLABLE_FAA  L"\u134b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FAA  U"\u134b"
 #define UNICODE_ETHIOPIC_SYLLABLE_FEE  0x134c
-#define UNITEXT_ETHIOPIC_SYLLABLE_FEE  L"\u134c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FEE  U"\u134c"
 #define UNICODE_ETHIOPIC_SYLLABLE_FE  0x134d
-#define UNITEXT_ETHIOPIC_SYLLABLE_FE  L"\u134d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FE  U"\u134d"
 #define UNICODE_ETHIOPIC_SYLLABLE_FO  0x134e
-#define UNITEXT_ETHIOPIC_SYLLABLE_FO  L"\u134e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FO  U"\u134e"
 #define UNICODE_ETHIOPIC_SYLLABLE_FWA  0x134f
-#define UNITEXT_ETHIOPIC_SYLLABLE_FWA  L"\u134f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FWA  U"\u134f"
 #define UNICODE_ETHIOPIC_SYLLABLE_PA  0x1350
-#define UNITEXT_ETHIOPIC_SYLLABLE_PA  L"\u1350"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PA  U"\u1350"
 #define UNICODE_ETHIOPIC_SYLLABLE_PU  0x1351
-#define UNITEXT_ETHIOPIC_SYLLABLE_PU  L"\u1351"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PU  U"\u1351"
 #define UNICODE_ETHIOPIC_SYLLABLE_PI  0x1352
-#define UNITEXT_ETHIOPIC_SYLLABLE_PI  L"\u1352"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PI  U"\u1352"
 #define UNICODE_ETHIOPIC_SYLLABLE_PAA  0x1353
-#define UNITEXT_ETHIOPIC_SYLLABLE_PAA  L"\u1353"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PAA  U"\u1353"
 #define UNICODE_ETHIOPIC_SYLLABLE_PEE  0x1354
-#define UNITEXT_ETHIOPIC_SYLLABLE_PEE  L"\u1354"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PEE  U"\u1354"
 #define UNICODE_ETHIOPIC_SYLLABLE_PE  0x1355
-#define UNITEXT_ETHIOPIC_SYLLABLE_PE  L"\u1355"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PE  U"\u1355"
 #define UNICODE_ETHIOPIC_SYLLABLE_PO  0x1356
-#define UNITEXT_ETHIOPIC_SYLLABLE_PO  L"\u1356"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PO  U"\u1356"
 #define UNICODE_ETHIOPIC_SYLLABLE_PWA  0x1357
-#define UNITEXT_ETHIOPIC_SYLLABLE_PWA  L"\u1357"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PWA  U"\u1357"
 #define UNICODE_ETHIOPIC_SYLLABLE_RYA  0x1358
-#define UNITEXT_ETHIOPIC_SYLLABLE_RYA  L"\u1358"
+#define UNITEXT_ETHIOPIC_SYLLABLE_RYA  U"\u1358"
 #define UNICODE_ETHIOPIC_SYLLABLE_MYA  0x1359
-#define UNITEXT_ETHIOPIC_SYLLABLE_MYA  L"\u1359"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MYA  U"\u1359"
 #define UNICODE_ETHIOPIC_SYLLABLE_FYA  0x135a
-#define UNITEXT_ETHIOPIC_SYLLABLE_FYA  L"\u135a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FYA  U"\u135a"
 #define UNICODE_ETHIOPIC_COMBINING_GEMINATION_MARK  0x135f
-#define UNITEXT_ETHIOPIC_COMBINING_GEMINATION_MARK  L"\u135f"
+#define UNITEXT_ETHIOPIC_COMBINING_GEMINATION_MARK  U"\u135f"
 #define UNICODE_ETHIOPIC_SECTION_MARK  0x1360
-#define UNITEXT_ETHIOPIC_SECTION_MARK  L"\u1360"
+#define UNITEXT_ETHIOPIC_SECTION_MARK  U"\u1360"
 #define UNICODE_ETHIOPIC_WORDSPACE  0x1361
-#define UNITEXT_ETHIOPIC_WORDSPACE  L"\u1361"
+#define UNITEXT_ETHIOPIC_WORDSPACE  U"\u1361"
 #define UNICODE_ETHIOPIC_FULL_STOP  0x1362
-#define UNITEXT_ETHIOPIC_FULL_STOP  L"\u1362"
+#define UNITEXT_ETHIOPIC_FULL_STOP  U"\u1362"
 #define UNICODE_ETHIOPIC_COMMA  0x1363
-#define UNITEXT_ETHIOPIC_COMMA  L"\u1363"
+#define UNITEXT_ETHIOPIC_COMMA  U"\u1363"
 #define UNICODE_ETHIOPIC_SEMICOLON  0x1364
-#define UNITEXT_ETHIOPIC_SEMICOLON  L"\u1364"
+#define UNITEXT_ETHIOPIC_SEMICOLON  U"\u1364"
 #define UNICODE_ETHIOPIC_COLON  0x1365
-#define UNITEXT_ETHIOPIC_COLON  L"\u1365"
+#define UNITEXT_ETHIOPIC_COLON  U"\u1365"
 #define UNICODE_ETHIOPIC_PREFACE_COLON  0x1366
-#define UNITEXT_ETHIOPIC_PREFACE_COLON  L"\u1366"
+#define UNITEXT_ETHIOPIC_PREFACE_COLON  U"\u1366"
 #define UNICODE_ETHIOPIC_QUESTION_MARK  0x1367
-#define UNITEXT_ETHIOPIC_QUESTION_MARK  L"\u1367"
+#define UNITEXT_ETHIOPIC_QUESTION_MARK  U"\u1367"
 #define UNICODE_ETHIOPIC_PARAGRAPH_SEPARATOR  0x1368
-#define UNITEXT_ETHIOPIC_PARAGRAPH_SEPARATOR  L"\u1368"
+#define UNITEXT_ETHIOPIC_PARAGRAPH_SEPARATOR  U"\u1368"
 #define UNICODE_ETHIOPIC_DIGIT_ONE  0x1369
-#define UNITEXT_ETHIOPIC_DIGIT_ONE  L"\u1369"
+#define UNITEXT_ETHIOPIC_DIGIT_ONE  U"\u1369"
 #define UNICODE_ETHIOPIC_DIGIT_TWO  0x136a
-#define UNITEXT_ETHIOPIC_DIGIT_TWO  L"\u136a"
+#define UNITEXT_ETHIOPIC_DIGIT_TWO  U"\u136a"
 #define UNICODE_ETHIOPIC_DIGIT_THREE  0x136b
-#define UNITEXT_ETHIOPIC_DIGIT_THREE  L"\u136b"
+#define UNITEXT_ETHIOPIC_DIGIT_THREE  U"\u136b"
 #define UNICODE_ETHIOPIC_DIGIT_FOUR  0x136c
-#define UNITEXT_ETHIOPIC_DIGIT_FOUR  L"\u136c"
+#define UNITEXT_ETHIOPIC_DIGIT_FOUR  U"\u136c"
 #define UNICODE_ETHIOPIC_DIGIT_FIVE  0x136d
-#define UNITEXT_ETHIOPIC_DIGIT_FIVE  L"\u136d"
+#define UNITEXT_ETHIOPIC_DIGIT_FIVE  U"\u136d"
 #define UNICODE_ETHIOPIC_DIGIT_SIX  0x136e
-#define UNITEXT_ETHIOPIC_DIGIT_SIX  L"\u136e"
+#define UNITEXT_ETHIOPIC_DIGIT_SIX  U"\u136e"
 #define UNICODE_ETHIOPIC_DIGIT_SEVEN  0x136f
-#define UNITEXT_ETHIOPIC_DIGIT_SEVEN  L"\u136f"
+#define UNITEXT_ETHIOPIC_DIGIT_SEVEN  U"\u136f"
 #define UNICODE_ETHIOPIC_DIGIT_EIGHT  0x1370
-#define UNITEXT_ETHIOPIC_DIGIT_EIGHT  L"\u1370"
+#define UNITEXT_ETHIOPIC_DIGIT_EIGHT  U"\u1370"
 #define UNICODE_ETHIOPIC_DIGIT_NINE  0x1371
-#define UNITEXT_ETHIOPIC_DIGIT_NINE  L"\u1371"
+#define UNITEXT_ETHIOPIC_DIGIT_NINE  U"\u1371"
 #define UNICODE_ETHIOPIC_NUMBER_TEN  0x1372
-#define UNITEXT_ETHIOPIC_NUMBER_TEN  L"\u1372"
+#define UNITEXT_ETHIOPIC_NUMBER_TEN  U"\u1372"
 #define UNICODE_ETHIOPIC_NUMBER_TWENTY  0x1373
-#define UNITEXT_ETHIOPIC_NUMBER_TWENTY  L"\u1373"
+#define UNITEXT_ETHIOPIC_NUMBER_TWENTY  U"\u1373"
 #define UNICODE_ETHIOPIC_NUMBER_THIRTY  0x1374
-#define UNITEXT_ETHIOPIC_NUMBER_THIRTY  L"\u1374"
+#define UNITEXT_ETHIOPIC_NUMBER_THIRTY  U"\u1374"
 #define UNICODE_ETHIOPIC_NUMBER_FORTY  0x1375
-#define UNITEXT_ETHIOPIC_NUMBER_FORTY  L"\u1375"
+#define UNITEXT_ETHIOPIC_NUMBER_FORTY  U"\u1375"
 #define UNICODE_ETHIOPIC_NUMBER_FIFTY  0x1376
-#define UNITEXT_ETHIOPIC_NUMBER_FIFTY  L"\u1376"
+#define UNITEXT_ETHIOPIC_NUMBER_FIFTY  U"\u1376"
 #define UNICODE_ETHIOPIC_NUMBER_SIXTY  0x1377
-#define UNITEXT_ETHIOPIC_NUMBER_SIXTY  L"\u1377"
+#define UNITEXT_ETHIOPIC_NUMBER_SIXTY  U"\u1377"
 #define UNICODE_ETHIOPIC_NUMBER_SEVENTY  0x1378
-#define UNITEXT_ETHIOPIC_NUMBER_SEVENTY  L"\u1378"
+#define UNITEXT_ETHIOPIC_NUMBER_SEVENTY  U"\u1378"
 #define UNICODE_ETHIOPIC_NUMBER_EIGHTY  0x1379
-#define UNITEXT_ETHIOPIC_NUMBER_EIGHTY  L"\u1379"
+#define UNITEXT_ETHIOPIC_NUMBER_EIGHTY  U"\u1379"
 #define UNICODE_ETHIOPIC_NUMBER_NINETY  0x137a
-#define UNITEXT_ETHIOPIC_NUMBER_NINETY  L"\u137a"
+#define UNITEXT_ETHIOPIC_NUMBER_NINETY  U"\u137a"
 #define UNICODE_ETHIOPIC_NUMBER_HUNDRED  0x137b
-#define UNITEXT_ETHIOPIC_NUMBER_HUNDRED  L"\u137b"
+#define UNITEXT_ETHIOPIC_NUMBER_HUNDRED  U"\u137b"
 #define UNICODE_ETHIOPIC_NUMBER_TEN_THOUSAND  0x137c
-#define UNITEXT_ETHIOPIC_NUMBER_TEN_THOUSAND  L"\u137c"
+#define UNITEXT_ETHIOPIC_NUMBER_TEN_THOUSAND  U"\u137c"
 #define UNICODE_ETHIOPIC_SYLLABLE_SEBATBEIT_MWA  0x1380
-#define UNITEXT_ETHIOPIC_SYLLABLE_SEBATBEIT_MWA  L"\u1380"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SEBATBEIT_MWA  U"\u1380"
 #define UNICODE_ETHIOPIC_SYLLABLE_MWI  0x1381
-#define UNITEXT_ETHIOPIC_SYLLABLE_MWI  L"\u1381"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MWI  U"\u1381"
 #define UNICODE_ETHIOPIC_SYLLABLE_MWEE  0x1382
-#define UNITEXT_ETHIOPIC_SYLLABLE_MWEE  L"\u1382"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MWEE  U"\u1382"
 #define UNICODE_ETHIOPIC_SYLLABLE_MWE  0x1383
-#define UNITEXT_ETHIOPIC_SYLLABLE_MWE  L"\u1383"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MWE  U"\u1383"
 #define UNICODE_ETHIOPIC_SYLLABLE_SEBATBEIT_BWA  0x1384
-#define UNITEXT_ETHIOPIC_SYLLABLE_SEBATBEIT_BWA  L"\u1384"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SEBATBEIT_BWA  U"\u1384"
 #define UNICODE_ETHIOPIC_SYLLABLE_BWI  0x1385
-#define UNITEXT_ETHIOPIC_SYLLABLE_BWI  L"\u1385"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BWI  U"\u1385"
 #define UNICODE_ETHIOPIC_SYLLABLE_BWEE  0x1386
-#define UNITEXT_ETHIOPIC_SYLLABLE_BWEE  L"\u1386"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BWEE  U"\u1386"
 #define UNICODE_ETHIOPIC_SYLLABLE_BWE  0x1387
-#define UNITEXT_ETHIOPIC_SYLLABLE_BWE  L"\u1387"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BWE  U"\u1387"
 #define UNICODE_ETHIOPIC_SYLLABLE_SEBATBEIT_FWA  0x1388
-#define UNITEXT_ETHIOPIC_SYLLABLE_SEBATBEIT_FWA  L"\u1388"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SEBATBEIT_FWA  U"\u1388"
 #define UNICODE_ETHIOPIC_SYLLABLE_FWI  0x1389
-#define UNITEXT_ETHIOPIC_SYLLABLE_FWI  L"\u1389"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FWI  U"\u1389"
 #define UNICODE_ETHIOPIC_SYLLABLE_FWEE  0x138a
-#define UNITEXT_ETHIOPIC_SYLLABLE_FWEE  L"\u138a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FWEE  U"\u138a"
 #define UNICODE_ETHIOPIC_SYLLABLE_FWE  0x138b
-#define UNITEXT_ETHIOPIC_SYLLABLE_FWE  L"\u138b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_FWE  U"\u138b"
 #define UNICODE_ETHIOPIC_SYLLABLE_SEBATBEIT_PWA  0x138c
-#define UNITEXT_ETHIOPIC_SYLLABLE_SEBATBEIT_PWA  L"\u138c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SEBATBEIT_PWA  U"\u138c"
 #define UNICODE_ETHIOPIC_SYLLABLE_PWI  0x138d
-#define UNITEXT_ETHIOPIC_SYLLABLE_PWI  L"\u138d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PWI  U"\u138d"
 #define UNICODE_ETHIOPIC_SYLLABLE_PWEE  0x138e
-#define UNITEXT_ETHIOPIC_SYLLABLE_PWEE  L"\u138e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PWEE  U"\u138e"
 #define UNICODE_ETHIOPIC_SYLLABLE_PWE  0x138f
-#define UNITEXT_ETHIOPIC_SYLLABLE_PWE  L"\u138f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PWE  U"\u138f"
 #define UNICODE_ETHIOPIC_TONAL_MARK_YIZET  0x1390
-#define UNITEXT_ETHIOPIC_TONAL_MARK_YIZET  L"\u1390"
+#define UNITEXT_ETHIOPIC_TONAL_MARK_YIZET  U"\u1390"
 #define UNICODE_ETHIOPIC_TONAL_MARK_DERET  0x1391
-#define UNITEXT_ETHIOPIC_TONAL_MARK_DERET  L"\u1391"
+#define UNITEXT_ETHIOPIC_TONAL_MARK_DERET  U"\u1391"
 #define UNICODE_ETHIOPIC_TONAL_MARK_RIKRIK  0x1392
-#define UNITEXT_ETHIOPIC_TONAL_MARK_RIKRIK  L"\u1392"
+#define UNITEXT_ETHIOPIC_TONAL_MARK_RIKRIK  U"\u1392"
 #define UNICODE_ETHIOPIC_TONAL_MARK_SHORT_RIKRIK  0x1393
-#define UNITEXT_ETHIOPIC_TONAL_MARK_SHORT_RIKRIK  L"\u1393"
+#define UNITEXT_ETHIOPIC_TONAL_MARK_SHORT_RIKRIK  U"\u1393"
 #define UNICODE_ETHIOPIC_TONAL_MARK_DIFAT  0x1394
-#define UNITEXT_ETHIOPIC_TONAL_MARK_DIFAT  L"\u1394"
+#define UNITEXT_ETHIOPIC_TONAL_MARK_DIFAT  U"\u1394"
 #define UNICODE_ETHIOPIC_TONAL_MARK_KENAT  0x1395
-#define UNITEXT_ETHIOPIC_TONAL_MARK_KENAT  L"\u1395"
+#define UNITEXT_ETHIOPIC_TONAL_MARK_KENAT  U"\u1395"
 #define UNICODE_ETHIOPIC_TONAL_MARK_CHIRET  0x1396
-#define UNITEXT_ETHIOPIC_TONAL_MARK_CHIRET  L"\u1396"
+#define UNITEXT_ETHIOPIC_TONAL_MARK_CHIRET  U"\u1396"
 #define UNICODE_ETHIOPIC_TONAL_MARK_HIDET  0x1397
-#define UNITEXT_ETHIOPIC_TONAL_MARK_HIDET  L"\u1397"
+#define UNITEXT_ETHIOPIC_TONAL_MARK_HIDET  U"\u1397"
 #define UNICODE_ETHIOPIC_TONAL_MARK_DERET_HIDET  0x1398
-#define UNITEXT_ETHIOPIC_TONAL_MARK_DERET_HIDET  L"\u1398"
+#define UNITEXT_ETHIOPIC_TONAL_MARK_DERET_HIDET  U"\u1398"
 #define UNICODE_ETHIOPIC_TONAL_MARK_KURT  0x1399
-#define UNITEXT_ETHIOPIC_TONAL_MARK_KURT  L"\u1399"
+#define UNITEXT_ETHIOPIC_TONAL_MARK_KURT  U"\u1399"
 #define UNICODE_CHEROKEE_LETTER_A  0x13a0
-#define UNITEXT_CHEROKEE_LETTER_A  L"\u13a0"
+#define UNITEXT_CHEROKEE_LETTER_A  U"\u13a0"
 #define UNICODE_CHEROKEE_LETTER_E  0x13a1
-#define UNITEXT_CHEROKEE_LETTER_E  L"\u13a1"
+#define UNITEXT_CHEROKEE_LETTER_E  U"\u13a1"
 #define UNICODE_CHEROKEE_LETTER_I  0x13a2
-#define UNITEXT_CHEROKEE_LETTER_I  L"\u13a2"
+#define UNITEXT_CHEROKEE_LETTER_I  U"\u13a2"
 #define UNICODE_CHEROKEE_LETTER_O  0x13a3
-#define UNITEXT_CHEROKEE_LETTER_O  L"\u13a3"
+#define UNITEXT_CHEROKEE_LETTER_O  U"\u13a3"
 #define UNICODE_CHEROKEE_LETTER_U  0x13a4
-#define UNITEXT_CHEROKEE_LETTER_U  L"\u13a4"
+#define UNITEXT_CHEROKEE_LETTER_U  U"\u13a4"
 #define UNICODE_CHEROKEE_LETTER_V  0x13a5
-#define UNITEXT_CHEROKEE_LETTER_V  L"\u13a5"
+#define UNITEXT_CHEROKEE_LETTER_V  U"\u13a5"
 #define UNICODE_CHEROKEE_LETTER_GA  0x13a6
-#define UNITEXT_CHEROKEE_LETTER_GA  L"\u13a6"
+#define UNITEXT_CHEROKEE_LETTER_GA  U"\u13a6"
 #define UNICODE_CHEROKEE_LETTER_KA  0x13a7
-#define UNITEXT_CHEROKEE_LETTER_KA  L"\u13a7"
+#define UNITEXT_CHEROKEE_LETTER_KA  U"\u13a7"
 #define UNICODE_CHEROKEE_LETTER_GE  0x13a8
-#define UNITEXT_CHEROKEE_LETTER_GE  L"\u13a8"
+#define UNITEXT_CHEROKEE_LETTER_GE  U"\u13a8"
 #define UNICODE_CHEROKEE_LETTER_GI  0x13a9
-#define UNITEXT_CHEROKEE_LETTER_GI  L"\u13a9"
+#define UNITEXT_CHEROKEE_LETTER_GI  U"\u13a9"
 #define UNICODE_CHEROKEE_LETTER_GO  0x13aa
-#define UNITEXT_CHEROKEE_LETTER_GO  L"\u13aa"
+#define UNITEXT_CHEROKEE_LETTER_GO  U"\u13aa"
 #define UNICODE_CHEROKEE_LETTER_GU  0x13ab
-#define UNITEXT_CHEROKEE_LETTER_GU  L"\u13ab"
+#define UNITEXT_CHEROKEE_LETTER_GU  U"\u13ab"
 #define UNICODE_CHEROKEE_LETTER_GV  0x13ac
-#define UNITEXT_CHEROKEE_LETTER_GV  L"\u13ac"
+#define UNITEXT_CHEROKEE_LETTER_GV  U"\u13ac"
 #define UNICODE_CHEROKEE_LETTER_HA  0x13ad
-#define UNITEXT_CHEROKEE_LETTER_HA  L"\u13ad"
+#define UNITEXT_CHEROKEE_LETTER_HA  U"\u13ad"
 #define UNICODE_CHEROKEE_LETTER_HE  0x13ae
-#define UNITEXT_CHEROKEE_LETTER_HE  L"\u13ae"
+#define UNITEXT_CHEROKEE_LETTER_HE  U"\u13ae"
 #define UNICODE_CHEROKEE_LETTER_HI  0x13af
-#define UNITEXT_CHEROKEE_LETTER_HI  L"\u13af"
+#define UNITEXT_CHEROKEE_LETTER_HI  U"\u13af"
 #define UNICODE_CHEROKEE_LETTER_HO  0x13b0
-#define UNITEXT_CHEROKEE_LETTER_HO  L"\u13b0"
+#define UNITEXT_CHEROKEE_LETTER_HO  U"\u13b0"
 #define UNICODE_CHEROKEE_LETTER_HU  0x13b1
-#define UNITEXT_CHEROKEE_LETTER_HU  L"\u13b1"
+#define UNITEXT_CHEROKEE_LETTER_HU  U"\u13b1"
 #define UNICODE_CHEROKEE_LETTER_HV  0x13b2
-#define UNITEXT_CHEROKEE_LETTER_HV  L"\u13b2"
+#define UNITEXT_CHEROKEE_LETTER_HV  U"\u13b2"
 #define UNICODE_CHEROKEE_LETTER_LA  0x13b3
-#define UNITEXT_CHEROKEE_LETTER_LA  L"\u13b3"
+#define UNITEXT_CHEROKEE_LETTER_LA  U"\u13b3"
 #define UNICODE_CHEROKEE_LETTER_LE  0x13b4
-#define UNITEXT_CHEROKEE_LETTER_LE  L"\u13b4"
+#define UNITEXT_CHEROKEE_LETTER_LE  U"\u13b4"
 #define UNICODE_CHEROKEE_LETTER_LI  0x13b5
-#define UNITEXT_CHEROKEE_LETTER_LI  L"\u13b5"
+#define UNITEXT_CHEROKEE_LETTER_LI  U"\u13b5"
 #define UNICODE_CHEROKEE_LETTER_LO  0x13b6
-#define UNITEXT_CHEROKEE_LETTER_LO  L"\u13b6"
+#define UNITEXT_CHEROKEE_LETTER_LO  U"\u13b6"
 #define UNICODE_CHEROKEE_LETTER_LU  0x13b7
-#define UNITEXT_CHEROKEE_LETTER_LU  L"\u13b7"
+#define UNITEXT_CHEROKEE_LETTER_LU  U"\u13b7"
 #define UNICODE_CHEROKEE_LETTER_LV  0x13b8
-#define UNITEXT_CHEROKEE_LETTER_LV  L"\u13b8"
+#define UNITEXT_CHEROKEE_LETTER_LV  U"\u13b8"
 #define UNICODE_CHEROKEE_LETTER_MA  0x13b9
-#define UNITEXT_CHEROKEE_LETTER_MA  L"\u13b9"
+#define UNITEXT_CHEROKEE_LETTER_MA  U"\u13b9"
 #define UNICODE_CHEROKEE_LETTER_ME  0x13ba
-#define UNITEXT_CHEROKEE_LETTER_ME  L"\u13ba"
+#define UNITEXT_CHEROKEE_LETTER_ME  U"\u13ba"
 #define UNICODE_CHEROKEE_LETTER_MI  0x13bb
-#define UNITEXT_CHEROKEE_LETTER_MI  L"\u13bb"
+#define UNITEXT_CHEROKEE_LETTER_MI  U"\u13bb"
 #define UNICODE_CHEROKEE_LETTER_MO  0x13bc
-#define UNITEXT_CHEROKEE_LETTER_MO  L"\u13bc"
+#define UNITEXT_CHEROKEE_LETTER_MO  U"\u13bc"
 #define UNICODE_CHEROKEE_LETTER_MU  0x13bd
-#define UNITEXT_CHEROKEE_LETTER_MU  L"\u13bd"
+#define UNITEXT_CHEROKEE_LETTER_MU  U"\u13bd"
 #define UNICODE_CHEROKEE_LETTER_NA  0x13be
-#define UNITEXT_CHEROKEE_LETTER_NA  L"\u13be"
+#define UNITEXT_CHEROKEE_LETTER_NA  U"\u13be"
 #define UNICODE_CHEROKEE_LETTER_HNA  0x13bf
-#define UNITEXT_CHEROKEE_LETTER_HNA  L"\u13bf"
+#define UNITEXT_CHEROKEE_LETTER_HNA  U"\u13bf"
 #define UNICODE_CHEROKEE_LETTER_NAH  0x13c0
-#define UNITEXT_CHEROKEE_LETTER_NAH  L"\u13c0"
+#define UNITEXT_CHEROKEE_LETTER_NAH  U"\u13c0"
 #define UNICODE_CHEROKEE_LETTER_NE  0x13c1
-#define UNITEXT_CHEROKEE_LETTER_NE  L"\u13c1"
+#define UNITEXT_CHEROKEE_LETTER_NE  U"\u13c1"
 #define UNICODE_CHEROKEE_LETTER_NI  0x13c2
-#define UNITEXT_CHEROKEE_LETTER_NI  L"\u13c2"
+#define UNITEXT_CHEROKEE_LETTER_NI  U"\u13c2"
 #define UNICODE_CHEROKEE_LETTER_NO  0x13c3
-#define UNITEXT_CHEROKEE_LETTER_NO  L"\u13c3"
+#define UNITEXT_CHEROKEE_LETTER_NO  U"\u13c3"
 #define UNICODE_CHEROKEE_LETTER_NU  0x13c4
-#define UNITEXT_CHEROKEE_LETTER_NU  L"\u13c4"
+#define UNITEXT_CHEROKEE_LETTER_NU  U"\u13c4"
 #define UNICODE_CHEROKEE_LETTER_NV  0x13c5
-#define UNITEXT_CHEROKEE_LETTER_NV  L"\u13c5"
+#define UNITEXT_CHEROKEE_LETTER_NV  U"\u13c5"
 #define UNICODE_CHEROKEE_LETTER_QUA  0x13c6
-#define UNITEXT_CHEROKEE_LETTER_QUA  L"\u13c6"
+#define UNITEXT_CHEROKEE_LETTER_QUA  U"\u13c6"
 #define UNICODE_CHEROKEE_LETTER_QUE  0x13c7
-#define UNITEXT_CHEROKEE_LETTER_QUE  L"\u13c7"
+#define UNITEXT_CHEROKEE_LETTER_QUE  U"\u13c7"
 #define UNICODE_CHEROKEE_LETTER_QUI  0x13c8
-#define UNITEXT_CHEROKEE_LETTER_QUI  L"\u13c8"
+#define UNITEXT_CHEROKEE_LETTER_QUI  U"\u13c8"
 #define UNICODE_CHEROKEE_LETTER_QUO  0x13c9
-#define UNITEXT_CHEROKEE_LETTER_QUO  L"\u13c9"
+#define UNITEXT_CHEROKEE_LETTER_QUO  U"\u13c9"
 #define UNICODE_CHEROKEE_LETTER_QUU  0x13ca
-#define UNITEXT_CHEROKEE_LETTER_QUU  L"\u13ca"
+#define UNITEXT_CHEROKEE_LETTER_QUU  U"\u13ca"
 #define UNICODE_CHEROKEE_LETTER_QUV  0x13cb
-#define UNITEXT_CHEROKEE_LETTER_QUV  L"\u13cb"
+#define UNITEXT_CHEROKEE_LETTER_QUV  U"\u13cb"
 #define UNICODE_CHEROKEE_LETTER_SA  0x13cc
-#define UNITEXT_CHEROKEE_LETTER_SA  L"\u13cc"
+#define UNITEXT_CHEROKEE_LETTER_SA  U"\u13cc"
 #define UNICODE_CHEROKEE_LETTER_S  0x13cd
-#define UNITEXT_CHEROKEE_LETTER_S  L"\u13cd"
+#define UNITEXT_CHEROKEE_LETTER_S  U"\u13cd"
 #define UNICODE_CHEROKEE_LETTER_SE  0x13ce
-#define UNITEXT_CHEROKEE_LETTER_SE  L"\u13ce"
+#define UNITEXT_CHEROKEE_LETTER_SE  U"\u13ce"
 #define UNICODE_CHEROKEE_LETTER_SI  0x13cf
-#define UNITEXT_CHEROKEE_LETTER_SI  L"\u13cf"
+#define UNITEXT_CHEROKEE_LETTER_SI  U"\u13cf"
 #define UNICODE_CHEROKEE_LETTER_SO  0x13d0
-#define UNITEXT_CHEROKEE_LETTER_SO  L"\u13d0"
+#define UNITEXT_CHEROKEE_LETTER_SO  U"\u13d0"
 #define UNICODE_CHEROKEE_LETTER_SU  0x13d1
-#define UNITEXT_CHEROKEE_LETTER_SU  L"\u13d1"
+#define UNITEXT_CHEROKEE_LETTER_SU  U"\u13d1"
 #define UNICODE_CHEROKEE_LETTER_SV  0x13d2
-#define UNITEXT_CHEROKEE_LETTER_SV  L"\u13d2"
+#define UNITEXT_CHEROKEE_LETTER_SV  U"\u13d2"
 #define UNICODE_CHEROKEE_LETTER_DA  0x13d3
-#define UNITEXT_CHEROKEE_LETTER_DA  L"\u13d3"
+#define UNITEXT_CHEROKEE_LETTER_DA  U"\u13d3"
 #define UNICODE_CHEROKEE_LETTER_TA  0x13d4
-#define UNITEXT_CHEROKEE_LETTER_TA  L"\u13d4"
+#define UNITEXT_CHEROKEE_LETTER_TA  U"\u13d4"
 #define UNICODE_CHEROKEE_LETTER_DE  0x13d5
-#define UNITEXT_CHEROKEE_LETTER_DE  L"\u13d5"
+#define UNITEXT_CHEROKEE_LETTER_DE  U"\u13d5"
 #define UNICODE_CHEROKEE_LETTER_TE  0x13d6
-#define UNITEXT_CHEROKEE_LETTER_TE  L"\u13d6"
+#define UNITEXT_CHEROKEE_LETTER_TE  U"\u13d6"
 #define UNICODE_CHEROKEE_LETTER_DI  0x13d7
-#define UNITEXT_CHEROKEE_LETTER_DI  L"\u13d7"
+#define UNITEXT_CHEROKEE_LETTER_DI  U"\u13d7"
 #define UNICODE_CHEROKEE_LETTER_TI  0x13d8
-#define UNITEXT_CHEROKEE_LETTER_TI  L"\u13d8"
+#define UNITEXT_CHEROKEE_LETTER_TI  U"\u13d8"
 #define UNICODE_CHEROKEE_LETTER_DO  0x13d9
-#define UNITEXT_CHEROKEE_LETTER_DO  L"\u13d9"
+#define UNITEXT_CHEROKEE_LETTER_DO  U"\u13d9"
 #define UNICODE_CHEROKEE_LETTER_DU  0x13da
-#define UNITEXT_CHEROKEE_LETTER_DU  L"\u13da"
+#define UNITEXT_CHEROKEE_LETTER_DU  U"\u13da"
 #define UNICODE_CHEROKEE_LETTER_DV  0x13db
-#define UNITEXT_CHEROKEE_LETTER_DV  L"\u13db"
+#define UNITEXT_CHEROKEE_LETTER_DV  U"\u13db"
 #define UNICODE_CHEROKEE_LETTER_DLA  0x13dc
-#define UNITEXT_CHEROKEE_LETTER_DLA  L"\u13dc"
+#define UNITEXT_CHEROKEE_LETTER_DLA  U"\u13dc"
 #define UNICODE_CHEROKEE_LETTER_TLA  0x13dd
-#define UNITEXT_CHEROKEE_LETTER_TLA  L"\u13dd"
+#define UNITEXT_CHEROKEE_LETTER_TLA  U"\u13dd"
 #define UNICODE_CHEROKEE_LETTER_TLE  0x13de
-#define UNITEXT_CHEROKEE_LETTER_TLE  L"\u13de"
+#define UNITEXT_CHEROKEE_LETTER_TLE  U"\u13de"
 #define UNICODE_CHEROKEE_LETTER_TLI  0x13df
-#define UNITEXT_CHEROKEE_LETTER_TLI  L"\u13df"
+#define UNITEXT_CHEROKEE_LETTER_TLI  U"\u13df"
 #define UNICODE_CHEROKEE_LETTER_TLO  0x13e0
-#define UNITEXT_CHEROKEE_LETTER_TLO  L"\u13e0"
+#define UNITEXT_CHEROKEE_LETTER_TLO  U"\u13e0"
 #define UNICODE_CHEROKEE_LETTER_TLU  0x13e1
-#define UNITEXT_CHEROKEE_LETTER_TLU  L"\u13e1"
+#define UNITEXT_CHEROKEE_LETTER_TLU  U"\u13e1"
 #define UNICODE_CHEROKEE_LETTER_TLV  0x13e2
-#define UNITEXT_CHEROKEE_LETTER_TLV  L"\u13e2"
+#define UNITEXT_CHEROKEE_LETTER_TLV  U"\u13e2"
 #define UNICODE_CHEROKEE_LETTER_TSA  0x13e3
-#define UNITEXT_CHEROKEE_LETTER_TSA  L"\u13e3"
+#define UNITEXT_CHEROKEE_LETTER_TSA  U"\u13e3"
 #define UNICODE_CHEROKEE_LETTER_TSE  0x13e4
-#define UNITEXT_CHEROKEE_LETTER_TSE  L"\u13e4"
+#define UNITEXT_CHEROKEE_LETTER_TSE  U"\u13e4"
 #define UNICODE_CHEROKEE_LETTER_TSI  0x13e5
-#define UNITEXT_CHEROKEE_LETTER_TSI  L"\u13e5"
+#define UNITEXT_CHEROKEE_LETTER_TSI  U"\u13e5"
 #define UNICODE_CHEROKEE_LETTER_TSO  0x13e6
-#define UNITEXT_CHEROKEE_LETTER_TSO  L"\u13e6"
+#define UNITEXT_CHEROKEE_LETTER_TSO  U"\u13e6"
 #define UNICODE_CHEROKEE_LETTER_TSU  0x13e7
-#define UNITEXT_CHEROKEE_LETTER_TSU  L"\u13e7"
+#define UNITEXT_CHEROKEE_LETTER_TSU  U"\u13e7"
 #define UNICODE_CHEROKEE_LETTER_TSV  0x13e8
-#define UNITEXT_CHEROKEE_LETTER_TSV  L"\u13e8"
+#define UNITEXT_CHEROKEE_LETTER_TSV  U"\u13e8"
 #define UNICODE_CHEROKEE_LETTER_WA  0x13e9
-#define UNITEXT_CHEROKEE_LETTER_WA  L"\u13e9"
+#define UNITEXT_CHEROKEE_LETTER_WA  U"\u13e9"
 #define UNICODE_CHEROKEE_LETTER_WE  0x13ea
-#define UNITEXT_CHEROKEE_LETTER_WE  L"\u13ea"
+#define UNITEXT_CHEROKEE_LETTER_WE  U"\u13ea"
 #define UNICODE_CHEROKEE_LETTER_WI  0x13eb
-#define UNITEXT_CHEROKEE_LETTER_WI  L"\u13eb"
+#define UNITEXT_CHEROKEE_LETTER_WI  U"\u13eb"
 #define UNICODE_CHEROKEE_LETTER_WO  0x13ec
-#define UNITEXT_CHEROKEE_LETTER_WO  L"\u13ec"
+#define UNITEXT_CHEROKEE_LETTER_WO  U"\u13ec"
 #define UNICODE_CHEROKEE_LETTER_WU  0x13ed
-#define UNITEXT_CHEROKEE_LETTER_WU  L"\u13ed"
+#define UNITEXT_CHEROKEE_LETTER_WU  U"\u13ed"
 #define UNICODE_CHEROKEE_LETTER_WV  0x13ee
-#define UNITEXT_CHEROKEE_LETTER_WV  L"\u13ee"
+#define UNITEXT_CHEROKEE_LETTER_WV  U"\u13ee"
 #define UNICODE_CHEROKEE_LETTER_YA  0x13ef
-#define UNITEXT_CHEROKEE_LETTER_YA  L"\u13ef"
+#define UNITEXT_CHEROKEE_LETTER_YA  U"\u13ef"
 #define UNICODE_CHEROKEE_LETTER_YE  0x13f0
-#define UNITEXT_CHEROKEE_LETTER_YE  L"\u13f0"
+#define UNITEXT_CHEROKEE_LETTER_YE  U"\u13f0"
 #define UNICODE_CHEROKEE_LETTER_YI  0x13f1
-#define UNITEXT_CHEROKEE_LETTER_YI  L"\u13f1"
+#define UNITEXT_CHEROKEE_LETTER_YI  U"\u13f1"
 #define UNICODE_CHEROKEE_LETTER_YO  0x13f2
-#define UNITEXT_CHEROKEE_LETTER_YO  L"\u13f2"
+#define UNITEXT_CHEROKEE_LETTER_YO  U"\u13f2"
 #define UNICODE_CHEROKEE_LETTER_YU  0x13f3
-#define UNITEXT_CHEROKEE_LETTER_YU  L"\u13f3"
+#define UNITEXT_CHEROKEE_LETTER_YU  U"\u13f3"
 #define UNICODE_CHEROKEE_LETTER_YV  0x13f4
-#define UNITEXT_CHEROKEE_LETTER_YV  L"\u13f4"
+#define UNITEXT_CHEROKEE_LETTER_YV  U"\u13f4"
 #define UNICODE_CANADIAN_SYLLABICS_E  0x1401
-#define UNITEXT_CANADIAN_SYLLABICS_E  L"\u1401"
+#define UNITEXT_CANADIAN_SYLLABICS_E  U"\u1401"
 #define UNICODE_CANADIAN_SYLLABICS_AAI  0x1402
-#define UNITEXT_CANADIAN_SYLLABICS_AAI  L"\u1402"
+#define UNITEXT_CANADIAN_SYLLABICS_AAI  U"\u1402"
 #define UNICODE_CANADIAN_SYLLABICS_I  0x1403
-#define UNITEXT_CANADIAN_SYLLABICS_I  L"\u1403"
+#define UNITEXT_CANADIAN_SYLLABICS_I  U"\u1403"
 #define UNICODE_CANADIAN_SYLLABICS_II  0x1404
-#define UNITEXT_CANADIAN_SYLLABICS_II  L"\u1404"
+#define UNITEXT_CANADIAN_SYLLABICS_II  U"\u1404"
 #define UNICODE_CANADIAN_SYLLABICS_O  0x1405
-#define UNITEXT_CANADIAN_SYLLABICS_O  L"\u1405"
+#define UNITEXT_CANADIAN_SYLLABICS_O  U"\u1405"
 #define UNICODE_CANADIAN_SYLLABICS_OO  0x1406
-#define UNITEXT_CANADIAN_SYLLABICS_OO  L"\u1406"
+#define UNITEXT_CANADIAN_SYLLABICS_OO  U"\u1406"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_OO  0x1407
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_OO  L"\u1407"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_OO  U"\u1407"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_EE  0x1408
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_EE  L"\u1408"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_EE  U"\u1408"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_I  0x1409
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_I  L"\u1409"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_I  U"\u1409"
 #define UNICODE_CANADIAN_SYLLABICS_A  0x140a
-#define UNITEXT_CANADIAN_SYLLABICS_A  L"\u140a"
+#define UNITEXT_CANADIAN_SYLLABICS_A  U"\u140a"
 #define UNICODE_CANADIAN_SYLLABICS_AA  0x140b
-#define UNITEXT_CANADIAN_SYLLABICS_AA  L"\u140b"
+#define UNITEXT_CANADIAN_SYLLABICS_AA  U"\u140b"
 #define UNICODE_CANADIAN_SYLLABICS_WE  0x140c
-#define UNITEXT_CANADIAN_SYLLABICS_WE  L"\u140c"
+#define UNITEXT_CANADIAN_SYLLABICS_WE  U"\u140c"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_WE  0x140d
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WE  L"\u140d"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WE  U"\u140d"
 #define UNICODE_CANADIAN_SYLLABICS_WI  0x140e
-#define UNITEXT_CANADIAN_SYLLABICS_WI  L"\u140e"
+#define UNITEXT_CANADIAN_SYLLABICS_WI  U"\u140e"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_WI  0x140f
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WI  L"\u140f"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WI  U"\u140f"
 #define UNICODE_CANADIAN_SYLLABICS_WII  0x1410
-#define UNITEXT_CANADIAN_SYLLABICS_WII  L"\u1410"
+#define UNITEXT_CANADIAN_SYLLABICS_WII  U"\u1410"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_WII  0x1411
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WII  L"\u1411"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WII  U"\u1411"
 #define UNICODE_CANADIAN_SYLLABICS_WO  0x1412
-#define UNITEXT_CANADIAN_SYLLABICS_WO  L"\u1412"
+#define UNITEXT_CANADIAN_SYLLABICS_WO  U"\u1412"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_WO  0x1413
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WO  L"\u1413"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WO  U"\u1413"
 #define UNICODE_CANADIAN_SYLLABICS_WOO  0x1414
-#define UNITEXT_CANADIAN_SYLLABICS_WOO  L"\u1414"
+#define UNITEXT_CANADIAN_SYLLABICS_WOO  U"\u1414"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_WOO  0x1415
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WOO  L"\u1415"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WOO  U"\u1415"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_WOO  0x1416
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_WOO  L"\u1416"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_WOO  U"\u1416"
 #define UNICODE_CANADIAN_SYLLABICS_WA  0x1417
-#define UNITEXT_CANADIAN_SYLLABICS_WA  L"\u1417"
+#define UNITEXT_CANADIAN_SYLLABICS_WA  U"\u1417"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_WA  0x1418
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WA  L"\u1418"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WA  U"\u1418"
 #define UNICODE_CANADIAN_SYLLABICS_WAA  0x1419
-#define UNITEXT_CANADIAN_SYLLABICS_WAA  L"\u1419"
+#define UNITEXT_CANADIAN_SYLLABICS_WAA  U"\u1419"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_WAA  0x141a
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WAA  L"\u141a"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_WAA  U"\u141a"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_WAA  0x141b
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_WAA  L"\u141b"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_WAA  U"\u141b"
 #define UNICODE_CANADIAN_SYLLABICS_AI  0x141c
-#define UNITEXT_CANADIAN_SYLLABICS_AI  L"\u141c"
+#define UNITEXT_CANADIAN_SYLLABICS_AI  U"\u141c"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_W  0x141d
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_W  L"\u141d"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_W  U"\u141d"
 #define UNICODE_CANADIAN_SYLLABICS_GLOTTAL_STOP  0x141e
-#define UNITEXT_CANADIAN_SYLLABICS_GLOTTAL_STOP  L"\u141e"
+#define UNITEXT_CANADIAN_SYLLABICS_GLOTTAL_STOP  U"\u141e"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_ACUTE  0x141f
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_ACUTE  L"\u141f"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_ACUTE  U"\u141f"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_GRAVE  0x1420
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_GRAVE  L"\u1420"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_GRAVE  U"\u1420"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_BOTTOM_HALF_RING  0x1421
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_BOTTOM_HALF_RING  L"\u1421"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_BOTTOM_HALF_RING  U"\u1421"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_TOP_HALF_RING  0x1422
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_TOP_HALF_RING  L"\u1422"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_TOP_HALF_RING  U"\u1422"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_RIGHT_HALF_RING  0x1423
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_RIGHT_HALF_RING  L"\u1423"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_RIGHT_HALF_RING  U"\u1423"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_RING  0x1424
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_RING  L"\u1424"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_RING  U"\u1424"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_DOUBLE_ACUTE  0x1425
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_DOUBLE_ACUTE  L"\u1425"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_DOUBLE_ACUTE  U"\u1425"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_DOUBLE_SHORT_VERTICAL_STROKES  0x1426
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_DOUBLE_SHORT_VERTICAL_STROKES  L"\u1426"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_DOUBLE_SHORT_VERTICAL_STROKES  U"\u1426"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_MIDDLE_DOT  0x1427
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_MIDDLE_DOT  L"\u1427"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_MIDDLE_DOT  U"\u1427"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_SHORT_HORIZONTAL_STROKE  0x1428
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_SHORT_HORIZONTAL_STROKE  L"\u1428"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_SHORT_HORIZONTAL_STROKE  U"\u1428"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_PLUS  0x1429
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_PLUS  L"\u1429"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_PLUS  U"\u1429"
 #define UNICODE_CANADIAN_SYLLABICS_FINAL_DOWN_TACK  0x142a
-#define UNITEXT_CANADIAN_SYLLABICS_FINAL_DOWN_TACK  L"\u142a"
+#define UNITEXT_CANADIAN_SYLLABICS_FINAL_DOWN_TACK  U"\u142a"
 #define UNICODE_CANADIAN_SYLLABICS_EN  0x142b
-#define UNITEXT_CANADIAN_SYLLABICS_EN  L"\u142b"
+#define UNITEXT_CANADIAN_SYLLABICS_EN  U"\u142b"
 #define UNICODE_CANADIAN_SYLLABICS_IN  0x142c
-#define UNITEXT_CANADIAN_SYLLABICS_IN  L"\u142c"
+#define UNITEXT_CANADIAN_SYLLABICS_IN  U"\u142c"
 #define UNICODE_CANADIAN_SYLLABICS_ON  0x142d
-#define UNITEXT_CANADIAN_SYLLABICS_ON  L"\u142d"
+#define UNITEXT_CANADIAN_SYLLABICS_ON  U"\u142d"
 #define UNICODE_CANADIAN_SYLLABICS_AN  0x142e
-#define UNITEXT_CANADIAN_SYLLABICS_AN  L"\u142e"
+#define UNITEXT_CANADIAN_SYLLABICS_AN  U"\u142e"
 #define UNICODE_CANADIAN_SYLLABICS_PE  0x142f
-#define UNITEXT_CANADIAN_SYLLABICS_PE  L"\u142f"
+#define UNITEXT_CANADIAN_SYLLABICS_PE  U"\u142f"
 #define UNICODE_CANADIAN_SYLLABICS_PAAI  0x1430
-#define UNITEXT_CANADIAN_SYLLABICS_PAAI  L"\u1430"
+#define UNITEXT_CANADIAN_SYLLABICS_PAAI  U"\u1430"
 #define UNICODE_CANADIAN_SYLLABICS_PI  0x1431
-#define UNITEXT_CANADIAN_SYLLABICS_PI  L"\u1431"
+#define UNITEXT_CANADIAN_SYLLABICS_PI  U"\u1431"
 #define UNICODE_CANADIAN_SYLLABICS_PII  0x1432
-#define UNITEXT_CANADIAN_SYLLABICS_PII  L"\u1432"
+#define UNITEXT_CANADIAN_SYLLABICS_PII  U"\u1432"
 #define UNICODE_CANADIAN_SYLLABICS_PO  0x1433
-#define UNITEXT_CANADIAN_SYLLABICS_PO  L"\u1433"
+#define UNITEXT_CANADIAN_SYLLABICS_PO  U"\u1433"
 #define UNICODE_CANADIAN_SYLLABICS_POO  0x1434
-#define UNITEXT_CANADIAN_SYLLABICS_POO  L"\u1434"
+#define UNITEXT_CANADIAN_SYLLABICS_POO  U"\u1434"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_POO  0x1435
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_POO  L"\u1435"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_POO  U"\u1435"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_HEE  0x1436
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HEE  L"\u1436"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HEE  U"\u1436"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_HI  0x1437
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HI  L"\u1437"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HI  U"\u1437"
 #define UNICODE_CANADIAN_SYLLABICS_PA  0x1438
-#define UNITEXT_CANADIAN_SYLLABICS_PA  L"\u1438"
+#define UNITEXT_CANADIAN_SYLLABICS_PA  U"\u1438"
 #define UNICODE_CANADIAN_SYLLABICS_PAA  0x1439
-#define UNITEXT_CANADIAN_SYLLABICS_PAA  L"\u1439"
+#define UNITEXT_CANADIAN_SYLLABICS_PAA  U"\u1439"
 #define UNICODE_CANADIAN_SYLLABICS_PWE  0x143a
-#define UNITEXT_CANADIAN_SYLLABICS_PWE  L"\u143a"
+#define UNITEXT_CANADIAN_SYLLABICS_PWE  U"\u143a"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_PWE  0x143b
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWE  L"\u143b"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWE  U"\u143b"
 #define UNICODE_CANADIAN_SYLLABICS_PWI  0x143c
-#define UNITEXT_CANADIAN_SYLLABICS_PWI  L"\u143c"
+#define UNITEXT_CANADIAN_SYLLABICS_PWI  U"\u143c"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_PWI  0x143d
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWI  L"\u143d"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWI  U"\u143d"
 #define UNICODE_CANADIAN_SYLLABICS_PWII  0x143e
-#define UNITEXT_CANADIAN_SYLLABICS_PWII  L"\u143e"
+#define UNITEXT_CANADIAN_SYLLABICS_PWII  U"\u143e"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_PWII  0x143f
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWII  L"\u143f"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWII  U"\u143f"
 #define UNICODE_CANADIAN_SYLLABICS_PWO  0x1440
-#define UNITEXT_CANADIAN_SYLLABICS_PWO  L"\u1440"
+#define UNITEXT_CANADIAN_SYLLABICS_PWO  U"\u1440"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_PWO  0x1441
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWO  L"\u1441"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWO  U"\u1441"
 #define UNICODE_CANADIAN_SYLLABICS_PWOO  0x1442
-#define UNITEXT_CANADIAN_SYLLABICS_PWOO  L"\u1442"
+#define UNITEXT_CANADIAN_SYLLABICS_PWOO  U"\u1442"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_PWOO  0x1443
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWOO  L"\u1443"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWOO  U"\u1443"
 #define UNICODE_CANADIAN_SYLLABICS_PWA  0x1444
-#define UNITEXT_CANADIAN_SYLLABICS_PWA  L"\u1444"
+#define UNITEXT_CANADIAN_SYLLABICS_PWA  U"\u1444"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_PWA  0x1445
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWA  L"\u1445"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWA  U"\u1445"
 #define UNICODE_CANADIAN_SYLLABICS_PWAA  0x1446
-#define UNITEXT_CANADIAN_SYLLABICS_PWAA  L"\u1446"
+#define UNITEXT_CANADIAN_SYLLABICS_PWAA  U"\u1446"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_PWAA  0x1447
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWAA  L"\u1447"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_PWAA  U"\u1447"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_PWAA  0x1448
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_PWAA  L"\u1448"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_PWAA  U"\u1448"
 #define UNICODE_CANADIAN_SYLLABICS_P  0x1449
-#define UNITEXT_CANADIAN_SYLLABICS_P  L"\u1449"
+#define UNITEXT_CANADIAN_SYLLABICS_P  U"\u1449"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_P  0x144a
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_P  L"\u144a"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_P  U"\u144a"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_H  0x144b
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_H  L"\u144b"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_H  U"\u144b"
 #define UNICODE_CANADIAN_SYLLABICS_TE  0x144c
-#define UNITEXT_CANADIAN_SYLLABICS_TE  L"\u144c"
+#define UNITEXT_CANADIAN_SYLLABICS_TE  U"\u144c"
 #define UNICODE_CANADIAN_SYLLABICS_TAAI  0x144d
-#define UNITEXT_CANADIAN_SYLLABICS_TAAI  L"\u144d"
+#define UNITEXT_CANADIAN_SYLLABICS_TAAI  U"\u144d"
 #define UNICODE_CANADIAN_SYLLABICS_TI  0x144e
-#define UNITEXT_CANADIAN_SYLLABICS_TI  L"\u144e"
+#define UNITEXT_CANADIAN_SYLLABICS_TI  U"\u144e"
 #define UNICODE_CANADIAN_SYLLABICS_TII  0x144f
-#define UNITEXT_CANADIAN_SYLLABICS_TII  L"\u144f"
+#define UNITEXT_CANADIAN_SYLLABICS_TII  U"\u144f"
 #define UNICODE_CANADIAN_SYLLABICS_TO  0x1450
-#define UNITEXT_CANADIAN_SYLLABICS_TO  L"\u1450"
+#define UNITEXT_CANADIAN_SYLLABICS_TO  U"\u1450"
 #define UNICODE_CANADIAN_SYLLABICS_TOO  0x1451
-#define UNITEXT_CANADIAN_SYLLABICS_TOO  L"\u1451"
+#define UNITEXT_CANADIAN_SYLLABICS_TOO  U"\u1451"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_TOO  0x1452
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_TOO  L"\u1452"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_TOO  U"\u1452"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DEE  0x1453
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DEE  L"\u1453"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DEE  U"\u1453"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DI  0x1454
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DI  L"\u1454"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DI  U"\u1454"
 #define UNICODE_CANADIAN_SYLLABICS_TA  0x1455
-#define UNITEXT_CANADIAN_SYLLABICS_TA  L"\u1455"
+#define UNITEXT_CANADIAN_SYLLABICS_TA  U"\u1455"
 #define UNICODE_CANADIAN_SYLLABICS_TAA  0x1456
-#define UNITEXT_CANADIAN_SYLLABICS_TAA  L"\u1456"
+#define UNITEXT_CANADIAN_SYLLABICS_TAA  U"\u1456"
 #define UNICODE_CANADIAN_SYLLABICS_TWE  0x1457
-#define UNITEXT_CANADIAN_SYLLABICS_TWE  L"\u1457"
+#define UNITEXT_CANADIAN_SYLLABICS_TWE  U"\u1457"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_TWE  0x1458
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWE  L"\u1458"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWE  U"\u1458"
 #define UNICODE_CANADIAN_SYLLABICS_TWI  0x1459
-#define UNITEXT_CANADIAN_SYLLABICS_TWI  L"\u1459"
+#define UNITEXT_CANADIAN_SYLLABICS_TWI  U"\u1459"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_TWI  0x145a
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWI  L"\u145a"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWI  U"\u145a"
 #define UNICODE_CANADIAN_SYLLABICS_TWII  0x145b
-#define UNITEXT_CANADIAN_SYLLABICS_TWII  L"\u145b"
+#define UNITEXT_CANADIAN_SYLLABICS_TWII  U"\u145b"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_TWII  0x145c
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWII  L"\u145c"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWII  U"\u145c"
 #define UNICODE_CANADIAN_SYLLABICS_TWO  0x145d
-#define UNITEXT_CANADIAN_SYLLABICS_TWO  L"\u145d"
+#define UNITEXT_CANADIAN_SYLLABICS_TWO  U"\u145d"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_TWO  0x145e
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWO  L"\u145e"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWO  U"\u145e"
 #define UNICODE_CANADIAN_SYLLABICS_TWOO  0x145f
-#define UNITEXT_CANADIAN_SYLLABICS_TWOO  L"\u145f"
+#define UNITEXT_CANADIAN_SYLLABICS_TWOO  U"\u145f"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_TWOO  0x1460
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWOO  L"\u1460"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWOO  U"\u1460"
 #define UNICODE_CANADIAN_SYLLABICS_TWA  0x1461
-#define UNITEXT_CANADIAN_SYLLABICS_TWA  L"\u1461"
+#define UNITEXT_CANADIAN_SYLLABICS_TWA  U"\u1461"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_TWA  0x1462
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWA  L"\u1462"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWA  U"\u1462"
 #define UNICODE_CANADIAN_SYLLABICS_TWAA  0x1463
-#define UNITEXT_CANADIAN_SYLLABICS_TWAA  L"\u1463"
+#define UNITEXT_CANADIAN_SYLLABICS_TWAA  U"\u1463"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_TWAA  0x1464
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWAA  L"\u1464"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_TWAA  U"\u1464"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_TWAA  0x1465
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_TWAA  L"\u1465"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_TWAA  U"\u1465"
 #define UNICODE_CANADIAN_SYLLABICS_T  0x1466
-#define UNITEXT_CANADIAN_SYLLABICS_T  L"\u1466"
+#define UNITEXT_CANADIAN_SYLLABICS_T  U"\u1466"
 #define UNICODE_CANADIAN_SYLLABICS_TTE  0x1467
-#define UNITEXT_CANADIAN_SYLLABICS_TTE  L"\u1467"
+#define UNITEXT_CANADIAN_SYLLABICS_TTE  U"\u1467"
 #define UNICODE_CANADIAN_SYLLABICS_TTI  0x1468
-#define UNITEXT_CANADIAN_SYLLABICS_TTI  L"\u1468"
+#define UNITEXT_CANADIAN_SYLLABICS_TTI  U"\u1468"
 #define UNICODE_CANADIAN_SYLLABICS_TTO  0x1469
-#define UNITEXT_CANADIAN_SYLLABICS_TTO  L"\u1469"
+#define UNITEXT_CANADIAN_SYLLABICS_TTO  U"\u1469"
 #define UNICODE_CANADIAN_SYLLABICS_TTA  0x146a
-#define UNITEXT_CANADIAN_SYLLABICS_TTA  L"\u146a"
+#define UNITEXT_CANADIAN_SYLLABICS_TTA  U"\u146a"
 #define UNICODE_CANADIAN_SYLLABICS_KE  0x146b
-#define UNITEXT_CANADIAN_SYLLABICS_KE  L"\u146b"
+#define UNITEXT_CANADIAN_SYLLABICS_KE  U"\u146b"
 #define UNICODE_CANADIAN_SYLLABICS_KAAI  0x146c
-#define UNITEXT_CANADIAN_SYLLABICS_KAAI  L"\u146c"
+#define UNITEXT_CANADIAN_SYLLABICS_KAAI  U"\u146c"
 #define UNICODE_CANADIAN_SYLLABICS_KI  0x146d
-#define UNITEXT_CANADIAN_SYLLABICS_KI  L"\u146d"
+#define UNITEXT_CANADIAN_SYLLABICS_KI  U"\u146d"
 #define UNICODE_CANADIAN_SYLLABICS_KII  0x146e
-#define UNITEXT_CANADIAN_SYLLABICS_KII  L"\u146e"
+#define UNITEXT_CANADIAN_SYLLABICS_KII  U"\u146e"
 #define UNICODE_CANADIAN_SYLLABICS_KO  0x146f
-#define UNITEXT_CANADIAN_SYLLABICS_KO  L"\u146f"
+#define UNITEXT_CANADIAN_SYLLABICS_KO  U"\u146f"
 #define UNICODE_CANADIAN_SYLLABICS_KOO  0x1470
-#define UNITEXT_CANADIAN_SYLLABICS_KOO  L"\u1470"
+#define UNITEXT_CANADIAN_SYLLABICS_KOO  U"\u1470"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_KOO  0x1471
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_KOO  L"\u1471"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_KOO  U"\u1471"
 #define UNICODE_CANADIAN_SYLLABICS_KA  0x1472
-#define UNITEXT_CANADIAN_SYLLABICS_KA  L"\u1472"
+#define UNITEXT_CANADIAN_SYLLABICS_KA  U"\u1472"
 #define UNICODE_CANADIAN_SYLLABICS_KAA  0x1473
-#define UNITEXT_CANADIAN_SYLLABICS_KAA  L"\u1473"
+#define UNITEXT_CANADIAN_SYLLABICS_KAA  U"\u1473"
 #define UNICODE_CANADIAN_SYLLABICS_KWE  0x1474
-#define UNITEXT_CANADIAN_SYLLABICS_KWE  L"\u1474"
+#define UNITEXT_CANADIAN_SYLLABICS_KWE  U"\u1474"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_KWE  0x1475
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWE  L"\u1475"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWE  U"\u1475"
 #define UNICODE_CANADIAN_SYLLABICS_KWI  0x1476
-#define UNITEXT_CANADIAN_SYLLABICS_KWI  L"\u1476"
+#define UNITEXT_CANADIAN_SYLLABICS_KWI  U"\u1476"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_KWI  0x1477
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWI  L"\u1477"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWI  U"\u1477"
 #define UNICODE_CANADIAN_SYLLABICS_KWII  0x1478
-#define UNITEXT_CANADIAN_SYLLABICS_KWII  L"\u1478"
+#define UNITEXT_CANADIAN_SYLLABICS_KWII  U"\u1478"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_KWII  0x1479
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWII  L"\u1479"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWII  U"\u1479"
 #define UNICODE_CANADIAN_SYLLABICS_KWO  0x147a
-#define UNITEXT_CANADIAN_SYLLABICS_KWO  L"\u147a"
+#define UNITEXT_CANADIAN_SYLLABICS_KWO  U"\u147a"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_KWO  0x147b
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWO  L"\u147b"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWO  U"\u147b"
 #define UNICODE_CANADIAN_SYLLABICS_KWOO  0x147c
-#define UNITEXT_CANADIAN_SYLLABICS_KWOO  L"\u147c"
+#define UNITEXT_CANADIAN_SYLLABICS_KWOO  U"\u147c"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_KWOO  0x147d
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWOO  L"\u147d"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWOO  U"\u147d"
 #define UNICODE_CANADIAN_SYLLABICS_KWA  0x147e
-#define UNITEXT_CANADIAN_SYLLABICS_KWA  L"\u147e"
+#define UNITEXT_CANADIAN_SYLLABICS_KWA  U"\u147e"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_KWA  0x147f
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWA  L"\u147f"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWA  U"\u147f"
 #define UNICODE_CANADIAN_SYLLABICS_KWAA  0x1480
-#define UNITEXT_CANADIAN_SYLLABICS_KWAA  L"\u1480"
+#define UNITEXT_CANADIAN_SYLLABICS_KWAA  U"\u1480"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_KWAA  0x1481
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWAA  L"\u1481"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_KWAA  U"\u1481"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_KWAA  0x1482
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_KWAA  L"\u1482"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_KWAA  U"\u1482"
 #define UNICODE_CANADIAN_SYLLABICS_K  0x1483
-#define UNITEXT_CANADIAN_SYLLABICS_K  L"\u1483"
+#define UNITEXT_CANADIAN_SYLLABICS_K  U"\u1483"
 #define UNICODE_CANADIAN_SYLLABICS_KW  0x1484
-#define UNITEXT_CANADIAN_SYLLABICS_KW  L"\u1484"
+#define UNITEXT_CANADIAN_SYLLABICS_KW  U"\u1484"
 #define UNICODE_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KEH  0x1485
-#define UNITEXT_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KEH  L"\u1485"
+#define UNITEXT_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KEH  U"\u1485"
 #define UNICODE_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KIH  0x1486
-#define UNITEXT_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KIH  L"\u1486"
+#define UNITEXT_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KIH  U"\u1486"
 #define UNICODE_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KOH  0x1487
-#define UNITEXT_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KOH  L"\u1487"
+#define UNITEXT_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KOH  U"\u1487"
 #define UNICODE_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KAH  0x1488
-#define UNITEXT_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KAH  L"\u1488"
+#define UNITEXT_CANADIAN_SYLLABICS_SOUTH_SLAVEY_KAH  U"\u1488"
 #define UNICODE_CANADIAN_SYLLABICS_CE  0x1489
-#define UNITEXT_CANADIAN_SYLLABICS_CE  L"\u1489"
+#define UNITEXT_CANADIAN_SYLLABICS_CE  U"\u1489"
 #define UNICODE_CANADIAN_SYLLABICS_CAAI  0x148a
-#define UNITEXT_CANADIAN_SYLLABICS_CAAI  L"\u148a"
+#define UNITEXT_CANADIAN_SYLLABICS_CAAI  U"\u148a"
 #define UNICODE_CANADIAN_SYLLABICS_CI  0x148b
-#define UNITEXT_CANADIAN_SYLLABICS_CI  L"\u148b"
+#define UNITEXT_CANADIAN_SYLLABICS_CI  U"\u148b"
 #define UNICODE_CANADIAN_SYLLABICS_CII  0x148c
-#define UNITEXT_CANADIAN_SYLLABICS_CII  L"\u148c"
+#define UNITEXT_CANADIAN_SYLLABICS_CII  U"\u148c"
 #define UNICODE_CANADIAN_SYLLABICS_CO  0x148d
-#define UNITEXT_CANADIAN_SYLLABICS_CO  L"\u148d"
+#define UNITEXT_CANADIAN_SYLLABICS_CO  U"\u148d"
 #define UNICODE_CANADIAN_SYLLABICS_COO  0x148e
-#define UNITEXT_CANADIAN_SYLLABICS_COO  L"\u148e"
+#define UNITEXT_CANADIAN_SYLLABICS_COO  U"\u148e"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_COO  0x148f
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_COO  L"\u148f"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_COO  U"\u148f"
 #define UNICODE_CANADIAN_SYLLABICS_CA  0x1490
-#define UNITEXT_CANADIAN_SYLLABICS_CA  L"\u1490"
+#define UNITEXT_CANADIAN_SYLLABICS_CA  U"\u1490"
 #define UNICODE_CANADIAN_SYLLABICS_CAA  0x1491
-#define UNITEXT_CANADIAN_SYLLABICS_CAA  L"\u1491"
+#define UNITEXT_CANADIAN_SYLLABICS_CAA  U"\u1491"
 #define UNICODE_CANADIAN_SYLLABICS_CWE  0x1492
-#define UNITEXT_CANADIAN_SYLLABICS_CWE  L"\u1492"
+#define UNITEXT_CANADIAN_SYLLABICS_CWE  U"\u1492"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_CWE  0x1493
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWE  L"\u1493"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWE  U"\u1493"
 #define UNICODE_CANADIAN_SYLLABICS_CWI  0x1494
-#define UNITEXT_CANADIAN_SYLLABICS_CWI  L"\u1494"
+#define UNITEXT_CANADIAN_SYLLABICS_CWI  U"\u1494"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_CWI  0x1495
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWI  L"\u1495"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWI  U"\u1495"
 #define UNICODE_CANADIAN_SYLLABICS_CWII  0x1496
-#define UNITEXT_CANADIAN_SYLLABICS_CWII  L"\u1496"
+#define UNITEXT_CANADIAN_SYLLABICS_CWII  U"\u1496"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_CWII  0x1497
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWII  L"\u1497"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWII  U"\u1497"
 #define UNICODE_CANADIAN_SYLLABICS_CWO  0x1498
-#define UNITEXT_CANADIAN_SYLLABICS_CWO  L"\u1498"
+#define UNITEXT_CANADIAN_SYLLABICS_CWO  U"\u1498"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_CWO  0x1499
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWO  L"\u1499"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWO  U"\u1499"
 #define UNICODE_CANADIAN_SYLLABICS_CWOO  0x149a
-#define UNITEXT_CANADIAN_SYLLABICS_CWOO  L"\u149a"
+#define UNITEXT_CANADIAN_SYLLABICS_CWOO  U"\u149a"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_CWOO  0x149b
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWOO  L"\u149b"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWOO  U"\u149b"
 #define UNICODE_CANADIAN_SYLLABICS_CWA  0x149c
-#define UNITEXT_CANADIAN_SYLLABICS_CWA  L"\u149c"
+#define UNITEXT_CANADIAN_SYLLABICS_CWA  U"\u149c"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_CWA  0x149d
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWA  L"\u149d"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWA  U"\u149d"
 #define UNICODE_CANADIAN_SYLLABICS_CWAA  0x149e
-#define UNITEXT_CANADIAN_SYLLABICS_CWAA  L"\u149e"
+#define UNITEXT_CANADIAN_SYLLABICS_CWAA  U"\u149e"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_CWAA  0x149f
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWAA  L"\u149f"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_CWAA  U"\u149f"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_CWAA  0x14a0
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_CWAA  L"\u14a0"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_CWAA  U"\u14a0"
 #define UNICODE_CANADIAN_SYLLABICS_C  0x14a1
-#define UNITEXT_CANADIAN_SYLLABICS_C  L"\u14a1"
+#define UNITEXT_CANADIAN_SYLLABICS_C  U"\u14a1"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_TH  0x14a2
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_TH  L"\u14a2"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_TH  U"\u14a2"
 #define UNICODE_CANADIAN_SYLLABICS_ME  0x14a3
-#define UNITEXT_CANADIAN_SYLLABICS_ME  L"\u14a3"
+#define UNITEXT_CANADIAN_SYLLABICS_ME  U"\u14a3"
 #define UNICODE_CANADIAN_SYLLABICS_MAAI  0x14a4
-#define UNITEXT_CANADIAN_SYLLABICS_MAAI  L"\u14a4"
+#define UNITEXT_CANADIAN_SYLLABICS_MAAI  U"\u14a4"
 #define UNICODE_CANADIAN_SYLLABICS_MI  0x14a5
-#define UNITEXT_CANADIAN_SYLLABICS_MI  L"\u14a5"
+#define UNITEXT_CANADIAN_SYLLABICS_MI  U"\u14a5"
 #define UNICODE_CANADIAN_SYLLABICS_MII  0x14a6
-#define UNITEXT_CANADIAN_SYLLABICS_MII  L"\u14a6"
+#define UNITEXT_CANADIAN_SYLLABICS_MII  U"\u14a6"
 #define UNICODE_CANADIAN_SYLLABICS_MO  0x14a7
-#define UNITEXT_CANADIAN_SYLLABICS_MO  L"\u14a7"
+#define UNITEXT_CANADIAN_SYLLABICS_MO  U"\u14a7"
 #define UNICODE_CANADIAN_SYLLABICS_MOO  0x14a8
-#define UNITEXT_CANADIAN_SYLLABICS_MOO  L"\u14a8"
+#define UNITEXT_CANADIAN_SYLLABICS_MOO  U"\u14a8"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_MOO  0x14a9
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_MOO  L"\u14a9"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_MOO  U"\u14a9"
 #define UNICODE_CANADIAN_SYLLABICS_MA  0x14aa
-#define UNITEXT_CANADIAN_SYLLABICS_MA  L"\u14aa"
+#define UNITEXT_CANADIAN_SYLLABICS_MA  U"\u14aa"
 #define UNICODE_CANADIAN_SYLLABICS_MAA  0x14ab
-#define UNITEXT_CANADIAN_SYLLABICS_MAA  L"\u14ab"
+#define UNITEXT_CANADIAN_SYLLABICS_MAA  U"\u14ab"
 #define UNICODE_CANADIAN_SYLLABICS_MWE  0x14ac
-#define UNITEXT_CANADIAN_SYLLABICS_MWE  L"\u14ac"
+#define UNITEXT_CANADIAN_SYLLABICS_MWE  U"\u14ac"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_MWE  0x14ad
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWE  L"\u14ad"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWE  U"\u14ad"
 #define UNICODE_CANADIAN_SYLLABICS_MWI  0x14ae
-#define UNITEXT_CANADIAN_SYLLABICS_MWI  L"\u14ae"
+#define UNITEXT_CANADIAN_SYLLABICS_MWI  U"\u14ae"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_MWI  0x14af
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWI  L"\u14af"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWI  U"\u14af"
 #define UNICODE_CANADIAN_SYLLABICS_MWII  0x14b0
-#define UNITEXT_CANADIAN_SYLLABICS_MWII  L"\u14b0"
+#define UNITEXT_CANADIAN_SYLLABICS_MWII  U"\u14b0"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_MWII  0x14b1
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWII  L"\u14b1"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWII  U"\u14b1"
 #define UNICODE_CANADIAN_SYLLABICS_MWO  0x14b2
-#define UNITEXT_CANADIAN_SYLLABICS_MWO  L"\u14b2"
+#define UNITEXT_CANADIAN_SYLLABICS_MWO  U"\u14b2"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_MWO  0x14b3
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWO  L"\u14b3"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWO  U"\u14b3"
 #define UNICODE_CANADIAN_SYLLABICS_MWOO  0x14b4
-#define UNITEXT_CANADIAN_SYLLABICS_MWOO  L"\u14b4"
+#define UNITEXT_CANADIAN_SYLLABICS_MWOO  U"\u14b4"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_MWOO  0x14b5
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWOO  L"\u14b5"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWOO  U"\u14b5"
 #define UNICODE_CANADIAN_SYLLABICS_MWA  0x14b6
-#define UNITEXT_CANADIAN_SYLLABICS_MWA  L"\u14b6"
+#define UNITEXT_CANADIAN_SYLLABICS_MWA  U"\u14b6"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_MWA  0x14b7
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWA  L"\u14b7"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWA  U"\u14b7"
 #define UNICODE_CANADIAN_SYLLABICS_MWAA  0x14b8
-#define UNITEXT_CANADIAN_SYLLABICS_MWAA  L"\u14b8"
+#define UNITEXT_CANADIAN_SYLLABICS_MWAA  U"\u14b8"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_MWAA  0x14b9
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWAA  L"\u14b9"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_MWAA  U"\u14b9"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_MWAA  0x14ba
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_MWAA  L"\u14ba"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_MWAA  U"\u14ba"
 #define UNICODE_CANADIAN_SYLLABICS_M  0x14bb
-#define UNITEXT_CANADIAN_SYLLABICS_M  L"\u14bb"
+#define UNITEXT_CANADIAN_SYLLABICS_M  U"\u14bb"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_M  0x14bc
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_M  L"\u14bc"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_M  U"\u14bc"
 #define UNICODE_CANADIAN_SYLLABICS_MH  0x14bd
-#define UNITEXT_CANADIAN_SYLLABICS_MH  L"\u14bd"
+#define UNITEXT_CANADIAN_SYLLABICS_MH  U"\u14bd"
 #define UNICODE_CANADIAN_SYLLABICS_ATHAPASCAN_M  0x14be
-#define UNITEXT_CANADIAN_SYLLABICS_ATHAPASCAN_M  L"\u14be"
+#define UNITEXT_CANADIAN_SYLLABICS_ATHAPASCAN_M  U"\u14be"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_M  0x14bf
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_M  L"\u14bf"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_M  U"\u14bf"
 #define UNICODE_CANADIAN_SYLLABICS_NE  0x14c0
-#define UNITEXT_CANADIAN_SYLLABICS_NE  L"\u14c0"
+#define UNITEXT_CANADIAN_SYLLABICS_NE  U"\u14c0"
 #define UNICODE_CANADIAN_SYLLABICS_NAAI  0x14c1
-#define UNITEXT_CANADIAN_SYLLABICS_NAAI  L"\u14c1"
+#define UNITEXT_CANADIAN_SYLLABICS_NAAI  U"\u14c1"
 #define UNICODE_CANADIAN_SYLLABICS_NI  0x14c2
-#define UNITEXT_CANADIAN_SYLLABICS_NI  L"\u14c2"
+#define UNITEXT_CANADIAN_SYLLABICS_NI  U"\u14c2"
 #define UNICODE_CANADIAN_SYLLABICS_NII  0x14c3
-#define UNITEXT_CANADIAN_SYLLABICS_NII  L"\u14c3"
+#define UNITEXT_CANADIAN_SYLLABICS_NII  U"\u14c3"
 #define UNICODE_CANADIAN_SYLLABICS_NO  0x14c4
-#define UNITEXT_CANADIAN_SYLLABICS_NO  L"\u14c4"
+#define UNITEXT_CANADIAN_SYLLABICS_NO  U"\u14c4"
 #define UNICODE_CANADIAN_SYLLABICS_NOO  0x14c5
-#define UNITEXT_CANADIAN_SYLLABICS_NOO  L"\u14c5"
+#define UNITEXT_CANADIAN_SYLLABICS_NOO  U"\u14c5"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_NOO  0x14c6
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_NOO  L"\u14c6"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_NOO  U"\u14c6"
 #define UNICODE_CANADIAN_SYLLABICS_NA  0x14c7
-#define UNITEXT_CANADIAN_SYLLABICS_NA  L"\u14c7"
+#define UNITEXT_CANADIAN_SYLLABICS_NA  U"\u14c7"
 #define UNICODE_CANADIAN_SYLLABICS_NAA  0x14c8
-#define UNITEXT_CANADIAN_SYLLABICS_NAA  L"\u14c8"
+#define UNITEXT_CANADIAN_SYLLABICS_NAA  U"\u14c8"
 #define UNICODE_CANADIAN_SYLLABICS_NWE  0x14c9
-#define UNITEXT_CANADIAN_SYLLABICS_NWE  L"\u14c9"
+#define UNITEXT_CANADIAN_SYLLABICS_NWE  U"\u14c9"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_NWE  0x14ca
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_NWE  L"\u14ca"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_NWE  U"\u14ca"
 #define UNICODE_CANADIAN_SYLLABICS_NWA  0x14cb
-#define UNITEXT_CANADIAN_SYLLABICS_NWA  L"\u14cb"
+#define UNITEXT_CANADIAN_SYLLABICS_NWA  U"\u14cb"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_NWA  0x14cc
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_NWA  L"\u14cc"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_NWA  U"\u14cc"
 #define UNICODE_CANADIAN_SYLLABICS_NWAA  0x14cd
-#define UNITEXT_CANADIAN_SYLLABICS_NWAA  L"\u14cd"
+#define UNITEXT_CANADIAN_SYLLABICS_NWAA  U"\u14cd"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_NWAA  0x14ce
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_NWAA  L"\u14ce"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_NWAA  U"\u14ce"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_NWAA  0x14cf
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_NWAA  L"\u14cf"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_NWAA  U"\u14cf"
 #define UNICODE_CANADIAN_SYLLABICS_N  0x14d0
-#define UNITEXT_CANADIAN_SYLLABICS_N  L"\u14d0"
+#define UNITEXT_CANADIAN_SYLLABICS_N  U"\u14d0"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_NG  0x14d1
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NG  L"\u14d1"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NG  U"\u14d1"
 #define UNICODE_CANADIAN_SYLLABICS_NH  0x14d2
-#define UNITEXT_CANADIAN_SYLLABICS_NH  L"\u14d2"
+#define UNITEXT_CANADIAN_SYLLABICS_NH  U"\u14d2"
 #define UNICODE_CANADIAN_SYLLABICS_LE  0x14d3
-#define UNITEXT_CANADIAN_SYLLABICS_LE  L"\u14d3"
+#define UNITEXT_CANADIAN_SYLLABICS_LE  U"\u14d3"
 #define UNICODE_CANADIAN_SYLLABICS_LAAI  0x14d4
-#define UNITEXT_CANADIAN_SYLLABICS_LAAI  L"\u14d4"
+#define UNITEXT_CANADIAN_SYLLABICS_LAAI  U"\u14d4"
 #define UNICODE_CANADIAN_SYLLABICS_LI  0x14d5
-#define UNITEXT_CANADIAN_SYLLABICS_LI  L"\u14d5"
+#define UNITEXT_CANADIAN_SYLLABICS_LI  U"\u14d5"
 #define UNICODE_CANADIAN_SYLLABICS_LII  0x14d6
-#define UNITEXT_CANADIAN_SYLLABICS_LII  L"\u14d6"
+#define UNITEXT_CANADIAN_SYLLABICS_LII  U"\u14d6"
 #define UNICODE_CANADIAN_SYLLABICS_LO  0x14d7
-#define UNITEXT_CANADIAN_SYLLABICS_LO  L"\u14d7"
+#define UNITEXT_CANADIAN_SYLLABICS_LO  U"\u14d7"
 #define UNICODE_CANADIAN_SYLLABICS_LOO  0x14d8
-#define UNITEXT_CANADIAN_SYLLABICS_LOO  L"\u14d8"
+#define UNITEXT_CANADIAN_SYLLABICS_LOO  U"\u14d8"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_LOO  0x14d9
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_LOO  L"\u14d9"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_LOO  U"\u14d9"
 #define UNICODE_CANADIAN_SYLLABICS_LA  0x14da
-#define UNITEXT_CANADIAN_SYLLABICS_LA  L"\u14da"
+#define UNITEXT_CANADIAN_SYLLABICS_LA  U"\u14da"
 #define UNICODE_CANADIAN_SYLLABICS_LAA  0x14db
-#define UNITEXT_CANADIAN_SYLLABICS_LAA  L"\u14db"
+#define UNITEXT_CANADIAN_SYLLABICS_LAA  U"\u14db"
 #define UNICODE_CANADIAN_SYLLABICS_LWE  0x14dc
-#define UNITEXT_CANADIAN_SYLLABICS_LWE  L"\u14dc"
+#define UNITEXT_CANADIAN_SYLLABICS_LWE  U"\u14dc"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_LWE  0x14dd
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWE  L"\u14dd"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWE  U"\u14dd"
 #define UNICODE_CANADIAN_SYLLABICS_LWI  0x14de
-#define UNITEXT_CANADIAN_SYLLABICS_LWI  L"\u14de"
+#define UNITEXT_CANADIAN_SYLLABICS_LWI  U"\u14de"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_LWI  0x14df
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWI  L"\u14df"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWI  U"\u14df"
 #define UNICODE_CANADIAN_SYLLABICS_LWII  0x14e0
-#define UNITEXT_CANADIAN_SYLLABICS_LWII  L"\u14e0"
+#define UNITEXT_CANADIAN_SYLLABICS_LWII  U"\u14e0"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_LWII  0x14e1
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWII  L"\u14e1"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWII  U"\u14e1"
 #define UNICODE_CANADIAN_SYLLABICS_LWO  0x14e2
-#define UNITEXT_CANADIAN_SYLLABICS_LWO  L"\u14e2"
+#define UNITEXT_CANADIAN_SYLLABICS_LWO  U"\u14e2"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_LWO  0x14e3
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWO  L"\u14e3"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWO  U"\u14e3"
 #define UNICODE_CANADIAN_SYLLABICS_LWOO  0x14e4
-#define UNITEXT_CANADIAN_SYLLABICS_LWOO  L"\u14e4"
+#define UNITEXT_CANADIAN_SYLLABICS_LWOO  U"\u14e4"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_LWOO  0x14e5
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWOO  L"\u14e5"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWOO  U"\u14e5"
 #define UNICODE_CANADIAN_SYLLABICS_LWA  0x14e6
-#define UNITEXT_CANADIAN_SYLLABICS_LWA  L"\u14e6"
+#define UNITEXT_CANADIAN_SYLLABICS_LWA  U"\u14e6"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_LWA  0x14e7
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWA  L"\u14e7"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWA  U"\u14e7"
 #define UNICODE_CANADIAN_SYLLABICS_LWAA  0x14e8
-#define UNITEXT_CANADIAN_SYLLABICS_LWAA  L"\u14e8"
+#define UNITEXT_CANADIAN_SYLLABICS_LWAA  U"\u14e8"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_LWAA  0x14e9
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWAA  L"\u14e9"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LWAA  U"\u14e9"
 #define UNICODE_CANADIAN_SYLLABICS_L  0x14ea
-#define UNITEXT_CANADIAN_SYLLABICS_L  L"\u14ea"
+#define UNITEXT_CANADIAN_SYLLABICS_L  U"\u14ea"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_L  0x14eb
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_L  L"\u14eb"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_L  U"\u14eb"
 #define UNICODE_CANADIAN_SYLLABICS_MEDIAL_L  0x14ec
-#define UNITEXT_CANADIAN_SYLLABICS_MEDIAL_L  L"\u14ec"
+#define UNITEXT_CANADIAN_SYLLABICS_MEDIAL_L  U"\u14ec"
 #define UNICODE_CANADIAN_SYLLABICS_SE  0x14ed
-#define UNITEXT_CANADIAN_SYLLABICS_SE  L"\u14ed"
+#define UNITEXT_CANADIAN_SYLLABICS_SE  U"\u14ed"
 #define UNICODE_CANADIAN_SYLLABICS_SAAI  0x14ee
-#define UNITEXT_CANADIAN_SYLLABICS_SAAI  L"\u14ee"
+#define UNITEXT_CANADIAN_SYLLABICS_SAAI  U"\u14ee"
 #define UNICODE_CANADIAN_SYLLABICS_SI  0x14ef
-#define UNITEXT_CANADIAN_SYLLABICS_SI  L"\u14ef"
+#define UNITEXT_CANADIAN_SYLLABICS_SI  U"\u14ef"
 #define UNICODE_CANADIAN_SYLLABICS_SII  0x14f0
-#define UNITEXT_CANADIAN_SYLLABICS_SII  L"\u14f0"
+#define UNITEXT_CANADIAN_SYLLABICS_SII  U"\u14f0"
 #define UNICODE_CANADIAN_SYLLABICS_SO  0x14f1
-#define UNITEXT_CANADIAN_SYLLABICS_SO  L"\u14f1"
+#define UNITEXT_CANADIAN_SYLLABICS_SO  U"\u14f1"
 #define UNICODE_CANADIAN_SYLLABICS_SOO  0x14f2
-#define UNITEXT_CANADIAN_SYLLABICS_SOO  L"\u14f2"
+#define UNITEXT_CANADIAN_SYLLABICS_SOO  U"\u14f2"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_SOO  0x14f3
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_SOO  L"\u14f3"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_SOO  U"\u14f3"
 #define UNICODE_CANADIAN_SYLLABICS_SA  0x14f4
-#define UNITEXT_CANADIAN_SYLLABICS_SA  L"\u14f4"
+#define UNITEXT_CANADIAN_SYLLABICS_SA  U"\u14f4"
 #define UNICODE_CANADIAN_SYLLABICS_SAA  0x14f5
-#define UNITEXT_CANADIAN_SYLLABICS_SAA  L"\u14f5"
+#define UNITEXT_CANADIAN_SYLLABICS_SAA  U"\u14f5"
 #define UNICODE_CANADIAN_SYLLABICS_SWE  0x14f6
-#define UNITEXT_CANADIAN_SYLLABICS_SWE  L"\u14f6"
+#define UNITEXT_CANADIAN_SYLLABICS_SWE  U"\u14f6"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SWE  0x14f7
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWE  L"\u14f7"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWE  U"\u14f7"
 #define UNICODE_CANADIAN_SYLLABICS_SWI  0x14f8
-#define UNITEXT_CANADIAN_SYLLABICS_SWI  L"\u14f8"
+#define UNITEXT_CANADIAN_SYLLABICS_SWI  U"\u14f8"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SWI  0x14f9
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWI  L"\u14f9"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWI  U"\u14f9"
 #define UNICODE_CANADIAN_SYLLABICS_SWII  0x14fa
-#define UNITEXT_CANADIAN_SYLLABICS_SWII  L"\u14fa"
+#define UNITEXT_CANADIAN_SYLLABICS_SWII  U"\u14fa"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SWII  0x14fb
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWII  L"\u14fb"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWII  U"\u14fb"
 #define UNICODE_CANADIAN_SYLLABICS_SWO  0x14fc
-#define UNITEXT_CANADIAN_SYLLABICS_SWO  L"\u14fc"
+#define UNITEXT_CANADIAN_SYLLABICS_SWO  U"\u14fc"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SWO  0x14fd
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWO  L"\u14fd"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWO  U"\u14fd"
 #define UNICODE_CANADIAN_SYLLABICS_SWOO  0x14fe
-#define UNITEXT_CANADIAN_SYLLABICS_SWOO  L"\u14fe"
+#define UNITEXT_CANADIAN_SYLLABICS_SWOO  U"\u14fe"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SWOO  0x14ff
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWOO  L"\u14ff"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWOO  U"\u14ff"
 #define UNICODE_CANADIAN_SYLLABICS_SWA  0x1500
-#define UNITEXT_CANADIAN_SYLLABICS_SWA  L"\u1500"
+#define UNITEXT_CANADIAN_SYLLABICS_SWA  U"\u1500"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SWA  0x1501
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWA  L"\u1501"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWA  U"\u1501"
 #define UNICODE_CANADIAN_SYLLABICS_SWAA  0x1502
-#define UNITEXT_CANADIAN_SYLLABICS_SWAA  L"\u1502"
+#define UNITEXT_CANADIAN_SYLLABICS_SWAA  U"\u1502"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SWAA  0x1503
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWAA  L"\u1503"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SWAA  U"\u1503"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_SWAA  0x1504
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_SWAA  L"\u1504"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_SWAA  U"\u1504"
 #define UNICODE_CANADIAN_SYLLABICS_S  0x1505
-#define UNITEXT_CANADIAN_SYLLABICS_S  L"\u1505"
+#define UNITEXT_CANADIAN_SYLLABICS_S  U"\u1505"
 #define UNICODE_CANADIAN_SYLLABICS_ATHAPASCAN_S  0x1506
-#define UNITEXT_CANADIAN_SYLLABICS_ATHAPASCAN_S  L"\u1506"
+#define UNITEXT_CANADIAN_SYLLABICS_ATHAPASCAN_S  U"\u1506"
 #define UNICODE_CANADIAN_SYLLABICS_SW  0x1507
-#define UNITEXT_CANADIAN_SYLLABICS_SW  L"\u1507"
+#define UNITEXT_CANADIAN_SYLLABICS_SW  U"\u1507"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_S  0x1508
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_S  L"\u1508"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_S  U"\u1508"
 #define UNICODE_CANADIAN_SYLLABICS_MOOSE_CREE_SK  0x1509
-#define UNITEXT_CANADIAN_SYLLABICS_MOOSE_CREE_SK  L"\u1509"
+#define UNITEXT_CANADIAN_SYLLABICS_MOOSE_CREE_SK  U"\u1509"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_SKW  0x150a
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_SKW  L"\u150a"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_SKW  U"\u150a"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_S_W  0x150b
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_S_W  L"\u150b"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_S_W  U"\u150b"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_SPWA  0x150c
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_SPWA  L"\u150c"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_SPWA  U"\u150c"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_STWA  0x150d
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_STWA  L"\u150d"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_STWA  U"\u150d"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_SKWA  0x150e
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_SKWA  L"\u150e"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_SKWA  U"\u150e"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_SCWA  0x150f
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_SCWA  L"\u150f"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_SCWA  U"\u150f"
 #define UNICODE_CANADIAN_SYLLABICS_SHE  0x1510
-#define UNITEXT_CANADIAN_SYLLABICS_SHE  L"\u1510"
+#define UNITEXT_CANADIAN_SYLLABICS_SHE  U"\u1510"
 #define UNICODE_CANADIAN_SYLLABICS_SHI  0x1511
-#define UNITEXT_CANADIAN_SYLLABICS_SHI  L"\u1511"
+#define UNITEXT_CANADIAN_SYLLABICS_SHI  U"\u1511"
 #define UNICODE_CANADIAN_SYLLABICS_SHII  0x1512
-#define UNITEXT_CANADIAN_SYLLABICS_SHII  L"\u1512"
+#define UNITEXT_CANADIAN_SYLLABICS_SHII  U"\u1512"
 #define UNICODE_CANADIAN_SYLLABICS_SHO  0x1513
-#define UNITEXT_CANADIAN_SYLLABICS_SHO  L"\u1513"
+#define UNITEXT_CANADIAN_SYLLABICS_SHO  U"\u1513"
 #define UNICODE_CANADIAN_SYLLABICS_SHOO  0x1514
-#define UNITEXT_CANADIAN_SYLLABICS_SHOO  L"\u1514"
+#define UNITEXT_CANADIAN_SYLLABICS_SHOO  U"\u1514"
 #define UNICODE_CANADIAN_SYLLABICS_SHA  0x1515
-#define UNITEXT_CANADIAN_SYLLABICS_SHA  L"\u1515"
+#define UNITEXT_CANADIAN_SYLLABICS_SHA  U"\u1515"
 #define UNICODE_CANADIAN_SYLLABICS_SHAA  0x1516
-#define UNITEXT_CANADIAN_SYLLABICS_SHAA  L"\u1516"
+#define UNITEXT_CANADIAN_SYLLABICS_SHAA  U"\u1516"
 #define UNICODE_CANADIAN_SYLLABICS_SHWE  0x1517
-#define UNITEXT_CANADIAN_SYLLABICS_SHWE  L"\u1517"
+#define UNITEXT_CANADIAN_SYLLABICS_SHWE  U"\u1517"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SHWE  0x1518
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWE  L"\u1518"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWE  U"\u1518"
 #define UNICODE_CANADIAN_SYLLABICS_SHWI  0x1519
-#define UNITEXT_CANADIAN_SYLLABICS_SHWI  L"\u1519"
+#define UNITEXT_CANADIAN_SYLLABICS_SHWI  U"\u1519"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SHWI  0x151a
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWI  L"\u151a"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWI  U"\u151a"
 #define UNICODE_CANADIAN_SYLLABICS_SHWII  0x151b
-#define UNITEXT_CANADIAN_SYLLABICS_SHWII  L"\u151b"
+#define UNITEXT_CANADIAN_SYLLABICS_SHWII  U"\u151b"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SHWII  0x151c
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWII  L"\u151c"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWII  U"\u151c"
 #define UNICODE_CANADIAN_SYLLABICS_SHWO  0x151d
-#define UNITEXT_CANADIAN_SYLLABICS_SHWO  L"\u151d"
+#define UNITEXT_CANADIAN_SYLLABICS_SHWO  U"\u151d"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SHWO  0x151e
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWO  L"\u151e"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWO  U"\u151e"
 #define UNICODE_CANADIAN_SYLLABICS_SHWOO  0x151f
-#define UNITEXT_CANADIAN_SYLLABICS_SHWOO  L"\u151f"
+#define UNITEXT_CANADIAN_SYLLABICS_SHWOO  U"\u151f"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SHWOO  0x1520
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWOO  L"\u1520"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWOO  U"\u1520"
 #define UNICODE_CANADIAN_SYLLABICS_SHWA  0x1521
-#define UNITEXT_CANADIAN_SYLLABICS_SHWA  L"\u1521"
+#define UNITEXT_CANADIAN_SYLLABICS_SHWA  U"\u1521"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SHWA  0x1522
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWA  L"\u1522"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWA  U"\u1522"
 #define UNICODE_CANADIAN_SYLLABICS_SHWAA  0x1523
-#define UNITEXT_CANADIAN_SYLLABICS_SHWAA  L"\u1523"
+#define UNITEXT_CANADIAN_SYLLABICS_SHWAA  U"\u1523"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_SHWAA  0x1524
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWAA  L"\u1524"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_SHWAA  U"\u1524"
 #define UNICODE_CANADIAN_SYLLABICS_SH  0x1525
-#define UNITEXT_CANADIAN_SYLLABICS_SH  L"\u1525"
+#define UNITEXT_CANADIAN_SYLLABICS_SH  U"\u1525"
 #define UNICODE_CANADIAN_SYLLABICS_YE  0x1526
-#define UNITEXT_CANADIAN_SYLLABICS_YE  L"\u1526"
+#define UNITEXT_CANADIAN_SYLLABICS_YE  U"\u1526"
 #define UNICODE_CANADIAN_SYLLABICS_YAAI  0x1527
-#define UNITEXT_CANADIAN_SYLLABICS_YAAI  L"\u1527"
+#define UNITEXT_CANADIAN_SYLLABICS_YAAI  U"\u1527"
 #define UNICODE_CANADIAN_SYLLABICS_YI  0x1528
-#define UNITEXT_CANADIAN_SYLLABICS_YI  L"\u1528"
+#define UNITEXT_CANADIAN_SYLLABICS_YI  U"\u1528"
 #define UNICODE_CANADIAN_SYLLABICS_YII  0x1529
-#define UNITEXT_CANADIAN_SYLLABICS_YII  L"\u1529"
+#define UNITEXT_CANADIAN_SYLLABICS_YII  U"\u1529"
 #define UNICODE_CANADIAN_SYLLABICS_YO  0x152a
-#define UNITEXT_CANADIAN_SYLLABICS_YO  L"\u152a"
+#define UNITEXT_CANADIAN_SYLLABICS_YO  U"\u152a"
 #define UNICODE_CANADIAN_SYLLABICS_YOO  0x152b
-#define UNITEXT_CANADIAN_SYLLABICS_YOO  L"\u152b"
+#define UNITEXT_CANADIAN_SYLLABICS_YOO  U"\u152b"
 #define UNICODE_CANADIAN_SYLLABICS_Y_CREE_YOO  0x152c
-#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_YOO  L"\u152c"
+#define UNITEXT_CANADIAN_SYLLABICS_Y_CREE_YOO  U"\u152c"
 #define UNICODE_CANADIAN_SYLLABICS_YA  0x152d
-#define UNITEXT_CANADIAN_SYLLABICS_YA  L"\u152d"
+#define UNITEXT_CANADIAN_SYLLABICS_YA  U"\u152d"
 #define UNICODE_CANADIAN_SYLLABICS_YAA  0x152e
-#define UNITEXT_CANADIAN_SYLLABICS_YAA  L"\u152e"
+#define UNITEXT_CANADIAN_SYLLABICS_YAA  U"\u152e"
 #define UNICODE_CANADIAN_SYLLABICS_YWE  0x152f
-#define UNITEXT_CANADIAN_SYLLABICS_YWE  L"\u152f"
+#define UNITEXT_CANADIAN_SYLLABICS_YWE  U"\u152f"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_YWE  0x1530
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWE  L"\u1530"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWE  U"\u1530"
 #define UNICODE_CANADIAN_SYLLABICS_YWI  0x1531
-#define UNITEXT_CANADIAN_SYLLABICS_YWI  L"\u1531"
+#define UNITEXT_CANADIAN_SYLLABICS_YWI  U"\u1531"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_YWI  0x1532
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWI  L"\u1532"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWI  U"\u1532"
 #define UNICODE_CANADIAN_SYLLABICS_YWII  0x1533
-#define UNITEXT_CANADIAN_SYLLABICS_YWII  L"\u1533"
+#define UNITEXT_CANADIAN_SYLLABICS_YWII  U"\u1533"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_YWII  0x1534
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWII  L"\u1534"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWII  U"\u1534"
 #define UNICODE_CANADIAN_SYLLABICS_YWO  0x1535
-#define UNITEXT_CANADIAN_SYLLABICS_YWO  L"\u1535"
+#define UNITEXT_CANADIAN_SYLLABICS_YWO  U"\u1535"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_YWO  0x1536
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWO  L"\u1536"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWO  U"\u1536"
 #define UNICODE_CANADIAN_SYLLABICS_YWOO  0x1537
-#define UNITEXT_CANADIAN_SYLLABICS_YWOO  L"\u1537"
+#define UNITEXT_CANADIAN_SYLLABICS_YWOO  U"\u1537"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_YWOO  0x1538
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWOO  L"\u1538"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWOO  U"\u1538"
 #define UNICODE_CANADIAN_SYLLABICS_YWA  0x1539
-#define UNITEXT_CANADIAN_SYLLABICS_YWA  L"\u1539"
+#define UNITEXT_CANADIAN_SYLLABICS_YWA  U"\u1539"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_YWA  0x153a
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWA  L"\u153a"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWA  U"\u153a"
 #define UNICODE_CANADIAN_SYLLABICS_YWAA  0x153b
-#define UNITEXT_CANADIAN_SYLLABICS_YWAA  L"\u153b"
+#define UNITEXT_CANADIAN_SYLLABICS_YWAA  U"\u153b"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_YWAA  0x153c
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWAA  L"\u153c"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_YWAA  U"\u153c"
 #define UNICODE_CANADIAN_SYLLABICS_NASKAPI_YWAA  0x153d
-#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_YWAA  L"\u153d"
+#define UNITEXT_CANADIAN_SYLLABICS_NASKAPI_YWAA  U"\u153d"
 #define UNICODE_CANADIAN_SYLLABICS_Y  0x153e
-#define UNITEXT_CANADIAN_SYLLABICS_Y  L"\u153e"
+#define UNITEXT_CANADIAN_SYLLABICS_Y  U"\u153e"
 #define UNICODE_CANADIAN_SYLLABICS_BIBLE_CREE_Y  0x153f
-#define UNITEXT_CANADIAN_SYLLABICS_BIBLE_CREE_Y  L"\u153f"
+#define UNITEXT_CANADIAN_SYLLABICS_BIBLE_CREE_Y  U"\u153f"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_Y  0x1540
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_Y  L"\u1540"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_Y  U"\u1540"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_YI  0x1541
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_YI  L"\u1541"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_YI  U"\u1541"
 #define UNICODE_CANADIAN_SYLLABICS_RE  0x1542
-#define UNITEXT_CANADIAN_SYLLABICS_RE  L"\u1542"
+#define UNITEXT_CANADIAN_SYLLABICS_RE  U"\u1542"
 #define UNICODE_CANADIAN_SYLLABICS_R_CREE_RE  0x1543
-#define UNITEXT_CANADIAN_SYLLABICS_R_CREE_RE  L"\u1543"
+#define UNITEXT_CANADIAN_SYLLABICS_R_CREE_RE  U"\u1543"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_LE  0x1544
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LE  L"\u1544"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LE  U"\u1544"
 #define UNICODE_CANADIAN_SYLLABICS_RAAI  0x1545
-#define UNITEXT_CANADIAN_SYLLABICS_RAAI  L"\u1545"
+#define UNITEXT_CANADIAN_SYLLABICS_RAAI  U"\u1545"
 #define UNICODE_CANADIAN_SYLLABICS_RI  0x1546
-#define UNITEXT_CANADIAN_SYLLABICS_RI  L"\u1546"
+#define UNITEXT_CANADIAN_SYLLABICS_RI  U"\u1546"
 #define UNICODE_CANADIAN_SYLLABICS_RII  0x1547
-#define UNITEXT_CANADIAN_SYLLABICS_RII  L"\u1547"
+#define UNITEXT_CANADIAN_SYLLABICS_RII  U"\u1547"
 #define UNICODE_CANADIAN_SYLLABICS_RO  0x1548
-#define UNITEXT_CANADIAN_SYLLABICS_RO  L"\u1548"
+#define UNITEXT_CANADIAN_SYLLABICS_RO  U"\u1548"
 #define UNICODE_CANADIAN_SYLLABICS_ROO  0x1549
-#define UNITEXT_CANADIAN_SYLLABICS_ROO  L"\u1549"
+#define UNITEXT_CANADIAN_SYLLABICS_ROO  U"\u1549"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_LO  0x154a
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LO  L"\u154a"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LO  U"\u154a"
 #define UNICODE_CANADIAN_SYLLABICS_RA  0x154b
-#define UNITEXT_CANADIAN_SYLLABICS_RA  L"\u154b"
+#define UNITEXT_CANADIAN_SYLLABICS_RA  U"\u154b"
 #define UNICODE_CANADIAN_SYLLABICS_RAA  0x154c
-#define UNITEXT_CANADIAN_SYLLABICS_RAA  L"\u154c"
+#define UNITEXT_CANADIAN_SYLLABICS_RAA  U"\u154c"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_LA  0x154d
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LA  L"\u154d"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_LA  U"\u154d"
 #define UNICODE_CANADIAN_SYLLABICS_RWAA  0x154e
-#define UNITEXT_CANADIAN_SYLLABICS_RWAA  L"\u154e"
+#define UNITEXT_CANADIAN_SYLLABICS_RWAA  U"\u154e"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_RWAA  0x154f
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_RWAA  L"\u154f"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_RWAA  U"\u154f"
 #define UNICODE_CANADIAN_SYLLABICS_R  0x1550
-#define UNITEXT_CANADIAN_SYLLABICS_R  L"\u1550"
+#define UNITEXT_CANADIAN_SYLLABICS_R  U"\u1550"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_R  0x1551
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_R  L"\u1551"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_R  U"\u1551"
 #define UNICODE_CANADIAN_SYLLABICS_MEDIAL_R  0x1552
-#define UNITEXT_CANADIAN_SYLLABICS_MEDIAL_R  L"\u1552"
+#define UNITEXT_CANADIAN_SYLLABICS_MEDIAL_R  U"\u1552"
 #define UNICODE_CANADIAN_SYLLABICS_FE  0x1553
-#define UNITEXT_CANADIAN_SYLLABICS_FE  L"\u1553"
+#define UNITEXT_CANADIAN_SYLLABICS_FE  U"\u1553"
 #define UNICODE_CANADIAN_SYLLABICS_FAAI  0x1554
-#define UNITEXT_CANADIAN_SYLLABICS_FAAI  L"\u1554"
+#define UNITEXT_CANADIAN_SYLLABICS_FAAI  U"\u1554"
 #define UNICODE_CANADIAN_SYLLABICS_FI  0x1555
-#define UNITEXT_CANADIAN_SYLLABICS_FI  L"\u1555"
+#define UNITEXT_CANADIAN_SYLLABICS_FI  U"\u1555"
 #define UNICODE_CANADIAN_SYLLABICS_FII  0x1556
-#define UNITEXT_CANADIAN_SYLLABICS_FII  L"\u1556"
+#define UNITEXT_CANADIAN_SYLLABICS_FII  U"\u1556"
 #define UNICODE_CANADIAN_SYLLABICS_FO  0x1557
-#define UNITEXT_CANADIAN_SYLLABICS_FO  L"\u1557"
+#define UNITEXT_CANADIAN_SYLLABICS_FO  U"\u1557"
 #define UNICODE_CANADIAN_SYLLABICS_FOO  0x1558
-#define UNITEXT_CANADIAN_SYLLABICS_FOO  L"\u1558"
+#define UNITEXT_CANADIAN_SYLLABICS_FOO  U"\u1558"
 #define UNICODE_CANADIAN_SYLLABICS_FA  0x1559
-#define UNITEXT_CANADIAN_SYLLABICS_FA  L"\u1559"
+#define UNITEXT_CANADIAN_SYLLABICS_FA  U"\u1559"
 #define UNICODE_CANADIAN_SYLLABICS_FAA  0x155a
-#define UNITEXT_CANADIAN_SYLLABICS_FAA  L"\u155a"
+#define UNITEXT_CANADIAN_SYLLABICS_FAA  U"\u155a"
 #define UNICODE_CANADIAN_SYLLABICS_FWAA  0x155b
-#define UNITEXT_CANADIAN_SYLLABICS_FWAA  L"\u155b"
+#define UNITEXT_CANADIAN_SYLLABICS_FWAA  U"\u155b"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_FWAA  0x155c
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_FWAA  L"\u155c"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_FWAA  U"\u155c"
 #define UNICODE_CANADIAN_SYLLABICS_F  0x155d
-#define UNITEXT_CANADIAN_SYLLABICS_F  L"\u155d"
+#define UNITEXT_CANADIAN_SYLLABICS_F  U"\u155d"
 #define UNICODE_CANADIAN_SYLLABICS_THE  0x155e
-#define UNITEXT_CANADIAN_SYLLABICS_THE  L"\u155e"
+#define UNITEXT_CANADIAN_SYLLABICS_THE  U"\u155e"
 #define UNICODE_CANADIAN_SYLLABICS_N_CREE_THE  0x155f
-#define UNITEXT_CANADIAN_SYLLABICS_N_CREE_THE  L"\u155f"
+#define UNITEXT_CANADIAN_SYLLABICS_N_CREE_THE  U"\u155f"
 #define UNICODE_CANADIAN_SYLLABICS_THI  0x1560
-#define UNITEXT_CANADIAN_SYLLABICS_THI  L"\u1560"
+#define UNITEXT_CANADIAN_SYLLABICS_THI  U"\u1560"
 #define UNICODE_CANADIAN_SYLLABICS_N_CREE_THI  0x1561
-#define UNITEXT_CANADIAN_SYLLABICS_N_CREE_THI  L"\u1561"
+#define UNITEXT_CANADIAN_SYLLABICS_N_CREE_THI  U"\u1561"
 #define UNICODE_CANADIAN_SYLLABICS_THII  0x1562
-#define UNITEXT_CANADIAN_SYLLABICS_THII  L"\u1562"
+#define UNITEXT_CANADIAN_SYLLABICS_THII  U"\u1562"
 #define UNICODE_CANADIAN_SYLLABICS_N_CREE_THII  0x1563
-#define UNITEXT_CANADIAN_SYLLABICS_N_CREE_THII  L"\u1563"
+#define UNITEXT_CANADIAN_SYLLABICS_N_CREE_THII  U"\u1563"
 #define UNICODE_CANADIAN_SYLLABICS_THO  0x1564
-#define UNITEXT_CANADIAN_SYLLABICS_THO  L"\u1564"
+#define UNITEXT_CANADIAN_SYLLABICS_THO  U"\u1564"
 #define UNICODE_CANADIAN_SYLLABICS_THOO  0x1565
-#define UNITEXT_CANADIAN_SYLLABICS_THOO  L"\u1565"
+#define UNITEXT_CANADIAN_SYLLABICS_THOO  U"\u1565"
 #define UNICODE_CANADIAN_SYLLABICS_THA  0x1566
-#define UNITEXT_CANADIAN_SYLLABICS_THA  L"\u1566"
+#define UNITEXT_CANADIAN_SYLLABICS_THA  U"\u1566"
 #define UNICODE_CANADIAN_SYLLABICS_THAA  0x1567
-#define UNITEXT_CANADIAN_SYLLABICS_THAA  L"\u1567"
+#define UNITEXT_CANADIAN_SYLLABICS_THAA  U"\u1567"
 #define UNICODE_CANADIAN_SYLLABICS_THWAA  0x1568
-#define UNITEXT_CANADIAN_SYLLABICS_THWAA  L"\u1568"
+#define UNITEXT_CANADIAN_SYLLABICS_THWAA  U"\u1568"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_THWAA  0x1569
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_THWAA  L"\u1569"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_THWAA  U"\u1569"
 #define UNICODE_CANADIAN_SYLLABICS_TH  0x156a
-#define UNITEXT_CANADIAN_SYLLABICS_TH  L"\u156a"
+#define UNITEXT_CANADIAN_SYLLABICS_TH  U"\u156a"
 #define UNICODE_CANADIAN_SYLLABICS_TTHE  0x156b
-#define UNITEXT_CANADIAN_SYLLABICS_TTHE  L"\u156b"
+#define UNITEXT_CANADIAN_SYLLABICS_TTHE  U"\u156b"
 #define UNICODE_CANADIAN_SYLLABICS_TTHI  0x156c
-#define UNITEXT_CANADIAN_SYLLABICS_TTHI  L"\u156c"
+#define UNITEXT_CANADIAN_SYLLABICS_TTHI  U"\u156c"
 #define UNICODE_CANADIAN_SYLLABICS_TTHO  0x156d
-#define UNITEXT_CANADIAN_SYLLABICS_TTHO  L"\u156d"
+#define UNITEXT_CANADIAN_SYLLABICS_TTHO  U"\u156d"
 #define UNICODE_CANADIAN_SYLLABICS_TTHA  0x156e
-#define UNITEXT_CANADIAN_SYLLABICS_TTHA  L"\u156e"
+#define UNITEXT_CANADIAN_SYLLABICS_TTHA  U"\u156e"
 #define UNICODE_CANADIAN_SYLLABICS_TTH  0x156f
-#define UNITEXT_CANADIAN_SYLLABICS_TTH  L"\u156f"
+#define UNITEXT_CANADIAN_SYLLABICS_TTH  U"\u156f"
 #define UNICODE_CANADIAN_SYLLABICS_TYE  0x1570
-#define UNITEXT_CANADIAN_SYLLABICS_TYE  L"\u1570"
+#define UNITEXT_CANADIAN_SYLLABICS_TYE  U"\u1570"
 #define UNICODE_CANADIAN_SYLLABICS_TYI  0x1571
-#define UNITEXT_CANADIAN_SYLLABICS_TYI  L"\u1571"
+#define UNITEXT_CANADIAN_SYLLABICS_TYI  U"\u1571"
 #define UNICODE_CANADIAN_SYLLABICS_TYO  0x1572
-#define UNITEXT_CANADIAN_SYLLABICS_TYO  L"\u1572"
+#define UNITEXT_CANADIAN_SYLLABICS_TYO  U"\u1572"
 #define UNICODE_CANADIAN_SYLLABICS_TYA  0x1573
-#define UNITEXT_CANADIAN_SYLLABICS_TYA  L"\u1573"
+#define UNITEXT_CANADIAN_SYLLABICS_TYA  U"\u1573"
 #define UNICODE_CANADIAN_SYLLABICS_NUNAVIK_HE  0x1574
-#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HE  L"\u1574"
+#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HE  U"\u1574"
 #define UNICODE_CANADIAN_SYLLABICS_NUNAVIK_HI  0x1575
-#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HI  L"\u1575"
+#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HI  U"\u1575"
 #define UNICODE_CANADIAN_SYLLABICS_NUNAVIK_HII  0x1576
-#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HII  L"\u1576"
+#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HII  U"\u1576"
 #define UNICODE_CANADIAN_SYLLABICS_NUNAVIK_HO  0x1577
-#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HO  L"\u1577"
+#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HO  U"\u1577"
 #define UNICODE_CANADIAN_SYLLABICS_NUNAVIK_HOO  0x1578
-#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HOO  L"\u1578"
+#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HOO  U"\u1578"
 #define UNICODE_CANADIAN_SYLLABICS_NUNAVIK_HA  0x1579
-#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HA  L"\u1579"
+#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HA  U"\u1579"
 #define UNICODE_CANADIAN_SYLLABICS_NUNAVIK_HAA  0x157a
-#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HAA  L"\u157a"
+#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_HAA  U"\u157a"
 #define UNICODE_CANADIAN_SYLLABICS_NUNAVIK_H  0x157b
-#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_H  L"\u157b"
+#define UNITEXT_CANADIAN_SYLLABICS_NUNAVIK_H  U"\u157b"
 #define UNICODE_CANADIAN_SYLLABICS_NUNAVUT_H  0x157c
-#define UNITEXT_CANADIAN_SYLLABICS_NUNAVUT_H  L"\u157c"
+#define UNITEXT_CANADIAN_SYLLABICS_NUNAVUT_H  U"\u157c"
 #define UNICODE_CANADIAN_SYLLABICS_HK  0x157d
-#define UNITEXT_CANADIAN_SYLLABICS_HK  L"\u157d"
+#define UNITEXT_CANADIAN_SYLLABICS_HK  U"\u157d"
 #define UNICODE_CANADIAN_SYLLABICS_QAAI  0x157e
-#define UNITEXT_CANADIAN_SYLLABICS_QAAI  L"\u157e"
+#define UNITEXT_CANADIAN_SYLLABICS_QAAI  U"\u157e"
 #define UNICODE_CANADIAN_SYLLABICS_QI  0x157f
-#define UNITEXT_CANADIAN_SYLLABICS_QI  L"\u157f"
+#define UNITEXT_CANADIAN_SYLLABICS_QI  U"\u157f"
 #define UNICODE_CANADIAN_SYLLABICS_QII  0x1580
-#define UNITEXT_CANADIAN_SYLLABICS_QII  L"\u1580"
+#define UNITEXT_CANADIAN_SYLLABICS_QII  U"\u1580"
 #define UNICODE_CANADIAN_SYLLABICS_QO  0x1581
-#define UNITEXT_CANADIAN_SYLLABICS_QO  L"\u1581"
+#define UNITEXT_CANADIAN_SYLLABICS_QO  U"\u1581"
 #define UNICODE_CANADIAN_SYLLABICS_QOO  0x1582
-#define UNITEXT_CANADIAN_SYLLABICS_QOO  L"\u1582"
+#define UNITEXT_CANADIAN_SYLLABICS_QOO  U"\u1582"
 #define UNICODE_CANADIAN_SYLLABICS_QA  0x1583
-#define UNITEXT_CANADIAN_SYLLABICS_QA  L"\u1583"
+#define UNITEXT_CANADIAN_SYLLABICS_QA  U"\u1583"
 #define UNICODE_CANADIAN_SYLLABICS_QAA  0x1584
-#define UNITEXT_CANADIAN_SYLLABICS_QAA  L"\u1584"
+#define UNITEXT_CANADIAN_SYLLABICS_QAA  U"\u1584"
 #define UNICODE_CANADIAN_SYLLABICS_Q  0x1585
-#define UNITEXT_CANADIAN_SYLLABICS_Q  L"\u1585"
+#define UNITEXT_CANADIAN_SYLLABICS_Q  U"\u1585"
 #define UNICODE_CANADIAN_SYLLABICS_TLHE  0x1586
-#define UNITEXT_CANADIAN_SYLLABICS_TLHE  L"\u1586"
+#define UNITEXT_CANADIAN_SYLLABICS_TLHE  U"\u1586"
 #define UNICODE_CANADIAN_SYLLABICS_TLHI  0x1587
-#define UNITEXT_CANADIAN_SYLLABICS_TLHI  L"\u1587"
+#define UNITEXT_CANADIAN_SYLLABICS_TLHI  U"\u1587"
 #define UNICODE_CANADIAN_SYLLABICS_TLHO  0x1588
-#define UNITEXT_CANADIAN_SYLLABICS_TLHO  L"\u1588"
+#define UNITEXT_CANADIAN_SYLLABICS_TLHO  U"\u1588"
 #define UNICODE_CANADIAN_SYLLABICS_TLHA  0x1589
-#define UNITEXT_CANADIAN_SYLLABICS_TLHA  L"\u1589"
+#define UNITEXT_CANADIAN_SYLLABICS_TLHA  U"\u1589"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_RE  0x158a
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_RE  L"\u158a"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_RE  U"\u158a"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_RI  0x158b
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_RI  L"\u158b"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_RI  U"\u158b"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_RO  0x158c
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_RO  L"\u158c"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_RO  U"\u158c"
 #define UNICODE_CANADIAN_SYLLABICS_WEST_CREE_RA  0x158d
-#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_RA  L"\u158d"
+#define UNITEXT_CANADIAN_SYLLABICS_WEST_CREE_RA  U"\u158d"
 #define UNICODE_CANADIAN_SYLLABICS_NGAAI  0x158e
-#define UNITEXT_CANADIAN_SYLLABICS_NGAAI  L"\u158e"
+#define UNITEXT_CANADIAN_SYLLABICS_NGAAI  U"\u158e"
 #define UNICODE_CANADIAN_SYLLABICS_NGI  0x158f
-#define UNITEXT_CANADIAN_SYLLABICS_NGI  L"\u158f"
+#define UNITEXT_CANADIAN_SYLLABICS_NGI  U"\u158f"
 #define UNICODE_CANADIAN_SYLLABICS_NGII  0x1590
-#define UNITEXT_CANADIAN_SYLLABICS_NGII  L"\u1590"
+#define UNITEXT_CANADIAN_SYLLABICS_NGII  U"\u1590"
 #define UNICODE_CANADIAN_SYLLABICS_NGO  0x1591
-#define UNITEXT_CANADIAN_SYLLABICS_NGO  L"\u1591"
+#define UNITEXT_CANADIAN_SYLLABICS_NGO  U"\u1591"
 #define UNICODE_CANADIAN_SYLLABICS_NGOO  0x1592
-#define UNITEXT_CANADIAN_SYLLABICS_NGOO  L"\u1592"
+#define UNITEXT_CANADIAN_SYLLABICS_NGOO  U"\u1592"
 #define UNICODE_CANADIAN_SYLLABICS_NGA  0x1593
-#define UNITEXT_CANADIAN_SYLLABICS_NGA  L"\u1593"
+#define UNITEXT_CANADIAN_SYLLABICS_NGA  U"\u1593"
 #define UNICODE_CANADIAN_SYLLABICS_NGAA  0x1594
-#define UNITEXT_CANADIAN_SYLLABICS_NGAA  L"\u1594"
+#define UNITEXT_CANADIAN_SYLLABICS_NGAA  U"\u1594"
 #define UNICODE_CANADIAN_SYLLABICS_NG  0x1595
-#define UNITEXT_CANADIAN_SYLLABICS_NG  L"\u1595"
+#define UNITEXT_CANADIAN_SYLLABICS_NG  U"\u1595"
 #define UNICODE_CANADIAN_SYLLABICS_NNG  0x1596
-#define UNITEXT_CANADIAN_SYLLABICS_NNG  L"\u1596"
+#define UNITEXT_CANADIAN_SYLLABICS_NNG  U"\u1596"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_SHE  0x1597
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_SHE  L"\u1597"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_SHE  U"\u1597"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_SHI  0x1598
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_SHI  L"\u1598"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_SHI  U"\u1598"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_SHO  0x1599
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_SHO  L"\u1599"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_SHO  U"\u1599"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_SHA  0x159a
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_SHA  L"\u159a"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_SHA  U"\u159a"
 #define UNICODE_CANADIAN_SYLLABICS_WOODS_CREE_THE  0x159b
-#define UNITEXT_CANADIAN_SYLLABICS_WOODS_CREE_THE  L"\u159b"
+#define UNITEXT_CANADIAN_SYLLABICS_WOODS_CREE_THE  U"\u159b"
 #define UNICODE_CANADIAN_SYLLABICS_WOODS_CREE_THI  0x159c
-#define UNITEXT_CANADIAN_SYLLABICS_WOODS_CREE_THI  L"\u159c"
+#define UNITEXT_CANADIAN_SYLLABICS_WOODS_CREE_THI  U"\u159c"
 #define UNICODE_CANADIAN_SYLLABICS_WOODS_CREE_THO  0x159d
-#define UNITEXT_CANADIAN_SYLLABICS_WOODS_CREE_THO  L"\u159d"
+#define UNITEXT_CANADIAN_SYLLABICS_WOODS_CREE_THO  U"\u159d"
 #define UNICODE_CANADIAN_SYLLABICS_WOODS_CREE_THA  0x159e
-#define UNITEXT_CANADIAN_SYLLABICS_WOODS_CREE_THA  L"\u159e"
+#define UNITEXT_CANADIAN_SYLLABICS_WOODS_CREE_THA  U"\u159e"
 #define UNICODE_CANADIAN_SYLLABICS_WOODS_CREE_TH  0x159f
-#define UNITEXT_CANADIAN_SYLLABICS_WOODS_CREE_TH  L"\u159f"
+#define UNITEXT_CANADIAN_SYLLABICS_WOODS_CREE_TH  U"\u159f"
 #define UNICODE_CANADIAN_SYLLABICS_LHI  0x15a0
-#define UNITEXT_CANADIAN_SYLLABICS_LHI  L"\u15a0"
+#define UNITEXT_CANADIAN_SYLLABICS_LHI  U"\u15a0"
 #define UNICODE_CANADIAN_SYLLABICS_LHII  0x15a1
-#define UNITEXT_CANADIAN_SYLLABICS_LHII  L"\u15a1"
+#define UNITEXT_CANADIAN_SYLLABICS_LHII  U"\u15a1"
 #define UNICODE_CANADIAN_SYLLABICS_LHO  0x15a2
-#define UNITEXT_CANADIAN_SYLLABICS_LHO  L"\u15a2"
+#define UNITEXT_CANADIAN_SYLLABICS_LHO  U"\u15a2"
 #define UNICODE_CANADIAN_SYLLABICS_LHOO  0x15a3
-#define UNITEXT_CANADIAN_SYLLABICS_LHOO  L"\u15a3"
+#define UNITEXT_CANADIAN_SYLLABICS_LHOO  U"\u15a3"
 #define UNICODE_CANADIAN_SYLLABICS_LHA  0x15a4
-#define UNITEXT_CANADIAN_SYLLABICS_LHA  L"\u15a4"
+#define UNITEXT_CANADIAN_SYLLABICS_LHA  U"\u15a4"
 #define UNICODE_CANADIAN_SYLLABICS_LHAA  0x15a5
-#define UNITEXT_CANADIAN_SYLLABICS_LHAA  L"\u15a5"
+#define UNITEXT_CANADIAN_SYLLABICS_LHAA  U"\u15a5"
 #define UNICODE_CANADIAN_SYLLABICS_LH  0x15a6
-#define UNITEXT_CANADIAN_SYLLABICS_LH  L"\u15a6"
+#define UNITEXT_CANADIAN_SYLLABICS_LH  U"\u15a6"
 #define UNICODE_CANADIAN_SYLLABICS_TH_CREE_THE  0x15a7
-#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THE  L"\u15a7"
+#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THE  U"\u15a7"
 #define UNICODE_CANADIAN_SYLLABICS_TH_CREE_THI  0x15a8
-#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THI  L"\u15a8"
+#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THI  U"\u15a8"
 #define UNICODE_CANADIAN_SYLLABICS_TH_CREE_THII  0x15a9
-#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THII  L"\u15a9"
+#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THII  U"\u15a9"
 #define UNICODE_CANADIAN_SYLLABICS_TH_CREE_THO  0x15aa
-#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THO  L"\u15aa"
+#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THO  U"\u15aa"
 #define UNICODE_CANADIAN_SYLLABICS_TH_CREE_THOO  0x15ab
-#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THOO  L"\u15ab"
+#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THOO  U"\u15ab"
 #define UNICODE_CANADIAN_SYLLABICS_TH_CREE_THA  0x15ac
-#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THA  L"\u15ac"
+#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THA  U"\u15ac"
 #define UNICODE_CANADIAN_SYLLABICS_TH_CREE_THAA  0x15ad
-#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THAA  L"\u15ad"
+#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_THAA  U"\u15ad"
 #define UNICODE_CANADIAN_SYLLABICS_TH_CREE_TH  0x15ae
-#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_TH  L"\u15ae"
+#define UNITEXT_CANADIAN_SYLLABICS_TH_CREE_TH  U"\u15ae"
 #define UNICODE_CANADIAN_SYLLABICS_AIVILIK_B  0x15af
-#define UNITEXT_CANADIAN_SYLLABICS_AIVILIK_B  L"\u15af"
+#define UNITEXT_CANADIAN_SYLLABICS_AIVILIK_B  U"\u15af"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_E  0x15b0
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_E  L"\u15b0"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_E  U"\u15b0"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_I  0x15b1
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_I  L"\u15b1"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_I  U"\u15b1"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_O  0x15b2
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_O  L"\u15b2"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_O  U"\u15b2"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_A  0x15b3
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_A  L"\u15b3"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_A  U"\u15b3"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_WE  0x15b4
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_WE  L"\u15b4"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_WE  U"\u15b4"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_WI  0x15b5
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_WI  L"\u15b5"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_WI  U"\u15b5"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_WO  0x15b6
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_WO  L"\u15b6"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_WO  U"\u15b6"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_WA  0x15b7
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_WA  L"\u15b7"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_WA  U"\u15b7"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_NE  0x15b8
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_NE  L"\u15b8"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_NE  U"\u15b8"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_NI  0x15b9
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_NI  L"\u15b9"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_NI  U"\u15b9"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_NO  0x15ba
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_NO  L"\u15ba"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_NO  U"\u15ba"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_NA  0x15bb
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_NA  L"\u15bb"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_NA  U"\u15bb"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_KE  0x15bc
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_KE  L"\u15bc"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_KE  U"\u15bc"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_KI  0x15bd
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_KI  L"\u15bd"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_KI  U"\u15bd"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_KO  0x15be
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_KO  L"\u15be"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_KO  U"\u15be"
 #define UNICODE_CANADIAN_SYLLABICS_BLACKFOOT_KA  0x15bf
-#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_KA  L"\u15bf"
+#define UNITEXT_CANADIAN_SYLLABICS_BLACKFOOT_KA  U"\u15bf"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_HE  0x15c0
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_HE  L"\u15c0"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_HE  U"\u15c0"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_HI  0x15c1
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_HI  L"\u15c1"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_HI  U"\u15c1"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_HO  0x15c2
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_HO  L"\u15c2"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_HO  U"\u15c2"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_HA  0x15c3
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_HA  L"\u15c3"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_HA  U"\u15c3"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GHU  0x15c4
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHU  L"\u15c4"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHU  U"\u15c4"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GHO  0x15c5
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHO  L"\u15c5"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHO  U"\u15c5"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GHE  0x15c6
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHE  L"\u15c6"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHE  U"\u15c6"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GHEE  0x15c7
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHEE  L"\u15c7"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHEE  U"\u15c7"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GHI  0x15c8
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHI  L"\u15c8"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHI  U"\u15c8"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GHA  0x15c9
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHA  L"\u15c9"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GHA  U"\u15c9"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_RU  0x15ca
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_RU  L"\u15ca"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_RU  U"\u15ca"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_RO  0x15cb
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_RO  L"\u15cb"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_RO  U"\u15cb"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_RE  0x15cc
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_RE  L"\u15cc"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_RE  U"\u15cc"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_REE  0x15cd
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_REE  L"\u15cd"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_REE  U"\u15cd"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_RI  0x15ce
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_RI  L"\u15ce"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_RI  U"\u15ce"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_RA  0x15cf
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_RA  L"\u15cf"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_RA  U"\u15cf"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_WU  0x15d0
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WU  L"\u15d0"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WU  U"\u15d0"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_WO  0x15d1
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WO  L"\u15d1"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WO  U"\u15d1"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_WE  0x15d2
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WE  L"\u15d2"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WE  U"\u15d2"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_WEE  0x15d3
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WEE  L"\u15d3"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WEE  U"\u15d3"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_WI  0x15d4
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WI  L"\u15d4"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WI  U"\u15d4"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_WA  0x15d5
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WA  L"\u15d5"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_WA  U"\u15d5"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_HWU  0x15d6
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWU  L"\u15d6"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWU  U"\u15d6"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_HWO  0x15d7
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWO  L"\u15d7"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWO  U"\u15d7"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_HWE  0x15d8
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWE  L"\u15d8"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWE  U"\u15d8"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_HWEE  0x15d9
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWEE  L"\u15d9"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWEE  U"\u15d9"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_HWI  0x15da
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWI  L"\u15da"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWI  U"\u15da"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_HWA  0x15db
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWA  L"\u15db"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_HWA  U"\u15db"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_THU  0x15dc
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THU  L"\u15dc"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THU  U"\u15dc"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_THO  0x15dd
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THO  L"\u15dd"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THO  U"\u15dd"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_THE  0x15de
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THE  L"\u15de"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THE  U"\u15de"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_THEE  0x15df
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THEE  L"\u15df"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THEE  U"\u15df"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_THI  0x15e0
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THI  L"\u15e0"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THI  U"\u15e0"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_THA  0x15e1
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THA  L"\u15e1"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_THA  U"\u15e1"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTU  0x15e2
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTU  L"\u15e2"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTU  U"\u15e2"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTO  0x15e3
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTO  L"\u15e3"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTO  U"\u15e3"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTE  0x15e4
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTE  L"\u15e4"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTE  U"\u15e4"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTEE  0x15e5
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTEE  L"\u15e5"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTEE  U"\u15e5"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTI  0x15e6
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTI  L"\u15e6"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTI  U"\u15e6"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTA  0x15e7
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTA  L"\u15e7"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTA  U"\u15e7"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_PU  0x15e8
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PU  L"\u15e8"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PU  U"\u15e8"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_PO  0x15e9
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PO  L"\u15e9"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PO  U"\u15e9"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_PE  0x15ea
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PE  L"\u15ea"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PE  U"\u15ea"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_PEE  0x15eb
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PEE  L"\u15eb"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PEE  U"\u15eb"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_PI  0x15ec
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PI  L"\u15ec"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PI  U"\u15ec"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_PA  0x15ed
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PA  L"\u15ed"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_PA  U"\u15ed"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_P  0x15ee
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_P  L"\u15ee"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_P  U"\u15ee"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GU  0x15ef
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GU  L"\u15ef"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GU  U"\u15ef"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GO  0x15f0
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GO  L"\u15f0"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GO  U"\u15f0"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GE  0x15f1
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GE  L"\u15f1"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GE  U"\u15f1"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GEE  0x15f2
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GEE  L"\u15f2"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GEE  U"\u15f2"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GI  0x15f3
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GI  L"\u15f3"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GI  U"\u15f3"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_GA  0x15f4
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GA  L"\u15f4"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_GA  U"\u15f4"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KHU  0x15f5
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHU  L"\u15f5"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHU  U"\u15f5"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KHO  0x15f6
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHO  L"\u15f6"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHO  U"\u15f6"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KHE  0x15f7
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHE  L"\u15f7"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHE  U"\u15f7"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KHEE  0x15f8
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHEE  L"\u15f8"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHEE  U"\u15f8"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KHI  0x15f9
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHI  L"\u15f9"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHI  U"\u15f9"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KHA  0x15fa
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHA  L"\u15fa"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KHA  U"\u15fa"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KKU  0x15fb
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKU  L"\u15fb"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKU  U"\u15fb"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KKO  0x15fc
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKO  L"\u15fc"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKO  U"\u15fc"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KKE  0x15fd
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKE  L"\u15fd"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKE  U"\u15fd"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KKEE  0x15fe
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKEE  L"\u15fe"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKEE  U"\u15fe"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KKI  0x15ff
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKI  L"\u15ff"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKI  U"\u15ff"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KKA  0x1600
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKA  L"\u1600"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KKA  U"\u1600"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_KK  0x1601
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KK  L"\u1601"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_KK  U"\u1601"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_NU  0x1602
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NU  L"\u1602"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NU  U"\u1602"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_NO  0x1603
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NO  L"\u1603"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NO  U"\u1603"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_NE  0x1604
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NE  L"\u1604"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NE  U"\u1604"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_NEE  0x1605
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NEE  L"\u1605"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NEE  U"\u1605"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_NI  0x1606
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NI  L"\u1606"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NI  U"\u1606"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_NA  0x1607
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NA  L"\u1607"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_NA  U"\u1607"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_MU  0x1608
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_MU  L"\u1608"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_MU  U"\u1608"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_MO  0x1609
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_MO  L"\u1609"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_MO  U"\u1609"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_ME  0x160a
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ME  L"\u160a"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ME  U"\u160a"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_MEE  0x160b
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_MEE  L"\u160b"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_MEE  U"\u160b"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_MI  0x160c
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_MI  L"\u160c"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_MI  U"\u160c"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_MA  0x160d
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_MA  L"\u160d"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_MA  U"\u160d"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_YU  0x160e
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YU  L"\u160e"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YU  U"\u160e"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_YO  0x160f
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YO  L"\u160f"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YO  U"\u160f"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_YE  0x1610
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YE  L"\u1610"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YE  U"\u1610"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_YEE  0x1611
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YEE  L"\u1611"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YEE  U"\u1611"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_YI  0x1612
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YI  L"\u1612"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YI  U"\u1612"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_YA  0x1613
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YA  L"\u1613"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_YA  U"\u1613"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JU  0x1614
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JU  L"\u1614"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JU  U"\u1614"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_JU  0x1615
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_JU  L"\u1615"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_JU  U"\u1615"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JO  0x1616
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JO  L"\u1616"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JO  U"\u1616"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JE  0x1617
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JE  L"\u1617"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JE  U"\u1617"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JEE  0x1618
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JEE  L"\u1618"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JEE  U"\u1618"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JI  0x1619
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JI  L"\u1619"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JI  U"\u1619"
 #define UNICODE_CANADIAN_SYLLABICS_SAYISI_JI  0x161a
-#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_JI  L"\u161a"
+#define UNITEXT_CANADIAN_SYLLABICS_SAYISI_JI  U"\u161a"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JA  0x161b
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JA  L"\u161b"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JA  U"\u161b"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JJU  0x161c
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJU  L"\u161c"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJU  U"\u161c"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JJO  0x161d
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJO  L"\u161d"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJO  U"\u161d"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JJE  0x161e
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJE  L"\u161e"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJE  U"\u161e"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JJEE  0x161f
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJEE  L"\u161f"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJEE  U"\u161f"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JJI  0x1620
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJI  L"\u1620"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJI  U"\u1620"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_JJA  0x1621
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJA  L"\u1621"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_JJA  U"\u1621"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LU  0x1622
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LU  L"\u1622"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LU  U"\u1622"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LO  0x1623
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LO  L"\u1623"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LO  U"\u1623"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LE  0x1624
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LE  L"\u1624"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LE  U"\u1624"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LEE  0x1625
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LEE  L"\u1625"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LEE  U"\u1625"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LI  0x1626
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LI  L"\u1626"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LI  U"\u1626"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LA  0x1627
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LA  L"\u1627"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LA  U"\u1627"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DLU  0x1628
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLU  L"\u1628"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLU  U"\u1628"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DLO  0x1629
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLO  L"\u1629"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLO  U"\u1629"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DLE  0x162a
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLE  L"\u162a"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLE  U"\u162a"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DLEE  0x162b
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLEE  L"\u162b"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLEE  U"\u162b"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DLI  0x162c
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLI  L"\u162c"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLI  U"\u162c"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DLA  0x162d
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLA  L"\u162d"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DLA  U"\u162d"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LHU  0x162e
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHU  L"\u162e"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHU  U"\u162e"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LHO  0x162f
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHO  L"\u162f"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHO  U"\u162f"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LHE  0x1630
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHE  L"\u1630"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHE  U"\u1630"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LHEE  0x1631
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHEE  L"\u1631"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHEE  U"\u1631"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LHI  0x1632
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHI  L"\u1632"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHI  U"\u1632"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_LHA  0x1633
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHA  L"\u1633"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_LHA  U"\u1633"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLHU  0x1634
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHU  L"\u1634"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHU  U"\u1634"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLHO  0x1635
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHO  L"\u1635"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHO  U"\u1635"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLHE  0x1636
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHE  L"\u1636"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHE  U"\u1636"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLHEE  0x1637
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHEE  L"\u1637"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHEE  U"\u1637"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLHI  0x1638
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHI  L"\u1638"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHI  U"\u1638"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLHA  0x1639
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHA  L"\u1639"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLHA  U"\u1639"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLU  0x163a
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLU  L"\u163a"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLU  U"\u163a"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLO  0x163b
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLO  L"\u163b"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLO  U"\u163b"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLE  0x163c
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLE  L"\u163c"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLE  U"\u163c"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLEE  0x163d
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLEE  L"\u163d"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLEE  U"\u163d"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLI  0x163e
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLI  L"\u163e"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLI  U"\u163e"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TLA  0x163f
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLA  L"\u163f"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TLA  U"\u163f"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_ZU  0x1640
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZU  L"\u1640"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZU  U"\u1640"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_ZO  0x1641
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZO  L"\u1641"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZO  U"\u1641"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_ZE  0x1642
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZE  L"\u1642"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZE  U"\u1642"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_ZEE  0x1643
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZEE  L"\u1643"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZEE  U"\u1643"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_ZI  0x1644
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZI  L"\u1644"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZI  U"\u1644"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_ZA  0x1645
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZA  L"\u1645"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_ZA  U"\u1645"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_Z  0x1646
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_Z  L"\u1646"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_Z  U"\u1646"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_INITIAL_Z  0x1647
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_INITIAL_Z  L"\u1647"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_INITIAL_Z  U"\u1647"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DZU  0x1648
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZU  L"\u1648"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZU  U"\u1648"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DZO  0x1649
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZO  L"\u1649"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZO  U"\u1649"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DZE  0x164a
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZE  L"\u164a"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZE  U"\u164a"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DZEE  0x164b
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZEE  L"\u164b"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZEE  U"\u164b"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DZI  0x164c
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZI  L"\u164c"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZI  U"\u164c"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_DZA  0x164d
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZA  L"\u164d"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_DZA  U"\u164d"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SU  0x164e
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SU  L"\u164e"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SU  U"\u164e"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SO  0x164f
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SO  L"\u164f"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SO  U"\u164f"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SE  0x1650
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SE  L"\u1650"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SE  U"\u1650"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SEE  0x1651
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SEE  L"\u1651"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SEE  U"\u1651"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SI  0x1652
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SI  L"\u1652"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SI  U"\u1652"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SA  0x1653
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SA  L"\u1653"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SA  U"\u1653"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SHU  0x1654
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHU  L"\u1654"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHU  U"\u1654"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SHO  0x1655
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHO  L"\u1655"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHO  U"\u1655"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SHE  0x1656
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHE  L"\u1656"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHE  U"\u1656"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SHEE  0x1657
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHEE  L"\u1657"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHEE  U"\u1657"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SHI  0x1658
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHI  L"\u1658"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHI  U"\u1658"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SHA  0x1659
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHA  L"\u1659"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SHA  U"\u1659"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_SH  0x165a
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SH  L"\u165a"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_SH  U"\u165a"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TSU  0x165b
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSU  L"\u165b"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSU  U"\u165b"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TSO  0x165c
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSO  L"\u165c"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSO  U"\u165c"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TSE  0x165d
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSE  L"\u165d"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSE  U"\u165d"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TSEE  0x165e
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSEE  L"\u165e"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSEE  U"\u165e"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TSI  0x165f
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSI  L"\u165f"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSI  U"\u165f"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TSA  0x1660
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSA  L"\u1660"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TSA  U"\u1660"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_CHU  0x1661
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHU  L"\u1661"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHU  U"\u1661"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_CHO  0x1662
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHO  L"\u1662"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHO  U"\u1662"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_CHE  0x1663
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHE  L"\u1663"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHE  U"\u1663"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_CHEE  0x1664
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHEE  L"\u1664"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHEE  U"\u1664"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_CHI  0x1665
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHI  L"\u1665"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHI  U"\u1665"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_CHA  0x1666
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHA  L"\u1666"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_CHA  U"\u1666"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTSU  0x1667
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSU  L"\u1667"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSU  U"\u1667"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTSO  0x1668
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSO  L"\u1668"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSO  U"\u1668"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTSE  0x1669
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSE  L"\u1669"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSE  U"\u1669"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTSEE  0x166a
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSEE  L"\u166a"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSEE  U"\u166a"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTSI  0x166b
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSI  L"\u166b"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSI  U"\u166b"
 #define UNICODE_CANADIAN_SYLLABICS_CARRIER_TTSA  0x166c
-#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSA  L"\u166c"
+#define UNITEXT_CANADIAN_SYLLABICS_CARRIER_TTSA  U"\u166c"
 #define UNICODE_CANADIAN_SYLLABICS_CHI_SIGN  0x166d
-#define UNITEXT_CANADIAN_SYLLABICS_CHI_SIGN  L"\u166d"
+#define UNITEXT_CANADIAN_SYLLABICS_CHI_SIGN  U"\u166d"
 #define UNICODE_CANADIAN_SYLLABICS_FULL_STOP  0x166e
-#define UNITEXT_CANADIAN_SYLLABICS_FULL_STOP  L"\u166e"
+#define UNITEXT_CANADIAN_SYLLABICS_FULL_STOP  U"\u166e"
 #define UNICODE_CANADIAN_SYLLABICS_QAI  0x166f
-#define UNITEXT_CANADIAN_SYLLABICS_QAI  L"\u166f"
+#define UNITEXT_CANADIAN_SYLLABICS_QAI  U"\u166f"
 #define UNICODE_CANADIAN_SYLLABICS_NGAI  0x1670
-#define UNITEXT_CANADIAN_SYLLABICS_NGAI  L"\u1670"
+#define UNITEXT_CANADIAN_SYLLABICS_NGAI  U"\u1670"
 #define UNICODE_CANADIAN_SYLLABICS_NNGI  0x1671
-#define UNITEXT_CANADIAN_SYLLABICS_NNGI  L"\u1671"
+#define UNITEXT_CANADIAN_SYLLABICS_NNGI  U"\u1671"
 #define UNICODE_CANADIAN_SYLLABICS_NNGII  0x1672
-#define UNITEXT_CANADIAN_SYLLABICS_NNGII  L"\u1672"
+#define UNITEXT_CANADIAN_SYLLABICS_NNGII  U"\u1672"
 #define UNICODE_CANADIAN_SYLLABICS_NNGO  0x1673
-#define UNITEXT_CANADIAN_SYLLABICS_NNGO  L"\u1673"
+#define UNITEXT_CANADIAN_SYLLABICS_NNGO  U"\u1673"
 #define UNICODE_CANADIAN_SYLLABICS_NNGOO  0x1674
-#define UNITEXT_CANADIAN_SYLLABICS_NNGOO  L"\u1674"
+#define UNITEXT_CANADIAN_SYLLABICS_NNGOO  U"\u1674"
 #define UNICODE_CANADIAN_SYLLABICS_NNGA  0x1675
-#define UNITEXT_CANADIAN_SYLLABICS_NNGA  L"\u1675"
+#define UNITEXT_CANADIAN_SYLLABICS_NNGA  U"\u1675"
 #define UNICODE_CANADIAN_SYLLABICS_NNGAA  0x1676
-#define UNITEXT_CANADIAN_SYLLABICS_NNGAA  L"\u1676"
+#define UNITEXT_CANADIAN_SYLLABICS_NNGAA  U"\u1676"
 #define UNICODE_OGHAM_SPACE_MARK  0x1680
-#define UNITEXT_OGHAM_SPACE_MARK  L"\u1680"
+#define UNITEXT_OGHAM_SPACE_MARK  U"\u1680"
 #define UNICODE_OGHAM_LETTER_BEITH  0x1681
-#define UNITEXT_OGHAM_LETTER_BEITH  L"\u1681"
+#define UNITEXT_OGHAM_LETTER_BEITH  U"\u1681"
 #define UNICODE_OGHAM_LETTER_LUIS  0x1682
-#define UNITEXT_OGHAM_LETTER_LUIS  L"\u1682"
+#define UNITEXT_OGHAM_LETTER_LUIS  U"\u1682"
 #define UNICODE_OGHAM_LETTER_FEARN  0x1683
-#define UNITEXT_OGHAM_LETTER_FEARN  L"\u1683"
+#define UNITEXT_OGHAM_LETTER_FEARN  U"\u1683"
 #define UNICODE_OGHAM_LETTER_SAIL  0x1684
-#define UNITEXT_OGHAM_LETTER_SAIL  L"\u1684"
+#define UNITEXT_OGHAM_LETTER_SAIL  U"\u1684"
 #define UNICODE_OGHAM_LETTER_NION  0x1685
-#define UNITEXT_OGHAM_LETTER_NION  L"\u1685"
+#define UNITEXT_OGHAM_LETTER_NION  U"\u1685"
 #define UNICODE_OGHAM_LETTER_UATH  0x1686
-#define UNITEXT_OGHAM_LETTER_UATH  L"\u1686"
+#define UNITEXT_OGHAM_LETTER_UATH  U"\u1686"
 #define UNICODE_OGHAM_LETTER_DAIR  0x1687
-#define UNITEXT_OGHAM_LETTER_DAIR  L"\u1687"
+#define UNITEXT_OGHAM_LETTER_DAIR  U"\u1687"
 #define UNICODE_OGHAM_LETTER_TINNE  0x1688
-#define UNITEXT_OGHAM_LETTER_TINNE  L"\u1688"
+#define UNITEXT_OGHAM_LETTER_TINNE  U"\u1688"
 #define UNICODE_OGHAM_LETTER_COLL  0x1689
-#define UNITEXT_OGHAM_LETTER_COLL  L"\u1689"
+#define UNITEXT_OGHAM_LETTER_COLL  U"\u1689"
 #define UNICODE_OGHAM_LETTER_CEIRT  0x168a
-#define UNITEXT_OGHAM_LETTER_CEIRT  L"\u168a"
+#define UNITEXT_OGHAM_LETTER_CEIRT  U"\u168a"
 #define UNICODE_OGHAM_LETTER_MUIN  0x168b
-#define UNITEXT_OGHAM_LETTER_MUIN  L"\u168b"
+#define UNITEXT_OGHAM_LETTER_MUIN  U"\u168b"
 #define UNICODE_OGHAM_LETTER_GORT  0x168c
-#define UNITEXT_OGHAM_LETTER_GORT  L"\u168c"
+#define UNITEXT_OGHAM_LETTER_GORT  U"\u168c"
 #define UNICODE_OGHAM_LETTER_NGEADAL  0x168d
-#define UNITEXT_OGHAM_LETTER_NGEADAL  L"\u168d"
+#define UNITEXT_OGHAM_LETTER_NGEADAL  U"\u168d"
 #define UNICODE_OGHAM_LETTER_STRAIF  0x168e
-#define UNITEXT_OGHAM_LETTER_STRAIF  L"\u168e"
+#define UNITEXT_OGHAM_LETTER_STRAIF  U"\u168e"
 #define UNICODE_OGHAM_LETTER_RUIS  0x168f
-#define UNITEXT_OGHAM_LETTER_RUIS  L"\u168f"
+#define UNITEXT_OGHAM_LETTER_RUIS  U"\u168f"
 #define UNICODE_OGHAM_LETTER_AILM  0x1690
-#define UNITEXT_OGHAM_LETTER_AILM  L"\u1690"
+#define UNITEXT_OGHAM_LETTER_AILM  U"\u1690"
 #define UNICODE_OGHAM_LETTER_ONN  0x1691
-#define UNITEXT_OGHAM_LETTER_ONN  L"\u1691"
+#define UNITEXT_OGHAM_LETTER_ONN  U"\u1691"
 #define UNICODE_OGHAM_LETTER_UR  0x1692
-#define UNITEXT_OGHAM_LETTER_UR  L"\u1692"
+#define UNITEXT_OGHAM_LETTER_UR  U"\u1692"
 #define UNICODE_OGHAM_LETTER_EADHADH  0x1693
-#define UNITEXT_OGHAM_LETTER_EADHADH  L"\u1693"
+#define UNITEXT_OGHAM_LETTER_EADHADH  U"\u1693"
 #define UNICODE_OGHAM_LETTER_IODHADH  0x1694
-#define UNITEXT_OGHAM_LETTER_IODHADH  L"\u1694"
+#define UNITEXT_OGHAM_LETTER_IODHADH  U"\u1694"
 #define UNICODE_OGHAM_LETTER_EABHADH  0x1695
-#define UNITEXT_OGHAM_LETTER_EABHADH  L"\u1695"
+#define UNITEXT_OGHAM_LETTER_EABHADH  U"\u1695"
 #define UNICODE_OGHAM_LETTER_OR  0x1696
-#define UNITEXT_OGHAM_LETTER_OR  L"\u1696"
+#define UNITEXT_OGHAM_LETTER_OR  U"\u1696"
 #define UNICODE_OGHAM_LETTER_UILLEANN  0x1697
-#define UNITEXT_OGHAM_LETTER_UILLEANN  L"\u1697"
+#define UNITEXT_OGHAM_LETTER_UILLEANN  U"\u1697"
 #define UNICODE_OGHAM_LETTER_IFIN  0x1698
-#define UNITEXT_OGHAM_LETTER_IFIN  L"\u1698"
+#define UNITEXT_OGHAM_LETTER_IFIN  U"\u1698"
 #define UNICODE_OGHAM_LETTER_EAMHANCHOLL  0x1699
-#define UNITEXT_OGHAM_LETTER_EAMHANCHOLL  L"\u1699"
+#define UNITEXT_OGHAM_LETTER_EAMHANCHOLL  U"\u1699"
 #define UNICODE_OGHAM_LETTER_PEITH  0x169a
-#define UNITEXT_OGHAM_LETTER_PEITH  L"\u169a"
+#define UNITEXT_OGHAM_LETTER_PEITH  U"\u169a"
 #define UNICODE_OGHAM_FEATHER_MARK  0x169b
-#define UNITEXT_OGHAM_FEATHER_MARK  L"\u169b"
+#define UNITEXT_OGHAM_FEATHER_MARK  U"\u169b"
 #define UNICODE_OGHAM_REVERSED_FEATHER_MARK  0x169c
-#define UNITEXT_OGHAM_REVERSED_FEATHER_MARK  L"\u169c"
+#define UNITEXT_OGHAM_REVERSED_FEATHER_MARK  U"\u169c"
 #define UNICODE_RUNIC_LETTER_FEHU_FEOH_FE_F  0x16a0
-#define UNITEXT_RUNIC_LETTER_FEHU_FEOH_FE_F  L"\u16a0"
+#define UNITEXT_RUNIC_LETTER_FEHU_FEOH_FE_F  U"\u16a0"
 #define UNICODE_RUNIC_LETTER_V  0x16a1
-#define UNITEXT_RUNIC_LETTER_V  L"\u16a1"
+#define UNITEXT_RUNIC_LETTER_V  U"\u16a1"
 #define UNICODE_RUNIC_LETTER_URUZ_UR_U  0x16a2
-#define UNITEXT_RUNIC_LETTER_URUZ_UR_U  L"\u16a2"
+#define UNITEXT_RUNIC_LETTER_URUZ_UR_U  U"\u16a2"
 #define UNICODE_RUNIC_LETTER_YR  0x16a3
-#define UNITEXT_RUNIC_LETTER_YR  L"\u16a3"
+#define UNITEXT_RUNIC_LETTER_YR  U"\u16a3"
 #define UNICODE_RUNIC_LETTER_Y  0x16a4
-#define UNITEXT_RUNIC_LETTER_Y  L"\u16a4"
+#define UNITEXT_RUNIC_LETTER_Y  U"\u16a4"
 #define UNICODE_RUNIC_LETTER_W  0x16a5
-#define UNITEXT_RUNIC_LETTER_W  L"\u16a5"
+#define UNITEXT_RUNIC_LETTER_W  U"\u16a5"
 #define UNICODE_RUNIC_LETTER_THURISAZ_THURS_THORN  0x16a6
-#define UNITEXT_RUNIC_LETTER_THURISAZ_THURS_THORN  L"\u16a6"
+#define UNITEXT_RUNIC_LETTER_THURISAZ_THURS_THORN  U"\u16a6"
 #define UNICODE_RUNIC_LETTER_ETH  0x16a7
-#define UNITEXT_RUNIC_LETTER_ETH  L"\u16a7"
+#define UNITEXT_RUNIC_LETTER_ETH  U"\u16a7"
 #define UNICODE_RUNIC_LETTER_ANSUZ_A  0x16a8
-#define UNITEXT_RUNIC_LETTER_ANSUZ_A  L"\u16a8"
+#define UNITEXT_RUNIC_LETTER_ANSUZ_A  U"\u16a8"
 #define UNICODE_RUNIC_LETTER_OS_O  0x16a9
-#define UNITEXT_RUNIC_LETTER_OS_O  L"\u16a9"
+#define UNITEXT_RUNIC_LETTER_OS_O  U"\u16a9"
 #define UNICODE_RUNIC_LETTER_AC_A  0x16aa
-#define UNITEXT_RUNIC_LETTER_AC_A  L"\u16aa"
+#define UNITEXT_RUNIC_LETTER_AC_A  U"\u16aa"
 #define UNICODE_RUNIC_LETTER_AESC  0x16ab
-#define UNITEXT_RUNIC_LETTER_AESC  L"\u16ab"
+#define UNITEXT_RUNIC_LETTER_AESC  U"\u16ab"
 #define UNICODE_RUNIC_LETTER_LONG_BRANCH_OSS_O  0x16ac
-#define UNITEXT_RUNIC_LETTER_LONG_BRANCH_OSS_O  L"\u16ac"
+#define UNITEXT_RUNIC_LETTER_LONG_BRANCH_OSS_O  U"\u16ac"
 #define UNICODE_RUNIC_LETTER_SHORT_TWIG_OSS_O  0x16ad
-#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_OSS_O  L"\u16ad"
+#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_OSS_O  U"\u16ad"
 #define UNICODE_RUNIC_LETTER_O  0x16ae
-#define UNITEXT_RUNIC_LETTER_O  L"\u16ae"
+#define UNITEXT_RUNIC_LETTER_O  U"\u16ae"
 #define UNICODE_RUNIC_LETTER_OE  0x16af
-#define UNITEXT_RUNIC_LETTER_OE  L"\u16af"
+#define UNITEXT_RUNIC_LETTER_OE  U"\u16af"
 #define UNICODE_RUNIC_LETTER_ON  0x16b0
-#define UNITEXT_RUNIC_LETTER_ON  L"\u16b0"
+#define UNITEXT_RUNIC_LETTER_ON  U"\u16b0"
 #define UNICODE_RUNIC_LETTER_RAIDO_RAD_REID_R  0x16b1
-#define UNITEXT_RUNIC_LETTER_RAIDO_RAD_REID_R  L"\u16b1"
+#define UNITEXT_RUNIC_LETTER_RAIDO_RAD_REID_R  U"\u16b1"
 #define UNICODE_RUNIC_LETTER_KAUNA  0x16b2
-#define UNITEXT_RUNIC_LETTER_KAUNA  L"\u16b2"
+#define UNITEXT_RUNIC_LETTER_KAUNA  U"\u16b2"
 #define UNICODE_RUNIC_LETTER_CEN  0x16b3
-#define UNITEXT_RUNIC_LETTER_CEN  L"\u16b3"
+#define UNITEXT_RUNIC_LETTER_CEN  U"\u16b3"
 #define UNICODE_RUNIC_LETTER_KAUN_K  0x16b4
-#define UNITEXT_RUNIC_LETTER_KAUN_K  L"\u16b4"
+#define UNITEXT_RUNIC_LETTER_KAUN_K  U"\u16b4"
 #define UNICODE_RUNIC_LETTER_G  0x16b5
-#define UNITEXT_RUNIC_LETTER_G  L"\u16b5"
+#define UNITEXT_RUNIC_LETTER_G  U"\u16b5"
 #define UNICODE_RUNIC_LETTER_ENG  0x16b6
-#define UNITEXT_RUNIC_LETTER_ENG  L"\u16b6"
+#define UNITEXT_RUNIC_LETTER_ENG  U"\u16b6"
 #define UNICODE_RUNIC_LETTER_GEBO_GYFU_G  0x16b7
-#define UNITEXT_RUNIC_LETTER_GEBO_GYFU_G  L"\u16b7"
+#define UNITEXT_RUNIC_LETTER_GEBO_GYFU_G  U"\u16b7"
 #define UNICODE_RUNIC_LETTER_GAR  0x16b8
-#define UNITEXT_RUNIC_LETTER_GAR  L"\u16b8"
+#define UNITEXT_RUNIC_LETTER_GAR  U"\u16b8"
 #define UNICODE_RUNIC_LETTER_WUNJO_WYNN_W  0x16b9
-#define UNITEXT_RUNIC_LETTER_WUNJO_WYNN_W  L"\u16b9"
+#define UNITEXT_RUNIC_LETTER_WUNJO_WYNN_W  U"\u16b9"
 #define UNICODE_RUNIC_LETTER_HAGLAZ_H  0x16ba
-#define UNITEXT_RUNIC_LETTER_HAGLAZ_H  L"\u16ba"
+#define UNITEXT_RUNIC_LETTER_HAGLAZ_H  U"\u16ba"
 #define UNICODE_RUNIC_LETTER_HAEGL_H  0x16bb
-#define UNITEXT_RUNIC_LETTER_HAEGL_H  L"\u16bb"
+#define UNITEXT_RUNIC_LETTER_HAEGL_H  U"\u16bb"
 #define UNICODE_RUNIC_LETTER_LONG_BRANCH_HAGALL_H  0x16bc
-#define UNITEXT_RUNIC_LETTER_LONG_BRANCH_HAGALL_H  L"\u16bc"
+#define UNITEXT_RUNIC_LETTER_LONG_BRANCH_HAGALL_H  U"\u16bc"
 #define UNICODE_RUNIC_LETTER_SHORT_TWIG_HAGALL_H  0x16bd
-#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_HAGALL_H  L"\u16bd"
+#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_HAGALL_H  U"\u16bd"
 #define UNICODE_RUNIC_LETTER_NAUDIZ_NYD_NAUD_N  0x16be
-#define UNITEXT_RUNIC_LETTER_NAUDIZ_NYD_NAUD_N  L"\u16be"
+#define UNITEXT_RUNIC_LETTER_NAUDIZ_NYD_NAUD_N  U"\u16be"
 #define UNICODE_RUNIC_LETTER_SHORT_TWIG_NAUD_N  0x16bf
-#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_NAUD_N  L"\u16bf"
+#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_NAUD_N  U"\u16bf"
 #define UNICODE_RUNIC_LETTER_DOTTED_N  0x16c0
-#define UNITEXT_RUNIC_LETTER_DOTTED_N  L"\u16c0"
+#define UNITEXT_RUNIC_LETTER_DOTTED_N  U"\u16c0"
 #define UNICODE_RUNIC_LETTER_ISAZ_IS_ISS_I  0x16c1
-#define UNITEXT_RUNIC_LETTER_ISAZ_IS_ISS_I  L"\u16c1"
+#define UNITEXT_RUNIC_LETTER_ISAZ_IS_ISS_I  U"\u16c1"
 #define UNICODE_RUNIC_LETTER_E  0x16c2
-#define UNITEXT_RUNIC_LETTER_E  L"\u16c2"
+#define UNITEXT_RUNIC_LETTER_E  U"\u16c2"
 #define UNICODE_RUNIC_LETTER_JERAN_J  0x16c3
-#define UNITEXT_RUNIC_LETTER_JERAN_J  L"\u16c3"
+#define UNITEXT_RUNIC_LETTER_JERAN_J  U"\u16c3"
 #define UNICODE_RUNIC_LETTER_GER  0x16c4
-#define UNITEXT_RUNIC_LETTER_GER  L"\u16c4"
+#define UNITEXT_RUNIC_LETTER_GER  U"\u16c4"
 #define UNICODE_RUNIC_LETTER_LONG_BRANCH_AR_AE  0x16c5
-#define UNITEXT_RUNIC_LETTER_LONG_BRANCH_AR_AE  L"\u16c5"
+#define UNITEXT_RUNIC_LETTER_LONG_BRANCH_AR_AE  U"\u16c5"
 #define UNICODE_RUNIC_LETTER_SHORT_TWIG_AR_A  0x16c6
-#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_AR_A  L"\u16c6"
+#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_AR_A  U"\u16c6"
 #define UNICODE_RUNIC_LETTER_IWAZ_EOH  0x16c7
-#define UNITEXT_RUNIC_LETTER_IWAZ_EOH  L"\u16c7"
+#define UNITEXT_RUNIC_LETTER_IWAZ_EOH  U"\u16c7"
 #define UNICODE_RUNIC_LETTER_PERTHO_PEORTH_P  0x16c8
-#define UNITEXT_RUNIC_LETTER_PERTHO_PEORTH_P  L"\u16c8"
+#define UNITEXT_RUNIC_LETTER_PERTHO_PEORTH_P  U"\u16c8"
 #define UNICODE_RUNIC_LETTER_ALGIZ_EOLHX  0x16c9
-#define UNITEXT_RUNIC_LETTER_ALGIZ_EOLHX  L"\u16c9"
+#define UNITEXT_RUNIC_LETTER_ALGIZ_EOLHX  U"\u16c9"
 #define UNICODE_RUNIC_LETTER_SOWILO_S  0x16ca
-#define UNITEXT_RUNIC_LETTER_SOWILO_S  L"\u16ca"
+#define UNITEXT_RUNIC_LETTER_SOWILO_S  U"\u16ca"
 #define UNICODE_RUNIC_LETTER_SIGEL_LONG_BRANCH_SOL_S  0x16cb
-#define UNITEXT_RUNIC_LETTER_SIGEL_LONG_BRANCH_SOL_S  L"\u16cb"
+#define UNITEXT_RUNIC_LETTER_SIGEL_LONG_BRANCH_SOL_S  U"\u16cb"
 #define UNICODE_RUNIC_LETTER_SHORT_TWIG_SOL_S  0x16cc
-#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_SOL_S  L"\u16cc"
+#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_SOL_S  U"\u16cc"
 #define UNICODE_RUNIC_LETTER_C  0x16cd
-#define UNITEXT_RUNIC_LETTER_C  L"\u16cd"
+#define UNITEXT_RUNIC_LETTER_C  U"\u16cd"
 #define UNICODE_RUNIC_LETTER_Z  0x16ce
-#define UNITEXT_RUNIC_LETTER_Z  L"\u16ce"
+#define UNITEXT_RUNIC_LETTER_Z  U"\u16ce"
 #define UNICODE_RUNIC_LETTER_TIWAZ_TIR_TYR_T  0x16cf
-#define UNITEXT_RUNIC_LETTER_TIWAZ_TIR_TYR_T  L"\u16cf"
+#define UNITEXT_RUNIC_LETTER_TIWAZ_TIR_TYR_T  U"\u16cf"
 #define UNICODE_RUNIC_LETTER_SHORT_TWIG_TYR_T  0x16d0
-#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_TYR_T  L"\u16d0"
+#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_TYR_T  U"\u16d0"
 #define UNICODE_RUNIC_LETTER_D  0x16d1
-#define UNITEXT_RUNIC_LETTER_D  L"\u16d1"
+#define UNITEXT_RUNIC_LETTER_D  U"\u16d1"
 #define UNICODE_RUNIC_LETTER_BERKANAN_BEORC_BJARKAN_B  0x16d2
-#define UNITEXT_RUNIC_LETTER_BERKANAN_BEORC_BJARKAN_B  L"\u16d2"
+#define UNITEXT_RUNIC_LETTER_BERKANAN_BEORC_BJARKAN_B  U"\u16d2"
 #define UNICODE_RUNIC_LETTER_SHORT_TWIG_BJARKAN_B  0x16d3
-#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_BJARKAN_B  L"\u16d3"
+#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_BJARKAN_B  U"\u16d3"
 #define UNICODE_RUNIC_LETTER_DOTTED_P  0x16d4
-#define UNITEXT_RUNIC_LETTER_DOTTED_P  L"\u16d4"
+#define UNITEXT_RUNIC_LETTER_DOTTED_P  U"\u16d4"
 #define UNICODE_RUNIC_LETTER_OPEN_P  0x16d5
-#define UNITEXT_RUNIC_LETTER_OPEN_P  L"\u16d5"
+#define UNITEXT_RUNIC_LETTER_OPEN_P  U"\u16d5"
 #define UNICODE_RUNIC_LETTER_EHWAZ_EH_E  0x16d6
-#define UNITEXT_RUNIC_LETTER_EHWAZ_EH_E  L"\u16d6"
+#define UNITEXT_RUNIC_LETTER_EHWAZ_EH_E  U"\u16d6"
 #define UNICODE_RUNIC_LETTER_MANNAZ_MAN_M  0x16d7
-#define UNITEXT_RUNIC_LETTER_MANNAZ_MAN_M  L"\u16d7"
+#define UNITEXT_RUNIC_LETTER_MANNAZ_MAN_M  U"\u16d7"
 #define UNICODE_RUNIC_LETTER_LONG_BRANCH_MADR_M  0x16d8
-#define UNITEXT_RUNIC_LETTER_LONG_BRANCH_MADR_M  L"\u16d8"
+#define UNITEXT_RUNIC_LETTER_LONG_BRANCH_MADR_M  U"\u16d8"
 #define UNICODE_RUNIC_LETTER_SHORT_TWIG_MADR_M  0x16d9
-#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_MADR_M  L"\u16d9"
+#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_MADR_M  U"\u16d9"
 #define UNICODE_RUNIC_LETTER_LAUKAZ_LAGU_LOGR_L  0x16da
-#define UNITEXT_RUNIC_LETTER_LAUKAZ_LAGU_LOGR_L  L"\u16da"
+#define UNITEXT_RUNIC_LETTER_LAUKAZ_LAGU_LOGR_L  U"\u16da"
 #define UNICODE_RUNIC_LETTER_DOTTED_L  0x16db
-#define UNITEXT_RUNIC_LETTER_DOTTED_L  L"\u16db"
+#define UNITEXT_RUNIC_LETTER_DOTTED_L  U"\u16db"
 #define UNICODE_RUNIC_LETTER_INGWAZ  0x16dc
-#define UNITEXT_RUNIC_LETTER_INGWAZ  L"\u16dc"
+#define UNITEXT_RUNIC_LETTER_INGWAZ  U"\u16dc"
 #define UNICODE_RUNIC_LETTER_ING  0x16dd
-#define UNITEXT_RUNIC_LETTER_ING  L"\u16dd"
+#define UNITEXT_RUNIC_LETTER_ING  U"\u16dd"
 #define UNICODE_RUNIC_LETTER_DAGAZ_DAEG_D  0x16de
-#define UNITEXT_RUNIC_LETTER_DAGAZ_DAEG_D  L"\u16de"
+#define UNITEXT_RUNIC_LETTER_DAGAZ_DAEG_D  U"\u16de"
 #define UNICODE_RUNIC_LETTER_OTHALAN_ETHEL_O  0x16df
-#define UNITEXT_RUNIC_LETTER_OTHALAN_ETHEL_O  L"\u16df"
+#define UNITEXT_RUNIC_LETTER_OTHALAN_ETHEL_O  U"\u16df"
 #define UNICODE_RUNIC_LETTER_EAR  0x16e0
-#define UNITEXT_RUNIC_LETTER_EAR  L"\u16e0"
+#define UNITEXT_RUNIC_LETTER_EAR  U"\u16e0"
 #define UNICODE_RUNIC_LETTER_IOR  0x16e1
-#define UNITEXT_RUNIC_LETTER_IOR  L"\u16e1"
+#define UNITEXT_RUNIC_LETTER_IOR  U"\u16e1"
 #define UNICODE_RUNIC_LETTER_CWEORTH  0x16e2
-#define UNITEXT_RUNIC_LETTER_CWEORTH  L"\u16e2"
+#define UNITEXT_RUNIC_LETTER_CWEORTH  U"\u16e2"
 #define UNICODE_RUNIC_LETTER_CALC  0x16e3
-#define UNITEXT_RUNIC_LETTER_CALC  L"\u16e3"
+#define UNITEXT_RUNIC_LETTER_CALC  U"\u16e3"
 #define UNICODE_RUNIC_LETTER_CEALC  0x16e4
-#define UNITEXT_RUNIC_LETTER_CEALC  L"\u16e4"
+#define UNITEXT_RUNIC_LETTER_CEALC  U"\u16e4"
 #define UNICODE_RUNIC_LETTER_STAN  0x16e5
-#define UNITEXT_RUNIC_LETTER_STAN  L"\u16e5"
+#define UNITEXT_RUNIC_LETTER_STAN  U"\u16e5"
 #define UNICODE_RUNIC_LETTER_LONG_BRANCH_YR  0x16e6
-#define UNITEXT_RUNIC_LETTER_LONG_BRANCH_YR  L"\u16e6"
+#define UNITEXT_RUNIC_LETTER_LONG_BRANCH_YR  U"\u16e6"
 #define UNICODE_RUNIC_LETTER_SHORT_TWIG_YR  0x16e7
-#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_YR  L"\u16e7"
+#define UNITEXT_RUNIC_LETTER_SHORT_TWIG_YR  U"\u16e7"
 #define UNICODE_RUNIC_LETTER_ICELANDIC_YR  0x16e8
-#define UNITEXT_RUNIC_LETTER_ICELANDIC_YR  L"\u16e8"
+#define UNITEXT_RUNIC_LETTER_ICELANDIC_YR  U"\u16e8"
 #define UNICODE_RUNIC_LETTER_Q  0x16e9
-#define UNITEXT_RUNIC_LETTER_Q  L"\u16e9"
+#define UNITEXT_RUNIC_LETTER_Q  U"\u16e9"
 #define UNICODE_RUNIC_LETTER_X  0x16ea
-#define UNITEXT_RUNIC_LETTER_X  L"\u16ea"
+#define UNITEXT_RUNIC_LETTER_X  U"\u16ea"
 #define UNICODE_RUNIC_SINGLE_PUNCTUATION  0x16eb
-#define UNITEXT_RUNIC_SINGLE_PUNCTUATION  L"\u16eb"
+#define UNITEXT_RUNIC_SINGLE_PUNCTUATION  U"\u16eb"
 #define UNICODE_RUNIC_MULTIPLE_PUNCTUATION  0x16ec
-#define UNITEXT_RUNIC_MULTIPLE_PUNCTUATION  L"\u16ec"
+#define UNITEXT_RUNIC_MULTIPLE_PUNCTUATION  U"\u16ec"
 #define UNICODE_RUNIC_CROSS_PUNCTUATION  0x16ed
-#define UNITEXT_RUNIC_CROSS_PUNCTUATION  L"\u16ed"
+#define UNITEXT_RUNIC_CROSS_PUNCTUATION  U"\u16ed"
 #define UNICODE_RUNIC_ARLAUG_SYMBOL  0x16ee
-#define UNITEXT_RUNIC_ARLAUG_SYMBOL  L"\u16ee"
+#define UNITEXT_RUNIC_ARLAUG_SYMBOL  U"\u16ee"
 #define UNICODE_RUNIC_TVIMADUR_SYMBOL  0x16ef
-#define UNITEXT_RUNIC_TVIMADUR_SYMBOL  L"\u16ef"
+#define UNITEXT_RUNIC_TVIMADUR_SYMBOL  U"\u16ef"
 #define UNICODE_RUNIC_BELGTHOR_SYMBOL  0x16f0
-#define UNITEXT_RUNIC_BELGTHOR_SYMBOL  L"\u16f0"
+#define UNITEXT_RUNIC_BELGTHOR_SYMBOL  U"\u16f0"
 #define UNICODE_TAGALOG_LETTER_A  0x1700
-#define UNITEXT_TAGALOG_LETTER_A  L"\u1700"
+#define UNITEXT_TAGALOG_LETTER_A  U"\u1700"
 #define UNICODE_TAGALOG_LETTER_I  0x1701
-#define UNITEXT_TAGALOG_LETTER_I  L"\u1701"
+#define UNITEXT_TAGALOG_LETTER_I  U"\u1701"
 #define UNICODE_TAGALOG_LETTER_U  0x1702
-#define UNITEXT_TAGALOG_LETTER_U  L"\u1702"
+#define UNITEXT_TAGALOG_LETTER_U  U"\u1702"
 #define UNICODE_TAGALOG_LETTER_KA  0x1703
-#define UNITEXT_TAGALOG_LETTER_KA  L"\u1703"
+#define UNITEXT_TAGALOG_LETTER_KA  U"\u1703"
 #define UNICODE_TAGALOG_LETTER_GA  0x1704
-#define UNITEXT_TAGALOG_LETTER_GA  L"\u1704"
+#define UNITEXT_TAGALOG_LETTER_GA  U"\u1704"
 #define UNICODE_TAGALOG_LETTER_NGA  0x1705
-#define UNITEXT_TAGALOG_LETTER_NGA  L"\u1705"
+#define UNITEXT_TAGALOG_LETTER_NGA  U"\u1705"
 #define UNICODE_TAGALOG_LETTER_TA  0x1706
-#define UNITEXT_TAGALOG_LETTER_TA  L"\u1706"
+#define UNITEXT_TAGALOG_LETTER_TA  U"\u1706"
 #define UNICODE_TAGALOG_LETTER_DA  0x1707
-#define UNITEXT_TAGALOG_LETTER_DA  L"\u1707"
+#define UNITEXT_TAGALOG_LETTER_DA  U"\u1707"
 #define UNICODE_TAGALOG_LETTER_NA  0x1708
-#define UNITEXT_TAGALOG_LETTER_NA  L"\u1708"
+#define UNITEXT_TAGALOG_LETTER_NA  U"\u1708"
 #define UNICODE_TAGALOG_LETTER_PA  0x1709
-#define UNITEXT_TAGALOG_LETTER_PA  L"\u1709"
+#define UNITEXT_TAGALOG_LETTER_PA  U"\u1709"
 #define UNICODE_TAGALOG_LETTER_BA  0x170a
-#define UNITEXT_TAGALOG_LETTER_BA  L"\u170a"
+#define UNITEXT_TAGALOG_LETTER_BA  U"\u170a"
 #define UNICODE_TAGALOG_LETTER_MA  0x170b
-#define UNITEXT_TAGALOG_LETTER_MA  L"\u170b"
+#define UNITEXT_TAGALOG_LETTER_MA  U"\u170b"
 #define UNICODE_TAGALOG_LETTER_YA  0x170c
-#define UNITEXT_TAGALOG_LETTER_YA  L"\u170c"
+#define UNITEXT_TAGALOG_LETTER_YA  U"\u170c"
 #define UNICODE_TAGALOG_LETTER_LA  0x170e
-#define UNITEXT_TAGALOG_LETTER_LA  L"\u170e"
+#define UNITEXT_TAGALOG_LETTER_LA  U"\u170e"
 #define UNICODE_TAGALOG_LETTER_WA  0x170f
-#define UNITEXT_TAGALOG_LETTER_WA  L"\u170f"
+#define UNITEXT_TAGALOG_LETTER_WA  U"\u170f"
 #define UNICODE_TAGALOG_LETTER_SA  0x1710
-#define UNITEXT_TAGALOG_LETTER_SA  L"\u1710"
+#define UNITEXT_TAGALOG_LETTER_SA  U"\u1710"
 #define UNICODE_TAGALOG_LETTER_HA  0x1711
-#define UNITEXT_TAGALOG_LETTER_HA  L"\u1711"
+#define UNITEXT_TAGALOG_LETTER_HA  U"\u1711"
 #define UNICODE_TAGALOG_VOWEL_SIGN_I  0x1712
-#define UNITEXT_TAGALOG_VOWEL_SIGN_I  L"\u1712"
+#define UNITEXT_TAGALOG_VOWEL_SIGN_I  U"\u1712"
 #define UNICODE_TAGALOG_VOWEL_SIGN_U  0x1713
-#define UNITEXT_TAGALOG_VOWEL_SIGN_U  L"\u1713"
+#define UNITEXT_TAGALOG_VOWEL_SIGN_U  U"\u1713"
 #define UNICODE_TAGALOG_SIGN_VIRAMA  0x1714
-#define UNITEXT_TAGALOG_SIGN_VIRAMA  L"\u1714"
+#define UNITEXT_TAGALOG_SIGN_VIRAMA  U"\u1714"
 #define UNICODE_HANUNOO_LETTER_A  0x1720
-#define UNITEXT_HANUNOO_LETTER_A  L"\u1720"
+#define UNITEXT_HANUNOO_LETTER_A  U"\u1720"
 #define UNICODE_HANUNOO_LETTER_I  0x1721
-#define UNITEXT_HANUNOO_LETTER_I  L"\u1721"
+#define UNITEXT_HANUNOO_LETTER_I  U"\u1721"
 #define UNICODE_HANUNOO_LETTER_U  0x1722
-#define UNITEXT_HANUNOO_LETTER_U  L"\u1722"
+#define UNITEXT_HANUNOO_LETTER_U  U"\u1722"
 #define UNICODE_HANUNOO_LETTER_KA  0x1723
-#define UNITEXT_HANUNOO_LETTER_KA  L"\u1723"
+#define UNITEXT_HANUNOO_LETTER_KA  U"\u1723"
 #define UNICODE_HANUNOO_LETTER_GA  0x1724
-#define UNITEXT_HANUNOO_LETTER_GA  L"\u1724"
+#define UNITEXT_HANUNOO_LETTER_GA  U"\u1724"
 #define UNICODE_HANUNOO_LETTER_NGA  0x1725
-#define UNITEXT_HANUNOO_LETTER_NGA  L"\u1725"
+#define UNITEXT_HANUNOO_LETTER_NGA  U"\u1725"
 #define UNICODE_HANUNOO_LETTER_TA  0x1726
-#define UNITEXT_HANUNOO_LETTER_TA  L"\u1726"
+#define UNITEXT_HANUNOO_LETTER_TA  U"\u1726"
 #define UNICODE_HANUNOO_LETTER_DA  0x1727
-#define UNITEXT_HANUNOO_LETTER_DA  L"\u1727"
+#define UNITEXT_HANUNOO_LETTER_DA  U"\u1727"
 #define UNICODE_HANUNOO_LETTER_NA  0x1728
-#define UNITEXT_HANUNOO_LETTER_NA  L"\u1728"
+#define UNITEXT_HANUNOO_LETTER_NA  U"\u1728"
 #define UNICODE_HANUNOO_LETTER_PA  0x1729
-#define UNITEXT_HANUNOO_LETTER_PA  L"\u1729"
+#define UNITEXT_HANUNOO_LETTER_PA  U"\u1729"
 #define UNICODE_HANUNOO_LETTER_BA  0x172a
-#define UNITEXT_HANUNOO_LETTER_BA  L"\u172a"
+#define UNITEXT_HANUNOO_LETTER_BA  U"\u172a"
 #define UNICODE_HANUNOO_LETTER_MA  0x172b
-#define UNITEXT_HANUNOO_LETTER_MA  L"\u172b"
+#define UNITEXT_HANUNOO_LETTER_MA  U"\u172b"
 #define UNICODE_HANUNOO_LETTER_YA  0x172c
-#define UNITEXT_HANUNOO_LETTER_YA  L"\u172c"
+#define UNITEXT_HANUNOO_LETTER_YA  U"\u172c"
 #define UNICODE_HANUNOO_LETTER_RA  0x172d
-#define UNITEXT_HANUNOO_LETTER_RA  L"\u172d"
+#define UNITEXT_HANUNOO_LETTER_RA  U"\u172d"
 #define UNICODE_HANUNOO_LETTER_LA  0x172e
-#define UNITEXT_HANUNOO_LETTER_LA  L"\u172e"
+#define UNITEXT_HANUNOO_LETTER_LA  U"\u172e"
 #define UNICODE_HANUNOO_LETTER_WA  0x172f
-#define UNITEXT_HANUNOO_LETTER_WA  L"\u172f"
+#define UNITEXT_HANUNOO_LETTER_WA  U"\u172f"
 #define UNICODE_HANUNOO_LETTER_SA  0x1730
-#define UNITEXT_HANUNOO_LETTER_SA  L"\u1730"
+#define UNITEXT_HANUNOO_LETTER_SA  U"\u1730"
 #define UNICODE_HANUNOO_LETTER_HA  0x1731
-#define UNITEXT_HANUNOO_LETTER_HA  L"\u1731"
+#define UNITEXT_HANUNOO_LETTER_HA  U"\u1731"
 #define UNICODE_HANUNOO_VOWEL_SIGN_I  0x1732
-#define UNITEXT_HANUNOO_VOWEL_SIGN_I  L"\u1732"
+#define UNITEXT_HANUNOO_VOWEL_SIGN_I  U"\u1732"
 #define UNICODE_HANUNOO_VOWEL_SIGN_U  0x1733
-#define UNITEXT_HANUNOO_VOWEL_SIGN_U  L"\u1733"
+#define UNITEXT_HANUNOO_VOWEL_SIGN_U  U"\u1733"
 #define UNICODE_HANUNOO_SIGN_PAMUDPOD  0x1734
-#define UNITEXT_HANUNOO_SIGN_PAMUDPOD  L"\u1734"
+#define UNITEXT_HANUNOO_SIGN_PAMUDPOD  U"\u1734"
 #define UNICODE_PHILIPPINE_SINGLE_PUNCTUATION  0x1735
-#define UNITEXT_PHILIPPINE_SINGLE_PUNCTUATION  L"\u1735"
+#define UNITEXT_PHILIPPINE_SINGLE_PUNCTUATION  U"\u1735"
 #define UNICODE_PHILIPPINE_DOUBLE_PUNCTUATION  0x1736
-#define UNITEXT_PHILIPPINE_DOUBLE_PUNCTUATION  L"\u1736"
+#define UNITEXT_PHILIPPINE_DOUBLE_PUNCTUATION  U"\u1736"
 #define UNICODE_BUHID_LETTER_A  0x1740
-#define UNITEXT_BUHID_LETTER_A  L"\u1740"
+#define UNITEXT_BUHID_LETTER_A  U"\u1740"
 #define UNICODE_BUHID_LETTER_I  0x1741
-#define UNITEXT_BUHID_LETTER_I  L"\u1741"
+#define UNITEXT_BUHID_LETTER_I  U"\u1741"
 #define UNICODE_BUHID_LETTER_U  0x1742
-#define UNITEXT_BUHID_LETTER_U  L"\u1742"
+#define UNITEXT_BUHID_LETTER_U  U"\u1742"
 #define UNICODE_BUHID_LETTER_KA  0x1743
-#define UNITEXT_BUHID_LETTER_KA  L"\u1743"
+#define UNITEXT_BUHID_LETTER_KA  U"\u1743"
 #define UNICODE_BUHID_LETTER_GA  0x1744
-#define UNITEXT_BUHID_LETTER_GA  L"\u1744"
+#define UNITEXT_BUHID_LETTER_GA  U"\u1744"
 #define UNICODE_BUHID_LETTER_NGA  0x1745
-#define UNITEXT_BUHID_LETTER_NGA  L"\u1745"
+#define UNITEXT_BUHID_LETTER_NGA  U"\u1745"
 #define UNICODE_BUHID_LETTER_TA  0x1746
-#define UNITEXT_BUHID_LETTER_TA  L"\u1746"
+#define UNITEXT_BUHID_LETTER_TA  U"\u1746"
 #define UNICODE_BUHID_LETTER_DA  0x1747
-#define UNITEXT_BUHID_LETTER_DA  L"\u1747"
+#define UNITEXT_BUHID_LETTER_DA  U"\u1747"
 #define UNICODE_BUHID_LETTER_NA  0x1748
-#define UNITEXT_BUHID_LETTER_NA  L"\u1748"
+#define UNITEXT_BUHID_LETTER_NA  U"\u1748"
 #define UNICODE_BUHID_LETTER_PA  0x1749
-#define UNITEXT_BUHID_LETTER_PA  L"\u1749"
+#define UNITEXT_BUHID_LETTER_PA  U"\u1749"
 #define UNICODE_BUHID_LETTER_BA  0x174a
-#define UNITEXT_BUHID_LETTER_BA  L"\u174a"
+#define UNITEXT_BUHID_LETTER_BA  U"\u174a"
 #define UNICODE_BUHID_LETTER_MA  0x174b
-#define UNITEXT_BUHID_LETTER_MA  L"\u174b"
+#define UNITEXT_BUHID_LETTER_MA  U"\u174b"
 #define UNICODE_BUHID_LETTER_YA  0x174c
-#define UNITEXT_BUHID_LETTER_YA  L"\u174c"
+#define UNITEXT_BUHID_LETTER_YA  U"\u174c"
 #define UNICODE_BUHID_LETTER_RA  0x174d
-#define UNITEXT_BUHID_LETTER_RA  L"\u174d"
+#define UNITEXT_BUHID_LETTER_RA  U"\u174d"
 #define UNICODE_BUHID_LETTER_LA  0x174e
-#define UNITEXT_BUHID_LETTER_LA  L"\u174e"
+#define UNITEXT_BUHID_LETTER_LA  U"\u174e"
 #define UNICODE_BUHID_LETTER_WA  0x174f
-#define UNITEXT_BUHID_LETTER_WA  L"\u174f"
+#define UNITEXT_BUHID_LETTER_WA  U"\u174f"
 #define UNICODE_BUHID_LETTER_SA  0x1750
-#define UNITEXT_BUHID_LETTER_SA  L"\u1750"
+#define UNITEXT_BUHID_LETTER_SA  U"\u1750"
 #define UNICODE_BUHID_LETTER_HA  0x1751
-#define UNITEXT_BUHID_LETTER_HA  L"\u1751"
+#define UNITEXT_BUHID_LETTER_HA  U"\u1751"
 #define UNICODE_BUHID_VOWEL_SIGN_I  0x1752
-#define UNITEXT_BUHID_VOWEL_SIGN_I  L"\u1752"
+#define UNITEXT_BUHID_VOWEL_SIGN_I  U"\u1752"
 #define UNICODE_BUHID_VOWEL_SIGN_U  0x1753
-#define UNITEXT_BUHID_VOWEL_SIGN_U  L"\u1753"
+#define UNITEXT_BUHID_VOWEL_SIGN_U  U"\u1753"
 #define UNICODE_TAGBANWA_LETTER_A  0x1760
-#define UNITEXT_TAGBANWA_LETTER_A  L"\u1760"
+#define UNITEXT_TAGBANWA_LETTER_A  U"\u1760"
 #define UNICODE_TAGBANWA_LETTER_I  0x1761
-#define UNITEXT_TAGBANWA_LETTER_I  L"\u1761"
+#define UNITEXT_TAGBANWA_LETTER_I  U"\u1761"
 #define UNICODE_TAGBANWA_LETTER_U  0x1762
-#define UNITEXT_TAGBANWA_LETTER_U  L"\u1762"
+#define UNITEXT_TAGBANWA_LETTER_U  U"\u1762"
 #define UNICODE_TAGBANWA_LETTER_KA  0x1763
-#define UNITEXT_TAGBANWA_LETTER_KA  L"\u1763"
+#define UNITEXT_TAGBANWA_LETTER_KA  U"\u1763"
 #define UNICODE_TAGBANWA_LETTER_GA  0x1764
-#define UNITEXT_TAGBANWA_LETTER_GA  L"\u1764"
+#define UNITEXT_TAGBANWA_LETTER_GA  U"\u1764"
 #define UNICODE_TAGBANWA_LETTER_NGA  0x1765
-#define UNITEXT_TAGBANWA_LETTER_NGA  L"\u1765"
+#define UNITEXT_TAGBANWA_LETTER_NGA  U"\u1765"
 #define UNICODE_TAGBANWA_LETTER_TA  0x1766
-#define UNITEXT_TAGBANWA_LETTER_TA  L"\u1766"
+#define UNITEXT_TAGBANWA_LETTER_TA  U"\u1766"
 #define UNICODE_TAGBANWA_LETTER_DA  0x1767
-#define UNITEXT_TAGBANWA_LETTER_DA  L"\u1767"
+#define UNITEXT_TAGBANWA_LETTER_DA  U"\u1767"
 #define UNICODE_TAGBANWA_LETTER_NA  0x1768
-#define UNITEXT_TAGBANWA_LETTER_NA  L"\u1768"
+#define UNITEXT_TAGBANWA_LETTER_NA  U"\u1768"
 #define UNICODE_TAGBANWA_LETTER_PA  0x1769
-#define UNITEXT_TAGBANWA_LETTER_PA  L"\u1769"
+#define UNITEXT_TAGBANWA_LETTER_PA  U"\u1769"
 #define UNICODE_TAGBANWA_LETTER_BA  0x176a
-#define UNITEXT_TAGBANWA_LETTER_BA  L"\u176a"
+#define UNITEXT_TAGBANWA_LETTER_BA  U"\u176a"
 #define UNICODE_TAGBANWA_LETTER_MA  0x176b
-#define UNITEXT_TAGBANWA_LETTER_MA  L"\u176b"
+#define UNITEXT_TAGBANWA_LETTER_MA  U"\u176b"
 #define UNICODE_TAGBANWA_LETTER_YA  0x176c
-#define UNITEXT_TAGBANWA_LETTER_YA  L"\u176c"
+#define UNITEXT_TAGBANWA_LETTER_YA  U"\u176c"
 #define UNICODE_TAGBANWA_LETTER_LA  0x176e
-#define UNITEXT_TAGBANWA_LETTER_LA  L"\u176e"
+#define UNITEXT_TAGBANWA_LETTER_LA  U"\u176e"
 #define UNICODE_TAGBANWA_LETTER_WA  0x176f
-#define UNITEXT_TAGBANWA_LETTER_WA  L"\u176f"
+#define UNITEXT_TAGBANWA_LETTER_WA  U"\u176f"
 #define UNICODE_TAGBANWA_LETTER_SA  0x1770
-#define UNITEXT_TAGBANWA_LETTER_SA  L"\u1770"
+#define UNITEXT_TAGBANWA_LETTER_SA  U"\u1770"
 #define UNICODE_TAGBANWA_VOWEL_SIGN_I  0x1772
-#define UNITEXT_TAGBANWA_VOWEL_SIGN_I  L"\u1772"
+#define UNITEXT_TAGBANWA_VOWEL_SIGN_I  U"\u1772"
 #define UNICODE_TAGBANWA_VOWEL_SIGN_U  0x1773
-#define UNITEXT_TAGBANWA_VOWEL_SIGN_U  L"\u1773"
+#define UNITEXT_TAGBANWA_VOWEL_SIGN_U  U"\u1773"
 #define UNICODE_KHMER_LETTER_KA  0x1780
-#define UNITEXT_KHMER_LETTER_KA  L"\u1780"
+#define UNITEXT_KHMER_LETTER_KA  U"\u1780"
 #define UNICODE_KHMER_LETTER_KHA  0x1781
-#define UNITEXT_KHMER_LETTER_KHA  L"\u1781"
+#define UNITEXT_KHMER_LETTER_KHA  U"\u1781"
 #define UNICODE_KHMER_LETTER_KO  0x1782
-#define UNITEXT_KHMER_LETTER_KO  L"\u1782"
+#define UNITEXT_KHMER_LETTER_KO  U"\u1782"
 #define UNICODE_KHMER_LETTER_KHO  0x1783
-#define UNITEXT_KHMER_LETTER_KHO  L"\u1783"
+#define UNITEXT_KHMER_LETTER_KHO  U"\u1783"
 #define UNICODE_KHMER_LETTER_NGO  0x1784
-#define UNITEXT_KHMER_LETTER_NGO  L"\u1784"
+#define UNITEXT_KHMER_LETTER_NGO  U"\u1784"
 #define UNICODE_KHMER_LETTER_CA  0x1785
-#define UNITEXT_KHMER_LETTER_CA  L"\u1785"
+#define UNITEXT_KHMER_LETTER_CA  U"\u1785"
 #define UNICODE_KHMER_LETTER_CHA  0x1786
-#define UNITEXT_KHMER_LETTER_CHA  L"\u1786"
+#define UNITEXT_KHMER_LETTER_CHA  U"\u1786"
 #define UNICODE_KHMER_LETTER_CO  0x1787
-#define UNITEXT_KHMER_LETTER_CO  L"\u1787"
+#define UNITEXT_KHMER_LETTER_CO  U"\u1787"
 #define UNICODE_KHMER_LETTER_CHO  0x1788
-#define UNITEXT_KHMER_LETTER_CHO  L"\u1788"
+#define UNITEXT_KHMER_LETTER_CHO  U"\u1788"
 #define UNICODE_KHMER_LETTER_NYO  0x1789
-#define UNITEXT_KHMER_LETTER_NYO  L"\u1789"
+#define UNITEXT_KHMER_LETTER_NYO  U"\u1789"
 #define UNICODE_KHMER_LETTER_DA  0x178a
-#define UNITEXT_KHMER_LETTER_DA  L"\u178a"
+#define UNITEXT_KHMER_LETTER_DA  U"\u178a"
 #define UNICODE_KHMER_LETTER_TTHA  0x178b
-#define UNITEXT_KHMER_LETTER_TTHA  L"\u178b"
+#define UNITEXT_KHMER_LETTER_TTHA  U"\u178b"
 #define UNICODE_KHMER_LETTER_DO  0x178c
-#define UNITEXT_KHMER_LETTER_DO  L"\u178c"
+#define UNITEXT_KHMER_LETTER_DO  U"\u178c"
 #define UNICODE_KHMER_LETTER_TTHO  0x178d
-#define UNITEXT_KHMER_LETTER_TTHO  L"\u178d"
+#define UNITEXT_KHMER_LETTER_TTHO  U"\u178d"
 #define UNICODE_KHMER_LETTER_NNO  0x178e
-#define UNITEXT_KHMER_LETTER_NNO  L"\u178e"
+#define UNITEXT_KHMER_LETTER_NNO  U"\u178e"
 #define UNICODE_KHMER_LETTER_TA  0x178f
-#define UNITEXT_KHMER_LETTER_TA  L"\u178f"
+#define UNITEXT_KHMER_LETTER_TA  U"\u178f"
 #define UNICODE_KHMER_LETTER_THA  0x1790
-#define UNITEXT_KHMER_LETTER_THA  L"\u1790"
+#define UNITEXT_KHMER_LETTER_THA  U"\u1790"
 #define UNICODE_KHMER_LETTER_TO  0x1791
-#define UNITEXT_KHMER_LETTER_TO  L"\u1791"
+#define UNITEXT_KHMER_LETTER_TO  U"\u1791"
 #define UNICODE_KHMER_LETTER_THO  0x1792
-#define UNITEXT_KHMER_LETTER_THO  L"\u1792"
+#define UNITEXT_KHMER_LETTER_THO  U"\u1792"
 #define UNICODE_KHMER_LETTER_NO  0x1793
-#define UNITEXT_KHMER_LETTER_NO  L"\u1793"
+#define UNITEXT_KHMER_LETTER_NO  U"\u1793"
 #define UNICODE_KHMER_LETTER_BA  0x1794
-#define UNITEXT_KHMER_LETTER_BA  L"\u1794"
+#define UNITEXT_KHMER_LETTER_BA  U"\u1794"
 #define UNICODE_KHMER_LETTER_PHA  0x1795
-#define UNITEXT_KHMER_LETTER_PHA  L"\u1795"
+#define UNITEXT_KHMER_LETTER_PHA  U"\u1795"
 #define UNICODE_KHMER_LETTER_PO  0x1796
-#define UNITEXT_KHMER_LETTER_PO  L"\u1796"
+#define UNITEXT_KHMER_LETTER_PO  U"\u1796"
 #define UNICODE_KHMER_LETTER_PHO  0x1797
-#define UNITEXT_KHMER_LETTER_PHO  L"\u1797"
+#define UNITEXT_KHMER_LETTER_PHO  U"\u1797"
 #define UNICODE_KHMER_LETTER_MO  0x1798
-#define UNITEXT_KHMER_LETTER_MO  L"\u1798"
+#define UNITEXT_KHMER_LETTER_MO  U"\u1798"
 #define UNICODE_KHMER_LETTER_YO  0x1799
-#define UNITEXT_KHMER_LETTER_YO  L"\u1799"
+#define UNITEXT_KHMER_LETTER_YO  U"\u1799"
 #define UNICODE_KHMER_LETTER_RO  0x179a
-#define UNITEXT_KHMER_LETTER_RO  L"\u179a"
+#define UNITEXT_KHMER_LETTER_RO  U"\u179a"
 #define UNICODE_KHMER_LETTER_LO  0x179b
-#define UNITEXT_KHMER_LETTER_LO  L"\u179b"
+#define UNITEXT_KHMER_LETTER_LO  U"\u179b"
 #define UNICODE_KHMER_LETTER_VO  0x179c
-#define UNITEXT_KHMER_LETTER_VO  L"\u179c"
+#define UNITEXT_KHMER_LETTER_VO  U"\u179c"
 #define UNICODE_KHMER_LETTER_SHA  0x179d
-#define UNITEXT_KHMER_LETTER_SHA  L"\u179d"
+#define UNITEXT_KHMER_LETTER_SHA  U"\u179d"
 #define UNICODE_KHMER_LETTER_SSO  0x179e
-#define UNITEXT_KHMER_LETTER_SSO  L"\u179e"
+#define UNITEXT_KHMER_LETTER_SSO  U"\u179e"
 #define UNICODE_KHMER_LETTER_SA  0x179f
-#define UNITEXT_KHMER_LETTER_SA  L"\u179f"
+#define UNITEXT_KHMER_LETTER_SA  U"\u179f"
 #define UNICODE_KHMER_LETTER_HA  0x17a0
-#define UNITEXT_KHMER_LETTER_HA  L"\u17a0"
+#define UNITEXT_KHMER_LETTER_HA  U"\u17a0"
 #define UNICODE_KHMER_LETTER_LA  0x17a1
-#define UNITEXT_KHMER_LETTER_LA  L"\u17a1"
+#define UNITEXT_KHMER_LETTER_LA  U"\u17a1"
 #define UNICODE_KHMER_LETTER_QA  0x17a2
-#define UNITEXT_KHMER_LETTER_QA  L"\u17a2"
+#define UNITEXT_KHMER_LETTER_QA  U"\u17a2"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QAQ  0x17a3
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QAQ  L"\u17a3"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QAQ  U"\u17a3"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QAA  0x17a4
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QAA  L"\u17a4"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QAA  U"\u17a4"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QI  0x17a5
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QI  L"\u17a5"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QI  U"\u17a5"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QII  0x17a6
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QII  L"\u17a6"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QII  U"\u17a6"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QU  0x17a7
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QU  L"\u17a7"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QU  U"\u17a7"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QUK  0x17a8
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QUK  L"\u17a8"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QUK  U"\u17a8"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QUU  0x17a9
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QUU  L"\u17a9"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QUU  U"\u17a9"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QUUV  0x17aa
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QUUV  L"\u17aa"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QUUV  U"\u17aa"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_RY  0x17ab
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_RY  L"\u17ab"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_RY  U"\u17ab"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_RYY  0x17ac
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_RYY  L"\u17ac"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_RYY  U"\u17ac"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_LY  0x17ad
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_LY  L"\u17ad"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_LY  U"\u17ad"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_LYY  0x17ae
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_LYY  L"\u17ae"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_LYY  U"\u17ae"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QE  0x17af
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QE  L"\u17af"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QE  U"\u17af"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QAI  0x17b0
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QAI  L"\u17b0"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QAI  U"\u17b0"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QOO_TYPE_ONE  0x17b1
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QOO_TYPE_ONE  L"\u17b1"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QOO_TYPE_ONE  U"\u17b1"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QOO_TYPE_TWO  0x17b2
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QOO_TYPE_TWO  L"\u17b2"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QOO_TYPE_TWO  U"\u17b2"
 #define UNICODE_KHMER_INDEPENDENT_VOWEL_QAU  0x17b3
-#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QAU  L"\u17b3"
+#define UNITEXT_KHMER_INDEPENDENT_VOWEL_QAU  U"\u17b3"
 #define UNICODE_KHMER_VOWEL_INHERENT_AQ  0x17b4
-#define UNITEXT_KHMER_VOWEL_INHERENT_AQ  L"\u17b4"
+#define UNITEXT_KHMER_VOWEL_INHERENT_AQ  U"\u17b4"
 #define UNICODE_KHMER_VOWEL_INHERENT_AA  0x17b5
-#define UNITEXT_KHMER_VOWEL_INHERENT_AA  L"\u17b5"
+#define UNITEXT_KHMER_VOWEL_INHERENT_AA  U"\u17b5"
 #define UNICODE_KHMER_VOWEL_SIGN_AA  0x17b6
-#define UNITEXT_KHMER_VOWEL_SIGN_AA  L"\u17b6"
+#define UNITEXT_KHMER_VOWEL_SIGN_AA  U"\u17b6"
 #define UNICODE_KHMER_VOWEL_SIGN_I  0x17b7
-#define UNITEXT_KHMER_VOWEL_SIGN_I  L"\u17b7"
+#define UNITEXT_KHMER_VOWEL_SIGN_I  U"\u17b7"
 #define UNICODE_KHMER_VOWEL_SIGN_II  0x17b8
-#define UNITEXT_KHMER_VOWEL_SIGN_II  L"\u17b8"
+#define UNITEXT_KHMER_VOWEL_SIGN_II  U"\u17b8"
 #define UNICODE_KHMER_VOWEL_SIGN_Y  0x17b9
-#define UNITEXT_KHMER_VOWEL_SIGN_Y  L"\u17b9"
+#define UNITEXT_KHMER_VOWEL_SIGN_Y  U"\u17b9"
 #define UNICODE_KHMER_VOWEL_SIGN_YY  0x17ba
-#define UNITEXT_KHMER_VOWEL_SIGN_YY  L"\u17ba"
+#define UNITEXT_KHMER_VOWEL_SIGN_YY  U"\u17ba"
 #define UNICODE_KHMER_VOWEL_SIGN_U  0x17bb
-#define UNITEXT_KHMER_VOWEL_SIGN_U  L"\u17bb"
+#define UNITEXT_KHMER_VOWEL_SIGN_U  U"\u17bb"
 #define UNICODE_KHMER_VOWEL_SIGN_UU  0x17bc
-#define UNITEXT_KHMER_VOWEL_SIGN_UU  L"\u17bc"
+#define UNITEXT_KHMER_VOWEL_SIGN_UU  U"\u17bc"
 #define UNICODE_KHMER_VOWEL_SIGN_UA  0x17bd
-#define UNITEXT_KHMER_VOWEL_SIGN_UA  L"\u17bd"
+#define UNITEXT_KHMER_VOWEL_SIGN_UA  U"\u17bd"
 #define UNICODE_KHMER_VOWEL_SIGN_OE  0x17be
-#define UNITEXT_KHMER_VOWEL_SIGN_OE  L"\u17be"
+#define UNITEXT_KHMER_VOWEL_SIGN_OE  U"\u17be"
 #define UNICODE_KHMER_VOWEL_SIGN_YA  0x17bf
-#define UNITEXT_KHMER_VOWEL_SIGN_YA  L"\u17bf"
+#define UNITEXT_KHMER_VOWEL_SIGN_YA  U"\u17bf"
 #define UNICODE_KHMER_VOWEL_SIGN_IE  0x17c0
-#define UNITEXT_KHMER_VOWEL_SIGN_IE  L"\u17c0"
+#define UNITEXT_KHMER_VOWEL_SIGN_IE  U"\u17c0"
 #define UNICODE_KHMER_VOWEL_SIGN_E  0x17c1
-#define UNITEXT_KHMER_VOWEL_SIGN_E  L"\u17c1"
+#define UNITEXT_KHMER_VOWEL_SIGN_E  U"\u17c1"
 #define UNICODE_KHMER_VOWEL_SIGN_AE  0x17c2
-#define UNITEXT_KHMER_VOWEL_SIGN_AE  L"\u17c2"
+#define UNITEXT_KHMER_VOWEL_SIGN_AE  U"\u17c2"
 #define UNICODE_KHMER_VOWEL_SIGN_AI  0x17c3
-#define UNITEXT_KHMER_VOWEL_SIGN_AI  L"\u17c3"
+#define UNITEXT_KHMER_VOWEL_SIGN_AI  U"\u17c3"
 #define UNICODE_KHMER_VOWEL_SIGN_OO  0x17c4
-#define UNITEXT_KHMER_VOWEL_SIGN_OO  L"\u17c4"
+#define UNITEXT_KHMER_VOWEL_SIGN_OO  U"\u17c4"
 #define UNICODE_KHMER_VOWEL_SIGN_AU  0x17c5
-#define UNITEXT_KHMER_VOWEL_SIGN_AU  L"\u17c5"
+#define UNITEXT_KHMER_VOWEL_SIGN_AU  U"\u17c5"
 #define UNICODE_KHMER_SIGN_NIKAHIT  0x17c6
-#define UNITEXT_KHMER_SIGN_NIKAHIT  L"\u17c6"
+#define UNITEXT_KHMER_SIGN_NIKAHIT  U"\u17c6"
 #define UNICODE_KHMER_SIGN_REAHMUK  0x17c7
-#define UNITEXT_KHMER_SIGN_REAHMUK  L"\u17c7"
+#define UNITEXT_KHMER_SIGN_REAHMUK  U"\u17c7"
 #define UNICODE_KHMER_SIGN_YUUKALEAPINTU  0x17c8
-#define UNITEXT_KHMER_SIGN_YUUKALEAPINTU  L"\u17c8"
+#define UNITEXT_KHMER_SIGN_YUUKALEAPINTU  U"\u17c8"
 #define UNICODE_KHMER_SIGN_MUUSIKATOAN  0x17c9
-#define UNITEXT_KHMER_SIGN_MUUSIKATOAN  L"\u17c9"
+#define UNITEXT_KHMER_SIGN_MUUSIKATOAN  U"\u17c9"
 #define UNICODE_KHMER_SIGN_TRIISAP  0x17ca
-#define UNITEXT_KHMER_SIGN_TRIISAP  L"\u17ca"
+#define UNITEXT_KHMER_SIGN_TRIISAP  U"\u17ca"
 #define UNICODE_KHMER_SIGN_BANTOC  0x17cb
-#define UNITEXT_KHMER_SIGN_BANTOC  L"\u17cb"
+#define UNITEXT_KHMER_SIGN_BANTOC  U"\u17cb"
 #define UNICODE_KHMER_SIGN_ROBAT  0x17cc
-#define UNITEXT_KHMER_SIGN_ROBAT  L"\u17cc"
+#define UNITEXT_KHMER_SIGN_ROBAT  U"\u17cc"
 #define UNICODE_KHMER_SIGN_TOANDAKHIAT  0x17cd
-#define UNITEXT_KHMER_SIGN_TOANDAKHIAT  L"\u17cd"
+#define UNITEXT_KHMER_SIGN_TOANDAKHIAT  U"\u17cd"
 #define UNICODE_KHMER_SIGN_KAKABAT  0x17ce
-#define UNITEXT_KHMER_SIGN_KAKABAT  L"\u17ce"
+#define UNITEXT_KHMER_SIGN_KAKABAT  U"\u17ce"
 #define UNICODE_KHMER_SIGN_AHSDA  0x17cf
-#define UNITEXT_KHMER_SIGN_AHSDA  L"\u17cf"
+#define UNITEXT_KHMER_SIGN_AHSDA  U"\u17cf"
 #define UNICODE_KHMER_SIGN_SAMYOK_SANNYA  0x17d0
-#define UNITEXT_KHMER_SIGN_SAMYOK_SANNYA  L"\u17d0"
+#define UNITEXT_KHMER_SIGN_SAMYOK_SANNYA  U"\u17d0"
 #define UNICODE_KHMER_SIGN_VIRIAM  0x17d1
-#define UNITEXT_KHMER_SIGN_VIRIAM  L"\u17d1"
+#define UNITEXT_KHMER_SIGN_VIRIAM  U"\u17d1"
 #define UNICODE_KHMER_SIGN_COENG  0x17d2
-#define UNITEXT_KHMER_SIGN_COENG  L"\u17d2"
+#define UNITEXT_KHMER_SIGN_COENG  U"\u17d2"
 #define UNICODE_KHMER_SIGN_BATHAMASAT  0x17d3
-#define UNITEXT_KHMER_SIGN_BATHAMASAT  L"\u17d3"
+#define UNITEXT_KHMER_SIGN_BATHAMASAT  U"\u17d3"
 #define UNICODE_KHMER_SIGN_KHAN  0x17d4
-#define UNITEXT_KHMER_SIGN_KHAN  L"\u17d4"
+#define UNITEXT_KHMER_SIGN_KHAN  U"\u17d4"
 #define UNICODE_KHMER_SIGN_BARIYOOSAN  0x17d5
-#define UNITEXT_KHMER_SIGN_BARIYOOSAN  L"\u17d5"
+#define UNITEXT_KHMER_SIGN_BARIYOOSAN  U"\u17d5"
 #define UNICODE_KHMER_SIGN_CAMNUC_PII_KUUH  0x17d6
-#define UNITEXT_KHMER_SIGN_CAMNUC_PII_KUUH  L"\u17d6"
+#define UNITEXT_KHMER_SIGN_CAMNUC_PII_KUUH  U"\u17d6"
 #define UNICODE_KHMER_SIGN_LEK_TOO  0x17d7
-#define UNITEXT_KHMER_SIGN_LEK_TOO  L"\u17d7"
+#define UNITEXT_KHMER_SIGN_LEK_TOO  U"\u17d7"
 #define UNICODE_KHMER_SIGN_BEYYAL  0x17d8
-#define UNITEXT_KHMER_SIGN_BEYYAL  L"\u17d8"
+#define UNITEXT_KHMER_SIGN_BEYYAL  U"\u17d8"
 #define UNICODE_KHMER_SIGN_PHNAEK_MUAN  0x17d9
-#define UNITEXT_KHMER_SIGN_PHNAEK_MUAN  L"\u17d9"
+#define UNITEXT_KHMER_SIGN_PHNAEK_MUAN  U"\u17d9"
 #define UNICODE_KHMER_SIGN_KOOMUUT  0x17da
-#define UNITEXT_KHMER_SIGN_KOOMUUT  L"\u17da"
+#define UNITEXT_KHMER_SIGN_KOOMUUT  U"\u17da"
 #define UNICODE_KHMER_CURRENCY_SYMBOL_RIEL  0x17db
-#define UNITEXT_KHMER_CURRENCY_SYMBOL_RIEL  L"\u17db"
+#define UNITEXT_KHMER_CURRENCY_SYMBOL_RIEL  U"\u17db"
 #define UNICODE_KHMER_SIGN_AVAKRAHASANYA  0x17dc
-#define UNITEXT_KHMER_SIGN_AVAKRAHASANYA  L"\u17dc"
+#define UNITEXT_KHMER_SIGN_AVAKRAHASANYA  U"\u17dc"
 #define UNICODE_KHMER_SIGN_ATTHACAN  0x17dd
-#define UNITEXT_KHMER_SIGN_ATTHACAN  L"\u17dd"
+#define UNITEXT_KHMER_SIGN_ATTHACAN  U"\u17dd"
 #define UNICODE_KHMER_DIGIT_ZERO  0x17e0
-#define UNITEXT_KHMER_DIGIT_ZERO  L"\u17e0"
+#define UNITEXT_KHMER_DIGIT_ZERO  U"\u17e0"
 #define UNICODE_KHMER_DIGIT_ONE  0x17e1
-#define UNITEXT_KHMER_DIGIT_ONE  L"\u17e1"
+#define UNITEXT_KHMER_DIGIT_ONE  U"\u17e1"
 #define UNICODE_KHMER_DIGIT_TWO  0x17e2
-#define UNITEXT_KHMER_DIGIT_TWO  L"\u17e2"
+#define UNITEXT_KHMER_DIGIT_TWO  U"\u17e2"
 #define UNICODE_KHMER_DIGIT_THREE  0x17e3
-#define UNITEXT_KHMER_DIGIT_THREE  L"\u17e3"
+#define UNITEXT_KHMER_DIGIT_THREE  U"\u17e3"
 #define UNICODE_KHMER_DIGIT_FOUR  0x17e4
-#define UNITEXT_KHMER_DIGIT_FOUR  L"\u17e4"
+#define UNITEXT_KHMER_DIGIT_FOUR  U"\u17e4"
 #define UNICODE_KHMER_DIGIT_FIVE  0x17e5
-#define UNITEXT_KHMER_DIGIT_FIVE  L"\u17e5"
+#define UNITEXT_KHMER_DIGIT_FIVE  U"\u17e5"
 #define UNICODE_KHMER_DIGIT_SIX  0x17e6
-#define UNITEXT_KHMER_DIGIT_SIX  L"\u17e6"
+#define UNITEXT_KHMER_DIGIT_SIX  U"\u17e6"
 #define UNICODE_KHMER_DIGIT_SEVEN  0x17e7
-#define UNITEXT_KHMER_DIGIT_SEVEN  L"\u17e7"
+#define UNITEXT_KHMER_DIGIT_SEVEN  U"\u17e7"
 #define UNICODE_KHMER_DIGIT_EIGHT  0x17e8
-#define UNITEXT_KHMER_DIGIT_EIGHT  L"\u17e8"
+#define UNITEXT_KHMER_DIGIT_EIGHT  U"\u17e8"
 #define UNICODE_KHMER_DIGIT_NINE  0x17e9
-#define UNITEXT_KHMER_DIGIT_NINE  L"\u17e9"
+#define UNITEXT_KHMER_DIGIT_NINE  U"\u17e9"
 #define UNICODE_KHMER_SYMBOL_LEK_ATTAK_SON  0x17f0
-#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_SON  L"\u17f0"
+#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_SON  U"\u17f0"
 #define UNICODE_KHMER_SYMBOL_LEK_ATTAK_MUOY  0x17f1
-#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_MUOY  L"\u17f1"
+#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_MUOY  U"\u17f1"
 #define UNICODE_KHMER_SYMBOL_LEK_ATTAK_PII  0x17f2
-#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PII  L"\u17f2"
+#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PII  U"\u17f2"
 #define UNICODE_KHMER_SYMBOL_LEK_ATTAK_BEI  0x17f3
-#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_BEI  L"\u17f3"
+#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_BEI  U"\u17f3"
 #define UNICODE_KHMER_SYMBOL_LEK_ATTAK_BUON  0x17f4
-#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_BUON  L"\u17f4"
+#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_BUON  U"\u17f4"
 #define UNICODE_KHMER_SYMBOL_LEK_ATTAK_PRAM  0x17f5
-#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PRAM  L"\u17f5"
+#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PRAM  U"\u17f5"
 #define UNICODE_KHMER_SYMBOL_LEK_ATTAK_PRAM_MUOY  0x17f6
-#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PRAM_MUOY  L"\u17f6"
+#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PRAM_MUOY  U"\u17f6"
 #define UNICODE_KHMER_SYMBOL_LEK_ATTAK_PRAM_PII  0x17f7
-#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PRAM_PII  L"\u17f7"
+#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PRAM_PII  U"\u17f7"
 #define UNICODE_KHMER_SYMBOL_LEK_ATTAK_PRAM_BEI  0x17f8
-#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PRAM_BEI  L"\u17f8"
+#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PRAM_BEI  U"\u17f8"
 #define UNICODE_KHMER_SYMBOL_LEK_ATTAK_PRAM_BUON  0x17f9
-#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PRAM_BUON  L"\u17f9"
+#define UNITEXT_KHMER_SYMBOL_LEK_ATTAK_PRAM_BUON  U"\u17f9"
 #define UNICODE_MONGOLIAN_BIRGA  0x1800
-#define UNITEXT_MONGOLIAN_BIRGA  L"\u1800"
+#define UNITEXT_MONGOLIAN_BIRGA  U"\u1800"
 #define UNICODE_MONGOLIAN_ELLIPSIS  0x1801
-#define UNITEXT_MONGOLIAN_ELLIPSIS  L"\u1801"
+#define UNITEXT_MONGOLIAN_ELLIPSIS  U"\u1801"
 #define UNICODE_MONGOLIAN_COMMA  0x1802
-#define UNITEXT_MONGOLIAN_COMMA  L"\u1802"
+#define UNITEXT_MONGOLIAN_COMMA  U"\u1802"
 #define UNICODE_MONGOLIAN_FULL_STOP  0x1803
-#define UNITEXT_MONGOLIAN_FULL_STOP  L"\u1803"
+#define UNITEXT_MONGOLIAN_FULL_STOP  U"\u1803"
 #define UNICODE_MONGOLIAN_COLON  0x1804
-#define UNITEXT_MONGOLIAN_COLON  L"\u1804"
+#define UNITEXT_MONGOLIAN_COLON  U"\u1804"
 #define UNICODE_MONGOLIAN_FOUR_DOTS  0x1805
-#define UNITEXT_MONGOLIAN_FOUR_DOTS  L"\u1805"
+#define UNITEXT_MONGOLIAN_FOUR_DOTS  U"\u1805"
 #define UNICODE_MONGOLIAN_TODO_SOFT_HYPHEN  0x1806
-#define UNITEXT_MONGOLIAN_TODO_SOFT_HYPHEN  L"\u1806"
+#define UNITEXT_MONGOLIAN_TODO_SOFT_HYPHEN  U"\u1806"
 #define UNICODE_MONGOLIAN_SIBE_SYLLABLE_BOUNDARY_MARKER  0x1807
-#define UNITEXT_MONGOLIAN_SIBE_SYLLABLE_BOUNDARY_MARKER  L"\u1807"
+#define UNITEXT_MONGOLIAN_SIBE_SYLLABLE_BOUNDARY_MARKER  U"\u1807"
 #define UNICODE_MONGOLIAN_MANCHU_COMMA  0x1808
-#define UNITEXT_MONGOLIAN_MANCHU_COMMA  L"\u1808"
+#define UNITEXT_MONGOLIAN_MANCHU_COMMA  U"\u1808"
 #define UNICODE_MONGOLIAN_MANCHU_FULL_STOP  0x1809
-#define UNITEXT_MONGOLIAN_MANCHU_FULL_STOP  L"\u1809"
+#define UNITEXT_MONGOLIAN_MANCHU_FULL_STOP  U"\u1809"
 #define UNICODE_MONGOLIAN_NIRUGU  0x180a
-#define UNITEXT_MONGOLIAN_NIRUGU  L"\u180a"
+#define UNITEXT_MONGOLIAN_NIRUGU  U"\u180a"
 #define UNICODE_MONGOLIAN_FREE_VARIATION_SELECTOR_ONE  0x180b
-#define UNITEXT_MONGOLIAN_FREE_VARIATION_SELECTOR_ONE  L"\u180b"
+#define UNITEXT_MONGOLIAN_FREE_VARIATION_SELECTOR_ONE  U"\u180b"
 #define UNICODE_MONGOLIAN_FREE_VARIATION_SELECTOR_TWO  0x180c
-#define UNITEXT_MONGOLIAN_FREE_VARIATION_SELECTOR_TWO  L"\u180c"
+#define UNITEXT_MONGOLIAN_FREE_VARIATION_SELECTOR_TWO  U"\u180c"
 #define UNICODE_MONGOLIAN_FREE_VARIATION_SELECTOR_THREE  0x180d
-#define UNITEXT_MONGOLIAN_FREE_VARIATION_SELECTOR_THREE  L"\u180d"
+#define UNITEXT_MONGOLIAN_FREE_VARIATION_SELECTOR_THREE  U"\u180d"
 #define UNICODE_MONGOLIAN_VOWEL_SEPARATOR  0x180e
-#define UNITEXT_MONGOLIAN_VOWEL_SEPARATOR  L"\u180e"
+#define UNITEXT_MONGOLIAN_VOWEL_SEPARATOR  U"\u180e"
 #define UNICODE_MONGOLIAN_DIGIT_ZERO  0x1810
-#define UNITEXT_MONGOLIAN_DIGIT_ZERO  L"\u1810"
+#define UNITEXT_MONGOLIAN_DIGIT_ZERO  U"\u1810"
 #define UNICODE_MONGOLIAN_DIGIT_ONE  0x1811
-#define UNITEXT_MONGOLIAN_DIGIT_ONE  L"\u1811"
+#define UNITEXT_MONGOLIAN_DIGIT_ONE  U"\u1811"
 #define UNICODE_MONGOLIAN_DIGIT_TWO  0x1812
-#define UNITEXT_MONGOLIAN_DIGIT_TWO  L"\u1812"
+#define UNITEXT_MONGOLIAN_DIGIT_TWO  U"\u1812"
 #define UNICODE_MONGOLIAN_DIGIT_THREE  0x1813
-#define UNITEXT_MONGOLIAN_DIGIT_THREE  L"\u1813"
+#define UNITEXT_MONGOLIAN_DIGIT_THREE  U"\u1813"
 #define UNICODE_MONGOLIAN_DIGIT_FOUR  0x1814
-#define UNITEXT_MONGOLIAN_DIGIT_FOUR  L"\u1814"
+#define UNITEXT_MONGOLIAN_DIGIT_FOUR  U"\u1814"
 #define UNICODE_MONGOLIAN_DIGIT_FIVE  0x1815
-#define UNITEXT_MONGOLIAN_DIGIT_FIVE  L"\u1815"
+#define UNITEXT_MONGOLIAN_DIGIT_FIVE  U"\u1815"
 #define UNICODE_MONGOLIAN_DIGIT_SIX  0x1816
-#define UNITEXT_MONGOLIAN_DIGIT_SIX  L"\u1816"
+#define UNITEXT_MONGOLIAN_DIGIT_SIX  U"\u1816"
 #define UNICODE_MONGOLIAN_DIGIT_SEVEN  0x1817
-#define UNITEXT_MONGOLIAN_DIGIT_SEVEN  L"\u1817"
+#define UNITEXT_MONGOLIAN_DIGIT_SEVEN  U"\u1817"
 #define UNICODE_MONGOLIAN_DIGIT_EIGHT  0x1818
-#define UNITEXT_MONGOLIAN_DIGIT_EIGHT  L"\u1818"
+#define UNITEXT_MONGOLIAN_DIGIT_EIGHT  U"\u1818"
 #define UNICODE_MONGOLIAN_DIGIT_NINE  0x1819
-#define UNITEXT_MONGOLIAN_DIGIT_NINE  L"\u1819"
+#define UNITEXT_MONGOLIAN_DIGIT_NINE  U"\u1819"
 #define UNICODE_MONGOLIAN_LETTER_A  0x1820
-#define UNITEXT_MONGOLIAN_LETTER_A  L"\u1820"
+#define UNITEXT_MONGOLIAN_LETTER_A  U"\u1820"
 #define UNICODE_MONGOLIAN_LETTER_E  0x1821
-#define UNITEXT_MONGOLIAN_LETTER_E  L"\u1821"
+#define UNITEXT_MONGOLIAN_LETTER_E  U"\u1821"
 #define UNICODE_MONGOLIAN_LETTER_I  0x1822
-#define UNITEXT_MONGOLIAN_LETTER_I  L"\u1822"
+#define UNITEXT_MONGOLIAN_LETTER_I  U"\u1822"
 #define UNICODE_MONGOLIAN_LETTER_O  0x1823
-#define UNITEXT_MONGOLIAN_LETTER_O  L"\u1823"
+#define UNITEXT_MONGOLIAN_LETTER_O  U"\u1823"
 #define UNICODE_MONGOLIAN_LETTER_U  0x1824
-#define UNITEXT_MONGOLIAN_LETTER_U  L"\u1824"
+#define UNITEXT_MONGOLIAN_LETTER_U  U"\u1824"
 #define UNICODE_MONGOLIAN_LETTER_OE  0x1825
-#define UNITEXT_MONGOLIAN_LETTER_OE  L"\u1825"
+#define UNITEXT_MONGOLIAN_LETTER_OE  U"\u1825"
 #define UNICODE_MONGOLIAN_LETTER_UE  0x1826
-#define UNITEXT_MONGOLIAN_LETTER_UE  L"\u1826"
+#define UNITEXT_MONGOLIAN_LETTER_UE  U"\u1826"
 #define UNICODE_MONGOLIAN_LETTER_EE  0x1827
-#define UNITEXT_MONGOLIAN_LETTER_EE  L"\u1827"
+#define UNITEXT_MONGOLIAN_LETTER_EE  U"\u1827"
 #define UNICODE_MONGOLIAN_LETTER_NA  0x1828
-#define UNITEXT_MONGOLIAN_LETTER_NA  L"\u1828"
+#define UNITEXT_MONGOLIAN_LETTER_NA  U"\u1828"
 #define UNICODE_MONGOLIAN_LETTER_ANG  0x1829
-#define UNITEXT_MONGOLIAN_LETTER_ANG  L"\u1829"
+#define UNITEXT_MONGOLIAN_LETTER_ANG  U"\u1829"
 #define UNICODE_MONGOLIAN_LETTER_BA  0x182a
-#define UNITEXT_MONGOLIAN_LETTER_BA  L"\u182a"
+#define UNITEXT_MONGOLIAN_LETTER_BA  U"\u182a"
 #define UNICODE_MONGOLIAN_LETTER_PA  0x182b
-#define UNITEXT_MONGOLIAN_LETTER_PA  L"\u182b"
+#define UNITEXT_MONGOLIAN_LETTER_PA  U"\u182b"
 #define UNICODE_MONGOLIAN_LETTER_QA  0x182c
-#define UNITEXT_MONGOLIAN_LETTER_QA  L"\u182c"
+#define UNITEXT_MONGOLIAN_LETTER_QA  U"\u182c"
 #define UNICODE_MONGOLIAN_LETTER_GA  0x182d
-#define UNITEXT_MONGOLIAN_LETTER_GA  L"\u182d"
+#define UNITEXT_MONGOLIAN_LETTER_GA  U"\u182d"
 #define UNICODE_MONGOLIAN_LETTER_MA  0x182e
-#define UNITEXT_MONGOLIAN_LETTER_MA  L"\u182e"
+#define UNITEXT_MONGOLIAN_LETTER_MA  U"\u182e"
 #define UNICODE_MONGOLIAN_LETTER_LA  0x182f
-#define UNITEXT_MONGOLIAN_LETTER_LA  L"\u182f"
+#define UNITEXT_MONGOLIAN_LETTER_LA  U"\u182f"
 #define UNICODE_MONGOLIAN_LETTER_SA  0x1830
-#define UNITEXT_MONGOLIAN_LETTER_SA  L"\u1830"
+#define UNITEXT_MONGOLIAN_LETTER_SA  U"\u1830"
 #define UNICODE_MONGOLIAN_LETTER_SHA  0x1831
-#define UNITEXT_MONGOLIAN_LETTER_SHA  L"\u1831"
+#define UNITEXT_MONGOLIAN_LETTER_SHA  U"\u1831"
 #define UNICODE_MONGOLIAN_LETTER_TA  0x1832
-#define UNITEXT_MONGOLIAN_LETTER_TA  L"\u1832"
+#define UNITEXT_MONGOLIAN_LETTER_TA  U"\u1832"
 #define UNICODE_MONGOLIAN_LETTER_DA  0x1833
-#define UNITEXT_MONGOLIAN_LETTER_DA  L"\u1833"
+#define UNITEXT_MONGOLIAN_LETTER_DA  U"\u1833"
 #define UNICODE_MONGOLIAN_LETTER_CHA  0x1834
-#define UNITEXT_MONGOLIAN_LETTER_CHA  L"\u1834"
+#define UNITEXT_MONGOLIAN_LETTER_CHA  U"\u1834"
 #define UNICODE_MONGOLIAN_LETTER_JA  0x1835
-#define UNITEXT_MONGOLIAN_LETTER_JA  L"\u1835"
+#define UNITEXT_MONGOLIAN_LETTER_JA  U"\u1835"
 #define UNICODE_MONGOLIAN_LETTER_YA  0x1836
-#define UNITEXT_MONGOLIAN_LETTER_YA  L"\u1836"
+#define UNITEXT_MONGOLIAN_LETTER_YA  U"\u1836"
 #define UNICODE_MONGOLIAN_LETTER_RA  0x1837
-#define UNITEXT_MONGOLIAN_LETTER_RA  L"\u1837"
+#define UNITEXT_MONGOLIAN_LETTER_RA  U"\u1837"
 #define UNICODE_MONGOLIAN_LETTER_WA  0x1838
-#define UNITEXT_MONGOLIAN_LETTER_WA  L"\u1838"
+#define UNITEXT_MONGOLIAN_LETTER_WA  U"\u1838"
 #define UNICODE_MONGOLIAN_LETTER_FA  0x1839
-#define UNITEXT_MONGOLIAN_LETTER_FA  L"\u1839"
+#define UNITEXT_MONGOLIAN_LETTER_FA  U"\u1839"
 #define UNICODE_MONGOLIAN_LETTER_KA  0x183a
-#define UNITEXT_MONGOLIAN_LETTER_KA  L"\u183a"
+#define UNITEXT_MONGOLIAN_LETTER_KA  U"\u183a"
 #define UNICODE_MONGOLIAN_LETTER_KHA  0x183b
-#define UNITEXT_MONGOLIAN_LETTER_KHA  L"\u183b"
+#define UNITEXT_MONGOLIAN_LETTER_KHA  U"\u183b"
 #define UNICODE_MONGOLIAN_LETTER_TSA  0x183c
-#define UNITEXT_MONGOLIAN_LETTER_TSA  L"\u183c"
+#define UNITEXT_MONGOLIAN_LETTER_TSA  U"\u183c"
 #define UNICODE_MONGOLIAN_LETTER_ZA  0x183d
-#define UNITEXT_MONGOLIAN_LETTER_ZA  L"\u183d"
+#define UNITEXT_MONGOLIAN_LETTER_ZA  U"\u183d"
 #define UNICODE_MONGOLIAN_LETTER_HAA  0x183e
-#define UNITEXT_MONGOLIAN_LETTER_HAA  L"\u183e"
+#define UNITEXT_MONGOLIAN_LETTER_HAA  U"\u183e"
 #define UNICODE_MONGOLIAN_LETTER_ZRA  0x183f
-#define UNITEXT_MONGOLIAN_LETTER_ZRA  L"\u183f"
+#define UNITEXT_MONGOLIAN_LETTER_ZRA  U"\u183f"
 #define UNICODE_MONGOLIAN_LETTER_LHA  0x1840
-#define UNITEXT_MONGOLIAN_LETTER_LHA  L"\u1840"
+#define UNITEXT_MONGOLIAN_LETTER_LHA  U"\u1840"
 #define UNICODE_MONGOLIAN_LETTER_ZHI  0x1841
-#define UNITEXT_MONGOLIAN_LETTER_ZHI  L"\u1841"
+#define UNITEXT_MONGOLIAN_LETTER_ZHI  U"\u1841"
 #define UNICODE_MONGOLIAN_LETTER_CHI  0x1842
-#define UNITEXT_MONGOLIAN_LETTER_CHI  L"\u1842"
+#define UNITEXT_MONGOLIAN_LETTER_CHI  U"\u1842"
 #define UNICODE_MONGOLIAN_LETTER_TODO_LONG_VOWEL_SIGN  0x1843
-#define UNITEXT_MONGOLIAN_LETTER_TODO_LONG_VOWEL_SIGN  L"\u1843"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_LONG_VOWEL_SIGN  U"\u1843"
 #define UNICODE_MONGOLIAN_LETTER_TODO_E  0x1844
-#define UNITEXT_MONGOLIAN_LETTER_TODO_E  L"\u1844"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_E  U"\u1844"
 #define UNICODE_MONGOLIAN_LETTER_TODO_I  0x1845
-#define UNITEXT_MONGOLIAN_LETTER_TODO_I  L"\u1845"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_I  U"\u1845"
 #define UNICODE_MONGOLIAN_LETTER_TODO_O  0x1846
-#define UNITEXT_MONGOLIAN_LETTER_TODO_O  L"\u1846"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_O  U"\u1846"
 #define UNICODE_MONGOLIAN_LETTER_TODO_U  0x1847
-#define UNITEXT_MONGOLIAN_LETTER_TODO_U  L"\u1847"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_U  U"\u1847"
 #define UNICODE_MONGOLIAN_LETTER_TODO_OE  0x1848
-#define UNITEXT_MONGOLIAN_LETTER_TODO_OE  L"\u1848"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_OE  U"\u1848"
 #define UNICODE_MONGOLIAN_LETTER_TODO_UE  0x1849
-#define UNITEXT_MONGOLIAN_LETTER_TODO_UE  L"\u1849"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_UE  U"\u1849"
 #define UNICODE_MONGOLIAN_LETTER_TODO_ANG  0x184a
-#define UNITEXT_MONGOLIAN_LETTER_TODO_ANG  L"\u184a"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_ANG  U"\u184a"
 #define UNICODE_MONGOLIAN_LETTER_TODO_BA  0x184b
-#define UNITEXT_MONGOLIAN_LETTER_TODO_BA  L"\u184b"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_BA  U"\u184b"
 #define UNICODE_MONGOLIAN_LETTER_TODO_PA  0x184c
-#define UNITEXT_MONGOLIAN_LETTER_TODO_PA  L"\u184c"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_PA  U"\u184c"
 #define UNICODE_MONGOLIAN_LETTER_TODO_QA  0x184d
-#define UNITEXT_MONGOLIAN_LETTER_TODO_QA  L"\u184d"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_QA  U"\u184d"
 #define UNICODE_MONGOLIAN_LETTER_TODO_GA  0x184e
-#define UNITEXT_MONGOLIAN_LETTER_TODO_GA  L"\u184e"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_GA  U"\u184e"
 #define UNICODE_MONGOLIAN_LETTER_TODO_MA  0x184f
-#define UNITEXT_MONGOLIAN_LETTER_TODO_MA  L"\u184f"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_MA  U"\u184f"
 #define UNICODE_MONGOLIAN_LETTER_TODO_TA  0x1850
-#define UNITEXT_MONGOLIAN_LETTER_TODO_TA  L"\u1850"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_TA  U"\u1850"
 #define UNICODE_MONGOLIAN_LETTER_TODO_DA  0x1851
-#define UNITEXT_MONGOLIAN_LETTER_TODO_DA  L"\u1851"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_DA  U"\u1851"
 #define UNICODE_MONGOLIAN_LETTER_TODO_CHA  0x1852
-#define UNITEXT_MONGOLIAN_LETTER_TODO_CHA  L"\u1852"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_CHA  U"\u1852"
 #define UNICODE_MONGOLIAN_LETTER_TODO_JA  0x1853
-#define UNITEXT_MONGOLIAN_LETTER_TODO_JA  L"\u1853"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_JA  U"\u1853"
 #define UNICODE_MONGOLIAN_LETTER_TODO_TSA  0x1854
-#define UNITEXT_MONGOLIAN_LETTER_TODO_TSA  L"\u1854"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_TSA  U"\u1854"
 #define UNICODE_MONGOLIAN_LETTER_TODO_YA  0x1855
-#define UNITEXT_MONGOLIAN_LETTER_TODO_YA  L"\u1855"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_YA  U"\u1855"
 #define UNICODE_MONGOLIAN_LETTER_TODO_WA  0x1856
-#define UNITEXT_MONGOLIAN_LETTER_TODO_WA  L"\u1856"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_WA  U"\u1856"
 #define UNICODE_MONGOLIAN_LETTER_TODO_KA  0x1857
-#define UNITEXT_MONGOLIAN_LETTER_TODO_KA  L"\u1857"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_KA  U"\u1857"
 #define UNICODE_MONGOLIAN_LETTER_TODO_GAA  0x1858
-#define UNITEXT_MONGOLIAN_LETTER_TODO_GAA  L"\u1858"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_GAA  U"\u1858"
 #define UNICODE_MONGOLIAN_LETTER_TODO_HAA  0x1859
-#define UNITEXT_MONGOLIAN_LETTER_TODO_HAA  L"\u1859"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_HAA  U"\u1859"
 #define UNICODE_MONGOLIAN_LETTER_TODO_JIA  0x185a
-#define UNITEXT_MONGOLIAN_LETTER_TODO_JIA  L"\u185a"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_JIA  U"\u185a"
 #define UNICODE_MONGOLIAN_LETTER_TODO_NIA  0x185b
-#define UNITEXT_MONGOLIAN_LETTER_TODO_NIA  L"\u185b"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_NIA  U"\u185b"
 #define UNICODE_MONGOLIAN_LETTER_TODO_DZA  0x185c
-#define UNITEXT_MONGOLIAN_LETTER_TODO_DZA  L"\u185c"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_DZA  U"\u185c"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_E  0x185d
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_E  L"\u185d"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_E  U"\u185d"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_I  0x185e
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_I  L"\u185e"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_I  U"\u185e"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_IY  0x185f
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_IY  L"\u185f"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_IY  U"\u185f"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_UE  0x1860
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_UE  L"\u1860"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_UE  U"\u1860"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_U  0x1861
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_U  L"\u1861"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_U  U"\u1861"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_ANG  0x1862
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_ANG  L"\u1862"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_ANG  U"\u1862"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_KA  0x1863
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_KA  L"\u1863"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_KA  U"\u1863"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_GA  0x1864
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_GA  L"\u1864"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_GA  U"\u1864"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_HA  0x1865
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_HA  L"\u1865"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_HA  U"\u1865"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_PA  0x1866
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_PA  L"\u1866"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_PA  U"\u1866"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_SHA  0x1867
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_SHA  L"\u1867"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_SHA  U"\u1867"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_TA  0x1868
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_TA  L"\u1868"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_TA  U"\u1868"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_DA  0x1869
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_DA  L"\u1869"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_DA  U"\u1869"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_JA  0x186a
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_JA  L"\u186a"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_JA  U"\u186a"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_FA  0x186b
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_FA  L"\u186b"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_FA  U"\u186b"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_GAA  0x186c
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_GAA  L"\u186c"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_GAA  U"\u186c"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_HAA  0x186d
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_HAA  L"\u186d"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_HAA  U"\u186d"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_TSA  0x186e
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_TSA  L"\u186e"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_TSA  U"\u186e"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_ZA  0x186f
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_ZA  L"\u186f"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_ZA  U"\u186f"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_RAA  0x1870
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_RAA  L"\u1870"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_RAA  U"\u1870"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_CHA  0x1871
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_CHA  L"\u1871"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_CHA  U"\u1871"
 #define UNICODE_MONGOLIAN_LETTER_SIBE_ZHA  0x1872
-#define UNITEXT_MONGOLIAN_LETTER_SIBE_ZHA  L"\u1872"
+#define UNITEXT_MONGOLIAN_LETTER_SIBE_ZHA  U"\u1872"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_I  0x1873
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_I  L"\u1873"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_I  U"\u1873"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_KA  0x1874
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_KA  L"\u1874"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_KA  U"\u1874"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_RA  0x1875
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_RA  L"\u1875"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_RA  U"\u1875"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_FA  0x1876
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_FA  L"\u1876"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_FA  U"\u1876"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ZHA  0x1877
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ZHA  L"\u1877"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ZHA  U"\u1877"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_ANUSVARA_ONE  0x1880
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_ANUSVARA_ONE  L"\u1880"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_ANUSVARA_ONE  U"\u1880"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_VISARGA_ONE  0x1881
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_VISARGA_ONE  L"\u1881"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_VISARGA_ONE  U"\u1881"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_DAMARU  0x1882
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_DAMARU  L"\u1882"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_DAMARU  U"\u1882"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_UBADAMA  0x1883
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_UBADAMA  L"\u1883"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_UBADAMA  U"\u1883"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_INVERTED_UBADAMA  0x1884
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_INVERTED_UBADAMA  L"\u1884"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_INVERTED_UBADAMA  U"\u1884"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_BALUDA  0x1885
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_BALUDA  L"\u1885"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_BALUDA  U"\u1885"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_THREE_BALUDA  0x1886
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_THREE_BALUDA  L"\u1886"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_THREE_BALUDA  U"\u1886"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_A  0x1887
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_A  L"\u1887"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_A  U"\u1887"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_I  0x1888
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_I  L"\u1888"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_I  U"\u1888"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_KA  0x1889
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_KA  L"\u1889"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_KA  U"\u1889"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_NGA  0x188a
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_NGA  L"\u188a"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_NGA  U"\u188a"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_CA  0x188b
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_CA  L"\u188b"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_CA  U"\u188b"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_TTA  0x188c
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_TTA  L"\u188c"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_TTA  U"\u188c"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_TTHA  0x188d
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_TTHA  L"\u188d"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_TTHA  U"\u188d"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_DDA  0x188e
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_DDA  L"\u188e"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_DDA  U"\u188e"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_NNA  0x188f
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_NNA  L"\u188f"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_NNA  U"\u188f"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_TA  0x1890
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_TA  L"\u1890"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_TA  U"\u1890"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_DA  0x1891
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_DA  L"\u1891"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_DA  U"\u1891"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_PA  0x1892
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_PA  L"\u1892"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_PA  U"\u1892"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_PHA  0x1893
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_PHA  L"\u1893"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_PHA  U"\u1893"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_SSA  0x1894
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_SSA  L"\u1894"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_SSA  U"\u1894"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_ZHA  0x1895
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_ZHA  L"\u1895"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_ZHA  U"\u1895"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_ZA  0x1896
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_ZA  L"\u1896"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_ZA  U"\u1896"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_AH  0x1897
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_AH  L"\u1897"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_AH  U"\u1897"
 #define UNICODE_MONGOLIAN_LETTER_TODO_ALI_GALI_TA  0x1898
-#define UNITEXT_MONGOLIAN_LETTER_TODO_ALI_GALI_TA  L"\u1898"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_ALI_GALI_TA  U"\u1898"
 #define UNICODE_MONGOLIAN_LETTER_TODO_ALI_GALI_ZHA  0x1899
-#define UNITEXT_MONGOLIAN_LETTER_TODO_ALI_GALI_ZHA  L"\u1899"
+#define UNITEXT_MONGOLIAN_LETTER_TODO_ALI_GALI_ZHA  U"\u1899"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_GHA  0x189a
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_GHA  L"\u189a"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_GHA  U"\u189a"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_NGA  0x189b
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_NGA  L"\u189b"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_NGA  U"\u189b"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_CA  0x189c
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_CA  L"\u189c"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_CA  U"\u189c"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_JHA  0x189d
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_JHA  L"\u189d"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_JHA  U"\u189d"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_TTA  0x189e
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_TTA  L"\u189e"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_TTA  U"\u189e"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_DDHA  0x189f
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_DDHA  L"\u189f"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_DDHA  U"\u189f"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_TA  0x18a0
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_TA  L"\u18a0"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_TA  U"\u18a0"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_DHA  0x18a1
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_DHA  L"\u18a1"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_DHA  U"\u18a1"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_SSA  0x18a2
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_SSA  L"\u18a2"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_SSA  U"\u18a2"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_CYA  0x18a3
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_CYA  L"\u18a3"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_CYA  U"\u18a3"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_ZHA  0x18a4
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_ZHA  L"\u18a4"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_ZHA  U"\u18a4"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_ZA  0x18a5
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_ZA  L"\u18a5"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_ZA  U"\u18a5"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_HALF_U  0x18a6
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_HALF_U  L"\u18a6"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_HALF_U  U"\u18a6"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_HALF_YA  0x18a7
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_HALF_YA  L"\u18a7"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_HALF_YA  U"\u18a7"
 #define UNICODE_MONGOLIAN_LETTER_MANCHU_ALI_GALI_BHA  0x18a8
-#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_BHA  L"\u18a8"
+#define UNITEXT_MONGOLIAN_LETTER_MANCHU_ALI_GALI_BHA  U"\u18a8"
 #define UNICODE_MONGOLIAN_LETTER_ALI_GALI_DAGALGA  0x18a9
-#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_DAGALGA  L"\u18a9"
+#define UNITEXT_MONGOLIAN_LETTER_ALI_GALI_DAGALGA  U"\u18a9"
 #define UNICODE_LIMBU_VOWEL_CARRIER_LETTER  0x1900
-#define UNITEXT_LIMBU_VOWEL_CARRIER_LETTER  L"\u1900"
+#define UNITEXT_LIMBU_VOWEL_CARRIER_LETTER  U"\u1900"
 #define UNICODE_LIMBU_LETTER_KA  0x1901
-#define UNITEXT_LIMBU_LETTER_KA  L"\u1901"
+#define UNITEXT_LIMBU_LETTER_KA  U"\u1901"
 #define UNICODE_LIMBU_LETTER_KHA  0x1902
-#define UNITEXT_LIMBU_LETTER_KHA  L"\u1902"
+#define UNITEXT_LIMBU_LETTER_KHA  U"\u1902"
 #define UNICODE_LIMBU_LETTER_GA  0x1903
-#define UNITEXT_LIMBU_LETTER_GA  L"\u1903"
+#define UNITEXT_LIMBU_LETTER_GA  U"\u1903"
 #define UNICODE_LIMBU_LETTER_GHA  0x1904
-#define UNITEXT_LIMBU_LETTER_GHA  L"\u1904"
+#define UNITEXT_LIMBU_LETTER_GHA  U"\u1904"
 #define UNICODE_LIMBU_LETTER_NGA  0x1905
-#define UNITEXT_LIMBU_LETTER_NGA  L"\u1905"
+#define UNITEXT_LIMBU_LETTER_NGA  U"\u1905"
 #define UNICODE_LIMBU_LETTER_CA  0x1906
-#define UNITEXT_LIMBU_LETTER_CA  L"\u1906"
+#define UNITEXT_LIMBU_LETTER_CA  U"\u1906"
 #define UNICODE_LIMBU_LETTER_CHA  0x1907
-#define UNITEXT_LIMBU_LETTER_CHA  L"\u1907"
+#define UNITEXT_LIMBU_LETTER_CHA  U"\u1907"
 #define UNICODE_LIMBU_LETTER_JA  0x1908
-#define UNITEXT_LIMBU_LETTER_JA  L"\u1908"
+#define UNITEXT_LIMBU_LETTER_JA  U"\u1908"
 #define UNICODE_LIMBU_LETTER_JHA  0x1909
-#define UNITEXT_LIMBU_LETTER_JHA  L"\u1909"
+#define UNITEXT_LIMBU_LETTER_JHA  U"\u1909"
 #define UNICODE_LIMBU_LETTER_YAN  0x190a
-#define UNITEXT_LIMBU_LETTER_YAN  L"\u190a"
+#define UNITEXT_LIMBU_LETTER_YAN  U"\u190a"
 #define UNICODE_LIMBU_LETTER_TA  0x190b
-#define UNITEXT_LIMBU_LETTER_TA  L"\u190b"
+#define UNITEXT_LIMBU_LETTER_TA  U"\u190b"
 #define UNICODE_LIMBU_LETTER_THA  0x190c
-#define UNITEXT_LIMBU_LETTER_THA  L"\u190c"
+#define UNITEXT_LIMBU_LETTER_THA  U"\u190c"
 #define UNICODE_LIMBU_LETTER_DA  0x190d
-#define UNITEXT_LIMBU_LETTER_DA  L"\u190d"
+#define UNITEXT_LIMBU_LETTER_DA  U"\u190d"
 #define UNICODE_LIMBU_LETTER_DHA  0x190e
-#define UNITEXT_LIMBU_LETTER_DHA  L"\u190e"
+#define UNITEXT_LIMBU_LETTER_DHA  U"\u190e"
 #define UNICODE_LIMBU_LETTER_NA  0x190f
-#define UNITEXT_LIMBU_LETTER_NA  L"\u190f"
+#define UNITEXT_LIMBU_LETTER_NA  U"\u190f"
 #define UNICODE_LIMBU_LETTER_PA  0x1910
-#define UNITEXT_LIMBU_LETTER_PA  L"\u1910"
+#define UNITEXT_LIMBU_LETTER_PA  U"\u1910"
 #define UNICODE_LIMBU_LETTER_PHA  0x1911
-#define UNITEXT_LIMBU_LETTER_PHA  L"\u1911"
+#define UNITEXT_LIMBU_LETTER_PHA  U"\u1911"
 #define UNICODE_LIMBU_LETTER_BA  0x1912
-#define UNITEXT_LIMBU_LETTER_BA  L"\u1912"
+#define UNITEXT_LIMBU_LETTER_BA  U"\u1912"
 #define UNICODE_LIMBU_LETTER_BHA  0x1913
-#define UNITEXT_LIMBU_LETTER_BHA  L"\u1913"
+#define UNITEXT_LIMBU_LETTER_BHA  U"\u1913"
 #define UNICODE_LIMBU_LETTER_MA  0x1914
-#define UNITEXT_LIMBU_LETTER_MA  L"\u1914"
+#define UNITEXT_LIMBU_LETTER_MA  U"\u1914"
 #define UNICODE_LIMBU_LETTER_YA  0x1915
-#define UNITEXT_LIMBU_LETTER_YA  L"\u1915"
+#define UNITEXT_LIMBU_LETTER_YA  U"\u1915"
 #define UNICODE_LIMBU_LETTER_RA  0x1916
-#define UNITEXT_LIMBU_LETTER_RA  L"\u1916"
+#define UNITEXT_LIMBU_LETTER_RA  U"\u1916"
 #define UNICODE_LIMBU_LETTER_LA  0x1917
-#define UNITEXT_LIMBU_LETTER_LA  L"\u1917"
+#define UNITEXT_LIMBU_LETTER_LA  U"\u1917"
 #define UNICODE_LIMBU_LETTER_WA  0x1918
-#define UNITEXT_LIMBU_LETTER_WA  L"\u1918"
+#define UNITEXT_LIMBU_LETTER_WA  U"\u1918"
 #define UNICODE_LIMBU_LETTER_SHA  0x1919
-#define UNITEXT_LIMBU_LETTER_SHA  L"\u1919"
+#define UNITEXT_LIMBU_LETTER_SHA  U"\u1919"
 #define UNICODE_LIMBU_LETTER_SSA  0x191a
-#define UNITEXT_LIMBU_LETTER_SSA  L"\u191a"
+#define UNITEXT_LIMBU_LETTER_SSA  U"\u191a"
 #define UNICODE_LIMBU_LETTER_SA  0x191b
-#define UNITEXT_LIMBU_LETTER_SA  L"\u191b"
+#define UNITEXT_LIMBU_LETTER_SA  U"\u191b"
 #define UNICODE_LIMBU_LETTER_HA  0x191c
-#define UNITEXT_LIMBU_LETTER_HA  L"\u191c"
+#define UNITEXT_LIMBU_LETTER_HA  U"\u191c"
 #define UNICODE_LIMBU_VOWEL_SIGN_A  0x1920
-#define UNITEXT_LIMBU_VOWEL_SIGN_A  L"\u1920"
+#define UNITEXT_LIMBU_VOWEL_SIGN_A  U"\u1920"
 #define UNICODE_LIMBU_VOWEL_SIGN_I  0x1921
-#define UNITEXT_LIMBU_VOWEL_SIGN_I  L"\u1921"
+#define UNITEXT_LIMBU_VOWEL_SIGN_I  U"\u1921"
 #define UNICODE_LIMBU_VOWEL_SIGN_U  0x1922
-#define UNITEXT_LIMBU_VOWEL_SIGN_U  L"\u1922"
+#define UNITEXT_LIMBU_VOWEL_SIGN_U  U"\u1922"
 #define UNICODE_LIMBU_VOWEL_SIGN_EE  0x1923
-#define UNITEXT_LIMBU_VOWEL_SIGN_EE  L"\u1923"
+#define UNITEXT_LIMBU_VOWEL_SIGN_EE  U"\u1923"
 #define UNICODE_LIMBU_VOWEL_SIGN_AI  0x1924
-#define UNITEXT_LIMBU_VOWEL_SIGN_AI  L"\u1924"
+#define UNITEXT_LIMBU_VOWEL_SIGN_AI  U"\u1924"
 #define UNICODE_LIMBU_VOWEL_SIGN_OO  0x1925
-#define UNITEXT_LIMBU_VOWEL_SIGN_OO  L"\u1925"
+#define UNITEXT_LIMBU_VOWEL_SIGN_OO  U"\u1925"
 #define UNICODE_LIMBU_VOWEL_SIGN_AU  0x1926
-#define UNITEXT_LIMBU_VOWEL_SIGN_AU  L"\u1926"
+#define UNITEXT_LIMBU_VOWEL_SIGN_AU  U"\u1926"
 #define UNICODE_LIMBU_VOWEL_SIGN_E  0x1927
-#define UNITEXT_LIMBU_VOWEL_SIGN_E  L"\u1927"
+#define UNITEXT_LIMBU_VOWEL_SIGN_E  U"\u1927"
 #define UNICODE_LIMBU_VOWEL_SIGN_O  0x1928
-#define UNITEXT_LIMBU_VOWEL_SIGN_O  L"\u1928"
+#define UNITEXT_LIMBU_VOWEL_SIGN_O  U"\u1928"
 #define UNICODE_LIMBU_SUBJOINED_LETTER_YA  0x1929
-#define UNITEXT_LIMBU_SUBJOINED_LETTER_YA  L"\u1929"
+#define UNITEXT_LIMBU_SUBJOINED_LETTER_YA  U"\u1929"
 #define UNICODE_LIMBU_SUBJOINED_LETTER_RA  0x192a
-#define UNITEXT_LIMBU_SUBJOINED_LETTER_RA  L"\u192a"
+#define UNITEXT_LIMBU_SUBJOINED_LETTER_RA  U"\u192a"
 #define UNICODE_LIMBU_SUBJOINED_LETTER_WA  0x192b
-#define UNITEXT_LIMBU_SUBJOINED_LETTER_WA  L"\u192b"
+#define UNITEXT_LIMBU_SUBJOINED_LETTER_WA  U"\u192b"
 #define UNICODE_LIMBU_SMALL_LETTER_KA  0x1930
-#define UNITEXT_LIMBU_SMALL_LETTER_KA  L"\u1930"
+#define UNITEXT_LIMBU_SMALL_LETTER_KA  U"\u1930"
 #define UNICODE_LIMBU_SMALL_LETTER_NGA  0x1931
-#define UNITEXT_LIMBU_SMALL_LETTER_NGA  L"\u1931"
+#define UNITEXT_LIMBU_SMALL_LETTER_NGA  U"\u1931"
 #define UNICODE_LIMBU_SMALL_LETTER_ANUSVARA  0x1932
-#define UNITEXT_LIMBU_SMALL_LETTER_ANUSVARA  L"\u1932"
+#define UNITEXT_LIMBU_SMALL_LETTER_ANUSVARA  U"\u1932"
 #define UNICODE_LIMBU_SMALL_LETTER_TA  0x1933
-#define UNITEXT_LIMBU_SMALL_LETTER_TA  L"\u1933"
+#define UNITEXT_LIMBU_SMALL_LETTER_TA  U"\u1933"
 #define UNICODE_LIMBU_SMALL_LETTER_NA  0x1934
-#define UNITEXT_LIMBU_SMALL_LETTER_NA  L"\u1934"
+#define UNITEXT_LIMBU_SMALL_LETTER_NA  U"\u1934"
 #define UNICODE_LIMBU_SMALL_LETTER_PA  0x1935
-#define UNITEXT_LIMBU_SMALL_LETTER_PA  L"\u1935"
+#define UNITEXT_LIMBU_SMALL_LETTER_PA  U"\u1935"
 #define UNICODE_LIMBU_SMALL_LETTER_MA  0x1936
-#define UNITEXT_LIMBU_SMALL_LETTER_MA  L"\u1936"
+#define UNITEXT_LIMBU_SMALL_LETTER_MA  U"\u1936"
 #define UNICODE_LIMBU_SMALL_LETTER_RA  0x1937
-#define UNITEXT_LIMBU_SMALL_LETTER_RA  L"\u1937"
+#define UNITEXT_LIMBU_SMALL_LETTER_RA  U"\u1937"
 #define UNICODE_LIMBU_SMALL_LETTER_LA  0x1938
-#define UNITEXT_LIMBU_SMALL_LETTER_LA  L"\u1938"
+#define UNITEXT_LIMBU_SMALL_LETTER_LA  U"\u1938"
 #define UNICODE_LIMBU_SIGN_MUKPHRENG  0x1939
-#define UNITEXT_LIMBU_SIGN_MUKPHRENG  L"\u1939"
+#define UNITEXT_LIMBU_SIGN_MUKPHRENG  U"\u1939"
 #define UNICODE_LIMBU_SIGN_KEMPHRENG  0x193a
-#define UNITEXT_LIMBU_SIGN_KEMPHRENG  L"\u193a"
+#define UNITEXT_LIMBU_SIGN_KEMPHRENG  U"\u193a"
 #define UNICODE_LIMBU_SIGN_SA_I  0x193b
-#define UNITEXT_LIMBU_SIGN_SA_I  L"\u193b"
+#define UNITEXT_LIMBU_SIGN_SA_I  U"\u193b"
 #define UNICODE_LIMBU_SIGN_LOO  0x1940
-#define UNITEXT_LIMBU_SIGN_LOO  L"\u1940"
+#define UNITEXT_LIMBU_SIGN_LOO  U"\u1940"
 #define UNICODE_LIMBU_EXCLAMATION_MARK  0x1944
-#define UNITEXT_LIMBU_EXCLAMATION_MARK  L"\u1944"
+#define UNITEXT_LIMBU_EXCLAMATION_MARK  U"\u1944"
 #define UNICODE_LIMBU_QUESTION_MARK  0x1945
-#define UNITEXT_LIMBU_QUESTION_MARK  L"\u1945"
+#define UNITEXT_LIMBU_QUESTION_MARK  U"\u1945"
 #define UNICODE_LIMBU_DIGIT_ZERO  0x1946
-#define UNITEXT_LIMBU_DIGIT_ZERO  L"\u1946"
+#define UNITEXT_LIMBU_DIGIT_ZERO  U"\u1946"
 #define UNICODE_LIMBU_DIGIT_ONE  0x1947
-#define UNITEXT_LIMBU_DIGIT_ONE  L"\u1947"
+#define UNITEXT_LIMBU_DIGIT_ONE  U"\u1947"
 #define UNICODE_LIMBU_DIGIT_TWO  0x1948
-#define UNITEXT_LIMBU_DIGIT_TWO  L"\u1948"
+#define UNITEXT_LIMBU_DIGIT_TWO  U"\u1948"
 #define UNICODE_LIMBU_DIGIT_THREE  0x1949
-#define UNITEXT_LIMBU_DIGIT_THREE  L"\u1949"
+#define UNITEXT_LIMBU_DIGIT_THREE  U"\u1949"
 #define UNICODE_LIMBU_DIGIT_FOUR  0x194a
-#define UNITEXT_LIMBU_DIGIT_FOUR  L"\u194a"
+#define UNITEXT_LIMBU_DIGIT_FOUR  U"\u194a"
 #define UNICODE_LIMBU_DIGIT_FIVE  0x194b
-#define UNITEXT_LIMBU_DIGIT_FIVE  L"\u194b"
+#define UNITEXT_LIMBU_DIGIT_FIVE  U"\u194b"
 #define UNICODE_LIMBU_DIGIT_SIX  0x194c
-#define UNITEXT_LIMBU_DIGIT_SIX  L"\u194c"
+#define UNITEXT_LIMBU_DIGIT_SIX  U"\u194c"
 #define UNICODE_LIMBU_DIGIT_SEVEN  0x194d
-#define UNITEXT_LIMBU_DIGIT_SEVEN  L"\u194d"
+#define UNITEXT_LIMBU_DIGIT_SEVEN  U"\u194d"
 #define UNICODE_LIMBU_DIGIT_EIGHT  0x194e
-#define UNITEXT_LIMBU_DIGIT_EIGHT  L"\u194e"
+#define UNITEXT_LIMBU_DIGIT_EIGHT  U"\u194e"
 #define UNICODE_LIMBU_DIGIT_NINE  0x194f
-#define UNITEXT_LIMBU_DIGIT_NINE  L"\u194f"
+#define UNITEXT_LIMBU_DIGIT_NINE  U"\u194f"
 #define UNICODE_TAI_LE_LETTER_KA  0x1950
-#define UNITEXT_TAI_LE_LETTER_KA  L"\u1950"
+#define UNITEXT_TAI_LE_LETTER_KA  U"\u1950"
 #define UNICODE_TAI_LE_LETTER_XA  0x1951
-#define UNITEXT_TAI_LE_LETTER_XA  L"\u1951"
+#define UNITEXT_TAI_LE_LETTER_XA  U"\u1951"
 #define UNICODE_TAI_LE_LETTER_NGA  0x1952
-#define UNITEXT_TAI_LE_LETTER_NGA  L"\u1952"
+#define UNITEXT_TAI_LE_LETTER_NGA  U"\u1952"
 #define UNICODE_TAI_LE_LETTER_TSA  0x1953
-#define UNITEXT_TAI_LE_LETTER_TSA  L"\u1953"
+#define UNITEXT_TAI_LE_LETTER_TSA  U"\u1953"
 #define UNICODE_TAI_LE_LETTER_SA  0x1954
-#define UNITEXT_TAI_LE_LETTER_SA  L"\u1954"
+#define UNITEXT_TAI_LE_LETTER_SA  U"\u1954"
 #define UNICODE_TAI_LE_LETTER_YA  0x1955
-#define UNITEXT_TAI_LE_LETTER_YA  L"\u1955"
+#define UNITEXT_TAI_LE_LETTER_YA  U"\u1955"
 #define UNICODE_TAI_LE_LETTER_TA  0x1956
-#define UNITEXT_TAI_LE_LETTER_TA  L"\u1956"
+#define UNITEXT_TAI_LE_LETTER_TA  U"\u1956"
 #define UNICODE_TAI_LE_LETTER_THA  0x1957
-#define UNITEXT_TAI_LE_LETTER_THA  L"\u1957"
+#define UNITEXT_TAI_LE_LETTER_THA  U"\u1957"
 #define UNICODE_TAI_LE_LETTER_LA  0x1958
-#define UNITEXT_TAI_LE_LETTER_LA  L"\u1958"
+#define UNITEXT_TAI_LE_LETTER_LA  U"\u1958"
 #define UNICODE_TAI_LE_LETTER_PA  0x1959
-#define UNITEXT_TAI_LE_LETTER_PA  L"\u1959"
+#define UNITEXT_TAI_LE_LETTER_PA  U"\u1959"
 #define UNICODE_TAI_LE_LETTER_PHA  0x195a
-#define UNITEXT_TAI_LE_LETTER_PHA  L"\u195a"
+#define UNITEXT_TAI_LE_LETTER_PHA  U"\u195a"
 #define UNICODE_TAI_LE_LETTER_MA  0x195b
-#define UNITEXT_TAI_LE_LETTER_MA  L"\u195b"
+#define UNITEXT_TAI_LE_LETTER_MA  U"\u195b"
 #define UNICODE_TAI_LE_LETTER_FA  0x195c
-#define UNITEXT_TAI_LE_LETTER_FA  L"\u195c"
+#define UNITEXT_TAI_LE_LETTER_FA  U"\u195c"
 #define UNICODE_TAI_LE_LETTER_VA  0x195d
-#define UNITEXT_TAI_LE_LETTER_VA  L"\u195d"
+#define UNITEXT_TAI_LE_LETTER_VA  U"\u195d"
 #define UNICODE_TAI_LE_LETTER_HA  0x195e
-#define UNITEXT_TAI_LE_LETTER_HA  L"\u195e"
+#define UNITEXT_TAI_LE_LETTER_HA  U"\u195e"
 #define UNICODE_TAI_LE_LETTER_QA  0x195f
-#define UNITEXT_TAI_LE_LETTER_QA  L"\u195f"
+#define UNITEXT_TAI_LE_LETTER_QA  U"\u195f"
 #define UNICODE_TAI_LE_LETTER_KHA  0x1960
-#define UNITEXT_TAI_LE_LETTER_KHA  L"\u1960"
+#define UNITEXT_TAI_LE_LETTER_KHA  U"\u1960"
 #define UNICODE_TAI_LE_LETTER_TSHA  0x1961
-#define UNITEXT_TAI_LE_LETTER_TSHA  L"\u1961"
+#define UNITEXT_TAI_LE_LETTER_TSHA  U"\u1961"
 #define UNICODE_TAI_LE_LETTER_NA  0x1962
-#define UNITEXT_TAI_LE_LETTER_NA  L"\u1962"
+#define UNITEXT_TAI_LE_LETTER_NA  U"\u1962"
 #define UNICODE_TAI_LE_LETTER_A  0x1963
-#define UNITEXT_TAI_LE_LETTER_A  L"\u1963"
+#define UNITEXT_TAI_LE_LETTER_A  U"\u1963"
 #define UNICODE_TAI_LE_LETTER_I  0x1964
-#define UNITEXT_TAI_LE_LETTER_I  L"\u1964"
+#define UNITEXT_TAI_LE_LETTER_I  U"\u1964"
 #define UNICODE_TAI_LE_LETTER_EE  0x1965
-#define UNITEXT_TAI_LE_LETTER_EE  L"\u1965"
+#define UNITEXT_TAI_LE_LETTER_EE  U"\u1965"
 #define UNICODE_TAI_LE_LETTER_EH  0x1966
-#define UNITEXT_TAI_LE_LETTER_EH  L"\u1966"
+#define UNITEXT_TAI_LE_LETTER_EH  U"\u1966"
 #define UNICODE_TAI_LE_LETTER_U  0x1967
-#define UNITEXT_TAI_LE_LETTER_U  L"\u1967"
+#define UNITEXT_TAI_LE_LETTER_U  U"\u1967"
 #define UNICODE_TAI_LE_LETTER_OO  0x1968
-#define UNITEXT_TAI_LE_LETTER_OO  L"\u1968"
+#define UNITEXT_TAI_LE_LETTER_OO  U"\u1968"
 #define UNICODE_TAI_LE_LETTER_O  0x1969
-#define UNITEXT_TAI_LE_LETTER_O  L"\u1969"
+#define UNITEXT_TAI_LE_LETTER_O  U"\u1969"
 #define UNICODE_TAI_LE_LETTER_UE  0x196a
-#define UNITEXT_TAI_LE_LETTER_UE  L"\u196a"
+#define UNITEXT_TAI_LE_LETTER_UE  U"\u196a"
 #define UNICODE_TAI_LE_LETTER_E  0x196b
-#define UNITEXT_TAI_LE_LETTER_E  L"\u196b"
+#define UNITEXT_TAI_LE_LETTER_E  U"\u196b"
 #define UNICODE_TAI_LE_LETTER_AUE  0x196c
-#define UNITEXT_TAI_LE_LETTER_AUE  L"\u196c"
+#define UNITEXT_TAI_LE_LETTER_AUE  U"\u196c"
 #define UNICODE_TAI_LE_LETTER_AI  0x196d
-#define UNITEXT_TAI_LE_LETTER_AI  L"\u196d"
+#define UNITEXT_TAI_LE_LETTER_AI  U"\u196d"
 #define UNICODE_TAI_LE_LETTER_TONE_2  0x1970
-#define UNITEXT_TAI_LE_LETTER_TONE_2  L"\u1970"
+#define UNITEXT_TAI_LE_LETTER_TONE_2  U"\u1970"
 #define UNICODE_TAI_LE_LETTER_TONE_3  0x1971
-#define UNITEXT_TAI_LE_LETTER_TONE_3  L"\u1971"
+#define UNITEXT_TAI_LE_LETTER_TONE_3  U"\u1971"
 #define UNICODE_TAI_LE_LETTER_TONE_4  0x1972
-#define UNITEXT_TAI_LE_LETTER_TONE_4  L"\u1972"
+#define UNITEXT_TAI_LE_LETTER_TONE_4  U"\u1972"
 #define UNICODE_TAI_LE_LETTER_TONE_5  0x1973
-#define UNITEXT_TAI_LE_LETTER_TONE_5  L"\u1973"
+#define UNITEXT_TAI_LE_LETTER_TONE_5  U"\u1973"
 #define UNICODE_TAI_LE_LETTER_TONE_6  0x1974
-#define UNITEXT_TAI_LE_LETTER_TONE_6  L"\u1974"
+#define UNITEXT_TAI_LE_LETTER_TONE_6  U"\u1974"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_QA  0x1980
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_QA  L"\u1980"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_QA  U"\u1980"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_QA  0x1981
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_QA  L"\u1981"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_QA  U"\u1981"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_KA  0x1982
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_KA  L"\u1982"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_KA  U"\u1982"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_XA  0x1983
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_XA  L"\u1983"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_XA  U"\u1983"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_NGA  0x1984
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_NGA  L"\u1984"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_NGA  U"\u1984"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_KA  0x1985
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_KA  L"\u1985"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_KA  U"\u1985"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_XA  0x1986
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_XA  L"\u1986"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_XA  U"\u1986"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_NGA  0x1987
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_NGA  L"\u1987"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_NGA  U"\u1987"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_TSA  0x1988
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_TSA  L"\u1988"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_TSA  U"\u1988"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_SA  0x1989
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_SA  L"\u1989"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_SA  U"\u1989"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_YA  0x198a
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_YA  L"\u198a"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_YA  U"\u198a"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_TSA  0x198b
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_TSA  L"\u198b"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_TSA  U"\u198b"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_SA  0x198c
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_SA  L"\u198c"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_SA  U"\u198c"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_YA  0x198d
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_YA  L"\u198d"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_YA  U"\u198d"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_TA  0x198e
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_TA  L"\u198e"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_TA  U"\u198e"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_THA  0x198f
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_THA  L"\u198f"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_THA  U"\u198f"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_NA  0x1990
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_NA  L"\u1990"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_NA  U"\u1990"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_TA  0x1991
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_TA  L"\u1991"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_TA  U"\u1991"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_THA  0x1992
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_THA  L"\u1992"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_THA  U"\u1992"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_NA  0x1993
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_NA  L"\u1993"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_NA  U"\u1993"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_PA  0x1994
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_PA  L"\u1994"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_PA  U"\u1994"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_PHA  0x1995
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_PHA  L"\u1995"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_PHA  U"\u1995"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_MA  0x1996
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_MA  L"\u1996"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_MA  U"\u1996"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_PA  0x1997
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_PA  L"\u1997"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_PA  U"\u1997"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_PHA  0x1998
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_PHA  L"\u1998"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_PHA  U"\u1998"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_MA  0x1999
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_MA  L"\u1999"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_MA  U"\u1999"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_FA  0x199a
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_FA  L"\u199a"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_FA  U"\u199a"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_VA  0x199b
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_VA  L"\u199b"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_VA  U"\u199b"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_LA  0x199c
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_LA  L"\u199c"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_LA  U"\u199c"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_FA  0x199d
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_FA  L"\u199d"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_FA  U"\u199d"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_VA  0x199e
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_VA  L"\u199e"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_VA  U"\u199e"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_LA  0x199f
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_LA  L"\u199f"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_LA  U"\u199f"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_HA  0x19a0
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_HA  L"\u19a0"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_HA  U"\u19a0"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_DA  0x19a1
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_DA  L"\u19a1"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_DA  U"\u19a1"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_BA  0x19a2
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_BA  L"\u19a2"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_BA  U"\u19a2"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_HA  0x19a3
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_HA  L"\u19a3"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_HA  U"\u19a3"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_DA  0x19a4
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_DA  L"\u19a4"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_DA  U"\u19a4"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_BA  0x19a5
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_BA  L"\u19a5"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_BA  U"\u19a5"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_KVA  0x19a6
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_KVA  L"\u19a6"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_KVA  U"\u19a6"
 #define UNICODE_NEW_TAI_LUE_LETTER_HIGH_XVA  0x19a7
-#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_XVA  L"\u19a7"
+#define UNITEXT_NEW_TAI_LUE_LETTER_HIGH_XVA  U"\u19a7"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_KVA  0x19a8
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_KVA  L"\u19a8"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_KVA  U"\u19a8"
 #define UNICODE_NEW_TAI_LUE_LETTER_LOW_XVA  0x19a9
-#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_XVA  L"\u19a9"
+#define UNITEXT_NEW_TAI_LUE_LETTER_LOW_XVA  U"\u19a9"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_VOWEL_SHORTENER  0x19b0
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_VOWEL_SHORTENER  L"\u19b0"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_VOWEL_SHORTENER  U"\u19b0"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_AA  0x19b1
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_AA  L"\u19b1"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_AA  U"\u19b1"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_II  0x19b2
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_II  L"\u19b2"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_II  U"\u19b2"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_U  0x19b3
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_U  L"\u19b3"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_U  U"\u19b3"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_UU  0x19b4
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_UU  L"\u19b4"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_UU  U"\u19b4"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_E  0x19b5
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_E  L"\u19b5"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_E  U"\u19b5"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_AE  0x19b6
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_AE  L"\u19b6"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_AE  U"\u19b6"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_O  0x19b7
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_O  L"\u19b7"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_O  U"\u19b7"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_OA  0x19b8
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_OA  L"\u19b8"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_OA  U"\u19b8"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_UE  0x19b9
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_UE  L"\u19b9"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_UE  U"\u19b9"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_AY  0x19ba
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_AY  L"\u19ba"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_AY  U"\u19ba"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_AAY  0x19bb
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_AAY  L"\u19bb"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_AAY  U"\u19bb"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_UY  0x19bc
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_UY  L"\u19bc"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_UY  U"\u19bc"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_OY  0x19bd
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_OY  L"\u19bd"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_OY  U"\u19bd"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_OAY  0x19be
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_OAY  L"\u19be"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_OAY  U"\u19be"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_UEY  0x19bf
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_UEY  L"\u19bf"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_UEY  U"\u19bf"
 #define UNICODE_NEW_TAI_LUE_VOWEL_SIGN_IY  0x19c0
-#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_IY  L"\u19c0"
+#define UNITEXT_NEW_TAI_LUE_VOWEL_SIGN_IY  U"\u19c0"
 #define UNICODE_NEW_TAI_LUE_LETTER_FINAL_V  0x19c1
-#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_V  L"\u19c1"
+#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_V  U"\u19c1"
 #define UNICODE_NEW_TAI_LUE_LETTER_FINAL_NG  0x19c2
-#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_NG  L"\u19c2"
+#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_NG  U"\u19c2"
 #define UNICODE_NEW_TAI_LUE_LETTER_FINAL_N  0x19c3
-#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_N  L"\u19c3"
+#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_N  U"\u19c3"
 #define UNICODE_NEW_TAI_LUE_LETTER_FINAL_M  0x19c4
-#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_M  L"\u19c4"
+#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_M  U"\u19c4"
 #define UNICODE_NEW_TAI_LUE_LETTER_FINAL_K  0x19c5
-#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_K  L"\u19c5"
+#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_K  U"\u19c5"
 #define UNICODE_NEW_TAI_LUE_LETTER_FINAL_D  0x19c6
-#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_D  L"\u19c6"
+#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_D  U"\u19c6"
 #define UNICODE_NEW_TAI_LUE_LETTER_FINAL_B  0x19c7
-#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_B  L"\u19c7"
+#define UNITEXT_NEW_TAI_LUE_LETTER_FINAL_B  U"\u19c7"
 #define UNICODE_NEW_TAI_LUE_TONE_MARK_1  0x19c8
-#define UNITEXT_NEW_TAI_LUE_TONE_MARK_1  L"\u19c8"
+#define UNITEXT_NEW_TAI_LUE_TONE_MARK_1  U"\u19c8"
 #define UNICODE_NEW_TAI_LUE_TONE_MARK_2  0x19c9
-#define UNITEXT_NEW_TAI_LUE_TONE_MARK_2  L"\u19c9"
+#define UNITEXT_NEW_TAI_LUE_TONE_MARK_2  U"\u19c9"
 #define UNICODE_NEW_TAI_LUE_DIGIT_ZERO  0x19d0
-#define UNITEXT_NEW_TAI_LUE_DIGIT_ZERO  L"\u19d0"
+#define UNITEXT_NEW_TAI_LUE_DIGIT_ZERO  U"\u19d0"
 #define UNICODE_NEW_TAI_LUE_DIGIT_ONE  0x19d1
-#define UNITEXT_NEW_TAI_LUE_DIGIT_ONE  L"\u19d1"
+#define UNITEXT_NEW_TAI_LUE_DIGIT_ONE  U"\u19d1"
 #define UNICODE_NEW_TAI_LUE_DIGIT_TWO  0x19d2
-#define UNITEXT_NEW_TAI_LUE_DIGIT_TWO  L"\u19d2"
+#define UNITEXT_NEW_TAI_LUE_DIGIT_TWO  U"\u19d2"
 #define UNICODE_NEW_TAI_LUE_DIGIT_THREE  0x19d3
-#define UNITEXT_NEW_TAI_LUE_DIGIT_THREE  L"\u19d3"
+#define UNITEXT_NEW_TAI_LUE_DIGIT_THREE  U"\u19d3"
 #define UNICODE_NEW_TAI_LUE_DIGIT_FOUR  0x19d4
-#define UNITEXT_NEW_TAI_LUE_DIGIT_FOUR  L"\u19d4"
+#define UNITEXT_NEW_TAI_LUE_DIGIT_FOUR  U"\u19d4"
 #define UNICODE_NEW_TAI_LUE_DIGIT_FIVE  0x19d5
-#define UNITEXT_NEW_TAI_LUE_DIGIT_FIVE  L"\u19d5"
+#define UNITEXT_NEW_TAI_LUE_DIGIT_FIVE  U"\u19d5"
 #define UNICODE_NEW_TAI_LUE_DIGIT_SIX  0x19d6
-#define UNITEXT_NEW_TAI_LUE_DIGIT_SIX  L"\u19d6"
+#define UNITEXT_NEW_TAI_LUE_DIGIT_SIX  U"\u19d6"
 #define UNICODE_NEW_TAI_LUE_DIGIT_SEVEN  0x19d7
-#define UNITEXT_NEW_TAI_LUE_DIGIT_SEVEN  L"\u19d7"
+#define UNITEXT_NEW_TAI_LUE_DIGIT_SEVEN  U"\u19d7"
 #define UNICODE_NEW_TAI_LUE_DIGIT_EIGHT  0x19d8
-#define UNITEXT_NEW_TAI_LUE_DIGIT_EIGHT  L"\u19d8"
+#define UNITEXT_NEW_TAI_LUE_DIGIT_EIGHT  U"\u19d8"
 #define UNICODE_NEW_TAI_LUE_DIGIT_NINE  0x19d9
-#define UNITEXT_NEW_TAI_LUE_DIGIT_NINE  L"\u19d9"
+#define UNITEXT_NEW_TAI_LUE_DIGIT_NINE  U"\u19d9"
 #define UNICODE_NEW_TAI_LUE_SIGN_LAE  0x19de
-#define UNITEXT_NEW_TAI_LUE_SIGN_LAE  L"\u19de"
+#define UNITEXT_NEW_TAI_LUE_SIGN_LAE  U"\u19de"
 #define UNICODE_NEW_TAI_LUE_SIGN_LAEV  0x19df
-#define UNITEXT_NEW_TAI_LUE_SIGN_LAEV  L"\u19df"
+#define UNITEXT_NEW_TAI_LUE_SIGN_LAEV  U"\u19df"
 #define UNICODE_KHMER_SYMBOL_PATHAMASAT  0x19e0
-#define UNITEXT_KHMER_SYMBOL_PATHAMASAT  L"\u19e0"
+#define UNITEXT_KHMER_SYMBOL_PATHAMASAT  U"\u19e0"
 #define UNICODE_KHMER_SYMBOL_MUOY_KOET  0x19e1
-#define UNITEXT_KHMER_SYMBOL_MUOY_KOET  L"\u19e1"
+#define UNITEXT_KHMER_SYMBOL_MUOY_KOET  U"\u19e1"
 #define UNICODE_KHMER_SYMBOL_PII_KOET  0x19e2
-#define UNITEXT_KHMER_SYMBOL_PII_KOET  L"\u19e2"
+#define UNITEXT_KHMER_SYMBOL_PII_KOET  U"\u19e2"
 #define UNICODE_KHMER_SYMBOL_BEI_KOET  0x19e3
-#define UNITEXT_KHMER_SYMBOL_BEI_KOET  L"\u19e3"
+#define UNITEXT_KHMER_SYMBOL_BEI_KOET  U"\u19e3"
 #define UNICODE_KHMER_SYMBOL_BUON_KOET  0x19e4
-#define UNITEXT_KHMER_SYMBOL_BUON_KOET  L"\u19e4"
+#define UNITEXT_KHMER_SYMBOL_BUON_KOET  U"\u19e4"
 #define UNICODE_KHMER_SYMBOL_PRAM_KOET  0x19e5
-#define UNITEXT_KHMER_SYMBOL_PRAM_KOET  L"\u19e5"
+#define UNITEXT_KHMER_SYMBOL_PRAM_KOET  U"\u19e5"
 #define UNICODE_KHMER_SYMBOL_PRAM_MUOY_KOET  0x19e6
-#define UNITEXT_KHMER_SYMBOL_PRAM_MUOY_KOET  L"\u19e6"
+#define UNITEXT_KHMER_SYMBOL_PRAM_MUOY_KOET  U"\u19e6"
 #define UNICODE_KHMER_SYMBOL_PRAM_PII_KOET  0x19e7
-#define UNITEXT_KHMER_SYMBOL_PRAM_PII_KOET  L"\u19e7"
+#define UNITEXT_KHMER_SYMBOL_PRAM_PII_KOET  U"\u19e7"
 #define UNICODE_KHMER_SYMBOL_PRAM_BEI_KOET  0x19e8
-#define UNITEXT_KHMER_SYMBOL_PRAM_BEI_KOET  L"\u19e8"
+#define UNITEXT_KHMER_SYMBOL_PRAM_BEI_KOET  U"\u19e8"
 #define UNICODE_KHMER_SYMBOL_PRAM_BUON_KOET  0x19e9
-#define UNITEXT_KHMER_SYMBOL_PRAM_BUON_KOET  L"\u19e9"
+#define UNITEXT_KHMER_SYMBOL_PRAM_BUON_KOET  U"\u19e9"
 #define UNICODE_KHMER_SYMBOL_DAP_KOET  0x19ea
-#define UNITEXT_KHMER_SYMBOL_DAP_KOET  L"\u19ea"
+#define UNITEXT_KHMER_SYMBOL_DAP_KOET  U"\u19ea"
 #define UNICODE_KHMER_SYMBOL_DAP_MUOY_KOET  0x19eb
-#define UNITEXT_KHMER_SYMBOL_DAP_MUOY_KOET  L"\u19eb"
+#define UNITEXT_KHMER_SYMBOL_DAP_MUOY_KOET  U"\u19eb"
 #define UNICODE_KHMER_SYMBOL_DAP_PII_KOET  0x19ec
-#define UNITEXT_KHMER_SYMBOL_DAP_PII_KOET  L"\u19ec"
+#define UNITEXT_KHMER_SYMBOL_DAP_PII_KOET  U"\u19ec"
 #define UNICODE_KHMER_SYMBOL_DAP_BEI_KOET  0x19ed
-#define UNITEXT_KHMER_SYMBOL_DAP_BEI_KOET  L"\u19ed"
+#define UNITEXT_KHMER_SYMBOL_DAP_BEI_KOET  U"\u19ed"
 #define UNICODE_KHMER_SYMBOL_DAP_BUON_KOET  0x19ee
-#define UNITEXT_KHMER_SYMBOL_DAP_BUON_KOET  L"\u19ee"
+#define UNITEXT_KHMER_SYMBOL_DAP_BUON_KOET  U"\u19ee"
 #define UNICODE_KHMER_SYMBOL_DAP_PRAM_KOET  0x19ef
-#define UNITEXT_KHMER_SYMBOL_DAP_PRAM_KOET  L"\u19ef"
+#define UNITEXT_KHMER_SYMBOL_DAP_PRAM_KOET  U"\u19ef"
 #define UNICODE_KHMER_SYMBOL_TUTEYASAT  0x19f0
-#define UNITEXT_KHMER_SYMBOL_TUTEYASAT  L"\u19f0"
+#define UNITEXT_KHMER_SYMBOL_TUTEYASAT  U"\u19f0"
 #define UNICODE_KHMER_SYMBOL_MUOY_ROC  0x19f1
-#define UNITEXT_KHMER_SYMBOL_MUOY_ROC  L"\u19f1"
+#define UNITEXT_KHMER_SYMBOL_MUOY_ROC  U"\u19f1"
 #define UNICODE_KHMER_SYMBOL_PII_ROC  0x19f2
-#define UNITEXT_KHMER_SYMBOL_PII_ROC  L"\u19f2"
+#define UNITEXT_KHMER_SYMBOL_PII_ROC  U"\u19f2"
 #define UNICODE_KHMER_SYMBOL_BEI_ROC  0x19f3
-#define UNITEXT_KHMER_SYMBOL_BEI_ROC  L"\u19f3"
+#define UNITEXT_KHMER_SYMBOL_BEI_ROC  U"\u19f3"
 #define UNICODE_KHMER_SYMBOL_BUON_ROC  0x19f4
-#define UNITEXT_KHMER_SYMBOL_BUON_ROC  L"\u19f4"
+#define UNITEXT_KHMER_SYMBOL_BUON_ROC  U"\u19f4"
 #define UNICODE_KHMER_SYMBOL_PRAM_ROC  0x19f5
-#define UNITEXT_KHMER_SYMBOL_PRAM_ROC  L"\u19f5"
+#define UNITEXT_KHMER_SYMBOL_PRAM_ROC  U"\u19f5"
 #define UNICODE_KHMER_SYMBOL_PRAM_MUOY_ROC  0x19f6
-#define UNITEXT_KHMER_SYMBOL_PRAM_MUOY_ROC  L"\u19f6"
+#define UNITEXT_KHMER_SYMBOL_PRAM_MUOY_ROC  U"\u19f6"
 #define UNICODE_KHMER_SYMBOL_PRAM_PII_ROC  0x19f7
-#define UNITEXT_KHMER_SYMBOL_PRAM_PII_ROC  L"\u19f7"
+#define UNITEXT_KHMER_SYMBOL_PRAM_PII_ROC  U"\u19f7"
 #define UNICODE_KHMER_SYMBOL_PRAM_BEI_ROC  0x19f8
-#define UNITEXT_KHMER_SYMBOL_PRAM_BEI_ROC  L"\u19f8"
+#define UNITEXT_KHMER_SYMBOL_PRAM_BEI_ROC  U"\u19f8"
 #define UNICODE_KHMER_SYMBOL_PRAM_BUON_ROC  0x19f9
-#define UNITEXT_KHMER_SYMBOL_PRAM_BUON_ROC  L"\u19f9"
+#define UNITEXT_KHMER_SYMBOL_PRAM_BUON_ROC  U"\u19f9"
 #define UNICODE_KHMER_SYMBOL_DAP_ROC  0x19fa
-#define UNITEXT_KHMER_SYMBOL_DAP_ROC  L"\u19fa"
+#define UNITEXT_KHMER_SYMBOL_DAP_ROC  U"\u19fa"
 #define UNICODE_KHMER_SYMBOL_DAP_MUOY_ROC  0x19fb
-#define UNITEXT_KHMER_SYMBOL_DAP_MUOY_ROC  L"\u19fb"
+#define UNITEXT_KHMER_SYMBOL_DAP_MUOY_ROC  U"\u19fb"
 #define UNICODE_KHMER_SYMBOL_DAP_PII_ROC  0x19fc
-#define UNITEXT_KHMER_SYMBOL_DAP_PII_ROC  L"\u19fc"
+#define UNITEXT_KHMER_SYMBOL_DAP_PII_ROC  U"\u19fc"
 #define UNICODE_KHMER_SYMBOL_DAP_BEI_ROC  0x19fd
-#define UNITEXT_KHMER_SYMBOL_DAP_BEI_ROC  L"\u19fd"
+#define UNITEXT_KHMER_SYMBOL_DAP_BEI_ROC  U"\u19fd"
 #define UNICODE_KHMER_SYMBOL_DAP_BUON_ROC  0x19fe
-#define UNITEXT_KHMER_SYMBOL_DAP_BUON_ROC  L"\u19fe"
+#define UNITEXT_KHMER_SYMBOL_DAP_BUON_ROC  U"\u19fe"
 #define UNICODE_KHMER_SYMBOL_DAP_PRAM_ROC  0x19ff
-#define UNITEXT_KHMER_SYMBOL_DAP_PRAM_ROC  L"\u19ff"
+#define UNITEXT_KHMER_SYMBOL_DAP_PRAM_ROC  U"\u19ff"
 #define UNICODE_BUGINESE_LETTER_KA  0x1a00
-#define UNITEXT_BUGINESE_LETTER_KA  L"\u1a00"
+#define UNITEXT_BUGINESE_LETTER_KA  U"\u1a00"
 #define UNICODE_BUGINESE_LETTER_GA  0x1a01
-#define UNITEXT_BUGINESE_LETTER_GA  L"\u1a01"
+#define UNITEXT_BUGINESE_LETTER_GA  U"\u1a01"
 #define UNICODE_BUGINESE_LETTER_NGA  0x1a02
-#define UNITEXT_BUGINESE_LETTER_NGA  L"\u1a02"
+#define UNITEXT_BUGINESE_LETTER_NGA  U"\u1a02"
 #define UNICODE_BUGINESE_LETTER_NGKA  0x1a03
-#define UNITEXT_BUGINESE_LETTER_NGKA  L"\u1a03"
+#define UNITEXT_BUGINESE_LETTER_NGKA  U"\u1a03"
 #define UNICODE_BUGINESE_LETTER_PA  0x1a04
-#define UNITEXT_BUGINESE_LETTER_PA  L"\u1a04"
+#define UNITEXT_BUGINESE_LETTER_PA  U"\u1a04"
 #define UNICODE_BUGINESE_LETTER_BA  0x1a05
-#define UNITEXT_BUGINESE_LETTER_BA  L"\u1a05"
+#define UNITEXT_BUGINESE_LETTER_BA  U"\u1a05"
 #define UNICODE_BUGINESE_LETTER_MA  0x1a06
-#define UNITEXT_BUGINESE_LETTER_MA  L"\u1a06"
+#define UNITEXT_BUGINESE_LETTER_MA  U"\u1a06"
 #define UNICODE_BUGINESE_LETTER_MPA  0x1a07
-#define UNITEXT_BUGINESE_LETTER_MPA  L"\u1a07"
+#define UNITEXT_BUGINESE_LETTER_MPA  U"\u1a07"
 #define UNICODE_BUGINESE_LETTER_TA  0x1a08
-#define UNITEXT_BUGINESE_LETTER_TA  L"\u1a08"
+#define UNITEXT_BUGINESE_LETTER_TA  U"\u1a08"
 #define UNICODE_BUGINESE_LETTER_DA  0x1a09
-#define UNITEXT_BUGINESE_LETTER_DA  L"\u1a09"
+#define UNITEXT_BUGINESE_LETTER_DA  U"\u1a09"
 #define UNICODE_BUGINESE_LETTER_NA  0x1a0a
-#define UNITEXT_BUGINESE_LETTER_NA  L"\u1a0a"
+#define UNITEXT_BUGINESE_LETTER_NA  U"\u1a0a"
 #define UNICODE_BUGINESE_LETTER_NRA  0x1a0b
-#define UNITEXT_BUGINESE_LETTER_NRA  L"\u1a0b"
+#define UNITEXT_BUGINESE_LETTER_NRA  U"\u1a0b"
 #define UNICODE_BUGINESE_LETTER_CA  0x1a0c
-#define UNITEXT_BUGINESE_LETTER_CA  L"\u1a0c"
+#define UNITEXT_BUGINESE_LETTER_CA  U"\u1a0c"
 #define UNICODE_BUGINESE_LETTER_JA  0x1a0d
-#define UNITEXT_BUGINESE_LETTER_JA  L"\u1a0d"
+#define UNITEXT_BUGINESE_LETTER_JA  U"\u1a0d"
 #define UNICODE_BUGINESE_LETTER_NYA  0x1a0e
-#define UNITEXT_BUGINESE_LETTER_NYA  L"\u1a0e"
+#define UNITEXT_BUGINESE_LETTER_NYA  U"\u1a0e"
 #define UNICODE_BUGINESE_LETTER_NYCA  0x1a0f
-#define UNITEXT_BUGINESE_LETTER_NYCA  L"\u1a0f"
+#define UNITEXT_BUGINESE_LETTER_NYCA  U"\u1a0f"
 #define UNICODE_BUGINESE_LETTER_YA  0x1a10
-#define UNITEXT_BUGINESE_LETTER_YA  L"\u1a10"
+#define UNITEXT_BUGINESE_LETTER_YA  U"\u1a10"
 #define UNICODE_BUGINESE_LETTER_RA  0x1a11
-#define UNITEXT_BUGINESE_LETTER_RA  L"\u1a11"
+#define UNITEXT_BUGINESE_LETTER_RA  U"\u1a11"
 #define UNICODE_BUGINESE_LETTER_LA  0x1a12
-#define UNITEXT_BUGINESE_LETTER_LA  L"\u1a12"
+#define UNITEXT_BUGINESE_LETTER_LA  U"\u1a12"
 #define UNICODE_BUGINESE_LETTER_VA  0x1a13
-#define UNITEXT_BUGINESE_LETTER_VA  L"\u1a13"
+#define UNITEXT_BUGINESE_LETTER_VA  U"\u1a13"
 #define UNICODE_BUGINESE_LETTER_SA  0x1a14
-#define UNITEXT_BUGINESE_LETTER_SA  L"\u1a14"
+#define UNITEXT_BUGINESE_LETTER_SA  U"\u1a14"
 #define UNICODE_BUGINESE_LETTER_A  0x1a15
-#define UNITEXT_BUGINESE_LETTER_A  L"\u1a15"
+#define UNITEXT_BUGINESE_LETTER_A  U"\u1a15"
 #define UNICODE_BUGINESE_LETTER_HA  0x1a16
-#define UNITEXT_BUGINESE_LETTER_HA  L"\u1a16"
+#define UNITEXT_BUGINESE_LETTER_HA  U"\u1a16"
 #define UNICODE_BUGINESE_VOWEL_SIGN_I  0x1a17
-#define UNITEXT_BUGINESE_VOWEL_SIGN_I  L"\u1a17"
+#define UNITEXT_BUGINESE_VOWEL_SIGN_I  U"\u1a17"
 #define UNICODE_BUGINESE_VOWEL_SIGN_U  0x1a18
-#define UNITEXT_BUGINESE_VOWEL_SIGN_U  L"\u1a18"
+#define UNITEXT_BUGINESE_VOWEL_SIGN_U  U"\u1a18"
 #define UNICODE_BUGINESE_VOWEL_SIGN_E  0x1a19
-#define UNITEXT_BUGINESE_VOWEL_SIGN_E  L"\u1a19"
+#define UNITEXT_BUGINESE_VOWEL_SIGN_E  U"\u1a19"
 #define UNICODE_BUGINESE_VOWEL_SIGN_O  0x1a1a
-#define UNITEXT_BUGINESE_VOWEL_SIGN_O  L"\u1a1a"
+#define UNITEXT_BUGINESE_VOWEL_SIGN_O  U"\u1a1a"
 #define UNICODE_BUGINESE_VOWEL_SIGN_AE  0x1a1b
-#define UNITEXT_BUGINESE_VOWEL_SIGN_AE  L"\u1a1b"
+#define UNITEXT_BUGINESE_VOWEL_SIGN_AE  U"\u1a1b"
 #define UNICODE_BUGINESE_PALLAWA  0x1a1e
-#define UNITEXT_BUGINESE_PALLAWA  L"\u1a1e"
+#define UNITEXT_BUGINESE_PALLAWA  U"\u1a1e"
 #define UNICODE_BUGINESE_END_OF_SECTION  0x1a1f
-#define UNITEXT_BUGINESE_END_OF_SECTION  L"\u1a1f"
+#define UNITEXT_BUGINESE_END_OF_SECTION  U"\u1a1f"
 #define UNICODE_BALINESE_SIGN_ULU_RICEM  0x1b00
-#define UNITEXT_BALINESE_SIGN_ULU_RICEM  L"\u1b00"
+#define UNITEXT_BALINESE_SIGN_ULU_RICEM  U"\u1b00"
 #define UNICODE_BALINESE_SIGN_ULU_CANDRA  0x1b01
-#define UNITEXT_BALINESE_SIGN_ULU_CANDRA  L"\u1b01"
+#define UNITEXT_BALINESE_SIGN_ULU_CANDRA  U"\u1b01"
 #define UNICODE_BALINESE_SIGN_CECEK  0x1b02
-#define UNITEXT_BALINESE_SIGN_CECEK  L"\u1b02"
+#define UNITEXT_BALINESE_SIGN_CECEK  U"\u1b02"
 #define UNICODE_BALINESE_SIGN_SURANG  0x1b03
-#define UNITEXT_BALINESE_SIGN_SURANG  L"\u1b03"
+#define UNITEXT_BALINESE_SIGN_SURANG  U"\u1b03"
 #define UNICODE_BALINESE_SIGN_BISAH  0x1b04
-#define UNITEXT_BALINESE_SIGN_BISAH  L"\u1b04"
+#define UNITEXT_BALINESE_SIGN_BISAH  U"\u1b04"
 #define UNICODE_BALINESE_LETTER_AKARA  0x1b05
-#define UNITEXT_BALINESE_LETTER_AKARA  L"\u1b05"
+#define UNITEXT_BALINESE_LETTER_AKARA  U"\u1b05"
 #define UNICODE_BALINESE_LETTER_AKARA_TEDUNG  0x1b06
-#define UNITEXT_BALINESE_LETTER_AKARA_TEDUNG  L"\u1b06"
+#define UNITEXT_BALINESE_LETTER_AKARA_TEDUNG  U"\u1b06"
 #define UNICODE_BALINESE_LETTER_IKARA  0x1b07
-#define UNITEXT_BALINESE_LETTER_IKARA  L"\u1b07"
+#define UNITEXT_BALINESE_LETTER_IKARA  U"\u1b07"
 #define UNICODE_BALINESE_LETTER_IKARA_TEDUNG  0x1b08
-#define UNITEXT_BALINESE_LETTER_IKARA_TEDUNG  L"\u1b08"
+#define UNITEXT_BALINESE_LETTER_IKARA_TEDUNG  U"\u1b08"
 #define UNICODE_BALINESE_LETTER_UKARA  0x1b09
-#define UNITEXT_BALINESE_LETTER_UKARA  L"\u1b09"
+#define UNITEXT_BALINESE_LETTER_UKARA  U"\u1b09"
 #define UNICODE_BALINESE_LETTER_UKARA_TEDUNG  0x1b0a
-#define UNITEXT_BALINESE_LETTER_UKARA_TEDUNG  L"\u1b0a"
+#define UNITEXT_BALINESE_LETTER_UKARA_TEDUNG  U"\u1b0a"
 #define UNICODE_BALINESE_LETTER_RA_REPA  0x1b0b
-#define UNITEXT_BALINESE_LETTER_RA_REPA  L"\u1b0b"
+#define UNITEXT_BALINESE_LETTER_RA_REPA  U"\u1b0b"
 #define UNICODE_BALINESE_LETTER_RA_REPA_TEDUNG  0x1b0c
-#define UNITEXT_BALINESE_LETTER_RA_REPA_TEDUNG  L"\u1b0c"
+#define UNITEXT_BALINESE_LETTER_RA_REPA_TEDUNG  U"\u1b0c"
 #define UNICODE_BALINESE_LETTER_LA_LENGA  0x1b0d
-#define UNITEXT_BALINESE_LETTER_LA_LENGA  L"\u1b0d"
+#define UNITEXT_BALINESE_LETTER_LA_LENGA  U"\u1b0d"
 #define UNICODE_BALINESE_LETTER_LA_LENGA_TEDUNG  0x1b0e
-#define UNITEXT_BALINESE_LETTER_LA_LENGA_TEDUNG  L"\u1b0e"
+#define UNITEXT_BALINESE_LETTER_LA_LENGA_TEDUNG  U"\u1b0e"
 #define UNICODE_BALINESE_LETTER_EKARA  0x1b0f
-#define UNITEXT_BALINESE_LETTER_EKARA  L"\u1b0f"
+#define UNITEXT_BALINESE_LETTER_EKARA  U"\u1b0f"
 #define UNICODE_BALINESE_LETTER_AIKARA  0x1b10
-#define UNITEXT_BALINESE_LETTER_AIKARA  L"\u1b10"
+#define UNITEXT_BALINESE_LETTER_AIKARA  U"\u1b10"
 #define UNICODE_BALINESE_LETTER_OKARA  0x1b11
-#define UNITEXT_BALINESE_LETTER_OKARA  L"\u1b11"
+#define UNITEXT_BALINESE_LETTER_OKARA  U"\u1b11"
 #define UNICODE_BALINESE_LETTER_OKARA_TEDUNG  0x1b12
-#define UNITEXT_BALINESE_LETTER_OKARA_TEDUNG  L"\u1b12"
+#define UNITEXT_BALINESE_LETTER_OKARA_TEDUNG  U"\u1b12"
 #define UNICODE_BALINESE_LETTER_KA  0x1b13
-#define UNITEXT_BALINESE_LETTER_KA  L"\u1b13"
+#define UNITEXT_BALINESE_LETTER_KA  U"\u1b13"
 #define UNICODE_BALINESE_LETTER_KA_MAHAPRANA  0x1b14
-#define UNITEXT_BALINESE_LETTER_KA_MAHAPRANA  L"\u1b14"
+#define UNITEXT_BALINESE_LETTER_KA_MAHAPRANA  U"\u1b14"
 #define UNICODE_BALINESE_LETTER_GA  0x1b15
-#define UNITEXT_BALINESE_LETTER_GA  L"\u1b15"
+#define UNITEXT_BALINESE_LETTER_GA  U"\u1b15"
 #define UNICODE_BALINESE_LETTER_GA_GORA  0x1b16
-#define UNITEXT_BALINESE_LETTER_GA_GORA  L"\u1b16"
+#define UNITEXT_BALINESE_LETTER_GA_GORA  U"\u1b16"
 #define UNICODE_BALINESE_LETTER_NGA  0x1b17
-#define UNITEXT_BALINESE_LETTER_NGA  L"\u1b17"
+#define UNITEXT_BALINESE_LETTER_NGA  U"\u1b17"
 #define UNICODE_BALINESE_LETTER_CA  0x1b18
-#define UNITEXT_BALINESE_LETTER_CA  L"\u1b18"
+#define UNITEXT_BALINESE_LETTER_CA  U"\u1b18"
 #define UNICODE_BALINESE_LETTER_CA_LACA  0x1b19
-#define UNITEXT_BALINESE_LETTER_CA_LACA  L"\u1b19"
+#define UNITEXT_BALINESE_LETTER_CA_LACA  U"\u1b19"
 #define UNICODE_BALINESE_LETTER_JA  0x1b1a
-#define UNITEXT_BALINESE_LETTER_JA  L"\u1b1a"
+#define UNITEXT_BALINESE_LETTER_JA  U"\u1b1a"
 #define UNICODE_BALINESE_LETTER_JA_JERA  0x1b1b
-#define UNITEXT_BALINESE_LETTER_JA_JERA  L"\u1b1b"
+#define UNITEXT_BALINESE_LETTER_JA_JERA  U"\u1b1b"
 #define UNICODE_BALINESE_LETTER_NYA  0x1b1c
-#define UNITEXT_BALINESE_LETTER_NYA  L"\u1b1c"
+#define UNITEXT_BALINESE_LETTER_NYA  U"\u1b1c"
 #define UNICODE_BALINESE_LETTER_TA_LATIK  0x1b1d
-#define UNITEXT_BALINESE_LETTER_TA_LATIK  L"\u1b1d"
+#define UNITEXT_BALINESE_LETTER_TA_LATIK  U"\u1b1d"
 #define UNICODE_BALINESE_LETTER_TA_MURDA_MAHAPRANA  0x1b1e
-#define UNITEXT_BALINESE_LETTER_TA_MURDA_MAHAPRANA  L"\u1b1e"
+#define UNITEXT_BALINESE_LETTER_TA_MURDA_MAHAPRANA  U"\u1b1e"
 #define UNICODE_BALINESE_LETTER_DA_MURDA_ALPAPRANA  0x1b1f
-#define UNITEXT_BALINESE_LETTER_DA_MURDA_ALPAPRANA  L"\u1b1f"
+#define UNITEXT_BALINESE_LETTER_DA_MURDA_ALPAPRANA  U"\u1b1f"
 #define UNICODE_BALINESE_LETTER_DA_MURDA_MAHAPRANA  0x1b20
-#define UNITEXT_BALINESE_LETTER_DA_MURDA_MAHAPRANA  L"\u1b20"
+#define UNITEXT_BALINESE_LETTER_DA_MURDA_MAHAPRANA  U"\u1b20"
 #define UNICODE_BALINESE_LETTER_NA_RAMBAT  0x1b21
-#define UNITEXT_BALINESE_LETTER_NA_RAMBAT  L"\u1b21"
+#define UNITEXT_BALINESE_LETTER_NA_RAMBAT  U"\u1b21"
 #define UNICODE_BALINESE_LETTER_TA  0x1b22
-#define UNITEXT_BALINESE_LETTER_TA  L"\u1b22"
+#define UNITEXT_BALINESE_LETTER_TA  U"\u1b22"
 #define UNICODE_BALINESE_LETTER_TA_TAWA  0x1b23
-#define UNITEXT_BALINESE_LETTER_TA_TAWA  L"\u1b23"
+#define UNITEXT_BALINESE_LETTER_TA_TAWA  U"\u1b23"
 #define UNICODE_BALINESE_LETTER_DA  0x1b24
-#define UNITEXT_BALINESE_LETTER_DA  L"\u1b24"
+#define UNITEXT_BALINESE_LETTER_DA  U"\u1b24"
 #define UNICODE_BALINESE_LETTER_DA_MADU  0x1b25
-#define UNITEXT_BALINESE_LETTER_DA_MADU  L"\u1b25"
+#define UNITEXT_BALINESE_LETTER_DA_MADU  U"\u1b25"
 #define UNICODE_BALINESE_LETTER_NA  0x1b26
-#define UNITEXT_BALINESE_LETTER_NA  L"\u1b26"
+#define UNITEXT_BALINESE_LETTER_NA  U"\u1b26"
 #define UNICODE_BALINESE_LETTER_PA  0x1b27
-#define UNITEXT_BALINESE_LETTER_PA  L"\u1b27"
+#define UNITEXT_BALINESE_LETTER_PA  U"\u1b27"
 #define UNICODE_BALINESE_LETTER_PA_KAPAL  0x1b28
-#define UNITEXT_BALINESE_LETTER_PA_KAPAL  L"\u1b28"
+#define UNITEXT_BALINESE_LETTER_PA_KAPAL  U"\u1b28"
 #define UNICODE_BALINESE_LETTER_BA  0x1b29
-#define UNITEXT_BALINESE_LETTER_BA  L"\u1b29"
+#define UNITEXT_BALINESE_LETTER_BA  U"\u1b29"
 #define UNICODE_BALINESE_LETTER_BA_KEMBANG  0x1b2a
-#define UNITEXT_BALINESE_LETTER_BA_KEMBANG  L"\u1b2a"
+#define UNITEXT_BALINESE_LETTER_BA_KEMBANG  U"\u1b2a"
 #define UNICODE_BALINESE_LETTER_MA  0x1b2b
-#define UNITEXT_BALINESE_LETTER_MA  L"\u1b2b"
+#define UNITEXT_BALINESE_LETTER_MA  U"\u1b2b"
 #define UNICODE_BALINESE_LETTER_YA  0x1b2c
-#define UNITEXT_BALINESE_LETTER_YA  L"\u1b2c"
+#define UNITEXT_BALINESE_LETTER_YA  U"\u1b2c"
 #define UNICODE_BALINESE_LETTER_RA  0x1b2d
-#define UNITEXT_BALINESE_LETTER_RA  L"\u1b2d"
+#define UNITEXT_BALINESE_LETTER_RA  U"\u1b2d"
 #define UNICODE_BALINESE_LETTER_LA  0x1b2e
-#define UNITEXT_BALINESE_LETTER_LA  L"\u1b2e"
+#define UNITEXT_BALINESE_LETTER_LA  U"\u1b2e"
 #define UNICODE_BALINESE_LETTER_WA  0x1b2f
-#define UNITEXT_BALINESE_LETTER_WA  L"\u1b2f"
+#define UNITEXT_BALINESE_LETTER_WA  U"\u1b2f"
 #define UNICODE_BALINESE_LETTER_SA_SAGA  0x1b30
-#define UNITEXT_BALINESE_LETTER_SA_SAGA  L"\u1b30"
+#define UNITEXT_BALINESE_LETTER_SA_SAGA  U"\u1b30"
 #define UNICODE_BALINESE_LETTER_SA_SAPA  0x1b31
-#define UNITEXT_BALINESE_LETTER_SA_SAPA  L"\u1b31"
+#define UNITEXT_BALINESE_LETTER_SA_SAPA  U"\u1b31"
 #define UNICODE_BALINESE_LETTER_SA  0x1b32
-#define UNITEXT_BALINESE_LETTER_SA  L"\u1b32"
+#define UNITEXT_BALINESE_LETTER_SA  U"\u1b32"
 #define UNICODE_BALINESE_LETTER_HA  0x1b33
-#define UNITEXT_BALINESE_LETTER_HA  L"\u1b33"
+#define UNITEXT_BALINESE_LETTER_HA  U"\u1b33"
 #define UNICODE_BALINESE_SIGN_REREKAN  0x1b34
-#define UNITEXT_BALINESE_SIGN_REREKAN  L"\u1b34"
+#define UNITEXT_BALINESE_SIGN_REREKAN  U"\u1b34"
 #define UNICODE_BALINESE_VOWEL_SIGN_TEDUNG  0x1b35
-#define UNITEXT_BALINESE_VOWEL_SIGN_TEDUNG  L"\u1b35"
+#define UNITEXT_BALINESE_VOWEL_SIGN_TEDUNG  U"\u1b35"
 #define UNICODE_BALINESE_VOWEL_SIGN_ULU  0x1b36
-#define UNITEXT_BALINESE_VOWEL_SIGN_ULU  L"\u1b36"
+#define UNITEXT_BALINESE_VOWEL_SIGN_ULU  U"\u1b36"
 #define UNICODE_BALINESE_VOWEL_SIGN_ULU_SARI  0x1b37
-#define UNITEXT_BALINESE_VOWEL_SIGN_ULU_SARI  L"\u1b37"
+#define UNITEXT_BALINESE_VOWEL_SIGN_ULU_SARI  U"\u1b37"
 #define UNICODE_BALINESE_VOWEL_SIGN_SUKU  0x1b38
-#define UNITEXT_BALINESE_VOWEL_SIGN_SUKU  L"\u1b38"
+#define UNITEXT_BALINESE_VOWEL_SIGN_SUKU  U"\u1b38"
 #define UNICODE_BALINESE_VOWEL_SIGN_SUKU_ILUT  0x1b39
-#define UNITEXT_BALINESE_VOWEL_SIGN_SUKU_ILUT  L"\u1b39"
+#define UNITEXT_BALINESE_VOWEL_SIGN_SUKU_ILUT  U"\u1b39"
 #define UNICODE_BALINESE_VOWEL_SIGN_RA_REPA  0x1b3a
-#define UNITEXT_BALINESE_VOWEL_SIGN_RA_REPA  L"\u1b3a"
+#define UNITEXT_BALINESE_VOWEL_SIGN_RA_REPA  U"\u1b3a"
 #define UNICODE_BALINESE_VOWEL_SIGN_RA_REPA_TEDUNG  0x1b3b
-#define UNITEXT_BALINESE_VOWEL_SIGN_RA_REPA_TEDUNG  L"\u1b3b"
+#define UNITEXT_BALINESE_VOWEL_SIGN_RA_REPA_TEDUNG  U"\u1b3b"
 #define UNICODE_BALINESE_VOWEL_SIGN_LA_LENGA  0x1b3c
-#define UNITEXT_BALINESE_VOWEL_SIGN_LA_LENGA  L"\u1b3c"
+#define UNITEXT_BALINESE_VOWEL_SIGN_LA_LENGA  U"\u1b3c"
 #define UNICODE_BALINESE_VOWEL_SIGN_LA_LENGA_TEDUNG  0x1b3d
-#define UNITEXT_BALINESE_VOWEL_SIGN_LA_LENGA_TEDUNG  L"\u1b3d"
+#define UNITEXT_BALINESE_VOWEL_SIGN_LA_LENGA_TEDUNG  U"\u1b3d"
 #define UNICODE_BALINESE_VOWEL_SIGN_TALING  0x1b3e
-#define UNITEXT_BALINESE_VOWEL_SIGN_TALING  L"\u1b3e"
+#define UNITEXT_BALINESE_VOWEL_SIGN_TALING  U"\u1b3e"
 #define UNICODE_BALINESE_VOWEL_SIGN_TALING_REPA  0x1b3f
-#define UNITEXT_BALINESE_VOWEL_SIGN_TALING_REPA  L"\u1b3f"
+#define UNITEXT_BALINESE_VOWEL_SIGN_TALING_REPA  U"\u1b3f"
 #define UNICODE_BALINESE_VOWEL_SIGN_TALING_TEDUNG  0x1b40
-#define UNITEXT_BALINESE_VOWEL_SIGN_TALING_TEDUNG  L"\u1b40"
+#define UNITEXT_BALINESE_VOWEL_SIGN_TALING_TEDUNG  U"\u1b40"
 #define UNICODE_BALINESE_VOWEL_SIGN_TALING_REPA_TEDUNG  0x1b41
-#define UNITEXT_BALINESE_VOWEL_SIGN_TALING_REPA_TEDUNG  L"\u1b41"
+#define UNITEXT_BALINESE_VOWEL_SIGN_TALING_REPA_TEDUNG  U"\u1b41"
 #define UNICODE_BALINESE_VOWEL_SIGN_PEPET  0x1b42
-#define UNITEXT_BALINESE_VOWEL_SIGN_PEPET  L"\u1b42"
+#define UNITEXT_BALINESE_VOWEL_SIGN_PEPET  U"\u1b42"
 #define UNICODE_BALINESE_VOWEL_SIGN_PEPET_TEDUNG  0x1b43
-#define UNITEXT_BALINESE_VOWEL_SIGN_PEPET_TEDUNG  L"\u1b43"
+#define UNITEXT_BALINESE_VOWEL_SIGN_PEPET_TEDUNG  U"\u1b43"
 #define UNICODE_BALINESE_ADEG_ADEG  0x1b44
-#define UNITEXT_BALINESE_ADEG_ADEG  L"\u1b44"
+#define UNITEXT_BALINESE_ADEG_ADEG  U"\u1b44"
 #define UNICODE_BALINESE_LETTER_KAF_SASAK  0x1b45
-#define UNITEXT_BALINESE_LETTER_KAF_SASAK  L"\u1b45"
+#define UNITEXT_BALINESE_LETTER_KAF_SASAK  U"\u1b45"
 #define UNICODE_BALINESE_LETTER_KHOT_SASAK  0x1b46
-#define UNITEXT_BALINESE_LETTER_KHOT_SASAK  L"\u1b46"
+#define UNITEXT_BALINESE_LETTER_KHOT_SASAK  U"\u1b46"
 #define UNICODE_BALINESE_LETTER_TZIR_SASAK  0x1b47
-#define UNITEXT_BALINESE_LETTER_TZIR_SASAK  L"\u1b47"
+#define UNITEXT_BALINESE_LETTER_TZIR_SASAK  U"\u1b47"
 #define UNICODE_BALINESE_LETTER_EF_SASAK  0x1b48
-#define UNITEXT_BALINESE_LETTER_EF_SASAK  L"\u1b48"
+#define UNITEXT_BALINESE_LETTER_EF_SASAK  U"\u1b48"
 #define UNICODE_BALINESE_LETTER_VE_SASAK  0x1b49
-#define UNITEXT_BALINESE_LETTER_VE_SASAK  L"\u1b49"
+#define UNITEXT_BALINESE_LETTER_VE_SASAK  U"\u1b49"
 #define UNICODE_BALINESE_LETTER_ZAL_SASAK  0x1b4a
-#define UNITEXT_BALINESE_LETTER_ZAL_SASAK  L"\u1b4a"
+#define UNITEXT_BALINESE_LETTER_ZAL_SASAK  U"\u1b4a"
 #define UNICODE_BALINESE_LETTER_ASYURA_SASAK  0x1b4b
-#define UNITEXT_BALINESE_LETTER_ASYURA_SASAK  L"\u1b4b"
+#define UNITEXT_BALINESE_LETTER_ASYURA_SASAK  U"\u1b4b"
 #define UNICODE_BALINESE_DIGIT_ZERO  0x1b50
-#define UNITEXT_BALINESE_DIGIT_ZERO  L"\u1b50"
+#define UNITEXT_BALINESE_DIGIT_ZERO  U"\u1b50"
 #define UNICODE_BALINESE_DIGIT_ONE  0x1b51
-#define UNITEXT_BALINESE_DIGIT_ONE  L"\u1b51"
+#define UNITEXT_BALINESE_DIGIT_ONE  U"\u1b51"
 #define UNICODE_BALINESE_DIGIT_TWO  0x1b52
-#define UNITEXT_BALINESE_DIGIT_TWO  L"\u1b52"
+#define UNITEXT_BALINESE_DIGIT_TWO  U"\u1b52"
 #define UNICODE_BALINESE_DIGIT_THREE  0x1b53
-#define UNITEXT_BALINESE_DIGIT_THREE  L"\u1b53"
+#define UNITEXT_BALINESE_DIGIT_THREE  U"\u1b53"
 #define UNICODE_BALINESE_DIGIT_FOUR  0x1b54
-#define UNITEXT_BALINESE_DIGIT_FOUR  L"\u1b54"
+#define UNITEXT_BALINESE_DIGIT_FOUR  U"\u1b54"
 #define UNICODE_BALINESE_DIGIT_FIVE  0x1b55
-#define UNITEXT_BALINESE_DIGIT_FIVE  L"\u1b55"
+#define UNITEXT_BALINESE_DIGIT_FIVE  U"\u1b55"
 #define UNICODE_BALINESE_DIGIT_SIX  0x1b56
-#define UNITEXT_BALINESE_DIGIT_SIX  L"\u1b56"
+#define UNITEXT_BALINESE_DIGIT_SIX  U"\u1b56"
 #define UNICODE_BALINESE_DIGIT_SEVEN  0x1b57
-#define UNITEXT_BALINESE_DIGIT_SEVEN  L"\u1b57"
+#define UNITEXT_BALINESE_DIGIT_SEVEN  U"\u1b57"
 #define UNICODE_BALINESE_DIGIT_EIGHT  0x1b58
-#define UNITEXT_BALINESE_DIGIT_EIGHT  L"\u1b58"
+#define UNITEXT_BALINESE_DIGIT_EIGHT  U"\u1b58"
 #define UNICODE_BALINESE_DIGIT_NINE  0x1b59
-#define UNITEXT_BALINESE_DIGIT_NINE  L"\u1b59"
+#define UNITEXT_BALINESE_DIGIT_NINE  U"\u1b59"
 #define UNICODE_BALINESE_PANTI  0x1b5a
-#define UNITEXT_BALINESE_PANTI  L"\u1b5a"
+#define UNITEXT_BALINESE_PANTI  U"\u1b5a"
 #define UNICODE_BALINESE_PAMADA  0x1b5b
-#define UNITEXT_BALINESE_PAMADA  L"\u1b5b"
+#define UNITEXT_BALINESE_PAMADA  U"\u1b5b"
 #define UNICODE_BALINESE_WINDU  0x1b5c
-#define UNITEXT_BALINESE_WINDU  L"\u1b5c"
+#define UNITEXT_BALINESE_WINDU  U"\u1b5c"
 #define UNICODE_BALINESE_CARIK_PAMUNGKAH  0x1b5d
-#define UNITEXT_BALINESE_CARIK_PAMUNGKAH  L"\u1b5d"
+#define UNITEXT_BALINESE_CARIK_PAMUNGKAH  U"\u1b5d"
 #define UNICODE_BALINESE_CARIK_SIKI  0x1b5e
-#define UNITEXT_BALINESE_CARIK_SIKI  L"\u1b5e"
+#define UNITEXT_BALINESE_CARIK_SIKI  U"\u1b5e"
 #define UNICODE_BALINESE_CARIK_PAREREN  0x1b5f
-#define UNITEXT_BALINESE_CARIK_PAREREN  L"\u1b5f"
+#define UNITEXT_BALINESE_CARIK_PAREREN  U"\u1b5f"
 #define UNICODE_BALINESE_PAMENENG  0x1b60
-#define UNITEXT_BALINESE_PAMENENG  L"\u1b60"
+#define UNITEXT_BALINESE_PAMENENG  U"\u1b60"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_DONG  0x1b61
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DONG  L"\u1b61"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DONG  U"\u1b61"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_DENG  0x1b62
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DENG  L"\u1b62"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DENG  U"\u1b62"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_DUNG  0x1b63
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DUNG  L"\u1b63"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DUNG  U"\u1b63"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_DANG  0x1b64
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DANG  L"\u1b64"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DANG  U"\u1b64"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_DANG_SURANG  0x1b65
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DANG_SURANG  L"\u1b65"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DANG_SURANG  U"\u1b65"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_DING  0x1b66
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DING  L"\u1b66"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DING  U"\u1b66"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_DAENG  0x1b67
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DAENG  L"\u1b67"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DAENG  U"\u1b67"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_DEUNG  0x1b68
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DEUNG  L"\u1b68"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DEUNG  U"\u1b68"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_DAING  0x1b69
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DAING  L"\u1b69"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DAING  U"\u1b69"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_DANG_GEDE  0x1b6a
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DANG_GEDE  L"\u1b6a"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_DANG_GEDE  U"\u1b6a"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_COMBINING_TEGEH  0x1b6b
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_TEGEH  L"\u1b6b"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_TEGEH  U"\u1b6b"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_COMBINING_ENDEP  0x1b6c
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_ENDEP  L"\u1b6c"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_ENDEP  U"\u1b6c"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPUL  0x1b6d
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPUL  L"\u1b6d"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPUL  U"\u1b6d"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPLI  0x1b6e
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPLI  L"\u1b6e"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPLI  U"\u1b6e"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_COMBINING_JEGOGAN  0x1b6f
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_JEGOGAN  L"\u1b6f"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_JEGOGAN  U"\u1b6f"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPUL_WITH_JEGOGAN  0x1b70
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPUL_WITH_JEGOGAN  L"\u1b70"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPUL_WITH_JEGOGAN  U"\u1b70"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPLI_WITH_JEGOGAN  0x1b71
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPLI_WITH_JEGOGAN  L"\u1b71"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_KEMPLI_WITH_JEGOGAN  U"\u1b71"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_COMBINING_BENDE  0x1b72
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_BENDE  L"\u1b72"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_BENDE  U"\u1b72"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_COMBINING_GONG  0x1b73
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_GONG  L"\u1b73"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_COMBINING_GONG  U"\u1b73"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_OPEN_DUG  0x1b74
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_OPEN_DUG  L"\u1b74"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_OPEN_DUG  U"\u1b74"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_OPEN_DAG  0x1b75
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_OPEN_DAG  L"\u1b75"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_OPEN_DAG  U"\u1b75"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_CLOSED_TUK  0x1b76
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_CLOSED_TUK  L"\u1b76"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_CLOSED_TUK  U"\u1b76"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_CLOSED_TAK  0x1b77
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_CLOSED_TAK  L"\u1b77"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_RIGHT_HAND_CLOSED_TAK  U"\u1b77"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_OPEN_PANG  0x1b78
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_OPEN_PANG  L"\u1b78"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_OPEN_PANG  U"\u1b78"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_OPEN_PUNG  0x1b79
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_OPEN_PUNG  L"\u1b79"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_OPEN_PUNG  U"\u1b79"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_CLOSED_PLAK  0x1b7a
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_CLOSED_PLAK  L"\u1b7a"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_CLOSED_PLAK  U"\u1b7a"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_CLOSED_PLUK  0x1b7b
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_CLOSED_PLUK  L"\u1b7b"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_CLOSED_PLUK  U"\u1b7b"
 #define UNICODE_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_OPEN_PING  0x1b7c
-#define UNITEXT_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_OPEN_PING  L"\u1b7c"
+#define UNITEXT_BALINESE_MUSICAL_SYMBOL_LEFT_HAND_OPEN_PING  U"\u1b7c"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_A  0x1d00
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_A  L"\u1d00"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_A  U"\u1d00"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_AE  0x1d01
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_AE  L"\u1d01"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_AE  U"\u1d01"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_AE  0x1d02
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_AE  L"\u1d02"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_AE  U"\u1d02"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_BARRED_B  0x1d03
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_BARRED_B  L"\u1d03"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_BARRED_B  U"\u1d03"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_C  0x1d04
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_C  L"\u1d04"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_C  U"\u1d04"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_D  0x1d05
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_D  L"\u1d05"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_D  U"\u1d05"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_ETH  0x1d06
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_ETH  L"\u1d06"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_ETH  U"\u1d06"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_E  0x1d07
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_E  L"\u1d07"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_E  U"\u1d07"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_OPEN_E  0x1d08
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_OPEN_E  L"\u1d08"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_OPEN_E  U"\u1d08"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_I  0x1d09
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_I  L"\u1d09"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_I  U"\u1d09"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_J  0x1d0a
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_J  L"\u1d0a"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_J  U"\u1d0a"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_K  0x1d0b
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_K  L"\u1d0b"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_K  U"\u1d0b"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_L_WITH_STROKE  0x1d0c
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_L_WITH_STROKE  L"\u1d0c"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_L_WITH_STROKE  U"\u1d0c"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_M  0x1d0d
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_M  L"\u1d0d"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_M  U"\u1d0d"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_REVERSED_N  0x1d0e
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_REVERSED_N  L"\u1d0e"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_REVERSED_N  U"\u1d0e"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_O  0x1d0f
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_O  L"\u1d0f"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_O  U"\u1d0f"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_OPEN_O  0x1d10
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_OPEN_O  L"\u1d10"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_OPEN_O  U"\u1d10"
 #define UNICODE_LATIN_SMALL_LETTER_SIDEWAYS_O  0x1d11
-#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_O  L"\u1d11"
+#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_O  U"\u1d11"
 #define UNICODE_LATIN_SMALL_LETTER_SIDEWAYS_OPEN_O  0x1d12
-#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_OPEN_O  L"\u1d12"
+#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_OPEN_O  U"\u1d12"
 #define UNICODE_LATIN_SMALL_LETTER_SIDEWAYS_O_WITH_STROKE  0x1d13
-#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_O_WITH_STROKE  L"\u1d13"
+#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_O_WITH_STROKE  U"\u1d13"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_OE  0x1d14
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_OE  L"\u1d14"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_OE  U"\u1d14"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_OU  0x1d15
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_OU  L"\u1d15"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_OU  U"\u1d15"
 #define UNICODE_LATIN_SMALL_LETTER_TOP_HALF_O  0x1d16
-#define UNITEXT_LATIN_SMALL_LETTER_TOP_HALF_O  L"\u1d16"
+#define UNITEXT_LATIN_SMALL_LETTER_TOP_HALF_O  U"\u1d16"
 #define UNICODE_LATIN_SMALL_LETTER_BOTTOM_HALF_O  0x1d17
-#define UNITEXT_LATIN_SMALL_LETTER_BOTTOM_HALF_O  L"\u1d17"
+#define UNITEXT_LATIN_SMALL_LETTER_BOTTOM_HALF_O  U"\u1d17"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_P  0x1d18
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_P  L"\u1d18"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_P  U"\u1d18"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_REVERSED_R  0x1d19
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_REVERSED_R  L"\u1d19"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_REVERSED_R  U"\u1d19"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_TURNED_R  0x1d1a
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_TURNED_R  L"\u1d1a"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_TURNED_R  U"\u1d1a"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_T  0x1d1b
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_T  L"\u1d1b"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_T  U"\u1d1b"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_U  0x1d1c
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_U  L"\u1d1c"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_U  U"\u1d1c"
 #define UNICODE_LATIN_SMALL_LETTER_SIDEWAYS_U  0x1d1d
-#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_U  L"\u1d1d"
+#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_U  U"\u1d1d"
 #define UNICODE_LATIN_SMALL_LETTER_SIDEWAYS_DIAERESIZED_U  0x1d1e
-#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_DIAERESIZED_U  L"\u1d1e"
+#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_DIAERESIZED_U  U"\u1d1e"
 #define UNICODE_LATIN_SMALL_LETTER_SIDEWAYS_TURNED_M  0x1d1f
-#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_TURNED_M  L"\u1d1f"
+#define UNITEXT_LATIN_SMALL_LETTER_SIDEWAYS_TURNED_M  U"\u1d1f"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_V  0x1d20
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_V  L"\u1d20"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_V  U"\u1d20"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_W  0x1d21
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_W  L"\u1d21"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_W  U"\u1d21"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_Z  0x1d22
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_Z  L"\u1d22"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_Z  U"\u1d22"
 #define UNICODE_LATIN_LETTER_SMALL_CAPITAL_EZH  0x1d23
-#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_EZH  L"\u1d23"
+#define UNITEXT_LATIN_LETTER_SMALL_CAPITAL_EZH  U"\u1d23"
 #define UNICODE_LATIN_LETTER_VOICED_LARYNGEAL_SPIRANT  0x1d24
-#define UNITEXT_LATIN_LETTER_VOICED_LARYNGEAL_SPIRANT  L"\u1d24"
+#define UNITEXT_LATIN_LETTER_VOICED_LARYNGEAL_SPIRANT  U"\u1d24"
 #define UNICODE_LATIN_LETTER_AIN  0x1d25
-#define UNITEXT_LATIN_LETTER_AIN  L"\u1d25"
+#define UNITEXT_LATIN_LETTER_AIN  U"\u1d25"
 #define UNICODE_GREEK_LETTER_SMALL_CAPITAL_GAMMA  0x1d26
-#define UNITEXT_GREEK_LETTER_SMALL_CAPITAL_GAMMA  L"\u1d26"
+#define UNITEXT_GREEK_LETTER_SMALL_CAPITAL_GAMMA  U"\u1d26"
 #define UNICODE_GREEK_LETTER_SMALL_CAPITAL_LAMDA  0x1d27
-#define UNITEXT_GREEK_LETTER_SMALL_CAPITAL_LAMDA  L"\u1d27"
+#define UNITEXT_GREEK_LETTER_SMALL_CAPITAL_LAMDA  U"\u1d27"
 #define UNICODE_GREEK_LETTER_SMALL_CAPITAL_PI  0x1d28
-#define UNITEXT_GREEK_LETTER_SMALL_CAPITAL_PI  L"\u1d28"
+#define UNITEXT_GREEK_LETTER_SMALL_CAPITAL_PI  U"\u1d28"
 #define UNICODE_GREEK_LETTER_SMALL_CAPITAL_RHO  0x1d29
-#define UNITEXT_GREEK_LETTER_SMALL_CAPITAL_RHO  L"\u1d29"
+#define UNITEXT_GREEK_LETTER_SMALL_CAPITAL_RHO  U"\u1d29"
 #define UNICODE_GREEK_LETTER_SMALL_CAPITAL_PSI  0x1d2a
-#define UNITEXT_GREEK_LETTER_SMALL_CAPITAL_PSI  L"\u1d2a"
+#define UNITEXT_GREEK_LETTER_SMALL_CAPITAL_PSI  U"\u1d2a"
 #define UNICODE_CYRILLIC_LETTER_SMALL_CAPITAL_EL  0x1d2b
-#define UNITEXT_CYRILLIC_LETTER_SMALL_CAPITAL_EL  L"\u1d2b"
+#define UNITEXT_CYRILLIC_LETTER_SMALL_CAPITAL_EL  U"\u1d2b"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_A  0x1d2c
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_A  L"\u1d2c"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_A  U"\u1d2c"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_AE  0x1d2d
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_AE  L"\u1d2d"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_AE  U"\u1d2d"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_B  0x1d2e
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_B  L"\u1d2e"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_B  U"\u1d2e"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_BARRED_B  0x1d2f
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_BARRED_B  L"\u1d2f"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_BARRED_B  U"\u1d2f"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_D  0x1d30
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_D  L"\u1d30"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_D  U"\u1d30"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_E  0x1d31
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_E  L"\u1d31"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_E  U"\u1d31"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_REVERSED_E  0x1d32
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_REVERSED_E  L"\u1d32"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_REVERSED_E  U"\u1d32"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_G  0x1d33
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_G  L"\u1d33"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_G  U"\u1d33"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_H  0x1d34
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_H  L"\u1d34"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_H  U"\u1d34"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_I  0x1d35
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_I  L"\u1d35"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_I  U"\u1d35"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_J  0x1d36
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_J  L"\u1d36"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_J  U"\u1d36"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_K  0x1d37
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_K  L"\u1d37"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_K  U"\u1d37"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_L  0x1d38
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_L  L"\u1d38"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_L  U"\u1d38"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_M  0x1d39
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_M  L"\u1d39"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_M  U"\u1d39"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_N  0x1d3a
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_N  L"\u1d3a"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_N  U"\u1d3a"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_REVERSED_N  0x1d3b
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_REVERSED_N  L"\u1d3b"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_REVERSED_N  U"\u1d3b"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_O  0x1d3c
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_O  L"\u1d3c"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_O  U"\u1d3c"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_OU  0x1d3d
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_OU  L"\u1d3d"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_OU  U"\u1d3d"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_P  0x1d3e
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_P  L"\u1d3e"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_P  U"\u1d3e"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_R  0x1d3f
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_R  L"\u1d3f"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_R  U"\u1d3f"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_T  0x1d40
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_T  L"\u1d40"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_T  U"\u1d40"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_U  0x1d41
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_U  L"\u1d41"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_U  U"\u1d41"
 #define UNICODE_MODIFIER_LETTER_CAPITAL_W  0x1d42
-#define UNITEXT_MODIFIER_LETTER_CAPITAL_W  L"\u1d42"
+#define UNITEXT_MODIFIER_LETTER_CAPITAL_W  U"\u1d42"
 #define UNICODE_MODIFIER_LETTER_SMALL_A  0x1d43
-#define UNITEXT_MODIFIER_LETTER_SMALL_A  L"\u1d43"
+#define UNITEXT_MODIFIER_LETTER_SMALL_A  U"\u1d43"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_A  0x1d44
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_A  L"\u1d44"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_A  U"\u1d44"
 #define UNICODE_MODIFIER_LETTER_SMALL_ALPHA  0x1d45
-#define UNITEXT_MODIFIER_LETTER_SMALL_ALPHA  L"\u1d45"
+#define UNITEXT_MODIFIER_LETTER_SMALL_ALPHA  U"\u1d45"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_AE  0x1d46
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_AE  L"\u1d46"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_AE  U"\u1d46"
 #define UNICODE_MODIFIER_LETTER_SMALL_B  0x1d47
-#define UNITEXT_MODIFIER_LETTER_SMALL_B  L"\u1d47"
+#define UNITEXT_MODIFIER_LETTER_SMALL_B  U"\u1d47"
 #define UNICODE_MODIFIER_LETTER_SMALL_D  0x1d48
-#define UNITEXT_MODIFIER_LETTER_SMALL_D  L"\u1d48"
+#define UNITEXT_MODIFIER_LETTER_SMALL_D  U"\u1d48"
 #define UNICODE_MODIFIER_LETTER_SMALL_E  0x1d49
-#define UNITEXT_MODIFIER_LETTER_SMALL_E  L"\u1d49"
+#define UNITEXT_MODIFIER_LETTER_SMALL_E  U"\u1d49"
 #define UNICODE_MODIFIER_LETTER_SMALL_SCHWA  0x1d4a
-#define UNITEXT_MODIFIER_LETTER_SMALL_SCHWA  L"\u1d4a"
+#define UNITEXT_MODIFIER_LETTER_SMALL_SCHWA  U"\u1d4a"
 #define UNICODE_MODIFIER_LETTER_SMALL_OPEN_E  0x1d4b
-#define UNITEXT_MODIFIER_LETTER_SMALL_OPEN_E  L"\u1d4b"
+#define UNITEXT_MODIFIER_LETTER_SMALL_OPEN_E  U"\u1d4b"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_OPEN_E  0x1d4c
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_OPEN_E  L"\u1d4c"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_OPEN_E  U"\u1d4c"
 #define UNICODE_MODIFIER_LETTER_SMALL_G  0x1d4d
-#define UNITEXT_MODIFIER_LETTER_SMALL_G  L"\u1d4d"
+#define UNITEXT_MODIFIER_LETTER_SMALL_G  U"\u1d4d"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_I  0x1d4e
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_I  L"\u1d4e"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_I  U"\u1d4e"
 #define UNICODE_MODIFIER_LETTER_SMALL_K  0x1d4f
-#define UNITEXT_MODIFIER_LETTER_SMALL_K  L"\u1d4f"
+#define UNITEXT_MODIFIER_LETTER_SMALL_K  U"\u1d4f"
 #define UNICODE_MODIFIER_LETTER_SMALL_M  0x1d50
-#define UNITEXT_MODIFIER_LETTER_SMALL_M  L"\u1d50"
+#define UNITEXT_MODIFIER_LETTER_SMALL_M  U"\u1d50"
 #define UNICODE_MODIFIER_LETTER_SMALL_ENG  0x1d51
-#define UNITEXT_MODIFIER_LETTER_SMALL_ENG  L"\u1d51"
+#define UNITEXT_MODIFIER_LETTER_SMALL_ENG  U"\u1d51"
 #define UNICODE_MODIFIER_LETTER_SMALL_O  0x1d52
-#define UNITEXT_MODIFIER_LETTER_SMALL_O  L"\u1d52"
+#define UNITEXT_MODIFIER_LETTER_SMALL_O  U"\u1d52"
 #define UNICODE_MODIFIER_LETTER_SMALL_OPEN_O  0x1d53
-#define UNITEXT_MODIFIER_LETTER_SMALL_OPEN_O  L"\u1d53"
+#define UNITEXT_MODIFIER_LETTER_SMALL_OPEN_O  U"\u1d53"
 #define UNICODE_MODIFIER_LETTER_SMALL_TOP_HALF_O  0x1d54
-#define UNITEXT_MODIFIER_LETTER_SMALL_TOP_HALF_O  L"\u1d54"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TOP_HALF_O  U"\u1d54"
 #define UNICODE_MODIFIER_LETTER_SMALL_BOTTOM_HALF_O  0x1d55
-#define UNITEXT_MODIFIER_LETTER_SMALL_BOTTOM_HALF_O  L"\u1d55"
+#define UNITEXT_MODIFIER_LETTER_SMALL_BOTTOM_HALF_O  U"\u1d55"
 #define UNICODE_MODIFIER_LETTER_SMALL_P  0x1d56
-#define UNITEXT_MODIFIER_LETTER_SMALL_P  L"\u1d56"
+#define UNITEXT_MODIFIER_LETTER_SMALL_P  U"\u1d56"
 #define UNICODE_MODIFIER_LETTER_SMALL_T  0x1d57
-#define UNITEXT_MODIFIER_LETTER_SMALL_T  L"\u1d57"
+#define UNITEXT_MODIFIER_LETTER_SMALL_T  U"\u1d57"
 #define UNICODE_MODIFIER_LETTER_SMALL_U  0x1d58
-#define UNITEXT_MODIFIER_LETTER_SMALL_U  L"\u1d58"
+#define UNITEXT_MODIFIER_LETTER_SMALL_U  U"\u1d58"
 #define UNICODE_MODIFIER_LETTER_SMALL_SIDEWAYS_U  0x1d59
-#define UNITEXT_MODIFIER_LETTER_SMALL_SIDEWAYS_U  L"\u1d59"
+#define UNITEXT_MODIFIER_LETTER_SMALL_SIDEWAYS_U  U"\u1d59"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_M  0x1d5a
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_M  L"\u1d5a"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_M  U"\u1d5a"
 #define UNICODE_MODIFIER_LETTER_SMALL_V  0x1d5b
-#define UNITEXT_MODIFIER_LETTER_SMALL_V  L"\u1d5b"
+#define UNITEXT_MODIFIER_LETTER_SMALL_V  U"\u1d5b"
 #define UNICODE_MODIFIER_LETTER_SMALL_AIN  0x1d5c
-#define UNITEXT_MODIFIER_LETTER_SMALL_AIN  L"\u1d5c"
+#define UNITEXT_MODIFIER_LETTER_SMALL_AIN  U"\u1d5c"
 #define UNICODE_MODIFIER_LETTER_SMALL_BETA  0x1d5d
-#define UNITEXT_MODIFIER_LETTER_SMALL_BETA  L"\u1d5d"
+#define UNITEXT_MODIFIER_LETTER_SMALL_BETA  U"\u1d5d"
 #define UNICODE_MODIFIER_LETTER_SMALL_GREEK_GAMMA  0x1d5e
-#define UNITEXT_MODIFIER_LETTER_SMALL_GREEK_GAMMA  L"\u1d5e"
+#define UNITEXT_MODIFIER_LETTER_SMALL_GREEK_GAMMA  U"\u1d5e"
 #define UNICODE_MODIFIER_LETTER_SMALL_DELTA  0x1d5f
-#define UNITEXT_MODIFIER_LETTER_SMALL_DELTA  L"\u1d5f"
+#define UNITEXT_MODIFIER_LETTER_SMALL_DELTA  U"\u1d5f"
 #define UNICODE_MODIFIER_LETTER_SMALL_GREEK_PHI  0x1d60
-#define UNITEXT_MODIFIER_LETTER_SMALL_GREEK_PHI  L"\u1d60"
+#define UNITEXT_MODIFIER_LETTER_SMALL_GREEK_PHI  U"\u1d60"
 #define UNICODE_MODIFIER_LETTER_SMALL_CHI  0x1d61
-#define UNITEXT_MODIFIER_LETTER_SMALL_CHI  L"\u1d61"
+#define UNITEXT_MODIFIER_LETTER_SMALL_CHI  U"\u1d61"
 #define UNICODE_LATIN_SUBSCRIPT_SMALL_LETTER_I  0x1d62
-#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_I  L"\u1d62"
+#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_I  U"\u1d62"
 #define UNICODE_LATIN_SUBSCRIPT_SMALL_LETTER_R  0x1d63
-#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_R  L"\u1d63"
+#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_R  U"\u1d63"
 #define UNICODE_LATIN_SUBSCRIPT_SMALL_LETTER_U  0x1d64
-#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_U  L"\u1d64"
+#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_U  U"\u1d64"
 #define UNICODE_LATIN_SUBSCRIPT_SMALL_LETTER_V  0x1d65
-#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_V  L"\u1d65"
+#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_V  U"\u1d65"
 #define UNICODE_GREEK_SUBSCRIPT_SMALL_LETTER_BETA  0x1d66
-#define UNITEXT_GREEK_SUBSCRIPT_SMALL_LETTER_BETA  L"\u1d66"
+#define UNITEXT_GREEK_SUBSCRIPT_SMALL_LETTER_BETA  U"\u1d66"
 #define UNICODE_GREEK_SUBSCRIPT_SMALL_LETTER_GAMMA  0x1d67
-#define UNITEXT_GREEK_SUBSCRIPT_SMALL_LETTER_GAMMA  L"\u1d67"
+#define UNITEXT_GREEK_SUBSCRIPT_SMALL_LETTER_GAMMA  U"\u1d67"
 #define UNICODE_GREEK_SUBSCRIPT_SMALL_LETTER_RHO  0x1d68
-#define UNITEXT_GREEK_SUBSCRIPT_SMALL_LETTER_RHO  L"\u1d68"
+#define UNITEXT_GREEK_SUBSCRIPT_SMALL_LETTER_RHO  U"\u1d68"
 #define UNICODE_GREEK_SUBSCRIPT_SMALL_LETTER_PHI  0x1d69
-#define UNITEXT_GREEK_SUBSCRIPT_SMALL_LETTER_PHI  L"\u1d69"
+#define UNITEXT_GREEK_SUBSCRIPT_SMALL_LETTER_PHI  U"\u1d69"
 #define UNICODE_GREEK_SUBSCRIPT_SMALL_LETTER_CHI  0x1d6a
-#define UNITEXT_GREEK_SUBSCRIPT_SMALL_LETTER_CHI  L"\u1d6a"
+#define UNITEXT_GREEK_SUBSCRIPT_SMALL_LETTER_CHI  U"\u1d6a"
 #define UNICODE_LATIN_SMALL_LETTER_UE  0x1d6b
-#define UNITEXT_LATIN_SMALL_LETTER_UE  L"\u1d6b"
+#define UNITEXT_LATIN_SMALL_LETTER_UE  U"\u1d6b"
 #define UNICODE_LATIN_SMALL_LETTER_B_WITH_MIDDLE_TILDE  0x1d6c
-#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_MIDDLE_TILDE  L"\u1d6c"
+#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_MIDDLE_TILDE  U"\u1d6c"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_MIDDLE_TILDE  0x1d6d
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_MIDDLE_TILDE  L"\u1d6d"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_MIDDLE_TILDE  U"\u1d6d"
 #define UNICODE_LATIN_SMALL_LETTER_F_WITH_MIDDLE_TILDE  0x1d6e
-#define UNITEXT_LATIN_SMALL_LETTER_F_WITH_MIDDLE_TILDE  L"\u1d6e"
+#define UNITEXT_LATIN_SMALL_LETTER_F_WITH_MIDDLE_TILDE  U"\u1d6e"
 #define UNICODE_LATIN_SMALL_LETTER_M_WITH_MIDDLE_TILDE  0x1d6f
-#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_MIDDLE_TILDE  L"\u1d6f"
+#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_MIDDLE_TILDE  U"\u1d6f"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_MIDDLE_TILDE  0x1d70
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_MIDDLE_TILDE  L"\u1d70"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_MIDDLE_TILDE  U"\u1d70"
 #define UNICODE_LATIN_SMALL_LETTER_P_WITH_MIDDLE_TILDE  0x1d71
-#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_MIDDLE_TILDE  L"\u1d71"
+#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_MIDDLE_TILDE  U"\u1d71"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_MIDDLE_TILDE  0x1d72
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_MIDDLE_TILDE  L"\u1d72"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_MIDDLE_TILDE  U"\u1d72"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_FISHHOOK_AND_MIDDLE_TILDE  0x1d73
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_FISHHOOK_AND_MIDDLE_TILDE  L"\u1d73"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_FISHHOOK_AND_MIDDLE_TILDE  U"\u1d73"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_MIDDLE_TILDE  0x1d74
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_MIDDLE_TILDE  L"\u1d74"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_MIDDLE_TILDE  U"\u1d74"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_MIDDLE_TILDE  0x1d75
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_MIDDLE_TILDE  L"\u1d75"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_MIDDLE_TILDE  U"\u1d75"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_MIDDLE_TILDE  0x1d76
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_MIDDLE_TILDE  L"\u1d76"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_MIDDLE_TILDE  U"\u1d76"
 #define UNICODE_LATIN_SMALL_LETTER_TURNED_G  0x1d77
-#define UNITEXT_LATIN_SMALL_LETTER_TURNED_G  L"\u1d77"
+#define UNITEXT_LATIN_SMALL_LETTER_TURNED_G  U"\u1d77"
 #define UNICODE_MODIFIER_LETTER_CYRILLIC_EN  0x1d78
-#define UNITEXT_MODIFIER_LETTER_CYRILLIC_EN  L"\u1d78"
+#define UNITEXT_MODIFIER_LETTER_CYRILLIC_EN  U"\u1d78"
 #define UNICODE_LATIN_SMALL_LETTER_INSULAR_G  0x1d79
-#define UNITEXT_LATIN_SMALL_LETTER_INSULAR_G  L"\u1d79"
+#define UNITEXT_LATIN_SMALL_LETTER_INSULAR_G  U"\u1d79"
 #define UNICODE_LATIN_SMALL_LETTER_TH_WITH_STRIKETHROUGH  0x1d7a
-#define UNITEXT_LATIN_SMALL_LETTER_TH_WITH_STRIKETHROUGH  L"\u1d7a"
+#define UNITEXT_LATIN_SMALL_LETTER_TH_WITH_STRIKETHROUGH  U"\u1d7a"
 #define UNICODE_LATIN_SMALL_CAPITAL_LETTER_I_WITH_STROKE  0x1d7b
-#define UNITEXT_LATIN_SMALL_CAPITAL_LETTER_I_WITH_STROKE  L"\u1d7b"
+#define UNITEXT_LATIN_SMALL_CAPITAL_LETTER_I_WITH_STROKE  U"\u1d7b"
 #define UNICODE_LATIN_SMALL_LETTER_IOTA_WITH_STROKE  0x1d7c
-#define UNITEXT_LATIN_SMALL_LETTER_IOTA_WITH_STROKE  L"\u1d7c"
+#define UNITEXT_LATIN_SMALL_LETTER_IOTA_WITH_STROKE  U"\u1d7c"
 #define UNICODE_LATIN_SMALL_LETTER_P_WITH_STROKE  0x1d7d
-#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_STROKE  L"\u1d7d"
+#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_STROKE  U"\u1d7d"
 #define UNICODE_LATIN_SMALL_CAPITAL_LETTER_U_WITH_STROKE  0x1d7e
-#define UNITEXT_LATIN_SMALL_CAPITAL_LETTER_U_WITH_STROKE  L"\u1d7e"
+#define UNITEXT_LATIN_SMALL_CAPITAL_LETTER_U_WITH_STROKE  U"\u1d7e"
 #define UNICODE_LATIN_SMALL_LETTER_UPSILON_WITH_STROKE  0x1d7f
-#define UNITEXT_LATIN_SMALL_LETTER_UPSILON_WITH_STROKE  L"\u1d7f"
+#define UNITEXT_LATIN_SMALL_LETTER_UPSILON_WITH_STROKE  U"\u1d7f"
 #define UNICODE_LATIN_SMALL_LETTER_B_WITH_PALATAL_HOOK  0x1d80
-#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_PALATAL_HOOK  L"\u1d80"
+#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_PALATAL_HOOK  U"\u1d80"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_PALATAL_HOOK  0x1d81
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_PALATAL_HOOK  L"\u1d81"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_PALATAL_HOOK  U"\u1d81"
 #define UNICODE_LATIN_SMALL_LETTER_F_WITH_PALATAL_HOOK  0x1d82
-#define UNITEXT_LATIN_SMALL_LETTER_F_WITH_PALATAL_HOOK  L"\u1d82"
+#define UNITEXT_LATIN_SMALL_LETTER_F_WITH_PALATAL_HOOK  U"\u1d82"
 #define UNICODE_LATIN_SMALL_LETTER_G_WITH_PALATAL_HOOK  0x1d83
-#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_PALATAL_HOOK  L"\u1d83"
+#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_PALATAL_HOOK  U"\u1d83"
 #define UNICODE_LATIN_SMALL_LETTER_K_WITH_PALATAL_HOOK  0x1d84
-#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_PALATAL_HOOK  L"\u1d84"
+#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_PALATAL_HOOK  U"\u1d84"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_PALATAL_HOOK  0x1d85
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_PALATAL_HOOK  L"\u1d85"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_PALATAL_HOOK  U"\u1d85"
 #define UNICODE_LATIN_SMALL_LETTER_M_WITH_PALATAL_HOOK  0x1d86
-#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_PALATAL_HOOK  L"\u1d86"
+#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_PALATAL_HOOK  U"\u1d86"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_PALATAL_HOOK  0x1d87
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_PALATAL_HOOK  L"\u1d87"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_PALATAL_HOOK  U"\u1d87"
 #define UNICODE_LATIN_SMALL_LETTER_P_WITH_PALATAL_HOOK  0x1d88
-#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_PALATAL_HOOK  L"\u1d88"
+#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_PALATAL_HOOK  U"\u1d88"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_PALATAL_HOOK  0x1d89
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_PALATAL_HOOK  L"\u1d89"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_PALATAL_HOOK  U"\u1d89"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_PALATAL_HOOK  0x1d8a
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_PALATAL_HOOK  L"\u1d8a"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_PALATAL_HOOK  U"\u1d8a"
 #define UNICODE_LATIN_SMALL_LETTER_ESH_WITH_PALATAL_HOOK  0x1d8b
-#define UNITEXT_LATIN_SMALL_LETTER_ESH_WITH_PALATAL_HOOK  L"\u1d8b"
+#define UNITEXT_LATIN_SMALL_LETTER_ESH_WITH_PALATAL_HOOK  U"\u1d8b"
 #define UNICODE_LATIN_SMALL_LETTER_V_WITH_PALATAL_HOOK  0x1d8c
-#define UNITEXT_LATIN_SMALL_LETTER_V_WITH_PALATAL_HOOK  L"\u1d8c"
+#define UNITEXT_LATIN_SMALL_LETTER_V_WITH_PALATAL_HOOK  U"\u1d8c"
 #define UNICODE_LATIN_SMALL_LETTER_X_WITH_PALATAL_HOOK  0x1d8d
-#define UNITEXT_LATIN_SMALL_LETTER_X_WITH_PALATAL_HOOK  L"\u1d8d"
+#define UNITEXT_LATIN_SMALL_LETTER_X_WITH_PALATAL_HOOK  U"\u1d8d"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_PALATAL_HOOK  0x1d8e
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_PALATAL_HOOK  L"\u1d8e"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_PALATAL_HOOK  U"\u1d8e"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_RETROFLEX_HOOK  0x1d8f
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_RETROFLEX_HOOK  L"\u1d8f"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_RETROFLEX_HOOK  U"\u1d8f"
 #define UNICODE_LATIN_SMALL_LETTER_ALPHA_WITH_RETROFLEX_HOOK  0x1d90
-#define UNITEXT_LATIN_SMALL_LETTER_ALPHA_WITH_RETROFLEX_HOOK  L"\u1d90"
+#define UNITEXT_LATIN_SMALL_LETTER_ALPHA_WITH_RETROFLEX_HOOK  U"\u1d90"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_HOOK_AND_TAIL  0x1d91
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_HOOK_AND_TAIL  L"\u1d91"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_HOOK_AND_TAIL  U"\u1d91"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_RETROFLEX_HOOK  0x1d92
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_RETROFLEX_HOOK  L"\u1d92"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_RETROFLEX_HOOK  U"\u1d92"
 #define UNICODE_LATIN_SMALL_LETTER_OPEN_E_WITH_RETROFLEX_HOOK  0x1d93
-#define UNITEXT_LATIN_SMALL_LETTER_OPEN_E_WITH_RETROFLEX_HOOK  L"\u1d93"
+#define UNITEXT_LATIN_SMALL_LETTER_OPEN_E_WITH_RETROFLEX_HOOK  U"\u1d93"
 #define UNICODE_LATIN_SMALL_LETTER_REVERSED_OPEN_E_WITH_RETROFLEX_HOOK  0x1d94
-#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_OPEN_E_WITH_RETROFLEX_HOOK  L"\u1d94"
+#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_OPEN_E_WITH_RETROFLEX_HOOK  U"\u1d94"
 #define UNICODE_LATIN_SMALL_LETTER_SCHWA_WITH_RETROFLEX_HOOK  0x1d95
-#define UNITEXT_LATIN_SMALL_LETTER_SCHWA_WITH_RETROFLEX_HOOK  L"\u1d95"
+#define UNITEXT_LATIN_SMALL_LETTER_SCHWA_WITH_RETROFLEX_HOOK  U"\u1d95"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_RETROFLEX_HOOK  0x1d96
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_RETROFLEX_HOOK  L"\u1d96"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_RETROFLEX_HOOK  U"\u1d96"
 #define UNICODE_LATIN_SMALL_LETTER_OPEN_O_WITH_RETROFLEX_HOOK  0x1d97
-#define UNITEXT_LATIN_SMALL_LETTER_OPEN_O_WITH_RETROFLEX_HOOK  L"\u1d97"
+#define UNITEXT_LATIN_SMALL_LETTER_OPEN_O_WITH_RETROFLEX_HOOK  U"\u1d97"
 #define UNICODE_LATIN_SMALL_LETTER_ESH_WITH_RETROFLEX_HOOK  0x1d98
-#define UNITEXT_LATIN_SMALL_LETTER_ESH_WITH_RETROFLEX_HOOK  L"\u1d98"
+#define UNITEXT_LATIN_SMALL_LETTER_ESH_WITH_RETROFLEX_HOOK  U"\u1d98"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_RETROFLEX_HOOK  0x1d99
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_RETROFLEX_HOOK  L"\u1d99"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_RETROFLEX_HOOK  U"\u1d99"
 #define UNICODE_LATIN_SMALL_LETTER_EZH_WITH_RETROFLEX_HOOK  0x1d9a
-#define UNITEXT_LATIN_SMALL_LETTER_EZH_WITH_RETROFLEX_HOOK  L"\u1d9a"
+#define UNITEXT_LATIN_SMALL_LETTER_EZH_WITH_RETROFLEX_HOOK  U"\u1d9a"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_ALPHA  0x1d9b
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_ALPHA  L"\u1d9b"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_ALPHA  U"\u1d9b"
 #define UNICODE_MODIFIER_LETTER_SMALL_C  0x1d9c
-#define UNITEXT_MODIFIER_LETTER_SMALL_C  L"\u1d9c"
+#define UNITEXT_MODIFIER_LETTER_SMALL_C  U"\u1d9c"
 #define UNICODE_MODIFIER_LETTER_SMALL_C_WITH_CURL  0x1d9d
-#define UNITEXT_MODIFIER_LETTER_SMALL_C_WITH_CURL  L"\u1d9d"
+#define UNITEXT_MODIFIER_LETTER_SMALL_C_WITH_CURL  U"\u1d9d"
 #define UNICODE_MODIFIER_LETTER_SMALL_ETH  0x1d9e
-#define UNITEXT_MODIFIER_LETTER_SMALL_ETH  L"\u1d9e"
+#define UNITEXT_MODIFIER_LETTER_SMALL_ETH  U"\u1d9e"
 #define UNICODE_MODIFIER_LETTER_SMALL_REVERSED_OPEN_E  0x1d9f
-#define UNITEXT_MODIFIER_LETTER_SMALL_REVERSED_OPEN_E  L"\u1d9f"
+#define UNITEXT_MODIFIER_LETTER_SMALL_REVERSED_OPEN_E  U"\u1d9f"
 #define UNICODE_MODIFIER_LETTER_SMALL_F  0x1da0
-#define UNITEXT_MODIFIER_LETTER_SMALL_F  L"\u1da0"
+#define UNITEXT_MODIFIER_LETTER_SMALL_F  U"\u1da0"
 #define UNICODE_MODIFIER_LETTER_SMALL_DOTLESS_J_WITH_STROKE  0x1da1
-#define UNITEXT_MODIFIER_LETTER_SMALL_DOTLESS_J_WITH_STROKE  L"\u1da1"
+#define UNITEXT_MODIFIER_LETTER_SMALL_DOTLESS_J_WITH_STROKE  U"\u1da1"
 #define UNICODE_MODIFIER_LETTER_SMALL_SCRIPT_G  0x1da2
-#define UNITEXT_MODIFIER_LETTER_SMALL_SCRIPT_G  L"\u1da2"
+#define UNITEXT_MODIFIER_LETTER_SMALL_SCRIPT_G  U"\u1da2"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_H  0x1da3
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_H  L"\u1da3"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_H  U"\u1da3"
 #define UNICODE_MODIFIER_LETTER_SMALL_I_WITH_STROKE  0x1da4
-#define UNITEXT_MODIFIER_LETTER_SMALL_I_WITH_STROKE  L"\u1da4"
+#define UNITEXT_MODIFIER_LETTER_SMALL_I_WITH_STROKE  U"\u1da4"
 #define UNICODE_MODIFIER_LETTER_SMALL_IOTA  0x1da5
-#define UNITEXT_MODIFIER_LETTER_SMALL_IOTA  L"\u1da5"
+#define UNITEXT_MODIFIER_LETTER_SMALL_IOTA  U"\u1da5"
 #define UNICODE_MODIFIER_LETTER_SMALL_CAPITAL_I  0x1da6
-#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_I  L"\u1da6"
+#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_I  U"\u1da6"
 #define UNICODE_MODIFIER_LETTER_SMALL_CAPITAL_I_WITH_STROKE  0x1da7
-#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_I_WITH_STROKE  L"\u1da7"
+#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_I_WITH_STROKE  U"\u1da7"
 #define UNICODE_MODIFIER_LETTER_SMALL_J_WITH_CROSSED_TAIL  0x1da8
-#define UNITEXT_MODIFIER_LETTER_SMALL_J_WITH_CROSSED_TAIL  L"\u1da8"
+#define UNITEXT_MODIFIER_LETTER_SMALL_J_WITH_CROSSED_TAIL  U"\u1da8"
 #define UNICODE_MODIFIER_LETTER_SMALL_L_WITH_RETROFLEX_HOOK  0x1da9
-#define UNITEXT_MODIFIER_LETTER_SMALL_L_WITH_RETROFLEX_HOOK  L"\u1da9"
+#define UNITEXT_MODIFIER_LETTER_SMALL_L_WITH_RETROFLEX_HOOK  U"\u1da9"
 #define UNICODE_MODIFIER_LETTER_SMALL_L_WITH_PALATAL_HOOK  0x1daa
-#define UNITEXT_MODIFIER_LETTER_SMALL_L_WITH_PALATAL_HOOK  L"\u1daa"
+#define UNITEXT_MODIFIER_LETTER_SMALL_L_WITH_PALATAL_HOOK  U"\u1daa"
 #define UNICODE_MODIFIER_LETTER_SMALL_CAPITAL_L  0x1dab
-#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_L  L"\u1dab"
+#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_L  U"\u1dab"
 #define UNICODE_MODIFIER_LETTER_SMALL_M_WITH_HOOK  0x1dac
-#define UNITEXT_MODIFIER_LETTER_SMALL_M_WITH_HOOK  L"\u1dac"
+#define UNITEXT_MODIFIER_LETTER_SMALL_M_WITH_HOOK  U"\u1dac"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_M_WITH_LONG_LEG  0x1dad
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_M_WITH_LONG_LEG  L"\u1dad"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_M_WITH_LONG_LEG  U"\u1dad"
 #define UNICODE_MODIFIER_LETTER_SMALL_N_WITH_LEFT_HOOK  0x1dae
-#define UNITEXT_MODIFIER_LETTER_SMALL_N_WITH_LEFT_HOOK  L"\u1dae"
+#define UNITEXT_MODIFIER_LETTER_SMALL_N_WITH_LEFT_HOOK  U"\u1dae"
 #define UNICODE_MODIFIER_LETTER_SMALL_N_WITH_RETROFLEX_HOOK  0x1daf
-#define UNITEXT_MODIFIER_LETTER_SMALL_N_WITH_RETROFLEX_HOOK  L"\u1daf"
+#define UNITEXT_MODIFIER_LETTER_SMALL_N_WITH_RETROFLEX_HOOK  U"\u1daf"
 #define UNICODE_MODIFIER_LETTER_SMALL_CAPITAL_N  0x1db0
-#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_N  L"\u1db0"
+#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_N  U"\u1db0"
 #define UNICODE_MODIFIER_LETTER_SMALL_BARRED_O  0x1db1
-#define UNITEXT_MODIFIER_LETTER_SMALL_BARRED_O  L"\u1db1"
+#define UNITEXT_MODIFIER_LETTER_SMALL_BARRED_O  U"\u1db1"
 #define UNICODE_MODIFIER_LETTER_SMALL_PHI  0x1db2
-#define UNITEXT_MODIFIER_LETTER_SMALL_PHI  L"\u1db2"
+#define UNITEXT_MODIFIER_LETTER_SMALL_PHI  U"\u1db2"
 #define UNICODE_MODIFIER_LETTER_SMALL_S_WITH_HOOK  0x1db3
-#define UNITEXT_MODIFIER_LETTER_SMALL_S_WITH_HOOK  L"\u1db3"
+#define UNITEXT_MODIFIER_LETTER_SMALL_S_WITH_HOOK  U"\u1db3"
 #define UNICODE_MODIFIER_LETTER_SMALL_ESH  0x1db4
-#define UNITEXT_MODIFIER_LETTER_SMALL_ESH  L"\u1db4"
+#define UNITEXT_MODIFIER_LETTER_SMALL_ESH  U"\u1db4"
 #define UNICODE_MODIFIER_LETTER_SMALL_T_WITH_PALATAL_HOOK  0x1db5
-#define UNITEXT_MODIFIER_LETTER_SMALL_T_WITH_PALATAL_HOOK  L"\u1db5"
+#define UNITEXT_MODIFIER_LETTER_SMALL_T_WITH_PALATAL_HOOK  U"\u1db5"
 #define UNICODE_MODIFIER_LETTER_SMALL_U_BAR  0x1db6
-#define UNITEXT_MODIFIER_LETTER_SMALL_U_BAR  L"\u1db6"
+#define UNITEXT_MODIFIER_LETTER_SMALL_U_BAR  U"\u1db6"
 #define UNICODE_MODIFIER_LETTER_SMALL_UPSILON  0x1db7
-#define UNITEXT_MODIFIER_LETTER_SMALL_UPSILON  L"\u1db7"
+#define UNITEXT_MODIFIER_LETTER_SMALL_UPSILON  U"\u1db7"
 #define UNICODE_MODIFIER_LETTER_SMALL_CAPITAL_U  0x1db8
-#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_U  L"\u1db8"
+#define UNITEXT_MODIFIER_LETTER_SMALL_CAPITAL_U  U"\u1db8"
 #define UNICODE_MODIFIER_LETTER_SMALL_V_WITH_HOOK  0x1db9
-#define UNITEXT_MODIFIER_LETTER_SMALL_V_WITH_HOOK  L"\u1db9"
+#define UNITEXT_MODIFIER_LETTER_SMALL_V_WITH_HOOK  U"\u1db9"
 #define UNICODE_MODIFIER_LETTER_SMALL_TURNED_V  0x1dba
-#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_V  L"\u1dba"
+#define UNITEXT_MODIFIER_LETTER_SMALL_TURNED_V  U"\u1dba"
 #define UNICODE_MODIFIER_LETTER_SMALL_Z  0x1dbb
-#define UNITEXT_MODIFIER_LETTER_SMALL_Z  L"\u1dbb"
+#define UNITEXT_MODIFIER_LETTER_SMALL_Z  U"\u1dbb"
 #define UNICODE_MODIFIER_LETTER_SMALL_Z_WITH_RETROFLEX_HOOK  0x1dbc
-#define UNITEXT_MODIFIER_LETTER_SMALL_Z_WITH_RETROFLEX_HOOK  L"\u1dbc"
+#define UNITEXT_MODIFIER_LETTER_SMALL_Z_WITH_RETROFLEX_HOOK  U"\u1dbc"
 #define UNICODE_MODIFIER_LETTER_SMALL_Z_WITH_CURL  0x1dbd
-#define UNITEXT_MODIFIER_LETTER_SMALL_Z_WITH_CURL  L"\u1dbd"
+#define UNITEXT_MODIFIER_LETTER_SMALL_Z_WITH_CURL  U"\u1dbd"
 #define UNICODE_MODIFIER_LETTER_SMALL_EZH  0x1dbe
-#define UNITEXT_MODIFIER_LETTER_SMALL_EZH  L"\u1dbe"
+#define UNITEXT_MODIFIER_LETTER_SMALL_EZH  U"\u1dbe"
 #define UNICODE_MODIFIER_LETTER_SMALL_THETA  0x1dbf
-#define UNITEXT_MODIFIER_LETTER_SMALL_THETA  L"\u1dbf"
+#define UNITEXT_MODIFIER_LETTER_SMALL_THETA  U"\u1dbf"
 #define UNICODE_COMBINING_DOTTED_GRAVE_ACCENT  0x1dc0
-#define UNITEXT_COMBINING_DOTTED_GRAVE_ACCENT  L"\u1dc0"
+#define UNITEXT_COMBINING_DOTTED_GRAVE_ACCENT  U"\u1dc0"
 #define UNICODE_COMBINING_DOTTED_ACUTE_ACCENT  0x1dc1
-#define UNITEXT_COMBINING_DOTTED_ACUTE_ACCENT  L"\u1dc1"
+#define UNITEXT_COMBINING_DOTTED_ACUTE_ACCENT  U"\u1dc1"
 #define UNICODE_COMBINING_SNAKE_BELOW  0x1dc2
-#define UNITEXT_COMBINING_SNAKE_BELOW  L"\u1dc2"
+#define UNITEXT_COMBINING_SNAKE_BELOW  U"\u1dc2"
 #define UNICODE_COMBINING_SUSPENSION_MARK  0x1dc3
-#define UNITEXT_COMBINING_SUSPENSION_MARK  L"\u1dc3"
+#define UNITEXT_COMBINING_SUSPENSION_MARK  U"\u1dc3"
 #define UNICODE_COMBINING_MACRON_ACUTE  0x1dc4
-#define UNITEXT_COMBINING_MACRON_ACUTE  L"\u1dc4"
+#define UNITEXT_COMBINING_MACRON_ACUTE  U"\u1dc4"
 #define UNICODE_COMBINING_GRAVE_MACRON  0x1dc5
-#define UNITEXT_COMBINING_GRAVE_MACRON  L"\u1dc5"
+#define UNITEXT_COMBINING_GRAVE_MACRON  U"\u1dc5"
 #define UNICODE_COMBINING_MACRON_GRAVE  0x1dc6
-#define UNITEXT_COMBINING_MACRON_GRAVE  L"\u1dc6"
+#define UNITEXT_COMBINING_MACRON_GRAVE  U"\u1dc6"
 #define UNICODE_COMBINING_ACUTE_MACRON  0x1dc7
-#define UNITEXT_COMBINING_ACUTE_MACRON  L"\u1dc7"
+#define UNITEXT_COMBINING_ACUTE_MACRON  U"\u1dc7"
 #define UNICODE_COMBINING_GRAVE_ACUTE_GRAVE  0x1dc8
-#define UNITEXT_COMBINING_GRAVE_ACUTE_GRAVE  L"\u1dc8"
+#define UNITEXT_COMBINING_GRAVE_ACUTE_GRAVE  U"\u1dc8"
 #define UNICODE_COMBINING_ACUTE_GRAVE_ACUTE  0x1dc9
-#define UNITEXT_COMBINING_ACUTE_GRAVE_ACUTE  L"\u1dc9"
+#define UNITEXT_COMBINING_ACUTE_GRAVE_ACUTE  U"\u1dc9"
 #define UNICODE_COMBINING_LATIN_SMALL_LETTER_R_BELOW  0x1dca
-#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_R_BELOW  L"\u1dca"
+#define UNITEXT_COMBINING_LATIN_SMALL_LETTER_R_BELOW  U"\u1dca"
 #define UNICODE_COMBINING_LEFT_ARROWHEAD_ABOVE  0x1dfe
-#define UNITEXT_COMBINING_LEFT_ARROWHEAD_ABOVE  L"\u1dfe"
+#define UNITEXT_COMBINING_LEFT_ARROWHEAD_ABOVE  U"\u1dfe"
 #define UNICODE_COMBINING_RIGHT_ARROWHEAD_AND_DOWN_ARROWHEAD_BELOW  0x1dff
-#define UNITEXT_COMBINING_RIGHT_ARROWHEAD_AND_DOWN_ARROWHEAD_BELOW  L"\u1dff"
+#define UNITEXT_COMBINING_RIGHT_ARROWHEAD_AND_DOWN_ARROWHEAD_BELOW  U"\u1dff"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_RING_BELOW  0x1e00
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_RING_BELOW  L"\u1e00"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_RING_BELOW  U"\u1e00"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_RING_BELOW  0x1e01
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_RING_BELOW  L"\u1e01"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_RING_BELOW  U"\u1e01"
 #define UNICODE_LATIN_CAPITAL_LETTER_B_WITH_DOT_ABOVE  0x1e02
-#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_DOT_ABOVE  L"\u1e02"
+#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_DOT_ABOVE  U"\u1e02"
 #define UNICODE_LATIN_SMALL_LETTER_B_WITH_DOT_ABOVE  0x1e03
-#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_DOT_ABOVE  L"\u1e03"
+#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_DOT_ABOVE  U"\u1e03"
 #define UNICODE_LATIN_CAPITAL_LETTER_B_WITH_DOT_BELOW  0x1e04
-#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_DOT_BELOW  L"\u1e04"
+#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_DOT_BELOW  U"\u1e04"
 #define UNICODE_LATIN_SMALL_LETTER_B_WITH_DOT_BELOW  0x1e05
-#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_DOT_BELOW  L"\u1e05"
+#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_DOT_BELOW  U"\u1e05"
 #define UNICODE_LATIN_CAPITAL_LETTER_B_WITH_LINE_BELOW  0x1e06
-#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_LINE_BELOW  L"\u1e06"
+#define UNITEXT_LATIN_CAPITAL_LETTER_B_WITH_LINE_BELOW  U"\u1e06"
 #define UNICODE_LATIN_SMALL_LETTER_B_WITH_LINE_BELOW  0x1e07
-#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_LINE_BELOW  L"\u1e07"
+#define UNITEXT_LATIN_SMALL_LETTER_B_WITH_LINE_BELOW  U"\u1e07"
 #define UNICODE_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA_AND_ACUTE  0x1e08
-#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA_AND_ACUTE  L"\u1e08"
+#define UNITEXT_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA_AND_ACUTE  U"\u1e08"
 #define UNICODE_LATIN_SMALL_LETTER_C_WITH_CEDILLA_AND_ACUTE  0x1e09
-#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_CEDILLA_AND_ACUTE  L"\u1e09"
+#define UNITEXT_LATIN_SMALL_LETTER_C_WITH_CEDILLA_AND_ACUTE  U"\u1e09"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_DOT_ABOVE  0x1e0a
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_DOT_ABOVE  L"\u1e0a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_DOT_ABOVE  U"\u1e0a"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_DOT_ABOVE  0x1e0b
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_DOT_ABOVE  L"\u1e0b"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_DOT_ABOVE  U"\u1e0b"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_DOT_BELOW  0x1e0c
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_DOT_BELOW  L"\u1e0c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_DOT_BELOW  U"\u1e0c"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_DOT_BELOW  0x1e0d
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_DOT_BELOW  L"\u1e0d"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_DOT_BELOW  U"\u1e0d"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_LINE_BELOW  0x1e0e
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_LINE_BELOW  L"\u1e0e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_LINE_BELOW  U"\u1e0e"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_LINE_BELOW  0x1e0f
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_LINE_BELOW  L"\u1e0f"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_LINE_BELOW  U"\u1e0f"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_CEDILLA  0x1e10
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_CEDILLA  L"\u1e10"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_CEDILLA  U"\u1e10"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_CEDILLA  0x1e11
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_CEDILLA  L"\u1e11"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_CEDILLA  U"\u1e11"
 #define UNICODE_LATIN_CAPITAL_LETTER_D_WITH_CIRCUMFLEX_BELOW  0x1e12
-#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_CIRCUMFLEX_BELOW  L"\u1e12"
+#define UNITEXT_LATIN_CAPITAL_LETTER_D_WITH_CIRCUMFLEX_BELOW  U"\u1e12"
 #define UNICODE_LATIN_SMALL_LETTER_D_WITH_CIRCUMFLEX_BELOW  0x1e13
-#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_CIRCUMFLEX_BELOW  L"\u1e13"
+#define UNITEXT_LATIN_SMALL_LETTER_D_WITH_CIRCUMFLEX_BELOW  U"\u1e13"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_GRAVE  0x1e14
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_GRAVE  L"\u1e14"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_GRAVE  U"\u1e14"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_MACRON_AND_GRAVE  0x1e15
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_MACRON_AND_GRAVE  L"\u1e15"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_MACRON_AND_GRAVE  U"\u1e15"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_ACUTE  0x1e16
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_ACUTE  L"\u1e16"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_MACRON_AND_ACUTE  U"\u1e16"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_MACRON_AND_ACUTE  0x1e17
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_MACRON_AND_ACUTE  L"\u1e17"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_MACRON_AND_ACUTE  U"\u1e17"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_BELOW  0x1e18
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_BELOW  L"\u1e18"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_BELOW  U"\u1e18"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_BELOW  0x1e19
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_BELOW  L"\u1e19"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_BELOW  U"\u1e19"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_TILDE_BELOW  0x1e1a
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_TILDE_BELOW  L"\u1e1a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_TILDE_BELOW  U"\u1e1a"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_TILDE_BELOW  0x1e1b
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_TILDE_BELOW  L"\u1e1b"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_TILDE_BELOW  U"\u1e1b"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CEDILLA_AND_BREVE  0x1e1c
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CEDILLA_AND_BREVE  L"\u1e1c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CEDILLA_AND_BREVE  U"\u1e1c"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_CEDILLA_AND_BREVE  0x1e1d
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CEDILLA_AND_BREVE  L"\u1e1d"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CEDILLA_AND_BREVE  U"\u1e1d"
 #define UNICODE_LATIN_CAPITAL_LETTER_F_WITH_DOT_ABOVE  0x1e1e
-#define UNITEXT_LATIN_CAPITAL_LETTER_F_WITH_DOT_ABOVE  L"\u1e1e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_F_WITH_DOT_ABOVE  U"\u1e1e"
 #define UNICODE_LATIN_SMALL_LETTER_F_WITH_DOT_ABOVE  0x1e1f
-#define UNITEXT_LATIN_SMALL_LETTER_F_WITH_DOT_ABOVE  L"\u1e1f"
+#define UNITEXT_LATIN_SMALL_LETTER_F_WITH_DOT_ABOVE  U"\u1e1f"
 #define UNICODE_LATIN_CAPITAL_LETTER_G_WITH_MACRON  0x1e20
-#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_MACRON  L"\u1e20"
+#define UNITEXT_LATIN_CAPITAL_LETTER_G_WITH_MACRON  U"\u1e20"
 #define UNICODE_LATIN_SMALL_LETTER_G_WITH_MACRON  0x1e21
-#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_MACRON  L"\u1e21"
+#define UNITEXT_LATIN_SMALL_LETTER_G_WITH_MACRON  U"\u1e21"
 #define UNICODE_LATIN_CAPITAL_LETTER_H_WITH_DOT_ABOVE  0x1e22
-#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_DOT_ABOVE  L"\u1e22"
+#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_DOT_ABOVE  U"\u1e22"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_DOT_ABOVE  0x1e23
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_DOT_ABOVE  L"\u1e23"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_DOT_ABOVE  U"\u1e23"
 #define UNICODE_LATIN_CAPITAL_LETTER_H_WITH_DOT_BELOW  0x1e24
-#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_DOT_BELOW  L"\u1e24"
+#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_DOT_BELOW  U"\u1e24"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_DOT_BELOW  0x1e25
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_DOT_BELOW  L"\u1e25"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_DOT_BELOW  U"\u1e25"
 #define UNICODE_LATIN_CAPITAL_LETTER_H_WITH_DIAERESIS  0x1e26
-#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_DIAERESIS  L"\u1e26"
+#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_DIAERESIS  U"\u1e26"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_DIAERESIS  0x1e27
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_DIAERESIS  L"\u1e27"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_DIAERESIS  U"\u1e27"
 #define UNICODE_LATIN_CAPITAL_LETTER_H_WITH_CEDILLA  0x1e28
-#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_CEDILLA  L"\u1e28"
+#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_CEDILLA  U"\u1e28"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_CEDILLA  0x1e29
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_CEDILLA  L"\u1e29"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_CEDILLA  U"\u1e29"
 #define UNICODE_LATIN_CAPITAL_LETTER_H_WITH_BREVE_BELOW  0x1e2a
-#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_BREVE_BELOW  L"\u1e2a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_BREVE_BELOW  U"\u1e2a"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_BREVE_BELOW  0x1e2b
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_BREVE_BELOW  L"\u1e2b"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_BREVE_BELOW  U"\u1e2b"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_TILDE_BELOW  0x1e2c
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_TILDE_BELOW  L"\u1e2c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_TILDE_BELOW  U"\u1e2c"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_TILDE_BELOW  0x1e2d
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_TILDE_BELOW  L"\u1e2d"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_TILDE_BELOW  U"\u1e2d"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS_AND_ACUTE  0x1e2e
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS_AND_ACUTE  L"\u1e2e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS_AND_ACUTE  U"\u1e2e"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_DIAERESIS_AND_ACUTE  0x1e2f
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_DIAERESIS_AND_ACUTE  L"\u1e2f"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_DIAERESIS_AND_ACUTE  U"\u1e2f"
 #define UNICODE_LATIN_CAPITAL_LETTER_K_WITH_ACUTE  0x1e30
-#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_ACUTE  L"\u1e30"
+#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_ACUTE  U"\u1e30"
 #define UNICODE_LATIN_SMALL_LETTER_K_WITH_ACUTE  0x1e31
-#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_ACUTE  L"\u1e31"
+#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_ACUTE  U"\u1e31"
 #define UNICODE_LATIN_CAPITAL_LETTER_K_WITH_DOT_BELOW  0x1e32
-#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_DOT_BELOW  L"\u1e32"
+#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_DOT_BELOW  U"\u1e32"
 #define UNICODE_LATIN_SMALL_LETTER_K_WITH_DOT_BELOW  0x1e33
-#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_DOT_BELOW  L"\u1e33"
+#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_DOT_BELOW  U"\u1e33"
 #define UNICODE_LATIN_CAPITAL_LETTER_K_WITH_LINE_BELOW  0x1e34
-#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_LINE_BELOW  L"\u1e34"
+#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_LINE_BELOW  U"\u1e34"
 #define UNICODE_LATIN_SMALL_LETTER_K_WITH_LINE_BELOW  0x1e35
-#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_LINE_BELOW  L"\u1e35"
+#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_LINE_BELOW  U"\u1e35"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW  0x1e36
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW  L"\u1e36"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW  U"\u1e36"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_DOT_BELOW  0x1e37
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_DOT_BELOW  L"\u1e37"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_DOT_BELOW  U"\u1e37"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW_AND_MACRON  0x1e38
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW_AND_MACRON  L"\u1e38"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_DOT_BELOW_AND_MACRON  U"\u1e38"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_DOT_BELOW_AND_MACRON  0x1e39
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_DOT_BELOW_AND_MACRON  L"\u1e39"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_DOT_BELOW_AND_MACRON  U"\u1e39"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_LINE_BELOW  0x1e3a
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_LINE_BELOW  L"\u1e3a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_LINE_BELOW  U"\u1e3a"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_LINE_BELOW  0x1e3b
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_LINE_BELOW  L"\u1e3b"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_LINE_BELOW  U"\u1e3b"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_CIRCUMFLEX_BELOW  0x1e3c
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_CIRCUMFLEX_BELOW  L"\u1e3c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_CIRCUMFLEX_BELOW  U"\u1e3c"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_CIRCUMFLEX_BELOW  0x1e3d
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_CIRCUMFLEX_BELOW  L"\u1e3d"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_CIRCUMFLEX_BELOW  U"\u1e3d"
 #define UNICODE_LATIN_CAPITAL_LETTER_M_WITH_ACUTE  0x1e3e
-#define UNITEXT_LATIN_CAPITAL_LETTER_M_WITH_ACUTE  L"\u1e3e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_M_WITH_ACUTE  U"\u1e3e"
 #define UNICODE_LATIN_SMALL_LETTER_M_WITH_ACUTE  0x1e3f
-#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_ACUTE  L"\u1e3f"
+#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_ACUTE  U"\u1e3f"
 #define UNICODE_LATIN_CAPITAL_LETTER_M_WITH_DOT_ABOVE  0x1e40
-#define UNITEXT_LATIN_CAPITAL_LETTER_M_WITH_DOT_ABOVE  L"\u1e40"
+#define UNITEXT_LATIN_CAPITAL_LETTER_M_WITH_DOT_ABOVE  U"\u1e40"
 #define UNICODE_LATIN_SMALL_LETTER_M_WITH_DOT_ABOVE  0x1e41
-#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_DOT_ABOVE  L"\u1e41"
+#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_DOT_ABOVE  U"\u1e41"
 #define UNICODE_LATIN_CAPITAL_LETTER_M_WITH_DOT_BELOW  0x1e42
-#define UNITEXT_LATIN_CAPITAL_LETTER_M_WITH_DOT_BELOW  L"\u1e42"
+#define UNITEXT_LATIN_CAPITAL_LETTER_M_WITH_DOT_BELOW  U"\u1e42"
 #define UNICODE_LATIN_SMALL_LETTER_M_WITH_DOT_BELOW  0x1e43
-#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_DOT_BELOW  L"\u1e43"
+#define UNITEXT_LATIN_SMALL_LETTER_M_WITH_DOT_BELOW  U"\u1e43"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_DOT_ABOVE  0x1e44
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_DOT_ABOVE  L"\u1e44"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_DOT_ABOVE  U"\u1e44"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_DOT_ABOVE  0x1e45
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_DOT_ABOVE  L"\u1e45"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_DOT_ABOVE  U"\u1e45"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_DOT_BELOW  0x1e46
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_DOT_BELOW  L"\u1e46"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_DOT_BELOW  U"\u1e46"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_DOT_BELOW  0x1e47
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_DOT_BELOW  L"\u1e47"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_DOT_BELOW  U"\u1e47"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_LINE_BELOW  0x1e48
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_LINE_BELOW  L"\u1e48"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_LINE_BELOW  U"\u1e48"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_LINE_BELOW  0x1e49
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_LINE_BELOW  L"\u1e49"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_LINE_BELOW  U"\u1e49"
 #define UNICODE_LATIN_CAPITAL_LETTER_N_WITH_CIRCUMFLEX_BELOW  0x1e4a
-#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_CIRCUMFLEX_BELOW  L"\u1e4a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_N_WITH_CIRCUMFLEX_BELOW  U"\u1e4a"
 #define UNICODE_LATIN_SMALL_LETTER_N_WITH_CIRCUMFLEX_BELOW  0x1e4b
-#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_CIRCUMFLEX_BELOW  L"\u1e4b"
+#define UNITEXT_LATIN_SMALL_LETTER_N_WITH_CIRCUMFLEX_BELOW  U"\u1e4b"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_ACUTE  0x1e4c
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_ACUTE  L"\u1e4c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_ACUTE  U"\u1e4c"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_TILDE_AND_ACUTE  0x1e4d
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_TILDE_AND_ACUTE  L"\u1e4d"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_TILDE_AND_ACUTE  U"\u1e4d"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_DIAERESIS  0x1e4e
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_DIAERESIS  L"\u1e4e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_TILDE_AND_DIAERESIS  U"\u1e4e"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_TILDE_AND_DIAERESIS  0x1e4f
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_TILDE_AND_DIAERESIS  L"\u1e4f"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_TILDE_AND_DIAERESIS  U"\u1e4f"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_GRAVE  0x1e50
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_GRAVE  L"\u1e50"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_GRAVE  U"\u1e50"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_MACRON_AND_GRAVE  0x1e51
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_MACRON_AND_GRAVE  L"\u1e51"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_MACRON_AND_GRAVE  U"\u1e51"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_ACUTE  0x1e52
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_ACUTE  L"\u1e52"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_MACRON_AND_ACUTE  U"\u1e52"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_MACRON_AND_ACUTE  0x1e53
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_MACRON_AND_ACUTE  L"\u1e53"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_MACRON_AND_ACUTE  U"\u1e53"
 #define UNICODE_LATIN_CAPITAL_LETTER_P_WITH_ACUTE  0x1e54
-#define UNITEXT_LATIN_CAPITAL_LETTER_P_WITH_ACUTE  L"\u1e54"
+#define UNITEXT_LATIN_CAPITAL_LETTER_P_WITH_ACUTE  U"\u1e54"
 #define UNICODE_LATIN_SMALL_LETTER_P_WITH_ACUTE  0x1e55
-#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_ACUTE  L"\u1e55"
+#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_ACUTE  U"\u1e55"
 #define UNICODE_LATIN_CAPITAL_LETTER_P_WITH_DOT_ABOVE  0x1e56
-#define UNITEXT_LATIN_CAPITAL_LETTER_P_WITH_DOT_ABOVE  L"\u1e56"
+#define UNITEXT_LATIN_CAPITAL_LETTER_P_WITH_DOT_ABOVE  U"\u1e56"
 #define UNICODE_LATIN_SMALL_LETTER_P_WITH_DOT_ABOVE  0x1e57
-#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_DOT_ABOVE  L"\u1e57"
+#define UNITEXT_LATIN_SMALL_LETTER_P_WITH_DOT_ABOVE  U"\u1e57"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_DOT_ABOVE  0x1e58
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_DOT_ABOVE  L"\u1e58"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_DOT_ABOVE  U"\u1e58"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_DOT_ABOVE  0x1e59
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_DOT_ABOVE  L"\u1e59"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_DOT_ABOVE  U"\u1e59"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW  0x1e5a
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW  L"\u1e5a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW  U"\u1e5a"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_DOT_BELOW  0x1e5b
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_DOT_BELOW  L"\u1e5b"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_DOT_BELOW  U"\u1e5b"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW_AND_MACRON  0x1e5c
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW_AND_MACRON  L"\u1e5c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_DOT_BELOW_AND_MACRON  U"\u1e5c"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_DOT_BELOW_AND_MACRON  0x1e5d
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_DOT_BELOW_AND_MACRON  L"\u1e5d"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_DOT_BELOW_AND_MACRON  U"\u1e5d"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_LINE_BELOW  0x1e5e
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_LINE_BELOW  L"\u1e5e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_LINE_BELOW  U"\u1e5e"
 #define UNICODE_LATIN_SMALL_LETTER_R_WITH_LINE_BELOW  0x1e5f
-#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_LINE_BELOW  L"\u1e5f"
+#define UNITEXT_LATIN_SMALL_LETTER_R_WITH_LINE_BELOW  U"\u1e5f"
 #define UNICODE_LATIN_CAPITAL_LETTER_S_WITH_DOT_ABOVE  0x1e60
-#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_DOT_ABOVE  L"\u1e60"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_DOT_ABOVE  U"\u1e60"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_DOT_ABOVE  0x1e61
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_DOT_ABOVE  L"\u1e61"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_DOT_ABOVE  U"\u1e61"
 #define UNICODE_LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW  0x1e62
-#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW  L"\u1e62"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW  U"\u1e62"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_DOT_BELOW  0x1e63
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_DOT_BELOW  L"\u1e63"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_DOT_BELOW  U"\u1e63"
 #define UNICODE_LATIN_CAPITAL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE  0x1e64
-#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE  L"\u1e64"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE  U"\u1e64"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE  0x1e65
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE  L"\u1e65"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_ACUTE_AND_DOT_ABOVE  U"\u1e65"
 #define UNICODE_LATIN_CAPITAL_LETTER_S_WITH_CARON_AND_DOT_ABOVE  0x1e66
-#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_CARON_AND_DOT_ABOVE  L"\u1e66"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_CARON_AND_DOT_ABOVE  U"\u1e66"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_CARON_AND_DOT_ABOVE  0x1e67
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_CARON_AND_DOT_ABOVE  L"\u1e67"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_CARON_AND_DOT_ABOVE  U"\u1e67"
 #define UNICODE_LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE  0x1e68
-#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE  L"\u1e68"
+#define UNITEXT_LATIN_CAPITAL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE  U"\u1e68"
 #define UNICODE_LATIN_SMALL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE  0x1e69
-#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE  L"\u1e69"
+#define UNITEXT_LATIN_SMALL_LETTER_S_WITH_DOT_BELOW_AND_DOT_ABOVE  U"\u1e69"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_DOT_ABOVE  0x1e6a
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_DOT_ABOVE  L"\u1e6a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_DOT_ABOVE  U"\u1e6a"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_DOT_ABOVE  0x1e6b
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_DOT_ABOVE  L"\u1e6b"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_DOT_ABOVE  U"\u1e6b"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_DOT_BELOW  0x1e6c
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_DOT_BELOW  L"\u1e6c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_DOT_BELOW  U"\u1e6c"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_DOT_BELOW  0x1e6d
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_DOT_BELOW  L"\u1e6d"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_DOT_BELOW  U"\u1e6d"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_LINE_BELOW  0x1e6e
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_LINE_BELOW  L"\u1e6e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_LINE_BELOW  U"\u1e6e"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_LINE_BELOW  0x1e6f
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_LINE_BELOW  L"\u1e6f"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_LINE_BELOW  U"\u1e6f"
 #define UNICODE_LATIN_CAPITAL_LETTER_T_WITH_CIRCUMFLEX_BELOW  0x1e70
-#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_CIRCUMFLEX_BELOW  L"\u1e70"
+#define UNITEXT_LATIN_CAPITAL_LETTER_T_WITH_CIRCUMFLEX_BELOW  U"\u1e70"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_CIRCUMFLEX_BELOW  0x1e71
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_CIRCUMFLEX_BELOW  L"\u1e71"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_CIRCUMFLEX_BELOW  U"\u1e71"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_BELOW  0x1e72
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_BELOW  L"\u1e72"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS_BELOW  U"\u1e72"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_BELOW  0x1e73
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_BELOW  L"\u1e73"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DIAERESIS_BELOW  U"\u1e73"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_TILDE_BELOW  0x1e74
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_TILDE_BELOW  L"\u1e74"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_TILDE_BELOW  U"\u1e74"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_TILDE_BELOW  0x1e75
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_TILDE_BELOW  L"\u1e75"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_TILDE_BELOW  U"\u1e75"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX_BELOW  0x1e76
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX_BELOW  L"\u1e76"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX_BELOW  U"\u1e76"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX_BELOW  0x1e77
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX_BELOW  L"\u1e77"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX_BELOW  U"\u1e77"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_TILDE_AND_ACUTE  0x1e78
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_TILDE_AND_ACUTE  L"\u1e78"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_TILDE_AND_ACUTE  U"\u1e78"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_TILDE_AND_ACUTE  0x1e79
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_TILDE_AND_ACUTE  L"\u1e79"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_TILDE_AND_ACUTE  U"\u1e79"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_MACRON_AND_DIAERESIS  0x1e7a
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_MACRON_AND_DIAERESIS  L"\u1e7a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_MACRON_AND_DIAERESIS  U"\u1e7a"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_MACRON_AND_DIAERESIS  0x1e7b
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_MACRON_AND_DIAERESIS  L"\u1e7b"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_MACRON_AND_DIAERESIS  U"\u1e7b"
 #define UNICODE_LATIN_CAPITAL_LETTER_V_WITH_TILDE  0x1e7c
-#define UNITEXT_LATIN_CAPITAL_LETTER_V_WITH_TILDE  L"\u1e7c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_V_WITH_TILDE  U"\u1e7c"
 #define UNICODE_LATIN_SMALL_LETTER_V_WITH_TILDE  0x1e7d
-#define UNITEXT_LATIN_SMALL_LETTER_V_WITH_TILDE  L"\u1e7d"
+#define UNITEXT_LATIN_SMALL_LETTER_V_WITH_TILDE  U"\u1e7d"
 #define UNICODE_LATIN_CAPITAL_LETTER_V_WITH_DOT_BELOW  0x1e7e
-#define UNITEXT_LATIN_CAPITAL_LETTER_V_WITH_DOT_BELOW  L"\u1e7e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_V_WITH_DOT_BELOW  U"\u1e7e"
 #define UNICODE_LATIN_SMALL_LETTER_V_WITH_DOT_BELOW  0x1e7f
-#define UNITEXT_LATIN_SMALL_LETTER_V_WITH_DOT_BELOW  L"\u1e7f"
+#define UNITEXT_LATIN_SMALL_LETTER_V_WITH_DOT_BELOW  U"\u1e7f"
 #define UNICODE_LATIN_CAPITAL_LETTER_W_WITH_GRAVE  0x1e80
-#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_GRAVE  L"\u1e80"
+#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_GRAVE  U"\u1e80"
 #define UNICODE_LATIN_SMALL_LETTER_W_WITH_GRAVE  0x1e81
-#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_GRAVE  L"\u1e81"
+#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_GRAVE  U"\u1e81"
 #define UNICODE_LATIN_CAPITAL_LETTER_W_WITH_ACUTE  0x1e82
-#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_ACUTE  L"\u1e82"
+#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_ACUTE  U"\u1e82"
 #define UNICODE_LATIN_SMALL_LETTER_W_WITH_ACUTE  0x1e83
-#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_ACUTE  L"\u1e83"
+#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_ACUTE  U"\u1e83"
 #define UNICODE_LATIN_CAPITAL_LETTER_W_WITH_DIAERESIS  0x1e84
-#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_DIAERESIS  L"\u1e84"
+#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_DIAERESIS  U"\u1e84"
 #define UNICODE_LATIN_SMALL_LETTER_W_WITH_DIAERESIS  0x1e85
-#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_DIAERESIS  L"\u1e85"
+#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_DIAERESIS  U"\u1e85"
 #define UNICODE_LATIN_CAPITAL_LETTER_W_WITH_DOT_ABOVE  0x1e86
-#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_DOT_ABOVE  L"\u1e86"
+#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_DOT_ABOVE  U"\u1e86"
 #define UNICODE_LATIN_SMALL_LETTER_W_WITH_DOT_ABOVE  0x1e87
-#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_DOT_ABOVE  L"\u1e87"
+#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_DOT_ABOVE  U"\u1e87"
 #define UNICODE_LATIN_CAPITAL_LETTER_W_WITH_DOT_BELOW  0x1e88
-#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_DOT_BELOW  L"\u1e88"
+#define UNITEXT_LATIN_CAPITAL_LETTER_W_WITH_DOT_BELOW  U"\u1e88"
 #define UNICODE_LATIN_SMALL_LETTER_W_WITH_DOT_BELOW  0x1e89
-#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_DOT_BELOW  L"\u1e89"
+#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_DOT_BELOW  U"\u1e89"
 #define UNICODE_LATIN_CAPITAL_LETTER_X_WITH_DOT_ABOVE  0x1e8a
-#define UNITEXT_LATIN_CAPITAL_LETTER_X_WITH_DOT_ABOVE  L"\u1e8a"
+#define UNITEXT_LATIN_CAPITAL_LETTER_X_WITH_DOT_ABOVE  U"\u1e8a"
 #define UNICODE_LATIN_SMALL_LETTER_X_WITH_DOT_ABOVE  0x1e8b
-#define UNITEXT_LATIN_SMALL_LETTER_X_WITH_DOT_ABOVE  L"\u1e8b"
+#define UNITEXT_LATIN_SMALL_LETTER_X_WITH_DOT_ABOVE  U"\u1e8b"
 #define UNICODE_LATIN_CAPITAL_LETTER_X_WITH_DIAERESIS  0x1e8c
-#define UNITEXT_LATIN_CAPITAL_LETTER_X_WITH_DIAERESIS  L"\u1e8c"
+#define UNITEXT_LATIN_CAPITAL_LETTER_X_WITH_DIAERESIS  U"\u1e8c"
 #define UNICODE_LATIN_SMALL_LETTER_X_WITH_DIAERESIS  0x1e8d
-#define UNITEXT_LATIN_SMALL_LETTER_X_WITH_DIAERESIS  L"\u1e8d"
+#define UNITEXT_LATIN_SMALL_LETTER_X_WITH_DIAERESIS  U"\u1e8d"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_DOT_ABOVE  0x1e8e
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_DOT_ABOVE  L"\u1e8e"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_DOT_ABOVE  U"\u1e8e"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_DOT_ABOVE  0x1e8f
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_DOT_ABOVE  L"\u1e8f"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_DOT_ABOVE  U"\u1e8f"
 #define UNICODE_LATIN_CAPITAL_LETTER_Z_WITH_CIRCUMFLEX  0x1e90
-#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_CIRCUMFLEX  L"\u1e90"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_CIRCUMFLEX  U"\u1e90"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_CIRCUMFLEX  0x1e91
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_CIRCUMFLEX  L"\u1e91"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_CIRCUMFLEX  U"\u1e91"
 #define UNICODE_LATIN_CAPITAL_LETTER_Z_WITH_DOT_BELOW  0x1e92
-#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_DOT_BELOW  L"\u1e92"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_DOT_BELOW  U"\u1e92"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_DOT_BELOW  0x1e93
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_DOT_BELOW  L"\u1e93"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_DOT_BELOW  U"\u1e93"
 #define UNICODE_LATIN_CAPITAL_LETTER_Z_WITH_LINE_BELOW  0x1e94
-#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_LINE_BELOW  L"\u1e94"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_LINE_BELOW  U"\u1e94"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_LINE_BELOW  0x1e95
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_LINE_BELOW  L"\u1e95"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_LINE_BELOW  U"\u1e95"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_LINE_BELOW  0x1e96
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_LINE_BELOW  L"\u1e96"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_LINE_BELOW  U"\u1e96"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_DIAERESIS  0x1e97
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_DIAERESIS  L"\u1e97"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_DIAERESIS  U"\u1e97"
 #define UNICODE_LATIN_SMALL_LETTER_W_WITH_RING_ABOVE  0x1e98
-#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_RING_ABOVE  L"\u1e98"
+#define UNITEXT_LATIN_SMALL_LETTER_W_WITH_RING_ABOVE  U"\u1e98"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_RING_ABOVE  0x1e99
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_RING_ABOVE  L"\u1e99"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_RING_ABOVE  U"\u1e99"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_RIGHT_HALF_RING  0x1e9a
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_RIGHT_HALF_RING  L"\u1e9a"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_RIGHT_HALF_RING  U"\u1e9a"
 #define UNICODE_LATIN_SMALL_LETTER_LONG_S_WITH_DOT_ABOVE  0x1e9b
-#define UNITEXT_LATIN_SMALL_LETTER_LONG_S_WITH_DOT_ABOVE  L"\u1e9b"
+#define UNITEXT_LATIN_SMALL_LETTER_LONG_S_WITH_DOT_ABOVE  U"\u1e9b"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DOT_BELOW  0x1ea0
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DOT_BELOW  L"\u1ea0"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_DOT_BELOW  U"\u1ea0"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_DOT_BELOW  0x1ea1
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DOT_BELOW  L"\u1ea1"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_DOT_BELOW  U"\u1ea1"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_HOOK_ABOVE  0x1ea2
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_HOOK_ABOVE  L"\u1ea2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_HOOK_ABOVE  U"\u1ea2"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_HOOK_ABOVE  0x1ea3
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_HOOK_ABOVE  L"\u1ea3"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_HOOK_ABOVE  U"\u1ea3"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE  0x1ea4
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE  L"\u1ea4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE  U"\u1ea4"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE  0x1ea5
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE  L"\u1ea5"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_ACUTE  U"\u1ea5"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE  0x1ea6
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE  L"\u1ea6"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE  U"\u1ea6"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE  0x1ea7
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE  L"\u1ea7"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_GRAVE  U"\u1ea7"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  0x1ea8
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  L"\u1ea8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  U"\u1ea8"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  0x1ea9
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  L"\u1ea9"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  U"\u1ea9"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE  0x1eaa
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE  L"\u1eaa"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE  U"\u1eaa"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE  0x1eab
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE  L"\u1eab"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_TILDE  U"\u1eab"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW  0x1eac
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW  L"\u1eac"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW  U"\u1eac"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW  0x1ead
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW  L"\u1ead"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX_AND_DOT_BELOW  U"\u1ead"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_ACUTE  0x1eae
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_ACUTE  L"\u1eae"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_ACUTE  U"\u1eae"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_ACUTE  0x1eaf
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_ACUTE  L"\u1eaf"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_ACUTE  U"\u1eaf"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_GRAVE  0x1eb0
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_GRAVE  L"\u1eb0"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_GRAVE  U"\u1eb0"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_GRAVE  0x1eb1
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_GRAVE  L"\u1eb1"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_GRAVE  U"\u1eb1"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE  0x1eb2
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE  L"\u1eb2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE  U"\u1eb2"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE  0x1eb3
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE  L"\u1eb3"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_HOOK_ABOVE  U"\u1eb3"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_TILDE  0x1eb4
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_TILDE  L"\u1eb4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_TILDE  U"\u1eb4"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_TILDE  0x1eb5
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_TILDE  L"\u1eb5"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_TILDE  U"\u1eb5"
 #define UNICODE_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_DOT_BELOW  0x1eb6
-#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_DOT_BELOW  L"\u1eb6"
+#define UNITEXT_LATIN_CAPITAL_LETTER_A_WITH_BREVE_AND_DOT_BELOW  U"\u1eb6"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_DOT_BELOW  0x1eb7
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_DOT_BELOW  L"\u1eb7"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_BREVE_AND_DOT_BELOW  U"\u1eb7"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_DOT_BELOW  0x1eb8
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_DOT_BELOW  L"\u1eb8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_DOT_BELOW  U"\u1eb8"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_DOT_BELOW  0x1eb9
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_DOT_BELOW  L"\u1eb9"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_DOT_BELOW  U"\u1eb9"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_HOOK_ABOVE  0x1eba
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_HOOK_ABOVE  L"\u1eba"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_HOOK_ABOVE  U"\u1eba"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_HOOK_ABOVE  0x1ebb
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_HOOK_ABOVE  L"\u1ebb"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_HOOK_ABOVE  U"\u1ebb"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_TILDE  0x1ebc
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_TILDE  L"\u1ebc"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_TILDE  U"\u1ebc"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_TILDE  0x1ebd
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_TILDE  L"\u1ebd"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_TILDE  U"\u1ebd"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE  0x1ebe
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE  L"\u1ebe"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE  U"\u1ebe"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE  0x1ebf
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE  L"\u1ebf"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_ACUTE  U"\u1ebf"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE  0x1ec0
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE  L"\u1ec0"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE  U"\u1ec0"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE  0x1ec1
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE  L"\u1ec1"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_GRAVE  U"\u1ec1"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  0x1ec2
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  L"\u1ec2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  U"\u1ec2"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  0x1ec3
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  L"\u1ec3"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  U"\u1ec3"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE  0x1ec4
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE  L"\u1ec4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE  U"\u1ec4"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE  0x1ec5
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE  L"\u1ec5"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_TILDE  U"\u1ec5"
 #define UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW  0x1ec6
-#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW  L"\u1ec6"
+#define UNITEXT_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW  U"\u1ec6"
 #define UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW  0x1ec7
-#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW  L"\u1ec7"
+#define UNITEXT_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX_AND_DOT_BELOW  U"\u1ec7"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_HOOK_ABOVE  0x1ec8
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_HOOK_ABOVE  L"\u1ec8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_HOOK_ABOVE  U"\u1ec8"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_HOOK_ABOVE  0x1ec9
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_HOOK_ABOVE  L"\u1ec9"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_HOOK_ABOVE  U"\u1ec9"
 #define UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DOT_BELOW  0x1eca
-#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_DOT_BELOW  L"\u1eca"
+#define UNITEXT_LATIN_CAPITAL_LETTER_I_WITH_DOT_BELOW  U"\u1eca"
 #define UNICODE_LATIN_SMALL_LETTER_I_WITH_DOT_BELOW  0x1ecb
-#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_DOT_BELOW  L"\u1ecb"
+#define UNITEXT_LATIN_SMALL_LETTER_I_WITH_DOT_BELOW  U"\u1ecb"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DOT_BELOW  0x1ecc
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DOT_BELOW  L"\u1ecc"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_DOT_BELOW  U"\u1ecc"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_DOT_BELOW  0x1ecd
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DOT_BELOW  L"\u1ecd"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_DOT_BELOW  U"\u1ecd"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_HOOK_ABOVE  0x1ece
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HOOK_ABOVE  L"\u1ece"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HOOK_ABOVE  U"\u1ece"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_HOOK_ABOVE  0x1ecf
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HOOK_ABOVE  L"\u1ecf"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HOOK_ABOVE  U"\u1ecf"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE  0x1ed0
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE  L"\u1ed0"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE  U"\u1ed0"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE  0x1ed1
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE  L"\u1ed1"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_ACUTE  U"\u1ed1"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE  0x1ed2
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE  L"\u1ed2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE  U"\u1ed2"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE  0x1ed3
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE  L"\u1ed3"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_GRAVE  U"\u1ed3"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  0x1ed4
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  L"\u1ed4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  U"\u1ed4"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  0x1ed5
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  L"\u1ed5"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_HOOK_ABOVE  U"\u1ed5"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE  0x1ed6
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE  L"\u1ed6"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE  U"\u1ed6"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE  0x1ed7
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE  L"\u1ed7"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_TILDE  U"\u1ed7"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW  0x1ed8
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW  L"\u1ed8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW  U"\u1ed8"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW  0x1ed9
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW  L"\u1ed9"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX_AND_DOT_BELOW  U"\u1ed9"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_ACUTE  0x1eda
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_ACUTE  L"\u1eda"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_ACUTE  U"\u1eda"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_HORN_AND_ACUTE  0x1edb
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN_AND_ACUTE  L"\u1edb"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN_AND_ACUTE  U"\u1edb"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_GRAVE  0x1edc
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_GRAVE  L"\u1edc"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_GRAVE  U"\u1edc"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_HORN_AND_GRAVE  0x1edd
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN_AND_GRAVE  L"\u1edd"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN_AND_GRAVE  U"\u1edd"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_HOOK_ABOVE  0x1ede
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_HOOK_ABOVE  L"\u1ede"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_HOOK_ABOVE  U"\u1ede"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_HORN_AND_HOOK_ABOVE  0x1edf
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN_AND_HOOK_ABOVE  L"\u1edf"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN_AND_HOOK_ABOVE  U"\u1edf"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_TILDE  0x1ee0
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_TILDE  L"\u1ee0"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_TILDE  U"\u1ee0"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_HORN_AND_TILDE  0x1ee1
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN_AND_TILDE  L"\u1ee1"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN_AND_TILDE  U"\u1ee1"
 #define UNICODE_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_DOT_BELOW  0x1ee2
-#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_DOT_BELOW  L"\u1ee2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_O_WITH_HORN_AND_DOT_BELOW  U"\u1ee2"
 #define UNICODE_LATIN_SMALL_LETTER_O_WITH_HORN_AND_DOT_BELOW  0x1ee3
-#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN_AND_DOT_BELOW  L"\u1ee3"
+#define UNITEXT_LATIN_SMALL_LETTER_O_WITH_HORN_AND_DOT_BELOW  U"\u1ee3"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DOT_BELOW  0x1ee4
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DOT_BELOW  L"\u1ee4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_DOT_BELOW  U"\u1ee4"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_DOT_BELOW  0x1ee5
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DOT_BELOW  L"\u1ee5"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_DOT_BELOW  U"\u1ee5"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_HOOK_ABOVE  0x1ee6
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HOOK_ABOVE  L"\u1ee6"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HOOK_ABOVE  U"\u1ee6"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_HOOK_ABOVE  0x1ee7
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HOOK_ABOVE  L"\u1ee7"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HOOK_ABOVE  U"\u1ee7"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_ACUTE  0x1ee8
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_ACUTE  L"\u1ee8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_ACUTE  U"\u1ee8"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_HORN_AND_ACUTE  0x1ee9
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN_AND_ACUTE  L"\u1ee9"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN_AND_ACUTE  U"\u1ee9"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_GRAVE  0x1eea
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_GRAVE  L"\u1eea"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_GRAVE  U"\u1eea"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_HORN_AND_GRAVE  0x1eeb
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN_AND_GRAVE  L"\u1eeb"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN_AND_GRAVE  U"\u1eeb"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_HOOK_ABOVE  0x1eec
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_HOOK_ABOVE  L"\u1eec"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_HOOK_ABOVE  U"\u1eec"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_HORN_AND_HOOK_ABOVE  0x1eed
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN_AND_HOOK_ABOVE  L"\u1eed"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN_AND_HOOK_ABOVE  U"\u1eed"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_TILDE  0x1eee
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_TILDE  L"\u1eee"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_TILDE  U"\u1eee"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_HORN_AND_TILDE  0x1eef
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN_AND_TILDE  L"\u1eef"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN_AND_TILDE  U"\u1eef"
 #define UNICODE_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_DOT_BELOW  0x1ef0
-#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_DOT_BELOW  L"\u1ef0"
+#define UNITEXT_LATIN_CAPITAL_LETTER_U_WITH_HORN_AND_DOT_BELOW  U"\u1ef0"
 #define UNICODE_LATIN_SMALL_LETTER_U_WITH_HORN_AND_DOT_BELOW  0x1ef1
-#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN_AND_DOT_BELOW  L"\u1ef1"
+#define UNITEXT_LATIN_SMALL_LETTER_U_WITH_HORN_AND_DOT_BELOW  U"\u1ef1"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_GRAVE  0x1ef2
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_GRAVE  L"\u1ef2"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_GRAVE  U"\u1ef2"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_GRAVE  0x1ef3
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_GRAVE  L"\u1ef3"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_GRAVE  U"\u1ef3"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_DOT_BELOW  0x1ef4
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_DOT_BELOW  L"\u1ef4"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_DOT_BELOW  U"\u1ef4"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_DOT_BELOW  0x1ef5
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_DOT_BELOW  L"\u1ef5"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_DOT_BELOW  U"\u1ef5"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_HOOK_ABOVE  0x1ef6
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_HOOK_ABOVE  L"\u1ef6"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_HOOK_ABOVE  U"\u1ef6"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_HOOK_ABOVE  0x1ef7
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_HOOK_ABOVE  L"\u1ef7"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_HOOK_ABOVE  U"\u1ef7"
 #define UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_TILDE  0x1ef8
-#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_TILDE  L"\u1ef8"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Y_WITH_TILDE  U"\u1ef8"
 #define UNICODE_LATIN_SMALL_LETTER_Y_WITH_TILDE  0x1ef9
-#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_TILDE  L"\u1ef9"
+#define UNITEXT_LATIN_SMALL_LETTER_Y_WITH_TILDE  U"\u1ef9"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI  0x1f00
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI  L"\u1f00"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI  U"\u1f00"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA  0x1f01
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA  L"\u1f01"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA  U"\u1f01"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_VARIA  0x1f02
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_VARIA  L"\u1f02"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_VARIA  U"\u1f02"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_VARIA  0x1f03
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_VARIA  L"\u1f03"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_VARIA  U"\u1f03"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_OXIA  0x1f04
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_OXIA  L"\u1f04"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_OXIA  U"\u1f04"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_OXIA  0x1f05
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_OXIA  L"\u1f05"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_OXIA  U"\u1f05"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI  0x1f06
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI  L"\u1f06"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI  U"\u1f06"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI  0x1f07
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI  L"\u1f07"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI  U"\u1f07"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI  0x1f08
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI  L"\u1f08"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI  U"\u1f08"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA  0x1f09
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA  L"\u1f09"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA  U"\u1f09"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_VARIA  0x1f0a
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_VARIA  L"\u1f0a"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_VARIA  U"\u1f0a"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_VARIA  0x1f0b
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_VARIA  L"\u1f0b"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_VARIA  U"\u1f0b"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_OXIA  0x1f0c
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_OXIA  L"\u1f0c"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_OXIA  U"\u1f0c"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_OXIA  0x1f0d
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_OXIA  L"\u1f0d"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_OXIA  U"\u1f0d"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI  0x1f0e
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI  L"\u1f0e"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI  U"\u1f0e"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI  0x1f0f
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI  L"\u1f0f"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI  U"\u1f0f"
 #define UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_PSILI  0x1f10
-#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_PSILI  L"\u1f10"
+#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_PSILI  U"\u1f10"
 #define UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_DASIA  0x1f11
-#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_DASIA  L"\u1f11"
+#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_DASIA  U"\u1f11"
 #define UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_PSILI_AND_VARIA  0x1f12
-#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_PSILI_AND_VARIA  L"\u1f12"
+#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_PSILI_AND_VARIA  U"\u1f12"
 #define UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_DASIA_AND_VARIA  0x1f13
-#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_DASIA_AND_VARIA  L"\u1f13"
+#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_DASIA_AND_VARIA  U"\u1f13"
 #define UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_PSILI_AND_OXIA  0x1f14
-#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_PSILI_AND_OXIA  L"\u1f14"
+#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_PSILI_AND_OXIA  U"\u1f14"
 #define UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_DASIA_AND_OXIA  0x1f15
-#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_DASIA_AND_OXIA  L"\u1f15"
+#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_DASIA_AND_OXIA  U"\u1f15"
 #define UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_PSILI  0x1f18
-#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_PSILI  L"\u1f18"
+#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_PSILI  U"\u1f18"
 #define UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_DASIA  0x1f19
-#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_DASIA  L"\u1f19"
+#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_DASIA  U"\u1f19"
 #define UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_PSILI_AND_VARIA  0x1f1a
-#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_PSILI_AND_VARIA  L"\u1f1a"
+#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_PSILI_AND_VARIA  U"\u1f1a"
 #define UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_DASIA_AND_VARIA  0x1f1b
-#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_DASIA_AND_VARIA  L"\u1f1b"
+#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_DASIA_AND_VARIA  U"\u1f1b"
 #define UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_PSILI_AND_OXIA  0x1f1c
-#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_PSILI_AND_OXIA  L"\u1f1c"
+#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_PSILI_AND_OXIA  U"\u1f1c"
 #define UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_DASIA_AND_OXIA  0x1f1d
-#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_DASIA_AND_OXIA  L"\u1f1d"
+#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_DASIA_AND_OXIA  U"\u1f1d"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_PSILI  0x1f20
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI  L"\u1f20"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI  U"\u1f20"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_DASIA  0x1f21
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA  L"\u1f21"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA  U"\u1f21"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_VARIA  0x1f22
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_VARIA  L"\u1f22"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_VARIA  U"\u1f22"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_VARIA  0x1f23
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_VARIA  L"\u1f23"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_VARIA  U"\u1f23"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_OXIA  0x1f24
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_OXIA  L"\u1f24"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_OXIA  U"\u1f24"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_OXIA  0x1f25
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_OXIA  L"\u1f25"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_OXIA  U"\u1f25"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI  0x1f26
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI  L"\u1f26"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI  U"\u1f26"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI  0x1f27
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI  L"\u1f27"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI  U"\u1f27"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI  0x1f28
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI  L"\u1f28"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI  U"\u1f28"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA  0x1f29
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA  L"\u1f29"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA  U"\u1f29"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_VARIA  0x1f2a
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_VARIA  L"\u1f2a"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_VARIA  U"\u1f2a"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_VARIA  0x1f2b
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_VARIA  L"\u1f2b"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_VARIA  U"\u1f2b"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_OXIA  0x1f2c
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_OXIA  L"\u1f2c"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_OXIA  U"\u1f2c"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_OXIA  0x1f2d
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_OXIA  L"\u1f2d"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_OXIA  U"\u1f2d"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI  0x1f2e
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI  L"\u1f2e"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI  U"\u1f2e"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI  0x1f2f
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI  L"\u1f2f"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI  U"\u1f2f"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_PSILI  0x1f30
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_PSILI  L"\u1f30"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_PSILI  U"\u1f30"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DASIA  0x1f31
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DASIA  L"\u1f31"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DASIA  U"\u1f31"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_PSILI_AND_VARIA  0x1f32
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_PSILI_AND_VARIA  L"\u1f32"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_PSILI_AND_VARIA  U"\u1f32"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DASIA_AND_VARIA  0x1f33
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DASIA_AND_VARIA  L"\u1f33"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DASIA_AND_VARIA  U"\u1f33"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_PSILI_AND_OXIA  0x1f34
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_PSILI_AND_OXIA  L"\u1f34"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_PSILI_AND_OXIA  U"\u1f34"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DASIA_AND_OXIA  0x1f35
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DASIA_AND_OXIA  L"\u1f35"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DASIA_AND_OXIA  U"\u1f35"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_PSILI_AND_PERISPOMENI  0x1f36
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_PSILI_AND_PERISPOMENI  L"\u1f36"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_PSILI_AND_PERISPOMENI  U"\u1f36"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DASIA_AND_PERISPOMENI  0x1f37
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DASIA_AND_PERISPOMENI  L"\u1f37"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DASIA_AND_PERISPOMENI  U"\u1f37"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI  0x1f38
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI  L"\u1f38"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI  U"\u1f38"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA  0x1f39
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA  L"\u1f39"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA  U"\u1f39"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI_AND_VARIA  0x1f3a
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI_AND_VARIA  L"\u1f3a"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI_AND_VARIA  U"\u1f3a"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA_AND_VARIA  0x1f3b
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA_AND_VARIA  L"\u1f3b"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA_AND_VARIA  U"\u1f3b"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI_AND_OXIA  0x1f3c
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI_AND_OXIA  L"\u1f3c"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI_AND_OXIA  U"\u1f3c"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA_AND_OXIA  0x1f3d
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA_AND_OXIA  L"\u1f3d"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA_AND_OXIA  U"\u1f3d"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI_AND_PERISPOMENI  0x1f3e
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI_AND_PERISPOMENI  L"\u1f3e"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_PSILI_AND_PERISPOMENI  U"\u1f3e"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA_AND_PERISPOMENI  0x1f3f
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA_AND_PERISPOMENI  L"\u1f3f"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_DASIA_AND_PERISPOMENI  U"\u1f3f"
 #define UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_PSILI  0x1f40
-#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_PSILI  L"\u1f40"
+#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_PSILI  U"\u1f40"
 #define UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_DASIA  0x1f41
-#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_DASIA  L"\u1f41"
+#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_DASIA  U"\u1f41"
 #define UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_PSILI_AND_VARIA  0x1f42
-#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_PSILI_AND_VARIA  L"\u1f42"
+#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_PSILI_AND_VARIA  U"\u1f42"
 #define UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_DASIA_AND_VARIA  0x1f43
-#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_DASIA_AND_VARIA  L"\u1f43"
+#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_DASIA_AND_VARIA  U"\u1f43"
 #define UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_PSILI_AND_OXIA  0x1f44
-#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_PSILI_AND_OXIA  L"\u1f44"
+#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_PSILI_AND_OXIA  U"\u1f44"
 #define UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_DASIA_AND_OXIA  0x1f45
-#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_DASIA_AND_OXIA  L"\u1f45"
+#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_DASIA_AND_OXIA  U"\u1f45"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_PSILI  0x1f48
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_PSILI  L"\u1f48"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_PSILI  U"\u1f48"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_DASIA  0x1f49
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_DASIA  L"\u1f49"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_DASIA  U"\u1f49"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_PSILI_AND_VARIA  0x1f4a
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_PSILI_AND_VARIA  L"\u1f4a"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_PSILI_AND_VARIA  U"\u1f4a"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_DASIA_AND_VARIA  0x1f4b
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_DASIA_AND_VARIA  L"\u1f4b"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_DASIA_AND_VARIA  U"\u1f4b"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_PSILI_AND_OXIA  0x1f4c
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_PSILI_AND_OXIA  L"\u1f4c"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_PSILI_AND_OXIA  U"\u1f4c"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_DASIA_AND_OXIA  0x1f4d
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_DASIA_AND_OXIA  L"\u1f4d"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_DASIA_AND_OXIA  U"\u1f4d"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI  0x1f50
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI  L"\u1f50"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI  U"\u1f50"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA  0x1f51
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA  L"\u1f51"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA  U"\u1f51"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI_AND_VARIA  0x1f52
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI_AND_VARIA  L"\u1f52"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI_AND_VARIA  U"\u1f52"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA_AND_VARIA  0x1f53
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA_AND_VARIA  L"\u1f53"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA_AND_VARIA  U"\u1f53"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI_AND_OXIA  0x1f54
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI_AND_OXIA  L"\u1f54"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI_AND_OXIA  U"\u1f54"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA_AND_OXIA  0x1f55
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA_AND_OXIA  L"\u1f55"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA_AND_OXIA  U"\u1f55"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI_AND_PERISPOMENI  0x1f56
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI_AND_PERISPOMENI  L"\u1f56"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_PSILI_AND_PERISPOMENI  U"\u1f56"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA_AND_PERISPOMENI  0x1f57
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA_AND_PERISPOMENI  L"\u1f57"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DASIA_AND_PERISPOMENI  U"\u1f57"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA  0x1f59
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA  L"\u1f59"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA  U"\u1f59"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA_AND_VARIA  0x1f5b
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA_AND_VARIA  L"\u1f5b"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA_AND_VARIA  U"\u1f5b"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA_AND_OXIA  0x1f5d
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA_AND_OXIA  L"\u1f5d"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA_AND_OXIA  U"\u1f5d"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA_AND_PERISPOMENI  0x1f5f
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA_AND_PERISPOMENI  L"\u1f5f"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_DASIA_AND_PERISPOMENI  U"\u1f5f"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI  0x1f60
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI  L"\u1f60"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI  U"\u1f60"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA  0x1f61
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA  L"\u1f61"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA  U"\u1f61"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_VARIA  0x1f62
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_VARIA  L"\u1f62"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_VARIA  U"\u1f62"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_VARIA  0x1f63
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_VARIA  L"\u1f63"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_VARIA  U"\u1f63"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_OXIA  0x1f64
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_OXIA  L"\u1f64"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_OXIA  U"\u1f64"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_OXIA  0x1f65
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_OXIA  L"\u1f65"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_OXIA  U"\u1f65"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI  0x1f66
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI  L"\u1f66"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI  U"\u1f66"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI  0x1f67
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI  L"\u1f67"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI  U"\u1f67"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI  0x1f68
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI  L"\u1f68"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI  U"\u1f68"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA  0x1f69
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA  L"\u1f69"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA  U"\u1f69"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_VARIA  0x1f6a
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_VARIA  L"\u1f6a"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_VARIA  U"\u1f6a"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_VARIA  0x1f6b
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_VARIA  L"\u1f6b"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_VARIA  U"\u1f6b"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_OXIA  0x1f6c
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_OXIA  L"\u1f6c"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_OXIA  U"\u1f6c"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_OXIA  0x1f6d
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_OXIA  L"\u1f6d"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_OXIA  U"\u1f6d"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI  0x1f6e
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI  L"\u1f6e"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI  U"\u1f6e"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI  0x1f6f
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI  L"\u1f6f"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI  U"\u1f6f"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_VARIA  0x1f70
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_VARIA  L"\u1f70"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_VARIA  U"\u1f70"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_OXIA  0x1f71
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_OXIA  L"\u1f71"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_OXIA  U"\u1f71"
 #define UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_VARIA  0x1f72
-#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_VARIA  L"\u1f72"
+#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_VARIA  U"\u1f72"
 #define UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_OXIA  0x1f73
-#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_OXIA  L"\u1f73"
+#define UNITEXT_GREEK_SMALL_LETTER_EPSILON_WITH_OXIA  U"\u1f73"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_VARIA  0x1f74
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_VARIA  L"\u1f74"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_VARIA  U"\u1f74"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_OXIA  0x1f75
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_OXIA  L"\u1f75"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_OXIA  U"\u1f75"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_VARIA  0x1f76
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_VARIA  L"\u1f76"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_VARIA  U"\u1f76"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_OXIA  0x1f77
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_OXIA  L"\u1f77"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_OXIA  U"\u1f77"
 #define UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_VARIA  0x1f78
-#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_VARIA  L"\u1f78"
+#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_VARIA  U"\u1f78"
 #define UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_OXIA  0x1f79
-#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_OXIA  L"\u1f79"
+#define UNITEXT_GREEK_SMALL_LETTER_OMICRON_WITH_OXIA  U"\u1f79"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_VARIA  0x1f7a
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_VARIA  L"\u1f7a"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_VARIA  U"\u1f7a"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_OXIA  0x1f7b
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_OXIA  L"\u1f7b"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_OXIA  U"\u1f7b"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_VARIA  0x1f7c
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_VARIA  L"\u1f7c"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_VARIA  U"\u1f7c"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_OXIA  0x1f7d
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_OXIA  L"\u1f7d"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_OXIA  U"\u1f7d"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_YPOGEGRAMMENI  0x1f80
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_YPOGEGRAMMENI  L"\u1f80"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_YPOGEGRAMMENI  U"\u1f80"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_YPOGEGRAMMENI  0x1f81
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_YPOGEGRAMMENI  L"\u1f81"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_YPOGEGRAMMENI  U"\u1f81"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_VARIA_AND_YPOGEGRAMMENI  0x1f82
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_VARIA_AND_YPOGEGRAMMENI  L"\u1f82"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_VARIA_AND_YPOGEGRAMMENI  U"\u1f82"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_VARIA_AND_YPOGEGRAMMENI  0x1f83
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_VARIA_AND_YPOGEGRAMMENI  L"\u1f83"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_VARIA_AND_YPOGEGRAMMENI  U"\u1f83"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_OXIA_AND_YPOGEGRAMMENI  0x1f84
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_OXIA_AND_YPOGEGRAMMENI  L"\u1f84"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_OXIA_AND_YPOGEGRAMMENI  U"\u1f84"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_OXIA_AND_YPOGEGRAMMENI  0x1f85
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_OXIA_AND_YPOGEGRAMMENI  L"\u1f85"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_OXIA_AND_YPOGEGRAMMENI  U"\u1f85"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI_AND_YPOGEGRAMMENI  0x1f86
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI_AND_YPOGEGRAMMENI  L"\u1f86"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI_AND_YPOGEGRAMMENI  U"\u1f86"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI_AND_YPOGEGRAMMENI  0x1f87
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI_AND_YPOGEGRAMMENI  L"\u1f87"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI_AND_YPOGEGRAMMENI  U"\u1f87"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_PROSGEGRAMMENI  0x1f88
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_PROSGEGRAMMENI  L"\u1f88"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_PROSGEGRAMMENI  U"\u1f88"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_PROSGEGRAMMENI  0x1f89
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_PROSGEGRAMMENI  L"\u1f89"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_PROSGEGRAMMENI  U"\u1f89"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_VARIA_AND_PROSGEGRAMMENI  0x1f8a
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_VARIA_AND_PROSGEGRAMMENI  L"\u1f8a"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_VARIA_AND_PROSGEGRAMMENI  U"\u1f8a"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_VARIA_AND_PROSGEGRAMMENI  0x1f8b
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_VARIA_AND_PROSGEGRAMMENI  L"\u1f8b"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_VARIA_AND_PROSGEGRAMMENI  U"\u1f8b"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_OXIA_AND_PROSGEGRAMMENI  0x1f8c
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_OXIA_AND_PROSGEGRAMMENI  L"\u1f8c"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_OXIA_AND_PROSGEGRAMMENI  U"\u1f8c"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_OXIA_AND_PROSGEGRAMMENI  0x1f8d
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_OXIA_AND_PROSGEGRAMMENI  L"\u1f8d"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_OXIA_AND_PROSGEGRAMMENI  U"\u1f8d"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI_AND_PROSGEGRAMMENI  0x1f8e
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI_AND_PROSGEGRAMMENI  L"\u1f8e"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PSILI_AND_PERISPOMENI_AND_PROSGEGRAMMENI  U"\u1f8e"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI_AND_PROSGEGRAMMENI  0x1f8f
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI_AND_PROSGEGRAMMENI  L"\u1f8f"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_DASIA_AND_PERISPOMENI_AND_PROSGEGRAMMENI  U"\u1f8f"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_YPOGEGRAMMENI  0x1f90
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_YPOGEGRAMMENI  L"\u1f90"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_YPOGEGRAMMENI  U"\u1f90"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_YPOGEGRAMMENI  0x1f91
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_YPOGEGRAMMENI  L"\u1f91"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_YPOGEGRAMMENI  U"\u1f91"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_VARIA_AND_YPOGEGRAMMENI  0x1f92
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_VARIA_AND_YPOGEGRAMMENI  L"\u1f92"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_VARIA_AND_YPOGEGRAMMENI  U"\u1f92"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_VARIA_AND_YPOGEGRAMMENI  0x1f93
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_VARIA_AND_YPOGEGRAMMENI  L"\u1f93"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_VARIA_AND_YPOGEGRAMMENI  U"\u1f93"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_OXIA_AND_YPOGEGRAMMENI  0x1f94
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_OXIA_AND_YPOGEGRAMMENI  L"\u1f94"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_OXIA_AND_YPOGEGRAMMENI  U"\u1f94"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_OXIA_AND_YPOGEGRAMMENI  0x1f95
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_OXIA_AND_YPOGEGRAMMENI  L"\u1f95"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_OXIA_AND_YPOGEGRAMMENI  U"\u1f95"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI_AND_YPOGEGRAMMENI  0x1f96
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI_AND_YPOGEGRAMMENI  L"\u1f96"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI_AND_YPOGEGRAMMENI  U"\u1f96"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI_AND_YPOGEGRAMMENI  0x1f97
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI_AND_YPOGEGRAMMENI  L"\u1f97"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI_AND_YPOGEGRAMMENI  U"\u1f97"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_PROSGEGRAMMENI  0x1f98
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_PROSGEGRAMMENI  L"\u1f98"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_PROSGEGRAMMENI  U"\u1f98"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_PROSGEGRAMMENI  0x1f99
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_PROSGEGRAMMENI  L"\u1f99"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_PROSGEGRAMMENI  U"\u1f99"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_VARIA_AND_PROSGEGRAMMENI  0x1f9a
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_VARIA_AND_PROSGEGRAMMENI  L"\u1f9a"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_VARIA_AND_PROSGEGRAMMENI  U"\u1f9a"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_VARIA_AND_PROSGEGRAMMENI  0x1f9b
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_VARIA_AND_PROSGEGRAMMENI  L"\u1f9b"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_VARIA_AND_PROSGEGRAMMENI  U"\u1f9b"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_OXIA_AND_PROSGEGRAMMENI  0x1f9c
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_OXIA_AND_PROSGEGRAMMENI  L"\u1f9c"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_OXIA_AND_PROSGEGRAMMENI  U"\u1f9c"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_OXIA_AND_PROSGEGRAMMENI  0x1f9d
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_OXIA_AND_PROSGEGRAMMENI  L"\u1f9d"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_OXIA_AND_PROSGEGRAMMENI  U"\u1f9d"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI_AND_PROSGEGRAMMENI  0x1f9e
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI_AND_PROSGEGRAMMENI  L"\u1f9e"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PSILI_AND_PERISPOMENI_AND_PROSGEGRAMMENI  U"\u1f9e"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI_AND_PROSGEGRAMMENI  0x1f9f
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI_AND_PROSGEGRAMMENI  L"\u1f9f"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_DASIA_AND_PERISPOMENI_AND_PROSGEGRAMMENI  U"\u1f9f"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_YPOGEGRAMMENI  0x1fa0
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_YPOGEGRAMMENI  L"\u1fa0"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_YPOGEGRAMMENI  U"\u1fa0"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_YPOGEGRAMMENI  0x1fa1
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_YPOGEGRAMMENI  L"\u1fa1"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_YPOGEGRAMMENI  U"\u1fa1"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_VARIA_AND_YPOGEGRAMMENI  0x1fa2
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_VARIA_AND_YPOGEGRAMMENI  L"\u1fa2"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_VARIA_AND_YPOGEGRAMMENI  U"\u1fa2"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_VARIA_AND_YPOGEGRAMMENI  0x1fa3
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_VARIA_AND_YPOGEGRAMMENI  L"\u1fa3"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_VARIA_AND_YPOGEGRAMMENI  U"\u1fa3"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_OXIA_AND_YPOGEGRAMMENI  0x1fa4
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_OXIA_AND_YPOGEGRAMMENI  L"\u1fa4"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_OXIA_AND_YPOGEGRAMMENI  U"\u1fa4"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_OXIA_AND_YPOGEGRAMMENI  0x1fa5
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_OXIA_AND_YPOGEGRAMMENI  L"\u1fa5"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_OXIA_AND_YPOGEGRAMMENI  U"\u1fa5"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI_AND_YPOGEGRAMMENI  0x1fa6
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI_AND_YPOGEGRAMMENI  L"\u1fa6"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI_AND_YPOGEGRAMMENI  U"\u1fa6"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI_AND_YPOGEGRAMMENI  0x1fa7
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI_AND_YPOGEGRAMMENI  L"\u1fa7"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI_AND_YPOGEGRAMMENI  U"\u1fa7"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_PROSGEGRAMMENI  0x1fa8
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_PROSGEGRAMMENI  L"\u1fa8"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_PROSGEGRAMMENI  U"\u1fa8"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_PROSGEGRAMMENI  0x1fa9
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_PROSGEGRAMMENI  L"\u1fa9"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_PROSGEGRAMMENI  U"\u1fa9"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_VARIA_AND_PROSGEGRAMMENI  0x1faa
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_VARIA_AND_PROSGEGRAMMENI  L"\u1faa"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_VARIA_AND_PROSGEGRAMMENI  U"\u1faa"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_VARIA_AND_PROSGEGRAMMENI  0x1fab
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_VARIA_AND_PROSGEGRAMMENI  L"\u1fab"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_VARIA_AND_PROSGEGRAMMENI  U"\u1fab"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_OXIA_AND_PROSGEGRAMMENI  0x1fac
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_OXIA_AND_PROSGEGRAMMENI  L"\u1fac"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_OXIA_AND_PROSGEGRAMMENI  U"\u1fac"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_OXIA_AND_PROSGEGRAMMENI  0x1fad
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_OXIA_AND_PROSGEGRAMMENI  L"\u1fad"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_OXIA_AND_PROSGEGRAMMENI  U"\u1fad"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI_AND_PROSGEGRAMMENI  0x1fae
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI_AND_PROSGEGRAMMENI  L"\u1fae"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PSILI_AND_PERISPOMENI_AND_PROSGEGRAMMENI  U"\u1fae"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI_AND_PROSGEGRAMMENI  0x1faf
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI_AND_PROSGEGRAMMENI  L"\u1faf"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_DASIA_AND_PERISPOMENI_AND_PROSGEGRAMMENI  U"\u1faf"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_VRACHY  0x1fb0
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_VRACHY  L"\u1fb0"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_VRACHY  U"\u1fb0"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_MACRON  0x1fb1
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_MACRON  L"\u1fb1"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_MACRON  U"\u1fb1"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_VARIA_AND_YPOGEGRAMMENI  0x1fb2
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_VARIA_AND_YPOGEGRAMMENI  L"\u1fb2"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_VARIA_AND_YPOGEGRAMMENI  U"\u1fb2"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_YPOGEGRAMMENI  0x1fb3
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_YPOGEGRAMMENI  L"\u1fb3"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_YPOGEGRAMMENI  U"\u1fb3"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_OXIA_AND_YPOGEGRAMMENI  0x1fb4
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_OXIA_AND_YPOGEGRAMMENI  L"\u1fb4"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_OXIA_AND_YPOGEGRAMMENI  U"\u1fb4"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_PERISPOMENI  0x1fb6
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PERISPOMENI  L"\u1fb6"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PERISPOMENI  U"\u1fb6"
 #define UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_PERISPOMENI_AND_YPOGEGRAMMENI  0x1fb7
-#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PERISPOMENI_AND_YPOGEGRAMMENI  L"\u1fb7"
+#define UNITEXT_GREEK_SMALL_LETTER_ALPHA_WITH_PERISPOMENI_AND_YPOGEGRAMMENI  U"\u1fb7"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_VRACHY  0x1fb8
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_VRACHY  L"\u1fb8"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_VRACHY  U"\u1fb8"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_MACRON  0x1fb9
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_MACRON  L"\u1fb9"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_MACRON  U"\u1fb9"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_VARIA  0x1fba
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_VARIA  L"\u1fba"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_VARIA  U"\u1fba"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_OXIA  0x1fbb
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_OXIA  L"\u1fbb"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_OXIA  U"\u1fbb"
 #define UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_PROSGEGRAMMENI  0x1fbc
-#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PROSGEGRAMMENI  L"\u1fbc"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ALPHA_WITH_PROSGEGRAMMENI  U"\u1fbc"
 #define UNICODE_GREEK_KORONIS  0x1fbd
-#define UNITEXT_GREEK_KORONIS  L"\u1fbd"
+#define UNITEXT_GREEK_KORONIS  U"\u1fbd"
 #define UNICODE_GREEK_PROSGEGRAMMENI  0x1fbe
-#define UNITEXT_GREEK_PROSGEGRAMMENI  L"\u1fbe"
+#define UNITEXT_GREEK_PROSGEGRAMMENI  U"\u1fbe"
 #define UNICODE_GREEK_PSILI  0x1fbf
-#define UNITEXT_GREEK_PSILI  L"\u1fbf"
+#define UNITEXT_GREEK_PSILI  U"\u1fbf"
 #define UNICODE_GREEK_PERISPOMENI  0x1fc0
-#define UNITEXT_GREEK_PERISPOMENI  L"\u1fc0"
+#define UNITEXT_GREEK_PERISPOMENI  U"\u1fc0"
 #define UNICODE_GREEK_DIALYTIKA_AND_PERISPOMENI  0x1fc1
-#define UNITEXT_GREEK_DIALYTIKA_AND_PERISPOMENI  L"\u1fc1"
+#define UNITEXT_GREEK_DIALYTIKA_AND_PERISPOMENI  U"\u1fc1"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_VARIA_AND_YPOGEGRAMMENI  0x1fc2
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_VARIA_AND_YPOGEGRAMMENI  L"\u1fc2"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_VARIA_AND_YPOGEGRAMMENI  U"\u1fc2"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_YPOGEGRAMMENI  0x1fc3
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_YPOGEGRAMMENI  L"\u1fc3"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_YPOGEGRAMMENI  U"\u1fc3"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_OXIA_AND_YPOGEGRAMMENI  0x1fc4
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_OXIA_AND_YPOGEGRAMMENI  L"\u1fc4"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_OXIA_AND_YPOGEGRAMMENI  U"\u1fc4"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_PERISPOMENI  0x1fc6
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PERISPOMENI  L"\u1fc6"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PERISPOMENI  U"\u1fc6"
 #define UNICODE_GREEK_SMALL_LETTER_ETA_WITH_PERISPOMENI_AND_YPOGEGRAMMENI  0x1fc7
-#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PERISPOMENI_AND_YPOGEGRAMMENI  L"\u1fc7"
+#define UNITEXT_GREEK_SMALL_LETTER_ETA_WITH_PERISPOMENI_AND_YPOGEGRAMMENI  U"\u1fc7"
 #define UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_VARIA  0x1fc8
-#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_VARIA  L"\u1fc8"
+#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_VARIA  U"\u1fc8"
 #define UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_OXIA  0x1fc9
-#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_OXIA  L"\u1fc9"
+#define UNITEXT_GREEK_CAPITAL_LETTER_EPSILON_WITH_OXIA  U"\u1fc9"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_VARIA  0x1fca
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_VARIA  L"\u1fca"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_VARIA  U"\u1fca"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_OXIA  0x1fcb
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_OXIA  L"\u1fcb"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_OXIA  U"\u1fcb"
 #define UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_PROSGEGRAMMENI  0x1fcc
-#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PROSGEGRAMMENI  L"\u1fcc"
+#define UNITEXT_GREEK_CAPITAL_LETTER_ETA_WITH_PROSGEGRAMMENI  U"\u1fcc"
 #define UNICODE_GREEK_PSILI_AND_VARIA  0x1fcd
-#define UNITEXT_GREEK_PSILI_AND_VARIA  L"\u1fcd"
+#define UNITEXT_GREEK_PSILI_AND_VARIA  U"\u1fcd"
 #define UNICODE_GREEK_PSILI_AND_OXIA  0x1fce
-#define UNITEXT_GREEK_PSILI_AND_OXIA  L"\u1fce"
+#define UNITEXT_GREEK_PSILI_AND_OXIA  U"\u1fce"
 #define UNICODE_GREEK_PSILI_AND_PERISPOMENI  0x1fcf
-#define UNITEXT_GREEK_PSILI_AND_PERISPOMENI  L"\u1fcf"
+#define UNITEXT_GREEK_PSILI_AND_PERISPOMENI  U"\u1fcf"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_VRACHY  0x1fd0
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_VRACHY  L"\u1fd0"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_VRACHY  U"\u1fd0"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_MACRON  0x1fd1
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_MACRON  L"\u1fd1"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_MACRON  U"\u1fd1"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_VARIA  0x1fd2
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_VARIA  L"\u1fd2"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_VARIA  U"\u1fd2"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_OXIA  0x1fd3
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_OXIA  L"\u1fd3"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_OXIA  U"\u1fd3"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_PERISPOMENI  0x1fd6
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_PERISPOMENI  L"\u1fd6"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_PERISPOMENI  U"\u1fd6"
 #define UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_PERISPOMENI  0x1fd7
-#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_PERISPOMENI  L"\u1fd7"
+#define UNITEXT_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_PERISPOMENI  U"\u1fd7"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_VRACHY  0x1fd8
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_VRACHY  L"\u1fd8"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_VRACHY  U"\u1fd8"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_MACRON  0x1fd9
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_MACRON  L"\u1fd9"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_MACRON  U"\u1fd9"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_VARIA  0x1fda
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_VARIA  L"\u1fda"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_VARIA  U"\u1fda"
 #define UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_OXIA  0x1fdb
-#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_OXIA  L"\u1fdb"
+#define UNITEXT_GREEK_CAPITAL_LETTER_IOTA_WITH_OXIA  U"\u1fdb"
 #define UNICODE_GREEK_DASIA_AND_VARIA  0x1fdd
-#define UNITEXT_GREEK_DASIA_AND_VARIA  L"\u1fdd"
+#define UNITEXT_GREEK_DASIA_AND_VARIA  U"\u1fdd"
 #define UNICODE_GREEK_DASIA_AND_OXIA  0x1fde
-#define UNITEXT_GREEK_DASIA_AND_OXIA  L"\u1fde"
+#define UNITEXT_GREEK_DASIA_AND_OXIA  U"\u1fde"
 #define UNICODE_GREEK_DASIA_AND_PERISPOMENI  0x1fdf
-#define UNITEXT_GREEK_DASIA_AND_PERISPOMENI  L"\u1fdf"
+#define UNITEXT_GREEK_DASIA_AND_PERISPOMENI  U"\u1fdf"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_VRACHY  0x1fe0
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_VRACHY  L"\u1fe0"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_VRACHY  U"\u1fe0"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_MACRON  0x1fe1
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_MACRON  L"\u1fe1"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_MACRON  U"\u1fe1"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_VARIA  0x1fe2
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_VARIA  L"\u1fe2"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_VARIA  U"\u1fe2"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_OXIA  0x1fe3
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_OXIA  L"\u1fe3"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_OXIA  U"\u1fe3"
 #define UNICODE_GREEK_SMALL_LETTER_RHO_WITH_PSILI  0x1fe4
-#define UNITEXT_GREEK_SMALL_LETTER_RHO_WITH_PSILI  L"\u1fe4"
+#define UNITEXT_GREEK_SMALL_LETTER_RHO_WITH_PSILI  U"\u1fe4"
 #define UNICODE_GREEK_SMALL_LETTER_RHO_WITH_DASIA  0x1fe5
-#define UNITEXT_GREEK_SMALL_LETTER_RHO_WITH_DASIA  L"\u1fe5"
+#define UNITEXT_GREEK_SMALL_LETTER_RHO_WITH_DASIA  U"\u1fe5"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_PERISPOMENI  0x1fe6
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_PERISPOMENI  L"\u1fe6"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_PERISPOMENI  U"\u1fe6"
 #define UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_PERISPOMENI  0x1fe7
-#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_PERISPOMENI  L"\u1fe7"
+#define UNITEXT_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_PERISPOMENI  U"\u1fe7"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_VRACHY  0x1fe8
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_VRACHY  L"\u1fe8"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_VRACHY  U"\u1fe8"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_MACRON  0x1fe9
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_MACRON  L"\u1fe9"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_MACRON  U"\u1fe9"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_VARIA  0x1fea
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_VARIA  L"\u1fea"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_VARIA  U"\u1fea"
 #define UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_OXIA  0x1feb
-#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_OXIA  L"\u1feb"
+#define UNITEXT_GREEK_CAPITAL_LETTER_UPSILON_WITH_OXIA  U"\u1feb"
 #define UNICODE_GREEK_CAPITAL_LETTER_RHO_WITH_DASIA  0x1fec
-#define UNITEXT_GREEK_CAPITAL_LETTER_RHO_WITH_DASIA  L"\u1fec"
+#define UNITEXT_GREEK_CAPITAL_LETTER_RHO_WITH_DASIA  U"\u1fec"
 #define UNICODE_GREEK_DIALYTIKA_AND_VARIA  0x1fed
-#define UNITEXT_GREEK_DIALYTIKA_AND_VARIA  L"\u1fed"
+#define UNITEXT_GREEK_DIALYTIKA_AND_VARIA  U"\u1fed"
 #define UNICODE_GREEK_DIALYTIKA_AND_OXIA  0x1fee
-#define UNITEXT_GREEK_DIALYTIKA_AND_OXIA  L"\u1fee"
+#define UNITEXT_GREEK_DIALYTIKA_AND_OXIA  U"\u1fee"
 #define UNICODE_GREEK_VARIA  0x1fef
-#define UNITEXT_GREEK_VARIA  L"\u1fef"
+#define UNITEXT_GREEK_VARIA  U"\u1fef"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_VARIA_AND_YPOGEGRAMMENI  0x1ff2
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_VARIA_AND_YPOGEGRAMMENI  L"\u1ff2"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_VARIA_AND_YPOGEGRAMMENI  U"\u1ff2"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_YPOGEGRAMMENI  0x1ff3
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_YPOGEGRAMMENI  L"\u1ff3"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_YPOGEGRAMMENI  U"\u1ff3"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_OXIA_AND_YPOGEGRAMMENI  0x1ff4
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_OXIA_AND_YPOGEGRAMMENI  L"\u1ff4"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_OXIA_AND_YPOGEGRAMMENI  U"\u1ff4"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_PERISPOMENI  0x1ff6
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PERISPOMENI  L"\u1ff6"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PERISPOMENI  U"\u1ff6"
 #define UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_PERISPOMENI_AND_YPOGEGRAMMENI  0x1ff7
-#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PERISPOMENI_AND_YPOGEGRAMMENI  L"\u1ff7"
+#define UNITEXT_GREEK_SMALL_LETTER_OMEGA_WITH_PERISPOMENI_AND_YPOGEGRAMMENI  U"\u1ff7"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_VARIA  0x1ff8
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_VARIA  L"\u1ff8"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_VARIA  U"\u1ff8"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_OXIA  0x1ff9
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_OXIA  L"\u1ff9"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMICRON_WITH_OXIA  U"\u1ff9"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_VARIA  0x1ffa
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_VARIA  L"\u1ffa"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_VARIA  U"\u1ffa"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_OXIA  0x1ffb
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_OXIA  L"\u1ffb"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_OXIA  U"\u1ffb"
 #define UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_PROSGEGRAMMENI  0x1ffc
-#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PROSGEGRAMMENI  L"\u1ffc"
+#define UNITEXT_GREEK_CAPITAL_LETTER_OMEGA_WITH_PROSGEGRAMMENI  U"\u1ffc"
 #define UNICODE_GREEK_OXIA  0x1ffd
-#define UNITEXT_GREEK_OXIA  L"\u1ffd"
+#define UNITEXT_GREEK_OXIA  U"\u1ffd"
 #define UNICODE_GREEK_DASIA  0x1ffe
-#define UNITEXT_GREEK_DASIA  L"\u1ffe"
+#define UNITEXT_GREEK_DASIA  U"\u1ffe"
 #define UNICODE_EN_QUAD  0x2000
-#define UNITEXT_EN_QUAD  L"\u2000"
+#define UNITEXT_EN_QUAD  U"\u2000"
 #define UNICODE_EM_QUAD  0x2001
-#define UNITEXT_EM_QUAD  L"\u2001"
+#define UNITEXT_EM_QUAD  U"\u2001"
 #define UNICODE_EN_SPACE  0x2002
-#define UNITEXT_EN_SPACE  L"\u2002"
+#define UNITEXT_EN_SPACE  U"\u2002"
 #define UNICODE_EM_SPACE  0x2003
-#define UNITEXT_EM_SPACE  L"\u2003"
+#define UNITEXT_EM_SPACE  U"\u2003"
 #define UNICODE_THREE_PER_EM_SPACE  0x2004
-#define UNITEXT_THREE_PER_EM_SPACE  L"\u2004"
+#define UNITEXT_THREE_PER_EM_SPACE  U"\u2004"
 #define UNICODE_FOUR_PER_EM_SPACE  0x2005
-#define UNITEXT_FOUR_PER_EM_SPACE  L"\u2005"
+#define UNITEXT_FOUR_PER_EM_SPACE  U"\u2005"
 #define UNICODE_SIX_PER_EM_SPACE  0x2006
-#define UNITEXT_SIX_PER_EM_SPACE  L"\u2006"
+#define UNITEXT_SIX_PER_EM_SPACE  U"\u2006"
 #define UNICODE_FIGURE_SPACE  0x2007
-#define UNITEXT_FIGURE_SPACE  L"\u2007"
+#define UNITEXT_FIGURE_SPACE  U"\u2007"
 #define UNICODE_PUNCTUATION_SPACE  0x2008
-#define UNITEXT_PUNCTUATION_SPACE  L"\u2008"
+#define UNITEXT_PUNCTUATION_SPACE  U"\u2008"
 #define UNICODE_THIN_SPACE  0x2009
-#define UNITEXT_THIN_SPACE  L"\u2009"
+#define UNITEXT_THIN_SPACE  U"\u2009"
 #define UNICODE_HAIR_SPACE  0x200a
-#define UNITEXT_HAIR_SPACE  L"\u200a"
+#define UNITEXT_HAIR_SPACE  U"\u200a"
 #define UNICODE_ZERO_WIDTH_SPACE  0x200b
-#define UNITEXT_ZERO_WIDTH_SPACE  L"\u200b"
+#define UNITEXT_ZERO_WIDTH_SPACE  U"\u200b"
 #define UNICODE_ZERO_WIDTH_NON_JOINER  0x200c
-#define UNITEXT_ZERO_WIDTH_NON_JOINER  L"\u200c"
+#define UNITEXT_ZERO_WIDTH_NON_JOINER  U"\u200c"
 #define UNICODE_ZERO_WIDTH_JOINER  0x200d
-#define UNITEXT_ZERO_WIDTH_JOINER  L"\u200d"
+#define UNITEXT_ZERO_WIDTH_JOINER  U"\u200d"
 #define UNICODE_LEFT_TO_RIGHT_MARK  0x200e
-#define UNITEXT_LEFT_TO_RIGHT_MARK  L"\u200e"
+#define UNITEXT_LEFT_TO_RIGHT_MARK  U"\u200e"
 #define UNICODE_RIGHT_TO_LEFT_MARK  0x200f
-#define UNITEXT_RIGHT_TO_LEFT_MARK  L"\u200f"
+#define UNITEXT_RIGHT_TO_LEFT_MARK  U"\u200f"
 #define UNICODE_HYPHEN  0x2010
-#define UNITEXT_HYPHEN  L"\u2010"
+#define UNITEXT_HYPHEN  U"\u2010"
 #define UNICODE_NON_BREAKING_HYPHEN  0x2011
-#define UNITEXT_NON_BREAKING_HYPHEN  L"\u2011"
+#define UNITEXT_NON_BREAKING_HYPHEN  U"\u2011"
 #define UNICODE_FIGURE_DASH  0x2012
-#define UNITEXT_FIGURE_DASH  L"\u2012"
+#define UNITEXT_FIGURE_DASH  U"\u2012"
 #define UNICODE_EN_DASH  0x2013
-#define UNITEXT_EN_DASH  L"\u2013"
+#define UNITEXT_EN_DASH  U"\u2013"
 #define UNICODE_EM_DASH  0x2014
-#define UNITEXT_EM_DASH  L"\u2014"
+#define UNITEXT_EM_DASH  U"\u2014"
 #define UNICODE_HORIZONTAL_BAR  0x2015
-#define UNITEXT_HORIZONTAL_BAR  L"\u2015"
+#define UNITEXT_HORIZONTAL_BAR  U"\u2015"
 #define UNICODE_DOUBLE_VERTICAL_LINE  0x2016
-#define UNITEXT_DOUBLE_VERTICAL_LINE  L"\u2016"
+#define UNITEXT_DOUBLE_VERTICAL_LINE  U"\u2016"
 #define UNICODE_DOUBLE_LOW_LINE  0x2017
-#define UNITEXT_DOUBLE_LOW_LINE  L"\u2017"
+#define UNITEXT_DOUBLE_LOW_LINE  U"\u2017"
 #define UNICODE_LEFT_SINGLE_QUOTATION_MARK  0x2018
-#define UNITEXT_LEFT_SINGLE_QUOTATION_MARK  L"\u2018"
+#define UNITEXT_LEFT_SINGLE_QUOTATION_MARK  U"\u2018"
 #define UNICODE_RIGHT_SINGLE_QUOTATION_MARK  0x2019
-#define UNITEXT_RIGHT_SINGLE_QUOTATION_MARK  L"\u2019"
+#define UNITEXT_RIGHT_SINGLE_QUOTATION_MARK  U"\u2019"
 #define UNICODE_SINGLE_LOW_9_QUOTATION_MARK  0x201a
-#define UNITEXT_SINGLE_LOW_9_QUOTATION_MARK  L"\u201a"
+#define UNITEXT_SINGLE_LOW_9_QUOTATION_MARK  U"\u201a"
 #define UNICODE_SINGLE_HIGH_REVERSED_9_QUOTATION_MARK  0x201b
-#define UNITEXT_SINGLE_HIGH_REVERSED_9_QUOTATION_MARK  L"\u201b"
+#define UNITEXT_SINGLE_HIGH_REVERSED_9_QUOTATION_MARK  U"\u201b"
 #define UNICODE_LEFT_DOUBLE_QUOTATION_MARK  0x201c
-#define UNITEXT_LEFT_DOUBLE_QUOTATION_MARK  L"\u201c"
+#define UNITEXT_LEFT_DOUBLE_QUOTATION_MARK  U"\u201c"
 #define UNICODE_RIGHT_DOUBLE_QUOTATION_MARK  0x201d
-#define UNITEXT_RIGHT_DOUBLE_QUOTATION_MARK  L"\u201d"
+#define UNITEXT_RIGHT_DOUBLE_QUOTATION_MARK  U"\u201d"
 #define UNICODE_DOUBLE_LOW_9_QUOTATION_MARK  0x201e
-#define UNITEXT_DOUBLE_LOW_9_QUOTATION_MARK  L"\u201e"
+#define UNITEXT_DOUBLE_LOW_9_QUOTATION_MARK  U"\u201e"
 #define UNICODE_DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK  0x201f
-#define UNITEXT_DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK  L"\u201f"
+#define UNITEXT_DOUBLE_HIGH_REVERSED_9_QUOTATION_MARK  U"\u201f"
 #define UNICODE_DAGGER  0x2020
-#define UNITEXT_DAGGER  L"\u2020"
+#define UNITEXT_DAGGER  U"\u2020"
 #define UNICODE_DOUBLE_DAGGER  0x2021
-#define UNITEXT_DOUBLE_DAGGER  L"\u2021"
+#define UNITEXT_DOUBLE_DAGGER  U"\u2021"
 #define UNICODE_BULLET  0x2022
-#define UNITEXT_BULLET  L"\u2022"
+#define UNITEXT_BULLET  U"\u2022"
 #define UNICODE_TRIANGULAR_BULLET  0x2023
-#define UNITEXT_TRIANGULAR_BULLET  L"\u2023"
+#define UNITEXT_TRIANGULAR_BULLET  U"\u2023"
 #define UNICODE_ONE_DOT_LEADER  0x2024
-#define UNITEXT_ONE_DOT_LEADER  L"\u2024"
+#define UNITEXT_ONE_DOT_LEADER  U"\u2024"
 #define UNICODE_TWO_DOT_LEADER  0x2025
-#define UNITEXT_TWO_DOT_LEADER  L"\u2025"
+#define UNITEXT_TWO_DOT_LEADER  U"\u2025"
 #define UNICODE_HORIZONTAL_ELLIPSIS  0x2026
-#define UNITEXT_HORIZONTAL_ELLIPSIS  L"\u2026"
+#define UNITEXT_HORIZONTAL_ELLIPSIS  U"\u2026"
 #define UNICODE_HYPHENATION_POINT  0x2027
-#define UNITEXT_HYPHENATION_POINT  L"\u2027"
+#define UNITEXT_HYPHENATION_POINT  U"\u2027"
 #define UNICODE_LINE_SEPARATOR  0x2028
-#define UNITEXT_LINE_SEPARATOR  L"\u2028"
+#define UNITEXT_LINE_SEPARATOR  U"\u2028"
 #define UNICODE_PARAGRAPH_SEPARATOR  0x2029
-#define UNITEXT_PARAGRAPH_SEPARATOR  L"\u2029"
+#define UNITEXT_PARAGRAPH_SEPARATOR  U"\u2029"
 #define UNICODE_LEFT_TO_RIGHT_EMBEDDING  0x202a
-#define UNITEXT_LEFT_TO_RIGHT_EMBEDDING  L"\u202a"
+#define UNITEXT_LEFT_TO_RIGHT_EMBEDDING  U"\u202a"
 #define UNICODE_RIGHT_TO_LEFT_EMBEDDING  0x202b
-#define UNITEXT_RIGHT_TO_LEFT_EMBEDDING  L"\u202b"
+#define UNITEXT_RIGHT_TO_LEFT_EMBEDDING  U"\u202b"
 #define UNICODE_POP_DIRECTIONAL_FORMATTING  0x202c
-#define UNITEXT_POP_DIRECTIONAL_FORMATTING  L"\u202c"
+#define UNITEXT_POP_DIRECTIONAL_FORMATTING  U"\u202c"
 #define UNICODE_LEFT_TO_RIGHT_OVERRIDE  0x202d
-#define UNITEXT_LEFT_TO_RIGHT_OVERRIDE  L"\u202d"
+#define UNITEXT_LEFT_TO_RIGHT_OVERRIDE  U"\u202d"
 #define UNICODE_RIGHT_TO_LEFT_OVERRIDE  0x202e
-#define UNITEXT_RIGHT_TO_LEFT_OVERRIDE  L"\u202e"
+#define UNITEXT_RIGHT_TO_LEFT_OVERRIDE  U"\u202e"
 #define UNICODE_NARROW_NO_BREAK_SPACE  0x202f
-#define UNITEXT_NARROW_NO_BREAK_SPACE  L"\u202f"
+#define UNITEXT_NARROW_NO_BREAK_SPACE  U"\u202f"
 #define UNICODE_PER_MILLE_SIGN  0x2030
-#define UNITEXT_PER_MILLE_SIGN  L"\u2030"
+#define UNITEXT_PER_MILLE_SIGN  U"\u2030"
 #define UNICODE_PER_TEN_THOUSAND_SIGN  0x2031
-#define UNITEXT_PER_TEN_THOUSAND_SIGN  L"\u2031"
+#define UNITEXT_PER_TEN_THOUSAND_SIGN  U"\u2031"
 #define UNICODE_PRIME  0x2032
-#define UNITEXT_PRIME  L"\u2032"
+#define UNITEXT_PRIME  U"\u2032"
 #define UNICODE_DOUBLE_PRIME  0x2033
-#define UNITEXT_DOUBLE_PRIME  L"\u2033"
+#define UNITEXT_DOUBLE_PRIME  U"\u2033"
 #define UNICODE_TRIPLE_PRIME  0x2034
-#define UNITEXT_TRIPLE_PRIME  L"\u2034"
+#define UNITEXT_TRIPLE_PRIME  U"\u2034"
 #define UNICODE_REVERSED_PRIME  0x2035
-#define UNITEXT_REVERSED_PRIME  L"\u2035"
+#define UNITEXT_REVERSED_PRIME  U"\u2035"
 #define UNICODE_REVERSED_DOUBLE_PRIME  0x2036
-#define UNITEXT_REVERSED_DOUBLE_PRIME  L"\u2036"
+#define UNITEXT_REVERSED_DOUBLE_PRIME  U"\u2036"
 #define UNICODE_REVERSED_TRIPLE_PRIME  0x2037
-#define UNITEXT_REVERSED_TRIPLE_PRIME  L"\u2037"
+#define UNITEXT_REVERSED_TRIPLE_PRIME  U"\u2037"
 #define UNICODE_CARET  0x2038
-#define UNITEXT_CARET  L"\u2038"
+#define UNITEXT_CARET  U"\u2038"
 #define UNICODE_SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK  0x2039
-#define UNITEXT_SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK  L"\u2039"
+#define UNITEXT_SINGLE_LEFT_POINTING_ANGLE_QUOTATION_MARK  U"\u2039"
 #define UNICODE_SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK  0x203a
-#define UNITEXT_SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK  L"\u203a"
+#define UNITEXT_SINGLE_RIGHT_POINTING_ANGLE_QUOTATION_MARK  U"\u203a"
 #define UNICODE_REFERENCE_MARK  0x203b
-#define UNITEXT_REFERENCE_MARK  L"\u203b"
+#define UNITEXT_REFERENCE_MARK  U"\u203b"
 #define UNICODE_DOUBLE_EXCLAMATION_MARK  0x203c
-#define UNITEXT_DOUBLE_EXCLAMATION_MARK  L"\u203c"
+#define UNITEXT_DOUBLE_EXCLAMATION_MARK  U"\u203c"
 #define UNICODE_INTERROBANG  0x203d
-#define UNITEXT_INTERROBANG  L"\u203d"
+#define UNITEXT_INTERROBANG  U"\u203d"
 #define UNICODE_OVERLINE  0x203e
-#define UNITEXT_OVERLINE  L"\u203e"
+#define UNITEXT_OVERLINE  U"\u203e"
 #define UNICODE_UNDERTIE  0x203f
-#define UNITEXT_UNDERTIE  L"\u203f"
+#define UNITEXT_UNDERTIE  U"\u203f"
 #define UNICODE_CHARACTER_TIE  0x2040
-#define UNITEXT_CHARACTER_TIE  L"\u2040"
+#define UNITEXT_CHARACTER_TIE  U"\u2040"
 #define UNICODE_CARET_INSERTION_POINT  0x2041
-#define UNITEXT_CARET_INSERTION_POINT  L"\u2041"
+#define UNITEXT_CARET_INSERTION_POINT  U"\u2041"
 #define UNICODE_ASTERISM  0x2042
-#define UNITEXT_ASTERISM  L"\u2042"
+#define UNITEXT_ASTERISM  U"\u2042"
 #define UNICODE_HYPHEN_BULLET  0x2043
-#define UNITEXT_HYPHEN_BULLET  L"\u2043"
+#define UNITEXT_HYPHEN_BULLET  U"\u2043"
 #define UNICODE_FRACTION_SLASH  0x2044
-#define UNITEXT_FRACTION_SLASH  L"\u2044"
+#define UNITEXT_FRACTION_SLASH  U"\u2044"
 #define UNICODE_LEFT_SQUARE_BRACKET_WITH_QUILL  0x2045
-#define UNITEXT_LEFT_SQUARE_BRACKET_WITH_QUILL  L"\u2045"
+#define UNITEXT_LEFT_SQUARE_BRACKET_WITH_QUILL  U"\u2045"
 #define UNICODE_RIGHT_SQUARE_BRACKET_WITH_QUILL  0x2046
-#define UNITEXT_RIGHT_SQUARE_BRACKET_WITH_QUILL  L"\u2046"
+#define UNITEXT_RIGHT_SQUARE_BRACKET_WITH_QUILL  U"\u2046"
 #define UNICODE_DOUBLE_QUESTION_MARK  0x2047
-#define UNITEXT_DOUBLE_QUESTION_MARK  L"\u2047"
+#define UNITEXT_DOUBLE_QUESTION_MARK  U"\u2047"
 #define UNICODE_QUESTION_EXCLAMATION_MARK  0x2048
-#define UNITEXT_QUESTION_EXCLAMATION_MARK  L"\u2048"
+#define UNITEXT_QUESTION_EXCLAMATION_MARK  U"\u2048"
 #define UNICODE_EXCLAMATION_QUESTION_MARK  0x2049
-#define UNITEXT_EXCLAMATION_QUESTION_MARK  L"\u2049"
+#define UNITEXT_EXCLAMATION_QUESTION_MARK  U"\u2049"
 #define UNICODE_TIRONIAN_SIGN_ET  0x204a
-#define UNITEXT_TIRONIAN_SIGN_ET  L"\u204a"
+#define UNITEXT_TIRONIAN_SIGN_ET  U"\u204a"
 #define UNICODE_REVERSED_PILCROW_SIGN  0x204b
-#define UNITEXT_REVERSED_PILCROW_SIGN  L"\u204b"
+#define UNITEXT_REVERSED_PILCROW_SIGN  U"\u204b"
 #define UNICODE_BLACK_LEFTWARDS_BULLET  0x204c
-#define UNITEXT_BLACK_LEFTWARDS_BULLET  L"\u204c"
+#define UNITEXT_BLACK_LEFTWARDS_BULLET  U"\u204c"
 #define UNICODE_BLACK_RIGHTWARDS_BULLET  0x204d
-#define UNITEXT_BLACK_RIGHTWARDS_BULLET  L"\u204d"
+#define UNITEXT_BLACK_RIGHTWARDS_BULLET  U"\u204d"
 #define UNICODE_LOW_ASTERISK  0x204e
-#define UNITEXT_LOW_ASTERISK  L"\u204e"
+#define UNITEXT_LOW_ASTERISK  U"\u204e"
 #define UNICODE_REVERSED_SEMICOLON  0x204f
-#define UNITEXT_REVERSED_SEMICOLON  L"\u204f"
+#define UNITEXT_REVERSED_SEMICOLON  U"\u204f"
 #define UNICODE_CLOSE_UP  0x2050
-#define UNITEXT_CLOSE_UP  L"\u2050"
+#define UNITEXT_CLOSE_UP  U"\u2050"
 #define UNICODE_TWO_ASTERISKS_ALIGNED_VERTICALLY  0x2051
-#define UNITEXT_TWO_ASTERISKS_ALIGNED_VERTICALLY  L"\u2051"
+#define UNITEXT_TWO_ASTERISKS_ALIGNED_VERTICALLY  U"\u2051"
 #define UNICODE_COMMERCIAL_MINUS_SIGN  0x2052
-#define UNITEXT_COMMERCIAL_MINUS_SIGN  L"\u2052"
+#define UNITEXT_COMMERCIAL_MINUS_SIGN  U"\u2052"
 #define UNICODE_SWUNG_DASH  0x2053
-#define UNITEXT_SWUNG_DASH  L"\u2053"
+#define UNITEXT_SWUNG_DASH  U"\u2053"
 #define UNICODE_INVERTED_UNDERTIE  0x2054
-#define UNITEXT_INVERTED_UNDERTIE  L"\u2054"
+#define UNITEXT_INVERTED_UNDERTIE  U"\u2054"
 #define UNICODE_FLOWER_PUNCTUATION_MARK  0x2055
-#define UNITEXT_FLOWER_PUNCTUATION_MARK  L"\u2055"
+#define UNITEXT_FLOWER_PUNCTUATION_MARK  U"\u2055"
 #define UNICODE_THREE_DOT_PUNCTUATION  0x2056
-#define UNITEXT_THREE_DOT_PUNCTUATION  L"\u2056"
+#define UNITEXT_THREE_DOT_PUNCTUATION  U"\u2056"
 #define UNICODE_QUADRUPLE_PRIME  0x2057
-#define UNITEXT_QUADRUPLE_PRIME  L"\u2057"
+#define UNITEXT_QUADRUPLE_PRIME  U"\u2057"
 #define UNICODE_FOUR_DOT_PUNCTUATION  0x2058
-#define UNITEXT_FOUR_DOT_PUNCTUATION  L"\u2058"
+#define UNITEXT_FOUR_DOT_PUNCTUATION  U"\u2058"
 #define UNICODE_FIVE_DOT_PUNCTUATION  0x2059
-#define UNITEXT_FIVE_DOT_PUNCTUATION  L"\u2059"
+#define UNITEXT_FIVE_DOT_PUNCTUATION  U"\u2059"
 #define UNICODE_TWO_DOT_PUNCTUATION  0x205a
-#define UNITEXT_TWO_DOT_PUNCTUATION  L"\u205a"
+#define UNITEXT_TWO_DOT_PUNCTUATION  U"\u205a"
 #define UNICODE_FOUR_DOT_MARK  0x205b
-#define UNITEXT_FOUR_DOT_MARK  L"\u205b"
+#define UNITEXT_FOUR_DOT_MARK  U"\u205b"
 #define UNICODE_DOTTED_CROSS  0x205c
-#define UNITEXT_DOTTED_CROSS  L"\u205c"
+#define UNITEXT_DOTTED_CROSS  U"\u205c"
 #define UNICODE_TRICOLON  0x205d
-#define UNITEXT_TRICOLON  L"\u205d"
+#define UNITEXT_TRICOLON  U"\u205d"
 #define UNICODE_VERTICAL_FOUR_DOTS  0x205e
-#define UNITEXT_VERTICAL_FOUR_DOTS  L"\u205e"
+#define UNITEXT_VERTICAL_FOUR_DOTS  U"\u205e"
 #define UNICODE_MEDIUM_MATHEMATICAL_SPACE  0x205f
-#define UNITEXT_MEDIUM_MATHEMATICAL_SPACE  L"\u205f"
+#define UNITEXT_MEDIUM_MATHEMATICAL_SPACE  U"\u205f"
 #define UNICODE_WORD_JOINER  0x2060
-#define UNITEXT_WORD_JOINER  L"\u2060"
+#define UNITEXT_WORD_JOINER  U"\u2060"
 #define UNICODE_FUNCTION_APPLICATION  0x2061
-#define UNITEXT_FUNCTION_APPLICATION  L"\u2061"
+#define UNITEXT_FUNCTION_APPLICATION  U"\u2061"
 #define UNICODE_INVISIBLE_TIMES  0x2062
-#define UNITEXT_INVISIBLE_TIMES  L"\u2062"
+#define UNITEXT_INVISIBLE_TIMES  U"\u2062"
 #define UNICODE_INVISIBLE_SEPARATOR  0x2063
-#define UNITEXT_INVISIBLE_SEPARATOR  L"\u2063"
+#define UNITEXT_INVISIBLE_SEPARATOR  U"\u2063"
 #define UNICODE_INHIBIT_SYMMETRIC_SWAPPING  0x206a
-#define UNITEXT_INHIBIT_SYMMETRIC_SWAPPING  L"\u206a"
+#define UNITEXT_INHIBIT_SYMMETRIC_SWAPPING  U"\u206a"
 #define UNICODE_ACTIVATE_SYMMETRIC_SWAPPING  0x206b
-#define UNITEXT_ACTIVATE_SYMMETRIC_SWAPPING  L"\u206b"
+#define UNITEXT_ACTIVATE_SYMMETRIC_SWAPPING  U"\u206b"
 #define UNICODE_INHIBIT_ARABIC_FORM_SHAPING  0x206c
-#define UNITEXT_INHIBIT_ARABIC_FORM_SHAPING  L"\u206c"
+#define UNITEXT_INHIBIT_ARABIC_FORM_SHAPING  U"\u206c"
 #define UNICODE_ACTIVATE_ARABIC_FORM_SHAPING  0x206d
-#define UNITEXT_ACTIVATE_ARABIC_FORM_SHAPING  L"\u206d"
+#define UNITEXT_ACTIVATE_ARABIC_FORM_SHAPING  U"\u206d"
 #define UNICODE_NATIONAL_DIGIT_SHAPES  0x206e
-#define UNITEXT_NATIONAL_DIGIT_SHAPES  L"\u206e"
+#define UNITEXT_NATIONAL_DIGIT_SHAPES  U"\u206e"
 #define UNICODE_NOMINAL_DIGIT_SHAPES  0x206f
-#define UNITEXT_NOMINAL_DIGIT_SHAPES  L"\u206f"
+#define UNITEXT_NOMINAL_DIGIT_SHAPES  U"\u206f"
 #define UNICODE_SUPERSCRIPT_ZERO  0x2070
-#define UNITEXT_SUPERSCRIPT_ZERO  L"\u2070"
+#define UNITEXT_SUPERSCRIPT_ZERO  U"\u2070"
 #define UNICODE_SUPERSCRIPT_LATIN_SMALL_LETTER_I  0x2071
-#define UNITEXT_SUPERSCRIPT_LATIN_SMALL_LETTER_I  L"\u2071"
+#define UNITEXT_SUPERSCRIPT_LATIN_SMALL_LETTER_I  U"\u2071"
 #define UNICODE_SUPERSCRIPT_FOUR  0x2074
-#define UNITEXT_SUPERSCRIPT_FOUR  L"\u2074"
+#define UNITEXT_SUPERSCRIPT_FOUR  U"\u2074"
 #define UNICODE_SUPERSCRIPT_FIVE  0x2075
-#define UNITEXT_SUPERSCRIPT_FIVE  L"\u2075"
+#define UNITEXT_SUPERSCRIPT_FIVE  U"\u2075"
 #define UNICODE_SUPERSCRIPT_SIX  0x2076
-#define UNITEXT_SUPERSCRIPT_SIX  L"\u2076"
+#define UNITEXT_SUPERSCRIPT_SIX  U"\u2076"
 #define UNICODE_SUPERSCRIPT_SEVEN  0x2077
-#define UNITEXT_SUPERSCRIPT_SEVEN  L"\u2077"
+#define UNITEXT_SUPERSCRIPT_SEVEN  U"\u2077"
 #define UNICODE_SUPERSCRIPT_EIGHT  0x2078
-#define UNITEXT_SUPERSCRIPT_EIGHT  L"\u2078"
+#define UNITEXT_SUPERSCRIPT_EIGHT  U"\u2078"
 #define UNICODE_SUPERSCRIPT_NINE  0x2079
-#define UNITEXT_SUPERSCRIPT_NINE  L"\u2079"
+#define UNITEXT_SUPERSCRIPT_NINE  U"\u2079"
 #define UNICODE_SUPERSCRIPT_PLUS_SIGN  0x207a
-#define UNITEXT_SUPERSCRIPT_PLUS_SIGN  L"\u207a"
+#define UNITEXT_SUPERSCRIPT_PLUS_SIGN  U"\u207a"
 #define UNICODE_SUPERSCRIPT_MINUS  0x207b
-#define UNITEXT_SUPERSCRIPT_MINUS  L"\u207b"
+#define UNITEXT_SUPERSCRIPT_MINUS  U"\u207b"
 #define UNICODE_SUPERSCRIPT_EQUALS_SIGN  0x207c
-#define UNITEXT_SUPERSCRIPT_EQUALS_SIGN  L"\u207c"
+#define UNITEXT_SUPERSCRIPT_EQUALS_SIGN  U"\u207c"
 #define UNICODE_SUPERSCRIPT_LEFT_PARENTHESIS  0x207d
-#define UNITEXT_SUPERSCRIPT_LEFT_PARENTHESIS  L"\u207d"
+#define UNITEXT_SUPERSCRIPT_LEFT_PARENTHESIS  U"\u207d"
 #define UNICODE_SUPERSCRIPT_RIGHT_PARENTHESIS  0x207e
-#define UNITEXT_SUPERSCRIPT_RIGHT_PARENTHESIS  L"\u207e"
+#define UNITEXT_SUPERSCRIPT_RIGHT_PARENTHESIS  U"\u207e"
 #define UNICODE_SUPERSCRIPT_LATIN_SMALL_LETTER_N  0x207f
-#define UNITEXT_SUPERSCRIPT_LATIN_SMALL_LETTER_N  L"\u207f"
+#define UNITEXT_SUPERSCRIPT_LATIN_SMALL_LETTER_N  U"\u207f"
 #define UNICODE_SUBSCRIPT_ZERO  0x2080
-#define UNITEXT_SUBSCRIPT_ZERO  L"\u2080"
+#define UNITEXT_SUBSCRIPT_ZERO  U"\u2080"
 #define UNICODE_SUBSCRIPT_ONE  0x2081
-#define UNITEXT_SUBSCRIPT_ONE  L"\u2081"
+#define UNITEXT_SUBSCRIPT_ONE  U"\u2081"
 #define UNICODE_SUBSCRIPT_TWO  0x2082
-#define UNITEXT_SUBSCRIPT_TWO  L"\u2082"
+#define UNITEXT_SUBSCRIPT_TWO  U"\u2082"
 #define UNICODE_SUBSCRIPT_THREE  0x2083
-#define UNITEXT_SUBSCRIPT_THREE  L"\u2083"
+#define UNITEXT_SUBSCRIPT_THREE  U"\u2083"
 #define UNICODE_SUBSCRIPT_FOUR  0x2084
-#define UNITEXT_SUBSCRIPT_FOUR  L"\u2084"
+#define UNITEXT_SUBSCRIPT_FOUR  U"\u2084"
 #define UNICODE_SUBSCRIPT_FIVE  0x2085
-#define UNITEXT_SUBSCRIPT_FIVE  L"\u2085"
+#define UNITEXT_SUBSCRIPT_FIVE  U"\u2085"
 #define UNICODE_SUBSCRIPT_SIX  0x2086
-#define UNITEXT_SUBSCRIPT_SIX  L"\u2086"
+#define UNITEXT_SUBSCRIPT_SIX  U"\u2086"
 #define UNICODE_SUBSCRIPT_SEVEN  0x2087
-#define UNITEXT_SUBSCRIPT_SEVEN  L"\u2087"
+#define UNITEXT_SUBSCRIPT_SEVEN  U"\u2087"
 #define UNICODE_SUBSCRIPT_EIGHT  0x2088
-#define UNITEXT_SUBSCRIPT_EIGHT  L"\u2088"
+#define UNITEXT_SUBSCRIPT_EIGHT  U"\u2088"
 #define UNICODE_SUBSCRIPT_NINE  0x2089
-#define UNITEXT_SUBSCRIPT_NINE  L"\u2089"
+#define UNITEXT_SUBSCRIPT_NINE  U"\u2089"
 #define UNICODE_SUBSCRIPT_PLUS_SIGN  0x208a
-#define UNITEXT_SUBSCRIPT_PLUS_SIGN  L"\u208a"
+#define UNITEXT_SUBSCRIPT_PLUS_SIGN  U"\u208a"
 #define UNICODE_SUBSCRIPT_MINUS  0x208b
-#define UNITEXT_SUBSCRIPT_MINUS  L"\u208b"
+#define UNITEXT_SUBSCRIPT_MINUS  U"\u208b"
 #define UNICODE_SUBSCRIPT_EQUALS_SIGN  0x208c
-#define UNITEXT_SUBSCRIPT_EQUALS_SIGN  L"\u208c"
+#define UNITEXT_SUBSCRIPT_EQUALS_SIGN  U"\u208c"
 #define UNICODE_SUBSCRIPT_LEFT_PARENTHESIS  0x208d
-#define UNITEXT_SUBSCRIPT_LEFT_PARENTHESIS  L"\u208d"
+#define UNITEXT_SUBSCRIPT_LEFT_PARENTHESIS  U"\u208d"
 #define UNICODE_SUBSCRIPT_RIGHT_PARENTHESIS  0x208e
-#define UNITEXT_SUBSCRIPT_RIGHT_PARENTHESIS  L"\u208e"
+#define UNITEXT_SUBSCRIPT_RIGHT_PARENTHESIS  U"\u208e"
 #define UNICODE_LATIN_SUBSCRIPT_SMALL_LETTER_A  0x2090
-#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_A  L"\u2090"
+#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_A  U"\u2090"
 #define UNICODE_LATIN_SUBSCRIPT_SMALL_LETTER_E  0x2091
-#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_E  L"\u2091"
+#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_E  U"\u2091"
 #define UNICODE_LATIN_SUBSCRIPT_SMALL_LETTER_O  0x2092
-#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_O  L"\u2092"
+#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_O  U"\u2092"
 #define UNICODE_LATIN_SUBSCRIPT_SMALL_LETTER_X  0x2093
-#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_X  L"\u2093"
+#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_X  U"\u2093"
 #define UNICODE_LATIN_SUBSCRIPT_SMALL_LETTER_SCHWA  0x2094
-#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_SCHWA  L"\u2094"
+#define UNITEXT_LATIN_SUBSCRIPT_SMALL_LETTER_SCHWA  U"\u2094"
 #define UNICODE_EURO_CURRENCY_SIGN  0x20a0
-#define UNITEXT_EURO_CURRENCY_SIGN  L"\u20a0"
+#define UNITEXT_EURO_CURRENCY_SIGN  U"\u20a0"
 #define UNICODE_COLON_SIGN  0x20a1
-#define UNITEXT_COLON_SIGN  L"\u20a1"
+#define UNITEXT_COLON_SIGN  U"\u20a1"
 #define UNICODE_CRUZEIRO_SIGN  0x20a2
-#define UNITEXT_CRUZEIRO_SIGN  L"\u20a2"
+#define UNITEXT_CRUZEIRO_SIGN  U"\u20a2"
 #define UNICODE_FRENCH_FRANC_SIGN  0x20a3
-#define UNITEXT_FRENCH_FRANC_SIGN  L"\u20a3"
+#define UNITEXT_FRENCH_FRANC_SIGN  U"\u20a3"
 #define UNICODE_LIRA_SIGN  0x20a4
-#define UNITEXT_LIRA_SIGN  L"\u20a4"
+#define UNITEXT_LIRA_SIGN  U"\u20a4"
 #define UNICODE_MILL_SIGN  0x20a5
-#define UNITEXT_MILL_SIGN  L"\u20a5"
+#define UNITEXT_MILL_SIGN  U"\u20a5"
 #define UNICODE_NAIRA_SIGN  0x20a6
-#define UNITEXT_NAIRA_SIGN  L"\u20a6"
+#define UNITEXT_NAIRA_SIGN  U"\u20a6"
 #define UNICODE_PESETA_SIGN  0x20a7
-#define UNITEXT_PESETA_SIGN  L"\u20a7"
+#define UNITEXT_PESETA_SIGN  U"\u20a7"
 #define UNICODE_RUPEE_SIGN  0x20a8
-#define UNITEXT_RUPEE_SIGN  L"\u20a8"
+#define UNITEXT_RUPEE_SIGN  U"\u20a8"
 #define UNICODE_WON_SIGN  0x20a9
-#define UNITEXT_WON_SIGN  L"\u20a9"
+#define UNITEXT_WON_SIGN  U"\u20a9"
 #define UNICODE_NEW_SHEQEL_SIGN  0x20aa
-#define UNITEXT_NEW_SHEQEL_SIGN  L"\u20aa"
+#define UNITEXT_NEW_SHEQEL_SIGN  U"\u20aa"
 #define UNICODE_DONG_SIGN  0x20ab
-#define UNITEXT_DONG_SIGN  L"\u20ab"
+#define UNITEXT_DONG_SIGN  U"\u20ab"
 #define UNICODE_EURO_SIGN  0x20ac
-#define UNITEXT_EURO_SIGN  L"\u20ac"
+#define UNITEXT_EURO_SIGN  U"\u20ac"
 #define UNICODE_KIP_SIGN  0x20ad
-#define UNITEXT_KIP_SIGN  L"\u20ad"
+#define UNITEXT_KIP_SIGN  U"\u20ad"
 #define UNICODE_TUGRIK_SIGN  0x20ae
-#define UNITEXT_TUGRIK_SIGN  L"\u20ae"
+#define UNITEXT_TUGRIK_SIGN  U"\u20ae"
 #define UNICODE_DRACHMA_SIGN  0x20af
-#define UNITEXT_DRACHMA_SIGN  L"\u20af"
+#define UNITEXT_DRACHMA_SIGN  U"\u20af"
 #define UNICODE_GERMAN_PENNY_SIGN  0x20b0
-#define UNITEXT_GERMAN_PENNY_SIGN  L"\u20b0"
+#define UNITEXT_GERMAN_PENNY_SIGN  U"\u20b0"
 #define UNICODE_PESO_SIGN  0x20b1
-#define UNITEXT_PESO_SIGN  L"\u20b1"
+#define UNITEXT_PESO_SIGN  U"\u20b1"
 #define UNICODE_GUARANI_SIGN  0x20b2
-#define UNITEXT_GUARANI_SIGN  L"\u20b2"
+#define UNITEXT_GUARANI_SIGN  U"\u20b2"
 #define UNICODE_AUSTRAL_SIGN  0x20b3
-#define UNITEXT_AUSTRAL_SIGN  L"\u20b3"
+#define UNITEXT_AUSTRAL_SIGN  U"\u20b3"
 #define UNICODE_HRYVNIA_SIGN  0x20b4
-#define UNITEXT_HRYVNIA_SIGN  L"\u20b4"
+#define UNITEXT_HRYVNIA_SIGN  U"\u20b4"
 #define UNICODE_CEDI_SIGN  0x20b5
-#define UNITEXT_CEDI_SIGN  L"\u20b5"
+#define UNITEXT_CEDI_SIGN  U"\u20b5"
 #define UNICODE_COMBINING_LEFT_HARPOON_ABOVE  0x20d0
-#define UNITEXT_COMBINING_LEFT_HARPOON_ABOVE  L"\u20d0"
+#define UNITEXT_COMBINING_LEFT_HARPOON_ABOVE  U"\u20d0"
 #define UNICODE_COMBINING_RIGHT_HARPOON_ABOVE  0x20d1
-#define UNITEXT_COMBINING_RIGHT_HARPOON_ABOVE  L"\u20d1"
+#define UNITEXT_COMBINING_RIGHT_HARPOON_ABOVE  U"\u20d1"
 #define UNICODE_COMBINING_LONG_VERTICAL_LINE_OVERLAY  0x20d2
-#define UNITEXT_COMBINING_LONG_VERTICAL_LINE_OVERLAY  L"\u20d2"
+#define UNITEXT_COMBINING_LONG_VERTICAL_LINE_OVERLAY  U"\u20d2"
 #define UNICODE_COMBINING_SHORT_VERTICAL_LINE_OVERLAY  0x20d3
-#define UNITEXT_COMBINING_SHORT_VERTICAL_LINE_OVERLAY  L"\u20d3"
+#define UNITEXT_COMBINING_SHORT_VERTICAL_LINE_OVERLAY  U"\u20d3"
 #define UNICODE_COMBINING_ANTICLOCKWISE_ARROW_ABOVE  0x20d4
-#define UNITEXT_COMBINING_ANTICLOCKWISE_ARROW_ABOVE  L"\u20d4"
+#define UNITEXT_COMBINING_ANTICLOCKWISE_ARROW_ABOVE  U"\u20d4"
 #define UNICODE_COMBINING_CLOCKWISE_ARROW_ABOVE  0x20d5
-#define UNITEXT_COMBINING_CLOCKWISE_ARROW_ABOVE  L"\u20d5"
+#define UNITEXT_COMBINING_CLOCKWISE_ARROW_ABOVE  U"\u20d5"
 #define UNICODE_COMBINING_LEFT_ARROW_ABOVE  0x20d6
-#define UNITEXT_COMBINING_LEFT_ARROW_ABOVE  L"\u20d6"
+#define UNITEXT_COMBINING_LEFT_ARROW_ABOVE  U"\u20d6"
 #define UNICODE_COMBINING_RIGHT_ARROW_ABOVE  0x20d7
-#define UNITEXT_COMBINING_RIGHT_ARROW_ABOVE  L"\u20d7"
+#define UNITEXT_COMBINING_RIGHT_ARROW_ABOVE  U"\u20d7"
 #define UNICODE_COMBINING_RING_OVERLAY  0x20d8
-#define UNITEXT_COMBINING_RING_OVERLAY  L"\u20d8"
+#define UNITEXT_COMBINING_RING_OVERLAY  U"\u20d8"
 #define UNICODE_COMBINING_CLOCKWISE_RING_OVERLAY  0x20d9
-#define UNITEXT_COMBINING_CLOCKWISE_RING_OVERLAY  L"\u20d9"
+#define UNITEXT_COMBINING_CLOCKWISE_RING_OVERLAY  U"\u20d9"
 #define UNICODE_COMBINING_ANTICLOCKWISE_RING_OVERLAY  0x20da
-#define UNITEXT_COMBINING_ANTICLOCKWISE_RING_OVERLAY  L"\u20da"
+#define UNITEXT_COMBINING_ANTICLOCKWISE_RING_OVERLAY  U"\u20da"
 #define UNICODE_COMBINING_THREE_DOTS_ABOVE  0x20db
-#define UNITEXT_COMBINING_THREE_DOTS_ABOVE  L"\u20db"
+#define UNITEXT_COMBINING_THREE_DOTS_ABOVE  U"\u20db"
 #define UNICODE_COMBINING_FOUR_DOTS_ABOVE  0x20dc
-#define UNITEXT_COMBINING_FOUR_DOTS_ABOVE  L"\u20dc"
+#define UNITEXT_COMBINING_FOUR_DOTS_ABOVE  U"\u20dc"
 #define UNICODE_COMBINING_ENCLOSING_CIRCLE  0x20dd
-#define UNITEXT_COMBINING_ENCLOSING_CIRCLE  L"\u20dd"
+#define UNITEXT_COMBINING_ENCLOSING_CIRCLE  U"\u20dd"
 #define UNICODE_COMBINING_ENCLOSING_SQUARE  0x20de
-#define UNITEXT_COMBINING_ENCLOSING_SQUARE  L"\u20de"
+#define UNITEXT_COMBINING_ENCLOSING_SQUARE  U"\u20de"
 #define UNICODE_COMBINING_ENCLOSING_DIAMOND  0x20df
-#define UNITEXT_COMBINING_ENCLOSING_DIAMOND  L"\u20df"
+#define UNITEXT_COMBINING_ENCLOSING_DIAMOND  U"\u20df"
 #define UNICODE_COMBINING_ENCLOSING_CIRCLE_BACKSLASH  0x20e0
-#define UNITEXT_COMBINING_ENCLOSING_CIRCLE_BACKSLASH  L"\u20e0"
+#define UNITEXT_COMBINING_ENCLOSING_CIRCLE_BACKSLASH  U"\u20e0"
 #define UNICODE_COMBINING_LEFT_RIGHT_ARROW_ABOVE  0x20e1
-#define UNITEXT_COMBINING_LEFT_RIGHT_ARROW_ABOVE  L"\u20e1"
+#define UNITEXT_COMBINING_LEFT_RIGHT_ARROW_ABOVE  U"\u20e1"
 #define UNICODE_COMBINING_ENCLOSING_SCREEN  0x20e2
-#define UNITEXT_COMBINING_ENCLOSING_SCREEN  L"\u20e2"
+#define UNITEXT_COMBINING_ENCLOSING_SCREEN  U"\u20e2"
 #define UNICODE_COMBINING_ENCLOSING_KEYCAP  0x20e3
-#define UNITEXT_COMBINING_ENCLOSING_KEYCAP  L"\u20e3"
+#define UNITEXT_COMBINING_ENCLOSING_KEYCAP  U"\u20e3"
 #define UNICODE_COMBINING_ENCLOSING_UPWARD_POINTING_TRIANGLE  0x20e4
-#define UNITEXT_COMBINING_ENCLOSING_UPWARD_POINTING_TRIANGLE  L"\u20e4"
+#define UNITEXT_COMBINING_ENCLOSING_UPWARD_POINTING_TRIANGLE  U"\u20e4"
 #define UNICODE_COMBINING_REVERSE_SOLIDUS_OVERLAY  0x20e5
-#define UNITEXT_COMBINING_REVERSE_SOLIDUS_OVERLAY  L"\u20e5"
+#define UNITEXT_COMBINING_REVERSE_SOLIDUS_OVERLAY  U"\u20e5"
 #define UNICODE_COMBINING_DOUBLE_VERTICAL_STROKE_OVERLAY  0x20e6
-#define UNITEXT_COMBINING_DOUBLE_VERTICAL_STROKE_OVERLAY  L"\u20e6"
+#define UNITEXT_COMBINING_DOUBLE_VERTICAL_STROKE_OVERLAY  U"\u20e6"
 #define UNICODE_COMBINING_ANNUITY_SYMBOL  0x20e7
-#define UNITEXT_COMBINING_ANNUITY_SYMBOL  L"\u20e7"
+#define UNITEXT_COMBINING_ANNUITY_SYMBOL  U"\u20e7"
 #define UNICODE_COMBINING_TRIPLE_UNDERDOT  0x20e8
-#define UNITEXT_COMBINING_TRIPLE_UNDERDOT  L"\u20e8"
+#define UNITEXT_COMBINING_TRIPLE_UNDERDOT  U"\u20e8"
 #define UNICODE_COMBINING_WIDE_BRIDGE_ABOVE  0x20e9
-#define UNITEXT_COMBINING_WIDE_BRIDGE_ABOVE  L"\u20e9"
+#define UNITEXT_COMBINING_WIDE_BRIDGE_ABOVE  U"\u20e9"
 #define UNICODE_COMBINING_LEFTWARDS_ARROW_OVERLAY  0x20ea
-#define UNITEXT_COMBINING_LEFTWARDS_ARROW_OVERLAY  L"\u20ea"
+#define UNITEXT_COMBINING_LEFTWARDS_ARROW_OVERLAY  U"\u20ea"
 #define UNICODE_COMBINING_LONG_DOUBLE_SOLIDUS_OVERLAY  0x20eb
-#define UNITEXT_COMBINING_LONG_DOUBLE_SOLIDUS_OVERLAY  L"\u20eb"
+#define UNITEXT_COMBINING_LONG_DOUBLE_SOLIDUS_OVERLAY  U"\u20eb"
 #define UNICODE_COMBINING_RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS  0x20ec
-#define UNITEXT_COMBINING_RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS  L"\u20ec"
+#define UNITEXT_COMBINING_RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS  U"\u20ec"
 #define UNICODE_COMBINING_LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS  0x20ed
-#define UNITEXT_COMBINING_LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS  L"\u20ed"
+#define UNITEXT_COMBINING_LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS  U"\u20ed"
 #define UNICODE_COMBINING_LEFT_ARROW_BELOW  0x20ee
-#define UNITEXT_COMBINING_LEFT_ARROW_BELOW  L"\u20ee"
+#define UNITEXT_COMBINING_LEFT_ARROW_BELOW  U"\u20ee"
 #define UNICODE_COMBINING_RIGHT_ARROW_BELOW  0x20ef
-#define UNITEXT_COMBINING_RIGHT_ARROW_BELOW  L"\u20ef"
+#define UNITEXT_COMBINING_RIGHT_ARROW_BELOW  U"\u20ef"
 #define UNICODE_ACCOUNT_OF  0x2100
-#define UNITEXT_ACCOUNT_OF  L"\u2100"
+#define UNITEXT_ACCOUNT_OF  U"\u2100"
 #define UNICODE_ADDRESSED_TO_THE_SUBJECT  0x2101
-#define UNITEXT_ADDRESSED_TO_THE_SUBJECT  L"\u2101"
+#define UNITEXT_ADDRESSED_TO_THE_SUBJECT  U"\u2101"
 #define UNICODE_DOUBLE_STRUCK_CAPITAL_C  0x2102
-#define UNITEXT_DOUBLE_STRUCK_CAPITAL_C  L"\u2102"
+#define UNITEXT_DOUBLE_STRUCK_CAPITAL_C  U"\u2102"
 #define UNICODE_DEGREE_CELSIUS  0x2103
-#define UNITEXT_DEGREE_CELSIUS  L"\u2103"
+#define UNITEXT_DEGREE_CELSIUS  U"\u2103"
 #define UNICODE_CENTRE_LINE_SYMBOL  0x2104
-#define UNITEXT_CENTRE_LINE_SYMBOL  L"\u2104"
+#define UNITEXT_CENTRE_LINE_SYMBOL  U"\u2104"
 #define UNICODE_CARE_OF  0x2105
-#define UNITEXT_CARE_OF  L"\u2105"
+#define UNITEXT_CARE_OF  U"\u2105"
 #define UNICODE_CADA_UNA  0x2106
-#define UNITEXT_CADA_UNA  L"\u2106"
+#define UNITEXT_CADA_UNA  U"\u2106"
 #define UNICODE_EULER_CONSTANT  0x2107
-#define UNITEXT_EULER_CONSTANT  L"\u2107"
+#define UNITEXT_EULER_CONSTANT  U"\u2107"
 #define UNICODE_SCRUPLE  0x2108
-#define UNITEXT_SCRUPLE  L"\u2108"
+#define UNITEXT_SCRUPLE  U"\u2108"
 #define UNICODE_DEGREE_FAHRENHEIT  0x2109
-#define UNITEXT_DEGREE_FAHRENHEIT  L"\u2109"
+#define UNITEXT_DEGREE_FAHRENHEIT  U"\u2109"
 #define UNICODE_SCRIPT_SMALL_G  0x210a
-#define UNITEXT_SCRIPT_SMALL_G  L"\u210a"
+#define UNITEXT_SCRIPT_SMALL_G  U"\u210a"
 #define UNICODE_SCRIPT_CAPITAL_H  0x210b
-#define UNITEXT_SCRIPT_CAPITAL_H  L"\u210b"
+#define UNITEXT_SCRIPT_CAPITAL_H  U"\u210b"
 #define UNICODE_BLACK_LETTER_CAPITAL_H  0x210c
-#define UNITEXT_BLACK_LETTER_CAPITAL_H  L"\u210c"
+#define UNITEXT_BLACK_LETTER_CAPITAL_H  U"\u210c"
 #define UNICODE_DOUBLE_STRUCK_CAPITAL_H  0x210d
-#define UNITEXT_DOUBLE_STRUCK_CAPITAL_H  L"\u210d"
+#define UNITEXT_DOUBLE_STRUCK_CAPITAL_H  U"\u210d"
 #define UNICODE_PLANCK_CONSTANT  0x210e
-#define UNITEXT_PLANCK_CONSTANT  L"\u210e"
+#define UNITEXT_PLANCK_CONSTANT  U"\u210e"
 #define UNICODE_PLANCK_CONSTANT_OVER_TWO_PI  0x210f
-#define UNITEXT_PLANCK_CONSTANT_OVER_TWO_PI  L"\u210f"
+#define UNITEXT_PLANCK_CONSTANT_OVER_TWO_PI  U"\u210f"
 #define UNICODE_SCRIPT_CAPITAL_I  0x2110
-#define UNITEXT_SCRIPT_CAPITAL_I  L"\u2110"
+#define UNITEXT_SCRIPT_CAPITAL_I  U"\u2110"
 #define UNICODE_BLACK_LETTER_CAPITAL_I  0x2111
-#define UNITEXT_BLACK_LETTER_CAPITAL_I  L"\u2111"
+#define UNITEXT_BLACK_LETTER_CAPITAL_I  U"\u2111"
 #define UNICODE_SCRIPT_CAPITAL_L  0x2112
-#define UNITEXT_SCRIPT_CAPITAL_L  L"\u2112"
+#define UNITEXT_SCRIPT_CAPITAL_L  U"\u2112"
 #define UNICODE_SCRIPT_SMALL_L  0x2113
-#define UNITEXT_SCRIPT_SMALL_L  L"\u2113"
+#define UNITEXT_SCRIPT_SMALL_L  U"\u2113"
 #define UNICODE_L_B_BAR_SYMBOL  0x2114
-#define UNITEXT_L_B_BAR_SYMBOL  L"\u2114"
+#define UNITEXT_L_B_BAR_SYMBOL  U"\u2114"
 #define UNICODE_DOUBLE_STRUCK_CAPITAL_N  0x2115
-#define UNITEXT_DOUBLE_STRUCK_CAPITAL_N  L"\u2115"
+#define UNITEXT_DOUBLE_STRUCK_CAPITAL_N  U"\u2115"
 #define UNICODE_NUMERO_SIGN  0x2116
-#define UNITEXT_NUMERO_SIGN  L"\u2116"
+#define UNITEXT_NUMERO_SIGN  U"\u2116"
 #define UNICODE_SOUND_RECORDING_COPYRIGHT  0x2117
-#define UNITEXT_SOUND_RECORDING_COPYRIGHT  L"\u2117"
+#define UNITEXT_SOUND_RECORDING_COPYRIGHT  U"\u2117"
 #define UNICODE_SCRIPT_CAPITAL_P  0x2118
-#define UNITEXT_SCRIPT_CAPITAL_P  L"\u2118"
+#define UNITEXT_SCRIPT_CAPITAL_P  U"\u2118"
 #define UNICODE_DOUBLE_STRUCK_CAPITAL_P  0x2119
-#define UNITEXT_DOUBLE_STRUCK_CAPITAL_P  L"\u2119"
+#define UNITEXT_DOUBLE_STRUCK_CAPITAL_P  U"\u2119"
 #define UNICODE_DOUBLE_STRUCK_CAPITAL_Q  0x211a
-#define UNITEXT_DOUBLE_STRUCK_CAPITAL_Q  L"\u211a"
+#define UNITEXT_DOUBLE_STRUCK_CAPITAL_Q  U"\u211a"
 #define UNICODE_SCRIPT_CAPITAL_R  0x211b
-#define UNITEXT_SCRIPT_CAPITAL_R  L"\u211b"
+#define UNITEXT_SCRIPT_CAPITAL_R  U"\u211b"
 #define UNICODE_BLACK_LETTER_CAPITAL_R  0x211c
-#define UNITEXT_BLACK_LETTER_CAPITAL_R  L"\u211c"
+#define UNITEXT_BLACK_LETTER_CAPITAL_R  U"\u211c"
 #define UNICODE_DOUBLE_STRUCK_CAPITAL_R  0x211d
-#define UNITEXT_DOUBLE_STRUCK_CAPITAL_R  L"\u211d"
+#define UNITEXT_DOUBLE_STRUCK_CAPITAL_R  U"\u211d"
 #define UNICODE_PRESCRIPTION_TAKE  0x211e
-#define UNITEXT_PRESCRIPTION_TAKE  L"\u211e"
+#define UNITEXT_PRESCRIPTION_TAKE  U"\u211e"
 #define UNICODE_RESPONSE  0x211f
-#define UNITEXT_RESPONSE  L"\u211f"
+#define UNITEXT_RESPONSE  U"\u211f"
 #define UNICODE_SERVICE_MARK  0x2120
-#define UNITEXT_SERVICE_MARK  L"\u2120"
+#define UNITEXT_SERVICE_MARK  U"\u2120"
 #define UNICODE_TELEPHONE_SIGN  0x2121
-#define UNITEXT_TELEPHONE_SIGN  L"\u2121"
+#define UNITEXT_TELEPHONE_SIGN  U"\u2121"
 #define UNICODE_TRADE_MARK_SIGN  0x2122
-#define UNITEXT_TRADE_MARK_SIGN  L"\u2122"
+#define UNITEXT_TRADE_MARK_SIGN  U"\u2122"
 #define UNICODE_VERSICLE  0x2123
-#define UNITEXT_VERSICLE  L"\u2123"
+#define UNITEXT_VERSICLE  U"\u2123"
 #define UNICODE_DOUBLE_STRUCK_CAPITAL_Z  0x2124
-#define UNITEXT_DOUBLE_STRUCK_CAPITAL_Z  L"\u2124"
+#define UNITEXT_DOUBLE_STRUCK_CAPITAL_Z  U"\u2124"
 #define UNICODE_OUNCE_SIGN  0x2125
-#define UNITEXT_OUNCE_SIGN  L"\u2125"
+#define UNITEXT_OUNCE_SIGN  U"\u2125"
 #define UNICODE_OHM_SIGN  0x2126
-#define UNITEXT_OHM_SIGN  L"\u2126"
+#define UNITEXT_OHM_SIGN  U"\u2126"
 #define UNICODE_INVERTED_OHM_SIGN  0x2127
-#define UNITEXT_INVERTED_OHM_SIGN  L"\u2127"
+#define UNITEXT_INVERTED_OHM_SIGN  U"\u2127"
 #define UNICODE_BLACK_LETTER_CAPITAL_Z  0x2128
-#define UNITEXT_BLACK_LETTER_CAPITAL_Z  L"\u2128"
+#define UNITEXT_BLACK_LETTER_CAPITAL_Z  U"\u2128"
 #define UNICODE_TURNED_GREEK_SMALL_LETTER_IOTA  0x2129
-#define UNITEXT_TURNED_GREEK_SMALL_LETTER_IOTA  L"\u2129"
+#define UNITEXT_TURNED_GREEK_SMALL_LETTER_IOTA  U"\u2129"
 #define UNICODE_KELVIN_SIGN  0x212a
-#define UNITEXT_KELVIN_SIGN  L"\u212a"
+#define UNITEXT_KELVIN_SIGN  U"\u212a"
 #define UNICODE_ANGSTROM_SIGN  0x212b
-#define UNITEXT_ANGSTROM_SIGN  L"\u212b"
+#define UNITEXT_ANGSTROM_SIGN  U"\u212b"
 #define UNICODE_SCRIPT_CAPITAL_B  0x212c
-#define UNITEXT_SCRIPT_CAPITAL_B  L"\u212c"
+#define UNITEXT_SCRIPT_CAPITAL_B  U"\u212c"
 #define UNICODE_BLACK_LETTER_CAPITAL_C  0x212d
-#define UNITEXT_BLACK_LETTER_CAPITAL_C  L"\u212d"
+#define UNITEXT_BLACK_LETTER_CAPITAL_C  U"\u212d"
 #define UNICODE_ESTIMATED_SYMBOL  0x212e
-#define UNITEXT_ESTIMATED_SYMBOL  L"\u212e"
+#define UNITEXT_ESTIMATED_SYMBOL  U"\u212e"
 #define UNICODE_SCRIPT_SMALL_E  0x212f
-#define UNITEXT_SCRIPT_SMALL_E  L"\u212f"
+#define UNITEXT_SCRIPT_SMALL_E  U"\u212f"
 #define UNICODE_SCRIPT_CAPITAL_E  0x2130
-#define UNITEXT_SCRIPT_CAPITAL_E  L"\u2130"
+#define UNITEXT_SCRIPT_CAPITAL_E  U"\u2130"
 #define UNICODE_SCRIPT_CAPITAL_F  0x2131
-#define UNITEXT_SCRIPT_CAPITAL_F  L"\u2131"
+#define UNITEXT_SCRIPT_CAPITAL_F  U"\u2131"
 #define UNICODE_TURNED_CAPITAL_F  0x2132
-#define UNITEXT_TURNED_CAPITAL_F  L"\u2132"
+#define UNITEXT_TURNED_CAPITAL_F  U"\u2132"
 #define UNICODE_SCRIPT_CAPITAL_M  0x2133
-#define UNITEXT_SCRIPT_CAPITAL_M  L"\u2133"
+#define UNITEXT_SCRIPT_CAPITAL_M  U"\u2133"
 #define UNICODE_SCRIPT_SMALL_O  0x2134
-#define UNITEXT_SCRIPT_SMALL_O  L"\u2134"
+#define UNITEXT_SCRIPT_SMALL_O  U"\u2134"
 #define UNICODE_ALEF_SYMBOL  0x2135
-#define UNITEXT_ALEF_SYMBOL  L"\u2135"
+#define UNITEXT_ALEF_SYMBOL  U"\u2135"
 #define UNICODE_BET_SYMBOL  0x2136
-#define UNITEXT_BET_SYMBOL  L"\u2136"
+#define UNITEXT_BET_SYMBOL  U"\u2136"
 #define UNICODE_GIMEL_SYMBOL  0x2137
-#define UNITEXT_GIMEL_SYMBOL  L"\u2137"
+#define UNITEXT_GIMEL_SYMBOL  U"\u2137"
 #define UNICODE_DALET_SYMBOL  0x2138
-#define UNITEXT_DALET_SYMBOL  L"\u2138"
+#define UNITEXT_DALET_SYMBOL  U"\u2138"
 #define UNICODE_INFORMATION_SOURCE  0x2139
-#define UNITEXT_INFORMATION_SOURCE  L"\u2139"
+#define UNITEXT_INFORMATION_SOURCE  U"\u2139"
 #define UNICODE_ROTATED_CAPITAL_Q  0x213a
-#define UNITEXT_ROTATED_CAPITAL_Q  L"\u213a"
+#define UNITEXT_ROTATED_CAPITAL_Q  U"\u213a"
 #define UNICODE_FACSIMILE_SIGN  0x213b
-#define UNITEXT_FACSIMILE_SIGN  L"\u213b"
+#define UNITEXT_FACSIMILE_SIGN  U"\u213b"
 #define UNICODE_DOUBLE_STRUCK_SMALL_PI  0x213c
-#define UNITEXT_DOUBLE_STRUCK_SMALL_PI  L"\u213c"
+#define UNITEXT_DOUBLE_STRUCK_SMALL_PI  U"\u213c"
 #define UNICODE_DOUBLE_STRUCK_SMALL_GAMMA  0x213d
-#define UNITEXT_DOUBLE_STRUCK_SMALL_GAMMA  L"\u213d"
+#define UNITEXT_DOUBLE_STRUCK_SMALL_GAMMA  U"\u213d"
 #define UNICODE_DOUBLE_STRUCK_CAPITAL_GAMMA  0x213e
-#define UNITEXT_DOUBLE_STRUCK_CAPITAL_GAMMA  L"\u213e"
+#define UNITEXT_DOUBLE_STRUCK_CAPITAL_GAMMA  U"\u213e"
 #define UNICODE_DOUBLE_STRUCK_CAPITAL_PI  0x213f
-#define UNITEXT_DOUBLE_STRUCK_CAPITAL_PI  L"\u213f"
+#define UNITEXT_DOUBLE_STRUCK_CAPITAL_PI  U"\u213f"
 #define UNICODE_DOUBLE_STRUCK_N_ARY_SUMMATION  0x2140
-#define UNITEXT_DOUBLE_STRUCK_N_ARY_SUMMATION  L"\u2140"
+#define UNITEXT_DOUBLE_STRUCK_N_ARY_SUMMATION  U"\u2140"
 #define UNICODE_TURNED_SANS_SERIF_CAPITAL_G  0x2141
-#define UNITEXT_TURNED_SANS_SERIF_CAPITAL_G  L"\u2141"
+#define UNITEXT_TURNED_SANS_SERIF_CAPITAL_G  U"\u2141"
 #define UNICODE_TURNED_SANS_SERIF_CAPITAL_L  0x2142
-#define UNITEXT_TURNED_SANS_SERIF_CAPITAL_L  L"\u2142"
+#define UNITEXT_TURNED_SANS_SERIF_CAPITAL_L  U"\u2142"
 #define UNICODE_REVERSED_SANS_SERIF_CAPITAL_L  0x2143
-#define UNITEXT_REVERSED_SANS_SERIF_CAPITAL_L  L"\u2143"
+#define UNITEXT_REVERSED_SANS_SERIF_CAPITAL_L  U"\u2143"
 #define UNICODE_TURNED_SANS_SERIF_CAPITAL_Y  0x2144
-#define UNITEXT_TURNED_SANS_SERIF_CAPITAL_Y  L"\u2144"
+#define UNITEXT_TURNED_SANS_SERIF_CAPITAL_Y  U"\u2144"
 #define UNICODE_DOUBLE_STRUCK_ITALIC_CAPITAL_D  0x2145
-#define UNITEXT_DOUBLE_STRUCK_ITALIC_CAPITAL_D  L"\u2145"
+#define UNITEXT_DOUBLE_STRUCK_ITALIC_CAPITAL_D  U"\u2145"
 #define UNICODE_DOUBLE_STRUCK_ITALIC_SMALL_D  0x2146
-#define UNITEXT_DOUBLE_STRUCK_ITALIC_SMALL_D  L"\u2146"
+#define UNITEXT_DOUBLE_STRUCK_ITALIC_SMALL_D  U"\u2146"
 #define UNICODE_DOUBLE_STRUCK_ITALIC_SMALL_E  0x2147
-#define UNITEXT_DOUBLE_STRUCK_ITALIC_SMALL_E  L"\u2147"
+#define UNITEXT_DOUBLE_STRUCK_ITALIC_SMALL_E  U"\u2147"
 #define UNICODE_DOUBLE_STRUCK_ITALIC_SMALL_I  0x2148
-#define UNITEXT_DOUBLE_STRUCK_ITALIC_SMALL_I  L"\u2148"
+#define UNITEXT_DOUBLE_STRUCK_ITALIC_SMALL_I  U"\u2148"
 #define UNICODE_DOUBLE_STRUCK_ITALIC_SMALL_J  0x2149
-#define UNITEXT_DOUBLE_STRUCK_ITALIC_SMALL_J  L"\u2149"
+#define UNITEXT_DOUBLE_STRUCK_ITALIC_SMALL_J  U"\u2149"
 #define UNICODE_PROPERTY_LINE  0x214a
-#define UNITEXT_PROPERTY_LINE  L"\u214a"
+#define UNITEXT_PROPERTY_LINE  U"\u214a"
 #define UNICODE_TURNED_AMPERSAND  0x214b
-#define UNITEXT_TURNED_AMPERSAND  L"\u214b"
+#define UNITEXT_TURNED_AMPERSAND  U"\u214b"
 #define UNICODE_PER_SIGN  0x214c
-#define UNITEXT_PER_SIGN  L"\u214c"
+#define UNITEXT_PER_SIGN  U"\u214c"
 #define UNICODE_AKTIESELSKAB  0x214d
-#define UNITEXT_AKTIESELSKAB  L"\u214d"
+#define UNITEXT_AKTIESELSKAB  U"\u214d"
 #define UNICODE_TURNED_SMALL_F  0x214e
-#define UNITEXT_TURNED_SMALL_F  L"\u214e"
+#define UNITEXT_TURNED_SMALL_F  U"\u214e"
 #define UNICODE_VULGAR_FRACTION_ONE_THIRD  0x2153
-#define UNITEXT_VULGAR_FRACTION_ONE_THIRD  L"\u2153"
+#define UNITEXT_VULGAR_FRACTION_ONE_THIRD  U"\u2153"
 #define UNICODE_VULGAR_FRACTION_TWO_THIRDS  0x2154
-#define UNITEXT_VULGAR_FRACTION_TWO_THIRDS  L"\u2154"
+#define UNITEXT_VULGAR_FRACTION_TWO_THIRDS  U"\u2154"
 #define UNICODE_VULGAR_FRACTION_ONE_FIFTH  0x2155
-#define UNITEXT_VULGAR_FRACTION_ONE_FIFTH  L"\u2155"
+#define UNITEXT_VULGAR_FRACTION_ONE_FIFTH  U"\u2155"
 #define UNICODE_VULGAR_FRACTION_TWO_FIFTHS  0x2156
-#define UNITEXT_VULGAR_FRACTION_TWO_FIFTHS  L"\u2156"
+#define UNITEXT_VULGAR_FRACTION_TWO_FIFTHS  U"\u2156"
 #define UNICODE_VULGAR_FRACTION_THREE_FIFTHS  0x2157
-#define UNITEXT_VULGAR_FRACTION_THREE_FIFTHS  L"\u2157"
+#define UNITEXT_VULGAR_FRACTION_THREE_FIFTHS  U"\u2157"
 #define UNICODE_VULGAR_FRACTION_FOUR_FIFTHS  0x2158
-#define UNITEXT_VULGAR_FRACTION_FOUR_FIFTHS  L"\u2158"
+#define UNITEXT_VULGAR_FRACTION_FOUR_FIFTHS  U"\u2158"
 #define UNICODE_VULGAR_FRACTION_ONE_SIXTH  0x2159
-#define UNITEXT_VULGAR_FRACTION_ONE_SIXTH  L"\u2159"
+#define UNITEXT_VULGAR_FRACTION_ONE_SIXTH  U"\u2159"
 #define UNICODE_VULGAR_FRACTION_FIVE_SIXTHS  0x215a
-#define UNITEXT_VULGAR_FRACTION_FIVE_SIXTHS  L"\u215a"
+#define UNITEXT_VULGAR_FRACTION_FIVE_SIXTHS  U"\u215a"
 #define UNICODE_VULGAR_FRACTION_ONE_EIGHTH  0x215b
-#define UNITEXT_VULGAR_FRACTION_ONE_EIGHTH  L"\u215b"
+#define UNITEXT_VULGAR_FRACTION_ONE_EIGHTH  U"\u215b"
 #define UNICODE_VULGAR_FRACTION_THREE_EIGHTHS  0x215c
-#define UNITEXT_VULGAR_FRACTION_THREE_EIGHTHS  L"\u215c"
+#define UNITEXT_VULGAR_FRACTION_THREE_EIGHTHS  U"\u215c"
 #define UNICODE_VULGAR_FRACTION_FIVE_EIGHTHS  0x215d
-#define UNITEXT_VULGAR_FRACTION_FIVE_EIGHTHS  L"\u215d"
+#define UNITEXT_VULGAR_FRACTION_FIVE_EIGHTHS  U"\u215d"
 #define UNICODE_VULGAR_FRACTION_SEVEN_EIGHTHS  0x215e
-#define UNITEXT_VULGAR_FRACTION_SEVEN_EIGHTHS  L"\u215e"
+#define UNITEXT_VULGAR_FRACTION_SEVEN_EIGHTHS  U"\u215e"
 #define UNICODE_FRACTION_NUMERATOR_ONE  0x215f
-#define UNITEXT_FRACTION_NUMERATOR_ONE  L"\u215f"
+#define UNITEXT_FRACTION_NUMERATOR_ONE  U"\u215f"
 #define UNICODE_ROMAN_NUMERAL_ONE  0x2160
-#define UNITEXT_ROMAN_NUMERAL_ONE  L"\u2160"
+#define UNITEXT_ROMAN_NUMERAL_ONE  U"\u2160"
 #define UNICODE_ROMAN_NUMERAL_TWO  0x2161
-#define UNITEXT_ROMAN_NUMERAL_TWO  L"\u2161"
+#define UNITEXT_ROMAN_NUMERAL_TWO  U"\u2161"
 #define UNICODE_ROMAN_NUMERAL_THREE  0x2162
-#define UNITEXT_ROMAN_NUMERAL_THREE  L"\u2162"
+#define UNITEXT_ROMAN_NUMERAL_THREE  U"\u2162"
 #define UNICODE_ROMAN_NUMERAL_FOUR  0x2163
-#define UNITEXT_ROMAN_NUMERAL_FOUR  L"\u2163"
+#define UNITEXT_ROMAN_NUMERAL_FOUR  U"\u2163"
 #define UNICODE_ROMAN_NUMERAL_FIVE  0x2164
-#define UNITEXT_ROMAN_NUMERAL_FIVE  L"\u2164"
+#define UNITEXT_ROMAN_NUMERAL_FIVE  U"\u2164"
 #define UNICODE_ROMAN_NUMERAL_SIX  0x2165
-#define UNITEXT_ROMAN_NUMERAL_SIX  L"\u2165"
+#define UNITEXT_ROMAN_NUMERAL_SIX  U"\u2165"
 #define UNICODE_ROMAN_NUMERAL_SEVEN  0x2166
-#define UNITEXT_ROMAN_NUMERAL_SEVEN  L"\u2166"
+#define UNITEXT_ROMAN_NUMERAL_SEVEN  U"\u2166"
 #define UNICODE_ROMAN_NUMERAL_EIGHT  0x2167
-#define UNITEXT_ROMAN_NUMERAL_EIGHT  L"\u2167"
+#define UNITEXT_ROMAN_NUMERAL_EIGHT  U"\u2167"
 #define UNICODE_ROMAN_NUMERAL_NINE  0x2168
-#define UNITEXT_ROMAN_NUMERAL_NINE  L"\u2168"
+#define UNITEXT_ROMAN_NUMERAL_NINE  U"\u2168"
 #define UNICODE_ROMAN_NUMERAL_TEN  0x2169
-#define UNITEXT_ROMAN_NUMERAL_TEN  L"\u2169"
+#define UNITEXT_ROMAN_NUMERAL_TEN  U"\u2169"
 #define UNICODE_ROMAN_NUMERAL_ELEVEN  0x216a
-#define UNITEXT_ROMAN_NUMERAL_ELEVEN  L"\u216a"
+#define UNITEXT_ROMAN_NUMERAL_ELEVEN  U"\u216a"
 #define UNICODE_ROMAN_NUMERAL_TWELVE  0x216b
-#define UNITEXT_ROMAN_NUMERAL_TWELVE  L"\u216b"
+#define UNITEXT_ROMAN_NUMERAL_TWELVE  U"\u216b"
 #define UNICODE_ROMAN_NUMERAL_FIFTY  0x216c
-#define UNITEXT_ROMAN_NUMERAL_FIFTY  L"\u216c"
+#define UNITEXT_ROMAN_NUMERAL_FIFTY  U"\u216c"
 #define UNICODE_ROMAN_NUMERAL_ONE_HUNDRED  0x216d
-#define UNITEXT_ROMAN_NUMERAL_ONE_HUNDRED  L"\u216d"
+#define UNITEXT_ROMAN_NUMERAL_ONE_HUNDRED  U"\u216d"
 #define UNICODE_ROMAN_NUMERAL_FIVE_HUNDRED  0x216e
-#define UNITEXT_ROMAN_NUMERAL_FIVE_HUNDRED  L"\u216e"
+#define UNITEXT_ROMAN_NUMERAL_FIVE_HUNDRED  U"\u216e"
 #define UNICODE_ROMAN_NUMERAL_ONE_THOUSAND  0x216f
-#define UNITEXT_ROMAN_NUMERAL_ONE_THOUSAND  L"\u216f"
+#define UNITEXT_ROMAN_NUMERAL_ONE_THOUSAND  U"\u216f"
 #define UNICODE_SMALL_ROMAN_NUMERAL_ONE  0x2170
-#define UNITEXT_SMALL_ROMAN_NUMERAL_ONE  L"\u2170"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_ONE  U"\u2170"
 #define UNICODE_SMALL_ROMAN_NUMERAL_TWO  0x2171
-#define UNITEXT_SMALL_ROMAN_NUMERAL_TWO  L"\u2171"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_TWO  U"\u2171"
 #define UNICODE_SMALL_ROMAN_NUMERAL_THREE  0x2172
-#define UNITEXT_SMALL_ROMAN_NUMERAL_THREE  L"\u2172"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_THREE  U"\u2172"
 #define UNICODE_SMALL_ROMAN_NUMERAL_FOUR  0x2173
-#define UNITEXT_SMALL_ROMAN_NUMERAL_FOUR  L"\u2173"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_FOUR  U"\u2173"
 #define UNICODE_SMALL_ROMAN_NUMERAL_FIVE  0x2174
-#define UNITEXT_SMALL_ROMAN_NUMERAL_FIVE  L"\u2174"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_FIVE  U"\u2174"
 #define UNICODE_SMALL_ROMAN_NUMERAL_SIX  0x2175
-#define UNITEXT_SMALL_ROMAN_NUMERAL_SIX  L"\u2175"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_SIX  U"\u2175"
 #define UNICODE_SMALL_ROMAN_NUMERAL_SEVEN  0x2176
-#define UNITEXT_SMALL_ROMAN_NUMERAL_SEVEN  L"\u2176"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_SEVEN  U"\u2176"
 #define UNICODE_SMALL_ROMAN_NUMERAL_EIGHT  0x2177
-#define UNITEXT_SMALL_ROMAN_NUMERAL_EIGHT  L"\u2177"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_EIGHT  U"\u2177"
 #define UNICODE_SMALL_ROMAN_NUMERAL_NINE  0x2178
-#define UNITEXT_SMALL_ROMAN_NUMERAL_NINE  L"\u2178"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_NINE  U"\u2178"
 #define UNICODE_SMALL_ROMAN_NUMERAL_TEN  0x2179
-#define UNITEXT_SMALL_ROMAN_NUMERAL_TEN  L"\u2179"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_TEN  U"\u2179"
 #define UNICODE_SMALL_ROMAN_NUMERAL_ELEVEN  0x217a
-#define UNITEXT_SMALL_ROMAN_NUMERAL_ELEVEN  L"\u217a"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_ELEVEN  U"\u217a"
 #define UNICODE_SMALL_ROMAN_NUMERAL_TWELVE  0x217b
-#define UNITEXT_SMALL_ROMAN_NUMERAL_TWELVE  L"\u217b"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_TWELVE  U"\u217b"
 #define UNICODE_SMALL_ROMAN_NUMERAL_FIFTY  0x217c
-#define UNITEXT_SMALL_ROMAN_NUMERAL_FIFTY  L"\u217c"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_FIFTY  U"\u217c"
 #define UNICODE_SMALL_ROMAN_NUMERAL_ONE_HUNDRED  0x217d
-#define UNITEXT_SMALL_ROMAN_NUMERAL_ONE_HUNDRED  L"\u217d"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_ONE_HUNDRED  U"\u217d"
 #define UNICODE_SMALL_ROMAN_NUMERAL_FIVE_HUNDRED  0x217e
-#define UNITEXT_SMALL_ROMAN_NUMERAL_FIVE_HUNDRED  L"\u217e"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_FIVE_HUNDRED  U"\u217e"
 #define UNICODE_SMALL_ROMAN_NUMERAL_ONE_THOUSAND  0x217f
-#define UNITEXT_SMALL_ROMAN_NUMERAL_ONE_THOUSAND  L"\u217f"
+#define UNITEXT_SMALL_ROMAN_NUMERAL_ONE_THOUSAND  U"\u217f"
 #define UNICODE_ROMAN_NUMERAL_ONE_THOUSAND_C_D  0x2180
-#define UNITEXT_ROMAN_NUMERAL_ONE_THOUSAND_C_D  L"\u2180"
+#define UNITEXT_ROMAN_NUMERAL_ONE_THOUSAND_C_D  U"\u2180"
 #define UNICODE_ROMAN_NUMERAL_FIVE_THOUSAND  0x2181
-#define UNITEXT_ROMAN_NUMERAL_FIVE_THOUSAND  L"\u2181"
+#define UNITEXT_ROMAN_NUMERAL_FIVE_THOUSAND  U"\u2181"
 #define UNICODE_ROMAN_NUMERAL_TEN_THOUSAND  0x2182
-#define UNITEXT_ROMAN_NUMERAL_TEN_THOUSAND  L"\u2182"
+#define UNITEXT_ROMAN_NUMERAL_TEN_THOUSAND  U"\u2182"
 #define UNICODE_ROMAN_NUMERAL_REVERSED_ONE_HUNDRED  0x2183
-#define UNITEXT_ROMAN_NUMERAL_REVERSED_ONE_HUNDRED  L"\u2183"
+#define UNITEXT_ROMAN_NUMERAL_REVERSED_ONE_HUNDRED  U"\u2183"
 #define UNICODE_LATIN_SMALL_LETTER_REVERSED_C  0x2184
-#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_C  L"\u2184"
+#define UNITEXT_LATIN_SMALL_LETTER_REVERSED_C  U"\u2184"
 #define UNICODE_LEFTWARDS_ARROW  0x2190
-#define UNITEXT_LEFTWARDS_ARROW  L"\u2190"
+#define UNITEXT_LEFTWARDS_ARROW  U"\u2190"
 #define UNICODE_UPWARDS_ARROW  0x2191
-#define UNITEXT_UPWARDS_ARROW  L"\u2191"
+#define UNITEXT_UPWARDS_ARROW  U"\u2191"
 #define UNICODE_RIGHTWARDS_ARROW  0x2192
-#define UNITEXT_RIGHTWARDS_ARROW  L"\u2192"
+#define UNITEXT_RIGHTWARDS_ARROW  U"\u2192"
 #define UNICODE_DOWNWARDS_ARROW  0x2193
-#define UNITEXT_DOWNWARDS_ARROW  L"\u2193"
+#define UNITEXT_DOWNWARDS_ARROW  U"\u2193"
 #define UNICODE_LEFT_RIGHT_ARROW  0x2194
-#define UNITEXT_LEFT_RIGHT_ARROW  L"\u2194"
+#define UNITEXT_LEFT_RIGHT_ARROW  U"\u2194"
 #define UNICODE_UP_DOWN_ARROW  0x2195
-#define UNITEXT_UP_DOWN_ARROW  L"\u2195"
+#define UNITEXT_UP_DOWN_ARROW  U"\u2195"
 #define UNICODE_NORTH_WEST_ARROW  0x2196
-#define UNITEXT_NORTH_WEST_ARROW  L"\u2196"
+#define UNITEXT_NORTH_WEST_ARROW  U"\u2196"
 #define UNICODE_NORTH_EAST_ARROW  0x2197
-#define UNITEXT_NORTH_EAST_ARROW  L"\u2197"
+#define UNITEXT_NORTH_EAST_ARROW  U"\u2197"
 #define UNICODE_SOUTH_EAST_ARROW  0x2198
-#define UNITEXT_SOUTH_EAST_ARROW  L"\u2198"
+#define UNITEXT_SOUTH_EAST_ARROW  U"\u2198"
 #define UNICODE_SOUTH_WEST_ARROW  0x2199
-#define UNITEXT_SOUTH_WEST_ARROW  L"\u2199"
+#define UNITEXT_SOUTH_WEST_ARROW  U"\u2199"
 #define UNICODE_LEFTWARDS_ARROW_WITH_STROKE  0x219a
-#define UNITEXT_LEFTWARDS_ARROW_WITH_STROKE  L"\u219a"
+#define UNITEXT_LEFTWARDS_ARROW_WITH_STROKE  U"\u219a"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_STROKE  0x219b
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_STROKE  L"\u219b"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_STROKE  U"\u219b"
 #define UNICODE_LEFTWARDS_WAVE_ARROW  0x219c
-#define UNITEXT_LEFTWARDS_WAVE_ARROW  L"\u219c"
+#define UNITEXT_LEFTWARDS_WAVE_ARROW  U"\u219c"
 #define UNICODE_RIGHTWARDS_WAVE_ARROW  0x219d
-#define UNITEXT_RIGHTWARDS_WAVE_ARROW  L"\u219d"
+#define UNITEXT_RIGHTWARDS_WAVE_ARROW  U"\u219d"
 #define UNICODE_LEFTWARDS_TWO_HEADED_ARROW  0x219e
-#define UNITEXT_LEFTWARDS_TWO_HEADED_ARROW  L"\u219e"
+#define UNITEXT_LEFTWARDS_TWO_HEADED_ARROW  U"\u219e"
 #define UNICODE_UPWARDS_TWO_HEADED_ARROW  0x219f
-#define UNITEXT_UPWARDS_TWO_HEADED_ARROW  L"\u219f"
+#define UNITEXT_UPWARDS_TWO_HEADED_ARROW  U"\u219f"
 #define UNICODE_RIGHTWARDS_TWO_HEADED_ARROW  0x21a0
-#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW  L"\u21a0"
+#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW  U"\u21a0"
 #define UNICODE_DOWNWARDS_TWO_HEADED_ARROW  0x21a1
-#define UNITEXT_DOWNWARDS_TWO_HEADED_ARROW  L"\u21a1"
+#define UNITEXT_DOWNWARDS_TWO_HEADED_ARROW  U"\u21a1"
 #define UNICODE_LEFTWARDS_ARROW_WITH_TAIL  0x21a2
-#define UNITEXT_LEFTWARDS_ARROW_WITH_TAIL  L"\u21a2"
+#define UNITEXT_LEFTWARDS_ARROW_WITH_TAIL  U"\u21a2"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_TAIL  0x21a3
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_TAIL  L"\u21a3"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_TAIL  U"\u21a3"
 #define UNICODE_LEFTWARDS_ARROW_FROM_BAR  0x21a4
-#define UNITEXT_LEFTWARDS_ARROW_FROM_BAR  L"\u21a4"
+#define UNITEXT_LEFTWARDS_ARROW_FROM_BAR  U"\u21a4"
 #define UNICODE_UPWARDS_ARROW_FROM_BAR  0x21a5
-#define UNITEXT_UPWARDS_ARROW_FROM_BAR  L"\u21a5"
+#define UNITEXT_UPWARDS_ARROW_FROM_BAR  U"\u21a5"
 #define UNICODE_RIGHTWARDS_ARROW_FROM_BAR  0x21a6
-#define UNITEXT_RIGHTWARDS_ARROW_FROM_BAR  L"\u21a6"
+#define UNITEXT_RIGHTWARDS_ARROW_FROM_BAR  U"\u21a6"
 #define UNICODE_DOWNWARDS_ARROW_FROM_BAR  0x21a7
-#define UNITEXT_DOWNWARDS_ARROW_FROM_BAR  L"\u21a7"
+#define UNITEXT_DOWNWARDS_ARROW_FROM_BAR  U"\u21a7"
 #define UNICODE_UP_DOWN_ARROW_WITH_BASE  0x21a8
-#define UNITEXT_UP_DOWN_ARROW_WITH_BASE  L"\u21a8"
+#define UNITEXT_UP_DOWN_ARROW_WITH_BASE  U"\u21a8"
 #define UNICODE_LEFTWARDS_ARROW_WITH_HOOK  0x21a9
-#define UNITEXT_LEFTWARDS_ARROW_WITH_HOOK  L"\u21a9"
+#define UNITEXT_LEFTWARDS_ARROW_WITH_HOOK  U"\u21a9"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_HOOK  0x21aa
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_HOOK  L"\u21aa"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_HOOK  U"\u21aa"
 #define UNICODE_LEFTWARDS_ARROW_WITH_LOOP  0x21ab
-#define UNITEXT_LEFTWARDS_ARROW_WITH_LOOP  L"\u21ab"
+#define UNITEXT_LEFTWARDS_ARROW_WITH_LOOP  U"\u21ab"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_LOOP  0x21ac
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_LOOP  L"\u21ac"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_LOOP  U"\u21ac"
 #define UNICODE_LEFT_RIGHT_WAVE_ARROW  0x21ad
-#define UNITEXT_LEFT_RIGHT_WAVE_ARROW  L"\u21ad"
+#define UNITEXT_LEFT_RIGHT_WAVE_ARROW  U"\u21ad"
 #define UNICODE_LEFT_RIGHT_ARROW_WITH_STROKE  0x21ae
-#define UNITEXT_LEFT_RIGHT_ARROW_WITH_STROKE  L"\u21ae"
+#define UNITEXT_LEFT_RIGHT_ARROW_WITH_STROKE  U"\u21ae"
 #define UNICODE_DOWNWARDS_ZIGZAG_ARROW  0x21af
-#define UNITEXT_DOWNWARDS_ZIGZAG_ARROW  L"\u21af"
+#define UNITEXT_DOWNWARDS_ZIGZAG_ARROW  U"\u21af"
 #define UNICODE_UPWARDS_ARROW_WITH_TIP_LEFTWARDS  0x21b0
-#define UNITEXT_UPWARDS_ARROW_WITH_TIP_LEFTWARDS  L"\u21b0"
+#define UNITEXT_UPWARDS_ARROW_WITH_TIP_LEFTWARDS  U"\u21b0"
 #define UNICODE_UPWARDS_ARROW_WITH_TIP_RIGHTWARDS  0x21b1
-#define UNITEXT_UPWARDS_ARROW_WITH_TIP_RIGHTWARDS  L"\u21b1"
+#define UNITEXT_UPWARDS_ARROW_WITH_TIP_RIGHTWARDS  U"\u21b1"
 #define UNICODE_DOWNWARDS_ARROW_WITH_TIP_LEFTWARDS  0x21b2
-#define UNITEXT_DOWNWARDS_ARROW_WITH_TIP_LEFTWARDS  L"\u21b2"
+#define UNITEXT_DOWNWARDS_ARROW_WITH_TIP_LEFTWARDS  U"\u21b2"
 #define UNICODE_DOWNWARDS_ARROW_WITH_TIP_RIGHTWARDS  0x21b3
-#define UNITEXT_DOWNWARDS_ARROW_WITH_TIP_RIGHTWARDS  L"\u21b3"
+#define UNITEXT_DOWNWARDS_ARROW_WITH_TIP_RIGHTWARDS  U"\u21b3"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_CORNER_DOWNWARDS  0x21b4
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_CORNER_DOWNWARDS  L"\u21b4"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_CORNER_DOWNWARDS  U"\u21b4"
 #define UNICODE_DOWNWARDS_ARROW_WITH_CORNER_LEFTWARDS  0x21b5
-#define UNITEXT_DOWNWARDS_ARROW_WITH_CORNER_LEFTWARDS  L"\u21b5"
+#define UNITEXT_DOWNWARDS_ARROW_WITH_CORNER_LEFTWARDS  U"\u21b5"
 #define UNICODE_ANTICLOCKWISE_TOP_SEMICIRCLE_ARROW  0x21b6
-#define UNITEXT_ANTICLOCKWISE_TOP_SEMICIRCLE_ARROW  L"\u21b6"
+#define UNITEXT_ANTICLOCKWISE_TOP_SEMICIRCLE_ARROW  U"\u21b6"
 #define UNICODE_CLOCKWISE_TOP_SEMICIRCLE_ARROW  0x21b7
-#define UNITEXT_CLOCKWISE_TOP_SEMICIRCLE_ARROW  L"\u21b7"
+#define UNITEXT_CLOCKWISE_TOP_SEMICIRCLE_ARROW  U"\u21b7"
 #define UNICODE_NORTH_WEST_ARROW_TO_LONG_BAR  0x21b8
-#define UNITEXT_NORTH_WEST_ARROW_TO_LONG_BAR  L"\u21b8"
+#define UNITEXT_NORTH_WEST_ARROW_TO_LONG_BAR  U"\u21b8"
 #define UNICODE_LEFTWARDS_ARROW_TO_BAR_OVER_RIGHTWARDS_ARROW_TO_BAR  0x21b9
-#define UNITEXT_LEFTWARDS_ARROW_TO_BAR_OVER_RIGHTWARDS_ARROW_TO_BAR  L"\u21b9"
+#define UNITEXT_LEFTWARDS_ARROW_TO_BAR_OVER_RIGHTWARDS_ARROW_TO_BAR  U"\u21b9"
 #define UNICODE_ANTICLOCKWISE_OPEN_CIRCLE_ARROW  0x21ba
-#define UNITEXT_ANTICLOCKWISE_OPEN_CIRCLE_ARROW  L"\u21ba"
+#define UNITEXT_ANTICLOCKWISE_OPEN_CIRCLE_ARROW  U"\u21ba"
 #define UNICODE_CLOCKWISE_OPEN_CIRCLE_ARROW  0x21bb
-#define UNITEXT_CLOCKWISE_OPEN_CIRCLE_ARROW  L"\u21bb"
+#define UNITEXT_CLOCKWISE_OPEN_CIRCLE_ARROW  U"\u21bb"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_UPWARDS  0x21bc
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UPWARDS  L"\u21bc"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UPWARDS  U"\u21bc"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS  0x21bd
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS  L"\u21bd"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_DOWNWARDS  U"\u21bd"
 #define UNICODE_UPWARDS_HARPOON_WITH_BARB_RIGHTWARDS  0x21be
-#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_RIGHTWARDS  L"\u21be"
+#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_RIGHTWARDS  U"\u21be"
 #define UNICODE_UPWARDS_HARPOON_WITH_BARB_LEFTWARDS  0x21bf
-#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_LEFTWARDS  L"\u21bf"
+#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_LEFTWARDS  U"\u21bf"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_UPWARDS  0x21c0
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UPWARDS  L"\u21c0"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UPWARDS  U"\u21c0"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS  0x21c1
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS  L"\u21c1"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_DOWNWARDS  U"\u21c1"
 #define UNICODE_DOWNWARDS_HARPOON_WITH_BARB_RIGHTWARDS  0x21c2
-#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_RIGHTWARDS  L"\u21c2"
+#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_RIGHTWARDS  U"\u21c2"
 #define UNICODE_DOWNWARDS_HARPOON_WITH_BARB_LEFTWARDS  0x21c3
-#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_LEFTWARDS  L"\u21c3"
+#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_LEFTWARDS  U"\u21c3"
 #define UNICODE_RIGHTWARDS_ARROW_OVER_LEFTWARDS_ARROW  0x21c4
-#define UNITEXT_RIGHTWARDS_ARROW_OVER_LEFTWARDS_ARROW  L"\u21c4"
+#define UNITEXT_RIGHTWARDS_ARROW_OVER_LEFTWARDS_ARROW  U"\u21c4"
 #define UNICODE_UPWARDS_ARROW_LEFTWARDS_OF_DOWNWARDS_ARROW  0x21c5
-#define UNITEXT_UPWARDS_ARROW_LEFTWARDS_OF_DOWNWARDS_ARROW  L"\u21c5"
+#define UNITEXT_UPWARDS_ARROW_LEFTWARDS_OF_DOWNWARDS_ARROW  U"\u21c5"
 #define UNICODE_LEFTWARDS_ARROW_OVER_RIGHTWARDS_ARROW  0x21c6
-#define UNITEXT_LEFTWARDS_ARROW_OVER_RIGHTWARDS_ARROW  L"\u21c6"
+#define UNITEXT_LEFTWARDS_ARROW_OVER_RIGHTWARDS_ARROW  U"\u21c6"
 #define UNICODE_LEFTWARDS_PAIRED_ARROWS  0x21c7
-#define UNITEXT_LEFTWARDS_PAIRED_ARROWS  L"\u21c7"
+#define UNITEXT_LEFTWARDS_PAIRED_ARROWS  U"\u21c7"
 #define UNICODE_UPWARDS_PAIRED_ARROWS  0x21c8
-#define UNITEXT_UPWARDS_PAIRED_ARROWS  L"\u21c8"
+#define UNITEXT_UPWARDS_PAIRED_ARROWS  U"\u21c8"
 #define UNICODE_RIGHTWARDS_PAIRED_ARROWS  0x21c9
-#define UNITEXT_RIGHTWARDS_PAIRED_ARROWS  L"\u21c9"
+#define UNITEXT_RIGHTWARDS_PAIRED_ARROWS  U"\u21c9"
 #define UNICODE_DOWNWARDS_PAIRED_ARROWS  0x21ca
-#define UNITEXT_DOWNWARDS_PAIRED_ARROWS  L"\u21ca"
+#define UNITEXT_DOWNWARDS_PAIRED_ARROWS  U"\u21ca"
 #define UNICODE_LEFTWARDS_HARPOON_OVER_RIGHTWARDS_HARPOON  0x21cb
-#define UNITEXT_LEFTWARDS_HARPOON_OVER_RIGHTWARDS_HARPOON  L"\u21cb"
+#define UNITEXT_LEFTWARDS_HARPOON_OVER_RIGHTWARDS_HARPOON  U"\u21cb"
 #define UNICODE_RIGHTWARDS_HARPOON_OVER_LEFTWARDS_HARPOON  0x21cc
-#define UNITEXT_RIGHTWARDS_HARPOON_OVER_LEFTWARDS_HARPOON  L"\u21cc"
+#define UNITEXT_RIGHTWARDS_HARPOON_OVER_LEFTWARDS_HARPOON  U"\u21cc"
 #define UNICODE_LEFTWARDS_DOUBLE_ARROW_WITH_STROKE  0x21cd
-#define UNITEXT_LEFTWARDS_DOUBLE_ARROW_WITH_STROKE  L"\u21cd"
+#define UNITEXT_LEFTWARDS_DOUBLE_ARROW_WITH_STROKE  U"\u21cd"
 #define UNICODE_LEFT_RIGHT_DOUBLE_ARROW_WITH_STROKE  0x21ce
-#define UNITEXT_LEFT_RIGHT_DOUBLE_ARROW_WITH_STROKE  L"\u21ce"
+#define UNITEXT_LEFT_RIGHT_DOUBLE_ARROW_WITH_STROKE  U"\u21ce"
 #define UNICODE_RIGHTWARDS_DOUBLE_ARROW_WITH_STROKE  0x21cf
-#define UNITEXT_RIGHTWARDS_DOUBLE_ARROW_WITH_STROKE  L"\u21cf"
+#define UNITEXT_RIGHTWARDS_DOUBLE_ARROW_WITH_STROKE  U"\u21cf"
 #define UNICODE_LEFTWARDS_DOUBLE_ARROW  0x21d0
-#define UNITEXT_LEFTWARDS_DOUBLE_ARROW  L"\u21d0"
+#define UNITEXT_LEFTWARDS_DOUBLE_ARROW  U"\u21d0"
 #define UNICODE_UPWARDS_DOUBLE_ARROW  0x21d1
-#define UNITEXT_UPWARDS_DOUBLE_ARROW  L"\u21d1"
+#define UNITEXT_UPWARDS_DOUBLE_ARROW  U"\u21d1"
 #define UNICODE_RIGHTWARDS_DOUBLE_ARROW  0x21d2
-#define UNITEXT_RIGHTWARDS_DOUBLE_ARROW  L"\u21d2"
+#define UNITEXT_RIGHTWARDS_DOUBLE_ARROW  U"\u21d2"
 #define UNICODE_DOWNWARDS_DOUBLE_ARROW  0x21d3
-#define UNITEXT_DOWNWARDS_DOUBLE_ARROW  L"\u21d3"
+#define UNITEXT_DOWNWARDS_DOUBLE_ARROW  U"\u21d3"
 #define UNICODE_LEFT_RIGHT_DOUBLE_ARROW  0x21d4
-#define UNITEXT_LEFT_RIGHT_DOUBLE_ARROW  L"\u21d4"
+#define UNITEXT_LEFT_RIGHT_DOUBLE_ARROW  U"\u21d4"
 #define UNICODE_UP_DOWN_DOUBLE_ARROW  0x21d5
-#define UNITEXT_UP_DOWN_DOUBLE_ARROW  L"\u21d5"
+#define UNITEXT_UP_DOWN_DOUBLE_ARROW  U"\u21d5"
 #define UNICODE_NORTH_WEST_DOUBLE_ARROW  0x21d6
-#define UNITEXT_NORTH_WEST_DOUBLE_ARROW  L"\u21d6"
+#define UNITEXT_NORTH_WEST_DOUBLE_ARROW  U"\u21d6"
 #define UNICODE_NORTH_EAST_DOUBLE_ARROW  0x21d7
-#define UNITEXT_NORTH_EAST_DOUBLE_ARROW  L"\u21d7"
+#define UNITEXT_NORTH_EAST_DOUBLE_ARROW  U"\u21d7"
 #define UNICODE_SOUTH_EAST_DOUBLE_ARROW  0x21d8
-#define UNITEXT_SOUTH_EAST_DOUBLE_ARROW  L"\u21d8"
+#define UNITEXT_SOUTH_EAST_DOUBLE_ARROW  U"\u21d8"
 #define UNICODE_SOUTH_WEST_DOUBLE_ARROW  0x21d9
-#define UNITEXT_SOUTH_WEST_DOUBLE_ARROW  L"\u21d9"
+#define UNITEXT_SOUTH_WEST_DOUBLE_ARROW  U"\u21d9"
 #define UNICODE_LEFTWARDS_TRIPLE_ARROW  0x21da
-#define UNITEXT_LEFTWARDS_TRIPLE_ARROW  L"\u21da"
+#define UNITEXT_LEFTWARDS_TRIPLE_ARROW  U"\u21da"
 #define UNICODE_RIGHTWARDS_TRIPLE_ARROW  0x21db
-#define UNITEXT_RIGHTWARDS_TRIPLE_ARROW  L"\u21db"
+#define UNITEXT_RIGHTWARDS_TRIPLE_ARROW  U"\u21db"
 #define UNICODE_LEFTWARDS_SQUIGGLE_ARROW  0x21dc
-#define UNITEXT_LEFTWARDS_SQUIGGLE_ARROW  L"\u21dc"
+#define UNITEXT_LEFTWARDS_SQUIGGLE_ARROW  U"\u21dc"
 #define UNICODE_RIGHTWARDS_SQUIGGLE_ARROW  0x21dd
-#define UNITEXT_RIGHTWARDS_SQUIGGLE_ARROW  L"\u21dd"
+#define UNITEXT_RIGHTWARDS_SQUIGGLE_ARROW  U"\u21dd"
 #define UNICODE_UPWARDS_ARROW_WITH_DOUBLE_STROKE  0x21de
-#define UNITEXT_UPWARDS_ARROW_WITH_DOUBLE_STROKE  L"\u21de"
+#define UNITEXT_UPWARDS_ARROW_WITH_DOUBLE_STROKE  U"\u21de"
 #define UNICODE_DOWNWARDS_ARROW_WITH_DOUBLE_STROKE  0x21df
-#define UNITEXT_DOWNWARDS_ARROW_WITH_DOUBLE_STROKE  L"\u21df"
+#define UNITEXT_DOWNWARDS_ARROW_WITH_DOUBLE_STROKE  U"\u21df"
 #define UNICODE_LEFTWARDS_DASHED_ARROW  0x21e0
-#define UNITEXT_LEFTWARDS_DASHED_ARROW  L"\u21e0"
+#define UNITEXT_LEFTWARDS_DASHED_ARROW  U"\u21e0"
 #define UNICODE_UPWARDS_DASHED_ARROW  0x21e1
-#define UNITEXT_UPWARDS_DASHED_ARROW  L"\u21e1"
+#define UNITEXT_UPWARDS_DASHED_ARROW  U"\u21e1"
 #define UNICODE_RIGHTWARDS_DASHED_ARROW  0x21e2
-#define UNITEXT_RIGHTWARDS_DASHED_ARROW  L"\u21e2"
+#define UNITEXT_RIGHTWARDS_DASHED_ARROW  U"\u21e2"
 #define UNICODE_DOWNWARDS_DASHED_ARROW  0x21e3
-#define UNITEXT_DOWNWARDS_DASHED_ARROW  L"\u21e3"
+#define UNITEXT_DOWNWARDS_DASHED_ARROW  U"\u21e3"
 #define UNICODE_LEFTWARDS_ARROW_TO_BAR  0x21e4
-#define UNITEXT_LEFTWARDS_ARROW_TO_BAR  L"\u21e4"
+#define UNITEXT_LEFTWARDS_ARROW_TO_BAR  U"\u21e4"
 #define UNICODE_RIGHTWARDS_ARROW_TO_BAR  0x21e5
-#define UNITEXT_RIGHTWARDS_ARROW_TO_BAR  L"\u21e5"
+#define UNITEXT_RIGHTWARDS_ARROW_TO_BAR  U"\u21e5"
 #define UNICODE_LEFTWARDS_WHITE_ARROW  0x21e6
-#define UNITEXT_LEFTWARDS_WHITE_ARROW  L"\u21e6"
+#define UNITEXT_LEFTWARDS_WHITE_ARROW  U"\u21e6"
 #define UNICODE_UPWARDS_WHITE_ARROW  0x21e7
-#define UNITEXT_UPWARDS_WHITE_ARROW  L"\u21e7"
+#define UNITEXT_UPWARDS_WHITE_ARROW  U"\u21e7"
 #define UNICODE_RIGHTWARDS_WHITE_ARROW  0x21e8
-#define UNITEXT_RIGHTWARDS_WHITE_ARROW  L"\u21e8"
+#define UNITEXT_RIGHTWARDS_WHITE_ARROW  U"\u21e8"
 #define UNICODE_DOWNWARDS_WHITE_ARROW  0x21e9
-#define UNITEXT_DOWNWARDS_WHITE_ARROW  L"\u21e9"
+#define UNITEXT_DOWNWARDS_WHITE_ARROW  U"\u21e9"
 #define UNICODE_UPWARDS_WHITE_ARROW_FROM_BAR  0x21ea
-#define UNITEXT_UPWARDS_WHITE_ARROW_FROM_BAR  L"\u21ea"
+#define UNITEXT_UPWARDS_WHITE_ARROW_FROM_BAR  U"\u21ea"
 #define UNICODE_UPWARDS_WHITE_ARROW_ON_PEDESTAL  0x21eb
-#define UNITEXT_UPWARDS_WHITE_ARROW_ON_PEDESTAL  L"\u21eb"
+#define UNITEXT_UPWARDS_WHITE_ARROW_ON_PEDESTAL  U"\u21eb"
 #define UNICODE_UPWARDS_WHITE_ARROW_ON_PEDESTAL_WITH_HORIZONTAL_BAR  0x21ec
-#define UNITEXT_UPWARDS_WHITE_ARROW_ON_PEDESTAL_WITH_HORIZONTAL_BAR  L"\u21ec"
+#define UNITEXT_UPWARDS_WHITE_ARROW_ON_PEDESTAL_WITH_HORIZONTAL_BAR  U"\u21ec"
 #define UNICODE_UPWARDS_WHITE_ARROW_ON_PEDESTAL_WITH_VERTICAL_BAR  0x21ed
-#define UNITEXT_UPWARDS_WHITE_ARROW_ON_PEDESTAL_WITH_VERTICAL_BAR  L"\u21ed"
+#define UNITEXT_UPWARDS_WHITE_ARROW_ON_PEDESTAL_WITH_VERTICAL_BAR  U"\u21ed"
 #define UNICODE_UPWARDS_WHITE_DOUBLE_ARROW  0x21ee
-#define UNITEXT_UPWARDS_WHITE_DOUBLE_ARROW  L"\u21ee"
+#define UNITEXT_UPWARDS_WHITE_DOUBLE_ARROW  U"\u21ee"
 #define UNICODE_UPWARDS_WHITE_DOUBLE_ARROW_ON_PEDESTAL  0x21ef
-#define UNITEXT_UPWARDS_WHITE_DOUBLE_ARROW_ON_PEDESTAL  L"\u21ef"
+#define UNITEXT_UPWARDS_WHITE_DOUBLE_ARROW_ON_PEDESTAL  U"\u21ef"
 #define UNICODE_RIGHTWARDS_WHITE_ARROW_FROM_WALL  0x21f0
-#define UNITEXT_RIGHTWARDS_WHITE_ARROW_FROM_WALL  L"\u21f0"
+#define UNITEXT_RIGHTWARDS_WHITE_ARROW_FROM_WALL  U"\u21f0"
 #define UNICODE_NORTH_WEST_ARROW_TO_CORNER  0x21f1
-#define UNITEXT_NORTH_WEST_ARROW_TO_CORNER  L"\u21f1"
+#define UNITEXT_NORTH_WEST_ARROW_TO_CORNER  U"\u21f1"
 #define UNICODE_SOUTH_EAST_ARROW_TO_CORNER  0x21f2
-#define UNITEXT_SOUTH_EAST_ARROW_TO_CORNER  L"\u21f2"
+#define UNITEXT_SOUTH_EAST_ARROW_TO_CORNER  U"\u21f2"
 #define UNICODE_UP_DOWN_WHITE_ARROW  0x21f3
-#define UNITEXT_UP_DOWN_WHITE_ARROW  L"\u21f3"
+#define UNITEXT_UP_DOWN_WHITE_ARROW  U"\u21f3"
 #define UNICODE_RIGHT_ARROW_WITH_SMALL_CIRCLE  0x21f4
-#define UNITEXT_RIGHT_ARROW_WITH_SMALL_CIRCLE  L"\u21f4"
+#define UNITEXT_RIGHT_ARROW_WITH_SMALL_CIRCLE  U"\u21f4"
 #define UNICODE_DOWNWARDS_ARROW_LEFTWARDS_OF_UPWARDS_ARROW  0x21f5
-#define UNITEXT_DOWNWARDS_ARROW_LEFTWARDS_OF_UPWARDS_ARROW  L"\u21f5"
+#define UNITEXT_DOWNWARDS_ARROW_LEFTWARDS_OF_UPWARDS_ARROW  U"\u21f5"
 #define UNICODE_THREE_RIGHTWARDS_ARROWS  0x21f6
-#define UNITEXT_THREE_RIGHTWARDS_ARROWS  L"\u21f6"
+#define UNITEXT_THREE_RIGHTWARDS_ARROWS  U"\u21f6"
 #define UNICODE_LEFTWARDS_ARROW_WITH_VERTICAL_STROKE  0x21f7
-#define UNITEXT_LEFTWARDS_ARROW_WITH_VERTICAL_STROKE  L"\u21f7"
+#define UNITEXT_LEFTWARDS_ARROW_WITH_VERTICAL_STROKE  U"\u21f7"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_VERTICAL_STROKE  0x21f8
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_VERTICAL_STROKE  L"\u21f8"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_VERTICAL_STROKE  U"\u21f8"
 #define UNICODE_LEFT_RIGHT_ARROW_WITH_VERTICAL_STROKE  0x21f9
-#define UNITEXT_LEFT_RIGHT_ARROW_WITH_VERTICAL_STROKE  L"\u21f9"
+#define UNITEXT_LEFT_RIGHT_ARROW_WITH_VERTICAL_STROKE  U"\u21f9"
 #define UNICODE_LEFTWARDS_ARROW_WITH_DOUBLE_VERTICAL_STROKE  0x21fa
-#define UNITEXT_LEFTWARDS_ARROW_WITH_DOUBLE_VERTICAL_STROKE  L"\u21fa"
+#define UNITEXT_LEFTWARDS_ARROW_WITH_DOUBLE_VERTICAL_STROKE  U"\u21fa"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_DOUBLE_VERTICAL_STROKE  0x21fb
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_DOUBLE_VERTICAL_STROKE  L"\u21fb"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_DOUBLE_VERTICAL_STROKE  U"\u21fb"
 #define UNICODE_LEFT_RIGHT_ARROW_WITH_DOUBLE_VERTICAL_STROKE  0x21fc
-#define UNITEXT_LEFT_RIGHT_ARROW_WITH_DOUBLE_VERTICAL_STROKE  L"\u21fc"
+#define UNITEXT_LEFT_RIGHT_ARROW_WITH_DOUBLE_VERTICAL_STROKE  U"\u21fc"
 #define UNICODE_LEFTWARDS_OPEN_HEADED_ARROW  0x21fd
-#define UNITEXT_LEFTWARDS_OPEN_HEADED_ARROW  L"\u21fd"
+#define UNITEXT_LEFTWARDS_OPEN_HEADED_ARROW  U"\u21fd"
 #define UNICODE_RIGHTWARDS_OPEN_HEADED_ARROW  0x21fe
-#define UNITEXT_RIGHTWARDS_OPEN_HEADED_ARROW  L"\u21fe"
+#define UNITEXT_RIGHTWARDS_OPEN_HEADED_ARROW  U"\u21fe"
 #define UNICODE_LEFT_RIGHT_OPEN_HEADED_ARROW  0x21ff
-#define UNITEXT_LEFT_RIGHT_OPEN_HEADED_ARROW  L"\u21ff"
+#define UNITEXT_LEFT_RIGHT_OPEN_HEADED_ARROW  U"\u21ff"
 #define UNICODE_FOR_ALL  0x2200
-#define UNITEXT_FOR_ALL  L"\u2200"
+#define UNITEXT_FOR_ALL  U"\u2200"
 #define UNICODE_COMPLEMENT  0x2201
-#define UNITEXT_COMPLEMENT  L"\u2201"
+#define UNITEXT_COMPLEMENT  U"\u2201"
 #define UNICODE_PARTIAL_DIFFERENTIAL  0x2202
-#define UNITEXT_PARTIAL_DIFFERENTIAL  L"\u2202"
+#define UNITEXT_PARTIAL_DIFFERENTIAL  U"\u2202"
 #define UNICODE_THERE_EXISTS  0x2203
-#define UNITEXT_THERE_EXISTS  L"\u2203"
+#define UNITEXT_THERE_EXISTS  U"\u2203"
 #define UNICODE_THERE_DOES_NOT_EXIST  0x2204
-#define UNITEXT_THERE_DOES_NOT_EXIST  L"\u2204"
+#define UNITEXT_THERE_DOES_NOT_EXIST  U"\u2204"
 #define UNICODE_EMPTY_SET  0x2205
-#define UNITEXT_EMPTY_SET  L"\u2205"
+#define UNITEXT_EMPTY_SET  U"\u2205"
 #define UNICODE_INCREMENT  0x2206
-#define UNITEXT_INCREMENT  L"\u2206"
+#define UNITEXT_INCREMENT  U"\u2206"
 #define UNICODE_NABLA  0x2207
-#define UNITEXT_NABLA  L"\u2207"
+#define UNITEXT_NABLA  U"\u2207"
 #define UNICODE_ELEMENT_OF  0x2208
-#define UNITEXT_ELEMENT_OF  L"\u2208"
+#define UNITEXT_ELEMENT_OF  U"\u2208"
 #define UNICODE_NOT_AN_ELEMENT_OF  0x2209
-#define UNITEXT_NOT_AN_ELEMENT_OF  L"\u2209"
+#define UNITEXT_NOT_AN_ELEMENT_OF  U"\u2209"
 #define UNICODE_SMALL_ELEMENT_OF  0x220a
-#define UNITEXT_SMALL_ELEMENT_OF  L"\u220a"
+#define UNITEXT_SMALL_ELEMENT_OF  U"\u220a"
 #define UNICODE_CONTAINS_AS_MEMBER  0x220b
-#define UNITEXT_CONTAINS_AS_MEMBER  L"\u220b"
+#define UNITEXT_CONTAINS_AS_MEMBER  U"\u220b"
 #define UNICODE_DOES_NOT_CONTAIN_AS_MEMBER  0x220c
-#define UNITEXT_DOES_NOT_CONTAIN_AS_MEMBER  L"\u220c"
+#define UNITEXT_DOES_NOT_CONTAIN_AS_MEMBER  U"\u220c"
 #define UNICODE_SMALL_CONTAINS_AS_MEMBER  0x220d
-#define UNITEXT_SMALL_CONTAINS_AS_MEMBER  L"\u220d"
+#define UNITEXT_SMALL_CONTAINS_AS_MEMBER  U"\u220d"
 #define UNICODE_END_OF_PROOF  0x220e
-#define UNITEXT_END_OF_PROOF  L"\u220e"
+#define UNITEXT_END_OF_PROOF  U"\u220e"
 #define UNICODE_N_ARY_PRODUCT  0x220f
-#define UNITEXT_N_ARY_PRODUCT  L"\u220f"
+#define UNITEXT_N_ARY_PRODUCT  U"\u220f"
 #define UNICODE_N_ARY_COPRODUCT  0x2210
-#define UNITEXT_N_ARY_COPRODUCT  L"\u2210"
+#define UNITEXT_N_ARY_COPRODUCT  U"\u2210"
 #define UNICODE_N_ARY_SUMMATION  0x2211
-#define UNITEXT_N_ARY_SUMMATION  L"\u2211"
+#define UNITEXT_N_ARY_SUMMATION  U"\u2211"
 #define UNICODE_MINUS_SIGN  0x2212
-#define UNITEXT_MINUS_SIGN  L"\u2212"
+#define UNITEXT_MINUS_SIGN  U"\u2212"
 #define UNICODE_MINUS_OR_PLUS_SIGN  0x2213
-#define UNITEXT_MINUS_OR_PLUS_SIGN  L"\u2213"
+#define UNITEXT_MINUS_OR_PLUS_SIGN  U"\u2213"
 #define UNICODE_DOT_PLUS  0x2214
-#define UNITEXT_DOT_PLUS  L"\u2214"
+#define UNITEXT_DOT_PLUS  U"\u2214"
 #define UNICODE_DIVISION_SLASH  0x2215
-#define UNITEXT_DIVISION_SLASH  L"\u2215"
+#define UNITEXT_DIVISION_SLASH  U"\u2215"
 #define UNICODE_SET_MINUS  0x2216
-#define UNITEXT_SET_MINUS  L"\u2216"
+#define UNITEXT_SET_MINUS  U"\u2216"
 #define UNICODE_ASTERISK_OPERATOR  0x2217
-#define UNITEXT_ASTERISK_OPERATOR  L"\u2217"
+#define UNITEXT_ASTERISK_OPERATOR  U"\u2217"
 #define UNICODE_RING_OPERATOR  0x2218
-#define UNITEXT_RING_OPERATOR  L"\u2218"
+#define UNITEXT_RING_OPERATOR  U"\u2218"
 #define UNICODE_BULLET_OPERATOR  0x2219
-#define UNITEXT_BULLET_OPERATOR  L"\u2219"
+#define UNITEXT_BULLET_OPERATOR  U"\u2219"
 #define UNICODE_SQUARE_ROOT  0x221a
-#define UNITEXT_SQUARE_ROOT  L"\u221a"
+#define UNITEXT_SQUARE_ROOT  U"\u221a"
 #define UNICODE_CUBE_ROOT  0x221b
-#define UNITEXT_CUBE_ROOT  L"\u221b"
+#define UNITEXT_CUBE_ROOT  U"\u221b"
 #define UNICODE_FOURTH_ROOT  0x221c
-#define UNITEXT_FOURTH_ROOT  L"\u221c"
+#define UNITEXT_FOURTH_ROOT  U"\u221c"
 #define UNICODE_PROPORTIONAL_TO  0x221d
-#define UNITEXT_PROPORTIONAL_TO  L"\u221d"
+#define UNITEXT_PROPORTIONAL_TO  U"\u221d"
 #define UNICODE_INFINITY  0x221e
-#define UNITEXT_INFINITY  L"\u221e"
+#define UNITEXT_INFINITY  U"\u221e"
 #define UNICODE_RIGHT_ANGLE  0x221f
-#define UNITEXT_RIGHT_ANGLE  L"\u221f"
+#define UNITEXT_RIGHT_ANGLE  U"\u221f"
 #define UNICODE_ANGLE  0x2220
-#define UNITEXT_ANGLE  L"\u2220"
+#define UNITEXT_ANGLE  U"\u2220"
 #define UNICODE_MEASURED_ANGLE  0x2221
-#define UNITEXT_MEASURED_ANGLE  L"\u2221"
+#define UNITEXT_MEASURED_ANGLE  U"\u2221"
 #define UNICODE_SPHERICAL_ANGLE  0x2222
-#define UNITEXT_SPHERICAL_ANGLE  L"\u2222"
+#define UNITEXT_SPHERICAL_ANGLE  U"\u2222"
 #define UNICODE_DIVIDES  0x2223
-#define UNITEXT_DIVIDES  L"\u2223"
+#define UNITEXT_DIVIDES  U"\u2223"
 #define UNICODE_DOES_NOT_DIVIDE  0x2224
-#define UNITEXT_DOES_NOT_DIVIDE  L"\u2224"
+#define UNITEXT_DOES_NOT_DIVIDE  U"\u2224"
 #define UNICODE_PARALLEL_TO  0x2225
-#define UNITEXT_PARALLEL_TO  L"\u2225"
+#define UNITEXT_PARALLEL_TO  U"\u2225"
 #define UNICODE_NOT_PARALLEL_TO  0x2226
-#define UNITEXT_NOT_PARALLEL_TO  L"\u2226"
+#define UNITEXT_NOT_PARALLEL_TO  U"\u2226"
 #define UNICODE_LOGICAL_AND  0x2227
-#define UNITEXT_LOGICAL_AND  L"\u2227"
+#define UNITEXT_LOGICAL_AND  U"\u2227"
 #define UNICODE_LOGICAL_OR  0x2228
-#define UNITEXT_LOGICAL_OR  L"\u2228"
+#define UNITEXT_LOGICAL_OR  U"\u2228"
 #define UNICODE_INTERSECTION  0x2229
-#define UNITEXT_INTERSECTION  L"\u2229"
+#define UNITEXT_INTERSECTION  U"\u2229"
 #define UNICODE_UNION  0x222a
-#define UNITEXT_UNION  L"\u222a"
+#define UNITEXT_UNION  U"\u222a"
 #define UNICODE_INTEGRAL  0x222b
-#define UNITEXT_INTEGRAL  L"\u222b"
+#define UNITEXT_INTEGRAL  U"\u222b"
 #define UNICODE_DOUBLE_INTEGRAL  0x222c
-#define UNITEXT_DOUBLE_INTEGRAL  L"\u222c"
+#define UNITEXT_DOUBLE_INTEGRAL  U"\u222c"
 #define UNICODE_TRIPLE_INTEGRAL  0x222d
-#define UNITEXT_TRIPLE_INTEGRAL  L"\u222d"
+#define UNITEXT_TRIPLE_INTEGRAL  U"\u222d"
 #define UNICODE_CONTOUR_INTEGRAL  0x222e
-#define UNITEXT_CONTOUR_INTEGRAL  L"\u222e"
+#define UNITEXT_CONTOUR_INTEGRAL  U"\u222e"
 #define UNICODE_SURFACE_INTEGRAL  0x222f
-#define UNITEXT_SURFACE_INTEGRAL  L"\u222f"
+#define UNITEXT_SURFACE_INTEGRAL  U"\u222f"
 #define UNICODE_VOLUME_INTEGRAL  0x2230
-#define UNITEXT_VOLUME_INTEGRAL  L"\u2230"
+#define UNITEXT_VOLUME_INTEGRAL  U"\u2230"
 #define UNICODE_CLOCKWISE_INTEGRAL  0x2231
-#define UNITEXT_CLOCKWISE_INTEGRAL  L"\u2231"
+#define UNITEXT_CLOCKWISE_INTEGRAL  U"\u2231"
 #define UNICODE_CLOCKWISE_CONTOUR_INTEGRAL  0x2232
-#define UNITEXT_CLOCKWISE_CONTOUR_INTEGRAL  L"\u2232"
+#define UNITEXT_CLOCKWISE_CONTOUR_INTEGRAL  U"\u2232"
 #define UNICODE_ANTICLOCKWISE_CONTOUR_INTEGRAL  0x2233
-#define UNITEXT_ANTICLOCKWISE_CONTOUR_INTEGRAL  L"\u2233"
+#define UNITEXT_ANTICLOCKWISE_CONTOUR_INTEGRAL  U"\u2233"
 #define UNICODE_THEREFORE  0x2234
-#define UNITEXT_THEREFORE  L"\u2234"
+#define UNITEXT_THEREFORE  U"\u2234"
 #define UNICODE_BECAUSE  0x2235
-#define UNITEXT_BECAUSE  L"\u2235"
+#define UNITEXT_BECAUSE  U"\u2235"
 #define UNICODE_RATIO  0x2236
-#define UNITEXT_RATIO  L"\u2236"
+#define UNITEXT_RATIO  U"\u2236"
 #define UNICODE_PROPORTION  0x2237
-#define UNITEXT_PROPORTION  L"\u2237"
+#define UNITEXT_PROPORTION  U"\u2237"
 #define UNICODE_DOT_MINUS  0x2238
-#define UNITEXT_DOT_MINUS  L"\u2238"
+#define UNITEXT_DOT_MINUS  U"\u2238"
 #define UNICODE_EXCESS  0x2239
-#define UNITEXT_EXCESS  L"\u2239"
+#define UNITEXT_EXCESS  U"\u2239"
 #define UNICODE_GEOMETRIC_PROPORTION  0x223a
-#define UNITEXT_GEOMETRIC_PROPORTION  L"\u223a"
+#define UNITEXT_GEOMETRIC_PROPORTION  U"\u223a"
 #define UNICODE_HOMOTHETIC  0x223b
-#define UNITEXT_HOMOTHETIC  L"\u223b"
+#define UNITEXT_HOMOTHETIC  U"\u223b"
 #define UNICODE_TILDE_OPERATOR  0x223c
-#define UNITEXT_TILDE_OPERATOR  L"\u223c"
+#define UNITEXT_TILDE_OPERATOR  U"\u223c"
 #define UNICODE_REVERSED_TILDE  0x223d
-#define UNITEXT_REVERSED_TILDE  L"\u223d"
+#define UNITEXT_REVERSED_TILDE  U"\u223d"
 #define UNICODE_INVERTED_LAZY_S  0x223e
-#define UNITEXT_INVERTED_LAZY_S  L"\u223e"
+#define UNITEXT_INVERTED_LAZY_S  U"\u223e"
 #define UNICODE_SINE_WAVE  0x223f
-#define UNITEXT_SINE_WAVE  L"\u223f"
+#define UNITEXT_SINE_WAVE  U"\u223f"
 #define UNICODE_WREATH_PRODUCT  0x2240
-#define UNITEXT_WREATH_PRODUCT  L"\u2240"
+#define UNITEXT_WREATH_PRODUCT  U"\u2240"
 #define UNICODE_NOT_TILDE  0x2241
-#define UNITEXT_NOT_TILDE  L"\u2241"
+#define UNITEXT_NOT_TILDE  U"\u2241"
 #define UNICODE_MINUS_TILDE  0x2242
-#define UNITEXT_MINUS_TILDE  L"\u2242"
+#define UNITEXT_MINUS_TILDE  U"\u2242"
 #define UNICODE_ASYMPTOTICALLY_EQUAL_TO  0x2243
-#define UNITEXT_ASYMPTOTICALLY_EQUAL_TO  L"\u2243"
+#define UNITEXT_ASYMPTOTICALLY_EQUAL_TO  U"\u2243"
 #define UNICODE_NOT_ASYMPTOTICALLY_EQUAL_TO  0x2244
-#define UNITEXT_NOT_ASYMPTOTICALLY_EQUAL_TO  L"\u2244"
+#define UNITEXT_NOT_ASYMPTOTICALLY_EQUAL_TO  U"\u2244"
 #define UNICODE_APPROXIMATELY_EQUAL_TO  0x2245
-#define UNITEXT_APPROXIMATELY_EQUAL_TO  L"\u2245"
+#define UNITEXT_APPROXIMATELY_EQUAL_TO  U"\u2245"
 #define UNICODE_APPROXIMATELY_BUT_NOT_ACTUALLY_EQUAL_TO  0x2246
-#define UNITEXT_APPROXIMATELY_BUT_NOT_ACTUALLY_EQUAL_TO  L"\u2246"
+#define UNITEXT_APPROXIMATELY_BUT_NOT_ACTUALLY_EQUAL_TO  U"\u2246"
 #define UNICODE_NEITHER_APPROXIMATELY_NOR_ACTUALLY_EQUAL_TO  0x2247
-#define UNITEXT_NEITHER_APPROXIMATELY_NOR_ACTUALLY_EQUAL_TO  L"\u2247"
+#define UNITEXT_NEITHER_APPROXIMATELY_NOR_ACTUALLY_EQUAL_TO  U"\u2247"
 #define UNICODE_ALMOST_EQUAL_TO  0x2248
-#define UNITEXT_ALMOST_EQUAL_TO  L"\u2248"
+#define UNITEXT_ALMOST_EQUAL_TO  U"\u2248"
 #define UNICODE_NOT_ALMOST_EQUAL_TO  0x2249
-#define UNITEXT_NOT_ALMOST_EQUAL_TO  L"\u2249"
+#define UNITEXT_NOT_ALMOST_EQUAL_TO  U"\u2249"
 #define UNICODE_ALMOST_EQUAL_OR_EQUAL_TO  0x224a
-#define UNITEXT_ALMOST_EQUAL_OR_EQUAL_TO  L"\u224a"
+#define UNITEXT_ALMOST_EQUAL_OR_EQUAL_TO  U"\u224a"
 #define UNICODE_TRIPLE_TILDE  0x224b
-#define UNITEXT_TRIPLE_TILDE  L"\u224b"
+#define UNITEXT_TRIPLE_TILDE  U"\u224b"
 #define UNICODE_ALL_EQUAL_TO  0x224c
-#define UNITEXT_ALL_EQUAL_TO  L"\u224c"
+#define UNITEXT_ALL_EQUAL_TO  U"\u224c"
 #define UNICODE_EQUIVALENT_TO  0x224d
-#define UNITEXT_EQUIVALENT_TO  L"\u224d"
+#define UNITEXT_EQUIVALENT_TO  U"\u224d"
 #define UNICODE_GEOMETRICALLY_EQUIVALENT_TO  0x224e
-#define UNITEXT_GEOMETRICALLY_EQUIVALENT_TO  L"\u224e"
+#define UNITEXT_GEOMETRICALLY_EQUIVALENT_TO  U"\u224e"
 #define UNICODE_DIFFERENCE_BETWEEN  0x224f
-#define UNITEXT_DIFFERENCE_BETWEEN  L"\u224f"
+#define UNITEXT_DIFFERENCE_BETWEEN  U"\u224f"
 #define UNICODE_APPROACHES_THE_LIMIT  0x2250
-#define UNITEXT_APPROACHES_THE_LIMIT  L"\u2250"
+#define UNITEXT_APPROACHES_THE_LIMIT  U"\u2250"
 #define UNICODE_GEOMETRICALLY_EQUAL_TO  0x2251
-#define UNITEXT_GEOMETRICALLY_EQUAL_TO  L"\u2251"
+#define UNITEXT_GEOMETRICALLY_EQUAL_TO  U"\u2251"
 #define UNICODE_APPROXIMATELY_EQUAL_TO_OR_THE_IMAGE_OF  0x2252
-#define UNITEXT_APPROXIMATELY_EQUAL_TO_OR_THE_IMAGE_OF  L"\u2252"
+#define UNITEXT_APPROXIMATELY_EQUAL_TO_OR_THE_IMAGE_OF  U"\u2252"
 #define UNICODE_IMAGE_OF_OR_APPROXIMATELY_EQUAL_TO  0x2253
-#define UNITEXT_IMAGE_OF_OR_APPROXIMATELY_EQUAL_TO  L"\u2253"
+#define UNITEXT_IMAGE_OF_OR_APPROXIMATELY_EQUAL_TO  U"\u2253"
 #define UNICODE_COLON_EQUALS  0x2254
-#define UNITEXT_COLON_EQUALS  L"\u2254"
+#define UNITEXT_COLON_EQUALS  U"\u2254"
 #define UNICODE_EQUALS_COLON  0x2255
-#define UNITEXT_EQUALS_COLON  L"\u2255"
+#define UNITEXT_EQUALS_COLON  U"\u2255"
 #define UNICODE_RING_IN_EQUAL_TO  0x2256
-#define UNITEXT_RING_IN_EQUAL_TO  L"\u2256"
+#define UNITEXT_RING_IN_EQUAL_TO  U"\u2256"
 #define UNICODE_RING_EQUAL_TO  0x2257
-#define UNITEXT_RING_EQUAL_TO  L"\u2257"
+#define UNITEXT_RING_EQUAL_TO  U"\u2257"
 #define UNICODE_CORRESPONDS_TO  0x2258
-#define UNITEXT_CORRESPONDS_TO  L"\u2258"
+#define UNITEXT_CORRESPONDS_TO  U"\u2258"
 #define UNICODE_ESTIMATES  0x2259
-#define UNITEXT_ESTIMATES  L"\u2259"
+#define UNITEXT_ESTIMATES  U"\u2259"
 #define UNICODE_EQUIANGULAR_TO  0x225a
-#define UNITEXT_EQUIANGULAR_TO  L"\u225a"
+#define UNITEXT_EQUIANGULAR_TO  U"\u225a"
 #define UNICODE_STAR_EQUALS  0x225b
-#define UNITEXT_STAR_EQUALS  L"\u225b"
+#define UNITEXT_STAR_EQUALS  U"\u225b"
 #define UNICODE_DELTA_EQUAL_TO  0x225c
-#define UNITEXT_DELTA_EQUAL_TO  L"\u225c"
+#define UNITEXT_DELTA_EQUAL_TO  U"\u225c"
 #define UNICODE_EQUAL_TO_BY_DEFINITION  0x225d
-#define UNITEXT_EQUAL_TO_BY_DEFINITION  L"\u225d"
+#define UNITEXT_EQUAL_TO_BY_DEFINITION  U"\u225d"
 #define UNICODE_MEASURED_BY  0x225e
-#define UNITEXT_MEASURED_BY  L"\u225e"
+#define UNITEXT_MEASURED_BY  U"\u225e"
 #define UNICODE_QUESTIONED_EQUAL_TO  0x225f
-#define UNITEXT_QUESTIONED_EQUAL_TO  L"\u225f"
+#define UNITEXT_QUESTIONED_EQUAL_TO  U"\u225f"
 #define UNICODE_NOT_EQUAL_TO  0x2260
-#define UNITEXT_NOT_EQUAL_TO  L"\u2260"
+#define UNITEXT_NOT_EQUAL_TO  U"\u2260"
 #define UNICODE_IDENTICAL_TO  0x2261
-#define UNITEXT_IDENTICAL_TO  L"\u2261"
+#define UNITEXT_IDENTICAL_TO  U"\u2261"
 #define UNICODE_NOT_IDENTICAL_TO  0x2262
-#define UNITEXT_NOT_IDENTICAL_TO  L"\u2262"
+#define UNITEXT_NOT_IDENTICAL_TO  U"\u2262"
 #define UNICODE_STRICTLY_EQUIVALENT_TO  0x2263
-#define UNITEXT_STRICTLY_EQUIVALENT_TO  L"\u2263"
+#define UNITEXT_STRICTLY_EQUIVALENT_TO  U"\u2263"
 #define UNICODE_LESS_THAN_OR_EQUAL_TO  0x2264
-#define UNITEXT_LESS_THAN_OR_EQUAL_TO  L"\u2264"
+#define UNITEXT_LESS_THAN_OR_EQUAL_TO  U"\u2264"
 #define UNICODE_GREATER_THAN_OR_EQUAL_TO  0x2265
-#define UNITEXT_GREATER_THAN_OR_EQUAL_TO  L"\u2265"
+#define UNITEXT_GREATER_THAN_OR_EQUAL_TO  U"\u2265"
 #define UNICODE_LESS_THAN_OVER_EQUAL_TO  0x2266
-#define UNITEXT_LESS_THAN_OVER_EQUAL_TO  L"\u2266"
+#define UNITEXT_LESS_THAN_OVER_EQUAL_TO  U"\u2266"
 #define UNICODE_GREATER_THAN_OVER_EQUAL_TO  0x2267
-#define UNITEXT_GREATER_THAN_OVER_EQUAL_TO  L"\u2267"
+#define UNITEXT_GREATER_THAN_OVER_EQUAL_TO  U"\u2267"
 #define UNICODE_LESS_THAN_BUT_NOT_EQUAL_TO  0x2268
-#define UNITEXT_LESS_THAN_BUT_NOT_EQUAL_TO  L"\u2268"
+#define UNITEXT_LESS_THAN_BUT_NOT_EQUAL_TO  U"\u2268"
 #define UNICODE_GREATER_THAN_BUT_NOT_EQUAL_TO  0x2269
-#define UNITEXT_GREATER_THAN_BUT_NOT_EQUAL_TO  L"\u2269"
+#define UNITEXT_GREATER_THAN_BUT_NOT_EQUAL_TO  U"\u2269"
 #define UNICODE_MUCH_LESS_THAN  0x226a
-#define UNITEXT_MUCH_LESS_THAN  L"\u226a"
+#define UNITEXT_MUCH_LESS_THAN  U"\u226a"
 #define UNICODE_MUCH_GREATER_THAN  0x226b
-#define UNITEXT_MUCH_GREATER_THAN  L"\u226b"
+#define UNITEXT_MUCH_GREATER_THAN  U"\u226b"
 #define UNICODE_BETWEEN  0x226c
-#define UNITEXT_BETWEEN  L"\u226c"
+#define UNITEXT_BETWEEN  U"\u226c"
 #define UNICODE_NOT_EQUIVALENT_TO  0x226d
-#define UNITEXT_NOT_EQUIVALENT_TO  L"\u226d"
+#define UNITEXT_NOT_EQUIVALENT_TO  U"\u226d"
 #define UNICODE_NOT_LESS_THAN  0x226e
-#define UNITEXT_NOT_LESS_THAN  L"\u226e"
+#define UNITEXT_NOT_LESS_THAN  U"\u226e"
 #define UNICODE_NOT_GREATER_THAN  0x226f
-#define UNITEXT_NOT_GREATER_THAN  L"\u226f"
+#define UNITEXT_NOT_GREATER_THAN  U"\u226f"
 #define UNICODE_NEITHER_LESS_THAN_NOR_EQUAL_TO  0x2270
-#define UNITEXT_NEITHER_LESS_THAN_NOR_EQUAL_TO  L"\u2270"
+#define UNITEXT_NEITHER_LESS_THAN_NOR_EQUAL_TO  U"\u2270"
 #define UNICODE_NEITHER_GREATER_THAN_NOR_EQUAL_TO  0x2271
-#define UNITEXT_NEITHER_GREATER_THAN_NOR_EQUAL_TO  L"\u2271"
+#define UNITEXT_NEITHER_GREATER_THAN_NOR_EQUAL_TO  U"\u2271"
 #define UNICODE_LESS_THAN_OR_EQUIVALENT_TO  0x2272
-#define UNITEXT_LESS_THAN_OR_EQUIVALENT_TO  L"\u2272"
+#define UNITEXT_LESS_THAN_OR_EQUIVALENT_TO  U"\u2272"
 #define UNICODE_GREATER_THAN_OR_EQUIVALENT_TO  0x2273
-#define UNITEXT_GREATER_THAN_OR_EQUIVALENT_TO  L"\u2273"
+#define UNITEXT_GREATER_THAN_OR_EQUIVALENT_TO  U"\u2273"
 #define UNICODE_NEITHER_LESS_THAN_NOR_EQUIVALENT_TO  0x2274
-#define UNITEXT_NEITHER_LESS_THAN_NOR_EQUIVALENT_TO  L"\u2274"
+#define UNITEXT_NEITHER_LESS_THAN_NOR_EQUIVALENT_TO  U"\u2274"
 #define UNICODE_NEITHER_GREATER_THAN_NOR_EQUIVALENT_TO  0x2275
-#define UNITEXT_NEITHER_GREATER_THAN_NOR_EQUIVALENT_TO  L"\u2275"
+#define UNITEXT_NEITHER_GREATER_THAN_NOR_EQUIVALENT_TO  U"\u2275"
 #define UNICODE_LESS_THAN_OR_GREATER_THAN  0x2276
-#define UNITEXT_LESS_THAN_OR_GREATER_THAN  L"\u2276"
+#define UNITEXT_LESS_THAN_OR_GREATER_THAN  U"\u2276"
 #define UNICODE_GREATER_THAN_OR_LESS_THAN  0x2277
-#define UNITEXT_GREATER_THAN_OR_LESS_THAN  L"\u2277"
+#define UNITEXT_GREATER_THAN_OR_LESS_THAN  U"\u2277"
 #define UNICODE_NEITHER_LESS_THAN_NOR_GREATER_THAN  0x2278
-#define UNITEXT_NEITHER_LESS_THAN_NOR_GREATER_THAN  L"\u2278"
+#define UNITEXT_NEITHER_LESS_THAN_NOR_GREATER_THAN  U"\u2278"
 #define UNICODE_NEITHER_GREATER_THAN_NOR_LESS_THAN  0x2279
-#define UNITEXT_NEITHER_GREATER_THAN_NOR_LESS_THAN  L"\u2279"
+#define UNITEXT_NEITHER_GREATER_THAN_NOR_LESS_THAN  U"\u2279"
 #define UNICODE_PRECEDES  0x227a
-#define UNITEXT_PRECEDES  L"\u227a"
+#define UNITEXT_PRECEDES  U"\u227a"
 #define UNICODE_SUCCEEDS  0x227b
-#define UNITEXT_SUCCEEDS  L"\u227b"
+#define UNITEXT_SUCCEEDS  U"\u227b"
 #define UNICODE_PRECEDES_OR_EQUAL_TO  0x227c
-#define UNITEXT_PRECEDES_OR_EQUAL_TO  L"\u227c"
+#define UNITEXT_PRECEDES_OR_EQUAL_TO  U"\u227c"
 #define UNICODE_SUCCEEDS_OR_EQUAL_TO  0x227d
-#define UNITEXT_SUCCEEDS_OR_EQUAL_TO  L"\u227d"
+#define UNITEXT_SUCCEEDS_OR_EQUAL_TO  U"\u227d"
 #define UNICODE_PRECEDES_OR_EQUIVALENT_TO  0x227e
-#define UNITEXT_PRECEDES_OR_EQUIVALENT_TO  L"\u227e"
+#define UNITEXT_PRECEDES_OR_EQUIVALENT_TO  U"\u227e"
 #define UNICODE_SUCCEEDS_OR_EQUIVALENT_TO  0x227f
-#define UNITEXT_SUCCEEDS_OR_EQUIVALENT_TO  L"\u227f"
+#define UNITEXT_SUCCEEDS_OR_EQUIVALENT_TO  U"\u227f"
 #define UNICODE_DOES_NOT_PRECEDE  0x2280
-#define UNITEXT_DOES_NOT_PRECEDE  L"\u2280"
+#define UNITEXT_DOES_NOT_PRECEDE  U"\u2280"
 #define UNICODE_DOES_NOT_SUCCEED  0x2281
-#define UNITEXT_DOES_NOT_SUCCEED  L"\u2281"
+#define UNITEXT_DOES_NOT_SUCCEED  U"\u2281"
 #define UNICODE_SUBSET_OF  0x2282
-#define UNITEXT_SUBSET_OF  L"\u2282"
+#define UNITEXT_SUBSET_OF  U"\u2282"
 #define UNICODE_SUPERSET_OF  0x2283
-#define UNITEXT_SUPERSET_OF  L"\u2283"
+#define UNITEXT_SUPERSET_OF  U"\u2283"
 #define UNICODE_NOT_A_SUBSET_OF  0x2284
-#define UNITEXT_NOT_A_SUBSET_OF  L"\u2284"
+#define UNITEXT_NOT_A_SUBSET_OF  U"\u2284"
 #define UNICODE_NOT_A_SUPERSET_OF  0x2285
-#define UNITEXT_NOT_A_SUPERSET_OF  L"\u2285"
+#define UNITEXT_NOT_A_SUPERSET_OF  U"\u2285"
 #define UNICODE_SUBSET_OF_OR_EQUAL_TO  0x2286
-#define UNITEXT_SUBSET_OF_OR_EQUAL_TO  L"\u2286"
+#define UNITEXT_SUBSET_OF_OR_EQUAL_TO  U"\u2286"
 #define UNICODE_SUPERSET_OF_OR_EQUAL_TO  0x2287
-#define UNITEXT_SUPERSET_OF_OR_EQUAL_TO  L"\u2287"
+#define UNITEXT_SUPERSET_OF_OR_EQUAL_TO  U"\u2287"
 #define UNICODE_NEITHER_A_SUBSET_OF_NOR_EQUAL_TO  0x2288
-#define UNITEXT_NEITHER_A_SUBSET_OF_NOR_EQUAL_TO  L"\u2288"
+#define UNITEXT_NEITHER_A_SUBSET_OF_NOR_EQUAL_TO  U"\u2288"
 #define UNICODE_NEITHER_A_SUPERSET_OF_NOR_EQUAL_TO  0x2289
-#define UNITEXT_NEITHER_A_SUPERSET_OF_NOR_EQUAL_TO  L"\u2289"
+#define UNITEXT_NEITHER_A_SUPERSET_OF_NOR_EQUAL_TO  U"\u2289"
 #define UNICODE_SUBSET_OF_WITH_NOT_EQUAL_TO  0x228a
-#define UNITEXT_SUBSET_OF_WITH_NOT_EQUAL_TO  L"\u228a"
+#define UNITEXT_SUBSET_OF_WITH_NOT_EQUAL_TO  U"\u228a"
 #define UNICODE_SUPERSET_OF_WITH_NOT_EQUAL_TO  0x228b
-#define UNITEXT_SUPERSET_OF_WITH_NOT_EQUAL_TO  L"\u228b"
+#define UNITEXT_SUPERSET_OF_WITH_NOT_EQUAL_TO  U"\u228b"
 #define UNICODE_MULTISET  0x228c
-#define UNITEXT_MULTISET  L"\u228c"
+#define UNITEXT_MULTISET  U"\u228c"
 #define UNICODE_MULTISET_MULTIPLICATION  0x228d
-#define UNITEXT_MULTISET_MULTIPLICATION  L"\u228d"
+#define UNITEXT_MULTISET_MULTIPLICATION  U"\u228d"
 #define UNICODE_MULTISET_UNION  0x228e
-#define UNITEXT_MULTISET_UNION  L"\u228e"
+#define UNITEXT_MULTISET_UNION  U"\u228e"
 #define UNICODE_SQUARE_IMAGE_OF  0x228f
-#define UNITEXT_SQUARE_IMAGE_OF  L"\u228f"
+#define UNITEXT_SQUARE_IMAGE_OF  U"\u228f"
 #define UNICODE_SQUARE_ORIGINAL_OF  0x2290
-#define UNITEXT_SQUARE_ORIGINAL_OF  L"\u2290"
+#define UNITEXT_SQUARE_ORIGINAL_OF  U"\u2290"
 #define UNICODE_SQUARE_IMAGE_OF_OR_EQUAL_TO  0x2291
-#define UNITEXT_SQUARE_IMAGE_OF_OR_EQUAL_TO  L"\u2291"
+#define UNITEXT_SQUARE_IMAGE_OF_OR_EQUAL_TO  U"\u2291"
 #define UNICODE_SQUARE_ORIGINAL_OF_OR_EQUAL_TO  0x2292
-#define UNITEXT_SQUARE_ORIGINAL_OF_OR_EQUAL_TO  L"\u2292"
+#define UNITEXT_SQUARE_ORIGINAL_OF_OR_EQUAL_TO  U"\u2292"
 #define UNICODE_SQUARE_CAP  0x2293
-#define UNITEXT_SQUARE_CAP  L"\u2293"
+#define UNITEXT_SQUARE_CAP  U"\u2293"
 #define UNICODE_SQUARE_CUP  0x2294
-#define UNITEXT_SQUARE_CUP  L"\u2294"
+#define UNITEXT_SQUARE_CUP  U"\u2294"
 #define UNICODE_CIRCLED_PLUS  0x2295
-#define UNITEXT_CIRCLED_PLUS  L"\u2295"
+#define UNITEXT_CIRCLED_PLUS  U"\u2295"
 #define UNICODE_CIRCLED_MINUS  0x2296
-#define UNITEXT_CIRCLED_MINUS  L"\u2296"
+#define UNITEXT_CIRCLED_MINUS  U"\u2296"
 #define UNICODE_CIRCLED_TIMES  0x2297
-#define UNITEXT_CIRCLED_TIMES  L"\u2297"
+#define UNITEXT_CIRCLED_TIMES  U"\u2297"
 #define UNICODE_CIRCLED_DIVISION_SLASH  0x2298
-#define UNITEXT_CIRCLED_DIVISION_SLASH  L"\u2298"
+#define UNITEXT_CIRCLED_DIVISION_SLASH  U"\u2298"
 #define UNICODE_CIRCLED_DOT_OPERATOR  0x2299
-#define UNITEXT_CIRCLED_DOT_OPERATOR  L"\u2299"
+#define UNITEXT_CIRCLED_DOT_OPERATOR  U"\u2299"
 #define UNICODE_CIRCLED_RING_OPERATOR  0x229a
-#define UNITEXT_CIRCLED_RING_OPERATOR  L"\u229a"
+#define UNITEXT_CIRCLED_RING_OPERATOR  U"\u229a"
 #define UNICODE_CIRCLED_ASTERISK_OPERATOR  0x229b
-#define UNITEXT_CIRCLED_ASTERISK_OPERATOR  L"\u229b"
+#define UNITEXT_CIRCLED_ASTERISK_OPERATOR  U"\u229b"
 #define UNICODE_CIRCLED_EQUALS  0x229c
-#define UNITEXT_CIRCLED_EQUALS  L"\u229c"
+#define UNITEXT_CIRCLED_EQUALS  U"\u229c"
 #define UNICODE_CIRCLED_DASH  0x229d
-#define UNITEXT_CIRCLED_DASH  L"\u229d"
+#define UNITEXT_CIRCLED_DASH  U"\u229d"
 #define UNICODE_SQUARED_PLUS  0x229e
-#define UNITEXT_SQUARED_PLUS  L"\u229e"
+#define UNITEXT_SQUARED_PLUS  U"\u229e"
 #define UNICODE_SQUARED_MINUS  0x229f
-#define UNITEXT_SQUARED_MINUS  L"\u229f"
+#define UNITEXT_SQUARED_MINUS  U"\u229f"
 #define UNICODE_SQUARED_TIMES  0x22a0
-#define UNITEXT_SQUARED_TIMES  L"\u22a0"
+#define UNITEXT_SQUARED_TIMES  U"\u22a0"
 #define UNICODE_SQUARED_DOT_OPERATOR  0x22a1
-#define UNITEXT_SQUARED_DOT_OPERATOR  L"\u22a1"
+#define UNITEXT_SQUARED_DOT_OPERATOR  U"\u22a1"
 #define UNICODE_RIGHT_TACK  0x22a2
-#define UNITEXT_RIGHT_TACK  L"\u22a2"
+#define UNITEXT_RIGHT_TACK  U"\u22a2"
 #define UNICODE_LEFT_TACK  0x22a3
-#define UNITEXT_LEFT_TACK  L"\u22a3"
+#define UNITEXT_LEFT_TACK  U"\u22a3"
 #define UNICODE_DOWN_TACK  0x22a4
-#define UNITEXT_DOWN_TACK  L"\u22a4"
+#define UNITEXT_DOWN_TACK  U"\u22a4"
 #define UNICODE_UP_TACK  0x22a5
-#define UNITEXT_UP_TACK  L"\u22a5"
+#define UNITEXT_UP_TACK  U"\u22a5"
 #define UNICODE_ASSERTION  0x22a6
-#define UNITEXT_ASSERTION  L"\u22a6"
+#define UNITEXT_ASSERTION  U"\u22a6"
 #define UNICODE_MODELS  0x22a7
-#define UNITEXT_MODELS  L"\u22a7"
+#define UNITEXT_MODELS  U"\u22a7"
 #define UNICODE_TRUE  0x22a8
-#define UNITEXT_TRUE  L"\u22a8"
+#define UNITEXT_TRUE  U"\u22a8"
 #define UNICODE_FORCES  0x22a9
-#define UNITEXT_FORCES  L"\u22a9"
+#define UNITEXT_FORCES  U"\u22a9"
 #define UNICODE_TRIPLE_VERTICAL_BAR_RIGHT_TURNSTILE  0x22aa
-#define UNITEXT_TRIPLE_VERTICAL_BAR_RIGHT_TURNSTILE  L"\u22aa"
+#define UNITEXT_TRIPLE_VERTICAL_BAR_RIGHT_TURNSTILE  U"\u22aa"
 #define UNICODE_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE  0x22ab
-#define UNITEXT_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE  L"\u22ab"
+#define UNITEXT_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE  U"\u22ab"
 #define UNICODE_DOES_NOT_PROVE  0x22ac
-#define UNITEXT_DOES_NOT_PROVE  L"\u22ac"
+#define UNITEXT_DOES_NOT_PROVE  U"\u22ac"
 #define UNICODE_NOT_TRUE  0x22ad
-#define UNITEXT_NOT_TRUE  L"\u22ad"
+#define UNITEXT_NOT_TRUE  U"\u22ad"
 #define UNICODE_DOES_NOT_FORCE  0x22ae
-#define UNITEXT_DOES_NOT_FORCE  L"\u22ae"
+#define UNITEXT_DOES_NOT_FORCE  U"\u22ae"
 #define UNICODE_NEGATED_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE  0x22af
-#define UNITEXT_NEGATED_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE  L"\u22af"
+#define UNITEXT_NEGATED_DOUBLE_VERTICAL_BAR_DOUBLE_RIGHT_TURNSTILE  U"\u22af"
 #define UNICODE_PRECEDES_UNDER_RELATION  0x22b0
-#define UNITEXT_PRECEDES_UNDER_RELATION  L"\u22b0"
+#define UNITEXT_PRECEDES_UNDER_RELATION  U"\u22b0"
 #define UNICODE_SUCCEEDS_UNDER_RELATION  0x22b1
-#define UNITEXT_SUCCEEDS_UNDER_RELATION  L"\u22b1"
+#define UNITEXT_SUCCEEDS_UNDER_RELATION  U"\u22b1"
 #define UNICODE_NORMAL_SUBGROUP_OF  0x22b2
-#define UNITEXT_NORMAL_SUBGROUP_OF  L"\u22b2"
+#define UNITEXT_NORMAL_SUBGROUP_OF  U"\u22b2"
 #define UNICODE_CONTAINS_AS_NORMAL_SUBGROUP  0x22b3
-#define UNITEXT_CONTAINS_AS_NORMAL_SUBGROUP  L"\u22b3"
+#define UNITEXT_CONTAINS_AS_NORMAL_SUBGROUP  U"\u22b3"
 #define UNICODE_NORMAL_SUBGROUP_OF_OR_EQUAL_TO  0x22b4
-#define UNITEXT_NORMAL_SUBGROUP_OF_OR_EQUAL_TO  L"\u22b4"
+#define UNITEXT_NORMAL_SUBGROUP_OF_OR_EQUAL_TO  U"\u22b4"
 #define UNICODE_CONTAINS_AS_NORMAL_SUBGROUP_OR_EQUAL_TO  0x22b5
-#define UNITEXT_CONTAINS_AS_NORMAL_SUBGROUP_OR_EQUAL_TO  L"\u22b5"
+#define UNITEXT_CONTAINS_AS_NORMAL_SUBGROUP_OR_EQUAL_TO  U"\u22b5"
 #define UNICODE_ORIGINAL_OF  0x22b6
-#define UNITEXT_ORIGINAL_OF  L"\u22b6"
+#define UNITEXT_ORIGINAL_OF  U"\u22b6"
 #define UNICODE_IMAGE_OF  0x22b7
-#define UNITEXT_IMAGE_OF  L"\u22b7"
+#define UNITEXT_IMAGE_OF  U"\u22b7"
 #define UNICODE_MULTIMAP  0x22b8
-#define UNITEXT_MULTIMAP  L"\u22b8"
+#define UNITEXT_MULTIMAP  U"\u22b8"
 #define UNICODE_HERMITIAN_CONJUGATE_MATRIX  0x22b9
-#define UNITEXT_HERMITIAN_CONJUGATE_MATRIX  L"\u22b9"
+#define UNITEXT_HERMITIAN_CONJUGATE_MATRIX  U"\u22b9"
 #define UNICODE_INTERCALATE  0x22ba
-#define UNITEXT_INTERCALATE  L"\u22ba"
+#define UNITEXT_INTERCALATE  U"\u22ba"
 #define UNICODE_XOR  0x22bb
-#define UNITEXT_XOR  L"\u22bb"
+#define UNITEXT_XOR  U"\u22bb"
 #define UNICODE_NAND  0x22bc
-#define UNITEXT_NAND  L"\u22bc"
+#define UNITEXT_NAND  U"\u22bc"
 #define UNICODE_NOR  0x22bd
-#define UNITEXT_NOR  L"\u22bd"
+#define UNITEXT_NOR  U"\u22bd"
 #define UNICODE_RIGHT_ANGLE_WITH_ARC  0x22be
-#define UNITEXT_RIGHT_ANGLE_WITH_ARC  L"\u22be"
+#define UNITEXT_RIGHT_ANGLE_WITH_ARC  U"\u22be"
 #define UNICODE_RIGHT_TRIANGLE  0x22bf
-#define UNITEXT_RIGHT_TRIANGLE  L"\u22bf"
+#define UNITEXT_RIGHT_TRIANGLE  U"\u22bf"
 #define UNICODE_N_ARY_LOGICAL_AND  0x22c0
-#define UNITEXT_N_ARY_LOGICAL_AND  L"\u22c0"
+#define UNITEXT_N_ARY_LOGICAL_AND  U"\u22c0"
 #define UNICODE_N_ARY_LOGICAL_OR  0x22c1
-#define UNITEXT_N_ARY_LOGICAL_OR  L"\u22c1"
+#define UNITEXT_N_ARY_LOGICAL_OR  U"\u22c1"
 #define UNICODE_N_ARY_INTERSECTION  0x22c2
-#define UNITEXT_N_ARY_INTERSECTION  L"\u22c2"
+#define UNITEXT_N_ARY_INTERSECTION  U"\u22c2"
 #define UNICODE_N_ARY_UNION  0x22c3
-#define UNITEXT_N_ARY_UNION  L"\u22c3"
+#define UNITEXT_N_ARY_UNION  U"\u22c3"
 #define UNICODE_DIAMOND_OPERATOR  0x22c4
-#define UNITEXT_DIAMOND_OPERATOR  L"\u22c4"
+#define UNITEXT_DIAMOND_OPERATOR  U"\u22c4"
 #define UNICODE_DOT_OPERATOR  0x22c5
-#define UNITEXT_DOT_OPERATOR  L"\u22c5"
+#define UNITEXT_DOT_OPERATOR  U"\u22c5"
 #define UNICODE_STAR_OPERATOR  0x22c6
-#define UNITEXT_STAR_OPERATOR  L"\u22c6"
+#define UNITEXT_STAR_OPERATOR  U"\u22c6"
 #define UNICODE_DIVISION_TIMES  0x22c7
-#define UNITEXT_DIVISION_TIMES  L"\u22c7"
+#define UNITEXT_DIVISION_TIMES  U"\u22c7"
 #define UNICODE_BOWTIE  0x22c8
-#define UNITEXT_BOWTIE  L"\u22c8"
+#define UNITEXT_BOWTIE  U"\u22c8"
 #define UNICODE_LEFT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT  0x22c9
-#define UNITEXT_LEFT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT  L"\u22c9"
+#define UNITEXT_LEFT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT  U"\u22c9"
 #define UNICODE_RIGHT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT  0x22ca
-#define UNITEXT_RIGHT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT  L"\u22ca"
+#define UNITEXT_RIGHT_NORMAL_FACTOR_SEMIDIRECT_PRODUCT  U"\u22ca"
 #define UNICODE_LEFT_SEMIDIRECT_PRODUCT  0x22cb
-#define UNITEXT_LEFT_SEMIDIRECT_PRODUCT  L"\u22cb"
+#define UNITEXT_LEFT_SEMIDIRECT_PRODUCT  U"\u22cb"
 #define UNICODE_RIGHT_SEMIDIRECT_PRODUCT  0x22cc
-#define UNITEXT_RIGHT_SEMIDIRECT_PRODUCT  L"\u22cc"
+#define UNITEXT_RIGHT_SEMIDIRECT_PRODUCT  U"\u22cc"
 #define UNICODE_REVERSED_TILDE_EQUALS  0x22cd
-#define UNITEXT_REVERSED_TILDE_EQUALS  L"\u22cd"
+#define UNITEXT_REVERSED_TILDE_EQUALS  U"\u22cd"
 #define UNICODE_CURLY_LOGICAL_OR  0x22ce
-#define UNITEXT_CURLY_LOGICAL_OR  L"\u22ce"
+#define UNITEXT_CURLY_LOGICAL_OR  U"\u22ce"
 #define UNICODE_CURLY_LOGICAL_AND  0x22cf
-#define UNITEXT_CURLY_LOGICAL_AND  L"\u22cf"
+#define UNITEXT_CURLY_LOGICAL_AND  U"\u22cf"
 #define UNICODE_DOUBLE_SUBSET  0x22d0
-#define UNITEXT_DOUBLE_SUBSET  L"\u22d0"
+#define UNITEXT_DOUBLE_SUBSET  U"\u22d0"
 #define UNICODE_DOUBLE_SUPERSET  0x22d1
-#define UNITEXT_DOUBLE_SUPERSET  L"\u22d1"
+#define UNITEXT_DOUBLE_SUPERSET  U"\u22d1"
 #define UNICODE_DOUBLE_INTERSECTION  0x22d2
-#define UNITEXT_DOUBLE_INTERSECTION  L"\u22d2"
+#define UNITEXT_DOUBLE_INTERSECTION  U"\u22d2"
 #define UNICODE_DOUBLE_UNION  0x22d3
-#define UNITEXT_DOUBLE_UNION  L"\u22d3"
+#define UNITEXT_DOUBLE_UNION  U"\u22d3"
 #define UNICODE_PITCHFORK  0x22d4
-#define UNITEXT_PITCHFORK  L"\u22d4"
+#define UNITEXT_PITCHFORK  U"\u22d4"
 #define UNICODE_EQUAL_AND_PARALLEL_TO  0x22d5
-#define UNITEXT_EQUAL_AND_PARALLEL_TO  L"\u22d5"
+#define UNITEXT_EQUAL_AND_PARALLEL_TO  U"\u22d5"
 #define UNICODE_LESS_THAN_WITH_DOT  0x22d6
-#define UNITEXT_LESS_THAN_WITH_DOT  L"\u22d6"
+#define UNITEXT_LESS_THAN_WITH_DOT  U"\u22d6"
 #define UNICODE_GREATER_THAN_WITH_DOT  0x22d7
-#define UNITEXT_GREATER_THAN_WITH_DOT  L"\u22d7"
+#define UNITEXT_GREATER_THAN_WITH_DOT  U"\u22d7"
 #define UNICODE_VERY_MUCH_LESS_THAN  0x22d8
-#define UNITEXT_VERY_MUCH_LESS_THAN  L"\u22d8"
+#define UNITEXT_VERY_MUCH_LESS_THAN  U"\u22d8"
 #define UNICODE_VERY_MUCH_GREATER_THAN  0x22d9
-#define UNITEXT_VERY_MUCH_GREATER_THAN  L"\u22d9"
+#define UNITEXT_VERY_MUCH_GREATER_THAN  U"\u22d9"
 #define UNICODE_LESS_THAN_EQUAL_TO_OR_GREATER_THAN  0x22da
-#define UNITEXT_LESS_THAN_EQUAL_TO_OR_GREATER_THAN  L"\u22da"
+#define UNITEXT_LESS_THAN_EQUAL_TO_OR_GREATER_THAN  U"\u22da"
 #define UNICODE_GREATER_THAN_EQUAL_TO_OR_LESS_THAN  0x22db
-#define UNITEXT_GREATER_THAN_EQUAL_TO_OR_LESS_THAN  L"\u22db"
+#define UNITEXT_GREATER_THAN_EQUAL_TO_OR_LESS_THAN  U"\u22db"
 #define UNICODE_EQUAL_TO_OR_LESS_THAN  0x22dc
-#define UNITEXT_EQUAL_TO_OR_LESS_THAN  L"\u22dc"
+#define UNITEXT_EQUAL_TO_OR_LESS_THAN  U"\u22dc"
 #define UNICODE_EQUAL_TO_OR_GREATER_THAN  0x22dd
-#define UNITEXT_EQUAL_TO_OR_GREATER_THAN  L"\u22dd"
+#define UNITEXT_EQUAL_TO_OR_GREATER_THAN  U"\u22dd"
 #define UNICODE_EQUAL_TO_OR_PRECEDES  0x22de
-#define UNITEXT_EQUAL_TO_OR_PRECEDES  L"\u22de"
+#define UNITEXT_EQUAL_TO_OR_PRECEDES  U"\u22de"
 #define UNICODE_EQUAL_TO_OR_SUCCEEDS  0x22df
-#define UNITEXT_EQUAL_TO_OR_SUCCEEDS  L"\u22df"
+#define UNITEXT_EQUAL_TO_OR_SUCCEEDS  U"\u22df"
 #define UNICODE_DOES_NOT_PRECEDE_OR_EQUAL  0x22e0
-#define UNITEXT_DOES_NOT_PRECEDE_OR_EQUAL  L"\u22e0"
+#define UNITEXT_DOES_NOT_PRECEDE_OR_EQUAL  U"\u22e0"
 #define UNICODE_DOES_NOT_SUCCEED_OR_EQUAL  0x22e1
-#define UNITEXT_DOES_NOT_SUCCEED_OR_EQUAL  L"\u22e1"
+#define UNITEXT_DOES_NOT_SUCCEED_OR_EQUAL  U"\u22e1"
 #define UNICODE_NOT_SQUARE_IMAGE_OF_OR_EQUAL_TO  0x22e2
-#define UNITEXT_NOT_SQUARE_IMAGE_OF_OR_EQUAL_TO  L"\u22e2"
+#define UNITEXT_NOT_SQUARE_IMAGE_OF_OR_EQUAL_TO  U"\u22e2"
 #define UNICODE_NOT_SQUARE_ORIGINAL_OF_OR_EQUAL_TO  0x22e3
-#define UNITEXT_NOT_SQUARE_ORIGINAL_OF_OR_EQUAL_TO  L"\u22e3"
+#define UNITEXT_NOT_SQUARE_ORIGINAL_OF_OR_EQUAL_TO  U"\u22e3"
 #define UNICODE_SQUARE_IMAGE_OF_OR_NOT_EQUAL_TO  0x22e4
-#define UNITEXT_SQUARE_IMAGE_OF_OR_NOT_EQUAL_TO  L"\u22e4"
+#define UNITEXT_SQUARE_IMAGE_OF_OR_NOT_EQUAL_TO  U"\u22e4"
 #define UNICODE_SQUARE_ORIGINAL_OF_OR_NOT_EQUAL_TO  0x22e5
-#define UNITEXT_SQUARE_ORIGINAL_OF_OR_NOT_EQUAL_TO  L"\u22e5"
+#define UNITEXT_SQUARE_ORIGINAL_OF_OR_NOT_EQUAL_TO  U"\u22e5"
 #define UNICODE_LESS_THAN_BUT_NOT_EQUIVALENT_TO  0x22e6
-#define UNITEXT_LESS_THAN_BUT_NOT_EQUIVALENT_TO  L"\u22e6"
+#define UNITEXT_LESS_THAN_BUT_NOT_EQUIVALENT_TO  U"\u22e6"
 #define UNICODE_GREATER_THAN_BUT_NOT_EQUIVALENT_TO  0x22e7
-#define UNITEXT_GREATER_THAN_BUT_NOT_EQUIVALENT_TO  L"\u22e7"
+#define UNITEXT_GREATER_THAN_BUT_NOT_EQUIVALENT_TO  U"\u22e7"
 #define UNICODE_PRECEDES_BUT_NOT_EQUIVALENT_TO  0x22e8
-#define UNITEXT_PRECEDES_BUT_NOT_EQUIVALENT_TO  L"\u22e8"
+#define UNITEXT_PRECEDES_BUT_NOT_EQUIVALENT_TO  U"\u22e8"
 #define UNICODE_SUCCEEDS_BUT_NOT_EQUIVALENT_TO  0x22e9
-#define UNITEXT_SUCCEEDS_BUT_NOT_EQUIVALENT_TO  L"\u22e9"
+#define UNITEXT_SUCCEEDS_BUT_NOT_EQUIVALENT_TO  U"\u22e9"
 #define UNICODE_NOT_NORMAL_SUBGROUP_OF  0x22ea
-#define UNITEXT_NOT_NORMAL_SUBGROUP_OF  L"\u22ea"
+#define UNITEXT_NOT_NORMAL_SUBGROUP_OF  U"\u22ea"
 #define UNICODE_DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP  0x22eb
-#define UNITEXT_DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP  L"\u22eb"
+#define UNITEXT_DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP  U"\u22eb"
 #define UNICODE_NOT_NORMAL_SUBGROUP_OF_OR_EQUAL_TO  0x22ec
-#define UNITEXT_NOT_NORMAL_SUBGROUP_OF_OR_EQUAL_TO  L"\u22ec"
+#define UNITEXT_NOT_NORMAL_SUBGROUP_OF_OR_EQUAL_TO  U"\u22ec"
 #define UNICODE_DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP_OR_EQUAL  0x22ed
-#define UNITEXT_DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP_OR_EQUAL  L"\u22ed"
+#define UNITEXT_DOES_NOT_CONTAIN_AS_NORMAL_SUBGROUP_OR_EQUAL  U"\u22ed"
 #define UNICODE_VERTICAL_ELLIPSIS  0x22ee
-#define UNITEXT_VERTICAL_ELLIPSIS  L"\u22ee"
+#define UNITEXT_VERTICAL_ELLIPSIS  U"\u22ee"
 #define UNICODE_MIDLINE_HORIZONTAL_ELLIPSIS  0x22ef
-#define UNITEXT_MIDLINE_HORIZONTAL_ELLIPSIS  L"\u22ef"
+#define UNITEXT_MIDLINE_HORIZONTAL_ELLIPSIS  U"\u22ef"
 #define UNICODE_UP_RIGHT_DIAGONAL_ELLIPSIS  0x22f0
-#define UNITEXT_UP_RIGHT_DIAGONAL_ELLIPSIS  L"\u22f0"
+#define UNITEXT_UP_RIGHT_DIAGONAL_ELLIPSIS  U"\u22f0"
 #define UNICODE_DOWN_RIGHT_DIAGONAL_ELLIPSIS  0x22f1
-#define UNITEXT_DOWN_RIGHT_DIAGONAL_ELLIPSIS  L"\u22f1"
+#define UNITEXT_DOWN_RIGHT_DIAGONAL_ELLIPSIS  U"\u22f1"
 #define UNICODE_ELEMENT_OF_WITH_LONG_HORIZONTAL_STROKE  0x22f2
-#define UNITEXT_ELEMENT_OF_WITH_LONG_HORIZONTAL_STROKE  L"\u22f2"
+#define UNITEXT_ELEMENT_OF_WITH_LONG_HORIZONTAL_STROKE  U"\u22f2"
 #define UNICODE_ELEMENT_OF_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  0x22f3
-#define UNITEXT_ELEMENT_OF_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  L"\u22f3"
+#define UNITEXT_ELEMENT_OF_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  U"\u22f3"
 #define UNICODE_SMALL_ELEMENT_OF_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  0x22f4
-#define UNITEXT_SMALL_ELEMENT_OF_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  L"\u22f4"
+#define UNITEXT_SMALL_ELEMENT_OF_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  U"\u22f4"
 #define UNICODE_ELEMENT_OF_WITH_DOT_ABOVE  0x22f5
-#define UNITEXT_ELEMENT_OF_WITH_DOT_ABOVE  L"\u22f5"
+#define UNITEXT_ELEMENT_OF_WITH_DOT_ABOVE  U"\u22f5"
 #define UNICODE_ELEMENT_OF_WITH_OVERBAR  0x22f6
-#define UNITEXT_ELEMENT_OF_WITH_OVERBAR  L"\u22f6"
+#define UNITEXT_ELEMENT_OF_WITH_OVERBAR  U"\u22f6"
 #define UNICODE_SMALL_ELEMENT_OF_WITH_OVERBAR  0x22f7
-#define UNITEXT_SMALL_ELEMENT_OF_WITH_OVERBAR  L"\u22f7"
+#define UNITEXT_SMALL_ELEMENT_OF_WITH_OVERBAR  U"\u22f7"
 #define UNICODE_ELEMENT_OF_WITH_UNDERBAR  0x22f8
-#define UNITEXT_ELEMENT_OF_WITH_UNDERBAR  L"\u22f8"
+#define UNITEXT_ELEMENT_OF_WITH_UNDERBAR  U"\u22f8"
 #define UNICODE_ELEMENT_OF_WITH_TWO_HORIZONTAL_STROKES  0x22f9
-#define UNITEXT_ELEMENT_OF_WITH_TWO_HORIZONTAL_STROKES  L"\u22f9"
+#define UNITEXT_ELEMENT_OF_WITH_TWO_HORIZONTAL_STROKES  U"\u22f9"
 #define UNICODE_CONTAINS_WITH_LONG_HORIZONTAL_STROKE  0x22fa
-#define UNITEXT_CONTAINS_WITH_LONG_HORIZONTAL_STROKE  L"\u22fa"
+#define UNITEXT_CONTAINS_WITH_LONG_HORIZONTAL_STROKE  U"\u22fa"
 #define UNICODE_CONTAINS_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  0x22fb
-#define UNITEXT_CONTAINS_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  L"\u22fb"
+#define UNITEXT_CONTAINS_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  U"\u22fb"
 #define UNICODE_SMALL_CONTAINS_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  0x22fc
-#define UNITEXT_SMALL_CONTAINS_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  L"\u22fc"
+#define UNITEXT_SMALL_CONTAINS_WITH_VERTICAL_BAR_AT_END_OF_HORIZONTAL_STROKE  U"\u22fc"
 #define UNICODE_CONTAINS_WITH_OVERBAR  0x22fd
-#define UNITEXT_CONTAINS_WITH_OVERBAR  L"\u22fd"
+#define UNITEXT_CONTAINS_WITH_OVERBAR  U"\u22fd"
 #define UNICODE_SMALL_CONTAINS_WITH_OVERBAR  0x22fe
-#define UNITEXT_SMALL_CONTAINS_WITH_OVERBAR  L"\u22fe"
+#define UNITEXT_SMALL_CONTAINS_WITH_OVERBAR  U"\u22fe"
 #define UNICODE_Z_NOTATION_BAG_MEMBERSHIP  0x22ff
-#define UNITEXT_Z_NOTATION_BAG_MEMBERSHIP  L"\u22ff"
+#define UNITEXT_Z_NOTATION_BAG_MEMBERSHIP  U"\u22ff"
 #define UNICODE_DIAMETER_SIGN  0x2300
-#define UNITEXT_DIAMETER_SIGN  L"\u2300"
+#define UNITEXT_DIAMETER_SIGN  U"\u2300"
 #define UNICODE_ELECTRIC_ARROW  0x2301
-#define UNITEXT_ELECTRIC_ARROW  L"\u2301"
+#define UNITEXT_ELECTRIC_ARROW  U"\u2301"
 #define UNICODE_HOUSE  0x2302
-#define UNITEXT_HOUSE  L"\u2302"
+#define UNITEXT_HOUSE  U"\u2302"
 #define UNICODE_UP_ARROWHEAD  0x2303
-#define UNITEXT_UP_ARROWHEAD  L"\u2303"
+#define UNITEXT_UP_ARROWHEAD  U"\u2303"
 #define UNICODE_DOWN_ARROWHEAD  0x2304
-#define UNITEXT_DOWN_ARROWHEAD  L"\u2304"
+#define UNITEXT_DOWN_ARROWHEAD  U"\u2304"
 #define UNICODE_PROJECTIVE  0x2305
-#define UNITEXT_PROJECTIVE  L"\u2305"
+#define UNITEXT_PROJECTIVE  U"\u2305"
 #define UNICODE_PERSPECTIVE  0x2306
-#define UNITEXT_PERSPECTIVE  L"\u2306"
+#define UNITEXT_PERSPECTIVE  U"\u2306"
 #define UNICODE_WAVY_LINE  0x2307
-#define UNITEXT_WAVY_LINE  L"\u2307"
+#define UNITEXT_WAVY_LINE  U"\u2307"
 #define UNICODE_LEFT_CEILING  0x2308
-#define UNITEXT_LEFT_CEILING  L"\u2308"
+#define UNITEXT_LEFT_CEILING  U"\u2308"
 #define UNICODE_RIGHT_CEILING  0x2309
-#define UNITEXT_RIGHT_CEILING  L"\u2309"
+#define UNITEXT_RIGHT_CEILING  U"\u2309"
 #define UNICODE_LEFT_FLOOR  0x230a
-#define UNITEXT_LEFT_FLOOR  L"\u230a"
+#define UNITEXT_LEFT_FLOOR  U"\u230a"
 #define UNICODE_RIGHT_FLOOR  0x230b
-#define UNITEXT_RIGHT_FLOOR  L"\u230b"
+#define UNITEXT_RIGHT_FLOOR  U"\u230b"
 #define UNICODE_BOTTOM_RIGHT_CROP  0x230c
-#define UNITEXT_BOTTOM_RIGHT_CROP  L"\u230c"
+#define UNITEXT_BOTTOM_RIGHT_CROP  U"\u230c"
 #define UNICODE_BOTTOM_LEFT_CROP  0x230d
-#define UNITEXT_BOTTOM_LEFT_CROP  L"\u230d"
+#define UNITEXT_BOTTOM_LEFT_CROP  U"\u230d"
 #define UNICODE_TOP_RIGHT_CROP  0x230e
-#define UNITEXT_TOP_RIGHT_CROP  L"\u230e"
+#define UNITEXT_TOP_RIGHT_CROP  U"\u230e"
 #define UNICODE_TOP_LEFT_CROP  0x230f
-#define UNITEXT_TOP_LEFT_CROP  L"\u230f"
+#define UNITEXT_TOP_LEFT_CROP  U"\u230f"
 #define UNICODE_REVERSED_NOT_SIGN  0x2310
-#define UNITEXT_REVERSED_NOT_SIGN  L"\u2310"
+#define UNITEXT_REVERSED_NOT_SIGN  U"\u2310"
 #define UNICODE_SQUARE_LOZENGE  0x2311
-#define UNITEXT_SQUARE_LOZENGE  L"\u2311"
+#define UNITEXT_SQUARE_LOZENGE  U"\u2311"
 #define UNICODE_ARC  0x2312
-#define UNITEXT_ARC  L"\u2312"
+#define UNITEXT_ARC  U"\u2312"
 #define UNICODE_SEGMENT  0x2313
-#define UNITEXT_SEGMENT  L"\u2313"
+#define UNITEXT_SEGMENT  U"\u2313"
 #define UNICODE_SECTOR  0x2314
-#define UNITEXT_SECTOR  L"\u2314"
+#define UNITEXT_SECTOR  U"\u2314"
 #define UNICODE_TELEPHONE_RECORDER  0x2315
-#define UNITEXT_TELEPHONE_RECORDER  L"\u2315"
+#define UNITEXT_TELEPHONE_RECORDER  U"\u2315"
 #define UNICODE_POSITION_INDICATOR  0x2316
-#define UNITEXT_POSITION_INDICATOR  L"\u2316"
+#define UNITEXT_POSITION_INDICATOR  U"\u2316"
 #define UNICODE_VIEWDATA_SQUARE  0x2317
-#define UNITEXT_VIEWDATA_SQUARE  L"\u2317"
+#define UNITEXT_VIEWDATA_SQUARE  U"\u2317"
 #define UNICODE_PLACE_OF_INTEREST_SIGN  0x2318
-#define UNITEXT_PLACE_OF_INTEREST_SIGN  L"\u2318"
+#define UNITEXT_PLACE_OF_INTEREST_SIGN  U"\u2318"
 #define UNICODE_TURNED_NOT_SIGN  0x2319
-#define UNITEXT_TURNED_NOT_SIGN  L"\u2319"
+#define UNITEXT_TURNED_NOT_SIGN  U"\u2319"
 #define UNICODE_WATCH  0x231a
-#define UNITEXT_WATCH  L"\u231a"
+#define UNITEXT_WATCH  U"\u231a"
 #define UNICODE_HOURGLASS  0x231b
-#define UNITEXT_HOURGLASS  L"\u231b"
+#define UNITEXT_HOURGLASS  U"\u231b"
 #define UNICODE_TOP_LEFT_CORNER  0x231c
-#define UNITEXT_TOP_LEFT_CORNER  L"\u231c"
+#define UNITEXT_TOP_LEFT_CORNER  U"\u231c"
 #define UNICODE_TOP_RIGHT_CORNER  0x231d
-#define UNITEXT_TOP_RIGHT_CORNER  L"\u231d"
+#define UNITEXT_TOP_RIGHT_CORNER  U"\u231d"
 #define UNICODE_BOTTOM_LEFT_CORNER  0x231e
-#define UNITEXT_BOTTOM_LEFT_CORNER  L"\u231e"
+#define UNITEXT_BOTTOM_LEFT_CORNER  U"\u231e"
 #define UNICODE_BOTTOM_RIGHT_CORNER  0x231f
-#define UNITEXT_BOTTOM_RIGHT_CORNER  L"\u231f"
+#define UNITEXT_BOTTOM_RIGHT_CORNER  U"\u231f"
 #define UNICODE_TOP_HALF_INTEGRAL  0x2320
-#define UNITEXT_TOP_HALF_INTEGRAL  L"\u2320"
+#define UNITEXT_TOP_HALF_INTEGRAL  U"\u2320"
 #define UNICODE_BOTTOM_HALF_INTEGRAL  0x2321
-#define UNITEXT_BOTTOM_HALF_INTEGRAL  L"\u2321"
+#define UNITEXT_BOTTOM_HALF_INTEGRAL  U"\u2321"
 #define UNICODE_FROWN  0x2322
-#define UNITEXT_FROWN  L"\u2322"
+#define UNITEXT_FROWN  U"\u2322"
 #define UNICODE_SMILE  0x2323
-#define UNITEXT_SMILE  L"\u2323"
+#define UNITEXT_SMILE  U"\u2323"
 #define UNICODE_UP_ARROWHEAD_BETWEEN_TWO_HORIZONTAL_BARS  0x2324
-#define UNITEXT_UP_ARROWHEAD_BETWEEN_TWO_HORIZONTAL_BARS  L"\u2324"
+#define UNITEXT_UP_ARROWHEAD_BETWEEN_TWO_HORIZONTAL_BARS  U"\u2324"
 #define UNICODE_OPTION_KEY  0x2325
-#define UNITEXT_OPTION_KEY  L"\u2325"
+#define UNITEXT_OPTION_KEY  U"\u2325"
 #define UNICODE_ERASE_TO_THE_RIGHT  0x2326
-#define UNITEXT_ERASE_TO_THE_RIGHT  L"\u2326"
+#define UNITEXT_ERASE_TO_THE_RIGHT  U"\u2326"
 #define UNICODE_X_IN_A_RECTANGLE_BOX  0x2327
-#define UNITEXT_X_IN_A_RECTANGLE_BOX  L"\u2327"
+#define UNITEXT_X_IN_A_RECTANGLE_BOX  U"\u2327"
 #define UNICODE_KEYBOARD  0x2328
-#define UNITEXT_KEYBOARD  L"\u2328"
+#define UNITEXT_KEYBOARD  U"\u2328"
 #define UNICODE_LEFT_POINTING_ANGLE_BRACKET  0x2329
-#define UNITEXT_LEFT_POINTING_ANGLE_BRACKET  L"\u2329"
+#define UNITEXT_LEFT_POINTING_ANGLE_BRACKET  U"\u2329"
 #define UNICODE_RIGHT_POINTING_ANGLE_BRACKET  0x232a
-#define UNITEXT_RIGHT_POINTING_ANGLE_BRACKET  L"\u232a"
+#define UNITEXT_RIGHT_POINTING_ANGLE_BRACKET  U"\u232a"
 #define UNICODE_ERASE_TO_THE_LEFT  0x232b
-#define UNITEXT_ERASE_TO_THE_LEFT  L"\u232b"
+#define UNITEXT_ERASE_TO_THE_LEFT  U"\u232b"
 #define UNICODE_BENZENE_RING  0x232c
-#define UNITEXT_BENZENE_RING  L"\u232c"
+#define UNITEXT_BENZENE_RING  U"\u232c"
 #define UNICODE_CYLINDRICITY  0x232d
-#define UNITEXT_CYLINDRICITY  L"\u232d"
+#define UNITEXT_CYLINDRICITY  U"\u232d"
 #define UNICODE_ALL_AROUND_PROFILE  0x232e
-#define UNITEXT_ALL_AROUND_PROFILE  L"\u232e"
+#define UNITEXT_ALL_AROUND_PROFILE  U"\u232e"
 #define UNICODE_SYMMETRY  0x232f
-#define UNITEXT_SYMMETRY  L"\u232f"
+#define UNITEXT_SYMMETRY  U"\u232f"
 #define UNICODE_TOTAL_RUNOUT  0x2330
-#define UNITEXT_TOTAL_RUNOUT  L"\u2330"
+#define UNITEXT_TOTAL_RUNOUT  U"\u2330"
 #define UNICODE_DIMENSION_ORIGIN  0x2331
-#define UNITEXT_DIMENSION_ORIGIN  L"\u2331"
+#define UNITEXT_DIMENSION_ORIGIN  U"\u2331"
 #define UNICODE_CONICAL_TAPER  0x2332
-#define UNITEXT_CONICAL_TAPER  L"\u2332"
+#define UNITEXT_CONICAL_TAPER  U"\u2332"
 #define UNICODE_SLOPE  0x2333
-#define UNITEXT_SLOPE  L"\u2333"
+#define UNITEXT_SLOPE  U"\u2333"
 #define UNICODE_COUNTERBORE  0x2334
-#define UNITEXT_COUNTERBORE  L"\u2334"
+#define UNITEXT_COUNTERBORE  U"\u2334"
 #define UNICODE_COUNTERSINK  0x2335
-#define UNITEXT_COUNTERSINK  L"\u2335"
+#define UNITEXT_COUNTERSINK  U"\u2335"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_I_BEAM  0x2336
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_I_BEAM  L"\u2336"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_I_BEAM  U"\u2336"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_SQUISH_QUAD  0x2337
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_SQUISH_QUAD  L"\u2337"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_SQUISH_QUAD  U"\u2337"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_EQUAL  0x2338
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_EQUAL  L"\u2338"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_EQUAL  U"\u2338"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_DIVIDE  0x2339
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DIVIDE  L"\u2339"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DIVIDE  U"\u2339"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_DIAMOND  0x233a
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DIAMOND  L"\u233a"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DIAMOND  U"\u233a"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_JOT  0x233b
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_JOT  L"\u233b"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_JOT  U"\u233b"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_CIRCLE  0x233c
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_CIRCLE  L"\u233c"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_CIRCLE  U"\u233c"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_CIRCLE_STILE  0x233d
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_STILE  L"\u233d"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_STILE  U"\u233d"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_CIRCLE_JOT  0x233e
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_JOT  L"\u233e"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_JOT  U"\u233e"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_SLASH_BAR  0x233f
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_SLASH_BAR  L"\u233f"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_SLASH_BAR  U"\u233f"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_BACKSLASH_BAR  0x2340
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_BACKSLASH_BAR  L"\u2340"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_BACKSLASH_BAR  U"\u2340"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_SLASH  0x2341
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_SLASH  L"\u2341"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_SLASH  U"\u2341"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_BACKSLASH  0x2342
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_BACKSLASH  L"\u2342"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_BACKSLASH  U"\u2342"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_LESS_THAN  0x2343
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_LESS_THAN  L"\u2343"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_LESS_THAN  U"\u2343"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_GREATER_THAN  0x2344
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_GREATER_THAN  L"\u2344"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_GREATER_THAN  U"\u2344"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_LEFTWARDS_VANE  0x2345
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_LEFTWARDS_VANE  L"\u2345"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_LEFTWARDS_VANE  U"\u2345"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_RIGHTWARDS_VANE  0x2346
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_RIGHTWARDS_VANE  L"\u2346"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_RIGHTWARDS_VANE  U"\u2346"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_LEFTWARDS_ARROW  0x2347
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_LEFTWARDS_ARROW  L"\u2347"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_LEFTWARDS_ARROW  U"\u2347"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_RIGHTWARDS_ARROW  0x2348
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_RIGHTWARDS_ARROW  L"\u2348"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_RIGHTWARDS_ARROW  U"\u2348"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_CIRCLE_BACKSLASH  0x2349
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_BACKSLASH  L"\u2349"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_BACKSLASH  U"\u2349"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DOWN_TACK_UNDERBAR  0x234a
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DOWN_TACK_UNDERBAR  L"\u234a"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DOWN_TACK_UNDERBAR  U"\u234a"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DELTA_STILE  0x234b
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DELTA_STILE  L"\u234b"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DELTA_STILE  U"\u234b"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_DOWN_CARET  0x234c
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DOWN_CARET  L"\u234c"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DOWN_CARET  U"\u234c"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_DELTA  0x234d
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DELTA  L"\u234d"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DELTA  U"\u234d"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DOWN_TACK_JOT  0x234e
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DOWN_TACK_JOT  L"\u234e"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DOWN_TACK_JOT  U"\u234e"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_UPWARDS_VANE  0x234f
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UPWARDS_VANE  L"\u234f"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UPWARDS_VANE  U"\u234f"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_UPWARDS_ARROW  0x2350
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_UPWARDS_ARROW  L"\u2350"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_UPWARDS_ARROW  U"\u2350"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_UP_TACK_OVERBAR  0x2351
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UP_TACK_OVERBAR  L"\u2351"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UP_TACK_OVERBAR  U"\u2351"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DEL_STILE  0x2352
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DEL_STILE  L"\u2352"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DEL_STILE  U"\u2352"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_UP_CARET  0x2353
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_UP_CARET  L"\u2353"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_UP_CARET  U"\u2353"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_DEL  0x2354
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DEL  L"\u2354"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DEL  U"\u2354"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_UP_TACK_JOT  0x2355
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UP_TACK_JOT  L"\u2355"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UP_TACK_JOT  U"\u2355"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DOWNWARDS_VANE  0x2356
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DOWNWARDS_VANE  L"\u2356"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DOWNWARDS_VANE  U"\u2356"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_DOWNWARDS_ARROW  0x2357
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DOWNWARDS_ARROW  L"\u2357"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_DOWNWARDS_ARROW  U"\u2357"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUOTE_UNDERBAR  0x2358
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUOTE_UNDERBAR  L"\u2358"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUOTE_UNDERBAR  U"\u2358"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DELTA_UNDERBAR  0x2359
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DELTA_UNDERBAR  L"\u2359"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DELTA_UNDERBAR  U"\u2359"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DIAMOND_UNDERBAR  0x235a
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DIAMOND_UNDERBAR  L"\u235a"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DIAMOND_UNDERBAR  U"\u235a"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_JOT_UNDERBAR  0x235b
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_JOT_UNDERBAR  L"\u235b"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_JOT_UNDERBAR  U"\u235b"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_CIRCLE_UNDERBAR  0x235c
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_UNDERBAR  L"\u235c"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_UNDERBAR  U"\u235c"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_UP_SHOE_JOT  0x235d
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UP_SHOE_JOT  L"\u235d"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UP_SHOE_JOT  U"\u235d"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUOTE_QUAD  0x235e
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUOTE_QUAD  L"\u235e"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUOTE_QUAD  U"\u235e"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_CIRCLE_STAR  0x235f
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_STAR  L"\u235f"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_STAR  U"\u235f"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_COLON  0x2360
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_COLON  L"\u2360"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_COLON  U"\u2360"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_UP_TACK_DIAERESIS  0x2361
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UP_TACK_DIAERESIS  L"\u2361"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UP_TACK_DIAERESIS  U"\u2361"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DEL_DIAERESIS  0x2362
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DEL_DIAERESIS  L"\u2362"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DEL_DIAERESIS  U"\u2362"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_STAR_DIAERESIS  0x2363
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_STAR_DIAERESIS  L"\u2363"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_STAR_DIAERESIS  U"\u2363"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_JOT_DIAERESIS  0x2364
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_JOT_DIAERESIS  L"\u2364"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_JOT_DIAERESIS  U"\u2364"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_CIRCLE_DIAERESIS  0x2365
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_DIAERESIS  L"\u2365"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_CIRCLE_DIAERESIS  U"\u2365"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DOWN_SHOE_STILE  0x2366
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DOWN_SHOE_STILE  L"\u2366"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DOWN_SHOE_STILE  U"\u2366"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_LEFT_SHOE_STILE  0x2367
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_LEFT_SHOE_STILE  L"\u2367"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_LEFT_SHOE_STILE  U"\u2367"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_TILDE_DIAERESIS  0x2368
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_TILDE_DIAERESIS  L"\u2368"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_TILDE_DIAERESIS  U"\u2368"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_GREATER_THAN_DIAERESIS  0x2369
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_GREATER_THAN_DIAERESIS  L"\u2369"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_GREATER_THAN_DIAERESIS  U"\u2369"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_COMMA_BAR  0x236a
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_COMMA_BAR  L"\u236a"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_COMMA_BAR  U"\u236a"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DEL_TILDE  0x236b
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DEL_TILDE  L"\u236b"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DEL_TILDE  U"\u236b"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_ZILDE  0x236c
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_ZILDE  L"\u236c"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_ZILDE  U"\u236c"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_STILE_TILDE  0x236d
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_STILE_TILDE  L"\u236d"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_STILE_TILDE  U"\u236d"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_SEMICOLON_UNDERBAR  0x236e
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_SEMICOLON_UNDERBAR  L"\u236e"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_SEMICOLON_UNDERBAR  U"\u236e"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_NOT_EQUAL  0x236f
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_NOT_EQUAL  L"\u236f"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_NOT_EQUAL  U"\u236f"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD_QUESTION  0x2370
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_QUESTION  L"\u2370"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD_QUESTION  U"\u2370"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_DOWN_CARET_TILDE  0x2371
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DOWN_CARET_TILDE  L"\u2371"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_DOWN_CARET_TILDE  U"\u2371"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_UP_CARET_TILDE  0x2372
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UP_CARET_TILDE  L"\u2372"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_UP_CARET_TILDE  U"\u2372"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_IOTA  0x2373
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_IOTA  L"\u2373"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_IOTA  U"\u2373"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_RHO  0x2374
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_RHO  L"\u2374"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_RHO  U"\u2374"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_OMEGA  0x2375
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_OMEGA  L"\u2375"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_OMEGA  U"\u2375"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_ALPHA_UNDERBAR  0x2376
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_ALPHA_UNDERBAR  L"\u2376"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_ALPHA_UNDERBAR  U"\u2376"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_EPSILON_UNDERBAR  0x2377
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_EPSILON_UNDERBAR  L"\u2377"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_EPSILON_UNDERBAR  U"\u2377"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_IOTA_UNDERBAR  0x2378
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_IOTA_UNDERBAR  L"\u2378"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_IOTA_UNDERBAR  U"\u2378"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_OMEGA_UNDERBAR  0x2379
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_OMEGA_UNDERBAR  L"\u2379"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_OMEGA_UNDERBAR  U"\u2379"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_ALPHA  0x237a
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_ALPHA  L"\u237a"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_ALPHA  U"\u237a"
 #define UNICODE_NOT_CHECK_MARK  0x237b
-#define UNITEXT_NOT_CHECK_MARK  L"\u237b"
+#define UNITEXT_NOT_CHECK_MARK  U"\u237b"
 #define UNICODE_RIGHT_ANGLE_WITH_DOWNWARDS_ZIGZAG_ARROW  0x237c
-#define UNITEXT_RIGHT_ANGLE_WITH_DOWNWARDS_ZIGZAG_ARROW  L"\u237c"
+#define UNITEXT_RIGHT_ANGLE_WITH_DOWNWARDS_ZIGZAG_ARROW  U"\u237c"
 #define UNICODE_SHOULDERED_OPEN_BOX  0x237d
-#define UNITEXT_SHOULDERED_OPEN_BOX  L"\u237d"
+#define UNITEXT_SHOULDERED_OPEN_BOX  U"\u237d"
 #define UNICODE_BELL_SYMBOL  0x237e
-#define UNITEXT_BELL_SYMBOL  L"\u237e"
+#define UNITEXT_BELL_SYMBOL  U"\u237e"
 #define UNICODE_VERTICAL_LINE_WITH_MIDDLE_DOT  0x237f
-#define UNITEXT_VERTICAL_LINE_WITH_MIDDLE_DOT  L"\u237f"
+#define UNITEXT_VERTICAL_LINE_WITH_MIDDLE_DOT  U"\u237f"
 #define UNICODE_INSERTION_SYMBOL  0x2380
-#define UNITEXT_INSERTION_SYMBOL  L"\u2380"
+#define UNITEXT_INSERTION_SYMBOL  U"\u2380"
 #define UNICODE_CONTINUOUS_UNDERLINE_SYMBOL  0x2381
-#define UNITEXT_CONTINUOUS_UNDERLINE_SYMBOL  L"\u2381"
+#define UNITEXT_CONTINUOUS_UNDERLINE_SYMBOL  U"\u2381"
 #define UNICODE_DISCONTINUOUS_UNDERLINE_SYMBOL  0x2382
-#define UNITEXT_DISCONTINUOUS_UNDERLINE_SYMBOL  L"\u2382"
+#define UNITEXT_DISCONTINUOUS_UNDERLINE_SYMBOL  U"\u2382"
 #define UNICODE_EMPHASIS_SYMBOL  0x2383
-#define UNITEXT_EMPHASIS_SYMBOL  L"\u2383"
+#define UNITEXT_EMPHASIS_SYMBOL  U"\u2383"
 #define UNICODE_COMPOSITION_SYMBOL  0x2384
-#define UNITEXT_COMPOSITION_SYMBOL  L"\u2384"
+#define UNITEXT_COMPOSITION_SYMBOL  U"\u2384"
 #define UNICODE_WHITE_SQUARE_WITH_CENTRE_VERTICAL_LINE  0x2385
-#define UNITEXT_WHITE_SQUARE_WITH_CENTRE_VERTICAL_LINE  L"\u2385"
+#define UNITEXT_WHITE_SQUARE_WITH_CENTRE_VERTICAL_LINE  U"\u2385"
 #define UNICODE_ENTER_SYMBOL  0x2386
-#define UNITEXT_ENTER_SYMBOL  L"\u2386"
+#define UNITEXT_ENTER_SYMBOL  U"\u2386"
 #define UNICODE_ALTERNATIVE_KEY_SYMBOL  0x2387
-#define UNITEXT_ALTERNATIVE_KEY_SYMBOL  L"\u2387"
+#define UNITEXT_ALTERNATIVE_KEY_SYMBOL  U"\u2387"
 #define UNICODE_HELM_SYMBOL  0x2388
-#define UNITEXT_HELM_SYMBOL  L"\u2388"
+#define UNITEXT_HELM_SYMBOL  U"\u2388"
 #define UNICODE_CIRCLED_HORIZONTAL_BAR_WITH_NOTCH  0x2389
-#define UNITEXT_CIRCLED_HORIZONTAL_BAR_WITH_NOTCH  L"\u2389"
+#define UNITEXT_CIRCLED_HORIZONTAL_BAR_WITH_NOTCH  U"\u2389"
 #define UNICODE_CIRCLED_TRIANGLE_DOWN  0x238a
-#define UNITEXT_CIRCLED_TRIANGLE_DOWN  L"\u238a"
+#define UNITEXT_CIRCLED_TRIANGLE_DOWN  U"\u238a"
 #define UNICODE_BROKEN_CIRCLE_WITH_NORTHWEST_ARROW  0x238b
-#define UNITEXT_BROKEN_CIRCLE_WITH_NORTHWEST_ARROW  L"\u238b"
+#define UNITEXT_BROKEN_CIRCLE_WITH_NORTHWEST_ARROW  U"\u238b"
 #define UNICODE_UNDO_SYMBOL  0x238c
-#define UNITEXT_UNDO_SYMBOL  L"\u238c"
+#define UNITEXT_UNDO_SYMBOL  U"\u238c"
 #define UNICODE_MONOSTABLE_SYMBOL  0x238d
-#define UNITEXT_MONOSTABLE_SYMBOL  L"\u238d"
+#define UNITEXT_MONOSTABLE_SYMBOL  U"\u238d"
 #define UNICODE_HYSTERESIS_SYMBOL  0x238e
-#define UNITEXT_HYSTERESIS_SYMBOL  L"\u238e"
+#define UNITEXT_HYSTERESIS_SYMBOL  U"\u238e"
 #define UNICODE_OPEN_CIRCUIT_OUTPUT_H_TYPE_SYMBOL  0x238f
-#define UNITEXT_OPEN_CIRCUIT_OUTPUT_H_TYPE_SYMBOL  L"\u238f"
+#define UNITEXT_OPEN_CIRCUIT_OUTPUT_H_TYPE_SYMBOL  U"\u238f"
 #define UNICODE_OPEN_CIRCUIT_OUTPUT_L_TYPE_SYMBOL  0x2390
-#define UNITEXT_OPEN_CIRCUIT_OUTPUT_L_TYPE_SYMBOL  L"\u2390"
+#define UNITEXT_OPEN_CIRCUIT_OUTPUT_L_TYPE_SYMBOL  U"\u2390"
 #define UNICODE_PASSIVE_PULL_DOWN_OUTPUT_SYMBOL  0x2391
-#define UNITEXT_PASSIVE_PULL_DOWN_OUTPUT_SYMBOL  L"\u2391"
+#define UNITEXT_PASSIVE_PULL_DOWN_OUTPUT_SYMBOL  U"\u2391"
 #define UNICODE_PASSIVE_PULL_UP_OUTPUT_SYMBOL  0x2392
-#define UNITEXT_PASSIVE_PULL_UP_OUTPUT_SYMBOL  L"\u2392"
+#define UNITEXT_PASSIVE_PULL_UP_OUTPUT_SYMBOL  U"\u2392"
 #define UNICODE_DIRECT_CURRENT_SYMBOL_FORM_TWO  0x2393
-#define UNITEXT_DIRECT_CURRENT_SYMBOL_FORM_TWO  L"\u2393"
+#define UNITEXT_DIRECT_CURRENT_SYMBOL_FORM_TWO  U"\u2393"
 #define UNICODE_SOFTWARE_FUNCTION_SYMBOL  0x2394
-#define UNITEXT_SOFTWARE_FUNCTION_SYMBOL  L"\u2394"
+#define UNITEXT_SOFTWARE_FUNCTION_SYMBOL  U"\u2394"
 #define UNICODE_APL_FUNCTIONAL_SYMBOL_QUAD  0x2395
-#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD  L"\u2395"
+#define UNITEXT_APL_FUNCTIONAL_SYMBOL_QUAD  U"\u2395"
 #define UNICODE_DECIMAL_SEPARATOR_KEY_SYMBOL  0x2396
-#define UNITEXT_DECIMAL_SEPARATOR_KEY_SYMBOL  L"\u2396"
+#define UNITEXT_DECIMAL_SEPARATOR_KEY_SYMBOL  U"\u2396"
 #define UNICODE_PREVIOUS_PAGE  0x2397
-#define UNITEXT_PREVIOUS_PAGE  L"\u2397"
+#define UNITEXT_PREVIOUS_PAGE  U"\u2397"
 #define UNICODE_NEXT_PAGE  0x2398
-#define UNITEXT_NEXT_PAGE  L"\u2398"
+#define UNITEXT_NEXT_PAGE  U"\u2398"
 #define UNICODE_PRINT_SCREEN_SYMBOL  0x2399
-#define UNITEXT_PRINT_SCREEN_SYMBOL  L"\u2399"
+#define UNITEXT_PRINT_SCREEN_SYMBOL  U"\u2399"
 #define UNICODE_CLEAR_SCREEN_SYMBOL  0x239a
-#define UNITEXT_CLEAR_SCREEN_SYMBOL  L"\u239a"
+#define UNITEXT_CLEAR_SCREEN_SYMBOL  U"\u239a"
 #define UNICODE_LEFT_PARENTHESIS_UPPER_HOOK  0x239b
-#define UNITEXT_LEFT_PARENTHESIS_UPPER_HOOK  L"\u239b"
+#define UNITEXT_LEFT_PARENTHESIS_UPPER_HOOK  U"\u239b"
 #define UNICODE_LEFT_PARENTHESIS_EXTENSION  0x239c
-#define UNITEXT_LEFT_PARENTHESIS_EXTENSION  L"\u239c"
+#define UNITEXT_LEFT_PARENTHESIS_EXTENSION  U"\u239c"
 #define UNICODE_LEFT_PARENTHESIS_LOWER_HOOK  0x239d
-#define UNITEXT_LEFT_PARENTHESIS_LOWER_HOOK  L"\u239d"
+#define UNITEXT_LEFT_PARENTHESIS_LOWER_HOOK  U"\u239d"
 #define UNICODE_RIGHT_PARENTHESIS_UPPER_HOOK  0x239e
-#define UNITEXT_RIGHT_PARENTHESIS_UPPER_HOOK  L"\u239e"
+#define UNITEXT_RIGHT_PARENTHESIS_UPPER_HOOK  U"\u239e"
 #define UNICODE_RIGHT_PARENTHESIS_EXTENSION  0x239f
-#define UNITEXT_RIGHT_PARENTHESIS_EXTENSION  L"\u239f"
+#define UNITEXT_RIGHT_PARENTHESIS_EXTENSION  U"\u239f"
 #define UNICODE_RIGHT_PARENTHESIS_LOWER_HOOK  0x23a0
-#define UNITEXT_RIGHT_PARENTHESIS_LOWER_HOOK  L"\u23a0"
+#define UNITEXT_RIGHT_PARENTHESIS_LOWER_HOOK  U"\u23a0"
 #define UNICODE_LEFT_SQUARE_BRACKET_UPPER_CORNER  0x23a1
-#define UNITEXT_LEFT_SQUARE_BRACKET_UPPER_CORNER  L"\u23a1"
+#define UNITEXT_LEFT_SQUARE_BRACKET_UPPER_CORNER  U"\u23a1"
 #define UNICODE_LEFT_SQUARE_BRACKET_EXTENSION  0x23a2
-#define UNITEXT_LEFT_SQUARE_BRACKET_EXTENSION  L"\u23a2"
+#define UNITEXT_LEFT_SQUARE_BRACKET_EXTENSION  U"\u23a2"
 #define UNICODE_LEFT_SQUARE_BRACKET_LOWER_CORNER  0x23a3
-#define UNITEXT_LEFT_SQUARE_BRACKET_LOWER_CORNER  L"\u23a3"
+#define UNITEXT_LEFT_SQUARE_BRACKET_LOWER_CORNER  U"\u23a3"
 #define UNICODE_RIGHT_SQUARE_BRACKET_UPPER_CORNER  0x23a4
-#define UNITEXT_RIGHT_SQUARE_BRACKET_UPPER_CORNER  L"\u23a4"
+#define UNITEXT_RIGHT_SQUARE_BRACKET_UPPER_CORNER  U"\u23a4"
 #define UNICODE_RIGHT_SQUARE_BRACKET_EXTENSION  0x23a5
-#define UNITEXT_RIGHT_SQUARE_BRACKET_EXTENSION  L"\u23a5"
+#define UNITEXT_RIGHT_SQUARE_BRACKET_EXTENSION  U"\u23a5"
 #define UNICODE_RIGHT_SQUARE_BRACKET_LOWER_CORNER  0x23a6
-#define UNITEXT_RIGHT_SQUARE_BRACKET_LOWER_CORNER  L"\u23a6"
+#define UNITEXT_RIGHT_SQUARE_BRACKET_LOWER_CORNER  U"\u23a6"
 #define UNICODE_LEFT_CURLY_BRACKET_UPPER_HOOK  0x23a7
-#define UNITEXT_LEFT_CURLY_BRACKET_UPPER_HOOK  L"\u23a7"
+#define UNITEXT_LEFT_CURLY_BRACKET_UPPER_HOOK  U"\u23a7"
 #define UNICODE_LEFT_CURLY_BRACKET_MIDDLE_PIECE  0x23a8
-#define UNITEXT_LEFT_CURLY_BRACKET_MIDDLE_PIECE  L"\u23a8"
+#define UNITEXT_LEFT_CURLY_BRACKET_MIDDLE_PIECE  U"\u23a8"
 #define UNICODE_LEFT_CURLY_BRACKET_LOWER_HOOK  0x23a9
-#define UNITEXT_LEFT_CURLY_BRACKET_LOWER_HOOK  L"\u23a9"
+#define UNITEXT_LEFT_CURLY_BRACKET_LOWER_HOOK  U"\u23a9"
 #define UNICODE_CURLY_BRACKET_EXTENSION  0x23aa
-#define UNITEXT_CURLY_BRACKET_EXTENSION  L"\u23aa"
+#define UNITEXT_CURLY_BRACKET_EXTENSION  U"\u23aa"
 #define UNICODE_RIGHT_CURLY_BRACKET_UPPER_HOOK  0x23ab
-#define UNITEXT_RIGHT_CURLY_BRACKET_UPPER_HOOK  L"\u23ab"
+#define UNITEXT_RIGHT_CURLY_BRACKET_UPPER_HOOK  U"\u23ab"
 #define UNICODE_RIGHT_CURLY_BRACKET_MIDDLE_PIECE  0x23ac
-#define UNITEXT_RIGHT_CURLY_BRACKET_MIDDLE_PIECE  L"\u23ac"
+#define UNITEXT_RIGHT_CURLY_BRACKET_MIDDLE_PIECE  U"\u23ac"
 #define UNICODE_RIGHT_CURLY_BRACKET_LOWER_HOOK  0x23ad
-#define UNITEXT_RIGHT_CURLY_BRACKET_LOWER_HOOK  L"\u23ad"
+#define UNITEXT_RIGHT_CURLY_BRACKET_LOWER_HOOK  U"\u23ad"
 #define UNICODE_INTEGRAL_EXTENSION  0x23ae
-#define UNITEXT_INTEGRAL_EXTENSION  L"\u23ae"
+#define UNITEXT_INTEGRAL_EXTENSION  U"\u23ae"
 #define UNICODE_HORIZONTAL_LINE_EXTENSION  0x23af
-#define UNITEXT_HORIZONTAL_LINE_EXTENSION  L"\u23af"
+#define UNITEXT_HORIZONTAL_LINE_EXTENSION  U"\u23af"
 #define UNICODE_UPPER_LEFT_OR_LOWER_RIGHT_CURLY_BRACKET_SECTION  0x23b0
-#define UNITEXT_UPPER_LEFT_OR_LOWER_RIGHT_CURLY_BRACKET_SECTION  L"\u23b0"
+#define UNITEXT_UPPER_LEFT_OR_LOWER_RIGHT_CURLY_BRACKET_SECTION  U"\u23b0"
 #define UNICODE_UPPER_RIGHT_OR_LOWER_LEFT_CURLY_BRACKET_SECTION  0x23b1
-#define UNITEXT_UPPER_RIGHT_OR_LOWER_LEFT_CURLY_BRACKET_SECTION  L"\u23b1"
+#define UNITEXT_UPPER_RIGHT_OR_LOWER_LEFT_CURLY_BRACKET_SECTION  U"\u23b1"
 #define UNICODE_SUMMATION_TOP  0x23b2
-#define UNITEXT_SUMMATION_TOP  L"\u23b2"
+#define UNITEXT_SUMMATION_TOP  U"\u23b2"
 #define UNICODE_SUMMATION_BOTTOM  0x23b3
-#define UNITEXT_SUMMATION_BOTTOM  L"\u23b3"
+#define UNITEXT_SUMMATION_BOTTOM  U"\u23b3"
 #define UNICODE_TOP_SQUARE_BRACKET  0x23b4
-#define UNITEXT_TOP_SQUARE_BRACKET  L"\u23b4"
+#define UNITEXT_TOP_SQUARE_BRACKET  U"\u23b4"
 #define UNICODE_BOTTOM_SQUARE_BRACKET  0x23b5
-#define UNITEXT_BOTTOM_SQUARE_BRACKET  L"\u23b5"
+#define UNITEXT_BOTTOM_SQUARE_BRACKET  U"\u23b5"
 #define UNICODE_BOTTOM_SQUARE_BRACKET_OVER_TOP_SQUARE_BRACKET  0x23b6
-#define UNITEXT_BOTTOM_SQUARE_BRACKET_OVER_TOP_SQUARE_BRACKET  L"\u23b6"
+#define UNITEXT_BOTTOM_SQUARE_BRACKET_OVER_TOP_SQUARE_BRACKET  U"\u23b6"
 #define UNICODE_RADICAL_SYMBOL_BOTTOM  0x23b7
-#define UNITEXT_RADICAL_SYMBOL_BOTTOM  L"\u23b7"
+#define UNITEXT_RADICAL_SYMBOL_BOTTOM  U"\u23b7"
 #define UNICODE_LEFT_VERTICAL_BOX_LINE  0x23b8
-#define UNITEXT_LEFT_VERTICAL_BOX_LINE  L"\u23b8"
+#define UNITEXT_LEFT_VERTICAL_BOX_LINE  U"\u23b8"
 #define UNICODE_RIGHT_VERTICAL_BOX_LINE  0x23b9
-#define UNITEXT_RIGHT_VERTICAL_BOX_LINE  L"\u23b9"
+#define UNITEXT_RIGHT_VERTICAL_BOX_LINE  U"\u23b9"
 #define UNICODE_HORIZONTAL_SCAN_LINE_1  0x23ba
-#define UNITEXT_HORIZONTAL_SCAN_LINE_1  L"\u23ba"
+#define UNITEXT_HORIZONTAL_SCAN_LINE_1  U"\u23ba"
 #define UNICODE_HORIZONTAL_SCAN_LINE_3  0x23bb
-#define UNITEXT_HORIZONTAL_SCAN_LINE_3  L"\u23bb"
+#define UNITEXT_HORIZONTAL_SCAN_LINE_3  U"\u23bb"
 #define UNICODE_HORIZONTAL_SCAN_LINE_7  0x23bc
-#define UNITEXT_HORIZONTAL_SCAN_LINE_7  L"\u23bc"
+#define UNITEXT_HORIZONTAL_SCAN_LINE_7  U"\u23bc"
 #define UNICODE_HORIZONTAL_SCAN_LINE_9  0x23bd
-#define UNITEXT_HORIZONTAL_SCAN_LINE_9  L"\u23bd"
+#define UNITEXT_HORIZONTAL_SCAN_LINE_9  U"\u23bd"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_TOP_RIGHT  0x23be
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_TOP_RIGHT  L"\u23be"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_TOP_RIGHT  U"\u23be"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_BOTTOM_RIGHT  0x23bf
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_BOTTOM_RIGHT  L"\u23bf"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_BOTTOM_RIGHT  U"\u23bf"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_VERTICAL_WITH_CIRCLE  0x23c0
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_WITH_CIRCLE  L"\u23c0"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_WITH_CIRCLE  U"\u23c0"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL_WITH_CIRCLE  0x23c1
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL_WITH_CIRCLE  L"\u23c1"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL_WITH_CIRCLE  U"\u23c1"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL_WITH_CIRCLE  0x23c2
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL_WITH_CIRCLE  L"\u23c2"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL_WITH_CIRCLE  U"\u23c2"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_VERTICAL_WITH_TRIANGLE  0x23c3
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_WITH_TRIANGLE  L"\u23c3"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_WITH_TRIANGLE  U"\u23c3"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL_WITH_TRIANGLE  0x23c4
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL_WITH_TRIANGLE  L"\u23c4"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL_WITH_TRIANGLE  U"\u23c4"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL_WITH_TRIANGLE  0x23c5
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL_WITH_TRIANGLE  L"\u23c5"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL_WITH_TRIANGLE  U"\u23c5"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_WAVE  0x23c6
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_WAVE  L"\u23c6"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_WAVE  U"\u23c6"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL_WITH_WAVE  0x23c7
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL_WITH_WAVE  L"\u23c7"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL_WITH_WAVE  U"\u23c7"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL_WITH_WAVE  0x23c8
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL_WITH_WAVE  L"\u23c8"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL_WITH_WAVE  U"\u23c8"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL  0x23c9
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL  L"\u23c9"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_DOWN_AND_HORIZONTAL  U"\u23c9"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL  0x23ca
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL  L"\u23ca"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_UP_AND_HORIZONTAL  U"\u23ca"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_TOP_LEFT  0x23cb
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_TOP_LEFT  L"\u23cb"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_TOP_LEFT  U"\u23cb"
 #define UNICODE_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_BOTTOM_LEFT  0x23cc
-#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_BOTTOM_LEFT  L"\u23cc"
+#define UNITEXT_DENTISTRY_SYMBOL_LIGHT_VERTICAL_AND_BOTTOM_LEFT  U"\u23cc"
 #define UNICODE_SQUARE_FOOT  0x23cd
-#define UNITEXT_SQUARE_FOOT  L"\u23cd"
+#define UNITEXT_SQUARE_FOOT  U"\u23cd"
 #define UNICODE_RETURN_SYMBOL  0x23ce
-#define UNITEXT_RETURN_SYMBOL  L"\u23ce"
+#define UNITEXT_RETURN_SYMBOL  U"\u23ce"
 #define UNICODE_EJECT_SYMBOL  0x23cf
-#define UNITEXT_EJECT_SYMBOL  L"\u23cf"
+#define UNITEXT_EJECT_SYMBOL  U"\u23cf"
 #define UNICODE_VERTICAL_LINE_EXTENSION  0x23d0
-#define UNITEXT_VERTICAL_LINE_EXTENSION  L"\u23d0"
+#define UNITEXT_VERTICAL_LINE_EXTENSION  U"\u23d0"
 #define UNICODE_METRICAL_BREVE  0x23d1
-#define UNITEXT_METRICAL_BREVE  L"\u23d1"
+#define UNITEXT_METRICAL_BREVE  U"\u23d1"
 #define UNICODE_METRICAL_LONG_OVER_SHORT  0x23d2
-#define UNITEXT_METRICAL_LONG_OVER_SHORT  L"\u23d2"
+#define UNITEXT_METRICAL_LONG_OVER_SHORT  U"\u23d2"
 #define UNICODE_METRICAL_SHORT_OVER_LONG  0x23d3
-#define UNITEXT_METRICAL_SHORT_OVER_LONG  L"\u23d3"
+#define UNITEXT_METRICAL_SHORT_OVER_LONG  U"\u23d3"
 #define UNICODE_METRICAL_LONG_OVER_TWO_SHORTS  0x23d4
-#define UNITEXT_METRICAL_LONG_OVER_TWO_SHORTS  L"\u23d4"
+#define UNITEXT_METRICAL_LONG_OVER_TWO_SHORTS  U"\u23d4"
 #define UNICODE_METRICAL_TWO_SHORTS_OVER_LONG  0x23d5
-#define UNITEXT_METRICAL_TWO_SHORTS_OVER_LONG  L"\u23d5"
+#define UNITEXT_METRICAL_TWO_SHORTS_OVER_LONG  U"\u23d5"
 #define UNICODE_METRICAL_TWO_SHORTS_JOINED  0x23d6
-#define UNITEXT_METRICAL_TWO_SHORTS_JOINED  L"\u23d6"
+#define UNITEXT_METRICAL_TWO_SHORTS_JOINED  U"\u23d6"
 #define UNICODE_METRICAL_TRISEME  0x23d7
-#define UNITEXT_METRICAL_TRISEME  L"\u23d7"
+#define UNITEXT_METRICAL_TRISEME  U"\u23d7"
 #define UNICODE_METRICAL_TETRASEME  0x23d8
-#define UNITEXT_METRICAL_TETRASEME  L"\u23d8"
+#define UNITEXT_METRICAL_TETRASEME  U"\u23d8"
 #define UNICODE_METRICAL_PENTASEME  0x23d9
-#define UNITEXT_METRICAL_PENTASEME  L"\u23d9"
+#define UNITEXT_METRICAL_PENTASEME  U"\u23d9"
 #define UNICODE_EARTH_GROUND  0x23da
-#define UNITEXT_EARTH_GROUND  L"\u23da"
+#define UNITEXT_EARTH_GROUND  U"\u23da"
 #define UNICODE_FUSE  0x23db
-#define UNITEXT_FUSE  L"\u23db"
+#define UNITEXT_FUSE  U"\u23db"
 #define UNICODE_TOP_PARENTHESIS  0x23dc
-#define UNITEXT_TOP_PARENTHESIS  L"\u23dc"
+#define UNITEXT_TOP_PARENTHESIS  U"\u23dc"
 #define UNICODE_BOTTOM_PARENTHESIS  0x23dd
-#define UNITEXT_BOTTOM_PARENTHESIS  L"\u23dd"
+#define UNITEXT_BOTTOM_PARENTHESIS  U"\u23dd"
 #define UNICODE_TOP_CURLY_BRACKET  0x23de
-#define UNITEXT_TOP_CURLY_BRACKET  L"\u23de"
+#define UNITEXT_TOP_CURLY_BRACKET  U"\u23de"
 #define UNICODE_BOTTOM_CURLY_BRACKET  0x23df
-#define UNITEXT_BOTTOM_CURLY_BRACKET  L"\u23df"
+#define UNITEXT_BOTTOM_CURLY_BRACKET  U"\u23df"
 #define UNICODE_TOP_TORTOISE_SHELL_BRACKET  0x23e0
-#define UNITEXT_TOP_TORTOISE_SHELL_BRACKET  L"\u23e0"
+#define UNITEXT_TOP_TORTOISE_SHELL_BRACKET  U"\u23e0"
 #define UNICODE_BOTTOM_TORTOISE_SHELL_BRACKET  0x23e1
-#define UNITEXT_BOTTOM_TORTOISE_SHELL_BRACKET  L"\u23e1"
+#define UNITEXT_BOTTOM_TORTOISE_SHELL_BRACKET  U"\u23e1"
 #define UNICODE_WHITE_TRAPEZIUM  0x23e2
-#define UNITEXT_WHITE_TRAPEZIUM  L"\u23e2"
+#define UNITEXT_WHITE_TRAPEZIUM  U"\u23e2"
 #define UNICODE_BENZENE_RING_WITH_CIRCLE  0x23e3
-#define UNITEXT_BENZENE_RING_WITH_CIRCLE  L"\u23e3"
+#define UNITEXT_BENZENE_RING_WITH_CIRCLE  U"\u23e3"
 #define UNICODE_STRAIGHTNESS  0x23e4
-#define UNITEXT_STRAIGHTNESS  L"\u23e4"
+#define UNITEXT_STRAIGHTNESS  U"\u23e4"
 #define UNICODE_FLATNESS  0x23e5
-#define UNITEXT_FLATNESS  L"\u23e5"
+#define UNITEXT_FLATNESS  U"\u23e5"
 #define UNICODE_AC_CURRENT  0x23e6
-#define UNITEXT_AC_CURRENT  L"\u23e6"
+#define UNITEXT_AC_CURRENT  U"\u23e6"
 #define UNICODE_ELECTRICAL_INTERSECTION  0x23e7
-#define UNITEXT_ELECTRICAL_INTERSECTION  L"\u23e7"
+#define UNITEXT_ELECTRICAL_INTERSECTION  U"\u23e7"
 #define UNICODE_SYMBOL_FOR_NULL  0x2400
-#define UNITEXT_SYMBOL_FOR_NULL  L"\u2400"
+#define UNITEXT_SYMBOL_FOR_NULL  U"\u2400"
 #define UNICODE_SYMBOL_FOR_START_OF_HEADING  0x2401
-#define UNITEXT_SYMBOL_FOR_START_OF_HEADING  L"\u2401"
+#define UNITEXT_SYMBOL_FOR_START_OF_HEADING  U"\u2401"
 #define UNICODE_SYMBOL_FOR_START_OF_TEXT  0x2402
-#define UNITEXT_SYMBOL_FOR_START_OF_TEXT  L"\u2402"
+#define UNITEXT_SYMBOL_FOR_START_OF_TEXT  U"\u2402"
 #define UNICODE_SYMBOL_FOR_END_OF_TEXT  0x2403
-#define UNITEXT_SYMBOL_FOR_END_OF_TEXT  L"\u2403"
+#define UNITEXT_SYMBOL_FOR_END_OF_TEXT  U"\u2403"
 #define UNICODE_SYMBOL_FOR_END_OF_TRANSMISSION  0x2404
-#define UNITEXT_SYMBOL_FOR_END_OF_TRANSMISSION  L"\u2404"
+#define UNITEXT_SYMBOL_FOR_END_OF_TRANSMISSION  U"\u2404"
 #define UNICODE_SYMBOL_FOR_ENQUIRY  0x2405
-#define UNITEXT_SYMBOL_FOR_ENQUIRY  L"\u2405"
+#define UNITEXT_SYMBOL_FOR_ENQUIRY  U"\u2405"
 #define UNICODE_SYMBOL_FOR_ACKNOWLEDGE  0x2406
-#define UNITEXT_SYMBOL_FOR_ACKNOWLEDGE  L"\u2406"
+#define UNITEXT_SYMBOL_FOR_ACKNOWLEDGE  U"\u2406"
 #define UNICODE_SYMBOL_FOR_BELL  0x2407
-#define UNITEXT_SYMBOL_FOR_BELL  L"\u2407"
+#define UNITEXT_SYMBOL_FOR_BELL  U"\u2407"
 #define UNICODE_SYMBOL_FOR_BACKSPACE  0x2408
-#define UNITEXT_SYMBOL_FOR_BACKSPACE  L"\u2408"
+#define UNITEXT_SYMBOL_FOR_BACKSPACE  U"\u2408"
 #define UNICODE_SYMBOL_FOR_HORIZONTAL_TABULATION  0x2409
-#define UNITEXT_SYMBOL_FOR_HORIZONTAL_TABULATION  L"\u2409"
+#define UNITEXT_SYMBOL_FOR_HORIZONTAL_TABULATION  U"\u2409"
 #define UNICODE_SYMBOL_FOR_LINE_FEED  0x240a
-#define UNITEXT_SYMBOL_FOR_LINE_FEED  L"\u240a"
+#define UNITEXT_SYMBOL_FOR_LINE_FEED  U"\u240a"
 #define UNICODE_SYMBOL_FOR_VERTICAL_TABULATION  0x240b
-#define UNITEXT_SYMBOL_FOR_VERTICAL_TABULATION  L"\u240b"
+#define UNITEXT_SYMBOL_FOR_VERTICAL_TABULATION  U"\u240b"
 #define UNICODE_SYMBOL_FOR_FORM_FEED  0x240c
-#define UNITEXT_SYMBOL_FOR_FORM_FEED  L"\u240c"
+#define UNITEXT_SYMBOL_FOR_FORM_FEED  U"\u240c"
 #define UNICODE_SYMBOL_FOR_CARRIAGE_RETURN  0x240d
-#define UNITEXT_SYMBOL_FOR_CARRIAGE_RETURN  L"\u240d"
+#define UNITEXT_SYMBOL_FOR_CARRIAGE_RETURN  U"\u240d"
 #define UNICODE_SYMBOL_FOR_SHIFT_OUT  0x240e
-#define UNITEXT_SYMBOL_FOR_SHIFT_OUT  L"\u240e"
+#define UNITEXT_SYMBOL_FOR_SHIFT_OUT  U"\u240e"
 #define UNICODE_SYMBOL_FOR_SHIFT_IN  0x240f
-#define UNITEXT_SYMBOL_FOR_SHIFT_IN  L"\u240f"
+#define UNITEXT_SYMBOL_FOR_SHIFT_IN  U"\u240f"
 #define UNICODE_SYMBOL_FOR_DATA_LINK_ESCAPE  0x2410
-#define UNITEXT_SYMBOL_FOR_DATA_LINK_ESCAPE  L"\u2410"
+#define UNITEXT_SYMBOL_FOR_DATA_LINK_ESCAPE  U"\u2410"
 #define UNICODE_SYMBOL_FOR_DEVICE_CONTROL_ONE  0x2411
-#define UNITEXT_SYMBOL_FOR_DEVICE_CONTROL_ONE  L"\u2411"
+#define UNITEXT_SYMBOL_FOR_DEVICE_CONTROL_ONE  U"\u2411"
 #define UNICODE_SYMBOL_FOR_DEVICE_CONTROL_TWO  0x2412
-#define UNITEXT_SYMBOL_FOR_DEVICE_CONTROL_TWO  L"\u2412"
+#define UNITEXT_SYMBOL_FOR_DEVICE_CONTROL_TWO  U"\u2412"
 #define UNICODE_SYMBOL_FOR_DEVICE_CONTROL_THREE  0x2413
-#define UNITEXT_SYMBOL_FOR_DEVICE_CONTROL_THREE  L"\u2413"
+#define UNITEXT_SYMBOL_FOR_DEVICE_CONTROL_THREE  U"\u2413"
 #define UNICODE_SYMBOL_FOR_DEVICE_CONTROL_FOUR  0x2414
-#define UNITEXT_SYMBOL_FOR_DEVICE_CONTROL_FOUR  L"\u2414"
+#define UNITEXT_SYMBOL_FOR_DEVICE_CONTROL_FOUR  U"\u2414"
 #define UNICODE_SYMBOL_FOR_NEGATIVE_ACKNOWLEDGE  0x2415
-#define UNITEXT_SYMBOL_FOR_NEGATIVE_ACKNOWLEDGE  L"\u2415"
+#define UNITEXT_SYMBOL_FOR_NEGATIVE_ACKNOWLEDGE  U"\u2415"
 #define UNICODE_SYMBOL_FOR_SYNCHRONOUS_IDLE  0x2416
-#define UNITEXT_SYMBOL_FOR_SYNCHRONOUS_IDLE  L"\u2416"
+#define UNITEXT_SYMBOL_FOR_SYNCHRONOUS_IDLE  U"\u2416"
 #define UNICODE_SYMBOL_FOR_END_OF_TRANSMISSION_BLOCK  0x2417
-#define UNITEXT_SYMBOL_FOR_END_OF_TRANSMISSION_BLOCK  L"\u2417"
+#define UNITEXT_SYMBOL_FOR_END_OF_TRANSMISSION_BLOCK  U"\u2417"
 #define UNICODE_SYMBOL_FOR_CANCEL  0x2418
-#define UNITEXT_SYMBOL_FOR_CANCEL  L"\u2418"
+#define UNITEXT_SYMBOL_FOR_CANCEL  U"\u2418"
 #define UNICODE_SYMBOL_FOR_END_OF_MEDIUM  0x2419
-#define UNITEXT_SYMBOL_FOR_END_OF_MEDIUM  L"\u2419"
+#define UNITEXT_SYMBOL_FOR_END_OF_MEDIUM  U"\u2419"
 #define UNICODE_SYMBOL_FOR_SUBSTITUTE  0x241a
-#define UNITEXT_SYMBOL_FOR_SUBSTITUTE  L"\u241a"
+#define UNITEXT_SYMBOL_FOR_SUBSTITUTE  U"\u241a"
 #define UNICODE_SYMBOL_FOR_ESCAPE  0x241b
-#define UNITEXT_SYMBOL_FOR_ESCAPE  L"\u241b"
+#define UNITEXT_SYMBOL_FOR_ESCAPE  U"\u241b"
 #define UNICODE_SYMBOL_FOR_FILE_SEPARATOR  0x241c
-#define UNITEXT_SYMBOL_FOR_FILE_SEPARATOR  L"\u241c"
+#define UNITEXT_SYMBOL_FOR_FILE_SEPARATOR  U"\u241c"
 #define UNICODE_SYMBOL_FOR_GROUP_SEPARATOR  0x241d
-#define UNITEXT_SYMBOL_FOR_GROUP_SEPARATOR  L"\u241d"
+#define UNITEXT_SYMBOL_FOR_GROUP_SEPARATOR  U"\u241d"
 #define UNICODE_SYMBOL_FOR_RECORD_SEPARATOR  0x241e
-#define UNITEXT_SYMBOL_FOR_RECORD_SEPARATOR  L"\u241e"
+#define UNITEXT_SYMBOL_FOR_RECORD_SEPARATOR  U"\u241e"
 #define UNICODE_SYMBOL_FOR_UNIT_SEPARATOR  0x241f
-#define UNITEXT_SYMBOL_FOR_UNIT_SEPARATOR  L"\u241f"
+#define UNITEXT_SYMBOL_FOR_UNIT_SEPARATOR  U"\u241f"
 #define UNICODE_SYMBOL_FOR_SPACE  0x2420
-#define UNITEXT_SYMBOL_FOR_SPACE  L"\u2420"
+#define UNITEXT_SYMBOL_FOR_SPACE  U"\u2420"
 #define UNICODE_SYMBOL_FOR_DELETE  0x2421
-#define UNITEXT_SYMBOL_FOR_DELETE  L"\u2421"
+#define UNITEXT_SYMBOL_FOR_DELETE  U"\u2421"
 #define UNICODE_BLANK_SYMBOL  0x2422
-#define UNITEXT_BLANK_SYMBOL  L"\u2422"
+#define UNITEXT_BLANK_SYMBOL  U"\u2422"
 #define UNICODE_OPEN_BOX  0x2423
-#define UNITEXT_OPEN_BOX  L"\u2423"
+#define UNITEXT_OPEN_BOX  U"\u2423"
 #define UNICODE_SYMBOL_FOR_NEWLINE  0x2424
-#define UNITEXT_SYMBOL_FOR_NEWLINE  L"\u2424"
+#define UNITEXT_SYMBOL_FOR_NEWLINE  U"\u2424"
 #define UNICODE_SYMBOL_FOR_DELETE_FORM_TWO  0x2425
-#define UNITEXT_SYMBOL_FOR_DELETE_FORM_TWO  L"\u2425"
+#define UNITEXT_SYMBOL_FOR_DELETE_FORM_TWO  U"\u2425"
 #define UNICODE_SYMBOL_FOR_SUBSTITUTE_FORM_TWO  0x2426
-#define UNITEXT_SYMBOL_FOR_SUBSTITUTE_FORM_TWO  L"\u2426"
+#define UNITEXT_SYMBOL_FOR_SUBSTITUTE_FORM_TWO  U"\u2426"
 #define UNICODE_OCR_HOOK  0x2440
-#define UNITEXT_OCR_HOOK  L"\u2440"
+#define UNITEXT_OCR_HOOK  U"\u2440"
 #define UNICODE_OCR_CHAIR  0x2441
-#define UNITEXT_OCR_CHAIR  L"\u2441"
+#define UNITEXT_OCR_CHAIR  U"\u2441"
 #define UNICODE_OCR_FORK  0x2442
-#define UNITEXT_OCR_FORK  L"\u2442"
+#define UNITEXT_OCR_FORK  U"\u2442"
 #define UNICODE_OCR_INVERTED_FORK  0x2443
-#define UNITEXT_OCR_INVERTED_FORK  L"\u2443"
+#define UNITEXT_OCR_INVERTED_FORK  U"\u2443"
 #define UNICODE_OCR_BELT_BUCKLE  0x2444
-#define UNITEXT_OCR_BELT_BUCKLE  L"\u2444"
+#define UNITEXT_OCR_BELT_BUCKLE  U"\u2444"
 #define UNICODE_OCR_BOW_TIE  0x2445
-#define UNITEXT_OCR_BOW_TIE  L"\u2445"
+#define UNITEXT_OCR_BOW_TIE  U"\u2445"
 #define UNICODE_OCR_BRANCH_BANK_IDENTIFICATION  0x2446
-#define UNITEXT_OCR_BRANCH_BANK_IDENTIFICATION  L"\u2446"
+#define UNITEXT_OCR_BRANCH_BANK_IDENTIFICATION  U"\u2446"
 #define UNICODE_OCR_AMOUNT_OF_CHECK  0x2447
-#define UNITEXT_OCR_AMOUNT_OF_CHECK  L"\u2447"
+#define UNITEXT_OCR_AMOUNT_OF_CHECK  U"\u2447"
 #define UNICODE_OCR_DASH  0x2448
-#define UNITEXT_OCR_DASH  L"\u2448"
+#define UNITEXT_OCR_DASH  U"\u2448"
 #define UNICODE_OCR_CUSTOMER_ACCOUNT_NUMBER  0x2449
-#define UNITEXT_OCR_CUSTOMER_ACCOUNT_NUMBER  L"\u2449"
+#define UNITEXT_OCR_CUSTOMER_ACCOUNT_NUMBER  U"\u2449"
 #define UNICODE_OCR_DOUBLE_BACKSLASH  0x244a
-#define UNITEXT_OCR_DOUBLE_BACKSLASH  L"\u244a"
+#define UNITEXT_OCR_DOUBLE_BACKSLASH  U"\u244a"
 #define UNICODE_CIRCLED_DIGIT_ONE  0x2460
-#define UNITEXT_CIRCLED_DIGIT_ONE  L"\u2460"
+#define UNITEXT_CIRCLED_DIGIT_ONE  U"\u2460"
 #define UNICODE_CIRCLED_DIGIT_TWO  0x2461
-#define UNITEXT_CIRCLED_DIGIT_TWO  L"\u2461"
+#define UNITEXT_CIRCLED_DIGIT_TWO  U"\u2461"
 #define UNICODE_CIRCLED_DIGIT_THREE  0x2462
-#define UNITEXT_CIRCLED_DIGIT_THREE  L"\u2462"
+#define UNITEXT_CIRCLED_DIGIT_THREE  U"\u2462"
 #define UNICODE_CIRCLED_DIGIT_FOUR  0x2463
-#define UNITEXT_CIRCLED_DIGIT_FOUR  L"\u2463"
+#define UNITEXT_CIRCLED_DIGIT_FOUR  U"\u2463"
 #define UNICODE_CIRCLED_DIGIT_FIVE  0x2464
-#define UNITEXT_CIRCLED_DIGIT_FIVE  L"\u2464"
+#define UNITEXT_CIRCLED_DIGIT_FIVE  U"\u2464"
 #define UNICODE_CIRCLED_DIGIT_SIX  0x2465
-#define UNITEXT_CIRCLED_DIGIT_SIX  L"\u2465"
+#define UNITEXT_CIRCLED_DIGIT_SIX  U"\u2465"
 #define UNICODE_CIRCLED_DIGIT_SEVEN  0x2466
-#define UNITEXT_CIRCLED_DIGIT_SEVEN  L"\u2466"
+#define UNITEXT_CIRCLED_DIGIT_SEVEN  U"\u2466"
 #define UNICODE_CIRCLED_DIGIT_EIGHT  0x2467
-#define UNITEXT_CIRCLED_DIGIT_EIGHT  L"\u2467"
+#define UNITEXT_CIRCLED_DIGIT_EIGHT  U"\u2467"
 #define UNICODE_CIRCLED_DIGIT_NINE  0x2468
-#define UNITEXT_CIRCLED_DIGIT_NINE  L"\u2468"
+#define UNITEXT_CIRCLED_DIGIT_NINE  U"\u2468"
 #define UNICODE_CIRCLED_NUMBER_TEN  0x2469
-#define UNITEXT_CIRCLED_NUMBER_TEN  L"\u2469"
+#define UNITEXT_CIRCLED_NUMBER_TEN  U"\u2469"
 #define UNICODE_CIRCLED_NUMBER_ELEVEN  0x246a
-#define UNITEXT_CIRCLED_NUMBER_ELEVEN  L"\u246a"
+#define UNITEXT_CIRCLED_NUMBER_ELEVEN  U"\u246a"
 #define UNICODE_CIRCLED_NUMBER_TWELVE  0x246b
-#define UNITEXT_CIRCLED_NUMBER_TWELVE  L"\u246b"
+#define UNITEXT_CIRCLED_NUMBER_TWELVE  U"\u246b"
 #define UNICODE_CIRCLED_NUMBER_THIRTEEN  0x246c
-#define UNITEXT_CIRCLED_NUMBER_THIRTEEN  L"\u246c"
+#define UNITEXT_CIRCLED_NUMBER_THIRTEEN  U"\u246c"
 #define UNICODE_CIRCLED_NUMBER_FOURTEEN  0x246d
-#define UNITEXT_CIRCLED_NUMBER_FOURTEEN  L"\u246d"
+#define UNITEXT_CIRCLED_NUMBER_FOURTEEN  U"\u246d"
 #define UNICODE_CIRCLED_NUMBER_FIFTEEN  0x246e
-#define UNITEXT_CIRCLED_NUMBER_FIFTEEN  L"\u246e"
+#define UNITEXT_CIRCLED_NUMBER_FIFTEEN  U"\u246e"
 #define UNICODE_CIRCLED_NUMBER_SIXTEEN  0x246f
-#define UNITEXT_CIRCLED_NUMBER_SIXTEEN  L"\u246f"
+#define UNITEXT_CIRCLED_NUMBER_SIXTEEN  U"\u246f"
 #define UNICODE_CIRCLED_NUMBER_SEVENTEEN  0x2470
-#define UNITEXT_CIRCLED_NUMBER_SEVENTEEN  L"\u2470"
+#define UNITEXT_CIRCLED_NUMBER_SEVENTEEN  U"\u2470"
 #define UNICODE_CIRCLED_NUMBER_EIGHTEEN  0x2471
-#define UNITEXT_CIRCLED_NUMBER_EIGHTEEN  L"\u2471"
+#define UNITEXT_CIRCLED_NUMBER_EIGHTEEN  U"\u2471"
 #define UNICODE_CIRCLED_NUMBER_NINETEEN  0x2472
-#define UNITEXT_CIRCLED_NUMBER_NINETEEN  L"\u2472"
+#define UNITEXT_CIRCLED_NUMBER_NINETEEN  U"\u2472"
 #define UNICODE_CIRCLED_NUMBER_TWENTY  0x2473
-#define UNITEXT_CIRCLED_NUMBER_TWENTY  L"\u2473"
+#define UNITEXT_CIRCLED_NUMBER_TWENTY  U"\u2473"
 #define UNICODE_PARENTHESIZED_DIGIT_ONE  0x2474
-#define UNITEXT_PARENTHESIZED_DIGIT_ONE  L"\u2474"
+#define UNITEXT_PARENTHESIZED_DIGIT_ONE  U"\u2474"
 #define UNICODE_PARENTHESIZED_DIGIT_TWO  0x2475
-#define UNITEXT_PARENTHESIZED_DIGIT_TWO  L"\u2475"
+#define UNITEXT_PARENTHESIZED_DIGIT_TWO  U"\u2475"
 #define UNICODE_PARENTHESIZED_DIGIT_THREE  0x2476
-#define UNITEXT_PARENTHESIZED_DIGIT_THREE  L"\u2476"
+#define UNITEXT_PARENTHESIZED_DIGIT_THREE  U"\u2476"
 #define UNICODE_PARENTHESIZED_DIGIT_FOUR  0x2477
-#define UNITEXT_PARENTHESIZED_DIGIT_FOUR  L"\u2477"
+#define UNITEXT_PARENTHESIZED_DIGIT_FOUR  U"\u2477"
 #define UNICODE_PARENTHESIZED_DIGIT_FIVE  0x2478
-#define UNITEXT_PARENTHESIZED_DIGIT_FIVE  L"\u2478"
+#define UNITEXT_PARENTHESIZED_DIGIT_FIVE  U"\u2478"
 #define UNICODE_PARENTHESIZED_DIGIT_SIX  0x2479
-#define UNITEXT_PARENTHESIZED_DIGIT_SIX  L"\u2479"
+#define UNITEXT_PARENTHESIZED_DIGIT_SIX  U"\u2479"
 #define UNICODE_PARENTHESIZED_DIGIT_SEVEN  0x247a
-#define UNITEXT_PARENTHESIZED_DIGIT_SEVEN  L"\u247a"
+#define UNITEXT_PARENTHESIZED_DIGIT_SEVEN  U"\u247a"
 #define UNICODE_PARENTHESIZED_DIGIT_EIGHT  0x247b
-#define UNITEXT_PARENTHESIZED_DIGIT_EIGHT  L"\u247b"
+#define UNITEXT_PARENTHESIZED_DIGIT_EIGHT  U"\u247b"
 #define UNICODE_PARENTHESIZED_DIGIT_NINE  0x247c
-#define UNITEXT_PARENTHESIZED_DIGIT_NINE  L"\u247c"
+#define UNITEXT_PARENTHESIZED_DIGIT_NINE  U"\u247c"
 #define UNICODE_PARENTHESIZED_NUMBER_TEN  0x247d
-#define UNITEXT_PARENTHESIZED_NUMBER_TEN  L"\u247d"
+#define UNITEXT_PARENTHESIZED_NUMBER_TEN  U"\u247d"
 #define UNICODE_PARENTHESIZED_NUMBER_ELEVEN  0x247e
-#define UNITEXT_PARENTHESIZED_NUMBER_ELEVEN  L"\u247e"
+#define UNITEXT_PARENTHESIZED_NUMBER_ELEVEN  U"\u247e"
 #define UNICODE_PARENTHESIZED_NUMBER_TWELVE  0x247f
-#define UNITEXT_PARENTHESIZED_NUMBER_TWELVE  L"\u247f"
+#define UNITEXT_PARENTHESIZED_NUMBER_TWELVE  U"\u247f"
 #define UNICODE_PARENTHESIZED_NUMBER_THIRTEEN  0x2480
-#define UNITEXT_PARENTHESIZED_NUMBER_THIRTEEN  L"\u2480"
+#define UNITEXT_PARENTHESIZED_NUMBER_THIRTEEN  U"\u2480"
 #define UNICODE_PARENTHESIZED_NUMBER_FOURTEEN  0x2481
-#define UNITEXT_PARENTHESIZED_NUMBER_FOURTEEN  L"\u2481"
+#define UNITEXT_PARENTHESIZED_NUMBER_FOURTEEN  U"\u2481"
 #define UNICODE_PARENTHESIZED_NUMBER_FIFTEEN  0x2482
-#define UNITEXT_PARENTHESIZED_NUMBER_FIFTEEN  L"\u2482"
+#define UNITEXT_PARENTHESIZED_NUMBER_FIFTEEN  U"\u2482"
 #define UNICODE_PARENTHESIZED_NUMBER_SIXTEEN  0x2483
-#define UNITEXT_PARENTHESIZED_NUMBER_SIXTEEN  L"\u2483"
+#define UNITEXT_PARENTHESIZED_NUMBER_SIXTEEN  U"\u2483"
 #define UNICODE_PARENTHESIZED_NUMBER_SEVENTEEN  0x2484
-#define UNITEXT_PARENTHESIZED_NUMBER_SEVENTEEN  L"\u2484"
+#define UNITEXT_PARENTHESIZED_NUMBER_SEVENTEEN  U"\u2484"
 #define UNICODE_PARENTHESIZED_NUMBER_EIGHTEEN  0x2485
-#define UNITEXT_PARENTHESIZED_NUMBER_EIGHTEEN  L"\u2485"
+#define UNITEXT_PARENTHESIZED_NUMBER_EIGHTEEN  U"\u2485"
 #define UNICODE_PARENTHESIZED_NUMBER_NINETEEN  0x2486
-#define UNITEXT_PARENTHESIZED_NUMBER_NINETEEN  L"\u2486"
+#define UNITEXT_PARENTHESIZED_NUMBER_NINETEEN  U"\u2486"
 #define UNICODE_PARENTHESIZED_NUMBER_TWENTY  0x2487
-#define UNITEXT_PARENTHESIZED_NUMBER_TWENTY  L"\u2487"
+#define UNITEXT_PARENTHESIZED_NUMBER_TWENTY  U"\u2487"
 #define UNICODE_DIGIT_ONE_FULL_STOP  0x2488
-#define UNITEXT_DIGIT_ONE_FULL_STOP  L"\u2488"
+#define UNITEXT_DIGIT_ONE_FULL_STOP  U"\u2488"
 #define UNICODE_DIGIT_TWO_FULL_STOP  0x2489
-#define UNITEXT_DIGIT_TWO_FULL_STOP  L"\u2489"
+#define UNITEXT_DIGIT_TWO_FULL_STOP  U"\u2489"
 #define UNICODE_DIGIT_THREE_FULL_STOP  0x248a
-#define UNITEXT_DIGIT_THREE_FULL_STOP  L"\u248a"
+#define UNITEXT_DIGIT_THREE_FULL_STOP  U"\u248a"
 #define UNICODE_DIGIT_FOUR_FULL_STOP  0x248b
-#define UNITEXT_DIGIT_FOUR_FULL_STOP  L"\u248b"
+#define UNITEXT_DIGIT_FOUR_FULL_STOP  U"\u248b"
 #define UNICODE_DIGIT_FIVE_FULL_STOP  0x248c
-#define UNITEXT_DIGIT_FIVE_FULL_STOP  L"\u248c"
+#define UNITEXT_DIGIT_FIVE_FULL_STOP  U"\u248c"
 #define UNICODE_DIGIT_SIX_FULL_STOP  0x248d
-#define UNITEXT_DIGIT_SIX_FULL_STOP  L"\u248d"
+#define UNITEXT_DIGIT_SIX_FULL_STOP  U"\u248d"
 #define UNICODE_DIGIT_SEVEN_FULL_STOP  0x248e
-#define UNITEXT_DIGIT_SEVEN_FULL_STOP  L"\u248e"
+#define UNITEXT_DIGIT_SEVEN_FULL_STOP  U"\u248e"
 #define UNICODE_DIGIT_EIGHT_FULL_STOP  0x248f
-#define UNITEXT_DIGIT_EIGHT_FULL_STOP  L"\u248f"
+#define UNITEXT_DIGIT_EIGHT_FULL_STOP  U"\u248f"
 #define UNICODE_DIGIT_NINE_FULL_STOP  0x2490
-#define UNITEXT_DIGIT_NINE_FULL_STOP  L"\u2490"
+#define UNITEXT_DIGIT_NINE_FULL_STOP  U"\u2490"
 #define UNICODE_NUMBER_TEN_FULL_STOP  0x2491
-#define UNITEXT_NUMBER_TEN_FULL_STOP  L"\u2491"
+#define UNITEXT_NUMBER_TEN_FULL_STOP  U"\u2491"
 #define UNICODE_NUMBER_ELEVEN_FULL_STOP  0x2492
-#define UNITEXT_NUMBER_ELEVEN_FULL_STOP  L"\u2492"
+#define UNITEXT_NUMBER_ELEVEN_FULL_STOP  U"\u2492"
 #define UNICODE_NUMBER_TWELVE_FULL_STOP  0x2493
-#define UNITEXT_NUMBER_TWELVE_FULL_STOP  L"\u2493"
+#define UNITEXT_NUMBER_TWELVE_FULL_STOP  U"\u2493"
 #define UNICODE_NUMBER_THIRTEEN_FULL_STOP  0x2494
-#define UNITEXT_NUMBER_THIRTEEN_FULL_STOP  L"\u2494"
+#define UNITEXT_NUMBER_THIRTEEN_FULL_STOP  U"\u2494"
 #define UNICODE_NUMBER_FOURTEEN_FULL_STOP  0x2495
-#define UNITEXT_NUMBER_FOURTEEN_FULL_STOP  L"\u2495"
+#define UNITEXT_NUMBER_FOURTEEN_FULL_STOP  U"\u2495"
 #define UNICODE_NUMBER_FIFTEEN_FULL_STOP  0x2496
-#define UNITEXT_NUMBER_FIFTEEN_FULL_STOP  L"\u2496"
+#define UNITEXT_NUMBER_FIFTEEN_FULL_STOP  U"\u2496"
 #define UNICODE_NUMBER_SIXTEEN_FULL_STOP  0x2497
-#define UNITEXT_NUMBER_SIXTEEN_FULL_STOP  L"\u2497"
+#define UNITEXT_NUMBER_SIXTEEN_FULL_STOP  U"\u2497"
 #define UNICODE_NUMBER_SEVENTEEN_FULL_STOP  0x2498
-#define UNITEXT_NUMBER_SEVENTEEN_FULL_STOP  L"\u2498"
+#define UNITEXT_NUMBER_SEVENTEEN_FULL_STOP  U"\u2498"
 #define UNICODE_NUMBER_EIGHTEEN_FULL_STOP  0x2499
-#define UNITEXT_NUMBER_EIGHTEEN_FULL_STOP  L"\u2499"
+#define UNITEXT_NUMBER_EIGHTEEN_FULL_STOP  U"\u2499"
 #define UNICODE_NUMBER_NINETEEN_FULL_STOP  0x249a
-#define UNITEXT_NUMBER_NINETEEN_FULL_STOP  L"\u249a"
+#define UNITEXT_NUMBER_NINETEEN_FULL_STOP  U"\u249a"
 #define UNICODE_NUMBER_TWENTY_FULL_STOP  0x249b
-#define UNITEXT_NUMBER_TWENTY_FULL_STOP  L"\u249b"
+#define UNITEXT_NUMBER_TWENTY_FULL_STOP  U"\u249b"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_A  0x249c
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_A  L"\u249c"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_A  U"\u249c"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_B  0x249d
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_B  L"\u249d"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_B  U"\u249d"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_C  0x249e
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_C  L"\u249e"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_C  U"\u249e"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_D  0x249f
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_D  L"\u249f"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_D  U"\u249f"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_E  0x24a0
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_E  L"\u24a0"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_E  U"\u24a0"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_F  0x24a1
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_F  L"\u24a1"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_F  U"\u24a1"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_G  0x24a2
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_G  L"\u24a2"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_G  U"\u24a2"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_H  0x24a3
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_H  L"\u24a3"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_H  U"\u24a3"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_I  0x24a4
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_I  L"\u24a4"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_I  U"\u24a4"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_J  0x24a5
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_J  L"\u24a5"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_J  U"\u24a5"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_K  0x24a6
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_K  L"\u24a6"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_K  U"\u24a6"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_L  0x24a7
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_L  L"\u24a7"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_L  U"\u24a7"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_M  0x24a8
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_M  L"\u24a8"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_M  U"\u24a8"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_N  0x24a9
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_N  L"\u24a9"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_N  U"\u24a9"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_O  0x24aa
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_O  L"\u24aa"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_O  U"\u24aa"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_P  0x24ab
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_P  L"\u24ab"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_P  U"\u24ab"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_Q  0x24ac
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_Q  L"\u24ac"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_Q  U"\u24ac"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_R  0x24ad
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_R  L"\u24ad"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_R  U"\u24ad"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_S  0x24ae
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_S  L"\u24ae"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_S  U"\u24ae"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_T  0x24af
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_T  L"\u24af"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_T  U"\u24af"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_U  0x24b0
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_U  L"\u24b0"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_U  U"\u24b0"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_V  0x24b1
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_V  L"\u24b1"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_V  U"\u24b1"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_W  0x24b2
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_W  L"\u24b2"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_W  U"\u24b2"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_X  0x24b3
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_X  L"\u24b3"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_X  U"\u24b3"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_Y  0x24b4
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_Y  L"\u24b4"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_Y  U"\u24b4"
 #define UNICODE_PARENTHESIZED_LATIN_SMALL_LETTER_Z  0x24b5
-#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_Z  L"\u24b5"
+#define UNITEXT_PARENTHESIZED_LATIN_SMALL_LETTER_Z  U"\u24b5"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_A  0x24b6
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_A  L"\u24b6"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_A  U"\u24b6"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_B  0x24b7
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_B  L"\u24b7"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_B  U"\u24b7"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_C  0x24b8
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_C  L"\u24b8"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_C  U"\u24b8"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_D  0x24b9
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_D  L"\u24b9"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_D  U"\u24b9"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_E  0x24ba
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_E  L"\u24ba"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_E  U"\u24ba"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_F  0x24bb
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_F  L"\u24bb"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_F  U"\u24bb"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_G  0x24bc
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_G  L"\u24bc"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_G  U"\u24bc"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_H  0x24bd
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_H  L"\u24bd"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_H  U"\u24bd"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_I  0x24be
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_I  L"\u24be"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_I  U"\u24be"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_J  0x24bf
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_J  L"\u24bf"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_J  U"\u24bf"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_K  0x24c0
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_K  L"\u24c0"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_K  U"\u24c0"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_L  0x24c1
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_L  L"\u24c1"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_L  U"\u24c1"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_M  0x24c2
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_M  L"\u24c2"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_M  U"\u24c2"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_N  0x24c3
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_N  L"\u24c3"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_N  U"\u24c3"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_O  0x24c4
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_O  L"\u24c4"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_O  U"\u24c4"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_P  0x24c5
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_P  L"\u24c5"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_P  U"\u24c5"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_Q  0x24c6
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_Q  L"\u24c6"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_Q  U"\u24c6"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_R  0x24c7
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_R  L"\u24c7"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_R  U"\u24c7"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_S  0x24c8
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_S  L"\u24c8"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_S  U"\u24c8"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_T  0x24c9
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_T  L"\u24c9"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_T  U"\u24c9"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_U  0x24ca
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_U  L"\u24ca"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_U  U"\u24ca"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_V  0x24cb
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_V  L"\u24cb"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_V  U"\u24cb"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_W  0x24cc
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_W  L"\u24cc"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_W  U"\u24cc"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_X  0x24cd
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_X  L"\u24cd"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_X  U"\u24cd"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_Y  0x24ce
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_Y  L"\u24ce"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_Y  U"\u24ce"
 #define UNICODE_CIRCLED_LATIN_CAPITAL_LETTER_Z  0x24cf
-#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_Z  L"\u24cf"
+#define UNITEXT_CIRCLED_LATIN_CAPITAL_LETTER_Z  U"\u24cf"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_A  0x24d0
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_A  L"\u24d0"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_A  U"\u24d0"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_B  0x24d1
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_B  L"\u24d1"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_B  U"\u24d1"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_C  0x24d2
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_C  L"\u24d2"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_C  U"\u24d2"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_D  0x24d3
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_D  L"\u24d3"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_D  U"\u24d3"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_E  0x24d4
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_E  L"\u24d4"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_E  U"\u24d4"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_F  0x24d5
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_F  L"\u24d5"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_F  U"\u24d5"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_G  0x24d6
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_G  L"\u24d6"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_G  U"\u24d6"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_H  0x24d7
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_H  L"\u24d7"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_H  U"\u24d7"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_I  0x24d8
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_I  L"\u24d8"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_I  U"\u24d8"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_J  0x24d9
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_J  L"\u24d9"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_J  U"\u24d9"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_K  0x24da
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_K  L"\u24da"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_K  U"\u24da"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_L  0x24db
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_L  L"\u24db"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_L  U"\u24db"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_M  0x24dc
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_M  L"\u24dc"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_M  U"\u24dc"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_N  0x24dd
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_N  L"\u24dd"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_N  U"\u24dd"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_O  0x24de
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_O  L"\u24de"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_O  U"\u24de"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_P  0x24df
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_P  L"\u24df"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_P  U"\u24df"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_Q  0x24e0
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_Q  L"\u24e0"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_Q  U"\u24e0"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_R  0x24e1
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_R  L"\u24e1"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_R  U"\u24e1"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_S  0x24e2
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_S  L"\u24e2"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_S  U"\u24e2"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_T  0x24e3
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_T  L"\u24e3"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_T  U"\u24e3"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_U  0x24e4
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_U  L"\u24e4"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_U  U"\u24e4"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_V  0x24e5
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_V  L"\u24e5"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_V  U"\u24e5"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_W  0x24e6
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_W  L"\u24e6"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_W  U"\u24e6"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_X  0x24e7
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_X  L"\u24e7"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_X  U"\u24e7"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_Y  0x24e8
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_Y  L"\u24e8"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_Y  U"\u24e8"
 #define UNICODE_CIRCLED_LATIN_SMALL_LETTER_Z  0x24e9
-#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_Z  L"\u24e9"
+#define UNITEXT_CIRCLED_LATIN_SMALL_LETTER_Z  U"\u24e9"
 #define UNICODE_CIRCLED_DIGIT_ZERO  0x24ea
-#define UNITEXT_CIRCLED_DIGIT_ZERO  L"\u24ea"
+#define UNITEXT_CIRCLED_DIGIT_ZERO  U"\u24ea"
 #define UNICODE_NEGATIVE_CIRCLED_NUMBER_ELEVEN  0x24eb
-#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_ELEVEN  L"\u24eb"
+#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_ELEVEN  U"\u24eb"
 #define UNICODE_NEGATIVE_CIRCLED_NUMBER_TWELVE  0x24ec
-#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_TWELVE  L"\u24ec"
+#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_TWELVE  U"\u24ec"
 #define UNICODE_NEGATIVE_CIRCLED_NUMBER_THIRTEEN  0x24ed
-#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_THIRTEEN  L"\u24ed"
+#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_THIRTEEN  U"\u24ed"
 #define UNICODE_NEGATIVE_CIRCLED_NUMBER_FOURTEEN  0x24ee
-#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_FOURTEEN  L"\u24ee"
+#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_FOURTEEN  U"\u24ee"
 #define UNICODE_NEGATIVE_CIRCLED_NUMBER_FIFTEEN  0x24ef
-#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_FIFTEEN  L"\u24ef"
+#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_FIFTEEN  U"\u24ef"
 #define UNICODE_NEGATIVE_CIRCLED_NUMBER_SIXTEEN  0x24f0
-#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_SIXTEEN  L"\u24f0"
+#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_SIXTEEN  U"\u24f0"
 #define UNICODE_NEGATIVE_CIRCLED_NUMBER_SEVENTEEN  0x24f1
-#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_SEVENTEEN  L"\u24f1"
+#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_SEVENTEEN  U"\u24f1"
 #define UNICODE_NEGATIVE_CIRCLED_NUMBER_EIGHTEEN  0x24f2
-#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_EIGHTEEN  L"\u24f2"
+#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_EIGHTEEN  U"\u24f2"
 #define UNICODE_NEGATIVE_CIRCLED_NUMBER_NINETEEN  0x24f3
-#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_NINETEEN  L"\u24f3"
+#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_NINETEEN  U"\u24f3"
 #define UNICODE_NEGATIVE_CIRCLED_NUMBER_TWENTY  0x24f4
-#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_TWENTY  L"\u24f4"
+#define UNITEXT_NEGATIVE_CIRCLED_NUMBER_TWENTY  U"\u24f4"
 #define UNICODE_DOUBLE_CIRCLED_DIGIT_ONE  0x24f5
-#define UNITEXT_DOUBLE_CIRCLED_DIGIT_ONE  L"\u24f5"
+#define UNITEXT_DOUBLE_CIRCLED_DIGIT_ONE  U"\u24f5"
 #define UNICODE_DOUBLE_CIRCLED_DIGIT_TWO  0x24f6
-#define UNITEXT_DOUBLE_CIRCLED_DIGIT_TWO  L"\u24f6"
+#define UNITEXT_DOUBLE_CIRCLED_DIGIT_TWO  U"\u24f6"
 #define UNICODE_DOUBLE_CIRCLED_DIGIT_THREE  0x24f7
-#define UNITEXT_DOUBLE_CIRCLED_DIGIT_THREE  L"\u24f7"
+#define UNITEXT_DOUBLE_CIRCLED_DIGIT_THREE  U"\u24f7"
 #define UNICODE_DOUBLE_CIRCLED_DIGIT_FOUR  0x24f8
-#define UNITEXT_DOUBLE_CIRCLED_DIGIT_FOUR  L"\u24f8"
+#define UNITEXT_DOUBLE_CIRCLED_DIGIT_FOUR  U"\u24f8"
 #define UNICODE_DOUBLE_CIRCLED_DIGIT_FIVE  0x24f9
-#define UNITEXT_DOUBLE_CIRCLED_DIGIT_FIVE  L"\u24f9"
+#define UNITEXT_DOUBLE_CIRCLED_DIGIT_FIVE  U"\u24f9"
 #define UNICODE_DOUBLE_CIRCLED_DIGIT_SIX  0x24fa
-#define UNITEXT_DOUBLE_CIRCLED_DIGIT_SIX  L"\u24fa"
+#define UNITEXT_DOUBLE_CIRCLED_DIGIT_SIX  U"\u24fa"
 #define UNICODE_DOUBLE_CIRCLED_DIGIT_SEVEN  0x24fb
-#define UNITEXT_DOUBLE_CIRCLED_DIGIT_SEVEN  L"\u24fb"
+#define UNITEXT_DOUBLE_CIRCLED_DIGIT_SEVEN  U"\u24fb"
 #define UNICODE_DOUBLE_CIRCLED_DIGIT_EIGHT  0x24fc
-#define UNITEXT_DOUBLE_CIRCLED_DIGIT_EIGHT  L"\u24fc"
+#define UNITEXT_DOUBLE_CIRCLED_DIGIT_EIGHT  U"\u24fc"
 #define UNICODE_DOUBLE_CIRCLED_DIGIT_NINE  0x24fd
-#define UNITEXT_DOUBLE_CIRCLED_DIGIT_NINE  L"\u24fd"
+#define UNITEXT_DOUBLE_CIRCLED_DIGIT_NINE  U"\u24fd"
 #define UNICODE_DOUBLE_CIRCLED_NUMBER_TEN  0x24fe
-#define UNITEXT_DOUBLE_CIRCLED_NUMBER_TEN  L"\u24fe"
+#define UNITEXT_DOUBLE_CIRCLED_NUMBER_TEN  U"\u24fe"
 #define UNICODE_NEGATIVE_CIRCLED_DIGIT_ZERO  0x24ff
-#define UNITEXT_NEGATIVE_CIRCLED_DIGIT_ZERO  L"\u24ff"
+#define UNITEXT_NEGATIVE_CIRCLED_DIGIT_ZERO  U"\u24ff"
 #define UNICODE_BOX_DRAWINGS_LIGHT_HORIZONTAL  0x2500
-#define UNITEXT_BOX_DRAWINGS_LIGHT_HORIZONTAL  L"\u2500"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_HORIZONTAL  U"\u2500"
 #define UNICODE_BOX_DRAWINGS_HEAVY_HORIZONTAL  0x2501
-#define UNITEXT_BOX_DRAWINGS_HEAVY_HORIZONTAL  L"\u2501"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_HORIZONTAL  U"\u2501"
 #define UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL  0x2502
-#define UNITEXT_BOX_DRAWINGS_LIGHT_VERTICAL  L"\u2502"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_VERTICAL  U"\u2502"
 #define UNICODE_BOX_DRAWINGS_HEAVY_VERTICAL  0x2503
-#define UNITEXT_BOX_DRAWINGS_HEAVY_VERTICAL  L"\u2503"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_VERTICAL  U"\u2503"
 #define UNICODE_BOX_DRAWINGS_LIGHT_TRIPLE_DASH_HORIZONTAL  0x2504
-#define UNITEXT_BOX_DRAWINGS_LIGHT_TRIPLE_DASH_HORIZONTAL  L"\u2504"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_TRIPLE_DASH_HORIZONTAL  U"\u2504"
 #define UNICODE_BOX_DRAWINGS_HEAVY_TRIPLE_DASH_HORIZONTAL  0x2505
-#define UNITEXT_BOX_DRAWINGS_HEAVY_TRIPLE_DASH_HORIZONTAL  L"\u2505"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_TRIPLE_DASH_HORIZONTAL  U"\u2505"
 #define UNICODE_BOX_DRAWINGS_LIGHT_TRIPLE_DASH_VERTICAL  0x2506
-#define UNITEXT_BOX_DRAWINGS_LIGHT_TRIPLE_DASH_VERTICAL  L"\u2506"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_TRIPLE_DASH_VERTICAL  U"\u2506"
 #define UNICODE_BOX_DRAWINGS_HEAVY_TRIPLE_DASH_VERTICAL  0x2507
-#define UNITEXT_BOX_DRAWINGS_HEAVY_TRIPLE_DASH_VERTICAL  L"\u2507"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_TRIPLE_DASH_VERTICAL  U"\u2507"
 #define UNICODE_BOX_DRAWINGS_LIGHT_QUADRUPLE_DASH_HORIZONTAL  0x2508
-#define UNITEXT_BOX_DRAWINGS_LIGHT_QUADRUPLE_DASH_HORIZONTAL  L"\u2508"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_QUADRUPLE_DASH_HORIZONTAL  U"\u2508"
 #define UNICODE_BOX_DRAWINGS_HEAVY_QUADRUPLE_DASH_HORIZONTAL  0x2509
-#define UNITEXT_BOX_DRAWINGS_HEAVY_QUADRUPLE_DASH_HORIZONTAL  L"\u2509"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_QUADRUPLE_DASH_HORIZONTAL  U"\u2509"
 #define UNICODE_BOX_DRAWINGS_LIGHT_QUADRUPLE_DASH_VERTICAL  0x250a
-#define UNITEXT_BOX_DRAWINGS_LIGHT_QUADRUPLE_DASH_VERTICAL  L"\u250a"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_QUADRUPLE_DASH_VERTICAL  U"\u250a"
 #define UNICODE_BOX_DRAWINGS_HEAVY_QUADRUPLE_DASH_VERTICAL  0x250b
-#define UNITEXT_BOX_DRAWINGS_HEAVY_QUADRUPLE_DASH_VERTICAL  L"\u250b"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_QUADRUPLE_DASH_VERTICAL  U"\u250b"
 #define UNICODE_BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT  0x250c
-#define UNITEXT_BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT  L"\u250c"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_DOWN_AND_RIGHT  U"\u250c"
 #define UNICODE_BOX_DRAWINGS_DOWN_LIGHT_AND_RIGHT_HEAVY  0x250d
-#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_RIGHT_HEAVY  L"\u250d"
+#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_RIGHT_HEAVY  U"\u250d"
 #define UNICODE_BOX_DRAWINGS_DOWN_HEAVY_AND_RIGHT_LIGHT  0x250e
-#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_RIGHT_LIGHT  L"\u250e"
+#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_RIGHT_LIGHT  U"\u250e"
 #define UNICODE_BOX_DRAWINGS_HEAVY_DOWN_AND_RIGHT  0x250f
-#define UNITEXT_BOX_DRAWINGS_HEAVY_DOWN_AND_RIGHT  L"\u250f"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_DOWN_AND_RIGHT  U"\u250f"
 #define UNICODE_BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT  0x2510
-#define UNITEXT_BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT  L"\u2510"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_DOWN_AND_LEFT  U"\u2510"
 #define UNICODE_BOX_DRAWINGS_DOWN_LIGHT_AND_LEFT_HEAVY  0x2511
-#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_LEFT_HEAVY  L"\u2511"
+#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_LEFT_HEAVY  U"\u2511"
 #define UNICODE_BOX_DRAWINGS_DOWN_HEAVY_AND_LEFT_LIGHT  0x2512
-#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_LEFT_LIGHT  L"\u2512"
+#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_LEFT_LIGHT  U"\u2512"
 #define UNICODE_BOX_DRAWINGS_HEAVY_DOWN_AND_LEFT  0x2513
-#define UNITEXT_BOX_DRAWINGS_HEAVY_DOWN_AND_LEFT  L"\u2513"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_DOWN_AND_LEFT  U"\u2513"
 #define UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_RIGHT  0x2514
-#define UNITEXT_BOX_DRAWINGS_LIGHT_UP_AND_RIGHT  L"\u2514"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_UP_AND_RIGHT  U"\u2514"
 #define UNICODE_BOX_DRAWINGS_UP_LIGHT_AND_RIGHT_HEAVY  0x2515
-#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_RIGHT_HEAVY  L"\u2515"
+#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_RIGHT_HEAVY  U"\u2515"
 #define UNICODE_BOX_DRAWINGS_UP_HEAVY_AND_RIGHT_LIGHT  0x2516
-#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_RIGHT_LIGHT  L"\u2516"
+#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_RIGHT_LIGHT  U"\u2516"
 #define UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_RIGHT  0x2517
-#define UNITEXT_BOX_DRAWINGS_HEAVY_UP_AND_RIGHT  L"\u2517"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_UP_AND_RIGHT  U"\u2517"
 #define UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_LEFT  0x2518
-#define UNITEXT_BOX_DRAWINGS_LIGHT_UP_AND_LEFT  L"\u2518"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_UP_AND_LEFT  U"\u2518"
 #define UNICODE_BOX_DRAWINGS_UP_LIGHT_AND_LEFT_HEAVY  0x2519
-#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_LEFT_HEAVY  L"\u2519"
+#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_LEFT_HEAVY  U"\u2519"
 #define UNICODE_BOX_DRAWINGS_UP_HEAVY_AND_LEFT_LIGHT  0x251a
-#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_LEFT_LIGHT  L"\u251a"
+#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_LEFT_LIGHT  U"\u251a"
 #define UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_LEFT  0x251b
-#define UNITEXT_BOX_DRAWINGS_HEAVY_UP_AND_LEFT  L"\u251b"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_UP_AND_LEFT  U"\u251b"
 #define UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT  0x251c
-#define UNITEXT_BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT  L"\u251c"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_VERTICAL_AND_RIGHT  U"\u251c"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_LIGHT_AND_RIGHT_HEAVY  0x251d
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_LIGHT_AND_RIGHT_HEAVY  L"\u251d"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_LIGHT_AND_RIGHT_HEAVY  U"\u251d"
 #define UNICODE_BOX_DRAWINGS_UP_HEAVY_AND_RIGHT_DOWN_LIGHT  0x251e
-#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_RIGHT_DOWN_LIGHT  L"\u251e"
+#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_RIGHT_DOWN_LIGHT  U"\u251e"
 #define UNICODE_BOX_DRAWINGS_DOWN_HEAVY_AND_RIGHT_UP_LIGHT  0x251f
-#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_RIGHT_UP_LIGHT  L"\u251f"
+#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_RIGHT_UP_LIGHT  U"\u251f"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_HEAVY_AND_RIGHT_LIGHT  0x2520
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_HEAVY_AND_RIGHT_LIGHT  L"\u2520"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_HEAVY_AND_RIGHT_LIGHT  U"\u2520"
 #define UNICODE_BOX_DRAWINGS_DOWN_LIGHT_AND_RIGHT_UP_HEAVY  0x2521
-#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_RIGHT_UP_HEAVY  L"\u2521"
+#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_RIGHT_UP_HEAVY  U"\u2521"
 #define UNICODE_BOX_DRAWINGS_UP_LIGHT_AND_RIGHT_DOWN_HEAVY  0x2522
-#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_RIGHT_DOWN_HEAVY  L"\u2522"
+#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_RIGHT_DOWN_HEAVY  U"\u2522"
 #define UNICODE_BOX_DRAWINGS_HEAVY_VERTICAL_AND_RIGHT  0x2523
-#define UNITEXT_BOX_DRAWINGS_HEAVY_VERTICAL_AND_RIGHT  L"\u2523"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_VERTICAL_AND_RIGHT  U"\u2523"
 #define UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT  0x2524
-#define UNITEXT_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT  L"\u2524"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_VERTICAL_AND_LEFT  U"\u2524"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_LIGHT_AND_LEFT_HEAVY  0x2525
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_LIGHT_AND_LEFT_HEAVY  L"\u2525"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_LIGHT_AND_LEFT_HEAVY  U"\u2525"
 #define UNICODE_BOX_DRAWINGS_UP_HEAVY_AND_LEFT_DOWN_LIGHT  0x2526
-#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_LEFT_DOWN_LIGHT  L"\u2526"
+#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_LEFT_DOWN_LIGHT  U"\u2526"
 #define UNICODE_BOX_DRAWINGS_DOWN_HEAVY_AND_LEFT_UP_LIGHT  0x2527
-#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_LEFT_UP_LIGHT  L"\u2527"
+#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_LEFT_UP_LIGHT  U"\u2527"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_HEAVY_AND_LEFT_LIGHT  0x2528
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_HEAVY_AND_LEFT_LIGHT  L"\u2528"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_HEAVY_AND_LEFT_LIGHT  U"\u2528"
 #define UNICODE_BOX_DRAWINGS_DOWN_LIGHT_AND_LEFT_UP_HEAVY  0x2529
-#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_LEFT_UP_HEAVY  L"\u2529"
+#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_LEFT_UP_HEAVY  U"\u2529"
 #define UNICODE_BOX_DRAWINGS_UP_LIGHT_AND_LEFT_DOWN_HEAVY  0x252a
-#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_LEFT_DOWN_HEAVY  L"\u252a"
+#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_LEFT_DOWN_HEAVY  U"\u252a"
 #define UNICODE_BOX_DRAWINGS_HEAVY_VERTICAL_AND_LEFT  0x252b
-#define UNITEXT_BOX_DRAWINGS_HEAVY_VERTICAL_AND_LEFT  L"\u252b"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_VERTICAL_AND_LEFT  U"\u252b"
 #define UNICODE_BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL  0x252c
-#define UNITEXT_BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL  L"\u252c"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_DOWN_AND_HORIZONTAL  U"\u252c"
 #define UNICODE_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_DOWN_LIGHT  0x252d
-#define UNITEXT_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_DOWN_LIGHT  L"\u252d"
+#define UNITEXT_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_DOWN_LIGHT  U"\u252d"
 #define UNICODE_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_DOWN_LIGHT  0x252e
-#define UNITEXT_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_DOWN_LIGHT  L"\u252e"
+#define UNITEXT_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_DOWN_LIGHT  U"\u252e"
 #define UNICODE_BOX_DRAWINGS_DOWN_LIGHT_AND_HORIZONTAL_HEAVY  0x252f
-#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_HORIZONTAL_HEAVY  L"\u252f"
+#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_HORIZONTAL_HEAVY  U"\u252f"
 #define UNICODE_BOX_DRAWINGS_DOWN_HEAVY_AND_HORIZONTAL_LIGHT  0x2530
-#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_HORIZONTAL_LIGHT  L"\u2530"
+#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_HORIZONTAL_LIGHT  U"\u2530"
 #define UNICODE_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_DOWN_HEAVY  0x2531
-#define UNITEXT_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_DOWN_HEAVY  L"\u2531"
+#define UNITEXT_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_DOWN_HEAVY  U"\u2531"
 #define UNICODE_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_DOWN_HEAVY  0x2532
-#define UNITEXT_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_DOWN_HEAVY  L"\u2532"
+#define UNITEXT_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_DOWN_HEAVY  U"\u2532"
 #define UNICODE_BOX_DRAWINGS_HEAVY_DOWN_AND_HORIZONTAL  0x2533
-#define UNITEXT_BOX_DRAWINGS_HEAVY_DOWN_AND_HORIZONTAL  L"\u2533"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_DOWN_AND_HORIZONTAL  U"\u2533"
 #define UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL  0x2534
-#define UNITEXT_BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL  L"\u2534"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_UP_AND_HORIZONTAL  U"\u2534"
 #define UNICODE_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_UP_LIGHT  0x2535
-#define UNITEXT_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_UP_LIGHT  L"\u2535"
+#define UNITEXT_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_UP_LIGHT  U"\u2535"
 #define UNICODE_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_UP_LIGHT  0x2536
-#define UNITEXT_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_UP_LIGHT  L"\u2536"
+#define UNITEXT_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_UP_LIGHT  U"\u2536"
 #define UNICODE_BOX_DRAWINGS_UP_LIGHT_AND_HORIZONTAL_HEAVY  0x2537
-#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_HORIZONTAL_HEAVY  L"\u2537"
+#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_HORIZONTAL_HEAVY  U"\u2537"
 #define UNICODE_BOX_DRAWINGS_UP_HEAVY_AND_HORIZONTAL_LIGHT  0x2538
-#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_HORIZONTAL_LIGHT  L"\u2538"
+#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_HORIZONTAL_LIGHT  U"\u2538"
 #define UNICODE_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_UP_HEAVY  0x2539
-#define UNITEXT_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_UP_HEAVY  L"\u2539"
+#define UNITEXT_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_UP_HEAVY  U"\u2539"
 #define UNICODE_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_UP_HEAVY  0x253a
-#define UNITEXT_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_UP_HEAVY  L"\u253a"
+#define UNITEXT_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_UP_HEAVY  U"\u253a"
 #define UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_HORIZONTAL  0x253b
-#define UNITEXT_BOX_DRAWINGS_HEAVY_UP_AND_HORIZONTAL  L"\u253b"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_UP_AND_HORIZONTAL  U"\u253b"
 #define UNICODE_BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL  0x253c
-#define UNITEXT_BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL  L"\u253c"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_VERTICAL_AND_HORIZONTAL  U"\u253c"
 #define UNICODE_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_VERTICAL_LIGHT  0x253d
-#define UNITEXT_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_VERTICAL_LIGHT  L"\u253d"
+#define UNITEXT_BOX_DRAWINGS_LEFT_HEAVY_AND_RIGHT_VERTICAL_LIGHT  U"\u253d"
 #define UNICODE_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_VERTICAL_LIGHT  0x253e
-#define UNITEXT_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_VERTICAL_LIGHT  L"\u253e"
+#define UNITEXT_BOX_DRAWINGS_RIGHT_HEAVY_AND_LEFT_VERTICAL_LIGHT  U"\u253e"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_LIGHT_AND_HORIZONTAL_HEAVY  0x253f
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_LIGHT_AND_HORIZONTAL_HEAVY  L"\u253f"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_LIGHT_AND_HORIZONTAL_HEAVY  U"\u253f"
 #define UNICODE_BOX_DRAWINGS_UP_HEAVY_AND_DOWN_HORIZONTAL_LIGHT  0x2540
-#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_DOWN_HORIZONTAL_LIGHT  L"\u2540"
+#define UNITEXT_BOX_DRAWINGS_UP_HEAVY_AND_DOWN_HORIZONTAL_LIGHT  U"\u2540"
 #define UNICODE_BOX_DRAWINGS_DOWN_HEAVY_AND_UP_HORIZONTAL_LIGHT  0x2541
-#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_UP_HORIZONTAL_LIGHT  L"\u2541"
+#define UNITEXT_BOX_DRAWINGS_DOWN_HEAVY_AND_UP_HORIZONTAL_LIGHT  U"\u2541"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_HEAVY_AND_HORIZONTAL_LIGHT  0x2542
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_HEAVY_AND_HORIZONTAL_LIGHT  L"\u2542"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_HEAVY_AND_HORIZONTAL_LIGHT  U"\u2542"
 #define UNICODE_BOX_DRAWINGS_LEFT_UP_HEAVY_AND_RIGHT_DOWN_LIGHT  0x2543
-#define UNITEXT_BOX_DRAWINGS_LEFT_UP_HEAVY_AND_RIGHT_DOWN_LIGHT  L"\u2543"
+#define UNITEXT_BOX_DRAWINGS_LEFT_UP_HEAVY_AND_RIGHT_DOWN_LIGHT  U"\u2543"
 #define UNICODE_BOX_DRAWINGS_RIGHT_UP_HEAVY_AND_LEFT_DOWN_LIGHT  0x2544
-#define UNITEXT_BOX_DRAWINGS_RIGHT_UP_HEAVY_AND_LEFT_DOWN_LIGHT  L"\u2544"
+#define UNITEXT_BOX_DRAWINGS_RIGHT_UP_HEAVY_AND_LEFT_DOWN_LIGHT  U"\u2544"
 #define UNICODE_BOX_DRAWINGS_LEFT_DOWN_HEAVY_AND_RIGHT_UP_LIGHT  0x2545
-#define UNITEXT_BOX_DRAWINGS_LEFT_DOWN_HEAVY_AND_RIGHT_UP_LIGHT  L"\u2545"
+#define UNITEXT_BOX_DRAWINGS_LEFT_DOWN_HEAVY_AND_RIGHT_UP_LIGHT  U"\u2545"
 #define UNICODE_BOX_DRAWINGS_RIGHT_DOWN_HEAVY_AND_LEFT_UP_LIGHT  0x2546
-#define UNITEXT_BOX_DRAWINGS_RIGHT_DOWN_HEAVY_AND_LEFT_UP_LIGHT  L"\u2546"
+#define UNITEXT_BOX_DRAWINGS_RIGHT_DOWN_HEAVY_AND_LEFT_UP_LIGHT  U"\u2546"
 #define UNICODE_BOX_DRAWINGS_DOWN_LIGHT_AND_UP_HORIZONTAL_HEAVY  0x2547
-#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_UP_HORIZONTAL_HEAVY  L"\u2547"
+#define UNITEXT_BOX_DRAWINGS_DOWN_LIGHT_AND_UP_HORIZONTAL_HEAVY  U"\u2547"
 #define UNICODE_BOX_DRAWINGS_UP_LIGHT_AND_DOWN_HORIZONTAL_HEAVY  0x2548
-#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_DOWN_HORIZONTAL_HEAVY  L"\u2548"
+#define UNITEXT_BOX_DRAWINGS_UP_LIGHT_AND_DOWN_HORIZONTAL_HEAVY  U"\u2548"
 #define UNICODE_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_VERTICAL_HEAVY  0x2549
-#define UNITEXT_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_VERTICAL_HEAVY  L"\u2549"
+#define UNITEXT_BOX_DRAWINGS_RIGHT_LIGHT_AND_LEFT_VERTICAL_HEAVY  U"\u2549"
 #define UNICODE_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_VERTICAL_HEAVY  0x254a
-#define UNITEXT_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_VERTICAL_HEAVY  L"\u254a"
+#define UNITEXT_BOX_DRAWINGS_LEFT_LIGHT_AND_RIGHT_VERTICAL_HEAVY  U"\u254a"
 #define UNICODE_BOX_DRAWINGS_HEAVY_VERTICAL_AND_HORIZONTAL  0x254b
-#define UNITEXT_BOX_DRAWINGS_HEAVY_VERTICAL_AND_HORIZONTAL  L"\u254b"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_VERTICAL_AND_HORIZONTAL  U"\u254b"
 #define UNICODE_BOX_DRAWINGS_LIGHT_DOUBLE_DASH_HORIZONTAL  0x254c
-#define UNITEXT_BOX_DRAWINGS_LIGHT_DOUBLE_DASH_HORIZONTAL  L"\u254c"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_DOUBLE_DASH_HORIZONTAL  U"\u254c"
 #define UNICODE_BOX_DRAWINGS_HEAVY_DOUBLE_DASH_HORIZONTAL  0x254d
-#define UNITEXT_BOX_DRAWINGS_HEAVY_DOUBLE_DASH_HORIZONTAL  L"\u254d"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_DOUBLE_DASH_HORIZONTAL  U"\u254d"
 #define UNICODE_BOX_DRAWINGS_LIGHT_DOUBLE_DASH_VERTICAL  0x254e
-#define UNITEXT_BOX_DRAWINGS_LIGHT_DOUBLE_DASH_VERTICAL  L"\u254e"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_DOUBLE_DASH_VERTICAL  U"\u254e"
 #define UNICODE_BOX_DRAWINGS_HEAVY_DOUBLE_DASH_VERTICAL  0x254f
-#define UNITEXT_BOX_DRAWINGS_HEAVY_DOUBLE_DASH_VERTICAL  L"\u254f"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_DOUBLE_DASH_VERTICAL  U"\u254f"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_HORIZONTAL  0x2550
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_HORIZONTAL  L"\u2550"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_HORIZONTAL  U"\u2550"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_VERTICAL  0x2551
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_VERTICAL  L"\u2551"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_VERTICAL  U"\u2551"
 #define UNICODE_BOX_DRAWINGS_DOWN_SINGLE_AND_RIGHT_DOUBLE  0x2552
-#define UNITEXT_BOX_DRAWINGS_DOWN_SINGLE_AND_RIGHT_DOUBLE  L"\u2552"
+#define UNITEXT_BOX_DRAWINGS_DOWN_SINGLE_AND_RIGHT_DOUBLE  U"\u2552"
 #define UNICODE_BOX_DRAWINGS_DOWN_DOUBLE_AND_RIGHT_SINGLE  0x2553
-#define UNITEXT_BOX_DRAWINGS_DOWN_DOUBLE_AND_RIGHT_SINGLE  L"\u2553"
+#define UNITEXT_BOX_DRAWINGS_DOWN_DOUBLE_AND_RIGHT_SINGLE  U"\u2553"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_DOWN_AND_RIGHT  0x2554
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_DOWN_AND_RIGHT  L"\u2554"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_DOWN_AND_RIGHT  U"\u2554"
 #define UNICODE_BOX_DRAWINGS_DOWN_SINGLE_AND_LEFT_DOUBLE  0x2555
-#define UNITEXT_BOX_DRAWINGS_DOWN_SINGLE_AND_LEFT_DOUBLE  L"\u2555"
+#define UNITEXT_BOX_DRAWINGS_DOWN_SINGLE_AND_LEFT_DOUBLE  U"\u2555"
 #define UNICODE_BOX_DRAWINGS_DOWN_DOUBLE_AND_LEFT_SINGLE  0x2556
-#define UNITEXT_BOX_DRAWINGS_DOWN_DOUBLE_AND_LEFT_SINGLE  L"\u2556"
+#define UNITEXT_BOX_DRAWINGS_DOWN_DOUBLE_AND_LEFT_SINGLE  U"\u2556"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_DOWN_AND_LEFT  0x2557
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_DOWN_AND_LEFT  L"\u2557"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_DOWN_AND_LEFT  U"\u2557"
 #define UNICODE_BOX_DRAWINGS_UP_SINGLE_AND_RIGHT_DOUBLE  0x2558
-#define UNITEXT_BOX_DRAWINGS_UP_SINGLE_AND_RIGHT_DOUBLE  L"\u2558"
+#define UNITEXT_BOX_DRAWINGS_UP_SINGLE_AND_RIGHT_DOUBLE  U"\u2558"
 #define UNICODE_BOX_DRAWINGS_UP_DOUBLE_AND_RIGHT_SINGLE  0x2559
-#define UNITEXT_BOX_DRAWINGS_UP_DOUBLE_AND_RIGHT_SINGLE  L"\u2559"
+#define UNITEXT_BOX_DRAWINGS_UP_DOUBLE_AND_RIGHT_SINGLE  U"\u2559"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_UP_AND_RIGHT  0x255a
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_UP_AND_RIGHT  L"\u255a"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_UP_AND_RIGHT  U"\u255a"
 #define UNICODE_BOX_DRAWINGS_UP_SINGLE_AND_LEFT_DOUBLE  0x255b
-#define UNITEXT_BOX_DRAWINGS_UP_SINGLE_AND_LEFT_DOUBLE  L"\u255b"
+#define UNITEXT_BOX_DRAWINGS_UP_SINGLE_AND_LEFT_DOUBLE  U"\u255b"
 #define UNICODE_BOX_DRAWINGS_UP_DOUBLE_AND_LEFT_SINGLE  0x255c
-#define UNITEXT_BOX_DRAWINGS_UP_DOUBLE_AND_LEFT_SINGLE  L"\u255c"
+#define UNITEXT_BOX_DRAWINGS_UP_DOUBLE_AND_LEFT_SINGLE  U"\u255c"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_UP_AND_LEFT  0x255d
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_UP_AND_LEFT  L"\u255d"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_UP_AND_LEFT  U"\u255d"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_SINGLE_AND_RIGHT_DOUBLE  0x255e
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_SINGLE_AND_RIGHT_DOUBLE  L"\u255e"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_SINGLE_AND_RIGHT_DOUBLE  U"\u255e"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_RIGHT_SINGLE  0x255f
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_RIGHT_SINGLE  L"\u255f"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_RIGHT_SINGLE  U"\u255f"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_RIGHT  0x2560
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_RIGHT  L"\u2560"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_RIGHT  U"\u2560"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE  0x2561
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE  L"\u2561"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_SINGLE_AND_LEFT_DOUBLE  U"\u2561"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE  0x2562
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE  L"\u2562"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_LEFT_SINGLE  U"\u2562"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_LEFT  0x2563
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_LEFT  L"\u2563"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_LEFT  U"\u2563"
 #define UNICODE_BOX_DRAWINGS_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE  0x2564
-#define UNITEXT_BOX_DRAWINGS_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE  L"\u2564"
+#define UNITEXT_BOX_DRAWINGS_DOWN_SINGLE_AND_HORIZONTAL_DOUBLE  U"\u2564"
 #define UNICODE_BOX_DRAWINGS_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE  0x2565
-#define UNITEXT_BOX_DRAWINGS_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE  L"\u2565"
+#define UNITEXT_BOX_DRAWINGS_DOWN_DOUBLE_AND_HORIZONTAL_SINGLE  U"\u2565"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_DOWN_AND_HORIZONTAL  0x2566
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_DOWN_AND_HORIZONTAL  L"\u2566"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_DOWN_AND_HORIZONTAL  U"\u2566"
 #define UNICODE_BOX_DRAWINGS_UP_SINGLE_AND_HORIZONTAL_DOUBLE  0x2567
-#define UNITEXT_BOX_DRAWINGS_UP_SINGLE_AND_HORIZONTAL_DOUBLE  L"\u2567"
+#define UNITEXT_BOX_DRAWINGS_UP_SINGLE_AND_HORIZONTAL_DOUBLE  U"\u2567"
 #define UNICODE_BOX_DRAWINGS_UP_DOUBLE_AND_HORIZONTAL_SINGLE  0x2568
-#define UNITEXT_BOX_DRAWINGS_UP_DOUBLE_AND_HORIZONTAL_SINGLE  L"\u2568"
+#define UNITEXT_BOX_DRAWINGS_UP_DOUBLE_AND_HORIZONTAL_SINGLE  U"\u2568"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_UP_AND_HORIZONTAL  0x2569
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_UP_AND_HORIZONTAL  L"\u2569"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_UP_AND_HORIZONTAL  U"\u2569"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE  0x256a
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE  L"\u256a"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_SINGLE_AND_HORIZONTAL_DOUBLE  U"\u256a"
 #define UNICODE_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE  0x256b
-#define UNITEXT_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE  L"\u256b"
+#define UNITEXT_BOX_DRAWINGS_VERTICAL_DOUBLE_AND_HORIZONTAL_SINGLE  U"\u256b"
 #define UNICODE_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_HORIZONTAL  0x256c
-#define UNITEXT_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_HORIZONTAL  L"\u256c"
+#define UNITEXT_BOX_DRAWINGS_DOUBLE_VERTICAL_AND_HORIZONTAL  U"\u256c"
 #define UNICODE_BOX_DRAWINGS_LIGHT_ARC_DOWN_AND_RIGHT  0x256d
-#define UNITEXT_BOX_DRAWINGS_LIGHT_ARC_DOWN_AND_RIGHT  L"\u256d"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_ARC_DOWN_AND_RIGHT  U"\u256d"
 #define UNICODE_BOX_DRAWINGS_LIGHT_ARC_DOWN_AND_LEFT  0x256e
-#define UNITEXT_BOX_DRAWINGS_LIGHT_ARC_DOWN_AND_LEFT  L"\u256e"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_ARC_DOWN_AND_LEFT  U"\u256e"
 #define UNICODE_BOX_DRAWINGS_LIGHT_ARC_UP_AND_LEFT  0x256f
-#define UNITEXT_BOX_DRAWINGS_LIGHT_ARC_UP_AND_LEFT  L"\u256f"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_ARC_UP_AND_LEFT  U"\u256f"
 #define UNICODE_BOX_DRAWINGS_LIGHT_ARC_UP_AND_RIGHT  0x2570
-#define UNITEXT_BOX_DRAWINGS_LIGHT_ARC_UP_AND_RIGHT  L"\u2570"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_ARC_UP_AND_RIGHT  U"\u2570"
 #define UNICODE_BOX_DRAWINGS_LIGHT_DIAGONAL_UPPER_RIGHT_TO_LOWER_LEFT  0x2571
-#define UNITEXT_BOX_DRAWINGS_LIGHT_DIAGONAL_UPPER_RIGHT_TO_LOWER_LEFT  L"\u2571"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_DIAGONAL_UPPER_RIGHT_TO_LOWER_LEFT  U"\u2571"
 #define UNICODE_BOX_DRAWINGS_LIGHT_DIAGONAL_UPPER_LEFT_TO_LOWER_RIGHT  0x2572
-#define UNITEXT_BOX_DRAWINGS_LIGHT_DIAGONAL_UPPER_LEFT_TO_LOWER_RIGHT  L"\u2572"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_DIAGONAL_UPPER_LEFT_TO_LOWER_RIGHT  U"\u2572"
 #define UNICODE_BOX_DRAWINGS_LIGHT_DIAGONAL_CROSS  0x2573
-#define UNITEXT_BOX_DRAWINGS_LIGHT_DIAGONAL_CROSS  L"\u2573"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_DIAGONAL_CROSS  U"\u2573"
 #define UNICODE_BOX_DRAWINGS_LIGHT_LEFT  0x2574
-#define UNITEXT_BOX_DRAWINGS_LIGHT_LEFT  L"\u2574"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_LEFT  U"\u2574"
 #define UNICODE_BOX_DRAWINGS_LIGHT_UP  0x2575
-#define UNITEXT_BOX_DRAWINGS_LIGHT_UP  L"\u2575"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_UP  U"\u2575"
 #define UNICODE_BOX_DRAWINGS_LIGHT_RIGHT  0x2576
-#define UNITEXT_BOX_DRAWINGS_LIGHT_RIGHT  L"\u2576"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_RIGHT  U"\u2576"
 #define UNICODE_BOX_DRAWINGS_LIGHT_DOWN  0x2577
-#define UNITEXT_BOX_DRAWINGS_LIGHT_DOWN  L"\u2577"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_DOWN  U"\u2577"
 #define UNICODE_BOX_DRAWINGS_HEAVY_LEFT  0x2578
-#define UNITEXT_BOX_DRAWINGS_HEAVY_LEFT  L"\u2578"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_LEFT  U"\u2578"
 #define UNICODE_BOX_DRAWINGS_HEAVY_UP  0x2579
-#define UNITEXT_BOX_DRAWINGS_HEAVY_UP  L"\u2579"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_UP  U"\u2579"
 #define UNICODE_BOX_DRAWINGS_HEAVY_RIGHT  0x257a
-#define UNITEXT_BOX_DRAWINGS_HEAVY_RIGHT  L"\u257a"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_RIGHT  U"\u257a"
 #define UNICODE_BOX_DRAWINGS_HEAVY_DOWN  0x257b
-#define UNITEXT_BOX_DRAWINGS_HEAVY_DOWN  L"\u257b"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_DOWN  U"\u257b"
 #define UNICODE_BOX_DRAWINGS_LIGHT_LEFT_AND_HEAVY_RIGHT  0x257c
-#define UNITEXT_BOX_DRAWINGS_LIGHT_LEFT_AND_HEAVY_RIGHT  L"\u257c"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_LEFT_AND_HEAVY_RIGHT  U"\u257c"
 #define UNICODE_BOX_DRAWINGS_LIGHT_UP_AND_HEAVY_DOWN  0x257d
-#define UNITEXT_BOX_DRAWINGS_LIGHT_UP_AND_HEAVY_DOWN  L"\u257d"
+#define UNITEXT_BOX_DRAWINGS_LIGHT_UP_AND_HEAVY_DOWN  U"\u257d"
 #define UNICODE_BOX_DRAWINGS_HEAVY_LEFT_AND_LIGHT_RIGHT  0x257e
-#define UNITEXT_BOX_DRAWINGS_HEAVY_LEFT_AND_LIGHT_RIGHT  L"\u257e"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_LEFT_AND_LIGHT_RIGHT  U"\u257e"
 #define UNICODE_BOX_DRAWINGS_HEAVY_UP_AND_LIGHT_DOWN  0x257f
-#define UNITEXT_BOX_DRAWINGS_HEAVY_UP_AND_LIGHT_DOWN  L"\u257f"
+#define UNITEXT_BOX_DRAWINGS_HEAVY_UP_AND_LIGHT_DOWN  U"\u257f"
 #define UNICODE_UPPER_HALF_BLOCK  0x2580
-#define UNITEXT_UPPER_HALF_BLOCK  L"\u2580"
+#define UNITEXT_UPPER_HALF_BLOCK  U"\u2580"
 #define UNICODE_LOWER_ONE_EIGHTH_BLOCK  0x2581
-#define UNITEXT_LOWER_ONE_EIGHTH_BLOCK  L"\u2581"
+#define UNITEXT_LOWER_ONE_EIGHTH_BLOCK  U"\u2581"
 #define UNICODE_LOWER_ONE_QUARTER_BLOCK  0x2582
-#define UNITEXT_LOWER_ONE_QUARTER_BLOCK  L"\u2582"
+#define UNITEXT_LOWER_ONE_QUARTER_BLOCK  U"\u2582"
 #define UNICODE_LOWER_THREE_EIGHTHS_BLOCK  0x2583
-#define UNITEXT_LOWER_THREE_EIGHTHS_BLOCK  L"\u2583"
+#define UNITEXT_LOWER_THREE_EIGHTHS_BLOCK  U"\u2583"
 #define UNICODE_LOWER_HALF_BLOCK  0x2584
-#define UNITEXT_LOWER_HALF_BLOCK  L"\u2584"
+#define UNITEXT_LOWER_HALF_BLOCK  U"\u2584"
 #define UNICODE_LOWER_FIVE_EIGHTHS_BLOCK  0x2585
-#define UNITEXT_LOWER_FIVE_EIGHTHS_BLOCK  L"\u2585"
+#define UNITEXT_LOWER_FIVE_EIGHTHS_BLOCK  U"\u2585"
 #define UNICODE_LOWER_THREE_QUARTERS_BLOCK  0x2586
-#define UNITEXT_LOWER_THREE_QUARTERS_BLOCK  L"\u2586"
+#define UNITEXT_LOWER_THREE_QUARTERS_BLOCK  U"\u2586"
 #define UNICODE_LOWER_SEVEN_EIGHTHS_BLOCK  0x2587
-#define UNITEXT_LOWER_SEVEN_EIGHTHS_BLOCK  L"\u2587"
+#define UNITEXT_LOWER_SEVEN_EIGHTHS_BLOCK  U"\u2587"
 #define UNICODE_FULL_BLOCK  0x2588
-#define UNITEXT_FULL_BLOCK  L"\u2588"
+#define UNITEXT_FULL_BLOCK  U"\u2588"
 #define UNICODE_LEFT_SEVEN_EIGHTHS_BLOCK  0x2589
-#define UNITEXT_LEFT_SEVEN_EIGHTHS_BLOCK  L"\u2589"
+#define UNITEXT_LEFT_SEVEN_EIGHTHS_BLOCK  U"\u2589"
 #define UNICODE_LEFT_THREE_QUARTERS_BLOCK  0x258a
-#define UNITEXT_LEFT_THREE_QUARTERS_BLOCK  L"\u258a"
+#define UNITEXT_LEFT_THREE_QUARTERS_BLOCK  U"\u258a"
 #define UNICODE_LEFT_FIVE_EIGHTHS_BLOCK  0x258b
-#define UNITEXT_LEFT_FIVE_EIGHTHS_BLOCK  L"\u258b"
+#define UNITEXT_LEFT_FIVE_EIGHTHS_BLOCK  U"\u258b"
 #define UNICODE_LEFT_HALF_BLOCK  0x258c
-#define UNITEXT_LEFT_HALF_BLOCK  L"\u258c"
+#define UNITEXT_LEFT_HALF_BLOCK  U"\u258c"
 #define UNICODE_LEFT_THREE_EIGHTHS_BLOCK  0x258d
-#define UNITEXT_LEFT_THREE_EIGHTHS_BLOCK  L"\u258d"
+#define UNITEXT_LEFT_THREE_EIGHTHS_BLOCK  U"\u258d"
 #define UNICODE_LEFT_ONE_QUARTER_BLOCK  0x258e
-#define UNITEXT_LEFT_ONE_QUARTER_BLOCK  L"\u258e"
+#define UNITEXT_LEFT_ONE_QUARTER_BLOCK  U"\u258e"
 #define UNICODE_LEFT_ONE_EIGHTH_BLOCK  0x258f
-#define UNITEXT_LEFT_ONE_EIGHTH_BLOCK  L"\u258f"
+#define UNITEXT_LEFT_ONE_EIGHTH_BLOCK  U"\u258f"
 #define UNICODE_RIGHT_HALF_BLOCK  0x2590
-#define UNITEXT_RIGHT_HALF_BLOCK  L"\u2590"
+#define UNITEXT_RIGHT_HALF_BLOCK  U"\u2590"
 #define UNICODE_LIGHT_SHADE  0x2591
-#define UNITEXT_LIGHT_SHADE  L"\u2591"
+#define UNITEXT_LIGHT_SHADE  U"\u2591"
 #define UNICODE_MEDIUM_SHADE  0x2592
-#define UNITEXT_MEDIUM_SHADE  L"\u2592"
+#define UNITEXT_MEDIUM_SHADE  U"\u2592"
 #define UNICODE_DARK_SHADE  0x2593
-#define UNITEXT_DARK_SHADE  L"\u2593"
+#define UNITEXT_DARK_SHADE  U"\u2593"
 #define UNICODE_UPPER_ONE_EIGHTH_BLOCK  0x2594
-#define UNITEXT_UPPER_ONE_EIGHTH_BLOCK  L"\u2594"
+#define UNITEXT_UPPER_ONE_EIGHTH_BLOCK  U"\u2594"
 #define UNICODE_RIGHT_ONE_EIGHTH_BLOCK  0x2595
-#define UNITEXT_RIGHT_ONE_EIGHTH_BLOCK  L"\u2595"
+#define UNITEXT_RIGHT_ONE_EIGHTH_BLOCK  U"\u2595"
 #define UNICODE_QUADRANT_LOWER_LEFT  0x2596
-#define UNITEXT_QUADRANT_LOWER_LEFT  L"\u2596"
+#define UNITEXT_QUADRANT_LOWER_LEFT  U"\u2596"
 #define UNICODE_QUADRANT_LOWER_RIGHT  0x2597
-#define UNITEXT_QUADRANT_LOWER_RIGHT  L"\u2597"
+#define UNITEXT_QUADRANT_LOWER_RIGHT  U"\u2597"
 #define UNICODE_QUADRANT_UPPER_LEFT  0x2598
-#define UNITEXT_QUADRANT_UPPER_LEFT  L"\u2598"
+#define UNITEXT_QUADRANT_UPPER_LEFT  U"\u2598"
 #define UNICODE_QUADRANT_UPPER_LEFT_AND_LOWER_LEFT_AND_LOWER_RIGHT  0x2599
-#define UNITEXT_QUADRANT_UPPER_LEFT_AND_LOWER_LEFT_AND_LOWER_RIGHT  L"\u2599"
+#define UNITEXT_QUADRANT_UPPER_LEFT_AND_LOWER_LEFT_AND_LOWER_RIGHT  U"\u2599"
 #define UNICODE_QUADRANT_UPPER_LEFT_AND_LOWER_RIGHT  0x259a
-#define UNITEXT_QUADRANT_UPPER_LEFT_AND_LOWER_RIGHT  L"\u259a"
+#define UNITEXT_QUADRANT_UPPER_LEFT_AND_LOWER_RIGHT  U"\u259a"
 #define UNICODE_QUADRANT_UPPER_LEFT_AND_UPPER_RIGHT_AND_LOWER_LEFT  0x259b
-#define UNITEXT_QUADRANT_UPPER_LEFT_AND_UPPER_RIGHT_AND_LOWER_LEFT  L"\u259b"
+#define UNITEXT_QUADRANT_UPPER_LEFT_AND_UPPER_RIGHT_AND_LOWER_LEFT  U"\u259b"
 #define UNICODE_QUADRANT_UPPER_LEFT_AND_UPPER_RIGHT_AND_LOWER_RIGHT  0x259c
-#define UNITEXT_QUADRANT_UPPER_LEFT_AND_UPPER_RIGHT_AND_LOWER_RIGHT  L"\u259c"
+#define UNITEXT_QUADRANT_UPPER_LEFT_AND_UPPER_RIGHT_AND_LOWER_RIGHT  U"\u259c"
 #define UNICODE_QUADRANT_UPPER_RIGHT  0x259d
-#define UNITEXT_QUADRANT_UPPER_RIGHT  L"\u259d"
+#define UNITEXT_QUADRANT_UPPER_RIGHT  U"\u259d"
 #define UNICODE_QUADRANT_UPPER_RIGHT_AND_LOWER_LEFT  0x259e
-#define UNITEXT_QUADRANT_UPPER_RIGHT_AND_LOWER_LEFT  L"\u259e"
+#define UNITEXT_QUADRANT_UPPER_RIGHT_AND_LOWER_LEFT  U"\u259e"
 #define UNICODE_QUADRANT_UPPER_RIGHT_AND_LOWER_LEFT_AND_LOWER_RIGHT  0x259f
-#define UNITEXT_QUADRANT_UPPER_RIGHT_AND_LOWER_LEFT_AND_LOWER_RIGHT  L"\u259f"
+#define UNITEXT_QUADRANT_UPPER_RIGHT_AND_LOWER_LEFT_AND_LOWER_RIGHT  U"\u259f"
 #define UNICODE_BLACK_SQUARE  0x25a0
-#define UNITEXT_BLACK_SQUARE  L"\u25a0"
+#define UNITEXT_BLACK_SQUARE  U"\u25a0"
 #define UNICODE_WHITE_SQUARE  0x25a1
-#define UNITEXT_WHITE_SQUARE  L"\u25a1"
+#define UNITEXT_WHITE_SQUARE  U"\u25a1"
 #define UNICODE_WHITE_SQUARE_WITH_ROUNDED_CORNERS  0x25a2
-#define UNITEXT_WHITE_SQUARE_WITH_ROUNDED_CORNERS  L"\u25a2"
+#define UNITEXT_WHITE_SQUARE_WITH_ROUNDED_CORNERS  U"\u25a2"
 #define UNICODE_WHITE_SQUARE_CONTAINING_BLACK_SMALL_SQUARE  0x25a3
-#define UNITEXT_WHITE_SQUARE_CONTAINING_BLACK_SMALL_SQUARE  L"\u25a3"
+#define UNITEXT_WHITE_SQUARE_CONTAINING_BLACK_SMALL_SQUARE  U"\u25a3"
 #define UNICODE_SQUARE_WITH_HORIZONTAL_FILL  0x25a4
-#define UNITEXT_SQUARE_WITH_HORIZONTAL_FILL  L"\u25a4"
+#define UNITEXT_SQUARE_WITH_HORIZONTAL_FILL  U"\u25a4"
 #define UNICODE_SQUARE_WITH_VERTICAL_FILL  0x25a5
-#define UNITEXT_SQUARE_WITH_VERTICAL_FILL  L"\u25a5"
+#define UNITEXT_SQUARE_WITH_VERTICAL_FILL  U"\u25a5"
 #define UNICODE_SQUARE_WITH_ORTHOGONAL_CROSSHATCH_FILL  0x25a6
-#define UNITEXT_SQUARE_WITH_ORTHOGONAL_CROSSHATCH_FILL  L"\u25a6"
+#define UNITEXT_SQUARE_WITH_ORTHOGONAL_CROSSHATCH_FILL  U"\u25a6"
 #define UNICODE_SQUARE_WITH_UPPER_LEFT_TO_LOWER_RIGHT_FILL  0x25a7
-#define UNITEXT_SQUARE_WITH_UPPER_LEFT_TO_LOWER_RIGHT_FILL  L"\u25a7"
+#define UNITEXT_SQUARE_WITH_UPPER_LEFT_TO_LOWER_RIGHT_FILL  U"\u25a7"
 #define UNICODE_SQUARE_WITH_UPPER_RIGHT_TO_LOWER_LEFT_FILL  0x25a8
-#define UNITEXT_SQUARE_WITH_UPPER_RIGHT_TO_LOWER_LEFT_FILL  L"\u25a8"
+#define UNITEXT_SQUARE_WITH_UPPER_RIGHT_TO_LOWER_LEFT_FILL  U"\u25a8"
 #define UNICODE_SQUARE_WITH_DIAGONAL_CROSSHATCH_FILL  0x25a9
-#define UNITEXT_SQUARE_WITH_DIAGONAL_CROSSHATCH_FILL  L"\u25a9"
+#define UNITEXT_SQUARE_WITH_DIAGONAL_CROSSHATCH_FILL  U"\u25a9"
 #define UNICODE_BLACK_SMALL_SQUARE  0x25aa
-#define UNITEXT_BLACK_SMALL_SQUARE  L"\u25aa"
+#define UNITEXT_BLACK_SMALL_SQUARE  U"\u25aa"
 #define UNICODE_WHITE_SMALL_SQUARE  0x25ab
-#define UNITEXT_WHITE_SMALL_SQUARE  L"\u25ab"
+#define UNITEXT_WHITE_SMALL_SQUARE  U"\u25ab"
 #define UNICODE_BLACK_RECTANGLE  0x25ac
-#define UNITEXT_BLACK_RECTANGLE  L"\u25ac"
+#define UNITEXT_BLACK_RECTANGLE  U"\u25ac"
 #define UNICODE_WHITE_RECTANGLE  0x25ad
-#define UNITEXT_WHITE_RECTANGLE  L"\u25ad"
+#define UNITEXT_WHITE_RECTANGLE  U"\u25ad"
 #define UNICODE_BLACK_VERTICAL_RECTANGLE  0x25ae
-#define UNITEXT_BLACK_VERTICAL_RECTANGLE  L"\u25ae"
+#define UNITEXT_BLACK_VERTICAL_RECTANGLE  U"\u25ae"
 #define UNICODE_WHITE_VERTICAL_RECTANGLE  0x25af
-#define UNITEXT_WHITE_VERTICAL_RECTANGLE  L"\u25af"
+#define UNITEXT_WHITE_VERTICAL_RECTANGLE  U"\u25af"
 #define UNICODE_BLACK_PARALLELOGRAM  0x25b0
-#define UNITEXT_BLACK_PARALLELOGRAM  L"\u25b0"
+#define UNITEXT_BLACK_PARALLELOGRAM  U"\u25b0"
 #define UNICODE_WHITE_PARALLELOGRAM  0x25b1
-#define UNITEXT_WHITE_PARALLELOGRAM  L"\u25b1"
+#define UNITEXT_WHITE_PARALLELOGRAM  U"\u25b1"
 #define UNICODE_BLACK_UP_POINTING_TRIANGLE  0x25b2
-#define UNITEXT_BLACK_UP_POINTING_TRIANGLE  L"\u25b2"
+#define UNITEXT_BLACK_UP_POINTING_TRIANGLE  U"\u25b2"
 #define UNICODE_WHITE_UP_POINTING_TRIANGLE  0x25b3
-#define UNITEXT_WHITE_UP_POINTING_TRIANGLE  L"\u25b3"
+#define UNITEXT_WHITE_UP_POINTING_TRIANGLE  U"\u25b3"
 #define UNICODE_BLACK_UP_POINTING_SMALL_TRIANGLE  0x25b4
-#define UNITEXT_BLACK_UP_POINTING_SMALL_TRIANGLE  L"\u25b4"
+#define UNITEXT_BLACK_UP_POINTING_SMALL_TRIANGLE  U"\u25b4"
 #define UNICODE_WHITE_UP_POINTING_SMALL_TRIANGLE  0x25b5
-#define UNITEXT_WHITE_UP_POINTING_SMALL_TRIANGLE  L"\u25b5"
+#define UNITEXT_WHITE_UP_POINTING_SMALL_TRIANGLE  U"\u25b5"
 #define UNICODE_BLACK_RIGHT_POINTING_TRIANGLE  0x25b6
-#define UNITEXT_BLACK_RIGHT_POINTING_TRIANGLE  L"\u25b6"
+#define UNITEXT_BLACK_RIGHT_POINTING_TRIANGLE  U"\u25b6"
 #define UNICODE_WHITE_RIGHT_POINTING_TRIANGLE  0x25b7
-#define UNITEXT_WHITE_RIGHT_POINTING_TRIANGLE  L"\u25b7"
+#define UNITEXT_WHITE_RIGHT_POINTING_TRIANGLE  U"\u25b7"
 #define UNICODE_BLACK_RIGHT_POINTING_SMALL_TRIANGLE  0x25b8
-#define UNITEXT_BLACK_RIGHT_POINTING_SMALL_TRIANGLE  L"\u25b8"
+#define UNITEXT_BLACK_RIGHT_POINTING_SMALL_TRIANGLE  U"\u25b8"
 #define UNICODE_WHITE_RIGHT_POINTING_SMALL_TRIANGLE  0x25b9
-#define UNITEXT_WHITE_RIGHT_POINTING_SMALL_TRIANGLE  L"\u25b9"
+#define UNITEXT_WHITE_RIGHT_POINTING_SMALL_TRIANGLE  U"\u25b9"
 #define UNICODE_BLACK_RIGHT_POINTING_POINTER  0x25ba
-#define UNITEXT_BLACK_RIGHT_POINTING_POINTER  L"\u25ba"
+#define UNITEXT_BLACK_RIGHT_POINTING_POINTER  U"\u25ba"
 #define UNICODE_WHITE_RIGHT_POINTING_POINTER  0x25bb
-#define UNITEXT_WHITE_RIGHT_POINTING_POINTER  L"\u25bb"
+#define UNITEXT_WHITE_RIGHT_POINTING_POINTER  U"\u25bb"
 #define UNICODE_BLACK_DOWN_POINTING_TRIANGLE  0x25bc
-#define UNITEXT_BLACK_DOWN_POINTING_TRIANGLE  L"\u25bc"
+#define UNITEXT_BLACK_DOWN_POINTING_TRIANGLE  U"\u25bc"
 #define UNICODE_WHITE_DOWN_POINTING_TRIANGLE  0x25bd
-#define UNITEXT_WHITE_DOWN_POINTING_TRIANGLE  L"\u25bd"
+#define UNITEXT_WHITE_DOWN_POINTING_TRIANGLE  U"\u25bd"
 #define UNICODE_BLACK_DOWN_POINTING_SMALL_TRIANGLE  0x25be
-#define UNITEXT_BLACK_DOWN_POINTING_SMALL_TRIANGLE  L"\u25be"
+#define UNITEXT_BLACK_DOWN_POINTING_SMALL_TRIANGLE  U"\u25be"
 #define UNICODE_WHITE_DOWN_POINTING_SMALL_TRIANGLE  0x25bf
-#define UNITEXT_WHITE_DOWN_POINTING_SMALL_TRIANGLE  L"\u25bf"
+#define UNITEXT_WHITE_DOWN_POINTING_SMALL_TRIANGLE  U"\u25bf"
 #define UNICODE_BLACK_LEFT_POINTING_TRIANGLE  0x25c0
-#define UNITEXT_BLACK_LEFT_POINTING_TRIANGLE  L"\u25c0"
+#define UNITEXT_BLACK_LEFT_POINTING_TRIANGLE  U"\u25c0"
 #define UNICODE_WHITE_LEFT_POINTING_TRIANGLE  0x25c1
-#define UNITEXT_WHITE_LEFT_POINTING_TRIANGLE  L"\u25c1"
+#define UNITEXT_WHITE_LEFT_POINTING_TRIANGLE  U"\u25c1"
 #define UNICODE_BLACK_LEFT_POINTING_SMALL_TRIANGLE  0x25c2
-#define UNITEXT_BLACK_LEFT_POINTING_SMALL_TRIANGLE  L"\u25c2"
+#define UNITEXT_BLACK_LEFT_POINTING_SMALL_TRIANGLE  U"\u25c2"
 #define UNICODE_WHITE_LEFT_POINTING_SMALL_TRIANGLE  0x25c3
-#define UNITEXT_WHITE_LEFT_POINTING_SMALL_TRIANGLE  L"\u25c3"
+#define UNITEXT_WHITE_LEFT_POINTING_SMALL_TRIANGLE  U"\u25c3"
 #define UNICODE_BLACK_LEFT_POINTING_POINTER  0x25c4
-#define UNITEXT_BLACK_LEFT_POINTING_POINTER  L"\u25c4"
+#define UNITEXT_BLACK_LEFT_POINTING_POINTER  U"\u25c4"
 #define UNICODE_WHITE_LEFT_POINTING_POINTER  0x25c5
-#define UNITEXT_WHITE_LEFT_POINTING_POINTER  L"\u25c5"
+#define UNITEXT_WHITE_LEFT_POINTING_POINTER  U"\u25c5"
 #define UNICODE_BLACK_DIAMOND  0x25c6
-#define UNITEXT_BLACK_DIAMOND  L"\u25c6"
+#define UNITEXT_BLACK_DIAMOND  U"\u25c6"
 #define UNICODE_WHITE_DIAMOND  0x25c7
-#define UNITEXT_WHITE_DIAMOND  L"\u25c7"
+#define UNITEXT_WHITE_DIAMOND  U"\u25c7"
 #define UNICODE_WHITE_DIAMOND_CONTAINING_BLACK_SMALL_DIAMOND  0x25c8
-#define UNITEXT_WHITE_DIAMOND_CONTAINING_BLACK_SMALL_DIAMOND  L"\u25c8"
+#define UNITEXT_WHITE_DIAMOND_CONTAINING_BLACK_SMALL_DIAMOND  U"\u25c8"
 #define UNICODE_FISHEYE  0x25c9
-#define UNITEXT_FISHEYE  L"\u25c9"
+#define UNITEXT_FISHEYE  U"\u25c9"
 #define UNICODE_LOZENGE  0x25ca
-#define UNITEXT_LOZENGE  L"\u25ca"
+#define UNITEXT_LOZENGE  U"\u25ca"
 #define UNICODE_WHITE_CIRCLE  0x25cb
-#define UNITEXT_WHITE_CIRCLE  L"\u25cb"
+#define UNITEXT_WHITE_CIRCLE  U"\u25cb"
 #define UNICODE_DOTTED_CIRCLE  0x25cc
-#define UNITEXT_DOTTED_CIRCLE  L"\u25cc"
+#define UNITEXT_DOTTED_CIRCLE  U"\u25cc"
 #define UNICODE_CIRCLE_WITH_VERTICAL_FILL  0x25cd
-#define UNITEXT_CIRCLE_WITH_VERTICAL_FILL  L"\u25cd"
+#define UNITEXT_CIRCLE_WITH_VERTICAL_FILL  U"\u25cd"
 #define UNICODE_BULLSEYE  0x25ce
-#define UNITEXT_BULLSEYE  L"\u25ce"
+#define UNITEXT_BULLSEYE  U"\u25ce"
 #define UNICODE_BLACK_CIRCLE  0x25cf
-#define UNITEXT_BLACK_CIRCLE  L"\u25cf"
+#define UNITEXT_BLACK_CIRCLE  U"\u25cf"
 #define UNICODE_CIRCLE_WITH_LEFT_HALF_BLACK  0x25d0
-#define UNITEXT_CIRCLE_WITH_LEFT_HALF_BLACK  L"\u25d0"
+#define UNITEXT_CIRCLE_WITH_LEFT_HALF_BLACK  U"\u25d0"
 #define UNICODE_CIRCLE_WITH_RIGHT_HALF_BLACK  0x25d1
-#define UNITEXT_CIRCLE_WITH_RIGHT_HALF_BLACK  L"\u25d1"
+#define UNITEXT_CIRCLE_WITH_RIGHT_HALF_BLACK  U"\u25d1"
 #define UNICODE_CIRCLE_WITH_LOWER_HALF_BLACK  0x25d2
-#define UNITEXT_CIRCLE_WITH_LOWER_HALF_BLACK  L"\u25d2"
+#define UNITEXT_CIRCLE_WITH_LOWER_HALF_BLACK  U"\u25d2"
 #define UNICODE_CIRCLE_WITH_UPPER_HALF_BLACK  0x25d3
-#define UNITEXT_CIRCLE_WITH_UPPER_HALF_BLACK  L"\u25d3"
+#define UNITEXT_CIRCLE_WITH_UPPER_HALF_BLACK  U"\u25d3"
 #define UNICODE_CIRCLE_WITH_UPPER_RIGHT_QUADRANT_BLACK  0x25d4
-#define UNITEXT_CIRCLE_WITH_UPPER_RIGHT_QUADRANT_BLACK  L"\u25d4"
+#define UNITEXT_CIRCLE_WITH_UPPER_RIGHT_QUADRANT_BLACK  U"\u25d4"
 #define UNICODE_CIRCLE_WITH_ALL_BUT_UPPER_LEFT_QUADRANT_BLACK  0x25d5
-#define UNITEXT_CIRCLE_WITH_ALL_BUT_UPPER_LEFT_QUADRANT_BLACK  L"\u25d5"
+#define UNITEXT_CIRCLE_WITH_ALL_BUT_UPPER_LEFT_QUADRANT_BLACK  U"\u25d5"
 #define UNICODE_LEFT_HALF_BLACK_CIRCLE  0x25d6
-#define UNITEXT_LEFT_HALF_BLACK_CIRCLE  L"\u25d6"
+#define UNITEXT_LEFT_HALF_BLACK_CIRCLE  U"\u25d6"
 #define UNICODE_RIGHT_HALF_BLACK_CIRCLE  0x25d7
-#define UNITEXT_RIGHT_HALF_BLACK_CIRCLE  L"\u25d7"
+#define UNITEXT_RIGHT_HALF_BLACK_CIRCLE  U"\u25d7"
 #define UNICODE_INVERSE_BULLET  0x25d8
-#define UNITEXT_INVERSE_BULLET  L"\u25d8"
+#define UNITEXT_INVERSE_BULLET  U"\u25d8"
 #define UNICODE_INVERSE_WHITE_CIRCLE  0x25d9
-#define UNITEXT_INVERSE_WHITE_CIRCLE  L"\u25d9"
+#define UNITEXT_INVERSE_WHITE_CIRCLE  U"\u25d9"
 #define UNICODE_UPPER_HALF_INVERSE_WHITE_CIRCLE  0x25da
-#define UNITEXT_UPPER_HALF_INVERSE_WHITE_CIRCLE  L"\u25da"
+#define UNITEXT_UPPER_HALF_INVERSE_WHITE_CIRCLE  U"\u25da"
 #define UNICODE_LOWER_HALF_INVERSE_WHITE_CIRCLE  0x25db
-#define UNITEXT_LOWER_HALF_INVERSE_WHITE_CIRCLE  L"\u25db"
+#define UNITEXT_LOWER_HALF_INVERSE_WHITE_CIRCLE  U"\u25db"
 #define UNICODE_UPPER_LEFT_QUADRANT_CIRCULAR_ARC  0x25dc
-#define UNITEXT_UPPER_LEFT_QUADRANT_CIRCULAR_ARC  L"\u25dc"
+#define UNITEXT_UPPER_LEFT_QUADRANT_CIRCULAR_ARC  U"\u25dc"
 #define UNICODE_UPPER_RIGHT_QUADRANT_CIRCULAR_ARC  0x25dd
-#define UNITEXT_UPPER_RIGHT_QUADRANT_CIRCULAR_ARC  L"\u25dd"
+#define UNITEXT_UPPER_RIGHT_QUADRANT_CIRCULAR_ARC  U"\u25dd"
 #define UNICODE_LOWER_RIGHT_QUADRANT_CIRCULAR_ARC  0x25de
-#define UNITEXT_LOWER_RIGHT_QUADRANT_CIRCULAR_ARC  L"\u25de"
+#define UNITEXT_LOWER_RIGHT_QUADRANT_CIRCULAR_ARC  U"\u25de"
 #define UNICODE_LOWER_LEFT_QUADRANT_CIRCULAR_ARC  0x25df
-#define UNITEXT_LOWER_LEFT_QUADRANT_CIRCULAR_ARC  L"\u25df"
+#define UNITEXT_LOWER_LEFT_QUADRANT_CIRCULAR_ARC  U"\u25df"
 #define UNICODE_UPPER_HALF_CIRCLE  0x25e0
-#define UNITEXT_UPPER_HALF_CIRCLE  L"\u25e0"
+#define UNITEXT_UPPER_HALF_CIRCLE  U"\u25e0"
 #define UNICODE_LOWER_HALF_CIRCLE  0x25e1
-#define UNITEXT_LOWER_HALF_CIRCLE  L"\u25e1"
+#define UNITEXT_LOWER_HALF_CIRCLE  U"\u25e1"
 #define UNICODE_BLACK_LOWER_RIGHT_TRIANGLE  0x25e2
-#define UNITEXT_BLACK_LOWER_RIGHT_TRIANGLE  L"\u25e2"
+#define UNITEXT_BLACK_LOWER_RIGHT_TRIANGLE  U"\u25e2"
 #define UNICODE_BLACK_LOWER_LEFT_TRIANGLE  0x25e3
-#define UNITEXT_BLACK_LOWER_LEFT_TRIANGLE  L"\u25e3"
+#define UNITEXT_BLACK_LOWER_LEFT_TRIANGLE  U"\u25e3"
 #define UNICODE_BLACK_UPPER_LEFT_TRIANGLE  0x25e4
-#define UNITEXT_BLACK_UPPER_LEFT_TRIANGLE  L"\u25e4"
+#define UNITEXT_BLACK_UPPER_LEFT_TRIANGLE  U"\u25e4"
 #define UNICODE_BLACK_UPPER_RIGHT_TRIANGLE  0x25e5
-#define UNITEXT_BLACK_UPPER_RIGHT_TRIANGLE  L"\u25e5"
+#define UNITEXT_BLACK_UPPER_RIGHT_TRIANGLE  U"\u25e5"
 #define UNICODE_WHITE_BULLET  0x25e6
-#define UNITEXT_WHITE_BULLET  L"\u25e6"
+#define UNITEXT_WHITE_BULLET  U"\u25e6"
 #define UNICODE_SQUARE_WITH_LEFT_HALF_BLACK  0x25e7
-#define UNITEXT_SQUARE_WITH_LEFT_HALF_BLACK  L"\u25e7"
+#define UNITEXT_SQUARE_WITH_LEFT_HALF_BLACK  U"\u25e7"
 #define UNICODE_SQUARE_WITH_RIGHT_HALF_BLACK  0x25e8
-#define UNITEXT_SQUARE_WITH_RIGHT_HALF_BLACK  L"\u25e8"
+#define UNITEXT_SQUARE_WITH_RIGHT_HALF_BLACK  U"\u25e8"
 #define UNICODE_SQUARE_WITH_UPPER_LEFT_DIAGONAL_HALF_BLACK  0x25e9
-#define UNITEXT_SQUARE_WITH_UPPER_LEFT_DIAGONAL_HALF_BLACK  L"\u25e9"
+#define UNITEXT_SQUARE_WITH_UPPER_LEFT_DIAGONAL_HALF_BLACK  U"\u25e9"
 #define UNICODE_SQUARE_WITH_LOWER_RIGHT_DIAGONAL_HALF_BLACK  0x25ea
-#define UNITEXT_SQUARE_WITH_LOWER_RIGHT_DIAGONAL_HALF_BLACK  L"\u25ea"
+#define UNITEXT_SQUARE_WITH_LOWER_RIGHT_DIAGONAL_HALF_BLACK  U"\u25ea"
 #define UNICODE_WHITE_SQUARE_WITH_VERTICAL_BISECTING_LINE  0x25eb
-#define UNITEXT_WHITE_SQUARE_WITH_VERTICAL_BISECTING_LINE  L"\u25eb"
+#define UNITEXT_WHITE_SQUARE_WITH_VERTICAL_BISECTING_LINE  U"\u25eb"
 #define UNICODE_WHITE_UP_POINTING_TRIANGLE_WITH_DOT  0x25ec
-#define UNITEXT_WHITE_UP_POINTING_TRIANGLE_WITH_DOT  L"\u25ec"
+#define UNITEXT_WHITE_UP_POINTING_TRIANGLE_WITH_DOT  U"\u25ec"
 #define UNICODE_UP_POINTING_TRIANGLE_WITH_LEFT_HALF_BLACK  0x25ed
-#define UNITEXT_UP_POINTING_TRIANGLE_WITH_LEFT_HALF_BLACK  L"\u25ed"
+#define UNITEXT_UP_POINTING_TRIANGLE_WITH_LEFT_HALF_BLACK  U"\u25ed"
 #define UNICODE_UP_POINTING_TRIANGLE_WITH_RIGHT_HALF_BLACK  0x25ee
-#define UNITEXT_UP_POINTING_TRIANGLE_WITH_RIGHT_HALF_BLACK  L"\u25ee"
+#define UNITEXT_UP_POINTING_TRIANGLE_WITH_RIGHT_HALF_BLACK  U"\u25ee"
 #define UNICODE_LARGE_CIRCLE  0x25ef
-#define UNITEXT_LARGE_CIRCLE  L"\u25ef"
+#define UNITEXT_LARGE_CIRCLE  U"\u25ef"
 #define UNICODE_WHITE_SQUARE_WITH_UPPER_LEFT_QUADRANT  0x25f0
-#define UNITEXT_WHITE_SQUARE_WITH_UPPER_LEFT_QUADRANT  L"\u25f0"
+#define UNITEXT_WHITE_SQUARE_WITH_UPPER_LEFT_QUADRANT  U"\u25f0"
 #define UNICODE_WHITE_SQUARE_WITH_LOWER_LEFT_QUADRANT  0x25f1
-#define UNITEXT_WHITE_SQUARE_WITH_LOWER_LEFT_QUADRANT  L"\u25f1"
+#define UNITEXT_WHITE_SQUARE_WITH_LOWER_LEFT_QUADRANT  U"\u25f1"
 #define UNICODE_WHITE_SQUARE_WITH_LOWER_RIGHT_QUADRANT  0x25f2
-#define UNITEXT_WHITE_SQUARE_WITH_LOWER_RIGHT_QUADRANT  L"\u25f2"
+#define UNITEXT_WHITE_SQUARE_WITH_LOWER_RIGHT_QUADRANT  U"\u25f2"
 #define UNICODE_WHITE_SQUARE_WITH_UPPER_RIGHT_QUADRANT  0x25f3
-#define UNITEXT_WHITE_SQUARE_WITH_UPPER_RIGHT_QUADRANT  L"\u25f3"
+#define UNITEXT_WHITE_SQUARE_WITH_UPPER_RIGHT_QUADRANT  U"\u25f3"
 #define UNICODE_WHITE_CIRCLE_WITH_UPPER_LEFT_QUADRANT  0x25f4
-#define UNITEXT_WHITE_CIRCLE_WITH_UPPER_LEFT_QUADRANT  L"\u25f4"
+#define UNITEXT_WHITE_CIRCLE_WITH_UPPER_LEFT_QUADRANT  U"\u25f4"
 #define UNICODE_WHITE_CIRCLE_WITH_LOWER_LEFT_QUADRANT  0x25f5
-#define UNITEXT_WHITE_CIRCLE_WITH_LOWER_LEFT_QUADRANT  L"\u25f5"
+#define UNITEXT_WHITE_CIRCLE_WITH_LOWER_LEFT_QUADRANT  U"\u25f5"
 #define UNICODE_WHITE_CIRCLE_WITH_LOWER_RIGHT_QUADRANT  0x25f6
-#define UNITEXT_WHITE_CIRCLE_WITH_LOWER_RIGHT_QUADRANT  L"\u25f6"
+#define UNITEXT_WHITE_CIRCLE_WITH_LOWER_RIGHT_QUADRANT  U"\u25f6"
 #define UNICODE_WHITE_CIRCLE_WITH_UPPER_RIGHT_QUADRANT  0x25f7
-#define UNITEXT_WHITE_CIRCLE_WITH_UPPER_RIGHT_QUADRANT  L"\u25f7"
+#define UNITEXT_WHITE_CIRCLE_WITH_UPPER_RIGHT_QUADRANT  U"\u25f7"
 #define UNICODE_UPPER_LEFT_TRIANGLE  0x25f8
-#define UNITEXT_UPPER_LEFT_TRIANGLE  L"\u25f8"
+#define UNITEXT_UPPER_LEFT_TRIANGLE  U"\u25f8"
 #define UNICODE_UPPER_RIGHT_TRIANGLE  0x25f9
-#define UNITEXT_UPPER_RIGHT_TRIANGLE  L"\u25f9"
+#define UNITEXT_UPPER_RIGHT_TRIANGLE  U"\u25f9"
 #define UNICODE_LOWER_LEFT_TRIANGLE  0x25fa
-#define UNITEXT_LOWER_LEFT_TRIANGLE  L"\u25fa"
+#define UNITEXT_LOWER_LEFT_TRIANGLE  U"\u25fa"
 #define UNICODE_WHITE_MEDIUM_SQUARE  0x25fb
-#define UNITEXT_WHITE_MEDIUM_SQUARE  L"\u25fb"
+#define UNITEXT_WHITE_MEDIUM_SQUARE  U"\u25fb"
 #define UNICODE_BLACK_MEDIUM_SQUARE  0x25fc
-#define UNITEXT_BLACK_MEDIUM_SQUARE  L"\u25fc"
+#define UNITEXT_BLACK_MEDIUM_SQUARE  U"\u25fc"
 #define UNICODE_WHITE_MEDIUM_SMALL_SQUARE  0x25fd
-#define UNITEXT_WHITE_MEDIUM_SMALL_SQUARE  L"\u25fd"
+#define UNITEXT_WHITE_MEDIUM_SMALL_SQUARE  U"\u25fd"
 #define UNICODE_BLACK_MEDIUM_SMALL_SQUARE  0x25fe
-#define UNITEXT_BLACK_MEDIUM_SMALL_SQUARE  L"\u25fe"
+#define UNITEXT_BLACK_MEDIUM_SMALL_SQUARE  U"\u25fe"
 #define UNICODE_LOWER_RIGHT_TRIANGLE  0x25ff
-#define UNITEXT_LOWER_RIGHT_TRIANGLE  L"\u25ff"
+#define UNITEXT_LOWER_RIGHT_TRIANGLE  U"\u25ff"
 #define UNICODE_BLACK_SUN_WITH_RAYS  0x2600
-#define UNITEXT_BLACK_SUN_WITH_RAYS  L"\u2600"
+#define UNITEXT_BLACK_SUN_WITH_RAYS  U"\u2600"
 #define UNICODE_CLOUD  0x2601
-#define UNITEXT_CLOUD  L"\u2601"
+#define UNITEXT_CLOUD  U"\u2601"
 #define UNICODE_UMBRELLA  0x2602
-#define UNITEXT_UMBRELLA  L"\u2602"
+#define UNITEXT_UMBRELLA  U"\u2602"
 #define UNICODE_SNOWMAN  0x2603
-#define UNITEXT_SNOWMAN  L"\u2603"
+#define UNITEXT_SNOWMAN  U"\u2603"
 #define UNICODE_COMET  0x2604
-#define UNITEXT_COMET  L"\u2604"
+#define UNITEXT_COMET  U"\u2604"
 #define UNICODE_BLACK_STAR  0x2605
-#define UNITEXT_BLACK_STAR  L"\u2605"
+#define UNITEXT_BLACK_STAR  U"\u2605"
 #define UNICODE_WHITE_STAR  0x2606
-#define UNITEXT_WHITE_STAR  L"\u2606"
+#define UNITEXT_WHITE_STAR  U"\u2606"
 #define UNICODE_LIGHTNING  0x2607
-#define UNITEXT_LIGHTNING  L"\u2607"
+#define UNITEXT_LIGHTNING  U"\u2607"
 #define UNICODE_THUNDERSTORM  0x2608
-#define UNITEXT_THUNDERSTORM  L"\u2608"
+#define UNITEXT_THUNDERSTORM  U"\u2608"
 #define UNICODE_SUN  0x2609
-#define UNITEXT_SUN  L"\u2609"
+#define UNITEXT_SUN  U"\u2609"
 #define UNICODE_ASCENDING_NODE  0x260a
-#define UNITEXT_ASCENDING_NODE  L"\u260a"
+#define UNITEXT_ASCENDING_NODE  U"\u260a"
 #define UNICODE_DESCENDING_NODE  0x260b
-#define UNITEXT_DESCENDING_NODE  L"\u260b"
+#define UNITEXT_DESCENDING_NODE  U"\u260b"
 #define UNICODE_CONJUNCTION  0x260c
-#define UNITEXT_CONJUNCTION  L"\u260c"
+#define UNITEXT_CONJUNCTION  U"\u260c"
 #define UNICODE_OPPOSITION  0x260d
-#define UNITEXT_OPPOSITION  L"\u260d"
+#define UNITEXT_OPPOSITION  U"\u260d"
 #define UNICODE_BLACK_TELEPHONE  0x260e
-#define UNITEXT_BLACK_TELEPHONE  L"\u260e"
+#define UNITEXT_BLACK_TELEPHONE  U"\u260e"
 #define UNICODE_WHITE_TELEPHONE  0x260f
-#define UNITEXT_WHITE_TELEPHONE  L"\u260f"
+#define UNITEXT_WHITE_TELEPHONE  U"\u260f"
 #define UNICODE_BALLOT_BOX  0x2610
-#define UNITEXT_BALLOT_BOX  L"\u2610"
+#define UNITEXT_BALLOT_BOX  U"\u2610"
 #define UNICODE_BALLOT_BOX_WITH_CHECK  0x2611
-#define UNITEXT_BALLOT_BOX_WITH_CHECK  L"\u2611"
+#define UNITEXT_BALLOT_BOX_WITH_CHECK  U"\u2611"
 #define UNICODE_BALLOT_BOX_WITH_X  0x2612
-#define UNITEXT_BALLOT_BOX_WITH_X  L"\u2612"
+#define UNITEXT_BALLOT_BOX_WITH_X  U"\u2612"
 #define UNICODE_SALTIRE  0x2613
-#define UNITEXT_SALTIRE  L"\u2613"
+#define UNITEXT_SALTIRE  U"\u2613"
 #define UNICODE_UMBRELLA_WITH_RAIN_DROPS  0x2614
-#define UNITEXT_UMBRELLA_WITH_RAIN_DROPS  L"\u2614"
+#define UNITEXT_UMBRELLA_WITH_RAIN_DROPS  U"\u2614"
 #define UNICODE_HOT_BEVERAGE  0x2615
-#define UNITEXT_HOT_BEVERAGE  L"\u2615"
+#define UNITEXT_HOT_BEVERAGE  U"\u2615"
 #define UNICODE_WHITE_SHOGI_PIECE  0x2616
-#define UNITEXT_WHITE_SHOGI_PIECE  L"\u2616"
+#define UNITEXT_WHITE_SHOGI_PIECE  U"\u2616"
 #define UNICODE_BLACK_SHOGI_PIECE  0x2617
-#define UNITEXT_BLACK_SHOGI_PIECE  L"\u2617"
+#define UNITEXT_BLACK_SHOGI_PIECE  U"\u2617"
 #define UNICODE_SHAMROCK  0x2618
-#define UNITEXT_SHAMROCK  L"\u2618"
+#define UNITEXT_SHAMROCK  U"\u2618"
 #define UNICODE_REVERSED_ROTATED_FLORAL_HEART_BULLET  0x2619
-#define UNITEXT_REVERSED_ROTATED_FLORAL_HEART_BULLET  L"\u2619"
+#define UNITEXT_REVERSED_ROTATED_FLORAL_HEART_BULLET  U"\u2619"
 #define UNICODE_BLACK_LEFT_POINTING_INDEX  0x261a
-#define UNITEXT_BLACK_LEFT_POINTING_INDEX  L"\u261a"
+#define UNITEXT_BLACK_LEFT_POINTING_INDEX  U"\u261a"
 #define UNICODE_BLACK_RIGHT_POINTING_INDEX  0x261b
-#define UNITEXT_BLACK_RIGHT_POINTING_INDEX  L"\u261b"
+#define UNITEXT_BLACK_RIGHT_POINTING_INDEX  U"\u261b"
 #define UNICODE_WHITE_LEFT_POINTING_INDEX  0x261c
-#define UNITEXT_WHITE_LEFT_POINTING_INDEX  L"\u261c"
+#define UNITEXT_WHITE_LEFT_POINTING_INDEX  U"\u261c"
 #define UNICODE_WHITE_UP_POINTING_INDEX  0x261d
-#define UNITEXT_WHITE_UP_POINTING_INDEX  L"\u261d"
+#define UNITEXT_WHITE_UP_POINTING_INDEX  U"\u261d"
 #define UNICODE_WHITE_RIGHT_POINTING_INDEX  0x261e
-#define UNITEXT_WHITE_RIGHT_POINTING_INDEX  L"\u261e"
+#define UNITEXT_WHITE_RIGHT_POINTING_INDEX  U"\u261e"
 #define UNICODE_WHITE_DOWN_POINTING_INDEX  0x261f
-#define UNITEXT_WHITE_DOWN_POINTING_INDEX  L"\u261f"
+#define UNITEXT_WHITE_DOWN_POINTING_INDEX  U"\u261f"
 #define UNICODE_SKULL_AND_CROSSBONES  0x2620
-#define UNITEXT_SKULL_AND_CROSSBONES  L"\u2620"
+#define UNITEXT_SKULL_AND_CROSSBONES  U"\u2620"
 #define UNICODE_CAUTION_SIGN  0x2621
-#define UNITEXT_CAUTION_SIGN  L"\u2621"
+#define UNITEXT_CAUTION_SIGN  U"\u2621"
 #define UNICODE_RADIOACTIVE_SIGN  0x2622
-#define UNITEXT_RADIOACTIVE_SIGN  L"\u2622"
+#define UNITEXT_RADIOACTIVE_SIGN  U"\u2622"
 #define UNICODE_BIOHAZARD_SIGN  0x2623
-#define UNITEXT_BIOHAZARD_SIGN  L"\u2623"
+#define UNITEXT_BIOHAZARD_SIGN  U"\u2623"
 #define UNICODE_CADUCEUS  0x2624
-#define UNITEXT_CADUCEUS  L"\u2624"
+#define UNITEXT_CADUCEUS  U"\u2624"
 #define UNICODE_ANKH  0x2625
-#define UNITEXT_ANKH  L"\u2625"
+#define UNITEXT_ANKH  U"\u2625"
 #define UNICODE_ORTHODOX_CROSS  0x2626
-#define UNITEXT_ORTHODOX_CROSS  L"\u2626"
+#define UNITEXT_ORTHODOX_CROSS  U"\u2626"
 #define UNICODE_CHI_RHO  0x2627
-#define UNITEXT_CHI_RHO  L"\u2627"
+#define UNITEXT_CHI_RHO  U"\u2627"
 #define UNICODE_CROSS_OF_LORRAINE  0x2628
-#define UNITEXT_CROSS_OF_LORRAINE  L"\u2628"
+#define UNITEXT_CROSS_OF_LORRAINE  U"\u2628"
 #define UNICODE_CROSS_OF_JERUSALEM  0x2629
-#define UNITEXT_CROSS_OF_JERUSALEM  L"\u2629"
+#define UNITEXT_CROSS_OF_JERUSALEM  U"\u2629"
 #define UNICODE_STAR_AND_CRESCENT  0x262a
-#define UNITEXT_STAR_AND_CRESCENT  L"\u262a"
+#define UNITEXT_STAR_AND_CRESCENT  U"\u262a"
 #define UNICODE_FARSI_SYMBOL  0x262b
-#define UNITEXT_FARSI_SYMBOL  L"\u262b"
+#define UNITEXT_FARSI_SYMBOL  U"\u262b"
 #define UNICODE_ADI_SHAKTI  0x262c
-#define UNITEXT_ADI_SHAKTI  L"\u262c"
+#define UNITEXT_ADI_SHAKTI  U"\u262c"
 #define UNICODE_HAMMER_AND_SICKLE  0x262d
-#define UNITEXT_HAMMER_AND_SICKLE  L"\u262d"
+#define UNITEXT_HAMMER_AND_SICKLE  U"\u262d"
 #define UNICODE_PEACE_SYMBOL  0x262e
-#define UNITEXT_PEACE_SYMBOL  L"\u262e"
+#define UNITEXT_PEACE_SYMBOL  U"\u262e"
 #define UNICODE_YIN_YANG  0x262f
-#define UNITEXT_YIN_YANG  L"\u262f"
+#define UNITEXT_YIN_YANG  U"\u262f"
 #define UNICODE_TRIGRAM_FOR_HEAVEN  0x2630
-#define UNITEXT_TRIGRAM_FOR_HEAVEN  L"\u2630"
+#define UNITEXT_TRIGRAM_FOR_HEAVEN  U"\u2630"
 #define UNICODE_TRIGRAM_FOR_LAKE  0x2631
-#define UNITEXT_TRIGRAM_FOR_LAKE  L"\u2631"
+#define UNITEXT_TRIGRAM_FOR_LAKE  U"\u2631"
 #define UNICODE_TRIGRAM_FOR_FIRE  0x2632
-#define UNITEXT_TRIGRAM_FOR_FIRE  L"\u2632"
+#define UNITEXT_TRIGRAM_FOR_FIRE  U"\u2632"
 #define UNICODE_TRIGRAM_FOR_THUNDER  0x2633
-#define UNITEXT_TRIGRAM_FOR_THUNDER  L"\u2633"
+#define UNITEXT_TRIGRAM_FOR_THUNDER  U"\u2633"
 #define UNICODE_TRIGRAM_FOR_WIND  0x2634
-#define UNITEXT_TRIGRAM_FOR_WIND  L"\u2634"
+#define UNITEXT_TRIGRAM_FOR_WIND  U"\u2634"
 #define UNICODE_TRIGRAM_FOR_WATER  0x2635
-#define UNITEXT_TRIGRAM_FOR_WATER  L"\u2635"
+#define UNITEXT_TRIGRAM_FOR_WATER  U"\u2635"
 #define UNICODE_TRIGRAM_FOR_MOUNTAIN  0x2636
-#define UNITEXT_TRIGRAM_FOR_MOUNTAIN  L"\u2636"
+#define UNITEXT_TRIGRAM_FOR_MOUNTAIN  U"\u2636"
 #define UNICODE_TRIGRAM_FOR_EARTH  0x2637
-#define UNITEXT_TRIGRAM_FOR_EARTH  L"\u2637"
+#define UNITEXT_TRIGRAM_FOR_EARTH  U"\u2637"
 #define UNICODE_WHEEL_OF_DHARMA  0x2638
-#define UNITEXT_WHEEL_OF_DHARMA  L"\u2638"
+#define UNITEXT_WHEEL_OF_DHARMA  U"\u2638"
 #define UNICODE_WHITE_FROWNING_FACE  0x2639
-#define UNITEXT_WHITE_FROWNING_FACE  L"\u2639"
+#define UNITEXT_WHITE_FROWNING_FACE  U"\u2639"
 #define UNICODE_WHITE_SMILING_FACE  0x263a
-#define UNITEXT_WHITE_SMILING_FACE  L"\u263a"
+#define UNITEXT_WHITE_SMILING_FACE  U"\u263a"
 #define UNICODE_BLACK_SMILING_FACE  0x263b
-#define UNITEXT_BLACK_SMILING_FACE  L"\u263b"
+#define UNITEXT_BLACK_SMILING_FACE  U"\u263b"
 #define UNICODE_WHITE_SUN_WITH_RAYS  0x263c
-#define UNITEXT_WHITE_SUN_WITH_RAYS  L"\u263c"
+#define UNITEXT_WHITE_SUN_WITH_RAYS  U"\u263c"
 #define UNICODE_FIRST_QUARTER_MOON  0x263d
-#define UNITEXT_FIRST_QUARTER_MOON  L"\u263d"
+#define UNITEXT_FIRST_QUARTER_MOON  U"\u263d"
 #define UNICODE_LAST_QUARTER_MOON  0x263e
-#define UNITEXT_LAST_QUARTER_MOON  L"\u263e"
+#define UNITEXT_LAST_QUARTER_MOON  U"\u263e"
 #define UNICODE_MERCURY  0x263f
-#define UNITEXT_MERCURY  L"\u263f"
+#define UNITEXT_MERCURY  U"\u263f"
 #define UNICODE_FEMALE_SIGN  0x2640
-#define UNITEXT_FEMALE_SIGN  L"\u2640"
+#define UNITEXT_FEMALE_SIGN  U"\u2640"
 #define UNICODE_EARTH  0x2641
-#define UNITEXT_EARTH  L"\u2641"
+#define UNITEXT_EARTH  U"\u2641"
 #define UNICODE_MALE_SIGN  0x2642
-#define UNITEXT_MALE_SIGN  L"\u2642"
+#define UNITEXT_MALE_SIGN  U"\u2642"
 #define UNICODE_JUPITER  0x2643
-#define UNITEXT_JUPITER  L"\u2643"
+#define UNITEXT_JUPITER  U"\u2643"
 #define UNICODE_SATURN  0x2644
-#define UNITEXT_SATURN  L"\u2644"
+#define UNITEXT_SATURN  U"\u2644"
 #define UNICODE_URANUS  0x2645
-#define UNITEXT_URANUS  L"\u2645"
+#define UNITEXT_URANUS  U"\u2645"
 #define UNICODE_NEPTUNE  0x2646
-#define UNITEXT_NEPTUNE  L"\u2646"
+#define UNITEXT_NEPTUNE  U"\u2646"
 #define UNICODE_PLUTO  0x2647
-#define UNITEXT_PLUTO  L"\u2647"
+#define UNITEXT_PLUTO  U"\u2647"
 #define UNICODE_ARIES  0x2648
-#define UNITEXT_ARIES  L"\u2648"
+#define UNITEXT_ARIES  U"\u2648"
 #define UNICODE_TAURUS  0x2649
-#define UNITEXT_TAURUS  L"\u2649"
+#define UNITEXT_TAURUS  U"\u2649"
 #define UNICODE_GEMINI  0x264a
-#define UNITEXT_GEMINI  L"\u264a"
+#define UNITEXT_GEMINI  U"\u264a"
 #define UNICODE_CANCER  0x264b
-#define UNITEXT_CANCER  L"\u264b"
+#define UNITEXT_CANCER  U"\u264b"
 #define UNICODE_LEO  0x264c
-#define UNITEXT_LEO  L"\u264c"
+#define UNITEXT_LEO  U"\u264c"
 #define UNICODE_VIRGO  0x264d
-#define UNITEXT_VIRGO  L"\u264d"
+#define UNITEXT_VIRGO  U"\u264d"
 #define UNICODE_LIBRA  0x264e
-#define UNITEXT_LIBRA  L"\u264e"
+#define UNITEXT_LIBRA  U"\u264e"
 #define UNICODE_SCORPIUS  0x264f
-#define UNITEXT_SCORPIUS  L"\u264f"
+#define UNITEXT_SCORPIUS  U"\u264f"
 #define UNICODE_SAGITTARIUS  0x2650
-#define UNITEXT_SAGITTARIUS  L"\u2650"
+#define UNITEXT_SAGITTARIUS  U"\u2650"
 #define UNICODE_CAPRICORN  0x2651
-#define UNITEXT_CAPRICORN  L"\u2651"
+#define UNITEXT_CAPRICORN  U"\u2651"
 #define UNICODE_AQUARIUS  0x2652
-#define UNITEXT_AQUARIUS  L"\u2652"
+#define UNITEXT_AQUARIUS  U"\u2652"
 #define UNICODE_PISCES  0x2653
-#define UNITEXT_PISCES  L"\u2653"
+#define UNITEXT_PISCES  U"\u2653"
 #define UNICODE_WHITE_CHESS_KING  0x2654
-#define UNITEXT_WHITE_CHESS_KING  L"\u2654"
+#define UNITEXT_WHITE_CHESS_KING  U"\u2654"
 #define UNICODE_WHITE_CHESS_QUEEN  0x2655
-#define UNITEXT_WHITE_CHESS_QUEEN  L"\u2655"
+#define UNITEXT_WHITE_CHESS_QUEEN  U"\u2655"
 #define UNICODE_WHITE_CHESS_ROOK  0x2656
-#define UNITEXT_WHITE_CHESS_ROOK  L"\u2656"
+#define UNITEXT_WHITE_CHESS_ROOK  U"\u2656"
 #define UNICODE_WHITE_CHESS_BISHOP  0x2657
-#define UNITEXT_WHITE_CHESS_BISHOP  L"\u2657"
+#define UNITEXT_WHITE_CHESS_BISHOP  U"\u2657"
 #define UNICODE_WHITE_CHESS_KNIGHT  0x2658
-#define UNITEXT_WHITE_CHESS_KNIGHT  L"\u2658"
+#define UNITEXT_WHITE_CHESS_KNIGHT  U"\u2658"
 #define UNICODE_WHITE_CHESS_PAWN  0x2659
-#define UNITEXT_WHITE_CHESS_PAWN  L"\u2659"
+#define UNITEXT_WHITE_CHESS_PAWN  U"\u2659"
 #define UNICODE_BLACK_CHESS_KING  0x265a
-#define UNITEXT_BLACK_CHESS_KING  L"\u265a"
+#define UNITEXT_BLACK_CHESS_KING  U"\u265a"
 #define UNICODE_BLACK_CHESS_QUEEN  0x265b
-#define UNITEXT_BLACK_CHESS_QUEEN  L"\u265b"
+#define UNITEXT_BLACK_CHESS_QUEEN  U"\u265b"
 #define UNICODE_BLACK_CHESS_ROOK  0x265c
-#define UNITEXT_BLACK_CHESS_ROOK  L"\u265c"
+#define UNITEXT_BLACK_CHESS_ROOK  U"\u265c"
 #define UNICODE_BLACK_CHESS_BISHOP  0x265d
-#define UNITEXT_BLACK_CHESS_BISHOP  L"\u265d"
+#define UNITEXT_BLACK_CHESS_BISHOP  U"\u265d"
 #define UNICODE_BLACK_CHESS_KNIGHT  0x265e
-#define UNITEXT_BLACK_CHESS_KNIGHT  L"\u265e"
+#define UNITEXT_BLACK_CHESS_KNIGHT  U"\u265e"
 #define UNICODE_BLACK_CHESS_PAWN  0x265f
-#define UNITEXT_BLACK_CHESS_PAWN  L"\u265f"
+#define UNITEXT_BLACK_CHESS_PAWN  U"\u265f"
 #define UNICODE_BLACK_SPADE_SUIT  0x2660
-#define UNITEXT_BLACK_SPADE_SUIT  L"\u2660"
+#define UNITEXT_BLACK_SPADE_SUIT  U"\u2660"
 #define UNICODE_WHITE_HEART_SUIT  0x2661
-#define UNITEXT_WHITE_HEART_SUIT  L"\u2661"
+#define UNITEXT_WHITE_HEART_SUIT  U"\u2661"
 #define UNICODE_WHITE_DIAMOND_SUIT  0x2662
-#define UNITEXT_WHITE_DIAMOND_SUIT  L"\u2662"
+#define UNITEXT_WHITE_DIAMOND_SUIT  U"\u2662"
 #define UNICODE_BLACK_CLUB_SUIT  0x2663
-#define UNITEXT_BLACK_CLUB_SUIT  L"\u2663"
+#define UNITEXT_BLACK_CLUB_SUIT  U"\u2663"
 #define UNICODE_WHITE_SPADE_SUIT  0x2664
-#define UNITEXT_WHITE_SPADE_SUIT  L"\u2664"
+#define UNITEXT_WHITE_SPADE_SUIT  U"\u2664"
 #define UNICODE_BLACK_HEART_SUIT  0x2665
-#define UNITEXT_BLACK_HEART_SUIT  L"\u2665"
+#define UNITEXT_BLACK_HEART_SUIT  U"\u2665"
 #define UNICODE_BLACK_DIAMOND_SUIT  0x2666
-#define UNITEXT_BLACK_DIAMOND_SUIT  L"\u2666"
+#define UNITEXT_BLACK_DIAMOND_SUIT  U"\u2666"
 #define UNICODE_WHITE_CLUB_SUIT  0x2667
-#define UNITEXT_WHITE_CLUB_SUIT  L"\u2667"
+#define UNITEXT_WHITE_CLUB_SUIT  U"\u2667"
 #define UNICODE_HOT_SPRINGS  0x2668
-#define UNITEXT_HOT_SPRINGS  L"\u2668"
+#define UNITEXT_HOT_SPRINGS  U"\u2668"
 #define UNICODE_QUARTER_NOTE  0x2669
-#define UNITEXT_QUARTER_NOTE  L"\u2669"
+#define UNITEXT_QUARTER_NOTE  U"\u2669"
 #define UNICODE_EIGHTH_NOTE  0x266a
-#define UNITEXT_EIGHTH_NOTE  L"\u266a"
+#define UNITEXT_EIGHTH_NOTE  U"\u266a"
 #define UNICODE_BEAMED_EIGHTH_NOTES  0x266b
-#define UNITEXT_BEAMED_EIGHTH_NOTES  L"\u266b"
+#define UNITEXT_BEAMED_EIGHTH_NOTES  U"\u266b"
 #define UNICODE_BEAMED_SIXTEENTH_NOTES  0x266c
-#define UNITEXT_BEAMED_SIXTEENTH_NOTES  L"\u266c"
+#define UNITEXT_BEAMED_SIXTEENTH_NOTES  U"\u266c"
 #define UNICODE_MUSIC_FLAT_SIGN  0x266d
-#define UNITEXT_MUSIC_FLAT_SIGN  L"\u266d"
+#define UNITEXT_MUSIC_FLAT_SIGN  U"\u266d"
 #define UNICODE_MUSIC_NATURAL_SIGN  0x266e
-#define UNITEXT_MUSIC_NATURAL_SIGN  L"\u266e"
+#define UNITEXT_MUSIC_NATURAL_SIGN  U"\u266e"
 #define UNICODE_MUSIC_SHARP_SIGN  0x266f
-#define UNITEXT_MUSIC_SHARP_SIGN  L"\u266f"
+#define UNITEXT_MUSIC_SHARP_SIGN  U"\u266f"
 #define UNICODE_WEST_SYRIAC_CROSS  0x2670
-#define UNITEXT_WEST_SYRIAC_CROSS  L"\u2670"
+#define UNITEXT_WEST_SYRIAC_CROSS  U"\u2670"
 #define UNICODE_EAST_SYRIAC_CROSS  0x2671
-#define UNITEXT_EAST_SYRIAC_CROSS  L"\u2671"
+#define UNITEXT_EAST_SYRIAC_CROSS  U"\u2671"
 #define UNICODE_UNIVERSAL_RECYCLING_SYMBOL  0x2672
-#define UNITEXT_UNIVERSAL_RECYCLING_SYMBOL  L"\u2672"
+#define UNITEXT_UNIVERSAL_RECYCLING_SYMBOL  U"\u2672"
 #define UNICODE_RECYCLING_SYMBOL_FOR_TYPE_1_PLASTICS  0x2673
-#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_1_PLASTICS  L"\u2673"
+#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_1_PLASTICS  U"\u2673"
 #define UNICODE_RECYCLING_SYMBOL_FOR_TYPE_2_PLASTICS  0x2674
-#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_2_PLASTICS  L"\u2674"
+#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_2_PLASTICS  U"\u2674"
 #define UNICODE_RECYCLING_SYMBOL_FOR_TYPE_3_PLASTICS  0x2675
-#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_3_PLASTICS  L"\u2675"
+#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_3_PLASTICS  U"\u2675"
 #define UNICODE_RECYCLING_SYMBOL_FOR_TYPE_4_PLASTICS  0x2676
-#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_4_PLASTICS  L"\u2676"
+#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_4_PLASTICS  U"\u2676"
 #define UNICODE_RECYCLING_SYMBOL_FOR_TYPE_5_PLASTICS  0x2677
-#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_5_PLASTICS  L"\u2677"
+#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_5_PLASTICS  U"\u2677"
 #define UNICODE_RECYCLING_SYMBOL_FOR_TYPE_6_PLASTICS  0x2678
-#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_6_PLASTICS  L"\u2678"
+#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_6_PLASTICS  U"\u2678"
 #define UNICODE_RECYCLING_SYMBOL_FOR_TYPE_7_PLASTICS  0x2679
-#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_7_PLASTICS  L"\u2679"
+#define UNITEXT_RECYCLING_SYMBOL_FOR_TYPE_7_PLASTICS  U"\u2679"
 #define UNICODE_RECYCLING_SYMBOL_FOR_GENERIC_MATERIALS  0x267a
-#define UNITEXT_RECYCLING_SYMBOL_FOR_GENERIC_MATERIALS  L"\u267a"
+#define UNITEXT_RECYCLING_SYMBOL_FOR_GENERIC_MATERIALS  U"\u267a"
 #define UNICODE_BLACK_UNIVERSAL_RECYCLING_SYMBOL  0x267b
-#define UNITEXT_BLACK_UNIVERSAL_RECYCLING_SYMBOL  L"\u267b"
+#define UNITEXT_BLACK_UNIVERSAL_RECYCLING_SYMBOL  U"\u267b"
 #define UNICODE_RECYCLED_PAPER_SYMBOL  0x267c
-#define UNITEXT_RECYCLED_PAPER_SYMBOL  L"\u267c"
+#define UNITEXT_RECYCLED_PAPER_SYMBOL  U"\u267c"
 #define UNICODE_PARTIALLY_RECYCLED_PAPER_SYMBOL  0x267d
-#define UNITEXT_PARTIALLY_RECYCLED_PAPER_SYMBOL  L"\u267d"
+#define UNITEXT_PARTIALLY_RECYCLED_PAPER_SYMBOL  U"\u267d"
 #define UNICODE_PERMANENT_PAPER_SIGN  0x267e
-#define UNITEXT_PERMANENT_PAPER_SIGN  L"\u267e"
+#define UNITEXT_PERMANENT_PAPER_SIGN  U"\u267e"
 #define UNICODE_WHEELCHAIR_SYMBOL  0x267f
-#define UNITEXT_WHEELCHAIR_SYMBOL  L"\u267f"
+#define UNITEXT_WHEELCHAIR_SYMBOL  U"\u267f"
 #define UNICODE_DIE_FACE_1  0x2680
-#define UNITEXT_DIE_FACE_1  L"\u2680"
+#define UNITEXT_DIE_FACE_1  U"\u2680"
 #define UNICODE_DIE_FACE_2  0x2681
-#define UNITEXT_DIE_FACE_2  L"\u2681"
+#define UNITEXT_DIE_FACE_2  U"\u2681"
 #define UNICODE_DIE_FACE_3  0x2682
-#define UNITEXT_DIE_FACE_3  L"\u2682"
+#define UNITEXT_DIE_FACE_3  U"\u2682"
 #define UNICODE_DIE_FACE_4  0x2683
-#define UNITEXT_DIE_FACE_4  L"\u2683"
+#define UNITEXT_DIE_FACE_4  U"\u2683"
 #define UNICODE_DIE_FACE_5  0x2684
-#define UNITEXT_DIE_FACE_5  L"\u2684"
+#define UNITEXT_DIE_FACE_5  U"\u2684"
 #define UNICODE_DIE_FACE_6  0x2685
-#define UNITEXT_DIE_FACE_6  L"\u2685"
+#define UNITEXT_DIE_FACE_6  U"\u2685"
 #define UNICODE_WHITE_CIRCLE_WITH_DOT_RIGHT  0x2686
-#define UNITEXT_WHITE_CIRCLE_WITH_DOT_RIGHT  L"\u2686"
+#define UNITEXT_WHITE_CIRCLE_WITH_DOT_RIGHT  U"\u2686"
 #define UNICODE_WHITE_CIRCLE_WITH_TWO_DOTS  0x2687
-#define UNITEXT_WHITE_CIRCLE_WITH_TWO_DOTS  L"\u2687"
+#define UNITEXT_WHITE_CIRCLE_WITH_TWO_DOTS  U"\u2687"
 #define UNICODE_BLACK_CIRCLE_WITH_WHITE_DOT_RIGHT  0x2688
-#define UNITEXT_BLACK_CIRCLE_WITH_WHITE_DOT_RIGHT  L"\u2688"
+#define UNITEXT_BLACK_CIRCLE_WITH_WHITE_DOT_RIGHT  U"\u2688"
 #define UNICODE_BLACK_CIRCLE_WITH_TWO_WHITE_DOTS  0x2689
-#define UNITEXT_BLACK_CIRCLE_WITH_TWO_WHITE_DOTS  L"\u2689"
+#define UNITEXT_BLACK_CIRCLE_WITH_TWO_WHITE_DOTS  U"\u2689"
 #define UNICODE_MONOGRAM_FOR_YANG  0x268a
-#define UNITEXT_MONOGRAM_FOR_YANG  L"\u268a"
+#define UNITEXT_MONOGRAM_FOR_YANG  U"\u268a"
 #define UNICODE_MONOGRAM_FOR_YIN  0x268b
-#define UNITEXT_MONOGRAM_FOR_YIN  L"\u268b"
+#define UNITEXT_MONOGRAM_FOR_YIN  U"\u268b"
 #define UNICODE_DIGRAM_FOR_GREATER_YANG  0x268c
-#define UNITEXT_DIGRAM_FOR_GREATER_YANG  L"\u268c"
+#define UNITEXT_DIGRAM_FOR_GREATER_YANG  U"\u268c"
 #define UNICODE_DIGRAM_FOR_LESSER_YIN  0x268d
-#define UNITEXT_DIGRAM_FOR_LESSER_YIN  L"\u268d"
+#define UNITEXT_DIGRAM_FOR_LESSER_YIN  U"\u268d"
 #define UNICODE_DIGRAM_FOR_LESSER_YANG  0x268e
-#define UNITEXT_DIGRAM_FOR_LESSER_YANG  L"\u268e"
+#define UNITEXT_DIGRAM_FOR_LESSER_YANG  U"\u268e"
 #define UNICODE_DIGRAM_FOR_GREATER_YIN  0x268f
-#define UNITEXT_DIGRAM_FOR_GREATER_YIN  L"\u268f"
+#define UNITEXT_DIGRAM_FOR_GREATER_YIN  U"\u268f"
 #define UNICODE_WHITE_FLAG  0x2690
-#define UNITEXT_WHITE_FLAG  L"\u2690"
+#define UNITEXT_WHITE_FLAG  U"\u2690"
 #define UNICODE_BLACK_FLAG  0x2691
-#define UNITEXT_BLACK_FLAG  L"\u2691"
+#define UNITEXT_BLACK_FLAG  U"\u2691"
 #define UNICODE_HAMMER_AND_PICK  0x2692
-#define UNITEXT_HAMMER_AND_PICK  L"\u2692"
+#define UNITEXT_HAMMER_AND_PICK  U"\u2692"
 #define UNICODE_ANCHOR  0x2693
-#define UNITEXT_ANCHOR  L"\u2693"
+#define UNITEXT_ANCHOR  U"\u2693"
 #define UNICODE_CROSSED_SWORDS  0x2694
-#define UNITEXT_CROSSED_SWORDS  L"\u2694"
+#define UNITEXT_CROSSED_SWORDS  U"\u2694"
 #define UNICODE_STAFF_OF_AESCULAPIUS  0x2695
-#define UNITEXT_STAFF_OF_AESCULAPIUS  L"\u2695"
+#define UNITEXT_STAFF_OF_AESCULAPIUS  U"\u2695"
 #define UNICODE_SCALES  0x2696
-#define UNITEXT_SCALES  L"\u2696"
+#define UNITEXT_SCALES  U"\u2696"
 #define UNICODE_ALEMBIC  0x2697
-#define UNITEXT_ALEMBIC  L"\u2697"
+#define UNITEXT_ALEMBIC  U"\u2697"
 #define UNICODE_FLOWER  0x2698
-#define UNITEXT_FLOWER  L"\u2698"
+#define UNITEXT_FLOWER  U"\u2698"
 #define UNICODE_GEAR  0x2699
-#define UNITEXT_GEAR  L"\u2699"
+#define UNITEXT_GEAR  U"\u2699"
 #define UNICODE_STAFF_OF_HERMES  0x269a
-#define UNITEXT_STAFF_OF_HERMES  L"\u269a"
+#define UNITEXT_STAFF_OF_HERMES  U"\u269a"
 #define UNICODE_ATOM_SYMBOL  0x269b
-#define UNITEXT_ATOM_SYMBOL  L"\u269b"
+#define UNITEXT_ATOM_SYMBOL  U"\u269b"
 #define UNICODE_FLEUR_DE_LIS  0x269c
-#define UNITEXT_FLEUR_DE_LIS  L"\u269c"
+#define UNITEXT_FLEUR_DE_LIS  U"\u269c"
 #define UNICODE_WARNING_SIGN  0x26a0
-#define UNITEXT_WARNING_SIGN  L"\u26a0"
+#define UNITEXT_WARNING_SIGN  U"\u26a0"
 #define UNICODE_HIGH_VOLTAGE_SIGN  0x26a1
-#define UNITEXT_HIGH_VOLTAGE_SIGN  L"\u26a1"
+#define UNITEXT_HIGH_VOLTAGE_SIGN  U"\u26a1"
 #define UNICODE_DOUBLED_FEMALE_SIGN  0x26a2
-#define UNITEXT_DOUBLED_FEMALE_SIGN  L"\u26a2"
+#define UNITEXT_DOUBLED_FEMALE_SIGN  U"\u26a2"
 #define UNICODE_DOUBLED_MALE_SIGN  0x26a3
-#define UNITEXT_DOUBLED_MALE_SIGN  L"\u26a3"
+#define UNITEXT_DOUBLED_MALE_SIGN  U"\u26a3"
 #define UNICODE_INTERLOCKED_FEMALE_AND_MALE_SIGN  0x26a4
-#define UNITEXT_INTERLOCKED_FEMALE_AND_MALE_SIGN  L"\u26a4"
+#define UNITEXT_INTERLOCKED_FEMALE_AND_MALE_SIGN  U"\u26a4"
 #define UNICODE_MALE_AND_FEMALE_SIGN  0x26a5
-#define UNITEXT_MALE_AND_FEMALE_SIGN  L"\u26a5"
+#define UNITEXT_MALE_AND_FEMALE_SIGN  U"\u26a5"
 #define UNICODE_MALE_WITH_STROKE_SIGN  0x26a6
-#define UNITEXT_MALE_WITH_STROKE_SIGN  L"\u26a6"
+#define UNITEXT_MALE_WITH_STROKE_SIGN  U"\u26a6"
 #define UNICODE_MALE_WITH_STROKE_AND_MALE_AND_FEMALE_SIGN  0x26a7
-#define UNITEXT_MALE_WITH_STROKE_AND_MALE_AND_FEMALE_SIGN  L"\u26a7"
+#define UNITEXT_MALE_WITH_STROKE_AND_MALE_AND_FEMALE_SIGN  U"\u26a7"
 #define UNICODE_VERTICAL_MALE_WITH_STROKE_SIGN  0x26a8
-#define UNITEXT_VERTICAL_MALE_WITH_STROKE_SIGN  L"\u26a8"
+#define UNITEXT_VERTICAL_MALE_WITH_STROKE_SIGN  U"\u26a8"
 #define UNICODE_HORIZONTAL_MALE_WITH_STROKE_SIGN  0x26a9
-#define UNITEXT_HORIZONTAL_MALE_WITH_STROKE_SIGN  L"\u26a9"
+#define UNITEXT_HORIZONTAL_MALE_WITH_STROKE_SIGN  U"\u26a9"
 #define UNICODE_MEDIUM_WHITE_CIRCLE  0x26aa
-#define UNITEXT_MEDIUM_WHITE_CIRCLE  L"\u26aa"
+#define UNITEXT_MEDIUM_WHITE_CIRCLE  U"\u26aa"
 #define UNICODE_MEDIUM_BLACK_CIRCLE  0x26ab
-#define UNITEXT_MEDIUM_BLACK_CIRCLE  L"\u26ab"
+#define UNITEXT_MEDIUM_BLACK_CIRCLE  U"\u26ab"
 #define UNICODE_MEDIUM_SMALL_WHITE_CIRCLE  0x26ac
-#define UNITEXT_MEDIUM_SMALL_WHITE_CIRCLE  L"\u26ac"
+#define UNITEXT_MEDIUM_SMALL_WHITE_CIRCLE  U"\u26ac"
 #define UNICODE_MARRIAGE_SYMBOL  0x26ad
-#define UNITEXT_MARRIAGE_SYMBOL  L"\u26ad"
+#define UNITEXT_MARRIAGE_SYMBOL  U"\u26ad"
 #define UNICODE_DIVORCE_SYMBOL  0x26ae
-#define UNITEXT_DIVORCE_SYMBOL  L"\u26ae"
+#define UNITEXT_DIVORCE_SYMBOL  U"\u26ae"
 #define UNICODE_UNMARRIED_PARTNERSHIP_SYMBOL  0x26af
-#define UNITEXT_UNMARRIED_PARTNERSHIP_SYMBOL  L"\u26af"
+#define UNITEXT_UNMARRIED_PARTNERSHIP_SYMBOL  U"\u26af"
 #define UNICODE_COFFIN  0x26b0
-#define UNITEXT_COFFIN  L"\u26b0"
+#define UNITEXT_COFFIN  U"\u26b0"
 #define UNICODE_FUNERAL_URN  0x26b1
-#define UNITEXT_FUNERAL_URN  L"\u26b1"
+#define UNITEXT_FUNERAL_URN  U"\u26b1"
 #define UNICODE_NEUTER  0x26b2
-#define UNITEXT_NEUTER  L"\u26b2"
+#define UNITEXT_NEUTER  U"\u26b2"
 #define UNICODE_UPPER_BLADE_SCISSORS  0x2701
-#define UNITEXT_UPPER_BLADE_SCISSORS  L"\u2701"
+#define UNITEXT_UPPER_BLADE_SCISSORS  U"\u2701"
 #define UNICODE_BLACK_SCISSORS  0x2702
-#define UNITEXT_BLACK_SCISSORS  L"\u2702"
+#define UNITEXT_BLACK_SCISSORS  U"\u2702"
 #define UNICODE_LOWER_BLADE_SCISSORS  0x2703
-#define UNITEXT_LOWER_BLADE_SCISSORS  L"\u2703"
+#define UNITEXT_LOWER_BLADE_SCISSORS  U"\u2703"
 #define UNICODE_WHITE_SCISSORS  0x2704
-#define UNITEXT_WHITE_SCISSORS  L"\u2704"
+#define UNITEXT_WHITE_SCISSORS  U"\u2704"
 #define UNICODE_TELEPHONE_LOCATION_SIGN  0x2706
-#define UNITEXT_TELEPHONE_LOCATION_SIGN  L"\u2706"
+#define UNITEXT_TELEPHONE_LOCATION_SIGN  U"\u2706"
 #define UNICODE_TAPE_DRIVE  0x2707
-#define UNITEXT_TAPE_DRIVE  L"\u2707"
+#define UNITEXT_TAPE_DRIVE  U"\u2707"
 #define UNICODE_AIRPLANE  0x2708
-#define UNITEXT_AIRPLANE  L"\u2708"
+#define UNITEXT_AIRPLANE  U"\u2708"
 #define UNICODE_ENVELOPE  0x2709
-#define UNITEXT_ENVELOPE  L"\u2709"
+#define UNITEXT_ENVELOPE  U"\u2709"
 #define UNICODE_VICTORY_HAND  0x270c
-#define UNITEXT_VICTORY_HAND  L"\u270c"
+#define UNITEXT_VICTORY_HAND  U"\u270c"
 #define UNICODE_WRITING_HAND  0x270d
-#define UNITEXT_WRITING_HAND  L"\u270d"
+#define UNITEXT_WRITING_HAND  U"\u270d"
 #define UNICODE_LOWER_RIGHT_PENCIL  0x270e
-#define UNITEXT_LOWER_RIGHT_PENCIL  L"\u270e"
+#define UNITEXT_LOWER_RIGHT_PENCIL  U"\u270e"
 #define UNICODE_PENCIL  0x270f
-#define UNITEXT_PENCIL  L"\u270f"
+#define UNITEXT_PENCIL  U"\u270f"
 #define UNICODE_UPPER_RIGHT_PENCIL  0x2710
-#define UNITEXT_UPPER_RIGHT_PENCIL  L"\u2710"
+#define UNITEXT_UPPER_RIGHT_PENCIL  U"\u2710"
 #define UNICODE_WHITE_NIB  0x2711
-#define UNITEXT_WHITE_NIB  L"\u2711"
+#define UNITEXT_WHITE_NIB  U"\u2711"
 #define UNICODE_BLACK_NIB  0x2712
-#define UNITEXT_BLACK_NIB  L"\u2712"
+#define UNITEXT_BLACK_NIB  U"\u2712"
 #define UNICODE_CHECK_MARK  0x2713
-#define UNITEXT_CHECK_MARK  L"\u2713"
+#define UNITEXT_CHECK_MARK  U"\u2713"
 #define UNICODE_HEAVY_CHECK_MARK  0x2714
-#define UNITEXT_HEAVY_CHECK_MARK  L"\u2714"
+#define UNITEXT_HEAVY_CHECK_MARK  U"\u2714"
 #define UNICODE_MULTIPLICATION_X  0x2715
-#define UNITEXT_MULTIPLICATION_X  L"\u2715"
+#define UNITEXT_MULTIPLICATION_X  U"\u2715"
 #define UNICODE_HEAVY_MULTIPLICATION_X  0x2716
-#define UNITEXT_HEAVY_MULTIPLICATION_X  L"\u2716"
+#define UNITEXT_HEAVY_MULTIPLICATION_X  U"\u2716"
 #define UNICODE_BALLOT_X  0x2717
-#define UNITEXT_BALLOT_X  L"\u2717"
+#define UNITEXT_BALLOT_X  U"\u2717"
 #define UNICODE_HEAVY_BALLOT_X  0x2718
-#define UNITEXT_HEAVY_BALLOT_X  L"\u2718"
+#define UNITEXT_HEAVY_BALLOT_X  U"\u2718"
 #define UNICODE_OUTLINED_GREEK_CROSS  0x2719
-#define UNITEXT_OUTLINED_GREEK_CROSS  L"\u2719"
+#define UNITEXT_OUTLINED_GREEK_CROSS  U"\u2719"
 #define UNICODE_HEAVY_GREEK_CROSS  0x271a
-#define UNITEXT_HEAVY_GREEK_CROSS  L"\u271a"
+#define UNITEXT_HEAVY_GREEK_CROSS  U"\u271a"
 #define UNICODE_OPEN_CENTRE_CROSS  0x271b
-#define UNITEXT_OPEN_CENTRE_CROSS  L"\u271b"
+#define UNITEXT_OPEN_CENTRE_CROSS  U"\u271b"
 #define UNICODE_HEAVY_OPEN_CENTRE_CROSS  0x271c
-#define UNITEXT_HEAVY_OPEN_CENTRE_CROSS  L"\u271c"
+#define UNITEXT_HEAVY_OPEN_CENTRE_CROSS  U"\u271c"
 #define UNICODE_LATIN_CROSS  0x271d
-#define UNITEXT_LATIN_CROSS  L"\u271d"
+#define UNITEXT_LATIN_CROSS  U"\u271d"
 #define UNICODE_SHADOWED_WHITE_LATIN_CROSS  0x271e
-#define UNITEXT_SHADOWED_WHITE_LATIN_CROSS  L"\u271e"
+#define UNITEXT_SHADOWED_WHITE_LATIN_CROSS  U"\u271e"
 #define UNICODE_OUTLINED_LATIN_CROSS  0x271f
-#define UNITEXT_OUTLINED_LATIN_CROSS  L"\u271f"
+#define UNITEXT_OUTLINED_LATIN_CROSS  U"\u271f"
 #define UNICODE_MALTESE_CROSS  0x2720
-#define UNITEXT_MALTESE_CROSS  L"\u2720"
+#define UNITEXT_MALTESE_CROSS  U"\u2720"
 #define UNICODE_STAR_OF_DAVID  0x2721
-#define UNITEXT_STAR_OF_DAVID  L"\u2721"
+#define UNITEXT_STAR_OF_DAVID  U"\u2721"
 #define UNICODE_FOUR_TEARDROP_SPOKED_ASTERISK  0x2722
-#define UNITEXT_FOUR_TEARDROP_SPOKED_ASTERISK  L"\u2722"
+#define UNITEXT_FOUR_TEARDROP_SPOKED_ASTERISK  U"\u2722"
 #define UNICODE_FOUR_BALLOON_SPOKED_ASTERISK  0x2723
-#define UNITEXT_FOUR_BALLOON_SPOKED_ASTERISK  L"\u2723"
+#define UNITEXT_FOUR_BALLOON_SPOKED_ASTERISK  U"\u2723"
 #define UNICODE_HEAVY_FOUR_BALLOON_SPOKED_ASTERISK  0x2724
-#define UNITEXT_HEAVY_FOUR_BALLOON_SPOKED_ASTERISK  L"\u2724"
+#define UNITEXT_HEAVY_FOUR_BALLOON_SPOKED_ASTERISK  U"\u2724"
 #define UNICODE_FOUR_CLUB_SPOKED_ASTERISK  0x2725
-#define UNITEXT_FOUR_CLUB_SPOKED_ASTERISK  L"\u2725"
+#define UNITEXT_FOUR_CLUB_SPOKED_ASTERISK  U"\u2725"
 #define UNICODE_BLACK_FOUR_POINTED_STAR  0x2726
-#define UNITEXT_BLACK_FOUR_POINTED_STAR  L"\u2726"
+#define UNITEXT_BLACK_FOUR_POINTED_STAR  U"\u2726"
 #define UNICODE_WHITE_FOUR_POINTED_STAR  0x2727
-#define UNITEXT_WHITE_FOUR_POINTED_STAR  L"\u2727"
+#define UNITEXT_WHITE_FOUR_POINTED_STAR  U"\u2727"
 #define UNICODE_STRESS_OUTLINED_WHITE_STAR  0x2729
-#define UNITEXT_STRESS_OUTLINED_WHITE_STAR  L"\u2729"
+#define UNITEXT_STRESS_OUTLINED_WHITE_STAR  U"\u2729"
 #define UNICODE_CIRCLED_WHITE_STAR  0x272a
-#define UNITEXT_CIRCLED_WHITE_STAR  L"\u272a"
+#define UNITEXT_CIRCLED_WHITE_STAR  U"\u272a"
 #define UNICODE_OPEN_CENTRE_BLACK_STAR  0x272b
-#define UNITEXT_OPEN_CENTRE_BLACK_STAR  L"\u272b"
+#define UNITEXT_OPEN_CENTRE_BLACK_STAR  U"\u272b"
 #define UNICODE_BLACK_CENTRE_WHITE_STAR  0x272c
-#define UNITEXT_BLACK_CENTRE_WHITE_STAR  L"\u272c"
+#define UNITEXT_BLACK_CENTRE_WHITE_STAR  U"\u272c"
 #define UNICODE_OUTLINED_BLACK_STAR  0x272d
-#define UNITEXT_OUTLINED_BLACK_STAR  L"\u272d"
+#define UNITEXT_OUTLINED_BLACK_STAR  U"\u272d"
 #define UNICODE_HEAVY_OUTLINED_BLACK_STAR  0x272e
-#define UNITEXT_HEAVY_OUTLINED_BLACK_STAR  L"\u272e"
+#define UNITEXT_HEAVY_OUTLINED_BLACK_STAR  U"\u272e"
 #define UNICODE_PINWHEEL_STAR  0x272f
-#define UNITEXT_PINWHEEL_STAR  L"\u272f"
+#define UNITEXT_PINWHEEL_STAR  U"\u272f"
 #define UNICODE_SHADOWED_WHITE_STAR  0x2730
-#define UNITEXT_SHADOWED_WHITE_STAR  L"\u2730"
+#define UNITEXT_SHADOWED_WHITE_STAR  U"\u2730"
 #define UNICODE_HEAVY_ASTERISK  0x2731
-#define UNITEXT_HEAVY_ASTERISK  L"\u2731"
+#define UNITEXT_HEAVY_ASTERISK  U"\u2731"
 #define UNICODE_OPEN_CENTRE_ASTERISK  0x2732
-#define UNITEXT_OPEN_CENTRE_ASTERISK  L"\u2732"
+#define UNITEXT_OPEN_CENTRE_ASTERISK  U"\u2732"
 #define UNICODE_EIGHT_SPOKED_ASTERISK  0x2733
-#define UNITEXT_EIGHT_SPOKED_ASTERISK  L"\u2733"
+#define UNITEXT_EIGHT_SPOKED_ASTERISK  U"\u2733"
 #define UNICODE_EIGHT_POINTED_BLACK_STAR  0x2734
-#define UNITEXT_EIGHT_POINTED_BLACK_STAR  L"\u2734"
+#define UNITEXT_EIGHT_POINTED_BLACK_STAR  U"\u2734"
 #define UNICODE_EIGHT_POINTED_PINWHEEL_STAR  0x2735
-#define UNITEXT_EIGHT_POINTED_PINWHEEL_STAR  L"\u2735"
+#define UNITEXT_EIGHT_POINTED_PINWHEEL_STAR  U"\u2735"
 #define UNICODE_SIX_POINTED_BLACK_STAR  0x2736
-#define UNITEXT_SIX_POINTED_BLACK_STAR  L"\u2736"
+#define UNITEXT_SIX_POINTED_BLACK_STAR  U"\u2736"
 #define UNICODE_EIGHT_POINTED_RECTILINEAR_BLACK_STAR  0x2737
-#define UNITEXT_EIGHT_POINTED_RECTILINEAR_BLACK_STAR  L"\u2737"
+#define UNITEXT_EIGHT_POINTED_RECTILINEAR_BLACK_STAR  U"\u2737"
 #define UNICODE_HEAVY_EIGHT_POINTED_RECTILINEAR_BLACK_STAR  0x2738
-#define UNITEXT_HEAVY_EIGHT_POINTED_RECTILINEAR_BLACK_STAR  L"\u2738"
+#define UNITEXT_HEAVY_EIGHT_POINTED_RECTILINEAR_BLACK_STAR  U"\u2738"
 #define UNICODE_TWELVE_POINTED_BLACK_STAR  0x2739
-#define UNITEXT_TWELVE_POINTED_BLACK_STAR  L"\u2739"
+#define UNITEXT_TWELVE_POINTED_BLACK_STAR  U"\u2739"
 #define UNICODE_SIXTEEN_POINTED_ASTERISK  0x273a
-#define UNITEXT_SIXTEEN_POINTED_ASTERISK  L"\u273a"
+#define UNITEXT_SIXTEEN_POINTED_ASTERISK  U"\u273a"
 #define UNICODE_TEARDROP_SPOKED_ASTERISK  0x273b
-#define UNITEXT_TEARDROP_SPOKED_ASTERISK  L"\u273b"
+#define UNITEXT_TEARDROP_SPOKED_ASTERISK  U"\u273b"
 #define UNICODE_OPEN_CENTRE_TEARDROP_SPOKED_ASTERISK  0x273c
-#define UNITEXT_OPEN_CENTRE_TEARDROP_SPOKED_ASTERISK  L"\u273c"
+#define UNITEXT_OPEN_CENTRE_TEARDROP_SPOKED_ASTERISK  U"\u273c"
 #define UNICODE_HEAVY_TEARDROP_SPOKED_ASTERISK  0x273d
-#define UNITEXT_HEAVY_TEARDROP_SPOKED_ASTERISK  L"\u273d"
+#define UNITEXT_HEAVY_TEARDROP_SPOKED_ASTERISK  U"\u273d"
 #define UNICODE_SIX_PETALLED_BLACK_AND_WHITE_FLORETTE  0x273e
-#define UNITEXT_SIX_PETALLED_BLACK_AND_WHITE_FLORETTE  L"\u273e"
+#define UNITEXT_SIX_PETALLED_BLACK_AND_WHITE_FLORETTE  U"\u273e"
 #define UNICODE_BLACK_FLORETTE  0x273f
-#define UNITEXT_BLACK_FLORETTE  L"\u273f"
+#define UNITEXT_BLACK_FLORETTE  U"\u273f"
 #define UNICODE_WHITE_FLORETTE  0x2740
-#define UNITEXT_WHITE_FLORETTE  L"\u2740"
+#define UNITEXT_WHITE_FLORETTE  U"\u2740"
 #define UNICODE_EIGHT_PETALLED_OUTLINED_BLACK_FLORETTE  0x2741
-#define UNITEXT_EIGHT_PETALLED_OUTLINED_BLACK_FLORETTE  L"\u2741"
+#define UNITEXT_EIGHT_PETALLED_OUTLINED_BLACK_FLORETTE  U"\u2741"
 #define UNICODE_CIRCLED_OPEN_CENTRE_EIGHT_POINTED_STAR  0x2742
-#define UNITEXT_CIRCLED_OPEN_CENTRE_EIGHT_POINTED_STAR  L"\u2742"
+#define UNITEXT_CIRCLED_OPEN_CENTRE_EIGHT_POINTED_STAR  U"\u2742"
 #define UNICODE_HEAVY_TEARDROP_SPOKED_PINWHEEL_ASTERISK  0x2743
-#define UNITEXT_HEAVY_TEARDROP_SPOKED_PINWHEEL_ASTERISK  L"\u2743"
+#define UNITEXT_HEAVY_TEARDROP_SPOKED_PINWHEEL_ASTERISK  U"\u2743"
 #define UNICODE_SNOWFLAKE  0x2744
-#define UNITEXT_SNOWFLAKE  L"\u2744"
+#define UNITEXT_SNOWFLAKE  U"\u2744"
 #define UNICODE_TIGHT_TRIFOLIATE_SNOWFLAKE  0x2745
-#define UNITEXT_TIGHT_TRIFOLIATE_SNOWFLAKE  L"\u2745"
+#define UNITEXT_TIGHT_TRIFOLIATE_SNOWFLAKE  U"\u2745"
 #define UNICODE_HEAVY_CHEVRON_SNOWFLAKE  0x2746
-#define UNITEXT_HEAVY_CHEVRON_SNOWFLAKE  L"\u2746"
+#define UNITEXT_HEAVY_CHEVRON_SNOWFLAKE  U"\u2746"
 #define UNICODE_SPARKLE  0x2747
-#define UNITEXT_SPARKLE  L"\u2747"
+#define UNITEXT_SPARKLE  U"\u2747"
 #define UNICODE_HEAVY_SPARKLE  0x2748
-#define UNITEXT_HEAVY_SPARKLE  L"\u2748"
+#define UNITEXT_HEAVY_SPARKLE  U"\u2748"
 #define UNICODE_BALLOON_SPOKED_ASTERISK  0x2749
-#define UNITEXT_BALLOON_SPOKED_ASTERISK  L"\u2749"
+#define UNITEXT_BALLOON_SPOKED_ASTERISK  U"\u2749"
 #define UNICODE_EIGHT_TEARDROP_SPOKED_PROPELLER_ASTERISK  0x274a
-#define UNITEXT_EIGHT_TEARDROP_SPOKED_PROPELLER_ASTERISK  L"\u274a"
+#define UNITEXT_EIGHT_TEARDROP_SPOKED_PROPELLER_ASTERISK  U"\u274a"
 #define UNICODE_HEAVY_EIGHT_TEARDROP_SPOKED_PROPELLER_ASTERISK  0x274b
-#define UNITEXT_HEAVY_EIGHT_TEARDROP_SPOKED_PROPELLER_ASTERISK  L"\u274b"
+#define UNITEXT_HEAVY_EIGHT_TEARDROP_SPOKED_PROPELLER_ASTERISK  U"\u274b"
 #define UNICODE_SHADOWED_WHITE_CIRCLE  0x274d
-#define UNITEXT_SHADOWED_WHITE_CIRCLE  L"\u274d"
+#define UNITEXT_SHADOWED_WHITE_CIRCLE  U"\u274d"
 #define UNICODE_LOWER_RIGHT_DROP_SHADOWED_WHITE_SQUARE  0x274f
-#define UNITEXT_LOWER_RIGHT_DROP_SHADOWED_WHITE_SQUARE  L"\u274f"
+#define UNITEXT_LOWER_RIGHT_DROP_SHADOWED_WHITE_SQUARE  U"\u274f"
 #define UNICODE_UPPER_RIGHT_DROP_SHADOWED_WHITE_SQUARE  0x2750
-#define UNITEXT_UPPER_RIGHT_DROP_SHADOWED_WHITE_SQUARE  L"\u2750"
+#define UNITEXT_UPPER_RIGHT_DROP_SHADOWED_WHITE_SQUARE  U"\u2750"
 #define UNICODE_LOWER_RIGHT_SHADOWED_WHITE_SQUARE  0x2751
-#define UNITEXT_LOWER_RIGHT_SHADOWED_WHITE_SQUARE  L"\u2751"
+#define UNITEXT_LOWER_RIGHT_SHADOWED_WHITE_SQUARE  U"\u2751"
 #define UNICODE_UPPER_RIGHT_SHADOWED_WHITE_SQUARE  0x2752
-#define UNITEXT_UPPER_RIGHT_SHADOWED_WHITE_SQUARE  L"\u2752"
+#define UNITEXT_UPPER_RIGHT_SHADOWED_WHITE_SQUARE  U"\u2752"
 #define UNICODE_BLACK_DIAMOND_MINUS_WHITE_X  0x2756
-#define UNITEXT_BLACK_DIAMOND_MINUS_WHITE_X  L"\u2756"
+#define UNITEXT_BLACK_DIAMOND_MINUS_WHITE_X  U"\u2756"
 #define UNICODE_LIGHT_VERTICAL_BAR  0x2758
-#define UNITEXT_LIGHT_VERTICAL_BAR  L"\u2758"
+#define UNITEXT_LIGHT_VERTICAL_BAR  U"\u2758"
 #define UNICODE_MEDIUM_VERTICAL_BAR  0x2759
-#define UNITEXT_MEDIUM_VERTICAL_BAR  L"\u2759"
+#define UNITEXT_MEDIUM_VERTICAL_BAR  U"\u2759"
 #define UNICODE_HEAVY_VERTICAL_BAR  0x275a
-#define UNITEXT_HEAVY_VERTICAL_BAR  L"\u275a"
+#define UNITEXT_HEAVY_VERTICAL_BAR  U"\u275a"
 #define UNICODE_HEAVY_SINGLE_TURNED_COMMA_QUOTATION_MARK_ORNAMENT  0x275b
-#define UNITEXT_HEAVY_SINGLE_TURNED_COMMA_QUOTATION_MARK_ORNAMENT  L"\u275b"
+#define UNITEXT_HEAVY_SINGLE_TURNED_COMMA_QUOTATION_MARK_ORNAMENT  U"\u275b"
 #define UNICODE_HEAVY_SINGLE_COMMA_QUOTATION_MARK_ORNAMENT  0x275c
-#define UNITEXT_HEAVY_SINGLE_COMMA_QUOTATION_MARK_ORNAMENT  L"\u275c"
+#define UNITEXT_HEAVY_SINGLE_COMMA_QUOTATION_MARK_ORNAMENT  U"\u275c"
 #define UNICODE_HEAVY_DOUBLE_TURNED_COMMA_QUOTATION_MARK_ORNAMENT  0x275d
-#define UNITEXT_HEAVY_DOUBLE_TURNED_COMMA_QUOTATION_MARK_ORNAMENT  L"\u275d"
+#define UNITEXT_HEAVY_DOUBLE_TURNED_COMMA_QUOTATION_MARK_ORNAMENT  U"\u275d"
 #define UNICODE_HEAVY_DOUBLE_COMMA_QUOTATION_MARK_ORNAMENT  0x275e
-#define UNITEXT_HEAVY_DOUBLE_COMMA_QUOTATION_MARK_ORNAMENT  L"\u275e"
+#define UNITEXT_HEAVY_DOUBLE_COMMA_QUOTATION_MARK_ORNAMENT  U"\u275e"
 #define UNICODE_CURVED_STEM_PARAGRAPH_SIGN_ORNAMENT  0x2761
-#define UNITEXT_CURVED_STEM_PARAGRAPH_SIGN_ORNAMENT  L"\u2761"
+#define UNITEXT_CURVED_STEM_PARAGRAPH_SIGN_ORNAMENT  U"\u2761"
 #define UNICODE_HEAVY_EXCLAMATION_MARK_ORNAMENT  0x2762
-#define UNITEXT_HEAVY_EXCLAMATION_MARK_ORNAMENT  L"\u2762"
+#define UNITEXT_HEAVY_EXCLAMATION_MARK_ORNAMENT  U"\u2762"
 #define UNICODE_HEAVY_HEART_EXCLAMATION_MARK_ORNAMENT  0x2763
-#define UNITEXT_HEAVY_HEART_EXCLAMATION_MARK_ORNAMENT  L"\u2763"
+#define UNITEXT_HEAVY_HEART_EXCLAMATION_MARK_ORNAMENT  U"\u2763"
 #define UNICODE_HEAVY_BLACK_HEART  0x2764
-#define UNITEXT_HEAVY_BLACK_HEART  L"\u2764"
+#define UNITEXT_HEAVY_BLACK_HEART  U"\u2764"
 #define UNICODE_ROTATED_HEAVY_BLACK_HEART_BULLET  0x2765
-#define UNITEXT_ROTATED_HEAVY_BLACK_HEART_BULLET  L"\u2765"
+#define UNITEXT_ROTATED_HEAVY_BLACK_HEART_BULLET  U"\u2765"
 #define UNICODE_FLORAL_HEART  0x2766
-#define UNITEXT_FLORAL_HEART  L"\u2766"
+#define UNITEXT_FLORAL_HEART  U"\u2766"
 #define UNICODE_ROTATED_FLORAL_HEART_BULLET  0x2767
-#define UNITEXT_ROTATED_FLORAL_HEART_BULLET  L"\u2767"
+#define UNITEXT_ROTATED_FLORAL_HEART_BULLET  U"\u2767"
 #define UNICODE_MEDIUM_LEFT_PARENTHESIS_ORNAMENT  0x2768
-#define UNITEXT_MEDIUM_LEFT_PARENTHESIS_ORNAMENT  L"\u2768"
+#define UNITEXT_MEDIUM_LEFT_PARENTHESIS_ORNAMENT  U"\u2768"
 #define UNICODE_MEDIUM_RIGHT_PARENTHESIS_ORNAMENT  0x2769
-#define UNITEXT_MEDIUM_RIGHT_PARENTHESIS_ORNAMENT  L"\u2769"
+#define UNITEXT_MEDIUM_RIGHT_PARENTHESIS_ORNAMENT  U"\u2769"
 #define UNICODE_MEDIUM_FLATTENED_LEFT_PARENTHESIS_ORNAMENT  0x276a
-#define UNITEXT_MEDIUM_FLATTENED_LEFT_PARENTHESIS_ORNAMENT  L"\u276a"
+#define UNITEXT_MEDIUM_FLATTENED_LEFT_PARENTHESIS_ORNAMENT  U"\u276a"
 #define UNICODE_MEDIUM_FLATTENED_RIGHT_PARENTHESIS_ORNAMENT  0x276b
-#define UNITEXT_MEDIUM_FLATTENED_RIGHT_PARENTHESIS_ORNAMENT  L"\u276b"
+#define UNITEXT_MEDIUM_FLATTENED_RIGHT_PARENTHESIS_ORNAMENT  U"\u276b"
 #define UNICODE_MEDIUM_LEFT_POINTING_ANGLE_BRACKET_ORNAMENT  0x276c
-#define UNITEXT_MEDIUM_LEFT_POINTING_ANGLE_BRACKET_ORNAMENT  L"\u276c"
+#define UNITEXT_MEDIUM_LEFT_POINTING_ANGLE_BRACKET_ORNAMENT  U"\u276c"
 #define UNICODE_MEDIUM_RIGHT_POINTING_ANGLE_BRACKET_ORNAMENT  0x276d
-#define UNITEXT_MEDIUM_RIGHT_POINTING_ANGLE_BRACKET_ORNAMENT  L"\u276d"
+#define UNITEXT_MEDIUM_RIGHT_POINTING_ANGLE_BRACKET_ORNAMENT  U"\u276d"
 #define UNICODE_HEAVY_LEFT_POINTING_ANGLE_QUOTATION_MARK_ORNAMENT  0x276e
-#define UNITEXT_HEAVY_LEFT_POINTING_ANGLE_QUOTATION_MARK_ORNAMENT  L"\u276e"
+#define UNITEXT_HEAVY_LEFT_POINTING_ANGLE_QUOTATION_MARK_ORNAMENT  U"\u276e"
 #define UNICODE_HEAVY_RIGHT_POINTING_ANGLE_QUOTATION_MARK_ORNAMENT  0x276f
-#define UNITEXT_HEAVY_RIGHT_POINTING_ANGLE_QUOTATION_MARK_ORNAMENT  L"\u276f"
+#define UNITEXT_HEAVY_RIGHT_POINTING_ANGLE_QUOTATION_MARK_ORNAMENT  U"\u276f"
 #define UNICODE_HEAVY_LEFT_POINTING_ANGLE_BRACKET_ORNAMENT  0x2770
-#define UNITEXT_HEAVY_LEFT_POINTING_ANGLE_BRACKET_ORNAMENT  L"\u2770"
+#define UNITEXT_HEAVY_LEFT_POINTING_ANGLE_BRACKET_ORNAMENT  U"\u2770"
 #define UNICODE_HEAVY_RIGHT_POINTING_ANGLE_BRACKET_ORNAMENT  0x2771
-#define UNITEXT_HEAVY_RIGHT_POINTING_ANGLE_BRACKET_ORNAMENT  L"\u2771"
+#define UNITEXT_HEAVY_RIGHT_POINTING_ANGLE_BRACKET_ORNAMENT  U"\u2771"
 #define UNICODE_LIGHT_LEFT_TORTOISE_SHELL_BRACKET_ORNAMENT  0x2772
-#define UNITEXT_LIGHT_LEFT_TORTOISE_SHELL_BRACKET_ORNAMENT  L"\u2772"
+#define UNITEXT_LIGHT_LEFT_TORTOISE_SHELL_BRACKET_ORNAMENT  U"\u2772"
 #define UNICODE_LIGHT_RIGHT_TORTOISE_SHELL_BRACKET_ORNAMENT  0x2773
-#define UNITEXT_LIGHT_RIGHT_TORTOISE_SHELL_BRACKET_ORNAMENT  L"\u2773"
+#define UNITEXT_LIGHT_RIGHT_TORTOISE_SHELL_BRACKET_ORNAMENT  U"\u2773"
 #define UNICODE_MEDIUM_LEFT_CURLY_BRACKET_ORNAMENT  0x2774
-#define UNITEXT_MEDIUM_LEFT_CURLY_BRACKET_ORNAMENT  L"\u2774"
+#define UNITEXT_MEDIUM_LEFT_CURLY_BRACKET_ORNAMENT  U"\u2774"
 #define UNICODE_MEDIUM_RIGHT_CURLY_BRACKET_ORNAMENT  0x2775
-#define UNITEXT_MEDIUM_RIGHT_CURLY_BRACKET_ORNAMENT  L"\u2775"
+#define UNITEXT_MEDIUM_RIGHT_CURLY_BRACKET_ORNAMENT  U"\u2775"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_DIGIT_ONE  0x2776
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_ONE  L"\u2776"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_ONE  U"\u2776"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_DIGIT_TWO  0x2777
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_TWO  L"\u2777"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_TWO  U"\u2777"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_DIGIT_THREE  0x2778
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_THREE  L"\u2778"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_THREE  U"\u2778"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_DIGIT_FOUR  0x2779
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_FOUR  L"\u2779"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_FOUR  U"\u2779"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_DIGIT_FIVE  0x277a
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_FIVE  L"\u277a"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_FIVE  U"\u277a"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_DIGIT_SIX  0x277b
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_SIX  L"\u277b"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_SIX  U"\u277b"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_DIGIT_SEVEN  0x277c
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_SEVEN  L"\u277c"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_SEVEN  U"\u277c"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_DIGIT_EIGHT  0x277d
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_EIGHT  L"\u277d"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_EIGHT  U"\u277d"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_DIGIT_NINE  0x277e
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_NINE  L"\u277e"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_DIGIT_NINE  U"\u277e"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_NUMBER_TEN  0x277f
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_NUMBER_TEN  L"\u277f"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_NUMBER_TEN  U"\u277f"
 #define UNICODE_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_ONE  0x2780
-#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_ONE  L"\u2780"
+#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_ONE  U"\u2780"
 #define UNICODE_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_TWO  0x2781
-#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_TWO  L"\u2781"
+#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_TWO  U"\u2781"
 #define UNICODE_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_THREE  0x2782
-#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_THREE  L"\u2782"
+#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_THREE  U"\u2782"
 #define UNICODE_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_FOUR  0x2783
-#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_FOUR  L"\u2783"
+#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_FOUR  U"\u2783"
 #define UNICODE_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_FIVE  0x2784
-#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_FIVE  L"\u2784"
+#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_FIVE  U"\u2784"
 #define UNICODE_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_SIX  0x2785
-#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_SIX  L"\u2785"
+#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_SIX  U"\u2785"
 #define UNICODE_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_SEVEN  0x2786
-#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_SEVEN  L"\u2786"
+#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_SEVEN  U"\u2786"
 #define UNICODE_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_EIGHT  0x2787
-#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_EIGHT  L"\u2787"
+#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_EIGHT  U"\u2787"
 #define UNICODE_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_NINE  0x2788
-#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_NINE  L"\u2788"
+#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_DIGIT_NINE  U"\u2788"
 #define UNICODE_DINGBAT_CIRCLED_SANS_SERIF_NUMBER_TEN  0x2789
-#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_NUMBER_TEN  L"\u2789"
+#define UNITEXT_DINGBAT_CIRCLED_SANS_SERIF_NUMBER_TEN  U"\u2789"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_ONE  0x278a
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_ONE  L"\u278a"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_ONE  U"\u278a"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_TWO  0x278b
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_TWO  L"\u278b"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_TWO  U"\u278b"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_THREE  0x278c
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_THREE  L"\u278c"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_THREE  U"\u278c"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_FOUR  0x278d
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_FOUR  L"\u278d"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_FOUR  U"\u278d"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_FIVE  0x278e
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_FIVE  L"\u278e"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_FIVE  U"\u278e"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_SIX  0x278f
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_SIX  L"\u278f"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_SIX  U"\u278f"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_SEVEN  0x2790
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_SEVEN  L"\u2790"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_SEVEN  U"\u2790"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_EIGHT  0x2791
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_EIGHT  L"\u2791"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_EIGHT  U"\u2791"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_NINE  0x2792
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_NINE  L"\u2792"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_DIGIT_NINE  U"\u2792"
 #define UNICODE_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_NUMBER_TEN  0x2793
-#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_NUMBER_TEN  L"\u2793"
+#define UNITEXT_DINGBAT_NEGATIVE_CIRCLED_SANS_SERIF_NUMBER_TEN  U"\u2793"
 #define UNICODE_HEAVY_WIDE_HEADED_RIGHTWARDS_ARROW  0x2794
-#define UNITEXT_HEAVY_WIDE_HEADED_RIGHTWARDS_ARROW  L"\u2794"
+#define UNITEXT_HEAVY_WIDE_HEADED_RIGHTWARDS_ARROW  U"\u2794"
 #define UNICODE_HEAVY_SOUTH_EAST_ARROW  0x2798
-#define UNITEXT_HEAVY_SOUTH_EAST_ARROW  L"\u2798"
+#define UNITEXT_HEAVY_SOUTH_EAST_ARROW  U"\u2798"
 #define UNICODE_HEAVY_RIGHTWARDS_ARROW  0x2799
-#define UNITEXT_HEAVY_RIGHTWARDS_ARROW  L"\u2799"
+#define UNITEXT_HEAVY_RIGHTWARDS_ARROW  U"\u2799"
 #define UNICODE_HEAVY_NORTH_EAST_ARROW  0x279a
-#define UNITEXT_HEAVY_NORTH_EAST_ARROW  L"\u279a"
+#define UNITEXT_HEAVY_NORTH_EAST_ARROW  U"\u279a"
 #define UNICODE_DRAFTING_POINT_RIGHTWARDS_ARROW  0x279b
-#define UNITEXT_DRAFTING_POINT_RIGHTWARDS_ARROW  L"\u279b"
+#define UNITEXT_DRAFTING_POINT_RIGHTWARDS_ARROW  U"\u279b"
 #define UNICODE_HEAVY_ROUND_TIPPED_RIGHTWARDS_ARROW  0x279c
-#define UNITEXT_HEAVY_ROUND_TIPPED_RIGHTWARDS_ARROW  L"\u279c"
+#define UNITEXT_HEAVY_ROUND_TIPPED_RIGHTWARDS_ARROW  U"\u279c"
 #define UNICODE_TRIANGLE_HEADED_RIGHTWARDS_ARROW  0x279d
-#define UNITEXT_TRIANGLE_HEADED_RIGHTWARDS_ARROW  L"\u279d"
+#define UNITEXT_TRIANGLE_HEADED_RIGHTWARDS_ARROW  U"\u279d"
 #define UNICODE_HEAVY_TRIANGLE_HEADED_RIGHTWARDS_ARROW  0x279e
-#define UNITEXT_HEAVY_TRIANGLE_HEADED_RIGHTWARDS_ARROW  L"\u279e"
+#define UNITEXT_HEAVY_TRIANGLE_HEADED_RIGHTWARDS_ARROW  U"\u279e"
 #define UNICODE_DASHED_TRIANGLE_HEADED_RIGHTWARDS_ARROW  0x279f
-#define UNITEXT_DASHED_TRIANGLE_HEADED_RIGHTWARDS_ARROW  L"\u279f"
+#define UNITEXT_DASHED_TRIANGLE_HEADED_RIGHTWARDS_ARROW  U"\u279f"
 #define UNICODE_HEAVY_DASHED_TRIANGLE_HEADED_RIGHTWARDS_ARROW  0x27a0
-#define UNITEXT_HEAVY_DASHED_TRIANGLE_HEADED_RIGHTWARDS_ARROW  L"\u27a0"
+#define UNITEXT_HEAVY_DASHED_TRIANGLE_HEADED_RIGHTWARDS_ARROW  U"\u27a0"
 #define UNICODE_BLACK_RIGHTWARDS_ARROW  0x27a1
-#define UNITEXT_BLACK_RIGHTWARDS_ARROW  L"\u27a1"
+#define UNITEXT_BLACK_RIGHTWARDS_ARROW  U"\u27a1"
 #define UNICODE_THREE_D_TOP_LIGHTED_RIGHTWARDS_ARROWHEAD  0x27a2
-#define UNITEXT_THREE_D_TOP_LIGHTED_RIGHTWARDS_ARROWHEAD  L"\u27a2"
+#define UNITEXT_THREE_D_TOP_LIGHTED_RIGHTWARDS_ARROWHEAD  U"\u27a2"
 #define UNICODE_THREE_D_BOTTOM_LIGHTED_RIGHTWARDS_ARROWHEAD  0x27a3
-#define UNITEXT_THREE_D_BOTTOM_LIGHTED_RIGHTWARDS_ARROWHEAD  L"\u27a3"
+#define UNITEXT_THREE_D_BOTTOM_LIGHTED_RIGHTWARDS_ARROWHEAD  U"\u27a3"
 #define UNICODE_BLACK_RIGHTWARDS_ARROWHEAD  0x27a4
-#define UNITEXT_BLACK_RIGHTWARDS_ARROWHEAD  L"\u27a4"
+#define UNITEXT_BLACK_RIGHTWARDS_ARROWHEAD  U"\u27a4"
 #define UNICODE_HEAVY_BLACK_CURVED_DOWNWARDS_AND_RIGHTWARDS_ARROW  0x27a5
-#define UNITEXT_HEAVY_BLACK_CURVED_DOWNWARDS_AND_RIGHTWARDS_ARROW  L"\u27a5"
+#define UNITEXT_HEAVY_BLACK_CURVED_DOWNWARDS_AND_RIGHTWARDS_ARROW  U"\u27a5"
 #define UNICODE_HEAVY_BLACK_CURVED_UPWARDS_AND_RIGHTWARDS_ARROW  0x27a6
-#define UNITEXT_HEAVY_BLACK_CURVED_UPWARDS_AND_RIGHTWARDS_ARROW  L"\u27a6"
+#define UNITEXT_HEAVY_BLACK_CURVED_UPWARDS_AND_RIGHTWARDS_ARROW  U"\u27a6"
 #define UNICODE_SQUAT_BLACK_RIGHTWARDS_ARROW  0x27a7
-#define UNITEXT_SQUAT_BLACK_RIGHTWARDS_ARROW  L"\u27a7"
+#define UNITEXT_SQUAT_BLACK_RIGHTWARDS_ARROW  U"\u27a7"
 #define UNICODE_HEAVY_CONCAVE_POINTED_BLACK_RIGHTWARDS_ARROW  0x27a8
-#define UNITEXT_HEAVY_CONCAVE_POINTED_BLACK_RIGHTWARDS_ARROW  L"\u27a8"
+#define UNITEXT_HEAVY_CONCAVE_POINTED_BLACK_RIGHTWARDS_ARROW  U"\u27a8"
 #define UNICODE_RIGHT_SHADED_WHITE_RIGHTWARDS_ARROW  0x27a9
-#define UNITEXT_RIGHT_SHADED_WHITE_RIGHTWARDS_ARROW  L"\u27a9"
+#define UNITEXT_RIGHT_SHADED_WHITE_RIGHTWARDS_ARROW  U"\u27a9"
 #define UNICODE_LEFT_SHADED_WHITE_RIGHTWARDS_ARROW  0x27aa
-#define UNITEXT_LEFT_SHADED_WHITE_RIGHTWARDS_ARROW  L"\u27aa"
+#define UNITEXT_LEFT_SHADED_WHITE_RIGHTWARDS_ARROW  U"\u27aa"
 #define UNICODE_BACK_TILTED_SHADOWED_WHITE_RIGHTWARDS_ARROW  0x27ab
-#define UNITEXT_BACK_TILTED_SHADOWED_WHITE_RIGHTWARDS_ARROW  L"\u27ab"
+#define UNITEXT_BACK_TILTED_SHADOWED_WHITE_RIGHTWARDS_ARROW  U"\u27ab"
 #define UNICODE_FRONT_TILTED_SHADOWED_WHITE_RIGHTWARDS_ARROW  0x27ac
-#define UNITEXT_FRONT_TILTED_SHADOWED_WHITE_RIGHTWARDS_ARROW  L"\u27ac"
+#define UNITEXT_FRONT_TILTED_SHADOWED_WHITE_RIGHTWARDS_ARROW  U"\u27ac"
 #define UNICODE_HEAVY_LOWER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  0x27ad
-#define UNITEXT_HEAVY_LOWER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  L"\u27ad"
+#define UNITEXT_HEAVY_LOWER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  U"\u27ad"
 #define UNICODE_HEAVY_UPPER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  0x27ae
-#define UNITEXT_HEAVY_UPPER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  L"\u27ae"
+#define UNITEXT_HEAVY_UPPER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  U"\u27ae"
 #define UNICODE_NOTCHED_LOWER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  0x27af
-#define UNITEXT_NOTCHED_LOWER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  L"\u27af"
+#define UNITEXT_NOTCHED_LOWER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  U"\u27af"
 #define UNICODE_NOTCHED_UPPER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  0x27b1
-#define UNITEXT_NOTCHED_UPPER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  L"\u27b1"
+#define UNITEXT_NOTCHED_UPPER_RIGHT_SHADOWED_WHITE_RIGHTWARDS_ARROW  U"\u27b1"
 #define UNICODE_CIRCLED_HEAVY_WHITE_RIGHTWARDS_ARROW  0x27b2
-#define UNITEXT_CIRCLED_HEAVY_WHITE_RIGHTWARDS_ARROW  L"\u27b2"
+#define UNITEXT_CIRCLED_HEAVY_WHITE_RIGHTWARDS_ARROW  U"\u27b2"
 #define UNICODE_WHITE_FEATHERED_RIGHTWARDS_ARROW  0x27b3
-#define UNITEXT_WHITE_FEATHERED_RIGHTWARDS_ARROW  L"\u27b3"
+#define UNITEXT_WHITE_FEATHERED_RIGHTWARDS_ARROW  U"\u27b3"
 #define UNICODE_BLACK_FEATHERED_SOUTH_EAST_ARROW  0x27b4
-#define UNITEXT_BLACK_FEATHERED_SOUTH_EAST_ARROW  L"\u27b4"
+#define UNITEXT_BLACK_FEATHERED_SOUTH_EAST_ARROW  U"\u27b4"
 #define UNICODE_BLACK_FEATHERED_RIGHTWARDS_ARROW  0x27b5
-#define UNITEXT_BLACK_FEATHERED_RIGHTWARDS_ARROW  L"\u27b5"
+#define UNITEXT_BLACK_FEATHERED_RIGHTWARDS_ARROW  U"\u27b5"
 #define UNICODE_BLACK_FEATHERED_NORTH_EAST_ARROW  0x27b6
-#define UNITEXT_BLACK_FEATHERED_NORTH_EAST_ARROW  L"\u27b6"
+#define UNITEXT_BLACK_FEATHERED_NORTH_EAST_ARROW  U"\u27b6"
 #define UNICODE_HEAVY_BLACK_FEATHERED_SOUTH_EAST_ARROW  0x27b7
-#define UNITEXT_HEAVY_BLACK_FEATHERED_SOUTH_EAST_ARROW  L"\u27b7"
+#define UNITEXT_HEAVY_BLACK_FEATHERED_SOUTH_EAST_ARROW  U"\u27b7"
 #define UNICODE_HEAVY_BLACK_FEATHERED_RIGHTWARDS_ARROW  0x27b8
-#define UNITEXT_HEAVY_BLACK_FEATHERED_RIGHTWARDS_ARROW  L"\u27b8"
+#define UNITEXT_HEAVY_BLACK_FEATHERED_RIGHTWARDS_ARROW  U"\u27b8"
 #define UNICODE_HEAVY_BLACK_FEATHERED_NORTH_EAST_ARROW  0x27b9
-#define UNITEXT_HEAVY_BLACK_FEATHERED_NORTH_EAST_ARROW  L"\u27b9"
+#define UNITEXT_HEAVY_BLACK_FEATHERED_NORTH_EAST_ARROW  U"\u27b9"
 #define UNICODE_TEARDROP_BARBED_RIGHTWARDS_ARROW  0x27ba
-#define UNITEXT_TEARDROP_BARBED_RIGHTWARDS_ARROW  L"\u27ba"
+#define UNITEXT_TEARDROP_BARBED_RIGHTWARDS_ARROW  U"\u27ba"
 #define UNICODE_HEAVY_TEARDROP_SHANKED_RIGHTWARDS_ARROW  0x27bb
-#define UNITEXT_HEAVY_TEARDROP_SHANKED_RIGHTWARDS_ARROW  L"\u27bb"
+#define UNITEXT_HEAVY_TEARDROP_SHANKED_RIGHTWARDS_ARROW  U"\u27bb"
 #define UNICODE_WEDGE_TAILED_RIGHTWARDS_ARROW  0x27bc
-#define UNITEXT_WEDGE_TAILED_RIGHTWARDS_ARROW  L"\u27bc"
+#define UNITEXT_WEDGE_TAILED_RIGHTWARDS_ARROW  U"\u27bc"
 #define UNICODE_HEAVY_WEDGE_TAILED_RIGHTWARDS_ARROW  0x27bd
-#define UNITEXT_HEAVY_WEDGE_TAILED_RIGHTWARDS_ARROW  L"\u27bd"
+#define UNITEXT_HEAVY_WEDGE_TAILED_RIGHTWARDS_ARROW  U"\u27bd"
 #define UNICODE_OPEN_OUTLINED_RIGHTWARDS_ARROW  0x27be
-#define UNITEXT_OPEN_OUTLINED_RIGHTWARDS_ARROW  L"\u27be"
+#define UNITEXT_OPEN_OUTLINED_RIGHTWARDS_ARROW  U"\u27be"
 #define UNICODE_THREE_DIMENSIONAL_ANGLE  0x27c0
-#define UNITEXT_THREE_DIMENSIONAL_ANGLE  L"\u27c0"
+#define UNITEXT_THREE_DIMENSIONAL_ANGLE  U"\u27c0"
 #define UNICODE_WHITE_TRIANGLE_CONTAINING_SMALL_WHITE_TRIANGLE  0x27c1
-#define UNITEXT_WHITE_TRIANGLE_CONTAINING_SMALL_WHITE_TRIANGLE  L"\u27c1"
+#define UNITEXT_WHITE_TRIANGLE_CONTAINING_SMALL_WHITE_TRIANGLE  U"\u27c1"
 #define UNICODE_PERPENDICULAR  0x27c2
-#define UNITEXT_PERPENDICULAR  L"\u27c2"
+#define UNITEXT_PERPENDICULAR  U"\u27c2"
 #define UNICODE_OPEN_SUBSET  0x27c3
-#define UNITEXT_OPEN_SUBSET  L"\u27c3"
+#define UNITEXT_OPEN_SUBSET  U"\u27c3"
 #define UNICODE_OPEN_SUPERSET  0x27c4
-#define UNITEXT_OPEN_SUPERSET  L"\u27c4"
+#define UNITEXT_OPEN_SUPERSET  U"\u27c4"
 #define UNICODE_LEFT_S_SHAPED_BAG_DELIMITER  0x27c5
-#define UNITEXT_LEFT_S_SHAPED_BAG_DELIMITER  L"\u27c5"
+#define UNITEXT_LEFT_S_SHAPED_BAG_DELIMITER  U"\u27c5"
 #define UNICODE_RIGHT_S_SHAPED_BAG_DELIMITER  0x27c6
-#define UNITEXT_RIGHT_S_SHAPED_BAG_DELIMITER  L"\u27c6"
+#define UNITEXT_RIGHT_S_SHAPED_BAG_DELIMITER  U"\u27c6"
 #define UNICODE_OR_WITH_DOT_INSIDE  0x27c7
-#define UNITEXT_OR_WITH_DOT_INSIDE  L"\u27c7"
+#define UNITEXT_OR_WITH_DOT_INSIDE  U"\u27c7"
 #define UNICODE_REVERSE_SOLIDUS_PRECEDING_SUBSET  0x27c8
-#define UNITEXT_REVERSE_SOLIDUS_PRECEDING_SUBSET  L"\u27c8"
+#define UNITEXT_REVERSE_SOLIDUS_PRECEDING_SUBSET  U"\u27c8"
 #define UNICODE_SUPERSET_PRECEDING_SOLIDUS  0x27c9
-#define UNITEXT_SUPERSET_PRECEDING_SOLIDUS  L"\u27c9"
+#define UNITEXT_SUPERSET_PRECEDING_SOLIDUS  U"\u27c9"
 #define UNICODE_VERTICAL_BAR_WITH_HORIZONTAL_STROKE  0x27ca
-#define UNITEXT_VERTICAL_BAR_WITH_HORIZONTAL_STROKE  L"\u27ca"
+#define UNITEXT_VERTICAL_BAR_WITH_HORIZONTAL_STROKE  U"\u27ca"
 #define UNICODE_WHITE_DIAMOND_WITH_CENTRED_DOT  0x27d0
-#define UNITEXT_WHITE_DIAMOND_WITH_CENTRED_DOT  L"\u27d0"
+#define UNITEXT_WHITE_DIAMOND_WITH_CENTRED_DOT  U"\u27d0"
 #define UNICODE_AND_WITH_DOT  0x27d1
-#define UNITEXT_AND_WITH_DOT  L"\u27d1"
+#define UNITEXT_AND_WITH_DOT  U"\u27d1"
 #define UNICODE_ELEMENT_OF_OPENING_UPWARDS  0x27d2
-#define UNITEXT_ELEMENT_OF_OPENING_UPWARDS  L"\u27d2"
+#define UNITEXT_ELEMENT_OF_OPENING_UPWARDS  U"\u27d2"
 #define UNICODE_LOWER_RIGHT_CORNER_WITH_DOT  0x27d3
-#define UNITEXT_LOWER_RIGHT_CORNER_WITH_DOT  L"\u27d3"
+#define UNITEXT_LOWER_RIGHT_CORNER_WITH_DOT  U"\u27d3"
 #define UNICODE_UPPER_LEFT_CORNER_WITH_DOT  0x27d4
-#define UNITEXT_UPPER_LEFT_CORNER_WITH_DOT  L"\u27d4"
+#define UNITEXT_UPPER_LEFT_CORNER_WITH_DOT  U"\u27d4"
 #define UNICODE_LEFT_OUTER_JOIN  0x27d5
-#define UNITEXT_LEFT_OUTER_JOIN  L"\u27d5"
+#define UNITEXT_LEFT_OUTER_JOIN  U"\u27d5"
 #define UNICODE_RIGHT_OUTER_JOIN  0x27d6
-#define UNITEXT_RIGHT_OUTER_JOIN  L"\u27d6"
+#define UNITEXT_RIGHT_OUTER_JOIN  U"\u27d6"
 #define UNICODE_FULL_OUTER_JOIN  0x27d7
-#define UNITEXT_FULL_OUTER_JOIN  L"\u27d7"
+#define UNITEXT_FULL_OUTER_JOIN  U"\u27d7"
 #define UNICODE_LARGE_UP_TACK  0x27d8
-#define UNITEXT_LARGE_UP_TACK  L"\u27d8"
+#define UNITEXT_LARGE_UP_TACK  U"\u27d8"
 #define UNICODE_LARGE_DOWN_TACK  0x27d9
-#define UNITEXT_LARGE_DOWN_TACK  L"\u27d9"
+#define UNITEXT_LARGE_DOWN_TACK  U"\u27d9"
 #define UNICODE_LEFT_AND_RIGHT_DOUBLE_TURNSTILE  0x27da
-#define UNITEXT_LEFT_AND_RIGHT_DOUBLE_TURNSTILE  L"\u27da"
+#define UNITEXT_LEFT_AND_RIGHT_DOUBLE_TURNSTILE  U"\u27da"
 #define UNICODE_LEFT_AND_RIGHT_TACK  0x27db
-#define UNITEXT_LEFT_AND_RIGHT_TACK  L"\u27db"
+#define UNITEXT_LEFT_AND_RIGHT_TACK  U"\u27db"
 #define UNICODE_LEFT_MULTIMAP  0x27dc
-#define UNITEXT_LEFT_MULTIMAP  L"\u27dc"
+#define UNITEXT_LEFT_MULTIMAP  U"\u27dc"
 #define UNICODE_LONG_RIGHT_TACK  0x27dd
-#define UNITEXT_LONG_RIGHT_TACK  L"\u27dd"
+#define UNITEXT_LONG_RIGHT_TACK  U"\u27dd"
 #define UNICODE_LONG_LEFT_TACK  0x27de
-#define UNITEXT_LONG_LEFT_TACK  L"\u27de"
+#define UNITEXT_LONG_LEFT_TACK  U"\u27de"
 #define UNICODE_UP_TACK_WITH_CIRCLE_ABOVE  0x27df
-#define UNITEXT_UP_TACK_WITH_CIRCLE_ABOVE  L"\u27df"
+#define UNITEXT_UP_TACK_WITH_CIRCLE_ABOVE  U"\u27df"
 #define UNICODE_LOZENGE_DIVIDED_BY_HORIZONTAL_RULE  0x27e0
-#define UNITEXT_LOZENGE_DIVIDED_BY_HORIZONTAL_RULE  L"\u27e0"
+#define UNITEXT_LOZENGE_DIVIDED_BY_HORIZONTAL_RULE  U"\u27e0"
 #define UNICODE_WHITE_CONCAVE_SIDED_DIAMOND  0x27e1
-#define UNITEXT_WHITE_CONCAVE_SIDED_DIAMOND  L"\u27e1"
+#define UNITEXT_WHITE_CONCAVE_SIDED_DIAMOND  U"\u27e1"
 #define UNICODE_WHITE_CONCAVE_SIDED_DIAMOND_WITH_LEFTWARDS_TICK  0x27e2
-#define UNITEXT_WHITE_CONCAVE_SIDED_DIAMOND_WITH_LEFTWARDS_TICK  L"\u27e2"
+#define UNITEXT_WHITE_CONCAVE_SIDED_DIAMOND_WITH_LEFTWARDS_TICK  U"\u27e2"
 #define UNICODE_WHITE_CONCAVE_SIDED_DIAMOND_WITH_RIGHTWARDS_TICK  0x27e3
-#define UNITEXT_WHITE_CONCAVE_SIDED_DIAMOND_WITH_RIGHTWARDS_TICK  L"\u27e3"
+#define UNITEXT_WHITE_CONCAVE_SIDED_DIAMOND_WITH_RIGHTWARDS_TICK  U"\u27e3"
 #define UNICODE_WHITE_SQUARE_WITH_LEFTWARDS_TICK  0x27e4
-#define UNITEXT_WHITE_SQUARE_WITH_LEFTWARDS_TICK  L"\u27e4"
+#define UNITEXT_WHITE_SQUARE_WITH_LEFTWARDS_TICK  U"\u27e4"
 #define UNICODE_WHITE_SQUARE_WITH_RIGHTWARDS_TICK  0x27e5
-#define UNITEXT_WHITE_SQUARE_WITH_RIGHTWARDS_TICK  L"\u27e5"
+#define UNITEXT_WHITE_SQUARE_WITH_RIGHTWARDS_TICK  U"\u27e5"
 #define UNICODE_MATHEMATICAL_LEFT_WHITE_SQUARE_BRACKET  0x27e6
-#define UNITEXT_MATHEMATICAL_LEFT_WHITE_SQUARE_BRACKET  L"\u27e6"
+#define UNITEXT_MATHEMATICAL_LEFT_WHITE_SQUARE_BRACKET  U"\u27e6"
 #define UNICODE_MATHEMATICAL_RIGHT_WHITE_SQUARE_BRACKET  0x27e7
-#define UNITEXT_MATHEMATICAL_RIGHT_WHITE_SQUARE_BRACKET  L"\u27e7"
+#define UNITEXT_MATHEMATICAL_RIGHT_WHITE_SQUARE_BRACKET  U"\u27e7"
 #define UNICODE_MATHEMATICAL_LEFT_ANGLE_BRACKET  0x27e8
-#define UNITEXT_MATHEMATICAL_LEFT_ANGLE_BRACKET  L"\u27e8"
+#define UNITEXT_MATHEMATICAL_LEFT_ANGLE_BRACKET  U"\u27e8"
 #define UNICODE_MATHEMATICAL_RIGHT_ANGLE_BRACKET  0x27e9
-#define UNITEXT_MATHEMATICAL_RIGHT_ANGLE_BRACKET  L"\u27e9"
+#define UNITEXT_MATHEMATICAL_RIGHT_ANGLE_BRACKET  U"\u27e9"
 #define UNICODE_MATHEMATICAL_LEFT_DOUBLE_ANGLE_BRACKET  0x27ea
-#define UNITEXT_MATHEMATICAL_LEFT_DOUBLE_ANGLE_BRACKET  L"\u27ea"
+#define UNITEXT_MATHEMATICAL_LEFT_DOUBLE_ANGLE_BRACKET  U"\u27ea"
 #define UNICODE_MATHEMATICAL_RIGHT_DOUBLE_ANGLE_BRACKET  0x27eb
-#define UNITEXT_MATHEMATICAL_RIGHT_DOUBLE_ANGLE_BRACKET  L"\u27eb"
+#define UNITEXT_MATHEMATICAL_RIGHT_DOUBLE_ANGLE_BRACKET  U"\u27eb"
 #define UNICODE_UPWARDS_QUADRUPLE_ARROW  0x27f0
-#define UNITEXT_UPWARDS_QUADRUPLE_ARROW  L"\u27f0"
+#define UNITEXT_UPWARDS_QUADRUPLE_ARROW  U"\u27f0"
 #define UNICODE_DOWNWARDS_QUADRUPLE_ARROW  0x27f1
-#define UNITEXT_DOWNWARDS_QUADRUPLE_ARROW  L"\u27f1"
+#define UNITEXT_DOWNWARDS_QUADRUPLE_ARROW  U"\u27f1"
 #define UNICODE_ANTICLOCKWISE_GAPPED_CIRCLE_ARROW  0x27f2
-#define UNITEXT_ANTICLOCKWISE_GAPPED_CIRCLE_ARROW  L"\u27f2"
+#define UNITEXT_ANTICLOCKWISE_GAPPED_CIRCLE_ARROW  U"\u27f2"
 #define UNICODE_CLOCKWISE_GAPPED_CIRCLE_ARROW  0x27f3
-#define UNITEXT_CLOCKWISE_GAPPED_CIRCLE_ARROW  L"\u27f3"
+#define UNITEXT_CLOCKWISE_GAPPED_CIRCLE_ARROW  U"\u27f3"
 #define UNICODE_RIGHT_ARROW_WITH_CIRCLED_PLUS  0x27f4
-#define UNITEXT_RIGHT_ARROW_WITH_CIRCLED_PLUS  L"\u27f4"
+#define UNITEXT_RIGHT_ARROW_WITH_CIRCLED_PLUS  U"\u27f4"
 #define UNICODE_LONG_LEFTWARDS_ARROW  0x27f5
-#define UNITEXT_LONG_LEFTWARDS_ARROW  L"\u27f5"
+#define UNITEXT_LONG_LEFTWARDS_ARROW  U"\u27f5"
 #define UNICODE_LONG_RIGHTWARDS_ARROW  0x27f6
-#define UNITEXT_LONG_RIGHTWARDS_ARROW  L"\u27f6"
+#define UNITEXT_LONG_RIGHTWARDS_ARROW  U"\u27f6"
 #define UNICODE_LONG_LEFT_RIGHT_ARROW  0x27f7
-#define UNITEXT_LONG_LEFT_RIGHT_ARROW  L"\u27f7"
+#define UNITEXT_LONG_LEFT_RIGHT_ARROW  U"\u27f7"
 #define UNICODE_LONG_LEFTWARDS_DOUBLE_ARROW  0x27f8
-#define UNITEXT_LONG_LEFTWARDS_DOUBLE_ARROW  L"\u27f8"
+#define UNITEXT_LONG_LEFTWARDS_DOUBLE_ARROW  U"\u27f8"
 #define UNICODE_LONG_RIGHTWARDS_DOUBLE_ARROW  0x27f9
-#define UNITEXT_LONG_RIGHTWARDS_DOUBLE_ARROW  L"\u27f9"
+#define UNITEXT_LONG_RIGHTWARDS_DOUBLE_ARROW  U"\u27f9"
 #define UNICODE_LONG_LEFT_RIGHT_DOUBLE_ARROW  0x27fa
-#define UNITEXT_LONG_LEFT_RIGHT_DOUBLE_ARROW  L"\u27fa"
+#define UNITEXT_LONG_LEFT_RIGHT_DOUBLE_ARROW  U"\u27fa"
 #define UNICODE_LONG_LEFTWARDS_ARROW_FROM_BAR  0x27fb
-#define UNITEXT_LONG_LEFTWARDS_ARROW_FROM_BAR  L"\u27fb"
+#define UNITEXT_LONG_LEFTWARDS_ARROW_FROM_BAR  U"\u27fb"
 #define UNICODE_LONG_RIGHTWARDS_ARROW_FROM_BAR  0x27fc
-#define UNITEXT_LONG_RIGHTWARDS_ARROW_FROM_BAR  L"\u27fc"
+#define UNITEXT_LONG_RIGHTWARDS_ARROW_FROM_BAR  U"\u27fc"
 #define UNICODE_LONG_LEFTWARDS_DOUBLE_ARROW_FROM_BAR  0x27fd
-#define UNITEXT_LONG_LEFTWARDS_DOUBLE_ARROW_FROM_BAR  L"\u27fd"
+#define UNITEXT_LONG_LEFTWARDS_DOUBLE_ARROW_FROM_BAR  U"\u27fd"
 #define UNICODE_LONG_RIGHTWARDS_DOUBLE_ARROW_FROM_BAR  0x27fe
-#define UNITEXT_LONG_RIGHTWARDS_DOUBLE_ARROW_FROM_BAR  L"\u27fe"
+#define UNITEXT_LONG_RIGHTWARDS_DOUBLE_ARROW_FROM_BAR  U"\u27fe"
 #define UNICODE_LONG_RIGHTWARDS_SQUIGGLE_ARROW  0x27ff
-#define UNITEXT_LONG_RIGHTWARDS_SQUIGGLE_ARROW  L"\u27ff"
+#define UNITEXT_LONG_RIGHTWARDS_SQUIGGLE_ARROW  U"\u27ff"
 #define UNICODE_BRAILLE_PATTERN_BLANK  0x2800
-#define UNITEXT_BRAILLE_PATTERN_BLANK  L"\u2800"
+#define UNITEXT_BRAILLE_PATTERN_BLANK  U"\u2800"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1  0x2801
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1  L"\u2801"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1  U"\u2801"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2  0x2802
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2  L"\u2802"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2  U"\u2802"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12  0x2803
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12  L"\u2803"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12  U"\u2803"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3  0x2804
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3  L"\u2804"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3  U"\u2804"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13  0x2805
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13  L"\u2805"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13  U"\u2805"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23  0x2806
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23  L"\u2806"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23  U"\u2806"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123  0x2807
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123  L"\u2807"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123  U"\u2807"
 #define UNICODE_BRAILLE_PATTERN_DOTS_4  0x2808
-#define UNITEXT_BRAILLE_PATTERN_DOTS_4  L"\u2808"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_4  U"\u2808"
 #define UNICODE_BRAILLE_PATTERN_DOTS_14  0x2809
-#define UNITEXT_BRAILLE_PATTERN_DOTS_14  L"\u2809"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_14  U"\u2809"
 #define UNICODE_BRAILLE_PATTERN_DOTS_24  0x280a
-#define UNITEXT_BRAILLE_PATTERN_DOTS_24  L"\u280a"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_24  U"\u280a"
 #define UNICODE_BRAILLE_PATTERN_DOTS_124  0x280b
-#define UNITEXT_BRAILLE_PATTERN_DOTS_124  L"\u280b"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_124  U"\u280b"
 #define UNICODE_BRAILLE_PATTERN_DOTS_34  0x280c
-#define UNITEXT_BRAILLE_PATTERN_DOTS_34  L"\u280c"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_34  U"\u280c"
 #define UNICODE_BRAILLE_PATTERN_DOTS_134  0x280d
-#define UNITEXT_BRAILLE_PATTERN_DOTS_134  L"\u280d"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_134  U"\u280d"
 #define UNICODE_BRAILLE_PATTERN_DOTS_234  0x280e
-#define UNITEXT_BRAILLE_PATTERN_DOTS_234  L"\u280e"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_234  U"\u280e"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1234  0x280f
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1234  L"\u280f"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1234  U"\u280f"
 #define UNICODE_BRAILLE_PATTERN_DOTS_5  0x2810
-#define UNITEXT_BRAILLE_PATTERN_DOTS_5  L"\u2810"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_5  U"\u2810"
 #define UNICODE_BRAILLE_PATTERN_DOTS_15  0x2811
-#define UNITEXT_BRAILLE_PATTERN_DOTS_15  L"\u2811"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_15  U"\u2811"
 #define UNICODE_BRAILLE_PATTERN_DOTS_25  0x2812
-#define UNITEXT_BRAILLE_PATTERN_DOTS_25  L"\u2812"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_25  U"\u2812"
 #define UNICODE_BRAILLE_PATTERN_DOTS_125  0x2813
-#define UNITEXT_BRAILLE_PATTERN_DOTS_125  L"\u2813"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_125  U"\u2813"
 #define UNICODE_BRAILLE_PATTERN_DOTS_35  0x2814
-#define UNITEXT_BRAILLE_PATTERN_DOTS_35  L"\u2814"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_35  U"\u2814"
 #define UNICODE_BRAILLE_PATTERN_DOTS_135  0x2815
-#define UNITEXT_BRAILLE_PATTERN_DOTS_135  L"\u2815"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_135  U"\u2815"
 #define UNICODE_BRAILLE_PATTERN_DOTS_235  0x2816
-#define UNITEXT_BRAILLE_PATTERN_DOTS_235  L"\u2816"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_235  U"\u2816"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1235  0x2817
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1235  L"\u2817"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1235  U"\u2817"
 #define UNICODE_BRAILLE_PATTERN_DOTS_45  0x2818
-#define UNITEXT_BRAILLE_PATTERN_DOTS_45  L"\u2818"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_45  U"\u2818"
 #define UNICODE_BRAILLE_PATTERN_DOTS_145  0x2819
-#define UNITEXT_BRAILLE_PATTERN_DOTS_145  L"\u2819"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_145  U"\u2819"
 #define UNICODE_BRAILLE_PATTERN_DOTS_245  0x281a
-#define UNITEXT_BRAILLE_PATTERN_DOTS_245  L"\u281a"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_245  U"\u281a"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1245  0x281b
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1245  L"\u281b"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1245  U"\u281b"
 #define UNICODE_BRAILLE_PATTERN_DOTS_345  0x281c
-#define UNITEXT_BRAILLE_PATTERN_DOTS_345  L"\u281c"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_345  U"\u281c"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1345  0x281d
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1345  L"\u281d"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1345  U"\u281d"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2345  0x281e
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2345  L"\u281e"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2345  U"\u281e"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12345  0x281f
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12345  L"\u281f"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12345  U"\u281f"
 #define UNICODE_BRAILLE_PATTERN_DOTS_6  0x2820
-#define UNITEXT_BRAILLE_PATTERN_DOTS_6  L"\u2820"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_6  U"\u2820"
 #define UNICODE_BRAILLE_PATTERN_DOTS_16  0x2821
-#define UNITEXT_BRAILLE_PATTERN_DOTS_16  L"\u2821"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_16  U"\u2821"
 #define UNICODE_BRAILLE_PATTERN_DOTS_26  0x2822
-#define UNITEXT_BRAILLE_PATTERN_DOTS_26  L"\u2822"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_26  U"\u2822"
 #define UNICODE_BRAILLE_PATTERN_DOTS_126  0x2823
-#define UNITEXT_BRAILLE_PATTERN_DOTS_126  L"\u2823"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_126  U"\u2823"
 #define UNICODE_BRAILLE_PATTERN_DOTS_36  0x2824
-#define UNITEXT_BRAILLE_PATTERN_DOTS_36  L"\u2824"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_36  U"\u2824"
 #define UNICODE_BRAILLE_PATTERN_DOTS_136  0x2825
-#define UNITEXT_BRAILLE_PATTERN_DOTS_136  L"\u2825"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_136  U"\u2825"
 #define UNICODE_BRAILLE_PATTERN_DOTS_236  0x2826
-#define UNITEXT_BRAILLE_PATTERN_DOTS_236  L"\u2826"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_236  U"\u2826"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1236  0x2827
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1236  L"\u2827"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1236  U"\u2827"
 #define UNICODE_BRAILLE_PATTERN_DOTS_46  0x2828
-#define UNITEXT_BRAILLE_PATTERN_DOTS_46  L"\u2828"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_46  U"\u2828"
 #define UNICODE_BRAILLE_PATTERN_DOTS_146  0x2829
-#define UNITEXT_BRAILLE_PATTERN_DOTS_146  L"\u2829"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_146  U"\u2829"
 #define UNICODE_BRAILLE_PATTERN_DOTS_246  0x282a
-#define UNITEXT_BRAILLE_PATTERN_DOTS_246  L"\u282a"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_246  U"\u282a"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1246  0x282b
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1246  L"\u282b"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1246  U"\u282b"
 #define UNICODE_BRAILLE_PATTERN_DOTS_346  0x282c
-#define UNITEXT_BRAILLE_PATTERN_DOTS_346  L"\u282c"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_346  U"\u282c"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1346  0x282d
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1346  L"\u282d"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1346  U"\u282d"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2346  0x282e
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2346  L"\u282e"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2346  U"\u282e"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12346  0x282f
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12346  L"\u282f"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12346  U"\u282f"
 #define UNICODE_BRAILLE_PATTERN_DOTS_56  0x2830
-#define UNITEXT_BRAILLE_PATTERN_DOTS_56  L"\u2830"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_56  U"\u2830"
 #define UNICODE_BRAILLE_PATTERN_DOTS_156  0x2831
-#define UNITEXT_BRAILLE_PATTERN_DOTS_156  L"\u2831"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_156  U"\u2831"
 #define UNICODE_BRAILLE_PATTERN_DOTS_256  0x2832
-#define UNITEXT_BRAILLE_PATTERN_DOTS_256  L"\u2832"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_256  U"\u2832"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1256  0x2833
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1256  L"\u2833"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1256  U"\u2833"
 #define UNICODE_BRAILLE_PATTERN_DOTS_356  0x2834
-#define UNITEXT_BRAILLE_PATTERN_DOTS_356  L"\u2834"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_356  U"\u2834"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1356  0x2835
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1356  L"\u2835"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1356  U"\u2835"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2356  0x2836
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2356  L"\u2836"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2356  U"\u2836"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12356  0x2837
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12356  L"\u2837"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12356  U"\u2837"
 #define UNICODE_BRAILLE_PATTERN_DOTS_456  0x2838
-#define UNITEXT_BRAILLE_PATTERN_DOTS_456  L"\u2838"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_456  U"\u2838"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1456  0x2839
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1456  L"\u2839"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1456  U"\u2839"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2456  0x283a
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2456  L"\u283a"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2456  U"\u283a"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12456  0x283b
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12456  L"\u283b"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12456  U"\u283b"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3456  0x283c
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3456  L"\u283c"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3456  U"\u283c"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13456  0x283d
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13456  L"\u283d"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13456  U"\u283d"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23456  0x283e
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23456  L"\u283e"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23456  U"\u283e"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123456  0x283f
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123456  L"\u283f"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123456  U"\u283f"
 #define UNICODE_BRAILLE_PATTERN_DOTS_7  0x2840
-#define UNITEXT_BRAILLE_PATTERN_DOTS_7  L"\u2840"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_7  U"\u2840"
 #define UNICODE_BRAILLE_PATTERN_DOTS_17  0x2841
-#define UNITEXT_BRAILLE_PATTERN_DOTS_17  L"\u2841"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_17  U"\u2841"
 #define UNICODE_BRAILLE_PATTERN_DOTS_27  0x2842
-#define UNITEXT_BRAILLE_PATTERN_DOTS_27  L"\u2842"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_27  U"\u2842"
 #define UNICODE_BRAILLE_PATTERN_DOTS_127  0x2843
-#define UNITEXT_BRAILLE_PATTERN_DOTS_127  L"\u2843"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_127  U"\u2843"
 #define UNICODE_BRAILLE_PATTERN_DOTS_37  0x2844
-#define UNITEXT_BRAILLE_PATTERN_DOTS_37  L"\u2844"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_37  U"\u2844"
 #define UNICODE_BRAILLE_PATTERN_DOTS_137  0x2845
-#define UNITEXT_BRAILLE_PATTERN_DOTS_137  L"\u2845"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_137  U"\u2845"
 #define UNICODE_BRAILLE_PATTERN_DOTS_237  0x2846
-#define UNITEXT_BRAILLE_PATTERN_DOTS_237  L"\u2846"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_237  U"\u2846"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1237  0x2847
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1237  L"\u2847"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1237  U"\u2847"
 #define UNICODE_BRAILLE_PATTERN_DOTS_47  0x2848
-#define UNITEXT_BRAILLE_PATTERN_DOTS_47  L"\u2848"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_47  U"\u2848"
 #define UNICODE_BRAILLE_PATTERN_DOTS_147  0x2849
-#define UNITEXT_BRAILLE_PATTERN_DOTS_147  L"\u2849"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_147  U"\u2849"
 #define UNICODE_BRAILLE_PATTERN_DOTS_247  0x284a
-#define UNITEXT_BRAILLE_PATTERN_DOTS_247  L"\u284a"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_247  U"\u284a"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1247  0x284b
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1247  L"\u284b"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1247  U"\u284b"
 #define UNICODE_BRAILLE_PATTERN_DOTS_347  0x284c
-#define UNITEXT_BRAILLE_PATTERN_DOTS_347  L"\u284c"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_347  U"\u284c"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1347  0x284d
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1347  L"\u284d"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1347  U"\u284d"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2347  0x284e
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2347  L"\u284e"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2347  U"\u284e"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12347  0x284f
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12347  L"\u284f"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12347  U"\u284f"
 #define UNICODE_BRAILLE_PATTERN_DOTS_57  0x2850
-#define UNITEXT_BRAILLE_PATTERN_DOTS_57  L"\u2850"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_57  U"\u2850"
 #define UNICODE_BRAILLE_PATTERN_DOTS_157  0x2851
-#define UNITEXT_BRAILLE_PATTERN_DOTS_157  L"\u2851"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_157  U"\u2851"
 #define UNICODE_BRAILLE_PATTERN_DOTS_257  0x2852
-#define UNITEXT_BRAILLE_PATTERN_DOTS_257  L"\u2852"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_257  U"\u2852"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1257  0x2853
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1257  L"\u2853"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1257  U"\u2853"
 #define UNICODE_BRAILLE_PATTERN_DOTS_357  0x2854
-#define UNITEXT_BRAILLE_PATTERN_DOTS_357  L"\u2854"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_357  U"\u2854"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1357  0x2855
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1357  L"\u2855"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1357  U"\u2855"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2357  0x2856
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2357  L"\u2856"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2357  U"\u2856"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12357  0x2857
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12357  L"\u2857"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12357  U"\u2857"
 #define UNICODE_BRAILLE_PATTERN_DOTS_457  0x2858
-#define UNITEXT_BRAILLE_PATTERN_DOTS_457  L"\u2858"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_457  U"\u2858"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1457  0x2859
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1457  L"\u2859"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1457  U"\u2859"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2457  0x285a
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2457  L"\u285a"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2457  U"\u285a"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12457  0x285b
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12457  L"\u285b"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12457  U"\u285b"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3457  0x285c
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3457  L"\u285c"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3457  U"\u285c"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13457  0x285d
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13457  L"\u285d"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13457  U"\u285d"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23457  0x285e
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23457  L"\u285e"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23457  U"\u285e"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123457  0x285f
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123457  L"\u285f"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123457  U"\u285f"
 #define UNICODE_BRAILLE_PATTERN_DOTS_67  0x2860
-#define UNITEXT_BRAILLE_PATTERN_DOTS_67  L"\u2860"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_67  U"\u2860"
 #define UNICODE_BRAILLE_PATTERN_DOTS_167  0x2861
-#define UNITEXT_BRAILLE_PATTERN_DOTS_167  L"\u2861"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_167  U"\u2861"
 #define UNICODE_BRAILLE_PATTERN_DOTS_267  0x2862
-#define UNITEXT_BRAILLE_PATTERN_DOTS_267  L"\u2862"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_267  U"\u2862"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1267  0x2863
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1267  L"\u2863"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1267  U"\u2863"
 #define UNICODE_BRAILLE_PATTERN_DOTS_367  0x2864
-#define UNITEXT_BRAILLE_PATTERN_DOTS_367  L"\u2864"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_367  U"\u2864"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1367  0x2865
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1367  L"\u2865"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1367  U"\u2865"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2367  0x2866
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2367  L"\u2866"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2367  U"\u2866"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12367  0x2867
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12367  L"\u2867"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12367  U"\u2867"
 #define UNICODE_BRAILLE_PATTERN_DOTS_467  0x2868
-#define UNITEXT_BRAILLE_PATTERN_DOTS_467  L"\u2868"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_467  U"\u2868"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1467  0x2869
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1467  L"\u2869"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1467  U"\u2869"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2467  0x286a
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2467  L"\u286a"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2467  U"\u286a"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12467  0x286b
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12467  L"\u286b"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12467  U"\u286b"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3467  0x286c
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3467  L"\u286c"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3467  U"\u286c"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13467  0x286d
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13467  L"\u286d"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13467  U"\u286d"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23467  0x286e
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23467  L"\u286e"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23467  U"\u286e"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123467  0x286f
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123467  L"\u286f"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123467  U"\u286f"
 #define UNICODE_BRAILLE_PATTERN_DOTS_567  0x2870
-#define UNITEXT_BRAILLE_PATTERN_DOTS_567  L"\u2870"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_567  U"\u2870"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1567  0x2871
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1567  L"\u2871"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1567  U"\u2871"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2567  0x2872
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2567  L"\u2872"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2567  U"\u2872"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12567  0x2873
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12567  L"\u2873"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12567  U"\u2873"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3567  0x2874
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3567  L"\u2874"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3567  U"\u2874"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13567  0x2875
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13567  L"\u2875"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13567  U"\u2875"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23567  0x2876
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23567  L"\u2876"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23567  U"\u2876"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123567  0x2877
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123567  L"\u2877"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123567  U"\u2877"
 #define UNICODE_BRAILLE_PATTERN_DOTS_4567  0x2878
-#define UNITEXT_BRAILLE_PATTERN_DOTS_4567  L"\u2878"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_4567  U"\u2878"
 #define UNICODE_BRAILLE_PATTERN_DOTS_14567  0x2879
-#define UNITEXT_BRAILLE_PATTERN_DOTS_14567  L"\u2879"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_14567  U"\u2879"
 #define UNICODE_BRAILLE_PATTERN_DOTS_24567  0x287a
-#define UNITEXT_BRAILLE_PATTERN_DOTS_24567  L"\u287a"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_24567  U"\u287a"
 #define UNICODE_BRAILLE_PATTERN_DOTS_124567  0x287b
-#define UNITEXT_BRAILLE_PATTERN_DOTS_124567  L"\u287b"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_124567  U"\u287b"
 #define UNICODE_BRAILLE_PATTERN_DOTS_34567  0x287c
-#define UNITEXT_BRAILLE_PATTERN_DOTS_34567  L"\u287c"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_34567  U"\u287c"
 #define UNICODE_BRAILLE_PATTERN_DOTS_134567  0x287d
-#define UNITEXT_BRAILLE_PATTERN_DOTS_134567  L"\u287d"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_134567  U"\u287d"
 #define UNICODE_BRAILLE_PATTERN_DOTS_234567  0x287e
-#define UNITEXT_BRAILLE_PATTERN_DOTS_234567  L"\u287e"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_234567  U"\u287e"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1234567  0x287f
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1234567  L"\u287f"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1234567  U"\u287f"
 #define UNICODE_BRAILLE_PATTERN_DOTS_8  0x2880
-#define UNITEXT_BRAILLE_PATTERN_DOTS_8  L"\u2880"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_8  U"\u2880"
 #define UNICODE_BRAILLE_PATTERN_DOTS_18  0x2881
-#define UNITEXT_BRAILLE_PATTERN_DOTS_18  L"\u2881"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_18  U"\u2881"
 #define UNICODE_BRAILLE_PATTERN_DOTS_28  0x2882
-#define UNITEXT_BRAILLE_PATTERN_DOTS_28  L"\u2882"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_28  U"\u2882"
 #define UNICODE_BRAILLE_PATTERN_DOTS_128  0x2883
-#define UNITEXT_BRAILLE_PATTERN_DOTS_128  L"\u2883"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_128  U"\u2883"
 #define UNICODE_BRAILLE_PATTERN_DOTS_38  0x2884
-#define UNITEXT_BRAILLE_PATTERN_DOTS_38  L"\u2884"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_38  U"\u2884"
 #define UNICODE_BRAILLE_PATTERN_DOTS_138  0x2885
-#define UNITEXT_BRAILLE_PATTERN_DOTS_138  L"\u2885"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_138  U"\u2885"
 #define UNICODE_BRAILLE_PATTERN_DOTS_238  0x2886
-#define UNITEXT_BRAILLE_PATTERN_DOTS_238  L"\u2886"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_238  U"\u2886"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1238  0x2887
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1238  L"\u2887"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1238  U"\u2887"
 #define UNICODE_BRAILLE_PATTERN_DOTS_48  0x2888
-#define UNITEXT_BRAILLE_PATTERN_DOTS_48  L"\u2888"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_48  U"\u2888"
 #define UNICODE_BRAILLE_PATTERN_DOTS_148  0x2889
-#define UNITEXT_BRAILLE_PATTERN_DOTS_148  L"\u2889"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_148  U"\u2889"
 #define UNICODE_BRAILLE_PATTERN_DOTS_248  0x288a
-#define UNITEXT_BRAILLE_PATTERN_DOTS_248  L"\u288a"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_248  U"\u288a"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1248  0x288b
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1248  L"\u288b"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1248  U"\u288b"
 #define UNICODE_BRAILLE_PATTERN_DOTS_348  0x288c
-#define UNITEXT_BRAILLE_PATTERN_DOTS_348  L"\u288c"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_348  U"\u288c"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1348  0x288d
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1348  L"\u288d"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1348  U"\u288d"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2348  0x288e
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2348  L"\u288e"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2348  U"\u288e"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12348  0x288f
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12348  L"\u288f"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12348  U"\u288f"
 #define UNICODE_BRAILLE_PATTERN_DOTS_58  0x2890
-#define UNITEXT_BRAILLE_PATTERN_DOTS_58  L"\u2890"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_58  U"\u2890"
 #define UNICODE_BRAILLE_PATTERN_DOTS_158  0x2891
-#define UNITEXT_BRAILLE_PATTERN_DOTS_158  L"\u2891"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_158  U"\u2891"
 #define UNICODE_BRAILLE_PATTERN_DOTS_258  0x2892
-#define UNITEXT_BRAILLE_PATTERN_DOTS_258  L"\u2892"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_258  U"\u2892"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1258  0x2893
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1258  L"\u2893"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1258  U"\u2893"
 #define UNICODE_BRAILLE_PATTERN_DOTS_358  0x2894
-#define UNITEXT_BRAILLE_PATTERN_DOTS_358  L"\u2894"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_358  U"\u2894"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1358  0x2895
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1358  L"\u2895"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1358  U"\u2895"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2358  0x2896
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2358  L"\u2896"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2358  U"\u2896"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12358  0x2897
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12358  L"\u2897"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12358  U"\u2897"
 #define UNICODE_BRAILLE_PATTERN_DOTS_458  0x2898
-#define UNITEXT_BRAILLE_PATTERN_DOTS_458  L"\u2898"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_458  U"\u2898"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1458  0x2899
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1458  L"\u2899"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1458  U"\u2899"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2458  0x289a
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2458  L"\u289a"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2458  U"\u289a"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12458  0x289b
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12458  L"\u289b"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12458  U"\u289b"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3458  0x289c
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3458  L"\u289c"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3458  U"\u289c"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13458  0x289d
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13458  L"\u289d"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13458  U"\u289d"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23458  0x289e
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23458  L"\u289e"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23458  U"\u289e"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123458  0x289f
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123458  L"\u289f"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123458  U"\u289f"
 #define UNICODE_BRAILLE_PATTERN_DOTS_68  0x28a0
-#define UNITEXT_BRAILLE_PATTERN_DOTS_68  L"\u28a0"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_68  U"\u28a0"
 #define UNICODE_BRAILLE_PATTERN_DOTS_168  0x28a1
-#define UNITEXT_BRAILLE_PATTERN_DOTS_168  L"\u28a1"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_168  U"\u28a1"
 #define UNICODE_BRAILLE_PATTERN_DOTS_268  0x28a2
-#define UNITEXT_BRAILLE_PATTERN_DOTS_268  L"\u28a2"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_268  U"\u28a2"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1268  0x28a3
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1268  L"\u28a3"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1268  U"\u28a3"
 #define UNICODE_BRAILLE_PATTERN_DOTS_368  0x28a4
-#define UNITEXT_BRAILLE_PATTERN_DOTS_368  L"\u28a4"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_368  U"\u28a4"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1368  0x28a5
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1368  L"\u28a5"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1368  U"\u28a5"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2368  0x28a6
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2368  L"\u28a6"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2368  U"\u28a6"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12368  0x28a7
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12368  L"\u28a7"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12368  U"\u28a7"
 #define UNICODE_BRAILLE_PATTERN_DOTS_468  0x28a8
-#define UNITEXT_BRAILLE_PATTERN_DOTS_468  L"\u28a8"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_468  U"\u28a8"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1468  0x28a9
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1468  L"\u28a9"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1468  U"\u28a9"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2468  0x28aa
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2468  L"\u28aa"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2468  U"\u28aa"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12468  0x28ab
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12468  L"\u28ab"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12468  U"\u28ab"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3468  0x28ac
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3468  L"\u28ac"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3468  U"\u28ac"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13468  0x28ad
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13468  L"\u28ad"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13468  U"\u28ad"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23468  0x28ae
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23468  L"\u28ae"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23468  U"\u28ae"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123468  0x28af
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123468  L"\u28af"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123468  U"\u28af"
 #define UNICODE_BRAILLE_PATTERN_DOTS_568  0x28b0
-#define UNITEXT_BRAILLE_PATTERN_DOTS_568  L"\u28b0"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_568  U"\u28b0"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1568  0x28b1
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1568  L"\u28b1"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1568  U"\u28b1"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2568  0x28b2
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2568  L"\u28b2"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2568  U"\u28b2"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12568  0x28b3
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12568  L"\u28b3"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12568  U"\u28b3"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3568  0x28b4
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3568  L"\u28b4"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3568  U"\u28b4"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13568  0x28b5
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13568  L"\u28b5"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13568  U"\u28b5"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23568  0x28b6
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23568  L"\u28b6"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23568  U"\u28b6"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123568  0x28b7
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123568  L"\u28b7"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123568  U"\u28b7"
 #define UNICODE_BRAILLE_PATTERN_DOTS_4568  0x28b8
-#define UNITEXT_BRAILLE_PATTERN_DOTS_4568  L"\u28b8"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_4568  U"\u28b8"
 #define UNICODE_BRAILLE_PATTERN_DOTS_14568  0x28b9
-#define UNITEXT_BRAILLE_PATTERN_DOTS_14568  L"\u28b9"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_14568  U"\u28b9"
 #define UNICODE_BRAILLE_PATTERN_DOTS_24568  0x28ba
-#define UNITEXT_BRAILLE_PATTERN_DOTS_24568  L"\u28ba"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_24568  U"\u28ba"
 #define UNICODE_BRAILLE_PATTERN_DOTS_124568  0x28bb
-#define UNITEXT_BRAILLE_PATTERN_DOTS_124568  L"\u28bb"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_124568  U"\u28bb"
 #define UNICODE_BRAILLE_PATTERN_DOTS_34568  0x28bc
-#define UNITEXT_BRAILLE_PATTERN_DOTS_34568  L"\u28bc"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_34568  U"\u28bc"
 #define UNICODE_BRAILLE_PATTERN_DOTS_134568  0x28bd
-#define UNITEXT_BRAILLE_PATTERN_DOTS_134568  L"\u28bd"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_134568  U"\u28bd"
 #define UNICODE_BRAILLE_PATTERN_DOTS_234568  0x28be
-#define UNITEXT_BRAILLE_PATTERN_DOTS_234568  L"\u28be"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_234568  U"\u28be"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1234568  0x28bf
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1234568  L"\u28bf"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1234568  U"\u28bf"
 #define UNICODE_BRAILLE_PATTERN_DOTS_78  0x28c0
-#define UNITEXT_BRAILLE_PATTERN_DOTS_78  L"\u28c0"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_78  U"\u28c0"
 #define UNICODE_BRAILLE_PATTERN_DOTS_178  0x28c1
-#define UNITEXT_BRAILLE_PATTERN_DOTS_178  L"\u28c1"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_178  U"\u28c1"
 #define UNICODE_BRAILLE_PATTERN_DOTS_278  0x28c2
-#define UNITEXT_BRAILLE_PATTERN_DOTS_278  L"\u28c2"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_278  U"\u28c2"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1278  0x28c3
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1278  L"\u28c3"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1278  U"\u28c3"
 #define UNICODE_BRAILLE_PATTERN_DOTS_378  0x28c4
-#define UNITEXT_BRAILLE_PATTERN_DOTS_378  L"\u28c4"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_378  U"\u28c4"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1378  0x28c5
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1378  L"\u28c5"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1378  U"\u28c5"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2378  0x28c6
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2378  L"\u28c6"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2378  U"\u28c6"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12378  0x28c7
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12378  L"\u28c7"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12378  U"\u28c7"
 #define UNICODE_BRAILLE_PATTERN_DOTS_478  0x28c8
-#define UNITEXT_BRAILLE_PATTERN_DOTS_478  L"\u28c8"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_478  U"\u28c8"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1478  0x28c9
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1478  L"\u28c9"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1478  U"\u28c9"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2478  0x28ca
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2478  L"\u28ca"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2478  U"\u28ca"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12478  0x28cb
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12478  L"\u28cb"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12478  U"\u28cb"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3478  0x28cc
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3478  L"\u28cc"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3478  U"\u28cc"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13478  0x28cd
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13478  L"\u28cd"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13478  U"\u28cd"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23478  0x28ce
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23478  L"\u28ce"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23478  U"\u28ce"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123478  0x28cf
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123478  L"\u28cf"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123478  U"\u28cf"
 #define UNICODE_BRAILLE_PATTERN_DOTS_578  0x28d0
-#define UNITEXT_BRAILLE_PATTERN_DOTS_578  L"\u28d0"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_578  U"\u28d0"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1578  0x28d1
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1578  L"\u28d1"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1578  U"\u28d1"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2578  0x28d2
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2578  L"\u28d2"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2578  U"\u28d2"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12578  0x28d3
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12578  L"\u28d3"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12578  U"\u28d3"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3578  0x28d4
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3578  L"\u28d4"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3578  U"\u28d4"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13578  0x28d5
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13578  L"\u28d5"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13578  U"\u28d5"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23578  0x28d6
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23578  L"\u28d6"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23578  U"\u28d6"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123578  0x28d7
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123578  L"\u28d7"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123578  U"\u28d7"
 #define UNICODE_BRAILLE_PATTERN_DOTS_4578  0x28d8
-#define UNITEXT_BRAILLE_PATTERN_DOTS_4578  L"\u28d8"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_4578  U"\u28d8"
 #define UNICODE_BRAILLE_PATTERN_DOTS_14578  0x28d9
-#define UNITEXT_BRAILLE_PATTERN_DOTS_14578  L"\u28d9"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_14578  U"\u28d9"
 #define UNICODE_BRAILLE_PATTERN_DOTS_24578  0x28da
-#define UNITEXT_BRAILLE_PATTERN_DOTS_24578  L"\u28da"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_24578  U"\u28da"
 #define UNICODE_BRAILLE_PATTERN_DOTS_124578  0x28db
-#define UNITEXT_BRAILLE_PATTERN_DOTS_124578  L"\u28db"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_124578  U"\u28db"
 #define UNICODE_BRAILLE_PATTERN_DOTS_34578  0x28dc
-#define UNITEXT_BRAILLE_PATTERN_DOTS_34578  L"\u28dc"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_34578  U"\u28dc"
 #define UNICODE_BRAILLE_PATTERN_DOTS_134578  0x28dd
-#define UNITEXT_BRAILLE_PATTERN_DOTS_134578  L"\u28dd"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_134578  U"\u28dd"
 #define UNICODE_BRAILLE_PATTERN_DOTS_234578  0x28de
-#define UNITEXT_BRAILLE_PATTERN_DOTS_234578  L"\u28de"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_234578  U"\u28de"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1234578  0x28df
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1234578  L"\u28df"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1234578  U"\u28df"
 #define UNICODE_BRAILLE_PATTERN_DOTS_678  0x28e0
-#define UNITEXT_BRAILLE_PATTERN_DOTS_678  L"\u28e0"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_678  U"\u28e0"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1678  0x28e1
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1678  L"\u28e1"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1678  U"\u28e1"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2678  0x28e2
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2678  L"\u28e2"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2678  U"\u28e2"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12678  0x28e3
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12678  L"\u28e3"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12678  U"\u28e3"
 #define UNICODE_BRAILLE_PATTERN_DOTS_3678  0x28e4
-#define UNITEXT_BRAILLE_PATTERN_DOTS_3678  L"\u28e4"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_3678  U"\u28e4"
 #define UNICODE_BRAILLE_PATTERN_DOTS_13678  0x28e5
-#define UNITEXT_BRAILLE_PATTERN_DOTS_13678  L"\u28e5"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_13678  U"\u28e5"
 #define UNICODE_BRAILLE_PATTERN_DOTS_23678  0x28e6
-#define UNITEXT_BRAILLE_PATTERN_DOTS_23678  L"\u28e6"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_23678  U"\u28e6"
 #define UNICODE_BRAILLE_PATTERN_DOTS_123678  0x28e7
-#define UNITEXT_BRAILLE_PATTERN_DOTS_123678  L"\u28e7"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_123678  U"\u28e7"
 #define UNICODE_BRAILLE_PATTERN_DOTS_4678  0x28e8
-#define UNITEXT_BRAILLE_PATTERN_DOTS_4678  L"\u28e8"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_4678  U"\u28e8"
 #define UNICODE_BRAILLE_PATTERN_DOTS_14678  0x28e9
-#define UNITEXT_BRAILLE_PATTERN_DOTS_14678  L"\u28e9"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_14678  U"\u28e9"
 #define UNICODE_BRAILLE_PATTERN_DOTS_24678  0x28ea
-#define UNITEXT_BRAILLE_PATTERN_DOTS_24678  L"\u28ea"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_24678  U"\u28ea"
 #define UNICODE_BRAILLE_PATTERN_DOTS_124678  0x28eb
-#define UNITEXT_BRAILLE_PATTERN_DOTS_124678  L"\u28eb"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_124678  U"\u28eb"
 #define UNICODE_BRAILLE_PATTERN_DOTS_34678  0x28ec
-#define UNITEXT_BRAILLE_PATTERN_DOTS_34678  L"\u28ec"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_34678  U"\u28ec"
 #define UNICODE_BRAILLE_PATTERN_DOTS_134678  0x28ed
-#define UNITEXT_BRAILLE_PATTERN_DOTS_134678  L"\u28ed"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_134678  U"\u28ed"
 #define UNICODE_BRAILLE_PATTERN_DOTS_234678  0x28ee
-#define UNITEXT_BRAILLE_PATTERN_DOTS_234678  L"\u28ee"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_234678  U"\u28ee"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1234678  0x28ef
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1234678  L"\u28ef"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1234678  U"\u28ef"
 #define UNICODE_BRAILLE_PATTERN_DOTS_5678  0x28f0
-#define UNITEXT_BRAILLE_PATTERN_DOTS_5678  L"\u28f0"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_5678  U"\u28f0"
 #define UNICODE_BRAILLE_PATTERN_DOTS_15678  0x28f1
-#define UNITEXT_BRAILLE_PATTERN_DOTS_15678  L"\u28f1"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_15678  U"\u28f1"
 #define UNICODE_BRAILLE_PATTERN_DOTS_25678  0x28f2
-#define UNITEXT_BRAILLE_PATTERN_DOTS_25678  L"\u28f2"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_25678  U"\u28f2"
 #define UNICODE_BRAILLE_PATTERN_DOTS_125678  0x28f3
-#define UNITEXT_BRAILLE_PATTERN_DOTS_125678  L"\u28f3"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_125678  U"\u28f3"
 #define UNICODE_BRAILLE_PATTERN_DOTS_35678  0x28f4
-#define UNITEXT_BRAILLE_PATTERN_DOTS_35678  L"\u28f4"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_35678  U"\u28f4"
 #define UNICODE_BRAILLE_PATTERN_DOTS_135678  0x28f5
-#define UNITEXT_BRAILLE_PATTERN_DOTS_135678  L"\u28f5"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_135678  U"\u28f5"
 #define UNICODE_BRAILLE_PATTERN_DOTS_235678  0x28f6
-#define UNITEXT_BRAILLE_PATTERN_DOTS_235678  L"\u28f6"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_235678  U"\u28f6"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1235678  0x28f7
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1235678  L"\u28f7"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1235678  U"\u28f7"
 #define UNICODE_BRAILLE_PATTERN_DOTS_45678  0x28f8
-#define UNITEXT_BRAILLE_PATTERN_DOTS_45678  L"\u28f8"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_45678  U"\u28f8"
 #define UNICODE_BRAILLE_PATTERN_DOTS_145678  0x28f9
-#define UNITEXT_BRAILLE_PATTERN_DOTS_145678  L"\u28f9"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_145678  U"\u28f9"
 #define UNICODE_BRAILLE_PATTERN_DOTS_245678  0x28fa
-#define UNITEXT_BRAILLE_PATTERN_DOTS_245678  L"\u28fa"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_245678  U"\u28fa"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1245678  0x28fb
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1245678  L"\u28fb"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1245678  U"\u28fb"
 #define UNICODE_BRAILLE_PATTERN_DOTS_345678  0x28fc
-#define UNITEXT_BRAILLE_PATTERN_DOTS_345678  L"\u28fc"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_345678  U"\u28fc"
 #define UNICODE_BRAILLE_PATTERN_DOTS_1345678  0x28fd
-#define UNITEXT_BRAILLE_PATTERN_DOTS_1345678  L"\u28fd"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_1345678  U"\u28fd"
 #define UNICODE_BRAILLE_PATTERN_DOTS_2345678  0x28fe
-#define UNITEXT_BRAILLE_PATTERN_DOTS_2345678  L"\u28fe"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_2345678  U"\u28fe"
 #define UNICODE_BRAILLE_PATTERN_DOTS_12345678  0x28ff
-#define UNITEXT_BRAILLE_PATTERN_DOTS_12345678  L"\u28ff"
+#define UNITEXT_BRAILLE_PATTERN_DOTS_12345678  U"\u28ff"
 #define UNICODE_RIGHTWARDS_TWO_HEADED_ARROW_WITH_VERTICAL_STROKE  0x2900
-#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_WITH_VERTICAL_STROKE  L"\u2900"
+#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_WITH_VERTICAL_STROKE  U"\u2900"
 #define UNICODE_RIGHTWARDS_TWO_HEADED_ARROW_WITH_DOUBLE_VERTICAL_STROKE  0x2901
-#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_WITH_DOUBLE_VERTICAL_STROKE  L"\u2901"
+#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_WITH_DOUBLE_VERTICAL_STROKE  U"\u2901"
 #define UNICODE_LEFTWARDS_DOUBLE_ARROW_WITH_VERTICAL_STROKE  0x2902
-#define UNITEXT_LEFTWARDS_DOUBLE_ARROW_WITH_VERTICAL_STROKE  L"\u2902"
+#define UNITEXT_LEFTWARDS_DOUBLE_ARROW_WITH_VERTICAL_STROKE  U"\u2902"
 #define UNICODE_RIGHTWARDS_DOUBLE_ARROW_WITH_VERTICAL_STROKE  0x2903
-#define UNITEXT_RIGHTWARDS_DOUBLE_ARROW_WITH_VERTICAL_STROKE  L"\u2903"
+#define UNITEXT_RIGHTWARDS_DOUBLE_ARROW_WITH_VERTICAL_STROKE  U"\u2903"
 #define UNICODE_LEFT_RIGHT_DOUBLE_ARROW_WITH_VERTICAL_STROKE  0x2904
-#define UNITEXT_LEFT_RIGHT_DOUBLE_ARROW_WITH_VERTICAL_STROKE  L"\u2904"
+#define UNITEXT_LEFT_RIGHT_DOUBLE_ARROW_WITH_VERTICAL_STROKE  U"\u2904"
 #define UNICODE_RIGHTWARDS_TWO_HEADED_ARROW_FROM_BAR  0x2905
-#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_FROM_BAR  L"\u2905"
+#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_FROM_BAR  U"\u2905"
 #define UNICODE_LEFTWARDS_DOUBLE_ARROW_FROM_BAR  0x2906
-#define UNITEXT_LEFTWARDS_DOUBLE_ARROW_FROM_BAR  L"\u2906"
+#define UNITEXT_LEFTWARDS_DOUBLE_ARROW_FROM_BAR  U"\u2906"
 #define UNICODE_RIGHTWARDS_DOUBLE_ARROW_FROM_BAR  0x2907
-#define UNITEXT_RIGHTWARDS_DOUBLE_ARROW_FROM_BAR  L"\u2907"
+#define UNITEXT_RIGHTWARDS_DOUBLE_ARROW_FROM_BAR  U"\u2907"
 #define UNICODE_DOWNWARDS_ARROW_WITH_HORIZONTAL_STROKE  0x2908
-#define UNITEXT_DOWNWARDS_ARROW_WITH_HORIZONTAL_STROKE  L"\u2908"
+#define UNITEXT_DOWNWARDS_ARROW_WITH_HORIZONTAL_STROKE  U"\u2908"
 #define UNICODE_UPWARDS_ARROW_WITH_HORIZONTAL_STROKE  0x2909
-#define UNITEXT_UPWARDS_ARROW_WITH_HORIZONTAL_STROKE  L"\u2909"
+#define UNITEXT_UPWARDS_ARROW_WITH_HORIZONTAL_STROKE  U"\u2909"
 #define UNICODE_UPWARDS_TRIPLE_ARROW  0x290a
-#define UNITEXT_UPWARDS_TRIPLE_ARROW  L"\u290a"
+#define UNITEXT_UPWARDS_TRIPLE_ARROW  U"\u290a"
 #define UNICODE_DOWNWARDS_TRIPLE_ARROW  0x290b
-#define UNITEXT_DOWNWARDS_TRIPLE_ARROW  L"\u290b"
+#define UNITEXT_DOWNWARDS_TRIPLE_ARROW  U"\u290b"
 #define UNICODE_LEFTWARDS_DOUBLE_DASH_ARROW  0x290c
-#define UNITEXT_LEFTWARDS_DOUBLE_DASH_ARROW  L"\u290c"
+#define UNITEXT_LEFTWARDS_DOUBLE_DASH_ARROW  U"\u290c"
 #define UNICODE_RIGHTWARDS_DOUBLE_DASH_ARROW  0x290d
-#define UNITEXT_RIGHTWARDS_DOUBLE_DASH_ARROW  L"\u290d"
+#define UNITEXT_RIGHTWARDS_DOUBLE_DASH_ARROW  U"\u290d"
 #define UNICODE_LEFTWARDS_TRIPLE_DASH_ARROW  0x290e
-#define UNITEXT_LEFTWARDS_TRIPLE_DASH_ARROW  L"\u290e"
+#define UNITEXT_LEFTWARDS_TRIPLE_DASH_ARROW  U"\u290e"
 #define UNICODE_RIGHTWARDS_TRIPLE_DASH_ARROW  0x290f
-#define UNITEXT_RIGHTWARDS_TRIPLE_DASH_ARROW  L"\u290f"
+#define UNITEXT_RIGHTWARDS_TRIPLE_DASH_ARROW  U"\u290f"
 #define UNICODE_RIGHTWARDS_TWO_HEADED_TRIPLE_DASH_ARROW  0x2910
-#define UNITEXT_RIGHTWARDS_TWO_HEADED_TRIPLE_DASH_ARROW  L"\u2910"
+#define UNITEXT_RIGHTWARDS_TWO_HEADED_TRIPLE_DASH_ARROW  U"\u2910"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_DOTTED_STEM  0x2911
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_DOTTED_STEM  L"\u2911"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_DOTTED_STEM  U"\u2911"
 #define UNICODE_UPWARDS_ARROW_TO_BAR  0x2912
-#define UNITEXT_UPWARDS_ARROW_TO_BAR  L"\u2912"
+#define UNITEXT_UPWARDS_ARROW_TO_BAR  U"\u2912"
 #define UNICODE_DOWNWARDS_ARROW_TO_BAR  0x2913
-#define UNITEXT_DOWNWARDS_ARROW_TO_BAR  L"\u2913"
+#define UNITEXT_DOWNWARDS_ARROW_TO_BAR  U"\u2913"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_TAIL_WITH_VERTICAL_STROKE  0x2914
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_TAIL_WITH_VERTICAL_STROKE  L"\u2914"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_TAIL_WITH_VERTICAL_STROKE  U"\u2914"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_TAIL_WITH_DOUBLE_VERTICAL_STROKE  0x2915
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_TAIL_WITH_DOUBLE_VERTICAL_STROKE  L"\u2915"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_TAIL_WITH_DOUBLE_VERTICAL_STROKE  U"\u2915"
 #define UNICODE_RIGHTWARDS_TWO_HEADED_ARROW_WITH_TAIL  0x2916
-#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_WITH_TAIL  L"\u2916"
+#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_WITH_TAIL  U"\u2916"
 #define UNICODE_RIGHTWARDS_TWO_HEADED_ARROW_WITH_TAIL_WITH_VERTICAL_STROKE  0x2917
-#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_WITH_TAIL_WITH_VERTICAL_STROKE  L"\u2917"
+#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_WITH_TAIL_WITH_VERTICAL_STROKE  U"\u2917"
 #define UNICODE_RIGHTWARDS_TWO_HEADED_ARROW_WITH_TAIL_WITH_DOUBLE_VERTICAL_STROKE  0x2918
-#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_WITH_TAIL_WITH_DOUBLE_VERTICAL_STROKE  L"\u2918"
+#define UNITEXT_RIGHTWARDS_TWO_HEADED_ARROW_WITH_TAIL_WITH_DOUBLE_VERTICAL_STROKE  U"\u2918"
 #define UNICODE_LEFTWARDS_ARROW_TAIL  0x2919
-#define UNITEXT_LEFTWARDS_ARROW_TAIL  L"\u2919"
+#define UNITEXT_LEFTWARDS_ARROW_TAIL  U"\u2919"
 #define UNICODE_RIGHTWARDS_ARROW_TAIL  0x291a
-#define UNITEXT_RIGHTWARDS_ARROW_TAIL  L"\u291a"
+#define UNITEXT_RIGHTWARDS_ARROW_TAIL  U"\u291a"
 #define UNICODE_LEFTWARDS_DOUBLE_ARROW_TAIL  0x291b
-#define UNITEXT_LEFTWARDS_DOUBLE_ARROW_TAIL  L"\u291b"
+#define UNITEXT_LEFTWARDS_DOUBLE_ARROW_TAIL  U"\u291b"
 #define UNICODE_RIGHTWARDS_DOUBLE_ARROW_TAIL  0x291c
-#define UNITEXT_RIGHTWARDS_DOUBLE_ARROW_TAIL  L"\u291c"
+#define UNITEXT_RIGHTWARDS_DOUBLE_ARROW_TAIL  U"\u291c"
 #define UNICODE_LEFTWARDS_ARROW_TO_BLACK_DIAMOND  0x291d
-#define UNITEXT_LEFTWARDS_ARROW_TO_BLACK_DIAMOND  L"\u291d"
+#define UNITEXT_LEFTWARDS_ARROW_TO_BLACK_DIAMOND  U"\u291d"
 #define UNICODE_RIGHTWARDS_ARROW_TO_BLACK_DIAMOND  0x291e
-#define UNITEXT_RIGHTWARDS_ARROW_TO_BLACK_DIAMOND  L"\u291e"
+#define UNITEXT_RIGHTWARDS_ARROW_TO_BLACK_DIAMOND  U"\u291e"
 #define UNICODE_LEFTWARDS_ARROW_FROM_BAR_TO_BLACK_DIAMOND  0x291f
-#define UNITEXT_LEFTWARDS_ARROW_FROM_BAR_TO_BLACK_DIAMOND  L"\u291f"
+#define UNITEXT_LEFTWARDS_ARROW_FROM_BAR_TO_BLACK_DIAMOND  U"\u291f"
 #define UNICODE_RIGHTWARDS_ARROW_FROM_BAR_TO_BLACK_DIAMOND  0x2920
-#define UNITEXT_RIGHTWARDS_ARROW_FROM_BAR_TO_BLACK_DIAMOND  L"\u2920"
+#define UNITEXT_RIGHTWARDS_ARROW_FROM_BAR_TO_BLACK_DIAMOND  U"\u2920"
 #define UNICODE_NORTH_WEST_AND_SOUTH_EAST_ARROW  0x2921
-#define UNITEXT_NORTH_WEST_AND_SOUTH_EAST_ARROW  L"\u2921"
+#define UNITEXT_NORTH_WEST_AND_SOUTH_EAST_ARROW  U"\u2921"
 #define UNICODE_NORTH_EAST_AND_SOUTH_WEST_ARROW  0x2922
-#define UNITEXT_NORTH_EAST_AND_SOUTH_WEST_ARROW  L"\u2922"
+#define UNITEXT_NORTH_EAST_AND_SOUTH_WEST_ARROW  U"\u2922"
 #define UNICODE_NORTH_WEST_ARROW_WITH_HOOK  0x2923
-#define UNITEXT_NORTH_WEST_ARROW_WITH_HOOK  L"\u2923"
+#define UNITEXT_NORTH_WEST_ARROW_WITH_HOOK  U"\u2923"
 #define UNICODE_NORTH_EAST_ARROW_WITH_HOOK  0x2924
-#define UNITEXT_NORTH_EAST_ARROW_WITH_HOOK  L"\u2924"
+#define UNITEXT_NORTH_EAST_ARROW_WITH_HOOK  U"\u2924"
 #define UNICODE_SOUTH_EAST_ARROW_WITH_HOOK  0x2925
-#define UNITEXT_SOUTH_EAST_ARROW_WITH_HOOK  L"\u2925"
+#define UNITEXT_SOUTH_EAST_ARROW_WITH_HOOK  U"\u2925"
 #define UNICODE_SOUTH_WEST_ARROW_WITH_HOOK  0x2926
-#define UNITEXT_SOUTH_WEST_ARROW_WITH_HOOK  L"\u2926"
+#define UNITEXT_SOUTH_WEST_ARROW_WITH_HOOK  U"\u2926"
 #define UNICODE_NORTH_WEST_ARROW_AND_NORTH_EAST_ARROW  0x2927
-#define UNITEXT_NORTH_WEST_ARROW_AND_NORTH_EAST_ARROW  L"\u2927"
+#define UNITEXT_NORTH_WEST_ARROW_AND_NORTH_EAST_ARROW  U"\u2927"
 #define UNICODE_NORTH_EAST_ARROW_AND_SOUTH_EAST_ARROW  0x2928
-#define UNITEXT_NORTH_EAST_ARROW_AND_SOUTH_EAST_ARROW  L"\u2928"
+#define UNITEXT_NORTH_EAST_ARROW_AND_SOUTH_EAST_ARROW  U"\u2928"
 #define UNICODE_SOUTH_EAST_ARROW_AND_SOUTH_WEST_ARROW  0x2929
-#define UNITEXT_SOUTH_EAST_ARROW_AND_SOUTH_WEST_ARROW  L"\u2929"
+#define UNITEXT_SOUTH_EAST_ARROW_AND_SOUTH_WEST_ARROW  U"\u2929"
 #define UNICODE_SOUTH_WEST_ARROW_AND_NORTH_WEST_ARROW  0x292a
-#define UNITEXT_SOUTH_WEST_ARROW_AND_NORTH_WEST_ARROW  L"\u292a"
+#define UNITEXT_SOUTH_WEST_ARROW_AND_NORTH_WEST_ARROW  U"\u292a"
 #define UNICODE_RISING_DIAGONAL_CROSSING_FALLING_DIAGONAL  0x292b
-#define UNITEXT_RISING_DIAGONAL_CROSSING_FALLING_DIAGONAL  L"\u292b"
+#define UNITEXT_RISING_DIAGONAL_CROSSING_FALLING_DIAGONAL  U"\u292b"
 #define UNICODE_FALLING_DIAGONAL_CROSSING_RISING_DIAGONAL  0x292c
-#define UNITEXT_FALLING_DIAGONAL_CROSSING_RISING_DIAGONAL  L"\u292c"
+#define UNITEXT_FALLING_DIAGONAL_CROSSING_RISING_DIAGONAL  U"\u292c"
 #define UNICODE_SOUTH_EAST_ARROW_CROSSING_NORTH_EAST_ARROW  0x292d
-#define UNITEXT_SOUTH_EAST_ARROW_CROSSING_NORTH_EAST_ARROW  L"\u292d"
+#define UNITEXT_SOUTH_EAST_ARROW_CROSSING_NORTH_EAST_ARROW  U"\u292d"
 #define UNICODE_NORTH_EAST_ARROW_CROSSING_SOUTH_EAST_ARROW  0x292e
-#define UNITEXT_NORTH_EAST_ARROW_CROSSING_SOUTH_EAST_ARROW  L"\u292e"
+#define UNITEXT_NORTH_EAST_ARROW_CROSSING_SOUTH_EAST_ARROW  U"\u292e"
 #define UNICODE_FALLING_DIAGONAL_CROSSING_NORTH_EAST_ARROW  0x292f
-#define UNITEXT_FALLING_DIAGONAL_CROSSING_NORTH_EAST_ARROW  L"\u292f"
+#define UNITEXT_FALLING_DIAGONAL_CROSSING_NORTH_EAST_ARROW  U"\u292f"
 #define UNICODE_RISING_DIAGONAL_CROSSING_SOUTH_EAST_ARROW  0x2930
-#define UNITEXT_RISING_DIAGONAL_CROSSING_SOUTH_EAST_ARROW  L"\u2930"
+#define UNITEXT_RISING_DIAGONAL_CROSSING_SOUTH_EAST_ARROW  U"\u2930"
 #define UNICODE_NORTH_EAST_ARROW_CROSSING_NORTH_WEST_ARROW  0x2931
-#define UNITEXT_NORTH_EAST_ARROW_CROSSING_NORTH_WEST_ARROW  L"\u2931"
+#define UNITEXT_NORTH_EAST_ARROW_CROSSING_NORTH_WEST_ARROW  U"\u2931"
 #define UNICODE_NORTH_WEST_ARROW_CROSSING_NORTH_EAST_ARROW  0x2932
-#define UNITEXT_NORTH_WEST_ARROW_CROSSING_NORTH_EAST_ARROW  L"\u2932"
+#define UNITEXT_NORTH_WEST_ARROW_CROSSING_NORTH_EAST_ARROW  U"\u2932"
 #define UNICODE_WAVE_ARROW_POINTING_DIRECTLY_RIGHT  0x2933
-#define UNITEXT_WAVE_ARROW_POINTING_DIRECTLY_RIGHT  L"\u2933"
+#define UNITEXT_WAVE_ARROW_POINTING_DIRECTLY_RIGHT  U"\u2933"
 #define UNICODE_ARROW_POINTING_RIGHTWARDS_THEN_CURVING_UPWARDS  0x2934
-#define UNITEXT_ARROW_POINTING_RIGHTWARDS_THEN_CURVING_UPWARDS  L"\u2934"
+#define UNITEXT_ARROW_POINTING_RIGHTWARDS_THEN_CURVING_UPWARDS  U"\u2934"
 #define UNICODE_ARROW_POINTING_RIGHTWARDS_THEN_CURVING_DOWNWARDS  0x2935
-#define UNITEXT_ARROW_POINTING_RIGHTWARDS_THEN_CURVING_DOWNWARDS  L"\u2935"
+#define UNITEXT_ARROW_POINTING_RIGHTWARDS_THEN_CURVING_DOWNWARDS  U"\u2935"
 #define UNICODE_ARROW_POINTING_DOWNWARDS_THEN_CURVING_LEFTWARDS  0x2936
-#define UNITEXT_ARROW_POINTING_DOWNWARDS_THEN_CURVING_LEFTWARDS  L"\u2936"
+#define UNITEXT_ARROW_POINTING_DOWNWARDS_THEN_CURVING_LEFTWARDS  U"\u2936"
 #define UNICODE_ARROW_POINTING_DOWNWARDS_THEN_CURVING_RIGHTWARDS  0x2937
-#define UNITEXT_ARROW_POINTING_DOWNWARDS_THEN_CURVING_RIGHTWARDS  L"\u2937"
+#define UNITEXT_ARROW_POINTING_DOWNWARDS_THEN_CURVING_RIGHTWARDS  U"\u2937"
 #define UNICODE_RIGHT_SIDE_ARC_CLOCKWISE_ARROW  0x2938
-#define UNITEXT_RIGHT_SIDE_ARC_CLOCKWISE_ARROW  L"\u2938"
+#define UNITEXT_RIGHT_SIDE_ARC_CLOCKWISE_ARROW  U"\u2938"
 #define UNICODE_LEFT_SIDE_ARC_ANTICLOCKWISE_ARROW  0x2939
-#define UNITEXT_LEFT_SIDE_ARC_ANTICLOCKWISE_ARROW  L"\u2939"
+#define UNITEXT_LEFT_SIDE_ARC_ANTICLOCKWISE_ARROW  U"\u2939"
 #define UNICODE_TOP_ARC_ANTICLOCKWISE_ARROW  0x293a
-#define UNITEXT_TOP_ARC_ANTICLOCKWISE_ARROW  L"\u293a"
+#define UNITEXT_TOP_ARC_ANTICLOCKWISE_ARROW  U"\u293a"
 #define UNICODE_BOTTOM_ARC_ANTICLOCKWISE_ARROW  0x293b
-#define UNITEXT_BOTTOM_ARC_ANTICLOCKWISE_ARROW  L"\u293b"
+#define UNITEXT_BOTTOM_ARC_ANTICLOCKWISE_ARROW  U"\u293b"
 #define UNICODE_TOP_ARC_CLOCKWISE_ARROW_WITH_MINUS  0x293c
-#define UNITEXT_TOP_ARC_CLOCKWISE_ARROW_WITH_MINUS  L"\u293c"
+#define UNITEXT_TOP_ARC_CLOCKWISE_ARROW_WITH_MINUS  U"\u293c"
 #define UNICODE_TOP_ARC_ANTICLOCKWISE_ARROW_WITH_PLUS  0x293d
-#define UNITEXT_TOP_ARC_ANTICLOCKWISE_ARROW_WITH_PLUS  L"\u293d"
+#define UNITEXT_TOP_ARC_ANTICLOCKWISE_ARROW_WITH_PLUS  U"\u293d"
 #define UNICODE_LOWER_RIGHT_SEMICIRCULAR_CLOCKWISE_ARROW  0x293e
-#define UNITEXT_LOWER_RIGHT_SEMICIRCULAR_CLOCKWISE_ARROW  L"\u293e"
+#define UNITEXT_LOWER_RIGHT_SEMICIRCULAR_CLOCKWISE_ARROW  U"\u293e"
 #define UNICODE_LOWER_LEFT_SEMICIRCULAR_ANTICLOCKWISE_ARROW  0x293f
-#define UNITEXT_LOWER_LEFT_SEMICIRCULAR_ANTICLOCKWISE_ARROW  L"\u293f"
+#define UNITEXT_LOWER_LEFT_SEMICIRCULAR_ANTICLOCKWISE_ARROW  U"\u293f"
 #define UNICODE_ANTICLOCKWISE_CLOSED_CIRCLE_ARROW  0x2940
-#define UNITEXT_ANTICLOCKWISE_CLOSED_CIRCLE_ARROW  L"\u2940"
+#define UNITEXT_ANTICLOCKWISE_CLOSED_CIRCLE_ARROW  U"\u2940"
 #define UNICODE_CLOCKWISE_CLOSED_CIRCLE_ARROW  0x2941
-#define UNITEXT_CLOCKWISE_CLOSED_CIRCLE_ARROW  L"\u2941"
+#define UNITEXT_CLOCKWISE_CLOSED_CIRCLE_ARROW  U"\u2941"
 #define UNICODE_RIGHTWARDS_ARROW_ABOVE_SHORT_LEFTWARDS_ARROW  0x2942
-#define UNITEXT_RIGHTWARDS_ARROW_ABOVE_SHORT_LEFTWARDS_ARROW  L"\u2942"
+#define UNITEXT_RIGHTWARDS_ARROW_ABOVE_SHORT_LEFTWARDS_ARROW  U"\u2942"
 #define UNICODE_LEFTWARDS_ARROW_ABOVE_SHORT_RIGHTWARDS_ARROW  0x2943
-#define UNITEXT_LEFTWARDS_ARROW_ABOVE_SHORT_RIGHTWARDS_ARROW  L"\u2943"
+#define UNITEXT_LEFTWARDS_ARROW_ABOVE_SHORT_RIGHTWARDS_ARROW  U"\u2943"
 #define UNICODE_SHORT_RIGHTWARDS_ARROW_ABOVE_LEFTWARDS_ARROW  0x2944
-#define UNITEXT_SHORT_RIGHTWARDS_ARROW_ABOVE_LEFTWARDS_ARROW  L"\u2944"
+#define UNITEXT_SHORT_RIGHTWARDS_ARROW_ABOVE_LEFTWARDS_ARROW  U"\u2944"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_PLUS_BELOW  0x2945
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_PLUS_BELOW  L"\u2945"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_PLUS_BELOW  U"\u2945"
 #define UNICODE_LEFTWARDS_ARROW_WITH_PLUS_BELOW  0x2946
-#define UNITEXT_LEFTWARDS_ARROW_WITH_PLUS_BELOW  L"\u2946"
+#define UNITEXT_LEFTWARDS_ARROW_WITH_PLUS_BELOW  U"\u2946"
 #define UNICODE_RIGHTWARDS_ARROW_THROUGH_X  0x2947
-#define UNITEXT_RIGHTWARDS_ARROW_THROUGH_X  L"\u2947"
+#define UNITEXT_RIGHTWARDS_ARROW_THROUGH_X  U"\u2947"
 #define UNICODE_LEFT_RIGHT_ARROW_THROUGH_SMALL_CIRCLE  0x2948
-#define UNITEXT_LEFT_RIGHT_ARROW_THROUGH_SMALL_CIRCLE  L"\u2948"
+#define UNITEXT_LEFT_RIGHT_ARROW_THROUGH_SMALL_CIRCLE  U"\u2948"
 #define UNICODE_UPWARDS_TWO_HEADED_ARROW_FROM_SMALL_CIRCLE  0x2949
-#define UNITEXT_UPWARDS_TWO_HEADED_ARROW_FROM_SMALL_CIRCLE  L"\u2949"
+#define UNITEXT_UPWARDS_TWO_HEADED_ARROW_FROM_SMALL_CIRCLE  U"\u2949"
 #define UNICODE_LEFT_BARB_UP_RIGHT_BARB_DOWN_HARPOON  0x294a
-#define UNITEXT_LEFT_BARB_UP_RIGHT_BARB_DOWN_HARPOON  L"\u294a"
+#define UNITEXT_LEFT_BARB_UP_RIGHT_BARB_DOWN_HARPOON  U"\u294a"
 #define UNICODE_LEFT_BARB_DOWN_RIGHT_BARB_UP_HARPOON  0x294b
-#define UNITEXT_LEFT_BARB_DOWN_RIGHT_BARB_UP_HARPOON  L"\u294b"
+#define UNITEXT_LEFT_BARB_DOWN_RIGHT_BARB_UP_HARPOON  U"\u294b"
 #define UNICODE_UP_BARB_RIGHT_DOWN_BARB_LEFT_HARPOON  0x294c
-#define UNITEXT_UP_BARB_RIGHT_DOWN_BARB_LEFT_HARPOON  L"\u294c"
+#define UNITEXT_UP_BARB_RIGHT_DOWN_BARB_LEFT_HARPOON  U"\u294c"
 #define UNICODE_UP_BARB_LEFT_DOWN_BARB_RIGHT_HARPOON  0x294d
-#define UNITEXT_UP_BARB_LEFT_DOWN_BARB_RIGHT_HARPOON  L"\u294d"
+#define UNITEXT_UP_BARB_LEFT_DOWN_BARB_RIGHT_HARPOON  U"\u294d"
 #define UNICODE_LEFT_BARB_UP_RIGHT_BARB_UP_HARPOON  0x294e
-#define UNITEXT_LEFT_BARB_UP_RIGHT_BARB_UP_HARPOON  L"\u294e"
+#define UNITEXT_LEFT_BARB_UP_RIGHT_BARB_UP_HARPOON  U"\u294e"
 #define UNICODE_UP_BARB_RIGHT_DOWN_BARB_RIGHT_HARPOON  0x294f
-#define UNITEXT_UP_BARB_RIGHT_DOWN_BARB_RIGHT_HARPOON  L"\u294f"
+#define UNITEXT_UP_BARB_RIGHT_DOWN_BARB_RIGHT_HARPOON  U"\u294f"
 #define UNICODE_LEFT_BARB_DOWN_RIGHT_BARB_DOWN_HARPOON  0x2950
-#define UNITEXT_LEFT_BARB_DOWN_RIGHT_BARB_DOWN_HARPOON  L"\u2950"
+#define UNITEXT_LEFT_BARB_DOWN_RIGHT_BARB_DOWN_HARPOON  U"\u2950"
 #define UNICODE_UP_BARB_LEFT_DOWN_BARB_LEFT_HARPOON  0x2951
-#define UNITEXT_UP_BARB_LEFT_DOWN_BARB_LEFT_HARPOON  L"\u2951"
+#define UNITEXT_UP_BARB_LEFT_DOWN_BARB_LEFT_HARPOON  U"\u2951"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_UP_TO_BAR  0x2952
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UP_TO_BAR  L"\u2952"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UP_TO_BAR  U"\u2952"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_UP_TO_BAR  0x2953
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UP_TO_BAR  L"\u2953"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UP_TO_BAR  U"\u2953"
 #define UNICODE_UPWARDS_HARPOON_WITH_BARB_RIGHT_TO_BAR  0x2954
-#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_RIGHT_TO_BAR  L"\u2954"
+#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_RIGHT_TO_BAR  U"\u2954"
 #define UNICODE_DOWNWARDS_HARPOON_WITH_BARB_RIGHT_TO_BAR  0x2955
-#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_RIGHT_TO_BAR  L"\u2955"
+#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_RIGHT_TO_BAR  U"\u2955"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_DOWN_TO_BAR  0x2956
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_DOWN_TO_BAR  L"\u2956"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_DOWN_TO_BAR  U"\u2956"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_TO_BAR  0x2957
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_TO_BAR  L"\u2957"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_TO_BAR  U"\u2957"
 #define UNICODE_UPWARDS_HARPOON_WITH_BARB_LEFT_TO_BAR  0x2958
-#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_LEFT_TO_BAR  L"\u2958"
+#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_LEFT_TO_BAR  U"\u2958"
 #define UNICODE_DOWNWARDS_HARPOON_WITH_BARB_LEFT_TO_BAR  0x2959
-#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_LEFT_TO_BAR  L"\u2959"
+#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_LEFT_TO_BAR  U"\u2959"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_UP_FROM_BAR  0x295a
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UP_FROM_BAR  L"\u295a"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UP_FROM_BAR  U"\u295a"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_UP_FROM_BAR  0x295b
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UP_FROM_BAR  L"\u295b"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UP_FROM_BAR  U"\u295b"
 #define UNICODE_UPWARDS_HARPOON_WITH_BARB_RIGHT_FROM_BAR  0x295c
-#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_RIGHT_FROM_BAR  L"\u295c"
+#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_RIGHT_FROM_BAR  U"\u295c"
 #define UNICODE_DOWNWARDS_HARPOON_WITH_BARB_RIGHT_FROM_BAR  0x295d
-#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_RIGHT_FROM_BAR  L"\u295d"
+#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_RIGHT_FROM_BAR  U"\u295d"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_DOWN_FROM_BAR  0x295e
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_DOWN_FROM_BAR  L"\u295e"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_DOWN_FROM_BAR  U"\u295e"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_FROM_BAR  0x295f
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_FROM_BAR  L"\u295f"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_FROM_BAR  U"\u295f"
 #define UNICODE_UPWARDS_HARPOON_WITH_BARB_LEFT_FROM_BAR  0x2960
-#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_LEFT_FROM_BAR  L"\u2960"
+#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_LEFT_FROM_BAR  U"\u2960"
 #define UNICODE_DOWNWARDS_HARPOON_WITH_BARB_LEFT_FROM_BAR  0x2961
-#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_LEFT_FROM_BAR  L"\u2961"
+#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_LEFT_FROM_BAR  U"\u2961"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LEFTWARDS_HARPOON_WITH_BARB_DOWN  0x2962
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LEFTWARDS_HARPOON_WITH_BARB_DOWN  L"\u2962"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LEFTWARDS_HARPOON_WITH_BARB_DOWN  U"\u2962"
 #define UNICODE_UPWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_UPWARDS_HARPOON_WITH_BARB_RIGHT  0x2963
-#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_UPWARDS_HARPOON_WITH_BARB_RIGHT  L"\u2963"
+#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_UPWARDS_HARPOON_WITH_BARB_RIGHT  U"\u2963"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_UP_ABOVE_RIGHTWARDS_HARPOON_WITH_BARB_DOWN  0x2964
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UP_ABOVE_RIGHTWARDS_HARPOON_WITH_BARB_DOWN  L"\u2964"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UP_ABOVE_RIGHTWARDS_HARPOON_WITH_BARB_DOWN  U"\u2964"
 #define UNICODE_DOWNWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_DOWNWARDS_HARPOON_WITH_BARB_RIGHT  0x2965
-#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_DOWNWARDS_HARPOON_WITH_BARB_RIGHT  L"\u2965"
+#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_DOWNWARDS_HARPOON_WITH_BARB_RIGHT  U"\u2965"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_UP_ABOVE_RIGHTWARDS_HARPOON_WITH_BARB_UP  0x2966
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UP_ABOVE_RIGHTWARDS_HARPOON_WITH_BARB_UP  L"\u2966"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UP_ABOVE_RIGHTWARDS_HARPOON_WITH_BARB_UP  U"\u2966"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_DOWN_ABOVE_RIGHTWARDS_HARPOON_WITH_BARB_DOWN  0x2967
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_DOWN_ABOVE_RIGHTWARDS_HARPOON_WITH_BARB_DOWN  L"\u2967"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_DOWN_ABOVE_RIGHTWARDS_HARPOON_WITH_BARB_DOWN  U"\u2967"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LEFTWARDS_HARPOON_WITH_BARB_UP  0x2968
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LEFTWARDS_HARPOON_WITH_BARB_UP  L"\u2968"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LEFTWARDS_HARPOON_WITH_BARB_UP  U"\u2968"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_ABOVE_LEFTWARDS_HARPOON_WITH_BARB_DOWN  0x2969
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_ABOVE_LEFTWARDS_HARPOON_WITH_BARB_DOWN  L"\u2969"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_ABOVE_LEFTWARDS_HARPOON_WITH_BARB_DOWN  U"\u2969"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LONG_DASH  0x296a
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LONG_DASH  L"\u296a"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LONG_DASH  U"\u296a"
 #define UNICODE_LEFTWARDS_HARPOON_WITH_BARB_DOWN_BELOW_LONG_DASH  0x296b
-#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_DOWN_BELOW_LONG_DASH  L"\u296b"
+#define UNITEXT_LEFTWARDS_HARPOON_WITH_BARB_DOWN_BELOW_LONG_DASH  U"\u296b"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LONG_DASH  0x296c
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LONG_DASH  L"\u296c"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_UP_ABOVE_LONG_DASH  U"\u296c"
 #define UNICODE_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_BELOW_LONG_DASH  0x296d
-#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_BELOW_LONG_DASH  L"\u296d"
+#define UNITEXT_RIGHTWARDS_HARPOON_WITH_BARB_DOWN_BELOW_LONG_DASH  U"\u296d"
 #define UNICODE_UPWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_DOWNWARDS_HARPOON_WITH_BARB_RIGHT  0x296e
-#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_DOWNWARDS_HARPOON_WITH_BARB_RIGHT  L"\u296e"
+#define UNITEXT_UPWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_DOWNWARDS_HARPOON_WITH_BARB_RIGHT  U"\u296e"
 #define UNICODE_DOWNWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_UPWARDS_HARPOON_WITH_BARB_RIGHT  0x296f
-#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_UPWARDS_HARPOON_WITH_BARB_RIGHT  L"\u296f"
+#define UNITEXT_DOWNWARDS_HARPOON_WITH_BARB_LEFT_BESIDE_UPWARDS_HARPOON_WITH_BARB_RIGHT  U"\u296f"
 #define UNICODE_RIGHT_DOUBLE_ARROW_WITH_ROUNDED_HEAD  0x2970
-#define UNITEXT_RIGHT_DOUBLE_ARROW_WITH_ROUNDED_HEAD  L"\u2970"
+#define UNITEXT_RIGHT_DOUBLE_ARROW_WITH_ROUNDED_HEAD  U"\u2970"
 #define UNICODE_EQUALS_SIGN_ABOVE_RIGHTWARDS_ARROW  0x2971
-#define UNITEXT_EQUALS_SIGN_ABOVE_RIGHTWARDS_ARROW  L"\u2971"
+#define UNITEXT_EQUALS_SIGN_ABOVE_RIGHTWARDS_ARROW  U"\u2971"
 #define UNICODE_TILDE_OPERATOR_ABOVE_RIGHTWARDS_ARROW  0x2972
-#define UNITEXT_TILDE_OPERATOR_ABOVE_RIGHTWARDS_ARROW  L"\u2972"
+#define UNITEXT_TILDE_OPERATOR_ABOVE_RIGHTWARDS_ARROW  U"\u2972"
 #define UNICODE_LEFTWARDS_ARROW_ABOVE_TILDE_OPERATOR  0x2973
-#define UNITEXT_LEFTWARDS_ARROW_ABOVE_TILDE_OPERATOR  L"\u2973"
+#define UNITEXT_LEFTWARDS_ARROW_ABOVE_TILDE_OPERATOR  U"\u2973"
 #define UNICODE_RIGHTWARDS_ARROW_ABOVE_TILDE_OPERATOR  0x2974
-#define UNITEXT_RIGHTWARDS_ARROW_ABOVE_TILDE_OPERATOR  L"\u2974"
+#define UNITEXT_RIGHTWARDS_ARROW_ABOVE_TILDE_OPERATOR  U"\u2974"
 #define UNICODE_RIGHTWARDS_ARROW_ABOVE_ALMOST_EQUAL_TO  0x2975
-#define UNITEXT_RIGHTWARDS_ARROW_ABOVE_ALMOST_EQUAL_TO  L"\u2975"
+#define UNITEXT_RIGHTWARDS_ARROW_ABOVE_ALMOST_EQUAL_TO  U"\u2975"
 #define UNICODE_LESS_THAN_ABOVE_LEFTWARDS_ARROW  0x2976
-#define UNITEXT_LESS_THAN_ABOVE_LEFTWARDS_ARROW  L"\u2976"
+#define UNITEXT_LESS_THAN_ABOVE_LEFTWARDS_ARROW  U"\u2976"
 #define UNICODE_LEFTWARDS_ARROW_THROUGH_LESS_THAN  0x2977
-#define UNITEXT_LEFTWARDS_ARROW_THROUGH_LESS_THAN  L"\u2977"
+#define UNITEXT_LEFTWARDS_ARROW_THROUGH_LESS_THAN  U"\u2977"
 #define UNICODE_GREATER_THAN_ABOVE_RIGHTWARDS_ARROW  0x2978
-#define UNITEXT_GREATER_THAN_ABOVE_RIGHTWARDS_ARROW  L"\u2978"
+#define UNITEXT_GREATER_THAN_ABOVE_RIGHTWARDS_ARROW  U"\u2978"
 #define UNICODE_SUBSET_ABOVE_RIGHTWARDS_ARROW  0x2979
-#define UNITEXT_SUBSET_ABOVE_RIGHTWARDS_ARROW  L"\u2979"
+#define UNITEXT_SUBSET_ABOVE_RIGHTWARDS_ARROW  U"\u2979"
 #define UNICODE_LEFTWARDS_ARROW_THROUGH_SUBSET  0x297a
-#define UNITEXT_LEFTWARDS_ARROW_THROUGH_SUBSET  L"\u297a"
+#define UNITEXT_LEFTWARDS_ARROW_THROUGH_SUBSET  U"\u297a"
 #define UNICODE_SUPERSET_ABOVE_LEFTWARDS_ARROW  0x297b
-#define UNITEXT_SUPERSET_ABOVE_LEFTWARDS_ARROW  L"\u297b"
+#define UNITEXT_SUPERSET_ABOVE_LEFTWARDS_ARROW  U"\u297b"
 #define UNICODE_LEFT_FISH_TAIL  0x297c
-#define UNITEXT_LEFT_FISH_TAIL  L"\u297c"
+#define UNITEXT_LEFT_FISH_TAIL  U"\u297c"
 #define UNICODE_RIGHT_FISH_TAIL  0x297d
-#define UNITEXT_RIGHT_FISH_TAIL  L"\u297d"
+#define UNITEXT_RIGHT_FISH_TAIL  U"\u297d"
 #define UNICODE_UP_FISH_TAIL  0x297e
-#define UNITEXT_UP_FISH_TAIL  L"\u297e"
+#define UNITEXT_UP_FISH_TAIL  U"\u297e"
 #define UNICODE_DOWN_FISH_TAIL  0x297f
-#define UNITEXT_DOWN_FISH_TAIL  L"\u297f"
+#define UNITEXT_DOWN_FISH_TAIL  U"\u297f"
 #define UNICODE_TRIPLE_VERTICAL_BAR_DELIMITER  0x2980
-#define UNITEXT_TRIPLE_VERTICAL_BAR_DELIMITER  L"\u2980"
+#define UNITEXT_TRIPLE_VERTICAL_BAR_DELIMITER  U"\u2980"
 #define UNICODE_Z_NOTATION_SPOT  0x2981
-#define UNITEXT_Z_NOTATION_SPOT  L"\u2981"
+#define UNITEXT_Z_NOTATION_SPOT  U"\u2981"
 #define UNICODE_Z_NOTATION_TYPE_COLON  0x2982
-#define UNITEXT_Z_NOTATION_TYPE_COLON  L"\u2982"
+#define UNITEXT_Z_NOTATION_TYPE_COLON  U"\u2982"
 #define UNICODE_LEFT_WHITE_CURLY_BRACKET  0x2983
-#define UNITEXT_LEFT_WHITE_CURLY_BRACKET  L"\u2983"
+#define UNITEXT_LEFT_WHITE_CURLY_BRACKET  U"\u2983"
 #define UNICODE_RIGHT_WHITE_CURLY_BRACKET  0x2984
-#define UNITEXT_RIGHT_WHITE_CURLY_BRACKET  L"\u2984"
+#define UNITEXT_RIGHT_WHITE_CURLY_BRACKET  U"\u2984"
 #define UNICODE_LEFT_WHITE_PARENTHESIS  0x2985
-#define UNITEXT_LEFT_WHITE_PARENTHESIS  L"\u2985"
+#define UNITEXT_LEFT_WHITE_PARENTHESIS  U"\u2985"
 #define UNICODE_RIGHT_WHITE_PARENTHESIS  0x2986
-#define UNITEXT_RIGHT_WHITE_PARENTHESIS  L"\u2986"
+#define UNITEXT_RIGHT_WHITE_PARENTHESIS  U"\u2986"
 #define UNICODE_Z_NOTATION_LEFT_IMAGE_BRACKET  0x2987
-#define UNITEXT_Z_NOTATION_LEFT_IMAGE_BRACKET  L"\u2987"
+#define UNITEXT_Z_NOTATION_LEFT_IMAGE_BRACKET  U"\u2987"
 #define UNICODE_Z_NOTATION_RIGHT_IMAGE_BRACKET  0x2988
-#define UNITEXT_Z_NOTATION_RIGHT_IMAGE_BRACKET  L"\u2988"
+#define UNITEXT_Z_NOTATION_RIGHT_IMAGE_BRACKET  U"\u2988"
 #define UNICODE_Z_NOTATION_LEFT_BINDING_BRACKET  0x2989
-#define UNITEXT_Z_NOTATION_LEFT_BINDING_BRACKET  L"\u2989"
+#define UNITEXT_Z_NOTATION_LEFT_BINDING_BRACKET  U"\u2989"
 #define UNICODE_Z_NOTATION_RIGHT_BINDING_BRACKET  0x298a
-#define UNITEXT_Z_NOTATION_RIGHT_BINDING_BRACKET  L"\u298a"
+#define UNITEXT_Z_NOTATION_RIGHT_BINDING_BRACKET  U"\u298a"
 #define UNICODE_LEFT_SQUARE_BRACKET_WITH_UNDERBAR  0x298b
-#define UNITEXT_LEFT_SQUARE_BRACKET_WITH_UNDERBAR  L"\u298b"
+#define UNITEXT_LEFT_SQUARE_BRACKET_WITH_UNDERBAR  U"\u298b"
 #define UNICODE_RIGHT_SQUARE_BRACKET_WITH_UNDERBAR  0x298c
-#define UNITEXT_RIGHT_SQUARE_BRACKET_WITH_UNDERBAR  L"\u298c"
+#define UNITEXT_RIGHT_SQUARE_BRACKET_WITH_UNDERBAR  U"\u298c"
 #define UNICODE_LEFT_SQUARE_BRACKET_WITH_TICK_IN_TOP_CORNER  0x298d
-#define UNITEXT_LEFT_SQUARE_BRACKET_WITH_TICK_IN_TOP_CORNER  L"\u298d"
+#define UNITEXT_LEFT_SQUARE_BRACKET_WITH_TICK_IN_TOP_CORNER  U"\u298d"
 #define UNICODE_RIGHT_SQUARE_BRACKET_WITH_TICK_IN_BOTTOM_CORNER  0x298e
-#define UNITEXT_RIGHT_SQUARE_BRACKET_WITH_TICK_IN_BOTTOM_CORNER  L"\u298e"
+#define UNITEXT_RIGHT_SQUARE_BRACKET_WITH_TICK_IN_BOTTOM_CORNER  U"\u298e"
 #define UNICODE_LEFT_SQUARE_BRACKET_WITH_TICK_IN_BOTTOM_CORNER  0x298f
-#define UNITEXT_LEFT_SQUARE_BRACKET_WITH_TICK_IN_BOTTOM_CORNER  L"\u298f"
+#define UNITEXT_LEFT_SQUARE_BRACKET_WITH_TICK_IN_BOTTOM_CORNER  U"\u298f"
 #define UNICODE_RIGHT_SQUARE_BRACKET_WITH_TICK_IN_TOP_CORNER  0x2990
-#define UNITEXT_RIGHT_SQUARE_BRACKET_WITH_TICK_IN_TOP_CORNER  L"\u2990"
+#define UNITEXT_RIGHT_SQUARE_BRACKET_WITH_TICK_IN_TOP_CORNER  U"\u2990"
 #define UNICODE_LEFT_ANGLE_BRACKET_WITH_DOT  0x2991
-#define UNITEXT_LEFT_ANGLE_BRACKET_WITH_DOT  L"\u2991"
+#define UNITEXT_LEFT_ANGLE_BRACKET_WITH_DOT  U"\u2991"
 #define UNICODE_RIGHT_ANGLE_BRACKET_WITH_DOT  0x2992
-#define UNITEXT_RIGHT_ANGLE_BRACKET_WITH_DOT  L"\u2992"
+#define UNITEXT_RIGHT_ANGLE_BRACKET_WITH_DOT  U"\u2992"
 #define UNICODE_LEFT_ARC_LESS_THAN_BRACKET  0x2993
-#define UNITEXT_LEFT_ARC_LESS_THAN_BRACKET  L"\u2993"
+#define UNITEXT_LEFT_ARC_LESS_THAN_BRACKET  U"\u2993"
 #define UNICODE_RIGHT_ARC_GREATER_THAN_BRACKET  0x2994
-#define UNITEXT_RIGHT_ARC_GREATER_THAN_BRACKET  L"\u2994"
+#define UNITEXT_RIGHT_ARC_GREATER_THAN_BRACKET  U"\u2994"
 #define UNICODE_DOUBLE_LEFT_ARC_GREATER_THAN_BRACKET  0x2995
-#define UNITEXT_DOUBLE_LEFT_ARC_GREATER_THAN_BRACKET  L"\u2995"
+#define UNITEXT_DOUBLE_LEFT_ARC_GREATER_THAN_BRACKET  U"\u2995"
 #define UNICODE_DOUBLE_RIGHT_ARC_LESS_THAN_BRACKET  0x2996
-#define UNITEXT_DOUBLE_RIGHT_ARC_LESS_THAN_BRACKET  L"\u2996"
+#define UNITEXT_DOUBLE_RIGHT_ARC_LESS_THAN_BRACKET  U"\u2996"
 #define UNICODE_LEFT_BLACK_TORTOISE_SHELL_BRACKET  0x2997
-#define UNITEXT_LEFT_BLACK_TORTOISE_SHELL_BRACKET  L"\u2997"
+#define UNITEXT_LEFT_BLACK_TORTOISE_SHELL_BRACKET  U"\u2997"
 #define UNICODE_RIGHT_BLACK_TORTOISE_SHELL_BRACKET  0x2998
-#define UNITEXT_RIGHT_BLACK_TORTOISE_SHELL_BRACKET  L"\u2998"
+#define UNITEXT_RIGHT_BLACK_TORTOISE_SHELL_BRACKET  U"\u2998"
 #define UNICODE_DOTTED_FENCE  0x2999
-#define UNITEXT_DOTTED_FENCE  L"\u2999"
+#define UNITEXT_DOTTED_FENCE  U"\u2999"
 #define UNICODE_VERTICAL_ZIGZAG_LINE  0x299a
-#define UNITEXT_VERTICAL_ZIGZAG_LINE  L"\u299a"
+#define UNITEXT_VERTICAL_ZIGZAG_LINE  U"\u299a"
 #define UNICODE_MEASURED_ANGLE_OPENING_LEFT  0x299b
-#define UNITEXT_MEASURED_ANGLE_OPENING_LEFT  L"\u299b"
+#define UNITEXT_MEASURED_ANGLE_OPENING_LEFT  U"\u299b"
 #define UNICODE_RIGHT_ANGLE_VARIANT_WITH_SQUARE  0x299c
-#define UNITEXT_RIGHT_ANGLE_VARIANT_WITH_SQUARE  L"\u299c"
+#define UNITEXT_RIGHT_ANGLE_VARIANT_WITH_SQUARE  U"\u299c"
 #define UNICODE_MEASURED_RIGHT_ANGLE_WITH_DOT  0x299d
-#define UNITEXT_MEASURED_RIGHT_ANGLE_WITH_DOT  L"\u299d"
+#define UNITEXT_MEASURED_RIGHT_ANGLE_WITH_DOT  U"\u299d"
 #define UNICODE_ANGLE_WITH_S_INSIDE  0x299e
-#define UNITEXT_ANGLE_WITH_S_INSIDE  L"\u299e"
+#define UNITEXT_ANGLE_WITH_S_INSIDE  U"\u299e"
 #define UNICODE_ACUTE_ANGLE  0x299f
-#define UNITEXT_ACUTE_ANGLE  L"\u299f"
+#define UNITEXT_ACUTE_ANGLE  U"\u299f"
 #define UNICODE_SPHERICAL_ANGLE_OPENING_LEFT  0x29a0
-#define UNITEXT_SPHERICAL_ANGLE_OPENING_LEFT  L"\u29a0"
+#define UNITEXT_SPHERICAL_ANGLE_OPENING_LEFT  U"\u29a0"
 #define UNICODE_SPHERICAL_ANGLE_OPENING_UP  0x29a1
-#define UNITEXT_SPHERICAL_ANGLE_OPENING_UP  L"\u29a1"
+#define UNITEXT_SPHERICAL_ANGLE_OPENING_UP  U"\u29a1"
 #define UNICODE_TURNED_ANGLE  0x29a2
-#define UNITEXT_TURNED_ANGLE  L"\u29a2"
+#define UNITEXT_TURNED_ANGLE  U"\u29a2"
 #define UNICODE_REVERSED_ANGLE  0x29a3
-#define UNITEXT_REVERSED_ANGLE  L"\u29a3"
+#define UNITEXT_REVERSED_ANGLE  U"\u29a3"
 #define UNICODE_ANGLE_WITH_UNDERBAR  0x29a4
-#define UNITEXT_ANGLE_WITH_UNDERBAR  L"\u29a4"
+#define UNITEXT_ANGLE_WITH_UNDERBAR  U"\u29a4"
 #define UNICODE_REVERSED_ANGLE_WITH_UNDERBAR  0x29a5
-#define UNITEXT_REVERSED_ANGLE_WITH_UNDERBAR  L"\u29a5"
+#define UNITEXT_REVERSED_ANGLE_WITH_UNDERBAR  U"\u29a5"
 #define UNICODE_OBLIQUE_ANGLE_OPENING_UP  0x29a6
-#define UNITEXT_OBLIQUE_ANGLE_OPENING_UP  L"\u29a6"
+#define UNITEXT_OBLIQUE_ANGLE_OPENING_UP  U"\u29a6"
 #define UNICODE_OBLIQUE_ANGLE_OPENING_DOWN  0x29a7
-#define UNITEXT_OBLIQUE_ANGLE_OPENING_DOWN  L"\u29a7"
+#define UNITEXT_OBLIQUE_ANGLE_OPENING_DOWN  U"\u29a7"
 #define UNICODE_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_UP_AND_RIGHT  0x29a8
-#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_UP_AND_RIGHT  L"\u29a8"
+#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_UP_AND_RIGHT  U"\u29a8"
 #define UNICODE_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_UP_AND_LEFT  0x29a9
-#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_UP_AND_LEFT  L"\u29a9"
+#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_UP_AND_LEFT  U"\u29a9"
 #define UNICODE_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_DOWN_AND_RIGHT  0x29aa
-#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_DOWN_AND_RIGHT  L"\u29aa"
+#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_DOWN_AND_RIGHT  U"\u29aa"
 #define UNICODE_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_DOWN_AND_LEFT  0x29ab
-#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_DOWN_AND_LEFT  L"\u29ab"
+#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_DOWN_AND_LEFT  U"\u29ab"
 #define UNICODE_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_RIGHT_AND_UP  0x29ac
-#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_RIGHT_AND_UP  L"\u29ac"
+#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_RIGHT_AND_UP  U"\u29ac"
 #define UNICODE_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_LEFT_AND_UP  0x29ad
-#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_LEFT_AND_UP  L"\u29ad"
+#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_LEFT_AND_UP  U"\u29ad"
 #define UNICODE_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_RIGHT_AND_DOWN  0x29ae
-#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_RIGHT_AND_DOWN  L"\u29ae"
+#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_RIGHT_AND_DOWN  U"\u29ae"
 #define UNICODE_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_LEFT_AND_DOWN  0x29af
-#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_LEFT_AND_DOWN  L"\u29af"
+#define UNITEXT_MEASURED_ANGLE_WITH_OPEN_ARM_ENDING_IN_ARROW_POINTING_LEFT_AND_DOWN  U"\u29af"
 #define UNICODE_REVERSED_EMPTY_SET  0x29b0
-#define UNITEXT_REVERSED_EMPTY_SET  L"\u29b0"
+#define UNITEXT_REVERSED_EMPTY_SET  U"\u29b0"
 #define UNICODE_EMPTY_SET_WITH_OVERBAR  0x29b1
-#define UNITEXT_EMPTY_SET_WITH_OVERBAR  L"\u29b1"
+#define UNITEXT_EMPTY_SET_WITH_OVERBAR  U"\u29b1"
 #define UNICODE_EMPTY_SET_WITH_SMALL_CIRCLE_ABOVE  0x29b2
-#define UNITEXT_EMPTY_SET_WITH_SMALL_CIRCLE_ABOVE  L"\u29b2"
+#define UNITEXT_EMPTY_SET_WITH_SMALL_CIRCLE_ABOVE  U"\u29b2"
 #define UNICODE_EMPTY_SET_WITH_RIGHT_ARROW_ABOVE  0x29b3
-#define UNITEXT_EMPTY_SET_WITH_RIGHT_ARROW_ABOVE  L"\u29b3"
+#define UNITEXT_EMPTY_SET_WITH_RIGHT_ARROW_ABOVE  U"\u29b3"
 #define UNICODE_EMPTY_SET_WITH_LEFT_ARROW_ABOVE  0x29b4
-#define UNITEXT_EMPTY_SET_WITH_LEFT_ARROW_ABOVE  L"\u29b4"
+#define UNITEXT_EMPTY_SET_WITH_LEFT_ARROW_ABOVE  U"\u29b4"
 #define UNICODE_CIRCLE_WITH_HORIZONTAL_BAR  0x29b5
-#define UNITEXT_CIRCLE_WITH_HORIZONTAL_BAR  L"\u29b5"
+#define UNITEXT_CIRCLE_WITH_HORIZONTAL_BAR  U"\u29b5"
 #define UNICODE_CIRCLED_VERTICAL_BAR  0x29b6
-#define UNITEXT_CIRCLED_VERTICAL_BAR  L"\u29b6"
+#define UNITEXT_CIRCLED_VERTICAL_BAR  U"\u29b6"
 #define UNICODE_CIRCLED_PARALLEL  0x29b7
-#define UNITEXT_CIRCLED_PARALLEL  L"\u29b7"
+#define UNITEXT_CIRCLED_PARALLEL  U"\u29b7"
 #define UNICODE_CIRCLED_REVERSE_SOLIDUS  0x29b8
-#define UNITEXT_CIRCLED_REVERSE_SOLIDUS  L"\u29b8"
+#define UNITEXT_CIRCLED_REVERSE_SOLIDUS  U"\u29b8"
 #define UNICODE_CIRCLED_PERPENDICULAR  0x29b9
-#define UNITEXT_CIRCLED_PERPENDICULAR  L"\u29b9"
+#define UNITEXT_CIRCLED_PERPENDICULAR  U"\u29b9"
 #define UNICODE_CIRCLE_DIVIDED_BY_HORIZONTAL_BAR_AND_TOP_HALF_DIVIDED_BY_VERTICAL_BAR  0x29ba
-#define UNITEXT_CIRCLE_DIVIDED_BY_HORIZONTAL_BAR_AND_TOP_HALF_DIVIDED_BY_VERTICAL_BAR  L"\u29ba"
+#define UNITEXT_CIRCLE_DIVIDED_BY_HORIZONTAL_BAR_AND_TOP_HALF_DIVIDED_BY_VERTICAL_BAR  U"\u29ba"
 #define UNICODE_CIRCLE_WITH_SUPERIMPOSED_X  0x29bb
-#define UNITEXT_CIRCLE_WITH_SUPERIMPOSED_X  L"\u29bb"
+#define UNITEXT_CIRCLE_WITH_SUPERIMPOSED_X  U"\u29bb"
 #define UNICODE_CIRCLED_ANTICLOCKWISE_ROTATED_DIVISION_SIGN  0x29bc
-#define UNITEXT_CIRCLED_ANTICLOCKWISE_ROTATED_DIVISION_SIGN  L"\u29bc"
+#define UNITEXT_CIRCLED_ANTICLOCKWISE_ROTATED_DIVISION_SIGN  U"\u29bc"
 #define UNICODE_UP_ARROW_THROUGH_CIRCLE  0x29bd
-#define UNITEXT_UP_ARROW_THROUGH_CIRCLE  L"\u29bd"
+#define UNITEXT_UP_ARROW_THROUGH_CIRCLE  U"\u29bd"
 #define UNICODE_CIRCLED_WHITE_BULLET  0x29be
-#define UNITEXT_CIRCLED_WHITE_BULLET  L"\u29be"
+#define UNITEXT_CIRCLED_WHITE_BULLET  U"\u29be"
 #define UNICODE_CIRCLED_BULLET  0x29bf
-#define UNITEXT_CIRCLED_BULLET  L"\u29bf"
+#define UNITEXT_CIRCLED_BULLET  U"\u29bf"
 #define UNICODE_CIRCLED_LESS_THAN  0x29c0
-#define UNITEXT_CIRCLED_LESS_THAN  L"\u29c0"
+#define UNITEXT_CIRCLED_LESS_THAN  U"\u29c0"
 #define UNICODE_CIRCLED_GREATER_THAN  0x29c1
-#define UNITEXT_CIRCLED_GREATER_THAN  L"\u29c1"
+#define UNITEXT_CIRCLED_GREATER_THAN  U"\u29c1"
 #define UNICODE_CIRCLE_WITH_SMALL_CIRCLE_TO_THE_RIGHT  0x29c2
-#define UNITEXT_CIRCLE_WITH_SMALL_CIRCLE_TO_THE_RIGHT  L"\u29c2"
+#define UNITEXT_CIRCLE_WITH_SMALL_CIRCLE_TO_THE_RIGHT  U"\u29c2"
 #define UNICODE_CIRCLE_WITH_TWO_HORIZONTAL_STROKES_TO_THE_RIGHT  0x29c3
-#define UNITEXT_CIRCLE_WITH_TWO_HORIZONTAL_STROKES_TO_THE_RIGHT  L"\u29c3"
+#define UNITEXT_CIRCLE_WITH_TWO_HORIZONTAL_STROKES_TO_THE_RIGHT  U"\u29c3"
 #define UNICODE_SQUARED_RISING_DIAGONAL_SLASH  0x29c4
-#define UNITEXT_SQUARED_RISING_DIAGONAL_SLASH  L"\u29c4"
+#define UNITEXT_SQUARED_RISING_DIAGONAL_SLASH  U"\u29c4"
 #define UNICODE_SQUARED_FALLING_DIAGONAL_SLASH  0x29c5
-#define UNITEXT_SQUARED_FALLING_DIAGONAL_SLASH  L"\u29c5"
+#define UNITEXT_SQUARED_FALLING_DIAGONAL_SLASH  U"\u29c5"
 #define UNICODE_SQUARED_ASTERISK  0x29c6
-#define UNITEXT_SQUARED_ASTERISK  L"\u29c6"
+#define UNITEXT_SQUARED_ASTERISK  U"\u29c6"
 #define UNICODE_SQUARED_SMALL_CIRCLE  0x29c7
-#define UNITEXT_SQUARED_SMALL_CIRCLE  L"\u29c7"
+#define UNITEXT_SQUARED_SMALL_CIRCLE  U"\u29c7"
 #define UNICODE_SQUARED_SQUARE  0x29c8
-#define UNITEXT_SQUARED_SQUARE  L"\u29c8"
+#define UNITEXT_SQUARED_SQUARE  U"\u29c8"
 #define UNICODE_TWO_JOINED_SQUARES  0x29c9
-#define UNITEXT_TWO_JOINED_SQUARES  L"\u29c9"
+#define UNITEXT_TWO_JOINED_SQUARES  U"\u29c9"
 #define UNICODE_TRIANGLE_WITH_DOT_ABOVE  0x29ca
-#define UNITEXT_TRIANGLE_WITH_DOT_ABOVE  L"\u29ca"
+#define UNITEXT_TRIANGLE_WITH_DOT_ABOVE  U"\u29ca"
 #define UNICODE_TRIANGLE_WITH_UNDERBAR  0x29cb
-#define UNITEXT_TRIANGLE_WITH_UNDERBAR  L"\u29cb"
+#define UNITEXT_TRIANGLE_WITH_UNDERBAR  U"\u29cb"
 #define UNICODE_S_IN_TRIANGLE  0x29cc
-#define UNITEXT_S_IN_TRIANGLE  L"\u29cc"
+#define UNITEXT_S_IN_TRIANGLE  U"\u29cc"
 #define UNICODE_TRIANGLE_WITH_SERIFS_AT_BOTTOM  0x29cd
-#define UNITEXT_TRIANGLE_WITH_SERIFS_AT_BOTTOM  L"\u29cd"
+#define UNITEXT_TRIANGLE_WITH_SERIFS_AT_BOTTOM  U"\u29cd"
 #define UNICODE_RIGHT_TRIANGLE_ABOVE_LEFT_TRIANGLE  0x29ce
-#define UNITEXT_RIGHT_TRIANGLE_ABOVE_LEFT_TRIANGLE  L"\u29ce"
+#define UNITEXT_RIGHT_TRIANGLE_ABOVE_LEFT_TRIANGLE  U"\u29ce"
 #define UNICODE_LEFT_TRIANGLE_BESIDE_VERTICAL_BAR  0x29cf
-#define UNITEXT_LEFT_TRIANGLE_BESIDE_VERTICAL_BAR  L"\u29cf"
+#define UNITEXT_LEFT_TRIANGLE_BESIDE_VERTICAL_BAR  U"\u29cf"
 #define UNICODE_VERTICAL_BAR_BESIDE_RIGHT_TRIANGLE  0x29d0
-#define UNITEXT_VERTICAL_BAR_BESIDE_RIGHT_TRIANGLE  L"\u29d0"
+#define UNITEXT_VERTICAL_BAR_BESIDE_RIGHT_TRIANGLE  U"\u29d0"
 #define UNICODE_BOWTIE_WITH_LEFT_HALF_BLACK  0x29d1
-#define UNITEXT_BOWTIE_WITH_LEFT_HALF_BLACK  L"\u29d1"
+#define UNITEXT_BOWTIE_WITH_LEFT_HALF_BLACK  U"\u29d1"
 #define UNICODE_BOWTIE_WITH_RIGHT_HALF_BLACK  0x29d2
-#define UNITEXT_BOWTIE_WITH_RIGHT_HALF_BLACK  L"\u29d2"
+#define UNITEXT_BOWTIE_WITH_RIGHT_HALF_BLACK  U"\u29d2"
 #define UNICODE_BLACK_BOWTIE  0x29d3
-#define UNITEXT_BLACK_BOWTIE  L"\u29d3"
+#define UNITEXT_BLACK_BOWTIE  U"\u29d3"
 #define UNICODE_TIMES_WITH_LEFT_HALF_BLACK  0x29d4
-#define UNITEXT_TIMES_WITH_LEFT_HALF_BLACK  L"\u29d4"
+#define UNITEXT_TIMES_WITH_LEFT_HALF_BLACK  U"\u29d4"
 #define UNICODE_TIMES_WITH_RIGHT_HALF_BLACK  0x29d5
-#define UNITEXT_TIMES_WITH_RIGHT_HALF_BLACK  L"\u29d5"
+#define UNITEXT_TIMES_WITH_RIGHT_HALF_BLACK  U"\u29d5"
 #define UNICODE_WHITE_HOURGLASS  0x29d6
-#define UNITEXT_WHITE_HOURGLASS  L"\u29d6"
+#define UNITEXT_WHITE_HOURGLASS  U"\u29d6"
 #define UNICODE_BLACK_HOURGLASS  0x29d7
-#define UNITEXT_BLACK_HOURGLASS  L"\u29d7"
+#define UNITEXT_BLACK_HOURGLASS  U"\u29d7"
 #define UNICODE_LEFT_WIGGLY_FENCE  0x29d8
-#define UNITEXT_LEFT_WIGGLY_FENCE  L"\u29d8"
+#define UNITEXT_LEFT_WIGGLY_FENCE  U"\u29d8"
 #define UNICODE_RIGHT_WIGGLY_FENCE  0x29d9
-#define UNITEXT_RIGHT_WIGGLY_FENCE  L"\u29d9"
+#define UNITEXT_RIGHT_WIGGLY_FENCE  U"\u29d9"
 #define UNICODE_LEFT_DOUBLE_WIGGLY_FENCE  0x29da
-#define UNITEXT_LEFT_DOUBLE_WIGGLY_FENCE  L"\u29da"
+#define UNITEXT_LEFT_DOUBLE_WIGGLY_FENCE  U"\u29da"
 #define UNICODE_RIGHT_DOUBLE_WIGGLY_FENCE  0x29db
-#define UNITEXT_RIGHT_DOUBLE_WIGGLY_FENCE  L"\u29db"
+#define UNITEXT_RIGHT_DOUBLE_WIGGLY_FENCE  U"\u29db"
 #define UNICODE_INCOMPLETE_INFINITY  0x29dc
-#define UNITEXT_INCOMPLETE_INFINITY  L"\u29dc"
+#define UNITEXT_INCOMPLETE_INFINITY  U"\u29dc"
 #define UNICODE_TIE_OVER_INFINITY  0x29dd
-#define UNITEXT_TIE_OVER_INFINITY  L"\u29dd"
+#define UNITEXT_TIE_OVER_INFINITY  U"\u29dd"
 #define UNICODE_INFINITY_NEGATED_WITH_VERTICAL_BAR  0x29de
-#define UNITEXT_INFINITY_NEGATED_WITH_VERTICAL_BAR  L"\u29de"
+#define UNITEXT_INFINITY_NEGATED_WITH_VERTICAL_BAR  U"\u29de"
 #define UNICODE_DOUBLE_ENDED_MULTIMAP  0x29df
-#define UNITEXT_DOUBLE_ENDED_MULTIMAP  L"\u29df"
+#define UNITEXT_DOUBLE_ENDED_MULTIMAP  U"\u29df"
 #define UNICODE_SQUARE_WITH_CONTOURED_OUTLINE  0x29e0
-#define UNITEXT_SQUARE_WITH_CONTOURED_OUTLINE  L"\u29e0"
+#define UNITEXT_SQUARE_WITH_CONTOURED_OUTLINE  U"\u29e0"
 #define UNICODE_INCREASES_AS  0x29e1
-#define UNITEXT_INCREASES_AS  L"\u29e1"
+#define UNITEXT_INCREASES_AS  U"\u29e1"
 #define UNICODE_SHUFFLE_PRODUCT  0x29e2
-#define UNITEXT_SHUFFLE_PRODUCT  L"\u29e2"
+#define UNITEXT_SHUFFLE_PRODUCT  U"\u29e2"
 #define UNICODE_EQUALS_SIGN_AND_SLANTED_PARALLEL  0x29e3
-#define UNITEXT_EQUALS_SIGN_AND_SLANTED_PARALLEL  L"\u29e3"
+#define UNITEXT_EQUALS_SIGN_AND_SLANTED_PARALLEL  U"\u29e3"
 #define UNICODE_EQUALS_SIGN_AND_SLANTED_PARALLEL_WITH_TILDE_ABOVE  0x29e4
-#define UNITEXT_EQUALS_SIGN_AND_SLANTED_PARALLEL_WITH_TILDE_ABOVE  L"\u29e4"
+#define UNITEXT_EQUALS_SIGN_AND_SLANTED_PARALLEL_WITH_TILDE_ABOVE  U"\u29e4"
 #define UNICODE_IDENTICAL_TO_AND_SLANTED_PARALLEL  0x29e5
-#define UNITEXT_IDENTICAL_TO_AND_SLANTED_PARALLEL  L"\u29e5"
+#define UNITEXT_IDENTICAL_TO_AND_SLANTED_PARALLEL  U"\u29e5"
 #define UNICODE_GLEICH_STARK  0x29e6
-#define UNITEXT_GLEICH_STARK  L"\u29e6"
+#define UNITEXT_GLEICH_STARK  U"\u29e6"
 #define UNICODE_THERMODYNAMIC  0x29e7
-#define UNITEXT_THERMODYNAMIC  L"\u29e7"
+#define UNITEXT_THERMODYNAMIC  U"\u29e7"
 #define UNICODE_DOWN_POINTING_TRIANGLE_WITH_LEFT_HALF_BLACK  0x29e8
-#define UNITEXT_DOWN_POINTING_TRIANGLE_WITH_LEFT_HALF_BLACK  L"\u29e8"
+#define UNITEXT_DOWN_POINTING_TRIANGLE_WITH_LEFT_HALF_BLACK  U"\u29e8"
 #define UNICODE_DOWN_POINTING_TRIANGLE_WITH_RIGHT_HALF_BLACK  0x29e9
-#define UNITEXT_DOWN_POINTING_TRIANGLE_WITH_RIGHT_HALF_BLACK  L"\u29e9"
+#define UNITEXT_DOWN_POINTING_TRIANGLE_WITH_RIGHT_HALF_BLACK  U"\u29e9"
 #define UNICODE_BLACK_DIAMOND_WITH_DOWN_ARROW  0x29ea
-#define UNITEXT_BLACK_DIAMOND_WITH_DOWN_ARROW  L"\u29ea"
+#define UNITEXT_BLACK_DIAMOND_WITH_DOWN_ARROW  U"\u29ea"
 #define UNICODE_BLACK_LOZENGE  0x29eb
-#define UNITEXT_BLACK_LOZENGE  L"\u29eb"
+#define UNITEXT_BLACK_LOZENGE  U"\u29eb"
 #define UNICODE_WHITE_CIRCLE_WITH_DOWN_ARROW  0x29ec
-#define UNITEXT_WHITE_CIRCLE_WITH_DOWN_ARROW  L"\u29ec"
+#define UNITEXT_WHITE_CIRCLE_WITH_DOWN_ARROW  U"\u29ec"
 #define UNICODE_BLACK_CIRCLE_WITH_DOWN_ARROW  0x29ed
-#define UNITEXT_BLACK_CIRCLE_WITH_DOWN_ARROW  L"\u29ed"
+#define UNITEXT_BLACK_CIRCLE_WITH_DOWN_ARROW  U"\u29ed"
 #define UNICODE_ERROR_BARRED_WHITE_SQUARE  0x29ee
-#define UNITEXT_ERROR_BARRED_WHITE_SQUARE  L"\u29ee"
+#define UNITEXT_ERROR_BARRED_WHITE_SQUARE  U"\u29ee"
 #define UNICODE_ERROR_BARRED_BLACK_SQUARE  0x29ef
-#define UNITEXT_ERROR_BARRED_BLACK_SQUARE  L"\u29ef"
+#define UNITEXT_ERROR_BARRED_BLACK_SQUARE  U"\u29ef"
 #define UNICODE_ERROR_BARRED_WHITE_DIAMOND  0x29f0
-#define UNITEXT_ERROR_BARRED_WHITE_DIAMOND  L"\u29f0"
+#define UNITEXT_ERROR_BARRED_WHITE_DIAMOND  U"\u29f0"
 #define UNICODE_ERROR_BARRED_BLACK_DIAMOND  0x29f1
-#define UNITEXT_ERROR_BARRED_BLACK_DIAMOND  L"\u29f1"
+#define UNITEXT_ERROR_BARRED_BLACK_DIAMOND  U"\u29f1"
 #define UNICODE_ERROR_BARRED_WHITE_CIRCLE  0x29f2
-#define UNITEXT_ERROR_BARRED_WHITE_CIRCLE  L"\u29f2"
+#define UNITEXT_ERROR_BARRED_WHITE_CIRCLE  U"\u29f2"
 #define UNICODE_ERROR_BARRED_BLACK_CIRCLE  0x29f3
-#define UNITEXT_ERROR_BARRED_BLACK_CIRCLE  L"\u29f3"
+#define UNITEXT_ERROR_BARRED_BLACK_CIRCLE  U"\u29f3"
 #define UNICODE_RULE_DELAYED  0x29f4
-#define UNITEXT_RULE_DELAYED  L"\u29f4"
+#define UNITEXT_RULE_DELAYED  U"\u29f4"
 #define UNICODE_REVERSE_SOLIDUS_OPERATOR  0x29f5
-#define UNITEXT_REVERSE_SOLIDUS_OPERATOR  L"\u29f5"
+#define UNITEXT_REVERSE_SOLIDUS_OPERATOR  U"\u29f5"
 #define UNICODE_SOLIDUS_WITH_OVERBAR  0x29f6
-#define UNITEXT_SOLIDUS_WITH_OVERBAR  L"\u29f6"
+#define UNITEXT_SOLIDUS_WITH_OVERBAR  U"\u29f6"
 #define UNICODE_REVERSE_SOLIDUS_WITH_HORIZONTAL_STROKE  0x29f7
-#define UNITEXT_REVERSE_SOLIDUS_WITH_HORIZONTAL_STROKE  L"\u29f7"
+#define UNITEXT_REVERSE_SOLIDUS_WITH_HORIZONTAL_STROKE  U"\u29f7"
 #define UNICODE_BIG_SOLIDUS  0x29f8
-#define UNITEXT_BIG_SOLIDUS  L"\u29f8"
+#define UNITEXT_BIG_SOLIDUS  U"\u29f8"
 #define UNICODE_BIG_REVERSE_SOLIDUS  0x29f9
-#define UNITEXT_BIG_REVERSE_SOLIDUS  L"\u29f9"
+#define UNITEXT_BIG_REVERSE_SOLIDUS  U"\u29f9"
 #define UNICODE_DOUBLE_PLUS  0x29fa
-#define UNITEXT_DOUBLE_PLUS  L"\u29fa"
+#define UNITEXT_DOUBLE_PLUS  U"\u29fa"
 #define UNICODE_TRIPLE_PLUS  0x29fb
-#define UNITEXT_TRIPLE_PLUS  L"\u29fb"
+#define UNITEXT_TRIPLE_PLUS  U"\u29fb"
 #define UNICODE_LEFT_POINTING_CURVED_ANGLE_BRACKET  0x29fc
-#define UNITEXT_LEFT_POINTING_CURVED_ANGLE_BRACKET  L"\u29fc"
+#define UNITEXT_LEFT_POINTING_CURVED_ANGLE_BRACKET  U"\u29fc"
 #define UNICODE_RIGHT_POINTING_CURVED_ANGLE_BRACKET  0x29fd
-#define UNITEXT_RIGHT_POINTING_CURVED_ANGLE_BRACKET  L"\u29fd"
+#define UNITEXT_RIGHT_POINTING_CURVED_ANGLE_BRACKET  U"\u29fd"
 #define UNICODE_TINY  0x29fe
-#define UNITEXT_TINY  L"\u29fe"
+#define UNITEXT_TINY  U"\u29fe"
 #define UNICODE_MINY  0x29ff
-#define UNITEXT_MINY  L"\u29ff"
+#define UNITEXT_MINY  U"\u29ff"
 #define UNICODE_N_ARY_CIRCLED_DOT_OPERATOR  0x2a00
-#define UNITEXT_N_ARY_CIRCLED_DOT_OPERATOR  L"\u2a00"
+#define UNITEXT_N_ARY_CIRCLED_DOT_OPERATOR  U"\u2a00"
 #define UNICODE_N_ARY_CIRCLED_PLUS_OPERATOR  0x2a01
-#define UNITEXT_N_ARY_CIRCLED_PLUS_OPERATOR  L"\u2a01"
+#define UNITEXT_N_ARY_CIRCLED_PLUS_OPERATOR  U"\u2a01"
 #define UNICODE_N_ARY_CIRCLED_TIMES_OPERATOR  0x2a02
-#define UNITEXT_N_ARY_CIRCLED_TIMES_OPERATOR  L"\u2a02"
+#define UNITEXT_N_ARY_CIRCLED_TIMES_OPERATOR  U"\u2a02"
 #define UNICODE_N_ARY_UNION_OPERATOR_WITH_DOT  0x2a03
-#define UNITEXT_N_ARY_UNION_OPERATOR_WITH_DOT  L"\u2a03"
+#define UNITEXT_N_ARY_UNION_OPERATOR_WITH_DOT  U"\u2a03"
 #define UNICODE_N_ARY_UNION_OPERATOR_WITH_PLUS  0x2a04
-#define UNITEXT_N_ARY_UNION_OPERATOR_WITH_PLUS  L"\u2a04"
+#define UNITEXT_N_ARY_UNION_OPERATOR_WITH_PLUS  U"\u2a04"
 #define UNICODE_N_ARY_SQUARE_INTERSECTION_OPERATOR  0x2a05
-#define UNITEXT_N_ARY_SQUARE_INTERSECTION_OPERATOR  L"\u2a05"
+#define UNITEXT_N_ARY_SQUARE_INTERSECTION_OPERATOR  U"\u2a05"
 #define UNICODE_N_ARY_SQUARE_UNION_OPERATOR  0x2a06
-#define UNITEXT_N_ARY_SQUARE_UNION_OPERATOR  L"\u2a06"
+#define UNITEXT_N_ARY_SQUARE_UNION_OPERATOR  U"\u2a06"
 #define UNICODE_TWO_LOGICAL_AND_OPERATOR  0x2a07
-#define UNITEXT_TWO_LOGICAL_AND_OPERATOR  L"\u2a07"
+#define UNITEXT_TWO_LOGICAL_AND_OPERATOR  U"\u2a07"
 #define UNICODE_TWO_LOGICAL_OR_OPERATOR  0x2a08
-#define UNITEXT_TWO_LOGICAL_OR_OPERATOR  L"\u2a08"
+#define UNITEXT_TWO_LOGICAL_OR_OPERATOR  U"\u2a08"
 #define UNICODE_N_ARY_TIMES_OPERATOR  0x2a09
-#define UNITEXT_N_ARY_TIMES_OPERATOR  L"\u2a09"
+#define UNITEXT_N_ARY_TIMES_OPERATOR  U"\u2a09"
 #define UNICODE_MODULO_TWO_SUM  0x2a0a
-#define UNITEXT_MODULO_TWO_SUM  L"\u2a0a"
+#define UNITEXT_MODULO_TWO_SUM  U"\u2a0a"
 #define UNICODE_SUMMATION_WITH_INTEGRAL  0x2a0b
-#define UNITEXT_SUMMATION_WITH_INTEGRAL  L"\u2a0b"
+#define UNITEXT_SUMMATION_WITH_INTEGRAL  U"\u2a0b"
 #define UNICODE_QUADRUPLE_INTEGRAL_OPERATOR  0x2a0c
-#define UNITEXT_QUADRUPLE_INTEGRAL_OPERATOR  L"\u2a0c"
+#define UNITEXT_QUADRUPLE_INTEGRAL_OPERATOR  U"\u2a0c"
 #define UNICODE_FINITE_PART_INTEGRAL  0x2a0d
-#define UNITEXT_FINITE_PART_INTEGRAL  L"\u2a0d"
+#define UNITEXT_FINITE_PART_INTEGRAL  U"\u2a0d"
 #define UNICODE_INTEGRAL_WITH_DOUBLE_STROKE  0x2a0e
-#define UNITEXT_INTEGRAL_WITH_DOUBLE_STROKE  L"\u2a0e"
+#define UNITEXT_INTEGRAL_WITH_DOUBLE_STROKE  U"\u2a0e"
 #define UNICODE_INTEGRAL_AVERAGE_WITH_SLASH  0x2a0f
-#define UNITEXT_INTEGRAL_AVERAGE_WITH_SLASH  L"\u2a0f"
+#define UNITEXT_INTEGRAL_AVERAGE_WITH_SLASH  U"\u2a0f"
 #define UNICODE_CIRCULATION_FUNCTION  0x2a10
-#define UNITEXT_CIRCULATION_FUNCTION  L"\u2a10"
+#define UNITEXT_CIRCULATION_FUNCTION  U"\u2a10"
 #define UNICODE_ANTICLOCKWISE_INTEGRATION  0x2a11
-#define UNITEXT_ANTICLOCKWISE_INTEGRATION  L"\u2a11"
+#define UNITEXT_ANTICLOCKWISE_INTEGRATION  U"\u2a11"
 #define UNICODE_LINE_INTEGRATION_WITH_RECTANGULAR_PATH_AROUND_POLE  0x2a12
-#define UNITEXT_LINE_INTEGRATION_WITH_RECTANGULAR_PATH_AROUND_POLE  L"\u2a12"
+#define UNITEXT_LINE_INTEGRATION_WITH_RECTANGULAR_PATH_AROUND_POLE  U"\u2a12"
 #define UNICODE_LINE_INTEGRATION_WITH_SEMICIRCULAR_PATH_AROUND_POLE  0x2a13
-#define UNITEXT_LINE_INTEGRATION_WITH_SEMICIRCULAR_PATH_AROUND_POLE  L"\u2a13"
+#define UNITEXT_LINE_INTEGRATION_WITH_SEMICIRCULAR_PATH_AROUND_POLE  U"\u2a13"
 #define UNICODE_LINE_INTEGRATION_NOT_INCLUDING_THE_POLE  0x2a14
-#define UNITEXT_LINE_INTEGRATION_NOT_INCLUDING_THE_POLE  L"\u2a14"
+#define UNITEXT_LINE_INTEGRATION_NOT_INCLUDING_THE_POLE  U"\u2a14"
 #define UNICODE_INTEGRAL_AROUND_A_POINT_OPERATOR  0x2a15
-#define UNITEXT_INTEGRAL_AROUND_A_POINT_OPERATOR  L"\u2a15"
+#define UNITEXT_INTEGRAL_AROUND_A_POINT_OPERATOR  U"\u2a15"
 #define UNICODE_QUATERNION_INTEGRAL_OPERATOR  0x2a16
-#define UNITEXT_QUATERNION_INTEGRAL_OPERATOR  L"\u2a16"
+#define UNITEXT_QUATERNION_INTEGRAL_OPERATOR  U"\u2a16"
 #define UNICODE_INTEGRAL_WITH_LEFTWARDS_ARROW_WITH_HOOK  0x2a17
-#define UNITEXT_INTEGRAL_WITH_LEFTWARDS_ARROW_WITH_HOOK  L"\u2a17"
+#define UNITEXT_INTEGRAL_WITH_LEFTWARDS_ARROW_WITH_HOOK  U"\u2a17"
 #define UNICODE_INTEGRAL_WITH_TIMES_SIGN  0x2a18
-#define UNITEXT_INTEGRAL_WITH_TIMES_SIGN  L"\u2a18"
+#define UNITEXT_INTEGRAL_WITH_TIMES_SIGN  U"\u2a18"
 #define UNICODE_INTEGRAL_WITH_INTERSECTION  0x2a19
-#define UNITEXT_INTEGRAL_WITH_INTERSECTION  L"\u2a19"
+#define UNITEXT_INTEGRAL_WITH_INTERSECTION  U"\u2a19"
 #define UNICODE_INTEGRAL_WITH_UNION  0x2a1a
-#define UNITEXT_INTEGRAL_WITH_UNION  L"\u2a1a"
+#define UNITEXT_INTEGRAL_WITH_UNION  U"\u2a1a"
 #define UNICODE_INTEGRAL_WITH_OVERBAR  0x2a1b
-#define UNITEXT_INTEGRAL_WITH_OVERBAR  L"\u2a1b"
+#define UNITEXT_INTEGRAL_WITH_OVERBAR  U"\u2a1b"
 #define UNICODE_INTEGRAL_WITH_UNDERBAR  0x2a1c
-#define UNITEXT_INTEGRAL_WITH_UNDERBAR  L"\u2a1c"
+#define UNITEXT_INTEGRAL_WITH_UNDERBAR  U"\u2a1c"
 #define UNICODE_JOIN  0x2a1d
-#define UNITEXT_JOIN  L"\u2a1d"
+#define UNITEXT_JOIN  U"\u2a1d"
 #define UNICODE_LARGE_LEFT_TRIANGLE_OPERATOR  0x2a1e
-#define UNITEXT_LARGE_LEFT_TRIANGLE_OPERATOR  L"\u2a1e"
+#define UNITEXT_LARGE_LEFT_TRIANGLE_OPERATOR  U"\u2a1e"
 #define UNICODE_Z_NOTATION_SCHEMA_COMPOSITION  0x2a1f
-#define UNITEXT_Z_NOTATION_SCHEMA_COMPOSITION  L"\u2a1f"
+#define UNITEXT_Z_NOTATION_SCHEMA_COMPOSITION  U"\u2a1f"
 #define UNICODE_Z_NOTATION_SCHEMA_PIPING  0x2a20
-#define UNITEXT_Z_NOTATION_SCHEMA_PIPING  L"\u2a20"
+#define UNITEXT_Z_NOTATION_SCHEMA_PIPING  U"\u2a20"
 #define UNICODE_Z_NOTATION_SCHEMA_PROJECTION  0x2a21
-#define UNITEXT_Z_NOTATION_SCHEMA_PROJECTION  L"\u2a21"
+#define UNITEXT_Z_NOTATION_SCHEMA_PROJECTION  U"\u2a21"
 #define UNICODE_PLUS_SIGN_WITH_SMALL_CIRCLE_ABOVE  0x2a22
-#define UNITEXT_PLUS_SIGN_WITH_SMALL_CIRCLE_ABOVE  L"\u2a22"
+#define UNITEXT_PLUS_SIGN_WITH_SMALL_CIRCLE_ABOVE  U"\u2a22"
 #define UNICODE_PLUS_SIGN_WITH_CIRCUMFLEX_ACCENT_ABOVE  0x2a23
-#define UNITEXT_PLUS_SIGN_WITH_CIRCUMFLEX_ACCENT_ABOVE  L"\u2a23"
+#define UNITEXT_PLUS_SIGN_WITH_CIRCUMFLEX_ACCENT_ABOVE  U"\u2a23"
 #define UNICODE_PLUS_SIGN_WITH_TILDE_ABOVE  0x2a24
-#define UNITEXT_PLUS_SIGN_WITH_TILDE_ABOVE  L"\u2a24"
+#define UNITEXT_PLUS_SIGN_WITH_TILDE_ABOVE  U"\u2a24"
 #define UNICODE_PLUS_SIGN_WITH_DOT_BELOW  0x2a25
-#define UNITEXT_PLUS_SIGN_WITH_DOT_BELOW  L"\u2a25"
+#define UNITEXT_PLUS_SIGN_WITH_DOT_BELOW  U"\u2a25"
 #define UNICODE_PLUS_SIGN_WITH_TILDE_BELOW  0x2a26
-#define UNITEXT_PLUS_SIGN_WITH_TILDE_BELOW  L"\u2a26"
+#define UNITEXT_PLUS_SIGN_WITH_TILDE_BELOW  U"\u2a26"
 #define UNICODE_PLUS_SIGN_WITH_SUBSCRIPT_TWO  0x2a27
-#define UNITEXT_PLUS_SIGN_WITH_SUBSCRIPT_TWO  L"\u2a27"
+#define UNITEXT_PLUS_SIGN_WITH_SUBSCRIPT_TWO  U"\u2a27"
 #define UNICODE_PLUS_SIGN_WITH_BLACK_TRIANGLE  0x2a28
-#define UNITEXT_PLUS_SIGN_WITH_BLACK_TRIANGLE  L"\u2a28"
+#define UNITEXT_PLUS_SIGN_WITH_BLACK_TRIANGLE  U"\u2a28"
 #define UNICODE_MINUS_SIGN_WITH_COMMA_ABOVE  0x2a29
-#define UNITEXT_MINUS_SIGN_WITH_COMMA_ABOVE  L"\u2a29"
+#define UNITEXT_MINUS_SIGN_WITH_COMMA_ABOVE  U"\u2a29"
 #define UNICODE_MINUS_SIGN_WITH_DOT_BELOW  0x2a2a
-#define UNITEXT_MINUS_SIGN_WITH_DOT_BELOW  L"\u2a2a"
+#define UNITEXT_MINUS_SIGN_WITH_DOT_BELOW  U"\u2a2a"
 #define UNICODE_MINUS_SIGN_WITH_FALLING_DOTS  0x2a2b
-#define UNITEXT_MINUS_SIGN_WITH_FALLING_DOTS  L"\u2a2b"
+#define UNITEXT_MINUS_SIGN_WITH_FALLING_DOTS  U"\u2a2b"
 #define UNICODE_MINUS_SIGN_WITH_RISING_DOTS  0x2a2c
-#define UNITEXT_MINUS_SIGN_WITH_RISING_DOTS  L"\u2a2c"
+#define UNITEXT_MINUS_SIGN_WITH_RISING_DOTS  U"\u2a2c"
 #define UNICODE_PLUS_SIGN_IN_LEFT_HALF_CIRCLE  0x2a2d
-#define UNITEXT_PLUS_SIGN_IN_LEFT_HALF_CIRCLE  L"\u2a2d"
+#define UNITEXT_PLUS_SIGN_IN_LEFT_HALF_CIRCLE  U"\u2a2d"
 #define UNICODE_PLUS_SIGN_IN_RIGHT_HALF_CIRCLE  0x2a2e
-#define UNITEXT_PLUS_SIGN_IN_RIGHT_HALF_CIRCLE  L"\u2a2e"
+#define UNITEXT_PLUS_SIGN_IN_RIGHT_HALF_CIRCLE  U"\u2a2e"
 #define UNICODE_VECTOR_OR_CROSS_PRODUCT  0x2a2f
-#define UNITEXT_VECTOR_OR_CROSS_PRODUCT  L"\u2a2f"
+#define UNITEXT_VECTOR_OR_CROSS_PRODUCT  U"\u2a2f"
 #define UNICODE_MULTIPLICATION_SIGN_WITH_DOT_ABOVE  0x2a30
-#define UNITEXT_MULTIPLICATION_SIGN_WITH_DOT_ABOVE  L"\u2a30"
+#define UNITEXT_MULTIPLICATION_SIGN_WITH_DOT_ABOVE  U"\u2a30"
 #define UNICODE_MULTIPLICATION_SIGN_WITH_UNDERBAR  0x2a31
-#define UNITEXT_MULTIPLICATION_SIGN_WITH_UNDERBAR  L"\u2a31"
+#define UNITEXT_MULTIPLICATION_SIGN_WITH_UNDERBAR  U"\u2a31"
 #define UNICODE_SEMIDIRECT_PRODUCT_WITH_BOTTOM_CLOSED  0x2a32
-#define UNITEXT_SEMIDIRECT_PRODUCT_WITH_BOTTOM_CLOSED  L"\u2a32"
+#define UNITEXT_SEMIDIRECT_PRODUCT_WITH_BOTTOM_CLOSED  U"\u2a32"
 #define UNICODE_SMASH_PRODUCT  0x2a33
-#define UNITEXT_SMASH_PRODUCT  L"\u2a33"
+#define UNITEXT_SMASH_PRODUCT  U"\u2a33"
 #define UNICODE_MULTIPLICATION_SIGN_IN_LEFT_HALF_CIRCLE  0x2a34
-#define UNITEXT_MULTIPLICATION_SIGN_IN_LEFT_HALF_CIRCLE  L"\u2a34"
+#define UNITEXT_MULTIPLICATION_SIGN_IN_LEFT_HALF_CIRCLE  U"\u2a34"
 #define UNICODE_MULTIPLICATION_SIGN_IN_RIGHT_HALF_CIRCLE  0x2a35
-#define UNITEXT_MULTIPLICATION_SIGN_IN_RIGHT_HALF_CIRCLE  L"\u2a35"
+#define UNITEXT_MULTIPLICATION_SIGN_IN_RIGHT_HALF_CIRCLE  U"\u2a35"
 #define UNICODE_CIRCLED_MULTIPLICATION_SIGN_WITH_CIRCUMFLEX_ACCENT  0x2a36
-#define UNITEXT_CIRCLED_MULTIPLICATION_SIGN_WITH_CIRCUMFLEX_ACCENT  L"\u2a36"
+#define UNITEXT_CIRCLED_MULTIPLICATION_SIGN_WITH_CIRCUMFLEX_ACCENT  U"\u2a36"
 #define UNICODE_MULTIPLICATION_SIGN_IN_DOUBLE_CIRCLE  0x2a37
-#define UNITEXT_MULTIPLICATION_SIGN_IN_DOUBLE_CIRCLE  L"\u2a37"
+#define UNITEXT_MULTIPLICATION_SIGN_IN_DOUBLE_CIRCLE  U"\u2a37"
 #define UNICODE_CIRCLED_DIVISION_SIGN  0x2a38
-#define UNITEXT_CIRCLED_DIVISION_SIGN  L"\u2a38"
+#define UNITEXT_CIRCLED_DIVISION_SIGN  U"\u2a38"
 #define UNICODE_PLUS_SIGN_IN_TRIANGLE  0x2a39
-#define UNITEXT_PLUS_SIGN_IN_TRIANGLE  L"\u2a39"
+#define UNITEXT_PLUS_SIGN_IN_TRIANGLE  U"\u2a39"
 #define UNICODE_MINUS_SIGN_IN_TRIANGLE  0x2a3a
-#define UNITEXT_MINUS_SIGN_IN_TRIANGLE  L"\u2a3a"
+#define UNITEXT_MINUS_SIGN_IN_TRIANGLE  U"\u2a3a"
 #define UNICODE_MULTIPLICATION_SIGN_IN_TRIANGLE  0x2a3b
-#define UNITEXT_MULTIPLICATION_SIGN_IN_TRIANGLE  L"\u2a3b"
+#define UNITEXT_MULTIPLICATION_SIGN_IN_TRIANGLE  U"\u2a3b"
 #define UNICODE_INTERIOR_PRODUCT  0x2a3c
-#define UNITEXT_INTERIOR_PRODUCT  L"\u2a3c"
+#define UNITEXT_INTERIOR_PRODUCT  U"\u2a3c"
 #define UNICODE_RIGHTHAND_INTERIOR_PRODUCT  0x2a3d
-#define UNITEXT_RIGHTHAND_INTERIOR_PRODUCT  L"\u2a3d"
+#define UNITEXT_RIGHTHAND_INTERIOR_PRODUCT  U"\u2a3d"
 #define UNICODE_Z_NOTATION_RELATIONAL_COMPOSITION  0x2a3e
-#define UNITEXT_Z_NOTATION_RELATIONAL_COMPOSITION  L"\u2a3e"
+#define UNITEXT_Z_NOTATION_RELATIONAL_COMPOSITION  U"\u2a3e"
 #define UNICODE_AMALGAMATION_OR_COPRODUCT  0x2a3f
-#define UNITEXT_AMALGAMATION_OR_COPRODUCT  L"\u2a3f"
+#define UNITEXT_AMALGAMATION_OR_COPRODUCT  U"\u2a3f"
 #define UNICODE_INTERSECTION_WITH_DOT  0x2a40
-#define UNITEXT_INTERSECTION_WITH_DOT  L"\u2a40"
+#define UNITEXT_INTERSECTION_WITH_DOT  U"\u2a40"
 #define UNICODE_UNION_WITH_MINUS_SIGN  0x2a41
-#define UNITEXT_UNION_WITH_MINUS_SIGN  L"\u2a41"
+#define UNITEXT_UNION_WITH_MINUS_SIGN  U"\u2a41"
 #define UNICODE_UNION_WITH_OVERBAR  0x2a42
-#define UNITEXT_UNION_WITH_OVERBAR  L"\u2a42"
+#define UNITEXT_UNION_WITH_OVERBAR  U"\u2a42"
 #define UNICODE_INTERSECTION_WITH_OVERBAR  0x2a43
-#define UNITEXT_INTERSECTION_WITH_OVERBAR  L"\u2a43"
+#define UNITEXT_INTERSECTION_WITH_OVERBAR  U"\u2a43"
 #define UNICODE_INTERSECTION_WITH_LOGICAL_AND  0x2a44
-#define UNITEXT_INTERSECTION_WITH_LOGICAL_AND  L"\u2a44"
+#define UNITEXT_INTERSECTION_WITH_LOGICAL_AND  U"\u2a44"
 #define UNICODE_UNION_WITH_LOGICAL_OR  0x2a45
-#define UNITEXT_UNION_WITH_LOGICAL_OR  L"\u2a45"
+#define UNITEXT_UNION_WITH_LOGICAL_OR  U"\u2a45"
 #define UNICODE_UNION_ABOVE_INTERSECTION  0x2a46
-#define UNITEXT_UNION_ABOVE_INTERSECTION  L"\u2a46"
+#define UNITEXT_UNION_ABOVE_INTERSECTION  U"\u2a46"
 #define UNICODE_INTERSECTION_ABOVE_UNION  0x2a47
-#define UNITEXT_INTERSECTION_ABOVE_UNION  L"\u2a47"
+#define UNITEXT_INTERSECTION_ABOVE_UNION  U"\u2a47"
 #define UNICODE_UNION_ABOVE_BAR_ABOVE_INTERSECTION  0x2a48
-#define UNITEXT_UNION_ABOVE_BAR_ABOVE_INTERSECTION  L"\u2a48"
+#define UNITEXT_UNION_ABOVE_BAR_ABOVE_INTERSECTION  U"\u2a48"
 #define UNICODE_INTERSECTION_ABOVE_BAR_ABOVE_UNION  0x2a49
-#define UNITEXT_INTERSECTION_ABOVE_BAR_ABOVE_UNION  L"\u2a49"
+#define UNITEXT_INTERSECTION_ABOVE_BAR_ABOVE_UNION  U"\u2a49"
 #define UNICODE_UNION_BESIDE_AND_JOINED_WITH_UNION  0x2a4a
-#define UNITEXT_UNION_BESIDE_AND_JOINED_WITH_UNION  L"\u2a4a"
+#define UNITEXT_UNION_BESIDE_AND_JOINED_WITH_UNION  U"\u2a4a"
 #define UNICODE_INTERSECTION_BESIDE_AND_JOINED_WITH_INTERSECTION  0x2a4b
-#define UNITEXT_INTERSECTION_BESIDE_AND_JOINED_WITH_INTERSECTION  L"\u2a4b"
+#define UNITEXT_INTERSECTION_BESIDE_AND_JOINED_WITH_INTERSECTION  U"\u2a4b"
 #define UNICODE_CLOSED_UNION_WITH_SERIFS  0x2a4c
-#define UNITEXT_CLOSED_UNION_WITH_SERIFS  L"\u2a4c"
+#define UNITEXT_CLOSED_UNION_WITH_SERIFS  U"\u2a4c"
 #define UNICODE_CLOSED_INTERSECTION_WITH_SERIFS  0x2a4d
-#define UNITEXT_CLOSED_INTERSECTION_WITH_SERIFS  L"\u2a4d"
+#define UNITEXT_CLOSED_INTERSECTION_WITH_SERIFS  U"\u2a4d"
 #define UNICODE_DOUBLE_SQUARE_INTERSECTION  0x2a4e
-#define UNITEXT_DOUBLE_SQUARE_INTERSECTION  L"\u2a4e"
+#define UNITEXT_DOUBLE_SQUARE_INTERSECTION  U"\u2a4e"
 #define UNICODE_DOUBLE_SQUARE_UNION  0x2a4f
-#define UNITEXT_DOUBLE_SQUARE_UNION  L"\u2a4f"
+#define UNITEXT_DOUBLE_SQUARE_UNION  U"\u2a4f"
 #define UNICODE_CLOSED_UNION_WITH_SERIFS_AND_SMASH_PRODUCT  0x2a50
-#define UNITEXT_CLOSED_UNION_WITH_SERIFS_AND_SMASH_PRODUCT  L"\u2a50"
+#define UNITEXT_CLOSED_UNION_WITH_SERIFS_AND_SMASH_PRODUCT  U"\u2a50"
 #define UNICODE_LOGICAL_AND_WITH_DOT_ABOVE  0x2a51
-#define UNITEXT_LOGICAL_AND_WITH_DOT_ABOVE  L"\u2a51"
+#define UNITEXT_LOGICAL_AND_WITH_DOT_ABOVE  U"\u2a51"
 #define UNICODE_LOGICAL_OR_WITH_DOT_ABOVE  0x2a52
-#define UNITEXT_LOGICAL_OR_WITH_DOT_ABOVE  L"\u2a52"
+#define UNITEXT_LOGICAL_OR_WITH_DOT_ABOVE  U"\u2a52"
 #define UNICODE_DOUBLE_LOGICAL_AND  0x2a53
-#define UNITEXT_DOUBLE_LOGICAL_AND  L"\u2a53"
+#define UNITEXT_DOUBLE_LOGICAL_AND  U"\u2a53"
 #define UNICODE_DOUBLE_LOGICAL_OR  0x2a54
-#define UNITEXT_DOUBLE_LOGICAL_OR  L"\u2a54"
+#define UNITEXT_DOUBLE_LOGICAL_OR  U"\u2a54"
 #define UNICODE_TWO_INTERSECTING_LOGICAL_AND  0x2a55
-#define UNITEXT_TWO_INTERSECTING_LOGICAL_AND  L"\u2a55"
+#define UNITEXT_TWO_INTERSECTING_LOGICAL_AND  U"\u2a55"
 #define UNICODE_TWO_INTERSECTING_LOGICAL_OR  0x2a56
-#define UNITEXT_TWO_INTERSECTING_LOGICAL_OR  L"\u2a56"
+#define UNITEXT_TWO_INTERSECTING_LOGICAL_OR  U"\u2a56"
 #define UNICODE_SLOPING_LARGE_OR  0x2a57
-#define UNITEXT_SLOPING_LARGE_OR  L"\u2a57"
+#define UNITEXT_SLOPING_LARGE_OR  U"\u2a57"
 #define UNICODE_SLOPING_LARGE_AND  0x2a58
-#define UNITEXT_SLOPING_LARGE_AND  L"\u2a58"
+#define UNITEXT_SLOPING_LARGE_AND  U"\u2a58"
 #define UNICODE_LOGICAL_OR_OVERLAPPING_LOGICAL_AND  0x2a59
-#define UNITEXT_LOGICAL_OR_OVERLAPPING_LOGICAL_AND  L"\u2a59"
+#define UNITEXT_LOGICAL_OR_OVERLAPPING_LOGICAL_AND  U"\u2a59"
 #define UNICODE_LOGICAL_AND_WITH_MIDDLE_STEM  0x2a5a
-#define UNITEXT_LOGICAL_AND_WITH_MIDDLE_STEM  L"\u2a5a"
+#define UNITEXT_LOGICAL_AND_WITH_MIDDLE_STEM  U"\u2a5a"
 #define UNICODE_LOGICAL_OR_WITH_MIDDLE_STEM  0x2a5b
-#define UNITEXT_LOGICAL_OR_WITH_MIDDLE_STEM  L"\u2a5b"
+#define UNITEXT_LOGICAL_OR_WITH_MIDDLE_STEM  U"\u2a5b"
 #define UNICODE_LOGICAL_AND_WITH_HORIZONTAL_DASH  0x2a5c
-#define UNITEXT_LOGICAL_AND_WITH_HORIZONTAL_DASH  L"\u2a5c"
+#define UNITEXT_LOGICAL_AND_WITH_HORIZONTAL_DASH  U"\u2a5c"
 #define UNICODE_LOGICAL_OR_WITH_HORIZONTAL_DASH  0x2a5d
-#define UNITEXT_LOGICAL_OR_WITH_HORIZONTAL_DASH  L"\u2a5d"
+#define UNITEXT_LOGICAL_OR_WITH_HORIZONTAL_DASH  U"\u2a5d"
 #define UNICODE_LOGICAL_AND_WITH_DOUBLE_OVERBAR  0x2a5e
-#define UNITEXT_LOGICAL_AND_WITH_DOUBLE_OVERBAR  L"\u2a5e"
+#define UNITEXT_LOGICAL_AND_WITH_DOUBLE_OVERBAR  U"\u2a5e"
 #define UNICODE_LOGICAL_AND_WITH_UNDERBAR  0x2a5f
-#define UNITEXT_LOGICAL_AND_WITH_UNDERBAR  L"\u2a5f"
+#define UNITEXT_LOGICAL_AND_WITH_UNDERBAR  U"\u2a5f"
 #define UNICODE_LOGICAL_AND_WITH_DOUBLE_UNDERBAR  0x2a60
-#define UNITEXT_LOGICAL_AND_WITH_DOUBLE_UNDERBAR  L"\u2a60"
+#define UNITEXT_LOGICAL_AND_WITH_DOUBLE_UNDERBAR  U"\u2a60"
 #define UNICODE_SMALL_VEE_WITH_UNDERBAR  0x2a61
-#define UNITEXT_SMALL_VEE_WITH_UNDERBAR  L"\u2a61"
+#define UNITEXT_SMALL_VEE_WITH_UNDERBAR  U"\u2a61"
 #define UNICODE_LOGICAL_OR_WITH_DOUBLE_OVERBAR  0x2a62
-#define UNITEXT_LOGICAL_OR_WITH_DOUBLE_OVERBAR  L"\u2a62"
+#define UNITEXT_LOGICAL_OR_WITH_DOUBLE_OVERBAR  U"\u2a62"
 #define UNICODE_LOGICAL_OR_WITH_DOUBLE_UNDERBAR  0x2a63
-#define UNITEXT_LOGICAL_OR_WITH_DOUBLE_UNDERBAR  L"\u2a63"
+#define UNITEXT_LOGICAL_OR_WITH_DOUBLE_UNDERBAR  U"\u2a63"
 #define UNICODE_Z_NOTATION_DOMAIN_ANTIRESTRICTION  0x2a64
-#define UNITEXT_Z_NOTATION_DOMAIN_ANTIRESTRICTION  L"\u2a64"
+#define UNITEXT_Z_NOTATION_DOMAIN_ANTIRESTRICTION  U"\u2a64"
 #define UNICODE_Z_NOTATION_RANGE_ANTIRESTRICTION  0x2a65
-#define UNITEXT_Z_NOTATION_RANGE_ANTIRESTRICTION  L"\u2a65"
+#define UNITEXT_Z_NOTATION_RANGE_ANTIRESTRICTION  U"\u2a65"
 #define UNICODE_EQUALS_SIGN_WITH_DOT_BELOW  0x2a66
-#define UNITEXT_EQUALS_SIGN_WITH_DOT_BELOW  L"\u2a66"
+#define UNITEXT_EQUALS_SIGN_WITH_DOT_BELOW  U"\u2a66"
 #define UNICODE_IDENTICAL_WITH_DOT_ABOVE  0x2a67
-#define UNITEXT_IDENTICAL_WITH_DOT_ABOVE  L"\u2a67"
+#define UNITEXT_IDENTICAL_WITH_DOT_ABOVE  U"\u2a67"
 #define UNICODE_TRIPLE_HORIZONTAL_BAR_WITH_DOUBLE_VERTICAL_STROKE  0x2a68
-#define UNITEXT_TRIPLE_HORIZONTAL_BAR_WITH_DOUBLE_VERTICAL_STROKE  L"\u2a68"
+#define UNITEXT_TRIPLE_HORIZONTAL_BAR_WITH_DOUBLE_VERTICAL_STROKE  U"\u2a68"
 #define UNICODE_TRIPLE_HORIZONTAL_BAR_WITH_TRIPLE_VERTICAL_STROKE  0x2a69
-#define UNITEXT_TRIPLE_HORIZONTAL_BAR_WITH_TRIPLE_VERTICAL_STROKE  L"\u2a69"
+#define UNITEXT_TRIPLE_HORIZONTAL_BAR_WITH_TRIPLE_VERTICAL_STROKE  U"\u2a69"
 #define UNICODE_TILDE_OPERATOR_WITH_DOT_ABOVE  0x2a6a
-#define UNITEXT_TILDE_OPERATOR_WITH_DOT_ABOVE  L"\u2a6a"
+#define UNITEXT_TILDE_OPERATOR_WITH_DOT_ABOVE  U"\u2a6a"
 #define UNICODE_TILDE_OPERATOR_WITH_RISING_DOTS  0x2a6b
-#define UNITEXT_TILDE_OPERATOR_WITH_RISING_DOTS  L"\u2a6b"
+#define UNITEXT_TILDE_OPERATOR_WITH_RISING_DOTS  U"\u2a6b"
 #define UNICODE_SIMILAR_MINUS_SIMILAR  0x2a6c
-#define UNITEXT_SIMILAR_MINUS_SIMILAR  L"\u2a6c"
+#define UNITEXT_SIMILAR_MINUS_SIMILAR  U"\u2a6c"
 #define UNICODE_CONGRUENT_WITH_DOT_ABOVE  0x2a6d
-#define UNITEXT_CONGRUENT_WITH_DOT_ABOVE  L"\u2a6d"
+#define UNITEXT_CONGRUENT_WITH_DOT_ABOVE  U"\u2a6d"
 #define UNICODE_EQUALS_WITH_ASTERISK  0x2a6e
-#define UNITEXT_EQUALS_WITH_ASTERISK  L"\u2a6e"
+#define UNITEXT_EQUALS_WITH_ASTERISK  U"\u2a6e"
 #define UNICODE_ALMOST_EQUAL_TO_WITH_CIRCUMFLEX_ACCENT  0x2a6f
-#define UNITEXT_ALMOST_EQUAL_TO_WITH_CIRCUMFLEX_ACCENT  L"\u2a6f"
+#define UNITEXT_ALMOST_EQUAL_TO_WITH_CIRCUMFLEX_ACCENT  U"\u2a6f"
 #define UNICODE_APPROXIMATELY_EQUAL_OR_EQUAL_TO  0x2a70
-#define UNITEXT_APPROXIMATELY_EQUAL_OR_EQUAL_TO  L"\u2a70"
+#define UNITEXT_APPROXIMATELY_EQUAL_OR_EQUAL_TO  U"\u2a70"
 #define UNICODE_EQUALS_SIGN_ABOVE_PLUS_SIGN  0x2a71
-#define UNITEXT_EQUALS_SIGN_ABOVE_PLUS_SIGN  L"\u2a71"
+#define UNITEXT_EQUALS_SIGN_ABOVE_PLUS_SIGN  U"\u2a71"
 #define UNICODE_PLUS_SIGN_ABOVE_EQUALS_SIGN  0x2a72
-#define UNITEXT_PLUS_SIGN_ABOVE_EQUALS_SIGN  L"\u2a72"
+#define UNITEXT_PLUS_SIGN_ABOVE_EQUALS_SIGN  U"\u2a72"
 #define UNICODE_EQUALS_SIGN_ABOVE_TILDE_OPERATOR  0x2a73
-#define UNITEXT_EQUALS_SIGN_ABOVE_TILDE_OPERATOR  L"\u2a73"
+#define UNITEXT_EQUALS_SIGN_ABOVE_TILDE_OPERATOR  U"\u2a73"
 #define UNICODE_DOUBLE_COLON_EQUAL  0x2a74
-#define UNITEXT_DOUBLE_COLON_EQUAL  L"\u2a74"
+#define UNITEXT_DOUBLE_COLON_EQUAL  U"\u2a74"
 #define UNICODE_TWO_CONSECUTIVE_EQUALS_SIGNS  0x2a75
-#define UNITEXT_TWO_CONSECUTIVE_EQUALS_SIGNS  L"\u2a75"
+#define UNITEXT_TWO_CONSECUTIVE_EQUALS_SIGNS  U"\u2a75"
 #define UNICODE_THREE_CONSECUTIVE_EQUALS_SIGNS  0x2a76
-#define UNITEXT_THREE_CONSECUTIVE_EQUALS_SIGNS  L"\u2a76"
+#define UNITEXT_THREE_CONSECUTIVE_EQUALS_SIGNS  U"\u2a76"
 #define UNICODE_EQUALS_SIGN_WITH_TWO_DOTS_ABOVE_AND_TWO_DOTS_BELOW  0x2a77
-#define UNITEXT_EQUALS_SIGN_WITH_TWO_DOTS_ABOVE_AND_TWO_DOTS_BELOW  L"\u2a77"
+#define UNITEXT_EQUALS_SIGN_WITH_TWO_DOTS_ABOVE_AND_TWO_DOTS_BELOW  U"\u2a77"
 #define UNICODE_EQUIVALENT_WITH_FOUR_DOTS_ABOVE  0x2a78
-#define UNITEXT_EQUIVALENT_WITH_FOUR_DOTS_ABOVE  L"\u2a78"
+#define UNITEXT_EQUIVALENT_WITH_FOUR_DOTS_ABOVE  U"\u2a78"
 #define UNICODE_LESS_THAN_WITH_CIRCLE_INSIDE  0x2a79
-#define UNITEXT_LESS_THAN_WITH_CIRCLE_INSIDE  L"\u2a79"
+#define UNITEXT_LESS_THAN_WITH_CIRCLE_INSIDE  U"\u2a79"
 #define UNICODE_GREATER_THAN_WITH_CIRCLE_INSIDE  0x2a7a
-#define UNITEXT_GREATER_THAN_WITH_CIRCLE_INSIDE  L"\u2a7a"
+#define UNITEXT_GREATER_THAN_WITH_CIRCLE_INSIDE  U"\u2a7a"
 #define UNICODE_LESS_THAN_WITH_QUESTION_MARK_ABOVE  0x2a7b
-#define UNITEXT_LESS_THAN_WITH_QUESTION_MARK_ABOVE  L"\u2a7b"
+#define UNITEXT_LESS_THAN_WITH_QUESTION_MARK_ABOVE  U"\u2a7b"
 #define UNICODE_GREATER_THAN_WITH_QUESTION_MARK_ABOVE  0x2a7c
-#define UNITEXT_GREATER_THAN_WITH_QUESTION_MARK_ABOVE  L"\u2a7c"
+#define UNITEXT_GREATER_THAN_WITH_QUESTION_MARK_ABOVE  U"\u2a7c"
 #define UNICODE_LESS_THAN_OR_SLANTED_EQUAL_TO  0x2a7d
-#define UNITEXT_LESS_THAN_OR_SLANTED_EQUAL_TO  L"\u2a7d"
+#define UNITEXT_LESS_THAN_OR_SLANTED_EQUAL_TO  U"\u2a7d"
 #define UNICODE_GREATER_THAN_OR_SLANTED_EQUAL_TO  0x2a7e
-#define UNITEXT_GREATER_THAN_OR_SLANTED_EQUAL_TO  L"\u2a7e"
+#define UNITEXT_GREATER_THAN_OR_SLANTED_EQUAL_TO  U"\u2a7e"
 #define UNICODE_LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_INSIDE  0x2a7f
-#define UNITEXT_LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_INSIDE  L"\u2a7f"
+#define UNITEXT_LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_INSIDE  U"\u2a7f"
 #define UNICODE_GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_INSIDE  0x2a80
-#define UNITEXT_GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_INSIDE  L"\u2a80"
+#define UNITEXT_GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_INSIDE  U"\u2a80"
 #define UNICODE_LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE  0x2a81
-#define UNITEXT_LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE  L"\u2a81"
+#define UNITEXT_LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE  U"\u2a81"
 #define UNICODE_GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE  0x2a82
-#define UNITEXT_GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE  L"\u2a82"
+#define UNITEXT_GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE  U"\u2a82"
 #define UNICODE_LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE_RIGHT  0x2a83
-#define UNITEXT_LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE_RIGHT  L"\u2a83"
+#define UNITEXT_LESS_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE_RIGHT  U"\u2a83"
 #define UNICODE_GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE_LEFT  0x2a84
-#define UNITEXT_GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE_LEFT  L"\u2a84"
+#define UNITEXT_GREATER_THAN_OR_SLANTED_EQUAL_TO_WITH_DOT_ABOVE_LEFT  U"\u2a84"
 #define UNICODE_LESS_THAN_OR_APPROXIMATE  0x2a85
-#define UNITEXT_LESS_THAN_OR_APPROXIMATE  L"\u2a85"
+#define UNITEXT_LESS_THAN_OR_APPROXIMATE  U"\u2a85"
 #define UNICODE_GREATER_THAN_OR_APPROXIMATE  0x2a86
-#define UNITEXT_GREATER_THAN_OR_APPROXIMATE  L"\u2a86"
+#define UNITEXT_GREATER_THAN_OR_APPROXIMATE  U"\u2a86"
 #define UNICODE_LESS_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO  0x2a87
-#define UNITEXT_LESS_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO  L"\u2a87"
+#define UNITEXT_LESS_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO  U"\u2a87"
 #define UNICODE_GREATER_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO  0x2a88
-#define UNITEXT_GREATER_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO  L"\u2a88"
+#define UNITEXT_GREATER_THAN_AND_SINGLE_LINE_NOT_EQUAL_TO  U"\u2a88"
 #define UNICODE_LESS_THAN_AND_NOT_APPROXIMATE  0x2a89
-#define UNITEXT_LESS_THAN_AND_NOT_APPROXIMATE  L"\u2a89"
+#define UNITEXT_LESS_THAN_AND_NOT_APPROXIMATE  U"\u2a89"
 #define UNICODE_GREATER_THAN_AND_NOT_APPROXIMATE  0x2a8a
-#define UNITEXT_GREATER_THAN_AND_NOT_APPROXIMATE  L"\u2a8a"
+#define UNITEXT_GREATER_THAN_AND_NOT_APPROXIMATE  U"\u2a8a"
 #define UNICODE_LESS_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_GREATER_THAN  0x2a8b
-#define UNITEXT_LESS_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_GREATER_THAN  L"\u2a8b"
+#define UNITEXT_LESS_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_GREATER_THAN  U"\u2a8b"
 #define UNICODE_GREATER_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_LESS_THAN  0x2a8c
-#define UNITEXT_GREATER_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_LESS_THAN  L"\u2a8c"
+#define UNITEXT_GREATER_THAN_ABOVE_DOUBLE_LINE_EQUAL_ABOVE_LESS_THAN  U"\u2a8c"
 #define UNICODE_LESS_THAN_ABOVE_SIMILAR_OR_EQUAL  0x2a8d
-#define UNITEXT_LESS_THAN_ABOVE_SIMILAR_OR_EQUAL  L"\u2a8d"
+#define UNITEXT_LESS_THAN_ABOVE_SIMILAR_OR_EQUAL  U"\u2a8d"
 #define UNICODE_GREATER_THAN_ABOVE_SIMILAR_OR_EQUAL  0x2a8e
-#define UNITEXT_GREATER_THAN_ABOVE_SIMILAR_OR_EQUAL  L"\u2a8e"
+#define UNITEXT_GREATER_THAN_ABOVE_SIMILAR_OR_EQUAL  U"\u2a8e"
 #define UNICODE_LESS_THAN_ABOVE_SIMILAR_ABOVE_GREATER_THAN  0x2a8f
-#define UNITEXT_LESS_THAN_ABOVE_SIMILAR_ABOVE_GREATER_THAN  L"\u2a8f"
+#define UNITEXT_LESS_THAN_ABOVE_SIMILAR_ABOVE_GREATER_THAN  U"\u2a8f"
 #define UNICODE_GREATER_THAN_ABOVE_SIMILAR_ABOVE_LESS_THAN  0x2a90
-#define UNITEXT_GREATER_THAN_ABOVE_SIMILAR_ABOVE_LESS_THAN  L"\u2a90"
+#define UNITEXT_GREATER_THAN_ABOVE_SIMILAR_ABOVE_LESS_THAN  U"\u2a90"
 #define UNICODE_LESS_THAN_ABOVE_GREATER_THAN_ABOVE_DOUBLE_LINE_EQUAL  0x2a91
-#define UNITEXT_LESS_THAN_ABOVE_GREATER_THAN_ABOVE_DOUBLE_LINE_EQUAL  L"\u2a91"
+#define UNITEXT_LESS_THAN_ABOVE_GREATER_THAN_ABOVE_DOUBLE_LINE_EQUAL  U"\u2a91"
 #define UNICODE_GREATER_THAN_ABOVE_LESS_THAN_ABOVE_DOUBLE_LINE_EQUAL  0x2a92
-#define UNITEXT_GREATER_THAN_ABOVE_LESS_THAN_ABOVE_DOUBLE_LINE_EQUAL  L"\u2a92"
+#define UNITEXT_GREATER_THAN_ABOVE_LESS_THAN_ABOVE_DOUBLE_LINE_EQUAL  U"\u2a92"
 #define UNICODE_LESS_THAN_ABOVE_SLANTED_EQUAL_ABOVE_GREATER_THAN_ABOVE_SLANTED_EQUAL  0x2a93
-#define UNITEXT_LESS_THAN_ABOVE_SLANTED_EQUAL_ABOVE_GREATER_THAN_ABOVE_SLANTED_EQUAL  L"\u2a93"
+#define UNITEXT_LESS_THAN_ABOVE_SLANTED_EQUAL_ABOVE_GREATER_THAN_ABOVE_SLANTED_EQUAL  U"\u2a93"
 #define UNICODE_GREATER_THAN_ABOVE_SLANTED_EQUAL_ABOVE_LESS_THAN_ABOVE_SLANTED_EQUAL  0x2a94
-#define UNITEXT_GREATER_THAN_ABOVE_SLANTED_EQUAL_ABOVE_LESS_THAN_ABOVE_SLANTED_EQUAL  L"\u2a94"
+#define UNITEXT_GREATER_THAN_ABOVE_SLANTED_EQUAL_ABOVE_LESS_THAN_ABOVE_SLANTED_EQUAL  U"\u2a94"
 #define UNICODE_SLANTED_EQUAL_TO_OR_LESS_THAN  0x2a95
-#define UNITEXT_SLANTED_EQUAL_TO_OR_LESS_THAN  L"\u2a95"
+#define UNITEXT_SLANTED_EQUAL_TO_OR_LESS_THAN  U"\u2a95"
 #define UNICODE_SLANTED_EQUAL_TO_OR_GREATER_THAN  0x2a96
-#define UNITEXT_SLANTED_EQUAL_TO_OR_GREATER_THAN  L"\u2a96"
+#define UNITEXT_SLANTED_EQUAL_TO_OR_GREATER_THAN  U"\u2a96"
 #define UNICODE_SLANTED_EQUAL_TO_OR_LESS_THAN_WITH_DOT_INSIDE  0x2a97
-#define UNITEXT_SLANTED_EQUAL_TO_OR_LESS_THAN_WITH_DOT_INSIDE  L"\u2a97"
+#define UNITEXT_SLANTED_EQUAL_TO_OR_LESS_THAN_WITH_DOT_INSIDE  U"\u2a97"
 #define UNICODE_SLANTED_EQUAL_TO_OR_GREATER_THAN_WITH_DOT_INSIDE  0x2a98
-#define UNITEXT_SLANTED_EQUAL_TO_OR_GREATER_THAN_WITH_DOT_INSIDE  L"\u2a98"
+#define UNITEXT_SLANTED_EQUAL_TO_OR_GREATER_THAN_WITH_DOT_INSIDE  U"\u2a98"
 #define UNICODE_DOUBLE_LINE_EQUAL_TO_OR_LESS_THAN  0x2a99
-#define UNITEXT_DOUBLE_LINE_EQUAL_TO_OR_LESS_THAN  L"\u2a99"
+#define UNITEXT_DOUBLE_LINE_EQUAL_TO_OR_LESS_THAN  U"\u2a99"
 #define UNICODE_DOUBLE_LINE_EQUAL_TO_OR_GREATER_THAN  0x2a9a
-#define UNITEXT_DOUBLE_LINE_EQUAL_TO_OR_GREATER_THAN  L"\u2a9a"
+#define UNITEXT_DOUBLE_LINE_EQUAL_TO_OR_GREATER_THAN  U"\u2a9a"
 #define UNICODE_DOUBLE_LINE_SLANTED_EQUAL_TO_OR_LESS_THAN  0x2a9b
-#define UNITEXT_DOUBLE_LINE_SLANTED_EQUAL_TO_OR_LESS_THAN  L"\u2a9b"
+#define UNITEXT_DOUBLE_LINE_SLANTED_EQUAL_TO_OR_LESS_THAN  U"\u2a9b"
 #define UNICODE_DOUBLE_LINE_SLANTED_EQUAL_TO_OR_GREATER_THAN  0x2a9c
-#define UNITEXT_DOUBLE_LINE_SLANTED_EQUAL_TO_OR_GREATER_THAN  L"\u2a9c"
+#define UNITEXT_DOUBLE_LINE_SLANTED_EQUAL_TO_OR_GREATER_THAN  U"\u2a9c"
 #define UNICODE_SIMILAR_OR_LESS_THAN  0x2a9d
-#define UNITEXT_SIMILAR_OR_LESS_THAN  L"\u2a9d"
+#define UNITEXT_SIMILAR_OR_LESS_THAN  U"\u2a9d"
 #define UNICODE_SIMILAR_OR_GREATER_THAN  0x2a9e
-#define UNITEXT_SIMILAR_OR_GREATER_THAN  L"\u2a9e"
+#define UNITEXT_SIMILAR_OR_GREATER_THAN  U"\u2a9e"
 #define UNICODE_SIMILAR_ABOVE_LESS_THAN_ABOVE_EQUALS_SIGN  0x2a9f
-#define UNITEXT_SIMILAR_ABOVE_LESS_THAN_ABOVE_EQUALS_SIGN  L"\u2a9f"
+#define UNITEXT_SIMILAR_ABOVE_LESS_THAN_ABOVE_EQUALS_SIGN  U"\u2a9f"
 #define UNICODE_SIMILAR_ABOVE_GREATER_THAN_ABOVE_EQUALS_SIGN  0x2aa0
-#define UNITEXT_SIMILAR_ABOVE_GREATER_THAN_ABOVE_EQUALS_SIGN  L"\u2aa0"
+#define UNITEXT_SIMILAR_ABOVE_GREATER_THAN_ABOVE_EQUALS_SIGN  U"\u2aa0"
 #define UNICODE_DOUBLE_NESTED_LESS_THAN  0x2aa1
-#define UNITEXT_DOUBLE_NESTED_LESS_THAN  L"\u2aa1"
+#define UNITEXT_DOUBLE_NESTED_LESS_THAN  U"\u2aa1"
 #define UNICODE_DOUBLE_NESTED_GREATER_THAN  0x2aa2
-#define UNITEXT_DOUBLE_NESTED_GREATER_THAN  L"\u2aa2"
+#define UNITEXT_DOUBLE_NESTED_GREATER_THAN  U"\u2aa2"
 #define UNICODE_DOUBLE_NESTED_LESS_THAN_WITH_UNDERBAR  0x2aa3
-#define UNITEXT_DOUBLE_NESTED_LESS_THAN_WITH_UNDERBAR  L"\u2aa3"
+#define UNITEXT_DOUBLE_NESTED_LESS_THAN_WITH_UNDERBAR  U"\u2aa3"
 #define UNICODE_GREATER_THAN_OVERLAPPING_LESS_THAN  0x2aa4
-#define UNITEXT_GREATER_THAN_OVERLAPPING_LESS_THAN  L"\u2aa4"
+#define UNITEXT_GREATER_THAN_OVERLAPPING_LESS_THAN  U"\u2aa4"
 #define UNICODE_GREATER_THAN_BESIDE_LESS_THAN  0x2aa5
-#define UNITEXT_GREATER_THAN_BESIDE_LESS_THAN  L"\u2aa5"
+#define UNITEXT_GREATER_THAN_BESIDE_LESS_THAN  U"\u2aa5"
 #define UNICODE_LESS_THAN_CLOSED_BY_CURVE  0x2aa6
-#define UNITEXT_LESS_THAN_CLOSED_BY_CURVE  L"\u2aa6"
+#define UNITEXT_LESS_THAN_CLOSED_BY_CURVE  U"\u2aa6"
 #define UNICODE_GREATER_THAN_CLOSED_BY_CURVE  0x2aa7
-#define UNITEXT_GREATER_THAN_CLOSED_BY_CURVE  L"\u2aa7"
+#define UNITEXT_GREATER_THAN_CLOSED_BY_CURVE  U"\u2aa7"
 #define UNICODE_LESS_THAN_CLOSED_BY_CURVE_ABOVE_SLANTED_EQUAL  0x2aa8
-#define UNITEXT_LESS_THAN_CLOSED_BY_CURVE_ABOVE_SLANTED_EQUAL  L"\u2aa8"
+#define UNITEXT_LESS_THAN_CLOSED_BY_CURVE_ABOVE_SLANTED_EQUAL  U"\u2aa8"
 #define UNICODE_GREATER_THAN_CLOSED_BY_CURVE_ABOVE_SLANTED_EQUAL  0x2aa9
-#define UNITEXT_GREATER_THAN_CLOSED_BY_CURVE_ABOVE_SLANTED_EQUAL  L"\u2aa9"
+#define UNITEXT_GREATER_THAN_CLOSED_BY_CURVE_ABOVE_SLANTED_EQUAL  U"\u2aa9"
 #define UNICODE_SMALLER_THAN  0x2aaa
-#define UNITEXT_SMALLER_THAN  L"\u2aaa"
+#define UNITEXT_SMALLER_THAN  U"\u2aaa"
 #define UNICODE_LARGER_THAN  0x2aab
-#define UNITEXT_LARGER_THAN  L"\u2aab"
+#define UNITEXT_LARGER_THAN  U"\u2aab"
 #define UNICODE_SMALLER_THAN_OR_EQUAL_TO  0x2aac
-#define UNITEXT_SMALLER_THAN_OR_EQUAL_TO  L"\u2aac"
+#define UNITEXT_SMALLER_THAN_OR_EQUAL_TO  U"\u2aac"
 #define UNICODE_LARGER_THAN_OR_EQUAL_TO  0x2aad
-#define UNITEXT_LARGER_THAN_OR_EQUAL_TO  L"\u2aad"
+#define UNITEXT_LARGER_THAN_OR_EQUAL_TO  U"\u2aad"
 #define UNICODE_EQUALS_SIGN_WITH_BUMPY_ABOVE  0x2aae
-#define UNITEXT_EQUALS_SIGN_WITH_BUMPY_ABOVE  L"\u2aae"
+#define UNITEXT_EQUALS_SIGN_WITH_BUMPY_ABOVE  U"\u2aae"
 #define UNICODE_PRECEDES_ABOVE_SINGLE_LINE_EQUALS_SIGN  0x2aaf
-#define UNITEXT_PRECEDES_ABOVE_SINGLE_LINE_EQUALS_SIGN  L"\u2aaf"
+#define UNITEXT_PRECEDES_ABOVE_SINGLE_LINE_EQUALS_SIGN  U"\u2aaf"
 #define UNICODE_SUCCEEDS_ABOVE_SINGLE_LINE_EQUALS_SIGN  0x2ab0
-#define UNITEXT_SUCCEEDS_ABOVE_SINGLE_LINE_EQUALS_SIGN  L"\u2ab0"
+#define UNITEXT_SUCCEEDS_ABOVE_SINGLE_LINE_EQUALS_SIGN  U"\u2ab0"
 #define UNICODE_PRECEDES_ABOVE_SINGLE_LINE_NOT_EQUAL_TO  0x2ab1
-#define UNITEXT_PRECEDES_ABOVE_SINGLE_LINE_NOT_EQUAL_TO  L"\u2ab1"
+#define UNITEXT_PRECEDES_ABOVE_SINGLE_LINE_NOT_EQUAL_TO  U"\u2ab1"
 #define UNICODE_SUCCEEDS_ABOVE_SINGLE_LINE_NOT_EQUAL_TO  0x2ab2
-#define UNITEXT_SUCCEEDS_ABOVE_SINGLE_LINE_NOT_EQUAL_TO  L"\u2ab2"
+#define UNITEXT_SUCCEEDS_ABOVE_SINGLE_LINE_NOT_EQUAL_TO  U"\u2ab2"
 #define UNICODE_PRECEDES_ABOVE_EQUALS_SIGN  0x2ab3
-#define UNITEXT_PRECEDES_ABOVE_EQUALS_SIGN  L"\u2ab3"
+#define UNITEXT_PRECEDES_ABOVE_EQUALS_SIGN  U"\u2ab3"
 #define UNICODE_SUCCEEDS_ABOVE_EQUALS_SIGN  0x2ab4
-#define UNITEXT_SUCCEEDS_ABOVE_EQUALS_SIGN  L"\u2ab4"
+#define UNITEXT_SUCCEEDS_ABOVE_EQUALS_SIGN  U"\u2ab4"
 #define UNICODE_PRECEDES_ABOVE_NOT_EQUAL_TO  0x2ab5
-#define UNITEXT_PRECEDES_ABOVE_NOT_EQUAL_TO  L"\u2ab5"
+#define UNITEXT_PRECEDES_ABOVE_NOT_EQUAL_TO  U"\u2ab5"
 #define UNICODE_SUCCEEDS_ABOVE_NOT_EQUAL_TO  0x2ab6
-#define UNITEXT_SUCCEEDS_ABOVE_NOT_EQUAL_TO  L"\u2ab6"
+#define UNITEXT_SUCCEEDS_ABOVE_NOT_EQUAL_TO  U"\u2ab6"
 #define UNICODE_PRECEDES_ABOVE_ALMOST_EQUAL_TO  0x2ab7
-#define UNITEXT_PRECEDES_ABOVE_ALMOST_EQUAL_TO  L"\u2ab7"
+#define UNITEXT_PRECEDES_ABOVE_ALMOST_EQUAL_TO  U"\u2ab7"
 #define UNICODE_SUCCEEDS_ABOVE_ALMOST_EQUAL_TO  0x2ab8
-#define UNITEXT_SUCCEEDS_ABOVE_ALMOST_EQUAL_TO  L"\u2ab8"
+#define UNITEXT_SUCCEEDS_ABOVE_ALMOST_EQUAL_TO  U"\u2ab8"
 #define UNICODE_PRECEDES_ABOVE_NOT_ALMOST_EQUAL_TO  0x2ab9
-#define UNITEXT_PRECEDES_ABOVE_NOT_ALMOST_EQUAL_TO  L"\u2ab9"
+#define UNITEXT_PRECEDES_ABOVE_NOT_ALMOST_EQUAL_TO  U"\u2ab9"
 #define UNICODE_SUCCEEDS_ABOVE_NOT_ALMOST_EQUAL_TO  0x2aba
-#define UNITEXT_SUCCEEDS_ABOVE_NOT_ALMOST_EQUAL_TO  L"\u2aba"
+#define UNITEXT_SUCCEEDS_ABOVE_NOT_ALMOST_EQUAL_TO  U"\u2aba"
 #define UNICODE_DOUBLE_PRECEDES  0x2abb
-#define UNITEXT_DOUBLE_PRECEDES  L"\u2abb"
+#define UNITEXT_DOUBLE_PRECEDES  U"\u2abb"
 #define UNICODE_DOUBLE_SUCCEEDS  0x2abc
-#define UNITEXT_DOUBLE_SUCCEEDS  L"\u2abc"
+#define UNITEXT_DOUBLE_SUCCEEDS  U"\u2abc"
 #define UNICODE_SUBSET_WITH_DOT  0x2abd
-#define UNITEXT_SUBSET_WITH_DOT  L"\u2abd"
+#define UNITEXT_SUBSET_WITH_DOT  U"\u2abd"
 #define UNICODE_SUPERSET_WITH_DOT  0x2abe
-#define UNITEXT_SUPERSET_WITH_DOT  L"\u2abe"
+#define UNITEXT_SUPERSET_WITH_DOT  U"\u2abe"
 #define UNICODE_SUBSET_WITH_PLUS_SIGN_BELOW  0x2abf
-#define UNITEXT_SUBSET_WITH_PLUS_SIGN_BELOW  L"\u2abf"
+#define UNITEXT_SUBSET_WITH_PLUS_SIGN_BELOW  U"\u2abf"
 #define UNICODE_SUPERSET_WITH_PLUS_SIGN_BELOW  0x2ac0
-#define UNITEXT_SUPERSET_WITH_PLUS_SIGN_BELOW  L"\u2ac0"
+#define UNITEXT_SUPERSET_WITH_PLUS_SIGN_BELOW  U"\u2ac0"
 #define UNICODE_SUBSET_WITH_MULTIPLICATION_SIGN_BELOW  0x2ac1
-#define UNITEXT_SUBSET_WITH_MULTIPLICATION_SIGN_BELOW  L"\u2ac1"
+#define UNITEXT_SUBSET_WITH_MULTIPLICATION_SIGN_BELOW  U"\u2ac1"
 #define UNICODE_SUPERSET_WITH_MULTIPLICATION_SIGN_BELOW  0x2ac2
-#define UNITEXT_SUPERSET_WITH_MULTIPLICATION_SIGN_BELOW  L"\u2ac2"
+#define UNITEXT_SUPERSET_WITH_MULTIPLICATION_SIGN_BELOW  U"\u2ac2"
 #define UNICODE_SUBSET_OF_OR_EQUAL_TO_WITH_DOT_ABOVE  0x2ac3
-#define UNITEXT_SUBSET_OF_OR_EQUAL_TO_WITH_DOT_ABOVE  L"\u2ac3"
+#define UNITEXT_SUBSET_OF_OR_EQUAL_TO_WITH_DOT_ABOVE  U"\u2ac3"
 #define UNICODE_SUPERSET_OF_OR_EQUAL_TO_WITH_DOT_ABOVE  0x2ac4
-#define UNITEXT_SUPERSET_OF_OR_EQUAL_TO_WITH_DOT_ABOVE  L"\u2ac4"
+#define UNITEXT_SUPERSET_OF_OR_EQUAL_TO_WITH_DOT_ABOVE  U"\u2ac4"
 #define UNICODE_SUBSET_OF_ABOVE_EQUALS_SIGN  0x2ac5
-#define UNITEXT_SUBSET_OF_ABOVE_EQUALS_SIGN  L"\u2ac5"
+#define UNITEXT_SUBSET_OF_ABOVE_EQUALS_SIGN  U"\u2ac5"
 #define UNICODE_SUPERSET_OF_ABOVE_EQUALS_SIGN  0x2ac6
-#define UNITEXT_SUPERSET_OF_ABOVE_EQUALS_SIGN  L"\u2ac6"
+#define UNITEXT_SUPERSET_OF_ABOVE_EQUALS_SIGN  U"\u2ac6"
 #define UNICODE_SUBSET_OF_ABOVE_TILDE_OPERATOR  0x2ac7
-#define UNITEXT_SUBSET_OF_ABOVE_TILDE_OPERATOR  L"\u2ac7"
+#define UNITEXT_SUBSET_OF_ABOVE_TILDE_OPERATOR  U"\u2ac7"
 #define UNICODE_SUPERSET_OF_ABOVE_TILDE_OPERATOR  0x2ac8
-#define UNITEXT_SUPERSET_OF_ABOVE_TILDE_OPERATOR  L"\u2ac8"
+#define UNITEXT_SUPERSET_OF_ABOVE_TILDE_OPERATOR  U"\u2ac8"
 #define UNICODE_SUBSET_OF_ABOVE_ALMOST_EQUAL_TO  0x2ac9
-#define UNITEXT_SUBSET_OF_ABOVE_ALMOST_EQUAL_TO  L"\u2ac9"
+#define UNITEXT_SUBSET_OF_ABOVE_ALMOST_EQUAL_TO  U"\u2ac9"
 #define UNICODE_SUPERSET_OF_ABOVE_ALMOST_EQUAL_TO  0x2aca
-#define UNITEXT_SUPERSET_OF_ABOVE_ALMOST_EQUAL_TO  L"\u2aca"
+#define UNITEXT_SUPERSET_OF_ABOVE_ALMOST_EQUAL_TO  U"\u2aca"
 #define UNICODE_SUBSET_OF_ABOVE_NOT_EQUAL_TO  0x2acb
-#define UNITEXT_SUBSET_OF_ABOVE_NOT_EQUAL_TO  L"\u2acb"
+#define UNITEXT_SUBSET_OF_ABOVE_NOT_EQUAL_TO  U"\u2acb"
 #define UNICODE_SUPERSET_OF_ABOVE_NOT_EQUAL_TO  0x2acc
-#define UNITEXT_SUPERSET_OF_ABOVE_NOT_EQUAL_TO  L"\u2acc"
+#define UNITEXT_SUPERSET_OF_ABOVE_NOT_EQUAL_TO  U"\u2acc"
 #define UNICODE_SQUARE_LEFT_OPEN_BOX_OPERATOR  0x2acd
-#define UNITEXT_SQUARE_LEFT_OPEN_BOX_OPERATOR  L"\u2acd"
+#define UNITEXT_SQUARE_LEFT_OPEN_BOX_OPERATOR  U"\u2acd"
 #define UNICODE_SQUARE_RIGHT_OPEN_BOX_OPERATOR  0x2ace
-#define UNITEXT_SQUARE_RIGHT_OPEN_BOX_OPERATOR  L"\u2ace"
+#define UNITEXT_SQUARE_RIGHT_OPEN_BOX_OPERATOR  U"\u2ace"
 #define UNICODE_CLOSED_SUBSET  0x2acf
-#define UNITEXT_CLOSED_SUBSET  L"\u2acf"
+#define UNITEXT_CLOSED_SUBSET  U"\u2acf"
 #define UNICODE_CLOSED_SUPERSET  0x2ad0
-#define UNITEXT_CLOSED_SUPERSET  L"\u2ad0"
+#define UNITEXT_CLOSED_SUPERSET  U"\u2ad0"
 #define UNICODE_CLOSED_SUBSET_OR_EQUAL_TO  0x2ad1
-#define UNITEXT_CLOSED_SUBSET_OR_EQUAL_TO  L"\u2ad1"
+#define UNITEXT_CLOSED_SUBSET_OR_EQUAL_TO  U"\u2ad1"
 #define UNICODE_CLOSED_SUPERSET_OR_EQUAL_TO  0x2ad2
-#define UNITEXT_CLOSED_SUPERSET_OR_EQUAL_TO  L"\u2ad2"
+#define UNITEXT_CLOSED_SUPERSET_OR_EQUAL_TO  U"\u2ad2"
 #define UNICODE_SUBSET_ABOVE_SUPERSET  0x2ad3
-#define UNITEXT_SUBSET_ABOVE_SUPERSET  L"\u2ad3"
+#define UNITEXT_SUBSET_ABOVE_SUPERSET  U"\u2ad3"
 #define UNICODE_SUPERSET_ABOVE_SUBSET  0x2ad4
-#define UNITEXT_SUPERSET_ABOVE_SUBSET  L"\u2ad4"
+#define UNITEXT_SUPERSET_ABOVE_SUBSET  U"\u2ad4"
 #define UNICODE_SUBSET_ABOVE_SUBSET  0x2ad5
-#define UNITEXT_SUBSET_ABOVE_SUBSET  L"\u2ad5"
+#define UNITEXT_SUBSET_ABOVE_SUBSET  U"\u2ad5"
 #define UNICODE_SUPERSET_ABOVE_SUPERSET  0x2ad6
-#define UNITEXT_SUPERSET_ABOVE_SUPERSET  L"\u2ad6"
+#define UNITEXT_SUPERSET_ABOVE_SUPERSET  U"\u2ad6"
 #define UNICODE_SUPERSET_BESIDE_SUBSET  0x2ad7
-#define UNITEXT_SUPERSET_BESIDE_SUBSET  L"\u2ad7"
+#define UNITEXT_SUPERSET_BESIDE_SUBSET  U"\u2ad7"
 #define UNICODE_SUPERSET_BESIDE_AND_JOINED_BY_DASH_WITH_SUBSET  0x2ad8
-#define UNITEXT_SUPERSET_BESIDE_AND_JOINED_BY_DASH_WITH_SUBSET  L"\u2ad8"
+#define UNITEXT_SUPERSET_BESIDE_AND_JOINED_BY_DASH_WITH_SUBSET  U"\u2ad8"
 #define UNICODE_ELEMENT_OF_OPENING_DOWNWARDS  0x2ad9
-#define UNITEXT_ELEMENT_OF_OPENING_DOWNWARDS  L"\u2ad9"
+#define UNITEXT_ELEMENT_OF_OPENING_DOWNWARDS  U"\u2ad9"
 #define UNICODE_PITCHFORK_WITH_TEE_TOP  0x2ada
-#define UNITEXT_PITCHFORK_WITH_TEE_TOP  L"\u2ada"
+#define UNITEXT_PITCHFORK_WITH_TEE_TOP  U"\u2ada"
 #define UNICODE_TRANSVERSAL_INTERSECTION  0x2adb
-#define UNITEXT_TRANSVERSAL_INTERSECTION  L"\u2adb"
+#define UNITEXT_TRANSVERSAL_INTERSECTION  U"\u2adb"
 #define UNICODE_FORKING  0x2adc
-#define UNITEXT_FORKING  L"\u2adc"
+#define UNITEXT_FORKING  U"\u2adc"
 #define UNICODE_NONFORKING  0x2add
-#define UNITEXT_NONFORKING  L"\u2add"
+#define UNITEXT_NONFORKING  U"\u2add"
 #define UNICODE_SHORT_LEFT_TACK  0x2ade
-#define UNITEXT_SHORT_LEFT_TACK  L"\u2ade"
+#define UNITEXT_SHORT_LEFT_TACK  U"\u2ade"
 #define UNICODE_SHORT_DOWN_TACK  0x2adf
-#define UNITEXT_SHORT_DOWN_TACK  L"\u2adf"
+#define UNITEXT_SHORT_DOWN_TACK  U"\u2adf"
 #define UNICODE_SHORT_UP_TACK  0x2ae0
-#define UNITEXT_SHORT_UP_TACK  L"\u2ae0"
+#define UNITEXT_SHORT_UP_TACK  U"\u2ae0"
 #define UNICODE_PERPENDICULAR_WITH_S  0x2ae1
-#define UNITEXT_PERPENDICULAR_WITH_S  L"\u2ae1"
+#define UNITEXT_PERPENDICULAR_WITH_S  U"\u2ae1"
 #define UNICODE_VERTICAL_BAR_TRIPLE_RIGHT_TURNSTILE  0x2ae2
-#define UNITEXT_VERTICAL_BAR_TRIPLE_RIGHT_TURNSTILE  L"\u2ae2"
+#define UNITEXT_VERTICAL_BAR_TRIPLE_RIGHT_TURNSTILE  U"\u2ae2"
 #define UNICODE_DOUBLE_VERTICAL_BAR_LEFT_TURNSTILE  0x2ae3
-#define UNITEXT_DOUBLE_VERTICAL_BAR_LEFT_TURNSTILE  L"\u2ae3"
+#define UNITEXT_DOUBLE_VERTICAL_BAR_LEFT_TURNSTILE  U"\u2ae3"
 #define UNICODE_VERTICAL_BAR_DOUBLE_LEFT_TURNSTILE  0x2ae4
-#define UNITEXT_VERTICAL_BAR_DOUBLE_LEFT_TURNSTILE  L"\u2ae4"
+#define UNITEXT_VERTICAL_BAR_DOUBLE_LEFT_TURNSTILE  U"\u2ae4"
 #define UNICODE_DOUBLE_VERTICAL_BAR_DOUBLE_LEFT_TURNSTILE  0x2ae5
-#define UNITEXT_DOUBLE_VERTICAL_BAR_DOUBLE_LEFT_TURNSTILE  L"\u2ae5"
+#define UNITEXT_DOUBLE_VERTICAL_BAR_DOUBLE_LEFT_TURNSTILE  U"\u2ae5"
 #define UNICODE_LONG_DASH_FROM_LEFT_MEMBER_OF_DOUBLE_VERTICAL  0x2ae6
-#define UNITEXT_LONG_DASH_FROM_LEFT_MEMBER_OF_DOUBLE_VERTICAL  L"\u2ae6"
+#define UNITEXT_LONG_DASH_FROM_LEFT_MEMBER_OF_DOUBLE_VERTICAL  U"\u2ae6"
 #define UNICODE_SHORT_DOWN_TACK_WITH_OVERBAR  0x2ae7
-#define UNITEXT_SHORT_DOWN_TACK_WITH_OVERBAR  L"\u2ae7"
+#define UNITEXT_SHORT_DOWN_TACK_WITH_OVERBAR  U"\u2ae7"
 #define UNICODE_SHORT_UP_TACK_WITH_UNDERBAR  0x2ae8
-#define UNITEXT_SHORT_UP_TACK_WITH_UNDERBAR  L"\u2ae8"
+#define UNITEXT_SHORT_UP_TACK_WITH_UNDERBAR  U"\u2ae8"
 #define UNICODE_SHORT_UP_TACK_ABOVE_SHORT_DOWN_TACK  0x2ae9
-#define UNITEXT_SHORT_UP_TACK_ABOVE_SHORT_DOWN_TACK  L"\u2ae9"
+#define UNITEXT_SHORT_UP_TACK_ABOVE_SHORT_DOWN_TACK  U"\u2ae9"
 #define UNICODE_DOUBLE_DOWN_TACK  0x2aea
-#define UNITEXT_DOUBLE_DOWN_TACK  L"\u2aea"
+#define UNITEXT_DOUBLE_DOWN_TACK  U"\u2aea"
 #define UNICODE_DOUBLE_UP_TACK  0x2aeb
-#define UNITEXT_DOUBLE_UP_TACK  L"\u2aeb"
+#define UNITEXT_DOUBLE_UP_TACK  U"\u2aeb"
 #define UNICODE_DOUBLE_STROKE_NOT_SIGN  0x2aec
-#define UNITEXT_DOUBLE_STROKE_NOT_SIGN  L"\u2aec"
+#define UNITEXT_DOUBLE_STROKE_NOT_SIGN  U"\u2aec"
 #define UNICODE_REVERSED_DOUBLE_STROKE_NOT_SIGN  0x2aed
-#define UNITEXT_REVERSED_DOUBLE_STROKE_NOT_SIGN  L"\u2aed"
+#define UNITEXT_REVERSED_DOUBLE_STROKE_NOT_SIGN  U"\u2aed"
 #define UNICODE_DOES_NOT_DIVIDE_WITH_REVERSED_NEGATION_SLASH  0x2aee
-#define UNITEXT_DOES_NOT_DIVIDE_WITH_REVERSED_NEGATION_SLASH  L"\u2aee"
+#define UNITEXT_DOES_NOT_DIVIDE_WITH_REVERSED_NEGATION_SLASH  U"\u2aee"
 #define UNICODE_VERTICAL_LINE_WITH_CIRCLE_ABOVE  0x2aef
-#define UNITEXT_VERTICAL_LINE_WITH_CIRCLE_ABOVE  L"\u2aef"
+#define UNITEXT_VERTICAL_LINE_WITH_CIRCLE_ABOVE  U"\u2aef"
 #define UNICODE_VERTICAL_LINE_WITH_CIRCLE_BELOW  0x2af0
-#define UNITEXT_VERTICAL_LINE_WITH_CIRCLE_BELOW  L"\u2af0"
+#define UNITEXT_VERTICAL_LINE_WITH_CIRCLE_BELOW  U"\u2af0"
 #define UNICODE_DOWN_TACK_WITH_CIRCLE_BELOW  0x2af1
-#define UNITEXT_DOWN_TACK_WITH_CIRCLE_BELOW  L"\u2af1"
+#define UNITEXT_DOWN_TACK_WITH_CIRCLE_BELOW  U"\u2af1"
 #define UNICODE_PARALLEL_WITH_HORIZONTAL_STROKE  0x2af2
-#define UNITEXT_PARALLEL_WITH_HORIZONTAL_STROKE  L"\u2af2"
+#define UNITEXT_PARALLEL_WITH_HORIZONTAL_STROKE  U"\u2af2"
 #define UNICODE_PARALLEL_WITH_TILDE_OPERATOR  0x2af3
-#define UNITEXT_PARALLEL_WITH_TILDE_OPERATOR  L"\u2af3"
+#define UNITEXT_PARALLEL_WITH_TILDE_OPERATOR  U"\u2af3"
 #define UNICODE_TRIPLE_VERTICAL_BAR_BINARY_RELATION  0x2af4
-#define UNITEXT_TRIPLE_VERTICAL_BAR_BINARY_RELATION  L"\u2af4"
+#define UNITEXT_TRIPLE_VERTICAL_BAR_BINARY_RELATION  U"\u2af4"
 #define UNICODE_TRIPLE_VERTICAL_BAR_WITH_HORIZONTAL_STROKE  0x2af5
-#define UNITEXT_TRIPLE_VERTICAL_BAR_WITH_HORIZONTAL_STROKE  L"\u2af5"
+#define UNITEXT_TRIPLE_VERTICAL_BAR_WITH_HORIZONTAL_STROKE  U"\u2af5"
 #define UNICODE_TRIPLE_COLON_OPERATOR  0x2af6
-#define UNITEXT_TRIPLE_COLON_OPERATOR  L"\u2af6"
+#define UNITEXT_TRIPLE_COLON_OPERATOR  U"\u2af6"
 #define UNICODE_TRIPLE_NESTED_LESS_THAN  0x2af7
-#define UNITEXT_TRIPLE_NESTED_LESS_THAN  L"\u2af7"
+#define UNITEXT_TRIPLE_NESTED_LESS_THAN  U"\u2af7"
 #define UNICODE_TRIPLE_NESTED_GREATER_THAN  0x2af8
-#define UNITEXT_TRIPLE_NESTED_GREATER_THAN  L"\u2af8"
+#define UNITEXT_TRIPLE_NESTED_GREATER_THAN  U"\u2af8"
 #define UNICODE_DOUBLE_LINE_SLANTED_LESS_THAN_OR_EQUAL_TO  0x2af9
-#define UNITEXT_DOUBLE_LINE_SLANTED_LESS_THAN_OR_EQUAL_TO  L"\u2af9"
+#define UNITEXT_DOUBLE_LINE_SLANTED_LESS_THAN_OR_EQUAL_TO  U"\u2af9"
 #define UNICODE_DOUBLE_LINE_SLANTED_GREATER_THAN_OR_EQUAL_TO  0x2afa
-#define UNITEXT_DOUBLE_LINE_SLANTED_GREATER_THAN_OR_EQUAL_TO  L"\u2afa"
+#define UNITEXT_DOUBLE_LINE_SLANTED_GREATER_THAN_OR_EQUAL_TO  U"\u2afa"
 #define UNICODE_TRIPLE_SOLIDUS_BINARY_RELATION  0x2afb
-#define UNITEXT_TRIPLE_SOLIDUS_BINARY_RELATION  L"\u2afb"
+#define UNITEXT_TRIPLE_SOLIDUS_BINARY_RELATION  U"\u2afb"
 #define UNICODE_LARGE_TRIPLE_VERTICAL_BAR_OPERATOR  0x2afc
-#define UNITEXT_LARGE_TRIPLE_VERTICAL_BAR_OPERATOR  L"\u2afc"
+#define UNITEXT_LARGE_TRIPLE_VERTICAL_BAR_OPERATOR  U"\u2afc"
 #define UNICODE_DOUBLE_SOLIDUS_OPERATOR  0x2afd
-#define UNITEXT_DOUBLE_SOLIDUS_OPERATOR  L"\u2afd"
+#define UNITEXT_DOUBLE_SOLIDUS_OPERATOR  U"\u2afd"
 #define UNICODE_WHITE_VERTICAL_BAR  0x2afe
-#define UNITEXT_WHITE_VERTICAL_BAR  L"\u2afe"
+#define UNITEXT_WHITE_VERTICAL_BAR  U"\u2afe"
 #define UNICODE_N_ARY_WHITE_VERTICAL_BAR  0x2aff
-#define UNITEXT_N_ARY_WHITE_VERTICAL_BAR  L"\u2aff"
+#define UNITEXT_N_ARY_WHITE_VERTICAL_BAR  U"\u2aff"
 #define UNICODE_NORTH_EAST_WHITE_ARROW  0x2b00
-#define UNITEXT_NORTH_EAST_WHITE_ARROW  L"\u2b00"
+#define UNITEXT_NORTH_EAST_WHITE_ARROW  U"\u2b00"
 #define UNICODE_NORTH_WEST_WHITE_ARROW  0x2b01
-#define UNITEXT_NORTH_WEST_WHITE_ARROW  L"\u2b01"
+#define UNITEXT_NORTH_WEST_WHITE_ARROW  U"\u2b01"
 #define UNICODE_SOUTH_EAST_WHITE_ARROW  0x2b02
-#define UNITEXT_SOUTH_EAST_WHITE_ARROW  L"\u2b02"
+#define UNITEXT_SOUTH_EAST_WHITE_ARROW  U"\u2b02"
 #define UNICODE_SOUTH_WEST_WHITE_ARROW  0x2b03
-#define UNITEXT_SOUTH_WEST_WHITE_ARROW  L"\u2b03"
+#define UNITEXT_SOUTH_WEST_WHITE_ARROW  U"\u2b03"
 #define UNICODE_LEFT_RIGHT_WHITE_ARROW  0x2b04
-#define UNITEXT_LEFT_RIGHT_WHITE_ARROW  L"\u2b04"
+#define UNITEXT_LEFT_RIGHT_WHITE_ARROW  U"\u2b04"
 #define UNICODE_LEFTWARDS_BLACK_ARROW  0x2b05
-#define UNITEXT_LEFTWARDS_BLACK_ARROW  L"\u2b05"
+#define UNITEXT_LEFTWARDS_BLACK_ARROW  U"\u2b05"
 #define UNICODE_UPWARDS_BLACK_ARROW  0x2b06
-#define UNITEXT_UPWARDS_BLACK_ARROW  L"\u2b06"
+#define UNITEXT_UPWARDS_BLACK_ARROW  U"\u2b06"
 #define UNICODE_DOWNWARDS_BLACK_ARROW  0x2b07
-#define UNITEXT_DOWNWARDS_BLACK_ARROW  L"\u2b07"
+#define UNITEXT_DOWNWARDS_BLACK_ARROW  U"\u2b07"
 #define UNICODE_NORTH_EAST_BLACK_ARROW  0x2b08
-#define UNITEXT_NORTH_EAST_BLACK_ARROW  L"\u2b08"
+#define UNITEXT_NORTH_EAST_BLACK_ARROW  U"\u2b08"
 #define UNICODE_NORTH_WEST_BLACK_ARROW  0x2b09
-#define UNITEXT_NORTH_WEST_BLACK_ARROW  L"\u2b09"
+#define UNITEXT_NORTH_WEST_BLACK_ARROW  U"\u2b09"
 #define UNICODE_SOUTH_EAST_BLACK_ARROW  0x2b0a
-#define UNITEXT_SOUTH_EAST_BLACK_ARROW  L"\u2b0a"
+#define UNITEXT_SOUTH_EAST_BLACK_ARROW  U"\u2b0a"
 #define UNICODE_SOUTH_WEST_BLACK_ARROW  0x2b0b
-#define UNITEXT_SOUTH_WEST_BLACK_ARROW  L"\u2b0b"
+#define UNITEXT_SOUTH_WEST_BLACK_ARROW  U"\u2b0b"
 #define UNICODE_LEFT_RIGHT_BLACK_ARROW  0x2b0c
-#define UNITEXT_LEFT_RIGHT_BLACK_ARROW  L"\u2b0c"
+#define UNITEXT_LEFT_RIGHT_BLACK_ARROW  U"\u2b0c"
 #define UNICODE_UP_DOWN_BLACK_ARROW  0x2b0d
-#define UNITEXT_UP_DOWN_BLACK_ARROW  L"\u2b0d"
+#define UNITEXT_UP_DOWN_BLACK_ARROW  U"\u2b0d"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_TIP_DOWNWARDS  0x2b0e
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_TIP_DOWNWARDS  L"\u2b0e"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_TIP_DOWNWARDS  U"\u2b0e"
 #define UNICODE_RIGHTWARDS_ARROW_WITH_TIP_UPWARDS  0x2b0f
-#define UNITEXT_RIGHTWARDS_ARROW_WITH_TIP_UPWARDS  L"\u2b0f"
+#define UNITEXT_RIGHTWARDS_ARROW_WITH_TIP_UPWARDS  U"\u2b0f"
 #define UNICODE_LEFTWARDS_ARROW_WITH_TIP_DOWNWARDS  0x2b10
-#define UNITEXT_LEFTWARDS_ARROW_WITH_TIP_DOWNWARDS  L"\u2b10"
+#define UNITEXT_LEFTWARDS_ARROW_WITH_TIP_DOWNWARDS  U"\u2b10"
 #define UNICODE_LEFTWARDS_ARROW_WITH_TIP_UPWARDS  0x2b11
-#define UNITEXT_LEFTWARDS_ARROW_WITH_TIP_UPWARDS  L"\u2b11"
+#define UNITEXT_LEFTWARDS_ARROW_WITH_TIP_UPWARDS  U"\u2b11"
 #define UNICODE_SQUARE_WITH_TOP_HALF_BLACK  0x2b12
-#define UNITEXT_SQUARE_WITH_TOP_HALF_BLACK  L"\u2b12"
+#define UNITEXT_SQUARE_WITH_TOP_HALF_BLACK  U"\u2b12"
 #define UNICODE_SQUARE_WITH_BOTTOM_HALF_BLACK  0x2b13
-#define UNITEXT_SQUARE_WITH_BOTTOM_HALF_BLACK  L"\u2b13"
+#define UNITEXT_SQUARE_WITH_BOTTOM_HALF_BLACK  U"\u2b13"
 #define UNICODE_SQUARE_WITH_UPPER_RIGHT_DIAGONAL_HALF_BLACK  0x2b14
-#define UNITEXT_SQUARE_WITH_UPPER_RIGHT_DIAGONAL_HALF_BLACK  L"\u2b14"
+#define UNITEXT_SQUARE_WITH_UPPER_RIGHT_DIAGONAL_HALF_BLACK  U"\u2b14"
 #define UNICODE_SQUARE_WITH_LOWER_LEFT_DIAGONAL_HALF_BLACK  0x2b15
-#define UNITEXT_SQUARE_WITH_LOWER_LEFT_DIAGONAL_HALF_BLACK  L"\u2b15"
+#define UNITEXT_SQUARE_WITH_LOWER_LEFT_DIAGONAL_HALF_BLACK  U"\u2b15"
 #define UNICODE_DIAMOND_WITH_LEFT_HALF_BLACK  0x2b16
-#define UNITEXT_DIAMOND_WITH_LEFT_HALF_BLACK  L"\u2b16"
+#define UNITEXT_DIAMOND_WITH_LEFT_HALF_BLACK  U"\u2b16"
 #define UNICODE_DIAMOND_WITH_RIGHT_HALF_BLACK  0x2b17
-#define UNITEXT_DIAMOND_WITH_RIGHT_HALF_BLACK  L"\u2b17"
+#define UNITEXT_DIAMOND_WITH_RIGHT_HALF_BLACK  U"\u2b17"
 #define UNICODE_DIAMOND_WITH_TOP_HALF_BLACK  0x2b18
-#define UNITEXT_DIAMOND_WITH_TOP_HALF_BLACK  L"\u2b18"
+#define UNITEXT_DIAMOND_WITH_TOP_HALF_BLACK  U"\u2b18"
 #define UNICODE_DIAMOND_WITH_BOTTOM_HALF_BLACK  0x2b19
-#define UNITEXT_DIAMOND_WITH_BOTTOM_HALF_BLACK  L"\u2b19"
+#define UNITEXT_DIAMOND_WITH_BOTTOM_HALF_BLACK  U"\u2b19"
 #define UNICODE_DOTTED_SQUARE  0x2b1a
-#define UNITEXT_DOTTED_SQUARE  L"\u2b1a"
+#define UNITEXT_DOTTED_SQUARE  U"\u2b1a"
 #define UNICODE_WHITE_PENTAGON  0x2b20
-#define UNITEXT_WHITE_PENTAGON  L"\u2b20"
+#define UNITEXT_WHITE_PENTAGON  U"\u2b20"
 #define UNICODE_WHITE_HEXAGON  0x2b21
-#define UNITEXT_WHITE_HEXAGON  L"\u2b21"
+#define UNITEXT_WHITE_HEXAGON  U"\u2b21"
 #define UNICODE_BLACK_HEXAGON  0x2b22
-#define UNITEXT_BLACK_HEXAGON  L"\u2b22"
+#define UNITEXT_BLACK_HEXAGON  U"\u2b22"
 #define UNICODE_HORIZONTAL_BLACK_HEXAGON  0x2b23
-#define UNITEXT_HORIZONTAL_BLACK_HEXAGON  L"\u2b23"
+#define UNITEXT_HORIZONTAL_BLACK_HEXAGON  U"\u2b23"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_AZU  0x2c00
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_AZU  L"\u2c00"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_AZU  U"\u2c00"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_BUKY  0x2c01
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_BUKY  L"\u2c01"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_BUKY  U"\u2c01"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_VEDE  0x2c02
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_VEDE  L"\u2c02"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_VEDE  U"\u2c02"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_GLAGOLI  0x2c03
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_GLAGOLI  L"\u2c03"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_GLAGOLI  U"\u2c03"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_DOBRO  0x2c04
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_DOBRO  L"\u2c04"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_DOBRO  U"\u2c04"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_YESTU  0x2c05
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YESTU  L"\u2c05"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YESTU  U"\u2c05"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_ZHIVETE  0x2c06
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_ZHIVETE  L"\u2c06"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_ZHIVETE  U"\u2c06"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_DZELO  0x2c07
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_DZELO  L"\u2c07"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_DZELO  U"\u2c07"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_ZEMLJA  0x2c08
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_ZEMLJA  L"\u2c08"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_ZEMLJA  U"\u2c08"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_IZHE  0x2c09
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_IZHE  L"\u2c09"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_IZHE  U"\u2c09"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_INITIAL_IZHE  0x2c0a
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_INITIAL_IZHE  L"\u2c0a"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_INITIAL_IZHE  U"\u2c0a"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_I  0x2c0b
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_I  L"\u2c0b"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_I  U"\u2c0b"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_DJERVI  0x2c0c
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_DJERVI  L"\u2c0c"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_DJERVI  U"\u2c0c"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_KAKO  0x2c0d
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_KAKO  L"\u2c0d"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_KAKO  U"\u2c0d"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_LJUDIJE  0x2c0e
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_LJUDIJE  L"\u2c0e"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_LJUDIJE  U"\u2c0e"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_MYSLITE  0x2c0f
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_MYSLITE  L"\u2c0f"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_MYSLITE  U"\u2c0f"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_NASHI  0x2c10
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_NASHI  L"\u2c10"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_NASHI  U"\u2c10"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_ONU  0x2c11
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_ONU  L"\u2c11"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_ONU  U"\u2c11"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_POKOJI  0x2c12
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_POKOJI  L"\u2c12"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_POKOJI  U"\u2c12"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_RITSI  0x2c13
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_RITSI  L"\u2c13"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_RITSI  U"\u2c13"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_SLOVO  0x2c14
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SLOVO  L"\u2c14"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SLOVO  U"\u2c14"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_TVRIDO  0x2c15
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_TVRIDO  L"\u2c15"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_TVRIDO  U"\u2c15"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_UKU  0x2c16
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_UKU  L"\u2c16"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_UKU  U"\u2c16"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_FRITU  0x2c17
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_FRITU  L"\u2c17"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_FRITU  U"\u2c17"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_HERU  0x2c18
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_HERU  L"\u2c18"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_HERU  U"\u2c18"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_OTU  0x2c19
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_OTU  L"\u2c19"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_OTU  U"\u2c19"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_PE  0x2c1a
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_PE  L"\u2c1a"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_PE  U"\u2c1a"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_SHTA  0x2c1b
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SHTA  L"\u2c1b"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SHTA  U"\u2c1b"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_TSI  0x2c1c
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_TSI  L"\u2c1c"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_TSI  U"\u2c1c"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_CHRIVI  0x2c1d
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_CHRIVI  L"\u2c1d"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_CHRIVI  U"\u2c1d"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_SHA  0x2c1e
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SHA  L"\u2c1e"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SHA  U"\u2c1e"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_YERU  0x2c1f
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YERU  L"\u2c1f"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YERU  U"\u2c1f"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_YERI  0x2c20
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YERI  L"\u2c20"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YERI  U"\u2c20"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_YATI  0x2c21
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YATI  L"\u2c21"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YATI  U"\u2c21"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_SPIDERY_HA  0x2c22
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SPIDERY_HA  L"\u2c22"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SPIDERY_HA  U"\u2c22"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_YU  0x2c23
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YU  L"\u2c23"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YU  U"\u2c23"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_SMALL_YUS  0x2c24
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SMALL_YUS  L"\u2c24"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SMALL_YUS  U"\u2c24"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_SMALL_YUS_WITH_TAIL  0x2c25
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SMALL_YUS_WITH_TAIL  L"\u2c25"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SMALL_YUS_WITH_TAIL  U"\u2c25"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_YO  0x2c26
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YO  L"\u2c26"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_YO  U"\u2c26"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_IOTATED_SMALL_YUS  0x2c27
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_IOTATED_SMALL_YUS  L"\u2c27"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_IOTATED_SMALL_YUS  U"\u2c27"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_BIG_YUS  0x2c28
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_BIG_YUS  L"\u2c28"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_BIG_YUS  U"\u2c28"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_IOTATED_BIG_YUS  0x2c29
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_IOTATED_BIG_YUS  L"\u2c29"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_IOTATED_BIG_YUS  U"\u2c29"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_FITA  0x2c2a
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_FITA  L"\u2c2a"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_FITA  U"\u2c2a"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_IZHITSA  0x2c2b
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_IZHITSA  L"\u2c2b"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_IZHITSA  U"\u2c2b"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_SHTAPIC  0x2c2c
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SHTAPIC  L"\u2c2c"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_SHTAPIC  U"\u2c2c"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_TROKUTASTI_A  0x2c2d
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_TROKUTASTI_A  L"\u2c2d"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_TROKUTASTI_A  U"\u2c2d"
 #define UNICODE_GLAGOLITIC_CAPITAL_LETTER_LATINATE_MYSLITE  0x2c2e
-#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_LATINATE_MYSLITE  L"\u2c2e"
+#define UNITEXT_GLAGOLITIC_CAPITAL_LETTER_LATINATE_MYSLITE  U"\u2c2e"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_AZU  0x2c30
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_AZU  L"\u2c30"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_AZU  U"\u2c30"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_BUKY  0x2c31
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_BUKY  L"\u2c31"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_BUKY  U"\u2c31"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_VEDE  0x2c32
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_VEDE  L"\u2c32"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_VEDE  U"\u2c32"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_GLAGOLI  0x2c33
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_GLAGOLI  L"\u2c33"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_GLAGOLI  U"\u2c33"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_DOBRO  0x2c34
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_DOBRO  L"\u2c34"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_DOBRO  U"\u2c34"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_YESTU  0x2c35
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YESTU  L"\u2c35"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YESTU  U"\u2c35"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_ZHIVETE  0x2c36
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_ZHIVETE  L"\u2c36"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_ZHIVETE  U"\u2c36"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_DZELO  0x2c37
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_DZELO  L"\u2c37"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_DZELO  U"\u2c37"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_ZEMLJA  0x2c38
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_ZEMLJA  L"\u2c38"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_ZEMLJA  U"\u2c38"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_IZHE  0x2c39
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_IZHE  L"\u2c39"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_IZHE  U"\u2c39"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_INITIAL_IZHE  0x2c3a
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_INITIAL_IZHE  L"\u2c3a"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_INITIAL_IZHE  U"\u2c3a"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_I  0x2c3b
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_I  L"\u2c3b"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_I  U"\u2c3b"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_DJERVI  0x2c3c
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_DJERVI  L"\u2c3c"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_DJERVI  U"\u2c3c"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_KAKO  0x2c3d
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_KAKO  L"\u2c3d"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_KAKO  U"\u2c3d"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_LJUDIJE  0x2c3e
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_LJUDIJE  L"\u2c3e"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_LJUDIJE  U"\u2c3e"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_MYSLITE  0x2c3f
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_MYSLITE  L"\u2c3f"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_MYSLITE  U"\u2c3f"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_NASHI  0x2c40
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_NASHI  L"\u2c40"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_NASHI  U"\u2c40"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_ONU  0x2c41
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_ONU  L"\u2c41"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_ONU  U"\u2c41"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_POKOJI  0x2c42
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_POKOJI  L"\u2c42"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_POKOJI  U"\u2c42"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_RITSI  0x2c43
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_RITSI  L"\u2c43"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_RITSI  U"\u2c43"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_SLOVO  0x2c44
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SLOVO  L"\u2c44"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SLOVO  U"\u2c44"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_TVRIDO  0x2c45
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_TVRIDO  L"\u2c45"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_TVRIDO  U"\u2c45"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_UKU  0x2c46
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_UKU  L"\u2c46"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_UKU  U"\u2c46"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_FRITU  0x2c47
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_FRITU  L"\u2c47"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_FRITU  U"\u2c47"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_HERU  0x2c48
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_HERU  L"\u2c48"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_HERU  U"\u2c48"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_OTU  0x2c49
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_OTU  L"\u2c49"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_OTU  U"\u2c49"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_PE  0x2c4a
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_PE  L"\u2c4a"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_PE  U"\u2c4a"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_SHTA  0x2c4b
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SHTA  L"\u2c4b"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SHTA  U"\u2c4b"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_TSI  0x2c4c
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_TSI  L"\u2c4c"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_TSI  U"\u2c4c"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_CHRIVI  0x2c4d
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_CHRIVI  L"\u2c4d"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_CHRIVI  U"\u2c4d"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_SHA  0x2c4e
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SHA  L"\u2c4e"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SHA  U"\u2c4e"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_YERU  0x2c4f
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YERU  L"\u2c4f"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YERU  U"\u2c4f"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_YERI  0x2c50
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YERI  L"\u2c50"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YERI  U"\u2c50"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_YATI  0x2c51
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YATI  L"\u2c51"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YATI  U"\u2c51"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_SPIDERY_HA  0x2c52
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SPIDERY_HA  L"\u2c52"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SPIDERY_HA  U"\u2c52"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_YU  0x2c53
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YU  L"\u2c53"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YU  U"\u2c53"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_SMALL_YUS  0x2c54
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SMALL_YUS  L"\u2c54"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SMALL_YUS  U"\u2c54"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_SMALL_YUS_WITH_TAIL  0x2c55
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SMALL_YUS_WITH_TAIL  L"\u2c55"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SMALL_YUS_WITH_TAIL  U"\u2c55"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_YO  0x2c56
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YO  L"\u2c56"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_YO  U"\u2c56"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_IOTATED_SMALL_YUS  0x2c57
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_IOTATED_SMALL_YUS  L"\u2c57"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_IOTATED_SMALL_YUS  U"\u2c57"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_BIG_YUS  0x2c58
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_BIG_YUS  L"\u2c58"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_BIG_YUS  U"\u2c58"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_IOTATED_BIG_YUS  0x2c59
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_IOTATED_BIG_YUS  L"\u2c59"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_IOTATED_BIG_YUS  U"\u2c59"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_FITA  0x2c5a
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_FITA  L"\u2c5a"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_FITA  U"\u2c5a"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_IZHITSA  0x2c5b
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_IZHITSA  L"\u2c5b"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_IZHITSA  U"\u2c5b"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_SHTAPIC  0x2c5c
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SHTAPIC  L"\u2c5c"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_SHTAPIC  U"\u2c5c"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_TROKUTASTI_A  0x2c5d
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_TROKUTASTI_A  L"\u2c5d"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_TROKUTASTI_A  U"\u2c5d"
 #define UNICODE_GLAGOLITIC_SMALL_LETTER_LATINATE_MYSLITE  0x2c5e
-#define UNITEXT_GLAGOLITIC_SMALL_LETTER_LATINATE_MYSLITE  L"\u2c5e"
+#define UNITEXT_GLAGOLITIC_SMALL_LETTER_LATINATE_MYSLITE  U"\u2c5e"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_DOUBLE_BAR  0x2c60
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_DOUBLE_BAR  L"\u2c60"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_DOUBLE_BAR  U"\u2c60"
 #define UNICODE_LATIN_SMALL_LETTER_L_WITH_DOUBLE_BAR  0x2c61
-#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_DOUBLE_BAR  L"\u2c61"
+#define UNITEXT_LATIN_SMALL_LETTER_L_WITH_DOUBLE_BAR  U"\u2c61"
 #define UNICODE_LATIN_CAPITAL_LETTER_L_WITH_MIDDLE_TILDE  0x2c62
-#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_MIDDLE_TILDE  L"\u2c62"
+#define UNITEXT_LATIN_CAPITAL_LETTER_L_WITH_MIDDLE_TILDE  U"\u2c62"
 #define UNICODE_LATIN_CAPITAL_LETTER_P_WITH_STROKE  0x2c63
-#define UNITEXT_LATIN_CAPITAL_LETTER_P_WITH_STROKE  L"\u2c63"
+#define UNITEXT_LATIN_CAPITAL_LETTER_P_WITH_STROKE  U"\u2c63"
 #define UNICODE_LATIN_CAPITAL_LETTER_R_WITH_TAIL  0x2c64
-#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_TAIL  L"\u2c64"
+#define UNITEXT_LATIN_CAPITAL_LETTER_R_WITH_TAIL  U"\u2c64"
 #define UNICODE_LATIN_SMALL_LETTER_A_WITH_STROKE  0x2c65
-#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_STROKE  L"\u2c65"
+#define UNITEXT_LATIN_SMALL_LETTER_A_WITH_STROKE  U"\u2c65"
 #define UNICODE_LATIN_SMALL_LETTER_T_WITH_DIAGONAL_STROKE  0x2c66
-#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_DIAGONAL_STROKE  L"\u2c66"
+#define UNITEXT_LATIN_SMALL_LETTER_T_WITH_DIAGONAL_STROKE  U"\u2c66"
 #define UNICODE_LATIN_CAPITAL_LETTER_H_WITH_DESCENDER  0x2c67
-#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_DESCENDER  L"\u2c67"
+#define UNITEXT_LATIN_CAPITAL_LETTER_H_WITH_DESCENDER  U"\u2c67"
 #define UNICODE_LATIN_SMALL_LETTER_H_WITH_DESCENDER  0x2c68
-#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_DESCENDER  L"\u2c68"
+#define UNITEXT_LATIN_SMALL_LETTER_H_WITH_DESCENDER  U"\u2c68"
 #define UNICODE_LATIN_CAPITAL_LETTER_K_WITH_DESCENDER  0x2c69
-#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_DESCENDER  L"\u2c69"
+#define UNITEXT_LATIN_CAPITAL_LETTER_K_WITH_DESCENDER  U"\u2c69"
 #define UNICODE_LATIN_SMALL_LETTER_K_WITH_DESCENDER  0x2c6a
-#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_DESCENDER  L"\u2c6a"
+#define UNITEXT_LATIN_SMALL_LETTER_K_WITH_DESCENDER  U"\u2c6a"
 #define UNICODE_LATIN_CAPITAL_LETTER_Z_WITH_DESCENDER  0x2c6b
-#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_DESCENDER  L"\u2c6b"
+#define UNITEXT_LATIN_CAPITAL_LETTER_Z_WITH_DESCENDER  U"\u2c6b"
 #define UNICODE_LATIN_SMALL_LETTER_Z_WITH_DESCENDER  0x2c6c
-#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_DESCENDER  L"\u2c6c"
+#define UNITEXT_LATIN_SMALL_LETTER_Z_WITH_DESCENDER  U"\u2c6c"
 #define UNICODE_LATIN_SMALL_LETTER_V_WITH_CURL  0x2c74
-#define UNITEXT_LATIN_SMALL_LETTER_V_WITH_CURL  L"\u2c74"
+#define UNITEXT_LATIN_SMALL_LETTER_V_WITH_CURL  U"\u2c74"
 #define UNICODE_LATIN_CAPITAL_LETTER_HALF_H  0x2c75
-#define UNITEXT_LATIN_CAPITAL_LETTER_HALF_H  L"\u2c75"
+#define UNITEXT_LATIN_CAPITAL_LETTER_HALF_H  U"\u2c75"
 #define UNICODE_LATIN_SMALL_LETTER_HALF_H  0x2c76
-#define UNITEXT_LATIN_SMALL_LETTER_HALF_H  L"\u2c76"
+#define UNITEXT_LATIN_SMALL_LETTER_HALF_H  U"\u2c76"
 #define UNICODE_LATIN_SMALL_LETTER_TAILLESS_PHI  0x2c77
-#define UNITEXT_LATIN_SMALL_LETTER_TAILLESS_PHI  L"\u2c77"
+#define UNITEXT_LATIN_SMALL_LETTER_TAILLESS_PHI  U"\u2c77"
 #define UNICODE_COPTIC_CAPITAL_LETTER_ALFA  0x2c80
-#define UNITEXT_COPTIC_CAPITAL_LETTER_ALFA  L"\u2c80"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_ALFA  U"\u2c80"
 #define UNICODE_COPTIC_SMALL_LETTER_ALFA  0x2c81
-#define UNITEXT_COPTIC_SMALL_LETTER_ALFA  L"\u2c81"
+#define UNITEXT_COPTIC_SMALL_LETTER_ALFA  U"\u2c81"
 #define UNICODE_COPTIC_CAPITAL_LETTER_VIDA  0x2c82
-#define UNITEXT_COPTIC_CAPITAL_LETTER_VIDA  L"\u2c82"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_VIDA  U"\u2c82"
 #define UNICODE_COPTIC_SMALL_LETTER_VIDA  0x2c83
-#define UNITEXT_COPTIC_SMALL_LETTER_VIDA  L"\u2c83"
+#define UNITEXT_COPTIC_SMALL_LETTER_VIDA  U"\u2c83"
 #define UNICODE_COPTIC_CAPITAL_LETTER_GAMMA  0x2c84
-#define UNITEXT_COPTIC_CAPITAL_LETTER_GAMMA  L"\u2c84"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_GAMMA  U"\u2c84"
 #define UNICODE_COPTIC_SMALL_LETTER_GAMMA  0x2c85
-#define UNITEXT_COPTIC_SMALL_LETTER_GAMMA  L"\u2c85"
+#define UNITEXT_COPTIC_SMALL_LETTER_GAMMA  U"\u2c85"
 #define UNICODE_COPTIC_CAPITAL_LETTER_DALDA  0x2c86
-#define UNITEXT_COPTIC_CAPITAL_LETTER_DALDA  L"\u2c86"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_DALDA  U"\u2c86"
 #define UNICODE_COPTIC_SMALL_LETTER_DALDA  0x2c87
-#define UNITEXT_COPTIC_SMALL_LETTER_DALDA  L"\u2c87"
+#define UNITEXT_COPTIC_SMALL_LETTER_DALDA  U"\u2c87"
 #define UNICODE_COPTIC_CAPITAL_LETTER_EIE  0x2c88
-#define UNITEXT_COPTIC_CAPITAL_LETTER_EIE  L"\u2c88"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_EIE  U"\u2c88"
 #define UNICODE_COPTIC_SMALL_LETTER_EIE  0x2c89
-#define UNITEXT_COPTIC_SMALL_LETTER_EIE  L"\u2c89"
+#define UNITEXT_COPTIC_SMALL_LETTER_EIE  U"\u2c89"
 #define UNICODE_COPTIC_CAPITAL_LETTER_SOU  0x2c8a
-#define UNITEXT_COPTIC_CAPITAL_LETTER_SOU  L"\u2c8a"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_SOU  U"\u2c8a"
 #define UNICODE_COPTIC_SMALL_LETTER_SOU  0x2c8b
-#define UNITEXT_COPTIC_SMALL_LETTER_SOU  L"\u2c8b"
+#define UNITEXT_COPTIC_SMALL_LETTER_SOU  U"\u2c8b"
 #define UNICODE_COPTIC_CAPITAL_LETTER_ZATA  0x2c8c
-#define UNITEXT_COPTIC_CAPITAL_LETTER_ZATA  L"\u2c8c"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_ZATA  U"\u2c8c"
 #define UNICODE_COPTIC_SMALL_LETTER_ZATA  0x2c8d
-#define UNITEXT_COPTIC_SMALL_LETTER_ZATA  L"\u2c8d"
+#define UNITEXT_COPTIC_SMALL_LETTER_ZATA  U"\u2c8d"
 #define UNICODE_COPTIC_CAPITAL_LETTER_HATE  0x2c8e
-#define UNITEXT_COPTIC_CAPITAL_LETTER_HATE  L"\u2c8e"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_HATE  U"\u2c8e"
 #define UNICODE_COPTIC_SMALL_LETTER_HATE  0x2c8f
-#define UNITEXT_COPTIC_SMALL_LETTER_HATE  L"\u2c8f"
+#define UNITEXT_COPTIC_SMALL_LETTER_HATE  U"\u2c8f"
 #define UNICODE_COPTIC_CAPITAL_LETTER_THETHE  0x2c90
-#define UNITEXT_COPTIC_CAPITAL_LETTER_THETHE  L"\u2c90"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_THETHE  U"\u2c90"
 #define UNICODE_COPTIC_SMALL_LETTER_THETHE  0x2c91
-#define UNITEXT_COPTIC_SMALL_LETTER_THETHE  L"\u2c91"
+#define UNITEXT_COPTIC_SMALL_LETTER_THETHE  U"\u2c91"
 #define UNICODE_COPTIC_CAPITAL_LETTER_IAUDA  0x2c92
-#define UNITEXT_COPTIC_CAPITAL_LETTER_IAUDA  L"\u2c92"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_IAUDA  U"\u2c92"
 #define UNICODE_COPTIC_SMALL_LETTER_IAUDA  0x2c93
-#define UNITEXT_COPTIC_SMALL_LETTER_IAUDA  L"\u2c93"
+#define UNITEXT_COPTIC_SMALL_LETTER_IAUDA  U"\u2c93"
 #define UNICODE_COPTIC_CAPITAL_LETTER_KAPA  0x2c94
-#define UNITEXT_COPTIC_CAPITAL_LETTER_KAPA  L"\u2c94"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_KAPA  U"\u2c94"
 #define UNICODE_COPTIC_SMALL_LETTER_KAPA  0x2c95
-#define UNITEXT_COPTIC_SMALL_LETTER_KAPA  L"\u2c95"
+#define UNITEXT_COPTIC_SMALL_LETTER_KAPA  U"\u2c95"
 #define UNICODE_COPTIC_CAPITAL_LETTER_LAULA  0x2c96
-#define UNITEXT_COPTIC_CAPITAL_LETTER_LAULA  L"\u2c96"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_LAULA  U"\u2c96"
 #define UNICODE_COPTIC_SMALL_LETTER_LAULA  0x2c97
-#define UNITEXT_COPTIC_SMALL_LETTER_LAULA  L"\u2c97"
+#define UNITEXT_COPTIC_SMALL_LETTER_LAULA  U"\u2c97"
 #define UNICODE_COPTIC_CAPITAL_LETTER_MI  0x2c98
-#define UNITEXT_COPTIC_CAPITAL_LETTER_MI  L"\u2c98"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_MI  U"\u2c98"
 #define UNICODE_COPTIC_SMALL_LETTER_MI  0x2c99
-#define UNITEXT_COPTIC_SMALL_LETTER_MI  L"\u2c99"
+#define UNITEXT_COPTIC_SMALL_LETTER_MI  U"\u2c99"
 #define UNICODE_COPTIC_CAPITAL_LETTER_NI  0x2c9a
-#define UNITEXT_COPTIC_CAPITAL_LETTER_NI  L"\u2c9a"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_NI  U"\u2c9a"
 #define UNICODE_COPTIC_SMALL_LETTER_NI  0x2c9b
-#define UNITEXT_COPTIC_SMALL_LETTER_NI  L"\u2c9b"
+#define UNITEXT_COPTIC_SMALL_LETTER_NI  U"\u2c9b"
 #define UNICODE_COPTIC_CAPITAL_LETTER_KSI  0x2c9c
-#define UNITEXT_COPTIC_CAPITAL_LETTER_KSI  L"\u2c9c"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_KSI  U"\u2c9c"
 #define UNICODE_COPTIC_SMALL_LETTER_KSI  0x2c9d
-#define UNITEXT_COPTIC_SMALL_LETTER_KSI  L"\u2c9d"
+#define UNITEXT_COPTIC_SMALL_LETTER_KSI  U"\u2c9d"
 #define UNICODE_COPTIC_CAPITAL_LETTER_O  0x2c9e
-#define UNITEXT_COPTIC_CAPITAL_LETTER_O  L"\u2c9e"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_O  U"\u2c9e"
 #define UNICODE_COPTIC_SMALL_LETTER_O  0x2c9f
-#define UNITEXT_COPTIC_SMALL_LETTER_O  L"\u2c9f"
+#define UNITEXT_COPTIC_SMALL_LETTER_O  U"\u2c9f"
 #define UNICODE_COPTIC_CAPITAL_LETTER_PI  0x2ca0
-#define UNITEXT_COPTIC_CAPITAL_LETTER_PI  L"\u2ca0"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_PI  U"\u2ca0"
 #define UNICODE_COPTIC_SMALL_LETTER_PI  0x2ca1
-#define UNITEXT_COPTIC_SMALL_LETTER_PI  L"\u2ca1"
+#define UNITEXT_COPTIC_SMALL_LETTER_PI  U"\u2ca1"
 #define UNICODE_COPTIC_CAPITAL_LETTER_RO  0x2ca2
-#define UNITEXT_COPTIC_CAPITAL_LETTER_RO  L"\u2ca2"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_RO  U"\u2ca2"
 #define UNICODE_COPTIC_SMALL_LETTER_RO  0x2ca3
-#define UNITEXT_COPTIC_SMALL_LETTER_RO  L"\u2ca3"
+#define UNITEXT_COPTIC_SMALL_LETTER_RO  U"\u2ca3"
 #define UNICODE_COPTIC_CAPITAL_LETTER_SIMA  0x2ca4
-#define UNITEXT_COPTIC_CAPITAL_LETTER_SIMA  L"\u2ca4"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_SIMA  U"\u2ca4"
 #define UNICODE_COPTIC_SMALL_LETTER_SIMA  0x2ca5
-#define UNITEXT_COPTIC_SMALL_LETTER_SIMA  L"\u2ca5"
+#define UNITEXT_COPTIC_SMALL_LETTER_SIMA  U"\u2ca5"
 #define UNICODE_COPTIC_CAPITAL_LETTER_TAU  0x2ca6
-#define UNITEXT_COPTIC_CAPITAL_LETTER_TAU  L"\u2ca6"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_TAU  U"\u2ca6"
 #define UNICODE_COPTIC_SMALL_LETTER_TAU  0x2ca7
-#define UNITEXT_COPTIC_SMALL_LETTER_TAU  L"\u2ca7"
+#define UNITEXT_COPTIC_SMALL_LETTER_TAU  U"\u2ca7"
 #define UNICODE_COPTIC_CAPITAL_LETTER_UA  0x2ca8
-#define UNITEXT_COPTIC_CAPITAL_LETTER_UA  L"\u2ca8"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_UA  U"\u2ca8"
 #define UNICODE_COPTIC_SMALL_LETTER_UA  0x2ca9
-#define UNITEXT_COPTIC_SMALL_LETTER_UA  L"\u2ca9"
+#define UNITEXT_COPTIC_SMALL_LETTER_UA  U"\u2ca9"
 #define UNICODE_COPTIC_CAPITAL_LETTER_FI  0x2caa
-#define UNITEXT_COPTIC_CAPITAL_LETTER_FI  L"\u2caa"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_FI  U"\u2caa"
 #define UNICODE_COPTIC_SMALL_LETTER_FI  0x2cab
-#define UNITEXT_COPTIC_SMALL_LETTER_FI  L"\u2cab"
+#define UNITEXT_COPTIC_SMALL_LETTER_FI  U"\u2cab"
 #define UNICODE_COPTIC_CAPITAL_LETTER_KHI  0x2cac
-#define UNITEXT_COPTIC_CAPITAL_LETTER_KHI  L"\u2cac"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_KHI  U"\u2cac"
 #define UNICODE_COPTIC_SMALL_LETTER_KHI  0x2cad
-#define UNITEXT_COPTIC_SMALL_LETTER_KHI  L"\u2cad"
+#define UNITEXT_COPTIC_SMALL_LETTER_KHI  U"\u2cad"
 #define UNICODE_COPTIC_CAPITAL_LETTER_PSI  0x2cae
-#define UNITEXT_COPTIC_CAPITAL_LETTER_PSI  L"\u2cae"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_PSI  U"\u2cae"
 #define UNICODE_COPTIC_SMALL_LETTER_PSI  0x2caf
-#define UNITEXT_COPTIC_SMALL_LETTER_PSI  L"\u2caf"
+#define UNITEXT_COPTIC_SMALL_LETTER_PSI  U"\u2caf"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OOU  0x2cb0
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OOU  L"\u2cb0"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OOU  U"\u2cb0"
 #define UNICODE_COPTIC_SMALL_LETTER_OOU  0x2cb1
-#define UNITEXT_COPTIC_SMALL_LETTER_OOU  L"\u2cb1"
+#define UNITEXT_COPTIC_SMALL_LETTER_OOU  U"\u2cb1"
 #define UNICODE_COPTIC_CAPITAL_LETTER_DIALECT_P_ALEF  0x2cb2
-#define UNITEXT_COPTIC_CAPITAL_LETTER_DIALECT_P_ALEF  L"\u2cb2"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_DIALECT_P_ALEF  U"\u2cb2"
 #define UNICODE_COPTIC_SMALL_LETTER_DIALECT_P_ALEF  0x2cb3
-#define UNITEXT_COPTIC_SMALL_LETTER_DIALECT_P_ALEF  L"\u2cb3"
+#define UNITEXT_COPTIC_SMALL_LETTER_DIALECT_P_ALEF  U"\u2cb3"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_AIN  0x2cb4
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_AIN  L"\u2cb4"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_AIN  U"\u2cb4"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_AIN  0x2cb5
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_AIN  L"\u2cb5"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_AIN  U"\u2cb5"
 #define UNICODE_COPTIC_CAPITAL_LETTER_CRYPTOGRAMMIC_EIE  0x2cb6
-#define UNITEXT_COPTIC_CAPITAL_LETTER_CRYPTOGRAMMIC_EIE  L"\u2cb6"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_CRYPTOGRAMMIC_EIE  U"\u2cb6"
 #define UNICODE_COPTIC_SMALL_LETTER_CRYPTOGRAMMIC_EIE  0x2cb7
-#define UNITEXT_COPTIC_SMALL_LETTER_CRYPTOGRAMMIC_EIE  L"\u2cb7"
+#define UNITEXT_COPTIC_SMALL_LETTER_CRYPTOGRAMMIC_EIE  U"\u2cb7"
 #define UNICODE_COPTIC_CAPITAL_LETTER_DIALECT_P_KAPA  0x2cb8
-#define UNITEXT_COPTIC_CAPITAL_LETTER_DIALECT_P_KAPA  L"\u2cb8"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_DIALECT_P_KAPA  U"\u2cb8"
 #define UNICODE_COPTIC_SMALL_LETTER_DIALECT_P_KAPA  0x2cb9
-#define UNITEXT_COPTIC_SMALL_LETTER_DIALECT_P_KAPA  L"\u2cb9"
+#define UNITEXT_COPTIC_SMALL_LETTER_DIALECT_P_KAPA  U"\u2cb9"
 #define UNICODE_COPTIC_CAPITAL_LETTER_DIALECT_P_NI  0x2cba
-#define UNITEXT_COPTIC_CAPITAL_LETTER_DIALECT_P_NI  L"\u2cba"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_DIALECT_P_NI  U"\u2cba"
 #define UNICODE_COPTIC_SMALL_LETTER_DIALECT_P_NI  0x2cbb
-#define UNITEXT_COPTIC_SMALL_LETTER_DIALECT_P_NI  L"\u2cbb"
+#define UNITEXT_COPTIC_SMALL_LETTER_DIALECT_P_NI  U"\u2cbb"
 #define UNICODE_COPTIC_CAPITAL_LETTER_CRYPTOGRAMMIC_NI  0x2cbc
-#define UNITEXT_COPTIC_CAPITAL_LETTER_CRYPTOGRAMMIC_NI  L"\u2cbc"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_CRYPTOGRAMMIC_NI  U"\u2cbc"
 #define UNICODE_COPTIC_SMALL_LETTER_CRYPTOGRAMMIC_NI  0x2cbd
-#define UNITEXT_COPTIC_SMALL_LETTER_CRYPTOGRAMMIC_NI  L"\u2cbd"
+#define UNITEXT_COPTIC_SMALL_LETTER_CRYPTOGRAMMIC_NI  U"\u2cbd"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_OOU  0x2cbe
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_OOU  L"\u2cbe"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_OOU  U"\u2cbe"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_OOU  0x2cbf
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_OOU  L"\u2cbf"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_OOU  U"\u2cbf"
 #define UNICODE_COPTIC_CAPITAL_LETTER_SAMPI  0x2cc0
-#define UNITEXT_COPTIC_CAPITAL_LETTER_SAMPI  L"\u2cc0"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_SAMPI  U"\u2cc0"
 #define UNICODE_COPTIC_SMALL_LETTER_SAMPI  0x2cc1
-#define UNITEXT_COPTIC_SMALL_LETTER_SAMPI  L"\u2cc1"
+#define UNITEXT_COPTIC_SMALL_LETTER_SAMPI  U"\u2cc1"
 #define UNICODE_COPTIC_CAPITAL_LETTER_CROSSED_SHEI  0x2cc2
-#define UNITEXT_COPTIC_CAPITAL_LETTER_CROSSED_SHEI  L"\u2cc2"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_CROSSED_SHEI  U"\u2cc2"
 #define UNICODE_COPTIC_SMALL_LETTER_CROSSED_SHEI  0x2cc3
-#define UNITEXT_COPTIC_SMALL_LETTER_CROSSED_SHEI  L"\u2cc3"
+#define UNITEXT_COPTIC_SMALL_LETTER_CROSSED_SHEI  U"\u2cc3"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_SHEI  0x2cc4
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_SHEI  L"\u2cc4"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_SHEI  U"\u2cc4"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_SHEI  0x2cc5
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_SHEI  L"\u2cc5"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_SHEI  U"\u2cc5"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_ESH  0x2cc6
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_ESH  L"\u2cc6"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_ESH  U"\u2cc6"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_ESH  0x2cc7
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_ESH  L"\u2cc7"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_ESH  U"\u2cc7"
 #define UNICODE_COPTIC_CAPITAL_LETTER_AKHMIMIC_KHEI  0x2cc8
-#define UNITEXT_COPTIC_CAPITAL_LETTER_AKHMIMIC_KHEI  L"\u2cc8"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_AKHMIMIC_KHEI  U"\u2cc8"
 #define UNICODE_COPTIC_SMALL_LETTER_AKHMIMIC_KHEI  0x2cc9
-#define UNITEXT_COPTIC_SMALL_LETTER_AKHMIMIC_KHEI  L"\u2cc9"
+#define UNITEXT_COPTIC_SMALL_LETTER_AKHMIMIC_KHEI  U"\u2cc9"
 #define UNICODE_COPTIC_CAPITAL_LETTER_DIALECT_P_HORI  0x2cca
-#define UNITEXT_COPTIC_CAPITAL_LETTER_DIALECT_P_HORI  L"\u2cca"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_DIALECT_P_HORI  U"\u2cca"
 #define UNICODE_COPTIC_SMALL_LETTER_DIALECT_P_HORI  0x2ccb
-#define UNITEXT_COPTIC_SMALL_LETTER_DIALECT_P_HORI  L"\u2ccb"
+#define UNITEXT_COPTIC_SMALL_LETTER_DIALECT_P_HORI  U"\u2ccb"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HORI  0x2ccc
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HORI  L"\u2ccc"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HORI  U"\u2ccc"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_HORI  0x2ccd
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_HORI  L"\u2ccd"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_HORI  U"\u2ccd"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HA  0x2cce
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HA  L"\u2cce"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HA  U"\u2cce"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_HA  0x2ccf
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_HA  L"\u2ccf"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_HA  U"\u2ccf"
 #define UNICODE_COPTIC_CAPITAL_LETTER_L_SHAPED_HA  0x2cd0
-#define UNITEXT_COPTIC_CAPITAL_LETTER_L_SHAPED_HA  L"\u2cd0"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_L_SHAPED_HA  U"\u2cd0"
 #define UNICODE_COPTIC_SMALL_LETTER_L_SHAPED_HA  0x2cd1
-#define UNITEXT_COPTIC_SMALL_LETTER_L_SHAPED_HA  L"\u2cd1"
+#define UNITEXT_COPTIC_SMALL_LETTER_L_SHAPED_HA  U"\u2cd1"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HEI  0x2cd2
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HEI  L"\u2cd2"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HEI  U"\u2cd2"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_HEI  0x2cd3
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_HEI  L"\u2cd3"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_HEI  U"\u2cd3"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HAT  0x2cd4
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HAT  L"\u2cd4"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_HAT  U"\u2cd4"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_HAT  0x2cd5
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_HAT  L"\u2cd5"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_HAT  U"\u2cd5"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_GANGIA  0x2cd6
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_GANGIA  L"\u2cd6"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_GANGIA  U"\u2cd6"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_GANGIA  0x2cd7
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_GANGIA  L"\u2cd7"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_GANGIA  U"\u2cd7"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_DJA  0x2cd8
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_DJA  L"\u2cd8"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_DJA  U"\u2cd8"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_DJA  0x2cd9
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_DJA  L"\u2cd9"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_DJA  U"\u2cd9"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_COPTIC_SHIMA  0x2cda
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_SHIMA  L"\u2cda"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_COPTIC_SHIMA  U"\u2cda"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_COPTIC_SHIMA  0x2cdb
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_SHIMA  L"\u2cdb"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_COPTIC_SHIMA  U"\u2cdb"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_SHIMA  0x2cdc
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_SHIMA  L"\u2cdc"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_SHIMA  U"\u2cdc"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_NUBIAN_SHIMA  0x2cdd
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_NUBIAN_SHIMA  L"\u2cdd"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_NUBIAN_SHIMA  U"\u2cdd"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_NGI  0x2cde
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_NGI  L"\u2cde"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_NGI  U"\u2cde"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_NUBIAN_NGI  0x2cdf
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_NUBIAN_NGI  L"\u2cdf"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_NUBIAN_NGI  U"\u2cdf"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_NYI  0x2ce0
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_NYI  L"\u2ce0"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_NYI  U"\u2ce0"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_NUBIAN_NYI  0x2ce1
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_NUBIAN_NYI  L"\u2ce1"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_NUBIAN_NYI  U"\u2ce1"
 #define UNICODE_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_WAU  0x2ce2
-#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_WAU  L"\u2ce2"
+#define UNITEXT_COPTIC_CAPITAL_LETTER_OLD_NUBIAN_WAU  U"\u2ce2"
 #define UNICODE_COPTIC_SMALL_LETTER_OLD_NUBIAN_WAU  0x2ce3
-#define UNITEXT_COPTIC_SMALL_LETTER_OLD_NUBIAN_WAU  L"\u2ce3"
+#define UNITEXT_COPTIC_SMALL_LETTER_OLD_NUBIAN_WAU  U"\u2ce3"
 #define UNICODE_COPTIC_SYMBOL_KAI  0x2ce4
-#define UNITEXT_COPTIC_SYMBOL_KAI  L"\u2ce4"
+#define UNITEXT_COPTIC_SYMBOL_KAI  U"\u2ce4"
 #define UNICODE_COPTIC_SYMBOL_MI_RO  0x2ce5
-#define UNITEXT_COPTIC_SYMBOL_MI_RO  L"\u2ce5"
+#define UNITEXT_COPTIC_SYMBOL_MI_RO  U"\u2ce5"
 #define UNICODE_COPTIC_SYMBOL_PI_RO  0x2ce6
-#define UNITEXT_COPTIC_SYMBOL_PI_RO  L"\u2ce6"
+#define UNITEXT_COPTIC_SYMBOL_PI_RO  U"\u2ce6"
 #define UNICODE_COPTIC_SYMBOL_STAUROS  0x2ce7
-#define UNITEXT_COPTIC_SYMBOL_STAUROS  L"\u2ce7"
+#define UNITEXT_COPTIC_SYMBOL_STAUROS  U"\u2ce7"
 #define UNICODE_COPTIC_SYMBOL_TAU_RO  0x2ce8
-#define UNITEXT_COPTIC_SYMBOL_TAU_RO  L"\u2ce8"
+#define UNITEXT_COPTIC_SYMBOL_TAU_RO  U"\u2ce8"
 #define UNICODE_COPTIC_SYMBOL_KHI_RO  0x2ce9
-#define UNITEXT_COPTIC_SYMBOL_KHI_RO  L"\u2ce9"
+#define UNITEXT_COPTIC_SYMBOL_KHI_RO  U"\u2ce9"
 #define UNICODE_COPTIC_SYMBOL_SHIMA_SIMA  0x2cea
-#define UNITEXT_COPTIC_SYMBOL_SHIMA_SIMA  L"\u2cea"
+#define UNITEXT_COPTIC_SYMBOL_SHIMA_SIMA  U"\u2cea"
 #define UNICODE_COPTIC_OLD_NUBIAN_FULL_STOP  0x2cf9
-#define UNITEXT_COPTIC_OLD_NUBIAN_FULL_STOP  L"\u2cf9"
+#define UNITEXT_COPTIC_OLD_NUBIAN_FULL_STOP  U"\u2cf9"
 #define UNICODE_COPTIC_OLD_NUBIAN_DIRECT_QUESTION_MARK  0x2cfa
-#define UNITEXT_COPTIC_OLD_NUBIAN_DIRECT_QUESTION_MARK  L"\u2cfa"
+#define UNITEXT_COPTIC_OLD_NUBIAN_DIRECT_QUESTION_MARK  U"\u2cfa"
 #define UNICODE_COPTIC_OLD_NUBIAN_INDIRECT_QUESTION_MARK  0x2cfb
-#define UNITEXT_COPTIC_OLD_NUBIAN_INDIRECT_QUESTION_MARK  L"\u2cfb"
+#define UNITEXT_COPTIC_OLD_NUBIAN_INDIRECT_QUESTION_MARK  U"\u2cfb"
 #define UNICODE_COPTIC_OLD_NUBIAN_VERSE_DIVIDER  0x2cfc
-#define UNITEXT_COPTIC_OLD_NUBIAN_VERSE_DIVIDER  L"\u2cfc"
+#define UNITEXT_COPTIC_OLD_NUBIAN_VERSE_DIVIDER  U"\u2cfc"
 #define UNICODE_COPTIC_FRACTION_ONE_HALF  0x2cfd
-#define UNITEXT_COPTIC_FRACTION_ONE_HALF  L"\u2cfd"
+#define UNITEXT_COPTIC_FRACTION_ONE_HALF  U"\u2cfd"
 #define UNICODE_COPTIC_FULL_STOP  0x2cfe
-#define UNITEXT_COPTIC_FULL_STOP  L"\u2cfe"
+#define UNITEXT_COPTIC_FULL_STOP  U"\u2cfe"
 #define UNICODE_COPTIC_MORPHOLOGICAL_DIVIDER  0x2cff
-#define UNITEXT_COPTIC_MORPHOLOGICAL_DIVIDER  L"\u2cff"
+#define UNITEXT_COPTIC_MORPHOLOGICAL_DIVIDER  U"\u2cff"
 #define UNICODE_GEORGIAN_SMALL_LETTER_AN  0x2d00
-#define UNITEXT_GEORGIAN_SMALL_LETTER_AN  L"\u2d00"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_AN  U"\u2d00"
 #define UNICODE_GEORGIAN_SMALL_LETTER_BAN  0x2d01
-#define UNITEXT_GEORGIAN_SMALL_LETTER_BAN  L"\u2d01"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_BAN  U"\u2d01"
 #define UNICODE_GEORGIAN_SMALL_LETTER_GAN  0x2d02
-#define UNITEXT_GEORGIAN_SMALL_LETTER_GAN  L"\u2d02"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_GAN  U"\u2d02"
 #define UNICODE_GEORGIAN_SMALL_LETTER_DON  0x2d03
-#define UNITEXT_GEORGIAN_SMALL_LETTER_DON  L"\u2d03"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_DON  U"\u2d03"
 #define UNICODE_GEORGIAN_SMALL_LETTER_EN  0x2d04
-#define UNITEXT_GEORGIAN_SMALL_LETTER_EN  L"\u2d04"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_EN  U"\u2d04"
 #define UNICODE_GEORGIAN_SMALL_LETTER_VIN  0x2d05
-#define UNITEXT_GEORGIAN_SMALL_LETTER_VIN  L"\u2d05"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_VIN  U"\u2d05"
 #define UNICODE_GEORGIAN_SMALL_LETTER_ZEN  0x2d06
-#define UNITEXT_GEORGIAN_SMALL_LETTER_ZEN  L"\u2d06"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_ZEN  U"\u2d06"
 #define UNICODE_GEORGIAN_SMALL_LETTER_TAN  0x2d07
-#define UNITEXT_GEORGIAN_SMALL_LETTER_TAN  L"\u2d07"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_TAN  U"\u2d07"
 #define UNICODE_GEORGIAN_SMALL_LETTER_IN  0x2d08
-#define UNITEXT_GEORGIAN_SMALL_LETTER_IN  L"\u2d08"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_IN  U"\u2d08"
 #define UNICODE_GEORGIAN_SMALL_LETTER_KAN  0x2d09
-#define UNITEXT_GEORGIAN_SMALL_LETTER_KAN  L"\u2d09"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_KAN  U"\u2d09"
 #define UNICODE_GEORGIAN_SMALL_LETTER_LAS  0x2d0a
-#define UNITEXT_GEORGIAN_SMALL_LETTER_LAS  L"\u2d0a"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_LAS  U"\u2d0a"
 #define UNICODE_GEORGIAN_SMALL_LETTER_MAN  0x2d0b
-#define UNITEXT_GEORGIAN_SMALL_LETTER_MAN  L"\u2d0b"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_MAN  U"\u2d0b"
 #define UNICODE_GEORGIAN_SMALL_LETTER_NAR  0x2d0c
-#define UNITEXT_GEORGIAN_SMALL_LETTER_NAR  L"\u2d0c"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_NAR  U"\u2d0c"
 #define UNICODE_GEORGIAN_SMALL_LETTER_ON  0x2d0d
-#define UNITEXT_GEORGIAN_SMALL_LETTER_ON  L"\u2d0d"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_ON  U"\u2d0d"
 #define UNICODE_GEORGIAN_SMALL_LETTER_PAR  0x2d0e
-#define UNITEXT_GEORGIAN_SMALL_LETTER_PAR  L"\u2d0e"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_PAR  U"\u2d0e"
 #define UNICODE_GEORGIAN_SMALL_LETTER_ZHAR  0x2d0f
-#define UNITEXT_GEORGIAN_SMALL_LETTER_ZHAR  L"\u2d0f"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_ZHAR  U"\u2d0f"
 #define UNICODE_GEORGIAN_SMALL_LETTER_RAE  0x2d10
-#define UNITEXT_GEORGIAN_SMALL_LETTER_RAE  L"\u2d10"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_RAE  U"\u2d10"
 #define UNICODE_GEORGIAN_SMALL_LETTER_SAN  0x2d11
-#define UNITEXT_GEORGIAN_SMALL_LETTER_SAN  L"\u2d11"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_SAN  U"\u2d11"
 #define UNICODE_GEORGIAN_SMALL_LETTER_TAR  0x2d12
-#define UNITEXT_GEORGIAN_SMALL_LETTER_TAR  L"\u2d12"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_TAR  U"\u2d12"
 #define UNICODE_GEORGIAN_SMALL_LETTER_UN  0x2d13
-#define UNITEXT_GEORGIAN_SMALL_LETTER_UN  L"\u2d13"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_UN  U"\u2d13"
 #define UNICODE_GEORGIAN_SMALL_LETTER_PHAR  0x2d14
-#define UNITEXT_GEORGIAN_SMALL_LETTER_PHAR  L"\u2d14"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_PHAR  U"\u2d14"
 #define UNICODE_GEORGIAN_SMALL_LETTER_KHAR  0x2d15
-#define UNITEXT_GEORGIAN_SMALL_LETTER_KHAR  L"\u2d15"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_KHAR  U"\u2d15"
 #define UNICODE_GEORGIAN_SMALL_LETTER_GHAN  0x2d16
-#define UNITEXT_GEORGIAN_SMALL_LETTER_GHAN  L"\u2d16"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_GHAN  U"\u2d16"
 #define UNICODE_GEORGIAN_SMALL_LETTER_QAR  0x2d17
-#define UNITEXT_GEORGIAN_SMALL_LETTER_QAR  L"\u2d17"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_QAR  U"\u2d17"
 #define UNICODE_GEORGIAN_SMALL_LETTER_SHIN  0x2d18
-#define UNITEXT_GEORGIAN_SMALL_LETTER_SHIN  L"\u2d18"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_SHIN  U"\u2d18"
 #define UNICODE_GEORGIAN_SMALL_LETTER_CHIN  0x2d19
-#define UNITEXT_GEORGIAN_SMALL_LETTER_CHIN  L"\u2d19"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_CHIN  U"\u2d19"
 #define UNICODE_GEORGIAN_SMALL_LETTER_CAN  0x2d1a
-#define UNITEXT_GEORGIAN_SMALL_LETTER_CAN  L"\u2d1a"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_CAN  U"\u2d1a"
 #define UNICODE_GEORGIAN_SMALL_LETTER_JIL  0x2d1b
-#define UNITEXT_GEORGIAN_SMALL_LETTER_JIL  L"\u2d1b"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_JIL  U"\u2d1b"
 #define UNICODE_GEORGIAN_SMALL_LETTER_CIL  0x2d1c
-#define UNITEXT_GEORGIAN_SMALL_LETTER_CIL  L"\u2d1c"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_CIL  U"\u2d1c"
 #define UNICODE_GEORGIAN_SMALL_LETTER_CHAR  0x2d1d
-#define UNITEXT_GEORGIAN_SMALL_LETTER_CHAR  L"\u2d1d"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_CHAR  U"\u2d1d"
 #define UNICODE_GEORGIAN_SMALL_LETTER_XAN  0x2d1e
-#define UNITEXT_GEORGIAN_SMALL_LETTER_XAN  L"\u2d1e"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_XAN  U"\u2d1e"
 #define UNICODE_GEORGIAN_SMALL_LETTER_JHAN  0x2d1f
-#define UNITEXT_GEORGIAN_SMALL_LETTER_JHAN  L"\u2d1f"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_JHAN  U"\u2d1f"
 #define UNICODE_GEORGIAN_SMALL_LETTER_HAE  0x2d20
-#define UNITEXT_GEORGIAN_SMALL_LETTER_HAE  L"\u2d20"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_HAE  U"\u2d20"
 #define UNICODE_GEORGIAN_SMALL_LETTER_HE  0x2d21
-#define UNITEXT_GEORGIAN_SMALL_LETTER_HE  L"\u2d21"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_HE  U"\u2d21"
 #define UNICODE_GEORGIAN_SMALL_LETTER_HIE  0x2d22
-#define UNITEXT_GEORGIAN_SMALL_LETTER_HIE  L"\u2d22"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_HIE  U"\u2d22"
 #define UNICODE_GEORGIAN_SMALL_LETTER_WE  0x2d23
-#define UNITEXT_GEORGIAN_SMALL_LETTER_WE  L"\u2d23"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_WE  U"\u2d23"
 #define UNICODE_GEORGIAN_SMALL_LETTER_HAR  0x2d24
-#define UNITEXT_GEORGIAN_SMALL_LETTER_HAR  L"\u2d24"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_HAR  U"\u2d24"
 #define UNICODE_GEORGIAN_SMALL_LETTER_HOE  0x2d25
-#define UNITEXT_GEORGIAN_SMALL_LETTER_HOE  L"\u2d25"
+#define UNITEXT_GEORGIAN_SMALL_LETTER_HOE  U"\u2d25"
 #define UNICODE_TIFINAGH_LETTER_YA  0x2d30
-#define UNITEXT_TIFINAGH_LETTER_YA  L"\u2d30"
+#define UNITEXT_TIFINAGH_LETTER_YA  U"\u2d30"
 #define UNICODE_TIFINAGH_LETTER_YAB  0x2d31
-#define UNITEXT_TIFINAGH_LETTER_YAB  L"\u2d31"
+#define UNITEXT_TIFINAGH_LETTER_YAB  U"\u2d31"
 #define UNICODE_TIFINAGH_LETTER_YABH  0x2d32
-#define UNITEXT_TIFINAGH_LETTER_YABH  L"\u2d32"
+#define UNITEXT_TIFINAGH_LETTER_YABH  U"\u2d32"
 #define UNICODE_TIFINAGH_LETTER_YAG  0x2d33
-#define UNITEXT_TIFINAGH_LETTER_YAG  L"\u2d33"
+#define UNITEXT_TIFINAGH_LETTER_YAG  U"\u2d33"
 #define UNICODE_TIFINAGH_LETTER_YAGHH  0x2d34
-#define UNITEXT_TIFINAGH_LETTER_YAGHH  L"\u2d34"
+#define UNITEXT_TIFINAGH_LETTER_YAGHH  U"\u2d34"
 #define UNICODE_TIFINAGH_LETTER_BERBER_ACADEMY_YAJ  0x2d35
-#define UNITEXT_TIFINAGH_LETTER_BERBER_ACADEMY_YAJ  L"\u2d35"
+#define UNITEXT_TIFINAGH_LETTER_BERBER_ACADEMY_YAJ  U"\u2d35"
 #define UNICODE_TIFINAGH_LETTER_YAJ  0x2d36
-#define UNITEXT_TIFINAGH_LETTER_YAJ  L"\u2d36"
+#define UNITEXT_TIFINAGH_LETTER_YAJ  U"\u2d36"
 #define UNICODE_TIFINAGH_LETTER_YAD  0x2d37
-#define UNITEXT_TIFINAGH_LETTER_YAD  L"\u2d37"
+#define UNITEXT_TIFINAGH_LETTER_YAD  U"\u2d37"
 #define UNICODE_TIFINAGH_LETTER_YADH  0x2d38
-#define UNITEXT_TIFINAGH_LETTER_YADH  L"\u2d38"
+#define UNITEXT_TIFINAGH_LETTER_YADH  U"\u2d38"
 #define UNICODE_TIFINAGH_LETTER_YADD  0x2d39
-#define UNITEXT_TIFINAGH_LETTER_YADD  L"\u2d39"
+#define UNITEXT_TIFINAGH_LETTER_YADD  U"\u2d39"
 #define UNICODE_TIFINAGH_LETTER_YADDH  0x2d3a
-#define UNITEXT_TIFINAGH_LETTER_YADDH  L"\u2d3a"
+#define UNITEXT_TIFINAGH_LETTER_YADDH  U"\u2d3a"
 #define UNICODE_TIFINAGH_LETTER_YEY  0x2d3b
-#define UNITEXT_TIFINAGH_LETTER_YEY  L"\u2d3b"
+#define UNITEXT_TIFINAGH_LETTER_YEY  U"\u2d3b"
 #define UNICODE_TIFINAGH_LETTER_YAF  0x2d3c
-#define UNITEXT_TIFINAGH_LETTER_YAF  L"\u2d3c"
+#define UNITEXT_TIFINAGH_LETTER_YAF  U"\u2d3c"
 #define UNICODE_TIFINAGH_LETTER_YAK  0x2d3d
-#define UNITEXT_TIFINAGH_LETTER_YAK  L"\u2d3d"
+#define UNITEXT_TIFINAGH_LETTER_YAK  U"\u2d3d"
 #define UNICODE_TIFINAGH_LETTER_TUAREG_YAK  0x2d3e
-#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAK  L"\u2d3e"
+#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAK  U"\u2d3e"
 #define UNICODE_TIFINAGH_LETTER_YAKHH  0x2d3f
-#define UNITEXT_TIFINAGH_LETTER_YAKHH  L"\u2d3f"
+#define UNITEXT_TIFINAGH_LETTER_YAKHH  U"\u2d3f"
 #define UNICODE_TIFINAGH_LETTER_YAH  0x2d40
-#define UNITEXT_TIFINAGH_LETTER_YAH  L"\u2d40"
+#define UNITEXT_TIFINAGH_LETTER_YAH  U"\u2d40"
 #define UNICODE_TIFINAGH_LETTER_BERBER_ACADEMY_YAH  0x2d41
-#define UNITEXT_TIFINAGH_LETTER_BERBER_ACADEMY_YAH  L"\u2d41"
+#define UNITEXT_TIFINAGH_LETTER_BERBER_ACADEMY_YAH  U"\u2d41"
 #define UNICODE_TIFINAGH_LETTER_TUAREG_YAH  0x2d42
-#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAH  L"\u2d42"
+#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAH  U"\u2d42"
 #define UNICODE_TIFINAGH_LETTER_YAHH  0x2d43
-#define UNITEXT_TIFINAGH_LETTER_YAHH  L"\u2d43"
+#define UNITEXT_TIFINAGH_LETTER_YAHH  U"\u2d43"
 #define UNICODE_TIFINAGH_LETTER_YAA  0x2d44
-#define UNITEXT_TIFINAGH_LETTER_YAA  L"\u2d44"
+#define UNITEXT_TIFINAGH_LETTER_YAA  U"\u2d44"
 #define UNICODE_TIFINAGH_LETTER_YAKH  0x2d45
-#define UNITEXT_TIFINAGH_LETTER_YAKH  L"\u2d45"
+#define UNITEXT_TIFINAGH_LETTER_YAKH  U"\u2d45"
 #define UNICODE_TIFINAGH_LETTER_TUAREG_YAKH  0x2d46
-#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAKH  L"\u2d46"
+#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAKH  U"\u2d46"
 #define UNICODE_TIFINAGH_LETTER_YAQ  0x2d47
-#define UNITEXT_TIFINAGH_LETTER_YAQ  L"\u2d47"
+#define UNITEXT_TIFINAGH_LETTER_YAQ  U"\u2d47"
 #define UNICODE_TIFINAGH_LETTER_TUAREG_YAQ  0x2d48
-#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAQ  L"\u2d48"
+#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAQ  U"\u2d48"
 #define UNICODE_TIFINAGH_LETTER_YI  0x2d49
-#define UNITEXT_TIFINAGH_LETTER_YI  L"\u2d49"
+#define UNITEXT_TIFINAGH_LETTER_YI  U"\u2d49"
 #define UNICODE_TIFINAGH_LETTER_YAZH  0x2d4a
-#define UNITEXT_TIFINAGH_LETTER_YAZH  L"\u2d4a"
+#define UNITEXT_TIFINAGH_LETTER_YAZH  U"\u2d4a"
 #define UNICODE_TIFINAGH_LETTER_AHAGGAR_YAZH  0x2d4b
-#define UNITEXT_TIFINAGH_LETTER_AHAGGAR_YAZH  L"\u2d4b"
+#define UNITEXT_TIFINAGH_LETTER_AHAGGAR_YAZH  U"\u2d4b"
 #define UNICODE_TIFINAGH_LETTER_TUAREG_YAZH  0x2d4c
-#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAZH  L"\u2d4c"
+#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAZH  U"\u2d4c"
 #define UNICODE_TIFINAGH_LETTER_YAL  0x2d4d
-#define UNITEXT_TIFINAGH_LETTER_YAL  L"\u2d4d"
+#define UNITEXT_TIFINAGH_LETTER_YAL  U"\u2d4d"
 #define UNICODE_TIFINAGH_LETTER_YAM  0x2d4e
-#define UNITEXT_TIFINAGH_LETTER_YAM  L"\u2d4e"
+#define UNITEXT_TIFINAGH_LETTER_YAM  U"\u2d4e"
 #define UNICODE_TIFINAGH_LETTER_YAN  0x2d4f
-#define UNITEXT_TIFINAGH_LETTER_YAN  L"\u2d4f"
+#define UNITEXT_TIFINAGH_LETTER_YAN  U"\u2d4f"
 #define UNICODE_TIFINAGH_LETTER_TUAREG_YAGN  0x2d50
-#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAGN  L"\u2d50"
+#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAGN  U"\u2d50"
 #define UNICODE_TIFINAGH_LETTER_TUAREG_YANG  0x2d51
-#define UNITEXT_TIFINAGH_LETTER_TUAREG_YANG  L"\u2d51"
+#define UNITEXT_TIFINAGH_LETTER_TUAREG_YANG  U"\u2d51"
 #define UNICODE_TIFINAGH_LETTER_YAP  0x2d52
-#define UNITEXT_TIFINAGH_LETTER_YAP  L"\u2d52"
+#define UNITEXT_TIFINAGH_LETTER_YAP  U"\u2d52"
 #define UNICODE_TIFINAGH_LETTER_YU  0x2d53
-#define UNITEXT_TIFINAGH_LETTER_YU  L"\u2d53"
+#define UNITEXT_TIFINAGH_LETTER_YU  U"\u2d53"
 #define UNICODE_TIFINAGH_LETTER_YAR  0x2d54
-#define UNITEXT_TIFINAGH_LETTER_YAR  L"\u2d54"
+#define UNITEXT_TIFINAGH_LETTER_YAR  U"\u2d54"
 #define UNICODE_TIFINAGH_LETTER_YARR  0x2d55
-#define UNITEXT_TIFINAGH_LETTER_YARR  L"\u2d55"
+#define UNITEXT_TIFINAGH_LETTER_YARR  U"\u2d55"
 #define UNICODE_TIFINAGH_LETTER_YAGH  0x2d56
-#define UNITEXT_TIFINAGH_LETTER_YAGH  L"\u2d56"
+#define UNITEXT_TIFINAGH_LETTER_YAGH  U"\u2d56"
 #define UNICODE_TIFINAGH_LETTER_TUAREG_YAGH  0x2d57
-#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAGH  L"\u2d57"
+#define UNITEXT_TIFINAGH_LETTER_TUAREG_YAGH  U"\u2d57"
 #define UNICODE_TIFINAGH_LETTER_AYER_YAGH  0x2d58
-#define UNITEXT_TIFINAGH_LETTER_AYER_YAGH  L"\u2d58"
+#define UNITEXT_TIFINAGH_LETTER_AYER_YAGH  U"\u2d58"
 #define UNICODE_TIFINAGH_LETTER_YAS  0x2d59
-#define UNITEXT_TIFINAGH_LETTER_YAS  L"\u2d59"
+#define UNITEXT_TIFINAGH_LETTER_YAS  U"\u2d59"
 #define UNICODE_TIFINAGH_LETTER_YASS  0x2d5a
-#define UNITEXT_TIFINAGH_LETTER_YASS  L"\u2d5a"
+#define UNITEXT_TIFINAGH_LETTER_YASS  U"\u2d5a"
 #define UNICODE_TIFINAGH_LETTER_YASH  0x2d5b
-#define UNITEXT_TIFINAGH_LETTER_YASH  L"\u2d5b"
+#define UNITEXT_TIFINAGH_LETTER_YASH  U"\u2d5b"
 #define UNICODE_TIFINAGH_LETTER_YAT  0x2d5c
-#define UNITEXT_TIFINAGH_LETTER_YAT  L"\u2d5c"
+#define UNITEXT_TIFINAGH_LETTER_YAT  U"\u2d5c"
 #define UNICODE_TIFINAGH_LETTER_YATH  0x2d5d
-#define UNITEXT_TIFINAGH_LETTER_YATH  L"\u2d5d"
+#define UNITEXT_TIFINAGH_LETTER_YATH  U"\u2d5d"
 #define UNICODE_TIFINAGH_LETTER_YACH  0x2d5e
-#define UNITEXT_TIFINAGH_LETTER_YACH  L"\u2d5e"
+#define UNITEXT_TIFINAGH_LETTER_YACH  U"\u2d5e"
 #define UNICODE_TIFINAGH_LETTER_YATT  0x2d5f
-#define UNITEXT_TIFINAGH_LETTER_YATT  L"\u2d5f"
+#define UNITEXT_TIFINAGH_LETTER_YATT  U"\u2d5f"
 #define UNICODE_TIFINAGH_LETTER_YAV  0x2d60
-#define UNITEXT_TIFINAGH_LETTER_YAV  L"\u2d60"
+#define UNITEXT_TIFINAGH_LETTER_YAV  U"\u2d60"
 #define UNICODE_TIFINAGH_LETTER_YAW  0x2d61
-#define UNITEXT_TIFINAGH_LETTER_YAW  L"\u2d61"
+#define UNITEXT_TIFINAGH_LETTER_YAW  U"\u2d61"
 #define UNICODE_TIFINAGH_LETTER_YAY  0x2d62
-#define UNITEXT_TIFINAGH_LETTER_YAY  L"\u2d62"
+#define UNITEXT_TIFINAGH_LETTER_YAY  U"\u2d62"
 #define UNICODE_TIFINAGH_LETTER_YAZ  0x2d63
-#define UNITEXT_TIFINAGH_LETTER_YAZ  L"\u2d63"
+#define UNITEXT_TIFINAGH_LETTER_YAZ  U"\u2d63"
 #define UNICODE_TIFINAGH_LETTER_TAWELLEMET_YAZ  0x2d64
-#define UNITEXT_TIFINAGH_LETTER_TAWELLEMET_YAZ  L"\u2d64"
+#define UNITEXT_TIFINAGH_LETTER_TAWELLEMET_YAZ  U"\u2d64"
 #define UNICODE_TIFINAGH_LETTER_YAZZ  0x2d65
-#define UNITEXT_TIFINAGH_LETTER_YAZZ  L"\u2d65"
+#define UNITEXT_TIFINAGH_LETTER_YAZZ  U"\u2d65"
 #define UNICODE_TIFINAGH_MODIFIER_LETTER_LABIALIZATION_MARK  0x2d6f
-#define UNITEXT_TIFINAGH_MODIFIER_LETTER_LABIALIZATION_MARK  L"\u2d6f"
+#define UNITEXT_TIFINAGH_MODIFIER_LETTER_LABIALIZATION_MARK  U"\u2d6f"
 #define UNICODE_ETHIOPIC_SYLLABLE_LOA  0x2d80
-#define UNITEXT_ETHIOPIC_SYLLABLE_LOA  L"\u2d80"
+#define UNITEXT_ETHIOPIC_SYLLABLE_LOA  U"\u2d80"
 #define UNICODE_ETHIOPIC_SYLLABLE_MOA  0x2d81
-#define UNITEXT_ETHIOPIC_SYLLABLE_MOA  L"\u2d81"
+#define UNITEXT_ETHIOPIC_SYLLABLE_MOA  U"\u2d81"
 #define UNICODE_ETHIOPIC_SYLLABLE_ROA  0x2d82
-#define UNITEXT_ETHIOPIC_SYLLABLE_ROA  L"\u2d82"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ROA  U"\u2d82"
 #define UNICODE_ETHIOPIC_SYLLABLE_SOA  0x2d83
-#define UNITEXT_ETHIOPIC_SYLLABLE_SOA  L"\u2d83"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SOA  U"\u2d83"
 #define UNICODE_ETHIOPIC_SYLLABLE_SHOA  0x2d84
-#define UNITEXT_ETHIOPIC_SYLLABLE_SHOA  L"\u2d84"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SHOA  U"\u2d84"
 #define UNICODE_ETHIOPIC_SYLLABLE_BOA  0x2d85
-#define UNITEXT_ETHIOPIC_SYLLABLE_BOA  L"\u2d85"
+#define UNITEXT_ETHIOPIC_SYLLABLE_BOA  U"\u2d85"
 #define UNICODE_ETHIOPIC_SYLLABLE_TOA  0x2d86
-#define UNITEXT_ETHIOPIC_SYLLABLE_TOA  L"\u2d86"
+#define UNITEXT_ETHIOPIC_SYLLABLE_TOA  U"\u2d86"
 #define UNICODE_ETHIOPIC_SYLLABLE_COA  0x2d87
-#define UNITEXT_ETHIOPIC_SYLLABLE_COA  L"\u2d87"
+#define UNITEXT_ETHIOPIC_SYLLABLE_COA  U"\u2d87"
 #define UNICODE_ETHIOPIC_SYLLABLE_NOA  0x2d88
-#define UNITEXT_ETHIOPIC_SYLLABLE_NOA  L"\u2d88"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NOA  U"\u2d88"
 #define UNICODE_ETHIOPIC_SYLLABLE_NYOA  0x2d89
-#define UNITEXT_ETHIOPIC_SYLLABLE_NYOA  L"\u2d89"
+#define UNITEXT_ETHIOPIC_SYLLABLE_NYOA  U"\u2d89"
 #define UNICODE_ETHIOPIC_SYLLABLE_GLOTTAL_OA  0x2d8a
-#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_OA  L"\u2d8a"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GLOTTAL_OA  U"\u2d8a"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZOA  0x2d8b
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZOA  L"\u2d8b"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZOA  U"\u2d8b"
 #define UNICODE_ETHIOPIC_SYLLABLE_DOA  0x2d8c
-#define UNITEXT_ETHIOPIC_SYLLABLE_DOA  L"\u2d8c"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DOA  U"\u2d8c"
 #define UNICODE_ETHIOPIC_SYLLABLE_DDOA  0x2d8d
-#define UNITEXT_ETHIOPIC_SYLLABLE_DDOA  L"\u2d8d"
+#define UNITEXT_ETHIOPIC_SYLLABLE_DDOA  U"\u2d8d"
 #define UNICODE_ETHIOPIC_SYLLABLE_JOA  0x2d8e
-#define UNITEXT_ETHIOPIC_SYLLABLE_JOA  L"\u2d8e"
+#define UNITEXT_ETHIOPIC_SYLLABLE_JOA  U"\u2d8e"
 #define UNICODE_ETHIOPIC_SYLLABLE_THOA  0x2d8f
-#define UNITEXT_ETHIOPIC_SYLLABLE_THOA  L"\u2d8f"
+#define UNITEXT_ETHIOPIC_SYLLABLE_THOA  U"\u2d8f"
 #define UNICODE_ETHIOPIC_SYLLABLE_CHOA  0x2d90
-#define UNITEXT_ETHIOPIC_SYLLABLE_CHOA  L"\u2d90"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CHOA  U"\u2d90"
 #define UNICODE_ETHIOPIC_SYLLABLE_PHOA  0x2d91
-#define UNITEXT_ETHIOPIC_SYLLABLE_PHOA  L"\u2d91"
+#define UNITEXT_ETHIOPIC_SYLLABLE_PHOA  U"\u2d91"
 #define UNICODE_ETHIOPIC_SYLLABLE_POA  0x2d92
-#define UNITEXT_ETHIOPIC_SYLLABLE_POA  L"\u2d92"
+#define UNITEXT_ETHIOPIC_SYLLABLE_POA  U"\u2d92"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGWA  0x2d93
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGWA  L"\u2d93"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGWA  U"\u2d93"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGWI  0x2d94
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGWI  L"\u2d94"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGWI  U"\u2d94"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGWEE  0x2d95
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGWEE  L"\u2d95"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGWEE  U"\u2d95"
 #define UNICODE_ETHIOPIC_SYLLABLE_GGWE  0x2d96
-#define UNITEXT_ETHIOPIC_SYLLABLE_GGWE  L"\u2d96"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GGWE  U"\u2d96"
 #define UNICODE_ETHIOPIC_SYLLABLE_SSA  0x2da0
-#define UNITEXT_ETHIOPIC_SYLLABLE_SSA  L"\u2da0"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SSA  U"\u2da0"
 #define UNICODE_ETHIOPIC_SYLLABLE_SSU  0x2da1
-#define UNITEXT_ETHIOPIC_SYLLABLE_SSU  L"\u2da1"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SSU  U"\u2da1"
 #define UNICODE_ETHIOPIC_SYLLABLE_SSI  0x2da2
-#define UNITEXT_ETHIOPIC_SYLLABLE_SSI  L"\u2da2"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SSI  U"\u2da2"
 #define UNICODE_ETHIOPIC_SYLLABLE_SSAA  0x2da3
-#define UNITEXT_ETHIOPIC_SYLLABLE_SSAA  L"\u2da3"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SSAA  U"\u2da3"
 #define UNICODE_ETHIOPIC_SYLLABLE_SSEE  0x2da4
-#define UNITEXT_ETHIOPIC_SYLLABLE_SSEE  L"\u2da4"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SSEE  U"\u2da4"
 #define UNICODE_ETHIOPIC_SYLLABLE_SSE  0x2da5
-#define UNITEXT_ETHIOPIC_SYLLABLE_SSE  L"\u2da5"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SSE  U"\u2da5"
 #define UNICODE_ETHIOPIC_SYLLABLE_SSO  0x2da6
-#define UNITEXT_ETHIOPIC_SYLLABLE_SSO  L"\u2da6"
+#define UNITEXT_ETHIOPIC_SYLLABLE_SSO  U"\u2da6"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCA  0x2da8
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCA  L"\u2da8"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCA  U"\u2da8"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCU  0x2da9
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCU  L"\u2da9"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCU  U"\u2da9"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCI  0x2daa
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCI  L"\u2daa"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCI  U"\u2daa"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCAA  0x2dab
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCAA  L"\u2dab"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCAA  U"\u2dab"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCEE  0x2dac
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCEE  L"\u2dac"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCEE  U"\u2dac"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCE  0x2dad
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCE  L"\u2dad"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCE  U"\u2dad"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCO  0x2dae
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCO  L"\u2dae"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCO  U"\u2dae"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZZA  0x2db0
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZZA  L"\u2db0"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZZA  U"\u2db0"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZZU  0x2db1
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZZU  L"\u2db1"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZZU  U"\u2db1"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZZI  0x2db2
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZZI  L"\u2db2"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZZI  U"\u2db2"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZZAA  0x2db3
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZZAA  L"\u2db3"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZZAA  U"\u2db3"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZZEE  0x2db4
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZZEE  L"\u2db4"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZZEE  U"\u2db4"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZZE  0x2db5
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZZE  L"\u2db5"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZZE  U"\u2db5"
 #define UNICODE_ETHIOPIC_SYLLABLE_ZZO  0x2db6
-#define UNITEXT_ETHIOPIC_SYLLABLE_ZZO  L"\u2db6"
+#define UNITEXT_ETHIOPIC_SYLLABLE_ZZO  U"\u2db6"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCHA  0x2db8
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCHA  L"\u2db8"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCHA  U"\u2db8"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCHU  0x2db9
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCHU  L"\u2db9"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCHU  U"\u2db9"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCHI  0x2dba
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCHI  L"\u2dba"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCHI  U"\u2dba"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCHAA  0x2dbb
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCHAA  L"\u2dbb"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCHAA  U"\u2dbb"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCHEE  0x2dbc
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCHEE  L"\u2dbc"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCHEE  U"\u2dbc"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCHE  0x2dbd
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCHE  L"\u2dbd"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCHE  U"\u2dbd"
 #define UNICODE_ETHIOPIC_SYLLABLE_CCHO  0x2dbe
-#define UNITEXT_ETHIOPIC_SYLLABLE_CCHO  L"\u2dbe"
+#define UNITEXT_ETHIOPIC_SYLLABLE_CCHO  U"\u2dbe"
 #define UNICODE_ETHIOPIC_SYLLABLE_QYA  0x2dc0
-#define UNITEXT_ETHIOPIC_SYLLABLE_QYA  L"\u2dc0"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QYA  U"\u2dc0"
 #define UNICODE_ETHIOPIC_SYLLABLE_QYU  0x2dc1
-#define UNITEXT_ETHIOPIC_SYLLABLE_QYU  L"\u2dc1"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QYU  U"\u2dc1"
 #define UNICODE_ETHIOPIC_SYLLABLE_QYI  0x2dc2
-#define UNITEXT_ETHIOPIC_SYLLABLE_QYI  L"\u2dc2"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QYI  U"\u2dc2"
 #define UNICODE_ETHIOPIC_SYLLABLE_QYAA  0x2dc3
-#define UNITEXT_ETHIOPIC_SYLLABLE_QYAA  L"\u2dc3"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QYAA  U"\u2dc3"
 #define UNICODE_ETHIOPIC_SYLLABLE_QYEE  0x2dc4
-#define UNITEXT_ETHIOPIC_SYLLABLE_QYEE  L"\u2dc4"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QYEE  U"\u2dc4"
 #define UNICODE_ETHIOPIC_SYLLABLE_QYE  0x2dc5
-#define UNITEXT_ETHIOPIC_SYLLABLE_QYE  L"\u2dc5"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QYE  U"\u2dc5"
 #define UNICODE_ETHIOPIC_SYLLABLE_QYO  0x2dc6
-#define UNITEXT_ETHIOPIC_SYLLABLE_QYO  L"\u2dc6"
+#define UNITEXT_ETHIOPIC_SYLLABLE_QYO  U"\u2dc6"
 #define UNICODE_ETHIOPIC_SYLLABLE_KYA  0x2dc8
-#define UNITEXT_ETHIOPIC_SYLLABLE_KYA  L"\u2dc8"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KYA  U"\u2dc8"
 #define UNICODE_ETHIOPIC_SYLLABLE_KYU  0x2dc9
-#define UNITEXT_ETHIOPIC_SYLLABLE_KYU  L"\u2dc9"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KYU  U"\u2dc9"
 #define UNICODE_ETHIOPIC_SYLLABLE_KYI  0x2dca
-#define UNITEXT_ETHIOPIC_SYLLABLE_KYI  L"\u2dca"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KYI  U"\u2dca"
 #define UNICODE_ETHIOPIC_SYLLABLE_KYAA  0x2dcb
-#define UNITEXT_ETHIOPIC_SYLLABLE_KYAA  L"\u2dcb"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KYAA  U"\u2dcb"
 #define UNICODE_ETHIOPIC_SYLLABLE_KYEE  0x2dcc
-#define UNITEXT_ETHIOPIC_SYLLABLE_KYEE  L"\u2dcc"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KYEE  U"\u2dcc"
 #define UNICODE_ETHIOPIC_SYLLABLE_KYE  0x2dcd
-#define UNITEXT_ETHIOPIC_SYLLABLE_KYE  L"\u2dcd"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KYE  U"\u2dcd"
 #define UNICODE_ETHIOPIC_SYLLABLE_KYO  0x2dce
-#define UNITEXT_ETHIOPIC_SYLLABLE_KYO  L"\u2dce"
+#define UNITEXT_ETHIOPIC_SYLLABLE_KYO  U"\u2dce"
 #define UNICODE_ETHIOPIC_SYLLABLE_XYA  0x2dd0
-#define UNITEXT_ETHIOPIC_SYLLABLE_XYA  L"\u2dd0"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XYA  U"\u2dd0"
 #define UNICODE_ETHIOPIC_SYLLABLE_XYU  0x2dd1
-#define UNITEXT_ETHIOPIC_SYLLABLE_XYU  L"\u2dd1"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XYU  U"\u2dd1"
 #define UNICODE_ETHIOPIC_SYLLABLE_XYI  0x2dd2
-#define UNITEXT_ETHIOPIC_SYLLABLE_XYI  L"\u2dd2"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XYI  U"\u2dd2"
 #define UNICODE_ETHIOPIC_SYLLABLE_XYAA  0x2dd3
-#define UNITEXT_ETHIOPIC_SYLLABLE_XYAA  L"\u2dd3"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XYAA  U"\u2dd3"
 #define UNICODE_ETHIOPIC_SYLLABLE_XYEE  0x2dd4
-#define UNITEXT_ETHIOPIC_SYLLABLE_XYEE  L"\u2dd4"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XYEE  U"\u2dd4"
 #define UNICODE_ETHIOPIC_SYLLABLE_XYE  0x2dd5
-#define UNITEXT_ETHIOPIC_SYLLABLE_XYE  L"\u2dd5"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XYE  U"\u2dd5"
 #define UNICODE_ETHIOPIC_SYLLABLE_XYO  0x2dd6
-#define UNITEXT_ETHIOPIC_SYLLABLE_XYO  L"\u2dd6"
+#define UNITEXT_ETHIOPIC_SYLLABLE_XYO  U"\u2dd6"
 #define UNICODE_ETHIOPIC_SYLLABLE_GYA  0x2dd8
-#define UNITEXT_ETHIOPIC_SYLLABLE_GYA  L"\u2dd8"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GYA  U"\u2dd8"
 #define UNICODE_ETHIOPIC_SYLLABLE_GYU  0x2dd9
-#define UNITEXT_ETHIOPIC_SYLLABLE_GYU  L"\u2dd9"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GYU  U"\u2dd9"
 #define UNICODE_ETHIOPIC_SYLLABLE_GYI  0x2dda
-#define UNITEXT_ETHIOPIC_SYLLABLE_GYI  L"\u2dda"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GYI  U"\u2dda"
 #define UNICODE_ETHIOPIC_SYLLABLE_GYAA  0x2ddb
-#define UNITEXT_ETHIOPIC_SYLLABLE_GYAA  L"\u2ddb"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GYAA  U"\u2ddb"
 #define UNICODE_ETHIOPIC_SYLLABLE_GYEE  0x2ddc
-#define UNITEXT_ETHIOPIC_SYLLABLE_GYEE  L"\u2ddc"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GYEE  U"\u2ddc"
 #define UNICODE_ETHIOPIC_SYLLABLE_GYE  0x2ddd
-#define UNITEXT_ETHIOPIC_SYLLABLE_GYE  L"\u2ddd"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GYE  U"\u2ddd"
 #define UNICODE_ETHIOPIC_SYLLABLE_GYO  0x2dde
-#define UNITEXT_ETHIOPIC_SYLLABLE_GYO  L"\u2dde"
+#define UNITEXT_ETHIOPIC_SYLLABLE_GYO  U"\u2dde"
 #define UNICODE_RIGHT_ANGLE_SUBSTITUTION_MARKER  0x2e00
-#define UNITEXT_RIGHT_ANGLE_SUBSTITUTION_MARKER  L"\u2e00"
+#define UNITEXT_RIGHT_ANGLE_SUBSTITUTION_MARKER  U"\u2e00"
 #define UNICODE_RIGHT_ANGLE_DOTTED_SUBSTITUTION_MARKER  0x2e01
-#define UNITEXT_RIGHT_ANGLE_DOTTED_SUBSTITUTION_MARKER  L"\u2e01"
+#define UNITEXT_RIGHT_ANGLE_DOTTED_SUBSTITUTION_MARKER  U"\u2e01"
 #define UNICODE_LEFT_SUBSTITUTION_BRACKET  0x2e02
-#define UNITEXT_LEFT_SUBSTITUTION_BRACKET  L"\u2e02"
+#define UNITEXT_LEFT_SUBSTITUTION_BRACKET  U"\u2e02"
 #define UNICODE_RIGHT_SUBSTITUTION_BRACKET  0x2e03
-#define UNITEXT_RIGHT_SUBSTITUTION_BRACKET  L"\u2e03"
+#define UNITEXT_RIGHT_SUBSTITUTION_BRACKET  U"\u2e03"
 #define UNICODE_LEFT_DOTTED_SUBSTITUTION_BRACKET  0x2e04
-#define UNITEXT_LEFT_DOTTED_SUBSTITUTION_BRACKET  L"\u2e04"
+#define UNITEXT_LEFT_DOTTED_SUBSTITUTION_BRACKET  U"\u2e04"
 #define UNICODE_RIGHT_DOTTED_SUBSTITUTION_BRACKET  0x2e05
-#define UNITEXT_RIGHT_DOTTED_SUBSTITUTION_BRACKET  L"\u2e05"
+#define UNITEXT_RIGHT_DOTTED_SUBSTITUTION_BRACKET  U"\u2e05"
 #define UNICODE_RAISED_INTERPOLATION_MARKER  0x2e06
-#define UNITEXT_RAISED_INTERPOLATION_MARKER  L"\u2e06"
+#define UNITEXT_RAISED_INTERPOLATION_MARKER  U"\u2e06"
 #define UNICODE_RAISED_DOTTED_INTERPOLATION_MARKER  0x2e07
-#define UNITEXT_RAISED_DOTTED_INTERPOLATION_MARKER  L"\u2e07"
+#define UNITEXT_RAISED_DOTTED_INTERPOLATION_MARKER  U"\u2e07"
 #define UNICODE_DOTTED_TRANSPOSITION_MARKER  0x2e08
-#define UNITEXT_DOTTED_TRANSPOSITION_MARKER  L"\u2e08"
+#define UNITEXT_DOTTED_TRANSPOSITION_MARKER  U"\u2e08"
 #define UNICODE_LEFT_TRANSPOSITION_BRACKET  0x2e09
-#define UNITEXT_LEFT_TRANSPOSITION_BRACKET  L"\u2e09"
+#define UNITEXT_LEFT_TRANSPOSITION_BRACKET  U"\u2e09"
 #define UNICODE_RIGHT_TRANSPOSITION_BRACKET  0x2e0a
-#define UNITEXT_RIGHT_TRANSPOSITION_BRACKET  L"\u2e0a"
+#define UNITEXT_RIGHT_TRANSPOSITION_BRACKET  U"\u2e0a"
 #define UNICODE_RAISED_SQUARE  0x2e0b
-#define UNITEXT_RAISED_SQUARE  L"\u2e0b"
+#define UNITEXT_RAISED_SQUARE  U"\u2e0b"
 #define UNICODE_LEFT_RAISED_OMISSION_BRACKET  0x2e0c
-#define UNITEXT_LEFT_RAISED_OMISSION_BRACKET  L"\u2e0c"
+#define UNITEXT_LEFT_RAISED_OMISSION_BRACKET  U"\u2e0c"
 #define UNICODE_RIGHT_RAISED_OMISSION_BRACKET  0x2e0d
-#define UNITEXT_RIGHT_RAISED_OMISSION_BRACKET  L"\u2e0d"
+#define UNITEXT_RIGHT_RAISED_OMISSION_BRACKET  U"\u2e0d"
 #define UNICODE_EDITORIAL_CORONIS  0x2e0e
-#define UNITEXT_EDITORIAL_CORONIS  L"\u2e0e"
+#define UNITEXT_EDITORIAL_CORONIS  U"\u2e0e"
 #define UNICODE_PARAGRAPHOS  0x2e0f
-#define UNITEXT_PARAGRAPHOS  L"\u2e0f"
+#define UNITEXT_PARAGRAPHOS  U"\u2e0f"
 #define UNICODE_FORKED_PARAGRAPHOS  0x2e10
-#define UNITEXT_FORKED_PARAGRAPHOS  L"\u2e10"
+#define UNITEXT_FORKED_PARAGRAPHOS  U"\u2e10"
 #define UNICODE_REVERSED_FORKED_PARAGRAPHOS  0x2e11
-#define UNITEXT_REVERSED_FORKED_PARAGRAPHOS  L"\u2e11"
+#define UNITEXT_REVERSED_FORKED_PARAGRAPHOS  U"\u2e11"
 #define UNICODE_HYPODIASTOLE  0x2e12
-#define UNITEXT_HYPODIASTOLE  L"\u2e12"
+#define UNITEXT_HYPODIASTOLE  U"\u2e12"
 #define UNICODE_DOTTED_OBELOS  0x2e13
-#define UNITEXT_DOTTED_OBELOS  L"\u2e13"
+#define UNITEXT_DOTTED_OBELOS  U"\u2e13"
 #define UNICODE_DOWNWARDS_ANCORA  0x2e14
-#define UNITEXT_DOWNWARDS_ANCORA  L"\u2e14"
+#define UNITEXT_DOWNWARDS_ANCORA  U"\u2e14"
 #define UNICODE_UPWARDS_ANCORA  0x2e15
-#define UNITEXT_UPWARDS_ANCORA  L"\u2e15"
+#define UNITEXT_UPWARDS_ANCORA  U"\u2e15"
 #define UNICODE_DOTTED_RIGHT_POINTING_ANGLE  0x2e16
-#define UNITEXT_DOTTED_RIGHT_POINTING_ANGLE  L"\u2e16"
+#define UNITEXT_DOTTED_RIGHT_POINTING_ANGLE  U"\u2e16"
 #define UNICODE_DOUBLE_OBLIQUE_HYPHEN  0x2e17
-#define UNITEXT_DOUBLE_OBLIQUE_HYPHEN  L"\u2e17"
+#define UNITEXT_DOUBLE_OBLIQUE_HYPHEN  U"\u2e17"
 #define UNICODE_LEFT_LOW_PARAPHRASE_BRACKET  0x2e1c
-#define UNITEXT_LEFT_LOW_PARAPHRASE_BRACKET  L"\u2e1c"
+#define UNITEXT_LEFT_LOW_PARAPHRASE_BRACKET  U"\u2e1c"
 #define UNICODE_RIGHT_LOW_PARAPHRASE_BRACKET  0x2e1d
-#define UNITEXT_RIGHT_LOW_PARAPHRASE_BRACKET  L"\u2e1d"
+#define UNITEXT_RIGHT_LOW_PARAPHRASE_BRACKET  U"\u2e1d"
 #define UNICODE_CJK_RADICAL_REPEAT  0x2e80
-#define UNITEXT_CJK_RADICAL_REPEAT  L"\u2e80"
+#define UNITEXT_CJK_RADICAL_REPEAT  U"\u2e80"
 #define UNICODE_CJK_RADICAL_CLIFF  0x2e81
-#define UNITEXT_CJK_RADICAL_CLIFF  L"\u2e81"
+#define UNITEXT_CJK_RADICAL_CLIFF  U"\u2e81"
 #define UNICODE_CJK_RADICAL_SECOND_ONE  0x2e82
-#define UNITEXT_CJK_RADICAL_SECOND_ONE  L"\u2e82"
+#define UNITEXT_CJK_RADICAL_SECOND_ONE  U"\u2e82"
 #define UNICODE_CJK_RADICAL_SECOND_TWO  0x2e83
-#define UNITEXT_CJK_RADICAL_SECOND_TWO  L"\u2e83"
+#define UNITEXT_CJK_RADICAL_SECOND_TWO  U"\u2e83"
 #define UNICODE_CJK_RADICAL_SECOND_THREE  0x2e84
-#define UNITEXT_CJK_RADICAL_SECOND_THREE  L"\u2e84"
+#define UNITEXT_CJK_RADICAL_SECOND_THREE  U"\u2e84"
 #define UNICODE_CJK_RADICAL_PERSON  0x2e85
-#define UNITEXT_CJK_RADICAL_PERSON  L"\u2e85"
+#define UNITEXT_CJK_RADICAL_PERSON  U"\u2e85"
 #define UNICODE_CJK_RADICAL_BOX  0x2e86
-#define UNITEXT_CJK_RADICAL_BOX  L"\u2e86"
+#define UNITEXT_CJK_RADICAL_BOX  U"\u2e86"
 #define UNICODE_CJK_RADICAL_TABLE  0x2e87
-#define UNITEXT_CJK_RADICAL_TABLE  L"\u2e87"
+#define UNITEXT_CJK_RADICAL_TABLE  U"\u2e87"
 #define UNICODE_CJK_RADICAL_KNIFE_ONE  0x2e88
-#define UNITEXT_CJK_RADICAL_KNIFE_ONE  L"\u2e88"
+#define UNITEXT_CJK_RADICAL_KNIFE_ONE  U"\u2e88"
 #define UNICODE_CJK_RADICAL_KNIFE_TWO  0x2e89
-#define UNITEXT_CJK_RADICAL_KNIFE_TWO  L"\u2e89"
+#define UNITEXT_CJK_RADICAL_KNIFE_TWO  U"\u2e89"
 #define UNICODE_CJK_RADICAL_DIVINATION  0x2e8a
-#define UNITEXT_CJK_RADICAL_DIVINATION  L"\u2e8a"
+#define UNITEXT_CJK_RADICAL_DIVINATION  U"\u2e8a"
 #define UNICODE_CJK_RADICAL_SEAL  0x2e8b
-#define UNITEXT_CJK_RADICAL_SEAL  L"\u2e8b"
+#define UNITEXT_CJK_RADICAL_SEAL  U"\u2e8b"
 #define UNICODE_CJK_RADICAL_SMALL_ONE  0x2e8c
-#define UNITEXT_CJK_RADICAL_SMALL_ONE  L"\u2e8c"
+#define UNITEXT_CJK_RADICAL_SMALL_ONE  U"\u2e8c"
 #define UNICODE_CJK_RADICAL_SMALL_TWO  0x2e8d
-#define UNITEXT_CJK_RADICAL_SMALL_TWO  L"\u2e8d"
+#define UNITEXT_CJK_RADICAL_SMALL_TWO  U"\u2e8d"
 #define UNICODE_CJK_RADICAL_LAME_ONE  0x2e8e
-#define UNITEXT_CJK_RADICAL_LAME_ONE  L"\u2e8e"
+#define UNITEXT_CJK_RADICAL_LAME_ONE  U"\u2e8e"
 #define UNICODE_CJK_RADICAL_LAME_TWO  0x2e8f
-#define UNITEXT_CJK_RADICAL_LAME_TWO  L"\u2e8f"
+#define UNITEXT_CJK_RADICAL_LAME_TWO  U"\u2e8f"
 #define UNICODE_CJK_RADICAL_LAME_THREE  0x2e90
-#define UNITEXT_CJK_RADICAL_LAME_THREE  L"\u2e90"
+#define UNITEXT_CJK_RADICAL_LAME_THREE  U"\u2e90"
 #define UNICODE_CJK_RADICAL_LAME_FOUR  0x2e91
-#define UNITEXT_CJK_RADICAL_LAME_FOUR  L"\u2e91"
+#define UNITEXT_CJK_RADICAL_LAME_FOUR  U"\u2e91"
 #define UNICODE_CJK_RADICAL_SNAKE  0x2e92
-#define UNITEXT_CJK_RADICAL_SNAKE  L"\u2e92"
+#define UNITEXT_CJK_RADICAL_SNAKE  U"\u2e92"
 #define UNICODE_CJK_RADICAL_THREAD  0x2e93
-#define UNITEXT_CJK_RADICAL_THREAD  L"\u2e93"
+#define UNITEXT_CJK_RADICAL_THREAD  U"\u2e93"
 #define UNICODE_CJK_RADICAL_SNOUT_ONE  0x2e94
-#define UNITEXT_CJK_RADICAL_SNOUT_ONE  L"\u2e94"
+#define UNITEXT_CJK_RADICAL_SNOUT_ONE  U"\u2e94"
 #define UNICODE_CJK_RADICAL_SNOUT_TWO  0x2e95
-#define UNITEXT_CJK_RADICAL_SNOUT_TWO  L"\u2e95"
+#define UNITEXT_CJK_RADICAL_SNOUT_TWO  U"\u2e95"
 #define UNICODE_CJK_RADICAL_HEART_ONE  0x2e96
-#define UNITEXT_CJK_RADICAL_HEART_ONE  L"\u2e96"
+#define UNITEXT_CJK_RADICAL_HEART_ONE  U"\u2e96"
 #define UNICODE_CJK_RADICAL_HEART_TWO  0x2e97
-#define UNITEXT_CJK_RADICAL_HEART_TWO  L"\u2e97"
+#define UNITEXT_CJK_RADICAL_HEART_TWO  U"\u2e97"
 #define UNICODE_CJK_RADICAL_HAND  0x2e98
-#define UNITEXT_CJK_RADICAL_HAND  L"\u2e98"
+#define UNITEXT_CJK_RADICAL_HAND  U"\u2e98"
 #define UNICODE_CJK_RADICAL_RAP  0x2e99
-#define UNITEXT_CJK_RADICAL_RAP  L"\u2e99"
+#define UNITEXT_CJK_RADICAL_RAP  U"\u2e99"
 #define UNICODE_CJK_RADICAL_CHOKE  0x2e9b
-#define UNITEXT_CJK_RADICAL_CHOKE  L"\u2e9b"
+#define UNITEXT_CJK_RADICAL_CHOKE  U"\u2e9b"
 #define UNICODE_CJK_RADICAL_SUN  0x2e9c
-#define UNITEXT_CJK_RADICAL_SUN  L"\u2e9c"
+#define UNITEXT_CJK_RADICAL_SUN  U"\u2e9c"
 #define UNICODE_CJK_RADICAL_MOON  0x2e9d
-#define UNITEXT_CJK_RADICAL_MOON  L"\u2e9d"
+#define UNITEXT_CJK_RADICAL_MOON  U"\u2e9d"
 #define UNICODE_CJK_RADICAL_DEATH  0x2e9e
-#define UNITEXT_CJK_RADICAL_DEATH  L"\u2e9e"
+#define UNITEXT_CJK_RADICAL_DEATH  U"\u2e9e"
 #define UNICODE_CJK_RADICAL_MOTHER  0x2e9f
-#define UNITEXT_CJK_RADICAL_MOTHER  L"\u2e9f"
+#define UNITEXT_CJK_RADICAL_MOTHER  U"\u2e9f"
 #define UNICODE_CJK_RADICAL_CIVILIAN  0x2ea0
-#define UNITEXT_CJK_RADICAL_CIVILIAN  L"\u2ea0"
+#define UNITEXT_CJK_RADICAL_CIVILIAN  U"\u2ea0"
 #define UNICODE_CJK_RADICAL_WATER_ONE  0x2ea1
-#define UNITEXT_CJK_RADICAL_WATER_ONE  L"\u2ea1"
+#define UNITEXT_CJK_RADICAL_WATER_ONE  U"\u2ea1"
 #define UNICODE_CJK_RADICAL_WATER_TWO  0x2ea2
-#define UNITEXT_CJK_RADICAL_WATER_TWO  L"\u2ea2"
+#define UNITEXT_CJK_RADICAL_WATER_TWO  U"\u2ea2"
 #define UNICODE_CJK_RADICAL_FIRE  0x2ea3
-#define UNITEXT_CJK_RADICAL_FIRE  L"\u2ea3"
+#define UNITEXT_CJK_RADICAL_FIRE  U"\u2ea3"
 #define UNICODE_CJK_RADICAL_PAW_ONE  0x2ea4
-#define UNITEXT_CJK_RADICAL_PAW_ONE  L"\u2ea4"
+#define UNITEXT_CJK_RADICAL_PAW_ONE  U"\u2ea4"
 #define UNICODE_CJK_RADICAL_PAW_TWO  0x2ea5
-#define UNITEXT_CJK_RADICAL_PAW_TWO  L"\u2ea5"
+#define UNITEXT_CJK_RADICAL_PAW_TWO  U"\u2ea5"
 #define UNICODE_CJK_RADICAL_SIMPLIFIED_HALF_TREE_TRUNK  0x2ea6
-#define UNITEXT_CJK_RADICAL_SIMPLIFIED_HALF_TREE_TRUNK  L"\u2ea6"
+#define UNITEXT_CJK_RADICAL_SIMPLIFIED_HALF_TREE_TRUNK  U"\u2ea6"
 #define UNICODE_CJK_RADICAL_COW  0x2ea7
-#define UNITEXT_CJK_RADICAL_COW  L"\u2ea7"
+#define UNITEXT_CJK_RADICAL_COW  U"\u2ea7"
 #define UNICODE_CJK_RADICAL_DOG  0x2ea8
-#define UNITEXT_CJK_RADICAL_DOG  L"\u2ea8"
+#define UNITEXT_CJK_RADICAL_DOG  U"\u2ea8"
 #define UNICODE_CJK_RADICAL_JADE  0x2ea9
-#define UNITEXT_CJK_RADICAL_JADE  L"\u2ea9"
+#define UNITEXT_CJK_RADICAL_JADE  U"\u2ea9"
 #define UNICODE_CJK_RADICAL_BOLT_OF_CLOTH  0x2eaa
-#define UNITEXT_CJK_RADICAL_BOLT_OF_CLOTH  L"\u2eaa"
+#define UNITEXT_CJK_RADICAL_BOLT_OF_CLOTH  U"\u2eaa"
 #define UNICODE_CJK_RADICAL_EYE  0x2eab
-#define UNITEXT_CJK_RADICAL_EYE  L"\u2eab"
+#define UNITEXT_CJK_RADICAL_EYE  U"\u2eab"
 #define UNICODE_CJK_RADICAL_SPIRIT_ONE  0x2eac
-#define UNITEXT_CJK_RADICAL_SPIRIT_ONE  L"\u2eac"
+#define UNITEXT_CJK_RADICAL_SPIRIT_ONE  U"\u2eac"
 #define UNICODE_CJK_RADICAL_SPIRIT_TWO  0x2ead
-#define UNITEXT_CJK_RADICAL_SPIRIT_TWO  L"\u2ead"
+#define UNITEXT_CJK_RADICAL_SPIRIT_TWO  U"\u2ead"
 #define UNICODE_CJK_RADICAL_BAMBOO  0x2eae
-#define UNITEXT_CJK_RADICAL_BAMBOO  L"\u2eae"
+#define UNITEXT_CJK_RADICAL_BAMBOO  U"\u2eae"
 #define UNICODE_CJK_RADICAL_SILK  0x2eaf
-#define UNITEXT_CJK_RADICAL_SILK  L"\u2eaf"
+#define UNITEXT_CJK_RADICAL_SILK  U"\u2eaf"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_SILK  0x2eb0
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_SILK  L"\u2eb0"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_SILK  U"\u2eb0"
 #define UNICODE_CJK_RADICAL_NET_ONE  0x2eb1
-#define UNITEXT_CJK_RADICAL_NET_ONE  L"\u2eb1"
+#define UNITEXT_CJK_RADICAL_NET_ONE  U"\u2eb1"
 #define UNICODE_CJK_RADICAL_NET_TWO  0x2eb2
-#define UNITEXT_CJK_RADICAL_NET_TWO  L"\u2eb2"
+#define UNITEXT_CJK_RADICAL_NET_TWO  U"\u2eb2"
 #define UNICODE_CJK_RADICAL_NET_THREE  0x2eb3
-#define UNITEXT_CJK_RADICAL_NET_THREE  L"\u2eb3"
+#define UNITEXT_CJK_RADICAL_NET_THREE  U"\u2eb3"
 #define UNICODE_CJK_RADICAL_NET_FOUR  0x2eb4
-#define UNITEXT_CJK_RADICAL_NET_FOUR  L"\u2eb4"
+#define UNITEXT_CJK_RADICAL_NET_FOUR  U"\u2eb4"
 #define UNICODE_CJK_RADICAL_MESH  0x2eb5
-#define UNITEXT_CJK_RADICAL_MESH  L"\u2eb5"
+#define UNITEXT_CJK_RADICAL_MESH  U"\u2eb5"
 #define UNICODE_CJK_RADICAL_SHEEP  0x2eb6
-#define UNITEXT_CJK_RADICAL_SHEEP  L"\u2eb6"
+#define UNITEXT_CJK_RADICAL_SHEEP  U"\u2eb6"
 #define UNICODE_CJK_RADICAL_RAM  0x2eb7
-#define UNITEXT_CJK_RADICAL_RAM  L"\u2eb7"
+#define UNITEXT_CJK_RADICAL_RAM  U"\u2eb7"
 #define UNICODE_CJK_RADICAL_EWE  0x2eb8
-#define UNITEXT_CJK_RADICAL_EWE  L"\u2eb8"
+#define UNITEXT_CJK_RADICAL_EWE  U"\u2eb8"
 #define UNICODE_CJK_RADICAL_OLD  0x2eb9
-#define UNITEXT_CJK_RADICAL_OLD  L"\u2eb9"
+#define UNITEXT_CJK_RADICAL_OLD  U"\u2eb9"
 #define UNICODE_CJK_RADICAL_BRUSH_ONE  0x2eba
-#define UNITEXT_CJK_RADICAL_BRUSH_ONE  L"\u2eba"
+#define UNITEXT_CJK_RADICAL_BRUSH_ONE  U"\u2eba"
 #define UNICODE_CJK_RADICAL_BRUSH_TWO  0x2ebb
-#define UNITEXT_CJK_RADICAL_BRUSH_TWO  L"\u2ebb"
+#define UNITEXT_CJK_RADICAL_BRUSH_TWO  U"\u2ebb"
 #define UNICODE_CJK_RADICAL_MEAT  0x2ebc
-#define UNITEXT_CJK_RADICAL_MEAT  L"\u2ebc"
+#define UNITEXT_CJK_RADICAL_MEAT  U"\u2ebc"
 #define UNICODE_CJK_RADICAL_MORTAR  0x2ebd
-#define UNITEXT_CJK_RADICAL_MORTAR  L"\u2ebd"
+#define UNITEXT_CJK_RADICAL_MORTAR  U"\u2ebd"
 #define UNICODE_CJK_RADICAL_GRASS_ONE  0x2ebe
-#define UNITEXT_CJK_RADICAL_GRASS_ONE  L"\u2ebe"
+#define UNITEXT_CJK_RADICAL_GRASS_ONE  U"\u2ebe"
 #define UNICODE_CJK_RADICAL_GRASS_TWO  0x2ebf
-#define UNITEXT_CJK_RADICAL_GRASS_TWO  L"\u2ebf"
+#define UNITEXT_CJK_RADICAL_GRASS_TWO  U"\u2ebf"
 #define UNICODE_CJK_RADICAL_GRASS_THREE  0x2ec0
-#define UNITEXT_CJK_RADICAL_GRASS_THREE  L"\u2ec0"
+#define UNITEXT_CJK_RADICAL_GRASS_THREE  U"\u2ec0"
 #define UNICODE_CJK_RADICAL_TIGER  0x2ec1
-#define UNITEXT_CJK_RADICAL_TIGER  L"\u2ec1"
+#define UNITEXT_CJK_RADICAL_TIGER  U"\u2ec1"
 #define UNICODE_CJK_RADICAL_CLOTHES  0x2ec2
-#define UNITEXT_CJK_RADICAL_CLOTHES  L"\u2ec2"
+#define UNITEXT_CJK_RADICAL_CLOTHES  U"\u2ec2"
 #define UNICODE_CJK_RADICAL_WEST_ONE  0x2ec3
-#define UNITEXT_CJK_RADICAL_WEST_ONE  L"\u2ec3"
+#define UNITEXT_CJK_RADICAL_WEST_ONE  U"\u2ec3"
 #define UNICODE_CJK_RADICAL_WEST_TWO  0x2ec4
-#define UNITEXT_CJK_RADICAL_WEST_TWO  L"\u2ec4"
+#define UNITEXT_CJK_RADICAL_WEST_TWO  U"\u2ec4"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_SEE  0x2ec5
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_SEE  L"\u2ec5"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_SEE  U"\u2ec5"
 #define UNICODE_CJK_RADICAL_SIMPLIFIED_HORN  0x2ec6
-#define UNITEXT_CJK_RADICAL_SIMPLIFIED_HORN  L"\u2ec6"
+#define UNITEXT_CJK_RADICAL_SIMPLIFIED_HORN  U"\u2ec6"
 #define UNICODE_CJK_RADICAL_HORN  0x2ec7
-#define UNITEXT_CJK_RADICAL_HORN  L"\u2ec7"
+#define UNITEXT_CJK_RADICAL_HORN  U"\u2ec7"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_SPEECH  0x2ec8
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_SPEECH  L"\u2ec8"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_SPEECH  U"\u2ec8"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_SHELL  0x2ec9
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_SHELL  L"\u2ec9"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_SHELL  U"\u2ec9"
 #define UNICODE_CJK_RADICAL_FOOT  0x2eca
-#define UNITEXT_CJK_RADICAL_FOOT  L"\u2eca"
+#define UNITEXT_CJK_RADICAL_FOOT  U"\u2eca"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_CART  0x2ecb
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_CART  L"\u2ecb"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_CART  U"\u2ecb"
 #define UNICODE_CJK_RADICAL_SIMPLIFIED_WALK  0x2ecc
-#define UNITEXT_CJK_RADICAL_SIMPLIFIED_WALK  L"\u2ecc"
+#define UNITEXT_CJK_RADICAL_SIMPLIFIED_WALK  U"\u2ecc"
 #define UNICODE_CJK_RADICAL_WALK_ONE  0x2ecd
-#define UNITEXT_CJK_RADICAL_WALK_ONE  L"\u2ecd"
+#define UNITEXT_CJK_RADICAL_WALK_ONE  U"\u2ecd"
 #define UNICODE_CJK_RADICAL_WALK_TWO  0x2ece
-#define UNITEXT_CJK_RADICAL_WALK_TWO  L"\u2ece"
+#define UNITEXT_CJK_RADICAL_WALK_TWO  U"\u2ece"
 #define UNICODE_CJK_RADICAL_CITY  0x2ecf
-#define UNITEXT_CJK_RADICAL_CITY  L"\u2ecf"
+#define UNITEXT_CJK_RADICAL_CITY  U"\u2ecf"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_GOLD  0x2ed0
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_GOLD  L"\u2ed0"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_GOLD  U"\u2ed0"
 #define UNICODE_CJK_RADICAL_LONG_ONE  0x2ed1
-#define UNITEXT_CJK_RADICAL_LONG_ONE  L"\u2ed1"
+#define UNITEXT_CJK_RADICAL_LONG_ONE  U"\u2ed1"
 #define UNICODE_CJK_RADICAL_LONG_TWO  0x2ed2
-#define UNITEXT_CJK_RADICAL_LONG_TWO  L"\u2ed2"
+#define UNITEXT_CJK_RADICAL_LONG_TWO  U"\u2ed2"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_LONG  0x2ed3
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_LONG  L"\u2ed3"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_LONG  U"\u2ed3"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_GATE  0x2ed4
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_GATE  L"\u2ed4"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_GATE  U"\u2ed4"
 #define UNICODE_CJK_RADICAL_MOUND_ONE  0x2ed5
-#define UNITEXT_CJK_RADICAL_MOUND_ONE  L"\u2ed5"
+#define UNITEXT_CJK_RADICAL_MOUND_ONE  U"\u2ed5"
 #define UNICODE_CJK_RADICAL_MOUND_TWO  0x2ed6
-#define UNITEXT_CJK_RADICAL_MOUND_TWO  L"\u2ed6"
+#define UNITEXT_CJK_RADICAL_MOUND_TWO  U"\u2ed6"
 #define UNICODE_CJK_RADICAL_RAIN  0x2ed7
-#define UNITEXT_CJK_RADICAL_RAIN  L"\u2ed7"
+#define UNITEXT_CJK_RADICAL_RAIN  U"\u2ed7"
 #define UNICODE_CJK_RADICAL_BLUE  0x2ed8
-#define UNITEXT_CJK_RADICAL_BLUE  L"\u2ed8"
+#define UNITEXT_CJK_RADICAL_BLUE  U"\u2ed8"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_TANNED_LEATHER  0x2ed9
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_TANNED_LEATHER  L"\u2ed9"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_TANNED_LEATHER  U"\u2ed9"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_LEAF  0x2eda
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_LEAF  L"\u2eda"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_LEAF  U"\u2eda"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_WIND  0x2edb
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_WIND  L"\u2edb"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_WIND  U"\u2edb"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_FLY  0x2edc
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_FLY  L"\u2edc"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_FLY  U"\u2edc"
 #define UNICODE_CJK_RADICAL_EAT_ONE  0x2edd
-#define UNITEXT_CJK_RADICAL_EAT_ONE  L"\u2edd"
+#define UNITEXT_CJK_RADICAL_EAT_ONE  U"\u2edd"
 #define UNICODE_CJK_RADICAL_EAT_TWO  0x2ede
-#define UNITEXT_CJK_RADICAL_EAT_TWO  L"\u2ede"
+#define UNITEXT_CJK_RADICAL_EAT_TWO  U"\u2ede"
 #define UNICODE_CJK_RADICAL_EAT_THREE  0x2edf
-#define UNITEXT_CJK_RADICAL_EAT_THREE  L"\u2edf"
+#define UNITEXT_CJK_RADICAL_EAT_THREE  U"\u2edf"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_EAT  0x2ee0
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_EAT  L"\u2ee0"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_EAT  U"\u2ee0"
 #define UNICODE_CJK_RADICAL_HEAD  0x2ee1
-#define UNITEXT_CJK_RADICAL_HEAD  L"\u2ee1"
+#define UNITEXT_CJK_RADICAL_HEAD  U"\u2ee1"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_HORSE  0x2ee2
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_HORSE  L"\u2ee2"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_HORSE  U"\u2ee2"
 #define UNICODE_CJK_RADICAL_BONE  0x2ee3
-#define UNITEXT_CJK_RADICAL_BONE  L"\u2ee3"
+#define UNITEXT_CJK_RADICAL_BONE  U"\u2ee3"
 #define UNICODE_CJK_RADICAL_GHOST  0x2ee4
-#define UNITEXT_CJK_RADICAL_GHOST  L"\u2ee4"
+#define UNITEXT_CJK_RADICAL_GHOST  U"\u2ee4"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_FISH  0x2ee5
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_FISH  L"\u2ee5"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_FISH  U"\u2ee5"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_BIRD  0x2ee6
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_BIRD  L"\u2ee6"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_BIRD  U"\u2ee6"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_SALT  0x2ee7
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_SALT  L"\u2ee7"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_SALT  U"\u2ee7"
 #define UNICODE_CJK_RADICAL_SIMPLIFIED_WHEAT  0x2ee8
-#define UNITEXT_CJK_RADICAL_SIMPLIFIED_WHEAT  L"\u2ee8"
+#define UNITEXT_CJK_RADICAL_SIMPLIFIED_WHEAT  U"\u2ee8"
 #define UNICODE_CJK_RADICAL_SIMPLIFIED_YELLOW  0x2ee9
-#define UNITEXT_CJK_RADICAL_SIMPLIFIED_YELLOW  L"\u2ee9"
+#define UNITEXT_CJK_RADICAL_SIMPLIFIED_YELLOW  U"\u2ee9"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_FROG  0x2eea
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_FROG  L"\u2eea"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_FROG  U"\u2eea"
 #define UNICODE_CJK_RADICAL_J_SIMPLIFIED_EVEN  0x2eeb
-#define UNITEXT_CJK_RADICAL_J_SIMPLIFIED_EVEN  L"\u2eeb"
+#define UNITEXT_CJK_RADICAL_J_SIMPLIFIED_EVEN  U"\u2eeb"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_EVEN  0x2eec
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_EVEN  L"\u2eec"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_EVEN  U"\u2eec"
 #define UNICODE_CJK_RADICAL_J_SIMPLIFIED_TOOTH  0x2eed
-#define UNITEXT_CJK_RADICAL_J_SIMPLIFIED_TOOTH  L"\u2eed"
+#define UNITEXT_CJK_RADICAL_J_SIMPLIFIED_TOOTH  U"\u2eed"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_TOOTH  0x2eee
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_TOOTH  L"\u2eee"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_TOOTH  U"\u2eee"
 #define UNICODE_CJK_RADICAL_J_SIMPLIFIED_DRAGON  0x2eef
-#define UNITEXT_CJK_RADICAL_J_SIMPLIFIED_DRAGON  L"\u2eef"
+#define UNITEXT_CJK_RADICAL_J_SIMPLIFIED_DRAGON  U"\u2eef"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_DRAGON  0x2ef0
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_DRAGON  L"\u2ef0"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_DRAGON  U"\u2ef0"
 #define UNICODE_CJK_RADICAL_TURTLE  0x2ef1
-#define UNITEXT_CJK_RADICAL_TURTLE  L"\u2ef1"
+#define UNITEXT_CJK_RADICAL_TURTLE  U"\u2ef1"
 #define UNICODE_CJK_RADICAL_J_SIMPLIFIED_TURTLE  0x2ef2
-#define UNITEXT_CJK_RADICAL_J_SIMPLIFIED_TURTLE  L"\u2ef2"
+#define UNITEXT_CJK_RADICAL_J_SIMPLIFIED_TURTLE  U"\u2ef2"
 #define UNICODE_CJK_RADICAL_C_SIMPLIFIED_TURTLE  0x2ef3
-#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_TURTLE  L"\u2ef3"
+#define UNITEXT_CJK_RADICAL_C_SIMPLIFIED_TURTLE  U"\u2ef3"
 #define UNICODE_KANGXI_RADICAL_ONE  0x2f00
-#define UNITEXT_KANGXI_RADICAL_ONE  L"\u2f00"
+#define UNITEXT_KANGXI_RADICAL_ONE  U"\u2f00"
 #define UNICODE_KANGXI_RADICAL_LINE  0x2f01
-#define UNITEXT_KANGXI_RADICAL_LINE  L"\u2f01"
+#define UNITEXT_KANGXI_RADICAL_LINE  U"\u2f01"
 #define UNICODE_KANGXI_RADICAL_DOT  0x2f02
-#define UNITEXT_KANGXI_RADICAL_DOT  L"\u2f02"
+#define UNITEXT_KANGXI_RADICAL_DOT  U"\u2f02"
 #define UNICODE_KANGXI_RADICAL_SLASH  0x2f03
-#define UNITEXT_KANGXI_RADICAL_SLASH  L"\u2f03"
+#define UNITEXT_KANGXI_RADICAL_SLASH  U"\u2f03"
 #define UNICODE_KANGXI_RADICAL_SECOND  0x2f04
-#define UNITEXT_KANGXI_RADICAL_SECOND  L"\u2f04"
+#define UNITEXT_KANGXI_RADICAL_SECOND  U"\u2f04"
 #define UNICODE_KANGXI_RADICAL_HOOK  0x2f05
-#define UNITEXT_KANGXI_RADICAL_HOOK  L"\u2f05"
+#define UNITEXT_KANGXI_RADICAL_HOOK  U"\u2f05"
 #define UNICODE_KANGXI_RADICAL_TWO  0x2f06
-#define UNITEXT_KANGXI_RADICAL_TWO  L"\u2f06"
+#define UNITEXT_KANGXI_RADICAL_TWO  U"\u2f06"
 #define UNICODE_KANGXI_RADICAL_LID  0x2f07
-#define UNITEXT_KANGXI_RADICAL_LID  L"\u2f07"
+#define UNITEXT_KANGXI_RADICAL_LID  U"\u2f07"
 #define UNICODE_KANGXI_RADICAL_MAN  0x2f08
-#define UNITEXT_KANGXI_RADICAL_MAN  L"\u2f08"
+#define UNITEXT_KANGXI_RADICAL_MAN  U"\u2f08"
 #define UNICODE_KANGXI_RADICAL_LEGS  0x2f09
-#define UNITEXT_KANGXI_RADICAL_LEGS  L"\u2f09"
+#define UNITEXT_KANGXI_RADICAL_LEGS  U"\u2f09"
 #define UNICODE_KANGXI_RADICAL_ENTER  0x2f0a
-#define UNITEXT_KANGXI_RADICAL_ENTER  L"\u2f0a"
+#define UNITEXT_KANGXI_RADICAL_ENTER  U"\u2f0a"
 #define UNICODE_KANGXI_RADICAL_EIGHT  0x2f0b
-#define UNITEXT_KANGXI_RADICAL_EIGHT  L"\u2f0b"
+#define UNITEXT_KANGXI_RADICAL_EIGHT  U"\u2f0b"
 #define UNICODE_KANGXI_RADICAL_DOWN_BOX  0x2f0c
-#define UNITEXT_KANGXI_RADICAL_DOWN_BOX  L"\u2f0c"
+#define UNITEXT_KANGXI_RADICAL_DOWN_BOX  U"\u2f0c"
 #define UNICODE_KANGXI_RADICAL_COVER  0x2f0d
-#define UNITEXT_KANGXI_RADICAL_COVER  L"\u2f0d"
+#define UNITEXT_KANGXI_RADICAL_COVER  U"\u2f0d"
 #define UNICODE_KANGXI_RADICAL_ICE  0x2f0e
-#define UNITEXT_KANGXI_RADICAL_ICE  L"\u2f0e"
+#define UNITEXT_KANGXI_RADICAL_ICE  U"\u2f0e"
 #define UNICODE_KANGXI_RADICAL_TABLE  0x2f0f
-#define UNITEXT_KANGXI_RADICAL_TABLE  L"\u2f0f"
+#define UNITEXT_KANGXI_RADICAL_TABLE  U"\u2f0f"
 #define UNICODE_KANGXI_RADICAL_OPEN_BOX  0x2f10
-#define UNITEXT_KANGXI_RADICAL_OPEN_BOX  L"\u2f10"
+#define UNITEXT_KANGXI_RADICAL_OPEN_BOX  U"\u2f10"
 #define UNICODE_KANGXI_RADICAL_KNIFE  0x2f11
-#define UNITEXT_KANGXI_RADICAL_KNIFE  L"\u2f11"
+#define UNITEXT_KANGXI_RADICAL_KNIFE  U"\u2f11"
 #define UNICODE_KANGXI_RADICAL_POWER  0x2f12
-#define UNITEXT_KANGXI_RADICAL_POWER  L"\u2f12"
+#define UNITEXT_KANGXI_RADICAL_POWER  U"\u2f12"
 #define UNICODE_KANGXI_RADICAL_WRAP  0x2f13
-#define UNITEXT_KANGXI_RADICAL_WRAP  L"\u2f13"
+#define UNITEXT_KANGXI_RADICAL_WRAP  U"\u2f13"
 #define UNICODE_KANGXI_RADICAL_SPOON  0x2f14
-#define UNITEXT_KANGXI_RADICAL_SPOON  L"\u2f14"
+#define UNITEXT_KANGXI_RADICAL_SPOON  U"\u2f14"
 #define UNICODE_KANGXI_RADICAL_RIGHT_OPEN_BOX  0x2f15
-#define UNITEXT_KANGXI_RADICAL_RIGHT_OPEN_BOX  L"\u2f15"
+#define UNITEXT_KANGXI_RADICAL_RIGHT_OPEN_BOX  U"\u2f15"
 #define UNICODE_KANGXI_RADICAL_HIDING_ENCLOSURE  0x2f16
-#define UNITEXT_KANGXI_RADICAL_HIDING_ENCLOSURE  L"\u2f16"
+#define UNITEXT_KANGXI_RADICAL_HIDING_ENCLOSURE  U"\u2f16"
 #define UNICODE_KANGXI_RADICAL_TEN  0x2f17
-#define UNITEXT_KANGXI_RADICAL_TEN  L"\u2f17"
+#define UNITEXT_KANGXI_RADICAL_TEN  U"\u2f17"
 #define UNICODE_KANGXI_RADICAL_DIVINATION  0x2f18
-#define UNITEXT_KANGXI_RADICAL_DIVINATION  L"\u2f18"
+#define UNITEXT_KANGXI_RADICAL_DIVINATION  U"\u2f18"
 #define UNICODE_KANGXI_RADICAL_SEAL  0x2f19
-#define UNITEXT_KANGXI_RADICAL_SEAL  L"\u2f19"
+#define UNITEXT_KANGXI_RADICAL_SEAL  U"\u2f19"
 #define UNICODE_KANGXI_RADICAL_CLIFF  0x2f1a
-#define UNITEXT_KANGXI_RADICAL_CLIFF  L"\u2f1a"
+#define UNITEXT_KANGXI_RADICAL_CLIFF  U"\u2f1a"
 #define UNICODE_KANGXI_RADICAL_PRIVATE  0x2f1b
-#define UNITEXT_KANGXI_RADICAL_PRIVATE  L"\u2f1b"
+#define UNITEXT_KANGXI_RADICAL_PRIVATE  U"\u2f1b"
 #define UNICODE_KANGXI_RADICAL_AGAIN  0x2f1c
-#define UNITEXT_KANGXI_RADICAL_AGAIN  L"\u2f1c"
+#define UNITEXT_KANGXI_RADICAL_AGAIN  U"\u2f1c"
 #define UNICODE_KANGXI_RADICAL_MOUTH  0x2f1d
-#define UNITEXT_KANGXI_RADICAL_MOUTH  L"\u2f1d"
+#define UNITEXT_KANGXI_RADICAL_MOUTH  U"\u2f1d"
 #define UNICODE_KANGXI_RADICAL_ENCLOSURE  0x2f1e
-#define UNITEXT_KANGXI_RADICAL_ENCLOSURE  L"\u2f1e"
+#define UNITEXT_KANGXI_RADICAL_ENCLOSURE  U"\u2f1e"
 #define UNICODE_KANGXI_RADICAL_EARTH  0x2f1f
-#define UNITEXT_KANGXI_RADICAL_EARTH  L"\u2f1f"
+#define UNITEXT_KANGXI_RADICAL_EARTH  U"\u2f1f"
 #define UNICODE_KANGXI_RADICAL_SCHOLAR  0x2f20
-#define UNITEXT_KANGXI_RADICAL_SCHOLAR  L"\u2f20"
+#define UNITEXT_KANGXI_RADICAL_SCHOLAR  U"\u2f20"
 #define UNICODE_KANGXI_RADICAL_GO  0x2f21
-#define UNITEXT_KANGXI_RADICAL_GO  L"\u2f21"
+#define UNITEXT_KANGXI_RADICAL_GO  U"\u2f21"
 #define UNICODE_KANGXI_RADICAL_GO_SLOWLY  0x2f22
-#define UNITEXT_KANGXI_RADICAL_GO_SLOWLY  L"\u2f22"
+#define UNITEXT_KANGXI_RADICAL_GO_SLOWLY  U"\u2f22"
 #define UNICODE_KANGXI_RADICAL_EVENING  0x2f23
-#define UNITEXT_KANGXI_RADICAL_EVENING  L"\u2f23"
+#define UNITEXT_KANGXI_RADICAL_EVENING  U"\u2f23"
 #define UNICODE_KANGXI_RADICAL_BIG  0x2f24
-#define UNITEXT_KANGXI_RADICAL_BIG  L"\u2f24"
+#define UNITEXT_KANGXI_RADICAL_BIG  U"\u2f24"
 #define UNICODE_KANGXI_RADICAL_WOMAN  0x2f25
-#define UNITEXT_KANGXI_RADICAL_WOMAN  L"\u2f25"
+#define UNITEXT_KANGXI_RADICAL_WOMAN  U"\u2f25"
 #define UNICODE_KANGXI_RADICAL_CHILD  0x2f26
-#define UNITEXT_KANGXI_RADICAL_CHILD  L"\u2f26"
+#define UNITEXT_KANGXI_RADICAL_CHILD  U"\u2f26"
 #define UNICODE_KANGXI_RADICAL_ROOF  0x2f27
-#define UNITEXT_KANGXI_RADICAL_ROOF  L"\u2f27"
+#define UNITEXT_KANGXI_RADICAL_ROOF  U"\u2f27"
 #define UNICODE_KANGXI_RADICAL_INCH  0x2f28
-#define UNITEXT_KANGXI_RADICAL_INCH  L"\u2f28"
+#define UNITEXT_KANGXI_RADICAL_INCH  U"\u2f28"
 #define UNICODE_KANGXI_RADICAL_SMALL  0x2f29
-#define UNITEXT_KANGXI_RADICAL_SMALL  L"\u2f29"
+#define UNITEXT_KANGXI_RADICAL_SMALL  U"\u2f29"
 #define UNICODE_KANGXI_RADICAL_LAME  0x2f2a
-#define UNITEXT_KANGXI_RADICAL_LAME  L"\u2f2a"
+#define UNITEXT_KANGXI_RADICAL_LAME  U"\u2f2a"
 #define UNICODE_KANGXI_RADICAL_CORPSE  0x2f2b
-#define UNITEXT_KANGXI_RADICAL_CORPSE  L"\u2f2b"
+#define UNITEXT_KANGXI_RADICAL_CORPSE  U"\u2f2b"
 #define UNICODE_KANGXI_RADICAL_SPROUT  0x2f2c
-#define UNITEXT_KANGXI_RADICAL_SPROUT  L"\u2f2c"
+#define UNITEXT_KANGXI_RADICAL_SPROUT  U"\u2f2c"
 #define UNICODE_KANGXI_RADICAL_MOUNTAIN  0x2f2d
-#define UNITEXT_KANGXI_RADICAL_MOUNTAIN  L"\u2f2d"
+#define UNITEXT_KANGXI_RADICAL_MOUNTAIN  U"\u2f2d"
 #define UNICODE_KANGXI_RADICAL_RIVER  0x2f2e
-#define UNITEXT_KANGXI_RADICAL_RIVER  L"\u2f2e"
+#define UNITEXT_KANGXI_RADICAL_RIVER  U"\u2f2e"
 #define UNICODE_KANGXI_RADICAL_WORK  0x2f2f
-#define UNITEXT_KANGXI_RADICAL_WORK  L"\u2f2f"
+#define UNITEXT_KANGXI_RADICAL_WORK  U"\u2f2f"
 #define UNICODE_KANGXI_RADICAL_ONESELF  0x2f30
-#define UNITEXT_KANGXI_RADICAL_ONESELF  L"\u2f30"
+#define UNITEXT_KANGXI_RADICAL_ONESELF  U"\u2f30"
 #define UNICODE_KANGXI_RADICAL_TURBAN  0x2f31
-#define UNITEXT_KANGXI_RADICAL_TURBAN  L"\u2f31"
+#define UNITEXT_KANGXI_RADICAL_TURBAN  U"\u2f31"
 #define UNICODE_KANGXI_RADICAL_DRY  0x2f32
-#define UNITEXT_KANGXI_RADICAL_DRY  L"\u2f32"
+#define UNITEXT_KANGXI_RADICAL_DRY  U"\u2f32"
 #define UNICODE_KANGXI_RADICAL_SHORT_THREAD  0x2f33
-#define UNITEXT_KANGXI_RADICAL_SHORT_THREAD  L"\u2f33"
+#define UNITEXT_KANGXI_RADICAL_SHORT_THREAD  U"\u2f33"
 #define UNICODE_KANGXI_RADICAL_DOTTED_CLIFF  0x2f34
-#define UNITEXT_KANGXI_RADICAL_DOTTED_CLIFF  L"\u2f34"
+#define UNITEXT_KANGXI_RADICAL_DOTTED_CLIFF  U"\u2f34"
 #define UNICODE_KANGXI_RADICAL_LONG_STRIDE  0x2f35
-#define UNITEXT_KANGXI_RADICAL_LONG_STRIDE  L"\u2f35"
+#define UNITEXT_KANGXI_RADICAL_LONG_STRIDE  U"\u2f35"
 #define UNICODE_KANGXI_RADICAL_TWO_HANDS  0x2f36
-#define UNITEXT_KANGXI_RADICAL_TWO_HANDS  L"\u2f36"
+#define UNITEXT_KANGXI_RADICAL_TWO_HANDS  U"\u2f36"
 #define UNICODE_KANGXI_RADICAL_SHOOT  0x2f37
-#define UNITEXT_KANGXI_RADICAL_SHOOT  L"\u2f37"
+#define UNITEXT_KANGXI_RADICAL_SHOOT  U"\u2f37"
 #define UNICODE_KANGXI_RADICAL_BOW  0x2f38
-#define UNITEXT_KANGXI_RADICAL_BOW  L"\u2f38"
+#define UNITEXT_KANGXI_RADICAL_BOW  U"\u2f38"
 #define UNICODE_KANGXI_RADICAL_SNOUT  0x2f39
-#define UNITEXT_KANGXI_RADICAL_SNOUT  L"\u2f39"
+#define UNITEXT_KANGXI_RADICAL_SNOUT  U"\u2f39"
 #define UNICODE_KANGXI_RADICAL_BRISTLE  0x2f3a
-#define UNITEXT_KANGXI_RADICAL_BRISTLE  L"\u2f3a"
+#define UNITEXT_KANGXI_RADICAL_BRISTLE  U"\u2f3a"
 #define UNICODE_KANGXI_RADICAL_STEP  0x2f3b
-#define UNITEXT_KANGXI_RADICAL_STEP  L"\u2f3b"
+#define UNITEXT_KANGXI_RADICAL_STEP  U"\u2f3b"
 #define UNICODE_KANGXI_RADICAL_HEART  0x2f3c
-#define UNITEXT_KANGXI_RADICAL_HEART  L"\u2f3c"
+#define UNITEXT_KANGXI_RADICAL_HEART  U"\u2f3c"
 #define UNICODE_KANGXI_RADICAL_HALBERD  0x2f3d
-#define UNITEXT_KANGXI_RADICAL_HALBERD  L"\u2f3d"
+#define UNITEXT_KANGXI_RADICAL_HALBERD  U"\u2f3d"
 #define UNICODE_KANGXI_RADICAL_DOOR  0x2f3e
-#define UNITEXT_KANGXI_RADICAL_DOOR  L"\u2f3e"
+#define UNITEXT_KANGXI_RADICAL_DOOR  U"\u2f3e"
 #define UNICODE_KANGXI_RADICAL_HAND  0x2f3f
-#define UNITEXT_KANGXI_RADICAL_HAND  L"\u2f3f"
+#define UNITEXT_KANGXI_RADICAL_HAND  U"\u2f3f"
 #define UNICODE_KANGXI_RADICAL_BRANCH  0x2f40
-#define UNITEXT_KANGXI_RADICAL_BRANCH  L"\u2f40"
+#define UNITEXT_KANGXI_RADICAL_BRANCH  U"\u2f40"
 #define UNICODE_KANGXI_RADICAL_RAP  0x2f41
-#define UNITEXT_KANGXI_RADICAL_RAP  L"\u2f41"
+#define UNITEXT_KANGXI_RADICAL_RAP  U"\u2f41"
 #define UNICODE_KANGXI_RADICAL_SCRIPT  0x2f42
-#define UNITEXT_KANGXI_RADICAL_SCRIPT  L"\u2f42"
+#define UNITEXT_KANGXI_RADICAL_SCRIPT  U"\u2f42"
 #define UNICODE_KANGXI_RADICAL_DIPPER  0x2f43
-#define UNITEXT_KANGXI_RADICAL_DIPPER  L"\u2f43"
+#define UNITEXT_KANGXI_RADICAL_DIPPER  U"\u2f43"
 #define UNICODE_KANGXI_RADICAL_AXE  0x2f44
-#define UNITEXT_KANGXI_RADICAL_AXE  L"\u2f44"
+#define UNITEXT_KANGXI_RADICAL_AXE  U"\u2f44"
 #define UNICODE_KANGXI_RADICAL_SQUARE  0x2f45
-#define UNITEXT_KANGXI_RADICAL_SQUARE  L"\u2f45"
+#define UNITEXT_KANGXI_RADICAL_SQUARE  U"\u2f45"
 #define UNICODE_KANGXI_RADICAL_NOT  0x2f46
-#define UNITEXT_KANGXI_RADICAL_NOT  L"\u2f46"
+#define UNITEXT_KANGXI_RADICAL_NOT  U"\u2f46"
 #define UNICODE_KANGXI_RADICAL_SUN  0x2f47
-#define UNITEXT_KANGXI_RADICAL_SUN  L"\u2f47"
+#define UNITEXT_KANGXI_RADICAL_SUN  U"\u2f47"
 #define UNICODE_KANGXI_RADICAL_SAY  0x2f48
-#define UNITEXT_KANGXI_RADICAL_SAY  L"\u2f48"
+#define UNITEXT_KANGXI_RADICAL_SAY  U"\u2f48"
 #define UNICODE_KANGXI_RADICAL_MOON  0x2f49
-#define UNITEXT_KANGXI_RADICAL_MOON  L"\u2f49"
+#define UNITEXT_KANGXI_RADICAL_MOON  U"\u2f49"
 #define UNICODE_KANGXI_RADICAL_TREE  0x2f4a
-#define UNITEXT_KANGXI_RADICAL_TREE  L"\u2f4a"
+#define UNITEXT_KANGXI_RADICAL_TREE  U"\u2f4a"
 #define UNICODE_KANGXI_RADICAL_LACK  0x2f4b
-#define UNITEXT_KANGXI_RADICAL_LACK  L"\u2f4b"
+#define UNITEXT_KANGXI_RADICAL_LACK  U"\u2f4b"
 #define UNICODE_KANGXI_RADICAL_STOP  0x2f4c
-#define UNITEXT_KANGXI_RADICAL_STOP  L"\u2f4c"
+#define UNITEXT_KANGXI_RADICAL_STOP  U"\u2f4c"
 #define UNICODE_KANGXI_RADICAL_DEATH  0x2f4d
-#define UNITEXT_KANGXI_RADICAL_DEATH  L"\u2f4d"
+#define UNITEXT_KANGXI_RADICAL_DEATH  U"\u2f4d"
 #define UNICODE_KANGXI_RADICAL_WEAPON  0x2f4e
-#define UNITEXT_KANGXI_RADICAL_WEAPON  L"\u2f4e"
+#define UNITEXT_KANGXI_RADICAL_WEAPON  U"\u2f4e"
 #define UNICODE_KANGXI_RADICAL_DO_NOT  0x2f4f
-#define UNITEXT_KANGXI_RADICAL_DO_NOT  L"\u2f4f"
+#define UNITEXT_KANGXI_RADICAL_DO_NOT  U"\u2f4f"
 #define UNICODE_KANGXI_RADICAL_COMPARE  0x2f50
-#define UNITEXT_KANGXI_RADICAL_COMPARE  L"\u2f50"
+#define UNITEXT_KANGXI_RADICAL_COMPARE  U"\u2f50"
 #define UNICODE_KANGXI_RADICAL_FUR  0x2f51
-#define UNITEXT_KANGXI_RADICAL_FUR  L"\u2f51"
+#define UNITEXT_KANGXI_RADICAL_FUR  U"\u2f51"
 #define UNICODE_KANGXI_RADICAL_CLAN  0x2f52
-#define UNITEXT_KANGXI_RADICAL_CLAN  L"\u2f52"
+#define UNITEXT_KANGXI_RADICAL_CLAN  U"\u2f52"
 #define UNICODE_KANGXI_RADICAL_STEAM  0x2f53
-#define UNITEXT_KANGXI_RADICAL_STEAM  L"\u2f53"
+#define UNITEXT_KANGXI_RADICAL_STEAM  U"\u2f53"
 #define UNICODE_KANGXI_RADICAL_WATER  0x2f54
-#define UNITEXT_KANGXI_RADICAL_WATER  L"\u2f54"
+#define UNITEXT_KANGXI_RADICAL_WATER  U"\u2f54"
 #define UNICODE_KANGXI_RADICAL_FIRE  0x2f55
-#define UNITEXT_KANGXI_RADICAL_FIRE  L"\u2f55"
+#define UNITEXT_KANGXI_RADICAL_FIRE  U"\u2f55"
 #define UNICODE_KANGXI_RADICAL_CLAW  0x2f56
-#define UNITEXT_KANGXI_RADICAL_CLAW  L"\u2f56"
+#define UNITEXT_KANGXI_RADICAL_CLAW  U"\u2f56"
 #define UNICODE_KANGXI_RADICAL_FATHER  0x2f57
-#define UNITEXT_KANGXI_RADICAL_FATHER  L"\u2f57"
+#define UNITEXT_KANGXI_RADICAL_FATHER  U"\u2f57"
 #define UNICODE_KANGXI_RADICAL_DOUBLE_X  0x2f58
-#define UNITEXT_KANGXI_RADICAL_DOUBLE_X  L"\u2f58"
+#define UNITEXT_KANGXI_RADICAL_DOUBLE_X  U"\u2f58"
 #define UNICODE_KANGXI_RADICAL_HALF_TREE_TRUNK  0x2f59
-#define UNITEXT_KANGXI_RADICAL_HALF_TREE_TRUNK  L"\u2f59"
+#define UNITEXT_KANGXI_RADICAL_HALF_TREE_TRUNK  U"\u2f59"
 #define UNICODE_KANGXI_RADICAL_SLICE  0x2f5a
-#define UNITEXT_KANGXI_RADICAL_SLICE  L"\u2f5a"
+#define UNITEXT_KANGXI_RADICAL_SLICE  U"\u2f5a"
 #define UNICODE_KANGXI_RADICAL_FANG  0x2f5b
-#define UNITEXT_KANGXI_RADICAL_FANG  L"\u2f5b"
+#define UNITEXT_KANGXI_RADICAL_FANG  U"\u2f5b"
 #define UNICODE_KANGXI_RADICAL_COW  0x2f5c
-#define UNITEXT_KANGXI_RADICAL_COW  L"\u2f5c"
+#define UNITEXT_KANGXI_RADICAL_COW  U"\u2f5c"
 #define UNICODE_KANGXI_RADICAL_DOG  0x2f5d
-#define UNITEXT_KANGXI_RADICAL_DOG  L"\u2f5d"
+#define UNITEXT_KANGXI_RADICAL_DOG  U"\u2f5d"
 #define UNICODE_KANGXI_RADICAL_PROFOUND  0x2f5e
-#define UNITEXT_KANGXI_RADICAL_PROFOUND  L"\u2f5e"
+#define UNITEXT_KANGXI_RADICAL_PROFOUND  U"\u2f5e"
 #define UNICODE_KANGXI_RADICAL_JADE  0x2f5f
-#define UNITEXT_KANGXI_RADICAL_JADE  L"\u2f5f"
+#define UNITEXT_KANGXI_RADICAL_JADE  U"\u2f5f"
 #define UNICODE_KANGXI_RADICAL_MELON  0x2f60
-#define UNITEXT_KANGXI_RADICAL_MELON  L"\u2f60"
+#define UNITEXT_KANGXI_RADICAL_MELON  U"\u2f60"
 #define UNICODE_KANGXI_RADICAL_TILE  0x2f61
-#define UNITEXT_KANGXI_RADICAL_TILE  L"\u2f61"
+#define UNITEXT_KANGXI_RADICAL_TILE  U"\u2f61"
 #define UNICODE_KANGXI_RADICAL_SWEET  0x2f62
-#define UNITEXT_KANGXI_RADICAL_SWEET  L"\u2f62"
+#define UNITEXT_KANGXI_RADICAL_SWEET  U"\u2f62"
 #define UNICODE_KANGXI_RADICAL_LIFE  0x2f63
-#define UNITEXT_KANGXI_RADICAL_LIFE  L"\u2f63"
+#define UNITEXT_KANGXI_RADICAL_LIFE  U"\u2f63"
 #define UNICODE_KANGXI_RADICAL_USE  0x2f64
-#define UNITEXT_KANGXI_RADICAL_USE  L"\u2f64"
+#define UNITEXT_KANGXI_RADICAL_USE  U"\u2f64"
 #define UNICODE_KANGXI_RADICAL_FIELD  0x2f65
-#define UNITEXT_KANGXI_RADICAL_FIELD  L"\u2f65"
+#define UNITEXT_KANGXI_RADICAL_FIELD  U"\u2f65"
 #define UNICODE_KANGXI_RADICAL_BOLT_OF_CLOTH  0x2f66
-#define UNITEXT_KANGXI_RADICAL_BOLT_OF_CLOTH  L"\u2f66"
+#define UNITEXT_KANGXI_RADICAL_BOLT_OF_CLOTH  U"\u2f66"
 #define UNICODE_KANGXI_RADICAL_SICKNESS  0x2f67
-#define UNITEXT_KANGXI_RADICAL_SICKNESS  L"\u2f67"
+#define UNITEXT_KANGXI_RADICAL_SICKNESS  U"\u2f67"
 #define UNICODE_KANGXI_RADICAL_DOTTED_TENT  0x2f68
-#define UNITEXT_KANGXI_RADICAL_DOTTED_TENT  L"\u2f68"
+#define UNITEXT_KANGXI_RADICAL_DOTTED_TENT  U"\u2f68"
 #define UNICODE_KANGXI_RADICAL_WHITE  0x2f69
-#define UNITEXT_KANGXI_RADICAL_WHITE  L"\u2f69"
+#define UNITEXT_KANGXI_RADICAL_WHITE  U"\u2f69"
 #define UNICODE_KANGXI_RADICAL_SKIN  0x2f6a
-#define UNITEXT_KANGXI_RADICAL_SKIN  L"\u2f6a"
+#define UNITEXT_KANGXI_RADICAL_SKIN  U"\u2f6a"
 #define UNICODE_KANGXI_RADICAL_DISH  0x2f6b
-#define UNITEXT_KANGXI_RADICAL_DISH  L"\u2f6b"
+#define UNITEXT_KANGXI_RADICAL_DISH  U"\u2f6b"
 #define UNICODE_KANGXI_RADICAL_EYE  0x2f6c
-#define UNITEXT_KANGXI_RADICAL_EYE  L"\u2f6c"
+#define UNITEXT_KANGXI_RADICAL_EYE  U"\u2f6c"
 #define UNICODE_KANGXI_RADICAL_SPEAR  0x2f6d
-#define UNITEXT_KANGXI_RADICAL_SPEAR  L"\u2f6d"
+#define UNITEXT_KANGXI_RADICAL_SPEAR  U"\u2f6d"
 #define UNICODE_KANGXI_RADICAL_ARROW  0x2f6e
-#define UNITEXT_KANGXI_RADICAL_ARROW  L"\u2f6e"
+#define UNITEXT_KANGXI_RADICAL_ARROW  U"\u2f6e"
 #define UNICODE_KANGXI_RADICAL_STONE  0x2f6f
-#define UNITEXT_KANGXI_RADICAL_STONE  L"\u2f6f"
+#define UNITEXT_KANGXI_RADICAL_STONE  U"\u2f6f"
 #define UNICODE_KANGXI_RADICAL_SPIRIT  0x2f70
-#define UNITEXT_KANGXI_RADICAL_SPIRIT  L"\u2f70"
+#define UNITEXT_KANGXI_RADICAL_SPIRIT  U"\u2f70"
 #define UNICODE_KANGXI_RADICAL_TRACK  0x2f71
-#define UNITEXT_KANGXI_RADICAL_TRACK  L"\u2f71"
+#define UNITEXT_KANGXI_RADICAL_TRACK  U"\u2f71"
 #define UNICODE_KANGXI_RADICAL_GRAIN  0x2f72
-#define UNITEXT_KANGXI_RADICAL_GRAIN  L"\u2f72"
+#define UNITEXT_KANGXI_RADICAL_GRAIN  U"\u2f72"
 #define UNICODE_KANGXI_RADICAL_CAVE  0x2f73
-#define UNITEXT_KANGXI_RADICAL_CAVE  L"\u2f73"
+#define UNITEXT_KANGXI_RADICAL_CAVE  U"\u2f73"
 #define UNICODE_KANGXI_RADICAL_STAND  0x2f74
-#define UNITEXT_KANGXI_RADICAL_STAND  L"\u2f74"
+#define UNITEXT_KANGXI_RADICAL_STAND  U"\u2f74"
 #define UNICODE_KANGXI_RADICAL_BAMBOO  0x2f75
-#define UNITEXT_KANGXI_RADICAL_BAMBOO  L"\u2f75"
+#define UNITEXT_KANGXI_RADICAL_BAMBOO  U"\u2f75"
 #define UNICODE_KANGXI_RADICAL_RICE  0x2f76
-#define UNITEXT_KANGXI_RADICAL_RICE  L"\u2f76"
+#define UNITEXT_KANGXI_RADICAL_RICE  U"\u2f76"
 #define UNICODE_KANGXI_RADICAL_SILK  0x2f77
-#define UNITEXT_KANGXI_RADICAL_SILK  L"\u2f77"
+#define UNITEXT_KANGXI_RADICAL_SILK  U"\u2f77"
 #define UNICODE_KANGXI_RADICAL_JAR  0x2f78
-#define UNITEXT_KANGXI_RADICAL_JAR  L"\u2f78"
+#define UNITEXT_KANGXI_RADICAL_JAR  U"\u2f78"
 #define UNICODE_KANGXI_RADICAL_NET  0x2f79
-#define UNITEXT_KANGXI_RADICAL_NET  L"\u2f79"
+#define UNITEXT_KANGXI_RADICAL_NET  U"\u2f79"
 #define UNICODE_KANGXI_RADICAL_SHEEP  0x2f7a
-#define UNITEXT_KANGXI_RADICAL_SHEEP  L"\u2f7a"
+#define UNITEXT_KANGXI_RADICAL_SHEEP  U"\u2f7a"
 #define UNICODE_KANGXI_RADICAL_FEATHER  0x2f7b
-#define UNITEXT_KANGXI_RADICAL_FEATHER  L"\u2f7b"
+#define UNITEXT_KANGXI_RADICAL_FEATHER  U"\u2f7b"
 #define UNICODE_KANGXI_RADICAL_OLD  0x2f7c
-#define UNITEXT_KANGXI_RADICAL_OLD  L"\u2f7c"
+#define UNITEXT_KANGXI_RADICAL_OLD  U"\u2f7c"
 #define UNICODE_KANGXI_RADICAL_AND  0x2f7d
-#define UNITEXT_KANGXI_RADICAL_AND  L"\u2f7d"
+#define UNITEXT_KANGXI_RADICAL_AND  U"\u2f7d"
 #define UNICODE_KANGXI_RADICAL_PLOW  0x2f7e
-#define UNITEXT_KANGXI_RADICAL_PLOW  L"\u2f7e"
+#define UNITEXT_KANGXI_RADICAL_PLOW  U"\u2f7e"
 #define UNICODE_KANGXI_RADICAL_EAR  0x2f7f
-#define UNITEXT_KANGXI_RADICAL_EAR  L"\u2f7f"
+#define UNITEXT_KANGXI_RADICAL_EAR  U"\u2f7f"
 #define UNICODE_KANGXI_RADICAL_BRUSH  0x2f80
-#define UNITEXT_KANGXI_RADICAL_BRUSH  L"\u2f80"
+#define UNITEXT_KANGXI_RADICAL_BRUSH  U"\u2f80"
 #define UNICODE_KANGXI_RADICAL_MEAT  0x2f81
-#define UNITEXT_KANGXI_RADICAL_MEAT  L"\u2f81"
+#define UNITEXT_KANGXI_RADICAL_MEAT  U"\u2f81"
 #define UNICODE_KANGXI_RADICAL_MINISTER  0x2f82
-#define UNITEXT_KANGXI_RADICAL_MINISTER  L"\u2f82"
+#define UNITEXT_KANGXI_RADICAL_MINISTER  U"\u2f82"
 #define UNICODE_KANGXI_RADICAL_SELF  0x2f83
-#define UNITEXT_KANGXI_RADICAL_SELF  L"\u2f83"
+#define UNITEXT_KANGXI_RADICAL_SELF  U"\u2f83"
 #define UNICODE_KANGXI_RADICAL_ARRIVE  0x2f84
-#define UNITEXT_KANGXI_RADICAL_ARRIVE  L"\u2f84"
+#define UNITEXT_KANGXI_RADICAL_ARRIVE  U"\u2f84"
 #define UNICODE_KANGXI_RADICAL_MORTAR  0x2f85
-#define UNITEXT_KANGXI_RADICAL_MORTAR  L"\u2f85"
+#define UNITEXT_KANGXI_RADICAL_MORTAR  U"\u2f85"
 #define UNICODE_KANGXI_RADICAL_TONGUE  0x2f86
-#define UNITEXT_KANGXI_RADICAL_TONGUE  L"\u2f86"
+#define UNITEXT_KANGXI_RADICAL_TONGUE  U"\u2f86"
 #define UNICODE_KANGXI_RADICAL_OPPOSE  0x2f87
-#define UNITEXT_KANGXI_RADICAL_OPPOSE  L"\u2f87"
+#define UNITEXT_KANGXI_RADICAL_OPPOSE  U"\u2f87"
 #define UNICODE_KANGXI_RADICAL_BOAT  0x2f88
-#define UNITEXT_KANGXI_RADICAL_BOAT  L"\u2f88"
+#define UNITEXT_KANGXI_RADICAL_BOAT  U"\u2f88"
 #define UNICODE_KANGXI_RADICAL_STOPPING  0x2f89
-#define UNITEXT_KANGXI_RADICAL_STOPPING  L"\u2f89"
+#define UNITEXT_KANGXI_RADICAL_STOPPING  U"\u2f89"
 #define UNICODE_KANGXI_RADICAL_COLOR  0x2f8a
-#define UNITEXT_KANGXI_RADICAL_COLOR  L"\u2f8a"
+#define UNITEXT_KANGXI_RADICAL_COLOR  U"\u2f8a"
 #define UNICODE_KANGXI_RADICAL_GRASS  0x2f8b
-#define UNITEXT_KANGXI_RADICAL_GRASS  L"\u2f8b"
+#define UNITEXT_KANGXI_RADICAL_GRASS  U"\u2f8b"
 #define UNICODE_KANGXI_RADICAL_TIGER  0x2f8c
-#define UNITEXT_KANGXI_RADICAL_TIGER  L"\u2f8c"
+#define UNITEXT_KANGXI_RADICAL_TIGER  U"\u2f8c"
 #define UNICODE_KANGXI_RADICAL_INSECT  0x2f8d
-#define UNITEXT_KANGXI_RADICAL_INSECT  L"\u2f8d"
+#define UNITEXT_KANGXI_RADICAL_INSECT  U"\u2f8d"
 #define UNICODE_KANGXI_RADICAL_BLOOD  0x2f8e
-#define UNITEXT_KANGXI_RADICAL_BLOOD  L"\u2f8e"
+#define UNITEXT_KANGXI_RADICAL_BLOOD  U"\u2f8e"
 #define UNICODE_KANGXI_RADICAL_WALK_ENCLOSURE  0x2f8f
-#define UNITEXT_KANGXI_RADICAL_WALK_ENCLOSURE  L"\u2f8f"
+#define UNITEXT_KANGXI_RADICAL_WALK_ENCLOSURE  U"\u2f8f"
 #define UNICODE_KANGXI_RADICAL_CLOTHES  0x2f90
-#define UNITEXT_KANGXI_RADICAL_CLOTHES  L"\u2f90"
+#define UNITEXT_KANGXI_RADICAL_CLOTHES  U"\u2f90"
 #define UNICODE_KANGXI_RADICAL_WEST  0x2f91
-#define UNITEXT_KANGXI_RADICAL_WEST  L"\u2f91"
+#define UNITEXT_KANGXI_RADICAL_WEST  U"\u2f91"
 #define UNICODE_KANGXI_RADICAL_SEE  0x2f92
-#define UNITEXT_KANGXI_RADICAL_SEE  L"\u2f92"
+#define UNITEXT_KANGXI_RADICAL_SEE  U"\u2f92"
 #define UNICODE_KANGXI_RADICAL_HORN  0x2f93
-#define UNITEXT_KANGXI_RADICAL_HORN  L"\u2f93"
+#define UNITEXT_KANGXI_RADICAL_HORN  U"\u2f93"
 #define UNICODE_KANGXI_RADICAL_SPEECH  0x2f94
-#define UNITEXT_KANGXI_RADICAL_SPEECH  L"\u2f94"
+#define UNITEXT_KANGXI_RADICAL_SPEECH  U"\u2f94"
 #define UNICODE_KANGXI_RADICAL_VALLEY  0x2f95
-#define UNITEXT_KANGXI_RADICAL_VALLEY  L"\u2f95"
+#define UNITEXT_KANGXI_RADICAL_VALLEY  U"\u2f95"
 #define UNICODE_KANGXI_RADICAL_BEAN  0x2f96
-#define UNITEXT_KANGXI_RADICAL_BEAN  L"\u2f96"
+#define UNITEXT_KANGXI_RADICAL_BEAN  U"\u2f96"
 #define UNICODE_KANGXI_RADICAL_PIG  0x2f97
-#define UNITEXT_KANGXI_RADICAL_PIG  L"\u2f97"
+#define UNITEXT_KANGXI_RADICAL_PIG  U"\u2f97"
 #define UNICODE_KANGXI_RADICAL_BADGER  0x2f98
-#define UNITEXT_KANGXI_RADICAL_BADGER  L"\u2f98"
+#define UNITEXT_KANGXI_RADICAL_BADGER  U"\u2f98"
 #define UNICODE_KANGXI_RADICAL_SHELL  0x2f99
-#define UNITEXT_KANGXI_RADICAL_SHELL  L"\u2f99"
+#define UNITEXT_KANGXI_RADICAL_SHELL  U"\u2f99"
 #define UNICODE_KANGXI_RADICAL_RED  0x2f9a
-#define UNITEXT_KANGXI_RADICAL_RED  L"\u2f9a"
+#define UNITEXT_KANGXI_RADICAL_RED  U"\u2f9a"
 #define UNICODE_KANGXI_RADICAL_RUN  0x2f9b
-#define UNITEXT_KANGXI_RADICAL_RUN  L"\u2f9b"
+#define UNITEXT_KANGXI_RADICAL_RUN  U"\u2f9b"
 #define UNICODE_KANGXI_RADICAL_FOOT  0x2f9c
-#define UNITEXT_KANGXI_RADICAL_FOOT  L"\u2f9c"
+#define UNITEXT_KANGXI_RADICAL_FOOT  U"\u2f9c"
 #define UNICODE_KANGXI_RADICAL_BODY  0x2f9d
-#define UNITEXT_KANGXI_RADICAL_BODY  L"\u2f9d"
+#define UNITEXT_KANGXI_RADICAL_BODY  U"\u2f9d"
 #define UNICODE_KANGXI_RADICAL_CART  0x2f9e
-#define UNITEXT_KANGXI_RADICAL_CART  L"\u2f9e"
+#define UNITEXT_KANGXI_RADICAL_CART  U"\u2f9e"
 #define UNICODE_KANGXI_RADICAL_BITTER  0x2f9f
-#define UNITEXT_KANGXI_RADICAL_BITTER  L"\u2f9f"
+#define UNITEXT_KANGXI_RADICAL_BITTER  U"\u2f9f"
 #define UNICODE_KANGXI_RADICAL_MORNING  0x2fa0
-#define UNITEXT_KANGXI_RADICAL_MORNING  L"\u2fa0"
+#define UNITEXT_KANGXI_RADICAL_MORNING  U"\u2fa0"
 #define UNICODE_KANGXI_RADICAL_WALK  0x2fa1
-#define UNITEXT_KANGXI_RADICAL_WALK  L"\u2fa1"
+#define UNITEXT_KANGXI_RADICAL_WALK  U"\u2fa1"
 #define UNICODE_KANGXI_RADICAL_CITY  0x2fa2
-#define UNITEXT_KANGXI_RADICAL_CITY  L"\u2fa2"
+#define UNITEXT_KANGXI_RADICAL_CITY  U"\u2fa2"
 #define UNICODE_KANGXI_RADICAL_WINE  0x2fa3
-#define UNITEXT_KANGXI_RADICAL_WINE  L"\u2fa3"
+#define UNITEXT_KANGXI_RADICAL_WINE  U"\u2fa3"
 #define UNICODE_KANGXI_RADICAL_DISTINGUISH  0x2fa4
-#define UNITEXT_KANGXI_RADICAL_DISTINGUISH  L"\u2fa4"
+#define UNITEXT_KANGXI_RADICAL_DISTINGUISH  U"\u2fa4"
 #define UNICODE_KANGXI_RADICAL_VILLAGE  0x2fa5
-#define UNITEXT_KANGXI_RADICAL_VILLAGE  L"\u2fa5"
+#define UNITEXT_KANGXI_RADICAL_VILLAGE  U"\u2fa5"
 #define UNICODE_KANGXI_RADICAL_GOLD  0x2fa6
-#define UNITEXT_KANGXI_RADICAL_GOLD  L"\u2fa6"
+#define UNITEXT_KANGXI_RADICAL_GOLD  U"\u2fa6"
 #define UNICODE_KANGXI_RADICAL_LONG  0x2fa7
-#define UNITEXT_KANGXI_RADICAL_LONG  L"\u2fa7"
+#define UNITEXT_KANGXI_RADICAL_LONG  U"\u2fa7"
 #define UNICODE_KANGXI_RADICAL_GATE  0x2fa8
-#define UNITEXT_KANGXI_RADICAL_GATE  L"\u2fa8"
+#define UNITEXT_KANGXI_RADICAL_GATE  U"\u2fa8"
 #define UNICODE_KANGXI_RADICAL_MOUND  0x2fa9
-#define UNITEXT_KANGXI_RADICAL_MOUND  L"\u2fa9"
+#define UNITEXT_KANGXI_RADICAL_MOUND  U"\u2fa9"
 #define UNICODE_KANGXI_RADICAL_SLAVE  0x2faa
-#define UNITEXT_KANGXI_RADICAL_SLAVE  L"\u2faa"
+#define UNITEXT_KANGXI_RADICAL_SLAVE  U"\u2faa"
 #define UNICODE_KANGXI_RADICAL_SHORT_TAILED_BIRD  0x2fab
-#define UNITEXT_KANGXI_RADICAL_SHORT_TAILED_BIRD  L"\u2fab"
+#define UNITEXT_KANGXI_RADICAL_SHORT_TAILED_BIRD  U"\u2fab"
 #define UNICODE_KANGXI_RADICAL_RAIN  0x2fac
-#define UNITEXT_KANGXI_RADICAL_RAIN  L"\u2fac"
+#define UNITEXT_KANGXI_RADICAL_RAIN  U"\u2fac"
 #define UNICODE_KANGXI_RADICAL_BLUE  0x2fad
-#define UNITEXT_KANGXI_RADICAL_BLUE  L"\u2fad"
+#define UNITEXT_KANGXI_RADICAL_BLUE  U"\u2fad"
 #define UNICODE_KANGXI_RADICAL_WRONG  0x2fae
-#define UNITEXT_KANGXI_RADICAL_WRONG  L"\u2fae"
+#define UNITEXT_KANGXI_RADICAL_WRONG  U"\u2fae"
 #define UNICODE_KANGXI_RADICAL_FACE  0x2faf
-#define UNITEXT_KANGXI_RADICAL_FACE  L"\u2faf"
+#define UNITEXT_KANGXI_RADICAL_FACE  U"\u2faf"
 #define UNICODE_KANGXI_RADICAL_LEATHER  0x2fb0
-#define UNITEXT_KANGXI_RADICAL_LEATHER  L"\u2fb0"
+#define UNITEXT_KANGXI_RADICAL_LEATHER  U"\u2fb0"
 #define UNICODE_KANGXI_RADICAL_TANNED_LEATHER  0x2fb1
-#define UNITEXT_KANGXI_RADICAL_TANNED_LEATHER  L"\u2fb1"
+#define UNITEXT_KANGXI_RADICAL_TANNED_LEATHER  U"\u2fb1"
 #define UNICODE_KANGXI_RADICAL_LEEK  0x2fb2
-#define UNITEXT_KANGXI_RADICAL_LEEK  L"\u2fb2"
+#define UNITEXT_KANGXI_RADICAL_LEEK  U"\u2fb2"
 #define UNICODE_KANGXI_RADICAL_SOUND  0x2fb3
-#define UNITEXT_KANGXI_RADICAL_SOUND  L"\u2fb3"
+#define UNITEXT_KANGXI_RADICAL_SOUND  U"\u2fb3"
 #define UNICODE_KANGXI_RADICAL_LEAF  0x2fb4
-#define UNITEXT_KANGXI_RADICAL_LEAF  L"\u2fb4"
+#define UNITEXT_KANGXI_RADICAL_LEAF  U"\u2fb4"
 #define UNICODE_KANGXI_RADICAL_WIND  0x2fb5
-#define UNITEXT_KANGXI_RADICAL_WIND  L"\u2fb5"
+#define UNITEXT_KANGXI_RADICAL_WIND  U"\u2fb5"
 #define UNICODE_KANGXI_RADICAL_FLY  0x2fb6
-#define UNITEXT_KANGXI_RADICAL_FLY  L"\u2fb6"
+#define UNITEXT_KANGXI_RADICAL_FLY  U"\u2fb6"
 #define UNICODE_KANGXI_RADICAL_EAT  0x2fb7
-#define UNITEXT_KANGXI_RADICAL_EAT  L"\u2fb7"
+#define UNITEXT_KANGXI_RADICAL_EAT  U"\u2fb7"
 #define UNICODE_KANGXI_RADICAL_HEAD  0x2fb8
-#define UNITEXT_KANGXI_RADICAL_HEAD  L"\u2fb8"
+#define UNITEXT_KANGXI_RADICAL_HEAD  U"\u2fb8"
 #define UNICODE_KANGXI_RADICAL_FRAGRANT  0x2fb9
-#define UNITEXT_KANGXI_RADICAL_FRAGRANT  L"\u2fb9"
+#define UNITEXT_KANGXI_RADICAL_FRAGRANT  U"\u2fb9"
 #define UNICODE_KANGXI_RADICAL_HORSE  0x2fba
-#define UNITEXT_KANGXI_RADICAL_HORSE  L"\u2fba"
+#define UNITEXT_KANGXI_RADICAL_HORSE  U"\u2fba"
 #define UNICODE_KANGXI_RADICAL_BONE  0x2fbb
-#define UNITEXT_KANGXI_RADICAL_BONE  L"\u2fbb"
+#define UNITEXT_KANGXI_RADICAL_BONE  U"\u2fbb"
 #define UNICODE_KANGXI_RADICAL_TALL  0x2fbc
-#define UNITEXT_KANGXI_RADICAL_TALL  L"\u2fbc"
+#define UNITEXT_KANGXI_RADICAL_TALL  U"\u2fbc"
 #define UNICODE_KANGXI_RADICAL_HAIR  0x2fbd
-#define UNITEXT_KANGXI_RADICAL_HAIR  L"\u2fbd"
+#define UNITEXT_KANGXI_RADICAL_HAIR  U"\u2fbd"
 #define UNICODE_KANGXI_RADICAL_FIGHT  0x2fbe
-#define UNITEXT_KANGXI_RADICAL_FIGHT  L"\u2fbe"
+#define UNITEXT_KANGXI_RADICAL_FIGHT  U"\u2fbe"
 #define UNICODE_KANGXI_RADICAL_SACRIFICIAL_WINE  0x2fbf
-#define UNITEXT_KANGXI_RADICAL_SACRIFICIAL_WINE  L"\u2fbf"
+#define UNITEXT_KANGXI_RADICAL_SACRIFICIAL_WINE  U"\u2fbf"
 #define UNICODE_KANGXI_RADICAL_CAULDRON  0x2fc0
-#define UNITEXT_KANGXI_RADICAL_CAULDRON  L"\u2fc0"
+#define UNITEXT_KANGXI_RADICAL_CAULDRON  U"\u2fc0"
 #define UNICODE_KANGXI_RADICAL_GHOST  0x2fc1
-#define UNITEXT_KANGXI_RADICAL_GHOST  L"\u2fc1"
+#define UNITEXT_KANGXI_RADICAL_GHOST  U"\u2fc1"
 #define UNICODE_KANGXI_RADICAL_FISH  0x2fc2
-#define UNITEXT_KANGXI_RADICAL_FISH  L"\u2fc2"
+#define UNITEXT_KANGXI_RADICAL_FISH  U"\u2fc2"
 #define UNICODE_KANGXI_RADICAL_BIRD  0x2fc3
-#define UNITEXT_KANGXI_RADICAL_BIRD  L"\u2fc3"
+#define UNITEXT_KANGXI_RADICAL_BIRD  U"\u2fc3"
 #define UNICODE_KANGXI_RADICAL_SALT  0x2fc4
-#define UNITEXT_KANGXI_RADICAL_SALT  L"\u2fc4"
+#define UNITEXT_KANGXI_RADICAL_SALT  U"\u2fc4"
 #define UNICODE_KANGXI_RADICAL_DEER  0x2fc5
-#define UNITEXT_KANGXI_RADICAL_DEER  L"\u2fc5"
+#define UNITEXT_KANGXI_RADICAL_DEER  U"\u2fc5"
 #define UNICODE_KANGXI_RADICAL_WHEAT  0x2fc6
-#define UNITEXT_KANGXI_RADICAL_WHEAT  L"\u2fc6"
+#define UNITEXT_KANGXI_RADICAL_WHEAT  U"\u2fc6"
 #define UNICODE_KANGXI_RADICAL_HEMP  0x2fc7
-#define UNITEXT_KANGXI_RADICAL_HEMP  L"\u2fc7"
+#define UNITEXT_KANGXI_RADICAL_HEMP  U"\u2fc7"
 #define UNICODE_KANGXI_RADICAL_YELLOW  0x2fc8
-#define UNITEXT_KANGXI_RADICAL_YELLOW  L"\u2fc8"
+#define UNITEXT_KANGXI_RADICAL_YELLOW  U"\u2fc8"
 #define UNICODE_KANGXI_RADICAL_MILLET  0x2fc9
-#define UNITEXT_KANGXI_RADICAL_MILLET  L"\u2fc9"
+#define UNITEXT_KANGXI_RADICAL_MILLET  U"\u2fc9"
 #define UNICODE_KANGXI_RADICAL_BLACK  0x2fca
-#define UNITEXT_KANGXI_RADICAL_BLACK  L"\u2fca"
+#define UNITEXT_KANGXI_RADICAL_BLACK  U"\u2fca"
 #define UNICODE_KANGXI_RADICAL_EMBROIDERY  0x2fcb
-#define UNITEXT_KANGXI_RADICAL_EMBROIDERY  L"\u2fcb"
+#define UNITEXT_KANGXI_RADICAL_EMBROIDERY  U"\u2fcb"
 #define UNICODE_KANGXI_RADICAL_FROG  0x2fcc
-#define UNITEXT_KANGXI_RADICAL_FROG  L"\u2fcc"
+#define UNITEXT_KANGXI_RADICAL_FROG  U"\u2fcc"
 #define UNICODE_KANGXI_RADICAL_TRIPOD  0x2fcd
-#define UNITEXT_KANGXI_RADICAL_TRIPOD  L"\u2fcd"
+#define UNITEXT_KANGXI_RADICAL_TRIPOD  U"\u2fcd"
 #define UNICODE_KANGXI_RADICAL_DRUM  0x2fce
-#define UNITEXT_KANGXI_RADICAL_DRUM  L"\u2fce"
+#define UNITEXT_KANGXI_RADICAL_DRUM  U"\u2fce"
 #define UNICODE_KANGXI_RADICAL_RAT  0x2fcf
-#define UNITEXT_KANGXI_RADICAL_RAT  L"\u2fcf"
+#define UNITEXT_KANGXI_RADICAL_RAT  U"\u2fcf"
 #define UNICODE_KANGXI_RADICAL_NOSE  0x2fd0
-#define UNITEXT_KANGXI_RADICAL_NOSE  L"\u2fd0"
+#define UNITEXT_KANGXI_RADICAL_NOSE  U"\u2fd0"
 #define UNICODE_KANGXI_RADICAL_EVEN  0x2fd1
-#define UNITEXT_KANGXI_RADICAL_EVEN  L"\u2fd1"
+#define UNITEXT_KANGXI_RADICAL_EVEN  U"\u2fd1"
 #define UNICODE_KANGXI_RADICAL_TOOTH  0x2fd2
-#define UNITEXT_KANGXI_RADICAL_TOOTH  L"\u2fd2"
+#define UNITEXT_KANGXI_RADICAL_TOOTH  U"\u2fd2"
 #define UNICODE_KANGXI_RADICAL_DRAGON  0x2fd3
-#define UNITEXT_KANGXI_RADICAL_DRAGON  L"\u2fd3"
+#define UNITEXT_KANGXI_RADICAL_DRAGON  U"\u2fd3"
 #define UNICODE_KANGXI_RADICAL_TURTLE  0x2fd4
-#define UNITEXT_KANGXI_RADICAL_TURTLE  L"\u2fd4"
+#define UNITEXT_KANGXI_RADICAL_TURTLE  U"\u2fd4"
 #define UNICODE_KANGXI_RADICAL_FLUTE  0x2fd5
-#define UNITEXT_KANGXI_RADICAL_FLUTE  L"\u2fd5"
+#define UNITEXT_KANGXI_RADICAL_FLUTE  U"\u2fd5"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_LEFT_TO_RIGHT  0x2ff0
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_LEFT_TO_RIGHT  L"\u2ff0"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_LEFT_TO_RIGHT  U"\u2ff0"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_ABOVE_TO_BELOW  0x2ff1
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_ABOVE_TO_BELOW  L"\u2ff1"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_ABOVE_TO_BELOW  U"\u2ff1"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_LEFT_TO_MIDDLE_AND_RIGHT  0x2ff2
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_LEFT_TO_MIDDLE_AND_RIGHT  L"\u2ff2"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_LEFT_TO_MIDDLE_AND_RIGHT  U"\u2ff2"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_ABOVE_TO_MIDDLE_AND_BELOW  0x2ff3
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_ABOVE_TO_MIDDLE_AND_BELOW  L"\u2ff3"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_ABOVE_TO_MIDDLE_AND_BELOW  U"\u2ff3"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_FULL_SURROUND  0x2ff4
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_FULL_SURROUND  L"\u2ff4"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_FULL_SURROUND  U"\u2ff4"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_ABOVE  0x2ff5
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_ABOVE  L"\u2ff5"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_ABOVE  U"\u2ff5"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_BELOW  0x2ff6
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_BELOW  L"\u2ff6"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_BELOW  U"\u2ff6"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_LEFT  0x2ff7
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_LEFT  L"\u2ff7"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_LEFT  U"\u2ff7"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_UPPER_LEFT  0x2ff8
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_UPPER_LEFT  L"\u2ff8"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_UPPER_LEFT  U"\u2ff8"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_UPPER_RIGHT  0x2ff9
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_UPPER_RIGHT  L"\u2ff9"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_UPPER_RIGHT  U"\u2ff9"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_LOWER_LEFT  0x2ffa
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_LOWER_LEFT  L"\u2ffa"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_SURROUND_FROM_LOWER_LEFT  U"\u2ffa"
 #define UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTER_OVERLAID  0x2ffb
-#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_OVERLAID  L"\u2ffb"
+#define UNITEXT_IDEOGRAPHIC_DESCRIPTION_CHARACTER_OVERLAID  U"\u2ffb"
 #define UNICODE_IDEOGRAPHIC_SPACE  0x3000
-#define UNITEXT_IDEOGRAPHIC_SPACE  L"\u3000"
+#define UNITEXT_IDEOGRAPHIC_SPACE  U"\u3000"
 #define UNICODE_IDEOGRAPHIC_COMMA  0x3001
-#define UNITEXT_IDEOGRAPHIC_COMMA  L"\u3001"
+#define UNITEXT_IDEOGRAPHIC_COMMA  U"\u3001"
 #define UNICODE_IDEOGRAPHIC_FULL_STOP  0x3002
-#define UNITEXT_IDEOGRAPHIC_FULL_STOP  L"\u3002"
+#define UNITEXT_IDEOGRAPHIC_FULL_STOP  U"\u3002"
 #define UNICODE_DITTO_MARK  0x3003
-#define UNITEXT_DITTO_MARK  L"\u3003"
+#define UNITEXT_DITTO_MARK  U"\u3003"
 #define UNICODE_JAPANESE_INDUSTRIAL_STANDARD_SYMBOL  0x3004
-#define UNITEXT_JAPANESE_INDUSTRIAL_STANDARD_SYMBOL  L"\u3004"
+#define UNITEXT_JAPANESE_INDUSTRIAL_STANDARD_SYMBOL  U"\u3004"
 #define UNICODE_IDEOGRAPHIC_ITERATION_MARK  0x3005
-#define UNITEXT_IDEOGRAPHIC_ITERATION_MARK  L"\u3005"
+#define UNITEXT_IDEOGRAPHIC_ITERATION_MARK  U"\u3005"
 #define UNICODE_IDEOGRAPHIC_CLOSING_MARK  0x3006
-#define UNITEXT_IDEOGRAPHIC_CLOSING_MARK  L"\u3006"
+#define UNITEXT_IDEOGRAPHIC_CLOSING_MARK  U"\u3006"
 #define UNICODE_IDEOGRAPHIC_NUMBER_ZERO  0x3007
-#define UNITEXT_IDEOGRAPHIC_NUMBER_ZERO  L"\u3007"
+#define UNITEXT_IDEOGRAPHIC_NUMBER_ZERO  U"\u3007"
 #define UNICODE_LEFT_ANGLE_BRACKET  0x3008
-#define UNITEXT_LEFT_ANGLE_BRACKET  L"\u3008"
+#define UNITEXT_LEFT_ANGLE_BRACKET  U"\u3008"
 #define UNICODE_RIGHT_ANGLE_BRACKET  0x3009
-#define UNITEXT_RIGHT_ANGLE_BRACKET  L"\u3009"
+#define UNITEXT_RIGHT_ANGLE_BRACKET  U"\u3009"
 #define UNICODE_LEFT_DOUBLE_ANGLE_BRACKET  0x300a
-#define UNITEXT_LEFT_DOUBLE_ANGLE_BRACKET  L"\u300a"
+#define UNITEXT_LEFT_DOUBLE_ANGLE_BRACKET  U"\u300a"
 #define UNICODE_RIGHT_DOUBLE_ANGLE_BRACKET  0x300b
-#define UNITEXT_RIGHT_DOUBLE_ANGLE_BRACKET  L"\u300b"
+#define UNITEXT_RIGHT_DOUBLE_ANGLE_BRACKET  U"\u300b"
 #define UNICODE_LEFT_CORNER_BRACKET  0x300c
-#define UNITEXT_LEFT_CORNER_BRACKET  L"\u300c"
+#define UNITEXT_LEFT_CORNER_BRACKET  U"\u300c"
 #define UNICODE_RIGHT_CORNER_BRACKET  0x300d
-#define UNITEXT_RIGHT_CORNER_BRACKET  L"\u300d"
+#define UNITEXT_RIGHT_CORNER_BRACKET  U"\u300d"
 #define UNICODE_LEFT_WHITE_CORNER_BRACKET  0x300e
-#define UNITEXT_LEFT_WHITE_CORNER_BRACKET  L"\u300e"
+#define UNITEXT_LEFT_WHITE_CORNER_BRACKET  U"\u300e"
 #define UNICODE_RIGHT_WHITE_CORNER_BRACKET  0x300f
-#define UNITEXT_RIGHT_WHITE_CORNER_BRACKET  L"\u300f"
+#define UNITEXT_RIGHT_WHITE_CORNER_BRACKET  U"\u300f"
 #define UNICODE_LEFT_BLACK_LENTICULAR_BRACKET  0x3010
-#define UNITEXT_LEFT_BLACK_LENTICULAR_BRACKET  L"\u3010"
+#define UNITEXT_LEFT_BLACK_LENTICULAR_BRACKET  U"\u3010"
 #define UNICODE_RIGHT_BLACK_LENTICULAR_BRACKET  0x3011
-#define UNITEXT_RIGHT_BLACK_LENTICULAR_BRACKET  L"\u3011"
+#define UNITEXT_RIGHT_BLACK_LENTICULAR_BRACKET  U"\u3011"
 #define UNICODE_POSTAL_MARK  0x3012
-#define UNITEXT_POSTAL_MARK  L"\u3012"
+#define UNITEXT_POSTAL_MARK  U"\u3012"
 #define UNICODE_GETA_MARK  0x3013
-#define UNITEXT_GETA_MARK  L"\u3013"
+#define UNITEXT_GETA_MARK  U"\u3013"
 #define UNICODE_LEFT_TORTOISE_SHELL_BRACKET  0x3014
-#define UNITEXT_LEFT_TORTOISE_SHELL_BRACKET  L"\u3014"
+#define UNITEXT_LEFT_TORTOISE_SHELL_BRACKET  U"\u3014"
 #define UNICODE_RIGHT_TORTOISE_SHELL_BRACKET  0x3015
-#define UNITEXT_RIGHT_TORTOISE_SHELL_BRACKET  L"\u3015"
+#define UNITEXT_RIGHT_TORTOISE_SHELL_BRACKET  U"\u3015"
 #define UNICODE_LEFT_WHITE_LENTICULAR_BRACKET  0x3016
-#define UNITEXT_LEFT_WHITE_LENTICULAR_BRACKET  L"\u3016"
+#define UNITEXT_LEFT_WHITE_LENTICULAR_BRACKET  U"\u3016"
 #define UNICODE_RIGHT_WHITE_LENTICULAR_BRACKET  0x3017
-#define UNITEXT_RIGHT_WHITE_LENTICULAR_BRACKET  L"\u3017"
+#define UNITEXT_RIGHT_WHITE_LENTICULAR_BRACKET  U"\u3017"
 #define UNICODE_LEFT_WHITE_TORTOISE_SHELL_BRACKET  0x3018
-#define UNITEXT_LEFT_WHITE_TORTOISE_SHELL_BRACKET  L"\u3018"
+#define UNITEXT_LEFT_WHITE_TORTOISE_SHELL_BRACKET  U"\u3018"
 #define UNICODE_RIGHT_WHITE_TORTOISE_SHELL_BRACKET  0x3019
-#define UNITEXT_RIGHT_WHITE_TORTOISE_SHELL_BRACKET  L"\u3019"
+#define UNITEXT_RIGHT_WHITE_TORTOISE_SHELL_BRACKET  U"\u3019"
 #define UNICODE_LEFT_WHITE_SQUARE_BRACKET  0x301a
-#define UNITEXT_LEFT_WHITE_SQUARE_BRACKET  L"\u301a"
+#define UNITEXT_LEFT_WHITE_SQUARE_BRACKET  U"\u301a"
 #define UNICODE_RIGHT_WHITE_SQUARE_BRACKET  0x301b
-#define UNITEXT_RIGHT_WHITE_SQUARE_BRACKET  L"\u301b"
+#define UNITEXT_RIGHT_WHITE_SQUARE_BRACKET  U"\u301b"
 #define UNICODE_WAVE_DASH  0x301c
-#define UNITEXT_WAVE_DASH  L"\u301c"
+#define UNITEXT_WAVE_DASH  U"\u301c"
 #define UNICODE_REVERSED_DOUBLE_PRIME_QUOTATION_MARK  0x301d
-#define UNITEXT_REVERSED_DOUBLE_PRIME_QUOTATION_MARK  L"\u301d"
+#define UNITEXT_REVERSED_DOUBLE_PRIME_QUOTATION_MARK  U"\u301d"
 #define UNICODE_DOUBLE_PRIME_QUOTATION_MARK  0x301e
-#define UNITEXT_DOUBLE_PRIME_QUOTATION_MARK  L"\u301e"
+#define UNITEXT_DOUBLE_PRIME_QUOTATION_MARK  U"\u301e"
 #define UNICODE_LOW_DOUBLE_PRIME_QUOTATION_MARK  0x301f
-#define UNITEXT_LOW_DOUBLE_PRIME_QUOTATION_MARK  L"\u301f"
+#define UNITEXT_LOW_DOUBLE_PRIME_QUOTATION_MARK  U"\u301f"
 #define UNICODE_POSTAL_MARK_FACE  0x3020
-#define UNITEXT_POSTAL_MARK_FACE  L"\u3020"
+#define UNITEXT_POSTAL_MARK_FACE  U"\u3020"
 #define UNICODE_HANGZHOU_NUMERAL_ONE  0x3021
-#define UNITEXT_HANGZHOU_NUMERAL_ONE  L"\u3021"
+#define UNITEXT_HANGZHOU_NUMERAL_ONE  U"\u3021"
 #define UNICODE_HANGZHOU_NUMERAL_TWO  0x3022
-#define UNITEXT_HANGZHOU_NUMERAL_TWO  L"\u3022"
+#define UNITEXT_HANGZHOU_NUMERAL_TWO  U"\u3022"
 #define UNICODE_HANGZHOU_NUMERAL_THREE  0x3023
-#define UNITEXT_HANGZHOU_NUMERAL_THREE  L"\u3023"
+#define UNITEXT_HANGZHOU_NUMERAL_THREE  U"\u3023"
 #define UNICODE_HANGZHOU_NUMERAL_FOUR  0x3024
-#define UNITEXT_HANGZHOU_NUMERAL_FOUR  L"\u3024"
+#define UNITEXT_HANGZHOU_NUMERAL_FOUR  U"\u3024"
 #define UNICODE_HANGZHOU_NUMERAL_FIVE  0x3025
-#define UNITEXT_HANGZHOU_NUMERAL_FIVE  L"\u3025"
+#define UNITEXT_HANGZHOU_NUMERAL_FIVE  U"\u3025"
 #define UNICODE_HANGZHOU_NUMERAL_SIX  0x3026
-#define UNITEXT_HANGZHOU_NUMERAL_SIX  L"\u3026"
+#define UNITEXT_HANGZHOU_NUMERAL_SIX  U"\u3026"
 #define UNICODE_HANGZHOU_NUMERAL_SEVEN  0x3027
-#define UNITEXT_HANGZHOU_NUMERAL_SEVEN  L"\u3027"
+#define UNITEXT_HANGZHOU_NUMERAL_SEVEN  U"\u3027"
 #define UNICODE_HANGZHOU_NUMERAL_EIGHT  0x3028
-#define UNITEXT_HANGZHOU_NUMERAL_EIGHT  L"\u3028"
+#define UNITEXT_HANGZHOU_NUMERAL_EIGHT  U"\u3028"
 #define UNICODE_HANGZHOU_NUMERAL_NINE  0x3029
-#define UNITEXT_HANGZHOU_NUMERAL_NINE  L"\u3029"
+#define UNITEXT_HANGZHOU_NUMERAL_NINE  U"\u3029"
 #define UNICODE_IDEOGRAPHIC_LEVEL_TONE_MARK  0x302a
-#define UNITEXT_IDEOGRAPHIC_LEVEL_TONE_MARK  L"\u302a"
+#define UNITEXT_IDEOGRAPHIC_LEVEL_TONE_MARK  U"\u302a"
 #define UNICODE_IDEOGRAPHIC_RISING_TONE_MARK  0x302b
-#define UNITEXT_IDEOGRAPHIC_RISING_TONE_MARK  L"\u302b"
+#define UNITEXT_IDEOGRAPHIC_RISING_TONE_MARK  U"\u302b"
 #define UNICODE_IDEOGRAPHIC_DEPARTING_TONE_MARK  0x302c
-#define UNITEXT_IDEOGRAPHIC_DEPARTING_TONE_MARK  L"\u302c"
+#define UNITEXT_IDEOGRAPHIC_DEPARTING_TONE_MARK  U"\u302c"
 #define UNICODE_IDEOGRAPHIC_ENTERING_TONE_MARK  0x302d
-#define UNITEXT_IDEOGRAPHIC_ENTERING_TONE_MARK  L"\u302d"
+#define UNITEXT_IDEOGRAPHIC_ENTERING_TONE_MARK  U"\u302d"
 #define UNICODE_HANGUL_SINGLE_DOT_TONE_MARK  0x302e
-#define UNITEXT_HANGUL_SINGLE_DOT_TONE_MARK  L"\u302e"
+#define UNITEXT_HANGUL_SINGLE_DOT_TONE_MARK  U"\u302e"
 #define UNICODE_HANGUL_DOUBLE_DOT_TONE_MARK  0x302f
-#define UNITEXT_HANGUL_DOUBLE_DOT_TONE_MARK  L"\u302f"
+#define UNITEXT_HANGUL_DOUBLE_DOT_TONE_MARK  U"\u302f"
 #define UNICODE_WAVY_DASH  0x3030
-#define UNITEXT_WAVY_DASH  L"\u3030"
+#define UNITEXT_WAVY_DASH  U"\u3030"
 #define UNICODE_VERTICAL_KANA_REPEAT_MARK  0x3031
-#define UNITEXT_VERTICAL_KANA_REPEAT_MARK  L"\u3031"
+#define UNITEXT_VERTICAL_KANA_REPEAT_MARK  U"\u3031"
 #define UNICODE_VERTICAL_KANA_REPEAT_WITH_VOICED_SOUND_MARK  0x3032
-#define UNITEXT_VERTICAL_KANA_REPEAT_WITH_VOICED_SOUND_MARK  L"\u3032"
+#define UNITEXT_VERTICAL_KANA_REPEAT_WITH_VOICED_SOUND_MARK  U"\u3032"
 #define UNICODE_VERTICAL_KANA_REPEAT_MARK_UPPER_HALF  0x3033
-#define UNITEXT_VERTICAL_KANA_REPEAT_MARK_UPPER_HALF  L"\u3033"
+#define UNITEXT_VERTICAL_KANA_REPEAT_MARK_UPPER_HALF  U"\u3033"
 #define UNICODE_VERTICAL_KANA_REPEAT_WITH_VOICED_SOUND_MARK_UPPER_HALF  0x3034
-#define UNITEXT_VERTICAL_KANA_REPEAT_WITH_VOICED_SOUND_MARK_UPPER_HALF  L"\u3034"
+#define UNITEXT_VERTICAL_KANA_REPEAT_WITH_VOICED_SOUND_MARK_UPPER_HALF  U"\u3034"
 #define UNICODE_VERTICAL_KANA_REPEAT_MARK_LOWER_HALF  0x3035
-#define UNITEXT_VERTICAL_KANA_REPEAT_MARK_LOWER_HALF  L"\u3035"
+#define UNITEXT_VERTICAL_KANA_REPEAT_MARK_LOWER_HALF  U"\u3035"
 #define UNICODE_CIRCLED_POSTAL_MARK  0x3036
-#define UNITEXT_CIRCLED_POSTAL_MARK  L"\u3036"
+#define UNITEXT_CIRCLED_POSTAL_MARK  U"\u3036"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_LINE_FEED_SEPARATOR_SYMBOL  0x3037
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_LINE_FEED_SEPARATOR_SYMBOL  L"\u3037"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_LINE_FEED_SEPARATOR_SYMBOL  U"\u3037"
 #define UNICODE_HANGZHOU_NUMERAL_TEN  0x3038
-#define UNITEXT_HANGZHOU_NUMERAL_TEN  L"\u3038"
+#define UNITEXT_HANGZHOU_NUMERAL_TEN  U"\u3038"
 #define UNICODE_HANGZHOU_NUMERAL_TWENTY  0x3039
-#define UNITEXT_HANGZHOU_NUMERAL_TWENTY  L"\u3039"
+#define UNITEXT_HANGZHOU_NUMERAL_TWENTY  U"\u3039"
 #define UNICODE_HANGZHOU_NUMERAL_THIRTY  0x303a
-#define UNITEXT_HANGZHOU_NUMERAL_THIRTY  L"\u303a"
+#define UNITEXT_HANGZHOU_NUMERAL_THIRTY  U"\u303a"
 #define UNICODE_VERTICAL_IDEOGRAPHIC_ITERATION_MARK  0x303b
-#define UNITEXT_VERTICAL_IDEOGRAPHIC_ITERATION_MARK  L"\u303b"
+#define UNITEXT_VERTICAL_IDEOGRAPHIC_ITERATION_MARK  U"\u303b"
 #define UNICODE_MASU_MARK  0x303c
-#define UNITEXT_MASU_MARK  L"\u303c"
+#define UNITEXT_MASU_MARK  U"\u303c"
 #define UNICODE_PART_ALTERNATION_MARK  0x303d
-#define UNITEXT_PART_ALTERNATION_MARK  L"\u303d"
+#define UNITEXT_PART_ALTERNATION_MARK  U"\u303d"
 #define UNICODE_IDEOGRAPHIC_VARIATION_INDICATOR  0x303e
-#define UNITEXT_IDEOGRAPHIC_VARIATION_INDICATOR  L"\u303e"
+#define UNITEXT_IDEOGRAPHIC_VARIATION_INDICATOR  U"\u303e"
 #define UNICODE_IDEOGRAPHIC_HALF_FILL_SPACE  0x303f
-#define UNITEXT_IDEOGRAPHIC_HALF_FILL_SPACE  L"\u303f"
+#define UNITEXT_IDEOGRAPHIC_HALF_FILL_SPACE  U"\u303f"
 #define UNICODE_HIRAGANA_LETTER_SMALL_A  0x3041
-#define UNITEXT_HIRAGANA_LETTER_SMALL_A  L"\u3041"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_A  U"\u3041"
 #define UNICODE_HIRAGANA_LETTER_A  0x3042
-#define UNITEXT_HIRAGANA_LETTER_A  L"\u3042"
+#define UNITEXT_HIRAGANA_LETTER_A  U"\u3042"
 #define UNICODE_HIRAGANA_LETTER_SMALL_I  0x3043
-#define UNITEXT_HIRAGANA_LETTER_SMALL_I  L"\u3043"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_I  U"\u3043"
 #define UNICODE_HIRAGANA_LETTER_I  0x3044
-#define UNITEXT_HIRAGANA_LETTER_I  L"\u3044"
+#define UNITEXT_HIRAGANA_LETTER_I  U"\u3044"
 #define UNICODE_HIRAGANA_LETTER_SMALL_U  0x3045
-#define UNITEXT_HIRAGANA_LETTER_SMALL_U  L"\u3045"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_U  U"\u3045"
 #define UNICODE_HIRAGANA_LETTER_U  0x3046
-#define UNITEXT_HIRAGANA_LETTER_U  L"\u3046"
+#define UNITEXT_HIRAGANA_LETTER_U  U"\u3046"
 #define UNICODE_HIRAGANA_LETTER_SMALL_E  0x3047
-#define UNITEXT_HIRAGANA_LETTER_SMALL_E  L"\u3047"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_E  U"\u3047"
 #define UNICODE_HIRAGANA_LETTER_E  0x3048
-#define UNITEXT_HIRAGANA_LETTER_E  L"\u3048"
+#define UNITEXT_HIRAGANA_LETTER_E  U"\u3048"
 #define UNICODE_HIRAGANA_LETTER_SMALL_O  0x3049
-#define UNITEXT_HIRAGANA_LETTER_SMALL_O  L"\u3049"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_O  U"\u3049"
 #define UNICODE_HIRAGANA_LETTER_O  0x304a
-#define UNITEXT_HIRAGANA_LETTER_O  L"\u304a"
+#define UNITEXT_HIRAGANA_LETTER_O  U"\u304a"
 #define UNICODE_HIRAGANA_LETTER_KA  0x304b
-#define UNITEXT_HIRAGANA_LETTER_KA  L"\u304b"
+#define UNITEXT_HIRAGANA_LETTER_KA  U"\u304b"
 #define UNICODE_HIRAGANA_LETTER_GA  0x304c
-#define UNITEXT_HIRAGANA_LETTER_GA  L"\u304c"
+#define UNITEXT_HIRAGANA_LETTER_GA  U"\u304c"
 #define UNICODE_HIRAGANA_LETTER_KI  0x304d
-#define UNITEXT_HIRAGANA_LETTER_KI  L"\u304d"
+#define UNITEXT_HIRAGANA_LETTER_KI  U"\u304d"
 #define UNICODE_HIRAGANA_LETTER_GI  0x304e
-#define UNITEXT_HIRAGANA_LETTER_GI  L"\u304e"
+#define UNITEXT_HIRAGANA_LETTER_GI  U"\u304e"
 #define UNICODE_HIRAGANA_LETTER_KU  0x304f
-#define UNITEXT_HIRAGANA_LETTER_KU  L"\u304f"
+#define UNITEXT_HIRAGANA_LETTER_KU  U"\u304f"
 #define UNICODE_HIRAGANA_LETTER_GU  0x3050
-#define UNITEXT_HIRAGANA_LETTER_GU  L"\u3050"
+#define UNITEXT_HIRAGANA_LETTER_GU  U"\u3050"
 #define UNICODE_HIRAGANA_LETTER_KE  0x3051
-#define UNITEXT_HIRAGANA_LETTER_KE  L"\u3051"
+#define UNITEXT_HIRAGANA_LETTER_KE  U"\u3051"
 #define UNICODE_HIRAGANA_LETTER_GE  0x3052
-#define UNITEXT_HIRAGANA_LETTER_GE  L"\u3052"
+#define UNITEXT_HIRAGANA_LETTER_GE  U"\u3052"
 #define UNICODE_HIRAGANA_LETTER_KO  0x3053
-#define UNITEXT_HIRAGANA_LETTER_KO  L"\u3053"
+#define UNITEXT_HIRAGANA_LETTER_KO  U"\u3053"
 #define UNICODE_HIRAGANA_LETTER_GO  0x3054
-#define UNITEXT_HIRAGANA_LETTER_GO  L"\u3054"
+#define UNITEXT_HIRAGANA_LETTER_GO  U"\u3054"
 #define UNICODE_HIRAGANA_LETTER_SA  0x3055
-#define UNITEXT_HIRAGANA_LETTER_SA  L"\u3055"
+#define UNITEXT_HIRAGANA_LETTER_SA  U"\u3055"
 #define UNICODE_HIRAGANA_LETTER_ZA  0x3056
-#define UNITEXT_HIRAGANA_LETTER_ZA  L"\u3056"
+#define UNITEXT_HIRAGANA_LETTER_ZA  U"\u3056"
 #define UNICODE_HIRAGANA_LETTER_SI  0x3057
-#define UNITEXT_HIRAGANA_LETTER_SI  L"\u3057"
+#define UNITEXT_HIRAGANA_LETTER_SI  U"\u3057"
 #define UNICODE_HIRAGANA_LETTER_ZI  0x3058
-#define UNITEXT_HIRAGANA_LETTER_ZI  L"\u3058"
+#define UNITEXT_HIRAGANA_LETTER_ZI  U"\u3058"
 #define UNICODE_HIRAGANA_LETTER_SU  0x3059
-#define UNITEXT_HIRAGANA_LETTER_SU  L"\u3059"
+#define UNITEXT_HIRAGANA_LETTER_SU  U"\u3059"
 #define UNICODE_HIRAGANA_LETTER_ZU  0x305a
-#define UNITEXT_HIRAGANA_LETTER_ZU  L"\u305a"
+#define UNITEXT_HIRAGANA_LETTER_ZU  U"\u305a"
 #define UNICODE_HIRAGANA_LETTER_SE  0x305b
-#define UNITEXT_HIRAGANA_LETTER_SE  L"\u305b"
+#define UNITEXT_HIRAGANA_LETTER_SE  U"\u305b"
 #define UNICODE_HIRAGANA_LETTER_ZE  0x305c
-#define UNITEXT_HIRAGANA_LETTER_ZE  L"\u305c"
+#define UNITEXT_HIRAGANA_LETTER_ZE  U"\u305c"
 #define UNICODE_HIRAGANA_LETTER_SO  0x305d
-#define UNITEXT_HIRAGANA_LETTER_SO  L"\u305d"
+#define UNITEXT_HIRAGANA_LETTER_SO  U"\u305d"
 #define UNICODE_HIRAGANA_LETTER_ZO  0x305e
-#define UNITEXT_HIRAGANA_LETTER_ZO  L"\u305e"
+#define UNITEXT_HIRAGANA_LETTER_ZO  U"\u305e"
 #define UNICODE_HIRAGANA_LETTER_TA  0x305f
-#define UNITEXT_HIRAGANA_LETTER_TA  L"\u305f"
+#define UNITEXT_HIRAGANA_LETTER_TA  U"\u305f"
 #define UNICODE_HIRAGANA_LETTER_DA  0x3060
-#define UNITEXT_HIRAGANA_LETTER_DA  L"\u3060"
+#define UNITEXT_HIRAGANA_LETTER_DA  U"\u3060"
 #define UNICODE_HIRAGANA_LETTER_TI  0x3061
-#define UNITEXT_HIRAGANA_LETTER_TI  L"\u3061"
+#define UNITEXT_HIRAGANA_LETTER_TI  U"\u3061"
 #define UNICODE_HIRAGANA_LETTER_DI  0x3062
-#define UNITEXT_HIRAGANA_LETTER_DI  L"\u3062"
+#define UNITEXT_HIRAGANA_LETTER_DI  U"\u3062"
 #define UNICODE_HIRAGANA_LETTER_SMALL_TU  0x3063
-#define UNITEXT_HIRAGANA_LETTER_SMALL_TU  L"\u3063"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_TU  U"\u3063"
 #define UNICODE_HIRAGANA_LETTER_TU  0x3064
-#define UNITEXT_HIRAGANA_LETTER_TU  L"\u3064"
+#define UNITEXT_HIRAGANA_LETTER_TU  U"\u3064"
 #define UNICODE_HIRAGANA_LETTER_DU  0x3065
-#define UNITEXT_HIRAGANA_LETTER_DU  L"\u3065"
+#define UNITEXT_HIRAGANA_LETTER_DU  U"\u3065"
 #define UNICODE_HIRAGANA_LETTER_TE  0x3066
-#define UNITEXT_HIRAGANA_LETTER_TE  L"\u3066"
+#define UNITEXT_HIRAGANA_LETTER_TE  U"\u3066"
 #define UNICODE_HIRAGANA_LETTER_DE  0x3067
-#define UNITEXT_HIRAGANA_LETTER_DE  L"\u3067"
+#define UNITEXT_HIRAGANA_LETTER_DE  U"\u3067"
 #define UNICODE_HIRAGANA_LETTER_TO  0x3068
-#define UNITEXT_HIRAGANA_LETTER_TO  L"\u3068"
+#define UNITEXT_HIRAGANA_LETTER_TO  U"\u3068"
 #define UNICODE_HIRAGANA_LETTER_DO  0x3069
-#define UNITEXT_HIRAGANA_LETTER_DO  L"\u3069"
+#define UNITEXT_HIRAGANA_LETTER_DO  U"\u3069"
 #define UNICODE_HIRAGANA_LETTER_NA  0x306a
-#define UNITEXT_HIRAGANA_LETTER_NA  L"\u306a"
+#define UNITEXT_HIRAGANA_LETTER_NA  U"\u306a"
 #define UNICODE_HIRAGANA_LETTER_NI  0x306b
-#define UNITEXT_HIRAGANA_LETTER_NI  L"\u306b"
+#define UNITEXT_HIRAGANA_LETTER_NI  U"\u306b"
 #define UNICODE_HIRAGANA_LETTER_NU  0x306c
-#define UNITEXT_HIRAGANA_LETTER_NU  L"\u306c"
+#define UNITEXT_HIRAGANA_LETTER_NU  U"\u306c"
 #define UNICODE_HIRAGANA_LETTER_NE  0x306d
-#define UNITEXT_HIRAGANA_LETTER_NE  L"\u306d"
+#define UNITEXT_HIRAGANA_LETTER_NE  U"\u306d"
 #define UNICODE_HIRAGANA_LETTER_NO  0x306e
-#define UNITEXT_HIRAGANA_LETTER_NO  L"\u306e"
+#define UNITEXT_HIRAGANA_LETTER_NO  U"\u306e"
 #define UNICODE_HIRAGANA_LETTER_HA  0x306f
-#define UNITEXT_HIRAGANA_LETTER_HA  L"\u306f"
+#define UNITEXT_HIRAGANA_LETTER_HA  U"\u306f"
 #define UNICODE_HIRAGANA_LETTER_BA  0x3070
-#define UNITEXT_HIRAGANA_LETTER_BA  L"\u3070"
+#define UNITEXT_HIRAGANA_LETTER_BA  U"\u3070"
 #define UNICODE_HIRAGANA_LETTER_PA  0x3071
-#define UNITEXT_HIRAGANA_LETTER_PA  L"\u3071"
+#define UNITEXT_HIRAGANA_LETTER_PA  U"\u3071"
 #define UNICODE_HIRAGANA_LETTER_HI  0x3072
-#define UNITEXT_HIRAGANA_LETTER_HI  L"\u3072"
+#define UNITEXT_HIRAGANA_LETTER_HI  U"\u3072"
 #define UNICODE_HIRAGANA_LETTER_BI  0x3073
-#define UNITEXT_HIRAGANA_LETTER_BI  L"\u3073"
+#define UNITEXT_HIRAGANA_LETTER_BI  U"\u3073"
 #define UNICODE_HIRAGANA_LETTER_PI  0x3074
-#define UNITEXT_HIRAGANA_LETTER_PI  L"\u3074"
+#define UNITEXT_HIRAGANA_LETTER_PI  U"\u3074"
 #define UNICODE_HIRAGANA_LETTER_HU  0x3075
-#define UNITEXT_HIRAGANA_LETTER_HU  L"\u3075"
+#define UNITEXT_HIRAGANA_LETTER_HU  U"\u3075"
 #define UNICODE_HIRAGANA_LETTER_BU  0x3076
-#define UNITEXT_HIRAGANA_LETTER_BU  L"\u3076"
+#define UNITEXT_HIRAGANA_LETTER_BU  U"\u3076"
 #define UNICODE_HIRAGANA_LETTER_PU  0x3077
-#define UNITEXT_HIRAGANA_LETTER_PU  L"\u3077"
+#define UNITEXT_HIRAGANA_LETTER_PU  U"\u3077"
 #define UNICODE_HIRAGANA_LETTER_HE  0x3078
-#define UNITEXT_HIRAGANA_LETTER_HE  L"\u3078"
+#define UNITEXT_HIRAGANA_LETTER_HE  U"\u3078"
 #define UNICODE_HIRAGANA_LETTER_BE  0x3079
-#define UNITEXT_HIRAGANA_LETTER_BE  L"\u3079"
+#define UNITEXT_HIRAGANA_LETTER_BE  U"\u3079"
 #define UNICODE_HIRAGANA_LETTER_PE  0x307a
-#define UNITEXT_HIRAGANA_LETTER_PE  L"\u307a"
+#define UNITEXT_HIRAGANA_LETTER_PE  U"\u307a"
 #define UNICODE_HIRAGANA_LETTER_HO  0x307b
-#define UNITEXT_HIRAGANA_LETTER_HO  L"\u307b"
+#define UNITEXT_HIRAGANA_LETTER_HO  U"\u307b"
 #define UNICODE_HIRAGANA_LETTER_BO  0x307c
-#define UNITEXT_HIRAGANA_LETTER_BO  L"\u307c"
+#define UNITEXT_HIRAGANA_LETTER_BO  U"\u307c"
 #define UNICODE_HIRAGANA_LETTER_PO  0x307d
-#define UNITEXT_HIRAGANA_LETTER_PO  L"\u307d"
+#define UNITEXT_HIRAGANA_LETTER_PO  U"\u307d"
 #define UNICODE_HIRAGANA_LETTER_MA  0x307e
-#define UNITEXT_HIRAGANA_LETTER_MA  L"\u307e"
+#define UNITEXT_HIRAGANA_LETTER_MA  U"\u307e"
 #define UNICODE_HIRAGANA_LETTER_MI  0x307f
-#define UNITEXT_HIRAGANA_LETTER_MI  L"\u307f"
+#define UNITEXT_HIRAGANA_LETTER_MI  U"\u307f"
 #define UNICODE_HIRAGANA_LETTER_MU  0x3080
-#define UNITEXT_HIRAGANA_LETTER_MU  L"\u3080"
+#define UNITEXT_HIRAGANA_LETTER_MU  U"\u3080"
 #define UNICODE_HIRAGANA_LETTER_ME  0x3081
-#define UNITEXT_HIRAGANA_LETTER_ME  L"\u3081"
+#define UNITEXT_HIRAGANA_LETTER_ME  U"\u3081"
 #define UNICODE_HIRAGANA_LETTER_MO  0x3082
-#define UNITEXT_HIRAGANA_LETTER_MO  L"\u3082"
+#define UNITEXT_HIRAGANA_LETTER_MO  U"\u3082"
 #define UNICODE_HIRAGANA_LETTER_SMALL_YA  0x3083
-#define UNITEXT_HIRAGANA_LETTER_SMALL_YA  L"\u3083"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_YA  U"\u3083"
 #define UNICODE_HIRAGANA_LETTER_YA  0x3084
-#define UNITEXT_HIRAGANA_LETTER_YA  L"\u3084"
+#define UNITEXT_HIRAGANA_LETTER_YA  U"\u3084"
 #define UNICODE_HIRAGANA_LETTER_SMALL_YU  0x3085
-#define UNITEXT_HIRAGANA_LETTER_SMALL_YU  L"\u3085"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_YU  U"\u3085"
 #define UNICODE_HIRAGANA_LETTER_YU  0x3086
-#define UNITEXT_HIRAGANA_LETTER_YU  L"\u3086"
+#define UNITEXT_HIRAGANA_LETTER_YU  U"\u3086"
 #define UNICODE_HIRAGANA_LETTER_SMALL_YO  0x3087
-#define UNITEXT_HIRAGANA_LETTER_SMALL_YO  L"\u3087"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_YO  U"\u3087"
 #define UNICODE_HIRAGANA_LETTER_YO  0x3088
-#define UNITEXT_HIRAGANA_LETTER_YO  L"\u3088"
+#define UNITEXT_HIRAGANA_LETTER_YO  U"\u3088"
 #define UNICODE_HIRAGANA_LETTER_RA  0x3089
-#define UNITEXT_HIRAGANA_LETTER_RA  L"\u3089"
+#define UNITEXT_HIRAGANA_LETTER_RA  U"\u3089"
 #define UNICODE_HIRAGANA_LETTER_RI  0x308a
-#define UNITEXT_HIRAGANA_LETTER_RI  L"\u308a"
+#define UNITEXT_HIRAGANA_LETTER_RI  U"\u308a"
 #define UNICODE_HIRAGANA_LETTER_RU  0x308b
-#define UNITEXT_HIRAGANA_LETTER_RU  L"\u308b"
+#define UNITEXT_HIRAGANA_LETTER_RU  U"\u308b"
 #define UNICODE_HIRAGANA_LETTER_RE  0x308c
-#define UNITEXT_HIRAGANA_LETTER_RE  L"\u308c"
+#define UNITEXT_HIRAGANA_LETTER_RE  U"\u308c"
 #define UNICODE_HIRAGANA_LETTER_RO  0x308d
-#define UNITEXT_HIRAGANA_LETTER_RO  L"\u308d"
+#define UNITEXT_HIRAGANA_LETTER_RO  U"\u308d"
 #define UNICODE_HIRAGANA_LETTER_SMALL_WA  0x308e
-#define UNITEXT_HIRAGANA_LETTER_SMALL_WA  L"\u308e"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_WA  U"\u308e"
 #define UNICODE_HIRAGANA_LETTER_WA  0x308f
-#define UNITEXT_HIRAGANA_LETTER_WA  L"\u308f"
+#define UNITEXT_HIRAGANA_LETTER_WA  U"\u308f"
 #define UNICODE_HIRAGANA_LETTER_WI  0x3090
-#define UNITEXT_HIRAGANA_LETTER_WI  L"\u3090"
+#define UNITEXT_HIRAGANA_LETTER_WI  U"\u3090"
 #define UNICODE_HIRAGANA_LETTER_WE  0x3091
-#define UNITEXT_HIRAGANA_LETTER_WE  L"\u3091"
+#define UNITEXT_HIRAGANA_LETTER_WE  U"\u3091"
 #define UNICODE_HIRAGANA_LETTER_WO  0x3092
-#define UNITEXT_HIRAGANA_LETTER_WO  L"\u3092"
+#define UNITEXT_HIRAGANA_LETTER_WO  U"\u3092"
 #define UNICODE_HIRAGANA_LETTER_N  0x3093
-#define UNITEXT_HIRAGANA_LETTER_N  L"\u3093"
+#define UNITEXT_HIRAGANA_LETTER_N  U"\u3093"
 #define UNICODE_HIRAGANA_LETTER_VU  0x3094
-#define UNITEXT_HIRAGANA_LETTER_VU  L"\u3094"
+#define UNITEXT_HIRAGANA_LETTER_VU  U"\u3094"
 #define UNICODE_HIRAGANA_LETTER_SMALL_KA  0x3095
-#define UNITEXT_HIRAGANA_LETTER_SMALL_KA  L"\u3095"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_KA  U"\u3095"
 #define UNICODE_HIRAGANA_LETTER_SMALL_KE  0x3096
-#define UNITEXT_HIRAGANA_LETTER_SMALL_KE  L"\u3096"
+#define UNITEXT_HIRAGANA_LETTER_SMALL_KE  U"\u3096"
 #define UNICODE_COMBINING_KATAKANA_HIRAGANA_VOICED_SOUND_MARK  0x3099
-#define UNITEXT_COMBINING_KATAKANA_HIRAGANA_VOICED_SOUND_MARK  L"\u3099"
+#define UNITEXT_COMBINING_KATAKANA_HIRAGANA_VOICED_SOUND_MARK  U"\u3099"
 #define UNICODE_COMBINING_KATAKANA_HIRAGANA_SEMI_VOICED_SOUND_MARK  0x309a
-#define UNITEXT_COMBINING_KATAKANA_HIRAGANA_SEMI_VOICED_SOUND_MARK  L"\u309a"
+#define UNITEXT_COMBINING_KATAKANA_HIRAGANA_SEMI_VOICED_SOUND_MARK  U"\u309a"
 #define UNICODE_KATAKANA_HIRAGANA_VOICED_SOUND_MARK  0x309b
-#define UNITEXT_KATAKANA_HIRAGANA_VOICED_SOUND_MARK  L"\u309b"
+#define UNITEXT_KATAKANA_HIRAGANA_VOICED_SOUND_MARK  U"\u309b"
 #define UNICODE_KATAKANA_HIRAGANA_SEMI_VOICED_SOUND_MARK  0x309c
-#define UNITEXT_KATAKANA_HIRAGANA_SEMI_VOICED_SOUND_MARK  L"\u309c"
+#define UNITEXT_KATAKANA_HIRAGANA_SEMI_VOICED_SOUND_MARK  U"\u309c"
 #define UNICODE_HIRAGANA_ITERATION_MARK  0x309d
-#define UNITEXT_HIRAGANA_ITERATION_MARK  L"\u309d"
+#define UNITEXT_HIRAGANA_ITERATION_MARK  U"\u309d"
 #define UNICODE_HIRAGANA_VOICED_ITERATION_MARK  0x309e
-#define UNITEXT_HIRAGANA_VOICED_ITERATION_MARK  L"\u309e"
+#define UNITEXT_HIRAGANA_VOICED_ITERATION_MARK  U"\u309e"
 #define UNICODE_HIRAGANA_DIGRAPH_YORI  0x309f
-#define UNITEXT_HIRAGANA_DIGRAPH_YORI  L"\u309f"
+#define UNITEXT_HIRAGANA_DIGRAPH_YORI  U"\u309f"
 #define UNICODE_KATAKANA_HIRAGANA_DOUBLE_HYPHEN  0x30a0
-#define UNITEXT_KATAKANA_HIRAGANA_DOUBLE_HYPHEN  L"\u30a0"
+#define UNITEXT_KATAKANA_HIRAGANA_DOUBLE_HYPHEN  U"\u30a0"
 #define UNICODE_KATAKANA_LETTER_SMALL_A  0x30a1
-#define UNITEXT_KATAKANA_LETTER_SMALL_A  L"\u30a1"
+#define UNITEXT_KATAKANA_LETTER_SMALL_A  U"\u30a1"
 #define UNICODE_KATAKANA_LETTER_A  0x30a2
-#define UNITEXT_KATAKANA_LETTER_A  L"\u30a2"
+#define UNITEXT_KATAKANA_LETTER_A  U"\u30a2"
 #define UNICODE_KATAKANA_LETTER_SMALL_I  0x30a3
-#define UNITEXT_KATAKANA_LETTER_SMALL_I  L"\u30a3"
+#define UNITEXT_KATAKANA_LETTER_SMALL_I  U"\u30a3"
 #define UNICODE_KATAKANA_LETTER_I  0x30a4
-#define UNITEXT_KATAKANA_LETTER_I  L"\u30a4"
+#define UNITEXT_KATAKANA_LETTER_I  U"\u30a4"
 #define UNICODE_KATAKANA_LETTER_SMALL_U  0x30a5
-#define UNITEXT_KATAKANA_LETTER_SMALL_U  L"\u30a5"
+#define UNITEXT_KATAKANA_LETTER_SMALL_U  U"\u30a5"
 #define UNICODE_KATAKANA_LETTER_U  0x30a6
-#define UNITEXT_KATAKANA_LETTER_U  L"\u30a6"
+#define UNITEXT_KATAKANA_LETTER_U  U"\u30a6"
 #define UNICODE_KATAKANA_LETTER_SMALL_E  0x30a7
-#define UNITEXT_KATAKANA_LETTER_SMALL_E  L"\u30a7"
+#define UNITEXT_KATAKANA_LETTER_SMALL_E  U"\u30a7"
 #define UNICODE_KATAKANA_LETTER_E  0x30a8
-#define UNITEXT_KATAKANA_LETTER_E  L"\u30a8"
+#define UNITEXT_KATAKANA_LETTER_E  U"\u30a8"
 #define UNICODE_KATAKANA_LETTER_SMALL_O  0x30a9
-#define UNITEXT_KATAKANA_LETTER_SMALL_O  L"\u30a9"
+#define UNITEXT_KATAKANA_LETTER_SMALL_O  U"\u30a9"
 #define UNICODE_KATAKANA_LETTER_O  0x30aa
-#define UNITEXT_KATAKANA_LETTER_O  L"\u30aa"
+#define UNITEXT_KATAKANA_LETTER_O  U"\u30aa"
 #define UNICODE_KATAKANA_LETTER_KA  0x30ab
-#define UNITEXT_KATAKANA_LETTER_KA  L"\u30ab"
+#define UNITEXT_KATAKANA_LETTER_KA  U"\u30ab"
 #define UNICODE_KATAKANA_LETTER_GA  0x30ac
-#define UNITEXT_KATAKANA_LETTER_GA  L"\u30ac"
+#define UNITEXT_KATAKANA_LETTER_GA  U"\u30ac"
 #define UNICODE_KATAKANA_LETTER_KI  0x30ad
-#define UNITEXT_KATAKANA_LETTER_KI  L"\u30ad"
+#define UNITEXT_KATAKANA_LETTER_KI  U"\u30ad"
 #define UNICODE_KATAKANA_LETTER_GI  0x30ae
-#define UNITEXT_KATAKANA_LETTER_GI  L"\u30ae"
+#define UNITEXT_KATAKANA_LETTER_GI  U"\u30ae"
 #define UNICODE_KATAKANA_LETTER_KU  0x30af
-#define UNITEXT_KATAKANA_LETTER_KU  L"\u30af"
+#define UNITEXT_KATAKANA_LETTER_KU  U"\u30af"
 #define UNICODE_KATAKANA_LETTER_GU  0x30b0
-#define UNITEXT_KATAKANA_LETTER_GU  L"\u30b0"
+#define UNITEXT_KATAKANA_LETTER_GU  U"\u30b0"
 #define UNICODE_KATAKANA_LETTER_KE  0x30b1
-#define UNITEXT_KATAKANA_LETTER_KE  L"\u30b1"
+#define UNITEXT_KATAKANA_LETTER_KE  U"\u30b1"
 #define UNICODE_KATAKANA_LETTER_GE  0x30b2
-#define UNITEXT_KATAKANA_LETTER_GE  L"\u30b2"
+#define UNITEXT_KATAKANA_LETTER_GE  U"\u30b2"
 #define UNICODE_KATAKANA_LETTER_KO  0x30b3
-#define UNITEXT_KATAKANA_LETTER_KO  L"\u30b3"
+#define UNITEXT_KATAKANA_LETTER_KO  U"\u30b3"
 #define UNICODE_KATAKANA_LETTER_GO  0x30b4
-#define UNITEXT_KATAKANA_LETTER_GO  L"\u30b4"
+#define UNITEXT_KATAKANA_LETTER_GO  U"\u30b4"
 #define UNICODE_KATAKANA_LETTER_SA  0x30b5
-#define UNITEXT_KATAKANA_LETTER_SA  L"\u30b5"
+#define UNITEXT_KATAKANA_LETTER_SA  U"\u30b5"
 #define UNICODE_KATAKANA_LETTER_ZA  0x30b6
-#define UNITEXT_KATAKANA_LETTER_ZA  L"\u30b6"
+#define UNITEXT_KATAKANA_LETTER_ZA  U"\u30b6"
 #define UNICODE_KATAKANA_LETTER_SI  0x30b7
-#define UNITEXT_KATAKANA_LETTER_SI  L"\u30b7"
+#define UNITEXT_KATAKANA_LETTER_SI  U"\u30b7"
 #define UNICODE_KATAKANA_LETTER_ZI  0x30b8
-#define UNITEXT_KATAKANA_LETTER_ZI  L"\u30b8"
+#define UNITEXT_KATAKANA_LETTER_ZI  U"\u30b8"
 #define UNICODE_KATAKANA_LETTER_SU  0x30b9
-#define UNITEXT_KATAKANA_LETTER_SU  L"\u30b9"
+#define UNITEXT_KATAKANA_LETTER_SU  U"\u30b9"
 #define UNICODE_KATAKANA_LETTER_ZU  0x30ba
-#define UNITEXT_KATAKANA_LETTER_ZU  L"\u30ba"
+#define UNITEXT_KATAKANA_LETTER_ZU  U"\u30ba"
 #define UNICODE_KATAKANA_LETTER_SE  0x30bb
-#define UNITEXT_KATAKANA_LETTER_SE  L"\u30bb"
+#define UNITEXT_KATAKANA_LETTER_SE  U"\u30bb"
 #define UNICODE_KATAKANA_LETTER_ZE  0x30bc
-#define UNITEXT_KATAKANA_LETTER_ZE  L"\u30bc"
+#define UNITEXT_KATAKANA_LETTER_ZE  U"\u30bc"
 #define UNICODE_KATAKANA_LETTER_SO  0x30bd
-#define UNITEXT_KATAKANA_LETTER_SO  L"\u30bd"
+#define UNITEXT_KATAKANA_LETTER_SO  U"\u30bd"
 #define UNICODE_KATAKANA_LETTER_ZO  0x30be
-#define UNITEXT_KATAKANA_LETTER_ZO  L"\u30be"
+#define UNITEXT_KATAKANA_LETTER_ZO  U"\u30be"
 #define UNICODE_KATAKANA_LETTER_TA  0x30bf
-#define UNITEXT_KATAKANA_LETTER_TA  L"\u30bf"
+#define UNITEXT_KATAKANA_LETTER_TA  U"\u30bf"
 #define UNICODE_KATAKANA_LETTER_DA  0x30c0
-#define UNITEXT_KATAKANA_LETTER_DA  L"\u30c0"
+#define UNITEXT_KATAKANA_LETTER_DA  U"\u30c0"
 #define UNICODE_KATAKANA_LETTER_TI  0x30c1
-#define UNITEXT_KATAKANA_LETTER_TI  L"\u30c1"
+#define UNITEXT_KATAKANA_LETTER_TI  U"\u30c1"
 #define UNICODE_KATAKANA_LETTER_DI  0x30c2
-#define UNITEXT_KATAKANA_LETTER_DI  L"\u30c2"
+#define UNITEXT_KATAKANA_LETTER_DI  U"\u30c2"
 #define UNICODE_KATAKANA_LETTER_SMALL_TU  0x30c3
-#define UNITEXT_KATAKANA_LETTER_SMALL_TU  L"\u30c3"
+#define UNITEXT_KATAKANA_LETTER_SMALL_TU  U"\u30c3"
 #define UNICODE_KATAKANA_LETTER_TU  0x30c4
-#define UNITEXT_KATAKANA_LETTER_TU  L"\u30c4"
+#define UNITEXT_KATAKANA_LETTER_TU  U"\u30c4"
 #define UNICODE_KATAKANA_LETTER_DU  0x30c5
-#define UNITEXT_KATAKANA_LETTER_DU  L"\u30c5"
+#define UNITEXT_KATAKANA_LETTER_DU  U"\u30c5"
 #define UNICODE_KATAKANA_LETTER_TE  0x30c6
-#define UNITEXT_KATAKANA_LETTER_TE  L"\u30c6"
+#define UNITEXT_KATAKANA_LETTER_TE  U"\u30c6"
 #define UNICODE_KATAKANA_LETTER_DE  0x30c7
-#define UNITEXT_KATAKANA_LETTER_DE  L"\u30c7"
+#define UNITEXT_KATAKANA_LETTER_DE  U"\u30c7"
 #define UNICODE_KATAKANA_LETTER_TO  0x30c8
-#define UNITEXT_KATAKANA_LETTER_TO  L"\u30c8"
+#define UNITEXT_KATAKANA_LETTER_TO  U"\u30c8"
 #define UNICODE_KATAKANA_LETTER_DO  0x30c9
-#define UNITEXT_KATAKANA_LETTER_DO  L"\u30c9"
+#define UNITEXT_KATAKANA_LETTER_DO  U"\u30c9"
 #define UNICODE_KATAKANA_LETTER_NA  0x30ca
-#define UNITEXT_KATAKANA_LETTER_NA  L"\u30ca"
+#define UNITEXT_KATAKANA_LETTER_NA  U"\u30ca"
 #define UNICODE_KATAKANA_LETTER_NI  0x30cb
-#define UNITEXT_KATAKANA_LETTER_NI  L"\u30cb"
+#define UNITEXT_KATAKANA_LETTER_NI  U"\u30cb"
 #define UNICODE_KATAKANA_LETTER_NU  0x30cc
-#define UNITEXT_KATAKANA_LETTER_NU  L"\u30cc"
+#define UNITEXT_KATAKANA_LETTER_NU  U"\u30cc"
 #define UNICODE_KATAKANA_LETTER_NE  0x30cd
-#define UNITEXT_KATAKANA_LETTER_NE  L"\u30cd"
+#define UNITEXT_KATAKANA_LETTER_NE  U"\u30cd"
 #define UNICODE_KATAKANA_LETTER_NO  0x30ce
-#define UNITEXT_KATAKANA_LETTER_NO  L"\u30ce"
+#define UNITEXT_KATAKANA_LETTER_NO  U"\u30ce"
 #define UNICODE_KATAKANA_LETTER_HA  0x30cf
-#define UNITEXT_KATAKANA_LETTER_HA  L"\u30cf"
+#define UNITEXT_KATAKANA_LETTER_HA  U"\u30cf"
 #define UNICODE_KATAKANA_LETTER_BA  0x30d0
-#define UNITEXT_KATAKANA_LETTER_BA  L"\u30d0"
+#define UNITEXT_KATAKANA_LETTER_BA  U"\u30d0"
 #define UNICODE_KATAKANA_LETTER_PA  0x30d1
-#define UNITEXT_KATAKANA_LETTER_PA  L"\u30d1"
+#define UNITEXT_KATAKANA_LETTER_PA  U"\u30d1"
 #define UNICODE_KATAKANA_LETTER_HI  0x30d2
-#define UNITEXT_KATAKANA_LETTER_HI  L"\u30d2"
+#define UNITEXT_KATAKANA_LETTER_HI  U"\u30d2"
 #define UNICODE_KATAKANA_LETTER_BI  0x30d3
-#define UNITEXT_KATAKANA_LETTER_BI  L"\u30d3"
+#define UNITEXT_KATAKANA_LETTER_BI  U"\u30d3"
 #define UNICODE_KATAKANA_LETTER_PI  0x30d4
-#define UNITEXT_KATAKANA_LETTER_PI  L"\u30d4"
+#define UNITEXT_KATAKANA_LETTER_PI  U"\u30d4"
 #define UNICODE_KATAKANA_LETTER_HU  0x30d5
-#define UNITEXT_KATAKANA_LETTER_HU  L"\u30d5"
+#define UNITEXT_KATAKANA_LETTER_HU  U"\u30d5"
 #define UNICODE_KATAKANA_LETTER_BU  0x30d6
-#define UNITEXT_KATAKANA_LETTER_BU  L"\u30d6"
+#define UNITEXT_KATAKANA_LETTER_BU  U"\u30d6"
 #define UNICODE_KATAKANA_LETTER_PU  0x30d7
-#define UNITEXT_KATAKANA_LETTER_PU  L"\u30d7"
+#define UNITEXT_KATAKANA_LETTER_PU  U"\u30d7"
 #define UNICODE_KATAKANA_LETTER_HE  0x30d8
-#define UNITEXT_KATAKANA_LETTER_HE  L"\u30d8"
+#define UNITEXT_KATAKANA_LETTER_HE  U"\u30d8"
 #define UNICODE_KATAKANA_LETTER_BE  0x30d9
-#define UNITEXT_KATAKANA_LETTER_BE  L"\u30d9"
+#define UNITEXT_KATAKANA_LETTER_BE  U"\u30d9"
 #define UNICODE_KATAKANA_LETTER_PE  0x30da
-#define UNITEXT_KATAKANA_LETTER_PE  L"\u30da"
+#define UNITEXT_KATAKANA_LETTER_PE  U"\u30da"
 #define UNICODE_KATAKANA_LETTER_HO  0x30db
-#define UNITEXT_KATAKANA_LETTER_HO  L"\u30db"
+#define UNITEXT_KATAKANA_LETTER_HO  U"\u30db"
 #define UNICODE_KATAKANA_LETTER_BO  0x30dc
-#define UNITEXT_KATAKANA_LETTER_BO  L"\u30dc"
+#define UNITEXT_KATAKANA_LETTER_BO  U"\u30dc"
 #define UNICODE_KATAKANA_LETTER_PO  0x30dd
-#define UNITEXT_KATAKANA_LETTER_PO  L"\u30dd"
+#define UNITEXT_KATAKANA_LETTER_PO  U"\u30dd"
 #define UNICODE_KATAKANA_LETTER_MA  0x30de
-#define UNITEXT_KATAKANA_LETTER_MA  L"\u30de"
+#define UNITEXT_KATAKANA_LETTER_MA  U"\u30de"
 #define UNICODE_KATAKANA_LETTER_MI  0x30df
-#define UNITEXT_KATAKANA_LETTER_MI  L"\u30df"
+#define UNITEXT_KATAKANA_LETTER_MI  U"\u30df"
 #define UNICODE_KATAKANA_LETTER_MU  0x30e0
-#define UNITEXT_KATAKANA_LETTER_MU  L"\u30e0"
+#define UNITEXT_KATAKANA_LETTER_MU  U"\u30e0"
 #define UNICODE_KATAKANA_LETTER_ME  0x30e1
-#define UNITEXT_KATAKANA_LETTER_ME  L"\u30e1"
+#define UNITEXT_KATAKANA_LETTER_ME  U"\u30e1"
 #define UNICODE_KATAKANA_LETTER_MO  0x30e2
-#define UNITEXT_KATAKANA_LETTER_MO  L"\u30e2"
+#define UNITEXT_KATAKANA_LETTER_MO  U"\u30e2"
 #define UNICODE_KATAKANA_LETTER_SMALL_YA  0x30e3
-#define UNITEXT_KATAKANA_LETTER_SMALL_YA  L"\u30e3"
+#define UNITEXT_KATAKANA_LETTER_SMALL_YA  U"\u30e3"
 #define UNICODE_KATAKANA_LETTER_YA  0x30e4
-#define UNITEXT_KATAKANA_LETTER_YA  L"\u30e4"
+#define UNITEXT_KATAKANA_LETTER_YA  U"\u30e4"
 #define UNICODE_KATAKANA_LETTER_SMALL_YU  0x30e5
-#define UNITEXT_KATAKANA_LETTER_SMALL_YU  L"\u30e5"
+#define UNITEXT_KATAKANA_LETTER_SMALL_YU  U"\u30e5"
 #define UNICODE_KATAKANA_LETTER_YU  0x30e6
-#define UNITEXT_KATAKANA_LETTER_YU  L"\u30e6"
+#define UNITEXT_KATAKANA_LETTER_YU  U"\u30e6"
 #define UNICODE_KATAKANA_LETTER_SMALL_YO  0x30e7
-#define UNITEXT_KATAKANA_LETTER_SMALL_YO  L"\u30e7"
+#define UNITEXT_KATAKANA_LETTER_SMALL_YO  U"\u30e7"
 #define UNICODE_KATAKANA_LETTER_YO  0x30e8
-#define UNITEXT_KATAKANA_LETTER_YO  L"\u30e8"
+#define UNITEXT_KATAKANA_LETTER_YO  U"\u30e8"
 #define UNICODE_KATAKANA_LETTER_RA  0x30e9
-#define UNITEXT_KATAKANA_LETTER_RA  L"\u30e9"
+#define UNITEXT_KATAKANA_LETTER_RA  U"\u30e9"
 #define UNICODE_KATAKANA_LETTER_RI  0x30ea
-#define UNITEXT_KATAKANA_LETTER_RI  L"\u30ea"
+#define UNITEXT_KATAKANA_LETTER_RI  U"\u30ea"
 #define UNICODE_KATAKANA_LETTER_RU  0x30eb
-#define UNITEXT_KATAKANA_LETTER_RU  L"\u30eb"
+#define UNITEXT_KATAKANA_LETTER_RU  U"\u30eb"
 #define UNICODE_KATAKANA_LETTER_RE  0x30ec
-#define UNITEXT_KATAKANA_LETTER_RE  L"\u30ec"
+#define UNITEXT_KATAKANA_LETTER_RE  U"\u30ec"
 #define UNICODE_KATAKANA_LETTER_RO  0x30ed
-#define UNITEXT_KATAKANA_LETTER_RO  L"\u30ed"
+#define UNITEXT_KATAKANA_LETTER_RO  U"\u30ed"
 #define UNICODE_KATAKANA_LETTER_SMALL_WA  0x30ee
-#define UNITEXT_KATAKANA_LETTER_SMALL_WA  L"\u30ee"
+#define UNITEXT_KATAKANA_LETTER_SMALL_WA  U"\u30ee"
 #define UNICODE_KATAKANA_LETTER_WA  0x30ef
-#define UNITEXT_KATAKANA_LETTER_WA  L"\u30ef"
+#define UNITEXT_KATAKANA_LETTER_WA  U"\u30ef"
 #define UNICODE_KATAKANA_LETTER_WI  0x30f0
-#define UNITEXT_KATAKANA_LETTER_WI  L"\u30f0"
+#define UNITEXT_KATAKANA_LETTER_WI  U"\u30f0"
 #define UNICODE_KATAKANA_LETTER_WE  0x30f1
-#define UNITEXT_KATAKANA_LETTER_WE  L"\u30f1"
+#define UNITEXT_KATAKANA_LETTER_WE  U"\u30f1"
 #define UNICODE_KATAKANA_LETTER_WO  0x30f2
-#define UNITEXT_KATAKANA_LETTER_WO  L"\u30f2"
+#define UNITEXT_KATAKANA_LETTER_WO  U"\u30f2"
 #define UNICODE_KATAKANA_LETTER_N  0x30f3
-#define UNITEXT_KATAKANA_LETTER_N  L"\u30f3"
+#define UNITEXT_KATAKANA_LETTER_N  U"\u30f3"
 #define UNICODE_KATAKANA_LETTER_VU  0x30f4
-#define UNITEXT_KATAKANA_LETTER_VU  L"\u30f4"
+#define UNITEXT_KATAKANA_LETTER_VU  U"\u30f4"
 #define UNICODE_KATAKANA_LETTER_SMALL_KA  0x30f5
-#define UNITEXT_KATAKANA_LETTER_SMALL_KA  L"\u30f5"
+#define UNITEXT_KATAKANA_LETTER_SMALL_KA  U"\u30f5"
 #define UNICODE_KATAKANA_LETTER_SMALL_KE  0x30f6
-#define UNITEXT_KATAKANA_LETTER_SMALL_KE  L"\u30f6"
+#define UNITEXT_KATAKANA_LETTER_SMALL_KE  U"\u30f6"
 #define UNICODE_KATAKANA_LETTER_VA  0x30f7
-#define UNITEXT_KATAKANA_LETTER_VA  L"\u30f7"
+#define UNITEXT_KATAKANA_LETTER_VA  U"\u30f7"
 #define UNICODE_KATAKANA_LETTER_VI  0x30f8
-#define UNITEXT_KATAKANA_LETTER_VI  L"\u30f8"
+#define UNITEXT_KATAKANA_LETTER_VI  U"\u30f8"
 #define UNICODE_KATAKANA_LETTER_VE  0x30f9
-#define UNITEXT_KATAKANA_LETTER_VE  L"\u30f9"
+#define UNITEXT_KATAKANA_LETTER_VE  U"\u30f9"
 #define UNICODE_KATAKANA_LETTER_VO  0x30fa
-#define UNITEXT_KATAKANA_LETTER_VO  L"\u30fa"
+#define UNITEXT_KATAKANA_LETTER_VO  U"\u30fa"
 #define UNICODE_KATAKANA_MIDDLE_DOT  0x30fb
-#define UNITEXT_KATAKANA_MIDDLE_DOT  L"\u30fb"
+#define UNITEXT_KATAKANA_MIDDLE_DOT  U"\u30fb"
 #define UNICODE_KATAKANA_HIRAGANA_PROLONGED_SOUND_MARK  0x30fc
-#define UNITEXT_KATAKANA_HIRAGANA_PROLONGED_SOUND_MARK  L"\u30fc"
+#define UNITEXT_KATAKANA_HIRAGANA_PROLONGED_SOUND_MARK  U"\u30fc"
 #define UNICODE_KATAKANA_ITERATION_MARK  0x30fd
-#define UNITEXT_KATAKANA_ITERATION_MARK  L"\u30fd"
+#define UNITEXT_KATAKANA_ITERATION_MARK  U"\u30fd"
 #define UNICODE_KATAKANA_VOICED_ITERATION_MARK  0x30fe
-#define UNITEXT_KATAKANA_VOICED_ITERATION_MARK  L"\u30fe"
+#define UNITEXT_KATAKANA_VOICED_ITERATION_MARK  U"\u30fe"
 #define UNICODE_KATAKANA_DIGRAPH_KOTO  0x30ff
-#define UNITEXT_KATAKANA_DIGRAPH_KOTO  L"\u30ff"
+#define UNITEXT_KATAKANA_DIGRAPH_KOTO  U"\u30ff"
 #define UNICODE_BOPOMOFO_LETTER_B  0x3105
-#define UNITEXT_BOPOMOFO_LETTER_B  L"\u3105"
+#define UNITEXT_BOPOMOFO_LETTER_B  U"\u3105"
 #define UNICODE_BOPOMOFO_LETTER_P  0x3106
-#define UNITEXT_BOPOMOFO_LETTER_P  L"\u3106"
+#define UNITEXT_BOPOMOFO_LETTER_P  U"\u3106"
 #define UNICODE_BOPOMOFO_LETTER_M  0x3107
-#define UNITEXT_BOPOMOFO_LETTER_M  L"\u3107"
+#define UNITEXT_BOPOMOFO_LETTER_M  U"\u3107"
 #define UNICODE_BOPOMOFO_LETTER_F  0x3108
-#define UNITEXT_BOPOMOFO_LETTER_F  L"\u3108"
+#define UNITEXT_BOPOMOFO_LETTER_F  U"\u3108"
 #define UNICODE_BOPOMOFO_LETTER_D  0x3109
-#define UNITEXT_BOPOMOFO_LETTER_D  L"\u3109"
+#define UNITEXT_BOPOMOFO_LETTER_D  U"\u3109"
 #define UNICODE_BOPOMOFO_LETTER_T  0x310a
-#define UNITEXT_BOPOMOFO_LETTER_T  L"\u310a"
+#define UNITEXT_BOPOMOFO_LETTER_T  U"\u310a"
 #define UNICODE_BOPOMOFO_LETTER_N  0x310b
-#define UNITEXT_BOPOMOFO_LETTER_N  L"\u310b"
+#define UNITEXT_BOPOMOFO_LETTER_N  U"\u310b"
 #define UNICODE_BOPOMOFO_LETTER_L  0x310c
-#define UNITEXT_BOPOMOFO_LETTER_L  L"\u310c"
+#define UNITEXT_BOPOMOFO_LETTER_L  U"\u310c"
 #define UNICODE_BOPOMOFO_LETTER_G  0x310d
-#define UNITEXT_BOPOMOFO_LETTER_G  L"\u310d"
+#define UNITEXT_BOPOMOFO_LETTER_G  U"\u310d"
 #define UNICODE_BOPOMOFO_LETTER_K  0x310e
-#define UNITEXT_BOPOMOFO_LETTER_K  L"\u310e"
+#define UNITEXT_BOPOMOFO_LETTER_K  U"\u310e"
 #define UNICODE_BOPOMOFO_LETTER_H  0x310f
-#define UNITEXT_BOPOMOFO_LETTER_H  L"\u310f"
+#define UNITEXT_BOPOMOFO_LETTER_H  U"\u310f"
 #define UNICODE_BOPOMOFO_LETTER_J  0x3110
-#define UNITEXT_BOPOMOFO_LETTER_J  L"\u3110"
+#define UNITEXT_BOPOMOFO_LETTER_J  U"\u3110"
 #define UNICODE_BOPOMOFO_LETTER_Q  0x3111
-#define UNITEXT_BOPOMOFO_LETTER_Q  L"\u3111"
+#define UNITEXT_BOPOMOFO_LETTER_Q  U"\u3111"
 #define UNICODE_BOPOMOFO_LETTER_X  0x3112
-#define UNITEXT_BOPOMOFO_LETTER_X  L"\u3112"
+#define UNITEXT_BOPOMOFO_LETTER_X  U"\u3112"
 #define UNICODE_BOPOMOFO_LETTER_ZH  0x3113
-#define UNITEXT_BOPOMOFO_LETTER_ZH  L"\u3113"
+#define UNITEXT_BOPOMOFO_LETTER_ZH  U"\u3113"
 #define UNICODE_BOPOMOFO_LETTER_CH  0x3114
-#define UNITEXT_BOPOMOFO_LETTER_CH  L"\u3114"
+#define UNITEXT_BOPOMOFO_LETTER_CH  U"\u3114"
 #define UNICODE_BOPOMOFO_LETTER_SH  0x3115
-#define UNITEXT_BOPOMOFO_LETTER_SH  L"\u3115"
+#define UNITEXT_BOPOMOFO_LETTER_SH  U"\u3115"
 #define UNICODE_BOPOMOFO_LETTER_R  0x3116
-#define UNITEXT_BOPOMOFO_LETTER_R  L"\u3116"
+#define UNITEXT_BOPOMOFO_LETTER_R  U"\u3116"
 #define UNICODE_BOPOMOFO_LETTER_Z  0x3117
-#define UNITEXT_BOPOMOFO_LETTER_Z  L"\u3117"
+#define UNITEXT_BOPOMOFO_LETTER_Z  U"\u3117"
 #define UNICODE_BOPOMOFO_LETTER_C  0x3118
-#define UNITEXT_BOPOMOFO_LETTER_C  L"\u3118"
+#define UNITEXT_BOPOMOFO_LETTER_C  U"\u3118"
 #define UNICODE_BOPOMOFO_LETTER_S  0x3119
-#define UNITEXT_BOPOMOFO_LETTER_S  L"\u3119"
+#define UNITEXT_BOPOMOFO_LETTER_S  U"\u3119"
 #define UNICODE_BOPOMOFO_LETTER_A  0x311a
-#define UNITEXT_BOPOMOFO_LETTER_A  L"\u311a"
+#define UNITEXT_BOPOMOFO_LETTER_A  U"\u311a"
 #define UNICODE_BOPOMOFO_LETTER_O  0x311b
-#define UNITEXT_BOPOMOFO_LETTER_O  L"\u311b"
+#define UNITEXT_BOPOMOFO_LETTER_O  U"\u311b"
 #define UNICODE_BOPOMOFO_LETTER_E  0x311c
-#define UNITEXT_BOPOMOFO_LETTER_E  L"\u311c"
+#define UNITEXT_BOPOMOFO_LETTER_E  U"\u311c"
 #define UNICODE_BOPOMOFO_LETTER_EH  0x311d
-#define UNITEXT_BOPOMOFO_LETTER_EH  L"\u311d"
+#define UNITEXT_BOPOMOFO_LETTER_EH  U"\u311d"
 #define UNICODE_BOPOMOFO_LETTER_AI  0x311e
-#define UNITEXT_BOPOMOFO_LETTER_AI  L"\u311e"
+#define UNITEXT_BOPOMOFO_LETTER_AI  U"\u311e"
 #define UNICODE_BOPOMOFO_LETTER_EI  0x311f
-#define UNITEXT_BOPOMOFO_LETTER_EI  L"\u311f"
+#define UNITEXT_BOPOMOFO_LETTER_EI  U"\u311f"
 #define UNICODE_BOPOMOFO_LETTER_AU  0x3120
-#define UNITEXT_BOPOMOFO_LETTER_AU  L"\u3120"
+#define UNITEXT_BOPOMOFO_LETTER_AU  U"\u3120"
 #define UNICODE_BOPOMOFO_LETTER_OU  0x3121
-#define UNITEXT_BOPOMOFO_LETTER_OU  L"\u3121"
+#define UNITEXT_BOPOMOFO_LETTER_OU  U"\u3121"
 #define UNICODE_BOPOMOFO_LETTER_AN  0x3122
-#define UNITEXT_BOPOMOFO_LETTER_AN  L"\u3122"
+#define UNITEXT_BOPOMOFO_LETTER_AN  U"\u3122"
 #define UNICODE_BOPOMOFO_LETTER_EN  0x3123
-#define UNITEXT_BOPOMOFO_LETTER_EN  L"\u3123"
+#define UNITEXT_BOPOMOFO_LETTER_EN  U"\u3123"
 #define UNICODE_BOPOMOFO_LETTER_ANG  0x3124
-#define UNITEXT_BOPOMOFO_LETTER_ANG  L"\u3124"
+#define UNITEXT_BOPOMOFO_LETTER_ANG  U"\u3124"
 #define UNICODE_BOPOMOFO_LETTER_ENG  0x3125
-#define UNITEXT_BOPOMOFO_LETTER_ENG  L"\u3125"
+#define UNITEXT_BOPOMOFO_LETTER_ENG  U"\u3125"
 #define UNICODE_BOPOMOFO_LETTER_ER  0x3126
-#define UNITEXT_BOPOMOFO_LETTER_ER  L"\u3126"
+#define UNITEXT_BOPOMOFO_LETTER_ER  U"\u3126"
 #define UNICODE_BOPOMOFO_LETTER_I  0x3127
-#define UNITEXT_BOPOMOFO_LETTER_I  L"\u3127"
+#define UNITEXT_BOPOMOFO_LETTER_I  U"\u3127"
 #define UNICODE_BOPOMOFO_LETTER_U  0x3128
-#define UNITEXT_BOPOMOFO_LETTER_U  L"\u3128"
+#define UNITEXT_BOPOMOFO_LETTER_U  U"\u3128"
 #define UNICODE_BOPOMOFO_LETTER_IU  0x3129
-#define UNITEXT_BOPOMOFO_LETTER_IU  L"\u3129"
+#define UNITEXT_BOPOMOFO_LETTER_IU  U"\u3129"
 #define UNICODE_BOPOMOFO_LETTER_V  0x312a
-#define UNITEXT_BOPOMOFO_LETTER_V  L"\u312a"
+#define UNITEXT_BOPOMOFO_LETTER_V  U"\u312a"
 #define UNICODE_BOPOMOFO_LETTER_NG  0x312b
-#define UNITEXT_BOPOMOFO_LETTER_NG  L"\u312b"
+#define UNITEXT_BOPOMOFO_LETTER_NG  U"\u312b"
 #define UNICODE_BOPOMOFO_LETTER_GN  0x312c
-#define UNITEXT_BOPOMOFO_LETTER_GN  L"\u312c"
+#define UNITEXT_BOPOMOFO_LETTER_GN  U"\u312c"
 #define UNICODE_HANGUL_LETTER_KIYEOK  0x3131
-#define UNITEXT_HANGUL_LETTER_KIYEOK  L"\u3131"
+#define UNITEXT_HANGUL_LETTER_KIYEOK  U"\u3131"
 #define UNICODE_HANGUL_LETTER_SSANGKIYEOK  0x3132
-#define UNITEXT_HANGUL_LETTER_SSANGKIYEOK  L"\u3132"
+#define UNITEXT_HANGUL_LETTER_SSANGKIYEOK  U"\u3132"
 #define UNICODE_HANGUL_LETTER_KIYEOK_SIOS  0x3133
-#define UNITEXT_HANGUL_LETTER_KIYEOK_SIOS  L"\u3133"
+#define UNITEXT_HANGUL_LETTER_KIYEOK_SIOS  U"\u3133"
 #define UNICODE_HANGUL_LETTER_NIEUN  0x3134
-#define UNITEXT_HANGUL_LETTER_NIEUN  L"\u3134"
+#define UNITEXT_HANGUL_LETTER_NIEUN  U"\u3134"
 #define UNICODE_HANGUL_LETTER_NIEUN_CIEUC  0x3135
-#define UNITEXT_HANGUL_LETTER_NIEUN_CIEUC  L"\u3135"
+#define UNITEXT_HANGUL_LETTER_NIEUN_CIEUC  U"\u3135"
 #define UNICODE_HANGUL_LETTER_NIEUN_HIEUH  0x3136
-#define UNITEXT_HANGUL_LETTER_NIEUN_HIEUH  L"\u3136"
+#define UNITEXT_HANGUL_LETTER_NIEUN_HIEUH  U"\u3136"
 #define UNICODE_HANGUL_LETTER_TIKEUT  0x3137
-#define UNITEXT_HANGUL_LETTER_TIKEUT  L"\u3137"
+#define UNITEXT_HANGUL_LETTER_TIKEUT  U"\u3137"
 #define UNICODE_HANGUL_LETTER_SSANGTIKEUT  0x3138
-#define UNITEXT_HANGUL_LETTER_SSANGTIKEUT  L"\u3138"
+#define UNITEXT_HANGUL_LETTER_SSANGTIKEUT  U"\u3138"
 #define UNICODE_HANGUL_LETTER_RIEUL  0x3139
-#define UNITEXT_HANGUL_LETTER_RIEUL  L"\u3139"
+#define UNITEXT_HANGUL_LETTER_RIEUL  U"\u3139"
 #define UNICODE_HANGUL_LETTER_RIEUL_KIYEOK  0x313a
-#define UNITEXT_HANGUL_LETTER_RIEUL_KIYEOK  L"\u313a"
+#define UNITEXT_HANGUL_LETTER_RIEUL_KIYEOK  U"\u313a"
 #define UNICODE_HANGUL_LETTER_RIEUL_MIEUM  0x313b
-#define UNITEXT_HANGUL_LETTER_RIEUL_MIEUM  L"\u313b"
+#define UNITEXT_HANGUL_LETTER_RIEUL_MIEUM  U"\u313b"
 #define UNICODE_HANGUL_LETTER_RIEUL_PIEUP  0x313c
-#define UNITEXT_HANGUL_LETTER_RIEUL_PIEUP  L"\u313c"
+#define UNITEXT_HANGUL_LETTER_RIEUL_PIEUP  U"\u313c"
 #define UNICODE_HANGUL_LETTER_RIEUL_SIOS  0x313d
-#define UNITEXT_HANGUL_LETTER_RIEUL_SIOS  L"\u313d"
+#define UNITEXT_HANGUL_LETTER_RIEUL_SIOS  U"\u313d"
 #define UNICODE_HANGUL_LETTER_RIEUL_THIEUTH  0x313e
-#define UNITEXT_HANGUL_LETTER_RIEUL_THIEUTH  L"\u313e"
+#define UNITEXT_HANGUL_LETTER_RIEUL_THIEUTH  U"\u313e"
 #define UNICODE_HANGUL_LETTER_RIEUL_PHIEUPH  0x313f
-#define UNITEXT_HANGUL_LETTER_RIEUL_PHIEUPH  L"\u313f"
+#define UNITEXT_HANGUL_LETTER_RIEUL_PHIEUPH  U"\u313f"
 #define UNICODE_HANGUL_LETTER_RIEUL_HIEUH  0x3140
-#define UNITEXT_HANGUL_LETTER_RIEUL_HIEUH  L"\u3140"
+#define UNITEXT_HANGUL_LETTER_RIEUL_HIEUH  U"\u3140"
 #define UNICODE_HANGUL_LETTER_MIEUM  0x3141
-#define UNITEXT_HANGUL_LETTER_MIEUM  L"\u3141"
+#define UNITEXT_HANGUL_LETTER_MIEUM  U"\u3141"
 #define UNICODE_HANGUL_LETTER_PIEUP  0x3142
-#define UNITEXT_HANGUL_LETTER_PIEUP  L"\u3142"
+#define UNITEXT_HANGUL_LETTER_PIEUP  U"\u3142"
 #define UNICODE_HANGUL_LETTER_SSANGPIEUP  0x3143
-#define UNITEXT_HANGUL_LETTER_SSANGPIEUP  L"\u3143"
+#define UNITEXT_HANGUL_LETTER_SSANGPIEUP  U"\u3143"
 #define UNICODE_HANGUL_LETTER_PIEUP_SIOS  0x3144
-#define UNITEXT_HANGUL_LETTER_PIEUP_SIOS  L"\u3144"
+#define UNITEXT_HANGUL_LETTER_PIEUP_SIOS  U"\u3144"
 #define UNICODE_HANGUL_LETTER_SIOS  0x3145
-#define UNITEXT_HANGUL_LETTER_SIOS  L"\u3145"
+#define UNITEXT_HANGUL_LETTER_SIOS  U"\u3145"
 #define UNICODE_HANGUL_LETTER_SSANGSIOS  0x3146
-#define UNITEXT_HANGUL_LETTER_SSANGSIOS  L"\u3146"
+#define UNITEXT_HANGUL_LETTER_SSANGSIOS  U"\u3146"
 #define UNICODE_HANGUL_LETTER_IEUNG  0x3147
-#define UNITEXT_HANGUL_LETTER_IEUNG  L"\u3147"
+#define UNITEXT_HANGUL_LETTER_IEUNG  U"\u3147"
 #define UNICODE_HANGUL_LETTER_CIEUC  0x3148
-#define UNITEXT_HANGUL_LETTER_CIEUC  L"\u3148"
+#define UNITEXT_HANGUL_LETTER_CIEUC  U"\u3148"
 #define UNICODE_HANGUL_LETTER_SSANGCIEUC  0x3149
-#define UNITEXT_HANGUL_LETTER_SSANGCIEUC  L"\u3149"
+#define UNITEXT_HANGUL_LETTER_SSANGCIEUC  U"\u3149"
 #define UNICODE_HANGUL_LETTER_CHIEUCH  0x314a
-#define UNITEXT_HANGUL_LETTER_CHIEUCH  L"\u314a"
+#define UNITEXT_HANGUL_LETTER_CHIEUCH  U"\u314a"
 #define UNICODE_HANGUL_LETTER_KHIEUKH  0x314b
-#define UNITEXT_HANGUL_LETTER_KHIEUKH  L"\u314b"
+#define UNITEXT_HANGUL_LETTER_KHIEUKH  U"\u314b"
 #define UNICODE_HANGUL_LETTER_THIEUTH  0x314c
-#define UNITEXT_HANGUL_LETTER_THIEUTH  L"\u314c"
+#define UNITEXT_HANGUL_LETTER_THIEUTH  U"\u314c"
 #define UNICODE_HANGUL_LETTER_PHIEUPH  0x314d
-#define UNITEXT_HANGUL_LETTER_PHIEUPH  L"\u314d"
+#define UNITEXT_HANGUL_LETTER_PHIEUPH  U"\u314d"
 #define UNICODE_HANGUL_LETTER_HIEUH  0x314e
-#define UNITEXT_HANGUL_LETTER_HIEUH  L"\u314e"
+#define UNITEXT_HANGUL_LETTER_HIEUH  U"\u314e"
 #define UNICODE_HANGUL_LETTER_A  0x314f
-#define UNITEXT_HANGUL_LETTER_A  L"\u314f"
+#define UNITEXT_HANGUL_LETTER_A  U"\u314f"
 #define UNICODE_HANGUL_LETTER_AE  0x3150
-#define UNITEXT_HANGUL_LETTER_AE  L"\u3150"
+#define UNITEXT_HANGUL_LETTER_AE  U"\u3150"
 #define UNICODE_HANGUL_LETTER_YA  0x3151
-#define UNITEXT_HANGUL_LETTER_YA  L"\u3151"
+#define UNITEXT_HANGUL_LETTER_YA  U"\u3151"
 #define UNICODE_HANGUL_LETTER_YAE  0x3152
-#define UNITEXT_HANGUL_LETTER_YAE  L"\u3152"
+#define UNITEXT_HANGUL_LETTER_YAE  U"\u3152"
 #define UNICODE_HANGUL_LETTER_EO  0x3153
-#define UNITEXT_HANGUL_LETTER_EO  L"\u3153"
+#define UNITEXT_HANGUL_LETTER_EO  U"\u3153"
 #define UNICODE_HANGUL_LETTER_E  0x3154
-#define UNITEXT_HANGUL_LETTER_E  L"\u3154"
+#define UNITEXT_HANGUL_LETTER_E  U"\u3154"
 #define UNICODE_HANGUL_LETTER_YEO  0x3155
-#define UNITEXT_HANGUL_LETTER_YEO  L"\u3155"
+#define UNITEXT_HANGUL_LETTER_YEO  U"\u3155"
 #define UNICODE_HANGUL_LETTER_YE  0x3156
-#define UNITEXT_HANGUL_LETTER_YE  L"\u3156"
+#define UNITEXT_HANGUL_LETTER_YE  U"\u3156"
 #define UNICODE_HANGUL_LETTER_O  0x3157
-#define UNITEXT_HANGUL_LETTER_O  L"\u3157"
+#define UNITEXT_HANGUL_LETTER_O  U"\u3157"
 #define UNICODE_HANGUL_LETTER_WA  0x3158
-#define UNITEXT_HANGUL_LETTER_WA  L"\u3158"
+#define UNITEXT_HANGUL_LETTER_WA  U"\u3158"
 #define UNICODE_HANGUL_LETTER_WAE  0x3159
-#define UNITEXT_HANGUL_LETTER_WAE  L"\u3159"
+#define UNITEXT_HANGUL_LETTER_WAE  U"\u3159"
 #define UNICODE_HANGUL_LETTER_OE  0x315a
-#define UNITEXT_HANGUL_LETTER_OE  L"\u315a"
+#define UNITEXT_HANGUL_LETTER_OE  U"\u315a"
 #define UNICODE_HANGUL_LETTER_YO  0x315b
-#define UNITEXT_HANGUL_LETTER_YO  L"\u315b"
+#define UNITEXT_HANGUL_LETTER_YO  U"\u315b"
 #define UNICODE_HANGUL_LETTER_U  0x315c
-#define UNITEXT_HANGUL_LETTER_U  L"\u315c"
+#define UNITEXT_HANGUL_LETTER_U  U"\u315c"
 #define UNICODE_HANGUL_LETTER_WEO  0x315d
-#define UNITEXT_HANGUL_LETTER_WEO  L"\u315d"
+#define UNITEXT_HANGUL_LETTER_WEO  U"\u315d"
 #define UNICODE_HANGUL_LETTER_WE  0x315e
-#define UNITEXT_HANGUL_LETTER_WE  L"\u315e"
+#define UNITEXT_HANGUL_LETTER_WE  U"\u315e"
 #define UNICODE_HANGUL_LETTER_WI  0x315f
-#define UNITEXT_HANGUL_LETTER_WI  L"\u315f"
+#define UNITEXT_HANGUL_LETTER_WI  U"\u315f"
 #define UNICODE_HANGUL_LETTER_YU  0x3160
-#define UNITEXT_HANGUL_LETTER_YU  L"\u3160"
+#define UNITEXT_HANGUL_LETTER_YU  U"\u3160"
 #define UNICODE_HANGUL_LETTER_EU  0x3161
-#define UNITEXT_HANGUL_LETTER_EU  L"\u3161"
+#define UNITEXT_HANGUL_LETTER_EU  U"\u3161"
 #define UNICODE_HANGUL_LETTER_YI  0x3162
-#define UNITEXT_HANGUL_LETTER_YI  L"\u3162"
+#define UNITEXT_HANGUL_LETTER_YI  U"\u3162"
 #define UNICODE_HANGUL_LETTER_I  0x3163
-#define UNITEXT_HANGUL_LETTER_I  L"\u3163"
+#define UNITEXT_HANGUL_LETTER_I  U"\u3163"
 #define UNICODE_HANGUL_FILLER  0x3164
-#define UNITEXT_HANGUL_FILLER  L"\u3164"
+#define UNITEXT_HANGUL_FILLER  U"\u3164"
 #define UNICODE_HANGUL_LETTER_SSANGNIEUN  0x3165
-#define UNITEXT_HANGUL_LETTER_SSANGNIEUN  L"\u3165"
+#define UNITEXT_HANGUL_LETTER_SSANGNIEUN  U"\u3165"
 #define UNICODE_HANGUL_LETTER_NIEUN_TIKEUT  0x3166
-#define UNITEXT_HANGUL_LETTER_NIEUN_TIKEUT  L"\u3166"
+#define UNITEXT_HANGUL_LETTER_NIEUN_TIKEUT  U"\u3166"
 #define UNICODE_HANGUL_LETTER_NIEUN_SIOS  0x3167
-#define UNITEXT_HANGUL_LETTER_NIEUN_SIOS  L"\u3167"
+#define UNITEXT_HANGUL_LETTER_NIEUN_SIOS  U"\u3167"
 #define UNICODE_HANGUL_LETTER_NIEUN_PANSIOS  0x3168
-#define UNITEXT_HANGUL_LETTER_NIEUN_PANSIOS  L"\u3168"
+#define UNITEXT_HANGUL_LETTER_NIEUN_PANSIOS  U"\u3168"
 #define UNICODE_HANGUL_LETTER_RIEUL_KIYEOK_SIOS  0x3169
-#define UNITEXT_HANGUL_LETTER_RIEUL_KIYEOK_SIOS  L"\u3169"
+#define UNITEXT_HANGUL_LETTER_RIEUL_KIYEOK_SIOS  U"\u3169"
 #define UNICODE_HANGUL_LETTER_RIEUL_TIKEUT  0x316a
-#define UNITEXT_HANGUL_LETTER_RIEUL_TIKEUT  L"\u316a"
+#define UNITEXT_HANGUL_LETTER_RIEUL_TIKEUT  U"\u316a"
 #define UNICODE_HANGUL_LETTER_RIEUL_PIEUP_SIOS  0x316b
-#define UNITEXT_HANGUL_LETTER_RIEUL_PIEUP_SIOS  L"\u316b"
+#define UNITEXT_HANGUL_LETTER_RIEUL_PIEUP_SIOS  U"\u316b"
 #define UNICODE_HANGUL_LETTER_RIEUL_PANSIOS  0x316c
-#define UNITEXT_HANGUL_LETTER_RIEUL_PANSIOS  L"\u316c"
+#define UNITEXT_HANGUL_LETTER_RIEUL_PANSIOS  U"\u316c"
 #define UNICODE_HANGUL_LETTER_RIEUL_YEORINHIEUH  0x316d
-#define UNITEXT_HANGUL_LETTER_RIEUL_YEORINHIEUH  L"\u316d"
+#define UNITEXT_HANGUL_LETTER_RIEUL_YEORINHIEUH  U"\u316d"
 #define UNICODE_HANGUL_LETTER_MIEUM_PIEUP  0x316e
-#define UNITEXT_HANGUL_LETTER_MIEUM_PIEUP  L"\u316e"
+#define UNITEXT_HANGUL_LETTER_MIEUM_PIEUP  U"\u316e"
 #define UNICODE_HANGUL_LETTER_MIEUM_SIOS  0x316f
-#define UNITEXT_HANGUL_LETTER_MIEUM_SIOS  L"\u316f"
+#define UNITEXT_HANGUL_LETTER_MIEUM_SIOS  U"\u316f"
 #define UNICODE_HANGUL_LETTER_MIEUM_PANSIOS  0x3170
-#define UNITEXT_HANGUL_LETTER_MIEUM_PANSIOS  L"\u3170"
+#define UNITEXT_HANGUL_LETTER_MIEUM_PANSIOS  U"\u3170"
 #define UNICODE_HANGUL_LETTER_KAPYEOUNMIEUM  0x3171
-#define UNITEXT_HANGUL_LETTER_KAPYEOUNMIEUM  L"\u3171"
+#define UNITEXT_HANGUL_LETTER_KAPYEOUNMIEUM  U"\u3171"
 #define UNICODE_HANGUL_LETTER_PIEUP_KIYEOK  0x3172
-#define UNITEXT_HANGUL_LETTER_PIEUP_KIYEOK  L"\u3172"
+#define UNITEXT_HANGUL_LETTER_PIEUP_KIYEOK  U"\u3172"
 #define UNICODE_HANGUL_LETTER_PIEUP_TIKEUT  0x3173
-#define UNITEXT_HANGUL_LETTER_PIEUP_TIKEUT  L"\u3173"
+#define UNITEXT_HANGUL_LETTER_PIEUP_TIKEUT  U"\u3173"
 #define UNICODE_HANGUL_LETTER_PIEUP_SIOS_KIYEOK  0x3174
-#define UNITEXT_HANGUL_LETTER_PIEUP_SIOS_KIYEOK  L"\u3174"
+#define UNITEXT_HANGUL_LETTER_PIEUP_SIOS_KIYEOK  U"\u3174"
 #define UNICODE_HANGUL_LETTER_PIEUP_SIOS_TIKEUT  0x3175
-#define UNITEXT_HANGUL_LETTER_PIEUP_SIOS_TIKEUT  L"\u3175"
+#define UNITEXT_HANGUL_LETTER_PIEUP_SIOS_TIKEUT  U"\u3175"
 #define UNICODE_HANGUL_LETTER_PIEUP_CIEUC  0x3176
-#define UNITEXT_HANGUL_LETTER_PIEUP_CIEUC  L"\u3176"
+#define UNITEXT_HANGUL_LETTER_PIEUP_CIEUC  U"\u3176"
 #define UNICODE_HANGUL_LETTER_PIEUP_THIEUTH  0x3177
-#define UNITEXT_HANGUL_LETTER_PIEUP_THIEUTH  L"\u3177"
+#define UNITEXT_HANGUL_LETTER_PIEUP_THIEUTH  U"\u3177"
 #define UNICODE_HANGUL_LETTER_KAPYEOUNPIEUP  0x3178
-#define UNITEXT_HANGUL_LETTER_KAPYEOUNPIEUP  L"\u3178"
+#define UNITEXT_HANGUL_LETTER_KAPYEOUNPIEUP  U"\u3178"
 #define UNICODE_HANGUL_LETTER_KAPYEOUNSSANGPIEUP  0x3179
-#define UNITEXT_HANGUL_LETTER_KAPYEOUNSSANGPIEUP  L"\u3179"
+#define UNITEXT_HANGUL_LETTER_KAPYEOUNSSANGPIEUP  U"\u3179"
 #define UNICODE_HANGUL_LETTER_SIOS_KIYEOK  0x317a
-#define UNITEXT_HANGUL_LETTER_SIOS_KIYEOK  L"\u317a"
+#define UNITEXT_HANGUL_LETTER_SIOS_KIYEOK  U"\u317a"
 #define UNICODE_HANGUL_LETTER_SIOS_NIEUN  0x317b
-#define UNITEXT_HANGUL_LETTER_SIOS_NIEUN  L"\u317b"
+#define UNITEXT_HANGUL_LETTER_SIOS_NIEUN  U"\u317b"
 #define UNICODE_HANGUL_LETTER_SIOS_TIKEUT  0x317c
-#define UNITEXT_HANGUL_LETTER_SIOS_TIKEUT  L"\u317c"
+#define UNITEXT_HANGUL_LETTER_SIOS_TIKEUT  U"\u317c"
 #define UNICODE_HANGUL_LETTER_SIOS_PIEUP  0x317d
-#define UNITEXT_HANGUL_LETTER_SIOS_PIEUP  L"\u317d"
+#define UNITEXT_HANGUL_LETTER_SIOS_PIEUP  U"\u317d"
 #define UNICODE_HANGUL_LETTER_SIOS_CIEUC  0x317e
-#define UNITEXT_HANGUL_LETTER_SIOS_CIEUC  L"\u317e"
+#define UNITEXT_HANGUL_LETTER_SIOS_CIEUC  U"\u317e"
 #define UNICODE_HANGUL_LETTER_PANSIOS  0x317f
-#define UNITEXT_HANGUL_LETTER_PANSIOS  L"\u317f"
+#define UNITEXT_HANGUL_LETTER_PANSIOS  U"\u317f"
 #define UNICODE_HANGUL_LETTER_SSANGIEUNG  0x3180
-#define UNITEXT_HANGUL_LETTER_SSANGIEUNG  L"\u3180"
+#define UNITEXT_HANGUL_LETTER_SSANGIEUNG  U"\u3180"
 #define UNICODE_HANGUL_LETTER_YESIEUNG  0x3181
-#define UNITEXT_HANGUL_LETTER_YESIEUNG  L"\u3181"
+#define UNITEXT_HANGUL_LETTER_YESIEUNG  U"\u3181"
 #define UNICODE_HANGUL_LETTER_YESIEUNG_SIOS  0x3182
-#define UNITEXT_HANGUL_LETTER_YESIEUNG_SIOS  L"\u3182"
+#define UNITEXT_HANGUL_LETTER_YESIEUNG_SIOS  U"\u3182"
 #define UNICODE_HANGUL_LETTER_YESIEUNG_PANSIOS  0x3183
-#define UNITEXT_HANGUL_LETTER_YESIEUNG_PANSIOS  L"\u3183"
+#define UNITEXT_HANGUL_LETTER_YESIEUNG_PANSIOS  U"\u3183"
 #define UNICODE_HANGUL_LETTER_KAPYEOUNPHIEUPH  0x3184
-#define UNITEXT_HANGUL_LETTER_KAPYEOUNPHIEUPH  L"\u3184"
+#define UNITEXT_HANGUL_LETTER_KAPYEOUNPHIEUPH  U"\u3184"
 #define UNICODE_HANGUL_LETTER_SSANGHIEUH  0x3185
-#define UNITEXT_HANGUL_LETTER_SSANGHIEUH  L"\u3185"
+#define UNITEXT_HANGUL_LETTER_SSANGHIEUH  U"\u3185"
 #define UNICODE_HANGUL_LETTER_YEORINHIEUH  0x3186
-#define UNITEXT_HANGUL_LETTER_YEORINHIEUH  L"\u3186"
+#define UNITEXT_HANGUL_LETTER_YEORINHIEUH  U"\u3186"
 #define UNICODE_HANGUL_LETTER_YO_YA  0x3187
-#define UNITEXT_HANGUL_LETTER_YO_YA  L"\u3187"
+#define UNITEXT_HANGUL_LETTER_YO_YA  U"\u3187"
 #define UNICODE_HANGUL_LETTER_YO_YAE  0x3188
-#define UNITEXT_HANGUL_LETTER_YO_YAE  L"\u3188"
+#define UNITEXT_HANGUL_LETTER_YO_YAE  U"\u3188"
 #define UNICODE_HANGUL_LETTER_YO_I  0x3189
-#define UNITEXT_HANGUL_LETTER_YO_I  L"\u3189"
+#define UNITEXT_HANGUL_LETTER_YO_I  U"\u3189"
 #define UNICODE_HANGUL_LETTER_YU_YEO  0x318a
-#define UNITEXT_HANGUL_LETTER_YU_YEO  L"\u318a"
+#define UNITEXT_HANGUL_LETTER_YU_YEO  U"\u318a"
 #define UNICODE_HANGUL_LETTER_YU_YE  0x318b
-#define UNITEXT_HANGUL_LETTER_YU_YE  L"\u318b"
+#define UNITEXT_HANGUL_LETTER_YU_YE  U"\u318b"
 #define UNICODE_HANGUL_LETTER_YU_I  0x318c
-#define UNITEXT_HANGUL_LETTER_YU_I  L"\u318c"
+#define UNITEXT_HANGUL_LETTER_YU_I  U"\u318c"
 #define UNICODE_HANGUL_LETTER_ARAEA  0x318d
-#define UNITEXT_HANGUL_LETTER_ARAEA  L"\u318d"
+#define UNITEXT_HANGUL_LETTER_ARAEA  U"\u318d"
 #define UNICODE_HANGUL_LETTER_ARAEAE  0x318e
-#define UNITEXT_HANGUL_LETTER_ARAEAE  L"\u318e"
+#define UNITEXT_HANGUL_LETTER_ARAEAE  U"\u318e"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_LINKING_MARK  0x3190
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_LINKING_MARK  L"\u3190"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_LINKING_MARK  U"\u3190"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_REVERSE_MARK  0x3191
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_REVERSE_MARK  L"\u3191"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_REVERSE_MARK  U"\u3191"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_ONE_MARK  0x3192
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_ONE_MARK  L"\u3192"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_ONE_MARK  U"\u3192"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_TWO_MARK  0x3193
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_TWO_MARK  L"\u3193"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_TWO_MARK  U"\u3193"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_THREE_MARK  0x3194
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_THREE_MARK  L"\u3194"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_THREE_MARK  U"\u3194"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_FOUR_MARK  0x3195
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_FOUR_MARK  L"\u3195"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_FOUR_MARK  U"\u3195"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_TOP_MARK  0x3196
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_TOP_MARK  L"\u3196"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_TOP_MARK  U"\u3196"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_MIDDLE_MARK  0x3197
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_MIDDLE_MARK  L"\u3197"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_MIDDLE_MARK  U"\u3197"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_BOTTOM_MARK  0x3198
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_BOTTOM_MARK  L"\u3198"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_BOTTOM_MARK  U"\u3198"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_FIRST_MARK  0x3199
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_FIRST_MARK  L"\u3199"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_FIRST_MARK  U"\u3199"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_SECOND_MARK  0x319a
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_SECOND_MARK  L"\u319a"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_SECOND_MARK  U"\u319a"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_THIRD_MARK  0x319b
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_THIRD_MARK  L"\u319b"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_THIRD_MARK  U"\u319b"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_FOURTH_MARK  0x319c
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_FOURTH_MARK  L"\u319c"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_FOURTH_MARK  U"\u319c"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_HEAVEN_MARK  0x319d
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_HEAVEN_MARK  L"\u319d"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_HEAVEN_MARK  U"\u319d"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_EARTH_MARK  0x319e
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_EARTH_MARK  L"\u319e"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_EARTH_MARK  U"\u319e"
 #define UNICODE_IDEOGRAPHIC_ANNOTATION_MAN_MARK  0x319f
-#define UNITEXT_IDEOGRAPHIC_ANNOTATION_MAN_MARK  L"\u319f"
+#define UNITEXT_IDEOGRAPHIC_ANNOTATION_MAN_MARK  U"\u319f"
 #define UNICODE_BOPOMOFO_LETTER_BU  0x31a0
-#define UNITEXT_BOPOMOFO_LETTER_BU  L"\u31a0"
+#define UNITEXT_BOPOMOFO_LETTER_BU  U"\u31a0"
 #define UNICODE_BOPOMOFO_LETTER_ZI  0x31a1
-#define UNITEXT_BOPOMOFO_LETTER_ZI  L"\u31a1"
+#define UNITEXT_BOPOMOFO_LETTER_ZI  U"\u31a1"
 #define UNICODE_BOPOMOFO_LETTER_JI  0x31a2
-#define UNITEXT_BOPOMOFO_LETTER_JI  L"\u31a2"
+#define UNITEXT_BOPOMOFO_LETTER_JI  U"\u31a2"
 #define UNICODE_BOPOMOFO_LETTER_GU  0x31a3
-#define UNITEXT_BOPOMOFO_LETTER_GU  L"\u31a3"
+#define UNITEXT_BOPOMOFO_LETTER_GU  U"\u31a3"
 #define UNICODE_BOPOMOFO_LETTER_EE  0x31a4
-#define UNITEXT_BOPOMOFO_LETTER_EE  L"\u31a4"
+#define UNITEXT_BOPOMOFO_LETTER_EE  U"\u31a4"
 #define UNICODE_BOPOMOFO_LETTER_ENN  0x31a5
-#define UNITEXT_BOPOMOFO_LETTER_ENN  L"\u31a5"
+#define UNITEXT_BOPOMOFO_LETTER_ENN  U"\u31a5"
 #define UNICODE_BOPOMOFO_LETTER_OO  0x31a6
-#define UNITEXT_BOPOMOFO_LETTER_OO  L"\u31a6"
+#define UNITEXT_BOPOMOFO_LETTER_OO  U"\u31a6"
 #define UNICODE_BOPOMOFO_LETTER_ONN  0x31a7
-#define UNITEXT_BOPOMOFO_LETTER_ONN  L"\u31a7"
+#define UNITEXT_BOPOMOFO_LETTER_ONN  U"\u31a7"
 #define UNICODE_BOPOMOFO_LETTER_IR  0x31a8
-#define UNITEXT_BOPOMOFO_LETTER_IR  L"\u31a8"
+#define UNITEXT_BOPOMOFO_LETTER_IR  U"\u31a8"
 #define UNICODE_BOPOMOFO_LETTER_ANN  0x31a9
-#define UNITEXT_BOPOMOFO_LETTER_ANN  L"\u31a9"
+#define UNITEXT_BOPOMOFO_LETTER_ANN  U"\u31a9"
 #define UNICODE_BOPOMOFO_LETTER_INN  0x31aa
-#define UNITEXT_BOPOMOFO_LETTER_INN  L"\u31aa"
+#define UNITEXT_BOPOMOFO_LETTER_INN  U"\u31aa"
 #define UNICODE_BOPOMOFO_LETTER_UNN  0x31ab
-#define UNITEXT_BOPOMOFO_LETTER_UNN  L"\u31ab"
+#define UNITEXT_BOPOMOFO_LETTER_UNN  U"\u31ab"
 #define UNICODE_BOPOMOFO_LETTER_IM  0x31ac
-#define UNITEXT_BOPOMOFO_LETTER_IM  L"\u31ac"
+#define UNITEXT_BOPOMOFO_LETTER_IM  U"\u31ac"
 #define UNICODE_BOPOMOFO_LETTER_NGG  0x31ad
-#define UNITEXT_BOPOMOFO_LETTER_NGG  L"\u31ad"
+#define UNITEXT_BOPOMOFO_LETTER_NGG  U"\u31ad"
 #define UNICODE_BOPOMOFO_LETTER_AINN  0x31ae
-#define UNITEXT_BOPOMOFO_LETTER_AINN  L"\u31ae"
+#define UNITEXT_BOPOMOFO_LETTER_AINN  U"\u31ae"
 #define UNICODE_BOPOMOFO_LETTER_AUNN  0x31af
-#define UNITEXT_BOPOMOFO_LETTER_AUNN  L"\u31af"
+#define UNITEXT_BOPOMOFO_LETTER_AUNN  U"\u31af"
 #define UNICODE_BOPOMOFO_LETTER_AM  0x31b0
-#define UNITEXT_BOPOMOFO_LETTER_AM  L"\u31b0"
+#define UNITEXT_BOPOMOFO_LETTER_AM  U"\u31b0"
 #define UNICODE_BOPOMOFO_LETTER_OM  0x31b1
-#define UNITEXT_BOPOMOFO_LETTER_OM  L"\u31b1"
+#define UNITEXT_BOPOMOFO_LETTER_OM  U"\u31b1"
 #define UNICODE_BOPOMOFO_LETTER_ONG  0x31b2
-#define UNITEXT_BOPOMOFO_LETTER_ONG  L"\u31b2"
+#define UNITEXT_BOPOMOFO_LETTER_ONG  U"\u31b2"
 #define UNICODE_BOPOMOFO_LETTER_INNN  0x31b3
-#define UNITEXT_BOPOMOFO_LETTER_INNN  L"\u31b3"
+#define UNITEXT_BOPOMOFO_LETTER_INNN  U"\u31b3"
 #define UNICODE_BOPOMOFO_FINAL_LETTER_P  0x31b4
-#define UNITEXT_BOPOMOFO_FINAL_LETTER_P  L"\u31b4"
+#define UNITEXT_BOPOMOFO_FINAL_LETTER_P  U"\u31b4"
 #define UNICODE_BOPOMOFO_FINAL_LETTER_T  0x31b5
-#define UNITEXT_BOPOMOFO_FINAL_LETTER_T  L"\u31b5"
+#define UNITEXT_BOPOMOFO_FINAL_LETTER_T  U"\u31b5"
 #define UNICODE_BOPOMOFO_FINAL_LETTER_K  0x31b6
-#define UNITEXT_BOPOMOFO_FINAL_LETTER_K  L"\u31b6"
+#define UNITEXT_BOPOMOFO_FINAL_LETTER_K  U"\u31b6"
 #define UNICODE_BOPOMOFO_FINAL_LETTER_H  0x31b7
-#define UNITEXT_BOPOMOFO_FINAL_LETTER_H  L"\u31b7"
+#define UNITEXT_BOPOMOFO_FINAL_LETTER_H  U"\u31b7"
 #define UNICODE_CJK_STROKE_T  0x31c0
-#define UNITEXT_CJK_STROKE_T  L"\u31c0"
+#define UNITEXT_CJK_STROKE_T  U"\u31c0"
 #define UNICODE_CJK_STROKE_WG  0x31c1
-#define UNITEXT_CJK_STROKE_WG  L"\u31c1"
+#define UNITEXT_CJK_STROKE_WG  U"\u31c1"
 #define UNICODE_CJK_STROKE_XG  0x31c2
-#define UNITEXT_CJK_STROKE_XG  L"\u31c2"
+#define UNITEXT_CJK_STROKE_XG  U"\u31c2"
 #define UNICODE_CJK_STROKE_BXG  0x31c3
-#define UNITEXT_CJK_STROKE_BXG  L"\u31c3"
+#define UNITEXT_CJK_STROKE_BXG  U"\u31c3"
 #define UNICODE_CJK_STROKE_SW  0x31c4
-#define UNITEXT_CJK_STROKE_SW  L"\u31c4"
+#define UNITEXT_CJK_STROKE_SW  U"\u31c4"
 #define UNICODE_CJK_STROKE_HZZ  0x31c5
-#define UNITEXT_CJK_STROKE_HZZ  L"\u31c5"
+#define UNITEXT_CJK_STROKE_HZZ  U"\u31c5"
 #define UNICODE_CJK_STROKE_HZG  0x31c6
-#define UNITEXT_CJK_STROKE_HZG  L"\u31c6"
+#define UNITEXT_CJK_STROKE_HZG  U"\u31c6"
 #define UNICODE_CJK_STROKE_HP  0x31c7
-#define UNITEXT_CJK_STROKE_HP  L"\u31c7"
+#define UNITEXT_CJK_STROKE_HP  U"\u31c7"
 #define UNICODE_CJK_STROKE_HZWG  0x31c8
-#define UNITEXT_CJK_STROKE_HZWG  L"\u31c8"
+#define UNITEXT_CJK_STROKE_HZWG  U"\u31c8"
 #define UNICODE_CJK_STROKE_SZWG  0x31c9
-#define UNITEXT_CJK_STROKE_SZWG  L"\u31c9"
+#define UNITEXT_CJK_STROKE_SZWG  U"\u31c9"
 #define UNICODE_CJK_STROKE_HZT  0x31ca
-#define UNITEXT_CJK_STROKE_HZT  L"\u31ca"
+#define UNITEXT_CJK_STROKE_HZT  U"\u31ca"
 #define UNICODE_CJK_STROKE_HZZP  0x31cb
-#define UNITEXT_CJK_STROKE_HZZP  L"\u31cb"
+#define UNITEXT_CJK_STROKE_HZZP  U"\u31cb"
 #define UNICODE_CJK_STROKE_HPWG  0x31cc
-#define UNITEXT_CJK_STROKE_HPWG  L"\u31cc"
+#define UNITEXT_CJK_STROKE_HPWG  U"\u31cc"
 #define UNICODE_CJK_STROKE_HZW  0x31cd
-#define UNITEXT_CJK_STROKE_HZW  L"\u31cd"
+#define UNITEXT_CJK_STROKE_HZW  U"\u31cd"
 #define UNICODE_CJK_STROKE_HZZZ  0x31ce
-#define UNITEXT_CJK_STROKE_HZZZ  L"\u31ce"
+#define UNITEXT_CJK_STROKE_HZZZ  U"\u31ce"
 #define UNICODE_CJK_STROKE_N  0x31cf
-#define UNITEXT_CJK_STROKE_N  L"\u31cf"
+#define UNITEXT_CJK_STROKE_N  U"\u31cf"
 #define UNICODE_KATAKANA_LETTER_SMALL_KU  0x31f0
-#define UNITEXT_KATAKANA_LETTER_SMALL_KU  L"\u31f0"
+#define UNITEXT_KATAKANA_LETTER_SMALL_KU  U"\u31f0"
 #define UNICODE_KATAKANA_LETTER_SMALL_SI  0x31f1
-#define UNITEXT_KATAKANA_LETTER_SMALL_SI  L"\u31f1"
+#define UNITEXT_KATAKANA_LETTER_SMALL_SI  U"\u31f1"
 #define UNICODE_KATAKANA_LETTER_SMALL_SU  0x31f2
-#define UNITEXT_KATAKANA_LETTER_SMALL_SU  L"\u31f2"
+#define UNITEXT_KATAKANA_LETTER_SMALL_SU  U"\u31f2"
 #define UNICODE_KATAKANA_LETTER_SMALL_TO  0x31f3
-#define UNITEXT_KATAKANA_LETTER_SMALL_TO  L"\u31f3"
+#define UNITEXT_KATAKANA_LETTER_SMALL_TO  U"\u31f3"
 #define UNICODE_KATAKANA_LETTER_SMALL_NU  0x31f4
-#define UNITEXT_KATAKANA_LETTER_SMALL_NU  L"\u31f4"
+#define UNITEXT_KATAKANA_LETTER_SMALL_NU  U"\u31f4"
 #define UNICODE_KATAKANA_LETTER_SMALL_HA  0x31f5
-#define UNITEXT_KATAKANA_LETTER_SMALL_HA  L"\u31f5"
+#define UNITEXT_KATAKANA_LETTER_SMALL_HA  U"\u31f5"
 #define UNICODE_KATAKANA_LETTER_SMALL_HI  0x31f6
-#define UNITEXT_KATAKANA_LETTER_SMALL_HI  L"\u31f6"
+#define UNITEXT_KATAKANA_LETTER_SMALL_HI  U"\u31f6"
 #define UNICODE_KATAKANA_LETTER_SMALL_HU  0x31f7
-#define UNITEXT_KATAKANA_LETTER_SMALL_HU  L"\u31f7"
+#define UNITEXT_KATAKANA_LETTER_SMALL_HU  U"\u31f7"
 #define UNICODE_KATAKANA_LETTER_SMALL_HE  0x31f8
-#define UNITEXT_KATAKANA_LETTER_SMALL_HE  L"\u31f8"
+#define UNITEXT_KATAKANA_LETTER_SMALL_HE  U"\u31f8"
 #define UNICODE_KATAKANA_LETTER_SMALL_HO  0x31f9
-#define UNITEXT_KATAKANA_LETTER_SMALL_HO  L"\u31f9"
+#define UNITEXT_KATAKANA_LETTER_SMALL_HO  U"\u31f9"
 #define UNICODE_KATAKANA_LETTER_SMALL_MU  0x31fa
-#define UNITEXT_KATAKANA_LETTER_SMALL_MU  L"\u31fa"
+#define UNITEXT_KATAKANA_LETTER_SMALL_MU  U"\u31fa"
 #define UNICODE_KATAKANA_LETTER_SMALL_RA  0x31fb
-#define UNITEXT_KATAKANA_LETTER_SMALL_RA  L"\u31fb"
+#define UNITEXT_KATAKANA_LETTER_SMALL_RA  U"\u31fb"
 #define UNICODE_KATAKANA_LETTER_SMALL_RI  0x31fc
-#define UNITEXT_KATAKANA_LETTER_SMALL_RI  L"\u31fc"
+#define UNITEXT_KATAKANA_LETTER_SMALL_RI  U"\u31fc"
 #define UNICODE_KATAKANA_LETTER_SMALL_RU  0x31fd
-#define UNITEXT_KATAKANA_LETTER_SMALL_RU  L"\u31fd"
+#define UNITEXT_KATAKANA_LETTER_SMALL_RU  U"\u31fd"
 #define UNICODE_KATAKANA_LETTER_SMALL_RE  0x31fe
-#define UNITEXT_KATAKANA_LETTER_SMALL_RE  L"\u31fe"
+#define UNITEXT_KATAKANA_LETTER_SMALL_RE  U"\u31fe"
 #define UNICODE_KATAKANA_LETTER_SMALL_RO  0x31ff
-#define UNITEXT_KATAKANA_LETTER_SMALL_RO  L"\u31ff"
+#define UNITEXT_KATAKANA_LETTER_SMALL_RO  U"\u31ff"
 #define UNICODE_PARENTHESIZED_HANGUL_KIYEOK  0x3200
-#define UNITEXT_PARENTHESIZED_HANGUL_KIYEOK  L"\u3200"
+#define UNITEXT_PARENTHESIZED_HANGUL_KIYEOK  U"\u3200"
 #define UNICODE_PARENTHESIZED_HANGUL_NIEUN  0x3201
-#define UNITEXT_PARENTHESIZED_HANGUL_NIEUN  L"\u3201"
+#define UNITEXT_PARENTHESIZED_HANGUL_NIEUN  U"\u3201"
 #define UNICODE_PARENTHESIZED_HANGUL_TIKEUT  0x3202
-#define UNITEXT_PARENTHESIZED_HANGUL_TIKEUT  L"\u3202"
+#define UNITEXT_PARENTHESIZED_HANGUL_TIKEUT  U"\u3202"
 #define UNICODE_PARENTHESIZED_HANGUL_RIEUL  0x3203
-#define UNITEXT_PARENTHESIZED_HANGUL_RIEUL  L"\u3203"
+#define UNITEXT_PARENTHESIZED_HANGUL_RIEUL  U"\u3203"
 #define UNICODE_PARENTHESIZED_HANGUL_MIEUM  0x3204
-#define UNITEXT_PARENTHESIZED_HANGUL_MIEUM  L"\u3204"
+#define UNITEXT_PARENTHESIZED_HANGUL_MIEUM  U"\u3204"
 #define UNICODE_PARENTHESIZED_HANGUL_PIEUP  0x3205
-#define UNITEXT_PARENTHESIZED_HANGUL_PIEUP  L"\u3205"
+#define UNITEXT_PARENTHESIZED_HANGUL_PIEUP  U"\u3205"
 #define UNICODE_PARENTHESIZED_HANGUL_SIOS  0x3206
-#define UNITEXT_PARENTHESIZED_HANGUL_SIOS  L"\u3206"
+#define UNITEXT_PARENTHESIZED_HANGUL_SIOS  U"\u3206"
 #define UNICODE_PARENTHESIZED_HANGUL_IEUNG  0x3207
-#define UNITEXT_PARENTHESIZED_HANGUL_IEUNG  L"\u3207"
+#define UNITEXT_PARENTHESIZED_HANGUL_IEUNG  U"\u3207"
 #define UNICODE_PARENTHESIZED_HANGUL_CIEUC  0x3208
-#define UNITEXT_PARENTHESIZED_HANGUL_CIEUC  L"\u3208"
+#define UNITEXT_PARENTHESIZED_HANGUL_CIEUC  U"\u3208"
 #define UNICODE_PARENTHESIZED_HANGUL_CHIEUCH  0x3209
-#define UNITEXT_PARENTHESIZED_HANGUL_CHIEUCH  L"\u3209"
+#define UNITEXT_PARENTHESIZED_HANGUL_CHIEUCH  U"\u3209"
 #define UNICODE_PARENTHESIZED_HANGUL_KHIEUKH  0x320a
-#define UNITEXT_PARENTHESIZED_HANGUL_KHIEUKH  L"\u320a"
+#define UNITEXT_PARENTHESIZED_HANGUL_KHIEUKH  U"\u320a"
 #define UNICODE_PARENTHESIZED_HANGUL_THIEUTH  0x320b
-#define UNITEXT_PARENTHESIZED_HANGUL_THIEUTH  L"\u320b"
+#define UNITEXT_PARENTHESIZED_HANGUL_THIEUTH  U"\u320b"
 #define UNICODE_PARENTHESIZED_HANGUL_PHIEUPH  0x320c
-#define UNITEXT_PARENTHESIZED_HANGUL_PHIEUPH  L"\u320c"
+#define UNITEXT_PARENTHESIZED_HANGUL_PHIEUPH  U"\u320c"
 #define UNICODE_PARENTHESIZED_HANGUL_HIEUH  0x320d
-#define UNITEXT_PARENTHESIZED_HANGUL_HIEUH  L"\u320d"
+#define UNITEXT_PARENTHESIZED_HANGUL_HIEUH  U"\u320d"
 #define UNICODE_PARENTHESIZED_HANGUL_KIYEOK_A  0x320e
-#define UNITEXT_PARENTHESIZED_HANGUL_KIYEOK_A  L"\u320e"
+#define UNITEXT_PARENTHESIZED_HANGUL_KIYEOK_A  U"\u320e"
 #define UNICODE_PARENTHESIZED_HANGUL_NIEUN_A  0x320f
-#define UNITEXT_PARENTHESIZED_HANGUL_NIEUN_A  L"\u320f"
+#define UNITEXT_PARENTHESIZED_HANGUL_NIEUN_A  U"\u320f"
 #define UNICODE_PARENTHESIZED_HANGUL_TIKEUT_A  0x3210
-#define UNITEXT_PARENTHESIZED_HANGUL_TIKEUT_A  L"\u3210"
+#define UNITEXT_PARENTHESIZED_HANGUL_TIKEUT_A  U"\u3210"
 #define UNICODE_PARENTHESIZED_HANGUL_RIEUL_A  0x3211
-#define UNITEXT_PARENTHESIZED_HANGUL_RIEUL_A  L"\u3211"
+#define UNITEXT_PARENTHESIZED_HANGUL_RIEUL_A  U"\u3211"
 #define UNICODE_PARENTHESIZED_HANGUL_MIEUM_A  0x3212
-#define UNITEXT_PARENTHESIZED_HANGUL_MIEUM_A  L"\u3212"
+#define UNITEXT_PARENTHESIZED_HANGUL_MIEUM_A  U"\u3212"
 #define UNICODE_PARENTHESIZED_HANGUL_PIEUP_A  0x3213
-#define UNITEXT_PARENTHESIZED_HANGUL_PIEUP_A  L"\u3213"
+#define UNITEXT_PARENTHESIZED_HANGUL_PIEUP_A  U"\u3213"
 #define UNICODE_PARENTHESIZED_HANGUL_SIOS_A  0x3214
-#define UNITEXT_PARENTHESIZED_HANGUL_SIOS_A  L"\u3214"
+#define UNITEXT_PARENTHESIZED_HANGUL_SIOS_A  U"\u3214"
 #define UNICODE_PARENTHESIZED_HANGUL_IEUNG_A  0x3215
-#define UNITEXT_PARENTHESIZED_HANGUL_IEUNG_A  L"\u3215"
+#define UNITEXT_PARENTHESIZED_HANGUL_IEUNG_A  U"\u3215"
 #define UNICODE_PARENTHESIZED_HANGUL_CIEUC_A  0x3216
-#define UNITEXT_PARENTHESIZED_HANGUL_CIEUC_A  L"\u3216"
+#define UNITEXT_PARENTHESIZED_HANGUL_CIEUC_A  U"\u3216"
 #define UNICODE_PARENTHESIZED_HANGUL_CHIEUCH_A  0x3217
-#define UNITEXT_PARENTHESIZED_HANGUL_CHIEUCH_A  L"\u3217"
+#define UNITEXT_PARENTHESIZED_HANGUL_CHIEUCH_A  U"\u3217"
 #define UNICODE_PARENTHESIZED_HANGUL_KHIEUKH_A  0x3218
-#define UNITEXT_PARENTHESIZED_HANGUL_KHIEUKH_A  L"\u3218"
+#define UNITEXT_PARENTHESIZED_HANGUL_KHIEUKH_A  U"\u3218"
 #define UNICODE_PARENTHESIZED_HANGUL_THIEUTH_A  0x3219
-#define UNITEXT_PARENTHESIZED_HANGUL_THIEUTH_A  L"\u3219"
+#define UNITEXT_PARENTHESIZED_HANGUL_THIEUTH_A  U"\u3219"
 #define UNICODE_PARENTHESIZED_HANGUL_PHIEUPH_A  0x321a
-#define UNITEXT_PARENTHESIZED_HANGUL_PHIEUPH_A  L"\u321a"
+#define UNITEXT_PARENTHESIZED_HANGUL_PHIEUPH_A  U"\u321a"
 #define UNICODE_PARENTHESIZED_HANGUL_HIEUH_A  0x321b
-#define UNITEXT_PARENTHESIZED_HANGUL_HIEUH_A  L"\u321b"
+#define UNITEXT_PARENTHESIZED_HANGUL_HIEUH_A  U"\u321b"
 #define UNICODE_PARENTHESIZED_HANGUL_CIEUC_U  0x321c
-#define UNITEXT_PARENTHESIZED_HANGUL_CIEUC_U  L"\u321c"
+#define UNITEXT_PARENTHESIZED_HANGUL_CIEUC_U  U"\u321c"
 #define UNICODE_PARENTHESIZED_KOREAN_CHARACTER_OJEON  0x321d
-#define UNITEXT_PARENTHESIZED_KOREAN_CHARACTER_OJEON  L"\u321d"
+#define UNITEXT_PARENTHESIZED_KOREAN_CHARACTER_OJEON  U"\u321d"
 #define UNICODE_PARENTHESIZED_KOREAN_CHARACTER_O_HU  0x321e
-#define UNITEXT_PARENTHESIZED_KOREAN_CHARACTER_O_HU  L"\u321e"
+#define UNITEXT_PARENTHESIZED_KOREAN_CHARACTER_O_HU  U"\u321e"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_ONE  0x3220
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_ONE  L"\u3220"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_ONE  U"\u3220"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_TWO  0x3221
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_TWO  L"\u3221"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_TWO  U"\u3221"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_THREE  0x3222
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_THREE  L"\u3222"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_THREE  U"\u3222"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_FOUR  0x3223
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_FOUR  L"\u3223"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_FOUR  U"\u3223"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_FIVE  0x3224
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_FIVE  L"\u3224"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_FIVE  U"\u3224"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_SIX  0x3225
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SIX  L"\u3225"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SIX  U"\u3225"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_SEVEN  0x3226
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SEVEN  L"\u3226"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SEVEN  U"\u3226"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_EIGHT  0x3227
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_EIGHT  L"\u3227"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_EIGHT  U"\u3227"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_NINE  0x3228
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_NINE  L"\u3228"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_NINE  U"\u3228"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_TEN  0x3229
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_TEN  L"\u3229"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_TEN  U"\u3229"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_MOON  0x322a
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_MOON  L"\u322a"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_MOON  U"\u322a"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_FIRE  0x322b
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_FIRE  L"\u322b"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_FIRE  U"\u322b"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_WATER  0x322c
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_WATER  L"\u322c"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_WATER  U"\u322c"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_WOOD  0x322d
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_WOOD  L"\u322d"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_WOOD  U"\u322d"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_METAL  0x322e
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_METAL  L"\u322e"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_METAL  U"\u322e"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_EARTH  0x322f
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_EARTH  L"\u322f"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_EARTH  U"\u322f"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_SUN  0x3230
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SUN  L"\u3230"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SUN  U"\u3230"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_STOCK  0x3231
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_STOCK  L"\u3231"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_STOCK  U"\u3231"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_HAVE  0x3232
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_HAVE  L"\u3232"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_HAVE  U"\u3232"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_SOCIETY  0x3233
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SOCIETY  L"\u3233"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SOCIETY  U"\u3233"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_NAME  0x3234
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_NAME  L"\u3234"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_NAME  U"\u3234"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_SPECIAL  0x3235
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SPECIAL  L"\u3235"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SPECIAL  U"\u3235"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_FINANCIAL  0x3236
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_FINANCIAL  L"\u3236"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_FINANCIAL  U"\u3236"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_CONGRATULATION  0x3237
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_CONGRATULATION  L"\u3237"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_CONGRATULATION  U"\u3237"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_LABOR  0x3238
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_LABOR  L"\u3238"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_LABOR  U"\u3238"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_REPRESENT  0x3239
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_REPRESENT  L"\u3239"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_REPRESENT  U"\u3239"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_CALL  0x323a
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_CALL  L"\u323a"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_CALL  U"\u323a"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_STUDY  0x323b
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_STUDY  L"\u323b"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_STUDY  U"\u323b"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_SUPERVISE  0x323c
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SUPERVISE  L"\u323c"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SUPERVISE  U"\u323c"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_ENTERPRISE  0x323d
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_ENTERPRISE  L"\u323d"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_ENTERPRISE  U"\u323d"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_RESOURCE  0x323e
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_RESOURCE  L"\u323e"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_RESOURCE  U"\u323e"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_ALLIANCE  0x323f
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_ALLIANCE  L"\u323f"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_ALLIANCE  U"\u323f"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_FESTIVAL  0x3240
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_FESTIVAL  L"\u3240"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_FESTIVAL  U"\u3240"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_REST  0x3241
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_REST  L"\u3241"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_REST  U"\u3241"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_SELF  0x3242
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SELF  L"\u3242"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_SELF  U"\u3242"
 #define UNICODE_PARENTHESIZED_IDEOGRAPH_REACH  0x3243
-#define UNITEXT_PARENTHESIZED_IDEOGRAPH_REACH  L"\u3243"
+#define UNITEXT_PARENTHESIZED_IDEOGRAPH_REACH  U"\u3243"
 #define UNICODE_PARTNERSHIP_SIGN  0x3250
-#define UNITEXT_PARTNERSHIP_SIGN  L"\u3250"
+#define UNITEXT_PARTNERSHIP_SIGN  U"\u3250"
 #define UNICODE_CIRCLED_NUMBER_TWENTY_ONE  0x3251
-#define UNITEXT_CIRCLED_NUMBER_TWENTY_ONE  L"\u3251"
+#define UNITEXT_CIRCLED_NUMBER_TWENTY_ONE  U"\u3251"
 #define UNICODE_CIRCLED_NUMBER_TWENTY_TWO  0x3252
-#define UNITEXT_CIRCLED_NUMBER_TWENTY_TWO  L"\u3252"
+#define UNITEXT_CIRCLED_NUMBER_TWENTY_TWO  U"\u3252"
 #define UNICODE_CIRCLED_NUMBER_TWENTY_THREE  0x3253
-#define UNITEXT_CIRCLED_NUMBER_TWENTY_THREE  L"\u3253"
+#define UNITEXT_CIRCLED_NUMBER_TWENTY_THREE  U"\u3253"
 #define UNICODE_CIRCLED_NUMBER_TWENTY_FOUR  0x3254
-#define UNITEXT_CIRCLED_NUMBER_TWENTY_FOUR  L"\u3254"
+#define UNITEXT_CIRCLED_NUMBER_TWENTY_FOUR  U"\u3254"
 #define UNICODE_CIRCLED_NUMBER_TWENTY_FIVE  0x3255
-#define UNITEXT_CIRCLED_NUMBER_TWENTY_FIVE  L"\u3255"
+#define UNITEXT_CIRCLED_NUMBER_TWENTY_FIVE  U"\u3255"
 #define UNICODE_CIRCLED_NUMBER_TWENTY_SIX  0x3256
-#define UNITEXT_CIRCLED_NUMBER_TWENTY_SIX  L"\u3256"
+#define UNITEXT_CIRCLED_NUMBER_TWENTY_SIX  U"\u3256"
 #define UNICODE_CIRCLED_NUMBER_TWENTY_SEVEN  0x3257
-#define UNITEXT_CIRCLED_NUMBER_TWENTY_SEVEN  L"\u3257"
+#define UNITEXT_CIRCLED_NUMBER_TWENTY_SEVEN  U"\u3257"
 #define UNICODE_CIRCLED_NUMBER_TWENTY_EIGHT  0x3258
-#define UNITEXT_CIRCLED_NUMBER_TWENTY_EIGHT  L"\u3258"
+#define UNITEXT_CIRCLED_NUMBER_TWENTY_EIGHT  U"\u3258"
 #define UNICODE_CIRCLED_NUMBER_TWENTY_NINE  0x3259
-#define UNITEXT_CIRCLED_NUMBER_TWENTY_NINE  L"\u3259"
+#define UNITEXT_CIRCLED_NUMBER_TWENTY_NINE  U"\u3259"
 #define UNICODE_CIRCLED_NUMBER_THIRTY  0x325a
-#define UNITEXT_CIRCLED_NUMBER_THIRTY  L"\u325a"
+#define UNITEXT_CIRCLED_NUMBER_THIRTY  U"\u325a"
 #define UNICODE_CIRCLED_NUMBER_THIRTY_ONE  0x325b
-#define UNITEXT_CIRCLED_NUMBER_THIRTY_ONE  L"\u325b"
+#define UNITEXT_CIRCLED_NUMBER_THIRTY_ONE  U"\u325b"
 #define UNICODE_CIRCLED_NUMBER_THIRTY_TWO  0x325c
-#define UNITEXT_CIRCLED_NUMBER_THIRTY_TWO  L"\u325c"
+#define UNITEXT_CIRCLED_NUMBER_THIRTY_TWO  U"\u325c"
 #define UNICODE_CIRCLED_NUMBER_THIRTY_THREE  0x325d
-#define UNITEXT_CIRCLED_NUMBER_THIRTY_THREE  L"\u325d"
+#define UNITEXT_CIRCLED_NUMBER_THIRTY_THREE  U"\u325d"
 #define UNICODE_CIRCLED_NUMBER_THIRTY_FOUR  0x325e
-#define UNITEXT_CIRCLED_NUMBER_THIRTY_FOUR  L"\u325e"
+#define UNITEXT_CIRCLED_NUMBER_THIRTY_FOUR  U"\u325e"
 #define UNICODE_CIRCLED_NUMBER_THIRTY_FIVE  0x325f
-#define UNITEXT_CIRCLED_NUMBER_THIRTY_FIVE  L"\u325f"
+#define UNITEXT_CIRCLED_NUMBER_THIRTY_FIVE  U"\u325f"
 #define UNICODE_CIRCLED_HANGUL_KIYEOK  0x3260
-#define UNITEXT_CIRCLED_HANGUL_KIYEOK  L"\u3260"
+#define UNITEXT_CIRCLED_HANGUL_KIYEOK  U"\u3260"
 #define UNICODE_CIRCLED_HANGUL_NIEUN  0x3261
-#define UNITEXT_CIRCLED_HANGUL_NIEUN  L"\u3261"
+#define UNITEXT_CIRCLED_HANGUL_NIEUN  U"\u3261"
 #define UNICODE_CIRCLED_HANGUL_TIKEUT  0x3262
-#define UNITEXT_CIRCLED_HANGUL_TIKEUT  L"\u3262"
+#define UNITEXT_CIRCLED_HANGUL_TIKEUT  U"\u3262"
 #define UNICODE_CIRCLED_HANGUL_RIEUL  0x3263
-#define UNITEXT_CIRCLED_HANGUL_RIEUL  L"\u3263"
+#define UNITEXT_CIRCLED_HANGUL_RIEUL  U"\u3263"
 #define UNICODE_CIRCLED_HANGUL_MIEUM  0x3264
-#define UNITEXT_CIRCLED_HANGUL_MIEUM  L"\u3264"
+#define UNITEXT_CIRCLED_HANGUL_MIEUM  U"\u3264"
 #define UNICODE_CIRCLED_HANGUL_PIEUP  0x3265
-#define UNITEXT_CIRCLED_HANGUL_PIEUP  L"\u3265"
+#define UNITEXT_CIRCLED_HANGUL_PIEUP  U"\u3265"
 #define UNICODE_CIRCLED_HANGUL_SIOS  0x3266
-#define UNITEXT_CIRCLED_HANGUL_SIOS  L"\u3266"
+#define UNITEXT_CIRCLED_HANGUL_SIOS  U"\u3266"
 #define UNICODE_CIRCLED_HANGUL_IEUNG  0x3267
-#define UNITEXT_CIRCLED_HANGUL_IEUNG  L"\u3267"
+#define UNITEXT_CIRCLED_HANGUL_IEUNG  U"\u3267"
 #define UNICODE_CIRCLED_HANGUL_CIEUC  0x3268
-#define UNITEXT_CIRCLED_HANGUL_CIEUC  L"\u3268"
+#define UNITEXT_CIRCLED_HANGUL_CIEUC  U"\u3268"
 #define UNICODE_CIRCLED_HANGUL_CHIEUCH  0x3269
-#define UNITEXT_CIRCLED_HANGUL_CHIEUCH  L"\u3269"
+#define UNITEXT_CIRCLED_HANGUL_CHIEUCH  U"\u3269"
 #define UNICODE_CIRCLED_HANGUL_KHIEUKH  0x326a
-#define UNITEXT_CIRCLED_HANGUL_KHIEUKH  L"\u326a"
+#define UNITEXT_CIRCLED_HANGUL_KHIEUKH  U"\u326a"
 #define UNICODE_CIRCLED_HANGUL_THIEUTH  0x326b
-#define UNITEXT_CIRCLED_HANGUL_THIEUTH  L"\u326b"
+#define UNITEXT_CIRCLED_HANGUL_THIEUTH  U"\u326b"
 #define UNICODE_CIRCLED_HANGUL_PHIEUPH  0x326c
-#define UNITEXT_CIRCLED_HANGUL_PHIEUPH  L"\u326c"
+#define UNITEXT_CIRCLED_HANGUL_PHIEUPH  U"\u326c"
 #define UNICODE_CIRCLED_HANGUL_HIEUH  0x326d
-#define UNITEXT_CIRCLED_HANGUL_HIEUH  L"\u326d"
+#define UNITEXT_CIRCLED_HANGUL_HIEUH  U"\u326d"
 #define UNICODE_CIRCLED_HANGUL_KIYEOK_A  0x326e
-#define UNITEXT_CIRCLED_HANGUL_KIYEOK_A  L"\u326e"
+#define UNITEXT_CIRCLED_HANGUL_KIYEOK_A  U"\u326e"
 #define UNICODE_CIRCLED_HANGUL_NIEUN_A  0x326f
-#define UNITEXT_CIRCLED_HANGUL_NIEUN_A  L"\u326f"
+#define UNITEXT_CIRCLED_HANGUL_NIEUN_A  U"\u326f"
 #define UNICODE_CIRCLED_HANGUL_TIKEUT_A  0x3270
-#define UNITEXT_CIRCLED_HANGUL_TIKEUT_A  L"\u3270"
+#define UNITEXT_CIRCLED_HANGUL_TIKEUT_A  U"\u3270"
 #define UNICODE_CIRCLED_HANGUL_RIEUL_A  0x3271
-#define UNITEXT_CIRCLED_HANGUL_RIEUL_A  L"\u3271"
+#define UNITEXT_CIRCLED_HANGUL_RIEUL_A  U"\u3271"
 #define UNICODE_CIRCLED_HANGUL_MIEUM_A  0x3272
-#define UNITEXT_CIRCLED_HANGUL_MIEUM_A  L"\u3272"
+#define UNITEXT_CIRCLED_HANGUL_MIEUM_A  U"\u3272"
 #define UNICODE_CIRCLED_HANGUL_PIEUP_A  0x3273
-#define UNITEXT_CIRCLED_HANGUL_PIEUP_A  L"\u3273"
+#define UNITEXT_CIRCLED_HANGUL_PIEUP_A  U"\u3273"
 #define UNICODE_CIRCLED_HANGUL_SIOS_A  0x3274
-#define UNITEXT_CIRCLED_HANGUL_SIOS_A  L"\u3274"
+#define UNITEXT_CIRCLED_HANGUL_SIOS_A  U"\u3274"
 #define UNICODE_CIRCLED_HANGUL_IEUNG_A  0x3275
-#define UNITEXT_CIRCLED_HANGUL_IEUNG_A  L"\u3275"
+#define UNITEXT_CIRCLED_HANGUL_IEUNG_A  U"\u3275"
 #define UNICODE_CIRCLED_HANGUL_CIEUC_A  0x3276
-#define UNITEXT_CIRCLED_HANGUL_CIEUC_A  L"\u3276"
+#define UNITEXT_CIRCLED_HANGUL_CIEUC_A  U"\u3276"
 #define UNICODE_CIRCLED_HANGUL_CHIEUCH_A  0x3277
-#define UNITEXT_CIRCLED_HANGUL_CHIEUCH_A  L"\u3277"
+#define UNITEXT_CIRCLED_HANGUL_CHIEUCH_A  U"\u3277"
 #define UNICODE_CIRCLED_HANGUL_KHIEUKH_A  0x3278
-#define UNITEXT_CIRCLED_HANGUL_KHIEUKH_A  L"\u3278"
+#define UNITEXT_CIRCLED_HANGUL_KHIEUKH_A  U"\u3278"
 #define UNICODE_CIRCLED_HANGUL_THIEUTH_A  0x3279
-#define UNITEXT_CIRCLED_HANGUL_THIEUTH_A  L"\u3279"
+#define UNITEXT_CIRCLED_HANGUL_THIEUTH_A  U"\u3279"
 #define UNICODE_CIRCLED_HANGUL_PHIEUPH_A  0x327a
-#define UNITEXT_CIRCLED_HANGUL_PHIEUPH_A  L"\u327a"
+#define UNITEXT_CIRCLED_HANGUL_PHIEUPH_A  U"\u327a"
 #define UNICODE_CIRCLED_HANGUL_HIEUH_A  0x327b
-#define UNITEXT_CIRCLED_HANGUL_HIEUH_A  L"\u327b"
+#define UNITEXT_CIRCLED_HANGUL_HIEUH_A  U"\u327b"
 #define UNICODE_CIRCLED_KOREAN_CHARACTER_CHAMKO  0x327c
-#define UNITEXT_CIRCLED_KOREAN_CHARACTER_CHAMKO  L"\u327c"
+#define UNITEXT_CIRCLED_KOREAN_CHARACTER_CHAMKO  U"\u327c"
 #define UNICODE_CIRCLED_KOREAN_CHARACTER_JUEUI  0x327d
-#define UNITEXT_CIRCLED_KOREAN_CHARACTER_JUEUI  L"\u327d"
+#define UNITEXT_CIRCLED_KOREAN_CHARACTER_JUEUI  U"\u327d"
 #define UNICODE_CIRCLED_HANGUL_IEUNG_U  0x327e
-#define UNITEXT_CIRCLED_HANGUL_IEUNG_U  L"\u327e"
+#define UNITEXT_CIRCLED_HANGUL_IEUNG_U  U"\u327e"
 #define UNICODE_KOREAN_STANDARD_SYMBOL  0x327f
-#define UNITEXT_KOREAN_STANDARD_SYMBOL  L"\u327f"
+#define UNITEXT_KOREAN_STANDARD_SYMBOL  U"\u327f"
 #define UNICODE_CIRCLED_IDEOGRAPH_ONE  0x3280
-#define UNITEXT_CIRCLED_IDEOGRAPH_ONE  L"\u3280"
+#define UNITEXT_CIRCLED_IDEOGRAPH_ONE  U"\u3280"
 #define UNICODE_CIRCLED_IDEOGRAPH_TWO  0x3281
-#define UNITEXT_CIRCLED_IDEOGRAPH_TWO  L"\u3281"
+#define UNITEXT_CIRCLED_IDEOGRAPH_TWO  U"\u3281"
 #define UNICODE_CIRCLED_IDEOGRAPH_THREE  0x3282
-#define UNITEXT_CIRCLED_IDEOGRAPH_THREE  L"\u3282"
+#define UNITEXT_CIRCLED_IDEOGRAPH_THREE  U"\u3282"
 #define UNICODE_CIRCLED_IDEOGRAPH_FOUR  0x3283
-#define UNITEXT_CIRCLED_IDEOGRAPH_FOUR  L"\u3283"
+#define UNITEXT_CIRCLED_IDEOGRAPH_FOUR  U"\u3283"
 #define UNICODE_CIRCLED_IDEOGRAPH_FIVE  0x3284
-#define UNITEXT_CIRCLED_IDEOGRAPH_FIVE  L"\u3284"
+#define UNITEXT_CIRCLED_IDEOGRAPH_FIVE  U"\u3284"
 #define UNICODE_CIRCLED_IDEOGRAPH_SIX  0x3285
-#define UNITEXT_CIRCLED_IDEOGRAPH_SIX  L"\u3285"
+#define UNITEXT_CIRCLED_IDEOGRAPH_SIX  U"\u3285"
 #define UNICODE_CIRCLED_IDEOGRAPH_SEVEN  0x3286
-#define UNITEXT_CIRCLED_IDEOGRAPH_SEVEN  L"\u3286"
+#define UNITEXT_CIRCLED_IDEOGRAPH_SEVEN  U"\u3286"
 #define UNICODE_CIRCLED_IDEOGRAPH_EIGHT  0x3287
-#define UNITEXT_CIRCLED_IDEOGRAPH_EIGHT  L"\u3287"
+#define UNITEXT_CIRCLED_IDEOGRAPH_EIGHT  U"\u3287"
 #define UNICODE_CIRCLED_IDEOGRAPH_NINE  0x3288
-#define UNITEXT_CIRCLED_IDEOGRAPH_NINE  L"\u3288"
+#define UNITEXT_CIRCLED_IDEOGRAPH_NINE  U"\u3288"
 #define UNICODE_CIRCLED_IDEOGRAPH_TEN  0x3289
-#define UNITEXT_CIRCLED_IDEOGRAPH_TEN  L"\u3289"
+#define UNITEXT_CIRCLED_IDEOGRAPH_TEN  U"\u3289"
 #define UNICODE_CIRCLED_IDEOGRAPH_MOON  0x328a
-#define UNITEXT_CIRCLED_IDEOGRAPH_MOON  L"\u328a"
+#define UNITEXT_CIRCLED_IDEOGRAPH_MOON  U"\u328a"
 #define UNICODE_CIRCLED_IDEOGRAPH_FIRE  0x328b
-#define UNITEXT_CIRCLED_IDEOGRAPH_FIRE  L"\u328b"
+#define UNITEXT_CIRCLED_IDEOGRAPH_FIRE  U"\u328b"
 #define UNICODE_CIRCLED_IDEOGRAPH_WATER  0x328c
-#define UNITEXT_CIRCLED_IDEOGRAPH_WATER  L"\u328c"
+#define UNITEXT_CIRCLED_IDEOGRAPH_WATER  U"\u328c"
 #define UNICODE_CIRCLED_IDEOGRAPH_WOOD  0x328d
-#define UNITEXT_CIRCLED_IDEOGRAPH_WOOD  L"\u328d"
+#define UNITEXT_CIRCLED_IDEOGRAPH_WOOD  U"\u328d"
 #define UNICODE_CIRCLED_IDEOGRAPH_METAL  0x328e
-#define UNITEXT_CIRCLED_IDEOGRAPH_METAL  L"\u328e"
+#define UNITEXT_CIRCLED_IDEOGRAPH_METAL  U"\u328e"
 #define UNICODE_CIRCLED_IDEOGRAPH_EARTH  0x328f
-#define UNITEXT_CIRCLED_IDEOGRAPH_EARTH  L"\u328f"
+#define UNITEXT_CIRCLED_IDEOGRAPH_EARTH  U"\u328f"
 #define UNICODE_CIRCLED_IDEOGRAPH_SUN  0x3290
-#define UNITEXT_CIRCLED_IDEOGRAPH_SUN  L"\u3290"
+#define UNITEXT_CIRCLED_IDEOGRAPH_SUN  U"\u3290"
 #define UNICODE_CIRCLED_IDEOGRAPH_STOCK  0x3291
-#define UNITEXT_CIRCLED_IDEOGRAPH_STOCK  L"\u3291"
+#define UNITEXT_CIRCLED_IDEOGRAPH_STOCK  U"\u3291"
 #define UNICODE_CIRCLED_IDEOGRAPH_HAVE  0x3292
-#define UNITEXT_CIRCLED_IDEOGRAPH_HAVE  L"\u3292"
+#define UNITEXT_CIRCLED_IDEOGRAPH_HAVE  U"\u3292"
 #define UNICODE_CIRCLED_IDEOGRAPH_SOCIETY  0x3293
-#define UNITEXT_CIRCLED_IDEOGRAPH_SOCIETY  L"\u3293"
+#define UNITEXT_CIRCLED_IDEOGRAPH_SOCIETY  U"\u3293"
 #define UNICODE_CIRCLED_IDEOGRAPH_NAME  0x3294
-#define UNITEXT_CIRCLED_IDEOGRAPH_NAME  L"\u3294"
+#define UNITEXT_CIRCLED_IDEOGRAPH_NAME  U"\u3294"
 #define UNICODE_CIRCLED_IDEOGRAPH_SPECIAL  0x3295
-#define UNITEXT_CIRCLED_IDEOGRAPH_SPECIAL  L"\u3295"
+#define UNITEXT_CIRCLED_IDEOGRAPH_SPECIAL  U"\u3295"
 #define UNICODE_CIRCLED_IDEOGRAPH_FINANCIAL  0x3296
-#define UNITEXT_CIRCLED_IDEOGRAPH_FINANCIAL  L"\u3296"
+#define UNITEXT_CIRCLED_IDEOGRAPH_FINANCIAL  U"\u3296"
 #define UNICODE_CIRCLED_IDEOGRAPH_CONGRATULATION  0x3297
-#define UNITEXT_CIRCLED_IDEOGRAPH_CONGRATULATION  L"\u3297"
+#define UNITEXT_CIRCLED_IDEOGRAPH_CONGRATULATION  U"\u3297"
 #define UNICODE_CIRCLED_IDEOGRAPH_LABOR  0x3298
-#define UNITEXT_CIRCLED_IDEOGRAPH_LABOR  L"\u3298"
+#define UNITEXT_CIRCLED_IDEOGRAPH_LABOR  U"\u3298"
 #define UNICODE_CIRCLED_IDEOGRAPH_SECRET  0x3299
-#define UNITEXT_CIRCLED_IDEOGRAPH_SECRET  L"\u3299"
+#define UNITEXT_CIRCLED_IDEOGRAPH_SECRET  U"\u3299"
 #define UNICODE_CIRCLED_IDEOGRAPH_MALE  0x329a
-#define UNITEXT_CIRCLED_IDEOGRAPH_MALE  L"\u329a"
+#define UNITEXT_CIRCLED_IDEOGRAPH_MALE  U"\u329a"
 #define UNICODE_CIRCLED_IDEOGRAPH_FEMALE  0x329b
-#define UNITEXT_CIRCLED_IDEOGRAPH_FEMALE  L"\u329b"
+#define UNITEXT_CIRCLED_IDEOGRAPH_FEMALE  U"\u329b"
 #define UNICODE_CIRCLED_IDEOGRAPH_SUITABLE  0x329c
-#define UNITEXT_CIRCLED_IDEOGRAPH_SUITABLE  L"\u329c"
+#define UNITEXT_CIRCLED_IDEOGRAPH_SUITABLE  U"\u329c"
 #define UNICODE_CIRCLED_IDEOGRAPH_EXCELLENT  0x329d
-#define UNITEXT_CIRCLED_IDEOGRAPH_EXCELLENT  L"\u329d"
+#define UNITEXT_CIRCLED_IDEOGRAPH_EXCELLENT  U"\u329d"
 #define UNICODE_CIRCLED_IDEOGRAPH_PRINT  0x329e
-#define UNITEXT_CIRCLED_IDEOGRAPH_PRINT  L"\u329e"
+#define UNITEXT_CIRCLED_IDEOGRAPH_PRINT  U"\u329e"
 #define UNICODE_CIRCLED_IDEOGRAPH_ATTENTION  0x329f
-#define UNITEXT_CIRCLED_IDEOGRAPH_ATTENTION  L"\u329f"
+#define UNITEXT_CIRCLED_IDEOGRAPH_ATTENTION  U"\u329f"
 #define UNICODE_CIRCLED_IDEOGRAPH_ITEM  0x32a0
-#define UNITEXT_CIRCLED_IDEOGRAPH_ITEM  L"\u32a0"
+#define UNITEXT_CIRCLED_IDEOGRAPH_ITEM  U"\u32a0"
 #define UNICODE_CIRCLED_IDEOGRAPH_REST  0x32a1
-#define UNITEXT_CIRCLED_IDEOGRAPH_REST  L"\u32a1"
+#define UNITEXT_CIRCLED_IDEOGRAPH_REST  U"\u32a1"
 #define UNICODE_CIRCLED_IDEOGRAPH_COPY  0x32a2
-#define UNITEXT_CIRCLED_IDEOGRAPH_COPY  L"\u32a2"
+#define UNITEXT_CIRCLED_IDEOGRAPH_COPY  U"\u32a2"
 #define UNICODE_CIRCLED_IDEOGRAPH_CORRECT  0x32a3
-#define UNITEXT_CIRCLED_IDEOGRAPH_CORRECT  L"\u32a3"
+#define UNITEXT_CIRCLED_IDEOGRAPH_CORRECT  U"\u32a3"
 #define UNICODE_CIRCLED_IDEOGRAPH_HIGH  0x32a4
-#define UNITEXT_CIRCLED_IDEOGRAPH_HIGH  L"\u32a4"
+#define UNITEXT_CIRCLED_IDEOGRAPH_HIGH  U"\u32a4"
 #define UNICODE_CIRCLED_IDEOGRAPH_CENTRE  0x32a5
-#define UNITEXT_CIRCLED_IDEOGRAPH_CENTRE  L"\u32a5"
+#define UNITEXT_CIRCLED_IDEOGRAPH_CENTRE  U"\u32a5"
 #define UNICODE_CIRCLED_IDEOGRAPH_LOW  0x32a6
-#define UNITEXT_CIRCLED_IDEOGRAPH_LOW  L"\u32a6"
+#define UNITEXT_CIRCLED_IDEOGRAPH_LOW  U"\u32a6"
 #define UNICODE_CIRCLED_IDEOGRAPH_LEFT  0x32a7
-#define UNITEXT_CIRCLED_IDEOGRAPH_LEFT  L"\u32a7"
+#define UNITEXT_CIRCLED_IDEOGRAPH_LEFT  U"\u32a7"
 #define UNICODE_CIRCLED_IDEOGRAPH_RIGHT  0x32a8
-#define UNITEXT_CIRCLED_IDEOGRAPH_RIGHT  L"\u32a8"
+#define UNITEXT_CIRCLED_IDEOGRAPH_RIGHT  U"\u32a8"
 #define UNICODE_CIRCLED_IDEOGRAPH_MEDICINE  0x32a9
-#define UNITEXT_CIRCLED_IDEOGRAPH_MEDICINE  L"\u32a9"
+#define UNITEXT_CIRCLED_IDEOGRAPH_MEDICINE  U"\u32a9"
 #define UNICODE_CIRCLED_IDEOGRAPH_RELIGION  0x32aa
-#define UNITEXT_CIRCLED_IDEOGRAPH_RELIGION  L"\u32aa"
+#define UNITEXT_CIRCLED_IDEOGRAPH_RELIGION  U"\u32aa"
 #define UNICODE_CIRCLED_IDEOGRAPH_STUDY  0x32ab
-#define UNITEXT_CIRCLED_IDEOGRAPH_STUDY  L"\u32ab"
+#define UNITEXT_CIRCLED_IDEOGRAPH_STUDY  U"\u32ab"
 #define UNICODE_CIRCLED_IDEOGRAPH_SUPERVISE  0x32ac
-#define UNITEXT_CIRCLED_IDEOGRAPH_SUPERVISE  L"\u32ac"
+#define UNITEXT_CIRCLED_IDEOGRAPH_SUPERVISE  U"\u32ac"
 #define UNICODE_CIRCLED_IDEOGRAPH_ENTERPRISE  0x32ad
-#define UNITEXT_CIRCLED_IDEOGRAPH_ENTERPRISE  L"\u32ad"
+#define UNITEXT_CIRCLED_IDEOGRAPH_ENTERPRISE  U"\u32ad"
 #define UNICODE_CIRCLED_IDEOGRAPH_RESOURCE  0x32ae
-#define UNITEXT_CIRCLED_IDEOGRAPH_RESOURCE  L"\u32ae"
+#define UNITEXT_CIRCLED_IDEOGRAPH_RESOURCE  U"\u32ae"
 #define UNICODE_CIRCLED_IDEOGRAPH_ALLIANCE  0x32af
-#define UNITEXT_CIRCLED_IDEOGRAPH_ALLIANCE  L"\u32af"
+#define UNITEXT_CIRCLED_IDEOGRAPH_ALLIANCE  U"\u32af"
 #define UNICODE_CIRCLED_IDEOGRAPH_NIGHT  0x32b0
-#define UNITEXT_CIRCLED_IDEOGRAPH_NIGHT  L"\u32b0"
+#define UNITEXT_CIRCLED_IDEOGRAPH_NIGHT  U"\u32b0"
 #define UNICODE_CIRCLED_NUMBER_THIRTY_SIX  0x32b1
-#define UNITEXT_CIRCLED_NUMBER_THIRTY_SIX  L"\u32b1"
+#define UNITEXT_CIRCLED_NUMBER_THIRTY_SIX  U"\u32b1"
 #define UNICODE_CIRCLED_NUMBER_THIRTY_SEVEN  0x32b2
-#define UNITEXT_CIRCLED_NUMBER_THIRTY_SEVEN  L"\u32b2"
+#define UNITEXT_CIRCLED_NUMBER_THIRTY_SEVEN  U"\u32b2"
 #define UNICODE_CIRCLED_NUMBER_THIRTY_EIGHT  0x32b3
-#define UNITEXT_CIRCLED_NUMBER_THIRTY_EIGHT  L"\u32b3"
+#define UNITEXT_CIRCLED_NUMBER_THIRTY_EIGHT  U"\u32b3"
 #define UNICODE_CIRCLED_NUMBER_THIRTY_NINE  0x32b4
-#define UNITEXT_CIRCLED_NUMBER_THIRTY_NINE  L"\u32b4"
+#define UNITEXT_CIRCLED_NUMBER_THIRTY_NINE  U"\u32b4"
 #define UNICODE_CIRCLED_NUMBER_FORTY  0x32b5
-#define UNITEXT_CIRCLED_NUMBER_FORTY  L"\u32b5"
+#define UNITEXT_CIRCLED_NUMBER_FORTY  U"\u32b5"
 #define UNICODE_CIRCLED_NUMBER_FORTY_ONE  0x32b6
-#define UNITEXT_CIRCLED_NUMBER_FORTY_ONE  L"\u32b6"
+#define UNITEXT_CIRCLED_NUMBER_FORTY_ONE  U"\u32b6"
 #define UNICODE_CIRCLED_NUMBER_FORTY_TWO  0x32b7
-#define UNITEXT_CIRCLED_NUMBER_FORTY_TWO  L"\u32b7"
+#define UNITEXT_CIRCLED_NUMBER_FORTY_TWO  U"\u32b7"
 #define UNICODE_CIRCLED_NUMBER_FORTY_THREE  0x32b8
-#define UNITEXT_CIRCLED_NUMBER_FORTY_THREE  L"\u32b8"
+#define UNITEXT_CIRCLED_NUMBER_FORTY_THREE  U"\u32b8"
 #define UNICODE_CIRCLED_NUMBER_FORTY_FOUR  0x32b9
-#define UNITEXT_CIRCLED_NUMBER_FORTY_FOUR  L"\u32b9"
+#define UNITEXT_CIRCLED_NUMBER_FORTY_FOUR  U"\u32b9"
 #define UNICODE_CIRCLED_NUMBER_FORTY_FIVE  0x32ba
-#define UNITEXT_CIRCLED_NUMBER_FORTY_FIVE  L"\u32ba"
+#define UNITEXT_CIRCLED_NUMBER_FORTY_FIVE  U"\u32ba"
 #define UNICODE_CIRCLED_NUMBER_FORTY_SIX  0x32bb
-#define UNITEXT_CIRCLED_NUMBER_FORTY_SIX  L"\u32bb"
+#define UNITEXT_CIRCLED_NUMBER_FORTY_SIX  U"\u32bb"
 #define UNICODE_CIRCLED_NUMBER_FORTY_SEVEN  0x32bc
-#define UNITEXT_CIRCLED_NUMBER_FORTY_SEVEN  L"\u32bc"
+#define UNITEXT_CIRCLED_NUMBER_FORTY_SEVEN  U"\u32bc"
 #define UNICODE_CIRCLED_NUMBER_FORTY_EIGHT  0x32bd
-#define UNITEXT_CIRCLED_NUMBER_FORTY_EIGHT  L"\u32bd"
+#define UNITEXT_CIRCLED_NUMBER_FORTY_EIGHT  U"\u32bd"
 #define UNICODE_CIRCLED_NUMBER_FORTY_NINE  0x32be
-#define UNITEXT_CIRCLED_NUMBER_FORTY_NINE  L"\u32be"
+#define UNITEXT_CIRCLED_NUMBER_FORTY_NINE  U"\u32be"
 #define UNICODE_CIRCLED_NUMBER_FIFTY  0x32bf
-#define UNITEXT_CIRCLED_NUMBER_FIFTY  L"\u32bf"
+#define UNITEXT_CIRCLED_NUMBER_FIFTY  U"\u32bf"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_JANUARY  0x32c0
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_JANUARY  L"\u32c0"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_JANUARY  U"\u32c0"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_FEBRUARY  0x32c1
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_FEBRUARY  L"\u32c1"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_FEBRUARY  U"\u32c1"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_MARCH  0x32c2
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_MARCH  L"\u32c2"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_MARCH  U"\u32c2"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_APRIL  0x32c3
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_APRIL  L"\u32c3"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_APRIL  U"\u32c3"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_MAY  0x32c4
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_MAY  L"\u32c4"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_MAY  U"\u32c4"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_JUNE  0x32c5
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_JUNE  L"\u32c5"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_JUNE  U"\u32c5"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_JULY  0x32c6
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_JULY  L"\u32c6"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_JULY  U"\u32c6"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_AUGUST  0x32c7
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_AUGUST  L"\u32c7"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_AUGUST  U"\u32c7"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_SEPTEMBER  0x32c8
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_SEPTEMBER  L"\u32c8"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_SEPTEMBER  U"\u32c8"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_OCTOBER  0x32c9
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_OCTOBER  L"\u32c9"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_OCTOBER  U"\u32c9"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_NOVEMBER  0x32ca
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_NOVEMBER  L"\u32ca"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_NOVEMBER  U"\u32ca"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DECEMBER  0x32cb
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DECEMBER  L"\u32cb"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DECEMBER  U"\u32cb"
 #define UNICODE_SQUARE_HG  0x32cc
-#define UNITEXT_SQUARE_HG  L"\u32cc"
+#define UNITEXT_SQUARE_HG  U"\u32cc"
 #define UNICODE_SQUARE_ERG  0x32cd
-#define UNITEXT_SQUARE_ERG  L"\u32cd"
+#define UNITEXT_SQUARE_ERG  U"\u32cd"
 #define UNICODE_SQUARE_EV  0x32ce
-#define UNITEXT_SQUARE_EV  L"\u32ce"
+#define UNITEXT_SQUARE_EV  U"\u32ce"
 #define UNICODE_LIMITED_LIABILITY_SIGN  0x32cf
-#define UNITEXT_LIMITED_LIABILITY_SIGN  L"\u32cf"
+#define UNITEXT_LIMITED_LIABILITY_SIGN  U"\u32cf"
 #define UNICODE_CIRCLED_KATAKANA_A  0x32d0
-#define UNITEXT_CIRCLED_KATAKANA_A  L"\u32d0"
+#define UNITEXT_CIRCLED_KATAKANA_A  U"\u32d0"
 #define UNICODE_CIRCLED_KATAKANA_I  0x32d1
-#define UNITEXT_CIRCLED_KATAKANA_I  L"\u32d1"
+#define UNITEXT_CIRCLED_KATAKANA_I  U"\u32d1"
 #define UNICODE_CIRCLED_KATAKANA_U  0x32d2
-#define UNITEXT_CIRCLED_KATAKANA_U  L"\u32d2"
+#define UNITEXT_CIRCLED_KATAKANA_U  U"\u32d2"
 #define UNICODE_CIRCLED_KATAKANA_E  0x32d3
-#define UNITEXT_CIRCLED_KATAKANA_E  L"\u32d3"
+#define UNITEXT_CIRCLED_KATAKANA_E  U"\u32d3"
 #define UNICODE_CIRCLED_KATAKANA_O  0x32d4
-#define UNITEXT_CIRCLED_KATAKANA_O  L"\u32d4"
+#define UNITEXT_CIRCLED_KATAKANA_O  U"\u32d4"
 #define UNICODE_CIRCLED_KATAKANA_KA  0x32d5
-#define UNITEXT_CIRCLED_KATAKANA_KA  L"\u32d5"
+#define UNITEXT_CIRCLED_KATAKANA_KA  U"\u32d5"
 #define UNICODE_CIRCLED_KATAKANA_KI  0x32d6
-#define UNITEXT_CIRCLED_KATAKANA_KI  L"\u32d6"
+#define UNITEXT_CIRCLED_KATAKANA_KI  U"\u32d6"
 #define UNICODE_CIRCLED_KATAKANA_KU  0x32d7
-#define UNITEXT_CIRCLED_KATAKANA_KU  L"\u32d7"
+#define UNITEXT_CIRCLED_KATAKANA_KU  U"\u32d7"
 #define UNICODE_CIRCLED_KATAKANA_KE  0x32d8
-#define UNITEXT_CIRCLED_KATAKANA_KE  L"\u32d8"
+#define UNITEXT_CIRCLED_KATAKANA_KE  U"\u32d8"
 #define UNICODE_CIRCLED_KATAKANA_KO  0x32d9
-#define UNITEXT_CIRCLED_KATAKANA_KO  L"\u32d9"
+#define UNITEXT_CIRCLED_KATAKANA_KO  U"\u32d9"
 #define UNICODE_CIRCLED_KATAKANA_SA  0x32da
-#define UNITEXT_CIRCLED_KATAKANA_SA  L"\u32da"
+#define UNITEXT_CIRCLED_KATAKANA_SA  U"\u32da"
 #define UNICODE_CIRCLED_KATAKANA_SI  0x32db
-#define UNITEXT_CIRCLED_KATAKANA_SI  L"\u32db"
+#define UNITEXT_CIRCLED_KATAKANA_SI  U"\u32db"
 #define UNICODE_CIRCLED_KATAKANA_SU  0x32dc
-#define UNITEXT_CIRCLED_KATAKANA_SU  L"\u32dc"
+#define UNITEXT_CIRCLED_KATAKANA_SU  U"\u32dc"
 #define UNICODE_CIRCLED_KATAKANA_SE  0x32dd
-#define UNITEXT_CIRCLED_KATAKANA_SE  L"\u32dd"
+#define UNITEXT_CIRCLED_KATAKANA_SE  U"\u32dd"
 #define UNICODE_CIRCLED_KATAKANA_SO  0x32de
-#define UNITEXT_CIRCLED_KATAKANA_SO  L"\u32de"
+#define UNITEXT_CIRCLED_KATAKANA_SO  U"\u32de"
 #define UNICODE_CIRCLED_KATAKANA_TA  0x32df
-#define UNITEXT_CIRCLED_KATAKANA_TA  L"\u32df"
+#define UNITEXT_CIRCLED_KATAKANA_TA  U"\u32df"
 #define UNICODE_CIRCLED_KATAKANA_TI  0x32e0
-#define UNITEXT_CIRCLED_KATAKANA_TI  L"\u32e0"
+#define UNITEXT_CIRCLED_KATAKANA_TI  U"\u32e0"
 #define UNICODE_CIRCLED_KATAKANA_TU  0x32e1
-#define UNITEXT_CIRCLED_KATAKANA_TU  L"\u32e1"
+#define UNITEXT_CIRCLED_KATAKANA_TU  U"\u32e1"
 #define UNICODE_CIRCLED_KATAKANA_TE  0x32e2
-#define UNITEXT_CIRCLED_KATAKANA_TE  L"\u32e2"
+#define UNITEXT_CIRCLED_KATAKANA_TE  U"\u32e2"
 #define UNICODE_CIRCLED_KATAKANA_TO  0x32e3
-#define UNITEXT_CIRCLED_KATAKANA_TO  L"\u32e3"
+#define UNITEXT_CIRCLED_KATAKANA_TO  U"\u32e3"
 #define UNICODE_CIRCLED_KATAKANA_NA  0x32e4
-#define UNITEXT_CIRCLED_KATAKANA_NA  L"\u32e4"
+#define UNITEXT_CIRCLED_KATAKANA_NA  U"\u32e4"
 #define UNICODE_CIRCLED_KATAKANA_NI  0x32e5
-#define UNITEXT_CIRCLED_KATAKANA_NI  L"\u32e5"
+#define UNITEXT_CIRCLED_KATAKANA_NI  U"\u32e5"
 #define UNICODE_CIRCLED_KATAKANA_NU  0x32e6
-#define UNITEXT_CIRCLED_KATAKANA_NU  L"\u32e6"
+#define UNITEXT_CIRCLED_KATAKANA_NU  U"\u32e6"
 #define UNICODE_CIRCLED_KATAKANA_NE  0x32e7
-#define UNITEXT_CIRCLED_KATAKANA_NE  L"\u32e7"
+#define UNITEXT_CIRCLED_KATAKANA_NE  U"\u32e7"
 #define UNICODE_CIRCLED_KATAKANA_NO  0x32e8
-#define UNITEXT_CIRCLED_KATAKANA_NO  L"\u32e8"
+#define UNITEXT_CIRCLED_KATAKANA_NO  U"\u32e8"
 #define UNICODE_CIRCLED_KATAKANA_HA  0x32e9
-#define UNITEXT_CIRCLED_KATAKANA_HA  L"\u32e9"
+#define UNITEXT_CIRCLED_KATAKANA_HA  U"\u32e9"
 #define UNICODE_CIRCLED_KATAKANA_HI  0x32ea
-#define UNITEXT_CIRCLED_KATAKANA_HI  L"\u32ea"
+#define UNITEXT_CIRCLED_KATAKANA_HI  U"\u32ea"
 #define UNICODE_CIRCLED_KATAKANA_HU  0x32eb
-#define UNITEXT_CIRCLED_KATAKANA_HU  L"\u32eb"
+#define UNITEXT_CIRCLED_KATAKANA_HU  U"\u32eb"
 #define UNICODE_CIRCLED_KATAKANA_HE  0x32ec
-#define UNITEXT_CIRCLED_KATAKANA_HE  L"\u32ec"
+#define UNITEXT_CIRCLED_KATAKANA_HE  U"\u32ec"
 #define UNICODE_CIRCLED_KATAKANA_HO  0x32ed
-#define UNITEXT_CIRCLED_KATAKANA_HO  L"\u32ed"
+#define UNITEXT_CIRCLED_KATAKANA_HO  U"\u32ed"
 #define UNICODE_CIRCLED_KATAKANA_MA  0x32ee
-#define UNITEXT_CIRCLED_KATAKANA_MA  L"\u32ee"
+#define UNITEXT_CIRCLED_KATAKANA_MA  U"\u32ee"
 #define UNICODE_CIRCLED_KATAKANA_MI  0x32ef
-#define UNITEXT_CIRCLED_KATAKANA_MI  L"\u32ef"
+#define UNITEXT_CIRCLED_KATAKANA_MI  U"\u32ef"
 #define UNICODE_CIRCLED_KATAKANA_MU  0x32f0
-#define UNITEXT_CIRCLED_KATAKANA_MU  L"\u32f0"
+#define UNITEXT_CIRCLED_KATAKANA_MU  U"\u32f0"
 #define UNICODE_CIRCLED_KATAKANA_ME  0x32f1
-#define UNITEXT_CIRCLED_KATAKANA_ME  L"\u32f1"
+#define UNITEXT_CIRCLED_KATAKANA_ME  U"\u32f1"
 #define UNICODE_CIRCLED_KATAKANA_MO  0x32f2
-#define UNITEXT_CIRCLED_KATAKANA_MO  L"\u32f2"
+#define UNITEXT_CIRCLED_KATAKANA_MO  U"\u32f2"
 #define UNICODE_CIRCLED_KATAKANA_YA  0x32f3
-#define UNITEXT_CIRCLED_KATAKANA_YA  L"\u32f3"
+#define UNITEXT_CIRCLED_KATAKANA_YA  U"\u32f3"
 #define UNICODE_CIRCLED_KATAKANA_YU  0x32f4
-#define UNITEXT_CIRCLED_KATAKANA_YU  L"\u32f4"
+#define UNITEXT_CIRCLED_KATAKANA_YU  U"\u32f4"
 #define UNICODE_CIRCLED_KATAKANA_YO  0x32f5
-#define UNITEXT_CIRCLED_KATAKANA_YO  L"\u32f5"
+#define UNITEXT_CIRCLED_KATAKANA_YO  U"\u32f5"
 #define UNICODE_CIRCLED_KATAKANA_RA  0x32f6
-#define UNITEXT_CIRCLED_KATAKANA_RA  L"\u32f6"
+#define UNITEXT_CIRCLED_KATAKANA_RA  U"\u32f6"
 #define UNICODE_CIRCLED_KATAKANA_RI  0x32f7
-#define UNITEXT_CIRCLED_KATAKANA_RI  L"\u32f7"
+#define UNITEXT_CIRCLED_KATAKANA_RI  U"\u32f7"
 #define UNICODE_CIRCLED_KATAKANA_RU  0x32f8
-#define UNITEXT_CIRCLED_KATAKANA_RU  L"\u32f8"
+#define UNITEXT_CIRCLED_KATAKANA_RU  U"\u32f8"
 #define UNICODE_CIRCLED_KATAKANA_RE  0x32f9
-#define UNITEXT_CIRCLED_KATAKANA_RE  L"\u32f9"
+#define UNITEXT_CIRCLED_KATAKANA_RE  U"\u32f9"
 #define UNICODE_CIRCLED_KATAKANA_RO  0x32fa
-#define UNITEXT_CIRCLED_KATAKANA_RO  L"\u32fa"
+#define UNITEXT_CIRCLED_KATAKANA_RO  U"\u32fa"
 #define UNICODE_CIRCLED_KATAKANA_WA  0x32fb
-#define UNITEXT_CIRCLED_KATAKANA_WA  L"\u32fb"
+#define UNITEXT_CIRCLED_KATAKANA_WA  U"\u32fb"
 #define UNICODE_CIRCLED_KATAKANA_WI  0x32fc
-#define UNITEXT_CIRCLED_KATAKANA_WI  L"\u32fc"
+#define UNITEXT_CIRCLED_KATAKANA_WI  U"\u32fc"
 #define UNICODE_CIRCLED_KATAKANA_WE  0x32fd
-#define UNITEXT_CIRCLED_KATAKANA_WE  L"\u32fd"
+#define UNITEXT_CIRCLED_KATAKANA_WE  U"\u32fd"
 #define UNICODE_CIRCLED_KATAKANA_WO  0x32fe
-#define UNITEXT_CIRCLED_KATAKANA_WO  L"\u32fe"
+#define UNITEXT_CIRCLED_KATAKANA_WO  U"\u32fe"
 #define UNICODE_SQUARE_APAATO  0x3300
-#define UNITEXT_SQUARE_APAATO  L"\u3300"
+#define UNITEXT_SQUARE_APAATO  U"\u3300"
 #define UNICODE_SQUARE_ARUHUA  0x3301
-#define UNITEXT_SQUARE_ARUHUA  L"\u3301"
+#define UNITEXT_SQUARE_ARUHUA  U"\u3301"
 #define UNICODE_SQUARE_ANPEA  0x3302
-#define UNITEXT_SQUARE_ANPEA  L"\u3302"
+#define UNITEXT_SQUARE_ANPEA  U"\u3302"
 #define UNICODE_SQUARE_AARU  0x3303
-#define UNITEXT_SQUARE_AARU  L"\u3303"
+#define UNITEXT_SQUARE_AARU  U"\u3303"
 #define UNICODE_SQUARE_ININGU  0x3304
-#define UNITEXT_SQUARE_ININGU  L"\u3304"
+#define UNITEXT_SQUARE_ININGU  U"\u3304"
 #define UNICODE_SQUARE_INTI  0x3305
-#define UNITEXT_SQUARE_INTI  L"\u3305"
+#define UNITEXT_SQUARE_INTI  U"\u3305"
 #define UNICODE_SQUARE_UON  0x3306
-#define UNITEXT_SQUARE_UON  L"\u3306"
+#define UNITEXT_SQUARE_UON  U"\u3306"
 #define UNICODE_SQUARE_ESUKUUDO  0x3307
-#define UNITEXT_SQUARE_ESUKUUDO  L"\u3307"
+#define UNITEXT_SQUARE_ESUKUUDO  U"\u3307"
 #define UNICODE_SQUARE_EEKAA  0x3308
-#define UNITEXT_SQUARE_EEKAA  L"\u3308"
+#define UNITEXT_SQUARE_EEKAA  U"\u3308"
 #define UNICODE_SQUARE_ONSU  0x3309
-#define UNITEXT_SQUARE_ONSU  L"\u3309"
+#define UNITEXT_SQUARE_ONSU  U"\u3309"
 #define UNICODE_SQUARE_OOMU  0x330a
-#define UNITEXT_SQUARE_OOMU  L"\u330a"
+#define UNITEXT_SQUARE_OOMU  U"\u330a"
 #define UNICODE_SQUARE_KAIRI  0x330b
-#define UNITEXT_SQUARE_KAIRI  L"\u330b"
+#define UNITEXT_SQUARE_KAIRI  U"\u330b"
 #define UNICODE_SQUARE_KARATTO  0x330c
-#define UNITEXT_SQUARE_KARATTO  L"\u330c"
+#define UNITEXT_SQUARE_KARATTO  U"\u330c"
 #define UNICODE_SQUARE_KARORII  0x330d
-#define UNITEXT_SQUARE_KARORII  L"\u330d"
+#define UNITEXT_SQUARE_KARORII  U"\u330d"
 #define UNICODE_SQUARE_GARON  0x330e
-#define UNITEXT_SQUARE_GARON  L"\u330e"
+#define UNITEXT_SQUARE_GARON  U"\u330e"
 #define UNICODE_SQUARE_GANMA  0x330f
-#define UNITEXT_SQUARE_GANMA  L"\u330f"
+#define UNITEXT_SQUARE_GANMA  U"\u330f"
 #define UNICODE_SQUARE_GIGA  0x3310
-#define UNITEXT_SQUARE_GIGA  L"\u3310"
+#define UNITEXT_SQUARE_GIGA  U"\u3310"
 #define UNICODE_SQUARE_GINII  0x3311
-#define UNITEXT_SQUARE_GINII  L"\u3311"
+#define UNITEXT_SQUARE_GINII  U"\u3311"
 #define UNICODE_SQUARE_KYURII  0x3312
-#define UNITEXT_SQUARE_KYURII  L"\u3312"
+#define UNITEXT_SQUARE_KYURII  U"\u3312"
 #define UNICODE_SQUARE_GIRUDAA  0x3313
-#define UNITEXT_SQUARE_GIRUDAA  L"\u3313"
+#define UNITEXT_SQUARE_GIRUDAA  U"\u3313"
 #define UNICODE_SQUARE_KIRO  0x3314
-#define UNITEXT_SQUARE_KIRO  L"\u3314"
+#define UNITEXT_SQUARE_KIRO  U"\u3314"
 #define UNICODE_SQUARE_KIROGURAMU  0x3315
-#define UNITEXT_SQUARE_KIROGURAMU  L"\u3315"
+#define UNITEXT_SQUARE_KIROGURAMU  U"\u3315"
 #define UNICODE_SQUARE_KIROMEETORU  0x3316
-#define UNITEXT_SQUARE_KIROMEETORU  L"\u3316"
+#define UNITEXT_SQUARE_KIROMEETORU  U"\u3316"
 #define UNICODE_SQUARE_KIROWATTO  0x3317
-#define UNITEXT_SQUARE_KIROWATTO  L"\u3317"
+#define UNITEXT_SQUARE_KIROWATTO  U"\u3317"
 #define UNICODE_SQUARE_GURAMU  0x3318
-#define UNITEXT_SQUARE_GURAMU  L"\u3318"
+#define UNITEXT_SQUARE_GURAMU  U"\u3318"
 #define UNICODE_SQUARE_GURAMUTON  0x3319
-#define UNITEXT_SQUARE_GURAMUTON  L"\u3319"
+#define UNITEXT_SQUARE_GURAMUTON  U"\u3319"
 #define UNICODE_SQUARE_KURUZEIRO  0x331a
-#define UNITEXT_SQUARE_KURUZEIRO  L"\u331a"
+#define UNITEXT_SQUARE_KURUZEIRO  U"\u331a"
 #define UNICODE_SQUARE_KUROONE  0x331b
-#define UNITEXT_SQUARE_KUROONE  L"\u331b"
+#define UNITEXT_SQUARE_KUROONE  U"\u331b"
 #define UNICODE_SQUARE_KEESU  0x331c
-#define UNITEXT_SQUARE_KEESU  L"\u331c"
+#define UNITEXT_SQUARE_KEESU  U"\u331c"
 #define UNICODE_SQUARE_KORUNA  0x331d
-#define UNITEXT_SQUARE_KORUNA  L"\u331d"
+#define UNITEXT_SQUARE_KORUNA  U"\u331d"
 #define UNICODE_SQUARE_KOOPO  0x331e
-#define UNITEXT_SQUARE_KOOPO  L"\u331e"
+#define UNITEXT_SQUARE_KOOPO  U"\u331e"
 #define UNICODE_SQUARE_SAIKURU  0x331f
-#define UNITEXT_SQUARE_SAIKURU  L"\u331f"
+#define UNITEXT_SQUARE_SAIKURU  U"\u331f"
 #define UNICODE_SQUARE_SANTIIMU  0x3320
-#define UNITEXT_SQUARE_SANTIIMU  L"\u3320"
+#define UNITEXT_SQUARE_SANTIIMU  U"\u3320"
 #define UNICODE_SQUARE_SIRINGU  0x3321
-#define UNITEXT_SQUARE_SIRINGU  L"\u3321"
+#define UNITEXT_SQUARE_SIRINGU  U"\u3321"
 #define UNICODE_SQUARE_SENTI  0x3322
-#define UNITEXT_SQUARE_SENTI  L"\u3322"
+#define UNITEXT_SQUARE_SENTI  U"\u3322"
 #define UNICODE_SQUARE_SENTO  0x3323
-#define UNITEXT_SQUARE_SENTO  L"\u3323"
+#define UNITEXT_SQUARE_SENTO  U"\u3323"
 #define UNICODE_SQUARE_DAASU  0x3324
-#define UNITEXT_SQUARE_DAASU  L"\u3324"
+#define UNITEXT_SQUARE_DAASU  U"\u3324"
 #define UNICODE_SQUARE_DESI  0x3325
-#define UNITEXT_SQUARE_DESI  L"\u3325"
+#define UNITEXT_SQUARE_DESI  U"\u3325"
 #define UNICODE_SQUARE_DORU  0x3326
-#define UNITEXT_SQUARE_DORU  L"\u3326"
+#define UNITEXT_SQUARE_DORU  U"\u3326"
 #define UNICODE_SQUARE_TON  0x3327
-#define UNITEXT_SQUARE_TON  L"\u3327"
+#define UNITEXT_SQUARE_TON  U"\u3327"
 #define UNICODE_SQUARE_NANO  0x3328
-#define UNITEXT_SQUARE_NANO  L"\u3328"
+#define UNITEXT_SQUARE_NANO  U"\u3328"
 #define UNICODE_SQUARE_NOTTO  0x3329
-#define UNITEXT_SQUARE_NOTTO  L"\u3329"
+#define UNITEXT_SQUARE_NOTTO  U"\u3329"
 #define UNICODE_SQUARE_HAITU  0x332a
-#define UNITEXT_SQUARE_HAITU  L"\u332a"
+#define UNITEXT_SQUARE_HAITU  U"\u332a"
 #define UNICODE_SQUARE_PAASENTO  0x332b
-#define UNITEXT_SQUARE_PAASENTO  L"\u332b"
+#define UNITEXT_SQUARE_PAASENTO  U"\u332b"
 #define UNICODE_SQUARE_PAATU  0x332c
-#define UNITEXT_SQUARE_PAATU  L"\u332c"
+#define UNITEXT_SQUARE_PAATU  U"\u332c"
 #define UNICODE_SQUARE_BAARERU  0x332d
-#define UNITEXT_SQUARE_BAARERU  L"\u332d"
+#define UNITEXT_SQUARE_BAARERU  U"\u332d"
 #define UNICODE_SQUARE_PIASUTORU  0x332e
-#define UNITEXT_SQUARE_PIASUTORU  L"\u332e"
+#define UNITEXT_SQUARE_PIASUTORU  U"\u332e"
 #define UNICODE_SQUARE_PIKURU  0x332f
-#define UNITEXT_SQUARE_PIKURU  L"\u332f"
+#define UNITEXT_SQUARE_PIKURU  U"\u332f"
 #define UNICODE_SQUARE_PIKO  0x3330
-#define UNITEXT_SQUARE_PIKO  L"\u3330"
+#define UNITEXT_SQUARE_PIKO  U"\u3330"
 #define UNICODE_SQUARE_BIRU  0x3331
-#define UNITEXT_SQUARE_BIRU  L"\u3331"
+#define UNITEXT_SQUARE_BIRU  U"\u3331"
 #define UNICODE_SQUARE_HUARADDO  0x3332
-#define UNITEXT_SQUARE_HUARADDO  L"\u3332"
+#define UNITEXT_SQUARE_HUARADDO  U"\u3332"
 #define UNICODE_SQUARE_HUIITO  0x3333
-#define UNITEXT_SQUARE_HUIITO  L"\u3333"
+#define UNITEXT_SQUARE_HUIITO  U"\u3333"
 #define UNICODE_SQUARE_BUSSYERU  0x3334
-#define UNITEXT_SQUARE_BUSSYERU  L"\u3334"
+#define UNITEXT_SQUARE_BUSSYERU  U"\u3334"
 #define UNICODE_SQUARE_HURAN  0x3335
-#define UNITEXT_SQUARE_HURAN  L"\u3335"
+#define UNITEXT_SQUARE_HURAN  U"\u3335"
 #define UNICODE_SQUARE_HEKUTAARU  0x3336
-#define UNITEXT_SQUARE_HEKUTAARU  L"\u3336"
+#define UNITEXT_SQUARE_HEKUTAARU  U"\u3336"
 #define UNICODE_SQUARE_PESO  0x3337
-#define UNITEXT_SQUARE_PESO  L"\u3337"
+#define UNITEXT_SQUARE_PESO  U"\u3337"
 #define UNICODE_SQUARE_PENIHI  0x3338
-#define UNITEXT_SQUARE_PENIHI  L"\u3338"
+#define UNITEXT_SQUARE_PENIHI  U"\u3338"
 #define UNICODE_SQUARE_HERUTU  0x3339
-#define UNITEXT_SQUARE_HERUTU  L"\u3339"
+#define UNITEXT_SQUARE_HERUTU  U"\u3339"
 #define UNICODE_SQUARE_PENSU  0x333a
-#define UNITEXT_SQUARE_PENSU  L"\u333a"
+#define UNITEXT_SQUARE_PENSU  U"\u333a"
 #define UNICODE_SQUARE_PEEZI  0x333b
-#define UNITEXT_SQUARE_PEEZI  L"\u333b"
+#define UNITEXT_SQUARE_PEEZI  U"\u333b"
 #define UNICODE_SQUARE_BEETA  0x333c
-#define UNITEXT_SQUARE_BEETA  L"\u333c"
+#define UNITEXT_SQUARE_BEETA  U"\u333c"
 #define UNICODE_SQUARE_POINTO  0x333d
-#define UNITEXT_SQUARE_POINTO  L"\u333d"
+#define UNITEXT_SQUARE_POINTO  U"\u333d"
 #define UNICODE_SQUARE_BORUTO  0x333e
-#define UNITEXT_SQUARE_BORUTO  L"\u333e"
+#define UNITEXT_SQUARE_BORUTO  U"\u333e"
 #define UNICODE_SQUARE_HON  0x333f
-#define UNITEXT_SQUARE_HON  L"\u333f"
+#define UNITEXT_SQUARE_HON  U"\u333f"
 #define UNICODE_SQUARE_PONDO  0x3340
-#define UNITEXT_SQUARE_PONDO  L"\u3340"
+#define UNITEXT_SQUARE_PONDO  U"\u3340"
 #define UNICODE_SQUARE_HOORU  0x3341
-#define UNITEXT_SQUARE_HOORU  L"\u3341"
+#define UNITEXT_SQUARE_HOORU  U"\u3341"
 #define UNICODE_SQUARE_HOON  0x3342
-#define UNITEXT_SQUARE_HOON  L"\u3342"
+#define UNITEXT_SQUARE_HOON  U"\u3342"
 #define UNICODE_SQUARE_MAIKURO  0x3343
-#define UNITEXT_SQUARE_MAIKURO  L"\u3343"
+#define UNITEXT_SQUARE_MAIKURO  U"\u3343"
 #define UNICODE_SQUARE_MAIRU  0x3344
-#define UNITEXT_SQUARE_MAIRU  L"\u3344"
+#define UNITEXT_SQUARE_MAIRU  U"\u3344"
 #define UNICODE_SQUARE_MAHHA  0x3345
-#define UNITEXT_SQUARE_MAHHA  L"\u3345"
+#define UNITEXT_SQUARE_MAHHA  U"\u3345"
 #define UNICODE_SQUARE_MARUKU  0x3346
-#define UNITEXT_SQUARE_MARUKU  L"\u3346"
+#define UNITEXT_SQUARE_MARUKU  U"\u3346"
 #define UNICODE_SQUARE_MANSYON  0x3347
-#define UNITEXT_SQUARE_MANSYON  L"\u3347"
+#define UNITEXT_SQUARE_MANSYON  U"\u3347"
 #define UNICODE_SQUARE_MIKURON  0x3348
-#define UNITEXT_SQUARE_MIKURON  L"\u3348"
+#define UNITEXT_SQUARE_MIKURON  U"\u3348"
 #define UNICODE_SQUARE_MIRI  0x3349
-#define UNITEXT_SQUARE_MIRI  L"\u3349"
+#define UNITEXT_SQUARE_MIRI  U"\u3349"
 #define UNICODE_SQUARE_MIRIBAARU  0x334a
-#define UNITEXT_SQUARE_MIRIBAARU  L"\u334a"
+#define UNITEXT_SQUARE_MIRIBAARU  U"\u334a"
 #define UNICODE_SQUARE_MEGA  0x334b
-#define UNITEXT_SQUARE_MEGA  L"\u334b"
+#define UNITEXT_SQUARE_MEGA  U"\u334b"
 #define UNICODE_SQUARE_MEGATON  0x334c
-#define UNITEXT_SQUARE_MEGATON  L"\u334c"
+#define UNITEXT_SQUARE_MEGATON  U"\u334c"
 #define UNICODE_SQUARE_MEETORU  0x334d
-#define UNITEXT_SQUARE_MEETORU  L"\u334d"
+#define UNITEXT_SQUARE_MEETORU  U"\u334d"
 #define UNICODE_SQUARE_YAADO  0x334e
-#define UNITEXT_SQUARE_YAADO  L"\u334e"
+#define UNITEXT_SQUARE_YAADO  U"\u334e"
 #define UNICODE_SQUARE_YAARU  0x334f
-#define UNITEXT_SQUARE_YAARU  L"\u334f"
+#define UNITEXT_SQUARE_YAARU  U"\u334f"
 #define UNICODE_SQUARE_YUAN  0x3350
-#define UNITEXT_SQUARE_YUAN  L"\u3350"
+#define UNITEXT_SQUARE_YUAN  U"\u3350"
 #define UNICODE_SQUARE_RITTORU  0x3351
-#define UNITEXT_SQUARE_RITTORU  L"\u3351"
+#define UNITEXT_SQUARE_RITTORU  U"\u3351"
 #define UNICODE_SQUARE_RIRA  0x3352
-#define UNITEXT_SQUARE_RIRA  L"\u3352"
+#define UNITEXT_SQUARE_RIRA  U"\u3352"
 #define UNICODE_SQUARE_RUPII  0x3353
-#define UNITEXT_SQUARE_RUPII  L"\u3353"
+#define UNITEXT_SQUARE_RUPII  U"\u3353"
 #define UNICODE_SQUARE_RUUBURU  0x3354
-#define UNITEXT_SQUARE_RUUBURU  L"\u3354"
+#define UNITEXT_SQUARE_RUUBURU  U"\u3354"
 #define UNICODE_SQUARE_REMU  0x3355
-#define UNITEXT_SQUARE_REMU  L"\u3355"
+#define UNITEXT_SQUARE_REMU  U"\u3355"
 #define UNICODE_SQUARE_RENTOGEN  0x3356
-#define UNITEXT_SQUARE_RENTOGEN  L"\u3356"
+#define UNITEXT_SQUARE_RENTOGEN  U"\u3356"
 #define UNICODE_SQUARE_WATTO  0x3357
-#define UNITEXT_SQUARE_WATTO  L"\u3357"
+#define UNITEXT_SQUARE_WATTO  U"\u3357"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_ZERO  0x3358
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_ZERO  L"\u3358"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_ZERO  U"\u3358"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_ONE  0x3359
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_ONE  L"\u3359"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_ONE  U"\u3359"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWO  0x335a
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWO  L"\u335a"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWO  U"\u335a"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_THREE  0x335b
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_THREE  L"\u335b"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_THREE  U"\u335b"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FOUR  0x335c
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FOUR  L"\u335c"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FOUR  U"\u335c"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FIVE  0x335d
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FIVE  L"\u335d"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FIVE  U"\u335d"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SIX  0x335e
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SIX  L"\u335e"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SIX  U"\u335e"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SEVEN  0x335f
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SEVEN  L"\u335f"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SEVEN  U"\u335f"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_EIGHT  0x3360
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_EIGHT  L"\u3360"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_EIGHT  U"\u3360"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_NINE  0x3361
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_NINE  L"\u3361"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_NINE  U"\u3361"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TEN  0x3362
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TEN  L"\u3362"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TEN  U"\u3362"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_ELEVEN  0x3363
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_ELEVEN  L"\u3363"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_ELEVEN  U"\u3363"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWELVE  0x3364
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWELVE  L"\u3364"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWELVE  U"\u3364"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_THIRTEEN  0x3365
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_THIRTEEN  L"\u3365"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_THIRTEEN  U"\u3365"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FOURTEEN  0x3366
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FOURTEEN  L"\u3366"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FOURTEEN  U"\u3366"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FIFTEEN  0x3367
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FIFTEEN  L"\u3367"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_FIFTEEN  U"\u3367"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SIXTEEN  0x3368
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SIXTEEN  L"\u3368"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SIXTEEN  U"\u3368"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SEVENTEEN  0x3369
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SEVENTEEN  L"\u3369"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_SEVENTEEN  U"\u3369"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_EIGHTEEN  0x336a
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_EIGHTEEN  L"\u336a"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_EIGHTEEN  U"\u336a"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_NINETEEN  0x336b
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_NINETEEN  L"\u336b"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_NINETEEN  U"\u336b"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY  0x336c
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY  L"\u336c"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY  U"\u336c"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_ONE  0x336d
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_ONE  L"\u336d"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_ONE  U"\u336d"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_TWO  0x336e
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_TWO  L"\u336e"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_TWO  U"\u336e"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_THREE  0x336f
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_THREE  L"\u336f"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_THREE  U"\u336f"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_FOUR  0x3370
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_FOUR  L"\u3370"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_HOUR_TWENTY_FOUR  U"\u3370"
 #define UNICODE_SQUARE_HPA  0x3371
-#define UNITEXT_SQUARE_HPA  L"\u3371"
+#define UNITEXT_SQUARE_HPA  U"\u3371"
 #define UNICODE_SQUARE_DA  0x3372
-#define UNITEXT_SQUARE_DA  L"\u3372"
+#define UNITEXT_SQUARE_DA  U"\u3372"
 #define UNICODE_SQUARE_AU  0x3373
-#define UNITEXT_SQUARE_AU  L"\u3373"
+#define UNITEXT_SQUARE_AU  U"\u3373"
 #define UNICODE_SQUARE_BAR  0x3374
-#define UNITEXT_SQUARE_BAR  L"\u3374"
+#define UNITEXT_SQUARE_BAR  U"\u3374"
 #define UNICODE_SQUARE_OV  0x3375
-#define UNITEXT_SQUARE_OV  L"\u3375"
+#define UNITEXT_SQUARE_OV  U"\u3375"
 #define UNICODE_SQUARE_PC  0x3376
-#define UNITEXT_SQUARE_PC  L"\u3376"
+#define UNITEXT_SQUARE_PC  U"\u3376"
 #define UNICODE_SQUARE_DM  0x3377
-#define UNITEXT_SQUARE_DM  L"\u3377"
+#define UNITEXT_SQUARE_DM  U"\u3377"
 #define UNICODE_SQUARE_DM_SQUARED  0x3378
-#define UNITEXT_SQUARE_DM_SQUARED  L"\u3378"
+#define UNITEXT_SQUARE_DM_SQUARED  U"\u3378"
 #define UNICODE_SQUARE_DM_CUBED  0x3379
-#define UNITEXT_SQUARE_DM_CUBED  L"\u3379"
+#define UNITEXT_SQUARE_DM_CUBED  U"\u3379"
 #define UNICODE_SQUARE_IU  0x337a
-#define UNITEXT_SQUARE_IU  L"\u337a"
+#define UNITEXT_SQUARE_IU  U"\u337a"
 #define UNICODE_SQUARE_ERA_NAME_HEISEI  0x337b
-#define UNITEXT_SQUARE_ERA_NAME_HEISEI  L"\u337b"
+#define UNITEXT_SQUARE_ERA_NAME_HEISEI  U"\u337b"
 #define UNICODE_SQUARE_ERA_NAME_SYOUWA  0x337c
-#define UNITEXT_SQUARE_ERA_NAME_SYOUWA  L"\u337c"
+#define UNITEXT_SQUARE_ERA_NAME_SYOUWA  U"\u337c"
 #define UNICODE_SQUARE_ERA_NAME_TAISYOU  0x337d
-#define UNITEXT_SQUARE_ERA_NAME_TAISYOU  L"\u337d"
+#define UNITEXT_SQUARE_ERA_NAME_TAISYOU  U"\u337d"
 #define UNICODE_SQUARE_ERA_NAME_MEIZI  0x337e
-#define UNITEXT_SQUARE_ERA_NAME_MEIZI  L"\u337e"
+#define UNITEXT_SQUARE_ERA_NAME_MEIZI  U"\u337e"
 #define UNICODE_SQUARE_CORPORATION  0x337f
-#define UNITEXT_SQUARE_CORPORATION  L"\u337f"
+#define UNITEXT_SQUARE_CORPORATION  U"\u337f"
 #define UNICODE_SQUARE_PA_AMPS  0x3380
-#define UNITEXT_SQUARE_PA_AMPS  L"\u3380"
+#define UNITEXT_SQUARE_PA_AMPS  U"\u3380"
 #define UNICODE_SQUARE_NA  0x3381
-#define UNITEXT_SQUARE_NA  L"\u3381"
+#define UNITEXT_SQUARE_NA  U"\u3381"
 #define UNICODE_SQUARE_MU_A  0x3382
-#define UNITEXT_SQUARE_MU_A  L"\u3382"
+#define UNITEXT_SQUARE_MU_A  U"\u3382"
 #define UNICODE_SQUARE_MA  0x3383
-#define UNITEXT_SQUARE_MA  L"\u3383"
+#define UNITEXT_SQUARE_MA  U"\u3383"
 #define UNICODE_SQUARE_KA  0x3384
-#define UNITEXT_SQUARE_KA  L"\u3384"
+#define UNITEXT_SQUARE_KA  U"\u3384"
 #define UNICODE_SQUARE_KB  0x3385
-#define UNITEXT_SQUARE_KB  L"\u3385"
+#define UNITEXT_SQUARE_KB  U"\u3385"
 #define UNICODE_SQUARE_MB  0x3386
-#define UNITEXT_SQUARE_MB  L"\u3386"
+#define UNITEXT_SQUARE_MB  U"\u3386"
 #define UNICODE_SQUARE_GB  0x3387
-#define UNITEXT_SQUARE_GB  L"\u3387"
+#define UNITEXT_SQUARE_GB  U"\u3387"
 #define UNICODE_SQUARE_CAL  0x3388
-#define UNITEXT_SQUARE_CAL  L"\u3388"
+#define UNITEXT_SQUARE_CAL  U"\u3388"
 #define UNICODE_SQUARE_KCAL  0x3389
-#define UNITEXT_SQUARE_KCAL  L"\u3389"
+#define UNITEXT_SQUARE_KCAL  U"\u3389"
 #define UNICODE_SQUARE_PF  0x338a
-#define UNITEXT_SQUARE_PF  L"\u338a"
+#define UNITEXT_SQUARE_PF  U"\u338a"
 #define UNICODE_SQUARE_NF  0x338b
-#define UNITEXT_SQUARE_NF  L"\u338b"
+#define UNITEXT_SQUARE_NF  U"\u338b"
 #define UNICODE_SQUARE_MU_F  0x338c
-#define UNITEXT_SQUARE_MU_F  L"\u338c"
+#define UNITEXT_SQUARE_MU_F  U"\u338c"
 #define UNICODE_SQUARE_MU_G  0x338d
-#define UNITEXT_SQUARE_MU_G  L"\u338d"
+#define UNITEXT_SQUARE_MU_G  U"\u338d"
 #define UNICODE_SQUARE_MG  0x338e
-#define UNITEXT_SQUARE_MG  L"\u338e"
+#define UNITEXT_SQUARE_MG  U"\u338e"
 #define UNICODE_SQUARE_KG  0x338f
-#define UNITEXT_SQUARE_KG  L"\u338f"
+#define UNITEXT_SQUARE_KG  U"\u338f"
 #define UNICODE_SQUARE_HZ  0x3390
-#define UNITEXT_SQUARE_HZ  L"\u3390"
+#define UNITEXT_SQUARE_HZ  U"\u3390"
 #define UNICODE_SQUARE_KHZ  0x3391
-#define UNITEXT_SQUARE_KHZ  L"\u3391"
+#define UNITEXT_SQUARE_KHZ  U"\u3391"
 #define UNICODE_SQUARE_MHZ  0x3392
-#define UNITEXT_SQUARE_MHZ  L"\u3392"
+#define UNITEXT_SQUARE_MHZ  U"\u3392"
 #define UNICODE_SQUARE_GHZ  0x3393
-#define UNITEXT_SQUARE_GHZ  L"\u3393"
+#define UNITEXT_SQUARE_GHZ  U"\u3393"
 #define UNICODE_SQUARE_THZ  0x3394
-#define UNITEXT_SQUARE_THZ  L"\u3394"
+#define UNITEXT_SQUARE_THZ  U"\u3394"
 #define UNICODE_SQUARE_MU_L  0x3395
-#define UNITEXT_SQUARE_MU_L  L"\u3395"
+#define UNITEXT_SQUARE_MU_L  U"\u3395"
 #define UNICODE_SQUARE_ML  0x3396
-#define UNITEXT_SQUARE_ML  L"\u3396"
+#define UNITEXT_SQUARE_ML  U"\u3396"
 #define UNICODE_SQUARE_DL  0x3397
-#define UNITEXT_SQUARE_DL  L"\u3397"
+#define UNITEXT_SQUARE_DL  U"\u3397"
 #define UNICODE_SQUARE_KL  0x3398
-#define UNITEXT_SQUARE_KL  L"\u3398"
+#define UNITEXT_SQUARE_KL  U"\u3398"
 #define UNICODE_SQUARE_FM  0x3399
-#define UNITEXT_SQUARE_FM  L"\u3399"
+#define UNITEXT_SQUARE_FM  U"\u3399"
 #define UNICODE_SQUARE_NM  0x339a
-#define UNITEXT_SQUARE_NM  L"\u339a"
+#define UNITEXT_SQUARE_NM  U"\u339a"
 #define UNICODE_SQUARE_MU_M  0x339b
-#define UNITEXT_SQUARE_MU_M  L"\u339b"
+#define UNITEXT_SQUARE_MU_M  U"\u339b"
 #define UNICODE_SQUARE_MM  0x339c
-#define UNITEXT_SQUARE_MM  L"\u339c"
+#define UNITEXT_SQUARE_MM  U"\u339c"
 #define UNICODE_SQUARE_CM  0x339d
-#define UNITEXT_SQUARE_CM  L"\u339d"
+#define UNITEXT_SQUARE_CM  U"\u339d"
 #define UNICODE_SQUARE_KM  0x339e
-#define UNITEXT_SQUARE_KM  L"\u339e"
+#define UNITEXT_SQUARE_KM  U"\u339e"
 #define UNICODE_SQUARE_MM_SQUARED  0x339f
-#define UNITEXT_SQUARE_MM_SQUARED  L"\u339f"
+#define UNITEXT_SQUARE_MM_SQUARED  U"\u339f"
 #define UNICODE_SQUARE_CM_SQUARED  0x33a0
-#define UNITEXT_SQUARE_CM_SQUARED  L"\u33a0"
+#define UNITEXT_SQUARE_CM_SQUARED  U"\u33a0"
 #define UNICODE_SQUARE_M_SQUARED  0x33a1
-#define UNITEXT_SQUARE_M_SQUARED  L"\u33a1"
+#define UNITEXT_SQUARE_M_SQUARED  U"\u33a1"
 #define UNICODE_SQUARE_KM_SQUARED  0x33a2
-#define UNITEXT_SQUARE_KM_SQUARED  L"\u33a2"
+#define UNITEXT_SQUARE_KM_SQUARED  U"\u33a2"
 #define UNICODE_SQUARE_MM_CUBED  0x33a3
-#define UNITEXT_SQUARE_MM_CUBED  L"\u33a3"
+#define UNITEXT_SQUARE_MM_CUBED  U"\u33a3"
 #define UNICODE_SQUARE_CM_CUBED  0x33a4
-#define UNITEXT_SQUARE_CM_CUBED  L"\u33a4"
+#define UNITEXT_SQUARE_CM_CUBED  U"\u33a4"
 #define UNICODE_SQUARE_M_CUBED  0x33a5
-#define UNITEXT_SQUARE_M_CUBED  L"\u33a5"
+#define UNITEXT_SQUARE_M_CUBED  U"\u33a5"
 #define UNICODE_SQUARE_KM_CUBED  0x33a6
-#define UNITEXT_SQUARE_KM_CUBED  L"\u33a6"
+#define UNITEXT_SQUARE_KM_CUBED  U"\u33a6"
 #define UNICODE_SQUARE_M_OVER_S  0x33a7
-#define UNITEXT_SQUARE_M_OVER_S  L"\u33a7"
+#define UNITEXT_SQUARE_M_OVER_S  U"\u33a7"
 #define UNICODE_SQUARE_M_OVER_S_SQUARED  0x33a8
-#define UNITEXT_SQUARE_M_OVER_S_SQUARED  L"\u33a8"
+#define UNITEXT_SQUARE_M_OVER_S_SQUARED  U"\u33a8"
 #define UNICODE_SQUARE_PA  0x33a9
-#define UNITEXT_SQUARE_PA  L"\u33a9"
+#define UNITEXT_SQUARE_PA  U"\u33a9"
 #define UNICODE_SQUARE_KPA  0x33aa
-#define UNITEXT_SQUARE_KPA  L"\u33aa"
+#define UNITEXT_SQUARE_KPA  U"\u33aa"
 #define UNICODE_SQUARE_MPA  0x33ab
-#define UNITEXT_SQUARE_MPA  L"\u33ab"
+#define UNITEXT_SQUARE_MPA  U"\u33ab"
 #define UNICODE_SQUARE_GPA  0x33ac
-#define UNITEXT_SQUARE_GPA  L"\u33ac"
+#define UNITEXT_SQUARE_GPA  U"\u33ac"
 #define UNICODE_SQUARE_RAD  0x33ad
-#define UNITEXT_SQUARE_RAD  L"\u33ad"
+#define UNITEXT_SQUARE_RAD  U"\u33ad"
 #define UNICODE_SQUARE_RAD_OVER_S  0x33ae
-#define UNITEXT_SQUARE_RAD_OVER_S  L"\u33ae"
+#define UNITEXT_SQUARE_RAD_OVER_S  U"\u33ae"
 #define UNICODE_SQUARE_RAD_OVER_S_SQUARED  0x33af
-#define UNITEXT_SQUARE_RAD_OVER_S_SQUARED  L"\u33af"
+#define UNITEXT_SQUARE_RAD_OVER_S_SQUARED  U"\u33af"
 #define UNICODE_SQUARE_PS  0x33b0
-#define UNITEXT_SQUARE_PS  L"\u33b0"
+#define UNITEXT_SQUARE_PS  U"\u33b0"
 #define UNICODE_SQUARE_NS  0x33b1
-#define UNITEXT_SQUARE_NS  L"\u33b1"
+#define UNITEXT_SQUARE_NS  U"\u33b1"
 #define UNICODE_SQUARE_MU_S  0x33b2
-#define UNITEXT_SQUARE_MU_S  L"\u33b2"
+#define UNITEXT_SQUARE_MU_S  U"\u33b2"
 #define UNICODE_SQUARE_MS  0x33b3
-#define UNITEXT_SQUARE_MS  L"\u33b3"
+#define UNITEXT_SQUARE_MS  U"\u33b3"
 #define UNICODE_SQUARE_PV  0x33b4
-#define UNITEXT_SQUARE_PV  L"\u33b4"
+#define UNITEXT_SQUARE_PV  U"\u33b4"
 #define UNICODE_SQUARE_NV  0x33b5
-#define UNITEXT_SQUARE_NV  L"\u33b5"
+#define UNITEXT_SQUARE_NV  U"\u33b5"
 #define UNICODE_SQUARE_MU_V  0x33b6
-#define UNITEXT_SQUARE_MU_V  L"\u33b6"
+#define UNITEXT_SQUARE_MU_V  U"\u33b6"
 #define UNICODE_SQUARE_MV  0x33b7
-#define UNITEXT_SQUARE_MV  L"\u33b7"
+#define UNITEXT_SQUARE_MV  U"\u33b7"
 #define UNICODE_SQUARE_KV  0x33b8
-#define UNITEXT_SQUARE_KV  L"\u33b8"
+#define UNITEXT_SQUARE_KV  U"\u33b8"
 #define UNICODE_SQUARE_MV_MEGA  0x33b9
-#define UNITEXT_SQUARE_MV_MEGA  L"\u33b9"
+#define UNITEXT_SQUARE_MV_MEGA  U"\u33b9"
 #define UNICODE_SQUARE_PW  0x33ba
-#define UNITEXT_SQUARE_PW  L"\u33ba"
+#define UNITEXT_SQUARE_PW  U"\u33ba"
 #define UNICODE_SQUARE_NW  0x33bb
-#define UNITEXT_SQUARE_NW  L"\u33bb"
+#define UNITEXT_SQUARE_NW  U"\u33bb"
 #define UNICODE_SQUARE_MU_W  0x33bc
-#define UNITEXT_SQUARE_MU_W  L"\u33bc"
+#define UNITEXT_SQUARE_MU_W  U"\u33bc"
 #define UNICODE_SQUARE_MW  0x33bd
-#define UNITEXT_SQUARE_MW  L"\u33bd"
+#define UNITEXT_SQUARE_MW  U"\u33bd"
 #define UNICODE_SQUARE_KW  0x33be
-#define UNITEXT_SQUARE_KW  L"\u33be"
+#define UNITEXT_SQUARE_KW  U"\u33be"
 #define UNICODE_SQUARE_MW_MEGA  0x33bf
-#define UNITEXT_SQUARE_MW_MEGA  L"\u33bf"
+#define UNITEXT_SQUARE_MW_MEGA  U"\u33bf"
 #define UNICODE_SQUARE_K_OHM  0x33c0
-#define UNITEXT_SQUARE_K_OHM  L"\u33c0"
+#define UNITEXT_SQUARE_K_OHM  U"\u33c0"
 #define UNICODE_SQUARE_M_OHM  0x33c1
-#define UNITEXT_SQUARE_M_OHM  L"\u33c1"
+#define UNITEXT_SQUARE_M_OHM  U"\u33c1"
 #define UNICODE_SQUARE_AM  0x33c2
-#define UNITEXT_SQUARE_AM  L"\u33c2"
+#define UNITEXT_SQUARE_AM  U"\u33c2"
 #define UNICODE_SQUARE_BQ  0x33c3
-#define UNITEXT_SQUARE_BQ  L"\u33c3"
+#define UNITEXT_SQUARE_BQ  U"\u33c3"
 #define UNICODE_SQUARE_CC  0x33c4
-#define UNITEXT_SQUARE_CC  L"\u33c4"
+#define UNITEXT_SQUARE_CC  U"\u33c4"
 #define UNICODE_SQUARE_CD  0x33c5
-#define UNITEXT_SQUARE_CD  L"\u33c5"
+#define UNITEXT_SQUARE_CD  U"\u33c5"
 #define UNICODE_SQUARE_C_OVER_KG  0x33c6
-#define UNITEXT_SQUARE_C_OVER_KG  L"\u33c6"
+#define UNITEXT_SQUARE_C_OVER_KG  U"\u33c6"
 #define UNICODE_SQUARE_CO  0x33c7
-#define UNITEXT_SQUARE_CO  L"\u33c7"
+#define UNITEXT_SQUARE_CO  U"\u33c7"
 #define UNICODE_SQUARE_DB  0x33c8
-#define UNITEXT_SQUARE_DB  L"\u33c8"
+#define UNITEXT_SQUARE_DB  U"\u33c8"
 #define UNICODE_SQUARE_GY  0x33c9
-#define UNITEXT_SQUARE_GY  L"\u33c9"
+#define UNITEXT_SQUARE_GY  U"\u33c9"
 #define UNICODE_SQUARE_HA  0x33ca
-#define UNITEXT_SQUARE_HA  L"\u33ca"
+#define UNITEXT_SQUARE_HA  U"\u33ca"
 #define UNICODE_SQUARE_HP  0x33cb
-#define UNITEXT_SQUARE_HP  L"\u33cb"
+#define UNITEXT_SQUARE_HP  U"\u33cb"
 #define UNICODE_SQUARE_IN  0x33cc
-#define UNITEXT_SQUARE_IN  L"\u33cc"
+#define UNITEXT_SQUARE_IN  U"\u33cc"
 #define UNICODE_SQUARE_KK  0x33cd
-#define UNITEXT_SQUARE_KK  L"\u33cd"
+#define UNITEXT_SQUARE_KK  U"\u33cd"
 #define UNICODE_SQUARE_KM_CAPITAL  0x33ce
-#define UNITEXT_SQUARE_KM_CAPITAL  L"\u33ce"
+#define UNITEXT_SQUARE_KM_CAPITAL  U"\u33ce"
 #define UNICODE_SQUARE_KT  0x33cf
-#define UNITEXT_SQUARE_KT  L"\u33cf"
+#define UNITEXT_SQUARE_KT  U"\u33cf"
 #define UNICODE_SQUARE_LM  0x33d0
-#define UNITEXT_SQUARE_LM  L"\u33d0"
+#define UNITEXT_SQUARE_LM  U"\u33d0"
 #define UNICODE_SQUARE_LN  0x33d1
-#define UNITEXT_SQUARE_LN  L"\u33d1"
+#define UNITEXT_SQUARE_LN  U"\u33d1"
 #define UNICODE_SQUARE_LOG  0x33d2
-#define UNITEXT_SQUARE_LOG  L"\u33d2"
+#define UNITEXT_SQUARE_LOG  U"\u33d2"
 #define UNICODE_SQUARE_LX  0x33d3
-#define UNITEXT_SQUARE_LX  L"\u33d3"
+#define UNITEXT_SQUARE_LX  U"\u33d3"
 #define UNICODE_SQUARE_MB_SMALL  0x33d4
-#define UNITEXT_SQUARE_MB_SMALL  L"\u33d4"
+#define UNITEXT_SQUARE_MB_SMALL  U"\u33d4"
 #define UNICODE_SQUARE_MIL  0x33d5
-#define UNITEXT_SQUARE_MIL  L"\u33d5"
+#define UNITEXT_SQUARE_MIL  U"\u33d5"
 #define UNICODE_SQUARE_MOL  0x33d6
-#define UNITEXT_SQUARE_MOL  L"\u33d6"
+#define UNITEXT_SQUARE_MOL  U"\u33d6"
 #define UNICODE_SQUARE_PH  0x33d7
-#define UNITEXT_SQUARE_PH  L"\u33d7"
+#define UNITEXT_SQUARE_PH  U"\u33d7"
 #define UNICODE_SQUARE_PM  0x33d8
-#define UNITEXT_SQUARE_PM  L"\u33d8"
+#define UNITEXT_SQUARE_PM  U"\u33d8"
 #define UNICODE_SQUARE_PPM  0x33d9
-#define UNITEXT_SQUARE_PPM  L"\u33d9"
+#define UNITEXT_SQUARE_PPM  U"\u33d9"
 #define UNICODE_SQUARE_PR  0x33da
-#define UNITEXT_SQUARE_PR  L"\u33da"
+#define UNITEXT_SQUARE_PR  U"\u33da"
 #define UNICODE_SQUARE_SR  0x33db
-#define UNITEXT_SQUARE_SR  L"\u33db"
+#define UNITEXT_SQUARE_SR  U"\u33db"
 #define UNICODE_SQUARE_SV  0x33dc
-#define UNITEXT_SQUARE_SV  L"\u33dc"
+#define UNITEXT_SQUARE_SV  U"\u33dc"
 #define UNICODE_SQUARE_WB  0x33dd
-#define UNITEXT_SQUARE_WB  L"\u33dd"
+#define UNITEXT_SQUARE_WB  U"\u33dd"
 #define UNICODE_SQUARE_V_OVER_M  0x33de
-#define UNITEXT_SQUARE_V_OVER_M  L"\u33de"
+#define UNITEXT_SQUARE_V_OVER_M  U"\u33de"
 #define UNICODE_SQUARE_A_OVER_M  0x33df
-#define UNITEXT_SQUARE_A_OVER_M  L"\u33df"
+#define UNITEXT_SQUARE_A_OVER_M  U"\u33df"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_ONE  0x33e0
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_ONE  L"\u33e0"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_ONE  U"\u33e0"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWO  0x33e1
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWO  L"\u33e1"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWO  U"\u33e1"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THREE  0x33e2
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THREE  L"\u33e2"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THREE  U"\u33e2"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FOUR  0x33e3
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FOUR  L"\u33e3"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FOUR  U"\u33e3"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FIVE  0x33e4
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FIVE  L"\u33e4"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FIVE  U"\u33e4"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SIX  0x33e5
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SIX  L"\u33e5"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SIX  U"\u33e5"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SEVEN  0x33e6
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SEVEN  L"\u33e6"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SEVEN  U"\u33e6"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_EIGHT  0x33e7
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_EIGHT  L"\u33e7"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_EIGHT  U"\u33e7"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_NINE  0x33e8
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_NINE  L"\u33e8"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_NINE  U"\u33e8"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TEN  0x33e9
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TEN  L"\u33e9"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TEN  U"\u33e9"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_ELEVEN  0x33ea
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_ELEVEN  L"\u33ea"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_ELEVEN  U"\u33ea"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWELVE  0x33eb
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWELVE  L"\u33eb"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWELVE  U"\u33eb"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THIRTEEN  0x33ec
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THIRTEEN  L"\u33ec"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THIRTEEN  U"\u33ec"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FOURTEEN  0x33ed
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FOURTEEN  L"\u33ed"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FOURTEEN  U"\u33ed"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FIFTEEN  0x33ee
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FIFTEEN  L"\u33ee"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_FIFTEEN  U"\u33ee"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SIXTEEN  0x33ef
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SIXTEEN  L"\u33ef"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SIXTEEN  U"\u33ef"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SEVENTEEN  0x33f0
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SEVENTEEN  L"\u33f0"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_SEVENTEEN  U"\u33f0"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_EIGHTEEN  0x33f1
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_EIGHTEEN  L"\u33f1"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_EIGHTEEN  U"\u33f1"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_NINETEEN  0x33f2
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_NINETEEN  L"\u33f2"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_NINETEEN  U"\u33f2"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY  0x33f3
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY  L"\u33f3"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY  U"\u33f3"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_ONE  0x33f4
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_ONE  L"\u33f4"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_ONE  U"\u33f4"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_TWO  0x33f5
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_TWO  L"\u33f5"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_TWO  U"\u33f5"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_THREE  0x33f6
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_THREE  L"\u33f6"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_THREE  U"\u33f6"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_FOUR  0x33f7
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_FOUR  L"\u33f7"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_FOUR  U"\u33f7"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_FIVE  0x33f8
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_FIVE  L"\u33f8"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_FIVE  U"\u33f8"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_SIX  0x33f9
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_SIX  L"\u33f9"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_SIX  U"\u33f9"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_SEVEN  0x33fa
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_SEVEN  L"\u33fa"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_SEVEN  U"\u33fa"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_EIGHT  0x33fb
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_EIGHT  L"\u33fb"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_EIGHT  U"\u33fb"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_NINE  0x33fc
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_NINE  L"\u33fc"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_TWENTY_NINE  U"\u33fc"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THIRTY  0x33fd
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THIRTY  L"\u33fd"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THIRTY  U"\u33fd"
 #define UNICODE_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THIRTY_ONE  0x33fe
-#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THIRTY_ONE  L"\u33fe"
+#define UNITEXT_IDEOGRAPHIC_TELEGRAPH_SYMBOL_FOR_DAY_THIRTY_ONE  U"\u33fe"
 #define UNICODE_SQUARE_GAL  0x33ff
-#define UNITEXT_SQUARE_GAL  L"\u33ff"
+#define UNITEXT_SQUARE_GAL  U"\u33ff"
 #define UNICODE_HEXAGRAM_FOR_THE_CREATIVE_HEAVEN  0x4dc0
-#define UNITEXT_HEXAGRAM_FOR_THE_CREATIVE_HEAVEN  L"\u4dc0"
+#define UNITEXT_HEXAGRAM_FOR_THE_CREATIVE_HEAVEN  U"\u4dc0"
 #define UNICODE_HEXAGRAM_FOR_THE_RECEPTIVE_EARTH  0x4dc1
-#define UNITEXT_HEXAGRAM_FOR_THE_RECEPTIVE_EARTH  L"\u4dc1"
+#define UNITEXT_HEXAGRAM_FOR_THE_RECEPTIVE_EARTH  U"\u4dc1"
 #define UNICODE_HEXAGRAM_FOR_DIFFICULTY_AT_THE_BEGINNING  0x4dc2
-#define UNITEXT_HEXAGRAM_FOR_DIFFICULTY_AT_THE_BEGINNING  L"\u4dc2"
+#define UNITEXT_HEXAGRAM_FOR_DIFFICULTY_AT_THE_BEGINNING  U"\u4dc2"
 #define UNICODE_HEXAGRAM_FOR_YOUTHFUL_FOLLY  0x4dc3
-#define UNITEXT_HEXAGRAM_FOR_YOUTHFUL_FOLLY  L"\u4dc3"
+#define UNITEXT_HEXAGRAM_FOR_YOUTHFUL_FOLLY  U"\u4dc3"
 #define UNICODE_HEXAGRAM_FOR_WAITING  0x4dc4
-#define UNITEXT_HEXAGRAM_FOR_WAITING  L"\u4dc4"
+#define UNITEXT_HEXAGRAM_FOR_WAITING  U"\u4dc4"
 #define UNICODE_HEXAGRAM_FOR_CONFLICT  0x4dc5
-#define UNITEXT_HEXAGRAM_FOR_CONFLICT  L"\u4dc5"
+#define UNITEXT_HEXAGRAM_FOR_CONFLICT  U"\u4dc5"
 #define UNICODE_HEXAGRAM_FOR_THE_ARMY  0x4dc6
-#define UNITEXT_HEXAGRAM_FOR_THE_ARMY  L"\u4dc6"
+#define UNITEXT_HEXAGRAM_FOR_THE_ARMY  U"\u4dc6"
 #define UNICODE_HEXAGRAM_FOR_HOLDING_TOGETHER  0x4dc7
-#define UNITEXT_HEXAGRAM_FOR_HOLDING_TOGETHER  L"\u4dc7"
+#define UNITEXT_HEXAGRAM_FOR_HOLDING_TOGETHER  U"\u4dc7"
 #define UNICODE_HEXAGRAM_FOR_SMALL_TAMING  0x4dc8
-#define UNITEXT_HEXAGRAM_FOR_SMALL_TAMING  L"\u4dc8"
+#define UNITEXT_HEXAGRAM_FOR_SMALL_TAMING  U"\u4dc8"
 #define UNICODE_HEXAGRAM_FOR_TREADING  0x4dc9
-#define UNITEXT_HEXAGRAM_FOR_TREADING  L"\u4dc9"
+#define UNITEXT_HEXAGRAM_FOR_TREADING  U"\u4dc9"
 #define UNICODE_HEXAGRAM_FOR_PEACE  0x4dca
-#define UNITEXT_HEXAGRAM_FOR_PEACE  L"\u4dca"
+#define UNITEXT_HEXAGRAM_FOR_PEACE  U"\u4dca"
 #define UNICODE_HEXAGRAM_FOR_STANDSTILL  0x4dcb
-#define UNITEXT_HEXAGRAM_FOR_STANDSTILL  L"\u4dcb"
+#define UNITEXT_HEXAGRAM_FOR_STANDSTILL  U"\u4dcb"
 #define UNICODE_HEXAGRAM_FOR_FELLOWSHIP  0x4dcc
-#define UNITEXT_HEXAGRAM_FOR_FELLOWSHIP  L"\u4dcc"
+#define UNITEXT_HEXAGRAM_FOR_FELLOWSHIP  U"\u4dcc"
 #define UNICODE_HEXAGRAM_FOR_GREAT_POSSESSION  0x4dcd
-#define UNITEXT_HEXAGRAM_FOR_GREAT_POSSESSION  L"\u4dcd"
+#define UNITEXT_HEXAGRAM_FOR_GREAT_POSSESSION  U"\u4dcd"
 #define UNICODE_HEXAGRAM_FOR_MODESTY  0x4dce
-#define UNITEXT_HEXAGRAM_FOR_MODESTY  L"\u4dce"
+#define UNITEXT_HEXAGRAM_FOR_MODESTY  U"\u4dce"
 #define UNICODE_HEXAGRAM_FOR_ENTHUSIASM  0x4dcf
-#define UNITEXT_HEXAGRAM_FOR_ENTHUSIASM  L"\u4dcf"
+#define UNITEXT_HEXAGRAM_FOR_ENTHUSIASM  U"\u4dcf"
 #define UNICODE_HEXAGRAM_FOR_FOLLOWING  0x4dd0
-#define UNITEXT_HEXAGRAM_FOR_FOLLOWING  L"\u4dd0"
+#define UNITEXT_HEXAGRAM_FOR_FOLLOWING  U"\u4dd0"
 #define UNICODE_HEXAGRAM_FOR_WORK_ON_THE_DECAYED  0x4dd1
-#define UNITEXT_HEXAGRAM_FOR_WORK_ON_THE_DECAYED  L"\u4dd1"
+#define UNITEXT_HEXAGRAM_FOR_WORK_ON_THE_DECAYED  U"\u4dd1"
 #define UNICODE_HEXAGRAM_FOR_APPROACH  0x4dd2
-#define UNITEXT_HEXAGRAM_FOR_APPROACH  L"\u4dd2"
+#define UNITEXT_HEXAGRAM_FOR_APPROACH  U"\u4dd2"
 #define UNICODE_HEXAGRAM_FOR_CONTEMPLATION  0x4dd3
-#define UNITEXT_HEXAGRAM_FOR_CONTEMPLATION  L"\u4dd3"
+#define UNITEXT_HEXAGRAM_FOR_CONTEMPLATION  U"\u4dd3"
 #define UNICODE_HEXAGRAM_FOR_BITING_THROUGH  0x4dd4
-#define UNITEXT_HEXAGRAM_FOR_BITING_THROUGH  L"\u4dd4"
+#define UNITEXT_HEXAGRAM_FOR_BITING_THROUGH  U"\u4dd4"
 #define UNICODE_HEXAGRAM_FOR_GRACE  0x4dd5
-#define UNITEXT_HEXAGRAM_FOR_GRACE  L"\u4dd5"
+#define UNITEXT_HEXAGRAM_FOR_GRACE  U"\u4dd5"
 #define UNICODE_HEXAGRAM_FOR_SPLITTING_APART  0x4dd6
-#define UNITEXT_HEXAGRAM_FOR_SPLITTING_APART  L"\u4dd6"
+#define UNITEXT_HEXAGRAM_FOR_SPLITTING_APART  U"\u4dd6"
 #define UNICODE_HEXAGRAM_FOR_RETURN  0x4dd7
-#define UNITEXT_HEXAGRAM_FOR_RETURN  L"\u4dd7"
+#define UNITEXT_HEXAGRAM_FOR_RETURN  U"\u4dd7"
 #define UNICODE_HEXAGRAM_FOR_INNOCENCE  0x4dd8
-#define UNITEXT_HEXAGRAM_FOR_INNOCENCE  L"\u4dd8"
+#define UNITEXT_HEXAGRAM_FOR_INNOCENCE  U"\u4dd8"
 #define UNICODE_HEXAGRAM_FOR_GREAT_TAMING  0x4dd9
-#define UNITEXT_HEXAGRAM_FOR_GREAT_TAMING  L"\u4dd9"
+#define UNITEXT_HEXAGRAM_FOR_GREAT_TAMING  U"\u4dd9"
 #define UNICODE_HEXAGRAM_FOR_MOUTH_CORNERS  0x4dda
-#define UNITEXT_HEXAGRAM_FOR_MOUTH_CORNERS  L"\u4dda"
+#define UNITEXT_HEXAGRAM_FOR_MOUTH_CORNERS  U"\u4dda"
 #define UNICODE_HEXAGRAM_FOR_GREAT_PREPONDERANCE  0x4ddb
-#define UNITEXT_HEXAGRAM_FOR_GREAT_PREPONDERANCE  L"\u4ddb"
+#define UNITEXT_HEXAGRAM_FOR_GREAT_PREPONDERANCE  U"\u4ddb"
 #define UNICODE_HEXAGRAM_FOR_THE_ABYSMAL_WATER  0x4ddc
-#define UNITEXT_HEXAGRAM_FOR_THE_ABYSMAL_WATER  L"\u4ddc"
+#define UNITEXT_HEXAGRAM_FOR_THE_ABYSMAL_WATER  U"\u4ddc"
 #define UNICODE_HEXAGRAM_FOR_THE_CLINGING_FIRE  0x4ddd
-#define UNITEXT_HEXAGRAM_FOR_THE_CLINGING_FIRE  L"\u4ddd"
+#define UNITEXT_HEXAGRAM_FOR_THE_CLINGING_FIRE  U"\u4ddd"
 #define UNICODE_HEXAGRAM_FOR_INFLUENCE  0x4dde
-#define UNITEXT_HEXAGRAM_FOR_INFLUENCE  L"\u4dde"
+#define UNITEXT_HEXAGRAM_FOR_INFLUENCE  U"\u4dde"
 #define UNICODE_HEXAGRAM_FOR_DURATION  0x4ddf
-#define UNITEXT_HEXAGRAM_FOR_DURATION  L"\u4ddf"
+#define UNITEXT_HEXAGRAM_FOR_DURATION  U"\u4ddf"
 #define UNICODE_HEXAGRAM_FOR_RETREAT  0x4de0
-#define UNITEXT_HEXAGRAM_FOR_RETREAT  L"\u4de0"
+#define UNITEXT_HEXAGRAM_FOR_RETREAT  U"\u4de0"
 #define UNICODE_HEXAGRAM_FOR_GREAT_POWER  0x4de1
-#define UNITEXT_HEXAGRAM_FOR_GREAT_POWER  L"\u4de1"
+#define UNITEXT_HEXAGRAM_FOR_GREAT_POWER  U"\u4de1"
 #define UNICODE_HEXAGRAM_FOR_PROGRESS  0x4de2
-#define UNITEXT_HEXAGRAM_FOR_PROGRESS  L"\u4de2"
+#define UNITEXT_HEXAGRAM_FOR_PROGRESS  U"\u4de2"
 #define UNICODE_HEXAGRAM_FOR_DARKENING_OF_THE_LIGHT  0x4de3
-#define UNITEXT_HEXAGRAM_FOR_DARKENING_OF_THE_LIGHT  L"\u4de3"
+#define UNITEXT_HEXAGRAM_FOR_DARKENING_OF_THE_LIGHT  U"\u4de3"
 #define UNICODE_HEXAGRAM_FOR_THE_FAMILY  0x4de4
-#define UNITEXT_HEXAGRAM_FOR_THE_FAMILY  L"\u4de4"
+#define UNITEXT_HEXAGRAM_FOR_THE_FAMILY  U"\u4de4"
 #define UNICODE_HEXAGRAM_FOR_OPPOSITION  0x4de5
-#define UNITEXT_HEXAGRAM_FOR_OPPOSITION  L"\u4de5"
+#define UNITEXT_HEXAGRAM_FOR_OPPOSITION  U"\u4de5"
 #define UNICODE_HEXAGRAM_FOR_OBSTRUCTION  0x4de6
-#define UNITEXT_HEXAGRAM_FOR_OBSTRUCTION  L"\u4de6"
+#define UNITEXT_HEXAGRAM_FOR_OBSTRUCTION  U"\u4de6"
 #define UNICODE_HEXAGRAM_FOR_DELIVERANCE  0x4de7
-#define UNITEXT_HEXAGRAM_FOR_DELIVERANCE  L"\u4de7"
+#define UNITEXT_HEXAGRAM_FOR_DELIVERANCE  U"\u4de7"
 #define UNICODE_HEXAGRAM_FOR_DECREASE  0x4de8
-#define UNITEXT_HEXAGRAM_FOR_DECREASE  L"\u4de8"
+#define UNITEXT_HEXAGRAM_FOR_DECREASE  U"\u4de8"
 #define UNICODE_HEXAGRAM_FOR_INCREASE  0x4de9
-#define UNITEXT_HEXAGRAM_FOR_INCREASE  L"\u4de9"
+#define UNITEXT_HEXAGRAM_FOR_INCREASE  U"\u4de9"
 #define UNICODE_HEXAGRAM_FOR_BREAKTHROUGH  0x4dea
-#define UNITEXT_HEXAGRAM_FOR_BREAKTHROUGH  L"\u4dea"
+#define UNITEXT_HEXAGRAM_FOR_BREAKTHROUGH  U"\u4dea"
 #define UNICODE_HEXAGRAM_FOR_COMING_TO_MEET  0x4deb
-#define UNITEXT_HEXAGRAM_FOR_COMING_TO_MEET  L"\u4deb"
+#define UNITEXT_HEXAGRAM_FOR_COMING_TO_MEET  U"\u4deb"
 #define UNICODE_HEXAGRAM_FOR_GATHERING_TOGETHER  0x4dec
-#define UNITEXT_HEXAGRAM_FOR_GATHERING_TOGETHER  L"\u4dec"
+#define UNITEXT_HEXAGRAM_FOR_GATHERING_TOGETHER  U"\u4dec"
 #define UNICODE_HEXAGRAM_FOR_PUSHING_UPWARD  0x4ded
-#define UNITEXT_HEXAGRAM_FOR_PUSHING_UPWARD  L"\u4ded"
+#define UNITEXT_HEXAGRAM_FOR_PUSHING_UPWARD  U"\u4ded"
 #define UNICODE_HEXAGRAM_FOR_OPPRESSION  0x4dee
-#define UNITEXT_HEXAGRAM_FOR_OPPRESSION  L"\u4dee"
+#define UNITEXT_HEXAGRAM_FOR_OPPRESSION  U"\u4dee"
 #define UNICODE_HEXAGRAM_FOR_THE_WELL  0x4def
-#define UNITEXT_HEXAGRAM_FOR_THE_WELL  L"\u4def"
+#define UNITEXT_HEXAGRAM_FOR_THE_WELL  U"\u4def"
 #define UNICODE_HEXAGRAM_FOR_REVOLUTION  0x4df0
-#define UNITEXT_HEXAGRAM_FOR_REVOLUTION  L"\u4df0"
+#define UNITEXT_HEXAGRAM_FOR_REVOLUTION  U"\u4df0"
 #define UNICODE_HEXAGRAM_FOR_THE_CAULDRON  0x4df1
-#define UNITEXT_HEXAGRAM_FOR_THE_CAULDRON  L"\u4df1"
+#define UNITEXT_HEXAGRAM_FOR_THE_CAULDRON  U"\u4df1"
 #define UNICODE_HEXAGRAM_FOR_THE_AROUSING_THUNDER  0x4df2
-#define UNITEXT_HEXAGRAM_FOR_THE_AROUSING_THUNDER  L"\u4df2"
+#define UNITEXT_HEXAGRAM_FOR_THE_AROUSING_THUNDER  U"\u4df2"
 #define UNICODE_HEXAGRAM_FOR_THE_KEEPING_STILL_MOUNTAIN  0x4df3
-#define UNITEXT_HEXAGRAM_FOR_THE_KEEPING_STILL_MOUNTAIN  L"\u4df3"
+#define UNITEXT_HEXAGRAM_FOR_THE_KEEPING_STILL_MOUNTAIN  U"\u4df3"
 #define UNICODE_HEXAGRAM_FOR_DEVELOPMENT  0x4df4
-#define UNITEXT_HEXAGRAM_FOR_DEVELOPMENT  L"\u4df4"
+#define UNITEXT_HEXAGRAM_FOR_DEVELOPMENT  U"\u4df4"
 #define UNICODE_HEXAGRAM_FOR_THE_MARRYING_MAIDEN  0x4df5
-#define UNITEXT_HEXAGRAM_FOR_THE_MARRYING_MAIDEN  L"\u4df5"
+#define UNITEXT_HEXAGRAM_FOR_THE_MARRYING_MAIDEN  U"\u4df5"
 #define UNICODE_HEXAGRAM_FOR_ABUNDANCE  0x4df6
-#define UNITEXT_HEXAGRAM_FOR_ABUNDANCE  L"\u4df6"
+#define UNITEXT_HEXAGRAM_FOR_ABUNDANCE  U"\u4df6"
 #define UNICODE_HEXAGRAM_FOR_THE_WANDERER  0x4df7
-#define UNITEXT_HEXAGRAM_FOR_THE_WANDERER  L"\u4df7"
+#define UNITEXT_HEXAGRAM_FOR_THE_WANDERER  U"\u4df7"
 #define UNICODE_HEXAGRAM_FOR_THE_GENTLE_WIND  0x4df8
-#define UNITEXT_HEXAGRAM_FOR_THE_GENTLE_WIND  L"\u4df8"
+#define UNITEXT_HEXAGRAM_FOR_THE_GENTLE_WIND  U"\u4df8"
 #define UNICODE_HEXAGRAM_FOR_THE_JOYOUS_LAKE  0x4df9
-#define UNITEXT_HEXAGRAM_FOR_THE_JOYOUS_LAKE  L"\u4df9"
+#define UNITEXT_HEXAGRAM_FOR_THE_JOYOUS_LAKE  U"\u4df9"
 #define UNICODE_HEXAGRAM_FOR_DISPERSION  0x4dfa
-#define UNITEXT_HEXAGRAM_FOR_DISPERSION  L"\u4dfa"
+#define UNITEXT_HEXAGRAM_FOR_DISPERSION  U"\u4dfa"
 #define UNICODE_HEXAGRAM_FOR_LIMITATION  0x4dfb
-#define UNITEXT_HEXAGRAM_FOR_LIMITATION  L"\u4dfb"
+#define UNITEXT_HEXAGRAM_FOR_LIMITATION  U"\u4dfb"
 #define UNICODE_HEXAGRAM_FOR_INNER_TRUTH  0x4dfc
-#define UNITEXT_HEXAGRAM_FOR_INNER_TRUTH  L"\u4dfc"
+#define UNITEXT_HEXAGRAM_FOR_INNER_TRUTH  U"\u4dfc"
 #define UNICODE_HEXAGRAM_FOR_SMALL_PREPONDERANCE  0x4dfd
-#define UNITEXT_HEXAGRAM_FOR_SMALL_PREPONDERANCE  L"\u4dfd"
+#define UNITEXT_HEXAGRAM_FOR_SMALL_PREPONDERANCE  U"\u4dfd"
 #define UNICODE_HEXAGRAM_FOR_AFTER_COMPLETION  0x4dfe
-#define UNITEXT_HEXAGRAM_FOR_AFTER_COMPLETION  L"\u4dfe"
+#define UNITEXT_HEXAGRAM_FOR_AFTER_COMPLETION  U"\u4dfe"
 #define UNICODE_HEXAGRAM_FOR_BEFORE_COMPLETION  0x4dff
-#define UNITEXT_HEXAGRAM_FOR_BEFORE_COMPLETION  L"\u4dff"
+#define UNITEXT_HEXAGRAM_FOR_BEFORE_COMPLETION  U"\u4dff"
 #define UNICODE_YI_SYLLABLE_IT  0xa000
-#define UNITEXT_YI_SYLLABLE_IT  L"\ua000"
+#define UNITEXT_YI_SYLLABLE_IT  U"\ua000"
 #define UNICODE_YI_SYLLABLE_IX  0xa001
-#define UNITEXT_YI_SYLLABLE_IX  L"\ua001"
+#define UNITEXT_YI_SYLLABLE_IX  U"\ua001"
 #define UNICODE_YI_SYLLABLE_I  0xa002
-#define UNITEXT_YI_SYLLABLE_I  L"\ua002"
+#define UNITEXT_YI_SYLLABLE_I  U"\ua002"
 #define UNICODE_YI_SYLLABLE_IP  0xa003
-#define UNITEXT_YI_SYLLABLE_IP  L"\ua003"
+#define UNITEXT_YI_SYLLABLE_IP  U"\ua003"
 #define UNICODE_YI_SYLLABLE_IET  0xa004
-#define UNITEXT_YI_SYLLABLE_IET  L"\ua004"
+#define UNITEXT_YI_SYLLABLE_IET  U"\ua004"
 #define UNICODE_YI_SYLLABLE_IEX  0xa005
-#define UNITEXT_YI_SYLLABLE_IEX  L"\ua005"
+#define UNITEXT_YI_SYLLABLE_IEX  U"\ua005"
 #define UNICODE_YI_SYLLABLE_IE  0xa006
-#define UNITEXT_YI_SYLLABLE_IE  L"\ua006"
+#define UNITEXT_YI_SYLLABLE_IE  U"\ua006"
 #define UNICODE_YI_SYLLABLE_IEP  0xa007
-#define UNITEXT_YI_SYLLABLE_IEP  L"\ua007"
+#define UNITEXT_YI_SYLLABLE_IEP  U"\ua007"
 #define UNICODE_YI_SYLLABLE_AT  0xa008
-#define UNITEXT_YI_SYLLABLE_AT  L"\ua008"
+#define UNITEXT_YI_SYLLABLE_AT  U"\ua008"
 #define UNICODE_YI_SYLLABLE_AX  0xa009
-#define UNITEXT_YI_SYLLABLE_AX  L"\ua009"
+#define UNITEXT_YI_SYLLABLE_AX  U"\ua009"
 #define UNICODE_YI_SYLLABLE_A  0xa00a
-#define UNITEXT_YI_SYLLABLE_A  L"\ua00a"
+#define UNITEXT_YI_SYLLABLE_A  U"\ua00a"
 #define UNICODE_YI_SYLLABLE_AP  0xa00b
-#define UNITEXT_YI_SYLLABLE_AP  L"\ua00b"
+#define UNITEXT_YI_SYLLABLE_AP  U"\ua00b"
 #define UNICODE_YI_SYLLABLE_UOX  0xa00c
-#define UNITEXT_YI_SYLLABLE_UOX  L"\ua00c"
+#define UNITEXT_YI_SYLLABLE_UOX  U"\ua00c"
 #define UNICODE_YI_SYLLABLE_UO  0xa00d
-#define UNITEXT_YI_SYLLABLE_UO  L"\ua00d"
+#define UNITEXT_YI_SYLLABLE_UO  U"\ua00d"
 #define UNICODE_YI_SYLLABLE_UOP  0xa00e
-#define UNITEXT_YI_SYLLABLE_UOP  L"\ua00e"
+#define UNITEXT_YI_SYLLABLE_UOP  U"\ua00e"
 #define UNICODE_YI_SYLLABLE_OT  0xa00f
-#define UNITEXT_YI_SYLLABLE_OT  L"\ua00f"
+#define UNITEXT_YI_SYLLABLE_OT  U"\ua00f"
 #define UNICODE_YI_SYLLABLE_OX  0xa010
-#define UNITEXT_YI_SYLLABLE_OX  L"\ua010"
+#define UNITEXT_YI_SYLLABLE_OX  U"\ua010"
 #define UNICODE_YI_SYLLABLE_O  0xa011
-#define UNITEXT_YI_SYLLABLE_O  L"\ua011"
+#define UNITEXT_YI_SYLLABLE_O  U"\ua011"
 #define UNICODE_YI_SYLLABLE_OP  0xa012
-#define UNITEXT_YI_SYLLABLE_OP  L"\ua012"
+#define UNITEXT_YI_SYLLABLE_OP  U"\ua012"
 #define UNICODE_YI_SYLLABLE_EX  0xa013
-#define UNITEXT_YI_SYLLABLE_EX  L"\ua013"
+#define UNITEXT_YI_SYLLABLE_EX  U"\ua013"
 #define UNICODE_YI_SYLLABLE_E  0xa014
-#define UNITEXT_YI_SYLLABLE_E  L"\ua014"
+#define UNITEXT_YI_SYLLABLE_E  U"\ua014"
 #define UNICODE_YI_SYLLABLE_WU  0xa015
-#define UNITEXT_YI_SYLLABLE_WU  L"\ua015"
+#define UNITEXT_YI_SYLLABLE_WU  U"\ua015"
 #define UNICODE_YI_SYLLABLE_BIT  0xa016
-#define UNITEXT_YI_SYLLABLE_BIT  L"\ua016"
+#define UNITEXT_YI_SYLLABLE_BIT  U"\ua016"
 #define UNICODE_YI_SYLLABLE_BIX  0xa017
-#define UNITEXT_YI_SYLLABLE_BIX  L"\ua017"
+#define UNITEXT_YI_SYLLABLE_BIX  U"\ua017"
 #define UNICODE_YI_SYLLABLE_BI  0xa018
-#define UNITEXT_YI_SYLLABLE_BI  L"\ua018"
+#define UNITEXT_YI_SYLLABLE_BI  U"\ua018"
 #define UNICODE_YI_SYLLABLE_BIP  0xa019
-#define UNITEXT_YI_SYLLABLE_BIP  L"\ua019"
+#define UNITEXT_YI_SYLLABLE_BIP  U"\ua019"
 #define UNICODE_YI_SYLLABLE_BIET  0xa01a
-#define UNITEXT_YI_SYLLABLE_BIET  L"\ua01a"
+#define UNITEXT_YI_SYLLABLE_BIET  U"\ua01a"
 #define UNICODE_YI_SYLLABLE_BIEX  0xa01b
-#define UNITEXT_YI_SYLLABLE_BIEX  L"\ua01b"
+#define UNITEXT_YI_SYLLABLE_BIEX  U"\ua01b"
 #define UNICODE_YI_SYLLABLE_BIE  0xa01c
-#define UNITEXT_YI_SYLLABLE_BIE  L"\ua01c"
+#define UNITEXT_YI_SYLLABLE_BIE  U"\ua01c"
 #define UNICODE_YI_SYLLABLE_BIEP  0xa01d
-#define UNITEXT_YI_SYLLABLE_BIEP  L"\ua01d"
+#define UNITEXT_YI_SYLLABLE_BIEP  U"\ua01d"
 #define UNICODE_YI_SYLLABLE_BAT  0xa01e
-#define UNITEXT_YI_SYLLABLE_BAT  L"\ua01e"
+#define UNITEXT_YI_SYLLABLE_BAT  U"\ua01e"
 #define UNICODE_YI_SYLLABLE_BAX  0xa01f
-#define UNITEXT_YI_SYLLABLE_BAX  L"\ua01f"
+#define UNITEXT_YI_SYLLABLE_BAX  U"\ua01f"
 #define UNICODE_YI_SYLLABLE_BA  0xa020
-#define UNITEXT_YI_SYLLABLE_BA  L"\ua020"
+#define UNITEXT_YI_SYLLABLE_BA  U"\ua020"
 #define UNICODE_YI_SYLLABLE_BAP  0xa021
-#define UNITEXT_YI_SYLLABLE_BAP  L"\ua021"
+#define UNITEXT_YI_SYLLABLE_BAP  U"\ua021"
 #define UNICODE_YI_SYLLABLE_BUOX  0xa022
-#define UNITEXT_YI_SYLLABLE_BUOX  L"\ua022"
+#define UNITEXT_YI_SYLLABLE_BUOX  U"\ua022"
 #define UNICODE_YI_SYLLABLE_BUO  0xa023
-#define UNITEXT_YI_SYLLABLE_BUO  L"\ua023"
+#define UNITEXT_YI_SYLLABLE_BUO  U"\ua023"
 #define UNICODE_YI_SYLLABLE_BUOP  0xa024
-#define UNITEXT_YI_SYLLABLE_BUOP  L"\ua024"
+#define UNITEXT_YI_SYLLABLE_BUOP  U"\ua024"
 #define UNICODE_YI_SYLLABLE_BOT  0xa025
-#define UNITEXT_YI_SYLLABLE_BOT  L"\ua025"
+#define UNITEXT_YI_SYLLABLE_BOT  U"\ua025"
 #define UNICODE_YI_SYLLABLE_BOX  0xa026
-#define UNITEXT_YI_SYLLABLE_BOX  L"\ua026"
+#define UNITEXT_YI_SYLLABLE_BOX  U"\ua026"
 #define UNICODE_YI_SYLLABLE_BO  0xa027
-#define UNITEXT_YI_SYLLABLE_BO  L"\ua027"
+#define UNITEXT_YI_SYLLABLE_BO  U"\ua027"
 #define UNICODE_YI_SYLLABLE_BOP  0xa028
-#define UNITEXT_YI_SYLLABLE_BOP  L"\ua028"
+#define UNITEXT_YI_SYLLABLE_BOP  U"\ua028"
 #define UNICODE_YI_SYLLABLE_BEX  0xa029
-#define UNITEXT_YI_SYLLABLE_BEX  L"\ua029"
+#define UNITEXT_YI_SYLLABLE_BEX  U"\ua029"
 #define UNICODE_YI_SYLLABLE_BE  0xa02a
-#define UNITEXT_YI_SYLLABLE_BE  L"\ua02a"
+#define UNITEXT_YI_SYLLABLE_BE  U"\ua02a"
 #define UNICODE_YI_SYLLABLE_BEP  0xa02b
-#define UNITEXT_YI_SYLLABLE_BEP  L"\ua02b"
+#define UNITEXT_YI_SYLLABLE_BEP  U"\ua02b"
 #define UNICODE_YI_SYLLABLE_BUT  0xa02c
-#define UNITEXT_YI_SYLLABLE_BUT  L"\ua02c"
+#define UNITEXT_YI_SYLLABLE_BUT  U"\ua02c"
 #define UNICODE_YI_SYLLABLE_BUX  0xa02d
-#define UNITEXT_YI_SYLLABLE_BUX  L"\ua02d"
+#define UNITEXT_YI_SYLLABLE_BUX  U"\ua02d"
 #define UNICODE_YI_SYLLABLE_BU  0xa02e
-#define UNITEXT_YI_SYLLABLE_BU  L"\ua02e"
+#define UNITEXT_YI_SYLLABLE_BU  U"\ua02e"
 #define UNICODE_YI_SYLLABLE_BUP  0xa02f
-#define UNITEXT_YI_SYLLABLE_BUP  L"\ua02f"
+#define UNITEXT_YI_SYLLABLE_BUP  U"\ua02f"
 #define UNICODE_YI_SYLLABLE_BURX  0xa030
-#define UNITEXT_YI_SYLLABLE_BURX  L"\ua030"
+#define UNITEXT_YI_SYLLABLE_BURX  U"\ua030"
 #define UNICODE_YI_SYLLABLE_BUR  0xa031
-#define UNITEXT_YI_SYLLABLE_BUR  L"\ua031"
+#define UNITEXT_YI_SYLLABLE_BUR  U"\ua031"
 #define UNICODE_YI_SYLLABLE_BYT  0xa032
-#define UNITEXT_YI_SYLLABLE_BYT  L"\ua032"
+#define UNITEXT_YI_SYLLABLE_BYT  U"\ua032"
 #define UNICODE_YI_SYLLABLE_BYX  0xa033
-#define UNITEXT_YI_SYLLABLE_BYX  L"\ua033"
+#define UNITEXT_YI_SYLLABLE_BYX  U"\ua033"
 #define UNICODE_YI_SYLLABLE_BY  0xa034
-#define UNITEXT_YI_SYLLABLE_BY  L"\ua034"
+#define UNITEXT_YI_SYLLABLE_BY  U"\ua034"
 #define UNICODE_YI_SYLLABLE_BYP  0xa035
-#define UNITEXT_YI_SYLLABLE_BYP  L"\ua035"
+#define UNITEXT_YI_SYLLABLE_BYP  U"\ua035"
 #define UNICODE_YI_SYLLABLE_BYRX  0xa036
-#define UNITEXT_YI_SYLLABLE_BYRX  L"\ua036"
+#define UNITEXT_YI_SYLLABLE_BYRX  U"\ua036"
 #define UNICODE_YI_SYLLABLE_BYR  0xa037
-#define UNITEXT_YI_SYLLABLE_BYR  L"\ua037"
+#define UNITEXT_YI_SYLLABLE_BYR  U"\ua037"
 #define UNICODE_YI_SYLLABLE_PIT  0xa038
-#define UNITEXT_YI_SYLLABLE_PIT  L"\ua038"
+#define UNITEXT_YI_SYLLABLE_PIT  U"\ua038"
 #define UNICODE_YI_SYLLABLE_PIX  0xa039
-#define UNITEXT_YI_SYLLABLE_PIX  L"\ua039"
+#define UNITEXT_YI_SYLLABLE_PIX  U"\ua039"
 #define UNICODE_YI_SYLLABLE_PI  0xa03a
-#define UNITEXT_YI_SYLLABLE_PI  L"\ua03a"
+#define UNITEXT_YI_SYLLABLE_PI  U"\ua03a"
 #define UNICODE_YI_SYLLABLE_PIP  0xa03b
-#define UNITEXT_YI_SYLLABLE_PIP  L"\ua03b"
+#define UNITEXT_YI_SYLLABLE_PIP  U"\ua03b"
 #define UNICODE_YI_SYLLABLE_PIEX  0xa03c
-#define UNITEXT_YI_SYLLABLE_PIEX  L"\ua03c"
+#define UNITEXT_YI_SYLLABLE_PIEX  U"\ua03c"
 #define UNICODE_YI_SYLLABLE_PIE  0xa03d
-#define UNITEXT_YI_SYLLABLE_PIE  L"\ua03d"
+#define UNITEXT_YI_SYLLABLE_PIE  U"\ua03d"
 #define UNICODE_YI_SYLLABLE_PIEP  0xa03e
-#define UNITEXT_YI_SYLLABLE_PIEP  L"\ua03e"
+#define UNITEXT_YI_SYLLABLE_PIEP  U"\ua03e"
 #define UNICODE_YI_SYLLABLE_PAT  0xa03f
-#define UNITEXT_YI_SYLLABLE_PAT  L"\ua03f"
+#define UNITEXT_YI_SYLLABLE_PAT  U"\ua03f"
 #define UNICODE_YI_SYLLABLE_PAX  0xa040
-#define UNITEXT_YI_SYLLABLE_PAX  L"\ua040"
+#define UNITEXT_YI_SYLLABLE_PAX  U"\ua040"
 #define UNICODE_YI_SYLLABLE_PA  0xa041
-#define UNITEXT_YI_SYLLABLE_PA  L"\ua041"
+#define UNITEXT_YI_SYLLABLE_PA  U"\ua041"
 #define UNICODE_YI_SYLLABLE_PAP  0xa042
-#define UNITEXT_YI_SYLLABLE_PAP  L"\ua042"
+#define UNITEXT_YI_SYLLABLE_PAP  U"\ua042"
 #define UNICODE_YI_SYLLABLE_PUOX  0xa043
-#define UNITEXT_YI_SYLLABLE_PUOX  L"\ua043"
+#define UNITEXT_YI_SYLLABLE_PUOX  U"\ua043"
 #define UNICODE_YI_SYLLABLE_PUO  0xa044
-#define UNITEXT_YI_SYLLABLE_PUO  L"\ua044"
+#define UNITEXT_YI_SYLLABLE_PUO  U"\ua044"
 #define UNICODE_YI_SYLLABLE_PUOP  0xa045
-#define UNITEXT_YI_SYLLABLE_PUOP  L"\ua045"
+#define UNITEXT_YI_SYLLABLE_PUOP  U"\ua045"
 #define UNICODE_YI_SYLLABLE_POT  0xa046
-#define UNITEXT_YI_SYLLABLE_POT  L"\ua046"
+#define UNITEXT_YI_SYLLABLE_POT  U"\ua046"
 #define UNICODE_YI_SYLLABLE_POX  0xa047
-#define UNITEXT_YI_SYLLABLE_POX  L"\ua047"
+#define UNITEXT_YI_SYLLABLE_POX  U"\ua047"
 #define UNICODE_YI_SYLLABLE_PO  0xa048
-#define UNITEXT_YI_SYLLABLE_PO  L"\ua048"
+#define UNITEXT_YI_SYLLABLE_PO  U"\ua048"
 #define UNICODE_YI_SYLLABLE_POP  0xa049
-#define UNITEXT_YI_SYLLABLE_POP  L"\ua049"
+#define UNITEXT_YI_SYLLABLE_POP  U"\ua049"
 #define UNICODE_YI_SYLLABLE_PUT  0xa04a
-#define UNITEXT_YI_SYLLABLE_PUT  L"\ua04a"
+#define UNITEXT_YI_SYLLABLE_PUT  U"\ua04a"
 #define UNICODE_YI_SYLLABLE_PUX  0xa04b
-#define UNITEXT_YI_SYLLABLE_PUX  L"\ua04b"
+#define UNITEXT_YI_SYLLABLE_PUX  U"\ua04b"
 #define UNICODE_YI_SYLLABLE_PU  0xa04c
-#define UNITEXT_YI_SYLLABLE_PU  L"\ua04c"
+#define UNITEXT_YI_SYLLABLE_PU  U"\ua04c"
 #define UNICODE_YI_SYLLABLE_PUP  0xa04d
-#define UNITEXT_YI_SYLLABLE_PUP  L"\ua04d"
+#define UNITEXT_YI_SYLLABLE_PUP  U"\ua04d"
 #define UNICODE_YI_SYLLABLE_PURX  0xa04e
-#define UNITEXT_YI_SYLLABLE_PURX  L"\ua04e"
+#define UNITEXT_YI_SYLLABLE_PURX  U"\ua04e"
 #define UNICODE_YI_SYLLABLE_PUR  0xa04f
-#define UNITEXT_YI_SYLLABLE_PUR  L"\ua04f"
+#define UNITEXT_YI_SYLLABLE_PUR  U"\ua04f"
 #define UNICODE_YI_SYLLABLE_PYT  0xa050
-#define UNITEXT_YI_SYLLABLE_PYT  L"\ua050"
+#define UNITEXT_YI_SYLLABLE_PYT  U"\ua050"
 #define UNICODE_YI_SYLLABLE_PYX  0xa051
-#define UNITEXT_YI_SYLLABLE_PYX  L"\ua051"
+#define UNITEXT_YI_SYLLABLE_PYX  U"\ua051"
 #define UNICODE_YI_SYLLABLE_PY  0xa052
-#define UNITEXT_YI_SYLLABLE_PY  L"\ua052"
+#define UNITEXT_YI_SYLLABLE_PY  U"\ua052"
 #define UNICODE_YI_SYLLABLE_PYP  0xa053
-#define UNITEXT_YI_SYLLABLE_PYP  L"\ua053"
+#define UNITEXT_YI_SYLLABLE_PYP  U"\ua053"
 #define UNICODE_YI_SYLLABLE_PYRX  0xa054
-#define UNITEXT_YI_SYLLABLE_PYRX  L"\ua054"
+#define UNITEXT_YI_SYLLABLE_PYRX  U"\ua054"
 #define UNICODE_YI_SYLLABLE_PYR  0xa055
-#define UNITEXT_YI_SYLLABLE_PYR  L"\ua055"
+#define UNITEXT_YI_SYLLABLE_PYR  U"\ua055"
 #define UNICODE_YI_SYLLABLE_BBIT  0xa056
-#define UNITEXT_YI_SYLLABLE_BBIT  L"\ua056"
+#define UNITEXT_YI_SYLLABLE_BBIT  U"\ua056"
 #define UNICODE_YI_SYLLABLE_BBIX  0xa057
-#define UNITEXT_YI_SYLLABLE_BBIX  L"\ua057"
+#define UNITEXT_YI_SYLLABLE_BBIX  U"\ua057"
 #define UNICODE_YI_SYLLABLE_BBI  0xa058
-#define UNITEXT_YI_SYLLABLE_BBI  L"\ua058"
+#define UNITEXT_YI_SYLLABLE_BBI  U"\ua058"
 #define UNICODE_YI_SYLLABLE_BBIP  0xa059
-#define UNITEXT_YI_SYLLABLE_BBIP  L"\ua059"
+#define UNITEXT_YI_SYLLABLE_BBIP  U"\ua059"
 #define UNICODE_YI_SYLLABLE_BBIET  0xa05a
-#define UNITEXT_YI_SYLLABLE_BBIET  L"\ua05a"
+#define UNITEXT_YI_SYLLABLE_BBIET  U"\ua05a"
 #define UNICODE_YI_SYLLABLE_BBIEX  0xa05b
-#define UNITEXT_YI_SYLLABLE_BBIEX  L"\ua05b"
+#define UNITEXT_YI_SYLLABLE_BBIEX  U"\ua05b"
 #define UNICODE_YI_SYLLABLE_BBIE  0xa05c
-#define UNITEXT_YI_SYLLABLE_BBIE  L"\ua05c"
+#define UNITEXT_YI_SYLLABLE_BBIE  U"\ua05c"
 #define UNICODE_YI_SYLLABLE_BBIEP  0xa05d
-#define UNITEXT_YI_SYLLABLE_BBIEP  L"\ua05d"
+#define UNITEXT_YI_SYLLABLE_BBIEP  U"\ua05d"
 #define UNICODE_YI_SYLLABLE_BBAT  0xa05e
-#define UNITEXT_YI_SYLLABLE_BBAT  L"\ua05e"
+#define UNITEXT_YI_SYLLABLE_BBAT  U"\ua05e"
 #define UNICODE_YI_SYLLABLE_BBAX  0xa05f
-#define UNITEXT_YI_SYLLABLE_BBAX  L"\ua05f"
+#define UNITEXT_YI_SYLLABLE_BBAX  U"\ua05f"
 #define UNICODE_YI_SYLLABLE_BBA  0xa060
-#define UNITEXT_YI_SYLLABLE_BBA  L"\ua060"
+#define UNITEXT_YI_SYLLABLE_BBA  U"\ua060"
 #define UNICODE_YI_SYLLABLE_BBAP  0xa061
-#define UNITEXT_YI_SYLLABLE_BBAP  L"\ua061"
+#define UNITEXT_YI_SYLLABLE_BBAP  U"\ua061"
 #define UNICODE_YI_SYLLABLE_BBUOX  0xa062
-#define UNITEXT_YI_SYLLABLE_BBUOX  L"\ua062"
+#define UNITEXT_YI_SYLLABLE_BBUOX  U"\ua062"
 #define UNICODE_YI_SYLLABLE_BBUO  0xa063
-#define UNITEXT_YI_SYLLABLE_BBUO  L"\ua063"
+#define UNITEXT_YI_SYLLABLE_BBUO  U"\ua063"
 #define UNICODE_YI_SYLLABLE_BBUOP  0xa064
-#define UNITEXT_YI_SYLLABLE_BBUOP  L"\ua064"
+#define UNITEXT_YI_SYLLABLE_BBUOP  U"\ua064"
 #define UNICODE_YI_SYLLABLE_BBOT  0xa065
-#define UNITEXT_YI_SYLLABLE_BBOT  L"\ua065"
+#define UNITEXT_YI_SYLLABLE_BBOT  U"\ua065"
 #define UNICODE_YI_SYLLABLE_BBOX  0xa066
-#define UNITEXT_YI_SYLLABLE_BBOX  L"\ua066"
+#define UNITEXT_YI_SYLLABLE_BBOX  U"\ua066"
 #define UNICODE_YI_SYLLABLE_BBO  0xa067
-#define UNITEXT_YI_SYLLABLE_BBO  L"\ua067"
+#define UNITEXT_YI_SYLLABLE_BBO  U"\ua067"
 #define UNICODE_YI_SYLLABLE_BBOP  0xa068
-#define UNITEXT_YI_SYLLABLE_BBOP  L"\ua068"
+#define UNITEXT_YI_SYLLABLE_BBOP  U"\ua068"
 #define UNICODE_YI_SYLLABLE_BBEX  0xa069
-#define UNITEXT_YI_SYLLABLE_BBEX  L"\ua069"
+#define UNITEXT_YI_SYLLABLE_BBEX  U"\ua069"
 #define UNICODE_YI_SYLLABLE_BBE  0xa06a
-#define UNITEXT_YI_SYLLABLE_BBE  L"\ua06a"
+#define UNITEXT_YI_SYLLABLE_BBE  U"\ua06a"
 #define UNICODE_YI_SYLLABLE_BBEP  0xa06b
-#define UNITEXT_YI_SYLLABLE_BBEP  L"\ua06b"
+#define UNITEXT_YI_SYLLABLE_BBEP  U"\ua06b"
 #define UNICODE_YI_SYLLABLE_BBUT  0xa06c
-#define UNITEXT_YI_SYLLABLE_BBUT  L"\ua06c"
+#define UNITEXT_YI_SYLLABLE_BBUT  U"\ua06c"
 #define UNICODE_YI_SYLLABLE_BBUX  0xa06d
-#define UNITEXT_YI_SYLLABLE_BBUX  L"\ua06d"
+#define UNITEXT_YI_SYLLABLE_BBUX  U"\ua06d"
 #define UNICODE_YI_SYLLABLE_BBU  0xa06e
-#define UNITEXT_YI_SYLLABLE_BBU  L"\ua06e"
+#define UNITEXT_YI_SYLLABLE_BBU  U"\ua06e"
 #define UNICODE_YI_SYLLABLE_BBUP  0xa06f
-#define UNITEXT_YI_SYLLABLE_BBUP  L"\ua06f"
+#define UNITEXT_YI_SYLLABLE_BBUP  U"\ua06f"
 #define UNICODE_YI_SYLLABLE_BBURX  0xa070
-#define UNITEXT_YI_SYLLABLE_BBURX  L"\ua070"
+#define UNITEXT_YI_SYLLABLE_BBURX  U"\ua070"
 #define UNICODE_YI_SYLLABLE_BBUR  0xa071
-#define UNITEXT_YI_SYLLABLE_BBUR  L"\ua071"
+#define UNITEXT_YI_SYLLABLE_BBUR  U"\ua071"
 #define UNICODE_YI_SYLLABLE_BBYT  0xa072
-#define UNITEXT_YI_SYLLABLE_BBYT  L"\ua072"
+#define UNITEXT_YI_SYLLABLE_BBYT  U"\ua072"
 #define UNICODE_YI_SYLLABLE_BBYX  0xa073
-#define UNITEXT_YI_SYLLABLE_BBYX  L"\ua073"
+#define UNITEXT_YI_SYLLABLE_BBYX  U"\ua073"
 #define UNICODE_YI_SYLLABLE_BBY  0xa074
-#define UNITEXT_YI_SYLLABLE_BBY  L"\ua074"
+#define UNITEXT_YI_SYLLABLE_BBY  U"\ua074"
 #define UNICODE_YI_SYLLABLE_BBYP  0xa075
-#define UNITEXT_YI_SYLLABLE_BBYP  L"\ua075"
+#define UNITEXT_YI_SYLLABLE_BBYP  U"\ua075"
 #define UNICODE_YI_SYLLABLE_NBIT  0xa076
-#define UNITEXT_YI_SYLLABLE_NBIT  L"\ua076"
+#define UNITEXT_YI_SYLLABLE_NBIT  U"\ua076"
 #define UNICODE_YI_SYLLABLE_NBIX  0xa077
-#define UNITEXT_YI_SYLLABLE_NBIX  L"\ua077"
+#define UNITEXT_YI_SYLLABLE_NBIX  U"\ua077"
 #define UNICODE_YI_SYLLABLE_NBI  0xa078
-#define UNITEXT_YI_SYLLABLE_NBI  L"\ua078"
+#define UNITEXT_YI_SYLLABLE_NBI  U"\ua078"
 #define UNICODE_YI_SYLLABLE_NBIP  0xa079
-#define UNITEXT_YI_SYLLABLE_NBIP  L"\ua079"
+#define UNITEXT_YI_SYLLABLE_NBIP  U"\ua079"
 #define UNICODE_YI_SYLLABLE_NBIEX  0xa07a
-#define UNITEXT_YI_SYLLABLE_NBIEX  L"\ua07a"
+#define UNITEXT_YI_SYLLABLE_NBIEX  U"\ua07a"
 #define UNICODE_YI_SYLLABLE_NBIE  0xa07b
-#define UNITEXT_YI_SYLLABLE_NBIE  L"\ua07b"
+#define UNITEXT_YI_SYLLABLE_NBIE  U"\ua07b"
 #define UNICODE_YI_SYLLABLE_NBIEP  0xa07c
-#define UNITEXT_YI_SYLLABLE_NBIEP  L"\ua07c"
+#define UNITEXT_YI_SYLLABLE_NBIEP  U"\ua07c"
 #define UNICODE_YI_SYLLABLE_NBAT  0xa07d
-#define UNITEXT_YI_SYLLABLE_NBAT  L"\ua07d"
+#define UNITEXT_YI_SYLLABLE_NBAT  U"\ua07d"
 #define UNICODE_YI_SYLLABLE_NBAX  0xa07e
-#define UNITEXT_YI_SYLLABLE_NBAX  L"\ua07e"
+#define UNITEXT_YI_SYLLABLE_NBAX  U"\ua07e"
 #define UNICODE_YI_SYLLABLE_NBA  0xa07f
-#define UNITEXT_YI_SYLLABLE_NBA  L"\ua07f"
+#define UNITEXT_YI_SYLLABLE_NBA  U"\ua07f"
 #define UNICODE_YI_SYLLABLE_NBAP  0xa080
-#define UNITEXT_YI_SYLLABLE_NBAP  L"\ua080"
+#define UNITEXT_YI_SYLLABLE_NBAP  U"\ua080"
 #define UNICODE_YI_SYLLABLE_NBOT  0xa081
-#define UNITEXT_YI_SYLLABLE_NBOT  L"\ua081"
+#define UNITEXT_YI_SYLLABLE_NBOT  U"\ua081"
 #define UNICODE_YI_SYLLABLE_NBOX  0xa082
-#define UNITEXT_YI_SYLLABLE_NBOX  L"\ua082"
+#define UNITEXT_YI_SYLLABLE_NBOX  U"\ua082"
 #define UNICODE_YI_SYLLABLE_NBO  0xa083
-#define UNITEXT_YI_SYLLABLE_NBO  L"\ua083"
+#define UNITEXT_YI_SYLLABLE_NBO  U"\ua083"
 #define UNICODE_YI_SYLLABLE_NBOP  0xa084
-#define UNITEXT_YI_SYLLABLE_NBOP  L"\ua084"
+#define UNITEXT_YI_SYLLABLE_NBOP  U"\ua084"
 #define UNICODE_YI_SYLLABLE_NBUT  0xa085
-#define UNITEXT_YI_SYLLABLE_NBUT  L"\ua085"
+#define UNITEXT_YI_SYLLABLE_NBUT  U"\ua085"
 #define UNICODE_YI_SYLLABLE_NBUX  0xa086
-#define UNITEXT_YI_SYLLABLE_NBUX  L"\ua086"
+#define UNITEXT_YI_SYLLABLE_NBUX  U"\ua086"
 #define UNICODE_YI_SYLLABLE_NBU  0xa087
-#define UNITEXT_YI_SYLLABLE_NBU  L"\ua087"
+#define UNITEXT_YI_SYLLABLE_NBU  U"\ua087"
 #define UNICODE_YI_SYLLABLE_NBUP  0xa088
-#define UNITEXT_YI_SYLLABLE_NBUP  L"\ua088"
+#define UNITEXT_YI_SYLLABLE_NBUP  U"\ua088"
 #define UNICODE_YI_SYLLABLE_NBURX  0xa089
-#define UNITEXT_YI_SYLLABLE_NBURX  L"\ua089"
+#define UNITEXT_YI_SYLLABLE_NBURX  U"\ua089"
 #define UNICODE_YI_SYLLABLE_NBUR  0xa08a
-#define UNITEXT_YI_SYLLABLE_NBUR  L"\ua08a"
+#define UNITEXT_YI_SYLLABLE_NBUR  U"\ua08a"
 #define UNICODE_YI_SYLLABLE_NBYT  0xa08b
-#define UNITEXT_YI_SYLLABLE_NBYT  L"\ua08b"
+#define UNITEXT_YI_SYLLABLE_NBYT  U"\ua08b"
 #define UNICODE_YI_SYLLABLE_NBYX  0xa08c
-#define UNITEXT_YI_SYLLABLE_NBYX  L"\ua08c"
+#define UNITEXT_YI_SYLLABLE_NBYX  U"\ua08c"
 #define UNICODE_YI_SYLLABLE_NBY  0xa08d
-#define UNITEXT_YI_SYLLABLE_NBY  L"\ua08d"
+#define UNITEXT_YI_SYLLABLE_NBY  U"\ua08d"
 #define UNICODE_YI_SYLLABLE_NBYP  0xa08e
-#define UNITEXT_YI_SYLLABLE_NBYP  L"\ua08e"
+#define UNITEXT_YI_SYLLABLE_NBYP  U"\ua08e"
 #define UNICODE_YI_SYLLABLE_NBYRX  0xa08f
-#define UNITEXT_YI_SYLLABLE_NBYRX  L"\ua08f"
+#define UNITEXT_YI_SYLLABLE_NBYRX  U"\ua08f"
 #define UNICODE_YI_SYLLABLE_NBYR  0xa090
-#define UNITEXT_YI_SYLLABLE_NBYR  L"\ua090"
+#define UNITEXT_YI_SYLLABLE_NBYR  U"\ua090"
 #define UNICODE_YI_SYLLABLE_HMIT  0xa091
-#define UNITEXT_YI_SYLLABLE_HMIT  L"\ua091"
+#define UNITEXT_YI_SYLLABLE_HMIT  U"\ua091"
 #define UNICODE_YI_SYLLABLE_HMIX  0xa092
-#define UNITEXT_YI_SYLLABLE_HMIX  L"\ua092"
+#define UNITEXT_YI_SYLLABLE_HMIX  U"\ua092"
 #define UNICODE_YI_SYLLABLE_HMI  0xa093
-#define UNITEXT_YI_SYLLABLE_HMI  L"\ua093"
+#define UNITEXT_YI_SYLLABLE_HMI  U"\ua093"
 #define UNICODE_YI_SYLLABLE_HMIP  0xa094
-#define UNITEXT_YI_SYLLABLE_HMIP  L"\ua094"
+#define UNITEXT_YI_SYLLABLE_HMIP  U"\ua094"
 #define UNICODE_YI_SYLLABLE_HMIEX  0xa095
-#define UNITEXT_YI_SYLLABLE_HMIEX  L"\ua095"
+#define UNITEXT_YI_SYLLABLE_HMIEX  U"\ua095"
 #define UNICODE_YI_SYLLABLE_HMIE  0xa096
-#define UNITEXT_YI_SYLLABLE_HMIE  L"\ua096"
+#define UNITEXT_YI_SYLLABLE_HMIE  U"\ua096"
 #define UNICODE_YI_SYLLABLE_HMIEP  0xa097
-#define UNITEXT_YI_SYLLABLE_HMIEP  L"\ua097"
+#define UNITEXT_YI_SYLLABLE_HMIEP  U"\ua097"
 #define UNICODE_YI_SYLLABLE_HMAT  0xa098
-#define UNITEXT_YI_SYLLABLE_HMAT  L"\ua098"
+#define UNITEXT_YI_SYLLABLE_HMAT  U"\ua098"
 #define UNICODE_YI_SYLLABLE_HMAX  0xa099
-#define UNITEXT_YI_SYLLABLE_HMAX  L"\ua099"
+#define UNITEXT_YI_SYLLABLE_HMAX  U"\ua099"
 #define UNICODE_YI_SYLLABLE_HMA  0xa09a
-#define UNITEXT_YI_SYLLABLE_HMA  L"\ua09a"
+#define UNITEXT_YI_SYLLABLE_HMA  U"\ua09a"
 #define UNICODE_YI_SYLLABLE_HMAP  0xa09b
-#define UNITEXT_YI_SYLLABLE_HMAP  L"\ua09b"
+#define UNITEXT_YI_SYLLABLE_HMAP  U"\ua09b"
 #define UNICODE_YI_SYLLABLE_HMUOX  0xa09c
-#define UNITEXT_YI_SYLLABLE_HMUOX  L"\ua09c"
+#define UNITEXT_YI_SYLLABLE_HMUOX  U"\ua09c"
 #define UNICODE_YI_SYLLABLE_HMUO  0xa09d
-#define UNITEXT_YI_SYLLABLE_HMUO  L"\ua09d"
+#define UNITEXT_YI_SYLLABLE_HMUO  U"\ua09d"
 #define UNICODE_YI_SYLLABLE_HMUOP  0xa09e
-#define UNITEXT_YI_SYLLABLE_HMUOP  L"\ua09e"
+#define UNITEXT_YI_SYLLABLE_HMUOP  U"\ua09e"
 #define UNICODE_YI_SYLLABLE_HMOT  0xa09f
-#define UNITEXT_YI_SYLLABLE_HMOT  L"\ua09f"
+#define UNITEXT_YI_SYLLABLE_HMOT  U"\ua09f"
 #define UNICODE_YI_SYLLABLE_HMOX  0xa0a0
-#define UNITEXT_YI_SYLLABLE_HMOX  L"\ua0a0"
+#define UNITEXT_YI_SYLLABLE_HMOX  U"\ua0a0"
 #define UNICODE_YI_SYLLABLE_HMO  0xa0a1
-#define UNITEXT_YI_SYLLABLE_HMO  L"\ua0a1"
+#define UNITEXT_YI_SYLLABLE_HMO  U"\ua0a1"
 #define UNICODE_YI_SYLLABLE_HMOP  0xa0a2
-#define UNITEXT_YI_SYLLABLE_HMOP  L"\ua0a2"
+#define UNITEXT_YI_SYLLABLE_HMOP  U"\ua0a2"
 #define UNICODE_YI_SYLLABLE_HMUT  0xa0a3
-#define UNITEXT_YI_SYLLABLE_HMUT  L"\ua0a3"
+#define UNITEXT_YI_SYLLABLE_HMUT  U"\ua0a3"
 #define UNICODE_YI_SYLLABLE_HMUX  0xa0a4
-#define UNITEXT_YI_SYLLABLE_HMUX  L"\ua0a4"
+#define UNITEXT_YI_SYLLABLE_HMUX  U"\ua0a4"
 #define UNICODE_YI_SYLLABLE_HMU  0xa0a5
-#define UNITEXT_YI_SYLLABLE_HMU  L"\ua0a5"
+#define UNITEXT_YI_SYLLABLE_HMU  U"\ua0a5"
 #define UNICODE_YI_SYLLABLE_HMUP  0xa0a6
-#define UNITEXT_YI_SYLLABLE_HMUP  L"\ua0a6"
+#define UNITEXT_YI_SYLLABLE_HMUP  U"\ua0a6"
 #define UNICODE_YI_SYLLABLE_HMURX  0xa0a7
-#define UNITEXT_YI_SYLLABLE_HMURX  L"\ua0a7"
+#define UNITEXT_YI_SYLLABLE_HMURX  U"\ua0a7"
 #define UNICODE_YI_SYLLABLE_HMUR  0xa0a8
-#define UNITEXT_YI_SYLLABLE_HMUR  L"\ua0a8"
+#define UNITEXT_YI_SYLLABLE_HMUR  U"\ua0a8"
 #define UNICODE_YI_SYLLABLE_HMYX  0xa0a9
-#define UNITEXT_YI_SYLLABLE_HMYX  L"\ua0a9"
+#define UNITEXT_YI_SYLLABLE_HMYX  U"\ua0a9"
 #define UNICODE_YI_SYLLABLE_HMY  0xa0aa
-#define UNITEXT_YI_SYLLABLE_HMY  L"\ua0aa"
+#define UNITEXT_YI_SYLLABLE_HMY  U"\ua0aa"
 #define UNICODE_YI_SYLLABLE_HMYP  0xa0ab
-#define UNITEXT_YI_SYLLABLE_HMYP  L"\ua0ab"
+#define UNITEXT_YI_SYLLABLE_HMYP  U"\ua0ab"
 #define UNICODE_YI_SYLLABLE_HMYRX  0xa0ac
-#define UNITEXT_YI_SYLLABLE_HMYRX  L"\ua0ac"
+#define UNITEXT_YI_SYLLABLE_HMYRX  U"\ua0ac"
 #define UNICODE_YI_SYLLABLE_HMYR  0xa0ad
-#define UNITEXT_YI_SYLLABLE_HMYR  L"\ua0ad"
+#define UNITEXT_YI_SYLLABLE_HMYR  U"\ua0ad"
 #define UNICODE_YI_SYLLABLE_MIT  0xa0ae
-#define UNITEXT_YI_SYLLABLE_MIT  L"\ua0ae"
+#define UNITEXT_YI_SYLLABLE_MIT  U"\ua0ae"
 #define UNICODE_YI_SYLLABLE_MIX  0xa0af
-#define UNITEXT_YI_SYLLABLE_MIX  L"\ua0af"
+#define UNITEXT_YI_SYLLABLE_MIX  U"\ua0af"
 #define UNICODE_YI_SYLLABLE_MI  0xa0b0
-#define UNITEXT_YI_SYLLABLE_MI  L"\ua0b0"
+#define UNITEXT_YI_SYLLABLE_MI  U"\ua0b0"
 #define UNICODE_YI_SYLLABLE_MIP  0xa0b1
-#define UNITEXT_YI_SYLLABLE_MIP  L"\ua0b1"
+#define UNITEXT_YI_SYLLABLE_MIP  U"\ua0b1"
 #define UNICODE_YI_SYLLABLE_MIEX  0xa0b2
-#define UNITEXT_YI_SYLLABLE_MIEX  L"\ua0b2"
+#define UNITEXT_YI_SYLLABLE_MIEX  U"\ua0b2"
 #define UNICODE_YI_SYLLABLE_MIE  0xa0b3
-#define UNITEXT_YI_SYLLABLE_MIE  L"\ua0b3"
+#define UNITEXT_YI_SYLLABLE_MIE  U"\ua0b3"
 #define UNICODE_YI_SYLLABLE_MIEP  0xa0b4
-#define UNITEXT_YI_SYLLABLE_MIEP  L"\ua0b4"
+#define UNITEXT_YI_SYLLABLE_MIEP  U"\ua0b4"
 #define UNICODE_YI_SYLLABLE_MAT  0xa0b5
-#define UNITEXT_YI_SYLLABLE_MAT  L"\ua0b5"
+#define UNITEXT_YI_SYLLABLE_MAT  U"\ua0b5"
 #define UNICODE_YI_SYLLABLE_MAX  0xa0b6
-#define UNITEXT_YI_SYLLABLE_MAX  L"\ua0b6"
+#define UNITEXT_YI_SYLLABLE_MAX  U"\ua0b6"
 #define UNICODE_YI_SYLLABLE_MA  0xa0b7
-#define UNITEXT_YI_SYLLABLE_MA  L"\ua0b7"
+#define UNITEXT_YI_SYLLABLE_MA  U"\ua0b7"
 #define UNICODE_YI_SYLLABLE_MAP  0xa0b8
-#define UNITEXT_YI_SYLLABLE_MAP  L"\ua0b8"
+#define UNITEXT_YI_SYLLABLE_MAP  U"\ua0b8"
 #define UNICODE_YI_SYLLABLE_MUOT  0xa0b9
-#define UNITEXT_YI_SYLLABLE_MUOT  L"\ua0b9"
+#define UNITEXT_YI_SYLLABLE_MUOT  U"\ua0b9"
 #define UNICODE_YI_SYLLABLE_MUOX  0xa0ba
-#define UNITEXT_YI_SYLLABLE_MUOX  L"\ua0ba"
+#define UNITEXT_YI_SYLLABLE_MUOX  U"\ua0ba"
 #define UNICODE_YI_SYLLABLE_MUO  0xa0bb
-#define UNITEXT_YI_SYLLABLE_MUO  L"\ua0bb"
+#define UNITEXT_YI_SYLLABLE_MUO  U"\ua0bb"
 #define UNICODE_YI_SYLLABLE_MUOP  0xa0bc
-#define UNITEXT_YI_SYLLABLE_MUOP  L"\ua0bc"
+#define UNITEXT_YI_SYLLABLE_MUOP  U"\ua0bc"
 #define UNICODE_YI_SYLLABLE_MOT  0xa0bd
-#define UNITEXT_YI_SYLLABLE_MOT  L"\ua0bd"
+#define UNITEXT_YI_SYLLABLE_MOT  U"\ua0bd"
 #define UNICODE_YI_SYLLABLE_MOX  0xa0be
-#define UNITEXT_YI_SYLLABLE_MOX  L"\ua0be"
+#define UNITEXT_YI_SYLLABLE_MOX  U"\ua0be"
 #define UNICODE_YI_SYLLABLE_MO  0xa0bf
-#define UNITEXT_YI_SYLLABLE_MO  L"\ua0bf"
+#define UNITEXT_YI_SYLLABLE_MO  U"\ua0bf"
 #define UNICODE_YI_SYLLABLE_MOP  0xa0c0
-#define UNITEXT_YI_SYLLABLE_MOP  L"\ua0c0"
+#define UNITEXT_YI_SYLLABLE_MOP  U"\ua0c0"
 #define UNICODE_YI_SYLLABLE_MEX  0xa0c1
-#define UNITEXT_YI_SYLLABLE_MEX  L"\ua0c1"
+#define UNITEXT_YI_SYLLABLE_MEX  U"\ua0c1"
 #define UNICODE_YI_SYLLABLE_ME  0xa0c2
-#define UNITEXT_YI_SYLLABLE_ME  L"\ua0c2"
+#define UNITEXT_YI_SYLLABLE_ME  U"\ua0c2"
 #define UNICODE_YI_SYLLABLE_MUT  0xa0c3
-#define UNITEXT_YI_SYLLABLE_MUT  L"\ua0c3"
+#define UNITEXT_YI_SYLLABLE_MUT  U"\ua0c3"
 #define UNICODE_YI_SYLLABLE_MUX  0xa0c4
-#define UNITEXT_YI_SYLLABLE_MUX  L"\ua0c4"
+#define UNITEXT_YI_SYLLABLE_MUX  U"\ua0c4"
 #define UNICODE_YI_SYLLABLE_MU  0xa0c5
-#define UNITEXT_YI_SYLLABLE_MU  L"\ua0c5"
+#define UNITEXT_YI_SYLLABLE_MU  U"\ua0c5"
 #define UNICODE_YI_SYLLABLE_MUP  0xa0c6
-#define UNITEXT_YI_SYLLABLE_MUP  L"\ua0c6"
+#define UNITEXT_YI_SYLLABLE_MUP  U"\ua0c6"
 #define UNICODE_YI_SYLLABLE_MURX  0xa0c7
-#define UNITEXT_YI_SYLLABLE_MURX  L"\ua0c7"
+#define UNITEXT_YI_SYLLABLE_MURX  U"\ua0c7"
 #define UNICODE_YI_SYLLABLE_MUR  0xa0c8
-#define UNITEXT_YI_SYLLABLE_MUR  L"\ua0c8"
+#define UNITEXT_YI_SYLLABLE_MUR  U"\ua0c8"
 #define UNICODE_YI_SYLLABLE_MYT  0xa0c9
-#define UNITEXT_YI_SYLLABLE_MYT  L"\ua0c9"
+#define UNITEXT_YI_SYLLABLE_MYT  U"\ua0c9"
 #define UNICODE_YI_SYLLABLE_MYX  0xa0ca
-#define UNITEXT_YI_SYLLABLE_MYX  L"\ua0ca"
+#define UNITEXT_YI_SYLLABLE_MYX  U"\ua0ca"
 #define UNICODE_YI_SYLLABLE_MY  0xa0cb
-#define UNITEXT_YI_SYLLABLE_MY  L"\ua0cb"
+#define UNITEXT_YI_SYLLABLE_MY  U"\ua0cb"
 #define UNICODE_YI_SYLLABLE_MYP  0xa0cc
-#define UNITEXT_YI_SYLLABLE_MYP  L"\ua0cc"
+#define UNITEXT_YI_SYLLABLE_MYP  U"\ua0cc"
 #define UNICODE_YI_SYLLABLE_FIT  0xa0cd
-#define UNITEXT_YI_SYLLABLE_FIT  L"\ua0cd"
+#define UNITEXT_YI_SYLLABLE_FIT  U"\ua0cd"
 #define UNICODE_YI_SYLLABLE_FIX  0xa0ce
-#define UNITEXT_YI_SYLLABLE_FIX  L"\ua0ce"
+#define UNITEXT_YI_SYLLABLE_FIX  U"\ua0ce"
 #define UNICODE_YI_SYLLABLE_FI  0xa0cf
-#define UNITEXT_YI_SYLLABLE_FI  L"\ua0cf"
+#define UNITEXT_YI_SYLLABLE_FI  U"\ua0cf"
 #define UNICODE_YI_SYLLABLE_FIP  0xa0d0
-#define UNITEXT_YI_SYLLABLE_FIP  L"\ua0d0"
+#define UNITEXT_YI_SYLLABLE_FIP  U"\ua0d0"
 #define UNICODE_YI_SYLLABLE_FAT  0xa0d1
-#define UNITEXT_YI_SYLLABLE_FAT  L"\ua0d1"
+#define UNITEXT_YI_SYLLABLE_FAT  U"\ua0d1"
 #define UNICODE_YI_SYLLABLE_FAX  0xa0d2
-#define UNITEXT_YI_SYLLABLE_FAX  L"\ua0d2"
+#define UNITEXT_YI_SYLLABLE_FAX  U"\ua0d2"
 #define UNICODE_YI_SYLLABLE_FA  0xa0d3
-#define UNITEXT_YI_SYLLABLE_FA  L"\ua0d3"
+#define UNITEXT_YI_SYLLABLE_FA  U"\ua0d3"
 #define UNICODE_YI_SYLLABLE_FAP  0xa0d4
-#define UNITEXT_YI_SYLLABLE_FAP  L"\ua0d4"
+#define UNITEXT_YI_SYLLABLE_FAP  U"\ua0d4"
 #define UNICODE_YI_SYLLABLE_FOX  0xa0d5
-#define UNITEXT_YI_SYLLABLE_FOX  L"\ua0d5"
+#define UNITEXT_YI_SYLLABLE_FOX  U"\ua0d5"
 #define UNICODE_YI_SYLLABLE_FO  0xa0d6
-#define UNITEXT_YI_SYLLABLE_FO  L"\ua0d6"
+#define UNITEXT_YI_SYLLABLE_FO  U"\ua0d6"
 #define UNICODE_YI_SYLLABLE_FOP  0xa0d7
-#define UNITEXT_YI_SYLLABLE_FOP  L"\ua0d7"
+#define UNITEXT_YI_SYLLABLE_FOP  U"\ua0d7"
 #define UNICODE_YI_SYLLABLE_FUT  0xa0d8
-#define UNITEXT_YI_SYLLABLE_FUT  L"\ua0d8"
+#define UNITEXT_YI_SYLLABLE_FUT  U"\ua0d8"
 #define UNICODE_YI_SYLLABLE_FUX  0xa0d9
-#define UNITEXT_YI_SYLLABLE_FUX  L"\ua0d9"
+#define UNITEXT_YI_SYLLABLE_FUX  U"\ua0d9"
 #define UNICODE_YI_SYLLABLE_FU  0xa0da
-#define UNITEXT_YI_SYLLABLE_FU  L"\ua0da"
+#define UNITEXT_YI_SYLLABLE_FU  U"\ua0da"
 #define UNICODE_YI_SYLLABLE_FUP  0xa0db
-#define UNITEXT_YI_SYLLABLE_FUP  L"\ua0db"
+#define UNITEXT_YI_SYLLABLE_FUP  U"\ua0db"
 #define UNICODE_YI_SYLLABLE_FURX  0xa0dc
-#define UNITEXT_YI_SYLLABLE_FURX  L"\ua0dc"
+#define UNITEXT_YI_SYLLABLE_FURX  U"\ua0dc"
 #define UNICODE_YI_SYLLABLE_FUR  0xa0dd
-#define UNITEXT_YI_SYLLABLE_FUR  L"\ua0dd"
+#define UNITEXT_YI_SYLLABLE_FUR  U"\ua0dd"
 #define UNICODE_YI_SYLLABLE_FYT  0xa0de
-#define UNITEXT_YI_SYLLABLE_FYT  L"\ua0de"
+#define UNITEXT_YI_SYLLABLE_FYT  U"\ua0de"
 #define UNICODE_YI_SYLLABLE_FYX  0xa0df
-#define UNITEXT_YI_SYLLABLE_FYX  L"\ua0df"
+#define UNITEXT_YI_SYLLABLE_FYX  U"\ua0df"
 #define UNICODE_YI_SYLLABLE_FY  0xa0e0
-#define UNITEXT_YI_SYLLABLE_FY  L"\ua0e0"
+#define UNITEXT_YI_SYLLABLE_FY  U"\ua0e0"
 #define UNICODE_YI_SYLLABLE_FYP  0xa0e1
-#define UNITEXT_YI_SYLLABLE_FYP  L"\ua0e1"
+#define UNITEXT_YI_SYLLABLE_FYP  U"\ua0e1"
 #define UNICODE_YI_SYLLABLE_VIT  0xa0e2
-#define UNITEXT_YI_SYLLABLE_VIT  L"\ua0e2"
+#define UNITEXT_YI_SYLLABLE_VIT  U"\ua0e2"
 #define UNICODE_YI_SYLLABLE_VIX  0xa0e3
-#define UNITEXT_YI_SYLLABLE_VIX  L"\ua0e3"
+#define UNITEXT_YI_SYLLABLE_VIX  U"\ua0e3"
 #define UNICODE_YI_SYLLABLE_VI  0xa0e4
-#define UNITEXT_YI_SYLLABLE_VI  L"\ua0e4"
+#define UNITEXT_YI_SYLLABLE_VI  U"\ua0e4"
 #define UNICODE_YI_SYLLABLE_VIP  0xa0e5
-#define UNITEXT_YI_SYLLABLE_VIP  L"\ua0e5"
+#define UNITEXT_YI_SYLLABLE_VIP  U"\ua0e5"
 #define UNICODE_YI_SYLLABLE_VIET  0xa0e6
-#define UNITEXT_YI_SYLLABLE_VIET  L"\ua0e6"
+#define UNITEXT_YI_SYLLABLE_VIET  U"\ua0e6"
 #define UNICODE_YI_SYLLABLE_VIEX  0xa0e7
-#define UNITEXT_YI_SYLLABLE_VIEX  L"\ua0e7"
+#define UNITEXT_YI_SYLLABLE_VIEX  U"\ua0e7"
 #define UNICODE_YI_SYLLABLE_VIE  0xa0e8
-#define UNITEXT_YI_SYLLABLE_VIE  L"\ua0e8"
+#define UNITEXT_YI_SYLLABLE_VIE  U"\ua0e8"
 #define UNICODE_YI_SYLLABLE_VIEP  0xa0e9
-#define UNITEXT_YI_SYLLABLE_VIEP  L"\ua0e9"
+#define UNITEXT_YI_SYLLABLE_VIEP  U"\ua0e9"
 #define UNICODE_YI_SYLLABLE_VAT  0xa0ea
-#define UNITEXT_YI_SYLLABLE_VAT  L"\ua0ea"
+#define UNITEXT_YI_SYLLABLE_VAT  U"\ua0ea"
 #define UNICODE_YI_SYLLABLE_VAX  0xa0eb
-#define UNITEXT_YI_SYLLABLE_VAX  L"\ua0eb"
+#define UNITEXT_YI_SYLLABLE_VAX  U"\ua0eb"
 #define UNICODE_YI_SYLLABLE_VA  0xa0ec
-#define UNITEXT_YI_SYLLABLE_VA  L"\ua0ec"
+#define UNITEXT_YI_SYLLABLE_VA  U"\ua0ec"
 #define UNICODE_YI_SYLLABLE_VAP  0xa0ed
-#define UNITEXT_YI_SYLLABLE_VAP  L"\ua0ed"
+#define UNITEXT_YI_SYLLABLE_VAP  U"\ua0ed"
 #define UNICODE_YI_SYLLABLE_VOT  0xa0ee
-#define UNITEXT_YI_SYLLABLE_VOT  L"\ua0ee"
+#define UNITEXT_YI_SYLLABLE_VOT  U"\ua0ee"
 #define UNICODE_YI_SYLLABLE_VOX  0xa0ef
-#define UNITEXT_YI_SYLLABLE_VOX  L"\ua0ef"
+#define UNITEXT_YI_SYLLABLE_VOX  U"\ua0ef"
 #define UNICODE_YI_SYLLABLE_VO  0xa0f0
-#define UNITEXT_YI_SYLLABLE_VO  L"\ua0f0"
+#define UNITEXT_YI_SYLLABLE_VO  U"\ua0f0"
 #define UNICODE_YI_SYLLABLE_VOP  0xa0f1
-#define UNITEXT_YI_SYLLABLE_VOP  L"\ua0f1"
+#define UNITEXT_YI_SYLLABLE_VOP  U"\ua0f1"
 #define UNICODE_YI_SYLLABLE_VEX  0xa0f2
-#define UNITEXT_YI_SYLLABLE_VEX  L"\ua0f2"
+#define UNITEXT_YI_SYLLABLE_VEX  U"\ua0f2"
 #define UNICODE_YI_SYLLABLE_VEP  0xa0f3
-#define UNITEXT_YI_SYLLABLE_VEP  L"\ua0f3"
+#define UNITEXT_YI_SYLLABLE_VEP  U"\ua0f3"
 #define UNICODE_YI_SYLLABLE_VUT  0xa0f4
-#define UNITEXT_YI_SYLLABLE_VUT  L"\ua0f4"
+#define UNITEXT_YI_SYLLABLE_VUT  U"\ua0f4"
 #define UNICODE_YI_SYLLABLE_VUX  0xa0f5
-#define UNITEXT_YI_SYLLABLE_VUX  L"\ua0f5"
+#define UNITEXT_YI_SYLLABLE_VUX  U"\ua0f5"
 #define UNICODE_YI_SYLLABLE_VU  0xa0f6
-#define UNITEXT_YI_SYLLABLE_VU  L"\ua0f6"
+#define UNITEXT_YI_SYLLABLE_VU  U"\ua0f6"
 #define UNICODE_YI_SYLLABLE_VUP  0xa0f7
-#define UNITEXT_YI_SYLLABLE_VUP  L"\ua0f7"
+#define UNITEXT_YI_SYLLABLE_VUP  U"\ua0f7"
 #define UNICODE_YI_SYLLABLE_VURX  0xa0f8
-#define UNITEXT_YI_SYLLABLE_VURX  L"\ua0f8"
+#define UNITEXT_YI_SYLLABLE_VURX  U"\ua0f8"
 #define UNICODE_YI_SYLLABLE_VUR  0xa0f9
-#define UNITEXT_YI_SYLLABLE_VUR  L"\ua0f9"
+#define UNITEXT_YI_SYLLABLE_VUR  U"\ua0f9"
 #define UNICODE_YI_SYLLABLE_VYT  0xa0fa
-#define UNITEXT_YI_SYLLABLE_VYT  L"\ua0fa"
+#define UNITEXT_YI_SYLLABLE_VYT  U"\ua0fa"
 #define UNICODE_YI_SYLLABLE_VYX  0xa0fb
-#define UNITEXT_YI_SYLLABLE_VYX  L"\ua0fb"
+#define UNITEXT_YI_SYLLABLE_VYX  U"\ua0fb"
 #define UNICODE_YI_SYLLABLE_VY  0xa0fc
-#define UNITEXT_YI_SYLLABLE_VY  L"\ua0fc"
+#define UNITEXT_YI_SYLLABLE_VY  U"\ua0fc"
 #define UNICODE_YI_SYLLABLE_VYP  0xa0fd
-#define UNITEXT_YI_SYLLABLE_VYP  L"\ua0fd"
+#define UNITEXT_YI_SYLLABLE_VYP  U"\ua0fd"
 #define UNICODE_YI_SYLLABLE_VYRX  0xa0fe
-#define UNITEXT_YI_SYLLABLE_VYRX  L"\ua0fe"
+#define UNITEXT_YI_SYLLABLE_VYRX  U"\ua0fe"
 #define UNICODE_YI_SYLLABLE_VYR  0xa0ff
-#define UNITEXT_YI_SYLLABLE_VYR  L"\ua0ff"
+#define UNITEXT_YI_SYLLABLE_VYR  U"\ua0ff"
 #define UNICODE_YI_SYLLABLE_DIT  0xa100
-#define UNITEXT_YI_SYLLABLE_DIT  L"\ua100"
+#define UNITEXT_YI_SYLLABLE_DIT  U"\ua100"
 #define UNICODE_YI_SYLLABLE_DIX  0xa101
-#define UNITEXT_YI_SYLLABLE_DIX  L"\ua101"
+#define UNITEXT_YI_SYLLABLE_DIX  U"\ua101"
 #define UNICODE_YI_SYLLABLE_DI  0xa102
-#define UNITEXT_YI_SYLLABLE_DI  L"\ua102"
+#define UNITEXT_YI_SYLLABLE_DI  U"\ua102"
 #define UNICODE_YI_SYLLABLE_DIP  0xa103
-#define UNITEXT_YI_SYLLABLE_DIP  L"\ua103"
+#define UNITEXT_YI_SYLLABLE_DIP  U"\ua103"
 #define UNICODE_YI_SYLLABLE_DIEX  0xa104
-#define UNITEXT_YI_SYLLABLE_DIEX  L"\ua104"
+#define UNITEXT_YI_SYLLABLE_DIEX  U"\ua104"
 #define UNICODE_YI_SYLLABLE_DIE  0xa105
-#define UNITEXT_YI_SYLLABLE_DIE  L"\ua105"
+#define UNITEXT_YI_SYLLABLE_DIE  U"\ua105"
 #define UNICODE_YI_SYLLABLE_DIEP  0xa106
-#define UNITEXT_YI_SYLLABLE_DIEP  L"\ua106"
+#define UNITEXT_YI_SYLLABLE_DIEP  U"\ua106"
 #define UNICODE_YI_SYLLABLE_DAT  0xa107
-#define UNITEXT_YI_SYLLABLE_DAT  L"\ua107"
+#define UNITEXT_YI_SYLLABLE_DAT  U"\ua107"
 #define UNICODE_YI_SYLLABLE_DAX  0xa108
-#define UNITEXT_YI_SYLLABLE_DAX  L"\ua108"
+#define UNITEXT_YI_SYLLABLE_DAX  U"\ua108"
 #define UNICODE_YI_SYLLABLE_DA  0xa109
-#define UNITEXT_YI_SYLLABLE_DA  L"\ua109"
+#define UNITEXT_YI_SYLLABLE_DA  U"\ua109"
 #define UNICODE_YI_SYLLABLE_DAP  0xa10a
-#define UNITEXT_YI_SYLLABLE_DAP  L"\ua10a"
+#define UNITEXT_YI_SYLLABLE_DAP  U"\ua10a"
 #define UNICODE_YI_SYLLABLE_DUOX  0xa10b
-#define UNITEXT_YI_SYLLABLE_DUOX  L"\ua10b"
+#define UNITEXT_YI_SYLLABLE_DUOX  U"\ua10b"
 #define UNICODE_YI_SYLLABLE_DUO  0xa10c
-#define UNITEXT_YI_SYLLABLE_DUO  L"\ua10c"
+#define UNITEXT_YI_SYLLABLE_DUO  U"\ua10c"
 #define UNICODE_YI_SYLLABLE_DOT  0xa10d
-#define UNITEXT_YI_SYLLABLE_DOT  L"\ua10d"
+#define UNITEXT_YI_SYLLABLE_DOT  U"\ua10d"
 #define UNICODE_YI_SYLLABLE_DOX  0xa10e
-#define UNITEXT_YI_SYLLABLE_DOX  L"\ua10e"
+#define UNITEXT_YI_SYLLABLE_DOX  U"\ua10e"
 #define UNICODE_YI_SYLLABLE_DO  0xa10f
-#define UNITEXT_YI_SYLLABLE_DO  L"\ua10f"
+#define UNITEXT_YI_SYLLABLE_DO  U"\ua10f"
 #define UNICODE_YI_SYLLABLE_DOP  0xa110
-#define UNITEXT_YI_SYLLABLE_DOP  L"\ua110"
+#define UNITEXT_YI_SYLLABLE_DOP  U"\ua110"
 #define UNICODE_YI_SYLLABLE_DEX  0xa111
-#define UNITEXT_YI_SYLLABLE_DEX  L"\ua111"
+#define UNITEXT_YI_SYLLABLE_DEX  U"\ua111"
 #define UNICODE_YI_SYLLABLE_DE  0xa112
-#define UNITEXT_YI_SYLLABLE_DE  L"\ua112"
+#define UNITEXT_YI_SYLLABLE_DE  U"\ua112"
 #define UNICODE_YI_SYLLABLE_DEP  0xa113
-#define UNITEXT_YI_SYLLABLE_DEP  L"\ua113"
+#define UNITEXT_YI_SYLLABLE_DEP  U"\ua113"
 #define UNICODE_YI_SYLLABLE_DUT  0xa114
-#define UNITEXT_YI_SYLLABLE_DUT  L"\ua114"
+#define UNITEXT_YI_SYLLABLE_DUT  U"\ua114"
 #define UNICODE_YI_SYLLABLE_DUX  0xa115
-#define UNITEXT_YI_SYLLABLE_DUX  L"\ua115"
+#define UNITEXT_YI_SYLLABLE_DUX  U"\ua115"
 #define UNICODE_YI_SYLLABLE_DU  0xa116
-#define UNITEXT_YI_SYLLABLE_DU  L"\ua116"
+#define UNITEXT_YI_SYLLABLE_DU  U"\ua116"
 #define UNICODE_YI_SYLLABLE_DUP  0xa117
-#define UNITEXT_YI_SYLLABLE_DUP  L"\ua117"
+#define UNITEXT_YI_SYLLABLE_DUP  U"\ua117"
 #define UNICODE_YI_SYLLABLE_DURX  0xa118
-#define UNITEXT_YI_SYLLABLE_DURX  L"\ua118"
+#define UNITEXT_YI_SYLLABLE_DURX  U"\ua118"
 #define UNICODE_YI_SYLLABLE_DUR  0xa119
-#define UNITEXT_YI_SYLLABLE_DUR  L"\ua119"
+#define UNITEXT_YI_SYLLABLE_DUR  U"\ua119"
 #define UNICODE_YI_SYLLABLE_TIT  0xa11a
-#define UNITEXT_YI_SYLLABLE_TIT  L"\ua11a"
+#define UNITEXT_YI_SYLLABLE_TIT  U"\ua11a"
 #define UNICODE_YI_SYLLABLE_TIX  0xa11b
-#define UNITEXT_YI_SYLLABLE_TIX  L"\ua11b"
+#define UNITEXT_YI_SYLLABLE_TIX  U"\ua11b"
 #define UNICODE_YI_SYLLABLE_TI  0xa11c
-#define UNITEXT_YI_SYLLABLE_TI  L"\ua11c"
+#define UNITEXT_YI_SYLLABLE_TI  U"\ua11c"
 #define UNICODE_YI_SYLLABLE_TIP  0xa11d
-#define UNITEXT_YI_SYLLABLE_TIP  L"\ua11d"
+#define UNITEXT_YI_SYLLABLE_TIP  U"\ua11d"
 #define UNICODE_YI_SYLLABLE_TIEX  0xa11e
-#define UNITEXT_YI_SYLLABLE_TIEX  L"\ua11e"
+#define UNITEXT_YI_SYLLABLE_TIEX  U"\ua11e"
 #define UNICODE_YI_SYLLABLE_TIE  0xa11f
-#define UNITEXT_YI_SYLLABLE_TIE  L"\ua11f"
+#define UNITEXT_YI_SYLLABLE_TIE  U"\ua11f"
 #define UNICODE_YI_SYLLABLE_TIEP  0xa120
-#define UNITEXT_YI_SYLLABLE_TIEP  L"\ua120"
+#define UNITEXT_YI_SYLLABLE_TIEP  U"\ua120"
 #define UNICODE_YI_SYLLABLE_TAT  0xa121
-#define UNITEXT_YI_SYLLABLE_TAT  L"\ua121"
+#define UNITEXT_YI_SYLLABLE_TAT  U"\ua121"
 #define UNICODE_YI_SYLLABLE_TAX  0xa122
-#define UNITEXT_YI_SYLLABLE_TAX  L"\ua122"
+#define UNITEXT_YI_SYLLABLE_TAX  U"\ua122"
 #define UNICODE_YI_SYLLABLE_TA  0xa123
-#define UNITEXT_YI_SYLLABLE_TA  L"\ua123"
+#define UNITEXT_YI_SYLLABLE_TA  U"\ua123"
 #define UNICODE_YI_SYLLABLE_TAP  0xa124
-#define UNITEXT_YI_SYLLABLE_TAP  L"\ua124"
+#define UNITEXT_YI_SYLLABLE_TAP  U"\ua124"
 #define UNICODE_YI_SYLLABLE_TUOT  0xa125
-#define UNITEXT_YI_SYLLABLE_TUOT  L"\ua125"
+#define UNITEXT_YI_SYLLABLE_TUOT  U"\ua125"
 #define UNICODE_YI_SYLLABLE_TUOX  0xa126
-#define UNITEXT_YI_SYLLABLE_TUOX  L"\ua126"
+#define UNITEXT_YI_SYLLABLE_TUOX  U"\ua126"
 #define UNICODE_YI_SYLLABLE_TUO  0xa127
-#define UNITEXT_YI_SYLLABLE_TUO  L"\ua127"
+#define UNITEXT_YI_SYLLABLE_TUO  U"\ua127"
 #define UNICODE_YI_SYLLABLE_TUOP  0xa128
-#define UNITEXT_YI_SYLLABLE_TUOP  L"\ua128"
+#define UNITEXT_YI_SYLLABLE_TUOP  U"\ua128"
 #define UNICODE_YI_SYLLABLE_TOT  0xa129
-#define UNITEXT_YI_SYLLABLE_TOT  L"\ua129"
+#define UNITEXT_YI_SYLLABLE_TOT  U"\ua129"
 #define UNICODE_YI_SYLLABLE_TOX  0xa12a
-#define UNITEXT_YI_SYLLABLE_TOX  L"\ua12a"
+#define UNITEXT_YI_SYLLABLE_TOX  U"\ua12a"
 #define UNICODE_YI_SYLLABLE_TO  0xa12b
-#define UNITEXT_YI_SYLLABLE_TO  L"\ua12b"
+#define UNITEXT_YI_SYLLABLE_TO  U"\ua12b"
 #define UNICODE_YI_SYLLABLE_TOP  0xa12c
-#define UNITEXT_YI_SYLLABLE_TOP  L"\ua12c"
+#define UNITEXT_YI_SYLLABLE_TOP  U"\ua12c"
 #define UNICODE_YI_SYLLABLE_TEX  0xa12d
-#define UNITEXT_YI_SYLLABLE_TEX  L"\ua12d"
+#define UNITEXT_YI_SYLLABLE_TEX  U"\ua12d"
 #define UNICODE_YI_SYLLABLE_TE  0xa12e
-#define UNITEXT_YI_SYLLABLE_TE  L"\ua12e"
+#define UNITEXT_YI_SYLLABLE_TE  U"\ua12e"
 #define UNICODE_YI_SYLLABLE_TEP  0xa12f
-#define UNITEXT_YI_SYLLABLE_TEP  L"\ua12f"
+#define UNITEXT_YI_SYLLABLE_TEP  U"\ua12f"
 #define UNICODE_YI_SYLLABLE_TUT  0xa130
-#define UNITEXT_YI_SYLLABLE_TUT  L"\ua130"
+#define UNITEXT_YI_SYLLABLE_TUT  U"\ua130"
 #define UNICODE_YI_SYLLABLE_TUX  0xa131
-#define UNITEXT_YI_SYLLABLE_TUX  L"\ua131"
+#define UNITEXT_YI_SYLLABLE_TUX  U"\ua131"
 #define UNICODE_YI_SYLLABLE_TU  0xa132
-#define UNITEXT_YI_SYLLABLE_TU  L"\ua132"
+#define UNITEXT_YI_SYLLABLE_TU  U"\ua132"
 #define UNICODE_YI_SYLLABLE_TUP  0xa133
-#define UNITEXT_YI_SYLLABLE_TUP  L"\ua133"
+#define UNITEXT_YI_SYLLABLE_TUP  U"\ua133"
 #define UNICODE_YI_SYLLABLE_TURX  0xa134
-#define UNITEXT_YI_SYLLABLE_TURX  L"\ua134"
+#define UNITEXT_YI_SYLLABLE_TURX  U"\ua134"
 #define UNICODE_YI_SYLLABLE_TUR  0xa135
-#define UNITEXT_YI_SYLLABLE_TUR  L"\ua135"
+#define UNITEXT_YI_SYLLABLE_TUR  U"\ua135"
 #define UNICODE_YI_SYLLABLE_DDIT  0xa136
-#define UNITEXT_YI_SYLLABLE_DDIT  L"\ua136"
+#define UNITEXT_YI_SYLLABLE_DDIT  U"\ua136"
 #define UNICODE_YI_SYLLABLE_DDIX  0xa137
-#define UNITEXT_YI_SYLLABLE_DDIX  L"\ua137"
+#define UNITEXT_YI_SYLLABLE_DDIX  U"\ua137"
 #define UNICODE_YI_SYLLABLE_DDI  0xa138
-#define UNITEXT_YI_SYLLABLE_DDI  L"\ua138"
+#define UNITEXT_YI_SYLLABLE_DDI  U"\ua138"
 #define UNICODE_YI_SYLLABLE_DDIP  0xa139
-#define UNITEXT_YI_SYLLABLE_DDIP  L"\ua139"
+#define UNITEXT_YI_SYLLABLE_DDIP  U"\ua139"
 #define UNICODE_YI_SYLLABLE_DDIEX  0xa13a
-#define UNITEXT_YI_SYLLABLE_DDIEX  L"\ua13a"
+#define UNITEXT_YI_SYLLABLE_DDIEX  U"\ua13a"
 #define UNICODE_YI_SYLLABLE_DDIE  0xa13b
-#define UNITEXT_YI_SYLLABLE_DDIE  L"\ua13b"
+#define UNITEXT_YI_SYLLABLE_DDIE  U"\ua13b"
 #define UNICODE_YI_SYLLABLE_DDIEP  0xa13c
-#define UNITEXT_YI_SYLLABLE_DDIEP  L"\ua13c"
+#define UNITEXT_YI_SYLLABLE_DDIEP  U"\ua13c"
 #define UNICODE_YI_SYLLABLE_DDAT  0xa13d
-#define UNITEXT_YI_SYLLABLE_DDAT  L"\ua13d"
+#define UNITEXT_YI_SYLLABLE_DDAT  U"\ua13d"
 #define UNICODE_YI_SYLLABLE_DDAX  0xa13e
-#define UNITEXT_YI_SYLLABLE_DDAX  L"\ua13e"
+#define UNITEXT_YI_SYLLABLE_DDAX  U"\ua13e"
 #define UNICODE_YI_SYLLABLE_DDA  0xa13f
-#define UNITEXT_YI_SYLLABLE_DDA  L"\ua13f"
+#define UNITEXT_YI_SYLLABLE_DDA  U"\ua13f"
 #define UNICODE_YI_SYLLABLE_DDAP  0xa140
-#define UNITEXT_YI_SYLLABLE_DDAP  L"\ua140"
+#define UNITEXT_YI_SYLLABLE_DDAP  U"\ua140"
 #define UNICODE_YI_SYLLABLE_DDUOX  0xa141
-#define UNITEXT_YI_SYLLABLE_DDUOX  L"\ua141"
+#define UNITEXT_YI_SYLLABLE_DDUOX  U"\ua141"
 #define UNICODE_YI_SYLLABLE_DDUO  0xa142
-#define UNITEXT_YI_SYLLABLE_DDUO  L"\ua142"
+#define UNITEXT_YI_SYLLABLE_DDUO  U"\ua142"
 #define UNICODE_YI_SYLLABLE_DDUOP  0xa143
-#define UNITEXT_YI_SYLLABLE_DDUOP  L"\ua143"
+#define UNITEXT_YI_SYLLABLE_DDUOP  U"\ua143"
 #define UNICODE_YI_SYLLABLE_DDOT  0xa144
-#define UNITEXT_YI_SYLLABLE_DDOT  L"\ua144"
+#define UNITEXT_YI_SYLLABLE_DDOT  U"\ua144"
 #define UNICODE_YI_SYLLABLE_DDOX  0xa145
-#define UNITEXT_YI_SYLLABLE_DDOX  L"\ua145"
+#define UNITEXT_YI_SYLLABLE_DDOX  U"\ua145"
 #define UNICODE_YI_SYLLABLE_DDO  0xa146
-#define UNITEXT_YI_SYLLABLE_DDO  L"\ua146"
+#define UNITEXT_YI_SYLLABLE_DDO  U"\ua146"
 #define UNICODE_YI_SYLLABLE_DDOP  0xa147
-#define UNITEXT_YI_SYLLABLE_DDOP  L"\ua147"
+#define UNITEXT_YI_SYLLABLE_DDOP  U"\ua147"
 #define UNICODE_YI_SYLLABLE_DDEX  0xa148
-#define UNITEXT_YI_SYLLABLE_DDEX  L"\ua148"
+#define UNITEXT_YI_SYLLABLE_DDEX  U"\ua148"
 #define UNICODE_YI_SYLLABLE_DDE  0xa149
-#define UNITEXT_YI_SYLLABLE_DDE  L"\ua149"
+#define UNITEXT_YI_SYLLABLE_DDE  U"\ua149"
 #define UNICODE_YI_SYLLABLE_DDEP  0xa14a
-#define UNITEXT_YI_SYLLABLE_DDEP  L"\ua14a"
+#define UNITEXT_YI_SYLLABLE_DDEP  U"\ua14a"
 #define UNICODE_YI_SYLLABLE_DDUT  0xa14b
-#define UNITEXT_YI_SYLLABLE_DDUT  L"\ua14b"
+#define UNITEXT_YI_SYLLABLE_DDUT  U"\ua14b"
 #define UNICODE_YI_SYLLABLE_DDUX  0xa14c
-#define UNITEXT_YI_SYLLABLE_DDUX  L"\ua14c"
+#define UNITEXT_YI_SYLLABLE_DDUX  U"\ua14c"
 #define UNICODE_YI_SYLLABLE_DDU  0xa14d
-#define UNITEXT_YI_SYLLABLE_DDU  L"\ua14d"
+#define UNITEXT_YI_SYLLABLE_DDU  U"\ua14d"
 #define UNICODE_YI_SYLLABLE_DDUP  0xa14e
-#define UNITEXT_YI_SYLLABLE_DDUP  L"\ua14e"
+#define UNITEXT_YI_SYLLABLE_DDUP  U"\ua14e"
 #define UNICODE_YI_SYLLABLE_DDURX  0xa14f
-#define UNITEXT_YI_SYLLABLE_DDURX  L"\ua14f"
+#define UNITEXT_YI_SYLLABLE_DDURX  U"\ua14f"
 #define UNICODE_YI_SYLLABLE_DDUR  0xa150
-#define UNITEXT_YI_SYLLABLE_DDUR  L"\ua150"
+#define UNITEXT_YI_SYLLABLE_DDUR  U"\ua150"
 #define UNICODE_YI_SYLLABLE_NDIT  0xa151
-#define UNITEXT_YI_SYLLABLE_NDIT  L"\ua151"
+#define UNITEXT_YI_SYLLABLE_NDIT  U"\ua151"
 #define UNICODE_YI_SYLLABLE_NDIX  0xa152
-#define UNITEXT_YI_SYLLABLE_NDIX  L"\ua152"
+#define UNITEXT_YI_SYLLABLE_NDIX  U"\ua152"
 #define UNICODE_YI_SYLLABLE_NDI  0xa153
-#define UNITEXT_YI_SYLLABLE_NDI  L"\ua153"
+#define UNITEXT_YI_SYLLABLE_NDI  U"\ua153"
 #define UNICODE_YI_SYLLABLE_NDIP  0xa154
-#define UNITEXT_YI_SYLLABLE_NDIP  L"\ua154"
+#define UNITEXT_YI_SYLLABLE_NDIP  U"\ua154"
 #define UNICODE_YI_SYLLABLE_NDIEX  0xa155
-#define UNITEXT_YI_SYLLABLE_NDIEX  L"\ua155"
+#define UNITEXT_YI_SYLLABLE_NDIEX  U"\ua155"
 #define UNICODE_YI_SYLLABLE_NDIE  0xa156
-#define UNITEXT_YI_SYLLABLE_NDIE  L"\ua156"
+#define UNITEXT_YI_SYLLABLE_NDIE  U"\ua156"
 #define UNICODE_YI_SYLLABLE_NDAT  0xa157
-#define UNITEXT_YI_SYLLABLE_NDAT  L"\ua157"
+#define UNITEXT_YI_SYLLABLE_NDAT  U"\ua157"
 #define UNICODE_YI_SYLLABLE_NDAX  0xa158
-#define UNITEXT_YI_SYLLABLE_NDAX  L"\ua158"
+#define UNITEXT_YI_SYLLABLE_NDAX  U"\ua158"
 #define UNICODE_YI_SYLLABLE_NDA  0xa159
-#define UNITEXT_YI_SYLLABLE_NDA  L"\ua159"
+#define UNITEXT_YI_SYLLABLE_NDA  U"\ua159"
 #define UNICODE_YI_SYLLABLE_NDAP  0xa15a
-#define UNITEXT_YI_SYLLABLE_NDAP  L"\ua15a"
+#define UNITEXT_YI_SYLLABLE_NDAP  U"\ua15a"
 #define UNICODE_YI_SYLLABLE_NDOT  0xa15b
-#define UNITEXT_YI_SYLLABLE_NDOT  L"\ua15b"
+#define UNITEXT_YI_SYLLABLE_NDOT  U"\ua15b"
 #define UNICODE_YI_SYLLABLE_NDOX  0xa15c
-#define UNITEXT_YI_SYLLABLE_NDOX  L"\ua15c"
+#define UNITEXT_YI_SYLLABLE_NDOX  U"\ua15c"
 #define UNICODE_YI_SYLLABLE_NDO  0xa15d
-#define UNITEXT_YI_SYLLABLE_NDO  L"\ua15d"
+#define UNITEXT_YI_SYLLABLE_NDO  U"\ua15d"
 #define UNICODE_YI_SYLLABLE_NDOP  0xa15e
-#define UNITEXT_YI_SYLLABLE_NDOP  L"\ua15e"
+#define UNITEXT_YI_SYLLABLE_NDOP  U"\ua15e"
 #define UNICODE_YI_SYLLABLE_NDEX  0xa15f
-#define UNITEXT_YI_SYLLABLE_NDEX  L"\ua15f"
+#define UNITEXT_YI_SYLLABLE_NDEX  U"\ua15f"
 #define UNICODE_YI_SYLLABLE_NDE  0xa160
-#define UNITEXT_YI_SYLLABLE_NDE  L"\ua160"
+#define UNITEXT_YI_SYLLABLE_NDE  U"\ua160"
 #define UNICODE_YI_SYLLABLE_NDEP  0xa161
-#define UNITEXT_YI_SYLLABLE_NDEP  L"\ua161"
+#define UNITEXT_YI_SYLLABLE_NDEP  U"\ua161"
 #define UNICODE_YI_SYLLABLE_NDUT  0xa162
-#define UNITEXT_YI_SYLLABLE_NDUT  L"\ua162"
+#define UNITEXT_YI_SYLLABLE_NDUT  U"\ua162"
 #define UNICODE_YI_SYLLABLE_NDUX  0xa163
-#define UNITEXT_YI_SYLLABLE_NDUX  L"\ua163"
+#define UNITEXT_YI_SYLLABLE_NDUX  U"\ua163"
 #define UNICODE_YI_SYLLABLE_NDU  0xa164
-#define UNITEXT_YI_SYLLABLE_NDU  L"\ua164"
+#define UNITEXT_YI_SYLLABLE_NDU  U"\ua164"
 #define UNICODE_YI_SYLLABLE_NDUP  0xa165
-#define UNITEXT_YI_SYLLABLE_NDUP  L"\ua165"
+#define UNITEXT_YI_SYLLABLE_NDUP  U"\ua165"
 #define UNICODE_YI_SYLLABLE_NDURX  0xa166
-#define UNITEXT_YI_SYLLABLE_NDURX  L"\ua166"
+#define UNITEXT_YI_SYLLABLE_NDURX  U"\ua166"
 #define UNICODE_YI_SYLLABLE_NDUR  0xa167
-#define UNITEXT_YI_SYLLABLE_NDUR  L"\ua167"
+#define UNITEXT_YI_SYLLABLE_NDUR  U"\ua167"
 #define UNICODE_YI_SYLLABLE_HNIT  0xa168
-#define UNITEXT_YI_SYLLABLE_HNIT  L"\ua168"
+#define UNITEXT_YI_SYLLABLE_HNIT  U"\ua168"
 #define UNICODE_YI_SYLLABLE_HNIX  0xa169
-#define UNITEXT_YI_SYLLABLE_HNIX  L"\ua169"
+#define UNITEXT_YI_SYLLABLE_HNIX  U"\ua169"
 #define UNICODE_YI_SYLLABLE_HNI  0xa16a
-#define UNITEXT_YI_SYLLABLE_HNI  L"\ua16a"
+#define UNITEXT_YI_SYLLABLE_HNI  U"\ua16a"
 #define UNICODE_YI_SYLLABLE_HNIP  0xa16b
-#define UNITEXT_YI_SYLLABLE_HNIP  L"\ua16b"
+#define UNITEXT_YI_SYLLABLE_HNIP  U"\ua16b"
 #define UNICODE_YI_SYLLABLE_HNIET  0xa16c
-#define UNITEXT_YI_SYLLABLE_HNIET  L"\ua16c"
+#define UNITEXT_YI_SYLLABLE_HNIET  U"\ua16c"
 #define UNICODE_YI_SYLLABLE_HNIEX  0xa16d
-#define UNITEXT_YI_SYLLABLE_HNIEX  L"\ua16d"
+#define UNITEXT_YI_SYLLABLE_HNIEX  U"\ua16d"
 #define UNICODE_YI_SYLLABLE_HNIE  0xa16e
-#define UNITEXT_YI_SYLLABLE_HNIE  L"\ua16e"
+#define UNITEXT_YI_SYLLABLE_HNIE  U"\ua16e"
 #define UNICODE_YI_SYLLABLE_HNIEP  0xa16f
-#define UNITEXT_YI_SYLLABLE_HNIEP  L"\ua16f"
+#define UNITEXT_YI_SYLLABLE_HNIEP  U"\ua16f"
 #define UNICODE_YI_SYLLABLE_HNAT  0xa170
-#define UNITEXT_YI_SYLLABLE_HNAT  L"\ua170"
+#define UNITEXT_YI_SYLLABLE_HNAT  U"\ua170"
 #define UNICODE_YI_SYLLABLE_HNAX  0xa171
-#define UNITEXT_YI_SYLLABLE_HNAX  L"\ua171"
+#define UNITEXT_YI_SYLLABLE_HNAX  U"\ua171"
 #define UNICODE_YI_SYLLABLE_HNA  0xa172
-#define UNITEXT_YI_SYLLABLE_HNA  L"\ua172"
+#define UNITEXT_YI_SYLLABLE_HNA  U"\ua172"
 #define UNICODE_YI_SYLLABLE_HNAP  0xa173
-#define UNITEXT_YI_SYLLABLE_HNAP  L"\ua173"
+#define UNITEXT_YI_SYLLABLE_HNAP  U"\ua173"
 #define UNICODE_YI_SYLLABLE_HNUOX  0xa174
-#define UNITEXT_YI_SYLLABLE_HNUOX  L"\ua174"
+#define UNITEXT_YI_SYLLABLE_HNUOX  U"\ua174"
 #define UNICODE_YI_SYLLABLE_HNUO  0xa175
-#define UNITEXT_YI_SYLLABLE_HNUO  L"\ua175"
+#define UNITEXT_YI_SYLLABLE_HNUO  U"\ua175"
 #define UNICODE_YI_SYLLABLE_HNOT  0xa176
-#define UNITEXT_YI_SYLLABLE_HNOT  L"\ua176"
+#define UNITEXT_YI_SYLLABLE_HNOT  U"\ua176"
 #define UNICODE_YI_SYLLABLE_HNOX  0xa177
-#define UNITEXT_YI_SYLLABLE_HNOX  L"\ua177"
+#define UNITEXT_YI_SYLLABLE_HNOX  U"\ua177"
 #define UNICODE_YI_SYLLABLE_HNOP  0xa178
-#define UNITEXT_YI_SYLLABLE_HNOP  L"\ua178"
+#define UNITEXT_YI_SYLLABLE_HNOP  U"\ua178"
 #define UNICODE_YI_SYLLABLE_HNEX  0xa179
-#define UNITEXT_YI_SYLLABLE_HNEX  L"\ua179"
+#define UNITEXT_YI_SYLLABLE_HNEX  U"\ua179"
 #define UNICODE_YI_SYLLABLE_HNE  0xa17a
-#define UNITEXT_YI_SYLLABLE_HNE  L"\ua17a"
+#define UNITEXT_YI_SYLLABLE_HNE  U"\ua17a"
 #define UNICODE_YI_SYLLABLE_HNEP  0xa17b
-#define UNITEXT_YI_SYLLABLE_HNEP  L"\ua17b"
+#define UNITEXT_YI_SYLLABLE_HNEP  U"\ua17b"
 #define UNICODE_YI_SYLLABLE_HNUT  0xa17c
-#define UNITEXT_YI_SYLLABLE_HNUT  L"\ua17c"
+#define UNITEXT_YI_SYLLABLE_HNUT  U"\ua17c"
 #define UNICODE_YI_SYLLABLE_NIT  0xa17d
-#define UNITEXT_YI_SYLLABLE_NIT  L"\ua17d"
+#define UNITEXT_YI_SYLLABLE_NIT  U"\ua17d"
 #define UNICODE_YI_SYLLABLE_NIX  0xa17e
-#define UNITEXT_YI_SYLLABLE_NIX  L"\ua17e"
+#define UNITEXT_YI_SYLLABLE_NIX  U"\ua17e"
 #define UNICODE_YI_SYLLABLE_NI  0xa17f
-#define UNITEXT_YI_SYLLABLE_NI  L"\ua17f"
+#define UNITEXT_YI_SYLLABLE_NI  U"\ua17f"
 #define UNICODE_YI_SYLLABLE_NIP  0xa180
-#define UNITEXT_YI_SYLLABLE_NIP  L"\ua180"
+#define UNITEXT_YI_SYLLABLE_NIP  U"\ua180"
 #define UNICODE_YI_SYLLABLE_NIEX  0xa181
-#define UNITEXT_YI_SYLLABLE_NIEX  L"\ua181"
+#define UNITEXT_YI_SYLLABLE_NIEX  U"\ua181"
 #define UNICODE_YI_SYLLABLE_NIE  0xa182
-#define UNITEXT_YI_SYLLABLE_NIE  L"\ua182"
+#define UNITEXT_YI_SYLLABLE_NIE  U"\ua182"
 #define UNICODE_YI_SYLLABLE_NIEP  0xa183
-#define UNITEXT_YI_SYLLABLE_NIEP  L"\ua183"
+#define UNITEXT_YI_SYLLABLE_NIEP  U"\ua183"
 #define UNICODE_YI_SYLLABLE_NAX  0xa184
-#define UNITEXT_YI_SYLLABLE_NAX  L"\ua184"
+#define UNITEXT_YI_SYLLABLE_NAX  U"\ua184"
 #define UNICODE_YI_SYLLABLE_NA  0xa185
-#define UNITEXT_YI_SYLLABLE_NA  L"\ua185"
+#define UNITEXT_YI_SYLLABLE_NA  U"\ua185"
 #define UNICODE_YI_SYLLABLE_NAP  0xa186
-#define UNITEXT_YI_SYLLABLE_NAP  L"\ua186"
+#define UNITEXT_YI_SYLLABLE_NAP  U"\ua186"
 #define UNICODE_YI_SYLLABLE_NUOX  0xa187
-#define UNITEXT_YI_SYLLABLE_NUOX  L"\ua187"
+#define UNITEXT_YI_SYLLABLE_NUOX  U"\ua187"
 #define UNICODE_YI_SYLLABLE_NUO  0xa188
-#define UNITEXT_YI_SYLLABLE_NUO  L"\ua188"
+#define UNITEXT_YI_SYLLABLE_NUO  U"\ua188"
 #define UNICODE_YI_SYLLABLE_NUOP  0xa189
-#define UNITEXT_YI_SYLLABLE_NUOP  L"\ua189"
+#define UNITEXT_YI_SYLLABLE_NUOP  U"\ua189"
 #define UNICODE_YI_SYLLABLE_NOT  0xa18a
-#define UNITEXT_YI_SYLLABLE_NOT  L"\ua18a"
+#define UNITEXT_YI_SYLLABLE_NOT  U"\ua18a"
 #define UNICODE_YI_SYLLABLE_NOX  0xa18b
-#define UNITEXT_YI_SYLLABLE_NOX  L"\ua18b"
+#define UNITEXT_YI_SYLLABLE_NOX  U"\ua18b"
 #define UNICODE_YI_SYLLABLE_NO  0xa18c
-#define UNITEXT_YI_SYLLABLE_NO  L"\ua18c"
+#define UNITEXT_YI_SYLLABLE_NO  U"\ua18c"
 #define UNICODE_YI_SYLLABLE_NOP  0xa18d
-#define UNITEXT_YI_SYLLABLE_NOP  L"\ua18d"
+#define UNITEXT_YI_SYLLABLE_NOP  U"\ua18d"
 #define UNICODE_YI_SYLLABLE_NEX  0xa18e
-#define UNITEXT_YI_SYLLABLE_NEX  L"\ua18e"
+#define UNITEXT_YI_SYLLABLE_NEX  U"\ua18e"
 #define UNICODE_YI_SYLLABLE_NE  0xa18f
-#define UNITEXT_YI_SYLLABLE_NE  L"\ua18f"
+#define UNITEXT_YI_SYLLABLE_NE  U"\ua18f"
 #define UNICODE_YI_SYLLABLE_NEP  0xa190
-#define UNITEXT_YI_SYLLABLE_NEP  L"\ua190"
+#define UNITEXT_YI_SYLLABLE_NEP  U"\ua190"
 #define UNICODE_YI_SYLLABLE_NUT  0xa191
-#define UNITEXT_YI_SYLLABLE_NUT  L"\ua191"
+#define UNITEXT_YI_SYLLABLE_NUT  U"\ua191"
 #define UNICODE_YI_SYLLABLE_NUX  0xa192
-#define UNITEXT_YI_SYLLABLE_NUX  L"\ua192"
+#define UNITEXT_YI_SYLLABLE_NUX  U"\ua192"
 #define UNICODE_YI_SYLLABLE_NU  0xa193
-#define UNITEXT_YI_SYLLABLE_NU  L"\ua193"
+#define UNITEXT_YI_SYLLABLE_NU  U"\ua193"
 #define UNICODE_YI_SYLLABLE_NUP  0xa194
-#define UNITEXT_YI_SYLLABLE_NUP  L"\ua194"
+#define UNITEXT_YI_SYLLABLE_NUP  U"\ua194"
 #define UNICODE_YI_SYLLABLE_NURX  0xa195
-#define UNITEXT_YI_SYLLABLE_NURX  L"\ua195"
+#define UNITEXT_YI_SYLLABLE_NURX  U"\ua195"
 #define UNICODE_YI_SYLLABLE_NUR  0xa196
-#define UNITEXT_YI_SYLLABLE_NUR  L"\ua196"
+#define UNITEXT_YI_SYLLABLE_NUR  U"\ua196"
 #define UNICODE_YI_SYLLABLE_HLIT  0xa197
-#define UNITEXT_YI_SYLLABLE_HLIT  L"\ua197"
+#define UNITEXT_YI_SYLLABLE_HLIT  U"\ua197"
 #define UNICODE_YI_SYLLABLE_HLIX  0xa198
-#define UNITEXT_YI_SYLLABLE_HLIX  L"\ua198"
+#define UNITEXT_YI_SYLLABLE_HLIX  U"\ua198"
 #define UNICODE_YI_SYLLABLE_HLI  0xa199
-#define UNITEXT_YI_SYLLABLE_HLI  L"\ua199"
+#define UNITEXT_YI_SYLLABLE_HLI  U"\ua199"
 #define UNICODE_YI_SYLLABLE_HLIP  0xa19a
-#define UNITEXT_YI_SYLLABLE_HLIP  L"\ua19a"
+#define UNITEXT_YI_SYLLABLE_HLIP  U"\ua19a"
 #define UNICODE_YI_SYLLABLE_HLIEX  0xa19b
-#define UNITEXT_YI_SYLLABLE_HLIEX  L"\ua19b"
+#define UNITEXT_YI_SYLLABLE_HLIEX  U"\ua19b"
 #define UNICODE_YI_SYLLABLE_HLIE  0xa19c
-#define UNITEXT_YI_SYLLABLE_HLIE  L"\ua19c"
+#define UNITEXT_YI_SYLLABLE_HLIE  U"\ua19c"
 #define UNICODE_YI_SYLLABLE_HLIEP  0xa19d
-#define UNITEXT_YI_SYLLABLE_HLIEP  L"\ua19d"
+#define UNITEXT_YI_SYLLABLE_HLIEP  U"\ua19d"
 #define UNICODE_YI_SYLLABLE_HLAT  0xa19e
-#define UNITEXT_YI_SYLLABLE_HLAT  L"\ua19e"
+#define UNITEXT_YI_SYLLABLE_HLAT  U"\ua19e"
 #define UNICODE_YI_SYLLABLE_HLAX  0xa19f
-#define UNITEXT_YI_SYLLABLE_HLAX  L"\ua19f"
+#define UNITEXT_YI_SYLLABLE_HLAX  U"\ua19f"
 #define UNICODE_YI_SYLLABLE_HLA  0xa1a0
-#define UNITEXT_YI_SYLLABLE_HLA  L"\ua1a0"
+#define UNITEXT_YI_SYLLABLE_HLA  U"\ua1a0"
 #define UNICODE_YI_SYLLABLE_HLAP  0xa1a1
-#define UNITEXT_YI_SYLLABLE_HLAP  L"\ua1a1"
+#define UNITEXT_YI_SYLLABLE_HLAP  U"\ua1a1"
 #define UNICODE_YI_SYLLABLE_HLUOX  0xa1a2
-#define UNITEXT_YI_SYLLABLE_HLUOX  L"\ua1a2"
+#define UNITEXT_YI_SYLLABLE_HLUOX  U"\ua1a2"
 #define UNICODE_YI_SYLLABLE_HLUO  0xa1a3
-#define UNITEXT_YI_SYLLABLE_HLUO  L"\ua1a3"
+#define UNITEXT_YI_SYLLABLE_HLUO  U"\ua1a3"
 #define UNICODE_YI_SYLLABLE_HLUOP  0xa1a4
-#define UNITEXT_YI_SYLLABLE_HLUOP  L"\ua1a4"
+#define UNITEXT_YI_SYLLABLE_HLUOP  U"\ua1a4"
 #define UNICODE_YI_SYLLABLE_HLOX  0xa1a5
-#define UNITEXT_YI_SYLLABLE_HLOX  L"\ua1a5"
+#define UNITEXT_YI_SYLLABLE_HLOX  U"\ua1a5"
 #define UNICODE_YI_SYLLABLE_HLO  0xa1a6
-#define UNITEXT_YI_SYLLABLE_HLO  L"\ua1a6"
+#define UNITEXT_YI_SYLLABLE_HLO  U"\ua1a6"
 #define UNICODE_YI_SYLLABLE_HLOP  0xa1a7
-#define UNITEXT_YI_SYLLABLE_HLOP  L"\ua1a7"
+#define UNITEXT_YI_SYLLABLE_HLOP  U"\ua1a7"
 #define UNICODE_YI_SYLLABLE_HLEX  0xa1a8
-#define UNITEXT_YI_SYLLABLE_HLEX  L"\ua1a8"
+#define UNITEXT_YI_SYLLABLE_HLEX  U"\ua1a8"
 #define UNICODE_YI_SYLLABLE_HLE  0xa1a9
-#define UNITEXT_YI_SYLLABLE_HLE  L"\ua1a9"
+#define UNITEXT_YI_SYLLABLE_HLE  U"\ua1a9"
 #define UNICODE_YI_SYLLABLE_HLEP  0xa1aa
-#define UNITEXT_YI_SYLLABLE_HLEP  L"\ua1aa"
+#define UNITEXT_YI_SYLLABLE_HLEP  U"\ua1aa"
 #define UNICODE_YI_SYLLABLE_HLUT  0xa1ab
-#define UNITEXT_YI_SYLLABLE_HLUT  L"\ua1ab"
+#define UNITEXT_YI_SYLLABLE_HLUT  U"\ua1ab"
 #define UNICODE_YI_SYLLABLE_HLUX  0xa1ac
-#define UNITEXT_YI_SYLLABLE_HLUX  L"\ua1ac"
+#define UNITEXT_YI_SYLLABLE_HLUX  U"\ua1ac"
 #define UNICODE_YI_SYLLABLE_HLU  0xa1ad
-#define UNITEXT_YI_SYLLABLE_HLU  L"\ua1ad"
+#define UNITEXT_YI_SYLLABLE_HLU  U"\ua1ad"
 #define UNICODE_YI_SYLLABLE_HLUP  0xa1ae
-#define UNITEXT_YI_SYLLABLE_HLUP  L"\ua1ae"
+#define UNITEXT_YI_SYLLABLE_HLUP  U"\ua1ae"
 #define UNICODE_YI_SYLLABLE_HLURX  0xa1af
-#define UNITEXT_YI_SYLLABLE_HLURX  L"\ua1af"
+#define UNITEXT_YI_SYLLABLE_HLURX  U"\ua1af"
 #define UNICODE_YI_SYLLABLE_HLUR  0xa1b0
-#define UNITEXT_YI_SYLLABLE_HLUR  L"\ua1b0"
+#define UNITEXT_YI_SYLLABLE_HLUR  U"\ua1b0"
 #define UNICODE_YI_SYLLABLE_HLYT  0xa1b1
-#define UNITEXT_YI_SYLLABLE_HLYT  L"\ua1b1"
+#define UNITEXT_YI_SYLLABLE_HLYT  U"\ua1b1"
 #define UNICODE_YI_SYLLABLE_HLYX  0xa1b2
-#define UNITEXT_YI_SYLLABLE_HLYX  L"\ua1b2"
+#define UNITEXT_YI_SYLLABLE_HLYX  U"\ua1b2"
 #define UNICODE_YI_SYLLABLE_HLY  0xa1b3
-#define UNITEXT_YI_SYLLABLE_HLY  L"\ua1b3"
+#define UNITEXT_YI_SYLLABLE_HLY  U"\ua1b3"
 #define UNICODE_YI_SYLLABLE_HLYP  0xa1b4
-#define UNITEXT_YI_SYLLABLE_HLYP  L"\ua1b4"
+#define UNITEXT_YI_SYLLABLE_HLYP  U"\ua1b4"
 #define UNICODE_YI_SYLLABLE_HLYRX  0xa1b5
-#define UNITEXT_YI_SYLLABLE_HLYRX  L"\ua1b5"
+#define UNITEXT_YI_SYLLABLE_HLYRX  U"\ua1b5"
 #define UNICODE_YI_SYLLABLE_HLYR  0xa1b6
-#define UNITEXT_YI_SYLLABLE_HLYR  L"\ua1b6"
+#define UNITEXT_YI_SYLLABLE_HLYR  U"\ua1b6"
 #define UNICODE_YI_SYLLABLE_LIT  0xa1b7
-#define UNITEXT_YI_SYLLABLE_LIT  L"\ua1b7"
+#define UNITEXT_YI_SYLLABLE_LIT  U"\ua1b7"
 #define UNICODE_YI_SYLLABLE_LIX  0xa1b8
-#define UNITEXT_YI_SYLLABLE_LIX  L"\ua1b8"
+#define UNITEXT_YI_SYLLABLE_LIX  U"\ua1b8"
 #define UNICODE_YI_SYLLABLE_LI  0xa1b9
-#define UNITEXT_YI_SYLLABLE_LI  L"\ua1b9"
+#define UNITEXT_YI_SYLLABLE_LI  U"\ua1b9"
 #define UNICODE_YI_SYLLABLE_LIP  0xa1ba
-#define UNITEXT_YI_SYLLABLE_LIP  L"\ua1ba"
+#define UNITEXT_YI_SYLLABLE_LIP  U"\ua1ba"
 #define UNICODE_YI_SYLLABLE_LIET  0xa1bb
-#define UNITEXT_YI_SYLLABLE_LIET  L"\ua1bb"
+#define UNITEXT_YI_SYLLABLE_LIET  U"\ua1bb"
 #define UNICODE_YI_SYLLABLE_LIEX  0xa1bc
-#define UNITEXT_YI_SYLLABLE_LIEX  L"\ua1bc"
+#define UNITEXT_YI_SYLLABLE_LIEX  U"\ua1bc"
 #define UNICODE_YI_SYLLABLE_LIE  0xa1bd
-#define UNITEXT_YI_SYLLABLE_LIE  L"\ua1bd"
+#define UNITEXT_YI_SYLLABLE_LIE  U"\ua1bd"
 #define UNICODE_YI_SYLLABLE_LIEP  0xa1be
-#define UNITEXT_YI_SYLLABLE_LIEP  L"\ua1be"
+#define UNITEXT_YI_SYLLABLE_LIEP  U"\ua1be"
 #define UNICODE_YI_SYLLABLE_LAT  0xa1bf
-#define UNITEXT_YI_SYLLABLE_LAT  L"\ua1bf"
+#define UNITEXT_YI_SYLLABLE_LAT  U"\ua1bf"
 #define UNICODE_YI_SYLLABLE_LAX  0xa1c0
-#define UNITEXT_YI_SYLLABLE_LAX  L"\ua1c0"
+#define UNITEXT_YI_SYLLABLE_LAX  U"\ua1c0"
 #define UNICODE_YI_SYLLABLE_LA  0xa1c1
-#define UNITEXT_YI_SYLLABLE_LA  L"\ua1c1"
+#define UNITEXT_YI_SYLLABLE_LA  U"\ua1c1"
 #define UNICODE_YI_SYLLABLE_LAP  0xa1c2
-#define UNITEXT_YI_SYLLABLE_LAP  L"\ua1c2"
+#define UNITEXT_YI_SYLLABLE_LAP  U"\ua1c2"
 #define UNICODE_YI_SYLLABLE_LUOT  0xa1c3
-#define UNITEXT_YI_SYLLABLE_LUOT  L"\ua1c3"
+#define UNITEXT_YI_SYLLABLE_LUOT  U"\ua1c3"
 #define UNICODE_YI_SYLLABLE_LUOX  0xa1c4
-#define UNITEXT_YI_SYLLABLE_LUOX  L"\ua1c4"
+#define UNITEXT_YI_SYLLABLE_LUOX  U"\ua1c4"
 #define UNICODE_YI_SYLLABLE_LUO  0xa1c5
-#define UNITEXT_YI_SYLLABLE_LUO  L"\ua1c5"
+#define UNITEXT_YI_SYLLABLE_LUO  U"\ua1c5"
 #define UNICODE_YI_SYLLABLE_LUOP  0xa1c6
-#define UNITEXT_YI_SYLLABLE_LUOP  L"\ua1c6"
+#define UNITEXT_YI_SYLLABLE_LUOP  U"\ua1c6"
 #define UNICODE_YI_SYLLABLE_LOT  0xa1c7
-#define UNITEXT_YI_SYLLABLE_LOT  L"\ua1c7"
+#define UNITEXT_YI_SYLLABLE_LOT  U"\ua1c7"
 #define UNICODE_YI_SYLLABLE_LOX  0xa1c8
-#define UNITEXT_YI_SYLLABLE_LOX  L"\ua1c8"
+#define UNITEXT_YI_SYLLABLE_LOX  U"\ua1c8"
 #define UNICODE_YI_SYLLABLE_LO  0xa1c9
-#define UNITEXT_YI_SYLLABLE_LO  L"\ua1c9"
+#define UNITEXT_YI_SYLLABLE_LO  U"\ua1c9"
 #define UNICODE_YI_SYLLABLE_LOP  0xa1ca
-#define UNITEXT_YI_SYLLABLE_LOP  L"\ua1ca"
+#define UNITEXT_YI_SYLLABLE_LOP  U"\ua1ca"
 #define UNICODE_YI_SYLLABLE_LEX  0xa1cb
-#define UNITEXT_YI_SYLLABLE_LEX  L"\ua1cb"
+#define UNITEXT_YI_SYLLABLE_LEX  U"\ua1cb"
 #define UNICODE_YI_SYLLABLE_LE  0xa1cc
-#define UNITEXT_YI_SYLLABLE_LE  L"\ua1cc"
+#define UNITEXT_YI_SYLLABLE_LE  U"\ua1cc"
 #define UNICODE_YI_SYLLABLE_LEP  0xa1cd
-#define UNITEXT_YI_SYLLABLE_LEP  L"\ua1cd"
+#define UNITEXT_YI_SYLLABLE_LEP  U"\ua1cd"
 #define UNICODE_YI_SYLLABLE_LUT  0xa1ce
-#define UNITEXT_YI_SYLLABLE_LUT  L"\ua1ce"
+#define UNITEXT_YI_SYLLABLE_LUT  U"\ua1ce"
 #define UNICODE_YI_SYLLABLE_LUX  0xa1cf
-#define UNITEXT_YI_SYLLABLE_LUX  L"\ua1cf"
+#define UNITEXT_YI_SYLLABLE_LUX  U"\ua1cf"
 #define UNICODE_YI_SYLLABLE_LU  0xa1d0
-#define UNITEXT_YI_SYLLABLE_LU  L"\ua1d0"
+#define UNITEXT_YI_SYLLABLE_LU  U"\ua1d0"
 #define UNICODE_YI_SYLLABLE_LUP  0xa1d1
-#define UNITEXT_YI_SYLLABLE_LUP  L"\ua1d1"
+#define UNITEXT_YI_SYLLABLE_LUP  U"\ua1d1"
 #define UNICODE_YI_SYLLABLE_LURX  0xa1d2
-#define UNITEXT_YI_SYLLABLE_LURX  L"\ua1d2"
+#define UNITEXT_YI_SYLLABLE_LURX  U"\ua1d2"
 #define UNICODE_YI_SYLLABLE_LUR  0xa1d3
-#define UNITEXT_YI_SYLLABLE_LUR  L"\ua1d3"
+#define UNITEXT_YI_SYLLABLE_LUR  U"\ua1d3"
 #define UNICODE_YI_SYLLABLE_LYT  0xa1d4
-#define UNITEXT_YI_SYLLABLE_LYT  L"\ua1d4"
+#define UNITEXT_YI_SYLLABLE_LYT  U"\ua1d4"
 #define UNICODE_YI_SYLLABLE_LYX  0xa1d5
-#define UNITEXT_YI_SYLLABLE_LYX  L"\ua1d5"
+#define UNITEXT_YI_SYLLABLE_LYX  U"\ua1d5"
 #define UNICODE_YI_SYLLABLE_LY  0xa1d6
-#define UNITEXT_YI_SYLLABLE_LY  L"\ua1d6"
+#define UNITEXT_YI_SYLLABLE_LY  U"\ua1d6"
 #define UNICODE_YI_SYLLABLE_LYP  0xa1d7
-#define UNITEXT_YI_SYLLABLE_LYP  L"\ua1d7"
+#define UNITEXT_YI_SYLLABLE_LYP  U"\ua1d7"
 #define UNICODE_YI_SYLLABLE_LYRX  0xa1d8
-#define UNITEXT_YI_SYLLABLE_LYRX  L"\ua1d8"
+#define UNITEXT_YI_SYLLABLE_LYRX  U"\ua1d8"
 #define UNICODE_YI_SYLLABLE_LYR  0xa1d9
-#define UNITEXT_YI_SYLLABLE_LYR  L"\ua1d9"
+#define UNITEXT_YI_SYLLABLE_LYR  U"\ua1d9"
 #define UNICODE_YI_SYLLABLE_GIT  0xa1da
-#define UNITEXT_YI_SYLLABLE_GIT  L"\ua1da"
+#define UNITEXT_YI_SYLLABLE_GIT  U"\ua1da"
 #define UNICODE_YI_SYLLABLE_GIX  0xa1db
-#define UNITEXT_YI_SYLLABLE_GIX  L"\ua1db"
+#define UNITEXT_YI_SYLLABLE_GIX  U"\ua1db"
 #define UNICODE_YI_SYLLABLE_GI  0xa1dc
-#define UNITEXT_YI_SYLLABLE_GI  L"\ua1dc"
+#define UNITEXT_YI_SYLLABLE_GI  U"\ua1dc"
 #define UNICODE_YI_SYLLABLE_GIP  0xa1dd
-#define UNITEXT_YI_SYLLABLE_GIP  L"\ua1dd"
+#define UNITEXT_YI_SYLLABLE_GIP  U"\ua1dd"
 #define UNICODE_YI_SYLLABLE_GIET  0xa1de
-#define UNITEXT_YI_SYLLABLE_GIET  L"\ua1de"
+#define UNITEXT_YI_SYLLABLE_GIET  U"\ua1de"
 #define UNICODE_YI_SYLLABLE_GIEX  0xa1df
-#define UNITEXT_YI_SYLLABLE_GIEX  L"\ua1df"
+#define UNITEXT_YI_SYLLABLE_GIEX  U"\ua1df"
 #define UNICODE_YI_SYLLABLE_GIE  0xa1e0
-#define UNITEXT_YI_SYLLABLE_GIE  L"\ua1e0"
+#define UNITEXT_YI_SYLLABLE_GIE  U"\ua1e0"
 #define UNICODE_YI_SYLLABLE_GIEP  0xa1e1
-#define UNITEXT_YI_SYLLABLE_GIEP  L"\ua1e1"
+#define UNITEXT_YI_SYLLABLE_GIEP  U"\ua1e1"
 #define UNICODE_YI_SYLLABLE_GAT  0xa1e2
-#define UNITEXT_YI_SYLLABLE_GAT  L"\ua1e2"
+#define UNITEXT_YI_SYLLABLE_GAT  U"\ua1e2"
 #define UNICODE_YI_SYLLABLE_GAX  0xa1e3
-#define UNITEXT_YI_SYLLABLE_GAX  L"\ua1e3"
+#define UNITEXT_YI_SYLLABLE_GAX  U"\ua1e3"
 #define UNICODE_YI_SYLLABLE_GA  0xa1e4
-#define UNITEXT_YI_SYLLABLE_GA  L"\ua1e4"
+#define UNITEXT_YI_SYLLABLE_GA  U"\ua1e4"
 #define UNICODE_YI_SYLLABLE_GAP  0xa1e5
-#define UNITEXT_YI_SYLLABLE_GAP  L"\ua1e5"
+#define UNITEXT_YI_SYLLABLE_GAP  U"\ua1e5"
 #define UNICODE_YI_SYLLABLE_GUOT  0xa1e6
-#define UNITEXT_YI_SYLLABLE_GUOT  L"\ua1e6"
+#define UNITEXT_YI_SYLLABLE_GUOT  U"\ua1e6"
 #define UNICODE_YI_SYLLABLE_GUOX  0xa1e7
-#define UNITEXT_YI_SYLLABLE_GUOX  L"\ua1e7"
+#define UNITEXT_YI_SYLLABLE_GUOX  U"\ua1e7"
 #define UNICODE_YI_SYLLABLE_GUO  0xa1e8
-#define UNITEXT_YI_SYLLABLE_GUO  L"\ua1e8"
+#define UNITEXT_YI_SYLLABLE_GUO  U"\ua1e8"
 #define UNICODE_YI_SYLLABLE_GUOP  0xa1e9
-#define UNITEXT_YI_SYLLABLE_GUOP  L"\ua1e9"
+#define UNITEXT_YI_SYLLABLE_GUOP  U"\ua1e9"
 #define UNICODE_YI_SYLLABLE_GOT  0xa1ea
-#define UNITEXT_YI_SYLLABLE_GOT  L"\ua1ea"
+#define UNITEXT_YI_SYLLABLE_GOT  U"\ua1ea"
 #define UNICODE_YI_SYLLABLE_GOX  0xa1eb
-#define UNITEXT_YI_SYLLABLE_GOX  L"\ua1eb"
+#define UNITEXT_YI_SYLLABLE_GOX  U"\ua1eb"
 #define UNICODE_YI_SYLLABLE_GO  0xa1ec
-#define UNITEXT_YI_SYLLABLE_GO  L"\ua1ec"
+#define UNITEXT_YI_SYLLABLE_GO  U"\ua1ec"
 #define UNICODE_YI_SYLLABLE_GOP  0xa1ed
-#define UNITEXT_YI_SYLLABLE_GOP  L"\ua1ed"
+#define UNITEXT_YI_SYLLABLE_GOP  U"\ua1ed"
 #define UNICODE_YI_SYLLABLE_GET  0xa1ee
-#define UNITEXT_YI_SYLLABLE_GET  L"\ua1ee"
+#define UNITEXT_YI_SYLLABLE_GET  U"\ua1ee"
 #define UNICODE_YI_SYLLABLE_GEX  0xa1ef
-#define UNITEXT_YI_SYLLABLE_GEX  L"\ua1ef"
+#define UNITEXT_YI_SYLLABLE_GEX  U"\ua1ef"
 #define UNICODE_YI_SYLLABLE_GE  0xa1f0
-#define UNITEXT_YI_SYLLABLE_GE  L"\ua1f0"
+#define UNITEXT_YI_SYLLABLE_GE  U"\ua1f0"
 #define UNICODE_YI_SYLLABLE_GEP  0xa1f1
-#define UNITEXT_YI_SYLLABLE_GEP  L"\ua1f1"
+#define UNITEXT_YI_SYLLABLE_GEP  U"\ua1f1"
 #define UNICODE_YI_SYLLABLE_GUT  0xa1f2
-#define UNITEXT_YI_SYLLABLE_GUT  L"\ua1f2"
+#define UNITEXT_YI_SYLLABLE_GUT  U"\ua1f2"
 #define UNICODE_YI_SYLLABLE_GUX  0xa1f3
-#define UNITEXT_YI_SYLLABLE_GUX  L"\ua1f3"
+#define UNITEXT_YI_SYLLABLE_GUX  U"\ua1f3"
 #define UNICODE_YI_SYLLABLE_GU  0xa1f4
-#define UNITEXT_YI_SYLLABLE_GU  L"\ua1f4"
+#define UNITEXT_YI_SYLLABLE_GU  U"\ua1f4"
 #define UNICODE_YI_SYLLABLE_GUP  0xa1f5
-#define UNITEXT_YI_SYLLABLE_GUP  L"\ua1f5"
+#define UNITEXT_YI_SYLLABLE_GUP  U"\ua1f5"
 #define UNICODE_YI_SYLLABLE_GURX  0xa1f6
-#define UNITEXT_YI_SYLLABLE_GURX  L"\ua1f6"
+#define UNITEXT_YI_SYLLABLE_GURX  U"\ua1f6"
 #define UNICODE_YI_SYLLABLE_GUR  0xa1f7
-#define UNITEXT_YI_SYLLABLE_GUR  L"\ua1f7"
+#define UNITEXT_YI_SYLLABLE_GUR  U"\ua1f7"
 #define UNICODE_YI_SYLLABLE_KIT  0xa1f8
-#define UNITEXT_YI_SYLLABLE_KIT  L"\ua1f8"
+#define UNITEXT_YI_SYLLABLE_KIT  U"\ua1f8"
 #define UNICODE_YI_SYLLABLE_KIX  0xa1f9
-#define UNITEXT_YI_SYLLABLE_KIX  L"\ua1f9"
+#define UNITEXT_YI_SYLLABLE_KIX  U"\ua1f9"
 #define UNICODE_YI_SYLLABLE_KI  0xa1fa
-#define UNITEXT_YI_SYLLABLE_KI  L"\ua1fa"
+#define UNITEXT_YI_SYLLABLE_KI  U"\ua1fa"
 #define UNICODE_YI_SYLLABLE_KIP  0xa1fb
-#define UNITEXT_YI_SYLLABLE_KIP  L"\ua1fb"
+#define UNITEXT_YI_SYLLABLE_KIP  U"\ua1fb"
 #define UNICODE_YI_SYLLABLE_KIEX  0xa1fc
-#define UNITEXT_YI_SYLLABLE_KIEX  L"\ua1fc"
+#define UNITEXT_YI_SYLLABLE_KIEX  U"\ua1fc"
 #define UNICODE_YI_SYLLABLE_KIE  0xa1fd
-#define UNITEXT_YI_SYLLABLE_KIE  L"\ua1fd"
+#define UNITEXT_YI_SYLLABLE_KIE  U"\ua1fd"
 #define UNICODE_YI_SYLLABLE_KIEP  0xa1fe
-#define UNITEXT_YI_SYLLABLE_KIEP  L"\ua1fe"
+#define UNITEXT_YI_SYLLABLE_KIEP  U"\ua1fe"
 #define UNICODE_YI_SYLLABLE_KAT  0xa1ff
-#define UNITEXT_YI_SYLLABLE_KAT  L"\ua1ff"
+#define UNITEXT_YI_SYLLABLE_KAT  U"\ua1ff"
 #define UNICODE_YI_SYLLABLE_KAX  0xa200
-#define UNITEXT_YI_SYLLABLE_KAX  L"\ua200"
+#define UNITEXT_YI_SYLLABLE_KAX  U"\ua200"
 #define UNICODE_YI_SYLLABLE_KA  0xa201
-#define UNITEXT_YI_SYLLABLE_KA  L"\ua201"
+#define UNITEXT_YI_SYLLABLE_KA  U"\ua201"
 #define UNICODE_YI_SYLLABLE_KAP  0xa202
-#define UNITEXT_YI_SYLLABLE_KAP  L"\ua202"
+#define UNITEXT_YI_SYLLABLE_KAP  U"\ua202"
 #define UNICODE_YI_SYLLABLE_KUOX  0xa203
-#define UNITEXT_YI_SYLLABLE_KUOX  L"\ua203"
+#define UNITEXT_YI_SYLLABLE_KUOX  U"\ua203"
 #define UNICODE_YI_SYLLABLE_KUO  0xa204
-#define UNITEXT_YI_SYLLABLE_KUO  L"\ua204"
+#define UNITEXT_YI_SYLLABLE_KUO  U"\ua204"
 #define UNICODE_YI_SYLLABLE_KUOP  0xa205
-#define UNITEXT_YI_SYLLABLE_KUOP  L"\ua205"
+#define UNITEXT_YI_SYLLABLE_KUOP  U"\ua205"
 #define UNICODE_YI_SYLLABLE_KOT  0xa206
-#define UNITEXT_YI_SYLLABLE_KOT  L"\ua206"
+#define UNITEXT_YI_SYLLABLE_KOT  U"\ua206"
 #define UNICODE_YI_SYLLABLE_KOX  0xa207
-#define UNITEXT_YI_SYLLABLE_KOX  L"\ua207"
+#define UNITEXT_YI_SYLLABLE_KOX  U"\ua207"
 #define UNICODE_YI_SYLLABLE_KO  0xa208
-#define UNITEXT_YI_SYLLABLE_KO  L"\ua208"
+#define UNITEXT_YI_SYLLABLE_KO  U"\ua208"
 #define UNICODE_YI_SYLLABLE_KOP  0xa209
-#define UNITEXT_YI_SYLLABLE_KOP  L"\ua209"
+#define UNITEXT_YI_SYLLABLE_KOP  U"\ua209"
 #define UNICODE_YI_SYLLABLE_KET  0xa20a
-#define UNITEXT_YI_SYLLABLE_KET  L"\ua20a"
+#define UNITEXT_YI_SYLLABLE_KET  U"\ua20a"
 #define UNICODE_YI_SYLLABLE_KEX  0xa20b
-#define UNITEXT_YI_SYLLABLE_KEX  L"\ua20b"
+#define UNITEXT_YI_SYLLABLE_KEX  U"\ua20b"
 #define UNICODE_YI_SYLLABLE_KE  0xa20c
-#define UNITEXT_YI_SYLLABLE_KE  L"\ua20c"
+#define UNITEXT_YI_SYLLABLE_KE  U"\ua20c"
 #define UNICODE_YI_SYLLABLE_KEP  0xa20d
-#define UNITEXT_YI_SYLLABLE_KEP  L"\ua20d"
+#define UNITEXT_YI_SYLLABLE_KEP  U"\ua20d"
 #define UNICODE_YI_SYLLABLE_KUT  0xa20e
-#define UNITEXT_YI_SYLLABLE_KUT  L"\ua20e"
+#define UNITEXT_YI_SYLLABLE_KUT  U"\ua20e"
 #define UNICODE_YI_SYLLABLE_KUX  0xa20f
-#define UNITEXT_YI_SYLLABLE_KUX  L"\ua20f"
+#define UNITEXT_YI_SYLLABLE_KUX  U"\ua20f"
 #define UNICODE_YI_SYLLABLE_KU  0xa210
-#define UNITEXT_YI_SYLLABLE_KU  L"\ua210"
+#define UNITEXT_YI_SYLLABLE_KU  U"\ua210"
 #define UNICODE_YI_SYLLABLE_KUP  0xa211
-#define UNITEXT_YI_SYLLABLE_KUP  L"\ua211"
+#define UNITEXT_YI_SYLLABLE_KUP  U"\ua211"
 #define UNICODE_YI_SYLLABLE_KURX  0xa212
-#define UNITEXT_YI_SYLLABLE_KURX  L"\ua212"
+#define UNITEXT_YI_SYLLABLE_KURX  U"\ua212"
 #define UNICODE_YI_SYLLABLE_KUR  0xa213
-#define UNITEXT_YI_SYLLABLE_KUR  L"\ua213"
+#define UNITEXT_YI_SYLLABLE_KUR  U"\ua213"
 #define UNICODE_YI_SYLLABLE_GGIT  0xa214
-#define UNITEXT_YI_SYLLABLE_GGIT  L"\ua214"
+#define UNITEXT_YI_SYLLABLE_GGIT  U"\ua214"
 #define UNICODE_YI_SYLLABLE_GGIX  0xa215
-#define UNITEXT_YI_SYLLABLE_GGIX  L"\ua215"
+#define UNITEXT_YI_SYLLABLE_GGIX  U"\ua215"
 #define UNICODE_YI_SYLLABLE_GGI  0xa216
-#define UNITEXT_YI_SYLLABLE_GGI  L"\ua216"
+#define UNITEXT_YI_SYLLABLE_GGI  U"\ua216"
 #define UNICODE_YI_SYLLABLE_GGIEX  0xa217
-#define UNITEXT_YI_SYLLABLE_GGIEX  L"\ua217"
+#define UNITEXT_YI_SYLLABLE_GGIEX  U"\ua217"
 #define UNICODE_YI_SYLLABLE_GGIE  0xa218
-#define UNITEXT_YI_SYLLABLE_GGIE  L"\ua218"
+#define UNITEXT_YI_SYLLABLE_GGIE  U"\ua218"
 #define UNICODE_YI_SYLLABLE_GGIEP  0xa219
-#define UNITEXT_YI_SYLLABLE_GGIEP  L"\ua219"
+#define UNITEXT_YI_SYLLABLE_GGIEP  U"\ua219"
 #define UNICODE_YI_SYLLABLE_GGAT  0xa21a
-#define UNITEXT_YI_SYLLABLE_GGAT  L"\ua21a"
+#define UNITEXT_YI_SYLLABLE_GGAT  U"\ua21a"
 #define UNICODE_YI_SYLLABLE_GGAX  0xa21b
-#define UNITEXT_YI_SYLLABLE_GGAX  L"\ua21b"
+#define UNITEXT_YI_SYLLABLE_GGAX  U"\ua21b"
 #define UNICODE_YI_SYLLABLE_GGA  0xa21c
-#define UNITEXT_YI_SYLLABLE_GGA  L"\ua21c"
+#define UNITEXT_YI_SYLLABLE_GGA  U"\ua21c"
 #define UNICODE_YI_SYLLABLE_GGAP  0xa21d
-#define UNITEXT_YI_SYLLABLE_GGAP  L"\ua21d"
+#define UNITEXT_YI_SYLLABLE_GGAP  U"\ua21d"
 #define UNICODE_YI_SYLLABLE_GGUOT  0xa21e
-#define UNITEXT_YI_SYLLABLE_GGUOT  L"\ua21e"
+#define UNITEXT_YI_SYLLABLE_GGUOT  U"\ua21e"
 #define UNICODE_YI_SYLLABLE_GGUOX  0xa21f
-#define UNITEXT_YI_SYLLABLE_GGUOX  L"\ua21f"
+#define UNITEXT_YI_SYLLABLE_GGUOX  U"\ua21f"
 #define UNICODE_YI_SYLLABLE_GGUO  0xa220
-#define UNITEXT_YI_SYLLABLE_GGUO  L"\ua220"
+#define UNITEXT_YI_SYLLABLE_GGUO  U"\ua220"
 #define UNICODE_YI_SYLLABLE_GGUOP  0xa221
-#define UNITEXT_YI_SYLLABLE_GGUOP  L"\ua221"
+#define UNITEXT_YI_SYLLABLE_GGUOP  U"\ua221"
 #define UNICODE_YI_SYLLABLE_GGOT  0xa222
-#define UNITEXT_YI_SYLLABLE_GGOT  L"\ua222"
+#define UNITEXT_YI_SYLLABLE_GGOT  U"\ua222"
 #define UNICODE_YI_SYLLABLE_GGOX  0xa223
-#define UNITEXT_YI_SYLLABLE_GGOX  L"\ua223"
+#define UNITEXT_YI_SYLLABLE_GGOX  U"\ua223"
 #define UNICODE_YI_SYLLABLE_GGO  0xa224
-#define UNITEXT_YI_SYLLABLE_GGO  L"\ua224"
+#define UNITEXT_YI_SYLLABLE_GGO  U"\ua224"
 #define UNICODE_YI_SYLLABLE_GGOP  0xa225
-#define UNITEXT_YI_SYLLABLE_GGOP  L"\ua225"
+#define UNITEXT_YI_SYLLABLE_GGOP  U"\ua225"
 #define UNICODE_YI_SYLLABLE_GGET  0xa226
-#define UNITEXT_YI_SYLLABLE_GGET  L"\ua226"
+#define UNITEXT_YI_SYLLABLE_GGET  U"\ua226"
 #define UNICODE_YI_SYLLABLE_GGEX  0xa227
-#define UNITEXT_YI_SYLLABLE_GGEX  L"\ua227"
+#define UNITEXT_YI_SYLLABLE_GGEX  U"\ua227"
 #define UNICODE_YI_SYLLABLE_GGE  0xa228
-#define UNITEXT_YI_SYLLABLE_GGE  L"\ua228"
+#define UNITEXT_YI_SYLLABLE_GGE  U"\ua228"
 #define UNICODE_YI_SYLLABLE_GGEP  0xa229
-#define UNITEXT_YI_SYLLABLE_GGEP  L"\ua229"
+#define UNITEXT_YI_SYLLABLE_GGEP  U"\ua229"
 #define UNICODE_YI_SYLLABLE_GGUT  0xa22a
-#define UNITEXT_YI_SYLLABLE_GGUT  L"\ua22a"
+#define UNITEXT_YI_SYLLABLE_GGUT  U"\ua22a"
 #define UNICODE_YI_SYLLABLE_GGUX  0xa22b
-#define UNITEXT_YI_SYLLABLE_GGUX  L"\ua22b"
+#define UNITEXT_YI_SYLLABLE_GGUX  U"\ua22b"
 #define UNICODE_YI_SYLLABLE_GGU  0xa22c
-#define UNITEXT_YI_SYLLABLE_GGU  L"\ua22c"
+#define UNITEXT_YI_SYLLABLE_GGU  U"\ua22c"
 #define UNICODE_YI_SYLLABLE_GGUP  0xa22d
-#define UNITEXT_YI_SYLLABLE_GGUP  L"\ua22d"
+#define UNITEXT_YI_SYLLABLE_GGUP  U"\ua22d"
 #define UNICODE_YI_SYLLABLE_GGURX  0xa22e
-#define UNITEXT_YI_SYLLABLE_GGURX  L"\ua22e"
+#define UNITEXT_YI_SYLLABLE_GGURX  U"\ua22e"
 #define UNICODE_YI_SYLLABLE_GGUR  0xa22f
-#define UNITEXT_YI_SYLLABLE_GGUR  L"\ua22f"
+#define UNITEXT_YI_SYLLABLE_GGUR  U"\ua22f"
 #define UNICODE_YI_SYLLABLE_MGIEX  0xa230
-#define UNITEXT_YI_SYLLABLE_MGIEX  L"\ua230"
+#define UNITEXT_YI_SYLLABLE_MGIEX  U"\ua230"
 #define UNICODE_YI_SYLLABLE_MGIE  0xa231
-#define UNITEXT_YI_SYLLABLE_MGIE  L"\ua231"
+#define UNITEXT_YI_SYLLABLE_MGIE  U"\ua231"
 #define UNICODE_YI_SYLLABLE_MGAT  0xa232
-#define UNITEXT_YI_SYLLABLE_MGAT  L"\ua232"
+#define UNITEXT_YI_SYLLABLE_MGAT  U"\ua232"
 #define UNICODE_YI_SYLLABLE_MGAX  0xa233
-#define UNITEXT_YI_SYLLABLE_MGAX  L"\ua233"
+#define UNITEXT_YI_SYLLABLE_MGAX  U"\ua233"
 #define UNICODE_YI_SYLLABLE_MGA  0xa234
-#define UNITEXT_YI_SYLLABLE_MGA  L"\ua234"
+#define UNITEXT_YI_SYLLABLE_MGA  U"\ua234"
 #define UNICODE_YI_SYLLABLE_MGAP  0xa235
-#define UNITEXT_YI_SYLLABLE_MGAP  L"\ua235"
+#define UNITEXT_YI_SYLLABLE_MGAP  U"\ua235"
 #define UNICODE_YI_SYLLABLE_MGUOX  0xa236
-#define UNITEXT_YI_SYLLABLE_MGUOX  L"\ua236"
+#define UNITEXT_YI_SYLLABLE_MGUOX  U"\ua236"
 #define UNICODE_YI_SYLLABLE_MGUO  0xa237
-#define UNITEXT_YI_SYLLABLE_MGUO  L"\ua237"
+#define UNITEXT_YI_SYLLABLE_MGUO  U"\ua237"
 #define UNICODE_YI_SYLLABLE_MGUOP  0xa238
-#define UNITEXT_YI_SYLLABLE_MGUOP  L"\ua238"
+#define UNITEXT_YI_SYLLABLE_MGUOP  U"\ua238"
 #define UNICODE_YI_SYLLABLE_MGOT  0xa239
-#define UNITEXT_YI_SYLLABLE_MGOT  L"\ua239"
+#define UNITEXT_YI_SYLLABLE_MGOT  U"\ua239"
 #define UNICODE_YI_SYLLABLE_MGOX  0xa23a
-#define UNITEXT_YI_SYLLABLE_MGOX  L"\ua23a"
+#define UNITEXT_YI_SYLLABLE_MGOX  U"\ua23a"
 #define UNICODE_YI_SYLLABLE_MGO  0xa23b
-#define UNITEXT_YI_SYLLABLE_MGO  L"\ua23b"
+#define UNITEXT_YI_SYLLABLE_MGO  U"\ua23b"
 #define UNICODE_YI_SYLLABLE_MGOP  0xa23c
-#define UNITEXT_YI_SYLLABLE_MGOP  L"\ua23c"
+#define UNITEXT_YI_SYLLABLE_MGOP  U"\ua23c"
 #define UNICODE_YI_SYLLABLE_MGEX  0xa23d
-#define UNITEXT_YI_SYLLABLE_MGEX  L"\ua23d"
+#define UNITEXT_YI_SYLLABLE_MGEX  U"\ua23d"
 #define UNICODE_YI_SYLLABLE_MGE  0xa23e
-#define UNITEXT_YI_SYLLABLE_MGE  L"\ua23e"
+#define UNITEXT_YI_SYLLABLE_MGE  U"\ua23e"
 #define UNICODE_YI_SYLLABLE_MGEP  0xa23f
-#define UNITEXT_YI_SYLLABLE_MGEP  L"\ua23f"
+#define UNITEXT_YI_SYLLABLE_MGEP  U"\ua23f"
 #define UNICODE_YI_SYLLABLE_MGUT  0xa240
-#define UNITEXT_YI_SYLLABLE_MGUT  L"\ua240"
+#define UNITEXT_YI_SYLLABLE_MGUT  U"\ua240"
 #define UNICODE_YI_SYLLABLE_MGUX  0xa241
-#define UNITEXT_YI_SYLLABLE_MGUX  L"\ua241"
+#define UNITEXT_YI_SYLLABLE_MGUX  U"\ua241"
 #define UNICODE_YI_SYLLABLE_MGU  0xa242
-#define UNITEXT_YI_SYLLABLE_MGU  L"\ua242"
+#define UNITEXT_YI_SYLLABLE_MGU  U"\ua242"
 #define UNICODE_YI_SYLLABLE_MGUP  0xa243
-#define UNITEXT_YI_SYLLABLE_MGUP  L"\ua243"
+#define UNITEXT_YI_SYLLABLE_MGUP  U"\ua243"
 #define UNICODE_YI_SYLLABLE_MGURX  0xa244
-#define UNITEXT_YI_SYLLABLE_MGURX  L"\ua244"
+#define UNITEXT_YI_SYLLABLE_MGURX  U"\ua244"
 #define UNICODE_YI_SYLLABLE_MGUR  0xa245
-#define UNITEXT_YI_SYLLABLE_MGUR  L"\ua245"
+#define UNITEXT_YI_SYLLABLE_MGUR  U"\ua245"
 #define UNICODE_YI_SYLLABLE_HXIT  0xa246
-#define UNITEXT_YI_SYLLABLE_HXIT  L"\ua246"
+#define UNITEXT_YI_SYLLABLE_HXIT  U"\ua246"
 #define UNICODE_YI_SYLLABLE_HXIX  0xa247
-#define UNITEXT_YI_SYLLABLE_HXIX  L"\ua247"
+#define UNITEXT_YI_SYLLABLE_HXIX  U"\ua247"
 #define UNICODE_YI_SYLLABLE_HXI  0xa248
-#define UNITEXT_YI_SYLLABLE_HXI  L"\ua248"
+#define UNITEXT_YI_SYLLABLE_HXI  U"\ua248"
 #define UNICODE_YI_SYLLABLE_HXIP  0xa249
-#define UNITEXT_YI_SYLLABLE_HXIP  L"\ua249"
+#define UNITEXT_YI_SYLLABLE_HXIP  U"\ua249"
 #define UNICODE_YI_SYLLABLE_HXIET  0xa24a
-#define UNITEXT_YI_SYLLABLE_HXIET  L"\ua24a"
+#define UNITEXT_YI_SYLLABLE_HXIET  U"\ua24a"
 #define UNICODE_YI_SYLLABLE_HXIEX  0xa24b
-#define UNITEXT_YI_SYLLABLE_HXIEX  L"\ua24b"
+#define UNITEXT_YI_SYLLABLE_HXIEX  U"\ua24b"
 #define UNICODE_YI_SYLLABLE_HXIE  0xa24c
-#define UNITEXT_YI_SYLLABLE_HXIE  L"\ua24c"
+#define UNITEXT_YI_SYLLABLE_HXIE  U"\ua24c"
 #define UNICODE_YI_SYLLABLE_HXIEP  0xa24d
-#define UNITEXT_YI_SYLLABLE_HXIEP  L"\ua24d"
+#define UNITEXT_YI_SYLLABLE_HXIEP  U"\ua24d"
 #define UNICODE_YI_SYLLABLE_HXAT  0xa24e
-#define UNITEXT_YI_SYLLABLE_HXAT  L"\ua24e"
+#define UNITEXT_YI_SYLLABLE_HXAT  U"\ua24e"
 #define UNICODE_YI_SYLLABLE_HXAX  0xa24f
-#define UNITEXT_YI_SYLLABLE_HXAX  L"\ua24f"
+#define UNITEXT_YI_SYLLABLE_HXAX  U"\ua24f"
 #define UNICODE_YI_SYLLABLE_HXA  0xa250
-#define UNITEXT_YI_SYLLABLE_HXA  L"\ua250"
+#define UNITEXT_YI_SYLLABLE_HXA  U"\ua250"
 #define UNICODE_YI_SYLLABLE_HXAP  0xa251
-#define UNITEXT_YI_SYLLABLE_HXAP  L"\ua251"
+#define UNITEXT_YI_SYLLABLE_HXAP  U"\ua251"
 #define UNICODE_YI_SYLLABLE_HXUOT  0xa252
-#define UNITEXT_YI_SYLLABLE_HXUOT  L"\ua252"
+#define UNITEXT_YI_SYLLABLE_HXUOT  U"\ua252"
 #define UNICODE_YI_SYLLABLE_HXUOX  0xa253
-#define UNITEXT_YI_SYLLABLE_HXUOX  L"\ua253"
+#define UNITEXT_YI_SYLLABLE_HXUOX  U"\ua253"
 #define UNICODE_YI_SYLLABLE_HXUO  0xa254
-#define UNITEXT_YI_SYLLABLE_HXUO  L"\ua254"
+#define UNITEXT_YI_SYLLABLE_HXUO  U"\ua254"
 #define UNICODE_YI_SYLLABLE_HXUOP  0xa255
-#define UNITEXT_YI_SYLLABLE_HXUOP  L"\ua255"
+#define UNITEXT_YI_SYLLABLE_HXUOP  U"\ua255"
 #define UNICODE_YI_SYLLABLE_HXOT  0xa256
-#define UNITEXT_YI_SYLLABLE_HXOT  L"\ua256"
+#define UNITEXT_YI_SYLLABLE_HXOT  U"\ua256"
 #define UNICODE_YI_SYLLABLE_HXOX  0xa257
-#define UNITEXT_YI_SYLLABLE_HXOX  L"\ua257"
+#define UNITEXT_YI_SYLLABLE_HXOX  U"\ua257"
 #define UNICODE_YI_SYLLABLE_HXO  0xa258
-#define UNITEXT_YI_SYLLABLE_HXO  L"\ua258"
+#define UNITEXT_YI_SYLLABLE_HXO  U"\ua258"
 #define UNICODE_YI_SYLLABLE_HXOP  0xa259
-#define UNITEXT_YI_SYLLABLE_HXOP  L"\ua259"
+#define UNITEXT_YI_SYLLABLE_HXOP  U"\ua259"
 #define UNICODE_YI_SYLLABLE_HXEX  0xa25a
-#define UNITEXT_YI_SYLLABLE_HXEX  L"\ua25a"
+#define UNITEXT_YI_SYLLABLE_HXEX  U"\ua25a"
 #define UNICODE_YI_SYLLABLE_HXE  0xa25b
-#define UNITEXT_YI_SYLLABLE_HXE  L"\ua25b"
+#define UNITEXT_YI_SYLLABLE_HXE  U"\ua25b"
 #define UNICODE_YI_SYLLABLE_HXEP  0xa25c
-#define UNITEXT_YI_SYLLABLE_HXEP  L"\ua25c"
+#define UNITEXT_YI_SYLLABLE_HXEP  U"\ua25c"
 #define UNICODE_YI_SYLLABLE_NGIEX  0xa25d
-#define UNITEXT_YI_SYLLABLE_NGIEX  L"\ua25d"
+#define UNITEXT_YI_SYLLABLE_NGIEX  U"\ua25d"
 #define UNICODE_YI_SYLLABLE_NGIE  0xa25e
-#define UNITEXT_YI_SYLLABLE_NGIE  L"\ua25e"
+#define UNITEXT_YI_SYLLABLE_NGIE  U"\ua25e"
 #define UNICODE_YI_SYLLABLE_NGIEP  0xa25f
-#define UNITEXT_YI_SYLLABLE_NGIEP  L"\ua25f"
+#define UNITEXT_YI_SYLLABLE_NGIEP  U"\ua25f"
 #define UNICODE_YI_SYLLABLE_NGAT  0xa260
-#define UNITEXT_YI_SYLLABLE_NGAT  L"\ua260"
+#define UNITEXT_YI_SYLLABLE_NGAT  U"\ua260"
 #define UNICODE_YI_SYLLABLE_NGAX  0xa261
-#define UNITEXT_YI_SYLLABLE_NGAX  L"\ua261"
+#define UNITEXT_YI_SYLLABLE_NGAX  U"\ua261"
 #define UNICODE_YI_SYLLABLE_NGA  0xa262
-#define UNITEXT_YI_SYLLABLE_NGA  L"\ua262"
+#define UNITEXT_YI_SYLLABLE_NGA  U"\ua262"
 #define UNICODE_YI_SYLLABLE_NGAP  0xa263
-#define UNITEXT_YI_SYLLABLE_NGAP  L"\ua263"
+#define UNITEXT_YI_SYLLABLE_NGAP  U"\ua263"
 #define UNICODE_YI_SYLLABLE_NGUOT  0xa264
-#define UNITEXT_YI_SYLLABLE_NGUOT  L"\ua264"
+#define UNITEXT_YI_SYLLABLE_NGUOT  U"\ua264"
 #define UNICODE_YI_SYLLABLE_NGUOX  0xa265
-#define UNITEXT_YI_SYLLABLE_NGUOX  L"\ua265"
+#define UNITEXT_YI_SYLLABLE_NGUOX  U"\ua265"
 #define UNICODE_YI_SYLLABLE_NGUO  0xa266
-#define UNITEXT_YI_SYLLABLE_NGUO  L"\ua266"
+#define UNITEXT_YI_SYLLABLE_NGUO  U"\ua266"
 #define UNICODE_YI_SYLLABLE_NGOT  0xa267
-#define UNITEXT_YI_SYLLABLE_NGOT  L"\ua267"
+#define UNITEXT_YI_SYLLABLE_NGOT  U"\ua267"
 #define UNICODE_YI_SYLLABLE_NGOX  0xa268
-#define UNITEXT_YI_SYLLABLE_NGOX  L"\ua268"
+#define UNITEXT_YI_SYLLABLE_NGOX  U"\ua268"
 #define UNICODE_YI_SYLLABLE_NGO  0xa269
-#define UNITEXT_YI_SYLLABLE_NGO  L"\ua269"
+#define UNITEXT_YI_SYLLABLE_NGO  U"\ua269"
 #define UNICODE_YI_SYLLABLE_NGOP  0xa26a
-#define UNITEXT_YI_SYLLABLE_NGOP  L"\ua26a"
+#define UNITEXT_YI_SYLLABLE_NGOP  U"\ua26a"
 #define UNICODE_YI_SYLLABLE_NGEX  0xa26b
-#define UNITEXT_YI_SYLLABLE_NGEX  L"\ua26b"
+#define UNITEXT_YI_SYLLABLE_NGEX  U"\ua26b"
 #define UNICODE_YI_SYLLABLE_NGE  0xa26c
-#define UNITEXT_YI_SYLLABLE_NGE  L"\ua26c"
+#define UNITEXT_YI_SYLLABLE_NGE  U"\ua26c"
 #define UNICODE_YI_SYLLABLE_NGEP  0xa26d
-#define UNITEXT_YI_SYLLABLE_NGEP  L"\ua26d"
+#define UNITEXT_YI_SYLLABLE_NGEP  U"\ua26d"
 #define UNICODE_YI_SYLLABLE_HIT  0xa26e
-#define UNITEXT_YI_SYLLABLE_HIT  L"\ua26e"
+#define UNITEXT_YI_SYLLABLE_HIT  U"\ua26e"
 #define UNICODE_YI_SYLLABLE_HIEX  0xa26f
-#define UNITEXT_YI_SYLLABLE_HIEX  L"\ua26f"
+#define UNITEXT_YI_SYLLABLE_HIEX  U"\ua26f"
 #define UNICODE_YI_SYLLABLE_HIE  0xa270
-#define UNITEXT_YI_SYLLABLE_HIE  L"\ua270"
+#define UNITEXT_YI_SYLLABLE_HIE  U"\ua270"
 #define UNICODE_YI_SYLLABLE_HAT  0xa271
-#define UNITEXT_YI_SYLLABLE_HAT  L"\ua271"
+#define UNITEXT_YI_SYLLABLE_HAT  U"\ua271"
 #define UNICODE_YI_SYLLABLE_HAX  0xa272
-#define UNITEXT_YI_SYLLABLE_HAX  L"\ua272"
+#define UNITEXT_YI_SYLLABLE_HAX  U"\ua272"
 #define UNICODE_YI_SYLLABLE_HA  0xa273
-#define UNITEXT_YI_SYLLABLE_HA  L"\ua273"
+#define UNITEXT_YI_SYLLABLE_HA  U"\ua273"
 #define UNICODE_YI_SYLLABLE_HAP  0xa274
-#define UNITEXT_YI_SYLLABLE_HAP  L"\ua274"
+#define UNITEXT_YI_SYLLABLE_HAP  U"\ua274"
 #define UNICODE_YI_SYLLABLE_HUOT  0xa275
-#define UNITEXT_YI_SYLLABLE_HUOT  L"\ua275"
+#define UNITEXT_YI_SYLLABLE_HUOT  U"\ua275"
 #define UNICODE_YI_SYLLABLE_HUOX  0xa276
-#define UNITEXT_YI_SYLLABLE_HUOX  L"\ua276"
+#define UNITEXT_YI_SYLLABLE_HUOX  U"\ua276"
 #define UNICODE_YI_SYLLABLE_HUO  0xa277
-#define UNITEXT_YI_SYLLABLE_HUO  L"\ua277"
+#define UNITEXT_YI_SYLLABLE_HUO  U"\ua277"
 #define UNICODE_YI_SYLLABLE_HUOP  0xa278
-#define UNITEXT_YI_SYLLABLE_HUOP  L"\ua278"
+#define UNITEXT_YI_SYLLABLE_HUOP  U"\ua278"
 #define UNICODE_YI_SYLLABLE_HOT  0xa279
-#define UNITEXT_YI_SYLLABLE_HOT  L"\ua279"
+#define UNITEXT_YI_SYLLABLE_HOT  U"\ua279"
 #define UNICODE_YI_SYLLABLE_HOX  0xa27a
-#define UNITEXT_YI_SYLLABLE_HOX  L"\ua27a"
+#define UNITEXT_YI_SYLLABLE_HOX  U"\ua27a"
 #define UNICODE_YI_SYLLABLE_HO  0xa27b
-#define UNITEXT_YI_SYLLABLE_HO  L"\ua27b"
+#define UNITEXT_YI_SYLLABLE_HO  U"\ua27b"
 #define UNICODE_YI_SYLLABLE_HOP  0xa27c
-#define UNITEXT_YI_SYLLABLE_HOP  L"\ua27c"
+#define UNITEXT_YI_SYLLABLE_HOP  U"\ua27c"
 #define UNICODE_YI_SYLLABLE_HEX  0xa27d
-#define UNITEXT_YI_SYLLABLE_HEX  L"\ua27d"
+#define UNITEXT_YI_SYLLABLE_HEX  U"\ua27d"
 #define UNICODE_YI_SYLLABLE_HE  0xa27e
-#define UNITEXT_YI_SYLLABLE_HE  L"\ua27e"
+#define UNITEXT_YI_SYLLABLE_HE  U"\ua27e"
 #define UNICODE_YI_SYLLABLE_HEP  0xa27f
-#define UNITEXT_YI_SYLLABLE_HEP  L"\ua27f"
+#define UNITEXT_YI_SYLLABLE_HEP  U"\ua27f"
 #define UNICODE_YI_SYLLABLE_WAT  0xa280
-#define UNITEXT_YI_SYLLABLE_WAT  L"\ua280"
+#define UNITEXT_YI_SYLLABLE_WAT  U"\ua280"
 #define UNICODE_YI_SYLLABLE_WAX  0xa281
-#define UNITEXT_YI_SYLLABLE_WAX  L"\ua281"
+#define UNITEXT_YI_SYLLABLE_WAX  U"\ua281"
 #define UNICODE_YI_SYLLABLE_WA  0xa282
-#define UNITEXT_YI_SYLLABLE_WA  L"\ua282"
+#define UNITEXT_YI_SYLLABLE_WA  U"\ua282"
 #define UNICODE_YI_SYLLABLE_WAP  0xa283
-#define UNITEXT_YI_SYLLABLE_WAP  L"\ua283"
+#define UNITEXT_YI_SYLLABLE_WAP  U"\ua283"
 #define UNICODE_YI_SYLLABLE_WUOX  0xa284
-#define UNITEXT_YI_SYLLABLE_WUOX  L"\ua284"
+#define UNITEXT_YI_SYLLABLE_WUOX  U"\ua284"
 #define UNICODE_YI_SYLLABLE_WUO  0xa285
-#define UNITEXT_YI_SYLLABLE_WUO  L"\ua285"
+#define UNITEXT_YI_SYLLABLE_WUO  U"\ua285"
 #define UNICODE_YI_SYLLABLE_WUOP  0xa286
-#define UNITEXT_YI_SYLLABLE_WUOP  L"\ua286"
+#define UNITEXT_YI_SYLLABLE_WUOP  U"\ua286"
 #define UNICODE_YI_SYLLABLE_WOX  0xa287
-#define UNITEXT_YI_SYLLABLE_WOX  L"\ua287"
+#define UNITEXT_YI_SYLLABLE_WOX  U"\ua287"
 #define UNICODE_YI_SYLLABLE_WO  0xa288
-#define UNITEXT_YI_SYLLABLE_WO  L"\ua288"
+#define UNITEXT_YI_SYLLABLE_WO  U"\ua288"
 #define UNICODE_YI_SYLLABLE_WOP  0xa289
-#define UNITEXT_YI_SYLLABLE_WOP  L"\ua289"
+#define UNITEXT_YI_SYLLABLE_WOP  U"\ua289"
 #define UNICODE_YI_SYLLABLE_WEX  0xa28a
-#define UNITEXT_YI_SYLLABLE_WEX  L"\ua28a"
+#define UNITEXT_YI_SYLLABLE_WEX  U"\ua28a"
 #define UNICODE_YI_SYLLABLE_WE  0xa28b
-#define UNITEXT_YI_SYLLABLE_WE  L"\ua28b"
+#define UNITEXT_YI_SYLLABLE_WE  U"\ua28b"
 #define UNICODE_YI_SYLLABLE_WEP  0xa28c
-#define UNITEXT_YI_SYLLABLE_WEP  L"\ua28c"
+#define UNITEXT_YI_SYLLABLE_WEP  U"\ua28c"
 #define UNICODE_YI_SYLLABLE_ZIT  0xa28d
-#define UNITEXT_YI_SYLLABLE_ZIT  L"\ua28d"
+#define UNITEXT_YI_SYLLABLE_ZIT  U"\ua28d"
 #define UNICODE_YI_SYLLABLE_ZIX  0xa28e
-#define UNITEXT_YI_SYLLABLE_ZIX  L"\ua28e"
+#define UNITEXT_YI_SYLLABLE_ZIX  U"\ua28e"
 #define UNICODE_YI_SYLLABLE_ZI  0xa28f
-#define UNITEXT_YI_SYLLABLE_ZI  L"\ua28f"
+#define UNITEXT_YI_SYLLABLE_ZI  U"\ua28f"
 #define UNICODE_YI_SYLLABLE_ZIP  0xa290
-#define UNITEXT_YI_SYLLABLE_ZIP  L"\ua290"
+#define UNITEXT_YI_SYLLABLE_ZIP  U"\ua290"
 #define UNICODE_YI_SYLLABLE_ZIEX  0xa291
-#define UNITEXT_YI_SYLLABLE_ZIEX  L"\ua291"
+#define UNITEXT_YI_SYLLABLE_ZIEX  U"\ua291"
 #define UNICODE_YI_SYLLABLE_ZIE  0xa292
-#define UNITEXT_YI_SYLLABLE_ZIE  L"\ua292"
+#define UNITEXT_YI_SYLLABLE_ZIE  U"\ua292"
 #define UNICODE_YI_SYLLABLE_ZIEP  0xa293
-#define UNITEXT_YI_SYLLABLE_ZIEP  L"\ua293"
+#define UNITEXT_YI_SYLLABLE_ZIEP  U"\ua293"
 #define UNICODE_YI_SYLLABLE_ZAT  0xa294
-#define UNITEXT_YI_SYLLABLE_ZAT  L"\ua294"
+#define UNITEXT_YI_SYLLABLE_ZAT  U"\ua294"
 #define UNICODE_YI_SYLLABLE_ZAX  0xa295
-#define UNITEXT_YI_SYLLABLE_ZAX  L"\ua295"
+#define UNITEXT_YI_SYLLABLE_ZAX  U"\ua295"
 #define UNICODE_YI_SYLLABLE_ZA  0xa296
-#define UNITEXT_YI_SYLLABLE_ZA  L"\ua296"
+#define UNITEXT_YI_SYLLABLE_ZA  U"\ua296"
 #define UNICODE_YI_SYLLABLE_ZAP  0xa297
-#define UNITEXT_YI_SYLLABLE_ZAP  L"\ua297"
+#define UNITEXT_YI_SYLLABLE_ZAP  U"\ua297"
 #define UNICODE_YI_SYLLABLE_ZUOX  0xa298
-#define UNITEXT_YI_SYLLABLE_ZUOX  L"\ua298"
+#define UNITEXT_YI_SYLLABLE_ZUOX  U"\ua298"
 #define UNICODE_YI_SYLLABLE_ZUO  0xa299
-#define UNITEXT_YI_SYLLABLE_ZUO  L"\ua299"
+#define UNITEXT_YI_SYLLABLE_ZUO  U"\ua299"
 #define UNICODE_YI_SYLLABLE_ZUOP  0xa29a
-#define UNITEXT_YI_SYLLABLE_ZUOP  L"\ua29a"
+#define UNITEXT_YI_SYLLABLE_ZUOP  U"\ua29a"
 #define UNICODE_YI_SYLLABLE_ZOT  0xa29b
-#define UNITEXT_YI_SYLLABLE_ZOT  L"\ua29b"
+#define UNITEXT_YI_SYLLABLE_ZOT  U"\ua29b"
 #define UNICODE_YI_SYLLABLE_ZOX  0xa29c
-#define UNITEXT_YI_SYLLABLE_ZOX  L"\ua29c"
+#define UNITEXT_YI_SYLLABLE_ZOX  U"\ua29c"
 #define UNICODE_YI_SYLLABLE_ZO  0xa29d
-#define UNITEXT_YI_SYLLABLE_ZO  L"\ua29d"
+#define UNITEXT_YI_SYLLABLE_ZO  U"\ua29d"
 #define UNICODE_YI_SYLLABLE_ZOP  0xa29e
-#define UNITEXT_YI_SYLLABLE_ZOP  L"\ua29e"
+#define UNITEXT_YI_SYLLABLE_ZOP  U"\ua29e"
 #define UNICODE_YI_SYLLABLE_ZEX  0xa29f
-#define UNITEXT_YI_SYLLABLE_ZEX  L"\ua29f"
+#define UNITEXT_YI_SYLLABLE_ZEX  U"\ua29f"
 #define UNICODE_YI_SYLLABLE_ZE  0xa2a0
-#define UNITEXT_YI_SYLLABLE_ZE  L"\ua2a0"
+#define UNITEXT_YI_SYLLABLE_ZE  U"\ua2a0"
 #define UNICODE_YI_SYLLABLE_ZEP  0xa2a1
-#define UNITEXT_YI_SYLLABLE_ZEP  L"\ua2a1"
+#define UNITEXT_YI_SYLLABLE_ZEP  U"\ua2a1"
 #define UNICODE_YI_SYLLABLE_ZUT  0xa2a2
-#define UNITEXT_YI_SYLLABLE_ZUT  L"\ua2a2"
+#define UNITEXT_YI_SYLLABLE_ZUT  U"\ua2a2"
 #define UNICODE_YI_SYLLABLE_ZUX  0xa2a3
-#define UNITEXT_YI_SYLLABLE_ZUX  L"\ua2a3"
+#define UNITEXT_YI_SYLLABLE_ZUX  U"\ua2a3"
 #define UNICODE_YI_SYLLABLE_ZU  0xa2a4
-#define UNITEXT_YI_SYLLABLE_ZU  L"\ua2a4"
+#define UNITEXT_YI_SYLLABLE_ZU  U"\ua2a4"
 #define UNICODE_YI_SYLLABLE_ZUP  0xa2a5
-#define UNITEXT_YI_SYLLABLE_ZUP  L"\ua2a5"
+#define UNITEXT_YI_SYLLABLE_ZUP  U"\ua2a5"
 #define UNICODE_YI_SYLLABLE_ZURX  0xa2a6
-#define UNITEXT_YI_SYLLABLE_ZURX  L"\ua2a6"
+#define UNITEXT_YI_SYLLABLE_ZURX  U"\ua2a6"
 #define UNICODE_YI_SYLLABLE_ZUR  0xa2a7
-#define UNITEXT_YI_SYLLABLE_ZUR  L"\ua2a7"
+#define UNITEXT_YI_SYLLABLE_ZUR  U"\ua2a7"
 #define UNICODE_YI_SYLLABLE_ZYT  0xa2a8
-#define UNITEXT_YI_SYLLABLE_ZYT  L"\ua2a8"
+#define UNITEXT_YI_SYLLABLE_ZYT  U"\ua2a8"
 #define UNICODE_YI_SYLLABLE_ZYX  0xa2a9
-#define UNITEXT_YI_SYLLABLE_ZYX  L"\ua2a9"
+#define UNITEXT_YI_SYLLABLE_ZYX  U"\ua2a9"
 #define UNICODE_YI_SYLLABLE_ZY  0xa2aa
-#define UNITEXT_YI_SYLLABLE_ZY  L"\ua2aa"
+#define UNITEXT_YI_SYLLABLE_ZY  U"\ua2aa"
 #define UNICODE_YI_SYLLABLE_ZYP  0xa2ab
-#define UNITEXT_YI_SYLLABLE_ZYP  L"\ua2ab"
+#define UNITEXT_YI_SYLLABLE_ZYP  U"\ua2ab"
 #define UNICODE_YI_SYLLABLE_ZYRX  0xa2ac
-#define UNITEXT_YI_SYLLABLE_ZYRX  L"\ua2ac"
+#define UNITEXT_YI_SYLLABLE_ZYRX  U"\ua2ac"
 #define UNICODE_YI_SYLLABLE_ZYR  0xa2ad
-#define UNITEXT_YI_SYLLABLE_ZYR  L"\ua2ad"
+#define UNITEXT_YI_SYLLABLE_ZYR  U"\ua2ad"
 #define UNICODE_YI_SYLLABLE_CIT  0xa2ae
-#define UNITEXT_YI_SYLLABLE_CIT  L"\ua2ae"
+#define UNITEXT_YI_SYLLABLE_CIT  U"\ua2ae"
 #define UNICODE_YI_SYLLABLE_CIX  0xa2af
-#define UNITEXT_YI_SYLLABLE_CIX  L"\ua2af"
+#define UNITEXT_YI_SYLLABLE_CIX  U"\ua2af"
 #define UNICODE_YI_SYLLABLE_CI  0xa2b0
-#define UNITEXT_YI_SYLLABLE_CI  L"\ua2b0"
+#define UNITEXT_YI_SYLLABLE_CI  U"\ua2b0"
 #define UNICODE_YI_SYLLABLE_CIP  0xa2b1
-#define UNITEXT_YI_SYLLABLE_CIP  L"\ua2b1"
+#define UNITEXT_YI_SYLLABLE_CIP  U"\ua2b1"
 #define UNICODE_YI_SYLLABLE_CIET  0xa2b2
-#define UNITEXT_YI_SYLLABLE_CIET  L"\ua2b2"
+#define UNITEXT_YI_SYLLABLE_CIET  U"\ua2b2"
 #define UNICODE_YI_SYLLABLE_CIEX  0xa2b3
-#define UNITEXT_YI_SYLLABLE_CIEX  L"\ua2b3"
+#define UNITEXT_YI_SYLLABLE_CIEX  U"\ua2b3"
 #define UNICODE_YI_SYLLABLE_CIE  0xa2b4
-#define UNITEXT_YI_SYLLABLE_CIE  L"\ua2b4"
+#define UNITEXT_YI_SYLLABLE_CIE  U"\ua2b4"
 #define UNICODE_YI_SYLLABLE_CIEP  0xa2b5
-#define UNITEXT_YI_SYLLABLE_CIEP  L"\ua2b5"
+#define UNITEXT_YI_SYLLABLE_CIEP  U"\ua2b5"
 #define UNICODE_YI_SYLLABLE_CAT  0xa2b6
-#define UNITEXT_YI_SYLLABLE_CAT  L"\ua2b6"
+#define UNITEXT_YI_SYLLABLE_CAT  U"\ua2b6"
 #define UNICODE_YI_SYLLABLE_CAX  0xa2b7
-#define UNITEXT_YI_SYLLABLE_CAX  L"\ua2b7"
+#define UNITEXT_YI_SYLLABLE_CAX  U"\ua2b7"
 #define UNICODE_YI_SYLLABLE_CA  0xa2b8
-#define UNITEXT_YI_SYLLABLE_CA  L"\ua2b8"
+#define UNITEXT_YI_SYLLABLE_CA  U"\ua2b8"
 #define UNICODE_YI_SYLLABLE_CAP  0xa2b9
-#define UNITEXT_YI_SYLLABLE_CAP  L"\ua2b9"
+#define UNITEXT_YI_SYLLABLE_CAP  U"\ua2b9"
 #define UNICODE_YI_SYLLABLE_CUOX  0xa2ba
-#define UNITEXT_YI_SYLLABLE_CUOX  L"\ua2ba"
+#define UNITEXT_YI_SYLLABLE_CUOX  U"\ua2ba"
 #define UNICODE_YI_SYLLABLE_CUO  0xa2bb
-#define UNITEXT_YI_SYLLABLE_CUO  L"\ua2bb"
+#define UNITEXT_YI_SYLLABLE_CUO  U"\ua2bb"
 #define UNICODE_YI_SYLLABLE_CUOP  0xa2bc
-#define UNITEXT_YI_SYLLABLE_CUOP  L"\ua2bc"
+#define UNITEXT_YI_SYLLABLE_CUOP  U"\ua2bc"
 #define UNICODE_YI_SYLLABLE_COT  0xa2bd
-#define UNITEXT_YI_SYLLABLE_COT  L"\ua2bd"
+#define UNITEXT_YI_SYLLABLE_COT  U"\ua2bd"
 #define UNICODE_YI_SYLLABLE_COX  0xa2be
-#define UNITEXT_YI_SYLLABLE_COX  L"\ua2be"
+#define UNITEXT_YI_SYLLABLE_COX  U"\ua2be"
 #define UNICODE_YI_SYLLABLE_CO  0xa2bf
-#define UNITEXT_YI_SYLLABLE_CO  L"\ua2bf"
+#define UNITEXT_YI_SYLLABLE_CO  U"\ua2bf"
 #define UNICODE_YI_SYLLABLE_COP  0xa2c0
-#define UNITEXT_YI_SYLLABLE_COP  L"\ua2c0"
+#define UNITEXT_YI_SYLLABLE_COP  U"\ua2c0"
 #define UNICODE_YI_SYLLABLE_CEX  0xa2c1
-#define UNITEXT_YI_SYLLABLE_CEX  L"\ua2c1"
+#define UNITEXT_YI_SYLLABLE_CEX  U"\ua2c1"
 #define UNICODE_YI_SYLLABLE_CE  0xa2c2
-#define UNITEXT_YI_SYLLABLE_CE  L"\ua2c2"
+#define UNITEXT_YI_SYLLABLE_CE  U"\ua2c2"
 #define UNICODE_YI_SYLLABLE_CEP  0xa2c3
-#define UNITEXT_YI_SYLLABLE_CEP  L"\ua2c3"
+#define UNITEXT_YI_SYLLABLE_CEP  U"\ua2c3"
 #define UNICODE_YI_SYLLABLE_CUT  0xa2c4
-#define UNITEXT_YI_SYLLABLE_CUT  L"\ua2c4"
+#define UNITEXT_YI_SYLLABLE_CUT  U"\ua2c4"
 #define UNICODE_YI_SYLLABLE_CUX  0xa2c5
-#define UNITEXT_YI_SYLLABLE_CUX  L"\ua2c5"
+#define UNITEXT_YI_SYLLABLE_CUX  U"\ua2c5"
 #define UNICODE_YI_SYLLABLE_CU  0xa2c6
-#define UNITEXT_YI_SYLLABLE_CU  L"\ua2c6"
+#define UNITEXT_YI_SYLLABLE_CU  U"\ua2c6"
 #define UNICODE_YI_SYLLABLE_CUP  0xa2c7
-#define UNITEXT_YI_SYLLABLE_CUP  L"\ua2c7"
+#define UNITEXT_YI_SYLLABLE_CUP  U"\ua2c7"
 #define UNICODE_YI_SYLLABLE_CURX  0xa2c8
-#define UNITEXT_YI_SYLLABLE_CURX  L"\ua2c8"
+#define UNITEXT_YI_SYLLABLE_CURX  U"\ua2c8"
 #define UNICODE_YI_SYLLABLE_CUR  0xa2c9
-#define UNITEXT_YI_SYLLABLE_CUR  L"\ua2c9"
+#define UNITEXT_YI_SYLLABLE_CUR  U"\ua2c9"
 #define UNICODE_YI_SYLLABLE_CYT  0xa2ca
-#define UNITEXT_YI_SYLLABLE_CYT  L"\ua2ca"
+#define UNITEXT_YI_SYLLABLE_CYT  U"\ua2ca"
 #define UNICODE_YI_SYLLABLE_CYX  0xa2cb
-#define UNITEXT_YI_SYLLABLE_CYX  L"\ua2cb"
+#define UNITEXT_YI_SYLLABLE_CYX  U"\ua2cb"
 #define UNICODE_YI_SYLLABLE_CY  0xa2cc
-#define UNITEXT_YI_SYLLABLE_CY  L"\ua2cc"
+#define UNITEXT_YI_SYLLABLE_CY  U"\ua2cc"
 #define UNICODE_YI_SYLLABLE_CYP  0xa2cd
-#define UNITEXT_YI_SYLLABLE_CYP  L"\ua2cd"
+#define UNITEXT_YI_SYLLABLE_CYP  U"\ua2cd"
 #define UNICODE_YI_SYLLABLE_CYRX  0xa2ce
-#define UNITEXT_YI_SYLLABLE_CYRX  L"\ua2ce"
+#define UNITEXT_YI_SYLLABLE_CYRX  U"\ua2ce"
 #define UNICODE_YI_SYLLABLE_CYR  0xa2cf
-#define UNITEXT_YI_SYLLABLE_CYR  L"\ua2cf"
+#define UNITEXT_YI_SYLLABLE_CYR  U"\ua2cf"
 #define UNICODE_YI_SYLLABLE_ZZIT  0xa2d0
-#define UNITEXT_YI_SYLLABLE_ZZIT  L"\ua2d0"
+#define UNITEXT_YI_SYLLABLE_ZZIT  U"\ua2d0"
 #define UNICODE_YI_SYLLABLE_ZZIX  0xa2d1
-#define UNITEXT_YI_SYLLABLE_ZZIX  L"\ua2d1"
+#define UNITEXT_YI_SYLLABLE_ZZIX  U"\ua2d1"
 #define UNICODE_YI_SYLLABLE_ZZI  0xa2d2
-#define UNITEXT_YI_SYLLABLE_ZZI  L"\ua2d2"
+#define UNITEXT_YI_SYLLABLE_ZZI  U"\ua2d2"
 #define UNICODE_YI_SYLLABLE_ZZIP  0xa2d3
-#define UNITEXT_YI_SYLLABLE_ZZIP  L"\ua2d3"
+#define UNITEXT_YI_SYLLABLE_ZZIP  U"\ua2d3"
 #define UNICODE_YI_SYLLABLE_ZZIET  0xa2d4
-#define UNITEXT_YI_SYLLABLE_ZZIET  L"\ua2d4"
+#define UNITEXT_YI_SYLLABLE_ZZIET  U"\ua2d4"
 #define UNICODE_YI_SYLLABLE_ZZIEX  0xa2d5
-#define UNITEXT_YI_SYLLABLE_ZZIEX  L"\ua2d5"
+#define UNITEXT_YI_SYLLABLE_ZZIEX  U"\ua2d5"
 #define UNICODE_YI_SYLLABLE_ZZIE  0xa2d6
-#define UNITEXT_YI_SYLLABLE_ZZIE  L"\ua2d6"
+#define UNITEXT_YI_SYLLABLE_ZZIE  U"\ua2d6"
 #define UNICODE_YI_SYLLABLE_ZZIEP  0xa2d7
-#define UNITEXT_YI_SYLLABLE_ZZIEP  L"\ua2d7"
+#define UNITEXT_YI_SYLLABLE_ZZIEP  U"\ua2d7"
 #define UNICODE_YI_SYLLABLE_ZZAT  0xa2d8
-#define UNITEXT_YI_SYLLABLE_ZZAT  L"\ua2d8"
+#define UNITEXT_YI_SYLLABLE_ZZAT  U"\ua2d8"
 #define UNICODE_YI_SYLLABLE_ZZAX  0xa2d9
-#define UNITEXT_YI_SYLLABLE_ZZAX  L"\ua2d9"
+#define UNITEXT_YI_SYLLABLE_ZZAX  U"\ua2d9"
 #define UNICODE_YI_SYLLABLE_ZZA  0xa2da
-#define UNITEXT_YI_SYLLABLE_ZZA  L"\ua2da"
+#define UNITEXT_YI_SYLLABLE_ZZA  U"\ua2da"
 #define UNICODE_YI_SYLLABLE_ZZAP  0xa2db
-#define UNITEXT_YI_SYLLABLE_ZZAP  L"\ua2db"
+#define UNITEXT_YI_SYLLABLE_ZZAP  U"\ua2db"
 #define UNICODE_YI_SYLLABLE_ZZOX  0xa2dc
-#define UNITEXT_YI_SYLLABLE_ZZOX  L"\ua2dc"
+#define UNITEXT_YI_SYLLABLE_ZZOX  U"\ua2dc"
 #define UNICODE_YI_SYLLABLE_ZZO  0xa2dd
-#define UNITEXT_YI_SYLLABLE_ZZO  L"\ua2dd"
+#define UNITEXT_YI_SYLLABLE_ZZO  U"\ua2dd"
 #define UNICODE_YI_SYLLABLE_ZZOP  0xa2de
-#define UNITEXT_YI_SYLLABLE_ZZOP  L"\ua2de"
+#define UNITEXT_YI_SYLLABLE_ZZOP  U"\ua2de"
 #define UNICODE_YI_SYLLABLE_ZZEX  0xa2df
-#define UNITEXT_YI_SYLLABLE_ZZEX  L"\ua2df"
+#define UNITEXT_YI_SYLLABLE_ZZEX  U"\ua2df"
 #define UNICODE_YI_SYLLABLE_ZZE  0xa2e0
-#define UNITEXT_YI_SYLLABLE_ZZE  L"\ua2e0"
+#define UNITEXT_YI_SYLLABLE_ZZE  U"\ua2e0"
 #define UNICODE_YI_SYLLABLE_ZZEP  0xa2e1
-#define UNITEXT_YI_SYLLABLE_ZZEP  L"\ua2e1"
+#define UNITEXT_YI_SYLLABLE_ZZEP  U"\ua2e1"
 #define UNICODE_YI_SYLLABLE_ZZUX  0xa2e2
-#define UNITEXT_YI_SYLLABLE_ZZUX  L"\ua2e2"
+#define UNITEXT_YI_SYLLABLE_ZZUX  U"\ua2e2"
 #define UNICODE_YI_SYLLABLE_ZZU  0xa2e3
-#define UNITEXT_YI_SYLLABLE_ZZU  L"\ua2e3"
+#define UNITEXT_YI_SYLLABLE_ZZU  U"\ua2e3"
 #define UNICODE_YI_SYLLABLE_ZZUP  0xa2e4
-#define UNITEXT_YI_SYLLABLE_ZZUP  L"\ua2e4"
+#define UNITEXT_YI_SYLLABLE_ZZUP  U"\ua2e4"
 #define UNICODE_YI_SYLLABLE_ZZURX  0xa2e5
-#define UNITEXT_YI_SYLLABLE_ZZURX  L"\ua2e5"
+#define UNITEXT_YI_SYLLABLE_ZZURX  U"\ua2e5"
 #define UNICODE_YI_SYLLABLE_ZZUR  0xa2e6
-#define UNITEXT_YI_SYLLABLE_ZZUR  L"\ua2e6"
+#define UNITEXT_YI_SYLLABLE_ZZUR  U"\ua2e6"
 #define UNICODE_YI_SYLLABLE_ZZYT  0xa2e7
-#define UNITEXT_YI_SYLLABLE_ZZYT  L"\ua2e7"
+#define UNITEXT_YI_SYLLABLE_ZZYT  U"\ua2e7"
 #define UNICODE_YI_SYLLABLE_ZZYX  0xa2e8
-#define UNITEXT_YI_SYLLABLE_ZZYX  L"\ua2e8"
+#define UNITEXT_YI_SYLLABLE_ZZYX  U"\ua2e8"
 #define UNICODE_YI_SYLLABLE_ZZY  0xa2e9
-#define UNITEXT_YI_SYLLABLE_ZZY  L"\ua2e9"
+#define UNITEXT_YI_SYLLABLE_ZZY  U"\ua2e9"
 #define UNICODE_YI_SYLLABLE_ZZYP  0xa2ea
-#define UNITEXT_YI_SYLLABLE_ZZYP  L"\ua2ea"
+#define UNITEXT_YI_SYLLABLE_ZZYP  U"\ua2ea"
 #define UNICODE_YI_SYLLABLE_ZZYRX  0xa2eb
-#define UNITEXT_YI_SYLLABLE_ZZYRX  L"\ua2eb"
+#define UNITEXT_YI_SYLLABLE_ZZYRX  U"\ua2eb"
 #define UNICODE_YI_SYLLABLE_ZZYR  0xa2ec
-#define UNITEXT_YI_SYLLABLE_ZZYR  L"\ua2ec"
+#define UNITEXT_YI_SYLLABLE_ZZYR  U"\ua2ec"
 #define UNICODE_YI_SYLLABLE_NZIT  0xa2ed
-#define UNITEXT_YI_SYLLABLE_NZIT  L"\ua2ed"
+#define UNITEXT_YI_SYLLABLE_NZIT  U"\ua2ed"
 #define UNICODE_YI_SYLLABLE_NZIX  0xa2ee
-#define UNITEXT_YI_SYLLABLE_NZIX  L"\ua2ee"
+#define UNITEXT_YI_SYLLABLE_NZIX  U"\ua2ee"
 #define UNICODE_YI_SYLLABLE_NZI  0xa2ef
-#define UNITEXT_YI_SYLLABLE_NZI  L"\ua2ef"
+#define UNITEXT_YI_SYLLABLE_NZI  U"\ua2ef"
 #define UNICODE_YI_SYLLABLE_NZIP  0xa2f0
-#define UNITEXT_YI_SYLLABLE_NZIP  L"\ua2f0"
+#define UNITEXT_YI_SYLLABLE_NZIP  U"\ua2f0"
 #define UNICODE_YI_SYLLABLE_NZIEX  0xa2f1
-#define UNITEXT_YI_SYLLABLE_NZIEX  L"\ua2f1"
+#define UNITEXT_YI_SYLLABLE_NZIEX  U"\ua2f1"
 #define UNICODE_YI_SYLLABLE_NZIE  0xa2f2
-#define UNITEXT_YI_SYLLABLE_NZIE  L"\ua2f2"
+#define UNITEXT_YI_SYLLABLE_NZIE  U"\ua2f2"
 #define UNICODE_YI_SYLLABLE_NZIEP  0xa2f3
-#define UNITEXT_YI_SYLLABLE_NZIEP  L"\ua2f3"
+#define UNITEXT_YI_SYLLABLE_NZIEP  U"\ua2f3"
 #define UNICODE_YI_SYLLABLE_NZAT  0xa2f4
-#define UNITEXT_YI_SYLLABLE_NZAT  L"\ua2f4"
+#define UNITEXT_YI_SYLLABLE_NZAT  U"\ua2f4"
 #define UNICODE_YI_SYLLABLE_NZAX  0xa2f5
-#define UNITEXT_YI_SYLLABLE_NZAX  L"\ua2f5"
+#define UNITEXT_YI_SYLLABLE_NZAX  U"\ua2f5"
 #define UNICODE_YI_SYLLABLE_NZA  0xa2f6
-#define UNITEXT_YI_SYLLABLE_NZA  L"\ua2f6"
+#define UNITEXT_YI_SYLLABLE_NZA  U"\ua2f6"
 #define UNICODE_YI_SYLLABLE_NZAP  0xa2f7
-#define UNITEXT_YI_SYLLABLE_NZAP  L"\ua2f7"
+#define UNITEXT_YI_SYLLABLE_NZAP  U"\ua2f7"
 #define UNICODE_YI_SYLLABLE_NZUOX  0xa2f8
-#define UNITEXT_YI_SYLLABLE_NZUOX  L"\ua2f8"
+#define UNITEXT_YI_SYLLABLE_NZUOX  U"\ua2f8"
 #define UNICODE_YI_SYLLABLE_NZUO  0xa2f9
-#define UNITEXT_YI_SYLLABLE_NZUO  L"\ua2f9"
+#define UNITEXT_YI_SYLLABLE_NZUO  U"\ua2f9"
 #define UNICODE_YI_SYLLABLE_NZOX  0xa2fa
-#define UNITEXT_YI_SYLLABLE_NZOX  L"\ua2fa"
+#define UNITEXT_YI_SYLLABLE_NZOX  U"\ua2fa"
 #define UNICODE_YI_SYLLABLE_NZOP  0xa2fb
-#define UNITEXT_YI_SYLLABLE_NZOP  L"\ua2fb"
+#define UNITEXT_YI_SYLLABLE_NZOP  U"\ua2fb"
 #define UNICODE_YI_SYLLABLE_NZEX  0xa2fc
-#define UNITEXT_YI_SYLLABLE_NZEX  L"\ua2fc"
+#define UNITEXT_YI_SYLLABLE_NZEX  U"\ua2fc"
 #define UNICODE_YI_SYLLABLE_NZE  0xa2fd
-#define UNITEXT_YI_SYLLABLE_NZE  L"\ua2fd"
+#define UNITEXT_YI_SYLLABLE_NZE  U"\ua2fd"
 #define UNICODE_YI_SYLLABLE_NZUX  0xa2fe
-#define UNITEXT_YI_SYLLABLE_NZUX  L"\ua2fe"
+#define UNITEXT_YI_SYLLABLE_NZUX  U"\ua2fe"
 #define UNICODE_YI_SYLLABLE_NZU  0xa2ff
-#define UNITEXT_YI_SYLLABLE_NZU  L"\ua2ff"
+#define UNITEXT_YI_SYLLABLE_NZU  U"\ua2ff"
 #define UNICODE_YI_SYLLABLE_NZUP  0xa300
-#define UNITEXT_YI_SYLLABLE_NZUP  L"\ua300"
+#define UNITEXT_YI_SYLLABLE_NZUP  U"\ua300"
 #define UNICODE_YI_SYLLABLE_NZURX  0xa301
-#define UNITEXT_YI_SYLLABLE_NZURX  L"\ua301"
+#define UNITEXT_YI_SYLLABLE_NZURX  U"\ua301"
 #define UNICODE_YI_SYLLABLE_NZUR  0xa302
-#define UNITEXT_YI_SYLLABLE_NZUR  L"\ua302"
+#define UNITEXT_YI_SYLLABLE_NZUR  U"\ua302"
 #define UNICODE_YI_SYLLABLE_NZYT  0xa303
-#define UNITEXT_YI_SYLLABLE_NZYT  L"\ua303"
+#define UNITEXT_YI_SYLLABLE_NZYT  U"\ua303"
 #define UNICODE_YI_SYLLABLE_NZYX  0xa304
-#define UNITEXT_YI_SYLLABLE_NZYX  L"\ua304"
+#define UNITEXT_YI_SYLLABLE_NZYX  U"\ua304"
 #define UNICODE_YI_SYLLABLE_NZY  0xa305
-#define UNITEXT_YI_SYLLABLE_NZY  L"\ua305"
+#define UNITEXT_YI_SYLLABLE_NZY  U"\ua305"
 #define UNICODE_YI_SYLLABLE_NZYP  0xa306
-#define UNITEXT_YI_SYLLABLE_NZYP  L"\ua306"
+#define UNITEXT_YI_SYLLABLE_NZYP  U"\ua306"
 #define UNICODE_YI_SYLLABLE_NZYRX  0xa307
-#define UNITEXT_YI_SYLLABLE_NZYRX  L"\ua307"
+#define UNITEXT_YI_SYLLABLE_NZYRX  U"\ua307"
 #define UNICODE_YI_SYLLABLE_NZYR  0xa308
-#define UNITEXT_YI_SYLLABLE_NZYR  L"\ua308"
+#define UNITEXT_YI_SYLLABLE_NZYR  U"\ua308"
 #define UNICODE_YI_SYLLABLE_SIT  0xa309
-#define UNITEXT_YI_SYLLABLE_SIT  L"\ua309"
+#define UNITEXT_YI_SYLLABLE_SIT  U"\ua309"
 #define UNICODE_YI_SYLLABLE_SIX  0xa30a
-#define UNITEXT_YI_SYLLABLE_SIX  L"\ua30a"
+#define UNITEXT_YI_SYLLABLE_SIX  U"\ua30a"
 #define UNICODE_YI_SYLLABLE_SI  0xa30b
-#define UNITEXT_YI_SYLLABLE_SI  L"\ua30b"
+#define UNITEXT_YI_SYLLABLE_SI  U"\ua30b"
 #define UNICODE_YI_SYLLABLE_SIP  0xa30c
-#define UNITEXT_YI_SYLLABLE_SIP  L"\ua30c"
+#define UNITEXT_YI_SYLLABLE_SIP  U"\ua30c"
 #define UNICODE_YI_SYLLABLE_SIEX  0xa30d
-#define UNITEXT_YI_SYLLABLE_SIEX  L"\ua30d"
+#define UNITEXT_YI_SYLLABLE_SIEX  U"\ua30d"
 #define UNICODE_YI_SYLLABLE_SIE  0xa30e
-#define UNITEXT_YI_SYLLABLE_SIE  L"\ua30e"
+#define UNITEXT_YI_SYLLABLE_SIE  U"\ua30e"
 #define UNICODE_YI_SYLLABLE_SIEP  0xa30f
-#define UNITEXT_YI_SYLLABLE_SIEP  L"\ua30f"
+#define UNITEXT_YI_SYLLABLE_SIEP  U"\ua30f"
 #define UNICODE_YI_SYLLABLE_SAT  0xa310
-#define UNITEXT_YI_SYLLABLE_SAT  L"\ua310"
+#define UNITEXT_YI_SYLLABLE_SAT  U"\ua310"
 #define UNICODE_YI_SYLLABLE_SAX  0xa311
-#define UNITEXT_YI_SYLLABLE_SAX  L"\ua311"
+#define UNITEXT_YI_SYLLABLE_SAX  U"\ua311"
 #define UNICODE_YI_SYLLABLE_SA  0xa312
-#define UNITEXT_YI_SYLLABLE_SA  L"\ua312"
+#define UNITEXT_YI_SYLLABLE_SA  U"\ua312"
 #define UNICODE_YI_SYLLABLE_SAP  0xa313
-#define UNITEXT_YI_SYLLABLE_SAP  L"\ua313"
+#define UNITEXT_YI_SYLLABLE_SAP  U"\ua313"
 #define UNICODE_YI_SYLLABLE_SUOX  0xa314
-#define UNITEXT_YI_SYLLABLE_SUOX  L"\ua314"
+#define UNITEXT_YI_SYLLABLE_SUOX  U"\ua314"
 #define UNICODE_YI_SYLLABLE_SUO  0xa315
-#define UNITEXT_YI_SYLLABLE_SUO  L"\ua315"
+#define UNITEXT_YI_SYLLABLE_SUO  U"\ua315"
 #define UNICODE_YI_SYLLABLE_SUOP  0xa316
-#define UNITEXT_YI_SYLLABLE_SUOP  L"\ua316"
+#define UNITEXT_YI_SYLLABLE_SUOP  U"\ua316"
 #define UNICODE_YI_SYLLABLE_SOT  0xa317
-#define UNITEXT_YI_SYLLABLE_SOT  L"\ua317"
+#define UNITEXT_YI_SYLLABLE_SOT  U"\ua317"
 #define UNICODE_YI_SYLLABLE_SOX  0xa318
-#define UNITEXT_YI_SYLLABLE_SOX  L"\ua318"
+#define UNITEXT_YI_SYLLABLE_SOX  U"\ua318"
 #define UNICODE_YI_SYLLABLE_SO  0xa319
-#define UNITEXT_YI_SYLLABLE_SO  L"\ua319"
+#define UNITEXT_YI_SYLLABLE_SO  U"\ua319"
 #define UNICODE_YI_SYLLABLE_SOP  0xa31a
-#define UNITEXT_YI_SYLLABLE_SOP  L"\ua31a"
+#define UNITEXT_YI_SYLLABLE_SOP  U"\ua31a"
 #define UNICODE_YI_SYLLABLE_SEX  0xa31b
-#define UNITEXT_YI_SYLLABLE_SEX  L"\ua31b"
+#define UNITEXT_YI_SYLLABLE_SEX  U"\ua31b"
 #define UNICODE_YI_SYLLABLE_SE  0xa31c
-#define UNITEXT_YI_SYLLABLE_SE  L"\ua31c"
+#define UNITEXT_YI_SYLLABLE_SE  U"\ua31c"
 #define UNICODE_YI_SYLLABLE_SEP  0xa31d
-#define UNITEXT_YI_SYLLABLE_SEP  L"\ua31d"
+#define UNITEXT_YI_SYLLABLE_SEP  U"\ua31d"
 #define UNICODE_YI_SYLLABLE_SUT  0xa31e
-#define UNITEXT_YI_SYLLABLE_SUT  L"\ua31e"
+#define UNITEXT_YI_SYLLABLE_SUT  U"\ua31e"
 #define UNICODE_YI_SYLLABLE_SUX  0xa31f
-#define UNITEXT_YI_SYLLABLE_SUX  L"\ua31f"
+#define UNITEXT_YI_SYLLABLE_SUX  U"\ua31f"
 #define UNICODE_YI_SYLLABLE_SU  0xa320
-#define UNITEXT_YI_SYLLABLE_SU  L"\ua320"
+#define UNITEXT_YI_SYLLABLE_SU  U"\ua320"
 #define UNICODE_YI_SYLLABLE_SUP  0xa321
-#define UNITEXT_YI_SYLLABLE_SUP  L"\ua321"
+#define UNITEXT_YI_SYLLABLE_SUP  U"\ua321"
 #define UNICODE_YI_SYLLABLE_SURX  0xa322
-#define UNITEXT_YI_SYLLABLE_SURX  L"\ua322"
+#define UNITEXT_YI_SYLLABLE_SURX  U"\ua322"
 #define UNICODE_YI_SYLLABLE_SUR  0xa323
-#define UNITEXT_YI_SYLLABLE_SUR  L"\ua323"
+#define UNITEXT_YI_SYLLABLE_SUR  U"\ua323"
 #define UNICODE_YI_SYLLABLE_SYT  0xa324
-#define UNITEXT_YI_SYLLABLE_SYT  L"\ua324"
+#define UNITEXT_YI_SYLLABLE_SYT  U"\ua324"
 #define UNICODE_YI_SYLLABLE_SYX  0xa325
-#define UNITEXT_YI_SYLLABLE_SYX  L"\ua325"
+#define UNITEXT_YI_SYLLABLE_SYX  U"\ua325"
 #define UNICODE_YI_SYLLABLE_SY  0xa326
-#define UNITEXT_YI_SYLLABLE_SY  L"\ua326"
+#define UNITEXT_YI_SYLLABLE_SY  U"\ua326"
 #define UNICODE_YI_SYLLABLE_SYP  0xa327
-#define UNITEXT_YI_SYLLABLE_SYP  L"\ua327"
+#define UNITEXT_YI_SYLLABLE_SYP  U"\ua327"
 #define UNICODE_YI_SYLLABLE_SYRX  0xa328
-#define UNITEXT_YI_SYLLABLE_SYRX  L"\ua328"
+#define UNITEXT_YI_SYLLABLE_SYRX  U"\ua328"
 #define UNICODE_YI_SYLLABLE_SYR  0xa329
-#define UNITEXT_YI_SYLLABLE_SYR  L"\ua329"
+#define UNITEXT_YI_SYLLABLE_SYR  U"\ua329"
 #define UNICODE_YI_SYLLABLE_SSIT  0xa32a
-#define UNITEXT_YI_SYLLABLE_SSIT  L"\ua32a"
+#define UNITEXT_YI_SYLLABLE_SSIT  U"\ua32a"
 #define UNICODE_YI_SYLLABLE_SSIX  0xa32b
-#define UNITEXT_YI_SYLLABLE_SSIX  L"\ua32b"
+#define UNITEXT_YI_SYLLABLE_SSIX  U"\ua32b"
 #define UNICODE_YI_SYLLABLE_SSI  0xa32c
-#define UNITEXT_YI_SYLLABLE_SSI  L"\ua32c"
+#define UNITEXT_YI_SYLLABLE_SSI  U"\ua32c"
 #define UNICODE_YI_SYLLABLE_SSIP  0xa32d
-#define UNITEXT_YI_SYLLABLE_SSIP  L"\ua32d"
+#define UNITEXT_YI_SYLLABLE_SSIP  U"\ua32d"
 #define UNICODE_YI_SYLLABLE_SSIEX  0xa32e
-#define UNITEXT_YI_SYLLABLE_SSIEX  L"\ua32e"
+#define UNITEXT_YI_SYLLABLE_SSIEX  U"\ua32e"
 #define UNICODE_YI_SYLLABLE_SSIE  0xa32f
-#define UNITEXT_YI_SYLLABLE_SSIE  L"\ua32f"
+#define UNITEXT_YI_SYLLABLE_SSIE  U"\ua32f"
 #define UNICODE_YI_SYLLABLE_SSIEP  0xa330
-#define UNITEXT_YI_SYLLABLE_SSIEP  L"\ua330"
+#define UNITEXT_YI_SYLLABLE_SSIEP  U"\ua330"
 #define UNICODE_YI_SYLLABLE_SSAT  0xa331
-#define UNITEXT_YI_SYLLABLE_SSAT  L"\ua331"
+#define UNITEXT_YI_SYLLABLE_SSAT  U"\ua331"
 #define UNICODE_YI_SYLLABLE_SSAX  0xa332
-#define UNITEXT_YI_SYLLABLE_SSAX  L"\ua332"
+#define UNITEXT_YI_SYLLABLE_SSAX  U"\ua332"
 #define UNICODE_YI_SYLLABLE_SSA  0xa333
-#define UNITEXT_YI_SYLLABLE_SSA  L"\ua333"
+#define UNITEXT_YI_SYLLABLE_SSA  U"\ua333"
 #define UNICODE_YI_SYLLABLE_SSAP  0xa334
-#define UNITEXT_YI_SYLLABLE_SSAP  L"\ua334"
+#define UNITEXT_YI_SYLLABLE_SSAP  U"\ua334"
 #define UNICODE_YI_SYLLABLE_SSOT  0xa335
-#define UNITEXT_YI_SYLLABLE_SSOT  L"\ua335"
+#define UNITEXT_YI_SYLLABLE_SSOT  U"\ua335"
 #define UNICODE_YI_SYLLABLE_SSOX  0xa336
-#define UNITEXT_YI_SYLLABLE_SSOX  L"\ua336"
+#define UNITEXT_YI_SYLLABLE_SSOX  U"\ua336"
 #define UNICODE_YI_SYLLABLE_SSO  0xa337
-#define UNITEXT_YI_SYLLABLE_SSO  L"\ua337"
+#define UNITEXT_YI_SYLLABLE_SSO  U"\ua337"
 #define UNICODE_YI_SYLLABLE_SSOP  0xa338
-#define UNITEXT_YI_SYLLABLE_SSOP  L"\ua338"
+#define UNITEXT_YI_SYLLABLE_SSOP  U"\ua338"
 #define UNICODE_YI_SYLLABLE_SSEX  0xa339
-#define UNITEXT_YI_SYLLABLE_SSEX  L"\ua339"
+#define UNITEXT_YI_SYLLABLE_SSEX  U"\ua339"
 #define UNICODE_YI_SYLLABLE_SSE  0xa33a
-#define UNITEXT_YI_SYLLABLE_SSE  L"\ua33a"
+#define UNITEXT_YI_SYLLABLE_SSE  U"\ua33a"
 #define UNICODE_YI_SYLLABLE_SSEP  0xa33b
-#define UNITEXT_YI_SYLLABLE_SSEP  L"\ua33b"
+#define UNITEXT_YI_SYLLABLE_SSEP  U"\ua33b"
 #define UNICODE_YI_SYLLABLE_SSUT  0xa33c
-#define UNITEXT_YI_SYLLABLE_SSUT  L"\ua33c"
+#define UNITEXT_YI_SYLLABLE_SSUT  U"\ua33c"
 #define UNICODE_YI_SYLLABLE_SSUX  0xa33d
-#define UNITEXT_YI_SYLLABLE_SSUX  L"\ua33d"
+#define UNITEXT_YI_SYLLABLE_SSUX  U"\ua33d"
 #define UNICODE_YI_SYLLABLE_SSU  0xa33e
-#define UNITEXT_YI_SYLLABLE_SSU  L"\ua33e"
+#define UNITEXT_YI_SYLLABLE_SSU  U"\ua33e"
 #define UNICODE_YI_SYLLABLE_SSUP  0xa33f
-#define UNITEXT_YI_SYLLABLE_SSUP  L"\ua33f"
+#define UNITEXT_YI_SYLLABLE_SSUP  U"\ua33f"
 #define UNICODE_YI_SYLLABLE_SSYT  0xa340
-#define UNITEXT_YI_SYLLABLE_SSYT  L"\ua340"
+#define UNITEXT_YI_SYLLABLE_SSYT  U"\ua340"
 #define UNICODE_YI_SYLLABLE_SSYX  0xa341
-#define UNITEXT_YI_SYLLABLE_SSYX  L"\ua341"
+#define UNITEXT_YI_SYLLABLE_SSYX  U"\ua341"
 #define UNICODE_YI_SYLLABLE_SSY  0xa342
-#define UNITEXT_YI_SYLLABLE_SSY  L"\ua342"
+#define UNITEXT_YI_SYLLABLE_SSY  U"\ua342"
 #define UNICODE_YI_SYLLABLE_SSYP  0xa343
-#define UNITEXT_YI_SYLLABLE_SSYP  L"\ua343"
+#define UNITEXT_YI_SYLLABLE_SSYP  U"\ua343"
 #define UNICODE_YI_SYLLABLE_SSYRX  0xa344
-#define UNITEXT_YI_SYLLABLE_SSYRX  L"\ua344"
+#define UNITEXT_YI_SYLLABLE_SSYRX  U"\ua344"
 #define UNICODE_YI_SYLLABLE_SSYR  0xa345
-#define UNITEXT_YI_SYLLABLE_SSYR  L"\ua345"
+#define UNITEXT_YI_SYLLABLE_SSYR  U"\ua345"
 #define UNICODE_YI_SYLLABLE_ZHAT  0xa346
-#define UNITEXT_YI_SYLLABLE_ZHAT  L"\ua346"
+#define UNITEXT_YI_SYLLABLE_ZHAT  U"\ua346"
 #define UNICODE_YI_SYLLABLE_ZHAX  0xa347
-#define UNITEXT_YI_SYLLABLE_ZHAX  L"\ua347"
+#define UNITEXT_YI_SYLLABLE_ZHAX  U"\ua347"
 #define UNICODE_YI_SYLLABLE_ZHA  0xa348
-#define UNITEXT_YI_SYLLABLE_ZHA  L"\ua348"
+#define UNITEXT_YI_SYLLABLE_ZHA  U"\ua348"
 #define UNICODE_YI_SYLLABLE_ZHAP  0xa349
-#define UNITEXT_YI_SYLLABLE_ZHAP  L"\ua349"
+#define UNITEXT_YI_SYLLABLE_ZHAP  U"\ua349"
 #define UNICODE_YI_SYLLABLE_ZHUOX  0xa34a
-#define UNITEXT_YI_SYLLABLE_ZHUOX  L"\ua34a"
+#define UNITEXT_YI_SYLLABLE_ZHUOX  U"\ua34a"
 #define UNICODE_YI_SYLLABLE_ZHUO  0xa34b
-#define UNITEXT_YI_SYLLABLE_ZHUO  L"\ua34b"
+#define UNITEXT_YI_SYLLABLE_ZHUO  U"\ua34b"
 #define UNICODE_YI_SYLLABLE_ZHUOP  0xa34c
-#define UNITEXT_YI_SYLLABLE_ZHUOP  L"\ua34c"
+#define UNITEXT_YI_SYLLABLE_ZHUOP  U"\ua34c"
 #define UNICODE_YI_SYLLABLE_ZHOT  0xa34d
-#define UNITEXT_YI_SYLLABLE_ZHOT  L"\ua34d"
+#define UNITEXT_YI_SYLLABLE_ZHOT  U"\ua34d"
 #define UNICODE_YI_SYLLABLE_ZHOX  0xa34e
-#define UNITEXT_YI_SYLLABLE_ZHOX  L"\ua34e"
+#define UNITEXT_YI_SYLLABLE_ZHOX  U"\ua34e"
 #define UNICODE_YI_SYLLABLE_ZHO  0xa34f
-#define UNITEXT_YI_SYLLABLE_ZHO  L"\ua34f"
+#define UNITEXT_YI_SYLLABLE_ZHO  U"\ua34f"
 #define UNICODE_YI_SYLLABLE_ZHOP  0xa350
-#define UNITEXT_YI_SYLLABLE_ZHOP  L"\ua350"
+#define UNITEXT_YI_SYLLABLE_ZHOP  U"\ua350"
 #define UNICODE_YI_SYLLABLE_ZHET  0xa351
-#define UNITEXT_YI_SYLLABLE_ZHET  L"\ua351"
+#define UNITEXT_YI_SYLLABLE_ZHET  U"\ua351"
 #define UNICODE_YI_SYLLABLE_ZHEX  0xa352
-#define UNITEXT_YI_SYLLABLE_ZHEX  L"\ua352"
+#define UNITEXT_YI_SYLLABLE_ZHEX  U"\ua352"
 #define UNICODE_YI_SYLLABLE_ZHE  0xa353
-#define UNITEXT_YI_SYLLABLE_ZHE  L"\ua353"
+#define UNITEXT_YI_SYLLABLE_ZHE  U"\ua353"
 #define UNICODE_YI_SYLLABLE_ZHEP  0xa354
-#define UNITEXT_YI_SYLLABLE_ZHEP  L"\ua354"
+#define UNITEXT_YI_SYLLABLE_ZHEP  U"\ua354"
 #define UNICODE_YI_SYLLABLE_ZHUT  0xa355
-#define UNITEXT_YI_SYLLABLE_ZHUT  L"\ua355"
+#define UNITEXT_YI_SYLLABLE_ZHUT  U"\ua355"
 #define UNICODE_YI_SYLLABLE_ZHUX  0xa356
-#define UNITEXT_YI_SYLLABLE_ZHUX  L"\ua356"
+#define UNITEXT_YI_SYLLABLE_ZHUX  U"\ua356"
 #define UNICODE_YI_SYLLABLE_ZHU  0xa357
-#define UNITEXT_YI_SYLLABLE_ZHU  L"\ua357"
+#define UNITEXT_YI_SYLLABLE_ZHU  U"\ua357"
 #define UNICODE_YI_SYLLABLE_ZHUP  0xa358
-#define UNITEXT_YI_SYLLABLE_ZHUP  L"\ua358"
+#define UNITEXT_YI_SYLLABLE_ZHUP  U"\ua358"
 #define UNICODE_YI_SYLLABLE_ZHURX  0xa359
-#define UNITEXT_YI_SYLLABLE_ZHURX  L"\ua359"
+#define UNITEXT_YI_SYLLABLE_ZHURX  U"\ua359"
 #define UNICODE_YI_SYLLABLE_ZHUR  0xa35a
-#define UNITEXT_YI_SYLLABLE_ZHUR  L"\ua35a"
+#define UNITEXT_YI_SYLLABLE_ZHUR  U"\ua35a"
 #define UNICODE_YI_SYLLABLE_ZHYT  0xa35b
-#define UNITEXT_YI_SYLLABLE_ZHYT  L"\ua35b"
+#define UNITEXT_YI_SYLLABLE_ZHYT  U"\ua35b"
 #define UNICODE_YI_SYLLABLE_ZHYX  0xa35c
-#define UNITEXT_YI_SYLLABLE_ZHYX  L"\ua35c"
+#define UNITEXT_YI_SYLLABLE_ZHYX  U"\ua35c"
 #define UNICODE_YI_SYLLABLE_ZHY  0xa35d
-#define UNITEXT_YI_SYLLABLE_ZHY  L"\ua35d"
+#define UNITEXT_YI_SYLLABLE_ZHY  U"\ua35d"
 #define UNICODE_YI_SYLLABLE_ZHYP  0xa35e
-#define UNITEXT_YI_SYLLABLE_ZHYP  L"\ua35e"
+#define UNITEXT_YI_SYLLABLE_ZHYP  U"\ua35e"
 #define UNICODE_YI_SYLLABLE_ZHYRX  0xa35f
-#define UNITEXT_YI_SYLLABLE_ZHYRX  L"\ua35f"
+#define UNITEXT_YI_SYLLABLE_ZHYRX  U"\ua35f"
 #define UNICODE_YI_SYLLABLE_ZHYR  0xa360
-#define UNITEXT_YI_SYLLABLE_ZHYR  L"\ua360"
+#define UNITEXT_YI_SYLLABLE_ZHYR  U"\ua360"
 #define UNICODE_YI_SYLLABLE_CHAT  0xa361
-#define UNITEXT_YI_SYLLABLE_CHAT  L"\ua361"
+#define UNITEXT_YI_SYLLABLE_CHAT  U"\ua361"
 #define UNICODE_YI_SYLLABLE_CHAX  0xa362
-#define UNITEXT_YI_SYLLABLE_CHAX  L"\ua362"
+#define UNITEXT_YI_SYLLABLE_CHAX  U"\ua362"
 #define UNICODE_YI_SYLLABLE_CHA  0xa363
-#define UNITEXT_YI_SYLLABLE_CHA  L"\ua363"
+#define UNITEXT_YI_SYLLABLE_CHA  U"\ua363"
 #define UNICODE_YI_SYLLABLE_CHAP  0xa364
-#define UNITEXT_YI_SYLLABLE_CHAP  L"\ua364"
+#define UNITEXT_YI_SYLLABLE_CHAP  U"\ua364"
 #define UNICODE_YI_SYLLABLE_CHUOT  0xa365
-#define UNITEXT_YI_SYLLABLE_CHUOT  L"\ua365"
+#define UNITEXT_YI_SYLLABLE_CHUOT  U"\ua365"
 #define UNICODE_YI_SYLLABLE_CHUOX  0xa366
-#define UNITEXT_YI_SYLLABLE_CHUOX  L"\ua366"
+#define UNITEXT_YI_SYLLABLE_CHUOX  U"\ua366"
 #define UNICODE_YI_SYLLABLE_CHUO  0xa367
-#define UNITEXT_YI_SYLLABLE_CHUO  L"\ua367"
+#define UNITEXT_YI_SYLLABLE_CHUO  U"\ua367"
 #define UNICODE_YI_SYLLABLE_CHUOP  0xa368
-#define UNITEXT_YI_SYLLABLE_CHUOP  L"\ua368"
+#define UNITEXT_YI_SYLLABLE_CHUOP  U"\ua368"
 #define UNICODE_YI_SYLLABLE_CHOT  0xa369
-#define UNITEXT_YI_SYLLABLE_CHOT  L"\ua369"
+#define UNITEXT_YI_SYLLABLE_CHOT  U"\ua369"
 #define UNICODE_YI_SYLLABLE_CHOX  0xa36a
-#define UNITEXT_YI_SYLLABLE_CHOX  L"\ua36a"
+#define UNITEXT_YI_SYLLABLE_CHOX  U"\ua36a"
 #define UNICODE_YI_SYLLABLE_CHO  0xa36b
-#define UNITEXT_YI_SYLLABLE_CHO  L"\ua36b"
+#define UNITEXT_YI_SYLLABLE_CHO  U"\ua36b"
 #define UNICODE_YI_SYLLABLE_CHOP  0xa36c
-#define UNITEXT_YI_SYLLABLE_CHOP  L"\ua36c"
+#define UNITEXT_YI_SYLLABLE_CHOP  U"\ua36c"
 #define UNICODE_YI_SYLLABLE_CHET  0xa36d
-#define UNITEXT_YI_SYLLABLE_CHET  L"\ua36d"
+#define UNITEXT_YI_SYLLABLE_CHET  U"\ua36d"
 #define UNICODE_YI_SYLLABLE_CHEX  0xa36e
-#define UNITEXT_YI_SYLLABLE_CHEX  L"\ua36e"
+#define UNITEXT_YI_SYLLABLE_CHEX  U"\ua36e"
 #define UNICODE_YI_SYLLABLE_CHE  0xa36f
-#define UNITEXT_YI_SYLLABLE_CHE  L"\ua36f"
+#define UNITEXT_YI_SYLLABLE_CHE  U"\ua36f"
 #define UNICODE_YI_SYLLABLE_CHEP  0xa370
-#define UNITEXT_YI_SYLLABLE_CHEP  L"\ua370"
+#define UNITEXT_YI_SYLLABLE_CHEP  U"\ua370"
 #define UNICODE_YI_SYLLABLE_CHUX  0xa371
-#define UNITEXT_YI_SYLLABLE_CHUX  L"\ua371"
+#define UNITEXT_YI_SYLLABLE_CHUX  U"\ua371"
 #define UNICODE_YI_SYLLABLE_CHU  0xa372
-#define UNITEXT_YI_SYLLABLE_CHU  L"\ua372"
+#define UNITEXT_YI_SYLLABLE_CHU  U"\ua372"
 #define UNICODE_YI_SYLLABLE_CHUP  0xa373
-#define UNITEXT_YI_SYLLABLE_CHUP  L"\ua373"
+#define UNITEXT_YI_SYLLABLE_CHUP  U"\ua373"
 #define UNICODE_YI_SYLLABLE_CHURX  0xa374
-#define UNITEXT_YI_SYLLABLE_CHURX  L"\ua374"
+#define UNITEXT_YI_SYLLABLE_CHURX  U"\ua374"
 #define UNICODE_YI_SYLLABLE_CHUR  0xa375
-#define UNITEXT_YI_SYLLABLE_CHUR  L"\ua375"
+#define UNITEXT_YI_SYLLABLE_CHUR  U"\ua375"
 #define UNICODE_YI_SYLLABLE_CHYT  0xa376
-#define UNITEXT_YI_SYLLABLE_CHYT  L"\ua376"
+#define UNITEXT_YI_SYLLABLE_CHYT  U"\ua376"
 #define UNICODE_YI_SYLLABLE_CHYX  0xa377
-#define UNITEXT_YI_SYLLABLE_CHYX  L"\ua377"
+#define UNITEXT_YI_SYLLABLE_CHYX  U"\ua377"
 #define UNICODE_YI_SYLLABLE_CHY  0xa378
-#define UNITEXT_YI_SYLLABLE_CHY  L"\ua378"
+#define UNITEXT_YI_SYLLABLE_CHY  U"\ua378"
 #define UNICODE_YI_SYLLABLE_CHYP  0xa379
-#define UNITEXT_YI_SYLLABLE_CHYP  L"\ua379"
+#define UNITEXT_YI_SYLLABLE_CHYP  U"\ua379"
 #define UNICODE_YI_SYLLABLE_CHYRX  0xa37a
-#define UNITEXT_YI_SYLLABLE_CHYRX  L"\ua37a"
+#define UNITEXT_YI_SYLLABLE_CHYRX  U"\ua37a"
 #define UNICODE_YI_SYLLABLE_CHYR  0xa37b
-#define UNITEXT_YI_SYLLABLE_CHYR  L"\ua37b"
+#define UNITEXT_YI_SYLLABLE_CHYR  U"\ua37b"
 #define UNICODE_YI_SYLLABLE_RRAX  0xa37c
-#define UNITEXT_YI_SYLLABLE_RRAX  L"\ua37c"
+#define UNITEXT_YI_SYLLABLE_RRAX  U"\ua37c"
 #define UNICODE_YI_SYLLABLE_RRA  0xa37d
-#define UNITEXT_YI_SYLLABLE_RRA  L"\ua37d"
+#define UNITEXT_YI_SYLLABLE_RRA  U"\ua37d"
 #define UNICODE_YI_SYLLABLE_RRUOX  0xa37e
-#define UNITEXT_YI_SYLLABLE_RRUOX  L"\ua37e"
+#define UNITEXT_YI_SYLLABLE_RRUOX  U"\ua37e"
 #define UNICODE_YI_SYLLABLE_RRUO  0xa37f
-#define UNITEXT_YI_SYLLABLE_RRUO  L"\ua37f"
+#define UNITEXT_YI_SYLLABLE_RRUO  U"\ua37f"
 #define UNICODE_YI_SYLLABLE_RROT  0xa380
-#define UNITEXT_YI_SYLLABLE_RROT  L"\ua380"
+#define UNITEXT_YI_SYLLABLE_RROT  U"\ua380"
 #define UNICODE_YI_SYLLABLE_RROX  0xa381
-#define UNITEXT_YI_SYLLABLE_RROX  L"\ua381"
+#define UNITEXT_YI_SYLLABLE_RROX  U"\ua381"
 #define UNICODE_YI_SYLLABLE_RRO  0xa382
-#define UNITEXT_YI_SYLLABLE_RRO  L"\ua382"
+#define UNITEXT_YI_SYLLABLE_RRO  U"\ua382"
 #define UNICODE_YI_SYLLABLE_RROP  0xa383
-#define UNITEXT_YI_SYLLABLE_RROP  L"\ua383"
+#define UNITEXT_YI_SYLLABLE_RROP  U"\ua383"
 #define UNICODE_YI_SYLLABLE_RRET  0xa384
-#define UNITEXT_YI_SYLLABLE_RRET  L"\ua384"
+#define UNITEXT_YI_SYLLABLE_RRET  U"\ua384"
 #define UNICODE_YI_SYLLABLE_RREX  0xa385
-#define UNITEXT_YI_SYLLABLE_RREX  L"\ua385"
+#define UNITEXT_YI_SYLLABLE_RREX  U"\ua385"
 #define UNICODE_YI_SYLLABLE_RRE  0xa386
-#define UNITEXT_YI_SYLLABLE_RRE  L"\ua386"
+#define UNITEXT_YI_SYLLABLE_RRE  U"\ua386"
 #define UNICODE_YI_SYLLABLE_RREP  0xa387
-#define UNITEXT_YI_SYLLABLE_RREP  L"\ua387"
+#define UNITEXT_YI_SYLLABLE_RREP  U"\ua387"
 #define UNICODE_YI_SYLLABLE_RRUT  0xa388
-#define UNITEXT_YI_SYLLABLE_RRUT  L"\ua388"
+#define UNITEXT_YI_SYLLABLE_RRUT  U"\ua388"
 #define UNICODE_YI_SYLLABLE_RRUX  0xa389
-#define UNITEXT_YI_SYLLABLE_RRUX  L"\ua389"
+#define UNITEXT_YI_SYLLABLE_RRUX  U"\ua389"
 #define UNICODE_YI_SYLLABLE_RRU  0xa38a
-#define UNITEXT_YI_SYLLABLE_RRU  L"\ua38a"
+#define UNITEXT_YI_SYLLABLE_RRU  U"\ua38a"
 #define UNICODE_YI_SYLLABLE_RRUP  0xa38b
-#define UNITEXT_YI_SYLLABLE_RRUP  L"\ua38b"
+#define UNITEXT_YI_SYLLABLE_RRUP  U"\ua38b"
 #define UNICODE_YI_SYLLABLE_RRURX  0xa38c
-#define UNITEXT_YI_SYLLABLE_RRURX  L"\ua38c"
+#define UNITEXT_YI_SYLLABLE_RRURX  U"\ua38c"
 #define UNICODE_YI_SYLLABLE_RRUR  0xa38d
-#define UNITEXT_YI_SYLLABLE_RRUR  L"\ua38d"
+#define UNITEXT_YI_SYLLABLE_RRUR  U"\ua38d"
 #define UNICODE_YI_SYLLABLE_RRYT  0xa38e
-#define UNITEXT_YI_SYLLABLE_RRYT  L"\ua38e"
+#define UNITEXT_YI_SYLLABLE_RRYT  U"\ua38e"
 #define UNICODE_YI_SYLLABLE_RRYX  0xa38f
-#define UNITEXT_YI_SYLLABLE_RRYX  L"\ua38f"
+#define UNITEXT_YI_SYLLABLE_RRYX  U"\ua38f"
 #define UNICODE_YI_SYLLABLE_RRY  0xa390
-#define UNITEXT_YI_SYLLABLE_RRY  L"\ua390"
+#define UNITEXT_YI_SYLLABLE_RRY  U"\ua390"
 #define UNICODE_YI_SYLLABLE_RRYP  0xa391
-#define UNITEXT_YI_SYLLABLE_RRYP  L"\ua391"
+#define UNITEXT_YI_SYLLABLE_RRYP  U"\ua391"
 #define UNICODE_YI_SYLLABLE_RRYRX  0xa392
-#define UNITEXT_YI_SYLLABLE_RRYRX  L"\ua392"
+#define UNITEXT_YI_SYLLABLE_RRYRX  U"\ua392"
 #define UNICODE_YI_SYLLABLE_RRYR  0xa393
-#define UNITEXT_YI_SYLLABLE_RRYR  L"\ua393"
+#define UNITEXT_YI_SYLLABLE_RRYR  U"\ua393"
 #define UNICODE_YI_SYLLABLE_NRAT  0xa394
-#define UNITEXT_YI_SYLLABLE_NRAT  L"\ua394"
+#define UNITEXT_YI_SYLLABLE_NRAT  U"\ua394"
 #define UNICODE_YI_SYLLABLE_NRAX  0xa395
-#define UNITEXT_YI_SYLLABLE_NRAX  L"\ua395"
+#define UNITEXT_YI_SYLLABLE_NRAX  U"\ua395"
 #define UNICODE_YI_SYLLABLE_NRA  0xa396
-#define UNITEXT_YI_SYLLABLE_NRA  L"\ua396"
+#define UNITEXT_YI_SYLLABLE_NRA  U"\ua396"
 #define UNICODE_YI_SYLLABLE_NRAP  0xa397
-#define UNITEXT_YI_SYLLABLE_NRAP  L"\ua397"
+#define UNITEXT_YI_SYLLABLE_NRAP  U"\ua397"
 #define UNICODE_YI_SYLLABLE_NROX  0xa398
-#define UNITEXT_YI_SYLLABLE_NROX  L"\ua398"
+#define UNITEXT_YI_SYLLABLE_NROX  U"\ua398"
 #define UNICODE_YI_SYLLABLE_NRO  0xa399
-#define UNITEXT_YI_SYLLABLE_NRO  L"\ua399"
+#define UNITEXT_YI_SYLLABLE_NRO  U"\ua399"
 #define UNICODE_YI_SYLLABLE_NROP  0xa39a
-#define UNITEXT_YI_SYLLABLE_NROP  L"\ua39a"
+#define UNITEXT_YI_SYLLABLE_NROP  U"\ua39a"
 #define UNICODE_YI_SYLLABLE_NRET  0xa39b
-#define UNITEXT_YI_SYLLABLE_NRET  L"\ua39b"
+#define UNITEXT_YI_SYLLABLE_NRET  U"\ua39b"
 #define UNICODE_YI_SYLLABLE_NREX  0xa39c
-#define UNITEXT_YI_SYLLABLE_NREX  L"\ua39c"
+#define UNITEXT_YI_SYLLABLE_NREX  U"\ua39c"
 #define UNICODE_YI_SYLLABLE_NRE  0xa39d
-#define UNITEXT_YI_SYLLABLE_NRE  L"\ua39d"
+#define UNITEXT_YI_SYLLABLE_NRE  U"\ua39d"
 #define UNICODE_YI_SYLLABLE_NREP  0xa39e
-#define UNITEXT_YI_SYLLABLE_NREP  L"\ua39e"
+#define UNITEXT_YI_SYLLABLE_NREP  U"\ua39e"
 #define UNICODE_YI_SYLLABLE_NRUT  0xa39f
-#define UNITEXT_YI_SYLLABLE_NRUT  L"\ua39f"
+#define UNITEXT_YI_SYLLABLE_NRUT  U"\ua39f"
 #define UNICODE_YI_SYLLABLE_NRUX  0xa3a0
-#define UNITEXT_YI_SYLLABLE_NRUX  L"\ua3a0"
+#define UNITEXT_YI_SYLLABLE_NRUX  U"\ua3a0"
 #define UNICODE_YI_SYLLABLE_NRU  0xa3a1
-#define UNITEXT_YI_SYLLABLE_NRU  L"\ua3a1"
+#define UNITEXT_YI_SYLLABLE_NRU  U"\ua3a1"
 #define UNICODE_YI_SYLLABLE_NRUP  0xa3a2
-#define UNITEXT_YI_SYLLABLE_NRUP  L"\ua3a2"
+#define UNITEXT_YI_SYLLABLE_NRUP  U"\ua3a2"
 #define UNICODE_YI_SYLLABLE_NRURX  0xa3a3
-#define UNITEXT_YI_SYLLABLE_NRURX  L"\ua3a3"
+#define UNITEXT_YI_SYLLABLE_NRURX  U"\ua3a3"
 #define UNICODE_YI_SYLLABLE_NRUR  0xa3a4
-#define UNITEXT_YI_SYLLABLE_NRUR  L"\ua3a4"
+#define UNITEXT_YI_SYLLABLE_NRUR  U"\ua3a4"
 #define UNICODE_YI_SYLLABLE_NRYT  0xa3a5
-#define UNITEXT_YI_SYLLABLE_NRYT  L"\ua3a5"
+#define UNITEXT_YI_SYLLABLE_NRYT  U"\ua3a5"
 #define UNICODE_YI_SYLLABLE_NRYX  0xa3a6
-#define UNITEXT_YI_SYLLABLE_NRYX  L"\ua3a6"
+#define UNITEXT_YI_SYLLABLE_NRYX  U"\ua3a6"
 #define UNICODE_YI_SYLLABLE_NRY  0xa3a7
-#define UNITEXT_YI_SYLLABLE_NRY  L"\ua3a7"
+#define UNITEXT_YI_SYLLABLE_NRY  U"\ua3a7"
 #define UNICODE_YI_SYLLABLE_NRYP  0xa3a8
-#define UNITEXT_YI_SYLLABLE_NRYP  L"\ua3a8"
+#define UNITEXT_YI_SYLLABLE_NRYP  U"\ua3a8"
 #define UNICODE_YI_SYLLABLE_NRYRX  0xa3a9
-#define UNITEXT_YI_SYLLABLE_NRYRX  L"\ua3a9"
+#define UNITEXT_YI_SYLLABLE_NRYRX  U"\ua3a9"
 #define UNICODE_YI_SYLLABLE_NRYR  0xa3aa
-#define UNITEXT_YI_SYLLABLE_NRYR  L"\ua3aa"
+#define UNITEXT_YI_SYLLABLE_NRYR  U"\ua3aa"
 #define UNICODE_YI_SYLLABLE_SHAT  0xa3ab
-#define UNITEXT_YI_SYLLABLE_SHAT  L"\ua3ab"
+#define UNITEXT_YI_SYLLABLE_SHAT  U"\ua3ab"
 #define UNICODE_YI_SYLLABLE_SHAX  0xa3ac
-#define UNITEXT_YI_SYLLABLE_SHAX  L"\ua3ac"
+#define UNITEXT_YI_SYLLABLE_SHAX  U"\ua3ac"
 #define UNICODE_YI_SYLLABLE_SHA  0xa3ad
-#define UNITEXT_YI_SYLLABLE_SHA  L"\ua3ad"
+#define UNITEXT_YI_SYLLABLE_SHA  U"\ua3ad"
 #define UNICODE_YI_SYLLABLE_SHAP  0xa3ae
-#define UNITEXT_YI_SYLLABLE_SHAP  L"\ua3ae"
+#define UNITEXT_YI_SYLLABLE_SHAP  U"\ua3ae"
 #define UNICODE_YI_SYLLABLE_SHUOX  0xa3af
-#define UNITEXT_YI_SYLLABLE_SHUOX  L"\ua3af"
+#define UNITEXT_YI_SYLLABLE_SHUOX  U"\ua3af"
 #define UNICODE_YI_SYLLABLE_SHUO  0xa3b0
-#define UNITEXT_YI_SYLLABLE_SHUO  L"\ua3b0"
+#define UNITEXT_YI_SYLLABLE_SHUO  U"\ua3b0"
 #define UNICODE_YI_SYLLABLE_SHUOP  0xa3b1
-#define UNITEXT_YI_SYLLABLE_SHUOP  L"\ua3b1"
+#define UNITEXT_YI_SYLLABLE_SHUOP  U"\ua3b1"
 #define UNICODE_YI_SYLLABLE_SHOT  0xa3b2
-#define UNITEXT_YI_SYLLABLE_SHOT  L"\ua3b2"
+#define UNITEXT_YI_SYLLABLE_SHOT  U"\ua3b2"
 #define UNICODE_YI_SYLLABLE_SHOX  0xa3b3
-#define UNITEXT_YI_SYLLABLE_SHOX  L"\ua3b3"
+#define UNITEXT_YI_SYLLABLE_SHOX  U"\ua3b3"
 #define UNICODE_YI_SYLLABLE_SHO  0xa3b4
-#define UNITEXT_YI_SYLLABLE_SHO  L"\ua3b4"
+#define UNITEXT_YI_SYLLABLE_SHO  U"\ua3b4"
 #define UNICODE_YI_SYLLABLE_SHOP  0xa3b5
-#define UNITEXT_YI_SYLLABLE_SHOP  L"\ua3b5"
+#define UNITEXT_YI_SYLLABLE_SHOP  U"\ua3b5"
 #define UNICODE_YI_SYLLABLE_SHET  0xa3b6
-#define UNITEXT_YI_SYLLABLE_SHET  L"\ua3b6"
+#define UNITEXT_YI_SYLLABLE_SHET  U"\ua3b6"
 #define UNICODE_YI_SYLLABLE_SHEX  0xa3b7
-#define UNITEXT_YI_SYLLABLE_SHEX  L"\ua3b7"
+#define UNITEXT_YI_SYLLABLE_SHEX  U"\ua3b7"
 #define UNICODE_YI_SYLLABLE_SHE  0xa3b8
-#define UNITEXT_YI_SYLLABLE_SHE  L"\ua3b8"
+#define UNITEXT_YI_SYLLABLE_SHE  U"\ua3b8"
 #define UNICODE_YI_SYLLABLE_SHEP  0xa3b9
-#define UNITEXT_YI_SYLLABLE_SHEP  L"\ua3b9"
+#define UNITEXT_YI_SYLLABLE_SHEP  U"\ua3b9"
 #define UNICODE_YI_SYLLABLE_SHUT  0xa3ba
-#define UNITEXT_YI_SYLLABLE_SHUT  L"\ua3ba"
+#define UNITEXT_YI_SYLLABLE_SHUT  U"\ua3ba"
 #define UNICODE_YI_SYLLABLE_SHUX  0xa3bb
-#define UNITEXT_YI_SYLLABLE_SHUX  L"\ua3bb"
+#define UNITEXT_YI_SYLLABLE_SHUX  U"\ua3bb"
 #define UNICODE_YI_SYLLABLE_SHU  0xa3bc
-#define UNITEXT_YI_SYLLABLE_SHU  L"\ua3bc"
+#define UNITEXT_YI_SYLLABLE_SHU  U"\ua3bc"
 #define UNICODE_YI_SYLLABLE_SHUP  0xa3bd
-#define UNITEXT_YI_SYLLABLE_SHUP  L"\ua3bd"
+#define UNITEXT_YI_SYLLABLE_SHUP  U"\ua3bd"
 #define UNICODE_YI_SYLLABLE_SHURX  0xa3be
-#define UNITEXT_YI_SYLLABLE_SHURX  L"\ua3be"
+#define UNITEXT_YI_SYLLABLE_SHURX  U"\ua3be"
 #define UNICODE_YI_SYLLABLE_SHUR  0xa3bf
-#define UNITEXT_YI_SYLLABLE_SHUR  L"\ua3bf"
+#define UNITEXT_YI_SYLLABLE_SHUR  U"\ua3bf"
 #define UNICODE_YI_SYLLABLE_SHYT  0xa3c0
-#define UNITEXT_YI_SYLLABLE_SHYT  L"\ua3c0"
+#define UNITEXT_YI_SYLLABLE_SHYT  U"\ua3c0"
 #define UNICODE_YI_SYLLABLE_SHYX  0xa3c1
-#define UNITEXT_YI_SYLLABLE_SHYX  L"\ua3c1"
+#define UNITEXT_YI_SYLLABLE_SHYX  U"\ua3c1"
 #define UNICODE_YI_SYLLABLE_SHY  0xa3c2
-#define UNITEXT_YI_SYLLABLE_SHY  L"\ua3c2"
+#define UNITEXT_YI_SYLLABLE_SHY  U"\ua3c2"
 #define UNICODE_YI_SYLLABLE_SHYP  0xa3c3
-#define UNITEXT_YI_SYLLABLE_SHYP  L"\ua3c3"
+#define UNITEXT_YI_SYLLABLE_SHYP  U"\ua3c3"
 #define UNICODE_YI_SYLLABLE_SHYRX  0xa3c4
-#define UNITEXT_YI_SYLLABLE_SHYRX  L"\ua3c4"
+#define UNITEXT_YI_SYLLABLE_SHYRX  U"\ua3c4"
 #define UNICODE_YI_SYLLABLE_SHYR  0xa3c5
-#define UNITEXT_YI_SYLLABLE_SHYR  L"\ua3c5"
+#define UNITEXT_YI_SYLLABLE_SHYR  U"\ua3c5"
 #define UNICODE_YI_SYLLABLE_RAT  0xa3c6
-#define UNITEXT_YI_SYLLABLE_RAT  L"\ua3c6"
+#define UNITEXT_YI_SYLLABLE_RAT  U"\ua3c6"
 #define UNICODE_YI_SYLLABLE_RAX  0xa3c7
-#define UNITEXT_YI_SYLLABLE_RAX  L"\ua3c7"
+#define UNITEXT_YI_SYLLABLE_RAX  U"\ua3c7"
 #define UNICODE_YI_SYLLABLE_RA  0xa3c8
-#define UNITEXT_YI_SYLLABLE_RA  L"\ua3c8"
+#define UNITEXT_YI_SYLLABLE_RA  U"\ua3c8"
 #define UNICODE_YI_SYLLABLE_RAP  0xa3c9
-#define UNITEXT_YI_SYLLABLE_RAP  L"\ua3c9"
+#define UNITEXT_YI_SYLLABLE_RAP  U"\ua3c9"
 #define UNICODE_YI_SYLLABLE_RUOX  0xa3ca
-#define UNITEXT_YI_SYLLABLE_RUOX  L"\ua3ca"
+#define UNITEXT_YI_SYLLABLE_RUOX  U"\ua3ca"
 #define UNICODE_YI_SYLLABLE_RUO  0xa3cb
-#define UNITEXT_YI_SYLLABLE_RUO  L"\ua3cb"
+#define UNITEXT_YI_SYLLABLE_RUO  U"\ua3cb"
 #define UNICODE_YI_SYLLABLE_RUOP  0xa3cc
-#define UNITEXT_YI_SYLLABLE_RUOP  L"\ua3cc"
+#define UNITEXT_YI_SYLLABLE_RUOP  U"\ua3cc"
 #define UNICODE_YI_SYLLABLE_ROT  0xa3cd
-#define UNITEXT_YI_SYLLABLE_ROT  L"\ua3cd"
+#define UNITEXT_YI_SYLLABLE_ROT  U"\ua3cd"
 #define UNICODE_YI_SYLLABLE_ROX  0xa3ce
-#define UNITEXT_YI_SYLLABLE_ROX  L"\ua3ce"
+#define UNITEXT_YI_SYLLABLE_ROX  U"\ua3ce"
 #define UNICODE_YI_SYLLABLE_RO  0xa3cf
-#define UNITEXT_YI_SYLLABLE_RO  L"\ua3cf"
+#define UNITEXT_YI_SYLLABLE_RO  U"\ua3cf"
 #define UNICODE_YI_SYLLABLE_ROP  0xa3d0
-#define UNITEXT_YI_SYLLABLE_ROP  L"\ua3d0"
+#define UNITEXT_YI_SYLLABLE_ROP  U"\ua3d0"
 #define UNICODE_YI_SYLLABLE_REX  0xa3d1
-#define UNITEXT_YI_SYLLABLE_REX  L"\ua3d1"
+#define UNITEXT_YI_SYLLABLE_REX  U"\ua3d1"
 #define UNICODE_YI_SYLLABLE_RE  0xa3d2
-#define UNITEXT_YI_SYLLABLE_RE  L"\ua3d2"
+#define UNITEXT_YI_SYLLABLE_RE  U"\ua3d2"
 #define UNICODE_YI_SYLLABLE_REP  0xa3d3
-#define UNITEXT_YI_SYLLABLE_REP  L"\ua3d3"
+#define UNITEXT_YI_SYLLABLE_REP  U"\ua3d3"
 #define UNICODE_YI_SYLLABLE_RUT  0xa3d4
-#define UNITEXT_YI_SYLLABLE_RUT  L"\ua3d4"
+#define UNITEXT_YI_SYLLABLE_RUT  U"\ua3d4"
 #define UNICODE_YI_SYLLABLE_RUX  0xa3d5
-#define UNITEXT_YI_SYLLABLE_RUX  L"\ua3d5"
+#define UNITEXT_YI_SYLLABLE_RUX  U"\ua3d5"
 #define UNICODE_YI_SYLLABLE_RU  0xa3d6
-#define UNITEXT_YI_SYLLABLE_RU  L"\ua3d6"
+#define UNITEXT_YI_SYLLABLE_RU  U"\ua3d6"
 #define UNICODE_YI_SYLLABLE_RUP  0xa3d7
-#define UNITEXT_YI_SYLLABLE_RUP  L"\ua3d7"
+#define UNITEXT_YI_SYLLABLE_RUP  U"\ua3d7"
 #define UNICODE_YI_SYLLABLE_RURX  0xa3d8
-#define UNITEXT_YI_SYLLABLE_RURX  L"\ua3d8"
+#define UNITEXT_YI_SYLLABLE_RURX  U"\ua3d8"
 #define UNICODE_YI_SYLLABLE_RUR  0xa3d9
-#define UNITEXT_YI_SYLLABLE_RUR  L"\ua3d9"
+#define UNITEXT_YI_SYLLABLE_RUR  U"\ua3d9"
 #define UNICODE_YI_SYLLABLE_RYT  0xa3da
-#define UNITEXT_YI_SYLLABLE_RYT  L"\ua3da"
+#define UNITEXT_YI_SYLLABLE_RYT  U"\ua3da"
 #define UNICODE_YI_SYLLABLE_RYX  0xa3db
-#define UNITEXT_YI_SYLLABLE_RYX  L"\ua3db"
+#define UNITEXT_YI_SYLLABLE_RYX  U"\ua3db"
 #define UNICODE_YI_SYLLABLE_RY  0xa3dc
-#define UNITEXT_YI_SYLLABLE_RY  L"\ua3dc"
+#define UNITEXT_YI_SYLLABLE_RY  U"\ua3dc"
 #define UNICODE_YI_SYLLABLE_RYP  0xa3dd
-#define UNITEXT_YI_SYLLABLE_RYP  L"\ua3dd"
+#define UNITEXT_YI_SYLLABLE_RYP  U"\ua3dd"
 #define UNICODE_YI_SYLLABLE_RYRX  0xa3de
-#define UNITEXT_YI_SYLLABLE_RYRX  L"\ua3de"
+#define UNITEXT_YI_SYLLABLE_RYRX  U"\ua3de"
 #define UNICODE_YI_SYLLABLE_RYR  0xa3df
-#define UNITEXT_YI_SYLLABLE_RYR  L"\ua3df"
+#define UNITEXT_YI_SYLLABLE_RYR  U"\ua3df"
 #define UNICODE_YI_SYLLABLE_JIT  0xa3e0
-#define UNITEXT_YI_SYLLABLE_JIT  L"\ua3e0"
+#define UNITEXT_YI_SYLLABLE_JIT  U"\ua3e0"
 #define UNICODE_YI_SYLLABLE_JIX  0xa3e1
-#define UNITEXT_YI_SYLLABLE_JIX  L"\ua3e1"
+#define UNITEXT_YI_SYLLABLE_JIX  U"\ua3e1"
 #define UNICODE_YI_SYLLABLE_JI  0xa3e2
-#define UNITEXT_YI_SYLLABLE_JI  L"\ua3e2"
+#define UNITEXT_YI_SYLLABLE_JI  U"\ua3e2"
 #define UNICODE_YI_SYLLABLE_JIP  0xa3e3
-#define UNITEXT_YI_SYLLABLE_JIP  L"\ua3e3"
+#define UNITEXT_YI_SYLLABLE_JIP  U"\ua3e3"
 #define UNICODE_YI_SYLLABLE_JIET  0xa3e4
-#define UNITEXT_YI_SYLLABLE_JIET  L"\ua3e4"
+#define UNITEXT_YI_SYLLABLE_JIET  U"\ua3e4"
 #define UNICODE_YI_SYLLABLE_JIEX  0xa3e5
-#define UNITEXT_YI_SYLLABLE_JIEX  L"\ua3e5"
+#define UNITEXT_YI_SYLLABLE_JIEX  U"\ua3e5"
 #define UNICODE_YI_SYLLABLE_JIE  0xa3e6
-#define UNITEXT_YI_SYLLABLE_JIE  L"\ua3e6"
+#define UNITEXT_YI_SYLLABLE_JIE  U"\ua3e6"
 #define UNICODE_YI_SYLLABLE_JIEP  0xa3e7
-#define UNITEXT_YI_SYLLABLE_JIEP  L"\ua3e7"
+#define UNITEXT_YI_SYLLABLE_JIEP  U"\ua3e7"
 #define UNICODE_YI_SYLLABLE_JUOT  0xa3e8
-#define UNITEXT_YI_SYLLABLE_JUOT  L"\ua3e8"
+#define UNITEXT_YI_SYLLABLE_JUOT  U"\ua3e8"
 #define UNICODE_YI_SYLLABLE_JUOX  0xa3e9
-#define UNITEXT_YI_SYLLABLE_JUOX  L"\ua3e9"
+#define UNITEXT_YI_SYLLABLE_JUOX  U"\ua3e9"
 #define UNICODE_YI_SYLLABLE_JUO  0xa3ea
-#define UNITEXT_YI_SYLLABLE_JUO  L"\ua3ea"
+#define UNITEXT_YI_SYLLABLE_JUO  U"\ua3ea"
 #define UNICODE_YI_SYLLABLE_JUOP  0xa3eb
-#define UNITEXT_YI_SYLLABLE_JUOP  L"\ua3eb"
+#define UNITEXT_YI_SYLLABLE_JUOP  U"\ua3eb"
 #define UNICODE_YI_SYLLABLE_JOT  0xa3ec
-#define UNITEXT_YI_SYLLABLE_JOT  L"\ua3ec"
+#define UNITEXT_YI_SYLLABLE_JOT  U"\ua3ec"
 #define UNICODE_YI_SYLLABLE_JOX  0xa3ed
-#define UNITEXT_YI_SYLLABLE_JOX  L"\ua3ed"
+#define UNITEXT_YI_SYLLABLE_JOX  U"\ua3ed"
 #define UNICODE_YI_SYLLABLE_JO  0xa3ee
-#define UNITEXT_YI_SYLLABLE_JO  L"\ua3ee"
+#define UNITEXT_YI_SYLLABLE_JO  U"\ua3ee"
 #define UNICODE_YI_SYLLABLE_JOP  0xa3ef
-#define UNITEXT_YI_SYLLABLE_JOP  L"\ua3ef"
+#define UNITEXT_YI_SYLLABLE_JOP  U"\ua3ef"
 #define UNICODE_YI_SYLLABLE_JUT  0xa3f0
-#define UNITEXT_YI_SYLLABLE_JUT  L"\ua3f0"
+#define UNITEXT_YI_SYLLABLE_JUT  U"\ua3f0"
 #define UNICODE_YI_SYLLABLE_JUX  0xa3f1
-#define UNITEXT_YI_SYLLABLE_JUX  L"\ua3f1"
+#define UNITEXT_YI_SYLLABLE_JUX  U"\ua3f1"
 #define UNICODE_YI_SYLLABLE_JU  0xa3f2
-#define UNITEXT_YI_SYLLABLE_JU  L"\ua3f2"
+#define UNITEXT_YI_SYLLABLE_JU  U"\ua3f2"
 #define UNICODE_YI_SYLLABLE_JUP  0xa3f3
-#define UNITEXT_YI_SYLLABLE_JUP  L"\ua3f3"
+#define UNITEXT_YI_SYLLABLE_JUP  U"\ua3f3"
 #define UNICODE_YI_SYLLABLE_JURX  0xa3f4
-#define UNITEXT_YI_SYLLABLE_JURX  L"\ua3f4"
+#define UNITEXT_YI_SYLLABLE_JURX  U"\ua3f4"
 #define UNICODE_YI_SYLLABLE_JUR  0xa3f5
-#define UNITEXT_YI_SYLLABLE_JUR  L"\ua3f5"
+#define UNITEXT_YI_SYLLABLE_JUR  U"\ua3f5"
 #define UNICODE_YI_SYLLABLE_JYT  0xa3f6
-#define UNITEXT_YI_SYLLABLE_JYT  L"\ua3f6"
+#define UNITEXT_YI_SYLLABLE_JYT  U"\ua3f6"
 #define UNICODE_YI_SYLLABLE_JYX  0xa3f7
-#define UNITEXT_YI_SYLLABLE_JYX  L"\ua3f7"
+#define UNITEXT_YI_SYLLABLE_JYX  U"\ua3f7"
 #define UNICODE_YI_SYLLABLE_JY  0xa3f8
-#define UNITEXT_YI_SYLLABLE_JY  L"\ua3f8"
+#define UNITEXT_YI_SYLLABLE_JY  U"\ua3f8"
 #define UNICODE_YI_SYLLABLE_JYP  0xa3f9
-#define UNITEXT_YI_SYLLABLE_JYP  L"\ua3f9"
+#define UNITEXT_YI_SYLLABLE_JYP  U"\ua3f9"
 #define UNICODE_YI_SYLLABLE_JYRX  0xa3fa
-#define UNITEXT_YI_SYLLABLE_JYRX  L"\ua3fa"
+#define UNITEXT_YI_SYLLABLE_JYRX  U"\ua3fa"
 #define UNICODE_YI_SYLLABLE_JYR  0xa3fb
-#define UNITEXT_YI_SYLLABLE_JYR  L"\ua3fb"
+#define UNITEXT_YI_SYLLABLE_JYR  U"\ua3fb"
 #define UNICODE_YI_SYLLABLE_QIT  0xa3fc
-#define UNITEXT_YI_SYLLABLE_QIT  L"\ua3fc"
+#define UNITEXT_YI_SYLLABLE_QIT  U"\ua3fc"
 #define UNICODE_YI_SYLLABLE_QIX  0xa3fd
-#define UNITEXT_YI_SYLLABLE_QIX  L"\ua3fd"
+#define UNITEXT_YI_SYLLABLE_QIX  U"\ua3fd"
 #define UNICODE_YI_SYLLABLE_QI  0xa3fe
-#define UNITEXT_YI_SYLLABLE_QI  L"\ua3fe"
+#define UNITEXT_YI_SYLLABLE_QI  U"\ua3fe"
 #define UNICODE_YI_SYLLABLE_QIP  0xa3ff
-#define UNITEXT_YI_SYLLABLE_QIP  L"\ua3ff"
+#define UNITEXT_YI_SYLLABLE_QIP  U"\ua3ff"
 #define UNICODE_YI_SYLLABLE_QIET  0xa400
-#define UNITEXT_YI_SYLLABLE_QIET  L"\ua400"
+#define UNITEXT_YI_SYLLABLE_QIET  U"\ua400"
 #define UNICODE_YI_SYLLABLE_QIEX  0xa401
-#define UNITEXT_YI_SYLLABLE_QIEX  L"\ua401"
+#define UNITEXT_YI_SYLLABLE_QIEX  U"\ua401"
 #define UNICODE_YI_SYLLABLE_QIE  0xa402
-#define UNITEXT_YI_SYLLABLE_QIE  L"\ua402"
+#define UNITEXT_YI_SYLLABLE_QIE  U"\ua402"
 #define UNICODE_YI_SYLLABLE_QIEP  0xa403
-#define UNITEXT_YI_SYLLABLE_QIEP  L"\ua403"
+#define UNITEXT_YI_SYLLABLE_QIEP  U"\ua403"
 #define UNICODE_YI_SYLLABLE_QUOT  0xa404
-#define UNITEXT_YI_SYLLABLE_QUOT  L"\ua404"
+#define UNITEXT_YI_SYLLABLE_QUOT  U"\ua404"
 #define UNICODE_YI_SYLLABLE_QUOX  0xa405
-#define UNITEXT_YI_SYLLABLE_QUOX  L"\ua405"
+#define UNITEXT_YI_SYLLABLE_QUOX  U"\ua405"
 #define UNICODE_YI_SYLLABLE_QUO  0xa406
-#define UNITEXT_YI_SYLLABLE_QUO  L"\ua406"
+#define UNITEXT_YI_SYLLABLE_QUO  U"\ua406"
 #define UNICODE_YI_SYLLABLE_QUOP  0xa407
-#define UNITEXT_YI_SYLLABLE_QUOP  L"\ua407"
+#define UNITEXT_YI_SYLLABLE_QUOP  U"\ua407"
 #define UNICODE_YI_SYLLABLE_QOT  0xa408
-#define UNITEXT_YI_SYLLABLE_QOT  L"\ua408"
+#define UNITEXT_YI_SYLLABLE_QOT  U"\ua408"
 #define UNICODE_YI_SYLLABLE_QOX  0xa409
-#define UNITEXT_YI_SYLLABLE_QOX  L"\ua409"
+#define UNITEXT_YI_SYLLABLE_QOX  U"\ua409"
 #define UNICODE_YI_SYLLABLE_QO  0xa40a
-#define UNITEXT_YI_SYLLABLE_QO  L"\ua40a"
+#define UNITEXT_YI_SYLLABLE_QO  U"\ua40a"
 #define UNICODE_YI_SYLLABLE_QOP  0xa40b
-#define UNITEXT_YI_SYLLABLE_QOP  L"\ua40b"
+#define UNITEXT_YI_SYLLABLE_QOP  U"\ua40b"
 #define UNICODE_YI_SYLLABLE_QUT  0xa40c
-#define UNITEXT_YI_SYLLABLE_QUT  L"\ua40c"
+#define UNITEXT_YI_SYLLABLE_QUT  U"\ua40c"
 #define UNICODE_YI_SYLLABLE_QUX  0xa40d
-#define UNITEXT_YI_SYLLABLE_QUX  L"\ua40d"
+#define UNITEXT_YI_SYLLABLE_QUX  U"\ua40d"
 #define UNICODE_YI_SYLLABLE_QU  0xa40e
-#define UNITEXT_YI_SYLLABLE_QU  L"\ua40e"
+#define UNITEXT_YI_SYLLABLE_QU  U"\ua40e"
 #define UNICODE_YI_SYLLABLE_QUP  0xa40f
-#define UNITEXT_YI_SYLLABLE_QUP  L"\ua40f"
+#define UNITEXT_YI_SYLLABLE_QUP  U"\ua40f"
 #define UNICODE_YI_SYLLABLE_QURX  0xa410
-#define UNITEXT_YI_SYLLABLE_QURX  L"\ua410"
+#define UNITEXT_YI_SYLLABLE_QURX  U"\ua410"
 #define UNICODE_YI_SYLLABLE_QUR  0xa411
-#define UNITEXT_YI_SYLLABLE_QUR  L"\ua411"
+#define UNITEXT_YI_SYLLABLE_QUR  U"\ua411"
 #define UNICODE_YI_SYLLABLE_QYT  0xa412
-#define UNITEXT_YI_SYLLABLE_QYT  L"\ua412"
+#define UNITEXT_YI_SYLLABLE_QYT  U"\ua412"
 #define UNICODE_YI_SYLLABLE_QYX  0xa413
-#define UNITEXT_YI_SYLLABLE_QYX  L"\ua413"
+#define UNITEXT_YI_SYLLABLE_QYX  U"\ua413"
 #define UNICODE_YI_SYLLABLE_QY  0xa414
-#define UNITEXT_YI_SYLLABLE_QY  L"\ua414"
+#define UNITEXT_YI_SYLLABLE_QY  U"\ua414"
 #define UNICODE_YI_SYLLABLE_QYP  0xa415
-#define UNITEXT_YI_SYLLABLE_QYP  L"\ua415"
+#define UNITEXT_YI_SYLLABLE_QYP  U"\ua415"
 #define UNICODE_YI_SYLLABLE_QYRX  0xa416
-#define UNITEXT_YI_SYLLABLE_QYRX  L"\ua416"
+#define UNITEXT_YI_SYLLABLE_QYRX  U"\ua416"
 #define UNICODE_YI_SYLLABLE_QYR  0xa417
-#define UNITEXT_YI_SYLLABLE_QYR  L"\ua417"
+#define UNITEXT_YI_SYLLABLE_QYR  U"\ua417"
 #define UNICODE_YI_SYLLABLE_JJIT  0xa418
-#define UNITEXT_YI_SYLLABLE_JJIT  L"\ua418"
+#define UNITEXT_YI_SYLLABLE_JJIT  U"\ua418"
 #define UNICODE_YI_SYLLABLE_JJIX  0xa419
-#define UNITEXT_YI_SYLLABLE_JJIX  L"\ua419"
+#define UNITEXT_YI_SYLLABLE_JJIX  U"\ua419"
 #define UNICODE_YI_SYLLABLE_JJI  0xa41a
-#define UNITEXT_YI_SYLLABLE_JJI  L"\ua41a"
+#define UNITEXT_YI_SYLLABLE_JJI  U"\ua41a"
 #define UNICODE_YI_SYLLABLE_JJIP  0xa41b
-#define UNITEXT_YI_SYLLABLE_JJIP  L"\ua41b"
+#define UNITEXT_YI_SYLLABLE_JJIP  U"\ua41b"
 #define UNICODE_YI_SYLLABLE_JJIET  0xa41c
-#define UNITEXT_YI_SYLLABLE_JJIET  L"\ua41c"
+#define UNITEXT_YI_SYLLABLE_JJIET  U"\ua41c"
 #define UNICODE_YI_SYLLABLE_JJIEX  0xa41d
-#define UNITEXT_YI_SYLLABLE_JJIEX  L"\ua41d"
+#define UNITEXT_YI_SYLLABLE_JJIEX  U"\ua41d"
 #define UNICODE_YI_SYLLABLE_JJIE  0xa41e
-#define UNITEXT_YI_SYLLABLE_JJIE  L"\ua41e"
+#define UNITEXT_YI_SYLLABLE_JJIE  U"\ua41e"
 #define UNICODE_YI_SYLLABLE_JJIEP  0xa41f
-#define UNITEXT_YI_SYLLABLE_JJIEP  L"\ua41f"
+#define UNITEXT_YI_SYLLABLE_JJIEP  U"\ua41f"
 #define UNICODE_YI_SYLLABLE_JJUOX  0xa420
-#define UNITEXT_YI_SYLLABLE_JJUOX  L"\ua420"
+#define UNITEXT_YI_SYLLABLE_JJUOX  U"\ua420"
 #define UNICODE_YI_SYLLABLE_JJUO  0xa421
-#define UNITEXT_YI_SYLLABLE_JJUO  L"\ua421"
+#define UNITEXT_YI_SYLLABLE_JJUO  U"\ua421"
 #define UNICODE_YI_SYLLABLE_JJUOP  0xa422
-#define UNITEXT_YI_SYLLABLE_JJUOP  L"\ua422"
+#define UNITEXT_YI_SYLLABLE_JJUOP  U"\ua422"
 #define UNICODE_YI_SYLLABLE_JJOT  0xa423
-#define UNITEXT_YI_SYLLABLE_JJOT  L"\ua423"
+#define UNITEXT_YI_SYLLABLE_JJOT  U"\ua423"
 #define UNICODE_YI_SYLLABLE_JJOX  0xa424
-#define UNITEXT_YI_SYLLABLE_JJOX  L"\ua424"
+#define UNITEXT_YI_SYLLABLE_JJOX  U"\ua424"
 #define UNICODE_YI_SYLLABLE_JJO  0xa425
-#define UNITEXT_YI_SYLLABLE_JJO  L"\ua425"
+#define UNITEXT_YI_SYLLABLE_JJO  U"\ua425"
 #define UNICODE_YI_SYLLABLE_JJOP  0xa426
-#define UNITEXT_YI_SYLLABLE_JJOP  L"\ua426"
+#define UNITEXT_YI_SYLLABLE_JJOP  U"\ua426"
 #define UNICODE_YI_SYLLABLE_JJUT  0xa427
-#define UNITEXT_YI_SYLLABLE_JJUT  L"\ua427"
+#define UNITEXT_YI_SYLLABLE_JJUT  U"\ua427"
 #define UNICODE_YI_SYLLABLE_JJUX  0xa428
-#define UNITEXT_YI_SYLLABLE_JJUX  L"\ua428"
+#define UNITEXT_YI_SYLLABLE_JJUX  U"\ua428"
 #define UNICODE_YI_SYLLABLE_JJU  0xa429
-#define UNITEXT_YI_SYLLABLE_JJU  L"\ua429"
+#define UNITEXT_YI_SYLLABLE_JJU  U"\ua429"
 #define UNICODE_YI_SYLLABLE_JJUP  0xa42a
-#define UNITEXT_YI_SYLLABLE_JJUP  L"\ua42a"
+#define UNITEXT_YI_SYLLABLE_JJUP  U"\ua42a"
 #define UNICODE_YI_SYLLABLE_JJURX  0xa42b
-#define UNITEXT_YI_SYLLABLE_JJURX  L"\ua42b"
+#define UNITEXT_YI_SYLLABLE_JJURX  U"\ua42b"
 #define UNICODE_YI_SYLLABLE_JJUR  0xa42c
-#define UNITEXT_YI_SYLLABLE_JJUR  L"\ua42c"
+#define UNITEXT_YI_SYLLABLE_JJUR  U"\ua42c"
 #define UNICODE_YI_SYLLABLE_JJYT  0xa42d
-#define UNITEXT_YI_SYLLABLE_JJYT  L"\ua42d"
+#define UNITEXT_YI_SYLLABLE_JJYT  U"\ua42d"
 #define UNICODE_YI_SYLLABLE_JJYX  0xa42e
-#define UNITEXT_YI_SYLLABLE_JJYX  L"\ua42e"
+#define UNITEXT_YI_SYLLABLE_JJYX  U"\ua42e"
 #define UNICODE_YI_SYLLABLE_JJY  0xa42f
-#define UNITEXT_YI_SYLLABLE_JJY  L"\ua42f"
+#define UNITEXT_YI_SYLLABLE_JJY  U"\ua42f"
 #define UNICODE_YI_SYLLABLE_JJYP  0xa430
-#define UNITEXT_YI_SYLLABLE_JJYP  L"\ua430"
+#define UNITEXT_YI_SYLLABLE_JJYP  U"\ua430"
 #define UNICODE_YI_SYLLABLE_NJIT  0xa431
-#define UNITEXT_YI_SYLLABLE_NJIT  L"\ua431"
+#define UNITEXT_YI_SYLLABLE_NJIT  U"\ua431"
 #define UNICODE_YI_SYLLABLE_NJIX  0xa432
-#define UNITEXT_YI_SYLLABLE_NJIX  L"\ua432"
+#define UNITEXT_YI_SYLLABLE_NJIX  U"\ua432"
 #define UNICODE_YI_SYLLABLE_NJI  0xa433
-#define UNITEXT_YI_SYLLABLE_NJI  L"\ua433"
+#define UNITEXT_YI_SYLLABLE_NJI  U"\ua433"
 #define UNICODE_YI_SYLLABLE_NJIP  0xa434
-#define UNITEXT_YI_SYLLABLE_NJIP  L"\ua434"
+#define UNITEXT_YI_SYLLABLE_NJIP  U"\ua434"
 #define UNICODE_YI_SYLLABLE_NJIET  0xa435
-#define UNITEXT_YI_SYLLABLE_NJIET  L"\ua435"
+#define UNITEXT_YI_SYLLABLE_NJIET  U"\ua435"
 #define UNICODE_YI_SYLLABLE_NJIEX  0xa436
-#define UNITEXT_YI_SYLLABLE_NJIEX  L"\ua436"
+#define UNITEXT_YI_SYLLABLE_NJIEX  U"\ua436"
 #define UNICODE_YI_SYLLABLE_NJIE  0xa437
-#define UNITEXT_YI_SYLLABLE_NJIE  L"\ua437"
+#define UNITEXT_YI_SYLLABLE_NJIE  U"\ua437"
 #define UNICODE_YI_SYLLABLE_NJIEP  0xa438
-#define UNITEXT_YI_SYLLABLE_NJIEP  L"\ua438"
+#define UNITEXT_YI_SYLLABLE_NJIEP  U"\ua438"
 #define UNICODE_YI_SYLLABLE_NJUOX  0xa439
-#define UNITEXT_YI_SYLLABLE_NJUOX  L"\ua439"
+#define UNITEXT_YI_SYLLABLE_NJUOX  U"\ua439"
 #define UNICODE_YI_SYLLABLE_NJUO  0xa43a
-#define UNITEXT_YI_SYLLABLE_NJUO  L"\ua43a"
+#define UNITEXT_YI_SYLLABLE_NJUO  U"\ua43a"
 #define UNICODE_YI_SYLLABLE_NJOT  0xa43b
-#define UNITEXT_YI_SYLLABLE_NJOT  L"\ua43b"
+#define UNITEXT_YI_SYLLABLE_NJOT  U"\ua43b"
 #define UNICODE_YI_SYLLABLE_NJOX  0xa43c
-#define UNITEXT_YI_SYLLABLE_NJOX  L"\ua43c"
+#define UNITEXT_YI_SYLLABLE_NJOX  U"\ua43c"
 #define UNICODE_YI_SYLLABLE_NJO  0xa43d
-#define UNITEXT_YI_SYLLABLE_NJO  L"\ua43d"
+#define UNITEXT_YI_SYLLABLE_NJO  U"\ua43d"
 #define UNICODE_YI_SYLLABLE_NJOP  0xa43e
-#define UNITEXT_YI_SYLLABLE_NJOP  L"\ua43e"
+#define UNITEXT_YI_SYLLABLE_NJOP  U"\ua43e"
 #define UNICODE_YI_SYLLABLE_NJUX  0xa43f
-#define UNITEXT_YI_SYLLABLE_NJUX  L"\ua43f"
+#define UNITEXT_YI_SYLLABLE_NJUX  U"\ua43f"
 #define UNICODE_YI_SYLLABLE_NJU  0xa440
-#define UNITEXT_YI_SYLLABLE_NJU  L"\ua440"
+#define UNITEXT_YI_SYLLABLE_NJU  U"\ua440"
 #define UNICODE_YI_SYLLABLE_NJUP  0xa441
-#define UNITEXT_YI_SYLLABLE_NJUP  L"\ua441"
+#define UNITEXT_YI_SYLLABLE_NJUP  U"\ua441"
 #define UNICODE_YI_SYLLABLE_NJURX  0xa442
-#define UNITEXT_YI_SYLLABLE_NJURX  L"\ua442"
+#define UNITEXT_YI_SYLLABLE_NJURX  U"\ua442"
 #define UNICODE_YI_SYLLABLE_NJUR  0xa443
-#define UNITEXT_YI_SYLLABLE_NJUR  L"\ua443"
+#define UNITEXT_YI_SYLLABLE_NJUR  U"\ua443"
 #define UNICODE_YI_SYLLABLE_NJYT  0xa444
-#define UNITEXT_YI_SYLLABLE_NJYT  L"\ua444"
+#define UNITEXT_YI_SYLLABLE_NJYT  U"\ua444"
 #define UNICODE_YI_SYLLABLE_NJYX  0xa445
-#define UNITEXT_YI_SYLLABLE_NJYX  L"\ua445"
+#define UNITEXT_YI_SYLLABLE_NJYX  U"\ua445"
 #define UNICODE_YI_SYLLABLE_NJY  0xa446
-#define UNITEXT_YI_SYLLABLE_NJY  L"\ua446"
+#define UNITEXT_YI_SYLLABLE_NJY  U"\ua446"
 #define UNICODE_YI_SYLLABLE_NJYP  0xa447
-#define UNITEXT_YI_SYLLABLE_NJYP  L"\ua447"
+#define UNITEXT_YI_SYLLABLE_NJYP  U"\ua447"
 #define UNICODE_YI_SYLLABLE_NJYRX  0xa448
-#define UNITEXT_YI_SYLLABLE_NJYRX  L"\ua448"
+#define UNITEXT_YI_SYLLABLE_NJYRX  U"\ua448"
 #define UNICODE_YI_SYLLABLE_NJYR  0xa449
-#define UNITEXT_YI_SYLLABLE_NJYR  L"\ua449"
+#define UNITEXT_YI_SYLLABLE_NJYR  U"\ua449"
 #define UNICODE_YI_SYLLABLE_NYIT  0xa44a
-#define UNITEXT_YI_SYLLABLE_NYIT  L"\ua44a"
+#define UNITEXT_YI_SYLLABLE_NYIT  U"\ua44a"
 #define UNICODE_YI_SYLLABLE_NYIX  0xa44b
-#define UNITEXT_YI_SYLLABLE_NYIX  L"\ua44b"
+#define UNITEXT_YI_SYLLABLE_NYIX  U"\ua44b"
 #define UNICODE_YI_SYLLABLE_NYI  0xa44c
-#define UNITEXT_YI_SYLLABLE_NYI  L"\ua44c"
+#define UNITEXT_YI_SYLLABLE_NYI  U"\ua44c"
 #define UNICODE_YI_SYLLABLE_NYIP  0xa44d
-#define UNITEXT_YI_SYLLABLE_NYIP  L"\ua44d"
+#define UNITEXT_YI_SYLLABLE_NYIP  U"\ua44d"
 #define UNICODE_YI_SYLLABLE_NYIET  0xa44e
-#define UNITEXT_YI_SYLLABLE_NYIET  L"\ua44e"
+#define UNITEXT_YI_SYLLABLE_NYIET  U"\ua44e"
 #define UNICODE_YI_SYLLABLE_NYIEX  0xa44f
-#define UNITEXT_YI_SYLLABLE_NYIEX  L"\ua44f"
+#define UNITEXT_YI_SYLLABLE_NYIEX  U"\ua44f"
 #define UNICODE_YI_SYLLABLE_NYIE  0xa450
-#define UNITEXT_YI_SYLLABLE_NYIE  L"\ua450"
+#define UNITEXT_YI_SYLLABLE_NYIE  U"\ua450"
 #define UNICODE_YI_SYLLABLE_NYIEP  0xa451
-#define UNITEXT_YI_SYLLABLE_NYIEP  L"\ua451"
+#define UNITEXT_YI_SYLLABLE_NYIEP  U"\ua451"
 #define UNICODE_YI_SYLLABLE_NYUOX  0xa452
-#define UNITEXT_YI_SYLLABLE_NYUOX  L"\ua452"
+#define UNITEXT_YI_SYLLABLE_NYUOX  U"\ua452"
 #define UNICODE_YI_SYLLABLE_NYUO  0xa453
-#define UNITEXT_YI_SYLLABLE_NYUO  L"\ua453"
+#define UNITEXT_YI_SYLLABLE_NYUO  U"\ua453"
 #define UNICODE_YI_SYLLABLE_NYUOP  0xa454
-#define UNITEXT_YI_SYLLABLE_NYUOP  L"\ua454"
+#define UNITEXT_YI_SYLLABLE_NYUOP  U"\ua454"
 #define UNICODE_YI_SYLLABLE_NYOT  0xa455
-#define UNITEXT_YI_SYLLABLE_NYOT  L"\ua455"
+#define UNITEXT_YI_SYLLABLE_NYOT  U"\ua455"
 #define UNICODE_YI_SYLLABLE_NYOX  0xa456
-#define UNITEXT_YI_SYLLABLE_NYOX  L"\ua456"
+#define UNITEXT_YI_SYLLABLE_NYOX  U"\ua456"
 #define UNICODE_YI_SYLLABLE_NYO  0xa457
-#define UNITEXT_YI_SYLLABLE_NYO  L"\ua457"
+#define UNITEXT_YI_SYLLABLE_NYO  U"\ua457"
 #define UNICODE_YI_SYLLABLE_NYOP  0xa458
-#define UNITEXT_YI_SYLLABLE_NYOP  L"\ua458"
+#define UNITEXT_YI_SYLLABLE_NYOP  U"\ua458"
 #define UNICODE_YI_SYLLABLE_NYUT  0xa459
-#define UNITEXT_YI_SYLLABLE_NYUT  L"\ua459"
+#define UNITEXT_YI_SYLLABLE_NYUT  U"\ua459"
 #define UNICODE_YI_SYLLABLE_NYUX  0xa45a
-#define UNITEXT_YI_SYLLABLE_NYUX  L"\ua45a"
+#define UNITEXT_YI_SYLLABLE_NYUX  U"\ua45a"
 #define UNICODE_YI_SYLLABLE_NYU  0xa45b
-#define UNITEXT_YI_SYLLABLE_NYU  L"\ua45b"
+#define UNITEXT_YI_SYLLABLE_NYU  U"\ua45b"
 #define UNICODE_YI_SYLLABLE_NYUP  0xa45c
-#define UNITEXT_YI_SYLLABLE_NYUP  L"\ua45c"
+#define UNITEXT_YI_SYLLABLE_NYUP  U"\ua45c"
 #define UNICODE_YI_SYLLABLE_XIT  0xa45d
-#define UNITEXT_YI_SYLLABLE_XIT  L"\ua45d"
+#define UNITEXT_YI_SYLLABLE_XIT  U"\ua45d"
 #define UNICODE_YI_SYLLABLE_XIX  0xa45e
-#define UNITEXT_YI_SYLLABLE_XIX  L"\ua45e"
+#define UNITEXT_YI_SYLLABLE_XIX  U"\ua45e"
 #define UNICODE_YI_SYLLABLE_XI  0xa45f
-#define UNITEXT_YI_SYLLABLE_XI  L"\ua45f"
+#define UNITEXT_YI_SYLLABLE_XI  U"\ua45f"
 #define UNICODE_YI_SYLLABLE_XIP  0xa460
-#define UNITEXT_YI_SYLLABLE_XIP  L"\ua460"
+#define UNITEXT_YI_SYLLABLE_XIP  U"\ua460"
 #define UNICODE_YI_SYLLABLE_XIET  0xa461
-#define UNITEXT_YI_SYLLABLE_XIET  L"\ua461"
+#define UNITEXT_YI_SYLLABLE_XIET  U"\ua461"
 #define UNICODE_YI_SYLLABLE_XIEX  0xa462
-#define UNITEXT_YI_SYLLABLE_XIEX  L"\ua462"
+#define UNITEXT_YI_SYLLABLE_XIEX  U"\ua462"
 #define UNICODE_YI_SYLLABLE_XIE  0xa463
-#define UNITEXT_YI_SYLLABLE_XIE  L"\ua463"
+#define UNITEXT_YI_SYLLABLE_XIE  U"\ua463"
 #define UNICODE_YI_SYLLABLE_XIEP  0xa464
-#define UNITEXT_YI_SYLLABLE_XIEP  L"\ua464"
+#define UNITEXT_YI_SYLLABLE_XIEP  U"\ua464"
 #define UNICODE_YI_SYLLABLE_XUOX  0xa465
-#define UNITEXT_YI_SYLLABLE_XUOX  L"\ua465"
+#define UNITEXT_YI_SYLLABLE_XUOX  U"\ua465"
 #define UNICODE_YI_SYLLABLE_XUO  0xa466
-#define UNITEXT_YI_SYLLABLE_XUO  L"\ua466"
+#define UNITEXT_YI_SYLLABLE_XUO  U"\ua466"
 #define UNICODE_YI_SYLLABLE_XOT  0xa467
-#define UNITEXT_YI_SYLLABLE_XOT  L"\ua467"
+#define UNITEXT_YI_SYLLABLE_XOT  U"\ua467"
 #define UNICODE_YI_SYLLABLE_XOX  0xa468
-#define UNITEXT_YI_SYLLABLE_XOX  L"\ua468"
+#define UNITEXT_YI_SYLLABLE_XOX  U"\ua468"
 #define UNICODE_YI_SYLLABLE_XO  0xa469
-#define UNITEXT_YI_SYLLABLE_XO  L"\ua469"
+#define UNITEXT_YI_SYLLABLE_XO  U"\ua469"
 #define UNICODE_YI_SYLLABLE_XOP  0xa46a
-#define UNITEXT_YI_SYLLABLE_XOP  L"\ua46a"
+#define UNITEXT_YI_SYLLABLE_XOP  U"\ua46a"
 #define UNICODE_YI_SYLLABLE_XYT  0xa46b
-#define UNITEXT_YI_SYLLABLE_XYT  L"\ua46b"
+#define UNITEXT_YI_SYLLABLE_XYT  U"\ua46b"
 #define UNICODE_YI_SYLLABLE_XYX  0xa46c
-#define UNITEXT_YI_SYLLABLE_XYX  L"\ua46c"
+#define UNITEXT_YI_SYLLABLE_XYX  U"\ua46c"
 #define UNICODE_YI_SYLLABLE_XY  0xa46d
-#define UNITEXT_YI_SYLLABLE_XY  L"\ua46d"
+#define UNITEXT_YI_SYLLABLE_XY  U"\ua46d"
 #define UNICODE_YI_SYLLABLE_XYP  0xa46e
-#define UNITEXT_YI_SYLLABLE_XYP  L"\ua46e"
+#define UNITEXT_YI_SYLLABLE_XYP  U"\ua46e"
 #define UNICODE_YI_SYLLABLE_XYRX  0xa46f
-#define UNITEXT_YI_SYLLABLE_XYRX  L"\ua46f"
+#define UNITEXT_YI_SYLLABLE_XYRX  U"\ua46f"
 #define UNICODE_YI_SYLLABLE_XYR  0xa470
-#define UNITEXT_YI_SYLLABLE_XYR  L"\ua470"
+#define UNITEXT_YI_SYLLABLE_XYR  U"\ua470"
 #define UNICODE_YI_SYLLABLE_YIT  0xa471
-#define UNITEXT_YI_SYLLABLE_YIT  L"\ua471"
+#define UNITEXT_YI_SYLLABLE_YIT  U"\ua471"
 #define UNICODE_YI_SYLLABLE_YIX  0xa472
-#define UNITEXT_YI_SYLLABLE_YIX  L"\ua472"
+#define UNITEXT_YI_SYLLABLE_YIX  U"\ua472"
 #define UNICODE_YI_SYLLABLE_YI  0xa473
-#define UNITEXT_YI_SYLLABLE_YI  L"\ua473"
+#define UNITEXT_YI_SYLLABLE_YI  U"\ua473"
 #define UNICODE_YI_SYLLABLE_YIP  0xa474
-#define UNITEXT_YI_SYLLABLE_YIP  L"\ua474"
+#define UNITEXT_YI_SYLLABLE_YIP  U"\ua474"
 #define UNICODE_YI_SYLLABLE_YIET  0xa475
-#define UNITEXT_YI_SYLLABLE_YIET  L"\ua475"
+#define UNITEXT_YI_SYLLABLE_YIET  U"\ua475"
 #define UNICODE_YI_SYLLABLE_YIEX  0xa476
-#define UNITEXT_YI_SYLLABLE_YIEX  L"\ua476"
+#define UNITEXT_YI_SYLLABLE_YIEX  U"\ua476"
 #define UNICODE_YI_SYLLABLE_YIE  0xa477
-#define UNITEXT_YI_SYLLABLE_YIE  L"\ua477"
+#define UNITEXT_YI_SYLLABLE_YIE  U"\ua477"
 #define UNICODE_YI_SYLLABLE_YIEP  0xa478
-#define UNITEXT_YI_SYLLABLE_YIEP  L"\ua478"
+#define UNITEXT_YI_SYLLABLE_YIEP  U"\ua478"
 #define UNICODE_YI_SYLLABLE_YUOT  0xa479
-#define UNITEXT_YI_SYLLABLE_YUOT  L"\ua479"
+#define UNITEXT_YI_SYLLABLE_YUOT  U"\ua479"
 #define UNICODE_YI_SYLLABLE_YUOX  0xa47a
-#define UNITEXT_YI_SYLLABLE_YUOX  L"\ua47a"
+#define UNITEXT_YI_SYLLABLE_YUOX  U"\ua47a"
 #define UNICODE_YI_SYLLABLE_YUO  0xa47b
-#define UNITEXT_YI_SYLLABLE_YUO  L"\ua47b"
+#define UNITEXT_YI_SYLLABLE_YUO  U"\ua47b"
 #define UNICODE_YI_SYLLABLE_YUOP  0xa47c
-#define UNITEXT_YI_SYLLABLE_YUOP  L"\ua47c"
+#define UNITEXT_YI_SYLLABLE_YUOP  U"\ua47c"
 #define UNICODE_YI_SYLLABLE_YOT  0xa47d
-#define UNITEXT_YI_SYLLABLE_YOT  L"\ua47d"
+#define UNITEXT_YI_SYLLABLE_YOT  U"\ua47d"
 #define UNICODE_YI_SYLLABLE_YOX  0xa47e
-#define UNITEXT_YI_SYLLABLE_YOX  L"\ua47e"
+#define UNITEXT_YI_SYLLABLE_YOX  U"\ua47e"
 #define UNICODE_YI_SYLLABLE_YO  0xa47f
-#define UNITEXT_YI_SYLLABLE_YO  L"\ua47f"
+#define UNITEXT_YI_SYLLABLE_YO  U"\ua47f"
 #define UNICODE_YI_SYLLABLE_YOP  0xa480
-#define UNITEXT_YI_SYLLABLE_YOP  L"\ua480"
+#define UNITEXT_YI_SYLLABLE_YOP  U"\ua480"
 #define UNICODE_YI_SYLLABLE_YUT  0xa481
-#define UNITEXT_YI_SYLLABLE_YUT  L"\ua481"
+#define UNITEXT_YI_SYLLABLE_YUT  U"\ua481"
 #define UNICODE_YI_SYLLABLE_YUX  0xa482
-#define UNITEXT_YI_SYLLABLE_YUX  L"\ua482"
+#define UNITEXT_YI_SYLLABLE_YUX  U"\ua482"
 #define UNICODE_YI_SYLLABLE_YU  0xa483
-#define UNITEXT_YI_SYLLABLE_YU  L"\ua483"
+#define UNITEXT_YI_SYLLABLE_YU  U"\ua483"
 #define UNICODE_YI_SYLLABLE_YUP  0xa484
-#define UNITEXT_YI_SYLLABLE_YUP  L"\ua484"
+#define UNITEXT_YI_SYLLABLE_YUP  U"\ua484"
 #define UNICODE_YI_SYLLABLE_YURX  0xa485
-#define UNITEXT_YI_SYLLABLE_YURX  L"\ua485"
+#define UNITEXT_YI_SYLLABLE_YURX  U"\ua485"
 #define UNICODE_YI_SYLLABLE_YUR  0xa486
-#define UNITEXT_YI_SYLLABLE_YUR  L"\ua486"
+#define UNITEXT_YI_SYLLABLE_YUR  U"\ua486"
 #define UNICODE_YI_SYLLABLE_YYT  0xa487
-#define UNITEXT_YI_SYLLABLE_YYT  L"\ua487"
+#define UNITEXT_YI_SYLLABLE_YYT  U"\ua487"
 #define UNICODE_YI_SYLLABLE_YYX  0xa488
-#define UNITEXT_YI_SYLLABLE_YYX  L"\ua488"
+#define UNITEXT_YI_SYLLABLE_YYX  U"\ua488"
 #define UNICODE_YI_SYLLABLE_YY  0xa489
-#define UNITEXT_YI_SYLLABLE_YY  L"\ua489"
+#define UNITEXT_YI_SYLLABLE_YY  U"\ua489"
 #define UNICODE_YI_SYLLABLE_YYP  0xa48a
-#define UNITEXT_YI_SYLLABLE_YYP  L"\ua48a"
+#define UNITEXT_YI_SYLLABLE_YYP  U"\ua48a"
 #define UNICODE_YI_SYLLABLE_YYRX  0xa48b
-#define UNITEXT_YI_SYLLABLE_YYRX  L"\ua48b"
+#define UNITEXT_YI_SYLLABLE_YYRX  U"\ua48b"
 #define UNICODE_YI_SYLLABLE_YYR  0xa48c
-#define UNITEXT_YI_SYLLABLE_YYR  L"\ua48c"
+#define UNITEXT_YI_SYLLABLE_YYR  U"\ua48c"
 #define UNICODE_YI_RADICAL_QOT  0xa490
-#define UNITEXT_YI_RADICAL_QOT  L"\ua490"
+#define UNITEXT_YI_RADICAL_QOT  U"\ua490"
 #define UNICODE_YI_RADICAL_LI  0xa491
-#define UNITEXT_YI_RADICAL_LI  L"\ua491"
+#define UNITEXT_YI_RADICAL_LI  U"\ua491"
 #define UNICODE_YI_RADICAL_KIT  0xa492
-#define UNITEXT_YI_RADICAL_KIT  L"\ua492"
+#define UNITEXT_YI_RADICAL_KIT  U"\ua492"
 #define UNICODE_YI_RADICAL_NYIP  0xa493
-#define UNITEXT_YI_RADICAL_NYIP  L"\ua493"
+#define UNITEXT_YI_RADICAL_NYIP  U"\ua493"
 #define UNICODE_YI_RADICAL_CYP  0xa494
-#define UNITEXT_YI_RADICAL_CYP  L"\ua494"
+#define UNITEXT_YI_RADICAL_CYP  U"\ua494"
 #define UNICODE_YI_RADICAL_SSI  0xa495
-#define UNITEXT_YI_RADICAL_SSI  L"\ua495"
+#define UNITEXT_YI_RADICAL_SSI  U"\ua495"
 #define UNICODE_YI_RADICAL_GGOP  0xa496
-#define UNITEXT_YI_RADICAL_GGOP  L"\ua496"
+#define UNITEXT_YI_RADICAL_GGOP  U"\ua496"
 #define UNICODE_YI_RADICAL_GEP  0xa497
-#define UNITEXT_YI_RADICAL_GEP  L"\ua497"
+#define UNITEXT_YI_RADICAL_GEP  U"\ua497"
 #define UNICODE_YI_RADICAL_MI  0xa498
-#define UNITEXT_YI_RADICAL_MI  L"\ua498"
+#define UNITEXT_YI_RADICAL_MI  U"\ua498"
 #define UNICODE_YI_RADICAL_HXIT  0xa499
-#define UNITEXT_YI_RADICAL_HXIT  L"\ua499"
+#define UNITEXT_YI_RADICAL_HXIT  U"\ua499"
 #define UNICODE_YI_RADICAL_LYR  0xa49a
-#define UNITEXT_YI_RADICAL_LYR  L"\ua49a"
+#define UNITEXT_YI_RADICAL_LYR  U"\ua49a"
 #define UNICODE_YI_RADICAL_BBUT  0xa49b
-#define UNITEXT_YI_RADICAL_BBUT  L"\ua49b"
+#define UNITEXT_YI_RADICAL_BBUT  U"\ua49b"
 #define UNICODE_YI_RADICAL_MOP  0xa49c
-#define UNITEXT_YI_RADICAL_MOP  L"\ua49c"
+#define UNITEXT_YI_RADICAL_MOP  U"\ua49c"
 #define UNICODE_YI_RADICAL_YO  0xa49d
-#define UNITEXT_YI_RADICAL_YO  L"\ua49d"
+#define UNITEXT_YI_RADICAL_YO  U"\ua49d"
 #define UNICODE_YI_RADICAL_PUT  0xa49e
-#define UNITEXT_YI_RADICAL_PUT  L"\ua49e"
+#define UNITEXT_YI_RADICAL_PUT  U"\ua49e"
 #define UNICODE_YI_RADICAL_HXUO  0xa49f
-#define UNITEXT_YI_RADICAL_HXUO  L"\ua49f"
+#define UNITEXT_YI_RADICAL_HXUO  U"\ua49f"
 #define UNICODE_YI_RADICAL_TAT  0xa4a0
-#define UNITEXT_YI_RADICAL_TAT  L"\ua4a0"
+#define UNITEXT_YI_RADICAL_TAT  U"\ua4a0"
 #define UNICODE_YI_RADICAL_GA  0xa4a1
-#define UNITEXT_YI_RADICAL_GA  L"\ua4a1"
+#define UNITEXT_YI_RADICAL_GA  U"\ua4a1"
 #define UNICODE_YI_RADICAL_ZUP  0xa4a2
-#define UNITEXT_YI_RADICAL_ZUP  L"\ua4a2"
+#define UNITEXT_YI_RADICAL_ZUP  U"\ua4a2"
 #define UNICODE_YI_RADICAL_CYT  0xa4a3
-#define UNITEXT_YI_RADICAL_CYT  L"\ua4a3"
+#define UNITEXT_YI_RADICAL_CYT  U"\ua4a3"
 #define UNICODE_YI_RADICAL_DDUR  0xa4a4
-#define UNITEXT_YI_RADICAL_DDUR  L"\ua4a4"
+#define UNITEXT_YI_RADICAL_DDUR  U"\ua4a4"
 #define UNICODE_YI_RADICAL_BUR  0xa4a5
-#define UNITEXT_YI_RADICAL_BUR  L"\ua4a5"
+#define UNITEXT_YI_RADICAL_BUR  U"\ua4a5"
 #define UNICODE_YI_RADICAL_GGUO  0xa4a6
-#define UNITEXT_YI_RADICAL_GGUO  L"\ua4a6"
+#define UNITEXT_YI_RADICAL_GGUO  U"\ua4a6"
 #define UNICODE_YI_RADICAL_NYOP  0xa4a7
-#define UNITEXT_YI_RADICAL_NYOP  L"\ua4a7"
+#define UNITEXT_YI_RADICAL_NYOP  U"\ua4a7"
 #define UNICODE_YI_RADICAL_TU  0xa4a8
-#define UNITEXT_YI_RADICAL_TU  L"\ua4a8"
+#define UNITEXT_YI_RADICAL_TU  U"\ua4a8"
 #define UNICODE_YI_RADICAL_OP  0xa4a9
-#define UNITEXT_YI_RADICAL_OP  L"\ua4a9"
+#define UNITEXT_YI_RADICAL_OP  U"\ua4a9"
 #define UNICODE_YI_RADICAL_JJUT  0xa4aa
-#define UNITEXT_YI_RADICAL_JJUT  L"\ua4aa"
+#define UNITEXT_YI_RADICAL_JJUT  U"\ua4aa"
 #define UNICODE_YI_RADICAL_ZOT  0xa4ab
-#define UNITEXT_YI_RADICAL_ZOT  L"\ua4ab"
+#define UNITEXT_YI_RADICAL_ZOT  U"\ua4ab"
 #define UNICODE_YI_RADICAL_PYT  0xa4ac
-#define UNITEXT_YI_RADICAL_PYT  L"\ua4ac"
+#define UNITEXT_YI_RADICAL_PYT  U"\ua4ac"
 #define UNICODE_YI_RADICAL_HMO  0xa4ad
-#define UNITEXT_YI_RADICAL_HMO  L"\ua4ad"
+#define UNITEXT_YI_RADICAL_HMO  U"\ua4ad"
 #define UNICODE_YI_RADICAL_YIT  0xa4ae
-#define UNITEXT_YI_RADICAL_YIT  L"\ua4ae"
+#define UNITEXT_YI_RADICAL_YIT  U"\ua4ae"
 #define UNICODE_YI_RADICAL_VUR  0xa4af
-#define UNITEXT_YI_RADICAL_VUR  L"\ua4af"
+#define UNITEXT_YI_RADICAL_VUR  U"\ua4af"
 #define UNICODE_YI_RADICAL_SHY  0xa4b0
-#define UNITEXT_YI_RADICAL_SHY  L"\ua4b0"
+#define UNITEXT_YI_RADICAL_SHY  U"\ua4b0"
 #define UNICODE_YI_RADICAL_VEP  0xa4b1
-#define UNITEXT_YI_RADICAL_VEP  L"\ua4b1"
+#define UNITEXT_YI_RADICAL_VEP  U"\ua4b1"
 #define UNICODE_YI_RADICAL_ZA  0xa4b2
-#define UNITEXT_YI_RADICAL_ZA  L"\ua4b2"
+#define UNITEXT_YI_RADICAL_ZA  U"\ua4b2"
 #define UNICODE_YI_RADICAL_JO  0xa4b3
-#define UNITEXT_YI_RADICAL_JO  L"\ua4b3"
+#define UNITEXT_YI_RADICAL_JO  U"\ua4b3"
 #define UNICODE_YI_RADICAL_NZUP  0xa4b4
-#define UNITEXT_YI_RADICAL_NZUP  L"\ua4b4"
+#define UNITEXT_YI_RADICAL_NZUP  U"\ua4b4"
 #define UNICODE_YI_RADICAL_JJY  0xa4b5
-#define UNITEXT_YI_RADICAL_JJY  L"\ua4b5"
+#define UNITEXT_YI_RADICAL_JJY  U"\ua4b5"
 #define UNICODE_YI_RADICAL_GOT  0xa4b6
-#define UNITEXT_YI_RADICAL_GOT  L"\ua4b6"
+#define UNITEXT_YI_RADICAL_GOT  U"\ua4b6"
 #define UNICODE_YI_RADICAL_JJIE  0xa4b7
-#define UNITEXT_YI_RADICAL_JJIE  L"\ua4b7"
+#define UNITEXT_YI_RADICAL_JJIE  U"\ua4b7"
 #define UNICODE_YI_RADICAL_WO  0xa4b8
-#define UNITEXT_YI_RADICAL_WO  L"\ua4b8"
+#define UNITEXT_YI_RADICAL_WO  U"\ua4b8"
 #define UNICODE_YI_RADICAL_DU  0xa4b9
-#define UNITEXT_YI_RADICAL_DU  L"\ua4b9"
+#define UNITEXT_YI_RADICAL_DU  U"\ua4b9"
 #define UNICODE_YI_RADICAL_SHUR  0xa4ba
-#define UNITEXT_YI_RADICAL_SHUR  L"\ua4ba"
+#define UNITEXT_YI_RADICAL_SHUR  U"\ua4ba"
 #define UNICODE_YI_RADICAL_LIE  0xa4bb
-#define UNITEXT_YI_RADICAL_LIE  L"\ua4bb"
+#define UNITEXT_YI_RADICAL_LIE  U"\ua4bb"
 #define UNICODE_YI_RADICAL_CY  0xa4bc
-#define UNITEXT_YI_RADICAL_CY  L"\ua4bc"
+#define UNITEXT_YI_RADICAL_CY  U"\ua4bc"
 #define UNICODE_YI_RADICAL_CUOP  0xa4bd
-#define UNITEXT_YI_RADICAL_CUOP  L"\ua4bd"
+#define UNITEXT_YI_RADICAL_CUOP  U"\ua4bd"
 #define UNICODE_YI_RADICAL_CIP  0xa4be
-#define UNITEXT_YI_RADICAL_CIP  L"\ua4be"
+#define UNITEXT_YI_RADICAL_CIP  U"\ua4be"
 #define UNICODE_YI_RADICAL_HXOP  0xa4bf
-#define UNITEXT_YI_RADICAL_HXOP  L"\ua4bf"
+#define UNITEXT_YI_RADICAL_HXOP  U"\ua4bf"
 #define UNICODE_YI_RADICAL_SHAT  0xa4c0
-#define UNITEXT_YI_RADICAL_SHAT  L"\ua4c0"
+#define UNITEXT_YI_RADICAL_SHAT  U"\ua4c0"
 #define UNICODE_YI_RADICAL_ZUR  0xa4c1
-#define UNITEXT_YI_RADICAL_ZUR  L"\ua4c1"
+#define UNITEXT_YI_RADICAL_ZUR  U"\ua4c1"
 #define UNICODE_YI_RADICAL_SHOP  0xa4c2
-#define UNITEXT_YI_RADICAL_SHOP  L"\ua4c2"
+#define UNITEXT_YI_RADICAL_SHOP  U"\ua4c2"
 #define UNICODE_YI_RADICAL_CHE  0xa4c3
-#define UNITEXT_YI_RADICAL_CHE  L"\ua4c3"
+#define UNITEXT_YI_RADICAL_CHE  U"\ua4c3"
 #define UNICODE_YI_RADICAL_ZZIET  0xa4c4
-#define UNITEXT_YI_RADICAL_ZZIET  L"\ua4c4"
+#define UNITEXT_YI_RADICAL_ZZIET  U"\ua4c4"
 #define UNICODE_YI_RADICAL_NBIE  0xa4c5
-#define UNITEXT_YI_RADICAL_NBIE  L"\ua4c5"
+#define UNITEXT_YI_RADICAL_NBIE  U"\ua4c5"
 #define UNICODE_YI_RADICAL_KE  0xa4c6
-#define UNITEXT_YI_RADICAL_KE  L"\ua4c6"
+#define UNITEXT_YI_RADICAL_KE  U"\ua4c6"
 #define UNICODE_MODIFIER_LETTER_CHINESE_TONE_YIN_PING  0xa700
-#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YIN_PING  L"\ua700"
+#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YIN_PING  U"\ua700"
 #define UNICODE_MODIFIER_LETTER_CHINESE_TONE_YANG_PING  0xa701
-#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YANG_PING  L"\ua701"
+#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YANG_PING  U"\ua701"
 #define UNICODE_MODIFIER_LETTER_CHINESE_TONE_YIN_SHANG  0xa702
-#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YIN_SHANG  L"\ua702"
+#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YIN_SHANG  U"\ua702"
 #define UNICODE_MODIFIER_LETTER_CHINESE_TONE_YANG_SHANG  0xa703
-#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YANG_SHANG  L"\ua703"
+#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YANG_SHANG  U"\ua703"
 #define UNICODE_MODIFIER_LETTER_CHINESE_TONE_YIN_QU  0xa704
-#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YIN_QU  L"\ua704"
+#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YIN_QU  U"\ua704"
 #define UNICODE_MODIFIER_LETTER_CHINESE_TONE_YANG_QU  0xa705
-#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YANG_QU  L"\ua705"
+#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YANG_QU  U"\ua705"
 #define UNICODE_MODIFIER_LETTER_CHINESE_TONE_YIN_RU  0xa706
-#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YIN_RU  L"\ua706"
+#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YIN_RU  U"\ua706"
 #define UNICODE_MODIFIER_LETTER_CHINESE_TONE_YANG_RU  0xa707
-#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YANG_RU  L"\ua707"
+#define UNITEXT_MODIFIER_LETTER_CHINESE_TONE_YANG_RU  U"\ua707"
 #define UNICODE_MODIFIER_LETTER_EXTRA_HIGH_DOTTED_TONE_BAR  0xa708
-#define UNITEXT_MODIFIER_LETTER_EXTRA_HIGH_DOTTED_TONE_BAR  L"\ua708"
+#define UNITEXT_MODIFIER_LETTER_EXTRA_HIGH_DOTTED_TONE_BAR  U"\ua708"
 #define UNICODE_MODIFIER_LETTER_HIGH_DOTTED_TONE_BAR  0xa709
-#define UNITEXT_MODIFIER_LETTER_HIGH_DOTTED_TONE_BAR  L"\ua709"
+#define UNITEXT_MODIFIER_LETTER_HIGH_DOTTED_TONE_BAR  U"\ua709"
 #define UNICODE_MODIFIER_LETTER_MID_DOTTED_TONE_BAR  0xa70a
-#define UNITEXT_MODIFIER_LETTER_MID_DOTTED_TONE_BAR  L"\ua70a"
+#define UNITEXT_MODIFIER_LETTER_MID_DOTTED_TONE_BAR  U"\ua70a"
 #define UNICODE_MODIFIER_LETTER_LOW_DOTTED_TONE_BAR  0xa70b
-#define UNITEXT_MODIFIER_LETTER_LOW_DOTTED_TONE_BAR  L"\ua70b"
+#define UNITEXT_MODIFIER_LETTER_LOW_DOTTED_TONE_BAR  U"\ua70b"
 #define UNICODE_MODIFIER_LETTER_EXTRA_LOW_DOTTED_TONE_BAR  0xa70c
-#define UNITEXT_MODIFIER_LETTER_EXTRA_LOW_DOTTED_TONE_BAR  L"\ua70c"
+#define UNITEXT_MODIFIER_LETTER_EXTRA_LOW_DOTTED_TONE_BAR  U"\ua70c"
 #define UNICODE_MODIFIER_LETTER_EXTRA_HIGH_DOTTED_LEFT_STEM_TONE_BAR  0xa70d
-#define UNITEXT_MODIFIER_LETTER_EXTRA_HIGH_DOTTED_LEFT_STEM_TONE_BAR  L"\ua70d"
+#define UNITEXT_MODIFIER_LETTER_EXTRA_HIGH_DOTTED_LEFT_STEM_TONE_BAR  U"\ua70d"
 #define UNICODE_MODIFIER_LETTER_HIGH_DOTTED_LEFT_STEM_TONE_BAR  0xa70e
-#define UNITEXT_MODIFIER_LETTER_HIGH_DOTTED_LEFT_STEM_TONE_BAR  L"\ua70e"
+#define UNITEXT_MODIFIER_LETTER_HIGH_DOTTED_LEFT_STEM_TONE_BAR  U"\ua70e"
 #define UNICODE_MODIFIER_LETTER_MID_DOTTED_LEFT_STEM_TONE_BAR  0xa70f
-#define UNITEXT_MODIFIER_LETTER_MID_DOTTED_LEFT_STEM_TONE_BAR  L"\ua70f"
+#define UNITEXT_MODIFIER_LETTER_MID_DOTTED_LEFT_STEM_TONE_BAR  U"\ua70f"
 #define UNICODE_MODIFIER_LETTER_LOW_DOTTED_LEFT_STEM_TONE_BAR  0xa710
-#define UNITEXT_MODIFIER_LETTER_LOW_DOTTED_LEFT_STEM_TONE_BAR  L"\ua710"
+#define UNITEXT_MODIFIER_LETTER_LOW_DOTTED_LEFT_STEM_TONE_BAR  U"\ua710"
 #define UNICODE_MODIFIER_LETTER_EXTRA_LOW_DOTTED_LEFT_STEM_TONE_BAR  0xa711
-#define UNITEXT_MODIFIER_LETTER_EXTRA_LOW_DOTTED_LEFT_STEM_TONE_BAR  L"\ua711"
+#define UNITEXT_MODIFIER_LETTER_EXTRA_LOW_DOTTED_LEFT_STEM_TONE_BAR  U"\ua711"
 #define UNICODE_MODIFIER_LETTER_EXTRA_HIGH_LEFT_STEM_TONE_BAR  0xa712
-#define UNITEXT_MODIFIER_LETTER_EXTRA_HIGH_LEFT_STEM_TONE_BAR  L"\ua712"
+#define UNITEXT_MODIFIER_LETTER_EXTRA_HIGH_LEFT_STEM_TONE_BAR  U"\ua712"
 #define UNICODE_MODIFIER_LETTER_HIGH_LEFT_STEM_TONE_BAR  0xa713
-#define UNITEXT_MODIFIER_LETTER_HIGH_LEFT_STEM_TONE_BAR  L"\ua713"
+#define UNITEXT_MODIFIER_LETTER_HIGH_LEFT_STEM_TONE_BAR  U"\ua713"
 #define UNICODE_MODIFIER_LETTER_MID_LEFT_STEM_TONE_BAR  0xa714
-#define UNITEXT_MODIFIER_LETTER_MID_LEFT_STEM_TONE_BAR  L"\ua714"
+#define UNITEXT_MODIFIER_LETTER_MID_LEFT_STEM_TONE_BAR  U"\ua714"
 #define UNICODE_MODIFIER_LETTER_LOW_LEFT_STEM_TONE_BAR  0xa715
-#define UNITEXT_MODIFIER_LETTER_LOW_LEFT_STEM_TONE_BAR  L"\ua715"
+#define UNITEXT_MODIFIER_LETTER_LOW_LEFT_STEM_TONE_BAR  U"\ua715"
 #define UNICODE_MODIFIER_LETTER_EXTRA_LOW_LEFT_STEM_TONE_BAR  0xa716
-#define UNITEXT_MODIFIER_LETTER_EXTRA_LOW_LEFT_STEM_TONE_BAR  L"\ua716"
+#define UNITEXT_MODIFIER_LETTER_EXTRA_LOW_LEFT_STEM_TONE_BAR  U"\ua716"
 #define UNICODE_MODIFIER_LETTER_DOT_VERTICAL_BAR  0xa717
-#define UNITEXT_MODIFIER_LETTER_DOT_VERTICAL_BAR  L"\ua717"
+#define UNITEXT_MODIFIER_LETTER_DOT_VERTICAL_BAR  U"\ua717"
 #define UNICODE_MODIFIER_LETTER_DOT_SLASH  0xa718
-#define UNITEXT_MODIFIER_LETTER_DOT_SLASH  L"\ua718"
+#define UNITEXT_MODIFIER_LETTER_DOT_SLASH  U"\ua718"
 #define UNICODE_MODIFIER_LETTER_DOT_HORIZONTAL_BAR  0xa719
-#define UNITEXT_MODIFIER_LETTER_DOT_HORIZONTAL_BAR  L"\ua719"
+#define UNITEXT_MODIFIER_LETTER_DOT_HORIZONTAL_BAR  U"\ua719"
 #define UNICODE_MODIFIER_LETTER_LOWER_RIGHT_CORNER_ANGLE  0xa71a
-#define UNITEXT_MODIFIER_LETTER_LOWER_RIGHT_CORNER_ANGLE  L"\ua71a"
+#define UNITEXT_MODIFIER_LETTER_LOWER_RIGHT_CORNER_ANGLE  U"\ua71a"
 #define UNICODE_MODIFIER_LETTER_STRESS_AND_HIGH_TONE  0xa720
-#define UNITEXT_MODIFIER_LETTER_STRESS_AND_HIGH_TONE  L"\ua720"
+#define UNITEXT_MODIFIER_LETTER_STRESS_AND_HIGH_TONE  U"\ua720"
 #define UNICODE_MODIFIER_LETTER_STRESS_AND_LOW_TONE  0xa721
-#define UNITEXT_MODIFIER_LETTER_STRESS_AND_LOW_TONE  L"\ua721"
+#define UNITEXT_MODIFIER_LETTER_STRESS_AND_LOW_TONE  U"\ua721"
 #define UNICODE_SYLOTI_NAGRI_LETTER_A  0xa800
-#define UNITEXT_SYLOTI_NAGRI_LETTER_A  L"\ua800"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_A  U"\ua800"
 #define UNICODE_SYLOTI_NAGRI_LETTER_I  0xa801
-#define UNITEXT_SYLOTI_NAGRI_LETTER_I  L"\ua801"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_I  U"\ua801"
 #define UNICODE_SYLOTI_NAGRI_SIGN_DVISVARA  0xa802
-#define UNITEXT_SYLOTI_NAGRI_SIGN_DVISVARA  L"\ua802"
+#define UNITEXT_SYLOTI_NAGRI_SIGN_DVISVARA  U"\ua802"
 #define UNICODE_SYLOTI_NAGRI_LETTER_U  0xa803
-#define UNITEXT_SYLOTI_NAGRI_LETTER_U  L"\ua803"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_U  U"\ua803"
 #define UNICODE_SYLOTI_NAGRI_LETTER_E  0xa804
-#define UNITEXT_SYLOTI_NAGRI_LETTER_E  L"\ua804"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_E  U"\ua804"
 #define UNICODE_SYLOTI_NAGRI_LETTER_O  0xa805
-#define UNITEXT_SYLOTI_NAGRI_LETTER_O  L"\ua805"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_O  U"\ua805"
 #define UNICODE_SYLOTI_NAGRI_SIGN_HASANTA  0xa806
-#define UNITEXT_SYLOTI_NAGRI_SIGN_HASANTA  L"\ua806"
+#define UNITEXT_SYLOTI_NAGRI_SIGN_HASANTA  U"\ua806"
 #define UNICODE_SYLOTI_NAGRI_LETTER_KO  0xa807
-#define UNITEXT_SYLOTI_NAGRI_LETTER_KO  L"\ua807"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_KO  U"\ua807"
 #define UNICODE_SYLOTI_NAGRI_LETTER_KHO  0xa808
-#define UNITEXT_SYLOTI_NAGRI_LETTER_KHO  L"\ua808"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_KHO  U"\ua808"
 #define UNICODE_SYLOTI_NAGRI_LETTER_GO  0xa809
-#define UNITEXT_SYLOTI_NAGRI_LETTER_GO  L"\ua809"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_GO  U"\ua809"
 #define UNICODE_SYLOTI_NAGRI_LETTER_GHO  0xa80a
-#define UNITEXT_SYLOTI_NAGRI_LETTER_GHO  L"\ua80a"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_GHO  U"\ua80a"
 #define UNICODE_SYLOTI_NAGRI_SIGN_ANUSVARA  0xa80b
-#define UNITEXT_SYLOTI_NAGRI_SIGN_ANUSVARA  L"\ua80b"
+#define UNITEXT_SYLOTI_NAGRI_SIGN_ANUSVARA  U"\ua80b"
 #define UNICODE_SYLOTI_NAGRI_LETTER_CO  0xa80c
-#define UNITEXT_SYLOTI_NAGRI_LETTER_CO  L"\ua80c"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_CO  U"\ua80c"
 #define UNICODE_SYLOTI_NAGRI_LETTER_CHO  0xa80d
-#define UNITEXT_SYLOTI_NAGRI_LETTER_CHO  L"\ua80d"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_CHO  U"\ua80d"
 #define UNICODE_SYLOTI_NAGRI_LETTER_JO  0xa80e
-#define UNITEXT_SYLOTI_NAGRI_LETTER_JO  L"\ua80e"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_JO  U"\ua80e"
 #define UNICODE_SYLOTI_NAGRI_LETTER_JHO  0xa80f
-#define UNITEXT_SYLOTI_NAGRI_LETTER_JHO  L"\ua80f"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_JHO  U"\ua80f"
 #define UNICODE_SYLOTI_NAGRI_LETTER_TTO  0xa810
-#define UNITEXT_SYLOTI_NAGRI_LETTER_TTO  L"\ua810"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_TTO  U"\ua810"
 #define UNICODE_SYLOTI_NAGRI_LETTER_TTHO  0xa811
-#define UNITEXT_SYLOTI_NAGRI_LETTER_TTHO  L"\ua811"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_TTHO  U"\ua811"
 #define UNICODE_SYLOTI_NAGRI_LETTER_DDO  0xa812
-#define UNITEXT_SYLOTI_NAGRI_LETTER_DDO  L"\ua812"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_DDO  U"\ua812"
 #define UNICODE_SYLOTI_NAGRI_LETTER_DDHO  0xa813
-#define UNITEXT_SYLOTI_NAGRI_LETTER_DDHO  L"\ua813"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_DDHO  U"\ua813"
 #define UNICODE_SYLOTI_NAGRI_LETTER_TO  0xa814
-#define UNITEXT_SYLOTI_NAGRI_LETTER_TO  L"\ua814"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_TO  U"\ua814"
 #define UNICODE_SYLOTI_NAGRI_LETTER_THO  0xa815
-#define UNITEXT_SYLOTI_NAGRI_LETTER_THO  L"\ua815"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_THO  U"\ua815"
 #define UNICODE_SYLOTI_NAGRI_LETTER_DO  0xa816
-#define UNITEXT_SYLOTI_NAGRI_LETTER_DO  L"\ua816"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_DO  U"\ua816"
 #define UNICODE_SYLOTI_NAGRI_LETTER_DHO  0xa817
-#define UNITEXT_SYLOTI_NAGRI_LETTER_DHO  L"\ua817"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_DHO  U"\ua817"
 #define UNICODE_SYLOTI_NAGRI_LETTER_NO  0xa818
-#define UNITEXT_SYLOTI_NAGRI_LETTER_NO  L"\ua818"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_NO  U"\ua818"
 #define UNICODE_SYLOTI_NAGRI_LETTER_PO  0xa819
-#define UNITEXT_SYLOTI_NAGRI_LETTER_PO  L"\ua819"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_PO  U"\ua819"
 #define UNICODE_SYLOTI_NAGRI_LETTER_PHO  0xa81a
-#define UNITEXT_SYLOTI_NAGRI_LETTER_PHO  L"\ua81a"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_PHO  U"\ua81a"
 #define UNICODE_SYLOTI_NAGRI_LETTER_BO  0xa81b
-#define UNITEXT_SYLOTI_NAGRI_LETTER_BO  L"\ua81b"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_BO  U"\ua81b"
 #define UNICODE_SYLOTI_NAGRI_LETTER_BHO  0xa81c
-#define UNITEXT_SYLOTI_NAGRI_LETTER_BHO  L"\ua81c"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_BHO  U"\ua81c"
 #define UNICODE_SYLOTI_NAGRI_LETTER_MO  0xa81d
-#define UNITEXT_SYLOTI_NAGRI_LETTER_MO  L"\ua81d"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_MO  U"\ua81d"
 #define UNICODE_SYLOTI_NAGRI_LETTER_RO  0xa81e
-#define UNITEXT_SYLOTI_NAGRI_LETTER_RO  L"\ua81e"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_RO  U"\ua81e"
 #define UNICODE_SYLOTI_NAGRI_LETTER_LO  0xa81f
-#define UNITEXT_SYLOTI_NAGRI_LETTER_LO  L"\ua81f"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_LO  U"\ua81f"
 #define UNICODE_SYLOTI_NAGRI_LETTER_RRO  0xa820
-#define UNITEXT_SYLOTI_NAGRI_LETTER_RRO  L"\ua820"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_RRO  U"\ua820"
 #define UNICODE_SYLOTI_NAGRI_LETTER_SO  0xa821
-#define UNITEXT_SYLOTI_NAGRI_LETTER_SO  L"\ua821"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_SO  U"\ua821"
 #define UNICODE_SYLOTI_NAGRI_LETTER_HO  0xa822
-#define UNITEXT_SYLOTI_NAGRI_LETTER_HO  L"\ua822"
+#define UNITEXT_SYLOTI_NAGRI_LETTER_HO  U"\ua822"
 #define UNICODE_SYLOTI_NAGRI_VOWEL_SIGN_A  0xa823
-#define UNITEXT_SYLOTI_NAGRI_VOWEL_SIGN_A  L"\ua823"
+#define UNITEXT_SYLOTI_NAGRI_VOWEL_SIGN_A  U"\ua823"
 #define UNICODE_SYLOTI_NAGRI_VOWEL_SIGN_I  0xa824
-#define UNITEXT_SYLOTI_NAGRI_VOWEL_SIGN_I  L"\ua824"
+#define UNITEXT_SYLOTI_NAGRI_VOWEL_SIGN_I  U"\ua824"
 #define UNICODE_SYLOTI_NAGRI_VOWEL_SIGN_U  0xa825
-#define UNITEXT_SYLOTI_NAGRI_VOWEL_SIGN_U  L"\ua825"
+#define UNITEXT_SYLOTI_NAGRI_VOWEL_SIGN_U  U"\ua825"
 #define UNICODE_SYLOTI_NAGRI_VOWEL_SIGN_E  0xa826
-#define UNITEXT_SYLOTI_NAGRI_VOWEL_SIGN_E  L"\ua826"
+#define UNITEXT_SYLOTI_NAGRI_VOWEL_SIGN_E  U"\ua826"
 #define UNICODE_SYLOTI_NAGRI_VOWEL_SIGN_OO  0xa827
-#define UNITEXT_SYLOTI_NAGRI_VOWEL_SIGN_OO  L"\ua827"
+#define UNITEXT_SYLOTI_NAGRI_VOWEL_SIGN_OO  U"\ua827"
 #define UNICODE_SYLOTI_NAGRI_POETRY_MARK_1  0xa828
-#define UNITEXT_SYLOTI_NAGRI_POETRY_MARK_1  L"\ua828"
+#define UNITEXT_SYLOTI_NAGRI_POETRY_MARK_1  U"\ua828"
 #define UNICODE_SYLOTI_NAGRI_POETRY_MARK_2  0xa829
-#define UNITEXT_SYLOTI_NAGRI_POETRY_MARK_2  L"\ua829"
+#define UNITEXT_SYLOTI_NAGRI_POETRY_MARK_2  U"\ua829"
 #define UNICODE_SYLOTI_NAGRI_POETRY_MARK_3  0xa82a
-#define UNITEXT_SYLOTI_NAGRI_POETRY_MARK_3  L"\ua82a"
+#define UNITEXT_SYLOTI_NAGRI_POETRY_MARK_3  U"\ua82a"
 #define UNICODE_SYLOTI_NAGRI_POETRY_MARK_4  0xa82b
-#define UNITEXT_SYLOTI_NAGRI_POETRY_MARK_4  L"\ua82b"
+#define UNITEXT_SYLOTI_NAGRI_POETRY_MARK_4  U"\ua82b"
 #define UNICODE_PHAGS_PA_LETTER_KA  0xa840
-#define UNITEXT_PHAGS_PA_LETTER_KA  L"\ua840"
+#define UNITEXT_PHAGS_PA_LETTER_KA  U"\ua840"
 #define UNICODE_PHAGS_PA_LETTER_KHA  0xa841
-#define UNITEXT_PHAGS_PA_LETTER_KHA  L"\ua841"
+#define UNITEXT_PHAGS_PA_LETTER_KHA  U"\ua841"
 #define UNICODE_PHAGS_PA_LETTER_GA  0xa842
-#define UNITEXT_PHAGS_PA_LETTER_GA  L"\ua842"
+#define UNITEXT_PHAGS_PA_LETTER_GA  U"\ua842"
 #define UNICODE_PHAGS_PA_LETTER_NGA  0xa843
-#define UNITEXT_PHAGS_PA_LETTER_NGA  L"\ua843"
+#define UNITEXT_PHAGS_PA_LETTER_NGA  U"\ua843"
 #define UNICODE_PHAGS_PA_LETTER_CA  0xa844
-#define UNITEXT_PHAGS_PA_LETTER_CA  L"\ua844"
+#define UNITEXT_PHAGS_PA_LETTER_CA  U"\ua844"
 #define UNICODE_PHAGS_PA_LETTER_CHA  0xa845
-#define UNITEXT_PHAGS_PA_LETTER_CHA  L"\ua845"
+#define UNITEXT_PHAGS_PA_LETTER_CHA  U"\ua845"
 #define UNICODE_PHAGS_PA_LETTER_JA  0xa846
-#define UNITEXT_PHAGS_PA_LETTER_JA  L"\ua846"
+#define UNITEXT_PHAGS_PA_LETTER_JA  U"\ua846"
 #define UNICODE_PHAGS_PA_LETTER_NYA  0xa847
-#define UNITEXT_PHAGS_PA_LETTER_NYA  L"\ua847"
+#define UNITEXT_PHAGS_PA_LETTER_NYA  U"\ua847"
 #define UNICODE_PHAGS_PA_LETTER_TA  0xa848
-#define UNITEXT_PHAGS_PA_LETTER_TA  L"\ua848"
+#define UNITEXT_PHAGS_PA_LETTER_TA  U"\ua848"
 #define UNICODE_PHAGS_PA_LETTER_THA  0xa849
-#define UNITEXT_PHAGS_PA_LETTER_THA  L"\ua849"
+#define UNITEXT_PHAGS_PA_LETTER_THA  U"\ua849"
 #define UNICODE_PHAGS_PA_LETTER_DA  0xa84a
-#define UNITEXT_PHAGS_PA_LETTER_DA  L"\ua84a"
+#define UNITEXT_PHAGS_PA_LETTER_DA  U"\ua84a"
 #define UNICODE_PHAGS_PA_LETTER_NA  0xa84b
-#define UNITEXT_PHAGS_PA_LETTER_NA  L"\ua84b"
+#define UNITEXT_PHAGS_PA_LETTER_NA  U"\ua84b"
 #define UNICODE_PHAGS_PA_LETTER_PA  0xa84c
-#define UNITEXT_PHAGS_PA_LETTER_PA  L"\ua84c"
+#define UNITEXT_PHAGS_PA_LETTER_PA  U"\ua84c"
 #define UNICODE_PHAGS_PA_LETTER_PHA  0xa84d
-#define UNITEXT_PHAGS_PA_LETTER_PHA  L"\ua84d"
+#define UNITEXT_PHAGS_PA_LETTER_PHA  U"\ua84d"
 #define UNICODE_PHAGS_PA_LETTER_BA  0xa84e
-#define UNITEXT_PHAGS_PA_LETTER_BA  L"\ua84e"
+#define UNITEXT_PHAGS_PA_LETTER_BA  U"\ua84e"
 #define UNICODE_PHAGS_PA_LETTER_MA  0xa84f
-#define UNITEXT_PHAGS_PA_LETTER_MA  L"\ua84f"
+#define UNITEXT_PHAGS_PA_LETTER_MA  U"\ua84f"
 #define UNICODE_PHAGS_PA_LETTER_TSA  0xa850
-#define UNITEXT_PHAGS_PA_LETTER_TSA  L"\ua850"
+#define UNITEXT_PHAGS_PA_LETTER_TSA  U"\ua850"
 #define UNICODE_PHAGS_PA_LETTER_TSHA  0xa851
-#define UNITEXT_PHAGS_PA_LETTER_TSHA  L"\ua851"
+#define UNITEXT_PHAGS_PA_LETTER_TSHA  U"\ua851"
 #define UNICODE_PHAGS_PA_LETTER_DZA  0xa852
-#define UNITEXT_PHAGS_PA_LETTER_DZA  L"\ua852"
+#define UNITEXT_PHAGS_PA_LETTER_DZA  U"\ua852"
 #define UNICODE_PHAGS_PA_LETTER_WA  0xa853
-#define UNITEXT_PHAGS_PA_LETTER_WA  L"\ua853"
+#define UNITEXT_PHAGS_PA_LETTER_WA  U"\ua853"
 #define UNICODE_PHAGS_PA_LETTER_ZHA  0xa854
-#define UNITEXT_PHAGS_PA_LETTER_ZHA  L"\ua854"
+#define UNITEXT_PHAGS_PA_LETTER_ZHA  U"\ua854"
 #define UNICODE_PHAGS_PA_LETTER_ZA  0xa855
-#define UNITEXT_PHAGS_PA_LETTER_ZA  L"\ua855"
+#define UNITEXT_PHAGS_PA_LETTER_ZA  U"\ua855"
 #define UNICODE_PHAGS_PA_LETTER_SMALL_A  0xa856
-#define UNITEXT_PHAGS_PA_LETTER_SMALL_A  L"\ua856"
+#define UNITEXT_PHAGS_PA_LETTER_SMALL_A  U"\ua856"
 #define UNICODE_PHAGS_PA_LETTER_YA  0xa857
-#define UNITEXT_PHAGS_PA_LETTER_YA  L"\ua857"
+#define UNITEXT_PHAGS_PA_LETTER_YA  U"\ua857"
 #define UNICODE_PHAGS_PA_LETTER_RA  0xa858
-#define UNITEXT_PHAGS_PA_LETTER_RA  L"\ua858"
+#define UNITEXT_PHAGS_PA_LETTER_RA  U"\ua858"
 #define UNICODE_PHAGS_PA_LETTER_LA  0xa859
-#define UNITEXT_PHAGS_PA_LETTER_LA  L"\ua859"
+#define UNITEXT_PHAGS_PA_LETTER_LA  U"\ua859"
 #define UNICODE_PHAGS_PA_LETTER_SHA  0xa85a
-#define UNITEXT_PHAGS_PA_LETTER_SHA  L"\ua85a"
+#define UNITEXT_PHAGS_PA_LETTER_SHA  U"\ua85a"
 #define UNICODE_PHAGS_PA_LETTER_SA  0xa85b
-#define UNITEXT_PHAGS_PA_LETTER_SA  L"\ua85b"
+#define UNITEXT_PHAGS_PA_LETTER_SA  U"\ua85b"
 #define UNICODE_PHAGS_PA_LETTER_HA  0xa85c
-#define UNITEXT_PHAGS_PA_LETTER_HA  L"\ua85c"
+#define UNITEXT_PHAGS_PA_LETTER_HA  U"\ua85c"
 #define UNICODE_PHAGS_PA_LETTER_A  0xa85d
-#define UNITEXT_PHAGS_PA_LETTER_A  L"\ua85d"
+#define UNITEXT_PHAGS_PA_LETTER_A  U"\ua85d"
 #define UNICODE_PHAGS_PA_LETTER_I  0xa85e
-#define UNITEXT_PHAGS_PA_LETTER_I  L"\ua85e"
+#define UNITEXT_PHAGS_PA_LETTER_I  U"\ua85e"
 #define UNICODE_PHAGS_PA_LETTER_U  0xa85f
-#define UNITEXT_PHAGS_PA_LETTER_U  L"\ua85f"
+#define UNITEXT_PHAGS_PA_LETTER_U  U"\ua85f"
 #define UNICODE_PHAGS_PA_LETTER_E  0xa860
-#define UNITEXT_PHAGS_PA_LETTER_E  L"\ua860"
+#define UNITEXT_PHAGS_PA_LETTER_E  U"\ua860"
 #define UNICODE_PHAGS_PA_LETTER_O  0xa861
-#define UNITEXT_PHAGS_PA_LETTER_O  L"\ua861"
+#define UNITEXT_PHAGS_PA_LETTER_O  U"\ua861"
 #define UNICODE_PHAGS_PA_LETTER_QA  0xa862
-#define UNITEXT_PHAGS_PA_LETTER_QA  L"\ua862"
+#define UNITEXT_PHAGS_PA_LETTER_QA  U"\ua862"
 #define UNICODE_PHAGS_PA_LETTER_XA  0xa863
-#define UNITEXT_PHAGS_PA_LETTER_XA  L"\ua863"
+#define UNITEXT_PHAGS_PA_LETTER_XA  U"\ua863"
 #define UNICODE_PHAGS_PA_LETTER_FA  0xa864
-#define UNITEXT_PHAGS_PA_LETTER_FA  L"\ua864"
+#define UNITEXT_PHAGS_PA_LETTER_FA  U"\ua864"
 #define UNICODE_PHAGS_PA_LETTER_GGA  0xa865
-#define UNITEXT_PHAGS_PA_LETTER_GGA  L"\ua865"
+#define UNITEXT_PHAGS_PA_LETTER_GGA  U"\ua865"
 #define UNICODE_PHAGS_PA_LETTER_EE  0xa866
-#define UNITEXT_PHAGS_PA_LETTER_EE  L"\ua866"
+#define UNITEXT_PHAGS_PA_LETTER_EE  U"\ua866"
 #define UNICODE_PHAGS_PA_SUBJOINED_LETTER_WA  0xa867
-#define UNITEXT_PHAGS_PA_SUBJOINED_LETTER_WA  L"\ua867"
+#define UNITEXT_PHAGS_PA_SUBJOINED_LETTER_WA  U"\ua867"
 #define UNICODE_PHAGS_PA_SUBJOINED_LETTER_YA  0xa868
-#define UNITEXT_PHAGS_PA_SUBJOINED_LETTER_YA  L"\ua868"
+#define UNITEXT_PHAGS_PA_SUBJOINED_LETTER_YA  U"\ua868"
 #define UNICODE_PHAGS_PA_LETTER_TTA  0xa869
-#define UNITEXT_PHAGS_PA_LETTER_TTA  L"\ua869"
+#define UNITEXT_PHAGS_PA_LETTER_TTA  U"\ua869"
 #define UNICODE_PHAGS_PA_LETTER_TTHA  0xa86a
-#define UNITEXT_PHAGS_PA_LETTER_TTHA  L"\ua86a"
+#define UNITEXT_PHAGS_PA_LETTER_TTHA  U"\ua86a"
 #define UNICODE_PHAGS_PA_LETTER_DDA  0xa86b
-#define UNITEXT_PHAGS_PA_LETTER_DDA  L"\ua86b"
+#define UNITEXT_PHAGS_PA_LETTER_DDA  U"\ua86b"
 #define UNICODE_PHAGS_PA_LETTER_NNA  0xa86c
-#define UNITEXT_PHAGS_PA_LETTER_NNA  L"\ua86c"
+#define UNITEXT_PHAGS_PA_LETTER_NNA  U"\ua86c"
 #define UNICODE_PHAGS_PA_LETTER_ALTERNATE_YA  0xa86d
-#define UNITEXT_PHAGS_PA_LETTER_ALTERNATE_YA  L"\ua86d"
+#define UNITEXT_PHAGS_PA_LETTER_ALTERNATE_YA  U"\ua86d"
 #define UNICODE_PHAGS_PA_LETTER_VOICELESS_SHA  0xa86e
-#define UNITEXT_PHAGS_PA_LETTER_VOICELESS_SHA  L"\ua86e"
+#define UNITEXT_PHAGS_PA_LETTER_VOICELESS_SHA  U"\ua86e"
 #define UNICODE_PHAGS_PA_LETTER_VOICED_HA  0xa86f
-#define UNITEXT_PHAGS_PA_LETTER_VOICED_HA  L"\ua86f"
+#define UNITEXT_PHAGS_PA_LETTER_VOICED_HA  U"\ua86f"
 #define UNICODE_PHAGS_PA_LETTER_ASPIRATED_FA  0xa870
-#define UNITEXT_PHAGS_PA_LETTER_ASPIRATED_FA  L"\ua870"
+#define UNITEXT_PHAGS_PA_LETTER_ASPIRATED_FA  U"\ua870"
 #define UNICODE_PHAGS_PA_SUBJOINED_LETTER_RA  0xa871
-#define UNITEXT_PHAGS_PA_SUBJOINED_LETTER_RA  L"\ua871"
+#define UNITEXT_PHAGS_PA_SUBJOINED_LETTER_RA  U"\ua871"
 #define UNICODE_PHAGS_PA_SUPERFIXED_LETTER_RA  0xa872
-#define UNITEXT_PHAGS_PA_SUPERFIXED_LETTER_RA  L"\ua872"
+#define UNITEXT_PHAGS_PA_SUPERFIXED_LETTER_RA  U"\ua872"
 #define UNICODE_PHAGS_PA_LETTER_CANDRABINDU  0xa873
-#define UNITEXT_PHAGS_PA_LETTER_CANDRABINDU  L"\ua873"
+#define UNITEXT_PHAGS_PA_LETTER_CANDRABINDU  U"\ua873"
 #define UNICODE_PHAGS_PA_SINGLE_HEAD_MARK  0xa874
-#define UNITEXT_PHAGS_PA_SINGLE_HEAD_MARK  L"\ua874"
+#define UNITEXT_PHAGS_PA_SINGLE_HEAD_MARK  U"\ua874"
 #define UNICODE_PHAGS_PA_DOUBLE_HEAD_MARK  0xa875
-#define UNITEXT_PHAGS_PA_DOUBLE_HEAD_MARK  L"\ua875"
+#define UNITEXT_PHAGS_PA_DOUBLE_HEAD_MARK  U"\ua875"
 #define UNICODE_PHAGS_PA_MARK_SHAD  0xa876
-#define UNITEXT_PHAGS_PA_MARK_SHAD  L"\ua876"
+#define UNITEXT_PHAGS_PA_MARK_SHAD  U"\ua876"
 #define UNICODE_PHAGS_PA_MARK_DOUBLE_SHAD  0xa877
-#define UNITEXT_PHAGS_PA_MARK_DOUBLE_SHAD  L"\ua877"
+#define UNITEXT_PHAGS_PA_MARK_DOUBLE_SHAD  U"\ua877"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F900  0xf900
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F900  L"\uf900"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F900  U"\uf900"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F901  0xf901
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F901  L"\uf901"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F901  U"\uf901"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F902  0xf902
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F902  L"\uf902"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F902  U"\uf902"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F903  0xf903
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F903  L"\uf903"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F903  U"\uf903"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F904  0xf904
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F904  L"\uf904"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F904  U"\uf904"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F905  0xf905
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F905  L"\uf905"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F905  U"\uf905"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F906  0xf906
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F906  L"\uf906"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F906  U"\uf906"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F907  0xf907
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F907  L"\uf907"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F907  U"\uf907"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F908  0xf908
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F908  L"\uf908"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F908  U"\uf908"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F909  0xf909
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F909  L"\uf909"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F909  U"\uf909"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F90A  0xf90a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90A  L"\uf90a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90A  U"\uf90a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F90B  0xf90b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90B  L"\uf90b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90B  U"\uf90b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F90C  0xf90c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90C  L"\uf90c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90C  U"\uf90c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F90D  0xf90d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90D  L"\uf90d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90D  U"\uf90d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F90E  0xf90e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90E  L"\uf90e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90E  U"\uf90e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F90F  0xf90f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90F  L"\uf90f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F90F  U"\uf90f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F910  0xf910
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F910  L"\uf910"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F910  U"\uf910"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F911  0xf911
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F911  L"\uf911"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F911  U"\uf911"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F912  0xf912
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F912  L"\uf912"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F912  U"\uf912"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F913  0xf913
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F913  L"\uf913"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F913  U"\uf913"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F914  0xf914
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F914  L"\uf914"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F914  U"\uf914"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F915  0xf915
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F915  L"\uf915"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F915  U"\uf915"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F916  0xf916
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F916  L"\uf916"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F916  U"\uf916"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F917  0xf917
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F917  L"\uf917"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F917  U"\uf917"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F918  0xf918
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F918  L"\uf918"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F918  U"\uf918"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F919  0xf919
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F919  L"\uf919"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F919  U"\uf919"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F91A  0xf91a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91A  L"\uf91a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91A  U"\uf91a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F91B  0xf91b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91B  L"\uf91b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91B  U"\uf91b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F91C  0xf91c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91C  L"\uf91c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91C  U"\uf91c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F91D  0xf91d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91D  L"\uf91d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91D  U"\uf91d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F91E  0xf91e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91E  L"\uf91e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91E  U"\uf91e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F91F  0xf91f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91F  L"\uf91f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F91F  U"\uf91f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F920  0xf920
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F920  L"\uf920"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F920  U"\uf920"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F921  0xf921
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F921  L"\uf921"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F921  U"\uf921"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F922  0xf922
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F922  L"\uf922"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F922  U"\uf922"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F923  0xf923
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F923  L"\uf923"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F923  U"\uf923"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F924  0xf924
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F924  L"\uf924"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F924  U"\uf924"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F925  0xf925
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F925  L"\uf925"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F925  U"\uf925"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F926  0xf926
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F926  L"\uf926"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F926  U"\uf926"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F927  0xf927
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F927  L"\uf927"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F927  U"\uf927"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F928  0xf928
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F928  L"\uf928"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F928  U"\uf928"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F929  0xf929
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F929  L"\uf929"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F929  U"\uf929"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F92A  0xf92a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92A  L"\uf92a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92A  U"\uf92a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F92B  0xf92b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92B  L"\uf92b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92B  U"\uf92b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F92C  0xf92c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92C  L"\uf92c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92C  U"\uf92c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F92D  0xf92d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92D  L"\uf92d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92D  U"\uf92d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F92E  0xf92e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92E  L"\uf92e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92E  U"\uf92e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F92F  0xf92f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92F  L"\uf92f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F92F  U"\uf92f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F930  0xf930
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F930  L"\uf930"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F930  U"\uf930"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F931  0xf931
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F931  L"\uf931"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F931  U"\uf931"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F932  0xf932
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F932  L"\uf932"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F932  U"\uf932"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F933  0xf933
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F933  L"\uf933"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F933  U"\uf933"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F934  0xf934
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F934  L"\uf934"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F934  U"\uf934"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F935  0xf935
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F935  L"\uf935"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F935  U"\uf935"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F936  0xf936
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F936  L"\uf936"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F936  U"\uf936"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F937  0xf937
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F937  L"\uf937"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F937  U"\uf937"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F938  0xf938
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F938  L"\uf938"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F938  U"\uf938"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F939  0xf939
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F939  L"\uf939"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F939  U"\uf939"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F93A  0xf93a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93A  L"\uf93a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93A  U"\uf93a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F93B  0xf93b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93B  L"\uf93b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93B  U"\uf93b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F93C  0xf93c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93C  L"\uf93c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93C  U"\uf93c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F93D  0xf93d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93D  L"\uf93d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93D  U"\uf93d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F93E  0xf93e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93E  L"\uf93e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93E  U"\uf93e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F93F  0xf93f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93F  L"\uf93f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F93F  U"\uf93f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F940  0xf940
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F940  L"\uf940"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F940  U"\uf940"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F941  0xf941
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F941  L"\uf941"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F941  U"\uf941"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F942  0xf942
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F942  L"\uf942"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F942  U"\uf942"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F943  0xf943
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F943  L"\uf943"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F943  U"\uf943"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F944  0xf944
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F944  L"\uf944"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F944  U"\uf944"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F945  0xf945
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F945  L"\uf945"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F945  U"\uf945"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F946  0xf946
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F946  L"\uf946"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F946  U"\uf946"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F947  0xf947
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F947  L"\uf947"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F947  U"\uf947"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F948  0xf948
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F948  L"\uf948"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F948  U"\uf948"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F949  0xf949
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F949  L"\uf949"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F949  U"\uf949"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F94A  0xf94a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94A  L"\uf94a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94A  U"\uf94a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F94B  0xf94b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94B  L"\uf94b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94B  U"\uf94b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F94C  0xf94c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94C  L"\uf94c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94C  U"\uf94c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F94D  0xf94d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94D  L"\uf94d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94D  U"\uf94d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F94E  0xf94e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94E  L"\uf94e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94E  U"\uf94e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F94F  0xf94f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94F  L"\uf94f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F94F  U"\uf94f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F950  0xf950
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F950  L"\uf950"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F950  U"\uf950"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F951  0xf951
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F951  L"\uf951"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F951  U"\uf951"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F952  0xf952
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F952  L"\uf952"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F952  U"\uf952"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F953  0xf953
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F953  L"\uf953"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F953  U"\uf953"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F954  0xf954
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F954  L"\uf954"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F954  U"\uf954"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F955  0xf955
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F955  L"\uf955"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F955  U"\uf955"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F956  0xf956
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F956  L"\uf956"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F956  U"\uf956"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F957  0xf957
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F957  L"\uf957"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F957  U"\uf957"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F958  0xf958
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F958  L"\uf958"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F958  U"\uf958"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F959  0xf959
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F959  L"\uf959"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F959  U"\uf959"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F95A  0xf95a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95A  L"\uf95a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95A  U"\uf95a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F95B  0xf95b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95B  L"\uf95b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95B  U"\uf95b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F95C  0xf95c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95C  L"\uf95c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95C  U"\uf95c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F95D  0xf95d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95D  L"\uf95d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95D  U"\uf95d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F95E  0xf95e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95E  L"\uf95e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95E  U"\uf95e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F95F  0xf95f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95F  L"\uf95f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F95F  U"\uf95f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F960  0xf960
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F960  L"\uf960"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F960  U"\uf960"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F961  0xf961
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F961  L"\uf961"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F961  U"\uf961"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F962  0xf962
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F962  L"\uf962"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F962  U"\uf962"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F963  0xf963
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F963  L"\uf963"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F963  U"\uf963"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F964  0xf964
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F964  L"\uf964"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F964  U"\uf964"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F965  0xf965
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F965  L"\uf965"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F965  U"\uf965"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F966  0xf966
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F966  L"\uf966"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F966  U"\uf966"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F967  0xf967
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F967  L"\uf967"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F967  U"\uf967"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F968  0xf968
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F968  L"\uf968"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F968  U"\uf968"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F969  0xf969
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F969  L"\uf969"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F969  U"\uf969"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F96A  0xf96a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96A  L"\uf96a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96A  U"\uf96a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F96B  0xf96b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96B  L"\uf96b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96B  U"\uf96b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F96C  0xf96c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96C  L"\uf96c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96C  U"\uf96c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F96D  0xf96d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96D  L"\uf96d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96D  U"\uf96d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F96E  0xf96e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96E  L"\uf96e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96E  U"\uf96e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F96F  0xf96f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96F  L"\uf96f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F96F  U"\uf96f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F970  0xf970
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F970  L"\uf970"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F970  U"\uf970"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F971  0xf971
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F971  L"\uf971"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F971  U"\uf971"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F972  0xf972
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F972  L"\uf972"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F972  U"\uf972"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F973  0xf973
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F973  L"\uf973"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F973  U"\uf973"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F974  0xf974
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F974  L"\uf974"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F974  U"\uf974"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F975  0xf975
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F975  L"\uf975"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F975  U"\uf975"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F976  0xf976
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F976  L"\uf976"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F976  U"\uf976"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F977  0xf977
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F977  L"\uf977"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F977  U"\uf977"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F978  0xf978
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F978  L"\uf978"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F978  U"\uf978"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F979  0xf979
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F979  L"\uf979"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F979  U"\uf979"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F97A  0xf97a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97A  L"\uf97a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97A  U"\uf97a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F97B  0xf97b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97B  L"\uf97b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97B  U"\uf97b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F97C  0xf97c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97C  L"\uf97c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97C  U"\uf97c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F97D  0xf97d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97D  L"\uf97d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97D  U"\uf97d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F97E  0xf97e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97E  L"\uf97e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97E  U"\uf97e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F97F  0xf97f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97F  L"\uf97f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F97F  U"\uf97f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F980  0xf980
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F980  L"\uf980"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F980  U"\uf980"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F981  0xf981
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F981  L"\uf981"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F981  U"\uf981"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F982  0xf982
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F982  L"\uf982"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F982  U"\uf982"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F983  0xf983
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F983  L"\uf983"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F983  U"\uf983"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F984  0xf984
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F984  L"\uf984"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F984  U"\uf984"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F985  0xf985
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F985  L"\uf985"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F985  U"\uf985"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F986  0xf986
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F986  L"\uf986"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F986  U"\uf986"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F987  0xf987
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F987  L"\uf987"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F987  U"\uf987"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F988  0xf988
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F988  L"\uf988"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F988  U"\uf988"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F989  0xf989
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F989  L"\uf989"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F989  U"\uf989"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F98A  0xf98a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98A  L"\uf98a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98A  U"\uf98a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F98B  0xf98b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98B  L"\uf98b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98B  U"\uf98b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F98C  0xf98c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98C  L"\uf98c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98C  U"\uf98c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F98D  0xf98d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98D  L"\uf98d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98D  U"\uf98d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F98E  0xf98e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98E  L"\uf98e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98E  U"\uf98e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F98F  0xf98f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98F  L"\uf98f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F98F  U"\uf98f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F990  0xf990
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F990  L"\uf990"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F990  U"\uf990"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F991  0xf991
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F991  L"\uf991"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F991  U"\uf991"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F992  0xf992
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F992  L"\uf992"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F992  U"\uf992"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F993  0xf993
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F993  L"\uf993"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F993  U"\uf993"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F994  0xf994
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F994  L"\uf994"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F994  U"\uf994"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F995  0xf995
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F995  L"\uf995"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F995  U"\uf995"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F996  0xf996
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F996  L"\uf996"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F996  U"\uf996"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F997  0xf997
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F997  L"\uf997"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F997  U"\uf997"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F998  0xf998
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F998  L"\uf998"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F998  U"\uf998"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F999  0xf999
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F999  L"\uf999"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F999  U"\uf999"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F99A  0xf99a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99A  L"\uf99a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99A  U"\uf99a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F99B  0xf99b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99B  L"\uf99b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99B  U"\uf99b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F99C  0xf99c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99C  L"\uf99c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99C  U"\uf99c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F99D  0xf99d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99D  L"\uf99d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99D  U"\uf99d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F99E  0xf99e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99E  L"\uf99e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99E  U"\uf99e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F99F  0xf99f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99F  L"\uf99f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F99F  U"\uf99f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9A0  0xf9a0
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A0  L"\uf9a0"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A0  U"\uf9a0"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9A1  0xf9a1
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A1  L"\uf9a1"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A1  U"\uf9a1"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9A2  0xf9a2
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A2  L"\uf9a2"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A2  U"\uf9a2"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9A3  0xf9a3
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A3  L"\uf9a3"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A3  U"\uf9a3"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9A4  0xf9a4
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A4  L"\uf9a4"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A4  U"\uf9a4"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9A5  0xf9a5
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A5  L"\uf9a5"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A5  U"\uf9a5"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9A6  0xf9a6
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A6  L"\uf9a6"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A6  U"\uf9a6"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9A7  0xf9a7
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A7  L"\uf9a7"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A7  U"\uf9a7"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9A8  0xf9a8
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A8  L"\uf9a8"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A8  U"\uf9a8"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9A9  0xf9a9
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A9  L"\uf9a9"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9A9  U"\uf9a9"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9AA  0xf9aa
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AA  L"\uf9aa"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AA  U"\uf9aa"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9AB  0xf9ab
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AB  L"\uf9ab"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AB  U"\uf9ab"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9AC  0xf9ac
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AC  L"\uf9ac"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AC  U"\uf9ac"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9AD  0xf9ad
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AD  L"\uf9ad"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AD  U"\uf9ad"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9AE  0xf9ae
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AE  L"\uf9ae"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AE  U"\uf9ae"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9AF  0xf9af
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AF  L"\uf9af"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9AF  U"\uf9af"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9B0  0xf9b0
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B0  L"\uf9b0"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B0  U"\uf9b0"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9B1  0xf9b1
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B1  L"\uf9b1"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B1  U"\uf9b1"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9B2  0xf9b2
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B2  L"\uf9b2"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B2  U"\uf9b2"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9B3  0xf9b3
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B3  L"\uf9b3"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B3  U"\uf9b3"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9B4  0xf9b4
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B4  L"\uf9b4"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B4  U"\uf9b4"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9B5  0xf9b5
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B5  L"\uf9b5"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B5  U"\uf9b5"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9B6  0xf9b6
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B6  L"\uf9b6"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B6  U"\uf9b6"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9B7  0xf9b7
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B7  L"\uf9b7"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B7  U"\uf9b7"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9B8  0xf9b8
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B8  L"\uf9b8"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B8  U"\uf9b8"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9B9  0xf9b9
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B9  L"\uf9b9"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9B9  U"\uf9b9"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9BA  0xf9ba
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BA  L"\uf9ba"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BA  U"\uf9ba"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9BB  0xf9bb
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BB  L"\uf9bb"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BB  U"\uf9bb"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9BC  0xf9bc
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BC  L"\uf9bc"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BC  U"\uf9bc"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9BD  0xf9bd
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BD  L"\uf9bd"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BD  U"\uf9bd"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9BE  0xf9be
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BE  L"\uf9be"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BE  U"\uf9be"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9BF  0xf9bf
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BF  L"\uf9bf"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9BF  U"\uf9bf"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9C0  0xf9c0
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C0  L"\uf9c0"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C0  U"\uf9c0"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9C1  0xf9c1
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C1  L"\uf9c1"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C1  U"\uf9c1"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9C2  0xf9c2
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C2  L"\uf9c2"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C2  U"\uf9c2"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9C3  0xf9c3
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C3  L"\uf9c3"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C3  U"\uf9c3"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9C4  0xf9c4
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C4  L"\uf9c4"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C4  U"\uf9c4"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9C5  0xf9c5
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C5  L"\uf9c5"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C5  U"\uf9c5"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9C6  0xf9c6
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C6  L"\uf9c6"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C6  U"\uf9c6"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9C7  0xf9c7
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C7  L"\uf9c7"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C7  U"\uf9c7"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9C8  0xf9c8
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C8  L"\uf9c8"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C8  U"\uf9c8"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9C9  0xf9c9
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C9  L"\uf9c9"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9C9  U"\uf9c9"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9CA  0xf9ca
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CA  L"\uf9ca"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CA  U"\uf9ca"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9CB  0xf9cb
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CB  L"\uf9cb"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CB  U"\uf9cb"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9CC  0xf9cc
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CC  L"\uf9cc"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CC  U"\uf9cc"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9CD  0xf9cd
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CD  L"\uf9cd"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CD  U"\uf9cd"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9CE  0xf9ce
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CE  L"\uf9ce"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CE  U"\uf9ce"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9CF  0xf9cf
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CF  L"\uf9cf"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9CF  U"\uf9cf"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9D0  0xf9d0
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D0  L"\uf9d0"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D0  U"\uf9d0"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9D1  0xf9d1
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D1  L"\uf9d1"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D1  U"\uf9d1"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9D2  0xf9d2
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D2  L"\uf9d2"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D2  U"\uf9d2"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9D3  0xf9d3
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D3  L"\uf9d3"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D3  U"\uf9d3"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9D4  0xf9d4
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D4  L"\uf9d4"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D4  U"\uf9d4"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9D5  0xf9d5
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D5  L"\uf9d5"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D5  U"\uf9d5"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9D6  0xf9d6
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D6  L"\uf9d6"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D6  U"\uf9d6"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9D7  0xf9d7
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D7  L"\uf9d7"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D7  U"\uf9d7"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9D8  0xf9d8
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D8  L"\uf9d8"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D8  U"\uf9d8"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9D9  0xf9d9
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D9  L"\uf9d9"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9D9  U"\uf9d9"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9DA  0xf9da
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DA  L"\uf9da"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DA  U"\uf9da"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9DB  0xf9db
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DB  L"\uf9db"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DB  U"\uf9db"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9DC  0xf9dc
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DC  L"\uf9dc"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DC  U"\uf9dc"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9DD  0xf9dd
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DD  L"\uf9dd"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DD  U"\uf9dd"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9DE  0xf9de
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DE  L"\uf9de"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DE  U"\uf9de"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9DF  0xf9df
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DF  L"\uf9df"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9DF  U"\uf9df"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9E0  0xf9e0
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E0  L"\uf9e0"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E0  U"\uf9e0"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9E1  0xf9e1
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E1  L"\uf9e1"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E1  U"\uf9e1"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9E2  0xf9e2
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E2  L"\uf9e2"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E2  U"\uf9e2"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9E3  0xf9e3
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E3  L"\uf9e3"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E3  U"\uf9e3"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9E4  0xf9e4
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E4  L"\uf9e4"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E4  U"\uf9e4"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9E5  0xf9e5
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E5  L"\uf9e5"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E5  U"\uf9e5"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9E6  0xf9e6
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E6  L"\uf9e6"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E6  U"\uf9e6"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9E7  0xf9e7
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E7  L"\uf9e7"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E7  U"\uf9e7"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9E8  0xf9e8
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E8  L"\uf9e8"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E8  U"\uf9e8"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9E9  0xf9e9
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E9  L"\uf9e9"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9E9  U"\uf9e9"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9EA  0xf9ea
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9EA  L"\uf9ea"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9EA  U"\uf9ea"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9EB  0xf9eb
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9EB  L"\uf9eb"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9EB  U"\uf9eb"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9EC  0xf9ec
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9EC  L"\uf9ec"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9EC  U"\uf9ec"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9ED  0xf9ed
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9ED  L"\uf9ed"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9ED  U"\uf9ed"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9EE  0xf9ee
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9EE  L"\uf9ee"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9EE  U"\uf9ee"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9EF  0xf9ef
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9EF  L"\uf9ef"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9EF  U"\uf9ef"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9F0  0xf9f0
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F0  L"\uf9f0"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F0  U"\uf9f0"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9F1  0xf9f1
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F1  L"\uf9f1"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F1  U"\uf9f1"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9F2  0xf9f2
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F2  L"\uf9f2"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F2  U"\uf9f2"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9F3  0xf9f3
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F3  L"\uf9f3"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F3  U"\uf9f3"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9F4  0xf9f4
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F4  L"\uf9f4"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F4  U"\uf9f4"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9F5  0xf9f5
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F5  L"\uf9f5"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F5  U"\uf9f5"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9F6  0xf9f6
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F6  L"\uf9f6"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F6  U"\uf9f6"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9F7  0xf9f7
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F7  L"\uf9f7"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F7  U"\uf9f7"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9F8  0xf9f8
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F8  L"\uf9f8"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F8  U"\uf9f8"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9F9  0xf9f9
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F9  L"\uf9f9"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9F9  U"\uf9f9"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9FA  0xf9fa
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FA  L"\uf9fa"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FA  U"\uf9fa"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9FB  0xf9fb
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FB  L"\uf9fb"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FB  U"\uf9fb"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9FC  0xf9fc
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FC  L"\uf9fc"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FC  U"\uf9fc"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9FD  0xf9fd
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FD  L"\uf9fd"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FD  U"\uf9fd"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9FE  0xf9fe
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FE  L"\uf9fe"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FE  U"\uf9fe"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_F9FF  0xf9ff
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FF  L"\uf9ff"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_F9FF  U"\uf9ff"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA00  0xfa00
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA00  L"\ufa00"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA00  U"\ufa00"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA01  0xfa01
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA01  L"\ufa01"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA01  U"\ufa01"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA02  0xfa02
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA02  L"\ufa02"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA02  U"\ufa02"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA03  0xfa03
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA03  L"\ufa03"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA03  U"\ufa03"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA04  0xfa04
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA04  L"\ufa04"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA04  U"\ufa04"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA05  0xfa05
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA05  L"\ufa05"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA05  U"\ufa05"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA06  0xfa06
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA06  L"\ufa06"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA06  U"\ufa06"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA07  0xfa07
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA07  L"\ufa07"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA07  U"\ufa07"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA08  0xfa08
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA08  L"\ufa08"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA08  U"\ufa08"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA09  0xfa09
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA09  L"\ufa09"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA09  U"\ufa09"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA0A  0xfa0a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0A  L"\ufa0a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0A  U"\ufa0a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA0B  0xfa0b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0B  L"\ufa0b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0B  U"\ufa0b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA0C  0xfa0c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0C  L"\ufa0c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0C  U"\ufa0c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA0D  0xfa0d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0D  L"\ufa0d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0D  U"\ufa0d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA0E  0xfa0e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0E  L"\ufa0e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0E  U"\ufa0e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA0F  0xfa0f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0F  L"\ufa0f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA0F  U"\ufa0f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA10  0xfa10
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA10  L"\ufa10"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA10  U"\ufa10"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA11  0xfa11
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA11  L"\ufa11"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA11  U"\ufa11"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA12  0xfa12
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA12  L"\ufa12"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA12  U"\ufa12"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA13  0xfa13
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA13  L"\ufa13"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA13  U"\ufa13"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA14  0xfa14
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA14  L"\ufa14"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA14  U"\ufa14"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA15  0xfa15
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA15  L"\ufa15"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA15  U"\ufa15"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA16  0xfa16
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA16  L"\ufa16"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA16  U"\ufa16"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA17  0xfa17
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA17  L"\ufa17"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA17  U"\ufa17"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA18  0xfa18
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA18  L"\ufa18"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA18  U"\ufa18"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA19  0xfa19
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA19  L"\ufa19"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA19  U"\ufa19"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA1A  0xfa1a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1A  L"\ufa1a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1A  U"\ufa1a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA1B  0xfa1b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1B  L"\ufa1b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1B  U"\ufa1b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA1C  0xfa1c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1C  L"\ufa1c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1C  U"\ufa1c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA1D  0xfa1d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1D  L"\ufa1d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1D  U"\ufa1d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA1E  0xfa1e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1E  L"\ufa1e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1E  U"\ufa1e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA1F  0xfa1f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1F  L"\ufa1f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA1F  U"\ufa1f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA20  0xfa20
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA20  L"\ufa20"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA20  U"\ufa20"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA21  0xfa21
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA21  L"\ufa21"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA21  U"\ufa21"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA22  0xfa22
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA22  L"\ufa22"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA22  U"\ufa22"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA23  0xfa23
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA23  L"\ufa23"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA23  U"\ufa23"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA24  0xfa24
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA24  L"\ufa24"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA24  U"\ufa24"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA25  0xfa25
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA25  L"\ufa25"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA25  U"\ufa25"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA26  0xfa26
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA26  L"\ufa26"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA26  U"\ufa26"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA27  0xfa27
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA27  L"\ufa27"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA27  U"\ufa27"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA28  0xfa28
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA28  L"\ufa28"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA28  U"\ufa28"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA29  0xfa29
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA29  L"\ufa29"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA29  U"\ufa29"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA2A  0xfa2a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA2A  L"\ufa2a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA2A  U"\ufa2a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA2B  0xfa2b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA2B  L"\ufa2b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA2B  U"\ufa2b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA2C  0xfa2c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA2C  L"\ufa2c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA2C  U"\ufa2c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA2D  0xfa2d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA2D  L"\ufa2d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA2D  U"\ufa2d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA30  0xfa30
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA30  L"\ufa30"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA30  U"\ufa30"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA31  0xfa31
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA31  L"\ufa31"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA31  U"\ufa31"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA32  0xfa32
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA32  L"\ufa32"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA32  U"\ufa32"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA33  0xfa33
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA33  L"\ufa33"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA33  U"\ufa33"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA34  0xfa34
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA34  L"\ufa34"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA34  U"\ufa34"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA35  0xfa35
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA35  L"\ufa35"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA35  U"\ufa35"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA36  0xfa36
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA36  L"\ufa36"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA36  U"\ufa36"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA37  0xfa37
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA37  L"\ufa37"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA37  U"\ufa37"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA38  0xfa38
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA38  L"\ufa38"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA38  U"\ufa38"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA39  0xfa39
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA39  L"\ufa39"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA39  U"\ufa39"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA3A  0xfa3a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3A  L"\ufa3a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3A  U"\ufa3a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA3B  0xfa3b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3B  L"\ufa3b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3B  U"\ufa3b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA3C  0xfa3c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3C  L"\ufa3c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3C  U"\ufa3c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA3D  0xfa3d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3D  L"\ufa3d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3D  U"\ufa3d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA3E  0xfa3e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3E  L"\ufa3e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3E  U"\ufa3e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA3F  0xfa3f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3F  L"\ufa3f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA3F  U"\ufa3f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA40  0xfa40
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA40  L"\ufa40"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA40  U"\ufa40"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA41  0xfa41
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA41  L"\ufa41"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA41  U"\ufa41"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA42  0xfa42
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA42  L"\ufa42"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA42  U"\ufa42"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA43  0xfa43
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA43  L"\ufa43"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA43  U"\ufa43"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA44  0xfa44
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA44  L"\ufa44"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA44  U"\ufa44"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA45  0xfa45
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA45  L"\ufa45"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA45  U"\ufa45"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA46  0xfa46
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA46  L"\ufa46"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA46  U"\ufa46"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA47  0xfa47
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA47  L"\ufa47"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA47  U"\ufa47"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA48  0xfa48
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA48  L"\ufa48"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA48  U"\ufa48"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA49  0xfa49
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA49  L"\ufa49"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA49  U"\ufa49"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA4A  0xfa4a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4A  L"\ufa4a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4A  U"\ufa4a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA4B  0xfa4b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4B  L"\ufa4b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4B  U"\ufa4b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA4C  0xfa4c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4C  L"\ufa4c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4C  U"\ufa4c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA4D  0xfa4d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4D  L"\ufa4d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4D  U"\ufa4d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA4E  0xfa4e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4E  L"\ufa4e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4E  U"\ufa4e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA4F  0xfa4f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4F  L"\ufa4f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA4F  U"\ufa4f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA50  0xfa50
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA50  L"\ufa50"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA50  U"\ufa50"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA51  0xfa51
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA51  L"\ufa51"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA51  U"\ufa51"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA52  0xfa52
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA52  L"\ufa52"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA52  U"\ufa52"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA53  0xfa53
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA53  L"\ufa53"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA53  U"\ufa53"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA54  0xfa54
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA54  L"\ufa54"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA54  U"\ufa54"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA55  0xfa55
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA55  L"\ufa55"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA55  U"\ufa55"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA56  0xfa56
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA56  L"\ufa56"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA56  U"\ufa56"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA57  0xfa57
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA57  L"\ufa57"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA57  U"\ufa57"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA58  0xfa58
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA58  L"\ufa58"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA58  U"\ufa58"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA59  0xfa59
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA59  L"\ufa59"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA59  U"\ufa59"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA5A  0xfa5a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5A  L"\ufa5a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5A  U"\ufa5a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA5B  0xfa5b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5B  L"\ufa5b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5B  U"\ufa5b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA5C  0xfa5c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5C  L"\ufa5c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5C  U"\ufa5c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA5D  0xfa5d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5D  L"\ufa5d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5D  U"\ufa5d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA5E  0xfa5e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5E  L"\ufa5e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5E  U"\ufa5e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA5F  0xfa5f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5F  L"\ufa5f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA5F  U"\ufa5f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA60  0xfa60
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA60  L"\ufa60"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA60  U"\ufa60"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA61  0xfa61
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA61  L"\ufa61"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA61  U"\ufa61"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA62  0xfa62
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA62  L"\ufa62"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA62  U"\ufa62"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA63  0xfa63
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA63  L"\ufa63"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA63  U"\ufa63"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA64  0xfa64
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA64  L"\ufa64"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA64  U"\ufa64"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA65  0xfa65
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA65  L"\ufa65"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA65  U"\ufa65"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA66  0xfa66
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA66  L"\ufa66"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA66  U"\ufa66"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA67  0xfa67
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA67  L"\ufa67"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA67  U"\ufa67"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA68  0xfa68
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA68  L"\ufa68"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA68  U"\ufa68"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA69  0xfa69
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA69  L"\ufa69"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA69  U"\ufa69"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA6A  0xfa6a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA6A  L"\ufa6a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA6A  U"\ufa6a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA70  0xfa70
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA70  L"\ufa70"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA70  U"\ufa70"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA71  0xfa71
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA71  L"\ufa71"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA71  U"\ufa71"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA72  0xfa72
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA72  L"\ufa72"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA72  U"\ufa72"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA73  0xfa73
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA73  L"\ufa73"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA73  U"\ufa73"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA74  0xfa74
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA74  L"\ufa74"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA74  U"\ufa74"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA75  0xfa75
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA75  L"\ufa75"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA75  U"\ufa75"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA76  0xfa76
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA76  L"\ufa76"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA76  U"\ufa76"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA77  0xfa77
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA77  L"\ufa77"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA77  U"\ufa77"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA78  0xfa78
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA78  L"\ufa78"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA78  U"\ufa78"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA79  0xfa79
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA79  L"\ufa79"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA79  U"\ufa79"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA7A  0xfa7a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7A  L"\ufa7a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7A  U"\ufa7a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA7B  0xfa7b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7B  L"\ufa7b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7B  U"\ufa7b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA7C  0xfa7c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7C  L"\ufa7c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7C  U"\ufa7c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA7D  0xfa7d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7D  L"\ufa7d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7D  U"\ufa7d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA7E  0xfa7e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7E  L"\ufa7e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7E  U"\ufa7e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA7F  0xfa7f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7F  L"\ufa7f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA7F  U"\ufa7f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA80  0xfa80
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA80  L"\ufa80"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA80  U"\ufa80"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA81  0xfa81
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA81  L"\ufa81"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA81  U"\ufa81"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA82  0xfa82
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA82  L"\ufa82"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA82  U"\ufa82"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA83  0xfa83
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA83  L"\ufa83"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA83  U"\ufa83"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA84  0xfa84
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA84  L"\ufa84"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA84  U"\ufa84"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA85  0xfa85
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA85  L"\ufa85"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA85  U"\ufa85"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA86  0xfa86
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA86  L"\ufa86"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA86  U"\ufa86"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA87  0xfa87
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA87  L"\ufa87"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA87  U"\ufa87"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA88  0xfa88
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA88  L"\ufa88"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA88  U"\ufa88"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA89  0xfa89
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA89  L"\ufa89"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA89  U"\ufa89"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA8A  0xfa8a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8A  L"\ufa8a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8A  U"\ufa8a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA8B  0xfa8b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8B  L"\ufa8b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8B  U"\ufa8b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA8C  0xfa8c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8C  L"\ufa8c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8C  U"\ufa8c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA8D  0xfa8d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8D  L"\ufa8d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8D  U"\ufa8d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA8E  0xfa8e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8E  L"\ufa8e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8E  U"\ufa8e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA8F  0xfa8f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8F  L"\ufa8f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA8F  U"\ufa8f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA90  0xfa90
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA90  L"\ufa90"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA90  U"\ufa90"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA91  0xfa91
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA91  L"\ufa91"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA91  U"\ufa91"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA92  0xfa92
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA92  L"\ufa92"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA92  U"\ufa92"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA93  0xfa93
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA93  L"\ufa93"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA93  U"\ufa93"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA94  0xfa94
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA94  L"\ufa94"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA94  U"\ufa94"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA95  0xfa95
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA95  L"\ufa95"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA95  U"\ufa95"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA96  0xfa96
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA96  L"\ufa96"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA96  U"\ufa96"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA97  0xfa97
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA97  L"\ufa97"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA97  U"\ufa97"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA98  0xfa98
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA98  L"\ufa98"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA98  U"\ufa98"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA99  0xfa99
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA99  L"\ufa99"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA99  U"\ufa99"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA9A  0xfa9a
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9A  L"\ufa9a"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9A  U"\ufa9a"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA9B  0xfa9b
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9B  L"\ufa9b"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9B  U"\ufa9b"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA9C  0xfa9c
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9C  L"\ufa9c"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9C  U"\ufa9c"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA9D  0xfa9d
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9D  L"\ufa9d"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9D  U"\ufa9d"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA9E  0xfa9e
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9E  L"\ufa9e"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9E  U"\ufa9e"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FA9F  0xfa9f
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9F  L"\ufa9f"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FA9F  U"\ufa9f"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAA0  0xfaa0
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA0  L"\ufaa0"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA0  U"\ufaa0"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAA1  0xfaa1
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA1  L"\ufaa1"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA1  U"\ufaa1"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAA2  0xfaa2
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA2  L"\ufaa2"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA2  U"\ufaa2"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAA3  0xfaa3
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA3  L"\ufaa3"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA3  U"\ufaa3"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAA4  0xfaa4
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA4  L"\ufaa4"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA4  U"\ufaa4"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAA5  0xfaa5
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA5  L"\ufaa5"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA5  U"\ufaa5"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAA6  0xfaa6
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA6  L"\ufaa6"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA6  U"\ufaa6"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAA7  0xfaa7
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA7  L"\ufaa7"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA7  U"\ufaa7"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAA8  0xfaa8
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA8  L"\ufaa8"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA8  U"\ufaa8"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAA9  0xfaa9
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA9  L"\ufaa9"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAA9  U"\ufaa9"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAAA  0xfaaa
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAA  L"\ufaaa"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAA  U"\ufaaa"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAAB  0xfaab
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAB  L"\ufaab"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAB  U"\ufaab"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAAC  0xfaac
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAC  L"\ufaac"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAC  U"\ufaac"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAAD  0xfaad
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAD  L"\ufaad"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAD  U"\ufaad"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAAE  0xfaae
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAE  L"\ufaae"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAE  U"\ufaae"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAAF  0xfaaf
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAF  L"\ufaaf"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAAF  U"\ufaaf"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAB0  0xfab0
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB0  L"\ufab0"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB0  U"\ufab0"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAB1  0xfab1
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB1  L"\ufab1"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB1  U"\ufab1"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAB2  0xfab2
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB2  L"\ufab2"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB2  U"\ufab2"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAB3  0xfab3
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB3  L"\ufab3"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB3  U"\ufab3"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAB4  0xfab4
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB4  L"\ufab4"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB4  U"\ufab4"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAB5  0xfab5
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB5  L"\ufab5"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB5  U"\ufab5"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAB6  0xfab6
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB6  L"\ufab6"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB6  U"\ufab6"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAB7  0xfab7
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB7  L"\ufab7"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB7  U"\ufab7"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAB8  0xfab8
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB8  L"\ufab8"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB8  U"\ufab8"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAB9  0xfab9
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB9  L"\ufab9"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAB9  U"\ufab9"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FABA  0xfaba
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABA  L"\ufaba"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABA  U"\ufaba"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FABB  0xfabb
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABB  L"\ufabb"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABB  U"\ufabb"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FABC  0xfabc
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABC  L"\ufabc"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABC  U"\ufabc"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FABD  0xfabd
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABD  L"\ufabd"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABD  U"\ufabd"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FABE  0xfabe
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABE  L"\ufabe"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABE  U"\ufabe"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FABF  0xfabf
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABF  L"\ufabf"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FABF  U"\ufabf"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAC0  0xfac0
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC0  L"\ufac0"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC0  U"\ufac0"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAC1  0xfac1
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC1  L"\ufac1"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC1  U"\ufac1"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAC2  0xfac2
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC2  L"\ufac2"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC2  U"\ufac2"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAC3  0xfac3
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC3  L"\ufac3"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC3  U"\ufac3"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAC4  0xfac4
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC4  L"\ufac4"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC4  U"\ufac4"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAC5  0xfac5
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC5  L"\ufac5"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC5  U"\ufac5"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAC6  0xfac6
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC6  L"\ufac6"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC6  U"\ufac6"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAC7  0xfac7
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC7  L"\ufac7"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC7  U"\ufac7"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAC8  0xfac8
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC8  L"\ufac8"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC8  U"\ufac8"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAC9  0xfac9
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC9  L"\ufac9"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAC9  U"\ufac9"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FACA  0xfaca
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACA  L"\ufaca"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACA  U"\ufaca"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FACB  0xfacb
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACB  L"\ufacb"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACB  U"\ufacb"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FACC  0xfacc
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACC  L"\ufacc"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACC  U"\ufacc"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FACD  0xfacd
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACD  L"\ufacd"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACD  U"\ufacd"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FACE  0xface
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACE  L"\uface"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACE  U"\uface"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FACF  0xfacf
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACF  L"\ufacf"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FACF  U"\ufacf"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAD0  0xfad0
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD0  L"\ufad0"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD0  U"\ufad0"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAD1  0xfad1
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD1  L"\ufad1"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD1  U"\ufad1"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAD2  0xfad2
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD2  L"\ufad2"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD2  U"\ufad2"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAD3  0xfad3
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD3  L"\ufad3"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD3  U"\ufad3"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAD4  0xfad4
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD4  L"\ufad4"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD4  U"\ufad4"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAD5  0xfad5
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD5  L"\ufad5"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD5  U"\ufad5"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAD6  0xfad6
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD6  L"\ufad6"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD6  U"\ufad6"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAD7  0xfad7
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD7  L"\ufad7"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD7  U"\ufad7"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAD8  0xfad8
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD8  L"\ufad8"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD8  U"\ufad8"
 #define UNICODE_CJK_COMPATIBILITY_IDEOGRAPH_FAD9  0xfad9
-#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD9  L"\ufad9"
+#define UNITEXT_CJK_COMPATIBILITY_IDEOGRAPH_FAD9  U"\ufad9"
 #define UNICODE_LATIN_SMALL_LIGATURE_FF  0xfb00
-#define UNITEXT_LATIN_SMALL_LIGATURE_FF  L"\ufb00"
+#define UNITEXT_LATIN_SMALL_LIGATURE_FF  U"\ufb00"
 #define UNICODE_LATIN_SMALL_LIGATURE_FI  0xfb01
-#define UNITEXT_LATIN_SMALL_LIGATURE_FI  L"\ufb01"
+#define UNITEXT_LATIN_SMALL_LIGATURE_FI  U"\ufb01"
 #define UNICODE_LATIN_SMALL_LIGATURE_FL  0xfb02
-#define UNITEXT_LATIN_SMALL_LIGATURE_FL  L"\ufb02"
+#define UNITEXT_LATIN_SMALL_LIGATURE_FL  U"\ufb02"
 #define UNICODE_LATIN_SMALL_LIGATURE_FFI  0xfb03
-#define UNITEXT_LATIN_SMALL_LIGATURE_FFI  L"\ufb03"
+#define UNITEXT_LATIN_SMALL_LIGATURE_FFI  U"\ufb03"
 #define UNICODE_LATIN_SMALL_LIGATURE_FFL  0xfb04
-#define UNITEXT_LATIN_SMALL_LIGATURE_FFL  L"\ufb04"
+#define UNITEXT_LATIN_SMALL_LIGATURE_FFL  U"\ufb04"
 #define UNICODE_LATIN_SMALL_LIGATURE_LONG_S_T  0xfb05
-#define UNITEXT_LATIN_SMALL_LIGATURE_LONG_S_T  L"\ufb05"
+#define UNITEXT_LATIN_SMALL_LIGATURE_LONG_S_T  U"\ufb05"
 #define UNICODE_LATIN_SMALL_LIGATURE_ST  0xfb06
-#define UNITEXT_LATIN_SMALL_LIGATURE_ST  L"\ufb06"
+#define UNITEXT_LATIN_SMALL_LIGATURE_ST  U"\ufb06"
 #define UNICODE_ARMENIAN_SMALL_LIGATURE_MEN_NOW  0xfb13
-#define UNITEXT_ARMENIAN_SMALL_LIGATURE_MEN_NOW  L"\ufb13"
+#define UNITEXT_ARMENIAN_SMALL_LIGATURE_MEN_NOW  U"\ufb13"
 #define UNICODE_ARMENIAN_SMALL_LIGATURE_MEN_ECH  0xfb14
-#define UNITEXT_ARMENIAN_SMALL_LIGATURE_MEN_ECH  L"\ufb14"
+#define UNITEXT_ARMENIAN_SMALL_LIGATURE_MEN_ECH  U"\ufb14"
 #define UNICODE_ARMENIAN_SMALL_LIGATURE_MEN_INI  0xfb15
-#define UNITEXT_ARMENIAN_SMALL_LIGATURE_MEN_INI  L"\ufb15"
+#define UNITEXT_ARMENIAN_SMALL_LIGATURE_MEN_INI  U"\ufb15"
 #define UNICODE_ARMENIAN_SMALL_LIGATURE_VEW_NOW  0xfb16
-#define UNITEXT_ARMENIAN_SMALL_LIGATURE_VEW_NOW  L"\ufb16"
+#define UNITEXT_ARMENIAN_SMALL_LIGATURE_VEW_NOW  U"\ufb16"
 #define UNICODE_ARMENIAN_SMALL_LIGATURE_MEN_XEH  0xfb17
-#define UNITEXT_ARMENIAN_SMALL_LIGATURE_MEN_XEH  L"\ufb17"
+#define UNITEXT_ARMENIAN_SMALL_LIGATURE_MEN_XEH  U"\ufb17"
 #define UNICODE_HEBREW_LETTER_YOD_WITH_HIRIQ  0xfb1d
-#define UNITEXT_HEBREW_LETTER_YOD_WITH_HIRIQ  L"\ufb1d"
+#define UNITEXT_HEBREW_LETTER_YOD_WITH_HIRIQ  U"\ufb1d"
 #define UNICODE_HEBREW_POINT_JUDEO_SPANISH_VARIKA  0xfb1e
-#define UNITEXT_HEBREW_POINT_JUDEO_SPANISH_VARIKA  L"\ufb1e"
+#define UNITEXT_HEBREW_POINT_JUDEO_SPANISH_VARIKA  U"\ufb1e"
 #define UNICODE_HEBREW_LIGATURE_YIDDISH_YOD_YOD_PATAH  0xfb1f
-#define UNITEXT_HEBREW_LIGATURE_YIDDISH_YOD_YOD_PATAH  L"\ufb1f"
+#define UNITEXT_HEBREW_LIGATURE_YIDDISH_YOD_YOD_PATAH  U"\ufb1f"
 #define UNICODE_HEBREW_LETTER_ALTERNATIVE_AYIN  0xfb20
-#define UNITEXT_HEBREW_LETTER_ALTERNATIVE_AYIN  L"\ufb20"
+#define UNITEXT_HEBREW_LETTER_ALTERNATIVE_AYIN  U"\ufb20"
 #define UNICODE_HEBREW_LETTER_WIDE_ALEF  0xfb21
-#define UNITEXT_HEBREW_LETTER_WIDE_ALEF  L"\ufb21"
+#define UNITEXT_HEBREW_LETTER_WIDE_ALEF  U"\ufb21"
 #define UNICODE_HEBREW_LETTER_WIDE_DALET  0xfb22
-#define UNITEXT_HEBREW_LETTER_WIDE_DALET  L"\ufb22"
+#define UNITEXT_HEBREW_LETTER_WIDE_DALET  U"\ufb22"
 #define UNICODE_HEBREW_LETTER_WIDE_HE  0xfb23
-#define UNITEXT_HEBREW_LETTER_WIDE_HE  L"\ufb23"
+#define UNITEXT_HEBREW_LETTER_WIDE_HE  U"\ufb23"
 #define UNICODE_HEBREW_LETTER_WIDE_KAF  0xfb24
-#define UNITEXT_HEBREW_LETTER_WIDE_KAF  L"\ufb24"
+#define UNITEXT_HEBREW_LETTER_WIDE_KAF  U"\ufb24"
 #define UNICODE_HEBREW_LETTER_WIDE_LAMED  0xfb25
-#define UNITEXT_HEBREW_LETTER_WIDE_LAMED  L"\ufb25"
+#define UNITEXT_HEBREW_LETTER_WIDE_LAMED  U"\ufb25"
 #define UNICODE_HEBREW_LETTER_WIDE_FINAL_MEM  0xfb26
-#define UNITEXT_HEBREW_LETTER_WIDE_FINAL_MEM  L"\ufb26"
+#define UNITEXT_HEBREW_LETTER_WIDE_FINAL_MEM  U"\ufb26"
 #define UNICODE_HEBREW_LETTER_WIDE_RESH  0xfb27
-#define UNITEXT_HEBREW_LETTER_WIDE_RESH  L"\ufb27"
+#define UNITEXT_HEBREW_LETTER_WIDE_RESH  U"\ufb27"
 #define UNICODE_HEBREW_LETTER_WIDE_TAV  0xfb28
-#define UNITEXT_HEBREW_LETTER_WIDE_TAV  L"\ufb28"
+#define UNITEXT_HEBREW_LETTER_WIDE_TAV  U"\ufb28"
 #define UNICODE_HEBREW_LETTER_ALTERNATIVE_PLUS_SIGN  0xfb29
-#define UNITEXT_HEBREW_LETTER_ALTERNATIVE_PLUS_SIGN  L"\ufb29"
+#define UNITEXT_HEBREW_LETTER_ALTERNATIVE_PLUS_SIGN  U"\ufb29"
 #define UNICODE_HEBREW_LETTER_SHIN_WITH_SHIN_DOT  0xfb2a
-#define UNITEXT_HEBREW_LETTER_SHIN_WITH_SHIN_DOT  L"\ufb2a"
+#define UNITEXT_HEBREW_LETTER_SHIN_WITH_SHIN_DOT  U"\ufb2a"
 #define UNICODE_HEBREW_LETTER_SHIN_WITH_SIN_DOT  0xfb2b
-#define UNITEXT_HEBREW_LETTER_SHIN_WITH_SIN_DOT  L"\ufb2b"
+#define UNITEXT_HEBREW_LETTER_SHIN_WITH_SIN_DOT  U"\ufb2b"
 #define UNICODE_HEBREW_LETTER_SHIN_WITH_DAGESH_AND_SHIN_DOT  0xfb2c
-#define UNITEXT_HEBREW_LETTER_SHIN_WITH_DAGESH_AND_SHIN_DOT  L"\ufb2c"
+#define UNITEXT_HEBREW_LETTER_SHIN_WITH_DAGESH_AND_SHIN_DOT  U"\ufb2c"
 #define UNICODE_HEBREW_LETTER_SHIN_WITH_DAGESH_AND_SIN_DOT  0xfb2d
-#define UNITEXT_HEBREW_LETTER_SHIN_WITH_DAGESH_AND_SIN_DOT  L"\ufb2d"
+#define UNITEXT_HEBREW_LETTER_SHIN_WITH_DAGESH_AND_SIN_DOT  U"\ufb2d"
 #define UNICODE_HEBREW_LETTER_ALEF_WITH_PATAH  0xfb2e
-#define UNITEXT_HEBREW_LETTER_ALEF_WITH_PATAH  L"\ufb2e"
+#define UNITEXT_HEBREW_LETTER_ALEF_WITH_PATAH  U"\ufb2e"
 #define UNICODE_HEBREW_LETTER_ALEF_WITH_QAMATS  0xfb2f
-#define UNITEXT_HEBREW_LETTER_ALEF_WITH_QAMATS  L"\ufb2f"
+#define UNITEXT_HEBREW_LETTER_ALEF_WITH_QAMATS  U"\ufb2f"
 #define UNICODE_HEBREW_LETTER_ALEF_WITH_MAPIQ  0xfb30
-#define UNITEXT_HEBREW_LETTER_ALEF_WITH_MAPIQ  L"\ufb30"
+#define UNITEXT_HEBREW_LETTER_ALEF_WITH_MAPIQ  U"\ufb30"
 #define UNICODE_HEBREW_LETTER_BET_WITH_DAGESH  0xfb31
-#define UNITEXT_HEBREW_LETTER_BET_WITH_DAGESH  L"\ufb31"
+#define UNITEXT_HEBREW_LETTER_BET_WITH_DAGESH  U"\ufb31"
 #define UNICODE_HEBREW_LETTER_GIMEL_WITH_DAGESH  0xfb32
-#define UNITEXT_HEBREW_LETTER_GIMEL_WITH_DAGESH  L"\ufb32"
+#define UNITEXT_HEBREW_LETTER_GIMEL_WITH_DAGESH  U"\ufb32"
 #define UNICODE_HEBREW_LETTER_DALET_WITH_DAGESH  0xfb33
-#define UNITEXT_HEBREW_LETTER_DALET_WITH_DAGESH  L"\ufb33"
+#define UNITEXT_HEBREW_LETTER_DALET_WITH_DAGESH  U"\ufb33"
 #define UNICODE_HEBREW_LETTER_HE_WITH_MAPIQ  0xfb34
-#define UNITEXT_HEBREW_LETTER_HE_WITH_MAPIQ  L"\ufb34"
+#define UNITEXT_HEBREW_LETTER_HE_WITH_MAPIQ  U"\ufb34"
 #define UNICODE_HEBREW_LETTER_VAV_WITH_DAGESH  0xfb35
-#define UNITEXT_HEBREW_LETTER_VAV_WITH_DAGESH  L"\ufb35"
+#define UNITEXT_HEBREW_LETTER_VAV_WITH_DAGESH  U"\ufb35"
 #define UNICODE_HEBREW_LETTER_ZAYIN_WITH_DAGESH  0xfb36
-#define UNITEXT_HEBREW_LETTER_ZAYIN_WITH_DAGESH  L"\ufb36"
+#define UNITEXT_HEBREW_LETTER_ZAYIN_WITH_DAGESH  U"\ufb36"
 #define UNICODE_HEBREW_LETTER_TET_WITH_DAGESH  0xfb38
-#define UNITEXT_HEBREW_LETTER_TET_WITH_DAGESH  L"\ufb38"
+#define UNITEXT_HEBREW_LETTER_TET_WITH_DAGESH  U"\ufb38"
 #define UNICODE_HEBREW_LETTER_YOD_WITH_DAGESH  0xfb39
-#define UNITEXT_HEBREW_LETTER_YOD_WITH_DAGESH  L"\ufb39"
+#define UNITEXT_HEBREW_LETTER_YOD_WITH_DAGESH  U"\ufb39"
 #define UNICODE_HEBREW_LETTER_FINAL_KAF_WITH_DAGESH  0xfb3a
-#define UNITEXT_HEBREW_LETTER_FINAL_KAF_WITH_DAGESH  L"\ufb3a"
+#define UNITEXT_HEBREW_LETTER_FINAL_KAF_WITH_DAGESH  U"\ufb3a"
 #define UNICODE_HEBREW_LETTER_KAF_WITH_DAGESH  0xfb3b
-#define UNITEXT_HEBREW_LETTER_KAF_WITH_DAGESH  L"\ufb3b"
+#define UNITEXT_HEBREW_LETTER_KAF_WITH_DAGESH  U"\ufb3b"
 #define UNICODE_HEBREW_LETTER_LAMED_WITH_DAGESH  0xfb3c
-#define UNITEXT_HEBREW_LETTER_LAMED_WITH_DAGESH  L"\ufb3c"
+#define UNITEXT_HEBREW_LETTER_LAMED_WITH_DAGESH  U"\ufb3c"
 #define UNICODE_HEBREW_LETTER_MEM_WITH_DAGESH  0xfb3e
-#define UNITEXT_HEBREW_LETTER_MEM_WITH_DAGESH  L"\ufb3e"
+#define UNITEXT_HEBREW_LETTER_MEM_WITH_DAGESH  U"\ufb3e"
 #define UNICODE_HEBREW_LETTER_NUN_WITH_DAGESH  0xfb40
-#define UNITEXT_HEBREW_LETTER_NUN_WITH_DAGESH  L"\ufb40"
+#define UNITEXT_HEBREW_LETTER_NUN_WITH_DAGESH  U"\ufb40"
 #define UNICODE_HEBREW_LETTER_SAMEKH_WITH_DAGESH  0xfb41
-#define UNITEXT_HEBREW_LETTER_SAMEKH_WITH_DAGESH  L"\ufb41"
+#define UNITEXT_HEBREW_LETTER_SAMEKH_WITH_DAGESH  U"\ufb41"
 #define UNICODE_HEBREW_LETTER_FINAL_PE_WITH_DAGESH  0xfb43
-#define UNITEXT_HEBREW_LETTER_FINAL_PE_WITH_DAGESH  L"\ufb43"
+#define UNITEXT_HEBREW_LETTER_FINAL_PE_WITH_DAGESH  U"\ufb43"
 #define UNICODE_HEBREW_LETTER_PE_WITH_DAGESH  0xfb44
-#define UNITEXT_HEBREW_LETTER_PE_WITH_DAGESH  L"\ufb44"
+#define UNITEXT_HEBREW_LETTER_PE_WITH_DAGESH  U"\ufb44"
 #define UNICODE_HEBREW_LETTER_TSADI_WITH_DAGESH  0xfb46
-#define UNITEXT_HEBREW_LETTER_TSADI_WITH_DAGESH  L"\ufb46"
+#define UNITEXT_HEBREW_LETTER_TSADI_WITH_DAGESH  U"\ufb46"
 #define UNICODE_HEBREW_LETTER_QOF_WITH_DAGESH  0xfb47
-#define UNITEXT_HEBREW_LETTER_QOF_WITH_DAGESH  L"\ufb47"
+#define UNITEXT_HEBREW_LETTER_QOF_WITH_DAGESH  U"\ufb47"
 #define UNICODE_HEBREW_LETTER_RESH_WITH_DAGESH  0xfb48
-#define UNITEXT_HEBREW_LETTER_RESH_WITH_DAGESH  L"\ufb48"
+#define UNITEXT_HEBREW_LETTER_RESH_WITH_DAGESH  U"\ufb48"
 #define UNICODE_HEBREW_LETTER_SHIN_WITH_DAGESH  0xfb49
-#define UNITEXT_HEBREW_LETTER_SHIN_WITH_DAGESH  L"\ufb49"
+#define UNITEXT_HEBREW_LETTER_SHIN_WITH_DAGESH  U"\ufb49"
 #define UNICODE_HEBREW_LETTER_TAV_WITH_DAGESH  0xfb4a
-#define UNITEXT_HEBREW_LETTER_TAV_WITH_DAGESH  L"\ufb4a"
+#define UNITEXT_HEBREW_LETTER_TAV_WITH_DAGESH  U"\ufb4a"
 #define UNICODE_HEBREW_LETTER_VAV_WITH_HOLAM  0xfb4b
-#define UNITEXT_HEBREW_LETTER_VAV_WITH_HOLAM  L"\ufb4b"
+#define UNITEXT_HEBREW_LETTER_VAV_WITH_HOLAM  U"\ufb4b"
 #define UNICODE_HEBREW_LETTER_BET_WITH_RAFE  0xfb4c
-#define UNITEXT_HEBREW_LETTER_BET_WITH_RAFE  L"\ufb4c"
+#define UNITEXT_HEBREW_LETTER_BET_WITH_RAFE  U"\ufb4c"
 #define UNICODE_HEBREW_LETTER_KAF_WITH_RAFE  0xfb4d
-#define UNITEXT_HEBREW_LETTER_KAF_WITH_RAFE  L"\ufb4d"
+#define UNITEXT_HEBREW_LETTER_KAF_WITH_RAFE  U"\ufb4d"
 #define UNICODE_HEBREW_LETTER_PE_WITH_RAFE  0xfb4e
-#define UNITEXT_HEBREW_LETTER_PE_WITH_RAFE  L"\ufb4e"
+#define UNITEXT_HEBREW_LETTER_PE_WITH_RAFE  U"\ufb4e"
 #define UNICODE_HEBREW_LIGATURE_ALEF_LAMED  0xfb4f
-#define UNITEXT_HEBREW_LIGATURE_ALEF_LAMED  L"\ufb4f"
+#define UNITEXT_HEBREW_LIGATURE_ALEF_LAMED  U"\ufb4f"
 #define UNICODE_ARABIC_LETTER_ALEF_WASLA_ISOLATED_FORM  0xfb50
-#define UNITEXT_ARABIC_LETTER_ALEF_WASLA_ISOLATED_FORM  L"\ufb50"
+#define UNITEXT_ARABIC_LETTER_ALEF_WASLA_ISOLATED_FORM  U"\ufb50"
 #define UNICODE_ARABIC_LETTER_ALEF_WASLA_FINAL_FORM  0xfb51
-#define UNITEXT_ARABIC_LETTER_ALEF_WASLA_FINAL_FORM  L"\ufb51"
+#define UNITEXT_ARABIC_LETTER_ALEF_WASLA_FINAL_FORM  U"\ufb51"
 #define UNICODE_ARABIC_LETTER_BEEH_ISOLATED_FORM  0xfb52
-#define UNITEXT_ARABIC_LETTER_BEEH_ISOLATED_FORM  L"\ufb52"
+#define UNITEXT_ARABIC_LETTER_BEEH_ISOLATED_FORM  U"\ufb52"
 #define UNICODE_ARABIC_LETTER_BEEH_FINAL_FORM  0xfb53
-#define UNITEXT_ARABIC_LETTER_BEEH_FINAL_FORM  L"\ufb53"
+#define UNITEXT_ARABIC_LETTER_BEEH_FINAL_FORM  U"\ufb53"
 #define UNICODE_ARABIC_LETTER_BEEH_INITIAL_FORM  0xfb54
-#define UNITEXT_ARABIC_LETTER_BEEH_INITIAL_FORM  L"\ufb54"
+#define UNITEXT_ARABIC_LETTER_BEEH_INITIAL_FORM  U"\ufb54"
 #define UNICODE_ARABIC_LETTER_BEEH_MEDIAL_FORM  0xfb55
-#define UNITEXT_ARABIC_LETTER_BEEH_MEDIAL_FORM  L"\ufb55"
+#define UNITEXT_ARABIC_LETTER_BEEH_MEDIAL_FORM  U"\ufb55"
 #define UNICODE_ARABIC_LETTER_PEH_ISOLATED_FORM  0xfb56
-#define UNITEXT_ARABIC_LETTER_PEH_ISOLATED_FORM  L"\ufb56"
+#define UNITEXT_ARABIC_LETTER_PEH_ISOLATED_FORM  U"\ufb56"
 #define UNICODE_ARABIC_LETTER_PEH_FINAL_FORM  0xfb57
-#define UNITEXT_ARABIC_LETTER_PEH_FINAL_FORM  L"\ufb57"
+#define UNITEXT_ARABIC_LETTER_PEH_FINAL_FORM  U"\ufb57"
 #define UNICODE_ARABIC_LETTER_PEH_INITIAL_FORM  0xfb58
-#define UNITEXT_ARABIC_LETTER_PEH_INITIAL_FORM  L"\ufb58"
+#define UNITEXT_ARABIC_LETTER_PEH_INITIAL_FORM  U"\ufb58"
 #define UNICODE_ARABIC_LETTER_PEH_MEDIAL_FORM  0xfb59
-#define UNITEXT_ARABIC_LETTER_PEH_MEDIAL_FORM  L"\ufb59"
+#define UNITEXT_ARABIC_LETTER_PEH_MEDIAL_FORM  U"\ufb59"
 #define UNICODE_ARABIC_LETTER_BEHEH_ISOLATED_FORM  0xfb5a
-#define UNITEXT_ARABIC_LETTER_BEHEH_ISOLATED_FORM  L"\ufb5a"
+#define UNITEXT_ARABIC_LETTER_BEHEH_ISOLATED_FORM  U"\ufb5a"
 #define UNICODE_ARABIC_LETTER_BEHEH_FINAL_FORM  0xfb5b
-#define UNITEXT_ARABIC_LETTER_BEHEH_FINAL_FORM  L"\ufb5b"
+#define UNITEXT_ARABIC_LETTER_BEHEH_FINAL_FORM  U"\ufb5b"
 #define UNICODE_ARABIC_LETTER_BEHEH_INITIAL_FORM  0xfb5c
-#define UNITEXT_ARABIC_LETTER_BEHEH_INITIAL_FORM  L"\ufb5c"
+#define UNITEXT_ARABIC_LETTER_BEHEH_INITIAL_FORM  U"\ufb5c"
 #define UNICODE_ARABIC_LETTER_BEHEH_MEDIAL_FORM  0xfb5d
-#define UNITEXT_ARABIC_LETTER_BEHEH_MEDIAL_FORM  L"\ufb5d"
+#define UNITEXT_ARABIC_LETTER_BEHEH_MEDIAL_FORM  U"\ufb5d"
 #define UNICODE_ARABIC_LETTER_TTEHEH_ISOLATED_FORM  0xfb5e
-#define UNITEXT_ARABIC_LETTER_TTEHEH_ISOLATED_FORM  L"\ufb5e"
+#define UNITEXT_ARABIC_LETTER_TTEHEH_ISOLATED_FORM  U"\ufb5e"
 #define UNICODE_ARABIC_LETTER_TTEHEH_FINAL_FORM  0xfb5f
-#define UNITEXT_ARABIC_LETTER_TTEHEH_FINAL_FORM  L"\ufb5f"
+#define UNITEXT_ARABIC_LETTER_TTEHEH_FINAL_FORM  U"\ufb5f"
 #define UNICODE_ARABIC_LETTER_TTEHEH_INITIAL_FORM  0xfb60
-#define UNITEXT_ARABIC_LETTER_TTEHEH_INITIAL_FORM  L"\ufb60"
+#define UNITEXT_ARABIC_LETTER_TTEHEH_INITIAL_FORM  U"\ufb60"
 #define UNICODE_ARABIC_LETTER_TTEHEH_MEDIAL_FORM  0xfb61
-#define UNITEXT_ARABIC_LETTER_TTEHEH_MEDIAL_FORM  L"\ufb61"
+#define UNITEXT_ARABIC_LETTER_TTEHEH_MEDIAL_FORM  U"\ufb61"
 #define UNICODE_ARABIC_LETTER_TEHEH_ISOLATED_FORM  0xfb62
-#define UNITEXT_ARABIC_LETTER_TEHEH_ISOLATED_FORM  L"\ufb62"
+#define UNITEXT_ARABIC_LETTER_TEHEH_ISOLATED_FORM  U"\ufb62"
 #define UNICODE_ARABIC_LETTER_TEHEH_FINAL_FORM  0xfb63
-#define UNITEXT_ARABIC_LETTER_TEHEH_FINAL_FORM  L"\ufb63"
+#define UNITEXT_ARABIC_LETTER_TEHEH_FINAL_FORM  U"\ufb63"
 #define UNICODE_ARABIC_LETTER_TEHEH_INITIAL_FORM  0xfb64
-#define UNITEXT_ARABIC_LETTER_TEHEH_INITIAL_FORM  L"\ufb64"
+#define UNITEXT_ARABIC_LETTER_TEHEH_INITIAL_FORM  U"\ufb64"
 #define UNICODE_ARABIC_LETTER_TEHEH_MEDIAL_FORM  0xfb65
-#define UNITEXT_ARABIC_LETTER_TEHEH_MEDIAL_FORM  L"\ufb65"
+#define UNITEXT_ARABIC_LETTER_TEHEH_MEDIAL_FORM  U"\ufb65"
 #define UNICODE_ARABIC_LETTER_TTEH_ISOLATED_FORM  0xfb66
-#define UNITEXT_ARABIC_LETTER_TTEH_ISOLATED_FORM  L"\ufb66"
+#define UNITEXT_ARABIC_LETTER_TTEH_ISOLATED_FORM  U"\ufb66"
 #define UNICODE_ARABIC_LETTER_TTEH_FINAL_FORM  0xfb67
-#define UNITEXT_ARABIC_LETTER_TTEH_FINAL_FORM  L"\ufb67"
+#define UNITEXT_ARABIC_LETTER_TTEH_FINAL_FORM  U"\ufb67"
 #define UNICODE_ARABIC_LETTER_TTEH_INITIAL_FORM  0xfb68
-#define UNITEXT_ARABIC_LETTER_TTEH_INITIAL_FORM  L"\ufb68"
+#define UNITEXT_ARABIC_LETTER_TTEH_INITIAL_FORM  U"\ufb68"
 #define UNICODE_ARABIC_LETTER_TTEH_MEDIAL_FORM  0xfb69
-#define UNITEXT_ARABIC_LETTER_TTEH_MEDIAL_FORM  L"\ufb69"
+#define UNITEXT_ARABIC_LETTER_TTEH_MEDIAL_FORM  U"\ufb69"
 #define UNICODE_ARABIC_LETTER_VEH_ISOLATED_FORM  0xfb6a
-#define UNITEXT_ARABIC_LETTER_VEH_ISOLATED_FORM  L"\ufb6a"
+#define UNITEXT_ARABIC_LETTER_VEH_ISOLATED_FORM  U"\ufb6a"
 #define UNICODE_ARABIC_LETTER_VEH_FINAL_FORM  0xfb6b
-#define UNITEXT_ARABIC_LETTER_VEH_FINAL_FORM  L"\ufb6b"
+#define UNITEXT_ARABIC_LETTER_VEH_FINAL_FORM  U"\ufb6b"
 #define UNICODE_ARABIC_LETTER_VEH_INITIAL_FORM  0xfb6c
-#define UNITEXT_ARABIC_LETTER_VEH_INITIAL_FORM  L"\ufb6c"
+#define UNITEXT_ARABIC_LETTER_VEH_INITIAL_FORM  U"\ufb6c"
 #define UNICODE_ARABIC_LETTER_VEH_MEDIAL_FORM  0xfb6d
-#define UNITEXT_ARABIC_LETTER_VEH_MEDIAL_FORM  L"\ufb6d"
+#define UNITEXT_ARABIC_LETTER_VEH_MEDIAL_FORM  U"\ufb6d"
 #define UNICODE_ARABIC_LETTER_PEHEH_ISOLATED_FORM  0xfb6e
-#define UNITEXT_ARABIC_LETTER_PEHEH_ISOLATED_FORM  L"\ufb6e"
+#define UNITEXT_ARABIC_LETTER_PEHEH_ISOLATED_FORM  U"\ufb6e"
 #define UNICODE_ARABIC_LETTER_PEHEH_FINAL_FORM  0xfb6f
-#define UNITEXT_ARABIC_LETTER_PEHEH_FINAL_FORM  L"\ufb6f"
+#define UNITEXT_ARABIC_LETTER_PEHEH_FINAL_FORM  U"\ufb6f"
 #define UNICODE_ARABIC_LETTER_PEHEH_INITIAL_FORM  0xfb70
-#define UNITEXT_ARABIC_LETTER_PEHEH_INITIAL_FORM  L"\ufb70"
+#define UNITEXT_ARABIC_LETTER_PEHEH_INITIAL_FORM  U"\ufb70"
 #define UNICODE_ARABIC_LETTER_PEHEH_MEDIAL_FORM  0xfb71
-#define UNITEXT_ARABIC_LETTER_PEHEH_MEDIAL_FORM  L"\ufb71"
+#define UNITEXT_ARABIC_LETTER_PEHEH_MEDIAL_FORM  U"\ufb71"
 #define UNICODE_ARABIC_LETTER_DYEH_ISOLATED_FORM  0xfb72
-#define UNITEXT_ARABIC_LETTER_DYEH_ISOLATED_FORM  L"\ufb72"
+#define UNITEXT_ARABIC_LETTER_DYEH_ISOLATED_FORM  U"\ufb72"
 #define UNICODE_ARABIC_LETTER_DYEH_FINAL_FORM  0xfb73
-#define UNITEXT_ARABIC_LETTER_DYEH_FINAL_FORM  L"\ufb73"
+#define UNITEXT_ARABIC_LETTER_DYEH_FINAL_FORM  U"\ufb73"
 #define UNICODE_ARABIC_LETTER_DYEH_INITIAL_FORM  0xfb74
-#define UNITEXT_ARABIC_LETTER_DYEH_INITIAL_FORM  L"\ufb74"
+#define UNITEXT_ARABIC_LETTER_DYEH_INITIAL_FORM  U"\ufb74"
 #define UNICODE_ARABIC_LETTER_DYEH_MEDIAL_FORM  0xfb75
-#define UNITEXT_ARABIC_LETTER_DYEH_MEDIAL_FORM  L"\ufb75"
+#define UNITEXT_ARABIC_LETTER_DYEH_MEDIAL_FORM  U"\ufb75"
 #define UNICODE_ARABIC_LETTER_NYEH_ISOLATED_FORM  0xfb76
-#define UNITEXT_ARABIC_LETTER_NYEH_ISOLATED_FORM  L"\ufb76"
+#define UNITEXT_ARABIC_LETTER_NYEH_ISOLATED_FORM  U"\ufb76"
 #define UNICODE_ARABIC_LETTER_NYEH_FINAL_FORM  0xfb77
-#define UNITEXT_ARABIC_LETTER_NYEH_FINAL_FORM  L"\ufb77"
+#define UNITEXT_ARABIC_LETTER_NYEH_FINAL_FORM  U"\ufb77"
 #define UNICODE_ARABIC_LETTER_NYEH_INITIAL_FORM  0xfb78
-#define UNITEXT_ARABIC_LETTER_NYEH_INITIAL_FORM  L"\ufb78"
+#define UNITEXT_ARABIC_LETTER_NYEH_INITIAL_FORM  U"\ufb78"
 #define UNICODE_ARABIC_LETTER_NYEH_MEDIAL_FORM  0xfb79
-#define UNITEXT_ARABIC_LETTER_NYEH_MEDIAL_FORM  L"\ufb79"
+#define UNITEXT_ARABIC_LETTER_NYEH_MEDIAL_FORM  U"\ufb79"
 #define UNICODE_ARABIC_LETTER_TCHEH_ISOLATED_FORM  0xfb7a
-#define UNITEXT_ARABIC_LETTER_TCHEH_ISOLATED_FORM  L"\ufb7a"
+#define UNITEXT_ARABIC_LETTER_TCHEH_ISOLATED_FORM  U"\ufb7a"
 #define UNICODE_ARABIC_LETTER_TCHEH_FINAL_FORM  0xfb7b
-#define UNITEXT_ARABIC_LETTER_TCHEH_FINAL_FORM  L"\ufb7b"
+#define UNITEXT_ARABIC_LETTER_TCHEH_FINAL_FORM  U"\ufb7b"
 #define UNICODE_ARABIC_LETTER_TCHEH_INITIAL_FORM  0xfb7c
-#define UNITEXT_ARABIC_LETTER_TCHEH_INITIAL_FORM  L"\ufb7c"
+#define UNITEXT_ARABIC_LETTER_TCHEH_INITIAL_FORM  U"\ufb7c"
 #define UNICODE_ARABIC_LETTER_TCHEH_MEDIAL_FORM  0xfb7d
-#define UNITEXT_ARABIC_LETTER_TCHEH_MEDIAL_FORM  L"\ufb7d"
+#define UNITEXT_ARABIC_LETTER_TCHEH_MEDIAL_FORM  U"\ufb7d"
 #define UNICODE_ARABIC_LETTER_TCHEHEH_ISOLATED_FORM  0xfb7e
-#define UNITEXT_ARABIC_LETTER_TCHEHEH_ISOLATED_FORM  L"\ufb7e"
+#define UNITEXT_ARABIC_LETTER_TCHEHEH_ISOLATED_FORM  U"\ufb7e"
 #define UNICODE_ARABIC_LETTER_TCHEHEH_FINAL_FORM  0xfb7f
-#define UNITEXT_ARABIC_LETTER_TCHEHEH_FINAL_FORM  L"\ufb7f"
+#define UNITEXT_ARABIC_LETTER_TCHEHEH_FINAL_FORM  U"\ufb7f"
 #define UNICODE_ARABIC_LETTER_TCHEHEH_INITIAL_FORM  0xfb80
-#define UNITEXT_ARABIC_LETTER_TCHEHEH_INITIAL_FORM  L"\ufb80"
+#define UNITEXT_ARABIC_LETTER_TCHEHEH_INITIAL_FORM  U"\ufb80"
 #define UNICODE_ARABIC_LETTER_TCHEHEH_MEDIAL_FORM  0xfb81
-#define UNITEXT_ARABIC_LETTER_TCHEHEH_MEDIAL_FORM  L"\ufb81"
+#define UNITEXT_ARABIC_LETTER_TCHEHEH_MEDIAL_FORM  U"\ufb81"
 #define UNICODE_ARABIC_LETTER_DDAHAL_ISOLATED_FORM  0xfb82
-#define UNITEXT_ARABIC_LETTER_DDAHAL_ISOLATED_FORM  L"\ufb82"
+#define UNITEXT_ARABIC_LETTER_DDAHAL_ISOLATED_FORM  U"\ufb82"
 #define UNICODE_ARABIC_LETTER_DDAHAL_FINAL_FORM  0xfb83
-#define UNITEXT_ARABIC_LETTER_DDAHAL_FINAL_FORM  L"\ufb83"
+#define UNITEXT_ARABIC_LETTER_DDAHAL_FINAL_FORM  U"\ufb83"
 #define UNICODE_ARABIC_LETTER_DAHAL_ISOLATED_FORM  0xfb84
-#define UNITEXT_ARABIC_LETTER_DAHAL_ISOLATED_FORM  L"\ufb84"
+#define UNITEXT_ARABIC_LETTER_DAHAL_ISOLATED_FORM  U"\ufb84"
 #define UNICODE_ARABIC_LETTER_DAHAL_FINAL_FORM  0xfb85
-#define UNITEXT_ARABIC_LETTER_DAHAL_FINAL_FORM  L"\ufb85"
+#define UNITEXT_ARABIC_LETTER_DAHAL_FINAL_FORM  U"\ufb85"
 #define UNICODE_ARABIC_LETTER_DUL_ISOLATED_FORM  0xfb86
-#define UNITEXT_ARABIC_LETTER_DUL_ISOLATED_FORM  L"\ufb86"
+#define UNITEXT_ARABIC_LETTER_DUL_ISOLATED_FORM  U"\ufb86"
 #define UNICODE_ARABIC_LETTER_DUL_FINAL_FORM  0xfb87
-#define UNITEXT_ARABIC_LETTER_DUL_FINAL_FORM  L"\ufb87"
+#define UNITEXT_ARABIC_LETTER_DUL_FINAL_FORM  U"\ufb87"
 #define UNICODE_ARABIC_LETTER_DDAL_ISOLATED_FORM  0xfb88
-#define UNITEXT_ARABIC_LETTER_DDAL_ISOLATED_FORM  L"\ufb88"
+#define UNITEXT_ARABIC_LETTER_DDAL_ISOLATED_FORM  U"\ufb88"
 #define UNICODE_ARABIC_LETTER_DDAL_FINAL_FORM  0xfb89
-#define UNITEXT_ARABIC_LETTER_DDAL_FINAL_FORM  L"\ufb89"
+#define UNITEXT_ARABIC_LETTER_DDAL_FINAL_FORM  U"\ufb89"
 #define UNICODE_ARABIC_LETTER_JEH_ISOLATED_FORM  0xfb8a
-#define UNITEXT_ARABIC_LETTER_JEH_ISOLATED_FORM  L"\ufb8a"
+#define UNITEXT_ARABIC_LETTER_JEH_ISOLATED_FORM  U"\ufb8a"
 #define UNICODE_ARABIC_LETTER_JEH_FINAL_FORM  0xfb8b
-#define UNITEXT_ARABIC_LETTER_JEH_FINAL_FORM  L"\ufb8b"
+#define UNITEXT_ARABIC_LETTER_JEH_FINAL_FORM  U"\ufb8b"
 #define UNICODE_ARABIC_LETTER_RREH_ISOLATED_FORM  0xfb8c
-#define UNITEXT_ARABIC_LETTER_RREH_ISOLATED_FORM  L"\ufb8c"
+#define UNITEXT_ARABIC_LETTER_RREH_ISOLATED_FORM  U"\ufb8c"
 #define UNICODE_ARABIC_LETTER_RREH_FINAL_FORM  0xfb8d
-#define UNITEXT_ARABIC_LETTER_RREH_FINAL_FORM  L"\ufb8d"
+#define UNITEXT_ARABIC_LETTER_RREH_FINAL_FORM  U"\ufb8d"
 #define UNICODE_ARABIC_LETTER_KEHEH_ISOLATED_FORM  0xfb8e
-#define UNITEXT_ARABIC_LETTER_KEHEH_ISOLATED_FORM  L"\ufb8e"
+#define UNITEXT_ARABIC_LETTER_KEHEH_ISOLATED_FORM  U"\ufb8e"
 #define UNICODE_ARABIC_LETTER_KEHEH_FINAL_FORM  0xfb8f
-#define UNITEXT_ARABIC_LETTER_KEHEH_FINAL_FORM  L"\ufb8f"
+#define UNITEXT_ARABIC_LETTER_KEHEH_FINAL_FORM  U"\ufb8f"
 #define UNICODE_ARABIC_LETTER_KEHEH_INITIAL_FORM  0xfb90
-#define UNITEXT_ARABIC_LETTER_KEHEH_INITIAL_FORM  L"\ufb90"
+#define UNITEXT_ARABIC_LETTER_KEHEH_INITIAL_FORM  U"\ufb90"
 #define UNICODE_ARABIC_LETTER_KEHEH_MEDIAL_FORM  0xfb91
-#define UNITEXT_ARABIC_LETTER_KEHEH_MEDIAL_FORM  L"\ufb91"
+#define UNITEXT_ARABIC_LETTER_KEHEH_MEDIAL_FORM  U"\ufb91"
 #define UNICODE_ARABIC_LETTER_GAF_ISOLATED_FORM  0xfb92
-#define UNITEXT_ARABIC_LETTER_GAF_ISOLATED_FORM  L"\ufb92"
+#define UNITEXT_ARABIC_LETTER_GAF_ISOLATED_FORM  U"\ufb92"
 #define UNICODE_ARABIC_LETTER_GAF_FINAL_FORM  0xfb93
-#define UNITEXT_ARABIC_LETTER_GAF_FINAL_FORM  L"\ufb93"
+#define UNITEXT_ARABIC_LETTER_GAF_FINAL_FORM  U"\ufb93"
 #define UNICODE_ARABIC_LETTER_GAF_INITIAL_FORM  0xfb94
-#define UNITEXT_ARABIC_LETTER_GAF_INITIAL_FORM  L"\ufb94"
+#define UNITEXT_ARABIC_LETTER_GAF_INITIAL_FORM  U"\ufb94"
 #define UNICODE_ARABIC_LETTER_GAF_MEDIAL_FORM  0xfb95
-#define UNITEXT_ARABIC_LETTER_GAF_MEDIAL_FORM  L"\ufb95"
+#define UNITEXT_ARABIC_LETTER_GAF_MEDIAL_FORM  U"\ufb95"
 #define UNICODE_ARABIC_LETTER_GUEH_ISOLATED_FORM  0xfb96
-#define UNITEXT_ARABIC_LETTER_GUEH_ISOLATED_FORM  L"\ufb96"
+#define UNITEXT_ARABIC_LETTER_GUEH_ISOLATED_FORM  U"\ufb96"
 #define UNICODE_ARABIC_LETTER_GUEH_FINAL_FORM  0xfb97
-#define UNITEXT_ARABIC_LETTER_GUEH_FINAL_FORM  L"\ufb97"
+#define UNITEXT_ARABIC_LETTER_GUEH_FINAL_FORM  U"\ufb97"
 #define UNICODE_ARABIC_LETTER_GUEH_INITIAL_FORM  0xfb98
-#define UNITEXT_ARABIC_LETTER_GUEH_INITIAL_FORM  L"\ufb98"
+#define UNITEXT_ARABIC_LETTER_GUEH_INITIAL_FORM  U"\ufb98"
 #define UNICODE_ARABIC_LETTER_GUEH_MEDIAL_FORM  0xfb99
-#define UNITEXT_ARABIC_LETTER_GUEH_MEDIAL_FORM  L"\ufb99"
+#define UNITEXT_ARABIC_LETTER_GUEH_MEDIAL_FORM  U"\ufb99"
 #define UNICODE_ARABIC_LETTER_NGOEH_ISOLATED_FORM  0xfb9a
-#define UNITEXT_ARABIC_LETTER_NGOEH_ISOLATED_FORM  L"\ufb9a"
+#define UNITEXT_ARABIC_LETTER_NGOEH_ISOLATED_FORM  U"\ufb9a"
 #define UNICODE_ARABIC_LETTER_NGOEH_FINAL_FORM  0xfb9b
-#define UNITEXT_ARABIC_LETTER_NGOEH_FINAL_FORM  L"\ufb9b"
+#define UNITEXT_ARABIC_LETTER_NGOEH_FINAL_FORM  U"\ufb9b"
 #define UNICODE_ARABIC_LETTER_NGOEH_INITIAL_FORM  0xfb9c
-#define UNITEXT_ARABIC_LETTER_NGOEH_INITIAL_FORM  L"\ufb9c"
+#define UNITEXT_ARABIC_LETTER_NGOEH_INITIAL_FORM  U"\ufb9c"
 #define UNICODE_ARABIC_LETTER_NGOEH_MEDIAL_FORM  0xfb9d
-#define UNITEXT_ARABIC_LETTER_NGOEH_MEDIAL_FORM  L"\ufb9d"
+#define UNITEXT_ARABIC_LETTER_NGOEH_MEDIAL_FORM  U"\ufb9d"
 #define UNICODE_ARABIC_LETTER_NOON_GHUNNA_ISOLATED_FORM  0xfb9e
-#define UNITEXT_ARABIC_LETTER_NOON_GHUNNA_ISOLATED_FORM  L"\ufb9e"
+#define UNITEXT_ARABIC_LETTER_NOON_GHUNNA_ISOLATED_FORM  U"\ufb9e"
 #define UNICODE_ARABIC_LETTER_NOON_GHUNNA_FINAL_FORM  0xfb9f
-#define UNITEXT_ARABIC_LETTER_NOON_GHUNNA_FINAL_FORM  L"\ufb9f"
+#define UNITEXT_ARABIC_LETTER_NOON_GHUNNA_FINAL_FORM  U"\ufb9f"
 #define UNICODE_ARABIC_LETTER_RNOON_ISOLATED_FORM  0xfba0
-#define UNITEXT_ARABIC_LETTER_RNOON_ISOLATED_FORM  L"\ufba0"
+#define UNITEXT_ARABIC_LETTER_RNOON_ISOLATED_FORM  U"\ufba0"
 #define UNICODE_ARABIC_LETTER_RNOON_FINAL_FORM  0xfba1
-#define UNITEXT_ARABIC_LETTER_RNOON_FINAL_FORM  L"\ufba1"
+#define UNITEXT_ARABIC_LETTER_RNOON_FINAL_FORM  U"\ufba1"
 #define UNICODE_ARABIC_LETTER_RNOON_INITIAL_FORM  0xfba2
-#define UNITEXT_ARABIC_LETTER_RNOON_INITIAL_FORM  L"\ufba2"
+#define UNITEXT_ARABIC_LETTER_RNOON_INITIAL_FORM  U"\ufba2"
 #define UNICODE_ARABIC_LETTER_RNOON_MEDIAL_FORM  0xfba3
-#define UNITEXT_ARABIC_LETTER_RNOON_MEDIAL_FORM  L"\ufba3"
+#define UNITEXT_ARABIC_LETTER_RNOON_MEDIAL_FORM  U"\ufba3"
 #define UNICODE_ARABIC_LETTER_HEH_WITH_YEH_ABOVE_ISOLATED_FORM  0xfba4
-#define UNITEXT_ARABIC_LETTER_HEH_WITH_YEH_ABOVE_ISOLATED_FORM  L"\ufba4"
+#define UNITEXT_ARABIC_LETTER_HEH_WITH_YEH_ABOVE_ISOLATED_FORM  U"\ufba4"
 #define UNICODE_ARABIC_LETTER_HEH_WITH_YEH_ABOVE_FINAL_FORM  0xfba5
-#define UNITEXT_ARABIC_LETTER_HEH_WITH_YEH_ABOVE_FINAL_FORM  L"\ufba5"
+#define UNITEXT_ARABIC_LETTER_HEH_WITH_YEH_ABOVE_FINAL_FORM  U"\ufba5"
 #define UNICODE_ARABIC_LETTER_HEH_GOAL_ISOLATED_FORM  0xfba6
-#define UNITEXT_ARABIC_LETTER_HEH_GOAL_ISOLATED_FORM  L"\ufba6"
+#define UNITEXT_ARABIC_LETTER_HEH_GOAL_ISOLATED_FORM  U"\ufba6"
 #define UNICODE_ARABIC_LETTER_HEH_GOAL_FINAL_FORM  0xfba7
-#define UNITEXT_ARABIC_LETTER_HEH_GOAL_FINAL_FORM  L"\ufba7"
+#define UNITEXT_ARABIC_LETTER_HEH_GOAL_FINAL_FORM  U"\ufba7"
 #define UNICODE_ARABIC_LETTER_HEH_GOAL_INITIAL_FORM  0xfba8
-#define UNITEXT_ARABIC_LETTER_HEH_GOAL_INITIAL_FORM  L"\ufba8"
+#define UNITEXT_ARABIC_LETTER_HEH_GOAL_INITIAL_FORM  U"\ufba8"
 #define UNICODE_ARABIC_LETTER_HEH_GOAL_MEDIAL_FORM  0xfba9
-#define UNITEXT_ARABIC_LETTER_HEH_GOAL_MEDIAL_FORM  L"\ufba9"
+#define UNITEXT_ARABIC_LETTER_HEH_GOAL_MEDIAL_FORM  U"\ufba9"
 #define UNICODE_ARABIC_LETTER_HEH_DOACHASHMEE_ISOLATED_FORM  0xfbaa
-#define UNITEXT_ARABIC_LETTER_HEH_DOACHASHMEE_ISOLATED_FORM  L"\ufbaa"
+#define UNITEXT_ARABIC_LETTER_HEH_DOACHASHMEE_ISOLATED_FORM  U"\ufbaa"
 #define UNICODE_ARABIC_LETTER_HEH_DOACHASHMEE_FINAL_FORM  0xfbab
-#define UNITEXT_ARABIC_LETTER_HEH_DOACHASHMEE_FINAL_FORM  L"\ufbab"
+#define UNITEXT_ARABIC_LETTER_HEH_DOACHASHMEE_FINAL_FORM  U"\ufbab"
 #define UNICODE_ARABIC_LETTER_HEH_DOACHASHMEE_INITIAL_FORM  0xfbac
-#define UNITEXT_ARABIC_LETTER_HEH_DOACHASHMEE_INITIAL_FORM  L"\ufbac"
+#define UNITEXT_ARABIC_LETTER_HEH_DOACHASHMEE_INITIAL_FORM  U"\ufbac"
 #define UNICODE_ARABIC_LETTER_HEH_DOACHASHMEE_MEDIAL_FORM  0xfbad
-#define UNITEXT_ARABIC_LETTER_HEH_DOACHASHMEE_MEDIAL_FORM  L"\ufbad"
+#define UNITEXT_ARABIC_LETTER_HEH_DOACHASHMEE_MEDIAL_FORM  U"\ufbad"
 #define UNICODE_ARABIC_LETTER_YEH_BARREE_ISOLATED_FORM  0xfbae
-#define UNITEXT_ARABIC_LETTER_YEH_BARREE_ISOLATED_FORM  L"\ufbae"
+#define UNITEXT_ARABIC_LETTER_YEH_BARREE_ISOLATED_FORM  U"\ufbae"
 #define UNICODE_ARABIC_LETTER_YEH_BARREE_FINAL_FORM  0xfbaf
-#define UNITEXT_ARABIC_LETTER_YEH_BARREE_FINAL_FORM  L"\ufbaf"
+#define UNITEXT_ARABIC_LETTER_YEH_BARREE_FINAL_FORM  U"\ufbaf"
 #define UNICODE_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE_ISOLATED_FORM  0xfbb0
-#define UNITEXT_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE_ISOLATED_FORM  L"\ufbb0"
+#define UNITEXT_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE_ISOLATED_FORM  U"\ufbb0"
 #define UNICODE_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE_FINAL_FORM  0xfbb1
-#define UNITEXT_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE_FINAL_FORM  L"\ufbb1"
+#define UNITEXT_ARABIC_LETTER_YEH_BARREE_WITH_HAMZA_ABOVE_FINAL_FORM  U"\ufbb1"
 #define UNICODE_ARABIC_LETTER_NG_ISOLATED_FORM  0xfbd3
-#define UNITEXT_ARABIC_LETTER_NG_ISOLATED_FORM  L"\ufbd3"
+#define UNITEXT_ARABIC_LETTER_NG_ISOLATED_FORM  U"\ufbd3"
 #define UNICODE_ARABIC_LETTER_NG_FINAL_FORM  0xfbd4
-#define UNITEXT_ARABIC_LETTER_NG_FINAL_FORM  L"\ufbd4"
+#define UNITEXT_ARABIC_LETTER_NG_FINAL_FORM  U"\ufbd4"
 #define UNICODE_ARABIC_LETTER_NG_INITIAL_FORM  0xfbd5
-#define UNITEXT_ARABIC_LETTER_NG_INITIAL_FORM  L"\ufbd5"
+#define UNITEXT_ARABIC_LETTER_NG_INITIAL_FORM  U"\ufbd5"
 #define UNICODE_ARABIC_LETTER_NG_MEDIAL_FORM  0xfbd6
-#define UNITEXT_ARABIC_LETTER_NG_MEDIAL_FORM  L"\ufbd6"
+#define UNITEXT_ARABIC_LETTER_NG_MEDIAL_FORM  U"\ufbd6"
 #define UNICODE_ARABIC_LETTER_U_ISOLATED_FORM  0xfbd7
-#define UNITEXT_ARABIC_LETTER_U_ISOLATED_FORM  L"\ufbd7"
+#define UNITEXT_ARABIC_LETTER_U_ISOLATED_FORM  U"\ufbd7"
 #define UNICODE_ARABIC_LETTER_U_FINAL_FORM  0xfbd8
-#define UNITEXT_ARABIC_LETTER_U_FINAL_FORM  L"\ufbd8"
+#define UNITEXT_ARABIC_LETTER_U_FINAL_FORM  U"\ufbd8"
 #define UNICODE_ARABIC_LETTER_OE_ISOLATED_FORM  0xfbd9
-#define UNITEXT_ARABIC_LETTER_OE_ISOLATED_FORM  L"\ufbd9"
+#define UNITEXT_ARABIC_LETTER_OE_ISOLATED_FORM  U"\ufbd9"
 #define UNICODE_ARABIC_LETTER_OE_FINAL_FORM  0xfbda
-#define UNITEXT_ARABIC_LETTER_OE_FINAL_FORM  L"\ufbda"
+#define UNITEXT_ARABIC_LETTER_OE_FINAL_FORM  U"\ufbda"
 #define UNICODE_ARABIC_LETTER_YU_ISOLATED_FORM  0xfbdb
-#define UNITEXT_ARABIC_LETTER_YU_ISOLATED_FORM  L"\ufbdb"
+#define UNITEXT_ARABIC_LETTER_YU_ISOLATED_FORM  U"\ufbdb"
 #define UNICODE_ARABIC_LETTER_YU_FINAL_FORM  0xfbdc
-#define UNITEXT_ARABIC_LETTER_YU_FINAL_FORM  L"\ufbdc"
+#define UNITEXT_ARABIC_LETTER_YU_FINAL_FORM  U"\ufbdc"
 #define UNICODE_ARABIC_LETTER_U_WITH_HAMZA_ABOVE_ISOLATED_FORM  0xfbdd
-#define UNITEXT_ARABIC_LETTER_U_WITH_HAMZA_ABOVE_ISOLATED_FORM  L"\ufbdd"
+#define UNITEXT_ARABIC_LETTER_U_WITH_HAMZA_ABOVE_ISOLATED_FORM  U"\ufbdd"
 #define UNICODE_ARABIC_LETTER_VE_ISOLATED_FORM  0xfbde
-#define UNITEXT_ARABIC_LETTER_VE_ISOLATED_FORM  L"\ufbde"
+#define UNITEXT_ARABIC_LETTER_VE_ISOLATED_FORM  U"\ufbde"
 #define UNICODE_ARABIC_LETTER_VE_FINAL_FORM  0xfbdf
-#define UNITEXT_ARABIC_LETTER_VE_FINAL_FORM  L"\ufbdf"
+#define UNITEXT_ARABIC_LETTER_VE_FINAL_FORM  U"\ufbdf"
 #define UNICODE_ARABIC_LETTER_KIRGHIZ_OE_ISOLATED_FORM  0xfbe0
-#define UNITEXT_ARABIC_LETTER_KIRGHIZ_OE_ISOLATED_FORM  L"\ufbe0"
+#define UNITEXT_ARABIC_LETTER_KIRGHIZ_OE_ISOLATED_FORM  U"\ufbe0"
 #define UNICODE_ARABIC_LETTER_KIRGHIZ_OE_FINAL_FORM  0xfbe1
-#define UNITEXT_ARABIC_LETTER_KIRGHIZ_OE_FINAL_FORM  L"\ufbe1"
+#define UNITEXT_ARABIC_LETTER_KIRGHIZ_OE_FINAL_FORM  U"\ufbe1"
 #define UNICODE_ARABIC_LETTER_KIRGHIZ_YU_ISOLATED_FORM  0xfbe2
-#define UNITEXT_ARABIC_LETTER_KIRGHIZ_YU_ISOLATED_FORM  L"\ufbe2"
+#define UNITEXT_ARABIC_LETTER_KIRGHIZ_YU_ISOLATED_FORM  U"\ufbe2"
 #define UNICODE_ARABIC_LETTER_KIRGHIZ_YU_FINAL_FORM  0xfbe3
-#define UNITEXT_ARABIC_LETTER_KIRGHIZ_YU_FINAL_FORM  L"\ufbe3"
+#define UNITEXT_ARABIC_LETTER_KIRGHIZ_YU_FINAL_FORM  U"\ufbe3"
 #define UNICODE_ARABIC_LETTER_E_ISOLATED_FORM  0xfbe4
-#define UNITEXT_ARABIC_LETTER_E_ISOLATED_FORM  L"\ufbe4"
+#define UNITEXT_ARABIC_LETTER_E_ISOLATED_FORM  U"\ufbe4"
 #define UNICODE_ARABIC_LETTER_E_FINAL_FORM  0xfbe5
-#define UNITEXT_ARABIC_LETTER_E_FINAL_FORM  L"\ufbe5"
+#define UNITEXT_ARABIC_LETTER_E_FINAL_FORM  U"\ufbe5"
 #define UNICODE_ARABIC_LETTER_E_INITIAL_FORM  0xfbe6
-#define UNITEXT_ARABIC_LETTER_E_INITIAL_FORM  L"\ufbe6"
+#define UNITEXT_ARABIC_LETTER_E_INITIAL_FORM  U"\ufbe6"
 #define UNICODE_ARABIC_LETTER_E_MEDIAL_FORM  0xfbe7
-#define UNITEXT_ARABIC_LETTER_E_MEDIAL_FORM  L"\ufbe7"
+#define UNITEXT_ARABIC_LETTER_E_MEDIAL_FORM  U"\ufbe7"
 #define UNICODE_ARABIC_LETTER_UIGHUR_KAZAKH_KIRGHIZ_ALEF_MAKSURA_INITIAL_FORM  0xfbe8
-#define UNITEXT_ARABIC_LETTER_UIGHUR_KAZAKH_KIRGHIZ_ALEF_MAKSURA_INITIAL_FORM  L"\ufbe8"
+#define UNITEXT_ARABIC_LETTER_UIGHUR_KAZAKH_KIRGHIZ_ALEF_MAKSURA_INITIAL_FORM  U"\ufbe8"
 #define UNICODE_ARABIC_LETTER_UIGHUR_KAZAKH_KIRGHIZ_ALEF_MAKSURA_MEDIAL_FORM  0xfbe9
-#define UNITEXT_ARABIC_LETTER_UIGHUR_KAZAKH_KIRGHIZ_ALEF_MAKSURA_MEDIAL_FORM  L"\ufbe9"
+#define UNITEXT_ARABIC_LETTER_UIGHUR_KAZAKH_KIRGHIZ_ALEF_MAKSURA_MEDIAL_FORM  U"\ufbe9"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_ISOLATED_FORM  0xfbea
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_ISOLATED_FORM  L"\ufbea"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_ISOLATED_FORM  U"\ufbea"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_FINAL_FORM  0xfbeb
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_FINAL_FORM  L"\ufbeb"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_FINAL_FORM  U"\ufbeb"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_AE_ISOLATED_FORM  0xfbec
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_AE_ISOLATED_FORM  L"\ufbec"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_AE_ISOLATED_FORM  U"\ufbec"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_AE_FINAL_FORM  0xfbed
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_AE_FINAL_FORM  L"\ufbed"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_AE_FINAL_FORM  U"\ufbed"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_WAW_ISOLATED_FORM  0xfbee
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_WAW_ISOLATED_FORM  L"\ufbee"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_WAW_ISOLATED_FORM  U"\ufbee"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_WAW_FINAL_FORM  0xfbef
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_WAW_FINAL_FORM  L"\ufbef"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_WAW_FINAL_FORM  U"\ufbef"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_U_ISOLATED_FORM  0xfbf0
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_U_ISOLATED_FORM  L"\ufbf0"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_U_ISOLATED_FORM  U"\ufbf0"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_U_FINAL_FORM  0xfbf1
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_U_FINAL_FORM  L"\ufbf1"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_U_FINAL_FORM  U"\ufbf1"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_OE_ISOLATED_FORM  0xfbf2
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_OE_ISOLATED_FORM  L"\ufbf2"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_OE_ISOLATED_FORM  U"\ufbf2"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_OE_FINAL_FORM  0xfbf3
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_OE_FINAL_FORM  L"\ufbf3"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_OE_FINAL_FORM  U"\ufbf3"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YU_ISOLATED_FORM  0xfbf4
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YU_ISOLATED_FORM  L"\ufbf4"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YU_ISOLATED_FORM  U"\ufbf4"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YU_FINAL_FORM  0xfbf5
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YU_FINAL_FORM  L"\ufbf5"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YU_FINAL_FORM  U"\ufbf5"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_E_ISOLATED_FORM  0xfbf6
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_E_ISOLATED_FORM  L"\ufbf6"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_E_ISOLATED_FORM  U"\ufbf6"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_E_FINAL_FORM  0xfbf7
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_E_FINAL_FORM  L"\ufbf7"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_E_FINAL_FORM  U"\ufbf7"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_E_INITIAL_FORM  0xfbf8
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_E_INITIAL_FORM  L"\ufbf8"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_E_INITIAL_FORM  U"\ufbf8"
 #define UNICODE_ARABIC_LIGATURE_UIGHUR_KIRGHIZ_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfbf9
-#define UNITEXT_ARABIC_LIGATURE_UIGHUR_KIRGHIZ_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufbf9"
+#define UNITEXT_ARABIC_LIGATURE_UIGHUR_KIRGHIZ_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufbf9"
 #define UNICODE_ARABIC_LIGATURE_UIGHUR_KIRGHIZ_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_FINAL_FORM  0xfbfa
-#define UNITEXT_ARABIC_LIGATURE_UIGHUR_KIRGHIZ_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufbfa"
+#define UNITEXT_ARABIC_LIGATURE_UIGHUR_KIRGHIZ_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufbfa"
 #define UNICODE_ARABIC_LIGATURE_UIGHUR_KIRGHIZ_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_INITIAL_FORM  0xfbfb
-#define UNITEXT_ARABIC_LIGATURE_UIGHUR_KIRGHIZ_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_INITIAL_FORM  L"\ufbfb"
+#define UNITEXT_ARABIC_LIGATURE_UIGHUR_KIRGHIZ_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_INITIAL_FORM  U"\ufbfb"
 #define UNICODE_ARABIC_LETTER_FARSI_YEH_ISOLATED_FORM  0xfbfc
-#define UNITEXT_ARABIC_LETTER_FARSI_YEH_ISOLATED_FORM  L"\ufbfc"
+#define UNITEXT_ARABIC_LETTER_FARSI_YEH_ISOLATED_FORM  U"\ufbfc"
 #define UNICODE_ARABIC_LETTER_FARSI_YEH_FINAL_FORM  0xfbfd
-#define UNITEXT_ARABIC_LETTER_FARSI_YEH_FINAL_FORM  L"\ufbfd"
+#define UNITEXT_ARABIC_LETTER_FARSI_YEH_FINAL_FORM  U"\ufbfd"
 #define UNICODE_ARABIC_LETTER_FARSI_YEH_INITIAL_FORM  0xfbfe
-#define UNITEXT_ARABIC_LETTER_FARSI_YEH_INITIAL_FORM  L"\ufbfe"
+#define UNITEXT_ARABIC_LETTER_FARSI_YEH_INITIAL_FORM  U"\ufbfe"
 #define UNICODE_ARABIC_LETTER_FARSI_YEH_MEDIAL_FORM  0xfbff
-#define UNITEXT_ARABIC_LETTER_FARSI_YEH_MEDIAL_FORM  L"\ufbff"
+#define UNITEXT_ARABIC_LETTER_FARSI_YEH_MEDIAL_FORM  U"\ufbff"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_JEEM_ISOLATED_FORM  0xfc00
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_JEEM_ISOLATED_FORM  L"\ufc00"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_JEEM_ISOLATED_FORM  U"\ufc00"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HAH_ISOLATED_FORM  0xfc01
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HAH_ISOLATED_FORM  L"\ufc01"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HAH_ISOLATED_FORM  U"\ufc01"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_ISOLATED_FORM  0xfc02
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_ISOLATED_FORM  L"\ufc02"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_ISOLATED_FORM  U"\ufc02"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc03
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc03"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc03"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YEH_ISOLATED_FORM  0xfc04
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YEH_ISOLATED_FORM  L"\ufc04"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YEH_ISOLATED_FORM  U"\ufc04"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_JEEM_ISOLATED_FORM  0xfc05
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_JEEM_ISOLATED_FORM  L"\ufc05"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_JEEM_ISOLATED_FORM  U"\ufc05"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_HAH_ISOLATED_FORM  0xfc06
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_HAH_ISOLATED_FORM  L"\ufc06"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_HAH_ISOLATED_FORM  U"\ufc06"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_KHAH_ISOLATED_FORM  0xfc07
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_KHAH_ISOLATED_FORM  L"\ufc07"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_KHAH_ISOLATED_FORM  U"\ufc07"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_MEEM_ISOLATED_FORM  0xfc08
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_MEEM_ISOLATED_FORM  L"\ufc08"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_MEEM_ISOLATED_FORM  U"\ufc08"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc09
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc09"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc09"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_YEH_ISOLATED_FORM  0xfc0a
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_YEH_ISOLATED_FORM  L"\ufc0a"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_YEH_ISOLATED_FORM  U"\ufc0a"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_JEEM_ISOLATED_FORM  0xfc0b
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_JEEM_ISOLATED_FORM  L"\ufc0b"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_JEEM_ISOLATED_FORM  U"\ufc0b"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_HAH_ISOLATED_FORM  0xfc0c
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HAH_ISOLATED_FORM  L"\ufc0c"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HAH_ISOLATED_FORM  U"\ufc0c"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_KHAH_ISOLATED_FORM  0xfc0d
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_KHAH_ISOLATED_FORM  L"\ufc0d"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_KHAH_ISOLATED_FORM  U"\ufc0d"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_MEEM_ISOLATED_FORM  0xfc0e
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_ISOLATED_FORM  L"\ufc0e"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_ISOLATED_FORM  U"\ufc0e"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc0f
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc0f"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc0f"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_YEH_ISOLATED_FORM  0xfc10
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_YEH_ISOLATED_FORM  L"\ufc10"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_YEH_ISOLATED_FORM  U"\ufc10"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_JEEM_ISOLATED_FORM  0xfc11
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_JEEM_ISOLATED_FORM  L"\ufc11"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_JEEM_ISOLATED_FORM  U"\ufc11"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_MEEM_ISOLATED_FORM  0xfc12
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_MEEM_ISOLATED_FORM  L"\ufc12"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_MEEM_ISOLATED_FORM  U"\ufc12"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc13
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc13"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc13"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_YEH_ISOLATED_FORM  0xfc14
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_YEH_ISOLATED_FORM  L"\ufc14"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_YEH_ISOLATED_FORM  U"\ufc14"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_HAH_ISOLATED_FORM  0xfc15
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_HAH_ISOLATED_FORM  L"\ufc15"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_HAH_ISOLATED_FORM  U"\ufc15"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_MEEM_ISOLATED_FORM  0xfc16
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_ISOLATED_FORM  L"\ufc16"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_ISOLATED_FORM  U"\ufc16"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_JEEM_ISOLATED_FORM  0xfc17
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_JEEM_ISOLATED_FORM  L"\ufc17"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_JEEM_ISOLATED_FORM  U"\ufc17"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_MEEM_ISOLATED_FORM  0xfc18
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_MEEM_ISOLATED_FORM  L"\ufc18"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_MEEM_ISOLATED_FORM  U"\ufc18"
 #define UNICODE_ARABIC_LIGATURE_KHAH_WITH_JEEM_ISOLATED_FORM  0xfc19
-#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_JEEM_ISOLATED_FORM  L"\ufc19"
+#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_JEEM_ISOLATED_FORM  U"\ufc19"
 #define UNICODE_ARABIC_LIGATURE_KHAH_WITH_HAH_ISOLATED_FORM  0xfc1a
-#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_HAH_ISOLATED_FORM  L"\ufc1a"
+#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_HAH_ISOLATED_FORM  U"\ufc1a"
 #define UNICODE_ARABIC_LIGATURE_KHAH_WITH_MEEM_ISOLATED_FORM  0xfc1b
-#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_MEEM_ISOLATED_FORM  L"\ufc1b"
+#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_MEEM_ISOLATED_FORM  U"\ufc1b"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_JEEM_ISOLATED_FORM  0xfc1c
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_JEEM_ISOLATED_FORM  L"\ufc1c"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_JEEM_ISOLATED_FORM  U"\ufc1c"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_HAH_ISOLATED_FORM  0xfc1d
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HAH_ISOLATED_FORM  L"\ufc1d"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HAH_ISOLATED_FORM  U"\ufc1d"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_KHAH_ISOLATED_FORM  0xfc1e
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_KHAH_ISOLATED_FORM  L"\ufc1e"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_KHAH_ISOLATED_FORM  U"\ufc1e"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_MEEM_ISOLATED_FORM  0xfc1f
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_ISOLATED_FORM  L"\ufc1f"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_ISOLATED_FORM  U"\ufc1f"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_HAH_ISOLATED_FORM  0xfc20
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_HAH_ISOLATED_FORM  L"\ufc20"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_HAH_ISOLATED_FORM  U"\ufc20"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_MEEM_ISOLATED_FORM  0xfc21
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_MEEM_ISOLATED_FORM  L"\ufc21"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_MEEM_ISOLATED_FORM  U"\ufc21"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_JEEM_ISOLATED_FORM  0xfc22
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_JEEM_ISOLATED_FORM  L"\ufc22"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_JEEM_ISOLATED_FORM  U"\ufc22"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_HAH_ISOLATED_FORM  0xfc23
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_HAH_ISOLATED_FORM  L"\ufc23"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_HAH_ISOLATED_FORM  U"\ufc23"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_KHAH_ISOLATED_FORM  0xfc24
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_KHAH_ISOLATED_FORM  L"\ufc24"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_KHAH_ISOLATED_FORM  U"\ufc24"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_MEEM_ISOLATED_FORM  0xfc25
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_MEEM_ISOLATED_FORM  L"\ufc25"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_MEEM_ISOLATED_FORM  U"\ufc25"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_HAH_ISOLATED_FORM  0xfc26
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_HAH_ISOLATED_FORM  L"\ufc26"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_HAH_ISOLATED_FORM  U"\ufc26"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_MEEM_ISOLATED_FORM  0xfc27
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_ISOLATED_FORM  L"\ufc27"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_ISOLATED_FORM  U"\ufc27"
 #define UNICODE_ARABIC_LIGATURE_ZAH_WITH_MEEM_ISOLATED_FORM  0xfc28
-#define UNITEXT_ARABIC_LIGATURE_ZAH_WITH_MEEM_ISOLATED_FORM  L"\ufc28"
+#define UNITEXT_ARABIC_LIGATURE_ZAH_WITH_MEEM_ISOLATED_FORM  U"\ufc28"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_JEEM_ISOLATED_FORM  0xfc29
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_JEEM_ISOLATED_FORM  L"\ufc29"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_JEEM_ISOLATED_FORM  U"\ufc29"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_MEEM_ISOLATED_FORM  0xfc2a
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_ISOLATED_FORM  L"\ufc2a"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_ISOLATED_FORM  U"\ufc2a"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_JEEM_ISOLATED_FORM  0xfc2b
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_JEEM_ISOLATED_FORM  L"\ufc2b"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_JEEM_ISOLATED_FORM  U"\ufc2b"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_MEEM_ISOLATED_FORM  0xfc2c
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_MEEM_ISOLATED_FORM  L"\ufc2c"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_MEEM_ISOLATED_FORM  U"\ufc2c"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_JEEM_ISOLATED_FORM  0xfc2d
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_JEEM_ISOLATED_FORM  L"\ufc2d"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_JEEM_ISOLATED_FORM  U"\ufc2d"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_HAH_ISOLATED_FORM  0xfc2e
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_HAH_ISOLATED_FORM  L"\ufc2e"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_HAH_ISOLATED_FORM  U"\ufc2e"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_KHAH_ISOLATED_FORM  0xfc2f
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_KHAH_ISOLATED_FORM  L"\ufc2f"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_KHAH_ISOLATED_FORM  U"\ufc2f"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_MEEM_ISOLATED_FORM  0xfc30
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_MEEM_ISOLATED_FORM  L"\ufc30"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_MEEM_ISOLATED_FORM  U"\ufc30"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc31
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc31"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc31"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_YEH_ISOLATED_FORM  0xfc32
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_YEH_ISOLATED_FORM  L"\ufc32"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_YEH_ISOLATED_FORM  U"\ufc32"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_HAH_ISOLATED_FORM  0xfc33
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_HAH_ISOLATED_FORM  L"\ufc33"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_HAH_ISOLATED_FORM  U"\ufc33"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_MEEM_ISOLATED_FORM  0xfc34
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_ISOLATED_FORM  L"\ufc34"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_ISOLATED_FORM  U"\ufc34"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc35
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc35"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc35"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_YEH_ISOLATED_FORM  0xfc36
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_YEH_ISOLATED_FORM  L"\ufc36"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_YEH_ISOLATED_FORM  U"\ufc36"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_ALEF_ISOLATED_FORM  0xfc37
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_ALEF_ISOLATED_FORM  L"\ufc37"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_ALEF_ISOLATED_FORM  U"\ufc37"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_JEEM_ISOLATED_FORM  0xfc38
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_JEEM_ISOLATED_FORM  L"\ufc38"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_JEEM_ISOLATED_FORM  U"\ufc38"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_HAH_ISOLATED_FORM  0xfc39
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_HAH_ISOLATED_FORM  L"\ufc39"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_HAH_ISOLATED_FORM  U"\ufc39"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_KHAH_ISOLATED_FORM  0xfc3a
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_KHAH_ISOLATED_FORM  L"\ufc3a"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_KHAH_ISOLATED_FORM  U"\ufc3a"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_LAM_ISOLATED_FORM  0xfc3b
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_LAM_ISOLATED_FORM  L"\ufc3b"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_LAM_ISOLATED_FORM  U"\ufc3b"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_MEEM_ISOLATED_FORM  0xfc3c
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_ISOLATED_FORM  L"\ufc3c"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_ISOLATED_FORM  U"\ufc3c"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc3d
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc3d"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc3d"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_YEH_ISOLATED_FORM  0xfc3e
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_YEH_ISOLATED_FORM  L"\ufc3e"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_YEH_ISOLATED_FORM  U"\ufc3e"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_JEEM_ISOLATED_FORM  0xfc3f
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_ISOLATED_FORM  L"\ufc3f"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_ISOLATED_FORM  U"\ufc3f"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_HAH_ISOLATED_FORM  0xfc40
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_ISOLATED_FORM  L"\ufc40"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_ISOLATED_FORM  U"\ufc40"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_KHAH_ISOLATED_FORM  0xfc41
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_KHAH_ISOLATED_FORM  L"\ufc41"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_KHAH_ISOLATED_FORM  U"\ufc41"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_MEEM_ISOLATED_FORM  0xfc42
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_ISOLATED_FORM  L"\ufc42"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_ISOLATED_FORM  U"\ufc42"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc43
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc43"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc43"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_YEH_ISOLATED_FORM  0xfc44
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_YEH_ISOLATED_FORM  L"\ufc44"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_YEH_ISOLATED_FORM  U"\ufc44"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_JEEM_ISOLATED_FORM  0xfc45
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_ISOLATED_FORM  L"\ufc45"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_ISOLATED_FORM  U"\ufc45"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_HAH_ISOLATED_FORM  0xfc46
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_HAH_ISOLATED_FORM  L"\ufc46"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_HAH_ISOLATED_FORM  U"\ufc46"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_KHAH_ISOLATED_FORM  0xfc47
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_KHAH_ISOLATED_FORM  L"\ufc47"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_KHAH_ISOLATED_FORM  U"\ufc47"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_MEEM_ISOLATED_FORM  0xfc48
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_MEEM_ISOLATED_FORM  L"\ufc48"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_MEEM_ISOLATED_FORM  U"\ufc48"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc49
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc49"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc49"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_YEH_ISOLATED_FORM  0xfc4a
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_YEH_ISOLATED_FORM  L"\ufc4a"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_YEH_ISOLATED_FORM  U"\ufc4a"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_JEEM_ISOLATED_FORM  0xfc4b
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_ISOLATED_FORM  L"\ufc4b"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_ISOLATED_FORM  U"\ufc4b"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_HAH_ISOLATED_FORM  0xfc4c
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HAH_ISOLATED_FORM  L"\ufc4c"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HAH_ISOLATED_FORM  U"\ufc4c"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_KHAH_ISOLATED_FORM  0xfc4d
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_KHAH_ISOLATED_FORM  L"\ufc4d"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_KHAH_ISOLATED_FORM  U"\ufc4d"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_MEEM_ISOLATED_FORM  0xfc4e
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_ISOLATED_FORM  L"\ufc4e"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_ISOLATED_FORM  U"\ufc4e"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc4f
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc4f"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc4f"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_YEH_ISOLATED_FORM  0xfc50
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_YEH_ISOLATED_FORM  L"\ufc50"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_YEH_ISOLATED_FORM  U"\ufc50"
 #define UNICODE_ARABIC_LIGATURE_HEH_WITH_JEEM_ISOLATED_FORM  0xfc51
-#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_JEEM_ISOLATED_FORM  L"\ufc51"
+#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_JEEM_ISOLATED_FORM  U"\ufc51"
 #define UNICODE_ARABIC_LIGATURE_HEH_WITH_MEEM_ISOLATED_FORM  0xfc52
-#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_MEEM_ISOLATED_FORM  L"\ufc52"
+#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_MEEM_ISOLATED_FORM  U"\ufc52"
 #define UNICODE_ARABIC_LIGATURE_HEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc53
-#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc53"
+#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc53"
 #define UNICODE_ARABIC_LIGATURE_HEH_WITH_YEH_ISOLATED_FORM  0xfc54
-#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_YEH_ISOLATED_FORM  L"\ufc54"
+#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_YEH_ISOLATED_FORM  U"\ufc54"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_JEEM_ISOLATED_FORM  0xfc55
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_JEEM_ISOLATED_FORM  L"\ufc55"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_JEEM_ISOLATED_FORM  U"\ufc55"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAH_ISOLATED_FORM  0xfc56
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAH_ISOLATED_FORM  L"\ufc56"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAH_ISOLATED_FORM  U"\ufc56"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_KHAH_ISOLATED_FORM  0xfc57
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_KHAH_ISOLATED_FORM  L"\ufc57"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_KHAH_ISOLATED_FORM  U"\ufc57"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_MEEM_ISOLATED_FORM  0xfc58
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_ISOLATED_FORM  L"\ufc58"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_ISOLATED_FORM  U"\ufc58"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfc59
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufc59"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufc59"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_YEH_ISOLATED_FORM  0xfc5a
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_YEH_ISOLATED_FORM  L"\ufc5a"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_YEH_ISOLATED_FORM  U"\ufc5a"
 #define UNICODE_ARABIC_LIGATURE_THAL_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  0xfc5b
-#define UNITEXT_ARABIC_LIGATURE_THAL_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  L"\ufc5b"
+#define UNITEXT_ARABIC_LIGATURE_THAL_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  U"\ufc5b"
 #define UNICODE_ARABIC_LIGATURE_REH_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  0xfc5c
-#define UNITEXT_ARABIC_LIGATURE_REH_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  L"\ufc5c"
+#define UNITEXT_ARABIC_LIGATURE_REH_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  U"\ufc5c"
 #define UNICODE_ARABIC_LIGATURE_ALEF_MAKSURA_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  0xfc5d
-#define UNITEXT_ARABIC_LIGATURE_ALEF_MAKSURA_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  L"\ufc5d"
+#define UNITEXT_ARABIC_LIGATURE_ALEF_MAKSURA_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  U"\ufc5d"
 #define UNICODE_ARABIC_LIGATURE_SHADDA_WITH_DAMMATAN_ISOLATED_FORM  0xfc5e
-#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_DAMMATAN_ISOLATED_FORM  L"\ufc5e"
+#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_DAMMATAN_ISOLATED_FORM  U"\ufc5e"
 #define UNICODE_ARABIC_LIGATURE_SHADDA_WITH_KASRATAN_ISOLATED_FORM  0xfc5f
-#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_KASRATAN_ISOLATED_FORM  L"\ufc5f"
+#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_KASRATAN_ISOLATED_FORM  U"\ufc5f"
 #define UNICODE_ARABIC_LIGATURE_SHADDA_WITH_FATHA_ISOLATED_FORM  0xfc60
-#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_FATHA_ISOLATED_FORM  L"\ufc60"
+#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_FATHA_ISOLATED_FORM  U"\ufc60"
 #define UNICODE_ARABIC_LIGATURE_SHADDA_WITH_DAMMA_ISOLATED_FORM  0xfc61
-#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_DAMMA_ISOLATED_FORM  L"\ufc61"
+#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_DAMMA_ISOLATED_FORM  U"\ufc61"
 #define UNICODE_ARABIC_LIGATURE_SHADDA_WITH_KASRA_ISOLATED_FORM  0xfc62
-#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_KASRA_ISOLATED_FORM  L"\ufc62"
+#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_KASRA_ISOLATED_FORM  U"\ufc62"
 #define UNICODE_ARABIC_LIGATURE_SHADDA_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  0xfc63
-#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  L"\ufc63"
+#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_SUPERSCRIPT_ALEF_ISOLATED_FORM  U"\ufc63"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_REH_FINAL_FORM  0xfc64
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_REH_FINAL_FORM  L"\ufc64"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_REH_FINAL_FORM  U"\ufc64"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ZAIN_FINAL_FORM  0xfc65
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ZAIN_FINAL_FORM  L"\ufc65"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ZAIN_FINAL_FORM  U"\ufc65"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_FINAL_FORM  0xfc66
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_FINAL_FORM  L"\ufc66"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_FINAL_FORM  U"\ufc66"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_NOON_FINAL_FORM  0xfc67
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_NOON_FINAL_FORM  L"\ufc67"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_NOON_FINAL_FORM  U"\ufc67"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_FINAL_FORM  0xfc68
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufc68"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufc68"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YEH_FINAL_FORM  0xfc69
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YEH_FINAL_FORM  L"\ufc69"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_YEH_FINAL_FORM  U"\ufc69"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_REH_FINAL_FORM  0xfc6a
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_REH_FINAL_FORM  L"\ufc6a"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_REH_FINAL_FORM  U"\ufc6a"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_ZAIN_FINAL_FORM  0xfc6b
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_ZAIN_FINAL_FORM  L"\ufc6b"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_ZAIN_FINAL_FORM  U"\ufc6b"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_MEEM_FINAL_FORM  0xfc6c
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_MEEM_FINAL_FORM  L"\ufc6c"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_MEEM_FINAL_FORM  U"\ufc6c"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_NOON_FINAL_FORM  0xfc6d
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_NOON_FINAL_FORM  L"\ufc6d"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_NOON_FINAL_FORM  U"\ufc6d"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfc6e
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufc6e"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufc6e"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_YEH_FINAL_FORM  0xfc6f
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_YEH_FINAL_FORM  L"\ufc6f"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_YEH_FINAL_FORM  U"\ufc6f"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_REH_FINAL_FORM  0xfc70
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_REH_FINAL_FORM  L"\ufc70"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_REH_FINAL_FORM  U"\ufc70"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_ZAIN_FINAL_FORM  0xfc71
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_ZAIN_FINAL_FORM  L"\ufc71"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_ZAIN_FINAL_FORM  U"\ufc71"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_MEEM_FINAL_FORM  0xfc72
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_FINAL_FORM  L"\ufc72"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_FINAL_FORM  U"\ufc72"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_NOON_FINAL_FORM  0xfc73
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_NOON_FINAL_FORM  L"\ufc73"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_NOON_FINAL_FORM  U"\ufc73"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfc74
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufc74"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufc74"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_YEH_FINAL_FORM  0xfc75
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_YEH_FINAL_FORM  L"\ufc75"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_YEH_FINAL_FORM  U"\ufc75"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_REH_FINAL_FORM  0xfc76
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_REH_FINAL_FORM  L"\ufc76"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_REH_FINAL_FORM  U"\ufc76"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_ZAIN_FINAL_FORM  0xfc77
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_ZAIN_FINAL_FORM  L"\ufc77"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_ZAIN_FINAL_FORM  U"\ufc77"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_MEEM_FINAL_FORM  0xfc78
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_MEEM_FINAL_FORM  L"\ufc78"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_MEEM_FINAL_FORM  U"\ufc78"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_NOON_FINAL_FORM  0xfc79
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_NOON_FINAL_FORM  L"\ufc79"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_NOON_FINAL_FORM  U"\ufc79"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfc7a
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufc7a"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufc7a"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_YEH_FINAL_FORM  0xfc7b
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_YEH_FINAL_FORM  L"\ufc7b"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_YEH_FINAL_FORM  U"\ufc7b"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfc7c
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufc7c"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufc7c"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_YEH_FINAL_FORM  0xfc7d
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_YEH_FINAL_FORM  L"\ufc7d"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_YEH_FINAL_FORM  U"\ufc7d"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_ALEF_MAKSURA_FINAL_FORM  0xfc7e
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufc7e"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufc7e"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_YEH_FINAL_FORM  0xfc7f
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_YEH_FINAL_FORM  L"\ufc7f"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_YEH_FINAL_FORM  U"\ufc7f"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_ALEF_FINAL_FORM  0xfc80
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_ALEF_FINAL_FORM  L"\ufc80"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_ALEF_FINAL_FORM  U"\ufc80"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_LAM_FINAL_FORM  0xfc81
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_LAM_FINAL_FORM  L"\ufc81"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_LAM_FINAL_FORM  U"\ufc81"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_MEEM_FINAL_FORM  0xfc82
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_FINAL_FORM  L"\ufc82"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_FINAL_FORM  U"\ufc82"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_ALEF_MAKSURA_FINAL_FORM  0xfc83
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufc83"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufc83"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_YEH_FINAL_FORM  0xfc84
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_YEH_FINAL_FORM  L"\ufc84"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_YEH_FINAL_FORM  U"\ufc84"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_MEEM_FINAL_FORM  0xfc85
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_FINAL_FORM  L"\ufc85"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_FINAL_FORM  U"\ufc85"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfc86
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufc86"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufc86"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_YEH_FINAL_FORM  0xfc87
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_YEH_FINAL_FORM  L"\ufc87"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_YEH_FINAL_FORM  U"\ufc87"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_ALEF_FINAL_FORM  0xfc88
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_ALEF_FINAL_FORM  L"\ufc88"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_ALEF_FINAL_FORM  U"\ufc88"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_MEEM_FINAL_FORM  0xfc89
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_MEEM_FINAL_FORM  L"\ufc89"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_MEEM_FINAL_FORM  U"\ufc89"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_REH_FINAL_FORM  0xfc8a
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_REH_FINAL_FORM  L"\ufc8a"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_REH_FINAL_FORM  U"\ufc8a"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_ZAIN_FINAL_FORM  0xfc8b
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_ZAIN_FINAL_FORM  L"\ufc8b"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_ZAIN_FINAL_FORM  U"\ufc8b"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_MEEM_FINAL_FORM  0xfc8c
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_FINAL_FORM  L"\ufc8c"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_FINAL_FORM  U"\ufc8c"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_NOON_FINAL_FORM  0xfc8d
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_NOON_FINAL_FORM  L"\ufc8d"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_NOON_FINAL_FORM  U"\ufc8d"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_ALEF_MAKSURA_FINAL_FORM  0xfc8e
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufc8e"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufc8e"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_YEH_FINAL_FORM  0xfc8f
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_YEH_FINAL_FORM  L"\ufc8f"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_YEH_FINAL_FORM  U"\ufc8f"
 #define UNICODE_ARABIC_LIGATURE_ALEF_MAKSURA_WITH_SUPERSCRIPT_ALEF_FINAL_FORM  0xfc90
-#define UNITEXT_ARABIC_LIGATURE_ALEF_MAKSURA_WITH_SUPERSCRIPT_ALEF_FINAL_FORM  L"\ufc90"
+#define UNITEXT_ARABIC_LIGATURE_ALEF_MAKSURA_WITH_SUPERSCRIPT_ALEF_FINAL_FORM  U"\ufc90"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_REH_FINAL_FORM  0xfc91
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_REH_FINAL_FORM  L"\ufc91"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_REH_FINAL_FORM  U"\ufc91"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_ZAIN_FINAL_FORM  0xfc92
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_ZAIN_FINAL_FORM  L"\ufc92"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_ZAIN_FINAL_FORM  U"\ufc92"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_MEEM_FINAL_FORM  0xfc93
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_FINAL_FORM  L"\ufc93"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_FINAL_FORM  U"\ufc93"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_NOON_FINAL_FORM  0xfc94
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_NOON_FINAL_FORM  L"\ufc94"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_NOON_FINAL_FORM  U"\ufc94"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfc95
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufc95"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufc95"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_YEH_FINAL_FORM  0xfc96
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_YEH_FINAL_FORM  L"\ufc96"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_YEH_FINAL_FORM  U"\ufc96"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_JEEM_INITIAL_FORM  0xfc97
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_JEEM_INITIAL_FORM  L"\ufc97"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_JEEM_INITIAL_FORM  U"\ufc97"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HAH_INITIAL_FORM  0xfc98
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HAH_INITIAL_FORM  L"\ufc98"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HAH_INITIAL_FORM  U"\ufc98"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_KHAH_INITIAL_FORM  0xfc99
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_KHAH_INITIAL_FORM  L"\ufc99"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_KHAH_INITIAL_FORM  U"\ufc99"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_INITIAL_FORM  0xfc9a
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_INITIAL_FORM  L"\ufc9a"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_INITIAL_FORM  U"\ufc9a"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HEH_INITIAL_FORM  0xfc9b
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HEH_INITIAL_FORM  L"\ufc9b"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HEH_INITIAL_FORM  U"\ufc9b"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_JEEM_INITIAL_FORM  0xfc9c
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_JEEM_INITIAL_FORM  L"\ufc9c"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_JEEM_INITIAL_FORM  U"\ufc9c"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_HAH_INITIAL_FORM  0xfc9d
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_HAH_INITIAL_FORM  L"\ufc9d"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_HAH_INITIAL_FORM  U"\ufc9d"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_KHAH_INITIAL_FORM  0xfc9e
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_KHAH_INITIAL_FORM  L"\ufc9e"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_KHAH_INITIAL_FORM  U"\ufc9e"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_MEEM_INITIAL_FORM  0xfc9f
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_MEEM_INITIAL_FORM  L"\ufc9f"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_MEEM_INITIAL_FORM  U"\ufc9f"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_HEH_INITIAL_FORM  0xfca0
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_HEH_INITIAL_FORM  L"\ufca0"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_HEH_INITIAL_FORM  U"\ufca0"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_JEEM_INITIAL_FORM  0xfca1
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_JEEM_INITIAL_FORM  L"\ufca1"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_JEEM_INITIAL_FORM  U"\ufca1"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_HAH_INITIAL_FORM  0xfca2
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HAH_INITIAL_FORM  L"\ufca2"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HAH_INITIAL_FORM  U"\ufca2"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_KHAH_INITIAL_FORM  0xfca3
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_KHAH_INITIAL_FORM  L"\ufca3"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_KHAH_INITIAL_FORM  U"\ufca3"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_MEEM_INITIAL_FORM  0xfca4
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_INITIAL_FORM  L"\ufca4"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_INITIAL_FORM  U"\ufca4"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_HEH_INITIAL_FORM  0xfca5
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HEH_INITIAL_FORM  L"\ufca5"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HEH_INITIAL_FORM  U"\ufca5"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_MEEM_INITIAL_FORM  0xfca6
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_MEEM_INITIAL_FORM  L"\ufca6"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_MEEM_INITIAL_FORM  U"\ufca6"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_HAH_INITIAL_FORM  0xfca7
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_HAH_INITIAL_FORM  L"\ufca7"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_HAH_INITIAL_FORM  U"\ufca7"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_MEEM_INITIAL_FORM  0xfca8
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_INITIAL_FORM  L"\ufca8"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_INITIAL_FORM  U"\ufca8"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_JEEM_INITIAL_FORM  0xfca9
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_JEEM_INITIAL_FORM  L"\ufca9"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_JEEM_INITIAL_FORM  U"\ufca9"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_MEEM_INITIAL_FORM  0xfcaa
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_MEEM_INITIAL_FORM  L"\ufcaa"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_MEEM_INITIAL_FORM  U"\ufcaa"
 #define UNICODE_ARABIC_LIGATURE_KHAH_WITH_JEEM_INITIAL_FORM  0xfcab
-#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_JEEM_INITIAL_FORM  L"\ufcab"
+#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_JEEM_INITIAL_FORM  U"\ufcab"
 #define UNICODE_ARABIC_LIGATURE_KHAH_WITH_MEEM_INITIAL_FORM  0xfcac
-#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_MEEM_INITIAL_FORM  L"\ufcac"
+#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_MEEM_INITIAL_FORM  U"\ufcac"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_JEEM_INITIAL_FORM  0xfcad
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_JEEM_INITIAL_FORM  L"\ufcad"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_JEEM_INITIAL_FORM  U"\ufcad"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_HAH_INITIAL_FORM  0xfcae
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HAH_INITIAL_FORM  L"\ufcae"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HAH_INITIAL_FORM  U"\ufcae"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_KHAH_INITIAL_FORM  0xfcaf
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_KHAH_INITIAL_FORM  L"\ufcaf"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_KHAH_INITIAL_FORM  U"\ufcaf"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_MEEM_INITIAL_FORM  0xfcb0
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_INITIAL_FORM  L"\ufcb0"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_INITIAL_FORM  U"\ufcb0"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_HAH_INITIAL_FORM  0xfcb1
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_HAH_INITIAL_FORM  L"\ufcb1"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_HAH_INITIAL_FORM  U"\ufcb1"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_KHAH_INITIAL_FORM  0xfcb2
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_KHAH_INITIAL_FORM  L"\ufcb2"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_KHAH_INITIAL_FORM  U"\ufcb2"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_MEEM_INITIAL_FORM  0xfcb3
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_MEEM_INITIAL_FORM  L"\ufcb3"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_MEEM_INITIAL_FORM  U"\ufcb3"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_JEEM_INITIAL_FORM  0xfcb4
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_JEEM_INITIAL_FORM  L"\ufcb4"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_JEEM_INITIAL_FORM  U"\ufcb4"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_HAH_INITIAL_FORM  0xfcb5
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_HAH_INITIAL_FORM  L"\ufcb5"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_HAH_INITIAL_FORM  U"\ufcb5"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_KHAH_INITIAL_FORM  0xfcb6
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_KHAH_INITIAL_FORM  L"\ufcb6"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_KHAH_INITIAL_FORM  U"\ufcb6"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_MEEM_INITIAL_FORM  0xfcb7
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_MEEM_INITIAL_FORM  L"\ufcb7"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_MEEM_INITIAL_FORM  U"\ufcb7"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_HAH_INITIAL_FORM  0xfcb8
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_HAH_INITIAL_FORM  L"\ufcb8"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_HAH_INITIAL_FORM  U"\ufcb8"
 #define UNICODE_ARABIC_LIGATURE_ZAH_WITH_MEEM_INITIAL_FORM  0xfcb9
-#define UNITEXT_ARABIC_LIGATURE_ZAH_WITH_MEEM_INITIAL_FORM  L"\ufcb9"
+#define UNITEXT_ARABIC_LIGATURE_ZAH_WITH_MEEM_INITIAL_FORM  U"\ufcb9"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_JEEM_INITIAL_FORM  0xfcba
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_JEEM_INITIAL_FORM  L"\ufcba"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_JEEM_INITIAL_FORM  U"\ufcba"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_MEEM_INITIAL_FORM  0xfcbb
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_INITIAL_FORM  L"\ufcbb"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_INITIAL_FORM  U"\ufcbb"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_JEEM_INITIAL_FORM  0xfcbc
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_JEEM_INITIAL_FORM  L"\ufcbc"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_JEEM_INITIAL_FORM  U"\ufcbc"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_MEEM_INITIAL_FORM  0xfcbd
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_MEEM_INITIAL_FORM  L"\ufcbd"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_MEEM_INITIAL_FORM  U"\ufcbd"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_JEEM_INITIAL_FORM  0xfcbe
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_JEEM_INITIAL_FORM  L"\ufcbe"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_JEEM_INITIAL_FORM  U"\ufcbe"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_HAH_INITIAL_FORM  0xfcbf
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_HAH_INITIAL_FORM  L"\ufcbf"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_HAH_INITIAL_FORM  U"\ufcbf"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_KHAH_INITIAL_FORM  0xfcc0
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_KHAH_INITIAL_FORM  L"\ufcc0"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_KHAH_INITIAL_FORM  U"\ufcc0"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_MEEM_INITIAL_FORM  0xfcc1
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_MEEM_INITIAL_FORM  L"\ufcc1"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_MEEM_INITIAL_FORM  U"\ufcc1"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_HAH_INITIAL_FORM  0xfcc2
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_HAH_INITIAL_FORM  L"\ufcc2"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_HAH_INITIAL_FORM  U"\ufcc2"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_MEEM_INITIAL_FORM  0xfcc3
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_INITIAL_FORM  L"\ufcc3"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_INITIAL_FORM  U"\ufcc3"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_JEEM_INITIAL_FORM  0xfcc4
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_JEEM_INITIAL_FORM  L"\ufcc4"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_JEEM_INITIAL_FORM  U"\ufcc4"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_HAH_INITIAL_FORM  0xfcc5
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_HAH_INITIAL_FORM  L"\ufcc5"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_HAH_INITIAL_FORM  U"\ufcc5"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_KHAH_INITIAL_FORM  0xfcc6
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_KHAH_INITIAL_FORM  L"\ufcc6"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_KHAH_INITIAL_FORM  U"\ufcc6"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_LAM_INITIAL_FORM  0xfcc7
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_LAM_INITIAL_FORM  L"\ufcc7"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_LAM_INITIAL_FORM  U"\ufcc7"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_MEEM_INITIAL_FORM  0xfcc8
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_INITIAL_FORM  L"\ufcc8"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_INITIAL_FORM  U"\ufcc8"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_JEEM_INITIAL_FORM  0xfcc9
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_INITIAL_FORM  L"\ufcc9"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_INITIAL_FORM  U"\ufcc9"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_HAH_INITIAL_FORM  0xfcca
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_INITIAL_FORM  L"\ufcca"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_INITIAL_FORM  U"\ufcca"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_KHAH_INITIAL_FORM  0xfccb
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_KHAH_INITIAL_FORM  L"\ufccb"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_KHAH_INITIAL_FORM  U"\ufccb"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_MEEM_INITIAL_FORM  0xfccc
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_INITIAL_FORM  L"\ufccc"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_INITIAL_FORM  U"\ufccc"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_HEH_INITIAL_FORM  0xfccd
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HEH_INITIAL_FORM  L"\ufccd"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HEH_INITIAL_FORM  U"\ufccd"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_JEEM_INITIAL_FORM  0xfcce
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_INITIAL_FORM  L"\ufcce"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_INITIAL_FORM  U"\ufcce"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_HAH_INITIAL_FORM  0xfccf
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_HAH_INITIAL_FORM  L"\ufccf"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_HAH_INITIAL_FORM  U"\ufccf"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_KHAH_INITIAL_FORM  0xfcd0
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_KHAH_INITIAL_FORM  L"\ufcd0"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_KHAH_INITIAL_FORM  U"\ufcd0"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_MEEM_INITIAL_FORM  0xfcd1
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_MEEM_INITIAL_FORM  L"\ufcd1"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_MEEM_INITIAL_FORM  U"\ufcd1"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_JEEM_INITIAL_FORM  0xfcd2
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_INITIAL_FORM  L"\ufcd2"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_INITIAL_FORM  U"\ufcd2"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_HAH_INITIAL_FORM  0xfcd3
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HAH_INITIAL_FORM  L"\ufcd3"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HAH_INITIAL_FORM  U"\ufcd3"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_KHAH_INITIAL_FORM  0xfcd4
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_KHAH_INITIAL_FORM  L"\ufcd4"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_KHAH_INITIAL_FORM  U"\ufcd4"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_MEEM_INITIAL_FORM  0xfcd5
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_INITIAL_FORM  L"\ufcd5"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_INITIAL_FORM  U"\ufcd5"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_HEH_INITIAL_FORM  0xfcd6
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HEH_INITIAL_FORM  L"\ufcd6"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HEH_INITIAL_FORM  U"\ufcd6"
 #define UNICODE_ARABIC_LIGATURE_HEH_WITH_JEEM_INITIAL_FORM  0xfcd7
-#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_JEEM_INITIAL_FORM  L"\ufcd7"
+#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_JEEM_INITIAL_FORM  U"\ufcd7"
 #define UNICODE_ARABIC_LIGATURE_HEH_WITH_MEEM_INITIAL_FORM  0xfcd8
-#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_MEEM_INITIAL_FORM  L"\ufcd8"
+#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_MEEM_INITIAL_FORM  U"\ufcd8"
 #define UNICODE_ARABIC_LIGATURE_HEH_WITH_SUPERSCRIPT_ALEF_INITIAL_FORM  0xfcd9
-#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_SUPERSCRIPT_ALEF_INITIAL_FORM  L"\ufcd9"
+#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_SUPERSCRIPT_ALEF_INITIAL_FORM  U"\ufcd9"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_JEEM_INITIAL_FORM  0xfcda
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_JEEM_INITIAL_FORM  L"\ufcda"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_JEEM_INITIAL_FORM  U"\ufcda"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAH_INITIAL_FORM  0xfcdb
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAH_INITIAL_FORM  L"\ufcdb"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAH_INITIAL_FORM  U"\ufcdb"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_KHAH_INITIAL_FORM  0xfcdc
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_KHAH_INITIAL_FORM  L"\ufcdc"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_KHAH_INITIAL_FORM  U"\ufcdc"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_MEEM_INITIAL_FORM  0xfcdd
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_INITIAL_FORM  L"\ufcdd"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_INITIAL_FORM  U"\ufcdd"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HEH_INITIAL_FORM  0xfcde
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HEH_INITIAL_FORM  L"\ufcde"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HEH_INITIAL_FORM  U"\ufcde"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_MEDIAL_FORM  0xfcdf
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_MEDIAL_FORM  L"\ufcdf"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_MEEM_MEDIAL_FORM  U"\ufcdf"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HEH_MEDIAL_FORM  0xfce0
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HEH_MEDIAL_FORM  L"\ufce0"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAMZA_ABOVE_WITH_HEH_MEDIAL_FORM  U"\ufce0"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_MEEM_MEDIAL_FORM  0xfce1
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_MEEM_MEDIAL_FORM  L"\ufce1"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_MEEM_MEDIAL_FORM  U"\ufce1"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_HEH_MEDIAL_FORM  0xfce2
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_HEH_MEDIAL_FORM  L"\ufce2"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_HEH_MEDIAL_FORM  U"\ufce2"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_MEEM_MEDIAL_FORM  0xfce3
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_MEDIAL_FORM  L"\ufce3"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_MEDIAL_FORM  U"\ufce3"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_HEH_MEDIAL_FORM  0xfce4
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HEH_MEDIAL_FORM  L"\ufce4"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HEH_MEDIAL_FORM  U"\ufce4"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_MEEM_MEDIAL_FORM  0xfce5
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_MEEM_MEDIAL_FORM  L"\ufce5"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_MEEM_MEDIAL_FORM  U"\ufce5"
 #define UNICODE_ARABIC_LIGATURE_THEH_WITH_HEH_MEDIAL_FORM  0xfce6
-#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_HEH_MEDIAL_FORM  L"\ufce6"
+#define UNITEXT_ARABIC_LIGATURE_THEH_WITH_HEH_MEDIAL_FORM  U"\ufce6"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_MEEM_MEDIAL_FORM  0xfce7
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_MEDIAL_FORM  L"\ufce7"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_MEDIAL_FORM  U"\ufce7"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_HEH_MEDIAL_FORM  0xfce8
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HEH_MEDIAL_FORM  L"\ufce8"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HEH_MEDIAL_FORM  U"\ufce8"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_MEEM_MEDIAL_FORM  0xfce9
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_MEDIAL_FORM  L"\ufce9"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_MEDIAL_FORM  U"\ufce9"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_HEH_MEDIAL_FORM  0xfcea
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HEH_MEDIAL_FORM  L"\ufcea"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HEH_MEDIAL_FORM  U"\ufcea"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_LAM_MEDIAL_FORM  0xfceb
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_LAM_MEDIAL_FORM  L"\ufceb"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_LAM_MEDIAL_FORM  U"\ufceb"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_MEEM_MEDIAL_FORM  0xfcec
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_MEDIAL_FORM  L"\ufcec"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_MEDIAL_FORM  U"\ufcec"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_MEEM_MEDIAL_FORM  0xfced
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_MEDIAL_FORM  L"\ufced"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_MEDIAL_FORM  U"\ufced"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_MEEM_MEDIAL_FORM  0xfcee
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_MEDIAL_FORM  L"\ufcee"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_MEDIAL_FORM  U"\ufcee"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_HEH_MEDIAL_FORM  0xfcef
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HEH_MEDIAL_FORM  L"\ufcef"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HEH_MEDIAL_FORM  U"\ufcef"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_MEEM_MEDIAL_FORM  0xfcf0
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_MEDIAL_FORM  L"\ufcf0"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_MEDIAL_FORM  U"\ufcf0"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HEH_MEDIAL_FORM  0xfcf1
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HEH_MEDIAL_FORM  L"\ufcf1"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HEH_MEDIAL_FORM  U"\ufcf1"
 #define UNICODE_ARABIC_LIGATURE_SHADDA_WITH_FATHA_MEDIAL_FORM  0xfcf2
-#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_FATHA_MEDIAL_FORM  L"\ufcf2"
+#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_FATHA_MEDIAL_FORM  U"\ufcf2"
 #define UNICODE_ARABIC_LIGATURE_SHADDA_WITH_DAMMA_MEDIAL_FORM  0xfcf3
-#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_DAMMA_MEDIAL_FORM  L"\ufcf3"
+#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_DAMMA_MEDIAL_FORM  U"\ufcf3"
 #define UNICODE_ARABIC_LIGATURE_SHADDA_WITH_KASRA_MEDIAL_FORM  0xfcf4
-#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_KASRA_MEDIAL_FORM  L"\ufcf4"
+#define UNITEXT_ARABIC_LIGATURE_SHADDA_WITH_KASRA_MEDIAL_FORM  U"\ufcf4"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfcf5
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufcf5"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufcf5"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_YEH_ISOLATED_FORM  0xfcf6
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_YEH_ISOLATED_FORM  L"\ufcf6"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_YEH_ISOLATED_FORM  U"\ufcf6"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfcf7
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufcf7"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufcf7"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_YEH_ISOLATED_FORM  0xfcf8
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_YEH_ISOLATED_FORM  L"\ufcf8"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_YEH_ISOLATED_FORM  U"\ufcf8"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfcf9
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufcf9"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufcf9"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_YEH_ISOLATED_FORM  0xfcfa
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_YEH_ISOLATED_FORM  L"\ufcfa"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_YEH_ISOLATED_FORM  U"\ufcfa"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfcfb
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufcfb"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufcfb"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_YEH_ISOLATED_FORM  0xfcfc
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_YEH_ISOLATED_FORM  L"\ufcfc"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_YEH_ISOLATED_FORM  U"\ufcfc"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfcfd
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufcfd"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufcfd"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_YEH_ISOLATED_FORM  0xfcfe
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_YEH_ISOLATED_FORM  L"\ufcfe"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_YEH_ISOLATED_FORM  U"\ufcfe"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfcff
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufcff"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufcff"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_YEH_ISOLATED_FORM  0xfd00
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_YEH_ISOLATED_FORM  L"\ufd00"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_YEH_ISOLATED_FORM  U"\ufd00"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfd01
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufd01"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufd01"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_YEH_ISOLATED_FORM  0xfd02
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_YEH_ISOLATED_FORM  L"\ufd02"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_YEH_ISOLATED_FORM  U"\ufd02"
 #define UNICODE_ARABIC_LIGATURE_KHAH_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfd03
-#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufd03"
+#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufd03"
 #define UNICODE_ARABIC_LIGATURE_KHAH_WITH_YEH_ISOLATED_FORM  0xfd04
-#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_YEH_ISOLATED_FORM  L"\ufd04"
+#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_YEH_ISOLATED_FORM  U"\ufd04"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfd05
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufd05"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufd05"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_YEH_ISOLATED_FORM  0xfd06
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_YEH_ISOLATED_FORM  L"\ufd06"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_YEH_ISOLATED_FORM  U"\ufd06"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_ALEF_MAKSURA_ISOLATED_FORM  0xfd07
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_ALEF_MAKSURA_ISOLATED_FORM  L"\ufd07"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_ALEF_MAKSURA_ISOLATED_FORM  U"\ufd07"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_YEH_ISOLATED_FORM  0xfd08
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_YEH_ISOLATED_FORM  L"\ufd08"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_YEH_ISOLATED_FORM  U"\ufd08"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_JEEM_ISOLATED_FORM  0xfd09
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_JEEM_ISOLATED_FORM  L"\ufd09"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_JEEM_ISOLATED_FORM  U"\ufd09"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_HAH_ISOLATED_FORM  0xfd0a
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_ISOLATED_FORM  L"\ufd0a"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_ISOLATED_FORM  U"\ufd0a"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_KHAH_ISOLATED_FORM  0xfd0b
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_KHAH_ISOLATED_FORM  L"\ufd0b"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_KHAH_ISOLATED_FORM  U"\ufd0b"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_MEEM_ISOLATED_FORM  0xfd0c
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_ISOLATED_FORM  L"\ufd0c"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_ISOLATED_FORM  U"\ufd0c"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_REH_ISOLATED_FORM  0xfd0d
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_REH_ISOLATED_FORM  L"\ufd0d"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_REH_ISOLATED_FORM  U"\ufd0d"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_REH_ISOLATED_FORM  0xfd0e
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_REH_ISOLATED_FORM  L"\ufd0e"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_REH_ISOLATED_FORM  U"\ufd0e"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_REH_ISOLATED_FORM  0xfd0f
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_REH_ISOLATED_FORM  L"\ufd0f"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_REH_ISOLATED_FORM  U"\ufd0f"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_REH_ISOLATED_FORM  0xfd10
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_REH_ISOLATED_FORM  L"\ufd10"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_REH_ISOLATED_FORM  U"\ufd10"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd11
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd11"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd11"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_YEH_FINAL_FORM  0xfd12
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_YEH_FINAL_FORM  L"\ufd12"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_YEH_FINAL_FORM  U"\ufd12"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd13
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd13"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd13"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_YEH_FINAL_FORM  0xfd14
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_YEH_FINAL_FORM  L"\ufd14"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_YEH_FINAL_FORM  U"\ufd14"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd15
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd15"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd15"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_YEH_FINAL_FORM  0xfd16
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_YEH_FINAL_FORM  L"\ufd16"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_YEH_FINAL_FORM  U"\ufd16"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd17
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd17"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd17"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_YEH_FINAL_FORM  0xfd18
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_YEH_FINAL_FORM  L"\ufd18"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_YEH_FINAL_FORM  U"\ufd18"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd19
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd19"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd19"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_YEH_FINAL_FORM  0xfd1a
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_YEH_FINAL_FORM  L"\ufd1a"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_YEH_FINAL_FORM  U"\ufd1a"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd1b
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd1b"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd1b"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_YEH_FINAL_FORM  0xfd1c
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_YEH_FINAL_FORM  L"\ufd1c"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_YEH_FINAL_FORM  U"\ufd1c"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd1d
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd1d"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd1d"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_YEH_FINAL_FORM  0xfd1e
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_YEH_FINAL_FORM  L"\ufd1e"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_YEH_FINAL_FORM  U"\ufd1e"
 #define UNICODE_ARABIC_LIGATURE_KHAH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd1f
-#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd1f"
+#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd1f"
 #define UNICODE_ARABIC_LIGATURE_KHAH_WITH_YEH_FINAL_FORM  0xfd20
-#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_YEH_FINAL_FORM  L"\ufd20"
+#define UNITEXT_ARABIC_LIGATURE_KHAH_WITH_YEH_FINAL_FORM  U"\ufd20"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd21
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd21"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd21"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_YEH_FINAL_FORM  0xfd22
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_YEH_FINAL_FORM  L"\ufd22"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_YEH_FINAL_FORM  U"\ufd22"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd23
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd23"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd23"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_YEH_FINAL_FORM  0xfd24
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_YEH_FINAL_FORM  L"\ufd24"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_YEH_FINAL_FORM  U"\ufd24"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_JEEM_FINAL_FORM  0xfd25
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_JEEM_FINAL_FORM  L"\ufd25"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_JEEM_FINAL_FORM  U"\ufd25"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_HAH_FINAL_FORM  0xfd26
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_FINAL_FORM  L"\ufd26"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_FINAL_FORM  U"\ufd26"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_KHAH_FINAL_FORM  0xfd27
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_KHAH_FINAL_FORM  L"\ufd27"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_KHAH_FINAL_FORM  U"\ufd27"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_MEEM_FINAL_FORM  0xfd28
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_FINAL_FORM  L"\ufd28"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_FINAL_FORM  U"\ufd28"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_REH_FINAL_FORM  0xfd29
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_REH_FINAL_FORM  L"\ufd29"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_REH_FINAL_FORM  U"\ufd29"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_REH_FINAL_FORM  0xfd2a
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_REH_FINAL_FORM  L"\ufd2a"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_REH_FINAL_FORM  U"\ufd2a"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_REH_FINAL_FORM  0xfd2b
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_REH_FINAL_FORM  L"\ufd2b"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_REH_FINAL_FORM  U"\ufd2b"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_REH_FINAL_FORM  0xfd2c
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_REH_FINAL_FORM  L"\ufd2c"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_REH_FINAL_FORM  U"\ufd2c"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_JEEM_INITIAL_FORM  0xfd2d
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_JEEM_INITIAL_FORM  L"\ufd2d"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_JEEM_INITIAL_FORM  U"\ufd2d"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_HAH_INITIAL_FORM  0xfd2e
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_INITIAL_FORM  L"\ufd2e"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_INITIAL_FORM  U"\ufd2e"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_KHAH_INITIAL_FORM  0xfd2f
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_KHAH_INITIAL_FORM  L"\ufd2f"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_KHAH_INITIAL_FORM  U"\ufd2f"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_MEEM_INITIAL_FORM  0xfd30
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_INITIAL_FORM  L"\ufd30"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_INITIAL_FORM  U"\ufd30"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_HEH_INITIAL_FORM  0xfd31
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HEH_INITIAL_FORM  L"\ufd31"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HEH_INITIAL_FORM  U"\ufd31"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_HEH_INITIAL_FORM  0xfd32
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HEH_INITIAL_FORM  L"\ufd32"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HEH_INITIAL_FORM  U"\ufd32"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_MEEM_INITIAL_FORM  0xfd33
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_INITIAL_FORM  L"\ufd33"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_INITIAL_FORM  U"\ufd33"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_JEEM_MEDIAL_FORM  0xfd34
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_JEEM_MEDIAL_FORM  L"\ufd34"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_JEEM_MEDIAL_FORM  U"\ufd34"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_HAH_MEDIAL_FORM  0xfd35
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HAH_MEDIAL_FORM  L"\ufd35"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HAH_MEDIAL_FORM  U"\ufd35"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_KHAH_MEDIAL_FORM  0xfd36
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_KHAH_MEDIAL_FORM  L"\ufd36"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_KHAH_MEDIAL_FORM  U"\ufd36"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_JEEM_MEDIAL_FORM  0xfd37
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_JEEM_MEDIAL_FORM  L"\ufd37"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_JEEM_MEDIAL_FORM  U"\ufd37"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_HAH_MEDIAL_FORM  0xfd38
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_MEDIAL_FORM  L"\ufd38"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_MEDIAL_FORM  U"\ufd38"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_KHAH_MEDIAL_FORM  0xfd39
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_KHAH_MEDIAL_FORM  L"\ufd39"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_KHAH_MEDIAL_FORM  U"\ufd39"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_MEEM_MEDIAL_FORM  0xfd3a
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_MEDIAL_FORM  L"\ufd3a"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_MEDIAL_FORM  U"\ufd3a"
 #define UNICODE_ARABIC_LIGATURE_ZAH_WITH_MEEM_MEDIAL_FORM  0xfd3b
-#define UNITEXT_ARABIC_LIGATURE_ZAH_WITH_MEEM_MEDIAL_FORM  L"\ufd3b"
+#define UNITEXT_ARABIC_LIGATURE_ZAH_WITH_MEEM_MEDIAL_FORM  U"\ufd3b"
 #define UNICODE_ARABIC_LIGATURE_ALEF_WITH_FATHATAN_FINAL_FORM  0xfd3c
-#define UNITEXT_ARABIC_LIGATURE_ALEF_WITH_FATHATAN_FINAL_FORM  L"\ufd3c"
+#define UNITEXT_ARABIC_LIGATURE_ALEF_WITH_FATHATAN_FINAL_FORM  U"\ufd3c"
 #define UNICODE_ARABIC_LIGATURE_ALEF_WITH_FATHATAN_ISOLATED_FORM  0xfd3d
-#define UNITEXT_ARABIC_LIGATURE_ALEF_WITH_FATHATAN_ISOLATED_FORM  L"\ufd3d"
+#define UNITEXT_ARABIC_LIGATURE_ALEF_WITH_FATHATAN_ISOLATED_FORM  U"\ufd3d"
 #define UNICODE_ORNATE_LEFT_PARENTHESIS  0xfd3e
-#define UNITEXT_ORNATE_LEFT_PARENTHESIS  L"\ufd3e"
+#define UNITEXT_ORNATE_LEFT_PARENTHESIS  U"\ufd3e"
 #define UNICODE_ORNATE_RIGHT_PARENTHESIS  0xfd3f
-#define UNITEXT_ORNATE_RIGHT_PARENTHESIS  L"\ufd3f"
+#define UNITEXT_ORNATE_RIGHT_PARENTHESIS  U"\ufd3f"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_JEEM_WITH_MEEM_INITIAL_FORM  0xfd50
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_JEEM_WITH_MEEM_INITIAL_FORM  L"\ufd50"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_JEEM_WITH_MEEM_INITIAL_FORM  U"\ufd50"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_HAH_WITH_JEEM_FINAL_FORM  0xfd51
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HAH_WITH_JEEM_FINAL_FORM  L"\ufd51"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HAH_WITH_JEEM_FINAL_FORM  U"\ufd51"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_HAH_WITH_JEEM_INITIAL_FORM  0xfd52
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HAH_WITH_JEEM_INITIAL_FORM  L"\ufd52"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HAH_WITH_JEEM_INITIAL_FORM  U"\ufd52"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_HAH_WITH_MEEM_INITIAL_FORM  0xfd53
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HAH_WITH_MEEM_INITIAL_FORM  L"\ufd53"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_HAH_WITH_MEEM_INITIAL_FORM  U"\ufd53"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_KHAH_WITH_MEEM_INITIAL_FORM  0xfd54
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_KHAH_WITH_MEEM_INITIAL_FORM  L"\ufd54"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_KHAH_WITH_MEEM_INITIAL_FORM  U"\ufd54"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_JEEM_INITIAL_FORM  0xfd55
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_JEEM_INITIAL_FORM  L"\ufd55"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_JEEM_INITIAL_FORM  U"\ufd55"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_HAH_INITIAL_FORM  0xfd56
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_HAH_INITIAL_FORM  L"\ufd56"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_HAH_INITIAL_FORM  U"\ufd56"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_KHAH_INITIAL_FORM  0xfd57
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_KHAH_INITIAL_FORM  L"\ufd57"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_KHAH_INITIAL_FORM  U"\ufd57"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_HAH_FINAL_FORM  0xfd58
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_HAH_FINAL_FORM  L"\ufd58"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_HAH_FINAL_FORM  U"\ufd58"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_HAH_INITIAL_FORM  0xfd59
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_HAH_INITIAL_FORM  L"\ufd59"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_HAH_INITIAL_FORM  U"\ufd59"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfd5a
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufd5a"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufd5a"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd5b
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd5b"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd5b"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_HAH_WITH_JEEM_INITIAL_FORM  0xfd5c
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HAH_WITH_JEEM_INITIAL_FORM  L"\ufd5c"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_HAH_WITH_JEEM_INITIAL_FORM  U"\ufd5c"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_JEEM_WITH_HAH_INITIAL_FORM  0xfd5d
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_JEEM_WITH_HAH_INITIAL_FORM  L"\ufd5d"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_JEEM_WITH_HAH_INITIAL_FORM  U"\ufd5d"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd5e
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd5e"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd5e"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_HAH_FINAL_FORM  0xfd5f
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_HAH_FINAL_FORM  L"\ufd5f"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_HAH_FINAL_FORM  U"\ufd5f"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_HAH_INITIAL_FORM  0xfd60
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_HAH_INITIAL_FORM  L"\ufd60"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_HAH_INITIAL_FORM  U"\ufd60"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_JEEM_INITIAL_FORM  0xfd61
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_JEEM_INITIAL_FORM  L"\ufd61"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_JEEM_INITIAL_FORM  U"\ufd61"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_MEEM_FINAL_FORM  0xfd62
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_MEEM_FINAL_FORM  L"\ufd62"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_MEEM_FINAL_FORM  U"\ufd62"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_MEEM_INITIAL_FORM  0xfd63
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_MEEM_INITIAL_FORM  L"\ufd63"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_MEEM_WITH_MEEM_INITIAL_FORM  U"\ufd63"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_HAH_WITH_HAH_FINAL_FORM  0xfd64
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_HAH_WITH_HAH_FINAL_FORM  L"\ufd64"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_HAH_WITH_HAH_FINAL_FORM  U"\ufd64"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_HAH_WITH_HAH_INITIAL_FORM  0xfd65
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_HAH_WITH_HAH_INITIAL_FORM  L"\ufd65"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_HAH_WITH_HAH_INITIAL_FORM  U"\ufd65"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_MEEM_WITH_MEEM_FINAL_FORM  0xfd66
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_MEEM_WITH_MEEM_FINAL_FORM  L"\ufd66"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_MEEM_WITH_MEEM_FINAL_FORM  U"\ufd66"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_HAH_WITH_MEEM_FINAL_FORM  0xfd67
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_WITH_MEEM_FINAL_FORM  L"\ufd67"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_WITH_MEEM_FINAL_FORM  U"\ufd67"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_HAH_WITH_MEEM_INITIAL_FORM  0xfd68
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_WITH_MEEM_INITIAL_FORM  L"\ufd68"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_WITH_MEEM_INITIAL_FORM  U"\ufd68"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_JEEM_WITH_YEH_FINAL_FORM  0xfd69
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_JEEM_WITH_YEH_FINAL_FORM  L"\ufd69"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_JEEM_WITH_YEH_FINAL_FORM  U"\ufd69"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_KHAH_FINAL_FORM  0xfd6a
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_KHAH_FINAL_FORM  L"\ufd6a"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_KHAH_FINAL_FORM  U"\ufd6a"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_KHAH_INITIAL_FORM  0xfd6b
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_KHAH_INITIAL_FORM  L"\ufd6b"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_KHAH_INITIAL_FORM  U"\ufd6b"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_MEEM_FINAL_FORM  0xfd6c
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_MEEM_FINAL_FORM  L"\ufd6c"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_MEEM_FINAL_FORM  U"\ufd6c"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_MEEM_INITIAL_FORM  0xfd6d
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_MEEM_INITIAL_FORM  L"\ufd6d"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_MEEM_WITH_MEEM_INITIAL_FORM  U"\ufd6d"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd6e
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd6e"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd6e"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_KHAH_WITH_MEEM_FINAL_FORM  0xfd6f
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_KHAH_WITH_MEEM_FINAL_FORM  L"\ufd6f"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_KHAH_WITH_MEEM_FINAL_FORM  U"\ufd6f"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_KHAH_WITH_MEEM_INITIAL_FORM  0xfd70
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_KHAH_WITH_MEEM_INITIAL_FORM  L"\ufd70"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_KHAH_WITH_MEEM_INITIAL_FORM  U"\ufd70"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_HAH_FINAL_FORM  0xfd71
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_HAH_FINAL_FORM  L"\ufd71"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_HAH_FINAL_FORM  U"\ufd71"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_HAH_INITIAL_FORM  0xfd72
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_HAH_INITIAL_FORM  L"\ufd72"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_HAH_INITIAL_FORM  U"\ufd72"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_MEEM_INITIAL_FORM  0xfd73
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_MEEM_INITIAL_FORM  L"\ufd73"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_MEEM_INITIAL_FORM  U"\ufd73"
 #define UNICODE_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfd74
-#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufd74"
+#define UNITEXT_ARABIC_LIGATURE_TAH_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufd74"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_JEEM_WITH_MEEM_FINAL_FORM  0xfd75
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_JEEM_WITH_MEEM_FINAL_FORM  L"\ufd75"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_JEEM_WITH_MEEM_FINAL_FORM  U"\ufd75"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_MEEM_FINAL_FORM  0xfd76
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_MEEM_FINAL_FORM  L"\ufd76"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_MEEM_FINAL_FORM  U"\ufd76"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_MEEM_INITIAL_FORM  0xfd77
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_MEEM_INITIAL_FORM  L"\ufd77"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_MEEM_INITIAL_FORM  U"\ufd77"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd78
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd78"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd78"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_MEEM_WITH_MEEM_FINAL_FORM  0xfd79
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_MEEM_WITH_MEEM_FINAL_FORM  L"\ufd79"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_MEEM_WITH_MEEM_FINAL_FORM  U"\ufd79"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfd7a
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufd7a"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufd7a"
 #define UNICODE_ARABIC_LIGATURE_GHAIN_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd7b
-#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd7b"
+#define UNITEXT_ARABIC_LIGATURE_GHAIN_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd7b"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_KHAH_WITH_MEEM_FINAL_FORM  0xfd7c
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_KHAH_WITH_MEEM_FINAL_FORM  L"\ufd7c"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_KHAH_WITH_MEEM_FINAL_FORM  U"\ufd7c"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_KHAH_WITH_MEEM_INITIAL_FORM  0xfd7d
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_KHAH_WITH_MEEM_INITIAL_FORM  L"\ufd7d"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_KHAH_WITH_MEEM_INITIAL_FORM  U"\ufd7d"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_HAH_FINAL_FORM  0xfd7e
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_HAH_FINAL_FORM  L"\ufd7e"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_HAH_FINAL_FORM  U"\ufd7e"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_MEEM_FINAL_FORM  0xfd7f
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_MEEM_FINAL_FORM  L"\ufd7f"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_MEEM_FINAL_FORM  U"\ufd7f"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_MEEM_FINAL_FORM  0xfd80
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_MEEM_FINAL_FORM  L"\ufd80"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_MEEM_FINAL_FORM  U"\ufd80"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_YEH_FINAL_FORM  0xfd81
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_YEH_FINAL_FORM  L"\ufd81"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_YEH_FINAL_FORM  U"\ufd81"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd82
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd82"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd82"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_JEEM_INITIAL_FORM  0xfd83
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_JEEM_INITIAL_FORM  L"\ufd83"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_JEEM_INITIAL_FORM  U"\ufd83"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_JEEM_FINAL_FORM  0xfd84
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_JEEM_FINAL_FORM  L"\ufd84"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_JEEM_FINAL_FORM  U"\ufd84"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_KHAH_WITH_MEEM_FINAL_FORM  0xfd85
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_KHAH_WITH_MEEM_FINAL_FORM  L"\ufd85"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_KHAH_WITH_MEEM_FINAL_FORM  U"\ufd85"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_KHAH_WITH_MEEM_INITIAL_FORM  0xfd86
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_KHAH_WITH_MEEM_INITIAL_FORM  L"\ufd86"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_KHAH_WITH_MEEM_INITIAL_FORM  U"\ufd86"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_MEEM_WITH_HAH_FINAL_FORM  0xfd87
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_WITH_HAH_FINAL_FORM  L"\ufd87"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_WITH_HAH_FINAL_FORM  U"\ufd87"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_MEEM_WITH_HAH_INITIAL_FORM  0xfd88
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_WITH_HAH_INITIAL_FORM  L"\ufd88"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_WITH_HAH_INITIAL_FORM  U"\ufd88"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_HAH_WITH_JEEM_INITIAL_FORM  0xfd89
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_HAH_WITH_JEEM_INITIAL_FORM  L"\ufd89"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_HAH_WITH_JEEM_INITIAL_FORM  U"\ufd89"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_HAH_WITH_MEEM_INITIAL_FORM  0xfd8a
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_HAH_WITH_MEEM_INITIAL_FORM  L"\ufd8a"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_HAH_WITH_MEEM_INITIAL_FORM  U"\ufd8a"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_HAH_WITH_YEH_FINAL_FORM  0xfd8b
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_HAH_WITH_YEH_FINAL_FORM  L"\ufd8b"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_HAH_WITH_YEH_FINAL_FORM  U"\ufd8b"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_HAH_INITIAL_FORM  0xfd8c
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_HAH_INITIAL_FORM  L"\ufd8c"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_HAH_INITIAL_FORM  U"\ufd8c"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_MEEM_INITIAL_FORM  0xfd8d
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_MEEM_INITIAL_FORM  L"\ufd8d"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_MEEM_INITIAL_FORM  U"\ufd8d"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_KHAH_WITH_JEEM_INITIAL_FORM  0xfd8e
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_KHAH_WITH_JEEM_INITIAL_FORM  L"\ufd8e"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_KHAH_WITH_JEEM_INITIAL_FORM  U"\ufd8e"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_KHAH_WITH_MEEM_INITIAL_FORM  0xfd8f
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_KHAH_WITH_MEEM_INITIAL_FORM  L"\ufd8f"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_KHAH_WITH_MEEM_INITIAL_FORM  U"\ufd8f"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_KHAH_INITIAL_FORM  0xfd92
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_KHAH_INITIAL_FORM  L"\ufd92"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_KHAH_INITIAL_FORM  U"\ufd92"
 #define UNICODE_ARABIC_LIGATURE_HEH_WITH_MEEM_WITH_JEEM_INITIAL_FORM  0xfd93
-#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_MEEM_WITH_JEEM_INITIAL_FORM  L"\ufd93"
+#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_MEEM_WITH_JEEM_INITIAL_FORM  U"\ufd93"
 #define UNICODE_ARABIC_LIGATURE_HEH_WITH_MEEM_WITH_MEEM_INITIAL_FORM  0xfd94
-#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_MEEM_WITH_MEEM_INITIAL_FORM  L"\ufd94"
+#define UNITEXT_ARABIC_LIGATURE_HEH_WITH_MEEM_WITH_MEEM_INITIAL_FORM  U"\ufd94"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_HAH_WITH_MEEM_INITIAL_FORM  0xfd95
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HAH_WITH_MEEM_INITIAL_FORM  L"\ufd95"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HAH_WITH_MEEM_INITIAL_FORM  U"\ufd95"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd96
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd96"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd96"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_MEEM_FINAL_FORM  0xfd97
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_MEEM_FINAL_FORM  L"\ufd97"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_MEEM_FINAL_FORM  U"\ufd97"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_MEEM_INITIAL_FORM  0xfd98
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_MEEM_INITIAL_FORM  L"\ufd98"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_MEEM_INITIAL_FORM  U"\ufd98"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd99
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd99"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd99"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfd9a
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufd9a"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufd9a"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfd9b
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufd9b"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufd9b"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_MEEM_WITH_MEEM_FINAL_FORM  0xfd9c
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_WITH_MEEM_FINAL_FORM  L"\ufd9c"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_WITH_MEEM_FINAL_FORM  U"\ufd9c"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_MEEM_WITH_MEEM_INITIAL_FORM  0xfd9d
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_WITH_MEEM_INITIAL_FORM  L"\ufd9d"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_WITH_MEEM_INITIAL_FORM  U"\ufd9d"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_KHAH_WITH_YEH_FINAL_FORM  0xfd9e
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_KHAH_WITH_YEH_FINAL_FORM  L"\ufd9e"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_KHAH_WITH_YEH_FINAL_FORM  U"\ufd9e"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_JEEM_WITH_YEH_FINAL_FORM  0xfd9f
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_JEEM_WITH_YEH_FINAL_FORM  L"\ufd9f"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_JEEM_WITH_YEH_FINAL_FORM  U"\ufd9f"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfda0
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufda0"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_JEEM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufda0"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_KHAH_WITH_YEH_FINAL_FORM  0xfda1
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_KHAH_WITH_YEH_FINAL_FORM  L"\ufda1"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_KHAH_WITH_YEH_FINAL_FORM  U"\ufda1"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_KHAH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfda2
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_KHAH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufda2"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_KHAH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufda2"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfda3
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufda3"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufda3"
 #define UNICODE_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfda4
-#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufda4"
+#define UNITEXT_ARABIC_LIGATURE_TEH_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufda4"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfda5
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufda5"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufda5"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfda6
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufda6"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_HAH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufda6"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  0xfda7
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufda7"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_MEEM_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufda7"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_KHAH_WITH_ALEF_MAKSURA_FINAL_FORM  0xfda8
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_KHAH_WITH_ALEF_MAKSURA_FINAL_FORM  L"\ufda8"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_KHAH_WITH_ALEF_MAKSURA_FINAL_FORM  U"\ufda8"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_HAH_WITH_YEH_FINAL_FORM  0xfda9
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_HAH_WITH_YEH_FINAL_FORM  L"\ufda9"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_HAH_WITH_YEH_FINAL_FORM  U"\ufda9"
 #define UNICODE_ARABIC_LIGATURE_SHEEN_WITH_HAH_WITH_YEH_FINAL_FORM  0xfdaa
-#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_WITH_YEH_FINAL_FORM  L"\ufdaa"
+#define UNITEXT_ARABIC_LIGATURE_SHEEN_WITH_HAH_WITH_YEH_FINAL_FORM  U"\ufdaa"
 #define UNICODE_ARABIC_LIGATURE_DAD_WITH_HAH_WITH_YEH_FINAL_FORM  0xfdab
-#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_HAH_WITH_YEH_FINAL_FORM  L"\ufdab"
+#define UNITEXT_ARABIC_LIGATURE_DAD_WITH_HAH_WITH_YEH_FINAL_FORM  U"\ufdab"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_YEH_FINAL_FORM  0xfdac
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_YEH_FINAL_FORM  L"\ufdac"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_YEH_FINAL_FORM  U"\ufdac"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfdad
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufdad"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufdad"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_HAH_WITH_YEH_FINAL_FORM  0xfdae
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAH_WITH_YEH_FINAL_FORM  L"\ufdae"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_HAH_WITH_YEH_FINAL_FORM  U"\ufdae"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_JEEM_WITH_YEH_FINAL_FORM  0xfdaf
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_JEEM_WITH_YEH_FINAL_FORM  L"\ufdaf"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_JEEM_WITH_YEH_FINAL_FORM  U"\ufdaf"
 #define UNICODE_ARABIC_LIGATURE_YEH_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfdb0
-#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufdb0"
+#define UNITEXT_ARABIC_LIGATURE_YEH_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufdb0"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfdb1
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufdb1"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufdb1"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfdb2
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufdb2"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufdb2"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_HAH_WITH_YEH_FINAL_FORM  0xfdb3
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HAH_WITH_YEH_FINAL_FORM  L"\ufdb3"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_HAH_WITH_YEH_FINAL_FORM  U"\ufdb3"
 #define UNICODE_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_HAH_INITIAL_FORM  0xfdb4
-#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_HAH_INITIAL_FORM  L"\ufdb4"
+#define UNITEXT_ARABIC_LIGATURE_QAF_WITH_MEEM_WITH_HAH_INITIAL_FORM  U"\ufdb4"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_MEEM_INITIAL_FORM  0xfdb5
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_MEEM_INITIAL_FORM  L"\ufdb5"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_HAH_WITH_MEEM_INITIAL_FORM  U"\ufdb5"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfdb6
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufdb6"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufdb6"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfdb7
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufdb7"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufdb7"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_HAH_INITIAL_FORM  0xfdb8
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_HAH_INITIAL_FORM  L"\ufdb8"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_HAH_INITIAL_FORM  U"\ufdb8"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_KHAH_WITH_YEH_FINAL_FORM  0xfdb9
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_KHAH_WITH_YEH_FINAL_FORM  L"\ufdb9"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_KHAH_WITH_YEH_FINAL_FORM  U"\ufdb9"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_MEEM_INITIAL_FORM  0xfdba
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_MEEM_INITIAL_FORM  L"\ufdba"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_MEEM_INITIAL_FORM  U"\ufdba"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_MEEM_WITH_MEEM_FINAL_FORM  0xfdbb
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_WITH_MEEM_FINAL_FORM  L"\ufdbb"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_WITH_MEEM_FINAL_FORM  U"\ufdbb"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_MEEM_FINAL_FORM  0xfdbc
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_MEEM_FINAL_FORM  L"\ufdbc"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_JEEM_WITH_MEEM_FINAL_FORM  U"\ufdbc"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_HAH_FINAL_FORM  0xfdbd
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_HAH_FINAL_FORM  L"\ufdbd"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_HAH_FINAL_FORM  U"\ufdbd"
 #define UNICODE_ARABIC_LIGATURE_JEEM_WITH_HAH_WITH_YEH_FINAL_FORM  0xfdbe
-#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_HAH_WITH_YEH_FINAL_FORM  L"\ufdbe"
+#define UNITEXT_ARABIC_LIGATURE_JEEM_WITH_HAH_WITH_YEH_FINAL_FORM  U"\ufdbe"
 #define UNICODE_ARABIC_LIGATURE_HAH_WITH_JEEM_WITH_YEH_FINAL_FORM  0xfdbf
-#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_JEEM_WITH_YEH_FINAL_FORM  L"\ufdbf"
+#define UNITEXT_ARABIC_LIGATURE_HAH_WITH_JEEM_WITH_YEH_FINAL_FORM  U"\ufdbf"
 #define UNICODE_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_YEH_FINAL_FORM  0xfdc0
-#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_YEH_FINAL_FORM  L"\ufdc0"
+#define UNITEXT_ARABIC_LIGATURE_MEEM_WITH_JEEM_WITH_YEH_FINAL_FORM  U"\ufdc0"
 #define UNICODE_ARABIC_LIGATURE_FEH_WITH_MEEM_WITH_YEH_FINAL_FORM  0xfdc1
-#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_MEEM_WITH_YEH_FINAL_FORM  L"\ufdc1"
+#define UNITEXT_ARABIC_LIGATURE_FEH_WITH_MEEM_WITH_YEH_FINAL_FORM  U"\ufdc1"
 #define UNICODE_ARABIC_LIGATURE_BEH_WITH_HAH_WITH_YEH_FINAL_FORM  0xfdc2
-#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_HAH_WITH_YEH_FINAL_FORM  L"\ufdc2"
+#define UNITEXT_ARABIC_LIGATURE_BEH_WITH_HAH_WITH_YEH_FINAL_FORM  U"\ufdc2"
 #define UNICODE_ARABIC_LIGATURE_KAF_WITH_MEEM_WITH_MEEM_INITIAL_FORM  0xfdc3
-#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_WITH_MEEM_INITIAL_FORM  L"\ufdc3"
+#define UNITEXT_ARABIC_LIGATURE_KAF_WITH_MEEM_WITH_MEEM_INITIAL_FORM  U"\ufdc3"
 #define UNICODE_ARABIC_LIGATURE_AIN_WITH_JEEM_WITH_MEEM_INITIAL_FORM  0xfdc4
-#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_JEEM_WITH_MEEM_INITIAL_FORM  L"\ufdc4"
+#define UNITEXT_ARABIC_LIGATURE_AIN_WITH_JEEM_WITH_MEEM_INITIAL_FORM  U"\ufdc4"
 #define UNICODE_ARABIC_LIGATURE_SAD_WITH_MEEM_WITH_MEEM_INITIAL_FORM  0xfdc5
-#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_MEEM_WITH_MEEM_INITIAL_FORM  L"\ufdc5"
+#define UNITEXT_ARABIC_LIGATURE_SAD_WITH_MEEM_WITH_MEEM_INITIAL_FORM  U"\ufdc5"
 #define UNICODE_ARABIC_LIGATURE_SEEN_WITH_KHAH_WITH_YEH_FINAL_FORM  0xfdc6
-#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_KHAH_WITH_YEH_FINAL_FORM  L"\ufdc6"
+#define UNITEXT_ARABIC_LIGATURE_SEEN_WITH_KHAH_WITH_YEH_FINAL_FORM  U"\ufdc6"
 #define UNICODE_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_YEH_FINAL_FORM  0xfdc7
-#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_YEH_FINAL_FORM  L"\ufdc7"
+#define UNITEXT_ARABIC_LIGATURE_NOON_WITH_JEEM_WITH_YEH_FINAL_FORM  U"\ufdc7"
 #define UNICODE_ARABIC_LIGATURE_SALLA_USED_AS_KORANIC_STOP_SIGN_ISOLATED_FORM  0xfdf0
-#define UNITEXT_ARABIC_LIGATURE_SALLA_USED_AS_KORANIC_STOP_SIGN_ISOLATED_FORM  L"\ufdf0"
+#define UNITEXT_ARABIC_LIGATURE_SALLA_USED_AS_KORANIC_STOP_SIGN_ISOLATED_FORM  U"\ufdf0"
 #define UNICODE_ARABIC_LIGATURE_QALA_USED_AS_KORANIC_STOP_SIGN_ISOLATED_FORM  0xfdf1
-#define UNITEXT_ARABIC_LIGATURE_QALA_USED_AS_KORANIC_STOP_SIGN_ISOLATED_FORM  L"\ufdf1"
+#define UNITEXT_ARABIC_LIGATURE_QALA_USED_AS_KORANIC_STOP_SIGN_ISOLATED_FORM  U"\ufdf1"
 #define UNICODE_ARABIC_LIGATURE_ALLAH_ISOLATED_FORM  0xfdf2
-#define UNITEXT_ARABIC_LIGATURE_ALLAH_ISOLATED_FORM  L"\ufdf2"
+#define UNITEXT_ARABIC_LIGATURE_ALLAH_ISOLATED_FORM  U"\ufdf2"
 #define UNICODE_ARABIC_LIGATURE_AKBAR_ISOLATED_FORM  0xfdf3
-#define UNITEXT_ARABIC_LIGATURE_AKBAR_ISOLATED_FORM  L"\ufdf3"
+#define UNITEXT_ARABIC_LIGATURE_AKBAR_ISOLATED_FORM  U"\ufdf3"
 #define UNICODE_ARABIC_LIGATURE_MOHAMMAD_ISOLATED_FORM  0xfdf4
-#define UNITEXT_ARABIC_LIGATURE_MOHAMMAD_ISOLATED_FORM  L"\ufdf4"
+#define UNITEXT_ARABIC_LIGATURE_MOHAMMAD_ISOLATED_FORM  U"\ufdf4"
 #define UNICODE_ARABIC_LIGATURE_SALAM_ISOLATED_FORM  0xfdf5
-#define UNITEXT_ARABIC_LIGATURE_SALAM_ISOLATED_FORM  L"\ufdf5"
+#define UNITEXT_ARABIC_LIGATURE_SALAM_ISOLATED_FORM  U"\ufdf5"
 #define UNICODE_ARABIC_LIGATURE_RASOUL_ISOLATED_FORM  0xfdf6
-#define UNITEXT_ARABIC_LIGATURE_RASOUL_ISOLATED_FORM  L"\ufdf6"
+#define UNITEXT_ARABIC_LIGATURE_RASOUL_ISOLATED_FORM  U"\ufdf6"
 #define UNICODE_ARABIC_LIGATURE_ALAYHE_ISOLATED_FORM  0xfdf7
-#define UNITEXT_ARABIC_LIGATURE_ALAYHE_ISOLATED_FORM  L"\ufdf7"
+#define UNITEXT_ARABIC_LIGATURE_ALAYHE_ISOLATED_FORM  U"\ufdf7"
 #define UNICODE_ARABIC_LIGATURE_WASALLAM_ISOLATED_FORM  0xfdf8
-#define UNITEXT_ARABIC_LIGATURE_WASALLAM_ISOLATED_FORM  L"\ufdf8"
+#define UNITEXT_ARABIC_LIGATURE_WASALLAM_ISOLATED_FORM  U"\ufdf8"
 #define UNICODE_ARABIC_LIGATURE_SALLA_ISOLATED_FORM  0xfdf9
-#define UNITEXT_ARABIC_LIGATURE_SALLA_ISOLATED_FORM  L"\ufdf9"
+#define UNITEXT_ARABIC_LIGATURE_SALLA_ISOLATED_FORM  U"\ufdf9"
 #define UNICODE_ARABIC_LIGATURE_SALLALLAHOU_ALAYHE_WASALLAM  0xfdfa
-#define UNITEXT_ARABIC_LIGATURE_SALLALLAHOU_ALAYHE_WASALLAM  L"\ufdfa"
+#define UNITEXT_ARABIC_LIGATURE_SALLALLAHOU_ALAYHE_WASALLAM  U"\ufdfa"
 #define UNICODE_ARABIC_LIGATURE_JALLAJALALOUHOU  0xfdfb
-#define UNITEXT_ARABIC_LIGATURE_JALLAJALALOUHOU  L"\ufdfb"
+#define UNITEXT_ARABIC_LIGATURE_JALLAJALALOUHOU  U"\ufdfb"
 #define UNICODE_RIAL_SIGN  0xfdfc
-#define UNITEXT_RIAL_SIGN  L"\ufdfc"
+#define UNITEXT_RIAL_SIGN  U"\ufdfc"
 #define UNICODE_ARABIC_LIGATURE_BISMILLAH_AR_RAHMAN_AR_RAHEEM  0xfdfd
-#define UNITEXT_ARABIC_LIGATURE_BISMILLAH_AR_RAHMAN_AR_RAHEEM  L"\ufdfd"
+#define UNITEXT_ARABIC_LIGATURE_BISMILLAH_AR_RAHMAN_AR_RAHEEM  U"\ufdfd"
 #define UNICODE_VARIATION_SELECTOR_1  0xfe00
-#define UNITEXT_VARIATION_SELECTOR_1  L"\ufe00"
+#define UNITEXT_VARIATION_SELECTOR_1  U"\ufe00"
 #define UNICODE_VARIATION_SELECTOR_2  0xfe01
-#define UNITEXT_VARIATION_SELECTOR_2  L"\ufe01"
+#define UNITEXT_VARIATION_SELECTOR_2  U"\ufe01"
 #define UNICODE_VARIATION_SELECTOR_3  0xfe02
-#define UNITEXT_VARIATION_SELECTOR_3  L"\ufe02"
+#define UNITEXT_VARIATION_SELECTOR_3  U"\ufe02"
 #define UNICODE_VARIATION_SELECTOR_4  0xfe03
-#define UNITEXT_VARIATION_SELECTOR_4  L"\ufe03"
+#define UNITEXT_VARIATION_SELECTOR_4  U"\ufe03"
 #define UNICODE_VARIATION_SELECTOR_5  0xfe04
-#define UNITEXT_VARIATION_SELECTOR_5  L"\ufe04"
+#define UNITEXT_VARIATION_SELECTOR_5  U"\ufe04"
 #define UNICODE_VARIATION_SELECTOR_6  0xfe05
-#define UNITEXT_VARIATION_SELECTOR_6  L"\ufe05"
+#define UNITEXT_VARIATION_SELECTOR_6  U"\ufe05"
 #define UNICODE_VARIATION_SELECTOR_7  0xfe06
-#define UNITEXT_VARIATION_SELECTOR_7  L"\ufe06"
+#define UNITEXT_VARIATION_SELECTOR_7  U"\ufe06"
 #define UNICODE_VARIATION_SELECTOR_8  0xfe07
-#define UNITEXT_VARIATION_SELECTOR_8  L"\ufe07"
+#define UNITEXT_VARIATION_SELECTOR_8  U"\ufe07"
 #define UNICODE_VARIATION_SELECTOR_9  0xfe08
-#define UNITEXT_VARIATION_SELECTOR_9  L"\ufe08"
+#define UNITEXT_VARIATION_SELECTOR_9  U"\ufe08"
 #define UNICODE_VARIATION_SELECTOR_10  0xfe09
-#define UNITEXT_VARIATION_SELECTOR_10  L"\ufe09"
+#define UNITEXT_VARIATION_SELECTOR_10  U"\ufe09"
 #define UNICODE_VARIATION_SELECTOR_11  0xfe0a
-#define UNITEXT_VARIATION_SELECTOR_11  L"\ufe0a"
+#define UNITEXT_VARIATION_SELECTOR_11  U"\ufe0a"
 #define UNICODE_VARIATION_SELECTOR_12  0xfe0b
-#define UNITEXT_VARIATION_SELECTOR_12  L"\ufe0b"
+#define UNITEXT_VARIATION_SELECTOR_12  U"\ufe0b"
 #define UNICODE_VARIATION_SELECTOR_13  0xfe0c
-#define UNITEXT_VARIATION_SELECTOR_13  L"\ufe0c"
+#define UNITEXT_VARIATION_SELECTOR_13  U"\ufe0c"
 #define UNICODE_VARIATION_SELECTOR_14  0xfe0d
-#define UNITEXT_VARIATION_SELECTOR_14  L"\ufe0d"
+#define UNITEXT_VARIATION_SELECTOR_14  U"\ufe0d"
 #define UNICODE_VARIATION_SELECTOR_15  0xfe0e
-#define UNITEXT_VARIATION_SELECTOR_15  L"\ufe0e"
+#define UNITEXT_VARIATION_SELECTOR_15  U"\ufe0e"
 #define UNICODE_VARIATION_SELECTOR_16  0xfe0f
-#define UNITEXT_VARIATION_SELECTOR_16  L"\ufe0f"
+#define UNITEXT_VARIATION_SELECTOR_16  U"\ufe0f"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_COMMA  0xfe10
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_COMMA  L"\ufe10"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_COMMA  U"\ufe10"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_IDEOGRAPHIC_COMMA  0xfe11
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_IDEOGRAPHIC_COMMA  L"\ufe11"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_IDEOGRAPHIC_COMMA  U"\ufe11"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_IDEOGRAPHIC_FULL_STOP  0xfe12
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_IDEOGRAPHIC_FULL_STOP  L"\ufe12"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_IDEOGRAPHIC_FULL_STOP  U"\ufe12"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_COLON  0xfe13
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_COLON  L"\ufe13"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_COLON  U"\ufe13"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_SEMICOLON  0xfe14
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_SEMICOLON  L"\ufe14"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_SEMICOLON  U"\ufe14"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_EXCLAMATION_MARK  0xfe15
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_EXCLAMATION_MARK  L"\ufe15"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_EXCLAMATION_MARK  U"\ufe15"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_QUESTION_MARK  0xfe16
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_QUESTION_MARK  L"\ufe16"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_QUESTION_MARK  U"\ufe16"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LEFT_WHITE_LENTICULAR_BRACKET  0xfe17
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_WHITE_LENTICULAR_BRACKET  L"\ufe17"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_WHITE_LENTICULAR_BRACKET  U"\ufe17"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_WHITE_LENTICULAR_BRAKCET  0xfe18
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_WHITE_LENTICULAR_BRAKCET  L"\ufe18"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_WHITE_LENTICULAR_BRAKCET  U"\ufe18"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_HORIZONTAL_ELLIPSIS  0xfe19
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_HORIZONTAL_ELLIPSIS  L"\ufe19"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_HORIZONTAL_ELLIPSIS  U"\ufe19"
 #define UNICODE_COMBINING_LIGATURE_LEFT_HALF  0xfe20
-#define UNITEXT_COMBINING_LIGATURE_LEFT_HALF  L"\ufe20"
+#define UNITEXT_COMBINING_LIGATURE_LEFT_HALF  U"\ufe20"
 #define UNICODE_COMBINING_LIGATURE_RIGHT_HALF  0xfe21
-#define UNITEXT_COMBINING_LIGATURE_RIGHT_HALF  L"\ufe21"
+#define UNITEXT_COMBINING_LIGATURE_RIGHT_HALF  U"\ufe21"
 #define UNICODE_COMBINING_DOUBLE_TILDE_LEFT_HALF  0xfe22
-#define UNITEXT_COMBINING_DOUBLE_TILDE_LEFT_HALF  L"\ufe22"
+#define UNITEXT_COMBINING_DOUBLE_TILDE_LEFT_HALF  U"\ufe22"
 #define UNICODE_COMBINING_DOUBLE_TILDE_RIGHT_HALF  0xfe23
-#define UNITEXT_COMBINING_DOUBLE_TILDE_RIGHT_HALF  L"\ufe23"
+#define UNITEXT_COMBINING_DOUBLE_TILDE_RIGHT_HALF  U"\ufe23"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_TWO_DOT_LEADER  0xfe30
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_TWO_DOT_LEADER  L"\ufe30"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_TWO_DOT_LEADER  U"\ufe30"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_EM_DASH  0xfe31
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_EM_DASH  L"\ufe31"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_EM_DASH  U"\ufe31"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_EN_DASH  0xfe32
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_EN_DASH  L"\ufe32"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_EN_DASH  U"\ufe32"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LOW_LINE  0xfe33
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LOW_LINE  L"\ufe33"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LOW_LINE  U"\ufe33"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_WAVY_LOW_LINE  0xfe34
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_WAVY_LOW_LINE  L"\ufe34"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_WAVY_LOW_LINE  U"\ufe34"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LEFT_PARENTHESIS  0xfe35
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_PARENTHESIS  L"\ufe35"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_PARENTHESIS  U"\ufe35"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_PARENTHESIS  0xfe36
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_PARENTHESIS  L"\ufe36"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_PARENTHESIS  U"\ufe36"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LEFT_CURLY_BRACKET  0xfe37
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_CURLY_BRACKET  L"\ufe37"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_CURLY_BRACKET  U"\ufe37"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_CURLY_BRACKET  0xfe38
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_CURLY_BRACKET  L"\ufe38"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_CURLY_BRACKET  U"\ufe38"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LEFT_TORTOISE_SHELL_BRACKET  0xfe39
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_TORTOISE_SHELL_BRACKET  L"\ufe39"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_TORTOISE_SHELL_BRACKET  U"\ufe39"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_TORTOISE_SHELL_BRACKET  0xfe3a
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_TORTOISE_SHELL_BRACKET  L"\ufe3a"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_TORTOISE_SHELL_BRACKET  U"\ufe3a"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LEFT_BLACK_LENTICULAR_BRACKET  0xfe3b
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_BLACK_LENTICULAR_BRACKET  L"\ufe3b"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_BLACK_LENTICULAR_BRACKET  U"\ufe3b"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_BLACK_LENTICULAR_BRACKET  0xfe3c
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_BLACK_LENTICULAR_BRACKET  L"\ufe3c"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_BLACK_LENTICULAR_BRACKET  U"\ufe3c"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LEFT_DOUBLE_ANGLE_BRACKET  0xfe3d
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_DOUBLE_ANGLE_BRACKET  L"\ufe3d"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_DOUBLE_ANGLE_BRACKET  U"\ufe3d"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_DOUBLE_ANGLE_BRACKET  0xfe3e
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_DOUBLE_ANGLE_BRACKET  L"\ufe3e"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_DOUBLE_ANGLE_BRACKET  U"\ufe3e"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LEFT_ANGLE_BRACKET  0xfe3f
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_ANGLE_BRACKET  L"\ufe3f"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_ANGLE_BRACKET  U"\ufe3f"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_ANGLE_BRACKET  0xfe40
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_ANGLE_BRACKET  L"\ufe40"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_ANGLE_BRACKET  U"\ufe40"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LEFT_CORNER_BRACKET  0xfe41
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_CORNER_BRACKET  L"\ufe41"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_CORNER_BRACKET  U"\ufe41"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_CORNER_BRACKET  0xfe42
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_CORNER_BRACKET  L"\ufe42"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_CORNER_BRACKET  U"\ufe42"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LEFT_WHITE_CORNER_BRACKET  0xfe43
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_WHITE_CORNER_BRACKET  L"\ufe43"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_WHITE_CORNER_BRACKET  U"\ufe43"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_WHITE_CORNER_BRACKET  0xfe44
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_WHITE_CORNER_BRACKET  L"\ufe44"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_WHITE_CORNER_BRACKET  U"\ufe44"
 #define UNICODE_SESAME_DOT  0xfe45
-#define UNITEXT_SESAME_DOT  L"\ufe45"
+#define UNITEXT_SESAME_DOT  U"\ufe45"
 #define UNICODE_WHITE_SESAME_DOT  0xfe46
-#define UNITEXT_WHITE_SESAME_DOT  L"\ufe46"
+#define UNITEXT_WHITE_SESAME_DOT  U"\ufe46"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_LEFT_SQUARE_BRACKET  0xfe47
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_SQUARE_BRACKET  L"\ufe47"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_LEFT_SQUARE_BRACKET  U"\ufe47"
 #define UNICODE_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_SQUARE_BRACKET  0xfe48
-#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_SQUARE_BRACKET  L"\ufe48"
+#define UNITEXT_PRESENTATION_FORM_FOR_VERTICAL_RIGHT_SQUARE_BRACKET  U"\ufe48"
 #define UNICODE_DASHED_OVERLINE  0xfe49
-#define UNITEXT_DASHED_OVERLINE  L"\ufe49"
+#define UNITEXT_DASHED_OVERLINE  U"\ufe49"
 #define UNICODE_CENTRELINE_OVERLINE  0xfe4a
-#define UNITEXT_CENTRELINE_OVERLINE  L"\ufe4a"
+#define UNITEXT_CENTRELINE_OVERLINE  U"\ufe4a"
 #define UNICODE_WAVY_OVERLINE  0xfe4b
-#define UNITEXT_WAVY_OVERLINE  L"\ufe4b"
+#define UNITEXT_WAVY_OVERLINE  U"\ufe4b"
 #define UNICODE_DOUBLE_WAVY_OVERLINE  0xfe4c
-#define UNITEXT_DOUBLE_WAVY_OVERLINE  L"\ufe4c"
+#define UNITEXT_DOUBLE_WAVY_OVERLINE  U"\ufe4c"
 #define UNICODE_DASHED_LOW_LINE  0xfe4d
-#define UNITEXT_DASHED_LOW_LINE  L"\ufe4d"
+#define UNITEXT_DASHED_LOW_LINE  U"\ufe4d"
 #define UNICODE_CENTRELINE_LOW_LINE  0xfe4e
-#define UNITEXT_CENTRELINE_LOW_LINE  L"\ufe4e"
+#define UNITEXT_CENTRELINE_LOW_LINE  U"\ufe4e"
 #define UNICODE_WAVY_LOW_LINE  0xfe4f
-#define UNITEXT_WAVY_LOW_LINE  L"\ufe4f"
+#define UNITEXT_WAVY_LOW_LINE  U"\ufe4f"
 #define UNICODE_SMALL_COMMA  0xfe50
-#define UNITEXT_SMALL_COMMA  L"\ufe50"
+#define UNITEXT_SMALL_COMMA  U"\ufe50"
 #define UNICODE_SMALL_IDEOGRAPHIC_COMMA  0xfe51
-#define UNITEXT_SMALL_IDEOGRAPHIC_COMMA  L"\ufe51"
+#define UNITEXT_SMALL_IDEOGRAPHIC_COMMA  U"\ufe51"
 #define UNICODE_SMALL_FULL_STOP  0xfe52
-#define UNITEXT_SMALL_FULL_STOP  L"\ufe52"
+#define UNITEXT_SMALL_FULL_STOP  U"\ufe52"
 #define UNICODE_SMALL_SEMICOLON  0xfe54
-#define UNITEXT_SMALL_SEMICOLON  L"\ufe54"
+#define UNITEXT_SMALL_SEMICOLON  U"\ufe54"
 #define UNICODE_SMALL_COLON  0xfe55
-#define UNITEXT_SMALL_COLON  L"\ufe55"
+#define UNITEXT_SMALL_COLON  U"\ufe55"
 #define UNICODE_SMALL_QUESTION_MARK  0xfe56
-#define UNITEXT_SMALL_QUESTION_MARK  L"\ufe56"
+#define UNITEXT_SMALL_QUESTION_MARK  U"\ufe56"
 #define UNICODE_SMALL_EXCLAMATION_MARK  0xfe57
-#define UNITEXT_SMALL_EXCLAMATION_MARK  L"\ufe57"
+#define UNITEXT_SMALL_EXCLAMATION_MARK  U"\ufe57"
 #define UNICODE_SMALL_EM_DASH  0xfe58
-#define UNITEXT_SMALL_EM_DASH  L"\ufe58"
+#define UNITEXT_SMALL_EM_DASH  U"\ufe58"
 #define UNICODE_SMALL_LEFT_PARENTHESIS  0xfe59
-#define UNITEXT_SMALL_LEFT_PARENTHESIS  L"\ufe59"
+#define UNITEXT_SMALL_LEFT_PARENTHESIS  U"\ufe59"
 #define UNICODE_SMALL_RIGHT_PARENTHESIS  0xfe5a
-#define UNITEXT_SMALL_RIGHT_PARENTHESIS  L"\ufe5a"
+#define UNITEXT_SMALL_RIGHT_PARENTHESIS  U"\ufe5a"
 #define UNICODE_SMALL_LEFT_CURLY_BRACKET  0xfe5b
-#define UNITEXT_SMALL_LEFT_CURLY_BRACKET  L"\ufe5b"
+#define UNITEXT_SMALL_LEFT_CURLY_BRACKET  U"\ufe5b"
 #define UNICODE_SMALL_RIGHT_CURLY_BRACKET  0xfe5c
-#define UNITEXT_SMALL_RIGHT_CURLY_BRACKET  L"\ufe5c"
+#define UNITEXT_SMALL_RIGHT_CURLY_BRACKET  U"\ufe5c"
 #define UNICODE_SMALL_LEFT_TORTOISE_SHELL_BRACKET  0xfe5d
-#define UNITEXT_SMALL_LEFT_TORTOISE_SHELL_BRACKET  L"\ufe5d"
+#define UNITEXT_SMALL_LEFT_TORTOISE_SHELL_BRACKET  U"\ufe5d"
 #define UNICODE_SMALL_RIGHT_TORTOISE_SHELL_BRACKET  0xfe5e
-#define UNITEXT_SMALL_RIGHT_TORTOISE_SHELL_BRACKET  L"\ufe5e"
+#define UNITEXT_SMALL_RIGHT_TORTOISE_SHELL_BRACKET  U"\ufe5e"
 #define UNICODE_SMALL_NUMBER_SIGN  0xfe5f
-#define UNITEXT_SMALL_NUMBER_SIGN  L"\ufe5f"
+#define UNITEXT_SMALL_NUMBER_SIGN  U"\ufe5f"
 #define UNICODE_SMALL_AMPERSAND  0xfe60
-#define UNITEXT_SMALL_AMPERSAND  L"\ufe60"
+#define UNITEXT_SMALL_AMPERSAND  U"\ufe60"
 #define UNICODE_SMALL_ASTERISK  0xfe61
-#define UNITEXT_SMALL_ASTERISK  L"\ufe61"
+#define UNITEXT_SMALL_ASTERISK  U"\ufe61"
 #define UNICODE_SMALL_PLUS_SIGN  0xfe62
-#define UNITEXT_SMALL_PLUS_SIGN  L"\ufe62"
+#define UNITEXT_SMALL_PLUS_SIGN  U"\ufe62"
 #define UNICODE_SMALL_HYPHEN_MINUS  0xfe63
-#define UNITEXT_SMALL_HYPHEN_MINUS  L"\ufe63"
+#define UNITEXT_SMALL_HYPHEN_MINUS  U"\ufe63"
 #define UNICODE_SMALL_LESS_THAN_SIGN  0xfe64
-#define UNITEXT_SMALL_LESS_THAN_SIGN  L"\ufe64"
+#define UNITEXT_SMALL_LESS_THAN_SIGN  U"\ufe64"
 #define UNICODE_SMALL_GREATER_THAN_SIGN  0xfe65
-#define UNITEXT_SMALL_GREATER_THAN_SIGN  L"\ufe65"
+#define UNITEXT_SMALL_GREATER_THAN_SIGN  U"\ufe65"
 #define UNICODE_SMALL_EQUALS_SIGN  0xfe66
-#define UNITEXT_SMALL_EQUALS_SIGN  L"\ufe66"
+#define UNITEXT_SMALL_EQUALS_SIGN  U"\ufe66"
 #define UNICODE_SMALL_REVERSE_SOLIDUS  0xfe68
-#define UNITEXT_SMALL_REVERSE_SOLIDUS  L"\ufe68"
+#define UNITEXT_SMALL_REVERSE_SOLIDUS  U"\ufe68"
 #define UNICODE_SMALL_DOLLAR_SIGN  0xfe69
-#define UNITEXT_SMALL_DOLLAR_SIGN  L"\ufe69"
+#define UNITEXT_SMALL_DOLLAR_SIGN  U"\ufe69"
 #define UNICODE_SMALL_PERCENT_SIGN  0xfe6a
-#define UNITEXT_SMALL_PERCENT_SIGN  L"\ufe6a"
+#define UNITEXT_SMALL_PERCENT_SIGN  U"\ufe6a"
 #define UNICODE_SMALL_COMMERCIAL_AT  0xfe6b
-#define UNITEXT_SMALL_COMMERCIAL_AT  L"\ufe6b"
+#define UNITEXT_SMALL_COMMERCIAL_AT  U"\ufe6b"
 #define UNICODE_ARABIC_FATHATAN_ISOLATED_FORM  0xfe70
-#define UNITEXT_ARABIC_FATHATAN_ISOLATED_FORM  L"\ufe70"
+#define UNITEXT_ARABIC_FATHATAN_ISOLATED_FORM  U"\ufe70"
 #define UNICODE_ARABIC_TATWEEL_WITH_FATHATAN_ABOVE  0xfe71
-#define UNITEXT_ARABIC_TATWEEL_WITH_FATHATAN_ABOVE  L"\ufe71"
+#define UNITEXT_ARABIC_TATWEEL_WITH_FATHATAN_ABOVE  U"\ufe71"
 #define UNICODE_ARABIC_DAMMATAN_ISOLATED_FORM  0xfe72
-#define UNITEXT_ARABIC_DAMMATAN_ISOLATED_FORM  L"\ufe72"
+#define UNITEXT_ARABIC_DAMMATAN_ISOLATED_FORM  U"\ufe72"
 #define UNICODE_ARABIC_TAIL_FRAGMENT  0xfe73
-#define UNITEXT_ARABIC_TAIL_FRAGMENT  L"\ufe73"
+#define UNITEXT_ARABIC_TAIL_FRAGMENT  U"\ufe73"
 #define UNICODE_ARABIC_KASRATAN_ISOLATED_FORM  0xfe74
-#define UNITEXT_ARABIC_KASRATAN_ISOLATED_FORM  L"\ufe74"
+#define UNITEXT_ARABIC_KASRATAN_ISOLATED_FORM  U"\ufe74"
 #define UNICODE_ARABIC_FATHA_ISOLATED_FORM  0xfe76
-#define UNITEXT_ARABIC_FATHA_ISOLATED_FORM  L"\ufe76"
+#define UNITEXT_ARABIC_FATHA_ISOLATED_FORM  U"\ufe76"
 #define UNICODE_ARABIC_FATHA_MEDIAL_FORM  0xfe77
-#define UNITEXT_ARABIC_FATHA_MEDIAL_FORM  L"\ufe77"
+#define UNITEXT_ARABIC_FATHA_MEDIAL_FORM  U"\ufe77"
 #define UNICODE_ARABIC_DAMMA_ISOLATED_FORM  0xfe78
-#define UNITEXT_ARABIC_DAMMA_ISOLATED_FORM  L"\ufe78"
+#define UNITEXT_ARABIC_DAMMA_ISOLATED_FORM  U"\ufe78"
 #define UNICODE_ARABIC_DAMMA_MEDIAL_FORM  0xfe79
-#define UNITEXT_ARABIC_DAMMA_MEDIAL_FORM  L"\ufe79"
+#define UNITEXT_ARABIC_DAMMA_MEDIAL_FORM  U"\ufe79"
 #define UNICODE_ARABIC_KASRA_ISOLATED_FORM  0xfe7a
-#define UNITEXT_ARABIC_KASRA_ISOLATED_FORM  L"\ufe7a"
+#define UNITEXT_ARABIC_KASRA_ISOLATED_FORM  U"\ufe7a"
 #define UNICODE_ARABIC_KASRA_MEDIAL_FORM  0xfe7b
-#define UNITEXT_ARABIC_KASRA_MEDIAL_FORM  L"\ufe7b"
+#define UNITEXT_ARABIC_KASRA_MEDIAL_FORM  U"\ufe7b"
 #define UNICODE_ARABIC_SHADDA_ISOLATED_FORM  0xfe7c
-#define UNITEXT_ARABIC_SHADDA_ISOLATED_FORM  L"\ufe7c"
+#define UNITEXT_ARABIC_SHADDA_ISOLATED_FORM  U"\ufe7c"
 #define UNICODE_ARABIC_SHADDA_MEDIAL_FORM  0xfe7d
-#define UNITEXT_ARABIC_SHADDA_MEDIAL_FORM  L"\ufe7d"
+#define UNITEXT_ARABIC_SHADDA_MEDIAL_FORM  U"\ufe7d"
 #define UNICODE_ARABIC_SUKUN_ISOLATED_FORM  0xfe7e
-#define UNITEXT_ARABIC_SUKUN_ISOLATED_FORM  L"\ufe7e"
+#define UNITEXT_ARABIC_SUKUN_ISOLATED_FORM  U"\ufe7e"
 #define UNICODE_ARABIC_SUKUN_MEDIAL_FORM  0xfe7f
-#define UNITEXT_ARABIC_SUKUN_MEDIAL_FORM  L"\ufe7f"
+#define UNITEXT_ARABIC_SUKUN_MEDIAL_FORM  U"\ufe7f"
 #define UNICODE_ARABIC_LETTER_HAMZA_ISOLATED_FORM  0xfe80
-#define UNITEXT_ARABIC_LETTER_HAMZA_ISOLATED_FORM  L"\ufe80"
+#define UNITEXT_ARABIC_LETTER_HAMZA_ISOLATED_FORM  U"\ufe80"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_MADDA_ABOVE_ISOLATED_FORM  0xfe81
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_MADDA_ABOVE_ISOLATED_FORM  L"\ufe81"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_MADDA_ABOVE_ISOLATED_FORM  U"\ufe81"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_MADDA_ABOVE_FINAL_FORM  0xfe82
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_MADDA_ABOVE_FINAL_FORM  L"\ufe82"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_MADDA_ABOVE_FINAL_FORM  U"\ufe82"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_HAMZA_ABOVE_ISOLATED_FORM  0xfe83
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_ABOVE_ISOLATED_FORM  L"\ufe83"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_ABOVE_ISOLATED_FORM  U"\ufe83"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_HAMZA_ABOVE_FINAL_FORM  0xfe84
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_ABOVE_FINAL_FORM  L"\ufe84"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_ABOVE_FINAL_FORM  U"\ufe84"
 #define UNICODE_ARABIC_LETTER_WAW_WITH_HAMZA_ABOVE_ISOLATED_FORM  0xfe85
-#define UNITEXT_ARABIC_LETTER_WAW_WITH_HAMZA_ABOVE_ISOLATED_FORM  L"\ufe85"
+#define UNITEXT_ARABIC_LETTER_WAW_WITH_HAMZA_ABOVE_ISOLATED_FORM  U"\ufe85"
 #define UNICODE_ARABIC_LETTER_WAW_WITH_HAMZA_ABOVE_FINAL_FORM  0xfe86
-#define UNITEXT_ARABIC_LETTER_WAW_WITH_HAMZA_ABOVE_FINAL_FORM  L"\ufe86"
+#define UNITEXT_ARABIC_LETTER_WAW_WITH_HAMZA_ABOVE_FINAL_FORM  U"\ufe86"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_HAMZA_BELOW_ISOLATED_FORM  0xfe87
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_BELOW_ISOLATED_FORM  L"\ufe87"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_BELOW_ISOLATED_FORM  U"\ufe87"
 #define UNICODE_ARABIC_LETTER_ALEF_WITH_HAMZA_BELOW_FINAL_FORM  0xfe88
-#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_BELOW_FINAL_FORM  L"\ufe88"
+#define UNITEXT_ARABIC_LETTER_ALEF_WITH_HAMZA_BELOW_FINAL_FORM  U"\ufe88"
 #define UNICODE_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_ISOLATED_FORM  0xfe89
-#define UNITEXT_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_ISOLATED_FORM  L"\ufe89"
+#define UNITEXT_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_ISOLATED_FORM  U"\ufe89"
 #define UNICODE_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_FINAL_FORM  0xfe8a
-#define UNITEXT_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_FINAL_FORM  L"\ufe8a"
+#define UNITEXT_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_FINAL_FORM  U"\ufe8a"
 #define UNICODE_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_INITIAL_FORM  0xfe8b
-#define UNITEXT_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_INITIAL_FORM  L"\ufe8b"
+#define UNITEXT_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_INITIAL_FORM  U"\ufe8b"
 #define UNICODE_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_MEDIAL_FORM  0xfe8c
-#define UNITEXT_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_MEDIAL_FORM  L"\ufe8c"
+#define UNITEXT_ARABIC_LETTER_YEH_WITH_HAMZA_ABOVE_MEDIAL_FORM  U"\ufe8c"
 #define UNICODE_ARABIC_LETTER_ALEF_ISOLATED_FORM  0xfe8d
-#define UNITEXT_ARABIC_LETTER_ALEF_ISOLATED_FORM  L"\ufe8d"
+#define UNITEXT_ARABIC_LETTER_ALEF_ISOLATED_FORM  U"\ufe8d"
 #define UNICODE_ARABIC_LETTER_ALEF_FINAL_FORM  0xfe8e
-#define UNITEXT_ARABIC_LETTER_ALEF_FINAL_FORM  L"\ufe8e"
+#define UNITEXT_ARABIC_LETTER_ALEF_FINAL_FORM  U"\ufe8e"
 #define UNICODE_ARABIC_LETTER_BEH_ISOLATED_FORM  0xfe8f
-#define UNITEXT_ARABIC_LETTER_BEH_ISOLATED_FORM  L"\ufe8f"
+#define UNITEXT_ARABIC_LETTER_BEH_ISOLATED_FORM  U"\ufe8f"
 #define UNICODE_ARABIC_LETTER_BEH_FINAL_FORM  0xfe90
-#define UNITEXT_ARABIC_LETTER_BEH_FINAL_FORM  L"\ufe90"
+#define UNITEXT_ARABIC_LETTER_BEH_FINAL_FORM  U"\ufe90"
 #define UNICODE_ARABIC_LETTER_BEH_INITIAL_FORM  0xfe91
-#define UNITEXT_ARABIC_LETTER_BEH_INITIAL_FORM  L"\ufe91"
+#define UNITEXT_ARABIC_LETTER_BEH_INITIAL_FORM  U"\ufe91"
 #define UNICODE_ARABIC_LETTER_BEH_MEDIAL_FORM  0xfe92
-#define UNITEXT_ARABIC_LETTER_BEH_MEDIAL_FORM  L"\ufe92"
+#define UNITEXT_ARABIC_LETTER_BEH_MEDIAL_FORM  U"\ufe92"
 #define UNICODE_ARABIC_LETTER_TEH_MARBUTA_ISOLATED_FORM  0xfe93
-#define UNITEXT_ARABIC_LETTER_TEH_MARBUTA_ISOLATED_FORM  L"\ufe93"
+#define UNITEXT_ARABIC_LETTER_TEH_MARBUTA_ISOLATED_FORM  U"\ufe93"
 #define UNICODE_ARABIC_LETTER_TEH_MARBUTA_FINAL_FORM  0xfe94
-#define UNITEXT_ARABIC_LETTER_TEH_MARBUTA_FINAL_FORM  L"\ufe94"
+#define UNITEXT_ARABIC_LETTER_TEH_MARBUTA_FINAL_FORM  U"\ufe94"
 #define UNICODE_ARABIC_LETTER_TEH_ISOLATED_FORM  0xfe95
-#define UNITEXT_ARABIC_LETTER_TEH_ISOLATED_FORM  L"\ufe95"
+#define UNITEXT_ARABIC_LETTER_TEH_ISOLATED_FORM  U"\ufe95"
 #define UNICODE_ARABIC_LETTER_TEH_FINAL_FORM  0xfe96
-#define UNITEXT_ARABIC_LETTER_TEH_FINAL_FORM  L"\ufe96"
+#define UNITEXT_ARABIC_LETTER_TEH_FINAL_FORM  U"\ufe96"
 #define UNICODE_ARABIC_LETTER_TEH_INITIAL_FORM  0xfe97
-#define UNITEXT_ARABIC_LETTER_TEH_INITIAL_FORM  L"\ufe97"
+#define UNITEXT_ARABIC_LETTER_TEH_INITIAL_FORM  U"\ufe97"
 #define UNICODE_ARABIC_LETTER_TEH_MEDIAL_FORM  0xfe98
-#define UNITEXT_ARABIC_LETTER_TEH_MEDIAL_FORM  L"\ufe98"
+#define UNITEXT_ARABIC_LETTER_TEH_MEDIAL_FORM  U"\ufe98"
 #define UNICODE_ARABIC_LETTER_THEH_ISOLATED_FORM  0xfe99
-#define UNITEXT_ARABIC_LETTER_THEH_ISOLATED_FORM  L"\ufe99"
+#define UNITEXT_ARABIC_LETTER_THEH_ISOLATED_FORM  U"\ufe99"
 #define UNICODE_ARABIC_LETTER_THEH_FINAL_FORM  0xfe9a
-#define UNITEXT_ARABIC_LETTER_THEH_FINAL_FORM  L"\ufe9a"
+#define UNITEXT_ARABIC_LETTER_THEH_FINAL_FORM  U"\ufe9a"
 #define UNICODE_ARABIC_LETTER_THEH_INITIAL_FORM  0xfe9b
-#define UNITEXT_ARABIC_LETTER_THEH_INITIAL_FORM  L"\ufe9b"
+#define UNITEXT_ARABIC_LETTER_THEH_INITIAL_FORM  U"\ufe9b"
 #define UNICODE_ARABIC_LETTER_THEH_MEDIAL_FORM  0xfe9c
-#define UNITEXT_ARABIC_LETTER_THEH_MEDIAL_FORM  L"\ufe9c"
+#define UNITEXT_ARABIC_LETTER_THEH_MEDIAL_FORM  U"\ufe9c"
 #define UNICODE_ARABIC_LETTER_JEEM_ISOLATED_FORM  0xfe9d
-#define UNITEXT_ARABIC_LETTER_JEEM_ISOLATED_FORM  L"\ufe9d"
+#define UNITEXT_ARABIC_LETTER_JEEM_ISOLATED_FORM  U"\ufe9d"
 #define UNICODE_ARABIC_LETTER_JEEM_FINAL_FORM  0xfe9e
-#define UNITEXT_ARABIC_LETTER_JEEM_FINAL_FORM  L"\ufe9e"
+#define UNITEXT_ARABIC_LETTER_JEEM_FINAL_FORM  U"\ufe9e"
 #define UNICODE_ARABIC_LETTER_JEEM_INITIAL_FORM  0xfe9f
-#define UNITEXT_ARABIC_LETTER_JEEM_INITIAL_FORM  L"\ufe9f"
+#define UNITEXT_ARABIC_LETTER_JEEM_INITIAL_FORM  U"\ufe9f"
 #define UNICODE_ARABIC_LETTER_JEEM_MEDIAL_FORM  0xfea0
-#define UNITEXT_ARABIC_LETTER_JEEM_MEDIAL_FORM  L"\ufea0"
+#define UNITEXT_ARABIC_LETTER_JEEM_MEDIAL_FORM  U"\ufea0"
 #define UNICODE_ARABIC_LETTER_HAH_ISOLATED_FORM  0xfea1
-#define UNITEXT_ARABIC_LETTER_HAH_ISOLATED_FORM  L"\ufea1"
+#define UNITEXT_ARABIC_LETTER_HAH_ISOLATED_FORM  U"\ufea1"
 #define UNICODE_ARABIC_LETTER_HAH_FINAL_FORM  0xfea2
-#define UNITEXT_ARABIC_LETTER_HAH_FINAL_FORM  L"\ufea2"
+#define UNITEXT_ARABIC_LETTER_HAH_FINAL_FORM  U"\ufea2"
 #define UNICODE_ARABIC_LETTER_HAH_INITIAL_FORM  0xfea3
-#define UNITEXT_ARABIC_LETTER_HAH_INITIAL_FORM  L"\ufea3"
+#define UNITEXT_ARABIC_LETTER_HAH_INITIAL_FORM  U"\ufea3"
 #define UNICODE_ARABIC_LETTER_HAH_MEDIAL_FORM  0xfea4
-#define UNITEXT_ARABIC_LETTER_HAH_MEDIAL_FORM  L"\ufea4"
+#define UNITEXT_ARABIC_LETTER_HAH_MEDIAL_FORM  U"\ufea4"
 #define UNICODE_ARABIC_LETTER_KHAH_ISOLATED_FORM  0xfea5
-#define UNITEXT_ARABIC_LETTER_KHAH_ISOLATED_FORM  L"\ufea5"
+#define UNITEXT_ARABIC_LETTER_KHAH_ISOLATED_FORM  U"\ufea5"
 #define UNICODE_ARABIC_LETTER_KHAH_FINAL_FORM  0xfea6
-#define UNITEXT_ARABIC_LETTER_KHAH_FINAL_FORM  L"\ufea6"
+#define UNITEXT_ARABIC_LETTER_KHAH_FINAL_FORM  U"\ufea6"
 #define UNICODE_ARABIC_LETTER_KHAH_INITIAL_FORM  0xfea7
-#define UNITEXT_ARABIC_LETTER_KHAH_INITIAL_FORM  L"\ufea7"
+#define UNITEXT_ARABIC_LETTER_KHAH_INITIAL_FORM  U"\ufea7"
 #define UNICODE_ARABIC_LETTER_KHAH_MEDIAL_FORM  0xfea8
-#define UNITEXT_ARABIC_LETTER_KHAH_MEDIAL_FORM  L"\ufea8"
+#define UNITEXT_ARABIC_LETTER_KHAH_MEDIAL_FORM  U"\ufea8"
 #define UNICODE_ARABIC_LETTER_DAL_ISOLATED_FORM  0xfea9
-#define UNITEXT_ARABIC_LETTER_DAL_ISOLATED_FORM  L"\ufea9"
+#define UNITEXT_ARABIC_LETTER_DAL_ISOLATED_FORM  U"\ufea9"
 #define UNICODE_ARABIC_LETTER_DAL_FINAL_FORM  0xfeaa
-#define UNITEXT_ARABIC_LETTER_DAL_FINAL_FORM  L"\ufeaa"
+#define UNITEXT_ARABIC_LETTER_DAL_FINAL_FORM  U"\ufeaa"
 #define UNICODE_ARABIC_LETTER_THAL_ISOLATED_FORM  0xfeab
-#define UNITEXT_ARABIC_LETTER_THAL_ISOLATED_FORM  L"\ufeab"
+#define UNITEXT_ARABIC_LETTER_THAL_ISOLATED_FORM  U"\ufeab"
 #define UNICODE_ARABIC_LETTER_THAL_FINAL_FORM  0xfeac
-#define UNITEXT_ARABIC_LETTER_THAL_FINAL_FORM  L"\ufeac"
+#define UNITEXT_ARABIC_LETTER_THAL_FINAL_FORM  U"\ufeac"
 #define UNICODE_ARABIC_LETTER_REH_ISOLATED_FORM  0xfead
-#define UNITEXT_ARABIC_LETTER_REH_ISOLATED_FORM  L"\ufead"
+#define UNITEXT_ARABIC_LETTER_REH_ISOLATED_FORM  U"\ufead"
 #define UNICODE_ARABIC_LETTER_REH_FINAL_FORM  0xfeae
-#define UNITEXT_ARABIC_LETTER_REH_FINAL_FORM  L"\ufeae"
+#define UNITEXT_ARABIC_LETTER_REH_FINAL_FORM  U"\ufeae"
 #define UNICODE_ARABIC_LETTER_ZAIN_ISOLATED_FORM  0xfeaf
-#define UNITEXT_ARABIC_LETTER_ZAIN_ISOLATED_FORM  L"\ufeaf"
+#define UNITEXT_ARABIC_LETTER_ZAIN_ISOLATED_FORM  U"\ufeaf"
 #define UNICODE_ARABIC_LETTER_ZAIN_FINAL_FORM  0xfeb0
-#define UNITEXT_ARABIC_LETTER_ZAIN_FINAL_FORM  L"\ufeb0"
+#define UNITEXT_ARABIC_LETTER_ZAIN_FINAL_FORM  U"\ufeb0"
 #define UNICODE_ARABIC_LETTER_SEEN_ISOLATED_FORM  0xfeb1
-#define UNITEXT_ARABIC_LETTER_SEEN_ISOLATED_FORM  L"\ufeb1"
+#define UNITEXT_ARABIC_LETTER_SEEN_ISOLATED_FORM  U"\ufeb1"
 #define UNICODE_ARABIC_LETTER_SEEN_FINAL_FORM  0xfeb2
-#define UNITEXT_ARABIC_LETTER_SEEN_FINAL_FORM  L"\ufeb2"
+#define UNITEXT_ARABIC_LETTER_SEEN_FINAL_FORM  U"\ufeb2"
 #define UNICODE_ARABIC_LETTER_SEEN_INITIAL_FORM  0xfeb3
-#define UNITEXT_ARABIC_LETTER_SEEN_INITIAL_FORM  L"\ufeb3"
+#define UNITEXT_ARABIC_LETTER_SEEN_INITIAL_FORM  U"\ufeb3"
 #define UNICODE_ARABIC_LETTER_SEEN_MEDIAL_FORM  0xfeb4
-#define UNITEXT_ARABIC_LETTER_SEEN_MEDIAL_FORM  L"\ufeb4"
+#define UNITEXT_ARABIC_LETTER_SEEN_MEDIAL_FORM  U"\ufeb4"
 #define UNICODE_ARABIC_LETTER_SHEEN_ISOLATED_FORM  0xfeb5
-#define UNITEXT_ARABIC_LETTER_SHEEN_ISOLATED_FORM  L"\ufeb5"
+#define UNITEXT_ARABIC_LETTER_SHEEN_ISOLATED_FORM  U"\ufeb5"
 #define UNICODE_ARABIC_LETTER_SHEEN_FINAL_FORM  0xfeb6
-#define UNITEXT_ARABIC_LETTER_SHEEN_FINAL_FORM  L"\ufeb6"
+#define UNITEXT_ARABIC_LETTER_SHEEN_FINAL_FORM  U"\ufeb6"
 #define UNICODE_ARABIC_LETTER_SHEEN_INITIAL_FORM  0xfeb7
-#define UNITEXT_ARABIC_LETTER_SHEEN_INITIAL_FORM  L"\ufeb7"
+#define UNITEXT_ARABIC_LETTER_SHEEN_INITIAL_FORM  U"\ufeb7"
 #define UNICODE_ARABIC_LETTER_SHEEN_MEDIAL_FORM  0xfeb8
-#define UNITEXT_ARABIC_LETTER_SHEEN_MEDIAL_FORM  L"\ufeb8"
+#define UNITEXT_ARABIC_LETTER_SHEEN_MEDIAL_FORM  U"\ufeb8"
 #define UNICODE_ARABIC_LETTER_SAD_ISOLATED_FORM  0xfeb9
-#define UNITEXT_ARABIC_LETTER_SAD_ISOLATED_FORM  L"\ufeb9"
+#define UNITEXT_ARABIC_LETTER_SAD_ISOLATED_FORM  U"\ufeb9"
 #define UNICODE_ARABIC_LETTER_SAD_FINAL_FORM  0xfeba
-#define UNITEXT_ARABIC_LETTER_SAD_FINAL_FORM  L"\ufeba"
+#define UNITEXT_ARABIC_LETTER_SAD_FINAL_FORM  U"\ufeba"
 #define UNICODE_ARABIC_LETTER_SAD_INITIAL_FORM  0xfebb
-#define UNITEXT_ARABIC_LETTER_SAD_INITIAL_FORM  L"\ufebb"
+#define UNITEXT_ARABIC_LETTER_SAD_INITIAL_FORM  U"\ufebb"
 #define UNICODE_ARABIC_LETTER_SAD_MEDIAL_FORM  0xfebc
-#define UNITEXT_ARABIC_LETTER_SAD_MEDIAL_FORM  L"\ufebc"
+#define UNITEXT_ARABIC_LETTER_SAD_MEDIAL_FORM  U"\ufebc"
 #define UNICODE_ARABIC_LETTER_DAD_ISOLATED_FORM  0xfebd
-#define UNITEXT_ARABIC_LETTER_DAD_ISOLATED_FORM  L"\ufebd"
+#define UNITEXT_ARABIC_LETTER_DAD_ISOLATED_FORM  U"\ufebd"
 #define UNICODE_ARABIC_LETTER_DAD_FINAL_FORM  0xfebe
-#define UNITEXT_ARABIC_LETTER_DAD_FINAL_FORM  L"\ufebe"
+#define UNITEXT_ARABIC_LETTER_DAD_FINAL_FORM  U"\ufebe"
 #define UNICODE_ARABIC_LETTER_DAD_INITIAL_FORM  0xfebf
-#define UNITEXT_ARABIC_LETTER_DAD_INITIAL_FORM  L"\ufebf"
+#define UNITEXT_ARABIC_LETTER_DAD_INITIAL_FORM  U"\ufebf"
 #define UNICODE_ARABIC_LETTER_DAD_MEDIAL_FORM  0xfec0
-#define UNITEXT_ARABIC_LETTER_DAD_MEDIAL_FORM  L"\ufec0"
+#define UNITEXT_ARABIC_LETTER_DAD_MEDIAL_FORM  U"\ufec0"
 #define UNICODE_ARABIC_LETTER_TAH_ISOLATED_FORM  0xfec1
-#define UNITEXT_ARABIC_LETTER_TAH_ISOLATED_FORM  L"\ufec1"
+#define UNITEXT_ARABIC_LETTER_TAH_ISOLATED_FORM  U"\ufec1"
 #define UNICODE_ARABIC_LETTER_TAH_FINAL_FORM  0xfec2
-#define UNITEXT_ARABIC_LETTER_TAH_FINAL_FORM  L"\ufec2"
+#define UNITEXT_ARABIC_LETTER_TAH_FINAL_FORM  U"\ufec2"
 #define UNICODE_ARABIC_LETTER_TAH_INITIAL_FORM  0xfec3
-#define UNITEXT_ARABIC_LETTER_TAH_INITIAL_FORM  L"\ufec3"
+#define UNITEXT_ARABIC_LETTER_TAH_INITIAL_FORM  U"\ufec3"
 #define UNICODE_ARABIC_LETTER_TAH_MEDIAL_FORM  0xfec4
-#define UNITEXT_ARABIC_LETTER_TAH_MEDIAL_FORM  L"\ufec4"
+#define UNITEXT_ARABIC_LETTER_TAH_MEDIAL_FORM  U"\ufec4"
 #define UNICODE_ARABIC_LETTER_ZAH_ISOLATED_FORM  0xfec5
-#define UNITEXT_ARABIC_LETTER_ZAH_ISOLATED_FORM  L"\ufec5"
+#define UNITEXT_ARABIC_LETTER_ZAH_ISOLATED_FORM  U"\ufec5"
 #define UNICODE_ARABIC_LETTER_ZAH_FINAL_FORM  0xfec6
-#define UNITEXT_ARABIC_LETTER_ZAH_FINAL_FORM  L"\ufec6"
+#define UNITEXT_ARABIC_LETTER_ZAH_FINAL_FORM  U"\ufec6"
 #define UNICODE_ARABIC_LETTER_ZAH_INITIAL_FORM  0xfec7
-#define UNITEXT_ARABIC_LETTER_ZAH_INITIAL_FORM  L"\ufec7"
+#define UNITEXT_ARABIC_LETTER_ZAH_INITIAL_FORM  U"\ufec7"
 #define UNICODE_ARABIC_LETTER_ZAH_MEDIAL_FORM  0xfec8
-#define UNITEXT_ARABIC_LETTER_ZAH_MEDIAL_FORM  L"\ufec8"
+#define UNITEXT_ARABIC_LETTER_ZAH_MEDIAL_FORM  U"\ufec8"
 #define UNICODE_ARABIC_LETTER_AIN_ISOLATED_FORM  0xfec9
-#define UNITEXT_ARABIC_LETTER_AIN_ISOLATED_FORM  L"\ufec9"
+#define UNITEXT_ARABIC_LETTER_AIN_ISOLATED_FORM  U"\ufec9"
 #define UNICODE_ARABIC_LETTER_AIN_FINAL_FORM  0xfeca
-#define UNITEXT_ARABIC_LETTER_AIN_FINAL_FORM  L"\ufeca"
+#define UNITEXT_ARABIC_LETTER_AIN_FINAL_FORM  U"\ufeca"
 #define UNICODE_ARABIC_LETTER_AIN_INITIAL_FORM  0xfecb
-#define UNITEXT_ARABIC_LETTER_AIN_INITIAL_FORM  L"\ufecb"
+#define UNITEXT_ARABIC_LETTER_AIN_INITIAL_FORM  U"\ufecb"
 #define UNICODE_ARABIC_LETTER_AIN_MEDIAL_FORM  0xfecc
-#define UNITEXT_ARABIC_LETTER_AIN_MEDIAL_FORM  L"\ufecc"
+#define UNITEXT_ARABIC_LETTER_AIN_MEDIAL_FORM  U"\ufecc"
 #define UNICODE_ARABIC_LETTER_GHAIN_ISOLATED_FORM  0xfecd
-#define UNITEXT_ARABIC_LETTER_GHAIN_ISOLATED_FORM  L"\ufecd"
+#define UNITEXT_ARABIC_LETTER_GHAIN_ISOLATED_FORM  U"\ufecd"
 #define UNICODE_ARABIC_LETTER_GHAIN_FINAL_FORM  0xfece
-#define UNITEXT_ARABIC_LETTER_GHAIN_FINAL_FORM  L"\ufece"
+#define UNITEXT_ARABIC_LETTER_GHAIN_FINAL_FORM  U"\ufece"
 #define UNICODE_ARABIC_LETTER_GHAIN_INITIAL_FORM  0xfecf
-#define UNITEXT_ARABIC_LETTER_GHAIN_INITIAL_FORM  L"\ufecf"
+#define UNITEXT_ARABIC_LETTER_GHAIN_INITIAL_FORM  U"\ufecf"
 #define UNICODE_ARABIC_LETTER_GHAIN_MEDIAL_FORM  0xfed0
-#define UNITEXT_ARABIC_LETTER_GHAIN_MEDIAL_FORM  L"\ufed0"
+#define UNITEXT_ARABIC_LETTER_GHAIN_MEDIAL_FORM  U"\ufed0"
 #define UNICODE_ARABIC_LETTER_FEH_ISOLATED_FORM  0xfed1
-#define UNITEXT_ARABIC_LETTER_FEH_ISOLATED_FORM  L"\ufed1"
+#define UNITEXT_ARABIC_LETTER_FEH_ISOLATED_FORM  U"\ufed1"
 #define UNICODE_ARABIC_LETTER_FEH_FINAL_FORM  0xfed2
-#define UNITEXT_ARABIC_LETTER_FEH_FINAL_FORM  L"\ufed2"
+#define UNITEXT_ARABIC_LETTER_FEH_FINAL_FORM  U"\ufed2"
 #define UNICODE_ARABIC_LETTER_FEH_INITIAL_FORM  0xfed3
-#define UNITEXT_ARABIC_LETTER_FEH_INITIAL_FORM  L"\ufed3"
+#define UNITEXT_ARABIC_LETTER_FEH_INITIAL_FORM  U"\ufed3"
 #define UNICODE_ARABIC_LETTER_FEH_MEDIAL_FORM  0xfed4
-#define UNITEXT_ARABIC_LETTER_FEH_MEDIAL_FORM  L"\ufed4"
+#define UNITEXT_ARABIC_LETTER_FEH_MEDIAL_FORM  U"\ufed4"
 #define UNICODE_ARABIC_LETTER_QAF_ISOLATED_FORM  0xfed5
-#define UNITEXT_ARABIC_LETTER_QAF_ISOLATED_FORM  L"\ufed5"
+#define UNITEXT_ARABIC_LETTER_QAF_ISOLATED_FORM  U"\ufed5"
 #define UNICODE_ARABIC_LETTER_QAF_FINAL_FORM  0xfed6
-#define UNITEXT_ARABIC_LETTER_QAF_FINAL_FORM  L"\ufed6"
+#define UNITEXT_ARABIC_LETTER_QAF_FINAL_FORM  U"\ufed6"
 #define UNICODE_ARABIC_LETTER_QAF_INITIAL_FORM  0xfed7
-#define UNITEXT_ARABIC_LETTER_QAF_INITIAL_FORM  L"\ufed7"
+#define UNITEXT_ARABIC_LETTER_QAF_INITIAL_FORM  U"\ufed7"
 #define UNICODE_ARABIC_LETTER_QAF_MEDIAL_FORM  0xfed8
-#define UNITEXT_ARABIC_LETTER_QAF_MEDIAL_FORM  L"\ufed8"
+#define UNITEXT_ARABIC_LETTER_QAF_MEDIAL_FORM  U"\ufed8"
 #define UNICODE_ARABIC_LETTER_KAF_ISOLATED_FORM  0xfed9
-#define UNITEXT_ARABIC_LETTER_KAF_ISOLATED_FORM  L"\ufed9"
+#define UNITEXT_ARABIC_LETTER_KAF_ISOLATED_FORM  U"\ufed9"
 #define UNICODE_ARABIC_LETTER_KAF_FINAL_FORM  0xfeda
-#define UNITEXT_ARABIC_LETTER_KAF_FINAL_FORM  L"\ufeda"
+#define UNITEXT_ARABIC_LETTER_KAF_FINAL_FORM  U"\ufeda"
 #define UNICODE_ARABIC_LETTER_KAF_INITIAL_FORM  0xfedb
-#define UNITEXT_ARABIC_LETTER_KAF_INITIAL_FORM  L"\ufedb"
+#define UNITEXT_ARABIC_LETTER_KAF_INITIAL_FORM  U"\ufedb"
 #define UNICODE_ARABIC_LETTER_KAF_MEDIAL_FORM  0xfedc
-#define UNITEXT_ARABIC_LETTER_KAF_MEDIAL_FORM  L"\ufedc"
+#define UNITEXT_ARABIC_LETTER_KAF_MEDIAL_FORM  U"\ufedc"
 #define UNICODE_ARABIC_LETTER_LAM_ISOLATED_FORM  0xfedd
-#define UNITEXT_ARABIC_LETTER_LAM_ISOLATED_FORM  L"\ufedd"
+#define UNITEXT_ARABIC_LETTER_LAM_ISOLATED_FORM  U"\ufedd"
 #define UNICODE_ARABIC_LETTER_LAM_FINAL_FORM  0xfede
-#define UNITEXT_ARABIC_LETTER_LAM_FINAL_FORM  L"\ufede"
+#define UNITEXT_ARABIC_LETTER_LAM_FINAL_FORM  U"\ufede"
 #define UNICODE_ARABIC_LETTER_LAM_INITIAL_FORM  0xfedf
-#define UNITEXT_ARABIC_LETTER_LAM_INITIAL_FORM  L"\ufedf"
+#define UNITEXT_ARABIC_LETTER_LAM_INITIAL_FORM  U"\ufedf"
 #define UNICODE_ARABIC_LETTER_LAM_MEDIAL_FORM  0xfee0
-#define UNITEXT_ARABIC_LETTER_LAM_MEDIAL_FORM  L"\ufee0"
+#define UNITEXT_ARABIC_LETTER_LAM_MEDIAL_FORM  U"\ufee0"
 #define UNICODE_ARABIC_LETTER_MEEM_ISOLATED_FORM  0xfee1
-#define UNITEXT_ARABIC_LETTER_MEEM_ISOLATED_FORM  L"\ufee1"
+#define UNITEXT_ARABIC_LETTER_MEEM_ISOLATED_FORM  U"\ufee1"
 #define UNICODE_ARABIC_LETTER_MEEM_FINAL_FORM  0xfee2
-#define UNITEXT_ARABIC_LETTER_MEEM_FINAL_FORM  L"\ufee2"
+#define UNITEXT_ARABIC_LETTER_MEEM_FINAL_FORM  U"\ufee2"
 #define UNICODE_ARABIC_LETTER_MEEM_INITIAL_FORM  0xfee3
-#define UNITEXT_ARABIC_LETTER_MEEM_INITIAL_FORM  L"\ufee3"
+#define UNITEXT_ARABIC_LETTER_MEEM_INITIAL_FORM  U"\ufee3"
 #define UNICODE_ARABIC_LETTER_MEEM_MEDIAL_FORM  0xfee4
-#define UNITEXT_ARABIC_LETTER_MEEM_MEDIAL_FORM  L"\ufee4"
+#define UNITEXT_ARABIC_LETTER_MEEM_MEDIAL_FORM  U"\ufee4"
 #define UNICODE_ARABIC_LETTER_NOON_ISOLATED_FORM  0xfee5
-#define UNITEXT_ARABIC_LETTER_NOON_ISOLATED_FORM  L"\ufee5"
+#define UNITEXT_ARABIC_LETTER_NOON_ISOLATED_FORM  U"\ufee5"
 #define UNICODE_ARABIC_LETTER_NOON_FINAL_FORM  0xfee6
-#define UNITEXT_ARABIC_LETTER_NOON_FINAL_FORM  L"\ufee6"
+#define UNITEXT_ARABIC_LETTER_NOON_FINAL_FORM  U"\ufee6"
 #define UNICODE_ARABIC_LETTER_NOON_INITIAL_FORM  0xfee7
-#define UNITEXT_ARABIC_LETTER_NOON_INITIAL_FORM  L"\ufee7"
+#define UNITEXT_ARABIC_LETTER_NOON_INITIAL_FORM  U"\ufee7"
 #define UNICODE_ARABIC_LETTER_NOON_MEDIAL_FORM  0xfee8
-#define UNITEXT_ARABIC_LETTER_NOON_MEDIAL_FORM  L"\ufee8"
+#define UNITEXT_ARABIC_LETTER_NOON_MEDIAL_FORM  U"\ufee8"
 #define UNICODE_ARABIC_LETTER_HEH_ISOLATED_FORM  0xfee9
-#define UNITEXT_ARABIC_LETTER_HEH_ISOLATED_FORM  L"\ufee9"
+#define UNITEXT_ARABIC_LETTER_HEH_ISOLATED_FORM  U"\ufee9"
 #define UNICODE_ARABIC_LETTER_HEH_FINAL_FORM  0xfeea
-#define UNITEXT_ARABIC_LETTER_HEH_FINAL_FORM  L"\ufeea"
+#define UNITEXT_ARABIC_LETTER_HEH_FINAL_FORM  U"\ufeea"
 #define UNICODE_ARABIC_LETTER_HEH_INITIAL_FORM  0xfeeb
-#define UNITEXT_ARABIC_LETTER_HEH_INITIAL_FORM  L"\ufeeb"
+#define UNITEXT_ARABIC_LETTER_HEH_INITIAL_FORM  U"\ufeeb"
 #define UNICODE_ARABIC_LETTER_HEH_MEDIAL_FORM  0xfeec
-#define UNITEXT_ARABIC_LETTER_HEH_MEDIAL_FORM  L"\ufeec"
+#define UNITEXT_ARABIC_LETTER_HEH_MEDIAL_FORM  U"\ufeec"
 #define UNICODE_ARABIC_LETTER_WAW_ISOLATED_FORM  0xfeed
-#define UNITEXT_ARABIC_LETTER_WAW_ISOLATED_FORM  L"\ufeed"
+#define UNITEXT_ARABIC_LETTER_WAW_ISOLATED_FORM  U"\ufeed"
 #define UNICODE_ARABIC_LETTER_WAW_FINAL_FORM  0xfeee
-#define UNITEXT_ARABIC_LETTER_WAW_FINAL_FORM  L"\ufeee"
+#define UNITEXT_ARABIC_LETTER_WAW_FINAL_FORM  U"\ufeee"
 #define UNICODE_ARABIC_LETTER_ALEF_MAKSURA_ISOLATED_FORM  0xfeef
-#define UNITEXT_ARABIC_LETTER_ALEF_MAKSURA_ISOLATED_FORM  L"\ufeef"
+#define UNITEXT_ARABIC_LETTER_ALEF_MAKSURA_ISOLATED_FORM  U"\ufeef"
 #define UNICODE_ARABIC_LETTER_ALEF_MAKSURA_FINAL_FORM  0xfef0
-#define UNITEXT_ARABIC_LETTER_ALEF_MAKSURA_FINAL_FORM  L"\ufef0"
+#define UNITEXT_ARABIC_LETTER_ALEF_MAKSURA_FINAL_FORM  U"\ufef0"
 #define UNICODE_ARABIC_LETTER_YEH_ISOLATED_FORM  0xfef1
-#define UNITEXT_ARABIC_LETTER_YEH_ISOLATED_FORM  L"\ufef1"
+#define UNITEXT_ARABIC_LETTER_YEH_ISOLATED_FORM  U"\ufef1"
 #define UNICODE_ARABIC_LETTER_YEH_FINAL_FORM  0xfef2
-#define UNITEXT_ARABIC_LETTER_YEH_FINAL_FORM  L"\ufef2"
+#define UNITEXT_ARABIC_LETTER_YEH_FINAL_FORM  U"\ufef2"
 #define UNICODE_ARABIC_LETTER_YEH_INITIAL_FORM  0xfef3
-#define UNITEXT_ARABIC_LETTER_YEH_INITIAL_FORM  L"\ufef3"
+#define UNITEXT_ARABIC_LETTER_YEH_INITIAL_FORM  U"\ufef3"
 #define UNICODE_ARABIC_LETTER_YEH_MEDIAL_FORM  0xfef4
-#define UNITEXT_ARABIC_LETTER_YEH_MEDIAL_FORM  L"\ufef4"
+#define UNITEXT_ARABIC_LETTER_YEH_MEDIAL_FORM  U"\ufef4"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_MADDA_ABOVE_ISOLATED_FORM  0xfef5
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_MADDA_ABOVE_ISOLATED_FORM  L"\ufef5"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_MADDA_ABOVE_ISOLATED_FORM  U"\ufef5"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_MADDA_ABOVE_FINAL_FORM  0xfef6
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_MADDA_ABOVE_FINAL_FORM  L"\ufef6"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_MADDA_ABOVE_FINAL_FORM  U"\ufef6"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_ABOVE_ISOLATED_FORM  0xfef7
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_ABOVE_ISOLATED_FORM  L"\ufef7"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_ABOVE_ISOLATED_FORM  U"\ufef7"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_ABOVE_FINAL_FORM  0xfef8
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_ABOVE_FINAL_FORM  L"\ufef8"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_ABOVE_FINAL_FORM  U"\ufef8"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_BELOW_ISOLATED_FORM  0xfef9
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_BELOW_ISOLATED_FORM  L"\ufef9"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_BELOW_ISOLATED_FORM  U"\ufef9"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_BELOW_FINAL_FORM  0xfefa
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_BELOW_FINAL_FORM  L"\ufefa"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_WITH_HAMZA_BELOW_FINAL_FORM  U"\ufefa"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_ALEF_ISOLATED_FORM  0xfefb
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_ISOLATED_FORM  L"\ufefb"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_ISOLATED_FORM  U"\ufefb"
 #define UNICODE_ARABIC_LIGATURE_LAM_WITH_ALEF_FINAL_FORM  0xfefc
-#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_FINAL_FORM  L"\ufefc"
+#define UNITEXT_ARABIC_LIGATURE_LAM_WITH_ALEF_FINAL_FORM  U"\ufefc"
 #define UNICODE_ZERO_WIDTH_NO_BREAK_SPACE  0xfeff
-#define UNITEXT_ZERO_WIDTH_NO_BREAK_SPACE  L"\ufeff"
+#define UNITEXT_ZERO_WIDTH_NO_BREAK_SPACE  U"\ufeff"
 #define UNICODE_FULLWIDTH_EXCLAMATION_MARK  0xff01
-#define UNITEXT_FULLWIDTH_EXCLAMATION_MARK  L"\uff01"
+#define UNITEXT_FULLWIDTH_EXCLAMATION_MARK  U"\uff01"
 #define UNICODE_FULLWIDTH_QUOTATION_MARK  0xff02
-#define UNITEXT_FULLWIDTH_QUOTATION_MARK  L"\uff02"
+#define UNITEXT_FULLWIDTH_QUOTATION_MARK  U"\uff02"
 #define UNICODE_FULLWIDTH_NUMBER_SIGN  0xff03
-#define UNITEXT_FULLWIDTH_NUMBER_SIGN  L"\uff03"
+#define UNITEXT_FULLWIDTH_NUMBER_SIGN  U"\uff03"
 #define UNICODE_FULLWIDTH_DOLLAR_SIGN  0xff04
-#define UNITEXT_FULLWIDTH_DOLLAR_SIGN  L"\uff04"
+#define UNITEXT_FULLWIDTH_DOLLAR_SIGN  U"\uff04"
 #define UNICODE_FULLWIDTH_PERCENT_SIGN  0xff05
-#define UNITEXT_FULLWIDTH_PERCENT_SIGN  L"\uff05"
+#define UNITEXT_FULLWIDTH_PERCENT_SIGN  U"\uff05"
 #define UNICODE_FULLWIDTH_AMPERSAND  0xff06
-#define UNITEXT_FULLWIDTH_AMPERSAND  L"\uff06"
+#define UNITEXT_FULLWIDTH_AMPERSAND  U"\uff06"
 #define UNICODE_FULLWIDTH_APOSTROPHE  0xff07
-#define UNITEXT_FULLWIDTH_APOSTROPHE  L"\uff07"
+#define UNITEXT_FULLWIDTH_APOSTROPHE  U"\uff07"
 #define UNICODE_FULLWIDTH_LEFT_PARENTHESIS  0xff08
-#define UNITEXT_FULLWIDTH_LEFT_PARENTHESIS  L"\uff08"
+#define UNITEXT_FULLWIDTH_LEFT_PARENTHESIS  U"\uff08"
 #define UNICODE_FULLWIDTH_RIGHT_PARENTHESIS  0xff09
-#define UNITEXT_FULLWIDTH_RIGHT_PARENTHESIS  L"\uff09"
+#define UNITEXT_FULLWIDTH_RIGHT_PARENTHESIS  U"\uff09"
 #define UNICODE_FULLWIDTH_ASTERISK  0xff0a
-#define UNITEXT_FULLWIDTH_ASTERISK  L"\uff0a"
+#define UNITEXT_FULLWIDTH_ASTERISK  U"\uff0a"
 #define UNICODE_FULLWIDTH_PLUS_SIGN  0xff0b
-#define UNITEXT_FULLWIDTH_PLUS_SIGN  L"\uff0b"
+#define UNITEXT_FULLWIDTH_PLUS_SIGN  U"\uff0b"
 #define UNICODE_FULLWIDTH_COMMA  0xff0c
-#define UNITEXT_FULLWIDTH_COMMA  L"\uff0c"
+#define UNITEXT_FULLWIDTH_COMMA  U"\uff0c"
 #define UNICODE_FULLWIDTH_HYPHEN_MINUS  0xff0d
-#define UNITEXT_FULLWIDTH_HYPHEN_MINUS  L"\uff0d"
+#define UNITEXT_FULLWIDTH_HYPHEN_MINUS  U"\uff0d"
 #define UNICODE_FULLWIDTH_FULL_STOP  0xff0e
-#define UNITEXT_FULLWIDTH_FULL_STOP  L"\uff0e"
+#define UNITEXT_FULLWIDTH_FULL_STOP  U"\uff0e"
 #define UNICODE_FULLWIDTH_SOLIDUS  0xff0f
-#define UNITEXT_FULLWIDTH_SOLIDUS  L"\uff0f"
+#define UNITEXT_FULLWIDTH_SOLIDUS  U"\uff0f"
 #define UNICODE_FULLWIDTH_DIGIT_ZERO  0xff10
-#define UNITEXT_FULLWIDTH_DIGIT_ZERO  L"\uff10"
+#define UNITEXT_FULLWIDTH_DIGIT_ZERO  U"\uff10"
 #define UNICODE_FULLWIDTH_DIGIT_ONE  0xff11
-#define UNITEXT_FULLWIDTH_DIGIT_ONE  L"\uff11"
+#define UNITEXT_FULLWIDTH_DIGIT_ONE  U"\uff11"
 #define UNICODE_FULLWIDTH_DIGIT_TWO  0xff12
-#define UNITEXT_FULLWIDTH_DIGIT_TWO  L"\uff12"
+#define UNITEXT_FULLWIDTH_DIGIT_TWO  U"\uff12"
 #define UNICODE_FULLWIDTH_DIGIT_THREE  0xff13
-#define UNITEXT_FULLWIDTH_DIGIT_THREE  L"\uff13"
+#define UNITEXT_FULLWIDTH_DIGIT_THREE  U"\uff13"
 #define UNICODE_FULLWIDTH_DIGIT_FOUR  0xff14
-#define UNITEXT_FULLWIDTH_DIGIT_FOUR  L"\uff14"
+#define UNITEXT_FULLWIDTH_DIGIT_FOUR  U"\uff14"
 #define UNICODE_FULLWIDTH_DIGIT_FIVE  0xff15
-#define UNITEXT_FULLWIDTH_DIGIT_FIVE  L"\uff15"
+#define UNITEXT_FULLWIDTH_DIGIT_FIVE  U"\uff15"
 #define UNICODE_FULLWIDTH_DIGIT_SIX  0xff16
-#define UNITEXT_FULLWIDTH_DIGIT_SIX  L"\uff16"
+#define UNITEXT_FULLWIDTH_DIGIT_SIX  U"\uff16"
 #define UNICODE_FULLWIDTH_DIGIT_SEVEN  0xff17
-#define UNITEXT_FULLWIDTH_DIGIT_SEVEN  L"\uff17"
+#define UNITEXT_FULLWIDTH_DIGIT_SEVEN  U"\uff17"
 #define UNICODE_FULLWIDTH_DIGIT_EIGHT  0xff18
-#define UNITEXT_FULLWIDTH_DIGIT_EIGHT  L"\uff18"
+#define UNITEXT_FULLWIDTH_DIGIT_EIGHT  U"\uff18"
 #define UNICODE_FULLWIDTH_DIGIT_NINE  0xff19
-#define UNITEXT_FULLWIDTH_DIGIT_NINE  L"\uff19"
+#define UNITEXT_FULLWIDTH_DIGIT_NINE  U"\uff19"
 #define UNICODE_FULLWIDTH_COLON  0xff1a
-#define UNITEXT_FULLWIDTH_COLON  L"\uff1a"
+#define UNITEXT_FULLWIDTH_COLON  U"\uff1a"
 #define UNICODE_FULLWIDTH_SEMICOLON  0xff1b
-#define UNITEXT_FULLWIDTH_SEMICOLON  L"\uff1b"
+#define UNITEXT_FULLWIDTH_SEMICOLON  U"\uff1b"
 #define UNICODE_FULLWIDTH_LESS_THAN_SIGN  0xff1c
-#define UNITEXT_FULLWIDTH_LESS_THAN_SIGN  L"\uff1c"
+#define UNITEXT_FULLWIDTH_LESS_THAN_SIGN  U"\uff1c"
 #define UNICODE_FULLWIDTH_EQUALS_SIGN  0xff1d
-#define UNITEXT_FULLWIDTH_EQUALS_SIGN  L"\uff1d"
+#define UNITEXT_FULLWIDTH_EQUALS_SIGN  U"\uff1d"
 #define UNICODE_FULLWIDTH_GREATER_THAN_SIGN  0xff1e
-#define UNITEXT_FULLWIDTH_GREATER_THAN_SIGN  L"\uff1e"
+#define UNITEXT_FULLWIDTH_GREATER_THAN_SIGN  U"\uff1e"
 #define UNICODE_FULLWIDTH_QUESTION_MARK  0xff1f
-#define UNITEXT_FULLWIDTH_QUESTION_MARK  L"\uff1f"
+#define UNITEXT_FULLWIDTH_QUESTION_MARK  U"\uff1f"
 #define UNICODE_FULLWIDTH_COMMERCIAL_AT  0xff20
-#define UNITEXT_FULLWIDTH_COMMERCIAL_AT  L"\uff20"
+#define UNITEXT_FULLWIDTH_COMMERCIAL_AT  U"\uff20"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_A  0xff21
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_A  L"\uff21"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_A  U"\uff21"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_B  0xff22
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_B  L"\uff22"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_B  U"\uff22"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_C  0xff23
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_C  L"\uff23"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_C  U"\uff23"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_D  0xff24
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_D  L"\uff24"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_D  U"\uff24"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_E  0xff25
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_E  L"\uff25"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_E  U"\uff25"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_F  0xff26
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_F  L"\uff26"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_F  U"\uff26"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_G  0xff27
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_G  L"\uff27"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_G  U"\uff27"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_H  0xff28
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_H  L"\uff28"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_H  U"\uff28"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_I  0xff29
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_I  L"\uff29"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_I  U"\uff29"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_J  0xff2a
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_J  L"\uff2a"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_J  U"\uff2a"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_K  0xff2b
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_K  L"\uff2b"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_K  U"\uff2b"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_L  0xff2c
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_L  L"\uff2c"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_L  U"\uff2c"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_M  0xff2d
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_M  L"\uff2d"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_M  U"\uff2d"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_N  0xff2e
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_N  L"\uff2e"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_N  U"\uff2e"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_O  0xff2f
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_O  L"\uff2f"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_O  U"\uff2f"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_P  0xff30
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_P  L"\uff30"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_P  U"\uff30"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_Q  0xff31
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_Q  L"\uff31"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_Q  U"\uff31"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_R  0xff32
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_R  L"\uff32"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_R  U"\uff32"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_S  0xff33
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_S  L"\uff33"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_S  U"\uff33"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_T  0xff34
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_T  L"\uff34"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_T  U"\uff34"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_U  0xff35
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_U  L"\uff35"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_U  U"\uff35"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_V  0xff36
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_V  L"\uff36"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_V  U"\uff36"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_W  0xff37
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_W  L"\uff37"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_W  U"\uff37"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_X  0xff38
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_X  L"\uff38"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_X  U"\uff38"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_Y  0xff39
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_Y  L"\uff39"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_Y  U"\uff39"
 #define UNICODE_FULLWIDTH_LATIN_CAPITAL_LETTER_Z  0xff3a
-#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_Z  L"\uff3a"
+#define UNITEXT_FULLWIDTH_LATIN_CAPITAL_LETTER_Z  U"\uff3a"
 #define UNICODE_FULLWIDTH_LEFT_SQUARE_BRACKET  0xff3b
-#define UNITEXT_FULLWIDTH_LEFT_SQUARE_BRACKET  L"\uff3b"
+#define UNITEXT_FULLWIDTH_LEFT_SQUARE_BRACKET  U"\uff3b"
 #define UNICODE_FULLWIDTH_REVERSE_SOLIDUS  0xff3c
-#define UNITEXT_FULLWIDTH_REVERSE_SOLIDUS  L"\uff3c"
+#define UNITEXT_FULLWIDTH_REVERSE_SOLIDUS  U"\uff3c"
 #define UNICODE_FULLWIDTH_RIGHT_SQUARE_BRACKET  0xff3d
-#define UNITEXT_FULLWIDTH_RIGHT_SQUARE_BRACKET  L"\uff3d"
+#define UNITEXT_FULLWIDTH_RIGHT_SQUARE_BRACKET  U"\uff3d"
 #define UNICODE_FULLWIDTH_CIRCUMFLEX_ACCENT  0xff3e
-#define UNITEXT_FULLWIDTH_CIRCUMFLEX_ACCENT  L"\uff3e"
+#define UNITEXT_FULLWIDTH_CIRCUMFLEX_ACCENT  U"\uff3e"
 #define UNICODE_FULLWIDTH_LOW_LINE  0xff3f
-#define UNITEXT_FULLWIDTH_LOW_LINE  L"\uff3f"
+#define UNITEXT_FULLWIDTH_LOW_LINE  U"\uff3f"
 #define UNICODE_FULLWIDTH_GRAVE_ACCENT  0xff40
-#define UNITEXT_FULLWIDTH_GRAVE_ACCENT  L"\uff40"
+#define UNITEXT_FULLWIDTH_GRAVE_ACCENT  U"\uff40"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_A  0xff41
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_A  L"\uff41"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_A  U"\uff41"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_B  0xff42
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_B  L"\uff42"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_B  U"\uff42"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_C  0xff43
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_C  L"\uff43"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_C  U"\uff43"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_D  0xff44
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_D  L"\uff44"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_D  U"\uff44"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_E  0xff45
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_E  L"\uff45"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_E  U"\uff45"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_F  0xff46
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_F  L"\uff46"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_F  U"\uff46"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_G  0xff47
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_G  L"\uff47"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_G  U"\uff47"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_H  0xff48
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_H  L"\uff48"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_H  U"\uff48"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_I  0xff49
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_I  L"\uff49"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_I  U"\uff49"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_J  0xff4a
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_J  L"\uff4a"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_J  U"\uff4a"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_K  0xff4b
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_K  L"\uff4b"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_K  U"\uff4b"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_L  0xff4c
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_L  L"\uff4c"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_L  U"\uff4c"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_M  0xff4d
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_M  L"\uff4d"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_M  U"\uff4d"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_N  0xff4e
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_N  L"\uff4e"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_N  U"\uff4e"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_O  0xff4f
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_O  L"\uff4f"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_O  U"\uff4f"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_P  0xff50
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_P  L"\uff50"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_P  U"\uff50"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_Q  0xff51
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_Q  L"\uff51"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_Q  U"\uff51"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_R  0xff52
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_R  L"\uff52"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_R  U"\uff52"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_S  0xff53
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_S  L"\uff53"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_S  U"\uff53"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_T  0xff54
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_T  L"\uff54"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_T  U"\uff54"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_U  0xff55
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_U  L"\uff55"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_U  U"\uff55"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_V  0xff56
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_V  L"\uff56"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_V  U"\uff56"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_W  0xff57
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_W  L"\uff57"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_W  U"\uff57"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_X  0xff58
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_X  L"\uff58"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_X  U"\uff58"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_Y  0xff59
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_Y  L"\uff59"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_Y  U"\uff59"
 #define UNICODE_FULLWIDTH_LATIN_SMALL_LETTER_Z  0xff5a
-#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_Z  L"\uff5a"
+#define UNITEXT_FULLWIDTH_LATIN_SMALL_LETTER_Z  U"\uff5a"
 #define UNICODE_FULLWIDTH_LEFT_CURLY_BRACKET  0xff5b
-#define UNITEXT_FULLWIDTH_LEFT_CURLY_BRACKET  L"\uff5b"
+#define UNITEXT_FULLWIDTH_LEFT_CURLY_BRACKET  U"\uff5b"
 #define UNICODE_FULLWIDTH_VERTICAL_LINE  0xff5c
-#define UNITEXT_FULLWIDTH_VERTICAL_LINE  L"\uff5c"
+#define UNITEXT_FULLWIDTH_VERTICAL_LINE  U"\uff5c"
 #define UNICODE_FULLWIDTH_RIGHT_CURLY_BRACKET  0xff5d
-#define UNITEXT_FULLWIDTH_RIGHT_CURLY_BRACKET  L"\uff5d"
+#define UNITEXT_FULLWIDTH_RIGHT_CURLY_BRACKET  U"\uff5d"
 #define UNICODE_FULLWIDTH_TILDE  0xff5e
-#define UNITEXT_FULLWIDTH_TILDE  L"\uff5e"
+#define UNITEXT_FULLWIDTH_TILDE  U"\uff5e"
 #define UNICODE_FULLWIDTH_LEFT_WHITE_PARENTHESIS  0xff5f
-#define UNITEXT_FULLWIDTH_LEFT_WHITE_PARENTHESIS  L"\uff5f"
+#define UNITEXT_FULLWIDTH_LEFT_WHITE_PARENTHESIS  U"\uff5f"
 #define UNICODE_FULLWIDTH_RIGHT_WHITE_PARENTHESIS  0xff60
-#define UNITEXT_FULLWIDTH_RIGHT_WHITE_PARENTHESIS  L"\uff60"
+#define UNITEXT_FULLWIDTH_RIGHT_WHITE_PARENTHESIS  U"\uff60"
 #define UNICODE_HALFWIDTH_IDEOGRAPHIC_FULL_STOP  0xff61
-#define UNITEXT_HALFWIDTH_IDEOGRAPHIC_FULL_STOP  L"\uff61"
+#define UNITEXT_HALFWIDTH_IDEOGRAPHIC_FULL_STOP  U"\uff61"
 #define UNICODE_HALFWIDTH_LEFT_CORNER_BRACKET  0xff62
-#define UNITEXT_HALFWIDTH_LEFT_CORNER_BRACKET  L"\uff62"
+#define UNITEXT_HALFWIDTH_LEFT_CORNER_BRACKET  U"\uff62"
 #define UNICODE_HALFWIDTH_RIGHT_CORNER_BRACKET  0xff63
-#define UNITEXT_HALFWIDTH_RIGHT_CORNER_BRACKET  L"\uff63"
+#define UNITEXT_HALFWIDTH_RIGHT_CORNER_BRACKET  U"\uff63"
 #define UNICODE_HALFWIDTH_IDEOGRAPHIC_COMMA  0xff64
-#define UNITEXT_HALFWIDTH_IDEOGRAPHIC_COMMA  L"\uff64"
+#define UNITEXT_HALFWIDTH_IDEOGRAPHIC_COMMA  U"\uff64"
 #define UNICODE_HALFWIDTH_KATAKANA_MIDDLE_DOT  0xff65
-#define UNITEXT_HALFWIDTH_KATAKANA_MIDDLE_DOT  L"\uff65"
+#define UNITEXT_HALFWIDTH_KATAKANA_MIDDLE_DOT  U"\uff65"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_WO  0xff66
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_WO  L"\uff66"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_WO  U"\uff66"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SMALL_A  0xff67
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_A  L"\uff67"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_A  U"\uff67"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SMALL_I  0xff68
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_I  L"\uff68"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_I  U"\uff68"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SMALL_U  0xff69
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_U  L"\uff69"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_U  U"\uff69"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SMALL_E  0xff6a
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_E  L"\uff6a"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_E  U"\uff6a"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SMALL_O  0xff6b
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_O  L"\uff6b"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_O  U"\uff6b"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SMALL_YA  0xff6c
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_YA  L"\uff6c"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_YA  U"\uff6c"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SMALL_YU  0xff6d
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_YU  L"\uff6d"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_YU  U"\uff6d"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SMALL_YO  0xff6e
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_YO  L"\uff6e"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_YO  U"\uff6e"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SMALL_TU  0xff6f
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_TU  L"\uff6f"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SMALL_TU  U"\uff6f"
 #define UNICODE_HALFWIDTH_KATAKANA_HIRAGANA_PROLONGED_SOUND_MARK  0xff70
-#define UNITEXT_HALFWIDTH_KATAKANA_HIRAGANA_PROLONGED_SOUND_MARK  L"\uff70"
+#define UNITEXT_HALFWIDTH_KATAKANA_HIRAGANA_PROLONGED_SOUND_MARK  U"\uff70"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_A  0xff71
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_A  L"\uff71"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_A  U"\uff71"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_I  0xff72
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_I  L"\uff72"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_I  U"\uff72"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_U  0xff73
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_U  L"\uff73"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_U  U"\uff73"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_E  0xff74
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_E  L"\uff74"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_E  U"\uff74"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_O  0xff75
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_O  L"\uff75"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_O  U"\uff75"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_KA  0xff76
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_KA  L"\uff76"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_KA  U"\uff76"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_KI  0xff77
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_KI  L"\uff77"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_KI  U"\uff77"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_KU  0xff78
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_KU  L"\uff78"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_KU  U"\uff78"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_KE  0xff79
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_KE  L"\uff79"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_KE  U"\uff79"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_KO  0xff7a
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_KO  L"\uff7a"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_KO  U"\uff7a"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SA  0xff7b
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SA  L"\uff7b"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SA  U"\uff7b"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SI  0xff7c
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SI  L"\uff7c"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SI  U"\uff7c"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SU  0xff7d
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SU  L"\uff7d"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SU  U"\uff7d"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SE  0xff7e
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SE  L"\uff7e"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SE  U"\uff7e"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_SO  0xff7f
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SO  L"\uff7f"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_SO  U"\uff7f"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_TA  0xff80
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_TA  L"\uff80"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_TA  U"\uff80"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_TI  0xff81
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_TI  L"\uff81"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_TI  U"\uff81"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_TU  0xff82
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_TU  L"\uff82"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_TU  U"\uff82"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_TE  0xff83
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_TE  L"\uff83"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_TE  U"\uff83"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_TO  0xff84
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_TO  L"\uff84"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_TO  U"\uff84"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_NA  0xff85
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_NA  L"\uff85"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_NA  U"\uff85"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_NI  0xff86
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_NI  L"\uff86"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_NI  U"\uff86"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_NU  0xff87
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_NU  L"\uff87"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_NU  U"\uff87"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_NE  0xff88
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_NE  L"\uff88"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_NE  U"\uff88"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_NO  0xff89
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_NO  L"\uff89"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_NO  U"\uff89"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_HA  0xff8a
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_HA  L"\uff8a"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_HA  U"\uff8a"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_HI  0xff8b
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_HI  L"\uff8b"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_HI  U"\uff8b"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_HU  0xff8c
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_HU  L"\uff8c"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_HU  U"\uff8c"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_HE  0xff8d
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_HE  L"\uff8d"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_HE  U"\uff8d"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_HO  0xff8e
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_HO  L"\uff8e"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_HO  U"\uff8e"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_MA  0xff8f
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_MA  L"\uff8f"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_MA  U"\uff8f"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_MI  0xff90
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_MI  L"\uff90"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_MI  U"\uff90"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_MU  0xff91
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_MU  L"\uff91"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_MU  U"\uff91"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_ME  0xff92
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_ME  L"\uff92"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_ME  U"\uff92"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_MO  0xff93
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_MO  L"\uff93"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_MO  U"\uff93"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_YA  0xff94
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_YA  L"\uff94"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_YA  U"\uff94"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_YU  0xff95
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_YU  L"\uff95"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_YU  U"\uff95"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_YO  0xff96
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_YO  L"\uff96"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_YO  U"\uff96"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_RA  0xff97
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_RA  L"\uff97"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_RA  U"\uff97"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_RI  0xff98
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_RI  L"\uff98"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_RI  U"\uff98"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_RU  0xff99
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_RU  L"\uff99"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_RU  U"\uff99"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_RE  0xff9a
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_RE  L"\uff9a"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_RE  U"\uff9a"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_RO  0xff9b
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_RO  L"\uff9b"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_RO  U"\uff9b"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_WA  0xff9c
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_WA  L"\uff9c"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_WA  U"\uff9c"
 #define UNICODE_HALFWIDTH_KATAKANA_LETTER_N  0xff9d
-#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_N  L"\uff9d"
+#define UNITEXT_HALFWIDTH_KATAKANA_LETTER_N  U"\uff9d"
 #define UNICODE_HALFWIDTH_KATAKANA_VOICED_SOUND_MARK  0xff9e
-#define UNITEXT_HALFWIDTH_KATAKANA_VOICED_SOUND_MARK  L"\uff9e"
+#define UNITEXT_HALFWIDTH_KATAKANA_VOICED_SOUND_MARK  U"\uff9e"
 #define UNICODE_HALFWIDTH_KATAKANA_SEMI_VOICED_SOUND_MARK  0xff9f
-#define UNITEXT_HALFWIDTH_KATAKANA_SEMI_VOICED_SOUND_MARK  L"\uff9f"
+#define UNITEXT_HALFWIDTH_KATAKANA_SEMI_VOICED_SOUND_MARK  U"\uff9f"
 #define UNICODE_HALFWIDTH_HANGUL_FILLER  0xffa0
-#define UNITEXT_HALFWIDTH_HANGUL_FILLER  L"\uffa0"
+#define UNITEXT_HALFWIDTH_HANGUL_FILLER  U"\uffa0"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_KIYEOK  0xffa1
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_KIYEOK  L"\uffa1"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_KIYEOK  U"\uffa1"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_SSANGKIYEOK  0xffa2
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SSANGKIYEOK  L"\uffa2"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SSANGKIYEOK  U"\uffa2"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_KIYEOK_SIOS  0xffa3
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_KIYEOK_SIOS  L"\uffa3"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_KIYEOK_SIOS  U"\uffa3"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_NIEUN  0xffa4
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_NIEUN  L"\uffa4"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_NIEUN  U"\uffa4"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_NIEUN_CIEUC  0xffa5
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_NIEUN_CIEUC  L"\uffa5"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_NIEUN_CIEUC  U"\uffa5"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_NIEUN_HIEUH  0xffa6
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_NIEUN_HIEUH  L"\uffa6"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_NIEUN_HIEUH  U"\uffa6"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_TIKEUT  0xffa7
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_TIKEUT  L"\uffa7"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_TIKEUT  U"\uffa7"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_SSANGTIKEUT  0xffa8
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SSANGTIKEUT  L"\uffa8"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SSANGTIKEUT  U"\uffa8"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_RIEUL  0xffa9
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL  L"\uffa9"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL  U"\uffa9"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_RIEUL_KIYEOK  0xffaa
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_KIYEOK  L"\uffaa"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_KIYEOK  U"\uffaa"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_RIEUL_MIEUM  0xffab
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_MIEUM  L"\uffab"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_MIEUM  U"\uffab"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_RIEUL_PIEUP  0xffac
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_PIEUP  L"\uffac"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_PIEUP  U"\uffac"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_RIEUL_SIOS  0xffad
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_SIOS  L"\uffad"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_SIOS  U"\uffad"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_RIEUL_THIEUTH  0xffae
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_THIEUTH  L"\uffae"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_THIEUTH  U"\uffae"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_RIEUL_PHIEUPH  0xffaf
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_PHIEUPH  L"\uffaf"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_PHIEUPH  U"\uffaf"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_RIEUL_HIEUH  0xffb0
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_HIEUH  L"\uffb0"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_RIEUL_HIEUH  U"\uffb0"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_MIEUM  0xffb1
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_MIEUM  L"\uffb1"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_MIEUM  U"\uffb1"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_PIEUP  0xffb2
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_PIEUP  L"\uffb2"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_PIEUP  U"\uffb2"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_SSANGPIEUP  0xffb3
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SSANGPIEUP  L"\uffb3"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SSANGPIEUP  U"\uffb3"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_PIEUP_SIOS  0xffb4
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_PIEUP_SIOS  L"\uffb4"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_PIEUP_SIOS  U"\uffb4"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_SIOS  0xffb5
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SIOS  L"\uffb5"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SIOS  U"\uffb5"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_SSANGSIOS  0xffb6
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SSANGSIOS  L"\uffb6"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SSANGSIOS  U"\uffb6"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_IEUNG  0xffb7
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_IEUNG  L"\uffb7"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_IEUNG  U"\uffb7"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_CIEUC  0xffb8
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_CIEUC  L"\uffb8"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_CIEUC  U"\uffb8"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_SSANGCIEUC  0xffb9
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SSANGCIEUC  L"\uffb9"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_SSANGCIEUC  U"\uffb9"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_CHIEUCH  0xffba
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_CHIEUCH  L"\uffba"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_CHIEUCH  U"\uffba"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_KHIEUKH  0xffbb
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_KHIEUKH  L"\uffbb"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_KHIEUKH  U"\uffbb"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_THIEUTH  0xffbc
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_THIEUTH  L"\uffbc"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_THIEUTH  U"\uffbc"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_PHIEUPH  0xffbd
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_PHIEUPH  L"\uffbd"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_PHIEUPH  U"\uffbd"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_HIEUH  0xffbe
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_HIEUH  L"\uffbe"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_HIEUH  U"\uffbe"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_A  0xffc2
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_A  L"\uffc2"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_A  U"\uffc2"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_AE  0xffc3
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_AE  L"\uffc3"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_AE  U"\uffc3"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_YA  0xffc4
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YA  L"\uffc4"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YA  U"\uffc4"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_YAE  0xffc5
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YAE  L"\uffc5"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YAE  U"\uffc5"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_EO  0xffc6
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_EO  L"\uffc6"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_EO  U"\uffc6"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_E  0xffc7
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_E  L"\uffc7"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_E  U"\uffc7"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_YEO  0xffca
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YEO  L"\uffca"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YEO  U"\uffca"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_YE  0xffcb
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YE  L"\uffcb"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YE  U"\uffcb"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_O  0xffcc
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_O  L"\uffcc"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_O  U"\uffcc"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_WA  0xffcd
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_WA  L"\uffcd"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_WA  U"\uffcd"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_WAE  0xffce
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_WAE  L"\uffce"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_WAE  U"\uffce"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_OE  0xffcf
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_OE  L"\uffcf"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_OE  U"\uffcf"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_YO  0xffd2
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YO  L"\uffd2"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YO  U"\uffd2"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_U  0xffd3
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_U  L"\uffd3"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_U  U"\uffd3"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_WEO  0xffd4
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_WEO  L"\uffd4"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_WEO  U"\uffd4"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_WE  0xffd5
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_WE  L"\uffd5"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_WE  U"\uffd5"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_WI  0xffd6
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_WI  L"\uffd6"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_WI  U"\uffd6"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_YU  0xffd7
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YU  L"\uffd7"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YU  U"\uffd7"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_EU  0xffda
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_EU  L"\uffda"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_EU  U"\uffda"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_YI  0xffdb
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YI  L"\uffdb"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_YI  U"\uffdb"
 #define UNICODE_HALFWIDTH_HANGUL_LETTER_I  0xffdc
-#define UNITEXT_HALFWIDTH_HANGUL_LETTER_I  L"\uffdc"
+#define UNITEXT_HALFWIDTH_HANGUL_LETTER_I  U"\uffdc"
 #define UNICODE_FULLWIDTH_CENT_SIGN  0xffe0
-#define UNITEXT_FULLWIDTH_CENT_SIGN  L"\uffe0"
+#define UNITEXT_FULLWIDTH_CENT_SIGN  U"\uffe0"
 #define UNICODE_FULLWIDTH_POUND_SIGN  0xffe1
-#define UNITEXT_FULLWIDTH_POUND_SIGN  L"\uffe1"
+#define UNITEXT_FULLWIDTH_POUND_SIGN  U"\uffe1"
 #define UNICODE_FULLWIDTH_NOT_SIGN  0xffe2
-#define UNITEXT_FULLWIDTH_NOT_SIGN  L"\uffe2"
+#define UNITEXT_FULLWIDTH_NOT_SIGN  U"\uffe2"
 #define UNICODE_FULLWIDTH_MACRON  0xffe3
-#define UNITEXT_FULLWIDTH_MACRON  L"\uffe3"
+#define UNITEXT_FULLWIDTH_MACRON  U"\uffe3"
 #define UNICODE_FULLWIDTH_BROKEN_BAR  0xffe4
-#define UNITEXT_FULLWIDTH_BROKEN_BAR  L"\uffe4"
+#define UNITEXT_FULLWIDTH_BROKEN_BAR  U"\uffe4"
 #define UNICODE_FULLWIDTH_YEN_SIGN  0xffe5
-#define UNITEXT_FULLWIDTH_YEN_SIGN  L"\uffe5"
+#define UNITEXT_FULLWIDTH_YEN_SIGN  U"\uffe5"
 #define UNICODE_FULLWIDTH_WON_SIGN  0xffe6
-#define UNITEXT_FULLWIDTH_WON_SIGN  L"\uffe6"
+#define UNITEXT_FULLWIDTH_WON_SIGN  U"\uffe6"
 #define UNICODE_HALFWIDTH_FORMS_LIGHT_VERTICAL  0xffe8
-#define UNITEXT_HALFWIDTH_FORMS_LIGHT_VERTICAL  L"\uffe8"
+#define UNITEXT_HALFWIDTH_FORMS_LIGHT_VERTICAL  U"\uffe8"
 #define UNICODE_HALFWIDTH_LEFTWARDS_ARROW  0xffe9
-#define UNITEXT_HALFWIDTH_LEFTWARDS_ARROW  L"\uffe9"
+#define UNITEXT_HALFWIDTH_LEFTWARDS_ARROW  U"\uffe9"
 #define UNICODE_HALFWIDTH_UPWARDS_ARROW  0xffea
-#define UNITEXT_HALFWIDTH_UPWARDS_ARROW  L"\uffea"
+#define UNITEXT_HALFWIDTH_UPWARDS_ARROW  U"\uffea"
 #define UNICODE_HALFWIDTH_RIGHTWARDS_ARROW  0xffeb
-#define UNITEXT_HALFWIDTH_RIGHTWARDS_ARROW  L"\uffeb"
+#define UNITEXT_HALFWIDTH_RIGHTWARDS_ARROW  U"\uffeb"
 #define UNICODE_HALFWIDTH_DOWNWARDS_ARROW  0xffec
-#define UNITEXT_HALFWIDTH_DOWNWARDS_ARROW  L"\uffec"
+#define UNITEXT_HALFWIDTH_DOWNWARDS_ARROW  U"\uffec"
 #define UNICODE_HALFWIDTH_BLACK_SQUARE  0xffed
-#define UNITEXT_HALFWIDTH_BLACK_SQUARE  L"\uffed"
+#define UNITEXT_HALFWIDTH_BLACK_SQUARE  U"\uffed"
 #define UNICODE_HALFWIDTH_WHITE_CIRCLE  0xffee
-#define UNITEXT_HALFWIDTH_WHITE_CIRCLE  L"\uffee"
+#define UNITEXT_HALFWIDTH_WHITE_CIRCLE  U"\uffee"
 #define UNICODE_INTERLINEAR_ANNOTATION_ANCHOR  0xfff9
-#define UNITEXT_INTERLINEAR_ANNOTATION_ANCHOR  L"\ufff9"
+#define UNITEXT_INTERLINEAR_ANNOTATION_ANCHOR  U"\ufff9"
 #define UNICODE_INTERLINEAR_ANNOTATION_SEPARATOR  0xfffa
-#define UNITEXT_INTERLINEAR_ANNOTATION_SEPARATOR  L"\ufffa"
+#define UNITEXT_INTERLINEAR_ANNOTATION_SEPARATOR  U"\ufffa"
 #define UNICODE_INTERLINEAR_ANNOTATION_TERMINATOR  0xfffb
-#define UNITEXT_INTERLINEAR_ANNOTATION_TERMINATOR  L"\ufffb"
+#define UNITEXT_INTERLINEAR_ANNOTATION_TERMINATOR  U"\ufffb"
 #define UNICODE_OBJECT_REPLACEMENT_CHARACTER  0xfffc
-#define UNITEXT_OBJECT_REPLACEMENT_CHARACTER  L"\ufffc"
+#define UNITEXT_OBJECT_REPLACEMENT_CHARACTER  U"\ufffc"
 #define UNICODE_REPLACEMENT_CHARACTER  0xfffd
-#define UNITEXT_REPLACEMENT_CHARACTER  L"\ufffd"
+#define UNITEXT_REPLACEMENT_CHARACTER  U"\ufffd"
 #define UNICODE_LINEAR_B_SYLLABLE_B008_A  0x10000
 #define UNICODE_LINEAR_B_SYLLABLE_B038_E  0x10001
 #define UNICODE_LINEAR_B_SYLLABLE_B028_I  0x10002
diff --git a/kar/ipaSerifRegular24.cpp b/kar/ipaSerifRegular24.cpp
deleted file mode 100644
index 7acb180..0000000
--- a/kar/ipaSerifRegular24.cpp
+++ /dev/null
@@ -1,6050 +0,0 @@
-/* ipaSerifRegular24.cpp
- *
- * Copyright (C) 1992-2011 Paul Boersma
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- * pb 2002/07/16 GPL
- * pb 2006/12/15
- * pb 2011/04/06 C++
- */
-
-const char *ipaSerifRegular24 [1 + 255-33+1 + 1] [24 + 1] = { { 0 },
-/* 33 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 34 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 35 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 36 graveover 8 24 over*/
-{
-"oooooooo",
-"##oooooo",
-"o##ooooo",
-"oo##oooo",
-"ooo##ooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-0 },
-/* 37 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 38 caronover 10 24 over*/
-{
-"oooooooo",
-"##oooo##",
-"o##oo##o",
-"oo####oo",
-"ooo##ooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-0 },
-/* 39 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 40 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 41 tildeover 12 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oo##oooo##",
-"o##o##o##o",
-"##oooo##oo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 42 ringover 6 24 over*/
-{
-"oooooo",
-"oo##oo",
-"o#oo#o",
-"o#oo#o",
-"oo##oo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-0 },
-/* 43 plusunder 6 24 over*/
-{
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oo##oo",
-"oo##oo",
-"######",
-"######",
-"oo##oo",
-"oo##oo",
-0 },
-/* 44 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 45 diaresisunder 6 24 over*/
-{
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"##oo##",
-"##oo##",
-"oooooo",
-"oooooo",
-0 },
-/* 46 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 47 glot 11 24 */
-{
-"...........",
-"..#####....",
-".###...##..",
-".##.....#..",
-"........##.",
-"........##.",
-"........##.",
-".......###.",
-"....#####..",
-"....####...",
-"....##.....",
-"....##.....",
-"....##.....",
-"....##.....",
-"....##.....",
-"....##.....",
-"....##.....",
-"...####....",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 48 tildeunder 12 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oo##oooo##",
-"o##o##o##o",
-"##oooo##oo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 49 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 50 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 51 raising 6 24 over*/
-{
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oo##oo",
-"oo##oo",
-"oo##oo",
-"######",
-"######",
-0 },
-/* 52 lowering 6 24 over*/
-{
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"######",
-"######",
-"oo##oo",
-"oo##oo",
-"oo##oo",
-0 },
-/* 53 bridgeunder 6 24 over*/
-{
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"######",
-"#oooo#",
-"#oooo#",
-"#oooo#",
-0 },
-/* 54 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 55 halfringleft 6 24 over*/
-{
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oo##oo",
-"o#oooo",
-"o#oooo",
-"oo##oo",
-"oooooo",
-0 },
-/* 56 ringunder 6 24 over*/
-{
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oo##oo",
-"o#oo#o",
-"o#oo#o",
-"oo##oo",
-"oooooo",
-0 },
-/* 57 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 58 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 59 lcap 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-".###........",
-"..##........",
-"..##........",
-"..##........",
-"..##........",
-"..##........",
-"..##........",
-"..##........",
-"..##........",
-"..##......#.",
-"..##.....##.",
-".##########.",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 60 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 61 minusunder 6 24 over*/
-{
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"######",
-"oooooo",
-"oooooo",
-"oooooo",
-0 },
-/* 62 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 63 glotbar 11 24 */
-{
-"...........",
-"..#####....",
-".###...##..",
-".##.....#..",
-"........##.",
-"........##.",
-"........##.",
-".......###.",
-"....#####..",
-"....####...",
-"....##.....",
-".########..",
-".########..",
-"....##.....",
-"....##.....",
-"....##.....",
-"....##.....",
-"...####....",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 64 acuteover 8 24 */
-{
-"oooooooo",
-"oooooo##",
-"ooooo##o",
-"oooo##oo",
-"ooo##ooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-0 },
-/* 65 ascript 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"....###.##..",
-"..###.####..",
-"..##...###..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-"..##...###..",
-"..###.#####.",
-"....###..##.",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 66 betaphonetic 12 24 */
-{
-"............",
-".....###....",
-"...###.##...",
-"...##...##..",
-"..##....##..",
-"..##....##..",
-"..##....##..",
-"..##...##...",
-"..##.###....",
-"..##...###..",
-"..##....##..",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..####..##..",
-"..##.#####..",
-".####.##....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 67 ccedilla 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"....#####..",
-"..##...###.",
-"..#.....##.",
-".##........",
-".##........",
-".##........",
-".##........",
-".##........",
-".###.......",
-"..###....#.",
-"..#######..",
-"....####...",
-".....#.....",
-"....##.....",
-"....####...",
-"......##...",
-"..##..##...",
-"...####....",
-0 },
-/* 68 eth 12 24 */
-{
-"##..#.......",
-".####.......",
-"..##........",
-".####.......",
-".#..##......",
-".....##.....",
-"....####....",
-"..###..###..",
-"..##....##..",
-".##......##.",
-".##......##.",
-".##......##.",
-".##......##.",
-".##......##.",
-".##......##.",
-"..##....##..",
-"..###..###..",
-"....####....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 69 epsilon 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"...#####..",
-"..##...##.",
-".##.....#.",
-".##.......",
-".###......",
-"..#####...",
-"..##......",
-".##.......",
-".##.......",
-".###....#.",
-"..#######.",
-"...#####..",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 70 ramshorn 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"..##....##..",
-".####..####.",
-".#.##..##.#.",
-"....#..#....",
-"....####....",
-".....##.....",
-"....####....",
-"...######...",
-"..##.....#..",
-"..##....##..",
-"..########..",
-"....####....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 71 gcap 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"....####....",
-"..###..###..",
-"..##....##..",
-".##......#..",
-".##.........",
-".##.........",
-".##..######.",
-".##......##.",
-".##......##.",
-"..##....##..",
-"..###..###..",
-"....####....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 72 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 73 icap 8 24 */
-{
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-".######.",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-".######.",
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-0 },
-/* 74 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 75 hcap 13 24 */
-{
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-".###.....###.",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..#########..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-".###.....###.",
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-0 },
-/* 76 lyogh 12 24 */
-{
-"............",
-".###........",
-"..##........",
-"..##........",
-"..##........",
-"..##........",
-"..#########.",
-"..##.....##.",
-"..##....##..",
-"..##...###..",
-"..##..###...",
-"..##..##....",
-"..##.###....",
-"..##.####...",
-"..##...###..",
-"..##....###.",
-"..##.....##.",
-".####....##.",
-".........##.",
-"....##..##..",
-".....####...",
-"............",
-"............",
-"............",
-0 },
-/* 77 mrighttail 20 24 */
-{
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-".###..###....###....",
-"..##.#####..#####...",
-"..###...####...###..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-".####...####....##..",
-"................##..",
-"................##..",
-"................##..",
-"...............###..",
-"............#####...",
-"............####....",
-0 },
-/* 78 eng 13 24 */
-{
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-".###..###....",
-"..##.#####...",
-"..###...###..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-".####....##..",
-".........##..",
-".........##..",
-".........##..",
-"........###..",
-".....#####...",
-".....####....",
-0 },
-/* 79 oslash 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"...........#",
-"..........#.",
-"....####.#..",
-"..###..###..",
-"..##....##..",
-".##....####.",
-".##....#.##.",
-".##...#..##.",
-".##..#...##.",
-".##.#....##.",
-".##.#....##.",
-"..##....##..",
-"..###..###..",
-".#..####....",
-"#...........",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 80 obar 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"....####....",
-"..###..###..",
-"..##....##..",
-".##......##.",
-".##......##.",
-".##########.",
-".##########.",
-".##......##.",
-".##......##.",
-"..##....##..",
-"..###..###..",
-"....####....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 81 ash 17 24 */
-{
-".................",
-".................",
-".................",
-".................",
-".................",
-".................",
-"....####...###...",
-"...##..####..##..",
-"...##...##....##.",
-"........##....##.",
-"......##########.",
-"....###.##.......",
-"...##...##.......",
-"..##....##.......",
-"..##....##.......",
-"..##...####....#.",
-"..#####..######..",
-"...###.....###...",
-".................",
-".................",
-".................",
-".................",
-".................",
-".................",
-0 },
-/* 82 fishhook 8 24 */
-{
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-".....###",
-"...#####",
-"...##.##",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-".####...",
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-0 },
-/* 83 esh 8 24 */
-{
-"........",
-".....###",
-"....#.##",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"##.#....",
-"###.....",
-"........",
-0 },
-/* 84 thetaphonetic 12 24 */
-{
-"............",
-"............",
-"....####....",
-"..###..###..",
-"..##....##..",
-".##......##.",
-".##......##.",
-".##......##.",
-".##......##.",
-".##########.",
-".##########.",
-".##......##.",
-".##......##.",
-".##......##.",
-".##......##.",
-"..##....##..",
-"..###..###..",
-"....####....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 85 horseshoe 13 24 */
-{
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-".####...####.",
-"...##...##...",
-"...##...##...",
-"...##...##...",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..###...###..",
-"...#######...",
-"....#####....",
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-0 },
-/* 86 vscript 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"###....##..",
-".##....##..",
-".##....##..",
-".##.....##.",
-".##......#.",
-".##......#.",
-".##......#.",
-".##......#.",
-".##.....#..",
-"..##...##..",
-"..######...",
-"....##.....",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 87 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 88 chi 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-".###......#.",
-"##.##....##.",
-"...##....#..",
-"...##...#...",
-"....##..#...",
-"....##.#....",
-"....##.#....",
-".....##.....",
-".....##.....",
-"....###.....",
-"....#.##....",
-"...#..##....",
-"...#..##....",
-"..#....##...",
-".##....##.##",
-".#......###.",
-"............",
-"............",
-0 },
-/* 89 ycap 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"####..####.",
-".##....##..",
-".##....##..",
-"..##..##...",
-"..##..##...",
-"...####....",
-"....##.....",
-"....##.....",
-"....##.....",
-"....##.....",
-"....##.....",
-"...####....",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 90 yogh 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...####...",
-".....###..",
-"......###.",
-".......##.",
-".#.....##.",
-".##....##.",
-"..##..##..",
-"...####...",
-"..........",
-"..........",
-"..........",
-0 },
-/* 91 bracketleft 10 24 */
-{
-"..........",
-".#########",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".##.......",
-".#########",
-"..........",
-0 },
-/* 92 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 93 bracketright 10 24 */
-{
-"..........",
-"#########.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-".......##.",
-"#########.",
-"..........",
-0 },
-/* 94 circumover 8 24 over*/
-{
-"oooooooo",
-"ooo##ooo",
-"oo####oo",
-"o##oo##o",
-"##oooo##",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-"oooooooo",
-0 },
-/* 95 diaresisover 6 24 over*/
-{
-"oooooo",
-"oooooo",
-"##oo##",
-"##oo##",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-0 },
-/* 96 strokeunder 12 24 over*/
-{
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"oooooooooooo",
-"ooooo##ooooo",
-"ooooo##ooooo",
-"ooooo##ooooo",
-"ooooo##ooooo",
-0 },
-/* 97 a 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...#####...",
-"..##..###..",
-"..##...##..",
-".......##..",
-".....####..",
-"...###.##..",
-"..##...##..",
-".##....##..",
-".##....##..",
-".##...###..",
-".#####.##..",
-"..###...##.",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 98 b 12 24 */
-{
-"............",
-".###........",
-"..##........",
-"..##........",
-"..##........",
-"..##........",
-"..##.###....",
-"..###..###..",
-"..##....##..",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##....##..",
-"..###..###..",
-"..#.####....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 99 c 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"....#####..",
-"..##...###.",
-"..#.....##.",
-".##........",
-".##........",
-".##........",
-".##........",
-".##........",
-".###.......",
-"..###....#.",
-"..#######..",
-"....####...",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 100 d 12 24 */
-{
-"............",
-".......###..",
-"........##..",
-"........##..",
-"........##..",
-"........##..",
-"....###.##..",
-"..###..###..",
-"..##....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-"..##....##..",
-"..###..###..",
-"....####.##.",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 101 e 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"....####...",
-"..##...##..",
-"..#.....##.",
-".##.....##.",
-".#########.",
-".##........",
-".##........",
-".##........",
-".###.......",
-"..###....#.",
-"..#######..",
-"....####...",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 102 f 7 24 */
-{
-".......",
-"....###",
-"...#.##",
-"..##...",
-"..##...",
-"..##...",
-"#######",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-".####..",
-".......",
-".......",
-".......",
-".......",
-".......",
-".......",
-0 },
-/* 103 gscript 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"....###.###.",
-"..###..###..",
-"..##....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-"..##....##..",
-"..###..###..",
-"....######..",
-"........##..",
-"........##..",
-".##.....##..",
-".###...##...",
-"..#######...",
-"....###.....",
-0 },
-/* 104 h 13 24 */
-{
-".............",
-".###.........",
-"..##.........",
-"..##.........",
-"..##.........",
-"..##.........",
-"..##..###....",
-"..##.#####...",
-"..###...###..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-".####...####.",
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-0 },
-/* 105 i 6 24 */
-{
-"......",
-"..##..",
-"..##..",
-"......",
-"......",
-"......",
-".###..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-".####.",
-"......",
-"......",
-"......",
-"......",
-"......",
-"......",
-0 },
-/* 106 j 6 24 */
-{
-"......",
-"..##..",
-"..##..",
-"......",
-"......",
-"......",
-".###..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"###...",
-"##....",
-"......",
-0 },
-/* 107 k 12 24 */
-{
-"............",
-".###........",
-"..##........",
-"..##........",
-"..##........",
-"..##........",
-"..##..#####.",
-"..##...##...",
-"..##..##....",
-"..##..#.....",
-"..##.#......",
-"..####......",
-"..##.##.....",
-"..##.###....",
-"..##..###...",
-"..##...###..",
-"..##....###.",
-".####..#####",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 108 l 6 24 */
-{
-"......",
-".###..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-".####.",
-"......",
-"......",
-"......",
-"......",
-"......",
-"......",
-0 },
-/* 109 m 20 24 */
-{
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-".###..###....###....",
-"..##.#####..#####...",
-"..###...####...###..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-".####...####...####.",
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-0 },
-/* 110 n 13 24 */
-{
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-".###..###....",
-"..##.#####...",
-"..###...###..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-".####...####.",
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-0 },
-/* 111 o 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"....####....",
-"..###..###..",
-"..##....##..",
-".##......##.",
-".##......##.",
-".##......##.",
-".##......##.",
-".##......##.",
-".##......##.",
-"..##....##..",
-"..###..###..",
-"....####....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 112 p 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-".###.###....",
-"..###..###..",
-"..##....##..",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##....##..",
-"..###..###..",
-"..##.###....",
-"..##........",
-"..##........",
-"..##........",
-"..##........",
-".####.......",
-"............",
-0 },
-/* 113 q 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"....###.##..",
-"..###..###..",
-"..##....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-".##.....##..",
-"..##....##..",
-"..###..###..",
-"....###.##..",
-"........##..",
-"........##..",
-"........##..",
-"........##..",
-".......####.",
-"............",
-0 },
-/* 114 r 9 24 */
-{
-".........",
-".........",
-".........",
-".........",
-".........",
-".........",
-".###..##.",
-"..##.###.",
-"..###.##.",
-"..##.....",
-"..##.....",
-"..##.....",
-"..##.....",
-"..##.....",
-"..##.....",
-"..##.....",
-"..##.....",
-".####....",
-".........",
-".........",
-".........",
-".........",
-".........",
-".........",
-0 },
-/* 115 s 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"...#####..",
-"..##..##..",
-".##....#..",
-".###......",
-"..###.....",
-"..#####...",
-"....####..",
-"......###.",
-".......##.",
-".#.....##.",
-".##...##..",
-".#####....",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 116 t 7 24 */
-{
-".......",
-".......",
-".......",
-"...#...",
-"..##...",
-".###...",
-"#######",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##...",
-"..##..#",
-"...###.",
-".......",
-".......",
-".......",
-".......",
-".......",
-".......",
-0 },
-/* 117 u 13 24 */
-{
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-".###....###..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..###...###..",
-"...#####.##..",
-"....###..###.",
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-0 },
-/* 118 v 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"####...####",
-".##.....##.",
-".##.....#..",
-"..##....#..",
-"..##....#..",
-"..##...#...",
-"...##..#...",
-"...##..#...",
-"...##.#....",
-"....###....",
-"....###....",
-".....#.....",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 119 w 17 24 */
-{
-".................",
-".................",
-".................",
-".................",
-".................",
-".................",
-"####...####..####",
-".##.....##....##.",
-".##.....##....#..",
-"..##....##....#..",
-"..##....##....#..",
-"..##...#.##..#...",
-"...##..#.##..#...",
-"...##.#..##..#...",
-"...##.#...#.#....",
-"....###...###....",
-"....###...###....",
-".....#.....#.....",
-".................",
-".................",
-".................",
-".................",
-".................",
-".................",
-0 },
-/* 120 x 13 24 */
-{
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-".####...####.",
-"..##.....##..",
-"...##...##...",
-"...###..#....",
-"....##.#.....",
-".....##......",
-".....###.....",
-"....##.##....",
-"...##..###...",
-"...#....##...",
-"..##.....##..",
-".####...####.",
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-0 },
-/* 121 y 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"####...####",
-".##.....##.",
-".##.....#..",
-"..##....#..",
-"..##....#..",
-"..##...#...",
-"...##..#...",
-"...##..#...",
-"...##.#....",
-"....###....",
-"....###....",
-".....#.....",
-"....##.....",
-"....#......",
-"...##......",
-"####.......",
-"###........",
-"...........",
-0 },
-/* 122 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 123 rcap 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-".###.###....",
-"..###..###..",
-"..##....##..",
-"..##....##..",
-"..##...###..",
-"..######....",
-"..####......",
-"..##.##.....",
-"..##..##....",
-"..##...##...",
-"..##....##..",
-".####..####.",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 124 corner 12 24 */
-{
-"#######.....",
-"#######.....",
-".....##.....",
-".....##.....",
-".....##.....",
-".....##.....",
-".....##.....",
-".....##.....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 125 rrighttail 8 24 */
-{
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-".###..##",
-"..##.###",
-"..###.##",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"...##..#",
-"...#####",
-".....##.",
-"........",
-0 },
-/* 126 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 127 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 128 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 129 ascriptturn 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-".##..###....",
-".#####.###..",
-"..###...##..",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..###...##..",
-"..####.###..",
-"..##.###....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 130 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 131 ligature 20 24 over*/
-{
-"ooooooo#####oooooooo",
-"oooo###########ooooo",
-"o#####ooooooo#####oo",
-"##ooooooooooooooo##o",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-"oooooooooooooooooooo",
-0 },
-/* 132 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 133 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 134 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 135 bullseye 14 24 */
-{
-"..............",
-"..............",
-"..............",
-"..............",
-"..............",
-".....####.....",
-"...########...",
-"..###....###..",
-"..##......##..",
-".##........##.",
-".##...##...##.",
-".##...##...##.",
-".##...##...##.",
-".##........##.",
-"..##......##..",
-"..###....###..",
-"...########...",
-".....####.....",
-"..............",
-"..............",
-"..............",
-"..............",
-"..............",
-"..............",
-0 },
-/* 136 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 137 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 138 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 139 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 140 aturn 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-".##...###..",
-"..##.#####.",
-"..###...##.",
-"..##....##.",
-"..##....##.",
-"..##...##..",
-"..##.###...",
-"..####.....",
-"..##.......",
-"..##...##..",
-"..###..##..",
-"...#####...",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 141 cturn 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...####....",
-"..#######..",
-".#....###..",
-".......###.",
-"........##.",
-"........##.",
-"........##.",
-"........##.",
-"........##.",
-".##.....#..",
-".###...##..",
-"..#####....",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 142 pipe 6 24 */
-{
-"......",
-"......",
-"......",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"......",
-"......",
-"......",
-"......",
-"......",
-0 },
-/* 143 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 144 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 145 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 146 pipedouble 10 24 */
-{
-"..........",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..##..##..",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 147 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 148 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 149 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 150 stroke 6 24 */
-{
-"......",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"..##..",
-"......",
-0 },
-/* 151 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 152 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 153 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 154 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 155 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 156 pipedoublebar 10 24 */
-{
-"..........",
-"....##....",
-"....##....",
-"....##....",
-"....##....",
-"....##....",
-".########.",
-".########.",
-"....##....",
-"....##....",
-"....##....",
-".########.",
-".########.",
-"....##....",
-"....##....",
-"....##....",
-"....##....",
-"....##....",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 157 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 158 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 159 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 160 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 161 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 162 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 163 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 164 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 165 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 166 halfringright 6 24 over*/
-{
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oooooo",
-"oo##oo",
-"oooo#o",
-"oooo#o",
-"oo##oo",
-"oooooo",
-0 },
-/* 167 srighttail 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"...#####..",
-"..##..##..",
-".##....#..",
-".###......",
-"..###.....",
-"..#####...",
-"....####..",
-"......###.",
-".......##.",
-".#.....##.",
-".##...##..",
-".#####....",
-".#........",
-".#...#....",
-".#####....",
-"..###.....",
-"..........",
-"..........",
-0 },
-/* 168 rturn 8 24 */
-{
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-"....####",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".##.###.",
-".###.##.",
-".##..###",
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-0 },
-/* 169 ghooktop 14 24 */
-{
-"..............",
-"..............",
-".........###..",
-"........##.##.",
-"........##..#.",
-"........##....",
-"....###.##....",
-"..###..###....",
-"..##....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-"..##....##....",
-"..###..###....",
-"....###.##....",
-"........##....",
-".#......##....",
-".##.....##....",
-"..#######.....",
-"...#####......",
-"..............",
-0 },
-/* 170 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 171 schwa 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...####....",
-"..#######..",
-".#....###..",
-".......###.",
-"........##.",
-"........##.",
-"........##.",
-".#########.",
-".##.....##.",
-".##.....#..",
-"..##...##..",
-"...####....",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 172 ubar 13 24 */
-{
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-".###....###..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"#############",
-"#############",
-"..##.....##..",
-"..##.....##..",
-"..###...###..",
-"...#####.##..",
-"....###..###.",
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-0 },
-/* 173 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 174 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 175 oecap 17 24 */
-{
-".................",
-".................",
-".................",
-".................",
-".................",
-".................",
-"....###.########.",
-"..###.####....##.",
-"..##...###.....#.",
-".##.....##.......",
-".##.....##.......",
-".##.....######...",
-".##.....##.......",
-".##.....##.......",
-".##.....##.......",
-"..##...###.....#.",
-"..###.####....##.",
-"....###.########.",
-".................",
-".................",
-".................",
-".................",
-".................",
-".................",
-0 },
-/* 176 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 177 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 178 ncap 13 24 */
-{
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-".###.....###.",
-"..##.....##..",
-"..###....##..",
-"..####...##..",
-"..##.#...##..",
-"..##.##..##..",
-"..##..##.##..",
-"..##...#.##..",
-"..##...####..",
-"..##....###..",
-"..##.....##..",
-".####....###.",
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-0 },
-/* 179 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 180 yturn 11 24 */
-{
-"...........",
-"........###",
-".......####",
-"......##...",
-"......#....",
-".....##....",
-".....#.....",
-"....###....",
-"....###....",
-"....#.##...",
-"...#..##...",
-"...#..##...",
-"...#...##..",
-"..#....##..",
-"..#....##..",
-"..#.....##.",
-".##.....##.",
-"####...####",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 181 mturn 20 24 */
-{
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-".####...####...####.",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..###...####...###..",
-"...#####..#####.##..",
-"....###....###..###.",
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-0 },
-/* 182 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 183 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 184 phiphonetic 12 24 */
-{
-"............",
-"............",
-"....####....",
-".....##.....",
-".....##.....",
-".....##.....",
-"....####....",
-"..########..",
-"..##.##.##..",
-".##..##..##.",
-".##..##..##.",
-".##..##..##.",
-".##..##..##.",
-".##..##..##.",
-".##..##..##.",
-"..##.##.##..",
-"..########..",
-"....####....",
-".....##.....",
-".....##.....",
-".....##.....",
-"....####....",
-"............",
-"............",
-0 },
-/* 185 kidneybean 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"....####...",
-"..###..##..",
-"..##....##.",
-".##.....##.",
-".##....###.",
-".##.#####..",
-".##....##..",
-".##.....##.",
-".##.....##.",
-"..##...###.",
-"..#######..",
-"....####...",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 186 bhooktop 12 24 */
-{
-"....#####...",
-"...##...##..",
-"..##.....#..",
-"..##........",
-"..##........",
-"..##........",
-"..##.###....",
-"..###..###..",
-"..##....##..",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##.....##.",
-"..##....##..",
-"..###..###..",
-"..#.####....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 187 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 188 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 189 zrighttail 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-".########...",
-".##....##...",
-".#....##....",
-".....###....",
-"....###.....",
-"....##......",
-"...###......",
-"...##.......",
-"..###.......",
-"..##....#...",
-".##.....#...",
-".########...",
-".......#....",
-".......#...#",
-".......#####",
-"........###.",
-"............",
-"............",
-0 },
-/* 190 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 191 oe 17 24 */
-{
-".................",
-".................",
-".................",
-".................",
-".................",
-".................",
-"....###....###...",
-"..###.##.##..##..",
-"..##...###....##.",
-".##.....##....##.",
-".##.....########.",
-".##.....##.......",
-".##.....##.......",
-".##.....##.......",
-".##.....##.......",
-"..##...####....#.",
-"..###.##.######..",
-"....###....###...",
-".................",
-".................",
-".................",
-".................",
-".................",
-".................",
-0 },
-/* 192 glotrevbar 11 24 */
-{
-"...........",
-"....#####..",
-"..##...###.",
-"..#.....##.",
-".##........",
-".##........",
-".##........",
-".###.......",
-"..#####....",
-"...####....",
-".....##....",
-"..########.",
-"..########.",
-".....##....",
-".....##....",
-".....##....",
-".....##....",
-"....####...",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 193 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 194 lbelt 8 24 */
-{
-"........",
-"..###...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"..###...",
-".#.##...",
-".#.##...",
-"..#####.",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"..####..",
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-0 },
-/* 195 vturn 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-".....#.....",
-"....###....",
-"....###....",
-"....#.##...",
-"...#..##...",
-"...#..##...",
-"...#...##..",
-"..#....##..",
-"..#....##..",
-"..#.....##.",
-".##.....##.",
-"####...####",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 196 gammaphonetic 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"####...####",
-".##.....##.",
-".##.....#..",
-"..##....#..",
-"..##....#..",
-"..##...#...",
-"...##..#...",
-"...##..#...",
-"...##.#....",
-"....#.#....",
-"....##.....",
-"....###....",
-"...#.##....",
-"...#..#....",
-"...#..#....",
-"...##.#....",
-"....##.....",
-"...........",
-0 },
-/* 197 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 198 jcurl 7 24 */
-{
-".......",
-"...##..",
-"...##..",
-".......",
-".......",
-".......",
-"..###..",
-"...##..",
-"...##..",
-"...##..",
-"...##..",
-"...##..",
-"...##..",
-"...##..",
-"...##..",
-"...##..",
-"...##..",
-"...##..",
-".######",
-"#..##..",
-"#..##..",
-"####...",
-".##....",
-".......",
-0 },
-/* 199 stress2 5 24 */
-{
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-"..##.",
-"..##.",
-"..##.",
-"..##.",
-"..##.",
-"..##.",
-"..##.",
-0 },
-/* 200 stress1 5 24 */
-{
-"..##.",
-"..##.",
-"..##.",
-"..##.",
-"..##.",
-"..##.",
-"..##.",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-".....",
-0 },
-/* 201 ltilde 8 24 */
-{
-"........",
-"..###...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-".####..#",
-"#..####.",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"..####..",
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-0 },
-/* 202 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 203 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 204 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 205 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 206 epsilonrev 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..#####...",
-".##...##..",
-".#.....##.",
-".......##.",
-"......###.",
-"...#####..",
-"......##..",
-".......##.",
-".......##.",
-".#....###.",
-".#######..",
-"..#####...",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 207 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 208 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 209 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 210 rcapinv 12 24 */
-{
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-".####..####.",
-"..##....##..",
-"..##...##...",
-"..##..##....",
-"..##.##.....",
-"..####......",
-"..######....",
-"..##...###..",
-"..##....##..",
-"..##....##..",
-"..###..###..",
-".###.###....",
-"............",
-"............",
-"............",
-"............",
-"............",
-"............",
-0 },
-/* 211 rturnrighttail 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"....####...",
-".....##....",
-".....##....",
-".....##....",
-".....##....",
-".....##....",
-".....##....",
-".....##....",
-".....##....",
-".##.###....",
-".###.##....",
-".##..##....",
-".....##....",
-".....##....",
-"......##..#",
-"......#####",
-"........##.",
-"...........",
-0 },
-/* 212 schwarighthook 18 24 */
-{
-"..................",
-"..................",
-"..................",
-"..................",
-"..................",
-"..................",
-"...####...........",
-"..#######...##....",
-".#....###..###....",
-".......####.##....",
-"........##..##..#.",
-"........##..#####.",
-"........##...###..",
-".#########........",
-".##.....##........",
-".##.....#.........",
-"..##...##.........",
-"...####...........",
-"..................",
-"..................",
-"..................",
-"..................",
-"..................",
-"..................",
-0 },
-/* 213 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 214 glotrev 11 24 */
-{
-"...........",
-"....#####..",
-"..##...###.",
-"..#.....##.",
-".##........",
-".##........",
-".##........",
-".###.......",
-"..#####....",
-"...####....",
-".....##....",
-".....##....",
-".....##....",
-".....##....",
-".....##....",
-".....##....",
-".....##....",
-"....####...",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 215 jbarhooktop 9 24 */
-{
-".........",
-".........",
-".........",
-"....###..",
-"...##..#.",
-"...##..#.",
-"...##....",
-"...##....",
-"...##....",
-"...##....",
-"...##....",
-"...##....",
-"...##....",
-"...##....",
-"...##....",
-"...##....",
-"...##....",
-"#######..",
-"...##....",
-"...##....",
-"...##....",
-"##.#.....",
-"###......",
-".........",
-0 },
-/* 216 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 217 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 218 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 219 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 220 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 221 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 222 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 223 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 224 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 225 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 226 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 227 wturn 17 24 */
-{
-".................",
-".................",
-".................",
-".................",
-".................",
-".................",
-".....#.....#.....",
-"....###...###....",
-"....###...###....",
-"....#.#...#.##...",
-"...#..##..#.##...",
-"...#..##.#..##...",
-"...#..##.#...##..",
-"..#....##....##..",
-"..#....##....##..",
-"..#....##.....##.",
-".##....##.....##.",
-"####..####...####",
-".................",
-".................",
-".................",
-".................",
-".................",
-".................",
-0 },
-/* 228 rturnleg 8 24 */
-{
-"........",
-"....####",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".....##.",
-".##.###.",
-".###.##.",
-".##..###",
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-0 },
-/* 229 mturnleg 20 24 */
-{
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-"....................",
-".####...####...####.",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..##.....##.....##..",
-"..###...####...###..",
-"...#####..#####.##..",
-"....###....###..##..",
-"................##..",
-"................##..",
-"................##..",
-"................##..",
-"................###.",
-"....................",
-0 },
-/* 230 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 231 hturn 13 24 */
-{
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-".####...####.",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..###...###..",
-"...#####.##..",
-"....###..##..",
-".........##..",
-".........##..",
-".........##..",
-".........##..",
-".........###.",
-".............",
-0 },
-/* 232 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 233 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 234 drighttail 14 24 */
-{
-"..............",
-".......###....",
-"........##....",
-"........##....",
-"........##....",
-"........##....",
-"....###.##....",
-"..###..###....",
-"..##....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-"..##....##....",
-"..###..###....",
-"....######....",
-"........##....",
-"........##....",
-".........##..#",
-".........#####",
-"...........##.",
-"..............",
-0 },
-/* 235 dhooktop 14 24 */
-{
-".........###..",
-"........##..#.",
-"........##..#.",
-"........##....",
-"........##....",
-"........##....",
-"....###.##....",
-"..###..###....",
-"..##....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-".##.....##....",
-"..##....##....",
-"..###..###....",
-"....####.##...",
-"..............",
-"..............",
-"..............",
-"..............",
-"..............",
-"..............",
-0 },
-/* 236 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 237 z 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.....",
-"..##....#.",
-".##....##.",
-".########.",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 238 henghooktop 13 24 */
-{
-".............",
-"....####.....",
-"...##...#....",
-"..##.........",
-"..##.........",
-"..##.........",
-"..##..###....",
-"..##.#####...",
-"..###...###..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-".####....##..",
-".........##..",
-".........##..",
-".........##..",
-"........###..",
-".....#####...",
-".....####....",
-0 },
-/* 239 jdotlessbar 8 24 */
-{
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-"..####..",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"#######.",
-"...##...",
-"...##...",
-"...##...",
-"##.#....",
-"###.....",
-"........",
-0 },
-/* 240 hbar 13 24 */
-{
-".###.........",
-"..##.........",
-"..##.........",
-"#######......",
-"#######......",
-"..##.........",
-"..##..###....",
-"..##.#####...",
-"..###...###..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-".####...####.",
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-0 },
-/* 241 lrighttail 8 24 */
-{
-"........",
-".###....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"...##..#",
-"...#####",
-".....##.",
-"........",
-0 },
-/* 242 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 243 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 244 z 10 24 over*/
-{
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"o########o",
-"o##oooo##o",
-"o#oooo##oo",
-"ooooo###oo",
-"oooo###ooo",
-"oooo##oooo",
-"ooo###oooo",
-"ooo##ooooo",
-"oo###ooooo",
-"oo##oooo#o",
-"o##oooo##o",
-"o########o",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-"oooooooooo",
-0 },
-/* 245 bcap 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-".###.###...",
-"..###..##..",
-"..##....##.",
-"..##....##.",
-"..##...##..",
-"..######...",
-"..##...##..",
-"..##....##.",
-"..##.....#.",
-"..##....##.",
-"..###..##..",
-".###.###...",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 246 ibar 8 24 */
-{
-"........",
-"...##...",
-"...##...",
-"........",
-"........",
-"........",
-"..###...",
-"...##...",
-"...##...",
-"...##...",
-".######.",
-".######.",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"...##...",
-"..####..",
-"........",
-"........",
-"........",
-"........",
-"........",
-"........",
-0 },
-/* 247 nrighttail 15 24 */
-{
-"...............",
-"...............",
-"...............",
-"...............",
-"...............",
-"...............",
-".###..###......",
-"..##.#####.....",
-"..###...###....",
-"..##.....##....",
-"..##.....##....",
-"..##.....##....",
-"..##.....##....",
-"..##.....##....",
-"..##.....##....",
-"..##.....##....",
-"..##.....##....",
-".####....##....",
-".........##....",
-".........##....",
-"..........##..#",
-"..........#####",
-"............##.",
-"...............",
-0 },
-/* 248 nlefttail 13 24 */
-{
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-".###..###....",
-"..##.#####...",
-"..###...###..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##....####.",
-"..##.........",
-"..##.........",
-"..##.........",
-"###..........",
-"##...........",
-".............",
-0 },
-/* 249 length 6 24 */
-{
-"......",
-"......",
-"......",
-"......",
-"......",
-"......",
-".####.",
-"..##..",
-"..##..",
-"......",
-"......",
-"......",
-"......",
-"......",
-"......",
-"..##..",
-"..##..",
-".####.",
-"......",
-"......",
-"......",
-"......",
-"......",
-"......",
-0 },
-/* 250 hhooktop 13 24 */
-{
-"....#####....",
-"...##...##...",
-"..##.....#...",
-"..##.........",
-"..##.........",
-"..##.........",
-"..##..###....",
-"..##.#####...",
-"..###...###..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-"..##.....##..",
-".####...####.",
-".............",
-".............",
-".............",
-".............",
-".............",
-".............",
-0 },
-/* 251 erev 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...####....",
-"..##...##..",
-".##.....#..",
-".##.....##.",
-".#########.",
-"........##.",
-"........##.",
-"........##.",
-".......###.",
-".#....###..",
-"..#######..",
-"...####....",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 252 zcurl 10 24 */
-{
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-"..........",
-".########.",
-".##....##.",
-".#....##..",
-".....###..",
-"....###...",
-"....##....",
-"...###....",
-"...##.....",
-"..###.##..",
-"..##..#.#.",
-".##...#.#.",
-".#######..",
-".....#....",
-".....#....",
-"..........",
-"..........",
-"..........",
-"..........",
-0 },
-/* 253 gcaphooktop 14 24 */
-{
-"..............",
-"..............",
-"..............",
-"..............",
-"..........##..",
-".........####.",
-"....####.#..#.",
-"..###..###....",
-"..##....##....",
-".##......#....",
-".##...........",
-".##...........",
-".##..######...",
-".##......##...",
-".##......##...",
-"..##....##....",
-"..###..###....",
-"....####......",
-"..............",
-"..............",
-"..............",
-"..............",
-"..............",
-"..............",
-0 },
-/* 254 ccurl 11 24 */
-{
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"...........",
-"....#####..",
-"..##...###.",
-"..#.....##.",
-".##........",
-".##........",
-".##........",
-".##........",
-".##........",
-".##....##..",
-"..##..#..#.",
-"..###.#.#..",
-"....####...",
-".....#.....",
-".....#.....",
-"...........",
-"...........",
-"...........",
-"...........",
-0 },
-/* 255 trighttail 8 24 */
-{
-"........",
-"........",
-"........",
-"...#....",
-"..##....",
-".###....",
-"#######.",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"..##....",
-"...##..#",
-"...#####",
-".....##.",
-"........",
-0 },
-{ 0 } };
-
-/* End of file ipaSerifRegular24.cpp */
diff --git a/kar/longchar.cpp b/kar/longchar.cpp
index d419ea9..3f9fd8c 100644
--- a/kar/longchar.cpp
+++ b/kar/longchar.cpp
@@ -1,6 +1,6 @@
 /* longchar.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,12 +27,13 @@
  * pb 2005/03/08 ps encoding; SILIPA93 encoding for Windows and Mac
  * pb 2005/09/18 SILIPA93 widths for fontless EPS files, including bold
  * pb 2006/11/17 Unicode
- * pb 2006/12/05 first wchar_t support
+ * pb 2006/12/05 first wchar support
  * pb 2006/12/15 stress marks
  * pb 2007/08/08 Longchar_genericizeW
  * pb 2008/02/27 \d- and \D-
  * pb 2009/03/24 removed bug that caused Longchar_getInfoFromNative to be able to work with uninitialized table
  * pb 2011/04/06 C++
+ * pb 2015/05/30 char32_t
  */
 
 #include "longchar.h"
@@ -616,7 +617,7 @@ static short inited = 0;
 #define UNICODE_TOP_GENERICIZABLE  65000
 static struct { char first, second; } genericDigraph [1+UNICODE_TOP_GENERICIZABLE];
 
-static void init (void) {
+static void init () {
 	Longchar_Info data;
 	int i;
 	for (i = 0, data = & Longchar_database [0]; data -> first != '\0'; i ++, data ++) {
@@ -635,19 +636,19 @@ static void init (void) {
 	inited = 1;
 }
 
-wchar_t * Longchar_nativizeW (const wchar_t *generic, wchar_t *native, int educateQuotes) {
+char32_t * Longchar_nativize32 (const char32_t *generic, char32_t *native, int educateQuotes) {
 	long nquote = 0;
-	wchar_t kar, kar1, kar2;
+	char32_t kar, kar1, kar2;
 	if (! inited) init ();
-	while ((kar = *generic++) != L'\0') {
+	while ((kar = *generic++) != U'\0') {
 		if (educateQuotes) {
-			if (kar == L'\"') {
+			if (kar == U'\"') {
 				*native++ = ++nquote & 1 ? UNICODE_LEFT_DOUBLE_QUOTATION_MARK : UNICODE_RIGHT_DOUBLE_QUOTATION_MARK;
 				continue;
-			} else if (kar == L'`') {   /* Grave. */
+			} else if (kar == U'`') {   /* Grave. */
 				*native++ = UNICODE_LEFT_SINGLE_QUOTATION_MARK;
 				continue;
-			} else if (kar == L'\'') {   /* Straight apostrophe. */
+			} else if (kar == U'\'') {   /* Straight apostrophe. */
 				*native++ = UNICODE_RIGHT_SINGLE_QUOTATION_MARK;   /* Right single quote. */
 				continue;
 			}
@@ -687,11 +688,11 @@ char *Longchar_genericize (const char *native, char *g) {
 	return g;
 }
 
-wchar_t *Longchar_genericizeW (const wchar_t *native, wchar_t *g) {
-	wchar_t kar;
+char32_t *Longchar_genericize32 (const char32_t *native, char32_t *g) {
+	char32_t kar;
 	if (! inited) init ();
-	while ((kar = *native++) != '\0') {
-		if (kar > 128 && kar <= UNICODE_TOP_GENERICIZABLE && genericDigraph [kar]. first != '\0') {
+	while ((kar = *native++) != U'\0') {
+		if (kar > 128 && kar <= UNICODE_TOP_GENERICIZABLE && genericDigraph [kar]. first != U'\0') {
 			*g++ = '\\';
 			*g++ = genericDigraph [kar]. first;
 			*g++ = genericDigraph [kar]. second;
@@ -711,7 +712,7 @@ Longchar_Info Longchar_getInfo (char kar1, char kar2) {
 	return & Longchar_database [position];
 }
 
-Longchar_Info Longchar_getInfoFromNative (wchar_t kar) {
+Longchar_Info Longchar_getInfoFromNative (char32_t kar) {
 	if (! inited) init ();
 	return kar > UNICODE_TOP_GENERICIZABLE ? Longchar_getInfo (' ', ' ') : Longchar_getInfo (genericDigraph [kar]. first, genericDigraph [kar]. second);
 }
diff --git a/kar/longchar.h b/kar/longchar.h
index 1191e60..e8f67d3 100644
--- a/kar/longchar.h
+++ b/kar/longchar.h
@@ -2,7 +2,7 @@
 #define _longchar_h_
 /* longchar.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,10 +49,10 @@
 
 /********** Conversion of Roman native and generic string encodings. **********/
 
-wchar_t * Longchar_nativizeW (const wchar_t *generic, wchar_t *native, int educateQuotes);
+char32_t * Longchar_nativize32 (const char32_t *generic, char32_t *native, int educateQuotes);
 
 char * Longchar_genericize (const char *native, char *generic);
-wchar_t *Longchar_genericizeW (const wchar_t *native, wchar_t *generic);
+char32_t *Longchar_genericize32 (const char32_t *native, char32_t *generic);
 /*
 	Function:
 		Copies the string 'native' to the string 'generic',
@@ -86,7 +86,7 @@ typedef struct structLongchar_Info {
 	*Longchar_Info;
 
 Longchar_Info Longchar_getInfo (char kar1, char kar2);
-Longchar_Info Longchar_getInfoFromNative (wchar_t kar);
+Longchar_Info Longchar_getInfoFromNative (char32_t kar);
 /* If no info found, these two routines return the info for a space. */
 
 /*
diff --git a/main/main_Praat.cpp b/main/main_Praat.cpp
index 4030e27..bf66920 100644
--- a/main/main_Praat.cpp
+++ b/main/main_Praat.cpp
@@ -20,44 +20,39 @@
 #include "praat.h"
 #include "praat_version.h"
 
-#define UTF32_C(string) \
-	({ static const wchar_t *_static_utf32_string = Melder_utf8ToWcs (string); _static_utf32_string; })
-
-static const char32_t *greeting = U"Hello?";
-
 static void logo (Graphics g) {
 	Graphics_setWindow (g, 0, 1, 0.00, 0.80);
 	Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
 	Graphics_setFont (g, kGraphics_font_TIMES);
 	Graphics_setFontSize (g, 45);
 	Graphics_setColour (g, Graphics_MAROON);
-	Graphics_text (g, 0.385, 0.66, L"P");
-	Graphics_text (g, 0.448, 0.66, L"\\s{R}");
-	Graphics_text (g, 0.510, 0.66, L"\\s{A}");
-	Graphics_text (g, 0.575, 0.66, L"\\s{A}");
-	Graphics_text (g, 0.628, 0.66, L"\\s{T}");
+	Graphics_text (g, 0.385, 0.66, U"P");
+	Graphics_text (g, 0.448, 0.66, U"\\s{R}");
+	Graphics_text (g, 0.510, 0.66, U"\\s{A}");
+	Graphics_text (g, 0.575, 0.66, U"\\s{A}");
+	Graphics_text (g, 0.628, 0.66, U"\\s{T}");
 	Graphics_setFontSize (g, 15);
-	Graphics_text (g, 0.5, 0.55, L"%%doing phonetics by computer");
+	Graphics_text (g, 0.5, 0.55, U"%%doing phonetics by computer");
 	#define xstr(s) str(s)
 	#define str(s) #s
-	Graphics_text (g, 0.5, 0.45, L"version " xstr(PRAAT_VERSION_STR));
+	Graphics_text (g, 0.5, 0.45, U"version " xstr(PRAAT_VERSION_STR));
 	Graphics_setColour (g, Graphics_BLACK);
 	Graphics_setFontSize (g, 14);
-	Graphics_text (g, 0.5, 0.33, L"www.praat.org");
+	Graphics_text (g, 0.5, 0.33, U"www.praat.org");
 	Graphics_setFont (g, kGraphics_font_HELVETICA);
 	Graphics_setFontSize (g, 10);
-	Graphics_text (g, 0.5, 0.16, UTF32_C ("Copyright © 1992–" xstr(PRAAT_YEAR) " by Paul Boersma and David Weenink"));
+	Graphics_text (g, 0.5, 0.16, U"Copyright © 1992–" xstr(PRAAT_YEAR) " by Paul Boersma and David Weenink");
 }
 
 int main (int argc, char *argv []) {
 	try {
 		praat_setLogo (130, 80, logo);
-		praat_init ("Praat", (unsigned int) argc, argv);
+		praat_init (U"Praat", (unsigned int) argc, argv);
 		INCLUDE_LIBRARY (praat_uvafon_init)
 		INCLUDE_LIBRARY (praat_contrib_Ola_KNN_init)
 		praat_run ();
 	} catch (MelderError) {
-		Melder_flushError ("This error message percolated all the way to the top.");   // an attempt to catch Apache errors
+		Melder_flushError (U"This error message percolated all the way to the top.");   // an attempt to catch Apache errors
 	}
 	return 0;
 }
diff --git a/main/palias b/main/palias
deleted file mode 100644
index f17ddb5..0000000
--- a/main/palias
+++ /dev/null
@@ -1,66 +0,0 @@
-echo
-echo '***************************************************'
-echo '*                                                 *'
-echo "*   Paul's aliases, version 12 April 2014...      *"
-echo '*                                                 *'
-echo '***************************************************'
-echo
-if ($?DISPLAY == 0) then
-	if ($?REMOTEHOST) then
-		setenv DISPLAY ${REMOTEHOST}:0
-	else
-		setenv DISPLAY :0
-	endif
-endif
-alias g 'cd \!*; set prompt = "#${HOST}:`pwd` > "'
-alias f 'df -m'
-alias clean 'rm */*.[oa] */*/*.[oa]'
-alias e edit
-alias u 'ssh -X paul at uvafon.hum.uva.nl'
-alias u201 'ssh -X pboersma at 145.18.230.201'
-alias lisa 'ssh -X pboersma at lisa.surfsara.nl'
-alias d 'ls -al'
-if ($HOSTTYPE == "intel-mac") then
-	alias d 'ls -alwFG'
-	alias h 'g /Users/pboersma/'
-	alias i 'g /Users/pboersma/www'
-	alias v 'd /var/vm'
-	alias e edit
-	alias m32 '(cd /src/w32; cp makefiles/makefile.defs.mingw32 makefile.defs; make)'
-	alias m64 '(cd /src/w64; cp makefiles/makefile.defs.mingw64 makefile.defs; make)'
-	alias m32c '(cd /src/w32c; cp makefiles/makefile.defs.mingw32c makefile.defs; make)'
-	alias m64c '(cd /src/w64c; cp makefiles/makefile.defs.mingw64c makefile.defs; make)'
-	alias p '/Users/pboersma/Praats/DerivedData/praat64/Build/Products/Configuration64/Praat.app/Contents/MacOS/Praat'
-	alias p32 '/Users/pboersma/Praats/DerivedData/praat32/Build/Products/Configuration1/Praat.app/Contents/MacOS/Praat'
-endif
-if ($HOST == "uvafon") then
-	alias w 'g /u/praat/www'
-	alias h 'g /u/paul'
-	alias i 'g /u/paul/www'
-	alias m '(cd /u/paul/src; cp makefiles/makefile.defs.linux makefile.defs; make)'
-	alias p '~/src/praat'
-	alias d 'ls -alF --color=always'
-endif
-if ($HOSTTYPE == "i686-linux") then
-	alias h 'g /home/pboersma'
-	alias s 'g /media/psf/srcl1232'
-	alias p '/media/psf/srcl1232/praat'
-	alias e 'gedit \!* &'
-	alias m '(cd /media/psf/srcl1232; cp makefiles/makefile.defs.linux.alsa makefile.defs; make)'
-	alias d 'ls -al --color=always'
-endif
-if ($HOST == "paul-ubuntu-12-64") then
-	alias h 'g /home/pboersma'
-	alias s  'g /media/psf/srcl1264'
-	alias sc 'g /media/psf/srcl1264c'
-	alias ss 'g /media/psf/srcl1264s'
-	alias p  '/media/psf/srcl1264/praat'
-	alias pc '/media/psf/srcl1264c/praat'
-	alias e 'gedit \!* &'
-	alias m  '(cd /media/psf/srcl1264;  cp makefiles/makefile.defs.linux.alsa  makefile.defs; make)'
-	alias mc '(cd /media/psf/srcl1264c; cp makefiles/makefile.defs.linuxc.alsa makefile.defs; make)'
-	alias ms '(cd /media/psf/srcl1264s; cp makefiles/makefile.defs.linuxs.alsa makefile.defs; make)'
-	alias d 'ls -al --color=always'
-endif
-h
-alias
diff --git a/makefiles/makefile.defs.cygwin64 b/makefiles/makefile.defs.cygwin64
new file mode 100644
index 0000000..fb5ce91
--- /dev/null
+++ b/makefiles/makefile.defs.cygwin64
@@ -0,0 +1,25 @@
+# File: makefile.defs.cygwin64
+
+# System: Cygwin on Windows
+# Paul Boersma, 13 September 2015
+
+CC = gcc -std=gnu99
+
+CXX = g++ -std=gnu++11 -Wshadow
+
+CFLAGS = -mwin32 -DUNICODE -D_FILE_OFFSET_BITS=64 -O1
+# Probably implicit: -m64 -mwin32 -march=x86_64 -mtune=generic
+
+CXXFLAGS = $(CFLAGS)
+
+LINK = g++
+
+EXECUTABLE = Praat.exe
+
+LIBS = -lwinmm -lwsock32 -lcomctl32 -lole32 -lgdi32 -lgdiplus -lcomdlg32 -static-libgcc -static-libstdc++ -mwindows
+
+AR = ar
+RANLIB = ranlib
+WINDRES = windres
+ICON = praat_win.o
+MAIN_ICON = main/praat_win.o
diff --git a/makefiles/makefile.defs.mingw32 b/makefiles/makefile.defs.darmin32
similarity index 100%
copy from makefiles/makefile.defs.mingw32
copy to makefiles/makefile.defs.darmin32
diff --git a/makefiles/makefile.defs.mingw64 b/makefiles/makefile.defs.darmin64
similarity index 100%
copy from makefiles/makefile.defs.mingw64
copy to makefiles/makefile.defs.darmin64
diff --git a/makefiles/makefile.defs.linux.alsa b/makefiles/makefile.defs.linux.alsa
index 78a7966..473c8ee 100644
--- a/makefiles/makefile.defs.linux.alsa
+++ b/makefiles/makefile.defs.linux.alsa
@@ -1,11 +1,11 @@
 # File: makefile.defs.linux.alsa
 
 # System: Linux
-# Paul Boersma, 17 December 2014
+# Paul Boersma, 22 March 2014
 
 CC = gcc -std=gnu99
 
-CXX = g++ -std=c++0x
+CXX = g++ -std=c++11
 
 CFLAGS = -DUNIX -Dlinux -DALSA -D_FILE_OFFSET_BITS=64 `pkg-config --cflags gtk+-2.0` -Werror=missing-prototypes -Werror=implicit -Wreturn-type -Wunused -Wunused-parameter -Wuninitialized -O1 -g1 -pthread
 
diff --git a/makefiles/makefile.defs.linux.pulse b/makefiles/makefile.defs.linux.pulse
new file mode 100644
index 0000000..bbc9a14
--- /dev/null
+++ b/makefiles/makefile.defs.linux.pulse
@@ -0,0 +1,23 @@
+# File: makefile.defs.linux.pulse
+
+# System: Linux
+# David Weenink and Paul Boersma, 28 October 2015
+
+CC = gcc -std=gnu99
+
+CXX = g++ -std=c++11
+
+CFLAGS = -DUNIX -Dlinux -DALSA -DHAVE_PULSEAUDIO -D_FILE_OFFSET_BITS=64 `pkg-config --cflags gtk+-2.0` -Werror=missing-prototypes -Werror=implicit -Wreturn-type -Wunused -Wunused-parameter -Wuninitialized -O1 -g1 -pthread
+
+CXXFLAGS = $(CFLAGS) -Wshadow
+
+LINK = g++
+
+EXECUTABLE = praat
+
+LIBS = `pkg-config --libs gtk+-2.0` -lm -lpulse -lasound -lpthread
+
+AR = ar
+RANLIB = ls
+ICON =
+MAIN_ICON =
diff --git a/makefiles/makefile.defs.linux.silent b/makefiles/makefile.defs.linux.silent
index 83e2254..6182c49 100644
--- a/makefiles/makefile.defs.linux.silent
+++ b/makefiles/makefile.defs.linux.silent
@@ -1,11 +1,11 @@
 # File: makefile.defs.linux.silent
 
 # System: Linux without sound
-# Paul Boersma, 17 December 2014
+# Paul Boersma, 22 March 2014
 
 CC = gcc -std=gnu99
 
-CXX = g++ -std=c++0x
+CXX = g++ -std=c++11
 
 CFLAGS = -D_FILE_OFFSET_BITS=64 -DUNIX -Dlinux `pkg-config --cflags gtk+-2.0` -Werror=missing-prototypes -Werror=implicit -Wreturn-type -Wunused -Wunused-parameter -Wuninitialized -O1 -g1 -pthread
 
diff --git a/makefiles/makefile.defs.linuxc.alsa b/makefiles/makefile.defs.linuxc.alsa
deleted file mode 100644
index b7aaef4..0000000
--- a/makefiles/makefile.defs.linuxc.alsa
+++ /dev/null
@@ -1,23 +0,0 @@
-# File: makefile.defs.linuxc.alsa
-
-# System: Linux
-# Paul Boersma, 17 December 2014
-
-CC = gcc -std=gnu99
-
-CXX = g++ -std=c++0x
-
-CFLAGS = -DCONSOLE_APPLICATION -DUNIX -Dlinux -DALSA -D_FILE_OFFSET_BITS=64 -Werror=missing-prototypes -Werror=implicit -Wreturn-type -Wunused -Wunused-parameter -Wuninitialized -O1 -g1 -pthread
-
-CXXFLAGS = $(CFLAGS) -Wshadow
-
-LINK = g++
-
-EXECUTABLE = praat
-
-LIBS = -lm -lasound -lpthread
-
-AR = ar
-RANLIB = ls
-ICON =
-MAIN_ICON =
diff --git a/makefiles/makefile.defs.linuxs.alsa b/makefiles/makefile.defs.linuxs.alsa
index 3d23304..850520b 100644
--- a/makefiles/makefile.defs.linuxs.alsa
+++ b/makefiles/makefile.defs.linuxs.alsa
@@ -1,11 +1,11 @@
 # File: makefile.defs.linuxc.alsa
 
 # System: Linux
-# Paul Boersma, 17 December 2014
+# Paul Boersma, 22 March 2014
 
 CC = gcc -std=gnu99
 
-CXX = g++ -std=c++0x
+CXX = g++ -std=c++11
 
 CFLAGS = -DNO_GRAPHICS -DUNIX -Dlinux -DALSA -D_FILE_OFFSET_BITS=64 -Werror=missing-prototypes -Werror=implicit -Wreturn-type -Wunused -Wunused-parameter -Wuninitialized -O1 -g1 -pthread
 
diff --git a/makefiles/makefile.defs.mingw32 b/makefiles/makefile.defs.mingw32
index 09b51ff..d1595a5 100644
--- a/makefiles/makefile.defs.mingw32
+++ b/makefiles/makefile.defs.mingw32
@@ -1,24 +1,27 @@
 # File: makefile.defs.mingw32
 
-# System: MinGW
-# Paul Boersma, 17 December 2014
+# System: MinGW on Windows under Cygwin
+# Paul Boersma, 18 September 2015
 
-CC = /mingw32/bin/gcc -std=gnu99 -isystem /mingw32/include
+PREFIX = i686-w64-mingw32-
 
-CXX = /mingw32/bin/g++ -std=c++0x -isystem /mingw32/include/c++/4.7.0 -isystem /mingw32/include -Wshadow
+CC = $(PREFIX)gcc -std=gnu99
 
-CFLAGS = -DWINVER=0x0500 -D_WIN32_WINNT=0x0500 -D_WIN32_IE=0x0500 -DUNICODE -D_FILE_OFFSET_BITS=64 -Dmain=wingwmain -O1 -pthread
+CXX = $(PREFIX)g++ -std=gnu++11 -Wshadow
+
+CFLAGS = -municode -D_FILE_OFFSET_BITS=64 -O1
+# Probably implicit: -m32 -mwin32 -march=i686 -mtune=generic
 
 CXXFLAGS = $(CFLAGS)
 
-LINK = /mingw32/bin/g++
+LINK = $(PREFIX)g++
 
 EXECUTABLE = Praat.exe
 
-LIBS = -L/mingw32/lib -lwinmm -lwsock32 -lcomctl32 -lole32 -lgdi32 -lgdiplus -lcomdlg32 -static-libgcc -static-libstdc++ -mwindows
+LIBS = -lwinmm -lwsock32 -lcomctl32 -lole32 -lgdi32 -lgdiplus -lcomdlg32 -static-libgcc -static-libstdc++ -mwindows
 
-AR = /mingw32/bin/ar
-RANLIB = /mingw32/bin/ranlib
-WINDRES = /mingw32/bin/windres
+AR = $(PREFIX)ar
+RANLIB = $(PREFIX)ranlib
+WINDRES = $(PREFIX)windres
 ICON = praat_win.o
 MAIN_ICON = main/praat_win.o
diff --git a/makefiles/makefile.defs.mingw32-490 b/makefiles/makefile.defs.mingw32-490
deleted file mode 100644
index 4c26614..0000000
--- a/makefiles/makefile.defs.mingw32-490
+++ /dev/null
@@ -1,24 +0,0 @@
-# File: makefile.defs.mingw32-490
-
-# System: MinGW
-# Paul Boersma, 17 December 2014
-
-CC = /mingw32-490/bin/x86_64-w64-mingw32-gcc -std=gnu99 -isystem /mingw32-490/mingw/include
-
-CXX = /mingw32-490/bin/x86_64-w64-mingw32-g++ -std=c++0x -isystem /mingw32-490/mingw/include/c++/4.9.0 -isystem /mingw32-490/mingw/include -Wshadow -m64 -flto
-
-CFLAGS = -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -D_WIN32_IE=0x0700 -DUNICODE -D_FILE_OFFSET_BITS=64 -Dmain=wingwmain -O1
-
-CXXFLAGS = $(CFLAGS) -pthread
-
-LINK = /mingw32-490/mingw/bin/g++
-
-EXECUTABLE = Praat.exe
-
-LIBS = -L/mingw32-490/x86_64-w64-mingw32/lib -lwinmm -lwsock32 -lcomctl32 -lole32 -lgdi32 -lgdiplus -lcomdlg32 -static-libgcc -static-libstdc++ -mwindows
-
-AR = /mingw32-490/mingw/bin/ar
-RANLIB = /mingw32-490/mingw/bin/ranlib
-WINDRES = /mingw32-490/bin/x86_64-w64-mingw32-windres
-ICON = praat_win.o
-MAIN_ICON = main/praat_win.o
diff --git a/makefiles/makefile.defs.mingw32c b/makefiles/makefile.defs.mingw32c
deleted file mode 100644
index 2386a26..0000000
--- a/makefiles/makefile.defs.mingw32c
+++ /dev/null
@@ -1,24 +0,0 @@
-# File: makefile.defs.mingw32c
-
-# System: MinGW
-# Paul Boersma, 17 December 2014
-
-CC = /mingw32/bin/gcc -std=gnu99 -isystem /mingw32/include
-
-CXX = /mingw32/bin/g++ -std=c++0x -isystem /mingw32/include/c++/4.7.0 -isystem /mingw32/include -Wshadow
-
-CFLAGS = -DWINVER=0x0500 -D_WIN32_WINNT=0x0500 -D_WIN32_IE=0x0500 -DUNICODE -D_FILE_OFFSET_BITS=64 -DCONSOLE_APPLICATION -O1 -pthread
-
-CXXFLAGS = $(CFLAGS)
-
-LINK = /mingw32/bin/g++
-
-EXECUTABLE = praatcon.exe
-
-LIBS = -L/mingw32/lib -lwinmm -lwsock32 -lcomctl32 -lole32 -lgdi32 -lgdiplus -lcomdlg32 -static-libgcc -static-libstdc++
-
-AR = /mingw32/bin/ar
-RANLIB = /mingw32/bin/ranlib
-WINDRES = /mingw32/bin/windres
-ICON = praat_win.o
-MAIN_ICON = main/praat_win.o
diff --git a/makefiles/makefile.defs.mingw64 b/makefiles/makefile.defs.mingw64
index 381dd11..a78dad8 100644
--- a/makefiles/makefile.defs.mingw64
+++ b/makefiles/makefile.defs.mingw64
@@ -1,24 +1,27 @@
 # File: makefile.defs.mingw64
 
-# System: MinGW
-# Paul Boersma, 17 December 2014
+# System: MinGW on Windows under Cygwin
+# Paul Boersma, 10 September 2015
 
-CC = /mingw64/bin/gcc -std=gnu99 -isystem /mingw64/include
+PREFIX = x86_64-w64-mingw32-
 
-CXX = /mingw64/bin/g++ -std=c++0x -isystem /mingw64/include/c++/4.7.0 -isystem /mingw64/include -Wshadow -m64
+CC = $(PREFIX)gcc -std=gnu99
 
-CFLAGS = -DWINVER=0x0500 -D_WIN32_WINNT=0x0500 -D_WIN32_IE=0x0500 -DUNICODE -D_FILE_OFFSET_BITS=64 -Dmain=wingwmain -O1 -pthread
+CXX = $(PREFIX)g++ -std=gnu++11 -Wshadow
+
+CFLAGS = -municode -D_FILE_OFFSET_BITS=64 -O1
+# Probably implicit: -m64 -mwin32 -march=x86_64 -mtune=generic
 
 CXXFLAGS = $(CFLAGS)
 
-LINK = /mingw64/bin/g++
+LINK = $(PREFIX)g++
 
 EXECUTABLE = Praat.exe
 
-LIBS = -L/mingw64/lib -lwinmm -lwsock32 -lcomctl32 -lole32 -lgdi32 /mingw64/lib/GdiPlus.dll -lcomdlg32 -static-libgcc -static-libstdc++ -mwindows
+LIBS = -lwinmm -lwsock32 -lcomctl32 -lole32 -lgdi32 -lgdiplus -lcomdlg32 -static-libgcc -static-libstdc++ -mwindows
 
-AR = /mingw64/bin/ar
-RANLIB = /mingw64/bin/ranlib
-WINDRES = /mingw64/bin/windres
+AR = $(PREFIX)ar
+RANLIB = $(PREFIX)ranlib
+WINDRES = $(PREFIX)windres
 ICON = praat_win.o
 MAIN_ICON = main/praat_win.o
diff --git a/makefiles/makefile.defs.mingw64-490 b/makefiles/makefile.defs.mingw64-490
deleted file mode 100644
index d1381f7..0000000
--- a/makefiles/makefile.defs.mingw64-490
+++ /dev/null
@@ -1,24 +0,0 @@
-# File: makefile.defs.mingw64-490
-
-# System: MinGW
-# Paul Boersma, 17 December 2014
-
-CC = /mingw64-490/bin/x86_64-w64-mingw32-gcc -std=gnu99 -isystem /mingw64-490/mingw/include
-
-CXX = /mingw64-490/bin/x86_64-w64-mingw32-g++ -std=c++0x -isystem /mingw64-490/mingw/include/c++/4.9.0 -isystem /mingw64-490/mingw/include -Wshadow -m64
-
-CFLAGS = -DWINVER=0x0600 -D_WIN32_WINNT=0x0600 -D_WIN32_IE=0x0700 -DUNICODE -D_FILE_OFFSET_BITS=64 -Dmain=wingwmain -O1 -flto
-
-CXXFLAGS = $(CFLAGS) -pthread
-
-LINK = /mingw64-490/mingw/bin/g++
-
-EXECUTABLE = Praat.exe
-
-LIBS = -L/mingw64-490/x86_64-w64-mingw32/lib -lwinmm -lwsock32 -lcomctl32 -lole32 -lgdi32 /mingw64/lib/GdiPlus.dll -lcomdlg32 -static-libgcc -static-libstdc++ -mwindows
-
-AR = /mingw64-490/mingw/bin/ar
-RANLIB = /mingw64-490/mingw/bin/ranlib
-WINDRES = /mingw64-490/bin/x86_64-w64-mingw32-windres
-ICON = praat_win.o
-MAIN_ICON = main/praat_win.o
diff --git a/makefiles/makefile.defs.mingw64c b/makefiles/makefile.defs.mingw64c
deleted file mode 100644
index 16fa729..0000000
--- a/makefiles/makefile.defs.mingw64c
+++ /dev/null
@@ -1,24 +0,0 @@
-# File: makefile.defs.mingw64c
-
-# System: MinGW
-# Paul Boersma, 17 December 2014
-
-CC = /mingw64/bin/gcc -std=gnu99 -isystem /mingw64/include
-
-CXX = /mingw64/bin/g++ -std=c++0x -isystem /mingw64/include/c++/4.7.0 -isystem /mingw64/include -Wshadow -m64
-
-CFLAGS = -DWINVER=0x0500 -D_WIN32_WINNT=0x0500 -D_WIN32_IE=0x0500 -DUNICODE -D_FILE_OFFSET_BITS=64 -DCONSOLE_APPLICATION -O1 -pthread
-
-CXXFLAGS = $(CFLAGS)
-
-LINK = /mingw64/bin/g++
-
-EXECUTABLE = praatcon.exe
-
-LIBS = -L/mingw64/lib -lwinmm -lwsock32 -lcomctl32 -lole32 -lgdi32 /mingw64/lib/GdiPlus.dll -lcomdlg32 -static-libgcc -static-libstdc++
-
-AR = /mingw64/bin/ar
-RANLIB = /mingw64/bin/ranlib
-WINDRES = /mingw64/bin/windres
-ICON = praat_win.o
-MAIN_ICON = main/praat_win.o
diff --git a/num/NUM.cpp b/num/NUM.cpp
index ca2fe48..98f43a7 100644
--- a/num/NUM.cpp
+++ b/num/NUM.cpp
@@ -1,6 +1,6 @@
 /* NUM.cpp
  *
- * Copyright (C) 1992-2008,2011,2012,2014 Paul Boersma
+ * Copyright (C) 1992-2008,2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -58,7 +58,7 @@ void NUMscale (double *x, double xminfrom, double xmaxfrom, double xminto, doubl
 	else *x = xminto + (xmaxto - xminto) * ((*x - xminfrom) / (xmaxfrom - xminfrom));
 }
 
-void NUMinit (void) {
+void NUMinit () {
 	gsl_set_error_handler_off ();
 	NUMrandom_init ();
 }
@@ -129,7 +129,7 @@ double NUMincompleteBeta (double a, double b, double x) {
 	gsl_sf_result result;
 	int status = gsl_sf_beta_inc_e (a, b, x, & result);
 	if (status != GSL_SUCCESS && status != GSL_EUNDRFLW && status != GSL_EMAXITER) {
-		Melder_fatal ("NUMincompleteBeta status %d", status);
+		Melder_fatal (U"NUMincompleteBeta status ", status);
 		return NUMundefined;
 	}
 	return result. val;
@@ -402,7 +402,7 @@ double NUM_interpolate_sinc (double y [], long nx, double x, long maxDepth) {
 }
 #else
 double NUM_interpolate_sinc (double y [], long nx, double x, long maxDepth) {
-	long ix, midleft = floor (x), midright = midleft + 1, left, right;
+	long ix, midleft = (long) floor (x), midright = midleft + 1, left, right;
 	double result = 0.0, a, halfsina, aa, daa;
 	NUM_interpolate_simple_cases
 	left = midright - maxDepth, right = midleft + maxDepth;
@@ -497,15 +497,15 @@ void NUM_viterbi (
 	}
 	for (long iframe = 2; iframe <= numberOfFrames; iframe ++) {
 		for (long icand2 = 1; icand2 <= numberOfCandidates [iframe]; icand2 ++) {
-			double maximum = -1e300;
-			double place = 0;
+			double maximum = -1e308;
+			long place = 0;
 			for (long icand1 = 1; icand1 <= numberOfCandidates [iframe - 1]; icand1 ++) {
 				double value = delta [iframe - 1] [icand1] + delta [iframe] [icand2]
 					- getTransitionCost (iframe, icand1, icand2, closure);
 				if (value > maximum) { maximum = value; place = icand1; }
 			}
 			if (place == 0)
-				Melder_throw ("Viterbi algorithm cannot compute a track because of weird values.");
+				Melder_throw (U"Viterbi algorithm cannot compute a track because of weird values.");
 			delta [iframe] [icand2] = maximum;
 			psi [iframe] [icand2] = place;
 		}
@@ -573,13 +573,13 @@ void NUM_viterbi_multi (
 	void *closure)
 {
 	struct parm2 parm;
-	parm.indices = NULL;
+	parm.indices = nullptr;
 
-	if (ntrack > ncand) Melder_throw ("(NUM_viterbi_multi:) "
-		"Number of tracks (", ntrack, ") should not exceed number of candidates (", ncand, ").");
+	if (ntrack > ncand) Melder_throw (U"(NUM_viterbi_multi:) "
+		U"Number of tracks (", ntrack, U") should not exceed number of candidates (", ncand, U").");
 	double ncomb = NUMcombinations (ncand, ntrack);
-	if (ncomb > 10000000) Melder_throw ("(NUM_viterbi_multi:) "
-		"Unrealistically high number of combinations (", ncomb, ").");
+	if (ncomb > 10000000) Melder_throw (U"(NUM_viterbi_multi:) "
+		U"Unrealistically high number of combinations (", ncomb, U").");
 	parm. ntrack = ntrack;
 	parm. ncomb = ncomb;
 
diff --git a/num/NUM.h b/num/NUM.h
index 6cebf8f..f98e352 100644
--- a/num/NUM.h
+++ b/num/NUM.h
@@ -2,7 +2,7 @@
 #define _NUM_h_
 /* NUM.h
  *
- * Copyright (C) 1992-2011,2013 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -129,7 +129,6 @@ void * NUMvector (long elementSize, long lo, long hi);
 /*
 	Function:
 		create a vector [lo...hi] with all values initialized to 0.
-		Queue an error message and return NULL if anything went wrong.
 	Preconditions:
 		hi >= lo;
 */
@@ -146,9 +145,8 @@ void * NUMvector_copy (long elementSize, void *v, long lo, long hi);
 /*
 	Function:
 		copy (part of) a vector v, which need not have been created with NUMvector, to a new one.
-		Queue an error message and return NULL if anything went wrong.
 	Preconditions:
-		if v != NULL, the values v [lo..hi] must exist.
+		if v != nullptr, the values v [lo..hi] must exist.
 */
 
 void NUMvector_copyElements (long elementSize, void *v, void *to, long lo, long hi);
@@ -159,8 +157,8 @@ void NUMvector_copyElements (long elementSize, void *v, void *to, long lo, long
 
 bool NUMvector_equal (long elementSize, void *v1, void *v2, long lo, long hi);
 /*
-	return 1 if the vector elements v1 [lo..hi] are equal
-	to the corresponding elements of the vector v2; otherwise, return 0.
+	return true if the vector elements v1 [lo..hi] are equal
+	to the corresponding elements of the vector v2; otherwise, return false.
 	The vectors need not have been created by NUMvector.
 */
 
@@ -179,7 +177,6 @@ void * NUMmatrix (long elementSize, long row1, long row2, long col1, long col2);
 /*
 	Function:
 		create a matrix [row1...row2] [col1...col2] with all values initialized to 0.
-		Queue an error message and return NULL if anything went wrong.
 	Preconditions:
 		row2 >= row1;
 		col2 >= col1;
@@ -190,7 +187,7 @@ void NUMmatrix_free (long elementSize, void *m, long row1, long col1);
 	Function:
 		destroy a matrix m created with NUM...matrix.
 	Preconditions:
-		if m != NULL: row1 and row2
+		if m != nullptr: row1 and col1
 		must have the same value as with the creation of the matrix.
 */
 
@@ -198,9 +195,8 @@ void * NUMmatrix_copy (long elementSize, void *m, long row1, long row2, long col
 /*
 	Function:
 		copy (part of) a matrix m, wich does not have to be created with NUMmatrix, to a new one.
-		Queue an error message and return NULL if anything went wrong.
 	Preconditions:
-		if m != NULL: the values m [rowmin..rowmax] [colmin..colmax] must exist.
+		if m != nullptr: the values m [rowmin..rowmax] [colmin..colmax] must exist.
 */
 
 void NUMmatrix_copyElements (long elementSize, void *m, void *to, long row1, long row2, long col1, long col2);
@@ -216,20 +212,20 @@ bool NUMmatrix_equal (long elementSize, void *m1, void *m2, long row1, long row2
 	The matrices need not have been created by NUM...matrix.
 */
 
-long NUM_getTotalNumberOfArrays (void);   /* For debugging. */
+long NUM_getTotalNumberOfArrays ();   // for debugging
 
 /********** Special functions (NUM.cpp) **********/
 
 double NUMlnGamma (double x);
 double NUMbeta (double z, double w);
-double NUMbesselI (long n, double x);   /* Precondition: n >= 0 */
+double NUMbesselI (long n, double x);   // precondition: n >= 0
 double NUMbessel_i0_f (double x);
 double NUMbessel_i1_f (double x);
-double NUMbesselK (long n, double x);   /* Preconditions: n >= 0 && x > 0.0 */
+double NUMbesselK (long n, double x);   // preconditions: n >= 0 && x > 0.0
 double NUMbessel_k0_f (double x);
 double NUMbessel_k1_f (double x);
 double NUMbesselK_f (long n, double x);
-double NUMsigmoid (double x);   /* Correct also for large positive or negative x. */
+double NUMsigmoid (double x);   // correct also for large positive or negative x
 double NUMinvSigmoid (double x);
 double NUMerfcc (double x);
 double NUMgaussP (double z);
@@ -262,10 +258,10 @@ double NUMerbToHertz (double erb);
 
 /********** Sorting (NUMsort.cpp) **********/
 
-void NUMsort_d (long n, double ra []);   /* Heap sort. */
+void NUMsort_d (long n, double ra []);   // heap sort
 void NUMsort_i (long n, int ra []);
 void NUMsort_l (long n, long ra []);
-void NUMsort_str (long n, wchar_t *a []);
+void NUMsort_str (long n, char32 *a []);
 void NUMsort_p (long n, void *a [], int (*compare) (const void *, const void *));
 
 double NUMquantile (long n, double a [], double factor);
@@ -342,6 +338,8 @@ double NUMrandomGauss_mt (int threadNumber, double mean, double standardDeviatio
 
 double NUMrandomPoisson (double mean);
 
+uint32 NUMhashString (const char32 *string);
+
 void NUMfbtoa (double formant, double bandwidth, double dt, double *a1, double *a2);
 void NUMfilterSecondOrderSection_a (double x [], long n, double a1, double a2);
 void NUMfilterSecondOrderSection_fb (double x [], long n, double dt, double formant, double bandwidth);
@@ -354,18 +352,14 @@ void NUMautoscale (double x [], long n, double scale);
 
 /* The following ANSI-C power trick generates the declarations of 156 functions. */
 #define FUNCTION(type,storage)  \
-	void NUMvector_writeText_##storage (const type *v, long lo, long hi, MelderFile file, const wchar_t *name); \
+	void NUMvector_writeText_##storage (const type *v, long lo, long hi, MelderFile file, const char32 *name); \
 	void NUMvector_writeBinary_##storage (const type *v, long lo, long hi, FILE *f); \
-	void NUMvector_writeCache_##storage (const type *v, long lo, long hi, CACHE *f); \
 	type * NUMvector_readText_##storage (long lo, long hi, MelderReadText text, const char *name); \
 	type * NUMvector_readBinary_##storage (long lo, long hi, FILE *f); \
-	type * NUMvector_readCache_##storage (long lo, long hi, CACHE *f); \
-	void NUMmatrix_writeText_##storage (type **v, long r1, long r2, long c1, long c2, MelderFile file, const wchar_t *name); \
+	void NUMmatrix_writeText_##storage (type **v, long r1, long r2, long c1, long c2, MelderFile file, const char32 *name); \
 	void NUMmatrix_writeBinary_##storage (type **v, long r1, long r2, long c1, long c2, FILE *f); \
-	void NUMmatrix_writeCache_##storage (type **v, long r1, long r2, long c1, long c2, CACHE *f); \
 	type ** NUMmatrix_readText_##storage (long r1, long r2, long c1, long c2, MelderReadText text, const char *name); \
-	type ** NUMmatrix_readBinary_##storage (long r1, long r2, long c1, long c2, FILE *f); \
-	type ** NUMmatrix_readCache_##storage (long r1, long r2, long c1, long c2, CACHE *f);
+	type ** NUMmatrix_readBinary_##storage (long r1, long r2, long c1, long c2, FILE *f);
 FUNCTION (signed char, i1)
 FUNCTION (int, i2)
 FUNCTION (long, i4)
@@ -391,12 +385,12 @@ double * NUMvector_readText_r8 (long lo, long hi, MelderReadString *text, const
 double * NUMvector_readBinary_r8 (long lo, long hi, FILE *f);   // etc
 	create and read a vector as machine-independent binary data from the stream f.
 	Throw an error message if anything went wrong.
-void NUMvector_writeText_r8 (const double *v, long lo, long hi, MelderFile file, const wchar_t *name);   // etc
+void NUMvector_writeText_r8 (const double *v, long lo, long hi, MelderFile file, const char32 *name);   // etc
 	write the vector elements v [lo..hi] as text to the open file,
 	each element on its own line, preceded by "name [index]: ".
 	Throw an error message if anything went wrong.
 	The vectors need not have been created by NUMvector.
-void NUMmatrix_writeText_r8 (double **m, long r1, long r2, long c1, long c2, MelderFile file, const wchar_t *name);   // etc
+void NUMmatrix_writeText_r8 (double **m, long r1, long r2, long c1, long c2, MelderFile file, const char32 *name);   // etc
 	write the matrix elements m [r1..r2] [c1..c2] as text to the open file.
 	Throw an error message if anything went wrong.
 	The matrices need not have been created by NUMmatrix.
@@ -469,7 +463,7 @@ public:
 	}
 	autoNUMvector (T *ptr, long from) : d_ptr (ptr), d_from (from) {
 	}
-	autoNUMvector () : d_ptr (NULL), d_from (1) {
+	autoNUMvector () : d_ptr (nullptr), d_from (1) {
 	}
 	~autoNUMvector<T> () {
 		if (d_ptr) NUMvector_free (sizeof (T), d_ptr, d_from);
@@ -482,13 +476,13 @@ public:
 	}
 	T* transfer () {
 		T* temp = d_ptr;
-		d_ptr = NULL;   // make the pointer non-automatic again
+		d_ptr = nullptr;   // make the pointer non-automatic again
 		return temp;
 	}
 	void reset (long from, long to) {
 		if (d_ptr) {
 			NUMvector_free (sizeof (T), d_ptr, d_from);
-			d_ptr = NULL;
+			d_ptr = nullptr;
 		}
 		d_from = from;
 		d_ptr = static_cast <T*> (NUMvector (sizeof (T), from, to));
@@ -532,7 +526,7 @@ public:
 	}
 	autoNUMmatrix (T **ptr, long row1, long col1) : d_ptr (ptr), d_row1 (row1), d_col1 (col1) {
 	}
-	autoNUMmatrix () : d_ptr (NULL), d_row1 (0), d_col1 (0) {
+	autoNUMmatrix () : d_ptr (nullptr), d_row1 (0), d_col1 (0) {
 	}
 	~autoNUMmatrix () {
 		if (d_ptr) NUMmatrix_free (sizeof (T), d_ptr, d_row1, d_col1);
@@ -545,13 +539,13 @@ public:
 	}
 	T** transfer () {
 		T** temp = d_ptr;
-		d_ptr = NULL;
+		d_ptr = nullptr;
 		return temp;
 	}
 	void reset (long row1, long row2, long col1, long col2) {
 		if (d_ptr) {
 			NUMmatrix_free (sizeof (T), d_ptr, d_row1, d_col1);
-			d_ptr = NULL;
+			d_ptr = nullptr;
 		}
 		d_row1 = row1;
 		d_col1 = col1;
@@ -569,7 +563,7 @@ public:
 	}
 	autodatavector (T *ptr, long from, long to) : d_ptr (ptr), d_from (from), d_to (to) {
 	}
-	autodatavector () : d_ptr (NULL), d_from (1), d_to (0) {
+	autodatavector () : d_ptr (nullptr), d_from (1), d_to (0) {
 	}
 	~autodatavector<T> () {
 		if (d_ptr) {
@@ -586,7 +580,7 @@ public:
 	}
 	T* transfer () {
 		T* temp = d_ptr;
-		d_ptr = NULL;   // make the pointer non-automatic again
+		d_ptr = nullptr;   // make the pointer non-automatic again
 		return temp;
 	}
 	void reset (long from, long to) {
@@ -594,15 +588,15 @@ public:
 			for (long i = d_from; i <= d_to; i ++)
 				Melder_free (d_ptr [i]);
 			NUMvector_free (sizeof (T), d_ptr, d_from);
-			d_ptr = NULL;
+			d_ptr = nullptr;
 		}
-		d_from = from;   // this assignment is safe, because d_ptr is NULL
+		d_from = from;   // this assignment is safe, because d_ptr is null
 		d_to = to;
 		d_ptr = static_cast <T*> (NUMvector (sizeof (T), from, to));
 	}
 };
 
-typedef autodatavector <wchar_t *> autostringvector;
+typedef autodatavector <char32 *> autostring32vector;
 typedef autodatavector <char *> autostring8vector;
 
 /* End of file NUM.h */
diff --git a/num/NUMarrays.cpp b/num/NUMarrays.cpp
index 158e360..2250515 100644
--- a/num/NUMarrays.cpp
+++ b/num/NUMarrays.cpp
@@ -32,13 +32,13 @@
 
 static long theTotalNumberOfArrays;
 
-long NUM_getTotalNumberOfArrays (void) { return theTotalNumberOfArrays; }
+long NUM_getTotalNumberOfArrays () { return theTotalNumberOfArrays; }
 
 /*** Generic memory routines for vectors. ***/
 
 void * NUMvector (long elementSize, long lo, long hi) {
 	try {
-		if (hi < lo) return NULL;   // not an error
+		if (hi < lo) return nullptr;   // not an error
 		char *result;
 		Melder_assert (sizeof (char) == 1);   // some say that this is true by definition
 		for (;;) {   // not very infinite: 99.999 % of the time once, 0.001 % twice
@@ -49,12 +49,12 @@ void * NUMvector (long elementSize, long lo, long hi) {
 		theTotalNumberOfArrays += 1;
 		return result;
 	} catch (MelderError) {
-		Melder_throw ("Vector of elements not created.");
+		Melder_throw (U"Vector of elements not created.");
 	}
 }
 
 void NUMvector_free (long elementSize, void *v, long lo) {
-	if (v == NULL) return;   // no error
+	if (! v) return;   // no error
 	char *dum = (char *) v + lo * elementSize;
 	Melder_free (dum);
 	theTotalNumberOfArrays -= 1;
@@ -62,39 +62,39 @@ void NUMvector_free (long elementSize, void *v, long lo) {
 
 void * NUMvector_copy (long elementSize, void *v, long lo, long hi) {
 	try {
-		if (v == NULL) return NULL;
+		if (! v) return nullptr;
 		char *result = reinterpret_cast <char *> (NUMvector (elementSize, lo, hi));
 		long offset = lo * elementSize;
 		memcpy (result + offset, (char *) v + offset, (hi - lo + 1) * elementSize);
 		return result;
 	} catch (MelderError) {
-		Melder_throw ("Vector of elements not copied.");
+		Melder_throw (U"Vector of elements not copied.");
 	}
 }
 
 void NUMvector_copyElements (long elementSize, void *v, void *to, long lo, long hi) {
 	long offset = lo * elementSize;
-	Melder_assert (v != NULL && to != NULL);
+	Melder_assert (!! v && !! to);
 	if (hi >= lo) memcpy ((char *) to + offset, (char *) v + offset, (hi - lo + 1) * elementSize);
 }
 
 bool NUMvector_equal (long elementSize, void *v1, void *v2, long lo, long hi) {
 	long offset = lo * elementSize;
-	Melder_assert (v1 != NULL && v2 != NULL);
+	Melder_assert (v1 && v2);
 	return ! memcmp ((char *) v1 + offset, (char *) v2 + offset, (hi - lo + 1) * elementSize);
 }
 
 void NUMvector_append (long elementSize, void **v, long lo, long *hi) {
 	try {
 		char *result;
-		if (*v == NULL) {
+		if (! *v) {
 			result = reinterpret_cast <char *> (NUMvector (elementSize, lo, lo));
 			*hi = lo;
 		} else {
 			long offset = lo * elementSize;
 			for (;;) {   // not very infinite: 99.999 % of the time once, 0.001 % twice
 				result = reinterpret_cast <char *> (Melder_realloc ((char *) *v + offset, (*hi - lo + 2) * elementSize));
-				if ((result -= offset) != NULL) break;   // this will normally succeed at the first try
+				if ((result -= offset) != nullptr) break;   // this will normally succeed at the first try
 				(void) Melder_realloc_f (result + offset, 1);   // make "sure" that the second try will succeed
 			}
 			(*hi) ++;
@@ -102,14 +102,14 @@ void NUMvector_append (long elementSize, void **v, long lo, long *hi) {
 		}
 		*v = result;
 	} catch (MelderError) {
-		Melder_throw ("Vector: element not appended.");
+		Melder_throw (U"Vector: element not appended.");
 	}
 }
 
 void NUMvector_insert (long elementSize, void **v, long lo, long *hi, long position) {
 	try {
 		char *result;
-		if (*v == NULL) {
+		if (! *v) {
 			result = reinterpret_cast <char *> (NUMvector (elementSize, lo, lo));
 			*hi = lo;
 			Melder_assert (position == lo);
@@ -123,7 +123,7 @@ void NUMvector_insert (long elementSize, void **v, long lo, long *hi, long posit
 		}
 		*v = result;
 	} catch (MelderError) {
-		Melder_throw ("Vector: element not inserted.");
+		Melder_throw (U"Vector: element not inserted.");
 	}
 }
 
@@ -131,9 +131,9 @@ void NUMvector_insert (long elementSize, void **v, long lo, long *hi, long posit
 
 void * NUMmatrix (long elementSize, long row1, long row2, long col1, long col2) {
 	try {
-		int64_t numberOfRows = row2 - row1 + 1;
-		int64_t numberOfColumns = col2 - col1 + 1;
-		int64_t numberOfCells = numberOfRows * numberOfColumns;
+		int64 numberOfRows = row2 - row1 + 1;
+		int64 numberOfColumns = col2 - col1 + 1;
+		int64 numberOfCells = numberOfRows * numberOfColumns;
 
 		/*
 		 * Allocate room for the row pointers.
@@ -143,7 +143,7 @@ void * NUMmatrix (long elementSize, long row1, long row2, long col1, long col2)
 		for (;;) {
 			result = reinterpret_cast <char **> (_Melder_malloc_f (numberOfRows * sizeof (char *)));   // assume that all pointers have the same size
 			result -= row1;
-			if (result != NULL) break;   // this will normally succeed at the first try
+			if (result) break;   // this will normally succeed at the first try
 			(void) Melder_realloc_f (result + row1, 1);   // make "sure" that the second try will succeed
 		}
 		/*
@@ -158,20 +158,20 @@ void * NUMmatrix (long elementSize, long row1, long row2, long col1, long col2)
 				Melder_free (result);   // free the row pointers
 				throw MelderError ();
 			}
-			if ((result [row1] -= col1 * elementSize) != NULL) break;   // this will normally succeed at the first try
+			if ((result [row1] -= col1 * elementSize) != nullptr) break;   // this will normally succeed at the first try
 			(void) Melder_realloc_f (result [row1] + col1 * elementSize, 1);   // make "sure" that the second try will succeed
 		}
-		int64_t columnSize = numberOfColumns * elementSize;
+		int64 columnSize = numberOfColumns * elementSize;
 		for (long irow = row1 + 1; irow <= row2; irow ++) result [irow] = result [irow - 1] + columnSize;
 		theTotalNumberOfArrays += 1;
 		return result;
 	} catch (MelderError) {
-		Melder_throw ("Matrix of elements not created.");
+		Melder_throw (U"Matrix of elements not created.");
 	}
 }
 
 void NUMmatrix_free (long elementSize, void *m, long row1, long col1) {
-	if (m == NULL) return;
+	if (! m) return;
 	char *dummy1 = ((char **) m) [row1] + col1 * elementSize;
 	Melder_free (dummy1);
 	char **dummy2 = (char **) m + row1;
@@ -181,27 +181,27 @@ void NUMmatrix_free (long elementSize, void *m, long row1, long col1) {
 
 void * NUMmatrix_copy (long elementSize, void * m, long row1, long row2, long col1, long col2) {
 	try {
-		if (m == NULL) return NULL;
+		if (! m) return nullptr;
 		char **result = reinterpret_cast <char **> (NUMmatrix (elementSize, row1, row2, col1, col2));
-		if (result == NULL) return NULL;
+		if (! result) return nullptr;
 		long columnOffset = col1 * elementSize;
 		long dataSize = (row2 - row1 + 1) * (col2 - col1 + 1) * elementSize;
 		memcpy (result [row1] + columnOffset, ((char **) m) [row1] + columnOffset, dataSize);
 		return result;
 	} catch (MelderError) {
-		Melder_throw ("Matrix of elements not copied.");
+		Melder_throw (U"Matrix of elements not copied.");
 	}
 }
 
 void NUMmatrix_copyElements (long elementSize, void *m, void *to, long row1, long row2, long col1, long col2) {
-	Melder_assert (m != NULL && to != NULL);
+	Melder_assert (m && to);
 	long columnOffset = col1 * elementSize;
 	long dataSize = (row2 - row1 + 1) * (col2 - col1 + 1) * elementSize;
 	memcpy (((char **) to) [row1] + columnOffset, ((char **) m) [row1] + columnOffset, dataSize);
 }
 
 bool NUMmatrix_equal (long elementSize, void *m1, void *m2, long row1, long row2, long col1, long col2) {
-	Melder_assert (m1 != NULL && m2 != NULL);
+	Melder_assert (m1 && m2);
 	long columnOffset = col1 * elementSize;
 	long dataSize = (row2 - row1 + 1) * (col2 - col1 + 1) * elementSize;
 	return ! memcmp (((char **) m1) [row1] + columnOffset, ((char **) m2) [row1] + columnOffset, dataSize);
@@ -210,31 +210,27 @@ bool NUMmatrix_equal (long elementSize, void *m1, void *m2, long row1, long row2
 /*** Typed I/O routines for vectors and matrices. ***/
 
 #define FUNCTION(type,storage)  \
-	void NUMvector_writeText_##storage (const type *v, long lo, long hi, MelderFile file, const wchar_t *name) { \
-		texputintro (file, name, L" []: ", hi >= lo ? NULL : L"(empty)", 0,0,0); \
+	void NUMvector_writeText_##storage (const type *v, long lo, long hi, MelderFile file, const char32 *name) { \
+		texputintro (file, name, U" []: ", hi >= lo ? nullptr : U"(empty)", 0,0,0); \
 		for (long i = lo; i <= hi; i ++) \
-			texput##storage (file, v [i], name, L" [", Melder_integer (i), L"]", 0,0); \
+			texput##storage (file, v [i], name, U" [", Melder_integer (i), U"]", 0,0); \
 		texexdent (file); \
-		if (feof (file -> filePointer) || ferror (file -> filePointer)) Melder_throw ("Write error."); \
+		if (feof (file -> filePointer) || ferror (file -> filePointer)) Melder_throw (U"Write error."); \
 	} \
 	void NUMvector_writeBinary_##storage (const type *v, long lo, long hi, FILE *f) { \
 		for (long i = lo; i <= hi; i ++) \
 			binput##storage (v [i], f); \
-		if (feof (f) || ferror (f)) Melder_throw ("Write error."); \
-	} \
-	void NUMvector_writeCache_##storage (const type *v, long lo, long hi, CACHE *f) { \
-		for (long i = lo; i <= hi; i ++) \
-			cacput##storage (v [i], f); \
+		if (feof (f) || ferror (f)) Melder_throw (U"Write error."); \
 	} \
 	type * NUMvector_readText_##storage (long lo, long hi, MelderReadText text, const char *name) { \
-		type *result = NULL; \
+		type *result = nullptr; \
 		try { \
 			result = NUMvector <type> (lo, hi); \
 			for (long i = lo; i <= hi; i ++) { \
 				try { \
 					result [i] = texget##storage (text); \
 				} catch (MelderError) { \
-					Melder_throw ("Could not read ", name, " [", i, "]."); \
+					Melder_throw (U"Could not read ", Melder_peek8to32 (name), U" [", i, U"]."); \
 				} \
 			} \
 			return result; \
@@ -244,7 +240,7 @@ bool NUMmatrix_equal (long elementSize, void *m1, void *m2, long row1, long row2
 		} \
 	} \
 	type * NUMvector_readBinary_##storage (long lo, long hi, FILE *f) { \
-		type *result = NULL; \
+		type *result = nullptr; \
 		try { \
 			result = NUMvector <type> (lo, hi); \
 			for (long i = lo; i <= hi; i ++) { \
@@ -256,32 +252,19 @@ bool NUMmatrix_equal (long elementSize, void *m1, void *m2, long row1, long row2
 			throw; \
 		} \
 	} \
-	type * NUMvector_readCache_##storage (long lo, long hi, CACHE *f) { \
-		type *result = NULL; \
-		try { \
-			result = NUMvector <type> (lo, hi); \
-			for (long i = lo; i <= hi; i ++) { \
-				result [i] = cacget##storage (f); \
-			} \
-			return result; \
-		} catch (MelderError) { \
-			NUMvector_free (result, lo); \
-			throw; \
-		} \
-	} \
-	void NUMmatrix_writeText_##storage (type **m, long row1, long row2, long col1, long col2, MelderFile file, const wchar_t *name) { \
-		texputintro (file, name, L" [] []: ", row2 >= row1 ? NULL : L"(empty)", 0,0,0); \
+	void NUMmatrix_writeText_##storage (type **m, long row1, long row2, long col1, long col2, MelderFile file, const char32 *name) { \
+		texputintro (file, name, U" [] []: ", row2 >= row1 ? nullptr : U"(empty)", 0,0,0); \
 		if (row2 >= row1) { \
 			for (long irow = row1; irow <= row2; irow ++) { \
-				texputintro (file, name, L" [", Melder_integer (irow), L"]:", 0,0); \
+				texputintro (file, name, U" [", Melder_integer (irow), U"]:", 0,0); \
 				for (long icol = col1; icol <= col2; icol ++) { \
-					texput##storage (file, m [irow] [icol], name, L" [", Melder_integer (irow), L"] [", Melder_integer (icol), L"]"); \
+					texput##storage (file, m [irow] [icol], name, U" [", Melder_integer (irow), U"] [", Melder_integer (icol), U"]"); \
 				} \
 				texexdent (file); \
 			} \
 		} \
 		texexdent (file); \
-		if (feof (file -> filePointer) || ferror (file -> filePointer)) Melder_throw ("Write error."); \
+		if (feof (file -> filePointer) || ferror (file -> filePointer)) Melder_throw (U"Write error."); \
 	} \
 	void NUMmatrix_writeBinary_##storage (type **m, long row1, long row2, long col1, long col2, FILE *f) { \
 		if (row2 >= row1) { \
@@ -290,25 +273,17 @@ bool NUMmatrix_equal (long elementSize, void *m1, void *m2, long row1, long row2
 					binput##storage (m [irow] [icol], f); \
 			} \
 		} \
-		if (feof (f) || ferror (f)) Melder_throw ("Write error."); \
-	} \
-	void NUMmatrix_writeCache_##storage (type **m, long row1, long row2, long col1, long col2, CACHE *f) { \
-		if (row2 >= row1) { \
-			for (long irow = row1; irow <= row2; irow ++) { \
-				for (long icol = col1; icol <= col2; icol ++) \
-					cacput##storage (m [irow] [icol], f); \
-			} \
-		} \
+		if (feof (f) || ferror (f)) Melder_throw (U"Write error."); \
 	} \
 	type ** NUMmatrix_readText_##storage (long row1, long row2, long col1, long col2, MelderReadText text, const char *name) { \
-		type **result = NULL; \
+		type **result = nullptr; \
 		try { \
 			result = NUMmatrix <type> (row1, row2, col1, col2); \
 			for (long irow = row1; irow <= row2; irow ++) for (long icol = col1; icol <= col2; icol ++) { \
 				try { \
 					result [irow] [icol] = texget##storage (text); \
 				} catch (MelderError) { \
-					Melder_throw ("Could not read ", name, " [", irow, "] [", icol, "]."); \
+					Melder_throw (U"Could not read ", Melder_peek8to32 (name), U" [", irow, U"] [", icol, U"]."); \
 				} \
 			} \
 			return result; \
@@ -318,7 +293,7 @@ bool NUMmatrix_equal (long elementSize, void *m1, void *m2, long row1, long row2
 		} \
 	} \
 	type ** NUMmatrix_readBinary_##storage (long row1, long row2, long col1, long col2, FILE *f) { \
-		type **result = NULL; \
+		type **result = nullptr; \
 		try { \
 			result = NUMmatrix <type> (row1, row2, col1, col2); \
 			for (long irow = row1; irow <= row2; irow ++) for (long icol = col1; icol <= col2; icol ++) \
@@ -328,18 +303,6 @@ bool NUMmatrix_equal (long elementSize, void *m1, void *m2, long row1, long row2
 			NUMmatrix_free (result, row1, col1); \
 			throw; \
 		} \
-	} \
-	type ** NUMmatrix_readCache_##storage (long row1, long row2, long col1, long col2, CACHE *f) { \
-		type **result = NULL; \
-		try { \
-			result = NUMmatrix <type> (row1, row2, col1, col2); \
-			for (long irow = row1; irow <= row2; irow ++) for (long icol = col1; icol <= col2; icol ++) \
-				result [irow] [icol] = cacget##storage (f); \
-			return result; \
-		} catch (MelderError) { \
-			NUMmatrix_free (result, row1, col1); \
-			throw; \
-		} \
 	}
 
 FUNCTION (signed char, i1)
diff --git a/num/NUMlinprog.cpp b/num/NUMlinprog.cpp
index 5b2a0f3..d3cc2dc 100644
--- a/num/NUMlinprog.cpp
+++ b/num/NUMlinprog.cpp
@@ -1,6 +1,6 @@
 /* NUMlinprog.cpp
  *
- * Copyright (C) 2008-2011,2012 Paul Boersma
+ * Copyright (C) 2008-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -86,7 +86,7 @@ void NUMlinprog_addConstraint (NUMlinprog me, double lowerBound, double upperBou
 			lowerBound == upperBound ? GLP_FX : GLP_DB, lowerBound, upperBound);
 		my ivar = 0;
 	} catch (MelderError) {
-		Melder_throw ("Linear programming: constraint not added.");
+		Melder_throw (U"Linear programming: constraint not added.");
 	}
 }
 
@@ -106,32 +106,32 @@ void NUMlinprog_run (NUMlinprog me) {
 		parm. msg_lev = GLP_MSG_OFF;
 		my status = glp_simplex (my linearProgram, & parm);
 		switch (my status) {
-			case GLP_EBADB: Melder_throw ("Unable to start the search, because the initial basis is invalid.");
-			case GLP_ESING: Melder_throw (L"Unable to start the search, because the basis matrix is singular.");
-			case GLP_ECOND: Melder_throw (L"Unable to start the search, because the basis matrix is ill-conditioned.");
-			case GLP_EBOUND: Melder_throw (L"Unable to start the search, because some variables have incorrect bounds.");
-			case GLP_EFAIL: Melder_throw (L"Search prematurely terminated due to solver failure.");
-			case GLP_EOBJLL: Melder_throw (L"Search prematurely terminated: lower limit reached.");
-			case GLP_EOBJUL: Melder_throw (L"Search prematurely terminated: upper limit reached.");
-			case GLP_EITLIM: Melder_throw (L"Search prematurely terminated: iteration limit exceeded.");
-			case GLP_ETMLIM: Melder_throw (L"Search prematurely terminated: time limit exceeded.");
-			case GLP_ENOPFS: Melder_throw (L"The problem has no primal feasible solution.");
-			case GLP_ENODFS: Melder_throw (L"The problem has no dual feasible solution.");
+			case GLP_EBADB: Melder_throw (U"Unable to start the search, because the initial basis is invalid.");
+			case GLP_ESING: Melder_throw (U"Unable to start the search, because the basis matrix is singular.");
+			case GLP_ECOND: Melder_throw (U"Unable to start the search, because the basis matrix is ill-conditioned.");
+			case GLP_EBOUND: Melder_throw (U"Unable to start the search, because some variables have incorrect bounds.");
+			case GLP_EFAIL: Melder_throw (U"Search prematurely terminated due to solver failure.");
+			case GLP_EOBJLL: Melder_throw (U"Search prematurely terminated: lower limit reached.");
+			case GLP_EOBJUL: Melder_throw (U"Search prematurely terminated: upper limit reached.");
+			case GLP_EITLIM: Melder_throw (U"Search prematurely terminated: iteration limit exceeded.");
+			case GLP_ETMLIM: Melder_throw (U"Search prematurely terminated: time limit exceeded.");
+			case GLP_ENOPFS: Melder_throw (U"The problem has no primal feasible solution.");
+			case GLP_ENODFS: Melder_throw (U"The problem has no dual feasible solution.");
 			default: break;
 		}
 		my status = glp_get_status (my linearProgram);
 		switch (my status) {
-			case GLP_INFEAS: Melder_throw (L"Solution is infeasible.");
-			case GLP_NOFEAS: Melder_throw (L"Problem has no feasible solution.");
-			case GLP_UNBND: Melder_throw (L"Problem has unbounded solution.");
-			case GLP_UNDEF: Melder_throw (L"Solution is undefined.");
+			case GLP_INFEAS: Melder_throw (U"Solution is infeasible.");
+			case GLP_NOFEAS: Melder_throw (U"Problem has no feasible solution.");
+			case GLP_UNBND: Melder_throw (U"Problem has unbounded solution.");
+			case GLP_UNDEF: Melder_throw (U"Solution is undefined.");
 			default: break;
 		}
 		if (my status == GLP_FEAS) {
-			Melder_warning (L"Linear programming solution is feasible but not optimal.");
+			Melder_warning (U"Linear programming solution is feasible but not optimal.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Linear programming: not run.");
+		Melder_throw (U"Linear programming: not run.");
 	}
 }
 
diff --git a/num/NUMrandom.cpp b/num/NUMrandom.cpp
index 806e243..aff7aed 100644
--- a/num/NUMrandom.cpp
+++ b/num/NUMrandom.cpp
@@ -1,6 +1,6 @@
 /* NUMrandom.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,12 +17,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-/*
- * pb 2002/03/04 GPL
- * pb 2006/12/18 improved comment
- * pb 2011/03/29 C++
- */
-
 /* 
    A C-program for MT19937-64 (2014/2/23 version).
    Coded by Takuji Nishimura and Makoto Matsumoto.
@@ -107,7 +101,7 @@ class NUMrandom_State { public:
 		// when NUMrandomFraction() is called without NUMrandom_init() having been called before;
 		// without this initialization, it would be detected only after 312 calls to NUMrandomFraction()
 
-	int secondAvailable;
+	bool secondAvailable;
 	double y;
 
 	/**
@@ -160,7 +154,10 @@ void NUMrandom_init () {
 	for (int threadNumber = 0; threadNumber <= 16; threadNumber ++) {
 		const int numberOfKeys = 6;
 		uint64_t keys [numberOfKeys];
-		keys [0] = round (1e6 * Melder_clock ());   // unique between boots of the same computer
+		#if defined (macintosh) && useCarbon==1
+			#define llround lround
+		#endif
+		keys [0] = (uint64_t) llround (1e6 * Melder_clock ());   // unique between boots of the same computer
 		keys [1] = UINT64_C (7320321686725470078) + (uint64_t) threadNumber;   // unique between threads in the same process
 		switch (threadNumber) {
 			case  0: keys [2] = UINT64_C  (4492812493098689432), keys [3] = UINT64_C  (8902321878452586268); break;
@@ -180,11 +177,11 @@ void NUMrandom_init () {
 			case 14: keys [2] = UINT64_C  (1238716515545475765), keys [3] = UINT64_C  (8435674023875847388); break;
 			case 15: keys [2] = UINT64_C  (6127715675014756456), keys [3] = UINT64_C  (2435788450287508457); break;
 			case 16: keys [2] = UINT64_C  (1081237546238975884), keys [3] = UINT64_C  (2939783238574293882); break;
-			default: Melder_fatal ("Thread number too high.");
+			default: Melder_fatal (U"Thread number too high.");
 		}
-		keys [4] = getpid ();   // unique between processes that run simultaneously on the same computer
+		keys [4] = (uint64_t) (int64) getpid ();   // unique between processes that run simultaneously on the same computer
 		#ifndef _WIN32
-		keys [5] = gethostid ();   // unique between computers
+		keys [5] = (uint64_t) (int64) gethostid ();   // unique between computers
 		#endif
 		states [threadNumber]. init_by_array64 (keys, numberOfKeys);
 	}
@@ -200,7 +197,7 @@ void NUMrandom_init () {
 #elif ZERO_OR_MAGIC_VERSION == 2
 	#define ZERO_OR_MAGIC  ( (x & UINT64_C (1)) * MATRIX_A )
 #else   // M&N 2014
-	const uint64_t mag01 [2] = { UINT64_C (0), MATRIX_A };
+	constexpr uint64_t mag01 [2] { UINT64_C (0), MATRIX_A };
 	#define ZERO_OR_MAGIC  mag01 [(int) (x & UINT64_C (1))]
 #endif
 
@@ -285,11 +282,11 @@ double NUMrandomGauss (double mean, double standardDeviation) {
 	/*
 		Knuth, p. 122.
 	*/
-	double s, x;
 	if (my secondAvailable) {
-		my secondAvailable = FALSE;
+		my secondAvailable = false;
 		return mean + standardDeviation * my y;
 	} else {
+		double s, x;
 		repeat {
 			x = 2.0 * NUMrandomFraction () - 1.0;   /* Inside the square [-1; 1] x [-1; 1]. */
 			my y = 2.0 * NUMrandomFraction () - 1.0;
@@ -301,7 +298,7 @@ double NUMrandomGauss (double mean, double standardDeviation) {
 			double factor = sqrt (-2.0 * log (s) / s);
 			x *= factor, my y *= factor;
 		}
-		my secondAvailable = TRUE;
+		my secondAvailable = true;
 		return mean + standardDeviation * x;
 	}
 }
@@ -311,11 +308,11 @@ double NUMrandomGauss_mt (int threadNumber, double mean, double standardDeviatio
 	/*
 		Knuth, p. 122.
 	*/
-	double s, x;
 	if (my secondAvailable) {
-		my secondAvailable = FALSE;
+		my secondAvailable = false;
 		return mean + standardDeviation * my y;
 	} else {
+		double s, x;
 		repeat {
 			x = 2.0 * NUMrandomFraction_mt (threadNumber) - 1.0;   /* Inside the square [-1; 1] x [-1; 1]. */
 			my y = 2.0 * NUMrandomFraction_mt (threadNumber) - 1.0;
@@ -327,7 +324,7 @@ double NUMrandomGauss_mt (int threadNumber, double mean, double standardDeviatio
 			double factor = sqrt (-2.0 * log (s) / s);
 			x *= factor, my y *= factor;
 		}
-		my secondAvailable = TRUE;
+		my secondAvailable = true;
 		return mean + standardDeviation * x;
 	}
 }
@@ -398,4 +395,26 @@ double NUMrandomPoisson (double mean) {
 	}
 }
 
+uint32 NUMhashString (const char32 *string) {
+	/*
+	 * Jenkins' one-at-a-time hash.
+	 */
+	uint32 hash = 0;
+	for (char32 kar = *string; kar != U'\0'; kar = * (++ string)) {
+		hash += (kar >> 16) & 0xFF;   // highest five bits (a char32 actually has only 21 significant bits)
+		hash += (hash << 10);
+		hash ^= (hash >> 6);
+		hash += (kar >> 8) & 0xFF;   // middle 8 bits
+		hash += (hash << 10);
+		hash ^= (hash >> 6);
+		hash += kar & 0xFF;   // lowest 8 bits
+		hash += (hash << 10);
+		hash ^= (hash >> 6);
+	}
+	hash += (hash << 3);
+	hash ^= (hash >> 11);
+	hash += (hash << 15);
+	return hash;
+}
+
 /* End of file NUMrandom.cpp */
diff --git a/num/NUMsort.cpp b/num/NUMsort.cpp
index 4b34918..d639931 100644
--- a/num/NUMsort.cpp
+++ b/num/NUMsort.cpp
@@ -1,6 +1,6 @@
 /* NUMsort.c
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -98,9 +98,9 @@ void NUMsort_i (long n, int a [])
 void NUMsort_l (long n, long a [])
 	MACRO_NUMsort (long)
 
-void NUMsort_str (long n, wchar_t *a []) {
+void NUMsort_str (long n, char32 *a []) {
 	long l, r, j, i;
-	wchar_t *k;
+	char32 *k;
 	if (n < 2) return;
 	l = (n >> 1) + 1;
 	r = n;
@@ -119,8 +119,8 @@ void NUMsort_str (long n, wchar_t *a []) {
 			i = j;
 			j = j << 1;
 			if (j > r) break;
-			if (j < r && wcscmp (a [j], a [j + 1]) < 0) j ++;
-			if (wcscmp (k, a [j]) >= 0) break;
+			if (j < r && str32cmp (a [j], a [j + 1]) < 0) j ++;
+			if (str32cmp (k, a [j]) >= 0) break;
 			a [i] = a [j];
 		}
 		a [i] = k;
@@ -158,7 +158,7 @@ void NUMsort_p (long n, void *a [], int (*compare) (const void *, const void *))
 
 double NUMquantile (long n, double a [], double factor) {
 	double place = factor * n + 0.5;
-	long left = floor (place);
+	long left = (long) floor (place);
 	if (n < 1) return 0.0;
 	if (n == 1) return a [1];
 	if (left < 1) left = 1;
diff --git a/stat/Distributions.cpp b/stat/Distributions.cpp
index 595e79d..dee29d4 100644
--- a/stat/Distributions.cpp
+++ b/stat/Distributions.cpp
@@ -1,6 +1,6 @@
 /* Distributions.cpp
  *
- * Copyright (C) 1997-2012,2014 Paul Boersma
+ * Copyright (C) 1997-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,9 +22,9 @@
 Thing_implement (Distributions, TableOfReal, 0);
 
 void structDistributions :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of distributions: ", Melder_integer (numberOfColumns));
-	MelderInfo_writeLine (L"Number of values: ", Melder_integer (numberOfRows));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of distributions: ", numberOfColumns);
+	MelderInfo_writeLine (U"Number of values: ", numberOfRows);
 }
 
 Distributions Distributions_create (long numberOfRows, long numberOfColumns) {
@@ -33,27 +33,27 @@ Distributions Distributions_create (long numberOfRows, long numberOfColumns) {
 		TableOfReal_init (me.peek(), numberOfRows, numberOfColumns);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Distributions not created.");
+		Melder_throw (U"Distributions not created.");
 	}
 }
 
 void Distributions_checkSpecifiedColumnNumberWithinRange (Distributions me, long columnNumber) {
 	if (columnNumber < 1)
-		Melder_throw (me, ": the specified column number is ", columnNumber, ", but should be at least 1.");
+		Melder_throw (me, U": the specified column number is ", columnNumber, U", but should be at least 1.");
 	if (columnNumber > my numberOfColumns)
-		Melder_throw (me, ": the specified column number is ", columnNumber, ", but should be at most my number of columns (", my numberOfColumns, ").");
+		Melder_throw (me, U": the specified column number is ", columnNumber, U", but should be at most my number of columns (", my numberOfColumns, U").");
 }
 
-void Distributions_peek (Distributions me, long column, wchar_t **string, long *number) {
+void Distributions_peek (Distributions me, long column, char32 **string, long *number) {
 	Distributions_checkSpecifiedColumnNumberWithinRange (me, column);
 	if (my numberOfRows < 1)
-		Melder_throw (me, ": I have no candidates.");
+		Melder_throw (me, U": I have no candidates.");
 	double total = 0.0;
 	for (long irow = 1; irow <= my numberOfRows; irow ++) {
 		total += my data [irow] [column];
 	}
 	if (total <= 0.0)
-		Melder_throw (me, ": the total weight of column ", column, " is not positive.");
+		Melder_throw (me, U": the total weight of column ", column, U" is not positive.");
 	long irow;
 	do {
 		double rand = NUMrandomUniform (0, total), sum = 0.0;
@@ -61,22 +61,22 @@ void Distributions_peek (Distributions me, long column, wchar_t **string, long *
 			sum += my data [irow] [column];
 			if (rand <= sum) break;
 		}
-	} while (irow > my numberOfRows);   /* Guard against rounding errors. */
-	if (my rowLabels [irow] == NULL)
-		Melder_throw (me, ": no string in row ", irow, ".");
+	} while (irow > my numberOfRows);   // guard against rounding errors
+	if (! my rowLabels [irow])
+		Melder_throw (me, U": no string in row ", irow, U".");
 	if (string)
 		*string = my rowLabels [irow];
 	if (number)
 		*number = irow;
 }
 
-double Distributions_getProbability (Distributions me, const wchar_t *string, long column) {
+double Distributions_getProbability (Distributions me, const char32 *string, long column) {
 	long row, rowOfString = 0;
 	double total = 0.0;
 	if (column < 1 || column > my numberOfColumns) return NUMundefined;
 	for (row = 1; row <= my numberOfRows; row ++) {
 		total += my data [row] [column];
-		if (my rowLabels [row] && wcsequ (my rowLabels [row], string))
+		if (my rowLabels [row] && str32equ (my rowLabels [row], string))
 			rowOfString = row;
 	}
 	if (total <= 0.0) return NUMundefined;
@@ -98,8 +98,8 @@ static void unicize (Distributions me) {
 	/* Must have been sorted beforehand. */
 	long nrow = 0, ifrom = 1;
 	for (long irow = 1; irow <= my numberOfRows; irow ++) {
-		if (irow == my numberOfRows || (my rowLabels [irow] == NULL) != (my rowLabels [irow + 1] == NULL) ||
-		    (my rowLabels [irow] != NULL && ! wcsequ (my rowLabels [irow], my rowLabels [irow + 1])))
+		if (irow == my numberOfRows || (my rowLabels [irow] == nullptr) != (my rowLabels [irow + 1] == nullptr) ||
+		    (my rowLabels [irow] != nullptr && ! str32equ (my rowLabels [irow], my rowLabels [irow + 1])))
 		{
 			/*
 			 * Detected a change.
@@ -111,8 +111,8 @@ static void unicize (Distributions me) {
 			 */
 			if (ifrom != nrow) {
 				Melder_free (my rowLabels [nrow]);
-				my rowLabels [nrow] = my rowLabels [ifrom];   /* Surface copy. */
-				my rowLabels [ifrom] = NULL;   /* Undangle. */
+				my rowLabels [nrow] = my rowLabels [ifrom];   // surface copy
+				my rowLabels [ifrom] = nullptr;   // undangle
 				for (long icol = 1; icol <= my numberOfColumns; icol ++)
 					my data [nrow] [icol] = my data [ifrom] [icol];
 			}
@@ -137,7 +137,7 @@ Distributions Distributions_addTwo (Distributions me, Distributions thee) {
 		unicize (him.peek());
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " & ", thee, ": not added.");
+		Melder_throw (me, U" & ", thee, U": not added.");
 	}
 }
 
@@ -148,7 +148,7 @@ Distributions Distributions_addMany (Collection me) {
 		unicize (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Distributions objects not added.");
+		Melder_throw (U"Distributions objects not added.");
 	}
 }
 
diff --git a/stat/Distributions.h b/stat/Distributions.h
index d21dfbd..02e3047 100644
--- a/stat/Distributions.h
+++ b/stat/Distributions.h
@@ -2,7 +2,7 @@
 #define _Distributions_h_
 /* Distributions.h
  *
- * Copyright (C) 1997-2011,2014 Paul Boersma
+ * Copyright (C) 1997-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,16 +23,15 @@
 #include "TableOfReal.h"
 
 Thing_define (Distributions, TableOfReal) {
-	// overridden methods:
-	protected:
-		virtual void v_info ();
+	void v_info ()
+		override;
 };
 
 Distributions Distributions_create (long numberOfRows, long numberOfColumns);
 
-void Distributions_peek (Distributions me, long column, wchar_t **string, long *row);
+void Distributions_peek (Distributions me, long column, char32 **string, long *row);
 
-double Distributions_getProbability (Distributions me, const wchar_t *string, long column);
+double Distributions_getProbability (Distributions me, const char32 *string, long column);
 double Distributionses_getMeanAbsoluteDifference (Distributions me, Distributions thee, long column);
 
 Distributions Distributions_addTwo (Distributions me, Distributions thee);
diff --git a/stat/Distributions_and_Strings.cpp b/stat/Distributions_and_Strings.cpp
index 11f1445..052d07d 100644
--- a/stat/Distributions_and_Strings.cpp
+++ b/stat/Distributions_and_Strings.cpp
@@ -1,6 +1,6 @@
 /* Distributions_and_Strings.cpp
  *
- * Copyright (C) 1997-2011,2014 Paul Boersma
+ * Copyright (C) 1997-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
 /*
  * pb 2002/07/16 GPL
  * pb 2003/07/28 factored out Distributions_peek
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2011/03/20 C++
  */
 
@@ -30,15 +30,15 @@ Strings Distributions_to_Strings (Distributions me, long column, long numberOfSt
 	try {
 		autoStrings thee = Thing_new (Strings);
 		thy numberOfStrings = numberOfStrings;
-		thy strings = NUMvector <wchar_t*> (1, numberOfStrings);
+		thy strings = NUMvector <char32*> (1, numberOfStrings);
 		for (long istring = 1; istring <= numberOfStrings; istring ++) {
-			wchar_t *string;
-			Distributions_peek (me, column, & string, NULL);
-			thy strings [istring] = Melder_wcsdup (string);
+			char32 *string;
+			Distributions_peek (me, column, & string, nullptr);
+			thy strings [istring] = Melder_dup (string);
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": Strings not generated.");
+		Melder_throw (me, U": Strings not generated.");
 	}
 }
 
@@ -47,35 +47,35 @@ Strings Distributions_to_Strings_exact (Distributions me, long column) {
 		long total = 0;
 		long istring = 0;
 		if (column > my numberOfColumns)
-			Melder_throw ("No column ", column, ".");
+			Melder_throw (U"No column ", column, U".");
 		if (my numberOfRows < 1)
-			Melder_throw ("No candidates.");
+			Melder_throw (U"No candidates.");
 		for (long irow = 1; irow <= my numberOfRows; irow ++) {
 			double value = my data [irow] [column];
 			if (value != floor (value))
-				Melder_throw ("Non-integer value ", value, " in row ", irow, ".");
+				Melder_throw (U"Non-integer value ", value, U" in row ", irow, U".");
 			if (value < 0.0)
-				Melder_throw ("Found a negative value ", value, " in row ", irow, ".");
+				Melder_throw (U"Found a negative value ", value, U" in row ", irow, U".");
 			total += value;
 		}
 		if (total <= 0)
-			Melder_throw ("Column total not positive.");
+			Melder_throw (U"Column total not positive.");
 		autoStrings thee = Thing_new (Strings);
 		thy numberOfStrings = total;
-		thy strings = NUMvector <wchar_t*> (1, total);
+		thy strings = NUMvector <char32*> (1, total);
 		for (long irow = 1; irow <= my numberOfRows; irow ++) {
 			long number = my data [irow] [column];
-			wchar_t *string = my rowLabels [irow];
+			char32 *string = my rowLabels [irow];
 			if (! string)
-				Melder_throw ("No string in row ", irow, ".");
+				Melder_throw (U"No string in row ", irow, U".");
 			for (long i = 1; i <= number; i ++) {
-				thy strings [++ istring] = Melder_wcsdup (string);
+				thy strings [++ istring] = Melder_dup (string);
 			}
 		}
 		Strings_randomize (thee.peek());
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": Strings not generated.");
+		Melder_throw (me, U": Strings not generated.");
 	}
 }
 
@@ -84,16 +84,16 @@ Distributions Strings_to_Distributions (Strings me) {
 		autoDistributions thee = Distributions_create (my numberOfStrings, 1);
 		long idist = 0;
 		for (long i = 1; i <= my numberOfStrings; i ++) {
-			wchar_t *string = my strings [i];
+			char32 *string = my strings [i];
 			long where = 0;
 			long j = 1;
 			for (; j <= idist; j ++)
-				if (wcsequ (thy rowLabels [j], string))
+				if (str32equ (thy rowLabels [j], string))
 					{ where = j; break; }
 			if (where) {
 				thy data [j] [1] += 1.0;
 			} else {
-				thy rowLabels [++ idist] = Melder_wcsdup (string);
+				thy rowLabels [++ idist] = Melder_dup (string);
 				thy data [idist] [1] = 1.0;
 			}
 		}
@@ -101,7 +101,7 @@ Distributions Strings_to_Distributions (Strings me) {
 		TableOfReal_sortByLabel (thee.peek(), 1, 0);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": distribution not computed.");
+		Melder_throw (me, U": distribution not computed.");
 	}
 }
 
diff --git a/stat/LogisticRegression.cpp b/stat/LogisticRegression.cpp
index e253b6e..e3fedc3 100644
--- a/stat/LogisticRegression.cpp
+++ b/stat/LogisticRegression.cpp
@@ -1,6 +1,6 @@
 /* LogisticRegression.cpp
  *
- * Copyright (C) 2005-2012 Paul Boersma
+ * Copyright (C) 2005-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
 /*
  * pb 2005/05/01 created
  * pb 2006/12/10 MelderInfo
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2007/10/01 can write as encoding
  * pb 2007/11/18 split off from Regression.c
  * pb 2011/03/20 C++
@@ -52,45 +52,45 @@ Thing_implement (LogisticRegression, Regression, 0);
 
 void structLogisticRegression :: v_info () {
 	LogisticRegression_Parent :: v_info ();
-	MelderInfo_writeLine (L"Dependent 1: ", dependent1);
-	MelderInfo_writeLine (L"Dependent 2: ", dependent2);
-	MelderInfo_writeLine (L"Interpretation:");
-	MelderInfo_write (L"   ln (P(", dependent2, L")/P(", dependent1, L")) " UNITEXT_ALMOST_EQUAL_TO L" ", Melder_fixed (intercept, 6));
+	MelderInfo_writeLine (U"Dependent 1: ", our dependent1);
+	MelderInfo_writeLine (U"Dependent 2: ", our dependent2);
+	MelderInfo_writeLine (U"Interpretation:");
+	MelderInfo_write (U"   ln (P(", dependent2, U")/P(", dependent1, U")) " UNITEXT_ALMOST_EQUAL_TO U" ", Melder_fixed (intercept, 6));
 	for (long ivar = 1; ivar <= parameters -> size; ivar ++) {
 		RegressionParameter parm = static_cast<RegressionParameter> (parameters -> item [ivar]);
-		MelderInfo_write (parm -> value < 0.0 ? L" - " : L" + ", Melder_fixed (fabs (parm -> value), 6), L" * ", parm -> label);
+		MelderInfo_write (parm -> value < 0.0 ? U" - " : U" + ", Melder_fixed (fabs (parm -> value), 6), U" * ", parm -> label);
 	}
-	MelderInfo_writeLine (NULL);
-	MelderInfo_writeLine (L"Log odds ratios:");
+	MelderInfo_writeLine (U"");
+	MelderInfo_writeLine (U"Log odds ratios:");
 	for (long ivar = 1; ivar <= parameters -> size; ivar ++) {
 		RegressionParameter parm = static_cast<RegressionParameter> (parameters -> item [ivar]);
-		MelderInfo_writeLine (L"   Log odds ratio of factor ", parm -> label, L": ", Melder_fixed ((parm -> maximum - parm -> minimum) * parm -> value, 6));
+		MelderInfo_writeLine (U"   Log odds ratio of factor ", parm -> label, U": ", Melder_fixed ((parm -> maximum - parm -> minimum) * parm -> value, 6));
 	}
-	MelderInfo_writeLine (L"Odds ratios:");
+	MelderInfo_writeLine (U"Odds ratios:");
 	for (long ivar = 1; ivar <= parameters -> size; ivar ++) {
 		RegressionParameter parm = static_cast<RegressionParameter> (parameters -> item [ivar]);
-		MelderInfo_writeLine (L"   Odds ratio of factor ", parm -> label, L": ", Melder_double (exp ((parm -> maximum - parm -> minimum) * parm -> value)));
+		MelderInfo_writeLine (U"   Odds ratio of factor ", parm -> label, U": ", exp ((parm -> maximum - parm -> minimum) * parm -> value));
 	}
 }
 
-LogisticRegression LogisticRegression_create (const wchar_t *dependent1, const wchar_t *dependent2) {
+LogisticRegression LogisticRegression_create (const char32 *dependent1, const char32 *dependent2) {
 	try {
 		autoLogisticRegression me = Thing_new (LogisticRegression);
 		Regression_init (me.peek());
-		my dependent1 = Melder_wcsdup (dependent1);
-		my dependent2 = Melder_wcsdup (dependent2);	
+		my dependent1 = Melder_dup (dependent1);
+		my dependent2 = Melder_dup (dependent2);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("LogisticRegression not created.");
+		Melder_throw (U"LogisticRegression not created.");
 	}
 }
 
 static LogisticRegression _Table_to_LogisticRegression (Table me, long *factors, long numberOfFactors, long dependent1, long dependent2) {
 	long numberOfParameters = numberOfFactors + 1;
 	long numberOfCells = my rows -> size, numberOfY0 = 0, numberOfY1 = 0, numberOfData = 0;
-	double logLikelihood = 1e300, previousLogLikelihood = 2e300;
+	double logLikelihood = 1e308, previousLogLikelihood = 2e308;
 	if (numberOfParameters < 1)   // includes intercept
-		Melder_throw ("Not enough columns (has to be more than 1).");
+		Melder_throw (U"Not enough columns (has to be more than 1).");
 	/*
 	 * Divide up the contents of the table into a number of independent variables (x) and two dependent variables (y0 and y1).
 	 */
@@ -112,18 +112,18 @@ static LogisticRegression _Table_to_LogisticRegression (Table me, long *factors,
 		numberOfY0 += y0 [icell];
 		numberOfY1 += y1 [icell];
 		numberOfData += y0 [icell] + y1 [icell];
-		x [icell] [0] = 1.0;   /* Intercept. */
+		x [icell] [0] = 1.0;   // intercept
 		for (long ivar = 1; ivar <= numberOfFactors; ivar ++) {
 			x [icell] [ivar] = Table_getNumericValue_Assert (me, icell, factors [ivar]);
 			meanX [ivar] += x [icell] [ivar] * (y0 [icell] + y1 [icell]);
 		}
 	}
 	if (numberOfY0 == 0 && numberOfY1 == 0)
-		Melder_throw ("No data in either class. Cannot determine result.");
+		Melder_throw (U"No data in either class. Cannot determine result.");
 	if (numberOfY0 == 0)
-		Melder_throw ("No data in class ", my columnHeaders [dependent1]. label, ". Cannot determine result.");
+		Melder_throw (U"No data in class ", my columnHeaders [dependent1]. label, U". Cannot determine result.");
 	if (numberOfY1 == 0)
-		Melder_throw ("No data in class ", my columnHeaders [dependent2]. label, ". Cannot determine result.");
+		Melder_throw (U"No data in class ", my columnHeaders [dependent2]. label, U". Cannot determine result.");
 	/*
 	 * Normalize the data.
 	 */
@@ -262,7 +262,7 @@ static LogisticRegression _Table_to_LogisticRegression (Table me, long *factors,
 		}
 	}
 	if (iteration > 100) {
-		Melder_warning (L"Logistic regression has not converged in 100 iterations. The results are unreliable.");
+		Melder_warning (U"Logistic regression has not converged in 100 iterations. The results are unreliable.");
 	}
 	for (long ivar = 1; ivar <= numberOfFactors; ivar ++) {
 		RegressionParameter parm = static_cast<RegressionParameter> (thy parameters -> item [ivar]);
@@ -272,8 +272,8 @@ static LogisticRegression _Table_to_LogisticRegression (Table me, long *factors,
 	return thee.transfer();
 }
 
-LogisticRegression Table_to_LogisticRegression (Table me, const wchar_t *factors_columnLabelString,
-	const wchar_t *dependent1_columnLabel, const wchar_t *dependent2_columnLabel)
+LogisticRegression Table_to_LogisticRegression (Table me, const char32 *factors_columnLabelString,
+	const char32 *dependent1_columnLabel, const char32 *dependent2_columnLabel)
 {
 	try {
 		long numberOfFactors;
@@ -283,7 +283,7 @@ LogisticRegression Table_to_LogisticRegression (Table me, const wchar_t *factors
 		autoLogisticRegression thee = _Table_to_LogisticRegression (me, factors_columnIndices.peek(), numberOfFactors, dependent1_columnIndex, dependent2_columnIndex);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": logistic regression not performed.");
+		Melder_throw (me, U": logistic regression not performed.");
 	}
 }
 
@@ -323,8 +323,8 @@ void LogisticRegression_drawBoundary (LogisticRegression me, Graphics graphics,
 	double yright = (intercept + parmx -> value * xright) / - parmy -> value;
 	double xmin = NUMmin2 (xleft, xright), xmax = NUMmax2 (xleft, xright);
 	double ymin = NUMmin2 (ybottom, ytop), ymax = NUMmax2 (ybottom, ytop);
-	//Melder_casual ("LogisticRegression_drawBoundary: %f %f %f %f %f %f %f %f",
-	//	xmin, xmax, xbottom, xtop, ymin, ymax, yleft, yright);
+	trace (U"LogisticRegression_drawBoundary: ",
+		xmin, U" ", xmax, U" ", xbottom, U" ", xtop, U" ", ymin, U" ", ymax, U" ", yleft, U" ", yright);
 	if (xbottom >= xmin && xbottom <= xmax) {   // line goes through bottom?
 		if (xtop >= xmin && xtop <= xmax)   // line goes through top?
 			Graphics_line (graphics, xbottom, ybottom, xtop, ytop);   // draw from bottom to top
diff --git a/stat/LogisticRegression.h b/stat/LogisticRegression.h
index 89c8345..24c4fef 100644
--- a/stat/LogisticRegression.h
+++ b/stat/LogisticRegression.h
@@ -2,7 +2,7 @@
 #define _LogisticRegression_h_
 /* LogisticRegression.h
  *
- * Copyright (C) 2005-2011 Paul Boersma
+ * Copyright (C) 2005-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,10 +24,10 @@
 #include "LogisticRegression_def.h"
 oo_CLASS_CREATE (LogisticRegression, Regression);
 
-LogisticRegression LogisticRegression_create (const wchar_t *dependent1, const wchar_t *dependent2);
+LogisticRegression LogisticRegression_create (const char32 *dependent1, const char32 *dependent2);
 
-LogisticRegression Table_to_LogisticRegression (Table me, const wchar_t *columnsWithFactors_string,
-	const wchar_t *columnWithDependent1_string, const wchar_t *columnWithDependent2_string);
+LogisticRegression Table_to_LogisticRegression (Table me, const char32 *columnsWithFactors_string,
+	const char32 *columnWithDependent1_string, const char32 *columnWithDependent2_string);
 
 void LogisticRegression_drawBoundary (LogisticRegression me, Graphics graphics, long colx, double xmin, double xmax,
 	long coly, double ymin, double ymax, bool garnish);
diff --git a/stat/LogisticRegression_def.h b/stat/LogisticRegression_def.h
index d981dc1..5eb38dd 100644
--- a/stat/LogisticRegression_def.h
+++ b/stat/LogisticRegression_def.h
@@ -1,6 +1,6 @@
 /* LogisticRegression_def.h
  *
- * Copyright (C) 2005-2011 Paul Boersma
+ * Copyright (C) 2005-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,8 +25,8 @@ oo_DEFINE_CLASS (LogisticRegression, Regression)
 	oo_STRING (dependent2)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (LogisticRegression)
diff --git a/stat/PairDistribution.cpp b/stat/PairDistribution.cpp
index 44cd67b..68ad887 100644
--- a/stat/PairDistribution.cpp
+++ b/stat/PairDistribution.cpp
@@ -1,6 +1,6 @@
 /* PairDistribution.cpp
  *
- * Copyright (C) 1997-2012,2013 Paul Boersma
+ * Copyright (C) 1997-2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,19 +38,19 @@
 #include "oo_DESCRIPTION.h"
 #include "PairDistribution_def.h"
 
-Thing_implement (PairProbability, Data, 0);
+Thing_implement (PairProbability, Daata, 0);
 
-Thing_implement (PairDistribution, Data, 0);
+Thing_implement (PairDistribution, Daata, 0);
 
 void structPairDistribution :: v_info () {
 	PairDistribution_Parent :: v_info ();
-	MelderInfo_writeLine (L"Number of pairs: ", Melder_integer (pairs -> size));
+	MelderInfo_writeLine (U"Number of pairs: ", pairs -> size);
 }
 
-PairProbability PairProbability_create (const wchar_t *string1, const wchar_t *string2, double weight) {
+PairProbability PairProbability_create (const char32 *string1, const char32 *string2, double weight) {
 	autoPairProbability me = Thing_new (PairProbability);
-	my string1 = Melder_wcsdup (string1);
-	my string2 = Melder_wcsdup (string2);
+	my string1 = Melder_dup (string1);
+	my string2 = Melder_dup (string2);
 	my weight = weight;
 	return me.transfer();
 }
@@ -61,34 +61,34 @@ PairDistribution PairDistribution_create () {
 		my pairs = Ordered_create ();
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("PairDistribution not created.");
+		Melder_throw (U"PairDistribution not created.");
 	}
 }
 
 static void PairDistribution_checkSpecifiedPairNumber (PairDistribution me, long pairNumber) {
 	if (pairNumber < 1)
-		Melder_throw (me, ": the specified pair number is ", pairNumber, ", but should be at least 1.");
+		Melder_throw (me, U": the specified pair number is ", pairNumber, U", but should be at least 1.");
 	if (pairNumber > my pairs -> size)
-		Melder_throw (me, ": the specified pair number is ", pairNumber, ", but should be at most my number of pairs (", my pairs -> size, ").");	
+		Melder_throw (me, U": the specified pair number is ", pairNumber, U", but should be at most my number of pairs (", my pairs -> size, U").");
 }
 
-const wchar_t * PairDistribution_getString1 (PairDistribution me, long pairNumber) {
+const char32 * PairDistribution_getString1 (PairDistribution me, long pairNumber) {
 	try {
 		PairDistribution_checkSpecifiedPairNumber (me, pairNumber);
 		PairProbability prob = static_cast <PairProbability> (my pairs -> item [pairNumber]);
 		return prob -> string1;
 	} catch (MelderError) {
-		Melder_throw (me, ": string1 not retrieved.");
+		Melder_throw (me, U": string1 not retrieved.");
 	}
 }
 
-const wchar_t * PairDistribution_getString2 (PairDistribution me, long pairNumber) {
+const char32 * PairDistribution_getString2 (PairDistribution me, long pairNumber) {
 	try {
 		PairDistribution_checkSpecifiedPairNumber (me, pairNumber);
 		PairProbability prob = static_cast <PairProbability> (my pairs -> item [pairNumber]);
 		return prob -> string2;
 	} catch (MelderError) {
-		Melder_throw (me, ": string2 not retrieved.");
+		Melder_throw (me, U": string2 not retrieved.");
 	}
 }
 
@@ -98,11 +98,11 @@ double PairDistribution_getWeight (PairDistribution me, long pairNumber) {
 		PairProbability prob = static_cast <PairProbability> (my pairs -> item [pairNumber]);
 		return prob -> weight;
 	} catch (MelderError) {
-		Melder_throw (me, ": weight not retrieved.");
+		Melder_throw (me, U": weight not retrieved.");
 	}
 }
 
-void PairDistribution_add (PairDistribution me, const wchar_t *string1, const wchar_t *string2, double weight) {
+void PairDistribution_add (PairDistribution me, const char32 *string1, const char32 *string2, double weight) {
 	PairProbability pair = PairProbability_create (string1, string2, weight);
 	Collection_addItem (my pairs, pair);
 }
@@ -116,10 +116,10 @@ void PairDistribution_removeZeroWeights (PairDistribution me) {
 	}
 }
 
-void structPairDistribution :: f_swapInputsAndOutputs () {
-	for (long ipair = pairs -> size; ipair > 0; ipair --) {
-		PairProbability prob = static_cast <PairProbability> (pairs -> item [ipair]);
-		wchar_t *tmp = prob -> string1;
+void PairDistribution_swapInputsAndOutputs (PairDistribution me) {
+	for (long ipair = my pairs -> size; ipair > 0; ipair --) {
+		PairProbability prob = static_cast <PairProbability> (my pairs -> item [ipair]);
+		char32 *tmp = prob -> string1;
 		prob -> string1 = prob -> string2;
 		prob -> string2 = tmp;
 	}
@@ -132,26 +132,26 @@ static double PairDistributions_getTotalWeight_checkPositive (PairDistribution m
 		totalWeight += prob -> weight;
 	}
 	if (totalWeight <= 0.0) {
-		Melder_throw (me, ": the total probability weight is ", Melder_half (totalWeight), " but should be greater than zero for this operation.");
+		Melder_throw (me, U": the total probability weight is ", Melder_half (totalWeight), U" but should be greater than zero for this operation.");
 	}
 	return totalWeight;
 }
 
 void PairDistribution_to_Stringses (PairDistribution me, long nout, Strings *strings1_out, Strings *strings2_out) {
 	try {
-		*strings1_out = *strings2_out = NULL;
+		*strings1_out = *strings2_out = nullptr;
 		long nin = my pairs -> size, iin;
 		if (nin < 1)
-			Melder_throw ("No candidates.");
+			Melder_throw (U"No candidates.");
 		if (nout < 1)
-			Melder_throw (L"Number of generated string pairs should be positive.");
+			Melder_throw (U"Number of generated string pairs should be positive.");
 		double total = PairDistributions_getTotalWeight_checkPositive (me);
 		autoStrings strings1 = Thing_new (Strings);
 		strings1 -> numberOfStrings = nout;
-		strings1 -> strings = NUMvector <wchar_t*> (1, nout);
+		strings1 -> strings = NUMvector <char32 *> (1, nout);
 		autoStrings strings2 = Thing_new (Strings);
 		strings2 -> numberOfStrings = nout;
-		strings2 -> strings = NUMvector <wchar_t*> (1, nout);
+		strings2 -> strings = NUMvector <char32 *> (1, nout);
 		for (long iout = 1; iout <= nout; iout ++) {
 			do {
 				double rand = NUMrandomUniform (0, total), sum = 0.0;
@@ -163,24 +163,24 @@ void PairDistribution_to_Stringses (PairDistribution me, long nout, Strings *str
 			} while (iin > nin);   /* Guard against rounding errors. */
 			PairProbability prob = static_cast <PairProbability> (my pairs -> item [iin]);
 			if (! prob -> string1 || ! prob -> string2)
-				Melder_throw ("No string in probability pair ", iin, ".");
-			strings1 -> strings [iout] = Melder_wcsdup (prob -> string1);
-			strings2 -> strings [iout] = Melder_wcsdup (prob -> string2);
+				Melder_throw (U"No string in probability pair ", iin, U".");
+			strings1 -> strings [iout] = Melder_dup (prob -> string1);
+			strings2 -> strings [iout] = Melder_dup (prob -> string2);
 		}
 		*strings1_out = strings1.transfer();
 		*strings2_out = strings2.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": generation of Stringses not performed.");
+		Melder_throw (me, U": generation of Stringses not performed.");
 	}
 }
 
-void PairDistribution_peekPair (PairDistribution me, wchar_t **string1, wchar_t **string2) {
+void PairDistribution_peekPair (PairDistribution me, char32 **string1, char32 **string2) {
 	try {
-		*string1 = *string2 = NULL;
+		*string1 = *string2 = nullptr;
 		double total = 0.0;
 		long nin = my pairs -> size, iin;
 		PairProbability prob;
-		if (nin < 1) Melder_throw ("No candidates.");
+		if (nin < 1) Melder_throw (U"No candidates.");
 		for (iin = 1; iin <= nin; iin ++) {
 			prob = static_cast <PairProbability> (my pairs -> item [iin]);
 			total += prob -> weight;
@@ -192,18 +192,18 @@ void PairDistribution_peekPair (PairDistribution me, wchar_t **string1, wchar_t
 				sum += prob -> weight;
 				if (rand <= sum) break;
 			}
-		} while (iin > nin);   /* Guard against rounding errors. */
+		} while (iin > nin);   // guard against rounding errors
 		prob = static_cast <PairProbability> (my pairs -> item [iin]);
-		if (! prob -> string1 || ! prob -> string2) Melder_throw ("No string in probability pair ", iin, L".");
+		if (! prob -> string1 || ! prob -> string2) Melder_throw (U"No string in probability pair ", iin, U".");
 		*string1 = prob -> string1;
 		*string2 = prob -> string2;
 	} catch (MelderError) {
-		Melder_throw (me, ": pair not peeked.");
+		Melder_throw (me, U": pair not peeked.");
 	}
 }
 
 static int compare (PairProbability me, PairProbability thee) throw () {
-	return wcscmp (my string1, thy string1);
+	return str32cmp (my string1, thy string1);
 }
 
 static double PairDistribution_getFractionCorrect (PairDistribution me, int which) {
@@ -215,10 +215,10 @@ static double PairDistribution_getFractionCorrect (PairDistribution me, int whic
 		double total = PairDistributions_getTotalWeight_checkPositive (thee.peek());
 		do {
 			long pairmax = pairmin;
-			wchar_t *firstInput = ((PairProbability) thy pairs -> item [pairmin]) -> string1;
+			char32 *firstInput = ((PairProbability) thy pairs -> item [pairmin]) -> string1;
 			for (ipair = pairmin + 1; ipair <= thy pairs -> size; ipair ++) {
 				PairProbability prob = static_cast <PairProbability> (thy pairs -> item [ipair]);
-				if (! wcsequ (prob -> string1, firstInput)) {
+				if (! str32equ (prob -> string1, firstInput)) {
 					pairmax = ipair - 1;
 					break;
 				}
@@ -246,7 +246,7 @@ static double PairDistribution_getFractionCorrect (PairDistribution me, int whic
 		} while (pairmin <= thy pairs -> size);
 		return correct;
 	} catch (MelderError) {
-		Melder_throw (me, ": could not compute my fraction correct.");
+		Melder_throw (me, U": could not compute my fraction correct.");
 	}
 }
 
@@ -262,7 +262,7 @@ double PairDistribution_Distributions_getFractionCorrect (PairDistribution me, D
 	try {
 		double correct = 0.0;
 		long pairmin = 1;
-		wchar_t string [1000];
+		char32 string [1000];
 		Distributions_checkSpecifiedColumnNumberWithinRange (dist, column);
 		autoPairDistribution thee = Data_copy (me);
 		NUMsort_p (thy pairs -> size, thy pairs -> item, (int (*) (const void *, const void *)) compare);
@@ -270,10 +270,10 @@ double PairDistribution_Distributions_getFractionCorrect (PairDistribution me, D
 		do {
 			long pairmax = pairmin, length, ipair;
 			double sum = 0.0, sumDist = 0.0;
-			wchar_t *firstInput = ((PairProbability) thy pairs -> item [pairmin]) -> string1;
+			char32 *firstInput = ((PairProbability) thy pairs -> item [pairmin]) -> string1;
 			for (ipair = pairmin + 1; ipair <= thy pairs -> size; ipair ++) {
 				PairProbability prob = static_cast <PairProbability> (thy pairs -> item [ipair]);
-				if (! wcsequ (prob -> string1, firstInput)) {
+				if (! str32equ (prob -> string1, firstInput)) {
 					pairmax = ipair - 1;
 					break;
 				}
@@ -282,19 +282,19 @@ double PairDistribution_Distributions_getFractionCorrect (PairDistribution me, D
 			for (ipair = pairmin; ipair <= pairmax; ipair ++) {
 				PairProbability prob = static_cast <PairProbability> (thy pairs -> item [ipair]);
 				double p = prob -> weight / total, pout = 0.0;
-				swprintf (string, 1000, L"%ls \\-> %ls", prob -> string1, prob -> string2);
+				Melder_sprint (string, 1000, prob -> string1, U" \\-> ", prob -> string2);
 				for (long idist = 1; idist <= dist -> numberOfRows; idist ++) {
-					if (wcsequ (string, dist -> rowLabels [idist])) {
+					if (str32equ (string, dist -> rowLabels [idist])) {
 						pout = dist -> data [idist] [column];
 						break;
 					}
 				}
 				sum += p * pout;
 			}
-			swprintf (string, 1000, L"%ls \\-> ", firstInput);
-			length = wcslen (string);
+			Melder_sprint (string, 1000, firstInput, U" \\-> ");
+			length = str32len (string);
 			for (long idist = 1; idist <= dist -> numberOfRows; idist ++) {
-				if (wcsnequ (string, dist -> rowLabels [idist], length)) {
+				if (str32nequ (string, dist -> rowLabels [idist], length)) {
 					sumDist += dist -> data [idist] [column];
 				}
 			}
@@ -303,13 +303,13 @@ double PairDistribution_Distributions_getFractionCorrect (PairDistribution me, D
 		} while (pairmin <= thy pairs -> size);
 		return correct;
 	} catch (MelderError) {
-		Melder_throw (me, " & ", dist, ": could not compute our fraction correct.");
+		Melder_throw (me, U" & ", dist, U": could not compute our fraction correct.");
 	}
 }
 
 Table PairDistribution_to_Table (PairDistribution me) {
 	try {
-		autoTable thee = Table_createWithColumnNames (my pairs -> size, L"string1 string2 weight");
+		autoTable thee = Table_createWithColumnNames (my pairs -> size, U"string1 string2 weight");
 		for (long ipair = 1; ipair <= my pairs -> size; ipair ++) {
 			PairProbability prob = static_cast <PairProbability> (my pairs -> item [ipair]);
 			Table_setStringValue (thee.peek(), ipair, 1, prob -> string1);
@@ -318,7 +318,7 @@ Table PairDistribution_to_Table (PairDistribution me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Table.");
+		Melder_throw (me, U": not converted to Table.");
 	}
 }
 
diff --git a/stat/PairDistribution.h b/stat/PairDistribution.h
index cc6cd27..b1e7fb6 100644
--- a/stat/PairDistribution.h
+++ b/stat/PairDistribution.h
@@ -2,7 +2,7 @@
 #define _PairDistribution_h_
 /* PairDistribution.h
  *
- * Copyright (C) 1997-2011 Paul Boersma
+ * Copyright (C) 1997-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,21 +24,22 @@
 #include "Distributions.h"
 
 #include "PairDistribution_def.h"
-oo_CLASS_CREATE (PairProbability, Data);
-oo_CLASS_CREATE (PairDistribution, Data);
+oo_CLASS_CREATE (PairProbability, Daata);
+oo_CLASS_CREATE (PairDistribution, Daata);
 
-PairProbability PairProbability_create (const wchar_t *string1, const wchar_t *string2, double weight);
-PairDistribution PairDistribution_create (void);
+PairProbability PairProbability_create (const char32 *string1, const char32 *string2, double weight);
+PairDistribution PairDistribution_create ();
 
-const wchar_t * PairDistribution_getString1 (PairDistribution me, long pairNumber);
-const wchar_t * PairDistribution_getString2 (PairDistribution me, long pairNumber);
+const char32 * PairDistribution_getString1 (PairDistribution me, long pairNumber);
+const char32 * PairDistribution_getString2 (PairDistribution me, long pairNumber);
 double PairDistribution_getWeight (PairDistribution me, long pairNumber);
 
-void PairDistribution_add (PairDistribution me, const wchar_t *string1, const wchar_t *string2, double weight);
+void PairDistribution_add (PairDistribution me, const char32 *string1, const char32 *string2, double weight);
 void PairDistribution_removeZeroWeights (PairDistribution me);
 void PairDistribution_to_Stringses (PairDistribution me, long nout, Strings *strings1, Strings *strings2);
-void PairDistribution_peekPair (PairDistribution me, wchar_t **string1, wchar_t **string2);
+void PairDistribution_peekPair (PairDistribution me, char32 **string1, char32 **string2);
 
+void PairDistribution_swapInputsAndOutputs (PairDistribution me);
 
 double PairDistribution_getFractionCorrect_maximumLikelihood (PairDistribution me);
 double PairDistribution_getFractionCorrect_probabilityMatching (PairDistribution me);
diff --git a/stat/PairDistribution_def.h b/stat/PairDistribution_def.h
index 5b14c1e..e4d391e 100644
--- a/stat/PairDistribution_def.h
+++ b/stat/PairDistribution_def.h
@@ -1,6 +1,6 @@
 /* PairDistribution_def.h
  *
- * Copyright (C) 1997-2011,2013 Paul Boersma
+ * Copyright (C) 1997-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 
 #define ooSTRUCT PairProbability
-oo_DEFINE_CLASS (PairProbability, Data)
+oo_DEFINE_CLASS (PairProbability, Daata)
 
 	oo_STRING (string1)
 	oo_STRING (string2)
@@ -30,15 +30,13 @@ oo_END_CLASS (PairProbability)
 
 
 #define ooSTRUCT PairDistribution
-oo_DEFINE_CLASS (PairDistribution, Data)
+oo_DEFINE_CLASS (PairDistribution, Daata)
 
 	oo_COLLECTION (Ordered, pairs, PairProbability, 0)
 
 	#if oo_DECLARING
-		// functions:
-			void f_swapInputsAndOutputs ();
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (PairDistribution)
diff --git a/stat/Regression.cpp b/stat/Regression.cpp
index e6f7652..783a5f8 100644
--- a/stat/Regression.cpp
+++ b/stat/Regression.cpp
@@ -1,6 +1,6 @@
 /* Regression.cpp
  *
- * Copyright (C) 2005-2011,2014 Paul Boersma
+ * Copyright (C) 2005-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,66 +39,66 @@
 #include "oo_DESCRIPTION.h"
 #include "Regression_def.h"
 
-Thing_implement (RegressionParameter, Data, 0);
+Thing_implement (RegressionParameter, Daata, 0);
 
 void structRegression :: v_info () {
 	Regression_Parent :: v_info ();
-	MelderInfo_writeLine (L"Factors:");
-	MelderInfo_writeLine (L"   Number of factors: ", Melder_integer (parameters -> size));
+	MelderInfo_writeLine (U"Factors:");
+	MelderInfo_writeLine (U"   Number of factors: ", parameters -> size);
 	for (long ivar = 1; ivar <= parameters -> size; ivar ++) {
 		RegressionParameter parm = static_cast<RegressionParameter> (parameters -> item [ivar]);
-		MelderInfo_writeLine (L"   Factor ", Melder_integer (ivar), L": ", parm -> label);
+		MelderInfo_writeLine (U"   Factor ", ivar, U": ", parm -> label);
 	}
-	MelderInfo_writeLine (L"Fitted coefficients:");
-	MelderInfo_writeLine (L"   Intercept: ", Melder_double (intercept));
+	MelderInfo_writeLine (U"Fitted coefficients:");
+	MelderInfo_writeLine (U"   Intercept: ", intercept);
 	for (long ivar = 1; ivar <= parameters -> size; ivar ++) {
 		RegressionParameter parm = static_cast<RegressionParameter> (parameters -> item [ivar]);
-		MelderInfo_writeLine (L"   Coefficient of factor ", parm -> label, L": ", Melder_double (parm -> value));
+		MelderInfo_writeLine (U"   Coefficient of factor ", parm -> label, U": ", parm -> value);
 	}
-	MelderInfo_writeLine (L"Ranges of values:");
+	MelderInfo_writeLine (U"Ranges of values:");
 	for (long ivar = 1; ivar <= parameters -> size; ivar ++) {
 		RegressionParameter parm = static_cast<RegressionParameter> (parameters -> item [ivar]);
-		MelderInfo_writeLine (L"   Range of factor ", parm -> label, L": minimum ",
-			Melder_double (parm -> minimum), L", maximum ", Melder_double (parm -> maximum));
+		MelderInfo_writeLine (U"   Range of factor ", parm -> label, U": minimum ",
+			parm -> minimum, U", maximum ", parm -> maximum);
 	}
 }
 
-Thing_implement (Regression, Data, 0);
+Thing_implement (Regression, Daata, 0);
 
 void Regression_init (Regression me) {
 	my parameters = Ordered_create ();
 }
 
-void Regression_addParameter (Regression me, const wchar_t *label, double minimum, double maximum, double value) {
+void Regression_addParameter (Regression me, const char32 *label, double minimum, double maximum, double value) {
 	try {
 		autoRegressionParameter thee = Thing_new (RegressionParameter);
-		thy label = Melder_wcsdup (label);
+		thy label = Melder_dup (label);
 		thy minimum = minimum;
 		thy maximum = maximum;
 		thy value = value;
 		Collection_addItem (my parameters, thee.transfer());
 	} catch (MelderError) {
-		Melder_throw (me, ": parameter not added.");
+		Melder_throw (me, U": parameter not added.");
 	}
 }
 
-long Regression_getFactorIndexFromFactorName_e (Regression me, const wchar_t *factorName) {
+long Regression_getFactorIndexFromFactorName_e (Regression me, const char32 *factorName) {
 	for (long iparm = 1; iparm <= my parameters -> size; iparm ++) {
 		RegressionParameter parm = static_cast<RegressionParameter> (my parameters -> item [iparm]);
-		if (Melder_wcsequ (factorName, parm -> label)) return iparm;
+		if (Melder_equ (factorName, parm -> label)) return iparm;
 	}
-	Melder_throw (Thing_messageName (me), L" has no parameter named \"", factorName, L"\".");
+	Melder_throw (Thing_messageName (me), U" has no parameter named \"", factorName, U"\".");
 }
 
 Thing_implement (LinearRegression, Regression, 0);
 
-LinearRegression LinearRegression_create (void) {
+LinearRegression LinearRegression_create () {
 	try {
 		autoLinearRegression me = Thing_new (LinearRegression);
 		Regression_init (me.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("LinearRegression not created.");
+		Melder_throw (U"LinearRegression not created.");
 	}
 }
 
@@ -107,9 +107,9 @@ LinearRegression Table_to_LinearRegression (Table me) {
 		long numberOfIndependentVariables = my numberOfColumns - 1, numberOfParameters = my numberOfColumns;
 		long numberOfCells = my rows -> size, icell, ivar;
 		if (numberOfParameters < 1)   /* Includes intercept. */
-			Melder_throw ("Not enough columns (has to be more than 1).");
+			Melder_throw (U"Not enough columns (has to be more than 1).");
 		if (numberOfCells < numberOfParameters) {
-			Melder_warning (L"Solution is not unique (more parameters than cases).");
+			Melder_warning (U"Solution is not unique (more parameters than cases).");
 		}
 		autoNUMmatrix <double> u (1, numberOfCells, 1, numberOfParameters);
 		autoNUMvector <double> b (1, numberOfCells);
@@ -125,7 +125,7 @@ LinearRegression Table_to_LinearRegression (Table me) {
 				u [icell] [ivar] = Table_getNumericValue_Assert (me, icell, ivar);
 			}
 			u [icell] [numberOfParameters] = 1.0;   /* For the intercept. */
-			b [icell] = Table_getNumericValue_Assert (me, icell, my numberOfColumns);   /* The dependent variable. */
+			b [icell] = Table_getNumericValue_Assert (me, icell, my numberOfColumns);   // the dependent variable
 		}
 		NUMsolveEquation (u.peek(), numberOfCells, numberOfParameters, b.peek(), NUMeps * numberOfCells, x.peek());
 		thy intercept = x [numberOfParameters];
@@ -135,7 +135,7 @@ LinearRegression Table_to_LinearRegression (Table me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": linear regression not performed.");
+		Melder_throw (me, U": linear regression not performed.");
 	}
 }
 
diff --git a/stat/Regression.h b/stat/Regression.h
index 06743c8..76b4fe6 100644
--- a/stat/Regression.h
+++ b/stat/Regression.h
@@ -2,7 +2,7 @@
 #define _Regression_h_
 /* Regression.h
  *
- * Copyright (C) 2005-2011,2014 Paul Boersma
+ * Copyright (C) 2005-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,17 +22,17 @@
 #include "Table.h"
 
 #include "Regression_def.h"
-oo_CLASS_CREATE (RegressionParameter, Data);
-oo_CLASS_CREATE (Regression, Data);
+oo_CLASS_CREATE (RegressionParameter, Daata);
+oo_CLASS_CREATE (Regression, Daata);
 
 void Regression_init (Regression me);
-void Regression_addParameter (Regression me, const wchar_t *label, double minimum, double maximum, double value);
-long Regression_getFactorIndexFromFactorName_e (Regression me, const wchar_t *factorName);
+void Regression_addParameter (Regression me, const char32 *label, double minimum, double maximum, double value);
+long Regression_getFactorIndexFromFactorName_e (Regression me, const char32 *factorName);
 
 Thing_define (LinearRegression, Regression) {
 };
 
-LinearRegression LinearRegression_create (void);
+LinearRegression LinearRegression_create ();
 
 LinearRegression Table_to_LinearRegression (Table me);
 
diff --git a/stat/Regression_def.h b/stat/Regression_def.h
index a577942..698034c 100644
--- a/stat/Regression_def.h
+++ b/stat/Regression_def.h
@@ -1,6 +1,6 @@
 /* Regression_def.h
  *
- * Copyright (C) 2005-2007 Paul Boersma
+ * Copyright (C) 2005-2007,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 
 #define ooSTRUCT RegressionParameter
-oo_DEFINE_CLASS (RegressionParameter, Data)
+oo_DEFINE_CLASS (RegressionParameter, Daata)
 
 	oo_STRING (label)
 	oo_DOUBLE (minimum)
@@ -34,14 +34,14 @@ oo_END_CLASS (RegressionParameter)
 
 
 #define ooSTRUCT Regression
-oo_DEFINE_CLASS (Regression, Data)
+oo_DEFINE_CLASS (Regression, Daata)
 
 	oo_DOUBLE (intercept)
 	oo_COLLECTION (Ordered, parameters, RegressionParameter, 0)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
+		void v_info ()
+			override;
 	#endif
 
 oo_END_CLASS (Regression)
diff --git a/stat/Table.cpp b/stat/Table.cpp
index 5f2d418..9d3b275 100644
--- a/stat/Table.cpp
+++ b/stat/Table.cpp
@@ -1,6 +1,6 @@
 /* Table.cpp
  *
- * Copyright (C) 2002-2012,2013,2014 Paul Boersma
+ * Copyright (C) 2002-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -81,36 +81,36 @@
 #include "oo_DESCRIPTION.h"
 #include "Table_def.h"
 
-Thing_implement (TableRow, Data, 0);
+Thing_implement (TableRow, Daata, 0);
 
-Thing_implement (Table, Data, 0);
+Thing_implement (Table, Daata, 0);
 
 void structTable :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of rows: ", Melder_integer (rows -> size));
-	MelderInfo_writeLine (L"Number of columns: ", Melder_integer (numberOfColumns));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of rows: ", rows -> size);
+	MelderInfo_writeLine (U"Number of columns: ", numberOfColumns);
 }
 
-const wchar_t * structTable :: v_getColStr (long columnNumber) {
+const char32 * structTable :: v_getColStr (long columnNumber) {
 	if (columnNumber < 1 || columnNumber > numberOfColumns) return NULL;
-	return columnHeaders [columnNumber]. label ? columnHeaders [columnNumber]. label : L"";
+	return columnHeaders [columnNumber]. label ? columnHeaders [columnNumber]. label : U"";
 }
 
 double structTable :: v_getMatrix (long rowNumber, long columnNumber) {
 	if (rowNumber < 1 || rowNumber > rows -> size) return NUMundefined;
 	if (columnNumber < 1 || columnNumber > numberOfColumns) return NUMundefined;
-	wchar_t *stringValue = ((TableRow) rows -> item [rowNumber]) -> cells [columnNumber]. string;
+	char32 *stringValue = ((TableRow) rows -> item [rowNumber]) -> cells [columnNumber]. string;
 	return stringValue == NULL ? NUMundefined : Melder_atof (stringValue);
 }
 
-const wchar_t * structTable :: v_getMatrixStr (long rowNumber, long columnNumber) {
-	if (rowNumber < 1 || rowNumber > rows -> size) return L"";
-	if (columnNumber < 1 || columnNumber > numberOfColumns) return L"";
-	wchar_t *stringValue = ((TableRow) rows -> item [rowNumber]) -> cells [columnNumber]. string;
-	return stringValue == NULL ? L"" : stringValue;
+const char32 * structTable :: v_getMatrixStr (long rowNumber, long columnNumber) {
+	if (rowNumber < 1 || rowNumber > rows -> size) return U"";
+	if (columnNumber < 1 || columnNumber > numberOfColumns) return U"";
+	char32 *stringValue = ((TableRow) rows -> item [rowNumber]) -> cells [columnNumber]. string;
+	return stringValue == NULL ? U"" : stringValue;
 }
 
-double structTable :: v_getColIndex (const wchar_t *columnLabel) {
+double structTable :: v_getColIndex (const char32 *columnLabel) {
 	return Table_findColumnIndexFromColumnLabel (this, columnLabel);
 }
 
@@ -123,7 +123,7 @@ static TableRow TableRow_create (long numberOfColumns) {
 
 void Table_initWithoutColumnNames (Table me, long numberOfRows, long numberOfColumns) {
 	if (numberOfColumns < 1)
-		Melder_throw ("Cannot create table without columns.");
+		Melder_throw (U"Cannot create table without columns.");
 	my numberOfColumns = numberOfColumns;
 	my columnHeaders = NUMvector <structTableColumnHeader> (1, numberOfColumns);
 	my rows = Ordered_create ();
@@ -138,26 +138,26 @@ Table Table_createWithoutColumnNames (long numberOfRows, long numberOfColumns) {
 		Table_initWithoutColumnNames (me.peek(), numberOfRows, numberOfColumns);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Table not created.");
+		Melder_throw (U"Table not created.");
 	}
 }
 
-void Table_initWithColumnNames (Table me, long numberOfRows, const wchar_t *columnNames) {
+void Table_initWithColumnNames (Table me, long numberOfRows, const char32 *columnNames) {
 	Table_initWithoutColumnNames (me, numberOfRows, Melder_countTokens (columnNames));
 	long icol = 0;
-	for (wchar_t *columnName = Melder_firstToken (columnNames); columnName != NULL; columnName = Melder_nextToken ()) {
+	for (char32 *columnName = Melder_firstToken (columnNames); columnName != NULL; columnName = Melder_nextToken ()) {
 		icol ++;
 		Table_setColumnLabel (me, icol, columnName);
 	}
 }
 
-Table Table_createWithColumnNames (long numberOfRows, const wchar_t *columnNames) {
+Table Table_createWithColumnNames (long numberOfRows, const char32 *columnNames) {
 	try {
 		autoTable me = Thing_new (Table);
 		Table_initWithColumnNames (me.peek(), numberOfRows, columnNames);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Table not created.");
+		Melder_throw (U"Table not created.");
 	}
 }
 
@@ -166,49 +166,49 @@ void Table_appendRow (Table me) {
 		autoTableRow row = TableRow_create (my numberOfColumns);
 		Collection_addItem (my rows, row.transfer());
 	} catch (MelderError) {
-		Melder_throw (me, ": row not appended.");
+		Melder_throw (me, U": row not appended.");
 	}
 }
 
-void Table_appendColumn (Table me, const wchar_t *label) {
+void Table_appendColumn (Table me, const char32 *label) {
 	try {
 		Table_insertColumn (me, my numberOfColumns + 1, label);
 	} catch (MelderError) {
-		Melder_throw (me, ": column \"", label, "\" not appended.");
+		Melder_throw (me, U": column \"", label, U"\" not appended.");
 	}
 }
 
 void Table_checkSpecifiedRowNumberWithinRange (Table me, long rowNumber) {
 	if (rowNumber < 1)
-		Melder_throw (me, ": the specified row number is ", rowNumber, ", but should be at least 1.");
+		Melder_throw (me, U": the specified row number is ", rowNumber, U", but should be at least 1.");
 	if (rowNumber > my rows -> size)
-		Melder_throw (me, ": the specified row number (", rowNumber, ") exceeds my number of rows (", my rows -> size, ").");	
+		Melder_throw (me, U": the specified row number (", rowNumber, U") exceeds my number of rows (", my rows -> size, U").");
 }
 
 void Table_removeRow (Table me, long rowNumber) {
 	try {
 		if (my rows -> size == 1)
-			Melder_throw (me, ": cannot remove my only row.");
+			Melder_throw (me, U": cannot remove my only row.");
 		Table_checkSpecifiedRowNumberWithinRange (me, rowNumber);
 		Collection_removeItem (my rows, rowNumber);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++)
-			my columnHeaders [icol]. numericized = FALSE;
+			my columnHeaders [icol]. numericized = false;
 	} catch (MelderError) {
-		Melder_throw (me, ": row ", rowNumber, " not removed.");
+		Melder_throw (me, U": row ", rowNumber, U" not removed.");
 	}
 }
 
 void Table_checkSpecifiedColumnNumberWithinRange (Table me, long columnNumber) {
 	if (columnNumber < 1)
-		Melder_throw (me, ": the specified column number is ", columnNumber, ", but should be at least 1.");
+		Melder_throw (me, U": the specified column number is ", columnNumber, U", but should be at least 1.");
 	if (columnNumber > my numberOfColumns)
-		Melder_throw (me, ": the specified column number is ", columnNumber, ", but should be at most my number of columns (", my numberOfColumns, ").");	
+		Melder_throw (me, U": the specified column number is ", columnNumber, U", but should be at most my number of columns (", my numberOfColumns, U").");
 }
 
 void Table_removeColumn (Table me, long columnNumber) {
 	try {
 		if (my numberOfColumns == 1)
-			Melder_throw (me, ": cannot remove my only column.");
+			Melder_throw (me, U": cannot remove my only column.");
 		Table_checkSpecifiedColumnNumberWithinRange (me, columnNumber);
 		/*
 		 * Changes without error.
@@ -225,7 +225,7 @@ void Table_removeColumn (Table me, long columnNumber) {
 		}
 		my numberOfColumns --;
 	} catch (MelderError) {
-		Melder_throw (me, ": column ", columnNumber, " not removed.");
+		Melder_throw (me, U": column ", columnNumber, U" not removed.");
 	}
 }
 
@@ -235,9 +235,9 @@ void Table_insertRow (Table me, long rowNumber) {
 		 * Check without changes.
 		 */
 		if (rowNumber < 1)
-			Melder_throw (me, ": the specified row number is ", rowNumber, ", but should be at least 1.");
+			Melder_throw (me, U": the specified row number is ", rowNumber, U", but should be at least 1.");
 		if (rowNumber > my rows -> size + 1)
-			Melder_throw (me, ": the specified row number is ", rowNumber, ", but should be at most my number of rows (", my rows -> size, ") plus 1.");	
+			Melder_throw (me, U": the specified row number is ", rowNumber, U", but should be at most my number of rows (", my rows -> size, U") plus 1.");
 		autoTableRow row = TableRow_create (my numberOfColumns);
 		/*
 		 * Safe change.
@@ -247,23 +247,23 @@ void Table_insertRow (Table me, long rowNumber) {
 		 * Changes without error.
 		 */
 		for (long icol = 1; icol <= my numberOfColumns; icol ++)
-			my columnHeaders [icol]. numericized = FALSE;
+			my columnHeaders [icol]. numericized = false;
 	} catch (MelderError) {
-		Melder_throw (me, ": row ", rowNumber, " not inserted.");
+		Melder_throw (me, U": row ", rowNumber, U" not inserted.");
 	}
 }
 
-void Table_insertColumn (Table me, long columnNumber, const wchar_t *label) {
+void Table_insertColumn (Table me, long columnNumber, const char32 *label /* cattable */) {
 	try {
 		/*
 		 * Check without changes.
 		 */
 		if (columnNumber < 1)
-			Melder_throw (me, ": the specified column number is ", columnNumber, ", but should be at least 1.");
+			Melder_throw (me, U": the specified column number is ", columnNumber, U", but should be at least 1.");
 		if (columnNumber > my numberOfColumns + 1)
-			Melder_throw (me, ": the specified column number is ", columnNumber, ", but should be at most my number of columns (", my numberOfColumns, ") plus 1.");	
+			Melder_throw (me, U": the specified column number is ", columnNumber, U", but should be at most my number of columns (", my numberOfColumns, U") plus 1.");
+		autostring32 newLabel = Melder_dup (label);
 		autoTable thee = Table_createWithoutColumnNames (my rows -> size, my numberOfColumns + 1);
-		autostring newLabel = Melder_wcsdup (label);
 		/*
 		 * Changes without error.
 		 */
@@ -317,46 +317,46 @@ void Table_insertColumn (Table me, long columnNumber, const wchar_t *label) {
 		 */
 		my numberOfColumns ++;
 	} catch (MelderError) {
-		Melder_throw (me, ": column not inserted.");
+		Melder_throw (me, U": column not inserted.");
 	}
 }
 
-void Table_setColumnLabel (Table me, long columnNumber, const wchar_t *label) {
+void Table_setColumnLabel (Table me, long columnNumber, const char32 *label /* cattable */) {
 	try {
 		/*
 		 * Check without changes.
 		 */
 		Table_checkSpecifiedColumnNumberWithinRange (me, columnNumber);
-		autostring newLabel = Melder_wcsdup (label);
+		autostring32 newLabel = Melder_dup (label);
 		/*
 		 * Changes without error.
 		 */
 		Melder_free (my columnHeaders [columnNumber]. label);
 		my columnHeaders [columnNumber]. label = newLabel.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": column label not set.");
+		Melder_throw (me, U": column label not set.");
 	}
 }
 
-long Table_findColumnIndexFromColumnLabel (Table me, const wchar_t *label) {
+long Table_findColumnIndexFromColumnLabel (Table me, const char32 *label) {
 	for (long icol = 1; icol <= my numberOfColumns; icol ++)
-		if (my columnHeaders [icol]. label && wcsequ (my columnHeaders [icol]. label, label))
+		if (my columnHeaders [icol]. label && str32equ (my columnHeaders [icol]. label, label))
 			return icol;
 	return 0;
 }
 
-long Table_getColumnIndexFromColumnLabel (Table me, const wchar_t *columnLabel) {
+long Table_getColumnIndexFromColumnLabel (Table me, const char32 *columnLabel) {
 	long columnNumber = Table_findColumnIndexFromColumnLabel (me, columnLabel);
 	if (columnNumber == 0)
-		Melder_throw (me, ": there is no column named \"", columnLabel, "\".");
+		Melder_throw (me, U": there is no column named \"", columnLabel, U"\".");
 	return columnNumber;
 }
 
-long * Table_getColumnIndicesFromColumnLabelString (Table me, const wchar_t *string, long *numberOfTokens) {
+long * Table_getColumnIndicesFromColumnLabelString (Table me, const char32 *string, long *numberOfTokens) {
 	*numberOfTokens = 0;
 	autoMelderTokens tokens (string, numberOfTokens);
 	if (*numberOfTokens < 1)
-		Melder_throw (me, ": you specified an empty list of columns.");
+		Melder_throw (me, U": you specified an empty list of columns.");
 	autoNUMvector <long> columns (1, *numberOfTokens);
 	for (long icol = 1; icol <= *numberOfTokens; icol ++) {
 		columns [icol] = Table_getColumnIndexFromColumnLabel (me, tokens [icol]);
@@ -364,32 +364,32 @@ long * Table_getColumnIndicesFromColumnLabelString (Table me, const wchar_t *str
 	return columns.transfer();
 }
 
-long Table_searchColumn (Table me, long columnNumber, const wchar_t *value) {
+long Table_searchColumn (Table me, long columnNumber, const char32 *value) {
 	for (long irow = 1; irow <= my rows -> size; irow ++) {
 		TableRow row = static_cast <TableRow> (my rows -> item [irow]);
-		if (row -> cells [columnNumber]. string != NULL && wcsequ (row -> cells [columnNumber]. string, value))
+		if (row -> cells [columnNumber]. string != NULL && str32equ (row -> cells [columnNumber]. string, value))
 			return irow;
 	}
 	return 0;
 }
 
-void Table_setStringValue (Table me, long rowNumber, long columnNumber, const wchar_t *value) {
+void Table_setStringValue (Table me, long rowNumber, long columnNumber, const char32 *value /* cattable */) {
 	try {
 		/*
 		 * Check without changes.
 		 */
 		Table_checkSpecifiedRowNumberWithinRange (me, rowNumber);
 		Table_checkSpecifiedColumnNumberWithinRange (me, columnNumber);
-		autostring newValue = Melder_wcsdup (value);
+		autostring32 newValue = Melder_dup (value);
 		/*
 		 * Change without errors.
 		 */
 		TableRow row = static_cast <TableRow> (my rows -> item [rowNumber]);
 		Melder_free (row -> cells [columnNumber]. string);
 		row -> cells [columnNumber]. string = newValue.transfer();
-		my columnHeaders [columnNumber]. numericized = FALSE;
+		my columnHeaders [columnNumber]. numericized = false;
 	} catch (MelderError) {
-		Melder_throw (me, ": string value not set.");
+		Melder_throw (me, U": string value not set.");
 	}
 }
 
@@ -400,16 +400,16 @@ void Table_setNumericValue (Table me, long rowNumber, long columnNumber, double
 		 */
 		Table_checkSpecifiedRowNumberWithinRange (me, rowNumber);
 		Table_checkSpecifiedColumnNumberWithinRange (me, columnNumber);
-		autostring newValue = Melder_wcsdup (Melder_double (value));
+		autostring32 newValue = Melder_dup (Melder_double (value));
 		/*
 		 * Change without errors.
 		 */
 		TableRow row = static_cast <TableRow> (my rows -> item [rowNumber]);
 		Melder_free (row -> cells [columnNumber]. string);
 		row -> cells [columnNumber]. string = newValue.transfer();
-		my columnHeaders [columnNumber]. numericized = FALSE;
+		my columnHeaders [columnNumber]. numericized = false;
 	} catch (MelderError) {
-		Melder_throw (me, ": numeric value not set.");
+		Melder_throw (me, U": numeric value not set.");
 	}
 }
 
@@ -417,20 +417,20 @@ bool Table_isCellNumeric_ErrorFalse (Table me, long rowNumber, long columnNumber
 	if (rowNumber < 1 || rowNumber > my rows -> size) return false;
 	if (columnNumber < 1 || columnNumber > my numberOfColumns) return false;
 	TableRow row = static_cast <TableRow> (my rows -> item [rowNumber]);
-	const wchar_t *cell = row -> cells [columnNumber]. string;
+	const char32 *cell = row -> cells [columnNumber]. string;
 	if (cell == NULL) return true;   // the value --undefined--
 	/*
 	 * Skip leading white space, in order to separately detect "?" and "--undefined--".
 	 */
-	while (*cell == ' ' || *cell == '\t' || *cell == '\n' || *cell == '\r') cell ++;
-	if (cell [0] == '\0') return true;   // only white space: the value --undefined--
-	if (cell [0] == '?' || wcsnequ (cell, L"--undefined--", 13)) {
+	while (*cell == U' ' || *cell == U'\t' || *cell == U'\n' || *cell == U'\r') cell ++;
+	if (cell [0] == U'\0') return true;   // only white space: the value --undefined--
+	if (cell [0] == U'?' || str32nequ (cell, U"--undefined--", 13)) {
 		/*
 		 * See whether there is anything else besides "?" or "--undefined--" and white space.
 		 */
-		cell += ( cell [0] == '?' ) ? 1 : 13;
-		while (*cell == ' ' || *cell == '\t' || *cell == '\n' || *cell == '\r') cell ++;
-		return *cell == '\0';   // only white space after the "?" or "--undefined--"
+		cell += ( cell [0] == U'?' ) ? 1 : 13;
+		while (*cell == U' ' || *cell == U'\t' || *cell == U'\n' || *cell == U'\r') cell ++;
+		return *cell == U'\0';   // only white space after the "?" or "--undefined--"
 	}
 	return Melder_isStringNumeric_nothrow (cell);
 }
@@ -447,9 +447,9 @@ static long stringCompare_column;
 
 static int stringCompare_NoError (const void *first, const void *second) {
 	TableRow me = * (TableRow *) first, thee = * (TableRow *) second;
-	wchar_t *firstString = my cells [stringCompare_column]. string;
-	wchar_t *secondString = thy cells [stringCompare_column]. string;
-	return wcscmp (firstString ? firstString : L"", secondString ? secondString : L"");
+	char32 *firstString = my cells [stringCompare_column]. string;
+	char32 *secondString = thy cells [stringCompare_column]. string;
+	return str32cmp (firstString ? firstString : U"", secondString ? secondString : U"");
 }
 
 static void sortRowsByStrings_Assert (Table me, long columnNumber) {
@@ -475,14 +475,14 @@ void Table_numericize_Assert (Table me, long columnNumber) {
 	if (Table_isColumnNumeric_ErrorFalse (me, columnNumber)) {
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
-			const wchar_t *string = row -> cells [columnNumber]. string;
+			const char32 *string = row -> cells [columnNumber]. string;
 			row -> cells [columnNumber]. number =
-				string == NULL || string [0] == '\0' || (string [0] == '?' && string [1] == '\0') ? NUMundefined :
+				string == NULL || string [0] == U'\0' || (string [0] == U'?' && string [1] == U'\0') ? NUMundefined :
 				Melder_atof (string);
 		}
 	} else {
 		long iunique = 0;
-		const wchar_t *previousString = NULL;
+		const char32 *previousString = NULL;
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 			row -> sortingIndex = irow;
@@ -490,9 +490,9 @@ void Table_numericize_Assert (Table me, long columnNumber) {
 		sortRowsByStrings_Assert (me, columnNumber);
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
-			const wchar_t *string = row -> cells [columnNumber]. string;
-			if (string == NULL) string = L"";
-			if (previousString == NULL || ! wcsequ (string, previousString)) {
+			const char32 *string = row -> cells [columnNumber]. string;
+			if (string == NULL) string = U"";
+			if (previousString == NULL || ! str32equ (string, previousString)) {
 				iunique ++;
 			}
 			row -> cells [columnNumber]. number = iunique;
@@ -500,7 +500,7 @@ void Table_numericize_Assert (Table me, long columnNumber) {
 		}
 		sortRowsByIndex_NoError (me);
 	}
-	my columnHeaders [columnNumber]. numericized = TRUE;
+	my columnHeaders [columnNumber]. numericized = true;
 }
 
 static void Table_numericize_checkDefined (Table me, long columnNumber) {
@@ -508,17 +508,17 @@ static void Table_numericize_checkDefined (Table me, long columnNumber) {
 	for (long irow = 1; irow <= my rows -> size; irow ++) {
 		TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 		if (row -> cells [columnNumber]. number == NUMundefined)
-			Melder_throw (me, ": the cell in row ", irow,
-				" of column \"", my columnHeaders [columnNumber]. label ? my columnHeaders [columnNumber]. label : Melder_integer (columnNumber),
-				" is undefined.");
+			Melder_throw (me, U": the cell in row ", irow,
+				U" of column \"", my columnHeaders [columnNumber]. label ? my columnHeaders [columnNumber]. label : Melder_integer (columnNumber),
+				U" is undefined.");
 	}
 }
 
-const wchar_t * Table_getStringValue_Assert (Table me, long rowNumber, long columnNumber) {
+const char32 * Table_getStringValue_Assert (Table me, long rowNumber, long columnNumber) {
 	Melder_assert (rowNumber >= 1 && rowNumber <= my rows -> size);
 	Melder_assert (columnNumber >= 1 && columnNumber <= my numberOfColumns);
 	TableRow row = static_cast <TableRow> (my rows -> item [rowNumber]);
-	return row -> cells [columnNumber]. string ? row -> cells [columnNumber]. string : L"";
+	return row -> cells [columnNumber]. string ? row -> cells [columnNumber]. string : U"";
 }
 
 double Table_getNumericValue_Assert (Table me, long rowNumber, long columnNumber) {
@@ -542,7 +542,7 @@ double Table_getMean (Table me, long columnNumber) {
 		}
 		return sum / my rows -> size;
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot compute mean of column ", columnNumber, ".");
+		Melder_throw (me, U": cannot compute mean of column ", columnNumber, U".");
 	}
 }
 
@@ -561,7 +561,7 @@ double Table_getMaximum (Table me, long columnNumber) {
 		}
 		return maximum;
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot compute maximum of column ", columnNumber, ".");
+		Melder_throw (me, U": cannot compute maximum of column ", columnNumber, U".");
 	}
 }
 
@@ -580,11 +580,11 @@ double Table_getMinimum (Table me, long columnNumber) {
 		}
 		return minimum;
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot compute minimum of column ", columnNumber, ".");
+		Melder_throw (me, U": cannot compute minimum of column ", columnNumber, U".");
 	}
 }
 
-double Table_getGroupMean (Table me, long columnNumber, long groupColumnNumber, const wchar_t *group) {
+double Table_getGroupMean (Table me, long columnNumber, long groupColumnNumber, const char32 *group) {
 	try {
 		Table_checkSpecifiedColumnNumberWithinRange (me, columnNumber);
 		Table_numericize_checkDefined (me, columnNumber);
@@ -592,7 +592,7 @@ double Table_getGroupMean (Table me, long columnNumber, long groupColumnNumber,
 		double sum = 0.0;
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
-			if (Melder_wcsequ (row -> cells [groupColumnNumber]. string, group)) {
+			if (Melder_equ (row -> cells [groupColumnNumber]. string, group)) {
 				n += 1;
 				sum += row -> cells [columnNumber]. number;
 			}
@@ -601,7 +601,7 @@ double Table_getGroupMean (Table me, long columnNumber, long groupColumnNumber,
 		double mean = sum / n;
 		return mean;
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot compute mean of column ", columnNumber, " for group \"", group, "\" of column ", groupColumnNumber, ".");
+		Melder_throw (me, U": cannot compute mean of column ", columnNumber, U" for group \"", group, U"\" of column ", groupColumnNumber, U".");
 	}
 }
 
@@ -619,7 +619,7 @@ double Table_getQuantile (Table me, long columnNumber, double quantile) {
 		NUMsort_d (my rows -> size, sortingColumn.peek());
 		return NUMquantile (my rows -> size, sortingColumn.peek(), quantile);
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot compute the ", quantile, " quantile of column ", columnNumber, ".");
+		Melder_throw (me, U": cannot compute the ", quantile, U" quantile of column ", columnNumber, U".");
 	}
 }
 
@@ -636,7 +636,7 @@ double Table_getStdev (Table me, long columnNumber) {
 		}
 		return sqrt (sum / (my rows -> size - 1));
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot compute the standard deviation of column ", columnNumber, ".");
+		Melder_throw (me, U": cannot compute the standard deviation of column ", columnNumber, U".");
 	}
 }
 
@@ -645,14 +645,14 @@ long Table_drawRowFromDistribution (Table me, long columnNumber) {
 		Table_checkSpecifiedColumnNumberWithinRange (me, columnNumber);
 		Table_numericize_checkDefined (me, columnNumber);
 		if (my rows -> size < 1)
-			Melder_throw (me, ": no rows.");
+			Melder_throw (me, U": no rows.");
 		double total = 0.0;
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 			total += row -> cells [columnNumber]. number;
 		}
 		if (total <= 0.0)
-			Melder_throw (me, ": the total weight of column ", columnNumber, " is not positive.");
+			Melder_throw (me, U": the total weight of column ", columnNumber, U" is not positive.");
 		long irow;
 		do {
 			double rand = NUMrandomUniform (0, total), sum = 0.0;
@@ -661,10 +661,10 @@ long Table_drawRowFromDistribution (Table me, long columnNumber) {
 				sum += row -> cells [columnNumber]. number;
 				if (rand <= sum) break;
 			}
-		} while (irow > my rows -> size);   /* Guard against rounding errors. */
+		} while (irow > my rows -> size);   // guard against rounding errors
 		return irow;
 	} catch (MelderError) {
-		Melder_throw (me, ": cannot draw a row from the distribution of column ", columnNumber, ".");
+		Melder_throw (me, U": cannot draw a row from the distribution of column ", columnNumber, U".");
 	}
 }
 
@@ -674,7 +674,7 @@ Table Table_extractRowsWhereColumn_number (Table me, long columnNumber, int whic
 		Table_numericize_Assert (me, columnNumber);   // extraction should work even if cells are not defined
 		autoTable thee = Table_create (0, my numberOfColumns);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-			thy columnHeaders [icol]. label = Melder_wcsdup (my columnHeaders [icol]. label);
+			thy columnHeaders [icol]. label = Melder_dup (my columnHeaders [icol]. label);
 		}
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
@@ -684,20 +684,20 @@ Table Table_extractRowsWhereColumn_number (Table me, long columnNumber, int whic
 			}
 		}
 		if (thy rows -> size == 0) {
-			Melder_warning (L"No row matches criterion.");
+			Melder_warning (U"No row matches criterion.");
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": rows not extracted.");
+		Melder_throw (me, U": rows not extracted.");
 	}
 }
 
-Table Table_extractRowsWhereColumn_string (Table me, long columnNumber, int which_Melder_STRING, const wchar_t *criterion) {
+Table Table_extractRowsWhereColumn_string (Table me, long columnNumber, int which_Melder_STRING, const char32 *criterion) {
 	try {
 		Table_checkSpecifiedColumnNumberWithinRange (me, columnNumber);
 		autoTable thee = Table_create (0, my numberOfColumns);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-			autostring newLabel = Melder_wcsdup (my columnHeaders [icol]. label);
+			autostring32 newLabel = Melder_dup (my columnHeaders [icol]. label);
 			thy columnHeaders [icol]. label = newLabel.transfer();
 		}
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
@@ -708,33 +708,33 @@ Table Table_extractRowsWhereColumn_string (Table me, long columnNumber, int whic
 			}
 		}
 		if (thy rows -> size == 0) {
-			Melder_warning (L"No row matches criterion.");
+			Melder_warning (U"No row matches criterion.");
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": rows not extracted.");
+		Melder_throw (me, U": rows not extracted.");
 	}
 }
 
-static void Table_columns_checkExist (Table me, wchar_t **columnNames, long n) {
+static void Table_columns_checkExist (Table me, char32 **columnNames, long n) {
 	for (long i = 1; i <= n; i ++) {
 		if (Table_findColumnIndexFromColumnLabel (me, columnNames [i]) == 0)
-			Melder_throw (me, ": column \"", columnNames [i], "\" does not exist.");
+			Melder_throw (me, U": column \"", columnNames [i], U"\" does not exist.");
 	}
 }
 
-static void Table_columns_checkCrossSectionEmpty (wchar_t **factors, long nfactors, wchar_t **vars, long nvars) {
+static void Table_columns_checkCrossSectionEmpty (char32 **factors, long nfactors, char32 **vars, long nvars) {
 	for (long ifactor = 1; ifactor <= nfactors; ifactor ++) {
 		for (long ivar = 1; ivar <= nvars; ivar ++) {
-			if (wcsequ (factors [ifactor], vars [ivar]))
-				Melder_throw ("Factor \"", factors [ifactor], "\" is also used as dependent variable.");
+			if (str32equ (factors [ifactor], vars [ivar]))
+				Melder_throw (U"Factor \"", factors [ifactor], U"\" is also used as dependent variable.");
 		}
 	}
 }
 
-Table Table_collapseRows (Table me, const wchar_t *factors_string, const wchar_t *columnsToSum_string,
-	const wchar_t *columnsToAverage_string, const wchar_t *columnsToMedianize_string,
-	const wchar_t *columnsToAverageLogarithmically_string, const wchar_t *columnsToMedianizeLogarithmically_string)
+Table Table_collapseRows (Table me, const char32 *factors_string, const char32 *columnsToSum_string,
+	const char32 *columnsToAverage_string, const char32 *columnsToMedianize_string,
+	const char32 *columnsToAverageLogarithmically_string, const char32 *columnsToMedianizeLogarithmically_string)
 {
 	bool originalChanged = false;
 	try {
@@ -746,7 +746,7 @@ Table Table_collapseRows (Table me, const wchar_t *factors_string, const wchar_t
 		long numberOfFactors;
 		autoMelderTokens factors (factors_string, & numberOfFactors);
 		if (numberOfFactors < 1)
-			Melder_throw ("In order to pool table data, you must supply at least one independent variable.");
+			Melder_throw (U"In order to pool table data, you must supply at least one independent variable.");
 		Table_columns_checkExist (me, factors.peek(), numberOfFactors);
 
 		long numberToSum = 0;
@@ -907,9 +907,9 @@ Table Table_collapseRows (Table me, const wchar_t *factors_string, const wchar_t
 						double value = ((TableRow) my rows -> item [jrow]) -> cells [columns [icol]]. number;
 						if (value <= 0.0)
 							Melder_throw (
-								"The cell in column \"", columnsToAverageLogarithmically [i],
-								"\" of row ", jrow, " of ", me,
-								" is not positive.\nCannot average logarithmically.");
+								U"The cell in column \"", columnsToAverageLogarithmically [i],
+								U"\" of row ", jrow, U" of ", me,
+								U" is not positive.\nCannot average logarithmically.");
 						sum += log (value);
 					}
 					Table_setNumericValue (thee.peek(), thy rows -> size, icol, exp (sum / (rowmax - rowmin + 1)));
@@ -920,9 +920,9 @@ Table Table_collapseRows (Table me, const wchar_t *factors_string, const wchar_t
 						double value = ((TableRow) my rows -> item [jrow]) -> cells [columns [icol]]. number;
 						if (value <= 0.0)
 							Melder_throw (
-								"The cell in column \"", columnsToMedianizeLogarithmically [i],
-								"\" of row ", jrow, " of ", me,
-								" is not positive.\nCannot medianize logarithmically.");
+								U"The cell in column \"", columnsToMedianizeLogarithmically [i],
+								U"\" of row ", jrow, U" of ", me,
+								U" is not positive.\nCannot medianize logarithmically.");
 						sortingColumn [jrow] = log (value);
 					}
 					NUMsort_d (rowmax - rowmin + 1, & sortingColumn [rowmin - 1]);
@@ -942,7 +942,7 @@ Table Table_collapseRows (Table me, const wchar_t *factors_string, const wchar_t
 	}
 }
 
-static wchar_t ** _Table_getLevels (Table me, long column, long *numberOfLevels) {
+static char32 ** _Table_getLevels (Table me, long column, long *numberOfLevels) {
 	try {
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
@@ -957,12 +957,12 @@ static wchar_t ** _Table_getLevels (Table me, long column, long *numberOfLevels)
 			(*numberOfLevels) ++;
 			while (++ irow <= my rows -> size && ((TableRow) my rows -> item [irow]) -> cells [column]. number == value) { }
 		}
-		autostringvector result (1, *numberOfLevels);
+		autostring32vector result (1, *numberOfLevels);
 		*numberOfLevels = 0;
 		irow = 1;
 		while (irow <= my rows -> size) {
 			double value = ((TableRow) my rows -> item [irow]) -> cells [column]. number;
-			result [++ *numberOfLevels] = Melder_wcsdup (Table_getStringValue_Assert (me, irow, column));
+			result [++ *numberOfLevels] = Melder_dup (Table_getStringValue_Assert (me, irow, column));
 			while (++ irow <= my rows -> size && ((TableRow) my rows -> item [irow]) -> cells [column]. number == value) { }
 		}
 		sortRowsByIndex_NoError (me);   // unsort the original table
@@ -974,7 +974,7 @@ static wchar_t ** _Table_getLevels (Table me, long column, long *numberOfLevels)
 	}
 }
 
-Table Table_rowsToColumns (Table me, const wchar_t *factors_string, long columnToTranspose, const wchar_t *columnsToExpand_string) {
+Table Table_rowsToColumns (Table me, const char32 *factors_string, long columnToTranspose, const char32 *columnsToExpand_string) {
 	bool originalChanged = false;
 	try {
 		Melder_assert (factors_string != NULL);
@@ -986,15 +986,15 @@ Table Table_rowsToColumns (Table me, const wchar_t *factors_string, long columnT
 		 */
 		autoMelderTokens factors_names (factors_string, & numberOfFactors);
 		if (numberOfFactors < 1)
-			Melder_throw ("In order to nest table data, you must supply at least one independent variable.");
+			Melder_throw (U"In order to nest table data, you must supply at least one independent variable.");
 		Table_columns_checkExist (me, factors_names.peek(), numberOfFactors);
 		autoMelderTokens columnsToExpand_names (columnsToExpand_string, & numberToExpand);
 		if (numberToExpand < 1)
-			Melder_throw ("In order to nest table data, you must supply at least one dependent variable (to expand).");
+			Melder_throw (U"In order to nest table data, you must supply at least one dependent variable (to expand).");
 		Table_columns_checkExist (me, columnsToExpand_names.peek(), numberToExpand);
 		Table_columns_checkCrossSectionEmpty (factors_names.peek(), numberOfFactors, columnsToExpand_names.peek(), numberToExpand);
-		wchar_t ** dummy = _Table_getLevels (me, columnToTranspose, & numberOfLevels);
-		autostringvector levels_names (dummy, 1, numberOfLevels);
+		char32 ** dummy = _Table_getLevels (me, columnToTranspose, & numberOfLevels);
+		autostring32vector levels_names (dummy, 1, numberOfLevels);
 		/*
 		 * Get the column numbers for the factors.
 		 */
@@ -1022,17 +1022,13 @@ Table Table_rowsToColumns (Table me, const wchar_t *factors_string, long columnT
 		for (long ifactor = 1; ifactor <= numberOfFactors; ifactor ++) {
 			Table_setColumnLabel (thee.peek(), ifactor, factors_names [ifactor]);
 		}
-		autoMelderString columnLabel;
 		for (long iexpand = 1; iexpand <= numberToExpand; iexpand ++) {
 			for (long ilevel = 1; ilevel <= numberOfLevels; ilevel ++) {
-				MelderString_copy (& columnLabel, columnsToExpand_names [iexpand]);
-				MelderString_appendCharacter (& columnLabel, '.');
-				MelderString_append (& columnLabel, levels_names [ilevel]);
-				//Melder_casual ("Number of factors: %ld", numberOfFactors);
-				//Melder_casual ("Level: %ld out of %ld", ilevel, numberOfLevels);
+				//Melder_casual (U"Number of factors: ", numberOfFactors);
+				//Melder_casual (U"Level: ", ilevel, U" out of ", numberOfLevels);
 				long columnNumber = numberOfFactors + (iexpand - 1) * numberOfLevels + ilevel;
-				//Melder_casual ("Column number: %ld", columnNumber);
-				Table_setColumnLabel (thee.peek(), columnNumber, columnLabel.string);
+				//Melder_casual (U"Column number: ", columnNumber);
+				Table_setColumnLabel (thee.peek(), columnNumber, Melder_cat (columnsToExpand_names [iexpand], U".", levels_names [ilevel]));
 			}
 		}
 		/*
@@ -1069,8 +1065,8 @@ Table Table_rowsToColumns (Table me, const wchar_t *factors_string, long columnT
 			}
 			#if 0
 			if (rowmax - rowmin > numberOfLevels && ! warned) {
-				Melder_warning (L"Some rows of the original table have not been included in the new table. "
-					"You could perhaps add more factors.");
+				Melder_warning (U"Some rows of the original table have not been included in the new table. "
+					U"You could perhaps add more factors.");
 				warned = true;
 			}
 			#endif
@@ -1088,11 +1084,11 @@ Table Table_rowsToColumns (Table me, const wchar_t *factors_string, long columnT
 				for (long jrow = rowmin; jrow <= rowmax; jrow ++) {
 					TableRow myRow = static_cast <TableRow> (my rows -> item [jrow]);
 					double value = myRow -> cells [columnsToExpand [iexpand]]. number;
-					long level = myRow -> cells [columnToTranspose]. number;
+					long level = lround (myRow -> cells [columnToTranspose]. number);
 					long thyColumn = numberOfFactors + (iexpand - 1) * numberOfLevels + level;
 					if (thyRow -> cells [thyColumn]. string != NULL && ! warned) {
-						Melder_warning (L"Some information from the original table has not been included in the new table. "
-							"You could perhaps add more factors.");
+						Melder_warning (U"Some information from the original table has not been included in the new table. "
+							U"You could perhaps add more factors.");
 						warned = true;
 					}
 					Table_setNumericValue (thee.peek(), thy rows -> size, thyColumn, value);
@@ -1122,7 +1118,7 @@ Table Table_transpose (Table me) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not transposed.");
+		Melder_throw (me, U": not transposed.");
 	}
 }
 
@@ -1146,21 +1142,21 @@ void Table_sortRows_Assert (Table me, long *columns, long numberOfColumns) {
 	qsort (& my rows -> item [1], (unsigned long) my rows -> size, sizeof (TableRow), cellCompare_NoError);
 }
 
-void Table_sortRows_string (Table me, const wchar_t *columns_string) {
+void Table_sortRows_string (Table me, const char32 *columns_string) {
 	try {
 		long numberOfColumns;
 		autoMelderTokens columns_tokens (columns_string, & numberOfColumns);
 		if (numberOfColumns < 1)
-			Melder_throw (me, ": you specified an empty list of columns.");
+			Melder_throw (me, U": you specified an empty list of columns.");
 		autoNUMvector <long> columns (1, numberOfColumns);
 		for (long icol = 1; icol <= numberOfColumns; icol ++) {
 			columns [icol] = Table_findColumnIndexFromColumnLabel (me, columns_tokens [icol]);
 			if (columns [icol] == 0)
-				Melder_throw ("Column \"", columns_tokens [icol], L"\" does not exist.");
+				Melder_throw (U"Column \"", columns_tokens [icol], U"\" does not exist.");
 		}
 		Table_sortRows_Assert (me, columns.peek(), numberOfColumns);
 	} catch (MelderError) {
-		Melder_throw (me, ": rows not sorted.");
+		Melder_throw (me, U": rows not sorted.");
 	}
 }
 
@@ -1184,7 +1180,7 @@ void Table_reflectRows (Table me) {
 
 Table Tables_append (Collection me) {
 	try {
-		if (my size == 0) Melder_throw ("Cannot add zero tables.");
+		if (my size == 0) Melder_throw (U"Cannot add zero tables.");
 		Table thee = static_cast <Table> (my item [1]);
 		long nrow = thy rows -> size;
 		long ncol = thy numberOfColumns;
@@ -1193,12 +1189,12 @@ Table Tables_append (Collection me) {
 			thee = static_cast <Table> (my item [itab]);
 			nrow += thy rows -> size;
 			if (thy numberOfColumns != ncol)
-				Melder_throw ("Numbers of columns do not match.");
+				Melder_throw (U"Numbers of columns do not match.");
 			for (long icol = 1; icol <= ncol; icol ++) {
-				if (! Melder_wcsequ (thy columnHeaders [icol]. label, firstTable -> columnHeaders [icol]. label))
-					Melder_throw ("The label of column ", icol, " of ", thee,
-						" (", thy columnHeaders [icol]. label, L") does not match the label of column ", icol,
-						" of ", firstTable, " (", firstTable -> columnHeaders [icol]. label, ").");
+				if (! Melder_equ (thy columnHeaders [icol]. label, firstTable -> columnHeaders [icol]. label))
+					Melder_throw (U"The label of column ", icol, U" of ", thee,
+						U" (", thy columnHeaders [icol]. label, U") does not match the label of column ", icol,
+						U" of ", firstTable, U" (", firstTable -> columnHeaders [icol]. label, U").");
 			}
 		}
 		autoTable him = Table_createWithoutColumnNames (nrow, ncol);
@@ -1217,11 +1213,11 @@ Table Tables_append (Collection me) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Table objects not appended.");
+		Melder_throw (U"Table objects not appended.");
 	}
 }
 
-void Table_appendSumColumn (Table me, long column1, long column2, const wchar_t *label) {   // safe
+void Table_appendSumColumn (Table me, long column1, long column2, const char32 *label) {   // safe
 	try {
 		/*
 		 * Check without change.
@@ -1252,11 +1248,11 @@ void Table_appendSumColumn (Table me, long column1, long column2, const wchar_t
 			thyCell -> string = NULL;   // ...undangle
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": sum column not appended.");
+		Melder_throw (me, U": sum column not appended.");
 	}
 }
 
-void Table_appendDifferenceColumn (Table me, long column1, long column2, const wchar_t *label) {   // safe
+void Table_appendDifferenceColumn (Table me, long column1, long column2, const char32 *label) {   // safe
 	try {
 		/*
 		 * Check without change.
@@ -1287,11 +1283,11 @@ void Table_appendDifferenceColumn (Table me, long column1, long column2, const w
 			thyCell -> string = NULL;   // ...undangle
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": difference column not appended.");
+		Melder_throw (me, U": difference column not appended.");
 	}
 }
 
-void Table_appendProductColumn (Table me, long column1, long column2, const wchar_t *label) {   // safe
+void Table_appendProductColumn (Table me, long column1, long column2, const char32 *label) {   // safe
 	try {
 		/*
 		 * Check without change.
@@ -1322,11 +1318,11 @@ void Table_appendProductColumn (Table me, long column1, long column2, const wcha
 			thyCell -> string = NULL;   // ...undangle
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": product column not appended.");
+		Melder_throw (me, U": product column not appended.");
 	}
 }
 
-void Table_appendQuotientColumn (Table me, long column1, long column2, const wchar_t *label) {   // safe
+void Table_appendQuotientColumn (Table me, long column1, long column2, const char32 *label) {   // safe
 	try {
 		/*
 		 * Check without change.
@@ -1359,15 +1355,15 @@ void Table_appendQuotientColumn (Table me, long column1, long column2, const wch
 			thyCell -> string = NULL;   // ...undangle
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": quotient column not appended.");
+		Melder_throw (me, U": quotient column not appended.");
 	}
 }
 
-void Table_formula_columnRange (Table me, long fromColumn, long toColumn, const wchar_t *expression, Interpreter interpreter) {
+void Table_formula_columnRange (Table me, long fromColumn, long toColumn, const char32 *expression, Interpreter interpreter) {
 	try {
 		Table_checkSpecifiedColumnNumberWithinRange (me, fromColumn);
 		Table_checkSpecifiedColumnNumberWithinRange (me, toColumn);
-		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_UNKNOWN, TRUE);
+		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_UNKNOWN, true);
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			for (long icol = fromColumn; icol <= toColumn; icol ++) {
 				struct Formula_Result result;
@@ -1378,18 +1374,18 @@ void Table_formula_columnRange (Table me, long fromColumn, long toColumn, const
 				} else if (result. expressionType == kFormula_EXPRESSION_TYPE_NUMERIC) {
 					Table_setNumericValue (me, irow, icol, result. result.numericResult);
 				} else if (result. expressionType == kFormula_EXPRESSION_TYPE_NUMERIC_ARRAY) {
-					Melder_throw (me, ": cannot put arrays into cells.");
+					Melder_throw (me, U": cannot put arrays into cells.");
 				} else if (result. expressionType == kFormula_EXPRESSION_TYPE_STRING_ARRAY) {
-					Melder_throw (me, ": cannot put arrays into cells.");
+					Melder_throw (me, U": cannot put arrays into cells.");
 				}
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": application of formula not completed.");
+		Melder_throw (me, U": application of formula not completed.");
 	}
 }
 
-void Table_formula (Table me, long icol, const wchar_t *expression, Interpreter interpreter) {
+void Table_formula (Table me, long icol, const char32 *expression, Interpreter interpreter) {
 	Table_formula_columnRange (me, icol, icol, expression, interpreter);
 }
 
@@ -1479,7 +1475,7 @@ double Table_getCorrelation_kendallTau (Table me, long column1, long column2, do
 	if ((out_significance || out_lowerLimit || out_upperLimit) && NUMdefined (correlation) && n >= 2) {
 		double standardError = sqrt ((4 * n + 10.0) / (9 * n * (n - 1)));
 		if (out_significance)
-			*out_significance = NUMgaussQ (fabs (correlation) / standardError);   /* One-sided. */
+			*out_significance = NUMgaussQ (fabs (correlation) / standardError);   // one-sided
 		if (out_lowerLimit)
 			*out_lowerLimit = correlation - NUMinvGaussQ (significanceLevel) * standardError;
 		if (out_upperLimit)
@@ -1567,7 +1563,7 @@ double Table_getMean_studentT (Table me, long column, double significanceLevel,
 	return mean;
 }
 
-double Table_getGroupMean_studentT (Table me, long column, long groupColumn, const wchar_t *group, double significanceLevel,
+double Table_getGroupMean_studentT (Table me, long column, long groupColumn, const char32 *group, double significanceLevel,
 	double *out_tFromZero, double *out_numberOfDegreesOfFreedom, double *out_significanceFromZero, double *out_lowerLimit, double *out_upperLimit)
 {
 	if (out_tFromZero) *out_tFromZero = NUMundefined;
@@ -1582,7 +1578,7 @@ double Table_getGroupMean_studentT (Table me, long column, long groupColumn, con
 	for (long irow = 1; irow <= my rows -> size; irow ++) {
 		TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 		if (row -> cells [groupColumn]. string != NULL) {
-			if (wcsequ (row -> cells [groupColumn]. string, group)) {
+			if (str32equ (row -> cells [groupColumn]. string, group)) {
 				n += 1;
 				sum += row -> cells [column]. number;
 			}
@@ -1597,7 +1593,7 @@ double Table_getGroupMean_studentT (Table me, long column, long groupColumn, con
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 			if (row -> cells [groupColumn]. string != NULL) {
-				if (wcsequ (row -> cells [groupColumn]. string, group)) {
+				if (str32equ (row -> cells [groupColumn]. string, group)) {
 					double diff = row -> cells [column]. number - mean;
 					sumOfSquares += diff * diff;
 				}
@@ -1615,7 +1611,7 @@ double Table_getGroupMean_studentT (Table me, long column, long groupColumn, con
 	return mean;
 }
 
-double Table_getGroupDifference_studentT (Table me, long column, long groupColumn, const wchar_t *group1, const wchar_t *group2, double significanceLevel,
+double Table_getGroupDifference_studentT (Table me, long column, long groupColumn, const char32 *group1, const char32 *group2, double significanceLevel,
 	double *out_tFromZero, double *out_numberOfDegreesOfFreedom, double *out_significanceFromZero, double *out_lowerLimit, double *out_upperLimit)
 {
 	if (out_tFromZero) *out_tFromZero = NUMundefined;
@@ -1631,10 +1627,10 @@ double Table_getGroupDifference_studentT (Table me, long column, long groupColum
 	for (long irow = 1; irow <= my rows -> size; irow ++) {
 		TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 		if (row -> cells [groupColumn]. string != NULL) {
-			if (wcsequ (row -> cells [groupColumn]. string, group1)) {
+			if (str32equ (row -> cells [groupColumn]. string, group1)) {
 				n1 ++;
 				sum1 += row -> cells [column]. number;
-			} else if (wcsequ (row -> cells [groupColumn]. string, group2)) {
+			} else if (str32equ (row -> cells [groupColumn]. string, group2)) {
 				n2 ++;
 				sum2 += row -> cells [column]. number;
 			}
@@ -1651,10 +1647,10 @@ double Table_getGroupDifference_studentT (Table me, long column, long groupColum
 		for (long irow = 1; irow <= my rows -> size; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 			if (row -> cells [groupColumn]. string != NULL) {
-				if (wcsequ (row -> cells [groupColumn]. string, group1)) {
+				if (str32equ (row -> cells [groupColumn]. string, group1)) {
 					double diff = row -> cells [column]. number - mean1;
 					sumOfSquares += diff * diff;
-				} else if (wcsequ (row -> cells [groupColumn]. string, group2)) {
+				} else if (str32equ (row -> cells [groupColumn]. string, group2)) {
 					double diff = row -> cells [column]. number - mean2;
 					sumOfSquares += diff * diff;
 				}
@@ -1672,7 +1668,7 @@ double Table_getGroupDifference_studentT (Table me, long column, long groupColum
 	return difference;
 }
 
-double Table_getGroupDifference_wilcoxonRankSum (Table me, long column, long groupColumn, const wchar_t *group1, const wchar_t *group2,
+double Table_getGroupDifference_wilcoxonRankSum (Table me, long column, long groupColumn, const char32 *group1, const char32 *group2,
 	double *out_rankSum, double *out_significanceFromZero)
 {
 	if (out_rankSum) *out_rankSum = NUMundefined;
@@ -1684,9 +1680,9 @@ double Table_getGroupDifference_wilcoxonRankSum (Table me, long column, long gro
 	for (long irow = 1; irow <= my rows -> size; irow ++) {
 		TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 		if (row -> cells [groupColumn]. string != NULL) {
-			if (wcsequ (row -> cells [groupColumn]. string, group1)) {
+			if (str32equ (row -> cells [groupColumn]. string, group1)) {
 				n1 ++;
-			} else if (wcsequ (row -> cells [groupColumn]. string, group2)) {
+			} else if (str32equ (row -> cells [groupColumn]. string, group2)) {
 				n2 ++;
 			}
 		}
@@ -1697,10 +1693,10 @@ double Table_getGroupDifference_wilcoxonRankSum (Table me, long column, long gro
 	for (long irow = 1, jrow = 0; irow <= my rows -> size; irow ++) {
 		TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 		if (row -> cells [groupColumn]. string != NULL) {
-			if (wcsequ (row -> cells [groupColumn]. string, group1)) {
+			if (str32equ (row -> cells [groupColumn]. string, group1)) {
 				Table_setNumericValue (ranks, ++ jrow, 1, 1.0);
 				Table_setNumericValue (ranks, jrow, 2, row -> cells [column]. number);
-			} else if (wcsequ (row -> cells [groupColumn]. string, group2)) {
+			} else if (str32equ (row -> cells [groupColumn]. string, group2)) {
 				Table_setNumericValue (ranks, ++ jrow, 1, 2.0);
 				Table_setNumericValue (ranks, jrow, 2, row -> cells [column]. number);
 			}
@@ -1765,7 +1761,7 @@ bool Table_getExtrema (Table me, long icol, double *minimum, double *maximum) {
 }
 
 void Table_scatterPlot_mark (Table me, Graphics g, long xcolumn, long ycolumn,
-	double xmin, double xmax, double ymin, double ymax, double markSize_mm, const wchar_t *mark, int garnish)
+	double xmin, double xmax, double ymin, double ymax, double markSize_mm, const char32 *mark, int garnish)
 {
 	long n = my rows -> size, irow;
 	if (xcolumn < 1 || xcolumn > my numberOfColumns || ycolumn < 1 || ycolumn > my numberOfColumns) return;
@@ -1790,12 +1786,12 @@ void Table_scatterPlot_mark (Table me, Graphics g, long xcolumn, long ycolumn,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, TRUE, TRUE, FALSE);
+		Graphics_marksBottom (g, 2, true, true, false);
 		if (my columnHeaders [xcolumn]. label)
-			Graphics_textBottom (g, TRUE, my columnHeaders [xcolumn]. label);
-		Graphics_marksLeft (g, 2, TRUE, TRUE, FALSE);
+			Graphics_textBottom (g, true, my columnHeaders [xcolumn]. label);
+		Graphics_marksLeft (g, 2, true, true, false);
 		if (my columnHeaders [ycolumn]. label)
-			Graphics_textLeft (g, TRUE, my columnHeaders [ycolumn]. label);
+			Graphics_textLeft (g, true, my columnHeaders [ycolumn]. label);
 	}
 }
 
@@ -1822,7 +1818,7 @@ void Table_scatterPlot (Table me, Graphics g, long xcolumn, long ycolumn,
 	Graphics_setFontSize (g, fontSize);
 	for (long irow = 1; irow <= n; irow ++) {
 		TableRow row = static_cast <TableRow> (my rows -> item [irow]);
-		const wchar_t *mark = row -> cells [markColumn]. string;
+		const char32 *mark = row -> cells [markColumn]. string;
 		if (mark)
 			Graphics_text (g, row -> cells [xcolumn]. number, row -> cells [ycolumn]. number, mark);
 	}
@@ -1830,12 +1826,12 @@ void Table_scatterPlot (Table me, Graphics g, long xcolumn, long ycolumn,
 	Graphics_unsetInner (g);
 	if (garnish) {
 		Graphics_drawInnerBox (g);
-		Graphics_marksBottom (g, 2, TRUE, TRUE, FALSE);
+		Graphics_marksBottom (g, 2, true, true, false);
 		if (my columnHeaders [xcolumn]. label)
-			Graphics_textBottom (g, TRUE, my columnHeaders [xcolumn]. label);
-		Graphics_marksLeft (g, 2, TRUE, TRUE, FALSE);
+			Graphics_textBottom (g, true, my columnHeaders [xcolumn]. label);
+		Graphics_marksLeft (g, 2, true, true, false);
 		if (my columnHeaders [ycolumn]. label)
-			Graphics_textLeft (g, TRUE, my columnHeaders [ycolumn]. label);
+			Graphics_textLeft (g, true, my columnHeaders [ycolumn]. label);
 	}
 }
 
@@ -1866,91 +1862,91 @@ void Table_drawEllipse_e (Table me, Graphics g, long xcolumn, long ycolumn,
 	}
 }
 
-static const wchar_t *visibleString (const wchar_t *s) {
-	return s != NULL && s [0] != '\0' ? s : L"?";
+static const char32 *visibleString (const char32 *s) {
+	return s != NULL && s [0] != U'\0' ? s : U"?";
 }
 
 void Table_list (Table me, bool includeRowNumbers) {
 	MelderInfo_open ();
 	if (includeRowNumbers) {
-		MelderInfo_write (L"row");
-		if (my numberOfColumns > 0) MelderInfo_write (L"\t");
+		MelderInfo_write (U"row");
+		if (my numberOfColumns > 0) MelderInfo_write (U"\t");
 	}
 	for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-		if (icol > 1) MelderInfo_write (L"\t");
+		if (icol > 1) MelderInfo_write (U"\t");
 		MelderInfo_write (visibleString (my columnHeaders [icol]. label));
 	}
-	MelderInfo_write (L"\n");
+	MelderInfo_write (U"\n");
 	for (long irow = 1; irow <= my rows -> size; irow ++) {
 		if (includeRowNumbers) {
-			MelderInfo_write (Melder_integer (irow));
-			if (my numberOfColumns > 0) MelderInfo_write (L"\t");
+			MelderInfo_write (irow);
+			if (my numberOfColumns > 0) MelderInfo_write (U"\t");
 		}
 		TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-			if (icol > 1) MelderInfo_write (L"\t");
+			if (icol > 1) MelderInfo_write (U"\t");
 			MelderInfo_write (visibleString (row -> cells [icol]. string));
 		}
-		MelderInfo_write (L"\n");
+		MelderInfo_write (U"\n");
 	}
 	MelderInfo_close ();
 }
 
-static void _Table_writeToCharacterSeparatedFile (Table me, MelderFile file, wchar_t kar) {
+static void _Table_writeToCharacterSeparatedFile (Table me, MelderFile file, char32 kar) {
 	autoMelderString buffer;
 	for (long icol = 1; icol <= my numberOfColumns; icol ++) {
 		if (icol != 1) MelderString_appendCharacter (& buffer, kar);
-		wchar_t *s = my columnHeaders [icol]. label;
-		MelderString_append (& buffer, s != NULL && s [0] != '\0' ? s : L"?");
+		char32 *s = my columnHeaders [icol]. label;
+		MelderString_append (& buffer, s != NULL && s [0] != U'\0' ? s : U"?");
 	}
 	MelderString_appendCharacter (& buffer, '\n');
 	for (long irow = 1; irow <= my rows -> size; irow ++) {
 		TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
 			if (icol != 1) MelderString_appendCharacter (& buffer, kar);
-			wchar_t *s = row -> cells [icol]. string;
-			MelderString_append (& buffer, s != NULL && s [0] != '\0' ? s : L"?");
+			char32 *s = row -> cells [icol]. string;
+			MelderString_append (& buffer, s != NULL && s [0] != U'\0' ? s : U"?");
 		}
-		MelderString_appendCharacter (& buffer, '\n');
+		MelderString_appendCharacter (& buffer, U'\n');
 	}
 	MelderFile_writeText (file, buffer.string, Melder_getOutputEncoding ());
 }
 
 void Table_writeToTabSeparatedFile (Table me, MelderFile file) {
 	try {
-		_Table_writeToCharacterSeparatedFile (me, file, '\t');
+		_Table_writeToCharacterSeparatedFile (me, file, U'\t');
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to tab-separated file.");
+		Melder_throw (me, U": not written to tab-separated file.");
 	}
 }
 
 void Table_writeToCommaSeparatedFile (Table me, MelderFile file) {
 	try {
-		_Table_writeToCharacterSeparatedFile (me, file, ',');
+		_Table_writeToCharacterSeparatedFile (me, file, U',');
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to comma-separated file.");
+		Melder_throw (me, U": not written to comma-separated file.");
 	}
 }
 
 Table Table_readFromTableFile (MelderFile file) {
 	Table me = NULL;
 	try {
-		autostring string = MelderFile_readText (file);
+		autostring32 string = MelderFile_readText (file);
 		long nrow, ncol, nelements;
 		/*
 		 * Count columns.
 		 */
 		ncol = 0;
-		wchar_t *p = & string [0];
+		char32 *p = & string [0];
 		for (;;) {
-			wchar_t kar = *p++;
-			if (kar == '\n' || kar == '\0') break;
-			if (kar == ' ' || kar == '\t') continue;
+			char32 kar = *p++;
+			if (kar == U'\n' || kar == U'\0') break;
+			if (kar == U' ' || kar == U'\t') continue;
 			ncol ++;
-			do { kar = *p++; } while (kar != ' ' && kar != '\t' && kar != '\n' && kar != '\0');
-			if (kar == '\n' || kar == '\0') break;
+			do { kar = *p++; } while (kar != U' ' && kar != U'\t' && kar != U'\n' && kar != U'\0');
+			if (kar == U'\n' || kar == U'\0') break;
 		}
-		if (ncol < 1) Melder_throw ("No columns.");
+		if (ncol < 1) Melder_throw (U"No columns.");
 
 		/*
 		 * Count elements.
@@ -1958,19 +1954,19 @@ Table Table_readFromTableFile (MelderFile file) {
 		p = & string [0];
 		nelements = 0;
 		for (;;) {
-			wchar_t kar = *p++;
-			if (kar == '\0') break;
-			if (kar == ' ' || kar == '\t' || kar == '\n') continue;
+			char32 kar = *p++;
+			if (kar == U'\0') break;
+			if (kar == U' ' || kar == U'\t' || kar == U'\n') continue;
 			nelements ++;
-			do { kar = *p++; } while (kar != ' ' && kar != '\t' && kar != '\n' && kar != '\0');
-			if (kar == '\0') break;
+			do { kar = *p++; } while (kar != U' ' && kar != U'\t' && kar != U'\n' && kar != U'\0');
+			if (kar == U'\0') break;
 		}
 
 		/*
 		 * Check if all columns are complete.
 		 */
 		if (nelements == 0 || nelements % ncol != 0)
-			Melder_throw ("The number of elements (", nelements, ") is not a multiple of the number of columns (", ncol, ").");
+			Melder_throw (U"The number of elements (", nelements, U") is not a multiple of the number of columns (", ncol, U").");
 
 		/*
 		 * Create empty table.
@@ -1983,49 +1979,49 @@ Table Table_readFromTableFile (MelderFile file) {
 		 */
 		p = & string [0];
 		for (long icol = 1; icol <= ncol; icol ++) {
-			while (*p == ' ' || *p == '\t') { Melder_assert (*p != '\0'); p ++; }
-			static MelderString buffer = { 0 };
+			while (*p == U' ' || *p == U'\t') { Melder_assert (*p != U'\0'); p ++; }
+			static MelderString buffer { 0 };
 			MelderString_empty (& buffer);
-			while (*p != ' ' && *p != '\t' && *p != '\n') { MelderString_appendCharacter (& buffer, *p); p ++; }
+			while (*p != U' ' && *p != U'\t' && *p != U'\n') { MelderString_appendCharacter (& buffer, *p); p ++; }
 			Table_setColumnLabel (me, icol, buffer.string);
 			MelderString_empty (& buffer);
 		}
 		for (long irow = 1; irow <= nrow; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 			for (long icol = 1; icol <= ncol; icol ++) {
-				while (*p == ' ' || *p == '\t' || *p == '\n') { Melder_assert (*p != '\0'); p ++; }
-				static MelderString buffer = { 0 };
+				while (*p == U' ' || *p == U'\t' || *p == U'\n') { Melder_assert (*p != U'\0'); p ++; }
+				static MelderString buffer { 0 };
 				MelderString_empty (& buffer);
-				while (*p != ' ' && *p != '\t' && *p != '\n' && *p != '\0') { MelderString_appendCharacter (& buffer, *p); p ++; }
-				row -> cells [icol]. string = Melder_wcsdup_f (buffer.string);
+				while (*p != U' ' && *p != U'\t' && *p != U'\n' && *p != U'\0') { MelderString_appendCharacter (& buffer, *p); p ++; }
+				row -> cells [icol]. string = Melder_dup_f (buffer.string);
 				MelderString_empty (& buffer);
 			}
 		}
 		return me;
 	} catch (MelderError) {
 		forget (me);
-		Melder_throw ("Table object not read from space-separated text file ", file, ".");
+		Melder_throw (U"Table object not read from space-separated text file ", file, U".");
 	}
 }
 
-Table Table_readFromCharacterSeparatedTextFile (MelderFile file, wchar_t separator) {
+Table Table_readFromCharacterSeparatedTextFile (MelderFile file, char32 separator) {
 	try {
-		autostring string = MelderFile_readText (file);
+		autostring32 string = MelderFile_readText (file);
 
 		/*
 		 * Kill final new-line symbols.
 		 */
-		for (long length = wcslen (string.peek()); length > 0 && string [length - 1] == '\n'; length = wcslen (string.peek())) string [length - 1] = '\0';
+		for (int64 length = str32len (string.peek()); length > 0 && string [length - 1] == U'\n'; length = str32len (string.peek())) string [length - 1] = U'\0';
 
 		/*
 		 * Count columns.
 		 */
 		long ncol = 1;
-		const wchar_t *p = & string [0];
+		const char32 *p = & string [0];
 		for (;;) {
-			wchar_t kar = *p++;
-			if (kar == '\0') Melder_throw (L"No rows.");
-			if (kar == '\n') break;
+			char32 kar = *p++;
+			if (kar == U'\0') Melder_throw (U"No rows.");
+			if (kar == U'\n') break;
 			if (kar == separator) ncol ++;
 		}
 
@@ -2034,9 +2030,9 @@ Table Table_readFromCharacterSeparatedTextFile (MelderFile file, wchar_t separat
 		 */
 		long nrow = 1;
 		for (;;) {
-			wchar_t kar = *p++;
-			if (kar == '\0') break;
-			if (kar == '\n') nrow ++;
+			char32 kar = *p++;
+			if (kar == U'\0') break;
+			if (kar == U'\n') nrow ++;
 		}
 
 		/*
@@ -2047,18 +2043,17 @@ Table Table_readFromCharacterSeparatedTextFile (MelderFile file, wchar_t separat
 		/*
 		 * Read column names.
 		 */
+		autoMelderString buffer;
 		p = & string [0];
 		for (long icol = 1; icol <= ncol; icol ++) {
-			static MelderString buffer = { 0 };
 			MelderString_empty (& buffer);
-			while (*p != separator && *p != '\n') {
-				Melder_assert (*p != '\0');
+			while (*p != separator && *p != U'\n') {
+				Melder_assert (*p != U'\0');
 				MelderString_appendCharacter (& buffer, *p);
 				p ++;
 			}
 			p ++;
 			Table_setColumnLabel (me.peek(), icol, buffer.string);
-			MelderString_empty (& buffer);
 		}
 
 		/*
@@ -2067,29 +2062,27 @@ Table Table_readFromCharacterSeparatedTextFile (MelderFile file, wchar_t separat
 		for (long irow = 1; irow <= nrow; irow ++) {
 			TableRow row = static_cast <TableRow> (my rows -> item [irow]);
 			for (long icol = 1; icol <= ncol; icol ++) {
-				static MelderString buffer = { 0 };
 				MelderString_empty (& buffer);
-				while (*p != separator && *p != '\n' && *p != '\0') {
+				while (*p != separator && *p != U'\n' && *p != U'\0') {
 					MelderString_appendCharacter (& buffer, *p);
 					p ++;
 				}
-				if (*p == '\0') {
-					if (irow != nrow) Melder_fatal ("irow %ld, nrow %ld, icol %ld, ncol %ld", irow, nrow, icol, ncol);
-					if (icol != ncol) Melder_throw ("Last row incomplete.");
-				} else if (*p == '\n') {
-					if (icol != ncol) Melder_throw ("Row ", irow, " incomplete.");
+				if (*p == U'\0') {
+					if (irow != nrow) Melder_fatal (U"irow ", irow, U", nrow ", nrow, U", icol ", icol, U", ncol ", ncol);
+					if (icol != ncol) Melder_throw (U"Last row incomplete.");
+				} else if (*p == U'\n') {
+					if (icol != ncol) Melder_throw (U"Row ", irow, U" incomplete.");
 					p ++;
 				} else {
 					Melder_assert (*p == separator);
 					p ++;
 				}
-				row -> cells [icol]. string = Melder_wcsdup (buffer.string);
-				MelderString_empty (& buffer);
+				row -> cells [icol]. string = Melder_dup (buffer.string);   // BUG? could be NULL
 			}
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Table object not read from character-separated text file ", file, ".");
+		Melder_throw (U"Table object not read from character-separated text file ", file, U".");
 	}
 }
 
diff --git a/stat/Table.h b/stat/Table.h
index d8352be..14bc982 100644
--- a/stat/Table.h
+++ b/stat/Table.h
@@ -2,7 +2,7 @@
 #define _Table_h_
 /* Table.h
  *
- * Copyright (C) 2002-2011,2012,2014 Paul Boersma
+ * Copyright (C) 2002-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,44 +24,44 @@
 #include "Interpreter_decl.h"
 
 #include "Table_def.h"
-oo_CLASS_CREATE (TableRow, Data);
-oo_CLASS_CREATE (Table, Data);
+oo_CLASS_CREATE (TableRow, Daata);
+oo_CLASS_CREATE (Table, Daata);
 
-void Table_initWithColumnNames (Table me, long numberOfRows, const wchar_t *columnNames);
-Table Table_createWithColumnNames (long numberOfRows, const wchar_t *columnNames);
+void Table_initWithColumnNames (Table me, long numberOfRows, const char32 *columnNames);
+Table Table_createWithColumnNames (long numberOfRows, const char32 *columnNames);
 void Table_initWithoutColumnNames (Table me, long numberOfRows, long numberOfColumns);
 Table Table_createWithoutColumnNames (long numberOfRows, long numberOfColumns);
 #define Table_create Table_createWithoutColumnNames
 
 Table Tables_append (Collection me);
 void Table_appendRow (Table me);
-void Table_appendColumn (Table me, const wchar_t *label);
-void Table_appendSumColumn (Table me, long column1, long column2, const wchar_t *label);
-void Table_appendDifferenceColumn (Table me, long column1, long column2, const wchar_t *label);
-void Table_appendProductColumn (Table me, long column1, long column2, const wchar_t *label);
-void Table_appendQuotientColumn (Table me, long column1, long column2, const wchar_t *label);
+void Table_appendColumn (Table me, const char32 *label);
+void Table_appendSumColumn (Table me, long column1, long column2, const char32 *label);
+void Table_appendDifferenceColumn (Table me, long column1, long column2, const char32 *label);
+void Table_appendProductColumn (Table me, long column1, long column2, const char32 *label);
+void Table_appendQuotientColumn (Table me, long column1, long column2, const char32 *label);
 void Table_removeRow (Table me, long row);
 void Table_removeColumn (Table me, long column);
 void Table_insertRow (Table me, long row);
-void Table_insertColumn (Table me, long column, const wchar_t *label);
-void Table_setColumnLabel (Table me, long column, const wchar_t *label);
-long Table_findColumnIndexFromColumnLabel (Table me, const wchar_t *label);
-long Table_getColumnIndexFromColumnLabel (Table me, const wchar_t *columnLabel);
-long * Table_getColumnIndicesFromColumnLabelString (Table me, const wchar_t *string, long *numberOfTokens);
-long Table_searchColumn (Table me, long column, const wchar_t *value);
+void Table_insertColumn (Table me, long column, const char32 *label /* cattable */);
+void Table_setColumnLabel (Table me, long column, const char32 *label /* cattable */);
+long Table_findColumnIndexFromColumnLabel (Table me, const char32 *label);
+long Table_getColumnIndexFromColumnLabel (Table me, const char32 *columnLabel);
+long * Table_getColumnIndicesFromColumnLabelString (Table me, const char32 *string, long *numberOfTokens);
+long Table_searchColumn (Table me, long column, const char32 *value);
 
 /*
  * Procedure for reading strings or numbers from table cells:
  * use the following two calls exclusively.
  */
-const wchar_t * Table_getStringValue_Assert (Table me, long row, long column);
+const char32 * Table_getStringValue_Assert (Table me, long row, long column);
 double Table_getNumericValue_Assert (Table me, long row, long column);
 
 /*
  * Procedure for writing strings or numbers into table cells:
  * use the following two calls exclusively.
  */
-void Table_setStringValue (Table me, long row, long column, const wchar_t *value);
+void Table_setStringValue (Table me, long rowNumber, long columnNumber, const char32 *value /* cattable */);
 void Table_setNumericValue (Table me, long row, long column, double value);
 
 /* For optimizations only (e.g. conversion to Matrix or TableOfReal). */
@@ -71,7 +71,7 @@ double Table_getQuantile (Table me, long column, double quantile);
 double Table_getMean (Table me, long column);
 double Table_getMaximum (Table me, long icol);
 double Table_getMinimum (Table me, long icol);
-double Table_getGroupMean (Table me, long column, long groupColumn, const wchar_t *group);
+double Table_getGroupMean (Table me, long column, long groupColumn, const char32 *group);
 double Table_getStdev (Table me, long column);
 long Table_drawRowFromDistribution (Table me, long column);
 double Table_getCorrelation_pearsonR (Table me, long column1, long column2, double significanceLevel,
@@ -82,28 +82,28 @@ double Table_getMean_studentT (Table me, long column, double significanceLevel,
 	double *out_tFromZero, double *out_numberOfDegreesOfFreedom, double *out_significanceFromZero, double *out_lowerLimit, double *out_upperLimit);
 double Table_getDifference_studentT (Table me, long column1, long column2, double significanceLevel,
 	double *out_t, double *out_numberOfDegreesOfFreedom, double *out_significance, double *out_lowerLimit, double *out_upperLimit);
-double Table_getGroupMean_studentT (Table me, long column, long groupColumn, const wchar_t *group1, double significanceLevel,
+double Table_getGroupMean_studentT (Table me, long column, long groupColumn, const char32 *group1, double significanceLevel,
 	double *out_tFromZero, double *out_numberOfDegreesOfFreedom, double *out_significanceFromZero, double *out_lowerLimit, double *out_upperLimit);
-double Table_getGroupDifference_studentT (Table me, long column, long groupColumn, const wchar_t *group1, const wchar_t *group2, double significanceLevel,
+double Table_getGroupDifference_studentT (Table me, long column, long groupColumn, const char32 *group1, const char32 *group2, double significanceLevel,
 	double *out_tFromZero, double *out_numberOfDegreesOfFreedom, double *out_significanceFromZero, double *out_lowerLimit, double *out_upperLimit);
-double Table_getGroupDifference_wilcoxonRankSum (Table me, long column, long groupColumn, const wchar_t *group1, const wchar_t *group2,
+double Table_getGroupDifference_wilcoxonRankSum (Table me, long column, long groupColumn, const char32 *group1, const char32 *group2,
 	double *out_rankSum, double *out_significanceFromZero);
 double Table_getVarianceRatio (Table me, long column1, long column2, double significanceLevel,
 	double *out_significance, double *out_lowerLimit, double *out_upperLimit);
 bool Table_getExtrema (Table me, long icol, double *minimum, double *maximum);
 
-void Table_formula (Table me, long column, const wchar_t *formula, Interpreter interpreter);
-void Table_formula_columnRange (Table me, long column1, long column2, const wchar_t *expression, Interpreter interpreter);
+void Table_formula (Table me, long column, const char32 *formula, Interpreter interpreter);
+void Table_formula_columnRange (Table me, long column1, long column2, const char32 *expression, Interpreter interpreter);
 
 void Table_sortRows_Assert (Table me, long *columns, long numberOfColumns);
-void Table_sortRows_string (Table me, const wchar_t *columns_string);
+void Table_sortRows_string (Table me, const char32 *columns_string);
 void Table_randomizeRows (Table me);
 void Table_reflectRows (Table me);
 
 void Table_scatterPlot (Table me, Graphics g, long xcolumn, long ycolumn,
 	double xmin, double xmax, double ymin, double ymax, long markColumn, int fontSize, int garnish);
 void Table_scatterPlot_mark (Table me, Graphics g, long xcolumn, long ycolumn,
-	double xmin, double xmax, double ymin, double ymax, double markSize_mm, const wchar_t *mark, int garnish);
+	double xmin, double xmax, double ymin, double ymax, double markSize_mm, const char32 *mark, int garnish);
 void Table_drawEllipse_e (Table me, Graphics g, long xcolumn, long ycolumn,
 	double xmin, double xmax, double ymin, double ymax, double numberOfSigmas, int garnish);
 
@@ -111,14 +111,14 @@ void Table_list (Table me, bool includeRowNumbers);
 void Table_writeToTabSeparatedFile (Table me, MelderFile file);
 void Table_writeToCommaSeparatedFile (Table me, MelderFile file);
 Table Table_readFromTableFile (MelderFile file);
-Table Table_readFromCharacterSeparatedTextFile (MelderFile file, wchar_t separator);
+Table Table_readFromCharacterSeparatedTextFile (MelderFile file, char32 separator);
 
 Table Table_extractRowsWhereColumn_number (Table me, long column, int which_Melder_NUMBER, double criterion);
-Table Table_extractRowsWhereColumn_string (Table me, long column, int which_Melder_STRING, const wchar_t *criterion);
-Table Table_collapseRows (Table me, const wchar_t *factors_string, const wchar_t *columnsToSum_string,
-	const wchar_t *columnsToAverage_string, const wchar_t *columnsToMedianize_string,
-	const wchar_t *columnsToAverageLogarithmically_string, const wchar_t *columnsToMedianizeLogarithmically_string);
-Table Table_rowsToColumns (Table me, const wchar_t *factors_string, long columnToTranspose, const wchar_t *columnsToExpand_string);
+Table Table_extractRowsWhereColumn_string (Table me, long column, int which_Melder_STRING, const char32 *criterion);
+Table Table_collapseRows (Table me, const char32 *factors_string, const char32 *columnsToSum_string,
+	const char32 *columnsToAverage_string, const char32 *columnsToMedianize_string,
+	const char32 *columnsToAverageLogarithmically_string, const char32 *columnsToMedianizeLogarithmically_string);
+Table Table_rowsToColumns (Table me, const char32 *factors_string, long columnToTranspose, const char32 *columnsToExpand_string);
 Table Table_transpose (Table me);
 
 void Table_checkSpecifiedRowNumberWithinRange (Table me, long rowNumber);
diff --git a/stat/TableEditor.cpp b/stat/TableEditor.cpp
index 0700dcd..3a87e23 100644
--- a/stat/TableEditor.cpp
+++ b/stat/TableEditor.cpp
@@ -1,6 +1,6 @@
 /* TableEditor.cpp
  *
- * Copyright (C) 2006-2011,2013 Paul Boersma
+ * Copyright (C) 2006-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,12 +34,12 @@ void structTableEditor :: v_destroy () {
 
 static void updateVerticalScrollBar (TableEditor me) {
 	Table table = static_cast<Table> (my data);
-	my verticalScrollBar -> f_set (NUMundefined, table -> rows -> size + 1, my topRow, NUMundefined, NUMundefined, NUMundefined);
+	GuiScrollBar_set (my verticalScrollBar, NUMundefined, table -> rows -> size + 1, my topRow, NUMundefined, NUMundefined, NUMundefined);
 }
 
 static void updateHorizontalScrollBar (TableEditor me) {
 	Table table = static_cast<Table> (my data);
-	my horizontalScrollBar -> f_set (NUMundefined, table -> numberOfColumns + 1, my leftColumn, NUMundefined, NUMundefined, NUMundefined);
+	GuiScrollBar_set (my horizontalScrollBar, NUMundefined, table -> numberOfColumns + 1, my leftColumn, NUMundefined, NUMundefined, NUMundefined);
 }
 
 void structTableEditor :: v_dataChanged () {
@@ -59,19 +59,19 @@ void structTableEditor :: v_dataChanged () {
 #ifndef macintosh
 static void menu_cb_Cut (EDITOR_ARGS) {   // BUG: why only on Mac?
 	EDITOR_IAM (TableEditor);
-	my text -> f_cut ();
+	GuiText_cut (my text);
 }
 static void menu_cb_Copy (EDITOR_ARGS) {
 	EDITOR_IAM (TableEditor);
-	my text -> f_copy ();
+	GuiText_copy (my text);
 }
 static void menu_cb_Paste (EDITOR_ARGS) {
 	EDITOR_IAM (TableEditor);
-	my text -> f_paste ();
+	GuiText_paste (my text);
 }
 static void menu_cb_Erase (EDITOR_ARGS) {
 	EDITOR_IAM (TableEditor);
-	my text -> f_remove ();
+	GuiText_remove (my text);
 }
 #endif
 
@@ -81,7 +81,7 @@ static void menu_cb_Erase (EDITOR_ARGS) {
 
 static void menu_cb_TableEditorHelp (EDITOR_ARGS) {
 	EDITOR_IAM (TableEditor);
-	Melder_help (L"TableEditor");
+	Melder_help (U"TableEditor");
 }
 
 /********** DRAWING AREA **********/
@@ -108,7 +108,7 @@ void structTableEditor :: v_draw () {
 	/*
 	 * Determine the width of the column with the row numbers.
 	 */
-	columnWidth = Graphics_textWidth (graphics, L"row");
+	columnWidth = Graphics_textWidth (graphics, U"row");
 	for (long irow = rowmin; irow <= rowmax; irow ++) {
 		cellWidth = Graphics_textWidth (graphics, Melder_integer (irow));
 		if (cellWidth > columnWidth) columnWidth = cellWidth;
@@ -122,15 +122,15 @@ void structTableEditor :: v_draw () {
 	 * Determine the width of the columns.
 	 */
 	for (long icol = colmin; icol <= colmax; icol ++) {
-		const wchar_t *columnLabel = table -> columnHeaders [icol]. label;
+		const char32 *columnLabel = table -> columnHeaders [icol]. label;
 		columnWidth = Graphics_textWidth (graphics, Melder_integer (icol));
-		if (columnLabel == NULL) columnLabel = L"";
+		if (columnLabel == NULL) columnLabel = U"";
 		cellWidth = Graphics_textWidth (graphics, columnLabel);
 		if (cellWidth > columnWidth) columnWidth = cellWidth;
 		for (long irow = rowmin; irow <= rowmax; irow ++) {
-			const wchar_t *cell = Table_getStringValue_Assert (table, irow, icol);
+			const char32 *cell = Table_getStringValue_Assert (table, irow, icol);
 			Melder_assert (cell != NULL);
-			if (cell [0] == '\0') cell = L"?";
+			if (cell [0] == U'\0') cell = U"?";
 			cellWidth = Graphics_textWidth (graphics, cell);
 			if (cellWidth > columnWidth) columnWidth = cellWidth;
 		}
@@ -140,18 +140,18 @@ void structTableEditor :: v_draw () {
 	/*
 	 * Show the row numbers.
 	 */
-	Graphics_text (graphics, columnLeft [0] / 2, rowmin - 1, L"row");
+	Graphics_text (graphics, columnLeft [0] / 2, rowmin - 1, U"row");
 	for (long irow = rowmin; irow <= rowmax; irow ++) {
-		Graphics_text1 (graphics, columnLeft [0] / 2, irow, Melder_integer (irow));
+		Graphics_text (graphics, columnLeft [0] / 2, irow, irow);
 	}
 	/*
 	 * Show the column labels.
 	 */
 	for (long icol = colmin; icol <= colmax; icol ++) {
 		double mid = (columnLeft [icol - colmin] + columnRight [icol - colmin]) / 2;
-		const wchar_t *columnLabel = table -> columnHeaders [icol]. label;
-		if (columnLabel == NULL || columnLabel [0] == '\0') columnLabel = L"?";
-		Graphics_text1 (graphics, mid, rowmin - 2, Melder_integer (icol));
+		const char32 *columnLabel = table -> columnHeaders [icol]. label;
+		if (columnLabel == NULL || columnLabel [0] == U'\0') columnLabel = U"?";
+		Graphics_text (graphics, mid, rowmin - 2, icol);
 		Graphics_text (graphics, mid, rowmin - 1, columnLabel);
 	}
 	/*
@@ -160,9 +160,9 @@ void structTableEditor :: v_draw () {
 	for (long irow = rowmin; irow <= rowmax; irow ++) {
 		for (long icol = colmin; icol <= colmax; icol ++) {
 			double mid = (columnLeft [icol - colmin] + columnRight [icol - colmin]) / 2;
-			const wchar_t *cell = Table_getStringValue_Assert (table, irow, icol);
+			const char32 *cell = Table_getStringValue_Assert (table, irow, icol);
 			Melder_assert (cell != NULL);
-			if (cell [0] == '\0') cell = L"?";
+			if (cell [0] == U'\0') cell = U"?";
 			Graphics_text (graphics, mid, irow, cell);
 		}
 	}
@@ -177,7 +177,7 @@ static void gui_text_cb_change (I, GuiTextEvent event) {
 	iam (TableEditor);
 	(void) event;
 	Table table = static_cast<Table> (my data);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
@@ -203,7 +203,7 @@ static void gui_drawingarea_cb_resize (I, GuiDrawingAreaResizeEvent event) {
 
 static void gui_cb_scrollHorizontal (I, GuiScrollBarEvent event) {
 	iam (TableEditor);
-	int value = event -> scrollBar -> f_getValue ();
+	int value = GuiScrollBar_getValue (event -> scrollBar);
 	if (value != my leftColumn) {
 		my leftColumn = value;
 		#if cocoa || gtk || win
@@ -217,7 +217,7 @@ static void gui_cb_scrollHorizontal (I, GuiScrollBarEvent event) {
 
 static void gui_cb_scrollVertical (I, GuiScrollBarEvent event) {
 	iam (TableEditor);
-	int value = event -> scrollBar -> f_getValue ();
+	int value = GuiScrollBar_getValue (event -> scrollBar);
 	if (value != my topRow) {
 		my topRow = value;
 		#if cocoa || gtk || win
@@ -233,44 +233,44 @@ void structTableEditor :: v_createChildren () {
 	Table table = static_cast<Table> (data);
 	int y = Machine_getMenuBarHeight () + 4, scrollWidth = Machine_getScrollBarWidth ();
 
-	text = GuiText_createShown (d_windowForm, 0, 0, y, y + Machine_getTextHeight (), 0);
-	text -> f_setChangeCallback (gui_text_cb_change, this);
+	our text = GuiText_createShown (our d_windowForm, 0, 0, y, y + Machine_getTextHeight (), 0);
+	GuiText_setChangeCallback (our text, gui_text_cb_change, this);
 	y += Machine_getTextHeight () + 4;
 
-	drawingArea = GuiDrawingArea_createShown (d_windowForm, 0, - scrollWidth, y, - scrollWidth,
+	our drawingArea = GuiDrawingArea_createShown (our d_windowForm, 0, - scrollWidth, y, - scrollWidth,
 		gui_drawingarea_cb_expose, gui_drawingarea_cb_click, NULL, gui_drawingarea_cb_resize, this, 0);
 
-	verticalScrollBar = GuiScrollBar_createShown (d_windowForm, - scrollWidth, 0, y, - scrollWidth,
+	our verticalScrollBar = GuiScrollBar_createShown (our d_windowForm, - scrollWidth, 0, y, - scrollWidth,
 		1, table -> rows -> size + 1, 1, 1, 1, 10, gui_cb_scrollVertical, this, 0);
 
-	horizontalScrollBar = GuiScrollBar_createShown (d_windowForm, 0, - scrollWidth, - scrollWidth, 0,
+	our horizontalScrollBar = GuiScrollBar_createShown (our d_windowForm, 0, - scrollWidth, - scrollWidth, 0,
 		1, table -> numberOfColumns + 1, 1, 1, 1, 3, gui_cb_scrollHorizontal, this, GuiScrollBar_HORIZONTAL);
 
-	drawingArea -> f_setSwipable (horizontalScrollBar, verticalScrollBar);
+	GuiDrawingArea_setSwipable (our drawingArea, our horizontalScrollBar, our verticalScrollBar);
 }
 
 void structTableEditor :: v_createMenus () {
 	TableEditor_Parent :: v_createMenus ();
 
 	#ifndef macintosh
-	Editor_addCommand (this, L"Edit", L"-- cut copy paste --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Cut text", 'X', menu_cb_Cut);
-	Editor_addCommand (this, L"Edit", L"Cut", Editor_HIDDEN, menu_cb_Cut);
-	Editor_addCommand (this, L"Edit", L"Copy text", 'C', menu_cb_Copy);
-	Editor_addCommand (this, L"Edit", L"Copy", Editor_HIDDEN, menu_cb_Copy);
-	Editor_addCommand (this, L"Edit", L"Paste text", 'V', menu_cb_Paste);
-	Editor_addCommand (this, L"Edit", L"Paste", Editor_HIDDEN, menu_cb_Paste);
-	Editor_addCommand (this, L"Edit", L"Erase text", 0, menu_cb_Erase);
-	Editor_addCommand (this, L"Edit", L"Erase", Editor_HIDDEN, menu_cb_Erase);
+	Editor_addCommand (this, U"Edit", U"-- cut copy paste --", 0, NULL);
+	Editor_addCommand (this, U"Edit", U"Cut text", 'X', menu_cb_Cut);
+	Editor_addCommand (this, U"Edit", U"Cut", Editor_HIDDEN, menu_cb_Cut);
+	Editor_addCommand (this, U"Edit", U"Copy text", 'C', menu_cb_Copy);
+	Editor_addCommand (this, U"Edit", U"Copy", Editor_HIDDEN, menu_cb_Copy);
+	Editor_addCommand (this, U"Edit", U"Paste text", 'V', menu_cb_Paste);
+	Editor_addCommand (this, U"Edit", U"Paste", Editor_HIDDEN, menu_cb_Paste);
+	Editor_addCommand (this, U"Edit", U"Erase text", 0, menu_cb_Erase);
+	Editor_addCommand (this, U"Edit", U"Erase", Editor_HIDDEN, menu_cb_Erase);
 	#endif
 }
 
 void structTableEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	TableEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"TableEditor help", '?', menu_cb_TableEditorHelp);
+	EditorMenu_addCommand (menu, U"TableEditor help", U'?', menu_cb_TableEditorHelp);
 }
 
-TableEditor TableEditor_create (const wchar_t *title, Table table) {
+TableEditor TableEditor_create (const char32 *title, Table table) {
 	try {
 		autoTableEditor me = Thing_new (TableEditor);
 		Editor_init (me.peek(), 0, 0, 700, 500, title, table);
@@ -288,11 +288,11 @@ TableEditor TableEditor_create (const wchar_t *title, Table table) {
 		Graphics_setViewport (my graphics, 0, size_pixels, 0, size_pixels);
 		Graphics_setFont (my graphics, kGraphics_font_COURIER);
 		Graphics_setFontSize (my graphics, 12);
-		Graphics_setUnderscoreIsSubscript (my graphics, FALSE);
-		Graphics_setAtSignIsLink (my graphics, TRUE);
+		Graphics_setUnderscoreIsSubscript (my graphics, false);
+		Graphics_setAtSignIsLink (my graphics, true);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableEditor not created.");
+		Melder_throw (U"TableEditor not created.");
 	}
 }
 
diff --git a/stat/TableEditor.h b/stat/TableEditor.h
index 72f6ac9..bd0dc92 100644
--- a/stat/TableEditor.h
+++ b/stat/TableEditor.h
@@ -2,7 +2,7 @@
 #define _TableEditor_h_
 /* TableEditor.h
  *
- * Copyright (C) 2006-2011,2012 Paul Boersma
+ * Copyright (C) 2006-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,26 +25,29 @@
 #define kTableEditor_MAXNUM_VISIBLE_COLUMNS  100
 
 Thing_define (TableEditor, Editor) {
-	// new data:
-	public:
-		long topRow, leftColumn, selectedRow, selectedColumn;
-		GuiText text;
-		GuiDrawingArea drawingArea;
-		GuiScrollBar horizontalScrollBar, verticalScrollBar;
-		double columnLeft [kTableEditor_MAXNUM_VISIBLE_COLUMNS], columnRight [kTableEditor_MAXNUM_VISIBLE_COLUMNS];
-		Graphics graphics;
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_createChildren ();
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_dataChanged ();
-	// new methods:
-		virtual void v_draw ();
-		virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
+	long topRow, leftColumn, selectedRow, selectedColumn;
+	GuiText text;
+	GuiDrawingArea drawingArea;
+	GuiScrollBar horizontalScrollBar, verticalScrollBar;
+	double columnLeft [kTableEditor_MAXNUM_VISIBLE_COLUMNS], columnRight [kTableEditor_MAXNUM_VISIBLE_COLUMNS];
+	Graphics graphics;
+
+	void v_destroy ()
+		override;
+	void v_createChildren ()
+		override;
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_dataChanged ()
+		override;
+
+	virtual void v_draw ();
+	virtual int v_click (double xWC, double yWC, bool shiftKeyPressed);
 };
 
-TableEditor TableEditor_create (const wchar_t *title, Table table);
+TableEditor TableEditor_create (const char32 *title, Table table);
 
 /* End of file TableEditor.h */
 #endif
diff --git a/stat/TableOfReal.cpp b/stat/TableOfReal.cpp
index ebe93d8..c825f2c 100644
--- a/stat/TableOfReal.cpp
+++ b/stat/TableOfReal.cpp
@@ -1,6 +1,6 @@
 /* TableOfReal.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,42 +38,42 @@
 #include "oo_DESCRIPTION.h"
 #include "TableOfReal_def.h"
 
-static void fprintquotedstring (MelderFile file, const wchar_t *s) {
-	MelderFile_writeCharacter (file, '\"');
-	if (s) { wchar_t c; while ((c = *s ++) != '\0') { MelderFile_writeCharacter (file, c); if (c == '\"') MelderFile_writeCharacter (file, c); } }
-	MelderFile_writeCharacter (file, '\"');
+static void fprintquotedstring (MelderFile file, const char32 *s) {
+	MelderFile_writeCharacter (file, U'\"');
+	if (s) { char32 c; while ((c = *s ++) != U'\0') { MelderFile_writeCharacter (file, c); if (c == U'\"') MelderFile_writeCharacter (file, c); } }
+	MelderFile_writeCharacter (file, U'\"');
 }
 
 void structTableOfReal :: v_writeText (MelderFile file) {
-	texputi4 (file, numberOfColumns, L"numberOfColumns", 0,0,0,0,0);
-	MelderFile_write (file, L"\ncolumnLabels []: ");
-	if (numberOfColumns < 1) MelderFile_write (file, L"(empty)");
-	MelderFile_write (file, L"\n");
+	texputi4 (file, numberOfColumns, U"numberOfColumns", 0,0,0,0,0);
+	MelderFile_write (file, U"\ncolumnLabels []: ");
+	if (numberOfColumns < 1) MelderFile_write (file, U"(empty)");
+	MelderFile_write (file, U"\n");
 	for (long i = 1; i <= numberOfColumns; i ++) {
 		fprintquotedstring (file, columnLabels [i]);
-		MelderFile_writeCharacter (file, '\t');
+		MelderFile_writeCharacter (file, U'\t');
 	}
-	texputi4 (file, numberOfRows, L"numberOfRows", 0,0,0,0,0);
+	texputi4 (file, numberOfRows, U"numberOfRows", 0,0,0,0,0);
 	for (long i = 1; i <= numberOfRows; i ++) {
-		MelderFile_write (file, L"\nrow [", Melder_integer (i), L"]: ");
+		MelderFile_write (file, U"\nrow [", i, U"]: ");
 		fprintquotedstring (file, rowLabels [i]);
 		for (long j = 1; j <= numberOfColumns; j ++) {
 			double x = data [i] [j];
-			MelderFile_write (file, L"\t", Melder_double (x));
+			MelderFile_write (file, U"\t", x);
 		}
 	}
 }
 
-void structTableOfReal :: v_readText (MelderReadText a_text) {
+void structTableOfReal :: v_readText (MelderReadText a_text, int /*formatVersion*/) {
 	numberOfColumns = texgeti4 (a_text);
 	if (numberOfColumns >= 1) {
-		columnLabels = NUMvector <wchar_t*> (1, numberOfColumns);
+		columnLabels = NUMvector <char32*> (1, numberOfColumns);
 		for (long i = 1; i <= numberOfColumns; i ++)
 			columnLabels [i] = texgetw2 (a_text);
 	}
 	numberOfRows = texgeti4 (a_text);
 	if (numberOfRows >= 1) {
-		rowLabels = NUMvector <wchar_t*> (1, numberOfRows);
+		rowLabels = NUMvector <char32*> (1, numberOfRows);
 	}
 	if (numberOfRows >= 1 && numberOfColumns >= 1) {
 		data = NUMmatrix <double> (1, numberOfRows, 1, numberOfColumns);
@@ -86,40 +86,40 @@ void structTableOfReal :: v_readText (MelderReadText a_text) {
 }
 
 void structTableOfReal :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of rows: ", Melder_integer (numberOfRows));
-	MelderInfo_writeLine (L"Number of columns: ", Melder_integer (numberOfColumns));
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of rows: ", numberOfRows);
+	MelderInfo_writeLine (U"Number of columns: ", numberOfColumns);
 }
 
-const wchar_t * structTableOfReal :: v_getRowStr (long irow) {
+const char32 * structTableOfReal :: v_getRowStr (long irow) {
 	if (irow < 1 || irow > numberOfRows) return NULL;
-	return rowLabels [irow] ? rowLabels [irow] : L"";
+	return rowLabels [irow] ? rowLabels [irow] : U"";
 }
-const wchar_t * structTableOfReal :: v_getColStr (long icol) {
+const char32 * structTableOfReal :: v_getColStr (long icol) {
 	if (icol < 1 || icol > numberOfColumns) return NULL;
-	return columnLabels [icol] ? columnLabels [icol] : L"";
+	return columnLabels [icol] ? columnLabels [icol] : U"";
 }
 double structTableOfReal :: v_getMatrix (long irow, long icol) {
 	if (irow < 1 || irow > numberOfRows) return NUMundefined;
 	if (icol < 1 || icol > numberOfColumns) return NUMundefined;
 	return data [irow] [icol];
 }
-double structTableOfReal :: v_getRowIndex (const wchar_t *rowLabel) {
+double structTableOfReal :: v_getRowIndex (const char32 *rowLabel) {
 	return TableOfReal_rowLabelToIndex (this, rowLabel);
 }
-double structTableOfReal :: v_getColIndex (const wchar_t *columnLabel) {
+double structTableOfReal :: v_getColIndex (const char32 *columnLabel) {
 	return TableOfReal_columnLabelToIndex (this, columnLabel);
 }
 
-Thing_implement (TableOfReal, Data, 0);
+Thing_implement (TableOfReal, Daata, 0);
 
 void TableOfReal_init (TableOfReal me, long numberOfRows, long numberOfColumns) {
 	if (numberOfRows < 1 || numberOfColumns < 1)
-		Melder_throw ("Cannot create cell-less table.");
+		Melder_throw (U"Cannot create cell-less table.");
 	my numberOfRows = numberOfRows;
 	my numberOfColumns = numberOfColumns;
-	my rowLabels = NUMvector <wchar_t*> (1, numberOfRows);
-	my columnLabels = NUMvector <wchar_t*> (1, numberOfColumns);
+	my rowLabels = NUMvector <char32*> (1, numberOfRows);
+	my columnLabels = NUMvector <char32*> (1, numberOfColumns);
 	my data = NUMmatrix <double> (1, my numberOfRows, 1, my numberOfColumns);
 }
 
@@ -129,22 +129,22 @@ TableOfReal TableOfReal_create (long numberOfRows, long numberOfColumns) {
 		TableOfReal_init (me.peek(), numberOfRows, numberOfColumns);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal not created.");
+		Melder_throw (U"TableOfReal not created.");
 	}
 }
 
 /***** QUERY *****/
 
-long TableOfReal_rowLabelToIndex (TableOfReal me, const wchar_t *label) {
+long TableOfReal_rowLabelToIndex (TableOfReal me, const char32 *label) {
 	for (long irow = 1; irow <= my numberOfRows; irow ++)
-		if (my rowLabels [irow] && wcsequ (my rowLabels [irow], label))
+		if (my rowLabels [irow] && str32equ (my rowLabels [irow], label))
 			return irow;
 	return 0;
 }
 
-long TableOfReal_columnLabelToIndex (TableOfReal me, const wchar_t *label) {
+long TableOfReal_columnLabelToIndex (TableOfReal me, const char32 *label) {
 	for (long icol = 1; icol <= my numberOfColumns; icol ++)
-		if (my columnLabels [icol] && wcsequ (my columnLabels [icol], label))
+		if (my columnLabels [icol] && str32equ (my columnLabels [icol], label))
 			return icol;
 	return 0;
 }
@@ -172,9 +172,9 @@ double TableOfReal_getColumnStdev (TableOfReal me, long columnNumber) {
 void TableOfReal_removeRow (TableOfReal me, long rowNumber) {
 	try {
 		if (my numberOfRows == 1)
-			Melder_throw (Thing_messageName (me), " has only one row, and a TableOfReal without rows cannot exist.");
+			Melder_throw (Thing_messageName (me), U" has only one row, and a TableOfReal without rows cannot exist.");
 		if (rowNumber < 1 || rowNumber > my numberOfRows)
-			Melder_throw ("No row ", rowNumber, ".");
+			Melder_throw (U"No row ", rowNumber, U".");
 		autoNUMmatrix <double> data (1, my numberOfRows - 1, 1, my numberOfColumns);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
 			for (long irow = 1; irow < rowNumber; irow ++)
@@ -192,16 +192,16 @@ void TableOfReal_removeRow (TableOfReal me, long rowNumber) {
 		my data = data.transfer();
 		my numberOfRows --;
 	} catch (MelderError) {
-		Melder_throw (me, ": row ", rowNumber, " not removed.");
+		Melder_throw (me, U": row ", rowNumber, U" not removed.");
 	}
 }
 
 void TableOfReal_insertRow (TableOfReal me, long rowNumber) {
 	try {
 		if (rowNumber < 1 || rowNumber > my numberOfRows + 1)
-			Melder_throw ("Cannot create row ", rowNumber, ".");
+			Melder_throw (U"Cannot create row ", rowNumber, U".");
 		autoNUMmatrix <double> data (1, my numberOfRows + 1, 1, my numberOfColumns);
-		autoNUMvector <wchar_t *> rowLabels (1, my numberOfRows + 1);   // not autostringvector...
+		autoNUMvector <char32 *> rowLabels (1, my numberOfRows + 1);   // not autostringvector...
 		for (long irow = 1; irow < rowNumber; irow ++)	{
 			rowLabels [irow] = my rowLabels [irow];   // ...because this is a dangling copy
 			for (long icol = 1; icol <= my numberOfColumns; icol ++)
@@ -221,16 +221,16 @@ void TableOfReal_insertRow (TableOfReal me, long rowNumber) {
 		my data = data.transfer();
 		my numberOfRows ++;
 	} catch (MelderError) {
-		Melder_throw (me, ": row at position ", rowNumber, " not inserted.");
+		Melder_throw (me, U": row at position ", rowNumber, U" not inserted.");
 	}
 }
 
 void TableOfReal_removeColumn (TableOfReal me, long columnNumber) {
 	try {
 		if (my numberOfColumns == 1)
-			Melder_throw ("Cannot remove the only column.");
+			Melder_throw (U"Cannot remove the only column.");
 		if (columnNumber < 1 || columnNumber > my numberOfColumns)
-			Melder_throw ("No column ", columnNumber, ".");
+			Melder_throw (U"No column ", columnNumber, U".");
 		autoNUMmatrix <double> data (1, my numberOfRows, 1, my numberOfColumns - 1);
 		for (long irow = 1; irow <= my numberOfRows; irow ++) {
 			for (long icol = 1; icol < columnNumber; icol ++)
@@ -248,16 +248,16 @@ void TableOfReal_removeColumn (TableOfReal me, long columnNumber) {
 		my data = data.transfer();
 		my numberOfColumns --;
 	} catch (MelderError) {
-		Melder_throw (me, ": column at position ", columnNumber, " not inserted.");
+		Melder_throw (me, U": column at position ", columnNumber, U" not inserted.");
 	}
 }
 
 void TableOfReal_insertColumn (TableOfReal me, long columnNumber) {
 	try {
 		if (columnNumber < 1 || columnNumber > my numberOfColumns + 1)
-			Melder_throw ("Cannot create column ", columnNumber, ".");
+			Melder_throw (U"Cannot create column ", columnNumber, U".");
 		autoNUMmatrix <double> data (1, my numberOfRows, 1, my numberOfColumns + 1);
-		autoNUMvector <wchar_t*> columnLabels (1, my numberOfColumns + 1);   // not autostringvector...
+		autoNUMvector <char32*> columnLabels (1, my numberOfColumns + 1);   // not autostringvector...
 		for (long j = 1; j < columnNumber; j ++) {
 			columnLabels [j] = my columnLabels [j];   // ...because this is a dangling copy
 			for (long i = 1; i <= my numberOfRows; i ++) data [i] [j] = my data [i] [j];
@@ -275,41 +275,41 @@ void TableOfReal_insertColumn (TableOfReal me, long columnNumber) {
 		my data = data.transfer();
 		my numberOfColumns ++;
 	} catch (MelderError) {
-		Melder_throw (me, ": column at position ", columnNumber, " not inserted.");
+		Melder_throw (me, U": column at position ", columnNumber, U" not inserted.");
 	}
 }
 
-void TableOfReal_setRowLabel (TableOfReal me, long rowNumber, const wchar_t *label) {
+void TableOfReal_setRowLabel (TableOfReal me, long rowNumber, const char32 *label) {
 	try {
 		if (rowNumber < 1 || rowNumber > my numberOfRows) return;
-		autostring newLabel = Melder_wcsdup (label);
+		autostring32 newLabel = Melder_dup (label);
 		/*
 		 * Change without error.
 		 */
 		Melder_free (my rowLabels [rowNumber]);
 		my rowLabels [rowNumber] = newLabel.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": label of row ", rowNumber, " not set.");
+		Melder_throw (me, U": label of row ", rowNumber, U" not set.");
 	}
 }
 
-void TableOfReal_setColumnLabel (TableOfReal me, long columnNumber, const wchar_t *label) {
+void TableOfReal_setColumnLabel (TableOfReal me, long columnNumber, const char32 *label) {
 	try {
 		if (columnNumber < 1 || columnNumber > my numberOfColumns) return;
-		autostring newLabel = Melder_wcsdup (label);
+		autostring32 newLabel = Melder_dup (label);
 		/*
 		 * Change without error.
 		 */
 		Melder_free (my columnLabels [columnNumber]);
 		my columnLabels [columnNumber] = newLabel.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": label of column ", columnNumber, " not set.");
+		Melder_throw (me, U": label of column ", columnNumber, U" not set.");
 	}
 }
 
-void TableOfReal_formula (TableOfReal me, const wchar_t *expression, Interpreter interpreter, TableOfReal thee) {
+void TableOfReal_formula (TableOfReal me, const char32 *expression, Interpreter interpreter, TableOfReal thee) {
 	try {
-		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, TRUE);
+		Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, true);
 		if (thee == NULL) thee = me;
 		for (long irow = 1; irow <= my numberOfRows; irow ++) {
 			for (long icol = 1; icol <= my numberOfColumns; icol ++) {
@@ -319,7 +319,7 @@ void TableOfReal_formula (TableOfReal me, const wchar_t *expression, Interpreter
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": formula not completed.");
+		Melder_throw (me, U": formula not completed.");
 	}
 }
 
@@ -329,7 +329,7 @@ static void copyRowLabels (TableOfReal me, TableOfReal thee) {
 	Melder_assert (me != thee);
 	Melder_assert (my numberOfRows == thy numberOfRows);
 	for (long irow = 1; irow <= my numberOfRows; irow ++) {
-		thy rowLabels [irow] = Melder_wcsdup (my rowLabels [irow]);
+		thy rowLabels [irow] = Melder_dup (my rowLabels [irow]);
 	}
 }
 
@@ -337,14 +337,14 @@ static void copyColumnLabels (TableOfReal me, TableOfReal thee) {
 	Melder_assert (me != thee);
 	Melder_assert (my numberOfColumns == thy numberOfColumns);
 	for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-		thy columnLabels [icol] = Melder_wcsdup (my columnLabels [icol]);
+		thy columnLabels [icol] = Melder_dup (my columnLabels [icol]);
 	}
 }
 
 static void copyRow (TableOfReal me, long myRow, TableOfReal thee, long thyRow) {
 	Melder_assert (me != thee);
 	Melder_assert (my numberOfColumns == thy numberOfColumns);
-	thy rowLabels [thyRow] = Melder_wcsdup (my rowLabels [myRow]);
+	thy rowLabels [thyRow] = Melder_dup (my rowLabels [myRow]);
 	for (long icol = 1; icol <= my numberOfColumns; icol ++) {
 		thy data [thyRow] [icol] = my data [myRow] [icol];
 	}
@@ -353,7 +353,7 @@ static void copyRow (TableOfReal me, long myRow, TableOfReal thee, long thyRow)
 static void copyColumn (TableOfReal me, long myCol, TableOfReal thee, long thyCol) {
 	Melder_assert (me != thee);
 	Melder_assert (my numberOfRows == thy numberOfRows);
-	thy columnLabels [thyCol] = Melder_wcsdup (my columnLabels [myCol]);
+	thy columnLabels [thyCol] = Melder_dup (my columnLabels [myCol]);
 	for (long irow = 1; irow <= my numberOfRows; irow ++) {
 		thy data [irow] [thyCol] = my data [irow] [myCol];
 	}
@@ -362,14 +362,14 @@ static void copyColumn (TableOfReal me, long myCol, TableOfReal thee, long thyCo
 TableOfReal TableOfReal_extractRowsWhereColumn (TableOfReal me, long column, int which_Melder_NUMBER, double criterion) {
 	try {
 		if (column < 1 || column > my numberOfColumns)
-			Melder_throw ("No such column: ", column, ".");
+			Melder_throw (U"No such column: ", column, U".");
 		long n = 0;
 		for (long irow = 1; irow <= my numberOfRows; irow ++) {
 			if (Melder_numberMatchesCriterion (my data [irow] [column], which_Melder_NUMBER, criterion)) {
 				n ++;
 			}
 		}
-		if (n == 0) Melder_throw ("No row matches this criterion.");
+		if (n == 0) Melder_throw (U"No row matches this criterion.");
 		autoTableOfReal thee = TableOfReal_create (n, my numberOfColumns);
 		copyColumnLabels (me, thee.peek());
 		n = 0;
@@ -378,11 +378,11 @@ TableOfReal TableOfReal_extractRowsWhereColumn (TableOfReal me, long column, int
 				copyRow (me, irow, thee.peek(), ++ n);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": rows not extracted.");
+		Melder_throw (me, U": rows not extracted.");
 	}
 }
 
-TableOfReal TableOfReal_extractRowsWhereLabel (TableOfReal me, int which_Melder_STRING, const wchar_t *criterion) {
+TableOfReal TableOfReal_extractRowsWhereLabel (TableOfReal me, int which_Melder_STRING, const char32 *criterion) {
 	try {
 		long n = 0;
 		for (long irow = 1; irow <= my numberOfRows; irow ++) {
@@ -391,7 +391,7 @@ TableOfReal TableOfReal_extractRowsWhereLabel (TableOfReal me, int which_Melder_
 			}
 		}
 		if (n == 0)
-			Melder_throw (L"No row matches this criterion.");
+			Melder_throw (U"No row matches this criterion.");
 		autoTableOfReal thee = TableOfReal_create (n, my numberOfColumns);
 		copyColumnLabels (me, thee.peek());
 		n = 0;
@@ -400,21 +400,21 @@ TableOfReal TableOfReal_extractRowsWhereLabel (TableOfReal me, int which_Melder_
 				copyRow (me, irow, thee.peek(), ++ n);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": rows not extracted.");
+		Melder_throw (me, U": rows not extracted.");
 	}
 }
 
 TableOfReal TableOfReal_extractColumnsWhereRow (TableOfReal me, long row, int which_Melder_NUMBER, double criterion) {
 	try {
 		if (row < 1 || row > my numberOfRows)
-			Melder_throw ("No such row: ", row, ".");
+			Melder_throw (U"No such row: ", row, U".");
 		long n = 0;
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
 			if (Melder_numberMatchesCriterion (my data [row] [icol], which_Melder_NUMBER, criterion)) {
 				n ++;
 			}
 		}
-		if (n == 0) Melder_throw ("No column matches this criterion.");
+		if (n == 0) Melder_throw (U"No column matches this criterion.");
 
 		autoTableOfReal thee = TableOfReal_create (my numberOfRows, n);
 		copyRowLabels (me, thee.peek());
@@ -424,11 +424,11 @@ TableOfReal TableOfReal_extractColumnsWhereRow (TableOfReal me, long row, int wh
 				copyColumn (me, icol, thee.peek(), ++ n);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": columns not extracted.");
+		Melder_throw (me, U": columns not extracted.");
 	}
 }
 
-TableOfReal TableOfReal_extractColumnsWhereLabel (TableOfReal me, int which_Melder_STRING, const wchar_t *criterion) {
+TableOfReal TableOfReal_extractColumnsWhereLabel (TableOfReal me, int which_Melder_STRING, const char32 *criterion) {
 	try {
 		long n = 0;
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
@@ -436,7 +436,7 @@ TableOfReal TableOfReal_extractColumnsWhereLabel (TableOfReal me, int which_Meld
 				n ++;
 			}
 		}
-		if (n == 0) Melder_throw ("No column matches this criterion.");
+		if (n == 0) Melder_throw (U"No column matches this criterion.");
 
 		autoTableOfReal thee = TableOfReal_create (my numberOfRows, n);
 		copyRowLabels (me, thee.peek());
@@ -448,7 +448,7 @@ TableOfReal TableOfReal_extractColumnsWhereLabel (TableOfReal me, int which_Meld
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": columns not extracted.");
+		Melder_throw (me, U": columns not extracted.");
 	}
 }
 
@@ -457,47 +457,47 @@ TableOfReal TableOfReal_extractColumnsWhereLabel (TableOfReal me, int which_Meld
  * 1, 4, 2, 3, 4, 5, 6, 7, 4, 3, 3, 4, 5, 4, 3, 2
  * Overlap is allowed. Ranges can go up and down.
  */
-static long *getElementsOfRanges (const wchar_t *ranges, long maximumElement, long *numberOfElements, const wchar_t *elementType) {
+static long *getElementsOfRanges (const char32 *ranges, long maximumElement, long *numberOfElements, const char32 *elementType) {
 	/*
 	 * Count the elements.
 	 */
 	long previousElement = 0;
 	*numberOfElements = 0;
-	const wchar_t *p = & ranges [0];
+	const char32 *p = & ranges [0];
 	for (;;) {
-		while (*p == ' ' || *p == '\t') p ++;
-		if (*p == '\0') break;
-		if (isdigit (*p)) {
-			long currentElement = wcstol (p, NULL, 10);
+		while (*p == U' ' || *p == U'\t') p ++;
+		if (*p == U'\0') break;
+		if (isdigit ((int) *p)) {
+			long currentElement = Melder_atoi (p);
 			if (currentElement == 0)
-				Melder_throw ("No such ", elementType, L": 0 (minimum is 1).");
+				Melder_throw (U"No such ", elementType, U": 0 (minimum is 1).");
 			if (currentElement > maximumElement)
-				Melder_throw ("No such ", elementType, ": ", currentElement, " (maximum is ", maximumElement, ").");
+				Melder_throw (U"No such ", elementType, U": ", currentElement, U" (maximum is ", maximumElement, U").");
 			*numberOfElements += 1;
 			previousElement = currentElement;
-			do { p ++; } while (isdigit (*p));
+			do { p ++; } while (isdigit ((int) *p));
 		} else if (*p == ':') {
 			if (previousElement == 0)
-				Melder_throw ("Cannot start range with colon.");
-			do { p ++; } while (*p == ' ' || *p == '\t');
-			if (*p == '\0')
-				Melder_throw ("Cannot end range with colon.");
-			if (! isdigit (*p))
-				Melder_throw ("End of range should be a positive whole number.");
-			long currentElement = wcstol (p, NULL, 10);
+				Melder_throw (U"Cannot start range with colon.");
+			do { p ++; } while (*p == U' ' || *p == U'\t');
+			if (*p == U'\0')
+				Melder_throw (U"Cannot end range with colon.");
+			if (! isdigit ((int) *p))
+				Melder_throw (U"End of range should be a positive whole number.");
+			long currentElement = Melder_atoi (p);
 			if (currentElement == 0)
-				Melder_throw ("No such ", elementType, ": 0 (minimum is 1).");
+				Melder_throw (U"No such ", elementType, U": 0 (minimum is 1).");
 			if (currentElement > maximumElement)
-				Melder_throw ("No such ", elementType, ": ", currentElement, " (maximum is ", maximumElement, ").");
+				Melder_throw (U"No such ", elementType, U": ", currentElement, U" (maximum is ", maximumElement, U").");
 			if (currentElement > previousElement) {
 				*numberOfElements += currentElement - previousElement;
 			} else {
 				*numberOfElements += previousElement - currentElement;
 			}
 			previousElement = currentElement;
-			do { p ++; } while (isdigit (*p));
+			do { p ++; } while (isdigit ((int) *p));
 		} else {
-			Melder_throw ("Start of range should be a positive whole number.");
+			Melder_throw (U"Start of range should be a positive whole number.");
 		}
 	}
 	/*
@@ -511,16 +511,16 @@ static long *getElementsOfRanges (const wchar_t *ranges, long maximumElement, lo
 	*numberOfElements = 0;
 	p = & ranges [0];
 	for (;;) {
-		while (*p == ' ' || *p == '\t') p ++;
-		if (*p == '\0') break;
-		if (isdigit (*p)) {
-			long currentElement = wcstol (p, NULL, 10);
+		while (*p == U' ' || *p == U'\t') p ++;
+		if (*p == U'\0') break;
+		if (isdigit ((int) *p)) {
+			long currentElement = Melder_atoi (p);
 			elements [++ *numberOfElements] = currentElement;
 			previousElement = currentElement;
-			do { p ++; } while (isdigit (*p));
+			do { p ++; } while (isdigit ((int) *p));
 		} else if (*p == ':') {
-			do { p ++; } while (*p == ' ' || *p == '\t');
-			long currentElement = wcstol (p, NULL, 10);
+			do { p ++; } while (*p == U' ' || *p == U'\t');
+			long currentElement = Melder_atoi (p);
 			if (currentElement > previousElement) {
 				for (long ielement = previousElement + 1; ielement <= currentElement; ielement ++) {
 					elements [++ *numberOfElements] = ielement;
@@ -531,43 +531,43 @@ static long *getElementsOfRanges (const wchar_t *ranges, long maximumElement, lo
 				}
 			}
 			previousElement = currentElement;
-			do { p ++; } while (isdigit (*p));
+			do { p ++; } while (isdigit ((int) *p));
 		}
 	}
 	return elements.transfer();
 }
 
-TableOfReal TableOfReal_extractRowRanges (TableOfReal me, const wchar_t *ranges) {
+TableOfReal TableOfReal_extractRowRanges (TableOfReal me, const char32 *ranges) {
 	try {
 		long numberOfElements;
-		autoNUMvector <long> elements (getElementsOfRanges (ranges, my numberOfRows, & numberOfElements, L"row"), 1);
+		autoNUMvector <long> elements (getElementsOfRanges (ranges, my numberOfRows, & numberOfElements, U"row"), 1);
 		autoTableOfReal thee = TableOfReal_create (numberOfElements, my numberOfColumns);
 		copyColumnLabels (me, thee.peek());
 		for (long ielement = 1; ielement <= numberOfElements; ielement ++)
 			copyRow (me, elements [ielement], thee.peek(), ielement);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": row ranges not extracted.");
+		Melder_throw (me, U": row ranges not extracted.");
 	}
 }
 
-TableOfReal TableOfReal_extractColumnRanges (TableOfReal me, const wchar_t *ranges) {
+TableOfReal TableOfReal_extractColumnRanges (TableOfReal me, const char32 *ranges) {
 	try {
 		long numberOfElements;
-		autoNUMvector <long> elements (getElementsOfRanges (ranges, my numberOfColumns, & numberOfElements, L"column"), 1);
+		autoNUMvector <long> elements (getElementsOfRanges (ranges, my numberOfColumns, & numberOfElements, U"column"), 1);
 		autoTableOfReal thee = TableOfReal_create (my numberOfRows, numberOfElements);
 		copyRowLabels (me, thee.peek());
 		for (long ielement = 1; ielement <= numberOfElements; ielement ++)
 			copyColumn (me, elements [ielement], thee.peek(), ielement);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": column ranges not extracted.");
+		Melder_throw (me, U": column ranges not extracted.");
 	}
 }
 
-TableOfReal TableOfReal_extractRowsWhere (TableOfReal me, const wchar_t *condition, Interpreter interpreter) {
+TableOfReal TableOfReal_extractRowsWhere (TableOfReal me, const char32 *condition, Interpreter interpreter) {
 	try {
-		Formula_compile (interpreter, me, condition, kFormula_EXPRESSION_TYPE_NUMERIC, TRUE);
+		Formula_compile (interpreter, me, condition, kFormula_EXPRESSION_TYPE_NUMERIC, true);
 		/*
 		 * Count the new number of rows.
 		 */
@@ -582,7 +582,7 @@ TableOfReal TableOfReal_extractRowsWhere (TableOfReal me, const wchar_t *conditi
 				}
 			}
 		}
-		if (numberOfElements < 1) Melder_throw ("No rows match this condition.");
+		if (numberOfElements < 1) Melder_throw (U"No rows match this condition.");
 
 		/*
 		 * Create room for the result.
@@ -605,13 +605,13 @@ TableOfReal TableOfReal_extractRowsWhere (TableOfReal me, const wchar_t *conditi
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": rows not extracted.");
+		Melder_throw (me, U": rows not extracted.");
 	}
 }
 
-TableOfReal TableOfReal_extractColumnsWhere (TableOfReal me, const wchar_t *condition, Interpreter interpreter) {
+TableOfReal TableOfReal_extractColumnsWhere (TableOfReal me, const char32 *condition, Interpreter interpreter) {
 	try {
-		Formula_compile (interpreter, me, condition, kFormula_EXPRESSION_TYPE_NUMERIC, TRUE);
+		Formula_compile (interpreter, me, condition, kFormula_EXPRESSION_TYPE_NUMERIC, true);
 		/*
 		 * Count the new number of columns.
 		 */
@@ -626,7 +626,7 @@ TableOfReal TableOfReal_extractColumnsWhere (TableOfReal me, const wchar_t *cond
 				}
 			}
 		}
-		if (numberOfElements < 1) Melder_throw ("No columns match this condition.");
+		if (numberOfElements < 1) Melder_throw (U"No columns match this condition.");
 
 		/*
 		 * Create room for the result.
@@ -649,7 +649,7 @@ TableOfReal TableOfReal_extractColumnsWhere (TableOfReal me, const wchar_t *cond
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": columns not extracted.");
+		Melder_throw (me, U": columns not extracted.");
 	}
 }
 
@@ -658,28 +658,28 @@ TableOfReal TableOfReal_extractColumnsWhere (TableOfReal me, const wchar_t *cond
 Strings TableOfReal_extractRowLabelsAsStrings (TableOfReal me) {
 	try {
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector <wchar_t *> (1, my numberOfRows);
+		thy strings = NUMvector <char32 *> (1, my numberOfRows);
 		thy numberOfStrings = my numberOfRows;
 		for (long irow = 1; irow <= my numberOfRows; irow ++) {
-			thy strings [irow] = Melder_wcsdup (my rowLabels [irow] ? my rowLabels [irow] : L"");
+			thy strings [irow] = Melder_dup (my rowLabels [irow] ? my rowLabels [irow] : U"");
 		}
 		return thee.transfer();	
 	} catch (MelderError) {
-		Melder_throw (me, ": row labels not extracted.");
+		Melder_throw (me, U": row labels not extracted.");
 	}
 }
 
 Strings TableOfReal_extractColumnLabelsAsStrings (TableOfReal me) {
 	try {
 		autoStrings thee = Thing_new (Strings);
-		thy strings = NUMvector <wchar_t *> (1, my numberOfColumns);
+		thy strings = NUMvector <char32 *> (1, my numberOfColumns);
 		thy numberOfStrings = my numberOfColumns;
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-			thy strings [icol] = Melder_wcsdup (my columnLabels [icol] ? my columnLabels [icol] : L"");
+			thy strings [icol] = Melder_dup (my columnLabels [icol] ? my columnLabels [icol] : U"");
 		}
 		return thee.transfer();	
 	} catch (MelderError) {
-		Melder_throw (me, ": column labels not extracted.");
+		Melder_throw (me, U": column labels not extracted.");
 	}
 }
 
@@ -689,7 +689,8 @@ static void NUMrationalize (double x, long *numerator, long *denominator) {
 	double epsilon = 1e-6;
 	*numerator = 1;
 	for (*denominator = 1; *denominator <= 100000; (*denominator) ++) {
-		double numerator_d = x * *denominator, rounded = floor (numerator_d + 0.5);
+		double numerator_d = x * *denominator;
+		long rounded = lround (numerator_d);
 		if (fabs (rounded - numerator_d) < epsilon) {
 			*numerator = rounded;
 			return;
@@ -698,21 +699,20 @@ static void NUMrationalize (double x, long *numerator, long *denominator) {
 	*denominator = 0;   /* Failure. */
 }
 
-static void print4 (wchar_t *buffer, double value, int iformat, int width, int precision) {
-	wchar_t formatString [40];
-	if (value == NUMundefined) wcscpy (buffer, L"undefined");
-	else if (iformat == 4) {
+static void print4 (char *buffer, double value, int iformat, int width, int precision) {
+	char formatString [40];
+	if (iformat == 4) {
 		long numerator, denominator;
 		NUMrationalize (value, & numerator, & denominator);
 		if (numerator == 0)
-			swprintf (buffer, 40, L"0");
+			snprintf (buffer, 40, "0");
 		else if (denominator > 1)
-			swprintf (buffer, 40, L"%ld/%ld", numerator, denominator);
+			snprintf (buffer, 40, "%ld/%ld", numerator, denominator);
 		else
-			swprintf (buffer, 40, L"%.7g", value);
+			snprintf (buffer, 40, "%.7g", value);
 	} else {
-		swprintf (formatString, 40, L"%%%d.%d%c", width, precision, iformat == 1 ? 'f' : iformat == 2 ? 'e' : 'g');
-		swprintf (buffer, 40, formatString, value);
+		snprintf (formatString, 40, "%%%d.%d%c", width, precision, iformat == 1 ? 'f' : iformat == 2 ? 'e' : 'g');
+		snprintf (buffer, 40, formatString, value);
 	}
 }
 
@@ -731,23 +731,23 @@ static double getMaxRowLabelWidth (TableOfReal me, Graphics graphics, long rowmi
 	if (! my rowLabels) return 0.0;
 	fixRows (me, & rowmin, & rowmax);
 	for (long irow = rowmin; irow <= rowmax; irow ++) if (my rowLabels [irow] && my rowLabels [irow] [0]) {
-		double textWidth = Graphics_textWidth_ps (graphics, my rowLabels [irow], TRUE);   /* SILIPA is bigger than XIPA */
+		double textWidth = Graphics_textWidth_ps (graphics, my rowLabels [irow], true);   // SILIPA is bigger than XIPA
 		if (textWidth > maxWidth) maxWidth = textWidth;
 	}
 	return maxWidth;
 }
 static double getLeftMargin (Graphics graphics) {
-	return Graphics_dxMMtoWC (graphics, 1);
+	return Graphics_dxMMtoWC (graphics, 1.0);
 }
 static double getLineSpacing (Graphics graphics) {
-	return Graphics_dyMMtoWC (graphics, 1.5 * Graphics_inqFontSize (graphics) * 25.4 / 72);
+	return Graphics_dyMMtoWC (graphics, 1.5 * Graphics_inqFontSize (graphics) * 25.4 / 72.0);
 }
 static double getMaxColumnLabelHeight (TableOfReal me, Graphics graphics, long colmin, long colmax) {
 	double maxHeight = 0.0, lineSpacing = getLineSpacing (graphics);
 	if (! my columnLabels) return 0.0;
 	fixRows (me, & colmin, & colmax);
 	for (long icol = colmin; icol <= colmax; icol ++) if (my columnLabels [icol] && my columnLabels [icol] [0]) {
-		if (! maxHeight) maxHeight = lineSpacing;
+		if (maxHeight == 0.0) maxHeight = lineSpacing;
 	}
 	return maxHeight;
 }
@@ -755,7 +755,7 @@ static double getMaxColumnLabelHeight (TableOfReal me, Graphics graphics, long c
 void TableOfReal_drawAsNumbers (TableOfReal me, Graphics graphics, long rowmin, long rowmax, int iformat, int precision) {
 	fixRows (me, & rowmin, & rowmax);
 	Graphics_setInner (graphics);
-	Graphics_setWindow (graphics, 0.5, my numberOfColumns + 0.5, 0, 1);
+	Graphics_setWindow (graphics, 0.5, my numberOfColumns + 0.5, 0.0, 1.0);
 	double leftMargin = getLeftMargin (graphics);   // not earlier!
 	double lineSpacing = getLineSpacing (graphics);   // not earlier!
 	double maxTextWidth = getMaxRowLabelWidth (me, graphics, rowmin, rowmax);
@@ -773,28 +773,28 @@ void TableOfReal_drawAsNumbers (TableOfReal me, Graphics graphics, long rowmin,
 			Graphics_text (graphics, 0.5 - leftMargin, y, my rowLabels [irow]);
 		Graphics_setTextAlignment (graphics, Graphics_CENTRE, Graphics_HALF);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-			wchar_t text [40];
+			char text [40];
 			print4 (text, my data [irow] [icol], iformat, 0, precision);
-			Graphics_text (graphics, icol, y, text);
+			Graphics_text (graphics, icol, y, Melder_peek8to32 (text));
 		}
 	}
-	if (maxTextHeight) {
+	if (maxTextHeight != 0.0) {
 		double left = 0.5;
 		if (maxTextWidth > 0.0) left -= maxTextWidth + 2 * leftMargin;
-		Graphics_line (graphics, left, 1, my numberOfColumns + 0.5, 1);
+		Graphics_line (graphics, left, 1.0, my numberOfColumns + 0.5, 1.0);
 	}
 	Graphics_unsetInner (graphics);
 }
 
 void TableOfReal_drawAsNumbers_if (TableOfReal me, Graphics graphics, long rowmin, long rowmax, int iformat, int precision,
-	const wchar_t *conditionFormula, Interpreter interpreter)
+	const char32 *conditionFormula, Interpreter interpreter)
 {
 	try {
 		autoMatrix original = TableOfReal_to_Matrix (me);
 		autoMatrix conditions = original.clone ();
 		fixRows (me, & rowmin, & rowmax);
 		Graphics_setInner (graphics);
-		Graphics_setWindow (graphics, 0.5, my numberOfColumns + 0.5, 0, 1);
+		Graphics_setWindow (graphics, 0.5, my numberOfColumns + 0.5, 0.0, 1.0);
 		double leftMargin = getLeftMargin (graphics);   // not earlier!
 		double lineSpacing = getLineSpacing (graphics);   // not earlier!
 		double maxTextWidth = getMaxRowLabelWidth (me, graphics, rowmin, rowmax);
@@ -813,19 +813,19 @@ void TableOfReal_drawAsNumbers_if (TableOfReal me, Graphics graphics, long rowmi
 				Graphics_text (graphics, 0.5 - leftMargin, y, my rowLabels [irow]);
 			Graphics_setTextAlignment (graphics, Graphics_CENTRE, Graphics_HALF);
 			for (long icol = 1; icol <= my numberOfColumns; icol ++) if (conditions -> z [irow] [icol] != 0.0) {
-				wchar_t text [40];
+				char text [40];
 				print4 (text, my data [irow] [icol], iformat, 0, precision);
-				Graphics_text (graphics, icol, y, text);
+				Graphics_text (graphics, icol, y, Melder_peek8to32 (text));
 			}
 		}
-		if (maxTextHeight) {
+		if (maxTextHeight != 0.0) {
 			double left = 0.5;
 			if (maxTextWidth > 0.0) left -= maxTextWidth + 2 * leftMargin;
-			Graphics_line (graphics, left, 1, my numberOfColumns + 0.5, 1);
+			Graphics_line (graphics, left, 1.0, my numberOfColumns + 0.5, 1.0);
 		}
 		Graphics_unsetInner (graphics);
 	} catch (MelderError) {
-		Melder_throw (me, ": numbers not drawn.");
+		Melder_throw (me, U": numbers not drawn.");
 	}
 }
 
@@ -840,7 +840,7 @@ void TableOfReal_drawVerticalLines (TableOfReal me, Graphics graphics, long rowm
 
 	if (maxTextWidth > 0.0) colmin -= 1;
 	for (long col = colmin + 1; col <= colmax; col ++)
-		Graphics_line (graphics, col - 0.5, 1 + maxTextHeight, col - 0.5, 1 - lineSpacing * (rowmax - rowmin + 1));
+		Graphics_line (graphics, col - 0.5, 1.0 + maxTextHeight, col - 0.5, 1.0 - lineSpacing * (rowmax - rowmin + 1));
 	Graphics_unsetInner (graphics);
 }
 
@@ -848,16 +848,16 @@ void TableOfReal_drawLeftAndRightLines (TableOfReal me, Graphics graphics, long
 	long colmin = 1, colmax = my numberOfColumns;
 	fixRows (me, & rowmin, & rowmax);
 	Graphics_setInner (graphics);
-	Graphics_setWindow (graphics, colmin - 0.5, colmax + 0.5, 0, 1);
+	Graphics_setWindow (graphics, colmin - 0.5, colmax + 0.5, 0.0, 1.0);
 	double lineSpacing = getLineSpacing (graphics);
 	double maxTextWidth = getMaxRowLabelWidth (me, graphics, rowmin, rowmax);
 	double maxTextHeight = getMaxColumnLabelHeight (me, graphics, 1, my numberOfColumns);
 
 	double left = 0.5;
-	if (maxTextWidth > 0.0) left -= maxTextWidth + 2 * lineSpacing;
+	if (maxTextWidth > 0.0) left -= maxTextWidth + 2.0 * lineSpacing;
 	double right = colmax + 0.5;
-	double top = 1 + maxTextHeight;
-	double bottom = 1 - lineSpacing * (rowmax - rowmin + 1);
+	double top = 1.0 + maxTextHeight;
+	double bottom = 1.0 - lineSpacing * (rowmax - rowmin + 1);
 	Graphics_line (graphics, left, top, left, bottom);
 	Graphics_line (graphics, right, top, right, bottom);
 	Graphics_unsetInner (graphics);
@@ -874,11 +874,11 @@ void TableOfReal_drawHorizontalLines (TableOfReal me, Graphics graphics, long ro
 
 	double left = 0.5;
 	double top = rowmin;
-	if (maxTextWidth > 0.0) left -= maxTextWidth + 2 * lineSpacing;
+	if (maxTextWidth > 0.0) left -= maxTextWidth + 2.0 * lineSpacing;
 	if (maxTextHeight > 0.0) rowmin -= 1;
 	double right = colmax + 0.5;
 	for (long irow = rowmin; irow < rowmax; irow ++) {
-		double y = 1 - lineSpacing * (irow - top + 1);
+		double y = 1.0 - lineSpacing * (irow - top + 1);
 		Graphics_line (graphics, left, y, right, y);
 	}
 	Graphics_unsetInner (graphics);
@@ -888,7 +888,7 @@ void TableOfReal_drawTopAndBottomLines (TableOfReal me, Graphics graphics, long
 	long colmin = 1, colmax = my numberOfColumns;
 	fixRows (me, & rowmin, & rowmax);
 	Graphics_setInner (graphics);
-	Graphics_setWindow (graphics, colmin - 0.5, colmax + 0.5, 0, 1);
+	Graphics_setWindow (graphics, colmin - 0.5, colmax + 0.5, 0.0, 1.0);
 	double lineSpacing = getLineSpacing (graphics);
 	double maxTextWidth = getMaxRowLabelWidth (me, graphics, rowmin, rowmax);
 	double maxTextHeight = getMaxColumnLabelHeight (me, graphics, 1, my numberOfColumns);
@@ -896,8 +896,8 @@ void TableOfReal_drawTopAndBottomLines (TableOfReal me, Graphics graphics, long
 	double left = 0.5;
 	if (maxTextWidth > 0.0) left -= maxTextWidth + 2 * lineSpacing;
 	double right = colmax + 0.5;
-	double top = 1 + maxTextHeight;
-	double bottom = 1 - lineSpacing * (rowmax - rowmin + 1);
+	double top = 1.0 + maxTextHeight;
+	double bottom = 1.0 - lineSpacing * (rowmax - rowmin + 1);
 	Graphics_line (graphics, left, top, right, top);
 	Graphics_line (graphics, left, bottom, right, bottom);
 	Graphics_unsetInner (graphics);
@@ -906,7 +906,7 @@ void TableOfReal_drawTopAndBottomLines (TableOfReal me, Graphics graphics, long
 void TableOfReal_drawAsSquares (TableOfReal me, Graphics graphics, long rowmin, long rowmax,
 	long colmin, long colmax, int garnish)
 {
-	double dx = 1, dy = 1;
+	double dx = 1.0, dy = 1.0;
 	Graphics_Colour colour = Graphics_inqColour (graphics);
 	fixRows (me, & rowmin, & rowmax);
 	fixColumns (me, & colmin, & colmax);
@@ -924,8 +924,8 @@ void TableOfReal_drawAsSquares (TableOfReal me, Graphics graphics, long rowmin,
 			double x = icol;
 			/* two neighbouring squares should not touch -> 0.95 */
 			double d = 0.95 * sqrt (fabs (my data [irow] [icol]) / datamax);
-			double x1WC = x - d * dx / 2, x2WC = x + d * dx / 2;
-			double y1WC = y - d * dy / 2, y2WC = y + d * dy / 2;
+			double x1WC = x - d * dx / 2.0, x2WC = x + d * dx / 2.0;
+			double y1WC = y - d * dy / 2.0, y2WC = y + d * dy / 2.0;
 			if (my data [irow] [icol] > 0) Graphics_setColour (graphics, Graphics_WHITE);
 			Graphics_fillRectangle (graphics, x1WC, x2WC, y1WC, y2WC);
 			Graphics_setColour (graphics, colour);
@@ -936,17 +936,17 @@ void TableOfReal_drawAsSquares (TableOfReal me, Graphics graphics, long rowmin,
 	Graphics_unsetInner (graphics);
 	if (garnish) {
 		for (long irow = rowmin; irow <= rowmax; irow ++) if (my rowLabels [irow]) 
-			Graphics_markLeft (graphics, rowmax + rowmin - irow, 0, 0, 0, my rowLabels [irow]);
+			Graphics_markLeft (graphics, rowmax + rowmin - irow, false, false, false, my rowLabels [irow]);
 		for (long icol = colmin; icol <= colmax; icol ++) if (my columnLabels [icol])
-			Graphics_markTop (graphics, icol, 0, 0, 0, my columnLabels [icol]);
+			Graphics_markTop (graphics, icol, false, false, false, my columnLabels [icol]);
 	}
 }
 
 Any TablesOfReal_append (TableOfReal me, TableOfReal thee) {
 	try {
 		if (thy numberOfColumns != my numberOfColumns)
-			Melder_throw (L"Numbers of columns are ", my numberOfColumns, " and ", thy numberOfColumns, " but should be equal.");
-		autoTableOfReal him = static_cast <TableOfReal> (_Thing_new (my classInfo));
+			Melder_throw (U"Numbers of columns are ", my numberOfColumns, U" and ", thy numberOfColumns, U" but should be equal.");
+		autoTableOfReal him = static_cast <TableOfReal> (Thing_newFromClass (my classInfo));
 		TableOfReal_init (him.peek(), my numberOfRows + thy numberOfRows, my numberOfColumns);
 		/* Unsafe: new attributes not initialized. */
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
@@ -965,22 +965,22 @@ Any TablesOfReal_append (TableOfReal me, TableOfReal thee) {
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal objects not appended.");
+		Melder_throw (U"TableOfReal objects not appended.");
 	}
 }
 
 Any TablesOfReal_appendMany (Collection me) {
 	try {
-		if (my size == 0) Melder_throw ("Cannot add zero tables.");
+		if (my size == 0) Melder_throw (U"Cannot add zero tables.");
 		TableOfReal thee = static_cast <TableOfReal> (my item [1]);
 		long totalNumberOfRows = thy numberOfRows;
 		long numberOfColumns = thy numberOfColumns;
 		for (long itab = 2; itab <= my size; itab ++) {
 			thee = static_cast <TableOfReal> (my item [itab]);
 			totalNumberOfRows += thy numberOfRows;
-			if (thy numberOfColumns != numberOfColumns) Melder_throw ("Numbers of columns do not match.");
+			if (thy numberOfColumns != numberOfColumns) Melder_throw (U"Numbers of columns do not match.");
 		}
-		autoTableOfReal him = static_cast <TableOfReal> (_Thing_new (thy classInfo));
+		autoTableOfReal him = static_cast <TableOfReal> (Thing_newFromClass (thy classInfo));
 		TableOfReal_init (him.peek(), totalNumberOfRows, numberOfColumns);
 		/* Unsafe: new attributes not initialized. */
 		for (long icol = 1; icol <= numberOfColumns; icol ++) {
@@ -999,24 +999,24 @@ Any TablesOfReal_appendMany (Collection me) {
 		Melder_assert (totalNumberOfRows == his numberOfRows);
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal objects not appended.");
+		Melder_throw (U"TableOfReal objects not appended.");
 	}
 }
 
 static void TableOfReal_sort (TableOfReal me, bool useLabels, long column1, long column2) {
 	for (long irow = 1; irow < my numberOfRows; irow ++) for (long jrow = irow + 1; jrow <= my numberOfRows; jrow ++) {
-		wchar_t *tmpString;
+		char32 *tmpString;
 		if (useLabels) {
 			if (my rowLabels [irow] != NULL) {
 				if (my rowLabels [jrow] != NULL) {
-					int compare = wcscmp (my rowLabels [irow], my rowLabels [jrow]);
+					int compare = str32cmp (my rowLabels [irow], my rowLabels [jrow]);
 					if (compare < 0) continue;
 					if (compare > 0) goto swap;
 				} else goto swap;
 			} else if (my rowLabels [jrow] != NULL) continue;
 		}
 		/*
-		 * If we arrive here, the two labels are equal or both NULL (or useLabels is FALSE).
+		 * If we arrive here, the two labels are equal or both NULL (or useLabels is `false`).
 		 */
 		if (column1 > 0 && column1 <= my numberOfColumns) {
 			if (my data [irow] [column1] < my data [jrow] [column1]) continue;
@@ -1066,8 +1066,8 @@ TableOfReal Table_to_TableOfReal (Table me, long labelColumn) {
 			}
 			for (long irow = 1; irow <= my rows -> size; irow ++) {
 				TableRow row = static_cast <TableRow> (my rows -> item [irow]);
-				wchar_t *string = row -> cells [labelColumn]. string;
-				TableOfReal_setRowLabel (thee.peek(), irow, string ? string : L"");
+				char32 *string = row -> cells [labelColumn]. string;
+				TableOfReal_setRowLabel (thee.peek(), irow, string ? string : U"");
 				for (long icol = 1; icol < labelColumn; icol ++) {
 					thy data [irow] [icol] = row -> cells [icol]. number;   // Optimization.
 					//thy data [irow] [icol] = Table_getNumericValue_Assert (me, irow, icol);
@@ -1091,71 +1091,71 @@ TableOfReal Table_to_TableOfReal (Table me, long labelColumn) {
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to TableOfReal.");
+		Melder_throw (me, U": not converted to TableOfReal.");
 	}
 }
 
-Table TableOfReal_to_Table (TableOfReal me, const wchar_t *labelOfFirstColumn) {
+Table TableOfReal_to_Table (TableOfReal me, const char32 *labelOfFirstColumn) {
 	try {
 		autoTable thee = Table_createWithoutColumnNames (my numberOfRows, my numberOfColumns + 1);
 		Table_setColumnLabel (thee.peek(), 1, labelOfFirstColumn);
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-			wchar_t *columnLabel = my columnLabels [icol];
-			thy columnHeaders [icol + 1]. label = Melder_wcsdup (columnLabel && columnLabel [0] ? columnLabel : L"?");
+			char32 *columnLabel = my columnLabels [icol];
+			thy columnHeaders [icol + 1]. label = Melder_dup (columnLabel && columnLabel [0] ? columnLabel : U"?");
 		}
 		for (long irow = 1; irow <= thy rows -> size; irow ++) {
-			wchar_t *stringValue = my rowLabels [irow];
+			char32 *stringValue = my rowLabels [irow];
 			TableRow row = static_cast <TableRow> (thy rows -> item [irow]);
-			row -> cells [1]. string = Melder_wcsdup (stringValue && stringValue [0] ? stringValue : L"?");
+			row -> cells [1]. string = Melder_dup (stringValue && stringValue [0] ? stringValue : U"?");
 			for (long icol = 1; icol <= my numberOfColumns; icol ++) {
 				double numericValue = my data [irow] [icol];
-				row -> cells [icol + 1]. string = Melder_wcsdup (Melder_double (numericValue));
+				row -> cells [icol + 1]. string = Melder_dup (Melder_double (numericValue));
 			}
 		}
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not converted to Table.");
+		Melder_throw (me, U": not converted to Table.");
 	}
 }
 
 void TableOfReal_writeToHeaderlessSpreadsheetFile (TableOfReal me, MelderFile file) {
 	try {
 		autoMelderString buffer;
-		MelderString_copy (& buffer, L"rowLabel");
+		MelderString_copy (& buffer, U"rowLabel");
 		for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-			MelderString_appendCharacter (& buffer, '\t');
-			wchar_t *s = my columnLabels [icol];
-			MelderString_append (& buffer, s != NULL && s [0] != '\0' ? s : L"?");
+			MelderString_appendCharacter (& buffer, U'\t');
+			char32 *s = my columnLabels [icol];
+			MelderString_append (& buffer, s != NULL && s [0] != U'\0' ? s : U"?");
 		}
-		MelderString_appendCharacter (& buffer, '\n');
+		MelderString_appendCharacter (& buffer, U'\n');
 		for (long irow = 1; irow <= my numberOfRows; irow ++) {
-			wchar_t *s = my rowLabels [irow];
-			MelderString_append (& buffer, s != NULL && s [0] != '\0' ? s : L"?");
+			char32 *s = my rowLabels [irow];
+			MelderString_append (& buffer, s != NULL && s [0] != U'\0' ? s : U"?");
 			for (long icol = 1; icol <= my numberOfColumns; icol ++) {
-				MelderString_appendCharacter (& buffer, '\t');
+				MelderString_appendCharacter (& buffer, U'\t');
 				double x = my data [irow] [icol];
-				MelderString_append (& buffer, Melder_double (x));
+				MelderString_append (& buffer, x);
 			}
-			MelderString_appendCharacter (& buffer, '\n');
+			MelderString_appendCharacter (& buffer, U'\n');
 		}
 		MelderFile_writeText (file, buffer.string, Melder_getOutputEncoding ());
 	} catch (MelderError) {
-		Melder_throw (me, ": not saved to tab-separated file.");
+		Melder_throw (me, U": not saved to tab-separated file.");
 	}
 }
 
 TableOfReal TableOfReal_readFromHeaderlessSpreadsheetFile (MelderFile file) {
 	try {
-		autostring string = MelderFile_readText (file);
+		autostring32 string = MelderFile_readText (file);
 		long nrow, ncol, nelements;
 
 		/*
 		 * Count columns.
 		 */
 		ncol = 0;
-		wchar_t *p = & string [0];
+		char32 *p = & string [0];
 		for (;;) {
-			wchar_t kar = *p++;
+			char32 kar = *p++;
 			if (kar == '\n' || kar == '\0') break;
 			if (kar == ' ' || kar == '\t') continue;
 			ncol ++;
@@ -1163,7 +1163,7 @@ TableOfReal TableOfReal_readFromHeaderlessSpreadsheetFile (MelderFile file) {
 			if (kar == '\n' || kar == '\0') break;
 		}
 		ncol --;
-		if (ncol < 1) Melder_throw ("No columns.");
+		if (ncol < 1) Melder_throw (U"No columns.");
 
 		/*
 		 * Count elements.
@@ -1171,19 +1171,19 @@ TableOfReal TableOfReal_readFromHeaderlessSpreadsheetFile (MelderFile file) {
 		p = & string [0];
 		nelements = 0;
 		for (;;) {
-			wchar_t kar = *p++;
-			if (kar == '\0') break;
-			if (kar == ' ' || kar == '\t' || kar == '\n') continue;
+			char32 kar = *p++;
+			if (kar == U'\0') break;
+			if (kar == U' ' || kar == U'\t' || kar == U'\n') continue;
 			nelements ++;
-			do { kar = *p++; } while (kar != ' ' && kar != '\t' && kar != '\n' && kar != '\0');
-			if (kar == '\0') break;
+			do { kar = *p++; } while (kar != U' ' && kar != U'\t' && kar != U'\n' && kar != U'\0');
+			if (kar == U'\0') break;
 		}
 
 		/*
 		 * Check if all columns are complete.
 		 */
 		if (nelements == 0 || nelements % (ncol + 1) != 0)
-			Melder_throw ("The number of elements (", nelements, ") is not a multiple of the number of columns plus 1 (", ncol + 1, ").");
+			Melder_throw (U"The number of elements (", nelements, U") is not a multiple of the number of columns plus 1 (", ncol + 1, U").");
 
 		/*
 		 * Create empty table.
@@ -1194,44 +1194,40 @@ TableOfReal TableOfReal_readFromHeaderlessSpreadsheetFile (MelderFile file) {
 		/*
 		 * Read elements.
 		 */
+		autoMelderString buffer;
 		p = & string [0];
-		while (*p == ' ' || *p == '\t') { Melder_assert (*p != '\0'); p ++; }
-		while (*p != ' ' && *p != '\t') { Melder_assert (*p != '\0'); p ++; }   // ignore the header of the zeroth column ("rowLabel" perhaps)
+		while (*p == U' ' || *p == U'\t') { Melder_assert (*p != U'\0'); p ++; }
+		while (*p != U' ' && *p != U'\t') { Melder_assert (*p != U'\0'); p ++; }   // ignore the header of the zeroth column ("rowLabel" perhaps)
 		for (long icol = 1; icol <= ncol; icol ++) {
-			while (*p == ' ' || *p == '\t') { Melder_assert (*p != '\0'); p ++; }
-			static MelderString buffer = { 0 };
+			while (*p == U' ' || *p == U'\t') { Melder_assert (*p != U'\0'); p ++; }
 			MelderString_empty (& buffer);
-			while (*p != ' ' && *p != '\t' && *p != '\n') {
+			while (*p != U' ' && *p != U'\t' && *p != U'\n') {
 				MelderString_appendCharacter (& buffer, *p);
 				p ++;
 			}
 			TableOfReal_setColumnLabel (me.peek(), icol, buffer.string);
-			MelderString_empty (& buffer);
 		}
 		for (long irow = 1; irow <= nrow; irow ++) {
-			while (*p == ' ' || *p == '\t' || *p == '\n') { Melder_assert (*p != '\0'); p ++; }
-			static MelderString buffer = { 0 };
+			while (*p == U' ' || *p == U'\t' || *p == U'\n') { Melder_assert (*p != U'\0'); p ++; }
 			MelderString_empty (& buffer);
-			while (*p != ' ' && *p != '\t') {
+			while (*p != U' ' && *p != U'\t') {
 				MelderString_appendCharacter (& buffer, *p);
 				p ++;
 			}
 			TableOfReal_setRowLabel (me.peek(), irow, buffer.string);
-			MelderString_empty (& buffer);
 			for (long icol = 1; icol <= ncol; icol ++) {
-				while (*p == ' ' || *p == '\t' || *p == '\n') { Melder_assert (*p != '\0'); p ++; }
+				while (*p == U' ' || *p == U'\t' || *p == U'\n') { Melder_assert (*p != U'\0'); p ++; }
 				MelderString_empty (& buffer);
-				while (*p != ' ' && *p != '\t' && *p != '\n' && *p != '\0') {
+				while (*p != U' ' && *p != U'\t' && *p != U'\n' && *p != U'\0') {
 					MelderString_appendCharacter (& buffer, *p);
 					p ++;
 				}
-				my data [irow] [icol] = Melder_atof (buffer.string);   /* If cell contains a string, this will be 0. */
-				MelderString_empty (& buffer);
+				my data [irow] [icol] = Melder_atof (buffer.string);   // if cell contains a string, this will be 0
 			}
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("TableOfReal: tab-separated file ", file, " not read.");
+		Melder_throw (U"TableOfReal: tab-separated file ", file, U" not read.");
 	}
 }
 
diff --git a/stat/TableOfReal.h b/stat/TableOfReal.h
index 4b93fa8..853fe70 100644
--- a/stat/TableOfReal.h
+++ b/stat/TableOfReal.h
@@ -2,7 +2,7 @@
 #define _TableOfReal_h_
 /* TableOfReal.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
 #include "Interpreter_decl.h"
 
 #include "TableOfReal_def.h"
-oo_CLASS_CREATE (TableOfReal, Data);
+oo_CLASS_CREATE (TableOfReal, Daata);
 
 void TableOfReal_init (TableOfReal me, long numberOfRows, long numberOfColumns);
 TableOfReal TableOfReal_create (long numberOfRows, long numberOfColumns);
@@ -34,19 +34,19 @@ void TableOfReal_removeRow (TableOfReal me, long irow);
 void TableOfReal_removeColumn (TableOfReal me, long icol);
 void TableOfReal_insertRow (TableOfReal me, long irow);
 void TableOfReal_insertColumn (TableOfReal me, long icol);
-void TableOfReal_setRowLabel (TableOfReal me, long irow, const wchar_t *label);
-void TableOfReal_setColumnLabel (TableOfReal me, long icol, const wchar_t *label);
-long TableOfReal_rowLabelToIndex (TableOfReal me, const wchar_t *label);
-long TableOfReal_columnLabelToIndex (TableOfReal me, const wchar_t *label);
+void TableOfReal_setRowLabel    (TableOfReal me, long irow, const char32 *label /* cattable */);
+void TableOfReal_setColumnLabel (TableOfReal me, long icol, const char32 *label /* cattable */);
+long TableOfReal_rowLabelToIndex    (TableOfReal me, const char32 *label /* cattable */);
+long TableOfReal_columnLabelToIndex (TableOfReal me, const char32 *label /* cattable */);
 double TableOfReal_getColumnMean (TableOfReal me, long icol);
 double TableOfReal_getColumnStdev (TableOfReal me, long icol);
 
 TableOfReal Table_to_TableOfReal (Table me, long labelColumn);
-Table TableOfReal_to_Table (TableOfReal me, const wchar_t *labelOfFirstColumn);
-void TableOfReal_formula (TableOfReal me, const wchar_t *expression, Interpreter interpreter, TableOfReal target);
+Table TableOfReal_to_Table (TableOfReal me, const char32 *labelOfFirstColumn);
+void TableOfReal_formula (TableOfReal me, const char32 *expression, Interpreter interpreter, TableOfReal target);
 void TableOfReal_drawAsNumbers (TableOfReal me, Graphics g, long rowmin, long rowmax, int iformat, int precision);
 void TableOfReal_drawAsNumbers_if (TableOfReal me, Graphics g, long rowmin, long rowmax, int iformat, int precision,
-	const wchar_t *conditionFormula, Interpreter interpreter);
+	const char32 *conditionFormula, Interpreter interpreter);
 void TableOfReal_drawAsSquares (TableOfReal me, Graphics g, long rowmin, long rowmax,
 	long colmin, long colmax, int garnish);
 void TableOfReal_drawVerticalLines (TableOfReal me, Graphics g, long rowmin, long rowmax);
@@ -62,17 +62,17 @@ void TableOfReal_sortByColumn (TableOfReal me, long column1, long column2);
 void TableOfReal_writeToHeaderlessSpreadsheetFile (TableOfReal me, MelderFile file);
 TableOfReal TableOfReal_readFromHeaderlessSpreadsheetFile (MelderFile file);
 
-TableOfReal TableOfReal_extractRowRanges (TableOfReal me, const wchar_t *ranges);
-TableOfReal TableOfReal_extractColumnRanges (TableOfReal me, const wchar_t *ranges);
+TableOfReal TableOfReal_extractRowRanges (TableOfReal me, const char32 *ranges);
+TableOfReal TableOfReal_extractColumnRanges (TableOfReal me, const char32 *ranges);
 
 TableOfReal TableOfReal_extractRowsWhereColumn (TableOfReal me, long icol, int which_Melder_NUMBER, double criterion);
 TableOfReal TableOfReal_extractColumnsWhereRow (TableOfReal me, long icol, int which_Melder_NUMBER, double criterion);
 
-TableOfReal TableOfReal_extractRowsWhereLabel (TableOfReal me, int which_Melder_STRING, const wchar_t *criterion);
-TableOfReal TableOfReal_extractColumnsWhereLabel (TableOfReal me, int which_Melder_STRING, const wchar_t *criterion);
+TableOfReal TableOfReal_extractRowsWhereLabel (TableOfReal me, int which_Melder_STRING, const char32 *criterion);
+TableOfReal TableOfReal_extractColumnsWhereLabel (TableOfReal me, int which_Melder_STRING, const char32 *criterion);
 
-TableOfReal TableOfReal_extractRowsWhere (TableOfReal me, const wchar_t *condition, Interpreter interpreter);
-TableOfReal TableOfReal_extractColumnsWhere (TableOfReal me, const wchar_t *condition, Interpreter interpreter);
+TableOfReal TableOfReal_extractRowsWhere (TableOfReal me, const char32 *condition, Interpreter interpreter);
+TableOfReal TableOfReal_extractColumnsWhere (TableOfReal me, const char32 *condition, Interpreter interpreter);
 
 Strings TableOfReal_extractRowLabelsAsStrings (TableOfReal me);
 Strings TableOfReal_extractColumnLabelsAsStrings (TableOfReal me);
diff --git a/stat/TableOfReal_def.h b/stat/TableOfReal_def.h
index dcd5a99..8466a02 100644
--- a/stat/TableOfReal_def.h
+++ b/stat/TableOfReal_def.h
@@ -1,6 +1,6 @@
 /* TableOfReal_def.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 
 #define ooSTRUCT TableOfReal
-oo_DEFINE_CLASS (TableOfReal, Data)
+oo_DEFINE_CLASS (TableOfReal, Daata)
 
 	oo_LONG (numberOfRows)
 	oo_LONG (numberOfColumns)
@@ -28,15 +28,36 @@ oo_DEFINE_CLASS (TableOfReal, Data)
 	oo_DOUBLE_MATRIX (data, numberOfRows, numberOfColumns)
 
 	#if oo_DECLARING
-		// overridden methods:
-		virtual void v_info ();
-		virtual bool v_hasGetNrow     () { return true; }   virtual double        v_getNrow     () { return numberOfRows; }
-		virtual bool v_hasGetNcol     () { return true; }   virtual double        v_getNcol     () { return numberOfColumns; }
-		virtual bool v_hasGetRowStr   () { return true; }   virtual const wchar_t * v_getRowStr   (long irow);
-		virtual bool v_hasGetColStr   () { return true; }   virtual const wchar_t * v_getColStr   (long icol);
-		virtual bool v_hasGetMatrix   () { return true; }   virtual double        v_getMatrix   (long irow, long icol);
-		virtual bool v_hasGetRowIndex () { return true; }   virtual double        v_getRowIndex (const wchar_t *rowLabel);
-		virtual bool v_hasGetColIndex () { return true; }   virtual double        v_getColIndex (const wchar_t *columnLabel);
+		void v_info ()
+			override;
+		bool v_hasGetNrow ()
+			override { return true; }
+		double v_getNrow ()
+			override { return numberOfRows; }
+		bool v_hasGetNcol ()
+			override { return true; }
+		double v_getNcol ()
+			override { return numberOfColumns; }
+		bool v_hasGetRowStr ()
+			override { return true; }
+		const char32 * v_getRowStr (long irow)
+			override;
+		bool v_hasGetColStr ()
+			override { return true; }
+		const char32 * v_getColStr (long icol)
+			override;
+		bool v_hasGetMatrix ()
+			override { return true; }
+		double v_getMatrix (long irow, long icol)
+			override;
+		bool v_hasGetRowIndex ()
+			override { return true; }
+		double v_getRowIndex (const char32 *rowLabel)
+			override;
+		bool v_hasGetColIndex ()
+			override { return true; }
+		double v_getColIndex (const char32 *columnLabel)
+			override;
 	#endif
 
 oo_END_CLASS (TableOfReal)
diff --git a/stat/Table_def.h b/stat/Table_def.h
index 2939c65..04184a3 100644
--- a/stat/Table_def.h
+++ b/stat/Table_def.h
@@ -1,6 +1,6 @@
 /* Table_def.h
  *
- * Copyright (C) 2002-2012 Paul Boersma
+ * Copyright (C) 2002-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@ oo_END_STRUCT (TableCell)
 
 
 #define ooSTRUCT TableRow
-oo_DEFINE_CLASS (TableRow, Data)
+oo_DEFINE_CLASS (TableRow, Daata)
 
 	#if oo_DECLARING || oo_COPYING
 		oo_LONG (sortingIndex)
@@ -56,23 +56,42 @@ oo_END_STRUCT (TableColumnHeader)
 
 
 #define ooSTRUCT Table
-oo_DEFINE_CLASS (Table, Data)
+oo_DEFINE_CLASS (Table, Daata)
 
 	oo_LONG (numberOfColumns)
 	oo_STRUCT_VECTOR (TableColumnHeader, columnHeaders, numberOfColumns)
 	oo_COLLECTION (Ordered, rows, TableRow, 0)
 
 	#if oo_DECLARING
-		// functions:
-			TableRow row (long i) { return static_cast <TableRow> (rows -> item [i]); }
-		// overridden methods:
-			virtual void v_info ();
-			virtual bool v_hasGetNrow      () { return true; }   virtual double        v_getNrow      () { return rows -> size; }
-			virtual bool v_hasGetNcol      () { return true; }   virtual double        v_getNcol      () { return numberOfColumns; }
-			virtual bool v_hasGetColStr    () { return true; }   virtual const wchar_t * v_getColStr    (long columnNumber);
-			virtual bool v_hasGetMatrix    () { return true; }   virtual double        v_getMatrix    (long rowNumber, long columnNumber);
-			virtual bool v_hasGetMatrixStr () { return true; }   virtual const wchar_t * v_getMatrixStr (long rowNumber, long columnNumber);
-			virtual bool v_hasGetColIndex  () { return true; }   virtual double        v_getColIndex  (const wchar_t *columnLabel);
+		TableRow row (long i) // accessor
+			{ return static_cast <TableRow> (rows -> item [i]); }
+
+		void v_info ()
+			override;
+		bool v_hasGetNrow ()
+			override { return true; }
+		double v_getNrow ()
+			override { return rows -> size; }
+		bool v_hasGetNcol ()
+			override { return true; }
+		double v_getNcol ()
+			override { return numberOfColumns; }
+		bool v_hasGetColStr ()
+			override { return true; }
+		const char32 * v_getColStr (long columnNumber)
+			override;
+		bool v_hasGetMatrix ()
+			override { return true; }
+		double v_getMatrix (long rowNumber, long columnNumber)
+			override;
+		bool v_hasGetMatrixStr ()
+			override { return true; }
+		const char32 * v_getMatrixStr (long rowNumber, long columnNumber)
+			override;
+		bool v_hasGetColIndex ()
+			override { return true; }
+		double v_getColIndex (const char32 *columnLabel)
+			override;
 	#endif
 
 oo_END_CLASS (Table)
diff --git a/stat/manual_statistics.cpp b/stat/manual_statistics.cpp
index e644172..d0c3024 100644
--- a/stat/manual_statistics.cpp
+++ b/stat/manual_statistics.cpp
@@ -22,71 +22,71 @@
 void manual_statistics_init (ManPages me);
 void manual_statistics_init (ManPages me) {
 
-MAN_BEGIN (L"Statistics", L"ppgb", 20060506)
-INTRO (L"This is the tutorial about basic statistical techniques in Praat, which work "
+MAN_BEGIN (U"Statistics", U"ppgb", 20060506)
+INTRO (U"This is the tutorial about basic statistical techniques in Praat, which work "
 	"with the @Table object or even directly from the @Goodies menu. It assumes that you are familiar with the @Intro.")
-NORMAL (L"(Under construction..................)")
-NORMAL (L"Goodies menu:")
-LIST_ITEM (L"• @@Difference of two proportions@")
-NORMAL (L"For a selected Table:")
-LIST_ITEM (L"• @@Logistic regression@")
-NORMAL (L"For more sophisticated techniques, see:")
-LIST_ITEM (L"• @@Principal component analysis@")
-LIST_ITEM (L"• @@Multidimensional scaling@")
-LIST_ITEM (L"• @@Discriminant analysis@")
+NORMAL (U"(Under construction..................)")
+NORMAL (U"Goodies menu:")
+LIST_ITEM (U"• @@Difference of two proportions@")
+NORMAL (U"For a selected Table:")
+LIST_ITEM (U"• @@Logistic regression@")
+NORMAL (U"For more sophisticated techniques, see:")
+LIST_ITEM (U"• @@Principal component analysis@")
+LIST_ITEM (U"• @@Multidimensional scaling@")
+LIST_ITEM (U"• @@Discriminant analysis@")
 MAN_END
 
-MAN_BEGIN (L"Difference of two proportions", L"ppgb", 20090717)
-INTRO (L"This page explains how you compute the significance of a difference between two proportions "
+MAN_BEGIN (U"Difference of two proportions", U"ppgb", 20090717)
+INTRO (U"This page explains how you compute the significance of a difference between two proportions "
 	"with a %\\ci^2 (chi-square) test.")
-ENTRY (L"1. Example of normal use")
-NORMAL (L"Suppose that you are interested in proving that for a certain experimental participant Task B is easier than Task A."
+ENTRY (U"1. Example of normal use")
+NORMAL (U"Suppose that you are interested in proving that for a certain experimental participant Task B is easier than Task A."
 	"You let the participant perform Task A 110 times, and she turns out to perform this task correctly 71 times. "
 	"You also let her perform Task B 120 times, and she performs this task correctly 93 times. "
 	"The following table summarizes the results of your experiment:")
-CODE1 (L"\t\tCorrect\tIncorrect")
-CODE1 (L"\tTask A\t71\t39")
-CODE1 (L"\tTask B\t93\t27")
-NORMAL (L"The null hypothesis is that both tasks are equally difficult for the participant "
+CODE1 (U"\t\tCorrect\tIncorrect")
+CODE1 (U"\tTask A\t71\t39")
+CODE1 (U"\tTask B\t93\t27")
+NORMAL (U"The null hypothesis is that both tasks are equally difficult for the participant "
 	"and that the probability that she performs Task A correctly is equal to "
 	"the probability that she performs Task B correctly.")
-NORMAL (L"To compute the probability that the observed proportions are at least as different as 93/120 and 71/110 "
+NORMAL (U"To compute the probability that the observed proportions are at least as different as 93/120 and 71/110 "
 	"if the null hypothesis is true, go to ##Report difference of two proportions# in the @Goodies menu "
 	"and fill in the four values 71, 39, 93, and 27. The resulting two-tailed %p is 0.04300, suggesting "
 	"that the null hypothesis can be rejected and the two tasks are not equally difficult for the participant "
 	"(if the possibility that Task A is easier for her than Task B can be ruled out a priori, "
 	"then the resulting one-tailed %p is 0.02150).")
-ENTRY (L"2. Example of incorrect use: areal features")
-NORMAL (L"An anonymous linguist once proposed that there was a causal relation between blood groups and the incidence "
+ENTRY (U"2. Example of incorrect use: areal features")
+NORMAL (U"An anonymous linguist once proposed that there was a causal relation between blood groups and the incidence "
 	"of dental fricatives. He noticed that dental fricatives occurred mainly in languages whose speakers "
 	"predominantly had blood group O. To prove his point, he tabulated 100 languages:")
-CODE1 (L"\t\t\tHas /θ/ or /ð/\t\tNo dental fricatives")
-CODE1 (L"\tGroup O\t\t24\t\t11")
-CODE1 (L"\tGroup A or B\t\t29\t\t36")
-NORMAL (L"Since %p < 0.05, the linguist regarded his hypothesis as being supported by the facts. "
+CODE1 (U"\t\t\tHas /θ/ or /ð/\t\tNo dental fricatives")
+CODE1 (U"\tGroup O\t\t24\t\t11")
+CODE1 (U"\tGroup A or B\t\t29\t\t36")
+NORMAL (U"Since %p < 0.05, the linguist regarded his hypothesis as being supported by the facts. "
 	"However, this %χ^2 test assumes that the 100 languages are independent, but they are not. "
 	"Two adjacent languages tend to correlate in their probability of having dental fricatives, "
 	"and their speakers tend to correlate in their blood groups. Both are %%areal features%, "
 	"which undermine the independence assumed by the %χ^2 test. The actual null hypothesis "
 	"that the test rejected was the combined hypothesis that dental fricatives correlate with blood group "
 	"%and that the 100 languages are independent.")
-NORMAL (L"Another anonymous linguist proposed that those Limburgian dialects that had lost their tone contrast "
+NORMAL (U"Another anonymous linguist proposed that those Limburgian dialects that had lost their tone contrast "
 	"compensated this by having larger vowel inventories. He drew up a table of the dialects of 100 villages:")
-CODE1 (L"\t\t\tHas tone\t\tHas no tone")
-CODE1 (L"\tHas over 25 vowels\t\t10\t\t7")
-CODE1 (L"\tHas under 25 vowels\t\t80\t\t3")
-NORMAL (L"This result is very significant (%p < 10^^-4^), but only shows that %either there is a relation between "
+CODE1 (U"\t\t\tHas tone\t\tHas no tone")
+CODE1 (U"\tHas over 25 vowels\t\t10\t\t7")
+CODE1 (U"\tHas under 25 vowels\t\t80\t\t3")
+NORMAL (U"This result is very significant (%p < 10^^-4^), but only shows that %either there is a relation between "
 	"tone and the number of vowels %or that the dialects are not independent. And since adjacent dialects are "
 	"arguably dependent both with respect to tone and the number of vowels, the statistical significance does "
 	"not allow us to draw any conclusion about the relationship between tone and the number of vowels.")
-ENTRY (L"3. Example of problematic use: pooling participants")
-NORMAL (L"An anonymous student decided to do the Task A versus Task B experiment described above, "
+ENTRY (U"3. Example of problematic use: pooling participants")
+NORMAL (U"An anonymous student decided to do the Task A versus Task B experiment described above, "
 	"but did not let one participant perform all the 230 tasks. Instead, she let 5 participants perform 46 tasks each "
 	"(22 times task A, 24 times Task B). The pooled data were:")
-CODE1 (L"\t\tCorrect\tIncorrect")
-CODE1 (L"\tTask A\t71\t39")
-CODE1 (L"\tTask B\t104\t16")
-NORMAL (L"The resulting %p is 0.00016. So what is the conclusion, if the measurements can clearly be dependent? "
+CODE1 (U"\t\tCorrect\tIncorrect")
+CODE1 (U"\tTask A\t71\t39")
+CODE1 (U"\tTask B\t104\t16")
+NORMAL (U"The resulting %p is 0.00016. So what is the conclusion, if the measurements can clearly be dependent? "
 	"Well, if the null hypothesis is that all five participants are equally good at Task A as at Task B, "
 	"then this hypothesis can be rejected. The conclusion must be that %%these five participants% have on average "
 	"more trouble with Task A than with Task B. The student incorrectly concluded, however, that Task A was "
@@ -96,16 +96,16 @@ NORMAL (L"The resulting %p is 0.00016. So what is the conclusion, if the measure
 	"the participants: count those participants who score better on Task A than on Task B and see whether this number "
 	"is reliably less than 50 percent of all participants. For five participants, such a sign test "
 	"would %never reach significance at a two-tailed 5 percent level (2·0.5^5 = 0.0625).")
-ENTRY (L"4. Example of problematic use: pooling participants")
-NORMAL (L"Our purpose was to disprove the null hypothesis that listeners' perception does not depend on the language "
+ENTRY (U"4. Example of problematic use: pooling participants")
+NORMAL (U"Our purpose was to disprove the null hypothesis that listeners' perception does not depend on the language "
 	"they think they hear. However, certain vowel tokens acoustically in between the Dutch /ɑ/ and the Dutch /ɔ/ "
 	"were perceived 50 percent of the time as /ɑ/ and 50 percent of the time as /ɔ/ when Dutch learners of Spanish thought "
 	"they were hearing Dutch, but 60 percent of the time as /ɔ/ when they thought they were hearing Spanish. "
 	"The responses of 40 listeners, all of whom underwent both language modes, is combined in the following table:")
-CODE1 (L"\t\t/ɑ/\t/ɔ/")
-CODE1 (L"\tDutch mode\t200\t200")
-CODE1 (L"\tSpanish mode\t160\t240")
-NORMAL (L"The result was %p = 0.0056, which reliably showed that these 40 listeners on average shifted their category "
+CODE1 (U"\t\t/ɑ/\t/ɔ/")
+CODE1 (U"\tDutch mode\t200\t200")
+CODE1 (U"\tSpanish mode\t160\t240")
+NORMAL (U"The result was %p = 0.0056, which reliably showed that these 40 listeners on average shifted their category "
 	"boundary toward /ɑ/ when they thought that the language they were listening to was Spanish. "
 	"The conclusion is that not all listeners were indifferent to the language mode, "
 	"so that mode-dependent perception must exist. The explanation in this case was that the Spanish /a/ "
@@ -116,32 +116,32 @@ NORMAL (L"The result was %p = 0.0056, which reliably showed that these 40 listen
 	"(this is easier to accomplish for 40 participants than for 5).")
 MAN_END
 
-MAN_BEGIN (L"Logistic regression", L"ppgb", 20141001)
-INTRO (L"This page explains how you do logistic regression with Praat. "
+MAN_BEGIN (U"Logistic regression", U"ppgb", 20141001)
+INTRO (U"This page explains how you do logistic regression with Praat. "
 	"You start by saving a table in a text file (if it contains non-ASCII symbols such as æ or ɛ, "
 	"use the UTF-8 or UTF-16 format). "
 	"The following example contains natural stimuli (female speaker) with measured F1 and duration values, "
 	"and the responses of a certain listener who is presented each stimulus 10 times.")
-CODE1 (L" F1    Dur   /æ/   /ɛ/")
-CODE1 (L" 764    87    2     8")
-CODE1 (L" 674   104    3     7")
-CODE1 (L" 574   126    0    10")
-CODE1 (L" 566    93    1     9")
-CODE1 (L" 618   118    1     9")
-CODE1 (L"1025   147   10     0")
-CODE1 (L" 722   117    7     3")
-CODE1 (L" 696   169    9     1")
-CODE1 (L"1024   124   10     0")
-CODE1 (L" 752    92    6     4")
-NORMAL (L"In this table we see 10 different stimuli, each characterized by a certain combination "
+CODE1 (U" F1    Dur   /æ/   /ɛ/")
+CODE1 (U" 764    87    2     8")
+CODE1 (U" 674   104    3     7")
+CODE1 (U" 574   126    0    10")
+CODE1 (U" 566    93    1     9")
+CODE1 (U" 618   118    1     9")
+CODE1 (U"1025   147   10     0")
+CODE1 (U" 722   117    7     3")
+CODE1 (U" 696   169    9     1")
+CODE1 (U"1024   124   10     0")
+CODE1 (U" 752    92    6     4")
+NORMAL (U"In this table we see 10 different stimuli, each characterized by a certain combination "
 	"of the factors (independent variables) %F1 (first formant in Hertz) and %Dur (duration in milliseconds). "
 	"The first row of the table means that there was a stimulus with an F1 of 764 Hz and a duration of 87 ms, "
 	"and that the listener responded to this stimulus 2 times with the response category /æ/, "
 	"and the remaining 8 times with the category /ɛ/.")
-NORMAL (L"A table as above can be typed into a text file. The columns can be separated with spaces and/or tab stops. "
+NORMAL (U"A table as above can be typed into a text file. The columns can be separated with spaces and/or tab stops. "
 	"The file can be read into Praat with ##Read Table from table file...#. "
 	"The command ##To logistic regression...# will become available in the #Statistics menu.")
-ENTRY (L"What does it do?")
+ENTRY (U"What does it do?")
 /*SCRIPT (4.5, 4,
 	"Axes... 60 180 900 500\n"
 	"Marks bottom every... 1 30 yes yes no\n"
@@ -160,17 +160,17 @@ ENTRY (L"What does it do?")
 	"Text... mdur_ep Centre mf1_ep Half /ɛ/\n"
 	"Draw inner box\n"
 )*/
-NORMAL (L"The logistic regression method will find values %α, %%β__F1_% and %%β__dur_% "
+NORMAL (U"The logistic regression method will find values %α, %%β__F1_% and %%β__dur_% "
 	"that optimize")
-FORMULA (L"%α + %%β__F1_% %F1__%k_ + %%β__dur_% %Dur__%k_ = ln (%p__%k_(/ɛ/)/%p__%k_(/æ/))")
-NORMAL (L"where %k runs from 1 to 10, and %p__%k_(/æ/) + %p__%k_(/ɛ/) = 1.")
-NORMAL (L"The optimization criterion is %%maximum likelihood%, i.e. those %α, %%β__F1_% and %%β__dur_% "
+FORMULA (U"%α + %%β__F1_% %F1__%k_ + %%β__dur_% %Dur__%k_ = ln (%p__%k_(/ɛ/)/%p__%k_(/æ/))")
+NORMAL (U"where %k runs from 1 to 10, and %p__%k_(/æ/) + %p__%k_(/ɛ/) = 1.")
+NORMAL (U"The optimization criterion is %%maximum likelihood%, i.e. those %α, %%β__F1_% and %%β__dur_% "
 	"will be chosen that lead to values for %p__%k_(/æ/) and %p__%k_(/ɛ/) that make the observations in the table "
 	"most likely.")
-NORMAL (L"Praat will create an object of type #LogisticRegression in the list. "
+NORMAL (U"Praat will create an object of type #LogisticRegression in the list. "
 	"When you then click the #Info button, Praat will write the values of %α (the %intercept), "
 	"%%β__F1_% and %%β__dur_% into the Info window (as well as much other information).")
-NORMAL (L"The number of factors does not have to be 2; it can be 1 or more. "
+NORMAL (U"The number of factors does not have to be 2; it can be 1 or more. "
 	"The number of dependent categories is always 2.")
 MAN_END
 
diff --git a/stat/praat_Stat.cpp b/stat/praat_Stat.cpp
index 1bac4c6..372c46d 100644
--- a/stat/praat_Stat.cpp
+++ b/stat/praat_Stat.cpp
@@ -1,6 +1,6 @@
 /* praat_Stat.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,15 +30,11 @@
 #undef iam
 #define iam iam_LOOP
 
-static wchar_t formatBuffer [32] [40];
-static int formatIndex = 0;
-static wchar_t * Table_messageColumn (Table me, long column) {
-	if (++ formatIndex == 32) formatIndex = 0;
-	if (my columnHeaders [column]. label != NULL && my columnHeaders [column]. label [0] != '\0')
-		swprintf (formatBuffer [formatIndex], 40, L"\"%.39ls\"", my columnHeaders [column]. label);
+static const char32 * Table_messageColumn (Table me, long column) {
+	if (my columnHeaders [column]. label != NULL && my columnHeaders [column]. label [0] != U'\0')
+		return Melder_cat (U"\"", my columnHeaders [column]. label, U"\"");
 	else
-		swprintf (formatBuffer [formatIndex], 40, L"%ld", column);
-	return formatBuffer [formatIndex];
+		return Melder_integer (column);
 }
 
 /***** DISTRIBUTIONS *****/
@@ -48,55 +44,55 @@ static wchar_t * Table_messageColumn (Table me, long column) {
 DIRECT2 (Distributionses_add) {
 	autoCollection me = praat_getSelectedObjects ();
 	autoDistributions thee = Distributions_addMany (me.peek());
-	praat_new (thee.transfer(), L"added");
+	praat_new (thee.transfer(), U"added");
 END2 }
 
-FORM (Distributionses_getMeanAbsoluteDifference, L"Get mean difference", 0) {
-	NATURAL (L"Column number", L"1")
+FORM (Distributionses_getMeanAbsoluteDifference, U"Get mean difference", 0) {
+	NATURAL (U"Column number", U"1")
 	OK2
 DO
 	Distributions me = NULL, thee = NULL;
 	LOOP {
 		(me ? thee : me) = (Distributions) OBJECT;
 	}
-	Melder_informationReal (Distributionses_getMeanAbsoluteDifference (me, thee, GET_INTEGER (L"Column number")), NULL);
+	Melder_informationReal (Distributionses_getMeanAbsoluteDifference (me, thee, GET_INTEGER (U"Column number")), NULL);
 END2 }
 
-FORM (Distributions_getProbability, L"Get probability", 0) {
-	NATURAL (L"Column number", L"1")
-	SENTENCE (L"String", L"")
+FORM (Distributions_getProbability, U"Get probability", 0) {
+	NATURAL (U"Column number", U"1")
+	SENTENCE (U"String", U"")
 	OK2
 DO
 	LOOP {
 		iam (Distributions);
-		double probability = Distributions_getProbability (me, GET_STRING (L"String"), GET_INTEGER (L"Column number"));
+		double probability = Distributions_getProbability (me, GET_STRING (U"String"), GET_INTEGER (U"Column number"));
 		Melder_informationReal (probability, NULL);
 	}
 END2 }
 
 DIRECT2 (Distributions_help) {
-	Melder_help (L"Distributions");
+	Melder_help (U"Distributions");
 END2 }
 
-FORM (Distributions_to_Strings, L"To Strings", 0) {
-	NATURAL (L"Column number", L"1")
-	NATURAL (L"Number of strings", L"1000")
+FORM (Distributions_to_Strings, U"To Strings", 0) {
+	NATURAL (U"Column number", U"1")
+	NATURAL (U"Number of strings", U"1000")
 	OK2
 DO
 	LOOP {
 		iam (Distributions);
-		autoStrings thee = Distributions_to_Strings (me, GET_INTEGER (L"Column number"), GET_INTEGER (L"Number of strings"));
+		autoStrings thee = Distributions_to_Strings (me, GET_INTEGER (U"Column number"), GET_INTEGER (U"Number of strings"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM (Distributions_to_Strings_exact, L"To Strings (exact)", 0) {
-	NATURAL (L"Column number", L"1")
+FORM (Distributions_to_Strings_exact, U"To Strings (exact)", 0) {
+	NATURAL (U"Column number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (Distributions);
-		autoStrings thee = Distributions_to_Strings_exact (me, GET_INTEGER (L"Column number"));
+		autoStrings thee = Distributions_to_Strings_exact (me, GET_INTEGER (U"Column number"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
@@ -105,25 +101,25 @@ END2 }
 #pragma mark -
 #pragma mark LOGISTICREGRESSION
 
-FORM (LogisticRegression_drawBoundary, L"LogisticRegression: Draw boundary", 0) {
-	WORD (L"Horizontal factor", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0 (= auto)")
-	WORD (L"Vertical factor", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	BOOLEAN (L"Garnish", 1)
+FORM (LogisticRegression_drawBoundary, U"LogisticRegression: Draw boundary", 0) {
+	WORD (U"Horizontal factor", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0 (= auto)")
+	WORD (U"Vertical factor", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (LogisticRegression);
-		long xfactor = Regression_getFactorIndexFromFactorName_e (me, GET_STRING (L"Horizontal factor"));
-		long yfactor = Regression_getFactorIndexFromFactorName_e (me, GET_STRING (L"Vertical factor"));
+		long xfactor = Regression_getFactorIndexFromFactorName_e (me, GET_STRING (U"Horizontal factor"));
+		long yfactor = Regression_getFactorIndexFromFactorName_e (me, GET_STRING (U"Vertical factor"));
 		LogisticRegression_drawBoundary (me, GRAPHICS,
-			xfactor, GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			yfactor, GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_INTEGER (L"Garnish"));
+			xfactor, GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			yfactor, GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_INTEGER (U"Garnish"));
 	}
 END2 }
 
@@ -150,44 +146,46 @@ END2 }
 DIRECT2 (PairDistribution_getNumberOfPairs) {
 	LOOP {
 		iam (PairDistribution);
-		Melder_information (Melder_integer (my pairs -> size));
+		Melder_information (my pairs -> size);
 	}
 END2 }
 
-FORM (PairDistribution_getString1, L"Get string1", 0) {
-	NATURAL (L"Pair number", L"1")
+FORM (PairDistribution_getString1, U"Get string1", 0) {
+	NATURAL (U"Pair number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (PairDistribution);
-		const wchar_t *string1 = PairDistribution_getString1 (me, GET_INTEGER (L"Pair number"));
+		const char32 *string1 = PairDistribution_getString1 (me, GET_INTEGER (U"Pair number"));
 		Melder_information (string1);
 	}
 END2 }
 
-FORM (PairDistribution_getString2, L"Get string2", 0) {
-	NATURAL (L"Pair number", L"1")
+FORM (PairDistribution_getString2, U"Get string2", 0) {
+	NATURAL (U"Pair number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (PairDistribution);
-		const wchar_t *string2 = PairDistribution_getString2 (me, GET_INTEGER (L"Pair number"));
+		const char32 *string2 = PairDistribution_getString2 (me, GET_INTEGER (U"Pair number"));
 		Melder_information (string2);
 	}
 END2 }
 
-FORM (PairDistribution_getWeight, L"Get weight", 0) {
-	NATURAL (L"Pair number", L"1")
+FORM (PairDistribution_getWeight, U"Get weight", 0) {
+	NATURAL (U"Pair number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (PairDistribution);
-		double weight = PairDistribution_getWeight (me, GET_INTEGER (L"Pair number"));
-		Melder_information (Melder_double (weight));
+		double weight = PairDistribution_getWeight (me, GET_INTEGER (U"Pair number"));
+		Melder_information (weight);
 	}
 END2 }
 
-DIRECT2 (PairDistribution_help) { Melder_help (L"PairDistribution"); END2 }
+DIRECT2 (PairDistribution_help) {
+	Melder_help (U"PairDistribution");
+END2 }
 
 DIRECT2 (PairDistribution_removeZeroWeights) {
 	LOOP {
@@ -200,24 +198,24 @@ END2 }
 DIRECT2 (PairDistribution_swapInputsAndOutputs) {
 	LOOP {
 		iam (PairDistribution);
-		my f_swapInputsAndOutputs ();
+		PairDistribution_swapInputsAndOutputs (me);
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (PairDistribution_to_Stringses, L"Generate two Strings objects", 0) {
-	NATURAL (L"Number", L"1000")
-	SENTENCE (L"Name of first Strings", L"input")
-	SENTENCE (L"Name of second Strings", L"output")
+FORM (PairDistribution_to_Stringses, U"Generate two Strings objects", 0) {
+	NATURAL (U"Number", U"1000")
+	SENTENCE (U"Name of first Strings", U"input")
+	SENTENCE (U"Name of second Strings", U"output")
 	OK2
 DO
 	LOOP {
 		iam (PairDistribution);
 		Strings strings1_, strings2_;
-		PairDistribution_to_Stringses (me, GET_INTEGER (L"Number"), & strings1_, & strings2_);
+		PairDistribution_to_Stringses (me, GET_INTEGER (U"Number"), & strings1_, & strings2_);
 		autoStrings strings1 = strings1_, strings2 = strings2_;   // UGLY
-		praat_new (strings1.transfer(), GET_STRING (L"Name of first Strings"));
-		praat_new (strings2.transfer(), GET_STRING (L"Name of second Strings"));
+		praat_new (strings1.transfer(), GET_STRING (U"Name of first Strings"));
+		praat_new (strings2.transfer(), GET_STRING (U"Name of second Strings"));
 	}
 END2 }
 
@@ -233,8 +231,8 @@ END2 }
 #pragma mark -
 #pragma mark PAIRDISTRIBUTION & DISTRIBUTIONS
 
-FORM (PairDistribution_Distributions_getFractionCorrect, L"PairDistribution & Distributions: Get fraction correct", 0) {
-	NATURAL (L"Column", L"1")
+FORM (PairDistribution_Distributions_getFractionCorrect, U"PairDistribution & Distributions: Get fraction correct", 0) {
+	NATURAL (U"Column", U"1")
 	OK2
 DO
 	PairDistribution me = NULL;
@@ -243,7 +241,7 @@ DO
 		if (CLASS == classPairDistribution) me = (PairDistribution) OBJECT;
 		if (CLASS == classDistributions) thee = (Distributions) OBJECT;
 	}
-	double fractionCorrect = PairDistribution_Distributions_getFractionCorrect (me, thee, GET_INTEGER (L"Column"));
+	double fractionCorrect = PairDistribution_Distributions_getFractionCorrect (me, thee, GET_INTEGER (U"Column"));
 	Melder_informationReal (fractionCorrect, NULL);
 END2 }
 
@@ -259,76 +257,76 @@ DIRECT2 (Tables_append) {
 		Collection_addItem (collection.peek(), me);
 	}
 	autoTable thee = Tables_append (collection.peek());
-	praat_new (thee.transfer(), L"appended");
+	praat_new (thee.transfer(), U"appended");
 END2 }
 
-FORM (Table_appendColumn, L"Table: Append column", 0) {
-	WORD (L"Label", L"newcolumn")
+FORM (Table_appendColumn, U"Table: Append column", 0) {
+	WORD (U"Label", U"newcolumn")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		Table_appendColumn (me, GET_STRING (L"Label"));
+		Table_appendColumn (me, GET_STRING (U"Label"));
 		praat_dataChanged (OBJECT);
 	}
 END2 }
 
-FORM (Table_appendDifferenceColumn, L"Table: Append difference column", 0) {
-	WORD (L"left Columns", L"")
-	WORD (L"right Columns", L"")
-	WORD (L"Label", L"diff")
+FORM (Table_appendDifferenceColumn, U"Table: Append difference column", 0) {
+	WORD (U"left Columns", U"")
+	WORD (U"right Columns", U"")
+	WORD (U"Label", U"diff")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"left Columns"));
-		long jcol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"right Columns"));
-		Table_appendDifferenceColumn (me, icol, jcol, GET_STRING (L"Label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"left Columns"));
+		long jcol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"right Columns"));
+		Table_appendDifferenceColumn (me, icol, jcol, GET_STRING (U"Label"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Table_appendProductColumn, L"Table: Append product column", 0) {
-	WORD (L"left Columns", L"")
-	WORD (L"right Columns", L"")
-	WORD (L"Label", L"diff")
+FORM (Table_appendProductColumn, U"Table: Append product column", 0) {
+	WORD (U"left Columns", U"")
+	WORD (U"right Columns", U"")
+	WORD (U"Label", U"diff")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"left Columns"));
-		long jcol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"right Columns"));
-		Table_appendProductColumn (me, icol, jcol, GET_STRING (L"Label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"left Columns"));
+		long jcol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"right Columns"));
+		Table_appendProductColumn (me, icol, jcol, GET_STRING (U"Label"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Table_appendQuotientColumn, L"Table: Append quotient column", 0) {
-	WORD (L"left Columns", L"")
-	WORD (L"right Columns", L"")
-	WORD (L"Label", L"diff")
+FORM (Table_appendQuotientColumn, U"Table: Append quotient column", 0) {
+	WORD (U"left Columns", U"")
+	WORD (U"right Columns", U"")
+	WORD (U"Label", U"diff")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"left Columns"));
-		long jcol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"right Columns"));
-		Table_appendQuotientColumn (me, icol, jcol, GET_STRING (L"Label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"left Columns"));
+		long jcol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"right Columns"));
+		Table_appendQuotientColumn (me, icol, jcol, GET_STRING (U"Label"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Table_appendSumColumn, L"Table: Append sum column", 0) {
-	WORD (L"left Columns", L"")
-	WORD (L"right Columns", L"")
-	WORD (L"Label", L"diff")
+FORM (Table_appendSumColumn, U"Table: Append sum column", 0) {
+	WORD (U"left Columns", U"")
+	WORD (U"right Columns", U"")
+	WORD (U"Label", U"diff")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"left Columns"));
-		long jcol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"right Columns"));
-		Table_appendSumColumn (me, icol, jcol, GET_STRING (L"Label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"left Columns"));
+		long jcol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"right Columns"));
+		Table_appendSumColumn (me, icol, jcol, GET_STRING (U"Label"));
 		praat_dataChanged (me);
 	}
 END2 }
@@ -341,90 +339,90 @@ DIRECT2 (Table_appendRow) {
 	}
 END2 }
 
-FORM (Table_collapseRows, L"Table: Collapse rows", 0) {
-	LABEL (L"", L"Columns with factors (independent variables):")
-	TEXTFIELD (L"factors", L"speaker dialect age vowel")
-	LABEL (L"", L"Columns to sum:")
-	TEXTFIELD (L"columnsToSum", L"number cost")
-	LABEL (L"", L"Columns to average:")
-	TEXTFIELD (L"columnsToAverage", L"price")
-	LABEL (L"", L"Columns to medianize:")
-	TEXTFIELD (L"columnsToMedianize", L"vot")
-	LABEL (L"", L"Columns to average logarithmically:")
-	TEXTFIELD (L"columnsToAverageLogarithmically", L"duration")
-	LABEL (L"", L"Columns to medianize logarithmically:")
-	TEXTFIELD (L"columnsToMedianizeLogarithmically", L"F0 F1 F2 F3")
-	LABEL (L"", L"Columns not mentioned above will be ignored.")
+FORM (Table_collapseRows, U"Table: Collapse rows", 0) {
+	LABEL (U"", U"Columns with factors (independent variables):")
+	TEXTFIELD (U"factors", U"speaker dialect age vowel")
+	LABEL (U"", U"Columns to sum:")
+	TEXTFIELD (U"columnsToSum", U"number cost")
+	LABEL (U"", U"Columns to average:")
+	TEXTFIELD (U"columnsToAverage", U"price")
+	LABEL (U"", U"Columns to medianize:")
+	TEXTFIELD (U"columnsToMedianize", U"vot")
+	LABEL (U"", U"Columns to average logarithmically:")
+	TEXTFIELD (U"columnsToAverageLogarithmically", U"duration")
+	LABEL (U"", U"Columns to medianize logarithmically:")
+	TEXTFIELD (U"columnsToMedianizeLogarithmically", U"F0 F1 F2 F3")
+	LABEL (U"", U"Columns not mentioned above will be ignored.")
 	OK2
 DO
 	LOOP {
 		iam (Table);
 		autoTable thee = Table_collapseRows (me,
-			GET_STRING (L"factors"), GET_STRING (L"columnsToSum"),
-			GET_STRING (L"columnsToAverage"), GET_STRING (L"columnsToMedianize"),
-			GET_STRING (L"columnsToAverageLogarithmically"), GET_STRING (L"columnsToMedianizeLogarithmically"));
-		praat_new (thee.transfer(), my name, L"_pooled");
+			GET_STRING (U"factors"), GET_STRING (U"columnsToSum"),
+			GET_STRING (U"columnsToAverage"), GET_STRING (U"columnsToMedianize"),
+			GET_STRING (U"columnsToAverageLogarithmically"), GET_STRING (U"columnsToMedianizeLogarithmically"));
+		praat_new (thee.transfer(), my name, U"_pooled");
 	}
 END2 }
 
-FORM (Table_createWithColumnNames, L"Create Table with column names", 0) {
-	WORD (L"Name", L"table")
-	INTEGER (L"Number of rows", L"10")
-	LABEL (L"", L"Column names:")
-	TEXTFIELD (L"columnNames", L"speaker dialect age vowel F0 F1 F2")
+FORM (Table_createWithColumnNames, U"Create Table with column names", 0) {
+	WORD (U"Name", U"table")
+	INTEGER (U"Number of rows", U"10")
+	LABEL (U"", U"Column names:")
+	TEXTFIELD (U"columnNames", U"speaker dialect age vowel F0 F1 F2")
 	OK2
 DO
-	autoTable me = Table_createWithColumnNames (GET_INTEGER (L"Number of rows"), GET_STRING (L"columnNames"));
-	praat_new (me.transfer(), GET_STRING (L"Name"));
+	autoTable me = Table_createWithColumnNames (GET_INTEGER (U"Number of rows"), GET_STRING (U"columnNames"));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
 END2 }
 
-FORM (Table_createWithoutColumnNames, L"Create Table without column names", 0) {
-	WORD (L"Name", L"table")
-	INTEGER (L"Number of rows", L"10")
-	NATURAL (L"Number of columns", L"3")
+FORM (Table_createWithoutColumnNames, U"Create Table without column names", 0) {
+	WORD (U"Name", U"table")
+	INTEGER (U"Number of rows", U"10")
+	NATURAL (U"Number of columns", U"3")
 	OK2
 DO
-	autoTable me = Table_createWithoutColumnNames (GET_INTEGER (L"Number of rows"), GET_INTEGER (L"Number of columns"));
-	praat_new (me.transfer(), GET_STRING (L"Name"));
+	autoTable me = Table_createWithoutColumnNames (GET_INTEGER (U"Number of rows"), GET_INTEGER (U"Number of columns"));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
 END2 }
 
-FORM (Table_drawEllipse, L"Draw ellipse (standard deviation)", 0) {
-	WORD (L"Horizontal column", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0 (= auto)")
-	WORD (L"Vertical column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	POSITIVE (L"Number of sigmas", L"2.0")
-	BOOLEAN (L"Garnish", 1)
+FORM (Table_drawEllipse, U"Draw ellipse (standard deviation)", 0) {
+	WORD (U"Horizontal column", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0 (= auto)")
+	WORD (U"Vertical column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	POSITIVE (U"Number of sigmas", U"2.0")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
 		Table_drawEllipse_e (me, GRAPHICS, xcolumn, ycolumn,
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_REAL (L"Number of sigmas"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_REAL (U"Number of sigmas"), GET_INTEGER (U"Garnish"));
 	}
 END2 }
 
-FORM (Table_drawRowFromDistribution, L"Table: Draw row from distribution", 0) {
-	WORD (L"Column with distribution", L"")
+FORM (Table_drawRowFromDistribution, U"Table: Draw row from distribution", 0) {
+	WORD (U"Column with distribution", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column with distribution"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column with distribution"));
 		long row = Table_drawRowFromDistribution (me, icol);
-		Melder_information (Melder_integer (row));
+		Melder_information (row);
 	}
 END2 }
 
 DIRECT2 (Table_edit) {
-	if (theCurrentPraatApplication -> batch) Melder_throw ("Cannot edit a Table from batch.");
+	if (theCurrentPraatApplication -> batch) Melder_throw (U"Cannot edit a Table from batch.");
 	LOOP {
 		iam (Table);
 		autoTableEditor editor = TableEditor_create (ID_AND_FULL_NAME, me);
@@ -432,48 +430,48 @@ DIRECT2 (Table_edit) {
 	}
 END2 }
 
-FORM (Table_extractRowsWhereColumn_number, L"Table: Extract rows where column (number)", 0) {
-	WORD (L"Extract all rows where column...", L"")
-	RADIO_ENUM (L"...is...", kMelder_number, DEFAULT)
-	REAL (L"...the number", L"0.0")
+FORM (Table_extractRowsWhereColumn_number, U"Table: Extract rows where column (number)", 0) {
+	WORD (U"Extract all rows where column...", U"")
+	RADIO_ENUM (U"...is...", kMelder_number, DEFAULT)
+	REAL (U"...the number", U"0.0")
 	OK2
 DO
-	double value = GET_REAL (L"...the number");
+	double value = GET_REAL (U"...the number");
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Extract all rows where column..."));
-		autoTable thee = Table_extractRowsWhereColumn_number (me, icol, GET_ENUM (kMelder_number, L"...is..."), value);
-		praat_new (thee.transfer(), my name, L"_", Table_messageColumn (static_cast <Table> OBJECT, icol), L"_", NUMdefined (value) ? Melder_integer ((long) round (value)) : L"undefined");
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Extract all rows where column..."));
+		autoTable thee = Table_extractRowsWhereColumn_number (me, icol, GET_ENUM (kMelder_number, U"...is..."), value);
+		praat_new (thee.transfer(), my name, U"_", Table_messageColumn (static_cast <Table> OBJECT, icol), U"_", NUMdefined (value) ? Melder_integer (lround (value)) : U"undefined");
 		praat_dataChanged (me);   // WHY?
 	}
 END2 }
 
-FORM (Table_extractRowsWhereColumn_text, L"Table: Extract rows where column (text)", 0) {
-	WORD (L"Extract all rows where column...", L"")
-	OPTIONMENU_ENUM (L"...", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"hi")
+FORM (Table_extractRowsWhereColumn_text, U"Table: Extract rows where column (text)", 0) {
+	WORD (U"Extract all rows where column...", U"")
+	OPTIONMENU_ENUM (U"...", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"hi")
 	OK2
 DO
-	const wchar_t *value = GET_STRING (L"...the text");
+	const char32 *value = GET_STRING (U"...the text");
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Extract all rows where column..."));
-		autoTable thee = Table_extractRowsWhereColumn_string (me, icol, GET_ENUM (kMelder_string, L"..."), value);
-		praat_new (thee.transfer(), my name, L"_", value);
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Extract all rows where column..."));
+		autoTable thee = Table_extractRowsWhereColumn_string (me, icol, GET_ENUM (kMelder_string, U"..."), value);
+		praat_new (thee.transfer(), my name, U"_", value);
 		praat_dataChanged (me);   // WHY?
 	}
 END2 }
 
-FORM (Table_formula, L"Table: Formula", L"Table: Formula...") {
-	WORD (L"Column label", L"")
-	TEXTFIELD (L"formula", L"abs (self)")
+FORM (Table_formula, U"Table: Formula", U"Table: Formula...") {
+	WORD (U"Column label", U"")
+	TEXTFIELD (U"formula", U"abs (self)")
 	OK2
 DO
 	LOOP {
 		iam (Table);
 		try {
-			long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
-			Table_formula (me, icol, GET_STRING (L"formula"), interpreter);
+			long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
+			Table_formula (me, icol, GET_STRING (U"formula"), interpreter);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Table may have partially changed
@@ -482,18 +480,18 @@ DO
 	}
 END2 }
 
-FORM (Table_formula_columnRange, L"Table: Formula (column range)", L"Table: Formula...") {
-	WORD (L"From column label", L"")
-	WORD (L"To column label", L"")
-	TEXTFIELD (L"formula", L"log10 (self)")
+FORM (Table_formula_columnRange, U"Table: Formula (column range)", U"Table: Formula...") {
+	WORD (U"From column label", U"")
+	WORD (U"To column label", U"")
+	TEXTFIELD (U"formula", U"log10 (self)")
 	OK2
 DO
 	LOOP {
 		iam (Table);
 		try {
-			long icol1 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"From column label"));
-			long icol2 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"To column label"));
-			Table_formula_columnRange (me, icol1, icol2, GET_STRING (L"formula"), interpreter);
+			long icol1 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"From column label"));
+			long icol2 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"To column label"));
+			Table_formula_columnRange (me, icol1, icol2, GET_STRING (U"formula"), interpreter);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);   // in case of error, the Table may have partially changed
@@ -502,533 +500,535 @@ DO
 	}
 END2 }
 
-FORM (Table_getColumnIndex, L"Table: Get column index", 0) {
-	SENTENCE (L"Column label", L"")
+FORM (Table_getColumnIndex, U"Table: Get column index", 0) {
+	SENTENCE (U"Column label", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		Melder_information (Melder_integer (Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"))));
+		Melder_information (Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Column label")));
 	}
 END2 }
 
-FORM (Table_getColumnLabel, L"Table: Get column label", 0) {
-	NATURAL (L"Column number", L"1")
+FORM (Table_getColumnLabel, U"Table: Get column label", 0) {
+	NATURAL (U"Column number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = GET_INTEGER (L"Column number");
-		if (icol > my numberOfColumns) Melder_throw ("Column number must not be greater than number of columns.");
+		long icol = GET_INTEGER (U"Column number");
+		if (icol > my numberOfColumns) Melder_throw (U"Column number must not be greater than number of columns.");
 		Melder_information (my columnHeaders [icol]. label);
 	}
 END2 }
 
-FORM (Table_getGroupMean, L"Table: Get group mean", 0) {
-	WORD (L"Column label", L"salary")
-	WORD (L"Group column", L"gender")
-	SENTENCE (L"Group", L"F")
+FORM (Table_getGroupMean, U"Table: Get group mean", 0) {
+	WORD (U"Column label", U"salary")
+	WORD (U"Group column", U"gender")
+	SENTENCE (U"Group", U"F")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
-		long groupColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Group column"));
-		Melder_information (Melder_double (Table_getGroupMean (static_cast <Table> ONLY_OBJECT, column, groupColumn, GET_STRING (L"Group"))));
+		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
+		long groupColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Group column"));
+		Melder_information (Table_getGroupMean (static_cast <Table> ONLY_OBJECT, column, groupColumn, GET_STRING (U"Group")));
 	}
 END2 }
 
-FORM (Table_getMaximum, L"Table: Get maximum", 0) {
-	SENTENCE (L"Column label", L"")
+FORM (Table_getMaximum, U"Table: Get maximum", 0) {
+	SENTENCE (U"Column label", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
 		double maximum = Table_getMaximum (me, icol);
-		Melder_information (Melder_double (maximum));
+		Melder_information (maximum);
 	}
 END2 }
 
-FORM (Table_getMean, L"Table: Get mean", 0) {
-	SENTENCE (L"Column label", L"")
+FORM (Table_getMean, U"Table: Get mean", 0) {
+	SENTENCE (U"Column label", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
 		double mean = Table_getMean (me, icol);
-		Melder_information (Melder_double (mean));
+		Melder_information (mean);
 	}
 END2 }
 
-FORM (Table_getMinimum, L"Table: Get minimum", 0) {
-	SENTENCE (L"Column label", L"")
+FORM (Table_getMinimum, U"Table: Get minimum", 0) {
+	SENTENCE (U"Column label", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
 		double minimum = Table_getMinimum (me, icol);
-		Melder_information (Melder_double (minimum));
+		Melder_information (minimum);
 	}
 END2 }
 
-FORM (Table_getQuantile, L"Table: Get quantile", 0) {
-	SENTENCE (L"Column label", L"")
-	POSITIVE (L"Quantile", L"0.50 (= median)")
+FORM (Table_getQuantile, U"Table: Get quantile", 0) {
+	SENTENCE (U"Column label", U"")
+	POSITIVE (U"Quantile", U"0.50 (= median)")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
-		double quantile = Table_getQuantile (me, icol, GET_REAL (L"Quantile"));
-		Melder_information (Melder_double (quantile));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
+		double quantile = Table_getQuantile (me, icol, GET_REAL (U"Quantile"));
+		Melder_information (quantile);
 	}
 END2 }
 
-FORM (Table_getStandardDeviation, L"Table: Get standard deviation", 0) {
-	SENTENCE (L"Column label", L"")
+FORM (Table_getStandardDeviation, U"Table: Get standard deviation", 0) {
+	SENTENCE (U"Column label", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
 		double stdev = Table_getStdev (me, icol);
-		Melder_information (Melder_double (stdev));
+		Melder_information (stdev);
 	}
 END2 }
 
 DIRECT2 (Table_getNumberOfColumns) {
 	LOOP {
 		iam (Table);
-		Melder_information (Melder_integer (my numberOfColumns));
+		Melder_information (my numberOfColumns);
 	}
 END2 }
 
 DIRECT2 (Table_getNumberOfRows) {
 	LOOP {
 		iam (Table);
-		Melder_information (Melder_integer (my rows -> size));
+		Melder_information (my rows -> size);
 	}
 END2 }
 
-FORM (Table_getValue, L"Table: Get value", 0) {
-	NATURAL (L"Row number", L"1")
-	WORD (L"Column label", L"")
+FORM (Table_getValue, U"Table: Get value", 0) {
+	NATURAL (U"Row number", U"1")
+	WORD (U"Column label", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long rowNumber = GET_INTEGER (L"Row number");
+		long rowNumber = GET_INTEGER (U"Row number");
 		Table_checkSpecifiedRowNumberWithinRange (me, rowNumber);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
 		Melder_information (((TableRow) my rows -> item [rowNumber]) -> cells [icol]. string);
 	}
 END2 }
 
-DIRECT2 (Table_help) { Melder_help (L"Table"); END2 }
+DIRECT2 (Table_help) {
+	Melder_help (U"Table");
+END2 }
 
-FORM (Table_insertColumn, L"Table: Insert column", 0) {
-	NATURAL (L"Position", L"1")
-	WORD (L"Label", L"newcolumn")
+FORM (Table_insertColumn, U"Table: Insert column", 0) {
+	NATURAL (U"Position", U"1")
+	WORD (U"Label", U"newcolumn")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		Table_insertColumn (me, GET_INTEGER (L"Position"), GET_STRING (L"Label"));
+		Table_insertColumn (me, GET_INTEGER (U"Position"), GET_STRING (U"Label"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Table_insertRow, L"Table: Insert row", 0) {
-	NATURAL (L"Position", L"1")
+FORM (Table_insertRow, U"Table: Insert row", 0) {
+	NATURAL (U"Position", U"1")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		Table_insertRow (me, GET_INTEGER (L"Position"));
+		Table_insertRow (me, GET_INTEGER (U"Position"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Table_list, L"Table: List", 0) {
-	BOOLEAN (L"Include row numbers", true)
+FORM (Table_list, U"Table: List", 0) {
+	BOOLEAN (U"Include row numbers", true)
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		Table_list (me, GET_INTEGER (L"Include row numbers"));
+		Table_list (me, GET_INTEGER (U"Include row numbers"));
 	}
 END2 }
 
-FORM_READ2 (Table_readFromTableFile, L"Read Table from table file", 0, true) {
-	praat_newWithFile (Table_readFromTableFile (file), MelderFile_name (file), file);
+FORM_READ2 (Table_readFromTableFile, U"Read Table from table file", 0, true) {
+	praat_newWithFile (Table_readFromTableFile (file), file, MelderFile_name (file));
 END2 }
 
-FORM_READ2 (Table_readFromCommaSeparatedFile, L"Read Table from comma-separated file", 0, true) {
-	praat_newWithFile (Table_readFromCharacterSeparatedTextFile (file, ','), MelderFile_name (file), file);
+FORM_READ2 (Table_readFromCommaSeparatedFile, U"Read Table from comma-separated file", 0, true) {
+	praat_newWithFile (Table_readFromCharacterSeparatedTextFile (file, ','), file, MelderFile_name (file));
 END2 }
 
-FORM_READ2 (Table_readFromTabSeparatedFile, L"Read Table from tab-separated file", 0, true) {
-	praat_newWithFile (Table_readFromCharacterSeparatedTextFile (file, '\t'), MelderFile_name (file), file);
+FORM_READ2 (Table_readFromTabSeparatedFile, U"Read Table from tab-separated file", 0, true) {
+	praat_newWithFile (Table_readFromCharacterSeparatedTextFile (file, '\t'), file, MelderFile_name (file));
 END2 }
 
-FORM (Table_removeColumn, L"Table: Remove column", 0) {
-	WORD (L"Column label", L"")
+FORM (Table_removeColumn, U"Table: Remove column", 0) {
+	WORD (U"Column label", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
 		Table_removeColumn (me, icol);
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Table_removeRow, L"Table: Remove row", 0) {
-	NATURAL (L"Row number", L"1")
+FORM (Table_removeRow, U"Table: Remove row", 0) {
+	NATURAL (U"Row number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		Table_removeRow (me, GET_INTEGER (L"Row number"));
+		Table_removeRow (me, GET_INTEGER (U"Row number"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Table_reportCorrelation_kendallTau, L"Report correlation (Kendall tau)", 0) {
-	WORD (L"left Columns", L"")
-	WORD (L"right Columns", L"")
-	POSITIVE (L"One-tailed unconfidence", L"0.025")
+FORM (Table_reportCorrelation_kendallTau, U"Report correlation (Kendall tau)", 0) {
+	WORD (U"left Columns", U"")
+	WORD (U"right Columns", U"")
+	POSITIVE (U"One-tailed unconfidence", U"0.025")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long column1 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"left Columns"));
-		long column2 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"right Columns"));
-		double unconfidence = GET_REAL (L"One-tailed unconfidence");
+		long column1 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"left Columns"));
+		long column2 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"right Columns"));
+		double unconfidence = GET_REAL (U"One-tailed unconfidence");
 		double correlation, significance, lowerLimit, upperLimit;
 		correlation = Table_getCorrelation_kendallTau (me, column1, column2, unconfidence,
 			& significance, & lowerLimit, & upperLimit);
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"Correlation between column ", Table_messageColumn (me, column1),
-			L" and column ", Table_messageColumn (me, column2), L":");
-		MelderInfo_writeLine (L"Correlation = ", Melder_double (correlation), L" (Kendall's tau-b)");
-		MelderInfo_writeLine (L"Significance from zero = ", Melder_double (significance), L" (one-tailed)");
-		MelderInfo_writeLine (L"Confidence interval (", Melder_double (100 * (1.0 - 2.0 * unconfidence)), L"%):");
-		MelderInfo_writeLine (L"   Lower limit = ", Melder_double (lowerLimit),
-			L" (lowest tau that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
-		MelderInfo_writeLine (L"   Upper limit = ", Melder_double (upperLimit),
-			L" (highest tau that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
+		MelderInfo_writeLine (U"Correlation between column ", Table_messageColumn (me, column1),
+			U" and column ", Table_messageColumn (me, column2), U":");
+		MelderInfo_writeLine (U"Correlation = ", correlation, U" (Kendall's tau-b)");
+		MelderInfo_writeLine (U"Significance from zero = ", significance, U" (one-tailed)");
+		MelderInfo_writeLine (U"Confidence interval (", 100 * (1.0 - 2.0 * unconfidence), U"%):");
+		MelderInfo_writeLine (U"   Lower limit = ", lowerLimit,
+			U" (lowest tau that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
+		MelderInfo_writeLine (U"   Upper limit = ", upperLimit,
+			U" (highest tau that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
 		MelderInfo_close ();
 	}
 END2 }
 
-FORM (Table_reportCorrelation_pearsonR, L"Report correlation (Pearson r)", 0) {
-	WORD (L"left Columns", L"")
-	WORD (L"right Columns", L"")
-	POSITIVE (L"One-tailed unconfidence", L"0.025")
+FORM (Table_reportCorrelation_pearsonR, U"Report correlation (Pearson r)", 0) {
+	WORD (U"left Columns", U"")
+	WORD (U"right Columns", U"")
+	POSITIVE (U"One-tailed unconfidence", U"0.025")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long column1 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"left Columns"));
-		long column2 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"right Columns"));
-		double unconfidence = GET_REAL (L"One-tailed unconfidence");
+		long column1 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"left Columns"));
+		long column2 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"right Columns"));
+		double unconfidence = GET_REAL (U"One-tailed unconfidence");
 		double correlation, significance, lowerLimit, upperLimit;
 		correlation = Table_getCorrelation_pearsonR (me, column1, column2, unconfidence,
 			& significance, & lowerLimit, & upperLimit);
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"Correlation between column ", Table_messageColumn (me, column1),
-			L" and column ", Table_messageColumn (me, column2), L":");
-		MelderInfo_writeLine (L"Correlation = ", Melder_double (correlation), L" (Pearson's r)");
-		MelderInfo_writeLine (L"Number of degrees of freedom = ", Melder_integer (my rows -> size - 2));
-		MelderInfo_writeLine (L"Significance from zero = ", Melder_double (significance), L" (one-tailed)");
-		MelderInfo_writeLine (L"Confidence interval (", Melder_double (100 * (1.0 - 2.0 * unconfidence)), L"%):");
-		MelderInfo_writeLine (L"   Lower limit = ", Melder_double (lowerLimit),
-			L" (lowest r that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
-		MelderInfo_writeLine (L"   Upper limit = ", Melder_double (upperLimit),
-			L" (highest r that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
+		MelderInfo_writeLine (U"Correlation between column ", Table_messageColumn (me, column1),
+			U" and column ", Table_messageColumn (me, column2), U":");
+		MelderInfo_writeLine (U"Correlation = ", correlation, U" (Pearson's r)");
+		MelderInfo_writeLine (U"Number of degrees of freedom = ", my rows -> size - 2);
+		MelderInfo_writeLine (U"Significance from zero = ", significance, U" (one-tailed)");
+		MelderInfo_writeLine (U"Confidence interval (", 100 * (1.0 - 2.0 * unconfidence), U"%):");
+		MelderInfo_writeLine (U"   Lower limit = ", lowerLimit,
+			U" (lowest r that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
+		MelderInfo_writeLine (U"   Upper limit = ", upperLimit,
+			U" (highest r that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
 		MelderInfo_close ();
 	}
 END2 }
 	
-FORM (Table_reportDifference_studentT, L"Report difference (Student t)", 0) {
-	WORD (L"left Columns", L"")
-	WORD (L"right Columns", L"")
-	POSITIVE (L"One-tailed unconfidence", L"0.025")
+FORM (Table_reportDifference_studentT, U"Report difference (Student t)", 0) {
+	WORD (U"left Columns", U"")
+	WORD (U"right Columns", U"")
+	POSITIVE (U"One-tailed unconfidence", U"0.025")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long column1 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"left Columns"));
-		long column2 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"right Columns"));
-		double unconfidence = GET_REAL (L"One-tailed unconfidence");
+		long column1 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"left Columns"));
+		long column2 = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"right Columns"));
+		double unconfidence = GET_REAL (U"One-tailed unconfidence");
 		double difference, t, numberOfDegreesOfFreedom, significance, lowerLimit, upperLimit;
 		difference = Table_getDifference_studentT (me, column1, column2, unconfidence,
 			& t, & numberOfDegreesOfFreedom, & significance, & lowerLimit, & upperLimit);
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"Difference between column ", Table_messageColumn (me, column1),
-			L" and column ", Table_messageColumn (me, column2), L":");
-		MelderInfo_writeLine (L"Difference = ", Melder_double (difference));
-		MelderInfo_writeLine (L"Student's t = ", Melder_double (t));
-		MelderInfo_writeLine (L"Number of degrees of freedom = ", Melder_double (numberOfDegreesOfFreedom));
-		MelderInfo_writeLine (L"Significance from zero = ", Melder_double (significance), L" (one-tailed)");
-		MelderInfo_writeLine (L"Confidence interval (", Melder_double (100 * (1.0 - 2.0 * unconfidence)), L"%):");
-		MelderInfo_writeLine (L"   Lower limit = ", Melder_double (lowerLimit),
-			L" (lowest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
-		MelderInfo_writeLine (L"   Upper limit = ", Melder_double (upperLimit),
-			L" (highest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
+		MelderInfo_writeLine (U"Difference between column ", Table_messageColumn (me, column1),
+			U" and column ", Table_messageColumn (me, column2), U":");
+		MelderInfo_writeLine (U"Difference = ", difference);
+		MelderInfo_writeLine (U"Student's t = ", t);
+		MelderInfo_writeLine (U"Number of degrees of freedom = ", numberOfDegreesOfFreedom);
+		MelderInfo_writeLine (U"Significance from zero = ", significance, U" (one-tailed)");
+		MelderInfo_writeLine (U"Confidence interval (", 100 * (1.0 - 2.0 * unconfidence), U"%):");
+		MelderInfo_writeLine (U"   Lower limit = ", lowerLimit,
+			U" (lowest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
+		MelderInfo_writeLine (U"   Upper limit = ", upperLimit,
+			U" (highest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
 		MelderInfo_close ();
 	}
 END2 }
 	
-FORM (Table_reportGroupDifference_studentT, L"Report group difference (Student t)", 0) {
-	WORD (L"Column", L"salary")
-	WORD (L"Group column", L"gender")
-	SENTENCE (L"Group 1", L"F")
-	SENTENCE (L"Group 2", L"M")
-	POSITIVE (L"One-tailed unconfidence", L"0.025")
+FORM (Table_reportGroupDifference_studentT, U"Report group difference (Student t)", 0) {
+	WORD (U"Column", U"salary")
+	WORD (U"Group column", U"gender")
+	SENTENCE (U"Group 1", U"F")
+	SENTENCE (U"Group 2", U"M")
+	POSITIVE (U"One-tailed unconfidence", U"0.025")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column"));
-		long groupColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Group column"));
-		double unconfidence = GET_REAL (L"One-tailed unconfidence");
-		wchar_t *group1 = GET_STRING (L"Group 1"), *group2 = GET_STRING (L"Group 2");
+		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column"));
+		long groupColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Group column"));
+		double unconfidence = GET_REAL (U"One-tailed unconfidence");
+		const char32 *group1 = GET_STRING (U"Group 1"), *group2 = GET_STRING (U"Group 2");
 		double mean, tFromZero, numberOfDegreesOfFreedom, significanceFromZero, lowerLimit, upperLimit;
 		mean = Table_getGroupDifference_studentT (me, column, groupColumn, group1, group2, unconfidence,
 			& tFromZero, & numberOfDegreesOfFreedom, & significanceFromZero, & lowerLimit, & upperLimit);
 		MelderInfo_open ();
-		MelderInfo_write (L"Difference in column ", Table_messageColumn (me, column), L" between groups ", group1);
-		MelderInfo_writeLine (L" and ", group2, L" of column ", Table_messageColumn (me, groupColumn), L":");
-		MelderInfo_writeLine (L"Difference = ", Melder_double (mean));
-		MelderInfo_writeLine (L"Student's t = ", Melder_double (tFromZero));
-		MelderInfo_writeLine (L"Number of degrees of freedom = ", Melder_double (numberOfDegreesOfFreedom));
-		MelderInfo_writeLine (L"Significance from zero = ", Melder_double (significanceFromZero), L" (one-tailed)");
-		MelderInfo_writeLine (L"Confidence interval (", Melder_double (100 * (1.0 - 2.0 * unconfidence)), L"%):");
-		MelderInfo_writeLine (L"   Lower limit = ", Melder_double (lowerLimit),
-			L" (lowest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
-		MelderInfo_writeLine (L"   Upper limit = ", Melder_double (upperLimit),
-			L" (highest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
+		MelderInfo_write (U"Difference in column ", Table_messageColumn (me, column), U" between groups ", group1);
+		MelderInfo_writeLine (U" and ", group2, U" of column ", Table_messageColumn (me, groupColumn), U":");
+		MelderInfo_writeLine (U"Difference = ", mean);
+		MelderInfo_writeLine (U"Student's t = ", tFromZero);
+		MelderInfo_writeLine (U"Number of degrees of freedom = ", numberOfDegreesOfFreedom);
+		MelderInfo_writeLine (U"Significance from zero = ", significanceFromZero, U" (one-tailed)");
+		MelderInfo_writeLine (U"Confidence interval (", 100 * (1.0 - 2.0 * unconfidence), U"%):");
+		MelderInfo_writeLine (U"   Lower limit = ", lowerLimit,
+			U" (lowest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
+		MelderInfo_writeLine (U"   Upper limit = ", upperLimit,
+			U" (highest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
 		MelderInfo_close ();
 	}
 END2 }
 
-FORM (Table_reportGroupDifference_wilcoxonRankSum, L"Report group difference (Wilcoxon rank sum)", 0) {
-	WORD (L"Column", L"salary")
-	WORD (L"Group column", L"gender")
-	SENTENCE (L"Group 1", L"F")
-	SENTENCE (L"Group 2", L"M")
+FORM (Table_reportGroupDifference_wilcoxonRankSum, U"Report group difference (Wilcoxon rank sum)", 0) {
+	WORD (U"Column", U"salary")
+	WORD (U"Group column", U"gender")
+	SENTENCE (U"Group 1", U"F")
+	SENTENCE (U"Group 2", U"M")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column"));
-		long groupColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Group column"));
-		wchar_t *group1 = GET_STRING (L"Group 1"), *group2 = GET_STRING (L"Group 2");
+		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column"));
+		long groupColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Group column"));
+		const char32 *group1 = GET_STRING (U"Group 1"), *group2 = GET_STRING (U"Group 2");
 		double areaUnderCurve, rankSum, significanceFromZero;
 		areaUnderCurve = Table_getGroupDifference_wilcoxonRankSum (me, column, groupColumn, group1, group2,
 			& rankSum, & significanceFromZero);
 		MelderInfo_open ();
-		MelderInfo_write (L"Difference in column ", Table_messageColumn (me, column), L" between groups ", group1);
-		MelderInfo_writeLine (L" and ", group2, L" of column ", Table_messageColumn (me, groupColumn), L":");
-		MelderInfo_writeLine (L"Larger: ", areaUnderCurve < 0.5 ? group1 : areaUnderCurve > 0.5 ? group2 : L"(both equal)");
-		MelderInfo_writeLine (L"Area under curve: ", Melder_double (areaUnderCurve));
-		MelderInfo_writeLine (L"Rank sum: ", Melder_double (rankSum));
-		MelderInfo_writeLine (L"Significance from zero: ", Melder_double (significanceFromZero), L" (one-tailed)");
+		MelderInfo_write (U"Difference in column ", Table_messageColumn (me, column), U" between groups ", group1);
+		MelderInfo_writeLine (U" and ", group2, U" of column ", Table_messageColumn (me, groupColumn), U":");
+		MelderInfo_writeLine (U"Larger: ", areaUnderCurve < 0.5 ? group1 : areaUnderCurve > 0.5 ? group2 : U"(both equal)");
+		MelderInfo_writeLine (U"Area under curve: ", areaUnderCurve);
+		MelderInfo_writeLine (U"Rank sum: ", rankSum);
+		MelderInfo_writeLine (U"Significance from zero: ", significanceFromZero, U" (one-tailed)");
 		MelderInfo_close ();
 	}
 END2 }
 
-FORM (Table_reportGroupMean_studentT, L"Report group mean (Student t)", 0) {
-	WORD (L"Column", L"salary")
-	WORD (L"Group column", L"gender")
-	SENTENCE (L"Group", L"F")
-	POSITIVE (L"One-tailed unconfidence", L"0.025")
+FORM (Table_reportGroupMean_studentT, U"Report group mean (Student t)", 0) {
+	WORD (U"Column", U"salary")
+	WORD (U"Group column", U"gender")
+	SENTENCE (U"Group", U"F")
+	POSITIVE (U"One-tailed unconfidence", U"0.025")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column"));
-		long groupColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Group column"));
-		double unconfidence = GET_REAL (L"One-tailed unconfidence");
-		wchar_t *group = GET_STRING (L"Group");
+		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column"));
+		long groupColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Group column"));
+		double unconfidence = GET_REAL (U"One-tailed unconfidence");
+		const char32 *group = GET_STRING (U"Group");
 		double mean, tFromZero, numberOfDegreesOfFreedom, significanceFromZero, lowerLimit, upperLimit;
 		mean = Table_getGroupMean_studentT (me, column, groupColumn, group, unconfidence,
 			& tFromZero, & numberOfDegreesOfFreedom, & significanceFromZero, & lowerLimit, & upperLimit);
 		MelderInfo_open ();
-		MelderInfo_write (L"Mean in column ", Table_messageColumn (me, column), L" of group ", group);
-		MelderInfo_writeLine (L" of column ", Table_messageColumn (me, groupColumn), L":");
-		MelderInfo_writeLine (L"Mean = ", Melder_double (mean));
-		MelderInfo_writeLine (L"Student's t from zero = ", Melder_double (tFromZero));
-		MelderInfo_writeLine (L"Number of degrees of freedom = ", Melder_double (numberOfDegreesOfFreedom));
-		MelderInfo_writeLine (L"Significance from zero = ", Melder_double (significanceFromZero), L" (one-tailed)");
-		MelderInfo_writeLine (L"Confidence interval (", Melder_double (100 * (1.0 - 2.0 * unconfidence)), L"%):");
-		MelderInfo_writeLine (L"   Lower limit = ", Melder_double (lowerLimit),
-			L" (lowest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
-		MelderInfo_writeLine (L"   Upper limit = ", Melder_double (upperLimit),
-			L" (highest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
+		MelderInfo_write (U"Mean in column ", Table_messageColumn (me, column), U" of group ", group);
+		MelderInfo_writeLine (U" of column ", Table_messageColumn (me, groupColumn), U":");
+		MelderInfo_writeLine (U"Mean = ", mean);
+		MelderInfo_writeLine (U"Student's t from zero = ", tFromZero);
+		MelderInfo_writeLine (U"Number of degrees of freedom = ", numberOfDegreesOfFreedom);
+		MelderInfo_writeLine (U"Significance from zero = ", significanceFromZero, U" (one-tailed)");
+		MelderInfo_writeLine (U"Confidence interval (", 100 * (1.0 - 2.0 * unconfidence), U"%):");
+		MelderInfo_writeLine (U"   Lower limit = ", lowerLimit,
+			U" (lowest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
+		MelderInfo_writeLine (U"   Upper limit = ", upperLimit,
+			U" (highest difference that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
 		MelderInfo_close ();
 	}
 END2 }
 
-FORM (Table_reportMean_studentT, L"Report mean (Student t)", 0) {
-	WORD (L"Column", L"")
-	POSITIVE (L"One-tailed unconfidence", L"0.025")
+FORM (Table_reportMean_studentT, U"Report mean (Student t)", 0) {
+	WORD (U"Column", U"")
+	POSITIVE (U"One-tailed unconfidence", U"0.025")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column"));
-		double unconfidence = GET_REAL (L"One-tailed unconfidence");
+		long column = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column"));
+		double unconfidence = GET_REAL (U"One-tailed unconfidence");
 		double mean, tFromZero, numberOfDegreesOfFreedom, significanceFromZero, lowerLimit, upperLimit;
 		mean = Table_getMean_studentT (me, column, unconfidence,
 			& tFromZero, & numberOfDegreesOfFreedom, & significanceFromZero, & lowerLimit, & upperLimit);
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"Mean of column ", Table_messageColumn (me, column), L":");
-		MelderInfo_writeLine (L"Mean = ", Melder_double (mean));
-		MelderInfo_writeLine (L"Student's t from zero = ", Melder_double (tFromZero));
-		MelderInfo_writeLine (L"Number of degrees of freedom = ", Melder_double (numberOfDegreesOfFreedom));
-		MelderInfo_writeLine (L"Significance from zero = ", Melder_double (significanceFromZero), L" (one-tailed)");
-		MelderInfo_writeLine (L"Confidence interval (", Melder_double (100 * (1.0 - 2.0 * unconfidence)), L"%):");
-		MelderInfo_writeLine (L"   Lower limit = ", Melder_double (lowerLimit),
-			L" (lowest value that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
-		MelderInfo_writeLine (L"   Upper limit = ", Melder_double (upperLimit),
-			L" (highest value that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", Melder_double (unconfidence), L")");
+		MelderInfo_writeLine (U"Mean of column ", Table_messageColumn (me, column), U":");
+		MelderInfo_writeLine (U"Mean = ", mean);
+		MelderInfo_writeLine (U"Student's t from zero = ", tFromZero);
+		MelderInfo_writeLine (U"Number of degrees of freedom = ", numberOfDegreesOfFreedom);
+		MelderInfo_writeLine (U"Significance from zero = ", significanceFromZero, U" (one-tailed)");
+		MelderInfo_writeLine (U"Confidence interval (", 100 * (1.0 - 2.0 * unconfidence), U"%):");
+		MelderInfo_writeLine (U"   Lower limit = ", lowerLimit,
+			U" (lowest value that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
+		MelderInfo_writeLine (U"   Upper limit = ", upperLimit,
+			U" (highest value that cannot be rejected with " UNITEXT_GREEK_SMALL_LETTER_ALPHA " = ", unconfidence, U")");
 		MelderInfo_close ();
 	}
 END2 }
 
-FORM (Table_rowsToColumns, L"Table: Rows to columns", 0) {
-	LABEL (L"", L"Columns with factors (independent variables):")
-	TEXTFIELD (L"factors", L"dialect gender speaker")
-	WORD (L"Column to transpose", L"vowel")
-	LABEL (L"", L"Columns to expand:")
-	TEXTFIELD (L"columnsToExpand", L"duration F0 F1 F2 F3")
-	LABEL (L"", L"Columns not mentioned above will be ignored.")
+FORM (Table_rowsToColumns, U"Table: Rows to columns", 0) {
+	LABEL (U"", U"Columns with factors (independent variables):")
+	TEXTFIELD (U"factors", U"dialect gender speaker")
+	WORD (U"Column to transpose", U"vowel")
+	LABEL (U"", U"Columns to expand:")
+	TEXTFIELD (U"columnsToExpand", U"duration F0 F1 F2 F3")
+	LABEL (U"", U"Columns not mentioned above will be ignored.")
 	OK2
 DO
-	const wchar_t *columnLabel = GET_STRING (L"Column to transpose");
+	const char32 *columnLabel = GET_STRING (U"Column to transpose");
 	LOOP {
 		iam (Table);
 		long icol = Table_getColumnIndexFromColumnLabel (me, columnLabel);
-		autoTable thee = Table_rowsToColumns (me, GET_STRING (L"factors"), icol, GET_STRING (L"columnsToExpand"));
-		praat_new (thee.transfer(), NAME, L"_nested");
+		autoTable thee = Table_rowsToColumns (me, GET_STRING (U"factors"), icol, GET_STRING (U"columnsToExpand"));
+		praat_new (thee.transfer(), NAME, U"_nested");
 	}
 END2 }
 
-FORM (Table_scatterPlot, L"Scatter plot", 0) {
-	WORD (L"Horizontal column", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0 (= auto)")
-	WORD (L"Vertical column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	WORD (L"Column with marks", L"")
-	NATURAL (L"Font size", L"12")
-	BOOLEAN (L"Garnish", 1)
+FORM (Table_scatterPlot, U"Scatter plot", 0) {
+	WORD (U"Horizontal column", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0 (= auto)")
+	WORD (U"Vertical column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	WORD (U"Column with marks", U"")
+	NATURAL (U"Font size", U"12")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
-		long markColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column with marks"));
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
+		long markColumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column with marks"));
 		Table_scatterPlot (me, GRAPHICS, xcolumn, ycolumn,
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			markColumn, GET_INTEGER (L"Font size"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			markColumn, GET_INTEGER (U"Font size"), GET_INTEGER (U"Garnish"));
 	}
 END2 }
 
-FORM (Table_scatterPlot_mark, L"Scatter plot (marks)", 0) {
-	WORD (L"Horizontal column", L"")
-	REAL (L"left Horizontal range", L"0.0")
-	REAL (L"right Horizontal range", L"0.0 (= auto)")
-	WORD (L"Vertical column", L"")
-	REAL (L"left Vertical range", L"0.0")
-	REAL (L"right Vertical range", L"0.0 (= auto)")
-	POSITIVE (L"Mark size (mm)", L"1.0")
-	BOOLEAN (L"Garnish", 1)
-	SENTENCE (L"Mark string (+xo.)", L"+")
+FORM (Table_scatterPlot_mark, U"Scatter plot (marks)", 0) {
+	WORD (U"Horizontal column", U"")
+	REAL (U"left Horizontal range", U"0.0")
+	REAL (U"right Horizontal range", U"0.0 (= auto)")
+	WORD (U"Vertical column", U"")
+	REAL (U"left Vertical range", U"0.0")
+	REAL (U"right Vertical range", U"0.0 (= auto)")
+	POSITIVE (U"Mark size (mm)", U"1.0")
+	BOOLEAN (U"Garnish", 1)
+	SENTENCE (U"Mark string (+xo.)", U"+")
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (Table);
-		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Horizontal column"));
-		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Vertical column"));
+		long xcolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Horizontal column"));
+		long ycolumn = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Vertical column"));
 		Table_scatterPlot_mark (me, GRAPHICS, xcolumn, ycolumn,
-			GET_REAL (L"left Horizontal range"), GET_REAL (L"right Horizontal range"),
-			GET_REAL (L"left Vertical range"), GET_REAL (L"right Vertical range"),
-			GET_REAL (L"Mark size"), GET_STRING (L"Mark string"), GET_INTEGER (L"Garnish"));
+			GET_REAL (U"left Horizontal range"), GET_REAL (U"right Horizontal range"),
+			GET_REAL (U"left Vertical range"), GET_REAL (U"right Vertical range"),
+			GET_REAL (U"Mark size"), GET_STRING (U"Mark string"), GET_INTEGER (U"Garnish"));
 	}
 END2 }
 
-FORM (Table_searchColumn, L"Table: Search column", 0) {
-	WORD (L"Column label", L"")
-	WORD (L"Value", L"")
+FORM (Table_searchColumn, U"Table: Search column", 0) {
+	WORD (U"Column label", U"")
+	WORD (U"Value", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
-		Melder_information (Melder_integer (Table_searchColumn (me, icol, GET_STRING (L"Value"))));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
+		Melder_information (Table_searchColumn (me, icol, GET_STRING (U"Value")));
 	}
 END2 }
 	
-FORM (Table_setColumnLabel_index, L"Set column label", 0) {
-	NATURAL (L"Column number", L"1")
-	SENTENCE (L"Label", L"")
+FORM (Table_setColumnLabel_index, U"Set column label", 0) {
+	NATURAL (U"Column number", U"1")
+	SENTENCE (U"Label", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		Table_setColumnLabel (me, GET_INTEGER (L"Column number"), GET_STRING (L"Label"));
+		Table_setColumnLabel (me, GET_INTEGER (U"Column number"), GET_STRING (U"Label"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Table_setColumnLabel_label, L"Set column label", 0) {
-	SENTENCE (L"Old label", L"")
-	SENTENCE (L"New label", L"")
+FORM (Table_setColumnLabel_label, U"Set column label", 0) {
+	SENTENCE (U"Old label", U"")
+	SENTENCE (U"New label", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		Table_setColumnLabel (me, Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Old label")), GET_STRING (L"New label"));
+		Table_setColumnLabel (me, Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Old label")), GET_STRING (U"New label"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Table_setNumericValue, L"Table: Set numeric value", 0) {
-	NATURAL (L"Row number", L"1")
-	WORD (L"Column label", L"")
-	REAL_OR_UNDEFINED (L"Numeric value", L"1.5")
+FORM (Table_setNumericValue, U"Table: Set numeric value", 0) {
+	NATURAL (U"Row number", U"1")
+	WORD (U"Column label", U"")
+	REAL_OR_UNDEFINED (U"Numeric value", U"1.5")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
-		Table_setNumericValue (me, GET_INTEGER (L"Row number"), icol, GET_REAL (L"Numeric value"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
+		Table_setNumericValue (me, GET_INTEGER (U"Row number"), icol, GET_REAL (U"Numeric value"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (Table_setStringValue, L"Table: Set string value", 0) {
-	NATURAL (L"Row number", L"1")
-	WORD (L"Column label", L"")
-	SENTENCE (L"String value", L"xx")
+FORM (Table_setStringValue, U"Table: Set string value", 0) {
+	NATURAL (U"Row number", U"1")
+	WORD (U"Column label", U"")
+	SENTENCE (U"String value", U"xx")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (L"Column label"));
-		Table_setStringValue (me, GET_INTEGER (L"Row number"), icol, GET_STRING (L"String value"));
+		long icol = Table_getColumnIndexFromColumnLabel (me, GET_STRING (U"Column label"));
+		Table_setStringValue (me, GET_INTEGER (U"Row number"), icol, GET_STRING (U"String value"));
 		praat_dataChanged (me);
 	}
 END2 }
@@ -1049,14 +1049,14 @@ DIRECT2 (Table_reflectRows) {
 	}
 END2 }
 
-FORM (Table_sortRows, L"Table: Sort rows", 0) {
-	LABEL (L"", L"One or more column labels for sorting:")
-	TEXTFIELD (L"columnLabels", L"dialect gender name")
+FORM (Table_sortRows, U"Table: Sort rows", 0) {
+	LABEL (U"", U"One or more column labels for sorting:")
+	TEXTFIELD (U"columnLabels", U"dialect gender name")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		Table_sortRows_string (me, GET_STRING (L"columnLabels"));
+		Table_sortRows_string (me, GET_STRING (U"columnLabels"));
 		praat_dataChanged (me);
 	}
 END2 }
@@ -1069,27 +1069,27 @@ DIRECT2 (Table_to_LinearRegression) {
 	}
 END2 }
 
-FORM (Table_to_LogisticRegression, L"Table: To LogisticRegression", 0) {
-	LABEL (L"", L"Factors (column names):")
-	TEXTFIELD (L"factors", L"F0 F1 duration")
-	WORD (L"Dependent 1 (column name)", L"e")
-	WORD (L"Dependent 2 (column name)", L"i")
+FORM (Table_to_LogisticRegression, U"Table: To LogisticRegression", 0) {
+	LABEL (U"", U"Factors (column names):")
+	TEXTFIELD (U"factors", U"F0 F1 duration")
+	WORD (U"Dependent 1 (column name)", U"e")
+	WORD (U"Dependent 2 (column name)", U"i")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		autoLogisticRegression thee = Table_to_LogisticRegression (me, GET_STRING (L"factors"), GET_STRING (L"Dependent 1"), GET_STRING (L"Dependent 2"));
+		autoLogisticRegression thee = Table_to_LogisticRegression (me, GET_STRING (U"factors"), GET_STRING (U"Dependent 1"), GET_STRING (U"Dependent 2"));
 		praat_new (thee.transfer(), NAME);
 	}
 END2 }
 
-FORM (Table_to_TableOfReal, L"Table: Down to TableOfReal", 0) {
-	WORD (L"Column for row labels", L"")
+FORM (Table_to_TableOfReal, U"Table: Down to TableOfReal", 0) {
+	WORD (U"Column for row labels", U"")
 	OK2
 DO
 	LOOP {
 		iam (Table);
-		long icol = Table_findColumnIndexFromColumnLabel (me, GET_STRING (L"Column for row labels"));
+		long icol = Table_findColumnIndexFromColumnLabel (me, GET_STRING (U"Column for row labels"));
 		autoTableOfReal thee = Table_to_TableOfReal (me, icol);
 		praat_new (thee.transfer(), NAME);
 	}
@@ -1099,18 +1099,18 @@ DIRECT2 (Table_transpose) {
 	LOOP {
 		iam (Table);
 		autoTable thee = Table_transpose (me);
-		praat_new (thee.transfer(), NAME, L"_transposed");
+		praat_new (thee.transfer(), NAME, U"_transposed");
 	}
 END2 }
 
-FORM_WRITE2 (Table_writeToCommaSeparatedFile, L"Save Table as comma-separated file", 0, L"Table") {
+FORM_WRITE2 (Table_writeToCommaSeparatedFile, U"Save Table as comma-separated file", 0, U"Table") {
 	LOOP {
 		iam (Table);
 		Table_writeToCommaSeparatedFile (me, file);
 	}
 END2 }
 
-FORM_WRITE2 (Table_writeToTabSeparatedFile, L"Save Table as tab-separated file", 0, L"Table") {
+FORM_WRITE2 (Table_writeToTabSeparatedFile, U"Save Table as tab-separated file", 0, U"Table") {
 	LOOP {
 		iam (Table);
 		Table_writeToTabSeparatedFile (me, file);
@@ -1129,124 +1129,124 @@ DIRECT2 (TablesOfReal_append) {
 		Collection_addItem (tables.peek(), me);
 	}
 	autoTableOfReal thee = static_cast <TableOfReal> (TablesOfReal_appendMany (tables.peek()));
-	praat_new (thee.transfer(), L"appended");
+	praat_new (thee.transfer(), U"appended");
 END2 }
 
-FORM (TableOfReal_create, L"Create TableOfReal", 0) {
-	WORD (L"Name", L"table")
-	NATURAL (L"Number of rows", L"10")
-	NATURAL (L"Number of columns", L"3")
+FORM (TableOfReal_create, U"Create TableOfReal", 0) {
+	WORD (U"Name", U"table")
+	NATURAL (U"Number of rows", U"10")
+	NATURAL (U"Number of columns", U"3")
 	OK2
 DO
-	autoTableOfReal me = TableOfReal_create (GET_INTEGER (L"Number of rows"), GET_INTEGER (L"Number of columns"));
-	praat_new (me.transfer(), GET_STRING (L"Name"));
+	autoTableOfReal me = TableOfReal_create (GET_INTEGER (U"Number of rows"), GET_INTEGER (U"Number of columns"));
+	praat_new (me.transfer(), GET_STRING (U"Name"));
 END2 }
 
-FORM (TableOfReal_drawAsNumbers, L"Draw as numbers", 0) {
-	NATURAL (L"From row", L"1")
-	INTEGER (L"To row", L"0 (= all)")
-	RADIO (L"Format", 3)
-		RADIOBUTTON (L"decimal")
-		RADIOBUTTON (L"exponential")
-		RADIOBUTTON (L"free")
-		RADIOBUTTON (L"rational")
-	NATURAL (L"Precision", L"5")
+FORM (TableOfReal_drawAsNumbers, U"Draw as numbers", 0) {
+	NATURAL (U"From row", U"1")
+	INTEGER (U"To row", U"0 (= all)")
+	RADIO (U"Format", 3)
+		RADIOBUTTON (U"decimal")
+		RADIOBUTTON (U"exponential")
+		RADIOBUTTON (U"free")
+		RADIOBUTTON (U"rational")
+	NATURAL (U"Precision", U"5")
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
 		TableOfReal_drawAsNumbers (me, GRAPHICS,
-			GET_INTEGER (L"From row"), GET_INTEGER (L"To row"),
-			GET_INTEGER (L"Format"), GET_INTEGER (L"Precision"));
+			GET_INTEGER (U"From row"), GET_INTEGER (U"To row"),
+			GET_INTEGER (U"Format"), GET_INTEGER (U"Precision"));
 	}
 END2 }
 
-FORM (TableOfReal_drawAsNumbers_if, L"Draw as numbers if...", 0) {
-	NATURAL (L"From row", L"1")
-	INTEGER (L"To row", L"0 (= all)")
-	RADIO (L"Format", 3)
-		RADIOBUTTON (L"decimal")
-		RADIOBUTTON (L"exponential")
-		RADIOBUTTON (L"free")
-		RADIOBUTTON (L"rational")
-	NATURAL (L"Precision", L"5")
-	LABEL (L"", L"Condition:")
-	TEXTFIELD (L"condition", L"self <> 0")
+FORM (TableOfReal_drawAsNumbers_if, U"Draw as numbers if...", 0) {
+	NATURAL (U"From row", U"1")
+	INTEGER (U"To row", U"0 (= all)")
+	RADIO (U"Format", 3)
+		RADIOBUTTON (U"decimal")
+		RADIOBUTTON (U"exponential")
+		RADIOBUTTON (U"free")
+		RADIOBUTTON (U"rational")
+	NATURAL (U"Precision", U"5")
+	LABEL (U"", U"Condition:")
+	TEXTFIELD (U"condition", U"self <> 0")
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
 		TableOfReal_drawAsNumbers_if (me, GRAPHICS,
-			GET_INTEGER (L"From row"), GET_INTEGER (L"To row"),
-			GET_INTEGER (L"Format"), GET_INTEGER (L"Precision"), GET_STRING (L"condition"), interpreter);
+			GET_INTEGER (U"From row"), GET_INTEGER (U"To row"),
+			GET_INTEGER (U"Format"), GET_INTEGER (U"Precision"), GET_STRING (U"condition"), interpreter);
 	}
 END2 }
 
-FORM (TableOfReal_drawAsSquares, L"Draw table as squares", 0) {
-	INTEGER (L"From row", L"1")
-	INTEGER (L"To row", L"0")
-	INTEGER (L"From column", L"1")
-	INTEGER (L"To column", L"0")
-	BOOLEAN (L"Garnish", 1)
+FORM (TableOfReal_drawAsSquares, U"Draw table as squares", 0) {
+	INTEGER (U"From row", U"1")
+	INTEGER (U"To row", U"0")
+	INTEGER (U"From column", U"1")
+	INTEGER (U"To column", U"0")
+	BOOLEAN (U"Garnish", 1)
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
 		TableOfReal_drawAsSquares (me, GRAPHICS, 
-			GET_INTEGER (L"From row"), GET_INTEGER (L"To row"),
-			GET_INTEGER (L"From column"), GET_INTEGER (L"To column"),
-			GET_INTEGER (L"Garnish"));
+			GET_INTEGER (U"From row"), GET_INTEGER (U"To row"),
+			GET_INTEGER (U"From column"), GET_INTEGER (U"To column"),
+			GET_INTEGER (U"Garnish"));
 	}
 END2 }
 
-FORM (TableOfReal_drawHorizontalLines, L"Draw horizontal lines", 0) {
-	NATURAL (L"From row", L"1")
-	INTEGER (L"To row", L"0 (= all)")
+FORM (TableOfReal_drawHorizontalLines, U"Draw horizontal lines", 0) {
+	NATURAL (U"From row", U"1")
+	INTEGER (U"To row", U"0 (= all)")
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_drawHorizontalLines (me, GRAPHICS, GET_INTEGER (L"From row"), GET_INTEGER (L"To row"));
+		TableOfReal_drawHorizontalLines (me, GRAPHICS, GET_INTEGER (U"From row"), GET_INTEGER (U"To row"));
 	}
 END2 }
 
-FORM (TableOfReal_drawLeftAndRightLines, L"Draw left and right lines", 0) {
-	NATURAL (L"From row", L"1")
-	INTEGER (L"To row", L"0 (= all)")
+FORM (TableOfReal_drawLeftAndRightLines, U"Draw left and right lines", 0) {
+	NATURAL (U"From row", U"1")
+	INTEGER (U"To row", U"0 (= all)")
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_drawLeftAndRightLines (me, GRAPHICS, GET_INTEGER (L"From row"), GET_INTEGER (L"To row"));
+		TableOfReal_drawLeftAndRightLines (me, GRAPHICS, GET_INTEGER (U"From row"), GET_INTEGER (U"To row"));
 	}
 END2 }
 
-FORM (TableOfReal_drawTopAndBottomLines, L"Draw top and bottom lines", 0) {
-	NATURAL (L"From row", L"1")
-	INTEGER (L"To row", L"0 (= all)")
+FORM (TableOfReal_drawTopAndBottomLines, U"Draw top and bottom lines", 0) {
+	NATURAL (U"From row", U"1")
+	INTEGER (U"To row", U"0 (= all)")
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_drawTopAndBottomLines (me, GRAPHICS, GET_INTEGER (L"From row"), GET_INTEGER (L"To row"));
+		TableOfReal_drawTopAndBottomLines (me, GRAPHICS, GET_INTEGER (U"From row"), GET_INTEGER (U"To row"));
 	}
 END2 }
 
-FORM (TableOfReal_drawVerticalLines, L"Draw vertical lines", 0) {
-	NATURAL (L"From row", L"1")
-	INTEGER (L"To row", L"0 (= all)")
+FORM (TableOfReal_drawVerticalLines, U"Draw vertical lines", 0) {
+	NATURAL (U"From row", U"1")
+	INTEGER (U"To row", U"0 (= all)")
 	OK2
 DO
 	autoPraatPicture picture;
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_drawVerticalLines (me, GRAPHICS, GET_INTEGER (L"From row"), GET_INTEGER (L"To row"));
+		TableOfReal_drawVerticalLines (me, GRAPHICS, GET_INTEGER (U"From row"), GET_INTEGER (U"To row"));
 	}
 END2 }
 
@@ -1258,56 +1258,56 @@ DIRECT2 (TableOfReal_extractColumnLabelsAsStrings) {
 	}
 END2 }
 
-FORM (TableOfReal_extractColumnRanges, L"Extract column ranges", 0) {
-	LABEL (L"", L"Create a new TableOfReal from the following columns:")
-	TEXTFIELD (L"ranges", L"1 2")
-	LABEL (L"", L"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
+FORM (TableOfReal_extractColumnRanges, U"Extract column ranges", 0) {
+	LABEL (U"", U"Create a new TableOfReal from the following columns:")
+	TEXTFIELD (U"ranges", U"1 2")
+	LABEL (U"", U"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		autoTableOfReal thee = TableOfReal_extractColumnRanges (me, GET_STRING (L"ranges"));
-		praat_new (thee.transfer(), my name, L"_cols");
+		autoTableOfReal thee = TableOfReal_extractColumnRanges (me, GET_STRING (U"ranges"));
+		praat_new (thee.transfer(), my name, U"_cols");
 	}
 END2 }
 
-FORM (TableOfReal_extractColumnsWhere, L"Extract columns where", 0) {
-	LABEL (L"", L"Extract all columns with at least one cell where:")
-	TEXTFIELD (L"condition", L"col mod 3 = 0 ; this example extracts every third column")
+FORM (TableOfReal_extractColumnsWhere, U"Extract columns where", 0) {
+	LABEL (U"", U"Extract all columns with at least one cell where:")
+	TEXTFIELD (U"condition", U"col mod 3 = 0 ; this example extracts every third column")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		autoTableOfReal thee = TableOfReal_extractColumnsWhere (me, GET_STRING (L"condition"), interpreter);
-		praat_new (thee.transfer(), my name, L"_cols");
+		autoTableOfReal thee = TableOfReal_extractColumnsWhere (me, GET_STRING (U"condition"), interpreter);
+		praat_new (thee.transfer(), my name, U"_cols");
 	}
 END2 }
 
-FORM (TableOfReal_extractColumnsWhereLabel, L"Extract column where label", 0) {
-	OPTIONMENU_ENUM (L"Extract all columns whose label...", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"a")
+FORM (TableOfReal_extractColumnsWhereLabel, U"Extract column where label", 0) {
+	OPTIONMENU_ENUM (U"Extract all columns whose label...", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"a")
 	OK2
 DO
-	const wchar_t *text = GET_STRING (L"...the text");
+	const char32 *text = GET_STRING (U"...the text");
 	LOOP {
 		iam (TableOfReal);
-		autoTableOfReal thee = TableOfReal_extractColumnsWhereLabel (me, GET_ENUM (kMelder_string, L"Extract all columns whose label..."), text);
-		praat_new (thee.transfer(), my name, L"_", text);
+		autoTableOfReal thee = TableOfReal_extractColumnsWhereLabel (me, GET_ENUM (kMelder_string, U"Extract all columns whose label..."), text);
+		praat_new (thee.transfer(), my name, U"_", text);
 	}
 END2 }
 
-FORM (TableOfReal_extractColumnsWhereRow, L"Extract columns where row", 0) {
-	NATURAL (L"Extract all columns where row...", L"1")
-	OPTIONMENU_ENUM (L"...is...", kMelder_number, DEFAULT)
-	REAL (L"...the value", L"0.0")
+FORM (TableOfReal_extractColumnsWhereRow, U"Extract columns where row", 0) {
+	NATURAL (U"Extract all columns where row...", U"1")
+	OPTIONMENU_ENUM (U"...is...", kMelder_number, DEFAULT)
+	REAL (U"...the value", U"0.0")
 	OK2
 DO
-	long row = GET_INTEGER (L"Extract all columns where row...");
-	double value = GET_REAL (L"...the value");
+	long row = GET_INTEGER (U"Extract all columns where row...");
+	double value = GET_REAL (U"...the value");
 	LOOP {
 		iam (TableOfReal);
-		autoTableOfReal thee = TableOfReal_extractColumnsWhereRow (me, row, GET_ENUM (kMelder_number, L"...is..."), value);
-		praat_new (thee.transfer(), my name, L"_", Melder_integer (row), L"_", Melder_integer (round (value)));
+		autoTableOfReal thee = TableOfReal_extractColumnsWhereRow (me, row, GET_ENUM (kMelder_number, U"...is..."), value);
+		praat_new (thee.transfer(), my name, U"_", row, U"_", lround (value));
 	}
 END2 }
 
@@ -1319,69 +1319,69 @@ DIRECT2 (TableOfReal_extractRowLabelsAsStrings) {
 	}
 END2 }
 
-FORM (TableOfReal_extractRowRanges, L"Extract row ranges", 0) {
-	LABEL (L"", L"Create a new TableOfReal from the following rows:")
-	TEXTFIELD (L"ranges", L"1 2")
-	LABEL (L"", L"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
+FORM (TableOfReal_extractRowRanges, U"Extract row ranges", 0) {
+	LABEL (U"", U"Create a new TableOfReal from the following rows:")
+	TEXTFIELD (U"ranges", U"1 2")
+	LABEL (U"", U"To supply rising or falling ranges, use e.g. 2:6 or 5:3.")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		autoTableOfReal thee = TableOfReal_extractRowRanges (me, GET_STRING (L"ranges"));
-		praat_new (thee.transfer(), my name, L"_rows");
+		autoTableOfReal thee = TableOfReal_extractRowRanges (me, GET_STRING (U"ranges"));
+		praat_new (thee.transfer(), my name, U"_rows");
 	}
 END2 }
 
-FORM (TableOfReal_extractRowsWhere, L"Extract rows where", 0) {
-	LABEL (L"", L"Extract all rows with at least one cell where:")
-	TEXTFIELD (L"condition", L"row mod 3 = 0 ; this example extracts every third row")
+FORM (TableOfReal_extractRowsWhere, U"Extract rows where", 0) {
+	LABEL (U"", U"Extract all rows with at least one cell where:")
+	TEXTFIELD (U"condition", U"row mod 3 = 0 ; this example extracts every third row")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		autoTableOfReal thee = TableOfReal_extractRowsWhere (me, GET_STRING (L"condition"), interpreter);
-		praat_new (thee.transfer(), my name, L"_rows");
+		autoTableOfReal thee = TableOfReal_extractRowsWhere (me, GET_STRING (U"condition"), interpreter);
+		praat_new (thee.transfer(), my name, U"_rows");
 	}
 END2 }
 
-FORM (TableOfReal_extractRowsWhereColumn, L"Extract rows where column", 0) {
-	NATURAL (L"Extract all rows where column...", L"1")
-	OPTIONMENU_ENUM (L"...is...", kMelder_number, DEFAULT)
-	REAL (L"...the value", L"0.0")
+FORM (TableOfReal_extractRowsWhereColumn, U"Extract rows where column", 0) {
+	NATURAL (U"Extract all rows where column...", U"1")
+	OPTIONMENU_ENUM (U"...is...", kMelder_number, DEFAULT)
+	REAL (U"...the value", U"0.0")
 	OK2
 DO
-	long column = GET_INTEGER (L"Extract all rows where column...");
-	double value = GET_REAL (L"...the value");
+	long column = GET_INTEGER (U"Extract all rows where column...");
+	double value = GET_REAL (U"...the value");
 	LOOP {
 		iam (TableOfReal);
 		autoTableOfReal thee = TableOfReal_extractRowsWhereColumn (me,
-			column, GET_ENUM (kMelder_number, L"...is..."), value);
-		praat_new (thee.transfer(), my name, L"_", Melder_integer (column), L"_", Melder_integer (round (value)));
+			column, GET_ENUM (kMelder_number, U"...is..."), value);
+		praat_new (thee.transfer(), my name, U"_", column, U"_", lround (value));
 	}
 END2 }
 
-FORM (TableOfReal_extractRowsWhereLabel, L"Extract rows where label", 0) {
-	OPTIONMENU_ENUM (L"Extract all rows whose label...", kMelder_string, DEFAULT)
-	SENTENCE (L"...the text", L"a")
+FORM (TableOfReal_extractRowsWhereLabel, U"Extract rows where label", 0) {
+	OPTIONMENU_ENUM (U"Extract all rows whose label...", kMelder_string, DEFAULT)
+	SENTENCE (U"...the text", U"a")
 	OK2
 DO
-	const wchar_t *text = GET_STRING (L"...the text");
+	const char32 *text = GET_STRING (U"...the text");
 	LOOP {
 		iam (TableOfReal);
-		autoTableOfReal thee = TableOfReal_extractRowsWhereLabel (me, GET_ENUM (kMelder_string, L"Extract all rows whose label..."), text);
-		praat_new (thee.transfer(), my name, L"_", text);
+		autoTableOfReal thee = TableOfReal_extractRowsWhereLabel (me, GET_ENUM (kMelder_string, U"Extract all rows whose label..."), text);
+		praat_new (thee.transfer(), my name, U"_", text);
 	}
 END2 }
 
-FORM (TableOfReal_formula, L"TableOfReal: Formula", L"Formula...") {
-	LABEL (L"", L"for row from 1 to nrow do for col from 1 to ncol do self [row, col] = ...")
-	TEXTFIELD (L"formula", L"if col = 5 then self + self [6] else self fi")
+FORM (TableOfReal_formula, U"TableOfReal: Formula", U"Formula...") {
+	LABEL (U"", U"for row from 1 to nrow do for col from 1 to ncol do self [row, col] = ...")
+	TEXTFIELD (U"formula", U"if col = 5 then self + self [6] else self fi")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
 		try {
-			TableOfReal_formula (me, GET_STRING (L"formula"), interpreter, NULL);
+			TableOfReal_formula (me, GET_STRING (U"formula"), interpreter, NULL);
 			praat_dataChanged (me);
 		} catch (MelderError) {
 			praat_dataChanged (me);
@@ -1390,76 +1390,76 @@ DO
 	}
 END2 }
 
-FORM (TableOfReal_getColumnIndex, L"Get column index", 0) {
-	SENTENCE (L"Column label", L"")
+FORM (TableOfReal_getColumnIndex, U"Get column index", 0) {
+	SENTENCE (U"Column label", U"")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long columnNumber = TableOfReal_columnLabelToIndex (me, GET_STRING (L"Column label"));
-		Melder_information (Melder_integer (columnNumber));
+		long columnNumber = TableOfReal_columnLabelToIndex (me, GET_STRING (U"Column label"));
+		Melder_information (columnNumber);
 	}
 END2 }
 	
-FORM (TableOfReal_getColumnLabel, L"Get column label", 0) {
-	NATURAL (L"Column number", L"1")
+FORM (TableOfReal_getColumnLabel, U"Get column label", 0) {
+	NATURAL (U"Column number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long columnNumber = GET_INTEGER (L"Column number");
-		if (columnNumber > my numberOfColumns) Melder_throw (me, ": column number must not be greater than number of columns.");
-		Melder_information (my columnLabels == NULL ? L"" : my columnLabels [columnNumber]);
+		long columnNumber = GET_INTEGER (U"Column number");
+		if (columnNumber > my numberOfColumns) Melder_throw (me, U": column number must not be greater than number of columns.");
+		Melder_information (my columnLabels == NULL ? U"" : my columnLabels [columnNumber]);
 	}
 END2 }
 	
-FORM (TableOfReal_getColumnMean_index, L"Get column mean", 0) {
-	NATURAL (L"Column number", L"1")
+FORM (TableOfReal_getColumnMean_index, U"Get column mean", 0) {
+	NATURAL (U"Column number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long columnNumber = GET_INTEGER (L"Column number");
-		if (columnNumber > my numberOfColumns) Melder_throw (me, ": column number must not be greater than number of columns.");
+		long columnNumber = GET_INTEGER (U"Column number");
+		if (columnNumber > my numberOfColumns) Melder_throw (me, U": column number must not be greater than number of columns.");
 		double columnMean = TableOfReal_getColumnMean (me, columnNumber);
 		Melder_informationReal (columnMean, NULL);
 	}
 END2 }
 	
-FORM (TableOfReal_getColumnMean_label, L"Get column mean", 0) {
-	SENTENCE (L"Column label", L"")
+FORM (TableOfReal_getColumnMean_label, U"Get column mean", 0) {
+	SENTENCE (U"Column label", U"")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long columnNumber = TableOfReal_columnLabelToIndex (me, GET_STRING (L"Column label"));
-		if (columnNumber == 0) Melder_throw (me, ": column label does not exist.");
+		long columnNumber = TableOfReal_columnLabelToIndex (me, GET_STRING (U"Column label"));
+		if (columnNumber == 0) Melder_throw (me, U": column label does not exist.");
 		double columnMean = TableOfReal_getColumnMean (me, columnNumber);
 		Melder_informationReal (columnMean, NULL);
 	}
 END2 }
 	
-FORM (TableOfReal_getColumnStdev_index, L"Get column standard deviation", 0) {
-	NATURAL (L"Column number", L"1")
+FORM (TableOfReal_getColumnStdev_index, U"Get column standard deviation", 0) {
+	NATURAL (U"Column number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long columnNumber = GET_INTEGER (L"Column number");
-		if (columnNumber > my numberOfColumns) Melder_throw (me, ": column number must not be greater than number of columns.");
+		long columnNumber = GET_INTEGER (U"Column number");
+		if (columnNumber > my numberOfColumns) Melder_throw (me, U": column number must not be greater than number of columns.");
 		double stdev = TableOfReal_getColumnStdev (me, columnNumber);
 		Melder_informationReal (stdev, NULL);
 	}
 END2 }
 	
-FORM (TableOfReal_getColumnStdev_label, L"Get column standard deviation", 0) {
-	SENTENCE (L"Column label", L"1")
+FORM (TableOfReal_getColumnStdev_label, U"Get column standard deviation", 0) {
+	SENTENCE (U"Column label", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long columnNumber = TableOfReal_columnLabelToIndex (me, GET_STRING (L"Column label"));
-		if (columnNumber == 0) Melder_throw (me, ": column label does not exist.");
+		long columnNumber = TableOfReal_columnLabelToIndex (me, GET_STRING (U"Column label"));
+		if (columnNumber == 0) Melder_throw (me, U": column label does not exist.");
 		double stdev = TableOfReal_getColumnStdev (me, columnNumber);
 		Melder_informationReal (stdev, NULL);
 	}
@@ -1468,191 +1468,193 @@ END2 }
 DIRECT2 (TableOfReal_getNumberOfColumns) {
 	LOOP {
 		iam (TableOfReal);
-		Melder_information (Melder_integer (my numberOfColumns));
+		Melder_information (my numberOfColumns);
 	}
 END2 }
 
 DIRECT2 (TableOfReal_getNumberOfRows) {
 	LOOP {
 		iam (TableOfReal);
-		Melder_information (Melder_integer (my numberOfRows));
+		Melder_information (my numberOfRows);
 	}
 END2 }
 
-FORM (TableOfReal_getRowIndex, L"Get row index", 0) {
-	SENTENCE (L"Row label", L"")
+FORM (TableOfReal_getRowIndex, U"Get row index", 0) {
+	SENTENCE (U"Row label", U"")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long rowNumber = TableOfReal_rowLabelToIndex (me, GET_STRING (L"Row label"));
-		Melder_information (Melder_integer (rowNumber));
+		long rowNumber = TableOfReal_rowLabelToIndex (me, GET_STRING (U"Row label"));
+		Melder_information (rowNumber);
 	}
 END2 }
 	
-FORM (TableOfReal_getRowLabel, L"Get row label", 0) {
-	NATURAL (L"Row number", L"1")
+FORM (TableOfReal_getRowLabel, U"Get row label", 0) {
+	NATURAL (U"Row number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long rowNumber = GET_INTEGER (L"Row number");
-		if (rowNumber > my numberOfRows) Melder_throw (me, ": row number must not be greater than number of rows.");
-		Melder_information (my rowLabels == NULL ? L"" : my rowLabels [rowNumber]);
+		long rowNumber = GET_INTEGER (U"Row number");
+		if (rowNumber > my numberOfRows) Melder_throw (me, U": row number must not be greater than number of rows.");
+		Melder_information (my rowLabels == NULL ? U"" : my rowLabels [rowNumber]);
 	}
 END2 }
 
-FORM (TableOfReal_getValue, L"Get value", 0) {
-	NATURAL (L"Row number", L"1")
-	NATURAL (L"Column number", L"1")
+FORM (TableOfReal_getValue, U"Get value", 0) {
+	NATURAL (U"Row number", U"1")
+	NATURAL (U"Column number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long rowNumber = GET_INTEGER (L"Row number"), columnNumber = GET_INTEGER (L"Column number");
-		if (rowNumber > my numberOfRows) Melder_throw (me, ": row number must not exceed number of rows.");
-		if (columnNumber > my numberOfColumns) Melder_throw (me, ": column number must not exceed number of columns.");
+		long rowNumber = GET_INTEGER (U"Row number"), columnNumber = GET_INTEGER (U"Column number");
+		if (rowNumber > my numberOfRows) Melder_throw (me, U": row number must not exceed number of rows.");
+		if (columnNumber > my numberOfColumns) Melder_throw (me, U": column number must not exceed number of columns.");
 		Melder_informationReal (my data [rowNumber] [columnNumber], NULL);
 	}
 END2 }
 
-DIRECT2 (TableOfReal_help) { Melder_help (L"TableOfReal"); END2 }
+DIRECT2 (TableOfReal_help) {
+	Melder_help (U"TableOfReal");
+END2 }
 
-FORM (TableOfReal_insertColumn, L"Insert column", 0) {
-	NATURAL (L"Column number", L"1")
+FORM (TableOfReal_insertColumn, U"Insert column", 0) {
+	NATURAL (U"Column number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_insertColumn (me, GET_INTEGER (L"Column number"));
+		TableOfReal_insertColumn (me, GET_INTEGER (U"Column number"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TableOfReal_insertRow, L"Insert row", 0) {
-	NATURAL (L"Row number", L"1")
+FORM (TableOfReal_insertRow, U"Insert row", 0) {
+	NATURAL (U"Row number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_insertRow (me, GET_INTEGER (L"Row number"));
+		TableOfReal_insertRow (me, GET_INTEGER (U"Row number"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM_READ2 (TableOfReal_readFromHeaderlessSpreadsheetFile, L"Read TableOfReal from headerless spreadsheet file", 0, true) {
-	praat_newWithFile (TableOfReal_readFromHeaderlessSpreadsheetFile (file), MelderFile_name (file), file);
+FORM_READ2 (TableOfReal_readFromHeaderlessSpreadsheetFile, U"Read TableOfReal from headerless spreadsheet file", 0, true) {
+	praat_newWithFile (TableOfReal_readFromHeaderlessSpreadsheetFile (file), file, MelderFile_name (file));
 END2 }
 
-FORM (TableOfReal_removeColumn, L"Remove column", 0) {
-	NATURAL (L"Column number", L"1")
+FORM (TableOfReal_removeColumn, U"Remove column", 0) {
+	NATURAL (U"Column number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_removeColumn (me, GET_INTEGER (L"Column number"));
+		TableOfReal_removeColumn (me, GET_INTEGER (U"Column number"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TableOfReal_removeRow, L"Remove row", 0) {
-	NATURAL (L"Row number", L"1")
+FORM (TableOfReal_removeRow, U"Remove row", 0) {
+	NATURAL (U"Row number", U"1")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_removeRow (me, GET_INTEGER (L"Row number"));
+		TableOfReal_removeRow (me, GET_INTEGER (U"Row number"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TableOfReal_setColumnLabel_index, L"Set column label", 0) {
-	NATURAL (L"Column number", L"1")
-	SENTENCE (L"Label", L"")
+FORM (TableOfReal_setColumnLabel_index, U"Set column label", 0) {
+	NATURAL (U"Column number", U"1")
+	SENTENCE (U"Label", U"")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_setColumnLabel (me, GET_INTEGER (L"Column number"), GET_STRING (L"Label"));
+		TableOfReal_setColumnLabel (me, GET_INTEGER (U"Column number"), GET_STRING (U"Label"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TableOfReal_setColumnLabel_label, L"Set column label", 0) {
-	SENTENCE (L"Old label", L"")
-	SENTENCE (L"New label", L"")
+FORM (TableOfReal_setColumnLabel_label, U"Set column label", 0) {
+	SENTENCE (U"Old label", U"")
+	SENTENCE (U"New label", U"")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long columnNumber = TableOfReal_columnLabelToIndex (me, GET_STRING (L"Old label"));
-		TableOfReal_setColumnLabel (me, columnNumber, GET_STRING (L"New label"));
+		long columnNumber = TableOfReal_columnLabelToIndex (me, GET_STRING (U"Old label"));
+		TableOfReal_setColumnLabel (me, columnNumber, GET_STRING (U"New label"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TableOfReal_setRowLabel_index, L"Set row label", 0) {
-	NATURAL (L"Row number", L"1")
-	SENTENCE (L"Label", L"")
+FORM (TableOfReal_setRowLabel_index, U"Set row label", 0) {
+	NATURAL (U"Row number", U"1")
+	SENTENCE (U"Label", U"")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_setRowLabel (me, GET_INTEGER (L"Row number"), GET_STRING (L"Label"));
+		TableOfReal_setRowLabel (me, GET_INTEGER (U"Row number"), GET_STRING (U"Label"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TableOfReal_setValue, L"Set value", L"TableOfReal: Set value...") {
-	NATURAL (L"Row number", L"1")
-	NATURAL (L"Column number", L"1")
-	REAL_OR_UNDEFINED (L"New value", L"0.0")
+FORM (TableOfReal_setValue, U"Set value", U"TableOfReal: Set value...") {
+	NATURAL (U"Row number", U"1")
+	NATURAL (U"Column number", U"1")
+	REAL_OR_UNDEFINED (U"New value", U"0.0")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long rowNumber = GET_INTEGER (L"Row number"), columnNumber = GET_INTEGER (L"Column number");
-		if (rowNumber > my numberOfRows) Melder_throw (me, ": row number too large.");
-		if (columnNumber > my numberOfColumns) Melder_throw (me, ": column number too large.");
-		my data [rowNumber] [columnNumber] = GET_REAL (L"New value");
+		long rowNumber = GET_INTEGER (U"Row number"), columnNumber = GET_INTEGER (U"Column number");
+		if (rowNumber > my numberOfRows) Melder_throw (me, U": row number too large.");
+		if (columnNumber > my numberOfColumns) Melder_throw (me, U": column number too large.");
+		my data [rowNumber] [columnNumber] = GET_REAL (U"New value");
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TableOfReal_setRowLabel_label, L"Set row label", 0) {
-	SENTENCE (L"Old label", L"")
-	SENTENCE (L"New label", L"")
+FORM (TableOfReal_setRowLabel_label, U"Set row label", 0) {
+	SENTENCE (U"Old label", U"")
+	SENTENCE (U"New label", U"")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		long rowNumber = TableOfReal_rowLabelToIndex (me, GET_STRING (L"Old label"));
-		TableOfReal_setRowLabel (me, rowNumber, GET_STRING (L"New label"));
+		long rowNumber = TableOfReal_rowLabelToIndex (me, GET_STRING (U"Old label"));
+		TableOfReal_setRowLabel (me, rowNumber, GET_STRING (U"New label"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TableOfReal_sortByColumn, L"Sort rows by column", 0) {
-	INTEGER (L"Column", L"1")
-	INTEGER (L"Secondary column", L"0")
+FORM (TableOfReal_sortByColumn, U"Sort rows by column", 0) {
+	INTEGER (U"Column", U"1")
+	INTEGER (U"Secondary column", U"0")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_sortByColumn (me, GET_INTEGER (L"Column"), GET_INTEGER (L"Secondary column"));
+		TableOfReal_sortByColumn (me, GET_INTEGER (U"Column"), GET_INTEGER (U"Secondary column"));
 		praat_dataChanged (me);
 	}
 END2 }
 
-FORM (TableOfReal_sortByLabel, L"Sort rows by label", 0) {
-	LABEL (L"", L"Secondary sorting keys:")
-	INTEGER (L"Column1", L"1")
-	INTEGER (L"Column2", L"0")
+FORM (TableOfReal_sortByLabel, U"Sort rows by label", 0) {
+	LABEL (U"", U"Secondary sorting keys:")
+	INTEGER (U"Column1", U"1")
+	INTEGER (U"Column2", U"0")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		TableOfReal_sortByLabel (me, GET_INTEGER (L"Column1"), GET_INTEGER (L"Column2"));
+		TableOfReal_sortByLabel (me, GET_INTEGER (U"Column1"), GET_INTEGER (U"Column2"));
 		praat_dataChanged (me);
 	}
 END2 }
@@ -1665,18 +1667,18 @@ DIRECT2 (TableOfReal_to_Matrix) {
 	}
 END2 }
 
-FORM (TableOfReal_to_Table, L"TableOfReal: To Table", 0) {
-	SENTENCE (L"Label of first column", L"rowLabel")
+FORM (TableOfReal_to_Table, U"TableOfReal: To Table", 0) {
+	SENTENCE (U"Label of first column", U"rowLabel")
 	OK2
 DO
 	LOOP {
 		iam (TableOfReal);
-		autoTable thee = TableOfReal_to_Table (me, GET_STRING (L"Label of first column"));
+		autoTable thee = TableOfReal_to_Table (me, GET_STRING (U"Label of first column"));
 		praat_new (thee.transfer(), my name);
 	}
 END2 }
 
-FORM_WRITE2 (TableOfReal_writeToHeaderlessSpreadsheetFile, L"Save TableOfReal as spreadsheet", 0, L"txt") {
+FORM_WRITE2 (TableOfReal_writeToHeaderlessSpreadsheetFile, U"Save TableOfReal as spreadsheet", 0, U"txt") {
 	LOOP {
 		iam (TableOfReal);
 		TableOfReal_writeToHeaderlessSpreadsheetFile (me, file);
@@ -1684,7 +1686,9 @@ FORM_WRITE2 (TableOfReal_writeToHeaderlessSpreadsheetFile, L"Save TableOfReal as
 END2 }
 
 
-DIRECT2 (StatisticsTutorial) { Melder_help (L"Statistics"); END2 }
+DIRECT2 (StatisticsTutorial) {
+	Melder_help (U"Statistics");
+END2 }
 
 static bool isTabSeparated_8bit (int nread, const char *header) {
 	for (long i = 0; i < nread; i ++) {
@@ -1726,65 +1730,65 @@ static Any tabSeparatedFileRecognizer (int nread, const char *header, MelderFile
 
 void praat_TableOfReal_init (ClassInfo klas);   /* Buttons for TableOfReal and for its subclasses. */
 void praat_TableOfReal_init (ClassInfo klas) {
-	praat_addAction1 (klas, 1, L"Save as headerless spreadsheet file...", 0, 0, DO_TableOfReal_writeToHeaderlessSpreadsheetFile);
-	praat_addAction1 (klas, 1, L"Write to headerless spreadsheet file...", 0, praat_HIDDEN, DO_TableOfReal_writeToHeaderlessSpreadsheetFile);
-	praat_addAction1 (klas, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (klas, 0, L"Draw as numbers...", 0, 1, DO_TableOfReal_drawAsNumbers);
-		praat_addAction1 (klas, 0, L"Draw as numbers if...", 0, 1, DO_TableOfReal_drawAsNumbers_if);
-		praat_addAction1 (klas, 0, L"Draw as squares...", 0, 1, DO_TableOfReal_drawAsSquares);	
-		praat_addAction1 (klas, 0, L"-- draw lines --", 0, 1, 0);
-		praat_addAction1 (klas, 0, L"Draw vertical lines...", 0, 1, DO_TableOfReal_drawVerticalLines);
-		praat_addAction1 (klas, 0, L"Draw horizontal lines...", 0, 1, DO_TableOfReal_drawHorizontalLines);
-		praat_addAction1 (klas, 0, L"Draw left and right lines...", 0, 1, DO_TableOfReal_drawLeftAndRightLines);
-		praat_addAction1 (klas, 0, L"Draw top and bottom lines...", 0, 1, DO_TableOfReal_drawTopAndBottomLines);
-	praat_addAction1 (klas, 0, L"Query -", 0, 0, 0);
-		praat_addAction1 (klas, 1, L"Get number of rows", 0, 1, DO_TableOfReal_getNumberOfRows);
-		praat_addAction1 (klas, 1, L"Get number of columns", 0, 1, DO_TableOfReal_getNumberOfColumns);
-		praat_addAction1 (klas, 1, L"Get row label...", 0, 1, DO_TableOfReal_getRowLabel);
-		praat_addAction1 (klas, 1, L"Get column label...", 0, 1, DO_TableOfReal_getColumnLabel);
-		praat_addAction1 (klas, 1, L"Get row index...", 0, 1, DO_TableOfReal_getRowIndex);
-		praat_addAction1 (klas, 1, L"Get column index...", 0, 1, DO_TableOfReal_getColumnIndex);
-		praat_addAction1 (klas, 1, L"-- get value --", 0, 1, 0);
-		praat_addAction1 (klas, 1, L"Get value...", 0, 1, DO_TableOfReal_getValue);
+	praat_addAction1 (klas, 1, U"Save as headerless spreadsheet file...", 0, 0, DO_TableOfReal_writeToHeaderlessSpreadsheetFile);
+	praat_addAction1 (klas, 1, U"Write to headerless spreadsheet file...", 0, praat_HIDDEN, DO_TableOfReal_writeToHeaderlessSpreadsheetFile);
+	praat_addAction1 (klas, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (klas, 0, U"Draw as numbers...", 0, 1, DO_TableOfReal_drawAsNumbers);
+		praat_addAction1 (klas, 0, U"Draw as numbers if...", 0, 1, DO_TableOfReal_drawAsNumbers_if);
+		praat_addAction1 (klas, 0, U"Draw as squares...", 0, 1, DO_TableOfReal_drawAsSquares);	
+		praat_addAction1 (klas, 0, U"-- draw lines --", 0, 1, 0);
+		praat_addAction1 (klas, 0, U"Draw vertical lines...", 0, 1, DO_TableOfReal_drawVerticalLines);
+		praat_addAction1 (klas, 0, U"Draw horizontal lines...", 0, 1, DO_TableOfReal_drawHorizontalLines);
+		praat_addAction1 (klas, 0, U"Draw left and right lines...", 0, 1, DO_TableOfReal_drawLeftAndRightLines);
+		praat_addAction1 (klas, 0, U"Draw top and bottom lines...", 0, 1, DO_TableOfReal_drawTopAndBottomLines);
+	praat_addAction1 (klas, 0, U"Query -", 0, 0, 0);
+		praat_addAction1 (klas, 1, U"Get number of rows", 0, 1, DO_TableOfReal_getNumberOfRows);
+		praat_addAction1 (klas, 1, U"Get number of columns", 0, 1, DO_TableOfReal_getNumberOfColumns);
+		praat_addAction1 (klas, 1, U"Get row label...", 0, 1, DO_TableOfReal_getRowLabel);
+		praat_addAction1 (klas, 1, U"Get column label...", 0, 1, DO_TableOfReal_getColumnLabel);
+		praat_addAction1 (klas, 1, U"Get row index...", 0, 1, DO_TableOfReal_getRowIndex);
+		praat_addAction1 (klas, 1, U"Get column index...", 0, 1, DO_TableOfReal_getColumnIndex);
+		praat_addAction1 (klas, 1, U"-- get value --", 0, 1, 0);
+		praat_addAction1 (klas, 1, U"Get value...", 0, 1, DO_TableOfReal_getValue);
 		if (klas == classTableOfReal) {
-			praat_addAction1 (klas, 1, L"-- get statistics --", 0, 1, 0);
-			praat_addAction1 (klas, 1, L"Get column mean (index)...", 0, 1, DO_TableOfReal_getColumnMean_index);
-			praat_addAction1 (klas, 1, L"Get column mean (label)...", 0, 1, DO_TableOfReal_getColumnMean_label);
-			praat_addAction1 (klas, 1, L"Get column stdev (index)...", 0, 1, DO_TableOfReal_getColumnStdev_index);
-			praat_addAction1 (klas, 1, L"Get column stdev (label)...", 0, 1, DO_TableOfReal_getColumnStdev_label);
+			praat_addAction1 (klas, 1, U"-- get statistics --", 0, 1, 0);
+			praat_addAction1 (klas, 1, U"Get column mean (index)...", 0, 1, DO_TableOfReal_getColumnMean_index);
+			praat_addAction1 (klas, 1, U"Get column mean (label)...", 0, 1, DO_TableOfReal_getColumnMean_label);
+			praat_addAction1 (klas, 1, U"Get column stdev (index)...", 0, 1, DO_TableOfReal_getColumnStdev_index);
+			praat_addAction1 (klas, 1, U"Get column stdev (label)...", 0, 1, DO_TableOfReal_getColumnStdev_label);
 		}
-	praat_addAction1 (klas, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (klas, 0, L"Formula...", 0, 1, DO_TableOfReal_formula);
-		praat_addAction1 (klas, 0, L"Set value...", 0, 1, DO_TableOfReal_setValue);
-		praat_addAction1 (klas, 0, L"Sort by label...", 0, 1, DO_TableOfReal_sortByLabel);
-		praat_addAction1 (klas, 0, L"Sort by column...", 0, 1, DO_TableOfReal_sortByColumn);
-		praat_addAction1 (klas, 0, L"-- structure --", 0, 1, 0);
-		praat_addAction1 (klas, 0, L"Remove row (index)...", 0, 1, DO_TableOfReal_removeRow);
-		praat_addAction1 (klas, 0, L"Remove column (index)...", 0, 1, DO_TableOfReal_removeColumn);
-		praat_addAction1 (klas, 0, L"Insert row (index)...", 0, 1, DO_TableOfReal_insertRow);
-		praat_addAction1 (klas, 0, L"Insert column (index)...", 0, 1, DO_TableOfReal_insertColumn);
-		praat_addAction1 (klas, 0, L"-- set --", 0, 1, 0);
-		praat_addAction1 (klas, 0, L"Set row label (index)...", 0, 1, DO_TableOfReal_setRowLabel_index);
-		praat_addAction1 (klas, 0, L"Set row label (label)...", 0, 1, DO_TableOfReal_setRowLabel_label);
-		praat_addAction1 (klas, 0, L"Set column label (index)...", 0, 1, DO_TableOfReal_setColumnLabel_index);
-		praat_addAction1 (klas, 0, L"Set column label (label)...", 0, 1, DO_TableOfReal_setColumnLabel_label);
-	praat_addAction1 (klas, 0, L"Synthesize -", 0, 0, 0);
-		praat_addAction1 (klas, 0, L"Append", 0, 1, DO_TablesOfReal_append);
-	praat_addAction1 (klas, 0, L"Extract part -", 0, 0, 0);
-		praat_addAction1 (klas, 0, L"Extract row ranges...", 0, 1, DO_TableOfReal_extractRowRanges);
-		praat_addAction1 (klas, 0, L"Extract rows where column...", 0, 1, DO_TableOfReal_extractRowsWhereColumn);
-		praat_addAction1 (klas, 0, L"Extract rows where label...", 0, 1, DO_TableOfReal_extractRowsWhereLabel);
-		praat_addAction1 (klas, 0, L"Extract rows where...", 0, 1, DO_TableOfReal_extractRowsWhere);
-		praat_addAction1 (klas, 0, L"Extract column ranges...", 0, 1, DO_TableOfReal_extractColumnRanges);
-		praat_addAction1 (klas, 0, L"Extract columns where row...", 0, 1, DO_TableOfReal_extractColumnsWhereRow);
-		praat_addAction1 (klas, 0, L"Extract columns where label...", 0, 1, DO_TableOfReal_extractColumnsWhereLabel);
-		praat_addAction1 (klas, 0, L"Extract columns where...", 0, 1, DO_TableOfReal_extractColumnsWhere);
-	praat_addAction1 (klas, 0, L"Extract -", 0, 0, 0);
-		praat_addAction1 (klas, 0, L"Extract row labels as Strings", 0, 1, DO_TableOfReal_extractRowLabelsAsStrings);
-		praat_addAction1 (klas, 0, L"Extract column labels as Strings", 0, 1, DO_TableOfReal_extractColumnLabelsAsStrings);
-	praat_addAction1 (klas, 0, L"Convert -", 0, 0, 0);
-		praat_addAction1 (klas, 0, L"To Table...", 0, 1, DO_TableOfReal_to_Table);
-		praat_addAction1 (klas, 0, L"To Matrix", 0, 1, DO_TableOfReal_to_Matrix);
+	praat_addAction1 (klas, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (klas, 0, U"Formula...", 0, 1, DO_TableOfReal_formula);
+		praat_addAction1 (klas, 0, U"Set value...", 0, 1, DO_TableOfReal_setValue);
+		praat_addAction1 (klas, 0, U"Sort by label...", 0, 1, DO_TableOfReal_sortByLabel);
+		praat_addAction1 (klas, 0, U"Sort by column...", 0, 1, DO_TableOfReal_sortByColumn);
+		praat_addAction1 (klas, 0, U"-- structure --", 0, 1, 0);
+		praat_addAction1 (klas, 0, U"Remove row (index)...", 0, 1, DO_TableOfReal_removeRow);
+		praat_addAction1 (klas, 0, U"Remove column (index)...", 0, 1, DO_TableOfReal_removeColumn);
+		praat_addAction1 (klas, 0, U"Insert row (index)...", 0, 1, DO_TableOfReal_insertRow);
+		praat_addAction1 (klas, 0, U"Insert column (index)...", 0, 1, DO_TableOfReal_insertColumn);
+		praat_addAction1 (klas, 0, U"-- set --", 0, 1, 0);
+		praat_addAction1 (klas, 0, U"Set row label (index)...", 0, 1, DO_TableOfReal_setRowLabel_index);
+		praat_addAction1 (klas, 0, U"Set row label (label)...", 0, 1, DO_TableOfReal_setRowLabel_label);
+		praat_addAction1 (klas, 0, U"Set column label (index)...", 0, 1, DO_TableOfReal_setColumnLabel_index);
+		praat_addAction1 (klas, 0, U"Set column label (label)...", 0, 1, DO_TableOfReal_setColumnLabel_label);
+	praat_addAction1 (klas, 0, U"Synthesize -", 0, 0, 0);
+		praat_addAction1 (klas, 0, U"Append", 0, 1, DO_TablesOfReal_append);
+	praat_addAction1 (klas, 0, U"Extract part -", 0, 0, 0);
+		praat_addAction1 (klas, 0, U"Extract row ranges...", 0, 1, DO_TableOfReal_extractRowRanges);
+		praat_addAction1 (klas, 0, U"Extract rows where column...", 0, 1, DO_TableOfReal_extractRowsWhereColumn);
+		praat_addAction1 (klas, 0, U"Extract rows where label...", 0, 1, DO_TableOfReal_extractRowsWhereLabel);
+		praat_addAction1 (klas, 0, U"Extract rows where...", 0, 1, DO_TableOfReal_extractRowsWhere);
+		praat_addAction1 (klas, 0, U"Extract column ranges...", 0, 1, DO_TableOfReal_extractColumnRanges);
+		praat_addAction1 (klas, 0, U"Extract columns where row...", 0, 1, DO_TableOfReal_extractColumnsWhereRow);
+		praat_addAction1 (klas, 0, U"Extract columns where label...", 0, 1, DO_TableOfReal_extractColumnsWhereLabel);
+		praat_addAction1 (klas, 0, U"Extract columns where...", 0, 1, DO_TableOfReal_extractColumnsWhere);
+	praat_addAction1 (klas, 0, U"Extract -", 0, 0, 0);
+		praat_addAction1 (klas, 0, U"Extract row labels as Strings", 0, 1, DO_TableOfReal_extractRowLabelsAsStrings);
+		praat_addAction1 (klas, 0, U"Extract column labels as Strings", 0, 1, DO_TableOfReal_extractColumnLabelsAsStrings);
+	praat_addAction1 (klas, 0, U"Convert -", 0, 0, 0);
+		praat_addAction1 (klas, 0, U"To Table...", 0, 1, DO_TableOfReal_to_Table);
+		praat_addAction1 (klas, 0, U"To Matrix", 0, 1, DO_TableOfReal_to_Matrix);
 }
 
 void praat_uvafon_stat_init ();
@@ -1795,128 +1799,128 @@ void praat_uvafon_stat_init () {
 
 	Data_recognizeFileType (tabSeparatedFileRecognizer);
 
-	praat_addMenuCommand (L"Objects", L"New", L"Tables", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Table with column names...", 0, 1, DO_Table_createWithColumnNames);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Table without column names...", 0, 1, DO_Table_createWithoutColumnNames);
-		praat_addMenuCommand (L"Objects", L"New", L"Create Table...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Table_createWithoutColumnNames);
-		praat_addMenuCommand (L"Objects", L"New", L"Create TableOfReal...", 0, 1, DO_TableOfReal_create);
+	praat_addMenuCommand (U"Objects", U"New", U"Tables", 0, 0, 0);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Table with column names...", 0, 1, DO_Table_createWithColumnNames);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Table without column names...", 0, 1, DO_Table_createWithoutColumnNames);
+		praat_addMenuCommand (U"Objects", U"New", U"Create Table...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Table_createWithoutColumnNames);
+		praat_addMenuCommand (U"Objects", U"New", U"Create TableOfReal...", 0, 1, DO_TableOfReal_create);
 
-	praat_addMenuCommand (L"Objects", L"Open", L"Read TableOfReal from headerless spreadsheet file...", 0, 0, DO_TableOfReal_readFromHeaderlessSpreadsheetFile);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read Table from tab-separated file...", 0, 0, DO_Table_readFromTabSeparatedFile);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read Table from comma-separated file...", 0, 0, DO_Table_readFromCommaSeparatedFile);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read Table from whitespace-separated file...", 0, 0, DO_Table_readFromTableFile);
-	praat_addMenuCommand (L"Objects", L"Open", L"Read Table from table file...", 0, praat_HIDDEN, DO_Table_readFromTableFile);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read TableOfReal from headerless spreadsheet file...", 0, 0, DO_TableOfReal_readFromHeaderlessSpreadsheetFile);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read Table from tab-separated file...", 0, 0, DO_Table_readFromTabSeparatedFile);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read Table from comma-separated file...", 0, 0, DO_Table_readFromCommaSeparatedFile);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read Table from whitespace-separated file...", 0, 0, DO_Table_readFromTableFile);
+	praat_addMenuCommand (U"Objects", U"Open", U"Read Table from table file...", 0, praat_HIDDEN, DO_Table_readFromTableFile);
 
-	praat_addAction1 (classDistributions, 0, L"Distributions help", 0, 0, DO_Distributions_help);
+	praat_addAction1 (classDistributions, 0, U"Distributions help", 0, 0, DO_Distributions_help);
 	praat_TableOfReal_init (classDistributions);
-	praat_addAction1 (classDistributions, 1, L"Get probability (label)...", L"Get value...", 1, DO_Distributions_getProbability);
-	praat_addAction1 (classDistributions, 0, L"-- get from two --", L"Get probability (label)...", 1, 0);
-	praat_addAction1 (classDistributions, 2, L"Get mean absolute difference...", L"-- get from two --", 1, DO_Distributionses_getMeanAbsoluteDifference);
-	praat_addAction1 (classDistributions, 0, L"-- add --", L"Append", 1, 0);
-	praat_addAction1 (classDistributions, 0, L"Add", L"-- add --", 1, DO_Distributionses_add);
-	praat_addAction1 (classDistributions, 0, L"Generate", 0, 0, 0);
-		praat_addAction1 (classDistributions, 0, L"To Strings...", 0, 0, DO_Distributions_to_Strings);
-		praat_addAction1 (classDistributions, 0, L"To Strings (exact)...", 0, 0, DO_Distributions_to_Strings_exact);
-
-	praat_addAction1 (classLogisticRegression, 0, L"Draw boundary...", 0, 0, DO_LogisticRegression_drawBoundary);
-
-	praat_addAction1 (classPairDistribution, 0, L"PairDistribution help", 0, 0, DO_PairDistribution_help);
-	praat_addAction1 (classPairDistribution, 0, L"To Table", 0, 0, DO_PairDistribution_to_Table);
-	praat_addAction1 (classPairDistribution, 1, L"To Stringses...", 0, 0, DO_PairDistribution_to_Stringses);
-	praat_addAction1 (classPairDistribution, 0, L"Query -", 0, 0, 0);
-		praat_addAction1 (classPairDistribution, 1, L"Get number of pairs", 0, 1, DO_PairDistribution_getNumberOfPairs);
-		praat_addAction1 (classPairDistribution, 1, L"Get string1...", 0, 1, DO_PairDistribution_getString1);
-		praat_addAction1 (classPairDistribution, 1, L"Get string2...", 0, 1, DO_PairDistribution_getString2);
-		praat_addAction1 (classPairDistribution, 1, L"Get weight...", 0, 1, DO_PairDistribution_getWeight);
-		praat_addAction1 (classPairDistribution, 1, L"-- get fraction correct --", 0, 1, 0);
-		praat_addAction1 (classPairDistribution, 1, L"Get fraction correct (maximum likelihood)", 0, 1, DO_PairDistribution_getFractionCorrect_maximumLikelihood);
-		praat_addAction1 (classPairDistribution, 1, L"Get fraction correct (probability matching)", 0, 1, DO_PairDistribution_getFractionCorrect_probabilityMatching);
-	praat_addAction1 (classPairDistribution, 0, L"Modify -", 0, 0, 0);
-	praat_addAction1 (classPairDistribution, 0, L"Remove zero weights", 0, 1, DO_PairDistribution_removeZeroWeights);
-	praat_addAction1 (classPairDistribution, 0, L"Swap inputs and outputs", 0, 1, DO_PairDistribution_swapInputsAndOutputs);
-
-	praat_addAction1 (classTable, 0, L"Table help", 0, 0, DO_Table_help);
-	praat_addAction1 (classTable, 1, L"Save as tab-separated file...", 0, 0, DO_Table_writeToTabSeparatedFile);
-	praat_addAction1 (classTable, 1, L"Save as comma-separated file...", 0, 0, DO_Table_writeToCommaSeparatedFile);
-	praat_addAction1 (classTable, 1, L"Save as table file...", 0, praat_HIDDEN, DO_Table_writeToTabSeparatedFile);
-	praat_addAction1 (classTable, 1, L"Write to table file...", 0, praat_HIDDEN, DO_Table_writeToTabSeparatedFile);
-	praat_addAction1 (classTable, 1, L"View & Edit", 0, praat_ATTRACTIVE, DO_Table_edit);
-	praat_addAction1 (classTable, 1, L"Edit", 0, praat_HIDDEN, DO_Table_edit);
-	praat_addAction1 (classTable, 0, L"Draw -", 0, 0, 0);
-		praat_addAction1 (classTable, 0, L"Scatter plot...", 0, 1, DO_Table_scatterPlot);
-		praat_addAction1 (classTable, 0, L"Scatter plot (mark)...", 0, 1, DO_Table_scatterPlot_mark);
-		praat_addAction1 (classTable, 0, L"Draw ellipse (standard deviation)...", 0, 1, DO_Table_drawEllipse);
-	praat_addAction1 (classTable, 0, L"Query -", 0, 0, 0);
-		praat_addAction1 (classTable, 1, L"List...", 0, 1, DO_Table_list);
-		praat_addAction1 (classTable, 1, L"-- get structure --", 0, 1, 0);
-		praat_addAction1 (classTable, 1, L"Get number of rows", 0, 1, DO_Table_getNumberOfRows);
-		praat_addAction1 (classTable, 1, L"Get number of columns", 0, 1, DO_Table_getNumberOfColumns);
-		praat_addAction1 (classTable, 1, L"Get column label...", 0, 1, DO_Table_getColumnLabel);
-		praat_addAction1 (classTable, 1, L"Get column index...", 0, 1, DO_Table_getColumnIndex);
-		praat_addAction1 (classTable, 1, L"-- get value --", 0, 1, 0);
-		praat_addAction1 (classTable, 1, L"Get value...", 0, 1, DO_Table_getValue);
-		praat_addAction1 (classTable, 1, L"Search column...", 0, 1, DO_Table_searchColumn);
-		praat_addAction1 (classTable, 1, L"-- statistics --", 0, 1, 0);
-		praat_addAction1 (classTable, 1, L"Statistics tutorial", 0, 1, DO_StatisticsTutorial);
-		praat_addAction1 (classTable, 1, L"-- get stats --", 0, 1, 0);
-		praat_addAction1 (classTable, 1, L"Get quantile...", 0, 1, DO_Table_getQuantile);
-		praat_addAction1 (classTable, 1, L"Get minimum...", 0, 1, DO_Table_getMinimum);
-		praat_addAction1 (classTable, 1, L"Get maximum...", 0, 1, DO_Table_getMaximum);
-		praat_addAction1 (classTable, 1, L"Get mean...", 0, 1, DO_Table_getMean);
-		praat_addAction1 (classTable, 1, L"Get group mean...", 0, 1, DO_Table_getGroupMean);
-		praat_addAction1 (classTable, 1, L"Get standard deviation...", 0, 1, DO_Table_getStandardDeviation);
-		praat_addAction1 (classTable, 1, L"-- report stats --", 0, 1, 0);
-		praat_addAction1 (classTable, 1, L"Report mean (Student t)...", 0, 1, DO_Table_reportMean_studentT);
-		/*praat_addAction1 (classTable, 1, L"Report standard deviation...", 0, 1, DO_Table_reportStandardDeviation);*/
-		praat_addAction1 (classTable, 1, L"Report difference (Student t)...", 0, 1, DO_Table_reportDifference_studentT);
-		praat_addAction1 (classTable, 1, L"Report group mean (Student t)...", 0, 1, DO_Table_reportGroupMean_studentT);
-		praat_addAction1 (classTable, 1, L"Report group difference (Student t)...", 0, 1, DO_Table_reportGroupDifference_studentT);
-		praat_addAction1 (classTable, 1, L"Report group difference (Wilcoxon rank sum)...", 0, 1, DO_Table_reportGroupDifference_wilcoxonRankSum);
-		praat_addAction1 (classTable, 1, L"Report correlation (Pearson r)...", 0, 1, DO_Table_reportCorrelation_pearsonR);
-		praat_addAction1 (classTable, 1, L"Report correlation (Kendall tau)...", 0, 1, DO_Table_reportCorrelation_kendallTau);
-	praat_addAction1 (classTable, 0, L"Modify -", 0, 0, 0);
-		praat_addAction1 (classTable, 0, L"Set string value...", 0, 1, DO_Table_setStringValue);
-		praat_addAction1 (classTable, 0, L"Set numeric value...", 0, 1, DO_Table_setNumericValue);
-		praat_addAction1 (classTable, 0, L"Formula...", 0, 1, DO_Table_formula);
-		praat_addAction1 (classTable, 0, L"Formula (column range)...", 0, 1, DO_Table_formula_columnRange);
-		praat_addAction1 (classTable, 0, L"Sort rows...", 0, 1, DO_Table_sortRows);
-		praat_addAction1 (classTable, 0, L"Randomize rows", 0, 1, DO_Table_randomizeRows);
-		praat_addAction1 (classTable, 0, L"Reflect rows", 0, 1, DO_Table_reflectRows);
-		praat_addAction1 (classTable, 0, L"-- structure --", 0, 1, 0);
-		praat_addAction1 (classTable, 0, L"Append row", 0, 1, DO_Table_appendRow);
-		praat_addAction1 (classTable, 0, L"Append column...", 0, 1, DO_Table_appendColumn);
-		praat_addAction1 (classTable, 0, L"Append sum column...", 0, 1, DO_Table_appendSumColumn);
-		praat_addAction1 (classTable, 0, L"Append difference column...", 0, 1, DO_Table_appendDifferenceColumn);
-		praat_addAction1 (classTable, 0, L"Append product column...", 0, 1, DO_Table_appendProductColumn);
-		praat_addAction1 (classTable, 0, L"Append quotient column...", 0, 1, DO_Table_appendQuotientColumn);
-		praat_addAction1 (classTable, 0, L"Remove row...", 0, 1, DO_Table_removeRow);
-		praat_addAction1 (classTable, 0, L"Remove column...", 0, 1, DO_Table_removeColumn);
-		praat_addAction1 (classTable, 0, L"Insert row...", 0, 1, DO_Table_insertRow);
-		praat_addAction1 (classTable, 0, L"Insert column...", 0, 1, DO_Table_insertColumn);
-		praat_addAction1 (classTable, 0, L"-- set --", 0, 1, 0);
-		praat_addAction1 (classTable, 0, L"Set column label (index)...", 0, 1, DO_Table_setColumnLabel_index);
-		praat_addAction1 (classTable, 0, L"Set column label (label)...", 0, 1, DO_Table_setColumnLabel_label);
-	praat_addAction1 (classTable, 0, L"Analyse -", 0, 0, 0);
-		praat_addAction1 (classTable, 0, L"To linear regression", 0, 1, DO_Table_to_LinearRegression);
-		praat_addAction1 (classTable, 0, L"To logistic regression...", 0, 1, DO_Table_to_LogisticRegression);
-	praat_addAction1 (classTable, 0, L"Synthesize -", 0, 0, 0);
-		praat_addAction1 (classTable, 0, L"Append", 0, 1, DO_Tables_append);
-	praat_addAction1 (classTable, 0, L"Generate -", 0, 0, 0);
-		praat_addAction1 (classTable, 1, L"Draw row from distribution...", 0, 1, DO_Table_drawRowFromDistribution);
-	praat_addAction1 (classTable, 0, L"Extract -", 0, 0, 0);
-		praat_addAction1 (classTable, 0, L"Extract rows where column (number)...", 0, 1, DO_Table_extractRowsWhereColumn_number);
-		praat_addAction1 (classTable, 0, L"Extract rows where column...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Table_extractRowsWhereColumn_number);
-		praat_addAction1 (classTable, 0, L"Select rows where column...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Table_extractRowsWhereColumn_number);
-		praat_addAction1 (classTable, 0, L"Extract rows where column (text)...", 0, 1, DO_Table_extractRowsWhereColumn_text);
-		praat_addAction1 (classTable, 0, L"Transpose", 0, 1, DO_Table_transpose);
-		praat_addAction1 (classTable, 0, L"Collapse rows...", 0, 1, DO_Table_collapseRows);
-		praat_addAction1 (classTable, 0, L"Rows to columns...", 0, 1, DO_Table_rowsToColumns);
-	praat_addAction1 (classTable, 0, L"Down to TableOfReal...", 0, 0, DO_Table_to_TableOfReal);
-
-	praat_addAction1 (classTableOfReal, 0, L"TableOfReal help", 0, 0, DO_TableOfReal_help);
+	praat_addAction1 (classDistributions, 1, U"Get probability (label)...", U"Get value...", 1, DO_Distributions_getProbability);
+	praat_addAction1 (classDistributions, 0, U"-- get from two --", U"Get probability (label)...", 1, 0);
+	praat_addAction1 (classDistributions, 2, U"Get mean absolute difference...", U"-- get from two --", 1, DO_Distributionses_getMeanAbsoluteDifference);
+	praat_addAction1 (classDistributions, 0, U"-- add --", U"Append", 1, 0);
+	praat_addAction1 (classDistributions, 0, U"Add", U"-- add --", 1, DO_Distributionses_add);
+	praat_addAction1 (classDistributions, 0, U"Generate", 0, 0, 0);
+		praat_addAction1 (classDistributions, 0, U"To Strings...", 0, 0, DO_Distributions_to_Strings);
+		praat_addAction1 (classDistributions, 0, U"To Strings (exact)...", 0, 0, DO_Distributions_to_Strings_exact);
+
+	praat_addAction1 (classLogisticRegression, 0, U"Draw boundary...", 0, 0, DO_LogisticRegression_drawBoundary);
+
+	praat_addAction1 (classPairDistribution, 0, U"PairDistribution help", 0, 0, DO_PairDistribution_help);
+	praat_addAction1 (classPairDistribution, 0, U"To Table", 0, 0, DO_PairDistribution_to_Table);
+	praat_addAction1 (classPairDistribution, 1, U"To Stringses...", 0, 0, DO_PairDistribution_to_Stringses);
+	praat_addAction1 (classPairDistribution, 0, U"Query -", 0, 0, 0);
+		praat_addAction1 (classPairDistribution, 1, U"Get number of pairs", 0, 1, DO_PairDistribution_getNumberOfPairs);
+		praat_addAction1 (classPairDistribution, 1, U"Get string1...", 0, 1, DO_PairDistribution_getString1);
+		praat_addAction1 (classPairDistribution, 1, U"Get string2...", 0, 1, DO_PairDistribution_getString2);
+		praat_addAction1 (classPairDistribution, 1, U"Get weight...", 0, 1, DO_PairDistribution_getWeight);
+		praat_addAction1 (classPairDistribution, 1, U"-- get fraction correct --", 0, 1, 0);
+		praat_addAction1 (classPairDistribution, 1, U"Get fraction correct (maximum likelihood)", 0, 1, DO_PairDistribution_getFractionCorrect_maximumLikelihood);
+		praat_addAction1 (classPairDistribution, 1, U"Get fraction correct (probability matching)", 0, 1, DO_PairDistribution_getFractionCorrect_probabilityMatching);
+	praat_addAction1 (classPairDistribution, 0, U"Modify -", 0, 0, 0);
+	praat_addAction1 (classPairDistribution, 0, U"Remove zero weights", 0, 1, DO_PairDistribution_removeZeroWeights);
+	praat_addAction1 (classPairDistribution, 0, U"Swap inputs and outputs", 0, 1, DO_PairDistribution_swapInputsAndOutputs);
+
+	praat_addAction1 (classTable, 0, U"Table help", 0, 0, DO_Table_help);
+	praat_addAction1 (classTable, 1, U"Save as tab-separated file...", 0, 0, DO_Table_writeToTabSeparatedFile);
+	praat_addAction1 (classTable, 1, U"Save as comma-separated file...", 0, 0, DO_Table_writeToCommaSeparatedFile);
+	praat_addAction1 (classTable, 1, U"Save as table file...", 0, praat_HIDDEN, DO_Table_writeToTabSeparatedFile);
+	praat_addAction1 (classTable, 1, U"Write to table file...", 0, praat_HIDDEN, DO_Table_writeToTabSeparatedFile);
+	praat_addAction1 (classTable, 1, U"View & Edit", 0, praat_ATTRACTIVE, DO_Table_edit);
+	praat_addAction1 (classTable, 1, U"Edit", 0, praat_HIDDEN, DO_Table_edit);
+	praat_addAction1 (classTable, 0, U"Draw -", 0, 0, 0);
+		praat_addAction1 (classTable, 0, U"Scatter plot...", 0, 1, DO_Table_scatterPlot);
+		praat_addAction1 (classTable, 0, U"Scatter plot (mark)...", 0, 1, DO_Table_scatterPlot_mark);
+		praat_addAction1 (classTable, 0, U"Draw ellipse (standard deviation)...", 0, 1, DO_Table_drawEllipse);
+	praat_addAction1 (classTable, 0, U"Query -", 0, 0, 0);
+		praat_addAction1 (classTable, 1, U"List...", 0, 1, DO_Table_list);
+		praat_addAction1 (classTable, 1, U"-- get structure --", 0, 1, 0);
+		praat_addAction1 (classTable, 1, U"Get number of rows", 0, 1, DO_Table_getNumberOfRows);
+		praat_addAction1 (classTable, 1, U"Get number of columns", 0, 1, DO_Table_getNumberOfColumns);
+		praat_addAction1 (classTable, 1, U"Get column label...", 0, 1, DO_Table_getColumnLabel);
+		praat_addAction1 (classTable, 1, U"Get column index...", 0, 1, DO_Table_getColumnIndex);
+		praat_addAction1 (classTable, 1, U"-- get value --", 0, 1, 0);
+		praat_addAction1 (classTable, 1, U"Get value...", 0, 1, DO_Table_getValue);
+		praat_addAction1 (classTable, 1, U"Search column...", 0, 1, DO_Table_searchColumn);
+		praat_addAction1 (classTable, 1, U"-- statistics --", 0, 1, 0);
+		praat_addAction1 (classTable, 1, U"Statistics tutorial", 0, 1, DO_StatisticsTutorial);
+		praat_addAction1 (classTable, 1, U"-- get stats --", 0, 1, 0);
+		praat_addAction1 (classTable, 1, U"Get quantile...", 0, 1, DO_Table_getQuantile);
+		praat_addAction1 (classTable, 1, U"Get minimum...", 0, 1, DO_Table_getMinimum);
+		praat_addAction1 (classTable, 1, U"Get maximum...", 0, 1, DO_Table_getMaximum);
+		praat_addAction1 (classTable, 1, U"Get mean...", 0, 1, DO_Table_getMean);
+		praat_addAction1 (classTable, 1, U"Get group mean...", 0, 1, DO_Table_getGroupMean);
+		praat_addAction1 (classTable, 1, U"Get standard deviation...", 0, 1, DO_Table_getStandardDeviation);
+		praat_addAction1 (classTable, 1, U"-- report stats --", 0, 1, 0);
+		praat_addAction1 (classTable, 1, U"Report mean (Student t)...", 0, 1, DO_Table_reportMean_studentT);
+		/*praat_addAction1 (classTable, 1, U"Report standard deviation...", 0, 1, DO_Table_reportStandardDeviation);*/
+		praat_addAction1 (classTable, 1, U"Report difference (Student t)...", 0, 1, DO_Table_reportDifference_studentT);
+		praat_addAction1 (classTable, 1, U"Report group mean (Student t)...", 0, 1, DO_Table_reportGroupMean_studentT);
+		praat_addAction1 (classTable, 1, U"Report group difference (Student t)...", 0, 1, DO_Table_reportGroupDifference_studentT);
+		praat_addAction1 (classTable, 1, U"Report group difference (Wilcoxon rank sum)...", 0, 1, DO_Table_reportGroupDifference_wilcoxonRankSum);
+		praat_addAction1 (classTable, 1, U"Report correlation (Pearson r)...", 0, 1, DO_Table_reportCorrelation_pearsonR);
+		praat_addAction1 (classTable, 1, U"Report correlation (Kendall tau)...", 0, 1, DO_Table_reportCorrelation_kendallTau);
+	praat_addAction1 (classTable, 0, U"Modify -", 0, 0, 0);
+		praat_addAction1 (classTable, 0, U"Set string value...", 0, 1, DO_Table_setStringValue);
+		praat_addAction1 (classTable, 0, U"Set numeric value...", 0, 1, DO_Table_setNumericValue);
+		praat_addAction1 (classTable, 0, U"Formula...", 0, 1, DO_Table_formula);
+		praat_addAction1 (classTable, 0, U"Formula (column range)...", 0, 1, DO_Table_formula_columnRange);
+		praat_addAction1 (classTable, 0, U"Sort rows...", 0, 1, DO_Table_sortRows);
+		praat_addAction1 (classTable, 0, U"Randomize rows", 0, 1, DO_Table_randomizeRows);
+		praat_addAction1 (classTable, 0, U"Reflect rows", 0, 1, DO_Table_reflectRows);
+		praat_addAction1 (classTable, 0, U"-- structure --", 0, 1, 0);
+		praat_addAction1 (classTable, 0, U"Append row", 0, 1, DO_Table_appendRow);
+		praat_addAction1 (classTable, 0, U"Append column...", 0, 1, DO_Table_appendColumn);
+		praat_addAction1 (classTable, 0, U"Append sum column...", 0, 1, DO_Table_appendSumColumn);
+		praat_addAction1 (classTable, 0, U"Append difference column...", 0, 1, DO_Table_appendDifferenceColumn);
+		praat_addAction1 (classTable, 0, U"Append product column...", 0, 1, DO_Table_appendProductColumn);
+		praat_addAction1 (classTable, 0, U"Append quotient column...", 0, 1, DO_Table_appendQuotientColumn);
+		praat_addAction1 (classTable, 0, U"Remove row...", 0, 1, DO_Table_removeRow);
+		praat_addAction1 (classTable, 0, U"Remove column...", 0, 1, DO_Table_removeColumn);
+		praat_addAction1 (classTable, 0, U"Insert row...", 0, 1, DO_Table_insertRow);
+		praat_addAction1 (classTable, 0, U"Insert column...", 0, 1, DO_Table_insertColumn);
+		praat_addAction1 (classTable, 0, U"-- set --", 0, 1, 0);
+		praat_addAction1 (classTable, 0, U"Set column label (index)...", 0, 1, DO_Table_setColumnLabel_index);
+		praat_addAction1 (classTable, 0, U"Set column label (label)...", 0, 1, DO_Table_setColumnLabel_label);
+	praat_addAction1 (classTable, 0, U"Analyse -", 0, 0, 0);
+		praat_addAction1 (classTable, 0, U"To linear regression", 0, 1, DO_Table_to_LinearRegression);
+		praat_addAction1 (classTable, 0, U"To logistic regression...", 0, 1, DO_Table_to_LogisticRegression);
+	praat_addAction1 (classTable, 0, U"Synthesize -", 0, 0, 0);
+		praat_addAction1 (classTable, 0, U"Append", 0, 1, DO_Tables_append);
+	praat_addAction1 (classTable, 0, U"Generate -", 0, 0, 0);
+		praat_addAction1 (classTable, 1, U"Draw row from distribution...", 0, 1, DO_Table_drawRowFromDistribution);
+	praat_addAction1 (classTable, 0, U"Extract -", 0, 0, 0);
+		praat_addAction1 (classTable, 0, U"Extract rows where column (number)...", 0, 1, DO_Table_extractRowsWhereColumn_number);
+		praat_addAction1 (classTable, 0, U"Extract rows where column...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Table_extractRowsWhereColumn_number);
+		praat_addAction1 (classTable, 0, U"Select rows where column...", 0, praat_DEPTH_1 + praat_HIDDEN, DO_Table_extractRowsWhereColumn_number);
+		praat_addAction1 (classTable, 0, U"Extract rows where column (text)...", 0, 1, DO_Table_extractRowsWhereColumn_text);
+		praat_addAction1 (classTable, 0, U"Transpose", 0, 1, DO_Table_transpose);
+		praat_addAction1 (classTable, 0, U"Collapse rows...", 0, 1, DO_Table_collapseRows);
+		praat_addAction1 (classTable, 0, U"Rows to columns...", 0, 1, DO_Table_rowsToColumns);
+	praat_addAction1 (classTable, 0, U"Down to TableOfReal...", 0, 0, DO_Table_to_TableOfReal);
+
+	praat_addAction1 (classTableOfReal, 0, U"TableOfReal help", 0, 0, DO_TableOfReal_help);
 	praat_TableOfReal_init (classTableOfReal);
 
-	praat_addAction2 (classPairDistribution, 1, classDistributions, 1, L"Get fraction correct...", 0, 0, DO_PairDistribution_Distributions_getFractionCorrect);
+	praat_addAction2 (classPairDistribution, 1, classDistributions, 1, U"Get fraction correct...", 0, 0, DO_PairDistribution_Distributions_getFractionCorrect);
 }
 
 /* End of file praat_Stat.cpp */
diff --git a/sys/ButtonEditor.cpp b/sys/ButtonEditor.cpp
index bea0c77..ec0754f 100644
--- a/sys/ButtonEditor.cpp
+++ b/sys/ButtonEditor.cpp
@@ -1,6 +1,6 @@
 /* ButtonEditor.cpp
  *
- * Copyright (C) 1996-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1996-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,94 +34,94 @@ Thing_implement (ButtonEditor, HyperPage, 0);
 #endif
 
 static void drawMenuCommand (ButtonEditor me, praat_Command cmd, long i) {
-	static MelderString text = { 0 };
-	int isAdded = cmd -> uniqueID != 0 || cmd -> script != NULL;
-	int isHidden = cmd -> hidden;
-	int isToggled = cmd -> toggled;
-	const wchar_t *clickText = isHidden ? (isToggled ? (isAdded ? L"REMOVED" : L"HIDDEN") : L"hidden") :
-		(isToggled ? L"SHOWN" :  (isAdded ? (cmd -> uniqueID ? L"ADDED" : L"START-UP") : L"shown"));
+	static MelderString text { 0 };
+	bool isAdded = cmd -> uniqueID != 0 || cmd -> script != nullptr;
+	bool isHidden = cmd -> hidden;
+	bool isToggled = cmd -> toggled;
+	const char32 *clickText = isHidden ? (isToggled ? (isAdded ? U"REMOVED" : U"HIDDEN") : U"hidden") :
+		(isToggled ? U"SHOWN" :  (isAdded ? (cmd -> uniqueID ? U"ADDED" : U"START-UP") : U"shown"));
 	MelderString_empty (& text);
 	if (cmd -> unhidable) {
-		MelderString_append (& text, L"#unhidable ");
+		MelderString_append (& text, U"#unhidable ");
 	} else {
-		MelderString_append (& text, L"@@m", Melder_integer (i), L"|", clickText, L"@ ");
+		MelderString_append (& text, U"@@m", i, U"|", clickText, U"@ ");
 	}
-	MelderString_append (& text, cmd -> window, L": ");
+	MelderString_append (& text, cmd -> window, U": ");
 	if (cmd -> menu) {
-		MelderString_append (& text, cmd -> menu, L": ");
+		MelderString_append (& text, cmd -> menu, U": ");
 	}
 	if (cmd -> title) {
 		if (cmd -> executable) {
-			MelderString_append (& text, L"@@p", Melder_integer (i), L"|", cmd -> title, L"@");
+			MelderString_append (& text, U"@@p", i, U"|", cmd -> title, U"@");
 		} else {
 			MelderString_append (& text, cmd -> title);
 		}
 	} else {
-		MelderString_append (& text, L"---------");
+		MelderString_append (& text, U"---------");
 	}
 	if (cmd -> after) {
-		MelderString_append (& text, L", %%%%after \"", cmd -> after, L"\"%%");
+		MelderString_append (& text, U", %%%%after \"", cmd -> after, U"\"%%");
 	}
 	if (cmd -> script) {
-		MelderString_append (& text, L", script \"", Melder_peekExpandBackslashes (cmd -> script), L"\"");
+		MelderString_append (& text, U", script \"", Melder_peekExpandBackslashes (cmd -> script), U"\"");
 	}
 	HyperPage_any (me, text.string, my p_font, my p_fontSize, cmd -> callback ? 0 : Graphics_ITALIC, 0.0,
 		cmd -> depth * 0.3, 0.4, 0.0, 0.0, 0);
 }
 
 static void drawAction (ButtonEditor me, praat_Command cmd, long i) {
-	static MelderString text = { 0 };
-	int isAdded = cmd -> uniqueID != 0 || cmd -> script != NULL;
-	int isHidden = cmd -> hidden, isToggled = cmd -> toggled;
-	const wchar_t *clickText = isHidden ? (isToggled ? (isAdded ? L"REMOVED" : L"HIDDEN") : L"hidden") :
-		(isToggled ? L"SHOWN" :  (isAdded ? (cmd -> uniqueID ? L"ADDED" : L"START-UP") : L"shown"));
+	static MelderString text { 0 };
+	bool isAdded = cmd -> uniqueID != 0 || cmd -> script != nullptr;
+	bool isHidden = cmd -> hidden, isToggled = cmd -> toggled;
+	const char32 *clickText = isHidden ? (isToggled ? (isAdded ? U"REMOVED" : U"HIDDEN") : U"hidden") :
+		(isToggled ? U"SHOWN" :  (isAdded ? (cmd -> uniqueID ? U"ADDED" : U"START-UP") : U"shown"));
 	int n1 = cmd -> n1;
 	MelderString_empty (& text);
 	if (cmd -> class4) {
-		MelderString_append (& text, L"#unhidable ");
+		MelderString_append (& text, U"#unhidable ");
 	} else {
-		MelderString_append (& text, L"@@a", Melder_integer (i), L"|", clickText, L"@ ");
+		MelderString_append (& text, U"@@a", i, U"|", clickText, U"@ ");
 	}
 	MelderString_append (& text, cmd -> class1 -> className);
 	if (n1) {
-		MelderString_append (& text, L" (", Melder_integer (n1), L")");
+		MelderString_append (& text, U" (", n1, U")");
 	}
 	if (cmd -> class2) {
 		int n2 = cmd -> n2;
-		MelderString_append (& text, L" & ", cmd -> class2 -> className);
+		MelderString_append (& text, U" & ", cmd -> class2 -> className);
 		if (n2) {
-			MelderString_append (& text, L" (", Melder_integer (n2), L")");
+			MelderString_append (& text, U" (", n2, U")");
 		}
 	}
 	if (cmd -> class3) {
 		int n3 = cmd -> n3;
-		MelderString_append (& text, L" & ", cmd -> class3 -> className);
+		MelderString_append (& text, U" & ", cmd -> class3 -> className);
 		if (n3) {
-			MelderString_append (& text, L" (", Melder_integer (n3), L")");
+			MelderString_append (& text, U" (", n3, U")");
 		}
 	}
 	if (cmd -> class4) {
 		int n4 = cmd -> n4;
-		MelderString_append (& text, L" & ", cmd -> class4 -> className);
+		MelderString_append (& text, U" & ", cmd -> class4 -> className);
 		if (n4) {
-			MelderString_append (& text, L" (", Melder_integer (n4), L")");
+			MelderString_append (& text, U" (", n4, U")");
 		}
 	}
-	MelderString_append (& text, L": ");
+	MelderString_append (& text, U": ");
 	if (cmd -> title) {
 		if (cmd -> executable) {
-			MelderString_append (& text, L"@@e", Melder_integer (i), L"|", cmd -> title, L"@");
+			MelderString_append (& text, U"@@e", i, U"|", cmd -> title, U"@");
 		} else {
 			MelderString_append (& text, cmd -> title);
 		}
 	} else {
-		MelderString_append (& text, L"---------");
+		MelderString_append (& text, U"---------");
 	}
 	if (cmd -> after) {
-		MelderString_append (& text, L", %%%%after \"", cmd -> after, L"\"%%");
+		MelderString_append (& text, U", %%%%after \"", cmd -> after, U"\"%%");
 	}
 	if (cmd -> script) {
-		MelderString_append (& text, L", script \"", Melder_peekExpandBackslashes (cmd -> script), L"\"");
+		MelderString_append (& text, U", script \"", Melder_peekExpandBackslashes (cmd -> script), U"\"");
 	}
 	HyperPage_any (me, text.string, my p_font, my p_fontSize, cmd -> callback ? 0 : Graphics_ITALIC, 0.0,
 		cmd -> depth * 0.3, 0.4, 0.0, 0.0, 0);
@@ -133,49 +133,49 @@ void structButtonEditor :: v_draw () {
 		case 1:
 			for (long i = 1, n = praat_getNumberOfMenuCommands (); i <= n; i ++) {
 				praat_Command cmd = praat_getMenuCommand (i);
-				if (wcsequ (cmd -> window, L"Objects"))
+				if (str32equ (cmd -> window, U"Objects"))
 					drawMenuCommand (this, praat_getMenuCommand (i), i);
 			}
 			break;
 		case 2:
 			for (long i = 1, n = praat_getNumberOfMenuCommands (); i <= n; i ++) {
 				praat_Command cmd = praat_getMenuCommand (i);
-				if (wcsequ (cmd -> window, L"Picture"))
+				if (str32equ (cmd -> window, U"Picture"))
 					drawMenuCommand (this, praat_getMenuCommand (i), i);
 			}
 			break;
 		case 3:
 			for (long i = 1, n = praat_getNumberOfMenuCommands (); i <= n; i ++) {
 				praat_Command cmd = praat_getMenuCommand (i);
-				if (! wcsequ (cmd -> window, L"Objects") && ! wcsequ (cmd -> window, L"Picture"))
+				if (! str32equ (cmd -> window, U"Objects") && ! str32equ (cmd -> window, U"Picture"))
 					drawMenuCommand (this, praat_getMenuCommand (i), i);
 			}
 			break;
 		case 4:
 			for (long i = 1, n = praat_getNumberOfActions (); i <= n; i ++) {
 				praat_Command cmd = praat_getAction (i);
-				const wchar_t *klas = cmd -> class1 -> className;
-				if (wcscmp (klas, L"N") < 0)
+				const char32 *klas = cmd -> class1 -> className;
+				if (str32cmp (klas, U"N") < 0)
 					drawAction (this, praat_getAction (i), i);
 			}
 			break;
 		case 5:
 			for (long i = 1, n = praat_getNumberOfActions (); i <= n; i ++) {
 				praat_Command cmd = praat_getAction (i);
-				const wchar_t *klas = cmd -> class1 -> className;
-				if (wcscmp (klas, L"N") >= 0)
+				const char32 *klas = cmd -> class1 -> className;
+				if (str32cmp (klas, U"N") >= 0)
 					drawAction (this, praat_getAction (i), i);
 			}
 			break;
 	}
 }
 
-int structButtonEditor :: v_goToPage (const wchar_t *title) {
+int structButtonEditor :: v_goToPage (const char32 *title) {
 	if (! title || ! title [0]) return 0;
-	if (wcsequ (title, L"Buttons")) return 1;
+	if (str32equ (title, U"Buttons")) return 1;
 	switch (title [0]) {
-		case 'a': {   /* Toggle visibility of action.*/
-			long i = wcstol (& title [1], NULL, 10);
+		case 'a': {   // toggle visibility of action
+			long i = Melder_atoi (& title [1]);
 			praat_Command action = praat_getAction (i);
 			if (! action) return 0;
 			if (action -> hidden)
@@ -183,8 +183,8 @@ int structButtonEditor :: v_goToPage (const wchar_t *title) {
 			else
 				praat_hideAction (action -> class1, action -> class2, action -> class3, action -> title);
 		} break;
-		case 'm': {   /* Toggle visibility of menu command. */
-			long i = wcstol (& title [1], NULL, 10);
+		case 'm': {   // toggle visibility of menu command
+			long i = Melder_atoi (& title [1]);
 			praat_Command menuCommand = praat_getMenuCommand (i);
 			if (! menuCommand) return 0;
 			if (menuCommand -> hidden)
@@ -192,48 +192,48 @@ int structButtonEditor :: v_goToPage (const wchar_t *title) {
 			else
 				praat_hideMenuCommand (menuCommand -> window, menuCommand -> menu, menuCommand -> title);
 		} break;
-		case 'e': {   /* Execute action. */
-			long i = wcstol (& title [1], NULL, 10);
+		case 'e': {   // execute action
+			long i = Melder_atoi (& title [1]);
 			praat_Command action = praat_getAction (i);
 			if (! action || ! action -> callback) return 0;
 			if (action -> title) {
-				UiHistory_write (L"\n");
+				UiHistory_write (U"\n");
 				UiHistory_write_colonize (action -> title);
 			}
 			if (action -> script) {
 				try {
-					DO_RunTheScriptFromAnyAddedMenuCommand (NULL, 0, NULL, action -> script, NULL, NULL, false, NULL);
+					DO_RunTheScriptFromAnyAddedMenuCommand (nullptr, 0, nullptr, action -> script, nullptr, nullptr, false, nullptr);
 				} catch (MelderError) {
-					Melder_flushError ("Command not executed.");
+					Melder_flushError (U"Command not executed.");
 				}
 			} else {
 				try {
-					action -> callback (NULL, 0, NULL, NULL, NULL, NULL, false, NULL);
+					action -> callback (nullptr, 0, nullptr, nullptr, nullptr, nullptr, false, nullptr);
 				} catch (MelderError) {
-					Melder_flushError ("Command not executed.");
+					Melder_flushError (U"Command not executed.");
 				}
 			}
 			praat_updateSelection ();
 		} break;
-		case 'p': {   /* Perform menu command. */
-			long i = wcstol (& title [1], NULL, 10);
+		case 'p': {   // perform menu command
+			long i = Melder_atoi (& title [1]);
 			praat_Command menuCommand = praat_getMenuCommand (i);
 			if (! menuCommand || ! menuCommand -> callback) return 0;
 			if (menuCommand -> title) {
-				UiHistory_write (L"\n");
+				UiHistory_write (U"\n");
 				UiHistory_write_colonize (menuCommand -> title);
 			}
 			if (menuCommand -> script) {
 				try {
-					DO_RunTheScriptFromAnyAddedMenuCommand (NULL, 0, NULL, menuCommand -> script, NULL, NULL, false, NULL);
+					DO_RunTheScriptFromAnyAddedMenuCommand (nullptr, 0, nullptr, menuCommand -> script, nullptr, nullptr, false, nullptr);
 				} catch (MelderError) {
-					Melder_flushError ("Command not executed.");
+					Melder_flushError (U"Command not executed.");
 				}
 			} else {
 				try {
-					menuCommand -> callback (NULL, 0, NULL, NULL, NULL, NULL, false, NULL);
+					menuCommand -> callback (nullptr, 0, nullptr, nullptr, nullptr, nullptr, false, nullptr);
 				} catch (MelderError) {
-					Melder_flushError ("Command not executed.");
+					Melder_flushError (U"Command not executed.");
 				}
 			}
 			praat_updateSelection ();
@@ -245,8 +245,8 @@ int structButtonEditor :: v_goToPage (const wchar_t *title) {
 
 static void which (ButtonEditor me, int show) {
 	my show = show;
-	( show == 1 ? my button1 : show == 2 ? my button2 : show == 3 ? my button3 : show == 4 ? my button4 : my button5 ) -> f_set ();
-	HyperPage_goToPage (me, L"Buttons");
+	GuiRadioButton_set (show == 1 ? my button1 : show == 2 ? my button2 : show == 3 ? my button3 : show == 4 ? my button4 : my button5);
+	HyperPage_goToPage (me, U"Buttons");
 }
 
 static void gui_radiobutton_cb_objects (I, GuiRadioButtonEvent event) { (void) event; which ((ButtonEditor) void_me, 1); }
@@ -260,37 +260,37 @@ void structButtonEditor :: v_createChildren () {
 	int x = 3, y = Machine_getMenuBarHeight () + 4;
 	GuiRadioGroup_begin ();
 	button1 = GuiRadioButton_createShown (d_windowForm, x, x + BUTTON_WIDTH, y, y + Gui_RADIOBUTTON_HEIGHT,
-		L"Objects", gui_radiobutton_cb_objects, this, GuiRadioButton_SET);
+		U"Objects", gui_radiobutton_cb_objects, this, GuiRadioButton_SET);
 	x += BUTTON_WIDTH + 5;
 	button2 = GuiRadioButton_createShown (d_windowForm, x, x + BUTTON_WIDTH, y, y + Gui_RADIOBUTTON_HEIGHT,
-		L"Picture", gui_radiobutton_cb_picture, this, 0);
+		U"Picture", gui_radiobutton_cb_picture, this, 0);
 	x += BUTTON_WIDTH + 5;
 	button3 = GuiRadioButton_createShown (d_windowForm, x, x + BUTTON_WIDTH, y, y + Gui_RADIOBUTTON_HEIGHT,
-		L"Editors", gui_radiobutton_cb_editors, this, 0);
+		U"Editors", gui_radiobutton_cb_editors, this, 0);
 	x += BUTTON_WIDTH + 5;
 	button4 = GuiRadioButton_createShown (d_windowForm, x, x + BUTTON_WIDTH + 30, y, y + Gui_RADIOBUTTON_HEIGHT,
-		L"Actions A-M", gui_radiobutton_cb_actionsAM, this, 0);
+		U"Actions A-M", gui_radiobutton_cb_actionsAM, this, 0);
 	x += BUTTON_WIDTH + 35;
 	button5 = GuiRadioButton_createShown (d_windowForm, x, x + BUTTON_WIDTH + 30, y, y + Gui_RADIOBUTTON_HEIGHT,
-		L"Actions N-Z", gui_radiobutton_cb_actionsNZ, this, 0);
+		U"Actions N-Z", gui_radiobutton_cb_actionsNZ, this, 0);
 	GuiRadioGroup_end ();
 }
 
-static void menu_cb_ButtonEditorHelp (EDITOR_ARGS) { EDITOR_IAM (ButtonEditor); Melder_help (L"ButtonEditor"); }
+static void menu_cb_ButtonEditorHelp (EDITOR_ARGS) { EDITOR_IAM (ButtonEditor); Melder_help (U"ButtonEditor"); }
 
 void structButtonEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	ButtonEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"ButtonEditor help", '?', menu_cb_ButtonEditorHelp);
+	EditorMenu_addCommand (menu, U"ButtonEditor help", '?', menu_cb_ButtonEditorHelp);
 }
 
 ButtonEditor ButtonEditor_create () {
 	try {
 		autoButtonEditor me = Thing_new (ButtonEditor);
-		HyperPage_init (me.peek(), L"Buttons", NULL);
+		HyperPage_init (me.peek(), U"Buttons", nullptr);
 		which (me.peek(), 1);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Buttons window not created.");
+		Melder_throw (U"Buttons window not created.");
 	}
 }
 
diff --git a/sys/ButtonEditor.h b/sys/ButtonEditor.h
index d59e9f8..b1a1e76 100644
--- a/sys/ButtonEditor.h
+++ b/sys/ButtonEditor.h
@@ -2,7 +2,7 @@
 #define _ButtonEditor_h_
 /* ButtonEditor.h
  *
- * Copyright (C) 1996-2011,2012 Paul Boersma
+ * Copyright (C) 1996-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,16 +22,19 @@
 #include "HyperPage.h"
 
 Thing_define (ButtonEditor, HyperPage) {
-	// new data:
-	public:
-		int show;
-		GuiRadioButton button1, button2, button3, button4, button5;
-	// overridden methods:
-		virtual bool v_scriptable () { return false; }
-		virtual void v_createChildren ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_draw ();
-		virtual int v_goToPage (const wchar_t *title);
+	int show;
+	GuiRadioButton button1, button2, button3, button4, button5;
+
+	bool v_scriptable ()
+		override { return false; }
+	void v_createChildren ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_draw ()
+		override;
+	int v_goToPage (const char32 *title)
+		override;
 };
 
 ButtonEditor ButtonEditor_create ();
diff --git a/sys/Collection.cpp b/sys/Collection.cpp
index 79a468b..bdd8213 100644
--- a/sys/Collection.cpp
+++ b/sys/Collection.cpp
@@ -1,6 +1,6 @@
 /* Collection.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,44 +18,44 @@
  */
 
 #include "Collection.h"
+#include <string>
 
 /********** class Collection **********/
 
 void structCollection :: v_destroy () {
-	if (item != NULL) {
-		if (! _dontOwnItems) {
-			for (long i = 1; i <= size; i ++) {
-				forget (((Thing *) item) [i]);
+	if (our item) {
+		if (! our _dontOwnItems) {
+			for (long i = 1; i <= our size; i ++) {
+				forget (((Thing *) our item) [i]);
 			}
 		}
-		item ++;   // base 1
-		Melder_free (item);
+		our item ++;   // base 1
+		Melder_free (our item);
 	}
 	Collection_Parent :: v_destroy ();
 }
 
-void structCollection :: v_info ()
-{
-	MelderInfo_writeLine (Melder_integer (size), L" items");
+void structCollection :: v_info () {
+	MelderInfo_writeLine (size, U" items");
 }
 
 void structCollection :: v_copy (thou) {
 	thouart (Collection);
-	thy item = NULL;   // kill shallow copy of item  // BUG
+	thy item = nullptr;   // kill shallow copy of item  // BUG
 	Collection_Parent :: v_copy (thee);
 	thy itemClass = itemClass;
 	thy _capacity = _capacity;
 	thy size = size;
-	thy item = Melder_calloc (void *, _capacity);   // filled with NULL
+	thy item = Melder_calloc (void *, _capacity);   // filled with null pointers
 	thy item --;   // immediately turn from base-0 into base-1  // BUG use NUMvector
 	for (long i = 1; i <= size; i ++) {
 		Thing itempie = (Thing) item [i];
 		if (_dontOwnItems) {
-			thy item [i] = itempie;   // reference copy: if me doesn't own the items, then thee shouldn't either   // NOTE: the items don't have to be Data
+			thy item [i] = itempie;   // reference copy: if me doesn't own the items, then thee shouldn't either   // NOTE: the items don't have to be Daata
 		} else {
-			if (! Thing_member (itempie, classData))
-				Melder_throw ("Cannot copy item of class ", Thing_className (itempie), ".");
-			thy item [i] = Data_copy ((Data) itempie);
+			if (! Thing_isa (itempie, classDaata))
+				Melder_throw (U"Cannot copy item of class ", Thing_className (itempie), U".");
+			thy item [i] = Data_copy ((Daata) itempie);
 		}
 	}
 }
@@ -65,15 +65,16 @@ bool structCollection :: v_equal (thou) {
 	if (! Collection_Parent :: v_equal (thee)) return false;
 	if (size != thy size) return false;
 	for (long i = 1; i <= size; i ++) {
-		if (! Thing_member ((Thing) item [i], classData))
-			Melder_throw ("Collection::equal: "
-				"cannot compare items of class ", Thing_className ((Thing) item [i]), ".");
-		if (! Thing_member ((Thing) thy item [i], classData))
-			Melder_throw ("Collection::equal: "
-				"cannot compare items of class ", Thing_className ((Thing) thy item [i]), ".");
-		bool equal = Data_equal ((Data) item [i], (Data) thy item [i]);
-		//Melder_casual ("classCollection_equal: %d, items %ld, types %ls and %ls",
-		//	equal, (long) i, Thing_className (my item [i]), Thing_className (thy item [i]));
+		if (! Thing_isa ((Thing) item [i], classDaata))
+			Melder_throw (U"Collection::equal: "
+				U"cannot compare items of class ", Thing_className ((Thing) item [i]), U".");
+		if (! Thing_isa ((Thing) thy item [i], classDaata))
+			Melder_throw (U"Collection::equal: "
+				U"cannot compare items of class ", Thing_className ((Thing) thy item [i]), U".");
+		bool equal = Data_equal ((Daata) item [i], (Daata) thy item [i]);
+		//Melder_casual (U"classCollection_equal: ", equal,
+		//	U", item ", i,
+		//  U", types ", Thing_className (my item [i]), U" and ", Thing_className (thy item [i]));
 		if (! equal) return false;
 	}
 	return true;
@@ -81,82 +82,84 @@ bool structCollection :: v_equal (thou) {
 
 bool structCollection :: v_canWriteAsEncoding (int encoding) {
 	for (long i = 1; i <= size; i ++) {
-		Data data = (Data) item [i];
-		if (data -> name != NULL && ! Melder_isEncodable (data -> name, encoding)) return false;
+		Daata data = (Daata) item [i];
+		if (data -> name != nullptr && ! Melder_isEncodable (data -> name, encoding)) return false;
 		if (! Data_canWriteAsEncoding (data, encoding)) return false;
 	}
 	return true;
 }
 
 void structCollection :: v_writeText (MelderFile file) {
-	texputi4 (file, size, L"size", 0,0,0,0,0);
-	texputintro (file, L"item []: ", size ? NULL : L"(empty)", 0,0,0,0);
+	texputi4 (file, size, U"size", 0,0,0,0,0);
+	texputintro (file, U"item []: ", size ? nullptr : U"(empty)", 0,0,0,0);
 	for (long i = 1; i <= size; i ++) {
 		Thing thing = (Thing) item [i];
 		ClassInfo classInfo = thing -> classInfo;
-		texputintro (file, L"item [", Melder_integer (i), L"]:", 0,0,0);
-		if (! Thing_member (thing, classData) || ! Data_canWriteText ((Data) thing))
-			Melder_throw ("Objects of class ", classInfo -> className, " cannot be written.");
+		texputintro (file, U"item [", Melder_integer (i), U"]:", 0,0,0);
+		if (! Thing_isa (thing, classDaata) || ! Data_canWriteText ((Daata) thing))
+			Melder_throw (U"Objects of class ", classInfo -> className, U" cannot be written.");
 		texputw2 (file,
 			classInfo -> version > 0 ?
-				Melder_wcscat (classInfo -> className, L" ", Melder_integer (classInfo -> version)) :
+				Melder_cat (classInfo -> className, U" ", classInfo -> version) :
 				classInfo -> className,
-			L"class", 0,0,0,0,0);
-		texputw2 (file, thing -> name, L"name", 0,0,0,0,0);
-		Data_writeText ((Data) thing, file);
+			U"class", 0,0,0,0,0);
+		texputw2 (file, thing -> name, U"name", 0,0,0,0,0);
+		Data_writeText ((Daata) thing, file);
 		texexdent (file);
 	}
 	texexdent (file);
 }
 
-void structCollection :: v_readText (MelderReadText text) {
-	if (Thing_version < 0) {
+void structCollection :: v_readText (MelderReadText text, int formatVersion) {
+	if (formatVersion < 0) {
 		long l_size;
-		wchar_t *line = MelderReadText_readLine (text);
-		if (line == NULL || ! swscanf (line, L"%ld", & l_size) || l_size < 0)
-			Melder_throw ("Collection::readText: cannot read size.");
-		Collection_init (this, NULL, l_size);
+		autostring8 line = Melder_32to8 (MelderReadText_readLine (text));
+		if (! line.peek() || ! sscanf (line.peek(), "%ld", & l_size) || l_size < 0)
+			Melder_throw (U"Collection::readText: cannot read size.");
+		Collection_init (this, nullptr, l_size);
 		for (long i = 1; i <= l_size; i ++) {
 			long itemNumberRead;
 			int n = 0, length, stringsRead;
 			char klas [200], nameTag [2000];
-			do { line = MelderReadText_readLine (text); if (line == NULL) Melder_throw ("Missing object line."); }
-			while (wcsncmp (line, L"Object ", 7));
-			stringsRead = swscanf (line, L"Object %ld: class %s %s%n", & itemNumberRead, klas, nameTag, & n);
+			do {
+				line.reset (Melder_32to8 (MelderReadText_readLine (text)));
+				if (! line.peek())
+					Melder_throw (U"Missing object line.");
+			} while (strncmp (line.peek(), "Object ", 7));
+			stringsRead = sscanf (line.peek(), "Object %ld: class %s %s%n", & itemNumberRead, klas, nameTag, & n);
 			if (stringsRead < 2)
-				Melder_throw ("Collection::readText: cannot read header of object ", i, ".");
+				Melder_throw (U"Collection::readText: cannot read header of object ", i, U".");
 			if (itemNumberRead != i)
-				Melder_throw ("Collection::readText: read item number ", itemNumberRead,
-					" while expecting ", i, ".");
+				Melder_throw (U"Collection::readText: read item number ", itemNumberRead,
+					U" while expecting ", i, U".");
 			if (stringsRead == 3 && ! strequ (nameTag, "name"))
-				Melder_throw ("Collection::readText: wrong header at object ", i, ".");
-			our item [i] = Thing_newFromClassNameA (klas);
-			Thing_version = -1;   /* Override. */
+				Melder_throw (U"Collection::readText: wrong header at object ", i, U".");
+			our item [i] = Thing_newFromClassName (Melder_peek8to32 (klas), nullptr);
 			our size ++;
-			if (! Thing_member ((Thing) our item [i], classData) || ! Data_canReadText ((Data) our item [i]))
-				Melder_throw ("Cannot read item of class ", Thing_className ((Thing) our item [i]), " in collection.");
-			Data_readText ((Data) our item [i], text);
+			if (! Thing_isa ((Thing) our item [i], classDaata) || ! Data_canReadText ((Daata) our item [i]))
+				Melder_throw (U"Cannot read item of class ", Thing_className ((Thing) our item [i]), U" in collection.");
+			Data_readText ((Daata) our item [i], text, -1);
 			if (stringsRead == 3) {
-				if (line [n] == ' ') n ++;   // skip space character
-				length = wcslen (line+n);
-				if (length > 0 && (line+n) [length - 1] == '\n') (line+n) [length - 1] = '\0';
-				Thing_setName ((Thing) item [i], line+n);
+				if (line [n] == U' ') n ++;   // skip space character
+				length = strlen (line.peek()+n);
+				if (length > 0 && (line.peek()+n) [length - 1] == '\n')
+					(line.peek()+n) [length - 1] = '\0';
+				Thing_setName ((Thing) item [i], Melder_peek8to32 (line.peek()+n));
 			}
 		}
 	} else {
 		int32_t l_size = texgeti4 (text);
-		Collection_init (this, NULL, l_size);
+		Collection_init (this, nullptr, l_size);
 		for (int32_t i = 1; i <= l_size; i ++) {
-			long saveVersion = Thing_version;   /* The version of the Collection... */
-			autostring8 className = texgets2 (text);
-			our item [i] = Thing_newFromClassNameA (className.peek());
+			autostring32 className = texgetw2 (text);
+			int elementFormatVersion;
+			our item [i] = Thing_newFromClassName (className.peek(), & elementFormatVersion);
 			our size ++;
-			if (! Thing_member ((Thing) our item [i], classData) || ! Data_canReadText ((Data) our item [i]))
-				Melder_throw ("Cannot read item of class ", Thing_className ((Thing) our item [i]), " in collection.");
-			autostring objectName = texgetw2 (text);
+			if (! Thing_isa ((Thing) our item [i], classDaata) || ! Data_canReadText ((Daata) our item [i]))
+				Melder_throw (U"Cannot read item of class ", Thing_className ((Thing) our item [i]), U" in collection.");
+			autostring32 objectName = texgetw2 (text);
 			Thing_setName ((Thing) our item [i], objectName.peek());
-			Data_readText ((Data) our item [i], text);
-			Thing_version = saveVersion;
+			Data_readText ((Daata) our item [i], text, elementFormatVersion);
 		}
 	}
 }
@@ -166,67 +169,66 @@ void structCollection :: v_writeBinary (FILE *f) {
 	for (long i = 1; i <= our size; i ++) {
 		Thing thing = (Thing) our item [i];
 		ClassInfo classInfo = thing -> classInfo;
-		if (! Thing_member (thing, classData) || ! Data_canWriteBinary ((Data) thing))
-			Melder_throw ("Objects of class ", classInfo -> className, L" cannot be written.");
+		if (! Thing_isa (thing, classDaata) || ! Data_canWriteBinary ((Daata) thing))
+			Melder_throw (U"Objects of class ", classInfo -> className, U" cannot be written.");
 		binputw1 (classInfo -> version > 0 ?
-			Melder_wcscat (classInfo -> className, L" ", Melder_integer (classInfo -> version)) : classInfo -> className, f);
+			Melder_cat (classInfo -> className, U" ", classInfo -> version) : classInfo -> className, f);
 		binputw2 (thing -> name, f);
-		Data_writeBinary ((Data) thing, f);
+		Data_writeBinary ((Daata) thing, f);
 	}
 }
 
-void structCollection :: v_readBinary (FILE *f) {
-	if (Thing_version < 0) {
-		int32_t l_size = bingeti4 (f);
+void structCollection :: v_readBinary (FILE *f, int formatVersion) {
+	if (formatVersion < 0) {
+		int32 l_size = bingeti4 (f);
 		if (l_size < 0)
-			Melder_throw ("Empty collection.");
-		Collection_init (this, NULL, l_size);
+			Melder_throw (U"Empty collection.");
+		Collection_init (this, nullptr, l_size);
 		for (int32_t i = 1; i <= l_size; i ++) {
 			char klas [200], name [2000];
 			if (fscanf (f, "%s%s", klas, name) < 2)   // BUG
-				Melder_throw ("Cannot read class and name.");
-			our item [i] = Thing_newFromClassNameA (klas);
-			Thing_version = -1;   /* Override. */
+				Melder_throw (U"Cannot read class and name.");
+			our item [i] = Thing_newFromClassName (Melder_peek8to32 (klas), nullptr);
 			our size ++;
-			if (! Thing_member ((Thing) our item [i], classData))
-				Melder_throw ("Cannot read item of class ", Thing_className ((Thing) our item [i]), ".");
+			if (! Thing_isa ((Thing) our item [i], classDaata))
+				Melder_throw (U"Cannot read item of class ", Thing_className ((Thing) our item [i]), U".");
 			if (fgetc (f) != ' ')
-				Melder_throw ("Cannot read space.");
-			Data_readBinary ((Data) our item [i], f);
-			if (strcmp (name, "?")) Thing_setName ((Thing) our item [i], Melder_peekUtf8ToWcs (name));
+				Melder_throw (U"Cannot read space.");
+			Data_readBinary ((Daata) our item [i], f, -1);
+			if (strcmp (name, "?"))
+				Thing_setName ((Thing) our item [i], Melder_peek8to32 (name));
 		}
 	} else {
 		int32_t l_size = bingeti4 (f);
 		if (Melder_debug == 44)
-			Melder_casual ("structCollection :: v_readBinary: Reading %ld objects", (long) l_size);
-		Collection_init (this, NULL, l_size);
+			Melder_casual (U"structCollection :: v_readBinary: Reading ", l_size, U" objects");
+		Collection_init (this, nullptr, l_size);
 		for (int32_t i = 1; i <= l_size; i ++) {
-			long saveVersion = Thing_version;   // the version of the Collection...
 			autostring8 klas = bingets1 (f);
 			if (Melder_debug == 44)
-				Melder_casual ("structCollection :: v_readBinary: Reading object of type %s", klas.peek());
-			our item [i] = Thing_newFromClassNameA (klas.peek());
+				Melder_casual (U"structCollection :: v_readBinary: Reading object of type ", Melder_peek8to32 (klas.peek()));
+			int elementFormatVersion;
+			our item [i] = Thing_newFromClassName (Melder_peek8to32 (klas.peek()), & elementFormatVersion);
 			our size ++;
-			if (! Thing_member ((Thing) our item [i], classData) || ! Data_canReadBinary ((Data) our item [i]))
-				Melder_throw ("Objects of class ", Thing_className ((Thing) our item [i]), " cannot be read.");
-			autostring name = bingetw2 (f);
+			if (! Thing_isa ((Thing) our item [i], classDaata) || ! Data_canReadBinary ((Daata) our item [i]))
+				Melder_throw (U"Objects of class ", Thing_className ((Thing) our item [i]), U" cannot be read.");
+			autostring32 name = bingetw2 (f);
 			if (Melder_debug == 44)
-				Melder_casual ("structCollection :: v_readBinary: Reading object with name %ls", name.peek());
+				Melder_casual (U"structCollection :: v_readBinary: Reading object with name ", name.peek());
 			Thing_setName ((Thing) our item [i], name.peek());
-			Data_readBinary ((Data) our item [i], f);
-			Thing_version = saveVersion;
+			Data_readBinary ((Daata) our item [i], f, elementFormatVersion);
 		}
 	}
 }
 
 static struct structData_Description theCollection_description [] = {
-	{ L"size", longwa, Melder_offsetof (Collection, size), sizeof (long) },
-	{ L"item", objectwa, Melder_offsetof (Collection, item), sizeof (Data), L"Data", & theClassInfo_Data, 1, 0, L"size" },
+	{ U"size", longwa, Melder_offsetof (Collection, size), sizeof (long) },
+	{ U"item", objectwa, Melder_offsetof (Collection, item), sizeof (Daata), U"Daata", & theClassInfo_Daata, 1, 0, U"size" },
 	{ 0 }
 };
 Data_Description structCollection :: s_description = & theCollection_description [0];
 
-Thing_implement (Collection, Data, 0);
+Thing_implement (Collection, Daata, 0);
 
 void Collection_init (Collection me, ClassInfo itemClass_, long initialCapacity) {
 	my itemClass = itemClass_;
@@ -252,7 +254,7 @@ void _Collection_insertItem (Collection me, Thing data, long pos) {
 		/*
 		 * Check without change.
 		 */
-		Any *dum = (Any *) Melder_realloc (my item + 1, 2 * my _capacity * sizeof (Any));
+		Any *dum = (Any *) Melder_realloc (my item + 1, 2 * my _capacity * (int64) sizeof (Any));
 		/*
 		 * From here: change without error.
 		 */
@@ -266,7 +268,7 @@ void _Collection_insertItem (Collection me, Thing data, long pos) {
 
 void Collection_addItem (Collection me, Thing data) {
 	try {
-		Melder_assert (data != NULL);
+		Melder_assert (data != nullptr);
 		long index = my v_position (data);
 		if (index != 0) {
 			_Collection_insertItem (me, data, index);
@@ -275,7 +277,7 @@ void Collection_addItem (Collection me, Thing data) {
 				forget (data);   // could not insert; I am the owner, so I must dispose of the data
 		}
 	} catch (MelderError) {
-		Melder_throw (me, ": item not added.");
+		Melder_throw (me, U": item not added.");
 	}
 }
 
@@ -310,29 +312,29 @@ void Collection_removeAllItems (Collection me) {
 
 void Collection_shrinkToFit (Collection me) {
 	my _capacity = my size ? my size : 1;
-	my item = (Any *) Melder_realloc (my item + 1, my _capacity * sizeof (Any)) - 1;
+	my item = (Any *) Melder_realloc (my item + 1, my _capacity * (int64) sizeof (Any)) - 1;
 }
 
 Any Collections_merge (Collection me, Collection thee) {
 	try {
 		if (my classInfo != thy classInfo)
-			Melder_throw ("Objects are of different class.");
+			Melder_throw (U"Objects are of different class.");
 		if (my _dontOwnItems != thy _dontOwnItems)
-			Melder_throw ("Cannot mix data and references.");
+			Melder_throw (U"Cannot mix data and references.");
 		autoCollection him = Data_copy (me);
 		for (long i = 1; i <= thy size; i ++) {
 			Thing item = (Thing) thy item [i];
 			if (my _dontOwnItems) {
 				Collection_addItem (him.peek(), item);
 			} else {
-				if (! Thing_member (item, classData))
-					Melder_throw ("Cannot copy item of class ", Thing_className (item), ".");
-				Collection_addItem (him.peek(), Data_copy ((Data) item));
+				if (! Thing_isa (item, classDaata))
+					Melder_throw (U"Cannot copy item of class ", Thing_className (item), U".");
+				Collection_addItem (him.peek(), Data_copy ((Daata) item));
 			}
 		}
 		return him.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, " and ", thee, " not merged." );
+		Melder_throw (me, U" and ", thee, U" not merged." );
 	}
 }
 
@@ -344,9 +346,9 @@ void Ordered_init (Ordered me, ClassInfo itemClass, long initialMaximumLength) {
 	Collection_init (me, itemClass, initialMaximumLength);
 }
 
-Ordered Ordered_create (void) {
+Ordered Ordered_create () {
 	autoOrdered me = Thing_new (Ordered);
-	Ordered_init (me.peek(), NULL, 10);
+	Ordered_init (me.peek(), nullptr, 10);
 	return me.transfer();
 }
 
@@ -437,7 +439,7 @@ void SortedSetOfInt_init (SortedSetOfInt me) {
 	SortedSet_init (me, classSimpleInt, 10);
 }
 
-SortedSetOfInt SortedSetOfInt_create (void) {
+SortedSetOfInt SortedSetOfInt_create () {
 	autoSortedSetOfInt me = Thing_new (SortedSetOfInt);
 	SortedSetOfInt_init (me.peek());
 	return me.transfer();
@@ -458,7 +460,7 @@ void SortedSetOfLong_init (SortedSetOfLong me) {
 	SortedSet_init (me, classSimpleLong, 10);
 }
 
-SortedSetOfLong SortedSetOfLong_create (void) {
+SortedSetOfLong SortedSetOfLong_create () {
 	autoSortedSetOfLong me = Thing_new (SortedSetOfLong);
 	SortedSetOfLong_init (me.peek());
 	return me.transfer();
@@ -479,7 +481,7 @@ void SortedSetOfDouble_init (SortedSetOfDouble me) {
 	SortedSet_init (me, classSimpleDouble, 10);
 }
 
-SortedSetOfDouble SortedSetOfDouble_create (void) {
+SortedSetOfDouble SortedSetOfDouble_create () {
 	autoSortedSetOfDouble me = Thing_new (SortedSetOfDouble);
 	SortedSetOfDouble_init (me.peek());
 	return me.transfer();
@@ -491,37 +493,37 @@ Thing_implement (SortedSetOfString, SortedSet, 0);
 
 int structSortedSetOfString :: s_compare (I, thou) {
 	iam (SimpleString); thouart (SimpleString);
-	return wcscmp (my string, thy string);
+	return str32cmp (my string, thy string);
 }
 
 void SortedSetOfString_init (SortedSetOfString me) {
 	SortedSet_init (me, classSimpleString, 10);
 }
 
-SortedSetOfString SortedSetOfString_create (void) {
+SortedSetOfString SortedSetOfString_create () {
 	autoSortedSetOfString me = Thing_new (SortedSetOfString);
 	SortedSetOfString_init (me.peek());
 	return me.transfer();
 }
 
-long SortedSetOfString_lookUp (SortedSetOfString me, const wchar_t *string) {
+long SortedSetOfString_lookUp (SortedSetOfString me, const char32 *string) {
 	SimpleString *items = (SimpleString *) my item;
 	long numberOfItems = my size;
 	long left = 1, right = numberOfItems;
 	int atStart, atEnd;
 	if (numberOfItems == 0) return 0;
 
-	atEnd = wcscmp (string, items [numberOfItems] -> string);
+	atEnd = str32cmp (string, items [numberOfItems] -> string);
 	if (atEnd > 0) return 0;
 	if (atEnd == 0) return numberOfItems;
 
-	atStart = wcscmp (string, items [1] -> string);
+	atStart = str32cmp (string, items [1] -> string);
 	if (atStart < 0) return 0;
 	if (atStart == 0) return 1;
 
 	while (left < right - 1) {
 		long mid = (left + right) / 2;
-		int here = wcscmp (string, items [mid] -> string);
+		int here = str32cmp (string, items [mid] -> string);
 		if (here == 0) return mid;
 		if (here > 0) left = mid; else right = mid;
 	}
@@ -529,17 +531,17 @@ long SortedSetOfString_lookUp (SortedSetOfString me, const wchar_t *string) {
 	return 0;
 }
 
-void structSortedSetOfString :: addString (const wchar_t *string) {
+void SortedSetOfString_addString (SortedSetOfString me, const char32 *string) {
 	static SimpleString simp;
-	if (simp == NULL) {
-		simp = SimpleString_create (L"");
+	if (! simp) {
+		simp = SimpleString_create (U"");
 		Melder_free (simp -> string);
 	}
-	simp -> string = (wchar_t *) string;   // reference copy
-	long index = v_position (simp);
+	simp -> string = (char32 *) string;   // reference copy
+	long index = my v_position (simp);
 	if (index == 0) return;   // OK: already there: do not add
 	autoSimpleString newSimp = SimpleString_create (string);
-	_Collection_insertItem (this, newSimp.transfer(), index);
+	_Collection_insertItem (me, newSimp.transfer(), index);
 }
 
 /********** class Cyclic **********/
@@ -549,25 +551,25 @@ Thing_implement (Cyclic, Collection, 0);
 int structCyclic :: s_compare (I, thou) {
 	(void) void_me;
 	(void) void_thee;
-	Melder_fatal ("Cyclic::compare: subclass responsibility.");
+	Melder_fatal (U"Cyclic::compare: subclass responsibility.");
 	return 0;
 }
 
-void structCyclic :: cycleLeft () {
-	if (size == 0) return;   // for size == 1 no motion will take place either, but in that case the algorithm determines that automatically
-	Data help = (Data) item [1];
-	for (long i = 1; i < size; i ++) item [i] = item [i + 1];
-	item [size] = help;
+void Cyclic_cycleLeft (Cyclic me) {
+	if (my size == 0) return;   // for size == 1 no motion will take place either, but in that case the algorithm determines that automatically
+	Daata help = (Daata) my item [1];
+	for (long i = 1; i < my size; i ++) my item [i] = my item [i + 1];
+	my item [my size] = help;
 }
 
-void structCyclic :: unicize () {
-	Data_CompareFunction compare = v_getCompareFunction ();
-	if (size <= 1) return;
+void Cyclic_unicize (Cyclic me) {
+	Data_CompareFunction compare = my v_getCompareFunction ();
+	if (my size <= 1) return;
 	long lowest = 1;
-	for (long i = 1; i <= size; i ++)
-		if (compare (item [i], item [lowest]) < 0) lowest = i;
+	for (long i = 1; i <= my size; i ++)
+		if (compare (my item [i], my item [lowest]) < 0) lowest = i;
 	for (long i = 1; i < lowest; i ++)
-		cycleLeft ();
+		Cyclic_cycleLeft (me);
 }
 
 void Cyclic_init (Cyclic me, ClassInfo itemClass, long initialCapacity) {
diff --git a/sys/Collection.h b/sys/Collection.h
index 5c518ad..f8de77e 100644
--- a/sys/Collection.h
+++ b/sys/Collection.h
@@ -2,7 +2,7 @@
 #define _Collection_h_
 /* Collection.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,41 +20,46 @@
  */
 
 /*
- * Collection objects contain a number of items whose class is a subclass of Data.
+ * Collection objects contain a number of items whose class is a subclass of Daata.
  */
 
 #include "Simple.h"
 
-Thing_define (Collection, Data) {
-	// new data:
-	public:
-		ClassInfo itemClass;   // the class of which all items must be members (see Thing_member)
-		long _capacity, size;
-		bool _dontOwnItems;
-		Any *item;   // [1..size]
-	// overridden methods:
-	public:
-		virtual void v_info ();
-		virtual void v_destroy ();   // destroys all the items
-		virtual void v_copy (Any data_to);   // copies all the items
-		virtual bool v_equal (Any data2);   // compares 'my item [i]' with 'thy item [i]', i = 1..size
-		virtual bool v_canWriteAsEncoding (int outputEncoding);
-		virtual void v_writeText (MelderFile openFile);
-		virtual void v_readText (MelderReadText text);
-		virtual void v_writeBinary (FILE *f);
-		virtual void v_readBinary (FILE *f);
-		static Data_Description s_description;
-		virtual Data_Description v_description () { return s_description; }
-		virtual long v_position (Any data) {
-			(void) data;
-			return size + 1;   // at end
-		};
+Thing_define (Collection, Daata) {
+	ClassInfo itemClass;   // the class of which all items must be members (see Thing_isa)
+	long _capacity, size;
+	bool _dontOwnItems;
+	Any *item;   // [1..size]
+
+	void v_info ()
+		override;
+	void v_destroy ()
+		override;   // destroys all the items
+	void v_copy (Any data_to)
+		override;   // copies all the items
+	bool v_equal (Any data2)
+		override;   // compares 'my item [i]' with 'thy item [i]', i = 1..size
+	bool v_canWriteAsEncoding (int outputEncoding)
+		override;
+	void v_writeText (MelderFile openFile)
+		override;
+	void v_readText (MelderReadText text, int formatVersion)
+		override;
+	void v_writeBinary (FILE *f)
+		override;
+	void v_readBinary (FILE *f, int formatVersion)
+		override;
+	static Data_Description s_description;
+	Data_Description v_description ()
+		override { return s_description; }
+
+	virtual long v_position (Any /* data */) { return size + 1; /* at end */ };
 };
 /*
 	An object of type Collection is a collection of items of any class.
 	It is the owner of its items.
 	You can access the items in the collection as item [1] through item [size].
-	There can be no NULL items.
+	There can be no null items.
 
 	Attributes:
 		_capacity >= size		// private; grows as you add items.
@@ -66,28 +71,37 @@ void Collection_init (Collection me, ClassInfo itemClass, long initialCapacity);
 Collection Collection_create (ClassInfo itemClass, long initialCapacity);
 /*
 	Function:
-		return a new empty Collection, or NULL if out of memory.
+		return a new empty Collection.
 	Preconditions:
 		initialCapacity >= 1;
 	Postconditions:
 		my _capacity == initialCapacity;
+	Failures:
+		Out of memory.
 */
 
+/**
+	Normally, the Collection is the owner of all the items, which means that
+	the Collection will destroy all its items when the Collection itself is destroyed.
+	By calling `Collection_dontOwnItems()` immediately after creating the Collection,
+	you make sure that the Collection contains *references* to the items instead.
+	The result is that the items will not be destroyed when the Collection is destroyed.
+*/
 void Collection_dontOwnItems (Collection me);
 
 /*
 	Data_copy, Data_equal, Data_writeXXX, Data_readXXX
 	try to copy, compare, write, or read all the items.
-	However, if any of the items is not of class Data,
-	these routines fail with a message and return 0.
+	However, if any of the items is not of class Daata,
+	these routines fail with a message.
 */
 
 void Collection_addItem (Collection me, Thing item);
 /*
 	Function:
-		add the 'item' to the collection. Return 0 if out of memory, else 1.
+		add the 'item' to the collection.
 	Preconditions:
- 		item != NULL;
+ 		item != nullptr;
 	Postconditions if result == 1:
 		my size >= my old size + 1;
 		if (my size > my old _capacity) my _capacity == 2 * my old _capacity;
@@ -174,7 +188,7 @@ void _Collection_insertItem (Collection me, Thing item, long position);
 Thing_define (Ordered, Collection) {
 };
 
-Ordered Ordered_create (void);
+Ordered Ordered_create ();
 void Ordered_init (Ordered me, ClassInfo itemClass, long initialCapacity);
 
 /* Behaviour:
@@ -193,12 +207,12 @@ void Ordered_addItemPos (Ordered me, Thing data, long position);
 /* A Sorted is a sorted Collection. */
 
 Thing_define (Sorted, Collection) {
-	// new methods:
-	public:
-		virtual long v_position (Any data);
-		static int s_compare (Any data1, Any data2);
-		virtual Data_CompareFunction v_getCompareFunction () { return s_compare; }
-			// should compare the keys of two items; returns negative if me < thee, 0 if me == thee, and positive if me > thee
+	long v_position (Any data)
+		override;
+
+	static int s_compare (Any data1, Any data2);
+	virtual Data_CompareFunction v_getCompareFunction () { return s_compare; }
+		// should compare the keys of two items; returns negative if me < thee, 0 if me == thee, and positive if me > thee
 };
 
 void Sorted_init (Sorted me, ClassInfo itemClass, long initialCapacity);
@@ -231,18 +245,15 @@ void Sorted_sort (Sorted me);
 /********** class SortedSet **********/
 
 Thing_define (SortedSet, Sorted) {   // every item must be unique (by key)
-	// functions:
-	public:
-		bool hasItem (Any a_item) {
-			return v_position (a_item) == 0;
-		}
-	// overridden methods:
-	protected:
-		virtual long v_position (Any data);   // returns 0 (refusal) if the key of 'data' already occurs
+	virtual long v_position (Any data);   // returns 0 (refusal) if the key of 'data' already occurs
 };
 
 void SortedSet_init (SortedSet me, ClassInfo itemClass, long initialCapacity);
 
+inline static bool SortedSet_hasItem (SortedSet me, Any a_item) {
+	return my v_position (a_item) == 0;
+}
+
 /* Behaviour:
 	Collection_addItem (SortedSet) refuses to insert an item if this item already occurs.
 		Equality is there when the compare routine returns 0.
@@ -252,66 +263,61 @@ void SortedSet_init (SortedSet me, ClassInfo itemClass, long initialCapacity);
 /********** class SortedSetOfInt **********/
 
 Thing_define (SortedSetOfInt, SortedSet) {
-	// overridden methods:
-		static int s_compare (Any data1, Any data2);
-		virtual Data_CompareFunction v_getCompareFunction () { return s_compare; }
+	static int s_compare (Any data1, Any data2);
+	Data_CompareFunction v_getCompareFunction ()
+		override { return s_compare; }
 };
 
 void SortedSetOfInt_init (SortedSetOfInt me);
-SortedSetOfInt SortedSetOfInt_create (void);
+SortedSetOfInt SortedSetOfInt_create ();
 
 /********** class SortedSetOfLong **********/
 
 Thing_define (SortedSetOfLong, SortedSet) {
-	// overridden methods:
-		static int s_compare (Any data1, Any data2);
-		virtual Data_CompareFunction v_getCompareFunction () { return s_compare; }
+	static int s_compare (Any data1, Any data2);
+	Data_CompareFunction v_getCompareFunction ()
+		override { return s_compare; }
 };
 
 void SortedSetOfLong_init (SortedSetOfLong me);
-SortedSetOfLong SortedSetOfLong_create (void);
+SortedSetOfLong SortedSetOfLong_create ();
 
 /********** class SortedSetOfDouble **********/
 
 Thing_define (SortedSetOfDouble, SortedSet) {
-	// overridden methods:
-		static int s_compare (Any data1, Any data2);
-		virtual Data_CompareFunction v_getCompareFunction () { return s_compare; }
+	static int s_compare (Any data1, Any data2);
+	Data_CompareFunction v_getCompareFunction ()
+		override { return s_compare; }
 };
 
 void SortedSetOfDouble_init (SortedSetOfDouble me);
-SortedSetOfDouble SortedSetOfDouble_create (void);
+SortedSetOfDouble SortedSetOfDouble_create ();
 
 /********** class SortedSetOfString **********/
 
 Thing_define (SortedSetOfString, SortedSet) {
-	// functions:
-	public:
-		void addString (const wchar_t *string);
-	// overridden methods:
-	protected:
-		static int s_compare (Any data1, Any data2);
-		virtual Data_CompareFunction v_getCompareFunction () { return s_compare; }
+	static int s_compare (Any data1, Any data2);
+	Data_CompareFunction v_getCompareFunction ()
+		override { return s_compare; }
 };
 
 void SortedSetOfString_init (SortedSetOfString me);
-SortedSetOfString SortedSetOfString_create (void);
-long SortedSetOfString_lookUp (SortedSetOfString me, const wchar_t *string);
+SortedSetOfString SortedSetOfString_create ();
+void SortedSetOfString_addString (SortedSetOfString me, const char32 *string);
+long SortedSetOfString_lookUp (SortedSetOfString me, const char32 *string);
 
 /********** class Cyclic **********/
 
 Thing_define (Cyclic, Collection) {   // the cyclic list (a, b, c, d) equals (b, c, d, a) but not (d, c, a, b)
-	// functions:
-	public:
-		void cycleLeft ();
-		void unicize ();
-	// overridden methods:
-	protected:
-		static int s_compare (Any data1, Any data2);
-		virtual Data_CompareFunction v_getCompareFunction () { return s_compare; }
+	static int s_compare (Any data1, Any data2);
+	virtual Data_CompareFunction v_getCompareFunction () { return s_compare; }
 };
 
 void Cyclic_init (Cyclic me, ClassInfo itemClass, long initialCapacity);
 
+void Cyclic_cycleLeft (Cyclic me);
+void Cyclic_unicize (Cyclic me);
+
+
 /* End of file Collection.h */
 #endif
diff --git a/sys/Data.cpp b/sys/Data.cpp
index 606ee45..a27844d 100644
--- a/sys/Data.cpp
+++ b/sys/Data.cpp
@@ -1,6 +1,6 @@
 /* Data.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,77 +19,72 @@
 
 #include "Collection.h"
 
-Thing_implement (Data, Thing, 0);
+Thing_implement (Daata, Thing, 0);
 
 structMelderDir Data_directoryBeingRead = { { 0 } };
 
-void structData :: v_copy (thou) {
-	thouart (Data);
+void structDaata :: v_copy (thou) {
+	thouart (Daata);
 	(void) thee;
 }
 
-bool structData :: v_equal (thou) {
-	thouart (Data);
+bool structDaata :: v_equal (thou) {
+	thouart (Daata);
 	(void) thee;
 	return true;
 }   // names of "identical" objects are allowed to be different
 
-bool structData :: v_canWriteAsEncoding (int encoding) {
-	(void) encoding;
+bool structDaata :: v_canWriteAsEncoding (int /*encoding*/) {
 	return true;
 }
 
-void structData :: v_writeText (MelderFile openFile) {
-	(void) openFile;
+void structDaata :: v_writeText (MelderFile /*openFile*/) {
 }
 
-void structData :: v_readText (MelderReadText text) {
-	(void) text;
+void structDaata :: v_readText (MelderReadText, int /*formatVersion*/) {
 }
 
-void structData :: v_writeBinary (FILE *f) {
-	(void) f;
+void structDaata :: v_writeBinary (FILE *) {
 }
 
-void structData :: v_readBinary (FILE *f) {
-	(void) f;
+void structDaata :: v_readBinary (FILE *, int /*formatVersion*/) {
 }
 
-Any _Data_copy (Data me) {
+Daata _Data_copy (Daata me) {
 	try {
-		if (me == NULL) return NULL;
-		autoData thee = (Data) _Thing_new (my classInfo);
+		if (! me) return nullptr;
+		autoDaata thee = static_cast <Daata> (Thing_newFromClass (my classInfo));
 		my v_copy (thee.peek());
 		Thing_setName (thee.peek(), my name);
 		return thee.transfer();
 	} catch (MelderError) {
-		Melder_throw (me, ": not copied.");
+		Melder_throw (me, U": not copied.");
 	}
 }
 
-bool Data_equal (Data me, Data thee) {
+bool Data_equal (Daata me, Daata thee) {
 	if (my classInfo != thy classInfo) return false;   // different class: not equal
-	int offset = sizeof (struct structData);   // we already compared the methods, and are going to skip the names
+	int offset = sizeof (struct structDaata);   // we already compared the methods, and are going to skip the names
 	if (! memcmp ((char *) me + offset, (char *) thee + offset, my classInfo -> size - offset))
 		return true;   // no shallow differences
 	return my v_equal (thee);
 }
 
-bool Data_canWriteAsEncoding (Data me, int encoding) {
+bool Data_canWriteAsEncoding (Daata me, int encoding) {
 	return my v_canWriteAsEncoding (encoding);
 }
 
-bool Data_canWriteText (Data me) {
+bool Data_canWriteText (Daata me) {
 	return my v_writable ();
 }
 
-void Data_writeText (Data me, MelderFile openFile) {
+void Data_writeText (Daata me, MelderFile openFile) {
 	my v_writeText (openFile);
 	if (ferror (openFile -> filePointer))
-		Melder_throw ("I/O error.");
+		Melder_throw (U"I/O error.");
 }
 
-MelderFile Data_createTextFile (Data me, MelderFile file, bool verbose) {
+MelderFile Data_createTextFile (Daata me, MelderFile file, bool verbose) {
 	autoMelderFile mfile = MelderFile_create (file);
 	#if defined (_WIN32)
 		file -> requiresCRLF = true;
@@ -106,162 +101,166 @@ MelderFile Data_createTextFile (Data me, MelderFile file, bool verbose) {
 	return mfile.transfer();
 }
 
-static void _Data_writeToTextFile (Data me, MelderFile file, bool verbose) {
+static void _Data_writeToTextFile (Daata me, MelderFile file, bool verbose) {
 	try {
 		if (! Data_canWriteText (me))
-			Melder_throw ("Objects of class ", my classInfo -> className, " cannot be written to a text file.");
+			Melder_throw (U"Objects of class ", my classInfo -> className, U" cannot be written to a text file.");
 		autoMelderFile mfile = Data_createTextFile (me, file, verbose);
 		#ifndef _WIN32
 			flockfile (file -> filePointer);   // BUG
 		#endif
-		MelderFile_write (file, L"File type = \"ooTextFile\"\nObject class = \"", my classInfo -> className);
+		MelderFile_write (file, U"File type = \"ooTextFile\"\nObject class = \"", my classInfo -> className);
 		if (my classInfo -> version > 0)
-			MelderFile_write (file, L" ", Melder_integer (my classInfo -> version));
-		MelderFile_write (file, L"\"\n");
+			MelderFile_write (file, U" ", my classInfo -> version);
+		MelderFile_write (file, U"\"\n");
 		Data_writeText (me, file);
-		MelderFile_writeCharacter (file, '\n');
+		MelderFile_writeCharacter (file, U'\n');
 		#ifndef _WIN32
 			if (file -> filePointer) funlockfile (file -> filePointer);
 		#endif
 		mfile.close ();
 	} catch (MelderError) {
 		#ifndef _WIN32
-			if (file -> filePointer) funlockfile (file -> filePointer);   // the file pointer is NULL before Data_createTextFile() and after mfile.close()
+			if (file -> filePointer) funlockfile (file -> filePointer);   // the file pointer is null before Data_createTextFile() and after mfile.close()
 		#endif
 		throw;
 	}
 }
 
-void Data_writeToTextFile (Data me, MelderFile file) {
+void Data_writeToTextFile (Daata me, MelderFile file) {
 	try {
 		_Data_writeToTextFile (me, file, true);
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to text file ", file, ".");
+		Melder_throw (me, U": not written to text file ", file, U".");
 	}
 }
 
-void Data_writeToShortTextFile (Data me, MelderFile file) {
+void Data_writeToShortTextFile (Daata me, MelderFile file) {
 	try {
 		_Data_writeToTextFile (me, file, false);
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to short text file ", file, ".");
+		Melder_throw (me, U": not written to short text file ", file, U".");
 	}
 }
 
-bool Data_canWriteBinary (Data me) {
+bool Data_canWriteBinary (Daata me) {
 	return my v_writable ();
 }
 
-void Data_writeBinary (Data me, FILE *f) {
+void Data_writeBinary (Daata me, FILE *f) {
 	my v_writeBinary (f);
 	if (ferror (f))
-		Melder_throw ("I/O error.");
+		Melder_throw (U"I/O error.");
 }
 
-void Data_writeToBinaryFile (Data me, MelderFile file) {
+void Data_writeToBinaryFile (Daata me, MelderFile file) {
 	try {
 		if (! Data_canWriteBinary (me))
-			Melder_throw ("Objects of class ", my classInfo -> className, L" cannot be written to a generic binary file.");
+			Melder_throw (U"Objects of class ", my classInfo -> className, U" cannot be written to a generic binary file.");
 		autoMelderFile mfile = MelderFile_create (file);
 		if (fprintf (file -> filePointer, "ooBinaryFile") < 0)
-			Melder_throw ("Cannot write first bytes of file.");
+			Melder_throw (U"Cannot write first bytes of file.");
 		binputw1 (
 			my classInfo -> version > 0 ?
-				Melder_wcscat (my classInfo -> className, L" ", Melder_integer (my classInfo -> version)) :
+				Melder_cat (my classInfo -> className, U" ", my classInfo -> version) :
 				my classInfo -> className,
 			file -> filePointer);
 		Data_writeBinary (me, file -> filePointer);
 		mfile.close ();
 	} catch (MelderError) {
-		Melder_throw (me, ": not written to binary file ", file, ".");
+		Melder_throw (me, U": not written to binary file ", file, U".");
 	}
 }
 
-bool Data_canReadText (Data me) {
+bool Data_canReadText (Daata me) {
 	return my v_writable ();
 }
 
-void Data_readText (Data me, MelderReadText text) {
+void Data_readText (Daata me, MelderReadText text, int formatVersion) {
 	try {
-		my v_readText (text);
+		my v_readText (text, formatVersion);
 		my v_repair ();
 	} catch (MelderError) {
-		Melder_throw (Thing_className (me), " not read.");
+		Melder_throw (Thing_className (me), U" not read.");
 	}
 }
 
-Any Data_readFromTextFile (MelderFile file) {
+Daata Data_readFromTextFile (MelderFile file) {
 	try {
 		autoMelderReadText text = MelderReadText_createFromFile (file);
-		wchar_t *line = MelderReadText_readLine (text.peek());
-		if (line == NULL)
-			Melder_throw ("No lines.");
-		wchar_t *end = wcsstr (line, L"ooTextFile");   // oo format?
-		autoData me = NULL;
+		char32 *line = MelderReadText_readLine (text.peek());
+		if (! line)
+			Melder_throw (U"No lines.");
+		char32 *end = str32str (line, U"ooTextFile");   // oo format?
+		autoDaata me;
+		int formatVersion;
 		if (end) {
-			autostring klas = texgetw2 (text.peek());
-			me.reset ((Data) Thing_newFromClassName (klas.peek()));
+			autostring32 klas = texgetw2 (text.peek());
+			me.reset (static_cast <Daata> (Thing_newFromClassName (klas.peek(), & formatVersion)));
 		} else {
-			end = wcsstr (line, L"TextFile");
-			if (end == NULL)
-				Melder_throw ("Not an old-type text file; should not occur.");
-			*end = '\0';
-			me.reset ((Data) Thing_newFromClassName (line));
-			Thing_version = -1;   // old version: override version number, which was set to 0 by newFromClassName
+			end = str32str (line, U"TextFile");
+			if (! end)
+				Melder_throw (U"Not an old-type text file; should not occur.");
+			*end = U'\0';
+			me.reset (static_cast <Daata> (Thing_newFromClassName (line, nullptr)));
+			formatVersion = -1;   // old version
 		}
 		MelderFile_getParentDir (file, & Data_directoryBeingRead);
-		Data_readText (me.peek(), text.peek());
+		Data_readText (me.peek(), text.peek(), formatVersion);
+		file -> format = structMelderFile :: Format :: text;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Data not read from text file ", file, ".");
+		Melder_throw (U"Data not read from text file ", file, U".");
 	}
 }
 
-bool Data_canReadBinary (Data me) {
+bool Data_canReadBinary (Daata me) {
 	return my v_writable ();
 }
 
-void Data_readBinary (Data me, FILE *f) {
+void Data_readBinary (Daata me, FILE *f, int formatVersion) {
 	try {
-		my v_readBinary (f);
+		my v_readBinary (f, formatVersion);
 		if (feof (f))
-			Melder_throw ("Early end of file.");
+			Melder_throw (U"Early end of file.");
 		if (ferror (f))
-			Melder_throw ("I/O error.");
+			Melder_throw (U"I/O error.");
 		my v_repair ();
 	} catch (MelderError) {
-		Melder_throw (Thing_className (me), " not read.");
+		Melder_throw (Thing_className (me), U" not read.");
 	}
 }
 
-Any Data_readFromBinaryFile (MelderFile file) {
+Daata Data_readFromBinaryFile (MelderFile file) {
 	try {
 		autofile f = Melder_fopen (file, "rb");
 		char line [200];
 		int n = fread (line, 1, 199, f); line [n] = '\0';
 		char *end = strstr (line, "ooBinaryFile");
-		autoData me = NULL;
+		autoDaata me;
+		int formatVersion;
 		if (end) {
 			fseek (f, strlen ("ooBinaryFile"), 0);
 			autostring8 klas = bingets1 (f);
-			me.reset ((Data) Thing_newFromClassNameA (klas.peek()));
+			me.reset (static_cast <Daata> (Thing_newFromClassName (Melder_peek8to32 (klas.peek()), & formatVersion)));
 		} else {
 			end = strstr (line, "BinaryFile");
 			if (! end) {
-				Melder_throw ("File ", file, " is not a Data binary file.");
+				Melder_throw (U"File ", file, U" is not a Data binary file.");
 			}
 			*end = '\0';
-			me.reset ((Data) Thing_newFromClassNameA (line));
-			Thing_version = -1;   // old version: override version number, which was set to 0 by newFromClassName
+			me.reset (static_cast <Daata> (Thing_newFromClassName (Melder_peek8to32 (line), nullptr)));
+			formatVersion = -1;   // old version: override version number, which was set to 0 by newFromClassName
 			rewind (f);
 			fread (line, 1, end - line + strlen ("BinaryFile"), f);
 		}
 		MelderFile_getParentDir (file, & Data_directoryBeingRead);
-		Data_readBinary (me.peek(), f);
+		Data_readBinary (me.peek(), f, formatVersion);
+		file -> format = structMelderFile :: Format :: binary;
 		f.close (file);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Data not read from binary file ", file, ".");
+		Melder_throw (U"Data not read from binary file ", file, U".");
 	}
 }
 
@@ -274,7 +273,7 @@ void Data_recognizeFileType (Any (*recognizer) (int nread, const char *header, M
 	fileTypeRecognizers [++ numFileTypeRecognizers] = recognizer;
 }
 
-Any Data_readFromFile (MelderFile file) {
+Daata Data_readFromFile (MelderFile file) {
 	int nread, i;
 	char header [513];
 	autofile f = Melder_fopen (file, "rb");
@@ -286,7 +285,7 @@ Any Data_readFromFile (MelderFile file) {
 
 	if (nread > 11) {
 		char *p = strstr (header, "TextFile");
-		if (p != NULL && p - header < nread - 8 && p - header < 40)
+		if (p && p - header < nread - 8 && p - header < 40)
 			return Data_readFromTextFile (file);
 	}
 	if (nread > 22) {
@@ -296,7 +295,7 @@ Any Data_readFromFile (MelderFile file) {
 		for (i = 0; i < 100; i ++)
 			if (headerCopy [i] == '\0') headerCopy [i] = '\001';
 		char *p = strstr (headerCopy, "T\001e\001x\001t\001F\001i\001l\001e");
-		if (p != NULL && p - headerCopy < nread - 15 && p - headerCopy < 80)
+		if (p && p - headerCopy < nread - 15 && p - headerCopy < 80)
 			return Data_readFromTextFile (file);
 	}
 
@@ -304,7 +303,7 @@ Any Data_readFromFile (MelderFile file) {
 
 	if (nread > 13) {
 		char *p = strstr (header, "BinaryFile");
-		if (p != NULL && p - header < nread - 10 && p - header < 40)
+		if (p && p - header < nread - 10 && p - header < 40)
 			return Data_readFromBinaryFile (file);
 	}
 
@@ -312,19 +311,19 @@ Any Data_readFromFile (MelderFile file) {
 
 	MelderFile_getParentDir (file, & Data_directoryBeingRead);
 	for (i = 1; i <= numFileTypeRecognizers; i ++) {
-		Data object = (Data) fileTypeRecognizers [i] (nread, header, file);
-		if (object == (Data) 1) return NULL;
+		Daata object = (Daata) fileTypeRecognizers [i] (nread, header, file);
+		if (object == (Daata) 1) return nullptr;
 		if (object) return object;
 	}
 
 	/***** 4. Is this a common text file? *****/
 
 	for (i = 0; i < nread; i ++)
-		if (header [i] < 32 || header [i] > 126)   /* Not ASCII? */
+		if (header [i] < 32 || header [i] > 126)   // not ASCII?
 			break;
 	if (i >= nread) return Data_readFromTextFile (file);
 
-	Melder_throw ("File ", file, " not recognized.");
+	Melder_throw (U"File ", file, U" not recognized.");
 }
 
 /* Recursive routines for working with struct members. */
@@ -334,40 +333,40 @@ int Data_Description_countMembers (Data_Description structDescription) {
 	for (Data_Description desc = structDescription; desc -> name; desc ++)
 		count ++;
 	if (structDescription [0]. type == inheritwa) {
-		Data_Description parentDescription = ((Data) _Thing_dummyObject ((ClassInfo) structDescription [0]. tagType)) -> v_description ();
+		Data_Description parentDescription = ((Daata) _Thing_dummyObject ((ClassInfo) structDescription [0]. tagType)) -> v_description ();
 		if (parentDescription)
 			return count + Data_Description_countMembers (parentDescription);
 	}
 	return count;
 }
 
-Data_Description Data_Description_findMatch (Data_Description structDescription, const wchar_t *name) {
+Data_Description Data_Description_findMatch (Data_Description structDescription, const char32 *name) {
 	for (Data_Description desc = structDescription; desc -> name; desc ++)
-		if (wcsequ (name, desc -> name)) return desc;
+		if (str32equ (name, desc -> name)) return desc;
 	if (structDescription [0]. type == inheritwa) {
-		Data_Description parentDescription = ((Data) _Thing_dummyObject ((ClassInfo) structDescription [0]. tagType)) -> v_description ();
+		Data_Description parentDescription = ((Daata) _Thing_dummyObject ((ClassInfo) structDescription [0]. tagType)) -> v_description ();
 		if (parentDescription)
 			return Data_Description_findMatch (parentDescription, name);
 	}
-	return NULL;   /* Not found. */
+	return nullptr;   // not found
 }
 
-Data_Description Data_Description_findNumberUse (Data_Description structDescription, const wchar_t *string) {
+Data_Description Data_Description_findNumberUse (Data_Description structDescription, const char32 *string) {
 	for (Data_Description desc = structDescription; desc -> name; desc ++) {
-		if (desc -> max1 && wcsequ (desc -> max1, string)) return desc;
-		if (desc -> max2 && wcsequ (desc -> max2, string)) return desc;
+		if (desc -> max1 && str32equ (desc -> max1, string)) return desc;
+		if (desc -> max2 && str32equ (desc -> max2, string)) return desc;
 	}
 	if (structDescription [0]. type == inheritwa) {
-		Data_Description parentDescription = ((Data) _Thing_dummyObject ((ClassInfo) structDescription [0]. tagType)) -> v_description ();
+		Data_Description parentDescription = ((Daata) _Thing_dummyObject ((ClassInfo) structDescription [0]. tagType)) -> v_description ();
 		if (parentDescription)
 			return Data_Description_findNumberUse (parentDescription, string);
 	}
-	return NULL;
+	return nullptr;
 }
 
 /* Retrieving data from object + description. */
 
-long Data_Description_integer (void *address, Data_Description description) {
+int64 Data_Description_integer (void *address, Data_Description description) {
 	switch (description -> type) {
 		case bytewa:       return * (signed char *)    ((char *) address + description -> offset);
 		case intwa:        return * (int *)            ((char *) address + description -> offset);
@@ -383,20 +382,20 @@ long Data_Description_integer (void *address, Data_Description description) {
 }
 
 int Data_Description_evaluateInteger (void *structAddress, Data_Description structDescription,
-	const wchar_t *formula, long *result)
+	const char32 *formula, long *result)
 {
-	if (formula == NULL) {   // this was a VECTOR_FROM array
+	if (! formula) {   // this was a VECTOR_FROM array
 		*result = 1;
 		return 1;
 	}
-	if (formula [0] >= 'a' && formula [0] <= 'z') {
-		wchar_t buffer [100], *minus1, *psize;
+	if (formula [0] >= U'a' && formula [0] <= U'z') {
+		char32 buffer [100], *minus1, *psize;
 		Data_Description sizeDescription;
-		wcscpy (buffer, formula);
-		if ((minus1 = wcsstr (buffer, L" - 1")) != NULL)
-			*minus1 = '\0';   // strip trailing " - 1", but remember
-		if ((psize = wcsstr (buffer, L" -> size")) != NULL)
-			*psize = '\0';   // strip trailing " -> size"
+		str32cpy (buffer, formula);
+		if ((minus1 = str32str (buffer, U" - 1")) != nullptr)
+			*minus1 = U'\0';   // strip trailing " - 1", but remember
+		if ((psize = str32str (buffer, U" -> size")) != nullptr)
+			*psize = U'\0';   // strip trailing " -> size"
 		if (! (sizeDescription = Data_Description_findMatch (structDescription, buffer))) {
 			*result = 0;
 			return 0 /*Melder_error ("Cannot find member \"%ls\".", buffer)*/;
@@ -404,7 +403,7 @@ int Data_Description_evaluateInteger (void *structAddress, Data_Description stru
 		*result = Data_Description_integer (structAddress, sizeDescription);
 		if (minus1) *result -= 1;
 	} else {
-		*result = wcstol (formula, NULL, 10);
+		*result = Melder_atoi (formula);
 	}
 	return 1;
 }
diff --git a/sys/Data.h b/sys/Data.h
index 11396b7..0257c8a 100644
--- a/sys/Data.h
+++ b/sys/Data.h
@@ -2,7 +2,7 @@
 #define _Data_h_
 /* Data.h
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,70 +24,73 @@
 #include "Thing.h"
 
 typedef struct structData_Description {
-	const wchar_t *name;   /* The name of this field. */
-	int type;   /* bytewa..inheritwa, see below */
-	int offset;   /* The offset of this field in the enveloping struct. */
-	int size;   /* The size of this field if it is in an array. */
-	const wchar_t *tagName;   /* For structs: tag; for classes: class name; for enums: type name. */
-	void *tagType;   /* For structs: offset table; for classes: class pointer; for enums: enum pointer. */
-	int rank;   /* 0 = single, 1 = vector, 2 = matrix, 3 = set, -1 = array. */
-	const wchar_t *min1, *max1;   /* For vectors and matrices. */
-	const wchar_t *min2, *max2;   /* For matrices. */
+	const char32 *name;   // the name of this field
+	int type;   // bytewa..inheritwa, see below
+	int offset;   // the offset of this field in the enveloping struct
+	int size;   // the size of this field if it is in an array
+	const char32 *tagName;   // for structs: tag; for classes: class name; for enums: type name
+	void *tagType;   // for structs: offset table; for classes: class pointer; for enums: enum pointer
+	int rank;   // 0 = single, 1 = vector, 2 = matrix, 3 = set, -1 = array
+	const char32 *min1, *max1;   // for vectors and matrices
+	const char32 *min2, *max2;   // for matrices
 } *Data_Description;
 
-Thing_define (Data, Thing) {
-	// new methods:
-	public:
-		virtual void v_copy (Any data_to);
-		virtual bool v_equal (Any otherData);
-		virtual Data_Description v_description () { return NULL; }
-		virtual bool v_writable () { return true; }
-		virtual bool v_canWriteAsEncoding (int outputEncoding);
-		virtual void v_writeText (MelderFile openFile);
-		virtual void v_readText (MelderReadText text);
-		virtual void v_writeBinary (FILE *f);
-		virtual void v_readBinary (FILE *f);
-		virtual void v_repair () { }   // after reading Praat data files created by others
-		// messages for scripting:
-		virtual bool v_hasGetNrow      () { return false; }   virtual double        v_getNrow      ()                      { return NUMundefined; }
-		virtual bool v_hasGetNcol      () { return false; }   virtual double        v_getNcol      ()                      { return NUMundefined; }
-		virtual bool v_hasGetXmin      () { return false; }   virtual double        v_getXmin      ()                      { return NUMundefined; }
-		virtual bool v_hasGetXmax      () { return false; }   virtual double        v_getXmax      ()                      { return NUMundefined; }
-		virtual bool v_hasGetYmin      () { return false; }   virtual double        v_getYmin      ()                      { return NUMundefined; }
-		virtual bool v_hasGetYmax      () { return false; }   virtual double        v_getYmax      ()                      { return NUMundefined; }
-		virtual bool v_hasGetNx        () { return false; }   virtual double        v_getNx        ()                      { return NUMundefined; }
-		virtual bool v_hasGetNy        () { return false; }   virtual double        v_getNy        ()                      { return NUMundefined; }
-		virtual bool v_hasGetDx        () { return false; }   virtual double        v_getDx        ()                      { return NUMundefined; }
-		virtual bool v_hasGetDy        () { return false; }   virtual double        v_getDy        ()                      { return NUMundefined; }
-		virtual bool v_hasGetX         () { return false; }   virtual double        v_getX         (long ix)               { return NUMundefined; (void) ix;   }
-		virtual bool v_hasGetY         () { return false; }   virtual double        v_getY         (long iy)               { return NUMundefined; (void) iy;   }
-		virtual bool v_hasGetRowStr    () { return false; }   virtual const wchar_t * v_getRowStr    (long irow)             { return NULL;         (void) irow; }
-		virtual bool v_hasGetColStr    () { return false; }   virtual const wchar_t * v_getColStr    (long icol)             { return NULL;         (void) icol; }
-		virtual bool v_hasGetCell      () { return false; }   virtual double        v_getCell      ()                      { return NUMundefined; }
-		virtual bool v_hasGetCellStr   () { return false; }   virtual const wchar_t * v_getCellStr   ()                      { return NULL; }
-		virtual bool v_hasGetVector    () { return false; }   virtual double        v_getVector    (long irow, long icol)  { return NUMundefined; (void) irow; (void) icol; }
-		virtual bool v_hasGetVectorStr () { return false; }   virtual const wchar_t * v_getVectorStr (long icol)             { return NULL;         (void) icol; }
-		virtual bool v_hasGetMatrix    () { return false; }   virtual double        v_getMatrix    (long irow, long icol)  { return NUMundefined; (void) irow; (void) icol; }
-		virtual bool v_hasGetMatrixStr () { return false; }   virtual const wchar_t * v_getMatrixStr (long irow, long icol)  { return NULL;         (void) irow; (void) icol; }
-		virtual bool v_hasGetFunction0 () { return false; }   virtual double        v_getFunction0 ()                      { return NUMundefined; }
-		virtual bool v_hasGetFunction1 () { return false; }   virtual double        v_getFunction1 (long irow, double x)   { return NUMundefined; (void) irow; (void) x; }
-		virtual bool v_hasGetFunction2 () { return false; }   virtual double        v_getFunction2 (double x, double y)    { return NUMundefined; (void) x; (void) y; }
-		virtual bool v_hasGetRowIndex  () { return false; }   virtual double        v_getRowIndex  (const wchar_t *rowLabel) { return NUMundefined; (void) rowLabel; }
-		virtual bool v_hasGetColIndex  () { return false; }   virtual double        v_getColIndex  (const wchar_t *colLabel) { return NUMundefined; (void) colLabel; }
+/*
+ * We call the class Daata instead of Data,
+ * because of a conflict with the use of "Data" in assembler strings in intrin-impl.h on Windows.
+ */
+
+Thing_define (Daata, Thing) {
+	virtual void v_copy (Any data_to);
+	virtual bool v_equal (Any otherData);
+	virtual Data_Description v_description () { return nullptr; }
+	virtual bool v_writable () { return true; }
+	virtual bool v_canWriteAsEncoding (int outputEncoding);
+	virtual void v_writeText (MelderFile openFile);
+	virtual void v_readText (MelderReadText text, int formatVersion);
+	virtual void v_writeBinary (FILE *f);
+	virtual void v_readBinary (FILE *f, int formatVersion);
+	virtual void v_repair () { }   // after reading Praat data files created by others
+	// methods for scripting:
+	virtual bool v_hasGetNrow      () { return false; }   virtual double        v_getNrow      ()                      { return NUMundefined; }
+	virtual bool v_hasGetNcol      () { return false; }   virtual double        v_getNcol      ()                      { return NUMundefined; }
+	virtual bool v_hasGetXmin      () { return false; }   virtual double        v_getXmin      ()                      { return NUMundefined; }
+	virtual bool v_hasGetXmax      () { return false; }   virtual double        v_getXmax      ()                      { return NUMundefined; }
+	virtual bool v_hasGetYmin      () { return false; }   virtual double        v_getYmin      ()                      { return NUMundefined; }
+	virtual bool v_hasGetYmax      () { return false; }   virtual double        v_getYmax      ()                      { return NUMundefined; }
+	virtual bool v_hasGetNx        () { return false; }   virtual double        v_getNx        ()                      { return NUMundefined; }
+	virtual bool v_hasGetNy        () { return false; }   virtual double        v_getNy        ()                      { return NUMundefined; }
+	virtual bool v_hasGetDx        () { return false; }   virtual double        v_getDx        ()                      { return NUMundefined; }
+	virtual bool v_hasGetDy        () { return false; }   virtual double        v_getDy        ()                      { return NUMundefined; }
+	virtual bool v_hasGetX         () { return false; }   virtual double        v_getX         (long ix)               { return NUMundefined; (void) ix;   }
+	virtual bool v_hasGetY         () { return false; }   virtual double        v_getY         (long iy)               { return NUMundefined; (void) iy;   }
+	virtual bool v_hasGetRowStr    () { return false; }   virtual const char32 *v_getRowStr    (long irow)             { return nullptr;      (void) irow; }
+	virtual bool v_hasGetColStr    () { return false; }   virtual const char32 *v_getColStr    (long icol)             { return nullptr;      (void) icol; }
+	virtual bool v_hasGetCell      () { return false; }   virtual double        v_getCell      ()                      { return NUMundefined; }
+	virtual bool v_hasGetCellStr   () { return false; }   virtual const char32 *v_getCellStr   ()                      { return nullptr; }
+	virtual bool v_hasGetVector    () { return false; }   virtual double        v_getVector    (long irow, long icol)  { return NUMundefined; (void) irow; (void) icol; }
+	virtual bool v_hasGetVectorStr () { return false; }   virtual const char32 *v_getVectorStr (long icol)             { return nullptr;      (void) icol; }
+	virtual bool v_hasGetMatrix    () { return false; }   virtual double        v_getMatrix    (long irow, long icol)  { return NUMundefined; (void) irow; (void) icol; }
+	virtual bool v_hasGetMatrixStr () { return false; }   virtual const char32 *v_getMatrixStr (long irow, long icol)  { return nullptr;      (void) irow; (void) icol; }
+	virtual bool v_hasGetFunction0 () { return false; }   virtual double        v_getFunction0 ()                      { return NUMundefined; }
+	virtual bool v_hasGetFunction1 () { return false; }   virtual double        v_getFunction1 (long irow, double x)   { return NUMundefined; (void) irow; (void) x; }
+	virtual bool v_hasGetFunction2 () { return false; }   virtual double        v_getFunction2 (double x, double y)    { return NUMundefined; (void) x; (void) y; }
+	virtual bool v_hasGetRowIndex  () { return false; }   virtual double        v_getRowIndex  (const char32 *rowLabel){ return NUMundefined; (void) rowLabel; }
+	virtual bool v_hasGetColIndex  () { return false; }   virtual double        v_getColIndex  (const char32 *colLabel){ return NUMundefined; (void) colLabel; }
 };
 
 template <class T> T* Data_copy (T* data) {
 	return static_cast <T*> (_Data_copy (data));
 }
-Any _Data_copy (Data me);
+Daata _Data_copy (Daata me);
 /*
 	Message:
 		"return a deep copy of yourself."
 	Postconditions:
-		result -> name == NULL;	  // the only attribute NOT copied
+		result -> name == nullptr;	  // the only attribute NOT copied
 */
 
-bool Data_equal (Data data1, Data data2);
+bool Data_equal (Daata data1, Daata data2);
 /*
 	Message:
 		"return 1 if the shallow or deep attributes of 'data1' and 'data2' are equal;
@@ -98,14 +101,14 @@ bool Data_equal (Data data1, Data data2);
 
 typedef int (*Data_CompareFunction) (Any data1, Any data2);
 
-bool Data_canWriteAsEncoding (Data me, int outputEncoding);
+bool Data_canWriteAsEncoding (Daata me, int outputEncoding);
 /*
 	Message:
 		"Can you write yourself in that encoding?"
 	The answer depends on whether all members can be written in that encoding.
 */
 
-bool Data_canWriteText (Data me);
+bool Data_canWriteText (Daata me);
 /*
 	Message:
 		"Can you write yourself as text?"
@@ -113,12 +116,12 @@ bool Data_canWriteText (Data me);
 */
 
 MelderFile Data_createTextFile (
-	Data me,
+	Daata me,
 	MelderFile file,
 	bool verbose
 );   // returns the input MelderFile in order to be caught by an autoMelderFile
 
-void Data_writeText (Data me, MelderFile openFile);
+void Data_writeText (Daata me, MelderFile openFile);
 /*
 	Message:
 		"try to write yourself as text to an open file."
@@ -131,7 +134,7 @@ void Data_writeText (Data me, MelderFile openFile);
 		The format depends on the 'writeText' method defined by the subclass.
 */
 
-void Data_writeToTextFile (Data me, MelderFile file);
+void Data_writeToTextFile (Daata me, MelderFile file);
 /*
 	Message:
 		"try to write yourself as text to a file".
@@ -142,7 +145,7 @@ void Data_writeToTextFile (Data me, MelderFile file);
 		The format of the lines after the second line is the same as in Data_writeText.
 */
 
-void Data_writeToShortTextFile (Data me, MelderFile file);
+void Data_writeToShortTextFile (Daata me, MelderFile file);
 /*
 	Message:
 		"try to write yourself as text to a file".
@@ -153,14 +156,14 @@ void Data_writeToShortTextFile (Data me, MelderFile file);
 		The format of the lines after the second line is the same as in Data_writeText.
 */
 
-bool Data_canWriteBinary (Data me);
+bool Data_canWriteBinary (Daata me);
 /*
 	Message:
 		"Can you write yourself as binary data?"
 	The answer depends on whether the subclass defines the 'writeBinary' method.
 */
 
-void Data_writeBinary (Data me, FILE *f);
+void Data_writeBinary (Daata me, FILE *f);
 /*
 	Message:
 		"try to write yourself as binary data to an open file."
@@ -173,7 +176,7 @@ void Data_writeBinary (Data me, FILE *f);
 		and IEEE floating-point format.
 */
 
-void Data_writeToBinaryFile (Data me, MelderFile file);
+void Data_writeToBinaryFile (Daata me, MelderFile file);
 /*
 	Message:
 		"try to write yourself as binary data to a file".
@@ -183,42 +186,7 @@ void Data_writeToBinaryFile (Data me, MelderFile file);
 		The format of the file after this is the same as in Data_writeBinary.
 */
 
-bool Data_canWriteLisp (Data me);
-/*
-	Message:
-		"Can you write yourself as a sequece of LISP objects?"
-	The answer depends on whether the subclass defines a 'writeLisp' method.
-*/
-
-void Data_writeLisp (Data me, FILE *f);
-/*
-	Message:
-		"try to write yourself as a sequence of LISP objects to the stream <f>."
-	Failures:
-		I/O error.
-		Disk full.
-	Description:
-		The format depends on the 'writeLisp' method defined by the subclass.
-*/
-
-void Data_writeLispToConsole (Data me);
-/*
-	Message:
-		"try to write yourself as a sequence of LISP objects to the standard output."
-	Return value:
-		1 if OK, 0 in case of failure.
-	Description:
-		The format is the same as in Data_writeLisp.
-		The standard output will most often be a window named "Console".
-*/
-
-/*
-	The routines Data_readXXX assume that a class can be read from its name (a string).
-	You should have called Thing_recognizeClassesByName () for all the classes
-	that you want to read by name. This call is best placed in the beginning of main ().
-*/
-
-bool Data_canReadText (Data me);
+bool Data_canReadText (Daata me);
 /*
 	Message:
 		"Can you read yourself as text?"
@@ -226,7 +194,7 @@ bool Data_canReadText (Data me);
 	but is preferably the same as the answer from Data_canWriteText.
 */
 
-void Data_readText (Data me, MelderReadText text);
+void Data_readText (Daata me, MelderReadText text, int formatVersion);
 /*
 	Message:
 		"try to read yourself as text from a string."
@@ -239,7 +207,7 @@ void Data_readText (Data me, MelderReadText text);
 		but is preferably the same as the format produced by the 'writeText' method.
 */
 
-Any Data_readFromTextFile (MelderFile file);
+Daata Data_readFromTextFile (MelderFile file);
 /*
 	Message:
 		"try to read a Data as text from a file".
@@ -255,7 +223,7 @@ Any Data_readFromTextFile (MelderFile file);
 		(plus those from Data_readText)
 */
 
-bool Data_canReadBinary (Data me);
+bool Data_canReadBinary (Daata me);
 /*
 	Message:
 		"Can you read yourself as binary data?"
@@ -263,7 +231,7 @@ bool Data_canReadBinary (Data me);
 	but is preferably the same as the answer from Data_canWriteBinary.
 */
 
-void Data_readBinary (Data me, FILE *f);
+void Data_readBinary (Daata me, FILE *f, int formatVersion);
 /*
 	Message:
 		"try to read yourself as binary data from the stream <f>."
@@ -276,7 +244,7 @@ void Data_readBinary (Data me, FILE *f);
 		but is preferably the same as the format produced by the 'writeBinary' method.
 */
 
-Any Data_readFromBinaryFile (MelderFile file);
+Daata Data_readFromBinaryFile (MelderFile file);
 /*
 	Message:
 		"try to read a Data as binary data from a file".
@@ -292,7 +260,7 @@ Any Data_readFromBinaryFile (MelderFile file);
 		(plus those from Data_readBinary)
 */
 
-void Data_recognizeFileType (Any (*recognizer) (int nread, const char *header, MelderFile fs));
+void Data_recognizeFileType (Any (*recognizer) (int nread, const char *header, MelderFile file));
 /*
 Purpose:
 	to make sure that a file can be read by Data_readFromFile.
@@ -322,11 +290,11 @@ Defining a file-type recognizer:
 		if (nread >= 24 && strnequ (& header [0], ".snd", 4))
 			return Sound_readFromSunAudioFile (fileName);
 		else
-			return NULL;
+			return nullptr;
 	}
 	From this example, we see that if the file is recognized, it should be read immediately,
 	and the resulting object (always a descendant of class Data) should be returned.
-	We also see that the return value NULL is used for notifying Data_readFromFile
+	We also see that the return value nullptr is used for notifying Data_readFromFile
 	of the fact that the file is not a Sun audio file.
 Registering a file-type recognizer:
 	You would put a statement like the following in the initialization section of your program:
@@ -334,20 +302,20 @@ Registering a file-type recognizer:
 	After this, Data_readFromFile is able to read Sun audio files.
 */
 
-Any Data_readFromFile (MelderFile file);
+Daata Data_readFromFile (MelderFile file);
 /*
 Purpose:
 	to read a file with data of any kind.
 Return value:
-	the object read from the file fs,
-	or NULL if the file was not recognized (an error message is queued in that case).
+	the object read from `file`.
+Failure:
+	the file was not recognized.
 Behaviour:
 	Data_readFromFile first checks whether the file is a text file
 	that is readable by Data_readFromTextFile, or a binary file
 	written by Data_writeToBinaryFile, or a file as written by Data_writeToLispFile.
 	If one of these succeeds, the file is read and the resulting object is returned.
 	If not, the recognizers installed with Data_recognizeFileType are tried.
-	If this also fails, Data_readFromFile returns NULL.
 */
 
 extern structMelderDir Data_directoryBeingRead;
@@ -375,28 +343,29 @@ extern structMelderDir Data_directoryBeingRead;
 #define structwa  18
 #define widgetwa  19
 #define objectwa  20
-#define collectionwa  21
-#define inheritwa  22
+#define autoobjectwa  21
+#define collectionwa  22
+#define inheritwa  23
 
 /* Recursive routines for working with struct members. */
 
 int Data_Description_countMembers (Data_Description structDescription);
 /* Including inherited members. */
 
-Data_Description Data_Description_findMatch (Data_Description structDescription, const wchar_t *member);
+Data_Description Data_Description_findMatch (Data_Description structDescription, const char32 *member);
 /* Find the location of member 'member' in a struct. */
 /* If 'structDescription' describes a class, the ancestor classes are also searched. */
 
-Data_Description Data_Description_findNumberUse (Data_Description structDescription, const wchar_t *string);
+Data_Description Data_Description_findNumberUse (Data_Description structDescription, const char32 *string);
 /* Find the first member that uses member 'string' in its size description (max1 or max2 fields). */
 
 /* Retrieving data from object + description. */
 
-long Data_Description_integer (void *structAddress, Data_Description description);
+int64 Data_Description_integer (void *structAddress, Data_Description description);
 /* Convert data found at a certain offset from 'address' to an integer, according to the given 'description'. */
 
 int Data_Description_evaluateInteger (void *structAddress, Data_Description structDescription,
-	const wchar_t *formula, long *result);
+	const char32 *formula, long *result);
 /*
  * Translates a string like '100' or 'numberOfHorses' or 'numberOfCows - 1' to an integer.
  * The 'algorithm' does some wild guesses as to the meanings of the 'min1' and 'max1' strings.
diff --git a/sys/DataEditor.cpp b/sys/DataEditor.cpp
index 8d4e23c..dde89dd 100644
--- a/sys/DataEditor.cpp
+++ b/sys/DataEditor.cpp
@@ -1,6 +1,6 @@
 /* DataEditor.cpp
  *
- * Copyright (C) 1995-2012 Paul Boersma
+ * Copyright (C) 1995-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@
 #include "machine.h"
 
 static Data_Description Class_getDescription (ClassInfo table) {
-	return ((Data) _Thing_dummyObject (table)) -> v_description ();
+	return ((Daata) _Thing_dummyObject (table)) -> v_description ();
 }
 
 /*static const char * typeStrings [] = { "none",
@@ -46,18 +46,18 @@ static int stringLengths [] = { 0,
 	15, 27, 35, 59,
 	33, 33, 8, 6, 60, 60 };
 
-static VectorEditor VectorEditor_create (DataEditor root, const wchar_t *title, void *address,
+static VectorEditor VectorEditor_create (DataEditor root, const char32 *title, void *address,
 	Data_Description description, long minimum, long maximum);
 
-static MatrixEditor MatrixEditor_create (DataEditor root, const wchar_t *title, void *address,
+static MatrixEditor MatrixEditor_create (DataEditor root, const char32 *title, void *address,
 	Data_Description description, long min1, long max1, long min2, long max2);
 
-static StructEditor StructEditor_create (DataEditor root, const wchar_t *title, void *address, Data_Description description);
+static StructEditor StructEditor_create (DataEditor root, const char32 *title, void *address, Data_Description description);
 
-static ClassEditor ClassEditor_create (DataEditor root, const wchar_t *title, void *address, Data_Description description);
+static ClassEditor ClassEditor_create (DataEditor root, const char32 *title, void *address, Data_Description description);
 
-static inline const wchar_t * strip_d (const wchar_t *s) {
-	return s && s [0] == 'd' && s [1] == '_' ? & s [2] : & s [0];
+static inline const char32 * strip_d (const char32 *s) {
+	return s && s [0] == U'd' && s [1] == U'_' ? & s [2] : & s [0];
 }
 
 /********** DataSubEditor **********/
@@ -79,32 +79,32 @@ static void update (DataSubEditor me) {
 	/* Hide all the existing widgets. */
 
 	for (int i = 1; i <= kDataSubEditor_MAXNUM_ROWS; i ++) {
-		my d_fieldData [i]. address = NULL;
-		my d_fieldData [i]. description = NULL;
-		my d_fieldData [i]. label  -> f_hide ();
-		my d_fieldData [i]. button -> f_hide ();
-		my d_fieldData [i]. text   -> f_hide ();
+		my d_fieldData [i]. address = nullptr;
+		my d_fieldData [i]. description = nullptr;
+		GuiThing_hide (my d_fieldData [i]. label);
+		GuiThing_hide (my d_fieldData [i]. button);
+		GuiThing_hide (my d_fieldData [i]. text);
 	}
 
 	my d_irow = 0;
 	my v_showMembers ();
 }
 
-static Data_Description DataSubEditor_findNumberUse (DataSubEditor me, const wchar_t *number) {
+static Data_Description DataSubEditor_findNumberUse (DataSubEditor me, const char32 *number) {
 	Data_Description structDescription, result;
-	wchar_t string [100];
-	if (my classInfo == classMatrixEditor) return NULL;   // no structs inside
+	char32 string [100];
+	if (my classInfo == classMatrixEditor) return nullptr;   // no structs inside
 	if (my classInfo == classVectorEditor) {
-		if (my d_description -> type != structwa) return NULL;   // no structs inside
+		if (my d_description -> type != structwa) return nullptr;   // no structs inside
 		structDescription = * (Data_Description *) my d_description -> tagType;
 	} else { /* StructEditor or ClassEditor or DataEditor. */
 		structDescription = my d_description;
 	}
-	swprintf (string, 100, L"%ls", number);
-	if ((result = Data_Description_findNumberUse (structDescription, string)) != NULL) return result;
-	swprintf (string, 100, L"%ls - 1", number);
-	if ((result = Data_Description_findNumberUse (structDescription, string)) != NULL) return result;
-	return NULL;
+	Melder_sprint (string,100, number);
+	if ((result = Data_Description_findNumberUse (structDescription, string)) != nullptr) return result;
+	Melder_sprint (string,100, number, U" - 1");
+	if ((result = Data_Description_findNumberUse (structDescription, string)) != nullptr) return result;
+	return nullptr;
 }
 
 static void gui_button_cb_change (I, GuiButtonEvent event) {
@@ -116,7 +116,7 @@ static void gui_button_cb_change (I, GuiButtonEvent event) {
 			bool visible = XtIsManaged (my d_fieldData [irow]. text -> d_widget);
 		#elif gtk
 			gboolean visible;
-			g_object_get (G_OBJECT (my d_fieldData [irow]. text), "visible", & visible, NULL);
+			g_object_get (G_OBJECT (my d_fieldData [irow]. text), "visible", & visible, nullptr);
 		#elif defined (macintosh) && ! useCarbon
 			bool visible = ! [(GuiCocoaTextField *) my d_fieldData [irow]. text -> d_widget   isHidden];
 		#else
@@ -124,88 +124,85 @@ static void gui_button_cb_change (I, GuiButtonEvent event) {
 		#endif
 		if (visible) {
 			int type = my d_fieldData [irow]. description -> type;
-			wchar_t *text;
+			char32 *text;
 			if (type > maxsingletypewa) continue;
-			text = my d_fieldData [irow]. text -> f_getString ();
+			text = GuiText_getString (my d_fieldData [irow]. text);
 			switch (type) {
 				case bytewa: {
-					signed char oldValue = * (signed char *) my d_fieldData [irow]. address, newValue = wcstol (text, NULL, 10);
+					signed char oldValue = * (signed char *) my d_fieldData [irow]. address, newValue = (signed char) Melder_atoi (text);
 					if (newValue != oldValue) {
 						Data_Description numberUse = DataSubEditor_findNumberUse (me, my d_fieldData [irow]. description -> name);
 						if (numberUse) {
-							Melder_error_ ("Changing field \"", strip_d (my d_fieldData [irow]. description -> name),
-								"\" would damage the array \"", strip_d (numberUse -> name), "\".");
-							Melder_flushError (NULL);
+							Melder_flushError (U"Changing field \"", strip_d (my d_fieldData [irow]. description -> name),
+								U"\" would damage the array \"", strip_d (numberUse -> name), U"\".");
 						} else {
 							* (signed char *) my d_fieldData [irow]. address = newValue;
 						}
 					}
 				} break;
 				case intwa: {
-					int oldValue = * (int *) my d_fieldData [irow]. address, newValue = wcstol (text, NULL, 10);
+					int oldValue = * (int *) my d_fieldData [irow]. address, newValue = Melder_atoi (text);
 					if (newValue != oldValue) {
 						Data_Description numberUse = DataSubEditor_findNumberUse (me, my d_fieldData [irow]. description -> name);
 						if (numberUse) {
-							Melder_error_ ("Changing field \"", strip_d (my d_fieldData [irow]. description -> name),
-								"\" would damage the array \"", strip_d (numberUse -> name), "\".");
-							Melder_flushError (NULL);
+							Melder_flushError (U"Changing field \"", strip_d (my d_fieldData [irow]. description -> name),
+								U"\" would damage the array \"", strip_d (numberUse -> name), U"\".");
 						} else {
 							* (int *) my d_fieldData [irow]. address = newValue;
 						}
 					}
 				} break;
 				case longwa: {
-					long oldValue = * (long *) my d_fieldData [irow]. address, newValue = wcstol (text, NULL, 10);
+					long oldValue = * (long *) my d_fieldData [irow]. address, newValue = Melder_atoi (text);
 					if (newValue != oldValue) {
 						Data_Description numberUse = DataSubEditor_findNumberUse (me, my d_fieldData [irow]. description -> name);
 						if (numberUse) {
-							Melder_error_ ("Changing field \"", strip_d (my d_fieldData [irow]. description -> name),
-								"\" would damage the array \"", strip_d (numberUse -> name), "\".");
-							Melder_flushError (NULL);
+							Melder_flushError (U"Changing field \"", strip_d (my d_fieldData [irow]. description -> name),
+								U"\" would damage the array \"", strip_d (numberUse -> name), U"\".");
 						} else {
 							* (long *) my d_fieldData [irow]. address = newValue;
 						}
 					}
 				} break;
-				case ubytewa: { * (unsigned char *) my d_fieldData [irow]. address = wcstoul (text, NULL, 10); } break;
-				case uintwa: { * (unsigned int *) my d_fieldData [irow]. address = wcstoul (text, NULL, 10); } break;
-				case ulongwa: { * (unsigned long *) my d_fieldData [irow]. address = wcstoul (text, NULL, 10); } break;
-				case boolwa: { * (bool *) my d_fieldData [irow]. address = wcstol (text, NULL, 10); } break;
+				case ubytewa: { * (unsigned char *) my d_fieldData [irow]. address = (uint8) Melder_atoi (text); } break;
+				case uintwa: { * (unsigned int *) my d_fieldData [irow]. address = Melder_atoi (text); } break;
+				case ulongwa: { * (unsigned long *) my d_fieldData [irow]. address = (unsigned long) Melder_atoi (text); } break;
+				case boolwa: { * (bool *) my d_fieldData [irow]. address = Melder_atoi (text); } break;
 				case floatwa: { * (double *) my d_fieldData [irow]. address = Melder_atof (text); } break;
 				case doublewa: { * (double *) my d_fieldData [irow]. address = Melder_atof (text); } break;
 				case fcomplexwa: { fcomplex *x = (fcomplex *) my d_fieldData [irow]. address;
-					swscanf (text, L"%f + %f i", & x -> re, & x -> im); } break;
+					sscanf (Melder_peek32to8 (text), "%f + %f i", & x -> re, & x -> im); } break;
 				case dcomplexwa: { dcomplex *x = (dcomplex *) my d_fieldData [irow]. address;
-					swscanf (text, L"%lf + %lf i", & x -> re, & x -> im); } break;
+					sscanf (Melder_peek32to8 (text), "%lf + %lf i", & x -> re, & x -> im); } break;
 				case enumwa: {
-					if (wcslen (text) < 3) goto error;
-					text [wcslen (text) - 1] = '\0';   // remove trailing ">"
-					int value = ((int (*) (const wchar_t *)) (my d_fieldData [irow]. description -> tagType)) (text + 1);   // skip leading "<"
+					if (str32len (text) < 3) goto error;
+					text [str32len (text) - 1] = '\0';   // remove trailing ">"
+					int value = ((int (*) (const char32 *)) (my d_fieldData [irow]. description -> tagType)) (text + 1);   // skip leading "<"
 					if (value < 0) goto error;
-					* (signed char *) my d_fieldData [irow]. address = value;
+					* (signed char *) my d_fieldData [irow]. address = (signed char) value;
 				} break;
 				case lenumwa: {
-					if (wcslen (text) < 3) goto error;
-					text [wcslen (text) - 1] = '\0';   // remove trailing ">"
-					int value = ((int (*) (const wchar_t *)) (my d_fieldData [irow]. description -> tagType)) (text + 1);   // skip leading "<"
+					if (str32len (text) < 3) goto error;
+					text [str32len (text) - 1] = '\0';   // remove trailing ">"
+					int value = ((int (*) (const char32 *)) (my d_fieldData [irow]. description -> tagType)) (text + 1);   // skip leading "<"
 					if (value < 0) goto error;
-					* (signed short *) my d_fieldData [irow]. address = value;
+					* (signed short *) my d_fieldData [irow]. address = (signed short) value;
 				} break;
 				case booleanwa: {
-					int value = wcsnequ (text, L"<true>", 6) ? 1 : wcsnequ (text, L"<false>", 7) ? 0 : -1;
+					int value = str32nequ (text, U"<true>", 6) ? 1 : str32nequ (text, U"<false>", 7) ? 0 : -1;
 					if (value < 0) goto error;
-					* (signed char *) my d_fieldData [irow]. address = value;
+					* (signed char *) my d_fieldData [irow]. address = (signed char) value;
 				} break;
 				case questionwa: {
-					int value = wcsnequ (text, L"<yes>", 5) ? 1 : wcsnequ (text, L"<no>", 4) ? 0 : -1;
+					int value = str32nequ (text, U"<yes>", 5) ? 1 : str32nequ (text, U"<no>", 4) ? 0 : -1;
 					if (value < 0) goto error;
-					* (signed char *) my d_fieldData [irow]. address = value;
+					* (signed char *) my d_fieldData [irow]. address = (signed char) value;
 				} break;
 				case stringwa:
 				case lstringwa: {
-					wchar_t *old = * (wchar_t **) my d_fieldData [irow]. address;
+					char32 *old = * (char32 **) my d_fieldData [irow]. address;
 					Melder_free (old);
-					* (wchar_t **) my d_fieldData [irow]. address = Melder_wcsdup_f (text);
+					* (char32 **) my d_fieldData [irow]. address = Melder_dup_f (text);
 				} break;
 				default: break;
 			}
@@ -216,7 +213,7 @@ static void gui_button_cb_change (I, GuiButtonEvent event) {
 	 * 1. The owner (creator) of our root DataEditor: so that she can notify other editors, if any.
 	 * 2. All our sibling DataSubEditors.
 	 */
-	my d_root -> broadcastDataChanged ();
+	Editor_broadcastDataChanged (my d_root);
 	update (me);
 	for (int isub = 1; isub <= my d_root -> d_children -> size; isub ++) {
 		DataSubEditor subeditor = (DataSubEditor) my d_root -> d_children -> item [isub];
@@ -224,8 +221,7 @@ static void gui_button_cb_change (I, GuiButtonEvent event) {
 	}
 	return;
 error:
-	Melder_error_ ("Edit field \"", strip_d (my d_fieldData [irow]. description -> name), "\" or click \"Cancel\".");
-	Melder_flushError (NULL);
+	Melder_flushError (U"Edit field \"", strip_d (my d_fieldData [irow]. description -> name), U"\" or click \"Cancel\".");
 }
 
 static void gui_button_cb_cancel (I, GuiButtonEvent event) {
@@ -236,14 +232,14 @@ static void gui_button_cb_cancel (I, GuiButtonEvent event) {
 
 static void gui_cb_scroll (I, GuiScrollBarEvent event) {
 	iam (DataSubEditor);
-	my d_topField = event -> scrollBar -> f_getValue () + 1;
+	my d_topField = GuiScrollBar_getValue (event -> scrollBar) + 1;
 	update (me);
 }
 
 static void gui_button_cb_open (I, GuiButtonEvent event) {
 	iam (DataSubEditor);
 	int ifield = 0;
-	static MelderString name = { 0 };
+	static MelderString name { 0 };
 	MelderString_empty (& name);
 
 	/* Identify the pressed button; it must be one of those created in the list. */
@@ -256,37 +252,39 @@ static void gui_button_cb_open (I, GuiButtonEvent event) {
 
 	DataSubEditor_FieldData fieldData = & my d_fieldData [ifield];
 	if (! fieldData -> description) {
-		Melder_casual ("Not yet implemented.");
+		Melder_casual (U"Not yet implemented.");
 		return;   /* Not yet implemented. */
 	}
 
 	if (fieldData -> description -> rank == 1 || fieldData -> description -> rank == 3 || fieldData -> description -> rank < 0) {
-		MelderString_append (& name, fieldData -> history, L". ", strip_d (fieldData -> description -> name),
-			L" [", Melder_integer (fieldData -> minimum), L"..", Melder_integer (fieldData -> maximum), L"]");
+		MelderString_append (& name, fieldData -> history, U". ", strip_d (fieldData -> description -> name),
+			U" [", fieldData -> minimum, U"..", fieldData -> maximum, U"]");
 		VectorEditor_create (my d_root, name.string, fieldData -> address,
 			fieldData -> description, fieldData -> minimum, fieldData -> maximum);
 	} else if (fieldData -> description -> rank == 2) {
-		MelderString_append (& name, fieldData -> history, L". ", strip_d (fieldData -> description -> name),
-			L" [", Melder_integer (fieldData -> minimum), L"..", Melder_integer (fieldData -> maximum), L"]");
-		MelderString_append (& name, L" [", Melder_integer (fieldData -> min2), L"..", Melder_integer (fieldData -> max2), L"]");
+		MelderString_append (& name, fieldData -> history, U". ", strip_d (fieldData -> description -> name),
+			U" [", fieldData -> minimum, U"..", fieldData -> maximum, U"]");
+		MelderString_append (& name, U" [", fieldData -> min2, U"..", fieldData -> max2, U"]");
 		MatrixEditor_create (my d_root, name.string, fieldData -> address, fieldData -> description,
 			fieldData -> minimum, fieldData -> maximum, fieldData -> min2, fieldData -> max2);
 	} else if (fieldData -> description -> type == structwa) {
-		MelderString_append (& name, fieldData -> history, L". ", strip_d (fieldData -> description -> name));
+		MelderString_append (& name, fieldData -> history, U". ", strip_d (fieldData -> description -> name));
 		StructEditor_create (my d_root, name.string, fieldData -> address,
 			* (Data_Description *) fieldData -> description -> tagType);
-	} else if (fieldData -> description -> type == objectwa || fieldData -> description -> type == collectionwa) {
-		MelderString_append (& name, fieldData -> history, L". ", strip_d (fieldData -> description -> name));
+	} else if (fieldData -> description -> type == objectwa || fieldData -> description -> type == autoobjectwa || fieldData -> description -> type == collectionwa) {
+		MelderString_append (& name, fieldData -> history, U". ", strip_d (fieldData -> description -> name));
 		ClassEditor_create (my d_root, name.string, fieldData -> address,
 			Class_getDescription ((ClassInfo) fieldData -> description -> tagType));
 	} else /*if (fieldData -> description -> type == inheritwa)*/ {
 		ClassEditor_create (my d_root, fieldData -> history, fieldData -> address,
 			fieldData -> description);
 /*	} else {
-		Melder_casual ("Strange editor \"%s\" required (type %d, rank %d).",
-			strip_d (fieldData -> description -> name),
-			fieldData -> description -> type,
-			fieldData -> description -> rank);*/
+		Melder_casual (
+			U"Strange editor \"", strip_d (fieldData -> description -> name),
+			U"\" required (type ", fieldData -> description -> type,
+			U", rank ", fieldData -> description -> rank,
+			U")."
+		);*/
 	}
 }
 
@@ -294,10 +292,10 @@ void structDataSubEditor :: v_createChildren () {
 	int x = Gui_LEFT_DIALOG_SPACING, y = Gui_TOP_DIALOG_SPACING + Machine_getMenuBarHeight (), buttonWidth = 120;
 
 	GuiButton_createShown (d_windowForm, x, x + buttonWidth, y, y + Gui_PUSHBUTTON_HEIGHT,
-		L"Change", gui_button_cb_change, this, 0);
+		U"Change", gui_button_cb_change, this, 0);
 	x += buttonWidth + Gui_HORIZONTAL_DIALOG_SPACING;
 	GuiButton_createShown (d_windowForm, x, x + buttonWidth, y, y + Gui_PUSHBUTTON_HEIGHT,
-		L"Cancel", gui_button_cb_cancel, this, 0);
+		U"Cancel", gui_button_cb_cancel, this, 0);
 
 	y = LIST_Y + Machine_getMenuBarHeight ();
 	d_scrollBar = GuiScrollBar_createShown (d_windowForm,
@@ -307,23 +305,23 @@ void structDataSubEditor :: v_createChildren () {
 
 	y += 10;
 	for (int i = 1; i <= kDataSubEditor_MAXNUM_ROWS; i ++) {
-		d_fieldData [i]. label = GuiLabel_create (d_windowForm, 0, 200, y, y + Gui_TEXTFIELD_HEIGHT, L"label", 0);   // no fixed x value: sometimes indent
+		d_fieldData [i]. label = GuiLabel_create (d_windowForm, 0, 200, y, y + Gui_TEXTFIELD_HEIGHT, U"label", 0);   // no fixed x value: sometimes indent
 		d_fieldData [i]. button = GuiButton_create (d_windowForm, BUTTON_X, BUTTON_X + buttonWidth, y, y + Gui_TEXTFIELD_HEIGHT,
-			L"Open", gui_button_cb_open, this, 0);
+			U"Open", gui_button_cb_open, this, 0);
 		d_fieldData [i]. text = GuiText_create (d_windowForm, TEXT_X, -30, y, y + Gui_TEXTFIELD_HEIGHT, 0);
 		d_fieldData [i]. y = y;
 		y += ROW_HEIGHT;
 	}
 }
 
-static void menu_cb_help (EDITOR_ARGS) { EDITOR_IAM (DataSubEditor); Melder_help (L"Inspect"); }
+static void menu_cb_help (EDITOR_ARGS) { EDITOR_IAM (DataSubEditor); Melder_help (U"Inspect"); }
 
 void structDataSubEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	DataSubEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"DataEditor help", '?', menu_cb_help);
+	EditorMenu_addCommand (menu, U"DataEditor help", '?', menu_cb_help);
 }
 
-static void DataSubEditor_init (DataSubEditor me, DataEditor root, const wchar_t *title, void *address, Data_Description description) {
+static void DataSubEditor_init (DataSubEditor me, DataEditor root, const char32 *title, void *address, Data_Description description) {
 	my d_root = root;
 	if (me != root) {
 		Collection_addItem (root -> d_children, me);
@@ -332,7 +330,7 @@ static void DataSubEditor_init (DataSubEditor me, DataEditor root, const wchar_t
 	my d_description = description;
 	my d_topField = 1;
 	my d_numberOfFields = my v_countFields ();
-	Editor_init (me, 0, 0, EDITOR_WIDTH, EDITOR_HEIGHT, title, NULL);
+	Editor_init (me, 0, 0, EDITOR_WIDTH, EDITOR_HEIGHT, title, nullptr);
 	update (me);
 }
 
@@ -344,7 +342,7 @@ long structStructEditor :: v_countFields () {
 	return Data_Description_countMembers (d_description);
 }
 
-static const wchar_t * singleTypeToText (void *address, int type, void *tagType, MelderString *buffer) {
+static const char32 * singleTypeToText (void *address, int type, void *tagType, MelderString *buffer) {
 	switch (type) {
 		case bytewa:   MelderString_append (buffer, Melder_integer (* (signed char *)    address)); break;
 		case intwa:    MelderString_append (buffer, Melder_integer (* (int *)            address)); break;
@@ -356,20 +354,20 @@ static const wchar_t * singleTypeToText (void *address, int type, void *tagType,
 		case floatwa:  MelderString_append (buffer, Melder_single  (* (double *)         address)); break;
 		case doublewa: MelderString_append (buffer, Melder_double  (* (double *)         address)); break;
 		case fcomplexwa: { fcomplex value = * (fcomplex *) address;
-			MelderString_append (buffer, Melder_single (value. re), L" + ", Melder_single (value. im), L" i"); } break;
+			MelderString_append (buffer, Melder_single (value. re), U" + ", Melder_single (value. im), U" i"); } break;
 		case dcomplexwa: { dcomplex value = * (dcomplex *) address;
-			MelderString_append (buffer, Melder_double (value. re), L" + ", Melder_double (value. im), L" i"); } break;
-		case enumwa:  MelderString_append (buffer, L"<", ((const wchar_t * (*) (int)) tagType) (* (signed char *)  address), L">"); break;
-		case lenumwa: MelderString_append (buffer, L"<", ((const wchar_t * (*) (int)) tagType) (* (signed short *) address), L">"); break;
-		case booleanwa:  MelderString_append (buffer, * (signed char *) address ? L"<true>" : L"<false>"); break;
-		case questionwa: MelderString_append (buffer, * (signed char *) address ? L"<yes>"  : L"<no>"   ); break;
+			MelderString_append (buffer, Melder_double (value. re), U" + ", Melder_double (value. im), U" i"); } break;
+		case enumwa:  MelderString_append (buffer, U"<", ((const char32 * (*) (int)) tagType) (* (signed char *)  address), U">"); break;
+		case lenumwa: MelderString_append (buffer, U"<", ((const char32 * (*) (int)) tagType) (* (signed short *) address), U">"); break;
+		case booleanwa:  MelderString_append (buffer, * (signed char *) address ? U"<true>" : U"<false>"); break;
+		case questionwa: MelderString_append (buffer, * (signed char *) address ? U"<yes>"  : U"<no>"   ); break;
 		case stringwa:
 		case lstringwa: {
-			wchar_t *string = * (wchar_t **) address;
-			if (string == NULL) { MelderString_empty (buffer); return buffer -> string; }   // convert NULL string to empty string
+			char32 *string = * (char32 **) address;
+			if (! string) { MelderString_empty (buffer); return buffer -> string; }   // convert null string to empty string
 			return string;   // may be much longer than the usual size of 'buffer'
 		} break;
-		default: return L"(unknown)";
+		default: return U"(unknown)";
 	}
 	return buffer -> string;   // Mind the special return for strings above.
 }
@@ -379,50 +377,49 @@ static void showStructMember (
 	Data_Description structDescription,   /* The description of (the first member of) the struct. */
 	Data_Description memberDescription,   /* The description of the current member. */
 	DataSubEditor_FieldData fieldData,   /* The widgets in which to show the info about the current member. */
-	wchar_t *history)
+	char32 *history)
 {
 	int type = memberDescription -> type, rank = memberDescription -> rank, isSingleType = type <= maxsingletypewa && rank == 0;
 	unsigned char *memberAddress = (unsigned char *) structAddress + memberDescription -> offset;
-	static MelderString buffer = { 0 };
-	MelderString_empty (& buffer);
 	if (type == inheritwa) {
-		MelderString_append (& buffer, L"Class part \"", memberDescription -> name, L"\":");
+		GuiLabel_setText (fieldData -> label,
+			Melder_cat (U"Class part \"", memberDescription -> name, U"\":"));
 	} else {
-		MelderString_append (& buffer, L"   ", strip_d (memberDescription -> name),
-			rank == 0 ? L"" : rank == 1 || rank == 3 || rank < 0 ? L" [ ]" : L" [ ] [ ]");
+		GuiLabel_setText (fieldData -> label,
+			Melder_cat (U"   ", strip_d (memberDescription -> name),
+				( rank == 0 ? U"" : rank == 1 || rank == 3 || rank < 0 ? U" [ ]" : U" [ ] [ ]" )));
 	}
-	fieldData -> label -> f_setString (buffer.string);
-	//fieldData -> label -> f_move (type == inheritwa ? 0 : NAME_X, fieldData -> y);
-	fieldData -> label -> f_show ();
+	//GuiControl_move (fieldData -> label, type == inheritwa ? 0 : NAME_X, fieldData -> y);
+	GuiThing_show (fieldData -> label);
 
 	/* Show the value (for a single type) or a button (for a composite type). */
 	if (isSingleType) {
 		#if motif
-			XtVaSetValues (fieldData -> text -> d_widget, XmNcolumns, stringLengths [type], NULL);   // TODO: change to GuiObject_size
+			XtVaSetValues (fieldData -> text -> d_widget, XmNcolumns, stringLengths [type], nullptr);   // TODO: change to GuiObject_size
 		#endif
-		MelderString_empty (& buffer);
-		const wchar_t *text = singleTypeToText (memberAddress, type, memberDescription -> tagType, & buffer);
-		fieldData -> text -> f_setString (text);
-		fieldData -> text -> f_show ();
+		autoMelderString buffer;
+		const char32 *text = singleTypeToText (memberAddress, type, memberDescription -> tagType, & buffer);
+		GuiText_setString (fieldData -> text, text);
+		GuiThing_show (fieldData -> text);
 		fieldData -> address = memberAddress;
 		fieldData -> description = memberDescription;
 		fieldData -> rank = 0;
 	} else if (rank == 1) {
 		void *arrayAddress = * (void **) memberAddress;
 		long minimum, maximum;
-		if (arrayAddress == NULL) return;   /* No button for empty fields. */
+		if (! arrayAddress) return;   // no button for empty fields
 		Data_Description_evaluateInteger (structAddress, structDescription,
 			memberDescription -> min1, & minimum);
 		Data_Description_evaluateInteger (structAddress, structDescription,
 			memberDescription -> max1, & maximum);
-		if (maximum < minimum) return;   /* No button if no elements. */
-		fieldData -> address = arrayAddress;   /* Indirect. */
+		if (maximum < minimum) return;   // no button if no elements
+		fieldData -> address = arrayAddress;   // indirect
 		fieldData -> description = memberDescription;
-		fieldData -> minimum = minimum;   /* Normally 1. */
+		fieldData -> minimum = minimum;   // normally 1
 		fieldData -> maximum = maximum;
 		fieldData -> rank = 1;
-		Melder_free (fieldData -> history); fieldData -> history = Melder_wcsdup_f (history);
-		fieldData -> button -> f_show ();
+		Melder_free (fieldData -> history); fieldData -> history = Melder_dup_f (history);
+		GuiThing_show (fieldData -> button);
 	} else if (rank < 0) {
 		/*
 		 * This represents an in-line array.
@@ -436,23 +433,23 @@ static void showStructMember (
 		fieldData -> minimum = 0;   /* In-line arrays start with index 0. */
 		fieldData -> maximum = maximum;   /* Probably between -1 and capacity - 1. */
 		fieldData -> rank = rank;
-		Melder_free (fieldData -> history); fieldData -> history = Melder_wcsdup_f (history);
-		fieldData -> button -> f_show ();
+		Melder_free (fieldData -> history); fieldData -> history = Melder_dup_f (history);
+		GuiThing_show (fieldData -> button);
 	} else if (rank == 3) {
 		/*
 		 * This represents an in-line set.
 		 */
 		fieldData -> address = memberAddress;   /* Direct. */
 		fieldData -> description = memberDescription;
-		fieldData -> minimum = wcsequ (((const wchar_t * (*) (int)) memberDescription -> min1) (0), L"_") ? 1 : 0;
-		fieldData -> maximum = ((int (*) (const wchar_t *)) memberDescription -> max1) (L"\n");
+		fieldData -> minimum = str32equ (((const char32 * (*) (int)) memberDescription -> min1) (0), U"_") ? 1 : 0;
+		fieldData -> maximum = ((int (*) (const char32 *)) memberDescription -> max1) (U"\n");
 		fieldData -> rank = rank;
-		Melder_free (fieldData -> history); fieldData -> history = Melder_wcsdup_f (history);
-		fieldData -> button -> f_show ();
+		Melder_free (fieldData -> history); fieldData -> history = Melder_dup_f (history);
+		GuiThing_show (fieldData -> button);
 	} else if (rank == 2) {
 		void *arrayAddress = * (void **) memberAddress;
 		long min1, max1, min2, max2;
-		if (arrayAddress == NULL) return;   /* No button for empty fields. */
+		if (! arrayAddress) return;   // no button for empty fields
 		Data_Description_evaluateInteger (structAddress, structDescription,
 			memberDescription -> min1,  & min1);
 		Data_Description_evaluateInteger (structAddress, structDescription,
@@ -461,38 +458,38 @@ static void showStructMember (
 			memberDescription -> min2,  & min2);
 		Data_Description_evaluateInteger (structAddress, structDescription,
 			memberDescription -> max2, & max2);
-		if (max1 < min1 || max2 < min2) return;   /* No button if no elements. */
-		fieldData -> address = arrayAddress;   /* Indirect. */
+		if (max1 < min1 || max2 < min2) return;   // no button if no elements
+		fieldData -> address = arrayAddress;   // indirect
 		fieldData -> description = memberDescription;
-		fieldData -> minimum = min1;   /* Normally 1. */
+		fieldData -> minimum = min1;   // normally 1
 		fieldData -> maximum = max1;
 		fieldData -> min2 = min2;
 		fieldData -> max2 = max2;
 		fieldData -> rank = 2;
-		Melder_free (fieldData -> history); fieldData -> history = Melder_wcsdup_f (history);
-		fieldData -> button -> f_show ();
-	} else if (type == structwa) {   /* In-line struct. */
-		fieldData -> address = memberAddress;   /* Direct. */
+		Melder_free (fieldData -> history); fieldData -> history = Melder_dup_f (history);
+		GuiThing_show (fieldData -> button);
+	} else if (type == structwa) {   // in-line struct
+		fieldData -> address = memberAddress;   // direct
 		fieldData -> description = memberDescription;
 		fieldData -> rank = 0;
-		Melder_free (fieldData -> history); fieldData -> history = Melder_wcsdup_f (history);
-		fieldData -> button -> f_show ();
-	} else if (type == objectwa || type == collectionwa) {
-		fieldData -> address = * (Data *) memberAddress;   /* Indirect. */
+		Melder_free (fieldData -> history); fieldData -> history = Melder_dup_f (history);
+		GuiThing_show (fieldData -> button);
+	} else if (type == objectwa || type == autoobjectwa || type == collectionwa) {
+		fieldData -> address = * (Daata *) memberAddress;   /* Indirect. */
 		if (! fieldData -> address) return;   /* No button if no object. */
 		fieldData -> description = memberDescription;
 		fieldData -> rank = 0;
-		Melder_free (fieldData -> history); fieldData -> history = Melder_wcsdup_f (history);
-		fieldData -> button -> f_show ();
+		Melder_free (fieldData -> history); fieldData -> history = Melder_dup_f (history);
+		GuiThing_show (fieldData -> button);
 	}
 }
 
-static void showStructMembers (DataSubEditor me, void *structAddress, Data_Description structDescription, int fromMember, wchar_t *history) {
+static void showStructMembers (DataSubEditor me, void *structAddress, Data_Description structDescription, int fromMember, char32 *history) {
 	int i = 1;
 	Data_Description memberDescription = structDescription;
-	for (; i < fromMember && memberDescription -> name != NULL; i ++, memberDescription ++)
+	for (; i < fromMember && memberDescription -> name != nullptr; i ++, memberDescription ++)
 		(void) 0;
-	for (; memberDescription -> name != NULL; memberDescription ++) {
+	for (; memberDescription -> name != nullptr; memberDescription ++) {
 		if (++ my d_irow > kDataSubEditor_MAXNUM_ROWS) return;
 		showStructMember (structAddress, structDescription, memberDescription, & my d_fieldData [my d_irow], history);
 	}
@@ -502,17 +499,17 @@ void structStructEditor :: v_showMembers () {
 	showStructMembers (this, d_address, d_description, d_topField, name);
 }
 
-static void StructEditor_init (StructEditor me, DataEditor root, const wchar_t *title, void *address, Data_Description description) {
+static void StructEditor_init (StructEditor me, DataEditor root, const char32 *title, void *address, Data_Description description) {
 	DataSubEditor_init (me, root, title, address, description);
 }
 
-static StructEditor StructEditor_create (DataEditor root, const wchar_t *title, void *address, Data_Description description) {
+static StructEditor StructEditor_create (DataEditor root, const char32 *title, void *address, Data_Description description) {
 	try {
 		autoStructEditor me = Thing_new (StructEditor);
 		StructEditor_init (me.peek(), root, title, address, description);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Struct inspector window not created.");
+		Melder_throw (U"Struct inspector window not created.");
 	}
 }
 
@@ -536,82 +533,80 @@ void structVectorEditor :: v_showMembers () {
 
 	for (long ielement = firstElement; ielement <= d_maximum; ielement ++) {
 		unsigned char *elementAddress = (unsigned char *) d_address + ielement * d_description -> size;
-		static MelderString buffer = { 0 };
-		MelderString_empty (& buffer);
 		int skip = ielement == firstElement ? (d_topField - 1) % elementSize : 0;
 
 		if (++ d_irow > kDataSubEditor_MAXNUM_ROWS) return;
 		DataSubEditor_FieldData fieldData = & d_fieldData [d_irow];
 
 		if (isSingleType) {
-			MelderString_append (& buffer, strip_d (d_description -> name), L" [",
-				d_description -> rank == 3 ? ((const wchar_t * (*) (int)) d_description -> min1) (ielement) : Melder_integer (ielement), L"]");
-			fieldData -> label -> f_move (0, fieldData -> y);
-			fieldData -> label -> f_setString (buffer.string);
-			fieldData -> label -> f_show ();
-
-			MelderString_empty (& buffer);
-			const wchar_t *text = singleTypeToText (elementAddress, type, d_description -> tagType, & buffer);
+			GuiControl_move (fieldData -> label, 0, fieldData -> y);
+			GuiLabel_setText (fieldData -> label,
+				Melder_cat (strip_d (d_description -> name), U" [",
+					( d_description -> rank == 3 ? ((const char32 * (*) (int)) d_description -> min1) (ielement) : Melder_integer (ielement) ),
+					U"]"));
+			GuiThing_show (fieldData -> label);
+
+			autoMelderString buffer;
+			const char32 *text = singleTypeToText (elementAddress, type, d_description -> tagType, & buffer);
 			#if motif
-				XtVaSetValues (fieldData -> text -> d_widget, XmNcolumns, stringLengths [type], NULL);   // TODO: change to GuiObject_size
+				XtVaSetValues (fieldData -> text -> d_widget, XmNcolumns, stringLengths [type], nullptr);   // TODO: change to GuiObject_size
 			#endif
-			fieldData -> text -> f_setString (text);
-			fieldData -> text -> f_show ();
+			GuiText_setString (fieldData -> text, text);
+			GuiThing_show (fieldData -> text);
 			fieldData -> address = elementAddress;
 			fieldData -> description = d_description;
 		} else if (type == structwa) {
-			static MelderString history = { 0 };
+			static MelderString history { 0 };
 			MelderString_copy (& history, name);
 
 			/* Replace things like [1..100] by things like [19]. */
 
 			if (history.string [history.length - 1] == ']') {
-				wchar_t *openingBracket = wcsrchr (history.string, '[');
-				Melder_assert (openingBracket != NULL);
+				char32 *openingBracket = str32rchr (history.string, U'[');
+				Melder_assert (openingBracket != nullptr);
 				* openingBracket = '\0';
 				history.length = openingBracket - history.string;
 			}
-			MelderString_append (& history, L"[", Melder_integer (ielement), L"]");
+			MelderString_append (& history, U"[", ielement, U"]");
 
 			if (skip) {
 				d_irow --;
 			} else {
-				MelderString_append (& buffer, strip_d (d_description -> name), L" [", Melder_integer (ielement), L"]: ---------------------------");
-				fieldData -> label -> f_move (0, fieldData -> y);
-				fieldData -> label -> f_setString (buffer.string);
-				fieldData -> label -> f_show ();
+				GuiControl_move (fieldData -> label, 0, fieldData -> y);
+				GuiLabel_setText (fieldData -> label,
+					Melder_cat (strip_d (d_description -> name), U" [", ielement, U"]: ---------------------------"));
+				GuiThing_show (fieldData -> label);
 			}
 			showStructMembers (this, elementAddress, * (Data_Description *) d_description -> tagType, skip, history.string);
-		} else if (type == objectwa) {
-			static MelderString history = { 0 };
+		} else if (type == objectwa || type == autoobjectwa) {
+			static MelderString history { 0 };
 			MelderString_copy (& history, name);
-			if (history.string [history.length - 1] == ']') {
-				wchar_t *openingBracket = wcsrchr (history.string, '[');
-				Melder_assert (openingBracket != NULL);
-				* openingBracket = '\0';
+			if (history.string [history.length - 1] == U']') {
+				char32 *openingBracket = str32rchr (history.string, U'[');
+				Melder_assert (openingBracket != nullptr);
+				* openingBracket = U'\0';
 				history.length = openingBracket - history.string;
 			}
-			MelderString_append (& history, L"[", Melder_integer (ielement), L"]");
+			MelderString_append (& history, U"[", ielement, U"]");
 
-			MelderString_append (& buffer, strip_d (d_description -> name), L" [", Melder_integer (ielement), L"]");
-			fieldData -> label -> f_move (0, fieldData -> y);
-			fieldData -> label -> f_setString (buffer.string);
-			fieldData -> label -> f_show ();
+			GuiControl_move (fieldData -> label, 0, fieldData -> y);
+			GuiLabel_setText (fieldData -> label, Melder_cat (strip_d (d_description -> name), U" [", ielement, U"]"));
+			GuiThing_show (fieldData -> label);
 
-			Data object = * (Data *) elementAddress;
-			if (object == NULL) return;   // no button if no object
+			Daata object = * (Daata *) elementAddress;
+			if (! object) return;   // no button if no object
 			if (! Class_getDescription (object -> classInfo)) return;   // no button if no description for this class
 			fieldData -> address = object;
 			fieldData -> description = Class_getDescription (object -> classInfo);
 			fieldData -> rank = 0;
 			if (fieldData -> history) Melder_free (fieldData -> history);
-			fieldData -> history = Melder_wcsdup_f (history.string);
-			fieldData -> button -> f_show ();
+			fieldData -> history = Melder_dup_f (history.string);
+			GuiThing_show (fieldData -> button);
 		}
 	}
 }
 
-static VectorEditor VectorEditor_create (DataEditor root, const wchar_t *title, void *address,
+static VectorEditor VectorEditor_create (DataEditor root, const char32 *title, void *address,
 	Data_Description description, long minimum, long maximum)
 {
 	try {
@@ -621,7 +616,7 @@ static VectorEditor VectorEditor_create (DataEditor root, const wchar_t *title,
 		DataSubEditor_init (me.peek(), root, title, address, description);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Vector inspector window not created.");
+		Melder_throw (U"Vector inspector window not created.");
 	}
 }
 
@@ -653,27 +648,24 @@ void structMatrixEditor :: v_showMembers () {
 		DataSubEditor_FieldData fieldData = & d_fieldData [d_irow];
 		
 		if (isSingleType) {
-			static MelderString buffer = { 0 };
-			MelderString_empty (& buffer);
-			MelderString_append (& buffer, strip_d (d_description -> name), L" [", Melder_integer (irow), L"] [", Melder_integer (icolumn), L"]");
-			fieldData -> label -> f_move (0, fieldData -> y);
-			fieldData -> label -> f_setString (buffer.string);
-			fieldData -> label -> f_show ();
-
-			MelderString_empty (& buffer);
-			const wchar_t *text = singleTypeToText (elementAddress, type, d_description -> tagType, & buffer);
+			GuiControl_move (fieldData -> label, 0, fieldData -> y);
+			GuiLabel_setText (fieldData -> label, Melder_cat (strip_d (d_description -> name), U" [", irow, U"] [", icolumn, U"]"));
+			GuiThing_show (fieldData -> label);
+
+			autoMelderString buffer;
+			const char32 *text = singleTypeToText (elementAddress, type, d_description -> tagType, & buffer);
 			#if motif
-				XtVaSetValues (fieldData -> text -> d_widget, XmNcolumns, stringLengths [type], NULL);   // TODO: change to GuiObject_size
+				XtVaSetValues (fieldData -> text -> d_widget, XmNcolumns, stringLengths [type], nullptr);   // TODO: change to GuiObject_size
 			#endif
-			fieldData -> text -> f_setString (text);
-			fieldData -> text -> f_show ();
+			GuiText_setString (fieldData -> text, text);
+			GuiThing_show (fieldData -> text);
 			fieldData -> address = elementAddress;
 			fieldData -> description = d_description;
 		}
 	}
 }
 
-static MatrixEditor MatrixEditor_create (DataEditor root, const wchar_t *title, void *address,
+static MatrixEditor MatrixEditor_create (DataEditor root, const char32 *title, void *address,
 	Data_Description description, long min1, long max1, long min2, long max2)
 {
 	try {
@@ -685,7 +677,7 @@ static MatrixEditor MatrixEditor_create (DataEditor root, const wchar_t *title,
 		DataSubEditor_init (me.peek(), root, title, address, description);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Matrix inspector window not created.");
+		Melder_throw (U"Matrix inspector window not created.");
 	}
 }
 
@@ -699,31 +691,31 @@ static void ClassEditor_showMembers_recursive (ClassEditor me, ClassInfo klas) {
 	int classFieldsTraversed = 0;
 	while (Class_getDescription (parentClass) == description)
 		parentClass = parentClass -> parent;
-	if (parentClass != classData) {
+	if (parentClass != classDaata) {
 		ClassEditor_showMembers_recursive (me, parentClass);
 		classFieldsTraversed = Data_Description_countMembers (Class_getDescription (parentClass));
-		//Melder_casual ("ClassEditor_showMembers_recursive: classFieldsTraversed = %d", classFieldsTraversed);
+		//Melder_casual (U"ClassEditor_showMembers_recursive: classFieldsTraversed = ", classFieldsTraversed);
 	}
 	showStructMembers (me, my d_address, description, my d_irow ? 1 : my d_topField - classFieldsTraversed, my name);
 }
 
 void structClassEditor :: v_showMembers () {
-	ClassEditor_showMembers_recursive (this, ((Data) d_address) -> classInfo);
+	ClassEditor_showMembers_recursive (this, ((Daata) d_address) -> classInfo);
 }
 
-static void ClassEditor_init (ClassEditor me, DataEditor root, const wchar_t *title, void *address, Data_Description description) {
-	if (description == NULL)
-		Melder_throw ("Class ", Thing_className ((Thing) address), " cannot be inspected.");
+static void ClassEditor_init (ClassEditor me, DataEditor root, const char32 *title, void *address, Data_Description description) {
+	if (! description)
+		Melder_throw (U"Class ", Thing_className ((Thing) address), U" cannot be inspected.");
 	StructEditor_init (me, root, title, address, description);
 }
 
-static ClassEditor ClassEditor_create (DataEditor root, const wchar_t *title, void *address, Data_Description description) {
+static ClassEditor ClassEditor_create (DataEditor root, const char32 *title, void *address, Data_Description description) {
 	try {
 		autoClassEditor me = Thing_new (ClassEditor);
 		ClassEditor_init (me.peek(), root, title, address, description);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Class inspector window not created.");
+		Melder_throw (U"Class inspector window not created.");
 	}
 }
 
@@ -737,7 +729,7 @@ void structDataEditor :: v_destroy () {
 
 	for (int i = 1; i <= d_children -> size; i ++) {
 		DataSubEditor child = (DataSubEditor) d_children -> item [i];
-		child -> d_root = NULL;
+		child -> d_root = nullptr;
 	}
 
 	forget (d_children);
@@ -761,17 +753,17 @@ void structDataEditor :: v_dataChanged () {
 	}
 }
 
-DataEditor DataEditor_create (const wchar_t *title, Data data) {
+DataEditor DataEditor_create (const char32 *title, Daata data) {
 	try {
 		ClassInfo klas = data -> classInfo;
-		if (Class_getDescription (klas) == NULL)
-			Melder_throw ("Class ", klas -> className, " cannot be inspected.");
+		if (Class_getDescription (klas) == nullptr)
+			Melder_throw (U"Class ", klas -> className, U" cannot be inspected.");
 		autoDataEditor me = Thing_new (DataEditor);
 		my d_children = Collection_create (classDataSubEditor, 10);
 		ClassEditor_init (me.peek(), me.peek(), title, data, Class_getDescription (klas));
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Inspector window not created.");
+		Melder_throw (U"Inspector window not created.");
 	}
 }
 
diff --git a/sys/DataEditor.h b/sys/DataEditor.h
index 7bb632d..ab43a8c 100644
--- a/sys/DataEditor.h
+++ b/sys/DataEditor.h
@@ -2,7 +2,7 @@
 #define _DataEditor_h_
 /* DataEditor.h
  *
- * Copyright (C) 1995-2011,2012 Paul Boersma
+ * Copyright (C) 1995-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,7 +35,7 @@ typedef struct structDataSubEditor_FieldData {
 	void *address;
 	Data_Description description;
 	long minimum, maximum, min2, max2;
-	wchar_t *history;   // the full prefix of the members
+	char32 *history;   // the full prefix of the members
 	int rank;   // should the button open a StructEditor (0) or VectorEditor (1) or MatrixEditor (2) ?
 	int y;
 } *DataSubEditor_FieldData;
@@ -43,63 +43,66 @@ typedef struct structDataSubEditor_FieldData {
 #define kDataSubEditor_MAXNUM_ROWS  12
 
 Thing_define (DataSubEditor, Editor) {
-	// new data:
-	public:
-		DataEditor d_root;
-		void *d_address;
-		Data_Description d_description;
-		GuiScrollBar d_scrollBar;
-		int d_irow, d_topField, d_numberOfFields;
-		struct structDataSubEditor_FieldData d_fieldData [1 + kDataSubEditor_MAXNUM_ROWS];
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual bool v_scriptable () { return false; }
-		virtual void v_createChildren ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-	// new methods:
-		virtual long v_countFields () { return 0; }
-		virtual void v_showMembers () { }
+	DataEditor d_root;
+	void *d_address;
+	Data_Description d_description;
+	GuiScrollBar d_scrollBar;
+	int d_irow, d_topField, d_numberOfFields;
+	struct structDataSubEditor_FieldData d_fieldData [1 + kDataSubEditor_MAXNUM_ROWS];
+
+	void v_destroy ()
+		override;
+	bool v_scriptable ()
+		override { return false; }
+	void v_createChildren ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+
+	virtual long v_countFields () { return 0; }
+	virtual void v_showMembers () { }
 };
 
 Thing_define (VectorEditor, DataSubEditor) {
-	// new data:
-	public:
-		long d_minimum, d_maximum;
-	// overridden methods:
-		virtual long v_countFields ();
-		virtual void v_showMembers ();
+	long d_minimum, d_maximum;
+
+	long v_countFields ()
+		override;
+	void v_showMembers ()
+		override;
 };
 
 Thing_define (MatrixEditor, DataSubEditor) {
-	// new data:
-	public:
-		long d_minimum, d_maximum, d_min2, d_max2;
-	// overridden methods:
-		virtual long v_countFields ();
-		virtual void v_showMembers ();
+	long d_minimum, d_maximum, d_min2, d_max2;
+
+	long v_countFields ()
+		override;
+	void v_showMembers ()
+		override;
 };
 
 Thing_define (StructEditor, DataSubEditor) {
-	// overridden methods:
-		virtual long v_countFields ();
-		virtual void v_showMembers ();
+	long v_countFields ()
+		override;
+	void v_showMembers ()
+		override;
 };
 
 Thing_define (ClassEditor, StructEditor) {
-	// overridden methods:
-		virtual void v_showMembers ();
+	void v_showMembers ()
+		override;
 };
 
 Thing_define (DataEditor, ClassEditor) {
-	// new data:
-	public:
-		Collection d_children;
-	// overridden methods:
-		void v_destroy ();
-		void v_dataChanged ();
+	Collection d_children;
+
+	void v_destroy ()
+		override;
+	void v_dataChanged ()
+		override;
 };
 
-DataEditor DataEditor_create (const wchar_t *title, Data data);
+DataEditor DataEditor_create (const char32 *title, Daata data);
 
 /* End of file DataEditor.h */
 #endif
diff --git a/sys/DemoEditor.cpp b/sys/DemoEditor.cpp
index 54c018b..1565061 100644
--- a/sys/DemoEditor.cpp
+++ b/sys/DemoEditor.cpp
@@ -1,6 +1,6 @@
 /* DemoEditor.cpp
  *
- * Copyright (C) 2009-2011,2013 Paul Boersma
+ * Copyright (C) 2009-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,15 +31,15 @@ static DemoEditor theDemoEditor;
 void structDemoEditor :: v_destroy () {
 	Melder_free (praatPicture);
 	forget (graphics);
-	theDemoEditor = NULL;
+	theDemoEditor = nullptr;
 	DemoEditor_Parent :: v_destroy ();
 }
 
 void structDemoEditor :: v_info () {
 	DemoEditor_Parent :: v_info ();
-	MelderInfo_writeLine (L"Colour: ", Graphics_Colour_name (((PraatPicture) praatPicture) -> colour));
-	MelderInfo_writeLine (L"Font: ", kGraphics_font_getText (((PraatPicture) praatPicture) -> font));
-	MelderInfo_writeLine (L"Font size: ", Melder_integer (((PraatPicture) praatPicture) -> fontSize));
+	MelderInfo_writeLine (U"Colour: ", Graphics_Colour_name (((PraatPicture) praatPicture) -> colour));
+	MelderInfo_writeLine (U"Font: ", kGraphics_font_getText (((PraatPicture) praatPicture) -> font));
+	MelderInfo_writeLine (U"Font size: ", ((PraatPicture) praatPicture) -> fontSize);
 }
 
 void structDemoEditor :: v_goAway () {
@@ -57,7 +57,7 @@ void structDemoEditor :: v_createMenus () {
 static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
 	iam (DemoEditor);
 	(void) event;
-	if (my graphics == NULL) return;   // Could be the case in the very beginning.
+	if (! my graphics) return;   // could be the case in the very beginning
 	/*
 	 * Erase the background. Don't record this erasure!
 	 */
@@ -72,7 +72,7 @@ static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
 
 static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 	iam (DemoEditor);
-	if (my graphics == NULL) return;   // Could be the case in the very beginning.
+	if (! my graphics) return;   // could be the case in the very beginning
 	my clicked = true;
 	my keyPressed = false;
 	my x = event -> x;
@@ -86,13 +86,13 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 
 static void gui_drawingarea_cb_key (I, GuiDrawingAreaKeyEvent event) {
 	iam (DemoEditor);
-	if (my graphics == NULL) return;   // Could be the case in the very beginning.
+	if (! my graphics) return;   // could be the case in the very beginning
 	my clicked = false;
 	my keyPressed = true;
 	my x = 0;
 	my y = 0;
 	my key = event -> key;
-	trace ("%d", (int) my key);
+	trace (my key);
 	my shiftKeyPressed = event -> shiftKeyPressed;
 	my commandKeyPressed = event -> commandKeyPressed;
 	my optionKeyPressed = event -> optionKeyPressed;
@@ -101,8 +101,8 @@ static void gui_drawingarea_cb_key (I, GuiDrawingAreaKeyEvent event) {
 
 static void gui_drawingarea_cb_resize (I, GuiDrawingAreaResizeEvent event) {
 	iam (DemoEditor);
-	if (my graphics == NULL) return;   // Could be the case in the very beginning.
-	trace ("%d %d", event -> width, event -> height);
+	if (! my graphics) return;   // could be the case in the very beginning
+	trace (event -> width, U" ", event -> height);
 	Graphics_setWsViewport (my graphics, 0, event -> width, 0, event -> height);
 	Graphics_setWsWindow (my graphics, 0, 100, 0, 100);
 	//Graphics_setViewport (my graphics, 0, 100, 0, 100);
@@ -115,16 +115,17 @@ void structDemoEditor :: v_createChildren () {
 }
 
 void DemoEditor_init (DemoEditor me) {
-	Editor_init (me, 0, 0, 1024, 768, L"", NULL);
+	Editor_init (me, 0, 0, 1024, 768, U"", nullptr);
 	my graphics = Graphics_create_xmdrawingarea (my drawingArea);
 	Graphics_setColour (my graphics, Graphics_WHITE);
-	Graphics_setWindow (my graphics, 0, 1, 0, 1);
-	Graphics_fillRectangle (my graphics, 0, 1, 0, 1);
+	Graphics_setWindow (my graphics, 0.0, 1.0, 0.0, 1.0);
+	Graphics_fillRectangle (my graphics, 0.0, 1.0, 0.0, 1.0);
 	Graphics_setColour (my graphics, Graphics_BLACK);
 	Graphics_startRecording (my graphics);
-	Graphics_setWsViewport (my graphics, 0, my drawingArea -> f_getWidth (), 0, my drawingArea -> f_getHeight ());
-	Graphics_setWsWindow (my graphics, 0, 100, 0, 100);
-	Graphics_setViewport (my graphics, 0, 100, 0, 100);
+	Graphics_setWsViewport (my graphics, 0.0, GuiControl_getWidth  (my drawingArea),
+	                                     0.0, GuiControl_getHeight (my drawingArea));
+	Graphics_setWsWindow (my graphics, 0.0, 100.0, 0.0, 100.0);
+	Graphics_setViewport (my graphics, 0.0, 100.0, 0.0, 100.0);
 	Graphics_updateWs (my graphics);
 }
 
@@ -134,73 +135,70 @@ DemoEditor DemoEditor_create () {
 		DemoEditor_init (me.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Demo window not created.");
+		Melder_throw (U"Demo window not created.");
 	}
 }
 
-void Demo_open (void) {
-	#ifndef CONSOLE_APPLICATION
-		if (Melder_batch) {
-			/*
-			 * Batch scripts have to be able to run demos.
-			 */
-			//Melder_batch = false;
-		}
-		if (theDemoEditor == NULL) {
-			theDemoEditor = DemoEditor_create ();
-			Melder_assert (theDemoEditor != NULL);
-			//GuiObject_show (theDemoEditor -> d_windowForm);
-			theDemoEditor -> praatPicture = Melder_calloc_f (structPraatPicture, 1);
-			theCurrentPraatPicture = (PraatPicture) theDemoEditor -> praatPicture;
-			theCurrentPraatPicture -> graphics = theDemoEditor -> graphics;
-			theCurrentPraatPicture -> font = kGraphics_font_HELVETICA;
-			theCurrentPraatPicture -> fontSize = 10;
-			theCurrentPraatPicture -> lineType = Graphics_DRAWN;
-			theCurrentPraatPicture -> colour = Graphics_BLACK;
-			theCurrentPraatPicture -> lineWidth = 1.0;
-			theCurrentPraatPicture -> arrowSize = 1.0;
-			theCurrentPraatPicture -> speckleSize = 1.0;
-			theCurrentPraatPicture -> x1NDC = 0;
-			theCurrentPraatPicture -> x2NDC = 100;
-			theCurrentPraatPicture -> y1NDC = 0;
-			theCurrentPraatPicture -> y2NDC = 100;
-		}
-		if (theDemoEditor -> waitingForInput)
-			Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-				"Please click or type into the Demo window or close it.");
+void Demo_open () {
+	if (Melder_batch) {
+		/*
+		 * Batch scripts have to be able to run demos.
+		 */
+		//Melder_batch = false;
+	}
+	if (theDemoEditor == nullptr) {
+		theDemoEditor = DemoEditor_create ();
+		Melder_assert (theDemoEditor != NULL);
+		//GuiObject_show (theDemoEditor -> d_windowForm);
+		theDemoEditor -> praatPicture = Melder_calloc_f (structPraatPicture, 1);
 		theCurrentPraatPicture = (PraatPicture) theDemoEditor -> praatPicture;
-	#endif
+		theCurrentPraatPicture -> graphics = theDemoEditor -> graphics;
+		theCurrentPraatPicture -> font = kGraphics_font_HELVETICA;
+		theCurrentPraatPicture -> fontSize = 10;
+		theCurrentPraatPicture -> lineType = Graphics_DRAWN;
+		theCurrentPraatPicture -> colour = Graphics_BLACK;
+		theCurrentPraatPicture -> lineWidth = 1.0;
+		theCurrentPraatPicture -> arrowSize = 1.0;
+		theCurrentPraatPicture -> speckleSize = 1.0;
+		theCurrentPraatPicture -> x1NDC = 0;
+		theCurrentPraatPicture -> x2NDC = 100;
+		theCurrentPraatPicture -> y1NDC = 0;
+		theCurrentPraatPicture -> y2NDC = 100;
+	}
+	if (theDemoEditor -> waitingForInput)
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
+	theCurrentPraatPicture = (PraatPicture) theDemoEditor -> praatPicture;
 }
 
-void Demo_close (void) {
+void Demo_close () {
 	theCurrentPraatPicture = & theForegroundPraatPicture;
 }
 
-int Demo_windowTitle (const wchar_t *title) {
+int Demo_windowTitle (const char32 *title) {
 	autoDemoOpen demo;
 	Thing_setName (theDemoEditor, title);
 	return 1;
 }
 
-int Demo_show (void) {
-	if (theDemoEditor == NULL) return 0;
+int Demo_show () {
+	if (! theDemoEditor) return 0;
 	autoDemoOpen demo;
-	theDemoEditor -> d_windowForm -> f_show ();
-	theDemoEditor -> d_windowForm -> f_drain ();
+	GuiThing_show (theDemoEditor -> d_windowForm);
+	GuiShell_drain (theDemoEditor -> d_windowForm);
 	return 1;
 }
 
 void Demo_waitForInput (Interpreter interpreter) {
-	if (theDemoEditor == NULL) return;
+	if (! theDemoEditor) return;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
 	//GuiObject_show (theDemoEditor -> d_windowForm);
 	theDemoEditor -> clicked = false;
 	theDemoEditor -> keyPressed = false;
 	theDemoEditor -> waitingForInput = true;
-	#if ! defined (CONSOLE_APPLICATION)
 	{// scope
 		autoMelderSaveDefaultDir saveDir;
 		bool wasBackgrounding = Melder_backgrounding;
@@ -220,7 +218,7 @@ void Demo_waitForInput (Interpreter interpreter) {
 						inMode: NSDefaultRunLoopMode
 						dequeue: YES
 					];
-					Melder_assert (nsEvent != NULL);
+					Melder_assert (nsEvent != nullptr);
 					[NSApp  sendEvent: nsEvent];
 					[NSApp  updateWindows];   // called automatically?
 					[pool release];
@@ -239,50 +237,49 @@ void Demo_waitForInput (Interpreter interpreter) {
 				} while (! theDemoEditor -> clicked && ! theDemoEditor -> keyPressed && ! theDemoEditor -> userWantsToClose);
 			#endif
 		} catch (MelderError) {
-			Melder_flushError ("An error made it to the outer level in the Demo window; should not occur! Please write to paul.boersma at uva.nl");
+			Melder_flushError (U"An error made it to the outer level in the Demo window; should not occur! Please write to paul.boersma at uva.nl");
 		}
 		if (wasBackgrounding) praat_background ();
 	}
-	#endif
 	theDemoEditor -> waitingForInput = false;
 	if (theDemoEditor -> userWantsToClose) {
 		Interpreter_stop (interpreter);
 		forget (theDemoEditor);
-		Melder_throw ("You interrupted the script.");
+		Melder_throw (U"You interrupted the script.");
 	}
 }
 
-bool Demo_clicked (void) {
-	if (theDemoEditor == NULL) return false;
+bool Demo_clicked () {
+	if (! theDemoEditor) return false;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
 	return theDemoEditor -> clicked;
 }
 
-double Demo_x (void) {
-	if (theDemoEditor == NULL) return NUMundefined;
+double Demo_x () {
+	if (! theDemoEditor) return NUMundefined;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
-	trace ("NDC before: %f %f", theDemoEditor -> graphics -> d_x1NDC, theDemoEditor -> graphics -> d_x2NDC);
+	trace (U"NDC before: ", theDemoEditor -> graphics -> d_x1NDC, U" ", theDemoEditor -> graphics -> d_x2NDC);
 	Graphics_setInner (theDemoEditor -> graphics);
-	trace ("NDC after: %f %f", theDemoEditor -> graphics -> d_x1NDC, theDemoEditor -> graphics -> d_x2NDC);
+	trace (U"NDC after: ", theDemoEditor -> graphics -> d_x1NDC, U" ", theDemoEditor -> graphics -> d_x2NDC);
 	double xWC, yWC;
-	trace ("DC: x %ld, y %ld", theDemoEditor -> x, theDemoEditor -> y);
+	trace (U"DC: x ", theDemoEditor -> x, U", y ", theDemoEditor -> y);
 	Graphics_DCtoWC (theDemoEditor -> graphics, theDemoEditor -> x, theDemoEditor -> y, & xWC, & yWC);
-	trace ("WC: x %f, y %f", xWC, yWC);
+	trace (U"WC: x ", xWC, U", y ", yWC);
 	Graphics_unsetInner (theDemoEditor -> graphics);
 	return xWC;
 }
 
-double Demo_y (void) {
-	if (theDemoEditor == NULL) return NUMundefined;
+double Demo_y () {
+	if (! theDemoEditor) return NUMundefined;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
 	Graphics_setInner (theDemoEditor -> graphics);
 	double xWC, yWC;
@@ -291,74 +288,74 @@ double Demo_y (void) {
 	return yWC;
 }
 
-bool Demo_keyPressed (void) {
-	if (theDemoEditor == NULL) return false;
+bool Demo_keyPressed () {
+	if (! theDemoEditor) return false;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
 	return theDemoEditor -> keyPressed;
 }
 
-wchar_t Demo_key (void) {
-	if (theDemoEditor == NULL) return 0;
+char32 Demo_key () {
+	if (! theDemoEditor) return 0;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
 	return theDemoEditor -> key;
 }
 
-bool Demo_shiftKeyPressed (void) {
-	if (theDemoEditor == NULL) return false;
+bool Demo_shiftKeyPressed () {
+	if (! theDemoEditor) return false;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
 	return theDemoEditor -> shiftKeyPressed;
 }
 
-bool Demo_commandKeyPressed (void) {
-	if (theDemoEditor == NULL) return false;
+bool Demo_commandKeyPressed () {
+	if (! theDemoEditor) return false;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
 	return theDemoEditor -> commandKeyPressed;
 }
 
-bool Demo_optionKeyPressed (void) {
-	if (theDemoEditor == NULL) return false;
+bool Demo_optionKeyPressed () {
+	if (! theDemoEditor) return false;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
 	return theDemoEditor -> optionKeyPressed;
 }
 
-bool Demo_extraControlKeyPressed (void) {
-	if (theDemoEditor == NULL) return false;
+bool Demo_extraControlKeyPressed () {
+	if (! theDemoEditor) return false;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
 	return theDemoEditor -> extraControlKeyPressed;
 }
 
-bool Demo_input (const wchar_t *keys) {
-	if (theDemoEditor == NULL) return false;
+bool Demo_input (const char32 *keys) {
+	if (! theDemoEditor) return false;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
-	return wcschr (keys, theDemoEditor -> key) != NULL;
+	return str32chr (keys, theDemoEditor -> key) != nullptr;
 }
 
 bool Demo_clickedIn (double left, double right, double bottom, double top) {
-	if (theDemoEditor == NULL || ! theDemoEditor -> clicked) return false;
+	if (! theDemoEditor || ! theDemoEditor -> clicked) return false;
 	if (theDemoEditor -> waitingForInput) {
-		Melder_throw ("You cannot work with the Demo window while it is waiting for input. "
-			"Please click or type into the Demo window or close it.");
+		Melder_throw (U"You cannot work with the Demo window while it is waiting for input. "
+			U"Please click or type into the Demo window or close it.");
 	}
 	double xWC = Demo_x (), yWC = Demo_y ();
 	return xWC >= left && xWC < right && yWC >= bottom && yWC < top;
diff --git a/sys/DemoEditor.h b/sys/DemoEditor.h
index 1ffa5f0..b28c735 100644
--- a/sys/DemoEditor.h
+++ b/sys/DemoEditor.h
@@ -2,7 +2,7 @@
 #define _DemoEditor_h_
 /* DemoEditor.h
  *
- * Copyright (C) 2009-2011,2012 Paul Boersma
+ * Copyright (C) 2009-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,50 +22,56 @@
 #include "Editor.h"
 
 Thing_define (DemoEditor, Editor) {
-	// new data:
-	public:
-		GuiDrawingArea drawingArea;
-		Graphics graphics;
-		void *praatPicture;
-		bool clicked, keyPressed, shiftKeyPressed, commandKeyPressed, optionKeyPressed, extraControlKeyPressed;
-		long x, y;
-		wchar_t key;
-		bool waitingForInput, userWantsToClose, fullScreen;
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_info ();
-		virtual void v_goAway ();
-		virtual bool v_hasMenuBar () { return false; }
-		virtual bool v_canFullScreen () { return true; }
-		virtual bool v_scriptable () { return false; }
-		virtual void v_createChildren ();
-		virtual void v_createMenus ();
+	GuiDrawingArea drawingArea;
+	Graphics graphics;
+	void *praatPicture;
+	bool clicked, keyPressed, shiftKeyPressed, commandKeyPressed, optionKeyPressed, extraControlKeyPressed;
+	long x, y;
+	char32 key;
+	bool waitingForInput, userWantsToClose, fullScreen;
+
+	void v_destroy ()
+		override;
+	void v_info ()
+		override;
+	void v_goAway ()
+		override;
+	bool v_hasMenuBar ()
+		override { return false; }
+	bool v_canFullScreen ()
+		override { return true; }
+	bool v_scriptable ()
+		override { return false; }
+	void v_createChildren ()
+		override;
+	void v_createMenus ()
+		override;
 };
 
 void DemoEditor_init (DemoEditor me);
 DemoEditor DemoEditor_create ();
 
-void Demo_open (void);
-void Demo_close (void);
+void Demo_open ();
+void Demo_close ();
 struct autoDemoOpen {
 	autoDemoOpen () { Demo_open (); }
 	~autoDemoOpen () { Demo_close (); }
 };
 
-int Demo_windowTitle (const wchar_t *title);
-int Demo_show (void);
+int Demo_windowTitle (const char32 *title);
+int Demo_show ();
 void Demo_waitForInput (Interpreter interpreter);
-bool Demo_clicked (void);
-double Demo_x (void);
-double Demo_y (void);
-bool Demo_keyPressed (void);
-wchar_t Demo_key (void);
-bool Demo_shiftKeyPressed (void);
-bool Demo_commandKeyPressed (void);
-bool Demo_optionKeyPressed (void);
-bool Demo_extraControlKeyPressed (void);
+bool Demo_clicked ();
+double Demo_x ();
+double Demo_y ();
+bool Demo_keyPressed ();
+char32 Demo_key ();
+bool Demo_shiftKeyPressed ();
+bool Demo_commandKeyPressed ();
+bool Demo_optionKeyPressed ();
+bool Demo_extraControlKeyPressed ();
 /* Shortcuts: */
-bool Demo_input (const wchar_t *keys);
+bool Demo_input (const char32 *keys);
 bool Demo_clickedIn (double left, double right, double bottom, double top);
 
 /* End of file DemoEditor.h */
diff --git a/sys/Editor.cpp b/sys/Editor.cpp
index 85e50a8..bd558e2 100644
--- a/sys/Editor.cpp
+++ b/sys/Editor.cpp
@@ -1,6 +1,6 @@
 /* Editor.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brausse
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brausse
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -63,30 +63,30 @@ void structEditorMenu :: v_destroy () {
 
 static void commonCallback (GUI_ARGS) {
 	GUI_IAM (EditorCommand);
-	if (my d_editor && my d_editor -> v_scriptable () && ! wcsstr (my itemTitle, L"...")) {
-		UiHistory_write (L"\n");
+	if (my d_editor && my d_editor -> v_scriptable () && ! str32str (my itemTitle, U"...")) {
+		UiHistory_write (U"\n");
 		UiHistory_write_colonize (my itemTitle);
 	}
 	try {
-		my commandCallback (my d_editor, me, NULL, 0, NULL, NULL, NULL);
+		my commandCallback (my d_editor, me, nullptr, 0, nullptr, nullptr, nullptr);
 	} catch (MelderError) {
-		if (! Melder_hasError (L"Script exited.")) {
-			Melder_error_ ("Menu command \"", my itemTitle, "\" not completed.");
+		if (! Melder_hasError (U"Script exited.")) {
+			Melder_appendError (U"Menu command \"", my itemTitle, U"\" not completed.");
 		}
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 }
 
-GuiMenuItem EditorMenu_addCommand (EditorMenu me, const wchar_t *itemTitle, long flags,
-	void (*commandCallback) (Editor me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter))
+GuiMenuItem EditorMenu_addCommand (EditorMenu me, const char32 *itemTitle /* cattable */, long flags,
+	void (*commandCallback) (Editor me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter))
 {
 	autoEditorCommand thee = Thing_new (EditorCommand);
 	thy d_editor = my d_editor;
 	thy menu = me;
-	thy itemTitle = Melder_wcsdup (itemTitle);
+	thy itemTitle = Melder_dup (itemTitle);
 	thy itemWidget =
-		commandCallback == NULL ? GuiMenu_addSeparator (my menuWidget) :
-		flags & Editor_HIDDEN ? NULL :
+		commandCallback == nullptr ? GuiMenu_addSeparator (my menuWidget) :
+		flags & Editor_HIDDEN ? nullptr :
 		GuiMenu_addItem (my menuWidget, itemTitle, flags, commonCallback, thee.peek());   // DANGLE BUG: me can be killed by Collection_addItem(), but EditorCommand::destroy doesn't remove the item
 	thy commandCallback = commandCallback;
 	GuiMenuItem result = thy itemWidget;
@@ -96,10 +96,10 @@ GuiMenuItem EditorMenu_addCommand (EditorMenu me, const wchar_t *itemTitle, long
 
 /*GuiObject EditorCommand_getItemWidget (EditorCommand me) { return my itemWidget; }*/
 
-EditorMenu Editor_addMenu (Editor me, const wchar_t *menuTitle, long flags) {
+EditorMenu Editor_addMenu (Editor me, const char32 *menuTitle, long flags) {
 	autoEditorMenu thee = Thing_new (EditorMenu);
 	thy d_editor = me;
-	thy menuTitle = Melder_wcsdup (menuTitle);
+	thy menuTitle = Melder_dup (menuTitle);
 	thy menuWidget = GuiMenu_createInWindow (my d_windowForm, menuTitle, flags);
 	thy commands = Ordered_create ();
 	EditorMenu result = thee.peek();
@@ -109,23 +109,23 @@ EditorMenu Editor_addMenu (Editor me, const wchar_t *menuTitle, long flags) {
 
 /*GuiObject EditorMenu_getMenuWidget (EditorMenu me) { return my menuWidget; }*/
 
-GuiMenuItem Editor_addCommand (Editor me, const wchar_t *menuTitle, const wchar_t *itemTitle, long flags,
-	void (*commandCallback) (Editor me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter))
+GuiMenuItem Editor_addCommand (Editor me, const char32 *menuTitle, const char32 *itemTitle, long flags,
+	void (*commandCallback) (Editor me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter))
 {
 	try {
 		long numberOfMenus = my menus -> size;
 		for (long imenu = 1; imenu <= numberOfMenus; imenu ++) {
 			EditorMenu menu = (EditorMenu) my menus -> item [imenu];
-			if (wcsequ (menuTitle, menu -> menuTitle))
+			if (str32equ (menuTitle, menu -> menuTitle))
 				return EditorMenu_addCommand (menu, itemTitle, flags, commandCallback);
 		}
-		Melder_throw ("Menu \"", menuTitle, L"\" does not exist.");
+		Melder_throw (U"Menu \"", menuTitle, U"\" does not exist.");
 	} catch (MelderError) {
-		Melder_throw ("Command \"", itemTitle, "\" not inserted in menu \"", menuTitle, ".");
+		Melder_throw (U"Command \"", itemTitle, U"\" not inserted in menu \"", menuTitle, U".");
 	}
 }
 
-static void Editor_scriptCallback (Editor me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter) {
+static void Editor_scriptCallback (Editor me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter) {
 	(void) sendingForm;
 	(void) narg;
 	(void) args;
@@ -134,26 +134,26 @@ static void Editor_scriptCallback (Editor me, EditorCommand cmd, UiForm sendingF
 	DO_RunTheScriptFromAnyAddedEditorCommand (me, cmd -> script);
 }
 
-GuiMenuItem Editor_addCommandScript (Editor me, const wchar_t *menuTitle, const wchar_t *itemTitle, long flags,
-	const wchar_t *script)
+GuiMenuItem Editor_addCommandScript (Editor me, const char32 *menuTitle, const char32 *itemTitle, long flags,
+	const char32 *script)
 {
 	long numberOfMenus = my menus -> size;
 	for (long imenu = 1; imenu <= numberOfMenus; imenu ++) {
 		EditorMenu menu = (EditorMenu) my menus -> item [imenu];
-		if (wcsequ (menuTitle, menu -> menuTitle)) {
+		if (str32equ (menuTitle, menu -> menuTitle)) {
 			autoEditorCommand cmd = Thing_new (EditorCommand);
 			cmd -> d_editor = me;
 			cmd -> menu = menu;
-			cmd -> itemTitle = Melder_wcsdup_f (itemTitle);
-			cmd -> itemWidget = script == NULL ? GuiMenu_addSeparator (menu -> menuWidget) :
+			cmd -> itemTitle = Melder_dup_f (itemTitle);
+			cmd -> itemWidget = script == nullptr ? GuiMenu_addSeparator (menu -> menuWidget) :
 				GuiMenu_addItem (menu -> menuWidget, itemTitle, flags, commonCallback, cmd.peek());   // DANGLE BUG
 			cmd -> commandCallback = Editor_scriptCallback;
-			if (wcslen (script) == 0) {
-				cmd -> script = Melder_wcsdup_f (L"");
+			if (str32len (script) == 0) {
+				cmd -> script = Melder_dup_f (U"");
 			} else {
 				structMelderFile file = { 0 };
 				Melder_relativePathToFile (script, & file);
-				cmd -> script = Melder_wcsdup_f (Melder_fileToPath (& file));
+				cmd -> script = Melder_dup_f (Melder_fileToPath (& file));
 			}
 			GuiMenuItem result = cmd -> itemWidget;
 			Collection_addItem (menu -> commands, cmd.transfer());
@@ -161,67 +161,67 @@ GuiMenuItem Editor_addCommandScript (Editor me, const wchar_t *menuTitle, const
 		}
 	}
 	Melder_warning (
-		"Menu \"", menuTitle, L"\" does not exist.\n"
-		"Command \"", itemTitle, "\" not inserted in menu \"", menuTitle, ".\n"
-		"To fix this, go to Praat->Preferences->Buttons->Editors, and remove the script from this menu.\n"
-		"You may want to install the script in a different menu.");
-	return NULL;
+		U"Menu \"", menuTitle, U"\" does not exist.\n"
+		U"Command \"", itemTitle, U"\" not inserted in menu \"", menuTitle, U".\n"
+		U"To fix this, go to Praat->Preferences->Buttons->Editors, and remove the script from this menu.\n"
+		U"You may want to install the script in a different menu.");
+	return nullptr;
 }
 
-void Editor_setMenuSensitive (Editor me, const wchar_t *menuTitle, int sensitive) {
+void Editor_setMenuSensitive (Editor me, const char32 *menuTitle, int sensitive) {
 	int numberOfMenus = my menus -> size;
 	for (int imenu = 1; imenu <= numberOfMenus; imenu ++) {
 		EditorMenu menu = (EditorMenu) my menus -> item [imenu];
-		if (wcsequ (menuTitle, menu -> menuTitle)) {
-			menu -> menuWidget -> f_setSensitive (sensitive);
+		if (str32equ (menuTitle, menu -> menuTitle)) {
+			GuiThing_setSensitive (menu -> menuWidget, sensitive);
 			return;
 		}
 	}
 }
 
-EditorCommand Editor_getMenuCommand (Editor me, const wchar_t *menuTitle, const wchar_t *itemTitle) {
+EditorCommand Editor_getMenuCommand (Editor me, const char32 *menuTitle, const char32 *itemTitle) {
 	int numberOfMenus = my menus -> size;
 	for (int imenu = 1; imenu <= numberOfMenus; imenu ++) {
 		EditorMenu menu = (EditorMenu) my menus -> item [imenu];
-		if (wcsequ (menuTitle, menu -> menuTitle)) {
+		if (str32equ (menuTitle, menu -> menuTitle)) {
 			int numberOfCommands = menu -> commands -> size, icommand;
 			for (icommand = 1; icommand <= numberOfCommands; icommand ++) {
 				EditorCommand command = (EditorCommand) menu -> commands -> item [icommand];
-				if (wcsequ (itemTitle, command -> itemTitle))
+				if (str32equ (itemTitle, command -> itemTitle))
 					return command;
 			}
 		}
 	}
-	Melder_throw ("Command \"", itemTitle, "\" not found in menu \"", menuTitle, "\".");
+	Melder_throw (U"Command \"", itemTitle, U"\" not found in menu \"", menuTitle, U"\".");
 }
 
-void Editor_doMenuCommand (Editor me, const wchar_t *commandTitle, int narg, Stackel args, const wchar_t *arguments, Interpreter interpreter) {
+void Editor_doMenuCommand (Editor me, const char32 *commandTitle, int narg, Stackel args, const char32 *arguments, Interpreter interpreter) {
 	int numberOfMenus = my menus -> size;
 	for (int imenu = 1; imenu <= numberOfMenus; imenu ++) {
 		EditorMenu menu = (EditorMenu) my menus -> item [imenu];
 		long numberOfCommands = menu -> commands -> size;
 		for (long icommand = 1; icommand <= numberOfCommands; icommand ++) {
 			EditorCommand command = (EditorCommand) menu -> commands -> item [icommand];
-			if (wcsequ (commandTitle, command -> itemTitle)) {
-				command -> commandCallback (me, command, NULL, narg, args, arguments, interpreter);
+			if (str32equ (commandTitle, command -> itemTitle)) {
+				command -> commandCallback (me, command, nullptr, narg, args, arguments, interpreter);
 				return;
 			}
 		}
 	}
-	Melder_throw ("Command not available in ", my classInfo -> className, ".");
+	Melder_throw (U"Command not available in ", my classInfo -> className, U".");
 }
 
 /********** class Editor **********/
 
 void structEditor :: v_destroy () {
-	trace ("enter");
+	trace (U"enter");
 	MelderAudio_stopPlaying (MelderAudio_IMPLICIT);
 	/*
 	 * The following command must be performed before the shell is destroyed.
 	 * Otherwise, we would be forgetting dangling command dialogs here.
 	 */
 	forget (our menus);
-	broadcastDestruction ();
+	Editor_broadcastDestruction (this);
 	if (our d_windowForm) {
 		#if gtk
 			if (our d_windowForm -> d_gtkWindow) {
@@ -231,7 +231,7 @@ void structEditor :: v_destroy () {
 		#elif cocoa
 			if (our d_windowForm -> d_cocoaWindow) {
 				NSWindow *cocoaWindow = our d_windowForm -> d_cocoaWindow;
-				//d_windowForm -> d_cocoaWindow = NULL;
+				//d_windowForm -> d_cocoaWindow = nullptr;
 				[cocoaWindow close];
 			}
 		#elif motif
@@ -247,19 +247,19 @@ void structEditor :: v_destroy () {
 }
 
 void structEditor :: v_info () {
-	MelderInfo_writeLine (L"Editor type: ", Thing_className (this));
-	MelderInfo_writeLine (L"Editor name: ", our name ? our name : L"<no name>");
-	time_t today = time (NULL);
-	MelderInfo_writeLine (L"Date: ", Melder_peekUtf8ToWcs (ctime (& today)));   // includes a newline
+	MelderInfo_writeLine (U"Editor type: ", Thing_className (this));
+	MelderInfo_writeLine (U"Editor name: ", our name ? our name : U"<no name>");
+	time_t today = time (nullptr);
+	MelderInfo_writeLine (U"Date: ", Melder_peek8to32 (ctime (& today)));   // includes a newline
 	if (our data) {
-		MelderInfo_writeLine (L"Data type: ", our data -> classInfo -> className);
-		MelderInfo_writeLine (L"Data name: ", our data -> name);
+		MelderInfo_writeLine (U"Data type: ", our data -> classInfo -> className);
+		MelderInfo_writeLine (U"Data name: ", our data -> name);
 	}
 }
 
 void structEditor :: v_nameChanged () {
 	if (our name)
-		our d_windowForm -> f_setTitle (our name);
+		GuiShell_setTitle (our d_windowForm, our name);
 }
 
 void structEditor :: v_saveData () {
@@ -278,9 +278,9 @@ static void menu_cb_sendBackToCallingProgram (EDITOR_ARGS) {
 	if (my data) {
 		extern structMelderDir praatDir;
 		structMelderFile file = { 0 };
-		MelderDir_getFile (& praatDir, L"praat_backToCaller.Data", & file);
+		MelderDir_getFile (& praatDir, U"praat_backToCaller.Data", & file);
 		Data_writeToTextFile (my data, & file);
-		sendsocket (my callbackSocket, Melder_peekWcsToUtf8 (my data -> name));
+		sendsocket (my callbackSocket, Melder_peek32to8 (my data -> name));
 	}
 	my v_goAway ();
 }
@@ -293,16 +293,16 @@ static void menu_cb_close (EDITOR_ARGS) {
 static void menu_cb_undo (EDITOR_ARGS) {
 	EDITOR_IAM (Editor);
 	my v_restoreData ();
-	if (wcsnequ (my undoText, L"Undo", 4)) my undoText [0] = 'R', my undoText [1] = 'e';
-	else if (wcsnequ (my undoText, L"Redo", 4)) my undoText [0] = 'U', my undoText [1] = 'n';
-	else wcscpy (my undoText, L"Undo?");
+	if (str32nequ (my undoText, U"Undo", 4)) my undoText [0] = U'R', my undoText [1] = U'e';
+	else if (str32nequ (my undoText, U"Redo", 4)) my undoText [0] = U'U', my undoText [1] = U'n';
+	else str32cpy (my undoText, U"Undo?");
 	#if gtk
-		gtk_label_set_label (GTK_LABEL (gtk_bin_get_child (GTK_BIN (my undoButton -> d_widget))), Melder_peekWcsToUtf8 (my undoText));
+		gtk_label_set_label (GTK_LABEL (gtk_bin_get_child (GTK_BIN (my undoButton -> d_widget))), Melder_peek32to8 (my undoText));
 	#elif cocoa
-		[(GuiCocoaMenuItem *) my undoButton -> d_widget   setTitle: (NSString *) Melder_peekWcsToCfstring (my undoText)];
+		[(GuiCocoaMenuItem *) my undoButton -> d_widget   setTitle: (NSString *) Melder_peek32toCfstring (my undoText)];
 	#elif motif
-		char *text_utf8 = Melder_peekWcsToUtf8 (my undoText);
-		XtVaSetValues (my undoButton -> d_widget, XmNlabelString, text_utf8, NULL);
+		char *text_utf8 = Melder_peek32to8 (my undoText);
+		XtVaSetValues (my undoButton -> d_widget, XmNlabelString, text_utf8, nullptr);
 	#endif
 	/*
 	 * Send a message to myself (e.g., I will redraw myself).
@@ -311,7 +311,7 @@ static void menu_cb_undo (EDITOR_ARGS) {
 	/*
 	 * Send a message to my boss (e.g., she will notify the others that depend on me).
 	 */
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void menu_cb_searchManual (EDITOR_ARGS) {
@@ -321,12 +321,12 @@ static void menu_cb_searchManual (EDITOR_ARGS) {
 
 static void menu_cb_newScript (EDITOR_ARGS) {
 	EDITOR_IAM (Editor);
-	(void) ScriptEditor_createFromText (me, NULL);
+	(void) ScriptEditor_createFromText (me, nullptr);
 }
 
 static void menu_cb_openScript (EDITOR_ARGS) {
 	EDITOR_IAM (Editor);
-	autoScriptEditor scriptEditor = ScriptEditor_createFromText (me, NULL);
+	autoScriptEditor scriptEditor = ScriptEditor_createFromText (me, nullptr);
 	TextEditor_showOpen (scriptEditor.transfer());
 }
 
@@ -336,7 +336,7 @@ void structEditor :: v_createMenuItems_file (EditorMenu menu) {
 
 void structEditor :: v_createMenuItems_edit (EditorMenu menu) {
 	if (our data)
-		our undoButton = EditorMenu_addCommand (menu, L"Cannot undo", GuiMenu_INSENSITIVE + 'Z', menu_cb_undo);
+		our undoButton = EditorMenu_addCommand (menu, U"Cannot undo", GuiMenu_INSENSITIVE + 'Z', menu_cb_undo);
 }
 
 static void menu_cb_settingsReport (EDITOR_ARGS) {
@@ -354,61 +354,58 @@ void structEditor :: v_createMenuItems_query (EditorMenu menu) {
 }
 
 void structEditor :: v_createMenuItems_query_info (EditorMenu menu) {
-	EditorMenu_addCommand (menu, L"Editor info", 0, menu_cb_settingsReport);
-	EditorMenu_addCommand (menu, L"Settings report", Editor_HIDDEN, menu_cb_settingsReport);
+	EditorMenu_addCommand (menu, U"Editor info", 0, menu_cb_settingsReport);
+	EditorMenu_addCommand (menu, U"Settings report", Editor_HIDDEN, menu_cb_settingsReport);
 	if (data) {
-		static MelderString title = { 0 };
-		MelderString_empty (& title);
-		MelderString_append (& title, Thing_className (data), L" info");
-		EditorMenu_addCommand (menu, title.string, 0, menu_cb_info);
+		EditorMenu_addCommand (menu, Melder_cat (Thing_className (data), U" info"), 0, menu_cb_info);
 	}
 }
 
 void structEditor :: v_createMenus () {
-	EditorMenu menu = Editor_addMenu (this, L"File", 0);
+	EditorMenu menu = Editor_addMenu (this, U"File", 0);
 	v_createMenuItems_file (menu);
 	if (v_editable ()) {
-		menu = Editor_addMenu (this, L"Edit", 0);
+		menu = Editor_addMenu (this, U"Edit", 0);
 		v_createMenuItems_edit (menu);
 	}
 	if (v_hasQueryMenu ()) {
-		menu = Editor_addMenu (this, L"Query", 0);
+		menu = Editor_addMenu (this, U"Query", 0);
 		v_createMenuItems_query (menu);
 	}
 }
 
 void structEditor :: v_form_pictureWindow (EditorCommand cmd) {
-	LABEL (L"", L"Picture window:")
-	BOOLEAN (L"Erase first", 1);
+	LABEL (U"", U"Picture window:")
+	BOOLEAN (U"Erase first", 1);
 }
 void structEditor :: v_ok_pictureWindow (EditorCommand cmd) {
-	SET_INTEGER (L"Erase first", pref_picture_eraseFirst ());
+	SET_INTEGER (U"Erase first", pref_picture_eraseFirst ());
 }
 void structEditor :: v_do_pictureWindow (EditorCommand cmd) {
-	pref_picture_eraseFirst () = GET_INTEGER (L"Erase first");
+	pref_picture_eraseFirst () = GET_INTEGER (U"Erase first");
 }
 
 void structEditor :: v_form_pictureMargins (EditorCommand cmd) {
 	Any radio = 0;
-	LABEL (L"", L"Margins:")
-	OPTIONMENU_ENUM (L"Write name at top", kEditor_writeNameAtTop, kEditor_writeNameAtTop_DEFAULT);
+	LABEL (U"", U"Margins:")
+	OPTIONMENU_ENUM (U"Write name at top", kEditor_writeNameAtTop, kEditor_writeNameAtTop_DEFAULT);
 }
 void structEditor :: v_ok_pictureMargins (EditorCommand cmd) {
-	SET_ENUM (L"Write name at top", kEditor_writeNameAtTop, pref_picture_writeNameAtTop ());
+	SET_ENUM (U"Write name at top", kEditor_writeNameAtTop, pref_picture_writeNameAtTop ());
 }
 void structEditor :: v_do_pictureMargins (EditorCommand cmd) {
-	pref_picture_writeNameAtTop () = GET_ENUM (kEditor_writeNameAtTop, L"Write name at top");
+	pref_picture_writeNameAtTop () = GET_ENUM (kEditor_writeNameAtTop, U"Write name at top");
 }
 
 static void gui_window_cb_goAway (I) {
 	iam (Editor);
-	Melder_assert (me != NULL);
-	Melder_assert (Thing_member (me, classEditor));
+	Melder_assert (me != nullptr);
+	Melder_assert (Thing_isa (me, classEditor));
 	my v_goAway ();
 }
 
 void praat_addCommandsToEditor (Editor me);
-void Editor_init (Editor me, int x, int y, int width, int height, const wchar_t *title, Data data) {
+void Editor_init (Editor me, int x, int y, int width, int height, const char32 *title, Daata data) {
 	double xmin, ymin, widthmax, heightmax;
 	Gui_getWindowPositioningBounds (& xmin, & ymin, & widthmax, & heightmax);
 	/*
@@ -468,7 +465,7 @@ void Editor_init (Editor me, int x, int y, int width, int height, const wchar_t
 		 * Zero y: randomize between the top and bottom of the screen.
 		 */
 		top = NUMrandomInteger ((int) ymin + 4, (int) ymin + (int) heightmax - height - 4);
-		//Melder_casual ("%d %d %d %d", (int) ymin, (int) heightmax, height, top);
+		//Melder_casual (ymin, U" ", heightmax, U" ", height, U" ", top);
 		bottom = top + height;
 	}
 	#if defined (macintoshXXX) || gtk
@@ -484,45 +481,45 @@ void Editor_init (Editor me, int x, int y, int width, int height, const wchar_t
 
 	if (my v_hasMenuBar ()) {
 		my menus = Ordered_create ();
-		my d_windowForm -> f_addMenuBar ();
+		GuiWindow_addMenuBar (my d_windowForm);
 	}
 
 	my v_createChildren ();
 
 	if (my v_hasMenuBar ()) {
 		my v_createMenus ();
-		EditorMenu helpMenu = Editor_addMenu (me, L"Help", 0);
+		EditorMenu helpMenu = Editor_addMenu (me, U"Help", 0);
 		my v_createHelpMenuItems (helpMenu);
-		EditorMenu_addCommand (helpMenu, L"-- search --", 0, NULL);
-		my searchButton = EditorMenu_addCommand (helpMenu, L"Search manual...", 'M', menu_cb_searchManual);
+		EditorMenu_addCommand (helpMenu, U"-- search --", 0, nullptr);
+		my searchButton = EditorMenu_addCommand (helpMenu, U"Search manual...", 'M', menu_cb_searchManual);
 		if (my v_scriptable ()) {
-			Editor_addCommand (me, L"File", L"New editor script", 0, menu_cb_newScript);
-			Editor_addCommand (me, L"File", L"Open editor script...", 0, menu_cb_openScript);
-			Editor_addCommand (me, L"File", L"-- after script --", 0, 0);
+			Editor_addCommand (me, U"File", U"New editor script", 0, menu_cb_newScript);
+			Editor_addCommand (me, U"File", U"Open editor script...", 0, menu_cb_openScript);
+			Editor_addCommand (me, U"File", U"-- after script --", 0, 0);
 		}
 		/*
 		 * Add the scripted commands.
 		 */
 		praat_addCommandsToEditor (me);
 		if (my callbackSocket)
-			Editor_addCommand (me, L"File", L"Send back to calling program", 0, menu_cb_sendBackToCallingProgram);
-		Editor_addCommand (me, L"File", L"Close", 'W', menu_cb_close);
+			Editor_addCommand (me, U"File", U"Send back to calling program", 0, menu_cb_sendBackToCallingProgram);
+		Editor_addCommand (me, U"File", U"Close", 'W', menu_cb_close);
 	}
-	my d_windowForm -> f_show ();
+	GuiThing_show (my d_windowForm);
 }
 
-void Editor_save (Editor me, const wchar_t *text) {
+void Editor_save (Editor me, const char32 *text) {
 	my v_saveData ();
 	if (! my undoButton) return;
-	my undoButton -> f_setSensitive (true);
-	swprintf (my undoText, 100, L"Undo %ls", text);
+	GuiThing_setSensitive (my undoButton, true);
+	Melder_sprint (my undoText,100, U"Undo ", text);
 	#if gtk
-		gtk_label_set_label (GTK_LABEL (gtk_bin_get_child (GTK_BIN (my undoButton -> d_widget))), Melder_peekWcsToUtf8 (my undoText));
+		gtk_label_set_label (GTK_LABEL (gtk_bin_get_child (GTK_BIN (my undoButton -> d_widget))), Melder_peek32to8 (my undoText));
 	#elif cocoa
-		[(GuiCocoaMenuItem *) my undoButton -> d_widget   setTitle: (NSString *) Melder_peekWcsToCfstring (my undoText)];
+		[(GuiCocoaMenuItem *) my undoButton -> d_widget   setTitle: (NSString *) Melder_peek32toCfstring (my undoText)];
 	#elif motif
-		char *text_utf8 = Melder_peekWcsToUtf8 (my undoText);
-		XtVaSetValues (my undoButton -> d_widget, XmNlabelString, text_utf8, NULL);
+		char *text_utf8 = Melder_peek32to8 (my undoText);
+		XtVaSetValues (my undoButton -> d_widget, XmNlabelString, text_utf8, nullptr);
 	#endif
 }
 
@@ -530,7 +527,7 @@ void Editor_openPraatPicture (Editor me) {
 	my pictureGraphics = praat_picture_editor_open (my pref_picture_eraseFirst ());
 }
 void Editor_closePraatPicture (Editor me) {
-	if (my data != NULL && my pref_picture_writeNameAtTop () != kEditor_writeNameAtTop_NO) {
+	if (my data && my pref_picture_writeNameAtTop () != kEditor_writeNameAtTop_NO) {
 		Graphics_setNumberSignIsBold (my pictureGraphics, false);
 		Graphics_setPercentSignIsItalic (my pictureGraphics, false);
 		Graphics_setCircumflexIsSuperscript (my pictureGraphics, false);
diff --git a/sys/Editor.h b/sys/Editor.h
index 4521723..e0fbec7 100644
--- a/sys/Editor.h
+++ b/sys/Editor.h
@@ -2,7 +2,7 @@
 #define _Editor_h_
 /* Editor.h
  *
- * Copyright (C) 1992-2012,2013.2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,197 +30,183 @@
 Thing_declare (Editor);
 
 Thing_define (EditorMenu, Thing) {
-	// new data:
-	public:
-		Editor d_editor;
-		const wchar_t *menuTitle;
-		GuiMenu menuWidget;
-		Ordered commands;
-	// overridden methods:
-		virtual void v_destroy ();
+	Editor d_editor;
+	const char32 *menuTitle;
+	GuiMenu menuWidget;
+	Ordered commands;
+
+	void v_destroy ()
+		override;
 };
 
 Thing_define (EditorCommand, Thing) {
-	// new data:
-	public:
-		Editor d_editor;
-		EditorMenu menu;
-		const wchar_t *itemTitle;
-		GuiMenuItem itemWidget;
-		void (*commandCallback) (Editor editor_me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter);
-		const wchar_t *script;
-		UiForm d_uiform;
-	// overridden methods:
-		virtual void v_destroy ();
+	Editor d_editor;
+	EditorMenu menu;
+	const char32 *itemTitle;
+	GuiMenuItem itemWidget;
+	void (*commandCallback) (Editor editor_me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter);
+	const char32 *script;
+	UiForm d_uiform;
+
+	void v_destroy ()
+		override;
 };
 
 Thing_define (Editor, Thing) {
+	GuiWindow d_windowForm;
+	GuiMenuItem undoButton, searchButton;
+	Ordered menus;
+	Daata data, previousData;   // the data that can be displayed and edited
+	bool d_ownData;
+	char32 undoText [100];
+	Graphics pictureGraphics;
+	void (*d_dataChangedCallback) (Editor me, void *closure);                    void *d_dataChangedClosure;
+	void (*d_destructionCallback) (Editor me, void *closure);                    void *d_destructionClosure;
+	void (*d_publicationCallback) (Editor me, void *closure, Daata publication); void *d_publicationClosure;
+	const char *callbackSocket;
+
+	void v_destroy ()
+		override;
+	void v_info ()
+		override;
+	void v_nameChanged ()
+		override;   // sets the window and icon titles to reflect the new name
+
+	virtual void v_goAway () { forget_nozero (this); }
+	virtual bool v_hasMenuBar () { return true; }
+	virtual bool v_canFullScreen () { return false; }
+	virtual bool v_editable () { return true ; }
+	virtual bool v_scriptable () { return true; }
+	virtual void v_createMenuItems_file (EditorMenu menu);
+	virtual void v_createMenuItems_edit (EditorMenu menu);
+	virtual bool v_hasQueryMenu () { return true; }
+	virtual void v_createMenuItems_query (EditorMenu menu);
+	virtual void v_createMenuItems_query_info (EditorMenu menu);
+	virtual void v_createMenus ();
+	virtual void v_createHelpMenuItems (EditorMenu menu) { (void) menu; }
+	virtual void v_createChildren () { }
+	virtual void v_dataChanged () { }
+	virtual void v_saveData ();
+	virtual void v_restoreData ();
+	virtual void v_form_pictureWindow (EditorCommand cmd);
+	virtual void v_ok_pictureWindow (EditorCommand cmd);
+	virtual void v_do_pictureWindow (EditorCommand cmd);
+	virtual void v_form_pictureMargins (EditorCommand cmd);
+	virtual void v_ok_pictureMargins (EditorCommand cmd);
+	virtual void v_do_pictureMargins (EditorCommand cmd);
 
-	// new data:
-	public:
-		GuiWindow d_windowForm;
-		GuiMenuItem undoButton, searchButton;
-		Ordered menus;
-		Data data, previousData;   // the data that can be displayed and edited
-		bool d_ownData;
-		wchar_t undoText [100];
-		Graphics pictureGraphics;
-		void (*d_dataChangedCallback) (Editor me, void *closure);                   void *d_dataChangedClosure;
-		void (*d_destructionCallback) (Editor me, void *closure);                   void *d_destructionClosure;
-		void (*d_publicationCallback) (Editor me, void *closure, Data publication); void *d_publicationClosure;
-		const char *callbackSocket;
-
-	// new messages:
-	public:
-
-		void raise ()
-			/*
-			 * Message: "move your window to the front", i.e.
-			 *    if you are invisible, then make your window visible at the front;
-			 *    if you are iconized, then deiconize yourself at the front;
-			 *    if you are already visible, just move your window to the front."
-			 */
-			{
-				d_windowForm -> f_show ();
-			}
-
-		void dataChanged ()
-			/*
-			 * Message: "your data has changed by an action from *outside* yourself,
-			 *    so you may e.g. like to redraw yourself."
-			 */
-			{
-				v_dataChanged ();
-			}
-
-		void setDataChangedCallback (void (*dataChangedCallback) (Editor me, void *closure), void *dataChangedClosure)
-			/*
-			 * Message from boss: "notify me by calling this dataChangedCallback every time your data is changed from *inside* yourself."
-			 *
-			 * In Praat, the dataChangedCallback is useful if there is more than one editor
-			 * with the same data; in this case, the owner of all those editors will
-			 * (in the dataChangedCallback it installed) notify the change to the other editors
-			 * by sending them a dataChanged () message.
-			 */
-			{
-				d_dataChangedCallback = dataChangedCallback;
-				d_dataChangedClosure = dataChangedClosure;
-			}
-
-		void broadcastDataChanged ()
-			/*
-			 * Message to boss: "my data has changed by an action from inside myself."
-			 *
-			 * The editor has to call this after every menu command, click or key press that causes a change in the data.
-			 */
-			{
-				if (d_dataChangedCallback)
-					d_dataChangedCallback (this, d_dataChangedClosure);
-			}
-
-		void setDestructionCallback (void (*destructionCallback) (Editor me, void *closure), void *destructionClosure)
-			/*
-			 * Message from boss: "notify me by calling this destructionCallback every time you destroy yourself."
-			 *
-			 * In Praat, "destroying yourself" typically happens when the user closes the editor window
-			 * or when an object that is being viewed in an editor window is "Remove"d.
-			 * Typically, the boss will (in the destructionCallback it installed) remove all dangling references to this editor.
-			 */
-			{
-				d_destructionCallback = destructionCallback;
-				d_destructionClosure = destructionClosure;
-			}
-
-		void broadcastDestruction ()
-			/*
-			 * Message to boss: "I am destroying all my members and will free myself shortly."
-			 *
-			 * The editor calls this once, namely in Editor::v_destroy().
-			 */
-			{
-				if (d_destructionCallback)
-					d_destructionCallback (this, d_destructionClosure);
-			}
-
-		void setPublicationCallback (void (*publicationCallback) (Editor me, void *closure, Data publication), void *publicationClosure)
-			/*
-			 * Message from boss: "notify me by calling this publicationCallback every time you have a piece of data to publish."
-			 *
-			 * In Praat, editors typically "publish" a piece of data when the user chooses
-			 * things like "Extract selected sound", "Extract visible pitch curve", or "View spectral slice".
-			 * Typically, the boss will (in the publicationCallback it installed) install the published data in Praat's object list,
-			 * but the editor doesn't have to know that.
-			 */
-			{
-				d_publicationCallback = publicationCallback;
-				d_publicationClosure = publicationClosure;
-			}
-
-		void broadcastPublication (Data publication)
-			/*
-			 * Message to boss: "I have a piece of data for you to publish."
-			 *
-			 * The editor has to call this every time the user wants to "publish" ("Extract") some data from the editor.
-			 *
-			 * Constraint: "publication" has to be new data, either "extracted" or "copied" from data in the editor.
-			 * The boss becomes the owner of this published data,
-			 * so the call to broadcastPublication() has to transfer ownership of "publication".
-			 */
-			{
-				if (d_publicationCallback)
-					d_publicationCallback (this, d_publicationClosure, publication);
-			}
-
-	// overridden methods:
-	protected:
-		virtual void v_destroy ();
-		virtual void v_info ();
-		virtual void v_nameChanged ();   // sets the window and icon titles to reflect the new name
-	// new methods:
-	public:
-		virtual void v_goAway () { forget_nozero (this); }
-		virtual bool v_hasMenuBar () { return true; }
-		virtual bool v_canFullScreen () { return false; }
-		virtual bool v_editable () { return true ; }
-		virtual bool v_scriptable () { return true; }
-		virtual void v_createMenuItems_file (EditorMenu menu);
-		virtual void v_createMenuItems_edit (EditorMenu menu);
-		virtual bool v_hasQueryMenu () { return true; }
-		virtual void v_createMenuItems_query (EditorMenu menu);
-		virtual void v_createMenuItems_query_info (EditorMenu menu);
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu) { (void) menu; }
-		virtual void v_createChildren () { }
-		virtual void v_dataChanged () { }
-		virtual void v_saveData ();
-		virtual void v_restoreData ();
-		virtual void v_form_pictureWindow (EditorCommand cmd);
-		virtual void v_ok_pictureWindow (EditorCommand cmd);
-		virtual void v_do_pictureWindow (EditorCommand cmd);
-		virtual void v_form_pictureMargins (EditorCommand cmd);
-		virtual void v_ok_pictureMargins (EditorCommand cmd);
-		virtual void v_do_pictureMargins (EditorCommand cmd);
 	#include "Editor_prefs.h"
 };
 
-GuiMenuItem EditorMenu_addCommand (EditorMenu me, const wchar_t *itemTitle, long flags,
-	void (*commandCallback) (Editor me, EditorCommand, UiForm, int, Stackel, const wchar_t *, Interpreter));
+GuiMenuItem EditorMenu_addCommand (EditorMenu me, const char32 *itemTitle /* cattable */, long flags,
+	void (*commandCallback) (Editor me, EditorCommand, UiForm, int, Stackel, const char32 *, Interpreter));
 GuiMenuItem EditorCommand_getItemWidget (EditorCommand me);
 
-EditorMenu Editor_addMenu (Editor me, const wchar_t *menuTitle, long flags);
+EditorMenu Editor_addMenu (Editor me, const char32 *menuTitle, long flags);
 GuiObject EditorMenu_getMenuWidget (EditorMenu me);
 
 #define Editor_HIDDEN  (1 << 14)
-GuiMenuItem Editor_addCommand (Editor me, const wchar_t *menuTitle, const wchar_t *itemTitle, long flags,
-	void (*commandCallback) (Editor me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter));
-GuiMenuItem Editor_addCommandScript (Editor me, const wchar_t *menuTitle, const wchar_t *itemTitle, long flags,
-	const wchar_t *script);
-void Editor_setMenuSensitive (Editor me, const wchar_t *menu, int sensitive);
+GuiMenuItem Editor_addCommand (Editor me, const char32 *menuTitle, const char32 *itemTitle, long flags,
+	void (*commandCallback) (Editor me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter));
+GuiMenuItem Editor_addCommandScript (Editor me, const char32 *menuTitle, const char32 *itemTitle, long flags,
+	const char32 *script);
+void Editor_setMenuSensitive (Editor me, const char32 *menu, int sensitive);
+
+inline static void Editor_raise (Editor me)
+	/*
+	 * Message: "move your window to the front", i.e.
+	 *    if you are invisible, then make your window visible at the front;
+	 *    if you are iconized, then deiconize yourself at the front;
+	 *    if you are already visible, just move your window to the front."
+	 */
+	{
+		GuiThing_show (my d_windowForm);
+	}
+inline static void Editor_dataChanged (Editor me)
+	/*
+	 * Message: "your data has changed by an action from *outside* yourself,
+	 *    so you may e.g. like to redraw yourself."
+	 */
+	{
+		my v_dataChanged ();
+	}
+inline static void Editor_setDataChangedCallback (Editor me, void (*dataChangedCallback) (Editor me, void *closure), void *dataChangedClosure)
+	/*
+	 * Message from boss: "notify me by calling this dataChangedCallback every time your data is changed from *inside* yourself."
+	 *
+	 * In Praat, the dataChangedCallback is useful if there is more than one editor
+	 * with the same data; in this case, the owner of all those editors will
+	 * (in the dataChangedCallback it installed) notify the change to the other editors
+	 * by sending them a dataChanged () message.
+	 */
+	{
+		my d_dataChangedCallback = dataChangedCallback;
+		my d_dataChangedClosure = dataChangedClosure;
+	}
+inline static void Editor_broadcastDataChanged (Editor me)
+	/*
+	 * Message to boss: "my data has changed by an action from inside myself."
+	 *
+	 * The editor has to call this after every menu command, click or key press that causes a change in the data.
+	 */
+	{
+		if (my d_dataChangedCallback)
+			my d_dataChangedCallback (me, my d_dataChangedClosure);
+	}
+inline static void Editor_setDestructionCallback (Editor me, void (*destructionCallback) (Editor me, void *closure), void *destructionClosure)
+	/*
+	 * Message from boss: "notify me by calling this destructionCallback every time you destroy yourself."
+	 *
+	 * In Praat, "destroying yourself" typically happens when the user closes the editor window
+	 * or when an object that is being viewed in an editor window is "Remove"d.
+	 * Typically, the boss will (in the destructionCallback it installed) remove all dangling references to this editor.
+	 */
+	{
+		my d_destructionCallback = destructionCallback;
+		my d_destructionClosure = destructionClosure;
+	}
+inline static void Editor_broadcastDestruction (Editor me)
+	/*
+	 * Message to boss: "I am destroying all my members and will free myself shortly."
+	 *
+	 * The editor calls this once, namely in Editor::v_destroy().
+	 */
+	{
+		if (my d_destructionCallback)
+			my d_destructionCallback (me, my d_destructionClosure);
+	}
+inline static void Editor_setPublicationCallback (Editor me, void (*publicationCallback) (Editor me, void *closure, Daata publication), void *publicationClosure)
+	/*
+	 * Message from boss: "notify me by calling this publicationCallback every time you have a piece of data to publish."
+	 *
+	 * In Praat, editors typically "publish" a piece of data when the user chooses
+	 * things like "Extract selected sound", "Extract visible pitch curve", or "View spectral slice".
+	 * Typically, the boss will (in the publicationCallback it installed) install the published data in Praat's object list,
+	 * but the editor doesn't have to know that.
+	 */
+	{
+		my d_publicationCallback = publicationCallback;
+		my d_publicationClosure = publicationClosure;
+	}
+inline static void Editor_broadcastPublication (Editor me, Daata publication)
+	/*
+	 * Message to boss: "I have a piece of data for you to publish."
+	 *
+	 * The editor has to call this every time the user wants to "publish" ("Extract") some data from the editor.
+	 *
+	 * Constraint: "publication" has to be new data, either "extracted" or "copied" from data in the editor.
+	 * The boss becomes the owner of this published data,
+	 * so the call to broadcastPublication() has to transfer ownership of "publication".
+	 */
+	{
+		if (my d_publicationCallback)
+			my d_publicationCallback (me, my d_publicationClosure, publication);
+	}
 
 /***** For inheritors. *****/
 
 void Editor_init (Editor me, int x, int y , int width, int height,
-	const wchar_t *title, Data data);
+	const char32 *title, Daata data);
 /*
 	This creates my shell and my d_windowForm,
 	calls the v_createMenus and v_createChildren methods,
@@ -241,22 +227,22 @@ void Editor_init (Editor me, int x, int y , int width, int height,
 	and the Editor will not destroy 'data' when the Editor itself is destroyed.
 */
 
-void Editor_save (Editor me, const wchar_t *text);   // for Undo
+void Editor_save (Editor me, const char32 *text);   // for Undo
 
-UiForm UiForm_createE (EditorCommand cmd, const wchar_t *title, const wchar_t *invokingButtonTitle, const wchar_t *helpTitle);
-void UiForm_parseStringE (EditorCommand cmd, int narg, Stackel args, const wchar_t *arguments, Interpreter interpreter);
-UiForm UiOutfile_createE (EditorCommand cmd, const wchar_t *title, const wchar_t *invokingButtonTitle, const wchar_t *helpTitle);
-UiForm UiInfile_createE (EditorCommand cmd, const wchar_t *title, const wchar_t *invokingButtonTitle, const wchar_t *helpTitle);
+UiForm UiForm_createE (EditorCommand cmd, const char32 *title, const char32 *invokingButtonTitle, const char32 *helpTitle);
+void UiForm_parseStringE (EditorCommand cmd, int narg, Stackel args, const char32 *arguments, Interpreter interpreter);
+UiForm UiOutfile_createE (EditorCommand cmd, const char32 *title, const char32 *invokingButtonTitle, const char32 *helpTitle);
+UiForm UiInfile_createE (EditorCommand cmd, const char32 *title, const char32 *invokingButtonTitle, const char32 *helpTitle);
 
-EditorCommand Editor_getMenuCommand (Editor me, const wchar_t *menuTitle, const wchar_t *itemTitle);
-void Editor_doMenuCommand (Editor me, const wchar_t *command, int narg, Stackel args, const wchar_t *arguments, Interpreter interpreter);
+EditorCommand Editor_getMenuCommand (Editor me, const char32 *menuTitle, const char32 *itemTitle);
+void Editor_doMenuCommand (Editor me, const char32 *command, int narg, Stackel args, const char32 *arguments, Interpreter interpreter);
 
 /*
  * The following two procedures are in praat_picture.cpp.
  * They allow editors to draw into the Picture window.
  */
 Graphics praat_picture_editor_open (bool eraseFirst);
-void praat_picture_editor_close (void);
+void praat_picture_editor_close ();
 void Editor_openPraatPicture (Editor me);
 void Editor_closePraatPicture (Editor me);
 
diff --git a/sys/EditorM.h b/sys/EditorM.h
index 8264f5f..7c4a680 100644
--- a/sys/EditorM.h
+++ b/sys/EditorM.h
@@ -2,7 +2,7 @@
 #define _EditorM_h_
 /* EditorM.h
  *
- * Copyright (C) 1992-2011,2013 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -89,31 +89,31 @@
 
 #define DIALOG  cmd -> d_uiform
 
-#define EDITOR_ARGS  Editor void_me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter
+#define EDITOR_ARGS  Editor void_me, EditorCommand cmd, UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter
 #define EDITOR_IAM(klas)  iam (klas); (void) me; (void) cmd; (void) sendingForm; (void) narg; (void) args; (void) sendingString; (void) interpreter
-#define EDITOR_FORM(title,helpTitle)  if (cmd -> d_uiform == NULL) { Any radio = 0; (void) radio; \
+#define EDITOR_FORM(title,helpTitle)  if (! cmd -> d_uiform) { Any radio = 0; (void) radio; \
 	cmd -> d_uiform = UiForm_createE (cmd, title, cmd -> itemTitle, helpTitle);
-#define EDITOR_OK  UiForm_finish (cmd -> d_uiform); } if (sendingForm == NULL && args == NULL && sendingString == NULL) {
-#define EDITOR_DO  UiForm_do (cmd -> d_uiform, false); } else if (sendingForm == NULL) { \
+#define EDITOR_OK  UiForm_finish (cmd -> d_uiform); } if (! sendingForm && ! args && ! sendingString) {
+#define EDITOR_DO  UiForm_do (cmd -> d_uiform, false); } else if (! sendingForm) { \
 	UiForm_parseStringE (cmd, narg, args, sendingString, interpreter); } else {
 #define EDITOR_END  }
 
 #define EDITOR_FORM_WRITE(title,helpTitle) \
-	if (cmd -> d_uiform == NULL) { \
+	if (! cmd -> d_uiform) { \
 		cmd -> d_uiform = UiOutfile_createE (cmd, title, cmd -> itemTitle, helpTitle); \
-		} if (sendingForm == NULL && args == NULL && sendingString == NULL) { wchar_t defaultName [300]; defaultName [0] = '\0';
+		} if (! sendingForm && ! args && ! sendingString) { char32 defaultName [300]; defaultName [0] = U'\0';
 #define EDITOR_DO_WRITE \
 	UiOutfile_do (cmd -> d_uiform, defaultName); } else { MelderFile file; structMelderFile file2 = { 0 }; \
-		if (args == NULL && sendingString == NULL) file = UiFile_getFile (sendingForm); \
+		if (! args && ! sendingString) file = UiFile_getFile (sendingForm); \
 		else { Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); file = & file2; }
 
 #define EDITOR_FORM_READ(title,helpTitle) \
-	if (cmd -> d_uiform == NULL) { \
+	if (! cmd -> d_uiform) { \
 		cmd -> d_uiform = UiInfile_createE (cmd, title, cmd -> itemTitle, helpTitle); \
-		} if (sendingForm == NULL && args == NULL && sendingString == NULL) {
+		} if (! sendingForm && ! args && ! sendingString) {
 #define EDITOR_DO_READ \
 	UiInfile_do (cmd -> d_uiform); } else { MelderFile file; structMelderFile file2 = { 0 }; \
-		if (args == NULL && sendingString == NULL) file = UiFile_getFile (sendingForm); \
+		if (! args && ! sendingString) file = UiFile_getFile (sendingForm); \
 		else { Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); file = & file2; }
 
 #define GET_REAL(name)  UiForm_getReal (cmd -> d_uiform, name)
diff --git a/sys/Editor_enums.h b/sys/Editor_enums.h
index 412164e..104d164 100644
--- a/sys/Editor_enums.h
+++ b/sys/Editor_enums.h
@@ -1,6 +1,6 @@
 /* Editor_enums.h
  *
- * Copyright (C) 1992-2007,2013 Paul Boersma
+ * Copyright (C) 1992-2007,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,9 +18,9 @@
  */
 
 enums_begin (kEditor_writeNameAtTop, 0)
-	enums_add (kEditor_writeNameAtTop, 0, NO, L"no")
-	enums_add (kEditor_writeNameAtTop, 1, FAR, L"far")
-	enums_add (kEditor_writeNameAtTop, 2, NEAR, L"near")
+	enums_add (kEditor_writeNameAtTop, 0, NO, U"no")
+	enums_add (kEditor_writeNameAtTop, 1, FAR, U"far")
+	enums_add (kEditor_writeNameAtTop, 2, NEAR, U"near")
 enums_end (kEditor_writeNameAtTop, 2, FAR)
 
 /* End of file Editor_enums.h */
diff --git a/sys/Editor_prefs.h b/sys/Editor_prefs.h
index 6517d59..9090e8a 100644
--- a/sys/Editor_prefs.h
+++ b/sys/Editor_prefs.h
@@ -18,9 +18,10 @@
  */
 
 prefs_begin (Editor)
-	// new:
-		prefs_add_bool   (Editor, picture_eraseFirst,     1, true)
-		prefs_add_enum   (Editor, picture_writeNameAtTop, 1, kEditor_writeNameAtTop, DEFAULT)
+
+	prefs_add_bool   (Editor, picture_eraseFirst,     1, true)
+	prefs_add_enum   (Editor, picture_writeNameAtTop, 1, kEditor_writeNameAtTop, DEFAULT)
+
 prefs_end (Editor)
 
 /* End of file Editor_prefs.h */
diff --git a/sys/Formula.cpp b/sys/Formula.cpp
index 531ce98..724f081 100644
--- a/sys/Formula.cpp
+++ b/sys/Formula.cpp
@@ -1,6 +1,6 @@
 /* Formula.cpp
  *
- * Copyright (C) 1992-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,14 +36,14 @@
 #include "DemoEditor.h"
 
 static Interpreter theInterpreter, theLocalInterpreter;
-static Data theSource;
-static const wchar_t *theExpression;
+static Daata theSource;
+static const char32 *theExpression;
 static int theLevel = 1;
 #define MAXIMUM_NUMBER_OF_LEVELS  20
 static int theExpressionType [1 + MAXIMUM_NUMBER_OF_LEVELS];
-static int theOptimize;
+static bool theOptimize;
 
-static struct Formula_NumericArray theZeroNumericArray = { 0, 0, NULL };
+static struct Formula_NumericArray theZeroNumericArray = { 0, 0, nullptr };
 
 typedef struct structFormulaInstruction {
 	int symbol;
@@ -51,9 +51,9 @@ typedef struct structFormulaInstruction {
 	union {
 		double number;
 		int label;
-		wchar_t *string;
+		char32 *string;
 		//struct Formula_NumericArray numericArray;
-		Data object;
+		Daata object;
 		InterpreterVariable variable;
 	} content;
 } *FormulaInstruction;
@@ -137,8 +137,8 @@ enum { GEENSYMBOOL_,
 		DEMO_CLICKED_, DEMO_X_, DEMO_Y_, DEMO_KEY_PRESSED_, DEMO_KEY_,
 		DEMO_SHIFT_KEY_PRESSED_, DEMO_COMMAND_KEY_PRESSED_, DEMO_OPTION_KEY_PRESSED_, DEMO_EXTRA_CONTROL_KEY_PRESSED_,
 		ZERO_NUMAR_, LINEAR_NUMAR_, RANDOM_UNIFORM_NUMAR_, RANDOM_INTEGER_NUMAR_, RANDOM_GAUSS_NUMAR_,
-		NUMBER_OF_ROWS_, NUMBER_OF_COLUMNS_, EDITOR_,
-	#define HIGH_FUNCTION_N  EDITOR_
+		NUMBER_OF_ROWS_, NUMBER_OF_COLUMNS_, EDITOR_, HASH_,
+	#define HIGH_FUNCTION_N  HASH_
 
 	/* String functions. */
 	#define LOW_STRING_FUNCTION  LOW_FUNCTION_STR1
@@ -193,118 +193,118 @@ enum { GEENSYMBOOL_,
 /* The names that start with an underscore (_) do not occur in the formula text: */
 /* they are used in error messages and in debugging (see Formula_print). */
 
-static const wchar_t *Formula_instructionNames [1 + hoogsteSymbool] = { L"",
-	L"if", L"then", L"else", L"(", L"[", L",", L":", L"from", L"to",
-	L"or", L"and", L"not", L"=", L"<>", L"<=", L"<", L">=", L">",
-	L"+", L"-", L"*", L"/", L"div", L"mod", L"^", L"_call", L"_neg",
-	L"endif", L"fi", L")", L"]",
-	L"a number", L"pi", L"e", L"undefined",
-	L"xmin", L"xmax", L"ymin", L"ymax", L"nx", L"ny", L"dx", L"dy",
-	L"row", L"col", L"nrow", L"ncol", L"row$", L"col$", L"y", L"x",
-	L"self", L"self$", L"object", L"object$", L"_matriks", L"_matriks$",
-	L"stopwatch",
-	L"abs", L"round", L"floor", L"ceiling", L"sqrt", L"sin", L"cos", L"tan", L"arcsin", L"arccos", L"arctan", L"sinc", L"sincpi",
-	L"exp", L"sinh", L"cosh", L"tanh", L"arcsinh", L"arccosh", L"arctanh",
-	L"sigmoid", L"invSigmoid", L"erf", L"erfc", L"gaussP", L"gaussQ", L"invGaussQ",
-	L"randomPoisson", L"log2", L"ln", L"log10", L"lnGamma",
-	L"hertzToBark", L"barkToHertz", L"phonToDifferenceLimens", L"differenceLimensToPhon",
-	L"hertzToMel", L"melToHertz", L"hertzToSemitones", L"semitonesToHertz",
-	L"erb", L"hertzToErb", L"erbToHertz",
-	L"string$",
-	L"arctan2", L"randomUniform", L"randomInteger", L"randomGauss", L"randomBinomial",
-	L"chiSquareP", L"chiSquareQ", L"incompleteGammaP", L"invChiSquareQ", L"studentP", L"studentQ", L"invStudentQ",
-	L"beta", L"beta2", L"besselI", L"besselK", L"lnBeta",
-	L"soundPressureToPhon", L"objectsAreIdentical",
-	L"fisherP", L"fisherQ", L"invFisherQ",
-	L"binomialP", L"binomialQ", L"incompleteBeta", L"invBinomialP", L"invBinomialQ",
+static const char32 *Formula_instructionNames [1 + hoogsteSymbool] = { U"",
+	U"if", U"then", U"else", U"(", U"[", U",", U":", U"from", U"to",
+	U"or", U"and", U"not", U"=", U"<>", U"<=", U"<", U">=", U">",
+	U"+", U"-", U"*", U"/", U"div", U"mod", U"^", U"_call", U"_neg",
+	U"endif", U"fi", U")", U"]",
+	U"a number", U"pi", U"e", U"undefined",
+	U"xmin", U"xmax", U"ymin", U"ymax", U"nx", U"ny", U"dx", U"dy",
+	U"row", U"col", U"nrow", U"ncol", U"row$", U"col$", U"y", U"x",
+	U"self", U"self$", U"object", U"object$", U"_matriks", U"_matriks$",
+	U"stopwatch",
+	U"abs", U"round", U"floor", U"ceiling", U"sqrt", U"sin", U"cos", U"tan", U"arcsin", U"arccos", U"arctan", U"sinc", U"sincpi",
+	U"exp", U"sinh", U"cosh", U"tanh", U"arcsinh", U"arccosh", U"arctanh",
+	U"sigmoid", U"invSigmoid", U"erf", U"erfc", U"gaussP", U"gaussQ", U"invGaussQ",
+	U"randomPoisson", U"log2", U"ln", U"log10", U"lnGamma",
+	U"hertzToBark", U"barkToHertz", U"phonToDifferenceLimens", U"differenceLimensToPhon",
+	U"hertzToMel", U"melToHertz", U"hertzToSemitones", U"semitonesToHertz",
+	U"erb", U"hertzToErb", U"erbToHertz",
+	U"string$",
+	U"arctan2", U"randomUniform", U"randomInteger", U"randomGauss", U"randomBinomial",
+	U"chiSquareP", U"chiSquareQ", U"incompleteGammaP", U"invChiSquareQ", U"studentP", U"studentQ", U"invStudentQ",
+	U"beta", U"beta2", U"besselI", U"besselK", U"lnBeta",
+	U"soundPressureToPhon", U"objectsAreIdentical",
+	U"fisherP", U"fisherQ", U"invFisherQ",
+	U"binomialP", U"binomialQ", U"incompleteBeta", U"invBinomialP", U"invBinomialQ",
 
-	L"do", L"do$",
-	L"writeInfo", L"writeInfoLine", L"appendInfo", L"appendInfoLine",
-	L"writeFile", L"writeFileLine", L"appendFile", L"appendFileLine",
-	L"pauseScript", L"exitScript", L"runScript", L"runSystem", L"runSystem_nocheck",
-	L"min", L"max", L"imin", L"imax",
-	L"left$", L"right$", L"mid$",
-	L"selected", L"selected$", L"numberOfSelected", L"selectObject", L"plusObject", L"minusObject", L"removeObject",
-	L"beginPause", L"real", L"positive", L"integer", L"natural",
-	L"word", L"sentence", L"text", L"boolean",
-	L"choice", L"optionMenu", L"option",
-	L"comment", L"endPause",
-	L"chooseReadFile$", L"chooseWriteFile$", L"chooseDirectory$",
-	L"demoWindowTitle", L"demoShow", L"demoWaitForInput", L"demoInput", L"demoClickedIn",
-	L"demoClicked", L"demoX", L"demoY", L"demoKeyPressed", L"demoKey$",
-	L"demoShiftKeyPressed", L"demoCommandKeyPressed", L"demoOptionKeyPressed", L"demoExtraControlKeyPressed",
-	L"zero#", L"linear#", L"randomUniform#", L"randomInteger#", L"randomGauss#",
-	L"numberOfRows", L"numberOfColumns", L"editor",
+	U"do", U"do$",
+	U"writeInfo", U"writeInfoLine", U"appendInfo", U"appendInfoLine",
+	U"writeFile", U"writeFileLine", U"appendFile", U"appendFileLine",
+	U"pauseScript", U"exitScript", U"runScript", U"runSystem", U"runSystem_nocheck",
+	U"min", U"max", U"imin", U"imax",
+	U"left$", U"right$", U"mid$",
+	U"selected", U"selected$", U"numberOfSelected", U"selectObject", U"plusObject", U"minusObject", U"removeObject",
+	U"beginPause", U"real", U"positive", U"integer", U"natural",
+	U"word", U"sentence", U"text", U"boolean",
+	U"choice", U"optionMenu", U"option",
+	U"comment", U"endPause",
+	U"chooseReadFile$", U"chooseWriteFile$", U"chooseDirectory$",
+	U"demoWindowTitle", U"demoShow", U"demoWaitForInput", U"demoInput", U"demoClickedIn",
+	U"demoClicked", U"demoX", U"demoY", U"demoKeyPressed", U"demoKey$",
+	U"demoShiftKeyPressed", U"demoCommandKeyPressed", U"demoOptionKeyPressed", U"demoExtraControlKeyPressed",
+	U"zero#", U"linear#", U"randomUniform#", U"randomInteger#", U"randomGauss#",
+	U"numberOfRows", U"numberOfColumns", U"editor", U"hash",
 
-	L"length", L"number", L"fileReadable",	L"deleteFile", L"createDirectory", L"variableExists",
-	L"readFile", L"readFile$", L"unicodeToBackslashTrigraphs$", L"backslashTrigraphsToUnicode$", L"environment$",
-	L"date$", L"info$",
-	L"index", L"rindex",
-	L"startsWith", L"endsWith", L"replace$", L"index_regex", L"rindex_regex", L"replace_regex$",
-	L"extractNumber", L"extractWord$", L"extractLine$",
-	L"fixed$", L"percent$",
-	L"sum",
-	L".",
-	L"_true", L"_false",
-	L"_goto", L"_iftrue", L"_iffalse", L"_incrementGreaterGoto",
-	L"_label",
-	L"_decrementAndAssign", L"_add3Down", L"_pop2",
-	L"_numericArrayElement", L"_variableReference",
-	L"_self0", L"_self0$",
-	L"_objectcell0", L"_objectcell0$", L"_objectcell1", L"_objectcell1$", L"_objectcell2", L"_objectcell2$",
-	L"_objectlocation0", L"_objectlocation0$", L"_objectlocation1", L"_objectlocation1$", L"_objectlocation2", L"_objectlocation2$",
-	L"_selfmatriks1", L"_selfmatriks1$", L"_selfmatriks2", L"_selfmatriks2$",
-	L"_selffunktie1", L"_selffunktie1$", L"_selffunktie2", L"_selffunktie2$",
-	L"_matriks0", L"_matriks0$", L"_matriks1", L"_matriks1$", L"_matriks2", L"_matriks2$",
-	L"_funktie0", L"_funktie0$", L"_funktie1", L"_funktie1$", L"_funktie2", L"_funktie2$",
-	L"_square",
-	L"_string",
-	L"a numeric variable", L"a string variable", L"a numeric array variable", L"a string array variable",
-	L"a variable name", L"an indexed numeric variable", L"an indexed string variable",
-	L"the end of the formula"
+	U"length", U"number", U"fileReadable",	U"deleteFile", U"createDirectory", U"variableExists",
+	U"readFile", U"readFile$", U"unicodeToBackslashTrigraphs$", U"backslashTrigraphsToUnicode$", U"environment$",
+	U"date$", U"info$",
+	U"index", U"rindex",
+	U"startsWith", U"endsWith", U"replace$", U"index_regex", U"rindex_regex", U"replace_regex$",
+	U"extractNumber", U"extractWord$", U"extractLine$",
+	U"fixed$", U"percent$",
+	U"sum",
+	U".",
+	U"_true", U"_false",
+	U"_goto", U"_iftrue", U"_iffalse", U"_incrementGreaterGoto",
+	U"_label",
+	U"_decrementAndAssign", U"_add3Down", U"_pop2",
+	U"_numericArrayElement", U"_variableReference",
+	U"_self0", U"_self0$",
+	U"_objectcell0", U"_objectcell0$", U"_objectcell1", U"_objectcell1$", U"_objectcell2", U"_objectcell2$",
+	U"_objectlocation0", U"_objectlocation0$", U"_objectlocation1", U"_objectlocation1$", U"_objectlocation2", U"_objectlocation2$",
+	U"_selfmatriks1", U"_selfmatriks1$", U"_selfmatriks2", U"_selfmatriks2$",
+	U"_selffunktie1", U"_selffunktie1$", U"_selffunktie2", U"_selffunktie2$",
+	U"_matriks0", U"_matriks0$", U"_matriks1", U"_matriks1$", U"_matriks2", U"_matriks2$",
+	U"_funktie0", U"_funktie0$", U"_funktie1", U"_funktie1$", U"_funktie2", U"_funktie2$",
+	U"_square",
+	U"_string",
+	U"a numeric variable", U"a string variable", U"a numeric array variable", U"a string array variable",
+	U"a variable name", U"an indexed numeric variable", U"an indexed string variable",
+	U"the end of the formula"
 };
 
 #define nieuwlabel (-- ilabel)
 #define nieuwlees (lexan [++ ilexan]. symbol)
 #define oudlees  (-- ilexan)
 
-static void formulefout (const wchar_t *message, int position) {
-	static MelderString truncatedExpression = { 0 };
+static void formulefout (const char32 *message, int position) {
+	static MelderString truncatedExpression { 0 };
 	MelderString_ncopy (& truncatedExpression, theExpression, position + 1);
-	Melder_throw (message, L":\n" L_LEFT_GUILLEMET L" ", truncatedExpression.string);
+	Melder_throw (message, U":\n" U_LEFT_GUILLEMET U" ", truncatedExpression.string);
 }
 
-static const wchar_t *languageNameCompare_searchString;
+static const char32 *languageNameCompare_searchString;
 
 static int languageNameCompare (const void *first, const void *second) {
 	int i = * (int *) first, j = * (int *) second;
-	return wcscmp (i == 0 ? languageNameCompare_searchString : Formula_instructionNames [i],
+	return str32cmp (i == 0 ? languageNameCompare_searchString : Formula_instructionNames [i],
 		j == 0 ? languageNameCompare_searchString : Formula_instructionNames [j]);
 }
 
-static int Formula_hasLanguageName (const wchar_t *f) {
+static int Formula_hasLanguageName (const char32 *f) {
 	static int *index;
-	if (index == NULL) {
+	if (! index) {
 		index = NUMvector <int> (1, hoogsteInvoersymbool);
 		for (int tok = 1; tok <= hoogsteInvoersymbool; tok ++) {
 			index [tok] = tok;
 		}
 		qsort (& index [1], hoogsteInvoersymbool, sizeof (int), languageNameCompare);
 	}
-	if (index == NULL) {   /* Linear search. */
+	if (! index) {   // linear search
 		for (int tok = 1; tok <= hoogsteInvoersymbool; tok ++) {
-			if (wcsequ (f, Formula_instructionNames [tok])) return tok;
+			if (str32equ (f, Formula_instructionNames [tok])) return tok;
 		}
-	} else {   /* Binary search. */
+	} else {   // binary search
 		int dummy = 0, *found;
 		languageNameCompare_searchString = f;
 		found = (int *) bsearch (& dummy, & index [1], hoogsteInvoersymbool, sizeof (int), languageNameCompare);
-		if (found != NULL) return *found;
+		if (found) return *found;
 	}
 	return 0;
 }
 
-static void Formula_lexan (void) {
+static void Formula_lexan () {
 /*
 	Purpose:
 		translate the formula text into a series of symbols.
@@ -321,7 +321,7 @@ static void Formula_lexan (void) {
 			lexan [3]. number = 7.00000000e+00;
 			lexan [4]. symbol = END_;
 */
-	int kar;   /* The character most recently read from theExpression. */
+	char32 kar;   /* The character most recently read from theExpression. */
 	int ikar = -1;   /* The position of that character in theExpression. */
 #define nieuwkar kar = theExpression [++ ikar]
 #define oudkar -- ikar
@@ -331,7 +331,7 @@ static void Formula_lexan (void) {
 #define tokgetal(g)  lexan [itok]. content.number = (g)
 #define tokmatriks(m)  lexan [itok]. content.object = (m)
 
-	static MelderString token = { 0 };   /* String to collect a symbol name in. */
+	static MelderString token { 0 };   /* String to collect a symbol name in. */
 #define stokaan MelderString_empty (& token);
 #define stokkar { MelderString_appendCharacter (& token, kar); nieuwkar; }
 #define stokuit (void) 0
@@ -339,34 +339,34 @@ static void Formula_lexan (void) {
 	ilexan = iparse = ilabel = numberOfStringConstants = 0;
 	do {
 		nieuwkar;
-		if (kar == ' ' || kar == '\t') {
+		if (kar == U' ' || kar == U'\t') {
 			;   // ignore spaces and tabs
-		} else if (kar == '\0') {
+		} else if (kar == U'\0') {
 			nieuwtok (END_)
-		} else if (kar >= '0' && kar <= '9') {
+		} else if (kar >= U'0' && kar <= U'9') {
 			stokaan;
-			do stokkar while (kar >= '0' && kar <= '9');
-			if (kar == '.') do stokkar while (kar >= '0' && kar <= '9');
-			if (kar == 'e' || kar == 'E') {
-				kar = 'e'; stokkar
-				if (kar == '-') stokkar
-				else if (kar == '+') nieuwkar;
-				if (! (kar >= '0' && kar <= '9'))
-					formulefout (L"Missing exponent", ikar);
-				do stokkar while (kar >= '0' && kar <= '9');
+			do stokkar while (kar >= U'0' && kar <= U'9');
+			if (kar == U'.') do stokkar while (kar >= U'0' && kar <= U'9');
+			if (kar == U'e' || kar == U'E') {
+				kar = U'e'; stokkar
+				if (kar == U'-') stokkar
+				else if (kar == U'+') nieuwkar;
+				if (! (kar >= U'0' && kar <= U'9'))
+					formulefout (U"Missing exponent", ikar);
+				do stokkar while (kar >= U'0' && kar <= U'9');
 			}
-			if (kar == '%') stokkar
+			if (kar == U'%') stokkar
 			stokuit;
 			oudkar;
 			nieuwtok (NUMBER_)
 			tokgetal (Melder_atof (token.string));
-		} else if ((kar >= 'a' && kar <= 'z') || kar >= 192 || (kar == '.' &&
-				((theExpression [ikar + 1] >= 'a' && theExpression [ikar + 1] <= 'z') || theExpression [ikar + 1] >= 192)
+		} else if ((kar >= U'a' && kar <= U'z') || kar >= 192 || (kar == U'.' &&
+				((theExpression [ikar + 1] >= U'a' && theExpression [ikar + 1] <= U'z') || theExpression [ikar + 1] >= 192)
 				&& (itok == 0 || (lexan [itok]. symbol != MATRIKS_ && lexan [itok]. symbol != MATRIKSSTR_)))) {
 			int tok;
 			bool isString = false, isArray = false;
 			stokaan;
-			do stokkar while ((kar >= 'A' && kar <= 'Z') || (kar >= 'a' && kar <= 'z') || kar >= 192 || (kar >= '0' && kar <= '9') || kar == '_' || kar == '.');
+			do stokkar while ((kar >= U'A' && kar <= U'Z') || (kar >= U'a' && kar <= U'z') || kar >= 192 || (kar >= U'0' && kar <= U'9') || kar == U'_' || kar == U'.');
 			if (kar == '$') {
 				stokkar
 				isString = true;
@@ -422,9 +422,9 @@ static void Formula_lexan (void) {
 						 * This could be a variable with the same name as a function.
 						 */
 						InterpreterVariable var = Interpreter_hasVariable (theInterpreter, token.string);
-						if (var == NULL) {
+						if (! var) {
 							nieuwtok (VARIABLE_NAME_)
-							lexan [itok]. content.string = Melder_wcsdup_f (token.string);
+							lexan [itok]. content.string = Melder_dup_f (token.string);
 							numberOfStringConstants ++;
 						} else {
 							if (isArray) {
@@ -463,9 +463,9 @@ static void Formula_lexan (void) {
 						 */
 						if (Interpreter_hasVariable (theInterpreter, token.string))
 							Melder_throw (
-								L_LEFT_GUILLEMET, token.string,
-								L_RIGHT_GUILLEMET " is ambiguous: a variable or an attribute of the current object. "
-								"Please change variable name.");
+								U_LEFT_GUILLEMET, token.string,
+								U_RIGHT_GUILLEMET U" is ambiguous: a variable or an attribute of the current object. "
+								U"Please change variable name.");
 						if (tok == ROW_ || tok == COL_ || tok == X_ || tok == Y_) {
 							nieuwtok (tok)
 						} else {
@@ -479,20 +479,20 @@ static void Formula_lexan (void) {
 						 * This must be a variable, since there is no "current object" here.
 						 */
 						int jkar = ikar + 1;
-						while (theExpression [jkar] == ' ' || theExpression [jkar] == '\t') jkar ++;
-						if (theExpression [jkar] == '[' && ! isArray) {
+						while (theExpression [jkar] == U' ' || theExpression [jkar] == U'\t') jkar ++;
+						if (theExpression [jkar] == U'[' && ! isArray) {
 							if (isString) {
 								nieuwtok (INDEXED_STRING_VARIABLE_)
 							} else {
 								nieuwtok (INDEXED_NUMERIC_VARIABLE_)
 							}
-							lexan [itok]. content.string = Melder_wcsdup_f (token.string);
+							lexan [itok]. content.string = Melder_dup_f (token.string);
 							numberOfStringConstants ++;
 						} else {
 							InterpreterVariable var = Interpreter_hasVariable (theInterpreter, token.string);
-							if (var == NULL) {
+							if (! var) {
 								nieuwtok (VARIABLE_NAME_)
-								lexan [itok]. content.string = Melder_wcsdup_f (token.string);
+								lexan [itok]. content.string = Melder_dup_f (token.string);
 								numberOfStringConstants ++;
 							} else {
 								if (isArray) {
@@ -520,23 +520,23 @@ static void Formula_lexan (void) {
 				 * token.string is not a language name
 				 */
 				int jkar = ikar + 1;
-				while (theExpression [jkar] == ' ' || theExpression [jkar] == '\t') jkar ++;
-				if (theExpression [jkar] == '(' || theExpression [jkar] == ':') {
+				while (theExpression [jkar] == U' ' || theExpression [jkar] == U'\t') jkar ++;
+				if (theExpression [jkar] == U'(' || theExpression [jkar] == U':') {
 					Melder_throw (
-						"Unknown function " L_LEFT_GUILLEMET, token.string, L_RIGHT_GUILLEMET " in formula.");
+						U"Unknown function " U_LEFT_GUILLEMET, token.string, U_RIGHT_GUILLEMET U" in formula.");
 				} else if (theExpression [jkar] == '[' && ! isArray) {
 					if (isString) {
 						nieuwtok (INDEXED_STRING_VARIABLE_)
 					} else {
 						nieuwtok (INDEXED_NUMERIC_VARIABLE_)
 					}
-					lexan [itok]. content.string = Melder_wcsdup_f (token.string);
+					lexan [itok]. content.string = Melder_dup_f (token.string);
 					numberOfStringConstants ++;
 				} else {
 					InterpreterVariable var = Interpreter_hasVariable (theInterpreter, token.string);
-					if (var == NULL) {
+					if (! var) {
 						nieuwtok (VARIABLE_NAME_)
-						lexan [itok]. content.string = Melder_wcsdup_f (token.string);
+						lexan [itok]. content.string = Melder_dup_f (token.string);
 						numberOfStringConstants ++;
 					} else {
 						if (isArray) {
@@ -556,144 +556,143 @@ static void Formula_lexan (void) {
 					}
 				}
 			}
-		} else if (kar >= 'A' && kar <= 'Z') {
-			int endsInDollarSign = FALSE;
-			wchar_t *underscore;
+		} else if (kar >= U'A' && kar <= U'Z') {
+			bool endsInDollarSign = false;
 			stokaan;
-			do stokkar while (isalnum (kar) || kar == '_');
-			if (kar == '$') { stokkar endsInDollarSign = TRUE; }
+			do stokkar while (isalnum ((int) kar) || kar == U'_');   // TODO: allow more than just ASCII
+			if (kar == U'$') { stokkar endsInDollarSign = true; }
 			stokuit;
 			oudkar;
 			/*
 			 * 'token' now contains a word that could be an object name.
 			 */
-			underscore = wcschr (token.string, '_');
-			if (wcsequ (token.string, L"Self")) {
-				if (theSource == NULL)
-					formulefout (L"Cannot use \"Self\" if there is no current object.", ikar);
+			char32 *underscore = str32chr (token.string, '_');
+			if (str32equ (token.string, U"Self")) {
+				if (! theSource)
+					formulefout (U"Cannot use \"Self\" if there is no current object.", ikar);
 				nieuwtok (MATRIKS_)
 				tokmatriks (theSource);
-			} else if (wcsequ (token.string, L"Self$")) {
-				if (theSource == NULL)
-					formulefout (L"Cannot use \"Self$\" if there is no current object.", ikar);
+			} else if (str32equ (token.string, U"Self$")) {
+				if (! theSource)
+					formulefout (U"Cannot use \"Self$\" if there is no current object.", ikar);
 				nieuwtok (MATRIKSSTR_)
 				tokmatriks (theSource);
-			} else if (underscore == NULL) {
+			} else if (! underscore) {
 				Melder_throw (
-					"Unknown symbol " L_LEFT_GUILLEMET , token.string,
-					L_RIGHT_GUILLEMET " in formula "
-					"(variables start with lower case; object names contain an underscore).");
-			} else if (wcsnequ (token.string, L"Object_", 7)) {
-				long uniqueID = wcstol (token.string + 7, NULL, 10);
+					U"Unknown symbol " U_LEFT_GUILLEMET , token.string,
+					U_RIGHT_GUILLEMET U" in formula "
+					U"(variables start with lower case; object names contain an underscore).");
+			} else if (str32nequ (token.string, U"Object_", 7)) {
+				long uniqueID = a32tol (token.string + 7);
 				int i = theCurrentPraatObjects -> n;
 				while (i > 0 && uniqueID != theCurrentPraatObjects -> list [i]. id)
 					i --;
 				if (i == 0)
-					formulefout (L"No such object (note: variables start with lower case)", ikar);
+					formulefout (U"No such object (note: variables start with lower case)", ikar);
 				nieuwtok (endsInDollarSign ? MATRIKSSTR_ : MATRIKS_)
-				tokmatriks ((Data) theCurrentPraatObjects -> list [i]. object);
+				tokmatriks ((Daata) theCurrentPraatObjects -> list [i]. object);
 			} else {
 				int i = theCurrentPraatObjects -> n;
 				*underscore = ' ';
 				if (endsInDollarSign) token.string [-- token.length] = '\0';
-				while (i > 0 && ! wcsequ (token.string, theCurrentPraatObjects -> list [i]. name))
+				while (i > 0 && ! str32equ (token.string, theCurrentPraatObjects -> list [i]. name))
 					i --;
 				if (i == 0)
-					formulefout (L"No such object (note: variables start with lower case)", ikar);
+					formulefout (U"No such object (note: variables start with lower case)", ikar);
 				nieuwtok (endsInDollarSign ? MATRIKSSTR_ : MATRIKS_)
-				tokmatriks ((Data) theCurrentPraatObjects -> list [i]. object);
+				tokmatriks ((Daata) theCurrentPraatObjects -> list [i]. object);
 			}
-		} else if (kar == '(') {
+		} else if (kar == U'(') {
 			nieuwtok (HAAKJEOPENEN_)
-		} else if (kar == ')') {
+		} else if (kar == U')') {
 			nieuwtok (HAAKJESLUITEN_)
-		} else if (kar == '+') {
+		} else if (kar == U'+') {
 			nieuwtok (ADD_)
-		} else if (kar == '-') {
+		} else if (kar == U'-') {
 			if (itok == 0 || lexan [itok]. symbol <= MINUS_) {
 				nieuwtok (MINUS_)
 			} else {
 				nieuwtok (SUB_)
 			}
-		} else if (kar == '*') {
+		} else if (kar == U'*') {
 			nieuwkar;
-			if (kar == '*') {
+			if (kar == U'*') {
 				nieuwtok (POWER_)   /* "**" = "^" */
 			} else {
 				oudkar;
 				nieuwtok (MUL_)
 			}
-		} else if (kar == '/') {
+		} else if (kar == U'/') {
 			nieuwkar;
-			if (kar == '=') {
+			if (kar == U'=') {
 				nieuwtok (NE_)   /* "/=" = "<>" */
 			} else {
 				oudkar;
 				nieuwtok (RDIV_)
 			}
-		} else if (kar == '=') {
+		} else if (kar == U'=') {
 			nieuwtok (EQ_)   /* "=" */
 			nieuwkar;
-			if (kar != '=') {
+			if (kar != U'=') {
 				oudkar;   /* "==" = "=" */
 			}
-		} else if (kar == '>') {
+		} else if (kar == U'>') {
 			nieuwkar;
-			if (kar == '=') {
+			if (kar == U'=') {
 				nieuwtok (GE_)
 			} else {
 				oudkar;
 				nieuwtok (GT_)
 			}
-		} else if (kar == '<') {
+		} else if (kar == U'<') {
 			nieuwkar;
-			if (kar == '=') {
+			if (kar == U'=') {
 				nieuwtok (LE_)
-			} else if (kar == '>') {
+			} else if (kar == U'>') {
 				nieuwtok (NE_)
 			} else {
 				oudkar;
 				nieuwtok (LT_)
 			}
-		} else if (kar == '!') {
+		} else if (kar == U'!') {
 			nieuwkar;
-			if (kar == '=') {
+			if (kar == U'=') {
 				nieuwtok (NE_)   /* "!=" = "<>" */
 			} else {
 				oudkar;
 				nieuwtok (NOT_)
 			}
-		} else if (kar == ',') {
+		} else if (kar == U',') {
 			nieuwtok (KOMMA_)
-		} else if (kar == ':') {
+		} else if (kar == U':') {
 			nieuwtok (COLON_)
-		} else if (kar == ';') {
+		} else if (kar == U';') {
 			nieuwtok (END_)
-		} else if (kar == '^') {
+		} else if (kar == U'^') {
 			nieuwtok (POWER_)
-		} else if (kar == '@') {
+		} else if (kar == U'@') {
 			do {
 				nieuwkar;
-			} while (kar == ' ' || kar == '\t');
+			} while (kar == U' ' || kar == U'\t');
 			stokaan;
-			do stokkar while ((kar >= 'A' && kar <= 'Z') || (kar >= 'a' && kar <= 'z') || kar >= 192 || (kar >= '0' && kar <= '9') || kar == '_' || kar == '.');
+			do stokkar while ((kar >= U'A' && kar <= U'Z') || (kar >= U'a' && kar <= U'z') || kar >= 192 || (kar >= U'0' && kar <= U'9') || kar == U'_' || kar == U'.');
 			stokuit;
 			oudkar;
 			nieuwtok (CALL_)
-			lexan [itok]. content.string = Melder_wcsdup_f (token.string);
+			lexan [itok]. content.string = Melder_dup_f (token.string);
 			numberOfStringConstants ++;
-		} else if (kar == '\"') {
+		} else if (kar == U'\"') {
 			/*
 			 * String constant.
 			 */
 			nieuwkar;
 			stokaan;
 			for (;;) {
-				if (kar == '\0')
-					formulefout (L"No closing quote in string constant", ikar);
-				if (kar == '\"') {
+				if (kar == U'\0')
+					formulefout (U"No closing quote in string constant", ikar);
+				if (kar == U'\"') {
 					nieuwkar;
-					if (kar == '\"') stokkar
+					if (kar == U'\"') stokkar
 					else break;
 				} else {
 					stokkar
@@ -702,28 +701,28 @@ static void Formula_lexan (void) {
 			stokuit;
 			oudkar;
 			nieuwtok (STRING_)
-			lexan [itok]. content.string = Melder_wcsdup_f (token.string);
+			lexan [itok]. content.string = Melder_dup_f (token.string);
 			numberOfStringConstants ++;
-		} else if (kar == '|') {
+		} else if (kar == U'|') {
 			nieuwtok (OR_)   /* "|" = "or" */
 			nieuwkar;
-			if (kar != '|') {
+			if (kar != U'|') {
 				oudkar;   /* "||" = "or" */
 			}
-		} else if (kar == '&') {
+		} else if (kar == U'&') {
 			nieuwtok (AND_)   /* "&" = "and" */
 			nieuwkar;
-			if (kar != '&') {
+			if (kar != U'&') {
 				oudkar;   /* "&&" = "and" */
 			}
-		} else if (kar == '[') {
+		} else if (kar == U'[') {
 			nieuwtok (RECHTEHAAKOPENEN_)
-		} else if (kar == ']') {
+		} else if (kar == U']') {
 			nieuwtok (RECHTEHAAKSLUITEN_)
-		} else if (kar == '.') {
+		} else if (kar == U'.') {
 			nieuwtok (PERIOD_)
 		} else {
-			formulefout (L"Unknown symbol", ikar);
+			formulefout (U"Unknown symbol", ikar);
 		}
 	} while (lexan [itok]. symbol != END_);
 }
@@ -732,15 +731,14 @@ static void pas (int symbol) {
 	if (symbol == nieuwlees) {
 		return;   // success
 	} else {
-		static MelderString melding = { 0 };
-		MelderString_empty (& melding);
-		const wchar_t *symbolName1 = Formula_instructionNames [symbol];
-		const wchar_t *symbolName2 = Formula_instructionNames [lexan [ilexan]. symbol];
-		bool needQuotes1 = wcschr (symbolName1, ' ') == NULL;
-		bool needQuotes2 = wcschr (symbolName2, ' ') == NULL;
-		MelderString_append (& melding,
-			L"Expected ", needQuotes1 ? L"\"" : NULL, symbolName1, needQuotes1 ? L"\"" : NULL,
-			L", but found ", needQuotes2 ? L"\"" : NULL, symbolName2, needQuotes2 ? L"\"" : NULL);
+		const char32 *symbolName1 = Formula_instructionNames [symbol];
+		const char32 *symbolName2 = Formula_instructionNames [lexan [ilexan]. symbol];
+		bool needQuotes1 = ( str32chr (symbolName1, U' ') == nullptr );
+		bool needQuotes2 = ( str32chr (symbolName2, U' ') == nullptr );
+		static MelderString melding { 0 };
+		MelderString_copy (& melding,
+			U"Expected ", needQuotes1 ? U"\"" : nullptr, symbolName1, needQuotes1 ? U"\"" : nullptr,
+			U", but found ", needQuotes2 ? U"\"" : nullptr, symbolName2, needQuotes2 ? U"\"" : nullptr);
 		formulefout (melding.string, lexan [ilexan]. position);
 	}
 }
@@ -749,12 +747,11 @@ static bool pasArguments () {
     int symbol = nieuwlees;
     if (symbol == HAAKJEOPENEN_) return true;   // success: a function call like: myFunction (...)
     if (symbol == COLON_) return false;   // success: a function call like: myFunction: ...
-    static MelderString melding = { 0 };
-    MelderString_empty (& melding);
-    const wchar_t *symbolName2 = Formula_instructionNames [lexan [ilexan]. symbol];
-    bool needQuotes2 = wcschr (symbolName2, ' ') == NULL;
-    MelderString_append (& melding,
-                         L"Expected \"(\" or \":\", but found ", needQuotes2 ? L"\"" : NULL, symbolName2, needQuotes2 ? L"\"" : NULL);
+    const char32 *symbolName2 = Formula_instructionNames [lexan [ilexan]. symbol];
+    bool needQuotes2 = ( str32chr (symbolName2, U' ') == nullptr );
+    static MelderString melding { 0 };
+    MelderString_copy (& melding,
+		U"Expected \"(\" or \":\", but found ", needQuotes2 ? U"\"" : nullptr, symbolName2, needQuotes2 ? U"\"" : nullptr);
     formulefout (melding.string, lexan [ilexan]. position);
     return false;   // will never occur
 }
@@ -763,9 +760,9 @@ static bool pasArguments () {
 #define parsenumber(g)  parse [iparse]. content.number = (g)
 #define ontleedlabel(l)  parse [iparse]. content.label = (l)
 
-static void parseExpression (void);
+static void parseExpression ();
 
-static void parsePowerFactor (void) {
+static void parsePowerFactor () {
 	int symbol = nieuwlees;
 
 	if (symbol >= LOW_VALUE && symbol <= HIGH_VALUE) {
@@ -787,7 +784,7 @@ static void parsePowerFactor (void) {
 	}
 
 	if (symbol == INDEXED_NUMERIC_VARIABLE_ || symbol == INDEXED_STRING_VARIABLE_) {
-		wchar_t *var = lexan [ilexan]. content.string;   // Save before incrementing ilexan.
+		char32 *var = lexan [ilexan]. content.string;   // Save before incrementing ilexan.
 		if (nieuwlees == RECHTEHAAKOPENEN_) {
 			int n = 0;
 			if (nieuwlees != RECHTEHAAKSLUITEN_) {
@@ -804,7 +801,7 @@ static void parsePowerFactor (void) {
 			nieuwontleed (NUMBER_); parsenumber (n);
 			nieuwontleed (symbol);
 		} else {
-			Melder_fatal ("Formula:parsePowerFactor (indexed variable): No '['; cannot happen.");
+			Melder_fatal (U"Formula:parsePowerFactor (indexed variable): No '['; cannot happen.");
 		}
 		parse [iparse]. content.string = var;
 		return;
@@ -837,8 +834,8 @@ static void parsePowerFactor (void) {
 
 	if (symbol == VARIABLE_NAME_) {
 		InterpreterVariable var = Interpreter_hasVariable (theInterpreter, lexan [ilexan]. content.string);
-		if (var == NULL)
-			formulefout (L"Unknown variable", lexan [ilexan]. position);
+		if (! var)
+			formulefout (U"Unknown variable", lexan [ilexan]. position);
 		nieuwontleed (NUMERIC_VARIABLE_);
 		parse [iparse]. content.variable = var;
 		return;
@@ -949,7 +946,7 @@ static void parsePowerFactor (void) {
 				}
 			}
 		} else {
-			formulefout (L"After \"object\" there should be \"(\" or \"[\"", lexan [ilexan]. position);
+			formulefout (U"After \"object\" there should be \"(\" or \"[\"", lexan [ilexan]. position);
 		}
 		return;
 	}
@@ -993,7 +990,7 @@ static void parsePowerFactor (void) {
 				}
 			}
 		} else {
-			formulefout (L"After \"object$\" there should be \"(\" or \"[\"", lexan [ilexan]. position);
+			formulefout (U"After \"object$\" there should be \"(\" or \"[\"", lexan [ilexan]. position);
 		}
 		return;
 	}
@@ -1021,8 +1018,8 @@ static void parsePowerFactor (void) {
 	}
 
 	if (symbol == MATRIKS_) {
-		Data thee = lexan [ilexan]. content.object;
-		Melder_assert (thee != NULL);
+		Daata thee = lexan [ilexan]. content.object;
+		Melder_assert (thee != nullptr);
 		symbol = nieuwlees;
 		if (symbol == RECHTEHAAKOPENEN_) {
 			if (nieuwlees == RECHTEHAAKSLUITEN_) {
@@ -1066,7 +1063,7 @@ static void parsePowerFactor (void) {
 			switch (nieuwlees) {
 				case XMIN_:
 					if (! thy v_hasGetXmin ()) {
-						formulefout (L"Attribute \"xmin\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"xmin\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						nieuwontleed (NUMBER_);
 						parsenumber (thy v_getXmin ());
@@ -1074,7 +1071,7 @@ static void parsePowerFactor (void) {
 					}
 				case XMAX_:
 					if (! thy v_hasGetXmax ()) {
-						formulefout (L"Attribute \"xmax\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"xmax\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						nieuwontleed (NUMBER_);
 						parsenumber (thy v_getXmax ());
@@ -1082,7 +1079,7 @@ static void parsePowerFactor (void) {
 					}
 				case YMIN_:
 					if (! thy v_hasGetYmin ()) {
-						formulefout (L"Attribute \"ymin\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"ymin\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						nieuwontleed (NUMBER_);
 						parsenumber (thy v_getYmin ());
@@ -1090,7 +1087,7 @@ static void parsePowerFactor (void) {
 					}
 				case YMAX_:
 					if (! thy v_hasGetYmax ()) {
-						formulefout (L"Attribute \"ymax\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"ymax\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						nieuwontleed (NUMBER_);
 						parsenumber (thy v_getYmax ());
@@ -1098,7 +1095,7 @@ static void parsePowerFactor (void) {
 					}
 				case NX_:
 					if (! thy v_hasGetNx ()) {
-						formulefout (L"Attribute \"nx\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"nx\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						nieuwontleed (NUMBER_);
 						parsenumber (thy v_getNx ());
@@ -1106,7 +1103,7 @@ static void parsePowerFactor (void) {
 					}
 				case NY_:
 					if (! thy v_hasGetNy ()) {
-						formulefout (L"Attribute \"ny\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"ny\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						nieuwontleed (NUMBER_);
 						parsenumber (thy v_getNy ());
@@ -1114,7 +1111,7 @@ static void parsePowerFactor (void) {
 					}
 				case DX_:
 					if (! thy v_hasGetDx ()) {
-						formulefout (L"Attribute \"dx\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"dx\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						nieuwontleed (NUMBER_);
 						parsenumber (thy v_getDx ());
@@ -1122,7 +1119,7 @@ static void parsePowerFactor (void) {
 					}
 				case DY_:
 					if (! thy v_hasGetDy ()) {
-						formulefout (L"Attribute \"dy\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"dy\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						nieuwontleed (NUMBER_);
 						parsenumber (thy v_getDy ());
@@ -1130,7 +1127,7 @@ static void parsePowerFactor (void) {
 					}
 				case NCOL_:
 					if (! thy v_hasGetNcol ()) {
-						formulefout (L"Attribute \"ncol\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"ncol\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						nieuwontleed (NUMBER_);
 						parsenumber (thy v_getNcol ());
@@ -1138,7 +1135,7 @@ static void parsePowerFactor (void) {
 					}
 				case NROW_:
 					if (! thy v_hasGetNrow ()) {
-						formulefout (L"Attribute \"nrow\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"nrow\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						nieuwontleed (NUMBER_);
 						parsenumber (thy v_getNrow ());
@@ -1146,7 +1143,7 @@ static void parsePowerFactor (void) {
 					}
 				case ROWSTR_:
 					if (! thy v_hasGetRowStr ()) {
-						formulefout (L"Attribute \"row$\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"row$\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						pas (RECHTEHAAKOPENEN_);
 						parseExpression ();
@@ -1157,7 +1154,7 @@ static void parsePowerFactor (void) {
 					}
 				case COLSTR_:
 					if (! thy v_hasGetColStr ()) {
-						formulefout (L"Attribute \"col$\" not defined for this object", lexan [ilexan]. position);
+						formulefout (U"Attribute \"col$\" not defined for this object", lexan [ilexan]. position);
 					} else {
 						pas (RECHTEHAAKOPENEN_);
 						parseExpression ();
@@ -1166,17 +1163,17 @@ static void parsePowerFactor (void) {
 						pas (RECHTEHAAKSLUITEN_);
 						return;
 					}
-				default: formulefout (L"Unknown attribute.", lexan [ilexan]. position);
+				default: formulefout (U"Unknown attribute.", lexan [ilexan]. position);
 			}
 		} else {
-			formulefout (L"After a name of a matrix there should be \"(\", \"[\", or \".\"", lexan [ilexan]. position);
+			formulefout (U"After a name of a matrix there should be \"(\", \"[\", or \".\"", lexan [ilexan]. position);
 		}
 		return;
 	}
 
 	if (symbol == MATRIKSSTR_) {
-		Data thee = lexan [ilexan]. content.object;
-		Melder_assert (thee != NULL);
+		Daata thee = lexan [ilexan]. content.object;
+		Melder_assert (thee != nullptr);
 		symbol = nieuwlees;
 		if (symbol == RECHTEHAAKOPENEN_) {
 			if (nieuwlees == RECHTEHAAKSLUITEN_) {
@@ -1198,7 +1195,7 @@ static void parsePowerFactor (void) {
 				}
 			}
 		} else {
-			formulefout (L"After a name of a matrix$ there should be \"[\"", lexan [ilexan]. position);
+			formulefout (U"After a name of a matrix$ there should be \"[\"", lexan [ilexan]. position);
 		}
 		return;
 	}
@@ -1253,7 +1250,7 @@ static void parsePowerFactor (void) {
 	}
 
 	if (symbol == CALL_) {
-		wchar_t *procedureName = lexan [ilexan]. content.string;   // reference copy!
+		char32 *procedureName = lexan [ilexan]. content.string;   // reference copy!
 		int n = 0;
 		bool isParenthesis = pasArguments ();
 		if (nieuwlees != HAAKJESLUITEN_) {
@@ -1314,7 +1311,7 @@ static void parsePowerFactor (void) {
 			if (isParenthesis) pas (HAAKJESLUITEN_);
 		} else {
 			oudlees;   // needed for retry if we are going to be in a string comparison?
-			formulefout (L"Function expected", lexan [ilexan + 1]. position);
+			formulefout (U"Function expected", lexan [ilexan + 1]. position);
 		}
 		nieuwontleed (symbol);
 		return;
@@ -1335,7 +1332,7 @@ static void parsePowerFactor (void) {
 				nieuwontleed (VARIABLE_REFERENCE_);
 				parse [iparse]. content.variable = loopVariable;
 			} else {
-				formulefout (L"Numeric variable expected", lexan [ilexan]. position);
+				formulefout (U"Numeric variable expected", lexan [ilexan]. position);
 			}
 			// now on stack: sum, loop variable
 			if (nieuwlees == FROM_) {
@@ -1373,16 +1370,16 @@ static void parsePowerFactor (void) {
 	}
 
 	oudlees;   // needed for retry if we are going to be in a string comparison
-	formulefout (L"Symbol misplaced", lexan [ilexan + 1]. position);
+	formulefout (U"Symbol misplaced", lexan [ilexan + 1]. position);
 }
 
-static void parseFactor (void);
+static void parseFactor ();
 
-static void parsePowerFactors (void) {
+static void parsePowerFactors () {
 	if (nieuwlees == POWER_) {
 		if (ilexan > 2 && lexan [ilexan - 2]. symbol == MINUS_ && lexan [ilexan - 1]. symbol == NUMBER_) {
 			oudlees;
-			formulefout (L"Expressions like -3^4 are ambiguous; use (-3)^4 or -(3^4) or -(3)^4", lexan [ilexan + 1]. position);
+			formulefout (U"Expressions like -3^4 are ambiguous; use (-3)^4 or -(3^4) or -(3)^4", lexan [ilexan + 1]. position);
 		}
 		parseFactor ();   // like a^-b
 		nieuwontleed (POWER_);
@@ -1391,12 +1388,12 @@ static void parsePowerFactors (void) {
 		oudlees;
 }
 
-static void parseMinus (void) {
+static void parseMinus () {
 	parsePowerFactor ();
 	parsePowerFactors ();
 }
 
-static void parseFactor (void) {
+static void parseFactor () {
 	if (nieuwlees == MINUS_) {
 		parseFactor ();   // there can be multiple consecutive minuses
 		nieuwontleed (MINUS_);
@@ -1406,7 +1403,7 @@ static void parseFactor (void) {
 	parseMinus ();   // like -a^b
 }
 
-static void parseFactors (void) {
+static void parseFactors () {
 	int sym = nieuwlees;   // has to be local, because of recursion
 	if (sym == MUL_ || sym == RDIV_ || sym == IDIV_ || sym == MOD_) {
 		parseFactor ();
@@ -1416,12 +1413,12 @@ static void parseFactors (void) {
 	else oudlees;
 }
 
-static void parseTerm (void) {
+static void parseTerm () {
 	parseFactor ();
 	parseFactors ();
 }
 
-static void parseTerms (void) {
+static void parseTerms () {
 	int symbol = nieuwlees;
 	if (symbol == ADD_ || symbol == SUB_) {
 		parseTerm ();
@@ -1431,7 +1428,7 @@ static void parseTerms (void) {
 	else oudlees;
 }
 
-static void parseNot (void) {
+static void parseNot () {
 	int symbol;
 	parseTerm ();
 	parseTerms ();
@@ -1444,7 +1441,7 @@ static void parseNot (void) {
 	else oudlees;
 }
 
-static void parseAnd (void) {
+static void parseAnd () {
 	if (nieuwlees == NOT_) {
 		parseAnd ();   // like not not not
 		nieuwontleed (NOT_);
@@ -1454,7 +1451,7 @@ static void parseAnd (void) {
 	parseNot ();
 }
 
-static void parseOr (void) {
+static void parseOr () {
 	parseAnd ();
 	if (nieuwlees == AND_) {
 		int falseLabel = nieuwlabel;
@@ -1473,7 +1470,7 @@ static void parseOr (void) {
 	oudlees;
 }
 
-static void parseExpression (void) {
+static void parseExpression () {
 	parseOr ();
 	if (nieuwlees == OR_) {
 		int trueLabel = nieuwlabel;
@@ -1507,9 +1504,9 @@ static void parseExpression (void) {
 		result == 0 || my parse [my numberOfInstructions]. symbol == END_
 */
 
-static void Formula_parseExpression (void) {
+static void Formula_parseExpression () {
 	ilabel = ilexan = iparse = 0;
-	if (lexan [1]. symbol == END_) Melder_throw ("Empty formula.");
+	if (lexan [1]. symbol == END_) Melder_throw (U"Empty formula.");
 	parseExpression ();
 	pas (END_);
 	nieuwontleed (END_);
@@ -1517,9 +1514,8 @@ static void Formula_parseExpression (void) {
 }
 
 static void schuif (int begin, int afstand) {
-	int j;
 	numberOfInstructions -= afstand;
-	for (j = begin; j <= numberOfInstructions; j ++)
+	for (int j = begin; j <= numberOfInstructions; j ++)
 		parse [j] = parse [j + afstand];
 }
 
@@ -1531,7 +1527,7 @@ static int vindLabel (int label) {
 	return result;
 }
 
-static void Formula_optimizeFlow (void)
+static void Formula_optimizeFlow ()
 /* Vereenvoudig boolse uitdrukkingen.					*/
 /* Nadien:								*/
 /*    de stroom volgt het kortste pad;					*/
@@ -1726,7 +1722,7 @@ static void Formula_optimizeFlow (void)
 	}
 }
 
-static void Formula_evaluateConstants (void) {
+static void Formula_evaluateConstants () {
 	for (;;) {
 		bool improved = 0;
 		for (int i = 1; i <= numberOfInstructions; i ++) {
@@ -1755,7 +1751,7 @@ static void Formula_evaluateConstants (void) {
 	}
 }
 
-static void Formula_removeLabels (void) {
+static void Formula_removeLabels () {
 	/*
 	 * First translate symbolic labels (< 0) into instructions locations (> 0).
 	 */
@@ -1800,48 +1796,54 @@ static void Formula_removeLabels (void) {
 static void Formula_print (FormulaInstruction f) {
 	int i = 0, symbol;
 	do {
-		const wchar_t *instructionName;
+		const char32 *instructionName;
 		symbol = f [++ i]. symbol;
 		instructionName = Formula_instructionNames [symbol];
 		if (symbol == NUMBER_)
-			Melder_casual ("%d %ls %.17g", (int) i, instructionName, f [i]. content.number);
+			Melder_casual (i, U" ", instructionName, U" ", f [i]. content.number);
 		else if (symbol == GOTO_ || symbol == IFFALSE_ || symbol == IFTRUE_ || symbol == LABEL_ || symbol == INCREMENT_GREATER_GOTO_)
-			Melder_casual ("%d %ls %d", (int) i, instructionName, (int) f [i]. content.label);
+			Melder_casual (i, U" ", instructionName, U" ", f [i]. content.label);
 		else if (symbol == NUMERIC_VARIABLE_)
-			Melder_casual ("%d %ls %ls %ls", (int) i, instructionName, f [i]. content.variable -> string, Melder_double (f [i]. content.variable -> numericValue));
+			Melder_casual (i, U" ", instructionName, U" ", f [i]. content.variable -> string, U" ", f [i]. content.variable -> numericValue);
 		else if (symbol == STRING_VARIABLE_)
-			Melder_casual ("%d %ls %ls %ls", (int) i, instructionName, f [i]. content.variable -> string, f [i]. content.variable -> stringValue);
+			Melder_casual (i, U" ", instructionName, U" ", f [i]. content.variable -> string, U" ", f [i]. content.variable -> stringValue);
 		else if (symbol == STRING_ || symbol == VARIABLE_NAME_ || symbol == INDEXED_NUMERIC_VARIABLE_ || symbol == INDEXED_STRING_VARIABLE_)
-			Melder_casual ("%d %ls \"%ls\"", (int) i, instructionName, f [i]. content.string);
+			Melder_casual (i, U" ", instructionName, U" ", f [i]. content.string);
 		else if (symbol == MATRIKS_ || symbol == MATRIKSSTR_ || symbol == MATRIKS1_ || symbol == MATRIKSSTR1_ ||
 		         symbol == MATRIKS2_ || symbol == MATRIKSSTR2_ || symbol == ROWSTR_ || symbol == COLSTR_)
 		{
-			Thing object = (Thing) f [i]. content.object;
+			Thing object = f [i]. content.object;
 			if (object) {
-				Melder_casual ("%d %ls %s %s", (int) i, instructionName,
-					Melder_peekWcsToUtf8 (Thing_className (object)),
-					Melder_peekWcsToUtf8 (object -> name));
+				Melder_casual (i, U" ", instructionName, U" ", Thing_className (object), U" ", object -> name);
 			} else {
-				Melder_casual ("%d %ls", (int) i, instructionName);
+				Melder_casual (i, U" ", instructionName);
 			}
 		}
 		else if (symbol == CALL_)
-			Melder_casual ("%d %ls %ls", (int) i, instructionName, f [i]. content.string);
+			Melder_casual (i, U" ", instructionName, U" ", f [i]. content.string);
 		else
-			Melder_casual ("%d %ls", (int) i, instructionName);
+			Melder_casual (i, U" ", instructionName);
 	} while (symbol != END_);
 }
 
-void Formula_compile (Any interpreter, Any data, const wchar_t *expression, int expressionType, int optimize) {
+void Formula_compile (Any interpreter, Any data, const char32 *expression, int expressionType, bool optimize) {
 	theInterpreter = (Interpreter) interpreter;
-	if (theInterpreter == NULL) {
-		if (theLocalInterpreter == NULL) {
-			theLocalInterpreter = Interpreter_create (NULL, NULL);
+	if (! theInterpreter) {
+		if (! theLocalInterpreter) {
+			theLocalInterpreter = Interpreter_create (nullptr, nullptr);
 		}
 		theInterpreter = theLocalInterpreter;
+		#if USE_HASH
+		for (std::unordered_map<std::u32string, InterpreterVariable>::iterator it = theInterpreter -> variablesMap -> begin(); it != theInterpreter -> variablesMap -> end(); it ++) {
+			InterpreterVariable var = it -> second;
+			forget (var);
+		}
+		theInterpreter -> variablesMap -> clear ();
+		#else
 		Collection_removeAllItems (theInterpreter -> variables);
+		#endif
 	}
-	theSource = (Data) data;
+	theSource = (Daata) data;
 	theExpression = expression;
 	theExpressionType [theLevel] = expressionType;
 	theOptimize = optimize;
@@ -1912,7 +1914,7 @@ static inline void pushNumber (double x) {
 	stackel -> which = Stackel_NUMBER;
 	stackel -> number = x;
 }
-static void pushString (wchar_t *x) {
+static void pushString (char32 *x) {
 	Stackel stackel = & theStack [++ w];
 	if (stackel -> which > Stackel_NUMBER) Stackel_cleanUp (stackel);
 	if (w > wmax) wmax ++;
@@ -1935,190 +1937,190 @@ static void pushVariable (InterpreterVariable var) {
 	stackel -> which = Stackel_VARIABLE;
 	stackel -> variable = var;
 }
-const wchar_t *Stackel_whichText (Stackel me) {
+const char32 *Stackel_whichText (Stackel me) {
 	return
-		my which == Stackel_NUMBER ? L"a number" :
-		my which == Stackel_STRING ? L"a string" :
-		my which == Stackel_NUMERIC_ARRAY ? L"a numeric array" :
-		my which == Stackel_STRING_ARRAY ? L"a string array" :
-		L"???";
+		my which == Stackel_NUMBER ? U"a number" :
+		my which == Stackel_STRING ? U"a string" :
+		my which == Stackel_NUMERIC_ARRAY ? U"a numeric array" :
+		my which == Stackel_STRING_ARRAY ? U"a string array" :
+		U"???";
 }
 
-static void do_not (void) {
+static void do_not () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : x->number == 0.0 ? 1.0 : 0.0);
 	} else {
-		Melder_throw ("Cannot negate (\"not\") ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot negate (\"not\") ", Stackel_whichText (x), U".");
 	}
 }
-static void do_eq (void) {
+static void do_eq () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == y->number ? 1.0 : 0.0);   /* Even if undefined. */
 	} else if (x->which == Stackel_STRING && y->which == Stackel_STRING) {
-		double result = wcsequ (x->string, y->string) ? 1.0 : 0.0;
+		double result = str32equ (x->string, y->string) ? 1.0 : 0.0;
 		pushNumber (result);
 	} else {
-		Melder_throw ("Cannot compare (=) ", Stackel_whichText (x), " to ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot compare (=) ", Stackel_whichText (x), U" to ", Stackel_whichText (y), U".");
 	}
 }
-static void do_ne (void) {
+static void do_ne () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number != y->number ? 1.0 : 0.0);   /* Even if undefined. */
 	} else if (x->which == Stackel_STRING && y->which == Stackel_STRING) {
-		double result = wcsequ (x->string, y->string) ? 0.0 : 1.0;
+		double result = str32equ (x->string, y->string) ? 0.0 : 1.0;
 		pushNumber (result);
 	} else {
-		Melder_throw ("Cannot compare (<>) ", Stackel_whichText (x), " to ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot compare (<>) ", Stackel_whichText (x), U" to ", Stackel_whichText (y), U".");
 	}
 }
-static void do_le (void) {
+static void do_le () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			x->number <= y->number ? 1.0 : 0.0);
 	} else if (x->which == Stackel_STRING && y->which == Stackel_STRING) {
-		double result = wcscmp (x->string, y->string) <= 0 ? 1.0 : 0.0;
+		double result = str32cmp (x->string, y->string) <= 0 ? 1.0 : 0.0;
 		pushNumber (result);
 	} else {
-		Melder_throw ("Cannot compare (<=) ", Stackel_whichText (x), " to ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot compare (<=) ", Stackel_whichText (x), U" to ", Stackel_whichText (y), U".");
 	}
 }
-static void do_lt (void) {
+static void do_lt () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			x->number < y->number ? 1.0 : 0.0);
 	} else if (x->which == Stackel_STRING && y->which == Stackel_STRING) {
-		double result = wcscmp (x->string, y->string) < 0 ? 1.0 : 0.0;
+		double result = str32cmp (x->string, y->string) < 0 ? 1.0 : 0.0;
 		pushNumber (result);
 	} else {
-		Melder_throw ("Cannot compare (<) ", Stackel_whichText (x), " to ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot compare (<) ", Stackel_whichText (x), U" to ", Stackel_whichText (y), U".");
 	}
 }
-static void do_ge (void) {
+static void do_ge () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			x->number >= y->number ? 1.0 : 0.0);
 	} else if (x->which == Stackel_STRING && y->which == Stackel_STRING) {
-		double result = wcscmp (x->string, y->string) >= 0 ? 1.0 : 0.0;
+		double result = str32cmp (x->string, y->string) >= 0 ? 1.0 : 0.0;
 		pushNumber (result);
 	} else {
-		Melder_throw ("Cannot compare (>=) ", Stackel_whichText (x), " to ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot compare (>=) ", Stackel_whichText (x), U" to ", Stackel_whichText (y), U".");
 	}
 }
-static void do_gt (void) {
+static void do_gt () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			x->number > y->number ? 1.0 : 0.0);
 	} else if (x->which == Stackel_STRING && y->which == Stackel_STRING) {
-		double result = wcscmp (x->string, y->string) > 0 ? 1.0 : 0.0;
+		double result = str32cmp (x->string, y->string) > 0 ? 1.0 : 0.0;
 		pushNumber (result);
 	} else {
-		Melder_throw ("Cannot compare (>) ", Stackel_whichText (x), " to ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot compare (>) ", Stackel_whichText (x), U" to ", Stackel_whichText (y), U".");
 	}
 }
-static void do_add (void) {
+static void do_add () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			x->number + y->number);
 	} else if (x->which == Stackel_STRING && y->which == Stackel_STRING) {
-		long length1 = wcslen (x->string), length2 = wcslen (y->string);
-		wchar_t *result = Melder_malloc (wchar_t, length1 + length2 + 1);
-		wcscpy (result, x->string);
-		wcscpy (result + length1, y->string);
+		long length1 = str32len (x->string), length2 = str32len (y->string);
+		char32 *result = Melder_malloc (char32, length1 + length2 + 1);
+		str32cpy (result, x->string);
+		str32cpy (result + length1, y->string);
 		pushString (result);
 	} else {
-		Melder_throw ("Cannot add ", Stackel_whichText (y), " to ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot add ", Stackel_whichText (y), U" to ", Stackel_whichText (x), U".");
 	}
 }
-static void do_sub (void) {
+static void do_sub () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			x->number - y->number);
 	} else if (x->which == Stackel_STRING && y->which == Stackel_STRING) {
-		long length1 = wcslen (x->string), length2 = wcslen (y->string), newlength = length1 - length2;
-		wchar_t *result;
-		if (newlength >= 0 && wcsnequ (x->string + newlength, y->string, length2)) {
-			result = Melder_malloc (wchar_t, newlength + 1);
-			wcsncpy (result, x->string, newlength);
+		int64 length1 = str32len (x->string), length2 = str32len (y->string), newlength = length1 - length2;
+		char32 *result;
+		if (newlength >= 0 && str32nequ (x->string + newlength, y->string, length2)) {
+			result = Melder_malloc (char32, newlength + 1);
+			str32ncpy (result, x->string, newlength);
 			result [newlength] = '\0';
 		} else {
-			result = Melder_wcsdup (x->string);
+			result = Melder_dup (x->string);
 		}
 		pushString (result);
 	} else {
-		Melder_throw ("Cannot subtract (-) ", Stackel_whichText (y), " from ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot subtract (-) ", Stackel_whichText (y), U" from ", Stackel_whichText (x), U".");
 	}
 }
-static void do_mul (void) {
+static void do_mul () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			x->number * y->number);
 	} else {
-		Melder_throw ("Cannot multiply (*) ", Stackel_whichText (x), " by ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot multiply (*) ", Stackel_whichText (x), U" by ", Stackel_whichText (y), U".");
 	}
 }
-static void do_rdiv (void) {
+static void do_rdiv () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			y->number == 0.0 ? NUMundefined :
 			x->number / y->number);
 	} else {
-		Melder_throw ("Cannot divide (/) ", Stackel_whichText (x), " by ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot divide (/) ", Stackel_whichText (x), U" by ", Stackel_whichText (y), U".");
 	}
 }
-static void do_idiv (void) {
+static void do_idiv () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			y->number == 0.0 ? NUMundefined :
 			floor (x->number / y->number));
 	} else {
-		Melder_throw ("Cannot divide (\"div\") ", Stackel_whichText (x), " by ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot divide (\"div\") ", Stackel_whichText (x), U" by ", Stackel_whichText (y), U".");
 	}
 }
-static void do_mod (void) {
+static void do_mod () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			y->number == 0.0 ? NUMundefined :
 			x->number - floor (x->number / y->number) * y->number);
 	} else {
-		Melder_throw ("Cannot divide (\"mod\") ", Stackel_whichText (x), " by ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot divide (\"mod\") ", Stackel_whichText (x), U" by ", Stackel_whichText (y), U".");
 	}
 }
-static void do_minus (void) {
+static void do_minus () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : - x->number);
 	} else {
-		Melder_throw ("Cannot take the opposite (-) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the opposite (-) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_power (void) {
+static void do_power () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			pow (x->number, y->number));
 	} else {
-		Melder_throw ("Cannot exponentiate (^) ", Stackel_whichText (x), " to ", Stackel_whichText (y), ".");
+		Melder_throw (U"Cannot exponentiate (^) ", Stackel_whichText (x), U" to ", Stackel_whichText (y), U".");
 	}
 }
-static void do_sqr (void) {
+static void do_sqr () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : x->number * x->number);
 	} else {
-		Melder_throw ("Cannot take the square (^ 2) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the square (^ 2) of ", Stackel_whichText (x), U".");
 	}
 }
 static void do_function_n_n (double (*f) (double)) {
@@ -2126,158 +2128,158 @@ static void do_function_n_n (double (*f) (double)) {
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : f (x->number));
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires a numeric argument, not ", Stackel_whichText (x), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires a numeric argument, not ", Stackel_whichText (x), U".");
 	}
 }
-static void do_abs (void) {
+static void do_abs () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : fabs (x->number));
 	} else {
-		Melder_throw ("Cannot take the absolute value (abs) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the absolute value (abs) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_round (void) {
+static void do_round () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : floor (x->number + 0.5));
 	} else {
-		Melder_throw ("Cannot round ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot round ", Stackel_whichText (x), U".");
 	}
 }
-static void do_floor (void) {
+static void do_floor () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : floor (x->number));
 	} else {
-		Melder_throw ("Cannot round down (floor) ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot round down (floor) ", Stackel_whichText (x), U".");
 	}
 }
-static void do_ceiling (void) {
+static void do_ceiling () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : ceil (x->number));
 	} else {
-		Melder_throw ("Cannot round up (ceiling) ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot round up (ceiling) ", Stackel_whichText (x), U".");
 	}
 }
-static void do_sqrt (void) {
+static void do_sqrt () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined :
 			x->number < 0.0 ? NUMundefined : sqrt (x->number));
 	} else {
-		Melder_throw ("Cannot take the square root (sqrt) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the square root (sqrt) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_sin (void) {
+static void do_sin () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : sin (x->number));
 	} else {
-		Melder_throw ("Cannot take the sine (sin) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the sine (sin) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_cos (void) {
+static void do_cos () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : cos (x->number));
 	} else {
-		Melder_throw ("Cannot take the cosine (cos) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the cosine (cos) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_tan (void) {
+static void do_tan () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : tan (x->number));
 	} else {
-		Melder_throw ("Cannot take the tangent (tan) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the tangent (tan) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_arcsin (void) {
+static void do_arcsin () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined :
 			fabs (x->number) > 1.0 ? NUMundefined : asin (x->number));
 	} else {
-		Melder_throw ("Cannot take the arcsine (arcsin) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the arcsine (arcsin) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_arccos (void) {
+static void do_arccos () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined :
 			fabs (x->number) > 1.0 ? NUMundefined : acos (x->number));
 	} else {
-		Melder_throw ("Cannot take the arccosine (arccos) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the arccosine (arccos) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_arctan (void) {
+static void do_arctan () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : atan (x->number));
 	} else {
-		Melder_throw ("Cannot take the arctangent (arctan) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the arctangent (arctan) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_exp (void) {
+static void do_exp () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : exp (x->number));
 	} else {
-		Melder_throw ("Cannot exponentiate (exp) ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot exponentiate (exp) ", Stackel_whichText (x), U".");
 	}
 }
-static void do_sinh (void) {
+static void do_sinh () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : sinh (x->number));
 	} else {
-		Melder_throw ("Cannot take the hyperbolic sine (sinh) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the hyperbolic sine (sinh) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_cosh (void) {
+static void do_cosh () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : cosh (x->number));
 	} else {
-		Melder_throw ("Cannot take the hyperbolic cosine (cosh) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the hyperbolic cosine (cosh) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_tanh (void) {
+static void do_tanh () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined : tanh (x->number));
 	} else {
-		Melder_throw ("Cannot take the hyperbolic tangent (tanh) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the hyperbolic tangent (tanh) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_log2 (void) {
+static void do_log2 () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined :
 			x->number <= 0.0 ? NUMundefined : log (x->number) * NUMlog2e);
 	} else {
-		Melder_throw ("Cannot take the base-2 logarithm (log2) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the base-2 logarithm (log2) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_ln (void) {
+static void do_ln () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined :
 			x->number <= 0.0 ? NUMundefined : log (x->number));
 	} else {
-		Melder_throw ("Cannot take the natural logarithm (ln) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the natural logarithm (ln) of ", Stackel_whichText (x), U".");
 	}
 }
-static void do_log10 (void) {
+static void do_log10 () {
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined ? NUMundefined :
 			x->number <= 0.0 ? NUMundefined : log10 (x->number));
 	} else {
-		Melder_throw ("Cannot take the base-10 logarithm (log10) of ", Stackel_whichText (x), ".");
+		Melder_throw (U"Cannot take the base-10 logarithm (log10) of ", Stackel_whichText (x), U".");
 	}
 }
 static void do_function_dd_d (double (*f) (double, double)) {
@@ -2286,16 +2288,16 @@ static void do_function_dd_d (double (*f) (double, double)) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
 			f (x->number, y->number));
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires two numeric arguments, not ",
-			Stackel_whichText (x), " and ", Stackel_whichText (y), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires two numeric arguments, not ",
+			Stackel_whichText (x), U" and ", Stackel_whichText (y), U".");
 	}
 }
 static void do_function_dd_d_numar (double (*f) (double, double)) {
 	Stackel n = pop;
 	Melder_assert (n -> which == Stackel_NUMBER);
 	if (n -> number != 3)
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol], " requires three arguments.");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol], U" requires three arguments.");
 	Stackel y = pop, x = pop, a = pop;
 	if (a->which == Stackel_NUMERIC_ARRAY && x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		long numberOfRows = a->numericArray.numberOfRows;
@@ -2308,16 +2310,16 @@ static void do_function_dd_d_numar (double (*f) (double, double)) {
 		}
 		pushNumericArray (numberOfRows, numberOfColumns, newData);
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires one array argument and two numeric arguments, not ",
-			Stackel_whichText (a), ", ", Stackel_whichText (x), " and ", Stackel_whichText (y), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires one array argument and two numeric arguments, not ",
+			Stackel_whichText (a), U", ", Stackel_whichText (x), U" and ", Stackel_whichText (y), U".");
 	}
 }
 static void do_function_ll_l_numar (long (*f) (long, long)) {
 	Stackel n = pop;
 	Melder_assert (n -> which == Stackel_NUMBER);
 	if (n -> number != 3)
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol], " requires three arguments.");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol], U" requires three arguments.");
 	Stackel y = pop, x = pop, a = pop;
 	if (a->which == Stackel_NUMERIC_ARRAY && x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		long numberOfRows = a->numericArray.numberOfRows;
@@ -2325,76 +2327,76 @@ static void do_function_ll_l_numar (long (*f) (long, long)) {
 		double **newData = NUMmatrix <double> (1, numberOfRows, 1, numberOfColumns);
 		for (long irow = 1; irow <= numberOfRows; irow ++) {
 			for (long icol = 1; icol <= numberOfColumns; icol ++) {
-				newData [irow] [icol] = f (x->number, y->number);
+				newData [irow] [icol] = f (lround (x->number), lround (y->number));
 			}
 		}
 		pushNumericArray (numberOfRows, numberOfColumns, newData);
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires one array argument and two numeric arguments, not ",
-			Stackel_whichText (a), ", ", Stackel_whichText (x), " and ", Stackel_whichText (y), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires one array argument and two numeric arguments, not ",
+			Stackel_whichText (a), U", ", Stackel_whichText (x), U" and ", Stackel_whichText (y), U".");
 	}
 }
 static void do_function_dl_d (double (*f) (double, long)) {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
-			f (x->number, y->number));
+			f (x->number, lround (y->number)));
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires two numeric arguments, not ",
-			Stackel_whichText (x), " and ", Stackel_whichText (y), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires two numeric arguments, not ",
+			Stackel_whichText (x), U" and ", Stackel_whichText (y), U".");
 	}
 }
 static void do_function_ld_d (double (*f) (long, double)) {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
-			f (x->number, y->number));
+			f (lround (x->number), y->number));
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires two numeric arguments, not ",
-			Stackel_whichText (x), " and ", Stackel_whichText (y), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires two numeric arguments, not ",
+			Stackel_whichText (x), U" and ", Stackel_whichText (y), U".");
 	}
 }
 static void do_function_ll_l (long (*f) (long, long)) {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
-			f (x->number, y->number));
+			f (lround (x->number), lround (y->number)));
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires two numeric arguments, not ",
-			Stackel_whichText (x), " and ", Stackel_whichText (y), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires two numeric arguments, not ",
+			Stackel_whichText (x), U" and ", Stackel_whichText (y), U".");
 	}
 }
 static void do_function_dl_l (long (*f) (double, long)) {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined :
-			f (x->number, y->number));
+			f (x->number, lround (y->number)));
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires two numeric arguments, not ",
-			Stackel_whichText (x), " and ", Stackel_whichText (y), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires two numeric arguments, not ",
+			Stackel_whichText (x), U" and ", Stackel_whichText (y), U".");
 	}
 }
-static void do_objects_are_identical (void) {
+static void do_objects_are_identical () {
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
-		int id1 = x->number, id2 = y->number;
+		int id1 = lround (x->number), id2 = lround (y->number);
 		int i = theCurrentPraatObjects -> n;
 		while (i > 0 && id1 != theCurrentPraatObjects -> list [i]. id) i --;
-		if (i == 0) Melder_throw ("Object #", id1, " does not exist in function objectsAreIdentical.");
-		Data object1 = (Data) theCurrentPraatObjects -> list [i]. object;
+		if (i == 0) Melder_throw (U"Object #", id1, U" does not exist in function objectsAreIdentical.");
+		Daata object1 = (Daata) theCurrentPraatObjects -> list [i]. object;
 		i = theCurrentPraatObjects -> n;
 		while (i > 0 && id2 != theCurrentPraatObjects -> list [i]. id) i --;
-		if (i == 0) Melder_throw ("Object #", id2, " does not exist in function objectsAreIdentical.");
-		Data object2 = (Data) theCurrentPraatObjects -> list [i]. object;
+		if (i == 0) Melder_throw (U"Object #", id2, U" does not exist in function objectsAreIdentical.");
+		Daata object2 = (Daata) theCurrentPraatObjects -> list [i]. object;
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined ? NUMundefined : Data_equal (object1, object2));
 	} else {
-		Melder_throw ("The function objectsAreIdentical requires two numeric arguments (object IDs), not ",
-			Stackel_whichText (x), " and ", Stackel_whichText (y), ".");
+		Melder_throw (U"The function objectsAreIdentical requires two numeric arguments (object IDs), not ",
+			Stackel_whichText (x), U" and ", Stackel_whichText (y), U".");
 	}
 }
 static void do_function_ddd_d (double (*f) (double, double, double)) {
@@ -2403,28 +2405,28 @@ static void do_function_ddd_d (double (*f) (double, double, double)) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined || z->number == NUMundefined ? NUMundefined :
 			f (x->number, y->number, z->number));
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires three numeric arguments, not ", Stackel_whichText (x), ", ",
-			Stackel_whichText (y), ", and ", Stackel_whichText (z), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires three numeric arguments, not ", Stackel_whichText (x), U", ",
+			Stackel_whichText (y), U", and ", Stackel_whichText (z), U".");
 	}
 }
 static void do_function_dll_d (double (*f) (double, long, long)) {
 	Stackel z = pop, y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER && z->which == Stackel_NUMBER) {
 		pushNumber (x->number == NUMundefined || y->number == NUMundefined || z->number == NUMundefined ? NUMundefined :
-			f (x->number, y->number, z->number));
+			f (x->number, lround (y->number), lround (z->number)));
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires three numeric arguments, not ", Stackel_whichText (x), ", ",
-			Stackel_whichText (y), ", and ", Stackel_whichText (z), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires three numeric arguments, not ", Stackel_whichText (x), U", ",
+			Stackel_whichText (y), U", and ", Stackel_whichText (z), U".");
 	}
 }
-static void do_do (void) {
+static void do_do () {
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
 	if (narg->number < 1)
-		Melder_throw ("The function \"do\" requires at least one argument, namely a menu command.");
-	int numberOfArguments = narg->number - 1;
+		Melder_throw (U"The function \"do\" requires at least one argument, namely a menu command.");
+	int numberOfArguments = lround (narg->number) - 1;
 	#define MAXNUM_FIELDS  40
 	structStackel stack [1+MAXNUM_FIELDS];
 	for (int iarg = numberOfArguments; iarg >= 0; iarg --) {
@@ -2432,33 +2434,33 @@ static void do_do (void) {
 		stack [iarg] = * arg;
 	}
 	if (stack [0]. which != Stackel_STRING)
-		Melder_throw ("The first argument of the function \"do\" has to be a string, namely a menu command, and not ", Stackel_whichText (& stack [0]), ".");
-	const wchar_t *command = stack [0]. string;
-	if (theCurrentPraatObjects == & theForegroundPraatObjects && praatP. editor != NULL) {
+		Melder_throw (U"The first argument of the function \"do\" has to be a string, namely a menu command, and not ", Stackel_whichText (& stack [0]), U".");
+	const char32 *command = stack [0]. string;
+	if (theCurrentPraatObjects == & theForegroundPraatObjects && praatP. editor != nullptr) {
 		autoMelderString valueString;
-		MelderString_empty (& valueString);
+		MelderString_appendCharacter (& valueString, 1);   // TODO: check whether this is needed at all, or is just MelderString_empty enough?
 		autoMelderDivertInfo divert (& valueString);
-		MelderString_appendCharacter (& valueString, 1);
-		Editor_doMenuCommand ((Editor) praatP. editor, command, numberOfArguments, & stack [0], NULL, theInterpreter);
+		autostring32 command2 = Melder_dup (command);   // allow the menu command to reuse the stack (?)
+		Editor_doMenuCommand (praatP. editor, command2.peek(), numberOfArguments, & stack [0], nullptr, theInterpreter);
 		pushNumber (Melder_atof (valueString.string));
 		return;
 	} else if (theCurrentPraatObjects != & theForegroundPraatObjects &&
-		(wcsnequ (command, L"Save ", 5) || wcsnequ (command, L"Write ", 6) || wcsnequ (command, L"Append ", 7) || wcsequ (command, L"Quit")))
+		(str32nequ (command, U"Save ", 5) || str32nequ (command, U"Write ", 6) || str32nequ (command, U"Append ", 7) || str32equ (command, U"Quit")))
 	{
-		Melder_throw ("Commands that write files (including Quit) are not available inside manuals.");
+		Melder_throw (U"Commands that write files (including Quit) are not available inside manuals.");
 	} else {
 		autoMelderString valueString;
-		MelderString_empty (& valueString);
+		MelderString_appendCharacter (& valueString, 1);   // a semaphor to check whether praat_doAction or praat_doMenuCommand wrote anything with MelderInfo
 		autoMelderDivertInfo divert (& valueString);
-		MelderString_appendCharacter (& valueString, 1);
-		if (! praat_doAction (command, numberOfArguments, & stack [0], theInterpreter) &&
-		    ! praat_doMenuCommand (command, numberOfArguments, & stack [0], theInterpreter))
+		autostring32 command2 = Melder_dup (command);   // allow the menu command to reuse the stack (?)
+		if (! praat_doAction (command2.peek(), numberOfArguments, & stack [0], theInterpreter) &&
+		    ! praat_doMenuCommand (command2.peek(), numberOfArguments, & stack [0], theInterpreter))
 		{
-			Melder_throw ("Command \"", command, "\" not available for current selection.");
+			Melder_throw (U"Command \"", command, U"\" not available for current selection.");
 		}
 		//praat_updateSelection ();
 		double value = NUMundefined;
-		if (valueString.string [0] == 1) {
+		if (valueString.string [0] == 1) {   // nothing written with MelderInfo by praat_doAction or praat_doMenuCommand? then the return value is the ID of the selected object
 			int IOBJECT, result = 0, found = 0;
 			WHERE (SELECTED) { result = IOBJECT; found += 1; }
 			if (found == 1) {
@@ -2473,12 +2475,12 @@ static void do_do (void) {
 	praat_updateSelection ();   // BUG: superfluous? flickering?
 	pushNumber (1);
 }
-static void do_doStr (void) {
+static void do_doStr () {
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
 	if (narg->number < 1)
-		Melder_throw ("The function \"do$\" requires at least one argument, namely a menu command.");
-	int numberOfArguments = narg->number - 1;
+		Melder_throw (U"The function \"do$\" requires at least one argument, namely a menu command.");
+	int numberOfArguments = lround (narg->number) - 1;
 	#define MAXNUM_FIELDS  40
 	structStackel stack [1+MAXNUM_FIELDS];
 	for (int iarg = numberOfArguments; iarg >= 0; iarg --) {
@@ -2486,45 +2488,47 @@ static void do_doStr (void) {
 		stack [iarg] = * arg;
 	}
 	if (stack [0]. which != Stackel_STRING)
-		Melder_throw ("The first argument of the function \"do$\" has to be a string, namely a menu command, and not ", Stackel_whichText (& stack [0]), ".");
-	const wchar_t *command = stack [0]. string;
-	if (theCurrentPraatObjects == & theForegroundPraatObjects && praatP. editor != NULL) {
+		Melder_throw (U"The first argument of the function \"do$\" has to be a string, namely a menu command, and not ", Stackel_whichText (& stack [0]), U".");
+	const char32 *command = stack [0]. string;
+	if (theCurrentPraatObjects == & theForegroundPraatObjects && praatP. editor != nullptr) {
 		static MelderString info;
 		MelderString_empty (& info);
 		autoMelderDivertInfo divert (& info);
-		Editor_doMenuCommand ((Editor) praatP. editor, command, numberOfArguments, & stack [0], NULL, theInterpreter);
-		pushString (Melder_wcsdup (info.string));
+		autostring32 command2 = Melder_dup (command);
+		Editor_doMenuCommand (praatP. editor, command2.peek(), numberOfArguments, & stack [0], nullptr, theInterpreter);
+		pushString (Melder_dup (info.string));
 		return;
 	} else if (theCurrentPraatObjects != & theForegroundPraatObjects &&
-		(wcsnequ (command, L"Save ", 5) || wcsnequ (command, L"Write ", 6) || wcsnequ (command, L"Append ", 7) || wcsequ (command, L"Quit")))
+		(str32nequ (command, U"Save ", 5) || str32nequ (command, U"Write ", 6) || str32nequ (command, U"Append ", 7) || str32equ (command, U"Quit")))
 	{
-		Melder_throw ("Commands that write files (including Quit) are not available inside manuals.");
+		Melder_throw (U"Commands that write files (including Quit) are not available inside manuals.");
 	} else {
 		static MelderString info;
 		MelderString_empty (& info);
 		autoMelderDivertInfo divert (& info);
-		if (! praat_doAction (command, numberOfArguments, & stack [0], theInterpreter) &&
-		    ! praat_doMenuCommand (command, numberOfArguments, & stack [0], theInterpreter))
+		autostring32 command2 = Melder_dup (command);
+		if (! praat_doAction (command2.peek(), numberOfArguments, & stack [0], theInterpreter) &&
+		    ! praat_doMenuCommand (command2.peek(), numberOfArguments, & stack [0], theInterpreter))
 		{
-			Melder_throw ("Command \"", command, "\" not available for current selection.");
+			Melder_throw (U"Command \"", command, U"\" not available for current selection.");
 		}
 		praat_updateSelection ();
-		pushString (Melder_wcsdup (info.string));
+		pushString (Melder_dup (info.string));
 		return;
 	}
 	praat_updateSelection ();   // BUG: superfluous? flickering?
-	pushString (Melder_wcsdup (L""));
+	pushString (Melder_dup (U""));
 }
 static void do_writeInfo () {
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	MelderInfo_open ();
 	for (int iarg = 1; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderInfo_write (Melder_double (arg->number));
+			MelderInfo_write (arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderInfo_write (arg->string);
 	}
@@ -2534,29 +2538,29 @@ static void do_writeInfo () {
 static void do_writeInfoLine () {
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	MelderInfo_open ();
 	for (int iarg = 1; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderInfo_write (Melder_double (arg->number));
+			MelderInfo_write (arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderInfo_write (arg->string);
 	}
-	MelderInfo_write (L"\n");
+	MelderInfo_write (U"\n");
 	MelderInfo_drain ();
 	pushNumber (1);
 }
 static void do_appendInfo () {
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	for (int iarg = 1; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderInfo_write (Melder_double (arg->number));
+			MelderInfo_write (arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderInfo_write (arg->string);
 	}
@@ -2566,163 +2570,163 @@ static void do_appendInfo () {
 static void do_appendInfoLine () {
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	for (int iarg = 1; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderInfo_write (Melder_double (arg->number));
+			MelderInfo_write (arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderInfo_write (arg->string);
 	}
-	MelderInfo_write (L"\n");
+	MelderInfo_write (U"\n");
 	MelderInfo_drain ();
 	pushNumber (1);
 }
 static void do_writeFile () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"writeFile\" is not available inside manuals.");
+		Melder_throw (U"The function \"writeFile\" is not available inside manuals.");
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	Stackel fileName = & theStack [w + 1];
 	if (fileName -> which != Stackel_STRING) {
-		Melder_throw ("The first argument of \"writeFile\" has to be a string (a file name), not ", Stackel_whichText (fileName), ".");
+		Melder_throw (U"The first argument of \"writeFile\" has to be a string (a file name), not ", Stackel_whichText (fileName), U".");
 	}
 	autoMelderString text;
 	for (int iarg = 2; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderString_append (& text, Melder_double (arg->number));
+			MelderString_append (& text, arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderString_append (& text, arg->string);
 	}
 	structMelderFile file = { 0 };
 	Melder_relativePathToFile (fileName -> string, & file);
-	MelderFile_writeText (& file, text.transfer(), Melder_getOutputEncoding ());
+	MelderFile_writeText (& file, text.string, Melder_getOutputEncoding ());
 	pushNumber (1);
 }
 static void do_writeFileLine () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"writeFile\" is not available inside manuals.");
+		Melder_throw (U"The function \"writeFile\" is not available inside manuals.");
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	Stackel fileName = & theStack [w + 1];
 	if (fileName -> which != Stackel_STRING) {
-		Melder_throw ("The first argument of \"writeFile\" has to be a string (a file name), not ", Stackel_whichText (fileName), ".");
+		Melder_throw (U"The first argument of \"writeFile\" has to be a string (a file name), not ", Stackel_whichText (fileName), U".");
 	}
 	autoMelderString text;
 	for (int iarg = 2; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderString_append (& text, Melder_double (arg->number));
+			MelderString_append (& text, arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderString_append (& text, arg->string);
 	}
-	MelderString_appendCharacter (& text, '\n');
+	MelderString_appendCharacter (& text, U'\n');
 	structMelderFile file = { 0 };
 	Melder_relativePathToFile (fileName -> string, & file);
-	MelderFile_writeText (& file, text.transfer(), Melder_getOutputEncoding ());
+	MelderFile_writeText (& file, text.string, Melder_getOutputEncoding ());
 	pushNumber (1);
 }
 static void do_appendFile () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"writeFile\" is not available inside manuals.");
+		Melder_throw (U"The function \"writeFile\" is not available inside manuals.");
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	Stackel fileName = & theStack [w + 1];
 	if (fileName -> which != Stackel_STRING) {
-		Melder_throw ("The first argument of \"writeFile\" has to be a string (a file name), not ", Stackel_whichText (fileName), ".");
+		Melder_throw (U"The first argument of \"writeFile\" has to be a string (a file name), not ", Stackel_whichText (fileName), U".");
 	}
 	autoMelderString text;
 	for (int iarg = 2; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderString_append (& text, Melder_double (arg->number));
+			MelderString_append (& text, arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderString_append (& text, arg->string);
 	}
 	structMelderFile file = { 0 };
 	Melder_relativePathToFile (fileName -> string, & file);
-	MelderFile_appendText (& file, text.transfer());
+	MelderFile_appendText (& file, text.string);
 	pushNumber (1);
 }
 static void do_appendFileLine () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"writeFile\" is not available inside manuals.");
+		Melder_throw (U"The function \"writeFile\" is not available inside manuals.");
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	Stackel fileName = & theStack [w + 1];
 	if (fileName -> which != Stackel_STRING) {
-		Melder_throw ("The first argument of \"writeFile\" has to be a string (a file name), not ", Stackel_whichText (fileName), ".");
+		Melder_throw (U"The first argument of \"writeFile\" has to be a string (a file name), not ", Stackel_whichText (fileName), U".");
 	}
 	autoMelderString text;
 	for (int iarg = 2; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderString_append (& text, Melder_double (arg->number));
+			MelderString_append (& text, arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderString_append (& text, arg->string);
 	}
 	MelderString_appendCharacter (& text, '\n');
 	structMelderFile file = { 0 };
 	Melder_relativePathToFile (fileName -> string, & file);
-	MelderFile_appendText (& file, text.transfer());
+	MelderFile_appendText (& file, text.string);
 	pushNumber (1);
 }
 static void do_pauseScript () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"pause\" is not available inside manuals.");
+		Melder_throw (U"The function \"pause\" is not available inside manuals.");
 	if (theCurrentPraatApplication -> batch) return;   // in batch we ignore pause statements
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	autoMelderString buffer;
 	for (int iarg = 1; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderString_append (& buffer, Melder_double (arg->number));
+			MelderString_append (& buffer, arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderString_append (& buffer, arg->string);
 	}
-	UiPause_begin (theCurrentPraatApplication -> topShell, L"stop or continue", theInterpreter);
-	UiPause_comment (numberOfArguments == 0 ? L"..." : buffer.string);
-	UiPause_end (1, 1, 0, L"Continue", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, theInterpreter);
+	UiPause_begin (theCurrentPraatApplication -> topShell, U"stop or continue", theInterpreter);
+	UiPause_comment (numberOfArguments == 0 ? U"..." : buffer.string);
+	UiPause_end (1, 1, 0, U"Continue", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, theInterpreter);
 	pushNumber (1);
 }
 static void do_exitScript () {
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	for (int iarg = 1; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			Melder_error_noLine (Melder_double (arg->number));
+			Melder_appendError_noLine (arg->number);
 		else if (arg->which == Stackel_STRING)
-			Melder_error_noLine (arg->string);
+			Melder_appendError_noLine (arg->string);
 	}
-	Melder_throw ("\nScript exited.");
+	Melder_throw (U"\nScript exited.");
 	pushNumber (1);
 }
 static void do_runScript () {
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	if (numberOfArguments < 1)
-		Melder_throw ("The function \"runScript\" requires at least one argument, namely the file name.");
+		Melder_throw (U"The function \"runScript\" requires at least one argument, namely the file name.");
 	w -= numberOfArguments;
 	Stackel fileName = & theStack [w + 1];
 	if (fileName->which != Stackel_STRING)
-		Melder_throw ("The first argument to \"runScript\" has to be a string (the file name), not ", Stackel_whichText (fileName));
+		Melder_throw (U"The first argument to \"runScript\" has to be a string (the file name), not ", Stackel_whichText (fileName));
 	theLevel += 1;
 	try {
 		praat_executeScriptFromFileName (fileName->string, numberOfArguments - 1, & theStack [w + 1]);
@@ -2735,39 +2739,39 @@ static void do_runScript () {
 }
 static void do_runSystem () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"runSystem\" is not available inside manuals.");
+		Melder_throw (U"The function \"runSystem\" is not available inside manuals.");
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	autoMelderString text;
 	for (int iarg = 1; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderString_append (& text, Melder_double (arg->number));
+			MelderString_append (& text, arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderString_append (& text, arg->string);
 	}
 	try {
 		Melder_system (text.string);
 	} catch (MelderError) {
-		Melder_throw ("System command \"", text.string, "\" returned error status;\n"
-			"if you want to ignore this, use `runSystem_nocheck' instead of `runSystem'.");
+		Melder_throw (U"System command \"", text.string, U"\" returned error status;\n"
+			U"if you want to ignore this, use `runSystem_nocheck' instead of `runSystem'.");
 	}
 	pushNumber (1);
 }
 static void do_runSystem_nocheck () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"runSystem\" is not available inside manuals.");
+		Melder_throw (U"The function \"runSystem\" is not available inside manuals.");
 	Stackel narg = pop;
 	Melder_assert (narg->which == Stackel_NUMBER);
-	int numberOfArguments = narg->number;
+	int numberOfArguments = lround (narg->number);
 	w -= numberOfArguments;
 	autoMelderString text;
 	for (int iarg = 1; iarg <= numberOfArguments; iarg ++) {
 		Stackel arg = & theStack [w + iarg];
 		if (arg->which == Stackel_NUMBER)
-			MelderString_append (& text, Melder_double (arg->number));
+			MelderString_append (& text, arg->number);
 		else if (arg->which == Stackel_STRING)
 			MelderString_append (& text, arg->string);
 	}
@@ -2778,59 +2782,59 @@ static void do_runSystem_nocheck () {
 	}
 	pushNumber (1);
 }
-static void do_min (void) {
+static void do_min () {
 	Stackel n = pop, last;
 	double result;
 	Melder_assert (n->which == Stackel_NUMBER);
 	if (n->number < 1)
-		Melder_throw ("The function \"min\" requires at least one argument.");
+		Melder_throw (U"The function \"min\" requires at least one argument.");
 	last = pop;
 	if (last->which != Stackel_NUMBER)
-		Melder_throw ("The function \"min\" can only have numeric arguments, not ", Stackel_whichText (last), ".");
+		Melder_throw (U"The function \"min\" can only have numeric arguments, not ", Stackel_whichText (last), U".");
 	result = last->number;
-	for (int j = n->number - 1; j > 0; j --) {
+	for (int j = lround (n->number) - 1; j > 0; j --) {
 		Stackel previous = pop;
 		if (previous->which != Stackel_NUMBER)
-			Melder_throw ("The function \"min\" can only have numeric arguments, not ", Stackel_whichText (previous), ".");
+			Melder_throw (U"The function \"min\" can only have numeric arguments, not ", Stackel_whichText (previous), U".");
 		result = result == NUMundefined || previous->number == NUMundefined ? NUMundefined :
 			result < previous->number ? result : previous->number;
 	}
 	pushNumber (result);
 }
-static void do_max (void) {
+static void do_max () {
 	Stackel n = pop, last;
 	double result;
 	Melder_assert (n->which == Stackel_NUMBER);
 	if (n->number < 1)
-		Melder_throw ("The function \"max\" requires at least one argument.");
+		Melder_throw (U"The function \"max\" requires at least one argument.");
 	last = pop;
 	if (last->which != Stackel_NUMBER)
-		Melder_throw ("The function \"max\" can only have numeric arguments, not ", Stackel_whichText (last), ".");
+		Melder_throw (U"The function \"max\" can only have numeric arguments, not ", Stackel_whichText (last), U".");
 	result = last->number;
-	for (int j = n->number - 1; j > 0; j --) {
+	for (int j = lround (n->number) - 1; j > 0; j --) {
 		Stackel previous = pop;
 		if (previous->which != Stackel_NUMBER)
-			Melder_throw ("The function \"max\" can only have numeric arguments, not ", Stackel_whichText (previous), ".");
+			Melder_throw (U"The function \"max\" can only have numeric arguments, not ", Stackel_whichText (previous), U".");
 		result = result == NUMundefined || previous->number == NUMundefined ? NUMundefined :
 			result > previous->number ? result : previous->number;
 	}
 	pushNumber (result);
 }
-static void do_imin (void) {
+static void do_imin () {
 	Stackel n = pop, last;
 	double minimum, result;
 	Melder_assert (n->which == Stackel_NUMBER);
 	if (n->number < 1)
-		Melder_throw ("The function \"imin\" requires at least one argument.");
+		Melder_throw (U"The function \"imin\" requires at least one argument.");
 	last = pop;
 	if (last->which != Stackel_NUMBER)
-		Melder_throw ("The function \"imin\" can only have numeric arguments, not ", Stackel_whichText (last), ".");
+		Melder_throw (U"The function \"imin\" can only have numeric arguments, not ", Stackel_whichText (last), U".");
 	minimum = last->number;
 	result = n->number;
-	for (int j = n->number - 1; j > 0; j --) {
+	for (int j = lround (n->number) - 1; j > 0; j --) {
 		Stackel previous = pop;
 		if (previous->which != Stackel_NUMBER)
-			Melder_throw ("The function \"imin\" can only have numeric arguments, not ", Stackel_whichText (previous), ".");
+			Melder_throw (U"The function \"imin\" can only have numeric arguments, not ", Stackel_whichText (previous), U".");
 		if (minimum == NUMundefined || previous->number == NUMundefined) {
 			minimum = NUMundefined;
 			result = NUMundefined;
@@ -2841,21 +2845,21 @@ static void do_imin (void) {
 	}
 	pushNumber (result);
 }
-static void do_imax (void) {
+static void do_imax () {
 	Stackel n = pop, last;
 	double maximum, result;
 	Melder_assert (n->which == Stackel_NUMBER);
 	if (n->number < 1)
-		Melder_throw ("The function \"imax\" requires at least one argument.");
+		Melder_throw (U"The function \"imax\" requires at least one argument.");
 	last = pop;
 	if (last->which != Stackel_NUMBER)
-		Melder_throw ("The function \"imax\" can only have numeric arguments, not ", Stackel_whichText (last), ".");
+		Melder_throw (U"The function \"imax\" can only have numeric arguments, not ", Stackel_whichText (last), U".");
 	maximum = last->number;
 	result = n->number;
-	for (int j = n->number - 1; j > 0; j --) {
+	for (int j = lround (n->number) - 1; j > 0; j --) {
 		Stackel previous = pop;
 		if (previous->which != Stackel_NUMBER)
-			Melder_throw ("The function \"imax\" can only have numeric arguments, not ", Stackel_whichText (previous), ".");
+			Melder_throw (U"The function \"imax\" can only have numeric arguments, not ", Stackel_whichText (previous), U".");
 		if (maximum == NUMundefined || previous->number == NUMundefined) {
 			maximum = NUMundefined;
 			result = NUMundefined;
@@ -2866,69 +2870,69 @@ static void do_imax (void) {
 	}
 	pushNumber (result);
 }
-static void do_zeroNumar (void) {
+static void do_zeroNumar () {
 	Stackel n = pop;
 	Melder_assert (n -> which == Stackel_NUMBER);
-	int rank = n -> number;
+	int rank = lround (n -> number);
 	if (rank < 1)
-		Melder_throw ("The function \"zero#\" requires arguments.");
+		Melder_throw (U"The function \"zero#\" requires arguments.");
 	long numberOfRows = 1, numberOfColumns = 1;
 	if (rank > 1) {
 		if (rank > 2)
-			Melder_throw ("The function \"zero#\" cannot have more than two arguments.");
+			Melder_throw (U"The function \"zero#\" cannot have more than two arguments.");
 		Stackel ncol = pop;
 		if (ncol -> which != Stackel_NUMBER)
-			Melder_throw ("In the function \"zero#\", the number of columns has to be a number, not ", Stackel_whichText (ncol), ".");
-		numberOfColumns = ncol -> number;
+			Melder_throw (U"In the function \"zero#\", the number of columns has to be a number, not ", Stackel_whichText (ncol), U".");
+		numberOfColumns = lround (ncol -> number);
 	}
 	Stackel nrow = pop;
 	if (nrow -> which != Stackel_NUMBER)
-		Melder_throw ("In the function \"zero#\", the number of rows has to be a number, not ", Stackel_whichText (nrow), ".");
-	numberOfRows = nrow -> number;
+		Melder_throw (U"In the function \"zero#\", the number of rows has to be a number, not ", Stackel_whichText (nrow), U".");
+	numberOfRows = lround (nrow -> number);
 	if (numberOfRows == NUMundefined)
-		Melder_throw ("In the function \"zero#\", the number of rows is undefined.");
+		Melder_throw (U"In the function \"zero#\", the number of rows is undefined.");
 	if (numberOfColumns == NUMundefined)
-		Melder_throw ("In the function \"zero#\", the number of columns is undefined.");
+		Melder_throw (U"In the function \"zero#\", the number of columns is undefined.");
 	if (numberOfRows <= 0)
-		Melder_throw ("In the function \"zero#\", the number of rows has to be positive.");
+		Melder_throw (U"In the function \"zero#\", the number of rows has to be positive.");
 	if (numberOfColumns <= 0)
-		Melder_throw ("In the function \"zero#\", the number of columns has to be positive.");
+		Melder_throw (U"In the function \"zero#\", the number of columns has to be positive.");
 	autoNUMmatrix <double> data (1, numberOfRows, 1, numberOfColumns);
 	pushNumericArray (numberOfRows, numberOfColumns, data.transfer());
 }
-static void do_linearNumar (void) {
+static void do_linearNumar () {
 	Stackel stackel_narg = pop;
 	Melder_assert (stackel_narg -> which == Stackel_NUMBER);
-	int narg = stackel_narg -> number;
+	int narg = lround (stackel_narg -> number);
 	if (narg < 3 || narg > 4)
-		Melder_throw ("The function \"linear#\" requires three or four arguments.");
+		Melder_throw (U"The function \"linear#\" requires three or four arguments.");
 	bool excludeEdges = false;   // default
 	if (narg == 4) {
 		Stackel stack_excludeEdges = pop;
 		if (stack_excludeEdges -> which != Stackel_NUMBER)
-			Melder_throw ("In the function \"linear#\", the edge exclusion flag (fourth argument) has to be a number, not ", Stackel_whichText (stack_excludeEdges), ".");
-		excludeEdges = stack_excludeEdges -> number;
+			Melder_throw (U"In the function \"linear#\", the edge exclusion flag (fourth argument) has to be a number, not ", Stackel_whichText (stack_excludeEdges), U".");
+		excludeEdges = lround (stack_excludeEdges -> number);
 	}
 	Stackel stack_numberOfSteps = pop, stack_maximum = pop, stack_minimum = pop;
 	if (stack_minimum -> which != Stackel_NUMBER)
-		Melder_throw ("In the function \"linear#\", the minimum (first argument) has to be a number, not ", Stackel_whichText (stack_minimum), ".");
+		Melder_throw (U"In the function \"linear#\", the minimum (first argument) has to be a number, not ", Stackel_whichText (stack_minimum), U".");
 	double minimum = stack_minimum -> number;
 	if (minimum == NUMundefined)
-		Melder_throw ("Undefined minimum in the function \"linear#\" (first argument).");
+		Melder_throw (U"Undefined minimum in the function \"linear#\" (first argument).");
 	if (stack_maximum -> which != Stackel_NUMBER)
-		Melder_throw ("In the function \"linear#\", the maximum (second argument) has to be a number, not ", Stackel_whichText (stack_maximum), ".");
+		Melder_throw (U"In the function \"linear#\", the maximum (second argument) has to be a number, not ", Stackel_whichText (stack_maximum), U".");
 	double maximum = stack_maximum -> number;
 	if (maximum == NUMundefined)
-		Melder_throw ("Undefined maximum in the function \"linear#\" (second argument).");
+		Melder_throw (U"Undefined maximum in the function \"linear#\" (second argument).");
 	if (maximum < minimum)
-		Melder_throw ("Maximum (", maximum, L") smaller than minimum (", minimum, ") in function \"linear#\".");
+		Melder_throw (U"Maximum (", maximum, U") smaller than minimum (", minimum, U") in function \"linear#\".");
 	if (stack_numberOfSteps -> which != Stackel_NUMBER)
-		Melder_throw ("In the function \"linear#\", the number of steps (third argument) has to be a number, not ", Stackel_whichText (stack_numberOfSteps), ".");
+		Melder_throw (U"In the function \"linear#\", the number of steps (third argument) has to be a number, not ", Stackel_whichText (stack_numberOfSteps), U".");
 	if (stack_numberOfSteps -> number == NUMundefined)
-		Melder_throw ("Undefined number of steps in the function \"linear#\" (third argument).");
-	long numberOfSteps = floor (stack_numberOfSteps -> number + 0.5);
+		Melder_throw (U"Undefined number of steps in the function \"linear#\" (third argument).");
+	long numberOfSteps = lround (stack_numberOfSteps -> number);
 	if (numberOfSteps <= 0)
-		Melder_throw ("In the function \"linear#\", the number of steps (third argument) has to be positive, not ", numberOfSteps, ".");
+		Melder_throw (U"In the function \"linear#\", the number of steps (third argument) has to be positive, not ", numberOfSteps, U".");
 	autoNUMmatrix <double> data (1, numberOfSteps, 1, 1);
 	for (long irow = 1; irow <= numberOfSteps; irow ++) {
 		data [irow] [1] = excludeEdges ?
@@ -2938,181 +2942,195 @@ static void do_linearNumar (void) {
 	if (! excludeEdges) data [numberOfSteps] [1] = maximum;   // remove rounding problems
 	pushNumericArray (numberOfSteps, 1, data.transfer());
 }
-static void do_numberOfRows (void) {
+static void do_numberOfRows () {
 	Stackel n = pop;
 	Melder_assert (n->which == Stackel_NUMBER);
 	if (n->number != 1)
-		Melder_throw ("The function \"numberOfRows\" requires one argument.");
+		Melder_throw (U"The function \"numberOfRows\" requires one argument.");
 	Stackel array = pop;
 	if (array->which == Stackel_NUMERIC_ARRAY) {
 		pushNumber (array->numericArray.numberOfRows);
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires a numeric argument, not ", Stackel_whichText (array), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires a numeric argument, not ", Stackel_whichText (array), U".");
 	}
 }
-static void do_numberOfColumns (void) {
+static void do_numberOfColumns () {
 	Stackel n = pop;
 	Melder_assert (n->which == Stackel_NUMBER);
 	if (n->number != 1)
-		Melder_throw ("The function \"numberOfColumns\" requires one argument.");
+		Melder_throw (U"The function \"numberOfColumns\" requires one argument.");
 	Stackel array = pop;
 	if (array->which == Stackel_NUMERIC_ARRAY) {
 		pushNumber (array->numericArray.numberOfColumns);
 	} else {
-		Melder_throw ("The function ", Formula_instructionNames [parse [programPointer]. symbol],
-			" requires a numeric argument, not ", Stackel_whichText (array), ".");
+		Melder_throw (U"The function ", Formula_instructionNames [parse [programPointer]. symbol],
+			U" requires a numeric argument, not ", Stackel_whichText (array), U".");
 	}
 }
-static void do_editor (void) {
+static void do_editor () {
 	Stackel n = pop;
 	Melder_assert (n->which == Stackel_NUMBER);
 	if (n->number == 0) {
 		if (theInterpreter && theInterpreter -> editorClass) {
 			praatP. editor = praat_findEditorFromString (theInterpreter -> environmentName);
 		} else {
-			Melder_throw ("The function \"editor\" requires an argument when called from outside an editor.");
+			Melder_throw (U"The function \"editor\" requires an argument when called from outside an editor.");
 		}
 	} else if (n->number == 1) {
 		Stackel editor = pop;
 		if (editor->which == Stackel_STRING) {
 			praatP. editor = praat_findEditorFromString (editor->string);
 		} else if (editor->which == Stackel_NUMBER) {
-			praatP. editor = praat_findEditorById (round (editor->number));
+			praatP. editor = praat_findEditorById (lround (editor->number));
 		} else {
-			Melder_throw ("The function \"editor\" requires a numeric or string argument, not ", Stackel_whichText (editor), ".");
+			Melder_throw (U"The function \"editor\" requires a numeric or string argument, not ", Stackel_whichText (editor), U".");
 		}
 	} else {
-		Melder_throw ("The function \"editor\" requires 0 or 1 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"editor\" requires 0 or 1 arguments, not ", n->number, U".");
 	}
 	pushNumber (1);
 }
 
-static void do_numericArrayElement (void) {
+static void do_hash () {
+	Stackel n = pop;
+	Melder_assert (n->which == Stackel_NUMBER);
+	if (n->number == 1) {
+		Stackel s = pop;
+		if (s->which == Stackel_STRING) {
+			double result = NUMhashString (s->string);
+			pushNumber (result);
+		} else {
+			Melder_throw (U"The function \"hash\" requires a string, not ", Stackel_whichText (s), U".");
+		}
+	} else {
+		Melder_throw (U"The function \"hash\" requires 1 argument, not ", n->number, U".");
+	}
+}
+
+static void do_numericArrayElement () {
 	Stackel n = pop;
 	Melder_assert (n -> which == Stackel_NUMBER);
-	int narg = n -> number;
+	int narg = lround (n -> number);
 	if (narg < 1 || narg > 2)
-		Melder_throw ("Array indexing requires one or two arguments.");
+		Melder_throw (U"Array indexing requires one or two arguments.");
 	InterpreterVariable array = parse [programPointer]. content.variable;
 	long row = 1, column = 1;   // default
 	if (narg > 1) {
 		Stackel c = pop;
 		if (c -> which != Stackel_NUMBER)
-			Melder_throw ("In array indexing, the column index has to be a number, not ", Stackel_whichText (c), ".");
+			Melder_throw (U"In array indexing, the column index has to be a number, not ", Stackel_whichText (c), U".");
 		if (c -> number == NUMundefined)
-			Melder_throw ("The column index is undefined.");
-		column = floor (c -> number + 0.5);
+			Melder_throw (U"The column index is undefined.");
+		column = lround (c -> number);
 		if (column <= 0)
-			Melder_throw ("In array indexing, the column index has to be positive.");
+			Melder_throw (U"In array indexing, the column index has to be positive.");
 		if (column > array -> numericArrayValue. numberOfColumns)
-			Melder_throw ("Column index out of bounds.");
+			Melder_throw (U"Column index out of bounds.");
 	}
 	Stackel r = pop;
 	if (r -> which != Stackel_NUMBER)
-		Melder_throw ("In array indexing, the row index has to be a number, not ", Stackel_whichText (r), ".");
+		Melder_throw (U"In array indexing, the row index has to be a number, not ", Stackel_whichText (r), U".");
 	if (r -> number == NUMundefined)
-		Melder_throw ("The row index is undefined.");
-	row = floor (r -> number + 0.5);
+		Melder_throw (U"The row index is undefined.");
+	row = lround (r -> number);
 	if (row <= 0)
-		Melder_throw ("In array indexing, the row index has to be positive.");
+		Melder_throw (U"In array indexing, the row index has to be positive.");
 	if (row > array -> numericArrayValue. numberOfRows)
-		Melder_throw ("Row index out of bounds.");
+		Melder_throw (U"Row index out of bounds.");
 	pushNumber (array -> numericArrayValue. data [row] [column]);
 }
-static void do_indexedNumericVariable (void) {
+static void do_indexedNumericVariable () {
 	Stackel n = pop;
 	Melder_assert (n -> which == Stackel_NUMBER);
-	int nindex = n -> number;
+	int nindex = lround (n -> number);
 	if (nindex < 1)
-		Melder_throw ("Indexed variables require at least one index.");
-	wchar_t *indexedVariableName = parse [programPointer]. content.string;
-	static MelderString totalVariableName = { 0 };
-	MelderString_copy (& totalVariableName, indexedVariableName);
-	MelderString_append (& totalVariableName, L"[");
+		Melder_throw (U"Indexed variables require at least one index.");
+	char32 *indexedVariableName = parse [programPointer]. content.string;
+	static MelderString totalVariableName { 0 };
+	MelderString_copy (& totalVariableName, indexedVariableName, U"[");
 	w -= nindex;
 	for (int iindex = 1; iindex <= nindex; iindex ++) {
 		Stackel index = & theStack [w + iindex];
 		if (index -> which != Stackel_NUMBER)
-			Melder_throw ("In indexed variables, the index has to be a number, not ", Stackel_whichText (index), ".");
-		MelderString_append (& totalVariableName, Melder_double (index -> number), iindex == nindex ? L"]" : L",");
+			Melder_throw (U"In indexed variables, the index has to be a number, not ", Stackel_whichText (index), U".");
+		MelderString_append (& totalVariableName, index -> number, iindex == nindex ? U"]" : U",");
 	}
 	InterpreterVariable var = Interpreter_hasVariable (theInterpreter, totalVariableName.string);
-	if (var == NULL)
-		Melder_throw ("Undefined indexed variable " L_LEFT_GUILLEMET, totalVariableName.string, L_RIGHT_GUILLEMET ".");
+	if (! var)
+		Melder_throw (U"Undefined indexed variable " U_LEFT_GUILLEMET, totalVariableName.string, U_RIGHT_GUILLEMET U".");
 	pushNumber (var -> numericValue);
 }
-static void do_indexedStringVariable (void) {
+static void do_indexedStringVariable () {
 	Stackel n = pop;
 	Melder_assert (n -> which == Stackel_NUMBER);
-	int nindex = n -> number;
+	int nindex = lround (n -> number);
 	if (nindex < 1)
-		Melder_throw ("Indexed variables require at least one index.");
-	wchar_t *indexedVariableName = parse [programPointer]. content.string;
-	static MelderString totalVariableName = { 0 };
-	MelderString_copy (& totalVariableName, indexedVariableName);
-	MelderString_append (& totalVariableName, L"[");
+		Melder_throw (U"Indexed variables require at least one index.");
+	char32 *indexedVariableName = parse [programPointer]. content.string;
+	static MelderString totalVariableName { 0 };
+	MelderString_copy (& totalVariableName, indexedVariableName, U"[");
 	w -= nindex;
 	for (int iindex = 1; iindex <= nindex; iindex ++) {
 		Stackel index = & theStack [w + iindex];
 		if (index -> which != Stackel_NUMBER)
-			Melder_throw ("In indexed variables, the index has to be a number, not ", Stackel_whichText (index), ".");
-		MelderString_append (& totalVariableName, Melder_double (index -> number), iindex == nindex ? L"]" : L",");
+			Melder_throw (U"In indexed variables, the index has to be a number, not ", Stackel_whichText (index), U".");
+		MelderString_append (& totalVariableName, index -> number, iindex == nindex ? U"]" : U",");
 	}
 	InterpreterVariable var = Interpreter_hasVariable (theInterpreter, totalVariableName.string);
-	if (var == NULL)
-		Melder_throw ("Undefined indexed variable " L_LEFT_GUILLEMET, totalVariableName.string, L_RIGHT_GUILLEMET ".");
-	autostring result = Melder_wcsdup (var -> stringValue);
+	if (! var)
+		Melder_throw (U"Undefined indexed variable " U_LEFT_GUILLEMET, totalVariableName.string, U_RIGHT_GUILLEMET U".");
+	autostring32 result = Melder_dup (var -> stringValue);
 	pushString (result.transfer());
 }
-static void do_length (void) {
+static void do_length () {
 	Stackel s = pop;
 	if (s->which == Stackel_STRING) {
-		double result = wcslen (s->string);
+		double result = str32len (s->string);
 		pushNumber (result);
 	} else {
-		Melder_throw ("The function \"length\" requires a string, not ", Stackel_whichText (s), ".");
+		Melder_throw (U"The function \"length\" requires a string, not ", Stackel_whichText (s), U".");
 	}
 }
-static void do_number (void) {
+static void do_number () {
 	Stackel s = pop;
 	if (s->which == Stackel_STRING) {
 		double result = Melder_atof (s->string);
 		pushNumber (result);
 	} else {
-		Melder_throw ("The function \"number\" requires a string, not ", Stackel_whichText (s), ".");
+		Melder_throw (U"The function \"number\" requires a string, not ", Stackel_whichText (s), U".");
 	}
 }
-static void do_fileReadable (void) {
+static void do_fileReadable () {
 	Stackel s = pop;
 	if (s->which == Stackel_STRING) {
 		structMelderFile file = { 0 };
 		Melder_relativePathToFile (s->string, & file);
 		pushNumber (MelderFile_readable (& file));
 	} else {
-		Melder_throw ("The function \"fileReadable\" requires a string, not ", Stackel_whichText (s), ".");
+		Melder_throw (U"The function \"fileReadable\" requires a string, not ", Stackel_whichText (s), U".");
 	}
 }
-static void do_dateStr (void) {
-	time_t today = time (NULL);
-	wchar_t *date, *newline;
-	date = Melder_utf8ToWcs (ctime (& today));
-	newline = wcschr (date, '\n');
-	if (newline) *newline = '\0';
+static void do_dateStr () {
+	time_t today = time (nullptr);
+	char32 *date, *newline;
+	date = Melder_8to32 (ctime (& today));
+	newline = str32chr (date, U'\n');
+	if (newline) *newline = U'\0';
 	pushString (date);
 }
-static void do_infoStr (void) {
-	wchar_t *info = Melder_wcsdup (Melder_getInfo ());
+static void do_infoStr () {
+	char32 *info = Melder_dup (Melder_getInfo ());
 	pushString (info);
 }
-static void do_leftStr (void) {
-//Melder_casual ("entering left$");
+static void do_leftStr () {
+	trace (U"enter");
 	Stackel narg = pop;
 	if (narg->number == 1 || narg->number == 2) {
-		Stackel x = ( narg->number == 2 ? pop : NULL ), s = pop;
-		if (s->which == Stackel_STRING && (x == NULL || x->which == Stackel_NUMBER)) {
-			long newlength = x ? x->number : 1;
-			long length = wcslen (s->string);
+		Stackel x = ( narg->number == 2 ? pop : nullptr ), s = pop;
+		if (s->which == Stackel_STRING && (x == nullptr || x->which == Stackel_NUMBER)) {
+			long newlength = x ? lround (x->number) : 1;
+			long length = str32len (s->string);
 			if (newlength < 0) newlength = 0;
 			if (newlength > length) newlength = length;
 			#if 0
@@ -3120,116 +3138,116 @@ static void do_leftStr (void) {
 				autostring s2 = s1;   // copy constructor disabled
 				s1 = s2;
 			#endif
-			autostring result = Melder_malloc (wchar_t, newlength + 1);
-			wcsncpy (result.peek(), s->string, newlength);
+			autostring32 result = Melder_malloc (char32, newlength + 1);
+			str32ncpy (result.peek(), s->string, newlength);
 			result [newlength] = '\0';
 			pushString (result.transfer());
 		} else {
-			Melder_throw ("The function \"left$\" requires a string, or a string and a number.");
+			Melder_throw (U"The function \"left$\" requires a string, or a string and a number.");
 		}
 	} else {
-		Melder_throw ("The function \"left$\" requires one or two arguments.");
+		Melder_throw (U"The function \"left$\" requires one or two arguments.");
 	}
-//Melder_casual ("leaving left$");
+	trace (U"exit");
 }
-static void do_rightStr (void) {
+static void do_rightStr () {
 	Stackel narg = pop;
 	if (narg->number == 1 || narg->number == 2) {
-		Stackel x = ( narg->number == 2 ? pop : NULL ), s = pop;
-		if (s->which == Stackel_STRING && (x == NULL || x->which == Stackel_NUMBER)) {
-			long newlength = x ? x->number : 1;
-			long length = wcslen (s->string);
+		Stackel x = ( narg->number == 2 ? pop : nullptr ), s = pop;
+		if (s->which == Stackel_STRING && (x == nullptr || x->which == Stackel_NUMBER)) {
+			long newlength = x ? lround (x->number) : 1;
+			long length = str32len (s->string);
 			if (newlength < 0) newlength = 0;
 			if (newlength > length) newlength = length;
-			pushString (Melder_wcsdup (s->string + length - newlength));
+			pushString (Melder_dup (s->string + length - newlength));
 		} else {
-			Melder_throw ("The function \"right$\" requires a string, or a string and a number.");
+			Melder_throw (U"The function \"right$\" requires a string, or a string and a number.");
 		}
 	} else {
-		Melder_throw ("The function \"right$\" requires one or two arguments.");
+		Melder_throw (U"The function \"right$\" requires one or two arguments.");
 	}
 }
-static void do_midStr (void) {
+static void do_midStr () {
 	Stackel narg = pop;
 	if (narg->number == 2 || narg->number == 3) {
-		Stackel y = ( narg->number == 3 ? pop : NULL ), x = pop, s = pop;
-		if (s->which == Stackel_STRING && x->which == Stackel_NUMBER && (y == NULL || y->which == Stackel_NUMBER)) {
-			long newlength = y ? y->number : 1;
-			long start = x->number;
-			long length = wcslen (s->string), finish = start + newlength - 1;
-			autostring result;
+		Stackel y = ( narg->number == 3 ? pop : nullptr ), x = pop, s = pop;
+		if (s->which == Stackel_STRING && x->which == Stackel_NUMBER && (y == nullptr || y->which == Stackel_NUMBER)) {
+			long newlength = y ? lround (y->number) : 1;
+			long start = lround (x->number);
+			long length = str32len (s->string), finish = start + newlength - 1;
+			autostring32 result;
 			if (start < 1) start = 1;
 			if (finish > length) finish = length;
 			newlength = finish - start + 1;
 			if (newlength > 0) {
-				result.reset (Melder_malloc (wchar_t, newlength + 1));
-				wcsncpy (result.peek(), s->string + start - 1, newlength);
+				result.reset (Melder_malloc (char32, newlength + 1));
+				str32ncpy (result.peek(), s->string + start - 1, newlength);
 				result [newlength] = '\0';
 			} else {
-				result.reset (Melder_wcsdup (L""));
+				result.reset (Melder_dup (U""));
 			}
 			pushString (result.transfer());
 		} else {
-			Melder_throw ("The function \"mid$\" requires a string and one or two numbers.");
+			Melder_throw (U"The function \"mid$\" requires a string and one or two numbers.");
 		}
 	} else {
-		Melder_throw ("The function \"mid$\" requires two or three arguments.");
+		Melder_throw (U"The function \"mid$\" requires two or three arguments.");
 	}
 }
 static void do_unicodeToBackslashTrigraphsStr () {
 	Stackel s = pop;
 	if (s->which == Stackel_STRING) {
-		long length = wcslen (s->string);
-		autostring trigraphs = Melder_calloc (wchar_t, 3 * length + 1);
-		Longchar_genericizeW (s->string, trigraphs.peek());
+		long length = str32len (s->string);
+		autostring32 trigraphs = Melder_calloc (char32, 3 * length + 1);
+		Longchar_genericize32 (s->string, trigraphs.peek());
 		pushString (trigraphs.transfer());
 	} else {
-		Melder_throw ("The function \"unicodeToBackslashTrigraphs$\" requires a string, not ", Stackel_whichText (s), ".");
+		Melder_throw (U"The function \"unicodeToBackslashTrigraphs$\" requires a string, not ", Stackel_whichText (s), U".");
 	}
 }
 static void do_backslashTrigraphsToUnicodeStr () {
 	Stackel s = pop;
 	if (s->which == Stackel_STRING) {
-		long length = wcslen (s->string);
-		autostring unicode = Melder_calloc (wchar_t, length + 1);
-		Longchar_nativizeW (s->string, unicode.peek(), false);
+		long length = str32len (s->string);
+		autostring32 unicode = Melder_calloc (char32, length + 1);
+		Longchar_nativize32 (s->string, unicode.peek(), false);
 		pushString (unicode.transfer());
 	} else {
-		Melder_throw ("The function \"unicodeToBackslashTrigraphs$\" requires a string, not ", Stackel_whichText (s), ".");
+		Melder_throw (U"The function \"unicodeToBackslashTrigraphs$\" requires a string, not ", Stackel_whichText (s), U".");
 	}
 }
-static void do_environmentStr (void) {
+static void do_environmentStr () {
 	Stackel s = pop;
 	if (s->which == Stackel_STRING) {
-		wchar_t *value = Melder_getenv (s->string);
-		autostring result = Melder_wcsdup (value != NULL ? value : L"");
+		char32 *value = Melder_getenv (s->string);
+		autostring32 result = Melder_dup (value ? value : U"");
 		pushString (result.transfer());
 	} else {
-		Melder_throw ("The function \"environment$\" requires a string, not ", Stackel_whichText (s), ".");
+		Melder_throw (U"The function \"environment$\" requires a string, not ", Stackel_whichText (s), U".");
 	}
 }
-static void do_index (void) {
+static void do_index () {
 	Stackel t = pop, s = pop;
 	if (s->which == Stackel_STRING && t->which == Stackel_STRING) {
-		wchar_t *substring = wcsstr (s->string, t->string);
+		char32 *substring = str32str (s->string, t->string);
 		long result = substring ? substring - s->string + 1 : 0;
 		pushNumber (result);
 	} else {
-		Melder_throw ("The function \"index\" requires two strings, not ",
-			Stackel_whichText (s), " and ", Stackel_whichText (t), ".");
+		Melder_throw (U"The function \"index\" requires two strings, not ",
+			Stackel_whichText (s), U" and ", Stackel_whichText (t), U".");
 	}
 }
-static void do_rindex (void) {
+static void do_rindex () {
 	Stackel part = pop, whole = pop;
 	if (whole->which == Stackel_STRING && part->which == Stackel_STRING) {
-		wchar_t *lastSubstring = wcsstr (whole->string, part->string);
+		char32 *lastSubstring = str32str (whole->string, part->string);
 		if (part->string [0] == '\0') {
-			long result = wcslen (whole->string);
+			long result = str32len (whole->string);
 			pushNumber (result);
 		} else if (lastSubstring) {
 			for (;;) {
-				wchar_t *substring = wcsstr (lastSubstring + 1, part->string);
-				if (substring == NULL) break;
+				char32 *substring = str32str (lastSubstring + 1, part->string);
+				if (! substring) break;
 				lastSubstring = substring;
 			}
 			pushNumber (lastSubstring - whole->string + 1);
@@ -3237,8 +3255,8 @@ static void do_rindex (void) {
 			pushNumber (0);
 		}
 	} else {
-		Melder_throw ("The function \"rindex\" requires two strings, not ",
-			Stackel_whichText (whole), " and ", Stackel_whichText (part), ".");
+		Melder_throw (U"The function \"rindex\" requires two strings, not ",
+			Stackel_whichText (whole), U" and ", Stackel_whichText (part), U".");
 	}
 }
 static void do_stringMatchesCriterion (int criterion) {
@@ -3247,86 +3265,87 @@ static void do_stringMatchesCriterion (int criterion) {
 		int result = Melder_stringMatchesCriterion (s->string, criterion, t->string);
 		pushNumber (result);
 	} else {
-		Melder_throw ("The function \"", Formula_instructionNames [parse [programPointer]. symbol],
-			"\" requires two strings, not ", Stackel_whichText (s), " and ", Stackel_whichText (t), ".");
+		Melder_throw (U"The function \"", Formula_instructionNames [parse [programPointer]. symbol],
+			U"\" requires two strings, not ", Stackel_whichText (s), U" and ", Stackel_whichText (t), U".");
 	}
 }
 static void do_index_regex (int backward) {
 	Stackel t = pop, s = pop;
 	if (s->which == Stackel_STRING && t->which == Stackel_STRING) {
-		const wchar_t *errorMessage;
-		regexp *compiled_regexp = CompileRE ((const regularExp_CHAR *) t->string, & errorMessage, 0);
-		if (compiled_regexp == NULL) {
-			pushNumber (NUMundefined);
-		} else if (ExecRE (compiled_regexp, NULL, (const regularExp_CHAR *) s->string, NULL, backward, '\0', '\0', NULL, NULL, NULL)) {
-			wchar_t *place = (wchar_t *) compiled_regexp -> startp [0];
-			pushNumber (place - s->string + 1);
-			free (compiled_regexp);
+		const char32 *errorMessage;
+		regexp *compiled_regexp = CompileRE (t->string, & errorMessage, 0);
+		if (! compiled_regexp) {
+			Melder_throw (U"index_regex(): ", errorMessage, U".");
 		} else {
-			pushNumber (FALSE);
+			if (ExecRE (compiled_regexp, nullptr, s->string, nullptr, backward, '\0', '\0', nullptr, nullptr, nullptr)) {
+				char32 *place = (char32 *) compiled_regexp -> startp [0];
+				pushNumber (place - s->string + 1);
+				free (compiled_regexp);
+			} else {
+				pushNumber (false);
+			}
 		}
 	} else {
-		Melder_throw ("The function \"", Formula_instructionNames [parse [programPointer]. symbol],
-			"\" requires two strings, not ", Stackel_whichText (s), " and ", Stackel_whichText (t), ".");
+		Melder_throw (U"The function \"", Formula_instructionNames [parse [programPointer]. symbol],
+			U"\" requires two strings, not ", Stackel_whichText (s), U" and ", Stackel_whichText (t), U".");
 	}
 }
-static void do_replaceStr (void) {
+static void do_replaceStr () {
 	Stackel x = pop, u = pop, t = pop, s = pop;
 	if (s->which == Stackel_STRING && t->which == Stackel_STRING && u->which == Stackel_STRING && x->which == Stackel_NUMBER) {
 		long numberOfMatches;
-		autostring result = str_replace_literal (s->string, t->string, u->string, x->number, & numberOfMatches);
+		autostring32 result = str_replace_literal (s->string, t->string, u->string, lround (x->number), & numberOfMatches);
 		pushString (result.transfer());
 	} else {
-		Melder_throw ("The function \"replace$\" requires three strings and a number.");
+		Melder_throw (U"The function \"replace$\" requires three strings and a number.");
 	}
 }
-static void do_replace_regexStr (void) {
+static void do_replace_regexStr () {
 	Stackel x = pop, u = pop, t = pop, s = pop;
 	if (s->which == Stackel_STRING && t->which == Stackel_STRING && u->which == Stackel_STRING && x->which == Stackel_NUMBER) {
-		const wchar_t *errorMessage;
-		regexp *compiled_regexp = CompileRE ((const regularExp_CHAR *) t->string, & errorMessage, 0);
-		if (compiled_regexp == NULL) {
-			autostring result = Melder_wcsdup (L"");
-			pushString (result.transfer());
+		const char32 *errorMessage;
+		regexp *compiled_regexp = CompileRE (t->string, & errorMessage, 0);
+		if (! compiled_regexp) {
+			Melder_throw (U"replace_regex$(): ", errorMessage, U".");
 		} else {
 			long numberOfMatches;
-			autostring result = str_replace_regexp (s->string, compiled_regexp, u->string, x->number, & numberOfMatches);
+			autostring32 result = str_replace_regexp (s->string, compiled_regexp, u->string, lround (x->number), & numberOfMatches);
 			pushString (result.transfer());
 		}
 	} else {
-		Melder_throw ("The function \"replace_regex$\" requires three strings and a number.");
+		Melder_throw (U"The function \"replace_regex$\" requires three strings and a number.");
 	}
 }
-static void do_extractNumber (void) {
+static void do_extractNumber () {
 	Stackel t = pop, s = pop;
 	if (s->which == Stackel_STRING && t->which == Stackel_STRING) {
-		wchar_t *substring = wcsstr (s->string, t->string);
-		if (substring == NULL) {
+		char32 *substring = str32str (s->string, t->string);
+		if (! substring) {
 			pushNumber (NUMundefined);
 		} else {
 			/* Skip the prompt. */
-			substring += wcslen (t->string);
+			substring += str32len (t->string);
 			/* Skip white space. */
-			while (*substring == ' ' || *substring == '\t' || *substring == '\n' || *substring == '\r') substring ++;
-			if (substring [0] == '\0' || wcsnequ (substring, L"--undefined--", 13)) {
+			while (*substring == U' ' || *substring == U'\t' || *substring == U'\n' || *substring == U'\r') substring ++;
+			if (substring [0] == U'\0' || str32nequ (substring, U"--undefined--", 13)) {
 				pushNumber (NUMundefined);
 			} else {
-				wchar_t buffer [101], *slash;
+				char32 buffer [101], *slash;
 				int i;
 				for (i = 0; i < 100; i ++) {
 					buffer [i] = *substring;
 					substring ++;
-					if (*substring == '\0' || *substring == ' ' || *substring == '\t' || *substring == '\n' || *substring == '\r') break;
+					if (*substring == U'\0' || *substring == U' ' || *substring == U'\t' || *substring == U'\n' || *substring == U'\r') break;
 				}
 				if (i >= 100) {
-					buffer [100] = '\0';
+					buffer [100] = U'\0';
 					pushNumber (Melder_atof (buffer));
 				} else {
-					buffer [i + 1] = '\0';
-					slash = wcschr (buffer, '/');
+					buffer [i + 1] = U'\0';
+					slash = str32chr (buffer, U'/');
 					if (slash) {
 						double numerator, denominator;
-						*slash = '\0';
+						*slash = U'\0';
 						numerator = Melder_atof (buffer), denominator = Melder_atof (slash + 1);
 						pushNumber (numerator / denominator);
 					} else {
@@ -3336,118 +3355,113 @@ static void do_extractNumber (void) {
 			}
 		}
 	} else {
-		Melder_throw ("The function \"", Formula_instructionNames [parse [programPointer]. symbol],
-			"\" requires two strings, not ", Stackel_whichText (s), " and ", Stackel_whichText (t), ".");
+		Melder_throw (U"The function \"", Formula_instructionNames [parse [programPointer]. symbol],
+			U"\" requires two strings, not ", Stackel_whichText (s), U" and ", Stackel_whichText (t), U".");
 	}
 }
-static void do_extractTextStr (int singleWord) {
+static void do_extractTextStr (bool singleWord) {
 	Stackel t = pop, s = pop;
 	if (s->which == Stackel_STRING && t->which == Stackel_STRING) {
-		wchar_t *substring = wcsstr (s->string, t->string);
-		autostring result;
-		if (substring == NULL) {
-			result.reset (Melder_wcsdup (L""));
+		char32 *substring = str32str (s->string, t->string);
+		autostring32 result;
+		if (! substring) {
+			result.reset (Melder_dup (U""));
 		} else {
 			long length;
 			/* Skip the prompt. */
-			substring += wcslen (t->string);
+			substring += str32len (t->string);
 			if (singleWord) {
 				/* Skip white space. */
-				while (*substring == ' ' || *substring == '\t' || *substring == '\n' || *substring == '\r') substring ++;
+				while (*substring == U' ' || *substring == U'\t' || *substring == U'\n' || *substring == U'\r') substring ++;
 			}
-			wchar_t *p = substring;
+			char32 *p = substring;
 			if (singleWord) {
 				/* Proceed until next white space. */
-				while (*p != '\0' && *p != ' ' && *p != '\t' && *p != '\n' && *p != '\r') p ++;
+				while (*p != U'\0' && *p != U' ' && *p != U'\t' && *p != U'\n' && *p != U'\r') p ++;
 			} else {
 				/* Proceed until end of line. */
-				while (*p != '\0' && *p != '\n' && *p != '\r') p ++;
+				while (*p != U'\0' && *p != U'\n' && *p != U'\r') p ++;
 			}
 			length = p - substring;
-			result.reset (Melder_malloc (wchar_t, length + 1));
-			wcsncpy (result.peek(), substring, length);
-			result [length] = '\0';
+			result.reset (Melder_malloc (char32, length + 1));
+			str32ncpy (result.peek(), substring, length);
+			result [length] = U'\0';
 		}
 		pushString (result.transfer());
 	} else {
-		Melder_throw ("The function \"", Formula_instructionNames [parse [programPointer]. symbol],
-			"\" requires two strings, not ", Stackel_whichText (s), " and ", Stackel_whichText (t), ".");
+		Melder_throw (U"The function \"", Formula_instructionNames [parse [programPointer]. symbol],
+			U"\" requires two strings, not ", Stackel_whichText (s), U" and ", Stackel_whichText (t), U".");
 	}
 }
-static void do_selected (void) {
+static void do_selected () {
 	Stackel n = pop;
 	long result = 0;
 	if (n->number == 0) {
-		result = praat_getIdOfSelected (NULL, 0);
+		result = praat_idOfSelected (nullptr, 0);
 	} else if (n->number == 1) {
 		Stackel a = pop;
 		if (a->which == Stackel_STRING) {
-			ClassInfo klas = Thing_classFromClassName (a->string);
-			result = praat_getIdOfSelected (klas, 0);
+			ClassInfo klas = Thing_classFromClassName (a->string, nullptr);
+			result = praat_idOfSelected (klas, 0);
 		} else if (a->which == Stackel_NUMBER) {
-			result = praat_getIdOfSelected (NULL, a->number);
+			result = praat_idOfSelected (nullptr, lround (a->number));
 		} else {
-			Melder_throw ("The function \"selected\" requires a string (an object type name) and/or a number.");
+			Melder_throw (U"The function \"selected\" requires a string (an object type name) and/or a number.");
 		}
 	} else if (n->number == 2) {
 		Stackel x = pop, s = pop;
 		if (s->which == Stackel_STRING && x->which == Stackel_NUMBER) {
-			ClassInfo klas = Thing_classFromClassName (s->string);
-			result = praat_getIdOfSelected (klas, x->number);
+			ClassInfo klas = Thing_classFromClassName (s->string, nullptr);
+			result = praat_idOfSelected (klas, lround (x->number));
 		} else {
-			Melder_throw ("The function \"selected\" requires a string (an object type name) and/or a number.");
+			Melder_throw (U"The function \"selected\" requires a string (an object type name) and/or a number.");
 		}
 	} else {
-		Melder_throw ("The function \"selected\" requires 0, 1, or 2 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"selected\" requires 0, 1, or 2 arguments, not ", n->number, U".");
 	}
 	pushNumber (result);
 }
-static void do_selectedStr (void) {
+static void do_selectedStr () {
 	Stackel n = pop;
-	wchar_t *name;
-	autostring result;
+	autostring32 result;
 	if (n->number == 0) {
-		name = praat_getNameOfSelected (NULL, 0);
-		result.reset (Melder_wcsdup (name));
+		result.reset (Melder_dup (praat_nameOfSelected (nullptr, 0)));
 	} else if (n->number == 1) {
 		Stackel a = pop;
 		if (a->which == Stackel_STRING) {
-			ClassInfo klas = Thing_classFromClassName (a->string);
-			name = praat_getNameOfSelected (klas, 0);
-			result.reset (Melder_wcsdup (name));
+			ClassInfo klas = Thing_classFromClassName (a->string, nullptr);
+			result.reset (Melder_dup (praat_nameOfSelected (klas, 0)));
 		} else if (a->which == Stackel_NUMBER) {
-			name = praat_getNameOfSelected (NULL, a->number);
-			result.reset (Melder_wcsdup (name));
+			result.reset (Melder_dup (praat_nameOfSelected (nullptr, lround (a->number))));
 		} else {
-			Melder_throw ("The function \"selected$\" requires a string (an object type name) and/or a number.");
+			Melder_throw (U"The function \"selected$\" requires a string (an object type name) and/or a number.");
 		}
 	} else if (n->number == 2) {
 		Stackel x = pop, s = pop;
 		if (s->which == Stackel_STRING && x->which == Stackel_NUMBER) {
-			ClassInfo klas = Thing_classFromClassName (s->string);
-			name = praat_getNameOfSelected (klas, x->number);
-			result.reset (Melder_wcsdup (name));
+			ClassInfo klas = Thing_classFromClassName (s->string, nullptr);
+			result.reset (Melder_dup (praat_nameOfSelected (klas, lround (x->number))));
 		} else {
-			Melder_throw ("The function \"selected$\" requires 0, 1, or 2 arguments, not ", n->number, ".");
+			Melder_throw (U"The function \"selected$\" requires 0, 1, or 2 arguments, not ", n->number, U".");
 		}
 	}
 	pushString (result.transfer());
 }
-static void do_numberOfSelected (void) {
+static void do_numberOfSelected () {
 	Stackel n = pop;
 	long result = 0;
 	if (n->number == 0) {
-		result = praat_selection (NULL);
+		result = praat_numberOfSelected (nullptr);
 	} else if (n->number == 1) {
 		Stackel s = pop;
 		if (s->which == Stackel_STRING) {
-			ClassInfo klas = Thing_classFromClassName (s->string);
-			result = praat_selection (klas);
+			ClassInfo klas = Thing_classFromClassName (s->string, nullptr);
+			result = praat_numberOfSelected (klas);
 		} else {
-			Melder_throw ("The function \"numberOfSelected\" requires a string (an object type name), not ", Stackel_whichText (s), ".");
+			Melder_throw (U"The function \"numberOfSelected\" requires a string (an object type name), not ", Stackel_whichText (s), U".");
 		}
 	} else {
-		Melder_throw ("The function \"numberOfSelected\" requires 0 or 1 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"numberOfSelected\" requires 0 or 1 arguments, not ", n->number, U".");
 	}
 	pushNumber (result);
 }
@@ -3455,134 +3469,134 @@ static int praat_findObjectById (int id) {
 	int IOBJECT;
 	WHERE_DOWN (ID == id)
 		return IOBJECT;
-	Melder_throw ("No object with number ", id, ".");
+	Melder_throw (U"No object with number ", id, U".");
 }
-static int praat_findObjectFromString (const wchar_t *name) {
+static int praat_findObjectFromString (const char32 *name) {
 	int IOBJECT;
-	if (*name >= 'A' && *name <= 'Z') {
+	if (*name >= U'A' && *name <= U'Z') {
 		/*
 		 * Find the object by its name.
 		 */
-		static MelderString buffer = { 0 };
+		static MelderString buffer { 0 };
 		MelderString_copy (& buffer, name);
-		wchar_t *space = wcschr (buffer.string, ' ');
-		if (space == NULL)
-			Melder_throw ("Missing space in object name \"", name, "\".");
-		*space = '\0';
-		wchar_t *className = & buffer.string [0], *givenName = space + 1;
+		char32 *space = str32chr (buffer.string, U' ');
+		if (space == nullptr)
+			Melder_throw (U"Missing space in object name \"", name, U"\".");
+		*space = U'\0';
+		char32 *className = & buffer.string [0], *givenName = space + 1;
 		WHERE_DOWN (1) {
-			Data object = (Data) OBJECT;
-			if (wcsequ (className, Thing_className ((Thing) OBJECT)) && wcsequ (givenName, object -> name))
+			Daata object = OBJECT;
+			if (str32equ (className, Thing_className (OBJECT)) && str32equ (givenName, object -> name))
 				return IOBJECT;
 		}
-		ClassInfo klas = Thing_classFromClassName (className);
+		ClassInfo klas = Thing_classFromClassName (className, nullptr);
 		WHERE_DOWN (1) {
-			Data object = (Data) OBJECT;
-			if (wcsequ (klas -> className, Thing_className ((Thing) OBJECT)) && wcsequ (givenName, object -> name))
+			Daata object = OBJECT;
+			if (str32equ (klas -> className, Thing_className (OBJECT)) && str32equ (givenName, object -> name))
 				return IOBJECT;
 		}
 	}
-	Melder_throw ("No object with name \"", name, "\".");
+	Melder_throw (U"No object with name \"", name, U"\".");
 }
-static void do_selectObject (void) {
+static void do_selectObject () {
 	Stackel n = pop;
 	praat_deselectAll ();
 	for (int iobject = 1; iobject <= n -> number; iobject ++) {
 		Stackel object = pop;
 		if (object -> which == Stackel_NUMBER) {
-			int IOBJECT = praat_findObjectById (object -> number);
+			int IOBJECT = praat_findObjectById (lround (object -> number));
 			praat_select (IOBJECT);
 		} else if (object -> which == Stackel_STRING) {
 			int IOBJECT = praat_findObjectFromString (object -> string);
 			praat_select (IOBJECT);
 		} else {
-			Melder_throw ("The function \"selectObject\" takes numbers and strings, not ", Stackel_whichText (object));
+			Melder_throw (U"The function \"selectObject\" takes numbers and strings, not ", Stackel_whichText (object));
 		}
 	}
 	praat_show ();
 	pushNumber (1);
 }
-static void do_plusObject (void) {
+static void do_plusObject () {
 	Stackel n = pop;
 	for (int iobject = 1; iobject <= n -> number; iobject ++) {
 		Stackel object = pop;
 		if (object -> which == Stackel_NUMBER) {
-			int IOBJECT = praat_findObjectById (object -> number);
+			int IOBJECT = praat_findObjectById (lround (object -> number));
 			praat_select (IOBJECT);
 		} else if (object -> which == Stackel_STRING) {
 			int IOBJECT = praat_findObjectFromString (object -> string);
 			praat_select (IOBJECT);
 		} else {
-			Melder_throw ("The function \"plusObject\" takes numbers and strings, not ", Stackel_whichText (object));
+			Melder_throw (U"The function \"plusObject\" takes numbers and strings, not ", Stackel_whichText (object), U".");
 		}
 	}
 	praat_show ();
 	pushNumber (1);
 }
-static void do_minusObject (void) {
+static void do_minusObject () {
 	Stackel n = pop;
 	for (int iobject = 1; iobject <= n -> number; iobject ++) {
 		Stackel object = pop;
 		if (object -> which == Stackel_NUMBER) {
-			int IOBJECT = praat_findObjectById (object -> number);
+			int IOBJECT = praat_findObjectById (lround (object -> number));
 			praat_deselect (IOBJECT);
 		} else if (object -> which == Stackel_STRING) {
 			int IOBJECT = praat_findObjectFromString (object -> string);
 			praat_deselect (IOBJECT);
 		} else {
-			Melder_throw ("The function \"minusObject\" takes numbers and strings, not ", Stackel_whichText (object));
+			Melder_throw (U"The function \"minusObject\" takes numbers and strings, not ", Stackel_whichText (object), U".");
 		}
 	}
 	praat_show ();
 	pushNumber (1);
 }
-static void do_removeObject (void) {
+static void do_removeObject () {
 	Stackel n = pop;
 	for (int iobject = 1; iobject <= n -> number; iobject ++) {
 		Stackel object = pop;
 		if (object -> which == Stackel_NUMBER) {
-			int IOBJECT = praat_findObjectById (object -> number);
+			int IOBJECT = praat_findObjectById (lround (object -> number));
 			praat_removeObject (IOBJECT);
 		} else if (object -> which == Stackel_STRING) {
 			int IOBJECT = praat_findObjectFromString (object -> string);
 			praat_removeObject (IOBJECT);
 		} else {
-			Melder_throw ("The function \"removeObject\" takes numbers and strings, not ", Stackel_whichText (object));
+			Melder_throw (U"The function \"removeObject\" takes numbers and strings, not ", Stackel_whichText (object), U".");
 		}
 	}
 	praat_show ();
 	pushNumber (1);
 }
-static void do_stringStr (void) {
+static void do_stringStr () {
 	Stackel value = pop;
 	if (value->which == Stackel_NUMBER) {
-		autostring result = Melder_wcsdup (Melder_double (value->number));
+		autostring32 result = Melder_dup (Melder_double (value->number));
 		pushString (result.transfer());
 	} else {
-		Melder_throw ("The function \"string$\" requires a number, not ", Stackel_whichText (value), ".");
+		Melder_throw (U"The function \"string$\" requires a number, not ", Stackel_whichText (value), U".");
 	}
 }
-static void do_fixedStr (void) {
+static void do_fixedStr () {
 	Stackel precision = pop, value = pop;
 	if (value->which == Stackel_NUMBER && precision->which == Stackel_NUMBER) {
-		autostring result = Melder_wcsdup (Melder_fixed (value->number, precision->number));
+		autostring32 result = Melder_dup (Melder_fixed (value->number, lround (precision->number)));
 		pushString (result.transfer());
 	} else {
-		Melder_throw ("The function \"fixed$\" requires two numbers (value and precision), not ", Stackel_whichText (value), " and ", Stackel_whichText (precision), ".");
+		Melder_throw (U"The function \"fixed$\" requires two numbers (value and precision), not ", Stackel_whichText (value), U" and ", Stackel_whichText (precision), U".");
 	}
 }
-static void do_percentStr (void) {
+static void do_percentStr () {
 	Stackel precision = pop, value = pop;
 	if (value->which == Stackel_NUMBER && precision->which == Stackel_NUMBER) {
-		autostring result = Melder_wcsdup (Melder_percent (value->number, precision->number));
+		autostring32 result = Melder_dup (Melder_percent (value->number, lround (precision->number)));
 		pushString (result.transfer());
 	} else {
-		Melder_throw ("The function \"percent$\" requires two numbers (value and precision), not ", Stackel_whichText (value), " and ", Stackel_whichText (precision), ".");
+		Melder_throw (U"The function \"percent$\" requires two numbers (value and precision), not ", Stackel_whichText (value), U" and ", Stackel_whichText (precision), U".");
 	}
 }
-static void do_deleteFile (void) {
+static void do_deleteFile () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"deleteFile\" is not available inside manuals.");
+		Melder_throw (U"The function \"deleteFile\" is not available inside manuals.");
 	Stackel f = pop;
 	if (f->which == Stackel_STRING) {
 		structMelderFile file = { 0 };
@@ -3590,12 +3604,12 @@ static void do_deleteFile (void) {
 		MelderFile_delete (& file);
 		pushNumber (1);
 	} else {
-		Melder_throw ("The function \"deleteFile\" requires a string, not ", Stackel_whichText (f), ".");
+		Melder_throw (U"The function \"deleteFile\" requires a string, not ", Stackel_whichText (f), U".");
 	}
 }
-static void do_createDirectory (void) {
+static void do_createDirectory () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"createDirectory\" is not available inside manuals.");
+		Melder_throw (U"The function \"createDirectory\" is not available inside manuals.");
 	Stackel f = pop;
 	if (f->which == Stackel_STRING) {
 		structMelderDir currentDirectory = { { 0 } };
@@ -3607,429 +3621,429 @@ static void do_createDirectory (void) {
 		#endif
 		pushNumber (1);
 	} else {
-		Melder_throw ("The function \"createDirectory\" requires a string, not ", Stackel_whichText (f), ".");
+		Melder_throw (U"The function \"createDirectory\" requires a string, not ", Stackel_whichText (f), U".");
 	}
 }
-static void do_variableExists (void) {
+static void do_variableExists () {
 	Stackel f = pop;
 	if (f->which == Stackel_STRING) {
-		bool result = Interpreter_hasVariable (theInterpreter, f->string) != NULL;
+		bool result = Interpreter_hasVariable (theInterpreter, f->string) != nullptr;
 		pushNumber (result);
 	} else {
-		Melder_throw ("The function \"variableExists\" requires a string, not ", Stackel_whichText (f), ".");
+		Melder_throw (U"The function \"variableExists\" requires a string, not ", Stackel_whichText (f), U".");
 	}
 }
-static void do_readFile (void) {
+static void do_readFile () {
 	Stackel f = pop;
 	if (f->which == Stackel_STRING) {
 		structMelderFile file = { 0 };
 		Melder_relativePathToFile (f->string, & file);
-		autostring text = MelderFile_readText (& file);
+		autostring32 text = MelderFile_readText (& file);
 		pushNumber (Melder_atof (text.peek()));
 	} else {
-		Melder_throw ("The function \"readFile\" requires a string (a file name), not ", Stackel_whichText (f), ".");
+		Melder_throw (U"The function \"readFile\" requires a string (a file name), not ", Stackel_whichText (f), U".");
 	}
 }
-static void do_readFileStr (void) {
+static void do_readFileStr () {
 	Stackel f = pop;
 	if (f->which == Stackel_STRING) {
 		structMelderFile file = { 0 };
 		Melder_relativePathToFile (f->string, & file);
-		autostring text = MelderFile_readText (& file);
+		autostring32 text = MelderFile_readText (& file);
 		pushString (text.transfer());
 	} else {
-		Melder_throw ("The function \"readFile$\" requires a string (a file name), not ", Stackel_whichText (f), ".");
+		Melder_throw (U"The function \"readFile$\" requires a string (a file name), not ", Stackel_whichText (f), U".");
 	}
 }
-static void do_beginPauseForm (void) {
+static void do_beginPauseForm () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"beginPauseForm\" is not available inside manuals.");
+		Melder_throw (U"The function \"beginPauseForm\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 1) {
 		Stackel title = pop;
 		if (title->which == Stackel_STRING) {
 			UiPause_begin (theCurrentPraatApplication -> topShell, title->string, theInterpreter);
 		} else {
-			Melder_throw ("The function \"beginPauseForm\" requires a string (the title), not ", Stackel_whichText (title), ".");
+			Melder_throw (U"The function \"beginPauseForm\" requires a string (the title), not ", Stackel_whichText (title), U".");
 		}
 	} else {
-		Melder_throw ("The function \"beginPauseForm\" requires 1 argument (a title), not ", n->number, ".");
+		Melder_throw (U"The function \"beginPauseForm\" requires 1 argument (a title), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddReal (void) {
+static void do_pauseFormAddReal () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"real\" is not available inside manuals.");
+		Melder_throw (U"The function \"real\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultValue = pop;
-		const wchar_t *defaultString = NULL;
+		const char32 *defaultString = nullptr;
 		if (defaultValue->which == Stackel_STRING) {
 			defaultString = defaultValue->string;
 		} else if (defaultValue->which == Stackel_NUMBER) {
 			defaultString = Melder_double (defaultValue->number);
 		} else {
-			Melder_throw ("The second argument of \"real\" (the default value) must be a string or a number, not ", Stackel_whichText (defaultValue), ".");
+			Melder_throw (U"The second argument of \"real\" (the default value) must be a string or a number, not ", Stackel_whichText (defaultValue), U".");
 		}
 		Stackel label = pop;
 		if (label->which == Stackel_STRING) {
 			UiPause_real (label->string, defaultString);
 		} else {
-			Melder_throw ("The first argument of \"real\" (the label) must be a string, not ", Stackel_whichText (label), ".");
+			Melder_throw (U"The first argument of \"real\" (the label) must be a string, not ", Stackel_whichText (label), U".");
 		}
 	} else {
-		Melder_throw ("The function \"real\" requires 2 arguments (a label and a default value), not ", n->number, ".");
+		Melder_throw (U"The function \"real\" requires 2 arguments (a label and a default value), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddPositive (void) {
+static void do_pauseFormAddPositive () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"positive\" is not available inside manuals.");
+		Melder_throw (U"The function \"positive\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultValue = pop;
-		const wchar_t *defaultString = NULL;
+		const char32 *defaultString = nullptr;
 		if (defaultValue->which == Stackel_STRING) {
 			defaultString = defaultValue->string;
 		} else if (defaultValue->which == Stackel_NUMBER) {
 			defaultString = Melder_double (defaultValue->number);
 		} else {
-			Melder_throw ("The second argument of \"positive\" (the default value) must be a string or a number, not ", Stackel_whichText (defaultValue), ".");
+			Melder_throw (U"The second argument of \"positive\" (the default value) must be a string or a number, not ", Stackel_whichText (defaultValue), U".");
 		}
 		Stackel label = pop;
 		if (label->which == Stackel_STRING) {
 			UiPause_positive (label->string, defaultString);
 		} else {
-			Melder_throw ("The first argument of \"positive\" (the label) must be a string, not ", Stackel_whichText (label), ".");
+			Melder_throw (U"The first argument of \"positive\" (the label) must be a string, not ", Stackel_whichText (label), U".");
 		}
 	} else {
-		Melder_throw ("The function \"positive\" requires 2 arguments (a label and a default value), not ", n->number, ".");
+		Melder_throw (U"The function \"positive\" requires 2 arguments (a label and a default value), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddInteger (void) {
+static void do_pauseFormAddInteger () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"integer\" is not available inside manuals.");
+		Melder_throw (U"The function \"integer\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultValue = pop;
-		const wchar_t *defaultString = NULL;
+		const char32 *defaultString = nullptr;
 		if (defaultValue->which == Stackel_STRING) {
 			defaultString = defaultValue->string;
 		} else if (defaultValue->which == Stackel_NUMBER) {
 			defaultString = Melder_double (defaultValue->number);
 		} else {
-			Melder_throw ("The second argument of \"integer\" (the default value) must be a string or a number, not ", Stackel_whichText (defaultValue), ".");
+			Melder_throw (U"The second argument of \"integer\" (the default value) must be a string or a number, not ", Stackel_whichText (defaultValue), U".");
 		}
 		Stackel label = pop;
 		if (label->which == Stackel_STRING) {
 			UiPause_integer (label->string, defaultString);
 		} else {
-			Melder_throw ("The first argument of \"integer\" (the label) must be a string, not ", Stackel_whichText (label), ".");
+			Melder_throw (U"The first argument of \"integer\" (the label) must be a string, not ", Stackel_whichText (label), U".");
 		}
 	} else {
-		Melder_throw ("The function \"integer\" requires 2 arguments (a label and a default value), not ", n->number, ".");
+		Melder_throw (U"The function \"integer\" requires 2 arguments (a label and a default value), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddNatural (void) {
+static void do_pauseFormAddNatural () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"natural\" is not available inside manuals.");
+		Melder_throw (U"The function \"natural\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultValue = pop;
-		const wchar_t *defaultString = NULL;
+		const char32 *defaultString = nullptr;
 		if (defaultValue->which == Stackel_STRING) {
 			defaultString = defaultValue->string;
 		} else if (defaultValue->which == Stackel_NUMBER) {
 			defaultString = Melder_double (defaultValue->number);
 		} else {
-			Melder_throw ("The second argument of \"natural\" (the default value) must be a string or a number, not ", Stackel_whichText (defaultValue), ".");
+			Melder_throw (U"The second argument of \"natural\" (the default value) must be a string or a number, not ", Stackel_whichText (defaultValue), U".");
 		}
 		Stackel label = pop;
 		if (label->which == Stackel_STRING) {
 			UiPause_natural (label->string, defaultString);
 		} else {
-			Melder_throw ("The first argument of \"natural\" (the label) must be a string, not ", Stackel_whichText (label), ".");
+			Melder_throw (U"The first argument of \"natural\" (the label) must be a string, not ", Stackel_whichText (label), U".");
 		}
 	} else {
-		Melder_throw ("The function \"natural\" requires 2 arguments (a label and a default value), not ", n->number, ".");
+		Melder_throw (U"The function \"natural\" requires 2 arguments (a label and a default value), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddWord (void) {
+static void do_pauseFormAddWord () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"word\" is not available inside manuals.");
+		Melder_throw (U"The function \"word\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultValue = pop;
 		if (defaultValue->which != Stackel_STRING) {
-			Melder_throw ("The second argument of \"word\" (the default value) must be a string, not ", Stackel_whichText (defaultValue), ".");
+			Melder_throw (U"The second argument of \"word\" (the default value) must be a string, not ", Stackel_whichText (defaultValue), U".");
 		}
 		Stackel label = pop;
 		if (label->which == Stackel_STRING) {
 			UiPause_word (label->string, defaultValue->string);
 		} else {
-			Melder_throw ("The first argument of \"word\" (the label) must be a string, not ", Stackel_whichText (label), ".");
+			Melder_throw (U"The first argument of \"word\" (the label) must be a string, not ", Stackel_whichText (label), U".");
 		}
 	} else {
-		Melder_throw ("The function \"word\" requires 2 arguments (a label and a default value), not ", n->number, ".");
+		Melder_throw (U"The function \"word\" requires 2 arguments (a label and a default value), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddSentence (void) {
+static void do_pauseFormAddSentence () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"sentence\" is not available inside manuals.");
+		Melder_throw (U"The function \"sentence\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultValue = pop;
 		if (defaultValue->which != Stackel_STRING) {
-			Melder_throw ("The second argument of \"sentence\" (the default value) must be a string, not ", Stackel_whichText (defaultValue), ".");
+			Melder_throw (U"The second argument of \"sentence\" (the default value) must be a string, not ", Stackel_whichText (defaultValue), U".");
 		}
 		Stackel label = pop;
 		if (label->which == Stackel_STRING) {
 			UiPause_sentence (label->string, defaultValue->string);
 		} else {
-			Melder_throw ("The first argument of \"sentence\" (the label) must be a string, not ", Stackel_whichText (label), ".");
+			Melder_throw (U"The first argument of \"sentence\" (the label) must be a string, not ", Stackel_whichText (label), U".");
 		}
 	} else {
-		Melder_throw ("The function \"sentence\" requires 2 arguments (a label and a default value), not ", n->number, ".");
+		Melder_throw (U"The function \"sentence\" requires 2 arguments (a label and a default value), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddText (void) {
+static void do_pauseFormAddText () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"text\" is not available inside manuals.");
+		Melder_throw (U"The function \"text\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultValue = pop;
 		if (defaultValue->which != Stackel_STRING) {
-			Melder_throw ("The second argument of \"text\" (the default value) must be a string, not ", Stackel_whichText (defaultValue), ".");
+			Melder_throw (U"The second argument of \"text\" (the default value) must be a string, not ", Stackel_whichText (defaultValue), U".");
 		}
 		Stackel label = pop;
 		if (label->which == Stackel_STRING) {
 			UiPause_text (label->string, defaultValue->string);
 		} else {
-			Melder_throw ("The first argument of \"text\" (the label) must be a string, not ", Stackel_whichText (label), ".");
+			Melder_throw (U"The first argument of \"text\" (the label) must be a string, not ", Stackel_whichText (label), U".");
 		}
 	} else {
-		Melder_throw ("The function \"text\" requires 2 arguments (a label and a default value), not ", n->number, ".");
+		Melder_throw (U"The function \"text\" requires 2 arguments (a label and a default value), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddBoolean (void) {
+static void do_pauseFormAddBoolean () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"boolean\" is not available inside manuals.");
+		Melder_throw (U"The function \"boolean\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultValue = pop;
 		if (defaultValue->which != Stackel_NUMBER) {
-			Melder_throw ("The second argument of \"boolean\" (the default value) must be a number (0 or 1), not ", Stackel_whichText (defaultValue), ".");
+			Melder_throw (U"The second argument of \"boolean\" (the default value) must be a number (0 or 1), not ", Stackel_whichText (defaultValue), U".");
 		}
 		Stackel label = pop;
 		if (label->which == Stackel_STRING) {
-			UiPause_boolean (label->string, defaultValue->number);
+			UiPause_boolean (label->string, lround (defaultValue->number));
 		} else {
-			Melder_throw ("The first argument of \"boolean\" (the label) must be a string, not ", Stackel_whichText (label), ".");
+			Melder_throw (U"The first argument of \"boolean\" (the label) must be a string, not ", Stackel_whichText (label), U".");
 		}
 	} else {
-		Melder_throw ("The function \"boolean\" requires 2 arguments (a label and a default value), not ", n->number, ".");
+		Melder_throw (U"The function \"boolean\" requires 2 arguments (a label and a default value), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddChoice (void) {
+static void do_pauseFormAddChoice () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"choice\" is not available inside manuals.");
+		Melder_throw (U"The function \"choice\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultValue = pop;
 		if (defaultValue->which != Stackel_NUMBER) {
-			Melder_throw ("The second argument of \"choice\" (the default value) must be a whole number, not ", Stackel_whichText (defaultValue), ".");
+			Melder_throw (U"The second argument of \"choice\" (the default value) must be a whole number, not ", Stackel_whichText (defaultValue), U".");
 		}
 		Stackel label = pop;
 		if (label->which == Stackel_STRING) {
-			UiPause_choice (label->string, defaultValue->number);
+			UiPause_choice (label->string, lround (defaultValue->number));
 		} else {
-			Melder_throw ("The first argument of \"choice\" (the label) must be a string, not ", Stackel_whichText (label), ".");
+			Melder_throw (U"The first argument of \"choice\" (the label) must be a string, not ", Stackel_whichText (label), U".");
 		}
 	} else {
-		Melder_throw ("The function \"choice\" requires 2 arguments (a label and a default value), not ", n->number, ".");
+		Melder_throw (U"The function \"choice\" requires 2 arguments (a label and a default value), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddOptionMenu (void) {
+static void do_pauseFormAddOptionMenu () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"optionMenu\" is not available inside manuals.");
+		Melder_throw (U"The function \"optionMenu\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultValue = pop;
 		if (defaultValue->which != Stackel_NUMBER) {
-			Melder_throw ("The second argument of \"optionMenu\" (the default value) must be a whole number, not ", Stackel_whichText (defaultValue), ".");
+			Melder_throw (U"The second argument of \"optionMenu\" (the default value) must be a whole number, not ", Stackel_whichText (defaultValue), U".");
 		}
 		Stackel label = pop;
 		if (label->which == Stackel_STRING) {
-			UiPause_optionMenu (label->string, defaultValue->number);
+			UiPause_optionMenu (label->string, lround (defaultValue->number));
 		} else {
-			Melder_throw ("The first argument of \"optionMenu\" (the label) must be a string, not ", Stackel_whichText (label), ".");
+			Melder_throw (U"The first argument of \"optionMenu\" (the label) must be a string, not ", Stackel_whichText (label), U".");
 		}
 	} else {
-		Melder_throw ("The function \"optionMenu\" requires 2 arguments (a label and a default value), not ", n->number, ".");
+		Melder_throw (U"The function \"optionMenu\" requires 2 arguments (a label and a default value), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddOption (void) {
+static void do_pauseFormAddOption () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"option\" is not available inside manuals.");
+		Melder_throw (U"The function \"option\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 1) {
 		Stackel text = pop;
 		if (text->which == Stackel_STRING) {
 			UiPause_option (text->string);
 		} else {
-			Melder_throw ("The argument of \"option\" must be a string (the text), not ", Stackel_whichText (text), ".");
+			Melder_throw (U"The argument of \"option\" must be a string (the text), not ", Stackel_whichText (text), U".");
 		}
 	} else {
-		Melder_throw ("The function \"option\" requires 1 argument (a text), not ", n->number, ".");
+		Melder_throw (U"The function \"option\" requires 1 argument (a text), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_pauseFormAddComment (void) {
+static void do_pauseFormAddComment () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"comment\" is not available inside manuals.");
+		Melder_throw (U"The function \"comment\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number == 1) {
 		Stackel text = pop;
 		if (text->which == Stackel_STRING) {
 			UiPause_comment (text->string);
 		} else {
-			Melder_throw ("The argument of \"comment\" must be a string (the text), not ", Stackel_whichText (text), ".");
+			Melder_throw (U"The argument of \"comment\" must be a string (the text), not ", Stackel_whichText (text), U".");
 		}
 	} else {
-		Melder_throw ("The function \"comment\" requires 1 argument (a text), not ", n->number, ".");
+		Melder_throw (U"The function \"comment\" requires 1 argument (a text), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_endPauseForm (void) {
+static void do_endPauseForm () {
 	if (theCurrentPraatObjects != & theForegroundPraatObjects)
-		Melder_throw ("The function \"endPause\" is not available inside manuals.");
+		Melder_throw (U"The function \"endPause\" is not available inside manuals.");
 	Stackel n = pop;
 	if (n->number < 2 || n->number > 12)
-		Melder_throw ("The function \"endPause\" requires 2 to 12 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"endPause\" requires 2 to 12 arguments, not ", n->number, U".");
 	Stackel d = pop;
 	if (d->which != Stackel_NUMBER)
-		Melder_throw ("The last argument of \"endPause\" has to be a number (the default or cancel continue button), not ", Stackel_whichText (d), ".");
-	int numberOfContinueButtons = n->number - 1;
-	int cancelContinueButton = 0, defaultContinueButton = d->number;
+		Melder_throw (U"The last argument of \"endPause\" has to be a number (the default or cancel continue button), not ", Stackel_whichText (d), U".");
+	int numberOfContinueButtons = lround (n->number) - 1;
+	int cancelContinueButton = 0, defaultContinueButton = lround (d->number);
 	Stackel ca = pop;
 	if (ca->which == Stackel_NUMBER) {
 		cancelContinueButton = defaultContinueButton;
-		defaultContinueButton = ca->number;
+		defaultContinueButton = lround (ca->number);
 		numberOfContinueButtons --;
 		if (cancelContinueButton < 1 || cancelContinueButton > numberOfContinueButtons)
-			Melder_throw ("Your last argument of \"endPause\" is the number of the cancel button; it cannot be ", cancelContinueButton,
-				" but has to lie between 1 and ", numberOfContinueButtons, ".");
+			Melder_throw (U"Your last argument of \"endPause\" is the number of the cancel button; it cannot be ", cancelContinueButton,
+				U" but has to lie between 1 and ", numberOfContinueButtons, U".");
 	}
 	Stackel co [1+10] = { 0 };
 	for (int i = numberOfContinueButtons; i >= 1; i --) {
 		co [i] = cancelContinueButton != 0 || i != numberOfContinueButtons ? pop : ca;
 		if (co[i]->which != Stackel_STRING)
-			Melder_throw ("Each of the first ", numberOfContinueButtons,
-				" argument(s) of \"endPause\" has to be a string (a button text), not ", Stackel_whichText (co[i]), ".");
+			Melder_throw (U"Each of the first ", numberOfContinueButtons,
+				U" argument(s) of \"endPause\" has to be a string (a button text), not ", Stackel_whichText (co[i]), U".");
 	}
 	int buttonClicked = UiPause_end (numberOfContinueButtons, defaultContinueButton, cancelContinueButton,
-		co [1] == NULL ? NULL : co[1]->string, co [2] == NULL ? NULL : co[2]->string,
-		co [3] == NULL ? NULL : co[3]->string, co [4] == NULL ? NULL : co[4]->string,
-		co [5] == NULL ? NULL : co[5]->string, co [6] == NULL ? NULL : co[6]->string,
-		co [7] == NULL ? NULL : co[7]->string, co [8] == NULL ? NULL : co[8]->string,
-		co [9] == NULL ? NULL : co[9]->string, co [10] == NULL ? NULL : co[10]->string,
+		! co [1] ? nullptr : co[1]->string, ! co [2] ? nullptr : co[2]->string,
+		! co [3] ? nullptr : co[3]->string, ! co [4] ? nullptr : co[4]->string,
+		! co [5] ? nullptr : co[5]->string, ! co [6] ? nullptr : co[6]->string,
+		! co [7] ? nullptr : co[7]->string, ! co [8] ? nullptr : co[8]->string,
+		! co [9] ? nullptr : co[9]->string, ! co [10] ? nullptr : co[10]->string,
 		theInterpreter);
-	//Melder_casual ("Button %d", (int) buttonClicked);
+	//Melder_casual (U"Button ", buttonClicked);
 	pushNumber (buttonClicked);
 }
-static void do_chooseReadFileStr (void) {
+static void do_chooseReadFileStr () {
 	Stackel n = pop;
 	if (n->number == 1) {
 		Stackel title = pop;
 		if (title->which == Stackel_STRING) {
-			autoSortedSetOfString fileNames = GuiFileSelect_getInfileNames (NULL, title->string, false);
+			autoSortedSetOfString fileNames = GuiFileSelect_getInfileNames (nullptr, title->string, false);
 			if (fileNames -> size == 0) {
-				autostring result = Melder_wcsdup (L"");
+				autostring32 result = Melder_dup (U"");
 				pushString (result.transfer());
 			} else {
 				SimpleString fileName = (SimpleString) fileNames -> item [1];
-				autostring result = Melder_wcsdup (fileName -> string);
+				autostring32 result = Melder_dup (fileName -> string);
 				pushString (result.transfer());
 			}
 		} else {
-			Melder_throw ("The argument of \"chooseReadFile$\" must be a string (the title), not ", Stackel_whichText (title), ".");
+			Melder_throw (U"The argument of \"chooseReadFile$\" must be a string (the title), not ", Stackel_whichText (title), U".");
 		}
 	} else {
-		Melder_throw ("The function \"chooseReadFile$\" requires 1 argument (a title), not ", n->number, ".");
+		Melder_throw (U"The function \"chooseReadFile$\" requires 1 argument (a title), not ", n->number, U".");
 	}
 }
-static void do_chooseWriteFileStr (void) {
+static void do_chooseWriteFileStr () {
 	Stackel n = pop;
 	if (n->number == 2) {
 		Stackel defaultName = pop, title = pop;
 		if (title->which == Stackel_STRING && defaultName->which == Stackel_STRING) {
-			autostring result = GuiFileSelect_getOutfileName (NULL, title->string, defaultName->string);
-			if (result.peek() == NULL) {
-				result.reset (Melder_wcsdup (L""));
+			autostring32 result = GuiFileSelect_getOutfileName (nullptr, title->string, defaultName->string);
+			if (! result.peek()) {
+				result.reset (Melder_dup (U""));
 			}
 			pushString (result.transfer());
 		} else {
-			Melder_throw ("The arguments of \"chooseWriteFile$\" must be two strings (the title and the default name).");
+			Melder_throw (U"The arguments of \"chooseWriteFile$\" must be two strings (the title and the default name).");
 		}
 	} else {
-		Melder_throw ("The function \"chooseWriteFile$\" requires 2 arguments (a title and a default name), not ", n->number, ".");
+		Melder_throw (U"The function \"chooseWriteFile$\" requires 2 arguments (a title and a default name), not ", n->number, U".");
 	}
 }
-static void do_chooseDirectoryStr (void) {
+static void do_chooseDirectoryStr () {
 	Stackel n = pop;
 	if (n->number == 1) {
 		Stackel title = pop;
 		if (title->which == Stackel_STRING) {
-			autostring result = GuiFileSelect_getDirectoryName (NULL, title->string);
-			if (result.peek() == NULL) {
-				result.reset (Melder_wcsdup (L""));
+			autostring32 result = GuiFileSelect_getDirectoryName (nullptr, title->string);
+			if (! result.peek()) {
+				result.reset (Melder_dup (U""));
 			}
 			pushString (result.transfer());
 		} else {
-			Melder_throw ("The argument of \"chooseDirectory$\" must be a string (the title).");
+			Melder_throw (U"The argument of \"chooseDirectory$\" must be a string (the title).");
 		}
 	} else {
-		Melder_throw ("The function \"chooseDirectory$\" requires 1 argument (a title), not ", n->number, ".");
+		Melder_throw (U"The function \"chooseDirectory$\" requires 1 argument (a title), not ", n->number, U".");
 	}
 }
-static void do_demoWindowTitle (void) {
+static void do_demoWindowTitle () {
 	Stackel n = pop;
 	if (n->number == 1) {
 		Stackel title = pop;
 		if (title->which == Stackel_STRING) {
 			Demo_windowTitle (title->string);
 		} else {
-			Melder_throw ("The argument of \"demoWindowTitle\" must be a string (the title), not ", Stackel_whichText (title), ".");
+			Melder_throw (U"The argument of \"demoWindowTitle\" must be a string (the title), not ", Stackel_whichText (title), U".");
 		}
 	} else {
-		Melder_throw ("The function \"demoWindowTitle\" requires 1 argument (a title), not ", Melder_integer (n->number), ".");
+		Melder_throw (U"The function \"demoWindowTitle\" requires 1 argument (a title), not ", n->number, U".");
 	}
 	pushNumber (1);
 }
-static void do_demoShow (void) {
+static void do_demoShow () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoShow\" requires 0 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"demoShow\" requires 0 arguments, not ", n->number, U".");
 	Demo_show ();
 	pushNumber (1);
 }
-static void do_demoWaitForInput (void) {
+static void do_demoWaitForInput () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoWaitForInput\" requires 0 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"demoWaitForInput\" requires 0 arguments, not ", n->number, U".");
 	Demo_waitForInput (theInterpreter);
 	pushNumber (1);
 }
-static void do_demoInput (void) {
+static void do_demoInput () {
 	Stackel n = pop;
 	if (n->number == 1) {
 		Stackel keys = pop;
@@ -4037,13 +4051,13 @@ static void do_demoInput (void) {
 			bool result = Demo_input (keys->string);
 			pushNumber (result);
 		} else {
-			Melder_throw ("The argument of \"demoInput\" must be a string (the keys), not ", Stackel_whichText (keys), ".");
+			Melder_throw (U"The argument of \"demoInput\" must be a string (the keys), not ", Stackel_whichText (keys), U".");
 		}
 	} else {
-		Melder_throw ("The function \"demoInput\" requires 1 argument (keys), not ", n->number, ".");
+		Melder_throw (U"The function \"demoInput\" requires 1 argument (keys), not ", n->number, U".");
 	}
 }
-static void do_demoClickedIn (void) {
+static void do_demoClickedIn () {
 	Stackel n = pop;
 	if (n->number == 4) {
 		Stackel top = pop, bottom = pop, right = pop, left = pop;
@@ -4051,628 +4065,628 @@ static void do_demoClickedIn (void) {
 			bool result = Demo_clickedIn (left->number, right->number, bottom->number, top->number);
 			pushNumber (result);
 		} else {
-			Melder_throw ("All arguments of \"demoClickedIn\" must be numbers (the x and y ranges).");
+			Melder_throw (U"All arguments of \"demoClickedIn\" must be numbers (the x and y ranges).");
 		}
 	} else {
-		Melder_throw ("The function \"demoClickedIn\" requires 4 arguments (x and y ranges), not ", n->number, ".");
+		Melder_throw (U"The function \"demoClickedIn\" requires 4 arguments (x and y ranges), not ", n->number, U".");
 	}
 }
-static void do_demoClicked (void) {
+static void do_demoClicked () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoClicked\" requires 0 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"demoClicked\" requires 0 arguments, not ", n->number, U".");
 	bool result = Demo_clicked ();
 	pushNumber (result);
 }
-static void do_demoX (void) {
+static void do_demoX () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoX\" requires 0 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"demoX\" requires 0 arguments, not ", n->number, U".");
 	double result = Demo_x ();
 	pushNumber (result);
 }
-static void do_demoY (void) {
+static void do_demoY () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoY\" requires 0 arguments, not ", n->number, L".");
+		Melder_throw (U"The function \"demoY\" requires 0 arguments, not ", n->number, U".");
 	double result = Demo_y ();
 	pushNumber (result);
 }
-static void do_demoKeyPressed (void) {
+static void do_demoKeyPressed () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoKeyPressed\" requires 0 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"demoKeyPressed\" requires 0 arguments, not ", n->number, U".");
 	bool result = Demo_keyPressed ();
 	pushNumber (result);
 }
-static void do_demoKey (void) {
+static void do_demoKey () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoKey\" requires 0 arguments, not ", n->number, ".");
-	autostring key = Melder_malloc (wchar_t, 2);
+		Melder_throw (U"The function \"demoKey\" requires 0 arguments, not ", n->number, U".");
+	autostring32 key = Melder_malloc (char32, 2);
 	key [0] = Demo_key ();
-	key [1] = '\0';
+	key [1] = U'\0';
 	pushString (key.transfer());
 }
-static void do_demoShiftKeyPressed (void) {
+static void do_demoShiftKeyPressed () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoShiftKeyPressed\" requires 0 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"demoShiftKeyPressed\" requires 0 arguments, not ", n->number, U".");
 	bool result = Demo_shiftKeyPressed ();
 	pushNumber (result);
 }
-static void do_demoCommandKeyPressed (void) {
+static void do_demoCommandKeyPressed () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoCommandKeyPressed\" requires 0 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"demoCommandKeyPressed\" requires 0 arguments, not ", n->number, U".");
 	bool result = Demo_commandKeyPressed ();
 	pushNumber (result);
 }
-static void do_demoOptionKeyPressed (void) {
+static void do_demoOptionKeyPressed () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoOptionKeyPressed\" requires 0 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"demoOptionKeyPressed\" requires 0 arguments, not ", n->number, U".");
 	bool result = Demo_optionKeyPressed ();
 	pushNumber (result);
 }
-static void do_demoExtraControlKeyPressed (void) {
+static void do_demoExtraControlKeyPressed () {
 	Stackel n = pop;
 	if (n->number != 0)
-		Melder_throw ("The function \"demoControlKeyPressed\" requires 0 arguments, not ", n->number, ".");
+		Melder_throw (U"The function \"demoControlKeyPressed\" requires 0 arguments, not ", n->number, U".");
 	bool result = Demo_extraControlKeyPressed ();
 	pushNumber (result);
 }
-static long Stackel_getRowNumber (Stackel row, Data thee) {
+static long Stackel_getRowNumber (Stackel row, Daata thee) {
 	long result = 0;
 	if (row->which == Stackel_NUMBER) {
-		result = floor (row->number + 0.5);   // round
+		result = lround (row->number);
 	} else if (row->which == Stackel_STRING) {
 		if (! thy v_hasGetRowIndex ())
-			Melder_throw ("Objects of type ", Thing_className (thee), " do not have row labels, so row indexes have to be numbers.");
-		result = thy v_getRowIndex (row->string);
+			Melder_throw (U"Objects of type ", Thing_className (thee), U" do not have row labels, so row indexes have to be numbers.");
+		result = lround (thy v_getRowIndex (row->string));
 		if (result == 0)
-			Melder_throw ("Object \"", thy name, "\" has no row labelled \"", row->string, "\".");
+			Melder_throw (U"Object \"", thy name, U"\" has no row labelled \"", row->string, U"\".");
 	} else {
-		Melder_throw ("A row index should be a number or a string, not ", Stackel_whichText (row), ".");
+		Melder_throw (U"A row index should be a number or a string, not ", Stackel_whichText (row), U".");
 	}
 	return result;
 }
-static long Stackel_getColumnNumber (Stackel column, Data thee) {
+static long Stackel_getColumnNumber (Stackel column, Daata thee) {
 	long result = 0;
 	if (column->which == Stackel_NUMBER) {
-		result = floor (column->number + 0.5);   // round
+		result = lround (column->number);
 	} else if (column->which == Stackel_STRING) {
 		if (! thy v_hasGetColIndex ())
-			Melder_throw ("Objects of type ", Thing_className (thee), " do not have column labels, so column indexes have to be numbers.");
-		result = thy v_getColIndex (column->string);
+			Melder_throw (U"Objects of type ", Thing_className (thee), U" do not have column labels, so column indexes have to be numbers.");
+		result = lround (thy v_getColIndex (column->string));
 		if (result == 0)
-			Melder_throw ("Object \"", thy name, "\" has no column labelled \"", column->string, "\".");
+			Melder_throw (U"Object ", thee, U" has no column labelled \"", column->string, U"\".");
 	} else {
-		Melder_throw ("A column index should be a number or a string, not ", Stackel_whichText (column), ".");
+		Melder_throw (U"A column index should be a number or a string, not ", Stackel_whichText (column), U".");
 	}
 	return result;
 }
 static void do_self0 (long irow, long icol) {
-	Data me = theSource;
-	if (me == NULL) Melder_throw ("The name \"self\" is restricted to formulas for objects.");
+	Daata me = theSource;
+	if (! me) Melder_throw (U"The name \"self\" is restricted to formulas for objects.");
 	if (my v_hasGetCell ()) {
 		pushNumber (my v_getCell ());
 	} else if (my v_hasGetVector ()) {
 		if (icol == 0) {
-			Melder_throw ("We are not in a loop, hence no implicit column index for the current ",
-				Thing_className (me), " object (self).\nTry using the [column] index explicitly.");
+			Melder_throw (U"We are not in a loop, hence no implicit column index for the current ",
+				Thing_className (me), U" object (self).\nTry using the [column] index explicitly.");
 		} else {
 			pushNumber (my v_getVector (irow, icol));
 		}
 	} else if (my v_hasGetMatrix ()) {
 		if (irow == 0) {
 			if (icol == 0) {
-				Melder_throw ("We are not in a loop over rows and columns,\n"
-					"hence no implicit row and column indexing for the current ",
-					Thing_className (me), " object (self).\n"
-					"Try using both [row, column] indexes explicitly.");
+				Melder_throw (U"We are not in a loop over rows and columns,\n"
+					U"hence no implicit row and column indexing for the current ",
+					Thing_className (me), U" object (self).\n"
+					U"Try using both [row, column] indexes explicitly.");
 			} else {
-				Melder_throw ("We are not in a loop over columns only,\n"
-					"hence no implicit row index for the current ",
-					Thing_className (me), " object (self).\n"
-					"Try using the [row] index explicitly.");
+				Melder_throw (U"We are not in a loop over columns only,\n"
+					U"hence no implicit row index for the current ",
+					Thing_className (me), U" object (self).\n"
+					U"Try using the [row] index explicitly.");
 			}
 		} else {
 			pushNumber (my v_getMatrix (irow, icol));
 		}
 	} else {
-		Melder_throw (Thing_className (me), " objects (like self) accept no [] indexing.");
+		Melder_throw (Thing_className (me), U" objects (like self) accept no [] indexing.");
 	}
 }
 static void do_selfStr0 (long irow, long icol) {
-	Data me = theSource;
-	if (me == NULL) Melder_throw ("The name \"self$\" is restricted to formulas for objects.");
+	Daata me = theSource;
+	if (! me) Melder_throw (U"The name \"self$\" is restricted to formulas for objects.");
 	if (my v_hasGetCellStr ()) {
-		autostring result = Melder_wcsdup (my v_getCellStr ());
+		autostring32 result = Melder_dup (my v_getCellStr ());
 		pushString (result.transfer());
 	} else if (my v_hasGetVectorStr ()) {
 		if (icol == 0) {
-			Melder_throw ("We are not in a loop, hence no implicit column index for the current ",
-				Thing_className (me), " object (self).\nTry using the [column] index explicitly.");
+			Melder_throw (U"We are not in a loop, hence no implicit column index for the current ",
+				Thing_className (me), U" object (self).\nTry using the [column] index explicitly.");
 		} else {
-			autostring result = Melder_wcsdup (my v_getVectorStr (icol));
+			autostring32 result = Melder_dup (my v_getVectorStr (icol));
 			pushString (result.transfer());
 		}
 	} else if (my v_hasGetMatrixStr ()) {
 		if (irow == 0) {
 			if (icol == 0) {
-				Melder_throw ("We are not in a loop over rows and columns,\n"
-					"hence no implicit row and column indexing for the current ",
-					Thing_className (me), " object (self).\n"
-					"Try using both [row, column] indexes explicitly.");
+				Melder_throw (U"We are not in a loop over rows and columns,\n"
+					U"hence no implicit row and column indexing for the current ",
+					Thing_className (me), U" object (self).\n"
+					U"Try using both [row, column] indexes explicitly.");
 			} else {
-				Melder_throw ("We are not in a loop over columns only,\n"
-					"hence no implicit row index for the current ",
-					Thing_className (me), " object (self).\n"
-					"Try using the [row] index explicitly.");
+				Melder_throw (U"We are not in a loop over columns only,\n"
+					U"hence no implicit row index for the current ",
+					Thing_className (me), U" object (self).\n"
+					U"Try using the [row] index explicitly.");
 			}
 		} else {
-			autostring result = Melder_wcsdup (my v_getMatrixStr (irow, icol));
+			autostring32 result = Melder_dup (my v_getMatrixStr (irow, icol));
 			pushString (result.transfer());
 		}
 	} else {
-		Melder_throw (Thing_className (me), " objects (like self) accept no [] indexing.");
+		Melder_throw (Thing_className (me), U" objects (like self) accept no [] indexing.");
 	}
 }
-static Data getObjectFromUniqueID (Stackel object) {
-	Data thee = NULL;
+static Daata getObjectFromUniqueID (Stackel object) {
+	Daata thee = nullptr;
 	if (object->which == Stackel_NUMBER) {
 		int i = theCurrentPraatObjects -> n;
 		while (i > 0 && object->number != theCurrentPraatObjects -> list [i]. id)
 			i --;
 		if (i == 0) {
-			Melder_throw ("No such object: ", object->number);
+			Melder_throw (U"No such object: ", object->number);
 		}
-		thee = (Data) theCurrentPraatObjects -> list [i]. object;
+		thee = (Daata) theCurrentPraatObjects -> list [i]. object;
 	} else if (object->which == Stackel_STRING) {
 		int i = theCurrentPraatObjects -> n;
-		while (i > 0 && ! Melder_wcsequ (object->string, theCurrentPraatObjects -> list [i]. name))
+		while (i > 0 && ! Melder_equ (object->string, theCurrentPraatObjects -> list [i]. name))
 			i --;
 		if (i == 0) {
-			Melder_throw ("No such object: ", object->string);
+			Melder_throw (U"No such object: ", object->string);
 		}
-		thee = (Data) theCurrentPraatObjects -> list [i]. object;
+		thee = (Daata) theCurrentPraatObjects -> list [i]. object;
 	} else {
-		Melder_throw ("The first argument to \"object\" must be a number (unique ID) or a string (name), not ", Stackel_whichText (object), ".");
+		Melder_throw (U"The first argument to \"object\" must be a number (unique ID) or a string (name), not ", Stackel_whichText (object), U".");
 	}
 	return thee;
 }
 static void do_objectCell0 (long irow, long icol) {
-	Data thee = getObjectFromUniqueID (pop);
+	Daata thee = getObjectFromUniqueID (pop);
 	if (thy v_hasGetCell ()) {
 		pushNumber (thy v_getCell ());
 	} else if (thy v_hasGetVector ()) {
 		if (icol == 0) {
-			Melder_throw ("We are not in a loop,\n"
-				"hence no implicit column index for this ", Thing_className (thee), " object.\n"
-				"Try using: object [id, column].");
+			Melder_throw (U"We are not in a loop,\n"
+				U"hence no implicit column index for this ", Thing_className (thee), U" object.\n"
+				U"Try using: object [id, column].");
 		} else {
 			pushNumber (thy v_getVector (irow, icol));
 		}
 	} else if (thy v_hasGetMatrix ()) {
 		if (irow == 0) {
 			if (icol == 0) {
-				Melder_throw ("We are not in a loop over rows and columns,\n"
-					"hence no implicit row and column indexing for this ", Thing_className (thee), " object.\n"
-					"Try using: object [id, row, column].");
+				Melder_throw (U"We are not in a loop over rows and columns,\n"
+					U"hence no implicit row and column indexing for this ", Thing_className (thee), U" object.\n"
+					U"Try using: object [id, row, column].");
 			} else {
-				Melder_throw ("We are not in a loop over columns only,\n"
-					"hence no implicit row index for this ", Thing_className (thee), " object.\n"
-					"Try using: object [id, row].");
+				Melder_throw (U"We are not in a loop over columns only,\n"
+					U"hence no implicit row index for this ", Thing_className (thee), U" object.\n"
+					U"Try using: object [id, row].");
 			}
 		} else {
 			pushNumber (thy v_getMatrix (irow, icol));
 		}
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept no [] indexing.");
+		Melder_throw (Thing_className (thee), U" objects accept no [] indexing.");
 	}
 }
 static void do_matriks0 (long irow, long icol) {
-	Data thee = parse [programPointer]. content.object;
+	Daata thee = parse [programPointer]. content.object;
 	if (thy v_hasGetCell ()) {
 		pushNumber (thy v_getCell ());
 	} else if (thy v_hasGetVector ()) {
 		if (icol == 0) {
-			Melder_throw ("We are not in a loop,\n"
-				"hence no implicit column index for this ", Thing_className (thee), " object.\n"
-				"Try using the [column] index explicitly.");
+			Melder_throw (U"We are not in a loop,\n"
+				U"hence no implicit column index for this ", Thing_className (thee), U" object.\n"
+				U"Try using the [column] index explicitly.");
 		} else {
 			pushNumber (thy v_getVector (irow, icol));
 		}
 	} else if (thy v_hasGetMatrix ()) {
 		if (irow == 0) {
 			if (icol == 0) {
-				Melder_throw ("We are not in a loop over rows and columns,\n"
-					"hence no implicit row and column indexing for this ", Thing_className (thee), " object.\n"
-					"Try using both [row, column] indexes explicitly.");
+				Melder_throw (U"We are not in a loop over rows and columns,\n"
+					U"hence no implicit row and column indexing for this ", Thing_className (thee), U" object.\n"
+					U"Try using both [row, column] indexes explicitly.");
 			} else {
-				Melder_throw ("We are not in a loop over columns only,\n"
-					"hence no implicit row index for this ", Thing_className (thee), " object.\n"
-					"Try using the [row] index explicitly.");
+				Melder_throw (U"We are not in a loop over columns only,\n"
+					U"hence no implicit row index for this ", Thing_className (thee), U" object.\n"
+					U"Try using the [row] index explicitly.");
 			}
 		} else {
 			pushNumber (thy v_getMatrix (irow, icol));
 		}
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept no [] indexing.");
+		Melder_throw (Thing_className (thee), U" objects accept no [] indexing.");
 	}
 }
 static void do_selfMatriks1 (long irow) {
-	Data me = theSource;
+	Daata me = theSource;
 	Stackel column = pop;
-	if (me == NULL) Melder_throw ("The name \"self\" is restricted to formulas for objects.");
+	if (! me) Melder_throw (U"The name \"self\" is restricted to formulas for objects.");
 	long icol = Stackel_getColumnNumber (column, me);
 	if (my v_hasGetVector ()) {
 		pushNumber (my v_getVector (irow, icol));
 	} else if (my v_hasGetMatrix ()) {
 		if (irow == 0) {
-			Melder_throw ("We are not in a loop,\n"
-				"hence no implicit row index for the current ", Thing_className (me), " object (self).\n"
-				"Try using both [row, column] indexes instead.");
+			Melder_throw (U"We are not in a loop,\n"
+				U"hence no implicit row index for the current ", Thing_className (me), U" object (self).\n"
+				U"Try using both [row, column] indexes instead.");
 		} else {
 			pushNumber (my v_getMatrix (irow, icol));
 		}
 	} else {
-		Melder_throw (Thing_className (me), " objects (like self) accept no [column] indexes.");
+		Melder_throw (Thing_className (me), U" objects (like self) accept no [column] indexes.");
 	}
 }
 static void do_selfMatriksStr1 (long irow) {
-	Data me = theSource;
+	Daata me = theSource;
 	Stackel column = pop;
-	if (me == NULL) Melder_throw ("The name \"self$\" is restricted to formulas for objects.");
+	if (! me) Melder_throw (U"The name \"self$\" is restricted to formulas for objects.");
 	long icol = Stackel_getColumnNumber (column, me);
 	if (my v_hasGetVectorStr ()) {
-		autostring result = Melder_wcsdup (my v_getVectorStr (icol));
+		autostring32 result = Melder_dup (my v_getVectorStr (icol));
 		pushString (result.transfer());
 	} else if (my v_hasGetMatrixStr ()) {
 		if (irow == 0) {
-			Melder_throw ("We are not in a loop,\n"
-				"hence no implicit row index for the current ", Thing_className (me), " object (self).\n"
-				"Try using both [row, column] indexes instead.");
+			Melder_throw (U"We are not in a loop,\n"
+				U"hence no implicit row index for the current ", Thing_className (me), U" object (self).\n"
+				U"Try using both [row, column] indexes instead.");
 		} else {
-			autostring result = Melder_wcsdup (my v_getMatrixStr (irow, icol));
+			autostring32 result = Melder_dup (my v_getMatrixStr (irow, icol));
 			pushString (result.transfer());
 		}
 	} else {
-		Melder_throw (Thing_className (me), " objects (like self) accept no [column] indexes.");
+		Melder_throw (Thing_className (me), U" objects (like self) accept no [column] indexes.");
 	}
 }
 static void do_objectCell1 (long irow) {
 	Stackel column = pop;
-	Data thee = getObjectFromUniqueID (pop);
+	Daata thee = getObjectFromUniqueID (pop);
 	long icol = Stackel_getColumnNumber (column, thee);
 	if (thy v_hasGetVector ()) {
 		pushNumber (thy v_getVector (irow, icol));
 	} else if (thy v_hasGetMatrix ()) {
 		if (irow == 0) {
-			Melder_throw ("We are not in a loop,\n"
-				"hence no implicit row index for this ", Thing_className (thee), " object.\n"
-				"Try using: object [id, row, column].");
+			Melder_throw (U"We are not in a loop,\n"
+				U"hence no implicit row index for this ", Thing_className (thee), U" object.\n"
+				U"Try using: object [id, row, column].");
 		} else {
 			pushNumber (thy v_getMatrix (irow, icol));
 		}
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept no [column] indexes.");
+		Melder_throw (Thing_className (thee), U" objects accept no [column] indexes.");
 	}
 }
 static void do_matriks1 (long irow) {
-	Data thee = parse [programPointer]. content.object;
+	Daata thee = parse [programPointer]. content.object;
 	Stackel column = pop;
 	long icol = Stackel_getColumnNumber (column, thee);
 	if (thy v_hasGetVector ()) {
 		pushNumber (thy v_getVector (irow, icol));
 	} else if (thy v_hasGetMatrix ()) {
 		if (irow == 0) {
-			Melder_throw ("We are not in a loop,\n"
-				"hence no implicit row index for this ", Thing_className (thee), " object.\n"
-				"Try using both [row, column] indexes instead.");
+			Melder_throw (U"We are not in a loop,\n"
+				U"hence no implicit row index for this ", Thing_className (thee), U" object.\n"
+				U"Try using both [row, column] indexes instead.");
 		} else {
 			pushNumber (thy v_getMatrix (irow, icol));
 		}
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept no [column] indexes.");
+		Melder_throw (Thing_className (thee), U" objects accept no [column] indexes.");
 	}
 }
 static void do_objectCellStr1 (long irow) {
 	Stackel column = pop;
-	Data thee = getObjectFromUniqueID (pop);
+	Daata thee = getObjectFromUniqueID (pop);
 	long icol = Stackel_getColumnNumber (column, thee);
 	if (thy v_hasGetVectorStr ()) {
-		autostring result = Melder_wcsdup (thy v_getVectorStr (icol));
+		autostring32 result = Melder_dup (thy v_getVectorStr (icol));
 		pushString (result.transfer());
 	} else if (thy v_hasGetMatrixStr ()) {
 		if (irow == 0) {
-			Melder_throw ("We are not in a loop,\n"
-				"hence no implicit row index for this ", Thing_className (thee), " object.\n"
-				"Try using: object [id, row, column].");
+			Melder_throw (U"We are not in a loop,\n"
+				U"hence no implicit row index for this ", Thing_className (thee), U" object.\n"
+				U"Try using: object [id, row, column].");
 		} else {
-			autostring result = Melder_wcsdup (thy v_getMatrixStr (irow, icol));
+			autostring32 result = Melder_dup (thy v_getMatrixStr (irow, icol));
 			pushString (result.transfer());
 		}
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept no [column] indexes for string cells.");
+		Melder_throw (Thing_className (thee), U" objects accept no [column] indexes for string cells.");
 	}
 }
 static void do_matrixStr1 (long irow) {
-	Data thee = parse [programPointer]. content.object;
+	Daata thee = parse [programPointer]. content.object;
 	Stackel column = pop;
 	long icol = Stackel_getColumnNumber (column, thee);
 	if (thy v_hasGetVectorStr ()) {
-		autostring result = Melder_wcsdup (thy v_getVectorStr (icol));
+		autostring32 result = Melder_dup (thy v_getVectorStr (icol));
 		pushString (result.transfer());
 	} else if (thy v_hasGetMatrixStr ()) {
 		if (irow == 0) {
-			Melder_throw ("We are not in a loop,\n"
-				"hence no implicit row index for this ", Thing_className (thee), " object.\n"
-				"Try using both [row, column] indexes instead.");
+			Melder_throw (U"We are not in a loop,\n"
+				U"hence no implicit row index for this ", Thing_className (thee), U" object.\n"
+				U"Try using both [row, column] indexes instead.");
 		} else {
-			autostring result = Melder_wcsdup (thy v_getMatrixStr (irow, icol));
+			autostring32 result = Melder_dup (thy v_getMatrixStr (irow, icol));
 			pushString (result.transfer());
 		}
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept no [column] indexes for string cells.");
+		Melder_throw (Thing_className (thee), U" objects accept no [column] indexes for string cells.");
 	}
 }
-static void do_selfMatriks2 (void) {
-	Data me = theSource;
+static void do_selfMatriks2 () {
+	Daata me = theSource;
 	Stackel column = pop, row = pop;
-	if (me == NULL) Melder_throw ("The name \"self\" is restricted to formulas for objects.");
+	if (! me) Melder_throw (U"The name \"self\" is restricted to formulas for objects.");
 	long irow = Stackel_getRowNumber (row, me);
 	long icol = Stackel_getColumnNumber (column, me);
 	if (! my v_hasGetMatrix ())
-		Melder_throw (Thing_className (me), " objects like \"self\" accept no [row, column] indexing.");
+		Melder_throw (Thing_className (me), U" objects like \"self\" accept no [row, column] indexing.");
 	pushNumber (my v_getMatrix (irow, icol));
 }
-static void do_selfMatriksStr2 (void) {
-	Data me = theSource;
+static void do_selfMatriksStr2 () {
+	Daata me = theSource;
 	Stackel column = pop, row = pop;
-	if (me == NULL) Melder_throw ("The name \"self$\" is restricted to formulas for objects.");
+	if (! me) Melder_throw (U"The name \"self$\" is restricted to formulas for objects.");
 	long irow = Stackel_getRowNumber (row, me);
 	long icol = Stackel_getColumnNumber (column, me);
 	if (! my v_hasGetMatrixStr ())
-		Melder_throw (Thing_className (me), " objects like \"self$\" accept no [row, column] indexing for string cells.");
-	autostring result = Melder_wcsdup (my v_getMatrixStr (irow, icol));
+		Melder_throw (Thing_className (me), U" objects like \"self$\" accept no [row, column] indexing for string cells.");
+	autostring32 result = Melder_dup (my v_getMatrixStr (irow, icol));
 	pushString (result.transfer());
 }
-static void do_objectCell2 (void) {
+static void do_objectCell2 () {
 	Stackel column = pop, row = pop;
-	Data thee = getObjectFromUniqueID (pop);
+	Daata thee = getObjectFromUniqueID (pop);
 	long irow = Stackel_getRowNumber (row, thee);
 	long icol = Stackel_getColumnNumber (column, thee);
 	if (! thy v_hasGetMatrix ())
-		Melder_throw (Thing_className (thee), " objects accept no [id, row, column] indexing.");
+		Melder_throw (Thing_className (thee), U" objects accept no [id, row, column] indexing.");
 	pushNumber (thy v_getMatrix (irow, icol));
 }
-static void do_matriks2 (void) {
-	Data thee = parse [programPointer]. content.object;
+static void do_matriks2 () {
+	Daata thee = parse [programPointer]. content.object;
 	Stackel column = pop, row = pop;
 	long irow = Stackel_getRowNumber (row, thee);
 	long icol = Stackel_getColumnNumber (column, thee);
 	if (! thy v_hasGetMatrix ())
-		Melder_throw (Thing_className (thee), " objects accept no [row, column] indexing.");
+		Melder_throw (Thing_className (thee), U" objects accept no [row, column] indexing.");
 	pushNumber (thy v_getMatrix (irow, icol));
 }
-static void do_objectCellStr2 (void) {
+static void do_objectCellStr2 () {
 	Stackel column = pop, row = pop;
-	Data thee = getObjectFromUniqueID (pop);
+	Daata thee = getObjectFromUniqueID (pop);
 	long irow = Stackel_getRowNumber (row, thee);
 	long icol = Stackel_getColumnNumber (column, thee);
 	if (! thy v_hasGetMatrixStr ())
-		Melder_throw (Thing_className (thee), " objects accept no [id, row, column] indexing for string cells.");
-	autostring result = Melder_wcsdup (thy v_getMatrixStr (irow, icol));
+		Melder_throw (Thing_className (thee), U" objects accept no [id, row, column] indexing for string cells.");
+	autostring32 result = Melder_dup (thy v_getMatrixStr (irow, icol));
 	pushString (result.transfer());
 }
-static void do_matriksStr2 (void) {
-	Data thee = parse [programPointer]. content.object;
+static void do_matriksStr2 () {
+	Daata thee = parse [programPointer]. content.object;
 	Stackel column = pop, row = pop;
 	long irow = Stackel_getRowNumber (row, thee);
 	long icol = Stackel_getColumnNumber (column, thee);
 	if (! thy v_hasGetMatrixStr ())
-		Melder_throw (Thing_className (thee), " objects accept no [row, column] indexing for string cells.");
-	autostring result = Melder_wcsdup (thy v_getMatrixStr (irow, icol));
+		Melder_throw (Thing_className (thee), U" objects accept no [row, column] indexing for string cells.");
+	autostring32 result = Melder_dup (thy v_getMatrixStr (irow, icol));
 	pushString (result.transfer());
 }
 static void do_objectLocation0 (long irow, long icol) {
-	Data thee = getObjectFromUniqueID (pop);
+	Daata thee = getObjectFromUniqueID (pop);
 	if (thy v_hasGetFunction0 ()) {
 		pushNumber (thy v_getFunction0 ());
 	} else if (thy v_hasGetFunction1 ()) {
-		Data me = theSource;
-		if (me == NULL)
-			Melder_throw ("No current object (we are not in a Formula command),\n"
-				"hence no implicit x value for this ", Thing_className (thee), " object.\n"
-				"Try using: object (id, x).");
+		Daata me = theSource;
+		if (! me)
+			Melder_throw (U"No current object (we are not in a Formula command),\n"
+				U"hence no implicit x value for this ", Thing_className (thee), U" object.\n"
+				U"Try using: object (id, x).");
 		if (! my v_hasGetX ())
-			Melder_throw ("The current ", Thing_className (me),
-				" object gives no implicit x values,\nhence no implicit x value for this ",
+			Melder_throw (U"The current ", Thing_className (me),
+				U" object gives no implicit x values,\nhence no implicit x value for this ",
 				Thing_className (thee), " object.\n"
-				"Try using: object (id, x).");
+				U"Try using: object (id, x).");
 		double x = my v_getX (icol);
 		pushNumber (thy v_getFunction1 (irow, x));
 	} else if (thy v_hasGetFunction2 ()) {
-		Data me = theSource;
-		if (me == NULL)
-			Melder_throw ("No current object (we are not in a Formula command),\n"
-				"hence no implicit x or y values for this ", Thing_className (thee), " object.\n"
-				"Try using: object (id, x, y).");
+		Daata me = theSource;
+		if (! me)
+			Melder_throw (U"No current object (we are not in a Formula command),\n"
+				U"hence no implicit x or y values for this ", Thing_className (thee), U" object.\n"
+				U"Try using: object (id, x, y).");
 		if (! my v_hasGetX ())
-			Melder_throw ("The current ", Thing_className (me), " object gives no implicit x values,\n"
-				"hence no implicit x value for this ", Thing_className (thee), " object.\n"
-				"Try using: object (id, x, y).");
+			Melder_throw (U"The current ", Thing_className (me), U" object gives no implicit x values,\n"
+				U"hence no implicit x value for this ", Thing_className (thee), U" object.\n"
+				U"Try using: object (id, x, y).");
 		double x = my v_getX (icol);
 		if (! my v_hasGetY ())
-			Melder_throw ("The current ", Thing_className (me), L" object gives no implicit y values,\n"
-					"hence no implicit y value for this ", Thing_className (thee), " object.\n"
-					"Try using: object (id, y).");
+			Melder_throw (U"The current ", Thing_className (me), U" object gives no implicit y values,\n"
+					U"hence no implicit y value for this ", Thing_className (thee), U" object.\n"
+					U"Try using: object (id, y).");
 		double y = my v_getY (irow);
 		pushNumber (thy v_getFunction2 (x, y));
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept no () values.");
+		Melder_throw (Thing_className (thee), U" objects accept no () values.");
 	}
 }
 static void do_funktie0 (long irow, long icol) {
-	Data thee = parse [programPointer]. content.object;
+	Daata thee = parse [programPointer]. content.object;
 	if (thy v_hasGetFunction0 ()) {
 		pushNumber (thy v_getFunction0 ());
 	} else if (thy v_hasGetFunction1 ()) {
-		Data me = theSource;
-		if (me == NULL)
-			Melder_throw ("No current object (we are not in a Formula command),\n"
-				"hence no implicit x value for this ", Thing_className (thee), " object.\n"
-				"Try using the (x) argument explicitly.");
+		Daata me = theSource;
+		if (!me)
+			Melder_throw (U"No current object (we are not in a Formula command),\n"
+				U"hence no implicit x value for this ", Thing_className (thee), U" object.\n"
+				U"Try using the (x) argument explicitly.");
 		if (! my v_hasGetX ())
-			Melder_throw ("The current ", Thing_className (me),
-				" object gives no implicit x values,\nhence no implicit x value for this ",
-				Thing_className (thee), " object.\n"
-				"Try using the (x) argument explicitly.");
+			Melder_throw (U"The current ", Thing_className (me),
+				U" object gives no implicit x values,\nhence no implicit x value for this ",
+				Thing_className (thee), U" object.\n"
+				U"Try using the (x) argument explicitly.");
 		double x = my v_getX (icol);
 		pushNumber (thy v_getFunction1 (irow, x));
 	} else if (thy v_hasGetFunction2 ()) {
-		Data me = theSource;
-		if (me == NULL)
-			Melder_throw ("No current object (we are not in a Formula command),\n"
-				"hence no implicit x or y values for this ", Thing_className (thee), " object.\n"
-				"Try using both (x, y) arguments explicitly.");
+		Daata me = theSource;
+		if (! me)
+			Melder_throw (U"No current object (we are not in a Formula command),\n"
+				U"hence no implicit x or y values for this ", Thing_className (thee), U" object.\n"
+				U"Try using both (x, y) arguments explicitly.");
 		if (! my v_hasGetX ())
-			Melder_throw ("The current ", Thing_className (me), " object gives no implicit x values,\n"
-				"hence no implicit x value for this ", Thing_className (thee), " object.\n"
-				"Try using both (x, y) arguments explicitly.");
+			Melder_throw (U"The current ", Thing_className (me), U" object gives no implicit x values,\n"
+				U"hence no implicit x value for this ", Thing_className (thee), U" object.\n"
+				U"Try using both (x, y) arguments explicitly.");
 		double x = my v_getX (icol);
 		if (! my v_hasGetY ())
-			Melder_throw ("The current ", Thing_className (me), " object gives no implicit y values,\n"
-					"hence no implicit y value for this ", Thing_className (thee), " object.\n"
-					"Try using the (y) argument explicitly.");
+			Melder_throw (U"The current ", Thing_className (me), U" object gives no implicit y values,\n"
+					U"hence no implicit y value for this ", Thing_className (thee), U" object.\n"
+					U"Try using the (y) argument explicitly.");
 		double y = my v_getY (irow);
 		pushNumber (thy v_getFunction2 (x, y));
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept no () values.");
+		Melder_throw (Thing_className (thee), U" objects accept no () values.");
 	}
 }
 static void do_selfFunktie1 (long irow) {
-	Data me = theSource;
+	Daata me = theSource;
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
-		if (me == NULL) Melder_throw ("The name \"self\" is restricted to formulas for objects.");
+		if (! me) Melder_throw (U"The name \"self\" is restricted to formulas for objects.");
 		if (my v_hasGetFunction1 ()) {
 			pushNumber (my v_getFunction1 (irow, x->number));
 		} else if (my v_hasGetFunction2 ()) {
 			if (! my v_hasGetY ())
-				Melder_throw ("The current ", Thing_className (me), " object (self) accepts no implicit y values.\n"
-					"Try using both (x, y) arguments instead.");
+				Melder_throw (U"The current ", Thing_className (me), U" object (self) accepts no implicit y values.\n"
+					U"Try using both (x, y) arguments instead.");
 			double y = my v_getY (irow);
 			pushNumber (my v_getFunction2 (x->number, y));
 		} else {
-			Melder_throw (Thing_className (me), " objects like \"self\" accept no (x) values.");
+			Melder_throw (Thing_className (me), U" objects like \"self\" accept no (x) values.");
 		}
 	} else {
-		Melder_throw (Thing_className (me), " objects like \"self\" accept only numeric x values.");
+		Melder_throw (Thing_className (me), U" objects like \"self\" accept only numeric x values.");
 	}
 }
 static void do_objectLocation1 (long irow) {
 	Stackel x = pop;
-	Data thee = getObjectFromUniqueID (pop);
+	Daata thee = getObjectFromUniqueID (pop);
 	if (x->which == Stackel_NUMBER) {
 		if (thy v_hasGetFunction1 ()) {
 			pushNumber (thy v_getFunction1 (irow, x->number));
 		} else if (thy v_hasGetFunction2 ()) {
-			Data me = theSource;
-			if (me == NULL)
-				Melder_throw ("No current object (we are not in a Formula command),\n"
-					"hence no implicit y value for this ", Thing_className (thee), " object.\n"
-					"Try using: object (id, x, y).");
+			Daata me = theSource;
+			if (! me)
+				Melder_throw (U"No current object (we are not in a Formula command),\n"
+					U"hence no implicit y value for this ", Thing_className (thee), U" object.\n"
+					U"Try using: object (id, x, y).");
 			if (! my v_hasGetY ())
-				Melder_throw ("The current ", Thing_className (me), " object gives no implicit y values,\n"
-					"hence no implicit y value for this ", Thing_className (thee), " object.\n"
-					"Try using: object (id, x, y).");
+				Melder_throw (U"The current ", Thing_className (me), U" object gives no implicit y values,\n"
+					U"hence no implicit y value for this ", Thing_className (thee), U" object.\n"
+					U"Try using: object (id, x, y).");
 			double y = my v_getY (irow);
 			pushNumber (thy v_getFunction2 (x->number, y));
 		} else {
-			Melder_throw (Thing_className (thee), " objects accept no (x) values.");
+			Melder_throw (Thing_className (thee), U" objects accept no (x) values.");
 		}
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept only numeric x values.");
+		Melder_throw (Thing_className (thee), U" objects accept only numeric x values.");
 	}
 }
 static void do_funktie1 (long irow) {
-	Data thee = parse [programPointer]. content.object;
+	Daata thee = parse [programPointer]. content.object;
 	Stackel x = pop;
 	if (x->which == Stackel_NUMBER) {
 		if (thy v_hasGetFunction1 ()) {
 			pushNumber (thy v_getFunction1 (irow, x->number));
 		} else if (thy v_hasGetFunction2 ()) {
-			Data me = theSource;
-			if (me == NULL)
-				Melder_throw ("No current object (we are not in a Formula command),\n"
-					"hence no implicit y value for this ", Thing_className (thee), " object.\n"
-					"Try using both (x, y) arguments instead.");
+			Daata me = theSource;
+			if (! me)
+				Melder_throw (U"No current object (we are not in a Formula command),\n"
+					U"hence no implicit y value for this ", Thing_className (thee), U" object.\n"
+					U"Try using both (x, y) arguments instead.");
 			if (! my v_hasGetY ())
-				Melder_throw ("The current ", Thing_className (me), " object gives no implicit y values,\n"
-					"hence no implicit y value for this ", Thing_className (thee), " object.\n"
-					"Try using both (x, y) arguments instead.");
+				Melder_throw (U"The current ", Thing_className (me), U" object gives no implicit y values,\n"
+					U"hence no implicit y value for this ", Thing_className (thee), U" object.\n"
+					U"Try using both (x, y) arguments instead.");
 			double y = my v_getY (irow);
 			pushNumber (thy v_getFunction2 (x->number, y));
 		} else {
-			Melder_throw (Thing_className (thee), " objects accept no (x) values.");
+			Melder_throw (Thing_className (thee), U" objects accept no (x) values.");
 		}
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept only numeric x values.");
+		Melder_throw (Thing_className (thee), U" objects accept only numeric x values.");
 	}
 }
-static void do_selfFunktie2 (void) {
-	Data me = theSource;
+static void do_selfFunktie2 () {
+	Daata me = theSource;
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
-		if (me == NULL) Melder_throw ("The name \"self\" is restricted to formulas for objects.");
+		if (! me) Melder_throw (U"The name \"self\" is restricted to formulas for objects.");
 		if (! my v_hasGetFunction2 ())
-			Melder_throw (Thing_className (me), " objects like \"self\" accept no (x, y) values.");
+			Melder_throw (Thing_className (me), U" objects like \"self\" accept no (x, y) values.");
 		pushNumber (my v_getFunction2 (x->number, y->number));
 	} else {
-		Melder_throw (Thing_className (me), " objects accept only numeric x values.");
+		Melder_throw (Thing_className (me), U" objects accept only numeric x values.");
 	}
 }
-static void do_objectLocation2 (void) {
+static void do_objectLocation2 () {
 	Stackel y = pop, x = pop;
-	Data thee = getObjectFromUniqueID (pop);
+	Daata thee = getObjectFromUniqueID (pop);
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		if (! thy v_hasGetFunction2 ())
-			Melder_throw (Thing_className (thee), " objects accept no (x, y) values.");
+			Melder_throw (Thing_className (thee), U" objects accept no (x, y) values.");
 		pushNumber (thy v_getFunction2 (x->number, y->number));
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept only numeric x values.");
+		Melder_throw (Thing_className (thee), U" objects accept only numeric x values.");
 	}
 }
-static void do_funktie2 (void) {
-	Data thee = parse [programPointer]. content.object;
+static void do_funktie2 () {
+	Daata thee = parse [programPointer]. content.object;
 	Stackel y = pop, x = pop;
 	if (x->which == Stackel_NUMBER && y->which == Stackel_NUMBER) {
 		if (! thy v_hasGetFunction2 ())
-			Melder_throw (Thing_className (thee), " objects accept no (x, y) values.");
+			Melder_throw (Thing_className (thee), U" objects accept no (x, y) values.");
 		pushNumber (thy v_getFunction2 (x->number, y->number));
 	} else {
-		Melder_throw (Thing_className (thee), " objects accept only numeric x values.");
+		Melder_throw (Thing_className (thee), U" objects accept only numeric x values.");
 	}
 }
-static void do_rowStr (void) {
-	Data thee = parse [programPointer]. content.object;
+static void do_rowStr () {
+	Daata thee = parse [programPointer]. content.object;
 	Stackel row = pop;
 	long irow = Stackel_getRowNumber (row, thee);
-	autostring result = Melder_wcsdup (thy v_getRowStr (irow));
-	if (result.peek() == NULL)
-		Melder_throw ("Row index out of bounds.");
+	autostring32 result = Melder_dup (thy v_getRowStr (irow));
+	if (! result.peek())
+		Melder_throw (U"Row index out of bounds.");
 	pushString (result.transfer());
 }
-static void do_colStr (void) {
-	Data thee = parse [programPointer]. content.object;
+static void do_colStr () {
+	Daata thee = parse [programPointer]. content.object;
 	Stackel col = pop;
 	long icol = Stackel_getColumnNumber (col, thee);
-	autostring result = Melder_wcsdup (thy v_getColStr (icol));
-	if (result.peek() == NULL)
-		Melder_throw ("Column index out of bounds.");
+	autostring32 result = Melder_dup (thy v_getColStr (icol));
+	if (! result.peek())
+		Melder_throw (U"Column index out of bounds.");
 	pushString (result.transfer());
 }
 
@@ -4692,9 +4706,9 @@ static double NUMerf (double x) {
 void Formula_run (long row, long col, struct Formula_Result *result) {
 	FormulaInstruction f = parse;
 	programPointer = 1;   // first symbol of the program
-	if (theStack == NULL) theStack = Melder_calloc_f (struct structStackel, 10000);
-	if (theStack == NULL)
-		Melder_throw ("Out of memory during formula computation.");
+	if (! theStack) theStack = Melder_calloc_f (struct structStackel, 10000);
+	if (! theStack)
+		Melder_throw (U"Out of memory during formula computation.");
 	w = 0, wmax = 0;   // start new stack
 	try {
 		while (programPointer <= numberOfInstructions) {
@@ -4706,12 +4720,12 @@ case NUMBER_: { pushNumber (f [programPointer]. content.number);
 } break; case ROW_: { pushNumber (row);
 } break; case COL_: { pushNumber (col);
 } break; case X_: {
-	Data me = theSource;
-	if (! my v_hasGetX ()) Melder_throw ("No values for \"x\" for this object.");
+	Daata me = theSource;
+	if (! my v_hasGetX ()) Melder_throw (U"No values for \"x\" for this object.");
 	pushNumber (my v_getX (col));
 } break; case Y_: {
-	Data me = theSource;
-	if (! my v_hasGetY ()) Melder_throw ("No values for \"y\" for this object.");
+	Daata me = theSource;
+	if (! my v_hasGetY ()) Melder_throw (U"No values for \"y\" for this object.");
 	pushNumber (my v_getY (row));
 } break; case NOT_: { do_not ();
 } break; case EQ_: { do_eq ();
@@ -4829,6 +4843,7 @@ case NUMBER_: { pushNumber (f [programPointer]. content.number);
 } break; case NUMBER_OF_ROWS_: { do_numberOfRows ();
 } break; case NUMBER_OF_COLUMNS_: { do_numberOfColumns ();
 } break; case EDITOR_: { do_editor ();
+} break; case HASH_: { do_hash ();
 /********** String functions: **********/
 } break; case LENGTH_: { do_length ();
 } break; case STRING_TO_NUMBER_: { do_number ();
@@ -4846,12 +4861,12 @@ case NUMBER_: { pushNumber (f [programPointer]. content.number);
 } break; case STARTS_WITH_: { do_stringMatchesCriterion (kMelder_string_STARTS_WITH);
 } break; case ENDS_WITH_: { do_stringMatchesCriterion (kMelder_string_ENDS_WITH);
 } break; case REPLACESTR_: { do_replaceStr ();
-} break; case INDEX_REGEX_: { do_index_regex (FALSE);
-} break; case RINDEX_REGEX_: { do_index_regex (TRUE);
+} break; case INDEX_REGEX_: { do_index_regex (false);
+} break; case RINDEX_REGEX_: { do_index_regex (true);
 } break; case REPLACE_REGEXSTR_: { do_replace_regexStr ();
 } break; case EXTRACT_NUMBER_: { do_extractNumber ();
-} break; case EXTRACT_WORDSTR_: { do_extractTextStr (TRUE);
-} break; case EXTRACT_LINESTR_: { do_extractTextStr (FALSE);
+} break; case EXTRACT_WORDSTR_: { do_extractTextStr (true);
+} break; case EXTRACT_LINESTR_: { do_extractTextStr (false);
 } break; case SELECTED_: { do_selected ();
 } break; case SELECTEDSTR_: { do_selectedStr ();
 } break; case NUMBER_OF_SELECTED_: { do_numberOfSelected ();
@@ -4914,7 +4929,7 @@ case NUMBER_: { pushNumber (f [programPointer]. content.number);
 			programPointer = f [programPointer]. content.label - theOptimize;
 		}
 	} else {
-		Melder_throw ("A condition between \"if\" and \"then\" has to be a number, not ", Stackel_whichText (condition), ".");
+		Melder_throw (U"A condition between \"if\" and \"then\" has to be a number, not ", Stackel_whichText (condition), U".");
 	}
 } break; case IFFALSE_: {
 	Stackel condition = pop;
@@ -4923,7 +4938,7 @@ case NUMBER_: { pushNumber (f [programPointer]. content.number);
 			programPointer = f [programPointer]. content.label - theOptimize;
 		}
 	} else {
-		Melder_throw ("A condition between \"if\" and \"then\" has to be a number, not ", Stackel_whichText (condition), ".");
+		Melder_throw (U"A condition between \"if\" and \"then\" has to be a number, not ", Stackel_whichText (condition), U".");
 	}
 } break; case GOTO_: {
 	programPointer = f [programPointer]. content.label - theOptimize;
@@ -4933,18 +4948,18 @@ case NUMBER_: { pushNumber (f [programPointer]. content.number);
 	Stackel x = pop, v = pop;
 	InterpreterVariable var = v->variable;
 	var -> numericValue = x->number - 1.0;
-	//Melder_casual ("starting value %f", var -> numericValue);
+	//Melder_casual (U"starting value ", var -> numericValue);
 	pushVariable (var);
 } break; case INCREMENT_GREATER_GOTO_: {
-	//Melder_casual ("top of loop, stack depth %d", (int) w);
+	//Melder_casual (U"top of loop, stack depth ", w);
 	Stackel e = & theStack [w], v = & theStack [w - 1];
 	Melder_assert (e->which == Stackel_NUMBER);
 	Melder_assert (v->which == Stackel_VARIABLE);
 	InterpreterVariable var = v->variable;
-	//Melder_casual ("loop variable %f", var -> numericValue);
+	//Melder_casual (U"loop variable ", var -> numericValue);
 	var -> numericValue += 1.0;
-	//Melder_casual ("loop variable %f", var -> numericValue);
-	//Melder_casual ("end value %f", e->number);
+	//Melder_casual (U"loop variable ", var -> numericValue);
+	//Melder_casual (U"end value ", e->number);
 	if (var -> numericValue > e->number) {
 		programPointer = f [programPointer]. content.label - theOptimize;
 	}
@@ -4952,12 +4967,12 @@ case NUMBER_: { pushNumber (f [programPointer]. content.number);
 	Stackel x = pop, s = & theStack [w - 2];
 	Melder_assert (x->which == Stackel_NUMBER);
 	Melder_assert (s->which == Stackel_NUMBER);
-	//Melder_casual ("to add %f", x->number);
+	//Melder_casual (U"to add ", x->number);
 	s->number += x->number;
-	//Melder_casual ("sum %f", s->number);
+	//Melder_casual (U"sum ", s->number);
 } break; case POP_2_: {
 	w -= 2;
-	//Melder_casual ("total %f", theStack[w].number);
+	//Melder_casual (U"total ", theStack[w].number);
 } break; case NUMERIC_ARRAY_ELEMENT_: { do_numericArrayElement ();
 } break; case INDEXED_NUMERIC_VARIABLE_: { do_indexedNumericVariable ();
 } break; case INDEXED_STRING_VARIABLE_: { do_indexedStringVariable ();
@@ -4992,40 +5007,40 @@ case NUMBER_: { pushNumber (f [programPointer]. content.number);
 } break; case COLSTR_: { do_colStr ();
 } break; case SQR_: { do_sqr ();
 } break; case STRING_: {
-	autostring string = Melder_wcsdup (f [programPointer]. content.string);
+	autostring32 string = Melder_dup (f [programPointer]. content.string);
 	pushString (string.transfer());
 } break; case NUMERIC_VARIABLE_: {
 	InterpreterVariable var = f [programPointer]. content.variable;
 	pushNumber (var -> numericValue);
 } break; case STRING_VARIABLE_: {
 	InterpreterVariable var = f [programPointer]. content.variable;
-	autostring string = Melder_wcsdup (var -> stringValue);
+	autostring32 string = Melder_dup (var -> stringValue);
 	pushString (string.transfer());
 } break; case NUMERIC_ARRAY_VARIABLE_: {
 	InterpreterVariable var = f [programPointer]. content.variable;
 	double **data = NUMmatrix_copy (var -> numericArrayValue. data,
 		1, var -> numericArrayValue. numberOfRows, 1, var -> numericArrayValue. numberOfColumns);
 	pushNumericArray (var -> numericArrayValue. numberOfRows, var -> numericArrayValue. numberOfColumns, data);
-} break; default: Melder_throw ("Symbol \"", Formula_instructionNames [parse [programPointer]. symbol], "\" without action.");
+} break; default: Melder_throw (U"Symbol \"", Formula_instructionNames [parse [programPointer]. symbol], U"\" without action.");
 			} // endswitch
 			programPointer ++;
 		} // endwhile
-		if (w != 1) Melder_fatal ("Formula: stackpointer ends at %ld instead of 1.", w);
+		if (w != 1) Melder_fatal (U"Formula: stackpointer ends at ", w, U" instead of 1.");
 		if (theExpressionType [theLevel] == kFormula_EXPRESSION_TYPE_NUMERIC) {
-			if (theStack [1]. which == Stackel_STRING) Melder_throw ("Found a string expression instead of a numeric expression.");
-			if (theStack [1]. which == Stackel_NUMERIC_ARRAY) Melder_throw ("Found a numeric array expression instead of a numeric expression.");
+			if (theStack [1]. which == Stackel_STRING) Melder_throw (U"Found a string expression instead of a numeric expression.");
+			if (theStack [1]. which == Stackel_NUMERIC_ARRAY) Melder_throw (U"Found a numeric array expression instead of a numeric expression.");
 			result -> expressionType = kFormula_EXPRESSION_TYPE_NUMERIC;
 			result -> result.numericResult = theStack [1]. number;
 		} else if (theExpressionType [theLevel] == kFormula_EXPRESSION_TYPE_STRING) {
 			if (theStack [1]. which == Stackel_NUMBER)
-				Melder_throw ("Found a numeric expression (value ", theStack [1]. number, ") instead of a string expression.");
-			if (theStack [1]. which == Stackel_NUMERIC_ARRAY) Melder_throw ("Found a numeric array expression instead of a string expression.");
+				Melder_throw (U"Found a numeric expression (value ", theStack [1]. number, U") instead of a string expression.");
+			if (theStack [1]. which == Stackel_NUMERIC_ARRAY) Melder_throw (U"Found a numeric array expression instead of a string expression.");
 			result -> expressionType = kFormula_EXPRESSION_TYPE_STRING;
 			result -> result.stringResult = theStack [1]. string;   // dangle...
-			theStack [1]. string = NULL;   // ...undangle (and disown)
+			theStack [1]. string = nullptr;   // ...undangle (and disown)
 		} else if (theExpressionType [theLevel] == kFormula_EXPRESSION_TYPE_NUMERIC_ARRAY) {
-			if (theStack [1]. which == Stackel_NUMBER) Melder_throw ("Found a numeric expression instead of a numeric array expression.");
-			if (theStack [1]. which == Stackel_STRING) Melder_throw ("Found a string expression instead of a numeric array expression.");
+			if (theStack [1]. which == Stackel_NUMBER) Melder_throw (U"Found a numeric expression instead of a numeric array expression.");
+			if (theStack [1]. which == Stackel_STRING) Melder_throw (U"Found a string expression instead of a numeric array expression.");
 			result -> expressionType = kFormula_EXPRESSION_TYPE_NUMERIC_ARRAY;
 			result -> result.numericArrayResult = theStack [1]. numericArray;   // dangle
 			theStack [1]. numericArray = theZeroNumericArray;   // ...undangle (and disown)
@@ -5038,7 +5053,7 @@ case NUMBER_: { pushNumber (f [programPointer]. content.number);
 				Melder_assert (theStack [1]. which == Stackel_STRING);
 				result -> expressionType = kFormula_EXPRESSION_TYPE_STRING;
 				result -> result.stringResult = theStack [1]. string;   // dangle...
-				theStack [1]. string = NULL;   // ...undangle (and disown)
+				theStack [1]. string = nullptr;   // ...undangle (and disown)
 			}
 		}
 		/*
@@ -5056,10 +5071,10 @@ case NUMBER_: { pushNumber (f [programPointer]. content.number);
 			Stackel stackel = & theStack [w];
 			if (stackel -> which > Stackel_NUMBER) Stackel_cleanUp (stackel);
 		}
-		if (Melder_hasError (L"Script exited.")) {
+		if (Melder_hasError (U"Script exited.")) {
 			throw;
 		} else {
-			Melder_throw ("Formula not run.");
+			Melder_throw (U"Formula not run.");
 		}
 	}
 }
diff --git a/sys/Formula.h b/sys/Formula.h
index 6861061..6d9f144 100644
--- a/sys/Formula.h
+++ b/sys/Formula.h
@@ -2,7 +2,7 @@
 #define _Formula_h_
 /* Formula.h
  *
- * Copyright (C) 1990-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1990-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -43,23 +43,23 @@ typedef struct structStackel {
 	int which;   /* 0 or negative = no clean-up required, positive = requires clean-up */
 	union {
 		double number;
-		wchar_t *string;
+		char32 *string;
 		struct Formula_NumericArray numericArray;
 		InterpreterVariable variable;
 	};
 } *Stackel;
-const wchar_t *Stackel_whichText (Stackel me);
+const char32 *Stackel_whichText (Stackel me);
 
 struct Formula_Result {
 	int expressionType;
 	union {
 		double numericResult;
-		wchar_t *stringResult;
+		char32 *stringResult;
 		struct Formula_NumericArray numericArrayResult;
 	} result;
 };
 
-void Formula_compile (Any interpreter, Any data, const wchar_t *expression, int expressionType, int optimize);
+void Formula_compile (Any interpreter, Any data, const char32 *expression, int expressionType, bool optimize);
 
 void Formula_run (long row, long col, struct Formula_Result *result);
 
diff --git a/sys/Graphics.cpp b/sys/Graphics.cpp
index f7c7247..76c0db3 100644
--- a/sys/Graphics.cpp
+++ b/sys/Graphics.cpp
@@ -1,6 +1,6 @@
 /* Graphics.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,7 +35,7 @@ Thing_implement (Graphics, Thing, 0);
 enum kGraphics_cjkFontStyle theGraphicsCjkFontStyle;
 
 void Graphics_prefs () {
-	Preferences_addEnum (L"Graphics.cjkFontStyle", & theGraphicsCjkFontStyle, kGraphics_cjkFontStyle, kGraphics_cjkFontStyle_DEFAULT);
+	Preferences_addEnum (U"Graphics.cjkFontStyle", & theGraphicsCjkFontStyle, kGraphics_cjkFontStyle, kGraphics_cjkFontStyle_DEFAULT);
 }
 
 void structGraphics :: v_destroy () {
@@ -114,10 +114,12 @@ void Graphics_init (Graphics me, int resolution) {
 		my resolutionNumber = kGraphics_resolution_360;
 	} else if (resolution == 600) {
 		my resolutionNumber = kGraphics_resolution_600;
+	} else if (resolution == 720) {
+		my resolutionNumber = kGraphics_resolution_720;
 	} else if (resolution == 1200) {
 		my resolutionNumber = kGraphics_resolution_1200;
 	} else {
-		Melder_fatal ("Unsupported resolution %d dpi.", resolution);
+		Melder_fatal (U"Unsupported resolution ", resolution, U" dpi.");
 	}
 	my d_x1DC = my d_x1DCmin = 0;	my d_x2DC = my d_x2DCmax = 32767;
 	my d_y1DC = my d_y1DCmin = 0;	my d_y2DC = my d_y2DCmax = 32767;
@@ -133,7 +135,7 @@ void Graphics_init (Graphics me, int resolution) {
 	my font = kGraphics_font_HELVETICA;
 	my fontSize = 10;
 	my fontStyle = Graphics_NORMAL;
-	my record = NULL;
+	my record = nullptr;
 	my irecord = my nrecord = 0;
 	my percentSignIsItalic = 1;
 	my numberSignIsBold = 1;
@@ -157,13 +159,12 @@ void Graphics_setWsViewport (Graphics me,
 	long x1DC, long x2DC, long y1DC, long y2DC)
 {
 	if (x1DC < my d_x1DCmin || x2DC > my d_x2DCmax || y1DC < my d_y1DCmin || y2DC > my d_y2DCmax) {
-		static MelderString warning = { 0 };
-		MelderString_empty (& warning);
-		MelderString_append (& warning, L"Graphics_setWsViewport: coordinates too large:\n",
-			Melder_integer (x1DC), L"..", Melder_integer (x2DC), L" x ", Melder_integer (y1DC), L"..", Melder_integer (y2DC));
-		MelderString_append (& warning, L" goes outside ",
-			Melder_integer (my d_x1DCmin), L"..", Melder_integer (my d_x2DCmax), L" x ", Melder_integer (my d_y1DCmin), L"..", Melder_integer (my d_y2DCmax), L".");
-		Melder_warning (warning.string);
+		Melder_warning (U"Graphics_setWsViewport: coordinates too large:\n",
+			x1DC, U"..", x2DC, U" x ", y1DC, U"..", y2DC,
+			U" goes outside ",
+			my d_x1DCmin, U"..", my d_x2DCmax, U" x ", my d_y1DCmin, U"..", my d_y2DCmax,
+			U"."
+		);
 		x1DC = my d_x1DCmin;
 		x2DC = my d_x2DCmax;
 		y1DC = my d_y1DCmin;
@@ -246,7 +247,7 @@ void Graphics_WCtoDC (Graphics me, double xWC, double yWC, long *xDC, long *yDC)
 /***** OUTPUT PRIMITIVES, RECORDABLE *****/
 
 void Graphics_setViewport (Graphics me, double x1NDC, double x2NDC, double y1NDC, double y2NDC) {
-	trace ("enter %f %f %f %f", x1NDC, x2NDC, y1NDC, y2NDC);
+	trace (U"enter ", x1NDC, U_SPACE, x2NDC, U_SPACE, y1NDC, U_SPACE, y2NDC);
 	my d_x1NDC = x1NDC;
 	my d_x2NDC = x2NDC;
 	my d_y1NDC = y1NDC;
@@ -259,7 +260,7 @@ void Graphics_setViewport (Graphics me, double x1NDC, double x2NDC, double y1NDC
 void Graphics_setInner (Graphics me) {
 	double margin = 2.8 * my fontSize * my resolution / 72.0;
 	double wDC = (my d_x2DC - my d_x1DC) / (my d_x2wNDC - my d_x1wNDC) * (my d_x2NDC - my d_x1NDC);
-	double hDC = abs (my d_y2DC - my d_y1DC) / (my d_y2wNDC - my d_y1wNDC) * (my d_y2NDC - my d_y1NDC);
+	double hDC = labs (my d_y2DC - my d_y1DC) / (my d_y2wNDC - my d_y1wNDC) * (my d_y2NDC - my d_y1NDC);
 	double dx = 1.5 * margin / wDC;
 	double dy = margin / hDC;
 	my horTick = 0.06 * dx, my vertTick = 0.09 * dy;
@@ -274,7 +275,7 @@ void Graphics_setInner (Graphics me) {
 	my d_x2NDC = (1 - dx) * my outerViewport.x2NDC + dx * my outerViewport.x1NDC;
 	my d_y1NDC = (1 - dy) * my outerViewport.y1NDC + dy * my outerViewport.y2NDC;
 	my d_y2NDC = (1 - dy) * my outerViewport.y2NDC + dy * my outerViewport.y1NDC;
-	trace ("done %f %f %f %f", my d_x1NDC, my d_x2NDC, my d_y1NDC, my d_y2NDC);
+	trace (U"done ", my d_x1NDC, U" ", my d_x2NDC, U" ", my d_y1NDC, U" ", my d_y2NDC);
 	computeTrafo (me);
 	if (my recording) { op (SET_INNER, 0); }
 }
@@ -284,7 +285,7 @@ void Graphics_unsetInner (Graphics me) {
 	my d_x2NDC = my outerViewport.x2NDC;
 	my d_y1NDC = my outerViewport.y1NDC;
 	my d_y2NDC = my outerViewport.y2NDC;
-	trace ("done %f %f %f %f", my d_x1NDC, my d_x2NDC, my d_y1NDC, my d_y2NDC);
+	trace (U"done ", my d_x1NDC, U" ", my d_x2NDC, U" ", my d_y1NDC, U" ", my d_y2NDC);
 	computeTrafo (me);
 	if (my recording)
 		{ op (UNSET_INNER, 0); }
@@ -321,7 +322,7 @@ void Graphics_inqWindow (Graphics me, double *x1WC, double *x2WC, double *y1WC,
 Graphics_Viewport Graphics_insetViewport
 	(Graphics me, double x1rel, double x2rel, double y1rel, double y2rel)
 {
-	trace ("enter");
+	trace (U"enter");
 	Graphics_Viewport previous;
 	previous.x1NDC = my d_x1NDC;
 	previous.x2NDC = my d_x2NDC;
@@ -336,7 +337,7 @@ Graphics_Viewport Graphics_insetViewport
 }
 
 void Graphics_resetViewport (Graphics me, Graphics_Viewport viewport) {
-	trace ("enter");
+	trace (U"enter");
 	Graphics_setViewport (me, viewport.x1NDC, viewport.x2NDC, viewport.y1NDC, viewport.y2NDC);
 }
 
diff --git a/sys/Graphics.h b/sys/Graphics.h
index 860be16..e54d584 100644
--- a/sys/Graphics.h
+++ b/sys/Graphics.h
@@ -2,7 +2,7 @@
 #define _Graphics_h_
 /* Graphics.h
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,111 +33,109 @@ typedef struct {
 	unsigned char link, rightToLeft;
 	short style, size, baseline;
 	unsigned long code;
-	wchar_t kar;
+	char32 kar;
 	double width;
 	union { long integer; const char *string; void *pointer; } font;
 	int cell, line, run;
 } _Graphics_widechar;
 
 Thing_define (Graphics, Thing) {
-	// new data:
-	public:
-		/* Device constants. */
-		bool screen;
-			/* A boolean for whether we are a graphic screen (which may include a non-PostScript printer. */
-		bool postScript;
-			/* A boolean for whether we are a PostScript device. */
-		bool printer;
-			/* A boolean for whether we are a printer. */
-		bool metafile;
-			/* A boolean for whether we are a high-resolution metafile or clipboard. */
-		bool yIsZeroAtTheTop;
-			/* A boolean for whether vertical cooordinates increase from top to bottom (as on most screens, but not PostScript). */
-		GuiDrawingArea d_drawingArea;
-			/* Also used as a boolean. */
-		int resolution;
-			/* Dots per inch. */
-		enum kGraphics_resolution resolutionNumber;
-			/* 0 = 96 dpi, 1 = 100 dpi, 2 = 300 dpi, 3 = 360 dpi, 4 = 600 dpi */
-		long d_x1DCmin, d_x2DCmax, d_y1DCmin, d_y2DCmax;
-			/* Maximum dimensions of the output device. */
-			/* x1DCmin < x2DCmax; y1DCmin < y2DCmax; */
-			/* The point (x1DCmin, y1DCmin) can be either in the top left */
-			/* or in the bottom left, depending on the yIsZeroAtTheTop flag. */
-			/* Device variables. */
-		long d_x1DC, d_x2DC, d_y1DC, d_y2DC;
-			/* Current dimensions of the output device, or: */
-			/* device coordinates of the viewport rectangle. */
-			/* x1DCmin <= x1DC < x2DC <= x2DCmax; */
-			/* y1DCmin <= y1DC < y2DC <= y2DCmax; */
-			/* Graphics_create_xxxxxx sets these coordinates to */
-			/* x1DCmin, x2DCmax, y1DCmin, and y2DCmax. */
-			/* They can be changed by Graphics_setWsViewport. */
-		double d_x1wNDC, d_x2wNDC, d_y1wNDC, d_y2wNDC;
-			/* Normalized device coordinates of */
-			/* the device viewport rectangle. */
-			/* The point (x1wNDC, y1wNDC) is always in the bottom left.	*/
-			/* Graphics_create_xxxxxx sets these coordinates to */
-			/* 0.0, 1.0, 0.0, and 1.0. */
-			/* They can be changed by Graphics_setWsWindow. */
-		double d_x1NDC, d_x2NDC, d_y1NDC, d_y2NDC;
-			/* Normalized device coordinates of the user output viewport, */
-			/* which is a part of the device viewport rectangle. */
-			/* x1wNDC <= x1NDC < x2NDC <= x2wNDC; */
-			/* y1wNDC <= y1NDC < y2NDC <= y2wNDC; */
-			/* Graphics_create_xxxxxx sets these coordinates to */
-			/* 0.0, 1.0, 0.0, and 1.0. */
-			/* They can be changed by Graphics_setViewport. */
-		double d_x1WC, d_x2WC, d_y1WC, d_y2WC;
-			/* World coordinates of the user output viewport rectangle.	*/
-			/* They bear a relation to the "real" world, */
-			/* and are used in the drawing routines. */
-			/* Graphics_create_xxxxxx sets these coordinates to */
-			/* 0.0, 1.0, 0.0, and 1.0. */
-			/* They can be changed by Graphics_setWindow. */
-		double deltaX, deltaY, scaleX, scaleY;
-			/* Current coordinate transformation. */
-		/* Graphics state. */
-		int lineType;
-		Graphics_Colour colour;
-		double lineWidth, arrowSize, speckleSize;
-		enum kGraphics_colourScale colourScale;
-		int horizontalTextAlignment, verticalTextAlignment;
-		double textRotation, wrapWidth, secondIndent, textX, textY;
-		enum kGraphics_font font;
-		int fontSize, fontStyle;
-		int percentSignIsItalic, numberSignIsBold, circumflexIsSuperscript, underscoreIsSubscript;
-		int dollarSignIsCode, atSignIsLink;
-		bool recording, duringXor;
-		long irecord, nrecord;
-		double *record;
-		Graphics_Viewport outerViewport;   /* For Graphics_(un)setInner (). */
-		double horTick, vertTick;   /* For Graphics_mark(s)XXX (). */
-		double paperWidth, paperHeight;
-	// overridden methods:
-		virtual void v_destroy ();
-	// new methods:
-		virtual void v_polyline (long numberOfPoints, double *xyDC, bool close) { (void) numberOfPoints; (void) xyDC; (void) close; }
-		virtual void v_fillArea (long numberOfPoints, double *xyDC) { (void) numberOfPoints; (void) xyDC; }
-		virtual void v_rectangle (double x1DC, double x2DC, double y1DC, double y2DC) { (void) x1DC; (void) x2DC; (void) y1DC; (void) y2DC; }
-		virtual void v_fillRectangle (double a_x1DC, double a_x2DC, double a_y1DC, double a_y2DC) { (void) a_x1DC; (void) a_x2DC; (void) a_y1DC; (void) a_y2DC; }
-		virtual void v_circle (double xDC, double yDC, double rDC) { (void) xDC; (void) yDC; (void) rDC; }
-		virtual void v_ellipse (double a_x1DC, double a_x2DC, double a_y1DC, double a_y2DC) { (void) a_x1DC; (void) a_x2DC; (void) a_y1DC; (void) a_y2DC; }
-		virtual void v_arc (double xDC, double yDC, double rDC, double fromAngle, double toAngle) { (void) xDC; (void) yDC; (void) rDC; (void) fromAngle; (void) toAngle; }
-		virtual void v_fillCircle (double xDC, double yDC, double rDC) { (void) xDC; (void) yDC; (void) rDC; }
-		virtual void v_fillEllipse (double a_x1DC, double a_x2DC, double a_y1DC, double a_y2DC) { (void) a_x1DC; (void) a_x2DC; (void) a_y1DC; (void) a_y2DC; }
-		virtual void v_button (double a_x1DC, double a_x2DC, double a_y1DC, double a_y2DC)
-			{
-				v_rectangle (a_x1DC, a_x2DC, a_y1DC, a_y2DC);   // the simplest implementation
-			}
-		virtual void v_roundedRectangle (double x1DC, double x2DC, double y1DC, double y2DC, double r);
-		virtual void v_fillRoundedRectangle (double x1DC, double x2DC, double y1DC, double y2DC, double r);
-		virtual void v_arrowHead (double xDC, double yDC, double angle);
-		virtual bool v_mouseStillDown () { return false; }
-		virtual void v_getMouseLocation (double *xWC, double *yWC) { *xWC = *yWC = NUMundefined; }
-		virtual void v_flushWs () { }
-		virtual void v_clearWs () { }
-		virtual void v_updateWs () { }
+	/* Device constants. */
+	bool screen;
+		/* A boolean for whether we are a graphic screen (which may include a non-PostScript printer. */
+	bool postScript;
+		/* A boolean for whether we are a PostScript device. */
+	bool printer;
+		/* A boolean for whether we are a printer. */
+	bool metafile;
+		/* A boolean for whether we are a high-resolution metafile or clipboard. */
+	bool yIsZeroAtTheTop;
+		/* A boolean for whether vertical cooordinates increase from top to bottom (as on most screens, but not PostScript). */
+	GuiDrawingArea d_drawingArea;
+		/* Also used as a boolean. */
+	int resolution;
+		/* Dots per inch. */
+	enum kGraphics_resolution resolutionNumber;
+	long d_x1DCmin, d_x2DCmax, d_y1DCmin, d_y2DCmax;
+		/* Maximum dimensions of the output device. */
+		/* x1DCmin < x2DCmax; y1DCmin < y2DCmax; */
+		/* The point (x1DCmin, y1DCmin) can be either in the top left */
+		/* or in the bottom left, depending on the yIsZeroAtTheTop flag. */
+		/* Device variables. */
+	long d_x1DC, d_x2DC, d_y1DC, d_y2DC;
+		/* Current dimensions of the output device, or: */
+		/* device coordinates of the viewport rectangle. */
+		/* x1DCmin <= x1DC < x2DC <= x2DCmax; */
+		/* y1DCmin <= y1DC < y2DC <= y2DCmax; */
+		/* Graphics_create_xxxxxx sets these coordinates to */
+		/* x1DCmin, x2DCmax, y1DCmin, and y2DCmax. */
+		/* They can be changed by Graphics_setWsViewport. */
+	double d_x1wNDC, d_x2wNDC, d_y1wNDC, d_y2wNDC;
+		/* Normalized device coordinates of */
+		/* the device viewport rectangle. */
+		/* The point (x1wNDC, y1wNDC) is always in the bottom left.	*/
+		/* Graphics_create_xxxxxx sets these coordinates to */
+		/* 0.0, 1.0, 0.0, and 1.0. */
+		/* They can be changed by Graphics_setWsWindow. */
+	double d_x1NDC, d_x2NDC, d_y1NDC, d_y2NDC;
+		/* Normalized device coordinates of the user output viewport, */
+		/* which is a part of the device viewport rectangle. */
+		/* x1wNDC <= x1NDC < x2NDC <= x2wNDC; */
+		/* y1wNDC <= y1NDC < y2NDC <= y2wNDC; */
+		/* Graphics_create_xxxxxx sets these coordinates to */
+		/* 0.0, 1.0, 0.0, and 1.0. */
+		/* They can be changed by Graphics_setViewport. */
+	double d_x1WC, d_x2WC, d_y1WC, d_y2WC;
+		/* World coordinates of the user output viewport rectangle.	*/
+		/* They bear a relation to the "real" world, */
+		/* and are used in the drawing routines. */
+		/* Graphics_create_xxxxxx sets these coordinates to */
+		/* 0.0, 1.0, 0.0, and 1.0. */
+		/* They can be changed by Graphics_setWindow. */
+	double deltaX, deltaY, scaleX, scaleY;
+		/* Current coordinate transformation. */
+	/* Graphics state. */
+	int lineType;
+	Graphics_Colour colour;
+	double lineWidth, arrowSize, speckleSize;
+	enum kGraphics_colourScale colourScale;
+	int horizontalTextAlignment, verticalTextAlignment;
+	double textRotation, wrapWidth, secondIndent, textX, textY;
+	enum kGraphics_font font;
+	int fontSize, fontStyle;
+	int percentSignIsItalic, numberSignIsBold, circumflexIsSuperscript, underscoreIsSubscript;
+	int dollarSignIsCode, atSignIsLink;
+	bool recording, duringXor;
+	long irecord, nrecord;
+	double *record;
+	Graphics_Viewport outerViewport;   // for Graphics_(un)setInner ()
+	double horTick, vertTick;   // for Graphics_mark(s)XXX ()
+	double paperWidth, paperHeight;
+
+	void v_destroy ()
+		override;
+
+	virtual void v_polyline (long numberOfPoints, double *xyDC, bool close) { (void) numberOfPoints; (void) xyDC; (void) close; }
+	virtual void v_fillArea (long numberOfPoints, double *xyDC) { (void) numberOfPoints; (void) xyDC; }
+	virtual void v_rectangle (double x1DC, double x2DC, double y1DC, double y2DC) { (void) x1DC; (void) x2DC; (void) y1DC; (void) y2DC; }
+	virtual void v_fillRectangle (double a_x1DC, double a_x2DC, double a_y1DC, double a_y2DC) { (void) a_x1DC; (void) a_x2DC; (void) a_y1DC; (void) a_y2DC; }
+	virtual void v_circle (double xDC, double yDC, double rDC) { (void) xDC; (void) yDC; (void) rDC; }
+	virtual void v_ellipse (double a_x1DC, double a_x2DC, double a_y1DC, double a_y2DC) { (void) a_x1DC; (void) a_x2DC; (void) a_y1DC; (void) a_y2DC; }
+	virtual void v_arc (double xDC, double yDC, double rDC, double fromAngle, double toAngle) { (void) xDC; (void) yDC; (void) rDC; (void) fromAngle; (void) toAngle; }
+	virtual void v_fillCircle (double xDC, double yDC, double rDC) { (void) xDC; (void) yDC; (void) rDC; }
+	virtual void v_fillEllipse (double a_x1DC, double a_x2DC, double a_y1DC, double a_y2DC) { (void) a_x1DC; (void) a_x2DC; (void) a_y1DC; (void) a_y2DC; }
+	virtual void v_button (double a_x1DC, double a_x2DC, double a_y1DC, double a_y2DC)
+		{
+			v_rectangle (a_x1DC, a_x2DC, a_y1DC, a_y2DC);   // the simplest implementation
+		}
+	virtual void v_roundedRectangle (double x1DC, double x2DC, double y1DC, double y2DC, double r);
+	virtual void v_fillRoundedRectangle (double x1DC, double x2DC, double y1DC, double y2DC, double r);
+	virtual void v_arrowHead (double xDC, double yDC, double angle);
+	virtual bool v_mouseStillDown () { return false; }
+	virtual void v_getMouseLocation (double *xWC, double *yWC) { *xWC = *yWC = NUMundefined; }
+	virtual void v_flushWs () { }
+	virtual void v_clearWs () { }
+	virtual void v_updateWs () { }
 };
 
 Graphics Graphics_create (int resolution);
@@ -176,20 +174,24 @@ void Graphics_setWindow (Graphics me, double x1, double x2, double y1, double y2
 
 void Graphics_polyline (Graphics me, long numberOfPoints, double *x, double *y);
 void Graphics_polyline_closed (Graphics me, long numberOfPoints, double *x, double *y);
-void Graphics_text (Graphics me, double x, double y, const wchar_t *text);
-void Graphics_text1 (Graphics me, double x, double y, const wchar_t *s1);
-void Graphics_text2 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2);
-void Graphics_text3 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-void Graphics_text4 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-void Graphics_text5 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5);
-void Graphics_text6 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void Graphics_text7 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-void Graphics_text8 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-void Graphics_text9 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
-void Graphics_textRect (Graphics me, double x1, double x2, double y1, double y2, const wchar_t *text);
-double Graphics_textWidth (Graphics me, const wchar_t *text);
-double Graphics_textWidth_ps (Graphics me, const wchar_t *text, bool useSilipaPS);
-double Graphics_textWidth_ps_mm (Graphics me, const wchar_t *text, bool useSilipaPS);
+void Graphics_text (Graphics me, double x, double y, Melder_1_ARG);
+void Graphics_text (Graphics me, double x, double y, Melder_2_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_3_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_4_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_5_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_6_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_7_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_8_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_9_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_10_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_11_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_12_OR_13_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_14_OR_15_ARGS);
+void Graphics_text (Graphics me, double x, double y, Melder_16_TO_19_ARGS);
+void Graphics_textRect (Graphics me, double x1, double x2, double y1, double y2, const char32 *text /* cattable */);
+double Graphics_textWidth       (Graphics me, const char32 *text /* cattable */);
+double Graphics_textWidth_ps    (Graphics me, const char32 *text /* cattable */, bool useSilipaPS);
+double Graphics_textWidth_ps_mm (Graphics me, const char32 *text /* cattable */, bool useSilipaPS);
 void Graphics_fillArea (Graphics me, long numberOfPoints, double *x, double *y);
 void Graphics_cellArray (Graphics me, double **z, long ix1, long ix2, double x1, double x2,
 	long iy1, long iy2, double y1, double y2, double minimum, double maximum);
@@ -203,15 +205,14 @@ void Graphics_image_colour (Graphics me, double_rgbt **z, long ix1, long ix2, do
 	long iy1, long iy2, double y1, double y2, double minimum, double maximum);
 void Graphics_image8 (Graphics me, unsigned char **z, long ix1, long ix2, double x1, double x2,
 	long iy1, long iy2, double y1, double y2, unsigned char minimum, unsigned char maximum);
-void Graphics_imageFromFile (Graphics me, const wchar_t *relativeFileName, double x1, double x2, double y1, double y2);
+void Graphics_imageFromFile (Graphics me, const char32 *relativeFileName, double x1, double x2, double y1, double y2);
 void Graphics_line (Graphics me, double x1, double y1, double x2, double y2);
 void Graphics_rectangle (Graphics me, double x1, double x2, double y1, double y2);
 void Graphics_fillRectangle (Graphics me, double x1, double x2, double y1, double y2);
 void Graphics_roundedRectangle (Graphics me, double x1, double x2, double y1, double y2, double r_mm);
 void Graphics_fillRoundedRectangle (Graphics me, double x1, double x2, double y1, double y2, double r_mm);
-void Graphics_function (Graphics me, double y [], long ix1, long ix2, double x1, double x2);   /* y [ix1..ix2] */
-void Graphics_function16 (Graphics me, int16_t y [], int stagger, long ix1, long ix2, double x1, double x2);
-	/* y [ix1..ix2] or y [ix1*2..ix2*2] */
+void Graphics_function (Graphics me, double y [], long ix1, long ix2, double x1, double x2);   // y [ix1..ix2]
+void Graphics_function16 (Graphics me, int16_t y [], int stagger, long ix1, long ix2, double x1, double x2);   // y [ix1..ix2] or y [ix1*2..ix2*2]
 void Graphics_circle (Graphics me, double x, double y, double r);
 void Graphics_fillCircle (Graphics me, double x, double y, double r);
 void Graphics_circle_mm (Graphics me, double x, double y, double d);
@@ -226,14 +227,14 @@ void Graphics_fillEllipse (Graphics me, double x1, double x2, double y1, double
 void Graphics_arrow (Graphics me, double x1, double y1, double x2, double y2);
 void Graphics_doubleArrow (Graphics me, double x1, double y1, double x2, double y2);
 void Graphics_arcArrow (Graphics me, double x, double y, double r, double fromAngle, double toAngle, int arrowAtStart, int arrowAtEnd);
-void Graphics_mark (Graphics me, double x, double y, double size_mm, const wchar_t *markString);
+void Graphics_mark (Graphics me, double x, double y, double size_mm, const char32 *markString /* cattable */);
 void Graphics_button (Graphics me, double x1, double x2, double y1, double y2);
 void Graphics_innerRectangle (Graphics me, double x1, double x2, double y1, double y2);
 
 extern Graphics_Colour Graphics_BLACK, Graphics_WHITE, Graphics_RED, Graphics_GREEN, Graphics_BLUE,
 	Graphics_CYAN, Graphics_MAGENTA, Graphics_YELLOW, Graphics_MAROON, Graphics_LIME, Graphics_NAVY, Graphics_TEAL,
 	Graphics_PURPLE, Graphics_OLIVE, Graphics_PINK, Graphics_SILVER, Graphics_GREY, Graphics_WINDOW_BACKGROUND_COLOUR;
-const wchar_t * Graphics_Colour_name (Graphics_Colour colour);
+const char32 * Graphics_Colour_name (Graphics_Colour colour);
 static inline bool Graphics_Colour_equal (Graphics_Colour colour1, Graphics_Colour colour2) {
 	return colour1. red == colour2. red && colour1. green == colour2. green && colour1. blue == colour2. blue;
 }
@@ -278,7 +279,7 @@ void Graphics_setWrapWidth (Graphics me, double wrapWidth);
 void Graphics_setSecondIndent (Graphics me, double indent);
 double Graphics_inqTextX (Graphics me);
 double Graphics_inqTextY (Graphics me);
-typedef struct { double x1, x2, y1, y2; wchar_t *name; } Graphics_Link;
+typedef struct { double x1, x2, y1, y2; char32 *name; } Graphics_Link;
 int Graphics_getLinks (Graphics_Link **plinks);
 void Graphics_setNumberSignIsBold (Graphics me, bool isBold);
 void Graphics_setPercentSignIsItalic (Graphics me, bool isItalic);
@@ -324,30 +325,30 @@ void Graphics_surface (Graphics me, double **z, long ix1, long ix2, double x1, d
 void Graphics_setInner (Graphics me);
 void Graphics_unsetInner (Graphics me);
 void Graphics_drawInnerBox (Graphics me);
-void Graphics_textLeft (Graphics me, bool far, const wchar_t *text);
-void Graphics_textRight (Graphics me, bool far, const wchar_t *text);
-void Graphics_textBottom (Graphics me, bool far, const wchar_t *text);
-void Graphics_textTop (Graphics me, bool far, const wchar_t *text);
-void Graphics_marksLeft (Graphics me, int numberOfMarks, bool haveNumbers, bool haveTicks, bool haveDottedLines);
-void Graphics_marksRight (Graphics me, int numberOfMarks, bool haveNumbers, bool haveTicks, bool haveDottedLines);
+void Graphics_textLeft   (Graphics me, bool farr, const char32 *text /* cattable */);
+void Graphics_textRight  (Graphics me, bool farr, const char32 *text /* cattable */);
+void Graphics_textBottom (Graphics me, bool farr, const char32 *text /* cattable */);
+void Graphics_textTop    (Graphics me, bool farr, const char32 *text /* cattable */);
+void Graphics_marksLeft   (Graphics me, int numberOfMarks, bool haveNumbers, bool haveTicks, bool haveDottedLines);
+void Graphics_marksRight  (Graphics me, int numberOfMarks, bool haveNumbers, bool haveTicks, bool haveDottedLines);
 void Graphics_marksBottom (Graphics me, int numberOfMarks, bool haveNumbers, bool haveTicks, bool haveDottedLines);
-void Graphics_marksTop (Graphics me, int numberOfMarks, bool haveNumbers, bool haveTicks, bool haveDottedLines);
-void Graphics_marksLeftLogarithmic (Graphics me, int numberOfMarksPerDecade, bool haveNumbers, bool haveTicks, bool haveDottedLines);
-void Graphics_marksRightLogarithmic (Graphics me, int numberOfMarksPerDecade, bool haveNumbers, bool haveTicks, bool haveDottedLines);
+void Graphics_marksTop    (Graphics me, int numberOfMarks, bool haveNumbers, bool haveTicks, bool haveDottedLines);
+void Graphics_marksLeftLogarithmic   (Graphics me, int numberOfMarksPerDecade, bool haveNumbers, bool haveTicks, bool haveDottedLines);
+void Graphics_marksRightLogarithmic  (Graphics me, int numberOfMarksPerDecade, bool haveNumbers, bool haveTicks, bool haveDottedLines);
 void Graphics_marksBottomLogarithmic (Graphics me, int numberOfMarksPerDecade, bool haveNumbers, bool haveTicks, bool haveDottedLines);
-void Graphics_marksTopLogarithmic (Graphics me, int numberOfMarksPerDecade, bool haveNumbers, bool haveTicks, bool haveDottedLines);
-void Graphics_markLeft (Graphics me, double yWC, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text);
-void Graphics_markRight (Graphics me, double yWC, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text);
-void Graphics_markBottom (Graphics me, double xWC, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text);
-void Graphics_markTop (Graphics me, double xWC, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text);
-void Graphics_markLeftLogarithmic (Graphics me, double y /* > 0 */, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text);
-void Graphics_markRightLogarithmic (Graphics me, double y, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text);
-void Graphics_markBottomLogarithmic (Graphics me, double x, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text);
-void Graphics_markTopLogarithmic (Graphics me, double x, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text);
-void Graphics_marksLeftEvery (Graphics me, double units, double distance, bool haveNumbers, bool haveTicks, bool haveDottedLines);
-void Graphics_marksRightEvery (Graphics me, double units, double distance, bool haveNumbers, bool haveTicks, bool haveDottedLines);
+void Graphics_marksTopLogarithmic    (Graphics me, int numberOfMarksPerDecade, bool haveNumbers, bool haveTicks, bool haveDottedLines);
+void Graphics_markLeft   (Graphics me, double yWC, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */);
+void Graphics_markRight  (Graphics me, double yWC, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */);
+void Graphics_markBottom (Graphics me, double xWC, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */);
+void Graphics_markTop    (Graphics me, double xWC, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */);
+void Graphics_markLeftLogarithmic   (Graphics me, double y, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */);   // y > 0
+void Graphics_markRightLogarithmic  (Graphics me, double y, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */);
+void Graphics_markBottomLogarithmic (Graphics me, double x, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */);
+void Graphics_markTopLogarithmic    (Graphics me, double x, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */);
+void Graphics_marksLeftEvery   (Graphics me, double units, double distance, bool haveNumbers, bool haveTicks, bool haveDottedLines);
+void Graphics_marksRightEvery  (Graphics me, double units, double distance, bool haveNumbers, bool haveTicks, bool haveDottedLines);
 void Graphics_marksBottomEvery (Graphics me, double units, double distance, bool haveNumbers, bool haveTicks, bool haveDottedLines);
-void Graphics_marksTopEvery (Graphics me, double units, double distance, bool haveNumbers, bool haveTicks, bool haveDottedLines);
+void Graphics_marksTopEvery    (Graphics me, double units, double distance, bool haveNumbers, bool haveTicks, bool haveDottedLines);
 
 void *Graphics_x_getCR (Graphics me);
 void Graphics_x_setCR (Graphics me, void *cr);
diff --git a/sys/GraphicsP.h b/sys/GraphicsP.h
index 1a23c06..4555d5e 100644
--- a/sys/GraphicsP.h
+++ b/sys/GraphicsP.h
@@ -2,7 +2,7 @@
 #define _GraphicsP_h_
 /* GraphicsP.h
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,63 +49,78 @@ void Graphics_init (Graphics me, int resolution);
 #define kGraphics_font_JAPANESE  (kGraphics_font_MAX + 6)
 
 Thing_define (GraphicsScreen, Graphics) {
-	// new data:
-	public:
-		bool d_isPng;
-		structMelderFile d_file;
-		#if defined (NO_GRAPHICS)
-		#elif defined (UNIX)
-			GdkDisplay *d_display;
-			#if ALLOW_GDK_DRAWING
-				GdkDrawable *d_window;
-				GdkGC *d_gdkGraphicsContext;
-			#else
-				GdkWindow *d_window;
-			#endif
-			cairo_surface_t *d_cairoSurface;
-			cairo_t *d_cairoGraphicsContext;
-		#elif defined (_WIN32)
-			HWND d_winWindow;
-			HDC d_gdiGraphicsContext;
-			COLORREF d_winForegroundColour;
-			HPEN d_winPen;
-			HBRUSH d_winBrush;
-			bool d_fatNonSolid;
-			bool d_useGdiplus;
-			HBITMAP d_gdiBitmap;
-			Gdiplus::Bitmap *d_gdiplusBitmap;
-		#elif defined (macintosh)
-            #if useCarbon
-                GrafPtr d_macPort;
-            #else
-                NSView *d_macView;
-            #endif
-			int d_macFont, d_macStyle;
-			int d_depth;
-			RGBColor d_macColour;
-			uint8_t *d_bits;
-			CGContextRef d_macGraphicsContext;
+	bool d_isPng;
+	structMelderFile d_file;
+	#if defined (NO_GRAPHICS)
+	#elif defined (UNIX)
+		GdkDisplay *d_display;
+		#if ALLOW_GDK_DRAWING
+			GdkDrawable *d_window;
+			GdkGC *d_gdkGraphicsContext;
+		#else
+			GdkWindow *d_window;
 		#endif
-	// overridden methods:
-	protected:
-		virtual void v_destroy ();
-		virtual void v_polyline (long numberOfPoints, double *xyDC, bool close);
-		virtual void v_fillArea (long numberOfPoints, double *xyDC);
-		virtual void v_rectangle (double x1DC, double x2DC, double y1DC, double y2DC);
-		virtual void v_fillRectangle (double x1DC, double x2DC, double y1DC, double y2DC);
-		virtual void v_circle (double xDC, double yDC, double rDC);
-		virtual void v_ellipse (double x1DC, double x2DC, double y1DC, double y2DC);
-		virtual void v_arc (double xDC, double yDC, double rDC, double fromAngle, double toAngle);
-		virtual void v_fillCircle (double xDC, double yDC, double rDC);
-		virtual void v_fillEllipse (double x1DC, double x2DC, double y1DC, double y2DC);
-		virtual void v_button (double x1DC, double x2DC, double y1DC, double y2DC);
-		virtual void v_roundedRectangle (double x1DC, double x2DC, double y1DC, double y2DC, double r);
-		virtual void v_arrowHead (double xDC, double yDC, double angle);
-		virtual bool v_mouseStillDown ();
-		virtual void v_getMouseLocation (double *xWC, double *yWC);
-		virtual void v_flushWs ();
-		virtual void v_clearWs ();
-		virtual void v_updateWs ();
+		cairo_surface_t *d_cairoSurface;
+		cairo_t *d_cairoGraphicsContext;
+	#elif defined (_WIN32)
+		HWND d_winWindow;
+		HDC d_gdiGraphicsContext;
+		COLORREF d_winForegroundColour;
+		HPEN d_winPen;
+		HBRUSH d_winBrush;
+		bool d_fatNonSolid;
+		bool d_useGdiplus;
+		HBITMAP d_gdiBitmap;
+		Gdiplus::Bitmap *d_gdiplusBitmap;
+	#elif defined (macintosh)
+		#if useCarbon
+			GrafPtr d_macPort;
+		#else
+			NSView *d_macView;
+		#endif
+		int d_macFont, d_macStyle;
+		int d_depth;
+		RGBColor d_macColour;
+		uint8_t *d_bits;
+		CGContextRef d_macGraphicsContext;
+	#endif
+
+	void v_destroy ()
+		override;
+	void v_polyline (long numberOfPoints, double *xyDC, bool close)
+		override;
+	void v_fillArea (long numberOfPoints, double *xyDC)
+		override;
+	void v_rectangle (double x1DC, double x2DC, double y1DC, double y2DC)
+		override;
+	void v_fillRectangle (double x1DC, double x2DC, double y1DC, double y2DC)
+		override;
+	void v_circle (double xDC, double yDC, double rDC)
+		override;
+	void v_ellipse (double x1DC, double x2DC, double y1DC, double y2DC)
+		override;
+	void v_arc (double xDC, double yDC, double rDC, double fromAngle, double toAngle)
+		override;
+	void v_fillCircle (double xDC, double yDC, double rDC)
+		override;
+	void v_fillEllipse (double x1DC, double x2DC, double y1DC, double y2DC)
+		override;
+	void v_button (double x1DC, double x2DC, double y1DC, double y2DC)
+		override;
+	void v_roundedRectangle (double x1DC, double x2DC, double y1DC, double y2DC, double r)
+		override;
+	void v_arrowHead (double xDC, double yDC, double angle)
+		override;
+	bool v_mouseStillDown ()
+		override;
+	void v_getMouseLocation (double *xWC, double *yWC)
+		override;
+	void v_flushWs ()
+		override;
+	void v_clearWs ()
+		override;
+	void v_updateWs ()
+		override;
 };
 
 #if defined (NO_GRAPHICS)
@@ -127,28 +142,39 @@ Thing_define (GraphicsScreen, Graphics) {
 #endif
 
 Thing_define (GraphicsPostscript, Graphics) {
-	// new data:
-	public:
-		FILE *d_file;
-		int (*d_printf) (void *stream, const char *format, ...);
-		int languageLevel;
-		int photocopyable, spotsDensity, spotsAngle, landscape, includeFonts, loadedXipa, useSilipaPS;
-		double magnification;
-		char *fontInfos [1 + kGraphics_font_DINGBATS] [1 + Graphics_BOLD_ITALIC];
-		const char *lastFid;
-		int job, eps, pageNumber, lastSize;
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_polyline (long numberOfPoints, double *xyDC, bool close);
-		virtual void v_fillArea (long numberOfPoints, double *xyDC);
-		virtual void v_rectangle (double x1DC, double x2DC, double y1DC, double y2DC);
-		virtual void v_fillRectangle (double x1DC, double x2DC, double y1DC, double y2DC);
-		virtual void v_circle (double xDC, double yDC, double rDC);
-		virtual void v_ellipse (double x1DC, double x2DC, double y1DC, double y2DC);
-		virtual void v_arc (double xDC, double yDC, double rDC, double fromAngle, double toAngle);
-		virtual void v_fillCircle (double xDC, double yDC, double rDC);
-		virtual void v_fillEllipse (double x1DC, double x2DC, double y1DC, double y2DC);
-		virtual void v_arrowHead (double xDC, double yDC, double angle);
+	FILE *d_file;
+	int (*d_printf) (void *stream, const char *format, ...);
+	int languageLevel;
+	int photocopyable, spotsDensity, spotsAngle;
+	bool loadedXipa, useSilipaPS, landscape, includeFonts;
+	double magnification;
+	char *fontInfos [1 + kGraphics_font_DINGBATS] [1 + Graphics_BOLD_ITALIC];
+	const char *lastFid;
+	int pageNumber, lastSize;
+	bool job, eps;
+
+	void v_destroy ()
+		override;
+	void v_polyline (long numberOfPoints, double *xyDC, bool close)
+		override;
+	void v_fillArea (long numberOfPoints, double *xyDC)
+		override;
+	void v_rectangle (double x1DC, double x2DC, double y1DC, double y2DC)
+		override;
+	void v_fillRectangle (double x1DC, double x2DC, double y1DC, double y2DC)
+		override;
+	void v_circle (double xDC, double yDC, double rDC)
+		override;
+	void v_ellipse (double x1DC, double x2DC, double y1DC, double y2DC)
+		override;
+	void v_arc (double xDC, double yDC, double rDC, double fromAngle, double toAngle)
+		override;
+	void v_fillCircle (double xDC, double yDC, double rDC)
+		override;
+	void v_fillEllipse (double x1DC, double x2DC, double y1DC, double y2DC)
+		override;
+	void v_arrowHead (double xDC, double yDC, double angle)
+		override;
 };
 
 /* Opcodes for recording. */
@@ -186,7 +212,7 @@ void _Graphics_fillRectangle (Graphics me, long x1DC, long x2DC, long y1DC, long
 void _Graphics_setColour (Graphics me, Graphics_Colour colour);
 void _Graphics_setGrey (Graphics me, double grey);
 void _Graphics_colour_init (Graphics me);
-bool _GraphicsMac_tryToInitializeFonts (void);
+bool _GraphicsMac_tryToInitializeFonts ();
 
 #ifdef macintosh
 	void GraphicsQuartz_initDraw (GraphicsScreen me);
diff --git a/sys/GraphicsPostscript.cpp b/sys/GraphicsPostscript.cpp
index b07bdc0..aa796b4 100644
--- a/sys/GraphicsPostscript.cpp
+++ b/sys/GraphicsPostscript.cpp
@@ -1,6 +1,6 @@
 /* GraphicsPostscript.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -91,7 +91,7 @@ static void initPage (GraphicsPostscript me) {
 	}
 	my d_printf (my d_file, "%.6g dup scale\n", 72.0 * my magnification / my resolution);
 	if (my job) my d_printf (my d_file, "%%%%EndPageSetup\n");
-	my lastFid = NULL;
+	my lastFid = nullptr;
 }
 
 static void exitPage (GraphicsPostscript me) {
@@ -112,18 +112,18 @@ static void exitPage (GraphicsPostscript me) {
 	for (font = 0; font <= kGraphics_font_DINGBATS; font ++)
 		for (style = 0; style <= Graphics_BOLD_ITALIC; style ++)
 			Melder_free (my fontInfos [font] [style]);
-	my loadedXipa = FALSE;   /* BUG. Include this because of the unpredictable page order with DSC? */
+	my loadedXipa = false;   // FIXME: include this because of the unpredictable page order with DSC?
 }
 
 void structGraphicsPostscript :: v_destroy () {
 	exitPage (this);
-	if (d_file) {
-		if (job) {
-			d_printf (d_file, "%%%%Trailer\n");
-			d_printf (d_file, "%%%%Pages: %d\n", pageNumber);
+	if (our d_file) {
+		if (our job) {
+			our d_printf (our d_file, "%%%%Trailer\n");
+			our d_printf (our d_file, "%%%%Pages: %d\n", our pageNumber);
 		}
-		d_printf (d_file, "%%%%EOF\n");   // BUG. Correct according to DSC. But not good in EPS files?
-		fclose (d_file);
+		our d_printf (our d_file, "%%%%EOF\n");   // BUG. Correct according to DSC. But not good in EPS files?
+		fclose (our d_file);
 	}
 	GraphicsPostscript_Parent :: v_destroy ();
 }
@@ -134,7 +134,7 @@ Graphics Graphics_create_postscriptjob (MelderFile file, int resolution, enum kG
 	autoGraphicsPostscript me = Thing_new (GraphicsPostscript);
 	time_t today;
 	my postScript = true, my yIsZeroAtTheTop = false, my languageLevel = 2;
-	my job = TRUE, my eps = FALSE, my printer = FALSE;
+	my job = true, my eps = false, my printer = false;
 	my d_printf = (int (*)(void *, const char*, ...)) fprintf;
 	Graphics_init (me.peek(), resolution);   // virtual resolution; may differ from that of the printer; OK if always 600 dpi
 	my photocopyable = spots == kGraphicsPostscript_spots_PHOTOCOPYABLE;
@@ -145,7 +145,7 @@ Graphics Graphics_create_postscriptjob (MelderFile file, int resolution, enum kG
 	else my paperWidth = 595 / 72.0, my paperHeight = 842 / 72.0;
 	my landscape = rotation == kGraphicsPostscript_orientation_LANDSCAPE;
 	my magnification = magnification;
-	my includeFonts = TRUE;
+	my includeFonts = true;
 	my d_file = Melder_fopen (file, "w");
 	/*
 	 * The Device Coordinates are the PostScript user coordinates.
@@ -166,9 +166,9 @@ Graphics Graphics_create_postscriptjob (MelderFile file, int resolution, enum kG
 	 */
 	my d_printf (my d_file, "%%!PS-Adobe-3.0\n");
 	my d_printf (my d_file, "%%%%Creator: Praat Shell 4.2\n");
-	my d_printf (my d_file, "%%%%Title: %s\n", Melder_peekWcsToUtf8 (MelderFile_name (file)));
-	today = time (NULL);
-	my d_printf (my d_file, "%%%%CreationDate: %s", ctime (& today));   /* Contains newline symbol. */
+	my d_printf (my d_file, "%%%%Title: %s\n", Melder_peek32to8 (MelderFile_name (file)));
+	today = time (nullptr);
+	my d_printf (my d_file, "%%%%CreationDate: %s", ctime (& today));   // contains newline symbol
 	my d_printf (my d_file, "%%%%PageOrder: Special\n");
 	my d_printf (my d_file, "%%%%Pages: (atend)\n");
 	my d_printf (my d_file, "%%%%EndComments\n");
@@ -209,15 +209,15 @@ Graphics Graphics_create_epsfile (MelderFile file, int resolution, enum kGraphic
 	if (my photocopyable) { my spotsDensity = 85; my spotsAngle = 35; }
 	else { my spotsDensity = 106; my spotsAngle = 46; }
 	my paperWidth = 7.5, my paperHeight = 11.0;
-	my landscape = FALSE;
+	my landscape = false;
 	my magnification = 1.0;
 	my includeFonts = includeFonts;
 	my useSilipaPS = useSilipaPS;
 	my d_file = Melder_fopen (file, "w");
 	my d_x1DC = my d_x1DCmin = 0;
-	my d_x2DC = my d_x2DCmax = my paperWidth * resolution; /* 600 dpi -> 4500 virtual dots */
+	my d_x2DC = my d_x2DCmax = my paperWidth * resolution;   // 600 dpi -> 4500 virtual dots
 	my d_y1DC = my d_y1DCmin = 0;
-	my d_y2DC = my d_y2DCmax = my paperHeight * resolution; /* 600 dpi -> 6600 virtual dots */
+	my d_y2DC = my d_y2DCmax = my paperHeight * resolution;   // 600 dpi -> 6600 virtual dots
 	Graphics_setWsWindow ((Graphics) me.peek(), 0, my paperWidth, 12.0 - my paperHeight, 12.0);   // force scaling
 	/*
 	 * We will honour version 3.0 of the DSC for Encapsulated PostScript files,
@@ -235,7 +235,7 @@ Graphics Graphics_create_epsfile (MelderFile file, int resolution, enum kGraphic
 	 * This leaves us room to show a warning that should keep users from thinking anything is wrong.
 	 */
 	my d_printf (my d_file, "%%%%Title: NO SCREEN PREVIEW, BUT WILL PRINT CORRECTLY\n");
-	today = time (NULL);
+	today = time (nullptr);
 	my d_printf (my d_file, "%%%%CreationDate: %s", ctime (& today));   /* Contains newline symbol. */
 	my d_printf (my d_file, "%%%%EndComments\n");
 	downloadPrologAndSetUp (me.peek());
@@ -244,10 +244,10 @@ Graphics Graphics_create_epsfile (MelderFile file, int resolution, enum kGraphic
 }
 
 #ifndef UNIX
-Graphics Graphics_create_postscriptprinter (void) {
+Graphics Graphics_create_postscriptprinter () {
 	GraphicsPostscript me = Thing_new (GraphicsPostscript);
-	my postScript = TRUE, my languageLevel = 2;
-	my job = FALSE, my eps = FALSE, my printer = TRUE;
+	my postScript = true, my languageLevel = 2;
+	my job = false, my eps = false, my printer = true;
 	my d_printf = Printer_postScript_printf;
 	Graphics_init (me, thePrinter. resolution);   // virtual resolution
 	my photocopyable = thePrinter. spots == kGraphicsPostscript_spots_PHOTOCOPYABLE;
@@ -257,7 +257,7 @@ Graphics Graphics_create_postscriptprinter (void) {
 	my paperHeight = (double) thePrinter. paperHeight / my resolution;
 	my landscape = thePrinter. orientation == kGraphicsPostscript_orientation_LANDSCAPE;
 	my magnification = thePrinter. magnification;
-	my includeFonts = TRUE;
+	my includeFonts = true;
 	my d_x1DC = my d_x1DCmin = my resolution / 2;
 	my d_x2DC = my d_x2DCmax = (my paperWidth - 0.5) * my resolution;
 	my d_y1DC = my d_y1DCmin = my resolution / 2;
diff --git a/sys/GraphicsScreen.cpp b/sys/GraphicsScreen.cpp
index 65609c5..2b97c84 100644
--- a/sys/GraphicsScreen.cpp
+++ b/sys/GraphicsScreen.cpp
@@ -1,6 +1,6 @@
 /* GraphicsScreen.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -41,16 +41,16 @@
 	#include <gdiplus.h>
 	//#include "winport_off.h"
 	//using namespace Gdiplus;
-	static bool _GraphicsWindows_tryToInitializeGdiPlus (void) {
+	static bool _GraphicsWindows_tryToInitializeGdiPlus () {
 		Gdiplus::GdiplusStartupInput gdiplusStartupInput;
 		ULONG_PTR gdiplusToken;
-		GdiplusStartup (& gdiplusToken, & gdiplusStartupInput, NULL);
+		GdiplusStartup (& gdiplusToken, & gdiplusStartupInput, nullptr);
 		return true;
 	}
 #elif mac
 	#include "macport_on.h"
 	static RGBColor theBlackColour = { 0, 0, 0 };
-	static bool _GraphicsMacintosh_tryToInitializeQuartz (void) {
+	static bool _GraphicsMacintosh_tryToInitializeQuartz () {
 		return _GraphicsMac_tryToInitializeFonts ();
 	}
 #endif
@@ -60,20 +60,20 @@ Thing_implement (GraphicsScreen, Graphics, 0);
 void structGraphicsScreen :: v_destroy () {
 	#if cairo
 		#if ALLOW_GDK_DRAWING
-			if (d_gdkGraphicsContext != NULL) {
+			if (d_gdkGraphicsContext) {
 				g_object_unref (d_gdkGraphicsContext);			
-				d_gdkGraphicsContext = NULL;
+				d_gdkGraphicsContext = nullptr;
 			}
 		#endif
-		if (d_cairoGraphicsContext != NULL) {
+		if (d_cairoGraphicsContext) {
 			cairo_destroy (d_cairoGraphicsContext);
-			d_cairoGraphicsContext = NULL;
+			d_cairoGraphicsContext = nullptr;
 		}
-		if (d_cairoSurface != NULL) {
+		if (d_cairoSurface) {
 			cairo_surface_flush (d_cairoSurface);
 			if (d_isPng) {
 				#if 1
-					cairo_surface_write_to_png (d_cairoSurface, Melder_peekWcsToUtf8 (d_file. path));
+					cairo_surface_write_to_png (d_cairoSurface, Melder_peek32to8 (d_file. path));
 				#else
 					unsigned char *bitmap = cairo_image_surface_get_data (my d_cairoSurface);   // peeking into the internal bits
 					// copy bitmap to PNG structure created with the PNG library
@@ -83,31 +83,31 @@ void structGraphicsScreen :: v_destroy () {
 			cairo_surface_destroy (d_cairoSurface);
 		}
 	#elif win
-		if (d_gdiGraphicsContext != NULL) {
+		if (d_gdiGraphicsContext) {
 			SelectPen (d_gdiGraphicsContext, GetStockPen (BLACK_PEN));
 			SelectBrush (d_gdiGraphicsContext, GetStockBrush (NULL_BRUSH));
 		}
-		if (d_winPen != NULL) {
+		if (d_winPen) {
 			DeleteObject (d_winPen);
-			d_winPen = NULL;
+			d_winPen = nullptr;
 		}
-		if (d_winBrush != NULL) {
+		if (d_winBrush) {
 			DeleteObject (d_winBrush);
-			d_winBrush = NULL;
+			d_winBrush = nullptr;
 		}
 		if (d_isPng && d_gdiBitmap) {
-			trace ("saving the filled bitmap to a PNG file");
+			trace (U"saving the filled bitmap to a PNG file");
 			/*
 			 * Deselect the bitmap from the device context (otherwise GetDIBits won't work).
 			 */
-			//SelectBitmap (d_gdiGraphicsContext, NULL);
-			//SelectBitmap (d_gdiGraphicsContext, CreateCompatibleBitmap (NULL, 1, 1));
+			//SelectBitmap (d_gdiGraphicsContext, nullptr);
+			//SelectBitmap (d_gdiGraphicsContext, CreateCompatibleBitmap (nullptr, 1, 1));
 
 			BITMAP bitmap;
 			GetObject (d_gdiBitmap, sizeof (BITMAP), & bitmap);
 			int width = bitmap. bmWidth, height = bitmap. bmHeight;
 			//int width = 3600, height = 3600;
-			trace ("width %d, height %d", width, height);
+			trace (U"width ", width, U", height ", height);
 
 			/*
 			 * Get the bits from the HBITMAP;
@@ -127,16 +127,16 @@ void structGraphicsScreen :: v_destroy () {
 			unsigned char *bits = Melder_calloc (unsigned char, 4 * width * height);
 			//HANDLE handle = GlobalAlloc (GHND, 4 * width * height);
 			//unsigned char *bits = (unsigned char *) GlobalLock (handle);
-			int numberOfLinesScanned = GetDIBits (GetDC (NULL), d_gdiBitmap, 0, height, bits, (BITMAPINFO *) & bitmapInfo, DIB_RGB_COLORS);
-			trace ("%d lines scanned", numberOfLinesScanned);
+			int numberOfLinesScanned = GetDIBits (GetDC (nullptr), d_gdiBitmap, 0, height, bits, (BITMAPINFO *) & bitmapInfo, DIB_RGB_COLORS);
+			trace (numberOfLinesScanned, U" lines scanned");
 
-			trace ("creating a savable bitmap");
+			trace (U"creating a savable bitmap");
 
 			//Gdiplus::Bitmap gdiplusBitmap (width, height, PixelFormat32bppARGB);
 			Gdiplus::Bitmap gdiplusBitmap ((BITMAPINFO *) & bitmapInfo, bits);
 			gdiplusBitmap. SetResolution (resolution, resolution);
 
-			trace ("copying the device-independent bits to the savable bitmap.");
+			trace (U"copying the device-independent bits to the savable bitmap.");
 
 			/*
 			for (long irow = 1; irow <= height; irow ++) {
@@ -148,19 +148,19 @@ void structGraphicsScreen :: v_destroy () {
 			}
 			*/
 
-			trace ("saving");
+			trace (U"saving");
 
 			UINT numberOfImageEncoders, sizeOfImageEncoderArray;
 			Gdiplus::GetImageEncodersSize (& numberOfImageEncoders, & sizeOfImageEncoderArray);
 			Gdiplus::ImageCodecInfo *imageEncoderInfos = Melder_malloc (Gdiplus::ImageCodecInfo, sizeOfImageEncoderArray);
 			Gdiplus::GetImageEncoders (numberOfImageEncoders, sizeOfImageEncoderArray, imageEncoderInfos);
 			for (int iencoder = 0; iencoder < numberOfImageEncoders; iencoder ++) {
-				if (Melder_wcsequ (imageEncoderInfos [iencoder]. MimeType, L"image/png")) {
-					gdiplusBitmap. Save (d_file. path, & imageEncoderInfos [iencoder]. Clsid, NULL);
+				if (! wcscmp (imageEncoderInfos [iencoder]. MimeType, L"image/png")) {
+					gdiplusBitmap. Save (Melder_peek32toW (our d_file. path), & imageEncoderInfos [iencoder]. Clsid, nullptr);
 				}
 			}
 
-			trace ("cleaning up");
+			trace (U"cleaning up");
 
 			Melder_free (imageEncoderInfos);
 			//bits -= 4 * width * height;
@@ -175,15 +175,15 @@ void structGraphicsScreen :: v_destroy () {
 		 * No ReleaseDC here, because we have not created it ourselves,
 		 * not even with GetDC. Is this a BUG?
 		 */
-		d_gdiGraphicsContext = NULL;
+		d_gdiGraphicsContext = nullptr;
 	#elif mac
         #if useCarbon
-            if (d_macPort == NULL && ! d_isPng) {
+            if (! d_macPort && ! d_isPng) {
                 CGContextEndPage (d_macGraphicsContext);
                 CGContextRelease (d_macGraphicsContext);
             }
         #else
-            if (d_macView == NULL && ! d_isPng) {
+            if (! d_macView && ! d_isPng) {
                 CGContextEndPage (d_macGraphicsContext);
                 CGContextRelease (d_macGraphicsContext);
             }
@@ -193,7 +193,7 @@ void structGraphicsScreen :: v_destroy () {
 			 * Turn the offscreen bitmap into an image.
 			 */
 			CGImageRef image = CGBitmapContextCreateImage (d_macGraphicsContext);
-			Melder_assert (image != NULL);
+			Melder_assert (image);
 			//CGContextRelease (d_macGraphicsContext);
 			/*
 			 * Create a dictionary with resolution properties.
@@ -202,35 +202,36 @@ void structGraphicsScreen :: v_destroy () {
 			keys [0] = kCGImagePropertyDPIWidth;
 			keys [1] = kCGImagePropertyDPIHeight;
 			float resolution_float = resolution;
-			values [1] = values [0] = CFNumberCreate (NULL, kCFNumberFloatType, & resolution_float);
-			CFDictionaryRef properties = CFDictionaryCreate (NULL,
+			values [1] = values [0] = CFNumberCreate (nullptr, kCFNumberFloatType, & resolution_float);
+			CFDictionaryRef properties = CFDictionaryCreate (nullptr,
 				(const void **) keys, (const void **) values, 2,
 				& kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);
-			Melder_assert (properties != NULL);
+			Melder_assert (properties);
 			/*
 			 */
-			CFURLRef url = CFURLCreateWithFileSystemPath (NULL,
-				(CFStringRef) Melder_peekWcsToCfstring (d_file. path), kCFURLPOSIXPathStyle, false);
-			CGImageDestinationRef imageDestination = CGImageDestinationCreateWithURL (url, kUTTypePNG, 1, NULL);
-			Melder_assert (imageDestination != NULL);
-			CGImageDestinationAddImage (imageDestination, image, properties);
+			CFURLRef url = CFURLCreateWithFileSystemPath (nullptr,
+				(CFStringRef) Melder_peek32toCfstring (d_file. path), kCFURLPOSIXPathStyle, false);
+			CGImageDestinationRef imageDestination = CGImageDestinationCreateWithURL (url, kUTTypePNG, 1, nullptr);
+			if (imageDestination) {
+				CGImageDestinationAddImage (imageDestination, image, properties);
+				CGImageDestinationFinalize (imageDestination);
+				CFRelease (imageDestination);
+			}
 			CGImageRelease (image);
 			CFRelease (properties);
-			CGImageDestinationFinalize (imageDestination);
-			CFRelease (imageDestination);
 			CFRelease (url);
 		}
 		Melder_free (d_bits);
 	#endif
-	trace ("destroying parent");
+	trace (U"destroying parent");
 	GraphicsScreen_Parent :: v_destroy ();
-	trace ("exit");
+	trace (U"exit");
 }
 
 void structGraphicsScreen :: v_flushWs () {
 	#if cairo
 		// Ik weet niet of dit is wat het zou moeten zijn ;)
-		//gdk_window_process_updates (d_window, TRUE);   // this "works" but is incorrect because it's not the expose events that have to be carried out
+		//gdk_window_process_updates (d_window, true);   // this "works" but is incorrect because it's not the expose events that have to be carried out
 		//gdk_window_flush (d_window);
 		gdk_flush ();
 		// TODO: een aanroep die de eventuele grafische buffer ledigt,
@@ -238,7 +239,7 @@ void structGraphicsScreen :: v_flushWs () {
 	#elif cocoa
 		if (d_drawingArea) {
 			GuiShell shell = d_drawingArea -> d_shell;
-			Melder_assert (shell != NULL);
+			Melder_assert (shell);
         	[shell -> d_cocoaWindow   flushWindow];
 		}
 	#elif win
@@ -246,8 +247,8 @@ void structGraphicsScreen :: v_flushWs () {
 	#elif mac
 		if (d_drawingArea) {
 			GuiShell shell = d_drawingArea -> d_shell;
-			Melder_assert (shell != NULL);
-			shell -> f_drain ();
+			Melder_assert (shell);
+			GuiShell_drain (shell);
 		}
 	#endif
 }
@@ -273,12 +274,12 @@ void structGraphicsScreen :: v_clearWs () {
 			rect.y = this -> d_y2DC;
 			rect.height = this -> d_y1DC - this -> d_y2DC;
 		}
-		if (d_cairoGraphicsContext == NULL) {
-			trace ("clear and null");
+		if (! d_cairoGraphicsContext) {
+			trace (U"clear and null");
 			//gdk_window_clear (this -> window);
 			//gdk_window_invalidate_rect (this -> window, & rect, true);   // BUG: it seems weird that this is necessary.
 		} else {
-			trace ("clear and not null");
+			trace (U"clear and not null");
 			cairo_set_source_rgb (d_cairoGraphicsContext, 1.0, 1.0, 1.0);
 			cairo_rectangle (d_cairoGraphicsContext, rect.x, rect.y, rect.width, rect.height);
 			cairo_fill (d_cairoGraphicsContext);
@@ -312,7 +313,7 @@ void structGraphicsScreen :: v_clearWs () {
 			//rect.origin.y -= 1000;
 			//rect.size.width += 2000;
 			//rect.size.height += 2000;
-			trace ("clearing %f %f %f %f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
+			trace (U"clearing ", rect.origin.x, U" ", rect.origin.y, U" ", rect.size.width, U" ", rect.size.height);
                 //CGContextTranslateCTM (context, 0, cocoaDrawingArea.bounds.size.height);
                 //CGContextScaleCTM (context, 1.0, -1.0);
             CGContextFillRect (context, rect);
@@ -407,7 +408,7 @@ void structGraphicsScreen :: v_updateWs () {
     
 	#elif win
 		//clear (this); // lll
-		if (d_winWindow) InvalidateRect (d_winWindow, NULL, TRUE);
+		if (d_winWindow) InvalidateRect (d_winWindow, nullptr, true);
 	#elif mac
 		Rect r;
 		if (d_drawingArea) GuiMac_clipOn (d_drawingArea -> d_widget);   // to prevent invalidating invisible parts of the canvas
@@ -432,9 +433,9 @@ static int GraphicsScreen_init (GraphicsScreen me, void *voidDisplay, void *void
 		my d_display = (GdkDisplay *) gdk_display_get_default ();
 		_GraphicsScreen_text_init (me);
 		#if ALLOW_GDK_DRAWING
-			trace ("retrieving window");
+			trace (U"retrieving window");
 			my d_window = GDK_DRAWABLE (GTK_WIDGET (voidDisplay) -> window);
-			trace ("retrieved window");
+			trace (U"retrieved window");
 			my d_gdkGraphicsContext = gdk_gc_new (my d_window);
 		#else
 			my d_window = gtk_widget_get_window (GTK_WIDGET (voidDisplay));
@@ -445,12 +446,12 @@ static int GraphicsScreen_init (GraphicsScreen me, void *voidDisplay, void *void
 			my d_gdiGraphicsContext = (HDC) voidWindow;
 		} else if (voidDisplay) {
 			my d_gdiGraphicsContext = (HDC) voidDisplay;
-			my metafile = TRUE;
+			my metafile = true;
 		} else {
 			my d_winWindow = (HWND) voidWindow;
 			my d_gdiGraphicsContext = GetDC (my d_winWindow);   // window must have a constant display context; see XtInitialize ()
 		}
-		Melder_assert (my d_gdiGraphicsContext != NULL);
+		Melder_assert (my d_gdiGraphicsContext);
 		SetBkMode (my d_gdiGraphicsContext, TRANSPARENT);   // not the default!
 		/*
 		 * Create pens and brushes.
@@ -542,7 +543,7 @@ Graphics Graphics_create_screenPrinter (void *display, void *window) {
 static void cb_move (GuiObject w, XtPointer void_me, XtPointer call) {
 	iam (GraphicsScreen);
 	Dimension width, height;
-	XtVaGetValues (w, XmNwidth, & width, XmNheight, & height, NULL);
+	XtVaGetValues (w, XmNwidth, & width, XmNheight, & height, nullptr);
 
 	/* The four values returned are probably equal to the previous ones.
 	 * However, the following call forces a new computation of the device coordinates
@@ -556,7 +557,7 @@ static void cb_move (GuiObject w, XtPointer void_me, XtPointer call) {
 #endif
 
 Graphics Graphics_create_xmdrawingarea (GuiDrawingArea w) {
-	trace ("begin");
+	trace (U"begin");
 	GraphicsScreen me = Thing_new (GraphicsScreen);
 	#if gtk
 		GtkRequisition realsize;
@@ -575,7 +576,7 @@ Graphics Graphics_create_xmdrawingarea (GuiDrawingArea w) {
 		_GraphicsMacintosh_tryToInitializeQuartz ();
 	#endif
 	#if mac
-		Graphics_init (me, Gui_getResolution (NULL));
+		Graphics_init (me, Gui_getResolution (nullptr));
 		#if useCarbon
             GraphicsScreen_init (me,
                 XtDisplay (my d_drawingArea -> d_widget),
@@ -600,10 +601,10 @@ Graphics Graphics_create_xmdrawingarea (GuiDrawingArea w) {
 		gtk_widget_size_request (GTK_WIDGET (my d_drawingArea -> d_widget), & realsize);
 		gtk_widget_get_allocation (GTK_WIDGET (my d_drawingArea -> d_widget), & allocation);
 		// HIER WAS IK
-		trace ("requested %d x %d, allocated %d x %d", realsize.width, realsize.height, allocation.width, allocation.height);
+		trace (U"requested ", realsize.width, U" x ", realsize.height, U", allocated ", allocation.width, U" x ", allocation.height);
 		Graphics_setWsViewport ((Graphics) me, 0, realsize.width, 0, realsize.height);
 	#elif motif
-		XtVaGetValues (my d_drawingArea -> d_widget, XmNwidth, & width, XmNheight, & height, NULL);
+		XtVaGetValues (my d_drawingArea -> d_widget, XmNwidth, & width, XmNheight, & height, nullptr);
 		Graphics_setWsViewport ((Graphics) me, 0, width, 0, height);
     #elif cocoa
         NSView *view = (NSView *)my d_drawingArea -> d_widget;
@@ -622,7 +623,9 @@ Graphics Graphics_create_pngfile (MelderFile file, int resolution,
 	autoGraphicsScreen me = Thing_new (GraphicsScreen);
 	my screen = true;
 	my yIsZeroAtTheTop = true;
-	#ifdef macintosh
+	#if win
+		my d_useGdiplus = _GraphicsWindows_tryToInitializeGdiPlus ();
+	#elif mac
 		_GraphicsMacintosh_tryToInitializeQuartz ();
 	#endif
 	Graphics_init (me.peek(), resolution);
@@ -650,10 +653,10 @@ Graphics Graphics_create_pngfile (MelderFile file, int resolution,
 		long stride = width * 4;
 		stride = (stride + 15) & ~15;   // CommonCode/AppDrawing.c: "a multiple of 16 bytes, for best performance"
 		my d_bits = Melder_malloc (uint8_t, stride * height);
-		static CGColorSpaceRef colourSpace = NULL;
-		if (colourSpace == NULL) {
+		static CGColorSpaceRef colourSpace = nullptr;
+		if (! colourSpace) {
 			colourSpace = CGColorSpaceCreateWithName (kCGColorSpaceGenericRGB);
-			Melder_assert (colourSpace != NULL);
+			Melder_assert (colourSpace);
 		}
 		my d_macGraphicsContext = CGBitmapContextCreate (my d_bits,
 			width, height,
@@ -661,8 +664,8 @@ Graphics Graphics_create_pngfile (MelderFile file, int resolution,
 			stride,
 			colourSpace,
 			kCGImageAlphaPremultipliedLast);
-    	if (my d_macGraphicsContext == NULL)
-			Melder_throw ("Could not create PNG file ", file, ".");
+    	if (! my d_macGraphicsContext)
+			Melder_throw (U"Could not create PNG file ", file, U".");
 		CGRect rect = CGRectMake (0, 0, width, height);
 		CGContextSetAlpha (my d_macGraphicsContext, 1.0);
 		CGContextSetBlendMode (my d_macGraphicsContext, kCGBlendModeNormal);
@@ -671,17 +674,17 @@ Graphics Graphics_create_pngfile (MelderFile file, int resolution,
 		CGContextTranslateCTM (my d_macGraphicsContext, 0, height);
 		CGContextScaleCTM (my d_macGraphicsContext, 1.0, -1.0);
 	#elif win
-		my metafile = TRUE;
-		HDC screenDC = GetDC (NULL);
+		my metafile = true;
+		HDC screenDC = GetDC (nullptr);
 		my d_gdiGraphicsContext = CreateCompatibleDC (screenDC);
-		trace ("d_gdiGraphicsContext %p", my d_gdiGraphicsContext);
-		Melder_assert (my d_gdiGraphicsContext != NULL);
+		trace (U"d_gdiGraphicsContext ", Melder_pointer (my d_gdiGraphicsContext));
+		Melder_assert (my d_gdiGraphicsContext);
 		my d_gdiBitmap = CreateCompatibleBitmap (screenDC, (x2inches - x1inches) * resolution, (y2inches - y1inches) * resolution);
-		trace ("d_gdiBitmap %p", my d_gdiBitmap);
-		Melder_assert (my d_gdiBitmap != NULL);
-		ReleaseDC (NULL, screenDC);
+		trace (U"d_gdiBitmap ", Melder_pointer (my d_gdiBitmap));
+		Melder_assert (my d_gdiBitmap);
+		ReleaseDC (nullptr, screenDC);
 		SelectObject (my d_gdiGraphicsContext, my d_gdiBitmap);
-		trace ("bitmap selected into device context");
+		trace (U"bitmap selected into device context");
 		my resolution = resolution;
 		SetBkMode (my d_gdiGraphicsContext, TRANSPARENT);
 		my d_winPen = CreatePen (PS_SOLID, 0, RGB (0, 0, 0));
@@ -710,36 +713,45 @@ Graphics Graphics_create_pdffile (MelderFile file, int resolution,
 	#endif
 	Graphics_init (me.peek(), resolution);
 	#if gtk
-		my d_cairoSurface = cairo_pdf_surface_create (Melder_peekWcsToUtf8 (file -> path),
-			(x2inches - x1inches) * 72.0, (y2inches - y1inches) * 72.0);
+		my d_cairoSurface = cairo_pdf_surface_create (Melder_peek32to8 (file -> path),
+			(NUMdefined (x1inches) ? x2inches - x1inches : x2inches) * 72.0,
+			(NUMdefined (y1inches) ? y2inches - y1inches : y2inches) * 72.0);
 		my d_cairoGraphicsContext = cairo_create (my d_cairoSurface);
 		my d_x1DC = my d_x1DCmin = 0;
-		my d_x2DC = my d_x2DCmax = 7.5 * resolution;
+		my d_x2DC = my d_x2DCmax = (NUMdefined (x1inches) ?  7.5 : x2inches) * resolution;
 		my d_y1DC = my d_y1DCmin = 0;
-		my d_y2DC = my d_y2DCmax = 11.0 * resolution;
-		Graphics_setWsWindow ((Graphics) me.peek(), 0, 7.5, 1.0, 12.0);
+		my d_y2DC = my d_y2DCmax = (NUMdefined (y1inches) ? 11.0 : y2inches) * resolution;
+		Graphics_setWsWindow ((Graphics) me.peek(),
+			NUMdefined (x1inches) ? 0.0 : 0.0, NUMdefined (x1inches) ?  7.5 : x2inches,
+			NUMdefined (y1inches) ? 1.0 : 0.0, NUMdefined (y1inches) ? 12.0 : y2inches);
 		cairo_scale (my d_cairoGraphicsContext, 72.0 / resolution, 72.0 / resolution);
 	#elif mac
-		CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef) Melder_peekWcsToCfstring (file -> path), kCFURLPOSIXPathStyle, false);
-		CGRect rect = CGRectMake (0, 0, (x2inches - x1inches) * 72.0, (y2inches - y1inches) * 72.0);   // don't tire PDF viewers with funny origins
-		CFStringRef key = (CFStringRef) Melder_peekWcsToCfstring (L"Creator");
-		CFStringRef value = (CFStringRef) Melder_peekWcsToCfstring (L"Praat");
+		CFURLRef url = CFURLCreateWithFileSystemPath (nullptr, (CFStringRef) Melder_peek32toCfstring (file -> path), kCFURLPOSIXPathStyle, false);
+		CGRect rect = CGRectMake (0, 0,
+			(NUMdefined (x1inches) ? x2inches - x1inches : x2inches) * 72.0,
+			(NUMdefined (y1inches) ? y2inches - y1inches : y2inches) * 72.0);   // don't tire PDF viewers with funny origins
+		CFStringRef key = (CFStringRef) Melder_peek32toCfstring (U"Creator");
+		CFStringRef value = (CFStringRef) Melder_peek32toCfstring (U"Praat");
 		CFIndex numberOfValues = 1;
-		CFDictionaryRef dictionary = CFDictionaryCreate (NULL, (const void **) & key, (const void **) & value, numberOfValues,
+		CFDictionaryRef dictionary = CFDictionaryCreate (nullptr, (const void **) & key, (const void **) & value, numberOfValues,
 			& kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);
 		my d_macGraphicsContext = CGPDFContextCreateWithURL (url, & rect, dictionary);
 		CFRelease (url);
 		CFRelease (dictionary);
-    	if (my d_macGraphicsContext == NULL)
-			Melder_throw ("Could not create PDF file ", file, ".");
+    	if (! my d_macGraphicsContext)
+			Melder_throw (U"Could not create PDF file ", file, U".");
 		my d_x1DC = my d_x1DCmin = 0;
-		my d_x2DC = my d_x2DCmax = 7.5 * resolution;
+		my d_x2DC = my d_x2DCmax = (NUMdefined (x1inches) ?  7.5 : x2inches) * resolution;
 		my d_y1DC = my d_y1DCmin = 0;
-		my d_y2DC = my d_y2DCmax = 11.0 * resolution;
-		Graphics_setWsWindow ((Graphics) me.peek(), 0, 7.5, 1.0, 12.0);
+		my d_y2DC = my d_y2DCmax = (NUMdefined (y1inches) ? 11.0 : y2inches) * resolution;
+		Graphics_setWsWindow ((Graphics) me.peek(),
+			NUMdefined (x1inches) ? 0.0 : 0.0, NUMdefined (x1inches) ?  7.5 : x2inches,
+			NUMdefined (y1inches) ? 1.0 : 0.0, NUMdefined (y1inches) ? 12.0 : y2inches);
 		CGContextBeginPage (my d_macGraphicsContext, & rect);
 		CGContextScaleCTM (my d_macGraphicsContext, 72.0 / resolution, 72.0 / resolution);
-		CGContextTranslateCTM (my d_macGraphicsContext, - x1inches * resolution, (12.0 - y1inches) * resolution);
+		CGContextTranslateCTM (my d_macGraphicsContext,
+			(NUMdefined (x1inches) ? - x1inches : 0.0) * resolution,
+			(NUMdefined (y1inches) ? (12.0 - y1inches) : y2inches) * resolution);
 		CGContextScaleCTM (my d_macGraphicsContext, 1.0, -1.0);
 	#endif
 	return (Graphics) me.transfer();
@@ -762,7 +774,7 @@ Graphics Graphics_create_pdf (void *context, int resolution,
 		my d_y1DC = my d_y1DCmin = 0;
 		my d_y2DC = my d_y2DCmax = 11.0 * resolution;
 		Graphics_setWsWindow ((Graphics) me, 0, 7.5, 1.0, 12.0);
-    	Melder_assert (my d_macGraphicsContext != NULL);
+    	Melder_assert (my d_macGraphicsContext);
 		CGContextBeginPage (my d_macGraphicsContext, & rect);
 		CGContextScaleCTM (my d_macGraphicsContext, 72.0 / resolution, 72.0 / resolution);
 		CGContextTranslateCTM (my d_macGraphicsContext, - x1inches * resolution, (12.0 - y1inches) * resolution);
@@ -786,8 +798,8 @@ Graphics Graphics_create_pdf (void *context, int resolution,
 			if (my d_macPort) {
 				QDBeginCGContext (my d_macPort, & my d_macGraphicsContext);
 				//CGContextSetAlpha (my macGraphicsContext, 1.0);
-				//CGContextSetAllowsAntialiasing (my macGraphicsContext, false);
-				if (my d_drawingArea != NULL) {
+				CGContextSetAllowsAntialiasing (my d_macGraphicsContext, true);
+				if (my d_drawingArea) {
 					int shellHeight = GuiMac_clipOn_graphicsContext (my d_drawingArea -> d_widget, my d_macGraphicsContext);
 					CGContextTranslateCTM (my d_macGraphicsContext, 0, shellHeight);
 				} else if (my printer) {
@@ -801,7 +813,7 @@ Graphics Graphics_create_pdf (void *context, int resolution,
 				//if (! my printer) {
 					my d_macGraphicsContext = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
 				//}
-                Melder_assert (my d_macGraphicsContext != NULL);
+                Melder_assert (my d_macGraphicsContext);
 				if (my printer) {
 					//CGContextTranslateCTM (my d_macGraphicsContext, 0, [my d_macView bounds]. size. height);
 					//CGContextScaleCTM (my d_macGraphicsContext, 1.0, -1.0);
diff --git a/sys/Graphics_colour.cpp b/sys/Graphics_colour.cpp
index 1c31ede..45b7614 100644
--- a/sys/Graphics_colour.cpp
+++ b/sys/Graphics_colour.cpp
@@ -1,6 +1,6 @@
 /* Graphics_colour.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -59,27 +59,35 @@ Graphics_Colour
 	Graphics_GREY = { 0.5, 0.5, 0.5 },
 	Graphics_WINDOW_BACKGROUND_COLOUR = { 0.90, 0.90, 0.85 };
 
-const wchar_t * Graphics_Colour_name (Graphics_Colour colour) {
+inline static const char32 * rgbColourName (Graphics_Colour colour) {
+	static MelderString buffer;
+	MelderString_copy (& buffer,
+		U"{", Melder_fixed (colour. red, 6),
+		U",", Melder_fixed (colour. green, 6),
+		U",", Melder_fixed (colour. blue, 6),
+		U"}"
+	);
+	return buffer.string;
+}
+const char32 * Graphics_Colour_name (Graphics_Colour colour) {
 	return
-		Graphics_Colour_equal (colour, Graphics_BLACK) ? L"black" :
-		Graphics_Colour_equal (colour, Graphics_WHITE) ? L"white" :
-		Graphics_Colour_equal (colour, Graphics_RED) ? L"red" :
-		Graphics_Colour_equal (colour, Graphics_GREEN) ? L"green" :
-		Graphics_Colour_equal (colour, Graphics_BLUE) ? L"blue" :
-		Graphics_Colour_equal (colour, Graphics_CYAN) ? L"cyan" :
-		Graphics_Colour_equal (colour, Graphics_MAGENTA) ? L"magenta" :
-		Graphics_Colour_equal (colour, Graphics_YELLOW) ? L"yellow" :
-		Graphics_Colour_equal (colour, Graphics_MAROON) ? L"maroon" :
-		Graphics_Colour_equal (colour, Graphics_LIME) ? L"lime" :
-		Graphics_Colour_equal (colour, Graphics_NAVY) ? L"navy" :
-		Graphics_Colour_equal (colour, Graphics_TEAL) ? L"teal" :
-		Graphics_Colour_equal (colour, Graphics_PURPLE) ? L"purple" :
-		Graphics_Colour_equal (colour, Graphics_OLIVE) ? L"olive" :
-		Graphics_Colour_equal (colour, Graphics_SILVER) ? L"silver" :
-		Graphics_Colour_equal (colour, Graphics_GREY) ? L"grey" :
-		//colour. red == colour. green && colour. red == colour. blue ? Melder_fixed (colour. red, 6) :
-		Melder_wcscat (L"{", Melder_fixed (colour. red, 6), L",", Melder_fixed (colour. green, 6), L",",
-			Melder_fixed (colour. blue, 6), L"}");
+		Graphics_Colour_equal (colour, Graphics_BLACK) ? U"black" :
+		Graphics_Colour_equal (colour, Graphics_WHITE) ? U"white" :
+		Graphics_Colour_equal (colour, Graphics_RED) ? U"red" :
+		Graphics_Colour_equal (colour, Graphics_GREEN) ? U"green" :
+		Graphics_Colour_equal (colour, Graphics_BLUE) ? U"blue" :
+		Graphics_Colour_equal (colour, Graphics_CYAN) ? U"cyan" :
+		Graphics_Colour_equal (colour, Graphics_MAGENTA) ? U"magenta" :
+		Graphics_Colour_equal (colour, Graphics_YELLOW) ? U"yellow" :
+		Graphics_Colour_equal (colour, Graphics_MAROON) ? U"maroon" :
+		Graphics_Colour_equal (colour, Graphics_LIME) ? U"lime" :
+		Graphics_Colour_equal (colour, Graphics_NAVY) ? U"navy" :
+		Graphics_Colour_equal (colour, Graphics_TEAL) ? U"teal" :
+		Graphics_Colour_equal (colour, Graphics_PURPLE) ? U"purple" :
+		Graphics_Colour_equal (colour, Graphics_OLIVE) ? U"olive" :
+		Graphics_Colour_equal (colour, Graphics_SILVER) ? U"silver" :
+		Graphics_Colour_equal (colour, Graphics_GREY) ? U"grey" :
+		rgbColourName (colour);
 }
 
 #if mac
@@ -96,7 +104,7 @@ void _Graphics_setColour (Graphics graphics, Graphics_Colour colour) {
 	if (graphics -> screen) {
 		GraphicsScreen me = static_cast <GraphicsScreen> (graphics);
 		#if cairo
-			if (my d_cairoGraphicsContext == NULL) return;
+			if (! my d_cairoGraphicsContext) return;
 			cairo_set_source_rgb (my d_cairoGraphicsContext, colour. red, colour. green, colour. blue);
 		#elif win
 			my d_winForegroundColour = RGB (colour. red * 255, colour. green * 255, colour. blue * 255);
@@ -133,7 +141,7 @@ void _Graphics_setGrey (Graphics graphics, double fgrey) {
 	if (graphics -> screen) {
 		GraphicsScreen me = static_cast <GraphicsScreen> (graphics);
 		#if cairo
-			if (my d_cairoGraphicsContext == NULL) return;
+			if (! my d_cairoGraphicsContext) return;
 			if (fgrey < 0.0) fgrey = 0.0; else if (fgrey > 1.0) fgrey = 1.0;
 			cairo_set_source_rgb (my d_cairoGraphicsContext, fgrey, fgrey, fgrey);
 		#elif win
@@ -166,14 +174,14 @@ static void highlight (Graphics graphics, long x1DC, long x2DC, long y1DC, long
 	if (graphics -> screen) {
 		GraphicsScreen me = static_cast <GraphicsScreen> (graphics);
 		#if cairo
-			if (my d_cairoGraphicsContext == NULL) return;
+			if (! my d_cairoGraphicsContext) return;
 			int width = x2DC - x1DC, height = y1DC - y2DC;
 			if (width <= 0 || height <= 0) return;
 			#if ALLOW_GDK_DRAWING
 				gdk_gc_set_function (my d_gdkGraphicsContext, GDK_XOR);
 				GdkColor pinkXorWhite = { 0, 0x0000, 0x4000, 0x4000 }, black = { 0, 0x0000, 0x0000, 0x0000 };
 				gdk_gc_set_rgb_fg_color (my d_gdkGraphicsContext, & pinkXorWhite);
-				gdk_draw_rectangle (my d_window, my d_gdkGraphicsContext, TRUE, x1DC, y2DC, width, height);
+				gdk_draw_rectangle (my d_window, my d_gdkGraphicsContext, true, x1DC, y2DC, width, height);
 				gdk_gc_set_rgb_fg_color (my d_gdkGraphicsContext, & black);
 				gdk_gc_set_function (my d_gdkGraphicsContext, GDK_COPY);
 				gdk_flush ();
@@ -183,28 +191,62 @@ static void highlight (Graphics graphics, long x1DC, long x2DC, long y1DC, long
 			if (width <= 0 || height <= 0) return;
 			GuiCocoaDrawingArea *drawingArea = (GuiCocoaDrawingArea *) my d_drawingArea -> d_widget;
 			if (drawingArea) {
-				NSView *nsView = my d_macView;
-				if (direction == 1) {   // forward
-					NSRect rect = NSMakeRect (x1DC, y2DC, width, height);
-					NSRect windowRect = [nsView convertRect: rect toView: nil];
-					//windowRect.origin.x += 1;
-					//windowRect.size.width -= 2;
-					[[nsView window] cacheImageInRect: windowRect];
+				bool cacheImageInRectWillWork = ( Melder_systemVersion < 101100 );
+				if (cacheImageInRectWillWork) {
+					NSView *nsView = my d_macView;
+					if (direction == 1) {   // forward
+						NSRect rect = NSMakeRect (x1DC, y2DC, width, height);
+						NSRect windowRect = [nsView convertRect: rect toView: nil];
+						//NSRect windowRect = [nsView convertRectToBacking: rect];
+						//NSRect windowRect = [nsView backingAlignedRect: rect options: NSAlignAllEdgesNearest];
+						//windowRect.origin.x += 1;
+						//windowRect.size.width -= 2;
+						[[nsView window] cacheImageInRect: windowRect];
+						[drawingArea lockFocus];
+						CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
+						CGContextSaveGState (context);
+						CGContextSetBlendMode (context, kCGBlendModeDifference);
+						//CGContextSetBlendMode (context, kCGBlendModeDarken);
+						CGContextSetShouldAntialias (context, false);
+						NSColor *colour = [[NSColor selectedTextBackgroundColor] colorUsingColorSpaceName: NSDeviceRGBColorSpace];
+						double red = 0.5 + 0.5 * colour.redComponent, green = 0.5 + 0.5 * colour.greenComponent, blue = 0.5 + 0.5 * colour.blueComponent;
+						CGContextSetRGBFillColor (context, 1.0 - red, 1.0 - green, 1.0 - blue, 1.0);
+						//CGContextSetRGBFillColor (context, red, green, blue, 1.0);
+						CGContextFillRect (context, rect);
+						CGContextRestoreGState (context);
+						[drawingArea unlockFocus];
+					} else {   // backward
+						//[drawingArea lockFocus];
+						[[nsView window] restoreCachedImage];
+						[[nsView window] discardCachedImage];
+						//[drawingArea unlockFocus];
+						//[[nsView window] flushWindow];
+						//[[nsView window] flushWindowIfNeeded];
+					}
+				} else {
 					[drawingArea lockFocus];
 					CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
 					CGContextSaveGState (context);
+					NSCAssert (context, @"nil context");
+					//CGContextTranslateCTM (context, 0, drawingArea. bounds. size. height);
+					//CGContextScaleCTM (context, 1.0, -1.0);
+					NSRect rect = NSMakeRect (x1DC,  y2DC, width, height);
 					CGContextSetBlendMode (context, kCGBlendModeDifference);
-					//CGContextSetBlendMode (context, kCGBlendModeDarken);
 					CGContextSetShouldAntialias (context, false);
-					NSColor *colour = [[NSColor selectedTextBackgroundColor] colorUsingColorSpaceName: NSDeviceRGBColorSpace];
+					NSColor *colour = [[NSColor selectedTextBackgroundColor] colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
 					double red = 0.5 + 0.5 * colour.redComponent, green = 0.5 + 0.5 * colour.greenComponent, blue = 0.5 + 0.5 * colour.blueComponent;
-					CGContextSetRGBFillColor (context, 1.0 - red, 1.0 - green, 1.0 - blue, 1.0);
-					//CGContextSetRGBFillColor (context, red, green, blue, 1.0);
-					CGContextFillRect (context, rect);
+					if (direction == 1) {   // forward
+						CGContextSetRGBFillColor (context, 1.0 - red, 1.0 - green, 1.0 - blue, 1.0);
+						CGContextFillRect (context, rect);
+					} else {   // backward
+						CGContextSetRGBFillColor (context, red, green, blue, 1.0);
+						CGContextFillRect (context, rect);
+						CGContextSetRGBFillColor (context, 1.0, 1.0, 1.0, 1.0);
+						CGContextFillRect (context, rect);
+					}
 					CGContextRestoreGState (context);
+					//CGContextSynchronize (context);
 					[drawingArea unlockFocus];
-				} else {   // backward
-					[[nsView window] restoreCachedImage];
 				}
 			}
         #elif mac
@@ -227,7 +269,7 @@ static void highlight (Graphics graphics, long x1DC, long x2DC, long y1DC, long
 			Rectangle (my d_gdiGraphicsContext, x1DC, y2DC, x2DC + 1, y1DC + 1);
 			SetROP2 (my d_gdiGraphicsContext, R2_COPYPEN);
 			SelectPen (my d_gdiGraphicsContext, GetStockPen (BLACK_PEN));
-			SelectBrush (my d_gdiGraphicsContext, GetStockBrush (NULL_BRUSH));   /* Superfluous? */
+			SelectBrush (my d_gdiGraphicsContext, GetStockBrush (NULL_BRUSH));   // superfluous?
 		#endif
 	}
 }
@@ -250,32 +292,37 @@ static void highlight2 (Graphics graphics, long x1DC, long x2DC, long y1DC, long
 	if (graphics -> screen) {
 		GraphicsScreen me = static_cast <GraphicsScreen> (graphics);
 		#if cairo
-			if (my d_cairoGraphicsContext == NULL) return;
+			if (! my d_cairoGraphicsContext) return;
 			int width = x2DC - x1DC, height = y1DC - y2DC;
 			if (width <= 0 || height <= 0) return;
 			#if ALLOW_GDK_DRAWING
 				gdk_gc_set_function (my d_gdkGraphicsContext, GDK_XOR);
 				GdkColor pinkXorWhite = { 0, 0x0000, 0x4000, 0x4000 }, black = { 0, 0x0000, 0x0000, 0x0000 };
 				gdk_gc_set_rgb_fg_color (my d_gdkGraphicsContext, & pinkXorWhite);
-				gdk_draw_rectangle (my d_window, my d_gdkGraphicsContext, TRUE, x1DC, y2DC, x2DC - x1DC, y2DC_inner - y2DC); // upper
-				gdk_draw_rectangle (my d_window, my d_gdkGraphicsContext, TRUE, x1DC, y2DC_inner, x1DC_inner - x1DC, y1DC_inner - y2DC_inner); // left part
-				gdk_draw_rectangle (my d_window, my d_gdkGraphicsContext, TRUE, x2DC_inner, y2DC_inner, x2DC - x2DC_inner, y1DC_inner - y2DC_inner); // right part
-				gdk_draw_rectangle (my d_window, my d_gdkGraphicsContext, TRUE, x1DC, y1DC_inner, x2DC - x1DC, y1DC - y1DC_inner); // lower
+				gdk_draw_rectangle (my d_window, my d_gdkGraphicsContext, true, x1DC, y2DC, x2DC - x1DC, y2DC_inner - y2DC); // upper
+				gdk_draw_rectangle (my d_window, my d_gdkGraphicsContext, true, x1DC, y2DC_inner, x1DC_inner - x1DC, y1DC_inner - y2DC_inner); // left part
+				gdk_draw_rectangle (my d_window, my d_gdkGraphicsContext, true, x2DC_inner, y2DC_inner, x2DC - x2DC_inner, y1DC_inner - y2DC_inner); // right part
+				gdk_draw_rectangle (my d_window, my d_gdkGraphicsContext, true, x1DC, y1DC_inner, x2DC - x1DC, y1DC - y1DC_inner); // lower
 				gdk_gc_set_rgb_fg_color (my d_gdkGraphicsContext, & black);
 				gdk_gc_set_function (my d_gdkGraphicsContext, GDK_COPY);
 				gdk_flush ();
 			#endif
 		#elif cocoa
-			GuiCocoaDrawingArea *drawingArea = (GuiCocoaDrawingArea*) my d_drawingArea -> d_widget;
+			GuiCocoaDrawingArea *drawingArea = (GuiCocoaDrawingArea *) my d_drawingArea -> d_widget;
 			if (drawingArea) {
-				NSRect rect = NSMakeRect (x1DC, y2DC, x2DC - x1DC, y1DC - y2DC);
-				if (direction == 1) {
+				bool cacheImageInRectWillWork = ( Melder_systemVersion < 101100 /*|| Melder_systemVersion > 111111*/);
+				if (cacheImageInRectWillWork) {
 					NSView *nsView = my d_macView;
-					NSRect windowRect = [nsView convertRect: rect toView: nil];
-					[[nsView window] cacheImageInRect: windowRect];
-				} else {
-					[[my d_macView window] restoreCachedImage];
-					return;
+					if (direction == 1) {
+						NSRect rect = NSMakeRect (x1DC, y2DC, x2DC - x1DC, y1DC - y2DC);
+						NSRect windowRect = [nsView convertRect: rect toView: nil];
+						Melder_assert ([nsView window] != nil);
+						[[nsView window] cacheImageInRect: windowRect];
+					} else {
+						[[nsView window] restoreCachedImage];
+						//[[nsView window] flushWindow];
+						return;
+					}
 				}
 				[drawingArea lockFocus];
 				my d_macGraphicsContext = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
@@ -284,16 +331,39 @@ static void highlight2 (Graphics graphics, long x1DC, long x2DC, long y1DC, long
 				NSRect leftRect  = NSMakeRect (x1DC, y2DC_inner, x1DC_inner - x1DC, y1DC_inner - y2DC_inner);
 				NSRect rightRect = NSMakeRect (x2DC_inner, y2DC_inner, x2DC - x2DC_inner, y1DC_inner - y2DC_inner);
 				NSRect lowerRect = NSMakeRect (x1DC, y1DC_inner, x2DC - x1DC, y1DC - y1DC_inner);
-				//CGContextSetBlendMode (my d_macGraphicsContext, kCGBlendModeDifference);
-				CGContextSetBlendMode (my d_macGraphicsContext, kCGBlendModeDarken);
 				NSColor *colour = [[NSColor selectedTextBackgroundColor] colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
 				double red = 0.5 + 0.5 * colour.redComponent, green = 0.5 + 0.5 * colour.greenComponent, blue = 0.5 + 0.5 * colour.blueComponent;
-				//CGContextSetRGBFillColor (my d_macGraphicsContext, 1.0 - red, 1.0 - green, 1.0 - blue, 1.0);
-				CGContextSetRGBFillColor (my d_macGraphicsContext, red, green, blue, 1.0);
-				CGContextFillRect (my d_macGraphicsContext, upperRect);
-				CGContextFillRect (my d_macGraphicsContext, leftRect);
-				CGContextFillRect (my d_macGraphicsContext, rightRect);
-				CGContextFillRect (my d_macGraphicsContext, lowerRect);
+				if (cacheImageInRectWillWork) {
+					CGContextSetBlendMode (my d_macGraphicsContext, kCGBlendModeDarken);
+					CGContextSetRGBFillColor (my d_macGraphicsContext, red, green, blue, 1.0);
+					CGContextFillRect (my d_macGraphicsContext, upperRect);
+					CGContextFillRect (my d_macGraphicsContext, leftRect);
+					CGContextFillRect (my d_macGraphicsContext, rightRect);
+					CGContextFillRect (my d_macGraphicsContext, lowerRect);
+				} else {
+					/*
+					 * An older, suboptimal method.
+					 */
+					CGContextSetBlendMode (my d_macGraphicsContext, kCGBlendModeDifference);
+					if (direction == 1) {
+						CGContextSetRGBFillColor (my d_macGraphicsContext, 1.0 - red, 1.0 - green, 1.0 - blue, 1.0);
+						CGContextFillRect (my d_macGraphicsContext, upperRect);
+						CGContextFillRect (my d_macGraphicsContext, leftRect);
+						CGContextFillRect (my d_macGraphicsContext, rightRect);
+						CGContextFillRect (my d_macGraphicsContext, lowerRect);
+					} else {
+						CGContextSetRGBFillColor (my d_macGraphicsContext, red, green, blue, 1.0);
+						CGContextFillRect (my d_macGraphicsContext, upperRect);
+						CGContextFillRect (my d_macGraphicsContext, leftRect);
+						CGContextFillRect (my d_macGraphicsContext, rightRect);
+						CGContextFillRect (my d_macGraphicsContext, lowerRect);
+						CGContextSetRGBFillColor (my d_macGraphicsContext, 1.0, 1.0, 1.0, 1.0);
+						CGContextFillRect (my d_macGraphicsContext, upperRect);
+						CGContextFillRect (my d_macGraphicsContext, leftRect);
+						CGContextFillRect (my d_macGraphicsContext, rightRect);
+						CGContextFillRect (my d_macGraphicsContext, lowerRect);
+					}
+				}
 				CGContextRestoreGState (my d_macGraphicsContext);
 				[drawingArea unlockFocus];
 			}
@@ -353,9 +423,9 @@ void Graphics_xorOn (Graphics graphics, Graphics_Colour colour) {
 		GraphicsScreen me = static_cast <GraphicsScreen> (graphics);
 		#if cairo
 			GdkColor colourXorWhite = { 0,
-				(uint16_t) ((uint16_t) (colour. red * 65535.0) ^ (uint16_t) 0xFFFF),
-				(uint16_t) ((uint16_t) (colour. green * 65535.0) ^ (uint16_t) 0xFFFF),
-				(uint16_t) ((uint16_t) (colour. blue * 65535.0) ^ (uint16_t) 0xFFFF) };
+				(uint16) ((uint16) (colour. red   * 65535.0) ^ (uint16) 0xFFFF),
+				(uint16) ((uint16) (colour. green * 65535.0) ^ (uint16) 0xFFFF),
+				(uint16) ((uint16) (colour. blue  * 65535.0) ^ (uint16) 0xFFFF) };
 			#if ALLOW_GDK_DRAWING
 				gdk_gc_set_rgb_fg_color (my d_gdkGraphicsContext, & colourXorWhite);
 				gdk_gc_set_function (my d_gdkGraphicsContext, GDK_XOR);
@@ -366,9 +436,9 @@ void Graphics_xorOn (Graphics graphics, Graphics_Colour colour) {
 			#endif
 		#elif win
 			SetROP2 (my d_gdiGraphicsContext, R2_XORPEN);
-			colour. red = ((uint16_t) (colour. red * 65535.0) ^ 0xFFFF) / 65535.0;
-			colour. green = ((uint16_t) (colour. green * 65535.0) ^ 0xFFFF) / 65535.0;
-			colour. blue = ((uint16_t) (colour. blue * 65535.0) ^ 0xFFFF) / 65535.0;
+			colour. red   = ((uint16) (colour. red   * 65535.0) ^ 0xFFFF) / 65535.0;
+			colour. green = ((uint16) (colour. green * 65535.0) ^ 0xFFFF) / 65535.0;
+			colour. blue  = ((uint16) (colour. blue  * 65535.0) ^ 0xFFFF) / 65535.0;
 			_Graphics_setColour (me, colour);
 		#elif cocoa
 		#elif mac
diff --git a/sys/Graphics_enums.h b/sys/Graphics_enums.h
index 9bef38f..2ba16a2 100644
--- a/sys/Graphics_enums.h
+++ b/sys/Graphics_enums.h
@@ -18,61 +18,63 @@
  */
 
 enums_begin (kGraphics_font, 0)
-	enums_add (kGraphics_font, 0, HELVETICA, L"Helvetica")
-	enums_add (kGraphics_font, 1, TIMES, L"Times")
-	enums_add (kGraphics_font, 2, COURIER, L"Courier")
-	enums_add (kGraphics_font, 3, PALATINO, L"Palatino")
+	enums_add (kGraphics_font, 0, HELVETICA, U"Helvetica")
+	enums_add (kGraphics_font, 1, TIMES, U"Times")
+	enums_add (kGraphics_font, 2, COURIER, U"Courier")
+	enums_add (kGraphics_font, 3, PALATINO, U"Palatino")
 enums_end (kGraphics_font, 3, TIMES)
 
 enums_begin (kGraphics_horizontalAlignment, 0)
-	enums_add (kGraphics_horizontalAlignment, 0, LEFT, L"left")
-	enums_add (kGraphics_horizontalAlignment, 1, CENTRE, L"centre")
-	enums_alt (kGraphics_horizontalAlignment,    CENTRE, L"center")
-	enums_add (kGraphics_horizontalAlignment, 2, RIGHT, L"right")
+	enums_add (kGraphics_horizontalAlignment, 0, LEFT, U"left")
+	enums_add (kGraphics_horizontalAlignment, 1, CENTRE, U"centre")
+	enums_alt (kGraphics_horizontalAlignment,    CENTRE, U"center")
+	enums_add (kGraphics_horizontalAlignment, 2, RIGHT, U"right")
 enums_end (kGraphics_horizontalAlignment, 2, CENTRE)
 
 enums_begin (kGraphics_resolution, 0)
-	enums_add (kGraphics_resolution, 0,  96, L"96 dpi")
-	enums_add (kGraphics_resolution, 1, 100, L"100 dpi")
-	enums_add (kGraphics_resolution, 2, 180, L"180 dpi")
-	enums_add (kGraphics_resolution, 3, 200, L"200 dpi")
-	enums_add (kGraphics_resolution, 4, 300, L"300 dpi")
-	enums_add (kGraphics_resolution, 5, 360, L"360 dpi")
-	enums_add (kGraphics_resolution, 6, 600, L"600 dpi")
-	enums_add (kGraphics_resolution, 7, 1200, L"1200 dpi")
-enums_end (kGraphics_resolution, 7, 100)
+	enums_add (kGraphics_resolution, 0,  96, U"96 dpi")
+	enums_add (kGraphics_resolution, 1, 100, U"100 dpi")
+	enums_add (kGraphics_resolution, 2, 180, U"180 dpi")
+	enums_add (kGraphics_resolution, 3, 200, U"200 dpi")
+	enums_add (kGraphics_resolution, 4, 300, U"300 dpi")
+	enums_add (kGraphics_resolution, 5, 360, U"360 dpi")
+	enums_add (kGraphics_resolution, 6, 600, U"600 dpi")
+	enums_add (kGraphics_resolution, 7, 720, U"720 dpi")
+	enums_add (kGraphics_resolution, 8, 900, U"900 dpi")
+	enums_add (kGraphics_resolution, 9, 1200, U"1200 dpi")
+enums_end (kGraphics_resolution, 9, 100)
 
 enums_begin (kGraphics_colourScale, 0)
-	enums_add (kGraphics_colourScale, 0, GREY, L"grey")
-	enums_add (kGraphics_colourScale, 1, BLUE_TO_RED, L"blue to red")
+	enums_add (kGraphics_colourScale, 0, GREY, U"grey")
+	enums_add (kGraphics_colourScale, 1, BLUE_TO_RED, U"blue to red")
 enums_end (kGraphics_colourScale, 1, GREY)
 
 enums_begin (kGraphicsPostscript_spots, 0)
-	enums_add (kGraphicsPostscript_spots, 0, FINE, L"finest")
-	enums_add (kGraphicsPostscript_spots, 1, PHOTOCOPYABLE, L"photocopyable")
+	enums_add (kGraphicsPostscript_spots, 0, FINE, U"finest")
+	enums_add (kGraphicsPostscript_spots, 1, PHOTOCOPYABLE, U"photocopyable")
 enums_end (kGraphicsPostscript_spots, 1, FINE)
 
 enums_begin (kGraphicsPostscript_paperSize, 0)
-	enums_add (kGraphicsPostscript_paperSize, 0, A4, L"A4")
-	enums_add (kGraphicsPostscript_paperSize, 1, A3, L"A3")
-	enums_add (kGraphicsPostscript_paperSize, 2, US_LETTER, L"US Letter")
+	enums_add (kGraphicsPostscript_paperSize, 0, A4, U"A4")
+	enums_add (kGraphicsPostscript_paperSize, 1, A3, U"A3")
+	enums_add (kGraphicsPostscript_paperSize, 2, US_LETTER, U"US Letter")
 enums_end (kGraphicsPostscript_paperSize, 2, A4)
 
 enums_begin (kGraphicsPostscript_orientation, 0)
-	enums_add (kGraphicsPostscript_orientation, 0, PORTRAIT, L"portrait")
-	enums_add (kGraphicsPostscript_orientation, 1, LANDSCAPE, L"landscape")
+	enums_add (kGraphicsPostscript_orientation, 0, PORTRAIT, U"portrait")
+	enums_add (kGraphicsPostscript_orientation, 1, LANDSCAPE, U"landscape")
 enums_end (kGraphicsPostscript_orientation, 1, PORTRAIT)
 
 enums_begin (kGraphicsPostscript_fontChoiceStrategy, 0)
-	enums_add (kGraphicsPostscript_fontChoiceStrategy, 0, AUTOMATIC, L"automatic")
-	enums_add (kGraphicsPostscript_fontChoiceStrategy, 1, LINOTYPE, L"Linotype")
-	enums_add (kGraphicsPostscript_fontChoiceStrategy, 2, MONOTYPE, L"Monotype")
-	enums_add (kGraphicsPostscript_fontChoiceStrategy, 3, PS_MONOTYPE, L"PS Monotype")
+	enums_add (kGraphicsPostscript_fontChoiceStrategy, 0, AUTOMATIC, U"automatic")
+	enums_add (kGraphicsPostscript_fontChoiceStrategy, 1, LINOTYPE, U"Linotype")
+	enums_add (kGraphicsPostscript_fontChoiceStrategy, 2, MONOTYPE, U"Monotype")
+	enums_add (kGraphicsPostscript_fontChoiceStrategy, 3, PS_MONOTYPE, U"PS Monotype")
 enums_end (kGraphicsPostscript_fontChoiceStrategy, 3, AUTOMATIC)
 
 enums_begin (kGraphics_cjkFontStyle, 0)
-	enums_add (kGraphics_cjkFontStyle, 0, CHINESE, L"Chinese")
-	enums_add (kGraphics_cjkFontStyle, 1, JAPANESE, L"Japanese")
+	enums_add (kGraphics_cjkFontStyle, 0, CHINESE, U"Chinese")
+	enums_add (kGraphics_cjkFontStyle, 1, JAPANESE, U"Japanese")
 enums_end (kGraphics_cjkFontStyle, 1, CHINESE)
 
 /* End of file Graphics_enums.h */
diff --git a/sys/Graphics_grey.cpp b/sys/Graphics_grey.cpp
index 0da4cd7..33bc9f8 100644
--- a/sys/Graphics_grey.cpp
+++ b/sys/Graphics_grey.cpp
@@ -243,7 +243,7 @@ static void makeClosedContour (int row0, int col0, int ori0) {
 
 	{
 		int i;
-		double xmin = 1e300, xmax = -1e300, ymin = 1e300, ymax = -1e300;
+		double xmin = 1e308, xmax = -1e308, ymin = 1e308, ymax = -1e308;
 		c -> grey = up ? iBorder + 1 : iBorder;
 		for (i = 1; i <= numberOfPoints; i ++) {
 			c -> x [i] = x [i];
@@ -260,7 +260,7 @@ static void makeClosedContour (int row0, int col0, int ori0) {
 	}
 }
 
-static void smallGrey (void) {
+static void smallGrey () {
 	int row, col, i;
 	numberOfEdgeContours = 0;
 	numberOfClosedContours = 0;
diff --git a/sys/Graphics_image.cpp b/sys/Graphics_image.cpp
index 329f1ca..b24118e 100644
--- a/sys/Graphics_image.cpp
+++ b/sys/Graphics_image.cpp
@@ -1,6 +1,6 @@
 /* Graphics_image.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -62,9 +62,9 @@ static void _GraphicsScreen_cellArrayOrImage (GraphicsScreen me, double **z_floa
 	double dy = (double) (y2DC - y1DC) / (double) ny;   /* Vertical pixels per cell. Negative. */
 	double scale = 255.0 / (maximum - minimum), offset = 255.0 + minimum * scale;
 	if (x2DC <= x1DC || y1DC <= y2DC) return;
-	trace ("scale %f", scale);
+	trace (U"scale ", scale);
 	/* Clip by the intersection of the world window and the outline of the cells. */
-	//Melder_casual ("clipy1 %ld clipy2 %ld", clipy1, clipy2);
+	//Melder_casual (U"clipy1 ", clipy1, U" clipy2 ", clipy2);
 	if (clipx1 < x1DC) clipx1 = x1DC;
 	if (clipx2 > x2DC) clipx2 = x2DC;
 	if (clipy1 > y1DC) clipy1 = y1DC;
@@ -166,12 +166,17 @@ static void _GraphicsScreen_cellArrayOrImage (GraphicsScreen me, double **z_floa
 		#if cairo
 			long arrayWidth = clipx2 - clipx1;
 			long arrayHeight = clipy1 - clipy2;
-			trace ("arrayWidth %f, arrayHeight %f", (double) arrayWidth, (double) arrayHeight);
+			trace (U"arrayWidth ", arrayWidth, U", arrayHeight ", arrayHeight);
 			cairo_surface_t *sfc = cairo_image_surface_create (CAIRO_FORMAT_RGB24, arrayWidth, arrayHeight);
 			unsigned char *bits = cairo_image_surface_get_data (sfc);
 			int scanLineLength = cairo_image_surface_get_stride (sfc);
 			unsigned char grey [256];
-			trace ("image surface address %p, bits address %p, scanLineLength %d, numberOfGreys %d", sfc, bits, scanLineLength, sizeof(grey)/sizeof(*grey));
+			trace (
+				U"image surface address ", Melder_pointer (sfc),
+				U", bits address ", Melder_pointer (bits),
+				U", scanLineLength ", scanLineLength,
+				U", numberOfGreys ", sizeof (grey) / sizeof (*grey)
+			);
 			for (int igrey = 0; igrey < sizeof (grey) / sizeof (*grey); igrey++)
 				grey [igrey] = 255 - (unsigned char) (igrey * 255.0 / (sizeof (grey) / sizeof (*grey) - 1));
 		#elif win
@@ -196,7 +201,7 @@ static void _GraphicsScreen_cellArrayOrImage (GraphicsScreen me, double **z_floa
 			bitmapInfo. header.biClrUsed = 0;
 			bitmapInfo. header.biClrImportant = 0;
 			bitmap = CreateDIBSection (my d_gdiGraphicsContext /* ignored */, (CONST BITMAPINFO *) & bitmapInfo,
-				DIB_RGB_COLORS, (VOID **) & bits, NULL, 0);
+				DIB_RGB_COLORS, (VOID **) & bits, nullptr, 0);
 		#elif mac
 			long bytesPerRow = (clipx2 - clipx1) * 4;
 			Melder_assert (bytesPerRow > 0);
@@ -270,7 +275,7 @@ static void _GraphicsScreen_cellArrayOrImage (GraphicsScreen me, double **z_floa
 					} \
 				}
 		#else
-			#define ROW_START_ADDRESS  NULL
+			#define ROW_START_ADDRESS  nullptr
 			#define PUT_PIXEL
 		#endif
 		if (interpolate) {
@@ -388,9 +393,9 @@ static void _GraphicsScreen_cellArrayOrImage (GraphicsScreen me, double **z_floa
 			cairo_matrix_scale (& clip_trans, 1, -1);		// we painted in the reverse y-direction
 			cairo_matrix_translate (& clip_trans, - clipx1, - clipy1);
 			cairo_pattern_t *bitmap_pattern = cairo_pattern_create_for_surface (sfc);
-			trace ("bitmap pattern %p", bitmap_pattern);
+			trace (U"bitmap pattern ", Melder_pointer (bitmap_pattern));
 			if (cairo_status_t status = cairo_pattern_status (bitmap_pattern)) {
-				Melder_casual ("bitmap pattern status: %s", cairo_status_to_string (status));
+				Melder_casual (U"bitmap pattern status: ", Melder_peek8to32 (cairo_status_to_string (status)));
 			} else {
 				cairo_pattern_set_matrix (bitmap_pattern, & clip_trans);
 				cairo_save (my d_cairoGraphicsContext);
@@ -406,34 +411,34 @@ static void _GraphicsScreen_cellArrayOrImage (GraphicsScreen me, double **z_floa
 			//	bits, (CONST BITMAPINFO *) & bitmapInfo, DIB_RGB_COLORS, SRCCOPY);
 		#elif mac
 			CGImageRef image;
-			static CGColorSpaceRef colourSpace = NULL;
-			if (colourSpace == NULL) {
+			static CGColorSpaceRef colourSpace = nullptr;
+			if (! colourSpace) {
 				colourSpace = CGColorSpaceCreateWithName (kCGColorSpaceGenericRGB);   // used to be kCGColorSpaceUserRGB
-				Melder_assert (colourSpace != NULL);
+				Melder_assert (colourSpace != nullptr);
 			}
 			if (1) {
-				CGDataProviderRef dataProvider = CGDataProviderCreateWithData (NULL,
+				CGDataProviderRef dataProvider = CGDataProviderCreateWithData (nullptr,
 					imageData,
 					bytesPerRow * numberOfRows,
 					_mac_releaseDataCallback   // we need this because we cannot release the image data immediately after drawing,
 						// because in PDF files the imageData has to stay available through EndPage
 				);
-				Melder_assert (dataProvider != NULL);
+				Melder_assert (dataProvider != nullptr);
 				image = CGImageCreate (clipx2 - clipx1, numberOfRows,
-					8, 32, bytesPerRow, colourSpace, kCGImageAlphaNone, dataProvider, NULL, false, kCGRenderingIntentDefault);
+					8, 32, bytesPerRow, colourSpace, kCGImageAlphaNone, dataProvider, nullptr, false, kCGRenderingIntentDefault);
 				CGDataProviderRelease (dataProvider);
 			} else if (0) {
-				Melder_assert (CGBitmapContextCreate != NULL);
+				Melder_assert (CGBitmapContextCreate != nullptr);
 				CGContextRef bitmaptest = CGBitmapContextCreate (imageData, 100, 100,
 					8, 800, colourSpace, 0);
-				Melder_assert (bitmaptest != NULL);
+				Melder_assert (bitmaptest != nullptr);
 				CGContextRef bitmap = CGBitmapContextCreate (NULL/*imageData*/, clipx2 - clipx1, numberOfRows,
 					8, bytesPerRow, colourSpace, kCGImageAlphaLast);
-				Melder_assert (bitmap != NULL);
+				Melder_assert (bitmap != nullptr);
 				image = CGBitmapContextCreateImage (bitmap);
 				// release bitmap?
 			}
-			Melder_assert (image != NULL);
+			Melder_assert (image != nullptr);
 			GraphicsQuartz_initDraw (me);
 			CGContextDrawImage (my d_macGraphicsContext, CGRectMake (clipx1, clipy2, clipx2 - clipx1, clipy1 - clipy2), image);
 			GraphicsQuartz_exitDraw (me);
@@ -683,29 +688,29 @@ static void cellArrayOrImage (Graphics me, double **z_float, double_rgbt **z_rgb
 
 void Graphics_cellArray (Graphics me, double **z, long ix1, long ix2, double x1WC, double x2WC,
 	long iy1, long iy2, double y1WC, double y2WC, double minimum, double maximum)
-{ cellArrayOrImage (me, z, NULL, NULL, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, FALSE); }
+{ cellArrayOrImage (me, z, nullptr, nullptr, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, false); }
 
 void Graphics_cellArray_colour (Graphics me, double_rgbt **z, long ix1, long ix2, double x1WC, double x2WC,
 	long iy1, long iy2, double y1WC, double y2WC, double minimum, double maximum)
-{ cellArrayOrImage (me, NULL, z, NULL, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, FALSE); }
+{ cellArrayOrImage (me, nullptr, z, nullptr, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, false); }
 
 void Graphics_cellArray8 (Graphics me, unsigned char **z, long ix1, long ix2, double x1WC, double x2WC,
 	long iy1, long iy2, double y1WC, double y2WC, unsigned char minimum, unsigned char maximum)
-{ cellArrayOrImage (me, NULL, NULL, z, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, FALSE); }
+{ cellArrayOrImage (me, nullptr, nullptr, z, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, false); }
 
 void Graphics_image (Graphics me, double **z, long ix1, long ix2, double x1WC, double x2WC,
 	long iy1, long iy2, double y1WC, double y2WC, double minimum, double maximum)
-{ cellArrayOrImage (me, z, NULL, NULL, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, TRUE); }
+{ cellArrayOrImage (me, z, nullptr, nullptr, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, true); }
 
 void Graphics_image_colour (Graphics me, double_rgbt **z, long ix1, long ix2, double x1WC, double x2WC,
 	long iy1, long iy2, double y1WC, double y2WC, double minimum, double maximum)
-{ cellArrayOrImage (me, NULL, z, NULL, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, TRUE); }
+{ cellArrayOrImage (me, nullptr, z, nullptr, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, true); }
 
 void Graphics_image8 (Graphics me, unsigned char **z, long ix1, long ix2, double x1WC, double x2WC,
 	long iy1, long iy2, double y1WC, double y2WC, unsigned char minimum, unsigned char maximum)
-{ cellArrayOrImage (me, NULL, NULL, z, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, TRUE); }
+{ cellArrayOrImage (me, nullptr, nullptr, z, ix1, ix2, x1WC, x2WC, iy1, iy2, y1WC, y2WC, minimum, maximum, true); }
 
-static void _GraphicsScreen_imageFromFile (GraphicsScreen me, const wchar_t *relativeFileName, double x1, double x2, double y1, double y2) {
+static void _GraphicsScreen_imageFromFile (GraphicsScreen me, const char32 *relativeFileName, double x1, double x2, double y1, double y2) {
 	long x1DC = wdx (x1), x2DC = wdx (x2), y1DC = wdy (y1), y2DC = wdy (y2);
 	long width = x2DC - x1DC, height = my yIsZeroAtTheTop ? y1DC - y2DC : y2DC - y1DC;
 	#if 0
@@ -732,7 +737,7 @@ static void _GraphicsScreen_imageFromFile (GraphicsScreen me, const wchar_t *rel
 					z [iy] [ix]. transparency = photo -> d_transparency -> z [iy] [ix];
 				}
 			}
-			_cellArrayOrImage (me, NULL, z.peek(), NULL,
+			_cellArrayOrImage (me, nullptr, z.peek(), nullptr,
 				1, photo -> nx, x1DC, x2DC, 1, photo -> ny, y1DC, y2DC,
 				0.0, 1.0,
 				//wdx (my d_x1WC), wdx (my d_x2WC), wdy (my d_y1WC), wdy (my d_y2WC),   // in case of clipping
@@ -745,7 +750,7 @@ static void _GraphicsScreen_imageFromFile (GraphicsScreen me, const wchar_t *rel
 		if (my d_useGdiplus) {
 			structMelderFile file = { 0 };
 			Melder_relativePathToFile (relativeFileName, & file);
-			Gdiplus::Bitmap image (file. path);
+			Gdiplus::Bitmap image (Melder_peek32toW (file. path));
 			if (x1 == x2 && y1 == y2) {
 				width = image. GetWidth (), x1DC -= width / 2, x2DC = x1DC + width;
 				height = image. GetHeight (), y2DC -= height / 2, y1DC = y2DC + height;
@@ -765,16 +770,16 @@ static void _GraphicsScreen_imageFromFile (GraphicsScreen me, const wchar_t *rel
 		structMelderFile file = { 0 };
 		Melder_relativePathToFile (relativeFileName, & file);
 		char utf8 [500];
-		Melder_wcsTo8bitFileRepresentation_inline (file. path, utf8);
-		CFStringRef path = CFStringCreateWithCString (NULL, utf8, kCFStringEncodingUTF8);
-		CFURLRef url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, false);
+		Melder_str32To8bitFileRepresentation_inline (file. path, utf8);
+		CFStringRef path = CFStringCreateWithCString (nullptr, utf8, kCFStringEncodingUTF8);
+		CFURLRef url = CFURLCreateWithFileSystemPath (nullptr, path, kCFURLPOSIXPathStyle, false);
 		CFRelease (path);
-		CGImageSourceRef imageSource = CGImageSourceCreateWithURL (url, NULL);
+		CGImageSourceRef imageSource = CGImageSourceCreateWithURL (url, nullptr);
 		CFRelease (url);
-		if (imageSource != NULL) {
-			CGImageRef image = CGImageSourceCreateImageAtIndex (imageSource, 0, NULL);
+		if (imageSource) {
+			CGImageRef image = CGImageSourceCreateImageAtIndex (imageSource, 0, nullptr);
 			CFRelease (imageSource);
-			if (image != NULL) {
+			if (image) {
 				if (x1 == x2 && y1 == y2) {
 					width = CGImageGetWidth (image), x1DC -= width / 2, x2DC = x1DC + width;
 					height = CGImageGetHeight (image), y2DC -= height / 2, y1DC = y2DC + height;
@@ -801,12 +806,12 @@ static void _GraphicsScreen_imageFromFile (GraphicsScreen me, const wchar_t *rel
 	#endif
 }
 
-void Graphics_imageFromFile (Graphics me, const wchar_t *relativeFileName, double x1, double x2, double y1, double y2) {
+void Graphics_imageFromFile (Graphics me, const char32 *relativeFileName, double x1, double x2, double y1, double y2) {
 	if (my screen) {
 		_GraphicsScreen_imageFromFile (static_cast <GraphicsScreen> (me), relativeFileName, x1, x2, y1, y2);
 	}
 	if (my recording) {
-		char *txt_utf8 = Melder_peekWcsToUtf8 (relativeFileName);
+		char *txt_utf8 = Melder_peek32to8 (relativeFileName);
 		int length = strlen (txt_utf8) / sizeof (double) + 1;
 		op (IMAGE_FROM_FILE, 5 + length); put (x1); put (x2); put (y1); put (y2); sput (txt_utf8, length)
 	}
diff --git a/sys/Graphics_linesAndAreas.cpp b/sys/Graphics_linesAndAreas.cpp
index b2524d2..7fc3cfa 100644
--- a/sys/Graphics_linesAndAreas.cpp
+++ b/sys/Graphics_linesAndAreas.cpp
@@ -1,6 +1,6 @@
 /* Graphics_linesAndAreas.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@
 #define FUNCTIONS_ARE_CLIPPED  1
 
 #define LINE_WIDTH_IN_PIXELS(me)  ( my resolution > 192 ? my lineWidth * (my resolution / 192.0) : my lineWidth )
-#define ORDER_DC  { long temp; if (x1DC > x2DC) temp = x1DC, x1DC = x2DC, x2DC = temp; \
+#define ORDER_DC  { double temp; if (x1DC > x2DC) temp = x1DC, x1DC = x2DC, x2DC = temp; \
 	if (yIsZeroAtTheTop == (y2DC > y1DC)) temp = y1DC, y1DC = y2DC, y2DC = temp; }
 
 static void psPrepareLine (GraphicsPostscript me) {
@@ -59,10 +59,10 @@ static void psRevertLine (GraphicsPostscript me) {
 		}
 	#endif
 	static void cairoPrepareLine (GraphicsScreen me) {
-		if (my d_cairoGraphicsContext == NULL) return;
-		double dotted_line [] = { 2, 2 };
-		double dashed_line [] = { 6, 2 };
-		double dashed_dotted_line [] = { 6, 2, 2, 2 };
+		if (! my d_cairoGraphicsContext) return;
+		double dotted_line [] { 2.0, 2.0 };
+		double dashed_line [] { 6.0, 2.0 };
+		double dashed_dotted_line [] { 6.0, 2.0, 2.0, 2.0 };
 		cairo_save (my d_cairoGraphicsContext);
 		switch (my lineType) {
 			case Graphics_DOTTED:
@@ -78,9 +78,9 @@ static void psRevertLine (GraphicsPostscript me) {
 		cairo_set_line_width (my d_cairoGraphicsContext, my lineWidth);
 	}
 	static void cairoRevertLine (GraphicsScreen me) {
-		if (my d_cairoGraphicsContext == NULL) return;
+		if (! my d_cairoGraphicsContext) return;
 		if (my lineType >= Graphics_DOTTED) {
-			cairo_set_dash (my d_cairoGraphicsContext, NULL, 0, 0);
+			cairo_set_dash (my d_cairoGraphicsContext, nullptr, 0, 0);
 		}
 		cairo_restore (my d_cairoGraphicsContext);
 	}
@@ -97,7 +97,7 @@ static void psRevertLine (GraphicsPostscript me) {
 			brush. lbStyle = BS_SOLID;
 			brush. lbColor = my d_winForegroundColour;
 			brush. lbHatch = my lineType == Graphics_DRAWN ? 0 : my lineType == Graphics_DOTTED ? PS_DOT : my lineType == Graphics_DASHED ? PS_DASH : PS_DASHDOT;
-			newPen = ExtCreatePen (PS_GEOMETRIC, lineWidth_pixels, & brush, 0, NULL);
+			newPen = ExtCreatePen (PS_GEOMETRIC, lineWidth_pixels, & brush, 0, nullptr);
 		} else {
 			/*newPen = CreatePen (my lineType == Graphics_DRAWN ? PS_SOLID :
 				my lineType == Graphics_DOTTED ? PS_DOT : my lineType == Graphics_DASHED ? PS_DASH : PS_DASHDOT,
@@ -115,7 +115,7 @@ static void psRevertLine (GraphicsPostscript me) {
 	}
 #elif mac
 	static void quartzPrepareLine (GraphicsScreen me) {
-		CGContextSetLineJoin (my d_macGraphicsContext, kCGLineJoinRound);
+		CGContextSetLineJoin (my d_macGraphicsContext, kCGLineJoinBevel);   // much faster than kCGLineJoinRound
 		if (my duringXor) {
 			CGContextSetBlendMode (my d_macGraphicsContext, kCGBlendModeDifference);
 			CGContextSetAllowsAntialiasing (my d_macGraphicsContext, false);
@@ -125,6 +125,7 @@ static void psRevertLine (GraphicsPostscript me) {
 		}
 		double lineWidth_pixels = LINE_WIDTH_IN_PIXELS (me);
 		CGContextSetLineWidth (my d_macGraphicsContext, lineWidth_pixels);
+
 		CGFloat lengths [4];
 		if (my lineType == Graphics_DOTTED)
 			lengths [0] = my resolution > 192 ? my resolution / 100.0 : 2,
@@ -137,7 +138,7 @@ static void psRevertLine (GraphicsPostscript me) {
 			lengths [1] = my resolution > 192 ? my resolution / 50.0 + lineWidth_pixels : 2;
 			lengths [2] = my resolution > 192 ? my resolution / 100.0 : 2;
 			lengths [3] = my resolution > 192 ? my resolution / 50.0 + lineWidth_pixels : 2;
-		CGContextSetLineDash (my d_macGraphicsContext, 0.0, my lineType == Graphics_DRAWN ? NULL : lengths, my lineType == 0 ? 0 : my lineType == Graphics_DASHED_DOTTED ? 4 : 2);
+		CGContextSetLineDash (my d_macGraphicsContext, 0.0, my lineType == Graphics_DRAWN ? nullptr : lengths, my lineType == 0 ? 0 : my lineType == Graphics_DASHED_DOTTED ? 4 : 2);
 	}
 	static void quartzRevertLine (GraphicsScreen me) {
 		if (my duringXor) {
@@ -167,7 +168,7 @@ void structGraphicsScreen :: v_polyline (long numberOfPoints, double *xyDC, bool
 				gdk_flush ();
 			#endif
 		} else {
-			if (our d_cairoGraphicsContext == NULL) return;
+			if (our d_cairoGraphicsContext == nullptr) return;
 			cairoPrepareLine (this);
 			// cairo_new_path (d_cairoGraphicsContext); // move_to() automatically creates a new path
 			cairo_move_to (our d_cairoGraphicsContext, xyDC [0], xyDC [1]);
@@ -241,7 +242,7 @@ void structGraphicsScreen :: v_polyline (long numberOfPoints, double *xyDC, bool
 		GraphicsQuartz_initDraw (this);
 		quartzPrepareLine (this);
 		CGContextBeginPath (our d_macGraphicsContext);
-		trace ("starting point %.17g %.17g", xyDC [0], xyDC [1]);
+		trace (U"starting point ", xyDC [0], U" ", xyDC [1]);
 		CGContextMoveToPoint (our d_macGraphicsContext, xyDC [0], xyDC [1]);   // starts a new subpath
 		for (long i = 1; i < numberOfPoints; i ++) {
 			CGContextAddLineToPoint (our d_macGraphicsContext, xyDC [i + i], xyDC [i + i + 1]);
@@ -270,7 +271,7 @@ void structGraphicsPostscript :: v_polyline (long numberOfPoints, double *xyDC,
 
 void structGraphicsScreen :: v_fillArea (long numberOfPoints, double *xyDC) {
 	#if cairo
-		if (our d_cairoGraphicsContext == NULL) return;
+		if (our d_cairoGraphicsContext == nullptr) return;
 		// cairo_new_path (our d_cairoGraphicsContext); // move_to() automatically creates a new path
 		cairo_move_to (our d_cairoGraphicsContext, xyDC [0], xyDC [1]);
 		for (long i = 1; i < numberOfPoints; i ++)
@@ -280,7 +281,7 @@ void structGraphicsScreen :: v_fillArea (long numberOfPoints, double *xyDC) {
 	#elif win
 		MY_BRUSH
 		BeginPath (our d_gdiGraphicsContext);
-		MoveToEx (our d_gdiGraphicsContext, xyDC [0], xyDC [1], NULL);
+		MoveToEx (our d_gdiGraphicsContext, xyDC [0], xyDC [1], nullptr);
 		for (long i = 1; i < numberOfPoints; i ++)
 			LineTo (our d_gdiGraphicsContext, xyDC [i + i], xyDC [i + i + 1]);
 		EndPath (our d_gdiGraphicsContext);
@@ -313,16 +314,16 @@ void structGraphicsPostscript :: v_fillArea (long numberOfPoints, double *xyDC)
 void structGraphicsScreen :: v_rectangle (double x1DC, double x2DC, double y1DC, double y2DC) {
 	ORDER_DC
 	#if cairo
-		if (d_cairoGraphicsContext == NULL) return;
+		if (! d_cairoGraphicsContext) return;
 		double width = x2DC - x1DC, height = y1DC - y2DC;
-		if (width <= 0 || height <= 0) return;
+		if (width <= 0.0 || height <= 0.0) return;
 		cairoPrepareLine (this);
 		cairo_rectangle (d_cairoGraphicsContext, x1DC, y2DC, width, height);
 		cairo_stroke (d_cairoGraphicsContext);
 		cairoRevertLine (this);
 	#elif win
 		winPrepareLine (this);
-		Rectangle (our d_gdiGraphicsContext, x1DC, y2DC, x2DC + 1, y1DC + 1);
+		Rectangle (our d_gdiGraphicsContext, x1DC, y2DC, x2DC + 1.0, y1DC + 1.0);
 		DEFAULT
 	#elif mac
 		GraphicsQuartz_initDraw (this);
@@ -350,16 +351,17 @@ void structGraphicsPostscript :: v_rectangle (double x1DC, double x2DC, double y
 void structGraphicsScreen :: v_fillRectangle (double x1DC, double x2DC, double y1DC, double y2DC) {
 	ORDER_DC
 	#if cairo
-		if (d_cairoGraphicsContext == NULL) return;	
-		int width = x2DC - x1DC + 1, height = y1DC - y2DC + 1;
-		if (width <= 0 || height <= 0) return;
-		cairo_rectangle (d_cairoGraphicsContext, x1DC, y2DC, width, height);
+		if (! d_cairoGraphicsContext) return;
+		double width = x2DC - x1DC + 1.0, height = y1DC - y2DC + 1.0;
+		if (width <= 0.0 || height <= 0.0) return;
+		trace (U"x1DC ", x1DC, U", x2DC ", x2DC, U", y1DC ", y1DC, U", y2DC ", y2DC);
+		cairo_rectangle (d_cairoGraphicsContext, round (x1DC), round (y2DC), round (width), round (height));
 		cairo_fill (d_cairoGraphicsContext);
 	#elif win
 		RECT rect;
 		rect. left = x1DC, rect. right = x2DC, rect. top = y2DC, rect. bottom = y1DC;   /* Superfluous? */
 		MY_BRUSH
-		Rectangle (d_gdiGraphicsContext, x1DC, y2DC, x2DC + 1, y1DC + 1);
+		Rectangle (d_gdiGraphicsContext, x1DC, y2DC, x2DC + 1.0, y1DC + 1.0);
 		DEFAULT
 	#elif mac
 		GraphicsQuartz_initDraw (this);
@@ -388,21 +390,21 @@ void structGraphicsScreen :: v_circle (double xDC, double yDC, double rDC) {
 		if (duringXor) {
 			#if ALLOW_GDK_DRAWING
 				gdkPrepareLine (this);
-				gdk_draw_arc (d_window, d_gdkGraphicsContext, FALSE, xDC - rDC, yDC - rDC, rDC + rDC, rDC + rDC, 0, 360 * 64);
+				gdk_draw_arc (d_window, d_gdkGraphicsContext, false, xDC - rDC, yDC - rDC, rDC + rDC, rDC + rDC, 0, 360 * 64);
 				gdkRevertLine (this);
 				gdk_flush ();
 			#endif
 		} else {
-			if (d_cairoGraphicsContext == NULL) return;
+			if (! d_cairoGraphicsContext) return;
 			cairoPrepareLine (this);
 			cairo_new_path (d_cairoGraphicsContext);
-			cairo_arc (d_cairoGraphicsContext, xDC, yDC, rDC, 0.0, 2 * M_PI);
+			cairo_arc (d_cairoGraphicsContext, xDC, yDC, rDC, 0.0, 2.0 * M_PI);
 			cairo_stroke (d_cairoGraphicsContext);
 			cairoRevertLine (this);
 		}
 	#elif win
 		winPrepareLine (this);
-		Ellipse (d_gdiGraphicsContext, xDC - rDC, yDC - rDC, xDC + rDC + 1, yDC + rDC + 1);
+		Ellipse (d_gdiGraphicsContext, xDC - rDC, yDC - rDC, xDC + rDC + 1.0, yDC + rDC + 1.0);
 		DEFAULT
 	#elif mac
 		GraphicsQuartz_initDraw (this);
@@ -424,7 +426,7 @@ void structGraphicsPostscript :: v_circle (double xDC, double yDC, double rDC) {
 void structGraphicsScreen :: v_ellipse (double x1DC, double x2DC, double y1DC, double y2DC) {
 	ORDER_DC
 	#if cairo
-		if (d_cairoGraphicsContext == NULL) return;
+		if (! d_cairoGraphicsContext) return;
 		cairoPrepareLine (this);
 		cairo_new_path (d_cairoGraphicsContext);
 		cairo_save (d_cairoGraphicsContext);
@@ -472,7 +474,7 @@ void structGraphicsPostscript :: v_ellipse (double x1DC, double x2DC, double y1D
 
 void structGraphicsScreen :: v_arc (double xDC, double yDC, double rDC, double fromAngle, double toAngle) {
 	#if cairo
-		if (d_cairoGraphicsContext == NULL) return;
+		if (! d_cairoGraphicsContext) return;
 		cairoPrepareLine (this);
 		cairo_new_path (d_cairoGraphicsContext);
 		cairo_arc (d_cairoGraphicsContext, xDC, yDC, rDC, -toAngle * (M_PI / 180.0), -fromAngle * (M_PI / 180.0));
@@ -507,7 +509,7 @@ void structGraphicsPostscript :: v_arc (double xDC, double yDC, double rDC, doub
 
 void structGraphicsScreen :: v_fillCircle (double xDC, double yDC, double rDC) {
 	#if cairo
-		if (d_cairoGraphicsContext == NULL) return;
+		if (! d_cairoGraphicsContext) return;
 		cairo_new_path (d_cairoGraphicsContext);
 		cairo_arc (d_cairoGraphicsContext, xDC, yDC, rDC, 0, 2 * M_PI);
 		cairo_fill (d_cairoGraphicsContext);
@@ -516,7 +518,7 @@ void structGraphicsScreen :: v_fillCircle (double xDC, double yDC, double rDC) {
 		/*
 		 * NT cannot fill circles that span less than five pixels...
 		 */
-		Ellipse (d_gdiGraphicsContext, xDC - rDC - 1, yDC - rDC - 1, xDC + rDC + 1, yDC + rDC + 1);
+		Ellipse (d_gdiGraphicsContext, xDC - rDC - 1.0, yDC - rDC - 1.0, xDC + rDC + 1.0, yDC + rDC + 1.0);
 		DEFAULT
 	#elif mac
 		GraphicsQuartz_initDraw (this);
@@ -537,17 +539,17 @@ void structGraphicsPostscript :: v_fillCircle (double xDC, double yDC, double rD
 void structGraphicsScreen :: v_fillEllipse (double x1DC, double x2DC, double y1DC, double y2DC) {
 	ORDER_DC
 	#if cairo
-		if (d_cairoGraphicsContext == NULL) return;	
+		if (! d_cairoGraphicsContext) return;
 		cairo_new_path (d_cairoGraphicsContext);
 		cairo_save (d_cairoGraphicsContext);
 		cairo_translate (d_cairoGraphicsContext, 0.5 * (x2DC + x1DC), 0.5 * (y2DC + y1DC));
 		cairo_scale (d_cairoGraphicsContext, 0.5 * (x2DC - x1DC), 0.5 * (y2DC - y1DC));
-		cairo_arc (d_cairoGraphicsContext, 0.0, 0.0, 1.0, 0.0, 2 * M_PI);
+		cairo_arc (d_cairoGraphicsContext, 0.0, 0.0, 1.0, 0.0, 2.0 * M_PI);
 		cairo_restore (d_cairoGraphicsContext);
 		cairo_fill (d_cairoGraphicsContext);
 	#elif win
 		MY_BRUSH
-		Ellipse (d_gdiGraphicsContext, x1DC, y2DC, x2DC + 1, y1DC + 1);
+		Ellipse (d_gdiGraphicsContext, x1DC, y2DC, x2DC + 1.0, y1DC + 1.0);
 		DEFAULT
 	#elif mac
 		GraphicsQuartz_initDraw (this);
@@ -569,7 +571,7 @@ void structGraphicsScreen :: v_fillEllipse (double x1DC, double x2DC, double y1D
 
 void structGraphicsPostscript :: v_fillEllipse (double x1DC, double x2DC, double y1DC, double y2DC) {
 	d_printf (d_file, "gsave %.7g %.7g translate %.7g %.7g scale N 0 0 1 FC grestore\n",
-		(x2DC + x1DC) / 2, (y2DC + y1DC) / 2, (x2DC - x1DC) / 2, (y2DC - y1DC) / 2);
+		(x2DC + x1DC) / 2.0, (y2DC + y1DC) / 2.0, (x2DC - x1DC) / 2.0, (y2DC - y1DC) / 2.0);
 }
 
 void structGraphicsScreen :: v_button (double x1DC, double x2DC, double y1DC, double y2DC) {
@@ -666,7 +668,7 @@ void structGraphicsScreen :: v_button (double x1DC, double x2DC, double y1DC, do
             }
         }
 		CGContextSetAllowsAntialiasing (d_macGraphicsContext, true);
-		CGContextSetLineDash (d_macGraphicsContext, 0, NULL, 0);
+		CGContextSetLineDash (d_macGraphicsContext, 0, nullptr, 0);
 		GraphicsQuartz_exitDraw (this);
     #elif win
         RECT rect;
@@ -689,25 +691,25 @@ void structGraphics :: v_roundedRectangle (double x1DC, double x2DC, double y1DC
 	xyDC [2] = x2DC - r;
 	xyDC [3] = y1DC;
 	v_polyline (2, xyDC, false);
-	v_arc (x2DC - r, y1DC + dy, r, -90, 0);
+	v_arc (x2DC - r, y1DC + dy, r, -90.0, 0.0);
 	xyDC [0] = x2DC;
 	xyDC [1] = y1DC + dy;
 	xyDC [2] = x2DC;
 	xyDC [3] = y2DC - dy;
 	v_polyline (2, xyDC, false);
-	v_arc (x2DC - r, y2DC - dy, r, 0, 90);
+	v_arc (x2DC - r, y2DC - dy, r, 0.0, 90.0);
 	xyDC [0] = x2DC - r;
 	xyDC [1] = y2DC;
 	xyDC [2] = x1DC + r;
 	xyDC [3] = y2DC;
 	v_polyline (2, xyDC, false);
-	v_arc (x1DC + r, y2DC - dy, r, 90, 180);
+	v_arc (x1DC + r, y2DC - dy, r, 90.0, 180.0);
 	xyDC [0] = x1DC;
 	xyDC [1] = y2DC - dy;
 	xyDC [2] = x1DC;
 	xyDC [3] = y1DC + dy;
 	v_polyline (2, xyDC, false);
-	v_arc (x1DC + r, y1DC + dy, r, 180, 270);
+	v_arc (x1DC + r, y1DC + dy, r, 180.0, 270.0);
 }
 
 void structGraphicsScreen :: v_roundedRectangle (double x1DC, double x2DC, double y1DC, double y2DC, double r) {
@@ -715,7 +717,7 @@ void structGraphicsScreen :: v_roundedRectangle (double x1DC, double x2DC, doubl
 		double dy = yIsZeroAtTheTop ? - r : r, xyDC [4];
 		ORDER_DC
 		winPrepareLine (this);
-		RoundRect (d_gdiGraphicsContext, x1DC, y2DC, x2DC + 1, y1DC + 1, r + r, r + r);
+		RoundRect (d_gdiGraphicsContext, x1DC, y2DC, x2DC + 1.0, y1DC + 1.0, r + r, r + r);
 		DEFAULT
 		return;
 	#else
@@ -795,7 +797,7 @@ void Graphics_polyline_closed (Graphics me, long numberOfPoints, double *xWC, do
 
 void Graphics_line (Graphics me, double x1WC, double y1WC, double x2WC, double y2WC) {
 	double xyDC [4];
-	trace ("%.17g %.17g %.17g %.17g", x1WC, y1WC, x2WC, y2WC);
+	trace (x1WC, U" ", y1WC, U" ", x2WC, U" ", y2WC);
 	xyDC [0] = wdx (x1WC);
 	xyDC [1] = wdy (y1WC);
 	xyDC [2] = wdx (x2WC);
@@ -833,7 +835,7 @@ void Graphics_fillArea (Graphics me, long numberOfPoints, double *xWC, double *y
 	long x1DC, x2DC; \
 	long clipy1 = wdy (my d_y1WC), clipy2 = wdy (my d_y2WC); \
 	double dx, offsetX, translation, scale; \
-	long i, n = ix2 - ix1 + 1; \
+	long n = ix2 - ix1 + 1; \
  \
 	if (ix2 <= ix1 || my scaleX == 0.0) return; \
  \
@@ -851,7 +853,7 @@ void Graphics_fillArea (Graphics me, long numberOfPoints, double *xWC, double *y
 		TYPE lastMini; \
 		if (numberOfPointsActuallyDrawn < 1) return; \
 		xyDC = Melder_malloc_f (double, 2 * numberOfPointsActuallyDrawn); \
-		for (i = 0; i < numberOfPixels; i ++) { \
+		for (long i = 0; i < numberOfPixels; i ++) { \
 			long j, jmin = ix1 + i / scale, jmax = ix1 + (i + 1) / scale; \
 			TYPE mini, maxi; \
 			long minDC, maxDC; \
@@ -911,7 +913,7 @@ void Graphics_fillArea (Graphics me, long numberOfPoints, double *xWC, double *y
 		Melder_free (xyDC); \
 	} else {  /* Normal. */  \
 		double *xyDC = Melder_malloc_f (double, 2 * n); \
-		for (i = 0; i < n; i ++) { \
+		for (long i = 0; i < n; i ++) { \
 			long ix = ix1 + i; \
 			long value = wdy (yWC [STAGGER (ix)]); \
 			xyDC [i + i] = translation + ix * scale; \
@@ -1061,21 +1063,21 @@ void structGraphics :: v_arrowHead (double xDC, double yDC, double angle) {
 
 void structGraphicsScreen :: v_arrowHead (double xDC, double yDC, double angle) {
 	#if cairo
-		if (our d_cairoGraphicsContext == NULL) return;
-		double size = 10.0 * our resolution * our arrowSize / 75.0; // TODO: die 75 zou dat niet de scherm resolutie moeten worden?
+		if (! our d_cairoGraphicsContext) return;
+		double size = 10.0 * our resolution * our arrowSize / 75.0;   // TODO: die 75 zou dat niet de scherm resolutie moeten worden?
 		cairo_new_path (our d_cairoGraphicsContext);
-		cairo_move_to (our d_cairoGraphicsContext, xDC + cos ((angle + 160) * NUMpi / 180) * size, yDC - sin ((angle + 160) * NUMpi / 180) * size);
+		cairo_move_to (our d_cairoGraphicsContext, xDC + cos ((angle + 160.0) * NUMpi / 180.0) * size, yDC - sin ((angle + 160.0) * NUMpi / 180.0) * size);
 		cairo_line_to (our d_cairoGraphicsContext, xDC, yDC);
-		cairo_line_to (our d_cairoGraphicsContext, xDC + cos ((angle - 160) * NUMpi / 180) * size, yDC - sin ((angle - 160) * NUMpi / 180) * size);
+		cairo_line_to (our d_cairoGraphicsContext, xDC + cos ((angle - 160.0) * NUMpi / 180.0) * size, yDC - sin ((angle - 160.0) * NUMpi / 180.0) * size);
 		cairo_close_path (our d_cairoGraphicsContext);
 		cairo_fill (our d_cairoGraphicsContext);
 	#elif win
 		double size = 10.0 * our resolution * our arrowSize / 72.0;
 		MY_BRUSH
 		BeginPath (our d_gdiGraphicsContext);
-		MoveToEx (our d_gdiGraphicsContext, xDC + cos ((angle + 160) * NUMpi / 180) * size, yDC - sin ((angle + 160) * NUMpi / 180) * size, NULL);
+		MoveToEx (our d_gdiGraphicsContext, xDC + cos ((angle + 160.0) * NUMpi / 180.0) * size, yDC - sin ((angle + 160.0) * NUMpi / 180.0) * size, nullptr);
 		LineTo (our d_gdiGraphicsContext, xDC, yDC);
-		LineTo (our d_gdiGraphicsContext, xDC + cos ((angle - 160) * NUMpi / 180) * size, yDC - sin ((angle - 160) * NUMpi / 180) * size);
+		LineTo (our d_gdiGraphicsContext, xDC + cos ((angle - 160.0) * NUMpi / 180.0) * size, yDC - sin ((angle - 160.0) * NUMpi / 180.0) * size);
 		EndPath (our d_gdiGraphicsContext);
 		FillPath (our d_gdiGraphicsContext);
 		DEFAULT
@@ -1086,10 +1088,10 @@ void structGraphicsScreen :: v_arrowHead (double xDC, double yDC, double angle)
 		CGContextSaveGState (our d_macGraphicsContext);
 		CGContextBeginPath (our d_macGraphicsContext);
 		CGContextTranslateCTM (our d_macGraphicsContext, xDC, yDC);
-		CGContextRotateCTM (our d_macGraphicsContext, - angle * NUMpi / 180);
+		CGContextRotateCTM (our d_macGraphicsContext, - angle * NUMpi / 180.0);
 		CGContextMoveToPoint (our d_macGraphicsContext, 0.0, 0.0);
 		double size = 10.0 * our resolution * our arrowSize / 72.0;
-		double radius = our resolution * our arrowSize / 30;
+		double radius = our resolution * our arrowSize / 30.0;
 		CGContextAddArc (our d_macGraphicsContext, - size, 0.0, radius, - NUMpi / 3.0, NUMpi / 3.0, 0);
 		CGContextAddLineToPoint (our d_macGraphicsContext, 0.0, 0.0);
 		CGContextFillPath (our d_macGraphicsContext);
@@ -1099,34 +1101,34 @@ void structGraphicsScreen :: v_arrowHead (double xDC, double yDC, double angle)
 }
 
 void structGraphicsPostscript :: v_arrowHead (double xDC, double yDC, double angle) {
-	double length = resolution * arrowSize / 10, radius = resolution * arrowSize / 30;
+	double length = resolution * arrowSize / 10.0, radius = resolution * arrowSize / 30.0;
 	d_printf (d_file, "gsave %.7g %.7g translate %.7g rotate\n"
 		"N 0 0 M %.7g 0 %.7g -60 60 arc closepath fill grestore\n", xDC, yDC, angle, - length, radius);
 }
 
 void Graphics_arrow (Graphics me, double x1WC, double y1WC, double x2WC, double y2WC) {
-	double angle = (180.0 / NUMpi) * atan2 ((wdy (y2WC) - wdy (y1WC)) * (my yIsZeroAtTheTop ? -1 : 1), wdx (x2WC) - wdx (x1WC));
+	double angle = (180.0 / NUMpi) * atan2 ((wdy (y2WC) - wdy (y1WC)) * (my yIsZeroAtTheTop ? -1.0 : 1.0), wdx (x2WC) - wdx (x1WC));
 	double size = my screen ? 10.0 * my resolution * my arrowSize / 72.0 : my resolution * my arrowSize / 10;
 	double xyDC [4];
 	xyDC [0] = wdx (x1WC);
 	xyDC [1] = wdy (y1WC);
-	xyDC [2] = wdx (x2WC) + (my screen ? 0.7 : 0.6) * cos ((angle - 180) * NUMpi / 180) * size;
-	xyDC [3] = wdy (y2WC) + (my yIsZeroAtTheTop ? -1.0 : 1.0) * (my screen ? 0.7 : 0.6) * sin ((angle - 180) * NUMpi / 180) * size;
+	xyDC [2] = wdx (x2WC) + (my screen ? 0.7 : 0.6) * cos ((angle - 180.0) * NUMpi / 180.0) * size;
+	xyDC [3] = wdy (y2WC) + (my yIsZeroAtTheTop ? -1.0 : 1.0) * (my screen ? 0.7 : 0.6) * sin ((angle - 180.0) * NUMpi / 180.0) * size;
 	my v_polyline (2, xyDC, false);
 	my v_arrowHead (wdx (x2WC), wdy (y2WC), angle);
 	if (my recording) { op (ARROW, 4); put (x1WC); put (y1WC); put (x2WC); put (y2WC); }
 }
 
 void Graphics_doubleArrow (Graphics me, double x1WC, double y1WC, double x2WC, double y2WC) {
-	double angle = (180.0 / NUMpi) * atan2 ((wdy (y2WC) - wdy (y1WC)) * (my yIsZeroAtTheTop ? -1 : 1), wdx (x2WC) - wdx (x1WC));
-	double size = my screen ? 10.0 * my resolution * my arrowSize / 72.0 : my resolution * my arrowSize / 10;
+	double angle = (180.0 / NUMpi) * atan2 ((wdy (y2WC) - wdy (y1WC)) * (my yIsZeroAtTheTop ? -1.0 : 1.0), wdx (x2WC) - wdx (x1WC));
+	double size = my screen ? 10.0 * my resolution * my arrowSize / 72.0 : my resolution * my arrowSize / 10.0;
 	double xyDC [4];
-	xyDC [0] = wdx (x1WC) + (my screen ? 0.7 : 0.6) * cos (angle * NUMpi / 180) * size;
-	xyDC [1] = wdy (y1WC) + (my yIsZeroAtTheTop ? -1.0 : 1.0) * (my screen ? 0.7 : 0.6) * sin (angle * NUMpi / 180) * size;
-	xyDC [2] = wdx (x2WC) + (my screen ? 0.7 : 0.6) * cos ((angle - 180) * NUMpi / 180) * size;
-	xyDC [3] = wdy (y2WC) + (my yIsZeroAtTheTop ? -1.0 : 1.0) * (my screen ? 0.7 : 0.6) * sin ((angle - 180) * NUMpi / 180) * size;
+	xyDC [0] = wdx (x1WC) + (my screen ? 0.7 : 0.6) * cos (angle * NUMpi / 180.0) * size;
+	xyDC [1] = wdy (y1WC) + (my yIsZeroAtTheTop ? -1.0 : 1.0) * (my screen ? 0.7 : 0.6) * sin (angle * NUMpi / 180.0) * size;
+	xyDC [2] = wdx (x2WC) + (my screen ? 0.7 : 0.6) * cos ((angle - 180) * NUMpi / 180.0) * size;
+	xyDC [3] = wdy (y2WC) + (my yIsZeroAtTheTop ? -1.0 : 1.0) * (my screen ? 0.7 : 0.6) * sin ((angle - 180.0) * NUMpi / 180.0) * size;
 	my v_polyline (2, xyDC, false);
-	my v_arrowHead (wdx (x1WC), wdy (y1WC), angle + 180);
+	my v_arrowHead (wdx (x1WC), wdy (y1WC), angle + 180.0);
 	//my v_polyline (2, xyDC);
 	my v_arrowHead (wdx (x2WC), wdy (y2WC), angle);
 	if (my recording) { op (DOUBLE_ARROW, 4); put (x1WC); put (y1WC); put (x2WC); put (y2WC); }
@@ -1138,10 +1140,10 @@ void Graphics_arcArrow (Graphics me, double xWC, double yWC, double rWC,
 	my v_arc (wdx (xWC), wdy (yWC), my scaleX * rWC, fromAngle, toAngle);
 	if (arrowAtStart) my v_arrowHead (
 		wdx (xWC + rWC * cos (fromAngle * (NUMpi / 180.0))),
-		wdy (yWC + rWC * sin (fromAngle * (NUMpi / 180.0))), fromAngle - 90);
+		wdy (yWC + rWC * sin (fromAngle * (NUMpi / 180.0))), fromAngle - 90.0);
 	if (arrowAtEnd) my v_arrowHead (
 		wdx (xWC + rWC * cos (toAngle * (NUMpi / 180.0))),
-		wdy (yWC + rWC * sin (toAngle * (NUMpi / 180.0))), toAngle + 90);
+		wdy (yWC + rWC * sin (toAngle * (NUMpi / 180.0))), toAngle + 90.0);
 	if (my recording)
 		{ op (ARC_ARROW, 7); put (xWC); put (yWC); put (rWC);
 		  put (fromAngle); put (toAngle); put (arrowAtStart); put (arrowAtEnd); }
diff --git a/sys/Graphics_mouse.cpp b/sys/Graphics_mouse.cpp
index a91ba74..fc1a2bc 100644
--- a/sys/Graphics_mouse.cpp
+++ b/sys/Graphics_mouse.cpp
@@ -59,7 +59,7 @@ bool Graphics_mouseStillDown (Graphics me) {
 void structGraphicsScreen :: v_getMouseLocation (double *xWC, double *yWC) {
 	#if cairo
 		gint xDC, yDC;
-		gdk_window_get_pointer (d_window, & xDC, & yDC, NULL);
+		gdk_window_get_pointer (d_window, & xDC, & yDC, nullptr);
 		Graphics_DCtoWC (this, xDC, yDC, xWC, yWC);
 	#elif cocoa
         NSPoint mouseLoc = [[d_macView window]  mouseLocationOutsideOfEventStream];
@@ -68,7 +68,7 @@ void structGraphicsScreen :: v_getMouseLocation (double *xWC, double *yWC) {
         Graphics_DCtoWC (this, mouseLoc. x, mouseLoc. y, xWC, yWC);
 	#elif win
 		POINT pos;
-		if (! GetCursorPos (& pos)) { Melder_warning (L"Cannot find the location of the mouse."); return; }
+		if (! GetCursorPos (& pos)) { Melder_warning (U"Cannot find the location of the mouse."); return; }
 		ScreenToClient (d_winWindow, & pos);
 		Graphics_DCtoWC (this, pos. x, pos. y, xWC, yWC);
 	#elif mac
diff --git a/sys/Graphics_record.cpp b/sys/Graphics_record.cpp
index 0568ba1..e48d63a 100644
--- a/sys/Graphics_record.cpp
+++ b/sys/Graphics_record.cpp
@@ -1,6 +1,6 @@
 /* Graphics_record.cpp
  *
- * Copyright (C) 1992-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,7 +36,7 @@
 
 double * _Graphics_check (Graphics me, long number) {
 	static bool messageHasAlreadyBeenShownOnce = false;
-	double *result = NULL;
+	double *result = nullptr;
 	double *record = my record;
 	long nrecord = my nrecord;
 	if (nrecord == 0) {
@@ -48,10 +48,10 @@ double * _Graphics_check (Graphics me, long number) {
 				Melder_clearError ();
 			} else {
 				messageHasAlreadyBeenShownOnce = true;
-				Melder_flushError ("_Graphics_growRecorder: out of memory.\n"
-					"This message will not show up on future occasions.");   // because of loop danger when redrawing
+				Melder_flushError (U"_Graphics_growRecorder: out of memory.\n"
+					U"This message will not show up on future occasions.");   // because of loop danger when redrawing
 			}
-			return NULL;
+			return nullptr;
 		}
 		my record = record; my nrecord = nrecord;
 	}
@@ -64,10 +64,10 @@ double * _Graphics_check (Graphics me, long number) {
 				Melder_clearError ();
 			} else {
 				messageHasAlreadyBeenShownOnce = true;
-				Melder_flushError ("_Graphics_growRecorder: out of memory.\n"
-					"This message will not show up on future occasions.");   // because of loop danger when redrawing
+				Melder_flushError (U"_Graphics_growRecorder: out of memory.\n"
+					U"This message will not show up on future occasions.");   // because of loop danger when redrawing
 			}
-			return NULL;
+			return nullptr;
 		}
 		my record = record; my nrecord = nrecord;
 	}
@@ -122,7 +122,7 @@ void Graphics_play (Graphics me, Graphics thee) {
 			}  break;
 			case TEXT:
 			{  double x = get, y = get; long length = get; char *text_utf8 = sget (length);
-				Graphics_text (thee, x, y, Melder_peekUtf8ToWcs (text_utf8));
+				Graphics_text (thee, x, y, Melder_peek8to32 (text_utf8));
 			}  break;
 			case POLYLINE:
 			{  long n = get; double *x = mget (n), *y = mget (n);
@@ -345,7 +345,7 @@ void Graphics_play (Graphics me, Graphics thee) {
 			} break;
 			case IMAGE_FROM_FILE:
 			{  double x1 = get, x2 = get, y1 = get, y2 = get; long length = get; char *text_utf8 = sget (length);
-				Graphics_imageFromFile (thee, Melder_peekUtf8ToWcs (text_utf8), x1, x2, y1, y2);
+				Graphics_imageFromFile (thee, Melder_peek8to32 (text_utf8), x1, x2, y1, y2);
 			}  break;
 			case POLYLINE_CLOSED:
 			{  long n = get; double *x = mget (n), *y = mget (n);
@@ -391,7 +391,7 @@ void Graphics_play (Graphics me, Graphics thee) {
 			}  break;
 			default:
 				my recording = wasRecording;
-				Melder_flushError ("Graphics_play: unknown opcode (%d).\n%f %f", opcode, p [-1], p [1]);
+				Melder_flushError (U"Graphics_play: unknown opcode (", opcode, U").\n", p [-1], U" ", p [1]);
 				return;
 		}
 	}
@@ -425,7 +425,7 @@ void Graphics_writeRecordings (Graphics me, FILE *f) {
 			binputr4 (get, f);   // length
 			Melder_assert (sizeof (double) == 8);
 			if ((long) fwrite (++ p, 8, numberOfArguments - 3, f) < numberOfArguments - 3)   // text
-				Melder_throw ("Error writing graphics recordings.");
+				Melder_throw (U"Error writing graphics recordings.");
 			p += numberOfArguments - 4;
 		} else if (opcode == IMAGE_FROM_FILE) {
 			binputr4 (get, f);   // x1
@@ -435,7 +435,7 @@ void Graphics_writeRecordings (Graphics me, FILE *f) {
 			binputr4 (get, f);   // length
 			Melder_assert (sizeof (double) == 8);
 			if ((long) fwrite (++ p, 8, numberOfArguments - 5, f) < numberOfArguments - 5)   // text
-				Melder_throw ("Error writing graphics recordings.");
+				Melder_throw (U"Error writing graphics recordings.");
 			p += numberOfArguments - 6;
 		} else {
 			for (long i = numberOfArguments; i > 0; i --) binputr4 (get, f);
@@ -446,7 +446,8 @@ void Graphics_writeRecordings (Graphics me, FILE *f) {
 void Graphics_readRecordings (Graphics me, FILE *f) {
 	long old_irecord = my irecord;
 	long added_irecord = 0;
-	double *p = NULL, *endp = NULL;
+	double* p = nullptr;
+	double* endp = nullptr;
 	signed long numberOfArguments = 0;
 	int opcode = 0;
 	try {
@@ -468,7 +469,7 @@ void Graphics_readRecordings (Graphics me, FILE *f) {
 				put (bingetr4 (f));   // y
 				put (bingetr4 (f));   // length
 				if (fread (++ p, 8, (size_t) numberOfArguments - 3, f) < (size_t) numberOfArguments - 3)   // text
-					Melder_throw ("Error reading graphics recordings.");
+					Melder_throw (U"Error reading graphics recordings.");
 				p += numberOfArguments - 4;
 			} else if (opcode == IMAGE_FROM_FILE) {
 				put (bingetr4 (f));   // x1
@@ -477,7 +478,7 @@ void Graphics_readRecordings (Graphics me, FILE *f) {
 				put (bingetr4 (f));   // y2
 				put (bingetr4 (f));   // length
 				if (fread (++ p, 8, (size_t) numberOfArguments - 5, f) < (size_t) numberOfArguments - 5)   // text
-					Melder_throw ("Error reading graphics recordings.");
+					Melder_throw (U"Error reading graphics recordings.");
 				p += numberOfArguments - 6;
 			} else {
 				for (long i = numberOfArguments; i > 0; i --) put (bingetr4 (f));
@@ -485,8 +486,8 @@ void Graphics_readRecordings (Graphics me, FILE *f) {
 		}   
 	} catch (MelderError) {
 		my irecord = old_irecord;
-		Melder_throw ("Error reading graphics record ", added_irecord - (long) (endp - p),
-			" out of ", added_irecord, ".\nOpcode ", opcode, ", args ", numberOfArguments, ".");
+		Melder_throw (U"Error reading graphics record ", added_irecord - (long) (endp - p),
+			U" out of ", added_irecord, U".\nOpcode ", opcode, U", args ", numberOfArguments, U".");
 	}
 }
 
@@ -503,7 +504,7 @@ void Graphics_undoGroup (Graphics me) {
 		if (opcode == MARK_GROUP) lastMark = jrecord - 1;   // found a mark
 		jrecord += number;
 	}
-	if (jrecord != my irecord) Melder_flushError ("jrecord != my irecord: %ld, %ld", jrecord, my irecord);
+	if (jrecord != my irecord) Melder_flushError (U"jrecord != my irecord: ", jrecord, U", ", my irecord);
 	if (lastMark > 0)   // found?
 		my irecord = lastMark - 1;   // forget all graphics from and including the last mark
 }
diff --git a/sys/Graphics_text.cpp b/sys/Graphics_text.cpp
index 5dbb30e..d19ad99 100644
--- a/sys/Graphics_text.cpp
+++ b/sys/Graphics_text.cpp
@@ -1,6 +1,6 @@
 /* Graphics_text.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@
  * pb 2005/10/27 corrected character width for Symbol (should not depend on SILIPA setting)
  * pb 2005/11/11 Windows: font sizes up to 500
  * pb 2006/10/20 links are recorded in DC (no longer WC)
- * pb 2007/06/11 wchar_t
+ * pb 2007/06/11 wchar
  * pb 2007/08/01 reintroduced yIsZeroAtTheTop
  * pb 2007/08/25 use Charis SIL or Doulos SIL rather than SILDoulos IPA93
  * pb 2007/09/29 correct counting of UTF-8 bytes
@@ -45,6 +45,7 @@
  * pb 2010/06/29 Mac: handle missing phonetic fonts better
  * pb 2010/07/13 cairo: rotated text
  * pb 2011/03/17 C++
+ * pb 2015/06/29 removed bitmapped fonts
  */
 
 #include <ctype.h>
@@ -54,7 +55,6 @@
 #include "Printer.h"
 
 extern const char * ipaSerifRegularPS [];
-extern const char * ipaSerifRegular24 [1 + 255-33+1 + 1] [24 + 1];
 
 /*
  * When computing the width of a text by adding the widths of the separate characters,
@@ -70,15 +70,14 @@ extern const char * ipaSerifRegular24 [1 + 255-33+1 + 1] [24 + 1];
  * The ISO8859-1 character encoding, which is used on Xwin and Win, has not.
  */
 #if mac
-	#define HAS_FI_AND_FL_LIGATURES  TRUE
+	#define HAS_FI_AND_FL_LIGATURES  true
 #else
-	#define HAS_FI_AND_FL_LIGATURES  ( my postScript == TRUE )
+	#define HAS_FI_AND_FL_LIGATURES  ( my postScript == true )
 #endif
 
 #if win
 	#define win_MAXIMUM_FONT_SIZE  500
 	static HFONT fonts [1 + kGraphics_resolution_MAX] [1 + kGraphics_font_JAPANESE] [1+win_MAXIMUM_FONT_SIZE] [1 + Graphics_BOLD_ITALIC];
-	static int ipaAvailable = FALSE;
 	static int win_size2isize (int size) { return size > win_MAXIMUM_FONT_SIZE ? win_MAXIMUM_FONT_SIZE : size; }
 	static int win_isize2size (int isize) { return isize; }
 #elif mac
@@ -93,20 +92,26 @@ extern const char * ipaSerifRegular24 [1 + 255-33+1 + 1] [24 + 1];
 	#else
 		static bool hasTimes, hasHelvetica, hasCourier, hasSymbol, hasPalatino, hasDoulos, hasCharis, hasIpaSerif;
 	#endif
-	static CTFontRef theScreenFonts [1 + kGraphics_font_DINGBATS] [1 + Graphics_BOLD_ITALIC];
+	#define mac_MAXIMUM_FONT_SIZE  500
+	static CTFontRef theScreenFonts [1 + kGraphics_font_DINGBATS] [1+mac_MAXIMUM_FONT_SIZE] [1 + Graphics_BOLD_ITALIC];
 	static RGBColor theWhiteColour = { 0xFFFF, 0xFFFF, 0xFFFF }, theBlueColour = { 0, 0, 0xFFFF };
 #endif
 
 #if win
+#ifdef __CYGWIN__
+	#define FONT_TYPE_TYPE  unsigned int
+#else
+	#define FONT_TYPE_TYPE  unsigned long int
+#endif
 static bool charisAvailable = false, doulosAvailable = false;
-static int CALLBACK fontFuncEx_charis (const LOGFONTW *oldLogFont, const TEXTMETRICW *oldTextMetric, unsigned long fontType, LPARAM lparam) {
+static int CALLBACK fontFuncEx_charis (const LOGFONTW *oldLogFont, const TEXTMETRICW *oldTextMetric, FONT_TYPE_TYPE fontType, LPARAM lparam) {
 	const LPENUMLOGFONTW logFont = (LPENUMLOGFONTW) oldLogFont; (void) oldTextMetric; (void) fontType; (void) lparam;
-	charisAvailable = TRUE;
+	charisAvailable = true;
 	return 1;
 }
-static int CALLBACK fontFuncEx_doulos (const LOGFONTW *oldLogFont, const TEXTMETRICW *oldTextMetric, unsigned long fontType, LPARAM lparam) {
+static int CALLBACK fontFuncEx_doulos (const LOGFONTW *oldLogFont, const TEXTMETRICW *oldTextMetric, FONT_TYPE_TYPE fontType, LPARAM lparam) {
 	const LPENUMLOGFONTW logFont = (LPENUMLOGFONTW) oldLogFont; (void) oldTextMetric; (void) fontType; (void) lparam;
-	doulosAvailable = TRUE;
+	doulosAvailable = true;
 	return 1;
 }
 static HFONT loadFont (GraphicsScreen me, int font, int size, int style) {
@@ -143,12 +148,10 @@ static HFONT loadFont (GraphicsScreen me, int font, int size, int style) {
 		EnumFontFamiliesExW (my d_gdiGraphicsContext, & logFont, fontFuncEx_charis, 0, 0);
 		wcscpy (logFont. lfFaceName, L"Doulos SIL");
 		EnumFontFamiliesExW (my d_gdiGraphicsContext, & logFont, fontFuncEx_doulos, 0, 0);
-		ipaInited = TRUE;
+		ipaInited = true;
 		if (! charisAvailable && ! doulosAvailable) {
 			/* BUG: The next warning may cause reentry of drawing (on window exposure) and lead to crash. Some code must be non-reentrant !! */
-			Melder_warning (L"The phonetic font is not available.\nSeveral characters will not look correct.\nSee www.praat.org");
-		} else {
-			ipaAvailable = true;
+			Melder_warning (U"The phonetic font is not available.\nSeveral characters may not look correct.\nSee www.praat.org");
 		}
 	}
 	wcscpy (spec. lfFaceName,
@@ -179,11 +182,11 @@ static void charSize (I, _Graphics_widechar *lc) {
 				lc -> width = 10;
 				lc -> baseline *= my fontSize * 0.01;
 				lc -> code = lc -> kar;
-				lc -> font.string = NULL;
+				lc -> font.string = nullptr;
 				lc -> font.integer = 0;
 				lc -> size = size;
 			} else {
-				if (my d_cairoGraphicsContext == NULL) return;
+				if (! my d_cairoGraphicsContext) return;
 				Longchar_Info info = Longchar_getInfoFromNative (lc -> kar);
 				int font, size, style;
 				int normalSize = my fontSize * my resolution / 72.0;
@@ -210,12 +213,13 @@ static void charSize (I, _Graphics_widechar *lc) {
 					case kGraphics_font_DINGBATS:  cairo_select_font_face (my d_cairoGraphicsContext, "Dingbats", slant, weight); break;
 					default:                       cairo_select_font_face (my d_cairoGraphicsContext, "Sans", slant, weight); break;
 				}
-				wchar_t buffer [2] = { lc -> kar, 0 };
-				cairo_text_extents (my d_cairoGraphicsContext, Melder_peekWcsToUtf8 (buffer), & extents);
+				char32 buffer [2] = { lc -> kar, 0 };
+				cairo_text_extents (my d_cairoGraphicsContext, Melder_peek32to8 (buffer), & extents);
 				lc -> width = extents.x_advance;
+				trace (U"width ", lc -> width);
 				lc -> baseline *= my fontSize * 0.01;
 				lc -> code = lc -> kar;
-				lc -> font.string = NULL;
+				lc -> font.string = nullptr;
 				lc -> font.integer = font;
 				lc -> size = size;
 			}
@@ -238,214 +242,61 @@ static void charSize (I, _Graphics_widechar *lc) {
 				if (! fontInfo) return;
 				fonts [my resolutionNumber] [font] [size] [style] = fontInfo;
 			}
-			if (font == kGraphics_font_IPATIMES && ! ipaAvailable) {
-				int overstrike = ipaSerifRegular24 [info -> psEncoding - 32] [0] [0] == 'o';
-				lc -> code = info -> psEncoding;
-				if (overstrike)
-					lc -> width = 0;
-				else
-					lc -> width = strlen (ipaSerifRegular24 [info -> psEncoding - 32] [0]);
-			} else {
-				SIZE extent;
-				wchar_t code;
-				lc -> code =
-					font == kGraphics_font_IPATIMES ||
-					font == kGraphics_font_TIMES ||
-					font == kGraphics_font_HELVETICA ||
-					font == kGraphics_font_CHINESE ||
-					font == kGraphics_font_JAPANESE ||
-					font == kGraphics_font_COURIER ? (unsigned short) lc -> kar :
-					info -> winEncoding;
-				if (lc -> code == 0) {
-					_Graphics_widechar *lc2;
-					if (lc -> kar == UNICODE_LATIN_SMALL_LETTER_SCHWA_WITH_HOOK) {
-						info = Longchar_getInfo ('s', 'w');
-						lc -> kar = info -> unicode;
-						lc -> code = info -> winEncoding;
-						for (lc2 = lc + 1; lc2 -> kar != '\0'; lc2 ++) { }
-						lc2 [1]. kar = '\0';
-						while (lc2 - lc > 0) { lc2 [0] = lc2 [-1]; lc2 --; }
-						lc [1]. kar = UNICODE_MODIFIER_LETTER_RHOTIC_HOOK;
-					} else if (lc -> kar == UNICODE_LATIN_SMALL_LETTER_L_WITH_MIDDLE_TILDE) {
-						info = Longchar_getInfo ('l', ' ');
-						lc -> kar = info -> unicode;
-						lc -> code = info -> winEncoding;
-						for (lc2 = lc + 1; lc2 -> kar != '\0'; lc2 ++) { }
-						lc2 [1]. kar = '\0';
-						while (lc2 - lc > 0) { lc2 [0] = lc2 [-1]; lc2 --; }
-						lc [1]. kar = UNICODE_COMBINING_TILDE_OVERLAY;
-					}
+			SIZE extent;
+			lc -> code =
+				font == kGraphics_font_IPATIMES ||
+				font == kGraphics_font_TIMES ||
+				font == kGraphics_font_HELVETICA ||
+				font == kGraphics_font_CHINESE ||
+				font == kGraphics_font_JAPANESE ||
+				font == kGraphics_font_COURIER ? lc -> kar :
+				info -> winEncoding;
+			if (lc -> code == 0) {
+				_Graphics_widechar *lc2;
+				if (lc -> kar == UNICODE_LATIN_SMALL_LETTER_SCHWA_WITH_HOOK) {
+					info = Longchar_getInfo ('s', 'w');
+					lc -> kar = info -> unicode;
+					lc -> code = info -> winEncoding;
+					for (lc2 = lc + 1; lc2 -> kar != U'\0'; lc2 ++) { }
+					lc2 [1]. kar = U'\0';
+					while (lc2 - lc > 0) { lc2 [0] = lc2 [-1]; lc2 --; }
+					lc [1]. kar = UNICODE_MODIFIER_LETTER_RHOTIC_HOOK;
+				} else if (lc -> kar == UNICODE_LATIN_SMALL_LETTER_L_WITH_MIDDLE_TILDE) {
+					info = Longchar_getInfo ('l', ' ');
+					lc -> kar = info -> unicode;
+					lc -> code = info -> winEncoding;
+					for (lc2 = lc + 1; lc2 -> kar != U'\0'; lc2 ++) { }
+					lc2 [1]. kar = U'\0';
+					while (lc2 - lc > 0) { lc2 [0] = lc2 [-1]; lc2 --; }
+					lc [1]. kar = UNICODE_COMBINING_TILDE_OVERLAY;
 				}
-				SelectFont (my d_gdiGraphicsContext, fontInfo);
-				GetTextExtentPoint32W (my d_gdiGraphicsContext, (code = (unsigned short) lc -> code, & code), 1, & extent);   // UTF-32 BUG
-				lc -> width = extent. cx;
 			}
+			SelectFont (my d_gdiGraphicsContext, fontInfo);
+			if (lc -> code <= 0x00FFFF) {
+				char16 code = (char16) lc -> code;
+				GetTextExtentPoint32W (my d_gdiGraphicsContext, (WCHAR *) & code, 1, & extent);
+			} else {
+				char32 code [2] { lc -> code, U'\0' };
+				GetTextExtentPoint32W (my d_gdiGraphicsContext, Melder_peek32toW (code), 2, & extent);
+			}
+			lc -> width = extent. cx;
 			lc -> baseline *= my fontSize * 0.01 * my resolution / 72.0;
-			lc -> font.string = NULL;
+			lc -> font.string = nullptr;
 			lc -> font.integer = font;   // kGraphics_font_HELVETICA .. kGraphics_font_DINGBATS
 			lc -> size = size;   // 0..4 instead of 10..24
 			lc -> style = style;   // without Graphics_CODE
 		#elif cocoa
-			/*
-			 * Determine the font family.
-			 */
-			Longchar_Info info = Longchar_getInfoFromNative (lc -> kar);
-			int font =
-				info -> alphabet == Longchar_SYMBOL || // ? kGraphics_font_SYMBOL :
-				info -> alphabet == Longchar_PHONETIC ?
-					( my font == kGraphics_font_TIMES ?
-						( hasDoulos ?
-							( lc -> style == 0 ?
-								kGraphics_font_IPATIMES :
-							  hasCharis ?
-								kGraphics_font_IPAPALATINO :   // other styles in Charis, because Doulos has no bold or italic
-								kGraphics_font_TIMES
-							) :
-						  hasCharis ?
-							kGraphics_font_IPAPALATINO :
-							kGraphics_font_TIMES   // on newer systems, Times and Times New Roman have a lot of phonetic characters
-						) :
-					  my font == kGraphics_font_HELVETICA || my font == kGraphics_font_COURIER ?
-						my font :   // sans serif or wide, so fall back on Lucida Grande for phonetic characters
-					  /* my font must be kGraphics_font_PALATINO */
-					  hasCharis && Melder_debug != 900 ?
-						kGraphics_font_IPAPALATINO :
-					  hasDoulos && Melder_debug != 900 ?
-					    ( lc -> style == 0 ?
-							kGraphics_font_IPATIMES :
-							kGraphics_font_TIMES
-						) :
-						kGraphics_font_PALATINO
-					) :
-				lc -> kar == '/' ?
-					kGraphics_font_PALATINO :   // override Courier
-				info -> alphabet == Longchar_DINGBATS ?
-					kGraphics_font_DINGBATS :
-				lc -> font.integer == kGraphics_font_COURIER ?
-					kGraphics_font_COURIER :
-				my font == kGraphics_font_TIMES ?
-					( hasDoulos ?
-						( lc -> style == 0 ?
-							kGraphics_font_IPATIMES :
-						  lc -> style == Graphics_ITALIC ?
-							kGraphics_font_TIMES :
-						  hasCharis ?
-							kGraphics_font_IPAPALATINO :
-							kGraphics_font_TIMES 
-						) :
-						kGraphics_font_TIMES
-					) :   // needed for correct placement of diacritics
-				my font == kGraphics_font_HELVETICA ?
-					kGraphics_font_HELVETICA :
-				my font == kGraphics_font_PALATINO ?
-					( hasCharis && Melder_debug != 900 ?
-						kGraphics_font_IPAPALATINO :
-						kGraphics_font_PALATINO
-					) :
-				my font;   // why not lc -> font.integer?
-			Melder_assert (font >= 0 && font <= kGraphics_font_DINGBATS);
-			lc -> font.string = NULL;   // this erases font.integer!
-
-			/*
-			 * Determine the style.
-			 */
-			int style = lc -> style;
-			Melder_assert (style >= 0 && style <= Graphics_BOLD_ITALIC);
-
-			/*
-			 * Determine the font-style combination.
-			 */
-			CTFontRef ctFont = theScreenFonts [font] [style];
-			if (ctFont == NULL) {
-				CTFontSymbolicTraits ctStyle = ( style & Graphics_BOLD ? kCTFontBoldTrait : 0 ) | ( lc -> style & Graphics_ITALIC ? kCTFontItalicTrait : 0 );
-				NSMutableDictionary *styleDict = [[NSMutableDictionary alloc] initWithCapacity: 1];
-				[styleDict   setObject: [NSNumber numberWithUnsignedInt: ctStyle]   forKey: (id) kCTFontSymbolicTrait];
-				NSMutableDictionary *attributes = [[NSMutableDictionary alloc] initWithCapacity: 2];
-				[attributes   setObject: styleDict   forKey: (id) kCTFontTraitsAttribute];
-				switch (font) {
-					case kGraphics_font_TIMES:       { [attributes   setObject: @"Times"           forKey: (id) kCTFontNameAttribute]; } break;
-					case kGraphics_font_HELVETICA:   { [attributes   setObject: @"Arial"           forKey: (id) kCTFontNameAttribute]; } break;
-					case kGraphics_font_COURIER:     { [attributes   setObject: @"Courier New"     forKey: (id) kCTFontNameAttribute]; } break;
-					case kGraphics_font_PALATINO:    { if (Melder_debug == 900)
-															[attributes   setObject: @"DG Meta Serif Science" forKey: (id) kCTFontNameAttribute];
-													   else
-														    [attributes   setObject: @"Palatino"              forKey: (id) kCTFontNameAttribute];
-													 } break;
-					case kGraphics_font_SYMBOL:      { [attributes   setObject: @"Symbol"          forKey: (id) kCTFontNameAttribute]; } break;
-					case kGraphics_font_IPATIMES:    { [attributes   setObject: @"Doulos SIL"      forKey: (id) kCTFontNameAttribute]; } break;
-					case kGraphics_font_IPAPALATINO: { [attributes   setObject: @"Charis SIL"      forKey: (id) kCTFontNameAttribute]; } break;
-					case kGraphics_font_DINGBATS:    { [attributes   setObject: @"Zapf Dingbats"   forKey: (id) kCTFontNameAttribute]; } break;
-				}
- 				CTFontDescriptorRef ctFontDescriptor = CTFontDescriptorCreateWithAttributes ((CFMutableDictionaryRef) attributes);
-				[styleDict release];
-				[attributes release];
-				ctFont = CTFontCreateWithFontDescriptor (ctFontDescriptor, 100.0, NULL);
-				CFRelease (ctFontDescriptor);
- 				theScreenFonts [font] [style] = ctFont;
-			}
-
-			int normalSize = my fontSize * my resolution / 72.0;
-			lc -> size = lc -> size < 100 ? (3 * normalSize + 2) / 4 : normalSize;
-        
-			char16_t codes16 [2];
-			int nchars = 1;
-			if (lc -> kar > 0x00FFFF) {
-				char32_t kar = lc -> kar - 0x010000;   // subtract the BMP
-				Melder_assert (lc -> kar <= 0x0FFFFF);   // no more than 20 bits should remain
-				// encode the upper 10 bits
-				codes16 [0] = (char16) (0x00D800 | (kar >> 10));   // at most 0x00D800 | 0x0003FF = 0x00DBFF
-				// encode the lower 10 bits
-				codes16 [1] = (char16) (0x00DC00 | (kar & 0x0003FF));   // at most 0x00DC00 | 0x0003FF = 0x00DFFF
-				nchars = 2;
-			} else {
-				codes16 [0] = (char16) lc -> kar;   // guarded conversion down
-			}
-			NSString *s = [[NSString alloc]
-				initWithBytes: codes16
-				length: nchars * 2
-				encoding: NSUTF16LittleEndianStringEncoding   // BUG: should be NSUTF16NativeStringEncoding, except that that doesn't exist
-				];
-
-			CFRange textRange = CFRangeMake (0, [s length]);
-
-			CFMutableAttributedStringRef string = CFAttributedStringCreateMutable (kCFAllocatorDefault, [s length]);
-			CFAttributedStringReplaceString (string, CFRangeMake (0, 0), (CFStringRef) s);
-			CFAttributedStringSetAttribute (string, textRange, kCTFontAttributeName, ctFont);
-
-			/*
-			 * Measure.
-			 */
-
-            // Create a path to render text in
-			CGMutablePathRef path = CGPathCreateMutable ();
-			NSRect measureRect = NSMakeRect (0, 0, CGFLOAT_MAX, CGFLOAT_MAX);
-			CGPathAddRect (path, NULL, (CGRect) measureRect);
-        
-			CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString ((CFAttributedStringRef) string);
-			CFRange fitRange;
-			CGSize targetSize = CGSizeMake (lc -> width, CGFLOAT_MAX);
-			CGSize frameSize = CTFramesetterSuggestFrameSizeWithConstraints (framesetter, textRange, NULL, targetSize, & fitRange);
-			CFRelease (framesetter);
-			CFRelease (string);
-			[s release];
-			CFRelease (path);
-
-			bool isDiacritic = info -> ps.times == 0;
-			lc -> width = isDiacritic ? 0.0 : frameSize.width * lc -> size / 100.0;
-			lc -> baseline *= 0.01 * normalSize;
-			lc -> code = lc -> kar;
-			lc -> font.integer = font;
 		#elif mac
 			Longchar_Info info = Longchar_getInfoFromNative (lc -> kar);
 			int normalSize = my fontSize * my resolution / 72.0;
 			lc -> size = lc -> size < 100 ? (3 * normalSize + 2) / 4 : /*lc -> size > 100 ? 1.2 * normalSize :*/ normalSize;
 			lc -> baseline *= 0.01 * normalSize;
 			long saveFont = lc -> font.integer;   // save!
-			lc -> font.string = NULL;   // this erases font.integer!
+			lc -> font.string = nullptr;   // this erases font.integer!
 			ATSFontRef atsuiFont =
 				info -> alphabet == Longchar_SYMBOL ? theSymbolAtsuiFont :
 				info -> alphabet == Longchar_PHONETIC ? ( my font == kGraphics_font_TIMES && lc -> style == 0 ? theIpaTimesAtsuiFont : theIpaPalatinoAtsuiFont ) :
-				lc -> kar == '/' ? thePalatinoAtsuiFont :   /* Override Courier. */
+				lc -> kar == '/' ? thePalatinoAtsuiFont :   // override Courier
 				info -> alphabet == Longchar_DINGBATS ? theZapfDingbatsAtsuiFont:
 				saveFont == kGraphics_font_COURIER ? theCourierAtsuiFont :
 				my font == kGraphics_font_TIMES ? theTimesAtsuiFont :
@@ -453,7 +304,7 @@ static void charSize (I, _Graphics_widechar *lc) {
 				my font == kGraphics_font_COURIER ? theCourierAtsuiFont : theTimesAtsuiFont;
 			Melder_assert (atsuiFont != 0);
 			lc -> font.integer = (long) atsuiFont;
-			//CTFontRef ctFont = CTFontCreateWithName (CFSTR("Times"), 48, NULL);
+			//CTFontRef ctFont = CTFontCreateWithName (CFSTR("Times"), 48, nullptr);
 			lc -> code = lc -> kar;
 			if (lc -> code == 0) {
 				_Graphics_widechar *lc2;
@@ -461,16 +312,16 @@ static void charSize (I, _Graphics_widechar *lc) {
 					info = Longchar_getInfo ('s', 'w');
 					lc -> kar = info -> unicode;
 					lc -> code = info -> unicode;
-					for (lc2 = lc + 1; lc2 -> kar != '\0'; lc2 ++) { }
-					lc2 [1]. kar = '\0';
+					for (lc2 = lc + 1; lc2 -> kar != U'\0'; lc2 ++) { }
+					lc2 [1]. kar = U'\0';
 					while (lc2 - lc > 0) { lc2 [0] = lc2 [-1]; lc2 --; }
 					lc [1]. kar = UNICODE_MODIFIER_LETTER_RHOTIC_HOOK;
 				} else if (lc -> kar == UNICODE_LATIN_SMALL_LETTER_L_WITH_MIDDLE_TILDE) {
 					info = Longchar_getInfo ('l', ' ');
 					lc -> kar = info -> unicode;
 					lc -> code = info -> unicode;
-					for (lc2 = lc + 1; lc2 -> kar != '\0'; lc2 ++) { }
-					lc2 [1]. kar = '\0';
+					for (lc2 = lc + 1; lc2 -> kar != U'\0'; lc2 ++) { }
+					lc2 [1]. kar = U'\0';
 					while (lc2 - lc > 0) { lc2 [0] = lc2 [-1]; lc2 --; }
 					lc [1]. kar = UNICODE_COMBINING_TILDE_OVERLAY;
 				}
@@ -478,10 +329,10 @@ static void charSize (I, _Graphics_widechar *lc) {
 			/*
 			 * Define the text layout.
 			 */
-			static ATSUTextLayout textLayout;
-			if (textLayout == NULL) {
+			static ATSUTextLayout textLayout = nullptr;
+			if (! textLayout) {
 				OSStatus err = ATSUCreateTextLayout (& textLayout);
-				if (err != 0) Melder_fatal ("Graphics_text/ATSUCreateTextLayout: unknown MacOS error %d.", (int) err);
+				if (err != 0) Melder_fatal (U"Graphics_text/ATSUCreateTextLayout: unknown MacOS error ", (int) err, U".");
 			}
 			char16_t code16 [2];
 			if (lc -> kar <= 0xFFFF) {
@@ -489,20 +340,20 @@ static void charSize (I, _Graphics_widechar *lc) {
 				OSStatus err = ATSUSetTextPointerLocation (textLayout,
 					(ConstUniCharArrayPtr) & code16 [0],
 					kATSUFromTextBeginning, kATSUToTextEnd, 1);   // BUG: not 64-bit
-				if (err != 0) Melder_fatal ("Graphics_text/ATSUSetTextPointerLocation low Unicode: unknown MacOS error %d.", (int) err);
+				if (err != 0) Melder_fatal (U"Graphics_text/ATSUSetTextPointerLocation low Unicode: unknown MacOS error ", (int) err, U".");
 			} else {
-				char32_t kar = lc -> kar - 0x10000;
+				char32 kar = lc -> kar - 0x10000;
 				code16 [0] = 0xD800 + (kar >> 10);
 				code16 [1] = 0xDC00 + (kar & 0x3FF);
 				OSStatus err = ATSUSetTextPointerLocation (textLayout,
 					(ConstUniCharArrayPtr) & code16 [0],
 					kATSUFromTextBeginning, kATSUToTextEnd, 2);   // BUG: not 64-bit
-				if (err != 0) Melder_fatal ("Graphics_text/ATSUSetTextPointerLocation high Unicode: unknown MacOS error %d.", (int) err);
+				if (err != 0) Melder_fatal (U"Graphics_text/ATSUSetTextPointerLocation high Unicode: unknown MacOS error ", (int) err, U".");
 			}
-			static ATSUFontFallbacks fontFallbacks = NULL;
-			if (fontFallbacks == NULL) {
+			static ATSUFontFallbacks fontFallbacks = nullptr;
+			if (! fontFallbacks) {
 				ATSUCreateFontFallbacks (& fontFallbacks);
-				ATSUSetObjFontFallbacks (fontFallbacks, 0, NULL, kATSUDefaultFontFallbacks);
+				ATSUSetObjFontFallbacks (fontFallbacks, 0, nullptr, kATSUDefaultFontFallbacks);
 			}
 			ATSUAttributeTag attributeTags [] = { kATSUCGContextTag, kATSULineFontFallbacksTag };
 			ByteCount valueSizes [] = { sizeof (CGContextRef), sizeof (ATSUFontFallbacks) };
@@ -512,8 +363,8 @@ static void charSize (I, _Graphics_widechar *lc) {
 			/*
 			 * Set styles: font, size, colour, bold, italic.
 			 */
-			static ATSUStyle atsuStyle;
-			if (atsuStyle == NULL) {
+			static ATSUStyle atsuStyle = nullptr;
+			if (! atsuStyle) {
 				ATSUCreateStyle (& atsuStyle);
 			}
 			Fixed fontSize = lc -> size << 16;
@@ -539,7 +390,7 @@ static void charSize (I, _Graphics_widechar *lc) {
 			lc -> style == Graphics_BOLD || lc -> link ? Graphics_BOLD :
 			lc -> style == Graphics_BOLD_ITALIC ? Graphics_BOLD_ITALIC : 0;
 		if (! my fontInfos [font] [style]) {
-			const char *fontInfo, *secondaryFontInfo = NULL, *tertiaryFontInfo = NULL;
+			const char *fontInfo, *secondaryFontInfo = nullptr, *tertiaryFontInfo = nullptr;
 			if (font == kGraphics_font_COURIER) {
 				fontInfo = style == Graphics_BOLD ? "Courier-Bold" :
 					style == Graphics_ITALIC ? "Courier-Oblique" :
@@ -575,7 +426,7 @@ static void charSize (I, _Graphics_widechar *lc) {
 					const char **p;
 					for (p = & ipaSerifRegularPS [0]; *p; p ++)
 						my d_printf (my d_file, "%s", *p);
-					my loadedXipa = TRUE;
+					my loadedXipa = true;
 				}
 				fontInfo = my useSilipaPS ?
 					(style == Graphics_BOLD || style == Graphics_BOLD_ITALIC ? "SILDoulosIPA93Bold" : "SILDoulosIPA93Regular") :
@@ -608,7 +459,7 @@ static void charSize (I, _Graphics_widechar *lc) {
 					my d_printf (my d_file, "/%s /%s-Praat PraatEncode\n", secondaryFontInfo, fontInfo);
 				} else {
 					/* Automatic font choice strategy. */
-					if (secondaryFontInfo != NULL) {
+					if (secondaryFontInfo) {
 						my d_printf (my d_file,
 							"/%s /Font resourcestatus\n"
 							"{ pop pop /%s /%s-Praat PraatEncode }\n"
@@ -670,8 +521,8 @@ static void charSize (I, _Graphics_widechar *lc) {
 				lc -> kar = info -> unicode;
 				lc -> code = info -> macEncoding;
 				lc -> width = info -> ps.timesItalic * lc -> size / 1000.0;
-				for (lc2 = lc + 1; lc2 -> kar != '\0'; lc2 ++) { }
-				lc2 [1]. kar = '\0';
+				for (lc2 = lc + 1; lc2 -> kar != U'\0'; lc2 ++) { }
+				lc2 [1]. kar = U'\0';
 				while (lc2 - lc > 0) { lc2 [0] = lc2 [-1]; lc2 --; }
 				lc [1]. kar = UNICODE_MODIFIER_LETTER_RHOTIC_HOOK;
 			} else if (lc -> kar == UNICODE_LATIN_SMALL_LETTER_L_WITH_MIDDLE_TILDE) {
@@ -679,8 +530,8 @@ static void charSize (I, _Graphics_widechar *lc) {
 				lc -> code = info -> macEncoding;
 				lc -> kar = info -> unicode;
 				lc -> width = info -> ps.timesItalic * lc -> size / 1000.0;
-				for (lc2 = lc + 1; lc2 -> kar != '\0'; lc2 ++) { }
-				lc2 [1]. kar = '\0';
+				for (lc2 = lc + 1; lc2 -> kar != U'\0'; lc2 ++) { }
+				lc2 [1]. kar = U'\0';
 				while (lc2 - lc > 0) { lc2 [0] = lc2 [-1]; lc2 --; }
 				lc [1]. kar = UNICODE_COMBINING_TILDE_OVERLAY;
 			}
@@ -689,10 +540,10 @@ static void charSize (I, _Graphics_widechar *lc) {
 }
 
 static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
-	const wchar_t *codes, const char *codes8, const char16_t *codes16, int nchars, int width)
+	const char32 *codes, int nchars, int width)
 {
 	iam (Graphics);
-	//Melder_casual ("nchars %d first %d %c rightToLeft %d", nchars, lc->kar, lc -> kar, lc->rightToLeft);
+	//Melder_casual (U"nchars ", nchars, U" first ", (int) lc->kar, U" ", (char32) lc -> kar, U" rightToLeft ", lc->rightToLeft);
 	if (my postScript) {
 		iam (GraphicsPostscript);
 		bool onlyRegular = lc -> font.string [0] == 'S' ||
@@ -706,38 +557,37 @@ static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
 		for (int i = -3; i <= 3; i ++) {
 			if (i != 0 && ! thick) continue;
 			my d_printf (my d_file, "%d %d M ", xDC + i, yDC);
-			if (my textRotation || slant) {
+			if (my textRotation != 0.0 || slant) {
 				my d_printf (my d_file, "gsave currentpoint translate ");
-				if (my textRotation)
+				if (my textRotation != 0.0)
 					my d_printf (my d_file, "%.6g rotate 0 0 M\n", (double) my textRotation);
 				if (slant)
 					my d_printf (my d_file, "[1 0 0.25 1 0 0] concat 0 0 M\n");
 			}
 			my d_printf (my d_file, "(");
-			const char *kars = codes8;
-			while (*kars) {
-				if (*kars == '(' || *kars == ')' || *kars == '\\') {
-					my d_printf (my d_file, "\\%c", *kars);
-				} else if (*kars >= 32 && *kars <= 126) {
-					my d_printf (my d_file, "%c", *kars);
+			const char32 *p = codes;
+			while (*p) {
+				if (*p == U'(' || *p == U')' || *p == U'\\') {
+					my d_printf (my d_file, "\\%c", (unsigned char) *p);
+				} else if (*p >= 32 && *p <= 126) {
+					my d_printf (my d_file, "%c", (unsigned char) *p);
 				} else {
-					my d_printf (my d_file, "\\%d%d%d", *(unsigned char*)kars / 64,
-						(*(unsigned char*)kars % 64) / 8, *(unsigned char*)kars % 8);
+					my d_printf (my d_file, "\\%d%d%d", (unsigned char) *p / 64,
+						((unsigned char) *p % 64) / 8, (unsigned char) *p % 8);
 				}
-				kars ++;
+				p ++;
 			}
 			my d_printf (my d_file, ") show\n");
-			if (my textRotation || slant)
+			if (my textRotation != 0.0 || slant)
 				my d_printf (my d_file, "grestore\n");
 		}
 		if (lc -> link) my d_printf (my d_file, "0 0 0 setrgbcolor\n");
 	} else if (my screen) {
 		iam (GraphicsScreen);
-		bool needBitmappedIPA = false;
 		#if cairo
 			if (my duringXor) {
 			} else {
-				if (my d_cairoGraphicsContext == NULL) return;
+				if (! my d_cairoGraphicsContext) return;
 				// TODO!
 			}
 			int font = lc -> font.integer;
@@ -755,12 +605,14 @@ static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
 			/*
 			 * Determine the font-style combination.
 			 */
-			CTFontSymbolicTraits ctStyle = ( style & Graphics_BOLD ? kCTFontBoldTrait : 0 ) | ( lc -> style & Graphics_ITALIC ? kCTFontItalicTrait : 0 );
-			#if 0
+			CTFontRef ctFont = theScreenFonts [font] [lc -> size] [style];
+			if (! ctFont) {
+				CTFontSymbolicTraits ctStyle = ( style & Graphics_BOLD ? kCTFontBoldTrait : 0 ) | ( lc -> style & Graphics_ITALIC ? kCTFontItalicTrait : 0 );
+			#if 1
 				CFStringRef key = kCTFontSymbolicTrait;
-				CFNumberRef value = CFNumberCreate (NULL, kCFNumberIntType, & ctStyle);
+				CFNumberRef value = CFNumberCreate (nullptr, kCFNumberIntType, & ctStyle);
 				CFIndex numberOfValues = 1;
-				CFDictionaryRef styleDict = CFDictionaryCreate (NULL, (const void **) & key, (const void **) & value, numberOfValues,
+				CFDictionaryRef styleDict = CFDictionaryCreate (nullptr, (const void **) & key, (const void **) & value, numberOfValues,
 					& kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);
 				CFRelease (value);
 				CFStringRef keys [2];
@@ -768,21 +620,21 @@ static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
 				keys [1] = kCTFontNameAttribute;
 				CFStringRef cfFont;
 				switch (font) {
-					case kGraphics_font_TIMES:       { cfFont = (CFStringRef) Melder_peekWcsToCfstring (L"Times New Roman"); } break;
-					case kGraphics_font_HELVETICA:   { cfFont = (CFStringRef) Melder_peekWcsToCfstring (L"Arial"          ); } break;
-					case kGraphics_font_COURIER:     { cfFont = (CFStringRef) Melder_peekWcsToCfstring (L"Courier New"    ); } break;
+					case kGraphics_font_TIMES:       { cfFont = (CFStringRef) Melder_peek32toCfstring (U"Times New Roman"); } break;
+					case kGraphics_font_HELVETICA:   { cfFont = (CFStringRef) Melder_peek32toCfstring (U"Arial"          ); } break;
+					case kGraphics_font_COURIER:     { cfFont = (CFStringRef) Melder_peek32toCfstring (U"Courier New"    ); } break;
 					case kGraphics_font_PALATINO:    { if (Melder_debug == 900)
-															cfFont = (CFStringRef) Melder_peekWcsToCfstring (L"DG Meta Serif Science");
+															cfFont = (CFStringRef) Melder_peek32toCfstring (U"DG Meta Serif Science");
 													   else
-														    cfFont = (CFStringRef) Melder_peekWcsToCfstring (L"Palatino");
+														    cfFont = (CFStringRef) Melder_peek32toCfstring (U"Palatino");
 													 } break;
-					case kGraphics_font_SYMBOL:      { cfFont = (CFStringRef) Melder_peekWcsToCfstring (L"Symbol"         ); } break;
-					case kGraphics_font_IPATIMES:    { cfFont = (CFStringRef) Melder_peekWcsToCfstring (L"Doulos SIL"     ); } break;
-					case kGraphics_font_IPAPALATINO: { cfFont = (CFStringRef) Melder_peekWcsToCfstring (L"Charis SIL"     ); } break;
-					case kGraphics_font_DINGBATS:    { cfFont = (CFStringRef) Melder_peekWcsToCfstring (L"Zapf Dingbats"  ); } break;
+					case kGraphics_font_SYMBOL:      { cfFont = (CFStringRef) Melder_peek32toCfstring (U"Symbol"         ); } break;
+					case kGraphics_font_IPATIMES:    { cfFont = (CFStringRef) Melder_peek32toCfstring (U"Doulos SIL"     ); } break;
+					case kGraphics_font_IPAPALATINO: { cfFont = (CFStringRef) Melder_peek32toCfstring (U"Charis SIL"     ); } break;
+					case kGraphics_font_DINGBATS:    { cfFont = (CFStringRef) Melder_peek32toCfstring (U"Zapf Dingbats"  ); } break;
 				}
 				void *values [2] = { (void *) styleDict, (void *) cfFont };
-				CFDictionaryRef attributes = CFDictionaryCreate (NULL, (const void **) & keys, (const void **) & values, 2,
+				CFDictionaryRef attributes = CFDictionaryCreate (nullptr, (const void **) & keys, (const void **) & values, 2,
 					& kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);
 				CFRelease (styleDict);
 				CTFontDescriptorRef ctFontDescriptor = CTFontDescriptorCreateWithAttributes (attributes);
@@ -810,22 +662,19 @@ static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
 				[styleDict release];
 				[attributes release];
 			#endif
-			CTFontRef ctFont = CTFontCreateWithFontDescriptor (ctFontDescriptor, lc -> size, NULL);
-			CFRelease (ctFontDescriptor);
-
-			bool hasHighUnicodeValues = false;
-			for (long i = 0; i < nchars; i ++) {
-				hasHighUnicodeValues |= codes [i] > 0xFFFF;
-			}
-			if (hasHighUnicodeValues) {
-				nchars = wcslen_utf16 (codes, 0);
-				codes16 = (const char16_t *) Melder_peekWcsToUtf16 (codes);
+				ctFont = CTFontCreateWithFontDescriptor (ctFontDescriptor, lc -> size, nullptr);
+				CFRelease (ctFontDescriptor);
+				theScreenFonts [font] [lc -> size] [style] = ctFont;
 			}
+
+			const char16 *codes16 = Melder_peek32to16 (codes);
 			#if 1
-				CFStringRef s = CFStringCreateWithBytes (NULL, (const UInt8 *) codes16, nchars * 2, kCFStringEncodingUTF16LE, false);
+				CFStringRef s = CFStringCreateWithBytes (nullptr,
+					(const UInt8 *) codes16, str16len (codes16) * 2,
+					kCFStringEncodingUTF16LE, false);
 				int length = CFStringGetLength (s);
 			#else
-				NSString *s = [[NSString alloc]   initWithBytes: codes16   length: nchars * 2   encoding: NSUTF16LittleEndianStringEncoding];
+				NSString *s = [[NSString alloc]   initWithBytes: codes16   length: str16len (codes16) * 2   encoding: NSUTF16LittleEndianStringEncoding];
 				int length = [s length];
 			#endif
 
@@ -848,13 +697,13 @@ static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
 				CTTextAlignment textAlignment = kCTLeftTextAlignment;
 				CTParagraphStyleSetting paragraphSettings [1] = { { kCTParagraphStyleSpecifierAlignment, sizeof (CTTextAlignment), & textAlignment } };
 				paragraphStyle = CTParagraphStyleCreate (paragraphSettings, 1);
-				Melder_assert (paragraphStyle != NULL);
+				Melder_assert (paragraphStyle != nullptr);
 			}
             CFAttributedStringSetAttribute (string, textRange, kCTParagraphStyleAttributeName, paragraphStyle);
 
             RGBColor *macColor = lc -> link ? & theBlueColour : my duringXor ? & theWhiteColour : & my d_macColour;
             CGColorRef color = CGColorCreateGenericRGB (macColor->red / 65536.0, macColor->green / 65536.0, macColor->blue / 65536.0, 1.0);
-			Melder_assert (color != NULL);
+			Melder_assert (color != nullptr);
             CFAttributedStringSetAttribute (string, textRange, kCTForegroundColorAttributeName, color);
 
             /*
@@ -889,55 +738,45 @@ static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
             // Clean up
             CFRelease (string);
 			CFRelease (s);
-			CFRelease (ctFont);
+			//CFRelease (ctFont);
 			if (my d_macView) {
 				#if useCarbon
 					CGContextSynchronize (my d_macGraphicsContext);
 				#endif
 				[my d_macView   unlockFocus];
 			}
-        
+			return;
 		#elif win
 			int font = lc -> font.integer;
-			needBitmappedIPA = font == kGraphics_font_IPATIMES && ! ipaAvailable;
 		#elif mac
 			ATSFontRef atsuiFont = (ATSFontRef) lc -> font.integer;
 			Melder_assert (atsuiFont != 0);
 			/*
 			 * Define the text layout.
 			 */
-			static ATSUTextLayout theAtsuiTextLayout;
-			if (theAtsuiTextLayout == NULL) {
+			static ATSUTextLayout theAtsuiTextLayout = nullptr;
+			if (! theAtsuiTextLayout) {
 				OSStatus err = ATSUCreateTextLayout (& theAtsuiTextLayout);
 				if (err != 0) {
 					if (err == kATSUInvalidFontID) {
-						Melder_fatal ("Praat detected an invalid font ID and will now crash, beause this is a system error. "
-							"Please use Font Book to check for duplicate or corrupted fonts.");
+						Melder_fatal (U"Praat detected an invalid font ID and will now crash, beause this is a system error. "
+							U"Please use Font Book to check for duplicate or corrupted fonts.");
 					} else {
-						Melder_fatal ("Graphics_text/ATSUCreateTextLayout drawing: unknown MacOS error %d.", (int) err);
+						Melder_fatal (U"Graphics_text/ATSUCreateTextLayout drawing: unknown MacOS error ", (int) err, U".");
 					}
 				}
 			}
-			bool hasHighUnicodeValues = false;
-			for (long i = 0; i < nchars; i ++) {
-				hasHighUnicodeValues |= codes [i] > 0xFFFF;
-			}
-			if (hasHighUnicodeValues) {
-				nchars = wcslen_utf16 (codes, 0);
-				OSStatus err = ATSUSetTextPointerLocation (theAtsuiTextLayout,
-					(ConstUniCharArrayPtr) Melder_peekWcsToUtf16 (codes),
-					kATSUFromTextBeginning, kATSUToTextEnd, nchars);
-				if (err != 0) Melder_fatal ("Graphics_text/ATSUSetTextPointerLocation hasHighUnicodeValues true: unknown MacOS error %d.", (int) err);
-			} else {
-				OSStatus err = ATSUSetTextPointerLocation (theAtsuiTextLayout,
-					(ConstUniCharArrayPtr) codes16,
-					kATSUFromTextBeginning, kATSUToTextEnd, nchars);
-				if (err != 0) Melder_fatal ("Graphics_text/ATSUSetTextPointerLocation hasHighUnicodeValues false: unknown MacOS error %d.", (int) err);
-			}
-			static ATSUFontFallbacks fontFallbacks = NULL;
-			if (fontFallbacks == NULL) {
+			const char16 *codes16 = Melder_peek32to16 (codes);
+			int64 nchars = str16len (codes16);
+			OSStatus err = ATSUSetTextPointerLocation (theAtsuiTextLayout,
+				(ConstUniCharArrayPtr) codes16,
+				kATSUFromTextBeginning, kATSUToTextEnd, nchars);
+			if (err != 0) Melder_fatal (U"Graphics_text/ATSUSetTextPointerLocation: unknown MacOS error ", (int) err, U".");
+
+			static ATSUFontFallbacks fontFallbacks = nullptr;
+			if (! fontFallbacks) {
 				ATSUCreateFontFallbacks (& fontFallbacks);
-				ATSUSetObjFontFallbacks (fontFallbacks, 0, NULL, kATSUDefaultFontFallbacks);
+				ATSUSetObjFontFallbacks (fontFallbacks, 0, nullptr, kATSUDefaultFontFallbacks);
 				ATSUSetObjFontFallbacks (fontFallbacks, 1, & theArabicAtsuiFont, kATSUSequentialFallbacksPreferred);
 			}
 			ATSUAttributeTag attributeTags [] = { kATSUCGContextTag, kATSULineFontFallbacksTag };
@@ -948,8 +787,8 @@ static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
 			/*
 			 * Set styles: font, size, colour, bold, italic.
 			 */
-			static ATSUStyle theAtsuStyle;
-			if (theAtsuStyle == NULL) {
+			static ATSUStyle theAtsuStyle = nullptr;
+			if (! theAtsuStyle) {
 				ATSUCreateStyle (& theAtsuStyle);
 			}
 			Fixed fontSize = lc -> size << 16;
@@ -977,12 +816,12 @@ static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
 				CGContextSetBlendMode (my d_macGraphicsContext, kCGBlendModeDifference);
 				CGContextSetAllowsAntialiasing (my d_macGraphicsContext, false);
 				OSStatus err = ATSUDrawText (theAtsuiTextLayout, kATSUFromTextBeginning, kATSUToTextEnd, 0, 0);
-				if (err != 0) Melder_fatal ("Graphics_text/ATSUDrawText during Xor: unknown MacOS error %d.", (int) err);
+				if (err != 0) Melder_fatal (U"Graphics_text/ATSUDrawText during Xor: unknown MacOS error ", (int) err, U".");
 				CGContextSetBlendMode (my d_macGraphicsContext, kCGBlendModeNormal);
 				CGContextSetAllowsAntialiasing (my d_macGraphicsContext, true);
 			} else {
 				OSStatus err = ATSUDrawText (theAtsuiTextLayout, kATSUFromTextBeginning, kATSUToTextEnd, 0, 0);
-				if (err != 0) Melder_fatal ("Graphics_text/ATSUDrawText: unknown MacOS error %d.", (int) err);
+				if (err != 0) Melder_fatal (U"Graphics_text/ATSUDrawText: unknown MacOS error ", (int) err, U".");
 			}
 			CGContextRestoreGState (my d_macGraphicsContext);
 			return;
@@ -1004,113 +843,75 @@ static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
 			/*
 			 * The most common case: a native font.
 			 */
-			if (! needBitmappedIPA) {
-				#if cairo
-					if (my duringXor) {
-						#if ALLOW_GDK_DRAWING
-							static GdkFont *font = NULL;
-							if (font == NULL) {
-								font = gdk_font_load ("-*-courier-medium-r-normal--*-120-*-*-*-*-iso8859-1");
-								if (! font) {
-									font = gdk_font_load ("-*-courier 10 pitch-medium-r-normal--*-120-*-*-*-*-iso8859-1");
-								}
-							}
-							if (font) {
-								gdk_draw_text_wc (my d_window, font, my d_gdkGraphicsContext, xDC, yDC, (const GdkWChar *) codes, nchars);
+			#if cairo
+				if (my duringXor) {
+					#if ALLOW_GDK_DRAWING
+						static GdkFont *font = nullptr;
+						if (! font) {
+							font = gdk_font_load ("-*-courier-medium-r-normal--*-120-*-*-*-*-iso8859-1");
+							if (! font) {
+								font = gdk_font_load ("-*-courier 10 pitch-medium-r-normal--*-120-*-*-*-*-iso8859-1");
 							}
-							gdk_flush ();
-						#endif
-					} else {
-						Melder_assert (my d_cairoGraphicsContext);
-						enum _cairo_font_slant slant   = (lc -> style & Graphics_ITALIC ? CAIRO_FONT_SLANT_ITALIC : CAIRO_FONT_SLANT_NORMAL);
-						enum _cairo_font_weight weight = (lc -> style & Graphics_BOLD   ? CAIRO_FONT_WEIGHT_BOLD  : CAIRO_FONT_WEIGHT_NORMAL);
-						cairo_set_font_size (my d_cairoGraphicsContext, lc -> size);
-						switch (font) {
-							case kGraphics_font_HELVETICA: cairo_select_font_face (my d_cairoGraphicsContext, "Helvetica", slant, weight); break;
-							case kGraphics_font_TIMES:     cairo_select_font_face (my d_cairoGraphicsContext, "Times", slant, weight); break;
-							case kGraphics_font_COURIER:   cairo_select_font_face (my d_cairoGraphicsContext, "Courier", slant, weight); break;
-							case kGraphics_font_PALATINO:  cairo_select_font_face (my d_cairoGraphicsContext, "Palatino", slant, weight); break;
-							case kGraphics_font_SYMBOL:    cairo_select_font_face (my d_cairoGraphicsContext, "Symbol", slant, weight); break;
-							case kGraphics_font_IPATIMES:  cairo_select_font_face (my d_cairoGraphicsContext, "Doulos SIL", slant, weight); break;
-							case kGraphics_font_DINGBATS:  cairo_select_font_face (my d_cairoGraphicsContext, "Dingbats", slant, weight); break;
-							default:                       cairo_select_font_face (my d_cairoGraphicsContext, "Sans", slant, weight); break;
-						}
-						cairo_move_to (my d_cairoGraphicsContext, xDC, yDC);
-						cairo_show_text (my d_cairoGraphicsContext, Melder_peekWcsToUtf8 (codes));
-					}
-				#elif win
-					if (my duringXor) {
-						int descent = (1.0/216) * my fontSize * my resolution;
-						int ascent = (1.0/72) * my fontSize * my resolution;
-						int maxWidth = 800, maxHeight = 200;
-						int baseline = 100, top = baseline - ascent - 1, bottom = baseline + descent + 1;
-						static int inited = 0;
-						static HDC dc;
-						static HBITMAP bitmap;
-						if (! inited) {
-							dc = CreateCompatibleDC (my d_gdiGraphicsContext);
-							bitmap = CreateCompatibleBitmap (my d_gdiGraphicsContext, maxWidth, maxHeight);
-							SelectBitmap (dc, bitmap);
-							SetBkMode (dc, TRANSPARENT);   // not the default!
-							SelectPen (dc, GetStockPen (BLACK_PEN));
-							SelectBrush (dc, GetStockBrush (BLACK_BRUSH));
-							SetTextAlign (dc, TA_LEFT | TA_BASELINE | TA_NOUPDATECP);   // baseline is not the default!
-							inited = 1;
 						}
-						width += 4;   // For slant.
-						Rectangle (dc, 0, top, width, bottom);
-						SelectFont (dc, fonts [my resolutionNumber] [font] [lc -> size] [lc -> style]);
-						SetTextColor (dc, my d_winForegroundColour);
-						TextOutW (dc, 0, baseline, (const wchar_t *) codes16, nchars);
-						BitBlt (my d_gdiGraphicsContext, xDC, yDC - ascent, width, bottom - top, dc, 0, top, SRCINVERT);
-					} else {
-						SelectPen (my d_gdiGraphicsContext, my d_winPen), SelectBrush (my d_gdiGraphicsContext, my d_winBrush);
-						if (lc -> link) SetTextColor (my d_gdiGraphicsContext, RGB (0, 0, 255)); else SetTextColor (my d_gdiGraphicsContext, my d_winForegroundColour);
-						SelectFont (my d_gdiGraphicsContext, fonts [my resolutionNumber] [font] [lc -> size] [lc -> style]);
-						TextOutW (my d_gdiGraphicsContext, xDC, yDC, (const wchar_t *) codes16, nchars);
-						if (lc -> link) SetTextColor (my d_gdiGraphicsContext, my d_winForegroundColour);
-						SelectPen (my d_gdiGraphicsContext, GetStockPen (BLACK_PEN)), SelectBrush (my d_gdiGraphicsContext, GetStockBrush (NULL_BRUSH));
-					}
-				#endif
-			} else {
-				/*
-				 * A non-rotated bitmap IPA font.
-				 */
-				for (int ichar = 0; ichar < nchars; ichar ++) {
-					int irow, icol, code = ((unsigned char *) codes8) [ichar], ncol;
-					int overstrike = ipaSerifRegular24 [code - 32] [0] [0] == 'o';
-					ncol = strlen (ipaSerifRegular24 [code - 32] [0]);
-					if (overstrike) 
-						xDC -= 10;
-					for (irow = 0; irow < 24; irow ++) {
-						const char *row = ipaSerifRegular24 [code - 32] [irow];
-						int jrow = yDC - 18 + irow;
-						for (icol = 0; icol < ncol; icol ++) {
-							if (row [icol] == '#')
-								#if cairo
-									Melder_assert (my d_cairoGraphicsContext);
-									if (my duringXor) {
-									} else {
-										cairo_move_to (my d_cairoGraphicsContext, xDC, jrow);
-										cairo_line_to (my d_cairoGraphicsContext, xDC, jrow);
-									}
-								#elif win
-									SetPixel (my d_gdiGraphicsContext, xDC, jrow, my d_winForegroundColour);
-								#endif
-							xDC ++;
+						if (font) {
+							gdk_draw_text_wc (my d_window, font, my d_gdkGraphicsContext, xDC, yDC, (const GdkWChar *) codes, nchars);
 						}
-						row ++;
-						xDC -= ncol;
+						gdk_flush ();
+					#endif
+				} else {
+					Melder_assert (my d_cairoGraphicsContext);
+					enum _cairo_font_slant slant   = (lc -> style & Graphics_ITALIC ? CAIRO_FONT_SLANT_ITALIC : CAIRO_FONT_SLANT_NORMAL);
+					enum _cairo_font_weight weight = (lc -> style & Graphics_BOLD   ? CAIRO_FONT_WEIGHT_BOLD  : CAIRO_FONT_WEIGHT_NORMAL);
+					cairo_set_font_size (my d_cairoGraphicsContext, lc -> size);
+					switch (font) {
+						case kGraphics_font_HELVETICA: cairo_select_font_face (my d_cairoGraphicsContext, "Helvetica", slant, weight); break;
+						case kGraphics_font_TIMES:     cairo_select_font_face (my d_cairoGraphicsContext, "Times New Roman", slant, weight); break;
+						case kGraphics_font_COURIER:   cairo_select_font_face (my d_cairoGraphicsContext, "Courier", slant, weight); break;
+						case kGraphics_font_PALATINO:  cairo_select_font_face (my d_cairoGraphicsContext, "Palatino", slant, weight); break;
+						case kGraphics_font_SYMBOL:    cairo_select_font_face (my d_cairoGraphicsContext, "Symbol", slant, weight); break;
+						case kGraphics_font_IPATIMES:  cairo_select_font_face (my d_cairoGraphicsContext, "Doulos SIL", slant, weight); break;
+						case kGraphics_font_DINGBATS:  cairo_select_font_face (my d_cairoGraphicsContext, "Dingbats", slant, weight); break;
+						default:                       cairo_select_font_face (my d_cairoGraphicsContext, "Sans", slant, weight); break;
 					}
-					xDC += overstrike ? 10 : ncol;
+					cairo_move_to (my d_cairoGraphicsContext, xDC, yDC);
+					cairo_show_text (my d_cairoGraphicsContext, Melder_peek32to8 (codes));
 				}
-				#if cairo
-					if (my duringXor) {
-					} else {
-						cairo_stroke (my d_cairoGraphicsContext);
+			#elif win
+				if (my duringXor) {
+					int descent = (1.0/216) * my fontSize * my resolution;
+					int ascent = (1.0/72) * my fontSize * my resolution;
+					int maxWidth = 800, maxHeight = 200;
+					int baseline = 100, top = baseline - ascent - 1, bottom = baseline + descent + 1;
+					static int inited = 0;
+					static HDC dc;
+					static HBITMAP bitmap;
+					if (! inited) {
+						dc = CreateCompatibleDC (my d_gdiGraphicsContext);
+						bitmap = CreateCompatibleBitmap (my d_gdiGraphicsContext, maxWidth, maxHeight);
+						SelectBitmap (dc, bitmap);
+						SetBkMode (dc, TRANSPARENT);   // not the default!
+						SelectPen (dc, GetStockPen (BLACK_PEN));
+						SelectBrush (dc, GetStockBrush (BLACK_BRUSH));
+						SetTextAlign (dc, TA_LEFT | TA_BASELINE | TA_NOUPDATECP);   // baseline is not the default!
+						inited = 1;
 					}
-				#endif
-			}
+					width += 4;   // for slant
+					Rectangle (dc, 0, top, width, bottom);
+					SelectFont (dc, fonts [my resolutionNumber] [font] [lc -> size] [lc -> style]);
+					SetTextColor (dc, my d_winForegroundColour);
+					WCHAR *codesW = Melder_peek32toW (codes);
+					TextOutW (dc, 0, baseline, codesW, str16len ((const char16 *) codesW));
+					BitBlt (my d_gdiGraphicsContext, xDC, yDC - ascent, width, bottom - top, dc, 0, top, SRCINVERT);
+				} else {
+					SelectPen (my d_gdiGraphicsContext, my d_winPen), SelectBrush (my d_gdiGraphicsContext, my d_winBrush);
+					if (lc -> link) SetTextColor (my d_gdiGraphicsContext, RGB (0, 0, 255)); else SetTextColor (my d_gdiGraphicsContext, my d_winForegroundColour);
+					SelectFont (my d_gdiGraphicsContext, fonts [my resolutionNumber] [font] [lc -> size] [lc -> style]);
+					WCHAR *codesW = Melder_peek32toW (codes);
+					TextOutW (my d_gdiGraphicsContext, xDC, yDC, codesW, str16len ((const char16 *) codesW));
+					if (lc -> link) SetTextColor (my d_gdiGraphicsContext, my d_winForegroundColour);
+					SelectPen (my d_gdiGraphicsContext, GetStockPen (BLACK_PEN)), SelectBrush (my d_gdiGraphicsContext, GetStockBrush (NULL_BRUSH));
+				}
+			#endif
 			/*
 			 * Back to normal colour.
 			 */
@@ -1124,139 +925,96 @@ static void charDraw (I, int xDC, int yDC, _Graphics_widechar *lc,
 			#endif
 		} else {
 			/*
-			 * Rotated text. This time, the easiest case is the bitmap IPA font;
+			 * Rotated text.
 			 */
-			if (needBitmappedIPA) {
-				int ichar, dx1 = 0;
-				double cosa, sina;
-				if (my textRotation == 90.0f) { cosa = 0.0; sina = 1.0; }
-				else if (my textRotation == 270.0f) { cosa = 0.0; sina = -1.0; }
-				else { double a = my textRotation * NUMpi / 180.0; cosa = cos (a); sina = sin (a); }
-				for (ichar = 0; ichar < nchars; ichar ++) {
-					int irow, icol, code = ((unsigned char *) codes8) [ichar];
-					int ncol = strlen (ipaSerifRegular24 [code - 32] [0]);
-					for (irow = 0; irow < 24; irow ++) {
-						const char *row = ipaSerifRegular24 [code - 32] [irow];
-						double dy1 = irow - 18;
-						for (icol = 0; icol < ncol; icol ++) {
-							if (row [icol] == '#') {
-								int xp = xDC + (int) (cosa * dx1 + sina * dy1);
-								int yp = yDC - (int) (sina * dx1 - cosa * dy1);
-								#if cairo
-									Melder_assert (my d_cairoGraphicsContext);
-									if (my duringXor) {
-									} else {
-										cairo_move_to (my d_cairoGraphicsContext, xp, yp);
-										cairo_line_to (my d_cairoGraphicsContext, xp, yp);
-									}
-								#elif win
-									SetPixel (my d_gdiGraphicsContext, xp, yp, my d_winForegroundColour);
-								#endif
-							}
-							dx1 ++;
-						}
-						row ++;
-						dx1 -= ncol;
-					}
-					dx1 += ncol;
+			#if cairo
+				Melder_assert (my d_cairoGraphicsContext);
+				enum _cairo_font_slant  slant  = (lc -> style & Graphics_ITALIC ? CAIRO_FONT_SLANT_ITALIC : CAIRO_FONT_SLANT_NORMAL);
+				enum _cairo_font_weight weight = (lc -> style & Graphics_BOLD   ? CAIRO_FONT_WEIGHT_BOLD  : CAIRO_FONT_WEIGHT_NORMAL);
+				cairo_set_font_size (my d_cairoGraphicsContext, lc -> size);
+				switch (font) {
+					case kGraphics_font_HELVETICA: cairo_select_font_face (my d_cairoGraphicsContext, "Helvetica", slant, weight); break;
+					case kGraphics_font_TIMES:     cairo_select_font_face (my d_cairoGraphicsContext, "Times"    , slant, weight); break;
+					case kGraphics_font_COURIER:   cairo_select_font_face (my d_cairoGraphicsContext, "Courier"  , slant, weight); break;
+					case kGraphics_font_PALATINO:  cairo_select_font_face (my d_cairoGraphicsContext, "Palatino" , slant, weight); break;
+					case kGraphics_font_SYMBOL:    cairo_select_font_face (my d_cairoGraphicsContext, "Symbol"   , slant, weight); break;
+					case kGraphics_font_IPATIMES:  cairo_select_font_face (my d_cairoGraphicsContext, "IPA Times", slant, weight); break;
+					case kGraphics_font_DINGBATS:  cairo_select_font_face (my d_cairoGraphicsContext, "Dingbats" , slant, weight); break;
+					default:                       cairo_select_font_face (my d_cairoGraphicsContext, "Sans"     , slant, weight); break;
 				}
-				#if cairo
-					if (my duringXor) {
-					} else {
-						cairo_stroke (my d_cairoGraphicsContext);
-					}
-				#endif
-			} else {
-				/*
-				 * Rotated native font.
-				 */
-				#if cairo
-					Melder_assert (my d_cairoGraphicsContext);
-					enum _cairo_font_slant  slant  = (lc -> style & Graphics_ITALIC ? CAIRO_FONT_SLANT_ITALIC : CAIRO_FONT_SLANT_NORMAL);
-					enum _cairo_font_weight weight = (lc -> style & Graphics_BOLD   ? CAIRO_FONT_WEIGHT_BOLD  : CAIRO_FONT_WEIGHT_NORMAL);
-					cairo_set_font_size (my d_cairoGraphicsContext, lc -> size);
-					switch (font) {
-						case kGraphics_font_HELVETICA: cairo_select_font_face (my d_cairoGraphicsContext, "Helvetica", slant, weight); break;
-						case kGraphics_font_TIMES:     cairo_select_font_face (my d_cairoGraphicsContext, "Times"    , slant, weight); break;
-						case kGraphics_font_COURIER:   cairo_select_font_face (my d_cairoGraphicsContext, "Courier"  , slant, weight); break;
-						case kGraphics_font_PALATINO:  cairo_select_font_face (my d_cairoGraphicsContext, "Palatino" , slant, weight); break;
-						case kGraphics_font_SYMBOL:    cairo_select_font_face (my d_cairoGraphicsContext, "Symbol"   , slant, weight); break;
-						case kGraphics_font_IPATIMES:  cairo_select_font_face (my d_cairoGraphicsContext, "IPA Times", slant, weight); break;
-						case kGraphics_font_DINGBATS:  cairo_select_font_face (my d_cairoGraphicsContext, "Dingbats" , slant, weight); break;
-						default:                       cairo_select_font_face (my d_cairoGraphicsContext, "Sans"     , slant, weight); break;
-					}
-					cairo_save (my d_cairoGraphicsContext);
-					cairo_translate (my d_cairoGraphicsContext, xDC, yDC);
-					//cairo_scale (my d_cairoGraphicsContext, 1, -1);
-					cairo_rotate (my d_cairoGraphicsContext, - my textRotation * NUMpi / 180.0);
-					cairo_move_to (my d_cairoGraphicsContext, 0, 0);
-					cairo_show_text (my d_cairoGraphicsContext, Melder_peekWcsToUtf8 (codes));
-					cairo_restore (my d_cairoGraphicsContext);
+				cairo_save (my d_cairoGraphicsContext);
+				cairo_translate (my d_cairoGraphicsContext, xDC, yDC);
+				//cairo_scale (my d_cairoGraphicsContext, 1, -1);
+				cairo_rotate (my d_cairoGraphicsContext, - my textRotation * NUMpi / 180.0);
+				cairo_move_to (my d_cairoGraphicsContext, 0, 0);
+				cairo_show_text (my d_cairoGraphicsContext, Melder_peek32to8 (codes));
+				cairo_restore (my d_cairoGraphicsContext);
+				return;
+			#elif win
+				if (1) {
+					SelectPen (my d_gdiGraphicsContext, my d_winPen), SelectBrush (my d_gdiGraphicsContext, my d_winBrush);
+					if (lc -> link) SetTextColor (my d_gdiGraphicsContext, RGB (0, 0, 255)); else SetTextColor (my d_gdiGraphicsContext, my d_winForegroundColour);
+					SelectFont (my d_gdiGraphicsContext, fonts [my resolutionNumber] [font] [lc -> size] [lc -> style]);
+					int restore = SaveDC (my d_gdiGraphicsContext);
+					SetGraphicsMode (my d_gdiGraphicsContext, GM_ADVANCED);
+					double a = my textRotation * NUMpi / 180.0, cosa = cos (a), sina = sin (a);
+					XFORM rotate = { (float) cosa, (float) - sina, (float) sina, (float) cosa, 0, 0 };
+					ModifyWorldTransform (my d_gdiGraphicsContext, & rotate, MWT_RIGHTMULTIPLY);
+					XFORM translate = { 1, 0, 0, 1, (float) xDC, (float) yDC };
+					ModifyWorldTransform (my d_gdiGraphicsContext, & translate, MWT_RIGHTMULTIPLY);
+					WCHAR *codesW = Melder_peek32toW (codes);
+					TextOutW (my d_gdiGraphicsContext, 0 /*xDC*/, 0 /*yDC*/, codesW, str16len ((const char16 *) codesW));
+					RestoreDC (my d_gdiGraphicsContext, restore);
+					if (lc -> link) SetTextColor (my d_gdiGraphicsContext, my d_winForegroundColour);
+					SelectPen (my d_gdiGraphicsContext, GetStockPen (BLACK_PEN)), SelectBrush (my d_gdiGraphicsContext, GetStockBrush (NULL_BRUSH));
 					return;
-				#elif win
-					if (1) {
-						SelectPen (my d_gdiGraphicsContext, my d_winPen), SelectBrush (my d_gdiGraphicsContext, my d_winBrush);
-						if (lc -> link) SetTextColor (my d_gdiGraphicsContext, RGB (0, 0, 255)); else SetTextColor (my d_gdiGraphicsContext, my d_winForegroundColour);
-						SelectFont (my d_gdiGraphicsContext, fonts [my resolutionNumber] [font] [lc -> size] [lc -> style]);
-						int restore = SaveDC (my d_gdiGraphicsContext);
-						SetGraphicsMode (my d_gdiGraphicsContext, GM_ADVANCED);
-						double a = my textRotation * NUMpi / 180.0, cosa = cos (a), sina = sin (a);
-						XFORM rotate = { (float) cosa, (float) - sina, (float) sina, (float) cosa, 0, 0 };
-						ModifyWorldTransform (my d_gdiGraphicsContext, & rotate, MWT_RIGHTMULTIPLY);
-						XFORM translate = { 1, 0, 0, 1, (float) xDC, (float) yDC };
-						ModifyWorldTransform (my d_gdiGraphicsContext, & translate, MWT_RIGHTMULTIPLY);
-						TextOutW (my d_gdiGraphicsContext, 0 /*xDC*/, 0 /*yDC*/, (const wchar_t *) codes16, nchars);
-						RestoreDC (my d_gdiGraphicsContext, restore);
-						if (lc -> link) SetTextColor (my d_gdiGraphicsContext, my d_winForegroundColour);
-						SelectPen (my d_gdiGraphicsContext, GetStockPen (BLACK_PEN)), SelectBrush (my d_gdiGraphicsContext, GetStockBrush (NULL_BRUSH));
-						return;
-					}
-				#endif
-				int ascent = (1.0/72) * my fontSize * my resolution;
-				int descent = (1.0/216) * my fontSize * my resolution;
-				int ix, iy /*, baseline = 1 + ascent * 2*/;
-				double cosa, sina;
+				}
+			#endif
+			int ascent = (1.0/72) * my fontSize * my resolution;
+			int descent = (1.0/216) * my fontSize * my resolution;
+			int ix, iy /*, baseline = 1 + ascent * 2*/;
+			double cosa, sina;
+			#if win
+				int maxWidth = 1000, maxHeight = 600;   // BUG: printer???
+				int baseline = maxHeight / 4, top = baseline - ascent - 1, bottom = baseline + descent + 1;
+				static int inited = 0;
+				static HDC dc;
+				static HBITMAP bitmap;
+				if (! inited) {
+					dc = CreateCompatibleDC (my d_gdiGraphicsContext);
+					bitmap = CreateBitmap (/*my d_gdiGraphicsContext,*/ maxWidth, maxHeight, 1, 1, nullptr);
+					SelectBitmap (dc, bitmap);
+					inited = 1;
+				}
+			#endif
+			width += 4;   // leave room for slant
+			#if win
+				SelectPen (dc, GetStockPen (WHITE_PEN));
+				SelectBrush (dc, GetStockBrush (WHITE_BRUSH));
+				SetTextAlign (dc, TA_LEFT | TA_BASELINE | TA_NOUPDATECP);   // baseline is not the default!
+				Rectangle (dc, 0, top, maxWidth, bottom + 1);
+				//Rectangle (dc, 0, 0, maxWidth, maxHeight);
+				SelectPen (dc, GetStockPen (BLACK_PEN));
+				SelectBrush (dc, GetStockBrush (NULL_BRUSH));
+				SelectFont (dc, fonts [my resolutionNumber] [font] [lc -> size] [lc -> style]);
+				WCHAR *codesW = Melder_peek32toW (codes);
+				TextOutW (dc, 0, baseline, codesW, str16len ((const char16 *) codesW));
+			#endif
+			if (my textRotation == 90.0) { cosa = 0.0; sina = 1.0; }
+			else if (my textRotation == 270.0) { cosa = 0.0; sina = -1.0; }
+			else { double a = my textRotation * NUMpi / 180.0; cosa = cos (a); sina = sin (a); }
+			for (ix = 0; ix < width; ix ++) {
+				double dx1 = ix;
 				#if win
-					int maxWidth = 1000, maxHeight = 600;   // BUG: printer???
-					int baseline = maxHeight / 4, top = baseline - ascent - 1, bottom = baseline + descent + 1;
-					static int inited = 0;
-					static HDC dc;
-					static HBITMAP bitmap;
-					if (! inited) {
-						dc = CreateCompatibleDC (my d_gdiGraphicsContext);
-						bitmap = CreateBitmap (/*my d_gdiGraphicsContext,*/ maxWidth, maxHeight, 1, 1, NULL);
-						SelectBitmap (dc, bitmap);
-						inited = 1;
+					for (iy = top; iy <= bottom; iy ++) {
+						if (GetPixel (dc, ix, iy) == RGB (0, 0, 0)) {   // black?
+							int dy1 = iy - baseline;   // translate, rotate, translate
+							int xp = xDC + (int) (cosa * dx1 + sina * dy1);
+							int yp = yDC - (int) (sina * dx1 - cosa * dy1);
+							SetPixel (my d_gdiGraphicsContext, xp, yp, my d_winForegroundColour);
+						}
 					}
 				#endif
-				width += 4;   /* Leave room for slant. */
-				#if win
-					SelectPen (dc, GetStockPen (WHITE_PEN));
-					SelectBrush (dc, GetStockBrush (WHITE_BRUSH));
-					SetTextAlign (dc, TA_LEFT | TA_BASELINE | TA_NOUPDATECP);   // baseline is not the default!
-					Rectangle (dc, 0, top, maxWidth, bottom + 1);
-					//Rectangle (dc, 0, 0, maxWidth, maxHeight);
-					SelectPen (dc, GetStockPen (BLACK_PEN));
-					SelectBrush (dc, GetStockBrush (NULL_BRUSH));
-					SelectFont (dc, fonts [my resolutionNumber] [font] [lc -> size] [lc -> style]);
-					TextOutW (dc, 0, baseline, (const wchar_t *) codes16, nchars);
-				#endif
-				if (my textRotation == 90.0) { cosa = 0.0; sina = 1.0; }
-				else if (my textRotation == 270.0) { cosa = 0.0; sina = -1.0; }
-				else { double a = my textRotation * NUMpi / 180.0; cosa = cos (a); sina = sin (a); }
-				for (ix = 0; ix < width; ix ++) {
-					double dx1 = ix;
-					#if win
-						for (iy = top; iy <= bottom; iy ++) {
-							if (GetPixel (dc, ix, iy) == RGB (0, 0, 0)) {   /* Black? */
-								int dy1 = iy - baseline;   /* Translate, rotate, translate. */
-								int xp = xDC + (int) (cosa * dx1 + sina * dy1);
-								int yp = yDC - (int) (sina * dx1 - cosa * dy1);
-								SetPixel (my d_gdiGraphicsContext, xp, yp, my d_winForegroundColour);
-							}
-						}
-					#endif
-				}
 			}
 		}
 	}
@@ -1282,42 +1040,217 @@ static void exitText (I) {
 
 static long bufferSize;
 static _Graphics_widechar *theWidechar;
-static wchar_t *charCodes;
-static char *charCodes8;
-static char16_t *charCodes16;
-static int initBuffer (const wchar_t *txt) {
+static char32 *charCodes;
+static int initBuffer (const char32 *txt) {
 	try {
-		long sizeNeeded = wcslen (txt) + 1;   /* It is true that some characters are split into two, but all of these are backslash sequences. */
+		long sizeNeeded = str32len (txt) + 1;
 		if (sizeNeeded > bufferSize) {
 			sizeNeeded += sizeNeeded / 2 + 100;
 			Melder_free (theWidechar);
 			Melder_free (charCodes);
-			Melder_free (charCodes8);
-			Melder_free (charCodes16);
 			theWidechar = Melder_calloc (_Graphics_widechar, sizeNeeded);
-			charCodes = Melder_calloc (wchar_t, sizeNeeded);
-			charCodes8 = Melder_calloc (char, sizeNeeded);
-			charCodes16 = Melder_calloc (char16_t, sizeNeeded);
+			charCodes = Melder_calloc (char32, sizeNeeded);
 			bufferSize = sizeNeeded;
 		}
 		return 1;
 	} catch (MelderError) {
 		bufferSize = 0;
-		Melder_flushError (NULL);
+		Melder_flushError ();
 		return 0;
 	}
 }
 
 static int numberOfLinks = 0;
-static Graphics_Link links [100];    /* A maximum of 100 links per string. */
+static Graphics_Link links [100];    // a maximum of 100 links per string
 
-static void charSizes (Graphics me, _Graphics_widechar string []) {
+static void charSizes (Graphics me, _Graphics_widechar string [], bool measureEachCharacterSeparately) {
+	if (my postScript) {
+		for (_Graphics_widechar *character = string; character -> kar > U'\t'; character ++)
+			charSize (me, character);
+	} else {
 	/*
 	 * Measure the size of each character.
 	 */
 	_Graphics_widechar *character;
-	for (character = string; character -> kar > '\t'; character ++)
-		charSize (me, character);
+	#if cocoa
+		int numberOfDiacritics = 0;
+		for (_Graphics_widechar *lc = string; lc -> kar > U'\t'; lc ++) {
+			/*
+			 * Determine the font family.
+			 */
+			Longchar_Info info = Longchar_getInfoFromNative (lc -> kar);
+			int font =
+				info -> alphabet == Longchar_SYMBOL || // ? kGraphics_font_SYMBOL :
+				info -> alphabet == Longchar_PHONETIC ?
+					( my font == kGraphics_font_TIMES ?
+						( hasDoulos ?
+							( lc -> style == 0 ?
+								kGraphics_font_IPATIMES :
+							  hasCharis ?
+								kGraphics_font_IPAPALATINO :   // other styles in Charis, because Doulos has no bold or italic
+								kGraphics_font_TIMES
+							) :
+						  hasCharis ?
+							kGraphics_font_IPAPALATINO :
+							kGraphics_font_TIMES   // on newer systems, Times and Times New Roman have a lot of phonetic characters
+						) :
+					  my font == kGraphics_font_HELVETICA || my font == kGraphics_font_COURIER ?
+						my font :   // sans serif or wide, so fall back on Lucida Grande for phonetic characters
+					  /* my font must be kGraphics_font_PALATINO */
+					  hasCharis && Melder_debug != 900 ?
+						kGraphics_font_IPAPALATINO :
+					  hasDoulos && Melder_debug != 900 ?
+					    ( lc -> style == 0 ?
+							kGraphics_font_IPATIMES :
+							kGraphics_font_TIMES
+						) :
+						kGraphics_font_PALATINO
+					) :
+				lc -> kar == '/' ?
+					kGraphics_font_PALATINO :   // override Courier
+				info -> alphabet == Longchar_DINGBATS ?
+					kGraphics_font_DINGBATS :
+				lc -> font.integer == kGraphics_font_COURIER ?
+					kGraphics_font_COURIER :
+				my font == kGraphics_font_TIMES ?
+					( hasDoulos ?
+						( lc -> style == 0 ?
+							kGraphics_font_IPATIMES :
+						  lc -> style == Graphics_ITALIC ?
+							kGraphics_font_TIMES :
+						  hasCharis ?
+							kGraphics_font_IPAPALATINO :
+							kGraphics_font_TIMES 
+						) :
+						kGraphics_font_TIMES
+					) :   // needed for correct placement of diacritics
+				my font == kGraphics_font_HELVETICA ?
+					kGraphics_font_HELVETICA :
+				my font == kGraphics_font_PALATINO ?
+					( hasCharis && Melder_debug != 900 ?
+						kGraphics_font_IPAPALATINO :
+						kGraphics_font_PALATINO
+					) :
+				my font;   // why not lc -> font.integer?
+			Melder_assert (font >= 0 && font <= kGraphics_font_DINGBATS);
+			lc -> font.string = nullptr;   // this erases font.integer!
+
+			/*
+			 * Determine the style.
+			 */
+			int style = lc -> style;
+			Melder_assert (style >= 0 && style <= Graphics_BOLD_ITALIC);
+
+			/*
+			 * Determine the font-style combination.
+			 */
+			CTFontRef ctFont = theScreenFonts [font] [100] [style];
+			if (! ctFont) {
+				CTFontSymbolicTraits ctStyle = ( style & Graphics_BOLD ? kCTFontBoldTrait : 0 ) | ( lc -> style & Graphics_ITALIC ? kCTFontItalicTrait : 0 );
+				NSMutableDictionary *styleDict = [[NSMutableDictionary alloc] initWithCapacity: 1];
+				[styleDict   setObject: [NSNumber numberWithUnsignedInt: ctStyle]   forKey: (id) kCTFontSymbolicTrait];
+				NSMutableDictionary *attributes = [[NSMutableDictionary alloc] initWithCapacity: 2];
+				[attributes   setObject: styleDict   forKey: (id) kCTFontTraitsAttribute];
+				switch (font) {
+					case kGraphics_font_TIMES:       { [attributes   setObject: @"Times"           forKey: (id) kCTFontNameAttribute]; } break;
+					case kGraphics_font_HELVETICA:   { [attributes   setObject: @"Arial"           forKey: (id) kCTFontNameAttribute]; } break;
+					case kGraphics_font_COURIER:     { [attributes   setObject: @"Courier New"     forKey: (id) kCTFontNameAttribute]; } break;
+					case kGraphics_font_PALATINO:    { if (Melder_debug == 900)
+															[attributes   setObject: @"DG Meta Serif Science" forKey: (id) kCTFontNameAttribute];
+													   else
+														    [attributes   setObject: @"Palatino"              forKey: (id) kCTFontNameAttribute];
+													 } break;
+					case kGraphics_font_SYMBOL:      { [attributes   setObject: @"Symbol"          forKey: (id) kCTFontNameAttribute]; } break;
+					case kGraphics_font_IPATIMES:    { [attributes   setObject: @"Doulos SIL"      forKey: (id) kCTFontNameAttribute]; } break;
+					case kGraphics_font_IPAPALATINO: { [attributes   setObject: @"Charis SIL"      forKey: (id) kCTFontNameAttribute]; } break;
+					case kGraphics_font_DINGBATS:    { [attributes   setObject: @"Zapf Dingbats"   forKey: (id) kCTFontNameAttribute]; } break;
+				}
+ 				CTFontDescriptorRef ctFontDescriptor = CTFontDescriptorCreateWithAttributes ((CFMutableDictionaryRef) attributes);
+				[styleDict release];
+				[attributes release];
+				ctFont = CTFontCreateWithFontDescriptor (ctFontDescriptor, 100.0, nullptr);
+				CFRelease (ctFontDescriptor);
+ 				theScreenFonts [font] [100] [style] = ctFont;
+			}
+
+			int normalSize = my fontSize * my resolution / 72.0;
+			lc -> size = lc -> size < 100 ? (3 * normalSize + 2) / 4 : normalSize;
+			lc -> baseline *= 0.01 * normalSize;
+			lc -> code = lc -> kar;
+			lc -> font.integer = font;
+			if (info -> ps.times == 0) {
+				numberOfDiacritics ++;
+			}
+		}
+		int nchars = 0;
+		for (_Graphics_widechar *lc = string; lc -> kar > U'\t'; lc ++) {
+			charCodes [nchars ++] = lc -> code;
+			_Graphics_widechar *next = lc + 1;
+			lc -> width = 0;
+			if (measureEachCharacterSeparately ||
+				next->kar <= U' ' || next->style != lc->style ||
+				next->baseline != lc->baseline || next->size != lc->size || next->link != lc->link ||
+				next->font.integer != lc->font.integer || next->font.string != lc->font.string ||
+				next->rightToLeft != lc->rightToLeft ||
+				(my textRotation != 0.0 && my screen && my resolution > 150))
+			{
+				charCodes [nchars] = U'\0';
+				const char16 *codes16 = Melder_peek32to16 (charCodes);
+				int64 length = str16len (codes16);
+
+				NSString *s = [[NSString alloc]
+					initWithBytes: codes16
+					length: (NSUInteger) (length * 2)
+					encoding: NSUTF16LittleEndianStringEncoding   // BUG: should be NSUTF16NativeStringEncoding, except that that doesn't exist
+					];
+
+				CFRange textRange = CFRangeMake (0, (CFIndex) [s length]);
+
+				CFMutableAttributedStringRef cfstring =
+					CFAttributedStringCreateMutable (kCFAllocatorDefault, (CFIndex) [s length]);
+				CFAttributedStringReplaceString (cfstring, CFRangeMake (0, 0), (CFStringRef) s);
+				CFAttributedStringSetAttribute (cfstring, textRange, kCTFontAttributeName, theScreenFonts [lc -> font.integer] [100] [lc -> style]);
+
+				/*
+				 * Measure.
+				 */
+
+				// Create a path to render text in
+				CGMutablePathRef path = CGPathCreateMutable ();
+				NSRect measureRect = NSMakeRect (0, 0, CGFLOAT_MAX, CGFLOAT_MAX);
+				CGPathAddRect (path, nullptr, (CGRect) measureRect);
+			
+				CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString ((CFAttributedStringRef) cfstring);
+				CFRange fitRange;
+				CGSize targetSize = CGSizeMake (lc -> width, CGFLOAT_MAX);
+				CGSize frameSize = CTFramesetterSuggestFrameSizeWithConstraints (framesetter, textRange, nullptr, targetSize, & fitRange);
+				CFRelease (framesetter);
+				CFRelease (cfstring);
+				[s release];
+				CFRelease (path);
+				//Longchar_Info info = Longchar_getInfoFromNative (lc -> kar);
+				//bool isDiacritic = info -> ps.times == 0;
+				//lc -> width = isDiacritic ? 0.0 : frameSize.width * lc -> size / 100.0;
+				lc -> width = frameSize.width * lc -> size / 100.0;
+				#if cocoa
+					if (Melder_systemVersion >= 101100) {
+						/*
+						 * If the text ends in a space, CTFramesetterSuggestFrameSizeWithConstraints() ignores the space.
+						 * we correct for this.
+						 */
+						if (codes16 [length - 1] == u' ') {
+							lc -> width += 25.0 * lc -> size / 100.0;
+						}
+					}
+				#endif
+				nchars = 0;
+			}
+		}
+	#else
+		for (character = string; character -> kar > U'\t'; character ++)
+			charSize (me, character);
+	#endif
+	}
 	/*
 	 * Each character has been garnished with information about the character's width.
 	 * Make a correction for systems that make slanted characters overlap the character box to their right.
@@ -1325,15 +1258,15 @@ static void charSizes (Graphics me, _Graphics_widechar string []) {
 	 *
 	 * Keep this in SYNC with psTextWidth.
 	 */
-	for (character = string; character -> kar > '\t'; character ++) {
+	for (_Graphics_widechar *character = string; character -> kar > U'\t'; character ++) {
 		if ((character -> style & Graphics_ITALIC) != 0) {
 			_Graphics_widechar *nextCharacter = character + 1;
-			if (nextCharacter -> kar <= '\t') {
+			if (nextCharacter -> kar <= U'\t') {
 				character -> width += SLANT_CORRECTION / 72 * my fontSize * my resolution;
 			} else if (((nextCharacter -> style & Graphics_ITALIC) == 0 && nextCharacter -> baseline >= character -> baseline)
 				|| (character -> baseline == 0 && nextCharacter -> baseline > 0))
 			{
-				if (nextCharacter -> kar == '.' || nextCharacter -> kar == ',')
+				if (nextCharacter -> kar == U'.' || nextCharacter -> kar == U',')
 					character -> width += SLANT_CORRECTION / 144 * my fontSize * my resolution;
 				else
 					character -> width += SLANT_CORRECTION / 72 * my fontSize * my resolution;
@@ -1348,7 +1281,7 @@ static void charSizes (Graphics me, _Graphics_widechar string []) {
 static double textWidth (_Graphics_widechar string []) {
 	_Graphics_widechar *character;
 	double width = 0;
-	for (character = string; character -> kar > '\t'; character ++)
+	for (character = string; character -> kar > U'\t'; character ++)
 		width += character -> width;
 	return width;
 }
@@ -1360,11 +1293,11 @@ static void drawOneCell (Graphics me, int xDC, int yDC, _Graphics_widechar lc []
 	 * We must continue even if width is zero (for adjusting textY).
 	 */
 	_Graphics_widechar *plc, *lastlc;
-	int inLink = 0;
+	bool inLink = false;
 	switch (my horizontalTextAlignment) {
 		case Graphics_LEFT:      dx = 1 + (0.1/72) * my fontSize * my resolution; break;
 		case Graphics_CENTRE:    dx = - width / 2; break;
-		case Graphics_RIGHT:     dx = width ? - width - (0.1/72) * my fontSize * my resolution : 0; break;   // if width is zero, do not step left
+		case Graphics_RIGHT:     dx = width != 0.0 ? - width - (0.1/72) * my fontSize * my resolution : 0; break;   // if width is zero, do not step left
 		default:                 dx = 1 + (0.1/72) * my fontSize * my resolution; break;
 	}
 	switch (my verticalTextAlignment) {
@@ -1379,16 +1312,14 @@ static void drawOneCell (Graphics me, int xDC, int yDC, _Graphics_widechar lc []
 			GraphicsQuartz_initDraw ((GraphicsScreen) me);
 		}
 	#endif
-	if (my textRotation) {
+	if (my textRotation != 0.0) {
 		double xbegin = dx, x = xbegin, cosa, sina;
 		if (my textRotation == 90.0f) { cosa = 0.0; sina = 1.0; }
 		else if (my textRotation == 270.0f) { cosa = 0.0; sina = -1.0; }
 		else { double a = my textRotation * NUMpi / 180.0; cosa = cos (a); sina = sin (a); }
-		for (plc = lc; plc -> kar > '\t'; plc ++) {
+		for (plc = lc; plc -> kar > U'\t'; plc ++) {
 			_Graphics_widechar *next = plc + 1;
-			charCodes [nchars] = plc -> code;   // buffer...
-			charCodes8 [nchars] = plc -> code;   // buffer...
-			charCodes16 [nchars ++] = plc -> code;   // buffer...
+			charCodes [nchars ++] = plc -> code;   // buffer...
 			x += plc -> width;
 			/*
 			 * We can draw stretches of characters:
@@ -1397,7 +1328,7 @@ static void drawOneCell (Graphics me, int xDC, int yDC, _Graphics_widechar lc []
 			 * or if we cannot rotate multiple characters,
 			 * which is the case on bitmap printers.
 			 */
-			if (next->kar < ' ' || next->style != plc->style ||
+			if (next->kar < U' ' || next->style != plc->style ||
 				next->baseline != plc->baseline || next->size != plc->size ||
 				next->font.integer != plc->font.integer || next->font.string != plc->font.string ||
 				next->rightToLeft != plc->rightToLeft ||
@@ -1406,11 +1337,9 @@ static void drawOneCell (Graphics me, int xDC, int yDC, _Graphics_widechar lc []
 				double dy2 = dy + plc -> baseline;
 				double xr = cosa * xbegin - sina * dy2;
 				double yr = sina * xbegin + cosa * dy2;
-				charCodes [nchars] = '\0';   // ...and flush
-				charCodes8 [nchars] = '\0';   // ...and flush
-				charCodes16 [nchars] = '\0';   // ...and flush
+				charCodes [nchars] = U'\0';   // ...and flush
 				charDraw (me, xDC + xr, my yIsZeroAtTheTop ? yDC - yr : yDC + yr,
-					plc, charCodes, charCodes8, charCodes16, nchars, x - xbegin);
+					plc, charCodes, nchars, x - xbegin);
 				nchars = 0;
 				xbegin = x;
 			}
@@ -1418,29 +1347,40 @@ static void drawOneCell (Graphics me, int xDC, int yDC, _Graphics_widechar lc []
 	} else {
 		double xbegin = xDC + dx, x = xbegin, y = my yIsZeroAtTheTop ? yDC - dy : yDC + dy;
 		lastlc = lc;
-		if (my wrapWidth) {
+		if (my wrapWidth != 0.0) {
 			/*
 			 * Replace some spaces with new-line symbols.
 			 */
 			int xmax = xDC + my wrapWidth * my scaleX;
-			for (plc = lc; plc -> kar >= ' '; plc ++) {
+			for (plc = lc; plc -> kar >= U' '; plc ++) {
+				x += plc -> width;
 				if (x > xmax) {   // wrap (if wrapWidth is too small, each word will be on a separate line)
 					while (plc >= lastlc) {
-						if (plc -> kar == ' ' && ! plc -> link)   // keep links contiguous
+						if (plc -> kar == U' ' && ! plc -> link)   // keep links contiguous
 							break;
 						plc --;
 					}
 					if (plc <= lastlc) break;   // hopeless situation: no spaces; get over it
 					lastlc = plc;
-					plc -> kar = '\n';   // replace space with newline
+					plc -> kar = U'\n';   // replace space with newline
+					#if cocoa
+						_Graphics_widechar *next = plc + 1;
+						if (next->style != plc->style ||
+							next->baseline != plc->baseline || next->size != plc->size || next->link != plc->link ||
+							next->font.integer != plc->font.integer || next->font.string != plc->font.string ||
+							next->rightToLeft != plc->rightToLeft)
+						{
+							// nothing
+						} else {
+							next -> width -= 0.3 * my fontSize * my resolution / 72.0;   // subtract the width of one space
+						}
+					#endif
 					x = xDC + dx + my secondIndent * my scaleX;
-				} else {
-					x += plc -> width;
 				}
 			}
-			xbegin = x = xDC + dx;   /* Re-initialize for second pass. */
+			xbegin = x = xDC + dx;   // re-initialize for second pass
 		}
-		for (plc = lc; plc -> kar > '\t'; plc ++) {
+		for (plc = lc; plc -> kar > U'\t'; plc ++) {
 			_Graphics_widechar *next = plc + 1;
 			if (plc -> link) {
 				if (! inLink) {
@@ -1448,30 +1388,26 @@ static void drawOneCell (Graphics me, int xDC, int yDC, _Graphics_widechar lc []
 					links [++ numberOfLinks]. x1 = x;
 					links [numberOfLinks]. y1 = y - descent;
 					links [numberOfLinks]. y2 = y + 3 * descent;
-					inLink = TRUE;
+					inLink = true;
 				}
 			} else if (inLink) {
 				links [numberOfLinks]. x2 = x;
-				inLink = FALSE;
+				inLink = false;
 			}
-			if (plc -> kar == '\n') {
+			if (plc -> kar == U'\n') {
 				xbegin = x = xDC + dx + my secondIndent * my scaleX;
 				y = my yIsZeroAtTheTop ? y + (1.2/72) * my fontSize * my resolution : y - (1.2/72) * my fontSize * my resolution;
 			} else {
-				charCodes [nchars] = plc -> code;   // buffer...
-				charCodes8 [nchars] = plc -> code;   // buffer...
-				charCodes16 [nchars ++] = plc -> code;   // buffer...
+				charCodes [nchars ++] = plc -> code;   // buffer...
 				x += plc -> width;
-				if (next->kar < ' ' || next->style != plc->style ||
+				if (next->kar < U' ' || next->style != plc->style ||
 					next->baseline != plc->baseline || next->size != plc->size || next->link != plc->link ||
 					next->font.integer != plc->font.integer || next->font.string != plc->font.string ||
 					next->rightToLeft != plc->rightToLeft)
 				{
-					charCodes [nchars] = '\0';   // ...and flush
-					charCodes8 [nchars] = '\0';   // ...and flush
-					charCodes16 [nchars] = '\0';   // ...and flush
+					charCodes [nchars] = U'\0';   // ...and flush
 					charDraw (me, xbegin, my yIsZeroAtTheTop ? y - plc -> baseline : y + plc -> baseline,
-						plc, charCodes, charCodes8, charCodes16, nchars, x - xbegin);
+						plc, charCodes, nchars, x - xbegin);
 					nchars = 0;
 					xbegin = x;
 				}
@@ -1479,7 +1415,7 @@ static void drawOneCell (Graphics me, int xDC, int yDC, _Graphics_widechar lc []
 		}
 		if (inLink) {
 			links [numberOfLinks]. x2 = x;
-			inLink = FALSE;
+			inLink = false;
 		}
 		my textX = (x - my deltaX) / my scaleX;
 		my textY = (( my yIsZeroAtTheTop ? y + dy : y - dy ) - my deltaY) / my scaleY;
@@ -1504,11 +1440,11 @@ static void drawCells (Graphics me, double xWC, double yWC, _Graphics_widechar l
 	double saveWrapWidth = my wrapWidth;
 	numberOfLinks = 0;
 	for (plc = lc; /* No stop condition. */ ; plc ++) {
-		charSizes (me, plc);
+		charSizes (me, plc, false);
 		drawOneCell (me, xWC * my scaleX + my deltaX, yWC * my scaleY + my deltaY, plc);
-		while (plc -> kar != '\0' && plc -> kar != '\t') plc ++;   // Find end of cell.
-		if (plc -> kar == '\0') break;   // End of text?
-		if (plc -> kar == '\t') {   // Go to next cell.
+		while (plc -> kar != U'\0' && plc -> kar != U'\t') plc ++;   // find end of cell
+		if (plc -> kar == U'\0') break;   // end of text?
+		if (plc -> kar == U'\t') {   // go to next cell
 			xWC += ( tabs [itab]. alignment == Graphics_LEFT ? tabs [itab]. width :
 			       tabs [itab]. alignment == Graphics_CENTRE ? 0.5 * tabs [itab]. width : 0 ) * my fontSize / 12.0;
 			itab ++;
@@ -1522,9 +1458,9 @@ static void drawCells (Graphics me, double xWC, double yWC, _Graphics_widechar l
 	my wrapWidth = saveWrapWidth;
 }
 
-static void parseTextIntoCellsLinesRuns (Graphics me, const wchar_t *txt, _Graphics_widechar a_widechar []) {
-	wchar_t kar;
-	const wchar_t *in = txt;
+static void parseTextIntoCellsLinesRuns (Graphics me, const char32 *txt /* cattable */, _Graphics_widechar a_widechar []) {
+	char32 kar;
+	const char32 *in = txt;
 	int nquote = 0;
 	_Graphics_widechar *out = & a_widechar [0];
 	unsigned int charSuperscript = 0, charSubscript = 0, charItalic = 0, charBold = 0;
@@ -1532,40 +1468,40 @@ static void parseTextIntoCellsLinesRuns (Graphics me, const wchar_t *txt, _Graph
 	unsigned int globalSuperscript = 0, globalSubscript = 0, globalItalic = 0, globalBold = 0, globalCode = 0, globalLink = 0;
 	unsigned int globalSmall = 0;
 	numberOfLinks = 0;
-	while ((kar = *in++) != '\0') {
-		if (kar == '^' && my circumflexIsSuperscript) {
+	while ((kar = *in++) != U'\0') {
+		if (kar == U'^' && my circumflexIsSuperscript) {
 			if (globalSuperscript) globalSuperscript = 0;
 			else if (in [0] == '^') { globalSuperscript = 1; in ++; }
 			else charSuperscript = 1;
 			wordItalic = wordBold = wordCode = 0;
 			continue;
-		} else if (kar == '_' && my underscoreIsSubscript) {
+		} else if (kar == U'_' && my underscoreIsSubscript) {
 			if (globalSubscript) { globalSubscript = 0; wordItalic = wordBold = wordCode = 0; continue; }
-			else if (in [0] == '_') { globalSubscript = 1; in ++; wordItalic = wordBold = wordCode = 0; continue; }
+			else if (in [0] == U'_') { globalSubscript = 1; in ++; wordItalic = wordBold = wordCode = 0; continue; }
 			else if (! my dollarSignIsCode) { charSubscript = 1; wordItalic = wordBold = wordCode = 0; continue; }   // not in manuals
 			else
-				;   // A normal underscore in manuals.
-		} else if (kar == '%' && my percentSignIsItalic) {
+				;   // a normal underscore in manuals
+		} else if (kar == U'%' && my percentSignIsItalic) {
 			if (globalItalic) globalItalic = 0;
-			else if (in [0] == '%') { globalItalic = 1; in ++; }
+			else if (in [0] == U'%') { globalItalic = 1; in ++; }
 			else if (my dollarSignIsCode) wordItalic = 1;   // in manuals
 			else charItalic = 1;
 			continue;
-		} else if (kar == '#' && my numberSignIsBold) {
+		} else if (kar == U'#' && my numberSignIsBold) {
 			if (globalBold) globalBold = 0;
-			else if (in [0] == '#') { globalBold = 1; in ++; }
+			else if (in [0] == U'#') { globalBold = 1; in ++; }
 			else if (my dollarSignIsCode) wordBold = 1;   // in manuals
 			else charBold = 1;
 			continue;
-		} else if (kar == '$' && my dollarSignIsCode) {
+		} else if (kar == U'$' && my dollarSignIsCode) {
 			if (globalCode) globalCode = 0;
-			else if (in [0] == '$') { globalCode = 1; in ++; }
+			else if (in [0] == U'$') { globalCode = 1; in ++; }
 			else wordCode = 1;
 			continue;
-		} else if (kar == '@' && my atSignIsLink   // recognize links
-		           && ! my textRotation)   // no links allowed in rotated text, because links are identified by 2-point rectangles
+		} else if (kar == U'@' && my atSignIsLink   // recognize links
+		           && my textRotation == 0.0)   // no links allowed in rotated text, because links are identified by 2-point rectangles
 		{
-			wchar_t *to, *max;
+			char32 *to, *max;
 			/*
 			 * We will distinguish:
 			 * 1. The link text: the text shown to the user, drawn in blue.
@@ -1584,28 +1520,28 @@ static void parseTextIntoCellsLinesRuns (Graphics me, const wchar_t *txt, _Graph
 				 */
 				globalLink = 0;   // close the drawn link text (the normal colour will take over)
 				continue;   // the '@' must not be drawn
-			} else if (in [0] == '@') {
+			} else if (in [0] == U'@') {
 				/*
 				 * Detected the second '@' in strings like "@@Link with spaces@".
 				 * A format like "@@Page linked to|Text shown in blue@" is permitted.
 				 * First step: collect the page text (the link information);
 				 * it is everything between "@@" and "|" or "@" or end of string.
 				 */
-				const wchar_t *from = in + 1;   // start with first character after "@@"
+				const char32 *from = in + 1;   // start with first character after "@@"
 				if (! links [++ numberOfLinks]. name)   // make room for saving link info
-					links [numberOfLinks]. name = Melder_calloc_f (wchar_t, MAX_LINK_LENGTH + 1);
+					links [numberOfLinks]. name = Melder_calloc_f (char32, MAX_LINK_LENGTH + 1);
 				to = links [numberOfLinks]. name, max = to + MAX_LINK_LENGTH;
-				while (*from && *from != '@' && *from != '|' && to < max)   // until end-of-string or '@' or '|'...
+				while (*from && *from != U'@' && *from != U'|' && to < max)   // until end-of-string or '@' or '|'...
 					* to ++ = * from ++;   // ... copy one character
-				*to = '\0';   // close saved link info
+				*to = U'\0';   // close saved link info
 				/*
 				 * Second step: collect the link text that is to be drawn.
 				 * Its characters will be collected during the normal cycles of the loop.
 				 * If the link info is equal to the link text, no action is needed.
 				 * If, on the other hand, there is a separate link info, this will have to be skipped.
 				 */
-				if (*from == '|')
-					in += to - links [numberOfLinks]. name + 1;   /* Skip link info + '|'. */
+				if (*from == U'|')
+					in += to - links [numberOfLinks]. name + 1;   // skip link info + '|'
 				/*
 				 * We are entering the link-text-collection mode.
 				 */
@@ -1620,11 +1556,11 @@ static void parseTextIntoCellsLinesRuns (Graphics me, const wchar_t *txt, _Graph
 				 * Detected a single-word link, like in "this is a @Link that consists of one word".
 				 * First step: collect the page text: letters, digits, and underscores.
 				 */
-				const wchar_t *from = in;   // start with first character after "@"
+				const char32 *from = in;   // start with first character after "@"
 				if (! links [++ numberOfLinks]. name)   // make room for saving link info
-					links [numberOfLinks]. name = Melder_calloc_f (wchar_t, MAX_LINK_LENGTH + 1);
+					links [numberOfLinks]. name = Melder_calloc_f (char32, MAX_LINK_LENGTH + 1);
 				to = links [numberOfLinks]. name, max = to + MAX_LINK_LENGTH;
-				while (*from && (isalnum (*from) || *from == '_') && to < max)   // until end-of-word...
+				while (*from && (isalnum ((int) *from) || *from == U'_') && to < max)   // until end-of-word...
 					*to ++ = *from++;   // ... copy one character
 				*to = '\0';   // close saved link info
 				/*
@@ -1635,11 +1571,11 @@ static void parseTextIntoCellsLinesRuns (Graphics me, const wchar_t *txt, _Graph
 				wordLink = 1;   // enter the single-word link-text-collection mode
 			}
 			continue;
-		} else if (kar == '\\') {
+		} else if (kar == U'\\') {
 			/*
 			 * Detected backslash sequence: backslash + kar1 + kar2...
 			 */
-			wchar_t kar1, kar2;
+			char32 kar1, kar2;
 			/*
 			 * ... except if kar1 or kar2 is null: in that case, draw the backslash.
 			 */
@@ -1648,8 +1584,8 @@ static void parseTextIntoCellsLinesRuns (Graphics me, const wchar_t *txt, _Graph
 			/*
 			 * Catch "\s{", which means: small characters until corresponding '}'.
 			 */
-			} else if (kar2 == '{') {
-				if (kar1 == 's') globalSmall = 1;
+			} else if (kar2 == U'{') {
+				if (kar1 == U's') globalSmall = 1;
 				in += 2;
 				continue;
 			/*
@@ -1659,27 +1595,27 @@ static void parseTextIntoCellsLinesRuns (Graphics me, const wchar_t *txt, _Graph
 				kar = Longchar_getInfo (kar1, kar2) -> unicode;
 				in += 2;
 			}
-		} else if (kar == '\"') {
+		} else if (kar == U'\"') {
 			if (! (my font == kGraphics_font_COURIER || my fontStyle == Graphics_CODE || wordCode || globalCode))
 				kar = ++nquote & 1 ? UNICODE_LEFT_DOUBLE_QUOTATION_MARK : UNICODE_RIGHT_DOUBLE_QUOTATION_MARK;
-		} else if (kar == '\'') {
+		} else if (kar == U'\'') {
 			kar = UNICODE_RIGHT_SINGLE_QUOTATION_MARK;
-		} else if (kar == '`') {
+		} else if (kar == U'`') {
 			kar = UNICODE_LEFT_SINGLE_QUOTATION_MARK;
 		} else if (kar >= 32 && kar <= 126) {
-			if (kar == 'f') {
-				if (in [0] == 'i' && HAS_FI_AND_FL_LIGATURES && ! (my font == kGraphics_font_COURIER || my fontStyle == Graphics_CODE || wordCode || globalCode)) {
+			if (kar == U'f') {
+				if (in [0] == U'i' && HAS_FI_AND_FL_LIGATURES && ! (my font == kGraphics_font_COURIER || my fontStyle == Graphics_CODE || wordCode || globalCode)) {
 					kar = UNICODE_LATIN_SMALL_LIGATURE_FI;
 					in ++;
-				} else if (in [0] == 'l' && HAS_FI_AND_FL_LIGATURES && ! (my font == kGraphics_font_COURIER || my fontStyle == Graphics_CODE || wordCode || globalCode)) {
+				} else if (in [0] == U'l' && HAS_FI_AND_FL_LIGATURES && ! (my font == kGraphics_font_COURIER || my fontStyle == Graphics_CODE || wordCode || globalCode)) {
 					kar = UNICODE_LATIN_SMALL_LIGATURE_FL;
 					in ++;
 				}
-			} else if (kar == '}') {
+			} else if (kar == U'}') {
 				if (globalSmall) { globalSmall = 0; continue; }
 			}
-		} else if (kar == '\t') {
-			out -> kar = '\t';
+		} else if (kar == U'\t') {
+			out -> kar = U'\t';
 			out -> rightToLeft = false;
 			wordItalic = wordBold = wordCode = wordLink = 0;
 			globalSubscript = globalSuperscript = globalItalic = globalBold = globalCode = globalLink = globalSmall = 0;
@@ -1690,24 +1626,24 @@ static void parseTextIntoCellsLinesRuns (Graphics me, const wchar_t *txt, _Graph
 			kar = ' ';
 		}
 		if (wordItalic | wordBold | wordCode | wordLink) {
-			if (! isalnum (kar) && kar != '_')   // FIXME: this test could be more precise.
+			if (! isalnum ((int) kar) && kar != U'_')   // FIXME: this test could be more precise.
 				wordItalic = wordBold = wordCode = wordLink = 0;
 		}
 		out -> style =
 			(wordLink | globalLink) && my fontStyle != Graphics_CODE ? Graphics_BOLD :
 			((my fontStyle & Graphics_ITALIC) | charItalic | wordItalic | globalItalic ? Graphics_ITALIC : 0) +
 			((my fontStyle & Graphics_BOLD) | charBold | wordBold | globalBold ? Graphics_BOLD : 0);
-		out -> font.string = NULL;
+		out -> font.string = nullptr;
 		out -> font.integer = my fontStyle == Graphics_CODE || wordCode || globalCode ||
-			kar == '/' || kar == '|' ? kGraphics_font_COURIER : my font;
+			kar == U'/' || kar == U'|' ? kGraphics_font_COURIER : my font;
 		out -> link = wordLink | globalLink;
 		out -> baseline = charSuperscript | globalSuperscript ? 34 : charSubscript | globalSubscript ? -25 : 0;
 		out -> size = globalSmall || out -> baseline != 0 ? 80 : 100;
-		if (kar == '/') {
+		if (kar == U'/') {
 			out -> baseline -= out -> size / 12;
 			out -> size += out -> size / 10;
 		}
-		out -> code = '?';   // does this have any meaning?
+		out -> code = U'?';   // does this have any meaning?
 		out -> kar = kar;
 		out -> rightToLeft =
 			(kar >= 0x0590 && kar <= 0x06FF) ||
@@ -1716,22 +1652,22 @@ static void parseTextIntoCellsLinesRuns (Graphics me, const wchar_t *txt, _Graph
 		charItalic = charBold = charSuperscript = charSubscript = 0;
 		out ++;
 	}
-	out -> kar = '\0';   // end of text
+	out -> kar = U'\0';   // end of text
 	out -> rightToLeft = false;
 }
 
-double Graphics_textWidth (Graphics me, const wchar_t *txt) {
+double Graphics_textWidth (Graphics me, const char32 *txt) {
 	double width;
 	if (! initBuffer (txt)) return 0.0;
 	initText (me);
 	parseTextIntoCellsLinesRuns (me, txt, theWidechar);
-	charSizes (me, theWidechar);
+	charSizes (me, theWidechar, false);
 	width = textWidth (theWidechar);
 	exitText (me);
 	return width / my scaleX;
 }
 
-void Graphics_textRect (Graphics me, double x1, double x2, double y1, double y2, const wchar_t *txt) {
+void Graphics_textRect (Graphics me, double x1, double x2, double y1, double y2, const char32 *txt) {
 	_Graphics_widechar *plc, *startOfLine;
 	double width = 0.0, lineHeight = (1.1 / 72) * my fontSize * my resolution;
 	long x1DC = x1 * my scaleX + my deltaX + 2, x2DC = x2 * my scaleX + my deltaX - 2;
@@ -1743,8 +1679,8 @@ void Graphics_textRect (Graphics me, double x1, double x2, double y1, double y2,
 	if (! initBuffer (txt)) return;
 	initText (me);
 	parseTextIntoCellsLinesRuns (me, txt, theWidechar);
-	charSizes (me, theWidechar);
-	for (plc = theWidechar; plc -> kar > '\t'; plc ++) {
+	charSizes (me, theWidechar, true);
+	for (plc = theWidechar; plc -> kar > U'\t'; plc ++) {
 		width += plc -> width;
 		if (width > availableWidth) {
 			if (++ linesNeeded > linesAvailable) break;
@@ -1755,20 +1691,21 @@ void Graphics_textRect (Graphics me, double x1, double x2, double y1, double y2,
 	startOfLine = theWidechar;
 	for (iline = 1; iline <= lines; iline ++) {
 		width = 0.0;
-		for (plc = startOfLine; plc -> kar > '\t'; plc ++) {
-			int flush = FALSE;
+		for (plc = startOfLine; plc -> kar > U'\t'; plc ++) {
+			bool flush = false;
 			width += plc -> width;
-			if (width > availableWidth) flush = TRUE;
+			if (width > availableWidth) flush = true;
 			/*
 			 * Trick for incorporating end-of-text.
 			 */
-			if (! flush && plc [1]. kar <= '\t') {
+			if (! flush && plc [1]. kar <= U'\t') {
 				Melder_assert (iline == lines);
-				plc ++;   /* Brr. */
-				flush = TRUE;
+				plc ++;   // brr
+				flush = true;
 			}
 			if (flush) {
-				int saveKar = plc -> kar, direction = my yIsZeroAtTheTop ? -1 : 1;
+				char32 saveKar = plc -> kar;
+				int direction = my yIsZeroAtTheTop ? -1 : 1;
 				int x = my horizontalTextAlignment == Graphics_LEFT ? x1DC :
 					my horizontalTextAlignment == Graphics_RIGHT ? x2DC :
 					0.5 * (x1 + x2) * my scaleX + my deltaX;
@@ -1777,7 +1714,7 @@ void Graphics_textRect (Graphics me, double x1, double x2, double y1, double y2,
 					my verticalTextAlignment == Graphics_TOP ?
 					y2DC - direction * (iline - 1) * lineHeight :
 					0.5 * (y1 + y2) * my scaleY + my deltaY + 0.5 * direction * (lines - iline*2 + 1) * lineHeight;
-				plc -> kar = '\0';
+				plc -> kar = U'\0';
 				drawOneCell (me, x, y, startOfLine);
 				plc -> kar = saveKar;
 				startOfLine = plc;
@@ -1788,11 +1725,11 @@ void Graphics_textRect (Graphics me, double x1, double x2, double y1, double y2,
 	exitText (me);
 }
 
-void Graphics_text (Graphics me, double xWC, double yWC, const wchar_t *txt) {
-	if (my wrapWidth == 0.0 && wcschr (txt, '\n') && my textRotation == 0.0) {
+static void _Graphics_text (Graphics me, double xWC, double yWC, const char32 *txt) {
+	if (my wrapWidth == 0.0 && str32chr (txt, U'\n') && my textRotation == 0.0) {
 		double lineSpacingWC = (1.2/72) * my fontSize * my resolution / fabs (my scaleY);
 		long numberOfLines = 1;
-		for (const wchar_t *p = & txt [0]; *p != '\0'; p ++) {
+		for (const char32 *p = & txt [0]; *p != U'\0'; p ++) {
 			if (*p == '\n') {
 				numberOfLines ++;
 			}
@@ -1801,14 +1738,14 @@ void Graphics_text (Graphics me, double xWC, double yWC, const wchar_t *txt) {
 			my verticalTextAlignment == Graphics_TOP ? 0 :
 			my verticalTextAlignment == Graphics_HALF ? 0.5 * (numberOfLines - 1) * lineSpacingWC:
 			(numberOfLines - 1) * lineSpacingWC;
-		autostring linesToDraw = Melder_wcsdup_f (txt);
-		wchar_t *p = & linesToDraw [0];
+		autostring32 linesToDraw = Melder_dup_f (txt);
+		char32 *p = & linesToDraw [0];
 		for (;;) {
-			wchar_t *newline = wcschr (p, '\n');
-			if (newline != NULL) *newline = '\0';
+			char32 *newline = str32chr (p, U'\n');
+			if (newline) *newline = U'\0';
 			Graphics_text (me, xWC, yWC, p);
 			yWC -= lineSpacingWC;
-			if (newline != NULL) {
+			if (newline) {
 				p = newline + 1;
 			} else {
 				break;
@@ -1822,24 +1759,82 @@ void Graphics_text (Graphics me, double xWC, double yWC, const wchar_t *txt) {
 	drawCells (me, xWC, yWC, theWidechar);
 	exitText (me);
 	if (my recording) {
-		char *txt_utf8 = Melder_peekWcsToUtf8 (txt);
+		char *txt_utf8 = Melder_peek32to8 (txt);
 		int length = strlen (txt_utf8) / sizeof (double) + 1;
 		op (TEXT, 3 + length); put (xWC); put (yWC); sput (txt_utf8, length)
 	}
 }
 
+static MelderString theGraphicsTextBuffer { 0 };
+void Graphics_text (Graphics me, double x, double y, Melder_1_ARG) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_1_ARG_CALL);   // even in the one-argument case, make a copy because s1 may be a temporary string (Melder_integer or so)
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_2_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_2_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_3_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_3_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_4_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_4_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_5_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_5_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_6_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_6_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_7_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_7_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_8_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_8_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_9_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_9_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_10_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_10_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_11_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_11_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_13_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_13_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_15_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_15_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+void Graphics_text (Graphics me, double x, double y, Melder_19_ARGS) {
+	MelderString_copy (& theGraphicsTextBuffer, Melder_19_ARGS_CALL);
+	_Graphics_text (me, x, y, theGraphicsTextBuffer.string);
+}
+
 double Graphics_inqTextX (Graphics me) { return my textX; }
 double Graphics_inqTextY (Graphics me) { return my textY; }
 
 int Graphics_getLinks (Graphics_Link **plinks) { *plinks = & links [0]; return numberOfLinks; }
 
-static double psTextWidth (_Graphics_widechar string [], int useSilipaPS) {
+static double psTextWidth (_Graphics_widechar string [], bool useSilipaPS) {
 	_Graphics_widechar *character;
 	/*
 	 * The following has to be kept IN SYNC with GraphicsPostscript::charSize.
 	 */
 	double textWidth = 0;
-	for (character = string; character -> kar > '\t'; character ++) {
+	for (character = string; character -> kar > U'\t'; character ++) {
 		Longchar_Info info = Longchar_getInfoFromNative (character -> kar);
 		int font = info -> alphabet == Longchar_SYMBOL ? kGraphics_font_SYMBOL :
 				info -> alphabet == Longchar_PHONETIC ? kGraphics_font_IPATIMES :
@@ -1848,7 +1843,7 @@ static double psTextWidth (_Graphics_widechar string [], int useSilipaPS) {
 			character -> style == Graphics_BOLD || character -> link ? Graphics_BOLD :
 			character -> style == Graphics_BOLD_ITALIC ? Graphics_BOLD_ITALIC : 0;
 		double size = character -> size * 0.01;
-		double charWidth = 600;   /* Courier. */
+		double charWidth = 600;   // Courier
 		if (font == kGraphics_font_COURIER) {
 			charWidth = 600;
 		} else if (style == 0) {
@@ -1856,7 +1851,7 @@ static double psTextWidth (_Graphics_widechar string [], int useSilipaPS) {
 			else if (font == kGraphics_font_HELVETICA) charWidth = info -> ps.helvetica;
 			else if (font == kGraphics_font_PALATINO) charWidth = info -> ps.palatino;
 			else if (font == kGraphics_font_IPATIMES && useSilipaPS) charWidth = info -> ps.timesItalic;
-			else charWidth = info -> ps.times;   /* Symbol, IPA. */
+			else charWidth = info -> ps.times;   // Symbol, IPA
 		} else if (style == Graphics_BOLD) {
 			if (font == kGraphics_font_TIMES) charWidth = info -> ps.timesBold;
 			else if (font == kGraphics_font_HELVETICA) charWidth = info -> ps.helveticaBold;
@@ -1882,7 +1877,7 @@ static double psTextWidth (_Graphics_widechar string [], int useSilipaPS) {
 	/*
 	 * The following has to be kept IN SYNC with charSizes ().
 	 */
-	for (character = string; character -> kar > '\t'; character ++) {
+	for (character = string; character -> kar > U'\t'; character ++) {
 		if ((character -> style & Graphics_ITALIC) != 0) {
 			_Graphics_widechar *nextCharacter = character + 1;
 			if (nextCharacter -> kar <= '\t') {
@@ -1890,7 +1885,7 @@ static double psTextWidth (_Graphics_widechar string [], int useSilipaPS) {
 			} else if (((nextCharacter -> style & Graphics_ITALIC) == 0 && nextCharacter -> baseline >= character -> baseline)
 				|| (character -> baseline == 0 && nextCharacter -> baseline > 0))
 			{
-				if (nextCharacter -> kar == '.' || nextCharacter -> kar == ',')
+				if (nextCharacter -> kar == U'.' || nextCharacter -> kar == U',')
 					textWidth += 0.5 * POSTSCRIPT_SLANT_CORRECTION;
 				else
 					textWidth += POSTSCRIPT_SLANT_CORRECTION;
@@ -1900,13 +1895,13 @@ static double psTextWidth (_Graphics_widechar string [], int useSilipaPS) {
 	return textWidth;
 }
 
-double Graphics_textWidth_ps_mm (Graphics me, const wchar_t *txt, bool useSilipaPS) {
+double Graphics_textWidth_ps_mm (Graphics me, const char32 *txt, bool useSilipaPS) {
 	if (! initBuffer (txt)) return 0.0;
 	parseTextIntoCellsLinesRuns (me, txt, theWidechar);
 	return psTextWidth (theWidechar, useSilipaPS) * (double) my fontSize * (25.4 / 72.0);
 }
 
-double Graphics_textWidth_ps (Graphics me, const wchar_t *txt, bool useSilipaPS) {
+double Graphics_textWidth_ps (Graphics me, const char32 *txt, bool useSilipaPS) {
 	return Graphics_dxMMtoWC (me, Graphics_textWidth_ps_mm (me, txt, useSilipaPS));
 }
 
@@ -1923,7 +1918,7 @@ static ATSFontRef findFont (CFStringRef name) {
 	return fontRef;		
 }
 #endif
-bool _GraphicsMac_tryToInitializeFonts (void) {
+bool _GraphicsMac_tryToInitializeFonts () {
 #if useCarbon
 	if (theTimesAtsuiFont != 0) return true;   // once
 	theTimesAtsuiFont = findFont (CFSTR ("Times"));
@@ -1939,9 +1934,9 @@ bool _GraphicsMac_tryToInitializeFonts (void) {
 	theZapfDingbatsAtsuiFont = findFont (CFSTR ("Zapf Dingbats"));
 	if (! theZapfDingbatsAtsuiFont) theZapfDingbatsAtsuiFont = theTimesAtsuiFont;
 	if (! theTimesAtsuiFont || ! theHelveticaAtsuiFont || ! theCourierAtsuiFont || ! theSymbolAtsuiFont) {
-		Melder_warning (L"Praat cannot find one or more of the fonts Times (or Times New Roman), "
-			"Helvetica (or Arial), Courier (or Courier New), and Symbol. "
-			"Praat will have limited capabilities for international text.");
+		Melder_warning (U"Praat cannot find one or more of the fonts Times (or Times New Roman), "
+			U"Helvetica (or Arial), Courier (or Courier New), and Symbol. "
+			U"Praat will have limited capabilities for international text.");
 		return false;
 	}
 	theIpaTimesAtsuiFont = findFont (CFSTR ("Doulos SIL"));
@@ -1950,8 +1945,8 @@ bool _GraphicsMac_tryToInitializeFonts (void) {
 		if (theIpaPalatinoAtsuiFont) {
 			theIpaTimesAtsuiFont = theIpaPalatinoAtsuiFont;
 		} else {
-			Melder_warning (L"Praat cannot find the Charis SIL or Doulos SIL font.\n"
-				"Phonetic characters will not look well.");   // because ATSUI will use the "last resort font"
+			Melder_warning (U"Praat cannot find the Charis SIL or Doulos SIL font.\n"
+				U"Phonetic characters will not look well.");   // because ATSUI will use the "last resort font"
 			theIpaTimesAtsuiFont = theTimesAtsuiFont;
 			theIpaPalatinoAtsuiFont = thePalatinoAtsuiFont;
 		}
@@ -1959,7 +1954,7 @@ bool _GraphicsMac_tryToInitializeFonts (void) {
 		theIpaPalatinoAtsuiFont = theIpaTimesAtsuiFont;
 	}
 	Melder_assert (theTimesAtsuiFont != 0);
-	ATSUFindFontFromName (NULL, 0, 0, 0, 0, kFontArabicLanguage, & theArabicAtsuiFont);
+	ATSUFindFontFromName (nullptr, 0, 0, 0, 0, kFontArabicLanguage, & theArabicAtsuiFont);
 	return true;
 #else
     static bool inited = false;
@@ -1983,7 +1978,7 @@ bool _GraphicsMac_tryToInitializeFonts (void) {
 }
 #endif
 
-void _GraphicsScreen_text_init (GraphicsScreen me) {   /* BUG: should be done as late as possible. */
+void _GraphicsScreen_text_init (GraphicsScreen me) {   // BUG: should be done as late as possible
 	#if gtk
 	#elif cocoa
         (void) me;
diff --git a/sys/Graphics_utils.cpp b/sys/Graphics_utils.cpp
index deb7e14..af57e2a 100644
--- a/sys/Graphics_utils.cpp
+++ b/sys/Graphics_utils.cpp
@@ -1,6 +1,6 @@
 /* Graphics_utils.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,52 +27,6 @@
 
 /********** Utility functions. **********/
 
-static MelderString theGraphicsTextBuffer = { 0 };
-void Graphics_text1 (Graphics me, double x, double y, const wchar_t *s1) {
-	MelderString_copy (& theGraphicsTextBuffer, s1);   // make a copy because s1 may be a temporary string (Melder_integer or so)
-	Graphics_text (me, x, y, theGraphicsTextBuffer.string);
-}
-void Graphics_text2 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2) {
-	MelderString_empty (& theGraphicsTextBuffer);
-	MelderString_append (& theGraphicsTextBuffer, s1, s2);
-	Graphics_text (me, x, y, theGraphicsTextBuffer.string);
-}
-void Graphics_text3 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3) {
-	MelderString_empty (& theGraphicsTextBuffer);
-	MelderString_append (& theGraphicsTextBuffer, s1, s2, s3);
-	Graphics_text (me, x, y, theGraphicsTextBuffer.string);
-}
-void Graphics_text4 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4) {
-	MelderString_empty (& theGraphicsTextBuffer);
-	MelderString_append (& theGraphicsTextBuffer, s1, s2, s3, s4);
-	Graphics_text (me, x, y, theGraphicsTextBuffer.string);
-}
-void Graphics_text5 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5) {
-	MelderString_empty (& theGraphicsTextBuffer);
-	MelderString_append (& theGraphicsTextBuffer, s1, s2, s3, s4, s5);
-	Graphics_text (me, x, y, theGraphicsTextBuffer.string);
-}
-void Graphics_text6 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
-	MelderString_empty (& theGraphicsTextBuffer);
-	MelderString_append (& theGraphicsTextBuffer, s1, s2, s3, s4, s5, s6);
-	Graphics_text (me, x, y, theGraphicsTextBuffer.string);
-}
-void Graphics_text7 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7) {
-	MelderString_empty (& theGraphicsTextBuffer);
-	MelderString_append (& theGraphicsTextBuffer, s1, s2, s3, s4, s5, s6, s7);
-	Graphics_text (me, x, y, theGraphicsTextBuffer.string);
-}
-void Graphics_text8 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8) {
-	MelderString_empty (& theGraphicsTextBuffer);
-	MelderString_append (& theGraphicsTextBuffer, s1, s2, s3, s4, s5, s6, s7, s8);
-	Graphics_text (me, x, y, theGraphicsTextBuffer.string);
-}
-void Graphics_text9 (Graphics me, double x, double y, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9) {
-	MelderString_empty (& theGraphicsTextBuffer);
-	MelderString_append (& theGraphicsTextBuffer, s1, s2, s3, s4, s5, s6, s7, s8, s9);
-	Graphics_text (me, x, y, theGraphicsTextBuffer.string);
-}
-
 /********** Drawing into margins. **********/
 
 void Graphics_drawInnerBox (Graphics me) {
@@ -81,11 +35,11 @@ void Graphics_drawInnerBox (Graphics me) {
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
 	Graphics_setInner (me);
-	Graphics_setWindow (me, 0, 1, 0, 1);
+	Graphics_setWindow (me, 0.0, 1.0, 0.0, 1.0);
 	Graphics_setLineType (me, Graphics_DRAWN);
 	Graphics_setLineWidth (me, 2.0 * lineWidth);
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_rectangle (me, 0, 1, 0, 1);
+	Graphics_rectangle (me, 0.0, 1.0, 0.0, 1.0);
 	Graphics_unsetInner (me);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setLineType (me, lineType);
@@ -93,46 +47,46 @@ void Graphics_drawInnerBox (Graphics me) {
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_textLeft (Graphics me, bool farr, const wchar_t *text) {
+void Graphics_textLeft (Graphics me, bool farr, const char32 *text) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	int vert = farr ? Graphics_TOP : Graphics_BOTTOM;
 	Graphics_Colour colour = my colour;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, 0, 1, 0, 1);
-	Graphics_setTextRotation (me, 90);
+	Graphics_setWindow (me, 0.0, 1.0, 0.0, 1.0);
+	Graphics_setTextRotation (me, 90.0);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, vert);
 	if (! farr) Graphics_setInner (me);
-	Graphics_text (me, 0, 0.5, text);
+	Graphics_text (me, 0.0, 0.5, text);
 	if (! farr) Graphics_unsetInner (me);
-	Graphics_setTextRotation (me, 0);
+	Graphics_setTextRotation (me, 0.0);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_textRight (Graphics me, bool farr, const wchar_t *text) {
+void Graphics_textRight (Graphics me, bool farr, const char32 *text) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	int vert = farr ? Graphics_TOP : Graphics_BOTTOM;
 	Graphics_Colour colour = my colour;
 	Graphics_setColour (me, Graphics_BLACK);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, vert);
-	Graphics_setWindow (me, 0, 1, 0, 1);
-	Graphics_setTextRotation (me, 270);
+	Graphics_setWindow (me, 0.0, 1.0, 0.0, 1.0);
+	Graphics_setTextRotation (me, 270.0);
 	if (! farr) Graphics_setInner (me);
-	Graphics_text (me, 1, 0.5, text);
+	Graphics_text (me, 1.0, 0.5, text);
 	if (! farr) Graphics_unsetInner (me);
-	Graphics_setTextRotation (me, 0);
+	Graphics_setTextRotation (me, 0.0);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_textBottom (Graphics me, bool farr, const wchar_t *text) {
+void Graphics_textBottom (Graphics me, bool farr, const char32 *text) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	Graphics_Colour colour = my colour;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, 0, 1, 0, 1);
+	Graphics_setWindow (me, 0.0, 1.0, 0.0, 1.0);
 	if (farr) {
 		Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_BOTTOM);
-		Graphics_text (me, 0.5, 0, text);
+		Graphics_text (me, 0.5, 0.0, text);
 	} else {
 		Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_TOP);
 		Graphics_setInner (me);
@@ -143,18 +97,18 @@ void Graphics_textBottom (Graphics me, bool farr, const wchar_t *text) {
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_textTop (Graphics me, bool farr, const wchar_t *text) {
+void Graphics_textTop (Graphics me, bool farr, const char32 *text) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	Graphics_Colour colour = my colour;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, 0, 1, 0, 1);
+	Graphics_setWindow (me, 0.0, 1.0, 0.0, 1.0);
 	if (farr) {
 		Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_TOP);
-		Graphics_text (me, 0.5, 1, text);
+		Graphics_text (me, 0.5, 1.0, text);
 	} else {
 		Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_BOTTOM);
 		Graphics_setInner (me);
-		Graphics_text (me, 0.5, 1 + my vertTick, text);
+		Graphics_text (me, 0.5, 1.0 + my vertTick, text);
 		Graphics_unsetInner (me);
 	}
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
@@ -177,7 +131,7 @@ void Graphics_marksLeft (Graphics me, int numberOfMarks, bool haveNumbers, bool
 	}
 	for (int i = 1; i <= numberOfMarks; i ++) {
 		double f = (i - 1.0) / (numberOfMarks - 1), yWC = y1WC + (y2WC - y1WC) * f;
-		if (haveNumbers) Graphics_text1 (me, - my horTick, yWC, Melder_float (Melder_half (yWC)));
+		if (haveNumbers) Graphics_text (me, - my horTick, yWC, Melder_float (Melder_half (yWC)));
 		if (haveTicks) Graphics_line (me, - my horTick, yWC, 0, yWC);
 	}
 	if (haveTicks) Graphics_setLineWidth (me, lineWidth);
@@ -186,7 +140,7 @@ void Graphics_marksLeft (Graphics me, int numberOfMarks, bool haveNumbers, bool
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
 		for (int i = 2; i < numberOfMarks; i ++) {
 			double f = (i - 1.0) / (numberOfMarks - 1), yWC = y1WC + (y2WC - y1WC) * f;
-			Graphics_line (me, 0, yWC, 1, yWC);
+			Graphics_line (me, 0.0, yWC, 1.0, yWC);
 		}
 		Graphics_setLineWidth (me, lineWidth);
 	}
@@ -212,8 +166,8 @@ void Graphics_marksRight (Graphics me, int numberOfMarks, bool haveNumbers, bool
 	}
 	for (int i = 1; i <= numberOfMarks; i ++) {
 		double f = (i - 1.0) / (numberOfMarks - 1), yWC = y1WC + (y2WC - y1WC) * f;
-		if (haveNumbers) Graphics_text1 (me, 1 + my horTick, yWC, Melder_float (Melder_half (yWC)));
-		if (haveTicks) Graphics_line (me, 1, yWC, 1 + my horTick, yWC);
+		if (haveNumbers) Graphics_text (me, 1.0 + my horTick, yWC, Melder_float (Melder_half (yWC)));
+		if (haveTicks) Graphics_line (me, 1.0, yWC, 1.0 + my horTick, yWC);
 	}
 	if (haveTicks) Graphics_setLineWidth (me, lineWidth);
 	if (haveDottedLines && numberOfMarks > 2) {
@@ -221,7 +175,7 @@ void Graphics_marksRight (Graphics me, int numberOfMarks, bool haveNumbers, bool
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
 		for (int i = 2; i < numberOfMarks; i ++) {
 			double f = (i - 1.0) / (numberOfMarks - 1), yWC = y1WC + (y2WC - y1WC) * f;
-			Graphics_line (me, 0, yWC, 1, yWC);
+			Graphics_line (me, 0.0, yWC, 1.0, yWC);
 		}
 		Graphics_setLineWidth (me, lineWidth);
 	}
@@ -238,7 +192,7 @@ void Graphics_marksBottom (Graphics me, int numberOfMarks, bool haveNumbers, boo
 	Graphics_Colour colour = my colour;
 	if (numberOfMarks < 2) return;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, x1WC, x2WC, 0, 1);
+	Graphics_setWindow (me, x1WC, x2WC, 0.0, 1.0);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_TOP);
 	Graphics_setInner (me);
 	if (haveTicks) {
@@ -247,7 +201,7 @@ void Graphics_marksBottom (Graphics me, int numberOfMarks, bool haveNumbers, boo
 	}
 	for (int i = 1; i <= numberOfMarks; i ++) {
 		double f = (i - 1.0) / (numberOfMarks - 1), xWC = x1WC + (x2WC - x1WC) * f;
-		if (haveNumbers) Graphics_text1 (me, xWC, - my vertTick, Melder_float (Melder_half (xWC)));
+		if (haveNumbers) Graphics_text (me, xWC, - my vertTick, Melder_float (Melder_half (xWC)));
 		if (haveTicks) Graphics_line (me, xWC, - my vertTick, xWC, 0);
 	}
 	if (haveTicks) Graphics_setLineWidth (me, lineWidth);
@@ -257,7 +211,7 @@ void Graphics_marksBottom (Graphics me, int numberOfMarks, bool haveNumbers, boo
 		for (int i = 2; i < numberOfMarks; i ++)
 		{
 			double f = (i - 1.0) / (numberOfMarks - 1), xWC = x1WC + (x2WC - x1WC) * f;
-			Graphics_line (me, xWC, 0, xWC, 1);
+			Graphics_line (me, xWC, 0.0, xWC, 1.0);
 		}
 		Graphics_setLineWidth (me, lineWidth);
 	}
@@ -274,7 +228,7 @@ void Graphics_marksTop (Graphics me, int numberOfMarks, bool haveNumbers, bool h
 	Graphics_Colour colour = my colour;
 	if (numberOfMarks < 2) return;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, x1WC, x2WC, 0, 1);
+	Graphics_setWindow (me, x1WC, x2WC, 0.0, 1.0);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_BOTTOM);
 	Graphics_setInner (me);
 	if (haveTicks) {
@@ -283,8 +237,8 @@ void Graphics_marksTop (Graphics me, int numberOfMarks, bool haveNumbers, bool h
 	}
 	for (int i = 1; i <= numberOfMarks; i ++) {
 		double f = (i - 1.0) / (numberOfMarks - 1), xWC = x1WC + (x2WC - x1WC) * f;
-		if (haveNumbers) Graphics_text1 (me, xWC, 1 + my vertTick, Melder_float (Melder_half (xWC)));
-		if (haveTicks) Graphics_line (me, xWC, 1, xWC, 1 + my vertTick);
+		if (haveNumbers) Graphics_text (me, xWC, 1.0 + my vertTick, Melder_float (Melder_half (xWC)));
+		if (haveTicks) Graphics_line (me, xWC, 1.0, xWC, 1.0 + my vertTick);
 	}
 	if (haveTicks) Graphics_setLineWidth (me, lineWidth);
 	if (haveDottedLines && numberOfMarks > 2) {
@@ -292,7 +246,7 @@ void Graphics_marksTop (Graphics me, int numberOfMarks, bool haveNumbers, bool h
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
 		for (int i = 2; i < numberOfMarks; i ++) {
 			double f = (i - 1.0) / (numberOfMarks - 1), xWC = x1WC + (x2WC - x1WC) * f;
-			Graphics_line (me, xWC, 0, xWC, 1);
+			Graphics_line (me, xWC, 0.0, xWC, 1.0);
 		}
 		Graphics_setLineWidth (me, lineWidth);
 	}
@@ -330,10 +284,10 @@ void Graphics_marksLeftLogarithmic (Graphics me, int numberOfMarksPerDecade, boo
 	Graphics_setInner (me);
 	for (int i = 1; i <= numberOfMarksPerDecade; i ++) {
 		double y = decade_y [numberOfMarksPerDecade] [i];
-		while (y < (y1<y2?py1:py2)) y *= 10;
-		while (y >= (y1<y2?py1:py2)) y /= 10;
-		for (y *= 10; y <= (y1<y2?py2:py1); y *= 10) {
-			if (haveNumbers) Graphics_text1 (me, - my horTick, log10 (y), Melder_float (Melder_half (y)));
+		while (y < (y1<y2?py1:py2)) y *= 10.0;
+		while (y >= (y1<y2?py1:py2)) y /= 10.0;
+		for (y *= 10.0; y <= (y1<y2?py2:py1); y *= 10.0) {
+			if (haveNumbers) Graphics_text (me, - my horTick, log10 (y), Melder_float (Melder_half (y)));
 			if (haveTicks) {
 				Graphics_setLineWidth (me, 2.0 * lineWidth);
 				Graphics_setLineType (me, Graphics_DRAWN);
@@ -343,7 +297,7 @@ void Graphics_marksLeftLogarithmic (Graphics me, int numberOfMarksPerDecade, boo
 			if (haveDottedLines) {
 				Graphics_setLineType (me, Graphics_DOTTED);
 				Graphics_setLineWidth (me, 0.67 * lineWidth);
-				Graphics_line (me, 0, log10 (y), 1, log10 (y));
+				Graphics_line (me, 0.0, log10 (y), 1.0, log10 (y));
 				Graphics_setLineType (me, lineType);
 				Graphics_setLineWidth (me, lineWidth);
 			}
@@ -361,29 +315,29 @@ void Graphics_marksRightLogarithmic (Graphics me, int numberOfMarksPerDecade, bo
 	Graphics_Colour colour = my colour;
 	if (numberOfMarksPerDecade < 1) numberOfMarksPerDecade = 1;
 	if (numberOfMarksPerDecade > MAXNUM_MARKS_PER_DECADE) numberOfMarksPerDecade = MAXNUM_MARKS_PER_DECADE;
-	if (y1 > 300 || y2 > 300) return;
-	double py1 = pow (10, y1 + ( y1 < y2 ? -1e-6 : 1e-6 ));
-	double py2 = pow (10, y2 + ( y1 < y2 ? 1e-6 : -1e-6 ));
+	if (y1 > 300.0 || y2 > 300.0) return;
+	double py1 = pow (10.0, y1 + ( y1 < y2 ? -1e-6 : 1e-6 ));
+	double py2 = pow (10.0, y2 + ( y1 < y2 ? 1e-6 : -1e-6 ));
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, 0, 1, y1, y2);
+	Graphics_setWindow (me, 0.0, 1.0, y1, y2);
 	Graphics_setTextAlignment (me, Graphics_LEFT, Graphics_HALF);
 	Graphics_setInner (me);
 	for (int i = 1; i <= numberOfMarksPerDecade; i ++) {
 		double y = decade_y [numberOfMarksPerDecade] [i];
-		while (y < (y1<y2?py1:py2)) y *= 10;
-		while (y >= (y1<y2?py1:py2)) y /= 10;
-		for (y *= 10; y <= (y1<y2?py2:py1); y *= 10) {
-			if (haveNumbers) Graphics_text1 (me, 1 + my horTick, log10 (y), Melder_float (Melder_half (y)));
+		while (y < (y1<y2?py1:py2)) y *= 10.0;
+		while (y >= (y1<y2?py1:py2)) y /= 10.0;
+		for (y *= 10.0; y <= (y1<y2?py2:py1); y *= 10.0) {
+			if (haveNumbers) Graphics_text (me, 1.0 + my horTick, log10 (y), Melder_float (Melder_half (y)));
 			if (haveTicks) {
 				Graphics_setLineWidth (me, 2.0 * lineWidth);
 				Graphics_setLineType (me, Graphics_DRAWN);
-				Graphics_line (me, 1, log10 (y), 1 + my horTick, log10 (y));
+				Graphics_line (me, 1.0, log10 (y), 1.0 + my horTick, log10 (y));
 				Graphics_setLineWidth (me, lineWidth);
 			}
 			if (haveDottedLines) {
 				Graphics_setLineType (me, Graphics_DOTTED);
 				Graphics_setLineWidth (me, 0.67 * lineWidth);
-				Graphics_line (me, 0, log10 (y), 1, log10 (y));
+				Graphics_line (me, 0.0, log10 (y), 1.0, log10 (y));
 				Graphics_setLineType (me, lineType);
 				Graphics_setLineWidth (me, lineWidth);
 			}
@@ -401,29 +355,29 @@ void Graphics_marksTopLogarithmic (Graphics me, int numberOfMarksPerDecade, bool
 	Graphics_Colour colour = my colour;
 	if (numberOfMarksPerDecade < 1) numberOfMarksPerDecade = 1;
 	if (numberOfMarksPerDecade > MAXNUM_MARKS_PER_DECADE) numberOfMarksPerDecade = MAXNUM_MARKS_PER_DECADE;
-	if (x1 > 300 || x2 > 300) return;
-	double px1 = pow (10, x1 + ( x1 < x2 ? -1e-6 : 1e-6 ));
-	double px2 = pow (10, x2 + ( x1 < x2 ? 1e-6 : -1e-6 ));
+	if (x1 > 300.0 || x2 > 300.0) return;
+	double px1 = pow (10.0, x1 + ( x1 < x2 ? -1e-6 : 1e-6 ));
+	double px2 = pow (10.0, x2 + ( x1 < x2 ? 1e-6 : -1e-6 ));
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, x1, x2, 0, 1);
+	Graphics_setWindow (me, x1, x2, 0.0, 1.0);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_BOTTOM);
 	Graphics_setInner (me);
 	for (int i = 1; i <= numberOfMarksPerDecade; i ++) {
 		double x = decade_y [numberOfMarksPerDecade] [i];
-		while (x < (x1<x2?px1:px2)) x *= 10;
-		while (x >= (x1<x2?px1:px2)) x /= 10;
-		for (x *= 10; x <= (x1<x2?px2:px1); x *= 10) {
-			if (haveNumbers) Graphics_text1 (me, log10 (x), 1 + my vertTick, Melder_float (Melder_half (x)));
+		while (x < (x1<x2?px1:px2)) x *= 10.0;
+		while (x >= (x1<x2?px1:px2)) x /= 10.0;
+		for (x *= 10.0; x <= (x1<x2?px2:px1); x *= 10.0) {
+			if (haveNumbers) Graphics_text (me, log10 (x), 1.0 + my vertTick, Melder_float (Melder_half (x)));
 			if (haveTicks) {
 				Graphics_setLineWidth (me, 2.0 * lineWidth);
 				Graphics_setLineType (me, Graphics_DRAWN);
-				Graphics_line (me, log10 (x), 1, log10 (x), 1 + my vertTick);
+				Graphics_line (me, log10 (x), 1.0, log10 (x), 1.0 + my vertTick);
 				Graphics_setLineWidth (me, lineWidth);
 			}
 			if (haveDottedLines) {
 				Graphics_setLineType (me, Graphics_DOTTED);
 				Graphics_setLineWidth (me, 0.67 * lineWidth);
-				Graphics_line (me, log10 (x), 0, log10 (x), 1);
+				Graphics_line (me, log10 (x), 0.0, log10 (x), 1.0);
 				Graphics_setLineType (me, lineType);
 				Graphics_setLineWidth (me, lineWidth);
 			}
@@ -441,29 +395,29 @@ void Graphics_marksBottomLogarithmic (Graphics me, int numberOfMarksPerDecade, b
 	Graphics_Colour colour = my colour;
 	if (numberOfMarksPerDecade < 1) numberOfMarksPerDecade = 1;
 	if (numberOfMarksPerDecade > MAXNUM_MARKS_PER_DECADE) numberOfMarksPerDecade = MAXNUM_MARKS_PER_DECADE;
-	if (x1 > 300 || x2 > 300) return;
-	double px1 = pow (10, x1 + ( x1 < x2 ? -1e-6 : 1e-6 ));
-	double px2 = pow (10, x2 + ( x1 < x2 ? 1e-6 : -1e-6 ));
+	if (x1 > 300.0 || x2 > 300.0) return;
+	double px1 = pow (10.0, x1 + ( x1 < x2 ? -1e-6 : 1e-6 ));
+	double px2 = pow (10.0, x2 + ( x1 < x2 ? 1e-6 : -1e-6 ));
 	Graphics_setColour (me, Graphics_BLACK);
 	Graphics_setWindow (me, x1, x2, 0, 1);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_TOP);
 	Graphics_setInner (me);
 	for (int i = 1; i <= numberOfMarksPerDecade; i ++) {
 		double x = decade_y [numberOfMarksPerDecade] [i];
-		while (x < (x1<x2?px1:px2)) x *= 10;
-		while (x >= (x1<x2?px1:px2)) x /= 10;
-		for (x *= 10; x <= (x1<x2?px2:px1); x *= 10) {
-			if (haveNumbers) Graphics_text1 (me, log10 (x), - my vertTick, Melder_float (Melder_half (x)));
+		while (x < (x1<x2?px1:px2)) x *= 10.0;
+		while (x >= (x1<x2?px1:px2)) x /= 10.0;
+		for (x *= 10.0; x <= (x1<x2?px2:px1); x *= 10.0) {
+			if (haveNumbers) Graphics_text (me, log10 (x), - my vertTick, Melder_float (Melder_half (x)));
 			if (haveTicks) {
 				Graphics_setLineWidth (me, 2.0 * lineWidth);
 				Graphics_setLineType (me, Graphics_DRAWN);
-				Graphics_line (me, log10 (x), - my vertTick, log10 (x), 0);
+				Graphics_line (me, log10 (x), - my vertTick, log10 (x), 0.0);
 				Graphics_setLineWidth (me, lineWidth);
 			}
 			if (haveDottedLines) {
 				Graphics_setLineType (me, Graphics_DOTTED);
 				Graphics_setLineWidth (me, 0.67 * lineWidth);
-				Graphics_line (me, log10 (x), 0, log10 (x), 1);
+				Graphics_line (me, log10 (x), 0.0, log10 (x), 1.0);
 				Graphics_setLineType (me, lineType);
 				Graphics_setLineWidth (me, lineWidth);
 			}
@@ -474,236 +428,236 @@ void Graphics_marksBottomLogarithmic (Graphics me, int numberOfMarksPerDecade, b
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_markLeft (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text) {
+void Graphics_markLeft (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	int lineType = my lineType;
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, 0, 1, y1WC, y2WC);
+	Graphics_setWindow (me, 0.0, 1.0, y1WC, y2WC);
 	Graphics_setTextAlignment (me, Graphics_RIGHT, Graphics_HALF);
 	Graphics_setInner (me);
-	if (hasNumber) Graphics_text1 (me, - my horTick, position, Melder_float (Melder_half (position)));
+	if (hasNumber) Graphics_text (me, - my horTick, position, Melder_float (Melder_half (position)));
 	if (hasTick) {
 		Graphics_setLineType (me, Graphics_DRAWN);
 		Graphics_setLineWidth (me, 2.0 * lineWidth);
-		Graphics_line (me, - my horTick, position, 0, position);
+		Graphics_line (me, - my horTick, position, 0.0, position);
 		Graphics_setLineWidth (me, lineWidth);
 	}
 	if (hasDottedLine) {
 		Graphics_setLineType (me, Graphics_DOTTED);
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
-		Graphics_line (me, 0, position, 1, position);
+		Graphics_line (me, 0.0, position, 1.0, position);
 		Graphics_setLineWidth (me, lineWidth);
 	}
-	if (text && wcslen (text)) Graphics_text (me, - my horTick, position, text);
+	if (text && text [0]) Graphics_text (me, - my horTick, position, text);   // 'text' has to stay valid until here; no Graphics is allowed to use the cat buffer!
 	Graphics_unsetInner (me);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setLineType (me, lineType);
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_markRight (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text) {
+void Graphics_markRight (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	int lineType = my lineType;
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, 0, 1, y1WC, y2WC);
+	Graphics_setWindow (me, 0.0, 1.0, y1WC, y2WC);
 	Graphics_setTextAlignment (me, Graphics_LEFT, Graphics_HALF);
 	Graphics_setInner (me);
-	if (hasNumber) Graphics_text1 (me, 1 + my horTick, position, Melder_float (Melder_half (position)));
+	if (hasNumber) Graphics_text (me, 1.0 + my horTick, position, Melder_float (Melder_half (position)));
 	if (hasTick) {
 		Graphics_setLineType (me, Graphics_DRAWN);
 		Graphics_setLineWidth (me, 2.0 * lineWidth);
-		Graphics_line (me, 1, position, 1 + my horTick, position);
+		Graphics_line (me, 1.0, position, 1.0 + my horTick, position);
 		Graphics_setLineWidth (me, lineWidth);
 	}
 	if (hasDottedLine) {
 		Graphics_setLineType (me, Graphics_DOTTED);
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
-		Graphics_line (me, 0, position, 1, position);
+		Graphics_line (me, 0.0, position, 1.0, position);
 		Graphics_setLineWidth (me, lineWidth);
 	}
-	if (text && wcslen (text)) Graphics_text (me, 1 + my horTick, position, text);
+	if (text && text [0]) Graphics_text (me, 1.0 + my horTick, position, text);
 	Graphics_unsetInner (me);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setLineType (me, lineType);
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_markTop (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text) {
+void Graphics_markTop (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	int lineType = my lineType;
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, x1WC, x2WC, 0, 1);
+	Graphics_setWindow (me, x1WC, x2WC, 0.0, 1.0);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_BOTTOM);
 	Graphics_setInner (me);
-	if (hasNumber) Graphics_text1 (me, position, 1 + my vertTick, Melder_float (Melder_single (position)));
+	if (hasNumber) Graphics_text (me, position, 1.0 + my vertTick, Melder_float (Melder_single (position)));
 	if (hasTick) {
 		Graphics_setLineType (me, Graphics_DRAWN);
 		Graphics_setLineWidth (me, 2.0 * lineWidth);
-		Graphics_line (me, position, 1, position, 1 + my vertTick);
+		Graphics_line (me, position, 1.0, position, 1.0 + my vertTick);
 		Graphics_setLineWidth (me, lineWidth);
 	}
 	if (hasDottedLine) {
 		Graphics_setLineType (me, Graphics_DOTTED);
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
-		Graphics_line (me, position, 0, position, 1);
+		Graphics_line (me, position, 0.0, position, 1.0);
 		Graphics_setLineWidth (me, lineWidth);
 	}
-	if (text && wcslen (text)) Graphics_text (me, position, 1 + my vertTick, text);
+	if (text && text [0]) Graphics_text (me, position, 1.0 + my vertTick, text);
 	Graphics_unsetInner (me);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setLineType (me, lineType);
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_markBottom (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text) {
+void Graphics_markBottom (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	int lineType = my lineType;
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, x1WC, x2WC, 0, 1);
+	Graphics_setWindow (me, x1WC, x2WC, 0.0, 1.0);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_TOP);
 	Graphics_setInner (me);
-	if (hasNumber) Graphics_text1 (me, position, - my vertTick, Melder_float (Melder_single (position)));
+	if (hasNumber) Graphics_text (me, position, - my vertTick, Melder_float (Melder_single (position)));
 	if (hasTick) {
 		Graphics_setLineType (me, Graphics_DRAWN);
 		Graphics_setLineWidth (me, 2.0 * lineWidth);
-		Graphics_line (me, position, - my vertTick, position, 0);
+		Graphics_line (me, position, - my vertTick, position, 0.0);
 		Graphics_setLineWidth (me, lineWidth);
 	}
 	if (hasDottedLine) {
 		Graphics_setLineType (me, Graphics_DOTTED);
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
-		Graphics_line (me, position, 0, position, 1);
+		Graphics_line (me, position, 0.0, position, 1.0);
 		Graphics_setLineWidth (me, lineWidth);
 	}
-	if (text && wcslen (text)) Graphics_text (me, position, - my vertTick, text);
+	if (text && text [0]) Graphics_text (me, position, - my vertTick, text);
 	Graphics_unsetInner (me);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setLineType (me, lineType);
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_markLeftLogarithmic (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text) {
+void Graphics_markLeftLogarithmic (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	int lineType = my lineType;
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
-	if (position <= 0) return;
+	if (position <= 0.0) return;
 	Graphics_setColour (me, Graphics_BLACK);
 	Graphics_setWindow (me, 0, 1, y1WC, y2WC);
 	Graphics_setTextAlignment (me, Graphics_RIGHT, Graphics_HALF);
 	Graphics_setInner (me);
-	if (hasNumber) Graphics_text1 (me, - my horTick, log10 (position), Melder_float (Melder_half (position)));
+	if (hasNumber) Graphics_text (me, - my horTick, log10 (position), Melder_float (Melder_half (position)));
 	if (hasTick) {
 		Graphics_setLineType (me, Graphics_DRAWN);
 		Graphics_setLineWidth (me, 2.0 * lineWidth);
-		Graphics_line (me, - my horTick, log10 (position), 0, log10 (position));
+		Graphics_line (me, - my horTick, log10 (position), 0.0, log10 (position));
 		Graphics_setLineWidth (me, lineWidth);
 	}
 	if (hasDottedLine) {
 		Graphics_setLineType (me, Graphics_DOTTED);
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
-		Graphics_line (me, 0, log10 (position), 1, log10 (position));
+		Graphics_line (me, 0.0, log10 (position), 1.0, log10 (position));
 		Graphics_setLineWidth (me, lineWidth);
 	}
-	if (text && wcslen (text)) Graphics_text (me, - my horTick, log10 (position), text);
+	if (text && text [0]) Graphics_text (me, - my horTick, log10 (position), text);
 	Graphics_unsetInner (me);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setLineType (me, lineType);
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_markRightLogarithmic (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text) {
+void Graphics_markRightLogarithmic (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	int lineType = my lineType;
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
-	if (position <= 0) return;
+	if (position <= 0.0) return;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, 0, 1, y1WC, y2WC);
+	Graphics_setWindow (me, 0.0, 1.0, y1WC, y2WC);
 	Graphics_setTextAlignment (me, Graphics_LEFT, Graphics_HALF);
 	Graphics_setInner (me);
-	if (hasNumber) Graphics_text1 (me, 1 + my horTick, log10 (position), Melder_float (Melder_half (position)));
+	if (hasNumber) Graphics_text (me, 1.0 + my horTick, log10 (position), Melder_float (Melder_half (position)));
 	if (hasTick) {
 		Graphics_setLineType (me, Graphics_DRAWN);
 		Graphics_setLineWidth (me, 2.0 * lineWidth);
-		Graphics_line (me, 1, log10 (position), 1 + my horTick, log10 (position));
+		Graphics_line (me, 1.0, log10 (position), 1.0 + my horTick, log10 (position));
 		Graphics_setLineWidth (me, lineWidth);
 	}
 	if (hasDottedLine) {
 		Graphics_setLineType (me, Graphics_DOTTED);
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
-		Graphics_line (me, 0, log10 (position), 1, log10 (position));
+		Graphics_line (me, 0.0, log10 (position), 1.0, log10 (position));
 		Graphics_setLineWidth (me, lineWidth);
 	}
-	if (text && wcslen (text)) Graphics_text (me, 1 + my horTick, log10 (position), text);
+	if (text && text [0]) Graphics_text (me, 1.0 + my horTick, log10 (position), text);
 	Graphics_unsetInner (me);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setLineType (me, lineType);
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_markTopLogarithmic (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text) {
+void Graphics_markTopLogarithmic (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	int lineType = my lineType;
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
-	if (position <= 0) return;
+	if (position <= 0.0) return;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, x1WC, x2WC, 0, 1);
+	Graphics_setWindow (me, x1WC, x2WC, 0.0, 1.0);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_BOTTOM);
 	Graphics_setInner (me);
-	if (hasNumber) Graphics_text1 (me, log10 (position), 1 + my vertTick, Melder_float (Melder_half (position)));
+	if (hasNumber) Graphics_text (me, log10 (position), 1.0 + my vertTick, Melder_float (Melder_half (position)));
 	if (hasTick) {
 		Graphics_setLineType (me, Graphics_DRAWN);
 		Graphics_setLineWidth (me, 2.0 * lineWidth);
-		Graphics_line (me, log10 (position), 1, log10 (position), 1 + my vertTick);
+		Graphics_line (me, log10 (position), 1.0, log10 (position), 1.0 + my vertTick);
 		Graphics_setLineWidth (me, lineWidth);
 	}
 	if (hasDottedLine) {
 		Graphics_setLineType (me, Graphics_DOTTED);
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
-		Graphics_line (me, log10 (position), 0, log10 (position), 1);
+		Graphics_line (me, log10 (position), 0.0, log10 (position), 1.0);
 		Graphics_setLineWidth (me, lineWidth);
 	}
-	if (text && wcslen (text)) Graphics_text (me, log10 (position), 1 + my vertTick, text);
+	if (text && text [0]) Graphics_text (me, log10 (position), 1.0 + my vertTick, text);
 	Graphics_unsetInner (me);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setLineType (me, lineType);
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_markBottomLogarithmic (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const wchar_t *text) {
+void Graphics_markBottomLogarithmic (Graphics me, double position, bool hasNumber, bool hasTick, bool hasDottedLine, const char32 *text /* cattable */) {
 	double x1WC = my d_x1WC, x2WC = my d_x2WC, y1WC = my d_y1WC, y2WC = my d_y2WC;
 	int lineType = my lineType;
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
-	if (position <= 0) return;
+	if (position <= 0.0) return;
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, x1WC, x2WC, 0, 1);
+	Graphics_setWindow (me, x1WC, x2WC, 0.0, 1.0);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_TOP);
 	Graphics_setInner (me);
-	if (hasNumber) Graphics_text1 (me, log10 (position), - my vertTick, Melder_float (Melder_half (position)));
+	if (hasNumber) Graphics_text (me, log10 (position), - my vertTick, Melder_float (Melder_half (position)));
 	if (hasTick) {
 		Graphics_setLineType (me, Graphics_DRAWN);
 		Graphics_setLineWidth (me, 2.0 * lineWidth);
-		Graphics_line (me, log10 (position), - my vertTick, log10 (position), 0);
+		Graphics_line (me, log10 (position), - my vertTick, log10 (position), 0.0);
 		Graphics_setLineWidth (me, lineWidth);
 	}
 	if (hasDottedLine) {
 		Graphics_setLineType (me, Graphics_DOTTED);
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
-		Graphics_line (me, log10 (position), 0, log10 (position), 1);
+		Graphics_line (me, log10 (position), 0.0, log10 (position), 1.0);
 		Graphics_setLineWidth (me, lineWidth);
 	}
-	if (text && wcslen (text)) Graphics_text (me, log10 (position), - my vertTick, text);
+	if (text && text [0]) Graphics_text (me, log10 (position), - my vertTick, text);
 	Graphics_unsetInner (me);
 	Graphics_setWindow (me, x1WC, x2WC, y1WC, y2WC);
 	Graphics_setLineType (me, lineType);
@@ -716,8 +670,8 @@ void Graphics_marksLeftEvery (Graphics me, double units, double distance, bool h
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
 	distance *= units;
-	first = ceil (( y1WC < y2WC ? y1WC : y2WC ) / distance - 1e-5);
-	last = floor (( y1WC < y2WC ? y2WC : y1WC) / distance + 1e-5);
+	first = (int) ceil (( y1WC < y2WC ? y1WC : y2WC ) / distance - 1e-5);
+	last = (int) floor (( y1WC < y2WC ? y2WC : y1WC) / distance + 1e-5);
 	Graphics_setColour (me, Graphics_BLACK);
 	Graphics_setWindow (me, 0, 1, y1WC, y2WC);
 	Graphics_setTextAlignment (me, Graphics_RIGHT, Graphics_HALF);
@@ -728,8 +682,8 @@ void Graphics_marksLeftEvery (Graphics me, double units, double distance, bool h
 	}
 	for (int i = first; i <= last; i ++) {
 		double yWC = i * distance;
-		if (haveNumbers) Graphics_text1 (me, - my horTick, yWC, Melder_float (Melder_half (yWC / units)));
-		if (haveTicks) Graphics_line (me, - my horTick, yWC, 0, yWC);
+		if (haveNumbers) Graphics_text (me, - my horTick, yWC, Melder_float (Melder_half (yWC / units)));
+		if (haveTicks) Graphics_line (me, - my horTick, yWC, 0.0, yWC);
 	}
 	if (haveTicks) Graphics_setLineWidth (me, lineWidth);
 	if (haveDottedLines) {
@@ -737,7 +691,7 @@ void Graphics_marksLeftEvery (Graphics me, double units, double distance, bool h
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
 		for (int i = first; i <= last; i ++) {
 			double yWC = i * distance;
-			Graphics_line (me, 0, yWC, 1, yWC);
+			Graphics_line (me, 0.0, yWC, 1.0, yWC);
 		}
 		Graphics_setLineWidth (me, lineWidth);
 	}
@@ -753,8 +707,8 @@ void Graphics_marksRightEvery (Graphics me, double units, double distance, bool
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
 	distance *= units;
-	first = ceil (( y1WC < y2WC ? y1WC : y2WC ) / distance - 1e-5);
-	last = floor (( y1WC < y2WC ? y2WC : y1WC) / distance + 1e-5);
+	first = (int) ceil (( y1WC < y2WC ? y1WC : y2WC ) / distance - 1e-5);
+	last = (int) floor (( y1WC < y2WC ? y2WC : y1WC) / distance + 1e-5);
 	if (first > last) return;
 	Graphics_setColour (me, Graphics_BLACK);
 	Graphics_setWindow (me, 0, 1, y1WC, y2WC);
@@ -766,8 +720,8 @@ void Graphics_marksRightEvery (Graphics me, double units, double distance, bool
 	}
 	for (int i = first; i <= last; i ++) {
 		double yWC = i * distance;
-		if (haveNumbers) Graphics_text1 (me, 1 + my horTick, yWC, Melder_float (Melder_half (yWC / units)));
-		if (haveTicks) Graphics_line (me, 1, yWC, 1 + my horTick, yWC);
+		if (haveNumbers) Graphics_text (me, 1.0 + my horTick, yWC, Melder_float (Melder_half (yWC / units)));
+		if (haveTicks) Graphics_line (me, 1.0, yWC, 1.0 + my horTick, yWC);
 	}
 	if (haveTicks) Graphics_setLineWidth (me, lineWidth);
 	if (haveDottedLines) {
@@ -775,7 +729,7 @@ void Graphics_marksRightEvery (Graphics me, double units, double distance, bool
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
 		for (int i = first; i <= last; i ++) {
 			double yWC = i * distance;
-			Graphics_line (me, 0, yWC, 1, yWC);
+			Graphics_line (me, 0.0, yWC, 1.0, yWC);
 		}
 		Graphics_setLineWidth (me, lineWidth);
 	}
@@ -791,10 +745,10 @@ void Graphics_marksBottomEvery (Graphics me, double units, double distance, bool
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
 	distance *= units;
-	first = ceil (( x1WC < x2WC ? x1WC : x2WC ) / distance - 1e-5);
-	last = floor (( x1WC < x2WC ? x2WC : x1WC) / distance + 1e-5);
+	first = (int) ceil (( x1WC < x2WC ? x1WC : x2WC ) / distance - 1e-5);
+	last = (int) floor (( x1WC < x2WC ? x2WC : x1WC) / distance + 1e-5);
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, x1WC, x2WC, 0, 1);
+	Graphics_setWindow (me, x1WC, x2WC, 0.0, 1.0);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_TOP);
 	Graphics_setInner (me);
 	if (haveTicks) {
@@ -803,8 +757,8 @@ void Graphics_marksBottomEvery (Graphics me, double units, double distance, bool
 	}
 	for (int i = first; i <= last; i ++) {
 		double xWC = i * distance;
-		if (haveNumbers) Graphics_text1 (me, xWC, - my vertTick, Melder_float (Melder_half (xWC / units)));
-		if (haveTicks) Graphics_line (me, xWC, - my vertTick, xWC, 0);
+		if (haveNumbers) Graphics_text (me, xWC, - my vertTick, Melder_float (Melder_half (xWC / units)));
+		if (haveTicks) Graphics_line (me, xWC, - my vertTick, xWC, 0.0);
 	}
 	if (haveTicks) Graphics_setLineWidth (me, lineWidth);
 	if (haveDottedLines) {
@@ -812,7 +766,7 @@ void Graphics_marksBottomEvery (Graphics me, double units, double distance, bool
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
 		for (int i = first; i <= last; i ++) {
 			double xWC = i * distance;
-			Graphics_line (me, xWC, 0, xWC, 1);
+			Graphics_line (me, xWC, 0.0, xWC, 1.0);
 		}
 		Graphics_setLineWidth (me, lineWidth);
 	}
@@ -828,10 +782,10 @@ void Graphics_marksTopEvery (Graphics me, double units, double distance, bool ha
 	double lineWidth = my lineWidth;
 	Graphics_Colour colour = my colour;
 	distance *= units;
-	first = ceil (( x1WC < x2WC ? x1WC : x2WC ) / distance - 1e-5);
-	last = floor (( x1WC < x2WC ? x2WC : x1WC) / distance + 1e-5);
+	first = (int) ceil (( x1WC < x2WC ? x1WC : x2WC ) / distance - 1e-5);
+	last = (int) floor (( x1WC < x2WC ? x2WC : x1WC) / distance + 1e-5);
 	Graphics_setColour (me, Graphics_BLACK);
-	Graphics_setWindow (me, x1WC, x2WC, 0, 1);
+	Graphics_setWindow (me, x1WC, x2WC, 0.0, 1.0);
 	Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_BOTTOM);
 	Graphics_setInner (me);
 	if (haveTicks) {
@@ -840,8 +794,8 @@ void Graphics_marksTopEvery (Graphics me, double units, double distance, bool ha
 	}
 	for (int i = first; i <= last; i ++) {
 		double xWC = i * distance;
-		if (haveNumbers) Graphics_text1 (me, xWC, 1 + my vertTick, Melder_float (Melder_half (xWC / units)));
-		if (haveTicks) Graphics_line (me, xWC, 1, xWC, 1 + my vertTick);
+		if (haveNumbers) Graphics_text (me, xWC, 1.0 + my vertTick, Melder_float (Melder_half (xWC / units)));
+		if (haveTicks) Graphics_line (me, xWC, 1.0, xWC, 1.0 + my vertTick);
 	}
 	if (haveTicks) Graphics_setLineWidth (me, lineWidth);
 	if (haveDottedLines) {
@@ -849,7 +803,7 @@ void Graphics_marksTopEvery (Graphics me, double units, double distance, bool ha
 		Graphics_setLineWidth (me, 0.67 * lineWidth);
 		for (int i = first; i <= last; i ++) {
 			double xWC = i * distance;
-			Graphics_line (me, xWC, 0, xWC, 1);
+			Graphics_line (me, xWC, 0.0, xWC, 1.0);
 		}
 		Graphics_setLineWidth (me, lineWidth);
 	}
@@ -859,7 +813,7 @@ void Graphics_marksTopEvery (Graphics me, double units, double distance, bool ha
 	Graphics_setColour (me, colour);
 }
 
-void Graphics_mark (Graphics me, double x, double y, double size_mm, const wchar_t *markString) {
+void Graphics_mark (Graphics me, double x, double y, double size_mm, const char32 *markString /* cattable */) {
 	int mark;
 	if (! markString || ! markString [0]) mark = 0;
 	else if (! markString [1]) {
@@ -873,7 +827,7 @@ void Graphics_mark (Graphics me, double x, double y, double size_mm, const wchar
 		int oldSize = my fontSize;
 		int oldHorizontalAlignment = my horizontalTextAlignment;
 		int oldVerticalAlignment = my verticalTextAlignment;
-		Graphics_setFontSize (me, size_mm * 72 / 25.4);
+		Graphics_setFontSize (me, size_mm * 72.0 / 25.4);
 		Graphics_setTextAlignment (me, Graphics_CENTRE, Graphics_HALF);
 		Graphics_text (me, x, y, markString);
 		Graphics_setFontSize (me, oldSize);
@@ -903,7 +857,7 @@ void Graphics_setTextRotation_vector (Graphics me, double dx, double dy) {
 		angle = dy > 0.0 ? 90.0 : 270.0;
 	} else {
 		double dxDC = dx * my scaleX, dyDC = my yIsZeroAtTheTop ? -dy * my scaleY : dy * my scaleY;
-		angle = atan2 (dyDC, dxDC) * (180 / NUMpi);
+		angle = atan2 (dyDC, dxDC) * (180.0 / NUMpi);
 	}
 	Graphics_setTextRotation (me, angle);
 }
diff --git a/sys/Gui.cpp b/sys/Gui.cpp
index 8a84dd9..268aefe 100644
--- a/sys/Gui.cpp
+++ b/sys/Gui.cpp
@@ -21,7 +21,7 @@
  * pb 2002/03/07 GPL
  * pb 2002/03/11 Mach
  * pb 2004/10/21 on Unix, Ctrl becomes the command key
- * pb 2007/06/09 wchar_t
+ * pb 2007/06/09 wchar
  * pb 2007/12/13 Gui
  * sdk 2008/02/08 GTK
  * sdk 2008/03/24 GDK
@@ -44,7 +44,7 @@ int Gui_getResolution (GuiObject widget) {
 			(void) widget;
 			CGDirectDisplayID display = CGMainDisplayID ();
 			CGSize size = CGDisplayScreenSize (display);
-			resolution = floor (25.4 * (double) CGDisplayPixelsWide (display) / size.width + 0.5);
+			resolution = lround (25.4 * (double) CGDisplayPixelsWide (display) / size.width);
 			//resolution = 72;
 		#elif defined (_WIN32)
 			(void) widget;
@@ -63,11 +63,11 @@ int Gui_getResolution (GuiObject widget) {
 void GuiGtk_initialize () {
 	static bool gtkHasBeenInitialized = false;
 	if (! gtkHasBeenInitialized) {
-		trace ("before initing GTK: locale is %s", setlocale (LC_ALL, NULL));
+		trace (U"before initing GTK: locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 		gtk_disable_setlocale ();   // otherwise 1.5 will be written "1,5" on computers with a French or German locale
-		trace ("during initing GTK: locale is %s", setlocale (LC_ALL, NULL));
-		gtk_init_check (NULL, NULL);
-		trace ("after initing GTK: locale is %s", setlocale (LC_ALL, NULL));
+		trace (U"during initing GTK: locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
+		gtk_init_check (nullptr, nullptr);
+		trace (U"after initing GTK: locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 		gtkHasBeenInitialized = true;
 	}
 	}
@@ -122,9 +122,9 @@ void Gui_getWindowPositioningBounds (double *x, double *y, double *width, double
 		GuiGtk_initialize ();
 		GdkScreen *screen = gdk_screen_get_default ();
 		/*
-		if (parent != NULL) {
+		if (parent) {
 			GuiObject parent_win = gtk_widget_get_ancestor (GTK_WIDGET (parent), GTK_TYPE_WINDOW);
-			if (parent_win != NULL) {
+			if (parent_win) {
 				screen = gtk_window_get_screen (GTK_WINDOW (parent_win));
 			}
 		}
diff --git a/sys/Gui.h b/sys/Gui.h
index e568110..bce4842 100644
--- a/sys/Gui.h
+++ b/sys/Gui.h
@@ -2,7 +2,7 @@
 #define _Gui_h_
 /* Gui.h
  *
- * Copyright (C) 1993-2011,2012,2013,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1993-2011,2012,2013,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -190,7 +190,6 @@
 	void XtDestroyWidget (GuiObject w);
 	void XtDispatchEvent (XEvent *event);
 	#define XtDisplay(w)  0
-	void GuiInitialize (const char *name, unsigned int *argc, char **argv);
 	Boolean XtIsManaged (GuiObject w);
 	Boolean XtIsShell (GuiObject w);
 	void XtManageChild (GuiObject w);
@@ -203,15 +202,14 @@
 	void XtSetSensitive (GuiObject w, Boolean value);
 	void XtUnmanageChild (GuiObject self);
 	void XtUnmanageChildren (GuiObjectList children, Cardinal num_children);
-	void GuiAppInitialize (const char *name,
-		void *dum1, int dum2, unsigned int *argc, char **argv, void *dum3, void *dum4);
+	void GuiAppInitialize (const char *name, unsigned int argc, char **argv);
 	void GuiApp_setApplicationShell (GuiObject shell);
 	GuiObject XtVaCreateWidget (const char *name, int widgetClass, GuiObject parent, ...);
 	GuiObject XtVaCreateManagedWidget (const char *name, int widgetClass, GuiObject parent, ...);
 	void XtVaGetValues (GuiObject w, ...);
 	void XtVaSetValues (GuiObject w, ...);
 	Window XtWindow (GuiObject w);
-	long Gui_getNumberOfMotifWidgets (void);
+	long Gui_getNumberOfMotifWidgets ();
 
 	/*
 	 * Xm widget classes.
@@ -296,15 +294,14 @@
 	void XmUpdateDisplay (GuiObject dummy);
 
 	#if defined (macintosh)
-		void motif_mac_defaultFont (void);
+		void motif_mac_defaultFont ();
 		void GuiMac_clipOn (GuiObject widget);   /* Clip to the inner area of a drawingArea (for drawing);
 			used by graphics drivers for Macintosh (clipping is automatic for Xwindows). */
 		int GuiMac_clipOn_graphicsContext (GuiObject me, void *graphicsContext);
-		void GuiMac_clipOff (void);
-		void motif_mac_setUserMessageCallbackA (int (*userMessageCallback) (char *message));
-		void motif_mac_setUserMessageCallbackW (int (*userMessageCallback) (wchar_t *message));
+		void GuiMac_clipOff ();
+		void motif_mac_setUserMessageCallback (int (*userMessageCallback) (char32 *message));
 	#elif defined (_WIN32)
-		int motif_win_mouseStillDown (void);
+		bool motif_win_mouseStillDown ();
 		void motif_win_setUserMessageCallback (int (*userMessageCallback) (void));
 	#endif
 #else
@@ -320,48 +317,42 @@ Thing_declare (GuiScrolledWindow);
 Thing_declare (GuiShell);
 Thing_declare (GuiWindow);
 
-Thing_define (GuiThing, Thing) { public:
+Thing_define (GuiThing, Thing) {
 	GuiShell d_shell;
 	GuiThing d_parent;
 	GuiObject d_widget;
-	/*
-	 * Messages:
-	 */
-	void f_show ();
-	void f_hide ();
-	void f_setSensitive (bool sensitive);
-	/*
-	 * Methods:
-	 */
-	virtual void v_destroy ();
+
+	void v_destroy ()
+		override;
+
 	virtual void v_show ();
 	virtual void v_hide ();
 	virtual void v_setSensitive (bool sensitive);
 };
 
-Thing_define (GuiControl, GuiThing) { public:
+void GuiThing_show (GuiThing me);
+void GuiThing_hide (GuiThing me);
+void GuiThing_setSensitive (GuiThing me, bool sensitive);
+
+Thing_define (GuiControl, GuiThing) {
 	int d_left, d_right, d_top, d_bottom;
 	bool d_blockValueChangedCallbacks;
-	/*
-	 * Messages:
-	 */
-	int f_getX ();
-	int f_getY ();
-	int f_getWidth ();
-	int f_getHeight ();
-	void f_move (int x, int y);
-	void f_setSize (int width, int height);
-	/*
-	 * Methods:
-	 */
+
 	virtual void v_positionInForm (GuiObject widget, int left, int right, int top, int bottom, GuiForm parent);
 	virtual void v_positionInScrolledWindow (GuiObject widget, int width, int height, GuiScrolledWindow parent);
 };
 
+int GuiControl_getX (GuiControl me);
+int GuiControl_getY (GuiControl me);
+int GuiControl_getWidth  (GuiControl me);
+int GuiControl_getHeight (GuiControl me);
+void GuiControl_move (GuiControl me, int x, int y);
+void GuiControl_setSize (GuiControl me, int width, int height);
+
 Thing_define (GuiForm, GuiControl) {
 };
 
-Thing_define (GuiShell, GuiForm) { public:
+Thing_define (GuiShell, GuiForm) {
 	int d_width, d_height;
 	#if gtk
 		GtkWindow *d_gtkWindow;
@@ -372,19 +363,16 @@ Thing_define (GuiShell, GuiForm) { public:
 	#endif
 	void (*d_goAwayCallback) (void *boss);
 	void *d_goAwayBoss;
-	/*
-	 * Messages:
-	 */
-	int f_getShellWidth ();
-	int f_getShellHeight ();
-	void f_setTitle (const wchar_t *title);
-	void f_drain ();   // drain the double graphics buffer
-	/*
-	 * Overridden methods:
-	 */
-	virtual void v_destroy ();
+
+	void v_destroy ()
+		override;
 };
 
+int GuiShell_getShellWidth  (GuiShell me);   // needed because GuiControl_getWidth yields the width of the inner form
+int GuiShell_getShellHeight (GuiShell me);
+void GuiShell_setTitle (GuiShell me, const char32 *title /* cattable */);
+void GuiShell_drain (GuiShell me);   // drain the double graphics buffer
+
 /********** GuiButton **********/
 
 Thing_declare (GuiButton);
@@ -394,14 +382,10 @@ typedef struct structGuiButtonEvent {
 	bool shiftKeyPressed, commandKeyPressed, optionKeyPressed, extraControlKeyPressed;
 } *GuiButtonEvent;
 
-Thing_define (GuiButton, GuiControl) { public:
+Thing_define (GuiButton, GuiControl) {
 	void (*d_activateCallback) (void *boss, GuiButtonEvent event);
 	void *d_activateBoss;
 	GuiMenu d_menu;   // for cascade buttons
-	/*
-	 * Messages:
-	 */
-	void f_setString (const wchar_t * text);
 };
 
 /* GuiButton creation flags: */
@@ -409,10 +393,18 @@ Thing_define (GuiButton, GuiControl) { public:
 #define GuiButton_CANCEL  2
 #define GuiButton_INSENSITIVE  4
 #define GuiButton_ATTRACTIVE  8
-GuiButton GuiButton_create      (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*clickedCallback) (void *boss, GuiButtonEvent event), void *boss, unsigned long flags);
-GuiButton GuiButton_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*clickedCallback) (void *boss, GuiButtonEvent event), void *boss, unsigned long flags);
+GuiButton GuiButton_create      (GuiForm parent,
+	int left, int right, int top, int bottom,
+	const char32 *text,
+	void (*activateCallback) (void *boss, GuiButtonEvent event), void *boss,
+	uint32 flags);
+GuiButton GuiButton_createShown (GuiForm parent,
+	int left, int right, int top, int bottom,
+	const char32 *text,
+	void (*activateCallback) (void *boss, GuiButtonEvent event), void *boss,
+	uint32 flags);
+
+void GuiButton_setText (GuiButton me, const char32 *text /* cattable */);
 
 /********** GuiCheckButton **********/
 
@@ -422,35 +414,40 @@ typedef struct structGuiCheckButtonEvent {
 	GuiCheckButton toggle;
 } *GuiCheckButtonEvent;
 
-Thing_define (GuiCheckButton, GuiControl) { public:
+Thing_define (GuiCheckButton, GuiControl) {
 	void (*d_valueChangedCallback) (void *boss, GuiCheckButtonEvent event);
 	void *d_valueChangedBoss;
-	/*
-	 * Messages:
-	 */
-	bool f_getValue ();
-	void f_setValue (bool value);
 };
 
 /* GuiCheckButton creation flags: */
 #define GuiCheckButton_SET  1
 #define GuiCheckButton_INSENSITIVE  2
-GuiCheckButton GuiCheckButton_create      (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*valueChangedCallback) (void *boss, GuiCheckButtonEvent event), void *valueChangedBoss, unsigned long flags);
-GuiCheckButton GuiCheckButton_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*valueChangedCallback) (void *boss, GuiCheckButtonEvent event), void *valueChangedBoss, unsigned long flags);
+GuiCheckButton GuiCheckButton_create      (GuiForm parent,
+	int left, int right, int top, int bottom,
+	const char32 *text,
+	void (*valueChangedCallback) (void *boss, GuiCheckButtonEvent event), void *boss,
+	uint32 flags);
+GuiCheckButton GuiCheckButton_createShown (GuiForm parent,
+	int left, int right, int top, int bottom,
+	const char32 *text,
+	void (*valueChangedCallback) (void *boss, GuiCheckButtonEvent event), void *boss,
+	uint32 flags);
+
+bool GuiCheckButton_getValue (GuiCheckButton me);
+void GuiCheckButton_setValue (GuiCheckButton me, bool value);
 
 /********** GuiDialog **********/
 
-Thing_declare (GuiDialog);
-
-Thing_define (GuiDialog, GuiShell) { public:
+Thing_define (GuiDialog, GuiShell) {
 };
 
 /* GuiDialog creation flags: */
 #define GuiDialog_MODAL  1
-GuiDialog GuiDialog_create (GuiWindow parent, int x, int y, int width, int height,
-	const wchar_t *title, void (*goAwayCallback) (void *goAwayBoss), void *goAwayBoss, unsigned long flags);
+GuiDialog GuiDialog_create (GuiWindow parent,
+	int x, int y, int width, int height,
+	const char32 *title,
+	void (*goAwayCallback) (void *goAwayBoss), void *goAwayBoss,
+	uint32 flags);
 
 /********** GuiDrawingArea **********/
 
@@ -469,7 +466,7 @@ typedef struct structGuiDrawingAreaClickEvent {
 } *GuiDrawingAreaClickEvent;
 typedef struct structGuiDrawingAreaKeyEvent {
 	GuiDrawingArea widget;
-	wchar_t key;
+	char32 key;
 	bool shiftKeyPressed, commandKeyPressed, optionKeyPressed, extraControlKeyPressed;
 } *GuiDrawingAreaKeyEvent;
 typedef struct structGuiDrawingAreaResizeEvent {
@@ -477,7 +474,7 @@ typedef struct structGuiDrawingAreaResizeEvent {
 	int width, height;
 } *GuiDrawingAreaResizeEvent;
 
-Thing_define (GuiDrawingArea, GuiControl) { public:
+Thing_define (GuiDrawingArea, GuiControl) {
 	GuiScrollBar d_horizontalScrollBar, d_verticalScrollBar;   // for swiping
 	void (*d_exposeCallback) (void *boss, GuiDrawingAreaExposeEvent event);
 	void *d_exposeBoss;
@@ -487,13 +484,6 @@ Thing_define (GuiDrawingArea, GuiControl) { public:
 	void *d_keyBoss;
 	void (*d_resizeCallback) (void *boss, GuiDrawingAreaResizeEvent event);
 	void *d_resizeBoss;
-	/*
-	 * Messages:
-	 */
-	void f_setSwipable (GuiScrollBar horizontalScrollBar, GuiScrollBar verticalScrollBar);
-	void f_setExposeCallback (void (*callback) (void *boss, GuiDrawingAreaExposeEvent event), void *boss);
-	void f_setClickCallback  (void (*callback) (void *boss, GuiDrawingAreaClickEvent  event), void *boss);
-	void f_setResizeCallback (void (*callback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss);
 };
 
 /* GuiDrawingArea creation flags: */
@@ -503,29 +493,36 @@ GuiDrawingArea GuiDrawingArea_create (GuiForm parent, int left, int right, int t
 	void (*clickCallback) (void *boss, GuiDrawingAreaClickEvent event),
 	void (*keyCallback) (void *boss, GuiDrawingAreaKeyEvent event),
 	void (*resizeCallback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss,
-	unsigned long flags);
+	uint32 flags);
 GuiDrawingArea GuiDrawingArea_createShown (GuiForm parent, int left, int right, int top, int bottom,
 	void (*exposeCallback) (void *boss, GuiDrawingAreaExposeEvent event),
 	void (*clickCallback) (void *boss, GuiDrawingAreaClickEvent event),
 	void (*keyCallback) (void *boss, GuiDrawingAreaKeyEvent event),
 	void (*resizeCallback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss,
-	unsigned long flags);
+	uint32 flags);
 GuiDrawingArea GuiDrawingArea_create (GuiScrolledWindow parent, int width, int height,
 	void (*exposeCallback) (void *boss, GuiDrawingAreaExposeEvent event),
 	void (*clickCallback) (void *boss, GuiDrawingAreaClickEvent event),
 	void (*keyCallback) (void *boss, GuiDrawingAreaKeyEvent event),
 	void (*resizeCallback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss,
-	unsigned long flags);
+	uint32 flags);
 GuiDrawingArea GuiDrawingArea_createShown (GuiScrolledWindow parent, int width, int height,
 	void (*exposeCallback) (void *boss, GuiDrawingAreaExposeEvent event),
 	void (*clickCallback) (void *boss, GuiDrawingAreaClickEvent event),
 	void (*keyCallback) (void *boss, GuiDrawingAreaKeyEvent event),
 	void (*resizeCallback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss,
-	unsigned long flags);
+	uint32 flags);
+
+void GuiDrawingArea_setSwipable (GuiDrawingArea me, GuiScrollBar horizontalScrollBar, GuiScrollBar verticalScrollBar);
+void GuiDrawingArea_setExposeCallback (GuiDrawingArea me, void (*callback) (void *boss, GuiDrawingAreaExposeEvent event), void *boss);
+void GuiDrawingArea_setClickCallback  (GuiDrawingArea me, void (*callback) (void *boss, GuiDrawingAreaClickEvent  event), void *boss);
+void GuiDrawingArea_setResizeCallback (GuiDrawingArea me, void (*callback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss);
 
-SortedSetOfString GuiFileSelect_getInfileNames (GuiWindow parent, const wchar_t *title, bool allowMultipleFiles);
-wchar_t * GuiFileSelect_getOutfileName (GuiWindow parent, const wchar_t *title, const wchar_t *defaultName);
-wchar_t * GuiFileSelect_getDirectoryName (GuiWindow parent, const wchar_t *title);
+/********** GuiFileSelect **********/
+
+SortedSetOfString GuiFileSelect_getInfileNames (GuiWindow parent, const char32 *title, bool allowMultipleFiles);
+char32 * GuiFileSelect_getOutfileName (GuiWindow parent, const char32 *title, const char32 *defaultName);
+char32 * GuiFileSelect_getDirectoryName (GuiWindow parent, const char32 *title);
 
 /********** GuiForm **********/
 
@@ -533,19 +530,20 @@ GuiForm GuiForm_createInScrolledWindow (GuiScrolledWindow parent);
 
 /********** GuiLabel **********/
 
-Thing_declare (GuiLabel);
+//Thing_declare (GuiLabel);
 
-Thing_define (GuiLabel, GuiControl) { public:
-	void f_setString (const wchar_t * text);
+Thing_define (GuiLabel, GuiControl) {
 };
 
 /* GuiLabel creation flags: */
 #define GuiLabel_CENTRE  1
 #define GuiLabel_RIGHT  2
 GuiLabel GuiLabel_create      (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *labelText, unsigned long flags);
+	const char32 *text, uint32 flags);
 GuiLabel GuiLabel_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *labelText, unsigned long flags);
+	const char32 *text, uint32 flags);
+
+void GuiLabel_setText (GuiLabel me, const char32 *text /* cattable */);
 
 /********** GuiList **********/
 
@@ -556,7 +554,7 @@ typedef struct structGuiListEvent {
 	GuiList list;
 } *GuiListEvent;
 
-Thing_define (GuiList, GuiControl) { public:
+Thing_define (GuiList, GuiControl) {
 	bool d_allowMultipleSelection;
 	void (*d_selectionChangedCallback) (void *boss, GuiListEvent event);
 	void *d_selectionChangedBoss;
@@ -569,33 +567,31 @@ Thing_define (GuiList, GuiControl) { public:
 		GuiObject d_xmScrolled, d_xmList;
 		ListHandle d_macListHandle;
 	#endif
-	/*
-	 * Messages:
-	 */
-	void f_deleteAllItems ();
-	void f_deleteItem (long position);
-	void f_deselectAllItems ();
-	void f_deselectItem (long position);
-	long f_getBottomPosition ();
-	long f_getNumberOfItems ();
-	long * f_getSelectedPositions (long *numberOfSelected);
-	long f_getTopPosition ();
-	void f_insertItem (const wchar_t *itemText, long position);
-	void f_replaceItem (const wchar_t *itemText, long position);
-	void f_setTopPosition (long topPosition);
-	void f_selectItem (long position);
-	void f_setSelectionChangedCallback (void (*callback) (void *boss, GuiListEvent event), void *boss);
-	void f_setDoubleClickCallback (void (*callback) (void *boss, GuiListEvent event), void *boss);
 };
 
-GuiList GuiList_create      (GuiForm parent, int left, int right, int top, int bottom, bool allowMultipleSelection, const wchar_t *header);
-GuiList GuiList_createShown (GuiForm parent, int left, int right, int top, int bottom, bool allowMultipleSelection, const wchar_t *header);
+GuiList GuiList_create      (GuiForm parent, int left, int right, int top, int bottom, bool allowMultipleSelection, const char32 *header);
+GuiList GuiList_createShown (GuiForm parent, int left, int right, int top, int bottom, bool allowMultipleSelection, const char32 *header);
+
+void GuiList_deleteAllItems (GuiList me);
+void GuiList_deleteItem (GuiList me, long position);
+void GuiList_deselectAllItems (GuiList me);
+void GuiList_deselectItem (GuiList me, long position);
+long GuiList_getBottomPosition (GuiList me);
+long GuiList_getNumberOfItems (GuiList me);
+long * GuiList_getSelectedPositions (GuiList me, long *numberOfSelected);
+long GuiList_getTopPosition (GuiList me);
+void GuiList_insertItem  (GuiList me, const char32 *itemText /* cattable */, long position);
+void GuiList_replaceItem (GuiList me, const char32 *itemText /* cattable */, long position);
+void GuiList_setTopPosition (GuiList me, long topPosition);
+void GuiList_selectItem (GuiList me, long position);
+void GuiList_setSelectionChangedCallback (GuiList me, void (*callback) (void *boss, GuiListEvent event), void *boss);
+void GuiList_setDoubleClickCallback (GuiList me, void (*callback) (void *boss, GuiListEvent event), void *boss);
 
 /********** GuiMenu **********/
 
 Thing_declare (GuiMenuItem);
 
-Thing_define (GuiMenu, GuiThing) { public:
+Thing_define (GuiMenu, GuiThing) {
 	GuiMenuItem d_menuItem;
 	GuiButton d_cascadeButton;
 	#if gtk
@@ -608,22 +604,22 @@ Thing_define (GuiMenu, GuiThing) { public:
 		GuiObject d_xmMenuTitle;   // in case the menu is in a menu bar
 		GuiObject d_xmMenuBar;   // in case the menu is in a form
 	#endif
-	/*
-	 * Messages:
-	 */
-	void f_empty ();
-	/*
-	 * Overridden methods:
-	 */
-	virtual void v_destroy ();
-	virtual void v_show ();
-	virtual void v_hide ();
-	virtual void v_setSensitive (bool sensitive);
+
+	void v_destroy ()
+		override;
+	void v_show ()
+		override;
+	void v_hide ()
+		override;
+	void v_setSensitive (bool sensitive)
+		override;
 };
 
-GuiMenu GuiMenu_createInWindow (GuiWindow window, const wchar_t *title, long flags);
-GuiMenu GuiMenu_createInMenu (GuiMenu supermenu, const wchar_t *title, long flags);
-GuiMenu GuiMenu_createInForm (GuiForm form, int left, int right, int top, int bottom, const wchar_t *title, long flags);
+GuiMenu GuiMenu_createInWindow (GuiWindow window, const char32 *title, uint32 flags);
+GuiMenu GuiMenu_createInMenu (GuiMenu supermenu, const char32 *title, uint32 flags);
+GuiMenu GuiMenu_createInForm (GuiForm form, int left, int right, int top, int bottom, const char32 *title, uint32 flags);
+
+void GuiMenu_empty (GuiMenu me);
 
 /********** GuiMenuItem **********/
 
@@ -634,17 +630,13 @@ typedef struct structGuiMenuItemEvent {
 	bool shiftKeyPressed, commandKeyPressed, optionKeyPressed, extraControlKeyPressed;
 } *GuiMenuItemEvent;
 
-Thing_define (GuiMenuItem, GuiThing) { public:
+Thing_define (GuiMenuItem, GuiThing) {
 	GuiMenu d_menu;
 	void (*d_commandCallback) (void *boss, GuiMenuItemEvent event);
 	void *d_boss;
 	#if gtk
 		bool d_callbackBlocked;
 	#endif
-	/*
-	 * Messages:
-	 */
-	void f_check (bool check);
 };
 
 /* Button layout and state: */
@@ -690,41 +682,36 @@ Thing_define (GuiMenuItem, GuiThing) { public:
 #define GuiMenu_F12  28
 // or any ASCII character (preferably a letter or digit) between 32 and 126
 
-GuiMenuItem GuiMenu_addItem (GuiMenu menu, const wchar_t *title, long flags,
+GuiMenuItem GuiMenu_addItem (GuiMenu menu, const char32 *title, uint32 flags,
 	void (*commandCallback) (void *boss, GuiMenuItemEvent event), void *boss);
 /* Flags is a combination of the above defines. */
 GuiMenuItem GuiMenu_addSeparator (GuiMenu menu);
 
+void GuiMenuItem_check (GuiMenuItem me, bool check);
+
 /********** GuiOptionMenu **********/
 
-Thing_define (GuiOptionMenu, GuiControl) { public:
-	/*
-	 * Messages:
-	 */
-	void f_init (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags);
-	void f_addOption (const wchar_t *text);
-	int f_getValue ();
-	void f_setValue (int value);
-	/*
-	 * Hidden data:
-	 */
-	//private:
-		int d_value;
-		Ordered d_options;   // of SimpleString
-		#if gtk
-			//GtkComboBox *d_gtkCascadeButton;
-		#elif cocoa
-		#elif motif
-			GuiObject d_xmMenuBar, d_xmCascadeButton;
-		#endif
-	/*
-	 * Methods:
-	 */
-	virtual void v_show ();   // overridden
+Thing_define (GuiOptionMenu, GuiControl) {
+	int d_value;
+	Ordered d_options;   // of SimpleString
+	#if gtk
+		//GtkComboBox *d_gtkCascadeButton;
+	#elif cocoa
+	#elif motif
+		GuiObject d_xmMenuBar, d_xmCascadeButton;
+	#endif
+
+	void v_show ()
+		override;
 };
 
-GuiOptionMenu GuiOptionMenu_create      (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags);
-GuiOptionMenu GuiOptionMenu_createShown (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags);
+void GuiOptionMenu_init (GuiOptionMenu me, GuiForm parent, int left, int right, int top, int bottom, uint32 flags);
+GuiOptionMenu GuiOptionMenu_create        (GuiForm parent, int left, int right, int top, int bottom, uint32 flags);
+GuiOptionMenu GuiOptionMenu_createShown   (GuiForm parent, int left, int right, int top, int bottom, uint32 flags);
+
+void GuiOptionMenu_addOption (GuiOptionMenu me, const char32 *text);
+int GuiOptionMenu_getValue (GuiOptionMenu me);
+void GuiOptionMenu_setValue (GuiOptionMenu me, int value);
 
 /********** GuiProgressBar **********/
 
@@ -734,14 +721,12 @@ Thing_define (GuiProgressBar, GuiControl) { public:
 	#if cocoa
 		GuiCocoaProgressBar *d_cocoaProgressBar;
 	#endif
-	/*
-	 * Messages:
-	 */
-	void f_setValue (double value);   // between 0.0 and 1.0
 };
 
-GuiProgressBar GuiProgressBar_create      (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags);
-GuiProgressBar GuiProgressBar_createShown (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags);
+GuiProgressBar GuiProgressBar_create      (GuiForm parent, int left, int right, int top, int bottom, uint32 flags);
+GuiProgressBar GuiProgressBar_createShown (GuiForm parent, int left, int right, int top, int bottom, uint32 flags);
+
+void GuiProgressBar_setValue (GuiProgressBar me, double value);   // between 0.0 and 1.0
 
 /********** GuiRadioButton **********/
 
@@ -759,24 +744,22 @@ Thing_define (GuiRadioButton, GuiControl) { public:
 	#if cocoa
 		GuiCocoaRadioButton *d_cocoaRadioButton;
 	#endif
-	/*
-	 * Messages:
-	 */
-	bool f_getValue ();
-	void f_set ();
 };
 
 /* GuiRadioButton creation flags: */
 #define GuiRadioButton_SET  1
 #define GuiRadioButton_INSENSITIVE  2
 GuiRadioButton GuiRadioButton_create      (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*valueChangedCallback) (void *boss, GuiRadioButtonEvent event), void *valueChangedBoss, unsigned long flags);
+	const char32 *buttonText, void (*valueChangedCallback) (void *boss, GuiRadioButtonEvent event), void *valueChangedBoss, uint32 flags);
 GuiRadioButton GuiRadioButton_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*valueChangedCallback) (void *boss, GuiRadioButtonEvent event), void *valueChangedBoss, unsigned long flags);
+	const char32 *buttonText, void (*valueChangedCallback) (void *boss, GuiRadioButtonEvent event), void *valueChangedBoss, uint32 flags);
 
 void GuiRadioGroup_begin ();
 void GuiRadioGroup_end ();
 
+bool GuiRadioButton_getValue (GuiRadioButton me);
+void GuiRadioButton_set (GuiRadioButton me);
+
 /********** GuiScale **********/
 
 Thing_declare (GuiScale);
@@ -785,17 +768,15 @@ Thing_define (GuiScale, GuiControl) { public:
 	#if cocoa
 		GuiCocoaScale *d_cocoaScale;
 	#endif
-	/*
-	 * Messages:
-	 */
-	int f_getValue ();
-	void f_setValue (int value);
 };
 
 GuiScale GuiScale_create      (GuiForm parent, int left, int right, int top, int bottom,
-	int minimum, int maximum, int value, unsigned long flags);
+	int minimum, int maximum, int value, uint32 flags);
 GuiScale GuiScale_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	int minimum, int maximum, int value, unsigned long flags);
+	int minimum, int maximum, int value, uint32 flags);
+
+int GuiScale_getValue (GuiScale me);
+void GuiScale_setValue (GuiScale me, int value);
 
 /********** GuiScrollBar **********/
 
@@ -808,22 +789,21 @@ typedef struct structGuiScrollBarEvent {
 Thing_define (GuiScrollBar, GuiControl) { public:
 	void (*d_valueChangedCallback) (void *boss, GuiScrollBarEvent event);
 	void *d_valueChangedBoss;
-	/*
-	 * Messages:
-	 */
-	int f_getValue ();
-	int f_getSliderSize ();
-	void f_set (double minimum, double maximum, double value, double sliderSize, double increment, double pageIncrement);
 };
 
 /* GuiScrollBar creation flags: */
 #define GuiScrollBar_HORIZONTAL  1
 GuiScrollBar GuiScrollBar_create      (GuiForm parent, int left, int right, int top, int bottom,
 	double minimum, double maximum, double value, double sliderSize, double increment, double pageIncrement,
-	void (*valueChangedCallback) (void *boss, GuiScrollBarEvent event), void *valueChangedBoss, unsigned long flags);
+	void (*valueChangedCallback) (void *boss, GuiScrollBarEvent event), void *valueChangedBoss, uint32 flags);
 GuiScrollBar GuiScrollBar_createShown (GuiForm parent, int left, int right, int top, int bottom,
 	double minimum, double maximum, double value, double sliderSize, double increment, double pageIncrement,
-	void (*valueChangedCallback) (void *boss, GuiScrollBarEvent event), void *valueChangedBoss, unsigned long flags);
+	void (*valueChangedCallback) (void *boss, GuiScrollBarEvent event), void *valueChangedBoss, uint32 flags);
+
+int GuiScrollBar_getValue (GuiScrollBar me);
+int GuiScrollBar_getSliderSize (GuiScrollBar me);
+void GuiScrollBar_set (GuiScrollBar me, double minimum, double maximum, double value,
+	double sliderSize, double increment, double pageIncrement);
 
 /********** GuiScrolledWindow **********/
 
@@ -833,9 +813,9 @@ Thing_define (GuiScrolledWindow, GuiControl) { public:
 };
 
 GuiScrolledWindow GuiScrolledWindow_create      (GuiForm parent, int left, int right, int top, int bottom,
-	int horizontalScrollbarPersistence, int verticalScrollbarPersistence, unsigned long flags);
+	int horizontalScrollbarPersistence, int verticalScrollbarPersistence, uint32 flags);
 GuiScrolledWindow GuiScrolledWindow_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	int horizontalScrollbarPersistence, int verticalScrollbarPersistence, unsigned long flags);
+	int horizontalScrollbarPersistence, int verticalScrollbarPersistence, uint32 flags);
 
 /********** GuiText **********/
 
@@ -876,27 +856,6 @@ Thing_define (GuiText, GuiControl) { public:
 	#if motif
 		bool d_editable;
 	#endif
-	/*
-	 * Messages:
-	 */
-	void f_copy ();
-	void f_cut ();
-	wchar_t * f_getSelection ();
-	wchar_t * f_getString ();
-	wchar_t * f_getStringAndSelectionPosition (long *first, long *last);
-	void f_paste ();
-	void f_redo ();
-	void f_remove ();
-	void f_replace (long from_pos, long to_pos, const wchar_t *value);
-	void f_scrollToSelection ();
-	void f_setChangeCallback (void (*changeCallback) (void *boss, GuiTextEvent event), void *changeBoss);
-	void f_setFontSize (int size);
-	void f_setRedoItem (GuiMenuItem item);
-	void f_setSelection (long first, long last);
-	void f_setString (const wchar_t *text);
-	void f_setUndoItem (GuiMenuItem item);
-	void f_undo ();
-	void f_updateChangeCountAfterSave ();
 };
 
 /* GuiText creation flags: */
@@ -904,8 +863,26 @@ Thing_define (GuiText, GuiControl) { public:
 #define GuiText_MULTILINE  2
 #define GuiText_WORDWRAP  4
 #define GuiText_NONEDITABLE  8
-GuiText GuiText_create      (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags);
-GuiText GuiText_createShown (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags);
+GuiText GuiText_create      (GuiForm parent, int left, int right, int top, int bottom, uint32 flags);
+GuiText GuiText_createShown (GuiForm parent, int left, int right, int top, int bottom, uint32 flags);
+
+void GuiText_copy (GuiText me);
+void GuiText_cut (GuiText me);
+char32 * GuiText_getSelection (GuiText me);
+char32 * GuiText_getString (GuiText me);
+char32 * GuiText_getStringAndSelectionPosition (GuiText me, long *first, long *last);
+void GuiText_paste (GuiText me);
+void GuiText_redo (GuiText me);
+void GuiText_remove (GuiText me);
+void GuiText_replace (GuiText me, long from_pos, long to_pos, const char32 *value);
+void GuiText_scrollToSelection (GuiText me);
+void GuiText_setChangeCallback (GuiText me, void (*changeCallback) (void *boss, GuiTextEvent event), void *changeBoss);
+void GuiText_setFontSize (GuiText me, int size);
+void GuiText_setRedoItem (GuiText me, GuiMenuItem item);
+void GuiText_setSelection (GuiText me, long first, long last);
+void GuiText_setString (GuiText me, const char32 *text);
+void GuiText_setUndoItem (GuiText me, GuiMenuItem item);
+void GuiText_undo (GuiText me);
 
 /********** GuiWindow **********/
 
@@ -923,30 +900,28 @@ Thing_define (GuiWindow, GuiShell) { public:
 	#elif motif
 		GuiObject d_xmMenuBar;
 	#endif
-	/*
-	 * Messages:
-	 */
-	void f_addMenuBar ();
-	bool f_setDirty (bool dirty);
+};
+
+/* GuiWindow creation flags: */
+#define GuiWindow_FULLSCREEN  1
+GuiWindow GuiWindow_create (int x, int y, int width, int height, int minimumWidth, int minimumHeight,
+	const char32 *title /* cattable */, void (*goAwayCallback) (void *goAwayBoss), void *goAwayBoss, uint32 flags);
+	// returns a Form widget that has a new Shell parent.
+
+void GuiWindow_addMenuBar (GuiWindow me);
+bool GuiWindow_setDirty (GuiWindow me, bool dirty);
 	/*
 		Purpose: on OSX you get a little dot in the red close button,
 			and the window proxy icon dims.
 		Return value:
-			TRUE if the system supports this feature, FALSE if not;
+			`true` if the system supports this feature, `false` if not;
 			the point of this is that you can use a different user feedback strategy, like appending
 			the text "(modified)" to the window title, if this feature is not supported.
 	*/
-	void f_setFile (MelderFile file);
+void GuiWindow_setFile (GuiWindow me, MelderFile file);
 	/*
 		Purpose: set the window title, and (on MacOS X) the window proxy icon and the window path menu.
 	*/
-};
-
-/* GuiWindow creation flags: */
-#define GuiWindow_FULLSCREEN  1
-GuiWindow GuiWindow_create (int x, int y, int width, int height, int minimumWidth, int minimumHeight,
-	const wchar_t *title, void (*goAwayCallback) (void *goAwayBoss), void *goAwayBoss, unsigned long flags);
-	// returns a Form widget that has a new Shell parent.
 
 void GuiObject_destroy (GuiObject me);
 
diff --git a/sys/GuiButton.cpp b/sys/GuiButton.cpp
index 1e1b9c4..c806d49 100644
--- a/sys/GuiButton.cpp
+++ b/sys/GuiButton.cpp
@@ -1,6 +1,6 @@
 /* GuiButton.cpp
  *
- * Copyright (C) 1993-2012 Paul Boersma, 2007-2008 Stefan de Konink, 2010 Franz Brausse, 2013 Tom Naughton
+ * Copyright (C) 1993-2012,2015 Paul Boersma, 2007-2008 Stefan de Konink, 2010 Franz Brausse, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,18 +35,17 @@ Thing_implement (GuiButton, GuiControl, 0);
 	static void _GuiGtkButton_destroyCallback (GuiObject widget, gpointer void_me) {
 		(void) widget;
 		iam (GuiButton);
-		trace ("destroying GuiButton %p", me);
+		trace (U"destroying GuiButton ", Melder_pointer (me));
 		forget (me);
 	}
 	static void _GuiGtkButton_activateCallback (GuiObject widget, gpointer void_me) {
 		iam (GuiButton);
 		struct structGuiButtonEvent event = { me, 0 };
-		if (my d_activateCallback != NULL) {
+		if (my d_activateCallback) {
 			try {
 				my d_activateCallback (my d_activateBoss, & event);
 			} catch (MelderError) {
-				Melder_error_ ("Your click on button \"", GTK_WIDGET (widget) -> name, "\" was not completely handled.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Your click on button \"", Melder_peek8to32 (GTK_WIDGET (widget) -> name), U"\" was not completely handled.");
 			}
 		}
 	}
@@ -57,26 +56,25 @@ Thing_implement (GuiButton, GuiControl, 0);
 	- (void) dealloc {   // override
 		GuiButton me = d_userData;
 		forget (me);
-		trace ("deleting a button");
+		trace (U"deleting a button");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiButton));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiButton));
 		d_userData = static_cast <GuiButton> (userData);
 	}
 	- (void) _guiCocoaButton_activateCallback: (id) widget {
 		Melder_assert (self == widget);   // sender (widget) and receiver (self) happen to be the same object
 		GuiButton me = d_userData;
-		if (my d_activateCallback != NULL) {
+		if (my d_activateCallback) {
 			struct structGuiButtonEvent event = { me, 0 };
 			try {
 				my d_activateCallback (my d_activateBoss, & event);
 			} catch (MelderError) {
-				Melder_error_ ("Your click on button \"", "xx", "\" was not completely handled.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Your click on button \"", U"xx", U"\" was not completely handled.");
 			}
 		}
 	}
@@ -85,33 +83,31 @@ Thing_implement (GuiButton, GuiControl, 0);
 	void _GuiWinButton_destroy (GuiObject widget) {
 		iam_button;
 		if (widget == widget -> shell -> defaultButton)
-			widget -> shell -> defaultButton = NULL;   // remove dangling reference
+			widget -> shell -> defaultButton = nullptr;   // remove dangling reference
 		if (widget == widget -> shell -> cancelButton)
-			widget -> shell -> cancelButton = NULL;   // remove dangling reference
+			widget -> shell -> cancelButton = nullptr;   // remove dangling reference
 		_GuiNativeControl_destroy (widget);
 		forget (me);   // NOTE: my widget is not destroyed here
 	}
 	void _GuiWinButton_handleClick (GuiObject widget) {
 		iam_button;
-		if (my d_activateCallback != NULL) {
+		if (my d_activateCallback) {
 			struct structGuiButtonEvent event = { me, 0 };
 			try {
 				my d_activateCallback (my d_activateBoss, & event);
 			} catch (MelderError) {
-				Melder_error_ ("Your click on button \"", widget -> name, "\" was not completely handled.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Your click on button \"", widget -> name, U"\" was not completely handled.");
 			}
 		}
 	}
 	bool _GuiWinButton_tryToHandleShortcutKey (GuiObject widget) {
 		iam_button;
-		if (my d_activateCallback != NULL) {
+		if (my d_activateCallback) {
 			struct structGuiButtonEvent event = { me, 0 };
 			try {
 				my d_activateCallback (my d_activateBoss, & event);
 			} catch (MelderError) {
-				Melder_error_ ("Your click on button \"", widget -> name, "\" was not completely handled.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Your key click on button \"", widget -> name, U"\" was not completely handled.");
 			}
 			return true;
 		}
@@ -121,18 +117,18 @@ Thing_implement (GuiButton, GuiControl, 0);
 	void _GuiMacButton_destroy (GuiObject widget) {
 		iam_button;
 		if (widget == widget -> shell -> defaultButton)
-			widget -> shell -> defaultButton = NULL;   // remove dangling reference
+			widget -> shell -> defaultButton = nullptr;   // remove dangling reference
 		if (widget == widget -> shell -> cancelButton)
-			widget -> shell -> cancelButton = NULL;   // remove dangling reference
+			widget -> shell -> cancelButton = nullptr;   // remove dangling reference
 		_GuiNativeControl_destroy (widget);
 		forget (me);   // NOTE: my widget is not destroyed here
 	}
 	void _GuiMacButton_handleClick (GuiObject widget, EventRecord *macEvent) {
 		iam_button;
 		_GuiMac_clipOnParent (widget);
-		bool pushed = HandleControlClick (widget -> nat.control.handle, macEvent -> where, macEvent -> modifiers, NULL);
+		bool pushed = HandleControlClick (widget -> nat.control.handle, macEvent -> where, macEvent -> modifiers, nullptr);
 		GuiMac_clipOff ();
-		if (pushed && my d_activateCallback != NULL) {
+		if (pushed && my d_activateCallback) {
 			struct structGuiButtonEvent event = { me, 0 };
 			//enum { cmdKey = 256, shiftKey = 512, optionKey = 2048, controlKey = 4096 };
 			Melder_assert (macEvent -> what == mouseDown);
@@ -143,21 +139,19 @@ Thing_implement (GuiButton, GuiControl, 0);
 			try {
 				my d_activateCallback (my d_activateBoss, & event);
 			} catch (MelderError) {
-				Melder_error_ ("Your click on button \"", widget -> name, "\" was not completely handled.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Your click on button \"", widget -> name, U"\" was not completely handled.");
 			}
 		}
 	}
 	bool _GuiMacButton_tryToHandleShortcutKey (GuiObject widget, EventRecord *macEvent) {
 		iam_button;
-		if (my d_activateCallback != NULL) {
+		if (my d_activateCallback) {
 			struct structGuiButtonEvent event = { me, 0 };
 			// ignore modifier keys for Enter
 			try {
 				my d_activateCallback (my d_activateBoss, & event);
 			} catch (MelderError) {
-				Melder_error_ ("Your click on button \"", widget -> name, "\" was not completely handled.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Your key click on button \"", widget -> name, U"\" was not completely handled.");
 			}
 			return true;
 		}
@@ -166,7 +160,7 @@ Thing_implement (GuiButton, GuiControl, 0);
 #endif
 
 GuiButton GuiButton_create (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*activateCallback) (void *boss, GuiButtonEvent event), void *activateBoss, unsigned long flags)
+	const char32 *buttonText, void (*activateCallback) (void *boss, GuiButtonEvent event), void *activateBoss, uint32 flags)
 {
 	GuiButton me = Thing_new (GuiButton);
 	my d_shell = parent -> d_shell;
@@ -174,13 +168,13 @@ GuiButton GuiButton_create (GuiForm parent, int left, int right, int top, int bo
 	my d_activateCallback = activateCallback;
 	my d_activateBoss = activateBoss;
 	#if gtk
-		my d_widget = gtk_button_new_with_label (Melder_peekWcsToUtf8 (buttonText));
+		my d_widget = gtk_button_new_with_label (Melder_peek32to8 (buttonText));
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		if (flags & GuiButton_DEFAULT || flags & GuiButton_ATTRACTIVE) {
 			GTK_WIDGET_SET_FLAGS (my d_widget, GTK_CAN_DEFAULT);
 			GtkWidget *shell = gtk_widget_get_toplevel (GTK_WIDGET (my d_widget));
-			Melder_assert (shell != NULL);
+			Melder_assert (shell);
 			gtk_window_set_default (GTK_WINDOW (shell), GTK_WIDGET (my d_widget));
 		} else if (1) {
 			gtk_button_set_focus_on_click (GTK_BUTTON (my d_widget), false);
@@ -205,7 +199,7 @@ GuiButton GuiButton_create (GuiForm parent, int left, int right, int top, int bo
 			theButtonFont = [NSFont systemFontOfSize: 13.0];
 		}
 		[button setFont: theButtonFont];
-		[button setTitle: (NSString *) Melder_peekWcsToCfstring (buttonText)];
+		[button setTitle: (NSString *) Melder_peek32toCfstring (buttonText)];
 		[button setTarget: (id) my d_widget];
 		[button setAction: @selector (_guiCocoaButton_activateCallback:)];
 		//[button setAutoresizingMask: NSViewNotSizable];
@@ -224,14 +218,14 @@ GuiButton GuiButton_create (GuiForm parent, int left, int right, int top, int bo
 	#elif win
 		my d_widget = _Gui_initializeWidget (xmPushButtonWidgetClass, parent -> d_widget, buttonText);
 		_GuiObject_setUserData (my d_widget, me);
-		my d_widget -> window = CreateWindow (L"button", _GuiWin_expandAmpersands (my d_widget -> name),
+		my d_widget -> window = CreateWindow (L"button", Melder_peek32toW (_GuiWin_expandAmpersands (my d_widget -> name)),
 			WS_CHILD
 			| ( flags & (GuiButton_DEFAULT | GuiButton_ATTRACTIVE) ? BS_DEFPUSHBUTTON : BS_PUSHBUTTON )
 			| WS_CLIPSIBLINGS,
 			my d_widget -> x, my d_widget -> y, my d_widget -> width, my d_widget -> height,
-			my d_widget -> parent -> window, (HMENU) 1, theGui.instance, NULL);
+			my d_widget -> parent -> window, (HMENU) 1, theGui.instance, nullptr);
 		SetWindowLongPtr (my d_widget -> window, GWLP_USERDATA, (LONG_PTR) my d_widget);
-		SetWindowFont (my d_widget -> window, GetStockFont (ANSI_VAR_FONT), FALSE);
+		SetWindowFont (my d_widget -> window, GetStockFont (ANSI_VAR_FONT), false);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		if (flags & GuiButton_DEFAULT || flags & GuiButton_ATTRACTIVE) {
 			parent -> d_widget -> shell -> defaultButton = parent -> d_widget -> defaultButton = my d_widget;
@@ -242,8 +236,8 @@ GuiButton GuiButton_create (GuiForm parent, int left, int right, int top, int bo
 	#elif mac
 		my d_widget = _Gui_initializeWidget (xmPushButtonWidgetClass, parent -> d_widget, buttonText);
 		_GuiObject_setUserData (my d_widget, me);
-		CreatePushButtonControl (my d_widget -> macWindow, & my d_widget -> rect, NULL, & my d_widget -> nat.control.handle);
-		Melder_assert (my d_widget -> nat.control.handle != NULL);
+		CreatePushButtonControl (my d_widget -> macWindow, & my d_widget -> rect, nullptr, & my d_widget -> nat.control.handle);
+		Melder_assert (my d_widget -> nat.control.handle);
 		SetControlReference (my d_widget -> nat.control.handle, (long) my d_widget);
 		my d_widget -> isControl = true;
 		_GuiNativeControl_setFont (my d_widget, flags & GuiButton_ATTRACTIVE ? /*1*/0 : 0, 13);
@@ -259,28 +253,28 @@ GuiButton GuiButton_create (GuiForm parent, int left, int right, int top, int bo
 		}
 	#endif
 	if (flags & GuiButton_INSENSITIVE) {
-		my f_setSensitive (false);
+		GuiThing_setSensitive (me, false);
 	}
 	return me;
 }
 
 GuiButton GuiButton_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*clickedCallback) (void *boss, GuiButtonEvent event), void *clickedBoss, unsigned long flags)
+	const char32 *buttonText, void (*clickedCallback) (void *boss, GuiButtonEvent event), void *clickedBoss, uint32 flags)
 {
 	GuiButton me = GuiButton_create (parent, left, right, top, bottom, buttonText, clickedCallback, clickedBoss, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
-void structGuiButton :: f_setString (const wchar_t *text) {
+void GuiButton_setText (GuiButton me, const char32 *text /* cattable */) {
 	#if gtk
-		gtk_button_set_label (GTK_BUTTON (d_widget), Melder_peekWcsToUtf8 (text));
+		gtk_button_set_label (GTK_BUTTON (my d_widget), Melder_peek32to8 (text));
 	#elif cocoa
-		[(NSButton *) d_widget setTitle: (NSString *) Melder_peekWcsToCfstring (text)];
+		[(NSButton *) my d_widget setTitle: (NSString *) Melder_peek32toCfstring (text)];
 	#elif motif
-		Melder_free (d_widget -> name);
-		d_widget -> name = Melder_wcsdup_f (text);
-		_GuiNativeControl_setTitle (d_widget);
+		Melder_free (my d_widget -> name);
+		my d_widget -> name = Melder_dup_f (text);
+		_GuiNativeControl_setTitle (my d_widget);
 	#endif
 }
 
diff --git a/sys/GuiCheckButton.cpp b/sys/GuiCheckButton.cpp
index c62c28e..70ebd7c 100644
--- a/sys/GuiCheckButton.cpp
+++ b/sys/GuiCheckButton.cpp
@@ -1,6 +1,6 @@
 /* GuiCheckButton.cpp
  *
- * Copyright (C) 1993-2012,2013,2014 Paul Boersma, 2007-2008 Stefan de Konink, 2010 Franz Brausse, 2013 Tom Naughton
+ * Copyright (C) 1993-2012,2013,2014,2015 Paul Boersma, 2007-2008 Stefan de Konink, 2010 Franz Brausse, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -40,7 +40,7 @@ Thing_implement (GuiCheckButton, GuiControl, 0);
 	}
 	static void _GuiGtkCheckButton_valueChangedCallback (GuiObject widget, gpointer void_me) {
 		iam (GuiCheckButton);
-		if (my d_valueChangedCallback != NULL && ! my d_blockValueChangedCallbacks) {
+		if (my d_valueChangedCallback && ! my d_blockValueChangedCallbacks) {
 			struct structGuiCheckButtonEvent event = { me };
 			my d_valueChangedCallback (my d_valueChangedBoss, & event);
 		}
@@ -52,20 +52,20 @@ Thing_implement (GuiCheckButton, GuiControl, 0);
 	- (void) dealloc {   // override
 		GuiCheckButton me = d_userData;
 		forget (me);
-		trace ("deleting a check button");
+		trace (U"deleting a check button");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiCheckButton));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiCheckButton));
 		d_userData = static_cast <GuiCheckButton> (userData);
 	}
 	- (void) _guiCocoaButton_activateCallback: (id) widget {
 		Melder_assert (self == widget);   // sender (widget) and receiver (self) happen to be the same object
 		GuiCheckButton me = d_userData;
-		if (my d_valueChangedCallback != NULL) {
+		if (my d_valueChangedCallback) {
 			Melder_assert (! my d_blockValueChangedCallbacks);
 			struct structGuiCheckButtonEvent event = { me };
 			my d_valueChangedCallback (my d_valueChangedBoss, & event);
@@ -81,7 +81,7 @@ Thing_implement (GuiCheckButton, GuiControl, 0);
 	}
 	void _GuiWinCheckButton_handleClick (GuiObject widget) {
 		iam_checkbutton;
-		if (my d_valueChangedCallback != NULL) {
+		if (my d_valueChangedCallback) {
 			struct structGuiCheckButtonEvent event = { me };
 			my d_valueChangedCallback (my d_valueChangedBoss, & event);
 		}
@@ -95,10 +95,10 @@ Thing_implement (GuiCheckButton, GuiControl, 0);
 	void _GuiMacCheckButton_handleClick (GuiObject widget, EventRecord *macEvent) {
 		iam_checkbutton;
 		_GuiMac_clipOnParent (widget);
-		bool clicked = HandleControlClick (widget -> nat.control.handle, macEvent -> where, macEvent -> modifiers, NULL);
+		bool clicked = HandleControlClick (widget -> nat.control.handle, macEvent -> where, macEvent -> modifiers, nullptr);
 		GuiMac_clipOff ();
 		if (clicked) {
-			if (my d_valueChangedCallback != NULL) {
+			if (my d_valueChangedCallback) {
 				struct structGuiCheckButtonEvent event = { me };
 				my d_valueChangedCallback (my d_valueChangedBoss, & event);
 			}
@@ -107,7 +107,7 @@ Thing_implement (GuiCheckButton, GuiControl, 0);
 #endif
 
 GuiCheckButton GuiCheckButton_create (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*valueChangedCallback) (void *boss, GuiCheckButtonEvent event), void *valueChangedBoss, unsigned long flags)
+	const char32 *buttonText, void (*valueChangedCallback) (void *boss, GuiCheckButtonEvent event), void *valueChangedBoss, uint32 flags)
 {
 	GuiCheckButton me = Thing_new (GuiCheckButton);
 	my d_shell = parent -> d_shell;
@@ -115,12 +115,12 @@ GuiCheckButton GuiCheckButton_create (GuiForm parent, int left, int right, int t
 	my d_valueChangedCallback = valueChangedCallback;
 	my d_valueChangedBoss = valueChangedBoss;
 	#if gtk
-		my d_widget = gtk_check_button_new_with_label (Melder_peekWcsToUtf8 (buttonText));
+		my d_widget = gtk_check_button_new_with_label (Melder_peek32to8 (buttonText));
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (my d_widget), (flags & GuiCheckButton_SET) != 0);
 		if (flags & GuiCheckButton_INSENSITIVE) {
-			my f_setSensitive (false);
+			GuiThing_setSensitive (me, false);
 		}
 		g_signal_connect (G_OBJECT (my d_widget), "destroy", G_CALLBACK (_GuiGtkCheckButton_destroyCallback), me);
 		g_signal_connect (GTK_TOGGLE_BUTTON (my d_widget), "toggled", G_CALLBACK (_GuiGtkCheckButton_valueChangedCallback), me);
@@ -130,7 +130,7 @@ GuiCheckButton GuiCheckButton_create (GuiForm parent, int left, int right, int t
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		[checkButton setUserData: me];
 		[checkButton setButtonType: NSSwitchButton];
-		[checkButton setTitle: (NSString *) Melder_peekWcsToCfstring (buttonText)];
+		[checkButton setTitle: (NSString *) Melder_peek32toCfstring (buttonText)];
 		[checkButton setTarget: checkButton];
 		[checkButton setAction: @selector (_guiCocoaButton_activateCallback:)];
 		if (flags & GuiCheckButton_SET) {
@@ -140,72 +140,72 @@ GuiCheckButton GuiCheckButton_create (GuiForm parent, int left, int right, int t
 		my d_widget = _Gui_initializeWidget (xmToggleButtonWidgetClass, parent -> d_widget, buttonText);
 		_GuiObject_setUserData (my d_widget, me);
 		my d_widget -> isRadioButton = false;
-		my d_widget -> window = CreateWindow (L"button", _GuiWin_expandAmpersands (buttonText),
+		my d_widget -> window = CreateWindow (L"button", Melder_peek32toW (_GuiWin_expandAmpersands (buttonText)),
 			WS_CHILD | BS_AUTOCHECKBOX | WS_CLIPSIBLINGS,
 			my d_widget -> x, my d_widget -> y, my d_widget -> width, my d_widget -> height,
-			my d_widget -> parent -> window, (HMENU) 1, theGui.instance, NULL);
+			my d_widget -> parent -> window, (HMENU) 1, theGui.instance, nullptr);
 		SetWindowLongPtr (my d_widget -> window, GWLP_USERDATA, (LONG_PTR) my d_widget);
-		SetWindowFont (my d_widget -> window, GetStockFont (ANSI_VAR_FONT), FALSE);
+		SetWindowFont (my d_widget -> window, GetStockFont (ANSI_VAR_FONT), false);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		if (flags & GuiCheckButton_SET) {
 			Button_SetCheck (my d_widget -> window, BST_CHECKED);
 		}
 		if (flags & GuiCheckButton_INSENSITIVE) {
-			my f_setSensitive (false);
+			GuiThing_setSensitive (me, false);
 		}
 	#elif mac
 		my d_widget = _Gui_initializeWidget (xmToggleButtonWidgetClass, parent -> d_widget, buttonText);
 		_GuiObject_setUserData (my d_widget, me);
 		my d_widget -> isRadioButton = false;
-		CreateCheckBoxControl (my d_widget -> macWindow, & my d_widget -> rect, NULL,
+		CreateCheckBoxControl (my d_widget -> macWindow, & my d_widget -> rect, nullptr,
 			(flags & GuiCheckButton_SET) != 0, true, & my d_widget -> nat.control.handle);
-		Melder_assert (my d_widget -> nat.control.handle != NULL);
+		Melder_assert (my d_widget -> nat.control.handle != nullptr);
 		SetControlReference (my d_widget -> nat.control.handle, (long) my d_widget);
 		my d_widget -> isControl = true;
 		_GuiNativeControl_setFont (my d_widget, 0, 13);
 		_GuiNativeControl_setTitle (my d_widget);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		if (flags & GuiCheckButton_INSENSITIVE) {
-			my f_setSensitive (false);
+			GuiThing_setSensitive (me, false);
 		}
 	#endif
 	return me;
 }
 
 GuiCheckButton GuiCheckButton_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*valueChangedCallback) (void *boss, GuiCheckButtonEvent event), void *valueChangedBoss, unsigned long flags)
+	const char32 *buttonText, void (*valueChangedCallback) (void *boss, GuiCheckButtonEvent event), void *valueChangedBoss, uint32 flags)
 {
 	GuiCheckButton me = GuiCheckButton_create (parent, left, right, top, bottom, buttonText, valueChangedCallback, valueChangedBoss, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
-bool structGuiCheckButton :: f_getValue () {
+bool GuiCheckButton_getValue (GuiCheckButton me) {
 	bool value = false;
 	#if gtk
-		value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (d_widget));   // gtk_check_button inherits from gtk_toggle_button
+		value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (my d_widget));   // gtk_check_button inherits from gtk_toggle_button
 	#elif cocoa
-        GuiCocoaCheckButton *checkButton = (GuiCocoaCheckButton*)d_widget;
+        GuiCocoaCheckButton *checkButton = (GuiCocoaCheckButton *) my d_widget;
         value = [checkButton state] == NSOnState;
 	#elif win
-		value = (Button_GetState (d_widget -> window) & 0x0003) == BST_CHECKED;
+		value = (Button_GetState (my d_widget -> window) & 0x0003) == BST_CHECKED;
 	#elif mac
-		value = GetControlValue (d_widget -> nat.control.handle);
+		value = GetControlValue (my d_widget -> nat.control.handle);
 	#endif
 	return value;
 }
 
-void structGuiCheckButton :: f_setValue (bool value) {
-	GuiControlBlockValueChangedCallbacks block (this);
+void GuiCheckButton_setValue (GuiCheckButton me, bool value) {
+	GuiControlBlockValueChangedCallbacks block (me);
 	#if gtk
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (d_widget), value);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (my d_widget), value);
 	#elif cocoa
-		GuiCocoaCheckButton *checkButton = (GuiCocoaCheckButton *) d_widget;
+		GuiCocoaCheckButton *checkButton = (GuiCocoaCheckButton *) my d_widget;
 		[checkButton setState: value ? NSOnState: NSOffState];
 	#elif win
-		Button_SetCheck (d_widget -> window, value ? BST_CHECKED : BST_UNCHECKED);
+		Button_SetCheck (my d_widget -> window, value ? BST_CHECKED : BST_UNCHECKED);
 	#elif mac
-		SetControlValue (d_widget -> nat.control.handle, value);
+		SetControlValue (my d_widget -> nat.control.handle, value);
 	#endif
 }
 
diff --git a/sys/GuiControl.cpp b/sys/GuiControl.cpp
index 932d261..dda8515 100644
--- a/sys/GuiControl.cpp
+++ b/sys/GuiControl.cpp
@@ -1,6 +1,6 @@
 /* GuiControl.cpp
  *
- * Copyright (C) 1993-2012,2013 Paul Boersma, 2008 Stefan de Koninck, 2010 Franz Brausse, 2013 Tom Naughton
+ * Copyright (C) 1993-2012,2013,2015 Paul Boersma, 2008 Stefan de Koninck, 2010 Franz Brausse, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,67 +20,6 @@
 #include "GuiP.h"
 #include "machine.h"
 
-int structGuiControl :: f_getX () {
-	#if gtk
-		return GTK_WIDGET (d_widget) -> allocation.x;
-	#elif cocoa
-		return [(NSView *) d_widget frame]. origin. x;
-	#elif motif
-		return d_widget -> x;
-	#endif
-}
-
-int structGuiControl :: f_getY () {
-	#if gtk
-		return GTK_WIDGET (d_widget) -> allocation.y;
-	#elif cocoa
-		return [(NSView *) d_widget frame]. origin. y;
-	#elif motif
-		return d_widget -> y;
-	#endif
-}
-
-int structGuiControl :: f_getWidth () {
-	#if gtk
-		return GTK_WIDGET (d_widget) -> allocation.width;
-	#elif cocoa
-		return [(NSView *) d_widget frame]. size. width;
-	#elif motif
-		return d_widget -> width;
-	#endif
-}
-
-int structGuiControl :: f_getHeight () {
-	#if gtk
-		return GTK_WIDGET (d_widget) -> allocation.height;
-	#elif cocoa
-		return [(NSView *) d_widget frame]. size. height;
-	#elif motif
-		return d_widget -> height;
-	#endif
-}
-
-void structGuiControl :: f_move (int x, int y) {
-	#if gtk
-		GuiObject parent = gtk_widget_get_parent (GTK_WIDGET (d_widget));
-		if (GTK_IS_FIXED (parent)) {
-			gtk_fixed_move (GTK_FIXED (parent), GTK_WIDGET (d_widget), x, y);
-		}
-	#elif cocoa
-	#elif motif
-		XtVaSetValues (d_widget, XmNx, (Position) x, XmNy, (Position) y, NULL);   // 64-bit-compatible
-	#endif
-}
-
-void structGuiControl :: f_setSize (int width, int height) {
-	#if gtk
-		gtk_widget_set_size_request (GTK_WIDGET (d_widget), width, height);
-	#elif cocoa
-	#elif motif
-		XtVaSetValues (d_widget, XmNwidth, (Dimension) width, XmNheight, (Dimension) height, NULL);   // 64-bit-compatible
-	#endif
-}
-
 void structGuiControl :: v_positionInForm (GuiObject widget, int left, int right, int top, int bottom, GuiForm parent) {
 	#if gtk
 		/*
@@ -103,7 +42,7 @@ void structGuiControl :: v_positionInForm (GuiObject widget, int left, int right
 		if (right  <= 0) right  += parentWidth;
         if (top    <  0) top    += parentHeight;
 		if (bottom <= 0) bottom += parentHeight;
-		trace ("fixed: parent width %d height %d", parentWidth, parentHeight);
+		trace (U"fixed: parent width ", parentWidth, U" height ", parentHeight);
 		gtk_widget_set_size_request (GTK_WIDGET (widget), right - left, bottom - top);
 		gtk_fixed_put (GTK_FIXED (parent -> d_widget), GTK_WIDGET (widget), left, top);
 	#elif cocoa
@@ -159,25 +98,25 @@ void structGuiControl :: v_positionInForm (GuiObject widget, int left, int right
 		(void) parent;
 		if (left >= 0) {
 			if (right > 0) {
-				XtVaSetValues (widget, XmNx, left, XmNwidth, right - left, NULL);
+				XtVaSetValues (widget, XmNx, left, XmNwidth, right - left, nullptr);
 			} else {
-				XtVaSetValues (widget, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, left, XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, - right, NULL);
+				XtVaSetValues (widget, XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, left, XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, - right, nullptr);
 			}
 		} else {
 			Melder_assert (right <= 0);
-			trace ("parent width %d", parent -> d_widget -> width);
-			XtVaSetValues (widget, XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, - right, XmNwidth, right - left, NULL);
-			trace ("parent width %d", parent -> d_widget -> width);
+			trace (U"parent width ", parent -> d_widget -> width);
+			XtVaSetValues (widget, XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, - right, XmNwidth, right - left, nullptr);
+			trace (U"parent width ", parent -> d_widget -> width);
 		}
 		if (top >= 0) {
 			if (bottom > 0) {
-				XtVaSetValues (widget, XmNy, top, XmNheight, bottom - top, NULL);
+				XtVaSetValues (widget, XmNy, top, XmNheight, bottom - top, nullptr);
 			} else {
-				XtVaSetValues (widget, XmNtopAttachment, XmATTACH_FORM, XmNtopOffset, top, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, - bottom, NULL);
+				XtVaSetValues (widget, XmNtopAttachment, XmATTACH_FORM, XmNtopOffset, top, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, - bottom, nullptr);
 			}
 		} else {
 			Melder_assert (bottom <= 0);
-			XtVaSetValues (widget, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, - bottom, XmNheight, bottom - top, NULL);
+			XtVaSetValues (widget, XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, - bottom, XmNheight, bottom - top, nullptr);
 		}
 	#endif
 }
@@ -198,7 +137,68 @@ void structGuiControl :: v_positionInScrolledWindow (GuiObject widget, int width
 		[widgetView release];   // ... so we can release the item already
 	#elif motif
 		(void) parent;
-		XtVaSetValues (widget, XmNwidth, width, XmNheight, height, NULL);
+		XtVaSetValues (widget, XmNwidth, width, XmNheight, height, nullptr);
+	#endif
+}
+
+int GuiControl_getX (GuiControl me) {
+	#if gtk
+		return GTK_WIDGET (my d_widget) -> allocation.x;
+	#elif cocoa
+		return [(NSView *) my d_widget frame]. origin. x;
+	#elif motif
+		return my d_widget -> x;
+	#endif
+}
+
+int GuiControl_getY (GuiControl me) {
+	#if gtk
+		return GTK_WIDGET (my d_widget) -> allocation.y;
+	#elif cocoa
+		return [(NSView *) my d_widget frame]. origin. y;
+	#elif motif
+		return my d_widget -> y;
+	#endif
+}
+
+int GuiControl_getWidth (GuiControl me) {
+	#if gtk
+		return GTK_WIDGET (my d_widget) -> allocation.width;
+	#elif cocoa
+		return [(NSView *) my d_widget frame]. size. width;
+	#elif motif
+		return my d_widget -> width;
+	#endif
+}
+
+int GuiControl_getHeight (GuiControl me) {
+	#if gtk
+		return GTK_WIDGET (my d_widget) -> allocation.height;
+	#elif cocoa
+		return [(NSView *) my d_widget frame]. size. height;
+	#elif motif
+		return my d_widget -> height;
+	#endif
+}
+
+void GuiControl_move (GuiControl me, int x, int y) {
+	#if gtk
+		GuiObject parent = gtk_widget_get_parent (GTK_WIDGET (my d_widget));
+		if (GTK_IS_FIXED (parent)) {
+			gtk_fixed_move (GTK_FIXED (parent), GTK_WIDGET (my d_widget), x, y);
+		}
+	#elif cocoa
+	#elif motif
+		XtVaSetValues (my d_widget, XmNx, (Position) x, XmNy, (Position) y, nullptr);   // 64-bit-compatible
+	#endif
+}
+
+void GuiControl_setSize (GuiControl me, int width, int height) {
+	#if gtk
+		gtk_widget_set_size_request (GTK_WIDGET (my d_widget), width, height);
+	#elif cocoa
+	#elif motif
+		XtVaSetValues (my d_widget, XmNwidth, (Dimension) width, XmNheight, (Dimension) height, nullptr);   // 64-bit-compatible
 	#endif
 }
 
diff --git a/sys/GuiDialog.cpp b/sys/GuiDialog.cpp
index d89c632..f388944 100644
--- a/sys/GuiDialog.cpp
+++ b/sys/GuiDialog.cpp
@@ -1,6 +1,6 @@
 /* GuiDialog.cpp
  *
- * Copyright (C) 1993-2012,2013 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1993-2012,2013,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,10 +39,10 @@ Thing_implement (GuiDialog, GuiShell, 0);
 		(void) widget;
 		(void) event;
 		iam (GuiDialog);
-		if (my d_goAwayCallback != NULL) {
+		if (my d_goAwayCallback) {
 			my d_goAwayCallback (my d_goAwayBoss);
 		}
-		return TRUE;   // signal handled (don't destroy dialog)
+		return true;   // signal handled (don't destroy dialog)
 	}
 #elif cocoa
 	@interface GuiCocoaDialog : NSWindow
@@ -53,7 +53,7 @@ Thing_implement (GuiDialog, GuiShell, 0);
 	- (void) dealloc {   // override
 		GuiDialog me = d_userData;
 		forget (me);
-		trace ("deleting a dialog");
+		trace (U"deleting a dialog");
 		[super dealloc];
 	}
 	- (GuiDialog) userData {
@@ -65,14 +65,14 @@ Thing_implement (GuiDialog, GuiShell, 0);
 	- (BOOL) windowShouldClose: (id) sender {
 		GuiCocoaDialog *widget = (GuiCocoaDialog *) sender;
 		GuiDialog me = [widget userData];
-		if (my d_goAwayCallback != NULL) {
-			trace ("calling goAwayCallback)");
+		if (my d_goAwayCallback) {
+			trace (U"calling goAwayCallback)");
 			my d_goAwayCallback (my d_goAwayBoss);
 		} else {
-			trace ("hiding window");
+			trace (U"hiding window");
 			[widget orderOut: nil];
 		}
-		return FALSE;
+		return false;
 	}
 	@end
 #elif motif
@@ -84,14 +84,14 @@ Thing_implement (GuiDialog, GuiShell, 0);
 	static void _GuiMotifDialog_goAwayCallback (GuiObject widget, XtPointer void_me, XtPointer call) {
 		(void) widget; (void) call;
 		iam (GuiDialog);
-		if (my d_goAwayCallback != NULL) {
+		if (my d_goAwayCallback) {
 			my d_goAwayCallback (my d_goAwayBoss);
 		}
 	}
 #endif
 
 GuiDialog GuiDialog_create (GuiWindow parent, int x, int y, int width, int height,
-	const wchar_t *title, void (*goAwayCallback) (void *goAwayBoss), void *goAwayBoss, unsigned long flags)
+	const char32 *title, void (*goAwayCallback) (void *goAwayBoss), void *goAwayBoss, uint32 flags)
 {
 	GuiDialog me = Thing_new (GuiDialog);
 	my d_parent = parent;
@@ -104,14 +104,14 @@ GuiDialog GuiDialog_create (GuiWindow parent, int x, int y, int width, int heigh
 			GuiObject toplevel = gtk_widget_get_ancestor (GTK_WIDGET (parent -> d_widget), GTK_TYPE_WINDOW);
 			if (toplevel) {
 				gtk_window_set_transient_for (GTK_WINDOW (my d_gtkWindow), GTK_WINDOW (toplevel));
-				gtk_window_set_destroy_with_parent (GTK_WINDOW (my d_gtkWindow), TRUE);
+				gtk_window_set_destroy_with_parent (GTK_WINDOW (my d_gtkWindow), true);
 			}
 		}
 		g_signal_connect (G_OBJECT (my d_gtkWindow), "delete-event",
 			goAwayCallback ? G_CALLBACK (_GuiGtkDialog_goAwayCallback) : G_CALLBACK (gtk_widget_hide_on_delete), me);
 		gtk_window_set_default_size (GTK_WINDOW (my d_gtkWindow), width, height);
 		gtk_window_set_modal (GTK_WINDOW (my d_gtkWindow), flags & GuiDialog_MODAL);
-		my f_setTitle (title);
+		GuiShell_setTitle (me, title);
 		GuiObject vbox = GTK_DIALOG (my d_gtkWindow) -> vbox;
 		my d_widget = gtk_fixed_new ();
 		_GuiObject_setUserData (my d_widget, me);
@@ -128,25 +128,25 @@ GuiDialog GuiDialog_create (GuiWindow parent, int x, int y, int width, int heigh
 			backing: NSBackingStoreBuffered
 			defer: false];
         [nsWindow setMinSize: NSMakeSize (500.0, 500.0)];   // BUG: should not be needed
-		[nsWindow setTitle: (NSString *) Melder_peekWcsToCfstring (title)];
+		[nsWindow setTitle: (NSString *) Melder_peek32toCfstring (title)];
 		//[nsWindow makeKeyAndOrderFront: nil];
 		my d_widget = (GuiObject) [nsWindow contentView];
 		[(GuiCocoaDialog *) nsWindow setUserData: me];
 		[nsWindow setReleasedWhenClosed: NO];
 	#elif motif
-		my d_xmShell = XmCreateDialogShell (mac ? NULL : parent -> d_widget, "dialogShell", NULL, 0);
-		XtVaSetValues (my d_xmShell, XmNdeleteResponse, goAwayCallback ? XmDO_NOTHING : XmUNMAP, XmNx, x, XmNy, y, NULL);
+		my d_xmShell = XmCreateDialogShell (mac ? nullptr : parent -> d_widget, "dialogShell", nullptr, 0);
+		XtVaSetValues (my d_xmShell, XmNdeleteResponse, goAwayCallback ? XmDO_NOTHING : XmUNMAP, XmNx, x, XmNy, y, nullptr);
 		if (goAwayCallback) {
 			XmAddWMProtocolCallback (my d_xmShell, 'delw', _GuiMotifDialog_goAwayCallback, (char *) me);
 		}
-		my f_setTitle (title);
-		my d_widget = XmCreateForm (my d_xmShell, "dialog", NULL, 0);
-		XtVaSetValues (my d_widget, XmNwidth, (Dimension) width, XmNheight, (Dimension) height, NULL);
+		GuiShell_setTitle (me, title);
+		my d_widget = XmCreateForm (my d_xmShell, "dialog", nullptr, 0);
+		XtVaSetValues (my d_widget, XmNwidth, (Dimension) width, XmNheight, (Dimension) height, nullptr);
 		_GuiObject_setUserData (my d_widget, me);
 		XtAddCallback (my d_widget, XmNdestroyCallback, _GuiMotifDialog_destroyCallback, me);
 		XtVaSetValues (my d_widget, XmNdialogStyle,
 			(flags & GuiDialog_MODAL) ? XmDIALOG_FULL_APPLICATION_MODAL : XmDIALOG_MODELESS,
-			XmNautoUnmanage, False, NULL);
+			XmNautoUnmanage, False, nullptr);
 	#endif
 	my d_shell = me;
 	return me;
diff --git a/sys/GuiDrawingArea.cpp b/sys/GuiDrawingArea.cpp
index 1813a0c..45489f6 100644
--- a/sys/GuiDrawingArea.cpp
+++ b/sys/GuiDrawingArea.cpp
@@ -1,6 +1,6 @@
 /* GuiDrawingArea.cpp
  *
- * Copyright (C) 1993-2012,2013 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brausse, 2013 Tom Naughton
+ * Copyright (C) 1993-2012,2013,2015 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brausse, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -43,7 +43,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 		forget (me);
 	}
 	static gboolean _GuiGtkDrawingArea_exposeCallback (GuiObject widget, GdkEventExpose *expose, gpointer void_me) {
-		trace ("begin");
+		trace (U"begin");
 		iam (GuiDrawingArea);
 		Melder_assert (me);
 		// TODO: that helps against the damaged regions outside the rect where the
@@ -59,26 +59,26 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				//GdkRectangle rect = { event. x, event. y, event. width, event. height };
 				//gdk_window_begin_paint_rect ((GTK_WIDGET (widget)) -> window, & rect);
-				trace ("send the expose callback");
-				trace ("locale is %s", setlocale (LC_ALL, NULL));
+				trace (U"send the expose callback");
+				trace (U"locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 				my d_exposeCallback (my d_exposeBoss, & event);
-				trace ("the expose callback finished");
-				trace ("locale is %s", setlocale (LC_ALL, NULL));
+				trace (U"the expose callback finished");
+				trace (U"locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 				//gdk_window_end_paint ((GTK_WIDGET (widget)) -> window);
 				//gdk_window_flush ((GTK_WIDGET (widget)) -> window);
 				//gdk_flush ();
 			} catch (MelderError) {
-				Melder_flushError ("Redrawing not completed");
+				Melder_flushError (U"Redrawing not completed");
 			}
-			trace ("the expose callback handled drawing");
-			return TRUE;
+			trace (U"the expose callback handled drawing");
+			return true;
 		}
-		trace ("GTK will handle redrawing");
-		return FALSE;
+		trace (U"GTK will handle redrawing");
+		return false;
 	}
 	static gboolean _GuiGtkDrawingArea_clickCallback (GuiObject widget, GdkEvent *e, gpointer void_me) {
 		iam (GuiDrawingArea);
-		if (e -> type != GDK_BUTTON_PRESS) return FALSE;
+		if (e -> type != GDK_BUTTON_PRESS) return false;
 		if (my d_clickCallback) {
 			struct structGuiDrawingAreaClickEvent event = { me, 0 };
 			event. button = ((GdkEventButton *) e) -> button;
@@ -88,15 +88,15 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_clickCallback (my d_clickBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Mouse click not completely handled.");
+				Melder_flushError (U"Mouse click not completely handled.");
 			}
-			return TRUE;
+			return true;
 		}
-		return FALSE;
+		return false;
 	}
 	static gboolean _GuiGtkDrawingArea_keyCallback (GuiObject widget, GdkEvent *gevent, gpointer void_me) {
 		iam (GuiDrawingArea);
-		trace ("begin");
+		trace (U"begin");
 		if (my d_keyCallback && gevent -> type == GDK_KEY_PRESS) {
 			struct structGuiDrawingAreaKeyEvent event = { me, 0 };
 			GdkEventKey *gkeyEvent = (GdkEventKey *) gevent;
@@ -116,31 +116,31 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_keyCallback (my d_keyBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Key press not completely handled.");
+				Melder_flushError (U"Key press not completely handled.");
 			}
 			/*
 			 * FIXME: here we should empty the type-ahead buffer
 			 */
-			return TRUE;
+			return true;
 		}
-		return FALSE;   // if the drawing area has no keyCallback, the system will send the key press to a text field.
+		return false;   // if the drawing area has no keyCallback, the system will send the key press to a text field.
 	}
 	static gboolean _GuiGtkDrawingArea_resizeCallback (GuiObject widget, GtkAllocation *allocation, gpointer void_me) {
 		iam (GuiDrawingArea);
 		if (my d_resizeCallback) {
 			struct structGuiDrawingAreaResizeEvent event = { me, 0 };
-			trace ("drawingArea resized to %d x %d.", (int) allocation -> width, (int) allocation -> height);
+			trace (U"drawingArea resized to ", allocation -> width, U" x ", allocation -> height, U".");
 			event. width = allocation -> width;
 			event. height = allocation -> height;
 			//g_debug("%d %d", allocation->width, allocation->height);
 			try {
 				my d_resizeCallback (my d_resizeBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Window resizing not completely handled.");
+				Melder_flushError (U"Window resizing not completely handled.");
 			}
-			return TRUE;
+			return true;
 		}
-		return FALSE;
+		return false;
 	}
 #elif cocoa
 	@interface GuiCocoaDrawingArea ()
@@ -167,7 +167,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 		GuiDrawingArea me = d_userData;
 		forget (me);
 		[self removeTrackingArea: _trackingArea];
-		trace ("deleting a drawing area");
+		trace (U"deleting a drawing area");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
@@ -185,12 +185,12 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_resizeCallback (my d_resizeBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Window resizing not completely handled.");
+				Melder_flushError (U"Window resizing not completely handled.");
 			}
 		}
 	}
 	- (void) drawRect: (NSRect) dirtyRect {
-		trace ("dirtyRect: %f, %f, %f, %f", dirtyRect.origin.x, dirtyRect.origin.y, dirtyRect.size.width, dirtyRect.size.height);
+		trace (U"dirtyRect: ", dirtyRect.origin.x, U", ", dirtyRect.origin.y, U", ", dirtyRect.size.width, U", ", dirtyRect.size.height);
 		GuiDrawingArea me = (GuiDrawingArea) d_userData;
 		if (! _inited) {
 			// Last chance to do this. Is there a better place?
@@ -202,7 +202,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_exposeCallback (my d_exposeBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Redrawing not completed");
+				Melder_flushError (U"Redrawing not completed");
 			}
 		}
 	}
@@ -223,7 +223,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 		 * the key focus from the Search field, a situation that cannot hurt).
 		 */
 		GuiDrawingArea me = (GuiDrawingArea) d_userData;
-		return my d_keyCallback != NULL;
+		return my d_keyCallback != nullptr;
 	}
 	- (void) mouseEntered: (NSEvent *) nsEvent {
 		(void) nsEvent;
@@ -249,7 +249,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_clickCallback (my d_clickBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Mouse click not completely handled.");
+				Melder_flushError (U"Mouse click not completely handled.");
 			}
 		}
 	}
@@ -295,7 +295,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			if (event. key == NSRightArrowFunctionKey) event. key = 0x2192;
 			if (event. key == NSUpArrowFunctionKey)    event. key = 0x2191;
 			if (event. key == NSDownArrowFunctionKey)  event. key = 0x2193;
-			trace ("key %d", (int) event. key);
+			trace (U"key ", event. key);
 			NSUInteger modifiers = [nsEvent modifierFlags];
 			event. shiftKeyPressed = modifiers & NSShiftKeyMask;
 			event. optionKeyPressed = modifiers & NSAlternateKeyMask;
@@ -303,7 +303,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_keyCallback (my d_keyBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Key press not completely handled.");
+				Melder_flushError (U"Key press not completely handled.");
 			}
 		}
 	}
@@ -323,7 +323,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_exposeCallback (my d_exposeBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Redrawing not completed");
+				Melder_flushError (U"Redrawing not completed");
 			}
 		}
 		EndPaint (widget -> window, & paintStruct);
@@ -340,7 +340,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_clickCallback (my d_clickBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Mouse click not completely handled.");
+				Melder_flushError (U"Mouse click not completely handled.");
 			}
 		}
 	}
@@ -360,7 +360,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_keyCallback (my d_keyBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Key press not completely handled.");
+				Melder_flushError (U"Key press not completely handled.");
 			}
 		}
 	}
@@ -373,7 +373,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_resizeCallback (my d_resizeBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Window resizing not completely handled.");
+				Melder_flushError (U"Window resizing not completely handled.");
 			}
 		}
 	}
@@ -390,7 +390,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_exposeCallback (my d_exposeBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Redrawing not completed");
+				Melder_flushError (U"Redrawing not completed");
 			}
 			GuiMac_clipOff ();
 		}
@@ -408,7 +408,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_clickCallback (my d_clickBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Mouse click not completely handled.");
+				Melder_flushError (U"Mouse click not completely handled.");
 			}
 		}
 	}
@@ -431,7 +431,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_keyCallback (my d_keyBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Key press not completely handled.");
+				Melder_flushError (U"Key press not completely handled.");
 			}
 			return true;
 		}
@@ -446,7 +446,7 @@ Thing_implement (GuiDrawingArea, GuiControl, 0);
 			try {
 				my d_resizeCallback (my d_resizeBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Window resizing not completely handled.");
+				Melder_flushError (U"Window resizing not completely handled.");
 			}
 		}
 	}
@@ -459,7 +459,7 @@ static gboolean _guiGtkDrawingArea_swipeCallback (GuiObject w, GdkEventScroll *e
 		double hv = gtk_range_get_value (GTK_RANGE (my d_horizontalScrollBar -> d_widget));
 		GtkAdjustment *adjustment = gtk_range_get_adjustment (GTK_RANGE (my d_horizontalScrollBar -> d_widget));
 		gdouble hi;
-		g_object_get (adjustment, "step_increment", & hi, NULL);
+		g_object_get (adjustment, "step_increment", & hi, nullptr);
 		switch (event -> direction) {
 			case GDK_SCROLL_LEFT:
 				gtk_range_set_value (GTK_RANGE (my d_horizontalScrollBar -> d_widget), hv - hi);
@@ -473,7 +473,7 @@ static gboolean _guiGtkDrawingArea_swipeCallback (GuiObject w, GdkEventScroll *e
 		double vv = gtk_range_get_value (GTK_RANGE (my d_verticalScrollBar -> d_widget));
 		GtkAdjustment *adjustment = gtk_range_get_adjustment (GTK_RANGE (my d_verticalScrollBar -> d_widget));
 		gdouble vi;
-		g_object_get (adjustment, "step_increment", & vi, NULL);
+		g_object_get (adjustment, "step_increment", & vi, nullptr);
 		switch (event -> direction) {
 			case GDK_SCROLL_UP:
 				gtk_range_set_value (GTK_RANGE (my d_verticalScrollBar -> d_widget), vv - vi);
@@ -483,24 +483,16 @@ static gboolean _guiGtkDrawingArea_swipeCallback (GuiObject w, GdkEventScroll *e
 				break;
 		}
 	}
-	return TRUE;
+	return true;
 }
 #endif
 
-void structGuiDrawingArea :: f_setSwipable (GuiScrollBar horizontalScrollBar, GuiScrollBar verticalScrollBar) {
-	d_horizontalScrollBar = horizontalScrollBar;
-	d_verticalScrollBar = verticalScrollBar;
-	#if gtk
-		g_signal_connect (G_OBJECT (d_widget), "scroll-event", G_CALLBACK (_guiGtkDrawingArea_swipeCallback), this);
-	#endif
-}
-
 GuiDrawingArea GuiDrawingArea_create (GuiForm parent, int left, int right, int top, int bottom,
 	void (*exposeCallback) (void *boss, GuiDrawingAreaExposeEvent event),
 	void (*clickCallback)  (void *boss, GuiDrawingAreaClickEvent  event),
 	void (*keyCallback)    (void *boss, GuiDrawingAreaKeyEvent    event),
 	void (*resizeCallback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss,
-	unsigned long flags)
+	uint32 /* flags */)
 {
 	GuiDrawingArea me = Thing_new (GuiDrawingArea);
 	my d_shell = parent -> d_shell;
@@ -526,7 +518,7 @@ GuiDrawingArea GuiDrawingArea_create (GuiForm parent, int left, int right, int t
 		g_signal_connect (G_OBJECT (my d_widget), "button-press-event",   G_CALLBACK (_GuiGtkDrawingArea_clickCallback),   me);
 		g_signal_connect (G_OBJECT (my d_widget), "button-release-event", G_CALLBACK (_GuiGtkDrawingArea_clickCallback),   me);
 		g_signal_connect (G_OBJECT (my d_widget), "motion-notify-event",  G_CALLBACK (_GuiGtkDrawingArea_clickCallback),   me);
-		if (parent != NULL) {
+		if (parent) {
 			Melder_assert (parent -> d_widget);
 			g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (GTK_WIDGET (parent -> d_widget))), "key-press-event",
 				G_CALLBACK (_GuiGtkDrawingArea_keyCallback), me);
@@ -535,7 +527,7 @@ GuiDrawingArea GuiDrawingArea_create (GuiForm parent, int left, int right, int t
 
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
-		gtk_widget_set_double_buffered (GTK_WIDGET (my d_widget), FALSE);
+		gtk_widget_set_double_buffered (GTK_WIDGET (my d_widget), false);
 	#elif cocoa
 		GuiCocoaDrawingArea *drawingArea = [[GuiCocoaDrawingArea alloc] init];
 		my d_widget = (GuiObject) drawingArea;
@@ -545,15 +537,15 @@ GuiDrawingArea GuiDrawingArea_create (GuiForm parent, int left, int right, int t
 			[[drawingArea window]   makeFirstResponder: drawingArea];   // needed in DemoWindow
 		}
     #elif win
-		my d_widget = _Gui_initializeWidget (xmDrawingAreaWidgetClass, parent -> d_widget, L"drawingArea");
+		my d_widget = _Gui_initializeWidget (xmDrawingAreaWidgetClass, parent -> d_widget, U"drawingArea");
 		_GuiObject_setUserData (my d_widget, me);
-		my d_widget -> window = CreateWindowEx (0, _GuiWin_getDrawingAreaClassName (), L"drawingArea",
+		my d_widget -> window = CreateWindowEx (0, Melder_peek32toW (_GuiWin_getDrawingAreaClassName ()), L"drawingArea",
 			WS_CHILD | WS_BORDER | WS_CLIPSIBLINGS,
-			my d_widget -> x, my d_widget -> y, my d_widget -> width, my d_widget -> height, my d_widget -> parent -> window, NULL, theGui.instance, NULL);
+			my d_widget -> x, my d_widget -> y, my d_widget -> width, my d_widget -> height, my d_widget -> parent -> window, nullptr, theGui.instance, nullptr);
 		SetWindowLongPtr (my d_widget -> window, GWLP_USERDATA, (LONG_PTR) my d_widget);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 	#elif mac
-		my d_widget = _Gui_initializeWidget (xmDrawingAreaWidgetClass, parent -> d_widget, L"drawingArea");
+		my d_widget = _Gui_initializeWidget (xmDrawingAreaWidgetClass, parent -> d_widget, U"drawingArea");
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 	#endif
@@ -565,10 +557,10 @@ GuiDrawingArea GuiDrawingArea_createShown (GuiForm parent, int left, int right,
 	void (*clickCallback) (void *boss, GuiDrawingAreaClickEvent event),
 	void (*keyCallback) (void *boss, GuiDrawingAreaKeyEvent event),
 	void (*resizeCallback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss,
-	unsigned long flags)
+	uint32 flags)
 {
 	GuiDrawingArea me = GuiDrawingArea_create (parent, left, right, top, bottom, exposeCallback, clickCallback, keyCallback, resizeCallback, boss, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
@@ -577,7 +569,7 @@ GuiDrawingArea GuiDrawingArea_create (GuiScrolledWindow parent, int width, int h
 	void (*clickCallback) (void *boss, GuiDrawingAreaClickEvent event),
 	void (*keyCallback) (void *boss, GuiDrawingAreaKeyEvent event),
 	void (*resizeCallback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss,
-	unsigned long flags)
+	uint32 /* flags */)
 {
 	GuiDrawingArea me = Thing_new (GuiDrawingArea);
 	my d_shell = parent -> d_shell;
@@ -603,29 +595,29 @@ GuiDrawingArea GuiDrawingArea_create (GuiScrolledWindow parent, int width, int h
 		g_signal_connect (G_OBJECT (my d_widget), "button-press-event",   G_CALLBACK (_GuiGtkDrawingArea_clickCallback),   me);
 		g_signal_connect (G_OBJECT (my d_widget), "button-release-event", G_CALLBACK (_GuiGtkDrawingArea_clickCallback),   me);
 		g_signal_connect (G_OBJECT (my d_widget), "motion-notify-event",  G_CALLBACK (_GuiGtkDrawingArea_clickCallback),   me);
-		if (parent != NULL) {
+		if (parent) {
 			g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (GTK_WIDGET (parent -> d_widget))), "key-press-event",
 				G_CALLBACK (_GuiGtkDrawingArea_keyCallback), me);
 		}
 		g_signal_connect (G_OBJECT (my d_widget), "size-allocate", G_CALLBACK (_GuiGtkDrawingArea_resizeCallback), me);
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInScrolledWindow (my d_widget, width, height, parent);
-		gtk_widget_set_double_buffered (GTK_WIDGET (my d_widget), FALSE);
+		gtk_widget_set_double_buffered (GTK_WIDGET (my d_widget), false);
 	#elif cocoa
 		GuiCocoaDrawingArea *drawingArea = [[GuiCocoaDrawingArea alloc] init];
 		my d_widget = (GuiObject) drawingArea;
 		my v_positionInScrolledWindow (my d_widget, width, height, parent);
 		[drawingArea setUserData: me];
     #elif win
-		my d_widget = _Gui_initializeWidget (xmDrawingAreaWidgetClass, parent -> d_widget, L"drawingArea");
+		my d_widget = _Gui_initializeWidget (xmDrawingAreaWidgetClass, parent -> d_widget, U"drawingArea");
 		_GuiObject_setUserData (my d_widget, me);
-		my d_widget -> window = CreateWindowEx (0, _GuiWin_getDrawingAreaClassName (), L"drawingArea",
+		my d_widget -> window = CreateWindowEx (0, Melder_peek32toW (_GuiWin_getDrawingAreaClassName ()), L"drawingArea",
 			WS_CHILD | WS_BORDER | WS_CLIPSIBLINGS,
-			0, 0, my d_widget -> width, my d_widget -> height, my d_widget -> parent -> window, NULL, theGui.instance, NULL);
+			0, 0, my d_widget -> width, my d_widget -> height, my d_widget -> parent -> window, nullptr, theGui.instance, nullptr);
 		SetWindowLongPtr (my d_widget -> window, GWLP_USERDATA, (LONG_PTR) my d_widget);
 		my v_positionInScrolledWindow (my d_widget, width, height, parent);
 	#elif mac
-		my d_widget = _Gui_initializeWidget (xmDrawingAreaWidgetClass, parent -> d_widget, L"drawingArea");
+		my d_widget = _Gui_initializeWidget (xmDrawingAreaWidgetClass, parent -> d_widget, U"drawingArea");
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInScrolledWindow (my d_widget, width, height, parent);
 	#endif
@@ -637,26 +629,34 @@ GuiDrawingArea GuiDrawingArea_createShown (GuiScrolledWindow parent, int width,
 	void (*clickCallback) (void *boss, GuiDrawingAreaClickEvent event),
 	void (*keyCallback) (void *boss, GuiDrawingAreaKeyEvent event),
 	void (*resizeCallback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss,
-	unsigned long flags)
+	uint32 flags)
 {
 	GuiDrawingArea me = GuiDrawingArea_create (parent, width, height, exposeCallback, clickCallback, keyCallback, resizeCallback, boss, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
-void structGuiDrawingArea :: f_setExposeCallback (void (*callback) (void *boss, GuiDrawingAreaExposeEvent event), void *boss) {
-	d_exposeCallback = callback;
-	d_exposeBoss = boss;
+void GuiDrawingArea_setSwipable (GuiDrawingArea me, GuiScrollBar horizontalScrollBar, GuiScrollBar verticalScrollBar) {
+	my d_horizontalScrollBar = horizontalScrollBar;
+	my d_verticalScrollBar = verticalScrollBar;
+	#if gtk
+		g_signal_connect (G_OBJECT (my d_widget), "scroll-event", G_CALLBACK (_guiGtkDrawingArea_swipeCallback), me);
+	#endif
 }
 
-void structGuiDrawingArea :: f_setClickCallback (void (*callback) (void *boss, GuiDrawingAreaClickEvent event), void *boss) {
-	d_clickCallback = callback;
-	d_clickBoss = boss;
+void GuiDrawingArea_setExposeCallback (GuiDrawingArea me, void (*callback) (void *boss, GuiDrawingAreaExposeEvent event), void *boss) {
+	my d_exposeCallback = callback;
+	my d_exposeBoss = boss;
 }
 
-void structGuiDrawingArea :: f_setResizeCallback (void (*callback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss) {
-	d_resizeCallback = callback;
-	d_resizeBoss = boss;
+void GuiDrawingArea_setClickCallback (GuiDrawingArea me, void (*callback) (void *boss, GuiDrawingAreaClickEvent event), void *boss) {
+	my d_clickCallback = callback;
+	my d_clickBoss = boss;
+}
+
+void GuiDrawingArea_setResizeCallback (GuiDrawingArea me, void (*callback) (void *boss, GuiDrawingAreaResizeEvent event), void *boss) {
+	my d_resizeCallback = callback;
+	my d_resizeBoss = boss;
 }
 
 /* End of file GuiDrawingArea.cpp */
diff --git a/sys/GuiFileSelect.cpp b/sys/GuiFileSelect.cpp
index b890aff..1846751 100644
--- a/sys/GuiFileSelect.cpp
+++ b/sys/GuiFileSelect.cpp
@@ -1,6 +1,6 @@
 /* GuiFileSelect.cpp
  *
- * Copyright (C) 2010-2012,2013,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 2010-2012,2013,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,30 +23,30 @@
 	#include <Shlobj.h>
 #endif
 
-SortedSetOfString GuiFileSelect_getInfileNames (GuiWindow parent, const wchar_t *title, bool allowMultipleFiles) {
+SortedSetOfString GuiFileSelect_getInfileNames (GuiWindow parent, const char32 *title, bool allowMultipleFiles) {
 	structMelderDir saveDir = { { 0 } };
 	Melder_getDefaultDir (& saveDir);
 	autoSortedSetOfString me = SortedSetOfString_create ();
 	#if gtk
 		(void) parent;
 		static structMelderDir dir;
-		GuiObject dialog = gtk_file_chooser_dialog_new (Melder_peekWcsToUtf8 (title), NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
-			GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
+		GuiObject dialog = gtk_file_chooser_dialog_new (Melder_peek32to8 (title), nullptr, GTK_FILE_CHOOSER_ACTION_OPEN,
+			GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr);
 		gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), allowMultipleFiles);
 		if (MelderDir_isNull (& dir))   // first time?
 			Melder_getDefaultDir (& dir);
-		gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), Melder_peekWcsToUtf8 (Melder_dirToPath (& dir)));
+		gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), Melder_peek32to8 (Melder_dirToPath (& dir)));
 		if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
 			char *infolderName_utf8 = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
-			if (infolderName_utf8 != NULL) {
-				wchar_t *infolderName = Melder_peekUtf8ToWcs (infolderName_utf8);   // dangle
+			if (infolderName_utf8) {
+				char32 *infolderName = Melder_peek8to32 (infolderName_utf8);   // dangle
 				Melder_pathToDir (infolderName, & dir);
 				g_free (infolderName_utf8);
 			}
 			GSList *infileNames_list = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (dialog));
-			for (GSList *element = infileNames_list; element != NULL; element = g_slist_next (element)) {
+			for (GSList *element = infileNames_list; element != nullptr; element = g_slist_next (element)) {
 				char *infileName_utf8 = (char *) element -> data;
-				my addString (Melder_peekUtf8ToWcs (infileName_utf8));
+				SortedSetOfString_addString (me.peek(), Melder_peek8to32 (infileName_utf8));
 				g_free (infileName_utf8);
 			}
 			g_slist_free (infileNames_list);
@@ -56,14 +56,14 @@ SortedSetOfString GuiFileSelect_getInfileNames (GuiWindow parent, const wchar_t
 	#elif cocoa
 		(void) parent;
 		NSOpenPanel	*openPanel = [NSOpenPanel openPanel];
-		[openPanel setTitle: [NSString stringWithUTF8String: Melder_peekWcsToUtf8 (title)]];
+		[openPanel setTitle: [NSString stringWithUTF8String: Melder_peek32to8 (title)]];
 		[openPanel setAllowsMultipleSelection: allowMultipleFiles];
 		[openPanel setCanChooseDirectories: NO];
 		if ([openPanel runModal] == NSFileHandlingPanelOKButton) {
 			for (NSURL *url in [openPanel URLs]) {
 				structMelderFile file = { 0 };
-				Melder_8bitFileRepresentationToWcs_inline ([[url path] UTF8String], file. path);
-				my addString (file. path);
+				Melder_8bitFileRepresentationToStr32_inline ([[url path] UTF8String], file. path);   // BUG: unsafe buffer
+				SortedSetOfString_addString (me.peek(), file. path);
 			}
 		}
 		setlocale (LC_ALL, "en_US");
@@ -74,12 +74,12 @@ SortedSetOfString GuiFileSelect_getInfileNames (GuiWindow parent, const wchar_t
 		NavDialogCreationOptions dialogOptions;
 		NavGetDefaultDialogCreationOptions (& dialogOptions);
 		dialogOptions. optionFlags |= kNavDontAutoTranslate;
-		//dialogOptions. windowTitle = (CFStringRef) Melder_peekWcsToCfstring (title);
+		//dialogOptions. windowTitle = (CFStringRef) Melder_peek32toCfstring (title);
 		if (! allowMultipleFiles) dialogOptions. optionFlags &= ~ kNavAllowMultipleFiles;
-		err = NavCreateChooseFileDialog (& dialogOptions, NULL, NULL, NULL, NULL, NULL, & dialogRef);
+		err = NavCreateChooseFileDialog (& dialogOptions, nullptr, nullptr, nullptr, nullptr, nullptr, & dialogRef);
 		if (err == noErr) {
 			NavReplyRecord reply;
-			[(NSOpenPanel *) dialogRef setTitle: (NSString *) Melder_peekWcsToCfstring (title)];
+			[(NSOpenPanel *) dialogRef setTitle: (NSString *) Melder_peek32toCfstring (title)];
 			NavDialogRun (dialogRef);
 			err = NavDialogGetReply (dialogRef, & reply);
 			if (err == noErr && reply. validRecord) {
@@ -93,7 +93,7 @@ SortedSetOfString GuiFileSelect_getInfileNames (GuiWindow parent, const wchar_t
 					structMelderFile file = { 0 };
 					if ((err = AEGetNthPtr (& reply. selection, ifile, typeFSRef, & keyWord, & typeCode, & machFile, sizeof (FSRef), & actualSize)) == noErr)
 						Melder_machToFile (& machFile, & file);
-					my addString (Melder_fileToPath (& file));
+					SortedSetOfString_addString (me.peek(), Melder_fileToPath (& file));
 				}
 				NavDisposeReply (& reply);
 			}
@@ -102,27 +102,27 @@ SortedSetOfString GuiFileSelect_getInfileNames (GuiWindow parent, const wchar_t
 		setlocale (LC_ALL, "en_US");
 	#elif win
 		static OPENFILENAMEW openFileName, dummy;
-		static wchar_t fullFileName [3000+2];
+		static WCHAR fullFileNameW [3000+2];
 		ZeroMemory (& openFileName, sizeof (OPENFILENAMEW));
 		openFileName. lStructSize = sizeof (OPENFILENAMEW);
-		openFileName. hwndOwner = parent && parent -> d_xmShell ? (HWND) XtWindow (parent -> d_xmShell) : NULL;
-		openFileName. hInstance = NULL;
+		openFileName. hwndOwner = parent && parent -> d_xmShell ? (HWND) XtWindow (parent -> d_xmShell) : nullptr;
+		openFileName. hInstance = nullptr;
 		openFileName. lpstrFilter = L"All Files\0*.*\0";
-		ZeroMemory (fullFileName, (3000+2) * sizeof (wchar_t));
-		openFileName. lpstrCustomFilter = NULL;
+		ZeroMemory (fullFileNameW, (3000+2) * sizeof (WCHAR));
+		openFileName. lpstrCustomFilter = nullptr;
 		openFileName. nMaxCustFilter = 0;
-		openFileName. lpstrFile = fullFileName;
+		openFileName. lpstrFile = fullFileNameW;
 		openFileName. nMaxFile = 3000;
-		openFileName. lpstrFileTitle = NULL;
+		openFileName. lpstrFileTitle = nullptr;
 		openFileName. nMaxFileTitle = 0;
-		openFileName. lpstrInitialDir = NULL;
-		openFileName. lpstrTitle = title;
+		openFileName. lpstrInitialDir = nullptr;
+		openFileName. lpstrTitle = Melder_peek32toW (title);
 		openFileName. Flags = OFN_EXPLORER | OFN_LONGNAMES | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY
 			| (allowMultipleFiles ? OFN_ALLOWMULTISELECT : 0);
-		openFileName. lpstrDefExt = NULL;
-		openFileName. lpfnHook = NULL;
-		openFileName. lpTemplateName = NULL;
-		openFileName. pvReserved = NULL;
+		openFileName. lpstrDefExt = nullptr;
+		openFileName. lpfnHook = nullptr;
+		openFileName. lpTemplateName = nullptr;
+		openFileName. pvReserved = nullptr;
 		openFileName. dwReserved = 0;
 		openFileName. FlagsEx = 0;
 		OSVERSIONINFO osVersionInfo;
@@ -130,23 +130,23 @@ SortedSetOfString GuiFileSelect_getInfileNames (GuiWindow parent, const wchar_t
 		osVersionInfo. dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
 		GetVersionEx (& osVersionInfo);
 		if (GetOpenFileNameW (& openFileName)) {
-			int firstFileNameLength = wcslen (fullFileName);
-			if (fullFileName [firstFileNameLength + 1] == '\0') {
+			int firstFileNameLength = wcslen (fullFileNameW);
+			if (fullFileNameW [firstFileNameLength + 1] == L'\0') {
 				/*
 				 * The user selected one file.
 				 */
-				my addString (fullFileName);
+				SortedSetOfString_addString (me.peek(), Melder_peekWto32 (fullFileNameW));
 			} else {
 				/*
 				 * The user selected multiple files.
-				 * 'fullFileName' is a directory name; the file names follow.
+				 * 'fullFileNameW' is a directory name; the file names follow.
 				 */
 				structMelderDir dir;
-				Melder_pathToDir (fullFileName, & dir);
-				for (const wchar_t *p = & fullFileName [firstFileNameLength + 1]; *p != '\0'; p += wcslen (p) + 1) {
-					structMelderFile file = { 0 };
-					MelderDir_getFile (& dir, p, & file);
-					my addString (Melder_fileToPath (& file));
+				Melder_pathToDir (Melder_peekWto32 (fullFileNameW), & dir);
+				for (const WCHAR *p = & fullFileNameW [firstFileNameLength + 1]; *p != L'\0'; p += wcslen (p) + 1) {
+					structMelderFile file { 0 };
+					MelderDir_getFile (& dir, Melder_peekWto32 (p), & file);
+					SortedSetOfString_addString (me.peek(), Melder_fileToPath (& file));
 				}
 			}
 		}
@@ -156,23 +156,23 @@ SortedSetOfString GuiFileSelect_getInfileNames (GuiWindow parent, const wchar_t
 	return me.transfer();
 }
 
-wchar_t * GuiFileSelect_getOutfileName (GuiWindow parent, const wchar_t *title, const wchar_t *defaultName) {
-	structMelderDir saveDir = { { 0 } };
+char32 * GuiFileSelect_getOutfileName (GuiWindow parent, const char32 *title, const char32 *defaultName) {
+	structMelderDir saveDir { { 0 } };
 	Melder_getDefaultDir (& saveDir);
-	wchar_t *outfileName = NULL;
+	char32 *outfileName = nullptr;
 	#if gtk
 		(void) parent;
 		static structMelderFile file;
-		GuiObject dialog = gtk_file_chooser_dialog_new (Melder_peekWcsToUtf8 (title), NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
-			GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
-		gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
+		GuiObject dialog = gtk_file_chooser_dialog_new (Melder_peek32to8 (title), nullptr, GTK_FILE_CHOOSER_ACTION_SAVE,
+			GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, nullptr);
+		gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), true);
 		if (file. path [0] != '\0') {
-			gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), Melder_peekWcsToUtf8 (file. path));
+			gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), Melder_peek32to8 (file. path));
 		}
-		gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), Melder_peekWcsToUtf8 (defaultName));
+		gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), Melder_peek32to8 (defaultName));
 		if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
 			char *outfileName_utf8 = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-			outfileName = Melder_utf8ToWcs (outfileName_utf8);
+			outfileName = Melder_8to32 (outfileName_utf8);
 			g_free (outfileName_utf8);
 			Melder_pathToFile (outfileName, & file);
 		}
@@ -181,36 +181,41 @@ wchar_t * GuiFileSelect_getOutfileName (GuiWindow parent, const wchar_t *title,
 	#elif cocoa
 		(void) parent;
 		NSSavePanel	*savePanel = [NSSavePanel savePanel];
-		[savePanel setTitle: [NSString stringWithUTF8String: Melder_peekWcsToUtf8 (title)]];
-		//[savePanel setNameFieldStringValue: [NSString stringWithUTF8String: Melder_peekWcsToUtf8 (defaultName)]];   // from 10.6 on
+		[savePanel setTitle: [NSString stringWithUTF8String: Melder_peek32to8 (title)]];
+		//[savePanel setNameFieldStringValue: [NSString stringWithUTF8String: Melder_peek32to8 (defaultName)]];   // from 10.6 on
 		if ([savePanel runModalForDirectory: nil
-			           file: [NSString stringWithUTF8String: Melder_peekWcsToUtf8 (defaultName)]   // deprecated 10.6 but needed 10.5
+			           file: [NSString stringWithUTF8String: Melder_peek32to8 (defaultName)]   // deprecated 10.6 but needed 10.5
 			] == NSFileHandlingPanelOKButton)
 		{
-			const char *outfileName_utf8 = [[[savePanel URL] path] UTF8String];
-			structMelderFile file = { 0 };
-			Melder_8bitFileRepresentationToWcs_inline (outfileName_utf8, file. path);
-			outfileName = Melder_wcsdup (file. path);
+			NSString *path = [[savePanel URL] path];
+			if (path == nil)
+				Melder_throw (U"Don't understand where you want to save (1).");
+			const char *outfileName_utf8 = [path UTF8String];
+			if (outfileName_utf8 == nullptr)
+				Melder_throw (U"Don't understand where you want to save (2).");
+			structMelderFile file { 0 };
+			Melder_8bitFileRepresentationToStr32_inline (outfileName_utf8, file. path);   // BUG: unsafe buffer
+			outfileName = Melder_dup (file. path);
 		}
 		setlocale (LC_ALL, "en_US");
 	#elif mac
 		(void) parent;
-		const wchar_t *lastSlash = wcsrchr (defaultName, Melder_DIRECTORY_SEPARATOR);
+		const char32 *lastSlash = str32rchr (defaultName, Melder_DIRECTORY_SEPARATOR);
 		OSStatus err;
 		NavDialogRef dialogRef;
 		NavDialogCreationOptions dialogOptions;
 		NavGetDefaultDialogCreationOptions (& dialogOptions);
-		dialogOptions. windowTitle = (CFStringRef) Melder_peekWcsToCfstring (title);
-		//dialogOptions. message = (CFStringRef) Melder_peekWcsToCfstring (title);
-		dialogOptions. saveFileName = (CFStringRef) Melder_peekWcsToCfstring (lastSlash ? lastSlash + 1 : defaultName);
+		dialogOptions. windowTitle = (CFStringRef) Melder_peek32toCfstring (title);
+		//dialogOptions. message = (CFStringRef) Melder_peek32toCfstring (title);
+		dialogOptions. saveFileName = (CFStringRef) Melder_peek32toCfstring (lastSlash ? lastSlash + 1 : defaultName);
 		dialogOptions. optionFlags |= kNavNoTypePopup;
-		err = NavCreatePutFileDialog (& dialogOptions, 0, 0, NULL, NULL, & dialogRef);
+		err = NavCreatePutFileDialog (& dialogOptions, 0, 0, nullptr, nullptr, & dialogRef);
 		if (err == noErr) {
 			NavReplyRecord reply;
 			NavDialogRun (dialogRef);
 			err = NavDialogGetReply (dialogRef, & reply);
 			if (Melder_debug == 19) {
-				Melder_casual ("err %d %d", err, reply. validRecord);
+				Melder_casual (U"err ", err, U" ", reply. validRecord);
 			}
 			if (err == noErr && reply. validRecord) {
 				AEKeyword keyWord;
@@ -227,14 +232,14 @@ wchar_t * GuiFileSelect_getOutfileName (GuiWindow parent, const wchar_t *title,
 					if (! (directoryPath_utf8 [0] == '/' && directoryPath_utf8 [1] == '\0'))
 						strcat (directoryPath_utf8, "/");
 					structMelderFile file = { 0 };
-					Melder_8bitToWcs_inline (directoryPath_utf8, file. path, kMelder_textInputEncoding_UTF8); // BUG throwable
-					int dirLength = wcslen (file. path);
+					Melder_8to32_inline (directoryPath_utf8, file. path, kMelder_textInputEncoding_UTF8);   // BUG throwable
+					int dirLength = str32len (file. path);
 					int n = CFStringGetLength (outfileName_cf);
-					wchar_t *p = file. path + dirLength;
+					char32 *p = file. path + dirLength;
 					for (int i = 0; i < n; i ++, p ++)
 						*p = CFStringGetCharacterAtIndex (outfileName_cf, i);
 					*p = '\0';
-					outfileName = Melder_wcsdup_f (file. path);
+					outfileName = Melder_dup (file. path);
 				}
 				NavDisposeReply (& reply);
 			}
@@ -243,26 +248,24 @@ wchar_t * GuiFileSelect_getOutfileName (GuiWindow parent, const wchar_t *title,
 		setlocale (LC_ALL, "en_US");
 	#elif win
 		OPENFILENAMEW openFileName;
-		static wchar_t customFilter [100+2];
-		static wchar_t fullFileName [300+2];
-		long n = wcslen (defaultName);
-		for (long i = 0; i <= n; i ++) {
-			fullFileName [i] = defaultName [i];
-		}
+		static WCHAR customFilter [100+2];
+		static WCHAR fullFileNameW [300+2];
+		wcsncpy (fullFileNameW, Melder_peek32toW (defaultName), 300+2);
+		fullFileNameW [300+1] = L'\0';
 		openFileName. lStructSize = sizeof (OPENFILENAMEW);
-		openFileName. hwndOwner = parent && parent -> d_xmShell ? (HWND) XtWindow (parent -> d_xmShell) : NULL;
-		openFileName. lpstrFilter = NULL;   /* like *.txt */
+		openFileName. hwndOwner = parent && parent -> d_xmShell ? (HWND) XtWindow (parent -> d_xmShell) : nullptr;
+		openFileName. lpstrFilter = nullptr;   // like *.txt
 		openFileName. lpstrCustomFilter = customFilter;
 		openFileName. nMaxCustFilter = 100;
-		openFileName. lpstrFile = fullFileName;
+		openFileName. lpstrFile = fullFileNameW;
 		openFileName. nMaxFile = 300;
-		openFileName. lpstrFileTitle = NULL;
-		openFileName. lpstrInitialDir = NULL;
-		openFileName. lpstrTitle = title;
+		openFileName. lpstrFileTitle = nullptr;
+		openFileName. lpstrInitialDir = nullptr;
+		openFileName. lpstrTitle = Melder_peek32toW (title);
 		openFileName. Flags = OFN_LONGNAMES | OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_HIDEREADONLY;
-		openFileName. lpstrDefExt = NULL;
+		openFileName. lpstrDefExt = nullptr;
 		if (GetSaveFileNameW (& openFileName)) {
-			outfileName = Melder_wcsdup_f (fullFileName);
+			outfileName = Melder_Wto32 (fullFileNameW);
 		}
 		setlocale (LC_ALL, "C");
 	#endif
@@ -270,21 +273,21 @@ wchar_t * GuiFileSelect_getOutfileName (GuiWindow parent, const wchar_t *title,
 	return outfileName;
 }
 
-wchar_t * GuiFileSelect_getDirectoryName (GuiWindow parent, const wchar_t *title) {
-	structMelderDir saveDir = { { 0 } };
+char32 * GuiFileSelect_getDirectoryName (GuiWindow parent, const char32 *title) {
+	structMelderDir saveDir { { 0 } };
 	Melder_getDefaultDir (& saveDir);
-	wchar_t *directoryName = NULL;
+	char32 *directoryName = nullptr;
 	#if gtk
 		(void) parent;
 		static structMelderFile file;
-		GuiObject dialog = gtk_file_chooser_dialog_new (Melder_peekWcsToUtf8 (title), NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
-			GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, "Choose", GTK_RESPONSE_ACCEPT, NULL);
+		GuiObject dialog = gtk_file_chooser_dialog_new (Melder_peek32to8 (title), nullptr, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+			GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, "Choose", GTK_RESPONSE_ACCEPT, nullptr);
 		if (file. path [0] != '\0') {
-			gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), Melder_peekWcsToUtf8 (file. path));
+			gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), Melder_peek32to8 (file. path));
 		}
 		if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
 			char *directoryName_utf8 = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-			directoryName = Melder_utf8ToWcs (directoryName_utf8);
+			directoryName = Melder_8to32 (directoryName_utf8);
 			g_free (directoryName_utf8);
 			Melder_pathToFile (directoryName, & file);
 		}
@@ -293,7 +296,7 @@ wchar_t * GuiFileSelect_getDirectoryName (GuiWindow parent, const wchar_t *title
 	#elif cocoa
 		(void) parent;
 		NSOpenPanel	*openPanel = [NSOpenPanel openPanel];
-		[openPanel setTitle: [NSString stringWithUTF8String: Melder_peekWcsToUtf8 (title)]];
+		[openPanel setTitle: [NSString stringWithUTF8String: Melder_peek32to8 (title)]];
 		[openPanel setAllowsMultipleSelection: NO];
 		[openPanel setCanChooseDirectories: YES];
 		[openPanel setCanChooseFiles: NO];
@@ -302,8 +305,8 @@ wchar_t * GuiFileSelect_getDirectoryName (GuiWindow parent, const wchar_t *title
 			for (NSURL *url in [openPanel URLs]) {
 				const char *directoryName_utf8 = [[url path] UTF8String];
 				structMelderDir dir = { { 0 } };
-				Melder_8bitFileRepresentationToWcs_inline (directoryName_utf8, dir. path);
-				directoryName = Melder_wcsdup (dir. path);
+				Melder_8bitFileRepresentationToStr32_inline (directoryName_utf8, dir. path);   // BUG: unsafe buffer
+				directoryName = Melder_dup (dir. path);
 			}
 		}
 		setlocale (LC_ALL, "en_US");
@@ -313,16 +316,16 @@ wchar_t * GuiFileSelect_getDirectoryName (GuiWindow parent, const wchar_t *title
 		NavDialogRef dialogRef;
 		NavDialogCreationOptions dialogOptions;
 		NavGetDefaultDialogCreationOptions (& dialogOptions);
-		dialogOptions. windowTitle = (CFStringRef) Melder_peekWcsToCfstring (title);
+		dialogOptions. windowTitle = (CFStringRef) Melder_peek32toCfstring (title);
 		dialogOptions. optionFlags |= kNavDontAutoTranslate;
 		dialogOptions. optionFlags &= ~ kNavAllowMultipleFiles;
-		err = NavCreateChooseFolderDialog (& dialogOptions, NULL, NULL, NULL, & dialogRef);
+		err = NavCreateChooseFolderDialog (& dialogOptions, nullptr, nullptr, nullptr, & dialogRef);
 		if (err == noErr) {
 			NavReplyRecord reply;
 			NavDialogRun (dialogRef);
 			err = NavDialogGetReply (dialogRef, & reply);
 			if (Melder_debug == 19) {
-				Melder_casual ("err %d %d", err, reply. validRecord);
+				Melder_casual (U"err ", err, U" ", reply. validRecord);
 			}
 			if (err == noErr && reply. validRecord) {
 				AEKeyword keyWord;
@@ -332,7 +335,7 @@ wchar_t * GuiFileSelect_getDirectoryName (GuiWindow parent, const wchar_t *title
 				structMelderFile file = { 0 };
 				if ((err = AEGetNthPtr (& reply. selection, 1, typeFSRef, & keyWord, & typeCode, & machFile, sizeof (FSRef), & actualSize)) == noErr) {
 					Melder_machToFile (& machFile, & file);
-					directoryName = Melder_wcsdup_f (Melder_fileToPath (& file));
+					directoryName = Melder_dup (Melder_fileToPath (& file));
 				}
 				NavDisposeReply (& reply);
 			}
@@ -340,22 +343,22 @@ wchar_t * GuiFileSelect_getDirectoryName (GuiWindow parent, const wchar_t *title
 		}
 		setlocale (LC_ALL, "en_US");
 	#elif win
-		static wchar_t fullFileName [3000+2];
+		static WCHAR fullFileNameW [3000+2];
 		static bool comInited = false;
 		if (! comInited) {
-			CoInitializeEx (NULL, COINIT_APARTMENTTHREADED);
+			CoInitializeEx (nullptr, COINIT_APARTMENTTHREADED);
 			comInited = true;
 		}
 		static BROWSEINFO info;
-		info. hwndOwner = parent && parent -> d_xmShell ? (HWND) XtWindow (parent -> d_xmShell) : NULL;
+		info. hwndOwner = parent && parent -> d_xmShell ? (HWND) XtWindow (parent -> d_xmShell) : nullptr;
 		info. ulFlags = BIF_USENEWUI;
-		info. pidlRoot = NULL;   // everything on the computer should be browsable
-		info. pszDisplayName = NULL;   // this would only give the bare directory name, not the full path
-		info. lpszTitle = title;
+		info. pidlRoot = nullptr;   // everything on the computer should be browsable
+		info. pszDisplayName = nullptr;   // this would only give the bare directory name, not the full path
+		info. lpszTitle = Melder_peek32toW (title);
 		LPITEMIDLIST idList = SHBrowseForFolder (& info);
-		SHGetPathFromIDList (idList, fullFileName);
+		SHGetPathFromIDList (idList, fullFileNameW);
 		CoTaskMemFree (idList);
-		directoryName = Melder_wcsdup_f (fullFileName);
+		directoryName = Melder_Wto32 (fullFileNameW);
 		setlocale (LC_ALL, "C");
 	#endif
 	Melder_setDefaultDir (& saveDir);
diff --git a/sys/GuiForm.cpp b/sys/GuiForm.cpp
index c5aa779..cb78513 100644
--- a/sys/GuiForm.cpp
+++ b/sys/GuiForm.cpp
@@ -1,6 +1,6 @@
 /* GuiForm.cpp
  *
- * Copyright (C) 1993-2012 Paul Boersma
+ * Copyright (C) 1993-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ Thing_implement (GuiForm, GuiControl, 0);
 	static void _guiGtkForm_destroyCallback (GuiObject widget, gpointer void_me) {
 		(void) widget;
 		iam (GuiForm);
-		trace ("destroying GuiForm %p", me);
+		trace (U"destroying GuiForm ", Melder_pointer (me));
 		forget (me);
 	}
 #elif cocoa
@@ -47,10 +47,10 @@ GuiForm GuiForm_createInScrolledWindow (GuiScrolledWindow parent)
 		gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (parent -> d_widget), GTK_WIDGET (my d_widget));
 	#elif cocoa
 	#elif motif
-		//my d_widget = XmCreateRowColumn (parent -> d_widget, "menu", NULL, 0);
-		my d_widget = XmCreateForm (parent -> d_widget, "menu", NULL, 0);
+		//my d_widget = XmCreateRowColumn (parent -> d_widget, "menu", nullptr, 0);
+		my d_widget = XmCreateForm (parent -> d_widget, "menu", nullptr, 0);
 	#endif
-	my f_show ();
+	GuiThing_show (me);
 
 	#if gtk
 		g_signal_connect (G_OBJECT (my d_widget), "destroy", G_CALLBACK (_guiGtkForm_destroyCallback), me);
diff --git a/sys/GuiLabel.cpp b/sys/GuiLabel.cpp
index 4b9ae70..62707a4 100644
--- a/sys/GuiLabel.cpp
+++ b/sys/GuiLabel.cpp
@@ -1,6 +1,6 @@
 /* GuiLabel.cpp
  *
- * Copyright (C) 1993-2012,2013 Paul Boersma, 2007 Stefan de Konink
+ * Copyright (C) 1993-2012,2013,2015 Paul Boersma, 2007 Stefan de Konink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -44,14 +44,14 @@ Thing_implement (GuiLabel, GuiControl, 0);
 	- (void) dealloc {   // override
 		GuiLabel me = d_userData;
 		forget (me);
-		trace ("deleting a label");
+		trace (U"deleting a label");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiLabel));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiLabel));
 		d_userData = static_cast <GuiLabel> (userData);
 	}
 	@end
@@ -70,33 +70,33 @@ Thing_implement (GuiLabel, GuiControl, 0);
 #endif
 
 GuiLabel GuiLabel_create (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *labelText, unsigned long flags)
+	const char32 *labelText, uint32 flags)
 {
 	GuiLabel me = Thing_new (GuiLabel);
 	my d_shell = parent -> d_shell;
 	my d_parent = parent;
 	#if gtk
-		my d_widget = gtk_label_new (Melder_peekWcsToUtf8 (labelText));
+		my d_widget = gtk_label_new (Melder_peek32to8 (labelText));
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		g_signal_connect (G_OBJECT (my d_widget), "destroy", G_CALLBACK (_GuiGtkLabel_destroyCallback), me);
 		gtk_misc_set_alignment (GTK_MISC (my d_widget), flags & GuiLabel_RIGHT ? 1.0 : flags & GuiLabel_CENTRE ? 0.5 : 0.0, 0.5);
 	#elif cocoa
-		trace ("create");
+		trace (U"create");
         GuiCocoaLabel *label = [[GuiCocoaLabel alloc] init];
 		my d_widget = label;
-		trace ("position");
+		trace (U"position");
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
-		trace ("set user data");
+		trace (U"set user data");
 		[label setUserData: me];
-		trace ("set bezel style");
+		trace (U"set bezel style");
 		[label setBezelStyle: NSTextFieldRoundedBezel];
-		trace ("set bordered");
+		trace (U"set bordered");
 		[label setBordered: NO];
-		trace ("set selectable");
+		trace (U"set selectable");
 		[label setSelectable: NO];
-		trace ("title");
-		[label setTitleWithMnemonic: (NSString *) Melder_peekWcsToCfstring (labelText)];
+		trace (U"title");
+		[label setTitleWithMnemonic: (NSString *) Melder_peek32toCfstring (labelText)];
         [label setAlignment:( flags & GuiLabel_RIGHT ? NSRightTextAlignment : flags & GuiLabel_CENTRE ? NSCenterTextAlignment : NSLeftTextAlignment )];
 		static NSFont *theLabelFont;
 		if (! theLabelFont) {
@@ -106,14 +106,14 @@ GuiLabel GuiLabel_create (GuiForm parent, int left, int right, int top, int bott
 	#elif win
 		my d_widget = _Gui_initializeWidget (xmLabelWidgetClass, parent -> d_widget, labelText);
 		_GuiObject_setUserData (my d_widget, me);
-		my d_widget -> window = CreateWindow (L"static", _GuiWin_expandAmpersands (my d_widget -> name),
+		my d_widget -> window = CreateWindow (L"static", Melder_peek32toW (_GuiWin_expandAmpersands (my d_widget -> name)),
 			WS_CHILD
 			| ( flags & GuiLabel_RIGHT ? SS_RIGHT : flags & GuiLabel_CENTRE ? SS_CENTER : SS_LEFT )
 			| SS_CENTERIMAGE,
 			my d_widget -> x, my d_widget -> y, my d_widget -> width, my d_widget -> height,
-			my d_widget -> parent -> window, (HMENU) 1, theGui.instance, NULL);
+			my d_widget -> parent -> window, (HMENU) 1, theGui.instance, nullptr);
 		SetWindowLongPtr (my d_widget -> window, GWLP_USERDATA, (LONG_PTR) my d_widget);
-		SetWindowFont (my d_widget -> window, GetStockFont (ANSI_VAR_FONT), FALSE);
+		SetWindowFont (my d_widget -> window, GetStockFont (ANSI_VAR_FONT), false);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 	#elif mac
 		my d_widget = _Gui_initializeWidget (xmLabelWidgetClass, parent -> d_widget, labelText);
@@ -123,8 +123,8 @@ GuiLabel GuiLabel_create (GuiForm parent, int left, int right, int top, int bott
 		macFontStyleRecord. font = systemFont;
 		macFontStyleRecord. size = 13;
 		macFontStyleRecord. just = ( flags & GuiLabel_RIGHT ? teFlushRight : flags & GuiLabel_CENTRE ? teCenter : teFlushLeft );
-		CreateStaticTextControl (my d_widget -> macWindow, & my d_widget -> rect, NULL, & macFontStyleRecord, & my d_widget -> nat.control.handle);
-		Melder_assert (my d_widget -> nat.control.handle != NULL);
+		CreateStaticTextControl (my d_widget -> macWindow, & my d_widget -> rect, nullptr, & macFontStyleRecord, & my d_widget -> nat.control.handle);
+		Melder_assert (my d_widget -> nat.control.handle);
 		SetControlReference (my d_widget -> nat.control.handle, (long) my d_widget);
 		my d_widget -> isControl = true;
 		_GuiNativeControl_setTitle (my d_widget);
@@ -134,22 +134,22 @@ GuiLabel GuiLabel_create (GuiForm parent, int left, int right, int top, int bott
 }
 
 GuiLabel GuiLabel_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *labelText, unsigned long flags)
+	const char32 *labelText, uint32 flags)
 {
 	GuiLabel me = GuiLabel_create (parent, left, right, top, bottom, labelText, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
-void structGuiLabel :: f_setString (const wchar_t *text) {
+void GuiLabel_setText (GuiLabel me, const char32 *text /* cattable */) {
 	#if gtk
-		gtk_label_set_text (GTK_LABEL (d_widget), Melder_peekWcsToUtf8 (text));
+		gtk_label_set_text (GTK_LABEL (my d_widget), Melder_peek32to8 (text));
 	#elif cocoa
-		[(NSTextField *) d_widget setTitleWithMnemonic: (NSString *) Melder_peekWcsToCfstring (text)];
+		[(NSTextField *) my d_widget setTitleWithMnemonic: (NSString *) Melder_peek32toCfstring (text)];
 	#elif motif
-		Melder_free (d_widget -> name);
-		d_widget -> name = Melder_wcsdup_f (text);
-		_GuiNativeControl_setTitle (d_widget);
+		Melder_free (my d_widget -> name);
+		my d_widget -> name = Melder_dup_f (text);
+		_GuiNativeControl_setTitle (my d_widget);
 	#endif
 }
 
diff --git a/sys/GuiList.cpp b/sys/GuiList.cpp
index da8b9ef..387c8c2 100644
--- a/sys/GuiList.cpp
+++ b/sys/GuiList.cpp
@@ -1,6 +1,6 @@
 /* GuiList.cpp
  *
- * Copyright (C) 1993-2011,2012,2013 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1993-2011,2012,2013,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 /*
  * pb 2007/12/26 abstraction from Motif
- * pb 2009/01/31 NUMlvector_free has to be followed by assigning a NULL
+ * pb 2009/01/31 NUMlvector_free has to be followed by assigning a nullptr
  * fb 2010/02/23 GTK
  * pb 2010/06/14 HandleControlClick
  * pb 2010/07/05 blockSelectionChangedCallback
@@ -56,9 +56,9 @@ Thing_implement (GuiList, GuiControl, 0);
 	}
 	static void _GuiGtkList_selectionChangedCallback (GtkTreeSelection *sel, gpointer void_me) {
 		iam (GuiList);
-		if (my d_selectionChangedCallback != NULL && ! my d_blockValueChangedCallbacks) {
-			//Melder_casual ("Selection changed.");
-			struct structGuiListEvent event = { me };
+		if (my d_selectionChangedCallback && ! my d_blockValueChangedCallbacks) {
+			trace (U"Selection changed.");
+			struct structGuiListEvent event { me };
 			my d_selectionChangedCallback (my d_selectionChangedBoss, & event);
 		}
 	}
@@ -74,7 +74,7 @@ Thing_implement (GuiList, GuiControl, 0);
 		[_contents release];
 		GuiThing me = d_userData;
 		forget (me);
-		Melder_casual ("deleting a list");
+		Melder_casual (U"deleting a list");
 		[super dealloc];
 	}
 
@@ -108,7 +108,7 @@ Thing_implement (GuiList, GuiControl, 0);
 			[self addSubview: sv];   // this retains the scroll view
 			//Melder_assert ([sv retainCount] == 2);   // not always true on 10.6
 			[sv release];
-			Melder_assert ([_tableView retainCount] == 2);
+			//Melder_assert ([_tableView retainCount] == 2);   // not always true on 10.11
 			[_tableView release];
 
 			_contents = [[NSMutableArray alloc] init];
@@ -123,7 +123,7 @@ Thing_implement (GuiList, GuiControl, 0);
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiList));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiList));
 		d_userData = static_cast <GuiList> (userData);
 	}
 
@@ -136,10 +136,10 @@ Thing_implement (GuiList, GuiControl, 0);
 		 * because tableViewSelectionDidChange will already have been called at this point.
 		 */
 		(void) sender;
-		trace ("enter");
+		trace (U"enter");
 		GuiList me = d_userData;
 		if (me && my d_selectionChangedCallback) {
-			struct structGuiListEvent event = { me };
+			struct structGuiListEvent event { me };
 			//my d_selectionChangedCallback (my d_selectionChangedBoss, & event);
 		}
 	}
@@ -165,10 +165,10 @@ Thing_implement (GuiList, GuiControl, 0);
 		 * This is invoked when the user clicks in the table or uses the arrow keys.
 		 */
 		(void) notification;
-		trace ("enter");
+		trace (U"enter");
 		GuiList me = d_userData;
 		if (me && my d_selectionChangedCallback && ! my d_blockValueChangedCallbacks) {
-			struct structGuiListEvent event = { me };
+			struct structGuiListEvent event { me };
 			my d_selectionChangedCallback (my d_selectionChangedBoss, & event);
 		}
 	}
@@ -185,8 +185,8 @@ Thing_implement (GuiList, GuiControl, 0);
 	}
 	void _GuiWinList_handleClick (GuiObject widget) {
 		iam_list;
-		if (my d_selectionChangedCallback != NULL) {
-			struct structGuiListEvent event = { me };
+		if (my d_selectionChangedCallback) {
+			struct structGuiListEvent event { me };
 			my d_selectionChangedCallback (my d_selectionChangedBoss, & event);
 		}
 	}
@@ -206,7 +206,7 @@ Thing_implement (GuiList, GuiControl, 0);
 		iam_list;
 		if (widget -> isControl) {
 			_GuiNativeControl_show (widget);
-			Melder_casual ("showing a list");
+			trace (U"showing a list");
 			//_GuiMac_clipOnParent (widget);
 			//LSetDrawingMode (true, my macListHandle);
 			//_GuiMac_clipOffInvalid (widget);
@@ -225,10 +225,10 @@ Thing_implement (GuiList, GuiControl, 0);
 	void _GuiMacList_handleControlClick (GuiObject widget, EventRecord *macEvent) {
 		iam_list;
 		_GuiMac_clipOnParent (widget);
-		bool pushed = HandleControlClick (widget -> nat.control.handle, macEvent -> where, macEvent -> modifiers, NULL);
+		bool pushed = HandleControlClick (widget -> nat.control.handle, macEvent -> where, macEvent -> modifiers, nullptr);
 		GuiMac_clipOff ();
 		if (pushed && my d_selectionChangedCallback) {
-			struct structGuiListEvent event = { me };
+			struct structGuiListEvent event { me };
 			my d_selectionChangedCallback (my d_selectionChangedBoss, & event);
 		}
 	}
@@ -238,11 +238,11 @@ Thing_implement (GuiList, GuiControl, 0);
 		bool doubleClick = LClick (macEvent -> where, macEvent -> modifiers, my d_macListHandle);
 		GuiMac_clipOff ();
 		if (my d_selectionChangedCallback) {
-			struct structGuiListEvent event = { me };
+			struct structGuiListEvent event { me };
 			my d_selectionChangedCallback (my d_selectionChangedBoss, & event);
 		}
 		if (doubleClick && my d_doubleClickCallback) {
-			struct structGuiListEvent event = { me };
+			struct structGuiListEvent event { me };
 			my d_doubleClickCallback (my d_doubleClickBoss, & event);
 		}
 	}
@@ -282,7 +282,7 @@ Thing_implement (GuiList, GuiControl, 0);
 		switch (message) {
 			case lDrawMsg:
 			case lHiliteMsg:   // We redraw everything, even when just highlighting. The reason is anti-aliasing.
-				Melder_assert (widget != NULL);
+				Melder_assert (widget);
 				SetPortWindowPort (widget -> macWindow);
 				_GuiMac_clipOnParent (widget);
 				/*
@@ -310,17 +310,18 @@ Thing_implement (GuiList, GuiControl, 0);
 				CGContextRef macGraphicsContext;
 				QDBeginCGContext (GetWindowPort (widget -> macWindow), & macGraphicsContext);
 				int shellHeight = GuiMac_clipOn_graphicsContext (widget, macGraphicsContext);
-				static ATSUFontFallbacks fontFallbacks = NULL;
-				if (fontFallbacks == NULL) {
+				static ATSUFontFallbacks fontFallbacks = nullptr;
+				if (! fontFallbacks) {
 					ATSUCreateFontFallbacks (& fontFallbacks);
-					ATSUSetObjFontFallbacks (fontFallbacks, 0, NULL, kATSUDefaultFontFallbacks);
+					ATSUSetObjFontFallbacks (fontFallbacks, 0, nullptr, kATSUDefaultFontFallbacks);
 				}
 				char *text_utf8 = (char *) *(*handle) -> cells + dataOffset;
-				strncpy (Melder_buffer1, text_utf8, dataLength);
-				Melder_buffer1 [dataLength] = '\0';
-				wchar_t *text_wcs = Melder_peekUtf8ToWcs (Melder_buffer1);
-				const char16_t *text_utf16 = (const char16_t *) Melder_peekWcsToUtf16 (text_wcs);
-				UniCharCount runLength = wcslen (text_wcs);   // BUG
+				static char buffer [30001];
+				strncpy (buffer, text_utf8, dataLength);
+				buffer [dataLength] = '\0';
+				char32 *text32 = Melder_peek8to32 (buffer);
+				const char16 *text_utf16 = (const char16 *) Melder_peek32to16 (text32);
+				UniCharCount runLength = str16len (text_utf16);   // BUG
 				ATSUTextLayout textLayout;
 				ATSUStyle style;
 				ATSUCreateStyle (& style);
@@ -350,7 +351,7 @@ Thing_implement (GuiList, GuiControl, 0);
 				GuiMac_clipOff ();
 				break;
 	/*		case lHiliteMsg:
-				Melder_assert (me != NULL);
+				Melder_assert (me);
 				SetPortWindowPort (my macWindow);
 				_GuiMac_clipOnParent (me);
 				LMSetHiliteMode (LMGetHiliteMode () & ~ 128L);
@@ -368,22 +369,22 @@ enum {
 };
 #endif
 
-GuiList GuiList_create (GuiForm parent, int left, int right, int top, int bottom, bool allowMultipleSelection, const wchar_t *header) {
+GuiList GuiList_create (GuiForm parent, int left, int right, int top, int bottom, bool allowMultipleSelection, const char32 *header) {
 	GuiList me = Thing_new (GuiList);
 	my d_shell = parent -> d_shell;
 	my d_parent = parent;
 	my d_allowMultipleSelection = allowMultipleSelection;
 	#if gtk
-		GtkCellRenderer *renderer = NULL;
-		GtkTreeViewColumn *col = NULL;
-		GtkTreeSelection *sel = NULL;
-		GtkListStore *liststore = NULL;
+		GtkCellRenderer *renderer = nullptr;
+		GtkTreeViewColumn *col = nullptr;
+		GtkTreeSelection *sel = nullptr;
+		GtkListStore *liststore = nullptr;
 
 		liststore = gtk_list_store_new (1, G_TYPE_STRING);   // 1 column, of type String (this is a vararg list)
-		GuiObject scrolled = gtk_scrolled_window_new (NULL, NULL);
+		GuiObject scrolled = gtk_scrolled_window_new (nullptr, nullptr);
 		gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 		my d_widget = gtk_tree_view_new_with_model (GTK_TREE_MODEL (liststore));
-		gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (my d_widget), FALSE);
+		gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (my d_widget), false);
 		gtk_container_add (GTK_CONTAINER (scrolled), GTK_WIDGET (my d_widget));
 		gtk_widget_show (GTK_WIDGET (scrolled));   // BUG
 		gtk_tree_view_set_rubber_banding (GTK_TREE_VIEW (my d_widget), allowMultipleSelection ? GTK_SELECTION_MULTIPLE : GTK_SELECTION_SINGLE);
@@ -394,10 +395,10 @@ GuiList GuiList_create (GuiForm parent, int left, int right, int top, int bottom
 
 		renderer = gtk_cell_renderer_text_new ();
 		col = gtk_tree_view_column_new ();
-		gtk_tree_view_column_pack_start (col, renderer, TRUE);
+		gtk_tree_view_column_pack_start (col, renderer, true);
 		gtk_tree_view_column_add_attribute (col, renderer, "text", 0);   // zeroeth column
-		if (header != NULL) {
-			//gtk_tree_view_column_set_title (col, Melder_peekWcsToUtf8 (header));
+		if (header) {
+			//gtk_tree_view_column_set_title (col, Melder_peek32to8 (header));
 		}
 		gtk_tree_view_append_column (GTK_TREE_VIEW (my d_widget), col);
 
@@ -410,21 +411,21 @@ GuiList GuiList_create (GuiForm parent, int left, int right, int top, int bottom
 
 		renderer = gtk_cell_renderer_text_new ();
 		col = gtk_tree_view_column_new ();
-		gtk_tree_view_column_pack_start (col, renderer, TRUE);
+		gtk_tree_view_column_pack_start (col, renderer, true);
 		gtk_tree_view_column_add_attribute (col, renderer, "text", COL_ID);
 		gtk_tree_view_column_set_title (col, " ID ");
 		gtk_tree_view_append_column (GTK_TREE_VIEW (view), col);
 		
 		renderer = gtk_cell_renderer_text_new ();
 		col = gtk_tree_view_column_new ();
-		gtk_tree_view_column_pack_start (col, renderer, TRUE);
+		gtk_tree_view_column_pack_start (col, renderer, true);
 		gtk_tree_view_column_add_attribute (col, renderer, "text", COL_TYPE);
 		gtk_tree_view_column_set_title (col, " Type ");
 		gtk_tree_view_append_column (GTK_TREE_VIEW (view), col);
 
 		renderer = gtk_cell_renderer_text_new ();
 		col = gtk_tree_view_column_new ();
-		gtk_tree_view_column_pack_start (col, renderer, TRUE);
+		gtk_tree_view_column_pack_start (col, renderer, true);
 		gtk_tree_view_column_add_attribute (col, renderer, "text", COL_NAME);
 		gtk_tree_view_column_set_title (col, " Name ");
 		gtk_tree_view_append_column (GTK_TREE_VIEW (view), col);
@@ -445,33 +446,33 @@ GuiList GuiList_create (GuiForm parent, int left, int right, int top, int bottom
 		[[list tableView] setAllowsMultipleSelection: allowMultipleSelection];
 		[list setUserData:me];
 	#elif win
-		my d_widget = _Gui_initializeWidget (xmListWidgetClass, parent -> d_widget, L"list");
+		my d_widget = _Gui_initializeWidget (xmListWidgetClass, parent -> d_widget, U"list");
 		_GuiObject_setUserData (my d_widget, me);
 		my d_widget -> window = CreateWindowEx (0, L"listbox", L"list",
 			WS_CHILD | WS_BORDER | WS_VSCROLL | LBS_NOTIFY | WS_CLIPSIBLINGS |
 			( allowMultipleSelection ? LBS_EXTENDEDSEL : 0 ),
 			my d_widget -> x, my d_widget -> y, my d_widget -> width, my d_widget -> height,
-			my d_widget -> parent -> window, NULL, theGui.instance, NULL);
+			my d_widget -> parent -> window, nullptr, theGui.instance, nullptr);
 		SetWindowLongPtr (my d_widget -> window, GWLP_USERDATA, (LONG_PTR) my d_widget);
-		SetWindowFont (my d_widget -> window, GetStockFont (ANSI_VAR_FONT), FALSE);
+		SetWindowFont (my d_widget -> window, GetStockFont (ANSI_VAR_FONT), false);
 		/*if (MEMBER (my parent, ScrolledWindow)) {
 			XtDestroyWidget (my d_widget -> parent -> motiff.scrolledWindow.horizontalBar);
-			my d_widget -> parent -> motiff.scrolledWindow.horizontalBar = NULL;
+			my d_widget -> parent -> motiff.scrolledWindow.horizontalBar = nullptr;
 			XtDestroyWidget (my d_widget -> parent -> motiff.scrolledWindow.verticalBar);
-			my d_widget -> parent -> motiff.scrolledWindow.verticalBar = NULL;
+			my d_widget -> parent -> motiff.scrolledWindow.verticalBar = nullptr;
 		}*/
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 	#elif mac
-		my d_xmScrolled = XmCreateScrolledWindow (parent -> d_widget, "scrolled", NULL, 0);
+		my d_xmScrolled = XmCreateScrolledWindow (parent -> d_widget, "scrolled", nullptr, 0);
 		my v_positionInForm (my d_xmScrolled, left, right, top, bottom, parent);
-		my d_xmList = my d_widget = _Gui_initializeWidget (xmListWidgetClass, my d_xmScrolled, L"list");
+		my d_xmList = my d_widget = _Gui_initializeWidget (xmListWidgetClass, my d_xmScrolled, U"list");
 		_GuiObject_setUserData (my d_xmScrolled, me);
 		_GuiObject_setUserData (my d_xmList, me);
 		Rect dataBounds = { 0, 0, 0, 1 };
 		Point cSize;
 		SetPt (& cSize, my d_xmList -> rect.right - my d_xmList -> rect.left + 1, CELL_HEIGHT);
 		static ListDefSpec listDefSpec;
-		if (listDefSpec. u. userProc == NULL) {
+		if (! listDefSpec. u. userProc) {
 			listDefSpec. defType = kListDefUserProcType;
 			listDefSpec. u. userProc = mac_listDefinition;
 		}
@@ -480,129 +481,129 @@ GuiList GuiList_create (GuiForm parent, int left, int right, int top, int bottom
 		SetListRefCon (my d_macListHandle, (long) my d_xmList);
 		if (allowMultipleSelection)
 			SetListSelectionFlags (my d_macListHandle, lExtendDrag | lNoRect);
-		XtVaSetValues (my d_xmList, XmNwidth, right > 0 ? right - left + 100 : 530, NULL);
+		XtVaSetValues (my d_xmList, XmNwidth, right > 0 ? right - left + 100 : 530, nullptr);
 	#endif
 	return me;
 }
 
-GuiList GuiList_createShown (GuiForm parent, int left, int right, int top, int bottom, bool allowMultipleSelection, const wchar_t *header) {
+GuiList GuiList_createShown (GuiForm parent, int left, int right, int top, int bottom, bool allowMultipleSelection, const char32 *header) {
 	GuiList me = GuiList_create (parent, left, right, top, bottom, allowMultipleSelection, header);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
-void structGuiList :: f_deleteAllItems () {
-	GuiControlBlockValueChangedCallbacks block (this);
+void GuiList_deleteAllItems (GuiList me) {
+	GuiControlBlockValueChangedCallbacks block (me);
 	#if gtk
-		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget)));
+		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (my d_widget)));
 		gtk_list_store_clear (list_store);
 	#elif cocoa
-        GuiCocoaList *list = (GuiCocoaList *) d_widget;
-        [list.contents removeAllObjects];
-        [list.tableView reloadData];
+        GuiCocoaList *list = (GuiCocoaList *) my d_widget;
+        [list. contents   removeAllObjects];
+        [list. tableView   reloadData];
 	#elif win
-		ListBox_ResetContent (d_widget -> window);
+		ListBox_ResetContent (my d_widget -> window);
 	#elif mac
-		_GuiMac_clipOnParent (d_widget);
-		LDelRow (0, 0, d_macListHandle);
+		_GuiMac_clipOnParent (my d_widget);
+		LDelRow (0, 0, my d_macListHandle);
 		GuiMac_clipOff ();
 	#endif
 }
 
-void structGuiList :: f_deleteItem (long position) {
-	GuiControlBlockValueChangedCallbacks block (this);
+void GuiList_deleteItem (GuiList me, long position) {
+	GuiControlBlockValueChangedCallbacks block (me);
 	#if gtk
 		GtkTreeIter iter;
-		GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget));
-		if (gtk_tree_model_iter_nth_child (tree_model, & iter, NULL, (gint) (position - 1))) {
+		GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (my d_widget));
+		if (gtk_tree_model_iter_nth_child (tree_model, & iter, nullptr, (gint) (position - 1))) {
 			gtk_list_store_remove (GTK_LIST_STORE (tree_model), & iter);
 		}
 	#elif cocoa
-		GuiCocoaList *list = (GuiCocoaList *) d_widget;
+		GuiCocoaList *list = (GuiCocoaList *) my d_widget;
 		[list. contents   removeObjectAtIndex: position - 1];
 		[list. tableView   reloadData];
 	#elif win
-		ListBox_DeleteString (d_widget -> window, position - 1);
+		ListBox_DeleteString (my d_widget -> window, position - 1);
 	#elif mac
-		_GuiMac_clipOnParent (d_widget);
-		LDelRow (1, position - 1, d_macListHandle);
+		_GuiMac_clipOnParent (my d_widget);
+		LDelRow (1, position - 1, my d_macListHandle);
 		GuiMac_clipOff ();
-		long n = (** d_macListHandle). dataBounds. bottom;
-		XtVaSetValues (d_widget, XmNheight, n * CELL_HEIGHT, NULL);
+		long n = (** my d_macListHandle). dataBounds. bottom;
+		XtVaSetValues (my d_widget, XmNheight, n * CELL_HEIGHT, nullptr);
 	#endif
 }
 
-void structGuiList :: f_deselectAllItems () {
-	GuiControlBlockValueChangedCallbacks block (this);
+void GuiList_deselectAllItems (GuiList me) {
+	GuiControlBlockValueChangedCallbacks block (me);
 	#if gtk
-		GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (d_widget));
+		GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (my d_widget));
 		gtk_tree_selection_unselect_all (selection);
 	#elif cocoa
-		GuiCocoaList *list = (GuiCocoaList *) d_widget;
-		[list.tableView deselectAll:nil];
+		GuiCocoaList *list = (GuiCocoaList *) my d_widget;
+		[list. tableView   deselectAll: nil];
 	#elif win
-		ListBox_SetSel (d_widget -> window, False, -1);
+		ListBox_SetSel (my d_widget -> window, False, -1);
 	#elif mac
-		long n = (** d_macListHandle). dataBounds. bottom;
+		long n = (** my d_macListHandle). dataBounds. bottom;
 		Cell cell; cell.h = 0;
-		_GuiMac_clipOnParent (d_widget);
-		for (long i = 0; i < n; i ++) { cell.v = i; LSetSelect (false, cell, d_macListHandle); }
+		_GuiMac_clipOnParent (my d_widget);
+		for (long i = 0; i < n; i ++) { cell.v = i; LSetSelect (false, cell, my d_macListHandle); }
 		GuiMac_clipOff ();
 	#endif
 }
 
-void structGuiList :: f_deselectItem (long position) {
-	GuiControlBlockValueChangedCallbacks block (this);
+void GuiList_deselectItem (GuiList me, long position) {
+	GuiControlBlockValueChangedCallbacks block (me);
 	#if gtk
-		GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (d_widget));
-/*		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget)));
+		GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (my d_widget));
+/*		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (my d_widget)));
 		GtkTreePath *path = gtk_tree_path_new_from_indices ((gint) position);*/
 		GtkTreeIter iter;
 //		gtk_tree_model_get_iter (GTK_TREE_MODEL (list_store), & iter, path);
 //		gtk_tree_path_free (path);
-		GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget));
-		if (gtk_tree_model_iter_nth_child (tree_model, & iter, NULL, (gint) (position - 1))) {
+		GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (my d_widget));
+		if (gtk_tree_model_iter_nth_child (tree_model, & iter, nullptr, (gint) (position - 1))) {
 			gtk_tree_selection_unselect_iter (selection, & iter);
 		}
 	#elif cocoa
-		GuiCocoaList *list = (GuiCocoaList *) d_widget;
+		GuiCocoaList *list = (GuiCocoaList *) my d_widget;
 		[list. tableView   deselectRow: position - 1];
 	#elif win
-		ListBox_SetSel (d_widget -> window, False, position - 1);
+		ListBox_SetSel (my d_widget -> window, False, position - 1);
 	#elif mac
 		Cell cell;
 		cell. h = 0;
 		cell. v = position - 1; 
-		_GuiMac_clipOnParent (d_widget);
-		LSetSelect (false, cell, d_macListHandle);
+		_GuiMac_clipOnParent (my d_widget);
+		LSetSelect (false, cell, my d_macListHandle);
 		GuiMac_clipOff ();
 	#endif
 }
 
-long * structGuiList :: f_getSelectedPositions (long *numberOfSelectedPositions) {
+long * GuiList_getSelectedPositions (GuiList me, long *numberOfSelectedPositions) {
 	*numberOfSelectedPositions = 0;
-	long *selectedPositions = NULL;
+	long *selectedPositions = nullptr;
 	#if gtk
-		GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (d_widget));
-		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget)));
+		GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (my d_widget));
+		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (my d_widget)));
 		int n = gtk_tree_selection_count_selected_rows (selection);
 		if (n > 0) {
 			GList *list = gtk_tree_selection_get_selected_rows (selection, (GtkTreeModel **) & list_store);
 			long ipos = 1;
 			*numberOfSelectedPositions = n;
 			selectedPositions = NUMvector <long> (1, *numberOfSelectedPositions);
-			Melder_assert (selectedPositions != NULL);
-			for (GList *l = g_list_first (list); l != NULL; l = g_list_next (l)) {
+			Melder_assert (selectedPositions);
+			for (GList *l = g_list_first (list); l != nullptr; l = g_list_next (l)) {
 				gint *index = gtk_tree_path_get_indices ((GtkTreePath *) l -> data);
 				selectedPositions [ipos] = index [0] + 1;
 				ipos ++;
 			}
-			g_list_foreach (list, (GFunc) gtk_tree_path_free, NULL);
+			g_list_foreach (list, (GFunc) gtk_tree_path_free, nullptr);
 			g_list_free (list);
 		}
 		return selectedPositions;
 	#elif cocoa
-		GuiCocoaList *list = (GuiCocoaList *) d_widget;
+		GuiCocoaList *list = (GuiCocoaList *) my d_widget;
 		NSIndexSet *indexSet = [list. tableView   selectedRowIndexes];
 		*numberOfSelectedPositions = 0;
 		selectedPositions = NUMvector <long> (1, [indexSet count]);   
@@ -612,29 +613,29 @@ long * structGuiList :: f_getSelectedPositions (long *numberOfSelectedPositions)
 			currentIndex = [indexSet   indexGreaterThanIndex: currentIndex];
 		}
 	#elif win
-		int n = ListBox_GetSelCount (d_widget -> window), *indices;
+		int n = ListBox_GetSelCount (my d_widget -> window), *indices;
 		if (n == 0) {
 			return selectedPositions;
 		}
 		if (n == -1) {   // single selection
-			int selection = ListBox_GetCurSel (d_widget -> window);
+			int selection = ListBox_GetCurSel (my d_widget -> window);
 			if (selection == -1) return False;
 			n = 1;
 			indices = Melder_calloc_f (int, n);
 			indices [0] = selection;
 		} else {
 			indices = Melder_calloc_f (int, n);
-			ListBox_GetSelItems (d_widget -> window, n, indices);
+			ListBox_GetSelItems (my d_widget -> window, n, indices);
 		}
 		*numberOfSelectedPositions = n;
 		selectedPositions = NUMvector <long> (1, *numberOfSelectedPositions);
-		Melder_assert (selectedPositions != NULL);
+		Melder_assert (selectedPositions);
 		for (long ipos = 1; ipos <= *numberOfSelectedPositions; ipos ++) {
 			selectedPositions [ipos] = indices [ipos - 1] + 1;   // convert from zero-based list of zero-based indices
 		}
 		Melder_free (indices);
 	#elif mac
-		long n = (** d_macListHandle). dataBounds. bottom;
+		long n = (** my d_macListHandle). dataBounds. bottom;
 		Cell cell; cell.h = 0;
 		if (n < 1) {
 			return selectedPositions;
@@ -642,37 +643,37 @@ long * structGuiList :: f_getSelectedPositions (long *numberOfSelectedPositions)
 		selectedPositions = NUMvector <long> (1, n);   // probably too big (ergo, probably reallocable), but the caller will throw it away anyway
 		for (long i = 1; i <= n; i ++) {
 			cell. v = i - 1;
-			if (LGetSelect (false, & cell, d_macListHandle)) {
+			if (LGetSelect (false, & cell, my d_macListHandle)) {
 				selectedPositions [++ *numberOfSelectedPositions] = i;
 			}
 		}
 		if (*numberOfSelectedPositions == 0) {
 			NUMvector_free (selectedPositions, 1);
-			selectedPositions = NULL;
+			selectedPositions = nullptr;
 		}
 	#endif
 	return selectedPositions;
 }
 
-long structGuiList :: f_getBottomPosition () {
+long GuiList_getBottomPosition (GuiList me) {
 	#if gtk
 		// TODO
 		return 1;
 	#elif cocoa
 		return 1;   // TODO
 	#elif win
-		long bottom = ListBox_GetTopIndex (d_widget -> window) + d_widget -> height / ListBox_GetItemHeight (d_widget -> window, 0);
+		long bottom = ListBox_GetTopIndex (my d_widget -> window) + my d_widget -> height / ListBox_GetItemHeight (my d_widget -> window, 0);
 		if (bottom < 1) bottom = 1;
-		long n = ListBox_GetCount (d_widget -> window);
+		long n = ListBox_GetCount (my d_widget -> window);
 		if (bottom > n) bottom = n;
 		return bottom;
 	#elif mac
-		Melder_assert (d_widget -> parent -> widgetClass == xmScrolledWindowWidgetClass);
-		GuiObject clipWindow = d_widget -> parent -> motiff.scrolledWindow.clipWindow;
-		GuiObject workWindow = d_widget -> parent -> motiff.scrolledWindow.workWindow;
+		Melder_assert (my d_widget -> parent -> widgetClass == xmScrolledWindowWidgetClass);
+		GuiObject clipWindow = my d_widget -> parent -> motiff.scrolledWindow.clipWindow;
+		GuiObject workWindow = my d_widget -> parent -> motiff.scrolledWindow.workWindow;
 		long top = (clipWindow -> rect.top - workWindow -> rect.top + 5) / CELL_HEIGHT + 1;
 		long visible = (clipWindow -> rect.bottom - clipWindow -> rect.top - 5) / CELL_HEIGHT + 1;
-		long n = (** d_macListHandle). dataBounds. bottom;
+		long n = (** my d_macListHandle). dataBounds. bottom;
 		if (visible > n) visible = n;
 		long bottom = top + visible - 1;
 		if (bottom < 1) bottom = 1;
@@ -681,62 +682,62 @@ long structGuiList :: f_getBottomPosition () {
 	#endif
 }
 
-long structGuiList :: f_getNumberOfItems () {
+long GuiList_getNumberOfItems (GuiList me) {
 	long numberOfItems = 0;
 	#if gtk
-		GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget));
-		numberOfItems = gtk_tree_model_iter_n_children (model, NULL); 
+		GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (my d_widget));
+		numberOfItems = gtk_tree_model_iter_n_children (model, nullptr);
 	#elif cocoa
-		GuiCocoaList *list = (GuiCocoaList *) d_widget;
+		GuiCocoaList *list = (GuiCocoaList *) my d_widget;
 		numberOfItems = [[list contents] count];
 	#elif win
-		numberOfItems = ListBox_GetCount (d_widget -> window);
+		numberOfItems = ListBox_GetCount (my d_widget -> window);
 	#elif mac
-		numberOfItems = (** d_macListHandle). dataBounds. bottom;
+		numberOfItems = (** my d_macListHandle). dataBounds. bottom;
 	#endif
 	return numberOfItems;
 }
 
-long structGuiList :: f_getTopPosition () {
+long GuiList_getTopPosition (GuiList me) {
 	#if gtk
 		// TODO
 		return 1;
 	#elif cocoa
 		return 1;   // TODO
 	#elif win
-		long top = ListBox_GetTopIndex (d_widget -> window);
+		long top = ListBox_GetTopIndex (my d_widget -> window);
 		if (top < 1) top = 1;
-		long n = ListBox_GetCount (d_widget -> window);
+		long n = ListBox_GetCount (my d_widget -> window);
 		if (top > n) top = 0;
 		return top;
 	#elif mac
-		Melder_assert (d_widget -> parent -> widgetClass == xmScrolledWindowWidgetClass);
-		GuiObject clipWindow = d_widget -> parent -> motiff.scrolledWindow.clipWindow;
-		GuiObject workWindow = d_widget -> parent -> motiff.scrolledWindow.workWindow;
+		Melder_assert (my d_widget -> parent -> widgetClass == xmScrolledWindowWidgetClass);
+		GuiObject clipWindow = my d_widget -> parent -> motiff.scrolledWindow.clipWindow;
+		GuiObject workWindow = my d_widget -> parent -> motiff.scrolledWindow.workWindow;
 		long top = (clipWindow -> rect.top - workWindow -> rect.top + 5) / CELL_HEIGHT + 1;
 		if (top < 1) top = 1;
-		long n = (** d_macListHandle). dataBounds. bottom;
+		long n = (** my d_macListHandle). dataBounds. bottom;
 		if (top > n) top = 0;
 		return top;
 	#endif
 }
 
-void structGuiList :: f_insertItem (const wchar_t *itemText, long position) {
-	GuiControlBlockValueChangedCallbacks block (this);
+void GuiList_insertItem (GuiList me, const char32 *itemText /* cattable */, long position) {
+	GuiControlBlockValueChangedCallbacks block (me);
 	/*
 	 * 'position' is the position of the new item in the list after insertion:
 	 * a value of 1 therefore puts the new item at the top of the list;
 	 * a value of 0 is special: the item is put at the bottom of the list.
 	 */
 	#if gtk
-		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget)));
-		gtk_list_store_insert_with_values (list_store, NULL, (gint) position - 1, COLUMN_STRING, Melder_peekWcsToUtf8 (itemText), -1);
+		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (my d_widget)));
+		gtk_list_store_insert_with_values (list_store, nullptr, (gint) position - 1, COLUMN_STRING, Melder_peek32to8 (itemText), -1);
 		// TODO: Tekst opsplitsen
 		// does GTK know the '0' trick?
-		// it does know about NULL, to append in another function
+		// it does know about nullptr, to append in another function
 	#elif cocoa
-		GuiCocoaList *list = (GuiCocoaList *) d_widget;
-		NSString *nsString = [[NSString alloc] initWithUTF8String: Melder_peekWcsToUtf8 (itemText)];
+		GuiCocoaList *list = (GuiCocoaList *) my d_widget;
+		NSString *nsString = [[NSString alloc] initWithUTF8String: Melder_peek32to8 (itemText)];
 		if (position)
 			[[list contents]   insertObject: nsString   atIndex: position - 1];   // cocoa lists start with item 0
 		else
@@ -746,131 +747,131 @@ void structGuiList :: f_insertItem (const wchar_t *itemText, long position) {
 		[[list tableView] reloadData];
 	#elif win
 		if (position)
-			ListBox_InsertString (d_widget -> window, position - 1, itemText);   // win lists start with item 0
+			ListBox_InsertString (my d_widget -> window, position - 1, Melder_peek32toW (itemText));   // win lists start with item 0
 		else
-			ListBox_AddString (d_widget -> window, itemText);   // insert at end
+			ListBox_AddString (my d_widget -> window, Melder_peek32toW (itemText));   // insert at end
 	#elif mac
-		long n = (** d_macListHandle). dataBounds. bottom;
+		long n = (** my d_macListHandle). dataBounds. bottom;
 		if (position == 0)
 			position = n + 1;   // insert at end
 		Cell cell;
 		cell.h = 0; cell. v = position - 1;   // mac lists start with item 0
-		_GuiMac_clipOnParent (d_widget);
-		LAddRow (1, position - 1, d_macListHandle);
-		const char *itemText_utf8 = Melder_peekWcsToUtf8 (itemText);   // although defProc will convert again...
-		LSetCell (itemText_utf8, (short) strlen (itemText_utf8), cell, d_macListHandle);
-		(** d_macListHandle). visible. bottom = n + 1;
-		_GuiMac_clipOffInvalid (d_widget);
-		XtVaSetValues (d_widget, XmNheight, (n + 1) * CELL_HEIGHT, NULL);
+		_GuiMac_clipOnParent (my d_widget);
+		LAddRow (1, position - 1, my d_macListHandle);
+		const char *itemText_utf8 = Melder_peek32to8 (itemText);   // although defProc will convert again...
+		LSetCell (itemText_utf8, (short) strlen (itemText_utf8), cell, my d_macListHandle);
+		(** my d_macListHandle). visible. bottom = n + 1;
+		_GuiMac_clipOffInvalid (my d_widget);
+		XtVaSetValues (my d_widget, XmNheight, (n + 1) * CELL_HEIGHT, nullptr);
 	#endif
 }
 
-void structGuiList :: f_replaceItem (const wchar_t *itemText, long position) {
-	GuiControlBlockValueChangedCallbacks block (this);
+void GuiList_replaceItem (GuiList me, const char32 *itemText, long position) {
+	GuiControlBlockValueChangedCallbacks block (me);
 	#if gtk
 		GtkTreeIter iter;
-		GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget));
-		if (gtk_tree_model_iter_nth_child (tree_model, & iter, NULL, (gint) (position - 1))) {
-			gtk_list_store_set (GTK_LIST_STORE (tree_model), & iter, COLUMN_STRING, Melder_peekWcsToUtf8 (itemText), -1);
+		GtkTreeModel *tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (my d_widget));
+		if (gtk_tree_model_iter_nth_child (tree_model, & iter, nullptr, (gint) (position - 1))) {
+			gtk_list_store_set (GTK_LIST_STORE (tree_model), & iter, COLUMN_STRING, Melder_peek32to8 (itemText), -1);
 		}
 /*
 		GtkTreePath *path = gtk_tree_path_new_from_indices ((gint) position);
 		GtkTreeIter iter;
-		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget)));
+		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (my d_widget)));
 		gtk_tree_model_get_iter (GTK_TREE_MODEL (list_store), & iter, path);
 		gtk_tree_path_free (path);*/
-		// gtk_list_store_set (list_store, & iter, 0, Melder_peekWcsToUtf8 (itemText), -1);
+		// gtk_list_store_set (list_store, & iter, 0, Melder_peek32to8 (itemText), -1);
 		// TODO: Tekst opsplitsen
 	#elif cocoa
-		GuiCocoaList *list = (GuiCocoaList *) d_widget;
-		NSString *nsString = [[NSString alloc] initWithUTF8String: Melder_peekWcsToUtf8 (itemText)];
+		GuiCocoaList *list = (GuiCocoaList *) my d_widget;
+		NSString *nsString = [[NSString alloc] initWithUTF8String: Melder_peek32to8 (itemText)];
 		[[list contents]   replaceObjectAtIndex: position - 1   withObject: nsString];
 		[nsString release];
 		[[list tableView] reloadData];
 	#elif win
 		long nativePosition = position - 1;   // convert from 1-based to zero-based
-		ListBox_DeleteString (d_widget -> window, nativePosition);
-		ListBox_InsertString (d_widget -> window, nativePosition, itemText);
+		ListBox_DeleteString (my d_widget -> window, nativePosition);
+		ListBox_InsertString (my d_widget -> window, nativePosition, Melder_peek32toW (itemText));
 	#elif mac
-		_GuiMac_clipOnParent (d_widget);
+		_GuiMac_clipOnParent (my d_widget);
 		Cell cell;
 		cell.h = 0;
 		cell.v = position - 1;
-		const char *itemText_utf8 = Melder_peekWcsToUtf8 (itemText);
-		LSetCell (itemText_utf8, strlen (itemText_utf8), cell, d_macListHandle);
-		LDraw (cell, d_macListHandle);
+		const char *itemText_utf8 = Melder_peek32to8 (itemText);
+		LSetCell (itemText_utf8, strlen (itemText_utf8), cell, my d_macListHandle);
+		LDraw (cell, my d_macListHandle);
 		GuiMac_clipOff ();
 	#endif
 }
 
-void structGuiList :: f_selectItem (long position) {
-	GuiControlBlockValueChangedCallbacks block (this);
+void GuiList_selectItem (GuiList me, long position) {
+	GuiControlBlockValueChangedCallbacks block (me);
 	#if gtk
-		GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (d_widget));
+		GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (my d_widget));
 		GtkTreePath *path = gtk_tree_path_new_from_indices ((gint) position - 1, -1);
 		gtk_tree_selection_select_path (selection, path);
 		gtk_tree_path_free (path);
 
 // TODO: check of het bovenstaande werkt, dan kan dit weg
-//		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget)));
+//		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (my d_widget)));
 //		GtkTreePath *path = gtk_tree_path_new_from_indices ((gint) position);
 //		GtkTreeIter iter;
 //		gtk_tree_model_get_iter (GTK_TREE_MODEL (list_store), & iter, path);
 //		gtk_tree_selection_select_iter (selection, & iter);
 	#elif cocoa
 		NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndex: position - 1];
-		GuiCocoaList *list = (GuiCocoaList *) d_widget;
-		[[list tableView]   selectRowIndexes: indexSet   byExtendingSelection: d_allowMultipleSelection];
+		GuiCocoaList *list = (GuiCocoaList *) my d_widget;
+		[[list tableView]   selectRowIndexes: indexSet   byExtendingSelection: my d_allowMultipleSelection];
 		[indexSet release];
 	#elif win
-		if (! d_allowMultipleSelection) {
-			ListBox_SetCurSel (d_widget -> window, position - 1);
+		if (! my d_allowMultipleSelection) {
+			ListBox_SetCurSel (my d_widget -> window, position - 1);
 		} else {
-			ListBox_SetSel (d_widget -> window, True, position - 1);
+			ListBox_SetSel (my d_widget -> window, True, position - 1);
 		}
 	#elif mac
 		Cell cell; cell.h = 0;
-		_GuiMac_clipOnParent (d_widget);
-		if (! d_allowMultipleSelection) {
-			long n = (** d_macListHandle). dataBounds. bottom;
+		_GuiMac_clipOnParent (my d_widget);
+		if (! my d_allowMultipleSelection) {
+			long n = (** my d_macListHandle). dataBounds. bottom;
 			for (long i = 0; i < n; i ++) if (i != position - 1) {
 				cell.v = i;
-				LSetSelect (false, cell, d_macListHandle);
+				LSetSelect (false, cell, my d_macListHandle);
 			}
 		}
 		cell.v = position - 1; 
-		LSetSelect (true, cell, d_macListHandle);
+		LSetSelect (true, cell, my d_macListHandle);
 		GuiMac_clipOff ();
 	#endif
 }
 
-void structGuiList :: f_setDoubleClickCallback (void (*callback) (void *boss, GuiListEvent event), void *boss) {
-	d_doubleClickCallback = callback;
-	d_doubleClickBoss = boss;
+void GuiList_setDoubleClickCallback (GuiList me, void (*callback) (void *boss, GuiListEvent event), void *boss) {
+	my d_doubleClickCallback = callback;
+	my d_doubleClickBoss = boss;
 }
 
-void structGuiList :: f_setSelectionChangedCallback (void (*callback) (void *boss, GuiListEvent event), void *boss) {
-	d_selectionChangedCallback = callback;
-	d_selectionChangedBoss = boss;
+void GuiList_setSelectionChangedCallback (GuiList me, void (*callback) (void *boss, GuiListEvent event), void *boss) {
+	my d_selectionChangedCallback = callback;
+	my d_selectionChangedBoss = boss;
 }
 
-void structGuiList :: f_setTopPosition (long topPosition) {
-	//Melder_casual ("Set top position %ld", topPosition);
+void GuiList_setTopPosition (GuiList me, long topPosition) {
+	trace (U"Set top position ", topPosition);
 	#if gtk
-//		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (d_widget)));
+//		GtkListStore *list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (my md_widget)));
 		GtkTreePath *path = gtk_tree_path_new_from_indices ((gint) topPosition);
-		gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (d_widget), path, NULL, FALSE, 0.0, 0.0);
+		gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (my d_widget), path, nullptr, false, 0.0, 0.0);
 		gtk_tree_path_free (path);
 	#elif cocoa
 	 // TODO: implement
 	#elif win
-		ListBox_SetTopIndex (d_widget -> window, topPosition - 1);
+		ListBox_SetTopIndex (my d_widget -> window, topPosition - 1);
 	#elif mac
-		//_GuiMac_clipOnParent (d_widget);
-		//LScroll (0, topPosition - (** d_macListHandle). visible. top - 1, d_macListHandle);   // TODO: implement
+		//_GuiMac_clipOnParent (my d_widget);
+		//LScroll (0, topPosition - (** d_macListHandle). visible. top - 1, my d_macListHandle);   // TODO: implement
 		//GuiMac_clipOff ();
 		//my d_scrolled -> motiff.scrolledWindow.verticalBar;   // TODO: implement
-		XtVaSetValues (d_widget, XmNy, - (topPosition - 1) * CELL_HEIGHT, NULL);
+		XtVaSetValues (my d_widget, XmNy, - (topPosition - 1) * CELL_HEIGHT, nullptr);
 	#endif
 }
 
diff --git a/sys/GuiMenu.cpp b/sys/GuiMenu.cpp
index cc5001b..c89798f 100644
--- a/sys/GuiMenu.cpp
+++ b/sys/GuiMenu.cpp
@@ -1,6 +1,6 @@
 /* GuiMenu.cpp
  *
- * Copyright (C) 1992-2012,2013 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brausse, 2013 Tom Naughton
+ * Copyright (C) 1992-2012,2013,2015 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brausse, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,27 +22,27 @@
 Thing_implement (GuiMenu, GuiThing, 0);
 
 void structGuiMenu :: v_destroy () {
-	forget (d_cascadeButton);
-	forget (d_menuItem);
-	GuiMenu_Parent :: v_destroy ();   // if (d_widget) { _GuiObject_setUserData (d_widget, NULL); GuiObject_destroy (d_widget); }
+	forget (our d_cascadeButton);
+	forget (our d_menuItem);
+	our GuiMenu_Parent :: v_destroy ();   // if (d_widget) { _GuiObject_setUserData (d_widget, nullptr); GuiObject_destroy (d_widget); }
 }
 
 #if gtk
 	static void _guiGtkMenu_destroyCallback (GuiObject widget, gpointer void_me) {
 		(void) void_me;
 		GuiMenu me = (GuiMenu) _GuiObject_getUserData (widget);
-		trace ("destroying GuiMenu %p", me);
+		trace (U"destroying GuiMenu ", Melder_pointer (me));
 		if (! me) return;   // we could be destroying me
-		my d_widget = NULL;   // undangle
-		if (my d_cascadeButton) my d_cascadeButton -> d_widget = NULL;   // undangle
-		if (my d_menuItem) my d_menuItem -> d_widget = NULL;   // undangle
+		my d_widget = nullptr;   // undangle
+		if (my d_cascadeButton) my d_cascadeButton -> d_widget = nullptr;   // undangle
+		if (my d_menuItem) my d_menuItem -> d_widget = nullptr;   // undangle
 		forget (me);
 	}
 	static void _guiGtkMenuCascadeButton_destroyCallback (GuiObject widget, gpointer void_me) {
 		(void) void_me;
 		GuiMenu me = (GuiMenu) _GuiObject_getUserData (widget);
 		if (! me) return;
-		trace ("destroying GuiButton %p", my d_cascadeButton);
+		trace (U"destroying GuiButton ", Melder_pointer (my d_cascadeButton));
 		gtk_widget_destroy (GTK_WIDGET (my d_widget));
 	}
 #elif cocoa
@@ -69,9 +69,9 @@ void structGuiMenu :: v_destroy () {
 			if (Melder_isTracing) {
 				for (NSUInteger i = 0; i < [characters length]; i ++) {
 					unichar kar = [characters characterAtIndex: 0];
-					trace ("character [%d]: %d", (int) i, (int) kar);
+					trace (U"character [", i, U"]: ", (int) kar);
 				}
-				trace ("modifiers: %d", (int) [nsEvent modifierFlags]);
+				trace (U"modifiers: ", [nsEvent modifierFlags]);
 			}
 			if (character == NSTabCharacter) {
 				NSWindow *cocoaKeyWindow = [NSApp keyWindow];
@@ -79,10 +79,10 @@ void structGuiMenu :: v_destroy () {
 					GuiWindow window = (GuiWindow) [(GuiCocoaWindow *) cocoaKeyWindow userData];
 					if (window -> d_tabCallback) {
 						try {
-							struct structGuiMenuItemEvent event = { NULL, 0 };
+							struct structGuiMenuItemEvent event = { nullptr, 0 };
 							window -> d_tabCallback (window -> d_tabBoss, & event);
 						} catch (MelderError) {
-							Melder_flushError ("Tab key not completely handled.");
+							Melder_flushError (U"Tab key not completely handled.");
 						}
 						return;
 					}
@@ -104,10 +104,10 @@ void structGuiMenu :: v_destroy () {
 						 */
 						if (window -> d_shiftTabCallback) {
 							try {
-								struct structGuiMenuItemEvent event = { NULL, 0 };
+								struct structGuiMenuItemEvent event = { nullptr, 0 };
 								window -> d_shiftTabCallback (window -> d_shiftTabBoss, & event);
 							} catch (MelderError) {
-								Melder_flushError ("Tab key not completely handled.");
+								Melder_flushError (U"Tab key not completely handled.");
 							}
 							return;
 						}
@@ -128,10 +128,10 @@ void structGuiMenu :: v_destroy () {
 					GuiWindow window = (GuiWindow) [(GuiCocoaWindow *) cocoaKeyWindow userData];
 					if (([nsEvent modifierFlags] & NSAlternateKeyMask) && window -> d_optionBackspaceCallback) {
 						try {
-							struct structGuiMenuItemEvent event = { NULL, 0 };
+							struct structGuiMenuItemEvent event = { nullptr, 0 };
 							window -> d_optionBackspaceCallback (window -> d_optionBackspaceBoss, & event);
 						} catch (MelderError) {
-							Melder_flushError ("Option-Backspace not completely handled.");
+							Melder_flushError (U"Option-Backspace not completely handled.");
 						}
 						return;
 					}
@@ -157,7 +157,7 @@ void structGuiMenu :: v_destroy () {
 		for (NSUInteger i = 1; i <= [fileNames count]; i ++) {
 			NSString *cocoaFileName = [fileNames objectAtIndex: i - 1];
 			structMelderFile file = { 0 };
-			Melder_8bitFileRepresentationToWcs_inline ([cocoaFileName UTF8String], file. path);
+			Melder_8bitFileRepresentationToStr32_inline ([cocoaFileName UTF8String], file. path);
 			if (theOpenDocumentCallback)
 				theOpenDocumentCallback (& file);
 		}
@@ -168,69 +168,69 @@ void structGuiMenu :: v_destroy () {
 		(void) void_me;
 		(void) call;
 		GuiMenu me = (GuiMenu) _GuiObject_getUserData (widget);
-		trace ("destroying GuiMenu %p", me);
+		trace (U"destroying GuiMenu ", Melder_pointer (me));
 		if (! me) return;   // we could be destroying me
-		my d_widget = NULL;   // undangle
-		if (my d_cascadeButton) my d_cascadeButton -> d_widget = NULL;   // undangle
-		if (my d_menuItem) my d_menuItem -> d_widget = NULL;   // undangle
+		my d_widget = nullptr;   // undangle
+		if (my d_cascadeButton) my d_cascadeButton -> d_widget = nullptr;   // undangle
+		if (my d_menuItem) my d_menuItem -> d_widget = nullptr;   // undangle
 		forget (me);
 	}
 #endif
 
 void structGuiMenu :: v_hide () {
 	#if gtk
-		gtk_widget_hide (GTK_WIDGET (d_gtkMenuTitle));
+		gtk_widget_hide (GTK_WIDGET (our d_gtkMenuTitle));
 	#elif cocoa
-		[d_cocoaMenuButton setHidden: YES];
+		[our d_cocoaMenuButton   setHidden: YES];
 	#elif motif
-		XtUnmanageChild (d_xmMenuTitle);
+		XtUnmanageChild (our d_xmMenuTitle);
 	#endif
 }
 
 void structGuiMenu :: v_setSensitive (bool sensitive) {
 	#if gtk
-		gtk_widget_set_sensitive (GTK_WIDGET (d_gtkMenuTitle), sensitive);
+		gtk_widget_set_sensitive (GTK_WIDGET (our d_gtkMenuTitle), sensitive);
 	#elif cocoa
-		[d_cocoaMenuButton setEnabled: sensitive];
+		[our d_cocoaMenuButton   setEnabled: sensitive];
 	#elif motif
-		XtSetSensitive (d_xmMenuTitle, sensitive);
+		XtSetSensitive (our d_xmMenuTitle, sensitive);
 	#endif
 }
 
 void structGuiMenu :: v_show () {
-	trace ("begin");
+	trace (U"begin");
 	#if gtk
-		gtk_widget_show (GTK_WIDGET (d_gtkMenuTitle));
+		gtk_widget_show (GTK_WIDGET (our d_gtkMenuTitle));
 	#elif cocoa
-		[d_cocoaMenuButton setHidden: NO];
+		[our d_cocoaMenuButton   setHidden: NO];
 	#elif motif
-		XtManageChild (d_xmMenuTitle);
+		XtManageChild (our d_xmMenuTitle);
 	#endif
-	trace ("end");
+	trace (U"end");
 }
 
-void structGuiMenu :: f_empty () {
+void GuiMenu_empty (GuiMenu me) {
 	#if gtk
-		trace ("begin");
-		Melder_assert (d_widget);
+		trace (U"begin");
+		Melder_assert (my d_widget);
 		/*
 		 * Destroy my widget, but prevent forgetting me.
 		 */
-		_GuiObject_setUserData (d_widget, NULL);
-		gtk_widget_destroy (GTK_WIDGET (d_widget));
+		_GuiObject_setUserData (my d_widget, nullptr);
+		gtk_widget_destroy (GTK_WIDGET (my d_widget));
 
-		d_widget = gtk_menu_new ();
-		trace ("shell %p", d_shell);
-		Melder_assert (d_shell);
-		trace ("shell class name %ls", Thing_className (d_shell));
-		Melder_assert (d_shell -> classInfo == classGuiWindow);
-		Melder_assert (((GuiWindow) d_shell) -> d_gtkMenuBar);
-		GtkAccelGroup *ag = (GtkAccelGroup *) g_object_get_data (G_OBJECT (((GuiWindow) d_shell) -> d_gtkMenuBar), "accel-group");
-		gtk_menu_set_accel_group (GTK_MENU (d_widget), ag);
+		my d_widget = gtk_menu_new ();
+		trace (U"shell ", Melder_pointer (my d_shell));
+		Melder_assert (my d_shell);
+		trace (U"shell class name ", Thing_className (my d_shell));
+		Melder_assert (my d_shell -> classInfo == classGuiWindow);
+		Melder_assert (((GuiWindow) my d_shell) -> d_gtkMenuBar);
+		GtkAccelGroup *ag = (GtkAccelGroup *) g_object_get_data (G_OBJECT (((GuiWindow) my d_shell) -> d_gtkMenuBar), "accel-group");
+		gtk_menu_set_accel_group (GTK_MENU (my d_widget), ag);
 		Melder_assert (ag);
-		gtk_menu_item_set_submenu (GTK_MENU_ITEM (d_gtkMenuTitle), GTK_WIDGET (d_widget));
-		gtk_widget_show (GTK_WIDGET (d_widget));
-		_GuiObject_setUserData (d_widget, this);
+		gtk_menu_item_set_submenu (GTK_MENU_ITEM (my d_gtkMenuTitle), GTK_WIDGET (my d_widget));
+		gtk_widget_show (GTK_WIDGET (my d_widget));
+		_GuiObject_setUserData (my d_widget, me);
 	#elif cocoa
 	#elif motif
 	#endif
@@ -241,50 +241,50 @@ void structGuiMenu :: f_empty () {
 		GuiMenu d_userData;
 	}
 	- (void) dealloc {   // override
-		GuiMenu me = d_userData;
+		GuiMenu me = self -> d_userData;
 		forget (me);
-		trace ("deleting a menu button");
+		trace (U"deleting a menu button");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
-		return d_userData;
+		return self -> d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiMenu));
-		d_userData = static_cast <GuiMenu> (userData);
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiMenu));
+		self -> d_userData = static_cast <GuiMenu> (userData);
 	}
 	@end
 	@implementation GuiCocoaMenu {
 		GuiMenu d_userData;
 	}
 	- (void) dealloc {   // override
-		GuiMenu me = d_userData;
+		GuiMenu me = self -> d_userData;
 		forget (me);
-		trace ("deleting a menu");
+		trace (U"deleting a menu");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
-		return d_userData;
+		return self -> d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiMenu));
-		d_userData = static_cast <GuiMenu> (userData);
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiMenu));
+		self -> d_userData = static_cast <GuiMenu> (userData);
 	}
 	@end
 #endif
 
-GuiMenu GuiMenu_createInWindow (GuiWindow window, const wchar_t *title, long flags) {
+GuiMenu GuiMenu_createInWindow (GuiWindow window, const char32 *title, uint32 flags) {
 	GuiMenu me = Thing_new (GuiMenu);
 	my d_shell = window;
 	my d_parent = window;
 	#if gtk
-		trace ("create and show the menu title");
-		my d_gtkMenuTitle = (GtkMenuItem *) gtk_menu_item_new_with_label (Melder_peekWcsToUtf8 (title));
+		trace (U"create and show the menu title");
+		my d_gtkMenuTitle = (GtkMenuItem *) gtk_menu_item_new_with_label (Melder_peek32to8 (title));
 		gtk_menu_shell_append (GTK_MENU_SHELL (window -> d_gtkMenuBar), GTK_WIDGET (my d_gtkMenuTitle));
 		if (flags & GuiMenu_INSENSITIVE)
-			gtk_widget_set_sensitive (GTK_WIDGET (my d_gtkMenuTitle), FALSE);
+			gtk_widget_set_sensitive (GTK_WIDGET (my d_gtkMenuTitle), false);
 		gtk_widget_show (GTK_WIDGET (my d_gtkMenuTitle));
-		trace ("create the menu");
+		trace (U"create the menu");
 		my d_widget = gtk_menu_new ();
 		GtkAccelGroup *ag = (GtkAccelGroup *) g_object_get_data (G_OBJECT (window -> d_gtkMenuBar), "accel-group");
 		gtk_menu_set_accel_group (GTK_MENU (my d_widget), ag);
@@ -293,24 +293,25 @@ GuiMenu GuiMenu_createInWindow (GuiWindow window, const wchar_t *title, long fla
 	#elif cocoa
 		if (! theMenuBar) {
 			int numberOfMenus = [[[NSApp mainMenu] itemArray] count];
-			trace ("Number of menus: %d.", numberOfMenus);
+			trace (U"Number of menus: ", numberOfMenus);
 			[NSApp   setDelegate: NSApp];   // the app is its own delegate
 			theMenuBar = [[NSMenu alloc] init];
 			[NSApp   setMainMenu: theMenuBar];
 		}
 		my d_cocoaMenu = [[GuiCocoaMenu alloc]
-			initWithTitle: (NSString *) Melder_peekWcsToCfstring (title)];
+			initWithTitle: (NSString *) Melder_peek32toCfstring (title)];
 		my d_widget = my d_cocoaMenu;
+		[my d_cocoaMenu   setUserData: me];
 		[my d_cocoaMenu   setAutoenablesItems: NO];
-		if (window == NULL) {
+		if (! window) {
 			/*
 			 * Install the menu in the main OS X menu bar along the top of the screen.
 			 * This is done by creating a menu item for the main menu bar,
 			 * and during applicationWillFinishLaunching installing that item.
 			 */
-            NSString *itemTitle = (NSString *) Melder_peekWcsToCfstring (title);
+            NSString *itemTitle = (NSString *) Melder_peek32toCfstring (title);
 			my d_cocoaMenuItem = [[GuiCocoaMenuItem alloc]
-				initWithTitle: itemTitle  action: NULL   keyEquivalent: @""];
+				initWithTitle: itemTitle  action: nullptr   keyEquivalent: @""];
 
 			[my d_cocoaMenuItem   setSubmenu: my d_cocoaMenu];   // the item will retain the menu...
 			[my d_cocoaMenu release];   // ... so we can release the menu already (before even returning it!)
@@ -324,10 +325,10 @@ GuiMenu GuiMenu_createInWindow (GuiWindow window, const wchar_t *title, long fla
 			int parentWidth = parentRect.size.width, parentHeight = parentRect.size.height;
 			if (window -> d_menuBarWidth == 0)
 				window -> d_menuBarWidth = -1;
-			int width = 18 + 7 * wcslen (title), height = 35 /*25*/;
+			int width = 18 + 7 * str32len (title), height = 35 /*25*/;
 			int x = window -> d_menuBarWidth, y = parentHeight + 1 - height;
             NSUInteger resizingMask = NSViewMinYMargin;
-			if (Melder_wcsequ (title, L"Help")) {
+			if (Melder_equ (title, U"Help")) {
 				x = parentWidth + 1 - width;
                 resizingMask |= NSViewMinXMargin;
 			} else {
@@ -349,7 +350,7 @@ GuiMenu GuiMenu_createInWindow (GuiWindow window, const wchar_t *title, long fla
 			/*
 			 * Apparently, Cocoa swallows title setting only if there is already a menu with a dummy item.
 			 */
-			GuiCocoaMenuItem *item = [[GuiCocoaMenuItem alloc] initWithTitle: @"-you should never get to see this-" action: NULL keyEquivalent: @""];
+			GuiCocoaMenuItem *item = [[GuiCocoaMenuItem alloc] initWithTitle: @"-you should never get to see this-" action: nullptr keyEquivalent: @""];
 			[my d_cocoaMenu   addItem: item];   // the menu will retain the item...
 			[item release];   // ... so we can release the item already
 			/*
@@ -363,27 +364,27 @@ GuiMenu GuiMenu_createInWindow (GuiWindow window, const wchar_t *title, long fla
 			 */
 			[my d_cocoaMenuButton   setMenu: my d_cocoaMenu];   // the button will retain the menu...
 			[my d_cocoaMenu   release];   // ... so we can release the menu already (before even returning it!)
-			[my d_cocoaMenuButton   setTitle: (NSString *) Melder_peekWcsToCfstring (title)];
+			[my d_cocoaMenuButton   setTitle: (NSString *) Melder_peek32toCfstring (title)];
 
 		}
 	#elif motif
-		if (window == NULL) {
-			my d_xmMenuTitle = XmCreateCascadeButton (theGuiTopMenuBar, Melder_peekWcsToUtf8 (title), NULL, 0);
-			if (wcsequ (title, L"Help"))
-				XtVaSetValues (theGuiTopMenuBar, XmNmenuHelpWidget, my d_xmMenuTitle, NULL);
-			my d_widget = XmCreatePulldownMenu (theGuiTopMenuBar, Melder_peekWcsToUtf8 (title), NULL, 0);
+		if (! window) {
+			my d_xmMenuTitle = XmCreateCascadeButton (theGuiTopMenuBar, Melder_peek32to8 (title), nullptr, 0);
+			if (str32equ (title, U"Help"))
+				XtVaSetValues (theGuiTopMenuBar, XmNmenuHelpWidget, my d_xmMenuTitle, nullptr);
+			my d_widget = XmCreatePulldownMenu (theGuiTopMenuBar, Melder_peek32to8 (title), nullptr, 0);
 			if (flags & GuiMenu_INSENSITIVE)
 				XtSetSensitive (my d_xmMenuTitle, False);
-			XtVaSetValues (my d_xmMenuTitle, XmNsubMenuId, my d_widget, NULL);
+			XtVaSetValues (my d_xmMenuTitle, XmNsubMenuId, my d_widget, nullptr);
 			XtManageChild (my d_xmMenuTitle);
 		} else {
-			my d_xmMenuTitle = XmCreateCascadeButton (window -> d_xmMenuBar, Melder_peekWcsToUtf8 (title), NULL, 0);
-			if (wcsequ (title, L"Help"))
-				XtVaSetValues (window -> d_xmMenuBar, XmNmenuHelpWidget, my d_xmMenuTitle, NULL);
-			my d_widget = XmCreatePulldownMenu (window -> d_xmMenuBar, Melder_peekWcsToUtf8 (title), NULL, 0);
+			my d_xmMenuTitle = XmCreateCascadeButton (window -> d_xmMenuBar, Melder_peek32to8 (title), nullptr, 0);
+			if (str32equ (title, U"Help"))
+				XtVaSetValues (window -> d_xmMenuBar, XmNmenuHelpWidget, my d_xmMenuTitle, nullptr);
+			my d_widget = XmCreatePulldownMenu (window -> d_xmMenuBar, Melder_peek32to8 (title), nullptr, 0);
 			if (flags & GuiMenu_INSENSITIVE)
 				XtSetSensitive (my d_xmMenuTitle, False);
-			XtVaSetValues (my d_xmMenuTitle, XmNsubMenuId, my d_widget, NULL);
+			XtVaSetValues (my d_xmMenuTitle, XmNsubMenuId, my d_widget, nullptr);
 			XtManageChild (my d_xmMenuTitle);
 		}
 		_GuiObject_setUserData (my d_widget, me);
@@ -398,7 +399,7 @@ GuiMenu GuiMenu_createInWindow (GuiWindow window, const wchar_t *title, long fla
 	return me;
 }
 
-GuiMenu GuiMenu_createInMenu (GuiMenu supermenu, const wchar_t *title, long flags) {
+GuiMenu GuiMenu_createInMenu (GuiMenu supermenu, const char32 *title, uint32 flags) {
 	GuiMenu me = Thing_new (GuiMenu);
 	my d_shell = supermenu -> d_shell;
 	my d_parent = supermenu;
@@ -407,43 +408,44 @@ GuiMenu GuiMenu_createInMenu (GuiMenu supermenu, const wchar_t *title, long flag
 	my d_menuItem -> d_parent = supermenu;
 	my d_menuItem -> d_menu = me;
 	#if gtk
-		my d_menuItem -> d_widget = gtk_menu_item_new_with_label (Melder_peekWcsToUtf8 (title));
+		my d_menuItem -> d_widget = gtk_menu_item_new_with_label (Melder_peek32to8 (title));
 		my d_widget = gtk_menu_new ();
 		GtkAccelGroup *ag = (GtkAccelGroup *) gtk_menu_get_accel_group (GTK_MENU (supermenu -> d_widget));
 		gtk_menu_set_accel_group (GTK_MENU (my d_widget), ag);
 		if (flags & GuiMenu_INSENSITIVE)
-			gtk_widget_set_sensitive (GTK_WIDGET (my d_widget), FALSE);
+			gtk_widget_set_sensitive (GTK_WIDGET (my d_widget), false);
 		gtk_menu_item_set_submenu (GTK_MENU_ITEM (my d_menuItem -> d_widget), GTK_WIDGET (my d_widget));
 		gtk_menu_shell_append (GTK_MENU_SHELL (supermenu -> d_widget), GTK_WIDGET (my d_menuItem -> d_widget));
 		gtk_widget_show (GTK_WIDGET (my d_widget));
 		gtk_widget_show (GTK_WIDGET (my d_menuItem -> d_widget));
 		_GuiObject_setUserData (my d_widget, me);
 	#elif cocoa
-		trace ("creating menu item %ls", title);
+		trace (U"creating menu item ", title);
 		NSMenuItem *item = [[NSMenuItem alloc]
-			initWithTitle: (NSString *) Melder_peekWcsToCfstring (title)
-			action: NULL
+			initWithTitle: (NSString *) Melder_peek32toCfstring (title)
+			action: nullptr
 			keyEquivalent: @""];
-		trace ("adding the item to its supermenu %p", supermenu);
+		trace (U"adding the item to its supermenu ", Melder_pointer (supermenu));
 		[supermenu -> d_cocoaMenu  addItem: item];   // the menu will retain the item...
-		trace ("release the item");
+		trace (U"release the item");
 		[item release];   // ... so we can release the item already
-		trace ("creating menu %ls", title);
+		trace (U"creating menu ", title);
 		my d_cocoaMenu = [[GuiCocoaMenu alloc]
-			initWithTitle: (NSString *) Melder_peekWcsToCfstring (title)];
-		[my d_cocoaMenu setAutoenablesItems: NO];
-		trace ("adding the new menu %p to its supermenu %p", me, supermenu);
+			initWithTitle: (NSString *) Melder_peek32toCfstring (title)];
+		[my d_cocoaMenu   setUserData: me];
+		[my d_cocoaMenu   setAutoenablesItems: NO];
+		trace (U"adding the new menu ", Melder_pointer (me), U" to its supermenu ", Melder_pointer (supermenu));
 		[supermenu -> d_cocoaMenu   setSubmenu: my d_cocoaMenu   forItem: item];   // the supermenu will retain the menu...
 		Melder_assert ([my d_cocoaMenu retainCount] == 2);
 		[my d_cocoaMenu release];   // ... so we can release the menu already, even before returning it
 		my d_widget = my d_cocoaMenu;
 		my d_menuItem -> d_widget = (GuiObject) item;
 	#elif motif
-		my d_menuItem -> d_widget = XmCreateCascadeButton (supermenu -> d_widget, Melder_peekWcsToUtf8 (title), NULL, 0);
-		my d_widget = XmCreatePulldownMenu (supermenu -> d_widget, Melder_peekWcsToUtf8 (title), NULL, 0);
+		my d_menuItem -> d_widget = XmCreateCascadeButton (supermenu -> d_widget, Melder_peek32to8 (title), nullptr, 0);
+		my d_widget = XmCreatePulldownMenu (supermenu -> d_widget, Melder_peek32to8 (title), nullptr, 0);
 		if (flags & GuiMenu_INSENSITIVE)
 			XtSetSensitive (my d_menuItem -> d_widget, False);
-		XtVaSetValues (my d_menuItem -> d_widget, XmNsubMenuId, my d_widget, NULL);
+		XtVaSetValues (my d_menuItem -> d_widget, XmNsubMenuId, my d_widget, nullptr);
 		XtManageChild (my d_menuItem -> d_widget);
 		_GuiObject_setUserData (my d_widget, me);
 	#endif
@@ -481,14 +483,14 @@ static gint button_press (GtkWidget *widget, GdkEvent *event)
 	
 	if (event->type == GDK_BUTTON_PRESS) {
 		GdkEventButton *bevent = (GdkEventButton *) event;
-		gtk_menu_popup (GTK_MENU (widget), NULL, NULL, (GtkMenuPositionFunc) set_position, NULL, bevent->button, bevent->time);
-		return TRUE;
+		gtk_menu_popup (GTK_MENU (widget), nullptr, nullptr, (GtkMenuPositionFunc) set_position, nullptr, bevent->button, bevent->time);
+		return true;
 	}
-	return FALSE;
+	return false;
 }
 #endif
 
-GuiMenu GuiMenu_createInForm (GuiForm form, int left, int right, int top, int bottom, const wchar_t *title, long flags) {
+GuiMenu GuiMenu_createInForm (GuiForm form, int left, int right, int top, int bottom, const char32 *title, uint32 flags) {
 	GuiMenu me = Thing_new (GuiMenu);
 	my d_shell = form -> d_shell;
 	my d_parent = form;
@@ -497,18 +499,18 @@ GuiMenu GuiMenu_createInForm (GuiForm form, int left, int right, int top, int bo
 	my d_cascadeButton -> d_parent = form;
 	my d_cascadeButton -> d_menu = me;
 	#if gtk
-		my d_cascadeButton -> d_widget = gtk_button_new_with_label (Melder_peekWcsToUtf8 (title));
+		my d_cascadeButton -> d_widget = gtk_button_new_with_label (Melder_peek32to8 (title));
 		my d_cascadeButton -> v_positionInForm (my d_cascadeButton -> d_widget, left, right, top, bottom, form);
 		gtk_widget_show (GTK_WIDGET (my d_cascadeButton -> d_widget));
 
 		my d_widget = gtk_menu_new ();
 		if (flags & GuiMenu_INSENSITIVE)
-			gtk_widget_set_sensitive (GTK_WIDGET (my d_widget), FALSE);
+			gtk_widget_set_sensitive (GTK_WIDGET (my d_widget), false);
 
 		g_signal_connect_object (G_OBJECT (my d_cascadeButton -> d_widget), "event",
 			GTK_SIGNAL_FUNC (button_press), G_OBJECT (my d_widget), G_CONNECT_SWAPPED);
 		g_object_set_data (G_OBJECT (my d_widget), "button", my d_cascadeButton -> d_widget);
-		gtk_menu_attach_to_widget (GTK_MENU (my d_widget), GTK_WIDGET (my d_cascadeButton -> d_widget), NULL);
+		gtk_menu_attach_to_widget (GTK_MENU (my d_widget), GTK_WIDGET (my d_cascadeButton -> d_widget), nullptr);
 		gtk_button_set_alignment (GTK_BUTTON (my d_cascadeButton -> d_widget), 0.0f, 0.5f);
 		_GuiObject_setUserData (my d_widget, me);
 		_GuiObject_setUserData (my d_cascadeButton -> d_widget, me);
@@ -522,13 +524,13 @@ GuiMenu GuiMenu_createInForm (GuiForm form, int left, int right, int top, int bo
 		[my d_cocoaMenuButton   setImagePosition: NSImageAbove];   // this centers the text
 		[[my d_cocoaMenuButton cell]   setArrowPosition: NSPopUpNoArrow /*NSPopUpArrowAtBottom*/];
 
-        NSString *menuTitle = (NSString*) Melder_peekWcsToCfstring (title);
+        NSString *menuTitle = (NSString*) Melder_peek32toCfstring (title);
         my d_widget = my d_cocoaMenu = [[GuiCocoaMenu alloc] initWithTitle:menuTitle];
 		[my d_cocoaMenu   setAutoenablesItems: NO];
 		/*
 		 * Apparently, Cocoa swallows title setting only if there is already a menu with a dummy item.
 		 */
-		NSMenuItem *item = [[NSMenuItem alloc] initWithTitle: @"-you should never get to see this-" action: NULL keyEquivalent: @""];
+		NSMenuItem *item = [[NSMenuItem alloc] initWithTitle: @"-you should never get to see this-" action: nullptr keyEquivalent: @""];
 		[my d_cocoaMenu   addItem: item];   // the menu will retain the item...
 		[item release];   // ... so we can release the item already
 		/*
@@ -536,16 +538,16 @@ GuiMenu GuiMenu_createInForm (GuiForm form, int left, int right, int top, int bo
 		 */
 		[my d_cocoaMenuButton   setMenu: my d_cocoaMenu];   // the button will retain the menu...
 		[my d_cocoaMenu   release];   // ... so we can release the menu already (before even returning it!)
-		[my d_cocoaMenuButton   setTitle: (NSString *) Melder_peekWcsToCfstring (title)];
+		[my d_cocoaMenuButton   setTitle: (NSString *) Melder_peek32toCfstring (title)];
 	#elif motif
 		my d_xmMenuBar = XmCreateMenuBar (form -> d_widget, "dynamicSubmenuBar", 0, 0);
 		form -> v_positionInForm (my d_xmMenuBar, left, right, top, bottom, form);
-		my d_cascadeButton -> d_widget = XmCreateCascadeButton (my d_xmMenuBar, Melder_peekWcsToUtf8 (title), NULL, 0);
+		my d_cascadeButton -> d_widget = XmCreateCascadeButton (my d_xmMenuBar, Melder_peek32to8 (title), nullptr, 0);
 		form -> v_positionInForm (my d_cascadeButton -> d_widget, 0, right - left - 4, 0, bottom - top, form);
-		my d_widget = XmCreatePulldownMenu (my d_xmMenuBar, Melder_peekWcsToUtf8 (title), NULL, 0);
+		my d_widget = XmCreatePulldownMenu (my d_xmMenuBar, Melder_peek32to8 (title), nullptr, 0);
 		if (flags & GuiMenu_INSENSITIVE)
 			XtSetSensitive (my d_cascadeButton -> d_widget, False);
-		XtVaSetValues (my d_cascadeButton -> d_widget, XmNsubMenuId, my d_widget, NULL);
+		XtVaSetValues (my d_cascadeButton -> d_widget, XmNsubMenuId, my d_widget, nullptr);
 		XtManageChild (my d_cascadeButton -> d_widget);
 		XtManageChild (my d_xmMenuBar);
 		_GuiObject_setUserData (my d_widget, me);
diff --git a/sys/GuiMenuItem.cpp b/sys/GuiMenuItem.cpp
index e1ed69a..e6d9119 100644
--- a/sys/GuiMenuItem.cpp
+++ b/sys/GuiMenuItem.cpp
@@ -1,6 +1,6 @@
 /* GuiMenuItem.cpp
  *
- * Copyright (C) 1992-2012,2013 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1992-2012,2013,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -42,35 +42,34 @@ Thing_implement (GuiMenuItem, GuiThing, 0);
 static void NativeMenuItem_setText (GuiObject me) {
 	int acc = my motiff.pushButton.acceleratorChar, modifiers = my motiff.pushButton.acceleratorModifiers;
 	#if win
-		static MelderString title = { 0 };
+		static MelderString title { 0 };
 		if (acc == 0) {
 			MelderString_copy (& title, _GuiWin_expandAmpersands (my name));
 		} else {
-			static const wchar_t *keyStrings [256] = {
-				0, L"<-", L"->", L"Up", L"Down", L"PAUSE", L"Del", L"Ins", L"Backspace", L"Tab", L"LineFeed", L"Home", L"End", L"Enter", L"PageUp", L"PageDown",
-				L"Esc", L"F1", L"F2", L"F3", L"F4", L"F5", L"F6", L"F7", L"F8", L"F9", L"F10", L"F11", L"F12", 0, 0, 0,
-				L"Space", L"!", L"\"", L"#", L"$", L"%", L"&", L"\'", L"(", L")", L"*", L"+", L",", L"-", L".", L"/",
-				L"0", L"1", L"2", L"3", L"4", L"5", L"6", L"7", L"8", L"9", L":", L";", L"<", L"=", L">", L"?",
-				L"@", L"A", L"B", L"C", L"D", L"E", L"F", L"G", L"H", L"I", L"J", L"K", L"L", L"M", L"N", L"O",
-				L"P", L"Q", L"R", L"S", L"T", L"U", L"V", L"W", L"X", L"Y", L"Z", L"[", L"\\", L"]", L"^", L"_",
-				L"`", L"a", L"b", L"c", L"d", L"e", L"f", L"g", L"h", L"i", L"j", L"k", L"l", L"m", L"n", L"o",
-				L"p", L"q", L"r", L"s", L"t", L"u", L"v", L"w", L"x", L"y", L"z", L"{", L"|", L"}", L"~", L"Del",
+			static const char32 *keyStrings [256] = {
+				0, U"<-", U"->", U"Up", U"Down", U"PAUSE", U"Del", U"Ins", U"Backspace", U"Tab", U"LineFeed", U"Home", U"End", U"Enter", U"PageUp", U"PageDown",
+				U"Esc", U"F1", U"F2", U"F3", U"F4", U"F5", U"F6", U"F7", U"F8", U"F9", U"F10", U"F11", U"F12", 0, 0, 0,
+				U"Space", U"!", U"\"", U"#", U"$", U"%", U"&", U"\'", U"(", U")", U"*", U"+", U",", U"-", U".", U"/",
+				U"0", U"1", U"2", U"3", U"4", U"5", U"6", U"7", U"8", U"9", U":", U";", U"<", U"=", U">", U"?",
+				U"@", U"A", U"B", U"C", U"D", U"E", U"F", U"G", U"H", U"I", U"J", U"K", U"L", U"M", U"N", U"O",
+				U"P", U"Q", U"R", U"S", U"T", U"U", U"V", U"W", U"X", U"Y", U"Z", U"[", U"\\", U"]", U"^", U"_",
+				U"`", U"a", U"b", U"c", U"d", U"e", U"f", U"g", U"h", U"i", U"j", U"k", U"l", U"m", U"n", U"o",
+				U"p", U"q", U"r", U"s", U"t", U"u", U"v", U"w", U"x", U"y", U"z", U"{", U"|", U"}", U"~", U"Del",
 				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"[", L"]", L",", L"?", L".", L"\\",
-				L";", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"-", L"`", L"=", L"\'", 0,
+				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, U"[", U"]", U",", U"?", U".", U"\\",
+				U";", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, U"-", U"`", U"=", U"\'", 0,
 				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-			const wchar_t *keyString = keyStrings [acc] ? keyStrings [acc] : L"???";
-			MelderString_empty (& title);
-			MelderString_append (& title, _GuiWin_expandAmpersands (my name), L"\t",
-				modifiers & _motif_COMMAND_MASK ? L"Ctrl-" : NULL,
-				modifiers & _motif_OPTION_MASK ? L"Alt-" : NULL,
-				modifiers & _motif_SHIFT_MASK ? L"Shift-" : NULL, keyString);
+			const char32 *keyString = keyStrings [acc] ? keyStrings [acc] : U"???";
+			MelderString_copy (& title, _GuiWin_expandAmpersands (my name), U"\t",
+				modifiers & _motif_COMMAND_MASK ? U"Ctrl-" : nullptr,
+				modifiers & _motif_OPTION_MASK ? U"Alt-" : nullptr,
+				modifiers & _motif_SHIFT_MASK ? U"Shift-" : nullptr, keyString);
 		}
-		ModifyMenu (my nat.entry.handle, my nat.entry.id, MF_BYCOMMAND | MF_STRING, my nat.entry.id, title.string);
+		ModifyMenu (my nat.entry.handle, my nat.entry.id, MF_BYCOMMAND | MF_STRING, my nat.entry.id, Melder_peek32toW (title.string));
 	#elif mac
 		static int theGlyphs [1+31] = { 0,
 			kMenuLeftArrowDashedGlyph, kMenuRightArrowDashedGlyph, kMenuUpArrowDashedGlyph, kMenuDownwardArrowDashedGlyph, 0,
@@ -80,7 +79,7 @@ static void NativeMenuItem_setText (GuiObject me) {
 			kMenuF5Glyph, kMenuF6Glyph, kMenuF7Glyph, kMenuF8Glyph, kMenuF9Glyph,
 			kMenuF10Glyph, kMenuF11Glyph, kMenuF12Glyph, 0, 0,
 			0 };
-		SetMenuItemTextWithCFString (my nat.entry.handle, my nat.entry.item, (CFStringRef) Melder_peekWcsToCfstring (my name));
+		SetMenuItemTextWithCFString (my nat.entry.handle, my nat.entry.item, (CFStringRef) Melder_peek32toCfstring (my name));
 		if (acc > 32) {
 			SetItemCmd (my nat.entry.handle, my nat.entry.item, acc);
 		} else {
@@ -100,7 +99,7 @@ static void NativeMenuItem_setText (GuiObject me) {
 	static void _guiGtkMenuItem_destroyCallback (GuiObject widget, gpointer void_me) {
 		(void) widget;
 		iam (GuiMenuItem);
-		trace ("destroying GuiMenuItem %p", me);
+		trace (U"destroying GuiMenuItem ", Melder_pointer (me));
 		forget (me);
 	}
 	static void _guiGtkMenuItem_activateCallback (GuiObject widget, gpointer void_me) {
@@ -112,8 +111,7 @@ static void NativeMenuItem_setText (GuiObject me) {
 			try {
 				my d_commandCallback (my d_boss, & event);
 			} catch (MelderError) {
-				Melder_error_ ("Your choice of menu item \"", GTK_WIDGET (widget) -> name, "\" was not completely handled.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Your choice of menu item \"", Melder_peek8to32 (GTK_WIDGET (widget) -> name), U"\" was not completely handled.");
 			}
 		}
 	}
@@ -122,28 +120,27 @@ static void NativeMenuItem_setText (GuiObject me) {
 		GuiMenuItem d_userData;
 	}
 	- (void) dealloc {   // override
-		GuiMenuItem me = d_userData;
+		GuiMenuItem me = self -> d_userData;
 		forget (me);
-		trace ("deleting a menu item");
+		trace (U"deleting a menu item");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
-		return d_userData;
+		return self -> d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiMenuItem));
-		d_userData = static_cast <GuiMenuItem> (userData);
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiMenuItem));
+		self -> d_userData = static_cast <GuiMenuItem> (userData);
 	}
 	- (void) _guiCocoaMenuItem_activateCallback: (id) widget {
 		Melder_assert (self == widget);   // sender (widget) and receiver (self) happen to be the same object
-		GuiMenuItem me = d_userData;
-		if (my d_commandCallback != NULL) {
+		GuiMenuItem me = self -> d_userData;
+		if (my d_commandCallback) {
 			struct structGuiMenuItemEvent event = { me, 0 };
 			try {
 				my d_commandCallback (my d_boss, & event);
 			} catch (MelderError) {
-				Melder_error_ ("Your choice of menu item \"", "xx", "\" was not completely handled.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Your choice of menu item \"", U"xx", U"\" was not completely handled.");
 			}
 		}
 	}
@@ -156,19 +153,18 @@ static void NativeMenuItem_setText (GuiObject me) {
 	}
 	static void _guiMotifMenuItem_activateCallback (GuiObject widget, XtPointer void_me, XtPointer call) {
 		iam (GuiMenuItem);
-		if (my d_commandCallback != NULL) {
+		if (my d_commandCallback) {
 			struct structGuiMenuItemEvent event = { me, 0 };
 			try {
 				my d_commandCallback (my d_boss, & event);
 			} catch (MelderError) {
-				Melder_error_ ("Your choice of menu item \"", widget -> name, "\" was not completely handled.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Your choice of menu item \"", widget -> name, U"\" was not completely handled.");
 			}
 		}
 	}
 #endif
 
-GuiMenuItem GuiMenu_addItem (GuiMenu menu, const wchar_t *title, long flags,
+GuiMenuItem GuiMenu_addItem (GuiMenu menu, const char32 *title, uint32 flags,
 	void (*commandCallback) (void *boss, GuiMenuItemEvent event), void *boss)
 {
 	GuiMenuItem me = Thing_new (GuiMenuItem);
@@ -176,58 +172,67 @@ GuiMenuItem GuiMenu_addItem (GuiMenu menu, const wchar_t *title, long flags,
 	my d_parent = menu;
 	my d_menu = menu;
 
-	trace ("creating item \"%ls\" in menu %p", title, menu);
+	trace (U"creating item \"", title, U"\" in menu ", Melder_pointer (menu));
 	bool toggle = flags & (GuiMenu_CHECKBUTTON | GuiMenu_RADIO_FIRST | GuiMenu_RADIO_NEXT | GuiMenu_TOGGLE_ON) ? true : false;
-	int accelerator = flags & 127;
-	Melder_assert (title != NULL);
+	uint32 accelerator = flags & 127;
+	Melder_assert (title);
 	#if gtk
-		static GSList *group = NULL;
+		static GSList *group = nullptr;
 		if (toggle) {
-			if (flags & (GuiMenu_RADIO_FIRST)) group = NULL;
+			if (flags & (GuiMenu_RADIO_FIRST)) group = nullptr;
 			if (flags & (GuiMenu_RADIO_FIRST | GuiMenu_RADIO_NEXT)) {
-				my d_widget = gtk_radio_menu_item_new_with_label (group, Melder_peekWcsToUtf8 (title));
+				my d_widget = gtk_radio_menu_item_new_with_label (group, Melder_peek32to8 (title));
 				group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (my d_widget));
-				trace ("created a radio menu item with title \"%ls\", group %p", title, group);
+				trace (U"created a radio menu item with title \"", title, U"\", group ", Melder_pointer (group));
 			} else {
-				my d_widget = gtk_check_menu_item_new_with_label (Melder_peekWcsToUtf8 (title));
+				my d_widget = gtk_check_menu_item_new_with_label (Melder_peek32to8 (title));
 			}
 		} else {
-			my d_widget = gtk_menu_item_new_with_label (Melder_peekWcsToUtf8 (title));
+			my d_widget = gtk_menu_item_new_with_label (Melder_peek32to8 (title));
 		}
 		Melder_assert (menu -> d_widget);
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu -> d_widget), GTK_WIDGET (my d_widget));
 		_GuiObject_setUserData (my d_widget, me);
 	#elif cocoa
-		NSString *string = (NSString *) Melder_peekWcsToCfstring (title);
+		(void) toggle;   // no difference between toggling and normal menu items on Cocoa
+		NSString *string = (NSString *) Melder_peek32toCfstring (title);
 		GuiCocoaMenuItem *menuItem = [[GuiCocoaMenuItem alloc]
 			initWithTitle:string
-			action: NULL
+			action: nullptr
 			keyEquivalent: @""];
 		//Melder_assert ([string retainCount] == 2 || [string retainCount] == -1);   // the menu item retains the string (assertion can fail on 10.6)
-		trace ("string retain count = %d", (int) [string retainCount]);
+		trace (U"string retain count = ", [string retainCount]);
 		my d_widget = menuItem;
-		trace ("installing item in GuiMenu %p (NSMenu %p); retain count = %d", menu, menu -> d_cocoaMenu, [menuItem retainCount]);
+		trace (
+			U"installing item in GuiMenu ", Melder_pointer (menu),
+			U" (NSMenu ", Melder_pointer (menu -> d_cocoaMenu),
+			U"); retain count = ", [menuItem retainCount]
+		);
 		[menu -> d_cocoaMenu  addItem: (NSMenuItem *) my d_widget];   // the menu will retain the item...
-		trace ("installed item in GuiMenu %p (NSMenu %p); retain count = %d", menu, menu -> d_cocoaMenu, [menuItem retainCount]);
-		trace ("release the item");
+		trace (
+			U"installed item in GuiMenu ", Melder_pointer (menu),
+			U" (NSMenu ", Melder_pointer (menu -> d_cocoaMenu),
+			U"); retain count = ", [menuItem retainCount]
+		);
+		trace (U"release the item");
 		[menuItem release];   // ... so we can release the item already
-		trace ("set user data");
+		trace (U"set user data");
 		[menuItem setUserData: me];
 	#elif motif
-		my d_widget = XtVaCreateManagedWidget (Melder_peekWcsToUtf8 (title),
-			toggle ? xmToggleButtonGadgetClass : xmPushButtonGadgetClass, menu -> d_widget, NULL);
+		my d_widget = XtVaCreateManagedWidget (Melder_peek32to8 (title),
+			toggle ? xmToggleButtonGadgetClass : xmPushButtonGadgetClass, menu -> d_widget, nullptr);
 		_GuiObject_setUserData (my d_widget, me);
 	#endif
-	Melder_assert (my d_widget != NULL);
+	Melder_assert (my d_widget);
 
-	trace ("set sensitivity");
+	trace (U"set sensitivity");
 	if (flags & GuiMenu_INSENSITIVE)
-		my f_setSensitive (false);
+		GuiThing_setSensitive (me, false);
 
-	trace ("understand toggle menu items");
+	trace (U"understand toggle menu items");
 	if (flags & GuiMenu_TOGGLE_ON)
 		#if gtk
-			gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (my d_widget), TRUE);
+			gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (my d_widget), true);
 		#elif cocoa
 			[menuItem setState: NSOnState];
 		#elif motif
@@ -235,7 +240,7 @@ GuiMenuItem GuiMenu_addItem (GuiMenu menu, const wchar_t *title, long flags,
 		#endif
 
 	if (accelerator) {
-		trace ("adding accelerator %d", accelerator);
+		trace (U"adding accelerator ", accelerator);
 		/*
 		 * For printable characters, the Command key is assumed.
 		 */
@@ -324,28 +329,28 @@ GuiMenuItem GuiMenu_addItem (GuiMenu menu, const wchar_t *title, long flags,
 			my d_widget -> motiff.pushButton.acceleratorModifiers = modifiers;
 			NativeMenuItem_setText (my d_widget);
 		#endif
-		trace ("added accelerator %d", accelerator);
+		trace (U"added accelerator ", accelerator);
 	}
 	#if mac && useCarbon
 		if (flags & GuiMenu_ATTRACTIVE) {
-			trace ("attractive!");
+			trace (U"attractive!");
 			SetItemStyle (my d_widget -> nat.entry.handle, my d_widget -> nat.entry.item, bold);
 		}
 	#endif
 
-	trace ("install the command callback");
+	trace (U"install the command callback");
 	my d_commandCallback = commandCallback;
 	my d_boss = boss;
 	#if gtk
-		if (commandCallback != NULL) {
+		if (commandCallback) {
 			if (flags == GuiMenu_TAB) {
 				GtkWidget *shell = gtk_widget_get_toplevel (gtk_menu_get_attach_widget (GTK_MENU (menu -> d_widget)));
-				trace ("tab set in GTK window %p", shell);
+				trace (U"tab set in GTK window ", Melder_pointer (shell));
 				g_object_set_data (G_OBJECT (shell), "tabCallback", (gpointer) _guiGtkMenuItem_activateCallback);
 				g_object_set_data (G_OBJECT (shell), "tabClosure", (gpointer) me);
 			} else if (flags == (GuiMenu_TAB | GuiMenu_SHIFT)) {
 				GtkWidget *shell = gtk_widget_get_toplevel (gtk_menu_get_attach_widget (GTK_MENU (menu -> d_widget)));
-				trace ("shift-tab set in GTK window %p", shell);
+				trace (U"shift-tab set in GTK window ", Melder_pointer (shell));
 				g_object_set_data (G_OBJECT (shell), "shiftTabCallback", (gpointer) _guiGtkMenuItem_activateCallback);
 				g_object_set_data (G_OBJECT (shell), "shiftTabClosure", (gpointer) me);
 			} else {
@@ -354,7 +359,7 @@ GuiMenuItem GuiMenu_addItem (GuiMenu menu, const wchar_t *title, long flags,
 					G_CALLBACK (_guiGtkMenuItem_activateCallback), (gpointer) me);
 			}
 		} else {
-			gtk_widget_set_sensitive (GTK_WIDGET (my d_widget), FALSE);
+			gtk_widget_set_sensitive (GTK_WIDGET (my d_widget), false);
 		}
 		gtk_widget_show (GTK_WIDGET (my d_widget));
 	#elif cocoa
@@ -366,7 +371,7 @@ GuiMenuItem GuiMenu_addItem (GuiMenu menu, const wchar_t *title, long flags,
 			_guiMotifMenuItem_activateCallback, (XtPointer) me);
 	#endif
 
-	trace ("make sure that I will be destroyed when my widget is destroyed");
+	trace (U"make sure that I will be destroyed when my widget is destroyed");
 	#if gtk
 		g_signal_connect (G_OBJECT (my d_widget), "destroy", G_CALLBACK (_guiGtkMenuItem_destroyCallback), me);
 	#elif cocoa
@@ -388,19 +393,27 @@ GuiMenuItem GuiMenu_addSeparator (GuiMenu menu) {
 		gtk_widget_show (GTK_WIDGET (my d_widget));
 	#elif cocoa
 		my d_widget = (GuiObject) [GuiCocoaMenuItem separatorItem];
-		trace ("install separator in menu %p", menu);
-		trace ("installing separator in GuiMenu %p (NSMenu %p); retain count = %d", menu, menu -> d_cocoaMenu, [((NSMenuItem *) my d_widget) retainCount]);
+		trace (U"install separator in menu ", Melder_pointer (menu));
+		trace (
+			U"installing separator in GuiMenu ", Melder_pointer (menu),
+			U" (NSMenu ", Melder_pointer (menu -> d_cocoaMenu),
+			U"); retain count = ", [((NSMenuItem *) my d_widget) retainCount]
+		);
 		[menu -> d_cocoaMenu  addItem: (NSMenuItem *) my d_widget];   // the menu will retain the item...
-		trace ("installed separator in GuiMenu %p (NSMenu %p); retain count = %d", menu, menu -> d_cocoaMenu, [((NSMenuItem *) my d_widget) retainCount]);
-		trace ("release the item");
+		trace (
+			U"installed separator in GuiMenu ", Melder_pointer (menu),
+			U" (NSMenu ", Melder_pointer (menu -> d_cocoaMenu),
+			U"); retain count = ", [((NSMenuItem *) my d_widget) retainCount]
+		);
+		trace (U"release the item");
 		//[(NSMenuItem *) my d_widget release];   // ... so we can release the item already
-		trace ("set user data");
+		trace (U"set user data");
 		[(GuiCocoaMenuItem *) my d_widget setUserData: me];
 	#elif motif
-		my d_widget = XtVaCreateManagedWidget ("menuSeparator", xmSeparatorGadgetClass, menu -> d_widget, NULL);
+		my d_widget = XtVaCreateManagedWidget ("menuSeparator", xmSeparatorGadgetClass, menu -> d_widget, nullptr);
 	#endif
 
-	trace ("make sure that I will be destroyed when my widget is destroyed");
+	trace (U"make sure that I will be destroyed when my widget is destroyed");
 	#if gtk
 		g_signal_connect (G_OBJECT (my d_widget), "destroy", G_CALLBACK (_guiGtkMenuItem_destroyCallback), me);
 	#elif cocoa
@@ -410,17 +423,17 @@ GuiMenuItem GuiMenu_addSeparator (GuiMenu menu) {
 	return me;
 }
 
-void structGuiMenuItem :: f_check (bool check) {
-	Melder_assert (d_widget != NULL);
+void GuiMenuItem_check (GuiMenuItem me, bool check) {
+	Melder_assert (my d_widget);
 	#if gtk
-		d_callbackBlocked = true;
-		gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (d_widget), check);
-		d_callbackBlocked = false;
+		my d_callbackBlocked = true;
+		gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (my d_widget), check);
+		my d_callbackBlocked = false;
 	#elif cocoa
-		GuiCocoaMenuItem *item = (GuiCocoaMenuItem*)d_widget;
+		GuiCocoaMenuItem *item = (GuiCocoaMenuItem *) my d_widget;
 		[item   setState: check];
 	#elif motif
-		XmToggleButtonGadgetSetState (d_widget, check, False);
+		XmToggleButtonGadgetSetState (my d_widget, check, False);
 	#endif
 }
 
diff --git a/sys/GuiObject.cpp b/sys/GuiObject.cpp
index 34f7e18..f6324e3 100644
--- a/sys/GuiObject.cpp
+++ b/sys/GuiObject.cpp
@@ -28,13 +28,13 @@
 #endif
 
 void * _GuiObject_getUserData (GuiObject widget) {
-	void *userData = NULL;
+	void *userData = nullptr;
 	#if gtk
 		userData = (void *) g_object_get_data (G_OBJECT (widget), "praat");
 	#elif cocoa
 		userData = [(GuiCocoaView *) widget   userData];
 	#elif motif
-		XtVaGetValues (widget, XmNuserData, & userData, NULL);
+		XtVaGetValues (widget, XmNuserData, & userData, nullptr);
 	#endif
 	return userData;
 }
@@ -45,7 +45,7 @@ void _GuiObject_setUserData (GuiObject widget, void *userData) {
 	#elif cocoa
 		[(GuiCocoaView *) widget   setUserData: (GuiThing) userData];
 	#elif motif
-		XtVaSetValues (widget, XmNuserData, userData, NULL);
+		XtVaSetValues (widget, XmNuserData, userData, nullptr);
 	#endif
 }
 
diff --git a/sys/GuiOptionMenu.cpp b/sys/GuiOptionMenu.cpp
index 375d28f..f338365 100644
--- a/sys/GuiOptionMenu.cpp
+++ b/sys/GuiOptionMenu.cpp
@@ -1,6 +1,6 @@
 /* GuiOptionMenu.cpp
  *
- * Copyright (C) 1993-2012,2013,2014 Paul Boersma, 2007 Stefan de Konink, 2013 Tom Naughton
+ * Copyright (C) 1993-2012,2013,2014,2015 Paul Boersma, 2007 Stefan de Konink, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,7 +49,7 @@ Thing_implement (GuiOptionMenu, GuiControl, 0);
         
         forget (my d_options);
 		forget (me);   
-		trace ("deleting an option menu");
+		trace (U"deleting an option menu");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
@@ -78,63 +78,63 @@ void structGuiOptionMenu :: v_show () {
 	#endif
 }
 
-void structGuiOptionMenu :: f_init (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags)
+void GuiOptionMenu_init (GuiOptionMenu me, GuiForm parent, int left, int right, int top, int bottom, uint32 flags)
 {
-	our d_shell = parent -> d_shell;
-	our d_parent = parent;
-	our d_options = Ordered_create ();
+	my d_shell = parent -> d_shell;
+	my d_parent = parent;
+	my d_options = Ordered_create ();
 	#if gtk
-		d_widget = gtk_combo_box_new_text ();
-		gtk_widget_set_size_request (GTK_WIDGET (d_widget), right - left, bottom - top + 8);
-		gtk_fixed_put (GTK_FIXED (parent -> d_widget), GTK_WIDGET (d_widget), left, top - 6);
-		gtk_combo_box_set_focus_on_click (GTK_COMBO_BOX (d_widget), false);
-		GTK_WIDGET_UNSET_FLAGS (d_widget, GTK_CAN_DEFAULT);
+		my d_widget = gtk_combo_box_new_text ();
+		gtk_widget_set_size_request (GTK_WIDGET (my d_widget), right - left, bottom - top + 8);
+		gtk_fixed_put (GTK_FIXED (parent -> d_widget), GTK_WIDGET (my d_widget), left, top - 6);
+		gtk_combo_box_set_focus_on_click (GTK_COMBO_BOX (my d_widget), false);
+		GTK_WIDGET_UNSET_FLAGS (my d_widget, GTK_CAN_DEFAULT);
 	#elif cocoa
     
         GuiCocoaOptionMenu *optionMenu = [[GuiCocoaOptionMenu alloc] init];
 
-        our d_widget = (GuiObject) optionMenu;
-		v_positionInForm (our d_widget, left, right, top - 1, bottom + 1, parent);
+        my d_widget = (GuiObject) optionMenu;
+		my v_positionInForm (my d_widget, left, right, top - 1, bottom + 1, parent);
     
-        [optionMenu setUserData: this];
+        [optionMenu   setUserData: me];
 //        [optionMenu setBezelStyle: NSRoundedBezelStyle];
 //        [optionMenu setBordered: NO];
 
 
 	#elif motif
-		d_xmMenuBar = XmCreateMenuBar (parent -> d_widget, "UiOptionMenu", NULL, 0);
-		XtVaSetValues (d_xmMenuBar, XmNx, left - 4, XmNy, top - 4
+		my d_xmMenuBar = XmCreateMenuBar (parent -> d_widget, "UiOptionMenu", nullptr, 0);
+		XtVaSetValues (my d_xmMenuBar, XmNx, left - 4, XmNy, top - 4
 			#if mac
 				- 1
 			#endif
-			, XmNwidth, right - left + 8, XmNheight, bottom - top + 8, NULL);
-		d_xmCascadeButton = XmCreateCascadeButton (d_xmMenuBar, "choice", NULL, 0);
-		d_widget = XmCreatePulldownMenu (d_xmMenuBar, "choice", NULL, 0);
+			, XmNwidth, right - left + 8, XmNheight, bottom - top + 8, nullptr);
+		my d_xmCascadeButton = XmCreateCascadeButton (my d_xmMenuBar, "choice", nullptr, 0);
+		my d_widget = XmCreatePulldownMenu (my d_xmMenuBar, "choice", nullptr, 0);
 		if (flags & GuiMenu_INSENSITIVE)
-			XtSetSensitive (d_widget, False);
-		XtVaSetValues (d_xmCascadeButton, XmNsubMenuId, d_widget, NULL);
-		XtManageChild (d_xmCascadeButton);
-		XtVaSetValues (d_xmMenuBar, XmNwidth, right - left + 8, NULL);   // BUG: twice?
-		XtVaSetValues (d_xmCascadeButton, XmNx, 4, XmNy, 4, XmNwidth, right - left, XmNheight, bottom - top, NULL);
+			XtSetSensitive (my d_widget, False);
+		XtVaSetValues (my d_xmCascadeButton, XmNsubMenuId, my d_widget, nullptr);
+		XtManageChild (my d_xmCascadeButton);
+		XtVaSetValues (my d_xmMenuBar, XmNwidth, right - left + 8, nullptr);   // BUG: twice?
+		XtVaSetValues (my d_xmCascadeButton, XmNx, 4, XmNy, 4, XmNwidth, right - left, XmNheight, bottom - top, nullptr);
 	#endif
 
 	#if gtk
-		g_signal_connect (G_OBJECT (d_widget), "destroy", G_CALLBACK (_guiGtkOptionMenu_destroyCallback), this);
+		g_signal_connect (G_OBJECT (my d_widget), "destroy", G_CALLBACK (_guiGtkOptionMenu_destroyCallback), me);
 	#elif cocoa
 	#elif motif
-		XtAddCallback (d_widget, XmNdestroyCallback, _guiMotifOptionMenu_destroyCallback, this);
+		XtAddCallback (my d_widget, XmNdestroyCallback, _guiMotifOptionMenu_destroyCallback, me);
 	#endif
 }
 
-GuiOptionMenu GuiOptionMenu_create (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags) {
+GuiOptionMenu GuiOptionMenu_create (GuiForm parent, int left, int right, int top, int bottom, uint32 flags) {
 	autoGuiOptionMenu me = Thing_new (GuiOptionMenu);
-	my f_init (parent, left, right, top, bottom, flags);
+	GuiOptionMenu_init (me.peek(), parent, left, right, top, bottom, flags);
 	return me.transfer();
 }
 
-GuiOptionMenu GuiOptionMenu_createShown (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags) {
+GuiOptionMenu GuiOptionMenu_createShown (GuiForm parent, int left, int right, int top, int bottom, uint32 flags) {
 	GuiOptionMenu me = GuiOptionMenu_create (parent, left, right, top, bottom, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
@@ -145,66 +145,66 @@ static void cb_optionChanged (GuiObject w, XtPointer void_me, XtPointer call) {
 	for (int i = 1; i <= my d_options -> size; i ++) {
 		GuiMenuItem item = static_cast <GuiMenuItem> (my d_options -> item [i]);
 		if (item -> d_widget == w) {
-			XtVaSetValues (my d_xmCascadeButton, XmNlabelString, Melder_peekWcsToUtf8 (item -> d_widget -> name), NULL);
-			XmToggleButtonSetState (item -> d_widget, TRUE, FALSE);
+			XtVaSetValues (my d_xmCascadeButton, XmNlabelString, Melder_peek32to8 (item -> d_widget -> name), nullptr);
+			XmToggleButtonSetState (item -> d_widget, true, false);
 			if (Melder_debug == 11) {
-				Melder_warning (i, " \"", item -> d_widget -> name, "\"");
+				Melder_warning (i, U" \"", item -> d_widget -> name, U"\"");
 			}
 		} else {
-			XmToggleButtonSetState (item -> d_widget, FALSE, FALSE);
+			XmToggleButtonSetState (item -> d_widget, false, false);
 		}
 	}
 }
 #endif
 
-void structGuiOptionMenu:: f_addOption (const wchar_t *text) {
+void GuiOptionMenu_addOption (GuiOptionMenu me, const char32 *text) {
 	#if gtk
-		gtk_combo_box_append_text (GTK_COMBO_BOX (d_widget), Melder_peekWcsToUtf8 (text));
+		gtk_combo_box_append_text (GTK_COMBO_BOX (my d_widget), Melder_peek32to8 (text));
 	#elif motif
 		GuiMenuItem menuItem = Thing_new (GuiMenuItem);
-		menuItem -> d_widget = XtVaCreateManagedWidget (Melder_peekWcsToUtf8 (text), xmToggleButtonWidgetClass, d_widget, NULL);
-		XtAddCallback (menuItem -> d_widget, XmNvalueChangedCallback, cb_optionChanged, (XtPointer) this);
-		Collection_addItem (d_options, menuItem);
+		menuItem -> d_widget = XtVaCreateManagedWidget (Melder_peek32to8 (text), xmToggleButtonWidgetClass, my d_widget, nullptr);
+		XtAddCallback (menuItem -> d_widget, XmNvalueChangedCallback, cb_optionChanged, (XtPointer) me);
+		Collection_addItem (my d_options, menuItem);
     #elif cocoa
-        GuiCocoaOptionMenu *menu = (GuiCocoaOptionMenu* ) d_widget;
-        [menu addItemWithTitle: [NSString stringWithUTF8String: Melder_peekWcsToUtf8 (text)]];
+        GuiCocoaOptionMenu *menu = (GuiCocoaOptionMenu *) my d_widget;
+        [menu addItemWithTitle: [NSString stringWithUTF8String: Melder_peek32to8 (text)]];
 	#endif
 }
 
-int structGuiOptionMenu :: f_getValue () {
-	d_value = 0;
+int GuiOptionMenu_getValue (GuiOptionMenu me) {
+	my d_value = 0;
 	#if gtk
 		// TODO: Graag even een check :)
-		d_value = gtk_combo_box_get_active (GTK_COMBO_BOX (d_widget)) + 1;
+		my d_value = gtk_combo_box_get_active (GTK_COMBO_BOX (my d_widget)) + 1;
 	#elif motif
-		for (int i = 1; i <= d_options -> size; i ++) {
-			GuiMenuItem menuItem = static_cast <GuiMenuItem> (d_options -> item [i]);
+		for (int i = 1; i <= my d_options -> size; i ++) {
+			GuiMenuItem menuItem = static_cast <GuiMenuItem> (my d_options -> item [i]);
 			if (XmToggleButtonGetState (menuItem -> d_widget))
-				d_value = i;
+				my d_value = i;
 		}
     #elif cocoa
-		GuiCocoaOptionMenu *menu = (GuiCocoaOptionMenu *) d_widget;
-		d_value = [menu indexOfSelectedItem] + 1;
+		GuiCocoaOptionMenu *menu = (GuiCocoaOptionMenu *) my d_widget;
+		my d_value = [menu indexOfSelectedItem] + 1;
 	#endif
-	return d_value;
+	return my d_value;
 }
 
-void structGuiOptionMenu :: f_setValue (int value) {
+void GuiOptionMenu_setValue (GuiOptionMenu me, int value) {
 	#if gtk
-		gtk_combo_box_set_active (GTK_COMBO_BOX (d_widget), value - 1);
+		gtk_combo_box_set_active (GTK_COMBO_BOX (my d_widget), value - 1);
 	#elif cocoa
-        GuiCocoaOptionMenu *menu = (GuiCocoaOptionMenu*)d_widget;
-        [menu selectItemAtIndex:value - 1];
+        GuiCocoaOptionMenu *menu = (GuiCocoaOptionMenu *) my d_widget;
+        [menu   selectItemAtIndex: value - 1];
 	#elif motif
-		for (int i = 1; i <= d_options -> size; i ++) {
-			GuiMenuItem menuItem = static_cast <GuiMenuItem> (d_options -> item [i]);
+		for (int i = 1; i <= my d_options -> size; i ++) {
+			GuiMenuItem menuItem = static_cast <GuiMenuItem> (my d_options -> item [i]);
 			XmToggleButtonSetState (menuItem -> d_widget, i == value, False);
 			if (i == value) {
-				XtVaSetValues (d_xmCascadeButton, XmNlabelString, Melder_peekWcsToUtf8 (menuItem -> d_widget -> name), NULL);
+				XtVaSetValues (my d_xmCascadeButton, XmNlabelString, Melder_peek32to8 (menuItem -> d_widget -> name), nullptr);
 			}
 		}
 	#endif
-	d_value = value;
+	my d_value = value;
 }
 
 /* End of file GuiOptionMenu.cpp */
diff --git a/sys/GuiP.h b/sys/GuiP.h
index 251c5ed..110b482 100644
--- a/sys/GuiP.h
+++ b/sys/GuiP.h
@@ -2,7 +2,7 @@
 #define _GuiP_h_
 /* GuiP.h
  *
- * Copyright (C) 1993-2011,2012,2013 Paul Boersma
+ * Copyright (C) 1993-2011,2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -83,7 +83,7 @@ class GuiControlBlockValueChangedCallbacks {
 			long magicNumber;
 			unsigned long widgetClass;
 			GuiObject parent, previousSibling, nextSibling, firstChild;
-			wchar_t *name;
+			char32 *name;
 			bool inMenu, nativized, managed, insensitive;
 			GuiObject textFocus;   /* For shells. */
 			GuiObject shell;   /* My shell ancestor. */
@@ -163,7 +163,8 @@ class GuiControlBlockValueChangedCallbacks {
 			GuiObject textFocus;
 			bool duringUpdate;
 			#if win
-				HINSTANCE instance;   /* First argument of WinMain. */
+				HINSTANCE instance;   // first argument of WinMain
+				int commandShow;   // another argument of WinMain
 			#elif mac
 				WindowPtr modalDialog;
 			#endif
@@ -175,9 +176,9 @@ class GuiControlBlockValueChangedCallbacks {
 			void _GuiMac_clipOffValid (GuiObject me);
 			void _GuiMac_clipOffInvalid (GuiObject me);
 		#elif win
-			wchar_t * _GuiWin_getDrawingAreaClassName (void);
+			char32 * _GuiWin_getDrawingAreaClassName (void);
 		#endif
-		GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const wchar_t *name);
+		GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const char32 *name);
 		void _Gui_invalidateWidget (GuiObject me);
 		void _Gui_validateWidget (GuiObject me);
 		void _Gui_manageScrolledWindow (GuiObject me);
@@ -188,7 +189,7 @@ class GuiControlBlockValueChangedCallbacks {
 		void _GuiNativeControl_show (GuiObject me);
 		void _GuiNativeControl_hide (GuiObject me);
 		void _GuiNativeControl_setSensitive (GuiObject me);
-		wchar_t * _GuiWin_expandAmpersands (const wchar_t *title);
+		char32 * _GuiWin_expandAmpersands (const char32 *title);
 
 		/********** GuiButton.cpp **********/
 		#if win
@@ -291,7 +292,7 @@ class GuiControlBlockValueChangedCallbacks {
 		void _GuiText_handleFocusReception (GuiObject widget);
 		void _GuiText_handleFocusLoss (GuiObject widget);
 		#if mac
-		void _GuiMac_clearTheTextFocus (void);
+		void _GuiMac_clearTheTextFocus ();
 		#endif
 		void _GuiText_setTheTextFocus (GuiObject widget);
 		void _GuiText_handleValueChanged (GuiObject widget);
@@ -305,10 +306,10 @@ class GuiControlBlockValueChangedCallbacks {
 			int _GuiMacText_tryToHandleReturnKey (EventHandlerCallRef eventHandlerCallRef, EventRef eventRef, GuiObject widget, EventRecord *event);
 			int _GuiMacText_tryToHandleClipboardShortcut (EventHandlerCallRef eventHandlerCallRef, EventRef eventRef, GuiObject widget, unsigned char charCode, EventRecord *event);
 			void _GuiMacText_handleClick (GuiObject widget, EventRecord *event);
-			void _GuiMac_makeTextCaretBlink (void);
+			void _GuiMac_makeTextCaretBlink ();
 		#endif
-		void _GuiText_init (void);
-		void _GuiText_exit (void);
+		void _GuiText_init ();
+		void _GuiText_exit ();
 
 	#endif
 #endif
diff --git a/sys/GuiProgressBar.cpp b/sys/GuiProgressBar.cpp
index f6c5a3e..c8e0e7f 100644
--- a/sys/GuiProgressBar.cpp
+++ b/sys/GuiProgressBar.cpp
@@ -1,6 +1,6 @@
 /* GuiProgressBar.cpp
  *
- * Copyright (C) 1993-2012,2013 Paul Boersma, 2008 Stefan de Konink
+ * Copyright (C) 1993-2012,2013,2015 Paul Boersma, 2008 Stefan de Konink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,28 +34,28 @@ Thing_implement (GuiProgressBar, GuiControl, 0);
 	- (void) dealloc {   // override
 		GuiProgressBar me = d_userData;
 		forget (me);
-		trace ("deleting a progress bar");
+		trace (U"deleting a progress bar");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiProgressBar));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiProgressBar));
 		d_userData = static_cast <GuiProgressBar> (userData);
 	}
 	@end
 #elif motif
 	static void _guiMotifProgressBar_destroyCallback (GuiObject widget, XtPointer void_me, XtPointer call) {
 		(void) widget; (void) call;
-		trace ("destroying a progress bar");
+		trace (U"destroying a progress bar");
 		iam (GuiProgressBar);
 		//forget (me);   // because I am already forgotten in the scale::destroy callback
-		trace ("destroyed a progress bar");
+		trace (U"destroyed a progress bar");
 	}
 #endif
 
-GuiProgressBar GuiProgressBar_create (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags)
+GuiProgressBar GuiProgressBar_create (GuiForm parent, int left, int right, int top, int bottom, uint32 /* flags */)
 {
 	GuiProgressBar me = Thing_new (GuiProgressBar);
 	my d_shell = parent -> d_shell;
@@ -72,7 +72,7 @@ GuiProgressBar GuiProgressBar_create (GuiForm parent, int left, int right, int t
 		[my d_cocoaProgressBar   setIndeterminate: false];
 		[my d_cocoaProgressBar   setMaxValue: 1.0];
 	#elif motif
-		my d_widget = XmCreateScale (parent -> d_widget, "scale", NULL, 0);
+		my d_widget = XmCreateScale (parent -> d_widget, "scale", nullptr, 0);
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		XtVaSetValues (my d_widget, XmNorientation, XmHORIZONTAL,
@@ -83,7 +83,7 @@ GuiProgressBar GuiProgressBar_create (GuiForm parent, int left, int right, int t
 			#ifdef macintosh
 				//XmNscaleWidth, 340,
 			#endif
-			NULL);
+			nullptr);
 	#endif
 
 	#if gtk
@@ -96,20 +96,20 @@ GuiProgressBar GuiProgressBar_create (GuiForm parent, int left, int right, int t
 	return me;
 }
 
-GuiProgressBar GuiProgressBar_createShown (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags)
+GuiProgressBar GuiProgressBar_createShown (GuiForm parent, int left, int right, int top, int bottom, uint32 flags)
 {
 	GuiProgressBar me = GuiProgressBar_create (parent, left, right, top, bottom, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
-void structGuiProgressBar :: f_setValue (double value) {
+void GuiProgressBar_setValue (GuiProgressBar me, double value) {
 	#if gtk
-		gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (d_widget), value);
+		gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (my d_widget), value);
 	#elif cocoa
-		[d_cocoaProgressBar   setDoubleValue: value];
+		[my d_cocoaProgressBar   setDoubleValue: value];
 	#elif motif
-		XmScaleSetValue (d_widget, round (value * 10000));
+		XmScaleSetValue (my d_widget, round (value * 10000));
 	#endif
 }
 
diff --git a/sys/GuiRadioButton.cpp b/sys/GuiRadioButton.cpp
index ad04538..86946ba 100644
--- a/sys/GuiRadioButton.cpp
+++ b/sys/GuiRadioButton.cpp
@@ -1,6 +1,6 @@
 /* GuiRadioButton.cpp
  *
- * Copyright (C) 1993-2011,2012,2013 Paul Boersma
+ * Copyright (C) 1993-2011,2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -58,10 +58,10 @@ static int _GuiRadioButton_getPosition (GuiRadioButton me) {
 	}
 	static void _GuiGtkRadioButton_handleToggle (GuiObject widget, gpointer void_me) {
 		iam (GuiRadioButton);
-		trace ("enter");
+		trace (U"enter");
 		if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) {
-			trace ("on");
-			if (my d_valueChangedCallback != NULL && ! my d_blockValueChangedCallbacks) {
+			trace (U"on");
+			if (my d_valueChangedCallback && ! my d_blockValueChangedCallbacks) {
 				struct structGuiRadioButtonEvent event = { me };
 				event. position = _GuiRadioButton_getPosition (me);
 				my d_valueChangedCallback (my d_valueChangedBoss, & event);
@@ -75,30 +75,30 @@ static int _GuiRadioButton_getPosition (GuiRadioButton me) {
 	- (void) dealloc {   // override
 		GuiRadioButton me = self -> d_userData;
 		forget (me);
-		trace ("deleting a radio button");
+		trace (U"deleting a radio button");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiRadioButton));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiRadioButton));
 		d_userData = static_cast <GuiRadioButton> (userData);
 	}
 	- (void) _guiCocoaRadioButton_activateCallback: (id) widget {
-		trace ("enter");
+		trace (U"enter");
 		Melder_assert (self == widget);   // sender (widget) and receiver (self) happen to be the same object
 		GuiRadioButton me = d_userData;
 		/*
 		 * Deselect the sister buttons.
 		 */
-		for (GuiRadioButton sibling = my d_previous; sibling != NULL; sibling = sibling -> d_previous) {
+		for (GuiRadioButton sibling = my d_previous; sibling != nullptr; sibling = sibling -> d_previous) {
 			[sibling -> d_cocoaRadioButton   setState: NSOffState];
 		}
-		for (GuiRadioButton sibling = my d_next; sibling != NULL; sibling = sibling -> d_next) {
+		for (GuiRadioButton sibling = my d_next; sibling != nullptr; sibling = sibling -> d_next) {
 			[sibling -> d_cocoaRadioButton   setState: NSOffState];
 		}
-		if (my d_valueChangedCallback != NULL) {
+		if (my d_valueChangedCallback) {
 			Melder_assert (! my d_blockValueChangedCallbacks);
 			struct structGuiRadioButtonEvent event = { me };
 			event. position = _GuiRadioButton_getPosition (me);
@@ -118,13 +118,13 @@ static int _GuiRadioButton_getPosition (GuiRadioButton me) {
 		/*
 		 * Deselect the sister buttons.
 		 */
-		for (GuiRadioButton sibling = my d_previous; sibling != NULL; sibling = sibling -> d_previous) {
+		for (GuiRadioButton sibling = my d_previous; sibling != nullptr; sibling = sibling -> d_previous) {
 			Button_SetCheck (sibling -> d_widget -> window, BST_UNCHECKED);
 		}
-		for (GuiRadioButton sibling = my d_next; sibling != NULL; sibling = sibling -> d_next) {
+		for (GuiRadioButton sibling = my d_next; sibling != nullptr; sibling = sibling -> d_next) {
 			Button_SetCheck (sibling -> d_widget -> window, BST_UNCHECKED);
 		}
-		if (my d_valueChangedCallback != NULL) {
+		if (my d_valueChangedCallback) {
 			struct structGuiRadioButtonEvent event = { me };
 			event. position = _GuiRadioButton_getPosition (me);
 			my d_valueChangedCallback (my d_valueChangedBoss, & event);
@@ -139,19 +139,19 @@ static int _GuiRadioButton_getPosition (GuiRadioButton me) {
 	void _GuiMacRadioButton_handleClick (GuiObject widget, EventRecord *macEvent) {
 		iam_radiobutton;
 		_GuiMac_clipOnParent (widget);
-		bool clicked = HandleControlClick (widget -> nat.control.handle, macEvent -> where, macEvent -> modifiers, NULL);
+		bool clicked = HandleControlClick (widget -> nat.control.handle, macEvent -> where, macEvent -> modifiers, nullptr);
 		GuiMac_clipOff ();
 		if (clicked) {
 			/*
 			 * Deselect the sister buttons.
 			 */
-			for (GuiRadioButton sibling = my d_previous; sibling != NULL; sibling = sibling -> d_previous) {
+			for (GuiRadioButton sibling = my d_previous; sibling != nullptr; sibling = sibling -> d_previous) {
 				SetControlValue (sibling -> d_widget -> nat.control.handle, 0);
 			}
-			for (GuiRadioButton sibling = my d_next; sibling != NULL; sibling = sibling -> d_next) {
+			for (GuiRadioButton sibling = my d_next; sibling != nullptr; sibling = sibling -> d_next) {
 				SetControlValue (sibling -> d_widget -> nat.control.handle, 0);
 			}
-			if (my d_valueChangedCallback != NULL) {
+			if (my d_valueChangedCallback != nullptr) {
 				struct structGuiRadioButtonEvent event = { me };
 				event. position = _GuiRadioButton_getPosition (me);
 				my d_valueChangedCallback (my d_valueChangedBoss, & event);
@@ -160,35 +160,35 @@ static int _GuiRadioButton_getPosition (GuiRadioButton me) {
 	}
 #endif
 
-static GuiRadioButton latestRadioButton = NULL;
+static GuiRadioButton latestRadioButton = nullptr;
 
 void GuiRadioGroup_begin () {
-	latestRadioButton = NULL;
+	latestRadioButton = nullptr;
 }
 
 void GuiRadioGroup_end () {
-	latestRadioButton = NULL;
+	latestRadioButton = nullptr;
 }
 
 GuiRadioButton GuiRadioButton_create (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*valueChangedCallback) (void *boss, GuiRadioButtonEvent event), void *valueChangedBoss, unsigned long flags)
+	const char32 *buttonText, void (*valueChangedCallback) (void *boss, GuiRadioButtonEvent event), void *valueChangedBoss, uint32 flags)
 {
-	trace ("begin: text %ls", buttonText);
+	trace (U"begin: text %", buttonText);
 	GuiRadioButton me = Thing_new (GuiRadioButton);
 	my d_shell = parent -> d_shell;
 	my d_parent = parent;
 	my d_valueChangedCallback = valueChangedCallback;
 	my d_valueChangedBoss = valueChangedBoss;
 	my d_previous = latestRadioButton;
-	my d_next = NULL;
+	my d_next = nullptr;
 	#if gtk
-		my d_widget = gtk_radio_button_new_with_label_from_widget (latestRadioButton ? GTK_RADIO_BUTTON (latestRadioButton -> d_widget) : NULL, Melder_peekWcsToUtf8 (buttonText));
+		my d_widget = gtk_radio_button_new_with_label_from_widget (latestRadioButton ? GTK_RADIO_BUTTON (latestRadioButton -> d_widget) : nullptr, Melder_peek32to8 (buttonText));
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		if (flags & GuiRadioButton_SET) {
-			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (my d_widget), TRUE);
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (my d_widget), true);
 		} else {
-			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (my d_widget), FALSE);
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (my d_widget), false);
 		}
 		g_signal_connect (G_OBJECT (my d_widget), "destroy", G_CALLBACK (_GuiGtkRadioButton_destroyCallback), me);
 		g_signal_connect (GTK_TOGGLE_BUTTON (my d_widget), "toggled", G_CALLBACK (_GuiGtkRadioButton_handleToggle), me);
@@ -198,7 +198,7 @@ GuiRadioButton GuiRadioButton_create (GuiForm parent, int left, int right, int t
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		[my d_cocoaRadioButton   setUserData: me];
 		[my d_cocoaRadioButton setButtonType: NSRadioButton];
-		[my d_cocoaRadioButton setTitle: (NSString *) Melder_peekWcsToCfstring (buttonText)];
+		[my d_cocoaRadioButton setTitle: (NSString *) Melder_peek32toCfstring (buttonText)];
 		if (flags & GuiCheckButton_SET) {
 			[my d_cocoaRadioButton setState: NSOnState];
 		}
@@ -214,7 +214,7 @@ GuiRadioButton GuiRadioButton_create (GuiForm parent, int left, int right, int t
 		[my d_cocoaRadioButton setButtonType: NSSwitchButton];
 		[my d_cocoaRadioButton setImage: image];
 		[my d_cocoaRadioButton setAlternateImage: alternateImage];
-		[my d_cocoaRadioButton setTitle: (NSString *) Melder_peekWcsToCfstring (buttonText)];
+		[my d_cocoaRadioButton setTitle: (NSString *) Melder_peek32toCfstring (buttonText)];
 		if (flags & GuiCheckButton_SET) {
 			[my d_cocoaRadioButton setState: NSOnState];
 		}
@@ -225,7 +225,7 @@ GuiRadioButton GuiRadioButton_create (GuiForm parent, int left, int right, int t
 		my d_cocoaRadioButton = [[GuiCocoaRadioButton alloc] initWithFrame:matrixRect];
 		[my d_cocoaRadioButton   setUserData: me];
 		[my d_cocoaRadioButton setButtonType: NSRadioButton];
-		[my d_cocoaRadioButton setTitle: (NSString *) Melder_peekWcsToCfstring (buttonText)];
+		[my d_cocoaRadioButton setTitle: (NSString *) Melder_peek32toCfstring (buttonText)];
     	NSMatrix *radioMatrix = [[NSMatrix alloc] initWithFrame: matrixRect   mode: NSRadioModeMatrix
 			prototype: (NSCell *) [my d_cocoaRadioButton cell]   numberOfRows: 1   numberOfColumns: 1];
 		my d_widget = (GuiObject) radioMatrix; //my d_cocoaRadioButton;
@@ -233,7 +233,7 @@ GuiRadioButton GuiRadioButton_create (GuiForm parent, int left, int right, int t
 		[radioMatrix   addSubview: my d_cocoaRadioButton];
 		[my d_cocoaRadioButton   setUserData: me];
 		[my d_cocoaRadioButton setButtonType: NSRadioButton];
-		[my d_cocoaRadioButton setTitle: (NSString *) Melder_peekWcsToCfstring (buttonText)];
+		[my d_cocoaRadioButton setTitle: (NSString *) Melder_peek32toCfstring (buttonText)];
 		if (flags & GuiCheckButton_SET) {
 			[my d_cocoaRadioButton setState: NSOnState];
 		}
@@ -243,14 +243,14 @@ GuiRadioButton GuiRadioButton_create (GuiForm parent, int left, int right, int t
 		my d_widget = _Gui_initializeWidget (xmToggleButtonWidgetClass, parent -> d_widget, buttonText);
 		_GuiObject_setUserData (my d_widget, me);
 		my d_widget -> isRadioButton = true;
-		my d_widget -> window = CreateWindow (L"button", _GuiWin_expandAmpersands (buttonText),
+		my d_widget -> window = CreateWindow (L"button", Melder_peek32toW (_GuiWin_expandAmpersands (buttonText)),
 			WS_CHILD
 			| ( my d_widget -> parent -> radioBehavior ? BS_AUTORADIOBUTTON : BS_RADIOBUTTON )
 			| WS_CLIPSIBLINGS,
 			my d_widget -> x, my d_widget -> y, my d_widget -> width, my d_widget -> height,
-			my d_widget -> parent -> window, (HMENU) 1, theGui.instance, NULL);
+			my d_widget -> parent -> window, (HMENU) 1, theGui.instance, nullptr);
 		SetWindowLongPtr (my d_widget -> window, GWLP_USERDATA, (LONG_PTR) my d_widget);
-		SetWindowFont (my d_widget -> window, GetStockFont (ANSI_VAR_FONT), FALSE);
+		SetWindowFont (my d_widget -> window, GetStockFont (ANSI_VAR_FONT), false);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		if (flags & GuiRadioButton_SET) {
 			Button_SetCheck (my d_widget -> window, BST_CHECKED);
@@ -259,9 +259,9 @@ GuiRadioButton GuiRadioButton_create (GuiForm parent, int left, int right, int t
 		my d_widget = _Gui_initializeWidget (xmToggleButtonWidgetClass, parent -> d_widget, buttonText);
 		_GuiObject_setUserData (my d_widget, me);
 		my d_widget -> isRadioButton = true;
-		CreateRadioButtonControl (my d_widget -> macWindow, & my d_widget -> rect, NULL,
+		CreateRadioButtonControl (my d_widget -> macWindow, & my d_widget -> rect, nullptr,
 			(flags & GuiRadioButton_SET) != 0, true, & my d_widget -> nat.control.handle);
-		Melder_assert (my d_widget -> nat.control.handle != NULL);
+		Melder_assert (my d_widget -> nat.control.handle);
 		SetControlReference (my d_widget -> nat.control.handle, (long) my d_widget);
 		my d_widget -> isControl = true;
 		_GuiNativeControl_setFont (my d_widget, 0, 13);
@@ -269,80 +269,80 @@ GuiRadioButton GuiRadioButton_create (GuiForm parent, int left, int right, int t
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 	#endif
 	if (flags & GuiRadioButton_INSENSITIVE) {
-		my f_setSensitive (false);
+		GuiThing_setSensitive (me, false);
 	}
 	if (my d_previous) {
-		Melder_assert (my d_previous != NULL);
+		Melder_assert (my d_previous);
 		Melder_assert (my d_previous -> classInfo == classGuiRadioButton);
 		my d_previous -> d_next = me;
 	}
 	latestRadioButton = me;
-	trace ("end");
+	trace (U"end");
 	return me;
 }
 
 GuiRadioButton GuiRadioButton_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	const wchar_t *buttonText, void (*valueChangedCallback) (void *boss, GuiRadioButtonEvent event), void *valueChangedBoss, unsigned long flags)
+	const char32 *buttonText, void (*valueChangedCallback) (void *boss, GuiRadioButtonEvent event), void *valueChangedBoss, uint32 flags)
 {
 	GuiRadioButton me = GuiRadioButton_create (parent, left, right, top, bottom, buttonText, valueChangedCallback, valueChangedBoss, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
-bool structGuiRadioButton :: f_getValue () {
+bool GuiRadioButton_getValue (GuiRadioButton me) {
 	bool value = false;
 	#if gtk
-		value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (d_widget));   // gtk_check_button inherits from gtk_toggle_button
+		value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (my d_widget));   // gtk_check_button inherits from gtk_toggle_button
 	#elif cocoa
-        value = [d_cocoaRadioButton state] == NSOnState;
+        value = [my d_cocoaRadioButton state] == NSOnState;
 	#elif win
-		value = (Button_GetState (d_widget -> window) & 0x0003) == BST_CHECKED;
+		value = (Button_GetState (my d_widget -> window) & 0x0003) == BST_CHECKED;
 	#elif mac
-		value = GetControlValue (d_widget -> nat.control.handle);
+		value = GetControlValue (my d_widget -> nat.control.handle);
 	#endif
 	return value;
 }
 
-void structGuiRadioButton :: f_set () {
-	trace ("enter");
-	GuiControlBlockValueChangedCallbacks block (this);   // the value should be set without calling the valueChanged callback (crucial on GTK)
+void GuiRadioButton_set (GuiRadioButton me) {
+	trace (U"enter");
+	GuiControlBlockValueChangedCallbacks block (me);   // the value should be set without calling the valueChanged callback (crucial on GTK)
 	#if gtk
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (d_widget), TRUE);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (my d_widget), true);
 	#elif cocoa
-		[d_cocoaRadioButton   setState: NSOnState];
+		[my d_cocoaRadioButton   setState: NSOnState];
 		/*
 		 * Deselect the sister buttons.
 		 */
-		for (GuiRadioButton sibling = d_previous; sibling != NULL; sibling = sibling -> d_previous) {
+		for (GuiRadioButton sibling = my d_previous; sibling != nullptr; sibling = sibling -> d_previous) {
 			[sibling -> d_cocoaRadioButton   setState: NSOffState];
 		}
-		for (GuiRadioButton sibling = d_next; sibling != NULL; sibling = sibling -> d_next) {
+		for (GuiRadioButton sibling = my d_next; sibling != nullptr; sibling = sibling -> d_next) {
 			[sibling -> d_cocoaRadioButton   setState: NSOffState];
 		}
 	#elif win
-		Button_SetCheck (d_widget -> window, BST_CHECKED);
+		Button_SetCheck (my d_widget -> window, BST_CHECKED);
 		/*
 		 * Deselect the sister buttons.
 		 */
-		for (GuiRadioButton sibling = d_previous; sibling != NULL; sibling = sibling -> d_previous) {
+		for (GuiRadioButton sibling = my d_previous; sibling != nullptr; sibling = sibling -> d_previous) {
 			Button_SetCheck (sibling -> d_widget -> window, BST_UNCHECKED);
 		}
-		for (GuiRadioButton sibling = d_next; sibling != NULL; sibling = sibling -> d_next) {
+		for (GuiRadioButton sibling = my d_next; sibling != nullptr; sibling = sibling -> d_next) {
 			Button_SetCheck (sibling -> d_widget -> window, BST_UNCHECKED);
 		}
 	#elif mac
-		SetControlValue (d_widget -> nat.control.handle, true);
+		SetControlValue (my d_widget -> nat.control.handle, true);
 		/*
 		 * Deselect the sister buttons.
 		 */
-		for (GuiRadioButton sibling = d_previous; sibling != NULL; sibling = sibling -> d_previous) {
+		for (GuiRadioButton sibling = my d_previous; sibling != nullptr; sibling = sibling -> d_previous) {
 			SetControlValue (sibling -> d_widget -> nat.control.handle, false);
 		}
-		for (GuiRadioButton sibling = d_next; sibling != NULL; sibling = sibling -> d_next) {
+		for (GuiRadioButton sibling = my d_next; sibling != nullptr; sibling = sibling -> d_next) {
 			SetControlValue (sibling -> d_widget -> nat.control.handle, false);
 		}
 	#endif
-	trace ("exit");
+	trace (U"exit");
 }
 
 /* End of file GuiRadioButton.cpp */
diff --git a/sys/GuiScale.cpp b/sys/GuiScale.cpp
index 827c4b0..d9b2f7b 100644
--- a/sys/GuiScale.cpp
+++ b/sys/GuiScale.cpp
@@ -1,6 +1,6 @@
 /* GuiScale.cpp
  *
- * Copyright (C) 1993-2011,2012 Paul Boersma
+ * Copyright (C) 1993-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -51,14 +51,14 @@ Thing_implement (GuiScale, GuiControl, 0);
 	- (void) dealloc {   // override
 		GuiScale me = d_userData;
 		forget (me);
-		trace ("deleting a progress bar");
+		trace (U"deleting a progress bar");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiScale));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiScale));
 		d_userData = static_cast <GuiScale> (userData);
 	}
 	@end
@@ -66,7 +66,7 @@ Thing_implement (GuiScale, GuiControl, 0);
 	void _GuiWinScale_destroy (GuiObject widget) {
 		iam_scale;
 		DestroyWindow (widget -> window);
-		trace ("forgetting a scale or a progress bar");
+		trace (U"forgetting a scale or a progress bar");
 		forget (me);   // NOTE: my widget is not destroyed here
 	}
 #elif mac
@@ -75,19 +75,19 @@ Thing_implement (GuiScale, GuiControl, 0);
 		EraseRect (& widget -> rect);
 		GuiMac_clipOff ();
 		iam_scale;
-		trace ("forgetting a scale or a progress bar");
+		trace (U"forgetting a scale or a progress bar");
 		forget (me);   // NOTE: my widget is not destroyed here
 	}
 #endif
 
 GuiScale GuiScale_create (GuiForm parent, int left, int right, int top, int bottom,
-	int minimum, int maximum, int value, unsigned long flags)
+	int minimum, int maximum, int value, uint32 /* flags */)
 {
 	GuiScale me = Thing_new (GuiScale);
 	my d_shell = parent -> d_shell;
 	my d_parent = parent;
 	#if gtk
-		my d_widget = gtk_hscrollbar_new (NULL);
+		my d_widget = gtk_hscrollbar_new (nullptr);
 		gtk_range_set_range (GTK_RANGE (my d_widget), 0, 1000);
 		GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (my d_widget));
 		adj -> page_size = 150;
@@ -105,7 +105,7 @@ GuiScale GuiScale_create (GuiForm parent, int left, int right, int top, int bott
 		[my d_cocoaScale   setMaxValue: maximum];
 		[my d_cocoaScale   setDoubleValue: value];
 	#elif motif
-		my d_widget = XmCreateScale (parent -> d_widget, "scale", NULL, 0);
+		my d_widget = XmCreateScale (parent -> d_widget, "scale", nullptr, 0);
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		XtVaSetValues (my d_widget, XmNorientation, XmHORIZONTAL,
@@ -113,26 +113,26 @@ GuiScale GuiScale_create (GuiForm parent, int left, int right, int top, int bott
 			#ifdef macintosh
 				//XmNscaleWidth, 340,
 			#endif
-			NULL);
+			nullptr);
 	#endif
 	return me;
 }
 
 GuiScale GuiScale_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	int minimum, int maximum, int value, unsigned long flags)
+	int minimum, int maximum, int value, uint32 flags)
 {
 	GuiScale me = GuiScale_create (parent, left, right, top, bottom, minimum, maximum, value, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
-void structGuiScale :: f_setValue (int value) {
+void GuiScale_setValue (GuiScale me, int value) {
 	#if gtk
-		gtk_range_set_value (GTK_RANGE (d_widget), value);
+		gtk_range_set_value (GTK_RANGE (my d_widget), value);
 	#elif cocoa
-		[d_cocoaScale   setDoubleValue: value];
+		[my d_cocoaScale   setDoubleValue: value];
 	#elif motif
-		XmScaleSetValue (d_widget, value);
+		XmScaleSetValue (my d_widget, value);
 	#endif
 }
 
diff --git a/sys/GuiScrollBar.cpp b/sys/GuiScrollBar.cpp
index 907c348..a1d81bd 100644
--- a/sys/GuiScrollBar.cpp
+++ b/sys/GuiScrollBar.cpp
@@ -1,6 +1,6 @@
 /* GuiScrollBar.cpp
  *
- * Copyright (C) 1993-2011,2012,2013,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1993-2011,2012,2013,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -40,7 +40,7 @@ Thing_implement (GuiScrollBar, GuiControl, 0);
 	}
 	static void _GuiGtkScrollBar_valueChangedCallback (GuiObject widget, gpointer void_me) {
 		iam (GuiScrollBar);
-		trace ("enter: blocked %d", my d_blockValueChangedCallbacks);
+		trace (U"enter: blocked ", my d_blockValueChangedCallbacks);
 		if (my d_blockValueChangedCallbacks) {
 			my d_blockValueChangedCallbacks = false;
 		} else if (my d_valueChangedCallback) {
@@ -48,8 +48,7 @@ Thing_implement (GuiScrollBar, GuiControl, 0);
 			try {
 				my d_valueChangedCallback (my d_valueChangedBoss, & event);
 			} catch (MelderError) {
-				Melder_error_ ("Your action in a scroll bar was not completely handled.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Your action in a scroll bar was not completely handled.");
 			}
 		}
 	}
@@ -71,14 +70,14 @@ Thing_implement (GuiScrollBar, GuiControl, 0);
 - (void) dealloc {   // override
     GuiScrollBar me = d_userData;
     forget (me);
-    trace ("deleting a scroll bar");
+    trace (U"deleting a scroll bar");
     [super dealloc];
 }
 - (GuiThing) userData {
     return d_userData;
 }
 - (void) setUserData: (GuiThing) userData {
-	Melder_assert (userData == NULL || Thing_member (userData, classGuiScrollBar));
+	Melder_assert (userData == nullptr || Thing_isa (userData, classGuiScrollBar));
 	d_userData = static_cast <GuiScrollBar> (userData);
 }
 - (void) setMinimum:(double)minimum maximum:(double)maximum value:(double)value sliderSize:(double)sliderSize increment:(double)increment pageIncrement:(double)pageIncrement {
@@ -106,12 +105,12 @@ Thing_implement (GuiScrollBar, GuiControl, 0);
         try {
             my d_valueChangedCallback (my d_valueChangedBoss, & event);
         } catch (MelderError) {
-            Melder_flushError ("Scroll not completely handled.");
+            Melder_flushError (U"Scroll not completely handled.");
         }
     }
 }
 - (void) scrollBy: (double) step {
-	trace ("step %lf", step);
+	trace (U"step ", step);
 	if (step == 0) return;
 	_m_value -= 0.3 * step * _m_increment;
 	if (_m_value < _m_minimum)
@@ -121,7 +120,7 @@ Thing_implement (GuiScrollBar, GuiControl, 0);
 	[self _update];
 }
 - (void) magnifyBy: (double) step {
-	trace ("step %lf", step);
+	trace (U"step ", step);
 	double increase = _m_sliderSize * (exp (- step) - 1.0);
 	_m_sliderSize += increase;
 	if (_m_sliderSize > _m_maximum - _m_minimum)
@@ -177,7 +176,7 @@ Thing_implement (GuiScrollBar, GuiControl, 0);
         try {
             my d_valueChangedCallback (my d_valueChangedBoss, & event);
         } catch (MelderError) {
-            Melder_flushError ("Scroll not completely handled.");
+            Melder_flushError (U"Scroll not completely handled.");
         }
     }
 }
@@ -203,7 +202,7 @@ Thing_implement (GuiScrollBar, GuiControl, 0);
 			try {
 				my d_valueChangedCallback (my d_valueChangedBoss, & event);
 			} catch (MelderError) {
-				Melder_flushError ("Scroll not completely handled.");
+				Melder_flushError (U"Scroll not completely handled.");
 			}
 		}
 	}
@@ -211,7 +210,7 @@ Thing_implement (GuiScrollBar, GuiControl, 0);
 
 GuiScrollBar GuiScrollBar_create (GuiForm parent, int left, int right, int top, int bottom,
 	double minimum, double maximum, double value, double sliderSize, double increment, double pageIncrement,
-	void (*valueChangedCallback) (void *boss, GuiScrollBarEvent event), void *valueChangedBoss, unsigned long flags)
+	void (*valueChangedCallback) (void *boss, GuiScrollBarEvent event), void *valueChangedBoss, uint32 flags)
 {
 	GuiScrollBar me = Thing_new (GuiScrollBar);
 	my d_shell = parent -> d_shell;
@@ -245,7 +244,7 @@ GuiScrollBar GuiScrollBar_create (GuiForm parent, int left, int right, int top,
 			XmNsliderSize, (int) sliderSize,
 			XmNincrement, (int) increment,
 			XmNpageIncrement, (int) pageIncrement,
-			NULL);
+			nullptr);
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		XtAddCallback (my d_widget, XmNvalueChangedCallback, _GuiMotifScrollBar_valueChangedCallback, (XtPointer) me);
@@ -260,7 +259,7 @@ GuiScrollBar GuiScrollBar_create (GuiForm parent, int left, int right, int top,
 			XmNsliderSize, (int) sliderSize,
 			XmNincrement, (int) increment,
 			XmNpageIncrement, (int) pageIncrement,
-			NULL);
+			nullptr);
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		XtAddCallback (my d_widget, XmNvalueChangedCallback, _GuiMotifScrollBar_valueChangedCallback, (XtPointer) me);
@@ -271,16 +270,16 @@ GuiScrollBar GuiScrollBar_create (GuiForm parent, int left, int right, int top,
 
 GuiScrollBar GuiScrollBar_createShown (GuiForm parent, int left, int right, int top, int bottom,
 	double minimum, double maximum, double value, double sliderSize, double increment, double pageIncrement,
-	void (*valueChangedCallback) (void *boss, GuiScrollBarEvent event), void *valueChangedBoss, unsigned long flags)
+	void (*valueChangedCallback) (void *boss, GuiScrollBarEvent event), void *valueChangedBoss, uint32 flags)
 {
 	GuiScrollBar me = GuiScrollBar_create (parent, left, right, top, bottom,
 		minimum, maximum, value, sliderSize, increment, pageIncrement,
 		valueChangedCallback, valueChangedBoss, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
-void structGuiScrollBar :: f_set (double minimum, double maximum, double value, double sliderSize, double increment, double pageIncrement) {
+void GuiScrollBar_set (GuiScrollBar me, double minimum, double maximum, double value, double sliderSize, double increment, double pageIncrement) {
 	/*
 	 * This function calls the native scroll bar modification function.
 	 *
@@ -289,15 +288,15 @@ void structGuiScrollBar :: f_set (double minimum, double maximum, double value,
 	 * This will call our own d_valueChangedCallback if we don't prevent it.
 	 * We have to prevent that, because our d_valueChangedCallback is only for user-initiated modifications.
 	 */
-	trace ("enter %.17g %.17g %.17g %.17g %.17g %.17g", minimum, maximum, value, sliderSize, increment, pageIncrement);
+	trace (U"enter ", minimum, U" ", maximum, U" ", value, U" ", sliderSize, U" ", increment, U" ", pageIncrement);
 	#if gtk
 		/*
 		 * We're going to modify the scroll bar with gtk_adjustment_configure ().
 		 * This function sends a *slow* value-changed notification to the scroll bar.
 		 * We have to make sure that our own d_valueChangedCallback is not called.
 		 */
-		d_blockValueChangedCallbacks = true;
-		GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (d_widget));
+		my d_blockValueChangedCallbacks = true;
+		GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (my d_widget));
 		gtk_adjustment_configure (GTK_ADJUSTMENT (adj),
 			NUMdefined (value)         ? value         : gtk_adjustment_get_value          (GTK_ADJUSTMENT (adj)),
 			NUMdefined (minimum)       ? minimum       : gtk_adjustment_get_lower          (GTK_ADJUSTMENT (adj)),
@@ -314,8 +313,8 @@ void structGuiScrollBar :: f_set (double minimum, double maximum, double value,
 		 * This function sends a *synchronous* value-changed notification to the scroll bar.
 		 * We have to make sure that our own d_valueChangedCallback is not called.
 		 */
-		GuiControlBlockValueChangedCallbacks block (this);
-		GuiCocoaScrollBar *scroller = (GuiCocoaScrollBar *) d_widget;
+		GuiControlBlockValueChangedCallbacks block (me);
+		GuiCocoaScrollBar *scroller = (GuiCocoaScrollBar *) my d_widget;
 		[scroller
 			setMinimum:    NUMdefined (minimum)       ? minimum       : [scroller m_minimum]
 			maximum:       NUMdefined (maximum)       ? maximum       : [scroller m_maximum]
@@ -325,43 +324,43 @@ void structGuiScrollBar :: f_set (double minimum, double maximum, double value,
 			pageIncrement: NUMdefined (pageIncrement) ? pageIncrement : [scroller m_pageIncrement]];
 	#elif motif
 		if (NUMdefined (minimum))
-			XtVaSetValues (d_widget, XmNminimum, (int) minimum, NULL);
+			XtVaSetValues (my d_widget, XmNminimum, (int) minimum, nullptr);
 		if (NUMdefined (maximum))
-			XtVaSetValues (d_widget, XmNmaximum, (int) maximum, NULL);
+			XtVaSetValues (my d_widget, XmNmaximum, (int) maximum, nullptr);
 		int oldValue, oldSliderSize, oldIncrement, oldPageIncrement;
-		XmScrollBarGetValues (d_widget, & oldValue, & oldSliderSize, & oldIncrement, & oldPageIncrement);
-		XmScrollBarSetValues (d_widget,
+		XmScrollBarGetValues (my d_widget, & oldValue, & oldSliderSize, & oldIncrement, & oldPageIncrement);
+		XmScrollBarSetValues (my d_widget,
 			NUMdefined (value)         ? value         : oldValue,
 			NUMdefined (sliderSize)    ? sliderSize    : oldSliderSize,
 			NUMdefined (increment)     ? increment     : oldIncrement,
 			NUMdefined (pageIncrement) ? pageIncrement : oldPageIncrement,
 			False);
 	#endif
-	trace ("exit");
+	trace (U"exit");
 }
 
-int structGuiScrollBar :: f_getValue () {
+int GuiScrollBar_getValue (GuiScrollBar me) {
 	#if gtk
-		return gtk_range_get_value (GTK_RANGE (d_widget));
+		return gtk_range_get_value (GTK_RANGE (my d_widget));
 	#elif cocoa
-		GuiCocoaScrollBar *scroller = (GuiCocoaScrollBar *) d_widget;
+		GuiCocoaScrollBar *scroller = (GuiCocoaScrollBar *) my d_widget;
 		return [scroller m_value];
 	#elif motif
 		int value, slider, incr, pincr;
-		XmScrollBarGetValues (d_widget, & value, & slider, & incr, & pincr);
+		XmScrollBarGetValues (my d_widget, & value, & slider, & incr, & pincr);
 		return value;
 	#endif
 }
 
-int structGuiScrollBar :: f_getSliderSize () {
+int GuiScrollBar_getSliderSize (GuiScrollBar me) {
 	#if gtk
 		return 1;   // NYI
 	#elif cocoa
-		GuiCocoaScrollBar *scroller = (GuiCocoaScrollBar *) d_widget;
-		return [scroller m_sliderSize];
+		GuiCocoaScrollBar *scroller = (GuiCocoaScrollBar *) my d_widget;
+		return [scroller   m_sliderSize];
 	#elif motif
 		int value, slider, incr, pincr;
-		XmScrollBarGetValues (d_widget, & value, & slider, & incr, & pincr);
+		XmScrollBarGetValues (my d_widget, & value, & slider, & incr, & pincr);
 		return slider;
 	#endif
 }
diff --git a/sys/GuiScrolledWindow.cpp b/sys/GuiScrolledWindow.cpp
index a315c78..d5506c4 100644
--- a/sys/GuiScrolledWindow.cpp
+++ b/sys/GuiScrolledWindow.cpp
@@ -1,6 +1,6 @@
 /* GuiScrolledWindow.cpp
  *
- * Copyright (C) 1993-2011,2012 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1993-2011,2012,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -45,14 +45,14 @@ Thing_implement (GuiScrolledWindow, GuiControl, 0);
 	- (void) dealloc {   // override
 		GuiScrolledWindow me = d_userData;
 		forget (me);
-		trace ("deleting a scrolled window");
+		trace (U"deleting a scrolled window");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiScrolledWindow));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiScrolledWindow));
 		d_userData = static_cast <GuiScrolledWindow> (userData);
 	}
 	@end
@@ -75,13 +75,13 @@ Thing_implement (GuiScrolledWindow, GuiControl, 0);
 #endif
 
 GuiScrolledWindow GuiScrolledWindow_create (GuiForm parent, int left, int right, int top, int bottom,
-	int horizontalScrollbarPersistence, int verticalScrollbarPersistence, unsigned long flags)
+	int horizontalScrollbarPersistence, int verticalScrollbarPersistence, uint32 /* flags */)
 {
 	GuiScrolledWindow me = Thing_new (GuiScrolledWindow);
 	my d_shell = parent -> d_shell;
 	my d_parent = parent;
 	#if gtk
-		my d_widget = gtk_scrolled_window_new (NULL, NULL);
+		my d_widget = gtk_scrolled_window_new (nullptr, nullptr);
 		gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (my d_widget),
 			horizontalScrollbarPersistence == 0 ? GTK_POLICY_NEVER : horizontalScrollbarPersistence == 1 ? GTK_POLICY_AUTOMATIC : GTK_POLICY_ALWAYS,
 			verticalScrollbarPersistence   == 0 ? GTK_POLICY_NEVER : verticalScrollbarPersistence   == 1 ? GTK_POLICY_AUTOMATIC : GTK_POLICY_ALWAYS);
@@ -97,21 +97,21 @@ GuiScrolledWindow GuiScrolledWindow_create (GuiForm parent, int left, int right,
         [scrollView setHasHorizontalScroller: YES];
         [scrollView setBackgroundColor: [NSColor lightGrayColor]];
 	#elif motif
-		my d_widget = XmCreateScrolledWindow (parent -> d_widget, "scrolledWindow", NULL, 0);
+		my d_widget = XmCreateScrolledWindow (parent -> d_widget, "scrolledWindow", nullptr, 0);
 		_GuiObject_setUserData (my d_widget, me);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		Melder_assert (my classInfo == classGuiScrolledWindow);
-		trace ("me = %p, user data = %p", me, my d_widget -> userData);
+		trace (U"me = ", Melder_pointer (me), U", user data = ", Melder_pointer (my d_widget -> userData));
 	#endif
 	return me;
 }
 
 
 GuiScrolledWindow GuiScrolledWindow_createShown (GuiForm parent, int left, int right, int top, int bottom,
-	int horizontalScrollbarPersistence, int verticalScrollbarPersistence, unsigned long flags)
+	int horizontalScrollbarPersistence, int verticalScrollbarPersistence, uint32 flags)
 {
 	GuiScrolledWindow me = GuiScrolledWindow_create (parent, left, right, top, bottom, horizontalScrollbarPersistence, verticalScrollbarPersistence, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
diff --git a/sys/GuiShell.cpp b/sys/GuiShell.cpp
index dc9ee77..af827d7 100644
--- a/sys/GuiShell.cpp
+++ b/sys/GuiShell.cpp
@@ -1,6 +1,6 @@
 /* GuiShell.cpp
  *
- * Copyright (C) 1993-2012 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1993-2012,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,67 +24,67 @@ Thing_implement (GuiShell, GuiForm, 0);
 
 void structGuiShell :: v_destroy () {
 	#if cocoa
-		if (d_cocoaWindow) {
-			[d_cocoaWindow setUserData: NULL];   // undangle reference to this
-			Melder_fatal ("ordering out?");
-			[d_cocoaWindow orderOut: nil];
-			[d_cocoaWindow close];
-			[d_cocoaWindow release];
-			d_cocoaWindow = NULL;   // undangle
+		if (our d_cocoaWindow) {
+			[our d_cocoaWindow setUserData: nullptr];   // undangle reference to this
+			Melder_fatal (U"ordering out?");
+			[our d_cocoaWindow orderOut: nil];
+			[our d_cocoaWindow close];
+			[our d_cocoaWindow release];
+			our d_cocoaWindow = nullptr;   // undangle
 		}
 	#endif
 	GuiShell_Parent :: v_destroy ();
 }
 
-int structGuiShell :: f_getShellWidth () {
+int GuiShell_getShellWidth (GuiShell me) {
 	int width = 0;
 	#if gtk
-		width = GTK_WIDGET (d_gtkWindow) -> allocation.width;
+		width = GTK_WIDGET (my d_gtkWindow) -> allocation.width;
 	#elif cocoa
-        return [d_cocoaWindow frame].size.width;
+        return [my d_cocoaWindow frame].size.width;
 	#elif motif
-		width = d_xmShell -> width;
+		width = my d_xmShell -> width;
 	#endif
 	return width;
 }
 
-int structGuiShell :: f_getShellHeight () {
+int GuiShell_getShellHeight (GuiShell me) {
 	int height = 0;
 	#if gtk
-		height = GTK_WIDGET (d_gtkWindow) -> allocation.height;
+		height = GTK_WIDGET (my d_gtkWindow) -> allocation.height;
 	#elif cocoa
-        return [d_cocoaWindow frame].size.height;
+        return [my d_cocoaWindow frame].size.height;
 	#elif motif
-		height = d_xmShell -> height;
+		height = my d_xmShell -> height;
 	#endif
 	return height;
 }
 
-void structGuiShell :: f_setTitle (const wchar_t *title) {
+void GuiShell_setTitle (GuiShell me, const char32 *title /* cattable */) {
 	#if gtk
-		gtk_window_set_title (d_gtkWindow, Melder_peekWcsToUtf8 (title));
+		gtk_window_set_title (my d_gtkWindow, Melder_peek32to8 (title));
 	#elif cocoa
-		[d_cocoaWindow setTitle: (NSString *) Melder_peekWcsToCfstring (title)];
+		[my d_cocoaWindow setTitle: (NSString *) Melder_peek32toCfstring (title)];
 	#elif win
-		SetWindowText (d_xmShell -> window, title);
+		SetWindowTextW (my d_xmShell -> window, Melder_peek32toW (title));
 	#elif mac
-		SetWindowTitleWithCFString (d_xmShell -> nat.window.ptr, (CFStringRef) Melder_peekWcsToCfstring (title));
+		SetWindowTitleWithCFString (my d_xmShell -> nat.window.ptr, (CFStringRef) Melder_peek32toCfstring (title));
 	#endif
 }
 
-void structGuiShell :: f_drain () {
+void GuiShell_drain (GuiShell me) {
 	#if gtk
-		//gdk_window_flush (gtk_widget_get_window (me));
+		//gdk_window_flush (gtk_widget_get_window (my d_gtkWindow));
 		gdk_flush ();
 	#elif cocoa
-        //[d_cocoaWindow displayIfNeeded];
-        [d_cocoaWindow flushWindow];
-		//[d_cocoaWindow display];
+        //[my d_cocoaWindow   displayIfNeeded];
+        [my d_cocoaWindow   flushWindow];
+		//[my d_cocoaWindow   display];
 	#elif win
 	#elif mac
-		Melder_assert (d_xmShell != NULL);
-		Melder_assert (d_xmShell -> nat.window.ptr != NULL);
-		QDFlushPortBuffer (GetWindowPort (d_xmShell -> nat.window.ptr), NULL);
+		Melder_assert (my d_xmShell);
+		Melder_assert (my d_xmShell -> nat.window.ptr);
+		QDFlushPortBuffer (GetWindowPort (my d_xmShell -> nat.window.ptr), nullptr);
 		/*
 		 * The following TRICK cost me half a day to work out.
 		 * It turns out that after a call to QDFlushPortBuffer (),
@@ -96,7 +96,7 @@ void structGuiShell :: f_drain () {
 		 * a simple Graphics_function () of e.g. noise.
 		 */
 		static Rect bounds = { -32768, -32768, 32767, 32767 };
-		QDAddRectToDirtyRegion (GetWindowPort (d_xmShell -> nat.window.ptr), & bounds);
+		QDAddRectToDirtyRegion (GetWindowPort (my d_xmShell -> nat.window.ptr), & bounds);
 	#endif
 }
 
diff --git a/sys/GuiText.cpp b/sys/GuiText.cpp
index 532c5fd..ac00953 100644
--- a/sys/GuiText.cpp
+++ b/sys/GuiText.cpp
@@ -1,6 +1,6 @@
 /* GuiText.cpp
  *
- * Copyright (C) 1993-2011,2012,2013,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1993-2011,2012,2013,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,7 +24,6 @@
  * pb 2005/09/01 Mac: GuiText_undo and GuiText_redo
  * pb 2006/10/29 Mac: erased MacOS 9 stuff
  * pb 2006/11/10 comments
- * pb 2007/02/15 Mac: GuiText_updateChangeCountAfterSave
  * pb 2007/05/30 GuiText_getStringW
  * pb 2007/05/31 Mac: CreateEditUnicodeTextControl
  * pb 2007/06/01 Mac: erased TextEdit stuff as well as changeCount
@@ -42,7 +41,7 @@
  * pb 2010/05/30 GTK selections
  * pb 2010/11/28 removed Motif
  * pb 2011/04/06 C++
- * pb,tm 2013    Cocoa
+ * pb,tn 2013    Cocoa
  */
 
 #include "GuiP.h"
@@ -65,7 +64,7 @@ Thing_implement (GuiText, GuiControl, 0);
 
 #if mac
 	#define isTextControl(w)  ((w) -> isControl != 0)
-	#define isMLTE(w)  ((w) -> d_macMlteObject != NULL)
+	#define isMLTE(w)  ((w) -> d_macMlteObject != nullptr)
 #endif
 
 #if win
@@ -142,11 +141,11 @@ void _GuiText_handleFocusLoss (GuiObject widget) {
 	 * 4. on window unmanaging
 	 */
 	if (widget == theGui.textFocus)
-		theGui.textFocus = NULL;
+		theGui.textFocus = nullptr;
 }
 
 #if mac
-void _GuiMac_clearTheTextFocus (void) {
+void _GuiMac_clearTheTextFocus () {
 	if (theGui.textFocus) {
 		GuiText textFocus = (GuiText) theGui.textFocus -> userData;
 		_GuiMac_clipOnParent (theGui.textFocus);
@@ -163,12 +162,12 @@ void _GuiMac_clearTheTextFocus (void) {
 #endif
 
 void _GuiText_setTheTextFocus (GuiObject widget) {
-	if (widget == NULL || theGui.textFocus == widget
-		|| ! widget -> managed) return;   /* Perhaps not-yet-managed. Test: open Praat's DataEditor with a Sound, then type. */
+	if (! widget || theGui.textFocus == widget
+		|| ! widget -> managed) return;   // perhaps not-yet-managed; test: open Praat's DataEditor with a Sound, then type
 	#if gtk
-		gtk_widget_grab_focus (GTK_WIDGET (widget));
+		gtk_widget_grab_focus (GTK_WIDGET (widget));   // not used: gtk is not 1 when motif is 1
 	#elif win
-		SetFocus (widget -> window);   /* Will send an EN_SETFOCUS notification, which will call _GuiText_handleFocusReception (). */
+		SetFocus (widget -> window);   // will send an EN_SETFOCUS notification, which will call _GuiText_handleFocusReception ()
 	#elif mac
 		iam_text;
 		_GuiMac_clearTheTextFocus ();
@@ -219,15 +218,15 @@ void _GuiText_handleValueChanged (GuiObject widget) {
 				}
 			} else if (isMLTE (me)) {
 				if (charCode == 'X' && my d_editable) {
-					if (event -> what != autoKey) my f_cut ();
+					if (event -> what != autoKey) GuiText_cut (me);
 					return 1;
 				}
 				if (charCode == 'C') {
-					if (event -> what != autoKey) my f_copy ();
+					if (event -> what != autoKey) GuiText_copy (me);
 					return 1;
 				}
 				if (charCode == 'V' && my d_editable) {
-					my f_paste ();
+					GuiText_paste (me);
 					return 1;
 				}
 			}
@@ -240,11 +239,11 @@ void _GuiText_handleValueChanged (GuiObject widget) {
 			iam_text;
 			if (my d_editable) {
 				_GuiMac_clipOnParent (widget);
-				//Melder_casual ("char code %d", charCode);
+				//Melder_casual (U"char code ", (int) charCode);
 				if (isTextControl (widget)) {
 					CallNextEventHandler (eventHandlerCallRef, eventRef);
 				} else if (isMLTE (me)) {
-					//static long key = 0; Melder_casual ("key %ld", ++key);
+					//static long key = 0; Melder_casual (U"key ", ++key);
 					//TXNKeyDown (my macMlteObject, event);   // Tends never to be called.
 					CallNextEventHandler (eventHandlerCallRef, eventRef);
 				}
@@ -255,17 +254,17 @@ void _GuiText_handleValueChanged (GuiObject widget) {
 				return 1;
 			}
 		}
-		return 0;   /* Not handled. */
+		return 0;   // not handled
 	}
 	void _GuiMacText_handleClick (GuiObject widget, EventRecord *event) {
 		iam_text;
 		_GuiText_setTheTextFocus (widget);
 		_GuiMac_clipOnParent (widget);
 		if (isTextControl (widget)) {
-			HandleControlClick (widget -> nat.control.handle, event -> where, event -> modifiers, NULL);
+			HandleControlClick (widget -> nat.control.handle, event -> where, event -> modifiers, nullptr);
 		} else if (isMLTE (me)) {
 			LocalToGlobal (& event -> where);
-			TXNClick (my d_macMlteObject, event);   /* Handles text selection and scrolling. */
+			TXNClick (my d_macMlteObject, event);   // handles text selection and scrolling
 			GlobalToLocal (& event -> where);
 		}
 		GuiMac_clipOff ();
@@ -348,9 +347,9 @@ void _GuiText_unmanage (GuiObject widget) {
 #if win
 	void _GuiWinText_destroy (GuiObject widget) {
 		if (widget == theGui.textFocus)
-			theGui.textFocus = NULL;   // remove dangling reference
+			theGui.textFocus = nullptr;   // remove dangling reference
 		if (widget == widget -> shell -> textFocus)
-			widget -> shell -> textFocus = NULL;   // remove dangling reference
+			widget -> shell -> textFocus = nullptr;   // remove dangling reference
 		iam_text;
 		DestroyWindow (widget -> window);
 		forget (me);   // NOTE: my widget is not destroyed here
@@ -362,9 +361,9 @@ void _GuiText_unmanage (GuiObject widget) {
 #elif mac
 	void _GuiMacText_destroy (GuiObject widget) {
 		if (widget == theGui.textFocus)
-			theGui.textFocus = NULL;   // remove dangling reference
+			theGui.textFocus = nullptr;   // remove dangling reference
 		if (widget == widget -> shell -> textFocus)
-			widget -> shell -> textFocus = NULL;   // remove dangling reference
+			widget -> shell -> textFocus = nullptr;   // remove dangling reference
 		iam_text;
 		if (isTextControl (widget)) {
 			_GuiMac_clipOnParent (widget);
@@ -381,7 +380,7 @@ void _GuiText_unmanage (GuiObject widget) {
 		if (isTextControl (widget)) {
 			Draw1Control (widget -> nat.control.handle);
 		} else if (isMLTE (me)) {
-			TXNDraw (my d_macMlteObject, NULL);
+			TXNDraw (my d_macMlteObject, nullptr);
 		}
 		GuiMac_clipOff ();
 	}
@@ -402,122 +401,74 @@ void _GuiText_unmanage (GuiObject widget) {
 
 static long NativeText_getLength (GuiObject widget) {
 	#if win
-		return Edit_GetTextLength (widget -> window);
+		return Edit_GetTextLength (widget -> window);   // in UTF-16 code units
 	#elif mac
 		iam_text;
 		if (isTextControl (widget)) {
 			Size size;
 			CFStringRef cfString;
-			GetControlData (widget -> nat.control.handle, kControlEntireControl, kControlEditTextCFStringTag, sizeof (CFStringRef), & cfString, NULL);
+			GetControlData (widget -> nat.control.handle, kControlEntireControl, kControlEditTextCFStringTag, sizeof (CFStringRef), & cfString, nullptr);
 			size = CFStringGetLength (cfString);
 			CFRelease (cfString);
 			return size;
 		} else if (isMLTE (me)) {
-			#if 1
-				/*
-				 * From the reference page of TXNDataSize:
-				 * "If you are using Unicode and you want to know the number of characters,
-				 * divide the returned ByteCount value by sizeof(UniChar) or 2,
-				 * since MLTE uses the 16-bit Unicode Transformation Format (UTF-16)."
-				 */
-				return TXNDataSize (my d_macMlteObject) / sizeof (UniChar);
-			#else
-				long length = 0, dataSize = TXNDataSize (my d_macMlteObject);
-				ItemCount numberOfRuns;
-				TXNCountRunsInRange (my d_macMlteObject, 0, dataSize, & numberOfRuns);
-				for (long irun = 0; irun < numberOfRuns; irun ++) {
-					unsigned long left, right;
-					TXNDataType dataType;
-					TXNGetIndexedRunInfoFromRange (my d_macMlteObject, irun, 0, dataSize,
-						& left, & right, & dataType, 0, NULL);
-					if (dataType == kTXNTextData || dataType == kTXNUnicodeTextData) {
-						Handle han;
-						TXNGetDataEncoded (my d_macMlteObject, left, right, & han, kTXNUnicodeTextData);
-						if (han) {
-							long size = GetHandleSize (han) / 2;
-							length += size;
-							DisposeHandle (han);
-						}
-					}
-				}
-				return length;
-			#endif
+			/*
+			 * From the reference page of TXNDataSize:
+			 * "If you are using Unicode and you want to know the number of characters,
+			 * divide the returned ByteCount value by sizeof(UniChar) or 2,
+			 * since MLTE uses the 16-bit Unicode Transformation Format (UTF-16)."
+			 */
+			return TXNDataSize (my d_macMlteObject) / sizeof (UniChar);
 		}
-		return 0;   // Should not occur.
+		return 0;   // should not occur
 	#endif
 }
 
-static void NativeText_getText (GuiObject widget, wchar_t *buffer, long length) {
-	#if win
-		GetWindowText (widget -> window, buffer, length + 1);
-	#elif mac
-		iam_text;
-		if (isTextControl (widget)) {
-			CFStringRef cfString;
-			GetControlData (widget -> nat.control.handle, kControlEntireControl, kControlEditTextCFStringTag, sizeof (CFStringRef), & cfString, NULL);
-			UniChar *macText = Melder_malloc_f (UniChar, length + 1);
-			CFRange range = { 0, length };
-			CFStringGetCharacters (cfString, range, macText);
-			CFRelease (cfString);
-			long j = 0;
-			for (long i = 0; i < length; i ++) {
-				unsigned long kar = macText [i];
-				if (kar < 0xD800 || kar > 0xDFFF) {
-					buffer [j ++] = kar;
-				} else {
-					Melder_assert (kar >= 0xD800 && kar <= 0xDBFF);
-					unsigned long kar1 = macText [++ i];
-					Melder_assert (kar1 >= 0xDC00 && kar1 <= 0xDFFF);
-					buffer [j ++] = 0x10000 + ((kar & 0x3FF) << 10) + (kar1 & 0x3FF);
-				}
+#if mac
+static void NativeText_getText (GuiObject widget, char32 *buffer, long length) {
+	iam_text;
+	if (isTextControl (widget)) {
+		CFStringRef cfString;
+		GetControlData (widget -> nat.control.handle, kControlEntireControl, kControlEditTextCFStringTag, sizeof (CFStringRef), & cfString, nullptr);
+		UniChar *macText = Melder_malloc_f (UniChar, length + 1);
+		CFRange range = { 0, length };
+		CFStringGetCharacters (cfString, range, macText);
+		CFRelease (cfString);
+		long j = 0;
+		for (long i = 0; i < length; i ++) {
+			char32 kar = macText [i];
+			if (kar < 0x00D800 || kar > 0x00DFFF) {
+				buffer [j ++] = kar;
+			} else {
+				Melder_assert (kar >= 0x00D800 && kar <= 0x00DBFF);
+				char32 kar1 = macText [++ i];
+				Melder_assert (kar1 >= 0x00DC00 && kar1 <= 0x00DFFF);
+				buffer [j ++] = 0x010000 + ((kar & 0x0003FF) << 10) + (kar1 & 0x0003FF);
 			}
-			buffer [j] = '\0';
-			Melder_free (macText);
-		} else if (isMLTE (me)) {
-			#if 1
-				Handle han;
-				TXNGetDataEncoded (my d_macMlteObject, 0, length, & han, kTXNUnicodeTextData);
-				long j = 0;
-				for (long i = 0; i < length; i ++) {
-					unsigned long kar = ((UniChar *) *han) [i];
-					if (kar < 0xD800 || kar > 0xDFFF) {
-						buffer [j ++] = kar;
-					} else {
-						Melder_assert (kar >= 0xD800 && kar <= 0xDBFF);
-						unsigned long kar1 = ((UniChar *) *han) [++ i];
-						Melder_assert (kar1 >= 0xDC00 && kar1 <= 0xDFFF);
-						buffer [j ++] = 0x10000 + ((kar & 0x3FF) << 10) + (kar1 & 0x3FF);
-					}
-				}
-				buffer [j] = '\0';
-				DisposeHandle (han);
-			#else
-				long dataSize = TXNDataSize (my d_macMlteObject);
-				ItemCount numberOfRuns;
-				TXNCountRunsInRange (my d_macMlteObject, 0, dataSize, & numberOfRuns);
-				for (long irun = 0; irun < numberOfRuns; irun ++) {
-					unsigned long left, right;
-					TXNDataType dataType;
-					TXNGetIndexedRunInfoFromRange (my d_macMlteObject, irun, 0, dataSize,
-						& left, & right, & dataType, 0, NULL);
-					if (dataType == kTXNTextData || dataType == kTXNUnicodeTextData) {
-						Handle han;
-						TXNGetDataEncoded (my d_macMlteObject, left, right, & han, kTXNUnicodeTextData);
-						if (han) {
-							long size = GetHandleSize (han) / 2;
-							wcsncpy (buffer, (wchar_t *) *han, size);
-							buffer += size;
-							DisposeHandle (han);
-						}
-					}
-				}
-				buffer [0] = '\0';
-				return;
-			#endif
 		}
-	#endif
-	buffer [length] = '\0';   // superfluous?
+		buffer [j] = U'\0';
+		Melder_free (macText);
+	} else if (isMLTE (me)) {
+		Handle han;
+		TXNGetDataEncoded (my d_macMlteObject, 0, length, & han, kTXNUnicodeTextData);
+		long j = 0;
+		for (long i = 0; i < length; i ++) {
+			char32 kar = ((UniChar *) *han) [i];
+			if (kar < 0x00D800 || kar > 0x00DFFF) {
+				buffer [j ++] = kar;
+			} else {
+				Melder_assert (kar >= 0x00D800 && kar <= 0x00DBFF);
+				char32 kar1 = ((UniChar *) *han) [++ i];
+				Melder_assert (kar1 >= 0x00DC00 && kar1 <= 0x00DFFF);
+				buffer [j ++] = 0x010000 + ((kar & 0x0003FF) << 10) + (kar1 & 0x0003FF);
+			}
+		}
+		buffer [j] = U'\0';
+		DisposeHandle (han);
+	}
+	buffer [length] = L'\0';   // superfluous?
 }
+#endif
 
 /*
  * SELECTION
@@ -534,7 +485,7 @@ static int NativeText_getSelectionRange (GuiObject widget, long *out_left, long
 		iam_text;
 		if (isTextControl (widget)) {
 			ControlEditTextSelectionRec rec;
-			GetControlData (widget -> nat.control.handle, kControlEntireControl, kControlEditTextSelectionTag, sizeof (rec), & rec, NULL);
+			GetControlData (widget -> nat.control.handle, kControlEntireControl, kControlEditTextSelectionTag, sizeof (rec), & rec, nullptr);
 			left = rec.selStart;
 			right = rec. selEnd;
 		} else if (isMLTE (me)) {
@@ -550,7 +501,7 @@ static int NativeText_getSelectionRange (GuiObject widget, long *out_left, long
  * PACKAGE
  */
 
-void _GuiText_init (void) {
+void _GuiText_init () {
 	#if mac
 		//short font;
 		TXNMacOSPreferredFontDescription defaults = { 0 };
@@ -563,7 +514,7 @@ void _GuiText_init (void) {
 	#endif
 }
 
-void _GuiText_exit (void) {
+void _GuiText_exit () {
 	#if mac
 		TXNTerminateTextension (); 
 	#endif
@@ -613,17 +564,17 @@ void _GuiText_exit (void) {
 
 	/* Tests the previous elements of the history for mergability with the one to insert given via parameters.
 	 * If successful, it returns a pointer to the last valid entry in the merged history list, otherwise
-	 * returns NULL.
+	 * returns nullptr.
 	 * Specifically the function expands the previous insert/delete event(s)
 	 *  - with the current, if current also is an insert/delete event and the ranges of previous and current event match
 	 *  - with the previous delete and current insert event, in case the ranges of both event-pairs respectively match
 	 */
 	static history_entry * history_addAndMerge (void *void_me, history_data text_new, long first, long last, bool deleted) {
 		iam(GuiText);
-		history_entry *he = NULL;
+		history_entry *he = nullptr;
 		
-		if (!(my d_prev))
-			return NULL;
+		if (! my d_prev)
+			return nullptr;
 		
 		if (my d_prev->type_del == deleted) {
 			// extend the last history event by this one
@@ -703,10 +654,10 @@ void _GuiText_exit (void) {
 			free (old_hnext);
 			old_hnext = hnext;
 		}
-		my d_next = NULL;
+		my d_next = nullptr;
 		
 		history_entry *he = history_addAndMerge (void_me, text_new, first, last, deleted);
-		if (he == NULL) {
+		if (! he) {
 			he = (history_entry *) malloc (sizeof (history_entry));
 			he->first = first;
 			he->last = last;
@@ -714,31 +665,31 @@ void _GuiText_exit (void) {
 			he->text = text_new;
 			
 			he->prev = my d_prev;
-			he->next = NULL;
+			he->next = nullptr;
 			if (my d_prev)
 				my d_prev->next = he;
 		}
 		my d_prev = he;
-		he->next = NULL;
+		he->next = nullptr;
 		
-		if (my d_undo_item) my d_undo_item -> f_setSensitive (true);
-		if (my d_redo_item) my d_redo_item -> f_setSensitive (false);
+		if (my d_undo_item) GuiThing_setSensitive (my d_undo_item, true);
+		if (my d_redo_item) GuiThing_setSensitive (my d_redo_item, false);
 	}
 
 	static bool history_has_undo (void *void_me) {
 		iam (GuiText);
-		return my d_prev != NULL;
+		return my d_prev != nullptr;
 	}
 
 	static bool history_has_redo (void *void_me) {
 		iam (GuiText);
-		return my d_next != NULL;
+		return my d_next != nullptr;
 	}
 
 	static void history_do (void *void_me, bool undo) {
 		iam (GuiText);
 		history_entry *he = undo ? my d_prev : my d_next;
-		if (he == NULL) // TODO: this function should not be called in that case
+		if (! he) // TODO: this function should not be called in that case
 			return;
 		
 		my d_history_change = 1;
@@ -757,8 +708,8 @@ void _GuiText_exit (void) {
 			my d_next = my d_next->next;
 		}
 		
-		if (my d_undo_item) my d_undo_item -> f_setSensitive (history_has_undo(me));
-		if (my d_redo_item) my d_redo_item -> f_setSensitive (history_has_redo(me));
+		if (my d_undo_item) GuiThing_setSensitive (my d_undo_item, history_has_undo (me));
+		if (my d_redo_item) GuiThing_setSensitive (my d_redo_item, history_has_redo (me));
 	}
 
 	static void history_clear(void *void_me) {
@@ -772,7 +723,7 @@ void _GuiText_exit (void) {
 			free(h1);
 			h1 = h2;
 		}
-		my d_prev = NULL;
+		my d_prev = nullptr;
 		
 		h1 = my d_next;
 		while (h1) {
@@ -781,10 +732,10 @@ void _GuiText_exit (void) {
 			free(h1);
 			h1 = h2;
 		}
-		my d_next = NULL;
+		my d_next = nullptr;
 		
-		if (my d_undo_item) my d_undo_item -> f_setSensitive (false);
-		if (my d_redo_item) my d_redo_item -> f_setSensitive (false);
+		if (my d_undo_item) GuiThing_setSensitive (my d_undo_item, false);
+		if (my d_redo_item) GuiThing_setSensitive (my d_redo_item, false);
 	}
 #endif
 
@@ -795,7 +746,7 @@ void _GuiText_exit (void) {
 #if gtk
 	static void _GuiGtkEntry_history_delete_cb (GtkEditable *ed, gint from, gint to, gpointer void_me) {
 		iam (GuiText);
-		trace ("begin");
+		trace (U"begin");
 		if (my d_history_change) return;
 		history_add (me, gtk_editable_get_chars (GTK_EDITABLE (ed), from, to), from, to, 1);
 	}
@@ -803,7 +754,7 @@ void _GuiText_exit (void) {
 	static void _GuiGtkEntry_history_insert_cb (GtkEditable *ed, gchar *utf8_text, gint len, gint *from, gpointer void_me) {
 		(void) ed;
 		iam (GuiText);
-		trace ("begin");
+		trace (U"begin");
 		if (my d_history_change) return;
 		gchar *text = (gchar *) malloc (sizeof (gchar) * (len + 1));
 		strcpy (text, utf8_text);
@@ -812,17 +763,17 @@ void _GuiText_exit (void) {
 	
 	static void _GuiGtkTextBuf_history_delete_cb (GtkTextBuffer *buffer, GtkTextIter *from, GtkTextIter *to, gpointer void_me) {
 		iam (GuiText);
-		trace ("begin");
+		trace (U"begin");
 		if (my d_history_change) return;
 		int from_pos = gtk_text_iter_get_offset (from);
 		int to_pos = gtk_text_iter_get_offset (to);
-		history_add (me, gtk_text_buffer_get_text (buffer, from, to, FALSE), from_pos, to_pos, 1);
+		history_add (me, gtk_text_buffer_get_text (buffer, from, to, false), from_pos, to_pos, 1);
 	}
 	
 	static void _GuiGtkTextBuf_history_insert_cb (GtkTextBuffer *buffer, GtkTextIter *from, gchar *utf8_text, gint len, gpointer void_me) {
 		(void) buffer;
 		iam (GuiText);
-		trace ("begin");
+		trace (U"begin");
 		if (my d_history_change) return;
 		int from_pos = gtk_text_iter_get_offset (from);
 		gchar *text = (gchar *) malloc (sizeof (gchar) * (len + 1));
@@ -832,9 +783,9 @@ void _GuiText_exit (void) {
 	
 	static void _GuiGtkText_valueChangedCallback (GuiObject widget, gpointer void_me) {
 		iam (GuiText);
-		trace ("begin");
-		Melder_assert (me != NULL);
-		if (my d_changeCallback != NULL) {
+		trace (U"begin");
+		Melder_assert (me);
+		if (my d_changeCallback) {
 			struct structGuiTextEvent event = { me };
 			my d_changeCallback (my d_changeBoss, & event);
 		}
@@ -843,20 +794,20 @@ void _GuiText_exit (void) {
 	static void _GuiGtkText_destroyCallback (GuiObject widget, gpointer void_me) {
 		(void) widget;
 		iam (GuiText);
-		Melder_assert (me != NULL);
+		Melder_assert (me);
 		Melder_assert (my classInfo == classGuiText);
-		trace ("begin");
+		trace (U"begin");
 		if (my d_undo_item) {
-			trace ("undo");
+			trace (U"undo");
 			//g_object_unref (my d_undo_item -> d_widget);
 		}
 		if (my d_redo_item) {
-			trace ("redo");
+			trace (U"redo");
 			//g_object_unref (my d_redo_item -> d_widget);
 		}
-		my d_undo_item = NULL;
-		my d_redo_item = NULL;
-		trace ("history");
+		my d_undo_item = nullptr;
+		my d_redo_item = nullptr;
+		trace (U"history");
 		history_clear (me);
 		forget (me);
 	}
@@ -867,14 +818,14 @@ void _GuiText_exit (void) {
 	- (void) dealloc {   // override
 		GuiText me = d_userData;
 		forget (me);
-		trace ("deleting a text field");
+		trace (U"deleting a text field");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiText));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiText));
 		d_userData = static_cast <GuiText> (userData);
 	}
 	- (void) textDidChange: (NSNotification *) notification {
@@ -892,14 +843,14 @@ void _GuiText_exit (void) {
 	- (void) dealloc {   // override
 		GuiText me = d_userData;
 		forget (me);
-		trace ("deleting a text view");
+		trace (U"deleting a text view");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiText));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiText));
 		d_userData = static_cast <GuiText> (userData);
 	}
 	/*
@@ -911,7 +862,7 @@ void _GuiText_exit (void) {
 		(void) aTextView;
 		(void) affectedCharRange;
 		(void) replacementString;
-		trace ("changing text to: %s", [replacementString UTF8String]);
+		trace (U"changing text to: ", Melder_peek8to32 ([replacementString UTF8String]));
 		GuiText me = d_userData;
 		if (me && my d_changeCallback) {
 			struct structGuiTextEvent event = { me };
@@ -924,15 +875,15 @@ void _GuiText_exit (void) {
 #elif mac
 #endif
 
-GuiText GuiText_create (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags) {
+GuiText GuiText_create (GuiForm parent, int left, int right, int top, int bottom, uint32 flags) {
 	GuiText me = Thing_new (GuiText);
 	my d_shell = parent -> d_shell;
 	my d_parent = parent;
 	#if gtk
-		trace ("before creating a GTK text widget: locale is %s", setlocale (LC_ALL, NULL));
+		trace (U"before creating a GTK text widget: locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 		if (flags & GuiText_SCROLLED) {
 			GtkWrapMode ww;
-			GuiObject scrolled = gtk_scrolled_window_new (NULL, NULL);
+			GuiObject scrolled = gtk_scrolled_window_new (nullptr, nullptr);
 			gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 			my d_widget = gtk_text_view_new ();
 			gtk_container_add (GTK_CONTAINER (scrolled), GTK_WIDGET (my d_widget));
@@ -961,17 +912,17 @@ GuiText GuiText_create (GuiForm parent, int left, int right, int top, int bottom
 			my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 			gtk_entry_set_activates_default (GTK_ENTRY (my d_widget), true);
 		}
-		trace ("after creating a GTK text widget: locale is %s", setlocale (LC_ALL, NULL));
-		my d_prev = NULL;
-		my d_next = NULL;
+		trace (U"after creating a GTK text widget: locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
+		my d_prev = nullptr;
+		my d_next = nullptr;
 		my d_history_change = 0;
-		my d_undo_item = NULL;
-		my d_redo_item = NULL;
+		my d_undo_item = nullptr;
+		my d_redo_item = nullptr;
 		g_signal_connect (G_OBJECT (my d_widget), "destroy", G_CALLBACK (_GuiGtkText_destroyCallback), me);
 	#elif cocoa
 		if (flags & GuiText_SCROLLED) {
 			my d_cocoaScrollView = [[GuiCocoaScrolledWindow alloc] init];
-			[my d_cocoaScrollView setUserData: NULL];   // because those user data can only be GuiScrolledWindow
+			[my d_cocoaScrollView setUserData: nullptr];   // because those user data can only be GuiScrolledWindow
 			my d_widget = my d_cocoaScrollView;
 			my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 			[my d_cocoaScrollView setBorderType: NSNoBorder];
@@ -981,18 +932,24 @@ GuiText GuiText_create (GuiForm parent, int left, int right, int top, int bottom
 			NSSize contentSize = [my d_cocoaScrollView contentSize];
 			my d_cocoaTextView = [[GuiCocoaTextView alloc] initWithFrame: NSMakeRect (0, 0, contentSize. width, contentSize. height)];
 			[my d_cocoaTextView setUserData: me];
-			[my d_cocoaTextView setMinSize: NSMakeSize (0.0, contentSize.height)];
+			if (Melder_systemVersion < 101100) {
+				[my d_cocoaTextView setMinSize: NSMakeSize (0.0, contentSize.height)];
+			} else {
+				[my d_cocoaTextView setMinSize: NSMakeSize (contentSize. width, contentSize.height)];    // El Capitan Developer Beta 2
+			}
 			[my d_cocoaTextView setMaxSize: NSMakeSize (FLT_MAX, FLT_MAX)];
 			[my d_cocoaTextView setVerticallyResizable: YES];
 			[my d_cocoaTextView setHorizontallyResizable: YES];
 			[my d_cocoaTextView setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable];
 			[[my d_cocoaTextView textContainer] setContainerSize: NSMakeSize (FLT_MAX, FLT_MAX)];
 			[[my d_cocoaTextView textContainer] setWidthTracksTextView: NO];
-			[my d_cocoaScrollView setDocumentView: my d_cocoaTextView];
+			[my d_cocoaScrollView setDocumentView: my d_cocoaTextView];   // the scroll view will own the text view?
+			[my d_cocoaTextView release];   // so we release the text view itself
 			[[my d_cocoaScrollView window] makeFirstResponder: my d_cocoaTextView];
 			static NSFont *theTextFont;
 			if (! theTextFont) {
 				theTextFont = [[NSFont systemFontOfSize: 13.0] retain];
+				theTextFont = [[NSFont fontWithName: @"Menlo"   size: 12.0] retain];
 			}
 			[my d_cocoaTextView setFont: theTextFont];
 			[my d_cocoaTextView setAllowsUndo: YES];
@@ -1014,15 +971,15 @@ GuiText GuiText_create (GuiForm parent, int left, int right, int top, int bottom
 			[(NSTextField *) my d_widget   setFont: theTextFont];
 		}
 	#elif win
-		my d_widget = _Gui_initializeWidget (xmTextWidgetClass, parent -> d_widget, flags & GuiText_SCROLLED ? L"scrolledText" : L"text");
+		my d_widget = _Gui_initializeWidget (xmTextWidgetClass, parent -> d_widget, flags & GuiText_SCROLLED ? U"scrolledText" : U"text");
 		_GuiObject_setUserData (my d_widget, me);
 		my d_editable = (flags & GuiText_NONEDITABLE) == 0;
-		my d_widget -> window = CreateWindow (L"edit", NULL, WS_CHILD | WS_BORDER
+		my d_widget -> window = CreateWindow (L"edit", nullptr, WS_CHILD | WS_BORDER
 			| ( flags & GuiText_WORDWRAP ? ES_AUTOVSCROLL : ES_AUTOHSCROLL )
 			| ES_MULTILINE | WS_CLIPSIBLINGS
 			| ( flags & GuiText_SCROLLED ? WS_HSCROLL | WS_VSCROLL : 0 ),
 			my d_widget -> x, my d_widget -> y, my d_widget -> width, my d_widget -> height,
-			my d_widget -> parent -> window, (HMENU) 1, theGui.instance, NULL);
+			my d_widget -> parent -> window, (HMENU) 1, theGui.instance, nullptr);
 		SetWindowLongPtr (my d_widget -> window, GWLP_USERDATA, (LONG_PTR) my d_widget);
 		if (! font10) {
 			font10 = CreateFont (13, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0/*FIXED_PITCH | FF_MODERN*/, /*L"Doulos SIL"*/L"Courier New");
@@ -1031,25 +988,25 @@ GuiText GuiText_create (GuiForm parent, int left, int right, int top, int bottom
 			font18 = CreateFont (24, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0/*FIXED_PITCH | FF_MODERN*/, /*L"Doulos SIL"*/L"Courier New");
 			font24 = CreateFont (32, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0/*FIXED_PITCH | FF_MODERN*/, /*L"Doulos SIL"*/L"Courier New");
 		}
-		SetWindowFont (my d_widget -> window, font12 /*theScrolledHint ? font : GetStockFont (ANSI_VAR_FONT)*/, FALSE);
+		SetWindowFont (my d_widget -> window, font12 /*theScrolledHint ? font : GetStockFont (ANSI_VAR_FONT)*/, false);
 		Edit_LimitText (my d_widget -> window, 0);
 		my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		/*
 		 * The first created text widget shall attract the input focus.
 		 */
 		if (! my d_widget -> shell -> textFocus) {
-			my d_widget -> shell -> textFocus = my d_widget;   /* Even if not-yet-managed. But in that case it will not receive global focus. */
+			my d_widget -> shell -> textFocus = my d_widget;   // even if not-yet-managed. But in that case it will not receive global focus
 		}
 	#elif mac
 		if (flags & GuiText_SCROLLED) {
-			my d_widget = _Gui_initializeWidget (xmTextWidgetClass, parent -> d_widget, L"scrolledText");
+			my d_widget = _Gui_initializeWidget (xmTextWidgetClass, parent -> d_widget, U"scrolledText");
 			_GuiObject_setUserData (my d_widget, me);
 			my d_editable = (flags & GuiText_NONEDITABLE) == 0;
 			TXNLongRect destRect;
 			TXNMargins margins;
 			TXNControlData controlData;
 			TXNControlTag controlTag = kTXNMarginsTag;
-			TXNNewObject (NULL,   /* No file. */
+			TXNNewObject (nullptr,   // no file
 				my d_widget -> macWindow, & my d_widget -> rect, kTXNWantHScrollBarMask | kTXNWantVScrollBarMask
 					| kTXNMonostyledTextMask | kTXNDrawGrowIconMask,
 				kTXNTextEditStyleFrameType, kTXNTextensionFile,
@@ -1058,167 +1015,167 @@ GuiText GuiText_create (GuiForm parent, int left, int right, int top, int bottom
 			destRect. top = 0;
 			destRect. right = 10000;
 			destRect. bottom = 2000000000;
-			TXNSetRectBounds (my d_macMlteObject, NULL, & destRect, FALSE);
+			TXNSetRectBounds (my d_macMlteObject, nullptr, & destRect, false);
 			margins. leftMargin = 3;
 			margins. topMargin = 3;
 			margins. rightMargin = 0;
 			margins. bottomMargin = 0;
 			controlData. marginsPtr = & margins;
-			TXNSetTXNObjectControls (my d_macMlteObject, FALSE, 1, & controlTag, & controlData);
+			TXNSetTXNObjectControls (my d_macMlteObject, false, 1, & controlTag, & controlData);
 			my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		} else {
-			my d_widget = _Gui_initializeWidget (xmTextWidgetClass, parent -> d_widget, L"text");
+			my d_widget = _Gui_initializeWidget (xmTextWidgetClass, parent -> d_widget, U"text");
 			_GuiObject_setUserData (my d_widget, me);
 			my d_editable = (flags & GuiText_NONEDITABLE) == 0;
 			Rect r = my d_widget -> rect;
 			InsetRect (& r, 3, 3);
-			CreateEditUnicodeTextControl (my d_widget -> macWindow, & r, NULL, false, NULL, & my d_widget -> nat.control.handle);
+			CreateEditUnicodeTextControl (my d_widget -> macWindow, & r, nullptr, false, nullptr, & my d_widget -> nat.control.handle);
 			SetControlReference (my d_widget -> nat.control.handle, (long) my d_widget);
-			my d_widget -> isControl = TRUE;
+			my d_widget -> isControl = true;
 			my v_positionInForm (my d_widget, left, right, top, bottom, parent);
 		}
 		/*
 		 * The first created text widget shall attract the input focus.
 		 */
 		if (! my d_widget -> shell -> textFocus) {
-			my d_widget -> shell -> textFocus = my d_widget;   /* Even if not-yet-managed. But in that case it will not receive global focus. */
+			my d_widget -> shell -> textFocus = my d_widget;   // even if not-yet-managed; but in that case it will not receive global focus
 		}
 	#endif
 	
 	return me;
 }
 
-GuiText GuiText_createShown (GuiForm parent, int left, int right, int top, int bottom, unsigned long flags) {
+GuiText GuiText_createShown (GuiForm parent, int left, int right, int top, int bottom, uint32 flags) {
 	GuiText me = GuiText_create (parent, left, right, top, bottom, flags);
-	my f_show ();
+	GuiThing_show (me);
 	return me;
 }
 
-void structGuiText :: f_copy () {
+void GuiText_copy (GuiText me) {
 	#if gtk
-		if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_ENTRY) {
-			gtk_editable_copy_clipboard (GTK_EDITABLE (d_widget));
-		} else if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_TEXT_VIEW) {
-			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (d_widget));
+		if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_ENTRY) {
+			gtk_editable_copy_clipboard (GTK_EDITABLE (my d_widget));
+		} else if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_TEXT_VIEW) {
+			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (my d_widget));
 			GtkClipboard *cb = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
 			gtk_text_buffer_copy_clipboard (buffer, cb);
 		}
 	#elif cocoa
-		if (d_cocoaTextView) {
-			[d_cocoaTextView copy: nil];
+		if (my d_cocoaTextView) {
+			[my d_cocoaTextView   copy: nil];
 		} else {
-			[[[(GuiCocoaTextField *) d_widget window]   fieldEditor: NO   forObject: nil] copy: nil];
+			[[[(GuiCocoaTextField *) my d_widget   window]   fieldEditor: NO   forObject: nil] copy: nil];
 		}
 	#elif win
-		if (! NativeText_getSelectionRange (d_widget, NULL, NULL)) return;
-		SendMessage (d_widget -> window, WM_COPY, 0, 0);
+		if (! NativeText_getSelectionRange (my d_widget, nullptr, nullptr)) return;
+		SendMessage (my d_widget -> window, WM_COPY, 0, 0);
 	#elif mac
-		if (! NativeText_getSelectionRange (d_widget, NULL, NULL)) return;
-		if (isTextControl (d_widget)) {
-			HandleControlKey (d_widget -> nat.control.handle, 0, 'C', cmdKey);
-		} else if (isMLTE (this)) {
-			TXNCopy (d_macMlteObject);
+		if (! NativeText_getSelectionRange (my d_widget, nullptr, nullptr)) return;
+		if (isTextControl (my d_widget)) {
+			HandleControlKey (my d_widget -> nat.control.handle, 0, 'C', cmdKey);
+		} else if (isMLTE (me)) {
+			TXNCopy (my d_macMlteObject);
 		}
 	#endif
 }
 
-void structGuiText :: f_cut () {
+void GuiText_cut (GuiText me) {
 	#if gtk
-		if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_ENTRY) {
-			gtk_editable_cut_clipboard (GTK_EDITABLE (d_widget));
-		} else if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_TEXT_VIEW) {
-			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (d_widget));
+		if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_ENTRY) {
+			gtk_editable_cut_clipboard (GTK_EDITABLE (my d_widget));
+		} else if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_TEXT_VIEW) {
+			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (my d_widget));
 			GtkClipboard *cb = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
-			gtk_text_buffer_cut_clipboard (buffer, cb, gtk_text_view_get_editable (GTK_TEXT_VIEW (d_widget)));
+			gtk_text_buffer_cut_clipboard (buffer, cb, gtk_text_view_get_editable (GTK_TEXT_VIEW (my d_widget)));
 		}
 	#elif cocoa
-		if (d_cocoaTextView) {
-			[d_cocoaTextView cut: nil];
+		if (my d_cocoaTextView) {
+			[my d_cocoaTextView   cut: nil];
 		} else {
-			[[[(GuiCocoaTextField *) d_widget window]   fieldEditor: NO   forObject: nil] cut: nil];
+			[[[(GuiCocoaTextField *) my d_widget   window]   fieldEditor: NO   forObject: nil] cut: nil];
 		}
 	#elif win
-		if (! d_editable || ! NativeText_getSelectionRange (d_widget, NULL, NULL)) return;
-		SendMessage (d_widget -> window, WM_CUT, 0, 0);   // this will send the EN_CHANGE message, hence no need to call the valueChangedCallbacks
-		UpdateWindow (d_widget -> window);
+		if (! my d_editable || ! NativeText_getSelectionRange (my d_widget, nullptr, nullptr)) return;
+		SendMessage (my d_widget -> window, WM_CUT, 0, 0);   // this will send the EN_CHANGE message, hence no need to call the valueChangedCallbacks
+		UpdateWindow (my d_widget -> window);
 	#elif mac
-		if (! d_editable || ! NativeText_getSelectionRange (d_widget, NULL, NULL)) return;
-		if (isTextControl (d_widget)) {
-			_GuiMac_clipOnParent (d_widget);
-			HandleControlKey (d_widget -> nat.control.handle, 0, 'X', cmdKey);
+		if (! my d_editable || ! NativeText_getSelectionRange (my d_widget, nullptr, nullptr)) return;
+		if (isTextControl (my d_widget)) {
+			_GuiMac_clipOnParent (my d_widget);
+			HandleControlKey (my d_widget -> nat.control.handle, 0, 'X', cmdKey);
 			GuiMac_clipOff ();
-		} else if (isMLTE (this)) {
-			TXNCut (d_macMlteObject);
+		} else if (isMLTE (me)) {
+			TXNCut (my d_macMlteObject);
 		}
-		_GuiText_handleValueChanged (d_widget);
+		_GuiText_handleValueChanged (my d_widget);
 	#endif
 }
 
-wchar_t * structGuiText :: f_getSelection () {
+char32 * GuiText_getSelection (GuiText me) {
 	#if gtk
 		// first = gtk_text_iter_get_offset (& start);
 		// last = gtk_text_iter_get_offset (& end);
-		if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_ENTRY) {
+		if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_ENTRY) {
 			gint start, end;
-			gtk_editable_get_selection_bounds (GTK_EDITABLE (d_widget), & start, & end); 
+			gtk_editable_get_selection_bounds (GTK_EDITABLE (my d_widget), & start, & end);
 			if (end > start) {   // at least one character selected?
-				gchar *text = gtk_editable_get_chars (GTK_EDITABLE (d_widget), start, end);
-				wchar_t *result = Melder_utf8ToWcs (text);
+				gchar *text = gtk_editable_get_chars (GTK_EDITABLE (my d_widget), start, end);
+				char32 *result = Melder_8to32 (text);
 				g_free (text);
 				return result;
 			}
-		} else if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_TEXT_VIEW) {
-			GtkTextBuffer *textBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (d_widget));
+		} else if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_TEXT_VIEW) {
+			GtkTextBuffer *textBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (my d_widget));
 			if (gtk_text_buffer_get_has_selection (textBuffer)) {   // at least one character selected?
 				GtkTextIter start, end;
 				gtk_text_buffer_get_selection_bounds (textBuffer, & start, & end);
-				gchar *text = gtk_text_buffer_get_text (textBuffer, & start, & end, TRUE);
-				wchar_t *result = Melder_utf8ToWcs (text);
+				gchar *text = gtk_text_buffer_get_text (textBuffer, & start, & end, true);
+				char32 *result = Melder_8to32 (text);
 				g_free (text);
 				return result;
 			}
 		}
 	#elif cocoa
 		long start, end;
-		autostring selection = f_getStringAndSelectionPosition (& start, & end);
+		autostring32 selection = GuiText_getStringAndSelectionPosition (me, & start, & end);
 		long length = end - start;
 		if (length > 0) {
-			wchar_t *result = Melder_malloc_f (wchar_t, length + 1);
-			memcpy (result, & selection [start], length * sizeof (wchar_t));
+			char32 *result = Melder_malloc_f (char32, length + 1);
+			memcpy (result, & selection [start], length * sizeof (char32));
 			result [length] = '\0';
-			Melder_killReturns_inlineW (result);
+			Melder_killReturns_inline (result);
 			return result;
 		}
 	#elif win
-		long start, end;
-		NativeText_getSelectionRange (d_widget, & start, & end);
-		if (end > start) {   // at least one character selected?
+		long startW, endW;
+		NativeText_getSelectionRange (my d_widget, & startW, & endW);
+		if (endW > startW) {   // at least one character selected?
 			/*
 			 * Get all text.
 			 */
-			long length = NativeText_getLength (d_widget);
-			wchar_t *result = Melder_malloc_f (wchar_t, length + 1);
-			NativeText_getText (d_widget, result, length);
+			long lengthW = NativeText_getLength (my d_widget);   // in UTF-16 code units
+			WCHAR *bufferW = Melder_malloc_f (WCHAR, lengthW + 1);
+			GetWindowTextW (my d_widget -> window, bufferW, lengthW + 1);
 			/*
 			 * Zoom in on selection.
 			 */
-			length = end - start;
-			memmove (result, result + start, length * sizeof (wchar_t));   /* Not because of realloc, but because of free! */
-			result [length] = '\0';
-			result = (wchar_t *) Melder_realloc_f (result, (length + 1) * sizeof (wchar_t));   /* Optional. */
-			Melder_killReturns_inlineW (result);   /* AFTER zooming! */
+			lengthW = endW - startW;
+			memmove (bufferW, bufferW + startW, lengthW * sizeof (WCHAR));   // not because of realloc, but because of free!
+			bufferW [lengthW] = U'\0';
+			char32 *result = Melder_dup_f (Melder_peekWto32 (bufferW));
+			Melder_killReturns_inline (result);   // AFTER zooming!
 			return result;
 		}
 	#elif mac
 		long start, end;
-		NativeText_getSelectionRange (d_widget, & start, & end);
+		NativeText_getSelectionRange (my d_widget, & start, & end);
 		if (end > start) {   // at least one character selected?
 			/*
 			 * Get all text.
 			 */
-			long length = NativeText_getLength (d_widget);
-			wchar_t *result = Melder_malloc_f (wchar_t, length + 1);
-			NativeText_getText (d_widget, result, length);
+			long length = NativeText_getLength (my d_widget);
+			char32 *result = Melder_malloc_f (char32, length + 1);
+			NativeText_getText (my d_widget, result, length);
 			/*
 			 * Zoom in on selection.
 			 */
@@ -1227,59 +1184,59 @@ wchar_t * structGuiText :: f_getSelection () {
 				for (long i = start; i < end; i ++) if (result [i] > 0xFFFF) { end --; }
 			#endif
 			length = end - start;
-			memmove (result, result + start, length * sizeof (wchar_t));   /* Not because of realloc, but because of free! */
+			memmove (result, result + start, length * sizeof (char32));   // not because of realloc, but because of free!
 			result [length] = '\0';
-			result = (wchar_t *) Melder_realloc_f (result, (length + 1) * sizeof (wchar_t));   /* Optional. */
-			Melder_killReturns_inlineW (result);   /* AFTER zooming! */
+			result = (char32 *) Melder_realloc_f (result, (length + 1) * sizeof (char32));   // optional
+			Melder_killReturns_inline (result);   // AFTER zooming!
 			return result;
 		}
 	#endif
-	return NULL;   // zero characters selected
+	return nullptr;   // zero characters selected
 }
 
-wchar_t * structGuiText :: f_getString () {
+char32 * GuiText_getString (GuiText me) {
 	long first, last;
-	return f_getStringAndSelectionPosition (& first, & last);
+	return GuiText_getStringAndSelectionPosition (me, & first, & last);
 }
 
-wchar_t * structGuiText :: f_getStringAndSelectionPosition (long *first, long *last) {
+char32 * GuiText_getStringAndSelectionPosition (GuiText me, long *first, long *last) {
 	#if gtk
-		if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_ENTRY) {
+		if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_ENTRY) {
 			gint first_gint, last_gint;
-			gtk_editable_get_selection_bounds (GTK_EDITABLE (d_widget), & first_gint, & last_gint);
+			gtk_editable_get_selection_bounds (GTK_EDITABLE (my d_widget), & first_gint, & last_gint);   // expressed in Unicode code points!
 			*first = first_gint;
 			*last = last_gint;
-			return Melder_utf8ToWcs (gtk_entry_get_text (GTK_ENTRY (d_widget)));
-		} else if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_TEXT_VIEW) {
-			GtkTextBuffer *textBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (d_widget));
+			return Melder_8to32 (gtk_entry_get_text (GTK_ENTRY (my d_widget)));
+		} else if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_TEXT_VIEW) {
+			GtkTextBuffer *textBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (my d_widget));
 			GtkTextIter start, end;
 			gtk_text_buffer_get_start_iter (textBuffer, & start);
 			gtk_text_buffer_get_end_iter (textBuffer, & end);
-			gchar *text = gtk_text_buffer_get_text (textBuffer, & start, & end, TRUE); // TODO: Hidden chars ook maar doen he?
-			wchar_t *result = Melder_utf8ToWcs (text);
+			gchar *text = gtk_text_buffer_get_text (textBuffer, & start, & end, true);   // TODO: Hidden chars ook maar doen he?
+			char32 *result = Melder_8to32 (text);
 			g_free (text);
 			gtk_text_buffer_get_selection_bounds (textBuffer, & start, & end);
 			*first = gtk_text_iter_get_offset (& start);
 			*last = gtk_text_iter_get_offset (& end);
 			return result;
 		}
-		return NULL;
+		return nullptr;
 	#elif cocoa
-		if (d_cocoaTextView) {
-			NSString *nsString = [d_cocoaTextView string];
-			wchar_t *result = Melder_utf8ToWcs ([nsString UTF8String]);
-			trace ("string %ls", result);
-			NSRange nsRange = [d_cocoaTextView selectedRange];
+		if (my d_cocoaTextView) {
+			NSString *nsString = [my d_cocoaTextView   string];
+			char32 *result = Melder_8to32 ([nsString UTF8String]);
+			trace (U"string ", result);
+			NSRange nsRange = [my d_cocoaTextView   selectedRange];
 			*first = nsRange. location;
 			*last = *first + nsRange. length;
 			for (long i = 0; i < *first; i ++) if (result [i] > 0xFFFF) { (*first) --; (*last) --; }
 			for (long i = *first; i < *last; i ++) if (result [i] > 0xFFFF) { (*last) --; }
 			return result;
 		} else {
-			NSString *nsString = [(NSTextField *) d_widget   stringValue];
-			wchar_t *result = Melder_utf8ToWcs ([nsString UTF8String]);
-			trace ("string %ls", result);
-			NSRange nsRange = [[[(NSTextField *) d_widget window] fieldEditor: NO forObject: nil] selectedRange];
+			NSString *nsString = [(NSTextField *) my d_widget   stringValue];
+			char32 *result = Melder_8to32 ([nsString UTF8String]);
+			trace (U"string ", result);
+			NSRange nsRange = [[[(NSTextField *) my d_widget   window] fieldEditor: NO forObject: nil] selectedRange];
 			*first = nsRange. location;
 			*last = *first + nsRange. length;
 			for (long i = 0; i < *first; i ++) if (result [i] > 0xFFFF) { (*first) --; (*last) --; }
@@ -1287,160 +1244,173 @@ wchar_t * structGuiText :: f_getStringAndSelectionPosition (long *first, long *l
 			return result;
 		}
 	#elif win
-		long length = NativeText_getLength (d_widget);
-		wchar_t *result = Melder_malloc_f (wchar_t, length + 1);
-		NativeText_getText (d_widget, result, length);
-		NativeText_getSelectionRange (d_widget, first, last);
-		long numberOfLeadingLineBreaks = 0, numberOfSelectedLineBreaks = 0;
-		for (long i = 0; i < *first; i ++) if (result [i] == 13) numberOfLeadingLineBreaks ++;
-		for (long i = *first; i < *last; i ++) if (result [i] == 13) numberOfSelectedLineBreaks ++;
-		*first -= numberOfLeadingLineBreaks;
-		*last -= numberOfLeadingLineBreaks + numberOfSelectedLineBreaks;
-		Melder_killReturns_inlineW (result);
+		long lengthW = NativeText_getLength (my d_widget);
+		WCHAR *bufferW = Melder_malloc_f (WCHAR, lengthW + 1);
+		GetWindowTextW (my d_widget -> window, bufferW, lengthW + 1);
+		long firstW, lastW;
+		NativeText_getSelectionRange (my d_widget, & firstW, & lastW);
+
+		long differenceFirst = 0;
+		for (long i = 0; i < firstW; i ++) {
+			if (bufferW [i] == 13 && (bufferW [i + 1] == L'\n' || bufferW [i + 1] == 0x0085)) differenceFirst ++;
+			if (bufferW [i] >= 0xDC00 && bufferW [i] <= 0xDFFF) differenceFirst ++;
+		}
+		*first = firstW - differenceFirst;
+
+		long differenceLast = differenceFirst;
+		for (long i = firstW; i < lastW; i ++) {
+			if (bufferW [i] == 13 && (bufferW [i + 1] == L'\n' || bufferW [i + 1] == 0x0085)) differenceLast ++;
+			if (bufferW [i] >= 0xDC00 && bufferW [i] <= 0xDFFF) differenceLast ++;
+		}
+		*last = lastW - differenceLast;
+
+		char32 *result = Melder_dup_f (Melder_peekWto32 (bufferW));
+		Melder_free (bufferW);
+		Melder_killReturns_inline (result);
 		return result;
 	#elif mac
-		long length = NativeText_getLength (d_widget);   // UTF-16 length; should be enough for UTF-32 buffer
-		wchar_t *result = Melder_malloc_f (wchar_t, length + 1);
-		NativeText_getText (d_widget, result, length);
-		NativeText_getSelectionRange (d_widget, first, last);   // 'first' and 'last' are expressed in UTF-16 words
+		long length = NativeText_getLength (my d_widget);   // UTF-16 length; should be enough for UTF-32 buffer
+		char32 *result = Melder_malloc_f (char32, length + 1);
+		NativeText_getText (my d_widget, result, length);
+		NativeText_getSelectionRange (my d_widget, first, last);   // 'first' and 'last' are expressed in UTF-16 words
 		for (long i = 0; i < *first; i ++) if (result [i] > 0xFFFF) { (*first) --; (*last) --; }
 		for (long i = *first; i < *last; i ++) if (result [i] > 0xFFFF) { (*last) --; }
-		Melder_killReturns_inlineW (result);
+		Melder_killReturns_inline (result);
 		return result;
 	#endif
 }
 
-void structGuiText :: f_paste () {
+void GuiText_paste (GuiText me) {
 	#if gtk
-		if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_ENTRY) {
-			gtk_editable_paste_clipboard (GTK_EDITABLE (d_widget));
-		} else if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_TEXT_VIEW) {
-			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (d_widget));
+		if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_ENTRY) {
+			gtk_editable_paste_clipboard (GTK_EDITABLE (my d_widget));
+		} else if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_TEXT_VIEW) {
+			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (my d_widget));
 			GtkClipboard *cb = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
-			gtk_text_buffer_paste_clipboard (buffer, cb, NULL, gtk_text_view_get_editable (GTK_TEXT_VIEW (d_widget)));
+			gtk_text_buffer_paste_clipboard (buffer, cb, nullptr, gtk_text_view_get_editable (GTK_TEXT_VIEW (my d_widget)));
 		}
 	#elif cocoa
-		if (d_cocoaTextView) {
-			[d_cocoaTextView pasteAsPlainText: nil];
+		if (my d_cocoaTextView) {
+			[my d_cocoaTextView   pasteAsPlainText: nil];
 		} else {
-			[[[(GuiCocoaTextField *) d_widget window]   fieldEditor: NO   forObject: nil] pasteAsPlainText: nil];
+			[[[(GuiCocoaTextField *) my d_widget   window]   fieldEditor: NO   forObject: nil] pasteAsPlainText: nil];
 		}
 	#elif win
-		if (! d_editable) return;
-		SendMessage (d_widget -> window, WM_PASTE, 0, 0);   // this will send the EN_CHANGE message, hence no need to call the valueChangedCallbacks
-		UpdateWindow (d_widget -> window);
+		if (! my d_editable) return;
+		SendMessage (my d_widget -> window, WM_PASTE, 0, 0);   // this will send the EN_CHANGE message, hence no need to call the valueChangedCallbacks
+		UpdateWindow (my d_widget -> window);
 	#elif mac
-		if (! d_editable) return;
-		if (isTextControl (d_widget)) {
-			_GuiMac_clipOnParent (d_widget);
-			HandleControlKey (d_widget -> nat.control.handle, 0, 'V', cmdKey);
+		if (! my d_editable) return;
+		if (isTextControl (my d_widget)) {
+			_GuiMac_clipOnParent (my d_widget);
+			HandleControlKey (my d_widget -> nat.control.handle, 0, 'V', cmdKey);
 			GuiMac_clipOff ();
-		} else if (isMLTE (this)) {
-			TXNPaste (d_macMlteObject);
+		} else if (isMLTE (me)) {
+			TXNPaste (my d_macMlteObject);
 		}
-		_GuiText_handleValueChanged (d_widget);
+		_GuiText_handleValueChanged (my d_widget);
 	#endif
 }
 
-void structGuiText :: f_redo () {
+void GuiText_redo (GuiText me) {
 	#if cocoa
-		if (d_cocoaTextView) {
-			[[d_cocoaTextView undoManager] redo];
+		if (my d_cocoaTextView) {
+			[[my d_cocoaTextView   undoManager] redo];
 		}
 	#elif mac
-		if (isMLTE (this)) {
-			TXNRedo (d_macMlteObject);
+		if (isMLTE (me)) {
+			TXNRedo (my d_macMlteObject);
 		}
-		_GuiText_handleValueChanged (d_widget);
+		_GuiText_handleValueChanged (my d_widget);
 	#else
-		history_do (this, 0);
+		history_do (me, 0);
 	#endif
 }
 
-void structGuiText :: f_remove () {
+void GuiText_remove (GuiText me) {
 	#if gtk
-		if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_ENTRY) {
-			gtk_editable_delete_selection (GTK_EDITABLE (d_widget));
-		} else if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_TEXT_VIEW) {
-			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (d_widget));
-			gtk_text_buffer_delete_selection (buffer, TRUE, gtk_text_view_get_editable (GTK_TEXT_VIEW (d_widget)));
+		if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_ENTRY) {
+			gtk_editable_delete_selection (GTK_EDITABLE (my d_widget));
+		} else if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_TEXT_VIEW) {
+			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (my d_widget));
+			gtk_text_buffer_delete_selection (buffer, true, gtk_text_view_get_editable (GTK_TEXT_VIEW (my d_widget)));
 		}
 	#elif cocoa
-		if (d_cocoaTextView) {
-			[d_cocoaTextView delete: nil];
+		if (my d_cocoaTextView) {
+			[my d_cocoaTextView   delete: nil];
 		}
 	#elif win
-		if (! d_editable || ! NativeText_getSelectionRange (d_widget, NULL, NULL)) return;
-		SendMessage (d_widget -> window, WM_CLEAR, 0, 0);   /* This will send the EN_CHANGE message, hence no need to call the valueChangedCallbacks. */
-		UpdateWindow (d_widget -> window);
+		if (! my d_editable || ! NativeText_getSelectionRange (my d_widget, nullptr, nullptr)) return;
+		SendMessage (my d_widget -> window, WM_CLEAR, 0, 0);   // this will send the EN_CHANGE message, hence no need to call the valueChangedCallbacks
+		UpdateWindow (my d_widget -> window);
 	#elif mac
-		if (! d_editable || ! NativeText_getSelectionRange (d_widget, NULL, NULL)) return;
-		if (isTextControl (d_widget)) {
-			_GuiMac_clipOnParent (d_widget);
-			HandleControlKey (d_widget -> nat.control.handle, 0, 8, 0);   // backspace key
+		if (! my d_editable || ! NativeText_getSelectionRange (my d_widget, nullptr, nullptr)) return;
+		if (isTextControl (my d_widget)) {
+			_GuiMac_clipOnParent (my d_widget);
+			HandleControlKey (my d_widget -> nat.control.handle, 0, 8, 0);   // backspace key
 			GuiMac_clipOff ();
-		} else if (isMLTE (this)) {
-			TXNClear (d_macMlteObject);
+		} else if (isMLTE (me)) {
+			TXNClear (my d_macMlteObject);
 		}
-		_GuiText_handleValueChanged (d_widget);
+		_GuiText_handleValueChanged (my d_widget);
 	#endif
 }
 
-void structGuiText :: f_replace (long from_pos, long to_pos, const wchar_t *text) {
+void GuiText_replace (GuiText me, long from_pos, long to_pos, const char32 *text) {
 	#if gtk
-		gchar *newText = Melder_peekWcsToUtf8 (text);
-		if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_ENTRY) {
-			gtk_editable_delete_text (GTK_EDITABLE (d_widget), from_pos, to_pos);
+		gchar *newText = Melder_peek32to8 (text);
+		if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_ENTRY) {
+			gtk_editable_delete_text (GTK_EDITABLE (my d_widget), from_pos, to_pos);
 			gint from_pos_gint = from_pos;
-			gtk_editable_insert_text (GTK_EDITABLE (d_widget), newText, g_utf8_strlen (newText, -1), & from_pos_gint);
-		} else if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_TEXT_VIEW) {
-			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (d_widget));
+			gtk_editable_insert_text (GTK_EDITABLE (my d_widget), newText, g_utf8_strlen (newText, -1), & from_pos_gint);
+		} else if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_TEXT_VIEW) {
+			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (my d_widget));
 			GtkTextIter from_it, to_it;
 			gtk_text_buffer_get_iter_at_offset (buffer, & from_it, from_pos);
 			gtk_text_buffer_get_iter_at_offset (buffer, & to_it, to_pos);
 			gtk_text_buffer_delete_interactive (buffer, & from_it, & to_it,
-				gtk_text_view_get_editable (GTK_TEXT_VIEW (d_widget)));
+				gtk_text_view_get_editable (GTK_TEXT_VIEW (my d_widget)));
 			gtk_text_buffer_insert_interactive (buffer, & from_it, newText, g_utf8_strlen (newText, -1),
-				gtk_text_view_get_editable (GTK_TEXT_VIEW (d_widget)));
+				gtk_text_view_get_editable (GTK_TEXT_VIEW (my d_widget)));
 		}
 	#elif cocoa
-		if (d_cocoaTextView) {
+		if (my d_cocoaTextView) {
 			long numberOfLeadingHighUnicodeValues = 0, numberOfSelectedHighUnicodeValues = 0;
 			{// scope
-				autostring oldText = f_getString ();
+				autostring32 oldText = GuiText_getString (me);
 				for (long i = 0; i < from_pos; i ++) if (oldText [i] > 0xFFFF) numberOfLeadingHighUnicodeValues ++;
 				for (long i = from_pos; i < to_pos; i ++) if (oldText [i] > 0xFFFF) numberOfSelectedHighUnicodeValues ++;
 			}
 			from_pos += numberOfLeadingHighUnicodeValues;
 			to_pos += numberOfLeadingHighUnicodeValues + numberOfSelectedHighUnicodeValues;
 			NSRange nsRange = NSMakeRange (from_pos, to_pos - from_pos);
-			NSString *nsString = (NSString *) Melder_peekWcsToCfstring (text);
-			[d_cocoaTextView shouldChangeTextInRange: nsRange replacementString: nsString];   // ignore the returned BOOL: only interested in the side effect of having undo support
-			[[d_cocoaTextView textStorage] replaceCharactersInRange: nsRange withString: nsString];
+			NSString *nsString = (NSString *) Melder_peek32toCfstring (text);
+			[my d_cocoaTextView   shouldChangeTextInRange: nsRange   replacementString: nsString];   // ignore the returned BOOL: only interested in the side effect of having undo support
+			[[my d_cocoaTextView   textStorage] replaceCharactersInRange: nsRange   withString: nsString];
 		}
 	#elif win
-		const wchar_t *from;
-		wchar_t *winText = Melder_malloc_f (wchar_t, 2 * wcslen (text) + 1), *to;   /* All new lines plus one null byte. */
-		Melder_assert (MEMBER (d_widget, Text));
+		const char32 *from;
+		char32 *winText = Melder_malloc_f (char32, 2 * str32len (text) + 1), *to;   // all new lines plus one null byte
+		Melder_assert (MEMBER (my d_widget, Text));
 		/*
 		 * Replace all LF with CR/LF.
 		 */
-		for (from = text, to = winText; *from != '\0'; from ++, to ++)
-			if (*from == '\n') { *to = 13; * ++ to = '\n'; } else *to = *from;
-		*to = '\0';
+		for (from = text, to = winText; *from != U'\0'; from ++, to ++)
+			if (*from == U'\n') { *to = 13; * ++ to = U'\n'; } else *to = *from;
+		*to = U'\0';
 		/*
 		 * We DON'T replace any text without selecting it, so we can deselect any other text,
 		 * thus allowing ourselves to select [from_pos, to_pos] and use the REPLACESEL message.
 		 */
-		f_setSelection (from_pos, to_pos);
-		Edit_ReplaceSel (d_widget -> window, winText);
+		GuiText_setSelection (me, from_pos, to_pos);
+		Edit_ReplaceSel (my d_widget -> window, Melder_peek32toW (winText));
 		Melder_free (winText);
-		UpdateWindow (d_widget -> window);
+		UpdateWindow (my d_widget -> window);
 	#elif mac
-		size_t length = wcslen (text);
-		wchar_t *macText = Melder_malloc_f (wchar_t, length + 1);
-		Melder_assert (d_widget -> widgetClass == xmTextWidgetClass);
-		wcsncpy (macText, text, length);
+		size_t length = str32len (text);
+		char32 *macText = Melder_malloc_f (char32, length + 1);
+		Melder_assert (my d_widget -> widgetClass == xmTextWidgetClass);
+		str32ncpy (macText, text, length);
 		macText [length] = '\0';
 		/*
 		 * Replace all LF with CR.
@@ -1450,130 +1420,130 @@ void structGuiText :: f_replace (long from_pos, long to_pos, const wchar_t *text
 		 * We DON'T replace any text without selecting it, so we can deselect any other text,
 		 * thus allowing ourselves to select [from_pos, to_pos] and use selection replacement.
 		 */
-		if (d_widget -> managed) _GuiMac_clipOnParent (d_widget);
-		if (isTextControl (d_widget)) {
+		if (my d_widget -> managed) _GuiMac_clipOnParent (my d_widget);
+		if (isTextControl (my d_widget)) {
 			// BUG: this is not UTF-32-savvy; this is acceptable because it isn't used in Praat
-			long oldLength = NativeText_getLength (d_widget);
-			wchar_t *totalText = Melder_malloc_f (wchar_t, oldLength - (to_pos - from_pos) + length + 1);
-			wchar_t *oldText = Melder_malloc_f (wchar_t, oldLength + 1);
-			NativeText_getText (d_widget, oldText, oldLength);
-			wcsncpy (totalText, oldText, from_pos);
-			wcscpy (totalText + from_pos, macText);
-			wcscpy (totalText + from_pos + length, oldText + to_pos);
-			CFStringRef totalText_cfstring = (CFStringRef) Melder_peekWcsToCfstring (totalText);
-			SetControlData (d_widget -> nat.control.handle, kControlEntireControl, kControlEditTextCFStringTag, sizeof (CFStringRef), & totalText_cfstring);
+			long oldLength = NativeText_getLength (my d_widget);
+			char32 *totalText = Melder_malloc_f (char32, oldLength - (to_pos - from_pos) + length + 1);
+			char32 *oldText = Melder_malloc_f (char32, oldLength + 1);
+			NativeText_getText (my d_widget, oldText, oldLength);
+			str32ncpy (totalText, oldText, from_pos);
+			str32cpy (totalText + from_pos, macText);
+			str32cpy (totalText + from_pos + length, oldText + to_pos);
+			CFStringRef totalText_cfstring = (CFStringRef) Melder_peek32toCfstring (totalText);
+			SetControlData (my d_widget -> nat.control.handle, kControlEntireControl, kControlEditTextCFStringTag, sizeof (CFStringRef), & totalText_cfstring);
 			Melder_free (oldText);
 			Melder_free (totalText);
-		} else if (isMLTE (this)) {
-			long oldLength = NativeText_getLength (d_widget);
-			wchar_t *oldText = Melder_malloc_f (wchar_t, oldLength + 1);
-			NativeText_getText (d_widget, oldText, oldLength);
+		} else if (isMLTE (me)) {
+			long oldLength = NativeText_getLength (my d_widget);
+			char32 *oldText = Melder_malloc_f (char32, oldLength + 1);
+			NativeText_getText (my d_widget, oldText, oldLength);
 			long numberOfLeadingHighUnicodeValues = 0, numberOfSelectedHighUnicodeValues = 0;
 			for (long i = 0; i < from_pos; i ++) if (oldText [i] > 0xFFFF) numberOfLeadingHighUnicodeValues ++;
 			for (long i = from_pos; i < to_pos; i ++) if (oldText [i] > 0xFFFF) numberOfSelectedHighUnicodeValues ++;
 			from_pos += numberOfLeadingHighUnicodeValues;
 			to_pos += numberOfLeadingHighUnicodeValues + numberOfSelectedHighUnicodeValues;
-			const char16_t *macText_utf16 = (const char16_t *) Melder_peekWcsToUtf16 (macText);
-			TXNSetData (d_macMlteObject, kTXNUnicodeTextData, macText_utf16, wcslen_utf16 (macText, 0) * 2, from_pos, to_pos);
+			const char16 *macText_utf16 = (const char16 *) Melder_peek32to16 (macText);
+			TXNSetData (my d_macMlteObject, kTXNUnicodeTextData, macText_utf16, str32len_utf16 (macText, 0) * 2, from_pos, to_pos);
 		}
 		Melder_free (macText);
-		if (d_widget -> managed) {
-			if (isTextControl (d_widget)) {
-				Draw1Control (d_widget -> nat.control.handle);
-			} else if (isMLTE (this)) {
+		if (my d_widget -> managed) {
+			if (isTextControl (my d_widget)) {
+				Draw1Control (my d_widget -> nat.control.handle);
+			} else if (isMLTE (me)) {
 			}
 			GuiMac_clipOff ();
 		}
-		_GuiText_handleValueChanged (d_widget);
+		_GuiText_handleValueChanged (my d_widget);
 	#endif
 }
 
-void structGuiText :: f_scrollToSelection () {
+void GuiText_scrollToSelection (GuiText me) {
 	#if gtk
-		GtkTextBuffer *textBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (d_widget));
+		GtkTextBuffer *textBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (my d_widget));
 		GtkTextIter start, end;
 		gtk_text_buffer_get_selection_bounds (textBuffer, & start, & end);
-		//GtkTextMark *mark = gtk_text_buffer_create_mark (textBuffer, NULL, & start, true);
-		gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (d_widget), & start, 0.1, false, 0.0, 0.0); 
-		//gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (d_widget), mark, 0.1, false, 0.0, 0.0);
+		//GtkTextMark *mark = gtk_text_buffer_create_mark (textBuffer, nullptr, & start, true);
+		gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (my d_widget), & start, 0.1, false, 0.0, 0.0);
+		//gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (my d_widget), mark, 0.1, false, 0.0, 0.0);
 	#elif cocoa
-		if (d_cocoaTextView)
-			[d_cocoaTextView scrollRangeToVisible: [d_cocoaTextView selectedRange]];
+		if (my d_cocoaTextView)
+			[my d_cocoaTextView   scrollRangeToVisible: [my d_cocoaTextView   selectedRange]];
 	#elif win
-		Edit_ScrollCaret (d_widget -> window);
+		Edit_ScrollCaret (my d_widget -> window);
 	#elif mac
-		if (isTextControl (d_widget)) {
+		if (isTextControl (my d_widget)) {
 			;
-		} else if (isMLTE (this)) {
-			TXNShowSelection (d_macMlteObject, false);
+		} else if (isMLTE (me)) {
+			TXNShowSelection (my d_macMlteObject, false);
 		}
 	#endif
 }
 
-void structGuiText :: f_setChangeCallback (void (*changeCallback) (void *boss, GuiTextEvent event), void *changeBoss) {
-	d_changeCallback = changeCallback;
-	d_changeBoss = changeBoss;
+void GuiText_setChangeCallback (GuiText me, void (*changeCallback) (void *boss, GuiTextEvent event), void *changeBoss) {
+	my d_changeCallback = changeCallback;
+	my d_changeBoss = changeBoss;
 }
 
-void structGuiText :: f_setFontSize (int size) {
+void GuiText_setFontSize (GuiText me, int size) {
 	#if gtk
-		GtkRcStyle *modStyle = gtk_widget_get_modifier_style (GTK_WIDGET (d_widget));
-		trace ("before initializing Pango: locale is %s", setlocale (LC_ALL, NULL));
-		PangoFontDescription *fontDesc = modStyle -> font_desc != NULL ? modStyle->font_desc :
+		GtkRcStyle *modStyle = gtk_widget_get_modifier_style (GTK_WIDGET (my d_widget));
+		trace (U"before initializing Pango: locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
+		PangoFontDescription *fontDesc = modStyle -> font_desc != nullptr ? modStyle -> font_desc :
 			#if ALLOW_GDK_DRAWING
-				pango_font_description_copy (GTK_WIDGET (d_widget) -> style -> font_desc);
+				pango_font_description_copy (GTK_WIDGET (my d_widget) -> style -> font_desc);
 			#else
-				NULL;
+				nullptr;
 			#endif
-		trace ("during initializing Pango: locale is %s", setlocale (LC_ALL, NULL));
+		trace (U"during initializing Pango: locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 		pango_font_description_set_absolute_size (fontDesc, size * PANGO_SCALE);
-		trace ("after initializing Pango: locale is %s", setlocale (LC_ALL, NULL));
+		trace (U"after initializing Pango: locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 		modStyle -> font_desc = fontDesc;
-		gtk_widget_modify_style (GTK_WIDGET (d_widget), modStyle);
+		gtk_widget_modify_style (GTK_WIDGET (my d_widget), modStyle);
 	#elif cocoa
-		if (d_cocoaTextView) {
-			[d_cocoaTextView setFont: [NSFont systemFontOfSize: size]];
+		if (my d_cocoaTextView) {
+			[my d_cocoaTextView   setFont: [NSFont fontWithName: @"Menlo"   size: size]];
 		}
 	#elif win
 		// a trick to update the window. BUG: why doesn't UpdateWindow seem to suffice?
 		long first, last;
-		wchar_t *text = f_getStringAndSelectionPosition (& first, & last);
-		f_setString (L"");   // erase all
-		UpdateWindow (d_widget -> window);
+		char32 *text = GuiText_getStringAndSelectionPosition (me, & first, & last);
+		GuiText_setString (me, U"");   // erase all
+		UpdateWindow (my d_widget -> window);
 		if (size <= 10) {
-			SetWindowFont (d_widget -> window, font10, FALSE);
+			SetWindowFont (my d_widget -> window, font10, false);
 		} else if (size <= 12) {
-			SetWindowFont (d_widget -> window, font12, FALSE);
+			SetWindowFont (my d_widget -> window, font12, false);
 		} else if (size <= 14) {
-			SetWindowFont (d_widget -> window, font14, FALSE);
+			SetWindowFont (my d_widget -> window, font14, false);
 		} else if (size <= 18) {
-			SetWindowFont (d_widget -> window, font18, FALSE);
+			SetWindowFont (my d_widget -> window, font18, false);
 		} else {
-			SetWindowFont (d_widget -> window, font24, FALSE);
+			SetWindowFont (my d_widget -> window, font24, false);
 		}
-		f_setString (text);
+		GuiText_setString (me, text);
 		Melder_free (text);
-		f_setSelection (first, last);
-		UpdateWindow (d_widget -> window);
+		GuiText_setSelection (me, first, last);
+		UpdateWindow (my d_widget -> window);
 	#elif mac
-		if (isMLTE (this)) {
+		if (isMLTE (me)) {
 			TXNTypeAttributes attr;
 			attr. tag = kTXNQDFontSizeAttribute;
 			attr. size = kTXNFontSizeAttributeSize;
 			attr. data. dataValue = (unsigned long) size << 16;
-			TXNSetTypeAttributes (d_macMlteObject, 1, & attr, 0, 2000000000);
+			TXNSetTypeAttributes (my d_macMlteObject, 1, & attr, 0, 2000000000);
 		}
 	#endif
 }
 
-void structGuiText :: f_setRedoItem (GuiMenuItem item) {
+void GuiText_setRedoItem (GuiText me, GuiMenuItem item) {
 	#if gtk
-		if (d_redo_item)
-			//g_object_unref (d_redo_item -> d_widget);
-		d_redo_item = item;
-		if (d_redo_item) {
-			//g_object_ref (d_redo_item -> d_widget);
-			d_redo_item -> f_setSensitive (history_has_redo (this));
+		if (my d_redo_item)
+			//g_object_unref (my d_redo_item -> d_widget);
+		my d_redo_item = item;
+		if (my d_redo_item) {
+			//g_object_ref (my d_redo_item -> d_widget);
+			GuiThing_setSensitive (my d_redo_item, history_has_redo (me));
 		}
 	#elif cocoa
 	#elif win
@@ -1581,13 +1551,13 @@ void structGuiText :: f_setRedoItem (GuiMenuItem item) {
 	#endif
 }
 
-void structGuiText :: f_setSelection (long first, long last) {
-	if (d_widget != NULL) {
+void GuiText_setSelection (GuiText me, long first, long last) {
+	if (my d_widget) {
 	#if gtk
-		if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_ENTRY) {
-			gtk_editable_select_region (GTK_EDITABLE (d_widget), first, last);
-		} else if (G_OBJECT_TYPE (G_OBJECT (d_widget)) == GTK_TYPE_TEXT_VIEW) {
-			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (d_widget));
+		if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_ENTRY) {
+			gtk_editable_select_region (GTK_EDITABLE (my d_widget), first, last);
+		} else if (G_OBJECT_TYPE (G_OBJECT (my d_widget)) == GTK_TYPE_TEXT_VIEW) {
+			GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (my d_widget));
 			GtkTextIter from_it, to_it;
 			gtk_text_buffer_get_iter_at_offset (buffer, & from_it, first);
 			gtk_text_buffer_get_iter_at_offset (buffer, & to_it, last);
@@ -1597,43 +1567,51 @@ void structGuiText :: f_setSelection (long first, long last) {
 		/*
 		 * On Cocoa, characters are counted in UTF-16 units, whereas 'first' and 'last' are in UTF-32 units. Convert.
 		 */
-		wchar_t *text = f_getString ();
-		if (first < 0) first = 0;
-		if (last < 0) last = 0;
-		long length = wcslen (text);
-		if (first >= length) first = length;
-		if (last >= length) last = length;
+		char32 *text = GuiText_getString (me);
 		long numberOfLeadingHighUnicodeValues = 0, numberOfSelectedHighUnicodeValues = 0;
 		for (long i = 0; i < first; i ++) if (text [i] > 0xFFFF) numberOfLeadingHighUnicodeValues ++;
 		for (long i = first; i < last; i ++) if (text [i] > 0xFFFF) numberOfSelectedHighUnicodeValues ++;
 		first += numberOfLeadingHighUnicodeValues;
 		last += numberOfLeadingHighUnicodeValues + numberOfSelectedHighUnicodeValues;
 		Melder_free (text);
-		if (d_cocoaTextView) {
-			[d_cocoaTextView setSelectedRange: NSMakeRange (first, last - first)];
+
+		if (my d_cocoaTextView) {
+			[my d_cocoaTextView   setSelectedRange: NSMakeRange (first, last - first)];
 		}
 	#elif win
-		/* 'first' and 'last' are the positions of the selection in the text when separated by LF alone. */
-		/* We have to convert this to the positions that the selection has in a text separated by CR/LF sequences. */
-		wchar_t *text = f_getString ();
+		char32 *text = GuiText_getString (me);
 		if (first < 0) first = 0;
 		if (last < 0) last = 0;
-		long length = wcslen (text);
+		long length = str32len (text);
 		if (first >= length) first = length;
 		if (last >= length) last = length;
+		/*
+		 * 'first' and 'last' are the positions of the selection in the text when separated by LF alone.
+		 * We have to convert this to the positions that the selection has in a text separated by CR/LF sequences.
+		 */
 		long numberOfLeadingLineBreaks = 0, numberOfSelectedLineBreaks = 0;
-		for (long i = 0; i < first; i ++) if (text [i] == '\n') numberOfLeadingLineBreaks ++;
-		for (long i = first; i < last; i ++) if (text [i] == '\n') numberOfSelectedLineBreaks ++;
+		for (long i = 0; i < first; i ++) if (text [i] == U'\n') numberOfLeadingLineBreaks ++;
+		for (long i = first; i < last; i ++) if (text [i] == U'\n') numberOfSelectedLineBreaks ++;
+		/*
+		 * On Windows, characters are counted in UTF-16 units, whereas 'first' and 'last' are in UTF-32 units. Convert.
+		 */
+		long numberOfLeadingHighUnicodeValues = 0, numberOfSelectedHighUnicodeValues = 0;
+		for (long i = 0; i < first; i ++) if (text [i] > 0xFFFF) numberOfLeadingHighUnicodeValues ++;
+		for (long i = first; i < last; i ++) if (text [i] > 0xFFFF) numberOfSelectedHighUnicodeValues ++;
+
 		first += numberOfLeadingLineBreaks;
 		last += numberOfLeadingLineBreaks + numberOfSelectedLineBreaks;
+		first += numberOfLeadingHighUnicodeValues;
+		last += numberOfLeadingHighUnicodeValues + numberOfSelectedHighUnicodeValues;
 		Melder_free (text);
-		Edit_SetSel (d_widget -> window, first, last);
-		UpdateWindow (d_widget -> window);
+
+		Edit_SetSel (my d_widget -> window, first, last);
+		UpdateWindow (my d_widget -> window);
 	#elif mac
-		wchar_t *text = f_getString ();
+		char32 *text = GuiText_getString (me);
 		if (first < 0) first = 0;
 		if (last < 0) last = 0;
-		long length = wcslen (text);
+		long length = str32len (text);
 		if (first >= length) first = length;
 		if (last >= length) last = length;
 		long numberOfLeadingHighUnicodeValues = 0, numberOfSelectedHighUnicodeValues = 0;
@@ -1642,66 +1620,68 @@ void structGuiText :: f_setSelection (long first, long last) {
 		first += numberOfLeadingHighUnicodeValues;
 		last += numberOfLeadingHighUnicodeValues + numberOfSelectedHighUnicodeValues;
 		Melder_free (text);
-		if (isTextControl (d_widget)) {
+		if (isTextControl (my d_widget)) {
 			ControlEditTextSelectionRec rec = { (int16_t) first, (int16_t) last };
-			SetControlData (d_widget -> nat.control.handle, kControlEntireControl, kControlEditTextSelectionTag, sizeof (rec), & rec);
-		} else if (isMLTE (this)) {
-			TXNSetSelection (d_macMlteObject, first, last);
+			SetControlData (my d_widget -> nat.control.handle, kControlEntireControl, kControlEditTextSelectionTag, sizeof (rec), & rec);
+		} else if (isMLTE (me)) {
+			TXNSetSelection (my d_macMlteObject, first, last);
 		}
 	#endif
 	}
 }
 
-void structGuiText :: f_setString (const wchar_t *text) {
+void GuiText_setString (GuiText me, const char32 *text) {
 	#if gtk
-		if (G_OBJECT_TYPE (d_widget) == GTK_TYPE_ENTRY) {
-			gtk_entry_set_text (GTK_ENTRY (d_widget), Melder_peekWcsToUtf8 (text));
-		} else if (G_OBJECT_TYPE (d_widget) == GTK_TYPE_TEXT_VIEW) {
-			GtkTextBuffer *textBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (d_widget));
-			gchar *textUtf8 = Melder_peekWcsToUtf8 (text);
+		if (G_OBJECT_TYPE (my d_widget) == GTK_TYPE_ENTRY) {
+			gtk_entry_set_text (GTK_ENTRY (my d_widget), Melder_peek32to8 (text));
+		} else if (G_OBJECT_TYPE (my d_widget) == GTK_TYPE_TEXT_VIEW) {
+			GtkTextBuffer *textBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (my d_widget));
+			gchar *textUtf8 = Melder_peek32to8 (text);
 			//gtk_text_buffer_set_text (textBuffer, textUtf8, strlen (textUtf8));   // length in bytes!
 			GtkTextIter start, end;
 			gtk_text_buffer_get_start_iter (textBuffer, & start);
 			gtk_text_buffer_get_end_iter (textBuffer, & end);
-			gtk_text_buffer_delete_interactive (textBuffer, & start, & end, gtk_text_view_get_editable (GTK_TEXT_VIEW (d_widget)));
-			gtk_text_buffer_insert_interactive (textBuffer, & start, textUtf8, strlen (textUtf8), gtk_text_view_get_editable (GTK_TEXT_VIEW (d_widget)));
+			gtk_text_buffer_delete_interactive (textBuffer, & start, & end, gtk_text_view_get_editable (GTK_TEXT_VIEW (my d_widget)));
+			gtk_text_buffer_insert_interactive (textBuffer, & start, textUtf8, strlen (textUtf8), gtk_text_view_get_editable (GTK_TEXT_VIEW (my d_widget)));
 		}
 	#elif cocoa
-		trace ("title");
-		if (d_cocoaTextView) {
-			NSRange nsRange = NSMakeRange (0, [[d_cocoaTextView textStorage] length]);
-			NSString *nsString = (NSString *) Melder_peekWcsToCfstring (text);
-			[d_cocoaTextView shouldChangeTextInRange: nsRange replacementString: nsString];   // to make this action undoable
-			//[[d_cocoaTextView textStorage] replaceCharactersInRange: nsRange withString: nsString];
-			[d_cocoaTextView setString: nsString];
-			[d_cocoaTextView scrollRangeToVisible: NSMakeRange ([[d_cocoaTextView textStorage] length], 0)];   // to the end
-			//[[d_cocoaTextView window] setViewsNeedDisplay: YES];
-			//[[d_cocoaTextView window] display];
+		trace (U"title");
+		if (my d_cocoaTextView) {
+			NSRange nsRange = NSMakeRange (0, [[my d_cocoaTextView   textStorage] length]);
+			NSString *nsString = (NSString *) Melder_peek32toCfstring (text);
+			[my d_cocoaTextView   shouldChangeTextInRange: nsRange   replacementString: nsString];   // to make this action undoable
+			//[[my d_cocoaTextView   textStorage] replaceCharactersInRange: nsRange   withString: nsString];
+			[my d_cocoaTextView   setString: nsString];
+			[my d_cocoaTextView   scrollRangeToVisible: NSMakeRange ([[my d_cocoaTextView   textStorage] length], 0)];   // to the end
+			//[[my d_cocoaTextView   window] setViewsNeedDisplay: YES];
+			//[[my d_cocoaTextView   window] display];
 		} else {
-			[(NSTextField *) d_widget   setStringValue: (NSString *) Melder_peekWcsToCfstring (text)];
+			[(NSTextField *) my d_widget   setStringValue: (NSString *) Melder_peek32toCfstring (text)];
 		}
 	#elif win
-		const wchar_t *from;
-		wchar_t *winText = Melder_malloc_f (wchar_t, 2 * wcslen (text) + 1), *to;   /* All new lines plus one null byte. */
+		const char32 *from;
+		char32 *winText = Melder_malloc_f (char32, 2 * str32len (text) + 1), *to;   /* All new lines plus one null byte. */
 		/*
 		 * Replace all LF with CR/LF.
 		 */
-		for (from = text, to = winText; *from != '\0'; from ++, to ++)
-			if (*from == '\n') { *to = 13; * ++ to = '\n'; } else *to = *from;
-		*to = '\0';
-		SetWindowText (d_widget -> window, winText);
+		for (from = text, to = winText; *from != U'\0'; from ++, to ++)
+			if (*from == U'\n') { *to = 13; * ++ to = U'\n'; } else *to = *from;
+		*to = U'\0';
+		SetWindowTextW (my d_widget -> window, Melder_peek32toW (winText));
 		Melder_free (winText);
-		UpdateWindow (d_widget -> window);
+		UpdateWindow (my d_widget -> window);
 	#elif mac
-		long length_utf32 = wcslen (text), length_utf16 = wcslen_utf16 (text, false);
+		long length_utf32 = str32len (text), length_utf16 = str32len_utf16 (text, false);
 		UniChar *macText = Melder_malloc_f (UniChar, length_utf16 + 1);
-		Melder_assert (d_widget -> widgetClass == xmTextWidgetClass);
+		//Melder_assert (macText);
+		//Melder_assert (my d_widget);
+		//Melder_assert (my d_widget -> widgetClass == xmTextWidgetClass);
 		/*
 		 * Convert from UTF-32 to UTF-16 and replace all LF with CR.
 		 */
 		long j = 0;
 		for (long i = 0; i < length_utf32; i ++) {
-			char32_t kar = (char32_t) text [i];   // reinterpret sign bit
+			char32 kar = (char32) text [i];   // reinterpret sign bit
 			if (kar == '\n') {   // LF
 				macText [j ++] = 13;   // CR
 			} else if (kar <= 0x00FFFF) {
@@ -1715,40 +1695,40 @@ void structGuiText :: f_setString (const wchar_t *text) {
 		}
 		macText [j] = '\0';
 		if (j != length_utf16)
-			Melder_fatal ("GuiText_setString: incorrect number of UTF-16 words (%ld instead of %ld): <<%ls>>.", j, length_utf16, text);
-		if (isTextControl (d_widget)) {
-			CFStringRef cfString = CFStringCreateWithCharacters (NULL, macText, length_utf16);
-			SetControlData (d_widget -> nat.control.handle, kControlEntireControl, kControlEditTextCFStringTag, sizeof (CFStringRef), & cfString);
+			Melder_fatal (U"GuiText_setString: incorrect number of UTF-16 words (", j, U" instead of ", length_utf16, U"): <<", text, U">>.");
+		if (isTextControl (my d_widget)) {
+			CFStringRef cfString = CFStringCreateWithCharacters (nullptr, macText, length_utf16);
+			SetControlData (my d_widget -> nat.control.handle, kControlEntireControl, kControlEditTextCFStringTag, sizeof (CFStringRef), & cfString);
 			CFRelease (cfString);
-		} else if (isMLTE (this)) {
-			TXNSetData (d_macMlteObject, kTXNUnicodeTextData, macText, length_utf16*2, 0, NativeText_getLength (d_widget));
+		} else if (isMLTE (me)) {
+			TXNSetData (my d_macMlteObject, kTXNUnicodeTextData, macText, length_utf16*2, 0, NativeText_getLength (my d_widget));
 		}
 		Melder_free (macText);
-		if (d_widget -> managed) {
+		if (my d_widget -> managed) {
 			if (theGui.duringUpdate) {
-				_Gui_invalidateWidget (d_widget);   /* HACK: necessary because VisRgn has temporarily been changed (not used in Praat any longer). */
+				_Gui_invalidateWidget (my d_widget);   // HACK: necessary because VisRgn has temporarily been changed (not used in Praat any longer)
 			} else {
-				if (isTextControl (d_widget)) {
-					_GuiMac_clipOnParent (d_widget);
-					Draw1Control (d_widget -> nat.control.handle);
+				if (isTextControl (my d_widget)) {
+					_GuiMac_clipOnParent (my d_widget);
+					Draw1Control (my d_widget -> nat.control.handle);
 					GuiMac_clipOff ();
-				} else if (isMLTE (this)) {
+				} else if (isMLTE (me)) {
 				}
 			}
 		}
-		_GuiText_handleValueChanged (d_widget);
+		_GuiText_handleValueChanged (my d_widget);
 	#endif
 }
 
-void structGuiText :: f_setUndoItem (GuiMenuItem item) {
+void GuiText_setUndoItem (GuiText me, GuiMenuItem item) {
 	#if gtk
-		if (d_undo_item) {
-			//g_object_unref (d_undo_item -> d_widget);
+		if (my d_undo_item) {
+			//g_object_unref (my d_undo_item -> d_widget);
 		}
-		d_undo_item = item;
-		if (d_undo_item) {
-			//g_object_ref (d_undo_item -> d_widget);
-			d_undo_item -> f_setSensitive (history_has_undo (this));
+		my d_undo_item = item;
+		if (my d_undo_item) {
+			//g_object_ref (my d_undo_item -> d_widget);
+			GuiThing_setSensitive (my d_undo_item, history_has_undo (me));
 		}
 	#elif cocoa
 	#elif win
@@ -1756,19 +1736,19 @@ void structGuiText :: f_setUndoItem (GuiMenuItem item) {
 	#endif
 }
 
-void structGuiText :: f_undo () {
+void GuiText_undo (GuiText me) {
 	#if gtk
-		history_do (this, 1);
+		history_do (me, 1);
 	#elif cocoa
-		if (d_cocoaTextView) {
-			[[d_cocoaTextView undoManager] undo];
+		if (my d_cocoaTextView) {
+			[[my d_cocoaTextView   undoManager] undo];
 		}
 	#elif win
 	#elif mac
-		if (isMLTE (this)) {
-			TXNUndo (d_macMlteObject);
+		if (isMLTE (me)) {
+			TXNUndo (my d_macMlteObject);
 		}
-		_GuiText_handleValueChanged (d_widget);
+		_GuiText_handleValueChanged (my d_widget);
 	#endif
 }
 
diff --git a/sys/GuiThing.cpp b/sys/GuiThing.cpp
index c9acd46..aaedb99 100644
--- a/sys/GuiThing.cpp
+++ b/sys/GuiThing.cpp
@@ -1,6 +1,6 @@
 /* GuiThing.cpp
  *
- * Copyright (C) 1993-2012,2013 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brausse
+ * Copyright (C) 1993-2012,2013,2015 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brausse
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,17 +24,13 @@ void structGuiThing :: v_destroy () {
 	GuiThing_Parent :: v_destroy ();
 }
 
-void structGuiThing :: f_hide () {
-	v_hide ();
-}
-
 void structGuiThing :: v_hide () {
 	#if gtk
 		GuiObject parent = gtk_widget_get_parent (GTK_WIDGET (d_widget));
-		if (parent != NULL && GTK_IS_DIALOG (parent)) {   // I am the top GtkFixed of a dialog
+		if (parent && GTK_IS_DIALOG (parent)) {   // I am the top GtkFixed of a dialog
 			gtk_widget_hide (GTK_WIDGET (parent));
-		} else if (parent != NULL && GTK_IS_DIALOG (gtk_widget_get_parent (GTK_WIDGET (parent)))) {
-			trace ("hiding a dialog indirectly");
+		} else if (parent && GTK_IS_DIALOG (gtk_widget_get_parent (GTK_WIDGET (parent)))) {
+			trace (U"hiding a dialog indirectly");
 			gtk_widget_hide (GTK_WIDGET (gtk_widget_get_parent (GTK_WIDGET (parent))));
 		} else {
 			gtk_widget_hide (GTK_WIDGET (d_widget));
@@ -62,10 +58,6 @@ void structGuiThing :: v_hide () {
 	#endif
 }
 
-void structGuiThing :: f_setSensitive (bool sensitive) {
-	v_setSensitive (sensitive);
-}
-
 void structGuiThing :: v_setSensitive (bool sensitive) {
 	#if gtk
 		gtk_widget_set_sensitive (GTK_WIDGET (d_widget), sensitive);
@@ -80,39 +72,35 @@ void structGuiThing :: v_setSensitive (bool sensitive) {
 	#endif
 }
 
-void structGuiThing :: f_show () {
-	v_show ();
-}
-
 void structGuiThing :: v_show () {
 	#if gtk
-		trace ("showing widget %p", d_widget);
+		trace (U"showing widget ", Melder_pointer (d_widget));
 		GuiObject parent = gtk_widget_get_parent (GTK_WIDGET (d_widget));
-		trace ("the parent widget is %p", parent);
+		trace (U"the parent widget is ", Melder_pointer (parent));
 		if (GTK_IS_WINDOW (parent)) {
 			// I am a window's GtkFixed
-			trace ("showing a window");
+			trace (U"showing a window");
 			gtk_widget_show (GTK_WIDGET (d_widget));
 			gtk_window_present (GTK_WINDOW (parent));
 		} else if (GTK_IS_DIALOG (parent)) {
 			// I am a dialog's GtkFixed, and therefore automatically shown
-			trace ("showing a dialog");
+			trace (U"showing a dialog");
 			gtk_window_present (GTK_WINDOW (parent));
 		} else if (GTK_IS_DIALOG (gtk_widget_get_parent (GTK_WIDGET (parent)))) {
 			// I am a dialog's GtkFixed, and therefore automatically shown
-			trace ("showing a dialog (indirectly)");
+			trace (U"showing a dialog (indirectly)");
 			gtk_window_present (GTK_WINDOW (gtk_widget_get_parent (GTK_WIDGET (parent))));
 		} else {
-			trace ("showing a widget that is not a window or dialog");
+			trace (U"showing a widget that is not a window or dialog");
 			gtk_widget_show (GTK_WIDGET (d_widget));
 		}
 	#elif cocoa
 		if ([(NSObject *) d_widget isKindOfClass: [NSWindow class]]) {
-			trace ("trying to show a window");
+			trace (U"trying to show a window");
 			[(NSWindow *) d_widget makeKeyAndOrderFront: nil];
 		} else if ([(NSObject *) d_widget isKindOfClass: [NSView class]]) {
 			if ((NSView *) d_widget == [[(NSView *) d_widget window] contentView]) {
-				trace ("trying to show a window through its content view");
+				trace (U"trying to show a window through its content view");
 				[[(NSView *) d_widget window] makeKeyAndOrderFront: nil];
 			} else {
 				[(NSView *) d_widget setHidden: NO];
@@ -129,7 +117,19 @@ void structGuiThing :: v_show () {
 			XtManageChild (parent);   // the containing scrolled window; BUG if created with XmScrolledList?
 		}
 	#endif
-	trace ("end");
+	trace (U"end");
+}
+
+void GuiThing_hide (GuiThing me) {
+	my v_hide ();
+}
+
+void GuiThing_setSensitive (GuiThing me, bool sensitive) {
+	my v_setSensitive (sensitive);
+}
+
+void GuiThing_show (GuiThing me) {
+	my v_show ();
 }
 
 /* End of file GuiThing.cpp */
diff --git a/sys/GuiWindow.cpp b/sys/GuiWindow.cpp
index afc1ed5..f9da2c4 100644
--- a/sys/GuiWindow.cpp
+++ b/sys/GuiWindow.cpp
@@ -1,6 +1,6 @@
 /* GuiWindow.cpp
  *
- * Copyright (C) 1993-2012,2013,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1993-2012,2013,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,7 +22,7 @@
  * pb 2004/02/12 don't trust window modification feedback on MacOS 9
  * pb 2004/04/06 GuiWindow_drain separated from XmUpdateDisplay
  * pb 2006/10/28 erased MacOS 9 stuff
- * pb 2007/06/19 wchar_t
+ * pb 2007/06/19 wchar
  * pb 2007/12/30 extraction
  * pb 2010/07/29 removed GuiWindow_show
  * pb 2011/04/06 C++
@@ -44,25 +44,25 @@ Thing_implement (GuiWindow, GuiShell, 0);
 		(void) widget;
 		iam (GuiWindow);
 		forget (me);
-		return TRUE;
+		return true;
 	}
 	static gboolean _GuiWindow_goAwayCallback (GuiObject widget, GdkEvent *event, gpointer void_me) {
 		(void) widget;
 		iam (GuiWindow);
-		if (my d_goAwayCallback != NULL) {
+		if (my d_goAwayCallback) {
 			my d_goAwayCallback (my d_goAwayBoss);
 		}
-		return TRUE;
+		return true;
 	}
 	static void _GuiWindow_child_resizeCallback (GtkWidget *childWidget, gpointer data) {
 		GtkAllocation *allocation = (GtkAllocation *) data;
 		GtkWidget *parentWidget = gtk_widget_get_parent (childWidget);
 		Thing_cast (GuiThing, child, _GuiObject_getUserData (childWidget));
 		if (child) {
-			GuiControl control = NULL;
-			if (Thing_member (child, classGuiControl)) {
+			GuiControl control = nullptr;
+			if (Thing_isa (child, classGuiControl)) {
 				control = static_cast <GuiControl> (child);
-			} else if (Thing_member (child, classGuiMenu)) {
+			} else if (Thing_isa (child, classGuiMenu)) {
 				Thing_cast (GuiMenu, menu, child);
 				control = menu -> d_cascadeButton;
 			}
@@ -70,25 +70,26 @@ Thing_implement (GuiWindow, GuiShell, 0);
 				/*
 				 * Move and resize.
 				 */
-				trace ("moving child of class %ls", Thing_className (control));
+				trace (U"moving child of class ", Thing_className (control));
 				int left = control -> d_left, right = control -> d_right, top = control -> d_top, bottom = control -> d_bottom;
 				if (left   <  0) left   += allocation -> width;   // this replicates structGuiControl :: v_positionInForm ()
 				if (right  <= 0) right  += allocation -> width;
 				if (top    <  0) top    += allocation -> height;
 				if (bottom <= 0) bottom += allocation -> height;
-				trace ("moving child to (%d,%d)", left, top);
+				trace (U"moving child to (", left, U",", top, U")");
 				gtk_fixed_move (GTK_FIXED (parentWidget), GTK_WIDGET (childWidget), left, top);
 				gtk_widget_set_size_request (GTK_WIDGET (childWidget), right - left, bottom - top);
-				trace ("moved child of class %ls", Thing_className (control));
+				trace (U"moved child of class ", Thing_className (control));
 			}
 		}
 	}
 	static gboolean _GuiWindow_resizeCallback (GuiObject widget, GtkAllocation *allocation, gpointer void_me) {
 		(void) widget;
 		iam (GuiWindow);
-		trace ("fixed received size allocation: (%ld, %ld), %ld x %ld.", (long) allocation -> x, (long) allocation -> y, (long) allocation -> width, (long) allocation -> height);
+		trace (U"fixed received size allocation: (", allocation -> x, U", ", allocation -> y,
+			U"), ", allocation -> width, U" x ", allocation -> height, U".");
 		if (allocation -> width != my d_width || allocation -> height != my d_height) {
-			trace ("user changed the size of the window?");
+			trace (U"user changed the size of the window?");
 			/*
 			 * Apparently, GTK sends the size allocation message both to the shell and to its fixed-container child.
 			 * we could capture the message either from the shell or from the fixed; we choose to do it from the fixed.
@@ -102,8 +103,8 @@ Thing_implement (GuiWindow, GuiShell, 0);
 			my d_height = allocation -> height;
 			gtk_widget_set_size_request (GTK_WIDGET (widget), allocation -> width, allocation -> height);
 		}
-		trace ("end");
-		return FALSE;
+		trace (U"end");
+		return false;
 	}
 #elif cocoa
 	@implementation GuiCocoaWindow {
@@ -111,20 +112,20 @@ Thing_implement (GuiWindow, GuiShell, 0);
 	}
 	- (void) dealloc {   // override
 		GuiWindow me = d_userData;
-		my d_cocoaWindow = NULL;   // this is already under destruction, so undangle
+		my d_cocoaWindow = nullptr;   // this is already under destruction, so undangle
 		forget (me);
-		trace ("deleting a window");
+		trace (U"deleting a window");
 		[super dealloc];
 	}
 	- (GuiThing) userData {
 		return d_userData;
 	}
 	- (void) setUserData: (GuiThing) userData {
-		Melder_assert (userData == NULL || Thing_member (userData, classGuiWindow));
+		Melder_assert (userData == nullptr || Thing_isa (userData, classGuiWindow));
 		d_userData = static_cast <GuiWindow> (userData);
 	}
 	- (void) keyDown: (NSEvent *) theEvent {
-		trace ("key down");
+		trace (U"key down");
 	}
 	//@end
 	//@interface GuiCocoaWindowDelegate : NSObject <NSWindowDelegate> { } @end
@@ -133,14 +134,14 @@ Thing_implement (GuiWindow, GuiShell, 0);
 	- (BOOL) windowShouldClose: (id) sender {
 		GuiCocoaWindow *widget = (GuiCocoaWindow *) sender;
 		GuiWindow me = (GuiWindow) [widget userData];
-		if (my d_goAwayCallback != NULL) {
-			trace ("calling goAwayCallback)");
+		if (my d_goAwayCallback) {
+			trace (U"calling goAwayCallback)");
 			my d_goAwayCallback (my d_goAwayBoss);
 		} else {
-			trace ("hiding window");
+			trace (U"hiding window");
 			[widget orderOut: nil];
 		}
-		return FALSE;
+		return false;
 	}
 	@end
 	//static GuiCocoaWindowDelegate *theGuiCocoaWindowDelegate;
@@ -150,23 +151,23 @@ Thing_implement (GuiWindow, GuiShell, 0);
 		iam (GuiWindow);
 		if (my d_xmMenuBar) {
 		}
-		//Melder_casual ("destroying window widget");
+		trace (U"destroying window widget");
 		forget (me);
 	}
 	static void _GuiMotifWindow_goAwayCallback (GuiObject widget, XtPointer void_me, XtPointer call) {
 		(void) widget; (void) call;
 		iam (GuiWindow);
-		if (my d_goAwayCallback != NULL) {
+		if (my d_goAwayCallback) {
 			my d_goAwayCallback (my d_goAwayBoss);
 		}
 	}
 #endif
 
 GuiWindow GuiWindow_create (int x, int y, int width, int height, int minimumWidth, int minimumHeight,
-	const wchar_t *title, void (*goAwayCallback) (void *goAwayBoss), void *goAwayBoss, unsigned long flags)
+	const char32 *title /* cattable */, void (*goAwayCallback) (void *goAwayBoss), void *goAwayBoss, uint32 flags)
 {
 	GuiWindow me = Thing_new (GuiWindow);
-	my d_parent = NULL;
+	my d_parent = nullptr;
 	my d_goAwayCallback = goAwayCallback;
 	my d_goAwayBoss = goAwayBoss;
 	#if gtk
@@ -176,8 +177,8 @@ GuiWindow GuiWindow_create (int x, int y, int width, int height, int minimumWidt
 		g_signal_connect (G_OBJECT (my d_gtkWindow), "destroy-event", G_CALLBACK (_GuiWindow_destroyCallback), me);
 
 		gtk_window_set_default_size (GTK_WINDOW (my d_gtkWindow), width, height);
-		gtk_window_set_resizable (GTK_WINDOW (my d_gtkWindow), TRUE);
-		my f_setTitle (title);
+		gtk_window_set_resizable (GTK_WINDOW (my d_gtkWindow), true);
+		GuiShell_setTitle (me, title);
 
 		my d_widget = gtk_fixed_new ();
 		_GuiObject_setUserData (my d_widget, me);
@@ -195,26 +196,26 @@ GuiWindow GuiWindow_create (int x, int y, int width, int height, int minimumWidt
 			defer: false];
 		[my d_cocoaWindow setCollectionBehavior: NSWindowCollectionBehaviorFullScreenPrimary];
         [my d_cocoaWindow setMinSize: NSMakeSize (minimumWidth, minimumHeight)];
-		my f_setTitle (title);
+		GuiShell_setTitle (me, title);
 		[my d_cocoaWindow makeKeyAndOrderFront: nil];
-		my d_widget = [my d_cocoaWindow contentView];
+		my d_widget = (GuiObject) [my d_cocoaWindow contentView];   // BUG: this d_widget doesn't have the GuiCocoaAny protocol
 		_GuiObject_setUserData (my d_cocoaWindow, me);
 		//if (! theGuiCocoaWindowDelegate) {
 		//	theGuiCocoaWindowDelegate = [[GuiCocoaWindowDelegate alloc] init];
 		//}
 		//[my d_cocoaWindow setDelegate: theGuiCocoaWindowDelegate];
 	#elif motif
-		my d_xmShell = XmCreateShell (NULL, flags & GuiWindow_FULLSCREEN ? "Praatwulgfullscreen" : "Praatwulg", NULL, 0);
-		XtVaSetValues (my d_xmShell, XmNdeleteResponse, goAwayCallback ? XmDO_NOTHING : XmUNMAP, NULL);
-		XtVaSetValues (my d_xmShell, XmNx, x, XmNy, y, XmNwidth, (Dimension) width, XmNheight, (Dimension) height, NULL);
+		my d_xmShell = XmCreateShell (nullptr, flags & GuiWindow_FULLSCREEN ? "Praatwulgfullscreen" : "Praatwulg", nullptr, 0);
+		XtVaSetValues (my d_xmShell, XmNdeleteResponse, goAwayCallback ? XmDO_NOTHING : XmUNMAP, nullptr);
+		XtVaSetValues (my d_xmShell, XmNx, x, XmNy, y, XmNwidth, (Dimension) width, XmNheight, (Dimension) height, nullptr);
 		if (goAwayCallback) {
 			XmAddWMProtocolCallback (my d_xmShell, 'delw', _GuiMotifWindow_goAwayCallback, (char *) me);
 		}
-		my f_setTitle (title);
-		my d_widget = XmCreateForm (my d_xmShell, "dialog", NULL, 0);
+		GuiShell_setTitle (me, title);
+		my d_widget = XmCreateForm (my d_xmShell, "dialog", nullptr, 0);
 		_GuiObject_setUserData (my d_widget, me);
 		XtAddCallback (my d_widget, XmNdestroyCallback, _GuiMotifWindow_destroyCallback, me);
-		XtVaSetValues (my d_widget, XmNdialogStyle, XmDIALOG_MODELESS, XmNautoUnmanage, False, NULL);
+		XtVaSetValues (my d_widget, XmNdialogStyle, XmDIALOG_MODELESS, XmNautoUnmanage, False, nullptr);
 	#endif
 	my d_width = width;
 	my d_height = height;
@@ -225,47 +226,47 @@ GuiWindow GuiWindow_create (int x, int y, int width, int height, int minimumWidt
 GuiObject theGuiTopMenuBar;
 unsigned long theGuiTopLowAccelerators [8];
 
-void structGuiWindow :: f_addMenuBar () {
+void GuiWindow_addMenuBar (GuiWindow me) {
 	#if gtk
-		d_gtkMenuBar = (GtkMenuBar *) gtk_menu_bar_new ();
-		_GuiObject_setUserData (d_gtkMenuBar, this);
-		this -> v_positionInForm (d_gtkMenuBar, 0, 0, 0, Machine_getMenuBarHeight (), this);   // BUG?
+		my d_gtkMenuBar = (GtkMenuBar *) gtk_menu_bar_new ();
+		_GuiObject_setUserData (my d_gtkMenuBar, me);
+		my v_positionInForm (my d_gtkMenuBar, 0, 0, 0, Machine_getMenuBarHeight (), me);   // BUG?
 		
 		// we need an accelerator group for each window we're creating accelerated menus on
-		GuiObject topwin = gtk_widget_get_toplevel (GTK_WIDGET (d_widget));
-		Melder_assert (topwin == d_gtkWindow);
+		GuiObject topwin = gtk_widget_get_toplevel (GTK_WIDGET (my d_widget));
+		Melder_assert (topwin == my d_gtkWindow);
 		GtkAccelGroup *ag = gtk_accel_group_new ();
 		gtk_window_add_accel_group (GTK_WINDOW (topwin), ag);
 		// unfortunately, menu-bars don't fiddle with accel-groups, so we need a way
 		// to pass it to the sub-menus created upon this bar for their items to have
 		// access to the accel-group
-		g_object_set_data (G_OBJECT (d_gtkMenuBar), "accel-group", ag);
-		gtk_widget_show (GTK_WIDGET (d_gtkMenuBar));
+		g_object_set_data (G_OBJECT (my d_gtkMenuBar), "accel-group", ag);
+		gtk_widget_show (GTK_WIDGET (my d_gtkMenuBar));
 	#elif cocoa
 	#elif motif
 		if (win || theGuiTopMenuBar) {
-			d_xmMenuBar = XmCreateMenuBar (d_widget, "menuBar", NULL, 0);
-			XtVaSetValues (d_xmMenuBar, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL);
-			XtManageChild (d_xmMenuBar);
+			my d_xmMenuBar = XmCreateMenuBar (my d_widget, "menuBar", nullptr, 0);
+			XtVaSetValues (my d_xmMenuBar, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, nullptr);
+			XtManageChild (my d_xmMenuBar);
 		} else {
-			theGuiTopMenuBar = XmCreateMenuBar (NULL, "menuBar", NULL, 0);
+			theGuiTopMenuBar = XmCreateMenuBar (nullptr, "menuBar", nullptr, 0);
 			//XtManageChild (topBar);
 		}
 	#endif
 }
 
-bool structGuiWindow :: f_setDirty (bool dirty) {
+bool GuiWindow_setDirty (GuiWindow me, bool dirty) {
 	#if gtk
 		(void) dirty;
 		return false;
 	#elif cocoa
-		[d_cocoaWindow setDocumentEdited: dirty];
+		[my d_cocoaWindow   setDocumentEdited: dirty];
 		return true;
 	#elif win
 		(void) dirty;
 		return false;
 	#elif mac
-		SetWindowModified (d_xmShell -> nat.window.ptr, dirty);
+		SetWindowModified (my d_xmShell -> nat.window.ptr, dirty);
 		return true;
 	#endif
 }
diff --git a/sys/HyperPage.cpp b/sys/HyperPage.cpp
index ba23150..edf51f1 100644
--- a/sys/HyperPage.cpp
+++ b/sys/HyperPage.cpp
@@ -1,6 +1,6 @@
 /* HyperPage.cpp
  *
- * Copyright (C) 1996-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1996-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -45,16 +45,16 @@ static double resolution;
 
 /********** class HyperLink **********/
 
-Thing_implement (HyperLink, Data, 0);
+Thing_implement (HyperLink, Daata, 0);
 
-HyperLink HyperLink_create (const wchar_t *name, double x1DC, double x2DC, double y1DC, double y2DC) {
+HyperLink HyperLink_create (const char32 *name, double x1DC, double x2DC, double y1DC, double y2DC) {
 	autoHyperLink me = Thing_new (HyperLink);
 	Thing_setName (me.peek(), name);
 	my x1DC = x1DC, my x2DC = x2DC, my y1DC = y1DC, my y2DC = y2DC;
 	return me.transfer();
 }
 
-static void saveHistory (HyperPage me, const wchar_t *title) {
+static void saveHistory (HyperPage me, const char32 *title) {
 	if (! title) return;
 
 	/*
@@ -67,8 +67,8 @@ static void saveHistory (HyperPage me, const wchar_t *title) {
 	 * If the page title to be saved is already at the top, ignore it.
 	 */	
 	if (my history [my historyPointer]. page) {
-		if (wcsequ (my history [my historyPointer]. page, title)) return;
-	} else if (my historyPointer > 0 && wcsequ (my history [my historyPointer - 1]. page, title)) {
+		if (str32equ (my history [my historyPointer]. page, title)) return;
+	} else if (my historyPointer > 0 && str32equ (my history [my historyPointer - 1]. page, title)) {
 		my historyPointer --;
 		return;
 	}
@@ -85,7 +85,7 @@ static void saveHistory (HyperPage me, const wchar_t *title) {
 	/*
 	 * Add the page title to the top of the history list.
 	 */
-	my history [my historyPointer]. page = Melder_wcsdup_f (title);
+	my history [my historyPointer]. page = Melder_dup_f (title);
 }
 
 /********************************************************************************
@@ -104,10 +104,10 @@ static void initScreen (HyperPage me) {
 
 void HyperPage_initSheetOfPaper (HyperPage me) {
 	int reflect = my mirror && (my d_printingPageNumber & 1) == 0;
-	wchar_t *leftHeader = reflect ? my outsideHeader : my insideHeader;
-	wchar_t *rightHeader = reflect ? my insideHeader : my outsideHeader;
-	wchar_t *leftFooter = reflect ? my outsideFooter : my insideFooter;
-	wchar_t *rightFooter = reflect ? my insideFooter : my outsideFooter;
+	char32 *leftHeader = reflect ? my outsideHeader : my insideHeader;
+	char32 *rightHeader = reflect ? my insideHeader : my outsideHeader;
+	char32 *leftFooter = reflect ? my outsideFooter : my insideFooter;
+	char32 *rightFooter = reflect ? my insideFooter : my outsideFooter;
 
 	my d_y = PAPER_TOP - TOP_MARGIN;
 	my d_x = 0;
@@ -141,27 +141,26 @@ void HyperPage_initSheetOfPaper (HyperPage me) {
 	}
 	Graphics_setFontStyle (my ps, Graphics_NORMAL);
 	if (my d_printingPageNumber)
-		Graphics_text1 (my ps, 0.7 + ( reflect ? 0 : 6 ), PAPER_BOTTOM, Melder_integer (my d_printingPageNumber));
+		Graphics_text (my ps, 0.7 + ( reflect ? 0 : 6 ), PAPER_BOTTOM, my d_printingPageNumber);
 	Graphics_setTextAlignment (my ps, Graphics_LEFT, Graphics_BOTTOM);
 }
 
 static void updateVerticalScrollBar (HyperPage me);
 
-int HyperPage_any (I, const wchar_t *text, enum kGraphics_font font, int size, int style, double minFooterDistance,
+int HyperPage_any (HyperPage me, const char32 *text, enum kGraphics_font font, int size, int style, double minFooterDistance,
 	double x, double secondIndent, double topSpacing, double bottomSpacing, unsigned long method)
 {
-	iam (HyperPage);
 	double heightGuess;
 
 	if (my rightMargin == 0) return 0;
 	// Melder_assert (my rightMargin != 0);
 
-	heightGuess = size * (1.2/72) * ((long) size * wcslen (text) / (int) (my rightMargin * 150));
+	heightGuess = size * (1.2/72) * ((long) size * str32len (text) / (int) (my rightMargin * 150));
 
 if (! my printing) {
 	Graphics_Link *paragraphLinks;
 	int numberOfParagraphLinks, ilink;
-	if (my entryHint && (method & HyperPage_USE_ENTRY_HINT) && wcsequ (text, my entryHint)) {
+	if (my entryHint && (method & HyperPage_USE_ENTRY_HINT) && str32equ (text, my entryHint)) {
 		my entryPosition = my d_y;
 	}
 	my d_y -= ( my previousBottomSpacing > topSpacing ? my previousBottomSpacing : topSpacing ) * size / 12.0;
@@ -200,7 +199,7 @@ if (! my printing) {
 	Graphics_setFontSize (my ps, size);
 	my d_y -= my d_y == PAPER_TOP - TOP_MARGIN ? 0 : ( my previousBottomSpacing > topSpacing ? my previousBottomSpacing : topSpacing ) * size / 12.0;
 	my d_y -= size * (1.2/72);
-	if (my d_y < PAPER_BOTTOM + BOTTOM_MARGIN + minFooterDistance + size * (1.2/72) * (wcslen (text) / (6.0 * 10))) {
+	if (my d_y < PAPER_BOTTOM + BOTTOM_MARGIN + minFooterDistance + size * (1.2/72) * (str32len (text) / (6.0 * 10))) {
 		Graphics_nextSheetOfPaper (my ps);
 		if (my d_printingPageNumber) my d_printingPageNumber ++;
 		HyperPage_initSheetOfPaper (me);
@@ -225,101 +224,77 @@ if (! my printing) {
 	return 1;
 }
 
-int HyperPage_pageTitle (I, const wchar_t *title) {
-	iam (HyperPage);
+int HyperPage_pageTitle (HyperPage me, const char32 *title) {
 	return HyperPage_any (me, title, my p_font, my p_fontSize * 2, 0,
 		2.0, 0.0, 0.0, my printing ? 0.4/2 : 0.2/2, 0.3/2, HyperPage_ADD_BORDER);
 }
-int HyperPage_intro (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_intro (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 0.03, 0.0, 0.1, 0.1, 0);
 }
-int HyperPage_entry (I, const wchar_t *title) {
-	iam (HyperPage);
+int HyperPage_entry (HyperPage me, const char32 *title) {
 	return HyperPage_any (me, title, my p_font, my p_fontSize * 1.4, Graphics_BOLD, 0.5, 0.0, 0.0, 0.25/1.4, 0.1/1.4, HyperPage_USE_ENTRY_HINT);
 }
-int HyperPage_paragraph (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_paragraph (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 0.03, 0.0, 0.1, 0.1, 0);
 }
-int HyperPage_listItem (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_listItem (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 0.30, 0.2, 0.0, 0.0, 0);
 }
-int HyperPage_listItem1 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_listItem1 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 0.57, 0.2, 0.0, 0.0, 0);
 }
-int HyperPage_listItem2 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_listItem2 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 0.84, 0.2, 0.0, 0.0, 0);
 }
-int HyperPage_listItem3 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_listItem3 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 1.11, 0.2, 0.0, 0.0, 0);
 }
-int HyperPage_listTag (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_listTag (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.2, 0.03, 0.0, 0.1, 0.03, 0);
 }
-int HyperPage_listTag1 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_listTag1 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.2, 0.50, 0.0, 0.05, 0.03, 0);
 }
-int HyperPage_listTag2 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_listTag2 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.2, 0.97, 0.0, 0.03, 0.03, 0);
 }
-int HyperPage_listTag3 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_listTag3 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.2, 1.44, 0.0, 0.03, 0.03, 0);
 }
-int HyperPage_definition (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_definition (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 0.5, 0.0, 0.03, 0.1, 0);
 }
-int HyperPage_definition1 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_definition1 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 0.97, 0.0, 0.03, 0.05, 0);
 }
-int HyperPage_definition2 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_definition2 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 1.44, 0.0, 0.03, 0.03, 0);
 }
-int HyperPage_definition3 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_definition3 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 1.93, 0.0, 0.03, 0.03, 0);
 }
-int HyperPage_code (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_code (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, kGraphics_font_COURIER, my p_fontSize * 0.86, 0, 0.0, 0.3, 0.5, 0.0, 0.0, 0);
 }
-int HyperPage_code1 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_code1 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, kGraphics_font_COURIER, my p_fontSize * 0.86, 0, 0.0, 0.6, 0.5, 0.0, 0.0, 0);
 }
-int HyperPage_code2 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_code2 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, kGraphics_font_COURIER, my p_fontSize * 0.86, 0, 0.0, 0.9, 0.5, 0.0, 0.0, 0);
 }
-int HyperPage_code3 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_code3 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, kGraphics_font_COURIER, my p_fontSize * 0.86, 0, 0.0, 1.2, 0.5, 0.0, 0.0, 0);
 }
-int HyperPage_code4 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_code4 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, kGraphics_font_COURIER, my p_fontSize * 0.86, 0, 0.0, 1.5, 0.5, 0.0, 0.0, 0);
 }
-int HyperPage_code5 (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_code5 (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, kGraphics_font_COURIER, my p_fontSize * 0.86, 0, 0.0, 1.8, 0.5, 0.0, 0.0, 0);
 }
-int HyperPage_prototype (I, const wchar_t *text) {
-	iam (HyperPage);
+int HyperPage_prototype (HyperPage me, const char32 *text) {
 	return HyperPage_any (me, text, my p_font, my p_fontSize, 0, 0.0, 0.03, 0.5, 0.0, 0.0, 0);
 }
-int HyperPage_formula (I, const wchar_t *formula) {
-	iam (HyperPage);
+int HyperPage_formula (HyperPage me, const char32 *formula) {
 	double topSpacing = 0.2, bottomSpacing = 0.2, minFooterDistance = 0.0;
 	kGraphics_font font = my p_font;
 	int size = my p_fontSize;
@@ -359,8 +334,7 @@ if (! my printing) {
 	return 1;
 }
 
-int HyperPage_picture (I, double width_inches, double height_inches, void (*draw) (Graphics g)) {
-	iam (HyperPage);
+int HyperPage_picture (HyperPage me, double width_inches, double height_inches, void (*draw) (Graphics g)) {
 	double topSpacing = 0.1, bottomSpacing = 0.1, minFooterDistance = 0.0;
 	kGraphics_font font = my p_font;
 	int size = my p_fontSize;
@@ -410,10 +384,9 @@ if (! my printing) {
 	return 1;
 }
 
-int HyperPage_script (I, double width_inches, double height_inches, const wchar_t *script) {
-	iam (HyperPage);
-	wchar_t *text = Melder_wcsdup_f (script);
-	Interpreter interpreter = Interpreter_createFromEnvironment (NULL);
+int HyperPage_script (HyperPage me, double width_inches, double height_inches, const char32 *script) {
+	char32 *text = Melder_dup (script);
+	Interpreter interpreter = Interpreter_createFromEnvironment (nullptr);
 	double topSpacing = 0.1, bottomSpacing = 0.1, minFooterDistance = 0.0;
 	kGraphics_font font = my p_font;
 	int size = my p_fontSize;
@@ -435,9 +408,9 @@ if (! my printing) {
 		double x1NDCold, x2NDCold, y1NDCold, y2NDCold;
 		Graphics_inqWsWindow (my g, & x1NDCold, & x2NDCold, & y1NDCold, & y2NDCold);
 		{
-			if (my praatApplication == NULL) my praatApplication = Melder_calloc_f (structPraatApplication, 1);
-			if (my praatObjects == NULL) my praatObjects = Melder_calloc_f (structPraatObjects, 1);
-			if (my praatPicture == NULL) my praatPicture = Melder_calloc_f (structPraatPicture, 1);
+			if (! my praatApplication) my praatApplication = Melder_calloc_f (structPraatApplication, 1);
+			if (! my praatObjects) my praatObjects = Melder_calloc_f (structPraatObjects, 1);
+			if (! my praatPicture) my praatPicture = Melder_calloc_f (structPraatPicture, 1);
 			theCurrentPraatApplication = (PraatApplication) my praatApplication;
 			theCurrentPraatApplication -> batch = true;   // prevent creation of editor windows
 			theCurrentPraatApplication -> topShell = theForegroundPraatApplication. topShell;   // needed for UiForm_create () in dialogs
@@ -482,7 +455,7 @@ if (! my printing) {
 					if (my scriptErrorHasBeenNotified) {
 						Melder_clearError ();
 					} else {
-						Melder_flushError (NULL);
+						Melder_flushError ();
 						my scriptErrorHasBeenNotified = true;
 					}
 				}
@@ -532,9 +505,9 @@ if (! my printing) {
 	double x1NDCold, x2NDCold, y1NDCold, y2NDCold;
 	Graphics_inqWsWindow (my ps, & x1NDCold, & x2NDCold, & y1NDCold, & y2NDCold);
 	{
-		if (my praatApplication == NULL) my praatApplication = Melder_calloc_f (structPraatApplication, 1);
-		if (my praatObjects == NULL) my praatObjects = Melder_calloc_f (structPraatObjects, 1);
-		if (my praatPicture == NULL) my praatPicture = Melder_calloc_f (structPraatPicture, 1);
+		if (! my praatApplication) my praatApplication = Melder_calloc_f (structPraatApplication, 1);
+		if (! my praatObjects) my praatObjects = Melder_calloc_f (structPraatObjects, 1);
+		if (! my praatPicture) my praatPicture = Melder_calloc_f (structPraatPicture, 1);
 		theCurrentPraatApplication = (PraatApplication) my praatApplication;
 		theCurrentPraatApplication -> batch = true;
 		theCurrentPraatApplication -> topShell = theForegroundPraatApplication. topShell;   // needed for UiForm_create () in dialogs
@@ -607,12 +580,12 @@ if (! my printing) {
 static void print (I, Graphics graphics) {
 	iam (HyperPage);
 	my ps = graphics;
-	Graphics_setDollarSignIsCode (graphics, TRUE);
-	Graphics_setAtSignIsLink (graphics, TRUE);
-	my printing = TRUE;
+	Graphics_setDollarSignIsCode (graphics, true);
+	Graphics_setAtSignIsLink (graphics, true);
+	my printing = true;
 	HyperPage_initSheetOfPaper (me);
 	my v_draw ();
-	my printing = FALSE;
+	my printing = false;
 }
 
 /********** class HyperPage **********/
@@ -623,7 +596,7 @@ void structHyperPage :: v_destroy () {
 	forget (our g);
 	for (int i = 0; i < 20; i ++) Melder_free (our history [i]. page);
 	Melder_free (our currentPageTitle);
-	if (praatApplication != NULL) {
+	if (our praatApplication) {
 		for (int iobject = ((PraatObjects) our praatObjects) -> n; iobject >= 1; iobject --) {
 			Melder_free (((PraatObjects) our praatObjects) -> list [iobject]. name);
 			forget (((PraatObjects) our praatObjects) -> list [iobject]. object);
@@ -638,14 +611,14 @@ void structHyperPage :: v_destroy () {
 static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
 	iam (HyperPage);
 	(void) event;
-	if (my g == NULL) return;   // Could be the case in the very beginning.
+	if (! my g) return;   // could be the case in the very beginning
 	Graphics_clearWs (my g);
 	initScreen (me);
-	trace ("going to draw");
+	trace (U"going to draw");
 	my v_draw ();
-	if (my entryHint && my entryPosition) {
+	if (my entryHint && my entryPosition != 0.0) {
 		Melder_free (my entryHint);
-		my top = 5.0 * (PAGE_HEIGHT - my entryPosition);
+		my top = (int) floor (5.0 * (PAGE_HEIGHT - my entryPosition));
 		if (my top < 0) my top = 0;
 		Graphics_clearWs (my g);
 		initScreen (me);
@@ -656,18 +629,18 @@ static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
 
 static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 	iam (HyperPage);
-	if (my g == NULL) return;   // Could be the case in the very beginning.
+	if (! my g) return;   // could be the case in the very beginning
 	if (! my links) return;
 	for (long ilink = 1; ilink <= my links -> size; ilink ++) {
 		HyperLink link = (HyperLink) my links -> item [ilink];		
-		if (link == NULL)
-			Melder_fatal ("gui_drawingarea_cb_click: empty link %ld/%ld.", ilink, my links -> size);
+		if (! link)
+			Melder_fatal (U"gui_drawingarea_cb_click: empty link ", ilink, U"/", my links -> size, U".");
 		if (event -> y > link -> y2DC && event -> y < link -> y1DC && event -> x > link -> x1DC && event -> x < link -> x2DC) {
 			saveHistory (me, my currentPageTitle);
 			try {
 				HyperPage_goToPage (me, link -> name);
 			} catch (MelderError) {
-				Melder_flushError (NULL);
+				Melder_flushError ();
 			}
 			return;
 		}
@@ -688,54 +661,54 @@ static void menu_cb_pageSetup (EDITOR_ARGS) {
 
 static void menu_cb_print (EDITOR_ARGS) {
 	EDITOR_IAM (HyperPage);
-	EDITOR_FORM (L"Print", 0)
-		SENTENCE (L"Left or inside header", L"")
-		SENTENCE (L"Middle header", L"")
-		LABEL (L"", L"Right or outside header:")
-		TEXTFIELD (L"Right or outside header", L"")
-		SENTENCE (L"Left or inside footer", L"")
-		SENTENCE (L"Middle footer", L"")
-		SENTENCE (L"Right or outside footer", L"")
-		BOOLEAN (L"Mirror even/odd headers", TRUE)
-		INTEGER (L"First page number", L"0 (= no page numbers)")
+	EDITOR_FORM (U"Print", 0)
+		SENTENCE (U"Left or inside header", U"")
+		SENTENCE (U"Middle header", U"")
+		LABEL (U"", U"Right or outside header:")
+		TEXTFIELD (U"Right or outside header", U"")
+		SENTENCE (U"Left or inside footer", U"")
+		SENTENCE (U"Middle footer", U"")
+		SENTENCE (U"Right or outside footer", U"")
+		BOOLEAN (U"Mirror even/odd headers", true)
+		INTEGER (U"First page number", U"0 (= no page numbers)")
 	EDITOR_OK
 		my v_defaultHeaders (cmd);
-		if (my d_printingPageNumber) SET_INTEGER (L"First page number", my d_printingPageNumber + 1)
+		if (my d_printingPageNumber) SET_INTEGER (U"First page number", my d_printingPageNumber + 1)
 	EDITOR_DO
-		my insideHeader = GET_STRING (L"Left or inside header");
-		my middleHeader = GET_STRING (L"Middle header");
-		my outsideHeader = GET_STRING (L"Right or outside header");
-		my insideFooter = GET_STRING (L"Left or inside footer");
-		my middleFooter = GET_STRING (L"Middle footer");
-		my outsideFooter = GET_STRING (L"Right or outside footer");
-		my mirror = GET_INTEGER (L"Mirror even/odd headers");
-		my d_printingPageNumber = GET_INTEGER (L"First page number");
+		my insideHeader = GET_STRING (U"Left or inside header");
+		my middleHeader = GET_STRING (U"Middle header");
+		my outsideHeader = GET_STRING (U"Right or outside header");
+		my insideFooter = GET_STRING (U"Left or inside footer");
+		my middleFooter = GET_STRING (U"Middle footer");
+		my outsideFooter = GET_STRING (U"Right or outside footer");
+		my mirror = GET_INTEGER (U"Mirror even/odd headers");
+		my d_printingPageNumber = GET_INTEGER (U"First page number");
 		Printer_print (print, me);
 	EDITOR_END
 }
 
 static void menu_cb_font (EDITOR_ARGS) {
 	EDITOR_IAM (HyperPage);
-	EDITOR_FORM (L"Font", 0)
-		RADIO (L"Font", 1)
-			RADIOBUTTON (L"Times")
-			RADIOBUTTON (L"Helvetica")
+	EDITOR_FORM (U"Font", 0)
+		RADIO (U"Font", 1)
+			RADIOBUTTON (U"Times")
+			RADIOBUTTON (U"Helvetica")
 	EDITOR_OK
-		SET_INTEGER (L"Font", my p_font == kGraphics_font_TIMES ? 1 :
+		SET_INTEGER (U"Font", my p_font == kGraphics_font_TIMES ? 1 :
 				my p_font == kGraphics_font_HELVETICA ? 2 : my p_font == kGraphics_font_PALATINO ? 3 : 1);
 	EDITOR_DO
-		int font = GET_INTEGER (L"Font");
+		int font = GET_INTEGER (U"Font");
 		my pref_font () = my p_font = font == 1 ? kGraphics_font_TIMES : kGraphics_font_HELVETICA;
 		if (my g) Graphics_updateWs (my g);
 	EDITOR_END
 }
 
 static void updateSizeMenu (HyperPage me) {
-	my fontSizeButton_10 -> f_check (my p_fontSize == 10);
-	my fontSizeButton_12 -> f_check (my p_fontSize == 12);
-	my fontSizeButton_14 -> f_check (my p_fontSize == 14);
-	my fontSizeButton_18 -> f_check (my p_fontSize == 18);
-	my fontSizeButton_24 -> f_check (my p_fontSize == 24);
+	GuiMenuItem_check (my fontSizeButton_10, my p_fontSize == 10);
+	GuiMenuItem_check (my fontSizeButton_12, my p_fontSize == 12);
+	GuiMenuItem_check (my fontSizeButton_14, my p_fontSize == 14);
+	GuiMenuItem_check (my fontSizeButton_18, my p_fontSize == 18);
+	GuiMenuItem_check (my fontSizeButton_24, my p_fontSize == 24);
 }
 static void setFontSize (HyperPage me, int fontSize) {
 	my pref_fontSize () = my p_fontSize = fontSize;
@@ -751,22 +724,22 @@ static void menu_cb_24 (EDITOR_ARGS) { EDITOR_IAM (HyperPage); setFontSize (me,
 
 static void menu_cb_fontSize (EDITOR_ARGS) {
 	EDITOR_IAM (HyperPage);
-	EDITOR_FORM (L"Font size", 0)
-		NATURAL (L"Font size (points)", my default_fontSize ())
+	EDITOR_FORM (U"Font size", 0)
+		NATURAL (U"Font size (points)", my default_fontSize ())
 	EDITOR_OK
-		SET_INTEGER (L"Font size", my p_fontSize)
+		SET_INTEGER (U"Font size", my p_fontSize)
 	EDITOR_DO
-		setFontSize (me, GET_INTEGER (L"Font size"));
+		setFontSize (me, GET_INTEGER (U"Font size"));
 	EDITOR_END
 }
 
 static void menu_cb_searchForPage (EDITOR_ARGS) {
 	EDITOR_IAM (HyperPage);
-	EDITOR_FORM (L"Search for page", 0)
-		TEXTFIELD (L"Page", L"a")
+	EDITOR_FORM (U"Search for page", 0)
+		TEXTFIELD (U"Page", U"a")
 	EDITOR_OK
 	EDITOR_DO
-		HyperPage_goToPage (me, GET_STRING (L"Page"));   // BUG
+		HyperPage_goToPage (me, GET_STRING (U"Page"));   // BUG
 	EDITOR_END
 }
 
@@ -786,10 +759,10 @@ static void menu_cb_searchForPage (EDITOR_ARGS) {
 
 static void gui_cb_verticalScroll (I, GuiScrollBarEvent	event) {
 	iam (HyperPage);
-	double value = event -> scrollBar -> f_getValue ();
+	double value = GuiScrollBar_getValue (event -> scrollBar);
 	if (value != my top) {
-		trace ("scroll from %f to %f", (double) my top, value);
-		my top = value;
+		trace (U"scroll from ", my top, U" to ", value);
+		my top = (int) floor (value);
 		#if cocoa || gtk || win
 			Graphics_updateWs (my g);   // wait for expose event
 		#else
@@ -815,14 +788,14 @@ static void updateVerticalScrollBar (HyperPage me)
 /* This has to be called after changing 'my topParagraph'. */
 {
 	int sliderSize = 25;
-	my verticalScrollBar -> f_set (NUMundefined, NUMundefined, my top, sliderSize, 1, sliderSize - 1);
+	GuiScrollBar_set (my verticalScrollBar, NUMundefined, NUMundefined, my top, sliderSize, 1, sliderSize - 1);
 	my history [my historyPointer]. top = 0/*my top*/;
 }
 
 static void menu_cb_pageUp (EDITOR_ARGS) {
 	EDITOR_IAM (HyperPage);
 	if (! my verticalScrollBar) return;
-	int value = my verticalScrollBar -> f_getValue () - 24;
+	int value = GuiScrollBar_getValue (my verticalScrollBar) - 24;
 	if (value < 0) value = 0;
 	if (value != my top) {
 		my top = value;
@@ -836,7 +809,7 @@ static void menu_cb_pageUp (EDITOR_ARGS) {
 static void menu_cb_pageDown (EDITOR_ARGS) {
 	EDITOR_IAM (HyperPage);
 	if (! my verticalScrollBar) return;
-	int value = my verticalScrollBar -> f_getValue () + 24;
+	int value = GuiScrollBar_getValue (my verticalScrollBar) + 24;
 	if (value > (int) (PAGE_HEIGHT * 5) - 25) value = (int) (PAGE_HEIGHT * 5) - 25;
 	if (value != my top) {
 		my top = value;
@@ -851,7 +824,7 @@ static void menu_cb_pageDown (EDITOR_ARGS) {
 
 static void do_back (HyperPage me) {
 	if (my historyPointer <= 0) return;
-	autostring page = Melder_wcsdup_f (my history [-- my historyPointer]. page);   // temporary, because pointer will be moved
+	autostring32 page = Melder_dup_f (my history [-- my historyPointer]. page);   // temporary, because pointer will be moved
 	int top = my history [my historyPointer]. top;
 	if (my v_goToPage (page.peek())) {
 		my top = top;
@@ -873,7 +846,7 @@ static void gui_button_cb_back (I, GuiButtonEvent event) {
 
 static void do_forth (HyperPage me) {
 	if (my historyPointer >= 19 || ! my history [my historyPointer + 1]. page) return;
-	autostring page = Melder_wcsdup_f (my history [++ my historyPointer]. page);
+	autostring32 page = Melder_dup_f (my history [++ my historyPointer]. page);
 	int top = my history [my historyPointer]. top;
 	if (my v_goToPage (page.peek())) {
 		my top = top;
@@ -896,39 +869,39 @@ static void gui_button_cb_forth (I, GuiButtonEvent event) {
 void structHyperPage :: v_createMenus () {
 	HyperPage_Parent :: v_createMenus ();
 
-	Editor_addCommand (this, L"File", L"PostScript settings...", 0, menu_cb_postScriptSettings);
+	Editor_addCommand (this, U"File", U"PostScript settings...", 0, menu_cb_postScriptSettings);
 	#ifdef macintosh
-		Editor_addCommand (this, L"File", L"Page setup...", 0, menu_cb_pageSetup);
+		Editor_addCommand (this, U"File", U"Page setup...", 0, menu_cb_pageSetup);
 	#endif
-	Editor_addCommand (this, L"File", L"Print page...", 'P', menu_cb_print);
-	Editor_addCommand (this, L"File", L"-- close --", 0, NULL);
+	Editor_addCommand (this, U"File", U"Print page...", 'P', menu_cb_print);
+	Editor_addCommand (this, U"File", U"-- close --", 0, nullptr);
 
 	if (our v_hasHistory ()) {
-		Editor_addMenu (this, L"Go to", 0);
-		Editor_addCommand (this, L"Go to", L"Search for page...", 0, menu_cb_searchForPage);
-		Editor_addCommand (this, L"Go to", L"Back", GuiMenu_OPTION | GuiMenu_LEFT_ARROW, menu_cb_back);
-		Editor_addCommand (this, L"Go to", L"Forward", GuiMenu_OPTION | GuiMenu_RIGHT_ARROW, menu_cb_forth);
-		Editor_addCommand (this, L"Go to", L"-- page --", 0, NULL);
-		Editor_addCommand (this, L"Go to", L"Page up", GuiMenu_PAGE_UP, menu_cb_pageUp);
-		Editor_addCommand (this, L"Go to", L"Page down", GuiMenu_PAGE_DOWN, menu_cb_pageDown);
+		Editor_addMenu (this, U"Go to", 0);
+		Editor_addCommand (this, U"Go to", U"Search for page...", 0, menu_cb_searchForPage);
+		Editor_addCommand (this, U"Go to", U"Back", GuiMenu_OPTION | GuiMenu_LEFT_ARROW, menu_cb_back);
+		Editor_addCommand (this, U"Go to", U"Forward", GuiMenu_OPTION | GuiMenu_RIGHT_ARROW, menu_cb_forth);
+		Editor_addCommand (this, U"Go to", U"-- page --", 0, nullptr);
+		Editor_addCommand (this, U"Go to", U"Page up", GuiMenu_PAGE_UP, menu_cb_pageUp);
+		Editor_addCommand (this, U"Go to", U"Page down", GuiMenu_PAGE_DOWN, menu_cb_pageDown);
 	}
 
-	Editor_addMenu (this, L"Font", 0);
-	Editor_addCommand (this, L"Font", L"Font size...", 0, menu_cb_fontSize);
-	fontSizeButton_10 = Editor_addCommand (this, L"Font", L"10", GuiMenu_CHECKBUTTON, menu_cb_10);
-	fontSizeButton_12 = Editor_addCommand (this, L"Font", L"12", GuiMenu_CHECKBUTTON, menu_cb_12);
-	fontSizeButton_14 = Editor_addCommand (this, L"Font", L"14", GuiMenu_CHECKBUTTON, menu_cb_14);
-	fontSizeButton_18 = Editor_addCommand (this, L"Font", L"18", GuiMenu_CHECKBUTTON, menu_cb_18);
-	fontSizeButton_24 = Editor_addCommand (this, L"Font", L"24", GuiMenu_CHECKBUTTON, menu_cb_24);
-	Editor_addCommand (this, L"Font", L"-- font --", 0, NULL);
-	Editor_addCommand (this, L"Font", L"Font...", 0, menu_cb_font);
+	Editor_addMenu (this, U"Font", 0);
+	Editor_addCommand (this, U"Font", U"Font size...", 0, menu_cb_fontSize);
+	fontSizeButton_10 = Editor_addCommand (this, U"Font", U"10", GuiMenu_CHECKBUTTON, menu_cb_10);
+	fontSizeButton_12 = Editor_addCommand (this, U"Font", U"12", GuiMenu_CHECKBUTTON, menu_cb_12);
+	fontSizeButton_14 = Editor_addCommand (this, U"Font", U"14", GuiMenu_CHECKBUTTON, menu_cb_14);
+	fontSizeButton_18 = Editor_addCommand (this, U"Font", U"18", GuiMenu_CHECKBUTTON, menu_cb_18);
+	fontSizeButton_24 = Editor_addCommand (this, U"Font", U"24", GuiMenu_CHECKBUTTON, menu_cb_24);
+	Editor_addCommand (this, U"Font", U"-- font --", 0, nullptr);
+	Editor_addCommand (this, U"Font", U"Font...", 0, menu_cb_font);
 }
 
 /********** **********/
 
 static void gui_drawingarea_cb_resize (I, GuiDrawingAreaResizeEvent event) {
 	iam (HyperPage);
-	if (my g == NULL) return;
+	if (! my g) return;
 	Graphics_setWsViewport (my g, 0, event -> width, 0, event -> height);
 	Graphics_setWsWindow (my g, 0.0, my rightMargin = event -> width / resolution,
 		PAGE_HEIGHT - event -> height / resolution, PAGE_HEIGHT);
@@ -958,15 +931,15 @@ void structHyperPage :: v_createChildren () {
 
 	if (our v_hasHistory ()) {
 		GuiButton_createShown (our d_windowForm, 4, 48, y, y + height,
-			L"<", gui_button_cb_back, this, 0);
+			U"<", gui_button_cb_back, this, 0);
 		GuiButton_createShown (our d_windowForm, 54, 98, y, y + height,
-			L">", gui_button_cb_forth, this, 0);
+			U">", gui_button_cb_forth, this, 0);
 	}
 	if (our v_isOrdered ()) {
 		GuiButton_createShown (our d_windowForm, 174, 218, y, y + height,
-			L"< 1", gui_button_cb_previousPage, this, 0);
+			U"< 1", gui_button_cb_previousPage, this, 0);
 		GuiButton_createShown (our d_windowForm, 224, 268, y, y + height,
-			L"1 >", gui_button_cb_nextPage, this, 0);
+			U"1 >", gui_button_cb_nextPage, this, 0);
 	}
 
 	/***** Create scroll bar. *****/
@@ -978,27 +951,27 @@ void structHyperPage :: v_createChildren () {
 	drawingArea = GuiDrawingArea_createShown (our d_windowForm,
 		0, - Machine_getScrollBarWidth (),
 		y + ( our d_hasExtraRowOfTools ? 2 * height + 16 : height + 9 ), - Machine_getScrollBarWidth (),
-		gui_drawingarea_cb_expose, gui_drawingarea_cb_click, NULL, gui_drawingarea_cb_resize, this, GuiDrawingArea_BORDER);
-	drawingArea -> f_setSwipable (NULL, our verticalScrollBar);
+		gui_drawingarea_cb_expose, gui_drawingarea_cb_click, nullptr, gui_drawingarea_cb_resize, this, GuiDrawingArea_BORDER);
+	GuiDrawingArea_setSwipable (drawingArea, nullptr, our verticalScrollBar);
 }
 
-void HyperPage_init (HyperPage me, const wchar_t *title, Data data) {
-	resolution = Gui_getResolution (NULL);
-	Editor_init (me, 0, 0, 6 * resolution + 30, 800, title, data);
+void HyperPage_init (HyperPage me, const char32 *title, Daata data) {
+	resolution = Gui_getResolution (nullptr);
+	Editor_init (me, 0, 0, (int) floor (6 * resolution + 30), 800, title, data);
 	#if motif
 		Melder_assert (XtWindow (my drawingArea -> d_widget));
 	#endif
 	my g = Graphics_create_xmdrawingarea (my drawingArea);
-	Graphics_setAtSignIsLink (my g, TRUE);
-	Graphics_setDollarSignIsCode (my g, TRUE);
+	Graphics_setAtSignIsLink (my g, true);
+	Graphics_setDollarSignIsCode (my g, true);
 	Graphics_setFont (my g, kGraphics_font_TIMES);
 	if (my p_font != kGraphics_font_TIMES && my p_font != kGraphics_font_HELVETICA)
 		my pref_font () = my p_font = kGraphics_font_TIMES;   // ensure Unicode compatibility
 	setFontSize (me, my p_fontSize);
 
 struct structGuiDrawingAreaResizeEvent event = { my drawingArea, 0 };
-event. width  = my drawingArea -> f_getWidth  ();
-event. height = my drawingArea -> f_getHeight ();
+event. width  = GuiControl_getWidth  (my drawingArea);
+event. height = GuiControl_getHeight (my drawingArea);
 gui_drawingarea_cb_resize (me, & event);
 
 	updateVerticalScrollBar (me);   // scroll to the top (my top == 0)
@@ -1012,38 +985,35 @@ void HyperPage_clear (HyperPage me) {
 void structHyperPage :: v_dataChanged () {
 	int oldError = Melder_hasError ();   // this method can be called during error time
 	(void) our v_goToPage (our currentPageTitle);
-	if (Melder_hasError () && ! oldError) Melder_flushError (NULL);
+	if (Melder_hasError () && ! oldError) Melder_flushError ();
 	HyperPage_clear (this);
 	updateVerticalScrollBar (this);
 }
 
-int HyperPage_goToPage (I, const wchar_t *title) {
-	iam (HyperPage);
+int HyperPage_goToPage (HyperPage me, const char32 *title) {
 	switch (my v_goToPage (title)) {
 		case -1: return 0;
 		case 0: HyperPage_clear (me); return 0;
 	}
-	saveHistory (me, title);   /* Last chance: HyperPage_clear will destroy "title" !!! */
+	saveHistory (me, title);   // last chance: HyperPage_clear will destroy "title" !!!
 	Melder_free (my currentPageTitle);
-	my currentPageTitle = Melder_wcsdup_f (title);
+	my currentPageTitle = Melder_dup_f (title);
 	my top = 0;
 	HyperPage_clear (me);
-	updateVerticalScrollBar (me);   /* Scroll to the top (my top == 0). */
+	updateVerticalScrollBar (me);   // scroll to the top (my top == 0)
 	return 1;	
 }
 
-void HyperPage_goToPage_i (I, long i) {
-	iam (HyperPage);
+void HyperPage_goToPage_i (HyperPage me, long i) {
 	my v_goToPage_i (i);   // catch -> HyperPage_clear (me); ?
 	my top = 0;
 	HyperPage_clear (me);
-	updateVerticalScrollBar (me);   /* Scroll to the top (my top == 0). */
+	updateVerticalScrollBar (me);   // scroll to the top (my top == 0)
 }
 
-void HyperPage_setEntryHint (I, const wchar_t *hint) {
-	iam (HyperPage);
+void HyperPage_setEntryHint (HyperPage me, const char32 *hint) {
 	Melder_free (my entryHint);
-	my entryHint = Melder_wcsdup_f (hint);
+	my entryHint = Melder_dup_f (hint);
 }
 
 /* End of file HyperPage.cpp */
diff --git a/sys/HyperPage.h b/sys/HyperPage.h
index 9ae1ce1..12ce78a 100644
--- a/sys/HyperPage.h
+++ b/sys/HyperPage.h
@@ -2,7 +2,7 @@
 #define _HyperPage_h_
 /* HyperPage.h
  *
- * Copyright (C) 1992-2011,2012,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,54 +23,54 @@
 #include "Collection.h"
 #include "Graphics.h"
 
-Thing_define (HyperLink, Data) {
-	// new data:
-	public:
-		double x1DC, x2DC, y1DC, y2DC;
+Thing_define (HyperLink, Daata) {
+	double x1DC, x2DC, y1DC, y2DC;
 };
 
-HyperLink HyperLink_create (const wchar_t *name, double x1, double x2, double y1, double y2);
+HyperLink HyperLink_create (const char32 *name, double x1, double x2, double y1, double y2);
 
 Thing_define (HyperPage, Editor) {
-	// data:
-	public:
-		GuiDrawingArea drawingArea;
-		GuiScrollBar verticalScrollBar;
-		bool d_hasExtraRowOfTools;
-		Graphics g, ps;
-		double d_x, d_y, rightMargin, previousBottomSpacing;
-		long d_printingPageNumber;
-		Collection links;
-		int printing, top, mirror;
-		wchar_t *insideHeader, *middleHeader, *outsideHeader;
-		wchar_t *insideFooter, *middleFooter, *outsideFooter;
-		wchar_t *entryHint; double entryPosition;
-		struct { wchar_t *page; int top; } history [20];
-		int historyPointer;
-		wchar_t *currentPageTitle;
-		GuiMenuItem fontSizeButton_10, fontSizeButton_12, fontSizeButton_14, fontSizeButton_18, fontSizeButton_24;
-		void *praatApplication, *praatObjects, *praatPicture;
-		bool scriptErrorHasBeenNotified;
-		structMelderDir rootDirectory;
-	// overridden methods:
-	protected:
-		virtual void v_destroy ();
-		virtual bool v_editable () { return false; }
-		virtual void v_createMenus ();
-		virtual void v_createChildren ();
-		virtual void v_dataChanged ();
-	// new methods:
-	public:
-		virtual void v_draw () { }
-		virtual long v_getNumberOfPages () { return 0; }
-		virtual long v_getCurrentPageNumber () { return 0; }
-		virtual int v_goToPage (const wchar_t *title) { (void) title; return 0; }
-		virtual void v_goToPage_i (long pageNumber) { (void) pageNumber; }
-		virtual void v_defaultHeaders (EditorCommand cmd) { (void) cmd; }
-		virtual bool v_hasHistory () { return false; }
-		virtual bool v_isOrdered () { return false; }
-	// preferences:
-		#include "HyperPage_prefs.h"
+	GuiDrawingArea drawingArea;
+	GuiScrollBar verticalScrollBar;
+	bool d_hasExtraRowOfTools;
+	Graphics g, ps;
+	double d_x, d_y, rightMargin, previousBottomSpacing;
+	long d_printingPageNumber;
+	Collection links;
+	bool printing;
+	int top, mirror;
+	char32 *insideHeader, *middleHeader, *outsideHeader;
+	char32 *insideFooter, *middleFooter, *outsideFooter;
+	char32 *entryHint; double entryPosition;
+	struct { char32 *page; int top; } history [20];
+	int historyPointer;
+	char32 *currentPageTitle;
+	GuiMenuItem fontSizeButton_10, fontSizeButton_12, fontSizeButton_14, fontSizeButton_18, fontSizeButton_24;
+	void *praatApplication, *praatObjects, *praatPicture;
+	bool scriptErrorHasBeenNotified;
+	structMelderDir rootDirectory;
+
+	void v_destroy ()
+		override;
+	bool v_editable ()
+		override { return false; }
+	void v_createMenus ()
+		override;
+	void v_createChildren ()
+		override;
+	void v_dataChanged ()
+		override;
+
+	virtual void v_draw () { }
+	virtual long v_getNumberOfPages () { return 0; }
+	virtual long v_getCurrentPageNumber () { return 0; }
+	virtual int v_goToPage (const char32 * /* title */) { return 0; }
+	virtual void v_goToPage_i (long /* pageNumber */) { }
+	virtual void v_defaultHeaders (EditorCommand /* cmd */) { }
+	virtual bool v_hasHistory () { return false; }
+	virtual bool v_isOrdered () { return false; }
+
+	#include "HyperPage_prefs.h"
 };
 
 void HyperPage_clear (HyperPage me);
@@ -79,41 +79,41 @@ void HyperPage_clear (HyperPage me);
 #define HyperPage_ADD_BORDER  1
 #define HyperPage_USE_ENTRY_HINT  2
 
-int HyperPage_any (I, const wchar_t *text, enum kGraphics_font font, int size, int style, double minFooterDistance,
+int HyperPage_any (HyperPage me, const char32 *text, enum kGraphics_font font, int size, int style, double minFooterDistance,
 	double x, double secondIndent, double topSpacing, double bottomSpacing, unsigned long method);
-int HyperPage_pageTitle (I, const wchar_t *title);
-int HyperPage_intro (I, const wchar_t *text);
-int HyperPage_entry (I, const wchar_t *title);
-int HyperPage_paragraph (I, const wchar_t *text);
-int HyperPage_listItem (I, const wchar_t *text);
-int HyperPage_listItem1 (I, const wchar_t *text);
-int HyperPage_listItem2 (I, const wchar_t *text);
-int HyperPage_listItem3 (I, const wchar_t *text);
-int HyperPage_listTag (I, const wchar_t *text);
-int HyperPage_listTag1 (I, const wchar_t *text);
-int HyperPage_listTag2 (I, const wchar_t *text);
-int HyperPage_listTag3 (I, const wchar_t *text);
-int HyperPage_definition (I, const wchar_t *text);
-int HyperPage_definition1 (I, const wchar_t *text);
-int HyperPage_definition2 (I, const wchar_t *text);
-int HyperPage_definition3 (I, const wchar_t *text);
-int HyperPage_code (I, const wchar_t *text);
-int HyperPage_code1 (I, const wchar_t *text);
-int HyperPage_code2 (I, const wchar_t *text);
-int HyperPage_code3 (I, const wchar_t *text);
-int HyperPage_code4 (I, const wchar_t *text);
-int HyperPage_code5 (I, const wchar_t *text);
-int HyperPage_prototype (I, const wchar_t *text);
-int HyperPage_formula (I, const wchar_t *formula);
-int HyperPage_picture (I, double width_inches, double height_inches, void (*draw) (Graphics g));
-int HyperPage_script (I, double width_inches, double height_inches, const wchar_t *script);
+int HyperPage_pageTitle (HyperPage me, const char32 *title);
+int HyperPage_intro (HyperPage me, const char32 *text);
+int HyperPage_entry (HyperPage me, const char32 *title);
+int HyperPage_paragraph (HyperPage me, const char32 *text);
+int HyperPage_listItem (HyperPage me, const char32 *text);
+int HyperPage_listItem1 (HyperPage me, const char32 *text);
+int HyperPage_listItem2 (HyperPage me, const char32 *text);
+int HyperPage_listItem3 (HyperPage me, const char32 *text);
+int HyperPage_listTag (HyperPage me, const char32 *text);
+int HyperPage_listTag1 (HyperPage me, const char32 *text);
+int HyperPage_listTag2 (HyperPage me, const char32 *text);
+int HyperPage_listTag3 (HyperPage me, const char32 *text);
+int HyperPage_definition (HyperPage me, const char32 *text);
+int HyperPage_definition1 (HyperPage me, const char32 *text);
+int HyperPage_definition2 (HyperPage me, const char32 *text);
+int HyperPage_definition3 (HyperPage me, const char32 *text);
+int HyperPage_code (HyperPage me, const char32 *text);
+int HyperPage_code1 (HyperPage me, const char32 *text);
+int HyperPage_code2 (HyperPage me, const char32 *text);
+int HyperPage_code3 (HyperPage me, const char32 *text);
+int HyperPage_code4 (HyperPage me, const char32 *text);
+int HyperPage_code5 (HyperPage me, const char32 *text);
+int HyperPage_prototype (HyperPage me, const char32 *text);
+int HyperPage_formula (HyperPage me, const char32 *formula);
+int HyperPage_picture (HyperPage me, double width_inches, double height_inches, void (*draw) (Graphics g));
+int HyperPage_script (HyperPage me, double width_inches, double height_inches, const char32 *script);
 
-int HyperPage_goToPage (I, const wchar_t *title);
-void HyperPage_goToPage_i (I, long i);
+int HyperPage_goToPage (HyperPage me, const char32 *title);
+void HyperPage_goToPage_i (HyperPage me, long i);
 
-void HyperPage_init (HyperPage me, const wchar_t *title, Data data);
+void HyperPage_init (HyperPage me, const char32 *title, Daata data);
 
-void HyperPage_setEntryHint (I, const wchar_t *entry);
+void HyperPage_setEntryHint (HyperPage me, const char32 *entry);
 void HyperPage_initSheetOfPaper (HyperPage me);
 
 /* End of file HyperPage.h */
diff --git a/sys/HyperPage_prefs.h b/sys/HyperPage_prefs.h
index 3b1c4e6..6525640 100644
--- a/sys/HyperPage_prefs.h
+++ b/sys/HyperPage_prefs.h
@@ -1,6 +1,6 @@
 /* HyperPage_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,9 +18,10 @@
  */
 
 prefs_begin (HyperPage)
-	// new:
-		prefs_add_enum_with_data (HyperPage, font,     1, kGraphics_font, DEFAULT)
-		prefs_add_int_with_data  (HyperPage, fontSize, 1, L"12")
+
+	prefs_add_enum_with_data (HyperPage, font,     1, kGraphics_font, DEFAULT)
+	prefs_add_int_with_data  (HyperPage, fontSize, 1, U"12")
+
 prefs_end (HyperPage)
 
 /* End of file HyperPage_prefs.h */
diff --git a/sys/InfoEditor.cpp b/sys/InfoEditor.cpp
index c702efd..2363d85 100644
--- a/sys/InfoEditor.cpp
+++ b/sys/InfoEditor.cpp
@@ -1,6 +1,6 @@
 /* InfoEditor.cpp
  *
- * Copyright (C) 2004-2011,2012,2013 Paul Boersma
+ * Copyright (C) 2004-2011,2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,7 +24,7 @@ Thing_implement (InfoEditor, TextEditor, 0);
 static InfoEditor theInfoEditor;
 
 void structInfoEditor :: v_destroy () {
-	theInfoEditor = NULL;   // undangle
+	theInfoEditor = nullptr;   // undangle
 	InfoEditor_Parent :: v_destroy ();
 }
 
@@ -32,15 +32,15 @@ void structInfoEditor :: v_clear () {
 	Melder_clearInfo ();
 }
 
-void gui_information (const wchar_t *message);   // BUG
-void gui_information (const wchar_t *message) {
+void gui_information (const char32 *message);   // BUG
+void gui_information (const char32 *message) {
 	if (! theInfoEditor) {
 		theInfoEditor = Thing_new (InfoEditor);
-		theInfoEditor -> structTextEditor :: init (L"");
-		Thing_setName (theInfoEditor, L"Praat Info");
+		TextEditor_init (theInfoEditor, U"");
+		Thing_setName (theInfoEditor, U"Praat Info");
 	}
-	theInfoEditor -> textWidget -> f_setString (message);
-	theInfoEditor -> d_windowForm -> f_show ();
+	GuiText_setString (theInfoEditor -> textWidget, message);
+	GuiThing_show (theInfoEditor -> d_windowForm);
 	/*
 	 * Try to make sure that the invalidated text widget and the elements of the fronted window are redrawn before the next event.
 	 */
@@ -50,7 +50,7 @@ void gui_information (const wchar_t *message) {
 		//[theInfoEditor -> textWidget -> d_cocoaTextView   displayIfNeeded];   // this displays only the text
 		//[theInfoEditor -> textWidget -> d_cocoaTextView   display];
 	#elif defined (macintosh)
-		theInfoEditor -> d_windowForm -> f_drain ();
+		GuiShell_drain (theInfoEditor -> d_windowForm);
 	#endif
 }
 
diff --git a/sys/InfoEditor.h b/sys/InfoEditor.h
index eeba653..ee9278d 100644
--- a/sys/InfoEditor.h
+++ b/sys/InfoEditor.h
@@ -2,7 +2,7 @@
 #define _InfoEditor_h_
 /* InfoEditor.h
  *
- * Copyright (C) 2004-2011 Paul Boersma
+ * Copyright (C) 2004-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,11 +22,14 @@
 #include "TextEditor.h"
 
 Thing_define (InfoEditor, TextEditor) {
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual bool v_scriptable () { return false; }
-		virtual bool v_fileBased () { return false; }
-		virtual void v_clear ();
+	void v_destroy ()
+		override;
+	bool v_scriptable ()
+		override { return false; }
+	bool v_fileBased ()
+		override { return false; }
+	void v_clear ()
+		override;
 };
 
 /* End of file InfoEditor.h */
diff --git a/sys/Interpreter.cpp b/sys/Interpreter.cpp
index ceb3dde..f324a23 100644
--- a/sys/Interpreter.cpp
+++ b/sys/Interpreter.cpp
@@ -1,6 +1,6 @@
 /* Interpreter.cpp
  *
- * Copyright (C) 1993-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1993-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -36,9 +36,9 @@
  * pb 2007/02/05 preferencesDirectory$, homeDirectory$, temporaryDirectory$
  * pb 2007/04/02 allow comments (with '#' or ';' or empty lines) in forms
  * pb 2007/04/19 allow comments with '!' in forms
- * pb 2007/05/24 some wchar_t
- * pb 2007/06/09 wchar_t
- * pb 2007/08/12 more wchar_t
+ * pb 2007/05/24 some wchar
+ * pb 2007/06/09 wchar
+ * pb 2007/08/12 more wchar
  * pb 2007/11/30 removed bug: allowed long arguments to the "call" statement (thanks to Ingmar Steiner)
  * pb 2007/12/10 predefined numeric variables macintosh/windows/unix
  * pb 2008/04/30 new Formula API
@@ -51,6 +51,7 @@
  * pb 2009/12/22 invokingButtonTitle
  * pb 2010/04/30 guard against leading nonbreaking spaces
  * pb 2011/05/14 C++
+ * pb 2015/05/30 char32
  */
 
 #include <ctype.h>
@@ -85,79 +86,94 @@ void structInterpreterVariable :: v_destroy () {
 	InterpreterVariable_Parent :: v_destroy ();
 }
 
-static InterpreterVariable InterpreterVariable_create (const wchar_t *key) {
+static InterpreterVariable InterpreterVariable_create (const char32 *key) {
 	try {
-		if (key [0] == 'e' && key [1] == '\0')
-			Melder_throw ("You cannot use 'e' as the name of a variable (e is the constant 2.71...).");
-		if (key [0] == 'p' && key [1] == 'i' && key [2] == '\0')
-			Melder_throw ("You cannot use 'pi' as the name of a variable (pi is the constant 3.14...).");
-		if (key [0] == 'u' && key [1] == 'n' && key [2] == 'd' && key [3] == 'e' && key [4] == 'f' && key [5] == 'i' &&
-			key [6] == 'n' && key [7] == 'e' && key [8] == 'd' && key [9] == '\0')
-			Melder_throw ("You cannot use 'undefined' as the name of a variable.");
+		if (key [0] == U'e' && key [1] == U'\0')
+			Melder_throw (U"You cannot use 'e' as the name of a variable (e is the constant 2.71...).");
+		if (key [0] == U'p' && key [1] == U'i' && key [2] == U'\0')
+			Melder_throw (U"You cannot use 'pi' as the name of a variable (pi is the constant 3.14...).");
+		if (key [0] == U'u' && key [1] == U'n' && key [2] == U'd' && key [3] == U'e' && key [4] == U'f' && key [5] == U'i' &&
+			key [6] == U'n' && key [7] == U'e' && key [8] == U'd' && key [9] == U'\0')
+			Melder_throw (U"You cannot use 'undefined' as the name of a variable.");
 		autoInterpreterVariable me = Thing_new (InterpreterVariable);
-		my string = Melder_wcsdup (key);
+		my string = Melder_dup (key);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Interpreter variable not created.");
+		Melder_throw (U"Interpreter variable not created.");
 	}
 }
 
 Thing_implement (Interpreter, Thing, 0);
 
 void structInterpreter :: v_destroy () {
-	Melder_free (environmentName);
+	Melder_free (our environmentName);
 	for (int ipar = 1; ipar <= Interpreter_MAXNUM_PARAMETERS; ipar ++)
-		Melder_free (arguments [ipar]);
-	forget (variables);
+		Melder_free (our arguments [ipar]);
+	#if USE_HASH
+	if (our variablesMap) {
+		for (auto it = our variablesMap -> begin(); it != our variablesMap -> end(); it ++) {
+			InterpreterVariable var = it -> second;
+			forget (var);
+		}
+		delete (our variablesMap);
+	}
+	#else
+	forget (our variables);
+	#endif
 	Interpreter_Parent :: v_destroy ();
 }
 
-Interpreter Interpreter_create (wchar_t *environmentName, ClassInfo editorClass) {
+Interpreter Interpreter_create (char32 *environmentName, ClassInfo editorClass) {
 	try {
 		autoInterpreter me = Thing_new (Interpreter);
+		#if USE_HASH
+		my variablesMap = new std::unordered_map <std::u32string, InterpreterVariable>;
+		my variablesMap -> max_load_factor (0.65f);
+		#else
 		my variables = SortedSetOfString_create ();
-		my environmentName = Melder_wcsdup (environmentName);
+		#endif
+		my environmentName = Melder_dup (environmentName);
 		my editorClass = editorClass;
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Interpreter not created.");
+		Melder_throw (U"Interpreter not created.");
 	}
 }
 
 Interpreter Interpreter_createFromEnvironment (Editor editor) {
-	if (editor == NULL) return Interpreter_create (NULL, NULL);
+	if (! editor) return Interpreter_create (nullptr, nullptr);
 	return Interpreter_create (editor -> name, editor -> classInfo);
 }
 
-void Melder_includeIncludeFiles (wchar_t **text) {
+void Melder_includeIncludeFiles (char32 **text) {
 	for (int depth = 0; ; depth ++) {
-		wchar_t *head = *text;
+		char32 *head = *text;
 		long numberOfIncludes = 0;
 		if (depth > 10)
-			Melder_throw ("Include files nested too deep. Probably cyclic.");
+			Melder_throw (U"Include files nested too deep. Probably cyclic.");
 		for (;;) {
-			wchar_t *includeLocation, *includeFileName, *tail, *newText;
+			char32 *includeLocation, *includeFileName, *tail, *newText;
 			long headLength, includeTextLength, newLength;
 			/*
 				Look for an include statement. If not found, we have finished.
 			 */
-			includeLocation = wcsnequ (head, L"include ", 8) ? head : wcsstr (head, L"\ninclude ");
-			if (includeLocation == NULL) break;
+			includeLocation = str32nequ (head, U"include ", 8) ? head : str32str (head, U"\ninclude ");
+			if (! includeLocation) break;
 			if (includeLocation != head) includeLocation += 1;
 			numberOfIncludes += 1;
 			/*
 				Separate out the head.
 			 */
-			*includeLocation = '\0';
+			*includeLocation = U'\0';
 			/*
 				Separate out the name of the include file.
 			 */
 			includeFileName = includeLocation + 8;
-			while (*includeFileName == ' ' || *includeFileName == '\t') includeFileName ++;
+			while (*includeFileName == U' ' || *includeFileName == U'\t') includeFileName ++;
 			tail = includeFileName;
-			while (*tail != '\n' && *tail != '\0') tail ++;
-			if (*tail == '\n') {
-				*tail = '\0';
+			while (*tail != U'\n' && *tail != U'\0') tail ++;
+			if (*tail == U'\n') {
+				*tail = U'\0';
 				tail += 1;
 			}
 			/*
@@ -165,23 +181,23 @@ void Melder_includeIncludeFiles (wchar_t **text) {
 			 */
 			structMelderFile includeFile = { 0 };
 			Melder_relativePathToFile (includeFileName, & includeFile);
-			autostring includeText;
+			autostring32 includeText;
 			try {
 				includeText.reset (MelderFile_readText (& includeFile));
 			} catch (MelderError) {
-				Melder_throw ("Include file ", & includeFile, " not read.");
+				Melder_throw (U"Include file ", & includeFile, U" not read.");
 			}
 			/*
 				Construct the new text.
 			 */
-			headLength = (head - *text) + wcslen (head);
-			includeTextLength = wcslen (includeText.peek());
-			newLength = headLength + includeTextLength + 1 + wcslen (tail);
-			newText = Melder_malloc (wchar_t, newLength + 1);
-			wcscpy (newText, *text);
-			wcscpy (newText + headLength, includeText.peek());
-			wcscpy (newText + headLength + includeTextLength, L"\n");
-			wcscpy (newText + headLength + includeTextLength + 1, tail);
+			headLength = (head - *text) + str32len (head);
+			includeTextLength = str32len (includeText.peek());
+			newLength = headLength + includeTextLength + 1 + str32len (tail);
+			newText = Melder_malloc (char32, newLength + 1);
+			str32cpy (newText, *text);
+			str32cpy (newText + headLength, includeText.peek());
+			str32cpy (newText + headLength + includeTextLength, U"\n");
+			str32cpy (newText + headLength + includeTextLength + 1, tail);
 			/*
 				Replace the old text with the new. This will work even within an autostring.
 			 */
@@ -196,18 +212,18 @@ void Melder_includeIncludeFiles (wchar_t **text) {
 	}
 }
 
-long Interpreter_readParameters (Interpreter me, wchar_t *text) {
-	wchar_t *formLocation = NULL;
+long Interpreter_readParameters (Interpreter me, char32 *text) {
+	char32 *formLocation = nullptr;
 	long npar = 0;
-	my dialogTitle [0] = '\0';
+	my dialogTitle [0] = U'\0';
 	/*
 	 * Look for a "form" line.
 	 */
 	{// scope
-		wchar_t *p = text;
+		char32 *p = text;
 		for (;;) {
 			while (*p == ' ' || *p == '\t') p ++;
-			if (wcsnequ (p, L"form ", 5)) {
+			if (str32nequ (p, U"form ", 5)) {
 				formLocation = p;
 				break;
 			}
@@ -220,43 +236,43 @@ long Interpreter_readParameters (Interpreter me, wchar_t *text) {
 	 * If there is no "form" line, there are no parameters.
 	 */
 	if (formLocation) {
-		wchar_t *dialogTitle = formLocation + 5, *newLine;
-		while (*dialogTitle == ' ' || *dialogTitle == '\t') dialogTitle ++;
-		newLine = wcschr (dialogTitle, '\n');
-		if (newLine) *newLine = '\0';
-		wcscpy (my dialogTitle, dialogTitle);
-		if (newLine) *newLine = '\n';
+		char32 *dialogTitle = formLocation + 5, *newLine;
+		while (*dialogTitle == U' ' || *dialogTitle == U'\t') dialogTitle ++;
+		newLine = str32chr (dialogTitle, U'\n');
+		if (newLine) *newLine = U'\0';
+		str32cpy (my dialogTitle, dialogTitle);
+		if (newLine) *newLine = U'\n';
 		my numberOfParameters = 0;
 		while (newLine) {
-			wchar_t *line = newLine + 1, *p;
+			char32 *line = newLine + 1, *p;
 			int type = 0;
-			while (*line == ' ' || *line == '\t') line ++;
-			while (*line == '#' || *line == ';' || *line == '!' || *line == '\n') {
-				newLine = wcschr (line, '\n');
-				if (newLine == NULL)
-					Melder_throw ("Unfinished form.");
+			while (*line == U' ' || *line == U'\t') line ++;
+			while (*line == U'#' || *line == U';' || *line == U'!' || *line == U'\n') {
+				newLine = str32chr (line, U'\n');
+				if (! newLine)
+					Melder_throw (U"Unfinished form.");
 				line = newLine + 1;
-				while (*line == ' ' || *line == '\t') line ++;
+				while (*line == U' ' || *line == U'\t') line ++;
 			}
-			if (wcsnequ (line, L"endform", 7)) break;
-			if (wcsnequ (line, L"word ", 5)) { type = Interpreter_WORD; p = line + 5; }
-			else if (wcsnequ (line, L"real ", 5)) { type = Interpreter_REAL; p = line + 5; }
-			else if (wcsnequ (line, L"positive ", 9)) { type = Interpreter_POSITIVE; p = line + 9; }
-			else if (wcsnequ (line, L"integer ", 8)) { type = Interpreter_INTEGER; p = line + 8; }
-			else if (wcsnequ (line, L"natural ", 8)) { type = Interpreter_NATURAL; p = line + 8; }
-			else if (wcsnequ (line, L"boolean ", 8)) { type = Interpreter_BOOLEAN; p = line + 8; }
-			else if (wcsnequ (line, L"sentence ", 9)) { type = Interpreter_SENTENCE; p = line + 9; }
-			else if (wcsnequ (line, L"text ", 5)) { type = Interpreter_TEXT; p = line + 5; }
-			else if (wcsnequ (line, L"choice ", 7)) { type = Interpreter_CHOICE; p = line + 7; }
-			else if (wcsnequ (line, L"optionmenu ", 11)) { type = Interpreter_OPTIONMENU; p = line + 11; }
-			else if (wcsnequ (line, L"button ", 7)) { type = Interpreter_BUTTON; p = line + 7; }
-			else if (wcsnequ (line, L"option ", 7)) { type = Interpreter_OPTION; p = line + 7; }
-			else if (wcsnequ (line, L"comment ", 8)) { type = Interpreter_COMMENT; p = line + 8; }
+			if (str32nequ (line, U"endform", 7)) break;
+			if (str32nequ (line, U"word ", 5)) { type = Interpreter_WORD; p = line + 5; }
+			else if (str32nequ (line, U"real ", 5)) { type = Interpreter_REAL; p = line + 5; }
+			else if (str32nequ (line, U"positive ", 9)) { type = Interpreter_POSITIVE; p = line + 9; }
+			else if (str32nequ (line, U"integer ", 8)) { type = Interpreter_INTEGER; p = line + 8; }
+			else if (str32nequ (line, U"natural ", 8)) { type = Interpreter_NATURAL; p = line + 8; }
+			else if (str32nequ (line, U"boolean ", 8)) { type = Interpreter_BOOLEAN; p = line + 8; }
+			else if (str32nequ (line, U"sentence ", 9)) { type = Interpreter_SENTENCE; p = line + 9; }
+			else if (str32nequ (line, U"text ", 5)) { type = Interpreter_TEXT; p = line + 5; }
+			else if (str32nequ (line, U"choice ", 7)) { type = Interpreter_CHOICE; p = line + 7; }
+			else if (str32nequ (line, U"optionmenu ", 11)) { type = Interpreter_OPTIONMENU; p = line + 11; }
+			else if (str32nequ (line, U"button ", 7)) { type = Interpreter_BUTTON; p = line + 7; }
+			else if (str32nequ (line, U"option ", 7)) { type = Interpreter_OPTION; p = line + 7; }
+			else if (str32nequ (line, U"comment ", 8)) { type = Interpreter_COMMENT; p = line + 8; }
 			else {
-				newLine = wcschr (line, '\n');
-				if (newLine) *newLine = '\0';
-				Melder_error_ ("Unknown parameter type:\n\"", line, "\".");
-				if (newLine) *newLine = '\n';
+				newLine = str32chr (line, U'\n');
+				if (newLine) *newLine = U'\0';
+				Melder_appendError (U"Unknown parameter type:\n\"", line, U"\".");
+				if (newLine) *newLine = U'\n';
 				throw MelderError ();
 				return 0;
 			}
@@ -281,22 +297,22 @@ long Interpreter_readParameters (Interpreter me, wchar_t *text) {
 				my arguments [5] := "Blue"
 			*/
 			if (type <= Interpreter_OPTIONMENU) {
-				while (*p == ' ' || *p == '\t') p ++;
-				if (*p == '\n' || *p == '\0')
-					Melder_throw ("Missing parameter:\n\"", line, "\".");
-				wchar_t *q = my parameters [++ my numberOfParameters];
-				while (*p != ' ' && *p != '\t' && *p != '\n' && *p != '\0') * (q ++) = * (p ++);
-				*q = '\0';
+				while (*p == U' ' || *p == U'\t') p ++;
+				if (*p == U'\n' || *p == U'\0')
+					Melder_throw (U"Missing parameter:\n\"", line, U"\".");
+				char32 *q = my parameters [++ my numberOfParameters];
+				while (*p != U' ' && *p != U'\t' && *p != U'\n' && *p != U'\0') * (q ++) = * (p ++);
+				*q = U'\0';
 				npar ++;
 			} else {
-				my parameters [++ my numberOfParameters] [0] = '\0';
+				my parameters [++ my numberOfParameters] [0] = U'\0';
 			}
-			while (*p == ' ' || *p == '\t') p ++;
-			newLine = wcschr (p, '\n');
-			if (newLine) *newLine = '\0';
+			while (*p == U' ' || *p == U'\t') p ++;
+			newLine = str32chr (p, U'\n');
+			if (newLine) *newLine = U'\0';
 			Melder_free (my arguments [my numberOfParameters]);
-			my arguments [my numberOfParameters] = Melder_wcsdup_f (p);
-			if (newLine) *newLine = '\n';
+			my arguments [my numberOfParameters] = Melder_dup_f (p);
+			if (newLine) *newLine = U'\n';
 			my types [my numberOfParameters] = type;
 		}
 	} else {
@@ -305,22 +321,22 @@ long Interpreter_readParameters (Interpreter me, wchar_t *text) {
 	return npar;
 }
 
-UiForm Interpreter_createForm (Interpreter me, GuiWindow parent, const wchar_t *path,
-	void (*okCallback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *), void *okClosure,
+UiForm Interpreter_createForm (Interpreter me, GuiWindow parent, const char32 *path,
+	void (*okCallback) (UiForm, int, Stackel, const char32 *, Interpreter, const char32 *, bool, void *), void *okClosure,
 	bool selectionOnly)
 {
 	UiForm form = UiForm_create (parent,
-		Melder_wcscat (selectionOnly ? L"Run script (selection only): " : L"Run script: ", my dialogTitle),
-		okCallback, okClosure, NULL, NULL);
-	Any radio = NULL;
-	if (path) UiForm_addText (form, L"$file", path);
+		Melder_cat (selectionOnly ? U"Run script (selection only): " : U"Run script: ", my dialogTitle),
+		okCallback, okClosure, nullptr, nullptr);
+	Any radio = nullptr;
+	if (path) UiForm_addText (form, U"$file", path);
 	for (int ipar = 1; ipar <= my numberOfParameters; ipar ++) {
 		/*
 		 * Convert underscores to spaces.
 		 */
-		wchar_t parameter [100], *p = & parameter [0];
-		wcscpy (parameter, my parameters [ipar]);
-		while (*p) { if (*p == '_') *p = ' '; p ++; }
+		char32 parameter [100], *p = & parameter [0];
+		str32cpy (parameter, my parameters [ipar]);
+		while (*p) { if (*p == U'_') *p = U' '; p ++; }
 		switch (my types [ipar]) {
 			case Interpreter_WORD:
 				UiForm_addWord (form, parameter, my arguments [ipar]); break;
@@ -333,17 +349,17 @@ UiForm Interpreter_createForm (Interpreter me, GuiWindow parent, const wchar_t *
 			case Interpreter_NATURAL:
 				UiForm_addNatural (form, parameter, my arguments [ipar]); break;
 			case Interpreter_BOOLEAN:
-				UiForm_addBoolean (form, parameter, my arguments [ipar] [0] == '1' ||
-					my arguments [ipar] [0] == 'y' || my arguments [ipar] [0] == 'Y' ||
-					(my arguments [ipar] [0] == 'o' && my arguments [ipar] [1] == 'n')); break;
+				UiForm_addBoolean (form, parameter, my arguments [ipar] [0] == U'1' ||
+					my arguments [ipar] [0] == U'y' || my arguments [ipar] [0] == U'Y' ||
+					(my arguments [ipar] [0] == U'o' && my arguments [ipar] [1] == U'n')); break;
 			case Interpreter_SENTENCE:
 				UiForm_addSentence (form, parameter, my arguments [ipar]); break;
 			case Interpreter_TEXT:
 				UiForm_addText (form, parameter, my arguments [ipar]); break;
 			case Interpreter_CHOICE:
-				radio = UiForm_addRadio (form, parameter, wcstol (my arguments [ipar], NULL, 10)); break;
+				radio = UiForm_addRadio (form, parameter, a32tol (my arguments [ipar])); break;
 			case Interpreter_OPTIONMENU:
-				radio = UiForm_addOptionMenu (form, parameter, wcstol (my arguments [ipar], NULL, 10)); break;
+				radio = UiForm_addOptionMenu (form, parameter, a32tol (my arguments [ipar])); break;
 			case Interpreter_BUTTON:
 				if (radio) UiRadio_addButton (radio, my arguments [ipar]); break;
 			case Interpreter_OPTION:
@@ -356,41 +372,41 @@ UiForm Interpreter_createForm (Interpreter me, GuiWindow parent, const wchar_t *
 		/*
 		 * Strip parentheses and colon off parameter name.
 		 */
-		if ((p = wcschr (my parameters [ipar], '(')) != NULL) {
-			*p = '\0';
-			if (p - my parameters [ipar] > 0 && p [-1] == '_') p [-1] = '\0';
+		if ((p = str32chr (my parameters [ipar], U'(')) != nullptr) {
+			*p = U'\0';
+			if (p - my parameters [ipar] > 0 && p [-1] == U'_') p [-1] = U'\0';
 		}
 		p = my parameters [ipar];
-		if (*p != '\0' && p [wcslen (p) - 1] == ':') p [wcslen (p) - 1] = '\0';
+		if (*p != U'\0' && p [str32len (p) - 1] == U':') p [str32len (p) - 1] = U'\0';
 	}
 	UiForm_finish (form);
 	return form;
 }
 
-void Interpreter_getArgumentsFromDialog (Interpreter me, Any dialog) {
+void Interpreter_getArgumentsFromDialog (Interpreter me, UiForm dialog) {
 	for (int ipar = 1; ipar <= my numberOfParameters; ipar ++) {
-		wchar_t parameter [100], *p;
+		char32 parameter [100], *p;
 		/*
 		 * Strip parentheses and colon off parameter name.
 		 */
-		if ((p = wcschr (my parameters [ipar], '(')) != NULL) {
-			*p = '\0';
-			if (p - my parameters [ipar] > 0 && p [-1] == '_') p [-1] = '\0';
+		if ((p = str32chr (my parameters [ipar], U'(')) != nullptr) {
+			*p = U'\0';
+			if (p - my parameters [ipar] > 0 && p [-1] == U'_') p [-1] = U'\0';
 		}
 		p = my parameters [ipar];
-		if (*p != '\0' && p [wcslen (p) - 1] == ':') p [wcslen (p) - 1] = '\0';
+		if (*p != U'\0' && p [str32len (p) - 1] == U':') p [str32len (p) - 1] = U'\0';
 		/*
 		 * Convert underscores to spaces.
 		 */
-		wcscpy (parameter, my parameters [ipar]);
-		p = & parameter [0]; while (*p) { if (*p == '_') *p = ' '; p ++; }
+		str32cpy (parameter, my parameters [ipar]);
+		p = & parameter [0]; while (*p) { if (*p == U'_') *p = U' '; p ++; }
 		switch (my types [ipar]) {
 			case Interpreter_REAL:
 			case Interpreter_POSITIVE: {
 				double value = UiForm_getReal_check (dialog, parameter);
 				Melder_free (my arguments [ipar]);
-				my arguments [ipar] = Melder_calloc_f (wchar_t, 40);
-				wcscpy (my arguments [ipar], Melder_double (value));
+				my arguments [ipar] = Melder_calloc_f (char32, 40);
+				Melder_sprint (my arguments [ipar],40, value);
 				break;
 			}
 			case Interpreter_INTEGER:
@@ -398,20 +414,20 @@ void Interpreter_getArgumentsFromDialog (Interpreter me, Any dialog) {
 			case Interpreter_BOOLEAN: {
 				long value = UiForm_getInteger (dialog, parameter);
 				Melder_free (my arguments [ipar]);
-				my arguments [ipar] = Melder_calloc_f (wchar_t, 40);
-				swprintf (my arguments [ipar], 40, L"%ld", value);
+				my arguments [ipar] = Melder_calloc_f (char32, 40);
+				Melder_sprint (my arguments [ipar],40, value);
 				break;
 			}
 			case Interpreter_CHOICE:
 			case Interpreter_OPTIONMENU: {
 				long integerValue = 0;
-				wchar_t *stringValue = NULL;
+				char32 *stringValue = nullptr;
 				integerValue = UiForm_getInteger (dialog, parameter);
 				stringValue = UiForm_getString (dialog, parameter);
 				Melder_free (my arguments [ipar]);
-				my arguments [ipar] = Melder_calloc_f (wchar_t, 40);
-				swprintf (my arguments [ipar], 40, L"%ld", integerValue);
-				wcscpy (my choiceArguments [ipar], stringValue);
+				my arguments [ipar] = Melder_calloc_f (char32, 40);
+				Melder_sprint (my arguments [ipar],40, integerValue);
+				Melder_sprint (my choiceArguments [ipar],100, stringValue);
 				break;
 			}
 			case Interpreter_BUTTON:
@@ -419,22 +435,22 @@ void Interpreter_getArgumentsFromDialog (Interpreter me, Any dialog) {
 			case Interpreter_COMMENT:
 				break;
 			default: {
-				wchar_t *value = UiForm_getString (dialog, parameter);
+				char32 *value = UiForm_getString (dialog, parameter);
 				Melder_free (my arguments [ipar]);
-				my arguments [ipar] = Melder_wcsdup_f (value);
+				my arguments [ipar] = Melder_dup_f (value);
 				break;
 			}
 		}
 	}
 }
 
-void Interpreter_getArgumentsFromString (Interpreter me, const wchar_t *arguments) {
+void Interpreter_getArgumentsFromString (Interpreter me, const char32 *arguments) {
 	int size = my numberOfParameters;
-	long length = wcslen (arguments);
-	while (size >= 1 && my parameters [size] [0] == '\0')
+	long length = str32len (arguments);
+	while (size >= 1 && my parameters [size] [0] == U'\0')
 		size --;   /* Ignore fields without a variable name (button, comment). */
 	for (int ipar = 1; ipar <= size; ipar ++) {
-		wchar_t *p = my parameters [ipar];
+		char32 *p = my parameters [ipar];
 		/*
 		 * Ignore buttons and comments again.
 		 */
@@ -442,25 +458,25 @@ void Interpreter_getArgumentsFromString (Interpreter me, const wchar_t *argument
 		/*
 		 * Strip parentheses and colon off parameter name.
 		 */
-		if ((p = wcschr (p, '(')) != NULL) {
-			*p = '\0';
-			if (p - my parameters [ipar] > 0 && p [-1] == '_') p [-1] = '\0';
+		if ((p = str32chr (p, U'(')) != nullptr) {
+			*p = U'\0';
+			if (p - my parameters [ipar] > 0 && p [-1] == U'_') p [-1] = U'\0';
 		}
 		p = my parameters [ipar];
-		if (*p != '\0' && p [wcslen (p) - 1] == ':') p [wcslen (p) - 1] = '\0';
+		if (*p != U'\0' && p [str32len (p) - 1] == U':') p [str32len (p) - 1] = U'\0';
 	}
 	for (int ipar = 1; ipar < size; ipar ++) {
 		int ichar = 0;
 		/*
 		 * Ignore buttons and comments again. The buttons will keep their labels as "arguments".
 		 */
-		if (my parameters [ipar] [0] == '\0') continue;
+		if (my parameters [ipar] [0] == U'\0') continue;
 		Melder_free (my arguments [ipar]);   // erase the current values, probably the default values
-		my arguments [ipar] = Melder_calloc_f (wchar_t, length + 1);   // replace with the actual arguments
+		my arguments [ipar] = Melder_calloc_f (char32, length + 1);   // replace with the actual arguments
 		/*
 		 * Skip spaces until next argument.
 		 */
-		while (*arguments == ' ' || *arguments == '\t') arguments ++;
+		while (*arguments == U' ' || *arguments == U'\t') arguments ++;
 		/*
 		 * The argument is everything up to the next space, or, if that starts with a double quote,
 		 * everything between this quote and the matching double quote;
@@ -470,84 +486,84 @@ void Interpreter_getArgumentsFromString (Interpreter me, const wchar_t *argument
 		 * will be passed to the dialog as a single argument containing the text
 		 *     I said "hello"
 		 */
-		if (*arguments == '\"') {
+		if (*arguments == U'\"') {
 			arguments ++;   // do not include leading double quote
 			for (;;) {
-				if (*arguments == '\0')
-					Melder_throw ("Missing matching quote.");
-				if (*arguments == '\"' && * ++ arguments != '\"') break;   // remember second quote
+				if (*arguments == U'\0')
+					Melder_throw (U"Missing matching quote.");
+				if (*arguments == U'\"' && * ++ arguments != U'\"') break;   // remember second quote
 				my arguments [ipar] [ichar ++] = *arguments ++;
 			}
 		} else {
-			while (*arguments != ' ' && *arguments != '\t' && *arguments != '\0')
+			while (*arguments != U' ' && *arguments != U'\t' && *arguments != U'\0')
 				my arguments [ipar] [ichar ++] = *arguments ++;
 		}
-		my arguments [ipar] [ichar] = '\0';   // trailing null byte
+		my arguments [ipar] [ichar] = U'\0';   // trailing null byte
 	}
 	/* The last item is handled separately, because it consists of the rest of the line.
 	 * Leading spaces are skipped, but trailing spaces are included.
 	 */
 	if (size > 0) {
-		while (*arguments == ' ' || *arguments == '\t') arguments ++;
+		while (*arguments == U' ' || *arguments == U'\t') arguments ++;
 		Melder_free (my arguments [size]);
-		my arguments [size] = Melder_wcsdup_f (arguments);
+		my arguments [size] = Melder_dup_f (arguments);
 	}
 	/*
 	 * Convert booleans and choices to numbers.
 	 */
 	for (int ipar = 1; ipar <= size; ipar ++) {
 		if (my types [ipar] == Interpreter_BOOLEAN) {
-			wchar_t *arg = & my arguments [ipar] [0];
-			if (wcsequ (arg, L"1") || wcsequ (arg, L"yes") || wcsequ (arg, L"on") ||
-			    wcsequ (arg, L"Yes") || wcsequ (arg, L"On") || wcsequ (arg, L"YES") || wcsequ (arg, L"ON"))
+			char32 *arg = & my arguments [ipar] [0];
+			if (str32equ (arg, U"1") || str32equ (arg, U"yes") || str32equ (arg, U"on") ||
+			    str32equ (arg, U"Yes") || str32equ (arg, U"On") || str32equ (arg, U"YES") || str32equ (arg, U"ON"))
 			{
-				wcscpy (arg, L"1");
-			} else if (wcsequ (arg, L"0") || wcsequ (arg, L"no") || wcsequ (arg, L"off") ||
-			    wcsequ (arg, L"No") || wcsequ (arg, L"Off") || wcsequ (arg, L"NO") || wcsequ (arg, L"OFF"))
+				str32cpy (arg, U"1");
+			} else if (str32equ (arg, U"0") || str32equ (arg, U"no") || str32equ (arg, U"off") ||
+			    str32equ (arg, U"No") || str32equ (arg, U"Off") || str32equ (arg, U"NO") || str32equ (arg, U"OFF"))
 			{
-				wcscpy (arg, L"0");
+				str32cpy (arg, U"0");
 			} else {
-				Melder_throw ("Unknown value \"", arg, "\" for boolean \"", my parameters [ipar], "\".");
+				Melder_throw (U"Unknown value \"", arg, U"\" for boolean \"", my parameters [ipar], U"\".");
 			}
 		} else if (my types [ipar] == Interpreter_CHOICE) {
 			int jpar;
-			wchar_t *arg = & my arguments [ipar] [0];
+			char32 *arg = & my arguments [ipar] [0];
 			for (jpar = ipar + 1; jpar <= my numberOfParameters; jpar ++) {
 				if (my types [jpar] != Interpreter_BUTTON && my types [jpar] != Interpreter_OPTION)
-					Melder_throw ("Unknown value \"", arg, "\" for choice \"", my parameters [ipar], "\".");
-				if (wcsequ (my arguments [jpar], arg)) {   // the button labels are in the arguments; see Interpreter_readParameters
-					swprintf (arg, 40, L"%d", jpar - ipar);
-					wcscpy (my choiceArguments [ipar], my arguments [jpar]);
+					Melder_throw (U"Unknown value \"", arg, U"\" for choice \"", my parameters [ipar], U"\".");
+				if (str32equ (my arguments [jpar], arg)) {   // the button labels are in the arguments; see Interpreter_readParameters
+					str32cpy (arg, Melder_integer (jpar - ipar));
+					str32cpy (my choiceArguments [ipar], my arguments [jpar]);
 					break;
 				}
 			}
 			if (jpar > my numberOfParameters)
-				Melder_throw ("Unknown value \"", arg, "\" for choice \"", my parameters [ipar], "\".");
+				Melder_throw (U"Unknown value \"", arg, U"\" for choice \"", my parameters [ipar], U"\".");
 		} else if (my types [ipar] == Interpreter_OPTIONMENU) {
 			int jpar;
-			wchar_t *arg = & my arguments [ipar] [0];
+			char32 *arg = & my arguments [ipar] [0];
 			for (jpar = ipar + 1; jpar <= my numberOfParameters; jpar ++) {
 				if (my types [jpar] != Interpreter_OPTION && my types [jpar] != Interpreter_BUTTON)
-					Melder_throw ("Unknown value \"", arg, "\" for option menu \"", my parameters [ipar], "\".");
-				if (wcsequ (my arguments [jpar], arg)) {
-					swprintf (arg, 40, L"%d", jpar - ipar);
-					wcscpy (my choiceArguments [ipar], my arguments [jpar]);
+					Melder_throw (U"Unknown value \"", arg, U"\" for option menu \"", my parameters [ipar], U"\".");
+				if (str32equ (my arguments [jpar], arg)) {
+					str32cpy (arg, Melder_integer (jpar - ipar));
+					str32cpy (my choiceArguments [ipar], my arguments [jpar]);
 					break;
 				}
 			}
 			if (jpar > my numberOfParameters)
-				Melder_throw ("Unknown value \"", arg, "\" for option menu \"", my parameters [ipar], "\".");
+				Melder_throw (U"Unknown value \"", arg, U"\" for option menu \"", my parameters [ipar], U"\".");
 		}
 	}
 }
 
 void Interpreter_getArgumentsFromArgs (Interpreter me, int narg, Stackel args) {
-	trace ("%d arguments", narg);
+	trace (narg, U" arguments");
 	int size = my numberOfParameters;
 	while (size >= 1 && my parameters [size] [0] == '\0')
 		size --;   // ignore trailing fields without a variable name (button, comment)
 	for (int ipar = 1; ipar <= size; ipar ++) {
-		wchar_t *p = my parameters [ipar];
+		char32 *p = my parameters [ipar];
 		/*
 		 * Ignore buttons and comments again.
 		 */
@@ -555,102 +571,135 @@ void Interpreter_getArgumentsFromArgs (Interpreter me, int narg, Stackel args) {
 		/*
 		 * Strip parentheses and colon off parameter name.
 		 */
-		if ((p = wcschr (p, '(')) != NULL) {
-			*p = '\0';
-			if (p - my parameters [ipar] > 0 && p [-1] == '_') p [-1] = '\0';
+		if ((p = str32chr (p, U'(')) != nullptr) {
+			*p = U'\0';
+			if (p - my parameters [ipar] > 0 && p [-1] == U'_') p [-1] = U'\0';
 		}
 		p = my parameters [ipar];
-		if (*p != '\0' && p [wcslen (p) - 1] == ':') p [wcslen (p) - 1] = '\0';
+		if (*p != U'\0' && p [str32len (p) - 1] == U':') p [str32len (p) - 1] = U'\0';
 	}
 	int iarg = 0;
 	for (int ipar = 1; ipar <= size; ipar ++) {
 		/*
 		 * Ignore buttons and comments again. The buttons will keep their labels as "arguments".
 		 */
-		if (my parameters [ipar] [0] == '\0') continue;
+		if (my parameters [ipar] [0] == U'\0') continue;
 		Melder_free (my arguments [ipar]);   // erase the current values, probably the default values
 		if (iarg == narg)
-			Melder_throw ("Found ", narg, " arguments but expected more.");
+			Melder_throw (U"Found ", narg, U" arguments but expected more.");
 		Stackel arg = & args [++ iarg];
 		my arguments [ipar] =
-			arg -> which == Stackel_NUMBER ? Melder_wcsdup (Melder_double (arg -> number)) :
-			arg -> which == Stackel_STRING ? Melder_wcsdup (arg -> string) : NULL;   // replace with the actual arguments
-		Melder_assert (my arguments [ipar] != NULL);
+			arg -> which == Stackel_NUMBER ? Melder_dup (Melder_double (arg -> number)) :
+			arg -> which == Stackel_STRING ? Melder_dup (arg -> string) : nullptr;   // replace with the actual arguments
+		Melder_assert (my arguments [ipar]);
 	}
 	if (iarg < narg)
-		Melder_throw ("Found ", narg, " arguments but expected only ", iarg, ".");
+		Melder_throw (U"Found ", narg, U" arguments but expected only ", iarg, U".");
 	/*
 	 * Convert booleans and choices to numbers.
 	 */
 	for (int ipar = 1; ipar <= size; ipar ++) {
 		if (my types [ipar] == Interpreter_BOOLEAN) {
-			wchar_t *arg = & my arguments [ipar] [0];
-			if (wcsequ (arg, L"1") || wcsequ (arg, L"yes") || wcsequ (arg, L"on") ||
-			    wcsequ (arg, L"Yes") || wcsequ (arg, L"On") || wcsequ (arg, L"YES") || wcsequ (arg, L"ON"))
+			char32 *arg = & my arguments [ipar] [0];
+			if (str32equ (arg, U"1") || str32equ (arg, U"yes") || str32equ (arg, U"on") ||
+			    str32equ (arg, U"Yes") || str32equ (arg, U"On") || str32equ (arg, U"YES") || str32equ (arg, U"ON"))
 			{
-				wcscpy (arg, L"1");
-			} else if (wcsequ (arg, L"0") || wcsequ (arg, L"no") || wcsequ (arg, L"off") ||
-			    wcsequ (arg, L"No") || wcsequ (arg, L"Off") || wcsequ (arg, L"NO") || wcsequ (arg, L"OFF"))
+				str32cpy (arg, U"1");
+			} else if (str32equ (arg, U"0") || str32equ (arg, U"no") || str32equ (arg, U"off") ||
+			    str32equ (arg, U"No") || str32equ (arg, U"Off") || str32equ (arg, U"NO") || str32equ (arg, U"OFF"))
 			{
-				wcscpy (arg, L"0");
+				str32cpy (arg, U"0");
 			} else {
-				Melder_throw ("Unknown value \"", arg, "\" for boolean \"", my parameters [ipar], "\".");
+				Melder_throw (U"Unknown value \"", arg, U"\" for boolean \"", my parameters [ipar], U"\".");
 			}
 		} else if (my types [ipar] == Interpreter_CHOICE) {
 			int jpar;
-			wchar_t *arg = & my arguments [ipar] [0];
+			char32 *arg = & my arguments [ipar] [0];
 			for (jpar = ipar + 1; jpar <= my numberOfParameters; jpar ++) {
 				if (my types [jpar] != Interpreter_BUTTON && my types [jpar] != Interpreter_OPTION)
-					Melder_throw ("Unknown value \"", arg, "\" for choice \"", my parameters [ipar], "\".");
-				if (wcsequ (my arguments [jpar], arg)) {   // the button labels are in the arguments; see Interpreter_readParameters
-					swprintf (arg, 40, L"%d", jpar - ipar);
-					wcscpy (my choiceArguments [ipar], my arguments [jpar]);
+					Melder_throw (U"Unknown value \"", arg, U"\" for choice \"", my parameters [ipar], U"\".");
+				if (str32equ (my arguments [jpar], arg)) {   // the button labels are in the arguments; see Interpreter_readParameters
+					str32cpy (arg, Melder_integer (jpar - ipar));
+					str32cpy (my choiceArguments [ipar], my arguments [jpar]);
 					break;
 				}
 			}
 			if (jpar > my numberOfParameters)
-				Melder_throw ("Unknown value \"", arg, "\" for choice \"", my parameters [ipar], "\".");
+				Melder_throw (U"Unknown value \"", arg, U"\" for choice \"", my parameters [ipar], U"\".");
 		} else if (my types [ipar] == Interpreter_OPTIONMENU) {
 			int jpar;
-			wchar_t *arg = & my arguments [ipar] [0];
+			char32 *arg = & my arguments [ipar] [0];
 			for (jpar = ipar + 1; jpar <= my numberOfParameters; jpar ++) {
 				if (my types [jpar] != Interpreter_OPTION && my types [jpar] != Interpreter_BUTTON)
-					Melder_throw ("Unknown value \"", arg, "\" for option menu \"", my parameters [ipar], "\".");
-				if (wcsequ (my arguments [jpar], arg)) {
-					swprintf (arg, 40, L"%d", jpar - ipar);
-					wcscpy (my choiceArguments [ipar], my arguments [jpar]);
+					Melder_throw (U"Unknown value \"", arg, U"\" for option menu \"", my parameters [ipar], U"\".");
+				if (str32equ (my arguments [jpar], arg)) {
+					str32cpy (arg, Melder_integer (jpar - ipar));
+					str32cpy (my choiceArguments [ipar], my arguments [jpar]);
 					break;
 				}
 			}
 			if (jpar > my numberOfParameters)
-				Melder_throw ("Unknown value \"", arg, "\" for option menu \"", my parameters [ipar], "\".");
+				Melder_throw (U"Unknown value \"", arg, U"\" for option menu \"", my parameters [ipar], U"\".");
 		}
 	}
 }
 
-static void Interpreter_addNumericVariable (Interpreter me, const wchar_t *key, double value) {
+static void Interpreter_addNumericVariable (Interpreter me, const char32 *key, double value) {
+	#if USE_HASH
+	InterpreterVariable variable = InterpreterVariable_create (key);
+	variable -> numericValue = value;
+	(*my variablesMap) [key] = variable;
+	#else
 	autoInterpreterVariable variable = InterpreterVariable_create (key);
 	variable -> numericValue = value;
 	Collection_addItem (my variables, variable.transfer());
+	#endif
 }
 
-static void Interpreter_addStringVariable (Interpreter me, const wchar_t *key, const wchar_t *value) {
+static void Interpreter_addStringVariable (Interpreter me, const char32 *key, const char32 *value) {
+	#if USE_HASH
+	InterpreterVariable variable = InterpreterVariable_create (key);
+	variable -> stringValue = Melder_dup (value);
+	(*my variablesMap) [key] = variable;
+	#else
 	autoInterpreterVariable variable = InterpreterVariable_create (key);
-	variable -> stringValue = Melder_wcsdup (value);
+	variable -> stringValue = Melder_dup (value);
 	Collection_addItem (my variables, variable.transfer());
+	#endif
 }
 
-InterpreterVariable Interpreter_hasVariable (Interpreter me, const wchar_t *key) {
-	Melder_assert (key != NULL);
+InterpreterVariable Interpreter_hasVariable (Interpreter me, const char32 *key) {
+	Melder_assert (key);
+	#if USE_HASH
+	auto it = my variablesMap -> find (key [0] == U'.' ? Melder_cat (my procedureNames [my callDepth], key) : key);
+	if (it != my variablesMap -> end()) {
+		return it -> second;
+	} else {
+		return nullptr;
+	}
+	#else
 	long variableNumber = SortedSetOfString_lookUp (my variables,
-		key [0] == '.' ? Melder_wcscat (my procedureNames [my callDepth], key) : key);
-	return variableNumber ? (InterpreterVariable) my variables -> item [variableNumber] : NULL;
+		key [0] == U'.' ? Melder_cat (my procedureNames [my callDepth], key) : key);
+	return variableNumber ? (InterpreterVariable) my variables -> item [variableNumber] : nullptr;
+	#endif
 }
 
-InterpreterVariable Interpreter_lookUpVariable (Interpreter me, const wchar_t *key) {
-	Melder_assert (key != NULL);
-	const wchar_t *variableNameIncludingProcedureName =
-		key [0] == '.' ? Melder_wcscat (my procedureNames [my callDepth], key) : key;
+InterpreterVariable Interpreter_lookUpVariable (Interpreter me, const char32 *key) {
+	Melder_assert (key);
+	const char32 *variableNameIncludingProcedureName =
+		key [0] == U'.' ? Melder_cat (my procedureNames [my callDepth], key) : key;
+	#if USE_HASH
+	auto it = my variablesMap -> find (variableNameIncludingProcedureName);
+	if (it != my variablesMap -> end()) {
+		return it -> second;
+	}
+	/*
+	 * The variable doesn't yet exist: create a new one.
+	 */
+	InterpreterVariable variable = InterpreterVariable_create (variableNameIncludingProcedureName);
+	(*my variablesMap) [variableNameIncludingProcedureName] = variable;
+	return variable;
+	#else
 	long variableNumber = SortedSetOfString_lookUp (my variables, variableNameIncludingProcedureName);
 	if (variableNumber) return (InterpreterVariable) my variables -> item [variableNumber];   // already exists
 	/*
@@ -660,73 +709,75 @@ InterpreterVariable Interpreter_lookUpVariable (Interpreter me, const wchar_t *k
 	InterpreterVariable variable_ref = variable.peek();
 	Collection_addItem (my variables, variable.transfer());
 	return variable_ref;
+	#endif
 }
 
-static long lookupLabel (Interpreter me, const wchar_t *labelName) {
+static long lookupLabel (Interpreter me, const char32 *labelName) {
 	for (long ilabel = 1; ilabel <= my numberOfLabels; ilabel ++)
-		if (wcsequ (labelName, my labelNames [ilabel]))
+		if (str32equ (labelName, my labelNames [ilabel]))
 			return ilabel;
-	Melder_throw ("Unknown label \"", labelName, "\".");
+	Melder_throw (U"Unknown label \"", labelName, U"\".");
 }
 
-static bool isCommand (const wchar_t *p) {
+static bool isCommand (const char32 *p) {
 	/*
 	 * Things that start with "nowarn", "noprogress", or "nocheck" are commands.
 	 */
-	if (p [0] == 'n' && p [1] == 'o' &&
-		(wcsnequ (p + 2, L"warn ", 5) || wcsnequ (p + 2, L"progress ", 9) || wcsnequ (p + 2, L"check ", 6))) return true;
-	if (wcsnequ (p, L"demo ", 5)) return true;
+	if (p [0] == U'n' && p [1] == U'o' &&
+		(str32nequ (p + 2, U"warn ", 5) || str32nequ (p + 2, U"progress ", 9) || str32nequ (p + 2, U"check ", 6))) return true;
+	if (str32nequ (p, U"demo ", 5)) return true;
 	/*
 	 * Otherwise, things that start with lower case are formulas.
 	 */
-	if (! isupper (*p)) return false;
+	if (! isupper ((int) *p)) return false;
 	/*
 	 * The remaining possibility is things that start with upper case.
 	 * If they contain an underscore, they are object names, hence we must have a formula.
 	 * Otherwise, we have a command.
 	 */
-	while (isalnum (*p)) p ++;
+	while (isalnum ((int) *p)) p ++;
 	return *p != '_';
 }
 
-static void parameterToVariable (Interpreter me, int type, const wchar_t *in_parameter, int ipar) {
-	wchar_t parameter [200];
+static void parameterToVariable (Interpreter me, int type, const char32 *in_parameter, int ipar) {
+	char32 parameter [200];
 	Melder_assert (type != 0);
-	wcscpy (parameter, in_parameter);
+	str32cpy (parameter, in_parameter);
 	if (type >= Interpreter_REAL && type <= Interpreter_BOOLEAN) {
 		Interpreter_addNumericVariable (me, parameter, Melder_atof (my arguments [ipar]));
 	} else if (type == Interpreter_CHOICE || type == Interpreter_OPTIONMENU) {
 		Interpreter_addNumericVariable (me, parameter, Melder_atof (my arguments [ipar]));
-		wcscat (parameter, L"$");
+		str32cpy (parameter + str32len (parameter), U"$");
 		Interpreter_addStringVariable (me, parameter, my choiceArguments [ipar]);
 	} else if (type == Interpreter_BUTTON || type == Interpreter_OPTION || type == Interpreter_COMMENT) {
 		/* Do not add a variable. */
 	} else {
-		wcscat (parameter, L"$");
+		str32cpy (parameter + str32len (parameter), U"$");
 		Interpreter_addStringVariable (me, parameter, my arguments [ipar]);
 	}
 }
 
-void Interpreter_run (Interpreter me, wchar_t *text) {
-	autoNUMvector <wchar_t *> lines;   // not autostringvector, because the elements are reference copies
+void Interpreter_run (Interpreter me, char32 *text) {
+	autoNUMvector <char32 *> lines;   // not autostringvector, because the elements are reference copies
 	long lineNumber = 0;
 	bool assertionFailed = false;
 	try {
-		static MelderString valueString = { 0 };   // to divert the info
-		static MelderString assertErrorString = { 0 };
-		wchar_t *command = text;
+		static MelderString valueString { 0 };   // to divert the info
+		static MelderString assertErrorString { 0 };
+		char32 *command = text;
 		autoMelderString command2;
 		autoMelderString buffer;
 		long numberOfLines = 0, assertErrorLineNumber = 0, callStack [1 + Interpreter_MAX_CALL_DEPTH];
-		int atLastLine = FALSE, fromif = FALSE, fromendfor = FALSE, callDepth = 0, chopped = 0, ipar;
+		bool atLastLine = false, fromif = false, fromendfor = false;
+		int callDepth = 0, chopped = 0, ipar;
 		my callDepth = 0;
 		/*
-		 * The "environment" is NULL if we are in the Praat shell, or an editor otherwise.
+		 * The "environment" is null if we are in the Praat shell, or an editor otherwise.
 		 */
 		if (my editorClass) {
 			praatP. editor = praat_findEditorFromString (my environmentName);
 		} else {
-			praatP. editor = NULL;
+			praatP. editor = nullptr;
 		}
 		/*
 		 * Start.
@@ -736,10 +787,10 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 		 * Count lines and set the newlines to zero.
 		 */
 		while (! atLastLine) {
-			wchar_t *endOfLine = command;
-			while (*endOfLine != '\n' && *endOfLine != '\0') endOfLine ++;
-			if (*endOfLine == '\0') atLastLine = TRUE;
-			*endOfLine = '\0';
+			char32 *endOfLine = command;
+			while (*endOfLine != U'\n' && *endOfLine != U'\0') endOfLine ++;
+			if (*endOfLine == U'\0') atLastLine = true;
+			*endOfLine = U'\0';
 			numberOfLines ++;
 			command = endOfLine + 1;
 		}
@@ -747,134 +798,151 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 		 * Remember line starts and labels.
 		 */
 		lines.reset (1, numberOfLines);
-		for (lineNumber = 1, command = text; lineNumber <= numberOfLines; lineNumber ++, command += wcslen (command) + 1 + chopped) {
+		for (lineNumber = 1, command = text; lineNumber <= numberOfLines; lineNumber ++, command += str32len (command) + 1 + chopped) {
 			int length;
-			while (*command == ' ' || *command == '\t' || *command == UNICODE_NO_BREAK_SPACE) command ++;   // nbsp can occur for scripts copied from the manual
-			length = wcslen (command);
+			while (*command == U' ' || *command == U'\t' || *command == UNICODE_NO_BREAK_SPACE) command ++;   // nbsp can occur for scripts copied from the manual
+			length = str32len (command);
 			/*
 			 * Chop trailing spaces?
 			 */
 			/*chopped = 0;
 			while (length > 0) { char kar = command [-- length]; if (kar != ' ' && kar != '\t') break; command [length] = '\0'; chopped ++; }*/
 			lines [lineNumber] = command;
-			if (wcsnequ (command, L"label ", 6)) {
+			if (str32nequ (command, U"label ", 6)) {
 				int ilabel;
 				for (ilabel = 1; ilabel <= my numberOfLabels; ilabel ++)
-					if (wcsequ (command + 6, my labelNames [ilabel]))
-						Melder_throw ("Duplicate label \"", command + 6, "\".");
+					if (str32equ (command + 6, my labelNames [ilabel]))
+						Melder_throw (U"Duplicate label \"", command + 6, U"\".");
 				if (my numberOfLabels >= Interpreter_MAXNUM_LABELS)
-					Melder_throw ("Too many labels.");
-				swprintf (my labelNames [++ my numberOfLabels], 50, L"%.47ls", command + 6);
+					Melder_throw (U"Too many labels.");
+				str32ncpy (my labelNames [++ my numberOfLabels], command + 6, 1+Interpreter_MAX_LABEL_LENGTH);
+				my labelNames [my numberOfLabels] [Interpreter_MAX_LABEL_LENGTH] = U'\0';
 				my labelLines [my numberOfLabels] = lineNumber;
 			}
 		}
 		/*
 		 * Connect continuation lines.
 		 */
-		trace ("connect continuation lines");
+		trace (U"connect continuation lines");
 		for (lineNumber = numberOfLines; lineNumber >= 2; lineNumber --) {
-			wchar_t *line = lines [lineNumber];
-			if (line [0] == '.' && line [1] == '.' && line [2] == '.') {
-				wchar_t *previous = lines [lineNumber - 1];
+			char32 *line = lines [lineNumber];
+			if (line [0] == U'.' && line [1] == U'.' && line [2] == U'.') {
+				char32 *previous = lines [lineNumber - 1];
 				MelderString_copy (& command2, line + 3);
-				MelderString_get (& command2, previous + wcslen (previous));
-				static wchar_t emptyLine [] = { '\0' };
+				MelderString_get (& command2, previous + str32len (previous));
+				static char32 emptyLine [] = { U'\0' };
 				lines [lineNumber] = emptyLine;
 			}
 		}
 		/*
 		 * Copy the parameter names and argument values into the array of variables.
 		 */
+		#if USE_HASH
+		for (auto it = my variablesMap -> begin(); it != my variablesMap -> end(); it ++) {
+			InterpreterVariable var = it -> second;
+			forget (var);
+		}
+		my variablesMap -> clear ();
+		#else
 		forget (my variables);
 		my variables = SortedSetOfString_create ();
+		#endif
 		for (ipar = 1; ipar <= my numberOfParameters; ipar ++) {
-			wchar_t parameter [200];
+			char32 parameter [200];
 			/*
 			 * Create variable names as-are and variable names without capitals.
 			 */
-			wcscpy (parameter, my parameters [ipar]);
+			str32cpy (parameter, my parameters [ipar]);
 			parameterToVariable (me, my types [ipar], parameter, ipar);
-			if (parameter [0] >= 'A' && parameter [0] <= 'Z') {
-				parameter [0] = tolower (parameter [0]);
+			if (parameter [0] >= U'A' && parameter [0] <= U'Z') {
+				parameter [0] = (char32) tolower ((int) parameter [0]);
 				parameterToVariable (me, my types [ipar], parameter, ipar);
 			}
 		}
 		/*
 		 * Initialize some variables.
 		 */
-		Interpreter_addStringVariable (me, L"newline$", L"\n");
-		Interpreter_addStringVariable (me, L"tab$", L"\t");
-		Interpreter_addStringVariable (me, L"shellDirectory$", Melder_getShellDirectory ());
+		Interpreter_addStringVariable (me, U"newline$", U"\n");
+		Interpreter_addStringVariable (me, U"tab$", U"\t");
+		Interpreter_addStringVariable (me, U"shellDirectory$", Melder_getShellDirectory ());
 		structMelderDir dir = { { 0 } }; Melder_getDefaultDir (& dir);
-		Interpreter_addStringVariable (me, L"defaultDirectory$", Melder_dirToPath (& dir));
-		Interpreter_addStringVariable (me, L"preferencesDirectory$", Melder_dirToPath (& praatDir));
+		Interpreter_addStringVariable (me, U"defaultDirectory$", Melder_dirToPath (& dir));
+		Interpreter_addStringVariable (me, U"preferencesDirectory$", Melder_dirToPath (& praatDir));
 		Melder_getHomeDir (& dir);
-		Interpreter_addStringVariable (me, L"homeDirectory$", Melder_dirToPath (& dir));
+		Interpreter_addStringVariable (me, U"homeDirectory$", Melder_dirToPath (& dir));
 		Melder_getTempDir (& dir);
-		Interpreter_addStringVariable (me, L"temporaryDirectory$", Melder_dirToPath (& dir));
+		Interpreter_addStringVariable (me, U"temporaryDirectory$", Melder_dirToPath (& dir));
 		#if defined (macintosh)
-			Interpreter_addNumericVariable (me, L"macintosh", 1);
-			Interpreter_addNumericVariable (me, L"windows", 0);
-			Interpreter_addNumericVariable (me, L"unix", 0);
+			Interpreter_addNumericVariable (me, U"macintosh", 1);
+			Interpreter_addNumericVariable (me, U"windows", 0);
+			Interpreter_addNumericVariable (me, U"unix", 0);
 		#elif defined (_WIN32)
-			Interpreter_addNumericVariable (me, L"macintosh", 0);
-			Interpreter_addNumericVariable (me, L"windows", 1);
-			Interpreter_addNumericVariable (me, L"unix", 0);
+			Interpreter_addNumericVariable (me, U"macintosh", 0);
+			Interpreter_addNumericVariable (me, U"windows", 1);
+			Interpreter_addNumericVariable (me, U"unix", 0);
 		#elif defined (UNIX)
-			Interpreter_addNumericVariable (me, L"macintosh", 0);
-			Interpreter_addNumericVariable (me, L"windows", 0);
-			Interpreter_addNumericVariable (me, L"unix", 1);
+			Interpreter_addNumericVariable (me, U"macintosh", 0);
+			Interpreter_addNumericVariable (me, U"windows", 0);
+			Interpreter_addNumericVariable (me, U"unix", 1);
 		#else
-			Interpreter_addNumericVariable (me, L"macintosh", 0);
-			Interpreter_addNumericVariable (me, L"windows", 0);
-			Interpreter_addNumericVariable (me, L"unix", 0);
+			Interpreter_addNumericVariable (me, U"macintosh", 0);
+			Interpreter_addNumericVariable (me, U"windows", 0);
+			Interpreter_addNumericVariable (me, U"unix", 0);
 		#endif
-		Interpreter_addNumericVariable (me, L"left", 1);   // to accommodate scripts from before Praat 5.2.06
-		Interpreter_addNumericVariable (me, L"right", 2);   // to accommodate scripts from before Praat 5.2.06
-		Interpreter_addNumericVariable (me, L"mono", 1);   // to accommodate scripts from before Praat 5.2.06
-		Interpreter_addNumericVariable (me, L"stereo", 2);   // to accommodate scripts from before Praat 5.2.06
-		Interpreter_addNumericVariable (me, L"all", 0);   // to accommodate scripts from before Praat 5.2.06
-		Interpreter_addNumericVariable (me, L"average", 0);   // to accommodate scripts from before Praat 5.2.06
+		Interpreter_addNumericVariable (me, U"left", 1);   // to accommodate scripts from before Praat 5.2.06
+		Interpreter_addNumericVariable (me, U"right", 2);   // to accommodate scripts from before Praat 5.2.06
+		Interpreter_addNumericVariable (me, U"mono", 1);   // to accommodate scripts from before Praat 5.2.06
+		Interpreter_addNumericVariable (me, U"stereo", 2);   // to accommodate scripts from before Praat 5.2.06
+		Interpreter_addNumericVariable (me, U"all", 0);   // to accommodate scripts from before Praat 5.2.06
+		Interpreter_addNumericVariable (me, U"average", 0);   // to accommodate scripts from before Praat 5.2.06
 		#define xstr(s) str(s)
 		#define str(s) #s
-		Interpreter_addStringVariable (me, L"praatVersion$", L"" xstr(PRAAT_VERSION_STR));
-		Interpreter_addNumericVariable (me, L"praatVersion", PRAAT_VERSION_NUM);
+		Interpreter_addStringVariable (me, U"praatVersion$", U"" xstr(PRAAT_VERSION_STR));
+		Interpreter_addNumericVariable (me, U"praatVersion", PRAAT_VERSION_NUM);
 		/*
 		 * Execute commands.
 		 */
-		#define wordEnd(c)  (c == '\0' || c == ' ' || c == '\t')
-		trace ("going to handle %ld lines", numberOfLines);
+		#define wordEnd(c)  (c == U'\0' || c == U' ' || c == U'\t')
+		trace (U"going to handle ", numberOfLines, U" lines");
+		//for (lineNumber = 1; lineNumber <= numberOfLines; lineNumber ++) {
+			//trace (U"line ", lineNumber, U": ", lines [lineNumber]);
+		//}
 		for (lineNumber = 1; lineNumber <= numberOfLines; lineNumber ++) {
 			if (my stopped) break;
+			//trace (U"now at line ", lineNumber, U": ", lines [lineNumber]);
+			//for (int lineNumber2 = 1; lineNumber2 <= numberOfLines; lineNumber2 ++) {
+				//trace (U"  line ", lineNumber2, U": ", lines [lineNumber2]);
+			//}
 			try {
-				int c0, fail = FALSE;
-				wchar_t *p;
+				char32 c0;
+				bool fail = false;
 				MelderString_copy (& command2, lines [lineNumber]);
 				c0 = command2. string [0];
-				if (c0 == '\0') continue;
+				if (c0 == U'\0') continue;
 				/*
 				 * Substitute variables.
 				 */
-				trace ("substituting variables");
-				for (p = & command2. string [0]; *p != '\0'; p ++) if (*p == '\'') {
+				trace (U"substituting variables");
+				for (char32 *p = & command2. string [0]; *p != U'\0'; p ++) if (*p == U'\'') {
 					/*
 					 * Found a left quote. Search for a matching right quote.
 					 */
-					wchar_t *q = p + 1, varName [300], *r, *s, *colon;
-					int precision = -1, percent = FALSE;
-					while (*q != '\0' && *q != '\'' && q - p < 299) q ++;
-					if (*q == '\0') break;   // no matching right quote? done with this line!
+					char32 *q = p + 1, varName [300], *r, *s, *colon;
+					int precision = -1;
+					bool percent = false;
+					while (*q != U'\0' && *q != U'\'' && q - p < 299) q ++;
+					if (*q == U'\0') break;   // no matching right quote? done with this line!
 					if (q - p == 1 || q - p >= 299) continue;   // ignore empty and too long variable names
-					trace ("found %ld", (long) (q - p - 1));
+					trace (U"found ", q - p - 1);
 					/*
 					 * Found a right quote. Get potential variable name.
 					 */
 					for (r = p + 1, s = varName; q - r > 0; r ++, s ++) *s = *r;
-					*s = '\0';   /* Trailing null byte. */
-					colon = wcschr (varName, ':');
+					*s = U'\0';   /* Trailing null byte. */
+					colon = str32chr (varName, U':');
 					if (colon) {
-						precision = wcstol (colon + 1, NULL, 10);
-						if (wcschr (colon + 1, '%')) percent = TRUE;
+						precision = a32tol (colon + 1);
+						if (str32chr (colon + 1, U'%')) percent = true;
 						*colon = '\0';
 					}
 					InterpreterVariable var = Interpreter_hasVariable (me, varName);
@@ -883,113 +951,113 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 						 * Found a variable (p points to the left quote, q to the right quote). Substitute.
 						 */
 						int headlen = p - command2.string;
-						const wchar_t *string = var -> stringValue ? var -> stringValue :
+						const char32 *string = var -> stringValue ? var -> stringValue :
 							percent ? Melder_percent (var -> numericValue, precision) :
 							precision >= 0 ?  Melder_fixed (var -> numericValue, precision) :
 							Melder_double (var -> numericValue);
-						int arglen = wcslen (string);
+						int arglen = str32len (string);
 						MelderString_ncopy (& buffer, command2.string, headlen);
 						MelderString_append (& buffer, string, q + 1);
 						MelderString_copy (& command2, buffer.string);   // This invalidates p!! (really bad bug 20070203)
 						p = command2.string + headlen + arglen - 1;
 					} else {
-						p = q - 1;   /* Go to before next quote. */
+						p = q - 1;   // go to before next quote
 					}
 				}
-				trace ("resume");
-				c0 = command2.string [0];   /* Resume in order to allow things like 'c$' = 5 */
-				if ((c0 < 'a' || c0 > 'z') && c0 != '@' && ! (c0 == '.' && command2.string [1] >= 'a' && command2.string [1] <= 'z')) {
+				trace (U"resume");
+				c0 = command2.string [0];   // resume in order to allow things like 'c$' = 5
+				if ((c0 < U'a' || c0 > U'z') && c0 != U'@' && ! (c0 == U'.' && command2.string [1] >= U'a' && command2.string [1] <= U'z')) {
 					praat_executeCommand (me, command2.string);
 				/*
 				 * Interpret control flow and variables.
 				 */
 				} else switch (c0) {
-					case '.':
-						fail = TRUE;
+					case U'.':
+						fail = true;
 						break;
-					case '@':
+					case U'@':
 					{
 						/*
 						 * This is a function call.
 						 * Look for a function name.
 						 */
-						wchar_t *p = command2.string + 1;
-						while (*p == ' ' || *p == '\t') p ++;   // skip whitespace
-						wchar_t *callName = p;
-						while (*p != '\0' && *p != ' ' && *p != '\t' && *p != '(' && *p != ':') p ++;
-						if (p == callName) Melder_throw ("Missing procedure name after \"@\".");
-						bool hasArguments = ( *p != '\0' );
+						char32 *p = command2.string + 1;
+						while (*p == U' ' || *p == U'\t') p ++;   // skip whitespace
+						char32 *callName = p;
+						while (*p != U'\0' && *p != U' ' && *p != U'\t' && *p != U'(' && *p != U':') p ++;
+						if (p == callName) Melder_throw (U"Missing procedure name after \"@\".");
+						bool hasArguments = ( *p != U'\0' );
 						if (hasArguments) {
-							bool parenthesisOrColonFound = ( *p == '(' || *p == ':' );
-							*p = '\0';   // close procedure name
+							bool parenthesisOrColonFound = ( *p == U'(' || *p == U':' );
+							*p = U'\0';   // close procedure name
 							if (! parenthesisOrColonFound) {
 								p ++;   // step over first white space
-								while (*p != '\0' && (*p == ' ' || *p == '\t')) p ++;   // skip more whitespace
-								hasArguments = ( *p != '\0' );
-								parenthesisOrColonFound = ( *p == '(' || *p == ':' );
+								while (*p != U'\0' && (*p == U' ' || *p == U'\t')) p ++;   // skip more whitespace
+								hasArguments = ( *p != U'\0' );
+								parenthesisOrColonFound = ( *p == U'(' || *p == U':' );
 								if (hasArguments && ! parenthesisOrColonFound)
-									Melder_throw ("Missing parenthesis or colon after procedure name \"", callName, "\".");
+									Melder_throw (U"Missing parenthesis or colon after procedure name \"", callName, U"\".");
 							}
 							p ++;   // step over parenthesis or colon
 						}
-						int callLength = wcslen (callName);
+						int64 callLength = str32len (callName);
 						long iline = 1;
 						for (; iline <= numberOfLines; iline ++) {
-							wchar_t *linei = lines [iline], *q;
-							if (linei [0] != 'p' || linei [1] != 'r' || linei [2] != 'o' || linei [3] != 'c' ||
-								linei [4] != 'e' || linei [5] != 'd' || linei [6] != 'u' || linei [7] != 'r' ||
-								linei [8] != 'e' || linei [9] != ' ') continue;
+							char32 *linei = lines [iline], *q;
+							if (linei [0] != U'p' || linei [1] != U'r' || linei [2] != U'o' || linei [3] != U'c' ||
+								linei [4] != U'e' || linei [5] != U'd' || linei [6] != U'u' || linei [7] != U'r' ||
+								linei [8] != U'e' || linei [9] != U' ') continue;
 							q = lines [iline] + 10;
-							while (*q == ' ' || *q == '\t') q ++;   // skip whitespace before procedure name
-							wchar_t *procName = q;
-							while (*q != '\0' && *q != ' ' && *q != '\t' && *q != '(' && *q != ':') q ++;
-							if (q == procName) Melder_throw ("Missing procedure name after 'procedure'.");
-							if (q - procName == callLength && wcsnequ (procName, callName, callLength)) {
+							while (*q == U' ' || *q == U'\t') q ++;   // skip whitespace before procedure name
+							char32 *procName = q;
+							while (*q != U'\0' && *q != U' ' && *q != U'\t' && *q != U'(' && *q != U':') q ++;
+							if (q == procName) Melder_throw (U"Missing procedure name after 'procedure'.");
+							if (q - procName == callLength && str32nequ (procName, callName, callLength)) {
 								/*
 								 * We found the procedure definition.
 								 */
 								if (++ my callDepth > Interpreter_MAX_CALL_DEPTH)
-									Melder_throw ("Call depth greater than ", Interpreter_MAX_CALL_DEPTH, ".");
-								wcscpy (my procedureNames [my callDepth], callName);
-								bool parenthesisOrColonFound = ( *q == '(' || *q == ':' );
+									Melder_throw (U"Call depth greater than ", Interpreter_MAX_CALL_DEPTH, U".");
+								str32cpy (my procedureNames [my callDepth], callName);
+								bool parenthesisOrColonFound = ( *q == U'(' || *q == U':' );
 								if (*q) q ++;   // step over parenthesis or colon or first white space
 								if (! parenthesisOrColonFound) {
-									while (*q == ' ' || *q == '\t') q ++;   // skip more whitespace
-									if (*q == '(' || *q == ':') q ++;   // step over parenthesis or colon
+									while (*q == U' ' || *q == U'\t') q ++;   // skip more whitespace
+									if (*q == U'(' || *q == U':') q ++;   // step over parenthesis or colon
 								}
-								while (*q && *q != ')') {
-									static MelderString argument = { 0 };
+								while (*q && *q != U')') {
+									static MelderString argument { 0 };
 									MelderString_empty (& argument);
-									while (*p == ' ' || *p == '\t') p ++;
-									while (*q == ' ' || *q == '\t') q ++;
-									wchar_t *parameterName = q;
-									while (*q != '\0' && *q != ' ' && *q != '\t' && *q != ',' && *q != ')') q ++;   // collect parameter name
+									while (*p == U' ' || *p == U'\t') p ++;
+									while (*q == U' ' || *q == U'\t') q ++;
+									char32 *parameterName = q;
+									while (*q != U'\0' && *q != U' ' && *q != U'\t' && *q != U',' && *q != U')') q ++;   // collect parameter name
 									int expressionDepth = 0;
 									for (; *p; p ++) {
-										if (*p == ',') {
+										if (*p == U',') {
 											if (expressionDepth == 0) break;   // depth-0 comma ends expression
-											MelderString_appendCharacter (& argument, ',');
-										} else if (*p == ')') {
+											MelderString_appendCharacter (& argument, U',');
+										} else if (*p == U')') {
 											if (expressionDepth == 0) break;   // depth-0 closing parenthesis ends expression
 											expressionDepth --;
-											MelderString_appendCharacter (& argument, ')');
-										} else if (*p == '(') {
+											MelderString_appendCharacter (& argument, U')');
+										} else if (*p == U'(') {
 											expressionDepth ++;
-											MelderString_appendCharacter (& argument, '(');
-										} else if (*p == '\"') {
+											MelderString_appendCharacter (& argument, U'(');
+										} else if (*p == U'\"') {
 											/*
 											 * Enter a string literal.
 											 */
-											MelderString_appendCharacter (& argument, '\"');
+											MelderString_appendCharacter (& argument, U'\"');
 											p ++;
 											for (;; p ++) {
-												if (*p == '\0') {
-													Melder_throw (L"Incomplete string literal: the quotes don't match.");
-												} else if (*p == '\"') {
-													MelderString_appendCharacter (& argument, '\"');
+												if (*p == U'\0') {
+													Melder_throw (U"Incomplete string literal: the quotes don't match.");
+												} else if (*p == U'\"') {
+													MelderString_appendCharacter (& argument, U'\"');
 													if (p [1] == '\"') {
 														p ++;   // stay in the string literal
-														MelderString_appendCharacter (& argument, '\"');
+														MelderString_appendCharacter (& argument, U'\"');
 													} else {
 														break;
 													}
@@ -1002,13 +1070,13 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 										}
 									}
 									if (q == parameterName) break;
-									if (*p) { *p = '\0'; p ++; }
-									if (q [-1] == '$') {
-										wchar_t *value;
+									if (*p) { *p = U'\0'; p ++; }
+									if (q [-1] == U'$') {
+										char32 *value;
 										my callDepth --;
 										Interpreter_stringExpression (me, argument.string, & value);
 										my callDepth ++;
-										wchar_t save = *q; *q = '\0';
+										char32 save = *q; *q = U'\0';
 										InterpreterVariable var = Interpreter_lookUpVariable (me, parameterName); *q = save;
 										Melder_free (var -> stringValue);
 										var -> stringValue = value;
@@ -1017,96 +1085,97 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 										my callDepth --;
 										Interpreter_numericExpression (me, argument.string, & value);
 										my callDepth ++;
-										wchar_t save = *q; *q = '\0';
+										char32 save = *q; *q = U'\0';
 										InterpreterVariable var = Interpreter_lookUpVariable (me, parameterName); *q = save;
 										var -> numericValue = value;
 									}
 									if (*q) q ++;   // skip comma
 								}
 								if (callDepth == Interpreter_MAX_CALL_DEPTH)
-									Melder_throw ("Call depth greater than ", Interpreter_MAX_CALL_DEPTH, ".");
+									Melder_throw (U"Call depth greater than ", Interpreter_MAX_CALL_DEPTH, U".");
 								callStack [++ callDepth] = lineNumber;
 								lineNumber = iline;
 								break;
 							}
 						}
-						if (iline > numberOfLines) Melder_throw ("Procedure \"", callName, "\" not found.");
+						if (iline > numberOfLines) Melder_throw (U"Procedure \"", callName, U"\" not found.");
 						break;
 					}
-					case 'a':
-						if (wcsnequ (command2.string, L"assert ", 7)) {
+					case U'a':
+						if (str32nequ (command2.string, U"assert ", 7)) {
 							double value;
 							Interpreter_numericExpression (me, command2.string + 7, & value);
 							if (value == 0.0 || value == NUMundefined) {
-								assertionFailed = TRUE;
-								Melder_throw ("Script assertion fails in line ", lineNumber,
-									" (", value ? "undefined" : "false", "):\n   ", command2.string + 7);
+								assertionFailed = true;
+								Melder_throw (U"Script assertion fails in line ", lineNumber,
+									U" (", value == 0.0 ? U"false" : U"undefined", U"):\n   ", command2.string + 7);
 							}
-						} else if (wcsnequ (command2.string, L"asserterror ", 12)) {
+						} else if (str32nequ (command2.string, U"asserterror ", 12)) {
 							MelderString_copy (& assertErrorString, command2.string + 12);
 							assertErrorLineNumber = lineNumber;
-						} else fail = TRUE;
+						} else fail = true;
 						break;
-					case 'b':
-						fail = TRUE;
+					case U'b':
+						fail = true;
 						break;
-					case 'c':
-						if (wcsnequ (command2.string, L"call ", 5)) {
-							wchar_t *p = command2.string + 5, *callName, *procName;
+					case U'c':
+						if (str32nequ (command2.string, U"call ", 5)) {
+							char32 *p = command2.string + 5, *callName, *procName;
 							long iline;
-							int hasArguments, callLength;
-							while (*p == ' ' || *p == '\t') p ++;   // skip whitespace
+							bool hasArguments;
+							int64 callLength;
+							while (*p == U' ' || *p == U'\t') p ++;   // skip whitespace
 							callName = p;
-							while (*p != '\0' && *p != ' ' && *p != '\t' && *p != '(' && *p != ':') p ++;
-							if (p == callName) Melder_throw ("Missing procedure name after 'call'.");
-							hasArguments = *p != '\0';
-							*p = '\0';   /* Close procedure name. */
-							callLength = wcslen (callName);
+							while (*p != U'\0' && *p != U' ' && *p != U'\t' && *p != U'(' && *p != U':') p ++;
+							if (p == callName) Melder_throw (U"Missing procedure name after 'call'.");
+							hasArguments = *p != U'\0';
+							*p = U'\0';   // close procedure name
+							callLength = str32len (callName);
 							for (iline = 1; iline <= numberOfLines; iline ++) {
-								wchar_t *linei = lines [iline], *q;
+								char32 *linei = lines [iline], *q;
 								int hasParameters;
-								if (linei [0] != 'p' || linei [1] != 'r' || linei [2] != 'o' || linei [3] != 'c' ||
-									linei [4] != 'e' || linei [5] != 'd' || linei [6] != 'u' || linei [7] != 'r' ||
-									linei [8] != 'e' || linei [9] != ' ') continue;
+								if (linei [0] != U'p' || linei [1] != U'r' || linei [2] != U'o' || linei [3] != U'c' ||
+									linei [4] != U'e' || linei [5] != U'd' || linei [6] != U'u' || linei [7] != U'r' ||
+									linei [8] != U'e' || linei [9] != U' ') continue;
 								q = lines [iline] + 10;
-								while (*q == ' ' || *q == '\t') q ++;
+								while (*q == U' ' || *q == U'\t') q ++;
 								procName = q;
-								while (*q != '\0' && *q != ' ' && *q != '\t' && *q != '(' && *q != ':') q ++;
-								if (q == procName) Melder_throw ("Missing procedure name after 'procedure'.");
-								hasParameters = *q != '\0';
-								if (q - procName == callLength && wcsnequ (procName, callName, callLength)) {
+								while (*q != U'\0' && *q != U' ' && *q != U'\t' && *q != U'(' && *q != U':') q ++;
+								if (q == procName) Melder_throw (U"Missing procedure name after 'procedure'.");
+								hasParameters = *q != U'\0';
+								if (q - procName == callLength && str32nequ (procName, callName, callLength)) {
 									if (hasArguments && ! hasParameters)
-										Melder_throw ("Call to procedure \"", callName, "\" has too many arguments.");
+										Melder_throw (U"Call to procedure \"", callName, U"\" has too many arguments.");
 									if (hasParameters && ! hasArguments)
-										Melder_throw ("Call to procedure \"", callName, "\" has too few arguments.");
+										Melder_throw (U"Call to procedure \"", callName, U"\" has too few arguments.");
 									if (++ my callDepth > Interpreter_MAX_CALL_DEPTH)
-										Melder_throw ("Call depth greater than ", Interpreter_MAX_CALL_DEPTH, ".");
-									wcscpy (my procedureNames [my callDepth], callName);
+										Melder_throw (U"Call depth greater than ", Interpreter_MAX_CALL_DEPTH, U".");
+									str32cpy (my procedureNames [my callDepth], callName);
 									if (hasParameters) {
-										bool parenthesisOrColonFound = ( *q == '(' || *q == ':' );
+										bool parenthesisOrColonFound = ( *q == U'(' || *q == U':' );
 										q ++;   // step over parenthesis or colon or first white space
 										if (! parenthesisOrColonFound) {
-											while (*q == ' ' || *q == '\t') q ++;   // skip more whitespace
-											if (*q == '(' || *q == ':') q ++;   // step over parenthesis or colon
+											while (*q == U' ' || *q == U'\t') q ++;   // skip more whitespace
+											if (*q == U'(' || *q == U':') q ++;   // step over parenthesis or colon
 										}
-										++ p;   /* First argument. */
+										++ p;   // first argument
 										while (*q && *q != ')') {
-											wchar_t *par, save;
-											static MelderString arg = { 0 };
+											char32 *par, save;
+											static MelderString arg { 0 };
 											MelderString_empty (& arg);
-											while (*p == ' ' || *p == '\t') p ++;
-											while (*q == ' ' || *q == '\t' || *q == ',' || *q == ')') q ++;
+											while (*p == U' ' || *p == U'\t') p ++;
+											while (*q == U' ' || *q == U'\t' || *q == U',' || *q == U')') q ++;
 											par = q;
-											while (*q != '\0' && *q != ' ' && *q != '\t' && *q != ',' && *q != ')') q ++;   /* Collect parameter name. */
-											if (*q) {   /* Does anything follow the parameter name? */
-												if (*p == '\"') {
-													p ++;   /* Skip initial quote. */
-													while (*p != '\0') {
-														if (*p == '\"') {   /* Quote signals end-of-string or string-internal quote. */
-															if (p [1] == '\"') {   /* Double quote signals string-internal quote. */
-																MelderString_appendCharacter (& arg, '\"');
-																p += 2;   /* Skip second quote. */
-															} else {   /* Single quote signals end-of-string. */
+											while (*q != U'\0' && *q != U' ' && *q != U'\t' && *q != U',' && *q != U')') q ++;   // collect parameter name
+											if (*q) {   // does anything follow the parameter name?
+												if (*p == U'\"') {
+													p ++;   // skip initial quote
+													while (*p != U'\0') {
+														if (*p == U'\"') {   // quote signals end-of-string or string-internal quote
+															if (p [1] == U'\"') {   // double quote signals string-internal quote
+																MelderString_appendCharacter (& arg, U'\"');
+																p += 2;   // skip second quote
+															} else {   // single quote signals end-of-string
 																break;
 															}
 														} else {
@@ -1114,155 +1183,155 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 														}
 													}
 												} else {
-													while (*p != '\0' && *p != ' ' && *p != '\t')
-														MelderString_appendCharacter (& arg, *p ++);   /* White space separates. */
+													while (*p != U'\0' && *p != U' ' && *p != U'\t')
+														MelderString_appendCharacter (& arg, *p ++);   // white space separates
 												}
-												if (*p) { *p = '\0'; p ++; }
-											} else {   /* Else rest of line. */
+												if (*p) { *p = U'\0'; p ++; }
+											} else {   // else rest of line
 												while (*p != '\0')
 													MelderString_appendCharacter (& arg, *p ++);
 											}
 											if (q [-1] == '$') {
-												save = *q; *q = '\0';
+												save = *q; *q = U'\0';
 												InterpreterVariable var = Interpreter_lookUpVariable (me, par); *q = save;
 												Melder_free (var -> stringValue);
-												var -> stringValue = Melder_wcsdup_f (arg.string);
+												var -> stringValue = Melder_dup_f (arg.string);
 											} else {
 												double value;
 												my callDepth --;
 												Interpreter_numericExpression (me, arg.string, & value);
 												my callDepth ++;
-												save = *q; *q = '\0'; 
+												save = *q; *q = U'\0';
 												InterpreterVariable var = Interpreter_lookUpVariable (me, par); *q = save;
 												var -> numericValue = value;
 											}
 										}
 									}
 									if (callDepth == Interpreter_MAX_CALL_DEPTH)
-										Melder_throw ("Call depth greater than ", Interpreter_MAX_CALL_DEPTH, ".");
+										Melder_throw (U"Call depth greater than ", Interpreter_MAX_CALL_DEPTH, U".");
 									callStack [++ callDepth] = lineNumber;
 									lineNumber = iline;
 									break;
 								}
 							}
-							if (iline > numberOfLines) Melder_throw ("Procedure \"", callName, "\" not found.");
-						} else fail = TRUE;
+							if (iline > numberOfLines) Melder_throw (U"Procedure \"", callName, U"\" not found.");
+						} else fail = true;
 						break;
-					case 'd':
-						if (wcsnequ (command2.string, L"dec ", 4)) {
+					case U'd':
+						if (str32nequ (command2.string, U"dec ", 4)) {
 							InterpreterVariable var = Interpreter_lookUpVariable (me, command2.string + 4);
 							var -> numericValue -= 1.0;
-						} else fail = TRUE;
+						} else fail = true;
 						break;
-					case 'e':
+					case U'e':
 						if (command2.string [1] == 'n' && command2.string [2] == 'd') {
-							if (wcsnequ (command2.string, L"endif", 5) && wordEnd (command2.string [5])) {
+							if (str32nequ (command2.string, U"endif", 5) && wordEnd (command2.string [5])) {
 								/* Ignore. */
-							} else if (wcsnequ (command2.string, L"endfor", 6) && wordEnd (command2.string [6])) {
+							} else if (str32nequ (command2.string, U"endfor", 6) && wordEnd (command2.string [6])) {
 								int depth = 0;
 								long iline;
 								for (iline = lineNumber - 1; iline > 0; iline --) {
-									wchar_t *line = lines [iline];
-									if (line [0] == 'f' && line [1] == 'o' && line [2] == 'r' && line [3] == ' ') {
-										if (depth == 0) { lineNumber = iline - 1; fromendfor = TRUE; break; }   /* Go before 'for'. */
+									char32 *line = lines [iline];
+									if (line [0] == U'f' && line [1] == U'o' && line [2] == U'r' && line [3] == U' ') {
+										if (depth == 0) { lineNumber = iline - 1; fromendfor = true; break; }   // go before 'for'
 										else depth --;
-									} else if (wcsnequ (lines [iline], L"endfor", 6) && wordEnd (lines [iline] [6])) {
+									} else if (str32nequ (lines [iline], U"endfor", 6) && wordEnd (lines [iline] [6])) {
 										depth ++;
 									}
 								}
-								if (iline <= 0) Melder_throw ("Unmatched 'endfor'.");
-							} else if (wcsnequ (command2.string, L"endwhile", 8) && wordEnd (command2.string [8])) {
+								if (iline <= 0) Melder_throw (U"Unmatched 'endfor'.");
+							} else if (str32nequ (command2.string, U"endwhile", 8) && wordEnd (command2.string [8])) {
 								int depth = 0;
 								long iline;
 								for (iline = lineNumber - 1; iline > 0; iline --) {
-									if (wcsnequ (lines [iline], L"while ", 6)) {
-										if (depth == 0) { lineNumber = iline - 1; break; }   /* Go before 'while'. */
+									if (str32nequ (lines [iline], U"while ", 6)) {
+										if (depth == 0) { lineNumber = iline - 1; break; }   // go before 'while'
 										else depth --;
-									} else if (wcsnequ (lines [iline], L"endwhile", 8) && wordEnd (lines [iline] [8])) {
+									} else if (str32nequ (lines [iline], U"endwhile", 8) && wordEnd (lines [iline] [8])) {
 										depth ++;
 									}
 								}
-								if (iline <= 0) Melder_throw ("Unmatched 'endwhile'.");
-							} else if (wcsnequ (command2.string, L"endproc", 7) && wordEnd (command2.string [7])) {
-								if (callDepth == 0) Melder_throw ("Unmatched 'endproc'.");
+								if (iline <= 0) Melder_throw (U"Unmatched 'endwhile'.");
+							} else if (str32nequ (command2.string, U"endproc", 7) && wordEnd (command2.string [7])) {
+								if (callDepth == 0) Melder_throw (U"Unmatched 'endproc'.");
 								lineNumber = callStack [callDepth --];
 								-- my callDepth;
-							} else fail = TRUE;
-						} else if (wcsnequ (command2.string, L"else", 4) && wordEnd (command2.string [4])) {
+							} else fail = true;
+						} else if (str32nequ (command2.string, U"else", 4) && wordEnd (command2.string [4])) {
 							int depth = 0;
 							long iline;
 							for (iline = lineNumber + 1; iline <= numberOfLines; iline ++) {
-								if (wcsnequ (lines [iline], L"endif", 5) && wordEnd (lines [iline] [5])) {
-									if (depth == 0) { lineNumber = iline; break; }   /* Go after 'endif'. */
+								if (str32nequ (lines [iline], U"endif", 5) && wordEnd (lines [iline] [5])) {
+									if (depth == 0) { lineNumber = iline; break; }   // go after 'endif'
 									else depth --;
-								} else if (wcsnequ (lines [iline], L"if ", 3)) {
+								} else if (str32nequ (lines [iline], U"if ", 3)) {
 									depth ++;
 								}
 							}
-							if (iline > numberOfLines) Melder_throw ("Unmatched 'else'.");
-						} else if (wcsnequ (command2.string, L"elsif ", 6) || wcsnequ (command2.string, L"elif ", 5)) {
+							if (iline > numberOfLines) Melder_throw (U"Unmatched 'else'.");
+						} else if (str32nequ (command2.string, U"elsif ", 6) || str32nequ (command2.string, U"elif ", 5)) {
 							if (fromif) {
 								double value;
-								fromif = FALSE;
+								fromif = false;
 								Interpreter_numericExpression (me, command2.string + 5, & value);
 								if (value == 0.0) {
 									int depth = 0;
 									long iline;
 									for (iline = lineNumber + 1; iline <= numberOfLines; iline ++) {
-										if (wcsnequ (lines [iline], L"endif", 5) && wordEnd (lines [iline] [5])) {
-											if (depth == 0) { lineNumber = iline; break; }   /* Go after 'endif'. */
+										if (str32nequ (lines [iline], U"endif", 5) && wordEnd (lines [iline] [5])) {
+											if (depth == 0) { lineNumber = iline; break; }   // go after 'endif'
 											else depth --;
-										} else if (wcsnequ (lines [iline], L"else", 4) && wordEnd (lines [iline] [4])) {
-											if (depth == 0) { lineNumber = iline; break; }   /* Go after 'else'. */
-										} else if ((wcsnequ (lines [iline], L"elsif", 5) && wordEnd (lines [iline] [5]))
-											|| (wcsnequ (lines [iline], L"elif", 4) && wordEnd (lines [iline] [4]))) {
-											if (depth == 0) { lineNumber = iline - 1; fromif = TRUE; break; }   /* Go at next 'elsif' or 'elif'. */
-										} else if (wcsnequ (lines [iline], L"if ", 3)) {
+										} else if (str32nequ (lines [iline], U"else", 4) && wordEnd (lines [iline] [4])) {
+											if (depth == 0) { lineNumber = iline; break; }   // go after 'else'
+										} else if ((str32nequ (lines [iline], U"elsif", 5) && wordEnd (lines [iline] [5]))
+											|| (str32nequ (lines [iline], U"elif", 4) && wordEnd (lines [iline] [4]))) {
+											if (depth == 0) { lineNumber = iline - 1; fromif = true; break; }   // go at next 'elsif' or 'elif'
+										} else if (str32nequ (lines [iline], U"if ", 3)) {
 											depth ++;
 										}
 									}
-									if (iline > numberOfLines) Melder_throw ("Unmatched 'elsif'.");
+									if (iline > numberOfLines) Melder_throw (U"Unmatched 'elsif'.");
 								}
 							} else {
 								int depth = 0;
 								long iline;
 								for (iline = lineNumber + 1; iline <= numberOfLines; iline ++) {
-									if (wcsnequ (lines [iline], L"endif", 5) && wordEnd (lines [iline] [5])) {
+									if (str32nequ (lines [iline], U"endif", 5) && wordEnd (lines [iline] [5])) {
 										if (depth == 0) { lineNumber = iline; break; }   /* Go after 'endif'. */
 										else depth --;
-									} else if (wcsnequ (lines [iline], L"if ", 3)) {
+									} else if (str32nequ (lines [iline], U"if ", 3)) {
 										depth ++;
 									}
 								}
-								if (iline > numberOfLines) Melder_throw ("'elsif' not matched with 'endif'.");
+								if (iline > numberOfLines) Melder_throw (U"'elsif' not matched with 'endif'.");
 							}
-						} else if (wcsnequ (command2.string, L"exit", 4)) {
-							if (command2.string [4] == '\0') {
+						} else if (str32nequ (command2.string, U"exit", 4)) {
+							if (command2.string [4] == U'\0') {
 								lineNumber = numberOfLines;   /* Go after end. */
-							} else if (command2.string [4] == ' ') {
+							} else if (command2.string [4] == U' ') {
 								Melder_throw (command2.string + 5);
-							} else fail = TRUE;
-						} else if (wcsnequ (command2.string, L"echo ", 5)) {
+							} else fail = true;
+						} else if (str32nequ (command2.string, U"echo ", 5)) {
 							/*
 							 * Make sure that lines like "echo = 3" will not be regarded as assignments.
 							 */
 							praat_executeCommand (me, command2.string);
-						} else fail = TRUE;
+						} else fail = true;
 						break;
-					case 'f':
-						if (command2.string [1] == 'o' && command2.string [2] == 'r' && command2.string [3] == ' ') {   /* for_ */
+					case U'f':
+						if (command2.string [1] == U'o' && command2.string [2] == U'r' && command2.string [3] == U' ') {   // for_
 							double toValue, loopVariable;
-							wchar_t *frompos = wcsstr (command2.string, L" from "), *topos = wcsstr (command2.string, L" to ");
-							wchar_t *varpos = command2.string + 4, *endvar = frompos;
-							if (! topos) Melder_throw ("Missing \'to\' in \'for\' loop.");
+							char32 *frompos = str32str (command2.string, U" from "), *topos = str32str (command2.string, U" to ");
+							char32 *varpos = command2.string + 4, *endvar = frompos;
+							if (! topos) Melder_throw (U"Missing \'to\' in \'for\' loop.");
 							if (! endvar) endvar = topos;
-							while (*endvar == ' ') { *endvar = '\0'; endvar --; }
-							while (*varpos == ' ') varpos ++;
-							if (endvar - varpos < 0) Melder_throw ("Missing loop variable after \'for\'.");
+							while (*endvar == U' ') { *endvar = '\0'; endvar --; }
+							while (*varpos == U' ') varpos ++;
+							if (endvar - varpos < 0) Melder_throw (U"Missing loop variable after \'for\'.");
 							InterpreterVariable var = Interpreter_lookUpVariable (me, varpos);
 							Interpreter_numericExpression (me, topos + 4, & toValue);
 							if (fromendfor) {
-								fromendfor = FALSE;
+								fromendfor = false;
 								loopVariable = var -> numericValue + 1.0;
 							} else if (frompos) {
 								*topos = '\0';
@@ -1275,177 +1344,178 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 								int depth = 0;
 								long iline;
 								for (iline = lineNumber + 1; iline <= numberOfLines; iline ++) {
-									if (wcsnequ (lines [iline], L"endfor", 6)) {
-										if (depth == 0) { lineNumber = iline; break; }   /* Go after 'endfor'. */
+									if (str32nequ (lines [iline], U"endfor", 6)) {
+										if (depth == 0) { lineNumber = iline; break; }   // go after 'endfor'
 										else depth --;
-									} else if (wcsnequ (lines [iline], L"for ", 4)) {
+									} else if (str32nequ (lines [iline], U"for ", 4)) {
 										depth ++;
 									}
 								}
-								if (iline > numberOfLines) Melder_throw ("Unmatched 'for'.");
+								if (iline > numberOfLines) Melder_throw (U"Unmatched 'for'.");
 							}
-						} else if (wcsnequ (command2.string, L"form ", 5)) {
+						} else if (str32nequ (command2.string, U"form ", 5)) {
 							long iline;
 							for (iline = lineNumber + 1; iline <= numberOfLines; iline ++)
-								if (wcsnequ (lines [iline], L"endform", 7))
-									{ lineNumber = iline; break; }   /* Go after 'endform'. */
-							if (iline > numberOfLines) Melder_throw ("Unmatched 'form'.");
-						} else fail = TRUE;
+								if (str32nequ (lines [iline], U"endform", 7))
+									{ lineNumber = iline; break; }   // go after 'endform'
+							if (iline > numberOfLines) Melder_throw (U"Unmatched 'form'.");
+						} else fail = true;
 						break;
-					case 'g':
-						if (wcsnequ (command2.string, L"goto ", 5)) {
-							wchar_t labelName [50], *space;
-							int dojump = TRUE, ilabel;
-							swprintf (labelName, 50, L"%.47ls", command2.string + 5);
-							space = wcschr (labelName, ' ');
-							if (space == labelName) Melder_throw ("Missing label name after 'goto'.");
+					case U'g':
+						if (str32nequ (command2.string, U"goto ", 5)) {
+							char32 labelName [1+Interpreter_MAX_LABEL_LENGTH];
+							str32ncpy (labelName, command2.string + 5, 1+Interpreter_MAX_LABEL_LENGTH);
+							labelName [Interpreter_MAX_LABEL_LENGTH] = U'\0';
+							char32 *space = str32chr (labelName, U' ');
+							if (space == labelName) Melder_throw (U"Missing label name after 'goto'.");
+							bool dojump = true;
 							if (space) {
 								double value;
 								*space = '\0';
-								Interpreter_numericExpression (me, command2.string + 6 + wcslen (labelName), & value);
-								if (value == 0.0) dojump = FALSE;
+								Interpreter_numericExpression (me, command2.string + 6 + str32len (labelName), & value);
+								if (value == 0.0) dojump = false;
 							}
 							if (dojump) {
-								ilabel = lookupLabel (me, labelName);
+								int ilabel = lookupLabel (me, labelName);
 								lineNumber = my labelLines [ilabel];   // loop will add 1
 							}
-						} else fail = TRUE;
+						} else fail = true;
 						break;
-					case 'h':
-						fail = TRUE;
+					case U'h':
+						fail = true;
 						break;
-					case 'i':
-						if (command2.string [1] == 'f' && command2.string [2] == ' ') {   /* if_ */
+					case U'i':
+						if (command2.string [1] == U'f' && command2.string [2] == U' ') {   // if_
 							double value;
 							Interpreter_numericExpression (me, command2.string + 3, & value);
 							if (value == 0.0) {
 								int depth = 0;
 								long iline;
 								for (iline = lineNumber + 1; iline <= numberOfLines; iline ++) {
-									if (wcsnequ (lines [iline], L"endif", 5)) {
-										if (depth == 0) { lineNumber = iline; break; }   /* Go after 'endif'. */
+									if (str32nequ (lines [iline], U"endif", 5)) {
+										if (depth == 0) { lineNumber = iline; break; }   // go after 'endif'
 										else depth --;
-									} else if (wcsnequ (lines [iline], L"else", 4)) {
-										if (depth == 0) { lineNumber = iline; break; }   /* Go after 'else'. */
-									} else if (wcsnequ (lines [iline], L"elsif ", 6) || wcsnequ (lines [iline], L"elif ", 5)) {
-										if (depth == 0) { lineNumber = iline - 1; fromif = TRUE; break; }   /* Go at 'elsif'. */
-									} else if (wcsnequ (lines [iline], L"if ", 3)) {
+									} else if (str32nequ (lines [iline], U"else", 4)) {
+										if (depth == 0) { lineNumber = iline; break; }   // go after 'else'
+									} else if (str32nequ (lines [iline], U"elsif ", 6) || str32nequ (lines [iline], U"elif ", 5)) {
+										if (depth == 0) { lineNumber = iline - 1; fromif = true; break; }   // go at 'elsif'
+									} else if (str32nequ (lines [iline], U"if ", 3)) {
 										depth ++;
 									}
 								}
-								if (iline > numberOfLines) Melder_throw ("Unmatched 'if'.");
+								if (iline > numberOfLines) Melder_throw (U"Unmatched 'if'.");
 							} else if (value == NUMundefined) {
-								Melder_throw ("The value of the 'if' condition is undefined.");
+								Melder_throw (U"The value of the 'if' condition is undefined.");
 							}
-						} else if (wcsnequ (command2.string, L"inc ", 4)) {
+						} else if (str32nequ (command2.string, U"inc ", 4)) {
 							InterpreterVariable var = Interpreter_lookUpVariable (me, command2.string + 4);
 							var -> numericValue += 1.0;
-						} else fail = TRUE;
+						} else fail = true;
 						break;
-					case 'j':
-						fail = TRUE;
+					case U'j':
+						fail = true;
 						break;
-					case 'k':
-						fail = TRUE;
+					case U'k':
+						fail = true;
 						break;
-					case 'l':
-						if (wcsnequ (command2.string, L"label ", 6)) {
-							;   /* Ignore labels. */
-						} else fail = TRUE;
+					case U'l':
+						if (str32nequ (command2.string, U"label ", 6)) {
+							;   // ignore labels
+						} else fail = true;
 						break;
-					case 'm':
-						fail = TRUE;
+					case U'm':
+						fail = true;
 						break;
-					case 'n':
-						fail = TRUE;
+					case U'n':
+						fail = true;
 						break;
-					case 'o':
-						fail = TRUE;
+					case U'o':
+						fail = true;
 						break;
-					case 'p':
-						if (wcsnequ (command2.string, L"procedure ", 10)) {
+					case U'p':
+						if (str32nequ (command2.string, U"procedure ", 10)) {
 							long iline = lineNumber + 1;
 							for (; iline <= numberOfLines; iline ++) {
-								if (wcsnequ (lines [iline], L"endproc", 7) && wordEnd (lines [iline] [7])) {
+								if (str32nequ (lines [iline], U"endproc", 7) && wordEnd (lines [iline] [7])) {
 									lineNumber = iline;
 									break;
-								}   /* Go after 'endproc'. */
+								}   // go after 'endproc'
 							}
-							if (iline > numberOfLines) Melder_throw ("Unmatched 'proc'.");
-						} else if (wcsnequ (command2.string, L"print", 5)) {
+							if (iline > numberOfLines) Melder_throw (U"Unmatched 'proc'.");
+						} else if (str32nequ (command2.string, U"print", 5)) {
 							/*
-							 * Make sure that lines like "print = 3" will not be regarded as assingments.
+							 * Make sure that lines like "print = 3" will not be regarded as assignments.
 							 */
-							if (command2.string [5] == ' ' || (wcsnequ (command2.string + 5, L"line", 4) && (command2.string [9] == ' ' || command2.string [9] == '\0'))) {
+							if (command2.string [5] == U' ' || (str32nequ (command2.string + 5, U"line", 4) && (command2.string [9] == U' ' || command2.string [9] == U'\0'))) {
 								praat_executeCommand (me, command2.string);
-							} else fail = TRUE;
-						} else fail = TRUE;
+							} else fail = true;
+						} else fail = true;
 						break;
-					case 'q':
-						fail = TRUE;
+					case U'q':
+						fail = true;
 						break;
-					case 'r':
-						if (wcsnequ (command2.string, L"repeat", 6) && wordEnd (command2.string [6])) {
+					case U'r':
+						if (str32nequ (command2.string, U"repeat", 6) && wordEnd (command2.string [6])) {
 							/* Ignore. */
-						} else fail = TRUE;
+						} else fail = true;
 						break;
-					case 's':
-						if (wcsnequ (command2.string, L"stopwatch", 9) && wordEnd (command2.string [9])) {
+					case U's':
+						if (str32nequ (command2.string, U"stopwatch", 9) && wordEnd (command2.string [9])) {
 							(void) Melder_stopwatch ();   /* Reset stopwatch. */
-						} else fail = TRUE;
+						} else fail = true;
 						break;
-					case 't':
-						fail = TRUE;
+					case U't':
+						fail = true;
 						break;
-					case 'u':
-						if (wcsnequ (command2.string, L"until ", 6)) {
+					case U'u':
+						if (str32nequ (command2.string, U"until ", 6)) {
 							double value;
 							Interpreter_numericExpression (me, command2.string + 6, & value);
 							if (value == 0.0) {
 								int depth = 0;
 								long iline;
 								for (iline = lineNumber - 1; iline > 0; iline --) {
-									if (wcsnequ (lines [iline], L"repeat", 6) && wordEnd (lines [iline] [6])) {
-										if (depth == 0) { lineNumber = iline; break; }   /* Go after 'repeat'. */
+									if (str32nequ (lines [iline], U"repeat", 6) && wordEnd (lines [iline] [6])) {
+										if (depth == 0) { lineNumber = iline; break; }   // go after 'repeat'
 										else depth --;
-									} else if (wcsnequ (lines [iline], L"until ", 6)) {
+									} else if (str32nequ (lines [iline], U"until ", 6)) {
 										depth ++;
 									}
 								}
-								if (iline <= 0) Melder_throw ("Unmatched 'until'.");
+								if (iline <= 0) Melder_throw (U"Unmatched 'until'.");
 							}
-						} else fail = TRUE;
+						} else fail = true;
 						break;
-					case 'v':
-						fail = TRUE;
+					case U'v':
+						fail = true;
 						break;
-					case 'w':
-						if (wcsnequ (command2.string, L"while ", 6)) {
+					case U'w':
+						if (str32nequ (command2.string, U"while ", 6)) {
 							double value;
 							Interpreter_numericExpression (me, command2.string + 6, & value);
 							if (value == 0.0) {
 								int depth = 0;
 								long iline;
 								for (iline = lineNumber + 1; iline <= numberOfLines; iline ++) {
-									if (wcsnequ (lines [iline], L"endwhile", 8) && wordEnd (lines [iline] [8])) {
-										if (depth == 0) { lineNumber = iline; break; }   /* Go after 'endwhile'. */
+									if (str32nequ (lines [iline], U"endwhile", 8) && wordEnd (lines [iline] [8])) {
+										if (depth == 0) { lineNumber = iline; break; }   // go after 'endwhile'
 										else depth --;
-									} else if (wcsnequ (lines [iline], L"while ", 6)) {
+									} else if (str32nequ (lines [iline], U"while ", 6)) {
 										depth ++;
 									}
 								}
-								if (iline > numberOfLines) Melder_throw ("Unmatched 'while'.");
+								if (iline > numberOfLines) Melder_throw (U"Unmatched 'while'.");
 							}
-						} else fail = TRUE;
+						} else fail = true;
 						break;
-					case 'x':
-						fail = TRUE;
+					case U'x':
+						fail = true;
 						break;
-					case 'y':
-						fail = TRUE;
+					case U'y':
+						fail = true;
 						break;
-					case 'z':
-						fail = TRUE;
+					case U'z':
+						fail = true;
 						break;
 					default: break;
 				}
@@ -1454,92 +1524,91 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 					 * Found an unknown word starting with a lower-case letter, optionally preceded by a period.
 					 * See whether the word is a variable name.
 					 */
-					trace ("found an unknown word starting with a lower-case letter, optionally preceded by a period");
-					wchar_t *p = & command2.string [0];
+					trace (U"found an unknown word starting with a lower-case letter, optionally preceded by a period");
+					char32 *p = & command2.string [0];
 					/*
 					 * Variable names consist of a sequence of letters, digits, and underscores,
 					 * optionally preceded by a period and optionally followed by a $ and/or #.
 					 */
-					if (*p == '.') p ++;
-					while (isalnum (*p) || *p == '_' || *p == '.')  p ++;
-					if (*p == '$') {
+					if (*p == U'.') p ++;
+					while (isalnum ((int) *p) || *p == U'_' || *p == U'.')  p ++;
+					if (*p == U'$') {
 						/*
 						 * Assign to a string variable.
 						 */
-						trace ("detected an assignment to a string variable");
-						wchar_t *endOfVariable = ++ p;
-						wchar_t *variableName = command2.string;
+						trace (U"detected an assignment to a string variable");
+						char32 *endOfVariable = ++ p;
+						char32 *variableName = command2.string;
 						int withFile;
-						while (*p == ' ' || *p == '\t') p ++;   /* Go to first token after variable name. */
-						if (*p == '[') {
+						while (*p == U' ' || *p == U'\t') p ++;   // go to first token after variable name
+						if (*p == U'[') {
 							/*
 							 * This must be an assignment to an indexed string variable.
 							 */
-							*endOfVariable = '\0';
-							static MelderString indexedVariableName = { 0 };
-							MelderString_copy (& indexedVariableName, command2.string);
-							MelderString_appendCharacter (& indexedVariableName, '[');
+							*endOfVariable = U'\0';
+							static MelderString indexedVariableName { 0 };
+							MelderString_copy (& indexedVariableName, command2.string, U"[");
 							for (;;) {
 								p ++;   // skip opening bracket or comma
-								static MelderString index = { 0 };
+								static MelderString index { 0 };
 								MelderString_empty (& index);
 								int depth = 0;
-								while ((depth > 0 || (*p != ',' && *p != ']')) && *p != '\n' && *p != '\0') {
+								while ((depth > 0 || (*p != U',' && *p != U']')) && *p != U'\n' && *p != U'\0') {
 									MelderString_appendCharacter (& index, *p);
-									if (*p == '[') depth ++;
-									else if (*p == ']') depth --;
+									if (*p == U'[') depth ++;
+									else if (*p == U']') depth --;
 									p ++;
 								}
-								if (*p == '\n' || *p == '\0')
-									Melder_throw ("Missing closing bracket (]) in indexed variable.");
+								if (*p == U'\n' || *p == U'\0')
+									Melder_throw (U"Missing closing bracket (]) in indexed variable.");
 								double numericIndexValue;
 								Interpreter_numericExpression (me, index.string, & numericIndexValue);
-								MelderString_append (& indexedVariableName, Melder_double (numericIndexValue));
+								MelderString_append (& indexedVariableName, numericIndexValue);
 								MelderString_appendCharacter (& indexedVariableName, *p);
-								if (*p == ']') {
+								if (*p == U']') {
 									break;
 								}
 							}
 							variableName = indexedVariableName.string;
 							p ++;   // skip closing bracket
 						}
-						while (*p == ' ' || *p == '\t') p ++;   /* Go to first token after (perhaps indexed) variable name. */
-						if (*p == '=') {
-							withFile = 0;   /* Assignment. */
-						} else if (*p == '<') {
-							withFile = 1;   /* Read from file. */
-						} else if (*p == '>') {
-							if (p [1] == '>')
-								withFile = 2, p ++;   /* Append to file. */
+						while (*p == U' ' || *p == U'\t') p ++;   // go to first token after (perhaps indexed) variable name
+						if (*p == U'=') {
+							withFile = 0;   // assignment
+						} else if (*p == U'<') {
+							withFile = 1;   // read from file
+						} else if (*p == U'>') {
+							if (p [1] == U'>')
+								withFile = 2, p ++;   // append to file
 							else
 								withFile = 3;   /* Save to file. */
-						} else Melder_throw ("Missing '=', '<', or '>' after variable ", variableName, ".");
-						*endOfVariable = '\0';
+						} else Melder_throw (U"Missing '=', '<', or '>' after variable ", variableName, U".");
+						*endOfVariable = U'\0';
 						p ++;
-						while (*p == ' ' || *p == '\t') p ++;   /* Go to first token after assignment or I/O symbol. */
-						if (*p == '\0') {
+						while (*p == U' ' || *p == U'\t') p ++;   // go to first token after assignment or I/O symbol
+						if (*p == U'\0') {
 							if (withFile != 0)
-								Melder_throw ("Missing file name after variable ", variableName, ".");
+								Melder_throw (U"Missing file name after variable ", variableName, U".");
 							else
-								Melder_throw ("Missing expression after variable ", variableName, ".");
+								Melder_throw (U"Missing expression after variable ", variableName, U".");
 						}
 						if (withFile) {
 							structMelderFile file = { 0 };
 							Melder_relativePathToFile (p, & file);
 							if (withFile == 1) {
-								wchar_t *stringValue = MelderFile_readText (& file);
+								char32 *stringValue = MelderFile_readText (& file);
 								InterpreterVariable var = Interpreter_lookUpVariable (me, variableName);
 								Melder_free (var -> stringValue);
 								var -> stringValue = stringValue;   /* var becomes owner */
 							} else if (withFile == 2) {
-								if (theCurrentPraatObjects != & theForegroundPraatObjects) Melder_throw ("Commands that write to a file are not available inside pictures.");
+								if (theCurrentPraatObjects != & theForegroundPraatObjects) Melder_throw (U"Commands that write to a file are not available inside pictures.");
 								InterpreterVariable var = Interpreter_hasVariable (me, variableName);
-								if (! var) Melder_throw ("Variable ", variableName, " undefined.");
+								if (! var) Melder_throw (U"Variable ", variableName, U" undefined.");
 								MelderFile_appendText (& file, var -> stringValue);
 							} else {
-								if (theCurrentPraatObjects != & theForegroundPraatObjects) Melder_throw ("Commands that write to a file are not available inside pictures.");
+								if (theCurrentPraatObjects != & theForegroundPraatObjects) Melder_throw (U"Commands that write to a file are not available inside pictures.");
 								InterpreterVariable var = Interpreter_hasVariable (me, variableName);
-								if (! var) Melder_throw ("Variable ", variableName, " undefined.");
+								if (! var) Melder_throw (U"Variable ", variableName, U" undefined.");
 								MelderFile_writeText (& file, var -> stringValue, Melder_getOutputEncoding ());
 							}
 						} else if (isCommand (p)) {
@@ -1551,7 +1620,7 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 							int status = praat_executeCommand (me, p);
 							InterpreterVariable var = Interpreter_lookUpVariable (me, variableName);
 							Melder_free (var -> stringValue);
-							var -> stringValue = Melder_wcsdup (status ? valueString.string : L"");
+							var -> stringValue = Melder_dup (status ? valueString.string : U"");
 						} else {
 							/*
 							 * Evaluate a string expression and assign the result to the variable.
@@ -1561,28 +1630,28 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 							 *       ... then right$ (file$, length (file$) - rindex (file$, "."))
 							 *       ... else "" fi
 							 */
-							wchar_t *stringValue;
-							trace ("evaluating string expression");
+							char32 *stringValue;
+							trace (U"evaluating string expression");
 							Interpreter_stringExpression (me, p, & stringValue);
-							trace ("assigning to string variable %ls", variableName);
+							trace (U"assigning to string variable ", variableName);
 							InterpreterVariable var = Interpreter_lookUpVariable (me, variableName);
 							Melder_free (var -> stringValue);
-							var -> stringValue = stringValue;   /* var becomes owner */
+							var -> stringValue = stringValue;   // var becomes owner
 						}
-					} else if (*p == '#') {
+					} else if (*p == U'#') {
 						/*
 						 * Assign to a numeric array variable.
 						 */
-						wchar_t *endOfVariable = ++ p;
-						while (*p == ' ' || *p == '\t') p ++;   // Go to first token after variable name.
-						if (*p == '=') {
+						char32 *endOfVariable = ++ p;
+						while (*p == U' ' || *p == U'\t') p ++;   // go to first token after variable name
+						if (*p == U'=') {
 							;
-						} else Melder_throw ("Missing '=' after variable ", command2.string, ".");
-						*endOfVariable = '\0';
+						} else Melder_throw (U"Missing '=' after variable ", command2.string, U".");
+						*endOfVariable = U'\0';
 						p ++;
-						while (*p == ' ' || *p == '\t') p ++;   // Go to first token after assignment or I/O symbol.
-						if (*p == '\0') {
-							Melder_throw ("Missing expression after variable ", command2.string, ".");
+						while (*p == U' ' || *p == U'\t') p ++;   // go to first token after assignment or I/O symbol
+						if (*p == U'\0') {
+							Melder_throw (U"Missing expression after variable ", command2.string, U".");
 						}
 						struct Formula_NumericArray value;
 						Interpreter_numericArrayExpression (me, p, & value);
@@ -1594,46 +1663,45 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 						 * Try to assign to a numeric variable.
 						 */
 						double value;
-						wchar_t *variableName = command2.string;
-						int typeOfAssignment = 0;   /* Plain assignment. */
-						if (*p == '\0') {
+						char32 *variableName = command2.string;
+						int typeOfAssignment = 0;   // plain assignment
+						if (*p == U'\0') {
 							/*
 							 * Command ends here: it may be a PraatShell command.
 							 */
 							praat_executeCommand (me, command2.string);
 							continue;   // next line
 						}
-						wchar_t *endOfVariable = p;
-						while (*p == ' ' || *p == '\t') p ++;
-						if (*p == '=' || ((*p == '+' || *p == '-' || *p == '*' || *p == '/') && p [1] == '=')) {
+						char32 *endOfVariable = p;
+						while (*p == U' ' || *p == U'\t') p ++;
+						if (*p == U'=' || ((*p == U'+' || *p == U'-' || *p == U'*' || *p == U'/') && p [1] == U'=')) {
 							/*
 							 * This must be an assignment (though: "echo = ..." ???)
 							 */
-							typeOfAssignment = *p == '+' ? 1 : *p == '-' ? 2 : *p == '*' ? 3 : *p == '/' ? 4 : 0;
-							*endOfVariable = '\0';   // Close variable name. FIXME: this can be any weird character, e.g. hallo&
-						} else if (*p == '[') {
+							typeOfAssignment = *p == U'+' ? 1 : *p == U'-' ? 2 : *p == U'*' ? 3 : *p == U'/' ? 4 : 0;
+							*endOfVariable = U'\0';   // close variable name; FIXME: this can be any weird character, e.g. hallo&
+						} else if (*p == U'[') {
 							/*
 							 * This must be an assignment to an indexed numeric variable.
 							 */
-							*endOfVariable = '\0';
-							static MelderString indexedVariableName = { 0 };
-							MelderString_copy (& indexedVariableName, command2.string);
-							MelderString_appendCharacter (& indexedVariableName, '[');
+							*endOfVariable = U'\0';
+							static MelderString indexedVariableName { 0 };
+							MelderString_copy (& indexedVariableName, command2.string, U"[");
 							for (;;) {
 								p ++;   // skip opening bracket or comma
-								static MelderString index = { 0 };
+								static MelderString index { 0 };
 								MelderString_empty (& index);
 								int depth = 0;
-								while ((depth > 0 || (*p != ',' && *p != ']')) && *p != '\n' && *p != '\0') {
+								while ((depth > 0 || (*p != U',' && *p != U']')) && *p != U'\n' && *p != U'\0') {
 									MelderString_appendCharacter (& index, *p);
-									if (*p == '[') depth ++;
-									else if (*p == ']') depth --;
+									if (*p == U'[') depth ++;
+									else if (*p == U']') depth --;
 									p ++;
 								}
-								if (*p == '\n' || *p == '\0')
-									Melder_throw ("Missing closing bracket (]) in indexed variable.");
+								if (*p == U'\n' || *p == U'\0')
+									Melder_throw (U"Missing closing bracket (]) in indexed variable.");
 								Interpreter_numericExpression (me, index.string, & value);
-								MelderString_append (& indexedVariableName, Melder_double (value));
+								MelderString_append (& indexedVariableName, value);
 								MelderString_appendCharacter (& indexedVariableName, *p);
 								if (*p == ']') {
 									break;
@@ -1641,9 +1709,9 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 							}
 							variableName = indexedVariableName.string;
 							p ++;   // skip closing bracket
-							while (*p == ' ' || *p == '\t') p ++;
-							if (*p == '=' || ((*p == '+' || *p == '-' || *p == '*' || *p == '/') && p [1] == '=')) {
-								typeOfAssignment = *p == '+' ? 1 : *p == '-' ? 2 : *p == '*' ? 3 : *p == '/' ? 4 : 0;
+							while (*p == U' ' || *p == U'\t') p ++;
+							if (*p == U'=' || ((*p == U'+' || *p == U'-' || *p == U'*' || *p == U'/') && p [1] == U'=')) {
+								typeOfAssignment = *p == U'+' ? 1 : *p == U'-' ? 2 : *p == U'*' ? 3 : *p == U'/' ? 4 : 0;
 							}
 						} else {
 							/*
@@ -1653,8 +1721,8 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 							continue;   // next line
 						}
 						p += typeOfAssignment == 0 ? 1 : 2;
-						while (*p == ' ' || *p == '\t') p ++;			
-						if (*p == '\0') Melder_throw ("Missing expression after variable ", variableName, ".");
+						while (*p == U' ' || *p == U'\t') p ++;
+						if (*p == U'\0') Melder_throw (U"Missing expression after variable ", variableName, U".");
 						/*
 						 * Three classes of assignments:
 						 *    var = formula
@@ -1667,17 +1735,17 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 							 */
 							MelderString_empty (& valueString);
 							autoMelderDivertInfo divert (& valueString);
-							MelderString_appendCharacter (& valueString, 1);
+							MelderString_appendCharacter (& valueString, 1);   // will be overwritten by something totally different if any MelderInfo function is called...
 							int status = praat_executeCommand (me, p);
 							if (status == 0) {
 								value = NUMundefined;
-							} else if (valueString.string [0] == 1) {
+							} else if (valueString.string [0] == 1) {   // ...not overwritten by any MelderInfo function? then the return value will be the selected object
 								int IOBJECT, result = 0, found = 0;
 								WHERE (SELECTED) { result = IOBJECT; found += 1; }
 								if (found > 1) {
-									Melder_throw ("Multiple objects selected. Cannot assign ID to variable.");
+									Melder_throw (U"Multiple objects selected. Cannot assign ID to variable.");
 								} else if (found == 0) {
-									Melder_throw ("No objects selected. Cannot assign ID to variable.");
+									Melder_throw (U"No objects selected. Cannot assign ID to variable.");
 								} else {
 									value = theCurrentPraatObjects -> list [result]. id;
 								}
@@ -1697,7 +1765,7 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 							/*
 							 * Use an existing variable, or create a new one.
 							 */
-							//Melder_casual ("looking up variable %ls", variableName);
+							//Melder_casual (U"looking up variable ", variableName);
 							InterpreterVariable var = Interpreter_lookUpVariable (me, variableName);
 							var -> numericValue = value;
 						} else {
@@ -1705,7 +1773,7 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 							 * Modify an existing variable.
 							 */
 							InterpreterVariable var = Interpreter_hasVariable (me, variableName);
-							if (var == NULL) Melder_throw ("Unknown variable ", variableName, ".");
+							if (! var) Melder_throw (U"Unknown variable ", variableName, U".");
 							if (var -> numericValue == NUMundefined) {
 								/* Keep it that way. */
 							} else {
@@ -1727,25 +1795,29 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 				if (assertErrorLineNumber != 0 && assertErrorLineNumber != lineNumber) {
 					long save_assertErrorLineNumber = assertErrorLineNumber;
 					assertErrorLineNumber = 0;
-					Melder_throw ("Script assertion fails in line ", save_assertErrorLineNumber,
-							L": error « ", assertErrorString.string, L" » not raised. Instead: no error.");
+					Melder_throw (U"Script assertion fails in line ", save_assertErrorLineNumber,
+							U": error « ", assertErrorString.string, U" » not raised. Instead: no error.");
 					
 				}
 			} catch (MelderError) {
-				//Melder_casual ("Error: << %ls >>\nassertErrorLineNumber: %ld\nlineNumber: %ld\nAssert error string: << %ls >>\n",
-				//	Melder_getError(), assertErrorLineNumber, lineNumber, assertErrorString.string);
+				//	Melder_casual (U"Error: << ", Melder_getError(),
+				//		U" >>\nassertErrorLineNumber: ", assertErrorLineNumber,
+				//		U"\nlineNumber: ", lineNumber,
+				//		U"\nAssert error string: << ", assertErrorString.string,
+				//		U" >>\n"
+				//	);
 				if (assertErrorLineNumber == 0) {
 					throw;
 				} else if (assertErrorLineNumber != lineNumber) {
-					if (wcsstr (Melder_getError (), assertErrorString.string)) {
+					if (str32str (Melder_getError (), assertErrorString.string)) {
 						Melder_clearError ();
 						assertErrorLineNumber = 0;
 					} else {
-						wchar_t *errorCopy_nothrow = Melder_wcsdup_f (Melder_getError ());   // UGLY but necessary (1)
+						char32 *errorCopy_nothrow = Melder_dup_f (Melder_getError ());   // UGLY but necessary (1)
 						Melder_clearError ();
-						autostring errorCopy = errorCopy_nothrow;   // UGLY but necessary (2)
-						Melder_throw ("Script assertion fails in line ", assertErrorLineNumber,
-							L": error « ", assertErrorString.string, L" » not raised. Instead:\n",
+						autostring32 errorCopy = errorCopy_nothrow;   // UGLY but necessary (2)
+						Melder_throw (U"Script assertion fails in line ", assertErrorLineNumber,
+							U": error « ", assertErrorString.string, U" » not raised. Instead:\n",
 							errorCopy.peek());
 					}
 				}
@@ -1756,19 +1828,19 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 		my stopped = false;
 	} catch (MelderError) {
 		if (lineNumber > 0) {
-			bool normalExplicitExit = wcsnequ (lines [lineNumber], L"exit ", 5) || Melder_hasError (L"Script exited.");
+			bool normalExplicitExit = str32nequ (lines [lineNumber], U"exit ", 5) || Melder_hasError (U"Script exited.");
 			if (! normalExplicitExit && ! assertionFailed) {   // don't show the message twice!
-				while (lines [lineNumber] [0] == '\0') {   // did this use to be a continuation line?
+				while (lines [lineNumber] [0] == U'\0') {   // did this use to be a continuation line?
 					lineNumber --;
 					Melder_assert (lineNumber > 0);   // originally empty lines that stayed empty should not generate errors
 				}
-				Melder_error_ ("Script line ", lineNumber, L" not performed or completed:\n« ", lines [lineNumber], L" »");
+				Melder_appendError (U"Script line ", lineNumber, U" not performed or completed:\n« ", lines [lineNumber], U" »");
 			}
 		}
 		my numberOfLabels = 0;
 		my running = false;
 		my stopped = false;
-		if (wcsequ (Melder_getError (), L"\nScript exited.\n")) {
+		if (str32equ (Melder_getError (), U"\nScript exited.\n")) {
 			Melder_clearError ();
 		} else {
 			throw;
@@ -1777,45 +1849,45 @@ void Interpreter_run (Interpreter me, wchar_t *text) {
 }
 
 void Interpreter_stop (Interpreter me) {
-//Melder_casual ("Interpreter_stop in: %ld", me);
+//Melder_casual (U"Interpreter_stop in: ", Melder_pointer (me));
 	my stopped = true;
-//Melder_casual ("Interpreter_stop out: %ld", me);
+//Melder_casual (U"Interpreter_stop out: ", Melder_pointer (me));
 }
 
-void Interpreter_voidExpression (Interpreter me, const wchar_t *expression) {
-	Formula_compile (me, NULL, expression, kFormula_EXPRESSION_TYPE_NUMERIC, FALSE);
+void Interpreter_voidExpression (Interpreter me, const char32 *expression) {
+	Formula_compile (me, nullptr, expression, kFormula_EXPRESSION_TYPE_NUMERIC, false);
 	struct Formula_Result result;
 	Formula_run (0, 0, & result);
 }
 
-void Interpreter_numericExpression (Interpreter me, const wchar_t *expression, double *value) {
-	Melder_assert (value != NULL);
-	if (wcsstr (expression, L"(=")) {
+void Interpreter_numericExpression (Interpreter me, const char32 *expression, double *value) {
+	Melder_assert (value);
+	if (str32str (expression, U"(=")) {
 		*value = Melder_atof (expression);
 	} else {
-		Formula_compile (me, NULL, expression, kFormula_EXPRESSION_TYPE_NUMERIC, FALSE);
+		Formula_compile (me, nullptr, expression, kFormula_EXPRESSION_TYPE_NUMERIC, false);
 		struct Formula_Result result;
 		Formula_run (0, 0, & result);
 		*value = result. result.numericResult;
 	}
 }
 
-void Interpreter_stringExpression (Interpreter me, const wchar_t *expression, wchar_t **value) {
-	Formula_compile (me, NULL, expression, kFormula_EXPRESSION_TYPE_STRING, FALSE);
+void Interpreter_stringExpression (Interpreter me, const char32 *expression, char32 **value) {
+	Formula_compile (me, nullptr, expression, kFormula_EXPRESSION_TYPE_STRING, false);
 	struct Formula_Result result;
 	Formula_run (0, 0, & result);
 	*value = result. result.stringResult;
 }
 
-void Interpreter_numericArrayExpression (Interpreter me, const wchar_t *expression, struct Formula_NumericArray *value) {
-	Formula_compile (me, NULL, expression, kFormula_EXPRESSION_TYPE_NUMERIC_ARRAY, FALSE);
+void Interpreter_numericArrayExpression (Interpreter me, const char32 *expression, struct Formula_NumericArray *value) {
+	Formula_compile (me, nullptr, expression, kFormula_EXPRESSION_TYPE_NUMERIC_ARRAY, false);
 	struct Formula_Result result;
 	Formula_run (0, 0, & result);
 	*value = result. result.numericArrayResult;
 }
 
-void Interpreter_anyExpression (Interpreter me, const wchar_t *expression, struct Formula_Result *result) {
-	Formula_compile (me, NULL, expression, kFormula_EXPRESSION_TYPE_UNKNOWN, FALSE);
+void Interpreter_anyExpression (Interpreter me, const char32 *expression, struct Formula_Result *result) {
+	Formula_compile (me, nullptr, expression, kFormula_EXPRESSION_TYPE_UNKNOWN, false);
 	Formula_run (0, 0, result);
 }
 
diff --git a/sys/Interpreter.h b/sys/Interpreter.h
index 900d218..aca248b 100644
--- a/sys/Interpreter.h
+++ b/sys/Interpreter.h
@@ -2,7 +2,7 @@
 #define _Interpreter_h_
 /* Interpreter.h
  *
- * Copyright (C) 1993-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1993-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,66 +23,80 @@
 #include "Gui.h"
 #include "Formula.h"
 
+#if defined (macintosh) && useCarbon
+	#define USE_HASH  0
+#else
+	#define USE_HASH  1
+#endif
+
+#if USE_HASH
+#include <string>
+#include <unordered_map>
+#endif
+
 Thing_define (InterpreterVariable, SimpleString) {
-	// new data:
-	public:
-		wchar_t *stringValue;
-		double numericValue;
-		struct Formula_NumericArray numericArrayValue;
-	// overridden methods:
-	protected:
-		virtual void v_destroy ();
+	char32 *stringValue;
+	double numericValue;
+	struct Formula_NumericArray numericArrayValue;
+
+	void v_destroy ()
+		override;
 };
 
 #define Interpreter_MAXNUM_PARAMETERS  400
 #define Interpreter_MAXNUM_LABELS  1000
 #define Interpreter_MAX_CALL_DEPTH  50
 
+#define Interpreter_MAX_LABEL_LENGTH  99
+
 Thing_declare (UiForm);
 Thing_declare (Editor);
 
 Thing_define (Interpreter, Thing) {
-	// new data:
-	public:
-		wchar_t *environmentName;
-		ClassInfo editorClass;
-		int numberOfParameters, numberOfLabels, callDepth;
-		wchar_t parameters [1+Interpreter_MAXNUM_PARAMETERS] [100];
-		unsigned char types [1+Interpreter_MAXNUM_PARAMETERS];
-		wchar_t *arguments [1+Interpreter_MAXNUM_PARAMETERS];
-		wchar_t choiceArguments [1+Interpreter_MAXNUM_PARAMETERS] [100];
-		wchar_t labelNames [1+Interpreter_MAXNUM_LABELS] [100];
-		long labelLines [1+Interpreter_MAXNUM_LABELS];
-		wchar_t dialogTitle [1+100], procedureNames [1+Interpreter_MAX_CALL_DEPTH] [100];
-		SortedSetOfString variables;
-		bool running, stopped;
-	// overridden methods:
-	protected:
-		virtual void v_destroy ();
+	char32 *environmentName;
+	ClassInfo editorClass;
+	int numberOfParameters, numberOfLabels, callDepth;
+	char32 parameters [1+Interpreter_MAXNUM_PARAMETERS] [100];
+	int types [1+Interpreter_MAXNUM_PARAMETERS];
+	char32 *arguments [1+Interpreter_MAXNUM_PARAMETERS];
+	char32 choiceArguments [1+Interpreter_MAXNUM_PARAMETERS] [100];
+	char32 labelNames [1+Interpreter_MAXNUM_LABELS] [1+Interpreter_MAX_LABEL_LENGTH];
+	long labelLines [1+Interpreter_MAXNUM_LABELS];
+	char32 dialogTitle [1+100], procedureNames [1+Interpreter_MAX_CALL_DEPTH] [100];
+	#if USE_HASH
+	std::unordered_map <std::u32string, InterpreterVariable> *variablesMap;
+	#else
+	SortedSetOfString variables;
+	#endif
+	bool running, stopped;
+
+	void v_destroy ()
+		override;
 };
 
-Interpreter Interpreter_create (wchar_t *environmentName, ClassInfo editorClass);
+Interpreter Interpreter_create (char32 *environmentName, ClassInfo editorClass);
 Interpreter Interpreter_createFromEnvironment (Editor editor);
 
-void Melder_includeIncludeFiles (wchar_t **text);
-long Interpreter_readParameters (Interpreter me, wchar_t *text);
+void Melder_includeIncludeFiles (char32 **text);
+long Interpreter_readParameters (Interpreter me, char32 *text);
 Thing_declare (UiForm);
-UiForm Interpreter_createForm (Interpreter me, GuiWindow parent, const wchar_t *fileName,
-	void (*okCallback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure), void *okClosure,
+UiForm Interpreter_createForm (Interpreter me, GuiWindow parent, const char32 *fileName,
+	void (*okCallback) (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *closure), void *okClosure,
 	bool selectionOnly);
-void Interpreter_getArgumentsFromDialog (Interpreter me, Any dialog);
-void Interpreter_getArgumentsFromString (Interpreter me, const wchar_t *arguments);
+void Interpreter_getArgumentsFromDialog (Interpreter me, UiForm dialog);
+void Interpreter_getArgumentsFromString (Interpreter me, const char32 *arguments);
 void Interpreter_getArgumentsFromArgs (Interpreter me, int nargs, Stackel args);
-void Interpreter_run (Interpreter me, wchar_t *text);   // destroys 'text'
+void Interpreter_run (Interpreter me, char32 *text);   // destroys 'text'
 void Interpreter_stop (Interpreter me);   // can be called from any procedure called deep-down by the interpreter; will stop before next line
-void Interpreter_voidExpression (Interpreter me, const wchar_t *expression);
-void Interpreter_numericExpression (Interpreter me, const wchar_t *expression, double *value);
-void Interpreter_stringExpression (Interpreter me, const wchar_t *expression, wchar_t **value);
-void Interpreter_numericArrayExpression (Interpreter me, const wchar_t *expression, struct Formula_NumericArray *value);
-void Interpreter_anyExpression (Interpreter me, const wchar_t *expression, struct Formula_Result *result);
 
-InterpreterVariable Interpreter_hasVariable (Interpreter me, const wchar_t *key);
-InterpreterVariable Interpreter_lookUpVariable (Interpreter me, const wchar_t *key);
+void Interpreter_voidExpression (Interpreter me, const char32 *expression);
+void Interpreter_numericExpression (Interpreter me, const char32 *expression, double *value);
+void Interpreter_stringExpression (Interpreter me, const char32 *expression, char32 **value);
+void Interpreter_numericArrayExpression (Interpreter me, const char32 *expression, struct Formula_NumericArray *value);
+void Interpreter_anyExpression (Interpreter me, const char32 *expression, struct Formula_Result *result);
+
+InterpreterVariable Interpreter_hasVariable (Interpreter me, const char32 *key);
+InterpreterVariable Interpreter_lookUpVariable (Interpreter me, const char32 *key);
 
 /* End of file Interpreter.h */
 #endif
diff --git a/sys/Makefile b/sys/Makefile
index 5c68e49..b1ad348 100644
--- a/sys/Makefile
+++ b/sys/Makefile
@@ -1,11 +1,11 @@
 # Makefile of the library "sys"
-# Paul Boersma, 24 August 2013
+# Paul Boersma, 21 June 2015
 
 include ../makefile.defs
 
 CPPFLAGS = -I ../num -I ../sys -I ../dwsys -I ../kar -I ../external/portaudio -I ../external/flac -I ../external/mp3
 
-OBJECTS = abcio.o lispio.o complex.o \
+OBJECTS = abcio.o complex.o \
    melder_ftoa.o melder_atof.o melder_error.o melder_alloc.o melder.o melder_strings.o \
    melder_token.o melder_files.o melder_audio.o melder_audiofiles.o \
    melder_debug.o melder_sysenv.o melder_info.o melder_quantity.o \
diff --git a/sys/ManPage.h b/sys/ManPage.h
index a30d9f8..1d91c6d 100644
--- a/sys/ManPage.h
+++ b/sys/ManPage.h
@@ -2,7 +2,7 @@
 #define _ManPage_h_
 /* ManPage.h
  *
- * Copyright (C) 1996-2011 Paul Boersma
+ * Copyright (C) 1996-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,20 +25,18 @@
 
 typedef struct structManPage_Paragraph {
 	short type;
-	const wchar_t *text;
+	const char32 *text;
 	double width, height;
 	void (*draw) (Graphics g);
 } *ManPage_Paragraph;
 
 Thing_define (ManPage, Thing) {
-	// new data:
-	public:
-		const wchar_t *title, *author;
-		long date;
-		struct structManPage_Paragraph *paragraphs;
-		long nlinksHither, nlinksThither;
-		long *linksHither, *linksThither;
-		double recordingTime;
+	const char32 *title, *author;
+	long date;
+	struct structManPage_Paragraph *paragraphs;
+	long nlinksHither, nlinksThither;
+	long *linksHither, *linksThither;
+	double recordingTime;
 };
 
 /* End of file ManPage.h */
diff --git a/sys/ManPage_enums.h b/sys/ManPage_enums.h
index 1b26633..116b8ca 100644
--- a/sys/ManPage_enums.h
+++ b/sys/ManPage_enums.h
@@ -1,6 +1,6 @@
 /* ManPage_enums.h
  *
- * Copyright (C) 1996-2009 Paul Boersma
+ * Copyright (C) 1996-2009,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,32 +18,32 @@
  */
 
 enums_begin (kManPage_type, 1)
-	enums_add (kManPage_type, 1, INTRO, L"intro")
-	enums_add (kManPage_type, 2, ENTRY, L"entry")
-	enums_add (kManPage_type, 3, NORMAL, L"normal")
-	enums_add (kManPage_type, 4, LIST_ITEM, L"list_item")
-	enums_add (kManPage_type, 5, TAG, L"tag")
-	enums_add (kManPage_type, 6, DEFINITION, L"definition")
-	enums_add (kManPage_type, 7, CODE, L"code")
-	enums_add (kManPage_type, 8, PROTOTYPE, L"prototype")
-	enums_add (kManPage_type, 9, FORMULA, L"formula")
-	enums_add (kManPage_type, 10, PICTURE, L"picture")
-	enums_add (kManPage_type, 11, SCRIPT, L"script")
-	enums_add (kManPage_type, 12, LIST_ITEM1, L"list_item1")
-	enums_add (kManPage_type, 13, LIST_ITEM2, L"list_item2")
-	enums_add (kManPage_type, 14, LIST_ITEM3, L"list_item3")
-	enums_add (kManPage_type, 15, TAG1, L"tag1")
-	enums_add (kManPage_type, 16, TAG2, L"tag2")
-	enums_add (kManPage_type, 17, TAG3, L"tag3")
-	enums_add (kManPage_type, 18, DEFINITION1, L"definition1")
-	enums_add (kManPage_type, 19, DEFINITION2, L"definition2")
-	enums_add (kManPage_type, 20, DEFINITION3, L"definition3")
-	enums_add (kManPage_type, 21, CODE1, L"code1")
-	enums_add (kManPage_type, 22, CODE2, L"code2")
-	enums_add (kManPage_type, 23, CODE3, L"code3")
-	enums_add (kManPage_type, 24, CODE4, L"code4")
-	enums_add (kManPage_type, 25, CODE5, L"code5")
-	enums_add (kManPage_type, 26, PAGE_TITLE, L"page_title")
+	enums_add (kManPage_type, 1, INTRO, U"intro")
+	enums_add (kManPage_type, 2, ENTRY, U"entry")
+	enums_add (kManPage_type, 3, NORMAL, U"normal")
+	enums_add (kManPage_type, 4, LIST_ITEM, U"list_item")
+	enums_add (kManPage_type, 5, TAG, U"tag")
+	enums_add (kManPage_type, 6, DEFINITION, U"definition")
+	enums_add (kManPage_type, 7, CODE, U"code")
+	enums_add (kManPage_type, 8, PROTOTYPE, U"prototype")
+	enums_add (kManPage_type, 9, FORMULA, U"formula")
+	enums_add (kManPage_type, 10, PICTURE, U"picture")
+	enums_add (kManPage_type, 11, SCRIPT, U"script")
+	enums_add (kManPage_type, 12, LIST_ITEM1, U"list_item1")
+	enums_add (kManPage_type, 13, LIST_ITEM2, U"list_item2")
+	enums_add (kManPage_type, 14, LIST_ITEM3, U"list_item3")
+	enums_add (kManPage_type, 15, TAG1, U"tag1")
+	enums_add (kManPage_type, 16, TAG2, U"tag2")
+	enums_add (kManPage_type, 17, TAG3, U"tag3")
+	enums_add (kManPage_type, 18, DEFINITION1, U"definition1")
+	enums_add (kManPage_type, 19, DEFINITION2, U"definition2")
+	enums_add (kManPage_type, 20, DEFINITION3, U"definition3")
+	enums_add (kManPage_type, 21, CODE1, U"code1")
+	enums_add (kManPage_type, 22, CODE2, U"code2")
+	enums_add (kManPage_type, 23, CODE3, U"code3")
+	enums_add (kManPage_type, 24, CODE4, U"code4")
+	enums_add (kManPage_type, 25, CODE5, U"code5")
+	enums_add (kManPage_type, 26, PAGE_TITLE, U"page_title")
 enums_end (kManPage_type, 26, NORMAL)
 
 /* End of file ManPage_enums.h */
diff --git a/sys/ManPages.cpp b/sys/ManPages.cpp
index c3f1903..cfca592 100644
--- a/sys/ManPages.cpp
+++ b/sys/ManPages.cpp
@@ -1,6 +1,6 @@
 /* ManPages.cpp
  *
- * Copyright (C) 1996-2012,2014 Paul Boersma
+ * Copyright (C) 1996-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@
 #include "Interpreter.h"
 #include "praat.h"
 
-Thing_implement (ManPages, Data, 0);
+Thing_implement (ManPages, Daata, 0);
 
 #define LONGEST_FILE_NAME  55
 
@@ -34,7 +34,7 @@ static int isSingleWordCharacter (int c) {
 	return isalnum (c) || c == '_';
 }
 
-static long lookUp_unsorted (ManPages me, const wchar_t *title);
+static long lookUp_unsorted (ManPages me, const char32 *title);
 
 void structManPages :: v_destroy () {
 	if (dynamic && pages) {
@@ -59,53 +59,53 @@ void structManPages :: v_destroy () {
 			Melder_free (titles [ipage]);
 		}
 	forget (pages);
-	NUMvector_free <const wchar_t *> (titles, 1);
+	NUMvector_free <const char32 *> (titles, 1);
 	ManPages_Parent :: v_destroy ();
 }
 
-static const wchar_t *extractLink (const wchar_t *text, const wchar_t *p, wchar_t *link) {
-	wchar_t *to = link, *max = link + 300;
-	if (p == NULL) p = text;
+static const char32 *extractLink (const char32 *text, const char32 *p, char32 *link) {
+	char32 *to = link, *max = link + 300;
+	if (! p) p = text;
 	/*
 	 * Search for next '@' that is not in a backslash sequence.
 	 */
 	for (;;) {
-		p = wcschr (p, '@');
-		if (! p) return NULL;   /* No more '@'. */
-		if (p - text <= 0 || (p [-1] != '\\' && (p - text <= 1 || p [-2] != '\\'))) break;
+		p = str32chr (p, U'@');
+		if (! p) return nullptr;   // no more '@'
+		if (p - text <= 0 || (p [-1] != U'\\' && (p - text <= 1 || p [-2] != U'\\'))) break;
 		p ++;
 	}
-	Melder_assert (*p == '@');
-	if (p [1] == '@') {
-		const wchar_t *from = p + 2;
-		while (*from != '@' && *from != '|' && *from != '\0') {
+	Melder_assert (*p == U'@');
+	if (p [1] == U'@') {
+		const char32 *from = p + 2;
+		while (*from != U'@' && *from != U'|' && *from != U'\0') {
 			if (to >= max) {
-				Melder_throw ("(ManPages::grind:) Link starting with \"@@\" is too long:\n", text);
+				Melder_throw (U"(ManPages::grind:) Link starting with \"@@\" is too long:\n", text);
 			}
 			*to ++ = *from ++;
 		}
 		if (*from == '|') { from ++; while (*from != '@' && *from != '\0') from ++; }
 		if (*from) p = from + 1; else p = from;   /* Skip '@' but not '\0'. */
 	} else {
-		const wchar_t *from = p + 1;
-		while (isSingleWordCharacter (*from)) {
+		const char32 *from = p + 1;
+		while (isSingleWordCharacter ((int) *from)) {
 			if (to >= max) {
-				Melder_throw ("(ManPages::grind:) Link starting with \"@@\" is too long:\n", text);
+				Melder_throw (U"(ManPages::grind:) Link starting with \"@@\" is too long:\n", text);
 			}
 			*to ++ = *from ++;
 		}
 		p = from;
 	}
-	*to = '\0';
+	*to = U'\0';
 	return p;
 }
 
 static void readOnePage (ManPages me, MelderReadText text) {
-	wchar_t *title;
+	char32 *title;
 	try {
 		title = texgetw2 (text);
 	} catch (MelderError) {
-		Melder_throw ("Cannot find page title.");
+		Melder_throw (U"Cannot find page title.");
 	}
 
 	/*
@@ -127,27 +127,27 @@ static void readOnePage (ManPages me, MelderReadText text) {
 	try {
 		page -> author = texgetw2 (text);
 	} catch (MelderError) {
-		Melder_throw ("Cannot find author.");
+		Melder_throw (U"Cannot find author.");
 	}
 	try {
 		page -> date = texgetu4 (text);
 	} catch (MelderError) {
-		Melder_throw ("Cannot find date.");
+		Melder_throw (U"Cannot find date.");
 	}
 	try {
 		page -> recordingTime = texgetr8 (text);
 	} catch (MelderError) {
-		Melder_throw ("Cannot find recording time.");
+		Melder_throw (U"Cannot find recording time.");
 	}
 	page -> paragraphs = NUMvector <struct structManPage_Paragraph> (0, 500);
 
 	ManPage_Paragraph par = & page -> paragraphs [0];
 	for (;; par ++) {
-		wchar_t link [501], fileName [256];
+		char32 link [501], fileName [256];
 		try {
 			par -> type = texgete1 (text, kManPage_type_getValue);
 		} catch (MelderError) {
-			if (Melder_hasError (L"end of text")) {
+			if (Melder_hasError (U"end of text")) {
 				Melder_clearError ();
 				break;
 			} else {
@@ -161,72 +161,70 @@ static void readOnePage (ManPages me, MelderReadText text) {
 		try {
 			par -> text = texgetw2 (text);
 		} catch (MelderError) {
-			Melder_throw ("Cannot find text.");
+			Melder_throw (U"Cannot find text.");
 		}
-		for (const wchar_t *plink = extractLink (par -> text, NULL, link); plink != NULL; plink = extractLink (par -> text, plink, link)) {
+		for (const char32 *plink = extractLink (par -> text, nullptr, link); plink != nullptr; plink = extractLink (par -> text, plink, link)) {
 			/*
 			 * Now, `link' contains the link text, with spaces and all.
 			 * Transform it into a file name.
 			 */
 			structMelderFile file2 = { 0 };
-			if (link [0] == '\\' && link [1] == 'F' && link [2] == 'I') {
+			if (link [0] == U'\\' && link [1] == U'F' && link [2] == U'I') {
 				/*
 				 * A link to a sound file: see if it exists.
 				 */
 				MelderDir_relativePathToFile (& my rootDirectory, link + 3, & file2);
 				if (! MelderFile_exists (& file2)) {
-					Melder_warning (L"Cannot find sound file ", MelderFile_messageName (& file2), L".");
+					Melder_warning (U"Cannot find sound file ", MelderFile_messageName (& file2), U".");
 				}
-			} else if (link [0] == '\\' && link [1] == 'S' && link [2] == 'C') {
+			} else if (link [0] == U'\\' && link [1] == U'S' && link [2] == U'C') {
 				/*
 				 * A link to a script: see if it exists.
 				 */
-				wchar_t *p = link + 3;
+				char32 *p = link + 3;
 				if (*p == '\"') {
-					wchar_t *q = fileName;
+					char32 *q = fileName;
 					p ++;
-					while (*p != '\"' && *p != '\0') * q ++ = * p ++;
+					while (*p != U'\"' && *p != U'\0') * q ++ = * p ++;
 					*q = '\0';
 				} else {
-					wchar_t *q = fileName;
-					while (*p != ' ' && *p != '\0') * q ++ = * p ++;   // One word, up to the next space.
+					char32 *q = fileName;
+					while (*p != U' ' && *p != U'\0') * q ++ = * p ++;   // One word, up to the next space.
 					*q = '\0';
 				}
 				MelderDir_relativePathToFile (& my rootDirectory, fileName, & file2);
 				if (! MelderFile_exists (& file2)) {
-					Melder_warning (L"Cannot find script ", MelderFile_messageName (& file2), L".");
+					Melder_warning (U"Cannot find script ", MelderFile_messageName (& file2), U".");
 				}
-				my executable = TRUE;
+				my executable = true;
 			} else {
-				wchar_t *q;
+				char32 *q;
 				/*
 				 * A link to another page: follow it.
 				 */
-				for (q = link; *q; q ++) if (! isAllowedFileNameCharacter (*q)) *q = '_';
-				wcscpy (fileName, link);
-				wcscat (fileName, L".man");
+				for (q = link; *q; q ++) if (! isAllowedFileNameCharacter (*q)) *q = U'_';
+				Melder_sprint (fileName,256, link, U".man");
 				MelderDir_getFile (& my rootDirectory, fileName, & file2);
 				try {
 					autoMelderReadText text2 = MelderReadText_createFromFile (& file2);
 					try {
 						readOnePage (me, text2.peek());
 					} catch (MelderError) {
-						Melder_throw ("File ", & file2, ".");
+						Melder_throw (U"File ", & file2, U".");
 					}
 				} catch (MelderError) {
 					/*
 					 * Second try: with upper case.
 					 */
 					Melder_clearError ();
-					link [0] = toupper (link [0]);
-					wcscpy (fileName, link);
-					wcscat (fileName, L".man");
+					link [0] = toupper ((int) link [0]);
+					Melder_sprint (fileName,256, link, U".man");
 					MelderDir_getFile (& my rootDirectory, fileName, & file2);
 					autoMelderReadText text2 = MelderReadText_createFromFile (& file2);
 					try {
 						readOnePage (me, text2.peek());
 					} catch (MelderError) {
-						Melder_throw ("File ", & file2, ".");
+						Melder_throw (U"File ", & file2, U".");
 					}
 				}
 			}
@@ -234,22 +232,22 @@ static void readOnePage (ManPages me, MelderReadText text) {
 	}
 	++ par;   // Room for the last paragraph (because counting starts at 0).
 	++ par;   // Room for the final zero-type paragraph.
-	page -> paragraphs = (ManPage_Paragraph) Melder_realloc (page -> paragraphs, sizeof (struct structManPage_Paragraph) * (par - page -> paragraphs));
+	page -> paragraphs = (ManPage_Paragraph) Melder_realloc (page -> paragraphs, (int64) sizeof (struct structManPage_Paragraph) * (par - page -> paragraphs));
 }
-void structManPages :: v_readText (MelderReadText text) {
-	dynamic = TRUE;
+void structManPages :: v_readText (MelderReadText text, int /*formatVersion*/) {
+	dynamic = true;
 	pages = Ordered_create ();
 	MelderDir_copy (& Data_directoryBeingRead, & rootDirectory);
 	readOnePage (this, text);
 }
 
-ManPages ManPages_create (void) {
+ManPages ManPages_create () {
 	ManPages me = Thing_new (ManPages);
 	my pages = Ordered_create ();
 	return me;
 }
 
-void ManPages_addPage (ManPages me, const wchar_t *title, const wchar_t *author, long date,
+void ManPages_addPage (ManPages me, const char32 *title, const char32 *author, long date,
 	struct structManPage_Paragraph paragraphs [])
 {
 	autoManPage page = Thing_new (ManPage);
@@ -262,18 +260,18 @@ void ManPages_addPage (ManPages me, const wchar_t *title, const wchar_t *author,
 
 static int pageCompare (const void *first, const void *second) {
 	ManPage me = * (ManPage *) first, thee = * (ManPage *) second;
-	const wchar_t *p = my title, *q = thy title;
+	const char32 *p = my title, *q = thy title;
 	for (;;) {
 		int plower = tolower (*p), qlower = tolower (*q);
 		if (plower < qlower) return -1;
 		if (plower > qlower) return 1;
-		if (plower == '\0') return wcscmp (my title, thy title);
+		if (plower == '\0') return str32cmp (my title, thy title);
 		p ++, q ++;
 	}
 	return 0;   /* Should not occur. */
 }
 
-static long lookUp_unsorted (ManPages me, const wchar_t *title) {
+static long lookUp_unsorted (ManPages me, const char32 *title) {
 	long i;
 
 	/*
@@ -281,25 +279,25 @@ static long lookUp_unsorted (ManPages me, const wchar_t *title) {
 	 */
 	for (i = 1; i <= my pages -> size; i ++) {
 		ManPage page = (ManPage) my pages -> item [i];
-		if (wcsequ (page -> title, title)) return i;
+		if (str32equ (page -> title, title)) return i;
 	}
 
 	/*
 	 * If that fails, try to find the upper-case variant.
 	 */
 	if (islower (title [0])) {
-		wchar_t upperTitle [300];
-		wcscpy (upperTitle, title);
+		char32 upperTitle [300];
+		Melder_sprint (upperTitle,300, title);
 		upperTitle [0] = toupper (upperTitle [0]);
 		for (i = 1; i <= my pages -> size; i ++) {
 			ManPage page = (ManPage) my pages -> item [i];
-			if (wcsequ (page -> title, upperTitle)) return i;
+			if (str32equ (page -> title, upperTitle)) return i;
 		}
 	}
 	return 0;
 }
 
-static long lookUp_sorted (ManPages me, const wchar_t *title) {
+static long lookUp_sorted (ManPages me, const char32 *title) {
 	static ManPage dummy;
 	ManPage *page;
 	if (! dummy) dummy = Thing_new (ManPage);
@@ -307,8 +305,8 @@ static long lookUp_sorted (ManPages me, const wchar_t *title) {
 	page = (ManPage *) bsearch (& dummy, & my pages -> item [1], my pages -> size, sizeof (ManPage), pageCompare);
 	if (page) return (page - (ManPage *) & my pages -> item [1]) + 1;
 	if (islower (title [0]) || isupper (title [0])) {
-		wchar_t caseSwitchedTitle [300];
-		wcscpy (caseSwitchedTitle, title);
+		char32 caseSwitchedTitle [300];
+		Melder_sprint (caseSwitchedTitle,300, title);
 		caseSwitchedTitle [0] = islower (title [0]) ? toupper (caseSwitchedTitle [0]) : tolower (caseSwitchedTitle [0]);
 		dummy -> title = caseSwitchedTitle;
 		page = (ManPage *) bsearch (& dummy, & my pages -> item [1], my pages -> size, sizeof (ManPage), pageCompare);
@@ -331,17 +329,17 @@ static void grind (ManPages me) {
 		ManPage page = (ManPage) my pages -> item [ipage];
 		int ipar;
 		for (ipar = 0; page -> paragraphs [ipar]. type; ipar ++) {
-			const wchar_t *text = page -> paragraphs [ipar]. text, *p;
-			wchar_t link [301];
-			if (text) for (p = extractLink (text, NULL, link); p != NULL; p = extractLink (text, p, link)) {
-				if (link [0] == '\\' && ((link [1] == 'F' && link [2] == 'I') || (link [1] == 'S' && link [2] == 'C')))
-					continue;   /* Ignore "FILE" links. */
+			const char32 *text = page -> paragraphs [ipar]. text, *p;
+			char32 link [301];
+			if (text) for (p = extractLink (text, nullptr, link); p != nullptr; p = extractLink (text, p, link)) {
+				if (link [0] == U'\\' && ((link [1] == U'F' && link [2] == U'I') || (link [1] == U'S' && link [2] == U'C')))
+					continue;   // ignore "FILE" links
 				if ((jpage = lookUp_sorted (me, link)) != 0) {
 					page -> nlinksThither ++;
 					((ManPage) my pages -> item [jpage]) -> nlinksHither ++;
 					grandNlinks ++;
 				} else {
-					MelderInfo_writeLine (L"Page \"", page -> title, L"\" contains a dangling link to \"", link, L"\".");
+					MelderInfo_writeLine (U"Page \"", page -> title, U"\" contains a dangling link to \"", link, U"\".");
 					ndangle ++;
 				}
 			}
@@ -349,7 +347,7 @@ static void grind (ManPages me) {
 	}
 	if (ndangle) {
 		MelderInfo_close ();
-		Melder_warning ("(ManPages::grind:) ", ndangle, " dangling links encountered. See console window.");
+		Melder_warning (U"(ManPages::grind:) ", ndangle, U" dangling links encountered. See console window.");
 	}
 
 	/*
@@ -357,9 +355,9 @@ static void grind (ManPages me) {
 	 * Some optimization required: use only two mallocs.
 	 * Forget nlinksHither and nlinksThither.
 	 */
-	if (grandNlinks == 0) { my ground = TRUE; return; }
+	if (grandNlinks == 0) { my ground = true; return; }
 	if (! (grandLinksHither = NUMvector <long> (1, grandNlinks)) || ! (grandLinksThither = NUMvector <long> (1, grandNlinks))) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 		return;
 	}
 	ilinkHither = ilinkThither = 0;
@@ -380,18 +378,17 @@ static void grind (ManPages me) {
 	 */
 	for (ipage = 1; ipage <= my pages -> size; ipage ++) {
 		ManPage page = (ManPage) my pages -> item [ipage];
-		int ipar;
-		for (ipar = 0; page -> paragraphs [ipar]. type; ipar ++) {
-			const wchar_t *text = page -> paragraphs [ipar]. text, *p;
-			wchar_t link [301];
-			if (text) for (p = extractLink (text, NULL, link); p != NULL; p = extractLink (text, p, link)) {
-				if (link [0] == '\\' && ((link [1] == 'F' && link [2] == 'I') || (link [1] == 'S' && link [2] == 'C')))
-					continue;   /* Ignore "FILE" links. */
+		for (int ipar = 0; page -> paragraphs [ipar]. type; ipar ++) {
+			const char32 *text = page -> paragraphs [ipar]. text, *p;
+			char32 link [301];
+			if (text) for (p = extractLink (text, nullptr, link); p != nullptr; p = extractLink (text, p, link)) {
+				if (link [0] == U'\\' && ((link [1] == U'F' && link [2] == U'I') || (link [1] == U'S' && link [2] == U'C')))
+					continue;   // ignore "FILE" links
 				if ((jpage = lookUp_sorted (me, link)) != 0) {
-					int ilink, alreadyPresent = FALSE;
-					for (ilink = 1; ilink <= page -> nlinksThither; ilink ++) {
+					bool alreadyPresent = false;
+					for (int ilink = 1; ilink <= page -> nlinksThither; ilink ++) {
 						if (page -> linksThither [ilink] == jpage) {
-							alreadyPresent = TRUE;
+							alreadyPresent = true;
 							break;
 						}
 					}
@@ -405,7 +402,7 @@ static void grind (ManPages me) {
 		}
 	}
 
-	my ground = TRUE;
+	my ground = true;
 }
 
 long ManPages_uniqueLinksHither (ManPages me, long ipage) {
@@ -419,27 +416,27 @@ long ManPages_uniqueLinksHither (ManPages me, long ipage) {
 	return result;
 }
 
-long ManPages_lookUp (ManPages me, const wchar_t *title) {
+long ManPages_lookUp (ManPages me, const char32 *title) {
 	if (! my ground) grind (me);
 	return lookUp_sorted (me, title);
 }
 
-static long ManPages_lookUp_caseSensitive (ManPages me, const wchar_t *title) {
+static long ManPages_lookUp_caseSensitive (ManPages me, const char32 *title) {
 	if (! my ground) grind (me);
 	for (long i = 1; i <= my pages -> size; i ++) {
 		ManPage page = (ManPage) my pages -> item [i];
-		if (wcsequ (page -> title, title)) return i;
+		if (str32equ (page -> title, title)) return i;
 	}
 	return 0;
 }
 
-const wchar_t **ManPages_getTitles (ManPages me, long *numberOfTitles) {
+const char32 **ManPages_getTitles (ManPages me, long *numberOfTitles) {
 	if (! my ground) grind (me);
 	if (! my titles) {
-		my titles = NUMvector <const wchar_t *> (1, my pages -> size);   // TODO
+		my titles = NUMvector <const char32 *> (1, my pages -> size);   // TODO
 		for (long i = 1; i <= my pages -> size; i ++) {
 			ManPage page = (ManPage) my pages -> item [i];
-			my titles [i] = Melder_wcsdup_f (page -> title);
+			my titles [i] = Melder_dup_f (page -> title);
 		}
 	}
 	*numberOfTitles = my pages -> size;
@@ -447,34 +444,34 @@ const wchar_t **ManPages_getTitles (ManPages me, long *numberOfTitles) {
 }
 
 static struct stylesInfo {
-	const wchar_t *htmlIn, *htmlOut;
+	const char32 *htmlIn, *htmlOut;
 } stylesInfo [] = {
 { 0 },
-/* INTRO: */ { L"<p>", L"</p>" },
-/* ENTRY: */ { L"<h3>", L"</h3>" },
-/* NORMAL: */ { L"<p>", L"</p>" },
-/* LIST_ITEM: */ { L"<dd>", L"" },
-/* TAG: */ { L"<dt>", L"" },
-/* DEFINITION: */ { L"<dd>", L"" },
-/* CODE: */ { L"<code>", L"<br></code>" },
-/* PROTOTYPE: */ { L"<p>", L"</p>" },
-/* FORMULA: */ { L"<table width=\"100%\"><tr><td align=middle>", L"</table>" },
-/* PICTURE: */ { L"<p>", L"</p>" },
-/* SCRIPT: */ { L"<p>", L"</p>" },
-/* LIST_ITEM1: */ { L"<dd>   ", L"" },
-/* LIST_ITEM2: */ { L"<dd>      ", L"" },
-/* LIST_ITEM3: */ { L"<dd>         ", L"" },
-/* TAG1: */ { L"<dt>   ", L"" },
-/* TAG2: */ { L"<dt>      ", L"" },
-/* TAG3: */ { L"<dt>         ", L"" },
-/* DEFINITION1: */ { L"<dd>   ", L"" },
-/* DEFINITION2: */ { L"<dd>      ", L"" },
-/* DEFINITION3: */ { L"<dd>         ", L"" },
-/* CODE1: */ { L"<code>   ", L"<br></code>" },
-/* CODE2: */ { L"<code>      ", L"<br></code>" },
-/* CODE3: */ { L"<code>         ", L"<br></code>" },
-/* CODE4: */ { L"<code>            ", L"<br></code>" },
-/* CODE5: */ { L"<code>               ", L"<br></code>" }
+/* INTRO: */ { U"<p>", U"</p>" },
+/* ENTRY: */ { U"<h3>", U"</h3>" },
+/* NORMAL: */ { U"<p>", U"</p>" },
+/* LIST_ITEM: */ { U"<dd>", U"" },
+/* TAG: */ { U"<dt>", U"" },
+/* DEFINITION: */ { U"<dd>", U"" },
+/* CODE: */ { U"<code>", U"<br></code>" },
+/* PROTOTYPE: */ { U"<p>", U"</p>" },
+/* FORMULA: */ { U"<table width=\"100%\"><tr><td align=middle>", U"</table>" },
+/* PICTURE: */ { U"<p>", U"</p>" },
+/* SCRIPT: */ { U"<p>", U"</p>" },
+/* LIST_ITEM1: */ { U"<dd>   ", U"" },
+/* LIST_ITEM2: */ { U"<dd>      ", U"" },
+/* LIST_ITEM3: */ { U"<dd>         ", U"" },
+/* TAG1: */ { U"<dt>   ", U"" },
+/* TAG2: */ { U"<dt>      ", U"" },
+/* TAG3: */ { U"<dt>         ", U"" },
+/* DEFINITION1: */ { U"<dd>   ", U"" },
+/* DEFINITION2: */ { U"<dd>      ", U"" },
+/* DEFINITION3: */ { U"<dd>         ", U"" },
+/* CODE1: */ { U"<code>   ", U"<br></code>" },
+/* CODE2: */ { U"<code>      ", U"<br></code>" },
+/* CODE3: */ { U"<code>         ", U"<br></code>" },
+/* CODE4: */ { U"<code>            ", U"<br></code>" },
+/* CODE5: */ { U"<code>               ", U"<br></code>" }
 };
 
 static void writeParagraphsAsHtml (ManPages me, MelderFile file, ManPage_Paragraph paragraphs, MelderString *buffer) {
@@ -483,7 +480,7 @@ static void writeParagraphsAsHtml (ManPages me, MelderFile file, ManPage_Paragra
 	bool inSub = false, inCode = false, inSuper = false, ul = false, inSmall = false;
 	bool wordItalic = false, wordBold = false, wordCode = false, letterSuper = false;
 	for (ManPage_Paragraph paragraph = paragraphs; paragraph -> type != 0; paragraph ++) {
-		const wchar_t *p = paragraph -> text;
+		const char32 *p = paragraph -> text;
 		int type = paragraph -> type, inTable;
 		bool isListItem = type == kManPage_type_LIST_ITEM ||
 			(type >= kManPage_type_LIST_ITEM1 && type <= kManPage_type_LIST_ITEM3);
@@ -498,8 +495,9 @@ static void writeParagraphsAsHtml (ManPages me, MelderFile file, ManPage_Paragra
 			numberOfPictures ++;
 			structMelderFile pdfFile;
 			MelderFile_copy (file, & pdfFile);
-			pdfFile. path [wcslen (pdfFile. path) - 5] = '\0';   // delete extension ".html"
-			wcscat (pdfFile. path, Melder_wcscat (L"_", Melder_integer (numberOfPictures), L".pdf"));
+			pdfFile. path [str32len (pdfFile. path) - 5] = U'\0';   // delete extension ".html"
+			str32cpy (pdfFile. path + str32len (pdfFile. path),
+				Melder_cat (U"_", numberOfPictures, U".pdf"));
 			Graphics graphics = Graphics_create_pdffile (& pdfFile, 100, 0.0, paragraph -> width, 0.0, paragraph -> height);
 			Graphics_setFont (graphics, kGraphics_font_TIMES);
 			Graphics_setFontStyle (graphics, 0);
@@ -513,23 +511,25 @@ static void writeParagraphsAsHtml (ManPages me, MelderFile file, ManPage_Paragra
 			forget (graphics);
 			structMelderFile tiffFile;
 			MelderFile_copy (file, & tiffFile);
-			tiffFile. path [wcslen (tiffFile. path) - 5] = '\0';   // delete extension ".html"
-			wcscat (tiffFile. path, Melder_wcscat (L"_", Melder_integer (numberOfPictures), L".png"));
-			system (Melder_peekWcsToUtf8 (Melder_wcscat (L"/usr/local/bin/gs -q -dNOPAUSE "
-				"-r200x200 -sDEVICE=png16m -sOutputFile=", tiffFile.path,
-				L" ", pdfFile. path, L" quit.ps")));
+			tiffFile. path [str32len (tiffFile. path) - 5] = U'\0';   // delete extension ".html"
+			str32cpy (tiffFile. path + str32len (tiffFile. path),
+				Melder_cat (U"_", numberOfPictures, U".png"));
+			system (Melder_peek32to8 (Melder_cat (U"/usr/local/bin/gs -q -dNOPAUSE "
+				U"-r200x200 -sDEVICE=png16m -sOutputFile=", tiffFile.path,
+				U" ", pdfFile. path, U" quit.ps")));
 			MelderFile_delete (& pdfFile);
-			MelderString_append (buffer, Melder_wcscat (L"<p align=middle><img height=", Melder_integer (paragraph -> height * 100),
-				L" width=", Melder_integer (paragraph -> width * 100), L" src=", MelderFile_name (& tiffFile), L"></p>"));
+			MelderString_append (buffer, Melder_cat (U"<p align=middle><img height=", paragraph -> height * 100,
+				U" width=", paragraph -> width * 100, U" src=", MelderFile_name (& tiffFile), U"></p>"));
 			continue;
 		}
 		if (type == kManPage_type_SCRIPT) {
-			autoInterpreter interpreter = Interpreter_createFromEnvironment (NULL);
+			autoInterpreter interpreter = Interpreter_createFromEnvironment (nullptr);
 			numberOfPictures ++;
 			structMelderFile pdfFile;
 			MelderFile_copy (file, & pdfFile);
-			pdfFile. path [wcslen (pdfFile. path) - 5] = '\0';   // delete extension ".html"
-			wcscat (pdfFile. path, Melder_wcscat (L"_", Melder_integer (numberOfPictures), L".pdf"));
+			pdfFile. path [str32len (pdfFile. path) - 5] = U'\0';   // delete extension ".html"
+			str32cpy (pdfFile. path + str32len (pdfFile.path),
+				Melder_cat (U"_", numberOfPictures, U".pdf"));
 			Graphics graphics = Graphics_create_pdffile (& pdfFile, 100, 0.0, paragraph -> width, 0.0, paragraph -> height);
 			Graphics_setFont (graphics, kGraphics_font_TIMES);
 			Graphics_setFontStyle (graphics, 0);
@@ -575,11 +575,11 @@ static void writeParagraphsAsHtml (ManPages me, MelderFile file, ManPage_Paragra
 					Melder_setDefaultDir (& my rootDirectory);
 				}
 				try {
-					autostring text = Melder_wcsdup (p);
+					autostring32 text = Melder_dup (p);
 					Interpreter_run (interpreter.peek(), text.peek());
 				} catch (MelderError) {
-					trace ("interpreter fails on %ls", pdfFile. path);
-					Melder_flushError (NULL);
+					trace (U"interpreter fails on ", pdfFile. path);
+					Melder_flushError ();
 				}
 			}
 			Graphics_setViewport (graphics, 0, 1, 0, 1);
@@ -588,14 +588,15 @@ static void writeParagraphsAsHtml (ManPages me, MelderFile file, ManPage_Paragra
 			forget (graphics);
 			structMelderFile tiffFile;
 			MelderFile_copy (file, & tiffFile);
-			tiffFile. path [wcslen (tiffFile. path) - 5] = '\0';   // delete extension ".html"
-			wcscat (tiffFile. path, Melder_wcscat (L"_", Melder_integer (numberOfPictures), L".png"));
-			system (Melder_peekWcsToUtf8 (Melder_wcscat (L"/usr/local/bin/gs -q -dNOPAUSE "
+			tiffFile. path [str32len (tiffFile. path) - 5] = '\0';   // delete extension ".html"
+			str32cpy (tiffFile. path + str32len (tiffFile. path),
+				Melder_cat (U"_", numberOfPictures, U".png"));
+			system (Melder_peek32to8 (Melder_cat (U"/usr/local/bin/gs -q -dNOPAUSE "
 				"-r200x200 -sDEVICE=png16m -sOutputFile=", tiffFile.path,
-				L" ", pdfFile. path, L" quit.ps")));
+				U" ", pdfFile. path, U" quit.ps")));
 			MelderFile_delete (& pdfFile);
-			MelderString_append (buffer, Melder_wcscat (L"<p align=middle><img height=", Melder_integer (paragraph -> height * 100),
-				L" width=", Melder_integer (paragraph -> width * 100), L" src=", MelderFile_name (& tiffFile), L"></p>"));
+			MelderString_append (buffer, U"<p align=middle><img height=", paragraph -> height * 100,
+				U" width=", paragraph -> width * 100, U" src=", MelderFile_name (& tiffFile), U"></p>");
 			theCurrentPraatApplication = & theForegroundPraatApplication;
 			theCurrentPraatObjects = & theForegroundPraatObjects;
 			theCurrentPraatPicture = & theForegroundPraatPicture;
@@ -604,55 +605,58 @@ static void writeParagraphsAsHtml (ManPages me, MelderFile file, ManPage_Paragra
 
 		if (isListItem || isTag || isDefinition) {
 			if (! inList) {
-				ul = isListItem && p [0] == '\\' && p [1] == 'b' && p [2] == 'u';
-				MelderString_append (buffer, ul ? L"<ul>\n" : L"<dl>\n");
+				ul = isListItem && (p [0] == U'•' || (p [0] == U'\\' && p [1] == U'b' && p [2] == U'u'));
+				MelderString_append (buffer, ul ? U"<ul>\n" : U"<dl>\n");
 				inList = true;
 			}
-			if (ul && p [0] == '\\' && p [1] == 'b' && p [2] == 'u' && p [3] == ' ') p += 3;
-			MelderString_append (buffer, ul ? L"<li>" : stylesInfo [paragraph -> type]. htmlIn, L"\n");
+			if (ul) {
+				if (p [0] == U'•'  && p [1] == U' ') p += 1;
+				if (p [0] == U'\\' && p [1] == U'b' && p [2] == U'u' && p [3] == U' ') p += 3;
+			}
+			MelderString_append (buffer, ul ? U"<li>" : stylesInfo [paragraph -> type]. htmlIn, U"\n");
 		} else {
 			if (inList) {
-				MelderString_append (buffer, ul ? L"</ul>\n" : L"</dl>\n");
+				MelderString_append (buffer, ul ? U"</ul>\n" : U"</dl>\n");
 				inList = ul = false;
 			}
-			MelderString_append (buffer, stylesInfo [paragraph -> type]. htmlIn, L"\n");
+			MelderString_append (buffer, stylesInfo [paragraph -> type]. htmlIn, U"\n");
 		}
-		inTable = *p == '\t';
+		inTable = *p == U'\t';
 		if (inTable) {
-			MelderString_append (buffer, L"<table border=0 cellpadding=0 cellspacing=0><tr><td width=100 align=middle>");
+			MelderString_append (buffer, U"<table border=0 cellpadding=0 cellspacing=0><tr><td width=100 align=middle>");
 			p ++;
 		}
 		/*
 		 * Leading spaces should be visible (mainly used in code fragments).
 		 */
-		while (*p == ' ') {
-			MelderString_append (buffer, L" ");
+		while (*p == U' ') {
+			MelderString_append (buffer, U" ");
 			p ++;
 		}
 		while (*p) {
-				if (wordItalic && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, L"</i>"); wordItalic = FALSE; }
-				if (wordBold && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, L"</b>"); wordBold = FALSE; }
-				if (wordCode && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, L"</code>"); wordCode = FALSE; }
-			if (*p == '@') {
-				wchar_t link [301], linkText [301], *q = link;
-				if (p [1] == '@') {
+				if (wordItalic && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, U"</i>"); wordItalic = false; }
+				if (wordBold && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, U"</b>"); wordBold = false; }
+				if (wordCode && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, U"</code>"); wordCode = false; }
+			if (*p == U'@') {
+				char32 link [301], linkText [301], *q = link;
+				if (p [1] == U'@') {
 					p += 2;
-					while (*p != '@' && *p != '|' && *p != '\0') *q++ = *p++;
-					*q = '\0';   /* Close link. */
-					if (*p == '|') {
-						p ++;   /* Skip '|'. */
+					while (*p != U'@' && *p != U'|' && *p != U'\0') *q++ = *p++;
+					*q = U'\0';   // close link
+					if (*p == U'|') {
+						p ++;   // skip '|'
 						q = linkText;
-						while (*p != '@' && *p != '\0') *q++ = *p++;
-						*q = '\0';   /* Close link text. */
+						while (*p != U'@' && *p != U'\0') *q++ = *p++;
+						*q = U'\0';   // close link text
 					} else {
-						wcscpy (linkText, link);
+						Melder_sprint (linkText,301, link);
 					}
 					if (*p) p ++;
 				} else {
 					p ++;
-					while (isSingleWordCharacter (*p) && *p != '\0') *q++ = *p++;
-					*q = '\0';   /* Close link. */
-					wcscpy (linkText, link);
+					while (isSingleWordCharacter (*p) && *p != U'\0') *q++ = *p++;
+					*q = U'\0';   // close link
+					Melder_sprint (linkText,301, link);
 				}
 				/*
 				 * We write the link in the following format:
@@ -662,193 +666,193 @@ static void writeParagraphsAsHtml (ManPages me, MelderFile file, ManPage_Paragra
 				 * because it will be a file name (see ManPages_writeAllToHtmlDir).
 				 * The file name will have no more than 30 or 60 characters, and no less than 1.
 				 */
-				MelderString_append (buffer, L"<a href=\"");
-				if (wcsnequ (link, L"\\FI", 3)) {
-					MelderString_append (buffer, link + 3);   /* File link. */
+				MelderString_append (buffer, U"<a href=\"");
+				if (str32nequ (link, U"\\FI", 3)) {
+					MelderString_append (buffer, link + 3);   // file link
 				} else {
 					q = link;
 					if (! ManPages_lookUp_caseSensitive (me, link)) {
 						MelderString_appendCharacter (buffer, toupper (link [0]));
-						if (*q) q ++;   /* First letter already written. */
+						if (*q) q ++;   // first letter already written
 					}
 					while (*q && q - link < LONGEST_FILE_NAME) {
-						if (! isAllowedFileNameCharacter (*q)) MelderString_appendCharacter (buffer, '_');
+						if (! isAllowedFileNameCharacter (*q)) MelderString_appendCharacter (buffer, U'_');
 						else MelderString_appendCharacter (buffer, *q);
 						q ++;
 					}
-					if (link [0] == '\0') MelderString_appendCharacter (buffer, '_');   /* Otherwise Mac problems or Unix invisibility. */
-					MelderString_append (buffer, L".html");
+					if (link [0] == U'\0') MelderString_appendCharacter (buffer, U'_');   /* Otherwise Mac problems or Unix invisibility. */
+					MelderString_append (buffer, U".html");
 				}
-				MelderString_append (buffer, L"\">", linkText, L"</a>");
-			} else if (*p == '%') {
-				if (inItalic) { MelderString_append (buffer, L"</i>"); inItalic = FALSE; p ++; }
-				else if (p [1] == '%') { MelderString_append (buffer, L"<i>"); inItalic = TRUE; p += 2; }
-				else if (p [1] == '#') { MelderString_append (buffer, L"<i><b>"); wordItalic = TRUE; wordBold = TRUE; p += 2; }
-				else { MelderString_append (buffer, L"<i>"); wordItalic = TRUE; p ++; }
-			} else if (*p == '_') {
+				MelderString_append (buffer, U"\">", linkText, U"</a>");
+			} else if (*p == U'%') {
+				if (inItalic) { MelderString_append (buffer, U"</i>"); inItalic = false; p ++; }
+				else if (p [1] == U'%') { MelderString_append (buffer, U"<i>"); inItalic = true; p += 2; }
+				else if (p [1] == U'#') { MelderString_append (buffer, U"<i><b>"); wordItalic = true; wordBold = true; p += 2; }
+				else { MelderString_append (buffer, U"<i>"); wordItalic = true; p ++; }
+			} else if (*p == U'_') {
 				if (inSub) {
-					/*if (wordItalic) { MelderString_append (buffer, L"</i>"); wordItalic = FALSE; }
-					if (wordBold) { MelderString_append (buffer, L"</b>"); wordBold = FALSE; }*/
-					MelderString_append (buffer, L"</sub>"); inSub = FALSE; p ++;
-				} else if (p [1] == '_') {
-					if (wordItalic) { MelderString_append (buffer, L"</i>"); wordItalic = FALSE; }
-					if (wordBold) { MelderString_append (buffer, L"</b>"); wordBold = FALSE; }
-					MelderString_append (buffer, L"<sub>"); inSub = TRUE; p += 2;
-				} else { MelderString_append (buffer, L"_"); p ++; }
-			} else if (*p == '#') {
-				if (inBold) { MelderString_append (buffer, L"</b>"); inBold = FALSE; p ++; }
-				else if (p [1] == '#') { MelderString_append (buffer, L"<b>"); inBold = TRUE; p += 2; }
-				else if (p [1] == '%') { MelderString_append (buffer, L"<b><i>"); wordBold = TRUE; wordItalic = TRUE; p += 2; }
-				else { MelderString_append (buffer, L"<b>"); wordBold = TRUE; p ++; }
-			} else if (*p == '$') {
-				if (inCode) { MelderString_append (buffer, L"</code>"); inCode = FALSE; p ++; }
-				else if (p [1] == '$') { MelderString_append (buffer, L"<code>"); inCode = TRUE; p += 2; }
-				else { MelderString_append (buffer, L"<code>"); wordCode = TRUE; p ++; }
-			} else if (*p == '^') {
+					/*if (wordItalic) { MelderString_append (buffer, U"</i>"); wordItalic = false; }
+					if (wordBold) { MelderString_append (buffer, U"</b>"); wordBold = false; }*/
+					MelderString_append (buffer, U"</sub>"); inSub = false; p ++;
+				} else if (p [1] == U'_') {
+					if (wordItalic) { MelderString_append (buffer, U"</i>"); wordItalic = false; }
+					if (wordBold) { MelderString_append (buffer, U"</b>"); wordBold = false; }
+					MelderString_append (buffer, U"<sub>"); inSub = true; p += 2;
+				} else { MelderString_append (buffer, U"_"); p ++; }
+			} else if (*p == U'#') {
+				if (inBold) { MelderString_append (buffer, U"</b>"); inBold = false; p ++; }
+				else if (p [1] == U'#') { MelderString_append (buffer, U"<b>"); inBold = true; p += 2; }
+				else if (p [1] == U'%') { MelderString_append (buffer, U"<b><i>"); wordBold = true; wordItalic = true; p += 2; }
+				else { MelderString_append (buffer, U"<b>"); wordBold = true; p ++; }
+			} else if (*p == U'$') {
+				if (inCode) { MelderString_append (buffer, U"</code>"); inCode = false; p ++; }
+				else if (p [1] == U'$') { MelderString_append (buffer, U"<code>"); inCode = true; p += 2; }
+				else { MelderString_append (buffer, U"<code>"); wordCode = true; p ++; }
+			} else if (*p == U'^') {
 				if (inSuper) {
-					/*if (wordItalic) { MelderString_append (buffer, L"</i>"); wordItalic = FALSE; }
-					if (wordBold) { MelderString_append (buffer, L"</b>"); wordBold = FALSE; }*/
-					MelderString_append (buffer, L"</sup>"); inSuper = FALSE; p ++;
-				} else if (p [1] == '^') {
-					/*if (wordItalic) { MelderString_append (buffer, L"</i>"); wordItalic = FALSE; }
-					if (wordBold) { MelderString_append (buffer, L"</b>"); wordBold = FALSE; }*/
-					MelderString_append (buffer, L"<sup>"); inSuper = TRUE; p += 2;
+					/*if (wordItalic) { MelderString_append (buffer, U"</i>"); wordItalic = false; }
+					if (wordBold) { MelderString_append (buffer, U"</b>"); wordBold = false; }*/
+					MelderString_append (buffer, U"</sup>"); inSuper = false; p ++;
+				} else if (p [1] == U'^') {
+					/*if (wordItalic) { MelderString_append (buffer, U"</i>"); wordItalic = false; }
+					if (wordBold) { MelderString_append (buffer, U"</b>"); wordBold = false; }*/
+					MelderString_append (buffer, U"<sup>"); inSuper = true; p += 2;
 				} else {
-					/*if (wordItalic) { MelderString_append (buffer, L"</i>"); wordItalic = FALSE; }
-					if (wordBold) { MelderString_append (buffer, L"</b>"); wordBold = FALSE; }*/
-					MelderString_append (buffer, L"<sup>"); letterSuper = TRUE; p ++;
+					/*if (wordItalic) { MelderString_append (buffer, U"</i>"); wordItalic = false; }
+					if (wordBold) { MelderString_append (buffer, U"</b>"); wordBold = false; }*/
+					MelderString_append (buffer, U"<sup>"); letterSuper = true; p ++;
 				}
-			} else if (*p == '}') {
-				if (inSmall) { MelderString_append (buffer, L"</font>"); inSmall = FALSE; p ++; }
-				else { MelderString_append (buffer, L"}"); p ++; }
-			} else if (*p == '\\' && p [1] == 's' && p [2] == '{') {
-				MelderString_append (buffer, L"<font size=-1>"); inSmall = TRUE; p += 3;
-			} else if (*p == '\t' && inTable) {
-				MelderString_append (buffer, L"<td width=100 align=middle>"); p ++;
-			} else if (*p == '<') {
-				MelderString_append (buffer, L"<"); p ++;
-			} else if (*p == '>') {
-				MelderString_append (buffer, L">"); p ++;
-			} else if (*p == '&') {
-				MelderString_append (buffer, L"&"); p ++;
+			} else if (*p == U'}') {
+				if (inSmall) { MelderString_append (buffer, U"</font>"); inSmall = false; p ++; }
+				else { MelderString_append (buffer, U"}"); p ++; }
+			} else if (*p == U'\\' && p [1] == U's' && p [2] == U'{') {
+				MelderString_append (buffer, U"<font size=-1>"); inSmall = true; p += 3;
+			} else if (*p == U'\t' && inTable) {
+				MelderString_append (buffer, U"<td width=100 align=middle>"); p ++;
+			} else if (*p == U'<') {
+				MelderString_append (buffer, U"<"); p ++;
+			} else if (*p == U'>') {
+				MelderString_append (buffer, U">"); p ++;
+			} else if (*p == U'&') {
+				MelderString_append (buffer, U"&"); p ++;
 			} else {
-				/*if (wordItalic && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, L"</i>"); wordItalic = FALSE; }
-				if (wordBold && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, L"</b>"); wordBold = FALSE; }
-				if (wordCode && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, L"</code>"); wordCode = FALSE; }*/
-				if (*p == '\\') {
+				/*if (wordItalic && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, U"</i>"); wordItalic = false; }
+				if (wordBold && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, U"</b>"); wordBold = false; }
+				if (wordCode && ! isSingleWordCharacter (*p)) { MelderString_append (buffer, U"</code>"); wordCode = false; }*/
+				if (*p == U'\\') {
 					int kar1 = *++p, kar2 = *++p;
 					Longchar_Info info = Longchar_getInfo (kar1, kar2);
 					if (info -> unicode < 127) {
-						MelderString_appendCharacter (buffer, info -> unicode ? info -> unicode : '?');
+						MelderString_appendCharacter (buffer, info -> unicode ? info -> unicode : U'?');
 					} else {
-						MelderString_append (buffer, L"&#", Melder_integer (info -> unicode), L";");
+						MelderString_append (buffer, U"&#", info -> unicode, U";");
 					}
 					p ++;
 				} else {
 					if (*p < 127) {
 						MelderString_appendCharacter (buffer, *p);
 					} else {
-						MelderString_append (buffer, L"&#", Melder_integer (*p), L";");
+						MelderString_append (buffer, U"&#", (int) *p, U";");
 					}
 					p ++;
 				}
 				if (letterSuper) {
-					if (wordItalic) { MelderString_append (buffer, L"</i>"); wordItalic = FALSE; }
-					if (wordBold) { MelderString_append (buffer, L"</b>"); wordBold = FALSE; }
-					MelderString_append (buffer, L"</sup>"); letterSuper = FALSE;
+					if (wordItalic) { MelderString_append (buffer, U"</i>"); wordItalic = false; }
+					if (wordBold) { MelderString_append (buffer, U"</b>"); wordBold = false; }
+					MelderString_append (buffer, U"</sup>"); letterSuper = false;
 				}
 			}
 		}
-		if (inItalic || wordItalic) { MelderString_append (buffer, L"</i>"); inItalic = wordItalic = FALSE; }
-		if (inBold || wordBold) { MelderString_append (buffer, L"</b>"); inBold = wordBold = FALSE; }
-		if (inCode || wordCode) { MelderString_append (buffer, L"</code>"); inCode = wordCode = FALSE; }
-		if (inSub) { MelderString_append (buffer, L"</sub>"); inSub = FALSE; }
-		if (inSuper || letterSuper) { MelderString_append (buffer, L"</sup>"); inSuper = letterSuper = FALSE; }
-		if (inTable) { MelderString_append (buffer, L"</table>"); inTable = FALSE; }
-		MelderString_append (buffer, stylesInfo [paragraph -> type]. htmlOut, L"\n");
+		if (inItalic || wordItalic) { MelderString_append (buffer, U"</i>"); inItalic = wordItalic = false; }
+		if (inBold || wordBold) { MelderString_append (buffer, U"</b>"); inBold = wordBold = false; }
+		if (inCode || wordCode) { MelderString_append (buffer, U"</code>"); inCode = wordCode = false; }
+		if (inSub) { MelderString_append (buffer, U"</sub>"); inSub = false; }
+		if (inSuper || letterSuper) { MelderString_append (buffer, U"</sup>"); inSuper = letterSuper = false; }
+		if (inTable) { MelderString_append (buffer, U"</table>"); inTable = false; }
+		MelderString_append (buffer, stylesInfo [paragraph -> type]. htmlOut, U"\n");
 	}
-	if (inList) { MelderString_append (buffer, ul ? L"</ul>\n" : L"</dl>\n"); inList = FALSE; }
+	if (inList) { MelderString_append (buffer, ul ? U"</ul>\n" : U"</dl>\n"); inList = false; }
 }
 
-static const wchar_t *month [] =
-	{ L"", L"January", L"February", L"March", L"April", L"May", L"June",
-	  L"July", L"August", L"September", L"October", L"November", L"December" };
+static const char32 *month [] =
+	{ U"", U"January", U"February", U"March", U"April", U"May", U"June",
+	  U"July", U"August", U"September", U"October", U"November", U"December" };
 
 static void writePageAsHtml (ManPages me, MelderFile file, long ipage, MelderString *buffer) {
 	ManPage page = (ManPage) my pages -> item [ipage];
 	ManPage_Paragraph paragraphs = page -> paragraphs;
-	MelderString_append (buffer, L"<html><head><meta name=\"robots\" content=\"index,follow\">"
-		L"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"
-		L"<title>", page -> title, L"</title></head><body bgcolor=\"#FFFFFF\">\n\n");
-	MelderString_append (buffer, L"<table border=0 cellpadding=0 cellspacing=0><tr><td bgcolor=\"#CCCC00\">"
-		L"<table border=4 cellpadding=9><tr><td align=middle bgcolor=\"#000000\">"
-		L"<font face=\"Palatino,Times\" size=6 color=\"#999900\"><b>\n",
-		page -> title, L"\n</b></font></table></table>\n");
+	MelderString_append (buffer, U"<html><head><meta name=\"robots\" content=\"index,follow\">"
+		U"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"
+		U"<title>", page -> title, U"</title></head><body bgcolor=\"#FFFFFF\">\n\n");
+	MelderString_append (buffer, U"<table border=0 cellpadding=0 cellspacing=0><tr><td bgcolor=\"#CCCC00\">"
+		U"<table border=4 cellpadding=9><tr><td align=middle bgcolor=\"#000000\">"
+		U"<font face=\"Palatino,Times\" size=6 color=\"#999900\"><b>\n",
+		page -> title, U"\n</b></font></table></table>\n");
 	writeParagraphsAsHtml (me, file, paragraphs, buffer);
 	if (ManPages_uniqueLinksHither (me, ipage)) {
 		long ilink, jlink, lastParagraph = 0;
 		while (page -> paragraphs [lastParagraph]. type != 0) lastParagraph ++;
 		if (lastParagraph > 0) {
-			const wchar_t *text = page -> paragraphs [lastParagraph - 1]. text;
-			if (text && text [0] && text [wcslen (text) - 1] != ':')
-				MelderString_append (buffer, L"<h3>Links to this page</h3>\n");
+			const char32 *text = page -> paragraphs [lastParagraph - 1]. text;
+			if (text && text [0] && text [str32len (text) - 1] != U':')
+				MelderString_append (buffer, U"<h3>Links to this page</h3>\n");
 		}
-		MelderString_append (buffer, L"<ul>\n");
+		MelderString_append (buffer, U"<ul>\n");
 		for (ilink = 1; ilink <= page -> nlinksHither; ilink ++) {
 			long link = page -> linksHither [ilink];
-			int alreadyShown = FALSE;
+			bool alreadyShown = false;
 			for (jlink = 1; jlink <= page -> nlinksThither; jlink ++)
 				if (page -> linksThither [jlink] == link)
-					alreadyShown = TRUE;
+					alreadyShown = true;
 			if (! alreadyShown) {
-				const wchar_t *title = ((ManPage) my pages -> item [page -> linksHither [ilink]]) -> title, *p;
-				MelderString_append (buffer, L"<li><a href=\"");
+				const char32 *title = ((ManPage) my pages -> item [page -> linksHither [ilink]]) -> title, *p;
+				MelderString_append (buffer, U"<li><a href=\"");
 				for (p = title; *p; p ++) {
 					if (p - title >= LONGEST_FILE_NAME) break;
-					if (! isAllowedFileNameCharacter (*p)) MelderString_append (buffer, L"_");
+					if (! isAllowedFileNameCharacter (*p)) MelderString_append (buffer, U"_");
 					else MelderString_appendCharacter (buffer, *p);
 				}
-				if (title [0] == '\0') MelderString_append (buffer, L"_");
-				MelderString_append (buffer, L".html\">", title, L"</a>\n");
+				if (title [0] == U'\0') MelderString_append (buffer, U"_");
+				MelderString_append (buffer, U".html\">", title, U"</a>\n");
 			}
 		}
-		MelderString_append (buffer, L"</ul>\n");
+		MelderString_append (buffer, U"</ul>\n");
 	}
-	MelderString_append (buffer, L"<hr>\n<address>\n\t<p>© ", page -> author);
+	MelderString_append (buffer, U"<hr>\n<address>\n\t<p>© ", page -> author);
 	if (page -> date) {
 		long date = page -> date;
 		int imonth = date % 10000 / 100;
 		if (imonth < 0 || imonth > 12) imonth = 0;
-		MelderString_append (buffer, L", ", month [imonth], L" ", Melder_integer (date % 100));
-		MelderString_append (buffer, L", ", Melder_integer (date / 10000));
+		MelderString_append (buffer, U", ", month [imonth], U" ", date % 100);
+		MelderString_append (buffer, U", ", date / 10000);
 	}
-	MelderString_append (buffer, L"</p>\n</address>\n</body>\n</html>\n");
+	MelderString_append (buffer, U"</p>\n</address>\n</body>\n</html>\n");
 }
 
 void ManPages_writeOneToHtmlFile (ManPages me, long ipage, MelderFile file) {
-	static MelderString buffer = { 0 };
+	static MelderString buffer { 0 };
 	MelderString_empty (& buffer);
 	writePageAsHtml (me, file, ipage, & buffer);
 	MelderFile_writeText (file, buffer.string, kMelder_textOutputEncoding_UTF8);
 }
 
-void ManPages_writeAllToHtmlDir (ManPages me, const wchar_t *dirPath) {
+void ManPages_writeAllToHtmlDir (ManPages me, const char32 *dirPath) {
 	structMelderDir dir;
 	Melder_pathToDir (dirPath, & dir);
 	for (long ipage = 1; ipage <= my pages -> size; ipage ++) {
 		ManPage page = (ManPage) my pages -> item [ipage];
-		wchar_t fileName [256];
-		Melder_assert (wcslen (page -> title) < 256 - 100);
-		trace ("page %ld: %ls", ipage, page -> title);
-		wcscpy (fileName, page -> title);
-		for (wchar_t *p = fileName; *p; p ++)
+		char32 fileName [256];
+		Melder_assert (str32len (page -> title) < 256 - 100);
+		trace (U"page ", ipage, U": ", page -> title);
+		Melder_sprint (fileName,256,  page -> title);
+		for (char32 *p = fileName; *p; p ++)
 			if (! isAllowedFileNameCharacter (*p))
-				*p = '_';
-		if (fileName [0] == '\0')
-			wcscpy (fileName, L"_");   // no empty file names please
-		fileName [LONGEST_FILE_NAME] = '\0';
-		wcscat (fileName, L".html");
-		static MelderString buffer = { 0 };
+				*p = U'_';
+		if (fileName [0] == U'\0')
+			str32cpy (fileName, U"_");   // no empty file names please
+		fileName [LONGEST_FILE_NAME] = U'\0';
+		str32cpy (fileName + str32len (fileName), U".html");
+		static MelderString buffer { 0 };
 		MelderString_empty (& buffer);
 		structMelderFile file = { 0 };
 		MelderDir_getFile (& dir, fileName, & file);
@@ -857,14 +861,14 @@ void ManPages_writeAllToHtmlDir (ManPages me, const wchar_t *dirPath) {
 		 * An optimization because reading is much faster than writing:
 		 * we write the file only if the old file is different or doesn't exist.
 		 */
-		autostring oldText;
+		autostring32 oldText;
 		try {
 			oldText.reset (MelderFile_readText (& file));
 		} catch (MelderError) {
 			Melder_clearError ();
 		}
-		if (oldText.peek() == NULL   // doesn't the file exist yet?
-			|| wcscmp (buffer.string, oldText.peek()))   // isn't the old file identical to the new text?
+		if (! oldText.peek()   // doesn't the file exist yet?
+			|| str32cmp (buffer.string, oldText.peek()))   // isn't the old file identical to the new text?
 		{
 			MelderFile_writeText (& file, buffer.string, kMelder_textOutputEncoding_UTF8);   // then write the new text
 		}
diff --git a/sys/ManPages.h b/sys/ManPages.h
index cd08a0d..83ae061 100644
--- a/sys/ManPages.h
+++ b/sys/ManPages.h
@@ -2,7 +2,7 @@
 #define _ManPages_h_
 /* ManPages.h
  *
- * Copyright (C) 1996-2011 Paul Boersma
+ * Copyright (C) 1996-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,35 +22,34 @@
 #include "ManPage.h"
 #include "Collection.h"
 
-Thing_define (ManPages, Data) {
-	// new data:
-	public:
-		Ordered pages;
-		const wchar_t **titles;
-		int ground, dynamic, executable;
-		structMelderDir rootDirectory;
-	// overridden methods:
-	protected:
-		virtual void v_destroy ();
-		virtual void v_readText (MelderReadText text);
+Thing_define (ManPages, Daata) {
+	Ordered pages;
+	const char32 **titles;
+	bool ground, dynamic, executable;
+	structMelderDir rootDirectory;
+
+	void v_destroy ()
+		override;
+	void v_readText (MelderReadText text, int formatVersion)
+		override;
 };
 
-ManPages ManPages_create (void);
+ManPages ManPages_create ();
 
-void ManPages_addPage (ManPages me, const wchar_t *title, const wchar_t *author, long date,
+void ManPages_addPage (ManPages me, const char32 *title, const char32 *author, long date,
 	struct structManPage_Paragraph paragraphs []);
 /*
 	All string and struct arguments must be statically allocated
 	and not change after adding them to the ManPages.
 */
 
-long ManPages_lookUp (ManPages me, const wchar_t *title);
+long ManPages_lookUp (ManPages me, const char32 *title);
 
 void ManPages_writeOneToHtmlFile (ManPages me, long ipage, MelderFile file);
-void ManPages_writeAllToHtmlDir (ManPages me, const wchar_t *dirPath);
+void ManPages_writeAllToHtmlDir (ManPages me, const char32 *dirPath);
 
 long ManPages_uniqueLinksHither (ManPages me, long ipage);
-const wchar_t **ManPages_getTitles (ManPages me, long *numberOfTitles);
+const char32 **ManPages_getTitles (ManPages me, long *numberOfTitles);
 
 /* End of file ManPages.h */
 #endif
diff --git a/sys/ManPagesM.h b/sys/ManPagesM.h
index e3e458c..b9c3a7f 100644
--- a/sys/ManPagesM.h
+++ b/sys/ManPagesM.h
@@ -2,7 +2,7 @@
 #define _ManPagesM_h_
 /* ManPagesM.h
  *
- * Copyright (C) 1996-2011,2014 Paul Boersma
+ * Copyright (C) 1996-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 	#include "ManPages.h"
 #endif
 
-#define MAN_BEGIN(t,a,d)  { const wchar_t *title = t, *author = a; long date = d; \
+#define MAN_BEGIN(t,a,d)  { const char32 *title = t, *author = a; long date = d; \
 	static struct structManPage_Paragraph page [] = {
 #define INTRO(text)  { kManPage_type_INTRO, text },
 #define ENTRY(text)  { kManPage_type_ENTRY, text },
@@ -50,7 +50,7 @@
 #define CODE5(text)  { kManPage_type_CODE5, text },
 #define PROTOTYPE(text)  { kManPage_type_PROTOTYPE, text },
 #define FORMULA(text)  { kManPage_type_FORMULA, text },
-#define PICTURE(width,height,draw)  { kManPage_type_PICTURE, NULL, width, height, draw },
+#define PICTURE(width,height,draw)  { kManPage_type_PICTURE, nullptr, width, height, draw },
 #define SCRIPT(width,height,text)  { kManPage_type_SCRIPT, text, width, height },
 #define MAN_END  { 0 } }; ManPages_addPage (me, title, author, date, page); }
 
diff --git a/sys/Manual.cpp b/sys/Manual.cpp
index 7737a03..cf77c49 100644
--- a/sys/Manual.cpp
+++ b/sys/Manual.cpp
@@ -1,6 +1,6 @@
 /* Manual.cpp
  *
- * Copyright (C) 1996-2011,2014 Paul Boersma
+ * Copyright (C) 1996-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,8 +26,8 @@
  * pb 2005/05/08 embedded scripts (for pictures)
  * pb 2005/07/19 moved navigation buttons to the top, removed page label and horizontal scroll bar
  * pb 2006/10/20 embedded scripts: not on opening page
- * pb 2007/06/10 wchar_t
- * pb 2007/08/12 wchar_t
+ * pb 2007/06/10 wchar
+ * pb 2007/08/12 wchar
  * pb 2008/01/19 double
  * pb 2008/03/20 split off Help menu
  * pb 2008/03/21 new Editor API
@@ -51,18 +51,20 @@ Thing_implement (Manual, HyperPage, 0);
 
 #define SEARCH_PAGE  0
 
-static const wchar_t *month [] =
-	{ L"", L"January", L"February", L"March", L"April", L"May", L"June",
-	  L"July", L"August", L"September", L"October", L"November", L"December" };
+static const char32 *month [] =
+	{ U"", U"January", U"February", U"March", U"April", U"May", U"June",
+	  U"July", U"August", U"September", U"October", U"November", U"December" };
 
 static void menu_cb_writeOneToHtmlFile (EDITOR_ARGS) {
 	EDITOR_IAM (Manual);
-	EDITOR_FORM_WRITE (L"Save as HTML file", 0)
+	EDITOR_FORM_WRITE (U"Save as HTML file", 0)
 		ManPages manPages = (ManPages) my data;
-		wchar_t *p = defaultName;
-		wcscpy (p, ((ManPage) manPages -> pages -> item [my path]) -> title);
-		while (*p) { if (! isalnum (*p) && *p != '_') *p = '_'; p ++; }
-		wcscat (defaultName, L".html");
+		autoMelderString buffer;
+		MelderString_copy (& buffer, ((ManPage) manPages -> pages -> item [my path]) -> title);
+		char32 *p = buffer.string;
+		while (*p) { if (! isalnum ((int) *p) && *p != U'_') *p = U'_'; p ++; }
+		MelderString_append (& buffer, U".html");
+		Melder_sprint (defaultName,300, buffer.string);
 	EDITOR_DO_WRITE
 		ManPages_writeOneToHtmlFile ((ManPages) my data, my path, file);
 	EDITOR_END
@@ -70,29 +72,29 @@ static void menu_cb_writeOneToHtmlFile (EDITOR_ARGS) {
 
 static void menu_cb_writeAllToHtmlDir (EDITOR_ARGS) {
 	EDITOR_IAM (Manual);
-	EDITOR_FORM (L"Save all pages as HTML files", 0)
-		LABEL (L"", L"Type a directory name:")
-		TEXTFIELD (L"directory", L"")
+	EDITOR_FORM (U"Save all pages as HTML files", 0)
+		LABEL (U"", U"Type a directory name:")
+		TEXTFIELD (U"directory", U"")
 	EDITOR_OK
 		structMelderDir currentDirectory = { { 0 } };
 		Melder_getDefaultDir (& currentDirectory);
-		SET_STRING (L"directory", Melder_dirToPath (& currentDirectory))
+		SET_STRING (U"directory", Melder_dirToPath (& currentDirectory))
 	EDITOR_DO
-		wchar_t *directory = GET_STRING (L"directory");
+		char32 *directory = GET_STRING (U"directory");
 		ManPages_writeAllToHtmlDir ((ManPages) my data, directory);
 	EDITOR_END
 }
 
 static void menu_cb_searchForPageList (EDITOR_ARGS) {
 	EDITOR_IAM (Manual);
-	EDITOR_FORM (L"Search for page", 0)
+	EDITOR_FORM (U"Search for page", 0)
 		ManPages manPages = (ManPages) my data;
 		long numberOfPages;
-		const wchar_t **pages = ManPages_getTitles (manPages, & numberOfPages);
-		LIST (L"Page", manPages -> pages -> size, pages, 1)
+		const char32 **pages = ManPages_getTitles (manPages, & numberOfPages);
+		LIST (U"Page", manPages -> pages -> size, pages, 1)
 	EDITOR_OK
 	EDITOR_DO
-		HyperPage_goToPage_i (me, GET_INTEGER (L"Page"));
+		HyperPage_goToPage_i (me, GET_INTEGER (U"Page"));
 	EDITOR_END
 }
 
@@ -104,12 +106,12 @@ void structManual :: v_draw () {
 	Graphics_clearWs (g);
 	#endif
 	if (our path == SEARCH_PAGE) {
-		HyperPage_pageTitle (this, L"Best matches");
-		HyperPage_intro (this, L"The best matches to your query seem to be:");
+		HyperPage_pageTitle (this, U"Best matches");
+		HyperPage_intro (this, U"The best matches to your query seem to be:");
 		for (int i = 1; i <= our numberOfMatches; i ++) {
-			wchar_t link [300];
+			char32 link [300];
 			page = (ManPage) manPages -> pages -> item [matches [i]];
-			swprintf (link, 300, L"• @@%ls", page -> title);
+			Melder_sprint (link,300, U"• @@", page -> title);
 			HyperPage_listItem (this, link);
 		}
 		return;
@@ -154,12 +156,12 @@ void structManual :: v_draw () {
 		bool goAhead = true;
 		while (page -> paragraphs [lastParagraph]. type != 0) lastParagraph ++;
 		if (lastParagraph > 0) {
-			const wchar_t *text = page -> paragraphs [lastParagraph - 1]. text;
-			if (text == NULL || text [0] == '\0' || text [wcslen (text) - 1] != ':') {
+			const char32 *text = page -> paragraphs [lastParagraph - 1]. text;
+			if (! text || text [0] == U'\0' || text [str32len (text) - 1] != U':') {
 				if (our printing && our suppressLinksHither)
 					goAhead = false;
 				else
-					HyperPage_entry (this, L"Links to this page");
+					HyperPage_entry (this, U"Links to this page");
 			}
 		}
 		if (goAhead) for (ilink = 1; ilink <= page -> nlinksHither; ilink ++) {
@@ -169,23 +171,25 @@ void structManual :: v_draw () {
 				if (page -> linksThither [jlink] == link)
 					alreadyShown = true;
 			if (! alreadyShown) {
-				const wchar_t *title = ((ManPage) manPages -> pages -> item [page -> linksHither [ilink]]) -> title;
-				wchar_t linkText [304];
-				swprintf (linkText, 304, L"@@%ls@", title);
+				const char32 *title = ((ManPage) manPages -> pages -> item [page -> linksHither [ilink]]) -> title;
+				char32 linkText [304];
+				Melder_sprint (linkText, 304, U"@@", title, U"@");
 				HyperPage_listItem (this, linkText);
 			}
 		}
 	}
 	if (! our printing && page -> date) {
-		wchar_t signature [100];
+		char32 signature [100];
 		long date = page -> date;
 		int imonth = date % 10000 / 100;
 		if (imonth < 0 || imonth > 12) imonth = 0;
-		swprintf (signature, 100, L"© %ls, %ld %ls %ld",
-			wcsequ (page -> author, L"ppgb") ? L"Paul Boersma" :
-			wcsequ (page -> author, L"djmw") ? L"David Weenink" : page -> author,
-			date % 100, month [imonth], date / 10000);
-		HyperPage_any (this, L"", our p_font, our p_fontSize, 0, 0.0,
+		Melder_sprint (signature,100,
+			U"© ", str32equ (page -> author, U"ppgb") ? U"Paul Boersma" :
+			       str32equ (page -> author, U"djmw") ? U"David Weenink" : page -> author,
+			U", ", date % 100,
+			U" ", month [imonth],
+			U" ", date / 10000);
+		HyperPage_any (this, U"", our p_font, our p_fontSize, 0, 0.0,
 			0.0, 0.0, 0.1, 0.1, HyperPage_ADD_BORDER);
 		HyperPage_any (this, signature, our p_font, our p_fontSize, Graphics_ITALIC, 0.0,
 			0.03, 0.0, 0.1, 0.0, 0);
@@ -199,13 +203,13 @@ static void print (I, Graphics graphics) {
 	ManPages manPages = (ManPages) my data;
 	long numberOfPages = manPages -> pages -> size, savePage = my path;
 	my ps = graphics;
-	Graphics_setDollarSignIsCode (my ps, TRUE);
-	Graphics_setAtSignIsLink (my ps, TRUE);
-	my printing = TRUE;
+	Graphics_setDollarSignIsCode (my ps, true);
+	Graphics_setAtSignIsLink (my ps, true);
+	my printing = true;
 	HyperPage_initSheetOfPaper ((HyperPage) me);
 	for (long ipage = 1; ipage <= numberOfPages; ipage ++) {
 		ManPage page = (ManPage) manPages -> pages -> item [ipage];
-		if (my printPagesStartingWith == NULL ||
+		if (my printPagesStartingWith == nullptr ||
 		    Melder_stringMatchesCriterion (page -> title, kMelder_string_STARTS_WITH, my printPagesStartingWith))
 		{
 			ManPage_Paragraph par;
@@ -215,33 +219,33 @@ static void print (I, Graphics graphics) {
 			par = my paragraphs;
 			while ((par ++) -> type) my numberOfParagraphs ++;
 			Melder_free (my currentPageTitle);
-			my currentPageTitle = Melder_wcsdup_f (page -> title);
+			my currentPageTitle = Melder_dup_f (page -> title);
 			my v_goToPage_i (ipage);
 			my v_draw ();
 			my v_goToPage_i (savePage);
 		}
 	}
-	my printing = FALSE;
-	my printPagesStartingWith = NULL;
+	my printing = false;
+	my printPagesStartingWith = nullptr;
 }
 
 static void menu_cb_printRange (EDITOR_ARGS) {
 	EDITOR_IAM (Manual);
-	EDITOR_FORM (L"Print range", 0)
-		SENTENCE (L"Left or inside header", L"")
-		SENTENCE (L"Middle header", L"")
-		SENTENCE (L"Right or outside header", L"Manual")
-		SENTENCE (L"Left or inside footer", L"")
-		SENTENCE (L"Middle footer", L"")
-		SENTENCE (L"Right or outside footer", L"")
-		BOOLEAN (L"Mirror even/odd headers", TRUE)
-		LABEL (L"", L"Print all pages whose title starts with:")
-		TEXTFIELD (L"Print pages starting with", L"Intro")
-		INTEGER (L"First page number", L"1")
-		BOOLEAN (L"Suppress \"Links to this page\"", FALSE)
+	EDITOR_FORM (U"Print range", 0)
+		SENTENCE (U"Left or inside header", U"")
+		SENTENCE (U"Middle header", U"")
+		SENTENCE (U"Right or outside header", U"Manual")
+		SENTENCE (U"Left or inside footer", U"")
+		SENTENCE (U"Middle footer", U"")
+		SENTENCE (U"Right or outside footer", U"")
+		BOOLEAN (U"Mirror even/odd headers", true)
+		LABEL (U"", U"Print all pages whose title starts with:")
+		TEXTFIELD (U"Print pages starting with", U"Intro")
+		INTEGER (U"First page number", U"1")
+		BOOLEAN (U"Suppress \"Links to this page\"", false)
 	EDITOR_OK
 		ManPages manPages = (ManPages) my data;
-		time_t today = time (NULL);
+		time_t today = time (nullptr);
 		char dateA [50];
 		#ifdef UNIX
 			struct tm *tm = localtime (& today);
@@ -249,26 +253,26 @@ static void menu_cb_printRange (EDITOR_ARGS) {
 		#else
 			strcpy (dateA, ctime (& today));
 		#endif
-		wchar_t *date = Melder_peekUtf8ToWcs (dateA), *newline;
-		newline = wcschr (date, '\n'); if (newline) *newline = '\0';
-		SET_STRING (L"Left or inside header", date)
-		SET_STRING (L"Right or outside header", my name)
-		if (my d_printingPageNumber) SET_INTEGER (L"First page number", my d_printingPageNumber + 1)
+		char32 *date = Melder_peek8to32 (dateA), *newline;
+		newline = str32chr (date, U'\n'); if (newline) *newline = U'\0';
+		SET_STRING (U"Left or inside header", date)
+		SET_STRING (U"Right or outside header", my name)
+		if (my d_printingPageNumber) SET_INTEGER (U"First page number", my d_printingPageNumber + 1)
 		if (my path >= 1 && my path <= manPages -> pages -> size) {
 			ManPage page = (ManPage) manPages -> pages -> item [my path];
-			SET_STRING (L"Print pages starting with", page -> title);
+			SET_STRING (U"Print pages starting with", page -> title);
 		}
 	EDITOR_DO
-		my insideHeader = GET_STRING (L"Left or inside header");
-		my middleHeader = GET_STRING (L"Middle header");
-		my outsideHeader = GET_STRING (L"Right or outside header");
-		my insideFooter = GET_STRING (L"Left or inside footer");
-		my middleFooter = GET_STRING (L"Middle footer");
-		my outsideFooter = GET_STRING (L"Right or outside footer");
-		my mirror = GET_INTEGER (L"Mirror even/odd headers");
-		my printPagesStartingWith = GET_STRING (L"Print pages starting with");
-		my d_printingPageNumber = GET_INTEGER (L"First page number");
-		my suppressLinksHither = GET_INTEGER (L"Suppress \"Links to this page\"");
+		my insideHeader = GET_STRING (U"Left or inside header");
+		my middleHeader = GET_STRING (U"Middle header");
+		my outsideHeader = GET_STRING (U"Right or outside header");
+		my insideFooter = GET_STRING (U"Left or inside footer");
+		my middleFooter = GET_STRING (U"Middle footer");
+		my outsideFooter = GET_STRING (U"Right or outside footer");
+		my mirror = GET_INTEGER (U"Mirror even/odd headers");
+		my printPagesStartingWith = GET_STRING (U"Print pages starting with");
+		my d_printingPageNumber = GET_INTEGER (U"First page number");
+		my suppressLinksHither = GET_INTEGER (U"Suppress \"Links to this page\"");
 		Printer_print (print, me);
 	EDITOR_END
 }
@@ -277,7 +281,7 @@ static void menu_cb_printRange (EDITOR_ARGS) {
 
 static double *goodnessOfMatch;
 
-static double searchToken (ManPages me, long ipage, wchar_t *token) {
+static double searchToken (ManPages me, long ipage, char32 *token) {
 	double goodness = 0.0;
 	ManPage page = (ManPage) my pages -> item [ipage];
 	struct structManPage_Paragraph *par = & page -> paragraphs [0];
@@ -285,27 +289,27 @@ static double searchToken (ManPages me, long ipage, wchar_t *token) {
 	/*
 	 * Try to find a match in the title, case insensitively.
 	 */
-	static MelderString buffer = { 0 };
+	static MelderString buffer { 0 };
 	MelderString_copy (& buffer, page -> title);
-	for (wchar_t *p = & buffer.string [0]; *p != '\0'; p ++) *p = tolower (*p);
-	if (wcsstr (buffer.string, token)) {
-		goodness += 300.0;   /* Lots of points for a match in the title! */
-		if (wcsequ (buffer.string, token))
-			goodness += 10000.0;   /* Even more points for an exact match! */
+	for (char32 *p = & buffer.string [0]; *p != U'\0'; p ++) *p = towlower ((int) *p);
+	if (str32str (buffer.string, token)) {
+		goodness += 300.0;   // lots of points for a match in the title!
+		if (str32equ (buffer.string, token))
+			goodness += 10000.0;   // even more points for an exact match!
 	}
 	/*
 	 * Try to find a match in the paragraphs, case-insensitively.
 	 */
 	while (par -> type) {
 		if (par -> text) {
-			wchar_t *ptoken;
+			char32 *ptoken;
 			MelderString_copy (& buffer, par -> text);
-			for (wchar_t *p = & buffer.string [0]; *p != '\0'; p ++) *p = tolower (*p);
-			ptoken = wcsstr (buffer.string, token);
+			for (char32 *p = & buffer.string [0]; *p != '\0'; p ++) *p = towlower ((int) *p);
+			ptoken = str32str (buffer.string, token);
 			if (ptoken) {
-				goodness += 10.0;   /* Ten points for every paragraph with a match! */
-				if (wcsstr (ptoken + wcslen (token), token)) {
-					goodness += 1.0;   /* One point for every second occurrence in a paragraph! */
+				goodness += 10.0;   // ten points for every paragraph with a match!
+				if (str32str (ptoken + str32len (token), token)) {
+					goodness += 1.0;   // one point for every second occurrence in a paragraph!
 				}
 			}
 		}
@@ -314,26 +318,26 @@ static double searchToken (ManPages me, long ipage, wchar_t *token) {
 	return goodness;
 }
 
-static void search (Manual me, const wchar_t *query) {
+static void search (Manual me, const char32 *query) {
 	ManPages manPages = (ManPages) my data;
 	long numberOfPages = manPages -> pages -> size;
-	static MelderString searchText = { 0 };
+	static MelderString searchText { 0 };
 	MelderString_copy (& searchText, query);
-	for (wchar_t *p = & searchText.string [0]; *p != '\0'; p ++) {
-		if (*p == '\n') *p = ' ';
-		*p = tolower (*p);
+	for (char32 *p = & searchText.string [0]; *p != U'\0'; p ++) {
+		if (*p == U'\n') *p = U' ';
+		*p = towlower ((int) *p);
 	}
 	if (! goodnessOfMatch)
 		goodnessOfMatch = NUMvector <double> (1, numberOfPages);
 	for (long ipage = 1; ipage <= numberOfPages; ipage ++) {
-		wchar_t *token = searchText.string;
+		char32 *token = searchText.string;
 		goodnessOfMatch [ipage] = 1.0;
 		for (;;) {
-			wchar_t *space = wcschr (token, ' ');
-			if (space) *space = '\0';
+			char32 *space = str32chr (token, U' ');
+			if (space) *space = U'\0';
 			goodnessOfMatch [ipage] *= searchToken (manPages, ipage, token);
 			if (! space) break;
-			*space = ' ';   // restore
+			*space = U' ';   // restore
 			token = space + 1;
 		}
 	}
@@ -357,8 +361,8 @@ static void search (Manual me, const wchar_t *query) {
 	HyperPage_goToPage_i (me, SEARCH_PAGE);
 }
 
-void Manual_search (Manual me, const wchar_t *query) {
-	my searchText -> f_setString (query);
+void Manual_search (Manual me, const char32 *query) {
+	GuiText_setString (my searchText, query);
 	search (me, query);
 }
 
@@ -366,7 +370,7 @@ static void gui_button_cb_home (I, GuiButtonEvent event) {
 	(void) event;
 	iam (Manual);
 	ManPages pages = (ManPages) my data;
-	long iHome = ManPages_lookUp (pages, L"Intro");
+	long iHome = ManPages_lookUp (pages, U"Intro");
 	HyperPage_goToPage_i (me, iHome ? iHome : 1);
 }
  
@@ -374,32 +378,32 @@ static void gui_button_cb_record (I, GuiButtonEvent event) {
 	(void) event;
 	iam (Manual);
 	ManPages manPages = (ManPages) my data;
-	ManPage manPage = (ManPage) (my path < 1 ? NULL : manPages -> pages -> item [my path]);
-	my recordButton  -> f_setSensitive (false);
-	my playButton    -> f_setSensitive (false);
-	my publishButton -> f_setSensitive (false);
+	ManPage manPage = (ManPage) (my path < 1 ? nullptr : manPages -> pages -> item [my path]);
+	GuiThing_setSensitive (my recordButton,  false);
+	GuiThing_setSensitive (my playButton,    false);
+	GuiThing_setSensitive (my publishButton, false);
 	#if motif
 		XmUpdateDisplay (my d_windowForm -> d_xmShell);
 	#endif
-	if (! Melder_record (manPage == NULL ? 1.0 : manPage -> recordingTime)) Melder_flushError (NULL);
-	my recordButton  -> f_setSensitive (true);
-	my playButton    -> f_setSensitive (true);
-	my publishButton -> f_setSensitive (true);
+	if (! Melder_record (manPage == nullptr ? 1.0 : manPage -> recordingTime)) Melder_flushError ();
+	GuiThing_setSensitive (my recordButton,  true);
+	GuiThing_setSensitive (my playButton,    true);
+	GuiThing_setSensitive (my publishButton, true);
 }
 
 static void gui_button_cb_play (I, GuiButtonEvent event) {
 	(void) event;
 	iam (Manual);
-	my recordButton  -> f_setSensitive (false);
-	my playButton    -> f_setSensitive (false);
-	my publishButton -> f_setSensitive (false);
+	GuiThing_setSensitive (my recordButton,  false);
+	GuiThing_setSensitive (my playButton,    false);
+	GuiThing_setSensitive (my publishButton, false);
 	#if motif
 		XmUpdateDisplay (my d_windowForm -> d_xmShell);
 	#endif
 	Melder_play ();
-	my recordButton  -> f_setSensitive (true);
-	my playButton    -> f_setSensitive (true);
-	my publishButton -> f_setSensitive (true);
+	GuiThing_setSensitive (my recordButton,  true);
+	GuiThing_setSensitive (my playButton,    true);
+	GuiThing_setSensitive (my publishButton, true);
 }
 
 static void gui_button_cb_publish (I, GuiButtonEvent event) {
@@ -410,7 +414,7 @@ static void gui_button_cb_publish (I, GuiButtonEvent event) {
 }
 
 static void do_search (Manual me) {
-	wchar_t *query = my searchText -> f_getString ();
+	char32 *query = GuiText_getString (my searchText);
 	search (me, query);
 	Melder_free (query);
 }
@@ -437,52 +441,52 @@ void structManual :: v_createChildren () {
 	#endif
 	int height = Machine_getTextHeight (), y = Machine_getMenuBarHeight () + 4;
 	our homeButton = GuiButton_createShown (our d_windowForm, 104, 168, y, y + height,
-		L"Home", gui_button_cb_home, this, 0);
+		U"Home", gui_button_cb_home, this, 0);
 	if (pages -> dynamic) {
 		our recordButton = GuiButton_createShown (our d_windowForm, 4, 79, y+height+8, y+height+8 + height,
-			L"Record", gui_button_cb_record, this, 0);
+			U"Record", gui_button_cb_record, this, 0);
 		our playButton = GuiButton_createShown (our d_windowForm, 85, 160, y+height+8, y+height+8 + height,
-			L"Play", gui_button_cb_play, this, 0);
+			U"Play", gui_button_cb_play, this, 0);
 		our publishButton = GuiButton_createShown (our d_windowForm, 166, 166 + 175, y+height+8, y+height+8 + height,
-			L"Copy last played to list", gui_button_cb_publish, this, 0);
+			U"Copy last played to list", gui_button_cb_publish, this, 0);
 	}
 	GuiButton_createShown (our d_windowForm, 274, 274 + 69, y, y + height,
-		L"Search:", gui_button_cb_search, this, GuiButton_DEFAULT);
+		U"Search:", gui_button_cb_search, this, GuiButton_DEFAULT);
 	our searchText = GuiText_createShown (our d_windowForm, 274+69 + STRING_SPACING, 452 + STRING_SPACING - 2, y, y + Gui_TEXTFIELD_HEIGHT, 0);
 }
 
-static void menu_cb_help (EDITOR_ARGS) { EDITOR_IAM (Manual); HyperPage_goToPage (me, L"Manual"); }
+static void menu_cb_help (EDITOR_ARGS) { EDITOR_IAM (Manual); HyperPage_goToPage (me, U"Manual"); }
 
 void structManual :: v_createMenus () {
 	Manual_Parent :: v_createMenus ();
 
-	Editor_addCommand (this, L"File", L"Print manual...", 0, menu_cb_printRange);
-	Editor_addCommand (this, L"File", L"Save page as HTML file...", 0, menu_cb_writeOneToHtmlFile);
-	Editor_addCommand (this, L"File", L"Save manual to HTML directory...", 0, menu_cb_writeAllToHtmlDir);
-	Editor_addCommand (this, L"File", L"-- close --", 0, NULL);
+	Editor_addCommand (this, U"File", U"Print manual...", 0, menu_cb_printRange);
+	Editor_addCommand (this, U"File", U"Save page as HTML file...", 0, menu_cb_writeOneToHtmlFile);
+	Editor_addCommand (this, U"File", U"Save manual to HTML directory...", 0, menu_cb_writeAllToHtmlDir);
+	Editor_addCommand (this, U"File", U"-- close --", 0, nullptr);
 
-	Editor_addCommand (this, L"Go to", L"Search for page (list)...", 0, menu_cb_searchForPageList);
+	Editor_addCommand (this, U"Go to", U"Search for page (list)...", 0, menu_cb_searchForPageList);
 }
 
 void structManual :: v_createHelpMenuItems (EditorMenu menu) {
 	Manual_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"Manual help", '?', menu_cb_help);
+	EditorMenu_addCommand (menu, U"Manual help", '?', menu_cb_help);
 }
 
 void structManual :: v_defaultHeaders (EditorCommand cmd) {
 	Manual me = (Manual) cmd -> d_editor;
 	ManPages manPages = (ManPages) my data;
 	if (my path) {
-		wchar_t string [400];
-		static const wchar_t *shortMonth [] =
-			{ L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun", L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec" };
+		char32 string [400];
+		static const char32 *shortMonth [] =
+			{ U"Jan", U"Feb", U"Mar", U"Apr", U"May", U"Jun", U"Jul", U"Aug", U"Sep", U"Oct", U"Nov", U"Dec" };
 		ManPage page = (ManPage) manPages -> pages -> item [my path];
 		long date = page -> date;
-		SET_STRING (L"Right or outside header", page -> title)
-		SET_STRING (L"Left or inside footer", page -> author)
+		SET_STRING (U"Right or outside header", page -> title)
+		SET_STRING (U"Left or inside footer", page -> author)
 		if (date) {
-			swprintf (string, 400, L"%ls %ld, %ld", shortMonth [date % 10000 / 100 - 1], date % 100, date / 10000);
-			SET_STRING (L"Left or inside header", string)
+			Melder_sprint (string,400, shortMonth [date % 10000 / 100 - 1], U" ", date % 100, U", ", date / 10000);
+			SET_STRING (U"Left or inside header", string)
 		}
 	}
 }
@@ -503,7 +507,7 @@ void structManual :: v_goToPage_i (long pageNumber) {
 			our path = SEARCH_PAGE;
 			Melder_free (our currentPageTitle);
 			return;
-		} else Melder_throw ("Page ", pageNumber, " not found.");
+		} else Melder_throw (U"Page ", pageNumber, U" not found.");
 	}
 	our path = pageNumber;
 	ManPage page = (ManPage) manPages -> pages -> item [path];
@@ -512,10 +516,10 @@ void structManual :: v_goToPage_i (long pageNumber) {
 	ManPage_Paragraph par = paragraphs;
 	while ((par ++) -> type) our numberOfParagraphs ++;
 	Melder_free (our currentPageTitle);
-	our currentPageTitle = Melder_wcsdup_f (page -> title);
+	our currentPageTitle = Melder_dup_f (page -> title);
 }
 
-int structManual :: v_goToPage (const wchar_t *title) {
+int structManual :: v_goToPage (const char32 *title) {
 	ManPages manPages = (ManPages) our data;
 	if (title [0] == '\\' && title [1] == 'F' && title [2] == 'I') {
 		structMelderFile file = { 0 };
@@ -526,28 +530,29 @@ int structManual :: v_goToPage (const wchar_t *title) {
 		autoMelderSetDefaultDir dir (& manPages -> rootDirectory);
 		autoPraatBackground background;
 		try {
-			praat_executeScriptFromFileNameWithArguments (title + 3);
+			autostring32 fileNameWithArguments = Melder_dup (title + 3);
+			praat_executeScriptFromFileNameWithArguments (fileNameWithArguments.peek());
 		} catch (MelderError) {
-			Melder_flushError (NULL);
+			Melder_flushError ();
 		}
 		return 0;
 	} else {
 		long i = ManPages_lookUp (manPages, title);
 		if (! i)
-			Melder_throw ("Page \"", title, "\" not found.");
+			Melder_throw (U"Page \"", title, U"\" not found.");
 		our v_goToPage_i (i);
 		return 1;
 	}
 }
 
-void Manual_init (Manual me, const wchar_t *title, Data data, bool ownData) {
+void Manual_init (Manual me, const char32 *title, Daata data, bool ownData) {
 	ManPages manPages = (ManPages) data;
-	wchar_t windowTitle [101];
+	char32 windowTitle [101];
 	long i;
 	ManPage page;
 	ManPage_Paragraph par;
 	if (! (i = ManPages_lookUp (manPages, title)))
-		Melder_throw ("Page \"", title, "\" not found.");
+		Melder_throw (U"Page \"", title, U"\" not found.");
 	my path = i;
 	page = (ManPage) manPages -> pages -> item [i];
 	my paragraphs = page -> paragraphs;
@@ -556,24 +561,24 @@ void Manual_init (Manual me, const wchar_t *title, Data data, bool ownData) {
 	while ((par ++) -> type) my numberOfParagraphs ++;
 
 	if (((ManPage) manPages -> pages -> item [1]) -> title [0] == '-') {
-		wcscpy (windowTitle, & ((ManPage) manPages -> pages -> item [1]) -> title [1]);
-		if (windowTitle [wcslen (windowTitle) - 1] == '-') windowTitle [wcslen (windowTitle) - 1] = '\0';
+		Melder_sprint (windowTitle,101, & ((ManPage) manPages -> pages -> item [1]) -> title [1]);
+		if (windowTitle [str32len (windowTitle) - 1] == U'-') windowTitle [str32len (windowTitle) - 1] = U'\0';
 	} else {
-		wcscpy (windowTitle, L"Manual");
+		Melder_sprint (windowTitle,101, U"Manual");
 	}
 	my d_ownData = ownData;
 	HyperPage_init (me, windowTitle, data);
 	MelderDir_copy (& manPages -> rootDirectory, & my rootDirectory);
-	my history [0]. page = Melder_wcsdup_f (title);   /* BAD */
+	my history [0]. page = Melder_dup_f (title);   // BAD
 }
 
-Manual Manual_create (const wchar_t *title, Data data, bool ownData) {
+Manual Manual_create (const char32 *title, Daata data, bool ownData) {
 	try {
 		autoManual me = Thing_new (Manual);
 		Manual_init (me.peek(), title, data, ownData);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Manual window not created.");
+		Melder_throw (U"Manual window not created.");
 	}
 }
 
diff --git a/sys/Manual.h b/sys/Manual.h
index adef731..db18070 100644
--- a/sys/Manual.h
+++ b/sys/Manual.h
@@ -2,7 +2,7 @@
 #define _Manual_h_
 /* Manual.h
  *
- * Copyright (C) 1996-2012 Paul Boersma
+ * Copyright (C) 1996-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,36 +23,47 @@
 #include "ManPages.h"
 
 Thing_define (Manual, HyperPage) {
-	// new data:
-	public:
-		long path, numberOfParagraphs;
-		struct structManPage_Paragraph *paragraphs;
-		GuiText searchText;
-		GuiButton homeButton, recordButton, playButton, publishButton;
-		int numberOfMatches;
-		long matches [1 + 20], fromPage, toPage;
-		int suppressLinksHither;
-		wchar_t *printPagesStartingWith;
-	// overridden methods:
-		virtual bool v_scriptable () { return false; }
-		virtual void v_createChildren ();
-		virtual void v_createMenus ();
-		virtual bool v_hasQueryMenu () { return false; }
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_draw ();
-		virtual void v_defaultHeaders (EditorCommand cmd);
-		virtual long v_getNumberOfPages ();
-		virtual long v_getCurrentPageNumber ();
-		virtual int v_goToPage (const wchar_t *title);
-		virtual void v_goToPage_i (long pageNumber);
-		virtual bool v_hasHistory () { return true; }
-		virtual bool v_isOrdered () { return true; }
+	long path, numberOfParagraphs;
+	struct structManPage_Paragraph *paragraphs;
+	GuiText searchText;
+	GuiButton homeButton, recordButton, playButton, publishButton;
+	int numberOfMatches;
+	long matches [1 + 20], fromPage, toPage;
+	int suppressLinksHither;
+	char32 *printPagesStartingWith;
+
+	bool v_scriptable ()
+		override { return false; }
+	void v_createChildren ()
+		override;
+	void v_createMenus ()
+		override;
+	bool v_hasQueryMenu ()
+		override { return false; }
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_draw ()
+		override;
+	void v_defaultHeaders (EditorCommand cmd)
+		override;
+	long v_getNumberOfPages ()
+		override;
+	long v_getCurrentPageNumber ()
+		override;
+	int v_goToPage (const char32 *title)
+		override;
+	void v_goToPage_i (long pageNumber)
+		override;
+	bool v_hasHistory ()
+		override { return true; }
+	bool v_isOrdered ()
+		override { return true; }
 };
 
-void Manual_init (Manual me, const wchar_t *title, Data data, bool ownData);
-Manual Manual_create (const wchar_t *title, Data data, bool ownData);
+void Manual_init (Manual me, const char32 *title, Daata data, bool ownData);
+Manual Manual_create (const char32 *title, Daata data, bool ownData);
 
-void Manual_search (Manual me, const wchar_t *query);
+void Manual_search (Manual me, const char32 *query);
 
 /* End of file Manual.h */
 #endif
diff --git a/sys/MelderThread.h b/sys/MelderThread.h
index d7f6491..218bd93 100644
--- a/sys/MelderThread.h
+++ b/sys/MelderThread.h
@@ -52,7 +52,7 @@
 	#define MelderThread_LOCK(_mutex)  pthread_mutex_lock (& _mutex)
 	#define MelderThread_UNLOCK(_mutex)  pthread_mutex_unlock (& _mutex)
 	#define MelderThread_RETURN_TYPE  void *
-	#define MelderThread_RETURN  return NULL;
+	#define MelderThread_RETURN  return nullptr;
 #elif USE_CPPTHREADS
 	#include <mutex>
 	#include <thread>
@@ -100,8 +100,8 @@ static int MelderThread_getNumberOfProcessors () {
 			std::vector <HANDLE> threads (numberOfThreads);
 			try {
 				for (int ithread = 1; ithread < numberOfThreads; ithread ++) {
-					threads [ithread - 1] = CreateThread (NULL, 0,
-						(DWORD (WINAPI *)(void *)) func, (void *) args [ithread - 1].peek(), 0, NULL);
+					threads [ithread - 1] = CreateThread (nullptr, 0,
+						(DWORD (WINAPI *)(void *)) func, (void *) args [ithread - 1].peek(), 0, nullptr);
 				}
 				func (args [numberOfThreads - 1].peek());
 			} catch (MelderError) {
@@ -126,17 +126,17 @@ static int MelderThread_getNumberOfProcessors () {
 			try {
 				for (int ithread = 1; ithread < numberOfThreads; ithread ++) {
 					(void) pthread_create (& threads [ithread - 1],
-						NULL, (void*(*)(void *)) func, (void *) args [ithread - 1].peek());
+						nullptr, (void*(*)(void *)) func, (void *) args [ithread - 1].peek());
 				}
 				func (args [numberOfThreads - 1].peek());
 			} catch (MelderError) {
 				for (int ithread = 1; ithread < numberOfThreads; ithread ++) {
-					pthread_join (threads [ithread - 1], NULL);
+					pthread_join (threads [ithread - 1], nullptr);
 				}
 				throw;
 			}
 			for (int ithread = 1; ithread < numberOfThreads; ithread ++) {
-				pthread_join (threads [ithread - 1], NULL);
+				pthread_join (threads [ithread - 1], nullptr);
 			}
 		}
 	}
diff --git a/sys/Picture.cpp b/sys/Picture.cpp
index 035fe24..162f057 100644
--- a/sys/Picture.cpp
+++ b/sys/Picture.cpp
@@ -1,6 +1,6 @@
 /* Picture.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brauße
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brauße
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@ struct structPicture {
 	double selx1, selx2, sely1, sely2;   // selection in NDC co-ordinates
 	void (*selectionChangedCallback) (struct structPicture *, void *, double, double, double, double);
 	void *selectionChangedClosure;
-	int backgrounding, mouseSelectsInnerViewport;
+	bool backgrounding, mouseSelectsInnerViewport;
 };
 
 static void drawMarkers (Picture me)
@@ -71,9 +71,9 @@ static void drawMarkers (Picture me)
 	for (i = 1; i < SIDE; i ++) {
 		double x = i;
 		Graphics_setTextAlignment (my selectionGraphics, Graphics_CENTRE, Graphics_TOP);
-		Graphics_text1 (my selectionGraphics, x, SIDE, Melder_integer (i));
+		Graphics_text (my selectionGraphics, x, SIDE, i);
 		Graphics_setTextAlignment (my selectionGraphics, Graphics_CENTRE, Graphics_BOTTOM);
-		Graphics_text1 (my selectionGraphics, x, 0, Melder_integer (i));
+		Graphics_text (my selectionGraphics, x, 0, i);
 	}
 	for (i = 1; i < SQUARES ; i ++) {   /* Vertical ticks. */
 		double x = 0.5 * i;
@@ -83,9 +83,9 @@ static void drawMarkers (Picture me)
 	for (i = 1; i < SIDE; i ++) {
 		double y = SIDE - i;
 		Graphics_setTextAlignment (my selectionGraphics, Graphics_LEFT, Graphics_HALF);
-		Graphics_text1 (my selectionGraphics, 0.04, y, Melder_integer (i));
+		Graphics_text (my selectionGraphics, 0.04, y, i);
 		Graphics_setTextAlignment (my selectionGraphics, Graphics_RIGHT, Graphics_HALF);
-		Graphics_text1 (my selectionGraphics, SIDE - 0.03, y, Melder_integer (i));
+		Graphics_text (my selectionGraphics, SIDE - 0.03, y, i);
 	}
 	for (i = 1; i < SQUARES; i ++) {   /* Horizontal ticks. */
 		double y = SIDE - 0.5 * i;
@@ -193,14 +193,14 @@ static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 		Graphics_updateWs (my selectionGraphics);   // to change the dark red back into black
 	#endif
 	if (my selectionChangedCallback) {
-		//Melder_casual ("selectionChangedCallback from gui_drawingarea_cb_click");
+		//Melder_casual (U"selectionChangedCallback from gui_drawingarea_cb_click");
 		my selectionChangedCallback (me, my selectionChangedClosure,
 			my selx1, my selx2, my sely1, my sely2);
 	}
 }
 
 Picture Picture_create (GuiDrawingArea drawingArea, bool sensitive) {
-	Picture me = NULL;
+	Picture me = nullptr;
 	try {
 		me = Melder_calloc (struct structPicture, 1);
 		my drawingArea = drawingArea;
@@ -215,7 +215,7 @@ Picture Picture_create (GuiDrawingArea drawingArea, bool sensitive) {
 		if (drawingArea) {
 			/* The drawing area must have been realized; see manual at XtWindow. */
 			my graphics = Graphics_create_xmdrawingarea (my drawingArea);
-			my drawingArea -> f_setExposeCallback (gui_drawingarea_cb_expose, me);
+			GuiDrawingArea_setExposeCallback (my drawingArea, gui_drawingarea_cb_expose, me);
 		} else {
 			/*
 			 * Create a dummy Graphics.
@@ -227,13 +227,13 @@ Picture Picture_create (GuiDrawingArea drawingArea, bool sensitive) {
 		if (my sensitive) {
 			my selectionGraphics = Graphics_create_xmdrawingarea (my drawingArea);
 			Graphics_setWindow (my selectionGraphics, 0, 12, 0, 12);
-			my drawingArea -> f_setClickCallback (gui_drawingarea_cb_click, me);
+			GuiDrawingArea_setClickCallback (my drawingArea, gui_drawingarea_cb_click, me);
 		}
 		Graphics_startRecording (my graphics);
 		return me;
 	} catch (MelderError) {
 		if (me) Melder_free (me);
-		Melder_throw ("Picture not created.");
+		Melder_throw (U"Picture not created.");
 	}
 }
 
@@ -256,7 +256,7 @@ void Picture_remove (Picture *pme) {
 	forget (my graphics);
 	if (my sensitive) forget (my selectionGraphics);
 	Melder_free (me);
-	*pme = NULL;
+	*pme = nullptr;
 }
 
 Graphics Picture_getGraphics (Picture me) { return my graphics; }
@@ -281,11 +281,11 @@ void Picture_erase (Picture me) {
 void Picture_writeToPraatPictureFile (Picture me, MelderFile file) {
 	try {
 		autofile f = Melder_fopen (file, "wb");
-		if (fprintf (f, "PraatPictureFile") < 0) Melder_throw ("Write error.");
+		if (fprintf (f, "PraatPictureFile") < 0) Melder_throw (U"Write error.");
 		Graphics_writeRecordings (my graphics, f);
 		f.close (file);
 	} catch (MelderError) {
-		Melder_throw ("Cannot write Praat picture file ", file, ".");
+		Melder_throw (U"Cannot write Praat picture file ", file, U".");
 	}
 }
 
@@ -297,7 +297,7 @@ void Picture_readFromPraatPictureFile (Picture me, MelderFile file) {
 		line [n] = '\0';
 		const char *tag = "PraatPictureFile";
 		char *end = strstr (line, tag);
-		if (! end) Melder_throw ("This is not a Praat picture file.");
+		if (! end) Melder_throw (U"This is not a Praat picture file.");
 		*end = '\0';
 		rewind (f);
 		fread (line, 1, end - line + strlen (tag), f);
@@ -305,7 +305,7 @@ void Picture_readFromPraatPictureFile (Picture me, MelderFile file) {
 		Graphics_updateWs (my graphics);
 		f.close (file);
 	} catch (MelderError) {
-		Melder_throw ("Praat picture not read from file ", file);
+		Melder_throw (U"Praat picture not read from file ", file);
 	}
 }
 
@@ -318,18 +318,18 @@ void Picture_copyToClipboard (Picture me) {
 	/*
 	 * Find the clipboard and clear it.
 	 */
-	PasteboardRef clipboard = NULL;
+	PasteboardRef clipboard = nullptr;
 	PasteboardCreate (kPasteboardClipboard, & clipboard);
 	PasteboardClear (clipboard);
 	/*
 	 * Add a PDF flavour to the clipboard.
 	 */
-	static CGDataConsumerCallbacks callbacks = { appendBytes, NULL };
+	static CGDataConsumerCallbacks callbacks = { appendBytes, nullptr };
 	CFDataRef data = CFDataCreateMutable (kCFAllocatorDefault, 0);
 	CGDataConsumerRef consumer = CGDataConsumerCreate ((void *) data, & callbacks);
 	int resolution = 600;
 	CGRect rect = CGRectMake (0, 0, (my selx2 - my selx1) * resolution, (my sely1 - my sely2) * resolution);
-	CGContextRef context = CGPDFContextCreate (consumer, & rect, NULL);
+	CGContextRef context = CGPDFContextCreate (consumer, & rect, nullptr);
 	//my selx1 * RES, (12 - my sely2) * RES, my selx2 * RES, (12 - my sely1) * RES)
 	Graphics graphics = Graphics_create_pdf (context, resolution, my selx1, my selx2, my sely1, my sely2);
 	Graphics_play ((Graphics) my graphics, graphics);
@@ -358,41 +358,41 @@ static HENHMETAFILE copyToMetafile (Picture me) {
 	defaultPrinter. Flags = PD_RETURNDEFAULT | PD_RETURNDC;
 	PrintDlg (& defaultPrinter);
 	SetRect (& rect, my selx1 * 2540, (12 - my sely2) * 2540, my selx2 * 2540, (12 - my sely1) * 2540);
-	dc = CreateEnhMetaFile (defaultPrinter. hDC, NULL, & rect, L"Praat\0");
-	if (! dc) Melder_throw ("Cannot create Windows metafile.");
+	dc = CreateEnhMetaFile (defaultPrinter. hDC, nullptr, & rect, L"Praat\0");
+	if (! dc) Melder_throw (U"Cannot create Windows metafile.");
 	resolution = GetDeviceCaps (dc, LOGPIXELSX);   // Virtual PC: 360; Parallels Desktop: 600
-	//Melder_fatal ("resolution %d", resolution);
+	//Melder_fatal (U"resolution ", resolution);
 	if (Melder_debug == 6) {
 		DEVMODE *devMode = * (DEVMODE **) defaultPrinter. hDevMode;
 		MelderInfo_open ();
-		MelderInfo_writeLine (L"DEVICE CAPS:");
-		MelderInfo_writeLine (L"aspect x ", Melder_integer (GetDeviceCaps (dc, ASPECTX)),
-			L" y ", Melder_integer (GetDeviceCaps (dc, ASPECTY)));
-		MelderInfo_writeLine (L"res(pixels) hor ", Melder_integer (GetDeviceCaps (dc, HORZRES)),
-			L" vert ", Melder_integer (GetDeviceCaps (dc, VERTRES)));
-		MelderInfo_writeLine (L"size(mm) hor ", Melder_integer (GetDeviceCaps (dc, HORZSIZE)),
-			L" vert ", Melder_integer (GetDeviceCaps (dc, VERTSIZE)));
-		MelderInfo_writeLine (L"pixels/inch hor ", Melder_integer (GetDeviceCaps (dc, LOGPIXELSX)),
-			L" vert ", Melder_integer (GetDeviceCaps (dc, LOGPIXELSY)));
-		MelderInfo_writeLine (L"physicalOffset(pixels) hor ", Melder_integer (GetDeviceCaps (dc, PHYSICALOFFSETX)),
-			L" vert ", Melder_integer (GetDeviceCaps (dc, PHYSICALOFFSETY)));
-		MelderInfo_writeLine (L"PRINTER:");
-		MelderInfo_writeLine (L"dmFields ", Melder_integer (devMode -> dmFields));
+		MelderInfo_writeLine (U"DEVICE CAPS:");
+		MelderInfo_writeLine (U"aspect x ", GetDeviceCaps (dc, ASPECTX),
+			U" y ", GetDeviceCaps (dc, ASPECTY));
+		MelderInfo_writeLine (U"res(pixels) hor ", GetDeviceCaps (dc, HORZRES),
+			U" vert ", GetDeviceCaps (dc, VERTRES));
+		MelderInfo_writeLine (U"size(mm) hor ", GetDeviceCaps (dc, HORZSIZE),
+			U" vert ", GetDeviceCaps (dc, VERTSIZE));
+		MelderInfo_writeLine (U"pixels/inch hor ", GetDeviceCaps (dc, LOGPIXELSX),
+			U" vert ", GetDeviceCaps (dc, LOGPIXELSY));
+		MelderInfo_writeLine (U"physicalOffset(pixels) hor ", GetDeviceCaps (dc, PHYSICALOFFSETX),
+			U" vert ", GetDeviceCaps (dc, PHYSICALOFFSETY));
+		MelderInfo_writeLine (U"PRINTER:");
+		MelderInfo_writeLine (U"dmFields ", devMode -> dmFields);
 		if (devMode -> dmFields & DM_YRESOLUTION)
-			MelderInfo_writeLine (L"y resolution ", Melder_integer (devMode -> dmYResolution));
+			MelderInfo_writeLine (U"y resolution ", devMode -> dmYResolution);
 		if (devMode -> dmFields & DM_PRINTQUALITY)
-			MelderInfo_writeLine (L"print quality ", Melder_integer (devMode -> dmPrintQuality));
+			MelderInfo_writeLine (U"print quality ", devMode -> dmPrintQuality);
 		if (devMode -> dmFields & DM_PAPERWIDTH)
-			MelderInfo_writeLine (L"paper width ", Melder_integer (devMode -> dmPaperWidth));
+			MelderInfo_writeLine (U"paper width ", devMode -> dmPaperWidth);
 		if (devMode -> dmFields & DM_PAPERLENGTH)
-			MelderInfo_writeLine (L"paper length ", Melder_integer (devMode -> dmPaperLength));
+			MelderInfo_writeLine (U"paper length ", devMode -> dmPaperLength);
 		if (devMode -> dmFields & DM_PAPERSIZE)
-			MelderInfo_writeLine (L"paper size ", Melder_integer (devMode -> dmPaperSize));
+			MelderInfo_writeLine (U"paper size ", devMode -> dmPaperSize);
 		if (devMode -> dmFields & DM_ORIENTATION)
-			MelderInfo_writeLine (L"orientation ", Melder_integer (devMode -> dmOrientation));
+			MelderInfo_writeLine (U"orientation ", devMode -> dmOrientation);
 		MelderInfo_close ();
 	}
-	autoGraphics pictGraphics = Graphics_create_screen ((void *) dc, NULL, resolution);
+	autoGraphics pictGraphics = Graphics_create_screen ((void *) dc, nullptr, resolution);
 	Graphics_setWsViewport (pictGraphics.peek(), 0, WIN_WIDTH * resolution, 0, WIN_HEIGHT * resolution);
 	Graphics_setWsWindow (pictGraphics.peek(), 0.0, WIN_WIDTH, 12.0 - WIN_HEIGHT, 12.0);
 	Graphics_play ((Graphics) my graphics, pictGraphics.peek());
@@ -411,22 +411,22 @@ void Picture_copyToClipboard (Picture me) {
 		 * because the clipboard becomes the owner of this global memory object.
 		 */
 	} catch (MelderError) {
-		Melder_throw ("Picture not copied to clipboard.");
+		Melder_throw (U"Picture not copied to clipboard.");
 	}
 }
 void Picture_writeToWindowsMetafile (Picture me, MelderFile file) {
 	try {
 		HENHMETAFILE metafile = copyToMetafile (me);
 		MelderFile_delete (file);   // overwrite any existing file with the same name
-		DeleteEnhMetaFile (CopyEnhMetaFile (metafile, file -> path));
+		DeleteEnhMetaFile (CopyEnhMetaFile (metafile, Melder_peek32toW (file -> path)));
 		DeleteEnhMetaFile (metafile);
 	} catch (MelderError) {
-		Melder_throw ("Picture not written to Windows metafile ", file);
+		Melder_throw (U"Picture not written to Windows metafile ", file);
 	}
 }
 #endif
 
-void Picture_writeToEpsFile (Picture me, MelderFile file, int includeFonts, int useSilipaPS) {
+void Picture_writeToEpsFile (Picture me, MelderFile file, bool includeFonts, bool useSilipaPS) {
 	try {
 		MelderFile_delete (file);   // to kill resources as well (fopen only kills data fork)
 		/* BUG: no message if file cannot be deleted (e.g. because still open by Microsoft Word 2001 after reading). */
@@ -437,7 +437,7 @@ void Picture_writeToEpsFile (Picture me, MelderFile file, int includeFonts, int
 			Graphics_play ((Graphics) my graphics, ps.peek());
 		}
 	} catch (MelderError) {
-		Melder_throw ("Picture not written to EPS file ", file);
+		Melder_throw (U"Picture not written to EPS file ", file);
 	}
 }
 
@@ -446,7 +446,7 @@ void Picture_writeToPdfFile (Picture me, MelderFile file) {
 		autoGraphics graphics = Graphics_create_pdffile (file, 300, my selx1, my selx2, my sely1, my sely2);
 		Graphics_play ((Graphics) my graphics, graphics.peek());
 	} catch (MelderError) {
-		Melder_throw ("Picture not written to PDF file ", file, ".");
+		Melder_throw (U"Picture not written to PDF file ", file, U".");
 	}
 }
 
@@ -455,7 +455,7 @@ void Picture_writeToPngFile_300 (Picture me, MelderFile file) {
 		autoGraphics graphics = Graphics_create_pngfile (file, 300, my selx1, my selx2, my sely1, my sely2);
 		Graphics_play ((Graphics) my graphics, graphics.peek());
 	} catch (MelderError) {
-		Melder_throw ("Picture not written to PNG file ", file, ".");
+		Melder_throw (U"Picture not written to PNG file ", file, U".");
 	}
 }
 
@@ -464,7 +464,7 @@ void Picture_writeToPngFile_600 (Picture me, MelderFile file) {
 		autoGraphics graphics = Graphics_create_pngfile (file, 600, my selx1, my selx2, my sely1, my sely2);
 		Graphics_play ((Graphics) my graphics, graphics.peek());
 	} catch (MelderError) {
-		Melder_throw ("Picture not written to PNG file ", file, ".");
+		Melder_throw (U"Picture not written to PNG file ", file, U".");
 	}
 }
 
@@ -477,7 +477,7 @@ void Picture_print (Picture me) {
 	try {
 		Printer_print (print, me);
 	} catch (MelderError) {
-		Melder_flushError ("Picture not printed.");
+		Melder_flushError (U"Picture not printed.");
 	}
 }
 
@@ -497,13 +497,13 @@ void Picture_setSelection
 	}
 
 	if (notify && my selectionChangedCallback) {
-		//Melder_casual ("selectionChangedCallback from Picture_setSelection");
+		//Melder_casual (U"selectionChangedCallback from Picture_setSelection");
 		my selectionChangedCallback (me, my selectionChangedClosure,
 			my selx1, my selx2, my sely1, my sely2);
 	}
 }
 
-void Picture_background (Picture me) { my backgrounding = TRUE; }
-void Picture_foreground (Picture me) { my backgrounding = FALSE; }
+void Picture_background (Picture me) { my backgrounding = true; }
+void Picture_foreground (Picture me) { my backgrounding = false; }
 
 /* End of file Picture.cpp */
diff --git a/sys/Picture.h b/sys/Picture.h
index ef28dc7..f25925a 100644
--- a/sys/Picture.h
+++ b/sys/Picture.h
@@ -2,7 +2,7 @@
 #define _Picture_h_
 /* Picture.h
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,15 +33,15 @@
 		Any g = Picture_getGraphics (p);
 		Picture_unhighlight (p);
 		Graphics_setTextAlignment (g, Graphics_CENTRE, Graphics_HALF);
-		Graphics_text (g, 0.5, 0.7, L"Hello");
-		Graphics_text (g, 0.5, 0.6, L"there");
+		Graphics_text (g, 0.5, 0.7, U"Hello");
+		Graphics_text (g, 0.5, 0.6, U"there");
 		Picture_highlight (p);
 		... (event handling)
 		Picture_unhighlight (p);
-		Graphics_text (g, 0.5, 0.3, L"Goodbye");
+		Graphics_text (g, 0.5, 0.3, U"Goodbye");
 		Picture_highlight (p);
 		... (event handling)
-		Picture_writeToEpsFile (p, L"HelloGoodbye.eps");
+		Picture_writeToEpsFile (p, U"HelloGoodbye.eps", false, false);
 		Picture_print (p, GraphicsPostscript_FINE);
 		Picture_remove (& p);
 */
@@ -113,7 +113,7 @@ void Picture_erase (Picture me);   /* Clears the screen. */
 void Picture_writeToPraatPictureFile (Picture me, MelderFile file);
 void Picture_readFromPraatPictureFile (Picture me, MelderFile file);
 
-void Picture_writeToEpsFile (Picture me, MelderFile file, int includeFonts, int useSilipaPS);
+void Picture_writeToEpsFile (Picture me, MelderFile file, bool includeFonts, bool useSilipaPS);
 void Picture_writeToPdfFile (Picture me, MelderFile file);
 void Picture_writeToPngFile_300 (Picture me, MelderFile file);
 void Picture_writeToPngFile_600 (Picture me, MelderFile file);
diff --git a/sys/Preferences.cpp b/sys/Preferences.cpp
index 2c1937e..53466ba 100644
--- a/sys/Preferences.cpp
+++ b/sys/Preferences.cpp
@@ -1,6 +1,6 @@
 /* Preferences.cpp
  *
- * Copyright (C) 1996-2012,2013 Paul Boersma
+ * Copyright (C) 1996-2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,16 +21,15 @@
 #include "Collection.h"
 
 Thing_define (Preference, SimpleString) {
-	// new data:
-	public:
-		int type;
-		void *value;
-		int min, max;
-		const wchar_t * (*getText) (int value);
-		int (*getValue) (const wchar_t *text);
-	// overridden methods:
-		void v_destroy ();
-		/* Warning: copy methods etc. not implemented. */
+	int type;
+	void *value;
+	int min, max;
+	const char32 * (*getText) (int value);
+	int (*getValue) (const char32 *text);
+
+	void v_destroy ()
+		override;
+	/* Warning: copy methods etc. not implemented. */
 };
 Thing_implement (Preference, SimpleString, 0);
 
@@ -41,10 +40,10 @@ void structPreference :: v_destroy () {
 
 static SortedSetOfString thePreferences;
 
-static void Preferences_add (const wchar_t *string, int type, void *value, int min, int max, const wchar_t * (*getText) (int value), int (*getValue) (const wchar_t *text)) {
-	Preference me = Thing_new (Preference);
-	my string = Melder_wcsdup_f (string);
-	for (wchar_t *p = & my string [0]; *p != '\0'; p ++) if (*p == '_') *p = '.';
+static void Preferences_add (const char32 *string, int type, void *value, int min, int max, const char32 * (*getText) (int value), int (*getValue) (const char32 *text)) {
+	autoPreference me = Thing_new (Preference);
+	my string = Melder_dup (string);
+	for (char32 *p = & my string [0]; *p != U'\0'; p ++) if (*p == U'_') *p = U'.';
 	my type = type;
 	my value = value;
 	my min = min;
@@ -52,38 +51,38 @@ static void Preferences_add (const wchar_t *string, int type, void *value, int m
 	my getText = getText;
 	my getValue = getValue;
 	if (! thePreferences) thePreferences = SortedSetOfString_create ();
-	Collection_addItem (thePreferences, me);
+	Collection_addItem (thePreferences, me.transfer());
 }
 
-void Preferences_addByte (const wchar_t *string, signed char *value, signed char defaultValue)
-	{ *value = defaultValue; Preferences_add (string, bytewa, value, 0, 0, NULL, NULL); }
+void Preferences_addByte (const char32 *string, signed char *value, signed char defaultValue)
+	{ *value = defaultValue; Preferences_add (string, bytewa, value, 0, 0, nullptr, nullptr); }
 
-void Preferences_addInt (const wchar_t *string, int *value, int defaultValue)
-	{ *value = defaultValue; Preferences_add (string, intwa, value, 0, 0, NULL, NULL); }
+void Preferences_addInt (const char32 *string, int *value, int defaultValue)
+	{ *value = defaultValue; Preferences_add (string, intwa, value, 0, 0, nullptr, nullptr); }
 
-void Preferences_addLong (const wchar_t *string, long *value, long defaultValue)
-	{ *value = defaultValue; Preferences_add (string, longwa, value, 0, 0, NULL, NULL); }
+void Preferences_addLong (const char32 *string, long *value, long defaultValue)
+	{ *value = defaultValue; Preferences_add (string, longwa, value, 0, 0, nullptr, nullptr); }
 
-void Preferences_addUbyte (const wchar_t *string, unsigned char *value, unsigned char defaultValue)
-	{ *value = defaultValue; Preferences_add (string, ubytewa, value, 0, 0, NULL, NULL); }
+void Preferences_addUbyte (const char32 *string, unsigned char *value, unsigned char defaultValue)
+	{ *value = defaultValue; Preferences_add (string, ubytewa, value, 0, 0, nullptr, nullptr); }
 
-void Preferences_addUint (const wchar_t *string, unsigned int *value, unsigned int defaultValue)
-	{ *value = defaultValue; Preferences_add (string, uintwa, value, 0, 0, NULL, NULL); }
+void Preferences_addUint (const char32 *string, unsigned int *value, unsigned int defaultValue)
+	{ *value = defaultValue; Preferences_add (string, uintwa, value, 0, 0, nullptr, nullptr); }
 
-void Preferences_addUlong (const wchar_t *string, unsigned long *value, unsigned long defaultValue)
-	{ *value = defaultValue; Preferences_add (string, ulongwa, value, 0, 0, NULL, NULL); }
+void Preferences_addUlong (const char32 *string, unsigned long *value, unsigned long defaultValue)
+	{ *value = defaultValue; Preferences_add (string, ulongwa, value, 0, 0, nullptr, nullptr); }
 
-void Preferences_addBool (const wchar_t *string, bool *value, bool defaultValue)
-	{ *value = defaultValue; Preferences_add (string, boolwa, value, 0, 0, NULL, NULL); }
+void Preferences_addBool (const char32 *string, bool *value, bool defaultValue)
+	{ *value = defaultValue; Preferences_add (string, boolwa, value, 0, 0, nullptr, nullptr); }
 
-void Preferences_addDouble (const wchar_t *string, double *value, double defaultValue)
-	{ *value = defaultValue; Preferences_add (string, doublewa, value, 0, 0, NULL, NULL); }
+void Preferences_addDouble (const char32 *string, double *value, double defaultValue)
+	{ *value = defaultValue; Preferences_add (string, doublewa, value, 0, 0, nullptr, nullptr); }
 
-void Preferences_addString (const wchar_t *string, wchar_t *value, const wchar_t *defaultValue)
-	{ wcscpy (value, defaultValue); Preferences_add (string, stringwa, value, 0, 0, NULL, NULL); }
+void Preferences_addString (const char32 *string, char32 *value, const char32 *defaultValue)
+	{ str32cpy (value, defaultValue); Preferences_add (string, stringwa, value, 0, 0, nullptr, nullptr); }
 
-void _Preferences_addEnum (const wchar_t *string, enum kPreferences_dummy *value, int min, int max,
-	const wchar_t *(*getText) (int value), int (*getValue) (const wchar_t *text), enum kPreferences_dummy defaultValue)
+void _Preferences_addEnum (const char32 *string, enum kPreferences_dummy *value, int min, int max,
+	const char32 *(*getText) (int value), int (*getValue) (const char32 *text), enum kPreferences_dummy defaultValue)
 {
 	{ *value = defaultValue; Preferences_add (string, enumwa, value, min, max, getText, getValue); }
 }
@@ -98,44 +97,50 @@ void Preferences_read (MelderFile file) {
 	try {
 		autoMelderReadText text = MelderReadText_createFromFile (file);
 		for (;;) {
-			wchar_t *line = MelderReadText_readLine (text.peek());
-			if (line == NULL)
+			char32 *line = MelderReadText_readLine (text.peek());
+			if (! line)
 				return;   // OK: we have read past the last line
-			wchar_t *value = wcsstr (line, L": ");
-			if (value == NULL)
+			char32 *value = str32str (line, U": ");
+			if (! value)
 				return;   // OK: we have read past the last key-value pair
-			*value = '\0', value += 2;
+			*value = U'\0', value += 2;
 			long ipref = SortedSetOfString_lookUp (thePreferences, line);
 			if (! ipref) {
 				/*
 				 * Recognize some preference names that went obsolete in February 2013.
 				 */
-				if (Melder_wcsnequ (line, L"FunctionEditor.", 15))
-					ipref = SortedSetOfString_lookUp (thePreferences,
-						Melder_wcscat (L"TimeSoundAnalysisEditor.", line + 15));
+				if (Melder_nequ (line, U"FunctionEditor.", 15))
+					ipref = SortedSetOfString_lookUp (thePreferences, Melder_cat (U"TimeSoundAnalysisEditor.", line + 15));
 			}
 			if (! ipref) continue;   // skip unrecognized keys
 			Preference pref = (Preference) thePreferences -> item [ipref];
 			switch (pref -> type) {
-				case bytewa: * (signed char *) pref -> value = wcstol (value, NULL, 10); break;
-				case intwa: * (int *) pref -> value = wcstol (value, NULL, 10); break;
-				case longwa: * (long *) pref -> value = wcstol (value, NULL, 10); break;
-				case ubytewa: * (unsigned char *) pref -> value = wcstoul (value, NULL, 10); break;
-				case uintwa: * (unsigned int *) pref -> value = wcstoul (value, NULL, 10); break;
-				case ulongwa: * (unsigned long *) pref -> value = wcstoul (value, NULL, 10); break;
+				case bytewa: * (signed char *) pref -> value =
+					strtol (Melder_peek32to8 (value), nullptr, 10); break;
+				case intwa: * (int *) pref -> value =
+					strtol (Melder_peek32to8 (value), nullptr, 10); break;
+				case longwa: * (long *) pref -> value =
+					strtol (Melder_peek32to8 (value), nullptr, 10); break;
+				case ubytewa: * (unsigned char *) pref -> value =
+					strtoul (Melder_peek32to8 (value), nullptr, 10); break;
+				case uintwa: * (unsigned int *) pref -> value =
+					strtoul (Melder_peek32to8 (value), nullptr, 10); break;
+				case ulongwa: * (unsigned long *) pref -> value =
+					strtoul (Melder_peek32to8 (value), nullptr, 10); break;
 				case boolwa: * (bool *) pref -> value =
-					wcsnequ (value, L"yes", 3) ? true :
-					wcsnequ (value, L"no", 2) ? false :
-					wcstol (value, NULL, 10) != 0; break;
-				case doublewa: * (double *) pref -> value = Melder_atof (value); break;
+					str32nequ (value, U"yes", 3) ? true :
+					str32nequ (value, U"no", 2) ? false :
+					strtol (Melder_peek32to8 (value), nullptr, 10) != 0; break;
+				case doublewa: * (double *) pref -> value =
+					Melder_a8tof (Melder_peek32to8 (value)); break;
 				case stringwa: {
-					wcsncpy ((wchar_t *) pref -> value, value, Preferences_STRING_BUFFER_SIZE);
-					((wchar_t *) pref -> value) [Preferences_STRING_BUFFER_SIZE - 1] = '\0'; break;
+					str32ncpy ((char32 *) pref -> value, value, Preferences_STRING_BUFFER_SIZE);
+					((char32 *) pref -> value) [Preferences_STRING_BUFFER_SIZE - 1] = U'\0'; break;
 				}
 				case enumwa: {
 					int intValue = pref -> getValue (value);
 					if (intValue < 0)
-						intValue = pref -> getValue (L"\t");   // look for the default
+						intValue = pref -> getValue (U"\t");   // look for the default
 					* (enum kPreferences_dummy *) pref -> value = (enum kPreferences_dummy) intValue; break;
 				}
 			}
@@ -147,23 +152,23 @@ void Preferences_read (MelderFile file) {
 
 void Preferences_write (MelderFile file) {
 	if (! thePreferences || thePreferences -> size == 0) return;
-	static MelderString buffer = { 0 };
+	static MelderString buffer { 0 };
 	for (long ipref = 1; ipref <= thePreferences -> size; ipref ++) {
 		Preference pref = (Preference) thePreferences -> item [ipref];
-		MelderString_append (& buffer, pref -> string, L": ");
+		MelderString_append (& buffer, pref -> string, U": ");
 		switch (pref -> type) {
-			case bytewa:   MelderString_append (& buffer, Melder_integer (* (signed char *)    pref -> value)); break;
-			case intwa:    MelderString_append (& buffer, Melder_integer (* (int *)            pref -> value)); break;
-			case longwa:   MelderString_append (& buffer, Melder_integer (* (long *)           pref -> value)); break;
-			case ubytewa:  MelderString_append (& buffer, Melder_integer (* (unsigned char *)  pref -> value)); break;
-			case uintwa:   MelderString_append (& buffer, Melder_integer (* (unsigned int *)   pref -> value)); break;
-			case ulongwa:  MelderString_append (& buffer, Melder_integer (* (unsigned long *)  pref -> value)); break;
-			case boolwa:   MelderString_append (& buffer, Melder_boolean (* (bool *)           pref -> value)); break;
-			case doublewa: MelderString_append (& buffer, Melder_double  (* (double *)         pref -> value)); break;
-			case stringwa: MelderString_append (& buffer, (const wchar_t *) pref -> value); break;
+			case bytewa:   MelderString_append (& buffer, (int) (* (signed char *)    pref -> value)); break;
+			case intwa:    MelderString_append (& buffer,       (* (int *)            pref -> value)); break;
+			case longwa:   MelderString_append (& buffer,       (* (long *)           pref -> value)); break;
+			case ubytewa:  MelderString_append (& buffer, (int) (* (unsigned char *)  pref -> value)); break;
+			case uintwa:   MelderString_append (& buffer,       (* (unsigned int *)   pref -> value)); break;
+			case ulongwa:  MelderString_append (& buffer,       (* (unsigned long *)  pref -> value)); break;
+			case boolwa:   MelderString_append (& buffer,       (* (bool *)           pref -> value)); break;
+			case doublewa: MelderString_append (& buffer,       (* (double *)         pref -> value)); break;
+			case stringwa: MelderString_append (& buffer,         ((const char32 *)   pref -> value)); break;
 			case enumwa:   MelderString_append (& buffer, pref -> getText (* (enum kPreferences_dummy *) pref -> value)); break;
 		}
-		MelderString_appendCharacter (& buffer, '\n');
+		MelderString_appendCharacter (& buffer, U'\n');
 	}
 	try {
 		MelderFile_writeText (file, buffer.string, kMelder_textOutputEncoding_ASCII_THEN_UTF16);
diff --git a/sys/Preferences.h b/sys/Preferences.h
index c92d7f7..d704c9e 100644
--- a/sys/Preferences.h
+++ b/sys/Preferences.h
@@ -2,7 +2,7 @@
 #define _Preferences_h_
 /* Preferences.h
  *
- * Copyright (C) 1996-2011,2013 Paul Boersma
+ * Copyright (C) 1996-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,30 +28,30 @@
  */
 #define Preferences_STRING_BUFFER_SIZE 1+kMelder_MAXPATH
 
-#define pref_wcscpy(to,from) \
-	wcsncpy (to, from, Preferences_STRING_BUFFER_SIZE); \
-	to [Preferences_STRING_BUFFER_SIZE - 1] = '\0';
+#define pref_str32cpy(to,from) \
+	str32ncpy (to, from, Preferences_STRING_BUFFER_SIZE); \
+	to [Preferences_STRING_BUFFER_SIZE - 1] = U'\0';
 
-#define pref_wcscpy2(to2,to1,from) \
-	wcsncpy (to1, from, Preferences_STRING_BUFFER_SIZE); \
-	to1 [Preferences_STRING_BUFFER_SIZE - 1] = '\0'; \
-	wcscpy (to2, to1);
+#define pref_str32cpy2(to2,to1,from) \
+	str32ncpy (to1, from, Preferences_STRING_BUFFER_SIZE); \
+	to1 [Preferences_STRING_BUFFER_SIZE - 1] = U'\0'; \
+	str32cpy (to2, to1);
 
 enum kPreferences_dummy { dummy1 = 1, dummy2 = 2 };
 
-void Preferences_addByte (const wchar_t *string, signed char *value, signed char defaultValue);
-void Preferences_addShort (const wchar_t *string, short *value, short defaultValue);
-void Preferences_addInt (const wchar_t *string, int *value, int defaultValue);
-void Preferences_addLong (const wchar_t *string, long *value, long defaultValue);
-void Preferences_addUbyte (const wchar_t *string, unsigned char *value, unsigned char defaultValue);
-void Preferences_addUshort (const wchar_t *string, unsigned short *value, unsigned short defaultValue);
-void Preferences_addUint (const wchar_t *string, unsigned int *value, unsigned int defaultValue);
-void Preferences_addUlong (const wchar_t *string, unsigned long *value, unsigned long defaultValue);
-void Preferences_addBool (const wchar_t *string, bool *value, bool defaultValue);
-void Preferences_addDouble (const wchar_t *string, double *value, double defaultValue);
-void Preferences_addString (const wchar_t *string, wchar_t *value, const wchar_t *defaultValue);
-void _Preferences_addEnum (const wchar_t *string, enum kPreferences_dummy *value, int min, int max,
-	const wchar_t *(*getText) (int value), int (*getValue) (const wchar_t *text), enum kPreferences_dummy defaultValue);
+void Preferences_addByte   (const char32 *string /* cattable */, signed char *value, signed char defaultValue);
+void Preferences_addShort  (const char32 *string /* cattable */, short *value, short defaultValue);
+void Preferences_addInt    (const char32 *string /* cattable */, int *value, int defaultValue);
+void Preferences_addLong   (const char32 *string /* cattable */, long *value, long defaultValue);
+void Preferences_addUbyte  (const char32 *string /* cattable */, unsigned char *value, unsigned char defaultValue);
+void Preferences_addUshort (const char32 *string /* cattable */, unsigned short *value, unsigned short defaultValue);
+void Preferences_addUint   (const char32 *string /* cattable */, unsigned int *value, unsigned int defaultValue);
+void Preferences_addUlong  (const char32 *string /* cattable */, unsigned long *value, unsigned long defaultValue);
+void Preferences_addBool   (const char32 *string /* cattable */, bool *value, bool defaultValue);
+void Preferences_addDouble (const char32 *string /* cattable */, double *value, double defaultValue);
+void Preferences_addString (const char32 *string /* cattable */, char32 *value, const char32 *defaultValue);
+void _Preferences_addEnum  (const char32 *string /* cattable */, enum kPreferences_dummy *value, int min, int max,
+	const char32 *(*getText) (int value), int (*getValue) (const char32 *text), enum kPreferences_dummy defaultValue);
 #define Preferences_addEnum(string,value,enumerated,defaultValue) \
 	_Preferences_addEnum (string, (enum kPreferences_dummy *) value, enumerated##_MIN, enumerated##_MAX, \
 	enumerated##_getText, enumerated##_getValue, (enum kPreferences_dummy) defaultValue)
diff --git a/sys/Printer.cpp b/sys/Printer.cpp
index 793c681..ba9cf01 100644
--- a/sys/Printer.cpp
+++ b/sys/Printer.cpp
@@ -1,6 +1,6 @@
 /* Printer.cpp
  *
- * Copyright (C) 1998-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1998-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
  * pb 2006/10/28 erased MacOS 9 stuff
  * pb 2006/12/28 theCurrentPraat
  * pb 2007/04/28 Mac: error messages for failing PostScript passthrough
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2007/10/05 less char
  * pb 2007/12/09 enums
  * pb 2009/01/18 arguments to UiForm callbacks
@@ -65,11 +65,11 @@
 	NULL
 };
 
-void Printer_prefs (void) {
-	Preferences_addEnum (L"Printer.spots", & thePrinter. spots, kGraphicsPostscript_spots, kGraphicsPostscript_spots_DEFAULT);
-	Preferences_addEnum (L"Printer.paperSize", & thePrinter. paperSize, kGraphicsPostscript_paperSize, kGraphicsPostscript_paperSize_DEFAULT);
-	Preferences_addBool (L"Printer.allowDirectPostScript", & thePrinter. allowDirectPostScript, true);
-	Preferences_addEnum (L"Printer.fontChoiceStrategy", & thePrinter. fontChoiceStrategy, kGraphicsPostscript_fontChoiceStrategy, kGraphicsPostscript_fontChoiceStrategy_DEFAULT);
+void Printer_prefs () {
+	Preferences_addEnum (U"Printer.spots", & thePrinter. spots, kGraphicsPostscript_spots, kGraphicsPostscript_spots_DEFAULT);
+	Preferences_addEnum (U"Printer.paperSize", & thePrinter. paperSize, kGraphicsPostscript_paperSize, kGraphicsPostscript_paperSize_DEFAULT);
+	Preferences_addBool (U"Printer.allowDirectPostScript", & thePrinter. allowDirectPostScript, true);
+	Preferences_addEnum (U"Printer.fontChoiceStrategy", & thePrinter. fontChoiceStrategy, kGraphicsPostscript_fontChoiceStrategy, kGraphicsPostscript_fontChoiceStrategy_DEFAULT);
 }
 
 #if cocoa
@@ -128,7 +128,7 @@ void Printer_prefs (void) {
 #endif
 
 #if defined (_WIN32)
-	static void initPostScriptPage (void) {
+	static void initPostScriptPage () {
 		/*
 		 * Save the driver's state.
 		 */
@@ -149,17 +149,17 @@ void Printer_prefs (void) {
 Printer_postScript_printf (NULL, "8 8 scale initclip\n");
 		#endif
 	}
-	static void exitPostScriptPage (void) {
+	static void exitPostScriptPage () {
 		Printer_postScript_printf (NULL, "PraatPictureSaveObject restore\n");
 	}
 #endif
 
 #if cocoa
 #elif defined (_WIN32)
-	static void initPrinter (void) {
+	static void initPrinter () {
 	}
 #elif defined (macintosh)
-	static void initPrinter (void) {
+	static void initPrinter () {
 		Boolean result;
 		PMResolution res300 = { 300, 300 }, res600 = { 600, 600 };
 		if (theMacPrintSettings == NULL) {   /* Once. */
@@ -182,7 +182,7 @@ Printer_postScript_printf (NULL, "8 8 scale initclip\n");
 	}
 #endif
 
-void Printer_nextPage (void) {
+void Printer_nextPage () {
 	#if cocoa
 		[theMacView endPage];
 		[theMacView beginPageInRect: [theMacView bounds] atPlacement: NSMakePoint (0, 0)];
@@ -210,7 +210,7 @@ void Printer_nextPage (void) {
 	#endif
 }
 
-int Printer_pageSetup (void) {
+int Printer_pageSetup () {
 	#if cocoa
 		NSPageLayout *cocoaPageSetupDialog = [NSPageLayout pageLayout];
 		[cocoaPageSetupDialog runModal];
@@ -223,18 +223,16 @@ int Printer_pageSetup (void) {
 	return 1;
 }
 
-static void DO_Printer_postScriptSettings (UiForm dia, int narg, Stackel args, const wchar_t *sendingString_dummy, Interpreter interpreter_dummy, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
-	(void) sendingString_dummy;
-	(void) interpreter_dummy;
-	(void) invokingButtonTitle;
-	(void) modified;
-	(void) dummy;
+static void DO_Printer_postScriptSettings (UiForm dia, int /* narg */, Stackel /* args */,
+	const char32 * /* sendingString_dummy */, Interpreter /* interpreter_dummy */,
+	const char32 * /* invokingButtonTitle */, bool /* modified */, void *)
+{
 	#if defined (_WIN32)
-		thePrinter. allowDirectPostScript = GET_INTEGER (L"Allow direct PostScript");
+		thePrinter. allowDirectPostScript = GET_INTEGER (U"Allow direct PostScript");
 	#endif
-	thePrinter. spots = GET_ENUM (kGraphicsPostscript_spots, L"Grey resolution");
+	thePrinter. spots = GET_ENUM (kGraphicsPostscript_spots, U"Grey resolution");
 	#if defined (UNIX)
-		thePrinter. paperSize = GET_ENUM (kGraphicsPostscript_paperSize, L"Paper size");
+		thePrinter. paperSize = GET_ENUM (kGraphicsPostscript_paperSize, U"Paper size");
 	 	if (thePrinter. paperSize == kGraphicsPostscript_paperSize_A3) {
 	 		thePrinter. paperWidth = 842 * thePrinter. resolution / 72;
 	 		thePrinter. paperHeight = 1191 * thePrinter. resolution / 72;
@@ -245,47 +243,47 @@ static void DO_Printer_postScriptSettings (UiForm dia, int narg, Stackel args, c
 			thePrinter. paperWidth = 595 * thePrinter. resolution / 72;
 			thePrinter. paperHeight = 842 * thePrinter. resolution / 72;
 		}
-		thePrinter. orientation = GET_ENUM (kGraphicsPostscript_orientation, L"Orientation");
-		thePrinter. magnification = GET_REAL (L"Magnification");
-		Site_setPrintCommand (GET_STRING (L"printCommand"));
+		thePrinter. orientation = GET_ENUM (kGraphicsPostscript_orientation, U"Orientation");
+		thePrinter. magnification = GET_REAL (U"Magnification");
+		Site_setPrintCommand (GET_STRING (U"printCommand"));
 	#endif
-	thePrinter. fontChoiceStrategy = GET_ENUM (kGraphicsPostscript_fontChoiceStrategy, L"Font choice strategy");
+	thePrinter. fontChoiceStrategy = GET_ENUM (kGraphicsPostscript_fontChoiceStrategy, U"Font choice strategy");
 }
 
-int Printer_postScriptSettings (void) {
-	static Any dia;
+int Printer_postScriptSettings () {
+	static UiForm dia;
 	if (dia == NULL) {
 		Any radio;
-		dia = UiForm_create (theCurrentPraatApplication -> topShell, L"PostScript settings", DO_Printer_postScriptSettings, NULL, L"PostScript settings...", L"PostScript settings...");
+		dia = UiForm_create (theCurrentPraatApplication -> topShell, U"PostScript settings", DO_Printer_postScriptSettings, NULL, U"PostScript settings...", U"PostScript settings...");
 		#if defined (_WIN32)
-			BOOLEAN (L"Allow direct PostScript", TRUE);
+			BOOLEAN (U"Allow direct PostScript", true);
 		#endif
-		RADIO_ENUM (L"Grey resolution", kGraphicsPostscript_spots, DEFAULT)
+		RADIO_ENUM (U"Grey resolution", kGraphicsPostscript_spots, DEFAULT)
 		#if defined (UNIX)
-			RADIO_ENUM (L"Paper size", kGraphicsPostscript_paperSize, DEFAULT);
-			RADIO_ENUM (L"Orientation", kGraphicsPostscript_orientation, DEFAULT);
-			POSITIVE (L"Magnification", L"1.0");
-			LABEL (L"label", L"Print command:");
+			RADIO_ENUM (U"Paper size", kGraphicsPostscript_paperSize, DEFAULT);
+			RADIO_ENUM (U"Orientation", kGraphicsPostscript_orientation, DEFAULT);
+			POSITIVE (U"Magnification", U"1.0");
+			LABEL (U"label", U"Print command:");
 			#if defined (linux)
-				TEXTFIELD (L"printCommand", L"lpr %s");
+				TEXTFIELD (U"printCommand", U"lpr %s");
 			#else
-				TEXTFIELD (L"printCommand", L"lp -c %s");
+				TEXTFIELD (U"printCommand", U"lp -c %s");
 			#endif
 		#endif
-		RADIO_ENUM (L"Font choice strategy", kGraphicsPostscript_fontChoiceStrategy, DEFAULT);
+		RADIO_ENUM (U"Font choice strategy", kGraphicsPostscript_fontChoiceStrategy, DEFAULT);
 		UiForm_finish (dia);
 	}
 	#if defined (_WIN32)
-		SET_INTEGER (L"Allow direct PostScript", thePrinter. allowDirectPostScript);
+		SET_INTEGER (U"Allow direct PostScript", thePrinter. allowDirectPostScript);
 	#endif
-	SET_ENUM (L"Grey resolution", kGraphicsPostscript_spots, thePrinter. spots);
+	SET_ENUM (U"Grey resolution", kGraphicsPostscript_spots, thePrinter. spots);
 	#if defined (UNIX)
-		SET_ENUM (L"Paper size", kGraphicsPostscript_paperSize, thePrinter. paperSize);
-		SET_ENUM (L"Orientation", kGraphicsPostscript_orientation, thePrinter. orientation);
-		SET_REAL (L"Magnification", thePrinter. magnification);
-		SET_STRING (L"printCommand", Site_getPrintCommand ());
+		SET_ENUM (U"Paper size", kGraphicsPostscript_paperSize, thePrinter. paperSize);
+		SET_ENUM (U"Orientation", kGraphicsPostscript_orientation, thePrinter. orientation);
+		SET_REAL (U"Magnification", thePrinter. magnification);
+		SET_STRING (U"printCommand", Site_getPrintCommand ());
 	#endif
-	SET_ENUM (L"Font choice strategy", kGraphicsPostscript_fontChoiceStrategy, thePrinter. fontChoiceStrategy);
+	SET_ENUM (U"Font choice strategy", kGraphicsPostscript_fontChoiceStrategy, thePrinter. fontChoiceStrategy);
 	UiForm_do (dia, false);
 	return 1;
 }
@@ -299,9 +297,9 @@ int Printer_postScriptSettings (void) {
 			TranslateMessage (& msg);
 			DispatchMessage (& msg);
 		}
-		return TRUE;
+		return true;
 	}
-	HDC Printer_getDC (void) {
+	HDC Printer_getDC () {
 		if (! theWinPrint. hDevMode) {
 			memset (& theWinPrint, 0, sizeof (PRINTDLG));
 			theWinPrint. lStructSize = sizeof (PRINTDLG);
@@ -320,7 +318,7 @@ int Printer_postScriptSettings (void) {
 		//GuiButton d_userData;
 	}
 	- (void) drawRect: (NSRect) dirtyRect {
-		trace ("printing %f %f %f %f", dirtyRect. origin. x, dirtyRect. origin. y, dirtyRect. size. width, dirtyRect. size. height);
+		trace (U"printing ", dirtyRect. origin. x, U" ", dirtyRect. origin. y, U" ", dirtyRect. size. width, U" ", dirtyRect. size. height);
 		int currentPage = [[NSPrintOperation currentOperation] currentPage];
 		thePrinter. graphics = Graphics_create_screenPrinter (NULL, self);
 		theDraw (theBoss, thePrinter. graphics);
@@ -352,13 +350,13 @@ int Printer_print (void (*draw) (void *boss, Graphics g), void *boss) {
 			structMelderFile tempFile = { 0 };
 			char tempPath_utf8 [] = "/tmp/picXXXXXX";
 			close (mkstemp (tempPath_utf8));
-			Melder_pathToFile (Melder_peekUtf8ToWcs (tempPath_utf8), & tempFile);
+			Melder_pathToFile (Melder_peek8to32 (tempPath_utf8), & tempFile);
 			thePrinter. graphics = Graphics_create_postscriptjob (& tempFile, thePrinter. resolution,
 				thePrinter. spots, thePrinter. paperSize, thePrinter. orientation, thePrinter. magnification);
 			draw (boss, thePrinter. graphics);
 			forget (thePrinter. graphics);
 			char command [500];
-			sprintf (command, Melder_peekWcsToUtf8 (Site_getPrintCommand ()), tempPath_utf8);
+			sprintf (command, Melder_peek32to8 (Site_getPrintCommand ()), tempPath_utf8);
 			system (command);
 			MelderFile_delete (& tempFile);
 		#elif cocoa
@@ -413,12 +411,12 @@ int Printer_print (void (*draw) (void *boss, Graphics g), void *boss) {
 				memset (& theWinPrint, 0, sizeof (PRINTDLG));
 				theWinPrint. lStructSize = sizeof (PRINTDLG);
 				theWinPrint. Flags = PD_RETURNDEFAULT;
-				if (! PrintDlg (& theWinPrint)) Melder_throw ("Cannot initialize printer.");
+				if (! PrintDlg (& theWinPrint)) Melder_throw (U"Cannot initialize printer.");
 			}
 			if (Melder_backgrounding) {
 				theWinPrint. Flags = PD_RETURNDEFAULT | PD_RETURNDC;
 				if (! PrintDlg (& theWinPrint) || theWinPrint. hDC == NULL) {
-					Melder_throw ("Cannot print from a script on this computer.");
+					Melder_throw (U"Cannot print from a script on this computer.");
 				}
 			} else {
 				theWinPrint. Flags &= ~ PD_RETURNDEFAULT;
@@ -462,7 +460,7 @@ int Printer_print (void (*draw) (void *boss, Graphics g), void *boss) {
 				thePrinter. paperWidth = 1000;
 				thePrinter. paperHeight = 1000;
 			}
-			EnableWindow ((HWND) XtWindow (theCurrentPraatApplication -> topShell -> d_xmShell), FALSE);
+			EnableWindow ((HWND) XtWindow (theCurrentPraatApplication -> topShell -> d_xmShell), false);
 			SetAbortProc (theWinDC, AbortFunc);
 			memset (& docInfo, 0, sizeof (DOCINFO));
 			docInfo. cbSize = sizeof (DOCINFO);
@@ -485,12 +483,12 @@ int Printer_print (void (*draw) (void *boss, Graphics g), void *boss) {
 				draw (boss, thePrinter. graphics);
 				forget (thePrinter. graphics);
 				if (EndPage (theWinDC) < 0) {
-					Melder_throw ("Cannot print page.");
+					Melder_throw (U"Cannot print page.");
 				} else {
 					EndDoc (theWinDC);
 				}
 			}
-			EnableWindow ((HWND) XtWindow (theCurrentPraatApplication -> topShell -> d_xmShell), TRUE);
+			EnableWindow ((HWND) XtWindow (theCurrentPraatApplication -> topShell -> d_xmShell), true);
 			DeleteDC (theWinDC), theWinDC = NULL;
 		#elif defined (macintosh)
 			Boolean result;
@@ -551,7 +549,7 @@ int Printer_print (void (*draw) (void *boss, Graphics g), void *boss) {
 				theMacPort = NULL;
 			}
 		#endif
-		Melder_throw ("Not printed.");
+		Melder_throw (U"Not printed.");
 	}
 }
 
diff --git a/sys/Printer.h b/sys/Printer.h
index f3b6ba8..0bcc5f9 100644
--- a/sys/Printer.h
+++ b/sys/Printer.h
@@ -39,14 +39,14 @@ extern struct Printer thePrinter;
 	int Printer_postScript_printf (void *stream, const char *format, ... );
 #endif
 #ifdef _WIN32
-	HDC Printer_getDC (void);
+	HDC Printer_getDC ();
 #endif
-int Printer_pageSetup (void);
-int Printer_postScriptSettings (void);
+int Printer_pageSetup ();
+int Printer_postScriptSettings ();
 int Printer_print (void (*draw) (I, Graphics g), I);
-void Printer_nextPage (void);
+void Printer_nextPage ();
 
-void Printer_prefs (void);
+void Printer_prefs ();
 
 /* End of file Printer.h */
 #endif
diff --git a/sys/Script.cpp b/sys/Script.cpp
index 9cb5c88..778605b 100644
--- a/sys/Script.cpp
+++ b/sys/Script.cpp
@@ -19,7 +19,7 @@
 
 #include "Script.h"
 
-Thing_implement (Script, Data, 0);
+Thing_implement (Script, Daata, 0);
 
 Script Script_createFromFile (MelderFile file) {
 	autoScript me = Thing_new (Script);
diff --git a/sys/Script.h b/sys/Script.h
index fe1d540..04a37bb 100644
--- a/sys/Script.h
+++ b/sys/Script.h
@@ -2,7 +2,7 @@
 #define _Script_h_
 /* Script.h
  *
- * Copyright (C) 1997-2011 Paul Boersma
+ * Copyright (C) 1997-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,10 +21,8 @@
 
 #include "Data.h"
 
-Thing_define (Script, Data) {
-	// new data:
-	public:
-		structMelderFile file;
+Thing_define (Script, Daata) {
+	structMelderFile file;
 };
 
 Script Script_createFromFile (MelderFile file);
diff --git a/sys/ScriptEditor.cpp b/sys/ScriptEditor.cpp
index c4a0752..f956d4f 100644
--- a/sys/ScriptEditor.cpp
+++ b/sys/ScriptEditor.cpp
@@ -1,6 +1,6 @@
 /* ScriptEditor.cpp
  *
- * Copyright (C) 1997-2012,2013 Paul Boersma
+ * Copyright (C) 1997-2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -26,13 +26,13 @@ Thing_implement (ScriptEditor, TextEditor, 0);
 
 static Collection theScriptEditors;
 
-int ScriptEditors_dirty (void) {
-	if (! theScriptEditors) return FALSE;
+bool ScriptEditors_dirty () {
+	if (! theScriptEditors) return false;
 	for (long i = 1; i <= theScriptEditors -> size; i ++) {
 		ScriptEditor me = (ScriptEditor) theScriptEditors -> item [i];
-		if (my dirty) return TRUE;
+		if (my dirty) return true;
 	}
-	return FALSE;
+	return false;
 }
 
 void structScriptEditor :: v_destroy () {
@@ -44,28 +44,27 @@ void structScriptEditor :: v_destroy () {
 }
 
 void structScriptEditor :: v_nameChanged () {
-	bool dirtinessAlreadyShown = d_windowForm -> f_setDirty (dirty);
-	static MelderString buffer = { 0 };
-	MelderString_copy (& buffer, name [0] ? L"Script" : L"untitled script");
+	bool dirtinessAlreadyShown = GuiWindow_setDirty (d_windowForm, dirty);
+	static MelderString buffer { 0 };
+	MelderString_copy (& buffer, name [0] ? U"Script" : U"untitled script");
 	if (editorClass)
-		MelderString_append (& buffer, L" [", environmentName, L"]");
+		MelderString_append (& buffer, U" [", environmentName, U"]");
 	if (name [0])
-		MelderString_append (& buffer, L" ", MelderFile_messageName (& file));
+		MelderString_append (& buffer, U" ", MelderFile_messageName (& file));
 	if (dirty && ! dirtinessAlreadyShown)
-		MelderString_append (& buffer, L" (modified)");
-	d_windowForm -> f_setTitle (buffer.string);
+		MelderString_append (& buffer, U" (modified)");
+	GuiShell_setTitle (d_windowForm, buffer.string);
 }
 
 void structScriptEditor :: v_goAway () {
 	if (interpreter -> running) {
-		Melder_error_ ("Cannot close the script window while the script is running or paused. Please close or continue the pause or demo window.");
-		Melder_flushError (NULL);
+		Melder_flushError (U"Cannot close the script window while the script is running or paused. Please close or continue the pause or demo window.");
 	} else {
 		ScriptEditor_Parent :: v_goAway ();
 	}
 }
 
-static void args_ok (UiForm sendingForm, int narg_dummy, Stackel args_dummy, const wchar_t *sendingString_dummy, Interpreter interpreter_dummy, const wchar_t *invokingButtonTitle, bool modified_dummy, I) {
+static void args_ok (UiForm sendingForm, int narg_dummy, Stackel args_dummy, const char32 *sendingString_dummy, Interpreter interpreter_dummy, const char32 *invokingButtonTitle, bool modified_dummy, I) {
 	iam (ScriptEditor);
 	(void) narg_dummy;
 	(void) args_dummy;
@@ -73,7 +72,7 @@ static void args_ok (UiForm sendingForm, int narg_dummy, Stackel args_dummy, con
 	(void) interpreter_dummy;
 	(void) invokingButtonTitle;
 	(void) modified_dummy;
-	autostring text = my textWidget -> f_getString ();
+	autostring32 text = GuiText_getString (my textWidget);
 	structMelderFile file = { 0 };
 	if (my name [0]) {
 		Melder_pathToFile (my name, & file);
@@ -88,7 +87,7 @@ static void args_ok (UiForm sendingForm, int narg_dummy, Stackel args_dummy, con
 	Interpreter_run (my interpreter, text.peek());
 }
 
-static void args_ok_selectionOnly (UiForm sendingForm, int narg_dummy, Stackel args_dummy, const wchar_t *sendingString_dummy, Interpreter interpreter_dummy, const wchar_t *invokingButtonTitle, bool modified_dummy, I) {
+static void args_ok_selectionOnly (UiForm sendingForm, int narg_dummy, Stackel args_dummy, const char32 *sendingString_dummy, Interpreter interpreter_dummy, const char32 *invokingButtonTitle, bool modified_dummy, I) {
 	iam (ScriptEditor);
 	(void) narg_dummy;
 	(void) args_dummy;
@@ -96,9 +95,9 @@ static void args_ok_selectionOnly (UiForm sendingForm, int narg_dummy, Stackel a
 	(void) interpreter_dummy;
 	(void) invokingButtonTitle;
 	(void) modified_dummy;
-	autostring text = my textWidget -> f_getSelection ();
+	autostring32 text = GuiText_getSelection (my textWidget);
 	if (text.peek() == NULL)
-		Melder_throw ("No text is selected any longer.\nPlease reselect or click Cancel.");
+		Melder_throw (U"No text is selected any longer.\nPlease reselect or click Cancel.");
 	structMelderFile file = { 0 };
 	if (my name [0]) {
 		Melder_pathToFile (my name, & file);
@@ -116,8 +115,9 @@ static void args_ok_selectionOnly (UiForm sendingForm, int narg_dummy, Stackel a
 static void menu_cb_run (EDITOR_ARGS) {
 	EDITOR_IAM (ScriptEditor);
 	if (my interpreter -> running)
-		Melder_throw ("The script is already running (paused). Please close or continue the pause or demo window.");
-	autostring text = my textWidget -> f_getString ();
+		Melder_throw (U"The script is already running (paused). Please close or continue the pause or demo window.");
+	autostring32 text = GuiText_getString (my textWidget);
+	trace (U"Running the following script (1):\n", text.peek());
 	structMelderFile file = { 0 };
 	if (my name [0]) {
 		Melder_pathToFile (my name, & file);
@@ -135,6 +135,7 @@ static void menu_cb_run (EDITOR_ARGS) {
 	} else {
 		autoPraatBackground background;
 		if (my name [0]) MelderFile_setDefaultDir (& file);
+		trace (U"Running the following script (2):\n", text.peek());
 		Interpreter_run (my interpreter, text.peek());
 	}
 }
@@ -142,10 +143,10 @@ static void menu_cb_run (EDITOR_ARGS) {
 static void menu_cb_runSelection (EDITOR_ARGS) {
 	EDITOR_IAM (ScriptEditor);
 	if (my interpreter -> running)
-		Melder_throw (L"The script is already running (paused). Please close or continue the pause or demo window.");
-	autostring text = my textWidget -> f_getSelection ();
+		Melder_throw (U"The script is already running (paused). Please close or continue the pause or demo window.");
+	autostring32 text = GuiText_getSelection (my textWidget);
 	if (text.peek() == NULL)
-		Melder_throw ("No text selected.");
+		Melder_throw (U"No text selected.");
 	structMelderFile file = { 0 };
 	if (my name [0]) {
 		Melder_pathToFile (my name, & file);
@@ -169,77 +170,77 @@ static void menu_cb_runSelection (EDITOR_ARGS) {
 
 static void menu_cb_addToMenu (EDITOR_ARGS) {
 	EDITOR_IAM (ScriptEditor);
-	EDITOR_FORM (L"Add to menu", L"Add to fixed menu...")
-		WORD (L"Window", L"?")
-		SENTENCE (L"Menu", L"File")
-		SENTENCE (L"Command", L"Do it...")
-		SENTENCE (L"After command", L"")
-		INTEGER (L"Depth", L"0")
-		LABEL (L"", L"Script file:")
-		TEXTFIELD (L"Script", L"")
+	EDITOR_FORM (U"Add to menu", U"Add to fixed menu...")
+		WORD (U"Window", U"?")
+		SENTENCE (U"Menu", U"File")
+		SENTENCE (U"Command", U"Do it...")
+		SENTENCE (U"After command", U"")
+		INTEGER (U"Depth", U"0")
+		LABEL (U"", U"Script file:")
+		TEXTFIELD (U"Script", U"")
 	EDITOR_OK
-		if (my editorClass) SET_STRING (L"Window", my editorClass -> className)
+		if (my editorClass) SET_STRING (U"Window", my editorClass -> className)
 		if (my name [0])
-			SET_STRING (L"Script", my name)
+			SET_STRING (U"Script", my name)
 		else
-			SET_STRING (L"Script", L"(please save your script first)")
+			SET_STRING (U"Script", U"(please save your script first)")
 	EDITOR_DO
-		praat_addMenuCommandScript (GET_STRING (L"Window"),
-			GET_STRING (L"Menu"), GET_STRING (L"Command"), GET_STRING (L"After command"),
-			GET_INTEGER (L"Depth"), GET_STRING (L"Script"));
+		praat_addMenuCommandScript (GET_STRING (U"Window"),
+			GET_STRING (U"Menu"), GET_STRING (U"Command"), GET_STRING (U"After command"),
+			GET_INTEGER (U"Depth"), GET_STRING (U"Script"));
 		praat_show ();
 	EDITOR_END
 }
 
 static void menu_cb_addToFixedMenu (EDITOR_ARGS) {
 	EDITOR_IAM (ScriptEditor);
-	EDITOR_FORM (L"Add to fixed menu", L"Add to fixed menu...");
-		RADIO (L"Window", 1)
-			RADIOBUTTON (L"Objects")
-			RADIOBUTTON (L"Picture")
-		SENTENCE (L"Menu", L"New")
-		SENTENCE (L"Command", L"Do it...")
-		SENTENCE (L"After command", L"")
-		INTEGER (L"Depth", L"0")
-		LABEL (L"", L"Script file:")
-		TEXTFIELD (L"Script", L"")
+	EDITOR_FORM (U"Add to fixed menu", U"Add to fixed menu...");
+		RADIO (U"Window", 1)
+			RADIOBUTTON (U"Objects")
+			RADIOBUTTON (U"Picture")
+		SENTENCE (U"Menu", U"New")
+		SENTENCE (U"Command", U"Do it...")
+		SENTENCE (U"After command", U"")
+		INTEGER (U"Depth", U"0")
+		LABEL (U"", U"Script file:")
+		TEXTFIELD (U"Script", U"")
 	EDITOR_OK
 		if (my name [0])
-			SET_STRING (L"Script", my name)
+			SET_STRING (U"Script", my name)
 		else
-			SET_STRING (L"Script", L"(please save your script first)")
+			SET_STRING (U"Script", U"(please save your script first)")
 	EDITOR_DO
-		praat_addMenuCommandScript (GET_STRING (L"Window"),
-			GET_STRING (L"Menu"), GET_STRING (L"Command"), GET_STRING (L"After command"),
-			GET_INTEGER (L"Depth"), GET_STRING (L"Script"));
+		praat_addMenuCommandScript (GET_STRING (U"Window"),
+			GET_STRING (U"Menu"), GET_STRING (U"Command"), GET_STRING (U"After command"),
+			GET_INTEGER (U"Depth"), GET_STRING (U"Script"));
 		praat_show ();
 	EDITOR_END
 }
 
 static void menu_cb_addToDynamicMenu (EDITOR_ARGS) {
 	EDITOR_IAM (ScriptEditor);
-	EDITOR_FORM (L"Add to dynamic menu", L"Add to dynamic menu...")
-		WORD (L"Class 1", L"Sound")
-		INTEGER (L"Number 1", L"0")
-		WORD (L"Class 2", L"")
-		INTEGER (L"Number 2", L"0")
-		WORD (L"Class 3", L"")
-		INTEGER (L"Number 3", L"0")
-		SENTENCE (L"Command", L"Do it...")
-		SENTENCE (L"After command", L"")
-		INTEGER (L"Depth", L"0")
-		LABEL (L"", L"Script file:")
-		TEXTFIELD (L"Script", L"")
+	EDITOR_FORM (U"Add to dynamic menu", U"Add to dynamic menu...")
+		WORD (U"Class 1", U"Sound")
+		INTEGER (U"Number 1", U"0")
+		WORD (U"Class 2", U"")
+		INTEGER (U"Number 2", U"0")
+		WORD (U"Class 3", U"")
+		INTEGER (U"Number 3", U"0")
+		SENTENCE (U"Command", U"Do it...")
+		SENTENCE (U"After command", U"")
+		INTEGER (U"Depth", U"0")
+		LABEL (U"", U"Script file:")
+		TEXTFIELD (U"Script", U"")
 	EDITOR_OK
 		if (my name [0])
-			SET_STRING (L"Script", my name)
+			SET_STRING (U"Script", my name)
 		else
-			SET_STRING (L"Script", L"(please save your script first)")
+			SET_STRING (U"Script", U"(please save your script first)")
 	EDITOR_DO
-		praat_addActionScript (GET_STRING (L"Class 1"), GET_INTEGER (L"Number 1"),
-			GET_STRING (L"Class 2"), GET_INTEGER (L"Number 2"), GET_STRING (L"Class 3"),
-			GET_INTEGER (L"Number 3"), GET_STRING (L"Command"), GET_STRING (L"After command"),
-			GET_INTEGER (L"Depth"), GET_STRING (L"Script"));
+		praat_addActionScript (GET_STRING (U"Class 1"), GET_INTEGER (U"Number 1"),
+			GET_STRING (U"Class 2"), GET_INTEGER (U"Number 2"), GET_STRING (U"Class 3"),
+			GET_INTEGER (U"Number 3"), GET_STRING (U"Command"), GET_STRING (U"After command"),
+			GET_INTEGER (U"Depth"), GET_STRING (U"Script"));
 		praat_show ();
 	EDITOR_END
 }
@@ -251,106 +252,106 @@ static void menu_cb_clearHistory (EDITOR_ARGS) {
 
 static void menu_cb_pasteHistory (EDITOR_ARGS) {
 	EDITOR_IAM (ScriptEditor);
-	wchar_t *history = UiHistory_get ();
-	if (history == NULL || history [0] == '\0')
-		Melder_throw ("No history.");
-	long length = wcslen (history);
-	if (history [length - 1] != '\n') {
-		UiHistory_write (L"\n");
+	char32 *history = UiHistory_get ();
+	if (history == NULL || history [0] == U'\0')
+		Melder_throw (U"No history.");
+	long length = str32len (history);
+	if (history [length - 1] != U'\n') {
+		UiHistory_write (U"\n");
 		history = UiHistory_get ();
-		length = wcslen (history);
+		length = str32len (history);
 	}
-	if (history [0] == '\n') {
+	if (history [0] == U'\n') {
 		history ++;
 		length --;
 	}
 	long first = 0, last = 0;
-	wchar_t *text = my textWidget -> f_getStringAndSelectionPosition (& first, & last);
+	char32 *text = GuiText_getStringAndSelectionPosition (my textWidget, & first, & last);
 	Melder_free (text);
-	my textWidget -> f_replace (first, last, history);
-	my textWidget -> f_setSelection (first, first + length);
-	my textWidget -> f_scrollToSelection ();
+	GuiText_replace (my textWidget, first, last, history);
+	GuiText_setSelection (my textWidget, first, first + length);
+	GuiText_scrollToSelection (my textWidget);
 }
 
 static void menu_cb_expandIncludeFiles (EDITOR_ARGS) {
 	EDITOR_IAM (ScriptEditor);
 	structMelderFile file = { 0 };
-	autostring text = my textWidget -> f_getString ();
+	autostring32 text = GuiText_getString (my textWidget);
 	if (my name [0]) {
 		Melder_pathToFile (my name, & file);
 		MelderFile_setDefaultDir (& file);
 	}
 	Melder_includeIncludeFiles (& text);
-	my textWidget -> f_setString (text.peek());
+	GuiText_setString (my textWidget, text.peek());
 }
 
-static void menu_cb_AboutScriptEditor (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (L"ScriptEditor"); }
-static void menu_cb_ScriptingTutorial (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (L"Scripting"); }
-static void menu_cb_ScriptingExamples (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (L"Scripting examples"); }
-static void menu_cb_PraatScript (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (L"Praat script"); }
-static void menu_cb_FormulasTutorial (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (L"Formulas"); }
-static void menu_cb_DemoWindow (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (L"Demo window"); }
-static void menu_cb_TheHistoryMechanism (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (L"History mechanism"); }
-static void menu_cb_InitializationScripts (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (L"Initialization script"); }
-static void menu_cb_AddingToAFixedMenu (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (L"Add to fixed menu..."); }
-static void menu_cb_AddingToADynamicMenu (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (L"Add to dynamic menu..."); }
+static void menu_cb_AboutScriptEditor (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (U"ScriptEditor"); }
+static void menu_cb_ScriptingTutorial (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (U"Scripting"); }
+static void menu_cb_ScriptingExamples (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (U"Scripting examples"); }
+static void menu_cb_PraatScript (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (U"Praat script"); }
+static void menu_cb_FormulasTutorial (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (U"Formulas"); }
+static void menu_cb_DemoWindow (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (U"Demo window"); }
+static void menu_cb_TheHistoryMechanism (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (U"History mechanism"); }
+static void menu_cb_InitializationScripts (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (U"Initialization script"); }
+static void menu_cb_AddingToAFixedMenu (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (U"Add to fixed menu..."); }
+static void menu_cb_AddingToADynamicMenu (EDITOR_ARGS) { EDITOR_IAM (ScriptEditor); Melder_help (U"Add to dynamic menu..."); }
 
 void structScriptEditor :: v_createMenus () {
 	ScriptEditor_Parent :: v_createMenus ();
 	if (editorClass) {
-		Editor_addCommand (this, L"File", L"Add to menu...", 0, menu_cb_addToMenu);
+		Editor_addCommand (this, U"File", U"Add to menu...", 0, menu_cb_addToMenu);
 	} else {
-		Editor_addCommand (this, L"File", L"Add to fixed menu...", 0, menu_cb_addToFixedMenu);
-		Editor_addCommand (this, L"File", L"Add to dynamic menu...", 0, menu_cb_addToDynamicMenu);
+		Editor_addCommand (this, U"File", U"Add to fixed menu...", 0, menu_cb_addToFixedMenu);
+		Editor_addCommand (this, U"File", U"Add to dynamic menu...", 0, menu_cb_addToDynamicMenu);
 	}
-	Editor_addCommand (this, L"File", L"-- close --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"-- history --", 0, 0);
-	Editor_addCommand (this, L"Edit", L"Clear history", 0, menu_cb_clearHistory);
-	Editor_addCommand (this, L"Edit", L"Paste history", 'H', menu_cb_pasteHistory);
-	Editor_addCommand (this, L"Convert", L"-- expand --", 0, 0);
-	Editor_addCommand (this, L"Convert", L"Expand include files", 0, menu_cb_expandIncludeFiles);
-	Editor_addMenu (this, L"Run", 0);
-	Editor_addCommand (this, L"Run", L"Run", 'R', menu_cb_run);
-	Editor_addCommand (this, L"Run", L"Run selection", 'T', menu_cb_runSelection);
+	Editor_addCommand (this, U"File", U"-- close --", 0, NULL);
+	Editor_addCommand (this, U"Edit", U"-- history --", 0, 0);
+	Editor_addCommand (this, U"Edit", U"Clear history", 0, menu_cb_clearHistory);
+	Editor_addCommand (this, U"Edit", U"Paste history", 'H', menu_cb_pasteHistory);
+	Editor_addCommand (this, U"Convert", U"-- expand --", 0, 0);
+	Editor_addCommand (this, U"Convert", U"Expand include files", 0, menu_cb_expandIncludeFiles);
+	Editor_addMenu (this, U"Run", 0);
+	Editor_addCommand (this, U"Run", U"Run", 'R', menu_cb_run);
+	Editor_addCommand (this, U"Run", U"Run selection", 'T', menu_cb_runSelection);
 }
 
 void structScriptEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	ScriptEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"About ScriptEditor", '?', menu_cb_AboutScriptEditor);
-	EditorMenu_addCommand (menu, L"Scripting tutorial", 0, menu_cb_ScriptingTutorial);
-	EditorMenu_addCommand (menu, L"Scripting examples", 0, menu_cb_ScriptingExamples);
-	EditorMenu_addCommand (menu, L"Praat script", 0, menu_cb_PraatScript);
-	EditorMenu_addCommand (menu, L"Formulas tutorial", 0, menu_cb_FormulasTutorial);
-	EditorMenu_addCommand (menu, L"Demo window", 0, menu_cb_DemoWindow);
-	EditorMenu_addCommand (menu, L"-- help history --", 0, NULL);
-	EditorMenu_addCommand (menu, L"The History mechanism", 0, menu_cb_TheHistoryMechanism);
-	EditorMenu_addCommand (menu, L"Initialization scripts", 0, menu_cb_InitializationScripts);
-	EditorMenu_addCommand (menu, L"-- help add --", 0, NULL);
-	EditorMenu_addCommand (menu, L"Adding to a fixed menu", 0, menu_cb_AddingToAFixedMenu);
-	EditorMenu_addCommand (menu, L"Adding to a dynamic menu", 0, menu_cb_AddingToADynamicMenu);
+	EditorMenu_addCommand (menu, U"About ScriptEditor", '?', menu_cb_AboutScriptEditor);
+	EditorMenu_addCommand (menu, U"Scripting tutorial", 0, menu_cb_ScriptingTutorial);
+	EditorMenu_addCommand (menu, U"Scripting examples", 0, menu_cb_ScriptingExamples);
+	EditorMenu_addCommand (menu, U"Praat script", 0, menu_cb_PraatScript);
+	EditorMenu_addCommand (menu, U"Formulas tutorial", 0, menu_cb_FormulasTutorial);
+	EditorMenu_addCommand (menu, U"Demo window", 0, menu_cb_DemoWindow);
+	EditorMenu_addCommand (menu, U"-- help history --", 0, NULL);
+	EditorMenu_addCommand (menu, U"The History mechanism", 0, menu_cb_TheHistoryMechanism);
+	EditorMenu_addCommand (menu, U"Initialization scripts", 0, menu_cb_InitializationScripts);
+	EditorMenu_addCommand (menu, U"-- help add --", 0, NULL);
+	EditorMenu_addCommand (menu, U"Adding to a fixed menu", 0, menu_cb_AddingToAFixedMenu);
+	EditorMenu_addCommand (menu, U"Adding to a dynamic menu", 0, menu_cb_AddingToADynamicMenu);
 }
 
-void structScriptEditor :: init (Editor environment, const wchar_t *initialText) {
+void ScriptEditor_init (ScriptEditor me, Editor environment, const char32 *initialText) {
 	if (environment != NULL) {
-		environmentName = Melder_wcsdup (environment -> name);
-		editorClass = environment -> classInfo;
+		my environmentName = Melder_dup (environment -> name);
+		my editorClass = environment -> classInfo;
 	}
-	structTextEditor::init (initialText);
-	interpreter = Interpreter_createFromEnvironment (environment);
+	TextEditor_init (me, initialText);
+	my interpreter = Interpreter_createFromEnvironment (environment);
 	if (theScriptEditors == NULL) {
 		theScriptEditors = Collection_create (NULL, 10);
 		Collection_dontOwnItems (theScriptEditors);
 	}
-	Collection_addItem (theScriptEditors, this);
+	Collection_addItem (theScriptEditors, me);
 }
 
-ScriptEditor ScriptEditor_createFromText (Editor environment, const wchar_t *initialText) {
+ScriptEditor ScriptEditor_createFromText (Editor environment, const char32 *initialText) {
 	try {
 		autoScriptEditor me = Thing_new (ScriptEditor);
-		me.peek() -> structScriptEditor :: init (environment, initialText);
+		ScriptEditor_init (me.peek(), environment, initialText);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Script window not created.");
+		Melder_throw (U"Script window not created.");
 	}
 }
 
@@ -360,22 +361,22 @@ ScriptEditor ScriptEditor_createFromScript (Editor environment, Script script) {
 			for (long ieditor = 1; ieditor <= theScriptEditors -> size; ieditor ++) {
 				ScriptEditor editor = (ScriptEditor) theScriptEditors -> item [ieditor];
 				if (MelderFile_equal (& script -> file, & editor -> file)) {
-					editor -> raise ();
-					Melder_error_ ("The script ", & script -> file, " is already open and has been moved to the front.");
+					Editor_raise (editor);
+					Melder_appendError (U"The script ", & script -> file, U" is already open and has been moved to the front.");
 					if (editor -> dirty)
-						Melder_error_ ("Choose \"Reopen from disk\" if you want to revert to the old version.");
-					Melder_flushError (NULL);
+						Melder_appendError (U"Choose \"Reopen from disk\" if you want to revert to the old version.");
+					Melder_flushError ();
 					return NULL;   // safe NULL
 				}
 			}
 		}
-		autostring text = MelderFile_readText (& script -> file);
+		autostring32 text = MelderFile_readText (& script -> file);
 		autoScriptEditor me = ScriptEditor_createFromText (environment, text.peek());
 		MelderFile_copy (& script -> file, & my file);
 		Thing_setName (me.peek(), Melder_fileToPath (& script -> file));
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Script window not created.");
+		Melder_throw (U"Script window not created.");
 	}
 }
 
diff --git a/sys/ScriptEditor.h b/sys/ScriptEditor.h
index 8745050..686acf7 100644
--- a/sys/ScriptEditor.h
+++ b/sys/ScriptEditor.h
@@ -2,7 +2,7 @@
 #define _ScriptEditor_h_
 /* ScriptEditor.h
  *
- * Copyright (C) 1997-2011,2012 Paul Boersma
+ * Copyright (C) 1997-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,26 +24,32 @@
 #include "Interpreter.h"
 
 Thing_define (ScriptEditor, TextEditor) {
-	// new data:
-	public:
-		wchar_t *environmentName;
-		ClassInfo editorClass;
-		Interpreter interpreter;
-		UiForm argsDialog;
-	// functions:
-		void init (Editor editor, const wchar_t *initialText);
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_nameChanged ();
-		virtual void v_goAway ();
-		virtual bool v_scriptable () { return false; }
-		virtual void v_createMenus ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
+	char32 *environmentName;
+	ClassInfo editorClass;
+	Interpreter interpreter;
+	UiForm argsDialog;
+
+	void v_destroy ()
+		override;
+	void v_nameChanged ()
+		override;
+	void v_goAway ()
+		override;
+	bool v_scriptable ()
+		override { return false; }
+	void v_createMenus ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
 };
 
+void ScriptEditor_init (ScriptEditor me,
+	Editor editor,
+	const char32 *initialText
+);
 ScriptEditor ScriptEditor_createFromText (
 	Editor editor,   // the scripting environment; if NULL, the scripting environment consists of the global windows
-	const wchar_t *initialText   // may be NULL
+	const char32 *initialText   // may be NULL
 );
 
 ScriptEditor ScriptEditor_createFromScript (
@@ -51,7 +57,7 @@ ScriptEditor ScriptEditor_createFromScript (
 	Script script
 );
 
-int ScriptEditors_dirty (void);   // are there any modified and unsaved scripts? Ask before quitting the program.
+bool ScriptEditors_dirty ();   // are there any modified and unsaved scripts? Ask before quitting the program.
 
 /* End of file ScriptEditor.h */
 #endif
diff --git a/sys/Simple.cpp b/sys/Simple.cpp
index 3c8bf08..bc1e3c8 100644
--- a/sys/Simple.cpp
+++ b/sys/Simple.cpp
@@ -1,6 +1,6 @@
 /* Simple.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,7 +38,7 @@
 #include "oo_DESCRIPTION.h"
 #include "Simple_def.h"
 
-Thing_implement (SimpleInt, Data, 0);
+Thing_implement (SimpleInt, Daata, 0);
 
 SimpleInt SimpleInt_create (int number) {
 	autoSimpleInt me = Thing_new (SimpleInt);
@@ -46,7 +46,7 @@ SimpleInt SimpleInt_create (int number) {
 	return me.transfer();
 }
 
-Thing_implement (SimpleLong, Data, 0);
+Thing_implement (SimpleLong, Daata, 0);
 
 SimpleLong SimpleLong_create (long number) {
 	autoSimpleLong me = Thing_new (SimpleLong);
@@ -54,7 +54,7 @@ SimpleLong SimpleLong_create (long number) {
 	return me.transfer();
 }
 
-Thing_implement (SimpleDouble, Data, 0);
+Thing_implement (SimpleDouble, Daata, 0);
 
 SimpleDouble SimpleDouble_create (double number) {
 	autoSimpleDouble me = Thing_new (SimpleDouble);
@@ -62,11 +62,11 @@ SimpleDouble SimpleDouble_create (double number) {
 	return me.transfer();
 }
 
-Thing_implement (SimpleString, Data, 0);
+Thing_implement (SimpleString, Daata, 0);
 
-SimpleString SimpleString_create (const wchar_t *string) {
+SimpleString SimpleString_create (const char32 *string) {
 	autoSimpleString me = Thing_new (SimpleString);
-	my string = Melder_wcsdup (string);
+	my string = Melder_dup (string);
 	return me.transfer();
 }
 
diff --git a/sys/Simple.h b/sys/Simple.h
index a21a0eb..6237c5a 100644
--- a/sys/Simple.h
+++ b/sys/Simple.h
@@ -2,7 +2,7 @@
 #define _Simple_h_
 /* Simple.h
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,15 +22,15 @@
 #include "Data.h"
 
 #include "Simple_def.h"
-oo_CLASS_CREATE (SimpleInt, Data);
-oo_CLASS_CREATE (SimpleLong, Data);
-oo_CLASS_CREATE (SimpleDouble, Data);
-oo_CLASS_CREATE (SimpleString, Data);
+oo_CLASS_CREATE (SimpleInt, Daata);
+oo_CLASS_CREATE (SimpleLong, Daata);
+oo_CLASS_CREATE (SimpleDouble, Daata);
+oo_CLASS_CREATE (SimpleString, Daata);
 
 SimpleInt SimpleInt_create (int number);
 SimpleLong SimpleLong_create (long number);
 SimpleDouble SimpleDouble_create (double number);
-SimpleString SimpleString_create (const wchar_t *string);
+SimpleString SimpleString_create (const char32 *string);
 
 /* End of file Simple.h */
 #endif
diff --git a/sys/Simple_def.h b/sys/Simple_def.h
index 3851304..a366460 100644
--- a/sys/Simple_def.h
+++ b/sys/Simple_def.h
@@ -1,6 +1,6 @@
 /* Simple_def.h
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,25 +18,25 @@
  */
 
 #define ooSTRUCT SimpleInt
-oo_DEFINE_CLASS (SimpleInt, Data)
+oo_DEFINE_CLASS (SimpleInt, Daata)
 	oo_INT (number)
 oo_END_CLASS (SimpleInt)
 #undef ooSTRUCT
 
 #define ooSTRUCT SimpleLong
-oo_DEFINE_CLASS (SimpleLong, Data)
+oo_DEFINE_CLASS (SimpleLong, Daata)
 	oo_LONG (number)
 oo_END_CLASS (SimpleLong)
 #undef ooSTRUCT
 
 #define ooSTRUCT SimpleDouble
-oo_DEFINE_CLASS (SimpleDouble, Data)
+oo_DEFINE_CLASS (SimpleDouble, Daata)
 	oo_DOUBLE (number)
 oo_END_CLASS (SimpleDouble)
 #undef ooSTRUCT
 
 #define ooSTRUCT SimpleString
-oo_DEFINE_CLASS (SimpleString, Data)
+oo_DEFINE_CLASS (SimpleString, Daata)
 	oo_STRING (string)
 oo_END_CLASS (SimpleString)
 #undef ooSTRUCT
diff --git a/sys/Strings.cpp b/sys/Strings.cpp
index 6dced45..ecdf027 100644
--- a/sys/Strings.cpp
+++ b/sys/Strings.cpp
@@ -1,6 +1,6 @@
 /* Strings.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -60,12 +60,12 @@
 #include "oo_DESCRIPTION.h"
 #include "Strings_def.h"
 
-Thing_implement (Strings, Data, 0);
+Thing_implement (Strings, Daata, 0);
 
 static long Strings_totalLength (Strings me) {
 	long totalLength = 0;
 	for (long i = 1; i <= my numberOfStrings; i ++) {
-		totalLength += wcslen (my strings [i]);
+		totalLength += str32len (my strings [i]);
 	}
 	return totalLength;
 }
@@ -73,7 +73,7 @@ static long Strings_totalLength (Strings me) {
 static long Strings_maximumLength (Strings me) {
 	long maximumLength = 0;
 	for (long i = 1; i <= my numberOfStrings; i ++) {
-		long length = wcslen (my strings [i]);
+		long length = str32len (my strings [i]);
 		if (length > maximumLength) {
 			maximumLength = length;
 		}
@@ -82,21 +82,21 @@ static long Strings_maximumLength (Strings me) {
 }
 
 void structStrings :: v_info () {
-	structData :: v_info ();
-	MelderInfo_writeLine (L"Number of strings: ", Melder_integer (numberOfStrings));
-	MelderInfo_writeLine (L"Total length: ", Melder_integer (Strings_totalLength (this)), L" characters");
-	MelderInfo_writeLine (L"Longest string: ", Melder_integer (Strings_maximumLength (this)), L" characters");
+	structDaata :: v_info ();
+	MelderInfo_writeLine (U"Number of strings: ", numberOfStrings);
+	MelderInfo_writeLine (U"Total length: ", Strings_totalLength (this), U" characters");
+	MelderInfo_writeLine (U"Longest string: ", Strings_maximumLength (this), U" characters");
 }
 
-const wchar_t * structStrings :: v_getVectorStr (long icol) {
-	if (icol < 1 || icol > numberOfStrings) return L"";
-	wchar_t *stringValue = strings [icol];
-	return stringValue == NULL ? L"" : stringValue;
+const char32 * structStrings :: v_getVectorStr (long icol) {
+	if (icol < 1 || icol > our numberOfStrings) return U"";
+	char32 *stringValue = strings [icol];
+	return stringValue == NULL ? U"" : stringValue;
 }
 
 #define Strings_createAsFileOrDirectoryList_TYPE_FILE  0
 #define Strings_createAsFileOrDirectoryList_TYPE_DIRECTORY  1
-static Strings Strings_createAsFileOrDirectoryList (const wchar_t *path, int type) {
+static Strings Strings_createAsFileOrDirectoryList (const char32 *path /* cattable */, int type) {
 	#if USE_STAT
 		/*
 		 * Initialize.
@@ -111,11 +111,11 @@ static Strings Strings_createAsFileOrDirectoryList (const wchar_t *path, int typ
 			 * the left environment is "h", and the right environment is ".wav".
 			 */
 			MelderString_copy (& searchDirectory, path);
-			wchar_t *asterisk = wcsrchr (searchDirectory. string, '*');
+			char32 *asterisk = str32rchr (searchDirectory. string, '*');
 			if (asterisk != NULL) {
 				*asterisk = '\0';
 				searchDirectory. length = asterisk - searchDirectory. string;   // probably superfluous, but correct
-				wchar_t *lastSlash = wcsrchr (searchDirectory. string, Melder_DIRECTORY_SEPARATOR);
+				char32 *lastSlash = str32rchr (searchDirectory. string, Melder_DIRECTORY_SEPARATOR);
 				if (lastSlash != NULL) {
 					*lastSlash = '\0';   // This fixes searchDirectory.
 					searchDirectory. length = lastSlash - searchDirectory. string;   // probably superfluous, but correct
@@ -127,39 +127,39 @@ static Strings Strings_createAsFileOrDirectoryList (const wchar_t *path, int typ
 				MelderString_copy (& right, asterisk + 1);
 			}
 			char buffer8 [1+kMelder_MAXPATH];
-			Melder_wcsTo8bitFileRepresentation_inline (searchDirectory. string, buffer8);
+			Melder_str32To8bitFileRepresentation_inline (searchDirectory. string, buffer8);
 			d = opendir (buffer8 [0] ? buffer8 : ".");
 			if (d == NULL)
-				Melder_throw ("Cannot open directory ", searchDirectory. string, ".");
-			//Melder_casual ("opened");
+				Melder_throw (U"Cannot open directory ", searchDirectory. string, U".");
+			//Melder_casual (U"opened");
 			autoStrings me = Thing_new (Strings);
-			my strings = NUMvector <wchar_t *> (1, 1000000);
+			my strings = NUMvector <char32 *> (1, 1000000);
 			struct dirent *entry;
 			while ((entry = readdir (d)) != NULL) {
-				MelderString_copy (& filePath, searchDirectory. string [0] ? searchDirectory. string : L".");
+				MelderString_copy (& filePath, searchDirectory. string [0] ? searchDirectory. string : U".");
 				MelderString_appendCharacter (& filePath, Melder_DIRECTORY_SEPARATOR);
-				wchar_t bufferW [1+kMelder_MAXPATH];
-				Melder_8bitFileRepresentationToWcs_inline (entry -> d_name, bufferW);
-				MelderString_append (& filePath, bufferW);
-				//Melder_casual ("read %s", filePath. string);
-				Melder_wcsTo8bitFileRepresentation_inline (filePath. string, buffer8);
+				char32 buffer32 [1+kMelder_MAXPATH];
+				Melder_8bitFileRepresentationToStr32_inline (entry -> d_name, buffer32);
+				MelderString_append (& filePath, buffer32);
+				//Melder_casual (U"read ", filePath. string);
+				Melder_str32To8bitFileRepresentation_inline (filePath. string, buffer8);
 				struct stat stats;
 				if (stat (buffer8, & stats) != 0) {
-					//Melder_throw ("Cannot look at file ", filePath. string, ".");
+					//Melder_throw (U"Cannot look at file ", filePath. string, U".");
 					//stats. st_mode = -1L;
 				}
-				//Melder_casual ("statted %s", filePath. string);
-				//Melder_casual ("file %s mode %s", filePath. string, Melder_integer (stats. st_mode / 4096));
+				//Melder_casual (U"statted ", filePath. string);
+				//Melder_casual (U"file ", filePath. string, U" mode ", stats. st_mode / 4096);
 				if ((type == Strings_createAsFileOrDirectoryList_TYPE_FILE && S_ISREG (stats. st_mode)) ||
 					(type == Strings_createAsFileOrDirectoryList_TYPE_DIRECTORY && S_ISDIR (stats. st_mode)))
 				{
-					Melder_8bitFileRepresentationToWcs_inline (entry -> d_name, bufferW);
-					unsigned long length = wcslen (bufferW);
-					if (bufferW [0] != '.' &&
-						(left. length == 0 || wcsnequ (bufferW, left. string, left. length)) &&
-						(right. length == 0 || (length >= right. length && wcsequ (bufferW + (length - right. length), right. string))))
+					Melder_8bitFileRepresentationToStr32_inline (entry -> d_name, buffer32);
+					unsigned long length = str32len (buffer32);
+					if (buffer32 [0] != U'.' &&
+						(left. length == 0 || str32nequ (buffer32, left. string, left. length)) &&
+						(right. length == 0 || (length >= right. length && str32equ (buffer32 + (length - right. length), right. string))))
 					{
-						my strings [++ my numberOfStrings] = Melder_wcsdup (bufferW);
+						my strings [++ my numberOfStrings] = Melder_dup (buffer32);
 					}
 				}
 			}
@@ -172,13 +172,14 @@ static Strings Strings_createAsFileOrDirectoryList (const wchar_t *path, int typ
 		}
 	#elif defined (_WIN32)
 		try {
-			wchar_t searchPath [1+kMelder_MAXPATH];
-			int len = wcslen (path), hasAsterisk = wcschr (path, '*') != NULL, endsInSeparator = len != 0 && path [len - 1] == '\\';
+			char32 searchPath [1+kMelder_MAXPATH];
+			int len = str32len (path), hasAsterisk = str32chr (path, U'*') != NULL;
+			bool endsInSeparator = ( len != 0 && path [len - 1] == U'\\' );
 			autoStrings me = Thing_new (Strings);
-			my strings = NUMvector <wchar_t *> (1, 1000000);
-			swprintf (searchPath, 1+kMelder_MAXPATH, L"%ls%ls%ls", path, hasAsterisk || endsInSeparator ? L"" : L"\\", hasAsterisk ? L"" : L"*");
+			my strings = NUMvector <char32 *> (1, 1000000);
+			Melder_sprint (searchPath, 1+kMelder_MAXPATH, path, hasAsterisk || endsInSeparator ? U"" : U"\\", hasAsterisk ? U"" : U"*");
 			WIN32_FIND_DATAW findData;
-			HANDLE searchHandle = FindFirstFileW (searchPath, & findData);
+			HANDLE searchHandle = FindFirstFileW (Melder_peek32toW (searchPath), & findData);
 			if (searchHandle != INVALID_HANDLE_VALUE) {
 				do {
 					if ((type == Strings_createAsFileOrDirectoryList_TYPE_FILE &&
@@ -186,8 +187,8 @@ static Strings Strings_createAsFileOrDirectoryList (const wchar_t *path, int typ
 					 || (type == Strings_createAsFileOrDirectoryList_TYPE_DIRECTORY && 
 							(findData. dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0))
 					{
-						if (findData. cFileName [0] != '.') {
-							my strings [++ my numberOfStrings] = Melder_wcsdup (findData. cFileName);
+						if (findData. cFileName [0] != L'.') {
+							my strings [++ my numberOfStrings] = Melder_dup (Melder_peekWto32 (findData. cFileName));
 						}
 					}
 				} while (FindNextFileW (searchHandle, & findData));
@@ -201,19 +202,19 @@ static Strings Strings_createAsFileOrDirectoryList (const wchar_t *path, int typ
 	#endif
 }
 
-Strings Strings_createAsFileList (const wchar_t *path) {
+Strings Strings_createAsFileList (const char32 *path /* cattable */) {
 	try {
 		return Strings_createAsFileOrDirectoryList (path, Strings_createAsFileOrDirectoryList_TYPE_FILE);
 	} catch (MelderError) {
-		Melder_throw ("Strings object not created as file list.");
+		Melder_throw (U"Strings object not created as file list.");
 	}
 }
 
-Strings Strings_createAsDirectoryList (const wchar_t *path) {
+Strings Strings_createAsDirectoryList (const char32 *path /* cattable */) {
 	try {
 		return Strings_createAsFileOrDirectoryList (path, Strings_createAsFileOrDirectoryList_TYPE_DIRECTORY);
 	} catch (MelderError) {
-		Melder_throw ("Strings object not created as directory list.");
+		Melder_throw (U"Strings object not created as directory list.");
 	}
 }
 
@@ -224,32 +225,32 @@ Strings Strings_readFromRawTextFile (MelderFile file) {
 		/*
 		 * Count number of strings.
 		 */
-		int64_t n = MelderReadText_getNumberOfLines (text.peek());
+		int64 n = MelderReadText_getNumberOfLines (text.peek());
 
 		/*
 		 * Create.
 		 */
 		autoStrings me = Thing_new (Strings);
-		if (n > 0) my strings = NUMvector <wchar_t *> (1, n);
+		if (n > 0) my strings = NUMvector <char32 *> (1, n);
 		my numberOfStrings = n;
 
 		/*
 		 * Read strings.
 		 */
 		for (long i = 1; i <= n; i ++) {
-			wchar_t *line = MelderReadText_readLine (text.peek());
-			my strings [i] = Melder_wcsdup (line);
+			char32 *line = MelderReadText_readLine (text.peek());
+			my strings [i] = Melder_dup (line);
 		}
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Strings not read from raw text file ", file, ".");
+		Melder_throw (U"Strings not read from raw text file ", file, U".");
 	}
 }
 
 void Strings_writeToRawTextFile (Strings me, MelderFile file) {
 	autoMelderString buffer;
 	for (long i = 1; i <= my numberOfStrings; i ++) {
-		MelderString_append (& buffer, my strings [i], L"\n");
+		MelderString_append (& buffer, my strings [i], U"\n");
 	}
 	MelderFile_writeText (file, buffer.string, Melder_getOutputEncoding ());
 }
@@ -257,20 +258,20 @@ void Strings_writeToRawTextFile (Strings me, MelderFile file) {
 void Strings_randomize (Strings me) {
 	for (long i = 1; i < my numberOfStrings; i ++) {
 		long other = NUMrandomInteger (i, my numberOfStrings);
-		wchar_t *dummy = my strings [other];
+		char32 *dummy = my strings [other];
 		my strings [other] = my strings [i];
 		my strings [i] = dummy;
 	}
 }
 
 void Strings_genericize (Strings me) {
-	autostring buffer = Melder_calloc (wchar_t, Strings_maximumLength (me) * 3 + 1);
+	autostring32 buffer = Melder_calloc (char32, Strings_maximumLength (me) * 3 + 1);
 	for (long i = 1; i <= my numberOfStrings; i ++) {
-		const wchar_t *p = (const wchar_t *) my strings [i];
+		const char32 *p = (const char32 *) my strings [i];
 		while (*p) {
 			if (*p > 126) {   // backslashes are not converted, i.e. genericize^2 == genericize
-				Longchar_genericizeW (my strings [i], buffer.peek());
-				autostring newString = Melder_wcsdup (buffer.peek());
+				Longchar_genericize32 (my strings [i], buffer.peek());
+				autostring32 newString = Melder_dup (buffer.peek());
 				/*
 				 * Replace string only if copying was OK.
 				 */
@@ -284,10 +285,10 @@ void Strings_genericize (Strings me) {
 }
 
 void Strings_nativize (Strings me) {
-	autostring buffer = Melder_calloc (wchar_t, Strings_maximumLength (me) + 1);
+	autostring32 buffer = Melder_calloc (char32, Strings_maximumLength (me) + 1);
 	for (long i = 1; i <= my numberOfStrings; i ++) {
-		Longchar_nativizeW (my strings [i], buffer.peek(), false);
-		autostring newString = Melder_wcsdup (buffer.peek());
+		Longchar_nativize32 (my strings [i], buffer.peek(), false);
+		autostring32 newString = Melder_dup (buffer.peek());
 		/*
 		 * Replace string only if copying was OK.
 		 */
@@ -302,7 +303,7 @@ void Strings_sort (Strings me) {
 
 void Strings_remove (Strings me, long position) {
 	if (position < 1 || position > my numberOfStrings) {
-		Melder_throw ("You supplied a position of ", position, ", but for this string it has to be in the range [1, ", my numberOfStrings, "].");
+		Melder_throw (U"You supplied a position of ", position, U", but for this string it has to be in the range [1, ", my numberOfStrings, U"].");
 	}
 	Melder_free (my strings [position]);
 	for (long i = position; i < my numberOfStrings; i ++) {
@@ -311,16 +312,16 @@ void Strings_remove (Strings me, long position) {
 	my numberOfStrings --;
 }
 
-void Strings_replace (Strings me, long position, const wchar_t *text) {
+void Strings_replace (Strings me, long position, const char32 *text) {
 	if (position < 1 || position > my numberOfStrings) {
-		Melder_throw ("You supplied a position of ", position, ", but for this string it has to be in the range [1, ", my numberOfStrings, "].");
+		Melder_throw (U"You supplied a position of ", position, U", but for this string it has to be in the range [1, ", my numberOfStrings, U"].");
 	}
-	if (Melder_wcsequ (my strings [position], text))
+	if (Melder_equ (my strings [position], text))
 		return;   // nothing to change
 	/*
 	 * Create without change.
 	 */
-	autostring newString = Melder_wcsdup (text);
+	autostring32 newString = Melder_dup (text);
 	/*
 	 * Change without error.
 	 */
@@ -328,16 +329,16 @@ void Strings_replace (Strings me, long position, const wchar_t *text) {
 	my strings [position] = newString.transfer();
 }
 
-void Strings_insert (Strings me, long position, const wchar_t *text) {
+void Strings_insert (Strings me, long position, const char32 *text) {
 	if (position == 0) {
 		position = my numberOfStrings + 1;
 	} else if (position < 1 || position > my numberOfStrings + 1) {
-		Melder_throw ("You supplied a position of ", position, ", but for this string it has to be in the range [1, ", my numberOfStrings, "].");
+		Melder_throw (U"You supplied a position of ", position, U", but for this string it has to be in the range [1, ", my numberOfStrings, U"].");
 	}
 	/*
 	 * Create without change.
 	 */
-	autostring newString = Melder_wcsdup (text);
+	autostring32 newString = Melder_dup (text);
 	/*
 	 * Change without error.
 	 */
diff --git a/sys/StringsEditor.cpp b/sys/StringsEditor.cpp
index 96973ec..bf7ab32 100644
--- a/sys/StringsEditor.cpp
+++ b/sys/StringsEditor.cpp
@@ -1,6 +1,6 @@
 /* StringsEditor.cpp
  *
- * Copyright (C) 2007-2011 Paul Boersma
+ * Copyright (C) 2007-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,19 +30,19 @@ void structStringsEditor :: v_destroy () {
 static void menu_cb_help (EDITOR_ARGS) {
 	EDITOR_IAM (StringsEditor);
 	(void) me;
-	Melder_help (L"StringsEditor");
+	Melder_help (U"StringsEditor");
 }
 
 void structStringsEditor :: v_createHelpMenuItems (EditorMenu menu) {
 	StringsEditor_Parent :: v_createHelpMenuItems (menu);
-	EditorMenu_addCommand (menu, L"StringsEditor help", '?', menu_cb_help);
+	EditorMenu_addCommand (menu, U"StringsEditor help", U'?', menu_cb_help);
 }
 
 static void updateList (StringsEditor me) {
 	Strings strings = (Strings) my data;
-	my list -> f_deleteAllItems ();
+	GuiList_deleteAllItems (my list);
 	for (long i = 1; i <= strings -> numberOfStrings; i ++)
-		my list -> f_insertItem (strings -> strings [i], 0);
+		GuiList_insertItem (my list, strings -> strings [i], 0);
 }
 
 static void gui_button_cb_insert (I, GuiButtonEvent event) {
@@ -52,10 +52,10 @@ static void gui_button_cb_insert (I, GuiButtonEvent event) {
 	/*
 	 * Find the first selected item.
 	 */
-	long numberOfSelected, *selected = my list -> f_getSelectedPositions (& numberOfSelected);
+	long numberOfSelected, *selected = GuiList_getSelectedPositions (my list, & numberOfSelected);
 	long position = selected == NULL ? strings -> numberOfStrings + 1 : selected [1];
 	NUMvector_free (selected, 1);
-	wchar_t *text = my text -> f_getString ();
+	char32 *text = GuiText_getString (my text);
 	/*
 	 * Change the data.
 	 */
@@ -63,21 +63,21 @@ static void gui_button_cb_insert (I, GuiButtonEvent event) {
 	/*
 	 * Change the list.
 	 */
-	my list -> f_insertItem (text, position);
-	my list -> f_deselectAllItems ();
-	my list -> f_selectItem (position);
+	GuiList_insertItem (my list, text, position);
+	GuiList_deselectAllItems (my list);
+	GuiList_selectItem (my list, position);
 	/*
 	 * Clean up.
 	 */
 	Melder_free (text);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void gui_button_cb_append (I, GuiButtonEvent event) {
 	(void) event;
 	iam (StringsEditor);
 	Strings strings = (Strings) my data;
-	wchar_t *text = my text -> f_getString ();
+	char32 *text = GuiText_getString (my text);
 	/*
 	 * Change the data.
 	 */
@@ -85,40 +85,40 @@ static void gui_button_cb_append (I, GuiButtonEvent event) {
 	/*
 	 * Change the list.
 	 */
-	my list -> f_insertItem (text, 0);
-	my list -> f_deselectAllItems ();
-	my list -> f_selectItem (strings -> numberOfStrings);
+	GuiList_insertItem (my list, text, 0);
+	GuiList_deselectAllItems (my list);
+	GuiList_selectItem (my list, strings -> numberOfStrings);
 	/*
 	 * Clean up.
 	 */
 	Melder_free (text);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void gui_button_cb_remove (I, GuiButtonEvent event) {
 	(void) event;
 	iam (StringsEditor);
-	long numberOfSelected, *selected = my list -> f_getSelectedPositions (& numberOfSelected);
+	long numberOfSelected, *selected = GuiList_getSelectedPositions (my list, & numberOfSelected);
 	for (long iselected = numberOfSelected; iselected >= 1; iselected --) {
 		Strings_remove ((Strings) my data, selected [iselected]);
 	}
 	NUMvector_free (selected, 1);
 	updateList (me);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void gui_button_cb_replace (I, GuiButtonEvent event) {
 	(void) event;
 	iam (StringsEditor);
 	Strings strings = (Strings) my data;
-	long numberOfSelected, *selected = my list -> f_getSelectedPositions (& numberOfSelected);
-	wchar_t *text = my text -> f_getString ();
+	long numberOfSelected, *selected = GuiList_getSelectedPositions (my list, & numberOfSelected);
+	char32 *text = GuiText_getString (my text);
 	for (long iselected = 1; iselected <= numberOfSelected; iselected ++) {
 		Strings_replace (strings, selected [iselected], text);
-		my list -> f_replaceItem (text, selected [iselected]);
+		GuiList_replaceItem (my list, text, selected [iselected]);
 	}
 	Melder_free (text);
-	my broadcastDataChanged ();
+	Editor_broadcastDataChanged (me);
 }
 
 static void gui_list_cb_doubleClick (GuiObject widget, void *void_me, long item) {
@@ -126,33 +126,33 @@ static void gui_list_cb_doubleClick (GuiObject widget, void *void_me, long item)
 	iam (StringsEditor);
 	Strings strings = (Strings) my data;
 	if (item <= strings -> numberOfStrings)
-		my text -> f_setString (strings -> strings [item]);
+		GuiText_setString (my text, strings -> strings [item]);
 }
 
 void structStringsEditor :: v_createChildren () {
 	list = GuiList_create (d_windowForm, 1, 0, Machine_getMenuBarHeight (), -70, true, NULL);
 	//GuiList_setDoubleClickCallback (list, gui_list_cb_doubleClick, this);
-	list -> f_show ();
+	GuiThing_show (list);
 
 	text = GuiText_createShown (d_windowForm, 0, 0, -40 - Gui_TEXTFIELD_HEIGHT, -40, 0);
-	GuiButton_createShown (d_windowForm, 10, 100, -10 - Gui_PUSHBUTTON_HEIGHT, -10, L"Insert", gui_button_cb_insert, this, GuiButton_DEFAULT);
-	GuiButton_createShown (d_windowForm, 110, 200, -10 - Gui_PUSHBUTTON_HEIGHT, -10, L"Append", gui_button_cb_append, this, 0);
-	GuiButton_createShown (d_windowForm, 210, 300, -10 - Gui_PUSHBUTTON_HEIGHT, -10, L"Replace", gui_button_cb_replace, this, 0);
-	GuiButton_createShown (d_windowForm, 310, 400, -10 - Gui_PUSHBUTTON_HEIGHT, -10, L"Remove", gui_button_cb_remove, this, 0);	
+	GuiButton_createShown (d_windowForm, 10, 100, -10 - Gui_PUSHBUTTON_HEIGHT, -10, U"Insert", gui_button_cb_insert, this, GuiButton_DEFAULT);
+	GuiButton_createShown (d_windowForm, 110, 200, -10 - Gui_PUSHBUTTON_HEIGHT, -10, U"Append", gui_button_cb_append, this, 0);
+	GuiButton_createShown (d_windowForm, 210, 300, -10 - Gui_PUSHBUTTON_HEIGHT, -10, U"Replace", gui_button_cb_replace, this, 0);
+	GuiButton_createShown (d_windowForm, 310, 400, -10 - Gui_PUSHBUTTON_HEIGHT, -10, U"Remove", gui_button_cb_remove, this, 0);
 }
 
 void structStringsEditor :: v_dataChanged () {
 	updateList (this);
 }
 
-StringsEditor StringsEditor_create (const wchar_t *title, Strings data) {
+StringsEditor StringsEditor_create (const char32 *title, Strings data) {
 	try {
 		autoStringsEditor me = Thing_new (StringsEditor);
 		Editor_init (me.peek(), 20, 40, 600, 600, title, data);
 		updateList (me.peek());
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Strings window not created.");
+		Melder_throw (U"Strings window not created.");
 	}
 }
 
diff --git a/sys/StringsEditor.h b/sys/StringsEditor.h
index 55fcc80..634b833 100644
--- a/sys/StringsEditor.h
+++ b/sys/StringsEditor.h
@@ -2,7 +2,7 @@
 #define _StringsEditor_h_
 /* StringsEditor.h
  *
- * Copyright (C) 1993-2011 David Weenink & Paul Boersma
+ * Copyright (C) 1993-2011,2015 David Weenink & Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,18 +23,20 @@
 #include "Strings_.h"
 
 Thing_define (StringsEditor, Editor) {
-	// new data:
-	public:
-		GuiList list;
-		GuiText text;
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_createChildren ();
-		virtual void v_createHelpMenuItems (EditorMenu menu);
-		virtual void v_dataChanged ();
+	GuiList list;
+	GuiText text;
+
+	void v_destroy ()
+		override;
+	void v_createChildren ()
+		override;
+	void v_createHelpMenuItems (EditorMenu menu)
+		override;
+	void v_dataChanged ()
+		override;
 };
 
-StringsEditor StringsEditor_create (const wchar_t *title, Strings data);
+StringsEditor StringsEditor_create (const char32 *title, Strings data);
 
 /* End of file StringsEditor.h */
 #endif
diff --git a/sys/Strings_.h b/sys/Strings_.h
index 3b232bb..195ab25 100644
--- a/sys/Strings_.h
+++ b/sys/Strings_.h
@@ -2,7 +2,7 @@
 #define _Strings_h_
 /* Strings.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,10 +22,10 @@
 #include "Data.h"
 
 #include "Strings_def.h"
-oo_CLASS_CREATE (Strings, Data);
+oo_CLASS_CREATE (Strings, Daata);
 
-Strings Strings_createAsFileList (const wchar_t *path);
-Strings Strings_createAsDirectoryList (const wchar_t *path);
+Strings Strings_createAsFileList (const char32 *path /* cattable */);
+Strings Strings_createAsDirectoryList (const char32 *path /* cattable */);
 Strings Strings_readFromRawTextFile (MelderFile file);
 void Strings_writeToRawTextFile (Strings me, MelderFile file);
 
@@ -35,8 +35,8 @@ void Strings_nativize (Strings me);
 void Strings_sort (Strings me);
 
 void Strings_remove (Strings me, long position);
-void Strings_replace (Strings me, long position, const wchar_t *text);
-void Strings_insert (Strings me, long position, const wchar_t *text);
+void Strings_replace (Strings me, long position, const char32 *text);
+void Strings_insert (Strings me, long position, const char32 *text);
 
 /* End of file Strings.h */
 #endif
diff --git a/sys/Strings_def.h b/sys/Strings_def.h
index 78b59cf..2cd3c93 100644
--- a/sys/Strings_def.h
+++ b/sys/Strings_def.h
@@ -1,6 +1,6 @@
 /* Strings_def.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,15 +19,18 @@
 
 
 #define ooSTRUCT Strings
-oo_DEFINE_CLASS (Strings, Data)
+oo_DEFINE_CLASS (Strings, Daata)
 
 	oo_LONG (numberOfStrings)
 	oo_STRING_VECTOR (strings, numberOfStrings)
 
 	#if oo_DECLARING
-		// overridden methods:
-			virtual void v_info ();
-			virtual bool v_hasGetVectorStr () { return true; }   virtual const wchar_t * v_getVectorStr (long icol);
+		void v_info ()
+			override;
+		bool v_hasGetVectorStr ()
+			override { return true; }
+		const char32 * v_getVectorStr (long icol)
+			override;
 	#endif
 
 oo_END_CLASS (Strings)
diff --git a/sys/TextEditor.cpp b/sys/TextEditor.cpp
index 117f5ef..af3a8d1 100644
--- a/sys/TextEditor.cpp
+++ b/sys/TextEditor.cpp
@@ -1,6 +1,6 @@
 /* TextEditor.cpp
  *
- * Copyright (C) 1997-2012,2013 Paul Boersma, 2010 Franz Brausse
+ * Copyright (C) 1997-2012,2013,2015 Paul Boersma, 2010 Franz Brausse
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -37,10 +37,10 @@ static Collection theOpenTextEditors = NULL;
 /***** TextEditor methods *****/
 
 void structTextEditor :: v_destroy () {
-	forget (openDialog);
-	forget (saveDialog);
-	forget (printDialog);
-	forget (findDialog);
+	forget (our openDialog);
+	forget (our saveDialog);
+	forget (our printDialog);
+	forget (our findDialog);
 	if (theOpenTextEditors) {
 		Collection_undangleItem (theOpenTextEditors, this);
 	}
@@ -49,22 +49,20 @@ void structTextEditor :: v_destroy () {
 
 void structTextEditor :: v_nameChanged () {
 	if (v_fileBased ()) {
-		bool dirtinessAlreadyShown = d_windowForm -> f_setDirty (dirty);
-		static MelderString windowTitle = { 0 };
-		MelderString_empty (& windowTitle);
-		if (name [0] == '\0') {
-			MelderString_append (& windowTitle, L"(untitled");
+		bool dirtinessAlreadyShown = GuiWindow_setDirty (our d_windowForm, our dirty);
+		static MelderString windowTitle { 0 };
+		if (our name [0] == U'\0') {
+			MelderString_copy (& windowTitle, U"(untitled");
 			if (dirty && ! dirtinessAlreadyShown)
-				MelderString_append (& windowTitle, L", modified");
-			MelderString_append (& windowTitle, L")");
+				MelderString_append (& windowTitle, U", modified");
+			MelderString_append (& windowTitle, U")");
 		} else {
-			MelderString_append (& windowTitle, L"File ", MelderFile_messageName (& file));
+			MelderString_copy (& windowTitle, U"File ", MelderFile_messageName (& our file));
 			if (dirty && ! dirtinessAlreadyShown)
-				MelderString_append (& windowTitle, L" (modified)");
+				MelderString_append (& windowTitle, U" (modified)");
 		}
-		d_windowForm -> f_setTitle (windowTitle.string);
-		MelderString_empty (& windowTitle);
-		MelderString_append (& windowTitle, dirty && ! dirtinessAlreadyShown ? L"*" : L"", name [0] == '\0' ? L"(untitled)" : MelderFile_name (& file));
+		GuiShell_setTitle (our d_windowForm, windowTitle.string);
+		//MelderString_copy (& windowTitle, our dirty && ! dirtinessAlreadyShown ? U"*" : U"", our name [0] == U'\0' ? U"(untitled)" : MelderFile_name (& our file));
 	} else {
 		TextEditor_Parent :: v_nameChanged ();
 	}
@@ -75,35 +73,35 @@ static void openDocument (TextEditor me, MelderFile file) {
 		for (long ieditor = 1; ieditor <= theOpenTextEditors -> size; ieditor ++) {
 			TextEditor editor = (TextEditor) theOpenTextEditors -> item [ieditor];
 			if (editor != me && MelderFile_equal (file, & editor -> file)) {
-				editor -> raise ();
-				Melder_error_ ("Text file ", file, " is already open.");
-				forget (me);   // don't forget me before Melder_error_, because "file" is owned by one of my dialogs
-				Melder_flushError (NULL);
+				Editor_raise (editor);
+				Melder_appendError (U"Text file ", file, U" is already open.");
+				forget (me);   // don't forget me before Melder_appendError, because "file" is owned by one of my dialogs
+				Melder_flushError ();
 				return;
 			}
 		}
 	}
-	autostring text = MelderFile_readText (file);
-	my textWidget -> f_setString (text.peek());
+	autostring32 text = MelderFile_readText (file);
+	GuiText_setString (my textWidget, text.peek());
 	/*
 	 * GuiText_setString has invoked the changeCallback,
-	 * which has set 'my dirty' to TRUE. Fix this.
+	 * which has set `my dirty` to `true`. Fix this.
 	 */
-	my dirty = FALSE;
+	my dirty = false;
 	MelderFile_copy (file, & my file);
 	Thing_setName (me, Melder_fileToPath (file));
 }
 
 static void newDocument (TextEditor me) {
-	my textWidget -> f_setString (L"");   // implicitly sets my dirty to TRUE
-	my dirty = FALSE;
-	if (my v_fileBased ()) Thing_setName (me, L"");
+	GuiText_setString (my textWidget, U"");   // implicitly sets my dirty to `true`
+	my dirty = false;
+	if (my v_fileBased ()) Thing_setName (me, U"");
 }
 
 static void saveDocument (TextEditor me, MelderFile file) {
-	autostring text = my textWidget -> f_getString ();
+	autostring32 text = GuiText_getString (my textWidget);
 	MelderFile_writeText (file, text.peek(), Melder_getOutputEncoding ());
-	my dirty = FALSE;
+	my dirty = false;
 	MelderFile_copy (file, & my file);
 	if (my v_fileBased ()) Thing_setName (me, Melder_fileToPath (file));
 }
@@ -112,42 +110,35 @@ static void closeDocument (TextEditor me) {
 	forget (me);
 }
 
-static void cb_open_ok (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, I) {
+static void cb_open_ok (UiForm sendingForm, int /* narg */, Stackel /* args */, const char32 * /* sendingString */,
+	Interpreter /* interpreter */, const char32 * /* invokingButtonTitle */, bool /* modified */, I)
+{
 	iam (TextEditor);
-	(void) sendingString;
-	(void) interpreter;
-	(void) invokingButtonTitle;
-	(void) modified;
 	MelderFile file = UiFile_getFile (sendingForm);
 	openDocument (me, file);
 }
 
-static void cb_showOpen (EditorCommand cmd, UiForm sendingForm, const wchar_t *sendingString, Interpreter interpreter) {
+static void cb_showOpen (EditorCommand cmd, UiForm /* sendingForm */, const char32 * /* sendingString */, Interpreter /* interpreter */) {
 	TextEditor me = (TextEditor) cmd -> d_editor;
-	(void) sendingForm;
-	(void) sendingString;
-	(void) interpreter;
 	if (! my openDialog)
-		my openDialog = UiInfile_create (my d_windowForm, L"Open", cb_open_ok, me, NULL, NULL, false);
+		my openDialog = UiInfile_create (my d_windowForm, U"Open", cb_open_ok, me, NULL, NULL, false);
 	UiInfile_do (my openDialog);
 }
 
-static void cb_saveAs_ok (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, I) {
+static void cb_saveAs_ok (UiForm sendingForm, int /* narg */, Stackel /* args */, const char32 * /* sendingString */,
+	Interpreter /* interpreter */, const char32 * /* invokingButtonTitle */, bool /* modified */, I)
+{
 	iam (TextEditor);
-	(void) sendingString;
-	(void) interpreter;
-	(void) invokingButtonTitle;
-	(void) modified;
 	MelderFile file = UiFile_getFile (sendingForm);
 	saveDocument (me, file);
 }
 
 static void menu_cb_saveAs (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	wchar_t defaultName [300];
 	if (! my saveDialog)
-		my saveDialog = UiOutfile_create (my d_windowForm, L"Save", cb_saveAs_ok, me, NULL, NULL);
-	swprintf (defaultName, 300, ! my v_fileBased () ? L"info.txt" : my name [0] ? MelderFile_name (& my file) : L"");
+		my saveDialog = UiOutfile_create (my d_windowForm, U"Save", cb_saveAs_ok, me, NULL, NULL);
+	char32 defaultName [300];
+	Melder_sprint (defaultName,300, ! my v_fileBased () ? U"info.txt" : my name [0] ? MelderFile_name (& my file) : U"");
 	UiOutfile_do (my saveDialog, defaultName);
 }
 
@@ -155,12 +146,12 @@ static void gui_button_cb_saveAndOpen (I, GuiButtonEvent event) {
 	(void) event;
 	EditorCommand cmd = (EditorCommand) void_me;
 	TextEditor me = (TextEditor) cmd -> d_editor;
-	my dirtyOpenDialog -> f_hide ();
+	GuiThing_hide (my dirtyOpenDialog);
 	if (my name [0]) {
 		try {
 			saveDocument (me, & my file);
 		} catch (MelderError) {
-			Melder_flushError (NULL);
+			Melder_flushError ();
 			return;
 		}
 		cb_showOpen (cmd, NULL, NULL, NULL);
@@ -173,14 +164,14 @@ static void gui_button_cb_cancelOpen (I, GuiButtonEvent event) {
 	(void) event;
 	EditorCommand cmd = (EditorCommand) void_me;
 	TextEditor me = (TextEditor) cmd -> d_editor;
-	my dirtyOpenDialog -> f_hide ();
+	GuiThing_hide (my dirtyOpenDialog);
 }
 
 static void gui_button_cb_discardAndOpen (I, GuiButtonEvent event) {
 	(void) event;
 	EditorCommand cmd = (EditorCommand) void_me;
 	TextEditor me = (TextEditor) cmd -> d_editor;
-	my dirtyOpenDialog -> f_hide ();
+	GuiThing_hide (my dirtyOpenDialog);
 	cb_showOpen (cmd, NULL, NULL, NULL);
 }
 
@@ -193,25 +184,25 @@ static void menu_cb_open (EDITOR_ARGS) {
 				150, 70,
 				Gui_LEFT_DIALOG_SPACING + 3 * buttonWidth + 2 * buttonSpacing + Gui_RIGHT_DIALOG_SPACING,
 				Gui_TOP_DIALOG_SPACING + Gui_TEXTFIELD_HEIGHT + Gui_VERTICAL_DIALOG_SPACING_SAME + 2 * Gui_BOTTOM_DIALOG_SPACING + Gui_PUSHBUTTON_HEIGHT,
-				L"Text changed", NULL, NULL, GuiDialog_MODAL);
+				U"Text changed", NULL, NULL, GuiDialog_MODAL);
 			GuiLabel_createShown (my dirtyOpenDialog,
 				Gui_LEFT_DIALOG_SPACING, - Gui_RIGHT_DIALOG_SPACING,
 				Gui_TOP_DIALOG_SPACING, Gui_TOP_DIALOG_SPACING + Gui_LABEL_HEIGHT,
-				L"The text has changed! Save changes?", 0);
+				U"The text has changed! Save changes?", 0);
 			int x = Gui_LEFT_DIALOG_SPACING, y = - Gui_BOTTOM_DIALOG_SPACING;
 			GuiButton_createShown (my dirtyOpenDialog,
 				x, x + buttonWidth, y - Gui_PUSHBUTTON_HEIGHT, y,
-				L"Discard & Open", gui_button_cb_discardAndOpen, cmd, 0);
+				U"Discard & Open", gui_button_cb_discardAndOpen, cmd, 0);
 			x += buttonWidth + buttonSpacing;
 			GuiButton_createShown (my dirtyOpenDialog,
 				x, x + buttonWidth, y - Gui_PUSHBUTTON_HEIGHT, y,
-				L"Cancel", gui_button_cb_cancelOpen, cmd, 0);
+				U"Cancel", gui_button_cb_cancelOpen, cmd, 0);
 			x += buttonWidth + buttonSpacing;
 			GuiButton_createShown (my dirtyOpenDialog,
 				x, x + buttonWidth, y - Gui_PUSHBUTTON_HEIGHT, y,
-				L"Save & Open", gui_button_cb_saveAndOpen, cmd, 0);
+				U"Save & Open", gui_button_cb_saveAndOpen, cmd, 0);
 		}
-		my dirtyOpenDialog -> f_show ();
+		GuiThing_show (my dirtyOpenDialog);
 	} else {
 		cb_showOpen (cmd, sendingForm, sendingString, interpreter);
 	}
@@ -221,12 +212,12 @@ static void gui_button_cb_saveAndNew (I, GuiButtonEvent event) {
 	(void) event;
 	EditorCommand cmd = (EditorCommand) void_me;
 	TextEditor me = (TextEditor) cmd -> d_editor;
-	my dirtyNewDialog -> f_hide ();
+	GuiThing_hide (my dirtyNewDialog);
 	if (my name [0]) {
 		try {
 			saveDocument (me, & my file);
 		} catch (MelderError) {
-			Melder_flushError (NULL);
+			Melder_flushError ();
 			return;
 		}
 		newDocument (me);
@@ -239,14 +230,14 @@ static void gui_button_cb_cancelNew (I, GuiButtonEvent event) {
 	(void) event;
 	EditorCommand cmd = (EditorCommand) void_me;
 	TextEditor me = (TextEditor) cmd -> d_editor;
-	my dirtyNewDialog -> f_hide ();
+	GuiThing_hide (my dirtyNewDialog);
 }
 
 static void gui_button_cb_discardAndNew (I, GuiButtonEvent event) {
 	(void) event;
 	EditorCommand cmd = (EditorCommand) void_me;
 	TextEditor me = (TextEditor) cmd -> d_editor;
-	my dirtyNewDialog -> f_hide ();
+	GuiThing_hide (my dirtyNewDialog);
 	newDocument (me);
 }
 
@@ -258,25 +249,25 @@ static void menu_cb_new (EDITOR_ARGS) {
 			my dirtyNewDialog = GuiDialog_create (my d_windowForm,
 				150, 70, Gui_LEFT_DIALOG_SPACING + 3 * buttonWidth + 2 * buttonSpacing + Gui_RIGHT_DIALOG_SPACING,
 					Gui_TOP_DIALOG_SPACING + Gui_TEXTFIELD_HEIGHT + Gui_VERTICAL_DIALOG_SPACING_SAME + 2 * Gui_BOTTOM_DIALOG_SPACING + Gui_PUSHBUTTON_HEIGHT,
-				L"Text changed", NULL, NULL, GuiDialog_MODAL);
+				U"Text changed", NULL, NULL, GuiDialog_MODAL);
 			GuiLabel_createShown (my dirtyNewDialog,
 				Gui_LEFT_DIALOG_SPACING, - Gui_RIGHT_DIALOG_SPACING,
 				Gui_TOP_DIALOG_SPACING, Gui_TOP_DIALOG_SPACING + Gui_LABEL_HEIGHT,
-				L"The text has changed! Save changes?", 0);
+				U"The text has changed! Save changes?", 0);
 			int x = Gui_LEFT_DIALOG_SPACING, y = - Gui_BOTTOM_DIALOG_SPACING;
 			GuiButton_createShown (my dirtyNewDialog,
 				x, x + buttonWidth, y - Gui_PUSHBUTTON_HEIGHT, y,
-				L"Discard & New", gui_button_cb_discardAndNew, cmd, 0);
+				U"Discard & New", gui_button_cb_discardAndNew, cmd, 0);
 			x += buttonWidth + buttonSpacing;
 			GuiButton_createShown (my dirtyNewDialog,
 				x, x + buttonWidth, y - Gui_PUSHBUTTON_HEIGHT, y,
-				L"Cancel", gui_button_cb_cancelNew, cmd, 0);
+				U"Cancel", gui_button_cb_cancelNew, cmd, 0);
 			x += buttonWidth + buttonSpacing;
 			GuiButton_createShown (my dirtyNewDialog,
 				x, x + buttonWidth, y - Gui_PUSHBUTTON_HEIGHT, y,
-				L"Save & New", gui_button_cb_saveAndNew, cmd, 0);
+				U"Save & New", gui_button_cb_saveAndNew, cmd, 0);
 		}
-		my dirtyNewDialog -> f_show ();
+		GuiThing_show (my dirtyNewDialog);
 	} else {
 		newDocument (me);
 	}
@@ -293,7 +284,7 @@ static void menu_cb_save (EDITOR_ARGS) {
 		try {
 			saveDocument (me, & my file);
 		} catch (MelderError) {
-			Melder_flushError (NULL);
+			Melder_flushError ();
 			return;
 		}
 	} else {
@@ -307,41 +298,41 @@ static void menu_cb_reopen (EDITOR_ARGS) {
 		try {
 			openDocument (me, & my file);
 		} catch (MelderError) {
-			Melder_flushError (NULL);
+			Melder_flushError ();
 			return;
 		}
 	} else {
-		Melder_throw ("Cannot reopen from disk, because the text has never been saved yet.");
+		Melder_throw (U"Cannot reopen from disk, because the text has never been saved yet.");
 	}
 }
 
 static void gui_button_cb_saveAndClose (I, GuiButtonEvent event) {
 	(void) event;
 	iam (TextEditor);
-	my dirtyCloseDialog -> f_hide ();
+	GuiThing_hide (my dirtyCloseDialog);
 	if (my name [0]) {
 		try {
 			saveDocument (me, & my file);
 		} catch (MelderError) {
-			Melder_flushError (NULL);
+			Melder_flushError ();
 			return;
 		}
 		closeDocument (me);
 	} else {
-		menu_cb_saveAs (me, Editor_getMenuCommand (me, L"File", L"Save as..."), NULL, 0, NULL, NULL, NULL);
+		menu_cb_saveAs (me, Editor_getMenuCommand (me, U"File", U"Save as..."), NULL, 0, NULL, NULL, NULL);
 	}
 }
 
 static void gui_button_cb_cancelClose (I, GuiButtonEvent event) {
 	(void) event;
 	iam (TextEditor);
-	my dirtyCloseDialog -> f_hide ();
+	GuiThing_hide (my dirtyCloseDialog);
 }
 
 static void gui_button_cb_discardAndClose (I, GuiButtonEvent event) {
 	(void) event;
 	iam (TextEditor);
-	my dirtyCloseDialog -> f_hide ();
+	GuiThing_hide (my dirtyCloseDialog);
 	closeDocument (me);
 }
 
@@ -352,25 +343,25 @@ void structTextEditor :: v_goAway () {
 			dirtyCloseDialog = GuiDialog_create (d_windowForm,
 				150, 70, Gui_LEFT_DIALOG_SPACING + 3 * buttonWidth + 2 * buttonSpacing + Gui_RIGHT_DIALOG_SPACING,
 					Gui_TOP_DIALOG_SPACING + Gui_TEXTFIELD_HEIGHT + Gui_VERTICAL_DIALOG_SPACING_SAME + 2 * Gui_BOTTOM_DIALOG_SPACING + Gui_PUSHBUTTON_HEIGHT,
-				L"Text changed", NULL, NULL, GuiDialog_MODAL);
+				U"Text changed", NULL, NULL, GuiDialog_MODAL);
 			GuiLabel_createShown (dirtyCloseDialog,
 				Gui_LEFT_DIALOG_SPACING, - Gui_RIGHT_DIALOG_SPACING,
 				Gui_TOP_DIALOG_SPACING, Gui_TOP_DIALOG_SPACING + Gui_LABEL_HEIGHT,
-				L"The text has changed! Save changes?", 0);
+				U"The text has changed! Save changes?", 0);
 			int x = Gui_LEFT_DIALOG_SPACING, y = - Gui_BOTTOM_DIALOG_SPACING;
 			GuiButton_createShown (dirtyCloseDialog,
 				x, x + buttonWidth, y - Gui_PUSHBUTTON_HEIGHT, y,
-				L"Discard & Close", gui_button_cb_discardAndClose, this, 0);
+				U"Discard & Close", gui_button_cb_discardAndClose, this, 0);
 			x += buttonWidth + buttonSpacing;
 			GuiButton_createShown (dirtyCloseDialog,
 				x, x + buttonWidth, y - Gui_PUSHBUTTON_HEIGHT, y,
-				L"Cancel", gui_button_cb_cancelClose, this, 0);
+				U"Cancel", gui_button_cb_cancelClose, this, 0);
 			x += buttonWidth + buttonSpacing;
 			GuiButton_createShown (dirtyCloseDialog,
 				x, x + buttonWidth, y - Gui_PUSHBUTTON_HEIGHT, y,
-				L"Save & Close", gui_button_cb_saveAndClose, this, 0);
+				U"Save & Close", gui_button_cb_saveAndClose, this, 0);
 		}
-		dirtyCloseDialog -> f_show ();
+		GuiThing_show (dirtyCloseDialog);
 	} else {
 		closeDocument (this);
 	}
@@ -378,38 +369,38 @@ void structTextEditor :: v_goAway () {
 
 static void menu_cb_undo (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	my textWidget -> f_undo ();
+	GuiText_undo (my textWidget);
 }
 
 static void menu_cb_redo (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	my textWidget -> f_redo ();
+	GuiText_redo (my textWidget);
 }
 
 static void menu_cb_cut (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	my textWidget -> f_cut ();  // use ((XmAnyCallbackStruct *) call) -> event -> xbutton. time
+	GuiText_cut (my textWidget);  // use ((XmAnyCallbackStruct *) call) -> event -> xbutton. time
 }
 
 static void menu_cb_copy (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	my textWidget -> f_copy ();
+	GuiText_copy (my textWidget);
 }
 
 static void menu_cb_paste (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	my textWidget -> f_paste ();
+	GuiText_paste (my textWidget);
 }
 
 static void menu_cb_erase (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	my textWidget -> f_remove ();
+	GuiText_remove (my textWidget);
 }
 
 static bool getSelectedLines (TextEditor me, long *firstLine, long *lastLine) {
 	long left, right;
-	wchar_t *text = my textWidget -> f_getStringAndSelectionPosition (& left, & right);
-	long textLength = wcslen (text);
+	char32 *text = GuiText_getStringAndSelectionPosition (my textWidget, & left, & right);
+	long textLength = str32len (text);
 	Melder_assert (left >= 0);
 	Melder_assert (left <= right);
 	Melder_assert (right <= textLength);
@@ -434,28 +425,28 @@ static bool getSelectedLines (TextEditor me, long *firstLine, long *lastLine) {
 	return true;
 }
 
-static wchar_t *theFindString = NULL, *theReplaceString = NULL;
+static char32 *theFindString = NULL, *theReplaceString = NULL;
 static void do_find (TextEditor me) {
 	if (theFindString == NULL) return;   // e.g. when the user does "Find again" before having done any "Find"
 	long left, right;
-	autostring text = my textWidget -> f_getStringAndSelectionPosition (& left, & right);
-	wchar_t *location = wcsstr (& text [right], theFindString);
+	autostring32 text = GuiText_getStringAndSelectionPosition (my textWidget, & left, & right);
+	char32 *location = str32str (& text [right], theFindString);
 	if (location != NULL) {
 		long index = location - text.peek();
-		my textWidget -> f_setSelection (index, index + wcslen (theFindString));
-		my textWidget -> f_scrollToSelection ();
+		GuiText_setSelection (my textWidget, index, index + str32len (theFindString));
+		GuiText_scrollToSelection (my textWidget);
 		#ifdef _WIN32
-			my d_windowForm -> f_show ();
+			GuiThing_show (my d_windowForm);
 		#endif
 	} else {
 		/* Try from the start of the document. */
-		location = wcsstr (text.peek(), theFindString);
+		location = str32str (text.peek(), theFindString);
 		if (location != NULL) {
 			long index = location - text.peek();
-			my textWidget -> f_setSelection (index, index + wcslen (theFindString));
-			my textWidget -> f_scrollToSelection ();
+			GuiText_setSelection (my textWidget, index, index + str32len (theFindString));
+			GuiText_scrollToSelection (my textWidget);
 			#ifdef _WIN32
-				my d_windowForm -> f_show ();
+				GuiThing_show (my d_windowForm);
 			#endif
 		} else {
 			Melder_beep ();
@@ -465,31 +456,31 @@ static void do_find (TextEditor me) {
 
 static void do_replace (TextEditor me) {
 	if (theReplaceString == NULL) return;   // e.g. when the user does "Replace again" before having done any "Replace"
-	autostring selection = my textWidget -> f_getSelection ();
-	if (! Melder_wcsequ (selection.peek(), theFindString)) {
+	autostring32 selection = GuiText_getSelection (my textWidget);
+	if (! Melder_equ (selection.peek(), theFindString)) {
 		do_find (me);
 		return;
 	}
 	long left, right;
-	autostring text = my textWidget -> f_getStringAndSelectionPosition (& left, & right);
-	my textWidget -> f_replace (left, right, theReplaceString);
-	my textWidget -> f_setSelection (left, left + wcslen (theReplaceString));
-	my textWidget -> f_scrollToSelection ();
+	autostring32 text = GuiText_getStringAndSelectionPosition (my textWidget, & left, & right);
+	GuiText_replace (my textWidget, left, right, theReplaceString);
+	GuiText_setSelection (my textWidget, left, left + str32len (theReplaceString));
+	GuiText_scrollToSelection (my textWidget);
 	#ifdef _WIN32
-		my d_windowForm -> f_show ();
+		GuiThing_show (my d_windowForm);
 	#endif
 }
 
 static void menu_cb_find (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	EDITOR_FORM (L"Find", 0)
-		LABEL (L"", L"Find:")
-		TEXTFIELD (L"findString", L"")
+	EDITOR_FORM (U"Find", 0)
+		LABEL (U"", U"Find:")
+		TEXTFIELD (U"findString", U"")
 	EDITOR_OK
-		if (theFindString != NULL) SET_STRING (L"findString", theFindString);
+		if (theFindString != NULL) SET_STRING (U"findString", theFindString);
 	EDITOR_DO
 		Melder_free (theFindString);
-		theFindString = Melder_wcsdup_f (GET_STRING (L"findString"));
+		theFindString = Melder_dup_f (GET_STRING (U"findString"));
 		do_find (me);
 	EDITOR_END
 }
@@ -501,24 +492,24 @@ static void menu_cb_findAgain (EDITOR_ARGS) {
 
 static void menu_cb_replace (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	EDITOR_FORM (L"Find", 0)
-		LABEL (L"", L"This is a \"slow\" find-and-replace method;")
-		LABEL (L"", L"if the selected text is identical to the Find string,")
-		LABEL (L"", L"the selected text will be replaced by the Replace string;")
-		LABEL (L"", L"otherwise, the next occurrence of the Find string will be selected.")
-		LABEL (L"", L"So you typically need two clicks on Apply to get a text replaced.")
-		LABEL (L"", L"Find:")
-		TEXTFIELD (L"findString", L"")
-		LABEL (L"", L"Replace with:")
-		TEXTFIELD (L"replaceString", L"")
+	EDITOR_FORM (U"Find", 0)
+		LABEL (U"", U"This is a \"slow\" find-and-replace method;")
+		LABEL (U"", U"if the selected text is identical to the Find string,")
+		LABEL (U"", U"the selected text will be replaced by the Replace string;")
+		LABEL (U"", U"otherwise, the next occurrence of the Find string will be selected.")
+		LABEL (U"", U"So you typically need two clicks on Apply to get a text replaced.")
+		LABEL (U"", U"Find:")
+		TEXTFIELD (U"findString", U"")
+		LABEL (U"", U"Replace with:")
+		TEXTFIELD (U"replaceString", U"")
 	EDITOR_OK
-		if (theFindString != NULL) SET_STRING (L"findString", theFindString);
-		if (theReplaceString != NULL) SET_STRING (L"replaceString", theReplaceString);
+		if (theFindString != NULL) SET_STRING (U"findString", theFindString);
+		if (theReplaceString != NULL) SET_STRING (U"replaceString", theReplaceString);
 	EDITOR_DO
 		Melder_free (theFindString);
-		theFindString = Melder_wcsdup (GET_STRING (L"findString"));
+		theFindString = Melder_dup (GET_STRING (U"findString"));
 		Melder_free (theReplaceString);
-		theReplaceString = Melder_wcsdup (GET_STRING (L"replaceString"));
+		theReplaceString = Melder_dup (GET_STRING (U"replaceString"));
 		do_replace (me);
 	EDITOR_END
 }
@@ -532,97 +523,94 @@ static void menu_cb_whereAmI (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
 	long numberOfLinesLeft, numberOfLinesRight;
 	if (! getSelectedLines (me, & numberOfLinesLeft, & numberOfLinesRight)) {
-		Melder_information (L"The cursor is on line ", Melder_integer (numberOfLinesLeft), L".");
+		Melder_information (U"The cursor is on line ", numberOfLinesLeft, U".");
 	} else if (numberOfLinesLeft == numberOfLinesRight) {
-		Melder_information (L"The selection is on line ", Melder_integer (numberOfLinesLeft), L".");
+		Melder_information (U"The selection is on line ", numberOfLinesLeft, U".");
 	} else {
-		Melder_information (L"The selection runs from line ", Melder_integer (numberOfLinesLeft),
-			L" to line ", Melder_integer (numberOfLinesRight), L".");
+		Melder_information (U"The selection runs from line ", numberOfLinesLeft, U" to line ", numberOfLinesRight, U".");
 	}
 }
 
 static void menu_cb_goToLine (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	EDITOR_FORM (L"Go to line", 0)
-		NATURAL (L"Line", L"1")
+	EDITOR_FORM (U"Go to line", 0)
+		NATURAL (U"Line", U"1")
 	EDITOR_OK
 		long firstLine, lastLine;
 		getSelectedLines (me, & firstLine, & lastLine);
-		SET_INTEGER (L"Line", firstLine);
+		SET_INTEGER (U"Line", firstLine);
 	EDITOR_DO
-		autostring text = my textWidget -> f_getString ();
-		long lineToGo = GET_INTEGER (L"Line"), currentLine = 1;
-		unsigned long left = 0, right = 0;
+		autostring32 text = GuiText_getString (my textWidget);
+		long lineToGo = GET_INTEGER (U"Line"), currentLine = 1;
+		int64 left = 0, right = 0;
 		if (lineToGo == 1) {
-			for (; text [right] != '\n' && text [right] != '\0'; right ++) { }
+			for (; text [right] != U'\n' && text [right] != U'\0'; right ++) { }
 		} else {
-			for (; text [left] != '\0'; left ++) {
-				if (text [left] == '\n') {
+			for (; text [left] != U'\0'; left ++) {
+				if (text [left] == U'\n') {
 					currentLine ++;
 					if (currentLine == lineToGo) {
 						left ++;
-						for (right = left; text [right] != '\n' && text [right] != '\0'; right ++) { }
+						for (right = left; text [right] != U'\n' && text [right] != U'\0'; right ++) { }
 						break;
 					}
 				}
 			}
 		}
-		if (left == wcslen (text.peek())) {
+		if (left == str32len (text.peek())) {
 			right = left;
-		} else if (text [right] == '\n') {
+		} else if (text [right] == U'\n') {
 			right ++;
 		}
-		my textWidget -> f_setSelection (left, right);
-		my textWidget -> f_scrollToSelection ();
+		GuiText_setSelection (my textWidget, left, right);
+		GuiText_scrollToSelection (my textWidget);
 	EDITOR_END
 }
 
 static void menu_cb_convertToCString (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	autostring text = my textWidget -> f_getString ();
-	wchar_t buffer [2] = L" ";
-	const wchar_t *hex [16] = { L"0", L"1", L"2", L"3", L"4", L"5", L"6", L"7", L"8", L"9", L"A", L"B", L"C", L"D", L"E", L"F" };
+	autostring32 text = GuiText_getString (my textWidget);
+	char32 buffer [2] = U" ";
+	const char32 *hex [16] = { U"0", U"1", U"2", U"3", U"4", U"5", U"6", U"7", U"8", U"9", U"A", U"B", U"C", U"D", U"E", U"F" };
 	MelderInfo_open ();
-	MelderInfo_write (L"\"");
-	for (wchar_t *p = & text [0]; *p != '\0'; p ++) {
-		if (*p == '\n') {
-			MelderInfo_write (L"\\n\"\n\"");
-		} else if (*p == '\t') {
-			MelderInfo_write (L"   ");
-		} else if (*p == '\"') {
-			MelderInfo_write (L"\\\"");
-		} else if (*p == '\\') {
-			MelderInfo_write (L"\\\\");
-		} else if (*p < 0 || *p > 127) {
-			char32_t kar = sizeof (wchar_t) == 2 ?
-				(char16_t) *p :   // reinterpret sign before extending -> zero extension
-				(char32_t) *p;
-			if (kar <= 0xFFFF) {   // BUG on Windows
-				MelderInfo_write (L"\\u", hex [kar >> 12], hex [(kar >> 8) & 0x0000000F], hex [(kar >> 4) & 0x0000000F], hex [kar & 0x0000000F]);
+	MelderInfo_write (U"\"");
+	for (char32 *p = & text [0]; *p != U'\0'; p ++) {
+		char32 kar = *p;
+		if (kar == U'\n') {
+			MelderInfo_write (U"\\n\"\n\"");
+		} else if (kar == U'\t') {
+			MelderInfo_write (U"   ");
+		} else if (kar == U'\"') {
+			MelderInfo_write (U"\\\"");
+		} else if (kar == U'\\') {
+			MelderInfo_write (U"\\\\");
+		} else if (kar > 127) {
+			if (kar <= 0x00FFFF) {
+				MelderInfo_write (U"\\u", hex [kar >> 12], hex [(kar >> 8) & 0x00000F], hex [(kar >> 4) & 0x00000F], hex [kar & 0x00000F]);
 			} else {
-				MelderInfo_write (L"\\U", hex [kar >> 28], hex [(kar >> 24) & 0x0000000F], hex [(kar >> 20) & 0x0000000F], hex [(kar >> 16) & 0x0000000F],
-					hex [(kar >> 12) & 0x0000000F], hex [(kar >> 8) & 0x0000000F], hex [(kar >> 4) & 0x0000000F], hex [kar & 0x0000000F]);
+				MelderInfo_write (U"\\U", hex [kar >> 28], hex [(kar >> 24) & 0x00000F], hex [(kar >> 20) & 0x00000F], hex [(kar >> 16) & 0x00000F],
+					hex [(kar >> 12) & 0x00000F], hex [(kar >> 8) & 0x00000F], hex [(kar >> 4) & 0x00000F], hex [kar & 0x00000F]);
 			}
 		} else {
 			buffer [0] = *p;
 			MelderInfo_write (& buffer [0]);
 		}
 	}
-	MelderInfo_write (L"\"");
+	MelderInfo_write (U"\"");
 	MelderInfo_close ();
 }
 
 /***** 'Font' menu *****/
 
 static void updateSizeMenu (TextEditor me) {
-	if (my fontSizeButton_10) my fontSizeButton_10 -> f_check (my p_fontSize == 10);
-	if (my fontSizeButton_12) my fontSizeButton_12 -> f_check (my p_fontSize == 12);
-	if (my fontSizeButton_14) my fontSizeButton_14 -> f_check (my p_fontSize == 14);
-	if (my fontSizeButton_18) my fontSizeButton_18 -> f_check (my p_fontSize == 18);
-	if (my fontSizeButton_24) my fontSizeButton_24 -> f_check (my p_fontSize == 24);
+	if (my fontSizeButton_10) GuiMenuItem_check (my fontSizeButton_10, my p_fontSize == 10);
+	if (my fontSizeButton_12) GuiMenuItem_check (my fontSizeButton_12, my p_fontSize == 12);
+	if (my fontSizeButton_14) GuiMenuItem_check (my fontSizeButton_14, my p_fontSize == 14);
+	if (my fontSizeButton_18) GuiMenuItem_check (my fontSizeButton_18, my p_fontSize == 18);
+	if (my fontSizeButton_24) GuiMenuItem_check (my fontSizeButton_24, my p_fontSize == 24);
 }
 static void setFontSize (TextEditor me, int fontSize) {
-	my textWidget -> f_setFontSize (fontSize);
+	GuiText_setFontSize (my textWidget, fontSize);
 	my pref_fontSize () = my p_fontSize = fontSize;
 	updateSizeMenu (me);
 }
@@ -634,12 +622,12 @@ static void menu_cb_18 (EDITOR_ARGS) { EDITOR_IAM (TextEditor); setFontSize (me,
 static void menu_cb_24 (EDITOR_ARGS) { EDITOR_IAM (TextEditor); setFontSize (me, 24); }
 static void menu_cb_fontSize (EDITOR_ARGS) {
 	EDITOR_IAM (TextEditor);
-	EDITOR_FORM (L"Text window: Font size", 0)
-		NATURAL (L"Font size (points)", L"12")
+	EDITOR_FORM (U"Text window: Font size", 0)
+		NATURAL (U"Font size (points)", U"12")
 	EDITOR_OK
-		SET_INTEGER (L"Font size", (long) my p_fontSize);
+		SET_INTEGER (U"Font size", (long) my p_fontSize);
 	EDITOR_DO
-		setFontSize (me, GET_INTEGER (L"Font size"));
+		setFontSize (me, GET_INTEGER (U"Font size"));
 	EDITOR_END
 }
 
@@ -647,90 +635,90 @@ static void gui_text_cb_change (I, GuiTextEvent event) {
 	(void) event;
 	iam (TextEditor);
 	if (! my dirty) {
-		my dirty = TRUE;
+		my dirty = true;
 		my v_nameChanged ();
 	}
 }
 
 void structTextEditor :: v_createChildren () {
 	textWidget = GuiText_createShown (d_windowForm, 0, 0, Machine_getMenuBarHeight (), 0, GuiText_SCROLLED);
-	textWidget -> f_setChangeCallback (gui_text_cb_change, this);
+	GuiText_setChangeCallback (textWidget, gui_text_cb_change, this);
 }
 
 void structTextEditor :: v_createMenus () {
 	TextEditor_Parent :: v_createMenus ();
 	if (v_fileBased ()) {
-		Editor_addCommand (this, L"File", L"New", 'N', menu_cb_new);
-		Editor_addCommand (this, L"File", L"Open...", 'O', menu_cb_open);
-		Editor_addCommand (this, L"File", L"Reopen from disk", 0, menu_cb_reopen);
+		Editor_addCommand (this, U"File", U"New", 'N', menu_cb_new);
+		Editor_addCommand (this, U"File", U"Open...", 'O', menu_cb_open);
+		Editor_addCommand (this, U"File", U"Reopen from disk", 0, menu_cb_reopen);
 	} else {
-		Editor_addCommand (this, L"File", L"Clear", 'N', menu_cb_clear);
+		Editor_addCommand (this, U"File", U"Clear", 'N', menu_cb_clear);
 	}
-	Editor_addCommand (this, L"File", L"-- save --", 0, NULL);
+	Editor_addCommand (this, U"File", U"-- save --", 0, NULL);
 	if (v_fileBased ()) {
-		Editor_addCommand (this, L"File", L"Save", 'S', menu_cb_save);
-		Editor_addCommand (this, L"File", L"Save as...", 0, menu_cb_saveAs);
+		Editor_addCommand (this, U"File", U"Save", 'S', menu_cb_save);
+		Editor_addCommand (this, U"File", U"Save as...", 0, menu_cb_saveAs);
 	} else {
-		Editor_addCommand (this, L"File", L"Save as...", 'S', menu_cb_saveAs);
+		Editor_addCommand (this, U"File", U"Save as...", 'S', menu_cb_saveAs);
 	}
-	Editor_addCommand (this, L"File", L"-- close --", 0, NULL);
-	textWidget -> f_setUndoItem (Editor_addCommand (this, L"Edit", L"Undo", 'Z', menu_cb_undo));
-	textWidget -> f_setRedoItem (Editor_addCommand (this, L"Edit", L"Redo", 'Y', menu_cb_redo));
-	Editor_addCommand (this, L"Edit", L"-- cut copy paste --", 0, NULL);
-	Editor_addCommand (this, L"Edit", L"Cut", 'X', menu_cb_cut);
-	Editor_addCommand (this, L"Edit", L"Copy", 'C', menu_cb_copy);
-	Editor_addCommand (this, L"Edit", L"Paste", 'V', menu_cb_paste);
-	Editor_addCommand (this, L"Edit", L"Erase", 0, menu_cb_erase);
-	Editor_addMenu (this, L"Search", 0);
-	Editor_addCommand (this, L"Search", L"Find...", 'F', menu_cb_find);
-	Editor_addCommand (this, L"Search", L"Find again", 'G', menu_cb_findAgain);
-	Editor_addCommand (this, L"Search", L"Replace...", GuiMenu_SHIFT + 'F', menu_cb_replace);
-	Editor_addCommand (this, L"Search", L"Replace again", GuiMenu_SHIFT + 'G', menu_cb_replaceAgain);
-	Editor_addCommand (this, L"Search", L"-- line --", 0, NULL);
-	Editor_addCommand (this, L"Search", L"Where am I?", 0, menu_cb_whereAmI);
-	Editor_addCommand (this, L"Search", L"Go to line...", 'L', menu_cb_goToLine);
-	Editor_addMenu (this, L"Convert", 0);
-	Editor_addCommand (this, L"Convert", L"Convert to C string", 0, menu_cb_convertToCString);
+	Editor_addCommand (this, U"File", U"-- close --", 0, NULL);
+	GuiText_setUndoItem (textWidget, Editor_addCommand (this, U"Edit", U"Undo", 'Z', menu_cb_undo));
+	GuiText_setRedoItem (textWidget, Editor_addCommand (this, U"Edit", U"Redo", 'Y', menu_cb_redo));
+	Editor_addCommand (this, U"Edit", U"-- cut copy paste --", 0, NULL);
+	Editor_addCommand (this, U"Edit", U"Cut", 'X', menu_cb_cut);
+	Editor_addCommand (this, U"Edit", U"Copy", 'C', menu_cb_copy);
+	Editor_addCommand (this, U"Edit", U"Paste", 'V', menu_cb_paste);
+	Editor_addCommand (this, U"Edit", U"Erase", 0, menu_cb_erase);
+	Editor_addMenu (this, U"Search", 0);
+	Editor_addCommand (this, U"Search", U"Find...", 'F', menu_cb_find);
+	Editor_addCommand (this, U"Search", U"Find again", 'G', menu_cb_findAgain);
+	Editor_addCommand (this, U"Search", U"Replace...", GuiMenu_SHIFT + 'F', menu_cb_replace);
+	Editor_addCommand (this, U"Search", U"Replace again", GuiMenu_SHIFT + 'G', menu_cb_replaceAgain);
+	Editor_addCommand (this, U"Search", U"-- line --", 0, NULL);
+	Editor_addCommand (this, U"Search", U"Where am I?", 0, menu_cb_whereAmI);
+	Editor_addCommand (this, U"Search", U"Go to line...", 'L', menu_cb_goToLine);
+	Editor_addMenu (this, U"Convert", 0);
+	Editor_addCommand (this, U"Convert", U"Convert to C string", 0, menu_cb_convertToCString);
 	#if defined (macintosh) || defined (UNIX) || defined (_WIN32)
-		Editor_addMenu (this, L"Font", 0);
-		Editor_addCommand (this, L"Font", L"Font size...", 0, menu_cb_fontSize);
-		fontSizeButton_10 = Editor_addCommand (this, L"Font", L"10", GuiMenu_CHECKBUTTON, menu_cb_10);
-		fontSizeButton_12 = Editor_addCommand (this, L"Font", L"12", GuiMenu_CHECKBUTTON, menu_cb_12);
-		fontSizeButton_14 = Editor_addCommand (this, L"Font", L"14", GuiMenu_CHECKBUTTON, menu_cb_14);
-		fontSizeButton_18 = Editor_addCommand (this, L"Font", L"18", GuiMenu_CHECKBUTTON, menu_cb_18);
-		fontSizeButton_24 = Editor_addCommand (this, L"Font", L"24", GuiMenu_CHECKBUTTON, menu_cb_24);
+		Editor_addMenu (this, U"Font", 0);
+		Editor_addCommand (this, U"Font", U"Font size...", 0, menu_cb_fontSize);
+		fontSizeButton_10 = Editor_addCommand (this, U"Font", U"10", GuiMenu_CHECKBUTTON, menu_cb_10);
+		fontSizeButton_12 = Editor_addCommand (this, U"Font", U"12", GuiMenu_CHECKBUTTON, menu_cb_12);
+		fontSizeButton_14 = Editor_addCommand (this, U"Font", U"14", GuiMenu_CHECKBUTTON, menu_cb_14);
+		fontSizeButton_18 = Editor_addCommand (this, U"Font", U"18", GuiMenu_CHECKBUTTON, menu_cb_18);
+		fontSizeButton_24 = Editor_addCommand (this, U"Font", U"24", GuiMenu_CHECKBUTTON, menu_cb_24);
 	#endif
 }
 
-void structTextEditor :: init (const wchar_t *initialText) {
-	Editor_init (this, 0, 0, 600, 400, L"", NULL);
-	setFontSize (this, p_fontSize);
+void TextEditor_init (TextEditor me, const char32 *initialText) {
+	Editor_init (me, 0, 0, 600, 400, U"", NULL);
+	setFontSize (me, my p_fontSize);
 	if (initialText) {
-		textWidget -> f_setString (initialText);
-		dirty = FALSE;   // was set to TRUE in valueChanged callback
-		Thing_setName (this, L"");
+		GuiText_setString (my textWidget, initialText);
+		my dirty = false;   // was set to true in valueChanged callback
+		Thing_setName (me, U"");
 	}
 	if (theOpenTextEditors == NULL) {
 		theOpenTextEditors = Collection_create (classTextEditor, 100);
 		Collection_dontOwnItems (theOpenTextEditors);
 	}
 	if (theOpenTextEditors != NULL) {
-		Collection_addItem (theOpenTextEditors, this);
+		Collection_addItem (theOpenTextEditors, me);
 	}
 }
 
-TextEditor TextEditor_create (const wchar_t *initialText) {
+TextEditor TextEditor_create (const char32 *initialText) {
 	try {
 		autoTextEditor me = Thing_new (TextEditor);
-		my init (initialText);
+		TextEditor_init (me.peek(), initialText);
 		return me.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Text window not created.");
+		Melder_throw (U"Text window not created.");
 	}
 }
 
 void TextEditor_showOpen (TextEditor me) {
-	cb_showOpen (Editor_getMenuCommand (me, L"File", L"Open..."), NULL, NULL, NULL);
+	cb_showOpen (Editor_getMenuCommand (me, U"File", U"Open..."), NULL, NULL, NULL);
 }
 
 /* End of file TextEditor.cpp */
diff --git a/sys/TextEditor.h b/sys/TextEditor.h
index ab82d88..b1cf08b 100644
--- a/sys/TextEditor.h
+++ b/sys/TextEditor.h
@@ -2,7 +2,7 @@
 #define _TextEditor_h_
 /* TextEditor.h
  *
- * Copyright (C) 1997-2011,2012,2013 Paul Boersma
+ * Copyright (C) 1997-2011,2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,32 +22,37 @@
 #include "Editor.h"
 
 Thing_define (TextEditor, Editor) {
-	// new data:
-	public:
-		structMelderFile file;
-		GuiText textWidget;
-		UiForm openDialog, saveDialog, printDialog, findDialog;
-		int dirty;
-		GuiDialog dirtyNewDialog, dirtyOpenDialog, dirtyCloseDialog;
-		GuiMenuItem fontSizeButton_10, fontSizeButton_12, fontSizeButton_14, fontSizeButton_18, fontSizeButton_24;
-	// functions:
-		void init (const wchar_t *initialText);
-	// overridden methods:
-		virtual void v_destroy ();
-		virtual void v_nameChanged ();
-		virtual void v_goAway ();
-		virtual void v_createChildren ();
-		virtual void v_createMenus ();
-		virtual bool v_hasQueryMenu () { return false; }
-	// new methods:
-		virtual bool v_fileBased () { return true; };   // if true, have New, Open..., Save; if false, have Clear
-		virtual void v_clear () { }
-	// preferences:
-		#include "TextEditor_prefs.h"
+	structMelderFile file;
+	GuiText textWidget;
+	UiForm openDialog, saveDialog, printDialog, findDialog;
+	bool dirty;
+	GuiDialog dirtyNewDialog, dirtyOpenDialog, dirtyCloseDialog;
+	GuiMenuItem fontSizeButton_10, fontSizeButton_12, fontSizeButton_14, fontSizeButton_18, fontSizeButton_24;
+
+	void v_destroy ()
+		override;
+	void v_nameChanged ()
+		override;
+	void v_goAway ()
+		override;
+	void v_createChildren ()
+		override;
+	void v_createMenus ()
+		override;
+	bool v_hasQueryMenu ()
+		override { return false; }
+
+	virtual bool v_fileBased () { return true; };   // if true, have New, Open..., Save; if false, have Clear
+	virtual void v_clear () { }
+
+	#include "TextEditor_prefs.h"
 };
 
+void TextEditor_init (TextEditor me,
+	const char32 *initialText
+);
 TextEditor TextEditor_create (
-	const wchar_t *initialText   // may be NULL
+	const char32 *initialText   // may be NULL
 );
 
 void TextEditor_showOpen (TextEditor me);
diff --git a/sys/TextEditor_prefs.h b/sys/TextEditor_prefs.h
index 5795288..407573f 100644
--- a/sys/TextEditor_prefs.h
+++ b/sys/TextEditor_prefs.h
@@ -1,6 +1,6 @@
 /* TextEditor_prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,8 +18,9 @@
  */
 
 prefs_begin (TextEditor)
-	// new:
-		prefs_add_int_with_data (TextEditor, fontSize, 1, L"12")
+
+	prefs_add_int_with_data (TextEditor, fontSize, 1, U"12")
+
 prefs_end (TextEditor)
 
 /* End of file TextEditor_prefs.h */
diff --git a/sys/Thing.cpp b/sys/Thing.cpp
index bbe1cbe..8cf85aa 100644
--- a/sys/Thing.cpp
+++ b/sys/Thing.cpp
@@ -1,6 +1,6 @@
 /* Thing.cpp
  *
- * Copyright (C) 1992-2012 Paul Boersma
+ * Copyright (C) 1992-2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,35 +25,35 @@ static long theTotalNumberOfThings;
 
 void structThing :: v_info ()
 {
-	MelderInfo_writeLine (L"Object type: ", Thing_className (this));
-	MelderInfo_writeLine (L"Object name: ", this -> name ? this -> name : L"<no name>");
+	MelderInfo_writeLine (U"Object type: ", Thing_className (this));
+	MelderInfo_writeLine (U"Object name: ", this -> name ? this -> name : U"<no name>");
 	time_t today = time (NULL);
-	MelderInfo_writeLine (L"Date: ", Melder_peekUtf8ToWcs (ctime (& today)));   /* Includes a newline. */
+	MelderInfo_writeLine (U"Date: ", Melder_peek8to32 (ctime (& today)));   // includes a newline
 }
 
 /*
  * Instead of the Thing_implement macro.
  */
 struct structClassInfo theClassInfo_Thing = {
-	L"Thing",
+	U"Thing",
 	NULL,      // no parent class
 	sizeof (class structThing),
-	NULL,      // no _new function (not needed; plus, it would have to be called "_Thing_new", but that name has been given to something else)
+	NULL,      // no _new function (not needed, because Thing is never instantiated)
 	0,         // version
 	0,         // sequentialUniqueIdOfReadableClass
 	NULL       // dummyObject
 };
 ClassInfo classThing = & theClassInfo_Thing;
 
-const wchar_t * Thing_className (Thing me) { return my classInfo -> className; }
+const char32 * Thing_className (Thing me) { return my classInfo -> className; }
 
-Any _Thing_new (ClassInfo classInfo) {
-	Thing me = (Thing) classInfo -> _new ();
-	trace ("created %ls", classInfo -> className);
+Thing Thing_newFromClass (ClassInfo classInfo) {
+	Thing me = classInfo -> _new ();
+	trace (U"created ", classInfo -> className);
 	theTotalNumberOfThings += 1;
 	my classInfo = classInfo;
-	Melder_assert (my name == NULL);   // check that _new called calloc
-	if (Melder_debug == 40) Melder_casual ("created %ls (%p, %p)", classInfo -> className, classInfo, me);
+	Melder_assert (my name == NULL);   // confirm that _new called calloc
+	if (Melder_debug == 40) Melder_casual (U"created ", classInfo -> className, U" (", Melder_pointer (classInfo), U", ", me, U")");
 	return me;
 }
 
@@ -61,7 +61,7 @@ static int theNumberOfReadableClasses = 0;
 static ClassInfo theReadableClasses [1 + 1000];
 static void _Thing_addOneReadableClass (ClassInfo readableClass) {
 	if (++ theNumberOfReadableClasses > 1000)
-		Melder_fatal ("(Thing_recognizeClassesByName:) Too many (1001) readable classes.");
+		Melder_fatal (U"(Thing_recognizeClassesByName:) Too many (1001) readable classes.");
 	theReadableClasses [theNumberOfReadableClasses] = readableClass;
 	readableClass -> sequentialUniqueIdOfReadableClass = theNumberOfReadableClasses;
 }
@@ -77,12 +77,12 @@ void Thing_recognizeClassesByName (ClassInfo readableClass, ...) {
 	va_end (arg);
 }
 
-long Thing_listReadableClasses (void) {
+long Thing_listReadableClasses () {
 	Melder_clearInfo ();
 	MelderInfo_open ();
 	for (long iclass = 1; iclass <= theNumberOfReadableClasses; iclass ++) {
 		ClassInfo klas = theReadableClasses [iclass];
-		MelderInfo_writeLine (Melder_integer (klas -> sequentialUniqueIdOfReadableClass), L"\t", klas -> className);
+		MelderInfo_writeLine (klas -> sequentialUniqueIdOfReadableClass, U"\t", klas -> className);
 	}
 	MelderInfo_close ();
 	return theNumberOfReadableClasses;
@@ -91,24 +91,23 @@ long Thing_listReadableClasses (void) {
 static int theNumberOfAliases = 0;
 static struct {
 	ClassInfo readableClass;
-	const wchar_t *otherName;
+	const char32 *otherName;
 } theAliases [1 + 100];
 
-void Thing_recognizeClassByOtherName (ClassInfo readableClass, const wchar_t *otherName) {
+void Thing_recognizeClassByOtherName (ClassInfo readableClass, const char32 *otherName) {
 	theAliases [++ theNumberOfAliases]. readableClass = readableClass;
 	theAliases [theNumberOfAliases]. otherName = otherName;
 }
 
-long Thing_version;   // global variable!
-ClassInfo Thing_classFromClassName (const wchar_t *klas) {
-	static wchar_t buffer [1+100];
-	wcsncpy (buffer, klas ? klas : L"", 100);
-	wchar_t *space = wcschr (buffer, ' ');
+ClassInfo Thing_classFromClassName (const char32 *klas, int *p_formatVersion) {
+	static char32 buffer [1+100];
+	str32ncpy (buffer, klas ? klas : U"", 100);
+	char32 *space = str32chr (buffer, U' ');
 	if (space) {
-		*space = '\0';   // strip version number
-		Thing_version = wcstol (space + 1, NULL, 10);
+		*space = U'\0';   // strip version number
+		if (p_formatVersion) *p_formatVersion = Melder_atoi (space + 1);
 	} else {
-		Thing_version = 0;
+		if (p_formatVersion) *p_formatVersion = 0;
 	}
 
 	/*
@@ -116,7 +115,7 @@ ClassInfo Thing_classFromClassName (const wchar_t *klas) {
 	 */
 	for (int i = 1; i <= theNumberOfReadableClasses; i ++) {
 		ClassInfo classInfo = theReadableClasses [i];
-		if (wcsequ (buffer, classInfo -> className)) {
+		if (str32equ (buffer, classInfo -> className)) {
 			return classInfo;
 		}
 	}
@@ -125,36 +124,27 @@ ClassInfo Thing_classFromClassName (const wchar_t *klas) {
 	 * Then try the aliases that were registered with Thing_recognizeClassByOtherName.
 	 */
 	for (int i = 1; i <= theNumberOfAliases; i ++) {
-		if (wcsequ (buffer, theAliases [i]. otherName)) {
+		if (str32equ (buffer, theAliases [i]. otherName)) {
 			ClassInfo classInfo = theAliases [i]. readableClass;
 			return classInfo;
 		}
 	}
 
-	Melder_throw ("Class \"", buffer, "\" not recognized.");
+	Melder_throw (U"Class \"", buffer, U"\" not recognized.");
 }
 
-Any Thing_newFromClassNameA (const char *className) {
+Thing Thing_newFromClassName (const char32 *className, int *p_formatVersion) {
 	try {
-		ClassInfo classInfo = Thing_classFromClassName (Melder_peekUtf8ToWcs (className));
-		return _Thing_new (classInfo);
+		ClassInfo classInfo = Thing_classFromClassName (className, p_formatVersion);
+		return Thing_newFromClass (classInfo);
 	} catch (MelderError) {
-		Melder_throw (className, " not created.");
-	}
-}
-
-Any Thing_newFromClassName (const wchar_t *className) {
-	try {
-		ClassInfo classInfo = Thing_classFromClassName (className);
-		return _Thing_new (classInfo);
-	} catch (MelderError) {
-		Melder_throw (className, " not created.");
+		Melder_throw (className, U" not created.");
 	}
 }
 
 Thing _Thing_dummyObject (ClassInfo classInfo) {
 	if (classInfo -> dummyObject == NULL) {
-		classInfo -> dummyObject = (Thing) classInfo -> _new ();
+		classInfo -> dummyObject = classInfo -> _new ();
 	}
 	Melder_assert (classInfo -> dummyObject != NULL);
 	return classInfo -> dummyObject;
@@ -162,74 +152,85 @@ Thing _Thing_dummyObject (ClassInfo classInfo) {
 
 void _Thing_forget_nozero (Thing me) {
 	if (! me) return;
-	if (Melder_debug == 40) Melder_casual ("destroying %ls", my classInfo -> className);
+	if (Melder_debug == 40) Melder_casual (U"destroying ", my classInfo -> className);
 	my v_destroy ();
 	theTotalNumberOfThings -= 1;
 }
 
 void _Thing_forget (Thing me) {
 	if (! me) return;
-	if (Melder_debug == 40) Melder_casual ("destroying %ls", my classInfo -> className);
+	if (Melder_debug == 40) Melder_casual (U"destroying ", my classInfo -> className);
 	my v_destroy ();
-	trace ("destroying %ls", my classInfo -> className);
+	trace (U"destroying ", my classInfo -> className);
 	//Melder_free (me);
 	delete me;
 	theTotalNumberOfThings -= 1;
 }
 
-bool Thing_subclass (ClassInfo klas, ClassInfo ancestor) {
+bool Thing_isSubclass (ClassInfo klas, ClassInfo ancestor) {
 	while (klas != ancestor && klas != NULL) klas = klas -> parent;
 	return klas != NULL;
 }
 
-bool Thing_member (Thing me, ClassInfo klas) {
-	if (! me) Melder_fatal ("(Thing_member:) Found NULL object.");
-	return Thing_subclass (my classInfo, klas);
+bool Thing_isa (Thing me, ClassInfo klas) {
+	if (! me) Melder_fatal (U"(Thing_isa:) Found NULL object.");
+	return Thing_isSubclass (my classInfo, klas);
 }
 
 void * _Thing_check (Thing me, ClassInfo klas, const char *fileName, int line) {
-	if (! me) Melder_fatal ("(_Thing_check:) NULL object passed to a function\n"
-		"in file %.100s at line %d.", fileName, line);
+	if (! me)
+		Melder_fatal (U"(_Thing_check:)"
+			U" NULL object passed to a function\n"
+			U"in file ", Melder_peek8to32 (fileName),
+			U" at line ", line,
+			U"."
+		);
 	ClassInfo classInfo = my classInfo;
 	while (classInfo != klas && classInfo != NULL) classInfo = classInfo -> parent;
 	if (! classInfo)
-		Melder_fatal ("(_Thing_check:) Object of wrong class (%.50s) passed to a function\n"
-				"in file %.100s at line %d.", Melder_peekWcsToUtf8 (my classInfo -> className), fileName, line);
+		Melder_fatal (U"(_Thing_check:)"
+			U" Object of wrong class (", my classInfo -> className,
+			U") passed to a function\n"
+			U"in file ", Melder_peek8to32 (fileName),
+			U" at line ", line,
+			U"."
+		);
 	return me;
 }
 
-void Thing_infoWithId (Thing me, unsigned long id) {
+void Thing_infoWithIdAndFile (Thing me, unsigned long id, MelderFile file) {
+	//Melder_assert (me != NULL);
 	Melder_clearInfo ();
 	MelderInfo_open ();
-	if (id != 0) MelderInfo_writeLine (L"Object id: ", Melder_integer (id));
+	if (id != 0) MelderInfo_writeLine (U"Object id: ", id);
+	if (! MelderFile_isNull (file)) MelderInfo_writeLine (U"Associated file: ", Melder_fileToPath (file));
 	my v_info ();
 	MelderInfo_close ();
 }
 
 void Thing_info (Thing me) {
-	Thing_infoWithId (me, 0);
+	Thing_infoWithIdAndFile (me, 0, NULL);
 }
 
-wchar_t * Thing_getName (Thing me) { return my name; }
+char32 * Thing_getName (Thing me) { return my name; }
 
-wchar_t * Thing_messageName (Thing me) {
-	static MelderString buffers [11];
+char32 * Thing_messageName (Thing me) {
+	static MelderString buffers [19] { { 0 } };
 	static int ibuffer = 0;
-	if (++ ibuffer == 11) ibuffer = 0;
-	MelderString_empty (& buffers [ibuffer]);
+	if (++ ibuffer == 19) ibuffer = 0;
 	if (my name) {
-		MelderString_append (& buffers [ibuffer], my classInfo -> className, L" \"", my name, L"\"");
+		MelderString_copy (& buffers [ibuffer], my classInfo -> className, U" \"", my name, U"\"");
 	} else {
-		MelderString_append (& buffers [ibuffer], my classInfo -> className);
+		MelderString_copy (& buffers [ibuffer], my classInfo -> className);
 	}
 	return buffers [ibuffer]. string;
 }
 
-void Thing_setName (Thing me, const wchar_t *name) {
+void Thing_setName (Thing me, const char32 *name /* cattable */) {
 	/*
 	 * First check without change.
 	 */
-	autostring newName = Melder_wcsdup_f (name);   // BUG: that's no checking
+	autostring32 newName = Melder_dup_f (name);   // BUG: that's no checking
 	/*
 	 * Then change without error.
 	 */
@@ -238,7 +239,7 @@ void Thing_setName (Thing me, const wchar_t *name) {
 	my v_nameChanged ();
 }
 
-long Thing_getTotalNumberOfThings (void) { return theTotalNumberOfThings; }
+long Thing_getTotalNumberOfThings () { return theTotalNumberOfThings; }
 
 void Thing_swap (Thing me, Thing thee) {
 	Melder_assert (my classInfo == thy classInfo);
diff --git a/sys/Thing.h b/sys/Thing.h
index 13d65f8..8dde4a8 100644
--- a/sys/Thing.h
+++ b/sys/Thing.h
@@ -2,7 +2,7 @@
 #define _Thing_h_
 /* Thing.h
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,7 +22,7 @@
 /* The root class of all objects. */
 
 /* Anyone who uses Thing can also use: */
-	/* Arrays with any bounds and 1 or two indices, math, and numerics: */
+	/* Arrays with any bounds and 1 or 2 indices, math, and numerics: */
 		#include "NUM.h"   /* Including math.h */
 	/* The messaging mechanism: */
 		#include "melder.h"   /* Including stdio.h string.h etc. */
@@ -31,6 +31,10 @@
 	/* The input/output mechanism: */
 		#include "abcio.h"
 
+//#include <string>
+
+#define _Thing_auto_DEBUG  0
+
 /* Public. */
 
 typedef void *Any;   /* Prevent compile-time type checking. */
@@ -58,7 +62,7 @@ struct structClassInfo {
 	/*
 	 * The following five fields are statically initialized by the Thing_implement() macro.
 	 */
-	const wchar_t *className;
+	const char32 *className;
 	ClassInfo parent;
 	long size;
 	Thing (* _new) ();   // objects have to be constructed via this function, because it calls C++ "new", which initializes the C++ class pointer
@@ -68,13 +72,13 @@ struct structClassInfo {
 	 */
 	long sequentialUniqueIdOfReadableClass;
 	/*
-	 * The following field is initialized by Thing_dummyObject(), whihc is used only rarely.
+	 * The following field is initialized by Thing_dummyObject(), which is used only rarely.
 	 */
 	Thing dummyObject;
 };
 
 #define Thing_declare(klas) \
-	typedef class struct##klas *klas; \
+	typedef struct struct##klas *klas; \
 	typedef _Thing_auto <struct##klas> auto##klas; \
 	extern ClassInfo class##klas
 
@@ -82,59 +86,67 @@ struct structClassInfo {
 	Thing_declare (klas); \
 	typedef struct##parentKlas klas##_Parent; \
 	extern struct structClassInfo theClassInfo_##klas; \
-	class struct##klas : public struct##parentKlas
+	struct struct##klas : public struct##parentKlas
 
 #define Thing_implement(klas,parentKlas,version) \
-	static Thing _##klas##_new () { return (Thing) new struct##klas; } \
-	struct structClassInfo theClassInfo_##klas = { L"" #klas, & theClassInfo_##parentKlas, sizeof (class struct##klas), _##klas##_new, version, 0, NULL }; \
+	static Thing _##klas##_new () { return new struct##klas; } \
+	struct structClassInfo theClassInfo_##klas = { U"" #klas, & theClassInfo_##parentKlas, sizeof (class struct##klas), _##klas##_new, version, 0, nullptr}; \
 	ClassInfo class##klas = & theClassInfo_##klas
 
 /*
  * Thing has no parent class, so instead of using the Thing_define macro
  * we write out the stuff that does exist.
  */
-typedef class structThing *Thing;
+typedef struct structThing *Thing;
 extern ClassInfo classThing;
 extern struct structClassInfo theClassInfo_Thing;
-class structThing {
-	public:
-		ClassInfo classInfo;   // the Praat class pointer (every object also has a C++ class pointer initialized by C++ "new")
-		wchar_t *name;
-		void * operator new (size_t size) { return Melder_calloc (char, size); }
-		void operator delete (void *ptr, size_t size) { (void) size; Melder_free (ptr); }
-	// new methods:
-		virtual void v_destroy () { Melder_free (name); };
-			/*
-			 * derived::v_destroy calls base::v_destroy at end
-			 */
-		virtual void v_info ();
-			/*
-			 * Implement as follows: call a set of MelderInfo_writeXXX describing your data.
-			 *
-			 * Thing::v_info writes object id, object name, and date;
-			 * derived::v_info often calls base::v_info at start and then writes information on the new data,
-			 * but a few ancestors can be skipped if their data have new meanings.
-			 */
-		virtual void v_checkConstraints () { };
-			/*
-			 * derived::v_checkConstraints typically calls base::v_checkConstraints at start
-			 */
-		virtual void v_nameChanged () { };
-			/*
-			 * derived::v_nameChanged may call base::_nameChanged at start, middle or end
-			 */
-		virtual void v_copyPreferencesToInstance () { };
-			/*
-			 * derived::v_copyPreferencesToInstance calls base::v_copyPreferencesToInstance at start
-			 */
+struct structThing {
+	ClassInfo classInfo;   // the Praat class pointer (every object also has a C++ class pointer initialized by C++ "new")
+	char32 *name;
+	void * operator new (size_t size) { return Melder_calloc (char, (int64) size); }
+	void operator delete (void *ptr, size_t /* size */) { Melder_free (ptr); }
+
+	/*
+	 * If a Thing has members of type autoThing,
+	 * then we want the destructors of autoThing to be called automatically whenever Thing is `delete`d.
+	 * For this to happen, it is necessary that every Thing itself has a destructor.
+	 * We therefore define a destructor here,
+	 * and we make it virtual to ensure that every subclass has its own automatic version.
+	 */
+	virtual ~structThing () { }
+
+	virtual void v_destroy () { Melder_free (name); };
+		/*
+		 * derived::v_destroy calls base::v_destroy at end
+		 */
+	virtual void v_info ();
+		/*
+		 * Implement as follows: call a set of MelderInfo_writeXXX describing your data.
+		 *
+		 * Thing::v_info writes object id, object name, and date;
+		 * derived::v_info often calls base::v_info at start and then writes information on the new data,
+		 * but a few ancestors can be skipped if their data have new meanings.
+		 */
+	virtual void v_checkConstraints () { };
+		/*
+		 * derived::v_checkConstraints typically calls base::v_checkConstraints at start
+		 */
+	virtual void v_nameChanged () { };
+		/*
+		 * derived::v_nameChanged may call base::_nameChanged at start, middle or end
+		 */
+	virtual void v_copyPreferencesToInstance () { };
+		/*
+		 * derived::v_copyPreferencesToInstance calls base::v_copyPreferencesToInstance at start
+		 */
 };
 
-#define forget(thing)  do { _Thing_forget (thing); thing = NULL; } while (false)
+#define forget(thing)  do { _Thing_forget (thing); thing = nullptr; } while (false)
 /*
 	Function:
 		free all memory associated with 'thing'.
 	Postcondition:
-		thing == NULL;
+		thing == nullptr;
 */
 #define forget_nozero(thing)  do { _Thing_forget_nozero (thing); delete thing; } while (false)
 /*
@@ -142,29 +154,29 @@ class structThing {
 		free all memory associated with 'thing'.
 */
 
-/* All functions with 'Thing me' as the first argument assume that it is not NULL. */
+/* All functions with 'Thing me' as the first argument assume that it is not null. */
 
-const wchar_t * Thing_className (Thing me);
+const char32 * Thing_className (Thing me);
 /* Return your class name. */
 
-bool Thing_member (Thing me, ClassInfo klas);
+bool Thing_isa (Thing me, ClassInfo klas);
 /*
 	return true if you are a 'klas',
 	i.e., if you are an object of the class 'klas' or of one of the classes derived from 'klas'.
-	E.g., Thing_member (object, classThing) will always return true.
+	E.g., Thing_isa (object, classThing) will always return true.
 */
 
-bool Thing_subclass (ClassInfo klas, ClassInfo ancestor);
+bool Thing_isSubclass (ClassInfo klas, ClassInfo ancestor);
 /*
 	return true if <klas> is a subclass of <ancestor>,
 	i.e., if <klas> equals <ancestor>, or if the parent class of <klas> is a subclass of <ancestor>.
-	E.g., Thing_subclass (classX, classThing) will always return true.
+	E.g., Thing_isSubclass (classX, classThing) will always return true.
 */
 
 void Thing_info (Thing me);
-void Thing_infoWithId (Thing me, unsigned long id);
+void Thing_infoWithIdAndFile (Thing me, unsigned long id, MelderFile file);
 
-#define Thing_new(Klas)  (Klas) _Thing_new (class##Klas)
+#define Thing_new(Klas)  static_cast<Klas> (Thing_newFromClass (class##Klas))
 /*
 	Function:
 		return a new object of class 'klas'.
@@ -173,7 +185,7 @@ void Thing_infoWithId (Thing me, unsigned long id);
 		other members are 0.
 */
 
-Any _Thing_new (ClassInfo klas);
+Thing Thing_newFromClass (ClassInfo klas);
 /*
 	Function:
 		return a new object of class 'klas'.
@@ -188,7 +200,7 @@ void Thing_recognizeClassesByName (ClassInfo readableClass, ...);
 		make Thing_classFromClassName () and Thing_newFromClassName ()
 		recognize a class from its name (a string).
 	Arguments:
-		as many classes as you want; finish with a NULL.
+		as many classes as you want; finish with a nullptr.
 		It is not an error if a class occurs more than once in the list.
 	Behaviour:
 		calling this routine more than once, each time for different classes,
@@ -200,14 +212,13 @@ void Thing_recognizeClassesByName (ClassInfo readableClass, ...);
 		or with Data_readText () or Data_readBinary () if the object is a Collection.
 		Calls to this routine should preferably be put in the beginning of main ().
 */
-void Thing_recognizeClassByOtherName (ClassInfo readableClass, const wchar_t *otherName);
-long Thing_listReadableClasses (void);
+void Thing_recognizeClassByOtherName (ClassInfo readableClass, const char32 *otherName);
+long Thing_listReadableClasses ();
 
-Any Thing_newFromClassNameA (const char *className);
-Any Thing_newFromClassName (const wchar_t *className);
+Thing Thing_newFromClassName (const char32 *className, int *p_formatVersion);
 /*
 	Function:
-		return a new object of class 'className', or NULL if the class name is not recognized.
+		return a new object of class 'className', or null if the class name is not recognized.
 	Postconditions:
 		result -> classInfo == class'className';
 		other members are 0.
@@ -215,27 +226,26 @@ Any Thing_newFromClassName (const wchar_t *className);
 		see Thing_classFromClassName.
 */
 
-ClassInfo Thing_classFromClassName (const wchar_t *className);
+ClassInfo Thing_classFromClassName (const char32 *className, int *formatVersion);
 /*
 	Function:
-		Return the class info table of class 'className', or NULL if it is not recognized.
+		Return the class info table of class 'className', or null if it is not recognized.
 		E.g. the value returned from Thing_classFromClassName (L"PietjePuk")
 		will be equal to classPietjePuk.
 	Side effect:
-		Sets the global variable Thing_version.
 		If 'className' equals L"PietjePuk 300", the value returned will be classPietjePuk,
-		and Thing_version will be set to 300.
+		and formatVersion (if not null) will be set to 300.
 */
 
 #define Thing_dummyObject(klas) \
 	((klas) _Thing_dummyObject (class##klas))
 Thing _Thing_dummyObject (ClassInfo classInfo);
 
-wchar_t * Thing_getName (Thing me);
-/* Return a pointer to your internal name (which can be NULL). */
-wchar_t * Thing_messageName (Thing me);
+char32 * Thing_getName (Thing me);
+/* Return a pointer to your internal name (which can be null). */
+char32 * Thing_messageName (Thing me);
 
-void Thing_setName (Thing me, const wchar_t *name);
+void Thing_setName (Thing me, const char32 *name /* cattable */);
 /*
 	Function:
 		remember that you are called 'name'.
@@ -245,7 +255,7 @@ void Thing_setName (Thing me, const wchar_t *name);
 
 #define Thing_cast(Klas,var,expr) \
 	Klas var = static_cast <Klas> (expr);   /* The compiler checks this. */ \
-	Melder_assert (var == NULL || Thing_member (var, class##Klas));
+	Melder_assert (! var || Thing_isa (var, class##Klas));
 
 void Thing_swap (Thing me, Thing thee);
 /*
@@ -265,38 +275,60 @@ void Thing_swap (Thing me, Thing thee);
 void _Thing_forget (Thing me);
 void _Thing_forget_nozero (Thing me);
 void * _Thing_check (Thing me, ClassInfo table, const char *fileName, int line);
-	/* Macros 'iam', 'thouart', 'heis'. */
 
 /* For debugging. */
 
-long Thing_getTotalNumberOfThings (void);
+long Thing_getTotalNumberOfThings ();
 /* This number is 0 initially, increments at every successful `new', and decrements at every `forget'. */
 
-extern long Thing_version;
-/* Set by Thing_classFromClassName. */
-
 template <class T>
 class _Thing_auto {
-	T *d_ptr;
+	T *ptr;
 public:
 	/*
+	 * The default constructor.
+	 * Things like
+	 *    autoPitch pitch;
+	 * should initialize the pointer to null.
+	 */
+	_Thing_auto () : ptr (nullptr) {
+		#if _Thing_auto_DEBUG
+			fprintf (stderr, "default constructor\n");
+		#endif
+	}
+	/*
 	 * Things like
 	 *    autoPitch pitch (Pitch_create (...));
 	 * and
 	 *    autoPitch pitch = Pitch_create (...);
 	 * should work.
 	 */
-	_Thing_auto (T *a_ptr) : d_ptr (a_ptr) { }
-	_Thing_auto () : d_ptr (NULL) { }
+	_Thing_auto (T *newPtr) : ptr (newPtr) {
+		#if _Thing_auto_DEBUG
+			if (our ptr)
+				fprintf (stderr, "constructor %p %s\n",
+					our ptr, Melder_peek32to8 (our ptr -> classInfo -> className));
+		#endif
+	}
 	/*
 	 * pitch should be destroyed when going out of scope,
 	 * both at the end of the try block and when a throw occurs.
 	 */
 	~_Thing_auto () {
-		if (d_ptr) forget (d_ptr);
+		#if _Thing_auto_DEBUG
+			fprintf (stderr, "destructor %p %s\n",
+				our ptr, our ptr ? Melder_peek32to8 (our ptr -> classInfo -> className) : "(class unknown)");
+		#endif
+		if (our ptr) {
+			_Thing_forget (our ptr);
+			our ptr = nullptr;
+		}
+	}
+	T* get () const {
+		return our ptr;
 	}
 	T* peek () const {
-		return d_ptr;
+		return our ptr;
 	}
 	/*
 	 * The expression
@@ -305,16 +337,15 @@ public:
 	 *    pitch -> xmin
 	 */
 	T* operator-> () const {   // as r-value
-		return d_ptr;
+		return our ptr;
 	}
 	T& operator* () const {   // as l-value
-		return *d_ptr;
+		return *our ptr;
 	}
 	/*
-	 * There are two ways to access the pointer; with and without transfer of ownership.
+	 * After construction, there are two ways to access the pointer: with and without transfer of ownership.
 	 *
 	 * Without transfer:
-	 *    autoPitch pitch = Sound_to_Pitch (...);
 	 *    Pitch_draw (pitch.peek());
 	 *
 	 * With transfer:
@@ -328,17 +359,20 @@ public:
 	 *    praat_new (pitch.transfer(), my name);
 	 */
 	T* transfer () {
-		T* temp = d_ptr;
-		d_ptr = NULL;   // make the pointer non-automatic again
+		T* temp = our ptr;
+		our ptr = nullptr;   // make the pointer non-automatic again
 		return temp;
 	}
-	//operator T* () { return d_ptr; }   // this way only if peek() and transfer() are the same, e.g. in case of reference counting
-	// template <class Y> Y* operator= (_Thing_auto<Y>& a) { }
+	#if 0
+		operator T* () {
+			return our ptr;
+		}
+	#endif
 	/*
 	 * An autoThing can be cloned. This can be used for giving ownership without losing ownership.
 	 */
 	T* clone () const {
-		return static_cast<T *> (Data_copy (d_ptr));
+		return static_cast<T *> (Data_copy (our ptr));
 	}
 	/*
 	 * Replacing a pointer in an existing autoThing should be an exceptional phenomenon,
@@ -346,23 +380,132 @@ public:
 	 * so that you can easily spot ugly places in your source code.
 	 * In order not to leak memory, the old object is destroyed.
 	 */
-	void reset (T* const ptr) {
-		if (d_ptr) forget (d_ptr);
-		d_ptr = ptr;
+	void reset (T* newPtr = nullptr) noexcept {
+		_Thing_forget (our ptr);
+		our ptr = newPtr;
+	}
+	void zero () {
+		our ptr = nullptr;
+	}
+	explicit operator bool () const {
+		return !! our ptr;
+	}
+	bool operator== (_Thing_auto<T> other) const noexcept {
+		return other. ptr == our ptr;
+	}
+	bool operator!= (_Thing_auto<T> other) const noexcept {
+		return other. ptr != our ptr;
 	}
-private:
 	/*
-	 * The compiler should prevent initializations like
+	 * The compiler should prevent initializations from _Thing_auto l-values, as in
 	 *    autoPitch pitch2 = pitch;
+	 * This is because the syntax of this statement is *copy* syntax,
+	 * but the semantics of this statement has to be, confusingly, *move* semantics
+	 * (i.e., pitch.ptr should be set to null),
+	 * because if the semantics were copy semantics instead,
+	 * a destructor would be called at some point for both pitch and pitch 2,
+	 * twice deleting the same object, which is a run-time error.
 	 */
-	template <class Y> _Thing_auto (_Thing_auto<Y> &);   // copy constructor
-	//_Thing_auto (const _Thing_auto &);
+	_Thing_auto<T> (const _Thing_auto<T>&) = delete;   // disable copy constructor from an l-value of class T*
+	template <class Y> _Thing_auto<T> (const _Thing_auto<Y>&) = delete;   // disable copy constructor from an l-value of a descendant class of T*
 	/*
-	 * The compiler should prevent assignments like
+	 * The compiler should prevent assignments from _Thing_auto l-values, as in
 	 *    pitch2 = pitch;
+	 * This is because the syntax of this statement is *copy* syntax,
+	 * but the semantics of this statement has to be, confusingly, *move* semantics
+	 * (i.e., pitch.ptr should be set to null),
+	 * because if the semantics were copy semantics instead,
+	 * a destructor would be called at some point for both pitch and pitch 2,
+	 * twice deleting the same object, which is a run-time error.
+	 */
+	_Thing_auto<T>& operator= (const _Thing_auto<T>&) = delete;   // disable copy assignment from an l-value of class T*
+	template <class Y> _Thing_auto<T>& operator= (const _Thing_auto<Y>&) = delete;   // disable copy assignment from an l-value of a descendant class of T*
+	/*
+	 * The compiler should treat initializations from _Thing_auto r-values, as in
+	 *    extern autoPitch Pitch_create (...);
+	 *    autoPitch pitch = Pitch_create (...);
+	 * as move constructors.
+	 */
+	_Thing_auto<T> (_Thing_auto<T>&& other) noexcept : ptr (other. ptr) {
+		#if _Thing_auto_DEBUG
+			if (our ptr)
+				fprintf (stderr, "move constructor %p from same class %s\n",
+					our ptr, Melder_peek32to8 (our ptr -> classInfo -> className));
+		#endif
+		other. ptr = nullptr;
+	}
+	template <class Y> _Thing_auto<T> (_Thing_auto<Y>&& other) noexcept : ptr (other.peek()) {
+		#if _Thing_auto_DEBUG
+			if (our ptr)
+				fprintf (stderr, "move constructor %p from other class %s\n",
+					our ptr, Melder_peek32to8 (our ptr -> classInfo -> className));
+		#endif
+		other.zero();
+	}
+	/*
+	 * The compiler should treat assignments from _Thing_auto r-values, as in
+	 *    extern autoPitch Pitch_create (...);
+	 *    autoPitch pitch;
+	 *    pitch = Pitch_create (...);
+	 * as move assignments.
+	 */
+	_Thing_auto<T>& operator= (_Thing_auto<T>&& other) noexcept {
+		if (other. ptr != our ptr) {
+			#if _Thing_auto_DEBUG
+				fprintf (stderr, "move assignment before %p from same class %s\n",
+					our ptr, our ptr ? Melder_peek32to8 (our ptr -> classInfo -> className) : "(class unknown)");
+			#endif
+			_Thing_forget (our ptr);
+			our ptr = other. ptr;
+			#if _Thing_auto_DEBUG
+				fprintf (stderr, "move assignment after %p from same class %s\n",
+					our ptr, our ptr ? Melder_peek32to8 (our ptr -> classInfo -> className) : "(class unknown)");
+			#endif
+			other. ptr = nullptr;
+		}
+		return *this;
+	}
+	template <class Y> _Thing_auto<T>& operator= (_Thing_auto<Y>&& other) noexcept {
+		if (other.peek() != our ptr) {
+			#if _Thing_auto_DEBUG
+				fprintf (stderr, "move assignment before %p from other class %s\n",
+					our ptr, our ptr ? Melder_peek32to8 (our ptr -> classInfo -> className) : "(class unknown)");
+			#endif
+			_Thing_forget (our ptr);
+			our ptr = other.peek();
+			#if _Thing_auto_DEBUG
+				fprintf (stderr, "move assignment after %p from other class %s\n",
+					our ptr, our ptr ? Melder_peek32to8 (our ptr -> classInfo -> className) : "(class unknown)");
+			#endif
+			other.zero();
+		}
+		return *this;
+	}
+	/*
+	 * Move semantics from l-values can be achieved with move syntax:
+	 *    autoPitch pitch2 = pitch.move();   // calls the move constructor and therefore nullifies pitch
+	 *
+	 *    pitch2 = pitch.move();   // performs move assignment and therefore nullifies pitch
 	 */
-	_Thing_auto& operator= (const _Thing_auto&);   // copy assignment
-	//template <class Y> _Thing_auto& operator= (const _Thing_auto<Y>&);
+	_Thing_auto<T>&& move () noexcept { return static_cast <_Thing_auto<T>&&> (*this); }
+	/*
+	 * Returning _Thing_auto from a function works as hoped for:
+	 *    autoPitch Sound_to_Pitch (Sound me) {
+	 *       autoPitch thee = Pitch_create (...);
+	 *       ...
+	 *       return thee;
+	 *    }
+	 *    autoPitch pitch = Sound_to_Pitch (sound);
+	 * returns a moved `thee` in `pitch`. This works because return values from automatic (i.e. non-static) variables are r-values.
+	 *
+	 * In function arguments, transfer of ownership works only explicitly:
+	 *    extern void Collection_addItem_transfer (Collection me, autoDaata item);
+	 *    autoPitch pitch = Pitch_create (...);
+	 *    Collection_addItem_transfer (collection, pitch.move());   // compiler error if you don't call move()
+	 */
+	template <class Y> _Thing_auto<Y> static_cast_move () {
+		return _Thing_auto<Y> (static_cast<Y*> (our transfer()));
+	}
 };
 
 template <class T>
@@ -375,7 +518,7 @@ public:
 	}
 	autoThingVector (T *ptr, long from, long to) : d_ptr (ptr), d_from (from), d_to (to) {
 	}
-	autoThingVector () : d_ptr (NULL), d_from (1), d_to (0) {
+	autoThingVector () : d_ptr (nullptr), d_from (1), d_to (0) {
 	}
 	~autoThingVector<T> () {
 		if (d_ptr) {
@@ -392,7 +535,7 @@ public:
 	}
 	T* transfer () {
 		T* temp = d_ptr;
-		d_ptr = NULL;   // make the pointer non-automatic again
+		d_ptr = nullptr;   // make the pointer non-automatic again
 		return temp;
 	}
 	void reset (long from, long to) {
@@ -400,9 +543,9 @@ public:
 			for (long i = d_from; i <= d_to; i ++)
 				forget (d_ptr [i]);
 			NUMvector_free (sizeof (T), d_ptr, d_from);
-			d_ptr = NULL;
+			d_ptr = nullptr;
 		}
-		d_from = from;   // this assignment is safe, because d_ptr is NULL
+		d_from = from;   // this assignment is safe, because d_ptr is null
 		d_to = to;
 		d_ptr = static_cast <T*> (NUMvector (sizeof (T), from, to));
 	}
diff --git a/sys/Ui.cpp b/sys/Ui.cpp
index ea26458..c8d1fd0 100644
--- a/sys/Ui.cpp
+++ b/sys/Ui.cpp
@@ -1,6 +1,6 @@
 /* Ui.cpp
  *
- * Copyright (C) 1992-2012,2013 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 #include "Collection.h"
 #include "UiP.h"
 #include "Editor.h"
-#include "Graphics.h"   /* colours. */
+#include "Graphics.h"   // colours
 
 /***** class UiField: the things that have values in an UiForm dialog *****/
 
@@ -59,23 +59,21 @@ void structUiField :: v_destroy () {
 	UiField_Parent :: v_destroy ();
 }
 
-static UiField UiField_create (int type, const wchar_t *name) {
+static UiField UiField_create (int type, const char32 *name) {
 	autoUiField me = Thing_new (UiField);
-	wchar_t shortName [101], *p;
+	char32 shortName [101], *p;
 	my type = type;
-	my formLabel = Melder_wcsdup (name);
-	wcscpy (shortName, name);
+	my formLabel = Melder_dup (name);
+	str32cpy (shortName, name);
 	/*
 	 * Strip parentheses and colon off parameter name.
 	 */
-	//p = wcschr (shortName, ':');   /* ppgb 20101015: no idea why this used to be here */
-	//if (p) *p = '\0';
-	if ((p = (wchar_t *) wcschr (shortName, '(')) != NULL) {
-		*p = '\0';
-		if (p - shortName > 0 && p [-1] == ' ') p [-1] = '\0';
+	if ((p = (char32 *) str32chr (shortName, U'(')) != NULL) {
+		*p = U'\0';
+		if (p - shortName > 0 && p [-1] == U' ') p [-1] = U'\0';
 	}
 	p = shortName;
-	if (*p != '\0' && p [wcslen (p) - 1] == ':') p [wcslen (p) - 1] = '\0';
+	if (*p != U'\0' && p [str32len (p) - 1] == U':') p [str32len (p) - 1] = U'\0';
 	Thing_setName (me.peek(), shortName);
 	return me.transfer();
 }
@@ -83,36 +81,32 @@ static UiField UiField_create (int type, const wchar_t *name) {
 /***** class UiOption: radio buttons and menu options *****/
 
 Thing_define (UiOption, Thing) {
-	// new data:
-	public:
-		GuiRadioButton radioButton;
-		GuiObject menuItem;
+	GuiRadioButton radioButton;
+	GuiObject menuItem;
 };
 
 Thing_implement (UiOption, Thing, 0);
 
-static Any UiOption_create (const wchar_t *label) {
+static UiOption UiOption_create (const char32 *label) {
 	UiOption me = Thing_new (UiOption);
 	Thing_setName (me, label);
 	return me;
 }
 
-Any UiRadio_addButton (I, const wchar_t *label) {
+Any UiRadio_addButton (I, const char32 *label) {
 	iam (UiField);
-	UiOption thee;
 	if (me == NULL) return NULL;
 	Melder_assert (my type == UI_RADIO || my type == UI_OPTIONMENU);
-	thee = static_cast <UiOption> (UiOption_create (label));
+	UiOption thee = UiOption_create (label);
 	Collection_addItem (my options, thee);
 	return thee;
 }
 
-Any UiOptionMenu_addButton (I, const wchar_t *label) {
+Any UiOptionMenu_addButton (I, const char32 *label) {
 	iam (UiField);
-	UiOption thee;
 	if (me == NULL) return NULL;
 	Melder_assert (my type == UI_RADIO || my type == UI_OPTIONMENU);
-	thee = static_cast <UiOption> (UiOption_create (label));
+	UiOption thee = UiOption_create (label);
 	Collection_addItem (my options, thee);
 	return thee;
 }
@@ -124,56 +118,56 @@ static void UiField_setDefault (UiField me) {
 		case UI_REAL: case UI_REAL_OR_UNDEFINED: case UI_POSITIVE: case UI_INTEGER: case UI_NATURAL:
 			case UI_WORD: case UI_SENTENCE: case UI_COLOUR: case UI_CHANNEL: case UI_TEXT:
 		{
-			my text -> f_setString (my stringDefaultValue);
+			GuiText_setString (my text, my stringDefaultValue);
 		} break; case UI_BOOLEAN: {
-			my checkButton -> f_setValue (my integerDefaultValue);
+			GuiCheckButton_setValue (my checkButton, my integerDefaultValue);
 		} break; case UI_RADIO: {
 			for (int i = 1; i <= my options -> size; i ++) {
 				if (i == my integerDefaultValue) {
 					UiOption b = static_cast <UiOption> (my options -> item [i]);
-					b -> radioButton -> f_set ();
+					GuiRadioButton_set (b -> radioButton);
 				}
 			}
 		} break; case UI_OPTIONMENU: {
-			my optionMenu -> f_setValue (my integerDefaultValue);
+			GuiOptionMenu_setValue (my optionMenu, my integerDefaultValue);
 		} break; case UI_LIST: {
-			my list -> f_selectItem (my integerDefaultValue);
+			GuiList_selectItem (my list, my integerDefaultValue);
 		}
 	}
 }
 
-static int colourToValue (UiField me, wchar_t *string) {
-	wchar_t *p = string;
-	while (*p == ' ' || *p == '\t') p ++;
-	*p = tolower (*p);
-	int first = *p;
-	if (first == '{') {
+static int colourToValue (UiField me, char32 *string) {
+	char32 *p = string;
+	while (*p == U' ' || *p == U'\t') p ++;
+	*p = (char32) tolower ((int) *p);
+	char32 first = *p;
+	if (first == U'{') {
 		my colourValue. red = Melder_atof (++ p);
-		p = (wchar_t *) wcschr (p, ',');
+		p = str32chr (p, U',');
 		if (p == NULL) return 0;
 		my colourValue. green = Melder_atof (++ p);
-		p = (wchar_t *) wcschr (p, ',');
+		p = str32chr (p, U',');
 		if (p == NULL) return 0;
 		my colourValue. blue = Melder_atof (++ p);
 	} else {
-		*p = tolower (*p);
-		if (wcsequ (p, L"black")) my colourValue = Graphics_BLACK;
-		else if (wcsequ (p, L"white")) my colourValue = Graphics_WHITE;
-		else if (wcsequ (p, L"red")) my colourValue = Graphics_RED;
-		else if (wcsequ (p, L"green")) my colourValue = Graphics_GREEN;
-		else if (wcsequ (p, L"blue")) my colourValue = Graphics_BLUE;
-		else if (wcsequ (p, L"yellow")) my colourValue = Graphics_YELLOW;
-		else if (wcsequ (p, L"cyan")) my colourValue = Graphics_CYAN;
-		else if (wcsequ (p, L"magenta")) my colourValue = Graphics_MAGENTA;
-		else if (wcsequ (p, L"maroon")) my colourValue = Graphics_MAROON;
-		else if (wcsequ (p, L"lime")) my colourValue = Graphics_LIME;
-		else if (wcsequ (p, L"navy")) my colourValue = Graphics_NAVY;
-		else if (wcsequ (p, L"teal")) my colourValue = Graphics_TEAL;
-		else if (wcsequ (p, L"purple")) my colourValue = Graphics_PURPLE;
-		else if (wcsequ (p, L"olive")) my colourValue = Graphics_OLIVE;
-		else if (wcsequ (p, L"pink")) my colourValue = Graphics_PINK;
-		else if (wcsequ (p, L"silver")) my colourValue = Graphics_SILVER;
-		else if (wcsequ (p, L"grey")) my colourValue = Graphics_GREY;
+		*p = (char32) tolower ((int) *p);
+		if (str32equ (p, U"black")) my colourValue = Graphics_BLACK;
+		else if (str32equ (p, U"white")) my colourValue = Graphics_WHITE;
+		else if (str32equ (p, U"red")) my colourValue = Graphics_RED;
+		else if (str32equ (p, U"green")) my colourValue = Graphics_GREEN;
+		else if (str32equ (p, U"blue")) my colourValue = Graphics_BLUE;
+		else if (str32equ (p, U"yellow")) my colourValue = Graphics_YELLOW;
+		else if (str32equ (p, U"cyan")) my colourValue = Graphics_CYAN;
+		else if (str32equ (p, U"magenta")) my colourValue = Graphics_MAGENTA;
+		else if (str32equ (p, U"maroon")) my colourValue = Graphics_MAROON;
+		else if (str32equ (p, U"lime")) my colourValue = Graphics_LIME;
+		else if (str32equ (p, U"navy")) my colourValue = Graphics_NAVY;
+		else if (str32equ (p, U"teal")) my colourValue = Graphics_TEAL;
+		else if (str32equ (p, U"purple")) my colourValue = Graphics_PURPLE;
+		else if (str32equ (p, U"olive")) my colourValue = Graphics_OLIVE;
+		else if (str32equ (p, U"pink")) my colourValue = Graphics_PINK;
+		else if (str32equ (p, U"silver")) my colourValue = Graphics_SILVER;
+		else if (str32equ (p, U"grey")) my colourValue = Graphics_GREY;
 		else { *p = first; return 0; }
 		*p = first;
 	}
@@ -183,85 +177,85 @@ static int colourToValue (UiField me, wchar_t *string) {
 static void UiField_widgetToValue (UiField me) {
 	switch (my type) {
 		case UI_REAL: case UI_REAL_OR_UNDEFINED: case UI_POSITIVE: {
-			autostring dirty = my text -> f_getString ();   // the text as typed by the user
+			autostring32 dirty = GuiText_getString (my text);   // the text as typed by the user
 			Interpreter_numericExpression (NULL, dirty.peek(), & my realValue);
 			/*
 			 * Put a clean version of the new value in the form.
 			 * If the value is equal to the default value, make sure that any default comments are included.
 			 */
 			if (my realValue == Melder_atof (my stringDefaultValue)) {
-				my text -> f_setString (my stringDefaultValue);
+				GuiText_setString (my text, my stringDefaultValue);
 			} else {
-				wchar_t clean [40];
-				wcscpy (clean, Melder_double (my realValue));
+				char32 clean [40];
+				str32cpy (clean, Melder_double (my realValue));
 				/*
 				 * If the default value is overtly real (rather than integer), the shown value must be overtly real as well.
 				 */
-				if ((wcschr (my stringDefaultValue, '.') || wcschr (my stringDefaultValue, 'e')) &&
-					! (wcschr (clean, '.') || wcschr (clean, 'e')))
+				if ((str32chr (my stringDefaultValue, U'.') || str32chr (my stringDefaultValue, U'e')) &&
+					! (str32chr (clean, U'.') || str32chr (clean, U'e')))
 				{
-					wcscat (clean, L".0");
+					str32cpy (clean + str32len (clean), U".0");
 				}
-				my text -> f_setString (clean);
+				GuiText_setString (my text, clean);
 			}
 			if (my realValue == NUMundefined && my type != UI_REAL_OR_UNDEFINED)
-				Melder_throw (L_LEFT_DOUBLE_QUOTE, my name, L_RIGHT_DOUBLE_QUOTE L" has the value \"undefined\".");
+				Melder_throw (U_LEFT_DOUBLE_QUOTE, my name, U_RIGHT_DOUBLE_QUOTE U" has the value \"undefined\".");
 			if (my type == UI_POSITIVE && my realValue <= 0.0)
-				Melder_throw (L_LEFT_DOUBLE_QUOTE, my name, L_RIGHT_DOUBLE_QUOTE L" must be greater than 0.0.");
+				Melder_throw (U_LEFT_DOUBLE_QUOTE, my name, U_RIGHT_DOUBLE_QUOTE U" must be greater than 0.0.");
 		} break; case UI_INTEGER: case UI_NATURAL: case UI_CHANNEL: {
-			autostring dirty = my text -> f_getString ();
-			if (my type == UI_CHANNEL && (wcsequ (dirty.peek(), L"Left") || wcsequ (dirty.peek(), L"Mono"))) {
+			autostring32 dirty = GuiText_getString (my text);
+			if (my type == UI_CHANNEL && (str32equ (dirty.peek(), U"Left") || str32equ (dirty.peek(), U"Mono"))) {
 				my integerValue = 1;
-			} else if (my type == UI_CHANNEL && (wcsequ (dirty.peek(), L"Right") || wcsequ (dirty.peek(), L"Stereo"))) {
+			} else if (my type == UI_CHANNEL && (str32equ (dirty.peek(), U"Right") || str32equ (dirty.peek(), U"Stereo"))) {
 				my integerValue = 2;
 			} else {
 				double realValue;
 				Interpreter_numericExpression (NULL, dirty.peek(), & realValue);
-				my integerValue = floor (realValue + 0.5);
+				my integerValue = lround (realValue);
 			}
-			if (my integerValue == wcstol (my stringDefaultValue, NULL, 10)) {
-				my text -> f_setString (my stringDefaultValue);
+			if (my integerValue == Melder_atoi (my stringDefaultValue)) {
+				GuiText_setString (my text, my stringDefaultValue);
 			} else {
-				my text -> f_setString (Melder_integer (my integerValue));
+				GuiText_setString (my text, Melder_integer (my integerValue));
 			}
 			if (my type == UI_NATURAL && my integerValue < 1)
-				Melder_throw (L_LEFT_DOUBLE_QUOTE, my name, L_RIGHT_DOUBLE_QUOTE L" must be a positive whole number.");
+				Melder_throw (U_LEFT_DOUBLE_QUOTE, my name, U_RIGHT_DOUBLE_QUOTE U" must be a positive whole number.");
 		} break; case UI_WORD: {
 			Melder_free (my stringValue);
-			my stringValue = my text -> f_getString ();
-			wchar_t *p = my stringValue;
-			while (*p != '\0') { if (*p == ' ' || *p == '\t') *p = '\0'; p ++; }
-			my text -> f_setString (my stringValue);
+			my stringValue = GuiText_getString (my text);
+			char32 *p = my stringValue;
+			while (*p != '\0') { if (*p == U' ' || *p == U'\t') *p = U'\0'; p ++; }
+			GuiText_setString (my text, my stringValue);
 		} break; case UI_SENTENCE: case UI_TEXT: {
 			Melder_free (my stringValue);
-			my stringValue = my text -> f_getString ();
+			my stringValue = GuiText_getString (my text);
 		} break; case UI_BOOLEAN: {
-			my integerValue = my checkButton -> f_getValue ();
+			my integerValue = GuiCheckButton_getValue (my checkButton);
 		} break; case UI_RADIO: {
 			my integerValue = 0;
 			for (int i = 1; i <= my options -> size; i ++) {
 				UiOption b = static_cast <UiOption> (my options -> item [i]);
-				if (b -> radioButton -> f_getValue ())
+				if (GuiRadioButton_getValue (b -> radioButton))
 					my integerValue = i;
 			}
 			if (my integerValue == 0)
-				Melder_throw ("No option chosen for " L_LEFT_DOUBLE_QUOTE, my name, L_RIGHT_DOUBLE_QUOTE ".");
+				Melder_throw (U"No option chosen for " U_LEFT_DOUBLE_QUOTE, my name, U_RIGHT_DOUBLE_QUOTE U".");
 		} break; case UI_OPTIONMENU: {
-			my integerValue = my optionMenu -> f_getValue ();
+			my integerValue = GuiOptionMenu_getValue (my optionMenu);
 			if (my integerValue == 0)
-				Melder_throw ("No option chosen for " L_LEFT_DOUBLE_QUOTE, my name, L_RIGHT_DOUBLE_QUOTE ".");
+				Melder_throw (U"No option chosen for " U_LEFT_DOUBLE_QUOTE, my name, U_RIGHT_DOUBLE_QUOTE U".");
 		} break; case UI_LIST: {
-			long numberOfSelected, *selected = my list -> f_getSelectedPositions (& numberOfSelected);   // BUG memory
+			long numberOfSelected, *selected = GuiList_getSelectedPositions (my list, & numberOfSelected);   // BUG memory
 			if (selected == NULL) {
-				Melder_warning (L"No items selected.");
+				Melder_warning (U"No items selected.");
 				my integerValue = 1;
 			} else {
-				if (numberOfSelected > 1) Melder_warning (L"More than one item selected.");
+				if (numberOfSelected > 1) Melder_warning (U"More than one item selected.");
 				my integerValue = selected [1];
 				NUMvector_free <long> (selected, 1);
 			}
 		} break; case UI_COLOUR: {
-			autostring string = my text -> f_getString ();
+			autostring32 string = GuiText_getString (my text);
 			if (colourToValue (me, string.peek())) {
 				// do nothing
 			} else {
@@ -272,45 +266,45 @@ static void UiField_widgetToValue (UiField me) {
 	}
 }
 
-static void UiField_stringToValue (UiField me, const wchar_t *string, Interpreter interpreter) {
+static void UiField_stringToValue (UiField me, const char32 *string, Interpreter interpreter) {
 	switch (my type) {
 		case UI_REAL: case UI_REAL_OR_UNDEFINED: case UI_POSITIVE: {
-			if (wcsspn (string, L" \t") == wcslen (string))
-				Melder_throw (L"Argument `", my name, L"' empty.");
+			if (str32spn (string, U" \t") == str32len (string))
+				Melder_throw (U"Argument “", my name, U"” empty.");
 			Interpreter_numericExpression (interpreter, string, & my realValue);
 			if (my realValue == NUMundefined && my type != UI_REAL_OR_UNDEFINED)
-				Melder_throw (L"\"", my name, "\" has the value \"undefined\".");
+				Melder_throw (U"\"", my name, U"\" has the value \"undefined\".");
 			if (my type == UI_POSITIVE && my realValue <= 0.0)
-				Melder_throw ("\"", my name, "\" must be greater than 0.");
+				Melder_throw (U"\"", my name, U"\" must be greater than 0.");
 		} break; case UI_INTEGER: case UI_NATURAL: case UI_CHANNEL: {
-			if (wcsspn (string, L" \t") == wcslen (string))
-				Melder_throw ("Argument \"", my name, "\" empty.");
-			if (my type == UI_CHANNEL && (wcsequ (string, L"All") || wcsequ (string, L"Average"))) {
+			if (str32spn (string, U" \t") == str32len (string))
+				Melder_throw (U"Argument “", my name, U"” empty.");
+			if (my type == UI_CHANNEL && (str32equ (string, U"All") || str32equ (string, U"Average"))) {
 				my integerValue = 0;
-			} else if (my type == UI_CHANNEL && (wcsequ (string, L"Left") || wcsequ (string, L"Mono"))) {
+			} else if (my type == UI_CHANNEL && (str32equ (string, U"Left") || str32equ (string, U"Mono"))) {
 				my integerValue = 1;
-			} else if (my type == UI_CHANNEL && (wcsequ (string, L"Right") || wcsequ (string, L"Stereo"))) {
+			} else if (my type == UI_CHANNEL && (str32equ (string, U"Right") || str32equ (string, U"Stereo"))) {
 				my integerValue = 2;
 			} else {
 				double realValue;
 				Interpreter_numericExpression (interpreter, string, & realValue);
-				my integerValue = floor (realValue + 0.5);
+				my integerValue = lround (realValue);
 			}
 			if (my type == UI_NATURAL && my integerValue < 1)
-				Melder_throw ("\"", my name, "\" must be a positive whole number.");
+				Melder_throw (U"\"", my name, U"\" must be a positive whole number.");
 		} break; case UI_WORD: case UI_SENTENCE: case UI_TEXT: {
 			Melder_free (my stringValue);
-			my stringValue = Melder_wcsdup_f (string);
+			my stringValue = Melder_dup_f (string);
 		} break; case UI_BOOLEAN: {
 			if (! string [0])
-				Melder_throw ("Empty argument for toggle button.");
-			my integerValue = string [0] == '1' || string [0] == 'y' || string [0] == 'Y' ||
-				string [0] == 't' || string [0] == 'T';
+				Melder_throw (U"Empty argument for toggle button.");
+			my integerValue = string [0] == U'1' || string [0] == U'y' || string [0] == U'Y' ||
+				string [0] == U't' || string [0] == U'T';
 		} break; case UI_RADIO: case UI_OPTIONMENU: {
 			my integerValue = 0;
 			for (int i = 1; i <= my options -> size; i ++) {
 				UiOption b = static_cast <UiOption> (my options -> item [i]);
-				if (wcsequ (string, b -> name))
+				if (str32equ (string, b -> name))
 					my integerValue = i;
 			}
 			if (my integerValue == 0) {
@@ -319,26 +313,26 @@ static void UiField_stringToValue (UiField me, const wchar_t *string, Interprete
 				 */
 				for (int i = 1; i <= my options -> size; i ++) {
 					UiOption b = static_cast <UiOption> (my options -> item [i]);
-					wchar_t name2 [100];
-					wcscpy (name2, b -> name);
-					if (islower (name2 [0])) name2 [0] = toupper (name2 [0]);
-					else if (isupper (name2 [0])) name2 [0] = tolower (name2 [0]);
-					if (wcsequ (string, name2))
+					char32 name2 [100];
+					str32cpy (name2, b -> name);
+					if (islower ((int) name2 [0])) name2 [0] = (char32) toupper ((int) name2 [0]);
+					else if (isupper ((int) name2 [0])) name2 [0] = (char32) tolower ((int) name2 [0]);
+					if (str32equ (string, name2))
 						my integerValue = i;
 				}
 			}
 			if (my integerValue == 0) {
-				Melder_throw ("Field \"", my name, "\" cannot have the value \"", string, "\".");
+				Melder_throw (U"Field \"", my name, U"\" must not have the value \"", string, U"\".");
 			}
 		} break; case UI_LIST: {
 			long i = 1;
 			for (; i <= my numberOfStrings; i ++)
-				if (wcsequ (string, my strings [i])) break;
+				if (str32equ (string, my strings [i])) break;
 			if (i > my numberOfStrings)
-				Melder_throw ("Field \"", my name, "\" cannot have the value \"", string, "\".");
+				Melder_throw (U"Field \"", my name, U"\" must not have the value \"", string, U"\".");
 			my integerValue = i;
 		} break; case UI_COLOUR: {
-			autostring string2 = Melder_wcsdup_f (string);
+			autostring32 string2 = Melder_dup_f (string);
 			if (colourToValue (me, string2.peek())) {
 				/* OK */
 			} else {
@@ -347,11 +341,11 @@ static void UiField_stringToValue (UiField me, const wchar_t *string, Interprete
 					my colourValue. green = my colourValue. blue = my colourValue. red;
 				} catch (MelderError) {
 					Melder_clearError ();
-					Melder_throw ("Cannot compute a colour from \"", string2.peek(), "\".");
+					Melder_throw (U"Cannot compute a colour from \"", string2.peek(), U"\".");
 				}
 			}
 		} break; default: {
-			Melder_throw ("Unknown field type ", my type, ".");
+			Melder_throw (U"Unknown field type ", my type, U".");
 		}
 	}
 }
@@ -359,26 +353,26 @@ static void UiField_stringToValue (UiField me, const wchar_t *string, Interprete
 /***** History mechanism. *****/
 
 static MelderString theHistory = { 0 };
-void UiHistory_write (const wchar_t *string) { MelderString_append (& theHistory, string); }
-void UiHistory_write_expandQuotes (const wchar_t *string) {
+void UiHistory_write (const char32 *string) { MelderString_append (& theHistory, string); }
+void UiHistory_write_expandQuotes (const char32 *string) {
 	if (string == NULL) return;
-	for (const wchar_t *p = & string [0]; *p != '\0'; p ++) {
-		if (*p == '\"') MelderString_append (& theHistory, L"\"\""); else MelderString_appendCharacter (& theHistory, *p);
+	for (const char32 *p = & string [0]; *p != U'\0'; p ++) {
+		if (*p == U'\"') MelderString_append (& theHistory, U"\"\""); else MelderString_appendCharacter (& theHistory, *p);
 	}
 }
-void UiHistory_write_colonize (const wchar_t *string) {
+void UiHistory_write_colonize (const char32 *string) {
 	if (string == NULL) return;
-	for (const wchar_t *p = & string [0]; *p != '\0'; p ++) {
-		if (*p == '.' && p [1] == '.' && p [2] == '.') {
-			MelderString_append (& theHistory, L":");
+	for (const char32 *p = & string [0]; *p != U'\0'; p ++) {
+		if (*p == U'.' && p [1] == U'.' && p [2] == U'.') {
+			MelderString_append (& theHistory, U":");
 			p += 2;
 		} else {
 			MelderString_appendCharacter (& theHistory, *p);
 		}
 	}
 }
-wchar_t *UiHistory_get (void) { return theHistory.string; }
-void UiHistory_clear (void) { MelderString_empty (& theHistory); }
+char32 *UiHistory_get () { return theHistory.string; }
+void UiHistory_clear () { MelderString_empty (& theHistory); }
 
 /***** class UiForm: dialog windows *****/
 
@@ -396,7 +390,7 @@ void structUiForm :: v_destroy () {
 	for (int ifield = 1; ifield <= numberOfFields; ifield ++)
 		forget (field [ifield]);
 	if (d_dialogForm) {
-		trace ("invoking button title %ls", invokingButtonTitle);
+		trace (U"invoking button title ", invokingButtonTitle);
 		GuiObject_destroy (d_dialogForm -> d_widget);   // BUG: make sure this destroys the shell
 	}
 	Melder_free (invokingButtonTitle);
@@ -404,8 +398,7 @@ void structUiForm :: v_destroy () {
 	UiForm_Parent :: v_destroy ();
 }
 
-static void gui_button_cb_revert (I, GuiButtonEvent event) {
-	(void) event;
+static void gui_button_cb_revert (I, GuiButtonEvent /* event */) {
 	iam (UiForm);
 	for (int ifield = 1; ifield <= my numberOfFields; ifield ++)
 		UiField_setDefault (my field [ifield]);
@@ -414,46 +407,44 @@ static void gui_button_cb_revert (I, GuiButtonEvent event) {
 static void gui_dialog_cb_close (I) {
 	iam (UiForm);
 	if (my cancelCallback) my cancelCallback (me, my buttonClosure);
-	my d_dialogForm -> f_hide ();
+	GuiThing_hide (my d_dialogForm);
 	if (my destroyWhenUnmanaged) forget (me);
 }
-static void gui_button_cb_cancel (I, GuiButtonEvent event) {
-	(void) event;
+static void gui_button_cb_cancel (I, GuiButtonEvent /* event */) {
 	iam (UiForm);
 	if (my cancelCallback) my cancelCallback (me, my buttonClosure);
-	my d_dialogForm -> f_hide ();
+	GuiThing_hide (my d_dialogForm);
 	if (my destroyWhenUnmanaged) forget (me);
 }
 
-void UiForm_widgetsToValues (I) {
-	iam (UiForm);
+void UiForm_widgetsToValues (UiForm me) {
 	try {
 		for (int ifield = 1; ifield <= my numberOfFields; ifield ++)
 			UiField_widgetToValue (my field [ifield]);
 	} catch (MelderError) {
-		Melder_throw ("Please correct command window " L_LEFT_DOUBLE_QUOTE, my name, L_RIGHT_DOUBLE_QUOTE " or cancel.");
+		Melder_throw (U"Please correct command window " U_LEFT_DOUBLE_QUOTE, my name, U_RIGHT_DOUBLE_QUOTE U" or cancel.");
 	}
 }
 
-static void UiForm_okOrApply (I, GuiButton button, int hide) {
-	iam (UiForm);
+static void UiForm_okOrApply (UiForm me, GuiButton button, int hide) {
 	if (my allowExecutionHook && ! my allowExecutionHook (my allowExecutionClosure)) {
-		Melder_error_ ("Cannot execute command window " L_LEFT_DOUBLE_QUOTE, my name, L_RIGHT_DOUBLE_QUOTE L".");
-		Melder_flushError (NULL);
+		Melder_flushError (U"Cannot execute command window " U_LEFT_DOUBLE_QUOTE, my name, U_RIGHT_DOUBLE_QUOTE U".");
 		return;
 	}
 	try {
 		UiForm_widgetsToValues (me);
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 		return;
 	}
-	if (my okButton) my okButton -> f_setSensitive (false);
-	for (int i = 1; i <= my numberOfContinueButtons; i ++) if (my continueButtons [i]) my continueButtons [i] -> f_setSensitive (false);
-	if (my applyButton)  my applyButton  -> f_setSensitive (false);
-	if (my cancelButton) my cancelButton -> f_setSensitive (false);
-	if (my revertButton) my revertButton -> f_setSensitive (false);
-	if (my helpButton)   my helpButton   -> f_setSensitive (false);
+	if (my okButton) GuiThing_setSensitive (my okButton, false);
+	for (int i = 1; i <= my numberOfContinueButtons; i ++)
+		if (my continueButtons [i])
+			GuiThing_setSensitive (my continueButtons [i], false);
+	if (my applyButton)  GuiThing_setSensitive (my applyButton,  false);
+	if (my cancelButton) GuiThing_setSensitive (my cancelButton, false);
+	if (my revertButton) GuiThing_setSensitive (my revertButton, false);
+	if (my helpButton)   GuiThing_setSensitive (my helpButton,   false);
 	#if motif
 	XmUpdateDisplay (my d_dialogForm -> d_widget);
 	#endif
@@ -473,7 +464,7 @@ static void UiForm_okOrApply (I, GuiButton button, int hide) {
 		 * Write everything to history. Before destruction!
 		 */
 		if (! my isPauseForm) {
-			UiHistory_write (L"\n");
+			UiHistory_write (U"\n");
 			UiHistory_write_colonize (my invokingButtonTitle);
 			int size = my numberOfFields;
 			while (size >= 1 && my field [size] -> type == UI_LABEL)
@@ -483,36 +474,36 @@ static void UiForm_okOrApply (I, GuiButton button, int hide) {
 				UiField field = my field [ifield];
 				switch (field -> type) {
 					case UI_REAL: case UI_REAL_OR_UNDEFINED: case UI_POSITIVE: {
-						UiHistory_write (next -- ? L", " : L" ");
+						UiHistory_write (next -- ? U", " : U" ");
 						UiHistory_write (Melder_double (field -> realValue));
 					} break; case UI_INTEGER: case UI_NATURAL: case UI_CHANNEL: {
-						UiHistory_write (next -- ? L", " : L" ");
+						UiHistory_write (next -- ? U", " : U" ");
 						UiHistory_write (Melder_integer (field -> integerValue));
 					} break; case UI_WORD: case UI_SENTENCE: case UI_TEXT: {
-						UiHistory_write (next -- ? L", \"" : L" \"");
+						UiHistory_write (next -- ? U", \"" : U" \"");
 						UiHistory_write_expandQuotes (field -> stringValue);
-						UiHistory_write (L"\"");
+						UiHistory_write (U"\"");
 					} break; case UI_BOOLEAN: {
-						UiHistory_write (field -> integerValue ? (next -- ? L", \"yes\"" : L" \"yes\"") : (next -- ? L", \"no\"" : L" \"no\""));
+						UiHistory_write (field -> integerValue ? (next -- ? U", \"yes\"" : U" \"yes\"") : (next -- ? U", \"no\"" : U" \"no\""));
 					} break; case UI_RADIO: case UI_OPTIONMENU: {
 						UiOption b = static_cast <UiOption> (field -> options -> item [field -> integerValue]);
-						UiHistory_write (next -- ? L", \"" : L" \"");
+						UiHistory_write (next -- ? U", \"" : U" \"");
 						UiHistory_write_expandQuotes (b -> name);
-						UiHistory_write (L"\"");
+						UiHistory_write (U"\"");
 					} break; case UI_LIST: {
-						UiHistory_write (next -- ? L", \"" : L" \"");
+						UiHistory_write (next -- ? U", \"" : U" \"");
 						UiHistory_write_expandQuotes (field -> strings [field -> integerValue]);
-						UiHistory_write (L"\"");
+						UiHistory_write (U"\"");
 					} break; case UI_COLOUR: {
-						UiHistory_write (next -- ? L", \"" : L" \"");
+						UiHistory_write (next -- ? U", \"" : U" \"");
 						UiHistory_write (Graphics_Colour_name (field -> colourValue));
-						UiHistory_write (L"\"");
+						UiHistory_write (U"\"");
 					}
 				}
 			}
 		}
 		if (hide) {
-			my d_dialogForm -> f_hide ();
+			GuiThing_hide (my d_dialogForm);
 			if (my destroyWhenUnmanaged) {
 				forget (me);
 				return;
@@ -522,71 +513,69 @@ static void UiForm_okOrApply (I, GuiButton button, int hide) {
 		/*
 		 * If a solution has already been suggested, or the "error" was actually a conscious user action, do not add anything more.
 		 */
-		if (! wcsstr (Melder_getError (), L"Please ") && ! wcsstr (Melder_getError (), L"You could ") &&
-			! wcsstr (Melder_getError (), L"You interrupted ") && ! wcsstr (Melder_getError (), L"Interrupted!"))
+		if (! str32str (Melder_getError (), U"Please ") && ! str32str (Melder_getError (), U"You could ") &&
+			! str32str (Melder_getError (), U"You interrupted ") && ! str32str (Melder_getError (), U"Interrupted!"))
 		{
 			/*
 			 * Otherwise, show a generic message.
 			 */
-			if (wcsstr (Melder_getError (), L"Selection changed!")) {
-				Melder_error_ ("Please change the selection in the object list, or click Cancel in the command window " L_LEFT_DOUBLE_QUOTE,
-					my name, L_RIGHT_DOUBLE_QUOTE L".");
+			if (str32str (Melder_getError (), U"Selection changed!")) {
+				Melder_appendError (U"Please change the selection in the object list, or click Cancel in the command window " U_LEFT_DOUBLE_QUOTE,
+					my name, U_RIGHT_DOUBLE_QUOTE U".");
 			} else {
-				Melder_error_ ("Please change something in the command window " L_LEFT_DOUBLE_QUOTE,
-					my name, L_RIGHT_DOUBLE_QUOTE L", or click Cancel in that window.");
+				Melder_appendError (U"Please change something in the command window " U_LEFT_DOUBLE_QUOTE,
+					my name, U_RIGHT_DOUBLE_QUOTE U", or click Cancel in that window.");
 			}
 		}
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
-	if (my okButton) my okButton -> f_setSensitive (true);
-	for (int i = 1; i <= my numberOfContinueButtons; i ++) if (my continueButtons [i]) my continueButtons [i] -> f_setSensitive (true);
-	if (my applyButton)  my applyButton  -> f_setSensitive (true);
-	if (my cancelButton) my cancelButton -> f_setSensitive (true);
-	if (my revertButton) my revertButton -> f_setSensitive (true);
-	if (my helpButton)   my helpButton   -> f_setSensitive (true);
+	if (my okButton) GuiThing_setSensitive (my okButton, true);
+	for (int i = 1; i <= my numberOfContinueButtons; i ++)
+		if (my continueButtons [i])
+			GuiThing_setSensitive (my continueButtons [i], true);
+	if (my applyButton)  GuiThing_setSensitive (my applyButton,  true);
+	if (my cancelButton) GuiThing_setSensitive (my cancelButton, true);
+	if (my revertButton) GuiThing_setSensitive (my revertButton, true);
+	if (my helpButton)   GuiThing_setSensitive (my helpButton,   true);
 }
 
 static void gui_button_cb_ok (I, GuiButtonEvent event) {
-	(void) event;
 	iam (UiForm);
 	UiForm_okOrApply (me, event -> button, true);
 }
 
 static void gui_button_cb_apply (I, GuiButtonEvent event) {
-	(void) event;
 	iam (UiForm);
 	UiForm_okOrApply (me, event -> button, false);
 }
 
-static void gui_button_cb_help (I, GuiButtonEvent event) {
-	(void) event;
+static void gui_button_cb_help (I, GuiButtonEvent /* event */) {
 	iam (UiForm);
 	Melder_help (my helpTitle);
 }
 
-UiForm UiForm_create (GuiWindow parent, const wchar_t *title,
-	void (*okCallback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure), void *buttonClosure,
-	const wchar_t *invokingButtonTitle, const wchar_t *helpTitle)
+UiForm UiForm_create (GuiWindow parent, const char32 *title,
+	UiCallback okCallback, void *buttonClosure,
+	const char32 *invokingButtonTitle, const char32 *helpTitle)
 {
 	autoUiForm me = Thing_new (UiForm);
 	my d_dialogParent = parent;
 	Thing_setName (me.peek(), title);
 	my okCallback = okCallback;
 	my buttonClosure = buttonClosure;
-	my invokingButtonTitle = Melder_wcsdup (invokingButtonTitle);
-	my helpTitle = Melder_wcsdup (helpTitle);
+	my invokingButtonTitle = Melder_dup (invokingButtonTitle);
+	my helpTitle = Melder_dup (helpTitle);
 	return me.transfer();
 }
 
-void UiForm_setPauseForm (I,
+void UiForm_setPauseForm (UiForm me,
 	int numberOfContinueButtons, int defaultContinueButton, int cancelContinueButton,
-	const wchar_t *continue1, const wchar_t *continue2, const wchar_t *continue3,
-	const wchar_t *continue4, const wchar_t *continue5, const wchar_t *continue6,
-	const wchar_t *continue7, const wchar_t *continue8, const wchar_t *continue9,
-	const wchar_t *continue10,
+	const char32 *continue1, const char32 *continue2, const char32 *continue3,
+	const char32 *continue4, const char32 *continue5, const char32 *continue6,
+	const char32 *continue7, const char32 *continue8, const char32 *continue9,
+	const char32 *continue10,
 	void (*cancelCallback) (Any dia, void *closure))
 {
-	iam (UiForm);
 	my isPauseForm = true;
 	my numberOfContinueButtons = numberOfContinueButtons;
 	my defaultContinueButton = defaultContinueButton;
@@ -604,116 +593,101 @@ void UiForm_setPauseForm (I,
 	my cancelCallback = cancelCallback;
 }
 
-static void commonOkCallback (UiForm dia, int narg, Stackel args, const wchar_t *dummy, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure) {
+static void commonOkCallback (UiForm /* dia */, int /* narg */, Stackel /* args */, const char32 * /* sendingString */,
+	Interpreter interpreter, const char32 * /* invokingButtonTitle */, bool /* modified */, void *closure)
+{
 	EditorCommand cmd = (EditorCommand) closure;
-	(void) dia;
-	(void) dummy;
-	(void) invokingButtonTitle;
-	(void) modified;
 	cmd -> commandCallback (cmd -> d_editor, cmd, cmd -> d_uiform, 0, NULL, NULL, interpreter);
 }
 
-UiForm UiForm_createE (EditorCommand cmd, const wchar_t *title, const wchar_t *invokingButtonTitle, const wchar_t *helpTitle) {
-	Editor editor = (Editor) cmd -> d_editor;
+UiForm UiForm_createE (EditorCommand cmd, const char32 *title, const char32 *invokingButtonTitle, const char32 *helpTitle) {
+	Editor editor = cmd -> d_editor;
 	UiForm dia = UiForm_create (editor -> d_windowForm, title, commonOkCallback, cmd, invokingButtonTitle, helpTitle);
 	dia -> command = cmd;
 	return dia;
 }
 
-static UiField UiForm_addField (UiForm me, int type, const wchar_t *label) {
+static UiField UiForm_addField (UiForm me, int type, const char32 *label) {
 	if (my numberOfFields == MAXIMUM_NUMBER_OF_FIELDS)
-		Melder_throw ("Cannot have more than ", MAXIMUM_NUMBER_OF_FIELDS, "in a form.");
+		Melder_throw (U"Cannot have more than ", MAXIMUM_NUMBER_OF_FIELDS, U"in a form.");
 	return my field [++ my numberOfFields] = UiField_create (type, label);
 }
 
-Any UiForm_addReal (I, const wchar_t *label, const wchar_t *defaultValue) {
-	iam (UiForm);
+Any UiForm_addReal (UiForm me, const char32 *label, const char32 *defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_REAL, label);
-	thy stringDefaultValue = Melder_wcsdup (defaultValue);
+	thy stringDefaultValue = Melder_dup (defaultValue);
 	return thee.transfer();
 }
 
-Any UiForm_addRealOrUndefined (I, const wchar_t *label, const wchar_t *defaultValue) {
-	iam (UiForm);
+Any UiForm_addRealOrUndefined (UiForm me, const char32 *label, const char32 *defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_REAL_OR_UNDEFINED, label);
-	thy stringDefaultValue = Melder_wcsdup (defaultValue);
+	thy stringDefaultValue = Melder_dup (defaultValue);
 	return thee.transfer();
 }
 
-Any UiForm_addPositive (I, const wchar_t *label, const wchar_t *defaultValue) {
-	iam (UiForm);
+Any UiForm_addPositive (UiForm me, const char32 *label, const char32 *defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_POSITIVE, label);
-	thy stringDefaultValue = Melder_wcsdup (defaultValue);
+	thy stringDefaultValue = Melder_dup (defaultValue);
 	return thee.transfer();
 }
 
-Any UiForm_addInteger (I, const wchar_t *label, const wchar_t *defaultValue) {
-	iam (UiForm);
+Any UiForm_addInteger (UiForm me, const char32 *label, const char32 *defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_INTEGER, label);
-	thy stringDefaultValue = Melder_wcsdup (defaultValue);
+	thy stringDefaultValue = Melder_dup (defaultValue);
 	return thee.transfer();
 }
 
-Any UiForm_addNatural (I, const wchar_t *label, const wchar_t *defaultValue) {
-	iam (UiForm);
+Any UiForm_addNatural (UiForm me, const char32 *label, const char32 *defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_NATURAL, label);
-	thy stringDefaultValue = Melder_wcsdup (defaultValue);
+	thy stringDefaultValue = Melder_dup (defaultValue);
 	return thee.transfer();
 }
 
-Any UiForm_addWord (I, const wchar_t *label, const wchar_t *defaultValue) {
-	iam (UiForm);
+Any UiForm_addWord (UiForm me, const char32 *label, const char32 *defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_WORD, label);
-	thy stringDefaultValue = Melder_wcsdup (defaultValue);
+	thy stringDefaultValue = Melder_dup (defaultValue);
 	return thee.transfer();
 }
 
-Any UiForm_addSentence (I, const wchar_t *label, const wchar_t *defaultValue) {
-	iam (UiForm);
+Any UiForm_addSentence (UiForm me, const char32 *label, const char32 *defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_SENTENCE, label);
-	thy stringDefaultValue = Melder_wcsdup (defaultValue);
+	thy stringDefaultValue = Melder_dup (defaultValue);
 	return thee.transfer();
 }
 
-Any UiForm_addLabel (I, const wchar_t *name, const wchar_t *label) {
-	iam (UiForm);
+Any UiForm_addLabel (UiForm me, const char32 *name, const char32 *label) {
 	autoUiField thee = UiForm_addField (me, UI_LABEL, name);
-	thy stringValue = Melder_wcsdup (label);
+	thy stringValue = Melder_dup (label);
 	return thee.transfer();
 }
 
-Any UiForm_addBoolean (I, const wchar_t *label, int defaultValue) {
-	iam (UiForm);
+Any UiForm_addBoolean (UiForm me, const char32 *label, int defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_BOOLEAN, label);
 	thy integerDefaultValue = defaultValue;
 	return thee.transfer();
 }
 
-Any UiForm_addText (I, const wchar_t *name, const wchar_t *defaultValue) {
-	iam (UiForm);
+Any UiForm_addText (UiForm me, const char32 *name, const char32 *defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_TEXT, name);
-	thy stringDefaultValue = Melder_wcsdup (defaultValue);
+	thy stringDefaultValue = Melder_dup (defaultValue);
 	return thee.transfer();
 }
 
-Any UiForm_addRadio (I, const wchar_t *label, int defaultValue) {
-	iam (UiForm);
+Any UiForm_addRadio (UiForm me, const char32 *label, int defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_RADIO, label);
 	thy integerDefaultValue = defaultValue;
 	thy options = Ordered_create ();
 	return thee.transfer();
 }
 
-Any UiForm_addOptionMenu (I, const wchar_t *label, int defaultValue) {
-	iam (UiForm);
+Any UiForm_addOptionMenu (UiForm me, const char32 *label, int defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_OPTIONMENU, label);
 	thy integerDefaultValue = defaultValue;
 	thy options = Ordered_create ();
 	return thee.transfer();
 }
 
-Any UiForm_addList (I, const wchar_t *label, long numberOfStrings, const wchar_t **strings, long defaultValue) {
-	iam (UiForm);
+Any UiForm_addList (UiForm me, const char32 *label, long numberOfStrings, const char32 **strings, long defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_LIST, label);
 	thy numberOfStrings = numberOfStrings;
 	thy strings = strings;
@@ -721,17 +695,15 @@ Any UiForm_addList (I, const wchar_t *label, long numberOfStrings, const wchar_t
 	return thee.transfer();
 }
 
-Any UiForm_addColour (I, const wchar_t *label, const wchar_t *defaultValue) {
-	iam (UiForm);
+Any UiForm_addColour (UiForm me, const char32 *label, const char32 *defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_COLOUR, label);
-	thy stringDefaultValue = Melder_wcsdup (defaultValue);
+	thy stringDefaultValue = Melder_dup (defaultValue);
 	return thee.transfer();
 }
 
-Any UiForm_addChannel (I, const wchar_t *label, const wchar_t *defaultValue) {
-	iam (UiForm);
+Any UiForm_addChannel (UiForm me, const char32 *label, const char32 *defaultValue) {
 	autoUiField thee = UiForm_addField (me, UI_CHANNEL, label);
-	thy stringDefaultValue = Melder_wcsdup (defaultValue);
+	thy stringDefaultValue = Melder_dup (defaultValue);
 	return thee.transfer();
 }
 
@@ -746,16 +718,15 @@ Any UiForm_addChannel (I, const wchar_t *label, const wchar_t *defaultValue) {
 
 static MelderString theFinishBuffer = { 0 };
 
-static void appendColon (void) {
+static void appendColon () {
 	long length = theFinishBuffer.length;
 	if (length < 1) return;
-	wchar_t lastCharacter = theFinishBuffer.string [length - 1];
-	if (lastCharacter == ':' || lastCharacter == '?' || lastCharacter == '.') return;
-	MelderString_appendCharacter (& theFinishBuffer, ':');
+	char32 lastCharacter = theFinishBuffer.string [length - 1];
+	if (lastCharacter == U':' || lastCharacter == U'?' || lastCharacter == U'.') return;
+	MelderString_appendCharacter (& theFinishBuffer, U':');
 }
 
-void UiForm_finish (I) {
-	iam (UiForm);
+void UiForm_finish (UiForm me) {
 	if (! my d_dialogParent && ! my isPauseForm) return;
 
 	int size = my numberOfFields;
@@ -774,9 +745,9 @@ void UiForm_finish (I) {
 		dialogHeight +=
 			ifield == 1 ? Gui_TOP_DIALOG_SPACING :
 			thy type == UI_RADIO || previous -> type == UI_RADIO ? Gui_VERTICAL_DIALOG_SPACING_DIFFERENT :
-			thy type >= UI_LABELLEDTEXT_MIN && thy type <= UI_LABELLEDTEXT_MAX && wcsnequ (thy name, L"right ", 6) &&
+			thy type >= UI_LABELLEDTEXT_MIN && thy type <= UI_LABELLEDTEXT_MAX && str32nequ (thy name, U"right ", 6) &&
 			previous -> type >= UI_LABELLEDTEXT_MIN && previous -> type <= UI_LABELLEDTEXT_MAX &&
-			wcsnequ (previous -> name, L"left ", 5) ? - textFieldHeight : Gui_VERTICAL_DIALOG_SPACING_SAME;
+			str32nequ (previous -> name, U"left ", 5) ? - textFieldHeight : Gui_VERTICAL_DIALOG_SPACING_SAME;
 		thy y = dialogHeight;
 		dialogHeight +=
 			thy type == UI_BOOLEAN ? Gui_CHECKBUTTON_HEIGHT :
@@ -784,7 +755,7 @@ void UiForm_finish (I) {
 				(thy options -> size - 1) * Gui_RADIOBUTTON_SPACING :
 			thy type == UI_OPTIONMENU ? Gui_OPTIONMENU_HEIGHT :
 			thy type == UI_LIST ? LIST_HEIGHT :
-			thy type == UI_LABEL && thy stringValue [0] != '\0' && thy stringValue [wcslen (thy stringValue) - 1] != '.' &&
+			thy type == UI_LABEL && thy stringValue [0] != U'\0' && thy stringValue [str32len (thy stringValue) - 1] != U'.' &&
 				ifield != my numberOfFields ? textFieldHeight
 				#ifdef _WIN32
 					- 6 :
@@ -816,13 +787,13 @@ void UiForm_finish (I) {
 				#if defined (macintosh)
 					ylabel += 3;
 				#endif
-				if (wcsnequ (field -> name, L"left ", 5)) {
+				if (str32nequ (field -> name, U"left ", 5)) {
 					MelderString_copy (& theFinishBuffer, field -> formLabel + 5);
 					appendColon ();
 					field -> label = GuiLabel_createShown (form, 0, x + labelWidth, ylabel, ylabel + textFieldHeight,
 						theFinishBuffer.string, GuiLabel_RIGHT);
 					field -> text = GuiText_createShown (form, fieldX, fieldX + halfFieldWidth, y, y + Gui_TEXTFIELD_HEIGHT, 0);
-				} else if (wcsnequ (field -> name, L"right ", 6)) {
+				} else if (str32nequ (field -> name, U"right ", 6)) {
 					field -> text = GuiText_createShown (form, fieldX + halfFieldWidth + 12, fieldX + fieldWidth,
 						y, y + Gui_TEXTFIELD_HEIGHT, 0);
 				} else {
@@ -883,7 +854,7 @@ void UiForm_finish (I) {
 				for (long ibutton = 1; ibutton <= field -> options -> size; ibutton ++) {
 					UiOption button = static_cast <UiOption> (field -> options -> item [ibutton]);
 					MelderString_copy (& theFinishBuffer, button -> name);
-					field -> optionMenu -> f_addOption (theFinishBuffer.string);
+					GuiOptionMenu_addOption (field -> optionMenu, theFinishBuffer.string);
 				}
 			} break;
 			case UI_BOOLEAN:
@@ -904,9 +875,9 @@ void UiForm_finish (I) {
 					theFinishBuffer.string, GuiLabel_RIGHT);
 				field -> list = GuiList_create (form, fieldX, fieldX + listWidth, y, y + LIST_HEIGHT, false, theFinishBuffer.string);
 				for (long i = 1; i <= field -> numberOfStrings; i ++) {
-					field -> list -> f_insertItem (field -> strings [i], 0);
+					GuiList_insertItem (field -> list, field -> strings [i], 0);
 				}
-				field -> list -> f_show ();
+				GuiThing_show (field -> list);
 			} break;
 		}
 	}
@@ -916,7 +887,7 @@ void UiForm_finish (I) {
 	y = dialogHeight - Gui_BOTTOM_DIALOG_SPACING - Gui_PUSHBUTTON_HEIGHT;
 	if (my helpTitle) {
 		my helpButton = GuiButton_createShown (form, HELP_BUTTON_X, HELP_BUTTON_X + HELP_BUTTON_WIDTH, y, y + Gui_PUSHBUTTON_HEIGHT,
-			L"Help", gui_button_cb_help, me, 0);
+			U"Help", gui_button_cb_help, me, 0);
 	}
 	bool commentsOnly = true;
 	for (long ifield = 1; ifield <= my numberOfFields; ifield ++) {
@@ -929,19 +900,19 @@ void UiForm_finish (I) {
 		if (my isPauseForm) {
 			my revertButton = GuiButton_createShown (form,
 				HELP_BUTTON_X, HELP_BUTTON_X + REVERT_BUTTON_WIDTH,
-				y, y + Gui_PUSHBUTTON_HEIGHT, L"Revert", gui_button_cb_revert, me, 0);
+				y, y + Gui_PUSHBUTTON_HEIGHT, U"Revert", gui_button_cb_revert, me, 0);
 		} else {
 			my revertButton = GuiButton_createShown (form,
 				HELP_BUTTON_X + HELP_BUTTON_WIDTH + Gui_HORIZONTAL_DIALOG_SPACING,
 				HELP_BUTTON_X + HELP_BUTTON_WIDTH + Gui_HORIZONTAL_DIALOG_SPACING + STANDARDS_BUTTON_WIDTH,
-				y, y + Gui_PUSHBUTTON_HEIGHT, L"Standards", gui_button_cb_revert, me, 0);
+				y, y + Gui_PUSHBUTTON_HEIGHT, U"Standards", gui_button_cb_revert, me, 0);
 		}
 	}
 	if (my isPauseForm) {
 		x = HELP_BUTTON_X + REVERT_BUTTON_WIDTH + Gui_HORIZONTAL_DIALOG_SPACING;
 		if (my cancelContinueButton == 0) {
 			my cancelButton = GuiButton_createShown (form, x, x + STOP_BUTTON_WIDTH, y, y + Gui_PUSHBUTTON_HEIGHT,
-				L"Stop", gui_button_cb_cancel, me, GuiButton_CANCEL);
+				U"Stop", gui_button_cb_cancel, me, GuiButton_CANCEL);
 			x += STOP_BUTTON_WIDTH + 7;
 		} else {
 			x += 30;
@@ -959,94 +930,92 @@ void UiForm_finish (I) {
 		x = dialogWidth - Gui_RIGHT_DIALOG_SPACING - Gui_OK_BUTTON_WIDTH - 2 * Gui_HORIZONTAL_DIALOG_SPACING
 			 - Gui_APPLY_BUTTON_WIDTH - Gui_CANCEL_BUTTON_WIDTH;
 		my cancelButton = GuiButton_createShown (form, x, x + Gui_CANCEL_BUTTON_WIDTH, y, y + Gui_PUSHBUTTON_HEIGHT,
-			L"Cancel", gui_button_cb_cancel, me, GuiButton_CANCEL);
+			U"Cancel", gui_button_cb_cancel, me, GuiButton_CANCEL);
 		x = dialogWidth - Gui_RIGHT_DIALOG_SPACING - Gui_OK_BUTTON_WIDTH - Gui_HORIZONTAL_DIALOG_SPACING - Gui_APPLY_BUTTON_WIDTH;
 		if (my numberOfFields > 1 || my field [1] -> type != UI_LABEL) {
 			my applyButton = GuiButton_createShown (form, x, x + Gui_APPLY_BUTTON_WIDTH, y, y + Gui_PUSHBUTTON_HEIGHT,
-				L"Apply", gui_button_cb_apply, me, 0);
+				U"Apply", gui_button_cb_apply, me, 0);
 		}
 		x = dialogWidth - Gui_RIGHT_DIALOG_SPACING - Gui_OK_BUTTON_WIDTH;
 		my okButton = GuiButton_createShown (form, x, x + Gui_OK_BUTTON_WIDTH, y, y + Gui_PUSHBUTTON_HEIGHT,
-			my isPauseForm ? L"Continue" : L"OK", gui_button_cb_ok, me, GuiButton_DEFAULT);
+			my isPauseForm ? U"Continue" : U"OK", gui_button_cb_ok, me, GuiButton_DEFAULT);
 	}
 	/*GuiObject_show (separator);*/
 }
 
-void UiForm_destroyWhenUnmanaged (I) {
-	iam (UiForm);
+void UiForm_destroyWhenUnmanaged (UiForm me) {
 	my destroyWhenUnmanaged = true;
 }
 
-void UiForm_do (I, bool modified) {
-	iam (UiForm);
+void UiForm_do (UiForm me, bool modified) {
 	my allowExecutionHook = theAllowExecutionHookHint;
 	my allowExecutionClosure = theAllowExecutionClosureHint;
 	Melder_assert (my d_dialogForm);
-	my d_dialogForm -> f_show ();
+	GuiThing_show (my d_dialogForm);
 	if (modified)
 		UiForm_okOrApply (me, NULL, true);
 }
 
-static void UiField_argToValue (UiField me, Stackel arg, Interpreter interpreter) {
+static void UiField_argToValue (UiField me, Stackel arg, Interpreter /* interpreter */) {
 	switch (my type) {
 		case UI_REAL: case UI_REAL_OR_UNDEFINED: case UI_POSITIVE: {
 			if (arg -> which != Stackel_NUMBER)
-				Melder_throw ("Argument \"", my name, "\" should be a number, not ", Stackel_whichText(arg), ".");
+				Melder_throw (U"Argument \"", my name, U"\" should be a number, not ", Stackel_whichText(arg), U".");
 			my realValue = arg -> number;
 			if (my realValue == NUMundefined && my type != UI_REAL_OR_UNDEFINED)
-				Melder_throw ("Argument \"", my name, "\" has the value \"undefined\".");
+				Melder_throw (U"Argument \"", my name, U"\" has the value \"undefined\".");
 			if (my type == UI_POSITIVE && my realValue <= 0.0)
-				Melder_throw ("Argument \"", my name, "\" must be greater than 0.");
+				Melder_throw (U"Argument \"", my name, U"\" must be greater than 0.");
 		} break; case UI_INTEGER: case UI_NATURAL: case UI_CHANNEL: {
 			if (arg -> which == Stackel_STRING) {
 				if (my type == UI_CHANNEL) {
-					if (wcsequ (arg -> string, L"All") || wcsequ (arg -> string, L"Average")) {
+					if (str32equ (arg -> string, U"All") || str32equ (arg -> string, U"Average")) {
 						my integerValue = 0;
-					} else if (wcsequ (arg -> string, L"Left") || wcsequ (arg -> string, L"Mono")) {
+					} else if (str32equ (arg -> string, U"Left") || str32equ (arg -> string, U"Mono")) {
 						my integerValue = 1;
-					} else if (wcsequ (arg -> string, L"Right") || wcsequ (arg -> string, L"Stereo")) {
+					} else if (str32equ (arg -> string, U"Right") || str32equ (arg -> string, U"Stereo")) {
 						my integerValue = 2;
 					} else {
-						Melder_throw ("Channel argument \"", my name,
-							"\" can only be a number or one of the strings \"All\", \"Average\", \"Left\", \"Right\", \"Mono\" or \"Stereo\".");
+						Melder_throw (U"Channel argument \"", my name,
+							U"\" can only be a number or one of the strings \"All\", \"Average\", \"Left\", \"Right\", \"Mono\" or \"Stereo\".");
 					}
 				} else {
-					Melder_throw ("Argument \"", my name, "\" should be a number, not ", Stackel_whichText (arg), ".");
+					Melder_throw (U"Argument \"", my name, U"\" should be a number, not ", Stackel_whichText (arg), U".");
 				}
 			} else if (arg -> which == Stackel_NUMBER) {
-				my integerValue = round (arg -> number);
+				my integerValue = lround (arg -> number);
 				if (my type == UI_NATURAL && my integerValue < 1)
-					Melder_throw ("Argument \"", my name, "\" must be a positive whole number.");
+					Melder_throw (U"Argument \"", my name, U"\" must be a positive whole number.");
 			} else {
-				Melder_throw ("Argument \"", my name, "\" should be a number, not ", Stackel_whichText (arg), ".");
+				Melder_throw (U"Argument \"", my name, U"\" should be a number, not ", Stackel_whichText (arg), U".");
 			}
 		} break; case UI_WORD: case UI_SENTENCE: case UI_TEXT: {
 			if (arg -> which != Stackel_STRING)
-				Melder_throw ("Argument \"", my name, "\" should be a string, not ", Stackel_whichText(arg), ".");
+				Melder_throw (U"Argument \"", my name, U"\" should be a string, not ", Stackel_whichText(arg), U".");
 			Melder_free (my stringValue);
-			my stringValue = Melder_wcsdup_f (arg -> string);
+			my stringValue = Melder_dup (arg -> string);
 		} break; case UI_BOOLEAN: {
 			if (arg -> which == Stackel_STRING) {
-				if (wcsequ (arg -> string, L"no") || wcsequ (arg -> string, L"off")) {
+				if (str32equ (arg -> string, U"no") || str32equ (arg -> string, U"off")) {
 					my integerValue = 0;
-				} else if (wcsequ (arg -> string, L"yes") || wcsequ (arg -> string, L"on")) {
+				} else if (str32equ (arg -> string, U"yes") || str32equ (arg -> string, U"on")) {
 					my integerValue = 1;
 				} else {
-					Melder_throw ("Boolean argument \"", my name,
-						"\" can only be a number or one of the strings \"yes\" or \"no\".");
+					Melder_throw (U"Boolean argument \"", my name,
+						U"\" can only be a number or one of the strings \"yes\" or \"no\".");
 				}
 			} else if (arg -> which == Stackel_NUMBER) {
 				my integerValue = arg -> number == 0.0 ? 0.0 : 1.0;
 			} else {
-				Melder_throw ("Boolean argument \"", my name, "\" should be a number (0 or 1), not ", Stackel_whichText (arg), ".");
+				Melder_throw (U"Boolean argument \"", my name, U"\" should be a number (0 or 1), not ", Stackel_whichText (arg), U".");
 			}
 		} break; case UI_RADIO: case UI_OPTIONMENU: {
 			if (arg -> which != Stackel_STRING)
-				Melder_throw ("Option argument \"", my name, "\" should be a string, not ", Stackel_whichText (arg), ".");
+				Melder_throw (U"Option argument \"", my name, U"\" should be a string, not ", Stackel_whichText (arg), U".");
 			my integerValue = 0;
 			for (int i = 1; i <= my options -> size; i ++) {
 				UiOption b = static_cast <UiOption> (my options -> item [i]);
-				if (wcsequ (arg -> string, b -> name))
+				if (str32equ (arg -> string, b -> name))
 					my integerValue = i;
 			}
 			if (my integerValue == 0) {
@@ -1055,45 +1024,44 @@ static void UiField_argToValue (UiField me, Stackel arg, Interpreter interpreter
 				 */
 				for (int i = 1; i <= my options -> size; i ++) {
 					UiOption b = static_cast <UiOption> (my options -> item [i]);
-					wchar_t name2 [100];
-					wcscpy (name2, b -> name);
-					if (islower (name2 [0])) name2 [0] = toupper (name2 [0]);
-					else if (isupper (name2 [0])) name2 [0] = tolower (name2 [0]);
-					if (wcsequ (arg -> string, name2))
+					char32 name2 [100];
+					str32cpy (name2, b -> name);
+					if (iswlower ((int) name2 [0])) name2 [0] = (char32) towupper ((int) name2 [0]);
+					else if (iswupper ((int) name2 [0])) name2 [0] = (char32) towlower ((int) name2 [0]);
+					if (str32equ (arg -> string, name2))
 						my integerValue = i;
 				}
 			}
 			if (my integerValue == 0) {
-				Melder_throw ("Option argument \"", my name, "\" cannot have the value \"", arg -> string, "\".");
+				Melder_throw (U"Option argument \"", my name, U"\" cannot have the value \"", arg -> string, U"\".");
 			}
 		} break; case UI_LIST: {
 			if (arg -> which != Stackel_STRING)
-				Melder_throw ("List argument \"", my name, "\" should be a string, not ", Stackel_whichText(arg), ".");
+				Melder_throw (U"List argument \"", my name, U"\" should be a string, not ", Stackel_whichText(arg), U".");
 			long i = 1;
 			for (; i <= my numberOfStrings; i ++)
-				if (wcsequ (arg -> string, my strings [i])) break;
+				if (str32equ (arg -> string, my strings [i])) break;
 			if (i > my numberOfStrings)
-				Melder_throw ("List argument \"", my name, "\" cannot have the value \"", arg -> string, "\".");
+				Melder_throw (U"List argument \"", my name, U"\" cannot have the value \"", arg -> string, U"\".");
 			my integerValue = i;
 		} break; case UI_COLOUR: {
 			if (arg -> which == Stackel_NUMBER) {
 				if (arg -> number < 0.0 || arg -> number > 1.0)
-					Melder_throw ("Grey colour argument \"", my name, "\" has to lie between 0.0 and 1.0.");
+					Melder_throw (U"Grey colour argument \"", my name, U"\" has to lie between 0.0 and 1.0.");
 				my colourValue. red = my colourValue. green = my colourValue. blue = arg -> number;
 			} else if (arg -> which == Stackel_STRING) {
-				autostring string2 = Melder_wcsdup_f (arg -> string);
+				autostring32 string2 = Melder_dup (arg -> string);
 				if (! colourToValue (me, string2.peek())) {
-					Melder_throw ("Cannot compute a colour from \"", string2.peek(), "\".");
+					Melder_throw (U"Cannot compute a colour from \"", string2.peek(), U"\".");
 				}
 			}
 		} break; default: {
-			Melder_throw ("Unknown field type ", my type, ".");
+			Melder_throw (U"Unknown field type ", my type, U".");
 		}
 	}
 }
 
-void UiForm_call (I, int narg, Stackel args, Interpreter interpreter) {
-	iam (UiForm);
+void UiForm_call (UiForm me, int narg, Stackel args, Interpreter interpreter) {
 	int size = my numberOfFields, iarg = 0;
 	while (size >= 1 && my field [size] -> type == UI_LABEL)
 		size --;   // ignore trailing fields without a value
@@ -1102,21 +1070,20 @@ void UiForm_call (I, int narg, Stackel args, Interpreter interpreter) {
 			continue;   // ignore non-trailing fields without a value
 		iarg ++;
 		if (iarg > narg)
-			Melder_throw ("Command requires more than the given ", narg, " arguments: no value for argument \"", my field [i] -> name, "\".");
+			Melder_throw (U"Command requires more than the given ", narg, U" arguments: no value for argument \"", my field [i] -> name, U"\".");
 		UiField_argToValue (my field [i], & args [iarg], interpreter);
 	}
 	if (iarg < narg)
-		Melder_throw ("Command requires only ", iarg, " arguments, not the ", narg, " given.");
+		Melder_throw (U"Command requires only ", iarg, U" arguments, not the ", narg, U" given.");
 	my okCallback (me, 0, NULL, NULL, interpreter, NULL, false, my buttonClosure);
 }
 
-void UiForm_parseString (I, const wchar_t *arguments, Interpreter interpreter) {
-	iam (UiForm);
+void UiForm_parseString (UiForm me, const char32 *arguments, Interpreter interpreter) {
 	int size = my numberOfFields;
 	while (size >= 1 && my field [size] -> type == UI_LABEL)
-		size --;   /* Ignore trailing fields without a value. */
+		size --;   // ignore trailing fields without a value
 	for (int i = 1; i < size; i ++) {
-		static wchar_t stringValue [3000];
+		static char32 stringValue [3000];
 		int ichar = 0;
 		if (my field [i] -> type == UI_LABEL)
 			continue;   /* Ignore non-trailing fields without a value. */
@@ -1134,22 +1101,22 @@ void UiForm_parseString (I, const wchar_t *arguments, Interpreter interpreter) {
 		 *     I said "hello"
 		 */
 		if (*arguments == '\"') {
-			arguments ++;   /* Do not include leading double quote. */
+			arguments ++;   // do not include leading double quote
 			for (;;) {
-				if (*arguments == '\0')
-					Melder_throw ("Missing matching quote.");
-				if (*arguments == '\"' && * ++ arguments != '\"') break;   // remember second quote
+				if (*arguments == U'\0')
+					Melder_throw (U"Missing matching quote.");
+				if (*arguments == U'\"' && * ++ arguments != U'\"') break;   // remember second quote
 				stringValue [ichar ++] = *arguments ++;
 			}
 		} else {
-			while (*arguments != ' ' && *arguments != '\t' && *arguments != '\0')
+			while (*arguments != U' ' && *arguments != U'\t' && *arguments != U'\0')
 				stringValue [ichar ++] = *arguments ++;
 		}
-		stringValue [ichar] = '\0';   // trailing null byte
+		stringValue [ichar] = U'\0';   // trailing null character
 		try {
 			UiField_stringToValue (my field [i], stringValue, interpreter);
 		} catch (MelderError) {
-			Melder_throw ("Don't understand contents of field \"", my field [i] -> name, "\".");
+			Melder_throw (U"Don't understand contents of field \"", my field [i] -> name, U"\".");
 		}
 	}
 	/*
@@ -1161,111 +1128,105 @@ void UiForm_parseString (I, const wchar_t *arguments, Interpreter interpreter) {
 		try {
 			UiField_stringToValue (my field [size], arguments, interpreter);
 		} catch (MelderError) {
-			Melder_throw ("Don't understand contents of field \"", my field [size] -> name, "\".");
+			Melder_throw (U"Don't understand contents of field \"", my field [size] -> name, U"\".");
 		}
 	}
 	my okCallback (me, 0, NULL, NULL, interpreter, NULL, false, my buttonClosure);
 }
 
-void UiForm_parseStringE (EditorCommand cmd, int narg, Stackel args, const wchar_t *arguments, Interpreter interpreter) {
+void UiForm_parseStringE (EditorCommand cmd, int narg, Stackel args, const char32 *arguments, Interpreter interpreter) {
 	if (args)
 		UiForm_call(cmd -> d_uiform, narg, args, interpreter);
 	else
 		UiForm_parseString (cmd -> d_uiform, arguments, interpreter);
 }
 
-static UiField findField (UiForm me, const wchar_t *fieldName) {
+static UiField findField (UiForm me, const char32 *fieldName) {
 	for (int ifield = 1; ifield <= my numberOfFields; ifield ++)
-		if (wcsequ (fieldName, my field [ifield] -> name)) return my field [ifield];
+		if (str32equ (fieldName, my field [ifield] -> name)) return my field [ifield];
 	return NULL;
 }
 
 static void fatalField (UiForm dia) {
-	Melder_fatal ("Wrong field in command window \"%s\".", Melder_peekWcsToUtf8 (dia -> name));
+	Melder_fatal (U"Wrong field in command window \"", dia -> name, U"\".");
 }
 
-void UiForm_setReal (I, const wchar_t *fieldName, double value) {
-	iam (UiForm);
+void UiForm_setReal (UiForm me, const char32 *fieldName, double value) {
 	UiField field = findField (me, fieldName);
-	if (field == NULL) Melder_fatal ("(UiForm_setReal:) No field \"%s\" in command window \"%s\".",
-		Melder_peekWcsToUtf8 (fieldName), Melder_peekWcsToUtf8 (my name));
+	if (field == NULL) Melder_fatal (U"(UiForm_setReal:) No field \"", fieldName, U"\" in command window \"", my name, U"\".");
 	switch (field -> type) {
 		case UI_REAL: case UI_REAL_OR_UNDEFINED: case UI_POSITIVE: {
 			if (value == Melder_atof (field -> stringDefaultValue)) {
-				field -> text -> f_setString (field -> stringDefaultValue);
+				GuiText_setString (field -> text, field -> stringDefaultValue);
 			} else {
-				wchar_t s [40];
-				wcscpy (s, Melder_double (value));
+				char32 s [40];
+				str32cpy (s, Melder_double (value));
 				/*
 				 * If the default is overtly real, the shown value must be as well.
 				 */
-				if ((wcschr (field -> stringDefaultValue, '.') || wcschr (field -> stringDefaultValue, 'e')) &&
-					! (wcschr (s, '.') || wcschr (s, 'e')))
+				if ((str32chr (field -> stringDefaultValue, U'.') || str32chr (field -> stringDefaultValue, U'e')) &&
+					! (str32chr (s, U'.') || str32chr (s, U'e')))
 				{
-					wcscat (s, L".0");
+					str32cpy (s + str32len (s), U".0");
 				}
-				field -> text -> f_setString (s);
+				GuiText_setString (field -> text, s);
 			}
 		} break; case UI_COLOUR: {
-			field -> text -> f_setString (Melder_double (value));   // some grey value
+			GuiText_setString (field -> text, Melder_double (value));   // some grey value
 		} break; default: {
-			Melder_fatal ("Wrong field in command window \"%s\".", Melder_peekWcsToUtf8 (my name));
+			Melder_fatal (U"Wrong field in command window \"", my name, U"\".");
 		}
 	}
 }
 
-void UiForm_setInteger (I, const wchar_t *fieldName, long value) {
-	iam (UiForm);
+void UiForm_setInteger (UiForm me, const char32 *fieldName, long value) {
 	UiField field = findField (me, fieldName);
-	if (field == NULL) Melder_fatal ("(UiForm_setInteger:) No field \"%s\" in command window \"%s\".",
-		Melder_peekWcsToUtf8 (fieldName), Melder_peekWcsToUtf8 (my name));
+	if (field == NULL) Melder_fatal (U"(UiForm_setInteger:) No field \"", fieldName, U"\" in command window \"", my name, U"\".");
 	switch (field -> type) {
 		case UI_INTEGER: case UI_NATURAL: case UI_CHANNEL: {
-			if (value == wcstol (field -> stringDefaultValue, NULL, 10)) {
-				field -> text -> f_setString (field -> stringDefaultValue);
+			if (value == Melder_atoi (field -> stringDefaultValue)) {
+				GuiText_setString (field -> text, field -> stringDefaultValue);
 			} else {
-				field -> text -> f_setString (Melder_integer (value));
+				GuiText_setString (field -> text, Melder_integer (value));
 			}
 		} break; case UI_BOOLEAN: {
-			field -> checkButton -> f_setValue (value);
+			GuiCheckButton_setValue (field -> checkButton, value);
 		} break; case UI_RADIO: {
-			if (value < 1 || value > field -> options -> size) value = 1;   /* Guard against incorrect prefs file. */
+			if (value < 1 || value > field -> options -> size) value = 1;   // guard against incorrect prefs file
 			for (int i = 1; i <= field -> options -> size; i ++) {
 				if (i == value) {
 					UiOption b = static_cast <UiOption> (field -> options -> item [i]);
-					b -> radioButton -> f_set ();
+					GuiRadioButton_set (b -> radioButton);
 				}
 			}
 		} break; case UI_OPTIONMENU: {
-			if (value < 1 || value > field -> options -> size) value = 1;   /* Guard against incorrect prefs file. */
-			field -> optionMenu -> f_setValue (value);
+			if (value < 1 || value > field -> options -> size) value = 1;   // guard against incorrect prefs file
+			GuiOptionMenu_setValue (field -> optionMenu, value);
 		} break; case UI_LIST: {
-			if (value < 1 || value > field -> numberOfStrings) value = 1;   /* Guard against incorrect prefs file. */
-			field -> list -> f_selectItem (value);
+			if (value < 1 || value > field -> numberOfStrings) value = 1;   // guard against incorrect prefs file
+			GuiList_selectItem (field -> list, value);
 		} break; default: {
 			fatalField (me);
 		}
 	}
 }
 
-void UiForm_setString (I, const wchar_t *fieldName, const wchar_t *value) {
-	iam (UiForm);
+void UiForm_setString (UiForm me, const char32 *fieldName, const char32 *value /* cattable */) {
 	UiField field = findField (me, fieldName);
-	if (field == NULL) Melder_fatal ("(UiForm_setString:) No field \"%s\" in command window \"%s\".",
-		Melder_peekWcsToUtf8 (fieldName), Melder_peekWcsToUtf8 (my name));
-	if (value == NULL) value = L"";   /* Accept NULL strings. */
+	if (field == NULL) Melder_fatal (U"(UiForm_setString:) No field \"", fieldName, U"\" in command window \"", my name, U"\".");
+	if (value == NULL) value = U"";   /* Accept NULL strings. */
 	switch (field -> type) {
 		case UI_REAL: case UI_REAL_OR_UNDEFINED: case UI_POSITIVE: case UI_INTEGER: case UI_NATURAL:
 			case UI_WORD: case UI_SENTENCE: case UI_COLOUR: case UI_CHANNEL: case UI_TEXT:
 		{
-			field -> text -> f_setString (value);
+			GuiText_setString (field -> text, value);
 		} break; case UI_LABEL: {
-			field -> label -> f_setString (value);
+			GuiLabel_setText (field -> label, value);
 		} break; case UI_RADIO: {
 			for (int i = 1; i <= field -> options -> size; i ++) {
 				UiOption b = static_cast <UiOption> (field -> options -> item [i]);
-				if (wcsequ (value, b -> name)) {
-					b -> radioButton -> f_set ();
+				if (str32equ (value, b -> name)) {
+					GuiRadioButton_set (b -> radioButton);
 				}
 			}
 			/* If not found: do nothing (guard against incorrect prefs file). */
@@ -1273,40 +1234,38 @@ void UiForm_setString (I, const wchar_t *fieldName, const wchar_t *value) {
 			int integerValue = 0;
 			for (int i = 1; i <= field -> options -> size; i ++) {
 				UiOption b = static_cast <UiOption> (field -> options -> item [i]);
-				if (wcsequ (value, b -> name)) {
+				if (str32equ (value, b -> name)) {
 					integerValue = i;
 					break;
 				}
 			}
-			field -> optionMenu -> f_setValue (integerValue);
+			GuiOptionMenu_setValue (field -> optionMenu, integerValue);
 			/* If not found: do nothing (guard against incorrect prefs file). */
 		} break; case UI_LIST: {
 			long i;
 			for (i = 1; i <= field -> numberOfStrings; i ++)
-				if (wcsequ (value, field -> strings [i])) break;
-			if (i > field -> numberOfStrings) i = 1;   /* Guard against incorrect prefs file. */
-			field -> list -> f_selectItem (i);
+				if (str32equ (value, field -> strings [i])) break;
+			if (i > field -> numberOfStrings) i = 1;   // guard against incorrect prefs file
+			GuiList_selectItem (field -> list, i);
 		} break; default: {
 			fatalField (me);
 		}
 	}
 }
 
-static UiField findField_check (UiForm me, const wchar_t *fieldName) {
+static UiField findField_check (UiForm me, const char32 *fieldName) {
 	UiField result = findField (me, fieldName);
 	if (result == NULL) {
-		Melder_throw ("Cannot find field \"", fieldName, "\" in form.\n"
-			"The script may have changed while the form was open.\n"
-			"Please click Cancel in the form and try again.");
+		Melder_throw (U"Cannot find field \"", fieldName, U"\" in form.\n"
+			U"The script may have changed while the form was open.\n"
+			U"Please click Cancel in the form and try again.");
 	}
 	return result;
 }
 
-double UiForm_getReal (I, const wchar_t *fieldName) {
-	iam (UiForm);
+double UiForm_getReal (UiForm me, const char32 *fieldName) {
 	UiField field = findField (me, fieldName);
-	if (field == NULL) Melder_fatal ("(UiForm_getReal:) No field \"%s\" in command window \"%s\".",
-		Melder_peekWcsToUtf8 (fieldName), Melder_peekWcsToUtf8 (my name));
+	if (field == NULL) Melder_fatal (U"(UiForm_getReal:) No field \"", fieldName, U"\" in command window \"", my name, U"\".");
 	switch (field -> type) {
 		case UI_REAL: case UI_REAL_OR_UNDEFINED: case UI_POSITIVE: {
 			return field -> realValue;
@@ -1317,26 +1276,23 @@ double UiForm_getReal (I, const wchar_t *fieldName) {
 	return 0.0;
 }
 
-double UiForm_getReal_check (I, const wchar_t *fieldName) {
-	iam (UiForm);
+double UiForm_getReal_check (UiForm me, const char32 *fieldName) {
 	UiField field = findField_check (me, fieldName);
 	switch (field -> type) {
 		case UI_REAL: case UI_REAL_OR_UNDEFINED: case UI_POSITIVE: {
 			return field -> realValue;
 		} break; default: {
-			Melder_throw ("Cannot find a real value in field \"", fieldName, "\" in the form.\n"
-				"The script may have changed while the form was open.\n"
-				"Please click Cancel in the form and try again.");
+			Melder_throw (U"Cannot find a real value in field \"", fieldName, U"\" in the form.\n"
+				U"The script may have changed while the form was open.\n"
+				U"Please click Cancel in the form and try again.");
 		}
 	}
 	return 0.0;
 }
 
-long UiForm_getInteger (I, const wchar_t *fieldName) {
-	iam (UiForm);
+long UiForm_getInteger (UiForm me, const char32 *fieldName) {
 	UiField field = findField (me, fieldName);
-	if (field == NULL) Melder_fatal ("(UiForm_getInteger:) No field \"%s\" in command window \"%s\".",
-		Melder_peekWcsToUtf8 (fieldName), Melder_peekWcsToUtf8 (my name));
+	if (field == NULL) Melder_fatal (U"(UiForm_getInteger:) No field \"", fieldName, U"\" in command window \"", my name, U"\".");
 	switch (field -> type) {
 		case UI_INTEGER: case UI_NATURAL: case UI_CHANNEL: case UI_BOOLEAN: case UI_RADIO:
 			case UI_OPTIONMENU: case UI_LIST:
@@ -1349,8 +1305,7 @@ long UiForm_getInteger (I, const wchar_t *fieldName) {
 	return 0L;
 }
 
-long UiForm_getInteger_check (I, const wchar_t *fieldName) {
-	iam (UiForm);
+long UiForm_getInteger_check (UiForm me, const char32 *fieldName) {
 	UiField field = findField_check (me, fieldName);
 	switch (field -> type) {
 		case UI_INTEGER: case UI_NATURAL: case UI_CHANNEL: case UI_BOOLEAN: case UI_RADIO:
@@ -1358,19 +1313,17 @@ long UiForm_getInteger_check (I, const wchar_t *fieldName) {
 		{
 			return field -> integerValue;
 		} break; default: {
-			Melder_throw ("Cannot find an integer value in field \"", fieldName, "\" in the form.\n"
-				"The script may have changed while the form was open.\n"
-				"Please click Cancel in the form and try again.");
+			Melder_throw (U"Cannot find an integer value in field \"", fieldName, U"\" in the form.\n"
+				U"The script may have changed while the form was open.\n"
+				U"Please click Cancel in the form and try again.");
 		}
 	}
 	return 0L;
 }
 
-wchar_t * UiForm_getString (I, const wchar_t *fieldName) {
-	iam (UiForm);
+char32 * UiForm_getString (UiForm me, const char32 *fieldName) {
 	UiField field = findField (me, fieldName);
-	if (field == NULL) Melder_fatal ("(UiForm_getString:) No field \"%s\" in command window \"%s\".",
-		Melder_peekWcsToUtf8 (fieldName), Melder_peekWcsToUtf8 (my name));
+	if (field == NULL) Melder_fatal (U"(UiForm_getString:) No field \"", fieldName, U"\" in command window \"", my name, U"\".");
 	switch (field -> type) {
 		case UI_WORD: case UI_SENTENCE: case UI_TEXT: {
 			return field -> stringValue;
@@ -1378,7 +1331,7 @@ wchar_t * UiForm_getString (I, const wchar_t *fieldName) {
 			UiOption b = static_cast <UiOption> (field -> options -> item [field -> integerValue]);
 			return b -> name;
 		} break; case UI_LIST: {
-			return (wchar_t *) field -> strings [field -> integerValue];
+			return (char32 *) field -> strings [field -> integerValue];
 		} break; default: {
 			fatalField (me);
 		}
@@ -1386,8 +1339,7 @@ wchar_t * UiForm_getString (I, const wchar_t *fieldName) {
 	return NULL;
 }
 
-wchar_t * UiForm_getString_check (I, const wchar_t *fieldName) {
-	iam (UiForm);
+char32 * UiForm_getString_check (UiForm me, const char32 *fieldName) {
 	UiField field = findField_check (me, fieldName);
 	switch (field -> type) {
 		case UI_WORD: case UI_SENTENCE: case UI_TEXT: {
@@ -1396,21 +1348,19 @@ wchar_t * UiForm_getString_check (I, const wchar_t *fieldName) {
 			UiOption b = static_cast <UiOption> (field -> options -> item [field -> integerValue]);
 			return b -> name;
 		} break; case UI_LIST: {
-			return (wchar_t *) field -> strings [field -> integerValue];
+			return (char32 *) field -> strings [field -> integerValue];
 		} break; default: {
-			Melder_throw ("Cannot find a string in field \"", fieldName, "\" in the form.\n"
-				"The script may have changed while the form was open.\n"
-				"Please click Cancel in the form and try again.");
+			Melder_throw (U"Cannot find a string in field \"", fieldName, U"\" in the form.\n"
+				U"The script may have changed while the form was open.\n"
+				U"Please click Cancel in the form and try again.");
 		}
 	}
 	return NULL;
 }
 
-Graphics_Colour UiForm_getColour (I, const wchar_t *fieldName) {
-	iam (UiForm);
+Graphics_Colour UiForm_getColour (UiForm me, const char32 *fieldName) {
 	UiField field = findField (me, fieldName);
-	if (field == NULL) Melder_fatal ("(UiForm_getColour:) No field \"%s\" in command window \"%s\".",
-		Melder_peekWcsToUtf8 (fieldName), Melder_peekWcsToUtf8 (my name));
+	if (field == NULL) Melder_fatal (U"(UiForm_getColour:) No field \"", fieldName, U"\" in command window \"", my name, U"\".");
 	switch (field -> type) {
 		case UI_COLOUR: {
 			return field -> colourValue;
@@ -1421,33 +1371,31 @@ Graphics_Colour UiForm_getColour (I, const wchar_t *fieldName) {
 	return Graphics_BLACK;
 }
 
-Graphics_Colour UiForm_getColour_check (I, const wchar_t *fieldName) {
-	iam (UiForm);
+Graphics_Colour UiForm_getColour_check (UiForm me, const char32 *fieldName) {
 	UiField field = findField_check (me, fieldName);
 	switch (field -> type) {
 		case UI_COLOUR: {
 			return field -> colourValue;
 		} break; default: {
-			Melder_throw ("Cannot find a real value in field \"", fieldName, "\" in the form.\n"
-				"The script may have changed while the form was open.\n"
-				"Please click Cancel in the form and try again.");
+			Melder_throw (U"Cannot find a real value in field \"", fieldName, U"\" in the form.\n"
+				U"The script may have changed while the form was open.\n"
+				U"Please click Cancel in the form and try again.");
 		}
 	}
 	return Graphics_BLACK;
 }
 
-void UiForm_Interpreter_addVariables (I, Interpreter interpreter) {
-	iam (UiForm);
-	static MelderString lowerCaseFieldName = { 0 };
+void UiForm_Interpreter_addVariables (UiForm me, Interpreter interpreter) {
+	static MelderString lowerCaseFieldName { 0 };
 	for (int ifield = 1; ifield <= my numberOfFields; ifield ++) {
 		UiField field = my field [ifield];
 		MelderString_copy (& lowerCaseFieldName, field -> name);
 		/*
 		 * Change e.g. "Number of people" to "number_of_people".
 		 */
-		lowerCaseFieldName.string [0] = towlower (lowerCaseFieldName.string [0]);
-		for (wchar_t *p = & lowerCaseFieldName.string [0]; *p != '\0'; p ++) {
-			if (*p == ' ') *p = '_';
+		lowerCaseFieldName.string [0] = (char32) towlower ((int) lowerCaseFieldName.string [0]);   // BUG for non-BMP characters
+		for (char32 *p = & lowerCaseFieldName.string [0]; *p != U'\0'; p ++) {
+			if (*p == U' ') *p = U'_';
 		}
 		switch (field -> type) {
 			case UI_INTEGER: case UI_NATURAL: case UI_CHANNEL: case UI_BOOLEAN: {
@@ -1459,23 +1407,23 @@ void UiForm_Interpreter_addVariables (I, Interpreter interpreter) {
 			} break; case UI_RADIO: case UI_OPTIONMENU: {
 				InterpreterVariable var = Interpreter_lookUpVariable (interpreter, lowerCaseFieldName.string);
 				var -> numericValue = field -> integerValue;
-				MelderString_appendCharacter (& lowerCaseFieldName, '$');
+				MelderString_appendCharacter (& lowerCaseFieldName, U'$');
 				var = Interpreter_lookUpVariable (interpreter, lowerCaseFieldName.string);
 				Melder_free (var -> stringValue);
 				UiOption b = static_cast <UiOption> (field -> options -> item [field -> integerValue]);
-				var -> stringValue = Melder_wcsdup_f (b -> name);
+				var -> stringValue = Melder_dup (b -> name);
 			} break; case UI_LIST: {
 				InterpreterVariable var = Interpreter_lookUpVariable (interpreter, lowerCaseFieldName.string);
 				var -> numericValue = field -> integerValue;
-				MelderString_appendCharacter (& lowerCaseFieldName, '$');
+				MelderString_appendCharacter (& lowerCaseFieldName, U'$');
 				var = Interpreter_lookUpVariable (interpreter, lowerCaseFieldName.string);
 				Melder_free (var -> stringValue);
-				var -> stringValue = Melder_wcsdup_f ((wchar_t *) field -> strings [field -> integerValue]);
+				var -> stringValue = Melder_dup (field -> strings [field -> integerValue]);
 			} break; case UI_WORD: case UI_SENTENCE: case UI_TEXT: {
-				MelderString_appendCharacter (& lowerCaseFieldName, '$');
+				MelderString_appendCharacter (& lowerCaseFieldName, U'$');
 				InterpreterVariable var = Interpreter_lookUpVariable (interpreter, lowerCaseFieldName.string);
 				Melder_free (var -> stringValue);
-				var -> stringValue = Melder_wcsdup_f (field -> stringValue);
+				var -> stringValue = Melder_dup (field -> stringValue);
 			} break; case UI_COLOUR: {
 				// to be implemented
 			} break; default: {
diff --git a/sys/Ui.h b/sys/Ui.h
index dbf16f9..7ce99bd 100644
--- a/sys/Ui.h
+++ b/sys/Ui.h
@@ -2,7 +2,7 @@
 #define _Ui_h_
 /* Ui.h
  *
- * Copyright (C) 1992-2011,2012,2013 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,30 +28,30 @@ Thing_declare (EditorCommand);
 
 /* Example of usage:
 {
-	static Any dia = NULL;
+	static UiForm dia = NULL;
 	if (dia == NULL) {
 		Any radio;
 		dia = UiForm_create
 		  (topShell,   // The parent GuiWindow of the dialog window.
-			L"Create a new person",   // The window title.
+			U"Create a new person",   // The window title.
 			DO_Person_create,   // The routine to call when the user clicks OK.
 			NULL,   // The last argument to the OK routine (also for the other buttons). Could be a ScriptEditor, or an EditorCommand, or an Interpreter, or NULL.
-			L"Create person...",   // The invoking button title.
-			L"Create person...");   // The help string; may be NULL.
-		UiForm_addNatural (dia, L"Age (years)", L"18");
-		UiForm_addPositive (dia, L"Length (metres)", L"1.68 (average)");
-		UiForm_addBoolean (dia, L"Beard", FALSE);
-		radio = UiForm_addRadio (L"Sex", 1);
-			UiRadio_addButton (radio, L"Female");
-			UiRadio_addButton (radio, L"Male");
-		UiForm_addWord (dia, L"Colour", L"black");
-		UiForm_addLabel (dia, L"features", L"Some less conspicuous features:");
-		UiForm_addNatural (dia, L"Number of birth marks", L"28");
-		UiForm_addSentence (dia, L"Favourite greeting", L"Good morning");
+			U"Create person...",   // The invoking button title.
+			U"Create person...");   // The help string; may be NULL.
+		UiForm_addNatural (dia, U"Age (years)", U"18");
+		UiForm_addPositive (dia, U"Length (metres)", U"1.68 (average)");
+		UiForm_addBoolean (dia, U"Beard", false);
+		radio = UiForm_addRadio (dia, U"Sex", 1);
+			UiRadio_addButton (radio, U"Female");
+			UiRadio_addButton (radio, U"Male");
+		UiForm_addWord (dia, U"Colour", U"black");
+		UiForm_addLabel (dia, U"features", U"Some less conspicuous features:");
+		UiForm_addNatural (dia, U"Number of birth marks", U"28");
+		UiForm_addSentence (dia, U"Favourite greeting", U"Good morning");
 		UiForm_finish (dia);
 	}
-	UiForm_setReal (dia, L"Length", myLength);
-	UiForm_setInteger (dia, L"Number of birth marks", 30);
+	UiForm_setReal (dia, U"Length", myLength);
+	UiForm_setInteger (dia, U"Number of birth marks", 30);
 	UiForm_do (dia, 0);   // Show dialog box.
 }
 	Real, Positive, Integer, Natural, Word, and Sentence
@@ -72,98 +72,99 @@ Thing_declare (EditorCommand);
 */
 
 Thing_define (UiField, Thing) {
-	// new data:
-	public:
-		int type;
-		const wchar_t *formLabel;
-		double realValue, realDefaultValue;
-		long integerValue, integerDefaultValue;
-		wchar_t *stringValue; const wchar_t *stringDefaultValue;
-		Graphics_Colour colourValue;
-		char *stringValueA;
-		Ordered options;
-		long numberOfStrings;
-		const wchar_t **strings;
-		GuiLabel label;
-		GuiText text;
-		GuiCheckButton checkButton;
-		GuiRadioButton radioButton;
-		GuiList list;
-		GuiOptionMenu optionMenu;
-		int y;
-	// overridden methods:
-		virtual void v_destroy ();
+	int type;
+	const char32 *formLabel;
+	double realValue, realDefaultValue;
+	long integerValue, integerDefaultValue;
+	char32 *stringValue; const char32 *stringDefaultValue;
+	Graphics_Colour colourValue;
+	char *stringValueA;
+	Ordered options;
+	long numberOfStrings;
+	const char32 **strings;
+	GuiLabel label;
+	GuiText text;
+	GuiCheckButton checkButton;
+	GuiRadioButton radioButton;
+	GuiList list;
+	GuiOptionMenu optionMenu;
+	int y;
+
+	void v_destroy ()
+		override;
 };
 
+typedef void (*UiCallback) (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *closure);
+
 #define MAXIMUM_NUMBER_OF_FIELDS  50
 #define MAXIMUM_NUMBER_OF_CONTINUE_BUTTONS  10
 
 Thing_define (UiForm, Thing) {
-	// new data:
-	public:
-		EditorCommand command;
-		GuiWindow d_dialogParent;
-		GuiDialog d_dialogForm;
-		void (*okCallback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure);
-		void (*applyCallback) (Any dia, void *closure);
-		void (*cancelCallback) (Any dia, void *closure);
-		void *buttonClosure;
-		const wchar_t *invokingButtonTitle, *helpTitle;
-		int numberOfContinueButtons, defaultContinueButton, cancelContinueButton, clickedContinueButton;
-		const wchar_t *continueTexts [1 + MAXIMUM_NUMBER_OF_CONTINUE_BUTTONS];
-		int numberOfFields;
-		UiField field [1 + MAXIMUM_NUMBER_OF_FIELDS];
-		GuiButton okButton, cancelButton, revertButton, helpButton, applyButton, continueButtons [1 + MAXIMUM_NUMBER_OF_CONTINUE_BUTTONS];
-		bool destroyWhenUnmanaged, isPauseForm;
-		bool (*allowExecutionHook) (void *closure);
-		void *allowExecutionClosure;
-	// overridden methods:
-		virtual void v_destroy ();
+	EditorCommand command;
+	GuiWindow d_dialogParent;
+	GuiDialog d_dialogForm;
+	UiCallback okCallback;
+	void (*applyCallback) (Any dia, void *closure);
+	void (*cancelCallback) (Any dia, void *closure);
+	void *buttonClosure;
+	const char32 *invokingButtonTitle, *helpTitle;
+	int numberOfContinueButtons, defaultContinueButton, cancelContinueButton, clickedContinueButton;
+	const char32 *continueTexts [1 + MAXIMUM_NUMBER_OF_CONTINUE_BUTTONS];
+	int numberOfFields;
+	UiField field [1 + MAXIMUM_NUMBER_OF_FIELDS];
+	GuiButton okButton, cancelButton, revertButton, helpButton, applyButton, continueButtons [1 + MAXIMUM_NUMBER_OF_CONTINUE_BUTTONS];
+	bool destroyWhenUnmanaged, isPauseForm;
+	bool (*allowExecutionHook) (void *closure);
+	void *allowExecutionClosure;
+
+	void v_destroy ()
+		override;
 };
 
 /* The following routines work on the screen and from batch. */
-UiForm UiForm_create (GuiWindow parent, const wchar_t *title,
-	void (*okCallback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure), void *buttonClosure,
-	const wchar_t *invokingButtonTitle, const wchar_t *helpTitle);
-Any UiForm_addReal (I, const wchar_t *label, const wchar_t *defaultValue);
-Any UiForm_addRealOrUndefined (I, const wchar_t *label, const wchar_t *defaultValue);
-Any UiForm_addPositive (I, const wchar_t *label, const wchar_t *defaultValue);
-Any UiForm_addInteger (I, const wchar_t *label, const wchar_t *defaultValue);
-Any UiForm_addNatural (I, const wchar_t *label, const wchar_t *defaultValue);
-Any UiForm_addWord (I, const wchar_t *label, const wchar_t *defaultValue);
-Any UiForm_addSentence (I, const wchar_t *label, const wchar_t *defaultValue);
-Any UiForm_addLabel (I, const wchar_t *name, const wchar_t *label);
-Any UiForm_addBoolean (I, const wchar_t *label, int defaultValue);
-Any UiForm_addText (I, const wchar_t *name, const wchar_t *defaultValue);
-Any UiForm_addRadio (I, const wchar_t *label, int defaultValue);
-	Any UiRadio_addButton (I, const wchar_t *label);
-Any UiForm_addOptionMenu (I, const wchar_t *label, int defaultValue);
-	Any UiOptionMenu_addButton (I, const wchar_t *label);
-Any UiForm_addList (I, const wchar_t *label, long numberOfStrings, const wchar_t **strings, long defaultValue);
-Any UiForm_addColour (I, const wchar_t *label, const wchar_t *defaultValue);
-Any UiForm_addChannel (I, const wchar_t *label, const wchar_t *defaultValue);
-void UiForm_finish (I);
-void UiForm_destroyWhenUnmanaged (I);
-void UiForm_setPauseForm (I,
+UiForm UiForm_create (GuiWindow parent, const char32 *title,
+	UiCallback okCallback, void *buttonClosure,
+	const char32 *invokingButtonTitle, const char32 *helpTitle);
+Any UiForm_addReal (UiForm me, const char32 *label, const char32 *defaultValue);
+Any UiForm_addRealOrUndefined (UiForm me, const char32 *label, const char32 *defaultValue);
+Any UiForm_addPositive (UiForm me, const char32 *label, const char32 *defaultValue);
+Any UiForm_addInteger (UiForm me, const char32 *label, const char32 *defaultValue);
+Any UiForm_addNatural (UiForm me, const char32 *label, const char32 *defaultValue);
+Any UiForm_addWord (UiForm me, const char32 *label, const char32 *defaultValue);
+Any UiForm_addSentence (UiForm me, const char32 *label, const char32 *defaultValue);
+Any UiForm_addLabel (UiForm me, const char32 *name, const char32 *label);
+Any UiForm_addBoolean (UiForm me, const char32 *label, int defaultValue);
+Any UiForm_addText (UiForm me, const char32 *name, const char32 *defaultValue);
+Any UiForm_addRadio (UiForm me, const char32 *label, int defaultValue);
+Any UiRadio_addButton (I, const char32 *label);
+Any UiForm_addOptionMenu (UiForm me, const char32 *label, int defaultValue);
+Any UiOptionMenu_addButton (I, const char32 *label);
+Any UiForm_addList (UiForm me, const char32 *label, long numberOfStrings, const char32 **strings, long defaultValue);
+Any UiForm_addColour (UiForm me, const char32 *label, const char32 *defaultValue);
+Any UiForm_addChannel (UiForm me, const char32 *label, const char32 *defaultValue);
+void UiForm_finish (UiForm me);
+
+void UiForm_destroyWhenUnmanaged (UiForm me);
+void UiForm_setPauseForm (UiForm me,
 	int numberOfContinueButtons, int defaultContinueButton, int cancelContinueButton,
-	const wchar_t *continue1, const wchar_t *continue2, const wchar_t *continue3,
-	const wchar_t *continue4, const wchar_t *continue5, const wchar_t *continue6,
-	const wchar_t *continue7, const wchar_t *continue8, const wchar_t *continue9,
-	const wchar_t *continue10,
+	const char32 *continue1, const char32 *continue2, const char32 *continue3,
+	const char32 *continue4, const char32 *continue5, const char32 *continue6,
+	const char32 *continue7, const char32 *continue8, const char32 *continue9,
+	const char32 *continue10,
 	void (*cancelCallback) (Any dia, void *closure));
 
 /* The following three routines set values in widgets. */
 /* Do not call from batch. */
 /* 'fieldName' is name from UiForm_addXXXXXX (), */
 /* without anything from and including the first " (" or ":". */
-void UiForm_setString (I, const wchar_t *fieldName, const wchar_t *text);
+void UiForm_setString (UiForm me, const char32 *fieldName, const char32 *text /* cattable */);
 	/* Real, Positive, Integer, Natural, Word, Sentence, Label, Text, Radio, List. */
-void UiForm_setReal (I, const wchar_t *fieldName, double value);
+void UiForm_setReal (UiForm me, const char32 *fieldName, double value);
 	/* Real, Positive. */
-void UiForm_setInteger (I, const wchar_t *fieldName, long value);
+void UiForm_setInteger (UiForm me, const char32 *fieldName, long value);
 	/* Integer, Natural, Boolean, Radio, List. */
 
-void UiForm_do (I, bool modified);
+void UiForm_do (UiForm me, bool modified);
 /*
 	Function:
 		put the form on the screen.
@@ -196,35 +197,35 @@ void UiForm_do (I, bool modified);
 /* The field names are the 'label' or 'name' arguments to UiForm_addXXXXXX (), */
 /* without anything from parentheses or from a colon. */
 /* These routines work from the screen and from batch. */
-double UiForm_getReal (I, const wchar_t *fieldName);	// Real, Positive
-long UiForm_getInteger (I, const wchar_t *fieldName);	// Integer, Natural, Boolean, Radio, List
-wchar_t * UiForm_getString (I, const wchar_t *fieldName);	// Word, Sentence, Text, Radio, List
-Graphics_Colour UiForm_getColour (I, const wchar_t *fieldName);   // Colour
-MelderFile UiForm_getFile (I, const wchar_t *fieldName); // FileIn, FileOut
+double UiForm_getReal (UiForm me, const char32 *fieldName);	// Real, Positive
+long UiForm_getInteger (UiForm me, const char32 *fieldName);	// Integer, Natural, Boolean, Radio, List
+char32 * UiForm_getString (UiForm me, const char32 *fieldName);	// Word, Sentence, Text, Radio, List
+Graphics_Colour UiForm_getColour (UiForm me, const char32 *fieldName);   // Colour
+MelderFile UiForm_getFile (UiForm me, const char32 *fieldName); // FileIn, FileOut
 
-double UiForm_getReal_check (I, const wchar_t *fieldName);
-long UiForm_getInteger_check (I, const wchar_t *fieldName);
-wchar_t * UiForm_getString_check (I, const wchar_t *fieldName);
-Graphics_Colour UiForm_getColour_check (I, const wchar_t *fieldName);
+double UiForm_getReal_check (UiForm me, const char32 *fieldName);
+long UiForm_getInteger_check (UiForm me, const char32 *fieldName);
+char32 * UiForm_getString_check (UiForm me, const char32 *fieldName);
+Graphics_Colour UiForm_getColour_check (UiForm me, const char32 *fieldName);
 
-void UiForm_call (I, int narg, Stackel args, Interpreter interpreter);
-void UiForm_parseString (I, const wchar_t *arguments, Interpreter interpreter);
+void UiForm_call (UiForm me, int narg, Stackel args, Interpreter interpreter);
+void UiForm_parseString (UiForm me, const char32 *arguments, Interpreter interpreter);
 
-UiForm UiInfile_create (GuiWindow parent, const wchar_t *title,
-  void (*okCallback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure), void *okClosure,
-  const wchar_t *invokingButtonTitle, const wchar_t *helpTitle, bool allowMultipleFiles);
+UiForm UiInfile_create (GuiWindow parent, const char32 *title,
+  UiCallback okCallback, void *okClosure,
+  const char32 *invokingButtonTitle, const char32 *helpTitle, bool allowMultipleFiles);
 
-UiForm UiOutfile_create (GuiWindow parent, const wchar_t *title,
-  void (*okCallback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure), void *okClosure,
-  const wchar_t *invokingButtonTitle, const wchar_t *helpTitle);
+UiForm UiOutfile_create (GuiWindow parent, const char32 *title,
+  UiCallback okCallback, void *okClosure,
+  const char32 *invokingButtonTitle, const char32 *helpTitle);
 
-void UiInfile_do (Any dia);
+void UiInfile_do (I);
 
-void UiOutfile_do (Any dia, const wchar_t *defaultName);
+void UiOutfile_do (I, const char32 *defaultName);
 
-MelderFile UiFile_getFile (Any dia);
+MelderFile UiFile_getFile (I);
 
-void UiFile_hide (void);
+void UiFile_hide ();
 /*
 	Hides the visible UiFile that was opened most recently.
 	Normally, file selectors stay open until their okCallback has completed.
@@ -235,16 +236,16 @@ void UiFile_hide (void);
 	UiFile_hide () before Melder_pause ().
 */
 
-void UiHistory_write (const wchar_t *string);
-void UiHistory_write_expandQuotes (const wchar_t *string);
-void UiHistory_write_colonize (const wchar_t *string);
-wchar_t *UiHistory_get (void);
-void UiHistory_clear (void);
+void UiHistory_write (const char32 *string);
+void UiHistory_write_expandQuotes (const char32 *string);
+void UiHistory_write_colonize (const char32 *string);
+char32 *UiHistory_get ();
+void UiHistory_clear ();
 
 void Ui_setAllowExecutionHook (bool (*allowExecutionHook) (void *closure), void *allowExecutionClosure);
 
-void UiForm_widgetsToValues (I);
-void UiForm_Interpreter_addVariables (I, Interpreter interpreter);
+void UiForm_widgetsToValues (UiForm me);
+void UiForm_Interpreter_addVariables (UiForm me, Interpreter interpreter);
 int UiForm_getClickedContinueButton (UiForm me);
 
 /* End of file Ui.h */
diff --git a/sys/UiFile.cpp b/sys/UiFile.cpp
index 81f0bc3..c905c6e 100644
--- a/sys/UiFile.cpp
+++ b/sys/UiFile.cpp
@@ -1,6 +1,6 @@
 /* UiFile.cpp
  *
- * Copyright (C) 1992-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,17 +21,16 @@
 #include "Editor.h"
 
 Thing_define (UiFile, Thing) {
-	// new data:
-	public:
-		EditorCommand command;
-		GuiWindow parent;
-		structMelderFile file;
-		const wchar_t *invokingButtonTitle, *helpTitle;
-		void (*okCallback) (UiForm sendingForm, int narg, Stackel nargs, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure);
-		void *okClosure;
-		int shiftKeyPressed;
-	// overridden methods:
-		virtual void v_destroy ();
+	EditorCommand command;
+	GuiWindow parent;
+	structMelderFile file;
+	const char32 *invokingButtonTitle, *helpTitle;
+	UiCallback okCallback;
+	void *okClosure;
+	int shiftKeyPressed;
+
+	void v_destroy ()
+		override;
 };
 
 void structUiFile :: v_destroy () {
@@ -41,7 +40,7 @@ void structUiFile :: v_destroy () {
 
 Thing_implement (UiFile, Thing, 0);
 
-static void UiFile_init (I, GuiWindow parent, const wchar_t *title) {
+static void UiFile_init (I, GuiWindow parent, const char32 *title) {
 	iam (UiFile);
 	my parent = parent;
 	Thing_setName (me, title);
@@ -55,21 +54,19 @@ MelderFile UiFile_getFile (I) {
 /********** READING A FILE **********/
 
 Thing_define (UiInfile, UiFile) {
-	// new data:
-	public:
-		bool allowMultipleFiles;
+	bool allowMultipleFiles;
 };
 
 Thing_implement (UiInfile, UiFile, 0);
 
-UiForm UiInfile_create (GuiWindow parent, const wchar_t *title,
-	void (*okCallback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *), void *okClosure,
-	const wchar_t *invokingButtonTitle, const wchar_t *helpTitle, bool allowMultipleFiles)
+UiForm UiInfile_create (GuiWindow parent, const char32 *title,
+	UiCallback okCallback, void *okClosure,
+	const char32 *invokingButtonTitle, const char32 *helpTitle, bool allowMultipleFiles)
 {
 	UiInfile me = Thing_new (UiInfile);
 	my okCallback = okCallback;
 	my okClosure = okClosure;
-	my invokingButtonTitle = Melder_wcsdup (invokingButtonTitle);
+	my invokingButtonTitle = Melder_dup (invokingButtonTitle);
 	my helpTitle = helpTitle;
 	my allowMultipleFiles = allowMultipleFiles;
 	UiFile_init (me, parent, title);
@@ -83,42 +80,40 @@ void UiInfile_do (I) {
 		for (long ifile = 1; ifile <= infileNames -> size; ifile ++) {
 			SimpleString infileName = (SimpleString) infileNames -> item [ifile];
 			Melder_pathToFile (infileName -> string, & my file);
-			UiHistory_write (L"\n");
+			UiHistory_write (U"\n");
 			UiHistory_write_colonize (my invokingButtonTitle);
-			UiHistory_write (L" \"");
+			UiHistory_write (U" \"");
 			UiHistory_write_expandQuotes (infileName -> string);
-			UiHistory_write (L"\"");
+			UiHistory_write (U"\"");
 			structMelderFile file;
 			MelderFile_copy (& my file, & file);
 			try {
-				my okCallback ((UiForm) me, 0, NULL, NULL, NULL, my invokingButtonTitle, false, my okClosure);
+				my okCallback ((UiForm) me, 0, nullptr, nullptr, nullptr, my invokingButtonTitle, false, my okClosure);
 			} catch (MelderError) {
-				Melder_throw ("File ", & file, " not finished.");
+				Melder_throw (U"File ", & file, U" not finished.");
 			}
 		}
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 }
 
 /********** WRITING A FILE **********/
 
 Thing_define (UiOutfile, UiFile) {
-	// new data:
-	public:
-		bool (*allowExecutionHook) (void *closure);
-		void *allowExecutionClosure;   // I am owner (see destroy)
+	bool (*allowExecutionHook) (void *closure);
+	void *allowExecutionClosure;   // I am owner (see destroy)
 };
 
 Thing_implement (UiOutfile, UiFile, 0);
 
-UiForm UiOutfile_create (GuiWindow parent, const wchar_t *title,
-	void (*okCallback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *), void *okClosure, const wchar_t *invokingButtonTitle, const wchar_t *helpTitle)
+UiForm UiOutfile_create (GuiWindow parent, const char32 *title,
+	UiCallback okCallback, void *okClosure, const char32 *invokingButtonTitle, const char32 *helpTitle)
 {
 	UiOutfile me = Thing_new (UiOutfile);
 	my okCallback = okCallback;
 	my okClosure = okClosure;
-	my invokingButtonTitle = Melder_wcsdup (invokingButtonTitle);
+	my invokingButtonTitle = Melder_dup (invokingButtonTitle);
 	my helpTitle = helpTitle;
 	UiFile_init (me, parent, title);
 	my allowExecutionHook = theAllowExecutionHookHint;
@@ -126,49 +121,48 @@ UiForm UiOutfile_create (GuiWindow parent, const wchar_t *title,
 	return (UiForm) me;
 }
 
-static void commonOutfileCallback (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure) {
+static void commonOutfileCallback (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *closure) {
 	EditorCommand command = (EditorCommand) closure;
 	(void) invokingButtonTitle;
 	(void) modified;
 	command -> commandCallback (command -> d_editor, command, sendingForm, narg, args, sendingString, interpreter);
 }
 
-UiForm UiOutfile_createE (EditorCommand cmd, const wchar_t *title, const wchar_t *invokingButtonTitle, const wchar_t *helpTitle) {
-	Editor editor = (Editor) cmd -> d_editor;
+UiForm UiOutfile_createE (EditorCommand cmd, const char32 *title, const char32 *invokingButtonTitle, const char32 *helpTitle) {
+	Editor editor = cmd -> d_editor;
 	UiOutfile dia = (UiOutfile) UiOutfile_create (editor -> d_windowForm, title, commonOutfileCallback, cmd, invokingButtonTitle, helpTitle);
 	dia -> command = cmd;
 	return (UiForm) dia;   // BUG
 }
 
-UiForm UiInfile_createE (EditorCommand cmd, const wchar_t *title, const wchar_t *invokingButtonTitle, const wchar_t *helpTitle) {
-	Editor editor = (Editor) cmd -> d_editor;
+UiForm UiInfile_createE (EditorCommand cmd, const char32 *title, const char32 *invokingButtonTitle, const char32 *helpTitle) {
+	Editor editor = cmd -> d_editor;
 	UiInfile dia = (UiInfile) UiInfile_create (editor -> d_windowForm, title, commonOutfileCallback, cmd, invokingButtonTitle, helpTitle, false);
 	dia -> command = cmd;
 	return (UiForm) dia;   // BUG
 }
 
-void UiOutfile_do (I, const wchar_t *defaultName) {
+void UiOutfile_do (I, const char32 *defaultName) {
 	iam (UiOutfile);
-	wchar_t *outfileName = GuiFileSelect_getOutfileName (NULL, my name, defaultName);
-	if (outfileName == NULL) return;   // cancelled
+	char32 *outfileName = GuiFileSelect_getOutfileName (nullptr, my name, defaultName);
+	if (! outfileName) return;   // cancelled
 	if (my allowExecutionHook && ! my allowExecutionHook (my allowExecutionClosure)) {
-		Melder_flushError ("Dialog `%s' cancelled.", my name);
+		Melder_flushError (U"Dialog \"", my name, U"\" cancelled.");
 		return;
 	}
 	Melder_pathToFile (outfileName, & my file);
 	structMelderFile file;
 	MelderFile_copy (& my file, & file);   // save, because okCallback could destroy me
-	UiHistory_write (L"\n");
+	UiHistory_write (U"\n");
 	UiHistory_write_colonize (my invokingButtonTitle);
 	try {
-		my okCallback ((UiForm) me, 0, NULL, NULL, NULL, my invokingButtonTitle, false, my okClosure);
+		my okCallback ((UiForm) me, 0, nullptr, nullptr, nullptr, my invokingButtonTitle, false, my okClosure);
 	} catch (MelderError) {
-		Melder_error_ ("File ", & file, " not finished.");
-		Melder_flushError (NULL);
+		Melder_flushError (U"File ", & file, U" not finished.");
 	}
-	UiHistory_write (L" \"");
+	UiHistory_write (U" \"");
 	UiHistory_write (outfileName);
-	UiHistory_write (L"\"");
+	UiHistory_write (U"\"");
 	Melder_free (outfileName);
 }
 
diff --git a/sys/UiPause.cpp b/sys/UiPause.cpp
index 0bf357f..eb67be1 100644
--- a/sys/UiPause.cpp
+++ b/sys/UiPause.cpp
@@ -1,6 +1,6 @@
 /* UiPause.cpp
  *
- * Copyright (C) 2009-2011,2013 Paul Boersma
+ * Copyright (C) 2009-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,12 +35,9 @@ static int thePauseForm_clicked = 0;
 static int theCancelContinueButton = 0;
 static int theEventLoopDepth = 0;
 
-static void thePauseFormOkCallback (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure) {
-	(void) sendingForm;
-	(void) sendingString;
-	(void) interpreter;
-	(void) invokingButtonTitle;
-	(void) modified;
+static void thePauseFormOkCallback (UiForm /* sendingForm */, int /* narg */, Stackel /* args */,
+	const char32 * /* sendingString */, Interpreter /* interpreter */,
+	const char32 * /* invokingButtonTitle */, bool /* modified */, void *closure) {
 	/* BUG: should also restore praatP. editor. */
 	/*
 	 * Get the data from the pause form.
@@ -58,86 +55,86 @@ static void thePauseFormCancelCallback (Any dia, void *closure) {
 		thePauseForm_clicked = -1;   // STOP button
 	}
 }
-void UiPause_begin (GuiWindow topShell, const wchar_t *title, Interpreter interpreter) {
+void UiPause_begin (GuiWindow topShell, const char32 *title, Interpreter interpreter) {
 	if (theEventLoopDepth > 0)
-		Melder_throw ("Praat cannot have more than one pause form at a time.");
+		Melder_throw (U"Praat cannot have more than one pause form at a time.");
 	forget (thePauseForm);   // in case an earlier build-up of another pause window was interrupted
-	thePauseForm = UiForm_create (topShell, Melder_wcscat (L"Pause: ", title),
+	thePauseForm = UiForm_create (topShell, Melder_cat (U"Pause: ", title),
 		thePauseFormOkCallback, interpreter,   // pass interpreter as closure!
 		NULL, NULL);
 }
-void UiPause_real (const wchar_t *label, const wchar_t *defaultValue) {
+void UiPause_real (const char32 *label, const char32 *defaultValue) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"real\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"real\" has to be between a \"beginPause\" and an \"endPause\".");
 	UiForm_addReal (thePauseForm, label, defaultValue);
 }
-void UiPause_positive (const wchar_t *label, const wchar_t *defaultValue) {
+void UiPause_positive (const char32 *label, const char32 *defaultValue) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"positive\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"positive\" has to be between a \"beginPause\" and an \"endPause\".");
 	UiForm_addPositive (thePauseForm, label, defaultValue);
 }
-void UiPause_integer (const wchar_t *label, const wchar_t *defaultValue) {
+void UiPause_integer (const char32 *label, const char32 *defaultValue) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"integer\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"integer\" has to be between a \"beginPause\" and an \"endPause\".");
 	UiForm_addInteger (thePauseForm, label, defaultValue);
 }
-void UiPause_natural (const wchar_t *label, const wchar_t *defaultValue) {
+void UiPause_natural (const char32 *label, const char32 *defaultValue) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"natural\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"natural\" has to be between a \"beginPause\" and an \"endPause\".");
 	UiForm_addNatural (thePauseForm, label, defaultValue);
 }
-void UiPause_word (const wchar_t *label, const wchar_t *defaultValue) {
+void UiPause_word (const char32 *label, const char32 *defaultValue) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"word\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"word\" has to be between a \"beginPause\" and an \"endPause\".");
 	UiForm_addWord (thePauseForm, label, defaultValue);
 }
-void UiPause_sentence (const wchar_t *label, const wchar_t *defaultValue) {
+void UiPause_sentence (const char32 *label, const char32 *defaultValue) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"sentence\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"sentence\" has to be between a \"beginPause\" and an \"endPause\".");
 	UiForm_addSentence (thePauseForm, label, defaultValue);
 }
-void UiPause_text (const wchar_t *label, const wchar_t *defaultValue) {
+void UiPause_text (const char32 *label, const char32 *defaultValue) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"text\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"text\" has to be between a \"beginPause\" and an \"endPause\".");
 	UiForm_addText (thePauseForm, label, defaultValue);
 }
-void UiPause_boolean (const wchar_t *label, int defaultValue) {
+void UiPause_boolean (const char32 *label, int defaultValue) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"boolean\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"boolean\" has to be between a \"beginPause\" and an \"endPause\".");
 	UiForm_addBoolean (thePauseForm, label, defaultValue);
 }
-void UiPause_choice (const wchar_t *label, int defaultValue) {
+void UiPause_choice (const char32 *label, int defaultValue) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"choice\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"choice\" has to be between a \"beginPause\" and an \"endPause\".");
 	thePauseFormRadio = UiForm_addRadio (thePauseForm, label, defaultValue);
 }
-void UiPause_optionMenu (const wchar_t *label, int defaultValue) {
+void UiPause_optionMenu (const char32 *label, int defaultValue) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"optionMenu\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"optionMenu\" has to be between a \"beginPause\" and an \"endPause\".");
 	thePauseFormRadio = UiForm_addOptionMenu (thePauseForm, label, defaultValue);
 }
-void UiPause_option (const wchar_t *label) {
+void UiPause_option (const char32 *label) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"option\" has to be between a \"beginPause\" and an \"endPause\".");
+		Melder_throw (U"The function \"option\" has to be between a \"beginPause\" and an \"endPause\".");
 	if (thePauseFormRadio == NULL) {
 		forget (thePauseForm);
-		Melder_throw ("Found the function \"option\" without a preceding \"choice\" or \"optionMenu\".");
+		Melder_throw (U"Found the function \"option\" without a preceding \"choice\" or \"optionMenu\".");
 	}
 	UiOptionMenu_addButton (thePauseFormRadio, label);
 }
-void UiPause_comment (const wchar_t *label) {
+void UiPause_comment (const char32 *label) {
 	if (thePauseForm == NULL)
-		Melder_throw ("The function \"comment\" has to be between a \"beginPause\" and an \"endPause\".");
-	UiForm_addLabel (thePauseForm, L"", label);
+		Melder_throw (U"The function \"comment\" has to be between a \"beginPause\" and an \"endPause\".");
+	UiForm_addLabel (thePauseForm, U"", label);
 }
 int UiPause_end (int numberOfContinueButtons, int defaultContinueButton, int cancelContinueButton,
-	const wchar_t *continueText1, const wchar_t *continueText2, const wchar_t *continueText3,
-	const wchar_t *continueText4, const wchar_t *continueText5, const wchar_t *continueText6,
-	const wchar_t *continueText7, const wchar_t *continueText8, const wchar_t *continueText9,
-	const wchar_t *continueText10, Interpreter interpreter)
+	const char32 *continueText1, const char32 *continueText2, const char32 *continueText3,
+	const char32 *continueText4, const char32 *continueText5, const char32 *continueText6,
+	const char32 *continueText7, const char32 *continueText8, const char32 *continueText9,
+	const char32 *continueText10, Interpreter interpreter)
 {
 	if (thePauseForm == NULL)
-		Melder_throw ("Found the function \"endPause\" without a preceding \"beginPause\".");
+		Melder_throw (U"Found the function \"endPause\" without a preceding \"beginPause\".");
 	UiForm_setPauseForm (thePauseForm, numberOfContinueButtons, defaultContinueButton, cancelContinueButton,
 		continueText1, continueText2, continueText3, continueText4, continueText5,
 		continueText6, continueText7, continueText8, continueText9, continueText10,
@@ -155,57 +152,55 @@ int UiPause_end (int numberOfContinueButtons, int defaultContinueButton, int can
 	/*
 	 * Wait for the user to click Stop or Continue.
 	 */
-	#ifndef CONSOLE_APPLICATION
-		{// scope
-			autoMelderSaveDefaultDir saveDir;
-			thePauseForm_clicked = 0;
-			Melder_assert (theEventLoopDepth == 0);
-			theEventLoopDepth ++;
-			try {
-				#if gtk
-					do {
-						gtk_main_iteration ();
-					} while (! thePauseForm_clicked);
-				#elif cocoa
-					do {
-						NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-						//[theDemoEditor -> d_windowForm -> d_cocoaWindow   flushWindow];
-						NSEvent *nsEvent = [NSApp
-							nextEventMatchingMask: NSAnyEventMask
-							untilDate: [NSDate distantFuture]   // wait
-							inMode: NSDefaultRunLoopMode
-							dequeue: YES
-						];
-						Melder_assert (nsEvent != NULL);
-						[NSApp  sendEvent: nsEvent];
-						[NSApp  updateWindows];   // called automatically?
-						[pool release];
-					} while (! thePauseForm_clicked);
-				#elif motif
-					do {
-						XEvent event;
-						GuiNextEvent (& event);
-						XtDispatchEvent (& event);
-					} while (! thePauseForm_clicked);
-				#endif
-			} catch (MelderError) {
-				Melder_flushError ("An error made it to the outer level in a pause window; should not occur! Please write to paul.boersma at uva.nl");
-			}
-			theEventLoopDepth --;
+	{// scope
+		autoMelderSaveDefaultDir saveDir;
+		thePauseForm_clicked = 0;
+		Melder_assert (theEventLoopDepth == 0);
+		theEventLoopDepth ++;
+		try {
+			#if gtk
+				do {
+					gtk_main_iteration ();
+				} while (! thePauseForm_clicked);
+			#elif cocoa
+				do {
+					NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+					//[theDemoEditor -> d_windowForm -> d_cocoaWindow   flushWindow];
+					NSEvent *nsEvent = [NSApp
+						nextEventMatchingMask: NSAnyEventMask
+						untilDate: [NSDate distantFuture]   // wait
+						inMode: NSDefaultRunLoopMode
+						dequeue: YES
+					];
+					Melder_assert (nsEvent != NULL);
+					[NSApp  sendEvent: nsEvent];
+					[NSApp  updateWindows];   // called automatically?
+					[pool release];
+				} while (! thePauseForm_clicked);
+			#elif motif
+				do {
+					XEvent event;
+					GuiNextEvent (& event);
+					XtDispatchEvent (& event);
+				} while (! thePauseForm_clicked);
+			#endif
+		} catch (MelderError) {
+			Melder_flushError (U"An error made it to the outer level in a pause window; should not occur! Please write to paul.boersma at uva.nl");
 		}
-		if (wasBackgrounding) praat_background ();
-		/* BUG: should also restore praatP. editor. */
-		thePauseForm = NULL;   // undangle
-		thePauseFormRadio = NULL;   // undangle
-		if (thePauseForm_clicked == -1) {
-			Interpreter_stop (interpreter);
-			Melder_throw ("You interrupted the script.");
-			//Melder_flushError (NULL);
-			//Melder_clearError ();
-		} else {
-			//Melder_casual ("Clicked %d", (int) thePauseForm_clicked);
-		}
-	#endif
+		theEventLoopDepth --;
+	}
+	if (wasBackgrounding) praat_background ();
+	/* BUG: should also restore praatP. editor. */
+	thePauseForm = NULL;   // undangle
+	thePauseFormRadio = NULL;   // undangle
+	if (thePauseForm_clicked == -1) {
+		Interpreter_stop (interpreter);
+		Melder_throw (U"You interrupted the script.");
+		//Melder_flushError ();
+		//Melder_clearError ();
+	} else {
+		//Melder_casual (U"Clicked ", thePauseForm_clicked);
+	}
 	return thePauseForm_clicked;
 }
 
diff --git a/sys/UiPause.h b/sys/UiPause.h
index f12ab8b..b6ad968 100644
--- a/sys/UiPause.h
+++ b/sys/UiPause.h
@@ -2,7 +2,7 @@
 #define _UiPause_h_
 /* UiPause.h
  *
- * Copyright (C) 2009-2011,2012 Paul Boersma
+ * Copyright (C) 2009-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,26 +22,26 @@
 #include "Gui.h"
 #include "Interpreter_decl.h"
 
-void UiPause_begin (GuiWindow topShell, const wchar_t *title, Interpreter interpreter);
+void UiPause_begin (GuiWindow topShell, const char32 *title, Interpreter interpreter);
 
-void UiPause_real (const wchar_t *label, const wchar_t *defaultValue);
-void UiPause_positive (const wchar_t *label, const wchar_t *defaultValue);
-void UiPause_integer (const wchar_t *label, const wchar_t *defaultValue);
-void UiPause_natural (const wchar_t *label, const wchar_t *defaultValue);
-void UiPause_word (const wchar_t *label, const wchar_t *defaultValue);
-void UiPause_sentence (const wchar_t *label, const wchar_t *defaultValue);
-void UiPause_text (const wchar_t *label, const wchar_t *defaultValue);
-void UiPause_boolean (const wchar_t *label, int defaultValue);
-void UiPause_choice (const wchar_t *label, int defaultValue);
-void UiPause_optionMenu (const wchar_t *label, int defaultValue);
-void UiPause_option (const wchar_t *label);
-void UiPause_comment (const wchar_t *label);
+void UiPause_real       (const char32 *label, const char32 *defaultValue);
+void UiPause_positive   (const char32 *label, const char32 *defaultValue);
+void UiPause_integer    (const char32 *label, const char32 *defaultValue);
+void UiPause_natural    (const char32 *label, const char32 *defaultValue);
+void UiPause_word       (const char32 *label, const char32 *defaultValue);
+void UiPause_sentence   (const char32 *label, const char32 *defaultValue);
+void UiPause_text       (const char32 *label, const char32 *defaultValue);
+void UiPause_boolean    (const char32 *label, int defaultValue);
+void UiPause_choice     (const char32 *label, int defaultValue);
+void UiPause_optionMenu (const char32 *label, int defaultValue);
+void UiPause_option     (const char32 *label);
+void UiPause_comment    (const char32 *label);
 
 int UiPause_end (int numberOfContinueButtons, int defaultContinueButton, int cancelContinueButton,
-	const wchar_t *continueText1, const wchar_t *continueText2, const wchar_t *continueText3,
-	const wchar_t *continueText4, const wchar_t *continueText5, const wchar_t *continueText6,
-	const wchar_t *continueText7, const wchar_t *continueText8, const wchar_t *continueText9,
-	const wchar_t *continueText10, Interpreter interpreter);
+	const char32 *continueText1, const char32 *continueText2, const char32 *continueText3,
+	const char32 *continueText4, const char32 *continueText5, const char32 *continueText6,
+	const char32 *continueText7, const char32 *continueText8, const char32 *continueText9,
+	const char32 *continueText10, Interpreter interpreter);
 
 /* End of file UiPause.h */
 #endif
diff --git a/sys/abcio.cpp b/sys/abcio.cpp
index a30239f..722eff1 100644
--- a/sys/abcio.cpp
+++ b/sys/abcio.cpp
@@ -1,6 +1,6 @@
 /* abcio.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
  * pb 2006/02/20 corrected bingeti3, bingeti3LE, binputi3, binputi3LE
  * pb 2006/03/28 support for systems where a long is not 32 bits and a short is not 16 bits
  * pb 2007/07/21 MelderReadString
- * pb 2007/08/14 check for NULL pointer before Melder_isValidAscii
+ * pb 2007/08/14 check for null pointer before Melder_isValidAscii
  * pb 2009/03/18 modern enums
  * fb 2010/02/26 UTF-16 via bin(get|put)utf16()
  * pb 2010/03/09 more support for Unicode values above 0xFFFF
@@ -41,206 +41,211 @@
 #endif
 #include "abcio.h"
 
-const uint16_t endiannessTest = 769;
-
-/********** ASCII I/O **********/
-
-#define WCHAR_MINUS_1  (sizeof (wchar_t) == 2 ? 0xFFFF : 0xFFFFFFFF)
+/********** text I/O **********/
 
 static long getInteger (MelderReadText me) {
-	wchar_t buffer [41], c;
+	char buffer [41];
+	char32 c;
 	/*
 	 * Look for the first numeric character.
 	 */
-	for (c = MelderReadText_getChar (me); c != '-' && ! isdigit (c) && c != '+'; c = MelderReadText_getChar (me)) {
-		if (c == 0)
-			Melder_throw ("Early end of text detected while looking for an integer (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '!') {   // end-of-line comment?
-			while ((c = MelderReadText_getChar (me)) != '\n' && c != '\r') {
+	for (c = MelderReadText_getChar (me); c != U'-' && ! isdigit ((int) c) && c != U'+'; c = MelderReadText_getChar (me)) {
+		if (c == U'\0')
+			Melder_throw (U"Early end of text detected while looking for an integer (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'!') {   // end-of-line comment?
+			while ((c = MelderReadText_getChar (me)) != U'\n' && c != U'\r') {
 				if (c == 0)
-					Melder_throw ("Early end of text detected in comment while looking for an integer (line ", MelderReadText_getLineNumber (me), ").");
+					Melder_throw (U"Early end of text detected in comment while looking for an integer (line ", MelderReadText_getLineNumber (me), U").");
 			}
 		}
-		if (c == '\"')
-			Melder_throw ("Found a string while looking for an integer in text (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '<')
-			Melder_throw ("Found an enumerated value while looking for an integer in text (line ", MelderReadText_getLineNumber (me), ").");
-		while (c != ' ' && c != '\n' && c != '\t' && c != '\r') {
-			if (c == 0)
-				Melder_throw ("Early end of text detected in comment (line ", MelderReadText_getLineNumber (me), ").");
+		if (c == U'\"')
+			Melder_throw (U"Found a string while looking for an integer in text (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'<')
+			Melder_throw (U"Found an enumerated value while looking for an integer in text (line ", MelderReadText_getLineNumber (me), U").");
+		while (c != U' ' && c != U'\n' && c != U'\t' && c != U'\r') {
+			if (c == U'\0')
+				Melder_throw (U"Early end of text detected in comment (line ", MelderReadText_getLineNumber (me), U").");
 			c = MelderReadText_getChar (me);
 		}
 	}
 	int i = 0;
 	for (; i < 40; i ++) {
-		buffer [i] = c;
+		if (c > 127)
+			Melder_throw (U"Found strange text while looking for an integer in text (line ", MelderReadText_getLineNumber (me), U").");
+		buffer [i] = (char) (char8) c;   // guarded conversion down
 		c = MelderReadText_getChar (me);
-		if (c == 0) { break; }   // this may well be OK here
-		if (c == ' ' || c == '\n' || c == '\t' || c == '\r') break;
+		if (c == U'\0') { break; }   // this may well be OK here
+		if (c == U' ' || c == U'\n' || c == U'\t' || c == U'\r') break;
 	}
 	if (i >= 40)
-		Melder_throw ("Found strange text while looking for an integer in text (line ", MelderReadText_getLineNumber (me), ").");
+		Melder_throw (U"Found long text while looking for an integer in text (line ", MelderReadText_getLineNumber (me), U").");
 	buffer [i + 1] = '\0';
-	return wcstol (buffer, NULL, 10);
+	return strtol (buffer, nullptr, 10);
 }
 
 static unsigned long getUnsigned (MelderReadText me) {
-	wchar_t buffer [41], c;
-	for (c = MelderReadText_getChar (me); ! isdigit (c) && c != '+'; c = MelderReadText_getChar (me)) {
-		if (c == 0)
-			Melder_throw ("Early end of text detected while looking for an unsigned integer (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '!') {   // end-of-line comment?
+	char buffer [41];
+	char32 c;
+	for (c = MelderReadText_getChar (me); ! isdigit ((int) c) && c != U'+'; c = MelderReadText_getChar (me)) {
+		if (c == U'\0')
+			Melder_throw (U"Early end of text detected while looking for an unsigned integer (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'!') {   // end-of-line comment?
 			while ((c = MelderReadText_getChar (me)) != '\n' && c != '\r') {
-				if (c == 0)
-					Melder_throw ("Early end of text detected in comment while looking for an unsigned integer (line ", MelderReadText_getLineNumber (me), ").");
+				if (c == U'\0')
+					Melder_throw (U"Early end of text detected in comment while looking for an unsigned integer (line ", MelderReadText_getLineNumber (me), U").");
 			}
 		}
-		if (c == '\"')
-			Melder_throw ("Found a string while looking for an unsigned integer in text (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '<')
-			Melder_throw ("Found an enumerated value while looking for an unsigned integer in text (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '-')
-			Melder_throw ("Found a negative value while looking for an unsigned integer in text (line ", MelderReadText_getLineNumber (me), ").");
-		while (c != ' ' && c != '\n' && c != '\t' && c != '\r') {
-			if (c == 0)
-				Melder_throw ("Early end of text detected in comment (line ", MelderReadText_getLineNumber (me), ").");
+		if (c == U'\"')
+			Melder_throw (U"Found a string while looking for an unsigned integer in text (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'<')
+			Melder_throw (U"Found an enumerated value while looking for an unsigned integer in text (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'-')
+			Melder_throw (U"Found a negative value while looking for an unsigned integer in text (line ", MelderReadText_getLineNumber (me), U").");
+		while (c != U' ' && c != U'\n' && c != U'\t' && c != U'\r') {
+			if (c == U'\0')
+				Melder_throw (U"Early end of text detected in comment (line ", MelderReadText_getLineNumber (me), U").");
 			c = MelderReadText_getChar (me);
 		}
 	}
 	int i = 0;
 	for (i = 0; i < 40; i ++) {
-		buffer [i] = c;
+		if (c > 127)
+			Melder_throw (U"Found strange text while looking for an unsigned integer in text (line ", MelderReadText_getLineNumber (me), U").");
+		buffer [i] = (char) (char8) c;   // guarded conversion down
 		c = MelderReadText_getChar (me);
-		if (c == 0) { break; }   // this may well be OK here
-		if (c == ' ' || c == '\n' || c == '\t' || c == '\r') break;
+		if (c == U'\0') { break; }   // this may well be OK here
+		if (c == U' ' || c == U'\n' || c == U'\t' || c == U'\r') break;
 	}
 	if (i >= 40)
-		Melder_throw ("Found strange text while searching for an unsigned integer in text (line ", MelderReadText_getLineNumber (me), ").");
+		Melder_throw (U"Found long text while searching for an unsigned integer in text (line ", MelderReadText_getLineNumber (me), U").");
 	buffer [i + 1] = '\0';
-	return wcstoul (buffer, NULL, 10);
+	return strtoul (buffer, nullptr, 10);
 }
 
 static double getReal (MelderReadText me) {
 	int i;
-	wchar_t buffer [41], c, *slash;
+	char buffer [41], *slash;
+	char32 c;
 	do {
-		for (c = MelderReadText_getChar (me); c != '-' && ! isdigit (c) && c != '+'; c = MelderReadText_getChar (me)) {
-			if (c == 0)
-				Melder_throw ("Early end of text detected while looking for a real number (line ", MelderReadText_getLineNumber (me), ").");
-			if (c == '!') {   // end-of-line comment?
-				while ((c = MelderReadText_getChar (me)) != '\n' && c != '\r') {
-					if (c == 0)
-						Melder_throw ("Early end of text detected in comment while looking for a real number (line ", MelderReadText_getLineNumber (me), ").");
+		for (c = MelderReadText_getChar (me); c != U'-' && ! isdigit ((int) c) && c != U'+'; c = MelderReadText_getChar (me)) {
+			if (c == U'\0')
+				Melder_throw (U"Early end of text detected while looking for a real number (line ", MelderReadText_getLineNumber (me), U").");
+			if (c == U'!') {   // end-of-line comment?
+				while ((c = MelderReadText_getChar (me)) != U'\n' && c != U'\r') {
+					if (c == U'\0')
+						Melder_throw (U"Early end of text detected in comment while looking for a real number (line ", MelderReadText_getLineNumber (me), U").");
 				}
 			}
-			if (c == '\"')
-				Melder_throw ("Found a string while looking for a real number in text (line ", MelderReadText_getLineNumber (me), ").");
-			if (c == '<')
-				Melder_throw ("Found an enumerated value while looking for a real number in text (line ", MelderReadText_getLineNumber (me), ").");
-			while (c != ' ' && c != '\n' && c != '\t' && c != '\r') {
-				if (c == 0)
-					Melder_throw ("Early end of text detected in comment while looking for a real number (line ", MelderReadText_getLineNumber (me), ").");
+			if (c == U'\"')
+				Melder_throw (U"Found a string while looking for a real number in text (line ", MelderReadText_getLineNumber (me), U").");
+			if (c == U'<')
+				Melder_throw (U"Found an enumerated value while looking for a real number in text (line ", MelderReadText_getLineNumber (me), U").");
+			while (c != U' ' && c != U'\n' && c != U'\t' && c != U'\r') {
+				if (c == U'\0')
+					Melder_throw (U"Early end of text detected in comment while looking for a real number (line ", MelderReadText_getLineNumber (me), U").");
 				c = MelderReadText_getChar (me);
 			}
 		}
 		for (i = 0; i < 40; i ++) {
-			buffer [i] = c;
+			if (c > 127)
+				Melder_throw (U"Found strange text while looking for a real number in text (line ", MelderReadText_getLineNumber (me), U").");
+			buffer [i] = (char) (char8) c;   // guarded conversion down
 			c = MelderReadText_getChar (me);
-			if (c == 0) { break; }   // this may well be OK here
-			if (c == ' ' || c == '\n' || c == '\t' || c == '\r') break;
+			if (c == U'\0') { break; }   // this may well be OK here
+			if (c == U' ' || c == U'\n' || c == U'\t' || c == U'\r') break;
 		}
 		if (i >= 40)
-			Melder_throw ("Found strange text while searching for a real number in text (line ", MelderReadText_getLineNumber (me), ").");
+			Melder_throw (U"Found long text while searching for a real number in text (line ", MelderReadText_getLineNumber (me), U").");
 	} while (i == 0 && buffer [0] == '+');   // guard against single '+' symbols, which occur in complex numbers
 	buffer [i + 1] = '\0';
-	slash = wcschr (buffer, '/');
+	slash = strchr (buffer, '/');
 	if (slash) {
 		double numerator, denominator;
 		*slash = '\0';
-		numerator = Melder_atof (buffer), denominator = Melder_atof (slash + 1);
+		numerator = Melder_a8tof (buffer), denominator = Melder_a8tof (slash + 1);
 		if (numerator == HUGE_VAL || denominator == HUGE_VAL || denominator == 0.0)
 			return HUGE_VAL;
 		return numerator / denominator;
 	}
-	return Melder_atof (buffer);
+	return Melder_a8tof (buffer);
 }
 
-static short getEnum (MelderReadText me, int (*getValue) (const wchar_t *)) {
-	wchar_t buffer [41], c;
-	for (c = MelderReadText_getChar (me); c != '<'; c = MelderReadText_getChar (me)) {
-		if (c == 0)
-			Melder_throw ("Early end of text detected while looking for an enumerated value (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '!') {   /* End-of-line comment? */
-			while ((c = MelderReadText_getChar (me)) != '\n' && c != '\r') {
-				if (c == 0)
-					Melder_throw ("Early end of text detected in comment while looking for an enumerated value (line ", MelderReadText_getLineNumber (me), ").");
+static short getEnum (MelderReadText me, int (*getValue) (const char32 *)) {
+	char32 buffer [41], c;
+	for (c = MelderReadText_getChar (me); c != U'<'; c = MelderReadText_getChar (me)) {
+		if (c == U'\0')
+			Melder_throw (U"Early end of text detected while looking for an enumerated value (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'!') {   /* End-of-line comment? */
+			while ((c = MelderReadText_getChar (me)) != U'\n' && c != U'\r') {
+				if (c == U'\0')
+					Melder_throw (U"Early end of text detected in comment while looking for an enumerated value (line ", MelderReadText_getLineNumber (me), U").");
 			}
 		}
-		if (c == '-' || isdigit (c) || c == '+')
-			Melder_throw ("Found a number while looking for an enumerated value in text (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '\"')
-			Melder_throw ("Found a string while looking for an enumerated value in text (line ", MelderReadText_getLineNumber (me), ").");
-		while (c != ' ' && c != '\n' && c != '\t' && c != '\r') {
-			if (c == 0)
-				Melder_throw ("Early end of text detected in comment while looking for an enumerated value (line ", MelderReadText_getLineNumber (me), ").");
+		if (c == U'-' || isdigit ((int) c) || c == U'+')
+			Melder_throw (U"Found a number while looking for an enumerated value in text (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'\"')
+			Melder_throw (U"Found a string while looking for an enumerated value in text (line ", MelderReadText_getLineNumber (me), U").");
+		while (c != U' ' && c != U'\n' && c != U'\t' && c != U'\r') {
+			if (c == U'\0')
+				Melder_throw (U"Early end of text detected in comment while looking for an enumerated value (line ", MelderReadText_getLineNumber (me), U").");
 			c = MelderReadText_getChar (me);
 		}
 	}
 	int i = 0;
 	for (; i < 40; i ++) {
 		c = MelderReadText_getChar (me);   // read past first '<'
-		if (c == 0)
-			Melder_throw ("Early end of text detected while reading an enumerated value (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == ' ' || c == '\n' || c == '\t' || c == '\r')
-			Melder_throw ("No matching '>' while reading an enumerated value (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '>')
+		if (c == U'\0')
+			Melder_throw (U"Early end of text detected while reading an enumerated value (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U' ' || c == U'\n' || c == U'\t' || c == U'\r')
+			Melder_throw (U"No matching '>' while reading an enumerated value (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'>')
 			break;   // the expected closing bracket; not added to the buffer
 		buffer [i] = c;
 	}
 	if (i >= 40)
-		Melder_throw ("Found strange text while reading an enumerated value in text (line ", MelderReadText_getLineNumber (me), ").");
-	buffer [i] = '\0';
+		Melder_throw (U"Found strange text while reading an enumerated value in text (line ", MelderReadText_getLineNumber (me), U").");
+	buffer [i] = U'\0';
 	int value = getValue (buffer);
 	if (value < 0)
-		Melder_throw ("\"", buffer, "\" is not a value of the enumerated type.");
+		Melder_throw (U"\"", buffer, U"\" is not a value of the enumerated type.");
 	return value;
 }
 
-static wchar_t * getString (MelderReadText me) {
-	static MelderString buffer = { 0 };
+static char32 * getString (MelderReadText me) {
+	static MelderString buffer { 0 };
 	MelderString_empty (& buffer);
-	for (wchar_t c = MelderReadText_getChar (me); c != '\"'; c = MelderReadText_getChar (me)) {
-		if (c == 0)
-			Melder_throw ("Early end of text detected while looking for a string (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '!') {   // end-of-line comment?
+	for (char32 c = MelderReadText_getChar (me); c != U'\"'; c = MelderReadText_getChar (me)) {
+		if (c == U'\0')
+			Melder_throw (U"Early end of text detected while looking for a string (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'!') {   // end-of-line comment?
 			while ((c = MelderReadText_getChar (me)) != '\n' && c != '\r') {
-				if (c == 0)
-					Melder_throw ("Early end of text detected in comment while looking for a string (line ", MelderReadText_getLineNumber (me), ").");
+				if (c == U'\0')
+					Melder_throw (U"Early end of text detected in comment while looking for a string (line ", MelderReadText_getLineNumber (me), U").");
 			}
 		}
-		if (c == '-' || isdigit (c) || c == '+')
-			Melder_throw ("Found a number while looking for a string in text (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '<')
-			Melder_throw ("Found an enumerated value while looking for a string in text (line ", MelderReadText_getLineNumber (me), ").");
-		while (c != ' ' && c != '\n' && c != '\t' && c != '\r') {
-			if (c == 0)
-				Melder_throw ("Early end of text detected while looking for a string (line ", MelderReadText_getLineNumber (me), ").");
+		if (c == U'-' || isdigit ((int) c) || c == U'+')
+			Melder_throw (U"Found a number while looking for a string in text (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'<')
+			Melder_throw (U"Found an enumerated value while looking for a string in text (line ", MelderReadText_getLineNumber (me), U").");
+		while (c != U' ' && c != U'\n' && c != U'\t' && c != U'\r') {
+			if (c == U'\0')
+				Melder_throw (U"Early end of text detected while looking for a string (line ", MelderReadText_getLineNumber (me), U").");
 			c = MelderReadText_getChar (me);
 		}
 	}
 	for (int i = 0; 1; i ++) {
-		wchar_t c = MelderReadText_getChar (me);   // read past first '"'
-		if (c == 0)
-			Melder_throw ("Early end of text detected while reading a string (line ", MelderReadText_getLineNumber (me), ").");
-		if (c == '\"') {
-			wchar_t next = MelderReadText_getChar (me);
-			if (next == 0) { break; }   // closing quote is last character in file: OK
-			if (next != '\"') {
-				if (next == ' ' || next == '\n' || next == '\t' || next == '\r') {
+		char32 c = MelderReadText_getChar (me);   // read past first '"'
+		if (c == U'\0')
+			Melder_throw (U"Early end of text detected while reading a string (line ", MelderReadText_getLineNumber (me), U").");
+		if (c == U'\"') {
+			char32 next = MelderReadText_getChar (me);
+			if (next == U'\0') { break; }   // closing quote is last character in file: OK
+			if (next != U'\"') {
+				if (next == U' ' || next == U'\n' || next == U'\t' || next == U'\r') {
 					// closing quote is followed by whitespace: it is OK to skip this whitespace (no need to "ungetChar")
 				} else {
-					wchar_t kar2 [2] = { next, '\0' };
-					Melder_throw ("Character ", kar2, " following quote (line ", MelderReadText_getLineNumber (me), "). End of string or undoubled quote?");
+					char32 kar2 [2] = { next, U'\0' };
+					Melder_throw (U"Character ", kar2, U" following quote (line ", MelderReadText_getLineNumber (me), U"). End of string or undoubled quote?");
 				}
 				break;   // the expected closing double quote; not added to the buffer
 			}   // else: add only one of the two quotes to the buffer
@@ -262,10 +267,10 @@ int texgeti1 (MelderReadText text) {
 	try {
 		long externalValue = getInteger (text);
 		if (externalValue < -128 || externalValue > +127)
-			Melder_throw ("Value (", externalValue, ") out of range (-128 .. +127).");
+			Melder_throw (U"Value (", externalValue, U") out of range (-128 .. +127).");
 		return (int) externalValue;
 	} catch (MelderError) {
-		Melder_throw ("Signed small integer not read from text file.");
+		Melder_throw (U"Signed small integer not read from text file.");
 	}
 }
 
@@ -273,10 +278,10 @@ int texgeti2 (MelderReadText text) {
 	try {
 		long externalValue = getInteger (text);
 		if (externalValue < -32768 || externalValue > +32767)
-			Melder_throw ("Value (", externalValue, ") out of range (-32768 .. +32767).");
+			Melder_throw (U"Value (", externalValue, U") out of range (-32768 .. +32767).");
 		return (int) externalValue;
 	} catch (MelderError) {
-		Melder_throw ("Signed short integer not read from text file.");
+		Melder_throw (U"Signed short integer not read from text file.");
 	}
 }
 
@@ -285,7 +290,7 @@ long texgeti4 (MelderReadText text) {
 		long externalValue = getInteger (text);
 		return externalValue;
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not read from text file.");
+		Melder_throw (U"Signed integer not read from text file.");
 	}
 }
 
@@ -293,10 +298,10 @@ unsigned int texgetu1 (MelderReadText text) {
 	try {
 		unsigned long externalValue = getUnsigned (text);
 		if (externalValue > 255)
-			Melder_throw ("Value (", externalValue, ") out of range (0 .. 255).");
+			Melder_throw (U"Value (", externalValue, U") out of range (0 .. 255).");
 		return (unsigned int) externalValue;
 	} catch (MelderError) {
-		Melder_throw ("Unsigned small integer not read from text file.");
+		Melder_throw (U"Unsigned small integer not read from text file.");
 	}
 }
 
@@ -304,10 +309,10 @@ unsigned int texgetu2 (MelderReadText text) {
 	try {
 		unsigned long externalValue = getUnsigned (text);
 		if (externalValue > 65535)
-			Melder_throw ("Value (", externalValue, ") out of range (0 .. 65535).");
+			Melder_throw (U"Value (", externalValue, U") out of range (0 .. 65535).");
 		return (unsigned int) externalValue;
 	} catch (MelderError) {
-		Melder_throw ("Unsigned short integer not read from text file.");
+		Melder_throw (U"Unsigned short integer not read from text file.");
 	}
 }
 
@@ -316,7 +321,7 @@ unsigned long texgetu4 (MelderReadText text) {
 		unsigned long externalValue = getUnsigned (text);
 		return externalValue;
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not read from text file.");
+		Melder_throw (U"Unsigned integer not read from text file.");
 	}
 }
 
@@ -326,173 +331,173 @@ double texgetr10 (MelderReadText text) { return getReal (text); }
 fcomplex texgetc8 (MelderReadText text) { fcomplex z; z.re = getReal (text); z.im = getReal (text); return z; }
 dcomplex texgetc16 (MelderReadText text) { dcomplex z; z.re = getReal (text); z.im = getReal (text); return z; }
 
-short texgete1 (MelderReadText text, int (*getValue) (const wchar_t *)) { return getEnum (text, getValue); }
-short texgete2 (MelderReadText text, int (*getValue) (const wchar_t *)) { return getEnum (text, getValue); }
+short texgete1 (MelderReadText text, int (*getValue) (const char32 *)) { return getEnum (text, getValue); }
+short texgete2 (MelderReadText text, int (*getValue) (const char32 *)) { return getEnum (text, getValue); }
 short texgeteb (MelderReadText text) { return getEnum (text, kBoolean_getValue); }
 short texgeteq (MelderReadText text) { return getEnum (text, kQuestion_getValue); }
 short texgetex (MelderReadText text) { return getEnum (text, kExistence_getValue); }
-char *texgets2 (MelderReadText text) { return Melder_wcsToUtf8 (getString (text)); }
-char *texgets4 (MelderReadText text) { return Melder_wcsToUtf8 (getString (text)); }
-wchar_t *texgetw2 (MelderReadText text) { return Melder_wcsdup (getString (text)); }
-wchar_t *texgetw4 (MelderReadText text) { return Melder_wcsdup (getString (text)); }
+char *texgets2 (MelderReadText text) { return (char *) Melder_32to8 (getString (text)); }
+char *texgets4 (MelderReadText text) { return (char *) Melder_32to8 (getString (text)); }
+char32 *texgetw2 (MelderReadText text) { return Melder_dup   (getString (text)); }
+char32 *texgetw4 (MelderReadText text) { return Melder_dup   (getString (text)); }
 
 void texindent (MelderFile file) { file -> indent += 4; }
 void texexdent (MelderFile file) { file -> indent -= 4; }
 void texresetindent (MelderFile file) { file -> indent = 0; }
 
-void texputintro (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputintro (MelderFile file, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	if (file -> verbose) {
-		MelderFile_write (file, L"\n");
+		MelderFile_write (file, U"\n");
 		for (int iindent = 1; iindent <= file -> indent; iindent ++) {
-			MelderFile_write (file, L" ");
+			MelderFile_write (file, U" ");
 		}
 		MelderFile_write (file,
-			s1 && s1 [0] == 'd' && s1 [1] == '_' ? & s1 [2] : & s1 [0],
-			s2 && s2 [0] == 'd' && s2 [1] == '_' ? & s2 [2] : & s2 [0],
-			s3 && s3 [0] == 'd' && s3 [1] == '_' ? & s3 [2] : & s3 [0],
-			s4 && s4 [0] == 'd' && s4 [1] == '_' ? & s4 [2] : & s4 [0],
-			s5 && s5 [0] == 'd' && s5 [1] == '_' ? & s5 [2] : & s5 [0],
-			s6 && s6 [0] == 'd' && s6 [1] == '_' ? & s6 [2] : & s6 [0]);
+			s1 && s1 [0] == U'd' && s1 [1] == U'_' ? & s1 [2] : & s1 [0],
+			s2 && s2 [0] == U'd' && s2 [1] == U'_' ? & s2 [2] : & s2 [0],
+			s3 && s3 [0] == U'd' && s3 [1] == U'_' ? & s3 [2] : & s3 [0],
+			s4 && s4 [0] == U'd' && s4 [1] == U'_' ? & s4 [2] : & s4 [0],
+			s5 && s5 [0] == U'd' && s5 [1] == U'_' ? & s5 [2] : & s5 [0],
+			s6 && s6 [0] == U'd' && s6 [1] == U'_' ? & s6 [2] : & s6 [0]);
 	}
 	file -> indent += 4;
 }
 
 #define PUTLEADER  \
-	MelderFile_write (file, L"\n"); \
+	MelderFile_write (file, U"\n"); \
 	if (file -> verbose) { \
 		for (int iindent = 1; iindent <= file -> indent; iindent ++) { \
-			MelderFile_write (file, L" "); \
+			MelderFile_write (file, U" "); \
 		} \
 		MelderFile_write (file, \
-			s1 && s1 [0] == 'd' && s1 [1] == '_' ? & s1 [2] : & s1 [0], \
-			s2 && s2 [0] == 'd' && s2 [1] == '_' ? & s2 [2] : & s2 [0], \
-			s3 && s3 [0] == 'd' && s3 [1] == '_' ? & s3 [2] : & s3 [0], \
-			s4 && s4 [0] == 'd' && s4 [1] == '_' ? & s4 [2] : & s4 [0], \
-			s5 && s5 [0] == 'd' && s5 [1] == '_' ? & s5 [2] : & s5 [0], \
-			s6 && s6 [0] == 'd' && s6 [1] == '_' ? & s6 [2] : & s6 [0]); \
+			s1 && s1 [0] == U'd' && s1 [1] == U'_' ? & s1 [2] : & s1 [0], \
+			s2 && s2 [0] == U'd' && s2 [1] == U'_' ? & s2 [2] : & s2 [0], \
+			s3 && s3 [0] == U'd' && s3 [1] == U'_' ? & s3 [2] : & s3 [0], \
+			s4 && s4 [0] == U'd' && s4 [1] == U'_' ? & s4 [2] : & s4 [0], \
+			s5 && s5 [0] == U'd' && s5 [1] == U'_' ? & s5 [2] : & s5 [0], \
+			s6 && s6 [0] == U'd' && s6 [1] == U'_' ? & s6 [2] : & s6 [0]); \
 	}
 
-void texputi1 (MelderFile file, int i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputi1 (MelderFile file, int i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, Melder_integer (i), file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, i, file -> verbose ? U" " : nullptr);
 }
-void texputi2 (MelderFile file, int i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputi2 (MelderFile file, int i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, Melder_integer (i), file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, i, file -> verbose ? U" " : nullptr);
 }
-void texputi4 (MelderFile file, long i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputi4 (MelderFile file, long i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, Melder_integer (i), file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, i, file -> verbose ? U" " : nullptr);
 }
-void texputu1 (MelderFile file, unsigned int u, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputu1 (MelderFile file, unsigned int u, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, Melder_integer (u), file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, u, file -> verbose ? U" " : nullptr);
 }
-void texputu2 (MelderFile file, unsigned int u, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputu2 (MelderFile file, unsigned int u, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, Melder_integer (u), file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, u, file -> verbose ? U" " : nullptr);
 }
-void texputu4 (MelderFile file, unsigned long u, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputu4 (MelderFile file, unsigned long u, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, Melder_integer (u), file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, u, file -> verbose ? U" " : nullptr);
 }
-void texputr4 (MelderFile file, double x, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputr4 (MelderFile file, double x, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, Melder_single (x), file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, Melder_single (x), file -> verbose ? U" " : nullptr);
 }
-void texputr8 (MelderFile file, double x, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputr8 (MelderFile file, double x, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, Melder_double (x), file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, x, file -> verbose ? U" " : nullptr);
 }
-void texputc8 (MelderFile file, fcomplex z, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputc8 (MelderFile file, fcomplex z, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, Melder_single (z.re),
-		file -> verbose ? L" + " : L" ", Melder_single (z.im), file -> verbose ? L" i " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, Melder_single (z.re),
+		file -> verbose ? U" + " : U" ", Melder_single (z.im), file -> verbose ? U" i " : nullptr);
 }
-void texputc16 (MelderFile file, dcomplex z, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputc16 (MelderFile file, dcomplex z, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, Melder_double (z.re),
-		file -> verbose ? L" + " : L" ", Melder_double (z.im), file -> verbose ? L" i " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, z.re,
+		file -> verbose ? U" + " : U" ", z.im, file -> verbose ? U" i " : nullptr);
 }
-void texpute1 (MelderFile file, int i, const wchar_t * (*getText) (int), const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texpute1 (MelderFile file, int i, const char32 * (*getText) (int), const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = <" : L"<", getText (i), file -> verbose ? L"> " : L">");
+	MelderFile_write (file, file -> verbose ? U" = <" : U"<", getText (i), file -> verbose ? U"> " : U">");
 }
-void texpute2 (MelderFile file, int i, const wchar_t * (*getText) (int), const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texpute2 (MelderFile file, int i, const char32 * (*getText) (int), const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = <" : L"<", getText (i), file -> verbose ? L"> " : L">");
+	MelderFile_write (file, file -> verbose ? U" = <" : U"<", getText (i), file -> verbose ? U"> " : U">");
 }
-void texputeb (MelderFile file, bool i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputeb (MelderFile file, bool i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = " : NULL, i ? L"<true>" : L"<false>", file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U" = " : nullptr, i ? U"<true>" : U"<false>", file -> verbose ? U" " : nullptr);
 }
-void texputeq (MelderFile file, bool i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputeq (MelderFile file, bool i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L"? " : NULL, i ? L"<yes>" : L"<no>", file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U"? " : nullptr, i ? U"<yes>" : U"<no>", file -> verbose ? U" " : nullptr);
 }
-void texputex (MelderFile file, bool i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputex (MelderFile file, bool i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L"? " : NULL, i ? L"<exists>" : L"<absent>", file -> verbose ? L" " : NULL);
+	MelderFile_write (file, file -> verbose ? U"? " : nullptr, i ? U"<exists>" : U"<absent>", file -> verbose ? U" " : nullptr);
 }
-void texputs1 (MelderFile file, const char *s, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputs1 (MelderFile file, const char *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = \"" : L"\"");
-	if (s != NULL) {
+	MelderFile_write (file, file -> verbose ? U" = \"" : U"\"");
+	if (s) {
 		char c;
 		while ((c = *s ++) != '\0') {
-			MelderFile_writeCharacter (file, c);
-			if (c == '\"') MelderFile_writeCharacter (file, c);   // double any internal quotes
+			MelderFile_writeCharacter (file, (char32) (char8) c);
+			if (c == U'\"') MelderFile_writeCharacter (file, (char32) (char8) c);   // double any internal quotes
 		}
 	}
-	MelderFile_write (file, file -> verbose ? L"\" " : L"\"");
+	MelderFile_write (file, file -> verbose ? U"\" " : U"\"");
 }
-void texputs2 (MelderFile file, const char *s, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputs2 (MelderFile file, const char *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = \"" : L"\"");
-	if (s != NULL) {
+	MelderFile_write (file, file -> verbose ? U" = \"" : U"\"");
+	if (s) {
 		char c;
 		while ((c = *s ++) != '\0') {
-			MelderFile_writeCharacter (file, c);
-			if (c == '\"') MelderFile_writeCharacter (file, c);   // double any internal quotes
+			MelderFile_writeCharacter (file, (char32) (char8) c);
+			if (c == '\"') MelderFile_writeCharacter (file, (char32) (char8) c);   // double any internal quotes
 		}
 	}
-	MelderFile_write (file, file -> verbose ? L"\" " : L"\"");
+	MelderFile_write (file, file -> verbose ? U"\" " : U"\"");
 }
-void texputs4 (MelderFile file, const char *s, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputs4 (MelderFile file, const char *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = \"" : L"\"");
-	if (s != NULL) {
+	MelderFile_write (file, file -> verbose ? U" = \"" : U"\"");
+	if (s) {
 		char c;
 		while ((c = *s ++) != '\0') {
-			MelderFile_writeCharacter (file, c);
-			if (c == '\"') MelderFile_writeCharacter (file, c);   // double any internal quotes
+			MelderFile_writeCharacter (file, (char32) (char8) c);
+			if (c == '\"') MelderFile_writeCharacter (file, (char32) (char8) c);   // double any internal quotes
 		}
 	}
-	MelderFile_write (file, file -> verbose ? L"\" " : L"\"");
+	MelderFile_write (file, file -> verbose ? U"\" " : U"\"");
 }
-void texputw2 (MelderFile file, const wchar_t *s, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputw2 (MelderFile file, const char32 *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = \"" : L"\"");
-	if (s != NULL) {
-		wchar_t c;
-		while ((c = *s ++) != '\0') {
+	MelderFile_write (file, file -> verbose ? U" = \"" : U"\"");
+	if (s) {
+		char32 c;
+		while ((c = *s ++) != U'\0') {
 			MelderFile_writeCharacter (file, c);
-			if (c == '\"') MelderFile_writeCharacter (file, c);   // double any internal quotes
+			if (c == U'\"') MelderFile_writeCharacter (file, c);   // double any internal quotes
 		}
 	}
-	MelderFile_write (file, file -> verbose ? L"\" " : L"\"");
+	MelderFile_write (file, file -> verbose ? U"\" " : U"\"");
 }
-void texputw4 (MelderFile file, const wchar_t *s, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
+void texputw4 (MelderFile file, const char32 *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6) {
 	PUTLEADER
-	MelderFile_write (file, file -> verbose ? L" = \"" : L"\"");
-	if (s != NULL) {
-		wchar_t c;
+	MelderFile_write (file, file -> verbose ? U" = \"" : U"\"");
+	if (s) {
+		char32 c;
 		while ((c = *s ++) != '\0') {
 			MelderFile_writeCharacter (file, c);
 			if (c == '\"') MelderFile_writeCharacter (file, c);   // double any internal quotes
 		}
 	}
-	MelderFile_write (file, file -> verbose ? L"\" " : L"\"");
+	MelderFile_write (file, file -> verbose ? U"\" " : U"\"");
 }
 
 /********** machine-independent binary I/O **********/
@@ -625,68 +630,68 @@ void texputw4 (MelderFile file, const wchar_t *s, const wchar_t *s1, const wchar
 
 /*************** End of Apple Computer intermezzo. ***************/
 
-static void readError (FILE *f, const char *text) {
-	Melder_throw (feof (f) ? "Reached end of file" : "Error in file", " while trying to read ", text);
+static void readError (FILE *f, const char32 *text) {
+	Melder_throw (feof (f) ? U"Reached end of file" : U"Error in file", U" while trying to read ", text);
 }
 
-static void writeError (const char *text) {
-	Melder_throw ("Error in file while trying to write ", text);
+static void writeError (const char32 *text) {
+	Melder_throw (U"Error in file while trying to write ", text);
 }
 
 unsigned int bingetu1 (FILE *f) {
 	try {
 		int externalValue = getc (f);   // either -1 (EOF) or in the range 0..255
-		if (externalValue < 0) readError (f, "a byte.");
+		if (externalValue < 0) readError (f, U"a byte.");
 		return (unsigned int) externalValue;
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not read from 1 byte in binary file.");
+		Melder_throw (U"Unsigned integer not read from 1 byte in binary file.");
 	}
 }
 
 void binputu1 (unsigned int u, FILE *f) {
 	try {
-		if (putc ((int) u, f) < 0) writeError ("a byte.");   //
+		if (putc ((int) u, f) < 0) writeError (U"a byte.");
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not written to 1 byte in binary file.");
+		Melder_throw (U"Unsigned integer not written to 1 byte in binary file.");
 	}
 }
 
 int bingeti1 (FILE *f) {
 	try {
 		int externalValue = getc (f);
-		if (externalValue < 0) readError (f, "a byte.");
+		if (externalValue < 0) readError (f, U"a byte.");
 		return (signed char) externalValue;   // this converts e.g. 200 to -56
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not read from 1 byte in binary file.");
+		Melder_throw (U"Signed integer not read from 1 byte in binary file.");
 	}
 }
 
 void binputi1 (int u, FILE *f) {
 	try {
-		if (putc (u, f) < 0) writeError ("a byte.");
+		if (putc (u, f) < 0) writeError (U"a byte.");
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not written to 1 byte in binary file.");
+		Melder_throw (U"Signed integer not written to 1 byte in binary file.");
 	}
 }
 
-int bingete1 (FILE *f, int min, int max, const wchar_t *type) {
+int bingete1 (FILE *f, int min, int max, const char32 *type) {
 	try {
 		int externalValue = getc (f);
-		if (externalValue < 0) readError (f, "a byte.");
+		if (externalValue < 0) readError (f, U"a byte.");
 		int result = (signed char) externalValue;   // this converts e.g. 200 to -56, so the enumerated type is signed
 		if (result < min || result > max)
-			Melder_throw (result, " is not a value of enumerated type <", type, ">.");
+			Melder_throw (result, U" is not a value of enumerated type <", type, U">.");
 		return result;
 	} catch (MelderError) {
-		Melder_throw ("Enumerated type not read from 1 byte in binary file.");
+		Melder_throw (U"Enumerated type not read from 1 byte in binary file.");
 	}
 }
 
 void binpute1 (int value, FILE *f) {
 	try {
-		if (putc (value, f) < 0) writeError ("a byte.");
+		if (putc (value, f) < 0) writeError (U"a byte.");
 	} catch (MelderError) {
-		Melder_throw ("Enumerated type not written to 1 byte in binary file.");
+		Melder_throw (U"Enumerated type not written to 1 byte in binary file.");
 	}
 }
 
@@ -697,7 +702,7 @@ static unsigned char readBuffer;
 unsigned int bingetb##nbits (FILE *f) { \
 	if (bitsInReadBuffer < nbits) { \
 		int externalValue = fgetc (f); \
-		if (externalValue < 0) readError (f, "a bit."); \
+		if (externalValue < 0) readError (f, U"a bit."); \
 		readBuffer = (unsigned char) externalValue; \
 		bitsInReadBuffer = 8; \
 	} \
@@ -715,208 +720,208 @@ macro_bingetb (7)
 
 void bingetb (FILE *f) { (void) f; bitsInReadBuffer = 0; }
 
-int16_t bingeti2 (FILE *f) {
+int16 bingeti2 (FILE *f) {
 	try {
 		if (binario_16bitBE && Melder_debug != 18) {
-			int16_t s;
-			if (fread (& s, sizeof (int16_t), 1, f) != 1) readError (f, "a signed 16-bit integer.");
+			int16 s;
+			if (fread (& s, sizeof (int16), 1, f) != 1) readError (f, U"a signed 16-bit integer.");
 			return s;
 		} else {
-			unsigned char bytes [2];
-			if (fread (bytes, sizeof (unsigned char), 2, f) != 2) readError (f, "two bytes.");
-			return (int16_t)   // reinterpret sign bit
-				((uint16_t) ((uint16_t) bytes [0] << 8) |
-				             (uint16_t) bytes [1]);
+			uint8 bytes [2];
+			if (fread (bytes, sizeof (uint8), 2, f) != 2) readError (f, U"two bytes.");
+			return (int16)   // reinterpret sign bit
+				((uint16) ((uint16) bytes [0] << 8) |
+						   (uint16) bytes [1]);
 		}
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not read from 2 bytes in binary file.");
+		Melder_throw (U"Signed integer not read from 2 bytes in binary file.");
 	}
 }
 
-int16_t bingeti2LE (FILE *f) {
+int16 bingeti2LE (FILE *f) {
 	try {
 		if (binario_16bitLE && Melder_debug != 18) {
-			int16_t s;
-			if (fread (& s, sizeof (int16_t), 1, f) != 1) readError (f, "a signed 16-bit integer.");
+			int16 s;
+			if (fread (& s, sizeof (int16), 1, f) != 1) readError (f, U"a signed 16-bit integer.");
 			return s;
 		} else {
-			unsigned char bytes [2];
-			if (fread (bytes, sizeof (unsigned char), 2, f) != 2) readError (f, "two bytes.");
-			return (int16_t)   // reinterpret sign bit
-				((uint16_t) ((uint16_t) bytes [1] << 8) |
-				             (uint16_t) bytes [0]);
+			uint8 bytes [2];
+			if (fread (bytes, sizeof (uint8), 2, f) != 2) readError (f, U"two bytes.");
+			return (int16)   // reinterpret sign bit
+				((uint16) ((uint16) bytes [1] << 8) |
+						   (uint16) bytes [0]);
 		}
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not read from 2 bytes in binary file.");
+		Melder_throw (U"Signed integer not read from 2 bytes in binary file.");
 	}
 }
 
 uint16_t bingetu2 (FILE *f) {
 	try {
 		if (binario_16bitBE && Melder_debug != 18) {
-			uint16_t s;
-			if (fread (& s, sizeof (uint16_t), 1, f) != 1) readError (f, "an unsigned 16-bit integer.");
+			uint16 s;
+			if (fread (& s, sizeof (uint16), 1, f) != 1) readError (f, U"an unsigned 16-bit integer.");
 			return s;   // without sign extension
 		} else {
-			unsigned char bytes [2];
-			if (fread (bytes, sizeof (unsigned char), 2, f) != 2) readError (f, "two bytes.");
+			uint8 bytes [2];
+			if (fread (bytes, sizeof (uint8), 2, f) != 2) readError (f, U"two bytes.");
 			return
-				(uint16_t) ((uint16_t) bytes [0] << 8) |
-				            (uint16_t) bytes [1];
+				(uint16) ((uint16) bytes [0] << 8) |
+						  (uint16) bytes [1];
 		}
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not read from 2 bytes in binary file.");
+		Melder_throw (U"Unsigned integer not read from 2 bytes in binary file.");
 	}
 }
 
 uint16_t bingetu2LE (FILE *f) {
 	try {
 		if (binario_16bitLE && Melder_debug != 18) {
-			uint16_t s;
-			if (fread (& s, sizeof (uint16_t), 1, f) != 1) readError (f, "an unsigned 16-bit integer.");
+			uint16 s;
+			if (fread (& s, sizeof (uint16), 1, f) != 1) readError (f, U"an unsigned 16-bit integer.");
 			return s;   // without sign extension
 		} else {
-			unsigned char bytes [2];
-			if (fread (bytes, sizeof (unsigned char), 2, f) != 2) readError (f, "two bytes.");
+			uint8 bytes [2];
+			if (fread (bytes, sizeof (uint8), 2, f) != 2) readError (f, U"two bytes.");
 			return
-				(uint16_t) ((uint16_t) bytes [1] << 8) |
-				            (uint16_t) bytes [0];
+				(uint16) ((uint16) bytes [1] << 8) |
+						  (uint16) bytes [0];
 		}
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not read from 2 bytes in binary file.");
+		Melder_throw (U"Unsigned integer not read from 2 bytes in binary file.");
 	}
 }
 
-int bingete2 (FILE *f, int min, int max, const wchar_t *type) {
+int bingete2 (FILE *f, int min, int max, const char32 *type) {
 	try {
-		int16_t result;
+		int16 result;
 		if (binario_16bitBE && Melder_debug != 18) {
-			if (fread (& result, sizeof (uint16_t), 1, f) != 1) readError (f, "a signed 16-bit integer.");
+			if (fread (& result, sizeof (int16), 1, f) != 1) readError (f, U"a signed 16-bit integer.");
 		} else {
-			unsigned char bytes [2];
-			if (fread (bytes, sizeof (unsigned char), 2, f) != 2) readError (f, "two bytes.");
-			uint16_t externalValue =
-				(uint16_t) ((uint16_t) bytes [0] << 8) |
-				            (uint16_t) bytes [1];
-			result = (int16_t) externalValue;
+			uint8 bytes [2];
+			if (fread (bytes, sizeof (uint8), 2, f) != 2) readError (f, U"two bytes.");
+			uint16 externalValue =
+				(uint16) ((uint16) bytes [0] << 8) |
+						  (uint16) bytes [1];
+			result = (int16) externalValue;
 		}
 		if (result < min || result > max)
-			Melder_throw (result, " is not a value of enumerated type \"", type, L"\".");
+			Melder_throw (result, U" is not a value of enumerated type \"", type, U"\".");
 		return (int) result;
 	} catch (MelderError) {
-		Melder_throw ("Enumerated value not read from 2 bytes in binary file.");
+		Melder_throw (U"Enumerated value not read from 2 bytes in binary file.");
 	}
 }
 
-int32_t bingeti3 (FILE *f) {
+int32 bingeti3 (FILE *f) {
 	try {
-		unsigned char bytes [3];
-		if (fread (bytes, sizeof (unsigned char), 3, f) != 3) readError (f, "three bytes.");
-		uint32_t externalValue =
-			(uint32_t) ((uint32_t) bytes [0] << 16) |
-			(uint32_t) ((uint32_t) bytes [1] << 8) |
-			            (uint32_t) bytes [2];
+		uint8 bytes [3];
+		if (fread (bytes, sizeof (uint8), 3, f) != 3) readError (f, U"three bytes.");
+		uint32 externalValue =
+			(uint32) ((uint32) bytes [0] << 16) |
+			(uint32) ((uint32) bytes [1] << 8) |
+					  (uint32) bytes [2];
 		if ((bytes [0] & 128) != 0)   // is the 24-bit sign bit on?
 			externalValue |= 0xFF000000;   // extend negative sign to 32 bits
 		return (int32_t) externalValue;   // reinterpret sign bit
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not read from 3 bytes in binary file.");
+		Melder_throw (U"Signed integer not read from 3 bytes in binary file.");
 	}
 }
 
-int32_t bingeti3LE (FILE *f) {
+int32 bingeti3LE (FILE *f) {
 	try {
-		unsigned char bytes [3];
-		if (fread (bytes, sizeof (unsigned char), 3, f) != 3) readError (f, "three bytes.");
-		uint32_t externalValue =
-			(uint32_t) ((uint32_t) bytes [2] << 16) |
-			(uint32_t) ((uint32_t) bytes [1] << 8) |
-			            (uint32_t) bytes [0];
+		uint8 bytes [3];
+		if (fread (bytes, sizeof (uint8), 3, f) != 3) readError (f, U"three bytes.");
+		uint32 externalValue =
+			(uint32) ((uint32) bytes [2] << 16) |
+			(uint32) ((uint32) bytes [1] << 8) |
+					  (uint32) bytes [0];
 		if ((bytes [2] & 128) != 0)   // is the 24-bit sign bit on?
 			externalValue |= 0xFF000000;   // extend negative sign to 32 bits
 		return (int32_t) externalValue;   // reinterpret sign bit
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not read from 3 bytes in binary file.");
+		Melder_throw (U"Signed integer not read from 3 bytes in binary file.");
 	}
 }
 
-int32_t bingeti4 (FILE *f) {
+int32 bingeti4 (FILE *f) {
 	try {
 		if (binario_32bitBE && Melder_debug != 18) {
-			int32_t l;
-			if (fread (& l, sizeof (int32_t), 1, f) != 1) readError (f, "a signed 32-bit integer.");
+			int32 l;
+			if (fread (& l, sizeof (int32), 1, f) != 1) readError (f, U"a signed 32-bit integer.");
 			return l;
 		} else {
-			unsigned char bytes [4];
-			if (fread (bytes, sizeof (unsigned char), 4, f) != 4) readError (f, "four bytes.");
-			return (int32_t)
-				((uint32_t) ((uint32_t) bytes [0] << 24) |
-				 (uint32_t) ((uint32_t) bytes [1] << 16) |
-				 (uint32_t) ((uint32_t) bytes [2] << 8) |
-				             (uint32_t) bytes [3]);
+			uint8 bytes [4];
+			if (fread (bytes, sizeof (uint8), 4, f) != 4) readError (f, U"four bytes.");
+			return (int32)
+				((uint32) ((uint32) bytes [0] << 24) |
+				 (uint32) ((uint32) bytes [1] << 16) |
+				 (uint32) ((uint32) bytes [2] << 8) |
+						   (uint32) bytes [3]);
 		}
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not read from 4 bytes in binary file.");
+		Melder_throw (U"Signed integer not read from 4 bytes in binary file.");
 	}
 }
 
-int32_t bingeti4LE (FILE *f) {
+int32 bingeti4LE (FILE *f) {
 	try {
 		if (binario_32bitLE && Melder_debug != 18) {
-			int32_t l;
-			if (fread (& l, sizeof (int32_t), 1, f) != 1) readError (f, "a signed 32-bit integer.");
+			int32 l;
+			if (fread (& l, sizeof (int32), 1, f) != 1) readError (f, U"a signed 32-bit integer.");
 			return l;
 		} else {
-			unsigned char bytes [4];
-			if (fread (bytes, sizeof (unsigned char), 4, f) != 4) readError (f, "four bytes.");
-			return (int32_t)   // reinterpret sign bit
-				((uint32_t) ((uint32_t) bytes [3] << 24) |
-				 (uint32_t) ((uint32_t) bytes [2] << 16) |
-				 (uint32_t) ((uint32_t) bytes [1] << 8) |
-				             (uint32_t) bytes [0]);
+			uint8 bytes [4];
+			if (fread (bytes, sizeof (uint8), 4, f) != 4) readError (f, U"four bytes.");
+			return (int32)   // reinterpret sign bit
+				((uint32) ((uint32) bytes [3] << 24) |
+				 (uint32) ((uint32) bytes [2] << 16) |
+				 (uint32) ((uint32) bytes [1] << 8) |
+						   (uint32) bytes [0]);
 		}
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not read from 4 bytes in binary file.");
+		Melder_throw (U"Signed integer not read from 4 bytes in binary file.");
 	}
 }
 
-uint32_t bingetu4 (FILE *f) {
+uint32 bingetu4 (FILE *f) {
 	try {
 		if (binario_32bitBE && Melder_debug != 18) {
 			uint32_t l;
-			if (fread (& l, sizeof (uint32_t), 1, f) != 1) readError (f, "an unsigned 32-bit integer.");
+			if (fread (& l, sizeof (uint32_t), 1, f) != 1) readError (f, U"an unsigned 32-bit integer.");
 			return l;
 		} else {
-			unsigned char bytes [4];
-			if (fread (bytes, sizeof (unsigned char), 4, f) != 4) readError (f, "four bytes.");
+			uint8 bytes [4];
+			if (fread (bytes, sizeof (uint8), 4, f) != 4) readError (f, U"four bytes.");
 			return
-				(uint32_t) ((uint32_t) bytes [0] << 24) |
-				(uint32_t) ((uint32_t) bytes [1] << 16) |
-				(uint32_t) ((uint32_t) bytes [2] << 8) |
-				            (uint32_t) bytes [3];
+				(uint32) ((uint32) bytes [0] << 24) |
+				(uint32) ((uint32) bytes [1] << 16) |
+				(uint32) ((uint32) bytes [2] << 8) |
+						  (uint32) bytes [3];
 		}
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not read from 4 bytes in binary file.");
+		Melder_throw (U"Unsigned integer not read from 4 bytes in binary file.");
 	}
 }
 
-uint32_t bingetu4LE (FILE *f) {
+uint32 bingetu4LE (FILE *f) {
 	try {
 		if (binario_32bitLE && Melder_debug != 18) {
-			uint32_t l;
-			if (fread (& l, sizeof (uint32_t), 1, f) != 1) readError (f, "an unsigned 32-bit integer.");
+			uint32 l;
+			if (fread (& l, sizeof (uint32), 1, f) != 1) readError (f, U"an unsigned 32-bit integer.");
 			return l;
 		} else {
-			unsigned char bytes [4];
-			if (fread (bytes, sizeof (unsigned char), 4, f) != 4) readError (f, "four bytes.");
+			uint8 bytes [4];
+			if (fread (bytes, sizeof (uint8), 4, f) != 4) readError (f, U"four bytes.");
 			return
-				(uint32_t) ((uint32_t) bytes [3] << 24) |
-				(uint32_t) ((uint32_t) bytes [2] << 16) |
-				(uint32_t) ((uint32_t) bytes [1] << 8) |
-				            (uint32_t) bytes [0];
+				(uint32) ((uint32) bytes [3] << 24) |
+				(uint32) ((uint32) bytes [2] << 16) |
+				(uint32) ((uint32) bytes [1] << 8) |
+						  (uint32) bytes [0];
 		}
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not read from 4 bytes in binary file.");
+		Melder_throw (U"Unsigned integer not read from 4 bytes in binary file.");
 	}
 }
 
@@ -924,30 +929,30 @@ double bingetr4 (FILE *f) {
 	try {
 		if (binario_floatIEEE4msb && Melder_debug != 18) {
 			float x;
-			if (fread (& x, sizeof (float), 1, f) != 1) readError (f, "a 32-bit floating-point number.");
+			if (fread (& x, sizeof (float), 1, f) != 1) readError (f, U"a 32-bit floating-point number.");
 			return x;
 		} else {
-			unsigned char bytes [4];
-			if (fread (bytes, sizeof (unsigned char), 4, f) != 4) readError (f, "four bytes.");
-			int32_t exponent = (int32_t)
-				((uint32_t) ((uint32_t) ((uint32_t) bytes [0] & 0x7F) << 1) |
-				 (uint32_t) ((uint32_t) ((uint32_t) bytes [1] & 0x80) >> 7));
-			uint32_t mantissa =
-				(uint32_t) ((uint32_t) ((uint32_t) bytes [1] & 0x7F) << 16) |
-				            (uint32_t) ((uint32_t) bytes [2] << 8) |
-				                        (uint32_t) bytes [3];
+			uint8 bytes [4];
+			if (fread (bytes, sizeof (uint8), 4, f) != 4) readError (f, U"four bytes.");
+			int32 exponent = (int32)
+				((uint32) ((uint32) ((uint32) bytes [0] & 0x0000007F) << 1) |
+				 (uint32) ((uint32) ((uint32) bytes [1] & 0x00000080) >> 7));   // between 0 and 255 (it's signed because we're going to subtract something)
+			uint32 mantissa =
+				(uint32) ((uint32) ((uint32) bytes [1] & 0x0000007F) << 16) |
+						  (uint32) ((uint32) bytes [2] << 8) |
+									(uint32) bytes [3];
 			double x;
 			if (exponent == 0)
 				if (mantissa == 0) x = 0.0;
 				else x = ldexp ((double) mantissa, exponent - 149);   // denormalized
-			else if (exponent == 0x00FF)   // Infinity or Not-a-Number
+			else if (exponent == 0x000000FF)   // Infinity or Not-a-Number
 				x = HUGE_VAL;
 			else   // finite
 				x = ldexp ((double) (mantissa | 0x00800000), exponent - 150);
 			return bytes [0] & 0x80 ? - x : x;
 		}
 	} catch (MelderError) {
-		Melder_throw ("Floating-point number not read from 4 bytes in binary file.");
+		Melder_throw (U"Floating-point number not read from 4 bytes in binary file.");
 	}
 }
 
@@ -955,30 +960,30 @@ double bingetr4LE (FILE *f) {
 	try {
 		if (binario_floatIEEE4lsb && Melder_debug != 18) {
 			float x;
-			if (fread (& x, sizeof (float), 1, f) != 1) readError (f, "a 32-bit floating-point number.");
+			if (fread (& x, sizeof (float), 1, f) != 1) readError (f, U"a 32-bit floating-point number.");
 			return x;
 		} else {
-			unsigned char bytes [4];
-			if (fread (bytes, sizeof (unsigned char), 4, f) != 4) readError (f, "four bytes.");
-			int32_t exponent = (int32_t)
-				((uint32_t) ((uint32_t) ((uint32_t) bytes [3] & 0x7F) << 1) |
-				 (uint32_t) ((uint32_t) ((uint32_t) bytes [2] & 0x80) >> 7));
-			uint32_t mantissa =
-				(uint32_t) ((uint32_t) ((uint32_t) bytes [2] & 0x7F) << 16) |
-				            (uint32_t) ((uint32_t) bytes [1] << 8) |
-				                        (uint32_t) bytes [0];
+			uint8 bytes [4];
+			if (fread (bytes, sizeof (uint8), 4, f) != 4) readError (f, U"four bytes.");
+			int32 exponent = (int32)
+				((uint32) ((uint32) ((uint32) bytes [3] & 0x0000007F) << 1) |
+				 (uint32) ((uint32) ((uint32) bytes [2] & 0x00000080) >> 7));
+			uint32 mantissa =
+				(uint32) ((uint32) ((uint32) bytes [2] & 0x0000007F) << 16) |
+						  (uint32) ((uint32) bytes [1] << 8) |
+									(uint32) bytes [0];
 			double x;
 			if (exponent == 0)
 				if (mantissa == 0) x = 0.0;
 				else x = ldexp ((double) mantissa, exponent - 149);   // denormalized
-			else if (exponent == 0x00FF)   // Infinity or Not-a-Number
+			else if (exponent == 0x000000FF)   // Infinity or Not-a-Number
 				x = HUGE_VAL;
 			else   // finite
 				x = ldexp ((double) (mantissa | 0x00800000), exponent - 150);
 			return bytes [3] & 0x80 ? - x : x;
 		}
 	} catch (MelderError) {
-		Melder_throw ("Floating-point number not read from 4 bytes in binary file.");
+		Melder_throw (U"Floating-point number not read from 4 bytes in binary file.");
 	}
 }
 
@@ -986,30 +991,29 @@ double bingetr8 (FILE *f) {
 	try {
 		if (binario_doubleIEEE8msb && Melder_debug != 18) {
 			double x;
-			if (fread (& x, sizeof (double), 1, f) != 1) readError (f, "a 64-bit floating-point number.");
+			if (fread (& x, sizeof (double), 1, f) != 1) readError (f, U"a 64-bit floating-point number.");
 			return x;
 		} else {
-			unsigned char bytes [8];
-			if (fread (bytes, sizeof (unsigned char), 8, f) != 8) readError (f, "eight bytes.");
-			Melder_assert (sizeof (long) >= 4);
-			int32_t exponent = (int32_t)
-				((uint32_t) ((uint32_t) ((uint32_t) bytes [0] & 0x7F) << 4) |
-				 (uint32_t) ((uint32_t) ((uint32_t) bytes [1] & 0xF0) >> 4));
+			uint8 bytes [8];
+			if (fread (bytes, sizeof (uint8), 8, f) != 8) readError (f, U"eight bytes.");
+			int32 exponent = (int32)
+				((uint32) ((uint32) ((uint32) bytes [0] & 0x0000007F) << 4) |
+				 (uint32) ((uint32) ((uint32) bytes [1] & 0x000000F0) >> 4));
 			uint32_t highMantissa =
-				(uint32_t) ((uint32_t) ((uint32_t) bytes [1] & 0x0F) << 16) |
-							(uint32_t) ((uint32_t) bytes [2] << 8) |
-				                        (uint32_t) bytes [3];
+				(uint32) ((uint32) ((uint32) bytes [1] & 0x0000000F) << 16) |
+						  (uint32) ((uint32) bytes [2] << 8) |
+									(uint32) bytes [3];
 			uint32_t lowMantissa =
-				(uint32_t) ((uint32_t) bytes [4] << 24) |
-				(uint32_t) ((uint32_t) bytes [5] << 16) |
-				(uint32_t) ((uint32_t) bytes [6] << 8) |
-				            (uint32_t) bytes [7];
+				(uint32) ((uint32) bytes [4] << 24) |
+				(uint32) ((uint32) bytes [5] << 16) |
+				(uint32) ((uint32) bytes [6] << 8) |
+						  (uint32) bytes [7];
 			double x;
 			if (exponent == 0)
 				if (highMantissa == 0 && lowMantissa == 0) x = 0.0;
 				else x = ldexp ((double) highMantissa, exponent - 1042) +
 					ldexp ((double) lowMantissa, exponent - 1074);   // denormalized
-			else if (exponent == 0x07FF)   // Infinity or Not-a-Number
+			else if (exponent == 0x000007FF)   // Infinity or Not-a-Number
 				x = HUGE_VAL;
 			else
 				x = ldexp ((double) (highMantissa | 0x00100000), exponent - 1043) +
@@ -1017,38 +1021,38 @@ double bingetr8 (FILE *f) {
 			return bytes [0] & 0x80 ? - x : x;
 		}
 	} catch (MelderError) {
-		Melder_throw ("Floating-point number not read from 8 bytes in binary file.");
+		Melder_throw (U"Floating-point number not read from 8 bytes in binary file.");
 	}
 }
 
 double bingetr10 (FILE *f) {
 	try {
-		unsigned char bytes [10];
-		if (fread (bytes, sizeof (unsigned char), 10, f) != 10) readError (f, "ten bytes.");
-		int32_t exponent = (int32_t)
-			((uint32_t) ((uint32_t) ((uint32_t) bytes [0] & 0x7F) << 8) |
-			                         (uint32_t) bytes [1]);
-		uint32_t highMantissa =
-			(uint32_t) ((uint32_t) bytes [2] << 24) |
-			(uint32_t) ((uint32_t) bytes [3] << 16) |
-			(uint32_t) ((uint32_t) bytes [4] << 8) |
-			            (uint32_t) bytes [5];
-		uint32_t lowMantissa =
-			(uint32_t) ((uint32_t) bytes [6] << 24) |
-			(uint32_t) ((uint32_t) bytes [7] << 16) |
-			(uint32_t) ((uint32_t) bytes [8] << 8) |
-			            (uint32_t) bytes [9];
+		uint8 bytes [10];
+		if (fread (bytes, sizeof (uint8), 10, f) != 10) readError (f, U"ten bytes.");
+		int32 exponent = (int32)
+			((uint32) ((uint32) ((uint32) bytes [0] & 0x0000007F) << 8) |
+								 (uint32) bytes [1]);   // between 0 and 32767
+		uint32 highMantissa =
+			(uint32) ((uint32) bytes [2] << 24) |
+			(uint32) ((uint32) bytes [3] << 16) |
+			(uint32) ((uint32) bytes [4] << 8) |
+					  (uint32) bytes [5];
+		uint32 lowMantissa =
+			(uint32) ((uint32) bytes [6] << 24) |
+			(uint32) ((uint32) bytes [7] << 16) |
+			(uint32) ((uint32) bytes [8] << 8) |
+					  (uint32) bytes [9];
 		double x;
 		if (exponent == 0 && highMantissa == 0 && lowMantissa == 0) x = 0;
-		else if (exponent == 0x7FFF) x = HUGE_VAL;   // Infinity or NaN
+		else if (exponent == 0x00007FFF) x = HUGE_VAL;   // Infinity or NaN
 		else {
-			exponent -= 16383;
+			exponent -= 16383;   // between -16382 and +16383
 			x = ldexp ((double) highMantissa, exponent - 31);
 			x += ldexp ((double) lowMantissa, exponent - 63);
 		}
 		return bytes [0] & 0x80 ? - x : x;
 	} catch (MelderError) {
-		Melder_throw ("Floating-point number not read from 10 bytes in binary file.");
+		Melder_throw (U"Floating-point number not read from 10 bytes in binary file.");
 	}
 }
 
@@ -1058,7 +1062,7 @@ static unsigned char writeBuffer = 0;
 #define macro_binputb(nbits) \
 void binputb##nbits (unsigned int value, FILE *f) { \
 	if (bitsInWriteBuffer + nbits > 8) { \
-		if (fputc (writeBuffer, f) < 0) writeError ("a bit."); \
+		if (fputc (writeBuffer, f) < 0) writeError (U"a bit."); \
 		bitsInWriteBuffer = 0; \
 		writeBuffer = 0; \
 	} \
@@ -1074,68 +1078,68 @@ macro_binputb (6)
 macro_binputb (7)
 void binputb (FILE *f) {
 	if (bitsInWriteBuffer == 0) return;
-	if (fputc (writeBuffer, f) < 0) writeError ("a bit.");   // flush
+	if (fputc (writeBuffer, f) < 0) writeError (U"a bit.");   // flush
 	bitsInWriteBuffer = 0;
 	writeBuffer = 0;
 }
 
-void binputi2 (int16_t i, FILE *f) {
+void binputi2 (int16 i, FILE *f) {
 	try {
 		if (binario_16bitBE && Melder_debug != 18) {
-			if (fwrite (& i, sizeof (short), 1, f) != 1) writeError ("a signed 16-bit integer.");
+			if (fwrite (& i, sizeof (short), 1, f) != 1) writeError (U"a signed 16-bit integer.");
 		} else {
 			char bytes [2];
 			bytes [0] = (char) (i >> 8);   // truncate
-			bytes [1] = (char) (i);   // truncate
-			if (fwrite (bytes, sizeof (char), 2, f) != 2) writeError ("two bytes.");
+			bytes [1] = (char) i;   // truncate
+			if (fwrite (bytes, sizeof (char), 2, f) != 2) writeError (U"two bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not written to 2 bytes in binary file.");
+		Melder_throw (U"Signed integer not written to 2 bytes in binary file.");
 	}
 }
 
-void binputi2LE (int16_t i, FILE *f) {
+void binputi2LE (int16 i, FILE *f) {
 	try {
 		if (binario_16bitLE && Melder_debug != 18) {
-			if (fwrite (& i, sizeof (short), 1, f) != 1) writeError ("a signed 16-bit integer.");
+			if (fwrite (& i, sizeof (short), 1, f) != 1) writeError (U"a signed 16-bit integer.");
 		} else {
 			char bytes [2];
 			bytes [1] = (char) (i >> 8);   // truncate
-			bytes [0] = (char) (i);   // truncate
-			if (fwrite (bytes, sizeof (char), 2, f) != 2) writeError ("two bytes.");
+			bytes [0] = (char) i;   // truncate
+			if (fwrite (bytes, sizeof (char), 2, f) != 2) writeError (U"two bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not written to 2 bytes in binary file.");
+		Melder_throw (U"Signed integer not written to 2 bytes in binary file.");
 	}
 }
 
-void binputu2 (uint16_t u, FILE *f) {
+void binputu2 (uint16 u, FILE *f) {
 	try {
 		if (binario_16bitBE && Melder_debug != 18) {
-			if (fwrite (& u, sizeof (uint16_t), 1, f) != 1) writeError ("an unsigned 16-bit integer.");
+			if (fwrite (& u, sizeof (uint16_t), 1, f) != 1) writeError (U"an unsigned 16-bit integer.");
 		} else {
 			char bytes [2];
 			bytes [0] = (char) (u >> 8);   // truncate
-			bytes [1] = (char) (u);   // truncate
-			if (fwrite (bytes, sizeof (char), 2, f) != 2) writeError ("two bytes.");
+			bytes [1] = (char) u;   // truncate
+			if (fwrite (bytes, sizeof (char), 2, f) != 2) writeError (U"two bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not written to 2 bytes in binary file.");
+		Melder_throw (U"Unsigned integer not written to 2 bytes in binary file.");
 	}
 }
 
-void binputu2LE (uint16_t u, FILE *f) {
+void binputu2LE (uint16 u, FILE *f) {
 	try {
 		if (binario_16bitLE && Melder_debug != 18) {
-			if (fwrite (& u, sizeof (uint16_t), 1, f) != 1) writeError ("an unsigned 16-bit integer.");
+			if (fwrite (& u, sizeof (uint16_t), 1, f) != 1) writeError (U"an unsigned 16-bit integer.");
 		} else {
 			char bytes [2];
 			bytes [1] = (char) (u >> 8);   // truncate
-			bytes [0] = (char) (u);   // truncate
-			if (fwrite (bytes, sizeof (char), 2, f) != 2) writeError ("two bytes.");
+			bytes [0] = (char) u;   // truncate
+			if (fwrite (bytes, sizeof (char), 2, f) != 2) writeError (U"two bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not written to 2 bytes in binary file.");
+		Melder_throw (U"Unsigned integer not written to 2 bytes in binary file.");
 	}
 }
 
@@ -1143,107 +1147,107 @@ void binpute2 (int value, FILE *f) {
 	try {
 		if (binario_16bitBE && Melder_debug != 18) {
 			short s = value;
-			if (fwrite (& s, sizeof (short), 1, f) != 1) writeError ("a signed 16-bit integer");
+			if (fwrite (& s, sizeof (short), 1, f) != 1) writeError (U"a signed 16-bit integer");
 		} else {
 			char bytes [2];
 			bytes [0] = (char) (value >> 8);   // truncate
-			bytes [1] = (char) (value);   // truncate
-			if (fwrite (bytes, sizeof (char), 2, f) != 2) writeError ("two bytes.");
+			bytes [1] = (char) value;   // truncate
+			if (fwrite (bytes, sizeof (char), 2, f) != 2) writeError (U"two bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Enumerated value not written to 2 bytes in binary file.");
+		Melder_throw (U"Enumerated value not written to 2 bytes in binary file.");
 	}
 }
 
-void binputi3 (int32_t i, FILE *f) {
+void binputi3 (int32 i, FILE *f) {
 	try {
 		char bytes [3];
 		bytes [0] = (char) (i >> 16);   // truncate
 		bytes [1] = (char) (i >> 8);   // truncate
-		bytes [2] = (char) (i);   // truncate
-		if (fwrite (bytes, sizeof (char), 3, f) != 3) writeError ("three bytes");
+		bytes [2] = (char) i;   // truncate
+		if (fwrite (bytes, sizeof (char), 3, f) != 3) writeError (U"three bytes");
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not written to 3 bytes in binary file.");
+		Melder_throw (U"Signed integer not written to 3 bytes in binary file.");
 	}
 }
 
-void binputi3LE (int32_t i, FILE *f) {
+void binputi3LE (int32 i, FILE *f) {
 	try {
 		char bytes [3];
 		bytes [2] = (char) (i >> 16);   // truncate
 		bytes [1] = (char) (i >> 8);   // truncate
-		bytes [0] = (char) (i);   // truncate
-		if (fwrite (bytes, sizeof (char), 3, f) != 3) writeError ("three bytes");
+		bytes [0] = (char) i;   // truncate
+		if (fwrite (bytes, sizeof (char), 3, f) != 3) writeError (U"three bytes");
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not written to 3 bytes in binary file.");
+		Melder_throw (U"Signed integer not written to 3 bytes in binary file.");
 	}
 }
 
-void binputi4 (int32_t i, FILE *f) {
+void binputi4 (int32 i, FILE *f) {
 	try {
 		if (binario_32bitBE && Melder_debug != 18) {
-			if (fwrite (& i, sizeof (int32_t), 1, f) != 1) writeError ("a signed 32-bit integer.");
+			if (fwrite (& i, sizeof (int32), 1, f) != 1) writeError (U"a signed 32-bit integer.");
 		} else {
 			char bytes [4];
 			bytes [0] = (char) (i >> 24);   // truncate
 			bytes [1] = (char) (i >> 16);   // truncate
 			bytes [2] = (char) (i >> 8);   // truncate
-			bytes [3] = (char) (i);   // truncate
-			if (fwrite (bytes, sizeof (char), 4, f) != 4) writeError ("four bytes.");
+			bytes [3] = (char) i;   // truncate
+			if (fwrite (bytes, sizeof (char), 4, f) != 4) writeError (U"four bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not written to 4 bytes in binary file.");
+		Melder_throw (U"Signed integer not written to 4 bytes in binary file.");
 	}
 }
 
-void binputi4LE (int32_t i, FILE *f) {
+void binputi4LE (int32 i, FILE *f) {
 	try {
 		if (binario_32bitLE && Melder_debug != 18) {
-			if (fwrite (& i, sizeof (int32_t), 1, f) != 1) writeError ("a signed 32-bit integer.");
+			if (fwrite (& i, sizeof (int32), 1, f) != 1) writeError (U"a signed 32-bit integer.");
 		} else {
 			char bytes [4];
 			bytes [3] = (char) (i >> 24);   // truncate
 			bytes [2] = (char) (i >> 16);   // truncate
 			bytes [1] = (char) (i >> 8);   // truncate
-			bytes [0] = (char) (i);   // truncate
-			if (fwrite (bytes, sizeof (char), 4, f) != 4) writeError ("four bytes.");
+			bytes [0] = (char) i;   // truncate
+			if (fwrite (bytes, sizeof (char), 4, f) != 4) writeError (U"four bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Signed integer not written to 4 bytes in binary file.");
+		Melder_throw (U"Signed integer not written to 4 bytes in binary file.");
 	}
 }
 
-void binputu4 (uint32_t u, FILE *f) {
+void binputu4 (uint32 u, FILE *f) {
 	try {
 		if (binario_32bitBE && Melder_debug != 18) {
-			if (fwrite (& u, sizeof (uint32_t), 1, f) != 1) writeError ("an unsigned 32-bit integer.");
+			if (fwrite (& u, sizeof (uint32), 1, f) != 1) writeError (U"an unsigned 32-bit integer.");
 		} else {
 			char bytes [4];
 			bytes [0] = (char) (u >> 24);   // truncate
 			bytes [1] = (char) (u >> 16);   // truncate
 			bytes [2] = (char) (u >> 8);   // truncate
-			bytes [3] = (char) (u);   // truncate
-			if (fwrite (bytes, sizeof (char), 4, f) != 4) writeError ("four bytes.");
+			bytes [3] = (char) u;   // truncate
+			if (fwrite (bytes, sizeof (char), 4, f) != 4) writeError (U"four bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not written to 4 bytes in binary file.");
+		Melder_throw (U"Unsigned integer not written to 4 bytes in binary file.");
 	}
 }
 
-void binputu4LE (uint32_t u, FILE *f) {
+void binputu4LE (uint32 u, FILE *f) {
 	try {
 		if (binario_32bitLE && Melder_debug != 18) {
-			if (fwrite (& u, sizeof (uint32_t), 1, f) != 1) writeError ("an unsigned 32-bit integer.");
+			if (fwrite (& u, sizeof (uint32), 1, f) != 1) writeError (U"an unsigned 32-bit integer.");
 		} else {
 			char bytes [4];
 			bytes [3] = (char) (u >> 24);   // truncate
 			bytes [2] = (char) (u >> 16);  // truncate
 			bytes [1] = (char) (u >> 8);  // truncate
-			bytes [0] = (char) (u);  // truncate
-			if (fwrite (bytes, sizeof (char), 4, f) != 4) writeError ("four bytes.");
+			bytes [0] = (char) u;  // truncate
+			if (fwrite (bytes, sizeof (char), 4, f) != 4) writeError (U"four bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Unsigned integer not written to 4 bytes in binary file.");
+		Melder_throw (U"Unsigned integer not written to 4 bytes in binary file.");
 	}
 }
 
@@ -1251,12 +1255,12 @@ void binputr4 (double x, FILE *f) {
 	try {
 		if (binario_floatIEEE4msb && Melder_debug != 18) {
 			float x4 = (float) x;   // convert down, with loss of precision
-			if (fwrite (& x4, sizeof (float), 1, f) != 1) writeError ("a 32-bit floating-point number.");
+			if (fwrite (& x4, sizeof (float), 1, f) != 1) writeError (U"a 32-bit floating-point number.");
 		} else {
-			unsigned char bytes [4];
+			uint8 bytes [4];
 			int sign, exponent;
 			double fMantissa, fsMantissa;
-			uint32_t mantissa;
+			uint32 mantissa;
 			if (x < 0.0) { sign = 0x0100; x *= -1; }
 			else sign = 0;
 			if (x == 0.0) { exponent = 0; mantissa = 0; }
@@ -1276,14 +1280,14 @@ void binputr4 (double x, FILE *f) {
 					mantissa = (uint32_t) fsMantissa & 0x007FFFFF;
 				}
 			}
-			bytes [0] = (uint8_t) (exponent >> 1);   // truncate: bits 2 through 9 (bit 9 is the sign bit)
-			bytes [1] = (exponent << 7) | (mantissa >> 16);
-			bytes [2] = mantissa >> 8;
-			bytes [3] = mantissa;
-			if (fwrite (bytes, sizeof (unsigned char), 4, f) != 4) writeError ("four bytes.");
+			bytes [0] = (uint8) (exponent >> 1);   // truncate: bits 2 through 9 (bit 9 is the sign bit)
+			bytes [1] = (uint8) ((exponent << 7) | (mantissa >> 16));   // truncate
+			bytes [2] = (uint8) (mantissa >> 8);   // truncate
+			bytes [3] = (uint8) mantissa;   // truncate
+			if (fwrite (bytes, sizeof (uint8), 4, f) != 4) writeError (U"four bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Floating-point number not written to 4 bytes in binary file.");
+		Melder_throw (U"Floating-point number not written to 4 bytes in binary file.");
 	}
 }
 
@@ -1291,12 +1295,12 @@ void binputr4LE (double x, FILE *f) {
 	try {
 		if (binario_floatIEEE4lsb && Melder_debug != 18) {
 			float x4 = (float) x;   // convert down, with loss of precision
-			if (fwrite (& x4, sizeof (float), 1, f) != 1) writeError ("a 32-bit floating-point number.");
+			if (fwrite (& x4, sizeof (float), 1, f) != 1) writeError (U"a 32-bit floating-point number.");
 		} else {
-			unsigned char bytes [4];
+			uint8 bytes [4];
 			int sign, exponent;
 			double fMantissa, fsMantissa;
-			uint32_t mantissa;
+			uint32 mantissa;
 			if (x < 0.0) { sign = 0x0100; x *= -1; }
 			else sign = 0;
 			if (x == 0.0) { exponent = 0; mantissa = 0; }
@@ -1304,7 +1308,7 @@ void binputr4LE (double x, FILE *f) {
 				fMantissa = frexp (x, & exponent);
 				if ((exponent > 128) || ! (fMantissa < 1))   // Infinity or Not-a-Number
 					{ exponent = sign | 0x00FF; mantissa = 0; }   // Infinity
-				else {   /* Finite. */
+				else {   // finite
 					exponent += 126;   // add bias
 					if (exponent <= 0) {   // denormalized
 						fMantissa = ldexp (fMantissa, exponent - 1);
@@ -1316,26 +1320,26 @@ void binputr4LE (double x, FILE *f) {
 					mantissa = (uint32_t) fsMantissa & 0x007FFFFF;
 				}
 			}
-			bytes [3] = exponent >> 1;
-			bytes [2] = (exponent << 7) | (mantissa >> 16);
-			bytes [1] = mantissa >> 8;
-			bytes [0] = mantissa;
-			if (fwrite (bytes, sizeof (unsigned char), 4, f) != 4) writeError ("four bytes.");
+			bytes [3] = (uint8) (exponent >> 1);
+			bytes [2] = (uint8) ((exponent << 7) | (mantissa >> 16));
+			bytes [1] = (uint8) (mantissa >> 8);
+			bytes [0] = (uint8) mantissa;
+			if (fwrite (bytes, sizeof (uint8), 4, f) != 4) writeError (U"four bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Floating-point number not written to 4 bytes in binary file.");
+		Melder_throw (U"Floating-point number not written to 4 bytes in binary file.");
 	}
 }
 
 void binputr8 (double x, FILE *f) {
 	try {
 		if (binario_doubleIEEE8msb && Melder_debug != 18) {
-			if (fwrite (& x, sizeof (double), 1, f) != 1) writeError ("a 64-bit floating-point number.");
+			if (fwrite (& x, sizeof (double), 1, f) != 1) writeError (U"a 64-bit floating-point number.");
 		} else {
-			unsigned char bytes [8];
+			uint8 bytes [8];
 			int sign, exponent;
 			double fMantissa, fsMantissa;
-			uint32_t highMantissa, lowMantissa;
+			uint32 highMantissa, lowMantissa;
 			if (x < 0.0) { sign = 0x0800; x *= -1; }
 			else sign = 0;
 			if (x == 0.0) { exponent = 0; highMantissa = 0; lowMantissa = 0; }
@@ -1343,7 +1347,7 @@ void binputr8 (double x, FILE *f) {
 				fMantissa = frexp (x, & exponent);
 				if ((exponent > 1024) || ! (fMantissa < 1))   // Infinity or Not-a-Number
 					{ exponent = sign | 0x07FF; highMantissa = 0; lowMantissa = 0; }   // Infinity
-				else { /* Finite. */
+				else { // finite
 					exponent += 1022;   // add bias
 					if (exponent <= 0) {   // denormalized
 						fMantissa = ldexp (fMantissa, exponent - 1);
@@ -1358,18 +1362,18 @@ void binputr8 (double x, FILE *f) {
 					lowMantissa = (uint32_t) fsMantissa;
 				}
 			}
-			bytes [0] = exponent >> 4;
-			bytes [1] = (exponent << 4) | (highMantissa >> 16);
-			bytes [2] = highMantissa >> 8;
-			bytes [3] = highMantissa;
-			bytes [4] = lowMantissa >> 24;
-			bytes [5] = lowMantissa >> 16;
-			bytes [6] = lowMantissa >> 8;
-			bytes [7] = lowMantissa;
-			if (fwrite (bytes, sizeof (unsigned char), 8, f) != 8) writeError ("eight bytes.");
+			bytes [0] = (uint8) (exponent >> 4);
+			bytes [1] = (uint8) ((exponent << 4) | (highMantissa >> 16));
+			bytes [2] = (uint8) (highMantissa >> 8);
+			bytes [3] = (uint8) highMantissa;
+			bytes [4] = (uint8) (lowMantissa >> 24);
+			bytes [5] = (uint8) (lowMantissa >> 16);
+			bytes [6] = (uint8) (lowMantissa >> 8);
+			bytes [7] = (uint8) lowMantissa;
+			if (fwrite (bytes, sizeof (uint8), 8, f) != 8) writeError (U"eight bytes.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Floating-point number not written to 8 bytes in binary file.");
+		Melder_throw (U"Floating-point number not written to 8 bytes in binary file.");
 	}
 }
 
@@ -1402,19 +1406,19 @@ void binputr10 (double x, FILE *f) {
 				lowMantissa = (uint32_t) fsMantissa;
 			}
 		}
-		bytes [0] = exponent >> 8;
-		bytes [1] = exponent;
-		bytes [2] = highMantissa >> 24;
-		bytes [3] = highMantissa >> 16;
-		bytes [4] = highMantissa >> 8;
-		bytes [5] = highMantissa;
-		bytes [6] = lowMantissa >> 24;
-		bytes [7] = lowMantissa >> 16;
-		bytes [8] = lowMantissa >> 8;
-		bytes [9] = lowMantissa;
-		if (fwrite (bytes, sizeof (unsigned char), 10, f) != 10) writeError ("ten bytes.");
+		bytes [0] = (uint8) (exponent >> 8);
+		bytes [1] = (uint8) exponent;
+		bytes [2] = (uint8) (highMantissa >> 24);
+		bytes [3] = (uint8) (highMantissa >> 16);
+		bytes [4] = (uint8) (highMantissa >> 8);
+		bytes [5] = (uint8) highMantissa;
+		bytes [6] = (uint8) (lowMantissa >> 24);
+		bytes [7] = (uint8) (lowMantissa >> 16);
+		bytes [8] = (uint8) (lowMantissa >> 8);
+		bytes [9] = (uint8) lowMantissa;
+		if (fwrite (bytes, sizeof (uint8), 10, f) != 10) writeError (U"ten bytes.");
 	} catch (MelderError) {
-		Melder_throw ("Floating-point number not written to 10 bytes in binary file.");
+		Melder_throw (U"Floating-point number not written to 10 bytes in binary file.");
 	}
 }
 
@@ -1425,7 +1429,7 @@ fcomplex bingetc8 (FILE *f) {
 		result. im = bingetr4 (f);
 		return result;
 	} catch (MelderError) {
-		Melder_throw ("Complex number not read from 8 bytes in binary file.");
+		Melder_throw (U"Complex number not read from 8 bytes in binary file.");
 		fcomplex result = { 0 };
 		return result;
 	}
@@ -1438,7 +1442,7 @@ dcomplex bingetc16 (FILE *f) {
 		result. im = bingetr8 (f);
 		return result;
 	} catch (MelderError) {
-		Melder_throw ("Complex number not read from 16 bytes in binary file.");
+		Melder_throw (U"Complex number not read from 16 bytes in binary file.");
 		dcomplex result = { 0 };
 		return result;
 	}
@@ -1449,7 +1453,7 @@ void binputc8 (fcomplex z, FILE *f) {
 		binputr4 (z. re, f);
 		binputr4 (z. im, f);
 	} catch (MelderError) {
-		Melder_throw ("Complex number not written to 8 bytes in binary file.");
+		Melder_throw (U"Complex number not written to 8 bytes in binary file.");
 	}
 }
 
@@ -1458,7 +1462,7 @@ void binputc16 (dcomplex z, FILE *f) {
 		binputr8 (z. re, f);
 		binputr8 (z. im, f);
 	} catch (MelderError) {
-		Melder_throw ("Complex number not written to 16 bytes in binary file.");
+		Melder_throw (U"Complex number not written to 16 bytes in binary file.");
 	}
 }
 
@@ -1467,158 +1471,146 @@ char * bingets1 (FILE *f) {
 		unsigned int length = bingetu1 (f);
 		autostring8 result = Melder_malloc (char, length + 1);
 		if (fread (result.peek(), sizeof (char), length, f) != length)
-			Melder_throw (feof (f) ? "Reached end of file" : "Error in file", " while trying to read ", length, " one-byte characters.");
+			Melder_throw (feof (f) ? U"Reached end of file" : U"Error in file", U" while trying to read ", length, U" one-byte characters.");
 		result [length] = 0;   // trailing null byte
 		return result.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Text not read from a binary file.");
+		Melder_throw (U"Text not read from a binary file.");
 	}
 }
 
 char * bingets2 (FILE *f) {
 	try {
 		uint16_t length = bingetu2 (f);
-		autostring8 result = Melder_malloc (char, (int64_t) length + 1);
+		autostring8 result = Melder_malloc (char, (int64) length + 1);
 		if (fread (result.peek(), sizeof (char), length, f) != length)
-			Melder_throw (feof (f) ? "Reached end of file" : "Error in file", " while trying to read ", length, " one-byte characters.");
+			Melder_throw (feof (f) ? U"Reached end of file" : U"Error in file", U" while trying to read ", length, U" one-byte characters.");
 		result [length] = 0;   // trailing null byte
 		return result.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Text not read from a binary file.");
+		Melder_throw (U"Text not read from a binary file.");
 	}
 }
 
 char * bingets4 (FILE *f) {
 	try {
 		uint32_t length = bingetu4 (f);
-		autostring8 result = Melder_malloc (char, (int64_t) length + 1);
+		autostring8 result = Melder_malloc (char, (int64) length + 1);
 		if (fread (result.peek(), sizeof (char), length, f) != length)
-			Melder_throw (feof (f) ? "Reached end of file" : "Error in file", " while trying to read ", length, " one-byte characters.");
+			Melder_throw (feof (f) ? U"Reached end of file" : U"Error in file", U" while trying to read ", length, U" one-byte characters.");
 		result [length] = 0;   // trailing null byte
 		return result.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Text not read from a binary file.");
+		Melder_throw (U"Text not read from a binary file.");
 	}
 }
 
-wchar_t * bingetw1 (FILE *f) {
+char32 * bingetw1 (FILE *f) {
 	try {
-		autostring result = NULL;
+		autostring32 result;
 		unsigned short length = bingetu1 (f);
 		if (length == 0xFF) {   // an escape for encoding
 			/*
 			 * UTF-16
 			 */
 			length = bingetu1 (f);
-			result.reset (Melder_malloc (wchar_t, (int64_t) length + 1));
+			result.reset (Melder_malloc (char32, (int64) length + 1));
 			for (unsigned short i = 0; i < length; i ++) {
-				if (sizeof (wchar_t) == 2) {
-					result [i] = (wchar_t) bingetu2 (f);   // add sign
+				uint16 kar = bingetu2 (f);
+				if ((kar & 0xF800) == 0xD800) {
+					if (kar > 0xDBFF)
+						Melder_throw (U"Incorrect Unicode value (first surrogate member ", kar, U").");
+					uint16 kar2 = bingetu2 (f);
+					if (kar2 < 0xDC00 || kar2 > 0xDFFF)
+						Melder_throw (U"Incorrect Unicode value (second surrogate member ", kar2, U").");
+					result [i] = (((kar & 0x3FF) << 10) | (kar2 & 0x3FF)) + 0x10000;
 				} else {
-					uint16_t kar = bingetu2 (f);
-					if ((kar & 0xF800) == 0xD800) {
-						if (kar > 0xDBFF)
-							Melder_throw ("Incorrect Unicode value (first surrogate member ", kar, ").");
-						uint16_t kar2 = bingetu2 (f);
-						if (kar2 < 0xDC00 || kar2 > 0xDFFF)
-							Melder_throw ("Incorrect Unicode value (second surrogate member ", kar2, ").");
-						result [i] = (((kar & 0x3FF) << 10) | (kar2 & 0x3FF)) + 0x10000;
-					} else {
-						result [i] = kar;
-					}
+					result [i] = kar;
 				}
 			}
 		} else {
 			/*
 			 * ASCII
 			 */
-			result.reset (Melder_malloc (wchar_t, (int64_t) length + 1));
+			result.reset (Melder_malloc (char32, (int64) length + 1));
 			for (unsigned short i = 0; i < length; i ++) {
 				result [i] = bingetu1 (f);
 			}
 		}
-		result [length] = L'\0';
+		result [length] = U'\0';
 		return result.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Text not read from a binary file.");
+		Melder_throw (U"Text not read from a binary file.");
 	}
 }
 
-wchar_t * bingetw2 (FILE *f) {
+char32 * bingetw2 (FILE *f) {
 	try {
-		autostring result = NULL;
-		uint16_t length = bingetu2 (f);
+		autostring32 result;
+		uint16 length = bingetu2 (f);
 		if (length == 0xFFFF) {   // an escape for encoding
 			/*
 			 * UTF-16
 			 */
 			length = bingetu2 (f);
-			result.reset (Melder_malloc (wchar_t, (int64_t) length + 1));
-			for (uint16_t i = 0; i < length; i ++) {
-				if (sizeof (wchar_t) == 2) {
-					result [i] = (wchar_t) bingetu2 (f);
+			result.reset (Melder_malloc (char32, (int64) length + 1));
+			for (uint16 i = 0; i < length; i ++) {
+				char32 kar = (char32) (char16) bingetu2 (f);
+				if ((kar & 0x00F800) == 0x00D800) {
+					if (kar > 0x00DBFF)
+						Melder_throw (U"Incorrect Unicode value (first surrogate member ", kar, U").");
+					char32 kar2 = (char32) (char16) bingetu2 (f);
+					if (kar2 < 0x00DC00 || kar2 > 0x00DFFF)
+						Melder_throw (U"Incorrect Unicode value (second surrogate member ", kar2, U").");
+					result [i] = (((kar & 0x0003FF) << 10) | (kar2 & 0x0003FF)) + 0x010000;
 				} else {
-					uint16_t kar = bingetu2 (f);
-					if ((kar & 0xF800) == 0xD800) {
-						if (kar > 0xDBFF)
-							Melder_throw ("Incorrect Unicode value (first surrogate member ", kar, ").");
-						uint16_t kar2 = bingetu2 (f);
-						if (kar2 < 0xDC00 || kar2 > 0xDFFF)
-							Melder_throw ("Incorrect Unicode value (second surrogate member ", kar2, ").");
-						result [i] = (((kar & 0x3FF) << 10) | (kar2 & 0x3FF)) + 0x10000;
-					} else {
-						result [i] = kar;
-					}
+					result [i] = kar;
 				}
 			}
 		} else {
 			/*
 			 * ASCII
 			 */
-			result.reset (Melder_malloc (wchar_t, length + 1));
+			result.reset (Melder_malloc (char32, length + 1));
 			for (unsigned short i = 0; i < length; i ++) {
-				result [i] = bingetu1 (f);
+				result [i] = (char32) (char8) bingetu1 (f);
 			}
 		}
-		result [length] = L'\0';
+		result [length] = U'\0';
 		return result.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Text not read from a binary file.");
+		Melder_throw (U"Text not read from a binary file.");
 	}
 }
 
-wchar_t * bingetw4 (FILE *f) {
+char32 * bingetw4 (FILE *f) {
 	try {
-		autostring result = NULL;
-		uint32_t length = bingetu4 (f);
+		autostring32 result;
+		uint32 length = bingetu4 (f);
 		if (length == 0xFFFFFFFF) {   // an escape for encoding
 			/*
 			 * UTF-16
 			 */
 			length = bingetu4 (f);
-			result.reset (Melder_malloc (wchar_t, (int64_t) length + 1));
+			result.reset (Melder_malloc (char32, (int64) length + 1));
 			for (uint32_t i = 0; i < length; i ++) {
-				if (sizeof (wchar_t) == 2) {
-					result [i] = (wchar_t) bingetu2 (f);
+				uint16_t kar = bingetu2 (f);
+				if ((kar & 0xF800) == 0xD800) {
+					if (kar > 0xDBFF)
+						Melder_throw (U"Incorrect Unicode value (first surrogate member ", kar, U").");
+					uint16_t kar2 = bingetu2 (f);
+					if (kar2 < 0xDC00 || kar2 > 0xDFFF)
+						Melder_throw (U"Incorrect Unicode value (second surrogate member ", kar2, U").");
+					result [i] = (((kar & 0x3FF) << 10) | (kar2 & 0x3FF)) + 0x10000;
 				} else {
-					uint16_t kar = bingetu2 (f);
-					if ((kar & 0xF800) == 0xD800) {
-						if (kar > 0xDBFF)
-							Melder_throw ("Incorrect Unicode value (first surrogate member ", kar, ").");
-						uint16_t kar2 = bingetu2 (f);
-						if (kar2 < 0xDC00 || kar2 > 0xDFFF)
-							Melder_throw ("Incorrect Unicode value (second surrogate member ", kar2, ").");
-						result [i] = (((kar & 0x3FF) << 10) | (kar2 & 0x3FF)) + 0x10000;
-					} else {
-						result [i] = kar;
-					}
+					result [i] = kar;
 				}
 			}
 		} else {
 			/*
 			 * ASCII
 			 */
-			result.reset (Melder_malloc (wchar_t, (int64_t) length + 1));
+			result.reset (Melder_malloc (char32, (int64) length + 1));
 			for (uint32_t i = 0; i < length; i ++) {
 				result [i] = bingetu1 (f);
 			}
@@ -1626,92 +1618,87 @@ wchar_t * bingetw4 (FILE *f) {
 		result [length] = L'\0';
 		return result.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Text not read from a binary file.");
+		Melder_throw (U"Text not read from a binary file.");
 	}
 }
 
 void binputs1 (const char *s, FILE *f) {
 	try {
-		if (s == NULL) {
+		if (! s) {
 			binputu1 (0, f);
 		} else {
 			size_t length = strlen (s);
 			if (length > UINT8_MAX) {
-				Melder_warning ("Text of ", length, " characters truncated to 255 characters.");
+				Melder_warning (U"Text of ", length, U" characters truncated to 255 characters.");
 				length = UINT8_MAX;
 			}
 			binputu1 (length, f);
 			if (fwrite (s, sizeof (char), length, f) != length)
-				Melder_throw ("Error in file while trying to write ", length, " one-byte characters.");
+				Melder_throw (U"Error in file while trying to write ", length, U" one-byte characters.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Text not written to a binary file.");
+		Melder_throw (U"Text not written to a binary file.");
 	}
 }
 
 void binputs2 (const char *s, FILE *f) {
 	try {
-		if (s == NULL) {
+		if (! s) {
 			binputu2 (0, f);
 		} else {
 			size_t length = strlen (s);
 			if (length > UINT16_MAX) {
-				Melder_warning ("Text of ", length, " characters truncated to 65535 characters.");
+				Melder_warning (U"Text of ", length, U" characters truncated to 65535 characters.");
 				length = UINT16_MAX;
 			}
 			binputu2 ((uint16_t) length, f);   // safe conversion down
 			if (fwrite (s, sizeof (char), length, f) != length)
-				Melder_throw ("Error in file while trying to write ", length, " one-byte characters.");
+				Melder_throw (U"Error in file while trying to write ", length, U" one-byte characters.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Text not written to a binary file.");
+		Melder_throw (U"Text not written to a binary file.");
 	}
 }
 
 void binputs4 (const char *s, FILE *f) {
 	try {
-		if (s == NULL) {
+		if (! s) {
 			binputu4 (0, f);
 		} else {
 			size_t length = strlen (s);
 			if (length > UINT32_MAX) {
-				Melder_warning ("Text of ", length, " characters truncated to 4,294,967,295 characters.");
+				Melder_warning (U"Text of ", length, U" characters truncated to 4,294,967,295 characters.");
 				length = UINT32_MAX;
 			}
 			binputu4 (length, f);
 			if (fwrite (s, sizeof (char), length, f) != length)
-				Melder_throw ("Error in file while trying to write ", length, " one-byte characters.");
+				Melder_throw (U"Error in file while trying to write ", length, U" one-byte characters.");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Text not written to a binary file.");
+		Melder_throw (U"Text not written to a binary file.");
 	}
 }
 
-static inline void binpututf16 (wchar_t character, FILE *f) {
-	if (sizeof (wchar_t) == 2) {   // wchar_t is (signed) UTF-16?
-		binputu2 ((uint16_t) character, f);   // convert sign
-	} else {   // wchar_t is (signed) UTF-32.
-		char32_t kar = (char32_t) character;   // safe, because sign bit is always zero
-		if (kar <= 0x0000FFFF) {
-			binputu2 ((uint16_t) character, f);   // truncate to lower 16 bits
-		} else if (kar <= 0x0010FFFF) {
-			kar -= 0x10000;
-			binputu2 ((uint16_t) (0x0000D800 | (kar >> 10)), f);
-			binputu2 ((uint16_t) (0xDC00 | (kar & 0x3FF)), f);
-		} else {
-			Melder_fatal ("Impossible Unicode value.");
-		}
+static inline void binpututf16 (char32 kar, FILE *f) {
+	if (kar <= 0x00FFFF) {
+		binputu2 ((uint16) kar, f);   // truncate to lower 16 bits
+	} else if (kar <= 0x10FFFF) {
+		kar -= 0x010000;
+		binputu2 ((uint16) (0x00D800 | (kar >> 10)), f);
+		binputu2 ((uint16) (0x00DC00 | (kar & 0x0003FF)), f);
+	} else {
+		Melder_fatal (U"Impossible Unicode value.");
 	}
 }
 
-void binputw1 (const wchar_t *s, FILE *f) {
+void binputw1 (const char32 *s, FILE *f) {
 	try {
-		if (s == NULL) {
+		if (! s) {
 			binputu1 (0, f);
 		} else {
-			size_t length = wcslen (s);
+			uint32 length = str32len (s);
 			if (length > UINT8_MAX - 1) {
-				Melder_warning ("Text of ", length, " characters truncated to 254 characters.");
+				Melder_warning (U"Text of ", length, U" characters truncated to 254 characters.");
 				length = UINT8_MAX - 1;
 			}
 			if (Melder_isValidAscii (s)) {
@@ -1734,60 +1721,60 @@ void binputw1 (const wchar_t *s, FILE *f) {
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw ("Text not written to a binary file.");
+		Melder_throw (U"Text not written to a binary file.");
 	}
 }
 
-void binputw2 (const wchar_t *s, FILE *f) {
+void binputw2 (const char32 *s, FILE *f) {
 	try {
-		if (s == NULL) {
+		if (! s) {
 			binputu2 (0, f);
 		} else {
-			size_t length = wcslen (s);
+			int64 length = str32len (s);
 			if (length > UINT16_MAX - 1) {
-				Melder_warning ("Text of ", length, " characters truncated to 65534 characters.");
+				Melder_warning (U"Text of ", length, U" characters truncated to 65534 characters.");
 				length = UINT16_MAX - 1;
 			}
 			if (Melder_isValidAscii (s)) {
 				/*
 				 * ASCII
 				 */
-				binputu2 ((uint16_t) length, f);
-				for (size_t i = 0; i < length; i ++) {
-					binputu1 ((unsigned int) (char) s [i], f);
+				binputu2 ((uint16) length, f);
+				for (int64 i = 0; i < length; i ++) {
+					binputu1 ((unsigned int) (char8) s [i], f);
 				}
 			} else {
 				/*
 				 * UTF-16
 				 */
 				binputu2 (0xFFFF, f);   // an escape for multibyte encoding
-				binputu2 ((uint16_t) length, f);
-				for (size_t i = 0; i < length; i ++) {
+				binputu2 ((uint16) length, f);
+				for (int64 i = 0; i < length; i ++) {
 					binpututf16 (s [i], f);
 				}
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw ("Text not written to a binary file.");
+		Melder_throw (U"Text not written to a binary file.");
 	}
 }
 
-void binputw4 (const wchar_t *s, FILE *f) {
+void binputw4 (const char32 *s, FILE *f) {
 	try {
-		if (s == NULL) {
+		if (! s) {
 			binputu4 (0, f);
 		} else {
-			size_t length = wcslen (s);
+			int64 length = str32len (s);
 			if (length > UINT32_MAX - 1) {
-				Melder_warning ("Text of ", length, " characters truncated to 4,294,967,294 characters.");
+				Melder_warning (U"Text of ", length, U" characters truncated to 4,294,967,294 characters.");
 				length = UINT32_MAX - 1;
 			}
 			if (Melder_isValidAscii (s)) {
 				/*
 				 * ASCII
 				 */
-				binputu4 (length, f);
-				for (size_t i = 0; i < length; i ++) {
+				binputu4 ((uint32) length, f);
+				for (int64 i = 0; i < length; i ++) {
 					binputu1 ((unsigned int) (char) s [i], f);
 				}
 			} else {
@@ -1795,603 +1782,15 @@ void binputw4 (const wchar_t *s, FILE *f) {
 				 * UTF-16
 				 */
 				binputu4 (0xFFFFFFFF, f);   // an escape for multibyte encoding
-				binputu4 (length, f);
-				for (size_t i = 0; i < length; i ++) {
+				binputu4 ((uint32) length, f);
+				for (int64 i = 0; i < length; i ++) {
 					binpututf16 (s [i], f);
 				}
 			}
 		}
 	} catch (MelderError) {
-		Melder_throw ("Text not written to a binary file.");
-	}
-}
-
-/********** machine-independent cache I/O **********/
-
-#define my  me ->
-
-#define START(x)  char *ptr = (char *) & (x);
-#define READ  * ptr ++ = * f -> ptr ++;
-#define WRITE  * f -> ptr ++ = * ptr ++;
-
-CACHE * memopen (size_t nbytes) {
-	CACHE *me;
-	if (nbytes < 1) return NULL;
-	me = Melder_malloc (CACHE, 1);
-	my base = Melder_malloc (unsigned char, nbytes);
-	my max = my base + nbytes;
-	my ptr = my base;
-	return me;
-}
-
-int memclose (CACHE *me) {
-	if (! me || ! my base) return EOF;
-	Melder_free (my base);
-	Melder_free (me);
-	return 0;
-}
-
-size_t memread (void *ptr, size_t size, size_t nmemb, CACHE *me) {
-	size_t nbytes = size * nmemb;
-	memcpy (ptr, my ptr, nbytes);
-	my ptr += nbytes;
-	return nmemb;
-}
-
-size_t memwrite (const void *ptr, size_t size, size_t nmemb, CACHE *me) {
-	size_t nbytes = size * nmemb;
-	Melder_assert (my ptr + nbytes <= my max);
-	memcpy (my ptr, ptr, nbytes);
-	my ptr += nbytes;
-	return nmemb;
-}
-
-void memprint1 (CACHE *me, const char *s1) {
-	(void) memwrite (s1, 1, strlen (s1), me);
-}
-void memprint2 (CACHE *me, const char *s1, const char *s2) {
-	(void) memwrite (s1, 1, strlen (s1), me);
-	(void) memwrite (s2, 1, strlen (s2), me);
-}
-void memprint3 (CACHE *me, const char *s1, const char *s2, const char *s3) {
-	(void) memwrite (s1, 1, strlen (s1), me);
-	(void) memwrite (s2, 1, strlen (s2), me);
-	(void) memwrite (s3, 1, strlen (s3), me);
-}
-void memprint4 (CACHE *me, const char *s1, const char *s2, const char *s3, const char *s4) {
-	(void) memwrite (s1, 1, strlen (s1), me);
-	(void) memwrite (s2, 1, strlen (s2), me);
-	(void) memwrite (s3, 1, strlen (s3), me);
-	(void) memwrite (s4, 1, strlen (s4), me);
-}
-void memprint5 (CACHE *me, const char *s1, const char *s2, const char *s3, const char *s4, const char *s5) {
-	(void) memwrite (s1, 1, strlen (s1), me);
-	(void) memwrite (s2, 1, strlen (s2), me);
-	(void) memwrite (s3, 1, strlen (s3), me);
-	(void) memwrite (s4, 1, strlen (s4), me);
-	(void) memwrite (s5, 1, strlen (s5), me);
-}
-
-unsigned int cacgetu1 (CACHE *me) { return * (unsigned char *) my ptr ++; }
-void cacputu1 (unsigned int u, CACHE *me) { * (unsigned char *) my ptr ++ = u; }
-int cacgeti1 (CACHE *me) { return * (signed char *) my ptr ++; }
-void cacputi1 (int u, CACHE *me) { * (signed char *) my ptr ++ = u; }
-int cacgete1 (CACHE *me, const wchar_t *type) {
-	int result = * (signed char *) my ptr ++;
-	if (result < 0)
-		Melder_throw ("(cacgete1:) ", result, " is not a value of enumerated type \"", type, "\".");
-	return result;
-}
-void cacpute1 (int value, CACHE *me) {
-	* (signed char *) my ptr ++ = value;
-}
-
-int memseek (CACHE *me, long offset, int whence) {
-	my ptr = whence == 0 ? my base + offset : my ptr + offset;
-	return 0;
-}
-
-long memtell (CACHE *me) { return my ptr - my base; }
-
-void memrewind (CACHE *me) { my ptr = my base; }
-
-#define macro_cacgetb(nbits) \
-unsigned int cacgetb##nbits (CACHE *f) { \
-	unsigned char result; \
-	if (bitsInReadBuffer < nbits) { readBuffer = * f -> ptr ++; bitsInReadBuffer = 8; } \
-	result = readBuffer << (8 - bitsInReadBuffer); \
-	bitsInReadBuffer -= nbits; \
-	return result >> (8 - nbits); \
-}
-macro_cacgetb (1)
-macro_cacgetb (2)
-macro_cacgetb (3)
-macro_cacgetb (4)
-macro_cacgetb (5)
-macro_cacgetb (6)
-macro_cacgetb (7)
-void cacgetb (CACHE *f) { (void) f; bitsInReadBuffer = 0; }
-
-int cacgeti2 (CACHE *f) {
-	if (binario_16bitBE) {
-		short s;
-		START (s) READ READ
-		return s;   /* With sign extension if an int is 4 bytes. */
-	} else {
-		unsigned char bytes [2];
-		START (bytes) READ READ
-		return (signed short) (((unsigned short) bytes [0] << 8) | (unsigned short) bytes [1]);
-	}
-}
-
-unsigned int cacgetu2 (CACHE *f) {
-	if (binario_16bitBE) {
-		unsigned short s;
-		START (s) READ READ
-		return s;   /* Without sign extension. */
-	} else {
-		unsigned char bytes [2];
-		START (bytes) READ READ
-		return ((unsigned short) bytes [0] << 8) | (unsigned short) bytes [1];
-	}
-}
-
-int cacgete2 (CACHE *f, const wchar_t *type) {
-	signed short s;
-	if (binario_16bitBE) {
-		START (s) READ READ
-	} else {
-		unsigned char bytes [2];
-		START (bytes) READ READ
-		s = ((unsigned short) bytes [0] << 8) | (unsigned short) bytes [1];
-	}
-	if (s < 0)
-		Melder_throw ("(cacgete2:) ", s, " is not a value of enumerated type \"", type, "\".");
-	return s;
-}
-
-long cacgeti4 (CACHE *f) {
-	if (binario_32bitBE) {
-		long l;
-		START (l) READ READ READ READ
-		return l;
-	} else {
-		unsigned char bytes [4];
-		START (bytes) READ READ READ READ
-		return
-			((unsigned long) bytes [0] << 24) |
-			((unsigned long) bytes [1] << 16) |
-			((unsigned long) bytes [2] << 8) |
-			(unsigned long) bytes [3];
-	}
-}
-
-unsigned long cacgetu4 (CACHE *f) {
-	if (binario_32bitBE) {
-		unsigned long l;
-		START (l) READ READ READ READ
-		return l;
-	} else {
-		unsigned char bytes [4];
-		START (bytes) READ READ READ READ
-		return
-			((unsigned long) bytes [0] << 24) |
-			((unsigned long) bytes [1] << 16) |
-			((unsigned long) bytes [2] << 8) |
-			(unsigned long) bytes [3];
-	}
-}
-
-int cacgeti2LE (CACHE *f) {
-	unsigned char bytes [2];
-	START (bytes) READ READ
-	return (signed short) (((unsigned short) bytes [1] << 8) | (unsigned short) bytes [0]);
-}
-
-unsigned int cacgetu2LE (CACHE *f) {
-	unsigned char bytes [2];
-	START (bytes) READ READ
-	return ((unsigned short) bytes [1] << 8) | (unsigned short) bytes [0];
-}
-
-long cacgeti4LE (CACHE *f) {
-	unsigned char bytes [4];
-	START (bytes) READ READ READ READ
-	return
-		((unsigned long) bytes [3] << 24) | ((unsigned long) bytes [2] << 16) |
-		((unsigned long) bytes [1] << 8) | (unsigned long) bytes [0];
-}
-
-unsigned long cacgetu4LE (CACHE *f) {
-	unsigned char bytes [4];
-	START (bytes) READ READ READ READ
-	return
-		((unsigned long) bytes [3] << 24) | ((unsigned long) bytes [2] << 16) |
-		((unsigned long) bytes [1] << 8) | (unsigned long) bytes [0];
-}
-
-double cacgetr4 (CACHE *f) {
-	if (binario_floatIEEE4msb) {
-		float x;
-		START (x) READ READ READ READ
-		return x;
-	} else {
-		unsigned char bytes [4];
-		double x;
-		long exponent;
-		unsigned long mantissa;
-		START (bytes) READ READ READ READ
-		exponent = ((unsigned long) (bytes [0] & 0x7F) << 1) |
-			((unsigned long) (bytes [1] & 0x80) >> 7);
-		mantissa = ((unsigned long) (bytes [1] & 0x7F) << 16) |
-			((unsigned long) bytes [2] << 8) | (unsigned long) bytes [3];
-		if (exponent == 0)
-			if (mantissa == 0) x = 0.0;
-			else x = ldexp (UnsignedToFloat (mantissa), exponent - 149);   /* Denormalized. */
-		else if (exponent == 0x00FF)   /* Infinity or Not-a-Number. */
-			x = HUGE_VAL;
-		else   /* Finite. */
-			x  = ldexp (UnsignedToFloat (mantissa | 0x00800000), exponent - 150);
-		return bytes [0] & 0x80 ? - x : x;
-	}
-}
-
-double cacgetr8 (CACHE *f) {
-	if (binario_doubleIEEE8msb) {
-		double x;
-		START (x) READ READ READ READ READ READ READ READ
-		return x;
-	} else {
-		unsigned char bytes [8];
-		double x;
-		long exponent;
-		unsigned long highMantissa, lowMantissa;
-		START (bytes) READ READ READ READ READ READ READ READ
-		exponent = ((unsigned long) (bytes [0] & 0x7F) << 4) |
-			((unsigned long) (bytes [1] & 0xF0) >> 4);
-		highMantissa = ((unsigned long) (bytes [1] & 0x0F) << 16) |
-			((unsigned long) bytes [2] << 8) | (unsigned long) bytes [3];
-		lowMantissa = ((unsigned long) bytes [4] << 24) | ((unsigned long) bytes [5] << 16) |
-			((unsigned long) bytes [6] << 8) | (unsigned long) bytes [7];
-		if (exponent == 0)
-			if (highMantissa == 0 && lowMantissa == 0) x = 0.0;
-			else x = ldexp (UnsignedToFloat (highMantissa), exponent - 1042) +
-				ldexp (UnsignedToFloat (lowMantissa), exponent - 1074);   /* Denormalized. */
-		else if (exponent == 0x07FF)   /* Infinity of Not-a-Number. */
-			x = HUGE_VAL;
-		else
-			x = ldexp (UnsignedToFloat (highMantissa | 0x00100000), exponent - 1043) +
-				ldexp (UnsignedToFloat (lowMantissa), exponent - 1075);
-		return bytes [0] & 0x80 ? - x : x;
-	}
-}
-
-double cacgetr10 (CACHE *f) {
-	unsigned char bytes [10];
-	double x;
-	long exponent;
-	unsigned long highMantissa, lowMantissa;
-	START (bytes) READ READ READ READ READ READ READ READ READ READ
-	exponent = ((unsigned long) (bytes [0] & 0x7F) << 8) | bytes [1];
-	highMantissa = ((unsigned long) bytes [2] << 24) | ((unsigned long) bytes [3] << 16) |
-		((unsigned long) bytes [4] << 8) | (unsigned long) bytes [5];
-	lowMantissa = ((unsigned long) bytes [6] << 24) | ((unsigned long) bytes [7] << 16) |
-		((unsigned long) bytes [8] << 8) | (unsigned long) bytes [9];
-	if (exponent == 0 && highMantissa == 0 && lowMantissa == 0) x = 0;
-	else if (exponent == 0x7FFF) x = HUGE_VAL;   /* Infinity or NaN */
-	else {
-		exponent -= 16383;
-		x = ldexp (UnsignedToFloat (highMantissa), exponent - 31);
-		x += ldexp (UnsignedToFloat (lowMantissa), exponent - 63);
+		Melder_throw (U"Text not written to a binary file.");
 	}
-	return bytes [0] & 0x80 ? - x : x;
-}
-
-#define macro_cacputb(nbits) \
-void cacputb##nbits (unsigned int value, CACHE *f) { \
-	if (bitsInWriteBuffer + nbits > 8) { * f -> ptr ++ = writeBuffer; bitsInWriteBuffer = 0; writeBuffer = 0; } \
-	writeBuffer |= (value << (8 - nbits)) >> bitsInWriteBuffer; \
-	bitsInWriteBuffer += nbits; \
-}
-macro_cacputb (1)
-macro_cacputb (2)
-macro_cacputb (3)
-macro_cacputb (4)
-macro_cacputb (5)
-macro_cacputb (6)
-macro_cacputb (7)
-void cacputb (CACHE *f) {
-	if (bitsInWriteBuffer == 0) return;
-	cacputu1 (writeBuffer, f);   /* Flush. */
-	bitsInWriteBuffer = 0;
-	writeBuffer = 0;
-}
-
-void cacputi2 (int i, CACHE *f) {
-	if (binario_16bitBE) {
-		short s = i;
-		START (s) WRITE WRITE
-	} else {
-		char bytes [2];
-		bytes [0] = i >> 8;
-		bytes [1] = i;
-		{ START (bytes) WRITE WRITE }
-	}
-}
-
-void cacputu2 (unsigned int u, CACHE *f) {
-	if (binario_16bitBE) {
-		unsigned short s = u;
-		START (s) WRITE WRITE
-	} else {
-		char bytes [2];
-		bytes [0] = u >> 8;
-		bytes [1] = u;
-		{ START (bytes) WRITE WRITE }
-	}
-}
-
-void cacpute2 (int value, CACHE *f) {
-	if (binario_16bitBE) {
-		signed short s = value;
-		START (s) WRITE WRITE
-	} else {
-		char bytes [2];
-		bytes [0] = value >> 8;
-		bytes [1] = value;
-		{ START (bytes) WRITE WRITE }
-	}
-}
-
-void cacputi4 (long i, CACHE *f) {
-	if (binario_32bitBE) {
-		START (i) WRITE WRITE WRITE WRITE
-	} else {
-		char bytes [4];
-		bytes [0] = i >> 24;
-		bytes [1] = i >> 16;
-		bytes [2] = i >> 8;
-		bytes [3] = i;
-		{ START (bytes) WRITE WRITE WRITE WRITE }
-	}
-}
-
-void cacputu4 (unsigned long u, CACHE *f) {
-	if (binario_32bitBE) {
-		START (u) WRITE WRITE WRITE WRITE
-	} else {
-		char bytes [4];
-		bytes [0] = u >> 24;
-		bytes [1] = u >> 16;
-		bytes [2] = u >> 8;
-		bytes [3] = u;
-		{ START (bytes) WRITE WRITE WRITE WRITE }
-	}
-}
-
-void cacputi2LE (int i, CACHE *f) {
-	char bytes [2];
-	bytes [1] = i >> 8;
-	bytes [0] = i;
-	{ START (bytes) WRITE WRITE }
-}
-
-void cacputu2LE (unsigned int u, CACHE *f) {
-	char bytes [2];
-	bytes [1] = u >> 8;
-	bytes [0] = u;
-	{ START (bytes) WRITE WRITE }
-}
-
-void cacputi4LE (long i, CACHE *f) {
-	char bytes [4];
-	bytes [3] = i >> 24;
-	bytes [2] = i >> 16;
-	bytes [1] = i >> 8;
-	bytes [0] = i;
-	{ START (bytes) WRITE WRITE WRITE WRITE }
-}
-
-void cacputu4LE (unsigned long u, CACHE *f) {
-	char bytes [4];
-	bytes [3] = u >> 24;
-	bytes [2] = u >> 16;
-	bytes [1] = u >> 8;
-	bytes [0] = u;
-	{ START (bytes) WRITE WRITE WRITE WRITE }
-}
-
-void cacputr4 (double x, CACHE *f) {
-	if (binario_floatIEEE4msb) {
-		float x4 = x;
-		START (x4) WRITE WRITE WRITE WRITE
-	} else {
-		unsigned char bytes [4];
-		int sign, exponent;
-		double fMantissa, fsMantissa;
-		unsigned long mantissa;
-		if (x < 0.0) { sign = 0x0100; x *= -1; }
-		else sign = 0;
-		if (x == 0.0) { exponent = 0; mantissa = 0; }
-		else {
-			fMantissa = frexp (x, & exponent);
-			if ((exponent > 128) || ! (fMantissa < 1))   /* Infinity or Not-a-Number. */
-				{ exponent = sign | 0x00FF; mantissa = 0; }   /* Infinity. */
-			else {   /* Finite. */
-				exponent += 126;   /* Add bias. */
-				if (exponent <= 0) {   /* Denormalized. */
-					fMantissa = ldexp (fMantissa, exponent - 1);
-					exponent = 0;
-				}
-				exponent |= sign;
-				fMantissa = ldexp (fMantissa, 24);          
-				fsMantissa = floor (fMantissa); 
-				mantissa = FloatToUnsigned (fsMantissa) & 0x007FFFFF;
-			}
-		}
-		bytes [0] = exponent >> 1;
-		bytes [1] = (exponent << 7) | (mantissa >> 16);
-		bytes [2] = mantissa >> 8;
-		bytes [3] = mantissa;
-		{ START (bytes) WRITE WRITE WRITE WRITE }
-	}
-}
-
-void cacputr8 (double x, CACHE *f) {
-	if (binario_doubleIEEE8msb) {
-		START (x) WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE
-	} else {
-		unsigned char bytes [8];
-		int sign, exponent;
-		double fMantissa, fsMantissa;
-		unsigned long highMantissa, lowMantissa;
-		if (x < 0.0) { sign = 0x0800; x *= -1; }
-		else sign = 0;
-		if (x == 0.0) { exponent = 0; highMantissa = 0; lowMantissa = 0; }
-		else {
-			fMantissa = frexp (x, & exponent);
-			if ((exponent > 1024) || ! (fMantissa < 1))   /* Infinity or Not-a-Number. */
-				{ exponent = sign | 0x07FF; highMantissa = 0; lowMantissa = 0; }   /* Infinity. */
-			else { /* Finite. */
-				exponent += 1022;   /* Add bias. */
-				if (exponent <= 0) {   /* Denormalized. */
-					fMantissa = ldexp (fMantissa, exponent - 1);
-					exponent = 0;
-				}
-				exponent |= sign;
-				fMantissa = ldexp (fMantissa, 21);          
-				fsMantissa = floor (fMantissa); 
-				highMantissa = FloatToUnsigned (fsMantissa) & 0x000FFFFF;
-				fMantissa = ldexp (fMantissa - fsMantissa, 32); 
-				fsMantissa = floor (fMantissa); 
-				lowMantissa = FloatToUnsigned (fsMantissa);
-			}
-		}
-		bytes [0] = exponent >> 4;
-		bytes [1] = (exponent << 4) | (highMantissa >> 16);
-		bytes [2] = highMantissa >> 8;
-		bytes [3] = highMantissa;
-		bytes [4] = lowMantissa >> 24;
-		bytes [5] = lowMantissa >> 16;
-		bytes [6] = lowMantissa >> 8;
-		bytes [7] = lowMantissa;
-		{ START (bytes) WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE }
-	}
-}
-
-void cacputr10 (double x, CACHE *f) {
-	unsigned char bytes [10];
-	int sign, exponent;
-	double fMantissa, fsMantissa;
-	unsigned long highMantissa, lowMantissa;
-	if (x < 0.0) { sign = 0x8000; x *= -1; }
-	else sign = 0;
-	if (x == 0.0) { exponent = 0; highMantissa = 0; lowMantissa = 0; }
-	else {
-		fMantissa = frexp (x, & exponent);
-		if ((exponent > 16384) || ! (fMantissa < 1))   /* Infinity or Not-a-Number. */
-			{ exponent = sign | 0x7FFF; highMantissa = 0; lowMantissa = 0; }   /* Infinity. */
-		else {   /* Finite */
-			exponent += 16382;   /* Add bias. */
-			if (exponent < 0) {   /* Denormalized. */
-				fMantissa = ldexp (fMantissa, exponent);
-				exponent = 0;
-			}
-			exponent |= sign;
-			fMantissa = ldexp (fMantissa, 32);          
-			fsMantissa = floor (fMantissa); 
-			highMantissa = FloatToUnsigned (fsMantissa);
-			fMantissa = ldexp (fMantissa - fsMantissa, 32); 
-			fsMantissa = floor (fMantissa); 
-			lowMantissa = FloatToUnsigned (fsMantissa);
-		}
-	}
-	bytes [0] = exponent >> 8;
-	bytes [1] = exponent;
-	bytes [2] = highMantissa >> 24;
-	bytes [3] = highMantissa >> 16;
-	bytes [4] = highMantissa >> 8;
-	bytes [5] = highMantissa;
-	bytes [6] = lowMantissa >> 24;
-	bytes [7] = lowMantissa >> 16;
-	bytes [8] = lowMantissa >> 8;
-	bytes [9] = lowMantissa;
-	{ START (bytes) WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE WRITE }
-}
-
-fcomplex cacgetc8 (CACHE *f) {
-	fcomplex result;
-	result. re = cacgetr4 (f);
-	result. im = cacgetr4 (f);
-	return result;
-}
-
-dcomplex cacgetc16 (CACHE *f) {
-	dcomplex result;
-	result. re = cacgetr8 (f);
-	result. im = cacgetr8 (f);
-	return result;
-}
-
-void cacputc8 (fcomplex z, CACHE *f) {
-	cacputr4 (z. re, f);
-	cacputr4 (z. im, f);
-}
-
-void cacputc16 (dcomplex z, CACHE *f) {
-	cacputr8 (z. re, f);
-	cacputr8 (z. im, f);
-}
-
-char * cacgets1 (CACHE *f) {
-	try {
-		unsigned int length = (unsigned char) * f -> ptr ++;
-		autostring8 result = Melder_malloc (char, length + 1);
-		memread (result.peek(), 1, length, f);
-		result [length] = 0;   // trailing null byte
-		return result.transfer();
-	} catch (MelderError) {
-		Melder_throw ("Cannot read string from cache.");
-	}
-}
-
-char * cacgets2 (CACHE *f) {
-	try {
-		unsigned int length = cacgetu2 (f);
-		autostring8 result = Melder_malloc (char, length + 1);
-		memread (result.peek(), 1, length, f);
-		result [length] = 0;   // trailing null byte
-		return result.transfer();
-	} catch (MelderError) {
-		Melder_throw ("Cannot read string from cache.");
-	}
-}
-
-char * cacgets4 (CACHE *f) {
-	try {
-		unsigned long length = cacgetu4 (f);
-		autostring8 result = Melder_malloc (char, length + 1);
-		memread (result.peek(), 1, length, f);
-		result [length] = 0;   // trailing null byte
-		return result.transfer();
-	} catch (MelderError) {
-		Melder_throw ("Cannot read string from cache.");
-	}
-}
-
-void cacputs1 (const char *s, CACHE *f) {
-	unsigned int length = s ? strlen (s) : 0; if (length > 255) length = 255;
-	* f -> ptr ++ = length; if (s) memwrite (s, 1, length, f);
-}
-
-void cacputs2 (const char *s, CACHE *f) {
-	unsigned int length = s ? strlen (s) : 0; if (length > 65535) length = 65535;
-	cacputu2 (length, f); if (s) memwrite (s, 1, length, f);
-}
-
-void cacputs4 (const char *s, CACHE *f) {
-	unsigned long length = s ? strlen (s) : 0;
-	cacputu4 (length, f); if (s) memwrite (s, 1, length, f);
 }
 
 /* End of file abcio.cpp */
diff --git a/sys/abcio.h b/sys/abcio.h
index c582a6d..c0998ce 100644
--- a/sys/abcio.h
+++ b/sys/abcio.h
@@ -2,7 +2,7 @@
 #define _abcio_h_
 /* abcio.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,42 +38,43 @@ double texgetr8 (MelderReadText text);
 double texgetr10 (MelderReadText text);
 fcomplex texgetc8 (MelderReadText text);
 dcomplex texgetc16 (MelderReadText text);
-short texgete1 (MelderReadText text, int (*getValue) (const wchar_t *));
-short texgete2 (MelderReadText text, int (*getValue) (const wchar_t *));
+short texgete1 (MelderReadText text, int (*getValue) (const char32 *));
+short texgete2 (MelderReadText text, int (*getValue) (const char32 *));
 short texgeteb (MelderReadText text);
 short texgeteq (MelderReadText text);
 short texgetex (MelderReadText text);
 char *texgets2 (MelderReadText text);
 char *texgets4 (MelderReadText text);
-wchar_t *texgetw2 (MelderReadText text);
-wchar_t *texgetw4 (MelderReadText text);
+char32 *texgetw2 (MelderReadText text);
+char32 *texgetw4 (MelderReadText text);
 
 void texindent (MelderFile file);
 void texexdent (MelderFile file);
 void texresetindent (MelderFile file);
-void texputintro (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
+void texputintro (MelderFile file, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
 
-void texputi1 (MelderFile file, int i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputi2 (MelderFile file, int i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputi32 (MelderFile file, long i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
+void texputi1 (MelderFile file, int i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputi2 (MelderFile file, int i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputi32 (MelderFile file, long i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
 #define texputi4 texputi32
-void texputu1 (MelderFile file, unsigned int u, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputu2 (MelderFile file, unsigned int u, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputu4 (MelderFile file, unsigned long u, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputr4 (MelderFile file, double x, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputr8 (MelderFile file, double x, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputc8 (MelderFile file, fcomplex z, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputc16 (MelderFile file, dcomplex z, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texpute1 (MelderFile file, int i, const wchar_t * (*getText) (int), const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texpute2 (MelderFile file, int i, const wchar_t * (*getText) (int), const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputeb (MelderFile file, bool i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputeq (MelderFile file, bool i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputex (MelderFile file, bool i, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputs1 (MelderFile file, const char *s, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputs2 (MelderFile file, const char *s, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputs4 (MelderFile file, const char *s, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputw2 (MelderFile file, const wchar_t *s, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void texputw4 (MelderFile file, const wchar_t *s, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
+void texputu1 (MelderFile file, unsigned int u, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputu2 (MelderFile file, unsigned int u, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputu4 (MelderFile file, unsigned long u, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputr4 (MelderFile file, double x, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputr8 (MelderFile file, double x, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputc8 (MelderFile file, fcomplex z, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputc16 (MelderFile file, dcomplex z, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texpute1 (MelderFile file, int i, const char32 * (*getText) (int), const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texpute2 (MelderFile file, int i, const char32 * (*getText) (int), const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputeb (MelderFile file, bool i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputeq (MelderFile file, bool i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputex (MelderFile file, bool i, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputs1 (MelderFile file, const char *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputs2 (MelderFile file, const char *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputs4 (MelderFile file, const char *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputw2 (MelderFile file, const char32 *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputw2 (MelderFile file, const char32  *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
+void texputw4 (MelderFile file, const char32 *s, const char32 *s1, const char32 *s2, const char32 *s3, const char32 *s4, const char32 *s5, const char32 *s6);
 
 /* Portable device-independent binary input and output. */
 /* Works on all machines with 8-bit bytes and chars, and 2's complement integers. */
@@ -82,14 +83,14 @@ void texputw4 (MelderFile file, const wchar_t *s, const wchar_t *s1, const wchar
 	The 42 routines are analogous to fgetc and fputc, who read or write one character:
 		int fgetc (FILE *f);   int fputc (int c, FILE *f);   // 0..255
 */
-unsigned int bingetu1 (FILE *f);   void binputu1 (unsigned int i, FILE *f);   /* 0..255 */
-uint16_t bingetu2 (FILE *f);   void binputu2 (uint16_t i, FILE *f);   /* 0..65535 */
-uint32_t bingetu4 (FILE *f);   void binputu4 (uint32_t i, FILE *f);   /* 0..4294967295 */
+unsigned int bingetu1 (FILE *f);   void binputu1 (unsigned int i, FILE *f);   // 0..255
+uint16 bingetu2 (FILE *f);   void binputu2 (uint16 i, FILE *f);   // 0..65535
+uint32 bingetu4 (FILE *f);   void binputu4 (uint32 i, FILE *f);   // 0..4294967295
 
 int bingeti1 (FILE *f);   void binputi1 (int i, FILE *f);   /* -128..127 */
-int16_t bingeti2 (FILE *f);   void binputi2 (int16_t i, FILE *f);   /* -32768..32767 */
-int32_t bingeti3 (FILE *f);   void binputi3 (int32_t i, FILE *f);   /* -8388608..2148388607 */
-int32_t bingeti32 (FILE *f);   void binputi32 (int32_t i, FILE *f);   /* -2147483648..2147483647 */
+int16 bingeti2 (FILE *f);   void binputi2 (int16 i, FILE *f);   // -32768..32767
+int32 bingeti3 (FILE *f);   void binputi3 (int32 i, FILE *f);   // -8388608..8388607
+int32 bingeti32 (FILE *f);   void binputi32 (int32 i, FILE *f);   // -2147483648..2147483647
 #define bingeti4 bingeti32
 #define binputi4 binputi32
 /*
@@ -98,43 +99,43 @@ int32_t bingeti32 (FILE *f);   void binputi32 (int32_t i, FILE *f);   /* -214748
 	This is the native integer format on Macintosh and Silicon Graphics Iris.
 */
 
-int16_t bingeti2LE (FILE *f);   void binputi2LE (int16_t i, FILE *f);   /* -32768..32767 */
-int32_t bingeti3LE (FILE *f);   void binputi3LE (int32_t i, FILE *f);   /* -8388608..2148388607 */
-int32_t bingeti4LE (FILE *f);   void binputi4LE (int32_t i, FILE *f);   /* -2147483648..2147483647 */
-uint16_t bingetu2LE (FILE *f);   void binputu2LE (uint16_t i, FILE *f);   /* 0..65535 */
-uint32_t bingetu4LE (FILE *f);   void binputu4LE (uint32_t i, FILE *f);   /* 0..4294967295 */
+int16 bingeti2LE (FILE *f);   void binputi2LE (int16 i, FILE *f);   // -32768..32767
+int32 bingeti3LE (FILE *f);   void binputi3LE (int32 i, FILE *f);   // -8388608..8388607
+int32 bingeti4LE (FILE *f);   void binputi4LE (int32 i, FILE *f);   // -2147483648..2147483647
+uint16 bingetu2LE (FILE *f);   void binputu2LE (uint16 i, FILE *f);   // 0..65535
+uint32 bingetu4LE (FILE *f);   void binputu4LE (uint32 i, FILE *f);   // 0..4294967295
 /*
 	Read or write signed or unsigned integers from or to 2 or 4 bytes in the stream 'f',
 	in little-endian byte order (least significant byte first).
 	This is the native integer format on Vax and IBM PC.
 */
 
-unsigned int bingetb1 (FILE *f);   void binputb1 (unsigned int value, FILE *f);   /* 0..1*/
-unsigned int bingetb2 (FILE *f);   void binputb2 (unsigned int value, FILE *f);   /* 0..3 */
-unsigned int bingetb3 (FILE *f);   void binputb3 (unsigned int value, FILE *f);   /* 0..7 */
-unsigned int bingetb4 (FILE *f);   void binputb4 (unsigned int value, FILE *f);   /* 0..15 */
-unsigned int bingetb5 (FILE *f);   void binputb5 (unsigned int value, FILE *f);   /* 0..31 */
-unsigned int bingetb6 (FILE *f);   void binputb6 (unsigned int value, FILE *f);   /* 0..63 */
-unsigned int bingetb7 (FILE *f);   void binputb7 (unsigned int value, FILE *f);   /* 0..127 */
+unsigned int bingetb1 (FILE *f);   void binputb1 (unsigned int value, FILE *f);   // 0..1
+unsigned int bingetb2 (FILE *f);   void binputb2 (unsigned int value, FILE *f);   // 0..3
+unsigned int bingetb3 (FILE *f);   void binputb3 (unsigned int value, FILE *f);   // 0..7
+unsigned int bingetb4 (FILE *f);   void binputb4 (unsigned int value, FILE *f);   // 0..15
+unsigned int bingetb5 (FILE *f);   void binputb5 (unsigned int value, FILE *f);   // 0..31
+unsigned int bingetb6 (FILE *f);   void binputb6 (unsigned int value, FILE *f);   // 0..63
+unsigned int bingetb7 (FILE *f);   void binputb7 (unsigned int value, FILE *f);   // 0..127
 void bingetb (FILE *f);   void binputb (FILE *f);
 /*
 	Read or write an unsigned integer from or to a number of bits in the stream 'f'.
 	After an uninterrupted sequence of bingetbxxx or binputbxxx, call bingetb or binputb.
 	Not reentrant: uses a static one-byte buffer. Do not call from interrupt routines.
 	Example 1:
-		int hasTitle = bingetb1 (f);   // One bit.
-		int category = bingetb3 (f);   // A number in the range 0..7.
-		int sense = bingetb2 (f);   // A number in the range 0..3.
+		int hasTitle = bingetb1 (f);   // one bit
+		int category = bingetb3 (f);   // a number in the range 0..7
+		int sense = bingetb2 (f);   // a number in the range 0..3
 		bingetb (f);
 	Example 2:
-		binputb1 (hasTitle, f);   // One bit.
-		binputb3 (category, f);   // A number in the range 0..7.
-		binputb2 (sense, f);   // A number in the range 0..3.
+		binputb1 (hasTitle, f);   // one bit
+		binputb3 (category, f);   // a number in the range 0..7
+		binputb2 (sense, f);   // a number in the range 0..3
 		binputb (f);
 */
 
-int bingete1 (FILE *f, int min, int max, const wchar_t *type);
-int bingete2 (FILE *f, int min, int max, const wchar_t *type);
+int bingete1 (FILE *f, int min, int max, const char32 *type);
+int bingete2 (FILE *f, int min, int max, const char32 *type);
 #define bingeteb bingeti1
 #define bingeteq bingeti1
 #define bingetex bingeti1
@@ -147,35 +148,35 @@ void binpute2 (int value, FILE *f);
 
 double bingetr4 (FILE *f);   void binputr4 (double x, FILE *f);
 /*
-	Read or write a real number from or to 4 bytes in the stream 'f',
+	Read or write a real number from or to 4 bytes in the stream `f`,
 	in IEEE single-precision binary real format, with the most significant bit first.
 	NaN's (Not-a-Numbers) and infinities get the value HUGE, which equals infinity on IEEE machines.
 	Absolute values of normalized numbers (23 bits precision): 1.2e-38 .. 3.4e38.
 	Denormalized: from 1.4e-45.
-	This is the native format of a 'float' on Macintosh and Silicon Graphics Iris.
+	This is the native format of a `float` on Macintosh and Silicon Graphics Iris.
 */
-double bingetr4LE (FILE *f);   void binputr4LE (double x, FILE *f);   // Least significant bit first.
+double bingetr4LE (FILE *f);   void binputr4LE (double x, FILE *f);   // least significant bit first
 
 double bingetr8 (FILE *f);   void binputr8 (double x, FILE *f);
 /*
-	Read or write a real number from or to 8 bytes in the stream 'f',
+	Read or write a real number from or to 8 bytes in the stream `f`,
 	in IEEE double-precision binary real format, with the most significant bit first.
 	NaN's (Not-a-Numbers) and infinities get the value HUGE, which equals infinity on IEEE machines.
 	Absolute values of normalized numbers (52 bits precision): 2.2e-308 .. 1.8e308.
 	Denormalized: from 4.9e-324.
-	This is the native format of a 'double' on Silicon Graphics Iris and PowerMac.
+	This is the native format of a `double` on Silicon Graphics Iris and PowerMac.
 */
 
 double bingetr10 (FILE *f);   void binputr10 (double x, FILE *f);
 /*
-	Read or write a real number from or to 10 bytes in the stream 'f',
+	Read or write a real number from or to 10 bytes in the stream `f`,
 	in IEEE extended-precision binary real format, with the most significant bit first,
 	as implemented in Motorola's MC68881 floating-point coprocessor.
 	NaN's (Not-a-Numbers) and infinities get the value HUGE, which equals infinity on IEEE machines.
 	Absolute values of normalized numbers (63 bits precision): 8e-4933 .. 6e4931.
 	Denormalized: from 9e-4952.
 	This format is used to encode the sampling rate in AIFF (Audio Interchange File Format) files,
-	and is the native format of a 'double' on 68k Macintosh.
+	and is the native format of a `double` on 68k Macintosh.
 */
 
 fcomplex bingetc8 (FILE *f);
@@ -183,84 +184,19 @@ dcomplex bingetc16 (FILE *f);
 void binputc8 (fcomplex z, FILE *f);
 void binputc16 (dcomplex z, FILE *f);
 
-char * bingets1 (FILE *f);   void binputs1 (const char *s, FILE *f);   /* 0..255 characters. */
-char * bingets2 (FILE *f);   void binputs2 (const char *s, FILE *f);   /* 0..65535 characters. */
-char * bingets4 (FILE *f);   void binputs4 (const char *s, FILE *f);   /* 0..4294967295 characters. */
+char * bingets1 (FILE *f);   void binputs1 (const char *s, FILE *f);   // 0..255 characters
+char * bingets2 (FILE *f);   void binputs2 (const char *s, FILE *f);   // 0..65535 characters
+char * bingets4 (FILE *f);   void binputs4 (const char *s, FILE *f);   // 0..4294967295 characters
 /*
-	Read or write a string from or to wcslen (s) UTF-16LE or ASCII characters + 1, 2, or 4 bytes in the stream 'f',
+	Read or write a string from or to `str32len(s)` UTF-16LE or ASCII characters plus 1, 2, or 4 bytes in the stream `f`,
 	in a Pascal-style format: first the length, then the characters, without a trailing null byte.
-	bingetsxxx returns a new 'malloc'ed null-terminated C string (for the caller to 'free' it),
-	or NULL if out of memory.
-	binputsxxx expects a null-terminated C string whose 'wcslen' fits in 1, 2, or 4 bytes.
+	bingetsxxx returns a new 'malloc'ed null-terminated C string (for the caller to `free` it).
+	Fail if out of memory.
+	binputsxxx expects a null-terminated C string whose `str32len` fits in 1, 2, or 4 bytes.
 */
-wchar_t * bingetw1 (FILE *f);   void binputw1 (const wchar_t *s, FILE *f);
-wchar_t * bingetw2 (FILE *f);   void binputw2 (const wchar_t *s, FILE *f);
-wchar_t * bingetw4 (FILE *f);   void binputw4 (const wchar_t *s, FILE *f);
-
-/********** cache I/O **********/
-
-typedef struct { unsigned char *ptr, *base, *max; } CACHE;
-
-CACHE * memopen (size_t nbytes);
-
-/* The following routines are completely analogous to fxxx, although they do not check for overflow. */
-
-int memclose (CACHE *f);
-size_t memread (void *ptr, size_t size, size_t nmemb, CACHE *m);
-size_t memwrite (const void *ptr, size_t size, size_t nmemb, CACHE *m);
-int memseek (CACHE *f, long offset, int whence);   /* No SEEK_END. */
-long memtell (CACHE *f);
-void memrewind (CACHE *me);
-
-void memprint1 (CACHE *me, const char *s1);
-void memprint2 (CACHE *me, const char *s1, const char *s2);
-void memprint3 (CACHE *me, const char *s1, const char *s2, const char *s3);
-void memprint4 (CACHE *me, const char *s1, const char *s2, const char *s3, const char *s4);
-void memprint5 (CACHE *me, const char *s1, const char *s2, const char *s3, const char *s4, const char *s5);
-
-/*
-	Portable device-independent binary input and output from and to a CACHE.
-	This rest of this header file is completely analogous to binario.h, with only the following changes:
-		bingetxxx replaced by cacgetxxx;
-		binputxxx replaced by cacputxxx;
-		FILE replaced by CACHE;
-*/
-unsigned int cacgetb1 (CACHE *f);   void cacputb1 (unsigned int value, CACHE *f);
-unsigned int cacgetb2 (CACHE *f);   void cacputb2 (unsigned int value, CACHE *f);
-unsigned int cacgetb3 (CACHE *f);   void cacputb3 (unsigned int value, CACHE *f);
-unsigned int cacgetb4 (CACHE *f);   void cacputb4 (unsigned int value, CACHE *f);
-unsigned int cacgetb5 (CACHE *f);   void cacputb5 (unsigned int value, CACHE *f);
-unsigned int cacgetb6 (CACHE *f);   void cacputb6 (unsigned int value, CACHE *f);
-unsigned int cacgetb7 (CACHE *f);   void cacputb7 (unsigned int value, CACHE *f);
-void cacgetb (CACHE *f);   void cacputb (CACHE *f);
-unsigned int cacgetu1 (CACHE *f); void cacputu1 (unsigned int u, CACHE *f);
-unsigned int cacgetu2 (CACHE *f);   void cacputu2 (unsigned int i, CACHE *f);
-unsigned long cacgetu4 (CACHE *f);   void cacputu4 (unsigned long i, CACHE *f);
-int cacgete1 (CACHE *f, const wchar_t *type); void cacpute1 (int value, CACHE *f);
-int cacgete2 (CACHE *f, const wchar_t *type);   void cacpute2 (int value, CACHE *f);
-#define cacgeteb cacgeti1
-#define cacgeteq cacgeti1
-#define cacgetex cacgeti1
-#define cacputeb cacputi1
-#define cacputeq cacputi1
-#define cacputex cacputi1
-int cacgeti1 (CACHE *f);   void cacputi1 (int i, CACHE *f);
-int cacgeti2 (CACHE *f);   void cacputi2 (int i, CACHE *f);
-long cacgeti4 (CACHE *f);   void cacputi4 (long i, CACHE *f);
-int cacgeti2LE (CACHE *f);   void cacputi2LE (int i, CACHE *f);
-double cacgetr4 (CACHE *f);   void cacputr4 (double x, CACHE *f);
-double cacgetr8 (CACHE *f);   void cacputr8 (double x, CACHE *f);
-double cacgetr10 (CACHE *f);   void cacputr10 (double x, CACHE *f);
-fcomplex cacgetc8 (CACHE *f);
-dcomplex cacgetc16 (CACHE *f);
-void cacputc8 (fcomplex z, CACHE *f);
-void cacputc16 (dcomplex z, CACHE *f);
-long cacgeti4LE (CACHE *f);   void cacputi4LE (long i, CACHE *f);
-unsigned int cacgetu2LE (CACHE *f);   void cacputu2LE (unsigned int i, CACHE *f);
-unsigned long cacgetu4LE (CACHE *f);   void cacputu4LE (unsigned long i, CACHE *f);
-char * cacgets1 (CACHE *f);   void cacputs1 (const char *s, CACHE *f);
-char * cacgets2 (CACHE *f);   void cacputs2 (const char *s, CACHE *f);
-char * cacgets4 (CACHE *f);   void cacputs4 (const char *s, CACHE *f);
+char32 * bingetw1 (FILE *f);   void binputw1 (const char32 *s, FILE *f);
+char32 * bingetw2 (FILE *f);   void binputw2 (const char32 *s, FILE *f);
+char32 * bingetw4 (FILE *f);   void binputw4 (const char32 *s, FILE *f);
 
 /* End of file abcio.h */
 #endif
diff --git a/sys/abcio_enums.h b/sys/abcio_enums.h
index e62a9d4..696972f 100644
--- a/sys/abcio_enums.h
+++ b/sys/abcio_enums.h
@@ -1,6 +1,6 @@
 /* abcio_enums.h
  *
- * Copyright (C) 1992-2009 Paul Boersma
+ * Copyright (C) 1992-2009,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,23 +17,19 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-/*
- * pb 2009/03/18
- */
-
 enums_begin (kBoolean, 0)
-	enums_add (kBoolean, 0, FALSE, L"false")
-	enums_add (kBoolean, 1, TRUE, L"true")
+	enums_add (kBoolean, 0, FALSE, U"false")
+	enums_add (kBoolean, 1, TRUE, U"true")
 enums_end (kBoolean, 1, FALSE)
 
 enums_begin (kQuestion, 0)
-	enums_add (kQuestion, 0, NO, L"no")
-	enums_add (kQuestion, 1, YES, L"yes")
+	enums_add (kQuestion, 0, NO, U"no")
+	enums_add (kQuestion, 1, YES, U"yes")
 enums_end (kQuestion, 1, NO)
 
 enums_begin (kExistence, 0)
-	enums_add (kExistence, 0, ABSENT, L"absent")
-	enums_add (kExistence, 1, EXISTS, L"exists")
+	enums_add (kExistence, 0, ABSENT, U"absent")
+	enums_add (kExistence, 1, EXISTS, U"exists")
 enums_end (kExistence, 1, ABSENT)
 
 /* End of file abcio_enums.h */
diff --git a/sys/enums.h b/sys/enums.h
index 12e0186..d7c5689 100644
--- a/sys/enums.h
+++ b/sys/enums.h
@@ -2,7 +2,7 @@
 #define _enums_h_
 /* enums.h
  *
- * Copyright (C) 2007,2013 Paul Boersma
+ * Copyright (C) 2007,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,8 +24,8 @@
 #define enums_alt(type,which,text)
 #define enums_end(type,maximum,def) type##_MAX = maximum, \
 	type##_DEFAULT = type##_##def }; \
-	const wchar_t * type##_getText (int value); \
-	int type##_getValue (const wchar_t *text);
+	const char32 * type##_getText (int value); \
+	int type##_getValue (const char32 *text);
 
 /* End of file enums.h */
 #endif
diff --git a/sys/enums_getText.h b/sys/enums_getText.h
index 203c403..ca3dd7b 100644
--- a/sys/enums_getText.h
+++ b/sys/enums_getText.h
@@ -1,6 +1,6 @@
 /* enums_getText.h
  *
- * Copyright (C) 2007 Paul Boersma
+ * Copyright (C) 2007,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 #undef enums_add
 #undef enums_alt
 #undef enums_end
-#define enums_begin(type,minimum)  const wchar_t * type##_getText (int testValue) { return
+#define enums_begin(type,minimum)  const char32 * type##_getText (int testValue) { return
 #define enums_add(type,value,which,text)  testValue == type##_##which ? text :
 #define enums_alt(type,which,text)
 #define enums_end(type,maximum,def) type##_getText (type##_DEFAULT); }
diff --git a/sys/enums_getValue.h b/sys/enums_getValue.h
index 96923b7..d053550 100644
--- a/sys/enums_getValue.h
+++ b/sys/enums_getValue.h
@@ -1,6 +1,6 @@
 /* enums_getValue.h
  *
- * Copyright (C) 2007-2009 Paul Boersma
+ * Copyright (C) 2007-2009,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,12 +25,12 @@
 #undef enums_add
 #undef enums_alt
 #undef enums_end
-#define enums_begin(type,minimum)  int type##_getValue (const wchar_t *testText) {
-#define enums_add(type,value,which,text)  if (Melder_wcsequ_firstCharacterCaseInsensitive (testText, text)) return type##_##which;
-#define enums_alt(type,which,text)  if (Melder_wcsequ_firstCharacterCaseInsensitive (testText, text)) return type##_##which;
+#define enums_begin(type,minimum)  int type##_getValue (const char32 *testText) {
+#define enums_add(type,value,which,text)  if (Melder_str32equ_firstCharacterCaseInsensitive (testText, text)) return type##_##which;
+#define enums_alt(type,which,text)  if (Melder_str32equ_firstCharacterCaseInsensitive (testText, text)) return type##_##which;
 #define enums_end(type,maximum,def) \
-	if (wcsequ (testText, L"\t")) return type##_DEFAULT; \
-	if (wcsequ (testText, L"\n")) return maximum; \
+	if (str32equ (testText, U"\t")) return type##_DEFAULT; \
+	if (str32equ (testText, U"\n")) return maximum; \
 	return -1; }
 
 /* End of file enums_getValue.h */
diff --git a/sys/lispio.cpp b/sys/lispio.cpp
deleted file mode 100644
index b900ae0..0000000
--- a/sys/lispio.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/* lispio.cpp
- *
- * Copyright (C) 1994-2011 Paul Boersma
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-/*
- * pb 1995/07/28
- * pb 2002/03/07 GPL
- * pb 2011/05/15 C++
- */
-
-#include "melder.h"
-#include "lispio.h"
-#include <ctype.h>
-
-#define my  me ->
-#define thy  thee ->
-
-int Lispio_openList (const Lispio *me, LispioSeq *thee) {
-	int ch;
-	if (my length == 0) return 0;   /* Empty object. */
-	if (my string [0] != '(') return 0;   /* Not a list. */
-	Melder_assert (my length >= 2);
-	Melder_assert (my string [my length - 1] == ')');
-	/* Peel leading '(' and trailing ')'. */
-	thy length = my length - 2;
-	thy string = my string + 1;
-	/* Forget leading spaces. */
-	while (thy length != 0 && ((ch = *thy string) == ' ' || ch == '\n' || ch == '\t')) {
-		thy length --;
-		thy string ++;
-	}
-	return 1;
-}
-
-int Lispio_openListFromFile (LispioSeq *seq, FILE *f, char *buffer, long maxLength) {
-	long depth = 0, length = 0;
-	int ch;
-	Lispio list;
-
-	/* Skip spaces to left parenthesis, checking for normal end-of-file. */
-
-	while ((ch = getc (f)) != '(') {
-		if (ch == EOF) return EOF;
-		if (ch != ' ' && ch != '\n' && ch != '\t')
-			Melder_throw ("Lispio_openListFromFile: not a list: expected leading `(' but found character `%c'.", ch);
-	}
-	buffer [0] = ch;
-	depth = 1;
-	length = 1;
-	while (depth != 0) {
-		ch = getc (f);
-		if (ch == EOF)
-			Melder_throw ("Lispio_openListFromFile: early end-of-file detected: no matching `)': depth %ld instead of 0.", depth);
-		if (length >= maxLength)
-			Melder_throw ("Lispio_openListFromFile: buffer too small for list: list longer than %ld bytes.", maxLength);
-		buffer [length ++] = ch;
-		if (ch == '(') depth += 1; else if (ch == ')') depth -= 1;
-	}
-	list.length = length;
-	list.string = buffer;
-	return Lispio_openList (& list, seq);   // always 1
-}
-
-char * Lispio_string (const Lispio *me) {
-	autostring8 result = Melder_malloc (char, my length + 1);
-	memcpy (result.peek(), my string, my length);
-	result [my length] = '\0';
-	return result.transfer();
-}
-
-int Lispio_equal (const Lispio *me, const Lispio *thee) {
-	long length = my length;
-	return thy length == length && (length == 0 || ! memcmp (my string, thy string, length));
-}
-
-int Lispio_strequ (const Lispio *me, const char *string) {
-	long length = my length, thyLength = strlen (string);
-	return thyLength == length && (length == 0 || ! memcmp (my string, string, length));
-}
-
-int Lispio_read (LispioSeq *me, Lispio *first) {
-	int ch;
-	first -> string = my string;
-	if (my length == 0) { first -> length = 0; return 0; }
-	if ((ch = my string [0]) == '(') {   /* First is a list? */
-		long depth = 1;
-		first -> length = 1;
-		while (depth != 0) {
-			ch = first -> string [first -> length ++];
-			if (ch == '(') depth += 1; else if (ch == ')') depth -= 1;
-		}
-	} else {   /* First is an atom? */
-		first -> length = 1;
-		while ((ch = first -> string [first -> length ++]) != ' ' && ch != '\n' && ch != '\t' && ch != '(' && ch != ')')
-			{ }
-		first -> length -= 1;   /* Put back delimiter. */
-	}
-	my length -= first -> length;
-	Melder_assert (my length >= 0);
-	my string += first -> length;
-	while (my length != 0 && ((ch = *my string) == ' ' || ch == '\n' || ch == '\t'))
-		{ my length --; my string ++; }   /* Remove leading spaces. */
-	return 1;
-}
-
-long Lispio_count (const LispioSeq *me) {
-	long result = 0;
-	LispioSeq seq = * (LispioSeq *) me;
-	Lispio obj;
-	while (Lispio_read (& seq, & obj)) result ++;
-	return result;
-}
-
-int Lispio_integer (const Lispio *me, long *value) {
-	char buffer [12];
-	int ichar = 0, numeric = 1;
-	*value = 0;
-	if (my length < 1 || my length > 11) return 0;
-	if (my string [0] == '+' || my string [0] == '-') {
-		if (my length < 2) return 0;   /* Only a sign. */
-		ichar = 1;
-	}
-	for (; ichar < my length; ichar ++) if (! isdigit (my string [ichar])) numeric = 0;
-	strncpy (buffer, my string, my length);
-	buffer [my length] = '\0';
-	*value = atol (buffer);
-	return numeric;
-}
-
-/* End of file lispio.cpp */
diff --git a/sys/lispio.h b/sys/lispio.h
deleted file mode 100644
index 8877a07..0000000
--- a/sys/lispio.h
+++ /dev/null
@@ -1,109 +0,0 @@
-#ifndef _lispio_h_
-#define _lispio_h_
-/* lispio.h
- *
- * Copyright (C) 1994-2011 Paul Boersma
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include "melder.h"
-
-/* A LISP object is a list or an atom. */
-
-typedef struct Lispio { long length; const char *string; } Lispio;
-
-/* A LISP sequence is a sequence of LISP objects. */
-
-typedef struct LispioSeq { long length; const char *string; } LispioSeq;
-
-/* All of the following routines expect and return structures without leading spaces. */
-/* Moreover, a Lispio has no trailing spaces. */
-
-int Lispio_openList (const Lispio *me, LispioSeq *thee);
-/*
-	Function:
-		strip the leading '(' and spaces; strip the trailing ')'.
-	Return value:
-		my length != 0 && my string [0] == '(';   // Am I a list?
-	Postconditions:
-		result == 0 || thy length <= my length - 2;
-*/
-
-int Lispio_openListFromFile (LispioSeq *me, FILE *f, char *buffer, long maxLength);
-/*
-	Arguments:
-		f: an open text stream;
-		buffer [0..maxLength-1]: a buffer preallocated on the heap;
-	Return value:
-		0: failure:
-			Not a list: expected leading '(' but found character '%c'.
-			Early end-of-file detected: no matching ')': depth %ld instead of 0.
-			Buffer too small for list: list longer than <maxLength> bytes.
-		EOF: normal end of file.
-		1: OK.
-	Warning:
-		'me' and all the structures derived from 'me' are valid until the next Lispio_openListFromFile ().
-	Example:
-		reading all lists in a file:
-			LispioSeq entry;
-			autofile f = Melder_fopen (fileName, "r");
-			autostring8 buffer = Melder_malloc (200000);
-			for (;;)
-			{
-				int status = Lispio_openListFromFile (& entry, f, buffer, 200000);
-				if (! status) goto error;
-				if (status == EOF) break;   // Leave loop.
-				if (! myProcessList (entry)) goto error;
-			}
-			f.close (file);
-*/
-
-char * Lispio_string (const Lispio *me);
-/*
-	Return value:
-		a new null-terminated C string, or NULL if out of memory.
-	Postcondition:
-		result == NULL || strlen (result) == my length && result [0..my length-1] == my string [0..my length-1];
-*/
-
-int Lispio_equal (const Lispio *me, const Lispio *thee);
-/*
-	Returns thy length == my length && thy string [0..my length-1] == my string [0..my length-1];
-*/
-
-int Lispio_strequ (const Lispio *me, const char *string);
-/*
-	Returns strlen (string) == my length && string [0..my length-1] == my string [0..my length-1];
-*/
-
-int Lispio_read (LispioSeq *me, Lispio *first);
-/*
-	Return value:
-		1 if something was found; 0 otherwise.
-	Example:
-		cycle through all the LISP objects in a sequence:
-			while (Lispio_read (& sequence, & object))
-				processObject (& object);
-*/
-
-long Lispio_count (const LispioSeq *me);
-
-int Lispio_isInteger (const Lispio *me);
-
-int Lispio_integer (const Lispio *me, long *value);
-
-/* End of file lispio.h */
-#endif
diff --git a/sys/machine.cpp b/sys/machine.cpp
index e3b7886..6947e79 100644
--- a/sys/machine.cpp
+++ b/sys/machine.cpp
@@ -40,7 +40,7 @@
 
 static int lookAndFeel;
 
-int Machine_getMenuBarHeight (void) {
+int Machine_getMenuBarHeight () {
 	static int heights [] = {
 		26,   /* Motif */
 		24,   /* SGI */
@@ -56,7 +56,7 @@ int Machine_getMenuBarHeight (void) {
 	return heights [lookAndFeel];
 }
 
-int Machine_getMainWindowMenuBarHeight (void) {
+int Machine_getMainWindowMenuBarHeight () {
 	#ifdef macintoshXXX
 		return 0;
 	#else
@@ -64,7 +64,7 @@ int Machine_getMainWindowMenuBarHeight (void) {
 	#endif
 }
 
-int Machine_getTitleBarHeight (void) {
+int Machine_getTitleBarHeight () {
 	static int heights [] = {   /* Mostly copied from menu-bar height. */
 		26,   /* Motif */
 		24,   /* SGI */
@@ -80,7 +80,7 @@ int Machine_getTitleBarHeight (void) {
 	return heights [lookAndFeel];
 }
 
-int Machine_getScrollBarWidth (void) {
+int Machine_getScrollBarWidth () {
 	static int widths [] = {
 		22,   /* Motif */
 		22,   /* SGI */
@@ -96,7 +96,7 @@ int Machine_getScrollBarWidth (void) {
 	return widths [lookAndFeel];
 }
 
-int Machine_getTextHeight (void) {
+int Machine_getTextHeight () {
 	static int heights [] = {
 		29,   /* Motif */
 		29,   /* SGI */
diff --git a/sys/machine.h b/sys/machine.h
index 518b50c..080b6cf 100644
--- a/sys/machine.h
+++ b/sys/machine.h
@@ -20,11 +20,11 @@
  */
 
 void Machine_initLookAndFeel (unsigned int argc, char **argv);
-int Machine_getMenuBarHeight (void);
-int Machine_getMainWindowMenuBarHeight (void);
-int Machine_getTitleBarHeight (void);
-int Machine_getScrollBarWidth (void);
-int Machine_getTextHeight (void);
+int Machine_getMenuBarHeight ();
+int Machine_getMainWindowMenuBarHeight ();
+int Machine_getTitleBarHeight ();
+int Machine_getScrollBarWidth ();
+int Machine_getTextHeight ();
 
 /* End of file machine.h */
 #endif
diff --git a/sys/melder.cpp b/sys/melder.cpp
index c69f1a6..bd28f76 100644
--- a/sys/melder.cpp
+++ b/sys/melder.cpp
@@ -1,6 +1,6 @@
 /* melder.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brausse, 2013 Tom Naughton
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma, 2008 Stefan de Konink, 2010 Franz Brausse, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,7 +17,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <math.h>
 #include <time.h>
 #include <ctype.h>
 #include <assert.h>
@@ -32,20 +31,20 @@
 	//#include <Sound.h>
 	#include "macport_off.h"
 #endif
-#ifndef CONSOLE_APPLICATION
-	#include "Graphics.h"
-	#include "machine.h"
-	#ifdef macintosh
-		#include "macport_on.h"
-        #if useCarbon
-            #include <Carbon/Carbon.h>
-        #else
-            #include <AudioToolbox/AudioToolbox.h>
-        #endif
-		#include "macport_off.h"
+
+#include "Graphics.h"
+#include "machine.h"
+#ifdef macintosh
+	#include "macport_on.h"
+	#if useCarbon
+		#include <Carbon/Carbon.h>
+	#else
+		#include <AudioToolbox/AudioToolbox.h>
 	#endif
-	#include "Gui.h"
+	#include "macport_off.h"
 #endif
+#include "Gui.h"
+
 #include "MelderThread.h"
 
 #include "enums_getText.h"
@@ -58,70 +57,66 @@
 bool Melder_batch;   // don't we have a GUI?- Set once at application start-up
 bool Melder_backgrounding;   // are we running a script?- Set and unset dynamically
 bool Melder_asynchronous;
-char Melder_buffer1 [30001], Melder_buffer2 [30001];
-unsigned long Melder_systemVersion;
+int32 Melder_systemVersion;
 
-#ifndef CONSOLE_APPLICATION
-	GuiWindow Melder_topShell;
-#endif
+GuiWindow Melder_topShell;
 
-static void defaultHelp (const wchar_t *query) {
-	Melder_error_ ("Don't know how to find help on \"", query, "\".");
-	Melder_flushError (NULL);
+static void defaultHelp (const char32 *query) {
+	Melder_flushError (U"Don't know how to find help on \"", query, U"\".");
 }
 
-static void defaultSearch (void) {
-	Melder_flushError ("Do not know how to search.");
+static void defaultSearch () {
+	Melder_flushError (U"Do not know how to search.");
 }
 
-static void defaultWarning (const wchar_t *message) {
-	Melder_writeToConsole (L"Warning: ", true);
+static void defaultWarning (const char32 *message) {
+	Melder_writeToConsole (U"Warning: ", true);
 	Melder_writeToConsole (message, true);
-	Melder_writeToConsole (L"\n", true);
+	Melder_writeToConsole (U"\n", true);
 }
 
-static void defaultFatal (const wchar_t *message) {
-	Melder_writeToConsole (L"Fatal error: ", true);
+static void defaultFatal (const char32 *message) {
+	Melder_writeToConsole (U"Fatal error: ", true);
 	Melder_writeToConsole (message, true);
-	Melder_writeToConsole (L"\n", true);
+	Melder_writeToConsole (U"\n", true);
 }
 
 static int defaultPublish (void *anything) {
 	(void) anything;
-	return 0;   /* Nothing published. */
+	return 0;   // nothing published
 }
 
 static int defaultRecord (double duration) {
 	(void) duration;
-	return 0;   /* Nothing recorded. */
+	return 0;   // nothing recorded
 }
 
 static int defaultRecordFromFile (MelderFile file) {
 	(void) file;
-	return 0;   /* Nothing recorded. */
+	return 0;   // nothing recorded
 }
 
-static void defaultPlay (void) {}
+static void defaultPlay () {}
 
-static void defaultPlayReverse (void) {}
+static void defaultPlayReverse () {}
 
-static int defaultPublishPlayed (void) {
+static int defaultPublishPlayed () {
 	return 0;   /* Nothing published. */
 }
 
 /********** Current message methods: initialize to default (batch) behaviour. **********/
 
 static struct {
-	void (*help) (const wchar_t *query);
-	void (*search) (void);
-	void (*warning) (const wchar_t *message);
-	void (*fatal) (const wchar_t *message);
+	void (*help) (const char32 *query);
+	void (*search) ();
+	void (*warning) (const char32 *message);
+	void (*fatal) (const char32 *message);
 	int (*publish) (void *anything);
 	int (*record) (double duration);
-	int (*recordFromFile) (MelderFile fs);
-	void (*play) (void);
-	void (*playReverse) (void);
-	int (*publishPlayed) (void);
+	int (*recordFromFile) (MelderFile file);
+	void (*play) ();
+	void (*playReverse) ();
+	int (*publishPlayed) ();
 }
 	theMelder = {
 		defaultHelp, defaultSearch,
@@ -130,32 +125,21 @@ static struct {
 		defaultRecord, defaultRecordFromFile, defaultPlay, defaultPlayReverse, defaultPublishPlayed
 	};
 
-/********** CASUAL **********/
-
-void Melder_casual (const char *format, ...) {
-	va_list arg;
-	va_start (arg, format);
-	vsprintf (Melder_buffer1, format, arg);
-	fprintf (stderr, "%s\n", Melder_buffer1);
-	va_end (arg);
-}
-
 /********** PROGRESS **********/
 
 static int theProgressDepth = 0;
 static bool theProgressCancelled = false;
-void Melder_progressOff (void) { theProgressDepth --; }
-void Melder_progressOn (void) { theProgressDepth ++; }
+void Melder_progressOff () { theProgressDepth --; }
+void Melder_progressOn () { theProgressDepth ++; }
 
-#ifndef CONSOLE_APPLICATION
-static bool waitWhileProgress (double progress, const wchar_t *message, GuiDialog dia, GuiProgressBar scale, GuiLabel label1, GuiLabel label2, GuiButton cancelButton) {
+static bool waitWhileProgress (double progress, const char32 *message, GuiDialog dia, GuiProgressBar scale, GuiLabel label1, GuiLabel label2, GuiButton cancelButton) {
 	#if gtk
 		// Wait for all pending events to be processed. If anybody knows how to inspect GTK's
 		// event queue for specific events, dump the code here, please.
 		// Until then, the button click attaches a g_object data key named "pressed" to the cancelButton
 		// which this function reads out in order to tell whether interruption has occurred
 		while (gtk_events_pending ()) {
-			trace ("event pending");
+			trace (U"event pending");
 			gtk_main_iteration ();
 		}
 	#elif defined (macintosh)
@@ -232,47 +216,47 @@ static bool waitWhileProgress (double progress, const wchar_t *message, GuiDialo
 		}
 	#endif
 	if (progress >= 1.0) {
-		dia -> f_hide ();
+		GuiThing_hide (dia);
 	} else {
 		if (progress <= 0.0) progress = 0.0;
-		dia -> f_show ();   // TODO: prevent raising to the front
-		const wchar_t *newline = wcschr (message, '\n');
-		if (newline != NULL) {
-			static MelderString buffer = { 0 };
+		GuiThing_show (dia);   // TODO: prevent raising to the front
+		const char32 *newline = str32chr (message, U'\n');
+		if (newline) {
+			static MelderString buffer { 0 };
 			MelderString_copy (& buffer, message);
-			buffer.string [newline - message] = '\0';
-			label1 -> f_setString (buffer.string);
-			buffer.string [newline - message] = '\n';
-			label2 -> f_setString (buffer.string + (newline - message) + 1);
+			buffer.string [newline - message] = U'\0';
+			GuiLabel_setText (label1, buffer.string);
+			buffer.string [newline - message] = U'\n';
+			GuiLabel_setText (label2, buffer.string + (newline - message) + 1);
 		} else {
-			label1 -> f_setString (message);
-			label2 -> f_setString (L"");
+			GuiLabel_setText (label1, message);
+			GuiLabel_setText (label2, U"");
 		}
 		#if gtk
-			trace ("update the progress bar");
-			scale -> f_setValue (progress);
+			trace (U"update the progress bar");
+			GuiProgressBar_setValue (scale, progress);
 			while (gtk_events_pending ()) {
-				trace ("event pending");
+				trace (U"event pending");
 				gtk_main_iteration ();
 			}
-			trace ("check whether the cancel button has the \"pressed\" key set");
+			trace (U"check whether the cancel button has the \"pressed\" key set");
 			if (g_object_steal_data (G_OBJECT (cancelButton -> d_widget), "pressed")) {
-				trace ("the cancel button has been pressed");
+				trace (U"the cancel button has been pressed");
 				return false;   // don't continue
 			}
 		#elif cocoa
-			scale -> f_setValue (progress);
+			GuiProgressBar_setValue (scale, progress);
 			//[scale -> d_cocoaProgressBar   displayIfNeeded];
 			if (theProgressCancelled) {
 				theProgressCancelled = false;
 				return false;
 			}
 		#elif motif
-			scale -> f_setValue (progress);
+			GuiProgressBar_setValue (scale, progress);
 			XmUpdateDisplay (dia -> d_widget);
 		#endif
 	}
-	trace ("continue");
+	trace (U"continue");
 	return true;
 }
 
@@ -297,187 +281,208 @@ static void progress_cancel_btn_press (void *cancelButton, GuiButtonEvent event)
 #endif
 
 static void _Melder_dia_init (GuiDialog *dia, GuiProgressBar *scale, GuiLabel *label1, GuiLabel *label2, GuiButton *cancelButton, bool hasMonitor) {
-	trace ("creating the dialog");
-	*dia = GuiDialog_create (Melder_topShell, 200, 100, 400, hasMonitor ? 430 : 200, L"Work in progress",
+	trace (U"creating the dialog");
+	*dia = GuiDialog_create (Melder_topShell, 200, 100, 400, hasMonitor ? 430 : 200, U"Work in progress",
 		#if gtk || macintosh
 			progress_dia_close, cancelButton,
 		#else
-			NULL, NULL,
+			nullptr, nullptr,
 		#endif
 		0);
 
-	trace ("creating the labels");
-	*label1 = GuiLabel_createShown (*dia, 3, 403, 0, Gui_LABEL_HEIGHT, L"label1", 0);
-	*label2 = GuiLabel_createShown (*dia, 3, 403, 30, 30 + Gui_LABEL_HEIGHT, L"label2", 0);
+	trace (U"creating the labels");
+	*label1 = GuiLabel_createShown (*dia, 3, 403, 0, Gui_LABEL_HEIGHT, U"label1", 0);
+	*label2 = GuiLabel_createShown (*dia, 3, 403, 30, 30 + Gui_LABEL_HEIGHT, U"label2", 0);
 
-	trace ("creating the scale");
+	trace (U"creating the scale");
 	*scale = GuiProgressBar_createShown (*dia, 3, -3, 70, 110, 0);
 
-	trace ("creating the cancel button");
+	trace (U"creating the cancel button");
 	*cancelButton = GuiButton_createShown (*dia, 0, 400, 170, 170 + Gui_PUSHBUTTON_HEIGHT,
-		L"Interrupt",
+		U"Interrupt",
 		#if gtk || macintosh
 			progress_cancel_btn_press, cancelButton,
 		#else
-			NULL, NULL,
+			nullptr, nullptr,
 		#endif
 		0);
-	trace ("end");
+	trace (U"end");
 }
-#endif
 
-static void _Melder_progress (double progress, const wchar_t *message) {
-	(void) progress;
-	#ifndef CONSOLE_APPLICATION
+static void _Melder_progress (double progress, const char32 *message) {
 	if (! Melder_batch && theProgressDepth >= 0 && Melder_debug != 14) {
 		static clock_t lastTime;
-		static GuiDialog dia = NULL;
-		static GuiProgressBar scale = NULL;
-		static GuiButton cancelButton = NULL;
-		static GuiLabel label1 = NULL, label2 = NULL;
+		static GuiDialog dia = nullptr;
+		static GuiProgressBar scale = nullptr;
+		static GuiButton cancelButton = nullptr;
+		static GuiLabel label1 = nullptr, label2 = nullptr;
 		clock_t now = clock ();
 		if (progress <= 0.0 || progress >= 1.0 ||
 			now - lastTime > CLOCKS_PER_SEC / 4)   // this time step must be much longer than the null-event waiting time
 		{
-			if (dia == NULL)
+			if (! dia)
 				_Melder_dia_init (& dia, & scale, & label1, & label2, & cancelButton, false);
 			if (! waitWhileProgress (progress, message, dia, scale, label1, label2, cancelButton))
-				Melder_throw ("Interrupted!");
+				Melder_throw (U"Interrupted!");
 			lastTime = now;
 		}
 	}
-	#endif
 }
 
 static MelderString theProgressBuffer = { 0 };
 
-void Melder_progress (double progress, const wchar_t *s1) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1);
+void Melder_progress (double progress) {
+	_Melder_progress (progress, U"");
+}
+void Melder_progress (double progress, Melder_1_ARG) {
+	MelderString_copy (& theProgressBuffer, Melder_1_ARG_CALL);
+	_Melder_progress (progress, theProgressBuffer.string);
+}
+void Melder_progress (double progress, Melder_2_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_2_ARGS_CALL);
+	_Melder_progress (progress, theProgressBuffer.string);
+}
+void Melder_progress (double progress, Melder_3_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_3_ARGS_CALL);
+	_Melder_progress (progress, theProgressBuffer.string);
+}
+void Melder_progress (double progress, Melder_4_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_4_ARGS_CALL);
 	_Melder_progress (progress, theProgressBuffer.string);
 }
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2);
+void Melder_progress (double progress, Melder_5_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_5_ARGS_CALL);
 	_Melder_progress (progress, theProgressBuffer.string);
 }
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3);
+void Melder_progress (double progress, Melder_6_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_6_ARGS_CALL);
 	_Melder_progress (progress, theProgressBuffer.string);
 }
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4);
+void Melder_progress (double progress, Melder_7_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_7_ARGS_CALL);
 	_Melder_progress (progress, theProgressBuffer.string);
 }
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4, s5);
+void Melder_progress (double progress, Melder_8_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_8_ARGS_CALL);
 	_Melder_progress (progress, theProgressBuffer.string);
 }
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4, s5, s6);
+void Melder_progress (double progress, Melder_9_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_9_ARGS_CALL);
 	_Melder_progress (progress, theProgressBuffer.string);
 }
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4, s5, s6, s7);
+void Melder_progress (double progress, Melder_10_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_10_ARGS_CALL);
 	_Melder_progress (progress, theProgressBuffer.string);
 }
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4, s5, s6, s7, s8);
+void Melder_progress (double progress, Melder_11_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_11_ARGS_CALL);
 	_Melder_progress (progress, theProgressBuffer.string);
 }
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4, s5, s6, s7, s8, s9);
+void Melder_progress (double progress, Melder_13_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_13_ARGS_CALL);
+	_Melder_progress (progress, theProgressBuffer.string);
+}
+void Melder_progress (double progress, Melder_15_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_15_ARGS_CALL);
+	_Melder_progress (progress, theProgressBuffer.string);
+}
+void Melder_progress (double progress, Melder_19_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_19_ARGS_CALL);
 	_Melder_progress (progress, theProgressBuffer.string);
 }
 
-static void * _Melder_monitor (double progress, const wchar_t *message) {
-	(void) progress;
-	#ifndef CONSOLE_APPLICATION
+static void * _Melder_monitor (double progress, const char32 *message) {
 	if (! Melder_batch && theProgressDepth >= 0) {
 		static clock_t lastTime;
-		static GuiDialog dia = NULL;
-		static GuiProgressBar scale = NULL;
-		static GuiDrawingArea drawingArea = NULL;
-		static GuiButton cancelButton = NULL;
-		static GuiLabel label1 = NULL, label2 = NULL;
+		static GuiDialog dia = nullptr;
+		static GuiProgressBar scale = nullptr;
+		static GuiDrawingArea drawingArea = nullptr;
+		static GuiButton cancelButton = nullptr;
+		static GuiLabel label1 = nullptr, label2 = nullptr;
 		clock_t now = clock ();
-		static Any graphics = NULL;
+		static Any graphics = nullptr;
 		if (progress <= 0.0 || progress >= 1.0 ||
 			now - lastTime > CLOCKS_PER_SEC / 4)   // this time step must be much longer than the null-event waiting time
 		{
-			if (dia == NULL) {
+			if (! dia) {
 				_Melder_dia_init (& dia, & scale, & label1, & label2, & cancelButton, true);
-				drawingArea = GuiDrawingArea_createShown (dia, 0, 400, 230, 430, NULL, NULL, NULL, NULL, NULL, 0);
-				dia -> f_show ();
+				drawingArea = GuiDrawingArea_createShown (dia, 0, 400, 230, 430, nullptr, nullptr, nullptr, nullptr, nullptr, 0);
+				GuiThing_show (dia);
 				graphics = Graphics_create_xmdrawingarea (drawingArea);
 			}
 			if (! waitWhileProgress (progress, message, dia, scale, label1, label2, cancelButton))
-				Melder_throw ("Interrupted!");
+				Melder_throw (U"Interrupted!");
 			lastTime = now;
 			if (progress == 0.0)
 				return graphics;
 		}
 	}
-	#endif
-	return progress <= 0.0 ? NULL /* no Graphics */ : & progress /* any non-NULL pointer */;
+	return progress <= 0.0 ? nullptr /* no Graphics */ : (void *) -1 /* any non-null pointer */;
 }
 
-void * Melder_monitor (double progress, const wchar_t *s1) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1);
+void * Melder_monitor (double progress) {
+	return _Melder_monitor (progress, U"");
+}
+void * Melder_monitor (double progress, Melder_1_ARG) {
+	MelderString_copy (& theProgressBuffer, Melder_1_ARG_CALL);
 	return _Melder_monitor (progress, theProgressBuffer.string);
 }
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2);
+void * Melder_monitor (double progress, Melder_2_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_2_ARGS_CALL);
 	return _Melder_monitor (progress, theProgressBuffer.string);
 }
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3);
+void * Melder_monitor (double progress, Melder_3_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_3_ARGS_CALL);
 	return _Melder_monitor (progress, theProgressBuffer.string);
 }
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4);
+void * Melder_monitor (double progress, Melder_4_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_4_ARGS_CALL);
 	return _Melder_monitor (progress, theProgressBuffer.string);
 }
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4, s5);
+void * Melder_monitor (double progress, Melder_5_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_5_ARGS_CALL);
 	return _Melder_monitor (progress, theProgressBuffer.string);
 }
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4, s5, s6);
+void * Melder_monitor (double progress, Melder_6_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_6_ARGS_CALL);
 	return _Melder_monitor (progress, theProgressBuffer.string);
 }
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4, s5, s6, s7);
+void * Melder_monitor (double progress, Melder_7_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_7_ARGS_CALL);
 	return _Melder_monitor (progress, theProgressBuffer.string);
 }
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4, s5, s6, s7, s8);
+void * Melder_monitor (double progress, Melder_8_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_8_ARGS_CALL);
 	return _Melder_monitor (progress, theProgressBuffer.string);
 }
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9) {
-	MelderString_empty (& theProgressBuffer);
-	MelderString_append (& theProgressBuffer, s1, s2, s3, s4, s5, s6, s7, s8, s9);
+void * Melder_monitor (double progress, Melder_9_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_9_ARGS_CALL);
+	return _Melder_monitor (progress, theProgressBuffer.string);
+}
+void * Melder_monitor (double progress, Melder_10_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_10_ARGS_CALL);
+	return _Melder_monitor (progress, theProgressBuffer.string);
+}
+void * Melder_monitor (double progress, Melder_11_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_11_ARGS_CALL);
+	return _Melder_monitor (progress, theProgressBuffer.string);
+}
+void * Melder_monitor (double progress, Melder_13_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_13_ARGS_CALL);
+	return _Melder_monitor (progress, theProgressBuffer.string);
+}
+void * Melder_monitor (double progress, Melder_15_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_15_ARGS_CALL);
+	return _Melder_monitor (progress, theProgressBuffer.string);
+}
+void * Melder_monitor (double progress, Melder_19_ARGS) {
+	MelderString_copy (& theProgressBuffer, Melder_19_ARGS_CALL);
 	return _Melder_monitor (progress, theProgressBuffer.string);
 }
 
 /********** NUMBER AND STRING COMPARISONS **********/
 
-int Melder_numberMatchesCriterion (double value, int which_kMelder_number, double criterion) {
+bool Melder_numberMatchesCriterion (double value, int which_kMelder_number, double criterion) {
 	return
 		(which_kMelder_number == kMelder_number_EQUAL_TO && value == criterion) ||
 		(which_kMelder_number == kMelder_number_NOT_EQUAL_TO && value != criterion) ||
@@ -487,288 +492,129 @@ int Melder_numberMatchesCriterion (double value, int which_kMelder_number, doubl
 		(which_kMelder_number == kMelder_number_GREATER_THAN_OR_EQUAL_TO && value >= criterion);
 }
 
-int Melder_stringMatchesCriterion (const wchar_t *value, int which_kMelder_string, const wchar_t *criterion) {
-	if (value == NULL) {
-		value = L"";   /* Regard null strings as empty strings, as is usual in Praat. */
+bool Melder_stringMatchesCriterion (const char32 *value, int which_kMelder_string, const char32 *criterion) {
+	if (! value) {
+		value = U"";   // regard null strings as empty strings, as is usual in Praat
 	}
-	if (criterion == NULL) {
-		criterion = L"";   /* Regard null strings as empty strings, as is usual in Praat. */
+	if (! criterion) {
+		criterion = U"";   // regard null strings as empty strings, as is usual in Praat
 	}
 	if (which_kMelder_string <= kMelder_string_NOT_EQUAL_TO) {
-		int matchPositiveCriterion = wcsequ (value, criterion);
-		return (which_kMelder_string == kMelder_string_EQUAL_TO) == matchPositiveCriterion;
+		bool matchPositiveCriterion = str32equ (value, criterion);
+		return ( which_kMelder_string == kMelder_string_EQUAL_TO ) == matchPositiveCriterion;
 	}
 	if (which_kMelder_string <= kMelder_string_DOES_NOT_CONTAIN) {
-		int matchPositiveCriterion = wcsstr (value, criterion) != NULL;
-		return (which_kMelder_string == kMelder_string_CONTAINS) == matchPositiveCriterion;
+		bool matchPositiveCriterion = !! str32str (value, criterion);
+		return ( which_kMelder_string == kMelder_string_CONTAINS ) == matchPositiveCriterion;
 	}
 	if (which_kMelder_string <= kMelder_string_DOES_NOT_START_WITH) {
-		int matchPositiveCriterion = wcsnequ (value, criterion, wcslen (criterion));
-		return (which_kMelder_string == kMelder_string_STARTS_WITH) == matchPositiveCriterion;
+		bool matchPositiveCriterion = str32nequ (value, criterion, str32len (criterion));
+		return ( which_kMelder_string == kMelder_string_STARTS_WITH ) == matchPositiveCriterion;
 	}
 	if (which_kMelder_string <= kMelder_string_DOES_NOT_END_WITH) {
-		int criterionLength = wcslen (criterion), valueLength = wcslen (value);
-		int matchPositiveCriterion = criterionLength <= valueLength && wcsequ (value + valueLength - criterionLength, criterion);
+		int criterionLength = str32len (criterion), valueLength = str32len (value);
+		bool matchPositiveCriterion = ( criterionLength <= valueLength && str32equ (value + valueLength - criterionLength, criterion) );
 		return (which_kMelder_string == kMelder_string_ENDS_WITH) == matchPositiveCriterion;
 	}
 	if (which_kMelder_string == kMelder_string_MATCH_REGEXP) {
-		wchar_t *place = NULL;
-		const wchar_t *errorMessage;
-		regexp *compiled_regexp = CompileRE ((regularExp_CHAR *) criterion, & errorMessage, 0);
-		if (compiled_regexp == NULL) return FALSE;   // BUG: what about removing errorMessage?
-		if (ExecRE (compiled_regexp, NULL, (regularExp_CHAR *) value, NULL, 0, '\0', '\0', NULL, NULL, NULL))
-			place = (wchar_t *) compiled_regexp -> startp [0];
+		char32 *place = nullptr;
+		regexp *compiled_regexp = CompileRE_throwable (criterion, 0);
+		if (ExecRE (compiled_regexp, nullptr, value, nullptr, 0, '\0', '\0', nullptr, nullptr, nullptr))
+			place = compiled_regexp -> startp [0];
 		free (compiled_regexp);
-		return place != NULL;
+		return !! place;
 	}
-	return 0;   /* Should not occur. */
+	return false;   // should not occur
 }
 
-void Melder_help (const wchar_t *query) {
+void Melder_help (const char32 *query) {
 	theMelder. help (query);
 }
 
-void Melder_search (void) {
+void Melder_search () {
 	theMelder. search ();
 }
 
 /********** WARNING **********/
 
 static int theWarningDepth = 0;
-void Melder_warningOff (void) { theWarningDepth --; }
-void Melder_warningOn (void) { theWarningDepth ++; }
+void Melder_warningOff () { theWarningDepth --; }
+void Melder_warningOn () { theWarningDepth ++; }
 
 static MelderString theWarningBuffer = { 0 };
 
-void Melder_warning (const MelderArg& arg1) {
+void Melder_warning (Melder_1_ARG) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_1_ARG_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2) {
+void Melder_warning (Melder_2_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_2_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3) {
+void Melder_warning (Melder_3_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_3_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4) {
+void Melder_warning (Melder_4_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_4_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5) {
+void Melder_warning (Melder_5_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8),
-		arg5.type == 1 ? arg5.argW : Melder_peekUtf8ToWcs (arg5.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_5_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6)
-{
+void Melder_warning (Melder_6_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8),
-		arg5.type == 1 ? arg5.argW : Melder_peekUtf8ToWcs (arg5.arg8),
-		arg6.type == 1 ? arg6.argW : Melder_peekUtf8ToWcs (arg6.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_6_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7)
-{
+void Melder_warning (Melder_7_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8),
-		arg5.type == 1 ? arg5.argW : Melder_peekUtf8ToWcs (arg5.arg8),
-		arg6.type == 1 ? arg6.argW : Melder_peekUtf8ToWcs (arg6.arg8),
-		arg7.type == 1 ? arg7.argW : Melder_peekUtf8ToWcs (arg7.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_7_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8)
-{
+void Melder_warning (Melder_8_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8),
-		arg5.type == 1 ? arg5.argW : Melder_peekUtf8ToWcs (arg5.arg8),
-		arg6.type == 1 ? arg6.argW : Melder_peekUtf8ToWcs (arg6.arg8),
-		arg7.type == 1 ? arg7.argW : Melder_peekUtf8ToWcs (arg7.arg8),
-		arg8.type == 1 ? arg8.argW : Melder_peekUtf8ToWcs (arg8.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_8_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9)
-{
+void Melder_warning (Melder_9_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8),
-		arg5.type == 1 ? arg5.argW : Melder_peekUtf8ToWcs (arg5.arg8),
-		arg6.type == 1 ? arg6.argW : Melder_peekUtf8ToWcs (arg6.arg8),
-		arg7.type == 1 ? arg7.argW : Melder_peekUtf8ToWcs (arg7.arg8),
-		arg8.type == 1 ? arg8.argW : Melder_peekUtf8ToWcs (arg8.arg8),
-		arg9.type == 1 ? arg9.argW : Melder_peekUtf8ToWcs (arg9.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_9_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9, const MelderArg& arg10)
-{
+void Melder_warning (Melder_10_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8),
-		arg5.type == 1 ? arg5.argW : Melder_peekUtf8ToWcs (arg5.arg8),
-		arg6.type == 1 ? arg6.argW : Melder_peekUtf8ToWcs (arg6.arg8),
-		arg7.type == 1 ? arg7.argW : Melder_peekUtf8ToWcs (arg7.arg8),
-		arg8.type == 1 ? arg8.argW : Melder_peekUtf8ToWcs (arg8.arg8),
-		arg9.type == 1 ? arg9.argW : Melder_peekUtf8ToWcs (arg9.arg8));
-	MelderString_append (& theWarningBuffer,
-		arg10.type == 1 ? arg10.argW : Melder_peekUtf8ToWcs (arg10.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_10_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9, const MelderArg& arg10,
-	const MelderArg& arg11)
-{
+void Melder_warning (Melder_11_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8),
-		arg5.type == 1 ? arg5.argW : Melder_peekUtf8ToWcs (arg5.arg8),
-		arg6.type == 1 ? arg6.argW : Melder_peekUtf8ToWcs (arg6.arg8),
-		arg7.type == 1 ? arg7.argW : Melder_peekUtf8ToWcs (arg7.arg8),
-		arg8.type == 1 ? arg8.argW : Melder_peekUtf8ToWcs (arg8.arg8),
-		arg9.type == 1 ? arg9.argW : Melder_peekUtf8ToWcs (arg9.arg8));
-	MelderString_append (& theWarningBuffer,
-		arg10.type == 1 ? arg10.argW : Melder_peekUtf8ToWcs (arg10.arg8),
-		arg11.type == 1 ? arg11.argW : Melder_peekUtf8ToWcs (arg11.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_11_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9, const MelderArg& arg10,
-	const MelderArg& arg11, const MelderArg& arg12, const MelderArg& arg13)
-{
+void Melder_warning (Melder_13_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8),
-		arg5.type == 1 ? arg5.argW : Melder_peekUtf8ToWcs (arg5.arg8),
-		arg6.type == 1 ? arg6.argW : Melder_peekUtf8ToWcs (arg6.arg8),
-		arg7.type == 1 ? arg7.argW : Melder_peekUtf8ToWcs (arg7.arg8),
-		arg8.type == 1 ? arg8.argW : Melder_peekUtf8ToWcs (arg8.arg8),
-		arg9.type == 1 ? arg9.argW : Melder_peekUtf8ToWcs (arg9.arg8));
-	MelderString_append (& theWarningBuffer,
-		arg10.type == 1 ? arg10.argW : Melder_peekUtf8ToWcs (arg10.arg8),
-		arg11.type == 1 ? arg11.argW : Melder_peekUtf8ToWcs (arg11.arg8),
-		arg12.type == 1 ? arg12.argW : Melder_peekUtf8ToWcs (arg12.arg8),
-		arg13.type == 1 ? arg13.argW : Melder_peekUtf8ToWcs (arg13.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_13_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9, const MelderArg& arg10,
-	const MelderArg& arg11, const MelderArg& arg12, const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15)
-{
+void Melder_warning (Melder_15_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8),
-		arg5.type == 1 ? arg5.argW : Melder_peekUtf8ToWcs (arg5.arg8),
-		arg6.type == 1 ? arg6.argW : Melder_peekUtf8ToWcs (arg6.arg8),
-		arg7.type == 1 ? arg7.argW : Melder_peekUtf8ToWcs (arg7.arg8),
-		arg8.type == 1 ? arg8.argW : Melder_peekUtf8ToWcs (arg8.arg8),
-		arg9.type == 1 ? arg9.argW : Melder_peekUtf8ToWcs (arg9.arg8));
-	MelderString_append (& theWarningBuffer,
-		arg10.type == 1 ? arg10.argW : Melder_peekUtf8ToWcs (arg10.arg8),
-		arg11.type == 1 ? arg11.argW : Melder_peekUtf8ToWcs (arg11.arg8),
-		arg12.type == 1 ? arg12.argW : Melder_peekUtf8ToWcs (arg12.arg8),
-		arg13.type == 1 ? arg13.argW : Melder_peekUtf8ToWcs (arg13.arg8),
-		arg14.type == 1 ? arg14.argW : Melder_peekUtf8ToWcs (arg14.arg8),
-		arg15.type == 1 ? arg15.argW : Melder_peekUtf8ToWcs (arg15.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_15_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9, const MelderArg& arg10,
-	const MelderArg& arg11, const MelderArg& arg12, const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15,
-	const MelderArg& arg16, const MelderArg& arg17, const MelderArg& arg18, const MelderArg& arg19, const MelderArg& arg20)
-{
+void Melder_warning (Melder_19_ARGS) {
 	if (theWarningDepth < 0) return;
-	MelderString_empty (& theWarningBuffer);
-	MelderString_append (& theWarningBuffer,
-		arg1.type == 1 ? arg1.argW : Melder_peekUtf8ToWcs (arg1.arg8),
-		arg2.type == 1 ? arg2.argW : Melder_peekUtf8ToWcs (arg2.arg8),
-		arg3.type == 1 ? arg3.argW : Melder_peekUtf8ToWcs (arg3.arg8),
-		arg4.type == 1 ? arg4.argW : Melder_peekUtf8ToWcs (arg4.arg8),
-		arg5.type == 1 ? arg5.argW : Melder_peekUtf8ToWcs (arg5.arg8),
-		arg6.type == 1 ? arg6.argW : Melder_peekUtf8ToWcs (arg6.arg8),
-		arg7.type == 1 ? arg7.argW : Melder_peekUtf8ToWcs (arg7.arg8),
-		arg8.type == 1 ? arg8.argW : Melder_peekUtf8ToWcs (arg8.arg8),
-		arg9.type == 1 ? arg9.argW : Melder_peekUtf8ToWcs (arg9.arg8));
-	MelderString_append (& theWarningBuffer,
-		arg10.type == 1 ? arg10.argW : Melder_peekUtf8ToWcs (arg10.arg8),
-		arg11.type == 1 ? arg11.argW : Melder_peekUtf8ToWcs (arg11.arg8),
-		arg12.type == 1 ? arg12.argW : Melder_peekUtf8ToWcs (arg12.arg8),
-		arg13.type == 1 ? arg13.argW : Melder_peekUtf8ToWcs (arg13.arg8),
-		arg14.type == 1 ? arg14.argW : Melder_peekUtf8ToWcs (arg14.arg8),
-		arg15.type == 1 ? arg15.argW : Melder_peekUtf8ToWcs (arg15.arg8),
-		arg16.type == 1 ? arg16.argW : Melder_peekUtf8ToWcs (arg16.arg8),
-		arg17.type == 1 ? arg17.argW : Melder_peekUtf8ToWcs (arg17.arg8),
-		arg18.type == 1 ? arg18.argW : Melder_peekUtf8ToWcs (arg18.arg8));
-	MelderString_append (& theWarningBuffer,
-		arg19.type == 1 ? arg19.argW : Melder_peekUtf8ToWcs (arg19.arg8),
-		arg20.type == 1 ? arg20.argW : Melder_peekUtf8ToWcs (arg20.arg8));
+	MelderString_copy (& theWarningBuffer, Melder_19_ARGS_CALL);
 	theMelder. warning (theWarningBuffer.string);
 }
 
-void Melder_beep (void) {
+void Melder_beep () {
 	#ifdef macintosh
 		#if useCarbon
 			SysBeep (0);
@@ -789,41 +635,402 @@ void Melder_message_init () {
 	if (! inited) { MelderThread_MUTEX_INIT (theMelder_fatal_mutex); inited = true; }
 }
 
-int Melder_fatal (const char *format, ...) {
+constexpr int Melder_FATAL_BUFFER_SIZE { 2000 };
+static char32 theFatalBuffer [Melder_FATAL_BUFFER_SIZE];
+static const char32 *theCrashMessage { U"Praat will crash. Notify the author (paul.boersma at uva.nl) with the following information:\n" };
+
+int Melder_fatal (Melder_1_ARG) {
 	MelderThread_LOCK (theMelder_fatal_mutex);
-	const char *lead = strstr (format, "Praat cannot start up") ? "" :
-		"Praat will crash. Notify the author (paul.boersma at uva.nl) with the following information:\n";
-	va_list arg;
-	va_start (arg, format);
-	strcpy (Melder_buffer1, lead);
-	vsprintf (Melder_buffer1 + strlen (lead), format, arg);
-	trace ("FATAL: %s", Melder_buffer1);
-	theMelder. fatal (Melder_peekUtf8ToWcs (Melder_buffer1));
-	va_end (arg);
+	const char32 *s1 = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
 	abort ();
-	return 0;   /* Make some compilers happy, some unhappy. */
+	return 0;
 }
-
-int Melder_assert_ (const char *condition, const char *fileName, int lineNumber) {
-	return Melder_fatal ("Assertion failed in file \"%s\" at line %d:\n   %s\n",
-		fileName, lineNumber, condition);
+int Melder_fatal (Melder_2_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1 = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2 = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_3_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1 = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2 = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3 = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_4_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg  ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg  ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg  ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg  ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_5_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	const char32 *s5  = arg5. _arg ? arg5. _arg : U"";   int64 length5  = str32len (s5);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	if (length + length5  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s5);  length += length5;  }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_6_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	const char32 *s5  = arg5. _arg ? arg5. _arg : U"";   int64 length5  = str32len (s5);
+	const char32 *s6  = arg6. _arg ? arg6. _arg : U"";   int64 length6  = str32len (s6);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	if (length + length5  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s5);  length += length5;  }
+	if (length + length6  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s6);  length += length6;  }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_7_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	const char32 *s5  = arg5. _arg ? arg5. _arg : U"";   int64 length5  = str32len (s5);
+	const char32 *s6  = arg6. _arg ? arg6. _arg : U"";   int64 length6  = str32len (s6);
+	const char32 *s7  = arg7. _arg ? arg7. _arg : U"";   int64 length7  = str32len (s7);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	if (length + length5  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s5);  length += length5;  }
+	if (length + length6  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s6);  length += length6;  }
+	if (length + length7  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s7);  length += length7;  }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_8_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	const char32 *s5  = arg5. _arg ? arg5. _arg : U"";   int64 length5  = str32len (s5);
+	const char32 *s6  = arg6. _arg ? arg6. _arg : U"";   int64 length6  = str32len (s6);
+	const char32 *s7  = arg7. _arg ? arg7. _arg : U"";   int64 length7  = str32len (s7);
+	const char32 *s8  = arg8. _arg ? arg8. _arg : U"";   int64 length8  = str32len (s8);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	if (length + length5  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s5);  length += length5;  }
+	if (length + length6  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s6);  length += length6;  }
+	if (length + length7  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s7);  length += length7;  }
+	if (length + length8  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s8);  length += length8;  }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_9_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	const char32 *s5  = arg5. _arg ? arg5. _arg : U"";   int64 length5  = str32len (s5);
+	const char32 *s6  = arg6. _arg ? arg6. _arg : U"";   int64 length6  = str32len (s6);
+	const char32 *s7  = arg7. _arg ? arg7. _arg : U"";   int64 length7  = str32len (s7);
+	const char32 *s8  = arg8. _arg ? arg8. _arg : U"";   int64 length8  = str32len (s8);
+	const char32 *s9  = arg9. _arg ? arg9. _arg : U"";   int64 length9  = str32len (s9);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	if (length + length5  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s5);  length += length5;  }
+	if (length + length6  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s6);  length += length6;  }
+	if (length + length7  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s7);  length += length7;  }
+	if (length + length8  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s8);  length += length8;  }
+	if (length + length9  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s9);  length += length9;  }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_10_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	const char32 *s5  = arg5. _arg ? arg5. _arg : U"";   int64 length5  = str32len (s5);
+	const char32 *s6  = arg6. _arg ? arg6. _arg : U"";   int64 length6  = str32len (s6);
+	const char32 *s7  = arg7. _arg ? arg7. _arg : U"";   int64 length7  = str32len (s7);
+	const char32 *s8  = arg8. _arg ? arg8. _arg : U"";   int64 length8  = str32len (s8);
+	const char32 *s9  = arg9. _arg ? arg9. _arg : U"";   int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";   int64 length10 = str32len (s10);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	if (length + length5  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s5);  length += length5;  }
+	if (length + length6  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s6);  length += length6;  }
+	if (length + length7  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s7);  length += length7;  }
+	if (length + length8  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s8);  length += length8;  }
+	if (length + length9  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s9);  length += length9;  }
+	if (length + length10 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s10); length += length10; }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_11_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	const char32 *s5  = arg5. _arg ? arg5. _arg : U"";   int64 length5  = str32len (s5);
+	const char32 *s6  = arg6. _arg ? arg6. _arg : U"";   int64 length6  = str32len (s6);
+	const char32 *s7  = arg7. _arg ? arg7. _arg : U"";   int64 length7  = str32len (s7);
+	const char32 *s8  = arg8. _arg ? arg8. _arg : U"";   int64 length8  = str32len (s8);
+	const char32 *s9  = arg9. _arg ? arg9. _arg : U"";   int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";   int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";   int64 length11 = str32len (s11);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	if (length + length5  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s5);  length += length5;  }
+	if (length + length6  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s6);  length += length6;  }
+	if (length + length7  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s7);  length += length7;  }
+	if (length + length8  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s8);  length += length8;  }
+	if (length + length9  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s9);  length += length9;  }
+	if (length + length10 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s10); length += length10; }
+	if (length + length11 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s11); length += length11; }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_13_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	const char32 *s5  = arg5. _arg ? arg5. _arg : U"";   int64 length5  = str32len (s5);
+	const char32 *s6  = arg6. _arg ? arg6. _arg : U"";   int64 length6  = str32len (s6);
+	const char32 *s7  = arg7. _arg ? arg7. _arg : U"";   int64 length7  = str32len (s7);
+	const char32 *s8  = arg8. _arg ? arg8. _arg : U"";   int64 length8  = str32len (s8);
+	const char32 *s9  = arg9. _arg ? arg9. _arg : U"";   int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";   int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";   int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";   int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";   int64 length13 = str32len (s13);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	if (length + length5  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s5);  length += length5;  }
+	if (length + length6  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s6);  length += length6;  }
+	if (length + length7  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s7);  length += length7;  }
+	if (length + length8  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s8);  length += length8;  }
+	if (length + length9  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s9);  length += length9;  }
+	if (length + length10 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s10); length += length10; }
+	if (length + length11 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s11); length += length11; }
+	if (length + length12 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s12); length += length12; }
+	if (length + length13 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s13); length += length13; }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_15_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	const char32 *s5  = arg5. _arg ? arg5. _arg : U"";   int64 length5  = str32len (s5);
+	const char32 *s6  = arg6. _arg ? arg6. _arg : U"";   int64 length6  = str32len (s6);
+	const char32 *s7  = arg7. _arg ? arg7. _arg : U"";   int64 length7  = str32len (s7);
+	const char32 *s8  = arg8. _arg ? arg8. _arg : U"";   int64 length8  = str32len (s8);
+	const char32 *s9  = arg9. _arg ? arg9. _arg : U"";   int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";   int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";   int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";   int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";   int64 length13 = str32len (s13);
+	const char32 *s14 = arg14._arg ? arg14._arg : U"";   int64 length14 = str32len (s14);
+	const char32 *s15 = arg15._arg ? arg15._arg : U"";   int64 length15 = str32len (s15);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	if (length + length5  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s5);  length += length5;  }
+	if (length + length6  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s6);  length += length6;  }
+	if (length + length7  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s7);  length += length7;  }
+	if (length + length8  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s8);  length += length8;  }
+	if (length + length9  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s9);  length += length9;  }
+	if (length + length10 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s10); length += length10; }
+	if (length + length11 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s11); length += length11; }
+	if (length + length12 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s12); length += length12; }
+	if (length + length13 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s13); length += length13; }
+	if (length + length14 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s14); length += length14; }
+	if (length + length15 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s15); length += length15; }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
+}
+int Melder_fatal (Melder_19_ARGS) {
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	const char32 *s1  = arg1. _arg ? arg1. _arg : U"";   int64 length1  = str32len (s1);
+	const char32 *s2  = arg2. _arg ? arg2. _arg : U"";   int64 length2  = str32len (s2);
+	const char32 *s3  = arg3. _arg ? arg3. _arg : U"";   int64 length3  = str32len (s3);
+	const char32 *s4  = arg4. _arg ? arg4. _arg : U"";   int64 length4  = str32len (s4);
+	const char32 *s5  = arg5. _arg ? arg5. _arg : U"";   int64 length5  = str32len (s5);
+	const char32 *s6  = arg6. _arg ? arg6. _arg : U"";   int64 length6  = str32len (s6);
+	const char32 *s7  = arg7. _arg ? arg7. _arg : U"";   int64 length7  = str32len (s7);
+	const char32 *s8  = arg8. _arg ? arg8. _arg : U"";   int64 length8  = str32len (s8);
+	const char32 *s9  = arg9. _arg ? arg9. _arg : U"";   int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";   int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";   int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";   int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";   int64 length13 = str32len (s13);
+	const char32 *s14 = arg14._arg ? arg14._arg : U"";   int64 length14 = str32len (s14);
+	const char32 *s15 = arg15._arg ? arg15._arg : U"";   int64 length15 = str32len (s15);
+	const char32 *s16 = arg16._arg ? arg16._arg : U"";   int64 length16 = str32len (s16);
+	const char32 *s17 = arg17._arg ? arg17._arg : U"";   int64 length17 = str32len (s17);
+	const char32 *s18 = arg18._arg ? arg18._arg : U"";   int64 length18 = str32len (s18);
+	const char32 *s19 = arg19._arg ? arg19._arg : U"";   int64 length19 = str32len (s19);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	int64 length = str32len (theFatalBuffer);
+	if (length + length1  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s1);  length += length1;  }
+	if (length + length2  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s2);  length += length2;  }
+	if (length + length3  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s3);  length += length3;  }
+	if (length + length4  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s4);  length += length4;  }
+	if (length + length5  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s5);  length += length5;  }
+	if (length + length6  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s6);  length += length6;  }
+	if (length + length7  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s7);  length += length7;  }
+	if (length + length8  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s8);  length += length8;  }
+	if (length + length9  < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s9);  length += length9;  }
+	if (length + length10 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s10); length += length10; }
+	if (length + length11 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s11); length += length11; }
+	if (length + length12 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s12); length += length12; }
+	if (length + length13 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s13); length += length13; }
+	if (length + length14 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s14); length += length14; }
+	if (length + length15 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s15); length += length15; }
+	if (length + length16 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s16); length += length16; }
+	if (length + length17 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s17); length += length17; }
+	if (length + length18 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s18); length += length18; }
+	if (length + length19 < Melder_FATAL_BUFFER_SIZE) { str32cpy (theFatalBuffer + length, s19); length += length19; }
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);
+	abort ();
+	return 0;
 }
 
-#ifndef CONSOLE_APPLICATION
+void Melder_assert_ (const char *fileName, int lineNumber, const char *condition) {
+	/*
+	 * This function tries to make sure that it allocates no heap memory.
+	 * Hence, character conversion is done inline rather than with Melder_peek8to32(),
+	 * and Melder_integer() is also avoided.
+	 */
+	MelderThread_LOCK (theMelder_fatal_mutex);
+	static char32 fileNameBuffer [1000], conditionBuffer [1000], lineNumberBuffer [40];
+	Melder_8to32_inline (fileName, fileNameBuffer, kMelder_textInputEncoding_UTF8);
+	Melder_8to32_inline (condition, conditionBuffer, kMelder_textInputEncoding_UTF8);
+	static char lineNumberBuffer8 [40];
+	sprintf (lineNumberBuffer8, "%d", lineNumber);
+	Melder_8to32_inline (lineNumberBuffer8, lineNumberBuffer, kMelder_textInputEncoding_UTF8);
+	str32cpy (theFatalBuffer, theCrashMessage);
+	str32cpy (theFatalBuffer + str32len (theFatalBuffer), U"Assertion failed in file \"");
+	str32cpy (theFatalBuffer + str32len (theFatalBuffer), fileNameBuffer);
+	str32cpy (theFatalBuffer + str32len (theFatalBuffer), U"\" at line ");
+	str32cpy (theFatalBuffer + str32len (theFatalBuffer), lineNumberBuffer);
+	str32cpy (theFatalBuffer + str32len (theFatalBuffer), U":\n   ");
+	str32cpy (theFatalBuffer + str32len (theFatalBuffer), conditionBuffer);
+	str32cpy (theFatalBuffer + str32len (theFatalBuffer), U"\n");
+	trace (U"FATAL: ", theFatalBuffer);
+	theMelder. fatal (theFatalBuffer);   // ...but this call will use heap memory...
+	abort ();
+}
 
 #if defined (macintosh)
-static void mac_message (NSAlertStyle macAlertType, const wchar_t *messageW) {
+static void mac_message (NSAlertStyle macAlertType, const char32 *message32) {
 	static unichar messageU [4000];
-	int messageLength = wcslen (messageW);
+	int messageLength = str32len (message32);
 	int j = 0;
 	for (int i = 0; i < messageLength && j <= 4000 - 3; i ++) {
-		char32_t kar = (char32_t) messageW [i];   // change sign
-		if (kar <= 0xFFFF) {
+		char32 kar = message32 [i];
+		if (kar <= 0x00FFFF) {
 			messageU [j ++] = kar;
 		} else if (kar <= 0x10FFFF) {
-			kar -= 0x10000;
-			messageU [j ++] = 0xD800 | (kar >> 10);
-			messageU [j ++] = 0xDC00 | (kar & 0x3FF);
+			kar -= 0x010000;
+			messageU [j ++] = 0x00D800 | (kar >> 10);
+			messageU [j ++] = 0x00DC00 | (kar & 0x0003FF);
 		}
 	}
 	messageU [j] = '\0';   // append null byte because we are going to search this string
@@ -848,10 +1055,10 @@ static void mac_message (NSAlertStyle macAlertType, const wchar_t *messageW) {
 	}
 	#if useCarbon
         DialogRef dialog;
-		CFStringRef messageCF = CFStringCreateWithCharacters (NULL, messageU, j);
-		CreateStandardAlert (macAlertType, messageCF, NULL, NULL, & dialog);
+		CFStringRef messageCF = CFStringCreateWithCharacters (nullptr, messageU, j);
+		CreateStandardAlert (macAlertType, messageCF, nullptr, nullptr, & dialog);
 		CFRelease (messageCF);
-		RunStandardAlert (dialog, NULL, NULL);
+		RunStandardAlert (dialog, nullptr, nullptr);
 	#else
 		/*
 		 * Create an alert dialog with an icon that is appropriate for the level.
@@ -886,13 +1093,13 @@ static void mac_message (NSAlertStyle macAlertType, const wchar_t *messageW) {
 #endif
 
 #define theMessageFund_SIZE  100000
-static char * theMessageFund = NULL;
+static char * theMessageFund = nullptr;
 
-static void gui_fatal (const wchar_t *message) {
+static void gui_fatal (const char32 *message) {
 	free (theMessageFund);
 	#if gtk
 		GuiObject dialog = gtk_message_dialog_new (GTK_WINDOW (Melder_topShell -> d_gtkWindow), GTK_DIALOG_DESTROY_WITH_PARENT,
-			GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", Melder_peekWcsToUtf8 (message));
+			GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", Melder_peek32to8 (message));
 		gtk_dialog_run (GTK_DIALOG (dialog));
 		gtk_widget_destroy (GTK_WIDGET (dialog));
 	#elif defined (macintosh)
@@ -904,22 +1111,22 @@ static void gui_fatal (const wchar_t *message) {
 			SysError (11);
 		#endif
 	#elif defined (_WIN32)
-		MessageBox (NULL, message, L"Fatal error", MB_OK | MB_TOPMOST | MB_ICONSTOP);
+		MessageBox (nullptr, Melder_peek32toW (message), L"Fatal error", MB_OK | MB_TOPMOST | MB_ICONSTOP);
 	#endif
 }
 
-static void gui_error (const wchar_t *message) {
-	bool memoryIsLow = wcsstr (message, L"Out of memory");
+static void gui_error (const char32 *message) {
+	bool memoryIsLow = str32str (message, U"Out of memory");
 	if (memoryIsLow) {
 		free (theMessageFund);
 	}
 	#if gtk
-		trace ("create dialog");
+		trace (U"create dialog");
 		GuiObject dialog = gtk_message_dialog_new (GTK_WINDOW (Melder_topShell -> d_gtkWindow), GTK_DIALOG_DESTROY_WITH_PARENT,
-			GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "%s", Melder_peekWcsToUtf8 (message));
-		trace ("run dialog");
+			GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "%s", Melder_peek32to8 (message));
+		trace (U"run dialog");
 		gtk_dialog_run (GTK_DIALOG (dialog));
-		trace ("destroy dialog");
+		trace (U"destroy dialog");
 		gtk_widget_destroy (GTK_WIDGET (dialog));
 	#elif defined (macintosh)
 		#if useCarbon
@@ -929,11 +1136,11 @@ static void gui_error (const wchar_t *message) {
 			mac_message (NSWarningAlertStyle, message);
 		#endif
 	#elif defined (_WIN32)
-		MessageBox (NULL, message, L"Message", MB_OK | MB_TOPMOST | MB_ICONWARNING);   // or (HWND) XtWindow ((GuiObject) Melder_topShell)
+		MessageBox (nullptr, Melder_peek32toW (message), L"Message", MB_OK | MB_TOPMOST | MB_ICONWARNING);   // or (HWND) XtWindow ((GuiObject) Melder_topShell)
 	#endif
 	if (memoryIsLow) {
 		theMessageFund = (char *) malloc (theMessageFund_SIZE);
-		if (theMessageFund == NULL) {
+		if (! theMessageFund) {
 			#if gtk
 				GuiObject dialog = gtk_message_dialog_new (GTK_WINDOW (Melder_topShell -> d_gtkWindow), GTK_DIALOG_DESTROY_WITH_PARENT,
 					GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
@@ -941,22 +1148,22 @@ static void gui_error (const wchar_t *message) {
 				gtk_widget_destroy (GTK_WIDGET (dialog));
 			#elif defined (macintosh)
 				#if useCarbon
-					mac_message (NSCriticalAlertStyle, L"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
+					mac_message (NSCriticalAlertStyle, U"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
 					XmUpdateDisplay (0);
 				#else
-					mac_message (NSCriticalAlertStyle, L"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
+					mac_message (NSCriticalAlertStyle, U"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
 				#endif
 			#elif defined (_WIN32)
-				MessageBox (NULL, L"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.", L"Message", MB_OK);
+				MessageBox (nullptr, L"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.", L"Message", MB_OK);
 			#endif
 		}
 	}
 }
 
-static void gui_warning (const wchar_t *message) {
+static void gui_warning (const char32 *message) {
 	#if gtk
 		GuiObject dialog = gtk_message_dialog_new (GTK_WINDOW (Melder_topShell -> d_gtkWindow), GTK_DIALOG_DESTROY_WITH_PARENT,
-			GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "%s", Melder_peekWcsToUtf8 (message));
+			GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "%s", Melder_peek32to8 (message));
 		gtk_dialog_run (GTK_DIALOG (dialog));
 		gtk_widget_destroy (GTK_WIDGET (dialog));
 	#elif defined (macintosh)
@@ -967,21 +1174,20 @@ static void gui_warning (const wchar_t *message) {
 			mac_message (NSInformationalAlertStyle, message);
 		#endif
 	#elif defined (_WIN32)
-		MessageBox (NULL, message, L"Warning", MB_OK | MB_TOPMOST | MB_ICONINFORMATION);
+		MessageBox (nullptr, Melder_peek32toW (message), L"Warning", MB_OK | MB_TOPMOST | MB_ICONINFORMATION);
 	#endif
 }
 
-void gui_information (const wchar_t *);   // BUG: no prototype
+void gui_information (const char32 *);   // BUG: no prototype
 void MelderGui_create (void *parent) {
 	theMessageFund = (char *) malloc (theMessageFund_SIZE);
-	assert (theMessageFund != NULL);
+	assert (theMessageFund);
 	Melder_topShell = (GuiWindow) parent;
 	Melder_setInformationProc (gui_information);
 	Melder_setFatalProc (gui_fatal);
 	Melder_setErrorProc (gui_error);
 	Melder_setWarningProc (gui_warning);
 }
-#endif
 
 int Melder_publish (void *anything) {
 	return theMelder. publish (anything);
@@ -995,30 +1201,30 @@ int Melder_recordFromFile (MelderFile file) {
 	return theMelder. recordFromFile (file);
 }
 
-void Melder_play (void) {
+void Melder_play () {
 	theMelder. play ();
 }
 
-void Melder_playReverse (void) {
+void Melder_playReverse () {
 	theMelder. playReverse ();
 }
 
-int Melder_publishPlayed (void) {
+int Melder_publishPlayed () {
 	return theMelder. publishPlayed ();
 }
 
 /********** Procedures to override message methods (e.g., to enforce interactive behaviour). **********/
 
-void Melder_setHelpProc (void (*help) (const wchar_t *query))
+void Melder_setHelpProc (void (*help) (const char32 *query))
 	{ theMelder. help = help ? help : defaultHelp; }
 
 void Melder_setSearchProc (void (*search) (void))
 	{ theMelder. search = search ? search : defaultSearch; }
 
-void Melder_setWarningProc (void (*warning) (const wchar_t *))
+void Melder_setWarningProc (void (*warning) (const char32 *))
 	{ theMelder. warning = warning ? warning : defaultWarning; }
 
-void Melder_setFatalProc (void (*fatal) (const wchar_t *))
+void Melder_setFatalProc (void (*fatal) (const char32 *))
 	{ theMelder. fatal = fatal ? fatal : defaultFatal; }
 
 void Melder_setPublishProc (int (*publish) (void *))
@@ -1030,13 +1236,13 @@ void Melder_setRecordProc (int (*record) (double))
 void Melder_setRecordFromFileProc (int (*recordFromFile) (MelderFile))
 	{ theMelder. recordFromFile = recordFromFile ? recordFromFile : defaultRecordFromFile; }
 
-void Melder_setPlayProc (void (*play) (void))
+void Melder_setPlayProc (void (*play) ())
 	{ theMelder. play = play ? play : defaultPlay; }
 
-void Melder_setPlayReverseProc (void (*playReverse) (void))
+void Melder_setPlayReverseProc (void (*playReverse) ())
 	{ theMelder. playReverse = playReverse ? playReverse : defaultPlayReverse; }
 
-void Melder_setPublishPlayedProc (int (*publishPlayed) (void))
+void Melder_setPublishPlayedProc (int (*publishPlayed) ())
 	{ theMelder. publishPlayed = publishPlayed ? publishPlayed : defaultPublishPlayed; }
 
 /* End of file melder.cpp */
diff --git a/sys/melder.h b/sys/melder.h
index 6b38f50..7c340ca 100644
--- a/sys/melder.h
+++ b/sys/melder.h
@@ -24,19 +24,13 @@
 #include <string.h>
 	#define strequ  ! strcmp
 	#define strnequ  ! strncmp
-	#define wcsequ  ! wcscmp
-	#define wcsnequ  ! wcsncmp
-	#define Melder_strequ  ! Melder_strcmp
-	#define Melder_strnequ  ! Melder_strncmp
-	#define Melder_wcsequ  ! Melder_wcscmp
-	#define Melder_wcsnequ  ! Melder_wcsncmp
+	#define Melder_equ  ! Melder_cmp
+	#define Melder_nequ  ! Melder_ncmp
 #include <stdarg.h>
 #include <stddef.h>
 #include <wchar.h>
+#include <wctype.h>
 #ifdef __MINGW32__
-	#undef swprintf
-	#define swprintf  _snwprintf
-	//#define swprintf  __mingw_snwprintf
 	#include <sys/types.h>   // for off_t
 #endif
 #include <stdbool.h>
@@ -51,11 +45,9 @@
 	#define INT54_MIN  -9007199254740991LL
 #endif
 
-typedef wchar_t wchar;
-typedef uint8_t  char8_t;
-typedef char32_t char32;
+typedef unsigned char char8;
 typedef char16_t char16;
-typedef char8_t char8;
+typedef char32_t char32;
 typedef int8_t int8;
 typedef int16_t int16;
 typedef int32_t int32;
@@ -64,7 +56,7 @@ typedef uint8_t uint8;
 typedef uint16_t uint16;
 typedef uint32_t uint32;
 
-bool Melder_wcsequ_firstCharacterCaseInsensitive (const wchar_t *string1, const wchar_t *string2);
+bool Melder_str32equ_firstCharacterCaseInsensitive (const char32 *string1, const char32 *string2);
 
 #include "enums.h"
 
@@ -80,198 +72,111 @@ bool Melder_wcsequ_firstCharacterCaseInsensitive (const wchar_t *string1, const
 	#define NULL  ((void *) 0)
 #endif
 
-/********** FILES **********/
-
-#if defined (_WIN32)
-	#define Melder_DIRECTORY_SEPARATOR  '\\'
-#else
-	#define Melder_DIRECTORY_SEPARATOR  '/'
-#endif
-
-struct FLAC__StreamDecoder;
-struct FLAC__StreamEncoder;
-
-#define kMelder_MAXPATH 1023   /* excluding the null byte */
-
-struct structMelderFile {
-	FILE *filePointer;
-	wchar_t path [kMelder_MAXPATH+1];
-	bool openForReading, openForWriting, verbose, requiresCRLF;
-	unsigned long outputEncoding;
-	int indent;
-	struct FLAC__StreamEncoder *flacEncoder;
-};
-typedef struct structMelderFile *MelderFile;
-
-struct structMelderDir {
-	wchar_t path [kMelder_MAXPATH+1];
-};
-typedef struct structMelderDir *MelderDir;
-
-#if defined (macintosh) && useCarbon
-	void Melder_machToFile (void *void_fsref, MelderFile file);
-#endif
-
-const wchar_t * MelderFile_name (MelderFile file);
-wchar_t * MelderDir_name (MelderDir dir);
-void Melder_pathToDir (const wchar_t *path, MelderDir dir);
-void Melder_pathToFile (const wchar_t *path, MelderFile file);
-void Melder_relativePathToFile (const wchar_t *path, MelderFile file);
-wchar_t * Melder_dirToPath (MelderDir dir);
-	/* Returns a pointer internal to 'dir', like "/u/paul/praats" or "D:\Paul\Praats" */
-wchar_t * Melder_fileToPath (MelderFile file);
-void MelderFile_copy (MelderFile file, MelderFile copy);
-void MelderDir_copy (MelderDir dir, MelderDir copy);
-bool MelderFile_equal (MelderFile file1, MelderFile file2);
-bool MelderDir_equal (MelderDir dir1, MelderDir dir2);
-void MelderFile_setToNull (MelderFile file);
-bool MelderFile_isNull (MelderFile file);
-void MelderDir_setToNull (MelderDir dir);
-bool MelderDir_isNull (MelderDir dir);
-void MelderDir_getFile (MelderDir parent, const wchar_t *fileName, MelderFile file);
-void MelderDir_relativePathToFile (MelderDir dir, const wchar_t *path, MelderFile file);
-void MelderFile_getParentDir (MelderFile file, MelderDir parent);
-void MelderDir_getParentDir (MelderDir file, MelderDir parent);
-bool MelderDir_isDesktop (MelderDir dir);
-void MelderDir_getSubdir (MelderDir parent, const wchar_t *subdirName, MelderDir subdir);
-void Melder_rememberShellDirectory (void);
-wchar_t * Melder_getShellDirectory (void);
-void Melder_getHomeDir (MelderDir homeDir);
-void Melder_getPrefDir (MelderDir prefDir);
-void Melder_getTempDir (MelderDir tempDir);
-
-bool MelderFile_exists (MelderFile file);
-bool MelderFile_readable (MelderFile file);
-long MelderFile_length (MelderFile file);
-void MelderFile_delete (MelderFile file);
-
-/* The following two should be combined with each other and with Windows extension setting: */
-FILE * Melder_fopen (MelderFile file, const char *type);
-void Melder_fclose (MelderFile file, FILE *stream);
-void Melder_files_cleanUp (void);
-
-/* So these will be the future replacements for the above, as soon as we rid of text files: */
-MelderFile MelderFile_open (MelderFile file);
-MelderFile MelderFile_append (MelderFile file);
-MelderFile MelderFile_create (MelderFile file);
-void * MelderFile_read (MelderFile file, long nbytes);
-char * MelderFile_readLine (MelderFile file);
-void MelderFile_writeCharacter (MelderFile file, wchar_t kar);
-void MelderFile_write (MelderFile file, const wchar_t *s1);
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2);
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5);
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
-void MelderFile_rewind (MelderFile file);
-void MelderFile_seek (MelderFile file, long position, int direction);
-long MelderFile_tell (MelderFile file);
-void MelderFile_close (MelderFile file);
-void MelderFile_close_nothrow (MelderFile file);
-
-/* Read and write whole text files. */
-wchar_t * MelderFile_readText (MelderFile file);
-void MelderFile_writeText (MelderFile file, const wchar_t *text, enum kMelder_textOutputEncoding outputEncoding);
-void MelderFile_appendText (MelderFile file, const wchar_t *text);
-
-void Melder_createDirectory (MelderDir parent, const wchar_t *subdirName, int mode);
-
-void Melder_getDefaultDir (MelderDir dir);
-void Melder_setDefaultDir (MelderDir dir);
-void MelderFile_setDefaultDir (MelderFile file);
-
-/* Use the following functions to pass unchanged text or file names to Melder_* functions. */
-/* Backslashes are replaced by "\bs". */
-/* The trick is that they return one of 11 cyclically used static strings, */
-/* so you can use up to 11 strings in a single Melder_* call. */
-wchar_t * Melder_peekExpandBackslashes (const wchar_t *message);
-const wchar_t * MelderFile_messageName (MelderFile file);   // Calls Melder_peekExpandBackslashes ().
-
 /*
  * Debugging.
  */
-int Melder_fatal (const char *format, ...);
-	/* Give error message, abort program. */
-	/* Should only be caused by programming errors. */
 
-int Melder_assert_ (const char *condition, const char *fileName, int lineNumber);
+void Melder_assert_ (const char *fileName, int lineNumber, const char *condition);
 	/* Call Melder_fatal with a message based on the following template: */
 	/*    "Assertion failed in file <fileName> on line <lineNumber>: <condition>" */
 
 void Melder_setTracing (bool tracing);
 extern bool Melder_isTracing;
-void Melder_tracingToFile (MelderFile file);
-void Melder_trace_FMT (const char *fileName, int lineNumber, const char *functionName, const char *format, ...);
-#ifdef NDEBUG
-	#define Melder_assert(x)   ((void) 0)
-	#define trace(x)   ((void) 0)
-#else
-	#define Melder_assert(x)   ((x) ? (void) (0) : (void) Melder_assert_ (#x, __FILE__, __LINE__))
-	#define trace(...)   ((! Melder_isTracing) ? (void) 0 : Melder_trace_FMT (__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__))
-#endif
 
 /*
- * char16 and char32 handling.
+ * char16 handling.
  */
-static inline int64_t str16len (const char16_t *string) {
-	if (sizeof (wchar_t) == 2) {
-		return (int64_t) wcslen ((const wchar_t *) string);
-	} else {
-		int64_t result = 0;
-		while (* string ++ != u'\0') result ++;
-		return result;
-	}
+inline static int64 str16len (const char16 *string) {
+	const char16 *p = string;
+	while (*p != u'\0') ++ p;
+	return (int64) (p - string);
 }
-static inline void str16cpy (char16_t *target, const char16_t *source) {
-	if (sizeof (wchar_t) == 2) {
-		wcscpy ((wchar_t *) target, (const wchar_t *) source);
-	} else {
-		while (* source != u'\0') * target ++ = * source ++;
-		* target = u'\0';
+inline static char16 * str16cpy (char16 *target, const char16 *source) {
+	char16 *p = target;
+	while (* source != u'\0') * p ++ = * source ++;
+	*p = u'\0';
+	return target;
+}
+/*
+ * char32 handling.
+ */
+inline static int64 str32len (const char32 *string) {
+	const char32 *p = string;
+	while (*p != U'\0') ++ p;
+	return (int64) (p - string);
+}
+inline static char32 * str32cpy (char32 *target, const char32 *source) {
+	char32 *p = target;
+	while (* source != U'\0') * p ++ = * source ++;
+	*p = U'\0';
+	return target;
+}
+inline static char32 * str32ncpy (char32 *target, const char32 *source, int64 n) {
+	char32 *p = target;
+	for (; n > 0 && *source != U'\0'; -- n) * p ++ = * source ++;
+	for (; n > 0; -- n) * p ++ = U'\0';
+	return target;
+}
+inline static int str32cmp (const char32 *string1, const char32 *string2) {
+	for (;; ++ string1, ++ string2) {
+		int32 diff = (int32) *string1 - (int32) *string2;
+		if (diff) return (int) diff;
+		if (*string1 == U'\0') return 0;
 	}
 }
-static inline int str16cmp (const char16_t *string1, const char16_t *string2) {
-	if (sizeof (wchar_t) == 2) {
-		return wcscmp ((const wchar_t *) string1, (const wchar_t *) string2);
-	} else {
-		while (*string1 == *string2 ++) {
-			if (*string1 ++ == u'\0') {
-				return 0;
-			}
-		}
-		return (int) (int16_t) (string1 [0] - string2 [-1]);   // unsigned subtraction, then sign conversion, then up conversion
+#define str32equ  ! str32cmp
+inline static int str32ncmp (const char32 *string1, const char32 *string2, int64 n) {
+	for (; n > 0; -- n, ++ string1, ++ string2) {
+		int32 diff = (int32) *string1 - (int32) *string2;
+		if (diff) return (int) diff;
+		if (*string1 == U'\0') return 0;
 	}
+	return 0;
 }
-static inline int64_t str32len (const char32_t *string) {
-	if (sizeof (wchar_t) == 4) {
-		return (int64_t) wcslen ((const wchar_t *) string);
-	} else {
-		int64_t result = 0;
-		while (* string ++ != U'\0') result ++;
-		return result;
+#define str32nequ  ! str32ncmp
+inline static char32 * str32chr (const char32 *string, char32 kar) {
+	for (; *string != kar; ++ string) {
+		if (*string == U'\0')
+			return nullptr;
 	}
+	return (char32 *) string;
 }
-static inline void str32cpy (char32_t *target, const char32_t *source) {
-	if (sizeof (wchar_t) == 4) {
-		wcscpy ((wchar_t *) target, (const wchar_t *) source);
-	} else {
-		while (* source != U'\0') * target ++ = * source ++;
-		* target = U'\0';
+inline static char32 * str32rchr (const char32 *string, char32 kar) {
+	char32 *result = nullptr;
+	for (; *string != U'\0'; ++ string) {
+		if (*string == kar) result = (char32 *) string;
 	}
+	return result;
+}
+inline static char32 * str32str (const char32 *string, const char32 *find) {
+	int64 length = str32len (find);
+	if (length == 0) return (char32 *) string;
+	char32 firstCharacter = * find ++;   // optimization
+	do {
+		char32 kar;
+		do {
+			kar = * string ++;
+			if (kar == U'\0') return nullptr;
+		} while (kar != firstCharacter);
+	} while (str32ncmp (string, find, length - 1));
+	return (char32 *) (string - 1);
+}
+inline static int64 str32spn (const char32 *string1, const char32 *string2) {
+	const char32 *p = string1;
+	char32 kar1, kar2;
+cont:
+	kar1 = * p ++;
+	for (const char32 * q = string2; (kar2 = * q ++) != 0;)
+		if (kar2 == kar1)
+			goto cont;
+	return p - 1 - string1;
 }
-static inline int str32cmp (const char32_t *string1, const char32_t *string2) {
+extern "C" char * Melder_peek32to8 (const char32 *string);
+inline static long a32tol (const char32 *string) {
 	if (sizeof (wchar_t) == 4) {
-		return wcscmp ((const wchar_t *) string1, (const wchar_t *) string2);
+		return wcstol ((const wchar_t *) string, nullptr, 10);
 	} else {
-		while (*string1 == *string2 ++) {
-			if (*string1 ++ == U'\0') {
-				return 0;
-			}
-		}
-		return (int) (int32_t) (string1 [0] - string2 [-1]);   // unsigned subtraction, then sign conversion, then perhaps up conversion
+		return atol (Melder_peek32to8 (string));
 	}
 }
 
@@ -289,25 +194,86 @@ typedef struct { double red, green, blue, transparency; } double_rgbt;
 	The following routines return a static string, chosen from a circularly used set of 11 buffers.
 	You can call at most 11 of them in one Melder_casual call, for instance.
 */
-const wchar_t * Melder_integer (int64_t value);
-const wchar_t * Melder_bigInteger (int64_t value);
-const wchar_t * Melder_boolean (bool value);   // "yes" or "no"
-const wchar_t * Melder_double (double value);   // "--undefined--" or something in the "%.15g", "%.16g", or "%.17g" formats
-const wchar_t * Melder_single (double value);   // "--undefined--" or something in the "%.8g" format
-const wchar_t * Melder_half (double value);   // "--undefined--" or something in the "%.4g" format
-const wchar_t * Melder_fixed (double value, int precision);   // "--undefined--" or something in the "%.*f" format
-const wchar_t * Melder_fixedExponent (double value, int exponent, int precision);
-	/* if exponent is -2 and precision is 2:   67E-2, 0.00024E-2 */
-const wchar_t * Melder_percent (double value, int precision);
-	/* "--undefined--" or, if precision is 3: "0" or "34.400%" or "0.014%" or "0.001%" or "0.0000007%" */
-const wchar_t * Melder_float (const wchar_t *number);
-	/* turns 1e+4 into 10^^4, or -1.23456e-78 into -1.23456\.c10^^-78 */
-const wchar_t * Melder_naturalLogarithm (double lnNumber);   // turns -10000 into "1.135483865315339e-4343"
+
+const  char32 * Melder_integer  (int64 value);
+const  char   * Melder8_integer (int64 value);
+
+const  char32 * Melder_bigInteger  (int64 value);
+const  char   * Melder8_bigInteger (int64 value);
+
+const  char32 * Melder_boolean  (bool value);
+const  char   * Melder8_boolean (bool value);
+	// "yes" or "no"
+
+/**
+	Format a double value as "--undefined--" or something in the "%.15g", "%.16g", or "%.17g" formats.
+*/
+const  char32 * Melder_double  (double value);
+const  char   * Melder8_double (double value);
+
+/**
+	Format a double value as "--undefined--" or something in the "%.9g" format.
+*/
+const  char32 * Melder_single  (double value);
+const  char   * Melder8_single (double value);
+
+/**
+	Format a double value as "--undefined--" or something in the "%.4g" format.
+*/
+const  char32 * Melder_half  (double value);
+const  char   * Melder8_half (double value);
+
+/**
+	Format a double value as "--undefined--" or something in the "%.*f" format.
+*/
+const  char32 * Melder_fixed  (double value, int precision);
+const  char   * Melder8_fixed (double value, int precision);
+
+/**
+	Format a double value with a specified precision. If exponent is -2 and precision is 2, you get things like 67E-2 or 0.00024E-2.
+*/
+const  char32 * Melder_fixedExponent  (double value, int exponent, int precision);
+const  char   * Melder8_fixedExponent (double value, int exponent, int precision);
+
+/**
+	Format a double value as a percentage. If precision is 3, you get things like "0" or "34.400%" or "0.014%" or "0.001%" or "0.0000007%".
+*/
+const  char32 * Melder_percent  (double value, int precision);
+const  char   * Melder8_percent (double value, int precision);
+
+/**
+	Convert a formatted floating-point string to something suitable for visualization with the Graphics library.
+	For instance, "1e+4" is turned into "10^^4", and "-1.23456e-78" is turned into "-1.23456\.c10^^-78".
+*/
+const char32 * Melder_float (const char32 *number);
+
+/**
+	Format the number that is specified by its natural logarithm.
+	For instance, -10000 is formatted as "1.135483865315339e-4343", which is a floating-point representation of exp(-10000).
+*/
+const  char32 * Melder_naturalLogarithm  (double lnNumber);
+const  char   * Melder8_naturalLogarithm (double lnNumber);
+
+const  char32 * Melder_pointer  (void *pointer);
+const  char   * Melder8_pointer (void *pointer);
+
+const  char32 * Melder_character  (char32_t kar);
+const  char   * Melder8_character (char32_t kar);
+
+const char32 * Melder_pad (int64 width, const char32 *string);   // will append spaces to the left of 'string' until 'width' is reached; no truncation
+const char32 * Melder_pad (const char32 *string, int64 width);   // will append spaces to the right of 'string' until 'width' is reached; no truncation
+const char32 * Melder_truncate (int64 width, const char32 *string);   // will cut away the left of 'string' until 'width' is reached; no padding
+const char32 * Melder_truncate (const char32 *string, int64 width);   // will cut away the right of 'string' until 'width' is reached; no padding
+const char32 * Melder_padOrTruncate (int64 width, const char32 *string);   // will cut away, or append spaces to, the left of 'string' until 'width' is reached
+const char32 * Melder_padOrTruncate (const char32 *string, int64 width);   // will cut away, or append spaces to, the right of 'string' until 'width' is reached
+
 
 /********** STRING TO NUMBER CONVERSION **********/
 
-int Melder_isStringNumeric_nothrow (const wchar_t *string);
-double Melder_atof (const wchar_t *string);
+bool Melder_isStringNumeric_nothrow (const char32 *string);
+double Melder_a8tof (const char *string);
+double Melder_atof (const char32 *string);
+int64 Melder_atoi (const char32 *string);
 	/*
 	 * "3.14e-3" -> 3.14e-3
 	 * "15.6%" -> 0.156
@@ -316,7 +282,7 @@ double Melder_atof (const wchar_t *string);
 
 /********** CONSOLE **********/
 
-void Melder_writeToConsole (const wchar_t *message, bool useStderr);
+void Melder_writeToConsole (const char32 *message, bool useStderr);
 
 /********** MEMORY ALLOCATION ROUTINES **********/
 
@@ -325,130 +291,401 @@ void Melder_writeToConsole (const wchar_t *message, bool useStderr);
 /* the f versions open up a rainy day fund or crash Praat. */
 /* These routines also maintain a count of the total number of blocks allocated. */
 
-void Melder_alloc_init (void);   // to be called around program start-up
-void Melder_message_init (void);   // to be called around program start-up
-void * _Melder_malloc (int64_t size);
-#define Melder_malloc(type,numberOfElements)  (type *) _Melder_malloc ((numberOfElements) * (int64_t) sizeof (type))
-void * _Melder_malloc_f (int64_t size);
-#define Melder_malloc_f(type,numberOfElements)  (type *) _Melder_malloc_f ((numberOfElements) * (int64_t) sizeof (type))
-void * Melder_realloc (void *pointer, int64_t size);
-void * Melder_realloc_f (void *pointer, int64_t size);
-void * _Melder_calloc (int64_t numberOfElements, int64_t elementSize);
+void Melder_alloc_init ();   // to be called around program start-up
+void Melder_message_init ();   // to be called around program start-up
+void * _Melder_malloc (int64 size);
+#define Melder_malloc(type,numberOfElements)  (type *) _Melder_malloc ((numberOfElements) * (int64) sizeof (type))
+void * _Melder_malloc_f (int64 size);
+#define Melder_malloc_f(type,numberOfElements)  (type *) _Melder_malloc_f ((numberOfElements) * (int64) sizeof (type))
+void * Melder_realloc (void *pointer, int64 size);
+void * Melder_realloc_f (void *pointer, int64 size);
+void * _Melder_calloc (int64 numberOfElements, int64 elementSize);
 #define Melder_calloc(type,numberOfElements)  (type *) _Melder_calloc (numberOfElements, sizeof (type))
-void * _Melder_calloc_f (int64_t numberOfElements, int64_t elementSize);
+void * _Melder_calloc_f (int64 numberOfElements, int64 elementSize);
 #define Melder_calloc_f(type,numberOfElements)  (type *) _Melder_calloc_f (numberOfElements, sizeof (type))
 char * Melder_strdup (const char *string);
 char * Melder_strdup_f (const char *string);
-wchar_t * Melder_wcsdup (const wchar_t *string);
-wchar_t * Melder_wcsdup_f (const wchar_t *string);
-int Melder_strcmp (const char *string1, const char *string2);   // regards null string as empty string
-int Melder_wcscmp (const wchar_t *string1, const wchar_t *string2);   // regards null string as empty string
-int Melder_strncmp (const char *string1, const char *string2, int64_t n);
-int Melder_wcsncmp (const wchar_t *string1, const wchar_t *string2, int64_t n);
-wchar_t * Melder_wcstok (wchar_t *string, const wchar_t *delimiter, wchar_t **last);   // circumvents platforms where wcstok has only two arguments
-wchar_t * Melder_wcsdecompose (const wchar_t *string);
-wchar_t * Melder_wcsprecompose (const wchar_t *string);
-wchar_t * Melder_wcsExpandBackslashSequences (const wchar_t *string);
-wchar_t * Melder_wcsReduceBackslashSequences (const wchar_t *string);
-void Melder_wcsReduceBackslashSequences_inline (const wchar_t *string);
+
+int Melder_cmp (const char32 *string1, const char32 *string2);   // regards null string as empty string
+int Melder_ncmp (const char32 *string1, const char32 *string2, int64 n);
+char32 * Melder_tok (char32 *string, const char32 *delimiter);
 
 /**
  * Text encodings.
  */
-void Melder_textEncoding_prefs (void);
+void Melder_textEncoding_prefs ();
 void Melder_setInputEncoding (enum kMelder_textInputEncoding encoding);
-int Melder_getInputEncoding (void);
+int Melder_getInputEncoding ();
 void Melder_setOutputEncoding (enum kMelder_textOutputEncoding encoding);
-enum kMelder_textOutputEncoding Melder_getOutputEncoding (void);
+enum kMelder_textOutputEncoding Melder_getOutputEncoding ();
 
 /*
  * Some other encodings. Although not used in the above set/get functions,
  * these constants should stay separate from the above encoding constants
  * because they occur in the same fields of struct MelderFile.
  */
-const uint32_t kMelder_textInputEncoding_FLAC = 0x464C4143;
-const uint32_t kMelder_textOutputEncoding_ASCII = 0x41534349;
-const uint32_t kMelder_textOutputEncoding_ISO_LATIN1 = 0x4C415401;
-const uint32_t kMelder_textOutputEncoding_FLAC = 0x464C4143;
-
-bool Melder_isValidAscii (const wchar_t *string);
-bool Melder_strIsValidUtf8 (const char *string);
-bool Melder_isEncodable (const wchar_t *string, int outputEncoding);
-extern char32_t Melder_decodeMacRoman [256];
-extern char32_t Melder_decodeWindowsLatin1 [256];
-
-long Melder_killReturns_inlineW  (wchar_t *text);
-long Melder_killReturns_inline32 (char32_t *text);
-
-size_t wcslen_utf8  (const wchar_t *wcs, bool expandNewlines);
-size_t wcslen_utf16 (const wchar_t *wcs, bool expandNewlines);
-size_t wcslen_char32 (const wchar_t *wcs, bool expandNewlines);
-
-void Melder_8bitToWcs_inline   (const char *source, wchar_t *target, int inputEncoding);
-void Melder_8bitToChar32_inline (const char *source, char32_t *target, int inputEncoding);
+const uint32 kMelder_textInputEncoding_FLAC = 0x464C4143;
+const uint32 kMelder_textOutputEncoding_ASCII = 0x41534349;
+const uint32 kMelder_textOutputEncoding_ISO_LATIN1 = 0x4C415401;
+const uint32 kMelder_textOutputEncoding_FLAC = 0x464C4143;
+
+bool Melder_isValidAscii (const char32 *string);
+bool Melder_str8IsValidUtf8 (const char *string);
+bool Melder_isEncodable (const char32 *string, int outputEncoding);
+extern char32 Melder_decodeMacRoman [256];
+extern char32 Melder_decodeWindowsLatin1 [256];
+
+long Melder_killReturns_inline (char32 *text);
+long Melder_killReturns_inline (char *text);
+/*
+	 Replaces all bare returns (Mac) or return / linefeed sequences (Win) with bare linefeeds (generic = Unix).
+	 Returns new length of string (equal to or less than old length).
+*/
+
+size_t str32len_utf8  (const char32 *string, bool nativizeNewlines);
+size_t str32len_utf16 (const char32 *string, bool nativizeNewlines);
+
+extern "C" char32 * Melder_peek8to32 (const char *string);
+void Melder_8to32_inline (const char *source, char32 *target, int inputEncoding);
 	// errors: Text is not valid UTF-8.
-wchar_t * Melder_8bitToWcs (const char *string, int inputEncoding);
-char32 * Melder_8bitToChar32 (const char *string, int inputEncoding);
+char32 * Melder_8to32 (const char *string, int inputEncoding);
 	// errors: Out of memory; Text is not valid UTF-8.
-wchar_t * Melder_utf8ToWcs (const char *string);
-char32 * Melder_utf8ToChar32 (const char *string);
+char32 * Melder_8to32 (const char *string);
 	// errors: Out of memory; Text is not valid UTF-8.
 
-char32 * Melder_utf8ToChar32_f (const char *string);   // for use in string constants only
-	// crashes: Out of memory; Text is not valid UTF-8.
+char32 * Melder_peek16to32 (const char16 *text);
+char32 * Melder_16to32 (const char16 *text);
 
-void Melder_wcsToUtf8_inline (const wchar_t *wcs, char *utf8);
-char * Melder_wcsToUtf8 (const wchar_t *string);
+extern "C" char * Melder_peek32to8 (const char32 *string);
+void Melder_32to8_inline (const char32 *string, char *utf8);
+char * Melder_32to8 (const char32 *string);
+char16 * Melder_32to16 (const char32 *string);
 	// errors: Out of memory.
-void Melder_wcsTo8bitFileRepresentation_inline (const wchar_t *wcs, char *utf8);
-void Melder_8bitFileRepresentationToWcs_inline (const char *utf8, wchar_t *wcs);
-extern "C" wchar_t * Melder_peekUtf8ToWcs (const char *string);
-extern "C" char * Melder_peekWcsToUtf8 (const wchar_t *string);
-extern "C" const uint16_t * Melder_peekWcsToUtf16 (const wchar_t *string);   // char16_t is C++-only
-const void * Melder_peekWcsToCfstring (const wchar_t *string);
-void Melder_fwriteWcsAsUtf8 (const wchar_t *ptr, size_t n, FILE *f);
+
+char16 * Melder_peek32to16 (const char32 *text, bool nativizeNewlines);
+extern "C" char16 * Melder_peek32to16 (const char32 *string);
+
+#ifdef _WIN32
+	inline static wchar_t * Melder_peek32toW (const char32 *string) { return (wchar_t *) Melder_peek32to16 (string); }
+	inline static wchar_t * Melder_32toW (const char32 *string) { return (wchar_t *) Melder_32to16 (string); }
+	inline static char32 * Melder_peekWto32 (const wchar_t *string) { return Melder_peek16to32 ((const char16 *) string); }
+	inline static char32 * Melder_Wto32 (const wchar_t *string) { return Melder_16to32 ((const char16 *) string); }
+#endif
+
+void Melder_str32To8bitFileRepresentation_inline (const char32 *string, char *utf8);
+void Melder_8bitFileRepresentationToStr32_inline (const char *utf8, char32 *string);
+const void * Melder_peek32toCfstring (const char32 *string);
+void Melder_fwrite32to8 (const char32 *ptr, FILE *f);
+
+
+/********** FILES **********/
+
+#if defined (_WIN32)
+	#define Melder_DIRECTORY_SEPARATOR  '\\'
+#else
+	#define Melder_DIRECTORY_SEPARATOR  '/'
+#endif
+
+struct FLAC__StreamDecoder;
+struct FLAC__StreamEncoder;
+
+#define kMelder_MAXPATH 1023   /* excluding the null byte */
+
+struct structMelderFile {
+	FILE *filePointer;
+	char32 path [kMelder_MAXPATH+1];
+	enum class Format { none = 0, binary = 1, text = 2 } format;
+	bool openForReading, openForWriting, verbose, requiresCRLF;
+	unsigned long outputEncoding;
+	int indent;
+	struct FLAC__StreamEncoder *flacEncoder;
+};
+typedef struct structMelderFile *MelderFile;
+
+struct structMelderDir {
+	char32 path [kMelder_MAXPATH+1];
+};
+typedef struct structMelderDir *MelderDir;
+
+#if defined (macintosh) && useCarbon
+	void Melder_machToFile (void *void_fsref, MelderFile file);
+#endif
+
+const char32 * MelderFile_name (MelderFile file);
+char32 * MelderDir_name (MelderDir dir);
+void Melder_pathToDir (const char32 *path, MelderDir dir);
+void Melder_pathToFile (const char32 *path, MelderFile file);
+void Melder_relativePathToFile (const char32 *path, MelderFile file);
+char32 * Melder_dirToPath (MelderDir dir);
+	/* Returns a pointer internal to 'dir', like "/u/paul/praats" or "D:\Paul\Praats" */
+char32 * Melder_fileToPath (MelderFile file);
+void MelderFile_copy (MelderFile file, MelderFile copy);
+void MelderDir_copy (MelderDir dir, MelderDir copy);
+bool MelderFile_equal (MelderFile file1, MelderFile file2);
+bool MelderDir_equal (MelderDir dir1, MelderDir dir2);
+void MelderFile_setToNull (MelderFile file);
+bool MelderFile_isNull (MelderFile file);
+void MelderDir_setToNull (MelderDir dir);
+bool MelderDir_isNull (MelderDir dir);
+void MelderDir_getFile (MelderDir parent, const char32 *fileName, MelderFile file);
+void MelderDir_relativePathToFile (MelderDir dir, const char32 *path, MelderFile file);
+void MelderFile_getParentDir (MelderFile file, MelderDir parent);
+void MelderDir_getParentDir (MelderDir file, MelderDir parent);
+bool MelderDir_isDesktop (MelderDir dir);
+void MelderDir_getSubdir (MelderDir parent, const char32 *subdirName, MelderDir subdir);
+void Melder_rememberShellDirectory ();
+char32 * Melder_getShellDirectory ();
+void Melder_getHomeDir (MelderDir homeDir);
+void Melder_getPrefDir (MelderDir prefDir);
+void Melder_getTempDir (MelderDir tempDir);
+
+bool MelderFile_exists (MelderFile file);
+bool MelderFile_readable (MelderFile file);
+long MelderFile_length (MelderFile file);
+void MelderFile_delete (MelderFile file);
+
+/* The following two should be combined with each other and with Windows extension setting: */
+FILE * Melder_fopen (MelderFile file, const char *type);
+void Melder_fclose (MelderFile file, FILE *stream);
+void Melder_files_cleanUp ();
+
+/* Use the following functions to pass unchanged text or file names to Melder_* functions. */
+/* Backslashes are replaced by "\bs". */
+/* The trick is that they return one of 11 cyclically used static strings, */
+/* so you can use up to 11 strings in a single Melder_* call. */
+char32 * Melder_peekExpandBackslashes (const char32 *message);
+const char32 * MelderFile_messageName (MelderFile file);   // Calls Melder_peekExpandBackslashes ().
+
+/* The arguments to all messaging functions. */
+
+typedef class structThing *Thing;
+char32 *Thing_messageName (Thing me);
+struct MelderArg {
+	const char32 *_arg;
+	MelderArg (const char32 *            arg) : _arg (arg) { }
+	//MelderArg (const char   *            arg) : _arg (Melder_peek8to32 (arg)) { }
+	MelderArg (const double              arg) : _arg (Melder_double          (arg)) { }
+	MelderArg (const          long long  arg) : _arg (Melder_integer         (arg)) { }
+	MelderArg (const unsigned long long  arg) : _arg (Melder_integer         ((int64) arg)) { }
+	MelderArg (const          long       arg) : _arg (Melder_integer         (arg)) { }
+	MelderArg (const unsigned long       arg) : _arg (Melder_integer         ((int64) arg)) { }   // ignore ULL above 2^63
+	MelderArg (const          int        arg) : _arg (Melder_integer         (arg)) { }
+	MelderArg (const unsigned int        arg) : _arg (Melder_integer         (arg)) { }
+	MelderArg (const          short      arg) : _arg (Melder_integer         (arg)) { }
+	MelderArg (const unsigned short      arg) : _arg (Melder_integer         (arg)) { }
+	MelderArg (const char32_t            arg) : _arg (Melder_character       (arg)) { }
+	MelderArg (Thing                     arg) : _arg (Thing_messageName      (arg)) { }
+	MelderArg (MelderFile                arg) : _arg (MelderFile_messageName (arg)) { }
+	//MelderArg (void *                    arg) : _arg (Melder_integer         ((int64) arg)) { }
+};
+
+#define Melder_1_ARG \
+	const MelderArg& arg1
+#define Melder_2_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2
+#define Melder_3_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3
+#define Melder_4_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4
+#define Melder_5_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5
+#define Melder_6_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6
+#define Melder_7_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7
+#define Melder_8_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7,  const MelderArg& arg8
+#define Melder_9_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7,  const MelderArg& arg8, \
+	const MelderArg& arg9
+#define Melder_10_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7,  const MelderArg& arg8, \
+	const MelderArg& arg9,  const MelderArg& arg10
+#define Melder_11_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7,  const MelderArg& arg8, \
+	const MelderArg& arg9,  const MelderArg& arg10, const MelderArg& arg11
+#define Melder_12_OR_13_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7,  const MelderArg& arg8, \
+	const MelderArg& arg9,  const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12, \
+	const MelderArg& arg13 = U""
+#define Melder_13_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7,  const MelderArg& arg8, \
+	const MelderArg& arg9,  const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12, \
+	const MelderArg& arg13
+#define Melder_14_OR_15_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7,  const MelderArg& arg8, \
+	const MelderArg& arg9,  const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12, \
+	const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15 = U""
+#define Melder_15_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7,  const MelderArg& arg8, \
+	const MelderArg& arg9,  const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12, \
+	const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15
+#define Melder_16_TO_19_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7,  const MelderArg& arg8, \
+	const MelderArg& arg9,  const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12, \
+	const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15, const MelderArg& arg16, \
+	const MelderArg& arg17 = U"", const MelderArg& arg18 = U"", const MelderArg& arg19 = U""
+#define Melder_19_ARGS \
+	const MelderArg& arg1,  const MelderArg& arg2,  const MelderArg& arg3,  const MelderArg& arg4, \
+	const MelderArg& arg5,  const MelderArg& arg6,  const MelderArg& arg7,  const MelderArg& arg8, \
+	const MelderArg& arg9,  const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12, \
+	const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15, const MelderArg& arg16, \
+	const MelderArg& arg17, const MelderArg& arg18, const MelderArg& arg19
+
+#define Melder_1_ARG_CALL \
+	arg1._arg
+#define Melder_2_ARGS_CALL \
+	arg1._arg, arg2._arg
+#define Melder_3_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg
+#define Melder_4_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg
+#define Melder_5_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg, arg5._arg
+#define Melder_6_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg, arg5._arg, arg6._arg
+#define Melder_7_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg, arg5._arg, arg6._arg, arg7._arg
+#define Melder_8_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg, arg5._arg, arg6._arg, arg7._arg, arg8._arg
+#define Melder_9_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg, arg5._arg, arg6._arg, arg7._arg, arg8._arg, arg9._arg
+#define Melder_10_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg, arg5._arg, arg6._arg, arg7._arg, arg8._arg, arg9._arg, arg10._arg
+#define Melder_11_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg, arg5._arg, arg6._arg, arg7._arg, arg8._arg, arg9._arg, arg10._arg, \
+	arg11._arg
+#define Melder_13_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg, arg5._arg, arg6._arg, arg7._arg, arg8._arg, arg9._arg, arg10._arg, \
+	arg11._arg, arg12._arg, arg13._arg
+#define Melder_15_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg, arg5._arg, arg6._arg, arg7._arg, arg8._arg, arg9._arg, arg10._arg, \
+	arg11._arg, arg12._arg, arg13._arg, arg14._arg, arg15._arg
+#define Melder_19_ARGS_CALL \
+	arg1._arg, arg2._arg, arg3._arg, arg4._arg, arg5._arg, arg6._arg, arg7._arg, arg8._arg, arg9._arg, arg10._arg, \
+	arg11._arg, arg12._arg, arg13._arg, arg14._arg, arg15._arg, arg16._arg, arg17._arg, arg18._arg, arg19._arg
+
+void Melder_tracingToFile (MelderFile file);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_1_ARG);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_2_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_3_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_4_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_5_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_6_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_7_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_8_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_9_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_10_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_11_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_12_OR_13_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_14_OR_15_ARGS);
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_16_TO_19_ARGS);
+#ifdef NDEBUG
+	#define Melder_assert(x)   ((void) 0)
+	#define trace(x)   ((void) 0)
+#else
+	#define Melder_assert(x)   ((x) ? (void) (0) : (Melder_assert_ (__FILE__, __LINE__, #x), abort ()))
+	#define trace(...)   (! Melder_isTracing ? (void) 0 : Melder_trace (__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__))
+#endif
+
+/* So these will be the future replacements for the above, as soon as we rid of text files: */
+MelderFile MelderFile_open (MelderFile file);
+MelderFile MelderFile_append (MelderFile file);
+MelderFile MelderFile_create (MelderFile file);
+void * MelderFile_read (MelderFile file, long nbytes);
+char * MelderFile_readLine (MelderFile file);
+void MelderFile_writeCharacter (MelderFile file, wchar_t kar);
+void MelderFile_writeCharacter (MelderFile file, char32 kar);
+void MelderFile_write (MelderFile file, Melder_1_ARG);
+void MelderFile_write (MelderFile file, Melder_2_ARGS);
+void MelderFile_write (MelderFile file, Melder_3_ARGS);
+void MelderFile_write (MelderFile file, Melder_4_ARGS);
+void MelderFile_write (MelderFile file, Melder_5_ARGS);
+void MelderFile_write (MelderFile file, Melder_6_ARGS);
+void MelderFile_write (MelderFile file, Melder_7_ARGS);
+void MelderFile_write (MelderFile file, Melder_8_ARGS);
+void MelderFile_write (MelderFile file, Melder_9_ARGS);
+void MelderFile_write (MelderFile file, Melder_10_ARGS);
+void MelderFile_write (MelderFile file, Melder_11_ARGS);
+void MelderFile_write (MelderFile file, Melder_12_OR_13_ARGS);
+void MelderFile_write (MelderFile file, Melder_14_OR_15_ARGS);
+void MelderFile_write (MelderFile file, Melder_16_TO_19_ARGS);
+void MelderFile_rewind (MelderFile file);
+void MelderFile_seek (MelderFile file, long position, int direction);
+long MelderFile_tell (MelderFile file);
+void MelderFile_close (MelderFile file);
+void MelderFile_close_nothrow (MelderFile file);
+
+/* Read and write whole text files. */
+char32 * MelderFile_readText (MelderFile file);
+void MelderFile_writeText (MelderFile file, const char32 *text, enum kMelder_textOutputEncoding outputEncoding);
+void MelderFile_appendText (MelderFile file, const char32 *text);
+
+void Melder_createDirectory (MelderDir parent, const char32 *subdirName, int mode);
+
+void Melder_getDefaultDir (MelderDir dir);
+void Melder_setDefaultDir (MelderDir dir);
+void MelderFile_setDefaultDir (MelderFile file);
 
 /*
  * Some often used characters.
  */
-#define L_LEFT_SINGLE_QUOTE  L"\u2018"
-#define L_RIGHT_SINGLE_QUOTE  L"\u2019"
-#define L_LEFT_DOUBLE_QUOTE  L"\u201c"
-#define L_RIGHT_DOUBLE_QUOTE  L"\u201d"
-#define L_LEFT_GUILLEMET  L"\u00ab"
-#define L_RIGHT_GUILLEMET  L"\u00bb"
+#define U_SPACE  U" "
+#define U_TAB  U"\t"
+#define U_NEWLINE  U"\n"
+#define U_COMMA  U","
+#define U_COMMA_  U", "
+#define U_PERIOD  U"."
+#define U_LEFT_SINGLE_QUOTE  U"\u2018"
+#define U_RIGHT_SINGLE_QUOTE  U"\u2019"
+#define U_LEFT_DOUBLE_QUOTE  U"\u201c"
+#define U_RIGHT_DOUBLE_QUOTE  U"\u201d"
+#define U_LEFT_GUILLEMET  U"\u00ab"
+#define U_RIGHT_GUILLEMET  U"\u00bb"
 
 #define Melder_free(pointer)  _Melder_free ((void **) & (pointer))
 void _Melder_free (void **pointer);
 /*
 	Preconditions:
-		none (*pointer may be NULL).
+		none (*pointer may be null).
 	Postconditions:
-		*pointer == NULL;
+		*pointer == nullptr;
 */
 
-double Melder_allocationCount (void);
+int64 Melder_allocationCount ();
 /*
 	Returns the total number of successful calls to
-	Melder_malloc, Melder_realloc (if 'ptr' is NULL), Melder_calloc, and Melder_strdup,
+	Melder_malloc, Melder_realloc (if 'ptr' is null), Melder_calloc, and Melder_strdup,
 	since the start of the process. Mainly for debugging purposes.
 */
 
-double Melder_deallocationCount (void);
+int64 Melder_deallocationCount ();
 /*
 	Returns the total number of successful calls to Melder_free,
 	since the start of the process. Mainly for debugging purposes.
 */
 
-double Melder_allocationSize (void);
+int64 Melder_allocationSize ();
 /*
 	Returns the total number of bytes allocated in calls to
 	Melder_malloc, Melder_realloc (if moved), Melder_calloc, and Melder_strdup,
 	since the start of the process. Mainly for debugging purposes.
 */
 
-double Melder_reallocationsInSituCount (void);
-double Melder_movingReallocationsCount (void);
+int64 Melder_reallocationsInSituCount ();
+int64 Melder_movingReallocationsCount ();
 
 /********** STRINGS **********/
 
@@ -457,78 +694,115 @@ double Melder_movingReallocationsCount (void);
 typedef struct {
 	int64 length;
 	int64 bufferSize;
-	wchar *string;   // a growing buffer, never shrunk (can only be freed by MelderString_free)
-} MelderString;
-typedef struct {
-	int64 length;
-	int64 bufferSize;
-	char16 *string;   // a growing buffer, never shrunk (can only be freed by MelderString16_free)
+	char16 *string;   // a growing buffer, rarely shrunk (can only be freed by MelderString16_free)
 } MelderString16;
 typedef struct {
 	int64 length;
 	int64 bufferSize;
-	char32 *string;   // a growing buffer, never shrunk (can only be freed by MelderString32_free)
-} MelderString32;
-
-void MelderString_free (MelderString *me);   // frees the "string" attribute only (and sets other attributes to zero)
-void MelderString16_free (MelderString16 *me);   // frees the "string" attribute only (and sets other attributes to zero)
-void MelderString32_free (MelderString32 *me);   // frees the "string" attribute only (and sets other attributes to zero)
-void MelderString_empty (MelderString *me);   // sets to empty string (buffer not freed)
-void MelderString16_empty (MelderString16 *me);   // sets to empty string (buffer not freed)
-void MelderString32_empty (MelderString32 *me);   // sets to empty string (buffer not freed)
-void MelderString_copy (MelderString *me, const wchar_t *source);
-void MelderString_ncopy (MelderString *me, const wchar_t *source, int64 n);
-void MelderString_append (MelderString *me, const wchar_t *s1);
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2);
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5);
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6);
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
-void MelderString_appendCharacter (MelderString *me, wchar_t character);
-void MelderString16_appendCharacter (MelderString16 *me, wchar_t character);
-void MelderString32_appendCharacter (MelderString32 *me, char32_t character);
-void MelderString_get (MelderString *me, wchar_t *destination);   // performs no boundary checking
-double MelderString_allocationCount (void);
-double MelderString_deallocationCount (void);
-double MelderString_allocationSize (void);
-double MelderString_deallocationSize (void);
+	char32 *string;   // a growing buffer, rarely shrunk (can only be freed by MelderString32_free)
+} MelderString;
+
+void MelderString16_free (MelderString16 *me);   // frees the buffer (and sets other attributes to zero)
+void MelderString_free (MelderString *me);   // frees the buffer (and sets other attributes to zero)
+void MelderString16_empty (MelderString16 *me);   // sets to empty string (buffer shrunk if very large)
+void MelderString_empty (MelderString *me);   // sets to empty string (buffer shrunk if very large)
+void MelderString_expand (MelderString *me, int64 sizeNeeded);   // increases the buffer size; there's normally no need to call this
+void MelderString_copy (MelderString *me, Melder_1_ARG);
+void MelderString_copy (MelderString *me, Melder_2_ARGS);
+void MelderString_copy (MelderString *me, Melder_3_ARGS);
+void MelderString_copy (MelderString *me, Melder_4_ARGS);
+void MelderString_copy (MelderString *me, Melder_5_ARGS);
+void MelderString_copy (MelderString *me, Melder_6_ARGS);
+void MelderString_copy (MelderString *me, Melder_7_ARGS);
+void MelderString_copy (MelderString *me, Melder_8_ARGS);
+void MelderString_copy (MelderString *me, Melder_9_ARGS);
+void MelderString_copy (MelderString *me, Melder_10_ARGS);
+void MelderString_copy (MelderString *me, Melder_11_ARGS);
+void MelderString_copy (MelderString *me, Melder_12_OR_13_ARGS);
+void MelderString_copy (MelderString *me, Melder_14_OR_15_ARGS);
+void MelderString_copy (MelderString *me, Melder_16_TO_19_ARGS);
+void MelderString_ncopy (MelderString *me, const char32 *source, int64 n);
+
+inline static void MelderString_append (MelderString *me, Melder_1_ARG) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	int64 sizeNeeded = me -> length + length1 + 1;
+	if (sizeNeeded > me -> bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (me -> string + me -> length, s1);   me -> length += length1;
+}
+/*void MelderString_append (MelderString *me, Melder_1_ARG);*/
+void MelderString_append (MelderString *me, Melder_2_ARGS);
+void MelderString_append (MelderString *me, Melder_3_ARGS);
+void MelderString_append (MelderString *me, Melder_4_ARGS);
+void MelderString_append (MelderString *me, Melder_5_ARGS);
+void MelderString_append (MelderString *me, Melder_6_ARGS);
+void MelderString_append (MelderString *me, Melder_7_ARGS);
+void MelderString_append (MelderString *me, Melder_8_ARGS);
+void MelderString_append (MelderString *me, Melder_9_ARGS);
+void MelderString_append (MelderString *me, Melder_10_ARGS);
+void MelderString_append (MelderString *me, Melder_11_ARGS);
+void MelderString_append (MelderString *me, Melder_12_OR_13_ARGS);
+void MelderString_append (MelderString *me, Melder_14_OR_15_ARGS);
+void MelderString_append (MelderString *me, Melder_16_TO_19_ARGS);
+void MelderString16_appendCharacter (MelderString16 *me, char32 character);
+void MelderString_appendCharacter (MelderString *me, char32 character);
+void MelderString_get (MelderString *me, char32 *destination);   // performs no boundary checking
+int64 MelderString_allocationCount ();
+int64 MelderString_deallocationCount ();
+int64 MelderString_allocationSize ();
+int64 MelderString_deallocationSize ();
 
 struct structMelderReadText {
-	wchar_t *stringW, *readPointerW;
+	char32 *string32, *readPointer32;
 	char *string8, *readPointer8;
 	unsigned long input8Encoding;
 };
 typedef struct structMelderReadText *MelderReadText;
 
 MelderReadText MelderReadText_createFromFile (MelderFile file);
-MelderReadText MelderReadText_createFromString (const wchar_t *string);
-wchar_t MelderReadText_getChar (MelderReadText text);
-wchar_t * MelderReadText_readLine (MelderReadText text);
-int64_t MelderReadText_getNumberOfLines (MelderReadText me);
-const wchar_t * MelderReadText_getLineNumber (MelderReadText text);
+MelderReadText MelderReadText_createFromString (const char32 *string);
+char32 MelderReadText_getChar (MelderReadText text);
+char32 * MelderReadText_readLine (MelderReadText text);
+wchar_t * MelderReadText_readLineW (MelderReadText text);
+int64 MelderReadText_getNumberOfLines (MelderReadText me);
+const char32 * MelderReadText_getLineNumber (MelderReadText text);
 void MelderReadText_delete (MelderReadText text);
 
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2);
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5);
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
+const char32 * Melder_cat (Melder_2_ARGS);
+const char32 * Melder_cat (Melder_3_ARGS);
+const char32 * Melder_cat (Melder_4_ARGS);
+const char32 * Melder_cat (Melder_5_ARGS);
+const char32 * Melder_cat (Melder_6_ARGS);
+const char32 * Melder_cat (Melder_7_ARGS);
+const char32 * Melder_cat (Melder_8_ARGS);
+const char32 * Melder_cat (Melder_9_ARGS);
+const char32 * Melder_cat (Melder_10_ARGS);
+const char32 * Melder_cat (Melder_11_ARGS);
+const char32 * Melder_cat (Melder_12_OR_13_ARGS);
+const char32 * Melder_cat (Melder_14_OR_15_ARGS);
+const char32 * Melder_cat (Melder_16_TO_19_ARGS);
+
+char32 * Melder_dup (const char32 *string /* cattable */);
+char32 * Melder_dup_f (const char32 *string /* cattable */);
+
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_1_ARG);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_2_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_3_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_4_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_5_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_6_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_7_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_8_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_9_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_10_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_11_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_12_OR_13_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_14_OR_15_ARGS);
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_16_TO_19_ARGS);
 
 /********** NUMBER AND STRING COMPARISON **********/
 
-int Melder_numberMatchesCriterion (double value, int which_kMelder_number, double criterion);
-int Melder_stringMatchesCriterion (const wchar_t *value, int which_kMelder_string, const wchar_t *criterion);
+bool Melder_numberMatchesCriterion (double value, int which_kMelder_number, double criterion);
+bool Melder_stringMatchesCriterion (const char32 *value, int which_kMelder_string, const char32 *criterion);
 
 /********** STRING PARSING **********/
 
@@ -537,97 +811,111 @@ int Melder_stringMatchesCriterion (const wchar_t *value, int which_kMelder_strin
 	separated (and perhaps preceded and followed) by white space.
 	The tokens cannot contain spaces themselves (there are no escapes).
 	Typical use:
-		for (token = Melder_firstToken (string); token != NULL; token = Melder_nextToken ()) {
+		for (token = Melder_firstToken (string); token != nullptr; token = Melder_nextToken ()) {
 			... do something with the token ...
 		}
 */
 
-long Melder_countTokens (const wchar_t *string);
-wchar_t *Melder_firstToken (const wchar_t *string);
-wchar_t *Melder_nextToken (void);
-wchar_t ** Melder_getTokens (const wchar_t *string, long *n);
-void Melder_freeTokens (wchar_t ***tokens);
-long Melder_searchToken (const wchar_t *string, wchar_t **tokens, long n);
+long Melder_countTokens (const char32 *string);
+char32 *Melder_firstToken (const char32 *string);
+char32 *Melder_nextToken ();
+char32 ** Melder_getTokens (const char32 *string, long *n);
+void Melder_freeTokens (char32 ***tokens);
+long Melder_searchToken (const char32 *string, char32 **tokens, long n);
 
 /********** MESSAGING ROUTINES **********/
 
-/* These functions are called like printf ().
-	Default Melder does fprintf to stderr,
-	except Melder_information, which does fprintf to stdout.
-	These functions show generic, native, and mixed strings correctly,
-	and perform quote conversion, if that flag is not off; see under "NON-ASCII CHARACTERS".
-	The alphabet is Roman, so that symbols from the Symbol and Phonetic alphabets
-	are not translated (by default, \mu is shown as \mu and \as as a).
-*/
-
-void Melder_casual (const char *format, ...);
-void Melder_casual1 (const wchar_t *s1);
-void Melder_casual2 (const wchar_t *s1, const wchar_t *s2);
-void Melder_casual3 (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-void Melder_casual4 (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-void Melder_casual5 (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5);
-void Melder_casual6 (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void Melder_casual7 (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-void Melder_casual8 (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-void Melder_casual9 (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
-/*
+/**
 	Function:
 		Sends a message without user interference.
 	Behaviour:
 		Writes to stderr on Unix, otherwise to a special window.
 */
+void Melder_casual (Melder_1_ARG);
+void Melder_casual (Melder_2_ARGS);
+void Melder_casual (Melder_3_ARGS);
+void Melder_casual (Melder_4_ARGS);
+void Melder_casual (Melder_5_ARGS);
+void Melder_casual (Melder_6_ARGS);
+void Melder_casual (Melder_7_ARGS);
+void Melder_casual (Melder_8_ARGS);
+void Melder_casual (Melder_9_ARGS);
+void Melder_casual (Melder_10_ARGS);
+void Melder_casual (Melder_11_ARGS);
+void Melder_casual (Melder_12_OR_13_ARGS);
+void Melder_casual (Melder_14_OR_15_ARGS);
+void Melder_casual (Melder_16_TO_19_ARGS);
 
-/* Give information to stdout (batch), or to an "Info" window (interactive), or to a diverted string. */
-
-void MelderInfo_open (void);   /* Clear the Info window in the background. */
-void MelderInfo_write (const wchar_t *s1);   /* Write a string to the Info window in the background. */
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2);   /* Write two strings to the Info window in the background. */
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5);
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
-void MelderInfo_writeLine (const wchar_t *s1);   /* Write a string to the Info window in the background; add a new-line. */
-void MelderInfo_writeLine (const wchar_t *s1, const wchar_t *s2);
-void MelderInfo_writeLine (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-void MelderInfo_writeLine  (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-void MelderInfo_writeLine  (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5);
-void MelderInfo_writeLine  (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void MelderInfo_writeLine  (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-void MelderInfo_writeLine  (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-void MelderInfo_writeLine  (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
-void MelderInfo_close (void);   // drain the background info to the Info window, making sure there is a line break
-void MelderInfo_drain (void);   // drain the background info to the Info window, without adding any extra line break
-
-void Melder_information (const wchar_t *s1);
-void Melder_information (const wchar_t *s1, const wchar_t *s2);
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5);
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
-
-void Melder_informationReal (double value, const wchar_t *units);   /* %.17g or --undefined--; units may be NULL */
-
-void Melder_divertInfo (MelderString *buffer);   /* NULL = back to normal. */
+/**
+	Give information to stdout (batch), or to an "Info" window (interactive), or to a diverted string.
+*/
+void MelderInfo_open ();   // clear the Info window in the background
+
+void MelderInfo_write (Melder_1_ARG);
+void MelderInfo_write (Melder_2_ARGS);
+void MelderInfo_write (Melder_3_ARGS);
+void MelderInfo_write (Melder_4_ARGS);
+void MelderInfo_write (Melder_5_ARGS);
+void MelderInfo_write (Melder_6_ARGS);
+void MelderInfo_write (Melder_7_ARGS);
+void MelderInfo_write (Melder_8_ARGS);
+void MelderInfo_write (Melder_9_ARGS);
+void MelderInfo_write (Melder_10_ARGS);
+void MelderInfo_write (Melder_11_ARGS);
+void MelderInfo_write (Melder_12_OR_13_ARGS);
+void MelderInfo_write (Melder_14_OR_15_ARGS);
+void MelderInfo_write (Melder_16_TO_19_ARGS);
+
+void MelderInfo_writeLine (Melder_1_ARG);
+void MelderInfo_writeLine (Melder_2_ARGS);
+void MelderInfo_writeLine (Melder_3_ARGS);
+void MelderInfo_writeLine (Melder_4_ARGS);
+void MelderInfo_writeLine (Melder_5_ARGS);
+void MelderInfo_writeLine (Melder_6_ARGS);
+void MelderInfo_writeLine (Melder_7_ARGS);
+void MelderInfo_writeLine (Melder_8_ARGS);
+void MelderInfo_writeLine (Melder_9_ARGS);
+void MelderInfo_writeLine (Melder_10_ARGS);
+void MelderInfo_writeLine (Melder_11_ARGS);
+void MelderInfo_writeLine (Melder_12_OR_13_ARGS);
+void MelderInfo_writeLine (Melder_14_OR_15_ARGS);
+void MelderInfo_writeLine (Melder_16_TO_19_ARGS);
+
+void MelderInfo_close ();   // drain the background info to the Info window, making sure there is a line break
+void MelderInfo_drain ();   // drain the background info to the Info window, without adding any extra line break
+
+void Melder_information (Melder_1_ARG);
+void Melder_information (Melder_2_ARGS);
+void Melder_information (Melder_3_ARGS);
+void Melder_information (Melder_4_ARGS);
+void Melder_information (Melder_5_ARGS);
+void Melder_information (Melder_6_ARGS);
+void Melder_information (Melder_7_ARGS);
+void Melder_information (Melder_8_ARGS);
+void Melder_information (Melder_9_ARGS);
+void Melder_information (Melder_10_ARGS);
+void Melder_information (Melder_11_ARGS);
+void Melder_information (Melder_12_OR_13_ARGS);
+void Melder_information (Melder_14_OR_15_ARGS);
+void Melder_information (Melder_16_TO_19_ARGS);
+
+void Melder_informationReal (double value, const char32 *units);   // %.17g or --undefined--; units may be null
+
+void Melder_divertInfo (MelderString *buffer);   // nullptr = back to normal
 
 class autoMelderDivertInfo {
 	public:
 		autoMelderDivertInfo (MelderString *buffer) { Melder_divertInfo (buffer); }
-		~autoMelderDivertInfo () { Melder_divertInfo (NULL); }
+		~autoMelderDivertInfo () { Melder_divertInfo (nullptr); }
 };
 
-void Melder_clearInfo (void);   /* Clear the Info window. */
-const wchar_t * Melder_getInfo (void);
-void Melder_help (const wchar_t *query);
+void Melder_clearInfo ();   // clear the Info window
+const char32 * Melder_getInfo ();
+void Melder_help (const char32 *query);
 
-void Melder_search (void);
+void Melder_search ();
 	
-void Melder_beep (void);
+void Melder_beep ();
 
 extern int Melder_debug;
 
@@ -638,140 +926,71 @@ extern int Melder_debug;
 
 class MelderError { };
 
-typedef class structThing *Thing;
-wchar_t *Thing_messageName (Thing me);
-struct MelderArg {
-	int type;
-	union {
-		const wchar_t *argW;
-		const  char   *arg8;
-	};
-	MelderArg (const wchar_t *      arg) : type (1), argW (arg) { }
-	MelderArg (const  char   *      arg) : type (2), arg8 (arg) { }
-	MelderArg (const double         arg) : type (1), argW (Melder_double          (arg)) { }
-	MelderArg (const          long long  arg) : type (1), argW (Melder_integer         (arg)) { }
-	MelderArg (const unsigned long long  arg) : type (1), argW (Melder_integer         ((int64_t) arg)) { }
-	MelderArg (const          long  arg) : type (1), argW (Melder_integer         (arg)) { }
-	MelderArg (const unsigned long  arg) : type (1), argW (Melder_integer         ((int64_t) arg)) { }   // ignore ULL above 2^63
-	MelderArg (const          int   arg) : type (1), argW (Melder_integer         (arg)) { }
-	MelderArg (const unsigned int   arg) : type (1), argW (Melder_integer         (arg)) { }
-	MelderArg (const          short arg) : type (1), argW (Melder_integer         (arg)) { }
-	MelderArg (const unsigned short arg) : type (1), argW (Melder_integer         (arg)) { }
-	MelderArg (Thing                arg) : type (1), argW (Thing_messageName      (arg)) { }
-	MelderArg (MelderFile           arg) : type (1), argW (MelderFile_messageName (arg)) { }
-};
-void Melder_throw (const MelderArg& arg1);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11);
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12, const MelderArg& arg13 = L"");
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9, const MelderArg& arg10,
-	const MelderArg& arg11, const MelderArg& arg12, const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15 = L"");
-void Melder_throw (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12,
-	const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15, const MelderArg& arg16,
-	const MelderArg& arg17 = L"", const MelderArg& arg18 = L"", const MelderArg& arg19 = L"", const MelderArg& arg20 = L"");
-void Melder_error_noLine (const MelderArg& arg1);
-void Melder_error_ (const MelderArg& arg1);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11);
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12, const MelderArg& arg13 = L"");
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9, const MelderArg& arg10,
-	const MelderArg& arg11, const MelderArg& arg12, const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15 = L"");
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12,
-	const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15, const MelderArg& arg16,
-	const MelderArg& arg17 = L"", const MelderArg& arg18 = L"", const MelderArg& arg19 = L"", const MelderArg& arg20 = L"");
-#define Melder_throw(...)  do { Melder_error_ (__VA_ARGS__); throw MelderError (); } while (false)
-
-void Melder_flushError (const char *format, ...);
+void Melder_appendError_noLine (const MelderArg& arg1);
+
+void Melder_appendError (Melder_1_ARG);
+void Melder_appendError (Melder_2_ARGS);
+void Melder_appendError (Melder_3_ARGS);
+void Melder_appendError (Melder_4_ARGS);
+void Melder_appendError (Melder_5_ARGS);
+void Melder_appendError (Melder_6_ARGS);
+void Melder_appendError (Melder_7_ARGS);
+void Melder_appendError (Melder_8_ARGS);
+void Melder_appendError (Melder_9_ARGS);
+void Melder_appendError (Melder_10_ARGS);
+void Melder_appendError (Melder_11_ARGS);
+void Melder_appendError (Melder_12_OR_13_ARGS);
+void Melder_appendError (Melder_14_OR_15_ARGS);
+void Melder_appendError (Melder_16_TO_19_ARGS);
+#define Melder_throw(...)  do { Melder_appendError (__VA_ARGS__); throw MelderError (); } while (false)
+
+void Melder_flushError ();
+void Melder_flushError (Melder_1_ARG);
+void Melder_flushError (Melder_2_ARGS);
+void Melder_flushError (Melder_3_ARGS);
+void Melder_flushError (Melder_4_ARGS);
+void Melder_flushError (Melder_5_ARGS);
+void Melder_flushError (Melder_6_ARGS);
+void Melder_flushError (Melder_7_ARGS);
+void Melder_flushError (Melder_8_ARGS);
+void Melder_flushError (Melder_9_ARGS);
+void Melder_flushError (Melder_10_ARGS);
+void Melder_flushError (Melder_11_ARGS);
+void Melder_flushError (Melder_12_OR_13_ARGS);
+void Melder_flushError (Melder_14_OR_15_ARGS);
+void Melder_flushError (Melder_16_TO_19_ARGS);
 	/* Send all deferred error messages to stderr (batch) or to an "Error" dialog, */
-	/* including, if 'format' is not NULL, the error message generated by this routine. */
+	/* including, if there are arguments, the error message generated by this routine. */
 
 bool Melder_hasError ();
-bool Melder_hasError (const wchar_t *partialError);
+bool Melder_hasError (const char32 *partialError);
 	/* Returns 1 if there is an error message in store, otherwise 0. */
 
-void Melder_clearError (void);
+void Melder_clearError ();
 	/* Cancel all stored error messages. */
 
-wchar_t * Melder_getError (void);
-	/* Returns the error string. Mainly used with wcsstr. */
-
-/********** WARNING: ive warning to stderr (batch) or to a "Warning" dialog **********/
-
-void Melder_warning (const MelderArg& arg1);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11);
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12, const MelderArg& arg13 = L"");
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5,
-	const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9, const MelderArg& arg10,
-	const MelderArg& arg11, const MelderArg& arg12, const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15 = L"");
-void Melder_warning (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12,
-	const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15, const MelderArg& arg16,
-	const MelderArg& arg17 = L"", const MelderArg& arg18 = L"", const MelderArg& arg19 = L"", const MelderArg& arg20 = L"");
-
-void Melder_warningOff (void);
-void Melder_warningOn (void);
+char32 * Melder_getError ();
+	/* Returns the error string. Mainly used with str32str. */
+
+/********** WARNING: give warning to stderr (batch) or to a "Warning" dialog **********/
+
+void Melder_warning (Melder_1_ARG);
+void Melder_warning (Melder_2_ARGS);
+void Melder_warning (Melder_3_ARGS);
+void Melder_warning (Melder_4_ARGS);
+void Melder_warning (Melder_5_ARGS);
+void Melder_warning (Melder_6_ARGS);
+void Melder_warning (Melder_7_ARGS);
+void Melder_warning (Melder_8_ARGS);
+void Melder_warning (Melder_9_ARGS);
+void Melder_warning (Melder_10_ARGS);
+void Melder_warning (Melder_11_ARGS);
+void Melder_warning (Melder_12_OR_13_ARGS);
+void Melder_warning (Melder_14_OR_15_ARGS);
+void Melder_warning (Melder_16_TO_19_ARGS);
+
+void Melder_warningOff ();
+void Melder_warningOn ();
 
 class autoMelderWarningOff {
 public:
@@ -779,24 +998,52 @@ public:
 	~autoMelderWarningOff () { Melder_warningOn (); }
 };
 
+/********** FATAL: Praat crashes because of a programming error **********/
+
+/**
+	Give error message, abort program.
+	Should only be caused by programming errors.
+*/
+int Melder_fatal (Melder_1_ARG);
+int Melder_fatal (Melder_2_ARGS);
+int Melder_fatal (Melder_3_ARGS);
+int Melder_fatal (Melder_4_ARGS);
+int Melder_fatal (Melder_5_ARGS);
+int Melder_fatal (Melder_6_ARGS);
+int Melder_fatal (Melder_7_ARGS);
+int Melder_fatal (Melder_8_ARGS);
+int Melder_fatal (Melder_9_ARGS);
+int Melder_fatal (Melder_10_ARGS);
+int Melder_fatal (Melder_11_ARGS);
+int Melder_fatal (Melder_12_OR_13_ARGS);
+int Melder_fatal (Melder_14_OR_15_ARGS);
+int Melder_fatal (Melder_16_TO_19_ARGS);
+
 /********** PROGRESS ROUTINES **********/
 
-void Melder_progress (double progress, const wchar_t *s1);
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2);
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5);
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-void Melder_progress (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
-void Melder_progressOff (void);
-void Melder_progressOn (void);
+void Melder_progress (double progress);
+void Melder_progress (double progress, Melder_1_ARG);
+void Melder_progress (double progress, Melder_2_ARGS);
+void Melder_progress (double progress, Melder_3_ARGS);
+void Melder_progress (double progress, Melder_4_ARGS);
+void Melder_progress (double progress, Melder_5_ARGS);
+void Melder_progress (double progress, Melder_6_ARGS);
+void Melder_progress (double progress, Melder_7_ARGS);
+void Melder_progress (double progress, Melder_8_ARGS);
+void Melder_progress (double progress, Melder_9_ARGS);
+void Melder_progress (double progress, Melder_10_ARGS);
+void Melder_progress (double progress, Melder_11_ARGS);
+void Melder_progress (double progress, Melder_12_OR_13_ARGS);
+void Melder_progress (double progress, Melder_14_OR_15_ARGS);
+void Melder_progress (double progress, Melder_16_TO_19_ARGS);
+
+void Melder_progressOff ();
+void Melder_progressOn ();
 /*
 	Function:
 		Show the progress of a time-consuming process.
 	Arguments:
-		Any of 's1' through 's9' may be NULL.
+		Any of 'arg1' through 'arg19' may be null.
 	Batch behaviour:
 		Does nothing, always returns 1.
 	Interactive behaviour:
@@ -807,58 +1054,64 @@ void Melder_progressOn (void);
 		- if 'progress' >= 1, hide the window.
 	Usage:
 		- call with 'progress' = 0.0 before the process starts:
-		      (void) Melder_progress (0.0, "Starting work...");
+		      (void) Melder_progress (0.0, U"Starting work...");
 		- at every turn in your loop, call with 'progress' between 0 and 1:
-		      Melder_progress (i / (n + 1.0), L"Working on part ", i, L" out of ", n, L"...");
+		      Melder_progress (i / (n + 1.0), U"Working on part ", i, U" out of ", n, U"...");
 		  an exception is thrown if the user clicks Cancel; if you don't want that, catch it:
 		      try {
-		          Melder_progress (i / (n + 1.0), L"Working on part ", i, L" out of ", n, L"...");
+		          Melder_progress (i / (n + 1.0), U"Working on part ", i, U" out of ", n, U"...");
 		      } catch (MelderError) {
 		          Melder_clearError ();
 		          break;
 		      }
 		- after the process has finished, call with 'progress' = 1.0:
-		      (void) Melder_progress (1.0, NULL);
+		      (void) Melder_progress (1.0);
 		- the first and third steps can be automated by autoMelderProgress:
-		      autoMelderProgress progress ("Starting work...");
+		      autoMelderProgress progress (U"Starting work...");
 */
 class autoMelderProgress {
 public:
-	autoMelderProgress (const wchar_t *message) {
+	autoMelderProgress (const char32 *message) {
 		Melder_progress (0.0, message);
 	}
 	~autoMelderProgress () {
-		Melder_progress (1.0, NULL);
+		Melder_progress (1.0);
 	}
 };
 
-void * Melder_monitor (double progress, const wchar_t *s1);
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2);
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5);
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
+void * Melder_monitor (double progress);
+void * Melder_monitor (double progress, Melder_1_ARG);
+void * Melder_monitor (double progress, Melder_2_ARGS);
+void * Melder_monitor (double progress, Melder_3_ARGS);
+void * Melder_monitor (double progress, Melder_4_ARGS);
+void * Melder_monitor (double progress, Melder_5_ARGS);
+void * Melder_monitor (double progress, Melder_6_ARGS);
+void * Melder_monitor (double progress, Melder_7_ARGS);
+void * Melder_monitor (double progress, Melder_8_ARGS);
+void * Melder_monitor (double progress, Melder_9_ARGS);
+void * Melder_monitor (double progress, Melder_10_ARGS);
+void * Melder_monitor (double progress, Melder_11_ARGS);
+void * Melder_monitor (double progress, Melder_12_OR_13_ARGS);
+void * Melder_monitor (double progress, Melder_14_OR_15_ARGS);
+void * Melder_monitor (double progress, Melder_16_TO_19_ARGS);
 /*
 	Function:
 		Show the progress of a time-consuming process.
 	Arguments:
-		Any of 's1' through 's9' may be NULL.
+		Any of 'arg1' through 'arg19' may be null.
 	Batch behaviour:
-		Does nothing, returns NULL if 'progress' <= 0.0 and a non-NULL pointer otherwise.
+		Does nothing, returns nullptr if 'progress' <= 0.0 and a non-nullptr pointer otherwise.
 	Interactive behaviour:
 		Shows the progress of a time-consuming process:
 		- if 'progress' <= 0.0, show a window with text and a Cancel button and
 		  room for a square drawing, and return a Graphics;
 		- if 0.0 < 'progress' < 1.0, show text and a partially filled progress bar,
-		  and return NULL if user interrupts, else return a non-NULL pointer;
+		  and return nullptr if user interrupts, else return a non-null pointer;
 		- if 'progress' >= 1, hide the window.
 	Usage:
 		- call with 'progress' = 0.0 before the process starts.
 		- assign the return value to a Graphics:
-		      Graphics graphics = Melder_monitor (0.0, L"Starting work...");
+		      Graphics graphics = Melder_monitor (0.0, U"Starting work...");
 		- at every turn of your loop, draw something in the Graphics:
 		      if (graphics) {   // always check; might be batch
 		          Graphics_clearWs (graphics);   // only if you redraw all every time
@@ -866,16 +1119,16 @@ void * Melder_monitor (double progress, const wchar_t *s1, const wchar_t *s2, co
 		          Graphics_text (graphics, ...);
 		      }
 		- immediately after this in your loop, call with 'progress' between 0 and 1:
-		      Melder_monitor (i / (n + 1.0), L"Working on part ", Melder_integer (i), L" out of ", Melder_integer (n), L"...");
+		      Melder_monitor (i / (n + 1.0), U"Working on part ", i, U" out of ", n, U"...");
 		  an exception is thrown if the user clicks Cancel; if you don't want that, catch it:
 		      try {
-		          Melder_monitor (i / (n + 1.0), L"Working on part ", Melder_integer (i), L" out of ", Melder_integer (n), L"...");
+		          Melder_monitor (i / (n + 1.0), U"Working on part ", i, U" out of ", n, U"...");
 		      } catch (MelderError) {
 		          Melder_clearError ();
 		          break;
 		      }
 		- after the process has finished, call with 'progress' = 1.0:
-		      (void) Melder_monitor (1.0, NULL);
+		      (void) Melder_monitor (1.0, nullptr);
 		- the first and third steps can be automated by autoMelderMonitor:
 		      autoMelderMonitor monitor ("Starting work...");
 		      if (monitor.graphics()) {   // always check; might be batch
@@ -888,11 +1141,11 @@ typedef class structGraphics *Graphics;
 class autoMelderMonitor {
 	Graphics d_graphics;
 public:
-	autoMelderMonitor (const wchar_t *message) {
+	autoMelderMonitor (const char32 *message) {
 		d_graphics = (Graphics) Melder_monitor (0.0, message);
 	}
 	~autoMelderMonitor () {
-		Melder_monitor (1.0, NULL);
+		Melder_monitor (1.0);
 	}
 	Graphics graphics () { return d_graphics; }
 };
@@ -902,35 +1155,18 @@ public:
 int Melder_publish (void *anything);
 
 int Melder_record (double duration);
-int Melder_recordFromFile (MelderFile fs);
-void Melder_play (void);
-void Melder_playReverse (void);
-int Melder_publishPlayed (void);
+int Melder_recordFromFile (MelderFile file);
+void Melder_play ();
+void Melder_playReverse ();
+int Melder_publishPlayed ();
 
 /********** SYSTEM VERSION **********/
 
-extern unsigned long Melder_systemVersion;
+extern int32 Melder_systemVersion;
 /*
 	For Macintosh, this is set in praat_init.
 */
 
-/********** SCRATCH TEXT BUFFERS **********/
-
-extern char Melder_buffer1 [30001], Melder_buffer2 [30001];
-/*
-	Every Melder routine uses both of these buffers:
-	one for sprintfing the message,
-	and one for translating this message to a native string.
-	You can use these buffers,
-	but be careful not to call any other routines that use them at the same time;
-	the following routines are guaranteed not to call the Melder library:
-	 - Mac Toolbox, XWindows, X Toolkit, Motif, and XVT routines,
-		except those who dispatch events (XtDispatchEvent, xvt_process_pending_events).
-	 - Longchar_*
-	This means that you can use these buffers for reading and writing with
-	the Longchar library.
-*/
-
 /********** ENFORCE INTERACTIVE BEHAVIOUR **********/
 
 /* Procedures to enforce interactive behaviour of the Melder_XXXXXX routines. */
@@ -941,7 +1177,7 @@ void MelderGui_create (/* GuiWindow */ void *parent);
 */
 
 extern bool Melder_batch;   // true if run from the batch or from an interactive command-line interface
-extern bool Melder_backgrounding;   /* True if running a script. */
+extern bool Melder_backgrounding;   // true if running a script
 extern bool Melder_consoleIsAnsi;
 extern bool Melder_asynchronous;   // true if specified by the "asynchronous" directive in a script
 #ifndef CONTROL_APPLICATION
@@ -955,72 +1191,58 @@ extern bool Melder_asynchronous;   // true if specified by the "asynchronous" di
 /* They may chage the string arguments. */
 /* Many of these routines are called by MelderMotif_create and MelderXvt_create. */
 
-void Melder_setCasualProc (void (*casualProc) (const wchar_t *message));
-void Melder_setProgressProc (int (*progressProc) (double progress, const wchar_t *message));
-void Melder_setMonitorProc (void * (*monitorProc) (double progress, const wchar_t *message));
-void Melder_setInformationProc (void (*informationProc) (const wchar_t *message));
-void Melder_setHelpProc (void (*help) (const wchar_t *query));
-void Melder_setSearchProc (void (*search) (void));
-void Melder_setWarningProc (void (*warningProc) (const wchar_t *message));
-void Melder_setErrorProc (void (*errorProc) (const wchar_t *message));
-void Melder_setFatalProc (void (*fatalProc) (const wchar_t *message));
+void Melder_setCasualProc (void (*casualProc) (const char32 *message));
+void Melder_setProgressProc (int (*progressProc) (double progress, const char32 *message));
+void Melder_setMonitorProc (void * (*monitorProc) (double progress, const char32 *message));
+void Melder_setInformationProc (void (*informationProc) (const char32 *message));
+void Melder_setHelpProc (void (*help) (const char32 *query));
+void Melder_setSearchProc (void (*search) ());
+void Melder_setWarningProc (void (*warningProc) (const char32 *message));
+void Melder_setErrorProc (void (*errorProc) (const char32 *message));
+void Melder_setFatalProc (void (*fatalProc) (const char32 *message));
 void Melder_setPublishProc (int (*publish) (void *));
 void Melder_setRecordProc (int (*record) (double));
 void Melder_setRecordFromFileProc (int (*recordFromFile) (MelderFile));
-void Melder_setPlayProc (void (*play) (void));
-void Melder_setPlayReverseProc (void (*playReverse) (void));
-void Melder_setPublishPlayedProc (int (*publishPlayed) (void));
-
-double Melder_stopwatch (void);
+void Melder_setPlayProc (void (*play) ());
+void Melder_setPlayReverseProc (void (*playReverse) ());
+void Melder_setPublishPlayedProc (int (*publishPlayed) ());
 
-long Melder_killReturns_inline (char *text);
-/*
-	 Replaces all bare returns (Mac) or return / linefeed sequences (Win) with bare linefeeds (generic = Unix).
-	 Returns new length of string (equal to or less than old length).
-*/
+double Melder_stopwatch ();
 
 /********** AUDIO **********/
 
-#if defined (macintosh) || defined (_WIN32) || defined (linux)
-	#define kMelderAudio_inputUsesPortAudio_DEFAULT  true
-		// Mac: in order to have CoreAudio
-		// Win: in order to allow recording for over 64 megabytes (paMME)
-		// Linux: in order to use ALSA and therefore be compatible with Ubuntu 10.10 and later
-#else
-	#define kMelderAudio_inputUsesPortAudio_DEFAULT  false
-#endif
-void MelderAudio_setInputUsesPortAudio (bool inputUsesPortAudio);
-bool MelderAudio_getInputUsesPortAudio (void);
-#if defined (macintosh) || defined (linux)
-	#define kMelderAudio_outputUsesPortAudio_DEFAULT  true
-		// Mac: in order to have CoreAudio
-		// Linux: in order to use ALSA and therefore be compatible with Ubuntu 10.10 and later
-#else
-	#define kMelderAudio_outputUsesPortAudio_DEFAULT  false
-		// Win: in order to reduce the long latencies of paMME and to avoid the incomplete implementation of paDirectSound
-#endif
-void MelderAudio_setOutputUsesPortAudio (bool outputUsesPortAudio);
-bool MelderAudio_getOutputUsesPortAudio (void);
-#if 1
+void MelderAudio_setInputSoundSystem (enum kMelder_inputSoundSystem inputSoundSystem);
+enum kMelder_inputSoundSystem MelderAudio_getInputSoundSystem ();
+
+void MelderAudio_setOutputSoundSystem (enum kMelder_outputSoundSystem outputSoundSystem);
+enum kMelder_outputSoundSystem MelderAudio_getOutputSoundSystem ();
+
+#if defined (_WIN32)
 	#define kMelderAudio_outputSilenceBefore_DEFAULT  0.0
-		// Mac: in order to switch off the BOING caused by the automatic gain control
-#endif
-void MelderAudio_setOutputSilenceBefore (double silenceBefore);
-double MelderAudio_getOutputSilenceBefore (void);
-#if defined (macintosh)
+	#define kMelderAudio_outputSilenceAfter_DEFAULT  0.1
+		// in order to get rid of the click on some cards
+#elif defined (macintosh)
+	#define kMelderAudio_outputSilenceBefore_DEFAULT  0.0
+		// in order to switch off the BOING caused by the automatic gain control
 	#define kMelderAudio_outputSilenceAfter_DEFAULT  0.0
-		// Mac: in order to reduce the BOING caused by the automatic gain control when the user replays immediately after a sound has finished
+		// in order to reduce the BOING caused by the automatic gain control when the user replays immediately after a sound has finished
+#elif defined (linux)
+	#define kMelderAudio_outputSilenceBefore_DEFAULT  0.0
+	#define kMelderAudio_outputSilenceAfter_DEFAULT  0.1
+		// in order to get rid of double playing of a sounding buffer (?)
 #else
-	#define kMelderAudio_outputSilenceAfter_DEFAULT  0.5
-		// Win: in order to get rid of the click on some cards
-		// Linux: in order to get rid of double playing of a sounding buffer
+	#define kMelderAudio_outputSilenceBefore_DEFAULT  0.0
+	#define kMelderAudio_outputSilenceAfter_DEFAULT  0.0
 #endif
+void MelderAudio_setOutputSilenceBefore (double silenceBefore);
+double MelderAudio_getOutputSilenceBefore ();
 void MelderAudio_setOutputSilenceAfter (double silenceAfter);
-double MelderAudio_getOutputSilenceAfter (void);
+double MelderAudio_getOutputSilenceAfter ();
+
 void MelderAudio_setUseInternalSpeaker (bool useInternalSpeaker);   // for HP-UX and Sun
-bool MelderAudio_getUseInternalSpeaker (void);
+bool MelderAudio_getUseInternalSpeaker ();
 void MelderAudio_setOutputMaximumAsynchronicity (enum kMelder_asynchronicityLevel maximumAsynchronicity);
-enum kMelder_asynchronicityLevel MelderAudio_getOutputMaximumAsynchronicity (void);
+enum kMelder_asynchronicityLevel MelderAudio_getOutputMaximumAsynchronicity ();
 long MelderAudio_getOutputBestSampleRate (long fsamp);
 
 extern bool MelderAudio_isPlaying;
@@ -1030,10 +1252,10 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 bool MelderAudio_stopPlaying (bool isExplicit);   // returns true if sound was playing
 #define MelderAudio_IMPLICIT  false
 #define MelderAudio_EXPLICIT  true
-long MelderAudio_getSamplesPlayed (void);
-bool MelderAudio_stopWasExplicit (void);
+long MelderAudio_getSamplesPlayed ();
+bool MelderAudio_stopWasExplicit ();
 
-void Melder_audio_prefs (void);   // in init file
+void Melder_audio_prefs ();   // in init file
 
 /********** AUDIO FILES **********/
 
@@ -1046,7 +1268,7 @@ void Melder_audio_prefs (void);   // in init file
 #define Melder_FLAC 6
 #define Melder_MP3 7
 #define Melder_NUMBER_OF_AUDIO_FILE_TYPES  7
-const wchar_t * Melder_audioFileTypeString (int audioFileType);   /* "AIFF", "AIFC", "WAV", "NeXT/Sun", "NIST", "FLAC", "MP3" */
+const char32 * Melder_audioFileTypeString (int audioFileType);   // "AIFF", "AIFC", "WAV", "NeXT/Sun", "NIST", "FLAC", "MP3"
 /* Audio encodings. */
 #define Melder_LINEAR_8_SIGNED  1
 #define Melder_LINEAR_8_UNSIGNED  2
@@ -1098,16 +1320,16 @@ void MelderFile_writeShortToAudio (MelderFile file, int numberOfChannels, int en
 #define MelderQuantity_FREQUENCY_BARK  3
 #define MelderQuantity_DISTANCE_FROM_GLOTTIS_METRES  4
 #define MelderQuantity_NUMBER_OF_QUANTITIES  4
-const wchar_t * MelderQuantity_getText (int quantity);   // e.g. "Time"
-const wchar_t * MelderQuantity_getWithUnitText (int quantity);   // e.g. "Time (s)"
-const wchar_t * MelderQuantity_getLongUnitText (int quantity);   // e.g. "seconds"
-const wchar_t * MelderQuantity_getShortUnitText (int quantity);   // e.g. "s"
+const char32 * MelderQuantity_getText (int quantity);   // e.g. "Time"
+const char32 * MelderQuantity_getWithUnitText (int quantity);   // e.g. "Time (s)"
+const char32 * MelderQuantity_getLongUnitText (int quantity);   // e.g. "seconds"
+const char32 * MelderQuantity_getShortUnitText (int quantity);   // e.g. "s"
 
 /********** MISCELLANEOUS **********/
 
-wchar_t * Melder_getenv (const wchar_t *variableName);
-void Melder_system (const wchar_t *command);   // spawn a system command
-double Melder_clock (void);   // seconds since 1969
+char32 * Melder_getenv (const char32 *variableName);
+void Melder_system (const char32 *command);   // spawn a system command
+double Melder_clock ();   // seconds since 1969
 
 struct autoMelderProgressOff {
 	autoMelderProgressOff () { Melder_progressOff (); }
@@ -1115,15 +1337,8 @@ struct autoMelderProgressOff {
 };
 
 struct autoMelderString : MelderString {
-	autoMelderString () { length = 0; bufferSize = 0; string = NULL; }
-	~autoMelderString () { Melder_free (string); }
-	wchar_t * transfer () {
-		wchar_t *tmp = string;
-		string = NULL;
-		length = 0;
-		bufferSize = 0;
-		return tmp;
-	}
+	autoMelderString () { length = 0; bufferSize = 0; string = nullptr; }
+	~autoMelderString () { MelderString_free (this); }
 };
 
 struct autoMelderReadText {
@@ -1141,7 +1356,7 @@ struct autoMelderReadText {
 	}
 	MelderReadText transfer () {
 		MelderReadText tmp = text;
-		text = NULL;
+		text = nullptr;
 		return tmp;
 	}
 };
@@ -1151,7 +1366,7 @@ class autofile {
 public:
 	autofile (FILE *f) : ptr (f) {
 	}
-	autofile () : ptr (NULL) {
+	autofile () : ptr (nullptr) {
 	}
 	~autofile () {
 		if (ptr) fclose (ptr);   // no error checking, because this is a destructor, only called after a throw, because otherwise you'd use f.close(file)
@@ -1166,7 +1381,7 @@ public:
 	void close (MelderFile file) {
 		if (ptr) {
 			FILE *tmp = ptr;
-			ptr = NULL;
+			ptr = nullptr;
 			Melder_fclose (file, tmp);
 		}
 	}
@@ -1183,13 +1398,13 @@ public:
 	void close () {
 		if (file && file -> filePointer) {
 			MelderFile tmp = file;
-			file = NULL;
+			file = nullptr;
 			MelderFile_close (tmp);
 		}
 	}
 	MelderFile transfer () {
 		MelderFile tmp = file;
-		file = NULL;
+		file = nullptr;
 		return tmp;
 	}
 };
@@ -1230,24 +1445,24 @@ public:
 };
 
 class autoMelderTokens {
-	wchar_t **tokens;
+	char32 **tokens;
 public:
 	autoMelderTokens () {
-		tokens = NULL;
+		tokens = nullptr;
 	}
-	autoMelderTokens (const wchar_t *string, long *n) {
+	autoMelderTokens (const char32 *string, long *n) {
 		tokens = Melder_getTokens (string, n);
 	}
 	~autoMelderTokens () {
 		if (tokens) Melder_freeTokens (& tokens);
 	}
-	wchar_t*& operator[] (long i) {
+	char32*& operator[] (long i) {
 		return tokens [i];
 	}
-	wchar_t ** peek () const {
+	char32 ** peek () const {
 		return tokens;
 	}
-	void reset (const wchar_t *string, long *n) {
+	void reset (const char32 *string, long *n) {
 		if (tokens) Melder_freeTokens (& tokens);
 		tokens = Melder_getTokens (string, n);
 	}
@@ -1258,22 +1473,22 @@ class _autostring {
 	T *ptr;
 public:
 	_autostring (T *string) : ptr (string) {
-		//if (Melder_debug == 39) Melder_casual ("autostring: constructor from C-string %ld", ptr);
+		//if (Melder_debug == 39) Melder_casual (U"autostring: constructor from C-string ", Melder_pointer (ptr));
 	}
-	_autostring () : ptr (0) {
-		//if (Melder_debug == 39) Melder_casual ("autostring: zero constructor");
+	_autostring () : ptr (nullptr) {
+		//if (Melder_debug == 39) Melder_casual (U"autostring: zero constructor");
 	}
 	~_autostring () {
-		//if (Melder_debug == 39) Melder_casual ("autostring: entering destructor ptr = %ld", ptr);
+		//if (Melder_debug == 39) Melder_casual (U"autostring: entering destructor ptr = ", Melder_pointer (ptr));
 		if (ptr) Melder_free (ptr);
-		//if (Melder_debug == 39) Melder_casual ("autostring: leaving destructor");
+		//if (Melder_debug == 39) Melder_casual (U"autostring: leaving destructor");
 	}
 	#if 0
 	void operator= (T *string) {
-		//if (Melder_debug == 39) Melder_casual ("autostring: entering assignment from C-string; old = %ld", ptr);
+		//if (Melder_debug == 39) Melder_casual (U"autostring: entering assignment from C-string; old = ", Melder_pointer (ptr));
 		if (ptr) Melder_free (ptr);
 		ptr = string;
-		//if (Melder_debug == 39) Melder_casual ("autostring: leaving assignment from C-string; new = %ld", ptr);
+		//if (Melder_debug == 39) Melder_casual (U"autostring: leaving assignment from C-string; new = ", Melder_pointer (ptr));
 	}
 	#endif
 	template <class U> T& operator[] (U i) {
@@ -1287,38 +1502,37 @@ public:
 	}
 	T * transfer () {
 		T *tmp = ptr;
-		ptr = NULL;
+		ptr = nullptr;
 		return tmp;
 	}
 	void reset (T *string) {
 		if (ptr) Melder_free (ptr);
 		ptr = string;
 	}
-	template <class U> void resize (U new_size) {
-		T *tmp = (T *) Melder_realloc (ptr, new_size * sizeof (T));
+	void resize (int64 new_size) {
+		T *tmp = (T *) Melder_realloc (ptr, new_size * (int64) sizeof (T));
 		ptr = tmp;
 	}
 private:
 	_autostring& operator= (const _autostring&);   // disable copy assignment
-	//_autostring (_autostring &);   // disable copy constructor (trying it this way also disables good things like autostring s1 = wcsdup("hello");)
+	//_autostring (_autostring &);   // disable copy constructor (trying it this way also disables good things like autostring s1 = str32dup(U"hello");)
 	template <class Y> _autostring (_autostring<Y> &);   // disable copy constructor
 };
 
-typedef _autostring <wchar_t> autostring;
 typedef _autostring <char> autostring8;
-typedef _autostring <char16_t> autostring16;
-typedef _autostring <char32_t> autostring32;
+typedef _autostring <char16> autostring16;
+typedef _autostring <char32> autostring32;
 
 class autoMelderAudioSaveMaximumAsynchronicity {
 	enum kMelder_asynchronicityLevel d_saveAsynchronicity;
 public:
 	autoMelderAudioSaveMaximumAsynchronicity () {
 		d_saveAsynchronicity = MelderAudio_getOutputMaximumAsynchronicity ();
-		trace ("value was %d", (int) d_saveAsynchronicity);
+		trace (U"value was ", d_saveAsynchronicity);
 	}
 	~autoMelderAudioSaveMaximumAsynchronicity () {
 		MelderAudio_setOutputMaximumAsynchronicity (d_saveAsynchronicity);
-		trace ("value set to %d", (int) d_saveAsynchronicity);
+		trace (U"value set to ", d_saveAsynchronicity);
 	}
 };
 
diff --git a/sys/melder_alloc.cpp b/sys/melder_alloc.cpp
index 9954943..bf0fed1 100644
--- a/sys/melder_alloc.cpp
+++ b/sys/melder_alloc.cpp
@@ -1,6 +1,6 @@
 /* melder_alloc.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,14 +27,14 @@
  * pb 2009/07/31 tracing by Melder_debug 34
  * pb 2010/12/28 split into _e and _f versions, and created a rainy-day fund
  * pb 2011/04/05 C++
- * pb 2014/12/17 made everything int64_t
+ * pb 2014/12/17 made everything int64
  */
 
 #include "melder.h"
 #include <wctype.h>
 #include <assert.h>
 
-static double totalNumberOfAllocations = 0, totalNumberOfDeallocations = 0, totalAllocationSize = 0,
+static int64 totalNumberOfAllocations = 0, totalNumberOfDeallocations = 0, totalAllocationSize = 0,
 	totalNumberOfMovingReallocs = 0, totalNumberOfReallocsInSitu = 0;
 
 /*
@@ -55,40 +55,40 @@ static double totalNumberOfAllocations = 0, totalNumberOfDeallocations = 0, tota
  */
 
 #define theRainyDayFund_SIZE  3000000
-static char *theRainyDayFund = NULL;
+static char *theRainyDayFund = nullptr;
 
-void Melder_alloc_init (void) {
+void Melder_alloc_init () {
 	theRainyDayFund = (char *) malloc (theRainyDayFund_SIZE);   // called at application initialization, so cannot fail
-	assert (theRainyDayFund != NULL);
+	assert (theRainyDayFund);
 }
 
-void * _Melder_malloc (int64_t size) {
+void * _Melder_malloc (int64 size) {
 	if (size <= 0)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (size), " bytes.");
-	if (sizeof (size_t) < 8 && (double) size > SIZE_MAX)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (size), " bytes. Use a 64-bit edition of Praat instead?");
-	void *result = malloc ((size_t) size);
-	if (result == NULL)
-		Melder_throw ("Out of memory: there is not enough room for another ", Melder_bigInteger (size), " bytes.");
-	if (Melder_debug == 34) { Melder_casual ("Melder_malloc\t%p\t%ls\t1", result, Melder_bigInteger (size)); }
+		Melder_throw (U"Can never allocate ", Melder_bigInteger (size), U" bytes.");
+	if (sizeof (size_t) < 8 && size > SIZE_MAX)
+		Melder_throw (U"Can never allocate ", Melder_bigInteger (size), U" bytes. Use a 64-bit edition of Praat instead?");
+	void *result = malloc ((size_t) size);   // guarded cast
+	if (! result)
+		Melder_throw (U"Out of memory: there is not enough room for another ", Melder_bigInteger (size), U" bytes.");
+	if (Melder_debug == 34) { Melder_casual (U"Melder_malloc\t", Melder_pointer (result), U"\t", Melder_bigInteger (size), U"\t1"); }
 	totalNumberOfAllocations += 1;
 	totalAllocationSize += size;
 	return result;
 }
 
-void * _Melder_malloc_f (int64_t size) {
+void * _Melder_malloc_f (int64 size) {
 	if (size <= 0)
-		Melder_fatal ("(Melder_malloc_f:) Can never allocate %ls bytes.", Melder_bigInteger (size));
-	if (sizeof (size_t) < 8 && (double) size > SIZE_MAX)
-		Melder_fatal ("(Melder_malloc_f:) Can never allocate %ls bytes.", Melder_bigInteger (size));
+		Melder_fatal (U"(Melder_malloc_f:) Can never allocate ", Melder_bigInteger (size), U" bytes.");
+	if (sizeof (size_t) < 8 && size > SIZE_MAX)
+		Melder_fatal (U"(Melder_malloc_f:) Can never allocate ", Melder_bigInteger (size), U" bytes.");
 	void *result = malloc ((size_t) size);
-	if (result == NULL) {
-		if (theRainyDayFund != NULL) { free (theRainyDayFund); theRainyDayFund = NULL; }
+	if (! result) {
+		if (theRainyDayFund) { free (theRainyDayFund); theRainyDayFund = nullptr; }
 		result = malloc ((size_t) size);
-		if (result != NULL) {
-			Melder_flushError ("Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
+		if (result) {
+			Melder_flushError (U"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
 		} else {
-			Melder_fatal ("Out of memory: there is not enough room for another %ls bytes.", Melder_bigInteger (size));
+			Melder_fatal (U"Out of memory: there is not enough room for another %s bytes.", Melder_bigInteger (size));
 		}
 	}
 	totalNumberOfAllocations += 1;
@@ -97,23 +97,23 @@ void * _Melder_malloc_f (int64_t size) {
 }
 
 void _Melder_free (void **ptr) {
-	if (*ptr == NULL) return;
+	if (! *ptr) return;
+	if (Melder_debug == 34) { Melder_casual (U"Melder_free\t", Melder_pointer (*ptr), U"\t?\t?"); }
 	free (*ptr);
-	if (Melder_debug == 34) { Melder_casual ("Melder_free\t%p\t?\t?", *ptr); }
-	*ptr = NULL;
+	*ptr = nullptr;
 	totalNumberOfDeallocations += 1;
 }
 
-void * Melder_realloc (void *ptr, int64_t size) {
+void * Melder_realloc (void *ptr, int64 size) {
 	if (size <= 0)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (size), " bytes.");
-	if (sizeof (size_t) < 8 && (double) size > SIZE_MAX)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (size), " bytes. Use a 64-bit edition of Praat instead?");
+		Melder_throw (U"Can never allocate ", Melder_bigInteger (size), U" bytes.");
+	if (sizeof (size_t) < 8 && size > SIZE_MAX)
+		Melder_throw (U"Can never allocate ", Melder_bigInteger (size), U" bytes. Use a 64-bit edition of Praat instead?");
 	void *result = realloc (ptr, (size_t) size);   // will not show in the statistics...
-	if (result == NULL)
-		Melder_throw ("Out of memory. Could not extend room to ", Melder_bigInteger (size), " bytes.");
-	if (ptr == NULL) {   // is it like malloc?
-		if (Melder_debug == 34) { Melder_casual ("Melder_realloc\t%p\t%ls\t1", result, Melder_bigInteger (size)); }
+	if (result == nullptr)
+		Melder_throw (U"Out of memory. Could not extend room to ", Melder_bigInteger (size), U" bytes.");
+	if (! ptr) {   // is it like malloc?
+		if (Melder_debug == 34) { Melder_casual (U"Melder_realloc\t", Melder_pointer (result), U"\t", Melder_bigInteger (size), U"\t1"); }
 		totalNumberOfAllocations += 1;
 		totalAllocationSize += size;
 	} else if (result != ptr) {   // did realloc do a malloc-and-free?
@@ -127,26 +127,26 @@ void * Melder_realloc (void *ptr, int64_t size) {
 	return result;
 }
 
-void * Melder_realloc_f (void *ptr, int64_t size) {
+void * Melder_realloc_f (void *ptr, int64 size) {
 	void *result;
 	if (size <= 0)
-		Melder_fatal ("(Melder_realloc_f:) Can never allocate %ls bytes.", Melder_bigInteger (size));
-	if (sizeof (size_t) < 8 && (double) size > SIZE_MAX)
-		Melder_fatal ("(Melder_realloc_f:) Can never allocate %ls bytes.", Melder_bigInteger (size));
+		Melder_fatal (U"(Melder_realloc_f:) Can never allocate ", Melder_bigInteger (size), U" bytes.");
+	if (sizeof (size_t) < 8 && size > SIZE_MAX)
+		Melder_fatal (U"(Melder_realloc_f:) Can never allocate ", Melder_bigInteger (size), U" bytes.");
 	result = realloc (ptr, (size_t) size);   // will not show in the statistics...
-	if (result == NULL) {
-		if (theRainyDayFund != NULL) { free (theRainyDayFund); theRainyDayFund = NULL; }
+	if (! result) {
+		if (theRainyDayFund) { free (theRainyDayFund); theRainyDayFund = nullptr; }
 		result = realloc (ptr, (size_t) size);
-		if (result != NULL) {
-			Melder_flushError ("Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
+		if (result) {
+			Melder_flushError (U"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
 		} else {
-			Melder_fatal ("Out of memory. Could not extend room to %ls bytes.", Melder_bigInteger (size));
+			Melder_fatal (U"Out of memory. Could not extend room to ", Melder_bigInteger (size), U" bytes.");
 		}
 	}
-	if (ptr == NULL) {   /* Is it like malloc? */
+	if (! ptr) {   // is it like malloc?
 		totalNumberOfAllocations += 1;
 		totalAllocationSize += size;
-	} else if (result != ptr) {   /* Did realloc do a malloc-and-free? */
+	} else if (result != ptr) {   // did realloc do a malloc-and-free?
 		totalNumberOfAllocations += 1;
 		totalAllocationSize += size;
 		totalNumberOfDeallocations += 1;
@@ -157,204 +157,201 @@ void * Melder_realloc_f (void *ptr, int64_t size) {
 	return result;
 }
 
-void * _Melder_calloc (int64_t nelem, int64_t elsize) {
-	void *result;
+void * _Melder_calloc (int64 nelem, int64 elsize) {
 	if (nelem <= 0)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (nelem), " elements.");
+		Melder_throw (U"Can never allocate ", Melder_bigInteger (nelem), U" elements.");
 	if (elsize <= 0)
-		Melder_throw ("Can never allocate elements whose size is ", Melder_bigInteger (elsize), " bytes.");
-	if (sizeof (size_t) < 8 && (double) nelem * (double) elsize > SIZE_MAX)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (nelem * elsize), " bytes. Use a 64-bit edition of Praat instead?");
-	result = calloc ((size_t) nelem, (size_t) elsize);
-	if (result == NULL)
-		Melder_throw ("Out of memory: there is not enough room for ", Melder_bigInteger (nelem), " more elements whose sizes are ", elsize, " bytes each.");
-	if (Melder_debug == 34) { Melder_casual ("Melder_calloc\t%p\t%ls\t%ls", result, Melder_bigInteger (nelem), Melder_bigInteger (elsize)); }
+		Melder_throw (U"Can never allocate elements whose size is ", Melder_bigInteger (elsize), U" bytes.");
+	if ((uint64_t) nelem > SIZE_MAX / (uint64_t) elsize)   // guarded casts to unsigned
+		Melder_throw (U"Can never allocate ", Melder_bigInteger (nelem), U" elements whose sizes are ", Melder_bigInteger (elsize), U" bytes each.",
+			sizeof (size_t) < 8 ? U" Use a 64-bit edition of Praat instead?" : nullptr);
+	void *result = calloc ((size_t) nelem, (size_t) elsize);
+	if (! result)
+		Melder_throw (U"Out of memory: there is not enough room for ", Melder_bigInteger (nelem), U" more elements whose sizes are ", elsize, U" bytes each.");
+	if (Melder_debug == 34) { Melder_casual (U"Melder_calloc\t", Melder_pointer (result), U"\t", Melder_bigInteger (nelem), U"\t", Melder_bigInteger (elsize)); }
 	totalNumberOfAllocations += 1;
-	totalAllocationSize += (double) nelem * (double) elsize;
+	totalAllocationSize += nelem * elsize;
 	return result;
 }
 
-void * _Melder_calloc_f (int64_t nelem, int64_t elsize) {
-	void *result;
+void * _Melder_calloc_f (int64 nelem, int64 elsize) {
 	if (nelem <= 0)
-		Melder_fatal ("(Melder_calloc_f:) Can never allocate %ls elements.", Melder_bigInteger (nelem));
+		Melder_fatal (U"(Melder_calloc_f:) Can never allocate ", Melder_bigInteger (nelem), U" elements.");
 	if (elsize <= 0)
-		Melder_fatal ("(Melder_calloc_f:) Can never allocate elements whose size is %ls bytes.", Melder_bigInteger (elsize));
-	if (sizeof (size_t) < 8 && (double) nelem * (double) elsize > SIZE_MAX)
-		Melder_fatal ("(Melder_calloc_f:) Can never allocate %ls bytes.", Melder_double ((double) nelem * (double) elsize));
-	result = calloc ((size_t) nelem, (size_t) elsize);
-	if (result == NULL) {
-		if (theRainyDayFund != NULL) { free (theRainyDayFund); theRainyDayFund = NULL; }
+		Melder_fatal (U"(Melder_calloc_f:) Can never allocate elements whose size is ", Melder_bigInteger (elsize), U" bytes.");
+	if ((uint64_t) nelem > SIZE_MAX / (uint64_t) elsize)
+		Melder_fatal (U"(Melder_calloc_f:) Can never allocate ", Melder_bigInteger (nelem), U" elements whose sizes are ", Melder_bigInteger (elsize), U" bytes each.");
+	void *result = calloc ((size_t) nelem, (size_t) elsize);
+	if (! result) {
+		if (theRainyDayFund) { free (theRainyDayFund); theRainyDayFund = nullptr; }
 		result = calloc ((size_t) nelem, (size_t) elsize);
-		if (result != NULL) {
-			Melder_flushError ("Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
+		if (result) {
+			Melder_flushError (U"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
 		} else {
-			Melder_fatal ("Out of memory: there is not enough room for %ls more elements whose sizes are %ls bytes each.", Melder_bigInteger (nelem), Melder_bigInteger (elsize));
+			Melder_fatal (U"Out of memory: there is not enough room for ", Melder_bigInteger (nelem),
+				U" more elements whose sizes are ", Melder_bigInteger (elsize), U" bytes each.");
 		}
 	}
 	totalNumberOfAllocations += 1;
-	totalAllocationSize += (double) nelem * (double) elsize;
+	totalAllocationSize += nelem * elsize;
 	return result;
 }
 
 char * Melder_strdup (const char *string) {
-	if (! string) return NULL;
-	int64_t size = (int64_t) strlen (string) + 1;
-	if (sizeof (size_t) < 8 && (double) size > SIZE_MAX)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (size), " bytes. Use a 64-bit edition of Praat instead?");
-	char *result = (char *) malloc ((size_t) size * sizeof (char));
-	if (result == NULL)
-		Melder_throw ("Out of memory: there is not enough room to duplicate a text of ", Melder_bigInteger (size - 1), " characters.");
+	if (! string) return nullptr;
+	int64 size = (int64) strlen (string) + 1;
+	if (sizeof (size_t) < 8 && size > SIZE_MAX)
+		Melder_throw (U"Can never allocate ", Melder_bigInteger (size), U" bytes. Use a 64-bit edition of Praat instead?");
+	char *result = (char *) malloc ((size_t) size);
+	if (! result)
+		Melder_throw (U"Out of memory: there is not enough room to duplicate a text of ", Melder_bigInteger (size - 1), U" characters.");
 	strcpy (result, string);
-	if (Melder_debug == 34) { Melder_casual ("Melder_strdup\t%p\t%ls\t1", result, Melder_bigInteger (size)); }
+	if (Melder_debug == 34) { Melder_casual (U"Melder_strdup\t", Melder_pointer (result), U"\t", Melder_bigInteger (size), U"\t1"); }
 	totalNumberOfAllocations += 1;
-	totalAllocationSize += (double) size;
+	totalAllocationSize += size;
 	return result;
 }
 
 char * Melder_strdup_f (const char *string) {
-	if (! string) return NULL;
-	int64_t size = (int64_t) strlen (string) + 1;
-	if (sizeof (size_t) < 8 && (double) size > SIZE_MAX)
-		Melder_fatal ("(Melder_strdup_f:) Can never allocate %ls bytes.", Melder_bigInteger (size));
-	char *result = (char *) malloc ((size_t) size * sizeof (char));
-	if (result == NULL) {
-		if (theRainyDayFund != NULL) { free (theRainyDayFund); theRainyDayFund = NULL; }
+	if (! string) return nullptr;
+	int64 size = (int64) strlen (string) + 1;
+	if (sizeof (size_t) < 8 && size > SIZE_MAX)
+		Melder_fatal (U"(Melder_strdup_f:) Can never allocate ", Melder_bigInteger (size), U" bytes.");
+	char *result = (char *) malloc ((size_t) size);
+	if (! result) {
+		if (theRainyDayFund) { free (theRainyDayFund); theRainyDayFund = nullptr; }
 		result = (char *) malloc ((size_t) size * sizeof (char));
-		if (result != NULL) {
-			Melder_flushError ("Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
+		if (result) {
+			Melder_flushError (U"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
 		} else {
-			Melder_fatal ("Out of memory: there is not enough room to duplicate a text of %ls characters.", Melder_bigInteger (size - 1));
+			Melder_fatal (U"Out of memory: there is not enough room to duplicate a text of ", Melder_bigInteger (size - 1), U" characters.");
 		}
 	}
 	strcpy (result, string);
 	totalNumberOfAllocations += 1;
-	totalAllocationSize += (double) size;
-	return result;
-}
-
-wchar_t * Melder_wcsdup (const wchar_t *string) {
-	if (! string) return NULL;
-	int64_t size = (int64_t) wcslen (string) + 1;
-	double allocationSize = (double) size * (double) sizeof (wchar_t);
-	if (allocationSize > INT54_MAX)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (size), " bytes. It is above the 9-petabyte limit.");
-	if (sizeof (size_t) < 8 && allocationSize > SIZE_MAX)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (size), " bytes. Use a 64-bit edition of Praat instead?");
-	wchar_t *result = (wchar_t *) malloc ((size_t) allocationSize);   // guarded conversion
-	if (result == NULL)
-		Melder_throw ("Out of memory: there is not enough room to duplicate a text of ", Melder_bigInteger (size - 1), " characters.");
-	wcscpy (result, string);
-	if (Melder_debug == 34) { Melder_casual ("Melder_wcsdup\t%p\t%ls\t4", result, Melder_bigInteger (size)); }
-	totalNumberOfAllocations += 1;
-	totalAllocationSize += allocationSize;
+	totalAllocationSize += size;
 	return result;
 }
 
-char32_t * Melder_str32dup (const char32_t *string) {
-	if (! string) return NULL;
-	int64_t size = (int64_t) str32len (string) + 1;
-	double allocationSize = (double) size * (double) sizeof (char32_t);
-	if (allocationSize > INT54_MAX)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (size), " bytes. It is above the 9-petabyte limit.");
-	if (sizeof (size_t) < 8 && allocationSize > SIZE_MAX)
-		Melder_throw ("Can never allocate ", Melder_bigInteger (size), " bytes. Use a 64-bit edition of Praat instead?");
-	char32_t *result = (char32_t *) malloc ((size_t) allocationSize);   // guarded conversion
-	if (result == NULL)
-		Melder_throw ("Out of memory: there is not enough room to duplicate a text of ", Melder_bigInteger (size - 1), " characters.");
+char32 * Melder_dup (const char32 *string /* cattable */) {
+	if (! string) return nullptr;
+	int64 size = (int64) str32len (string) + 1;   // guaranteed to be positive
+	if (sizeof (size_t) < 8 && size > SIZE_MAX / sizeof (char32))
+		Melder_throw (U"Can never allocate ", Melder_bigInteger (size), U" characters. Use a 64-bit edition of Praat instead?");
+	char32 *result = (char32 *) malloc ((size_t) size * sizeof (char32));   // guarded conversion
+	if (! result)
+		Melder_throw (U"Out of memory: there is not enough room to duplicate a text of ", Melder_bigInteger (size - 1), U" characters.");
 	str32cpy (result, string);
-	if (Melder_debug == 34) { Melder_casual ("Melder_str32dup\t%p\t%ls\t4", result, Melder_bigInteger (size)); }
+	if (Melder_debug == 34) { Melder_casual (U"Melder_dup\t", Melder_pointer (result), U"\t", Melder_bigInteger (size), U"\t4"); }
 	totalNumberOfAllocations += 1;
-	totalAllocationSize += allocationSize;
+	totalAllocationSize += size * (int64) sizeof (char32);
 	return result;
 }
 
-wchar_t * Melder_wcsdup_f (const wchar_t *string) {
-	if (! string) return NULL;
-	int64_t size = (int64_t) wcslen (string) + 1;
-	if (sizeof (size_t) < 8 && (double) size * (double) sizeof (wchar_t) > SIZE_MAX)
-		Melder_fatal ("(Melder_wcsdup_f:) Can never allocate %ls characters.", Melder_bigInteger (size));
-	wchar_t *result = (wchar_t *) malloc ((size_t) size * sizeof (wchar_t));
-	if (result == NULL) {
-		if (theRainyDayFund != NULL) { free (theRainyDayFund); theRainyDayFund = NULL; }
-		result = (wchar_t *) malloc ((size_t) size * sizeof (wchar_t));
-		if (result != NULL) {
-			Melder_flushError ("Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
+char32 * Melder_dup_f (const char32 *string /* cattable */) {
+	if (! string) return nullptr;
+	int64 size = (int64) str32len (string) + 1;
+	if (sizeof (size_t) < 8 && size > SIZE_MAX / sizeof (char32))
+		Melder_fatal (U"(Melder_dup_f:) Can never allocate ", Melder_bigInteger (size), U" characters.");
+	char32 *result = (char32 *) malloc ((size_t) size * sizeof (char32));
+	if (! result) {
+		if (theRainyDayFund) { free (theRainyDayFund); theRainyDayFund = nullptr; }
+		result = (char32 *) malloc ((size_t) size * sizeof (char32));
+		if (result) {
+			Melder_flushError (U"Praat is very low on memory.\nSave your work and quit Praat.\nIf you don't do that, Praat may crash.");
 		} else {
-			Melder_fatal ("Out of memory: there is not enough room to duplicate a text of %ls characters.", Melder_bigInteger (size - 1));
+			Melder_fatal (U"Out of memory: there is not enough room to duplicate a text of ", Melder_bigInteger (size - 1), U" characters.");
 		}
 	}
-	wcscpy (result, string);
+	str32cpy (result, string);
 	totalNumberOfAllocations += 1;
-	totalAllocationSize += (double) size * sizeof (wchar_t);
+	totalAllocationSize += size * (int64) sizeof (char32);
 	return result;
 }
 
-double Melder_allocationCount (void) {
+int64 Melder_allocationCount () {
 	return totalNumberOfAllocations;
 }
 
-double Melder_deallocationCount (void) {
+int64 Melder_deallocationCount () {
 	return totalNumberOfDeallocations;
 }
 
-double Melder_allocationSize (void) {
+int64 Melder_allocationSize () {
 	return totalAllocationSize;
 }
 
-double Melder_reallocationsInSituCount (void) {
+int64 Melder_reallocationsInSituCount () {
 	return totalNumberOfReallocsInSitu;
 }
 
-double Melder_movingReallocationsCount (void) {
+int64 Melder_movingReallocationsCount () {
 	return totalNumberOfMovingReallocs;
 }
 
-int Melder_strcmp (const char *string1, const char *string2) {
-	if (string1 == NULL) string1 = "";
-	if (string2 == NULL) string2 = "";
-	return strcmp (string1, string2);
-}
-
-int Melder_str32cmp (const char32 *string1, const char32 *string2) {
-	if (string1 == NULL) string1 = U"";
-	if (string2 == NULL) string2 = U"";
+int Melder_cmp (const char32 *string1, const char32 *string2) {
+	if (! string1) string1 = U"";
+	if (! string2) string2 = U"";
 	return str32cmp (string1, string2);
 }
 
-int Melder_strncmp (const char *string1, const char *string2, int64_t n) {
-	if (string1 == NULL) string1 = "";
-	if (string2 == NULL) string2 = "";
-	return strncmp (string1, string2, n);
+int Melder_ncmp (const char32 *string1, const char32 *string2, int64 n) {
+	if (! string1) string1 = U"";
+	if (! string2) string2 = U"";
+	return str32ncmp (string1, string2, n);
 }
 
-int Melder_wcscmp (const wchar_t *string1, const wchar_t *string2) {
-	if (string1 == NULL) string1 = L"";
-	if (string2 == NULL) string2 = L"";
-	return wcscmp (string1, string2);
+bool Melder_str32equ_firstCharacterCaseInsensitive (const char32 *string1, const char32 *string2) {
+	if (! string1) string1 = U"";
+	if (! string2) string2 = U"";
+	if (*string1 == U'\0') return *string2 == U'\0';
+	if (*string1 == *string2)
+		return ! str32cmp (string1 + 1, string2 + 1);
+	if (sizeof (wchar_t) == 2) {
+		if (*string1 > 65536 || *string2 > 65536)
+			return false;
+		if (towlower ((char16) *string1) != towlower ((char16) *string2)) return false;
+	} else {
+		if (towlower ((int32) *string1) != towlower ((int32) *string2)) return false;
+	}
+	return ! str32cmp (string1 + 1, string2 + 1);
 }
 
-int Melder_wcsncmp (const wchar_t *string1, const wchar_t *string2, int64_t n) {
-	if (string1 == NULL) string1 = L"";
-	if (string2 == NULL) string2 = L"";
-	return wcsncmp (string1, string2, n);
-}
+char32 * Melder_tok (char32 *string, const char32 *delimiter) {
+	const char32 *spanp;
+	char32 c, sc;
+	char32 *tok;
+	static char32 *last;
 
-bool Melder_wcsequ_firstCharacterCaseInsensitive (const wchar_t *string1, const wchar_t *string2) {
-	if (string1 == NULL) string1 = L"";
-	if (string2 == NULL) string2 = L"";
-	if (towlower (*string1) != towlower (*string2)) return false;
-	if (*string1 == '\0') return true;
-	return ! wcscmp (string1 + 1, string2 + 1);
-}
+	if (! string && (string = last) == nullptr)
+		return nullptr;
+
+cont:
+	c = * string ++;
+	for (spanp = delimiter; (sc = * spanp ++) != U'\0';) {
+		if (c == sc)
+			goto cont;
+	}
 
-wchar_t * Melder_wcstok (wchar_t *string, const wchar_t *delimiter, wchar_t **last) {
-	#if defined (__MINGW32__)
-		(void) last;
-		return wcstok (string, delimiter);
-	#else
-		return wcstok (string, delimiter, last);
-	#endif
+	if (c == U'\0') {
+		last = nullptr;
+		return nullptr;
+	}
+	tok = string - 1;
+	for (;;) {
+		c = * string ++;
+		spanp = delimiter;
+		do {
+			if ((sc = * spanp ++) == c) {
+				if (c == U'\0')
+					string = nullptr;
+				else
+					string [-1] = U'\0';
+				last = string;
+				return tok;
+			}
+		} while (sc != U'\0');
+	}
 }
 
 /* End of file melder_alloc.cpp */
diff --git a/sys/melder_atof.cpp b/sys/melder_atof.cpp
index 74d357b..a6e956e 100644
--- a/sys/melder_atof.cpp
+++ b/sys/melder_atof.cpp
@@ -1,6 +1,6 @@
 /* melder_atof.cpp
  *
- * Copyright (C) 2003-2011 Paul Boersma
+ * Copyright (C) 2003-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,8 +28,8 @@
 #include "melder.h"
 #include "NUM.h"
 
-static const wchar_t *findEndOfNumericString_nothrow (const wchar_t *string) {
-	const wchar_t *p = & string [0];
+static const char32 *findEndOfNumericString_nothrow (const char32 *string) {
+	const char32 *p = & string [0];
 	/*
 	 * Leading white space is OK.
 	 */
@@ -43,7 +43,7 @@ static const wchar_t *findEndOfNumericString_nothrow (const wchar_t *string) {
 	 * The next character must be a decimal digit.
 	 * So we don't allow things like ".5".
 	 */
-	if (*p < '0' || *p > '9') return NULL;   /* String is not numeric. */
+	if (*p < '0' || *p > '9') return nullptr;   // string is not numeric
 	p ++;
 	/*
 	 * Then we accept any number of decimal digits.
@@ -72,7 +72,7 @@ static const wchar_t *findEndOfNumericString_nothrow (const wchar_t *string) {
 		 * The exponent must contain a decimal digit.
 		 * So we don't allow things like "+2.1E".
 		 */
-		if (*p < '0' || *p > '9') return NULL;   /* String is not numeric. */
+		if (*p < '0' || *p > '9') return nullptr;   // string is not numeric
 		p ++;
 		/*
 		 * Then we accept any number of decimal digits.
@@ -89,29 +89,93 @@ static const wchar_t *findEndOfNumericString_nothrow (const wchar_t *string) {
 	return p;
 }
 
-int Melder_isStringNumeric_nothrow (const wchar_t *string) {
-	if (string == NULL) return false;
-	const wchar_t *p = findEndOfNumericString_nothrow (string);
-	if (p == NULL) return FALSE;
+static const char *findEndOfNumericString_nothrow (const char *string) {
+	const char *p = & string [0];
 	/*
-	 * We accept only white space after the numeric string.
+	 * Leading white space is OK.
 	 */
 	while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r')
 		p ++;
-	return *p == '\0';
+	/*
+	 * Next we accept an optional leading plus or minus.
+	 */
+	if (*p == '+' || *p == '-') p ++;
+	/*
+	 * The next character must be a decimal digit.
+	 * So we don't allow things like ".5".
+	 */
+	if (*p < '0' || *p > '9') return nullptr;   // string is not numeric
+	p ++;
+	/*
+	 * Then we accept any number of decimal digits.
+	 */
+	while (*p >= '0' && *p <= '9') p ++;
+	/*
+	 * Next we accept an optional decimal point.
+	 */
+	if (*p == '.') {
+		p ++;
+		/*
+		 * We accept any number of (even zero) decimal digits after the decimal point.
+		 */
+		while (*p >= '0' && *p <= '9') p ++;
+	}
+	/*
+	 * Next we accept an optional exponential E or e.
+	 */
+	if (*p == 'e' || *p == 'E') {
+		p ++;
+		/*
+		 * In the exponent we accept an optional leading plus or minus.
+		 */
+		if (*p == '+' || *p == '-') p ++;
+		/*
+		 * The exponent must contain a decimal digit.
+		 * So we don't allow things like "+2.1E".
+		 */
+		if (*p < '0' || *p > '9') return nullptr;   // string is not numeric
+		p ++;
+		/*
+		 * Then we accept any number of decimal digits.
+		 */
+		while (*p >= '0' && *p <= '9') p ++;
+	}
+	/*
+	 * Next we accept an optional percent sign.
+	 */
+	if (*p == '%') p ++;
+	/*
+	 * We have found the end of the numeric string.
+	 */
+	return p;
 }
 
-double Melder_atof (const wchar_t *string) {
-	if (string == NULL) return NUMundefined;
-	const wchar_t *p = findEndOfNumericString_nothrow (string);
-	if (p == NULL) return NUMundefined;
+bool Melder_isStringNumeric_nothrow (const char32 *string) {
+	if (! string) return false;
+	const char32 *p = findEndOfNumericString_nothrow (string);
+	if (! p) return false;
+	/*
+	 * We accept only white space after the numeric string.
+	 */
+	while (*p == U' ' || *p == U'\t' || *p == U'\n' || *p == U'\r')
+		p ++;
+	return *p == U'\0';
+}
+
+double Melder_a8tof (const char *string) {
+	if (! string) return NUMundefined;
+	const char *p = findEndOfNumericString_nothrow (string);
+	if (! p) return NUMundefined;
 	Melder_assert (p - string > 0);
-	#if defined (macintosh)
-		/* strtod may be 100 times faster than wcstod: */
-		return p [-1] == '%' ? 0.01 * strtod (Melder_peekWcsToUtf8 (string), NULL) : strtod (Melder_peekWcsToUtf8 (string), NULL);
-	#else
-		return p [-1] == '%' ? 0.01 * wcstod (string, NULL) : wcstod (string, NULL);
-	#endif
+	return p [-1] == '%' ? 0.01 * strtod (string, nullptr) : strtod (string, nullptr);
+}
+
+double Melder_atof (const char32 *string) {
+	return Melder_a8tof (Melder_peek32to8 (string));
+}
+
+int64 Melder_atoi (const char32 *string) {
+	return strtoll (Melder_peek32to8 (string), nullptr, 10);
 }
 
 /* End of file melder_atof.cpp */
diff --git a/sys/melder_audio.cpp b/sys/melder_audio.cpp
index ac1d1ad..c0a4dac 100644
--- a/sys/melder_audio.cpp
+++ b/sys/melder_audio.cpp
@@ -1,6 +1,6 @@
 /* melder_audio.cpp
  *
- * Copyright (C) 1992-2011,2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2012,2013,2014,2015 Paul Boersma, David Weenink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,7 +31,7 @@
  * pb 2006/12/16 Macintosh uses CoreAudio (via PortAudio)
  * pb 2007/01/03 best sample rate can be over 64 kHz
  * pb 2007/05/13 null pointer test for deviceInfo (thanks to Stefan de Konink)
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * Stefan de Konink 2007/12/02 big-endian Linux
  * pb 2007/12/04 enums
  * pb 2008/06/01 removed SPEXLAB audio server
@@ -40,6 +40,7 @@
  * pb 2010/05/09 GTK
  * pb 2011/02/11 better message
  * pb 2011/04/05 C++
+ * pb 2015/06/08 char32
  */
 
 #if defined (macintosh)
@@ -56,6 +57,9 @@
 	#include <sys/ioctl.h>
 	#include <fcntl.h>
 	#include <unistd.h>
+	#if defined HAVE_PULSEAUDIO
+		#include <pulse/pulseaudio.h>
+	#endif
 	#if defined (__OpenBSD__) || defined (__NetBSD__)
 		#include <soundcard.h>
 	#else
@@ -64,64 +68,79 @@
 	#include <errno.h>
 #endif
 
-#include "melder.h"
 #include "Gui.h"
 #include "Preferences.h"
 #include "NUM.h"
 #include <time.h>
-#define my  me ->
+#define my me ->
 
 #include "../external/portaudio/portaudio.h"
 
+#ifdef HAVE_PULSEAUDIO
+	void pulseAudio_cleanup ();
+	void stream_drain_complete_cb (pa_stream *stream, int success, void *userdata);
+	void context_state_cb (pa_context *context, void *userdata);
+	void context_drain_complete_cb (pa_context *context, void *userdata);
+	void stream_write_cb (pa_stream *stream, size_t length, void *userdata);
+#endif
+
 static struct {
 	enum kMelder_asynchronicityLevel maximumAsynchronicity;
-	bool useInternalSpeaker, inputUsesPortAudio, outputUsesPortAudio;
+	enum kMelder_inputSoundSystem inputSoundSystem;
+	enum kMelder_outputSoundSystem outputSoundSystem;
+	bool useInternalSpeaker;
 	double silenceBefore, silenceAfter;
 } preferences;
 
-void Melder_audio_prefs (void) {
-	Preferences_addEnum (L"Audio.maximumAsynchronicity", & preferences. maximumAsynchronicity, kMelder_asynchronicityLevel, kMelder_asynchronicityLevel_DEFAULT);
-	Preferences_addBool (L"Audio.useInternalSpeaker", & preferences. useInternalSpeaker, true);
-	Preferences_addBool (L"Audio.outputUsesPortAudio2", & preferences. outputUsesPortAudio, kMelderAudio_outputUsesPortAudio_DEFAULT);
-	Preferences_addDouble (L"Audio.silenceBefore", & preferences. silenceBefore, kMelderAudio_outputSilenceBefore_DEFAULT);
-	Preferences_addDouble (L"Audio.silenceAfter", & preferences. silenceAfter, kMelderAudio_outputSilenceAfter_DEFAULT);
-	Preferences_addBool (L"Audio.inputUsesPortAudio2", & preferences. inputUsesPortAudio, kMelderAudio_inputUsesPortAudio_DEFAULT);
+void Melder_audio_prefs () {
+	Preferences_addEnum (U"Audio.maximumAsynchronicity", & preferences. maximumAsynchronicity, kMelder_asynchronicityLevel, kMelder_asynchronicityLevel_DEFAULT);
+	Preferences_addEnum (U"Audio.inputSoundSystem", & preferences. inputSoundSystem, kMelder_inputSoundSystem, kMelder_inputSoundSystem_DEFAULT);
+	Preferences_addEnum (U"Audio.inputSoundSystem", & preferences. outputSoundSystem, kMelder_outputSoundSystem, kMelder_outputSoundSystem_DEFAULT);
+	Preferences_addBool (U"Audio.useInternalSpeaker", & preferences. useInternalSpeaker, true);
+	Preferences_addDouble (U"Audio.silenceBefore2", & preferences. silenceBefore, kMelderAudio_outputSilenceBefore_DEFAULT);
+	Preferences_addDouble (U"Audio.silenceAfter2", & preferences. silenceAfter, kMelderAudio_outputSilenceAfter_DEFAULT);
 }
 
 void MelderAudio_setOutputMaximumAsynchronicity (enum kMelder_asynchronicityLevel maximumAsynchronicity) {
 	//MelderAudio_stopPlaying (MelderAudio_IMPLICIT);   // BUG
 	preferences. maximumAsynchronicity = maximumAsynchronicity;
 }
-enum kMelder_asynchronicityLevel MelderAudio_getOutputMaximumAsynchronicity (void) { return preferences. maximumAsynchronicity; }
+enum kMelder_asynchronicityLevel MelderAudio_getOutputMaximumAsynchronicity () {
+	return preferences. maximumAsynchronicity;
+}
 
-void MelderAudio_setInputUsesPortAudio (bool inputUsesPortAudio) {
-	preferences. inputUsesPortAudio = inputUsesPortAudio;
+void MelderAudio_setInputSoundSystem (enum kMelder_inputSoundSystem inputSoundSystem) {
+	preferences. inputSoundSystem = inputSoundSystem;
+}
+enum kMelder_inputSoundSystem MelderAudio_getInputSoundSystem () {
+	return preferences. inputSoundSystem;
 }
-bool MelderAudio_getInputUsesPortAudio (void) { return preferences. inputUsesPortAudio; }
 
-void MelderAudio_setOutputUsesPortAudio (bool outputUsesPortAudio) {
+void MelderAudio_setOutputSoundSystem (enum kMelder_outputSoundSystem outputSoundSystem) {
 	MelderAudio_stopPlaying (MelderAudio_IMPLICIT);
-	preferences. outputUsesPortAudio = outputUsesPortAudio;
+	preferences. outputSoundSystem = outputSoundSystem;
+}
+enum kMelder_outputSoundSystem MelderAudio_getOutputSoundSystem () {
+	return preferences. outputSoundSystem;
 }
-bool MelderAudio_getOutputUsesPortAudio (void) { return preferences. outputUsesPortAudio; }
 
 void MelderAudio_setUseInternalSpeaker (bool useInternalSpeaker) {
 	MelderAudio_stopPlaying (MelderAudio_IMPLICIT);
 	preferences. useInternalSpeaker = useInternalSpeaker;
 }
-bool MelderAudio_getUseInternalSpeaker (void) { return preferences. useInternalSpeaker; }
+bool MelderAudio_getUseInternalSpeaker () { return preferences. useInternalSpeaker; }
 
 void MelderAudio_setOutputSilenceBefore (double silenceBefore) {
 	MelderAudio_stopPlaying (MelderAudio_IMPLICIT);
 	preferences. silenceBefore = silenceBefore;
 }
-double MelderAudio_getOutputSilenceBefore (void) { return preferences. silenceBefore; }
+double MelderAudio_getOutputSilenceBefore () { return preferences. silenceBefore; }
 
 void MelderAudio_setOutputSilenceAfter (double silenceAfter) {
 	MelderAudio_stopPlaying (MelderAudio_IMPLICIT);
 	preferences. silenceAfter = silenceAfter;
 }
-double MelderAudio_getOutputSilenceAfter (void) { return preferences. silenceAfter; }
+double MelderAudio_getOutputSilenceAfter () { return preferences. silenceAfter; }
 
 long MelderAudio_getOutputBestSampleRate (long fsamp) {
 	#if defined (macintosh)
@@ -140,6 +159,35 @@ bool MelderAudio_isPlaying;
 
 static double theStartingTime = 0.0;
 
+#define PA_INFO_GETTING 1
+#define PA_INFO_FOUND 2
+#define PA_WRITING 4
+#define PA_WRITING_DONE 8
+
+#ifdef HAVE_PULSEAUDIO
+typedef struct pulseAudio {
+	pa_sample_spec sample_spec;
+	pa_threaded_mainloop *mainloop = nullptr;
+	pa_mainloop_api *mainloop_api = nullptr;
+	pa_context *context = nullptr;
+	pa_stream *stream = nullptr;
+	pa_operation *operation_drain = nullptr;
+	pa_operation *operation_info = nullptr;
+	pa_stream_flags_t stream_flags;
+	const pa_timing_info *timing_info = nullptr;
+	struct timeval startTime = {0, 0};
+	pa_usec_t timer_event_usec = 50000; // 50 ms
+	pa_time_event *timer_event = nullptr;
+	const pa_channel_map *channel_map = nullptr;
+	pa_usec_t r_usec;
+	pa_buffer_attr buffer_attr;
+	uint32_t latency = 0; // in bytes of buffer
+	int32_t latency_msec = 20;
+	bool pulseAudioInitialized = false;
+	unsigned int occupation = PA_WRITING;
+} pulseAudioStruct;
+#endif
+
 static struct MelderPlay {
 	int16_t *buffer;
 	long sampleRate, numberOfSamples, samplesLeft, samplesSent, samplesPlayed;
@@ -154,9 +202,9 @@ static struct MelderPlay {
 	#elif motif
 		XtWorkProcId workProcId_motif;
 	#elif gtk
-		gint workProcId_gtk;
+		gint workProcId_gtk = 0;
 	#endif
-	bool usePortAudio, supports_paComplete;
+	bool usePortAudio, supports_paComplete, usePulseAudio;
 	PaStream *stream;
 	double paStartingTime;
 	#if defined (macintosh)
@@ -167,13 +215,16 @@ static struct MelderPlay {
 		WAVEHDR waveHeader;
 		MMRESULT status;
 	#endif
+	#ifdef HAVE_PULSEAUDIO
+		pulseAudioStruct pulseAudio;
+	#endif
 } thePlay;
 
-long MelderAudio_getSamplesPlayed (void) {
+long MelderAudio_getSamplesPlayed () {
 	return thePlay. samplesPlayed;
 }
 
-bool MelderAudio_stopWasExplicit (void) {
+bool MelderAudio_stopWasExplicit () {
 	return thePlay. explicitStop;
 }
 
@@ -184,10 +235,10 @@ bool MelderAudio_stopWasExplicit (void) {
  * 3. After asynchronous play, by the workProc.
  * 4. After interruption of asynchronicity 3 by MelderAudio_stopPlaying ().
  */
-static bool flush (void) {
+static bool flush () {
 	struct MelderPlay *me = & thePlay;
 	if (my usePortAudio) {
-		if (my stream != NULL) {
+		if (my stream) {
 			#ifdef linux
 
 				Pa_Sleep (200);   // this reduces the chance of seeing the Alsa/PulseAudio deadlock:
@@ -278,11 +329,32 @@ static bool flush (void) {
 				*/
 			#endif
 			Pa_CloseStream (my stream);
-			my stream = NULL;
+			my stream = nullptr;
+		}
+	#ifdef HAVE_PULSEAUDIO
+	} else if (my usePulseAudio) {
+		if (my pulseAudio.mainloop) {
+			pa_threaded_mainloop_lock (my pulseAudio.mainloop);
+			if (my pulseAudio.stream) {
+				pa_operation *operation = pa_stream_flush (my pulseAudio.stream, stream_drain_complete_cb, me);
+				// wait because of a threaded_mainloop
+				if (operation) {
+					while (MelderAudio_isPlaying) {
+						pa_threaded_mainloop_wait (my pulseAudio.mainloop);
+						trace (U"wait");
+					}
+					pa_operation_unref (operation);
+				}
+			}
+			MelderAudio_isPlaying = false;
+			pa_threaded_mainloop_unlock (my pulseAudio.mainloop);
+			pulseAudio_cleanup ();
 		}
+	#endif
 	} else {
 	#if defined (macintosh)
 	#elif defined (linux)
+		
 		/*
 		 * As on Sun.
 		 */
@@ -308,7 +380,7 @@ static bool flush (void) {
 	}
 	if (my fakeMono) {
 		NUMvector_free ((short *) my buffer, 0);
-		my buffer = NULL;
+		my buffer = nullptr;
 	}
 	MelderAudio_isPlaying = false;
 	if (my samplesPlayed >= my numberOfSamples)
@@ -328,16 +400,20 @@ static bool flush (void) {
 }
 
 bool MelderAudio_stopPlaying (bool explicitStop) {
-	//Melder_casual ("stop playing!");
+	//Melder_casual (U"stop playing!");
 	struct MelderPlay *me = & thePlay;
 	my explicitStop = explicitStop;
+	trace (U"playing = ", MelderAudio_isPlaying);
 	if (! MelderAudio_isPlaying || my asynchronicity < kMelder_asynchronicityLevel_ASYNCHRONOUS) return false;
 	#if cocoa
 		CFRunLoopRemoveTimer (CFRunLoopGetCurrent (), thePlay. cocoaTimer, kCFRunLoopCommonModes);
 	#elif motif
 		XtRemoveWorkProc (thePlay. workProcId_motif);
 	#elif gtk
-		g_source_remove (thePlay. workProcId_gtk);
+		if (thePlay.workProcId_gtk && ! my usePulseAudio) {
+			g_source_remove (thePlay.workProcId_gtk);
+		}
+		thePlay.workProcId_gtk = 0;
 	#endif
 	(void) flush ();
 	return true;
@@ -347,7 +423,7 @@ static bool workProc (void *closure) {
 	struct MelderPlay *me = & thePlay;
 //static long n = 0;
 //n ++;
-//Melder_casual("workProc %ld", n);
+//Melder_casual (U"workProc ", n);
 	if (my usePortAudio) {
 		#if defined (linux)
 			double timeElapsed = Melder_clock () - theStartingTime - Pa_GetStreamInfo (my stream) -> outputLatency;
@@ -377,7 +453,7 @@ static bool workProc (void *closure) {
 			 */
 		#else
 			double timeElapsed = Melder_clock () - theStartingTime - Pa_GetStreamInfo (my stream) -> outputLatency;
-			my samplesPlayed = timeElapsed * my sampleRate;
+			my samplesPlayed = (long) floor (timeElapsed * my sampleRate);
 			if (my supports_paComplete && Pa_IsStreamActive (my stream)) {
 				if (my callback && ! my callback (my closure, my samplesPlayed)) {
 					Pa_AbortStream (my stream);
@@ -395,6 +471,27 @@ static bool workProc (void *closure) {
 			}
 			Pa_Sleep (10);
 		#endif
+	#ifdef HAVE_PULSEAUDIO
+	} else if (my usePulseAudio) {
+		if (my pulseAudio.mainloop) {
+			pa_threaded_mainloop_lock (my pulseAudio.mainloop);
+			long samplesPlayed = 0;
+			pa_usec_t diff_usec = 0;
+			if (my pulseAudio.startTime.tv_usec != 0) {
+				diff_usec = pa_timeval_age (& my pulseAudio.startTime);
+				double timeElapsed = diff_usec / 1000000.0;
+				samplesPlayed = timeElapsed * my sampleRate;
+			}
+			pa_threaded_mainloop_unlock (my pulseAudio.mainloop);
+			trace (U"diff = ", diff_usec, U", samples played = ", samplesPlayed);
+			if (my callback && ! my callback (my closure, samplesPlayed)) {
+				my volatile_interrupted = 1;
+				return flush ();
+			} else if (my samplesLeft == 0 || samplesPlayed > my numberOfSamples) {
+				return flush ();
+			}
+		}
+	#endif
 	} else {
 	#if defined (macintosh)
 	#elif defined (linux)
@@ -477,17 +574,16 @@ static int thePaStreamCallback (const void *input, void *output,
 		return my supports_paComplete ? paComplete : paContinue;
 	}
 	if (statusFlags & paOutputUnderflow) {
-		if (Melder_debug == 20) Melder_casual ("output underflow");
+		if (Melder_debug == 20) Melder_casual (U"output underflow");
 	}
 	if (statusFlags & paOutputOverflow) {
-		if (Melder_debug == 20) Melder_casual ("output overflow");
+		if (Melder_debug == 20) Melder_casual (U"output overflow");
 	}
 	if (my samplesLeft > 0) {
 		long dsamples = my samplesLeft > (long) frameCount ? (long) frameCount : my samplesLeft;
-		if (Melder_debug == 20) Melder_casual ("play %ls %ls", Melder_integer (dsamples),
-			Melder_double (Pa_GetStreamCpuLoad (my stream)));
+		if (Melder_debug == 20) Melder_casual (U"play ", dsamples, U" ", Pa_GetStreamCpuLoad (my stream));
 		memset (output, '\0', 2 * frameCount * my numberOfChannels);
-		Melder_assert (my buffer != NULL);
+		Melder_assert (my buffer);
 		memcpy (output, (char *) & my buffer [my samplesSent * my numberOfChannels], 2 * dsamples * my numberOfChannels);
 		my samplesLeft -= dsamples;
 		my samplesSent += dsamples;
@@ -495,12 +591,419 @@ static int thePaStreamCallback (const void *input, void *output,
 	} else /*if (my samplesPlayed >= my numberOfSamples)*/ {
 		memset (output, '\0', 2 * frameCount * my numberOfChannels);
 		my samplesPlayed = my numberOfSamples;
-		trace ("paComplete");
+		trace (U"paComplete");
 		return my supports_paComplete ? paComplete : paContinue;
 	}
 	return paContinue;
 }
 
+#ifdef HAVE_PULSEAUDIO
+void pulseAudio_initialize () {
+	struct MelderPlay *me = & thePlay;
+	if (! my pulseAudio.pulseAudioInitialized) {
+		my pulseAudio.mainloop = pa_threaded_mainloop_new ();
+		if (! my pulseAudio.mainloop) {
+			MelderAudio_isPlaying = false;
+			Melder_throw (U"No connection to pulse audio server.");
+		}
+		pa_threaded_mainloop_start (my pulseAudio.mainloop);
+		pa_threaded_mainloop_lock (my pulseAudio.mainloop);
+		my pulseAudio.mainloop_api = pa_threaded_mainloop_get_api (my pulseAudio.mainloop);
+		my pulseAudio.context = pa_context_new (my pulseAudio.mainloop_api, "praat");
+		pa_context_set_state_callback (my pulseAudio.context, context_state_cb, me);
+		pa_context_connect (my pulseAudio.context, nullptr, PA_CONTEXT_NOFLAGS, nullptr);
+		trace (U"threading");
+		my pulseAudio.pulseAudioInitialized = true;
+		pa_threaded_mainloop_unlock (my pulseAudio.mainloop);
+	}
+}
+
+void pulseAudio_cleanup () {
+	struct MelderPlay *me = & thePlay;
+
+	pa_threaded_mainloop_lock (my pulseAudio.mainloop);
+	trace (U"mainloop to be freed, occupation was ", my pulseAudio.occupation);
+
+	if (my pulseAudio.context) {
+		trace (U"still context");
+		pa_context_unref (my pulseAudio.context);
+		my pulseAudio.context = nullptr;
+	}
+	if (my pulseAudio.timer_event) {
+		my pulseAudio.mainloop_api -> time_free (my pulseAudio.timer_event);
+		my pulseAudio.timer_event = nullptr;
+	}
+	pa_threaded_mainloop_unlock (my pulseAudio.mainloop);
+	pa_threaded_mainloop_free (my pulseAudio.mainloop); // automatically frees the mainloop_api too!
+	my pulseAudio.mainloop = nullptr;
+	my pulseAudio.mainloop_api = nullptr;
+	my pulseAudio.r_usec = 0;
+	MelderAudio_isPlaying = false;
+	my pulseAudio.occupation = 0;
+	my pulseAudio.startTime = {0, 0};
+	my pulseAudio.pulseAudioInitialized = false;
+}
+
+void pulseAudio_server_info_cb (pa_context *context, const pa_server_info *info, void *userdata) {
+	struct MelderPlay *me = (struct MelderPlay *) userdata;
+	if (! info) {
+		return;
+	}
+	const pa_sample_spec *sp = & (info -> sample_spec);
+	long numberOfChannels = sp -> channels;
+	Melder_assert (context == my pulseAudio.context);
+	MelderInfo_open ();
+	MelderInfo_writeLine (U"PulseAudio Server characteristics:");
+	MelderInfo_writeLine (U"User name: ", Melder_peek8to32 (info -> user_name));
+	MelderInfo_writeLine (U"Host name: ", Melder_peek8to32 (info -> host_name));
+	MelderInfo_writeLine (U"Server version: ", Melder_peek8to32 (info -> server_version));
+	MelderInfo_writeLine (U"Server name: ", Melder_peek8to32 (info -> server_name));
+	MelderInfo_writeLine (U"Sample specification: ");
+		MelderInfo_writeLine (U"\tNumber of channels: ", numberOfChannels);
+		MelderInfo_writeLine (U"\tSampling frequency: ", sp->rate);
+		const char *sample_format_string = pa_sample_format_to_string (sp -> format);
+		MelderInfo_writeLine (U"\tSample format: ", Melder_peek8to32 (sample_format_string));
+	MelderInfo_writeLine (U"Default sink name: ", Melder_peek8to32 (info -> default_sink_name));
+	MelderInfo_writeLine (U"Default source name: ", Melder_peek8to32 (info -> default_source_name));
+	const pa_channel_map *cm = &(info -> channel_map);
+	MelderInfo_writeLine (U"Channel specification: ");
+	for (long channel = 1; channel <= cm -> channels; channel++) {
+		const char *channel_text = pa_channel_position_to_pretty_string (cm -> map[channel - 1]); // 0-..
+		MelderInfo_writeLine (U"\t Channel ", channel, U": ", Melder_peek8to32 (channel_text));
+	}
+	MelderInfo_close ();
+	trace (U"before signal");
+	my pulseAudio.occupation |= PA_INFO_FOUND;
+	 // We are done, signal it to pulseAudio_serverReport
+	pa_threaded_mainloop_signal (my pulseAudio.mainloop, 0);
+}
+
+void pulseAudio_serverReport () {
+	// TODO: initiaize context
+	struct MelderPlay *me = & thePlay;
+	if (my pulseAudio.mainloop) {
+		pa_threaded_mainloop_lock (my pulseAudio.mainloop);
+		my pulseAudio.occupation |= PA_INFO_GETTING;
+		if (my pulseAudio.context) {
+			pa_operation *operation = pa_context_get_server_info (my pulseAudio.context, pulseAudio_server_info_cb, me);
+			trace (U"operation started");
+			if (! operation) {
+				Melder_throw (U"pulseAudioServer report: ", Melder_peek8to32 (pa_strerror (pa_context_errno (my pulseAudio.context))));
+			}
+			while ((my pulseAudio.occupation & PA_INFO_FOUND) != PA_INFO_FOUND) {
+				pa_threaded_mainloop_wait (my pulseAudio.mainloop);
+			}
+			// Now it is save to unref because the server info operation has completed
+			pa_operation_unref (operation);
+			my pulseAudio.occupation ^= ~PA_INFO_FOUND;
+		}
+		my pulseAudio.occupation ^= ~PA_INFO_GETTING;
+		pa_threaded_mainloop_unlock (my pulseAudio.mainloop);
+	} else {
+		my pulseAudio.occupation |= PA_INFO_GETTING;
+		pulseAudio_initialize ();
+		/*
+		 * First acquire a lock because the operation to get server info (in context_state_cb) may not have started yet.
+		 * We therefore use our own signaling and wait until information has been acquired.
+		 */
+		pa_threaded_mainloop_lock (my pulseAudio.mainloop);
+
+		while ((my pulseAudio.occupation & PA_INFO_FOUND) != PA_INFO_FOUND) {
+			pa_threaded_mainloop_wait (my pulseAudio.mainloop);
+		}
+		// Now we know that the operation to get server info has succeeded!
+		pa_operation_unref (my pulseAudio.operation_info);
+		my pulseAudio.operation_info = nullptr;
+		my pulseAudio.occupation ^= ~PA_INFO_GETTING;
+		my pulseAudio.occupation ^= ~PA_INFO_FOUND;
+		pa_threaded_mainloop_unlock (my pulseAudio.mainloop);
+		if (! MelderAudio_isPlaying) {
+			my pulseAudio.occupation = 0;
+			trace (U"before cleanup");
+			pulseAudio_cleanup ();
+		}
+	}
+}
+
+void context_drain_complete_cb (pa_context *context, void *userdata) {
+	struct MelderPlay *me = (struct MelderPlay *) userdata;
+	Melder_assert (context == my pulseAudio.context);
+	if (context) {
+		trace (U"context exists");
+		pa_context_disconnect (my pulseAudio.context);
+		pa_context_unref (my pulseAudio.context);
+		my pulseAudio.context = nullptr;
+	}
+	trace (U"after context test");
+	pulseAudio_cleanup ();
+}
+
+void stream_drain_complete_cb (pa_stream *stream, int success, void *userdata) {
+	(void) stream;
+	struct MelderPlay *me = (struct MelderPlay *) userdata;
+	// Melder_assert (stream == my pulseAudio.stream); // not always true
+
+	trace (U"succes = ", success);
+	if (stream == my pulseAudio.stream) {
+		trace (U"stream exists");
+		pa_stream_disconnect (my pulseAudio.stream);
+		pa_stream_unref (my pulseAudio.stream);
+		my pulseAudio.stream = nullptr;
+		my pulseAudio.occupation ^= ~PA_WRITING;
+		my pulseAudio.occupation |= PA_WRITING_DONE;
+		MelderAudio_isPlaying = false;
+		if (my pulseAudio.timer_event) {
+			my pulseAudio.mainloop_api -> time_free (my pulseAudio.timer_event);
+			my pulseAudio.timer_event = nullptr;
+		}
+		pa_threaded_mainloop_signal (my pulseAudio.mainloop, 0);
+	} else {
+		trace (U"??");
+	}
+}
+
+static void free_cb(void *p) { // to prevent copying of data
+	(void) p;
+}
+// asynchronous version
+void stream_write_cb2 (pa_stream *stream, size_t length, void *userdata) {
+	struct MelderPlay *me = (struct MelderPlay *) userdata;
+	if (stream == my pulseAudio.stream) {
+		//length = my pulseAudio.latency; // overrule length given by server
+		long writeSize_samples = length / (2 * my numberOfChannels);
+		my samplesLeft = my numberOfSamples - my samplesSent;
+		trace (U"length = ", length, U" left = ", my samplesLeft);
+		MelderAudio_isPlaying = true;
+		if (my samplesLeft == my numberOfSamples) {
+			pa_gettimeofday (& my pulseAudio.startTime);
+		}
+		if (my samplesLeft > 0) {
+			if (my volatile_interrupted) {
+				my samplesPlayed = my numberOfSamples;
+				my samplesLeft = 0;
+				flush ();
+			} else {
+				writeSize_samples = my samplesLeft < writeSize_samples ? my samplesLeft : writeSize_samples;
+				if (pa_stream_write (stream, my buffer + my samplesSent * my numberOfChannels, 2 * writeSize_samples * my numberOfChannels, free_cb, 0, PA_SEEK_RELATIVE) < 0) {
+					 Melder_throw (U"pa_stream_write() failed: ", Melder_peek8to32 (pa_strerror (pa_context_errno (my pulseAudio.context))));
+				}
+				long samplesSent = writeSize_samples;
+				my samplesSent += samplesSent;
+				my samplesPlayed = my samplesSent; // not true: use timer info
+				trace (U"written ", samplesSent, U" (samples), total ", my samplesSent);
+				if (my samplesSent == my numberOfSamples) {
+					// my samplesLeft = 0; not here because still playing
+					trace (U"nothing left 1");
+					//pa_stream_set_write_callback(my pulseAudio.stream, nullptr, nullptr);
+					my pulseAudio.operation_drain = pa_stream_drain (my pulseAudio.stream, stream_drain_complete_cb, me);
+					if (! my pulseAudio.operation_drain) {
+						pa_stream_disconnect (my pulseAudio.stream);
+						pa_stream_unref (my pulseAudio.stream);
+						my pulseAudio.stream = nullptr;
+						trace (U"stream exists");
+						my pulseAudio.occupation ^= ~PA_WRITING;
+						my pulseAudio.occupation |= PA_WRITING_DONE;
+						pa_threaded_mainloop_signal (my pulseAudio.mainloop, 0);
+						if (my pulseAudio.timer_event) {
+							my pulseAudio.mainloop_api -> time_free (my pulseAudio.timer_event);
+							my pulseAudio.timer_event = nullptr;
+						}
+					}
+				}
+			}
+		} else {
+			trace (U"nothing left");
+		}
+	} else {
+		trace (U"stream?");
+	}
+}
+
+void stream_write_cb (pa_stream *stream, size_t length, void *userdata) {
+	struct MelderPlay *me = (struct MelderPlay *) userdata;
+	if (stream == my pulseAudio.stream) {
+		my samplesLeft = my numberOfSamples - my samplesSent;
+		trace (U"length = ", length, U", left = ", my samplesLeft);
+		if (my samplesLeft > 0) {
+			if (my samplesLeft == my numberOfSamples) {
+				pa_gettimeofday (& my pulseAudio.startTime);
+			}
+			if (my volatile_interrupted) {
+				my samplesPlayed = my numberOfSamples;
+				my samplesLeft = 0;
+				flush ();
+			} else {
+				int16_t *pa_buffer; // an internal pa buffer to minimize the number of memory transfers between client and server
+				size_t nbytes_left = my samplesLeft * my numberOfChannels * 2; // how many bytes do we still need to write ?
+				size_t nbytes = nbytes_left;
+				// returns the address of an internal buffer and the number of bytes that can maximally be written to it.
+				if (pa_stream_begin_write (stream, (void **) & pa_buffer, & nbytes) < 0) {
+					trace (U"error: no memory");
+				}
+				trace (U"buffer size = ", nbytes);
+				// do we need the full buffer space ?
+				nbytes = nbytes <= nbytes_left ? nbytes : nbytes_left;
+				memcpy (pa_buffer, (void *)(my buffer + my samplesSent * my numberOfChannels), nbytes);
+				//memset (pa_buffer, 0, nbytes);
+				
+				if (pa_stream_write (stream, pa_buffer, nbytes, nullptr, 0, PA_SEEK_RELATIVE) < 0) {
+					 Melder_throw (U"pa_stream_write() failed: ", Melder_peek8to32 (pa_strerror (pa_context_errno (my pulseAudio.context))));
+				}
+				Melder_assert (nbytes % (my numberOfChannels * 2) == 0);
+				long samplesSent = nbytes / (my numberOfChannels * 2);
+				my samplesSent += samplesSent;
+				my samplesPlayed = my samplesSent; // not true: use timer info
+				trace (U"written ", samplesSent, U" (samples), total ", my samplesSent, U", address = ", (long) pa_buffer);
+				if (my samplesSent == my numberOfSamples) {
+					// my samplesLeft = 0; not here because still playing
+					trace (U"nothing left 1");
+					pa_stream_set_write_callback (my pulseAudio.stream, nullptr, nullptr);
+					my pulseAudio.operation_drain = pa_stream_drain (my pulseAudio.stream, stream_drain_complete_cb, me);
+					if (! my pulseAudio.operation_drain) {
+						pa_stream_disconnect (my pulseAudio.stream);
+						pa_stream_unref (my pulseAudio.stream);
+						my pulseAudio.stream = nullptr;
+						trace (U"stream exists");
+						my pulseAudio.occupation ^= ~PA_WRITING;
+						my pulseAudio.occupation |= PA_WRITING_DONE;
+						pa_threaded_mainloop_signal (my pulseAudio.mainloop, 0);
+						if (my pulseAudio.timer_event) {
+							my pulseAudio.mainloop_api -> time_free (my pulseAudio.timer_event);
+							my pulseAudio.timer_event = nullptr;
+						}
+					}
+				}
+			}
+		} else {
+			trace (U"nothing left");
+		}
+	} else {
+		trace (U"stream?");
+	}
+}
+
+void stream_state_cb (pa_stream *stream, void *userdata) {
+	struct MelderPlay *me = (struct MelderPlay *) userdata;
+
+	if (stream == my pulseAudio.stream) {
+		switch (pa_stream_get_state (stream)) {
+			case PA_STREAM_UNCONNECTED:
+				trace (U"PA_STREAM_UNCONNECTED");
+				break;
+			case PA_STREAM_CREATING:
+				trace (U"PA_STREAM_CREATING");
+				break;
+			case PA_STREAM_TERMINATED:
+				trace (U"PA_STREAM_TERMINATED");
+				break;
+			case PA_STREAM_READY: {
+				const pa_buffer_attr* buffer_attr = pa_stream_get_buffer_attr (my pulseAudio.stream);
+				trace (U"PA_STREAM_READY : tlength = ", buffer_attr -> tlength, U", prebuf = ", buffer_attr -> prebuf, U", maxlength = ", buffer_attr -> maxlength);
+				break;
+			}
+			default:
+				trace (U"default");
+				break;
+			case PA_STREAM_FAILED:
+				trace (U"PA_STREAM_FAILED");
+				break;
+		}
+	}
+}
+
+static void stream_underflow_callback (pa_stream *s, void *userdata) {
+	(void) s;
+	(void) userdata;
+	trace (U"yes");
+}
+
+static void stream_overflow_callback(pa_stream *s, void *userdata) {
+	(void) s;
+	(void) userdata;
+	trace (U"yes");
+}
+
+void context_state_cb (pa_context *context, void *userdata) {
+	struct MelderPlay *me = (struct MelderPlay *) userdata;
+
+	pa_context_state context_state = pa_context_get_state (context);
+	switch (context_state) {
+		case PA_CONTEXT_UNCONNECTED:
+			trace (U"PA_CONTEXT_UNCONNECTED");
+			break;
+		case PA_CONTEXT_CONNECTING:
+			trace (U"PA_CONTEXT_CONNECTING");
+			break;
+		case PA_CONTEXT_AUTHORIZING:
+			trace (U"PA_CONTEXT_AUTHORIZING");
+			break;
+		case PA_CONTEXT_SETTING_NAME:
+			trace (U"PA_CONTEXT_SETTING_NAME");
+			break;
+		case PA_CONTEXT_FAILED:
+			trace (U"PA_CONTEXT_FAILED");
+			break;
+		case PA_CONTEXT_TERMINATED:
+			trace (U"PA_CONTEXT_TERMINATED");
+			break;
+		case PA_CONTEXT_READY: {
+			trace (U"PA_CONTEXT_READY");
+			if ((my pulseAudio.occupation & PA_INFO_GETTING) == PA_INFO_GETTING) {
+				my pulseAudio.operation_info = pa_context_get_server_info (my pulseAudio.context, pulseAudio_server_info_cb, me);
+				trace (U"operation started");
+				if (! my pulseAudio.operation_info) {
+					Melder_throw (U"pulseAudioServer report: ", Melder_peek8to32 (pa_strerror (pa_context_errno (my pulseAudio.context))));
+				}
+			} else if ((my pulseAudio.occupation & PA_WRITING) == PA_WRITING) {
+				#if __BYTE_ORDER == __BIG_ENDIAN
+					my pulseAudio.sample_spec.format = PA_SAMPLE_S16BE;
+				#else
+					my pulseAudio.sample_spec.format = PA_SAMPLE_S16LE;
+				#endif
+				my samplesPlayed = my samplesSent = 0;
+				my pulseAudio.sample_spec.rate = my sampleRate;
+				my pulseAudio.sample_spec.channels = my numberOfChannels;
+				my pulseAudio.stream = pa_stream_new (my pulseAudio.context, "Praat", &(my pulseAudio.sample_spec), nullptr);
+				if (! my pulseAudio.stream) {
+					Melder_throw (U"Cannot connect to sound server: ", Melder_peek8to32 (pa_strerror (pa_context_errno (my pulseAudio.context))));
+				}
+
+				//my pulseAudio.stream_flags = PA_STREAM_NOFLAGS;
+				my pulseAudio.stream_flags = (pa_stream_flags_t) (PA_STREAM_ADJUST_LATENCY | PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE);
+				my pulseAudio.latency = pa_usec_to_bytes (1000 * my pulseAudio.latency_msec, &(my pulseAudio.sample_spec));
+				
+				my pulseAudio.buffer_attr.maxlength = (uint32_t) -1;
+				my pulseAudio.buffer_attr.prebuf = (uint32_t) -1;
+				my pulseAudio.buffer_attr.minreq = (uint32_t) -1;
+				my pulseAudio.buffer_attr.prebuf = (uint32_t) -1;
+				my pulseAudio.buffer_attr.tlength = my pulseAudio.latency;
+				my pulseAudio.buffer_attr.fragsize = (uint32_t) -1;
+
+				pa_stream_set_state_callback (my pulseAudio.stream, stream_state_cb, me);
+				pa_stream_set_write_callback (my pulseAudio.stream, stream_write_cb, me);
+			    pa_stream_set_underflow_callback (my pulseAudio.stream, stream_underflow_callback, me);
+			    pa_stream_set_overflow_callback (my pulseAudio.stream, stream_overflow_callback, me);
+				
+				// BUG in pa 5.9  & 6.0: the server doesn't honour our wish for a reasonable tlength. Instead it uses some
+				//   ridiculously low value for tlength that will constantly give underflows.
+				//   audio playback was completely shit if in the stream_write_cb we used pa_stream_write instead of
+				// first pa_stream_begin_write followed by pa_stream_write.
+				//
+				my pulseAudio.stream_flags = PA_STREAM_NOFLAGS;
+				if (pa_stream_connect_playback (my pulseAudio.stream, nullptr, &(my pulseAudio.buffer_attr), my pulseAudio.stream_flags, nullptr, nullptr) < 0) {
+					Melder_throw (U"pa_stream_connect_playback() failed: ", Melder_peek8to32 (pa_strerror (pa_context_errno (my pulseAudio.context))));
+				}
+				trace (U"tlength = ", my pulseAudio.buffer_attr.tlength, U", channels = ", my numberOfChannels);
+			}
+			break;
+		}
+		default:
+			trace (U"default");
+			break;
+	}
+}
+#endif
+
 void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples, int numberOfChannels,
 	bool (*playCallback) (void *playClosure, long numberOfSamplesPlayed), void *playClosure)
 {
@@ -509,6 +1012,11 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 		bool wasPlaying = MelderAudio_isPlaying;
 	#endif
 	if (MelderAudio_isPlaying) MelderAudio_stopPlaying (MelderAudio_IMPLICIT);   // otherwise, keep "explicitStop" tag
+	#ifdef HAVE_PULSEAUDIO
+		if (my usePulseAudio && my pulseAudio.mainloop) {
+			pulseAudio_cleanup ();
+		}
+	#endif
 	my buffer = buffer;
 	my sampleRate = sampleRate;
 	my numberOfSamples = numberOfSamples;
@@ -521,8 +1029,17 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 		kMelder_asynchronicityLevel_ASYNCHRONOUS;
 	if (my asynchronicity > preferences. maximumAsynchronicity)
 		my asynchronicity = preferences. maximumAsynchronicity;
-	trace ("asynchronicity %d", (int) my asynchronicity);
-	my usePortAudio = preferences. outputUsesPortAudio;
+	trace (U"asynchronicity ", my asynchronicity);
+	my usePortAudio =
+		#if defined (_WIN32)
+			preferences. outputSoundSystem == kMelder_outputSoundSystem_MME_VIA_PORTAUDIO;
+		#elif defined (macintosh)
+			preferences. outputSoundSystem == kMelder_outputSoundSystem_COREAUDIO_VIA_PORTAUDIO;
+		#else
+			preferences. outputSoundSystem == kMelder_outputSoundSystem_ALSA_VIA_PORTAUDIO;
+		#endif
+	my usePulseAudio = ! my usePortAudio;
+
 	my explicitStop = MelderAudio_IMPLICIT;
 	my fakeMono = false;
 	my volatile_interrupted = 0;
@@ -536,14 +1053,14 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 		static bool paInitialized = false;
 		if (! paInitialized) {
 			err = Pa_Initialize ();
-			if (err) Melder_fatal ("PortAudio does not initialize: %s", Pa_GetErrorText (err));
+			if (err) Melder_fatal (U"PortAudio does not initialize: ", Melder_peek8to32 (Pa_GetErrorText (err)));
 			paInitialized = true;
 		}
 		my supports_paComplete = Pa_GetHostApiInfo (Pa_GetDefaultHostApi ()) -> type != paDirectSound &&false;
 		PaStreamParameters outputParameters = { 0 };
 		outputParameters. device = Pa_GetDefaultOutputDevice ();
 		const PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo (outputParameters. device);
-		trace ("the device can handle %d channels", (int) deviceInfo -> maxOutputChannels);
+		trace (U"the device can handle ", deviceInfo -> maxOutputChannels, U" channels");
 		if (my numberOfChannels > deviceInfo -> maxOutputChannels) {
 			my numberOfChannels = deviceInfo -> maxOutputChannels;
 		}
@@ -576,14 +1093,14 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 		}
 		outputParameters. channelCount = my numberOfChannels;
 		outputParameters. sampleFormat = paInt16;
-		if (deviceInfo != NULL) outputParameters. suggestedLatency = deviceInfo -> defaultLowOutputLatency;
-		outputParameters. hostApiSpecificStreamInfo = NULL;
-		err = Pa_OpenStream (& my stream, NULL, & outputParameters, my sampleRate, paFramesPerBufferUnspecified,
+		if (deviceInfo) outputParameters. suggestedLatency = deviceInfo -> defaultLowOutputLatency;
+		outputParameters. hostApiSpecificStreamInfo = nullptr;
+		err = Pa_OpenStream (& my stream, nullptr, & outputParameters, my sampleRate, paFramesPerBufferUnspecified,
 			paDitherOff, thePaStreamCallback, me);
-		if (err) Melder_throw ("PortAudio cannot open sound output: ", Pa_GetErrorText (err), ".");
+		if (err) Melder_throw (U"PortAudio cannot open sound output: ", Melder_peek8to32 (Pa_GetErrorText (err)), U".");
 		theStartingTime = Melder_clock ();
 		err = Pa_StartStream (my stream);
-		if (err) Melder_throw ("PortAudio cannot start sound output: ", Pa_GetErrorText (err), ".");
+		if (err) Melder_throw (U"PortAudio cannot start sound output: ", Melder_peek8to32 (Pa_GetErrorText (err)), U".");
 		my paStartingTime = Pa_GetStreamTime (my stream);
 		if (my asynchronicity <= kMelder_asynchronicityLevel_INTERRUPTABLE) {
 			for (;;) {
@@ -600,7 +1117,7 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 					 * A version that doesn't trust that the stream callback will complete.
 					 */
 					double timeElapsed = Melder_clock () - theStartingTime - Pa_GetStreamInfo (my stream) -> outputLatency;
-					long samplesPlayed = timeElapsed * my sampleRate;
+					long samplesPlayed = (long) floor (timeElapsed * my sampleRate);
 					if (samplesPlayed >= my numberOfSamples + my sampleRate / 20) {
 						my samplesPlayed = my numberOfSamples;
 						break;
@@ -654,26 +1171,57 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 				Pa_Sleep (10);
 			}
 			if (my samplesPlayed != my numberOfSamples) {
-				Melder_fatal ("Played %ld instead of %ld samples.", my samplesPlayed, my numberOfSamples);
+				Melder_fatal (U"Played ", my samplesPlayed, U" instead of ", my numberOfSamples, U" samples.");
 			}
 			#ifndef linux
 				Pa_AbortStream (my stream);
 			#endif
 		} else /* my asynchronicity == kMelder_asynchronicityLevel_ASYNCHRONOUS */ {
 			#if cocoa
-				CFRunLoopTimerContext context = { 0, NULL, NULL, NULL, NULL };
-				my cocoaTimer = CFRunLoopTimerCreate (NULL, CFAbsoluteTimeGetCurrent () + 0.02,
+				CFRunLoopTimerContext context = { 0, nullptr, nullptr, nullptr, nullptr };
+				my cocoaTimer = CFRunLoopTimerCreate (nullptr, CFAbsoluteTimeGetCurrent () + 0.02,
 					0.02, 0, 0, workProc_cocoa, & context);
 				CFRunLoopAddTimer (CFRunLoopGetCurrent (), my cocoaTimer, kCFRunLoopCommonModes);
 			#elif motif
-				my workProcId_motif = GuiAddWorkProc (workProc_motif, NULL);
+				my workProcId_motif = GuiAddWorkProc (workProc_motif, nullptr);
 			#elif gtk
-				my workProcId_gtk = g_idle_add (workProc_gtk, NULL);
+				trace (U"g_idle_add");
+				my workProcId_gtk = g_idle_add (workProc_gtk, nullptr);
 			#endif
 			return;
 		}
 		flush ();
 		return;
+	#ifdef HAVE_PULSEAUDIO
+	} if (my usePulseAudio) {
+		my pulseAudio.occupation |= PA_WRITING;
+		pulseAudio_initialize ();
+		if (my asynchronicity < kMelder_asynchronicityLevel_ASYNCHRONOUS) {
+			pa_threaded_mainloop_lock (my pulseAudio.mainloop);
+			trace (U"occupation ", my pulseAudio.occupation);
+			while ((my pulseAudio.occupation & PA_WRITING_DONE) != PA_WRITING_DONE) {
+				trace (U"waiting");
+				pa_threaded_mainloop_wait (my pulseAudio.mainloop);
+			}
+			// Now we know that the stream drain operation has succeeded !
+			if (my pulseAudio.operation_drain) {
+				pa_operation_unref (my pulseAudio.operation_drain);
+			}
+			my pulseAudio.operation_drain = nullptr;
+			my pulseAudio.occupation ^= ~PA_WRITING_DONE;
+
+			pa_threaded_mainloop_unlock (my pulseAudio.mainloop);
+			//pa_threaded_mainloop_accept (my pulseAudio.mainloop);
+			trace (U"before cleanup");
+			pulseAudio_cleanup ();
+		} else {
+			// my workProcId_gtk = g_timeout_add (ms, workProc_gtk, nullptr);
+			// without a timer, on my computer the workproc would be called almost once in every sampling period.
+			// Such frequent updates are not necessary, some 50 updates a second is fast enough for displayong a runnning cursor
+			// the timeout will be automatically stopped if workProc_gtk returns false.
+			my workProcId_gtk = g_timeout_add (20, workProc_gtk, nullptr);
+		}
+	#endif
 	} else {
 		#if defined (macintosh)
 		#elif defined (linux)
@@ -686,15 +1234,15 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 				#endif
 				/* O_NDELAY option added by Rafael Laboissiere, May 19, 2005 */
 				if ((my audio_fd = open ("/dev/dsp", O_WRONLY | (Melder_debug == 16 ? 0 : O_NDELAY))) == -1) {
-					Melder_throw (errno == EBUSY ? "Audio device already in use." :
-						"Cannot open audio device.\nPlease switch on PortAudio in Praat's Sound Playing Preferences.");
+					Melder_throw (errno == EBUSY ? U"Audio device already in use." :
+						U"Cannot open audio device.\nPlease switch on PortAudio in Praat's Sound Playing Preferences.");
 				}
 				fcntl (my audio_fd, F_SETFL, 0);   /* Added by Rafael Laboissiere, May 19, 2005 */
-				if (ioctl (my audio_fd, SNDCTL_DSP_SETFMT,   /* Changed SND_DSP_SAMPLESIZE to SNDCTL_DSP_SETFMT; Stefan de Konink, Nov 29, 2007 */
-					(my val = fmt, & my val)) == -1 ||   /* Error? */
-					my val != fmt)   /* Has sound card overridden our sample size? */
+				if (ioctl (my audio_fd, SNDCTL_DSP_SETFMT,   // changed SND_DSP_SAMPLESIZE to SNDCTL_DSP_SETFMT; Stefan de Konink, Nov 29, 2007
+					(my val = fmt, & my val)) == -1 ||   // error?
+					my val != fmt)   // has sound card overridden our sample size?
 				{
-					Melder_throw ("Cannot set sample size to 16 bit.");
+					Melder_throw (U"Cannot set sample size to 16 bit.");
 				}
 				if (ioctl (my audio_fd, SNDCTL_DSP_CHANNELS, (my val = my numberOfChannels, & my val)) == -1 ||   /* Error? */
 					my val != my numberOfChannels)   /* Has sound card overridden our number of channels? */
@@ -713,27 +1261,27 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 						my buffer = newBuffer;
 						my numberOfChannels = 2;
 					} else {
-						Melder_throw ("Cannot set number of channels to .", my numberOfChannels, ".");
+						Melder_throw (U"Cannot set number of channels to .", my numberOfChannels, U".");
 					}
 				}
 				if (ioctl (my audio_fd, SNDCTL_DSP_SPEED, (my val = my sampleRate, & my val)) == -1 ||    // error?
-					my val != my sampleRate)   /* Has sound card overridden our sampling frequency? */
+					my val != my sampleRate)   // has sound card overridden our sampling frequency?
 				{
-					Melder_throw ("Cannot set sampling frequency to ", my sampleRate, " Hz.");
+					Melder_throw (U"Cannot set sampling frequency to ", my sampleRate, U" Hz.");
 				}
 
 				theStartingTime = Melder_clock ();
 				if (my asynchronicity == kMelder_asynchronicityLevel_SYNCHRONOUS) {
 					if (write (my audio_fd, & my buffer [0], 2 * numberOfChannels * numberOfSamples) == -1)
-						Melder_throw ("Cannot write audio output.");
-					close (my audio_fd), my audio_fd = 0;   /* Drain. Set to zero in order to notify flush (). */
+						Melder_throw (U"Cannot write audio output.");
+					close (my audio_fd), my audio_fd = 0;   // drain; set to zero in order to notify flush ()
 					my samplesPlayed = my numberOfSamples;
 				} else if (my asynchronicity <= kMelder_asynchronicityLevel_INTERRUPTABLE) {
 					bool interrupted = false;
 					while (my samplesLeft && ! interrupted) {
 						int dsamples = my samplesLeft > 500 ? 500 : my samplesLeft;
 						if (write (my audio_fd, (char *) & my buffer [my samplesSent * my numberOfChannels], 2 * dsamples * my numberOfChannels) == -1)
-							Melder_throw ("Cannot write audio output.");
+							Melder_throw (U"Cannot write audio output.");
 						my samplesLeft -= dsamples;
 						my samplesSent += dsamples;
 						my samplesPlayed = (Melder_clock () - theStartingTime) * my sampleRate;
@@ -749,17 +1297,17 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 					}
 				} else /* my asynchronicity == kMelder_asynchronicityLevel_ASYNCHRONOUS */ {
 					#ifndef NO_GRAPHICS
-						my workProcId_gtk = g_idle_add (workProc_gtk, NULL);
+						my workProcId_gtk = g_idle_add (workProc_gtk, nullptr);
 					#endif
 					return;
 				}
 				flush ();
 				return;
 			} catch (MelderError) {
-				struct MelderPlay *me = & thePlay;
+			//struct MelderPlay *me = & thePlay;
 				if (my audio_fd) close (my audio_fd), my audio_fd = 0;
 				MelderAudio_isPlaying = false;
-				Melder_throw ("16-bit audio not played.");
+				Melder_throw (U"16-bit audio not played.");
 			}
 		#elif defined (_WIN32)
 			try {
@@ -776,14 +1324,14 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 				if (err != MMSYSERR_NOERROR) {
 					MelderAudio_isPlaying = false;
 					if (err == MMSYSERR_ALLOCATED)
-						Melder_throw ("Previous sound is still playing? Should not occur!\n"
-							"Report bug to the author: ", err, "; wasPlaying: ", wasPlaying, ".");
+						Melder_throw (U"Previous sound is still playing? Should not occur!\n"
+							U"Report bug to the author: ", err, U"; wasPlaying: ", wasPlaying, U".");
 					if (err == MMSYSERR_BADDEVICEID)
-						Melder_throw ("Cannot play a sound. Perhaps another program is playing a sound at the same time?");
+						Melder_throw (U"Cannot play a sound. Perhaps another program is playing a sound at the same time?");
 					if (err == MMSYSERR_NODRIVER)
-						Melder_throw ("This computer probably has no sound card.");
+						Melder_throw (U"This computer probably has no sound card.");
 					if (err == MMSYSERR_NOMEM)
-						Melder_throw ("Not enough free memory to play any sound at all.");
+						Melder_throw (U"Not enough free memory to play any sound at all.");
 					if (err == WAVERR_BADFORMAT) {
 						if (my numberOfChannels > 2) {
 							/*
@@ -795,13 +1343,13 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 							waveFormat. nAvgBytesPerSec = waveFormat. nBlockAlign * waveFormat. nSamplesPerSec;
 							err = waveOutOpen (& my hWaveOut, WAVE_MAPPER, & waveFormat, 0, 0, CALLBACK_NULL | WAVE_ALLOWSYNC);
 							if (err != MMSYSERR_NOERROR)
-								Melder_throw ("Bad sound format even after reduction to 2 channels? Should not occur! Report bug to the author!");
+								Melder_throw (U"Bad sound format even after reduction to 2 channels? Should not occur! Report bug to the author!");
 							MelderAudio_isPlaying = true;
 						} else {
-							Melder_throw ("Bad sound format? Should not occur! Report bug to the author!");
+							Melder_throw (U"Bad sound format? Should not occur! Report bug to the author!");
 						}
 					} else {
-						Melder_throw ("Unknown error ", err, " while trying to play a sound? Report bug to the author!");
+						Melder_throw (U"Unknown error ", err, U" while trying to play a sound? Report bug to the author!");
 					}
 				}
 				if (numberOfChannels > my numberOfChannels) {
@@ -836,7 +1384,7 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 				my waveHeader. lpData = (char *) my buffer;
 				my waveHeader. dwBufferLength = my numberOfSamples * 2 * my numberOfChannels;
 				my waveHeader. dwLoops = 1;
-				my waveHeader. lpNext = NULL;
+				my waveHeader. lpNext = nullptr;
 				my waveHeader. reserved = 0;
 				err = waveOutPrepareHeader (my hWaveOut, & my waveHeader, sizeof (WAVEHDR));
 			//waveOutReset (my hWaveOut);
@@ -844,13 +1392,13 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 					waveOutClose (my hWaveOut), my hWaveOut = 0;
 					MelderAudio_isPlaying = false;
 					if (err == MMSYSERR_INVALHANDLE)
-						Melder_throw ("No device? Should not occur!");
+						Melder_throw (U"No device? Should not occur!");
 					if (err == MMSYSERR_NODRIVER)
-						Melder_throw ("No driver? Should not occur!");
+						Melder_throw (U"No driver? Should not occur!");
 					if (err == MMSYSERR_NOMEM)
-						Melder_throw ("Not enough free memory to play this sound.\n"
-							"Remove some objects, play a shorter sound, or buy more memory.");
-					Melder_throw ("Unknown error ", err, " while preparing header? Should not occur!");
+						Melder_throw (U"Not enough free memory to play this sound.\n"
+							U"Remove some objects, play a shorter sound, or buy more memory.");
+					Melder_throw (U"Unknown error ", err, U" while preparing header? Should not occur!");
 				}
 
 				err = waveOutWrite (my hWaveOut, & my waveHeader, sizeof (WAVEHDR));
@@ -859,7 +1407,7 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 					waveOutUnprepareHeader (my hWaveOut, & my waveHeader, sizeof (WAVEHDR));
 					waveOutClose (my hWaveOut), my hWaveOut = 0;
 					MelderAudio_isPlaying = false;
-					Melder_throw ("Error ", err, " while writing audio output.");   // BUG: should flush
+					Melder_throw (U"Error ", err, U" while writing audio output.");   // BUG: should flush
 				}
 
 				theStartingTime = Melder_clock ();
@@ -885,16 +1433,16 @@ void MelderAudio_play16 (int16_t *buffer, long sampleRate, long numberOfSamples,
 						}
 					}
 				} else {
-					my workProcId_motif = GuiAddWorkProc (workProc_motif, NULL);
+					my workProcId_motif = GuiAddWorkProc (workProc_motif, nullptr);
 					return;
 				}
 				flush ();
 				return;
 			} catch (MelderError) {
-				Melder_throw ("16-bit audio not played.");
+				Melder_throw (U"16-bit audio not played.");
 			}
 		#else
-			Melder_throw ("Cannot play a sound on this computer.\n16-bit audio not played.");
+			Melder_throw (U"Cannot play a sound on this computer.\n16-bit audio not played.");
 		#endif
 	}
 }
diff --git a/sys/melder_audiofiles.cpp b/sys/melder_audiofiles.cpp
index 34d49d1..f952493 100644
--- a/sys/melder_audiofiles.cpp
+++ b/sys/melder_audiofiles.cpp
@@ -66,7 +66,7 @@
 void MelderFile_writeAudioFileHeader (MelderFile file, int audioFileType, long sampleRate, long numberOfSamples, int numberOfChannels, int numberOfBitsPerSamplePoint) {
 	try {
 		FILE *f = file -> filePointer;
-		if (f == NULL) return;
+		if (! f) return;
 		const int numberOfBytesPerSamplePoint = (numberOfBitsPerSamplePoint + 7) / 8;
 		switch (audioFileType) {
 			case Melder_AIFF: {
@@ -74,17 +74,17 @@ void MelderFile_writeAudioFileHeader (MelderFile file, int audioFileType, long s
 					long dataSize = numberOfSamples * numberOfBytesPerSamplePoint * numberOfChannels;
 
 					/* Form Chunk: contains all other chunks. */
-					if (fwrite ("FORM", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the FORM statement.");
+					if (fwrite ("FORM", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the FORM statement.");
 					binputi4 (4 + (8 + 4) + (8 + 18) + (8 + 8 + dataSize), f);   // the size of the Form Chunk
-					if (fwrite ("AIFF", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the AIFF file type.");
+					if (fwrite ("AIFF", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the AIFF file type.");
 
 					/* Format Version Chunk: 8 + 4 bytes. */
-					if (fwrite ("FVER", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the FVER statement.");
+					if (fwrite ("FVER", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the FVER statement.");
 					binputu4 (4, f);   // the size of what follows
 					binputu4 (0xA2805140, f);   // time of version
 
 					/* Common Chunk: 8 + 18 bytes. */
-					if (fwrite ("COMM", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the COMM statement.");
+					if (fwrite ("COMM", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the COMM statement.");
 					binputi4 (18, f);   // the size of what follows
 					binputi2 (numberOfChannels, f);
 					binputi4 (numberOfSamples, f);
@@ -92,12 +92,12 @@ void MelderFile_writeAudioFileHeader (MelderFile file, int audioFileType, long s
 					binputr10 (sampleRate, f);
 
 					/* Sound Data Chunk: 8 + 8 bytes + samples. */
-					if (fwrite ("SSND", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the SSND statement.");
+					if (fwrite ("SSND", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the SSND statement.");
 					binputi4 (8 + dataSize, f);   // the size of what follows
 					binputi4 (0, f);   // offset
 					binputi4 (0, f);   // block size
 				} catch (MelderError) {
-					Melder_throw ("AIFF header not written.");
+					Melder_throw (U"AIFF header not written.");
 				}
 			} break;
 			case Melder_AIFC: {
@@ -105,32 +105,32 @@ void MelderFile_writeAudioFileHeader (MelderFile file, int audioFileType, long s
 					long dataSize = numberOfSamples * numberOfBytesPerSamplePoint * numberOfChannels;
 
 					/* Form Chunk: contains all other chunks. */
-					if (fwrite ("FORM", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the FORM statement.");
+					if (fwrite ("FORM", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the FORM statement.");
 					binputi4 (4 + (8 + 4) + (8 + 24) + (8 + 8 + dataSize), f);   // the size of the Form Chunk
-					if (fwrite ("AIFC", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the AIFC file type.");
+					if (fwrite ("AIFC", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the AIFC file type.");
 
 					/* Format Version Chunk: 8 + 4 bytes. */
-					if (fwrite ("FVER", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the FVER statement.");
+					if (fwrite ("FVER", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the FVER statement.");
 					binputu4 (4, f);   // the size of what follows
 					binputu4 (0xA2805140, f);   // time of version
 
 					/* Common Chunk: 8 + 24 bytes. */
-					if (fwrite ("COMM", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the COMM statement.");
+					if (fwrite ("COMM", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the COMM statement.");
 					binputi4 (24, f);   // the size of what follows
 					binputi2 (numberOfChannels, f);
 					binputi4 (numberOfSamples, f);
 					binputi2 (numberOfBitsPerSamplePoint, f);
 					binputr10 (sampleRate, f);
-					if (fwrite ("NONE", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the compression type.");
+					if (fwrite ("NONE", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the compression type.");
 					binputi2 (0, f);   // name of compression
 
 					/* Sound Data Chunk: 8 + 8 bytes + samples. */
-					if (fwrite ("SSND", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the SSND statement.");
+					if (fwrite ("SSND", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the SSND statement.");
 					binputi4 (8 + dataSize, f);   // the size of what follows
 					binputi4 (0, f);   // offset
 					binputi4 (0, f);   // block size
 				} catch (MelderError) {
-					Melder_throw ("AIFC header not written.");
+					Melder_throw (U"AIFC header not written.");
 				}
 			} break;
 			case Melder_WAV: {
@@ -142,20 +142,20 @@ void MelderFile_writeAudioFileHeader (MelderFile file, int audioFileType, long s
 					const int formatSize = needExtensibleFormat ? 40 : 16;
 					double dataSize_f = (double) numberOfSamples * (double) numberOfBytesPerSamplePoint * (double) numberOfChannels;
 					if (dataSize_f > INT54_MAX)
-						Melder_throw ("Cannot save data over the 9-petabyte limit.");
-					int64_t dataSize = (int64_t) dataSize_f;
+						Melder_throw (U"Cannot save data over the 9-petabyte limit.");
+					int64 dataSize = (int64) dataSize_f;
 
 					/* RIFF Chunk: contains all other chunks. */
-					if (fwrite ("RIFF", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the RIFF statement.");
-					int64_t sizeOfRiffChunk_i64 = 4 + (12 + formatSize) + (4 + dataSize);
+					if (fwrite ("RIFF", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the RIFF statement.");
+					int64 sizeOfRiffChunk_i64 = 4 + (12 + formatSize) + (4 + dataSize);
 					if (sizeOfRiffChunk_i64 > UINT32_MAX)
-						Melder_throw ("Cannot save a WAV file with more than ", UINT32_MAX, " bytes.");
+						Melder_throw (U"Cannot save a WAV file with more than ", UINT32_MAX, U" bytes.");
 					uint32_t sizeOfRiffChunk_u32 = (uint32_t) sizeOfRiffChunk_i64;
 					binputu4LE (sizeOfRiffChunk_u32, f);
-					if (fwrite ("WAVE", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the WAV file type.");
+					if (fwrite ("WAVE", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the WAV file type.");
 
 					/* Format Chunk: if 16-bits audio, then 8 + 16 bytes; else 8 + 40 bytes. */
-					if (fwrite ("fmt ", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the FMT statement.");
+					if (fwrite ("fmt ", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the FMT statement.");
 					binputi4LE (formatSize, f);
 					binputi2LE (needExtensibleFormat ? WAVE_FORMAT_EXTENSIBLE : WAVE_FORMAT_PCM, f);
 					binputi2LE (numberOfChannels, f);
@@ -169,19 +169,19 @@ void MelderFile_writeAudioFileHeader (MelderFile file, int audioFileType, long s
 						binputi4LE (0, f);   // speaker position mask
 						binputi2LE (WAVE_FORMAT_PCM, f);
 						if (fwrite ("\x00\x00\x00\x00\x10\x00\x80\x00\x00\xAA\x00\x38\x9B\x71",
-							1, 14, f) != 14) Melder_throw ("Error in file while trying to write the subformat.");
+							1, 14, f) != 14) Melder_throw (U"Error in file while trying to write the subformat.");
 					}
 
 					/* Data Chunk: 8 bytes + samples. */
-					if (fwrite ("data", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the DATA statement.");
+					if (fwrite ("data", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the DATA statement.");
 					binputi4LE (dataSize, f);
 				} catch (MelderError) {
-					Melder_throw ("WAV header not written.");
+					Melder_throw (U"WAV header not written.");
 				}
 			} break;
 			case Melder_NEXT_SUN: {
 				try {
-					if (fwrite (".snd", 1, 4, f) != 4) Melder_throw ("Error in file while trying to write the .snd file type tag.");
+					if (fwrite (".snd", 1, 4, f) != 4) Melder_throw (U"Error in file while trying to write the .snd file type tag.");
 					binputi4 (32, f);   // length of header
 					binputi4 (numberOfSamples * 2 * numberOfChannels, f);   // length of data
 					binputi4 (3, f);   // 16-bits linear, not mu-law or A-law
@@ -190,7 +190,7 @@ void MelderFile_writeAudioFileHeader (MelderFile file, int audioFileType, long s
 					binputi4 (0, f);
 					binputi4 (0, f);
 				} catch (MelderError) {
-					Melder_throw ("NeXT/Sun header not written.");
+					Melder_throw (U"NeXT/Sun header not written.");
 				}
 			} break;
 			case Melder_NIST: {
@@ -207,36 +207,36 @@ void MelderFile_writeAudioFileHeader (MelderFile file, int audioFileType, long s
 						"sample_min -i -32768\n"
 						"sample_max -i 32767\n"
 						"end_head\n", numberOfChannels, numberOfSamples, numberOfBytesPerSamplePoint, sampleRate);
-					if (fwrite (header, 1, 1024, f) != 1024) Melder_throw ("Error in file while trying to write the NIST header.");
+					if (fwrite (header, 1, 1024, f) != 1024) Melder_throw (U"Error in file while trying to write the NIST header.");
 				} catch (MelderError) {
-					Melder_throw ("NIST header not written.");
+					Melder_throw (U"NIST header not written.");
 				}
 			} break;
 			case Melder_FLAC: {
 				try {
-					FLAC__StreamEncoder *encoder = NULL;
+					FLAC__StreamEncoder *encoder = nullptr;
 					if (numberOfChannels > (int) FLAC__MAX_CHANNELS)
-						Melder_throw ("FLAC files cannot have more than 8 channels.");
-					if ((encoder = FLAC__stream_encoder_new ()) == NULL)
-						Melder_throw ("Error creating FLAC stream encoder.");
+						Melder_throw (U"FLAC files cannot have more than 8 channels.");
+					if ((encoder = FLAC__stream_encoder_new ()) == nullptr)
+						Melder_throw (U"Error creating FLAC stream encoder.");
 					FLAC__stream_encoder_set_bits_per_sample (encoder, numberOfBitsPerSamplePoint);
 					FLAC__stream_encoder_set_channels (encoder, numberOfChannels);
 					FLAC__stream_encoder_set_sample_rate (encoder, sampleRate);
 					FLAC__stream_encoder_set_total_samples_estimate (encoder, numberOfSamples);
-					if (FLAC__stream_encoder_init_FILE (encoder, file -> filePointer, NULL, NULL) != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
+					if (FLAC__stream_encoder_init_FILE (encoder, file -> filePointer, nullptr, nullptr) != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
 						FLAC__stream_encoder_delete (encoder);
-						Melder_throw ("Error creating FLAC stream encoder");
+						Melder_throw (U"Error creating FLAC stream encoder");
 					}
 					file -> flacEncoder = encoder;   // only after we know it's correct (for MelderFile_close)
 					file -> outputEncoding = kMelder_textOutputEncoding_FLAC;   // only after we know it's correct (for MelderFile_close)
 				} catch (MelderError) {
-					Melder_throw ("FLAC header not written.");
+					Melder_throw (U"FLAC header not written.");
 				}
 			} break;
-			default: Melder_throw ("Unknown audio file type ", audioFileType, ".");
+			default: Melder_throw (U"Unknown audio file type ", audioFileType, U".");
 		}
 	} catch (MelderError) {
-		Melder_throw ("16-bit audio file header not written.");
+		Melder_throw (U"16-bit audio file header not written.");
 	}
 }
 
@@ -252,12 +252,12 @@ void MelderFile_writeAudioFileTrailer (MelderFile file, int audioFileType, long
 		binputi1 (0, file -> filePointer);
 }
 
-static const wchar_t *audioFileTypeString [] = { L"none", L"AIFF", L"AIFC", L"WAV", L"NeXT/Sun", L"NIST", L"FLAC", L"MP3" };
-const wchar_t * Melder_audioFileTypeString (int audioFileType) { return audioFileType > Melder_NUMBER_OF_AUDIO_FILE_TYPES ? L"unknown" : audioFileTypeString [audioFileType]; }
-static const wchar_t *macAudioFileType [1+Melder_NUMBER_OF_AUDIO_FILE_TYPES]
-	= { L"", L"AIFF", L"AIFC", L"WAVE", L"ULAW", L"NIST", L"FLAC", L"MP3" };
-static const wchar_t *winAudioFileExtension [1+Melder_NUMBER_OF_AUDIO_FILE_TYPES]
-	= { L"", L".aiff", L".aifc", L".wav", L".au", L".nist", L".flac", L".mp3" };
+static const char32 *audioFileTypeString [] = { U"none", U"AIFF", U"AIFC", U"WAV", U"NeXT/Sun", U"NIST", U"FLAC", U"MP3" };
+const char32 * Melder_audioFileTypeString (int audioFileType) { return audioFileType > Melder_NUMBER_OF_AUDIO_FILE_TYPES ? U"unknown" : audioFileTypeString [audioFileType]; }
+static const char32 *macAudioFileType [1+Melder_NUMBER_OF_AUDIO_FILE_TYPES]
+	= { U"", U"AIFF", U"AIFC", U"WAVE", U"ULAW", U"NIST", U"FLAC", U"MP3" };
+static const char32 *winAudioFileExtension [1+Melder_NUMBER_OF_AUDIO_FILE_TYPES]
+	= { U"", U".aiff", U".aifc", U".wav", U".au", U".nist", U".flac", U".mp3" };
 static int defaultAudioFileEncoding16 [1+Melder_NUMBER_OF_AUDIO_FILE_TYPES]
 	= { 0, Melder_LINEAR_16_BIG_ENDIAN, Melder_LINEAR_16_BIG_ENDIAN, Melder_LINEAR_16_LITTLE_ENDIAN,
 	     Melder_LINEAR_16_BIG_ENDIAN, Melder_LINEAR_16_LITTLE_ENDIAN,
@@ -285,7 +285,7 @@ void MelderFile_writeAudioFile (MelderFile file, int audioFileType, const short
 		MelderFile_writeAudioFileTrailer (file, audioFileType, sampleRate, numberOfSamples, numberOfChannels, numberOfBitsPerSamplePoint);
 		mfile.close ();
 	} catch (MelderError) {
-		Melder_throw ("16-bit audio file not written.");
+		Melder_throw (U"16-bit audio file not written.");
 	}
 }
 
@@ -380,11 +380,11 @@ static void Melder_checkAiffFile (FILE *f, int *numberOfChannels, int *encoding,
 
 	/* Read header of AIFF(-C) file: 12 bytes. */
 
-	if (fread (data, 1, 4, f) < 4) Melder_throw ("File too small: no FORM statement.");
-	if (! strnequ (data, "FORM", 4)) Melder_throw ("Not an AIFF or AIFC file (FORM statement expected).");
-	if (fread (data, 1, 4, f) < 4) Melder_throw ("File too small: no size of FORM chunk.");
-	if (fread (data, 1, 4, f) < 4) Melder_throw ("File too small: no file type info (expected AIFF or AIFC).");
-	if (! strnequ (data, "AIFF", 4) && ! strnequ (data, "AIFC", 4)) Melder_throw ("Not an AIFF or AIFC file (wrong file type info).");
+	if (fread (data, 1, 4, f) < 4) Melder_throw (U"File too small: no FORM statement.");
+	if (! strnequ (data, "FORM", 4)) Melder_throw (U"Not an AIFF or AIFC file (FORM statement expected).");
+	if (fread (data, 1, 4, f) < 4) Melder_throw (U"File too small: no size of FORM chunk.");
+	if (fread (data, 1, 4, f) < 4) Melder_throw (U"File too small: no file type info (expected AIFF or AIFC).");
+	if (! strnequ (data, "AIFF", 4) && ! strnequ (data, "AIFC", 4)) Melder_throw (U"Not an AIFF or AIFC file (wrong file type info).");
 	if (strnequ (data, "AIFF", 4)) isAifc = false;
 
 	/* Search for Common Chunk and Data Chunk. */
@@ -399,7 +399,7 @@ static void Melder_checkAiffFile (FILE *f, int *numberOfChannels, int *encoding,
 		/* START FIX OF FOREIGN BUG */
 		if(strnequ(chunkID,"NONE",4)&&
 			(chunkSize==(14<<24)+('n'<<16)+('o'<<8)+'t'||chunkSize==('t'<<24)+('o'<<16)+('n'<<8)+14))
-		{Melder_casual("Ha! a buggy SGI \"soundeditor\" file...");for(long i=1;i<=20/*diff*/-8/*header*/;i++)fread(data,1,1,f);continue;}
+		{Melder_casual(U"Ha! a buggy SGI \"soundeditor\" file...");for(long i=1;i<=20/*diff*/-8/*header*/;i++)fread(data,1,1,f);continue;}
 		/* FINISH FIX OF FOREIGN BUG */
 		if (strnequ (chunkID, "COMM", 4)) {
 			/*
@@ -407,26 +407,26 @@ static void Melder_checkAiffFile (FILE *f, int *numberOfChannels, int *encoding,
 			 */
 			commonChunkPresent = true;
 			*numberOfChannels = bingeti2 (f);
-			if (*numberOfChannels < 1) Melder_throw ("Too few sound channels (", *numberOfChannels, ").");
+			if (*numberOfChannels < 1) Melder_throw (U"Too few sound channels (", *numberOfChannels, U").");
 			*numberOfSamples = bingeti4 (f);
-			if (*numberOfSamples <= 0) Melder_throw ("Too few samples ", *numberOfSamples, ").");
+			if (*numberOfSamples <= 0) Melder_throw (U"Too few samples ", *numberOfSamples, U").");
 			numberOfBitsPerSamplePoint = bingeti2 (f);
-			if (numberOfBitsPerSamplePoint > 32) Melder_throw ("Too many bits per sample (", numberOfBitsPerSamplePoint, "; the maximum is 32).");
+			if (numberOfBitsPerSamplePoint > 32) Melder_throw (U"Too many bits per sample (", numberOfBitsPerSamplePoint, U"; the maximum is 32).");
 			*encoding =
 				numberOfBitsPerSamplePoint > 24 ? Melder_LINEAR_32_BIG_ENDIAN :
 				numberOfBitsPerSamplePoint > 16 ? Melder_LINEAR_24_BIG_ENDIAN :
 				numberOfBitsPerSamplePoint > 8 ? Melder_LINEAR_16_BIG_ENDIAN :
 				Melder_LINEAR_8_SIGNED;
 			*sampleRate = bingetr10 (f);
-			if (*sampleRate <= 0.0) Melder_throw ("Wrong sampling frequency (", *sampleRate, " Hz).");
+			if (*sampleRate <= 0.0) Melder_throw (U"Wrong sampling frequency (", *sampleRate, U" Hz).");
 			if (isAifc) {
 				/*
 				 * Read compression data; should be "NONE" or "sowt".
 				 */
-				if (fread (data, 1, 4, f) < 4) Melder_throw ("File too small: no compression info.");
+				if (fread (data, 1, 4, f) < 4) Melder_throw (U"File too small: no compression info.");
 				if (! strnequ (data, "NONE", 4) && ! strnequ (data, "sowt", 4)) {
 					data [4] = '\0';
-					Melder_throw ("Cannot read compressed AIFC files (compression type ", data, ").");
+					Melder_throw (U"Cannot read compressed AIFC files (compression type ", Melder_peek8to32 (data), U").");
 				}
 				if (strnequ (data, "sowt", 4))
 					*encoding =
@@ -439,7 +439,7 @@ static void Melder_checkAiffFile (FILE *f, int *numberOfChannels, int *encoding,
 				 */
 				for (long i = 23; i <= chunkSize; i ++)
 					if (fread (data, 1, 1, f) < 1)
-						Melder_throw ("File too small: expected chunk of ", chunkSize, " bytes, but found ", i + 22, ".");
+						Melder_throw (U"File too small: expected chunk of ", chunkSize, U" bytes, but found ", i + 22, U".");
 			}
 		} else if (strnequ (chunkID, "SSND", 4)) {
 			/*
@@ -451,11 +451,11 @@ static void Melder_checkAiffFile (FILE *f, int *numberOfChannels, int *encoding,
 		} else // ignore Version Chunk and unknown chunks
 			for (long i = 1; i <= chunkSize; i ++)
 				if (fread (data, 1, 1, f) < 1)
-					Melder_throw ("File too small: expected ", chunkSize, " bytes, but found ", i, ".");
+					Melder_throw (U"File too small: expected ", chunkSize, U" bytes, but found ", i, U".");
 	}
 
-	if (! commonChunkPresent) Melder_throw ("Found no Common Chunk.");
-	if (! dataChunkPresent) Melder_throw ("Found no Data Chunk.");
+	if (! commonChunkPresent) Melder_throw (U"Found no Common Chunk.");
+	if (! dataChunkPresent) Melder_throw (U"Found no Data Chunk.");
 }
 
 static void Melder_checkWavFile (FILE *f, int *numberOfChannels, int *encoding,
@@ -466,20 +466,20 @@ static void Melder_checkWavFile (FILE *f, int *numberOfChannels, int *encoding,
 	int numberOfBitsPerSamplePoint = -1;
 	uint32_t dataChunkSize = 0xffffffff;
 
-	if (fread (data, 1, 4, f) < 4)   Melder_throw ("File too small: no RIFF statement.");
-	if (! strnequ (data, "RIFF", 4)) Melder_throw ("Not a WAV file (RIFF statement expected).");
-	if (fread (data, 1, 4, f) < 4)   Melder_throw ("File too small: no size of RIFF chunk.");
-	if (fread (data, 1, 4, f) < 4)   Melder_throw ("File too small: no file type info (expected WAVE statement).");
+	if (fread (data, 1, 4, f) < 4)   Melder_throw (U"File too small: no RIFF statement.");
+	if (! strnequ (data, "RIFF", 4)) Melder_throw (U"Not a WAV file (RIFF statement expected).");
+	if (fread (data, 1, 4, f) < 4)   Melder_throw (U"File too small: no size of RIFF chunk.");
+	if (fread (data, 1, 4, f) < 4)   Melder_throw (U"File too small: no file type info (expected WAVE statement).");
 	if (! strnequ (data, "WAVE", 4) && ! strnequ (data, "CDDA", 4))
-	                                 Melder_throw (L"Not a WAVE or CD audio file (wrong file type info).");
+	                                 Melder_throw (U"Not a WAVE or CD audio file (wrong file type info).");
 
 	/* Search for Format Chunk and Data Chunk. */
 
 	while (fread (chunkID, 1, 4, f) == 4) {
 		uint32_t chunkSize = bingetu4LE (f);
 		if (Melder_debug == 23) {
-			Melder_warning (Melder_integer (chunkID [0]), L" ", Melder_integer (chunkID [1]), L" ",
-				Melder_integer (chunkID [2]), L" ", Melder_integer (chunkID [3]), L" ", Melder_integer (chunkSize));
+			Melder_warning (chunkID [0], U" ", chunkID [1], U" ",
+				chunkID [2], U" ", chunkID [3], U" ", chunkSize);
 		}
 		if (strnequ (chunkID, "fmt ", 4)) {
 			/*
@@ -488,18 +488,18 @@ static void Melder_checkWavFile (FILE *f, int *numberOfChannels, int *encoding,
 			uint16_t winEncoding = bingetu2LE (f);
 			formatChunkPresent = true;			
 			*numberOfChannels = bingeti2LE (f);
-			if (*numberOfChannels < 1) Melder_throw ("Too few sound channels (", *numberOfChannels, ").");
+			if (*numberOfChannels < 1) Melder_throw (U"Too few sound channels (", *numberOfChannels, U").");
 			*sampleRate = (double) bingeti4LE (f);
-			if (*sampleRate <= 0.0) Melder_throw ("Wrong sampling frequency (", *sampleRate, " Hz).");
+			if (*sampleRate <= 0.0) Melder_throw (U"Wrong sampling frequency (", *sampleRate, U" Hz).");
 			(void) bingeti4LE (f);   // avgBytesPerSec
 			(void) bingeti2LE (f);   // blockAlign
 			numberOfBitsPerSamplePoint = bingeti2LE (f);
 			if (numberOfBitsPerSamplePoint == 0)
 				numberOfBitsPerSamplePoint = 16;   // the default
 			else if (numberOfBitsPerSamplePoint < 4)
-				Melder_throw ("Too few bits per sample (", numberOfBitsPerSamplePoint, "; the minimum is 4).");
+				Melder_throw (U"Too few bits per sample (", numberOfBitsPerSamplePoint, U"; the minimum is 4).");
 			else if (numberOfBitsPerSamplePoint > 32)
-				Melder_throw ("Too few bits per sample (", numberOfBitsPerSamplePoint, "; the maximum is 32).");
+				Melder_throw (U"Too few bits per sample (", numberOfBitsPerSamplePoint, U"; the maximum is 32).");
 			switch (winEncoding) {
 				case WAVE_FORMAT_PCM:
 					*encoding =
@@ -518,13 +518,13 @@ static void Melder_checkWavFile (FILE *f, int *numberOfChannels, int *encoding,
 					*encoding = Melder_MULAW;
 					break;
 				case WAVE_FORMAT_DVI_ADPCM:
-					Melder_throw ("Cannot read lossy compressed audio files (this one is DVI ADPCM).\n"
-						"Please use uncompressed audio files. If you must open this file,\n"
-						"please use an audio converter program to convert it first to normal (PCM) WAV format\n"
-						"(Praat may have difficulty analysing the poor recording, though).");
+					Melder_throw (U"Cannot read lossy compressed audio files (this one is DVI ADPCM).\n"
+						U"Please use uncompressed audio files. If you must open this file,\n"
+						U"please use an audio converter program to convert it first to normal (PCM) WAV format\n"
+						U"(Praat may have difficulty analysing the poor recording, though).");
 				case WAVE_FORMAT_EXTENSIBLE: {
 					if (chunkSize < 40)
-						Melder_throw ("Not enough format data in extensible WAV format");
+						Melder_throw (U"Not enough format data in extensible WAV format");
 					(void) bingeti2LE (f);   // extensionSize
 					(void) bingeti2LE (f);   // validBitsPerSample
 					(void) bingeti4LE (f);   // channelMask
@@ -547,22 +547,22 @@ static void Melder_checkWavFile (FILE *f, int *numberOfChannels, int *encoding,
 							*encoding = Melder_MULAW;
 							break;
 						case WAVE_FORMAT_DVI_ADPCM:
-							Melder_throw ("Cannot read lossy compressed audio files (this one is DVI ADPCM).\n"
-								"Please use uncompressed audio files. If you must open this file,\n"
-								"please use an audio converter program to convert it first to normal (PCM) WAV format\n"
-								"(Praat may have difficulty analysing the poor recording, though).");
+							Melder_throw (U"Cannot read lossy compressed audio files (this one is DVI ADPCM).\n"
+								U"Please use uncompressed audio files. If you must open this file,\n"
+								U"please use an audio converter program to convert it first to normal (PCM) WAV format\n"
+								U"(Praat may have difficulty analysing the poor recording, though).");
 						default:
-							Melder_throw ("Unsupported Windows audio encoding ", winEncoding2, ".");
+							Melder_throw (U"Unsupported Windows audio encoding ", winEncoding2, U".");
 					}
-					if (fread (data, 1, 14, f) < 14)   Melder_throw ("File too small: no SubFormat data.");
+					if (fread (data, 1, 14, f) < 14)   Melder_throw (U"File too small: no SubFormat data.");
 					continue;   // next chunk
 				}
 				default:
-					Melder_throw ("Unsupported Windows audio encoding ", winEncoding, ".");
+					Melder_throw (U"Unsupported Windows audio encoding ", winEncoding, U".");
 			}
 			if (chunkSize & 1) chunkSize ++;
 			for (long i = 17; i <= chunkSize; i ++)
-				if (fread (data, 1, 1, f) < 1) Melder_throw ("File too small: expected ", chunkSize, " bytes in fmt chunk, but found ", i, ".");
+				if (fread (data, 1, 1, f) < 1) Melder_throw (U"File too small: expected ", chunkSize, U" bytes in fmt chunk, but found ", i, U".");
 		} else if (strnequ (chunkID, "data", 4)) {
 			/*
 			 * Found a Data Chunk.
@@ -579,7 +579,7 @@ static void Melder_checkWavFile (FILE *f, int *numberOfChannels, int *encoding,
 			}
 			if (Melder_debug == 23) {
 				for (long i = 1; i <= chunkSize; i ++)
-					if (fread (data, 1, 1, f) < 1) Melder_throw ("File too small: expected ", chunkSize, " bytes of data, but found ", i, ".");
+					if (fread (data, 1, 1, f) < 1) Melder_throw (U"File too small: expected ", chunkSize, U" bytes of data, but found ", i, U".");
 			} else {
 				if (formatChunkPresent) break;   // OPTIMIZATION: do not read the whole data chunk if we have already read the format chunk
 			}
@@ -587,12 +587,12 @@ static void Melder_checkWavFile (FILE *f, int *numberOfChannels, int *encoding,
 			if (chunkSize & 1) chunkSize ++;
 			for (long i = 1; i <= chunkSize; i ++)
 				if (fread (data, 1, 1, f) < 1)
-					Melder_throw ("File too small: expected ", chunkSize, " bytes, but found ", i, ".");
+					Melder_throw (U"File too small: expected ", chunkSize, U" bytes, but found ", i, U".");
 		}
 	}
 
-	if (! formatChunkPresent) Melder_throw (L"Found no Format Chunk.");
-	if (! dataChunkPresent) Melder_throw (L"Found no Data Chunk.");
+	if (! formatChunkPresent) Melder_throw (U"Found no Format Chunk.");
+	if (! dataChunkPresent) Melder_throw (U"Found no Data Chunk.");
 	Melder_assert (numberOfBitsPerSamplePoint != -1 && dataChunkSize != 0xffffffff);
 	*numberOfSamples = dataChunkSize / *numberOfChannels / ((numberOfBitsPerSamplePoint + 7) / 8);
 }
@@ -602,10 +602,10 @@ static void Melder_checkNextSunFile (FILE *f, int *numberOfChannels, int *encodi
 {
 	char tag [4];
 	fread (tag, 1, 4, f);
-	if (strncmp (tag, ".snd", 4)) Melder_throw ("Not a Sun audio file.");
+	if (strncmp (tag, ".snd", 4)) Melder_throw (U"Not a Sun audio file.");
 	*startOfData = bingeti4 (f);
 	if (*startOfData < 24 || *startOfData > 320)
-		Melder_throw ("Cannot read header of audio file. Length ", *startOfData, ".");
+		Melder_throw (U"Cannot read header of audio file. Length ", *startOfData, U".");
 	long dataSize = bingeti4 (f);
 	if (dataSize <= 0) {
 		/*
@@ -622,13 +622,13 @@ static void Melder_checkNextSunFile (FILE *f, int *numberOfChannels, int *encodi
 		case 2: *encoding = Melder_LINEAR_8_SIGNED; break;
 		case 3: *encoding = Melder_LINEAR_16_BIG_ENDIAN; break;
 		case 27: *encoding = Melder_ALAW; break;
-		default: Melder_throw ("Cannot translate audio file encoding ", sunEncoding, ".");
+		default: Melder_throw (U"Cannot translate audio file encoding ", sunEncoding, U".");
 	}
 	*sampleRate = bingeti4 (f);
-	if (*sampleRate <= 0) Melder_throw ("Impossible sampling frequency ", *sampleRate, " Hz.");
+	if (*sampleRate <= 0) Melder_throw (U"Impossible sampling frequency ", *sampleRate, U" Hz.");
 	*numberOfChannels = bingeti4 (f);
 	if (*numberOfChannels < 1)
-		Melder_throw ("Wrong number of channels in audio file (", *numberOfChannels, ").");
+		Melder_throw (U"Wrong number of channels in audio file (", *numberOfChannels, U").");
 	*numberOfSamples = dataSize / Melder_bytesPerSamplePoint (*encoding) / *numberOfChannels;
 	long skip = *startOfData - 24;
 	while (skip -- > 0) (void) fgetc (f);
@@ -647,24 +647,24 @@ static void Melder_checkNistFile (FILE *f, int *numberOfChannels, int *encoding,
 	double *sampleRate, long *startOfData, int32 *numberOfSamples)
 {
 	char header [1024], sval [100];
- 	double rval;
+ 	double rval = 0.0;
 	int numberOfBytesPerSamplePoint;
 	if (fread (header, 1, 1024, f) != 1024)
-		Melder_throw ("Cannot read NISTheader.");
+		Melder_throw (U"Cannot read NISTheader.");
 	if (! strnequ (header, "NIST_1A", 7))
-		Melder_throw ("Not a NIST sound file.");
+		Melder_throw (U"Not a NIST sound file.");
 	*startOfData = atol (header + 9);
-	if (! nistGetValue (header, "sample_count", & rval, sval) || rval < 1)
-		Melder_throw ("Incorrect number of samples in NIST file.");
-	*numberOfSamples = rval;
-	if (! nistGetValue (header, "sample_n_bytes", & rval, sval) || rval < 1 || rval > 2)
-		Melder_throw ("Incorrect number of bytes per sample (should be 1 or 2).");
-	numberOfBytesPerSamplePoint = rval;
-	if (! nistGetValue (header, "channel_count", & rval, sval) || rval < 1)
-		Melder_throw ("Incorrect number of channels.");
-	*numberOfChannels = rval;
+	if (! nistGetValue (header, "sample_count", & rval, sval) || rval < 1.0)
+		Melder_throw (U"Incorrect number of samples in NIST file.");
+	*numberOfSamples = lround (rval);
+	if (! nistGetValue (header, "sample_n_bytes", & rval, sval) || rval < 1.0 || rval > 2.0)
+		Melder_throw (U"Incorrect number of bytes per sample (should be 1 or 2).");
+	numberOfBytesPerSamplePoint = lround (rval);
+	if (! nistGetValue (header, "channel_count", & rval, sval) || rval < 1.0)
+		Melder_throw (U"Incorrect number of channels.");
+	*numberOfChannels = lround (rval);
 	if (! nistGetValue (header, "sample_rate", sampleRate, sval) || *sampleRate < 1)
-		Melder_throw ("Incorrect sampling frequency ", *sampleRate, " Hz.");
+		Melder_throw (U"Incorrect sampling frequency ", *sampleRate, U" Hz.");
 	*encoding = Melder_LINEAR_16_BIG_ENDIAN;
 	if (nistGetValue (header, "sample_byte_format", & rval, sval) && strequ (sval, "01"))
 		*encoding = Melder_LINEAR_16_LITTLE_ENDIAN;
@@ -688,8 +688,8 @@ static void Melder_checkFlacFile (MelderFile file, int *numberOfChannels, int *e
 {
 	FLAC__StreamMetadata metadata;
 	FLAC__StreamMetadata_StreamInfo *info;
-	if (! FLAC__metadata_get_streaminfo (Melder_peekWcsToUtf8 (Melder_fileToPath (file)), & metadata))   // FIXME: not Unicode-compatible on Windows.
-		Melder_throw ("Invalid FLAC file");
+	if (! FLAC__metadata_get_streaminfo (Melder_peek32to8 (Melder_fileToPath (file)), & metadata))   // FIXME: not Unicode-compatible on Windows.
+		Melder_throw (U"Invalid FLAC file");
 	info = & metadata. data. stream_info;
 	*numberOfChannels = info -> channels;
 	*encoding = Melder_FLAC_COMPRESSION_16;
@@ -697,7 +697,7 @@ static void Melder_checkFlacFile (MelderFile file, int *numberOfChannels, int *e
 	*startOfData = 0;   // meaningless: libFLAC does the I/O
 	*numberOfSamples = info -> total_samples;   // BUG: loses bits above INT32_MAX
 	if ((FLAC__uint64) *numberOfSamples != info -> total_samples)
-		Melder_throw ("FLAC file too long.");
+		Melder_throw (U"FLAC file too long.");
 }
 
 static void Melder_checkMp3File (FILE *f, int *numberOfChannels, int *encoding,
@@ -707,14 +707,14 @@ static void Melder_checkMp3File (FILE *f, int *numberOfChannels, int *encoding,
 	mp3f_set_file (mp3f, f);
 	if (! mp3f_analyze (mp3f)) {
 		mp3f_delete (mp3f);
-		Melder_throw ("Cannot analyze MP3 file");
+		Melder_throw (U"Cannot analyze MP3 file");
 	}
 	*encoding = Melder_MPEG_COMPRESSION_16;
 	*numberOfChannels = mp3f_channels (mp3f);
 	*sampleRate = mp3f_frequency (mp3f);
 	*numberOfSamples = mp3f_samples (mp3f);
 	if ((MP3F_OFFSET)*numberOfSamples != mp3f_samples (mp3f))   // BUG: loses bits above INT32_MAX
-		Melder_throw ("MP3 file too long.");
+		Melder_throw (U"MP3 file too long.");
 	*startOfData = 0;   // meaningless
 	mp3f_delete (mp3f);
 }
@@ -724,7 +724,7 @@ int MelderFile_checkSoundFile (MelderFile file, int *numberOfChannels, int *enco
 {
 	char data [16];
 	FILE *f = file -> filePointer;
-	if (f == NULL || fread (data, 1, 16, f) < 16) return 0;
+	if (! f || fread (data, 1, 16, f) < 16) return 0;
 	rewind (f);
 	if (strnequ (data, "FORM", 4) && strnequ (data + 8, "AIFF", 4)) {
 		Melder_checkAiffFile (f, numberOfChannels, encoding, sampleRate, startOfData, numberOfSamples);
@@ -832,7 +832,7 @@ static void Melder_DecodeMp3_convert (const MP3F_SAMPLE *channels [MP3F_MAX_CHAN
 static void Melder_DecodeFlac_error (const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) {
 	(void) decoder;
 	(void) client_data;
-	Melder_warning ("FLAC decoder error: ", FLAC__StreamDecoderErrorStatusString [status]);
+	Melder_warning (U"FLAC decoder error: ", Melder_peek8to32 (FLAC__StreamDecoderErrorStatusString [status]));
 }
 
 static void Melder_readFlacFile (FILE *f, int numberOfChannels, double **buffer, long numberOfSamples) {
@@ -847,12 +847,12 @@ static void Melder_readFlacFile (FILE *f, int numberOfChannels, double **buffer,
 	}
 	c.numberOfSamples = numberOfSamples;
 
-	if ((decoder = FLAC__stream_decoder_new ()) == NULL)
+	if ((decoder = FLAC__stream_decoder_new ()) == nullptr)
 		goto end;
 	if (FLAC__stream_decoder_init_stream (decoder,
 				Melder_DecodeFlac_read,
-				NULL, NULL, NULL, NULL,
-				Melder_DecodeFlac_convert, NULL,
+				nullptr, nullptr, nullptr, nullptr,
+				Melder_DecodeFlac_convert, nullptr,
 				Melder_DecodeFlac_error, &c) != FLAC__STREAM_DECODER_INIT_STATUS_OK)
 		goto end;
 	result = FLAC__stream_decoder_process_until_end_of_stream (decoder);
@@ -860,7 +860,7 @@ static void Melder_readFlacFile (FILE *f, int numberOfChannels, double **buffer,
 end:
 	if (decoder) FLAC__stream_decoder_delete (decoder);
 	if (result == 0)
-		Melder_throw ("Error decoding FLAC file.");
+		Melder_throw (U"Error decoding FLAC file.");
 }
 
 static void Melder_readMp3File (FILE *f, int numberOfChannels, double **buffer, long numberOfSamples) {
@@ -877,10 +877,7 @@ static void Melder_readMp3File (FILE *f, int numberOfChannels, double **buffer,
 	result = mp3f_read (mp3f, numberOfSamples);
 	mp3f_delete (mp3f);
 	if (result == 0)
-		Melder_throw ("Error decoding MP3 file.");
-}
-
-int64_t Melder_fread (uint8_t *bytes, double numberOfBytes, FILE *f) {
+		Melder_throw (U"Error decoding MP3 file.");
 }
 
 void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, double **buffer, long numberOfSamples) {
@@ -890,14 +887,14 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 				try {
 					for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 						for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-							int8_t value;
+							int8 value;
 							if (fread (& value, 1, 1, f) < 1) throw MelderError ();
 							buffer [ichan] [isamp] = value * (1.0 / 128);
 						}
 					}
 				} catch (MelderError) {
 					Melder_clearError ();
-					Melder_warning ("File too small (", numberOfChannels, "-channel 8-bit).\nMissing samples set to zero.");
+					Melder_warning (U"File too small (", numberOfChannels, U"-channel 8-bit).\nMissing samples set to zero.");
 				}
 			} break;
 			case Melder_LINEAR_8_UNSIGNED:
@@ -909,7 +906,7 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 					}
 				} catch (MelderError) {
 					Melder_clearError ();
-					Melder_warning ("File too small (", numberOfChannels, "-channel 8-bit).\nMissing samples set to zero.");
+					Melder_warning (U"File too small (", numberOfChannels, U"-channel 8-bit).\nMissing samples set to zero.");
 				}
 				break;
 			case Melder_LINEAR_16_BIG_ENDIAN:
@@ -924,16 +921,16 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 					encoding == Melder_LINEAR_24_BIG_ENDIAN || encoding == Melder_LINEAR_24_LITTLE_ENDIAN ? 3 : 4;
 				double numberOfBytes_f = (double) numberOfChannels * (double) numberOfSamples * (double) numberOfBytesPerSamplePerChannel;
 				if (isinf (numberOfBytes_f) || numberOfBytes_f > (double) (1LL << 53)) {
-					Melder_throw ("Cannot read ", numberOfBytes_f, " bytes, "
-						"because that crosses the 9-petabyte limit.");
+					Melder_throw (U"Cannot read ", numberOfBytes_f, U" bytes, "
+						U"because that crosses the 9-petabyte limit.");
 				}
 				if (numberOfBytes_f > (double) SIZE_MAX) {
-					Melder_throw ("Cannot read ", numberOfBytes_f, " bytes. "
-						"Perhaps try a 64-bit edition of Praat?");
+					Melder_throw (U"Cannot read ", numberOfBytes_f, U" bytes. "
+						U"Perhaps try a 64-bit edition of Praat?");
 				}
 				Melder_assert (numberOfBytes_f >= 0.0);
 				size_t numberOfBytes = (size_t) numberOfBytes_f;   // cast is safe because overflow and signedness have been checked
-				uint8_t *bytes = (uint8_t *) & buffer [numberOfChannels] [numberOfSamples] + sizeof (double) - numberOfBytes;
+				uint8 *bytes = (uint8 *) & buffer [numberOfChannels] [numberOfSamples] + sizeof (double) - numberOfBytes;
 				/*
 				 * Read 16-bit data into the last quarter of the buffer,
 				 * or 24-bit data into the last three-eighths of the buffer,
@@ -959,42 +956,42 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_24_BIG_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++;
-								int32_t value = (int32_t)
-									((uint32_t) ((uint32_t) byte1 << 24) |
-									 (uint32_t) ((uint32_t) byte2 << 16) |
-									            ((uint32_t) byte3 << 8));
+								int32 value = (int32)
+									((uint32) ((uint32) byte1 << 24) |
+									 (uint32) ((uint32) byte2 << 16) |
+											  ((uint32) byte3 << 8));
 								buffer [1] [isamp] = value * (1.0 / 32768 / 65536);
 							}
 						} break;
 						case Melder_LINEAR_24_LITTLE_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++;
-								int32_t value = (int32_t)
-									((uint32_t) ((uint32_t) byte3 << 24) |
-									 (uint32_t) ((uint32_t) byte2 << 16) |
-									            ((uint32_t) byte1 << 8));
+								int32 value = (int32)
+									((uint32) ((uint32) byte3 << 24) |
+									 (uint32) ((uint32) byte2 << 16) |
+											  ((uint32) byte1 << 8));
 								buffer [1] [isamp] = value * (1.0 / 32768 / 65536);
 							}
 						} break;
 						case Melder_LINEAR_32_BIG_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++, byte4 = * bytes ++;
-								int32_t value = (int32_t)
-									((uint32_t) ((uint32_t) byte1 << 24) |
-									 (uint32_t) ((uint32_t) byte2 << 16) |
-									 (uint32_t) ((uint32_t) byte3 << 8) |
-									             (uint32_t) byte4);
+								int32 value = (int32)
+									((uint32) ((uint32) byte1 << 24) |
+									 (uint32) ((uint32) byte2 << 16) |
+									 (uint32) ((uint32) byte3 << 8) |
+											   (uint32) byte4);
 								buffer [1] [isamp] = value * (1.0 / 32768 / 65536);
 							}
 						} break;
 						case Melder_LINEAR_32_LITTLE_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++, byte4 = * bytes ++;
-								int32_t value = (int32_t)
-									((uint32_t) ((uint32_t) byte4 << 24) |
-									 (uint32_t) ((uint32_t) byte3 << 16) |
-									 (uint32_t) ((uint32_t) byte2 << 8) |
-									             (uint32_t) byte1);
+								int32 value = (int32)
+									((uint32) ((uint32) byte4 << 24) |
+									 (uint32) ((uint32) byte3 << 16) |
+									 (uint32) ((uint32) byte2 << 8) |
+											   (uint32) byte1);
 								buffer [1] [isamp] = value * (1.0 / 32768 / 65536);
 							}
 						} break;
@@ -1004,8 +1001,8 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_16_BIG_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++;
-									int value = (int) (int16_t) (((uint16_t) byte1 << 8) | (uint16_t) byte2);
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++;
+									int value = (int) (int16) (uint16) ((uint16) ((uint16) byte1 << 8) | (uint16) byte2);
 									buffer [ichan] [isamp] = value * (1.0 / 32768);
 								}
 							}
@@ -1013,8 +1010,8 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_16_LITTLE_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									uint8_t byte1 = * bytes ++, byte2 = * bytes ++;
-									int value = (int) (int16_t) (((uint16_t) byte2 << 8) | (uint16_t) byte1);
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++;
+									int value = (int) (int16) (uint16) ((uint16) ((uint16) byte2 << 8) | (uint16) byte1);
 									buffer [ichan] [isamp] = value * (1.0 / 32768);
 								}
 							}
@@ -1022,11 +1019,11 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_24_BIG_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++;
-									uint32_t unsignedValue =
-										(uint32_t) ((uint32_t) byte1 << 16) |
-										(uint32_t) ((uint32_t) byte2 << 8) |
-										            (uint32_t) byte3;
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++;
+									uint32 unsignedValue =
+										(uint32) ((uint32) byte1 << 16) |
+										(uint32) ((uint32) byte2 << 8) |
+												  (uint32) byte3;
 									if ((byte1 & 128) != 0) unsignedValue |= 0xFF000000;   // extend sign
 									buffer [ichan] [isamp] = (int32_t) unsignedValue * (1.0 / 8388608);
 								}
@@ -1035,22 +1032,22 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_24_LITTLE_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++;
-									uint32_t unsignedValue = ((uint32_t) byte3 << 16) | ((uint32_t) byte2 << 8) | (uint32_t) byte1;
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++;
+									uint32 unsignedValue = ((uint32) byte3 << 16) | ((uint32) byte2 << 8) | (uint32) byte1;
 									if ((byte3 & 128) != 0) unsignedValue |= 0xFF000000;
-									buffer [ichan] [isamp] = (int32_t) unsignedValue * (1.0 / 8388608);
+									buffer [ichan] [isamp] = (int32) unsignedValue * (1.0 / 8388608);
 								}
 							}
 						} break;
 						case Melder_LINEAR_32_BIG_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++, byte4 = * bytes ++;
-									int32_t value = (int32_t)
-										((uint32_t) ((uint32_t) byte1 << 24) |
-										 (uint32_t) ((uint32_t) byte2 << 16) |
-										 (uint32_t) ((uint32_t) byte3 << 8) |
-													 (uint32_t) byte4);
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++, byte4 = * bytes ++;
+									int32 value = (int32)
+										((uint32) ((uint32) byte1 << 24) |
+										 (uint32) ((uint32) byte2 << 16) |
+										 (uint32) ((uint32) byte3 << 8) |
+												   (uint32) byte4);
 									buffer [ichan] [isamp] = value * (1.0 / 32768 / 65536);
 								}
 							}
@@ -1058,12 +1055,12 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_32_LITTLE_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++, byte4 = * bytes ++;
-									int32_t value = (int32_t)
-										((uint32_t) ((uint32_t) byte4 << 24) |
-										 (uint32_t) ((uint32_t) byte3 << 16) |
-										 (uint32_t) ((uint32_t) byte2 << 8) |
-													 (uint32_t) byte1);
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++, byte4 = * bytes ++;
+									int32 value = (int32)
+										((uint32) ((uint32) byte4 << 24) |
+										 (uint32) ((uint32) byte3 << 16) |
+										 (uint32) ((uint32) byte2 << 8) |
+												   (uint32) byte1);
 									buffer [ichan] [isamp] = value * (1.0 / 32768 / 65536);
 								}
 							}
@@ -1076,10 +1073,10 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_16_BIG_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++;
-									int32_t value = (int32_t)
-										(((uint32_t) byte1 << 24) |
-										 ((uint32_t) byte2 << 16));
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++;
+									int32 value = (int32)
+										((uint32) ((uint32) byte1 << 24) |
+										 (uint32) ((uint32) byte2 << 16));
 									* ints ++ = value;
 									* ints ++ = 0;   // the marker
 								}
@@ -1088,10 +1085,10 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_16_LITTLE_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++;
-									int32_t value = (int32_t)
-										(((uint32_t) byte2 << 24) |
-										 ((uint32_t) byte1 << 16));
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++;
+									int32 value = (int32)
+										(((uint32) byte2 << 24) |
+										 ((uint32) byte1 << 16));
 									* ints ++ = value;
 									* ints ++ = 0;   // the marker
 								}
@@ -1100,11 +1097,11 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_24_BIG_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++;
-									int32_t value = (int32_t)
-										(((uint32_t) byte1 << 24) |
-										 ((uint32_t) byte2 << 16) |
-										 ((uint32_t) byte3 << 8));
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++;
+									int32 value = (int32)
+										(((uint32) byte1 << 24) |
+										 ((uint32) byte2 << 16) |
+										 ((uint32) byte3 << 8));
 									* ints ++ = value;
 									* ints ++ = 0;   // the marker
 								}
@@ -1113,11 +1110,11 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_24_LITTLE_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++;
-									int32_t value = (int32_t)
-										(((uint32_t) byte3 << 24) |
-										 ((uint32_t) byte2 << 16) |
-										 ((uint32_t) byte1 << 8));
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++;
+									int32 value = (int32)
+										(((uint32) byte3 << 24) |
+										 ((uint32) byte2 << 16) |
+										 ((uint32) byte1 << 8));
 									* ints ++ = value;
 									* ints ++ = 0;   // the marker
 								}
@@ -1126,12 +1123,12 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_32_BIG_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++, byte4 = * bytes ++;
-									int32_t value = (int32_t)
-										(((uint32_t) byte1 << 24) |
-										 ((uint32_t) byte2 << 16) |
-										 ((uint32_t) byte3 << 8) |
-										  (uint32_t) byte4);
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++, byte4 = * bytes ++;
+									int32 value = (int32)
+										(((uint32) byte1 << 24) |
+										 ((uint32) byte2 << 16) |
+										 ((uint32) byte3 << 8) |
+										  (uint32) byte4);
 									* ints ++ = value;
 									* ints ++ = 0;   // the marker
 								}
@@ -1140,12 +1137,12 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 						case Melder_LINEAR_32_LITTLE_ENDIAN: {
 							for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 								for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
-									unsigned char byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++, byte4 = * bytes ++;
-									int32_t value = (int32_t)
-										(((uint32_t) byte4 << 24) |
-										 ((uint32_t) byte3 << 16) |
-										 ((uint32_t) byte2 << 8) |
-										  (uint32_t) byte1);
+									uint8 byte1 = * bytes ++, byte2 = * bytes ++, byte3 = * bytes ++, byte4 = * bytes ++;
+									int32 value = (int32)
+										(((uint32) byte4 << 24) |
+										 ((uint32) byte3 << 16) |
+										 ((uint32) byte2 << 8) |
+										  (uint32) byte1);
 									* ints ++ = value;
 									* ints ++ = 0;   // the marker
 								}
@@ -1180,8 +1177,8 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 					}
 				}
 				if (numberOfBytesRead < numberOfBytes)
-					Melder_warning ("File too small (", numberOfChannels, "-channel ", numberOfBytesPerSamplePerChannel * 8, "-bit).\n"
-						"Missing samples were set to zero.");
+					Melder_warning (U"File too small (", numberOfChannels, U"-channel ", numberOfBytesPerSamplePerChannel * 8, U"-bit).\n"
+						U"Missing samples were set to zero.");
 			} break;
 			case Melder_IEEE_FLOAT_32_BIG_ENDIAN:
 				try {
@@ -1192,7 +1189,7 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 					}
 				} catch (MelderError) {
 					Melder_clearError ();
-					Melder_warning ("File too small (", numberOfChannels, "-channel 32-bit floating point).\nMissing samples set to zero.");
+					Melder_warning (U"File too small (", numberOfChannels, U"-channel 32-bit floating point).\nMissing samples set to zero.");
 				}
 				break;
 			case Melder_IEEE_FLOAT_32_LITTLE_ENDIAN:
@@ -1204,7 +1201,7 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 					}
 				} catch (MelderError) {
 					Melder_clearError ();
-					Melder_warning ("File too small (", numberOfChannels, "-channel 32-bit floating point).\nMissing samples set to zero.");
+					Melder_warning (U"File too small (", numberOfChannels, U"-channel 32-bit floating point).\nMissing samples set to zero.");
 				}
 				break;
 			case Melder_MULAW:
@@ -1216,7 +1213,7 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 					}
 				} catch (MelderError) {
 					Melder_clearError ();
-					Melder_warning ("File too small (", numberOfChannels, "-channel 8-bit " "-law).\nMissing samples set to zero.");
+					Melder_warning (U"File too small (", numberOfChannels, U"-channel 8-bit " "-law).\nMissing samples set to zero.");
 				}
 				break;
 			case Melder_ALAW:
@@ -1228,7 +1225,7 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 					}
 				} catch (MelderError) {
 					Melder_clearError ();
-					Melder_warning ("File too small (", numberOfChannels, "-channel 8-bit A-law).\nMissing samples set to zero.");
+					Melder_warning (U"File too small (", numberOfChannels, U"-channel 8-bit A-law).\nMissing samples set to zero.");
 				}
 				break;
 			case Melder_FLAC_COMPRESSION_16:
@@ -1242,10 +1239,10 @@ void Melder_readAudioToFloat (FILE *f, int numberOfChannels, int encoding, doubl
 				Melder_readMp3File (f, numberOfChannels, buffer, numberOfSamples);
 				break;
 			default:
-				Melder_throw ("Unknown encoding %d.", encoding);
+				Melder_throw (U"Unknown encoding ", encoding, U".");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Audio samples not read from file.");
+		Melder_throw (U"Audio samples not read from file.");
 	}
 }
 
@@ -1257,7 +1254,7 @@ void Melder_readAudioToShort (FILE *f, int numberOfChannels, int encoding, short
 			case Melder_LINEAR_8_SIGNED:
 				for (i = 0; i < n; i ++) {
 					signed char value;
-					if (! fread (& value, 1, 1, f)) Melder_throw ("File too small (mono 8-bit).");
+					if (! fread (& value, 1, 1, f)) Melder_throw (U"File too small (mono 8-bit).");
 					buffer [i] = value * 256;
 				}
 				break;
@@ -1268,7 +1265,7 @@ void Melder_readAudioToShort (FILE *f, int numberOfChannels, int encoding, short
 				break;
 			case Melder_LINEAR_16_BIG_ENDIAN:
 				fread (buffer, sizeof (short), n, f);
-				if (* (unsigned char *) & byteSwapTest == 1) {
+				if (* (uint8 *) & byteSwapTest == 1) {
 					for (i = 0; i < n; i ++) {
 						unsigned short value = buffer [i];
 						buffer [i] = (value >> 8) + (value << 8);
@@ -1325,18 +1322,18 @@ void Melder_readAudioToShort (FILE *f, int numberOfChannels, int encoding, short
 				}
 				break;
 			default:
-				Melder_throw ("Unknown encoding %d.", encoding);
+				Melder_throw (U"Unknown encoding ", encoding, U".");
 		}
 	} catch (MelderError) {
 		Melder_clearError ();
-		Melder_warning (L"Audio file too short. Missing samples were set to zero.");
+		Melder_warning (U"Audio file too short. Missing samples were set to zero.");
 	}
 }
 
 void MelderFile_writeShortToAudio (MelderFile file, int numberOfChannels, int encoding, const short *buffer, long numberOfSamples) {
 	try {
 		FILE *f = file -> filePointer;
-		if (f == NULL) Melder_throw ("File not open.");
+		if (! f) Melder_throw (U"File not open.");
 		long n = numberOfSamples * numberOfChannels, start = 0, step = 1, i;
 		if (numberOfChannels < 0) {
 			n = numberOfSamples * 2;   // stereo
@@ -1382,26 +1379,26 @@ void MelderFile_writeShortToAudio (MelderFile file, int numberOfChannels, int en
 			case Melder_FLAC_COMPRESSION_24:
 			case Melder_FLAC_COMPRESSION_32:
 				if (! file -> flacEncoder)
-					Melder_throw ("FLAC encoder not initialized.");
+					Melder_throw (U"FLAC encoder not initialized.");
 				for (i = start; i < n; i += step * numberOfChannels) {
 					FLAC__int32 samples [FLAC__MAX_CHANNELS];
 					for (int ichan = 1; ichan <= numberOfChannels; ichan ++)
 						samples [ichan - 1] = buffer [i + ichan - 1];
 					if (! FLAC__stream_encoder_process_interleaved (file -> flacEncoder, samples, 1))
-						Melder_throw ("Error encoding FLAC stream.");
+						Melder_throw (U"Error encoding FLAC stream.");
 				}
 			break; case Melder_MULAW: case Melder_ALAW: default:
-				Melder_throw ("Unknown encoding %d.", encoding);
+				Melder_throw (U"Unknown encoding ", encoding, U".");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Samples not written to audio file.");
+		Melder_throw (U"Samples not written to audio file.");
 	}
 }
 
 void MelderFile_writeFloatToAudio (MelderFile file, int numberOfChannels, int encoding, double **buffer, long numberOfSamples, int warnIfClipped) {
 	try {
 		FILE *f = file -> filePointer;
-		if (f == NULL) Melder_throw ("File not open.");
+		if (f == NULL) Melder_throw (U"File not open.");
 		long nclipped = 0;
 		switch (encoding) {
 			case Melder_LINEAR_8_SIGNED:
@@ -1504,7 +1501,7 @@ void MelderFile_writeFloatToAudio (MelderFile file, int numberOfChannels, int en
 			case Melder_FLAC_COMPRESSION_24:
 			case Melder_FLAC_COMPRESSION_32:
 				if (! file -> flacEncoder)
-					Melder_throw ("FLAC encoder not initialized.");
+					Melder_throw (U"FLAC encoder not initialized.");
 				for (long isamp = 1; isamp <= numberOfSamples; isamp ++) {
 					FLAC__int32 samples [FLAC__MAX_CHANNELS];
 					for (long ichan = 1; ichan <= numberOfChannels; ichan ++) {
@@ -1514,19 +1511,19 @@ void MelderFile_writeFloatToAudio (MelderFile file, int numberOfChannels, int en
 						samples [ichan - 1] = (FLAC__int32) value;
 					}
 					if (! FLAC__stream_encoder_process_interleaved (file -> flacEncoder, samples, 1))
-						Melder_throw ("Error encoding FLAC stream.");
+						Melder_throw (U"Error encoding FLAC stream.");
 				}
 				break;
 			case Melder_MULAW:
 			case Melder_ALAW:
 			default:
-				Melder_throw (L"Unknown format.");
+				Melder_throw (U"Unknown format.");
 		}
 		if (nclipped > 0 && warnIfClipped)
-			Melder_warning ("Writing samples to audio file: ", nclipped, " out of ", numberOfSamples, " samples have been clipped.\n"
-				"Advice: you could scale the amplitudes or write to a binary file.");
+			Melder_warning (U"Writing samples to audio file: ", nclipped, U" out of ", numberOfSamples, U" samples have been clipped.\n"
+				U"Advice: you could scale the amplitudes or write to a binary file.");
 	} catch (MelderError) {
-		Melder_throw ("Samples not written to audio file.");
+		Melder_throw (U"Samples not written to audio file.");
 	}
 }
 
diff --git a/sys/melder_console.cpp b/sys/melder_console.cpp
index 905e9f9..61814fa 100644
--- a/sys/melder_console.cpp
+++ b/sys/melder_console.cpp
@@ -24,46 +24,16 @@
 
 #include "melder.h"
 #include "NUM.h"
-#ifdef _WIN32
-	#include <windows.h>
-#endif
-
-bool Melder_consoleIsAnsi = false;
-
-void Melder_writeToConsole (const wchar_t *message, bool useStderr) {
-	if (message == NULL) return;
-	#if defined (_WIN32)
-		(void) useStderr;
-		static HANDLE console = NULL;
-		if (console == NULL) {
-			console = CreateFile (L"CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
-		}
-		if (Melder_consoleIsAnsi) {
-			size_t n = wcslen (message);
-			for (long i = 0; i < n; i ++) {
-				unsigned int kar = (unsigned short) message [i];
-				fputc (kar, stdout);
-			}
-		//} else if (Melder_consoleIsUtf8) {
-			//char *messageA = Melder_peekWcsToUtf8 (message);
-			//fprintf (stdout, "%s", messageA);
-		} else {
-			WriteConsole (console, message, wcslen (message), NULL, NULL);
-		}
-	#else
-		Melder_fwriteWcsAsUtf8 (message, wcslen (message), useStderr ? stderr : stdout);
-	#endif
-}
 
 #if defined (_WIN32) && defined (CONSOLE_APPLICATION)
 int main (int argc, char *argvA []);
 extern "C" int wmain (int argc, wchar_t *argvW []);
 extern "C" int wmain (int argc, wchar_t *argvW []) {
-	char **argvA = NULL;
+	char **argvA = nullptr;
 	if (argc > 0) {
 		argvA = NUMvector <char *> (0, argc - 1);
 		for (int iarg = 0; iarg < argc; iarg ++) {
-			argvA [iarg] = Melder_wcsToUtf8 (argvW [iarg]);
+			argvA [iarg] = Melder_32to8 (Melder_peekWto32 ((argvW [iarg])));
 		}
 	}
 	return main (argc, argvA);
diff --git a/sys/melder_debug.cpp b/sys/melder_debug.cpp
index 42bd9ea..cbf0837 100644
--- a/sys/melder_debug.cpp
+++ b/sys/melder_debug.cpp
@@ -18,11 +18,16 @@
  */
 
 #include "melder.h"
+#include <math.h>   // for floor()
 #ifdef linux
 	#include "GuiP.h"
 #endif
 #include <time.h>
 #include "praat_version.h"
+#ifdef _WIN32
+	#include "UnicodeData.h"
+	#include <windows.h>
+#endif
 
 int Melder_debug = 0;
 
@@ -81,34 +86,557 @@ the behaviour of that program changes in the following way:
 
 */
 
+/*
+ * In order to make sure that Melder_casual() and trace() can be called from anywhere,
+ * including e.g. from Melder_realloc() or Melder_free(),
+ * they cannot use any Melder_xxx() functions.
+ */
+
+/*
+ * peek32to8 substitutes for Melder_peek32to8(),
+ * which can call Melder_realloc() and Melder_free();
+ * also, we need no newline nativization, as Melder_32to8_inline() does.
+ */
+static const char * peek32to8 (const char32 *string) {
+	if (! string) return "";
+	static char *buffer { nullptr };
+	static int64 bufferSize { 0 };
+	int64 n = str32len (string);
+	int64 sizeNeeded = n * 4 + 1;
+	if ((bufferSize - sizeNeeded) * (int64) sizeof (char) >= 10000) {
+		free (buffer);
+		buffer = nullptr;   // undangle
+		bufferSize = 0;
+	}
+	if (sizeNeeded > bufferSize) {
+		sizeNeeded = (int64) floor (sizeNeeded * 1.61803) + 100;
+		buffer = (char *) realloc (buffer, (size_t) sizeNeeded * sizeof (char));
+		if (buffer == nullptr) {
+			bufferSize = 0;
+			return "(out of memory during Melder_casual)";
+		}
+		bufferSize = sizeNeeded;
+	}
+	int64 i, j;
+	for (i = 0, j = 0; i < n; i ++) {
+		char32 kar = string [i];
+		if (kar <= 0x00007F) {   // 7 bits
+			buffer [j ++] = (char) (char8) kar;   // guarded truncation
+		} else if (kar <= 0x0007FF) {   // 11 bits
+			buffer [j ++] = (char) (char8) (0x0000C0 | (kar >> 6));   // the upper 5 bits yield a number between 0xC4 and 0xDF
+			buffer [j ++] = (char) (char8) (0x000080 | (kar & 0x00003F));   // the lower 6 bits yield a number between 0x80 and 0xBF
+		} else if (kar <= 0x00FFFF) {   // 16 bits
+			buffer [j ++] = (char) (char8) (0x0000E0 | (kar >> 12));   // the upper 4 bits yield a number between 0xE0 and 0xEF
+			buffer [j ++] = (char) (char8) (0x000080 | ((kar >> 6) & 0x00003F));
+			buffer [j ++] = (char) (char8) (0x000080 | (kar & 0x00003F));
+		} else {   // 21 bits
+			buffer [j ++] = (char) (char8) (0x0000F0 | (kar >> 18));   // the upper 3 bits yield a number between 0xF0 and 0xF4 (0x10FFFF >> 18 == 4)
+			buffer [j ++] = (char) (char8) (0x000080 | ((kar >> 12) & 0x00003F));   // the next 6 bits
+			buffer [j ++] = (char) (char8) (0x000080 | ((kar >> 6) & 0x00003F));   // the third 6 bits
+			buffer [j ++] = (char) (char8) (0x000080 | (kar & 0x00003F));   // the lower 6 bits
+		}
+	}
+	buffer [j] = '\0';
+	return buffer;
+}
+#ifdef _WIN32
+static const char16 * peek32to16 (const char32 *string) {
+	if (! string) return u"";
+	static char16 *buffer { nullptr };
+	static int64 bufferSize { 0 };
+	int64 n = str32len (string);
+	int64 sizeNeeded = n * 2 + 1;
+	if ((bufferSize - sizeNeeded) * (int64) sizeof (char16) >= 10000) {
+		free (buffer);
+		bufferSize = 0;
+	}
+	if (sizeNeeded > bufferSize) {
+		sizeNeeded = (int64) floor (sizeNeeded * 1.61803) + 100;
+		buffer = (char16 *) realloc (buffer, (size_t) sizeNeeded * sizeof (char16));
+		if (! buffer) {
+			bufferSize = 0;
+			return u"(out of memory during trace)";
+		}
+		bufferSize = sizeNeeded;
+	}
+	int64 i, j;
+	for (i = 0, j = 0; i < n; i ++) {
+		char32 kar = string [i];
+		if (kar <= 0x00D7FF) {   // 16 bits
+			buffer [j ++] = (char16) kar;   // guarded truncation
+		} else if (kar <= 0x00DFFF) {   // 16 bits
+			buffer [j ++] = (char16) UNICODE_REPLACEMENT_CHARACTER;   // forbidden for UTF-32
+		} else if (kar <= 0x00FFFF) {   // 16 bits
+			buffer [j ++] = (char16) kar;   // guarded truncation
+		} else if (kar <= 0x10FFFF) {   // 21 bits
+			kar -= 0x010000;
+			buffer [j ++] = (char16) (0x00D800 | (kar >> 10));   // guarded truncation
+			buffer [j ++] = (char16) (0x00DC00 | (kar & 0x0003FF));   // guarded truncation
+		} else {   // 21 bits
+			buffer [j ++] = (char16) UNICODE_REPLACEMENT_CHARACTER;
+		}
+	}
+	buffer [j] = u'\0';
+	return buffer;
+}
+#endif
+
+bool Melder_consoleIsAnsi = false;
+
+void Melder_writeToConsole (const char32 *message, bool useStderr) {
+	if (! message) return;
+	#if defined (_WIN32)
+		(void) useStderr;
+		static HANDLE console = nullptr;
+		if (! console) {
+			console = CreateFileW (L"CONOUT$", GENERIC_WRITE, FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, 0);
+		}
+		if (Melder_consoleIsAnsi) {
+			size_t n = str32len (message);
+			for (long i = 0; i < n; i ++) {
+				unsigned int kar = (unsigned short) message [i];
+				fputc (kar, stdout);
+			}
+		//} else if (Melder_consoleIsUtf8) {
+			//char *messageA = Melder_peek32to8 (message);
+			//fprintf (stdout, "%s", messageA);
+		} else {
+			WCHAR* messageW = (WCHAR*) peek32to16 (message);
+			WriteConsoleW (console, messageW, wcslen (messageW), nullptr, nullptr);
+		}
+	#else
+		FILE *f = ( useStderr ? stderr : stdout );
+		for (const char32* p = message; *p != U'\0'; p ++) {
+			char32 kar = *p;
+			if (kar <= 0x00007F) {
+				fputc ((int) kar, f);   // because fputc wants an int instead of an uint8 (guarded conversion)
+			} else if (kar <= 0x0007FF) {
+				fputc (0xC0 | (kar >> 6), f);
+				fputc (0x80 | (kar & 0x00003F), f);
+			} else if (kar <= 0x00FFFF) {
+				fputc (0xE0 | (kar >> 12), f);
+				fputc (0x80 | ((kar >> 6) & 0x00003F), f);
+				fputc (0x80 | (kar & 0x00003F), f);
+			} else {
+				fputc (0xF0 | (kar >> 18), f);
+				fputc (0x80 | ((kar >> 12) & 0x00003F), f);
+				fputc (0x80 | ((kar >> 6) & 0x00003F), f);
+				fputc (0x80 | (kar & 0x00003F), f);
+			}
+		}
+	#endif
+}
+
+/********** CASUAL **********/
+
+void Melder_casual (Melder_1_ARG) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_2_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_3_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_4_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_5_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (arg5. _arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_6_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (arg5. _arg, true);
+	Melder_writeToConsole (arg6. _arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_7_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (arg5. _arg, true);
+	Melder_writeToConsole (arg6. _arg, true);
+	Melder_writeToConsole (arg7. _arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_8_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (arg5. _arg, true);
+	Melder_writeToConsole (arg6. _arg, true);
+	Melder_writeToConsole (arg7. _arg, true);
+	Melder_writeToConsole (arg8. _arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_9_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (arg5. _arg, true);
+	Melder_writeToConsole (arg6. _arg, true);
+	Melder_writeToConsole (arg7. _arg, true);
+	Melder_writeToConsole (arg8. _arg, true);
+	Melder_writeToConsole (arg9. _arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_10_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (arg5. _arg, true);
+	Melder_writeToConsole (arg6. _arg, true);
+	Melder_writeToConsole (arg7. _arg, true);
+	Melder_writeToConsole (arg8. _arg, true);
+	Melder_writeToConsole (arg9. _arg, true);
+	Melder_writeToConsole (arg10._arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_11_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (arg5. _arg, true);
+	Melder_writeToConsole (arg6. _arg, true);
+	Melder_writeToConsole (arg7. _arg, true);
+	Melder_writeToConsole (arg8. _arg, true);
+	Melder_writeToConsole (arg9. _arg, true);
+	Melder_writeToConsole (arg10._arg, true);
+	Melder_writeToConsole (arg11._arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_13_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (arg5. _arg, true);
+	Melder_writeToConsole (arg6. _arg, true);
+	Melder_writeToConsole (arg7. _arg, true);
+	Melder_writeToConsole (arg8. _arg, true);
+	Melder_writeToConsole (arg9. _arg, true);
+	Melder_writeToConsole (arg10._arg, true);
+	Melder_writeToConsole (arg11._arg, true);
+	Melder_writeToConsole (arg12._arg, true);
+	Melder_writeToConsole (arg13._arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_15_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (arg5. _arg, true);
+	Melder_writeToConsole (arg6. _arg, true);
+	Melder_writeToConsole (arg7. _arg, true);
+	Melder_writeToConsole (arg8. _arg, true);
+	Melder_writeToConsole (arg9. _arg, true);
+	Melder_writeToConsole (arg10._arg, true);
+	Melder_writeToConsole (arg11._arg, true);
+	Melder_writeToConsole (arg12._arg, true);
+	Melder_writeToConsole (arg13._arg, true);
+	Melder_writeToConsole (arg14._arg, true);
+	Melder_writeToConsole (arg15._arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+void Melder_casual (Melder_19_ARGS) {
+	Melder_writeToConsole (arg1. _arg, true);
+	Melder_writeToConsole (arg2. _arg, true);
+	Melder_writeToConsole (arg3. _arg, true);
+	Melder_writeToConsole (arg4. _arg, true);
+	Melder_writeToConsole (arg5. _arg, true);
+	Melder_writeToConsole (arg6. _arg, true);
+	Melder_writeToConsole (arg7. _arg, true);
+	Melder_writeToConsole (arg8. _arg, true);
+	Melder_writeToConsole (arg9. _arg, true);
+	Melder_writeToConsole (arg10._arg, true);
+	Melder_writeToConsole (arg11._arg, true);
+	Melder_writeToConsole (arg12._arg, true);
+	Melder_writeToConsole (arg13._arg, true);
+	Melder_writeToConsole (arg14._arg, true);
+	Melder_writeToConsole (arg15._arg, true);
+	Melder_writeToConsole (arg16._arg, true);
+	Melder_writeToConsole (arg17._arg, true);
+	Melder_writeToConsole (arg18._arg, true);
+	Melder_writeToConsole (arg19._arg, true);
+	Melder_writeToConsole (U"\n", true);
+}
+
+/********** TRACE **********/
+
 bool Melder_isTracing = false;
 static structMelderFile theTracingFile = { 0 };
 
+void Melder_tracingToFile (MelderFile file) {
+	MelderFile_copy (file, & theTracingFile);
+	MelderFile_delete (& theTracingFile);
+}
+
+static FILE * Melder_trace_open (const char *fileName, int lineNumber, const char *functionName) {
+	FILE *f;
+	#if defined (_WIN32) && ! defined (__CYGWIN__)
+		f = _wfopen ((const wchar_t *) peek32to16 (theTracingFile. path), L"a");
+	#else
+		char utf8path [kMelder_MAXPATH+1];
+		Melder_str32To8bitFileRepresentation_inline (theTracingFile. path, utf8path);   // this Melder_xxx() function is OK to call
+		f = fopen ((char *) utf8path, "a");
+	#endif
+	if (! f) f = stderr;   // if the file cannot be opened, we can still trace to stderr!
+	if (fileName) {
+		const char *slashPosition = strrchr (fileName, Melder_DIRECTORY_SEPARATOR);
+		fprintf (f, "%s (%s:%d): ", functionName, slashPosition ? slashPosition + 1 : fileName, lineNumber);
+	} else {
+		fprintf (f, "%s: ", functionName);
+	}
+	return f;
+}
+
+static void Melder_trace_close (FILE *f) {
+	fprintf (f, "\n");
+	if (f != stderr) fclose (f);
+}
+
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_1_ARG) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1._arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_2_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_3_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_4_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_5_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	fprintf (f, "%s", peek32to8 (arg5. _arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_6_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	fprintf (f, "%s", peek32to8 (arg5. _arg));
+	fprintf (f, "%s", peek32to8 (arg6. _arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_7_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	fprintf (f, "%s", peek32to8 (arg5. _arg));
+	fprintf (f, "%s", peek32to8 (arg6. _arg));
+	fprintf (f, "%s", peek32to8 (arg7. _arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_8_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	fprintf (f, "%s", peek32to8 (arg5. _arg));
+	fprintf (f, "%s", peek32to8 (arg6. _arg));
+	fprintf (f, "%s", peek32to8 (arg7. _arg));
+	fprintf (f, "%s", peek32to8 (arg8. _arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_9_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	fprintf (f, "%s", peek32to8 (arg5. _arg));
+	fprintf (f, "%s", peek32to8 (arg6. _arg));
+	fprintf (f, "%s", peek32to8 (arg7. _arg));
+	fprintf (f, "%s", peek32to8 (arg8. _arg));
+	fprintf (f, "%s", peek32to8 (arg9. _arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_10_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	fprintf (f, "%s", peek32to8 (arg5. _arg));
+	fprintf (f, "%s", peek32to8 (arg6. _arg));
+	fprintf (f, "%s", peek32to8 (arg7. _arg));
+	fprintf (f, "%s", peek32to8 (arg8. _arg));
+	fprintf (f, "%s", peek32to8 (arg9. _arg));
+	fprintf (f, "%s", peek32to8 (arg10._arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_11_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	fprintf (f, "%s", peek32to8 (arg5. _arg));
+	fprintf (f, "%s", peek32to8 (arg6. _arg));
+	fprintf (f, "%s", peek32to8 (arg7. _arg));
+	fprintf (f, "%s", peek32to8 (arg8. _arg));
+	fprintf (f, "%s", peek32to8 (arg9. _arg));
+	fprintf (f, "%s", peek32to8 (arg10._arg));
+	fprintf (f, "%s", peek32to8 (arg11._arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_13_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	fprintf (f, "%s", peek32to8 (arg5. _arg));
+	fprintf (f, "%s", peek32to8 (arg6. _arg));
+	fprintf (f, "%s", peek32to8 (arg7. _arg));
+	fprintf (f, "%s", peek32to8 (arg8. _arg));
+	fprintf (f, "%s", peek32to8 (arg9. _arg));
+	fprintf (f, "%s", peek32to8 (arg10._arg));
+	fprintf (f, "%s", peek32to8 (arg11._arg));
+	fprintf (f, "%s", peek32to8 (arg12._arg));
+	fprintf (f, "%s", peek32to8 (arg13._arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_15_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	fprintf (f, "%s", peek32to8 (arg5. _arg));
+	fprintf (f, "%s", peek32to8 (arg6. _arg));
+	fprintf (f, "%s", peek32to8 (arg7. _arg));
+	fprintf (f, "%s", peek32to8 (arg8. _arg));
+	fprintf (f, "%s", peek32to8 (arg9. _arg));
+	fprintf (f, "%s", peek32to8 (arg10._arg));
+	fprintf (f, "%s", peek32to8 (arg11._arg));
+	fprintf (f, "%s", peek32to8 (arg12._arg));
+	fprintf (f, "%s", peek32to8 (arg13._arg));
+	fprintf (f, "%s", peek32to8 (arg14._arg));
+	fprintf (f, "%s", peek32to8 (arg15._arg));
+	Melder_trace_close (f);
+}
+void Melder_trace (const char *fileName, int lineNumber, const char *functionName, Melder_19_ARGS) {
+	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
+	FILE *f = Melder_trace_open (fileName, lineNumber, functionName);
+	fprintf (f, "%s", peek32to8 (arg1. _arg));
+	fprintf (f, "%s", peek32to8 (arg2. _arg));
+	fprintf (f, "%s", peek32to8 (arg3. _arg));
+	fprintf (f, "%s", peek32to8 (arg4. _arg));
+	fprintf (f, "%s", peek32to8 (arg5. _arg));
+	fprintf (f, "%s", peek32to8 (arg6. _arg));
+	fprintf (f, "%s", peek32to8 (arg7. _arg));
+	fprintf (f, "%s", peek32to8 (arg8. _arg));
+	fprintf (f, "%s", peek32to8 (arg9. _arg));
+	fprintf (f, "%s", peek32to8 (arg10._arg));
+	fprintf (f, "%s", peek32to8 (arg11._arg));
+	fprintf (f, "%s", peek32to8 (arg12._arg));
+	fprintf (f, "%s", peek32to8 (arg13._arg));
+	fprintf (f, "%s", peek32to8 (arg14._arg));
+	fprintf (f, "%s", peek32to8 (arg15._arg));
+	fprintf (f, "%s", peek32to8 (arg16._arg));
+	fprintf (f, "%s", peek32to8 (arg17._arg));
+	fprintf (f, "%s", peek32to8 (arg18._arg));
+	fprintf (f, "%s", peek32to8 (arg19._arg));
+	Melder_trace_close (f);
+}
+
 #ifdef linux
 static void theGtkLogHandler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer unused_data) {
-	Melder_trace_FMT (NULL, 0, "GTK", "%s", message);
+	FILE *f = Melder_trace_open (nullptr, 0, "GTK");
+	fprintf (f, "%s", message);
+	Melder_trace_close (f);
 }
 static void theGlibLogHandler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer unused_data) {
-	Melder_trace_FMT (NULL, 0, "GLib", "%s", message);
+	FILE *f = Melder_trace_open (nullptr, 0, "GLib");
+	fprintf (f, "%s", message);
+	Melder_trace_close (f);
 }
 static void theGlibGobjectLogHandler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer unused_data) {
-	Melder_trace_FMT (NULL, 0, "GLib-GObject", "%s", message);
+	FILE *f = Melder_trace_open (nullptr, 0, "GLib-GObject");
+	fprintf (f, "%s", message);
+	Melder_trace_close (f);
 }
 #endif
 
 void Melder_setTracing (bool tracing) {
-	time_t today = time (NULL);	
+	time_t today = time (nullptr);
 	#define xstr(s) str(s)
 	#define str(s) #s
 	if (! tracing)
-		trace ("switch tracing off in Praat version %s at %s", xstr (PRAAT_VERSION_STR), ctime (& today));
+		trace (U"switch tracing off"
+			U" in Praat version ", Melder_peek8to32 (xstr (PRAAT_VERSION_STR)),
+			U" at ", Melder_peek8to32 (ctime (& today))
+		);
 	Melder_isTracing = tracing;
 	#ifdef linux
 		static guint handler_id1, handler_id2, handler_id3;
 		if (tracing) {
-			handler_id1 = g_log_set_handler ("Gtk",          (GLogLevelFlags) (G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), theGtkLogHandler,         NULL);
-			handler_id2 = g_log_set_handler ("GLib",         (GLogLevelFlags) (G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), theGlibLogHandler,        NULL);
-			handler_id3 = g_log_set_handler ("GLib-GObject", (GLogLevelFlags) (G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), theGlibGobjectLogHandler, NULL);
+			handler_id1 = g_log_set_handler ("Gtk",          (GLogLevelFlags) (G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), theGtkLogHandler,         nullptr);
+			handler_id2 = g_log_set_handler ("GLib",         (GLogLevelFlags) (G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), theGlibLogHandler,        nullptr);
+			handler_id3 = g_log_set_handler ("GLib-GObject", (GLogLevelFlags) (G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), theGlibGobjectLogHandler, nullptr);
 		} else {
 			if (handler_id1) g_log_remove_handler ("Gtk",          handler_id1);
 			if (handler_id2) g_log_remove_handler ("GLib",         handler_id2);
@@ -117,34 +645,10 @@ void Melder_setTracing (bool tracing) {
 		}
 	#endif
 	if (tracing)
-		trace ("switch tracing on in Praat version %s at %s", xstr (PRAAT_VERSION_STR), ctime (& today));
-}
-
-void Melder_tracingToFile (MelderFile file) {
-	MelderFile_copy (file, & theTracingFile);
-	MelderFile_delete (& theTracingFile);
-}
-
-void Melder_trace_FMT (const char *fileName, int lineNumber, const char *functionName, const char *format, ...) {
-	if (! Melder_isTracing || MelderFile_isNull (& theTracingFile)) return;
-	try {
-		FILE *f = Melder_fopen (& theTracingFile, "a");
-		if (fileName) {
-			const char *slashPosition = strrchr (fileName, Melder_DIRECTORY_SEPARATOR);
-			fprintf (f, "%s (%s:%d): ", functionName, slashPosition ? slashPosition + 1 : fileName, lineNumber);
-		} else {
-			fprintf (f, "%s: ", functionName);
-		}
-		va_list arg;
-		va_start (arg, format);
-		vfprintf (f, format, arg);
-		va_end (arg);
-		char lastCharacter = format [0] == '\0' ? '\0' : format [strlen (format) - 1];
-		fprintf (f, strchr (".!?,;", lastCharacter) ? "\n" : ".\n");
-		Melder_fclose (& theTracingFile, f);
-	} catch (MelderError) {
-		Melder_clearError ();   // ignore
-	}
+		trace (U"switch tracing on"
+			U" in Praat version ", Melder_peek8to32 (xstr (PRAAT_VERSION_STR)),
+			U" at ", Melder_peek8to32 (ctime (& today))
+		);
 }
 
 /* End of file melder_debug.cpp */
diff --git a/sys/melder_enums.h b/sys/melder_enums.h
index 2b8fd18..2ab1213 100644
--- a/sys/melder_enums.h
+++ b/sys/melder_enums.h
@@ -1,6 +1,6 @@
 /* melder_enums.h
  *
- * Copyright (C) 2007,2013 Paul Boersma
+ * Copyright (C) 2007,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,54 +18,94 @@
  */
 
 enums_begin (kMelder_number, 1)
-	enums_add (kMelder_number, 1, EQUAL_TO, L"equal to")
-	enums_add (kMelder_number, 2, NOT_EQUAL_TO, L"not equal to")
-	enums_add (kMelder_number, 3, LESS_THAN, L"less than")
-	enums_add (kMelder_number, 4, LESS_THAN_OR_EQUAL_TO, L"less than or equal to")
-	enums_add (kMelder_number, 5, GREATER_THAN, L"greater than")
-	enums_add (kMelder_number, 6, GREATER_THAN_OR_EQUAL_TO, L"greater than or equal to")
+	enums_add (kMelder_number, 1, EQUAL_TO, U"equal to")
+	enums_add (kMelder_number, 2, NOT_EQUAL_TO, U"not equal to")
+	enums_add (kMelder_number, 3, LESS_THAN, U"less than")
+	enums_add (kMelder_number, 4, LESS_THAN_OR_EQUAL_TO, U"less than or equal to")
+	enums_add (kMelder_number, 5, GREATER_THAN, U"greater than")
+	enums_add (kMelder_number, 6, GREATER_THAN_OR_EQUAL_TO, U"greater than or equal to")
 enums_end (kMelder_number, 6, EQUAL_TO)
 
 enums_begin (kMelder_string, 1)
-	enums_add (kMelder_string, 1, EQUAL_TO, L"is equal to")
-	enums_add (kMelder_string, 2, NOT_EQUAL_TO, L"is not equal to")
-	enums_add (kMelder_string, 3, CONTAINS, L"contains")
-	enums_add (kMelder_string, 4, DOES_NOT_CONTAIN, L"does not contain")
-	enums_add (kMelder_string, 5, STARTS_WITH, L"starts with")
-	enums_add (kMelder_string, 6, DOES_NOT_START_WITH, L"does not start with")
-	enums_add (kMelder_string, 7, ENDS_WITH, L"ends with")
-	enums_add (kMelder_string, 8, DOES_NOT_END_WITH, L"does not end with")
-	enums_add (kMelder_string, 9, MATCH_REGEXP, L"matches (regex)")
+	enums_add (kMelder_string, 1, EQUAL_TO, U"is equal to")
+	enums_add (kMelder_string, 2, NOT_EQUAL_TO, U"is not equal to")
+	enums_add (kMelder_string, 3, CONTAINS, U"contains")
+	enums_add (kMelder_string, 4, DOES_NOT_CONTAIN, U"does not contain")
+	enums_add (kMelder_string, 5, STARTS_WITH, U"starts with")
+	enums_add (kMelder_string, 6, DOES_NOT_START_WITH, U"does not start with")
+	enums_add (kMelder_string, 7, ENDS_WITH, U"ends with")
+	enums_add (kMelder_string, 8, DOES_NOT_END_WITH, U"does not end with")
+	enums_add (kMelder_string, 9, MATCH_REGEXP, U"matches (regex)")
 enums_end (kMelder_string, 9, EQUAL_TO)
 
 enums_begin (kMelder_textInputEncoding, 1)
-	enums_add (kMelder_textInputEncoding, 1, UTF8, L"UTF-8")
-	enums_add (kMelder_textInputEncoding, 2, UTF8_THEN_ISO_LATIN1, L"try UTF-8, then ISO Latin-1")
-	enums_add (kMelder_textInputEncoding, 3, ISO_LATIN1, L"ISO Latin-1")
-	enums_add (kMelder_textInputEncoding, 4, UTF8_THEN_WINDOWS_LATIN1, L"try UTF-8, then Windows Latin-1")
-	enums_add (kMelder_textInputEncoding, 5, WINDOWS_LATIN1, L"Windows Latin-1")
-	enums_add (kMelder_textInputEncoding, 6, UTF8_THEN_MACROMAN, L"try UTF-8, then MacRoman")
-	enums_add (kMelder_textInputEncoding, 7, MACROMAN, L"MacRoman")
-#if defined (macintosh)
-enums_end (kMelder_textInputEncoding, 7, UTF8_THEN_MACROMAN)
-#elif defined (_WIN32)
+	enums_add (kMelder_textInputEncoding, 1, UTF8, U"UTF-8")
+	enums_add (kMelder_textInputEncoding, 2, UTF8_THEN_ISO_LATIN1, U"try UTF-8, then ISO Latin-1")
+	enums_add (kMelder_textInputEncoding, 3, ISO_LATIN1, U"ISO Latin-1")
+	enums_add (kMelder_textInputEncoding, 4, UTF8_THEN_WINDOWS_LATIN1, U"try UTF-8, then Windows Latin-1")
+	enums_add (kMelder_textInputEncoding, 5, WINDOWS_LATIN1, U"Windows Latin-1")
+	enums_add (kMelder_textInputEncoding, 6, UTF8_THEN_MACROMAN, U"try UTF-8, then MacRoman")
+	enums_add (kMelder_textInputEncoding, 7, MACROMAN, U"MacRoman")
+#if defined (_WIN32)
 enums_end (kMelder_textInputEncoding, 7, UTF8_THEN_WINDOWS_LATIN1)
+#elif defined (macintosh)
+enums_end (kMelder_textInputEncoding, 7, UTF8_THEN_MACROMAN)
 #else
 enums_end (kMelder_textInputEncoding, 7, UTF8_THEN_ISO_LATIN1)
 #endif
 
 enums_begin (kMelder_textOutputEncoding, 1)
-	enums_add (kMelder_textOutputEncoding, 1, UTF8, L"UTF-8")
-	enums_add (kMelder_textOutputEncoding, 2, UTF16, L"UTF-16")
-	enums_add (kMelder_textOutputEncoding, 3, ASCII_THEN_UTF16, L"try ASCII, then UTF-16")
-	enums_add (kMelder_textOutputEncoding, 4, ISO_LATIN1_THEN_UTF16, L"try ISO Latin-1, then UTF-16")
+	enums_add (kMelder_textOutputEncoding, 1, UTF8, U"UTF-8")
+	enums_add (kMelder_textOutputEncoding, 2, UTF16, U"UTF-16")
+	enums_add (kMelder_textOutputEncoding, 3, ASCII_THEN_UTF16, U"try ASCII, then UTF-16")
+	enums_add (kMelder_textOutputEncoding, 4, ISO_LATIN1_THEN_UTF16, U"try ISO Latin-1, then UTF-16")
 enums_end (kMelder_textOutputEncoding, 4, ASCII_THEN_UTF16)
 
 enums_begin (kMelder_asynchronicityLevel, 0)
-	enums_add (kMelder_asynchronicityLevel, 0, SYNCHRONOUS, L"synchronous (nothing)")
-	enums_add (kMelder_asynchronicityLevel, 1, CALLING_BACK, L"calling back (view running cursor)")
-	enums_add (kMelder_asynchronicityLevel, 2, INTERRUPTABLE, L"interruptable (Escape key stops playing)")
-	enums_add (kMelder_asynchronicityLevel, 3, ASYNCHRONOUS, L"asynchronous (anything)")
+	enums_add (kMelder_asynchronicityLevel, 0, SYNCHRONOUS, U"synchronous (nothing)")
+	enums_add (kMelder_asynchronicityLevel, 1, CALLING_BACK, U"calling back (view running cursor)")
+	enums_add (kMelder_asynchronicityLevel, 2, INTERRUPTABLE, U"interruptable (Escape key stops playing)")
+	enums_add (kMelder_asynchronicityLevel, 3, ASYNCHRONOUS, U"asynchronous (anything)")
 enums_end (kMelder_asynchronicityLevel, 3, ASYNCHRONOUS)
 
+#if defined (_WIN32)
+
+	enums_begin (kMelder_inputSoundSystem, 1)
+		enums_add (kMelder_inputSoundSystem, 1, MME_VIA_PORTAUDIO, U"MME via PortAudio")
+	enums_end (kMelder_inputSoundSystem, 1, MME_VIA_PORTAUDIO)
+			// in order to allow recording for over 64 megabytes (paMME)
+
+	enums_begin (kMelder_outputSoundSystem, 1)
+		enums_add (kMelder_outputSoundSystem, 1, MME, U"MME")
+		enums_add (kMelder_outputSoundSystem, 2, MME_VIA_PORTAUDIO, U"MME via PortAudio")
+	enums_end (kMelder_outputSoundSystem, 2, MME)
+			// in order to reduce the long latencies of paMME and to avoid the incomplete implementation of paDirectSound
+
+#elif defined (macintosh)
+
+	enums_begin (kMelder_inputSoundSystem, 1)
+		enums_add (kMelder_inputSoundSystem, 1, COREAUDIO_VIA_PORTAUDIO, U"CoreAudio via PortAudio")
+	enums_end (kMelder_inputSoundSystem, 1, COREAUDIO_VIA_PORTAUDIO)
+			// in order to have CoreAudio
+
+	enums_begin (kMelder_outputSoundSystem, 1)
+		enums_add (kMelder_outputSoundSystem, 1, COREAUDIO_VIA_PORTAUDIO, U"CoreAudio via PortAudio")
+	enums_end (kMelder_outputSoundSystem, 1, COREAUDIO_VIA_PORTAUDIO)
+			// in order to have CoreAudio
+
+#else
+
+	enums_begin (kMelder_inputSoundSystem, 1)
+		enums_add (kMelder_inputSoundSystem, 1, ALSA_VIA_PORTAUDIO, U"ALSA via PortAudio")
+	enums_end (kMelder_inputSoundSystem, 1, ALSA_VIA_PORTAUDIO)
+			// in order to use ALSA and therefore be compatible with Ubuntu 10.10 and later
+
+	enums_begin (kMelder_outputSoundSystem, 1)
+		enums_add (kMelder_outputSoundSystem, 1, PULSEAUDIO, U"PulseAudio")
+		enums_add (kMelder_outputSoundSystem, 2, ALSA_VIA_PORTAUDIO, U"ALSA via PortAudio")
+	enums_end (kMelder_outputSoundSystem, 2, PULSEAUDIO)
+			// because we prefer to try PulseAudio directly
+
+#endif
+
 /* End of file melder_enums.h */
diff --git a/sys/melder_error.cpp b/sys/melder_error.cpp
index 445e8f0..febb043 100644
--- a/sys/melder_error.cpp
+++ b/sys/melder_error.cpp
@@ -1,6 +1,6 @@
 /* melder_error.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,62 +18,197 @@
  */
 
 #include "melder.h"
-#include "longchar.h"
 
-static void defaultError (const wchar_t *message) {
-	Melder_writeToConsole (wcsstr (message, L"You interrupted ") ? L"User interrupt: " : L"Error: ", true);
+static void defaultError (const char32 *message) {
+	Melder_writeToConsole (str32str (message, U"You interrupted ") ? U"User interrupt: " : U"Error: ", true);
 	Melder_writeToConsole (message, true);
-	Melder_writeToConsole (L"\n", true);
+	Melder_writeToConsole (U"\n", true);
 }
 
-static void (*theError) (const wchar_t *) = defaultError;   // initial setting after start-up; will stay if program is run from batch
+static void (*theError) (const char32 *) = defaultError;   // initial setting after start-up; will stay if program is run from batch
 
-void Melder_setErrorProc (void (*error) (const wchar_t *)) {
+void Melder_setErrorProc (void (*error) (const char32 *)) {
 	theError = error ? error : defaultError;
 }
 
-static wchar_t errors [2000+1];   // safe in low-memory situations
+static char32 errors [2000+1];   // safe in low-memory situations
 
-static void appendErrorA (const char *message) {
-	int length = wcslen (errors), messageLength = strlen (message);
+static void appendError (const char32 *message) {
+	if (! message) return;
+	int length = str32len (errors), messageLength = str32len (message);
 	if (length + messageLength > 2000) return;
-	for (long i = 0; i < messageLength; i ++) {
-		errors [length + i] = (unsigned char) message [i];
-	}
-	errors [length + messageLength] = L'\0';
-}
-
-static void appendErrorALine (const char *message) {
-	int length = wcslen (errors), messageLength = strlen (message);
-	if (length + messageLength > 2000 - 1) return;   // 1 == length of "\n"
-	for (long i = 0; i < messageLength; i ++) {
-		errors [length + i] = (unsigned char) message [i];
-	}
-	errors [length + messageLength] = L'\n';
-	errors [length + messageLength + 1] = L'\0';
-}
-
-static void appendErrorW (const wchar_t *message) {
-	int length = wcslen (errors), messageLength = wcslen (message);
-	if (length + messageLength > 2000) return;
-	wcscpy (errors + length, message);
-}
-
-bool Melder_hasError () { return errors [0] != L'\0'; }
-
-bool Melder_hasError (const wchar_t *partialError) { return wcsstr (errors, partialError) != NULL; }
-
-void Melder_clearError (void) { errors [0] = L'\0'; }
-
-wchar_t * Melder_getError (void) { return & errors [0]; }
-
-void Melder_flushError (const char *format, ...) {
-	va_list arg;
-	va_start (arg, format);
-	if (format) {
-		vsprintf (Melder_buffer1, format, arg);
-		appendErrorALine (Melder_buffer1);
-	}
+	str32cpy (errors + length, message);
+}
+
+bool Melder_hasError () { return errors [0] != U'\0'; }
+
+bool Melder_hasError (const char32 *partialError) { return !! str32str (errors, partialError); }
+
+void Melder_clearError () { errors [0] = U'\0'; }
+
+char32 * Melder_getError () { return & errors [0]; }
+
+void Melder_appendError (Melder_1_ARG) {
+	appendError (arg1. _arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_2_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_3_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_4_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_5_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (arg5. _arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_6_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (arg5. _arg);
+	appendError (arg6. _arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_7_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (arg5. _arg);
+	appendError (arg6. _arg);
+	appendError (arg7. _arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_8_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (arg5. _arg);
+	appendError (arg6. _arg);
+	appendError (arg7. _arg);
+	appendError (arg8. _arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_9_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (arg5. _arg);
+	appendError (arg6. _arg);
+	appendError (arg7. _arg);
+	appendError (arg8. _arg);
+	appendError (arg9. _arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_10_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (arg5. _arg);
+	appendError (arg6. _arg);
+	appendError (arg7. _arg);
+	appendError (arg8. _arg);
+	appendError (arg9. _arg);
+	appendError (arg10._arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_11_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (arg5. _arg);
+	appendError (arg6. _arg);
+	appendError (arg7. _arg);
+	appendError (arg8. _arg);
+	appendError (arg9. _arg);
+	appendError (arg10._arg);
+	appendError (arg11._arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_13_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (arg5. _arg);
+	appendError (arg6. _arg);
+	appendError (arg7. _arg);
+	appendError (arg8. _arg);
+	appendError (arg9. _arg);
+	appendError (arg10._arg);
+	appendError (arg11._arg);
+	appendError (arg12._arg);
+	appendError (arg13._arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_15_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (arg5. _arg);
+	appendError (arg6. _arg);
+	appendError (arg7. _arg);
+	appendError (arg8. _arg);
+	appendError (arg9. _arg);
+	appendError (arg10._arg);
+	appendError (arg11._arg);
+	appendError (arg12._arg);
+	appendError (arg13._arg);
+	appendError (arg14._arg);
+	appendError (arg15._arg);
+	appendError (U"\n");
+}
+void Melder_appendError (Melder_19_ARGS) {
+	appendError (arg1. _arg);
+	appendError (arg2. _arg);
+	appendError (arg3. _arg);
+	appendError (arg4. _arg);
+	appendError (arg5. _arg);
+	appendError (arg6. _arg);
+	appendError (arg7. _arg);
+	appendError (arg8. _arg);
+	appendError (arg9. _arg);
+	appendError (arg10._arg);
+	appendError (arg11._arg);
+	appendError (arg12._arg);
+	appendError (arg13._arg);
+	appendError (arg14._arg);
+	appendError (arg15._arg);
+	appendError (arg16._arg);
+	appendError (arg17._arg);
+	appendError (arg18._arg);
+	appendError (arg19._arg);
+	appendError (U"\n");
+}
+
+void Melder_appendError_noLine (Melder_1_ARG) {
+	appendError (arg1._arg);
+}
+
+void Melder_flushError () {
 	/*
 		"errors" has to be cleared *before* the message is put on the screen.
 		This is because on some platforms the message dialog is synchronous
@@ -81,217 +216,25 @@ void Melder_flushError (const char *format, ...) {
 		and some operating systems may force an immediate redraw event as soon as
 		the message dialog is closed. We want "errors" to be empty when redrawing!
 	*/
-	static wchar_t temp [2000+1];
-	wcscpy (temp, errors);
+	static char32 temp [2000+1];
+	str32cpy (temp, errors);
 	Melder_clearError ();
 	theError (temp);
-	va_end (arg);
-}
-
-void Melder_error_noLine (const MelderArg& arg1)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-}
-
-void Melder_error_ (const MelderArg& arg1)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4, const MelderArg& arg5)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	if (arg5.argW) { if (arg5.type == 1) appendErrorW (arg5.argW); else appendErrorA (arg5.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	if (arg5.argW) { if (arg5.type == 1) appendErrorW (arg5.argW); else appendErrorA (arg5.arg8); }
-	if (arg6.argW) { if (arg6.type == 1) appendErrorW (arg6.argW); else appendErrorA (arg6.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	if (arg5.argW) { if (arg5.type == 1) appendErrorW (arg5.argW); else appendErrorA (arg5.arg8); }
-	if (arg6.argW) { if (arg6.type == 1) appendErrorW (arg6.argW); else appendErrorA (arg6.arg8); }
-	if (arg7.argW) { if (arg7.type == 1) appendErrorW (arg7.argW); else appendErrorA (arg7.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	if (arg5.argW) { if (arg5.type == 1) appendErrorW (arg5.argW); else appendErrorA (arg5.arg8); }
-	if (arg6.argW) { if (arg6.type == 1) appendErrorW (arg6.argW); else appendErrorA (arg6.arg8); }
-	if (arg7.argW) { if (arg7.type == 1) appendErrorW (arg7.argW); else appendErrorA (arg7.arg8); }
-	if (arg8.argW) { if (arg8.type == 1) appendErrorW (arg8.argW); else appendErrorA (arg8.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8, const MelderArg& arg9)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	if (arg5.argW) { if (arg5.type == 1) appendErrorW (arg5.argW); else appendErrorA (arg5.arg8); }
-	if (arg6.argW) { if (arg6.type == 1) appendErrorW (arg6.argW); else appendErrorA (arg6.arg8); }
-	if (arg7.argW) { if (arg7.type == 1) appendErrorW (arg7.argW); else appendErrorA (arg7.arg8); }
-	if (arg8.argW) { if (arg8.type == 1) appendErrorW (arg8.argW); else appendErrorA (arg8.arg8); }
-	if (arg9.argW) { if (arg9.type == 1) appendErrorW (arg9.argW); else appendErrorA (arg9.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	if (arg5.argW) { if (arg5.type == 1) appendErrorW (arg5.argW); else appendErrorA (arg5.arg8); }
-	if (arg6.argW) { if (arg6.type == 1) appendErrorW (arg6.argW); else appendErrorA (arg6.arg8); }
-	if (arg7.argW) { if (arg7.type == 1) appendErrorW (arg7.argW); else appendErrorA (arg7.arg8); }
-	if (arg8.argW) { if (arg8.type == 1) appendErrorW (arg8.argW); else appendErrorA (arg8.arg8); }
-	if (arg9.argW) { if (arg9.type == 1) appendErrorW (arg9.argW); else appendErrorA (arg9.arg8); }
-	if (arg10.argW) { if (arg10.type == 1) appendErrorW (arg10.argW); else appendErrorA (arg10.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	if (arg5.argW) { if (arg5.type == 1) appendErrorW (arg5.argW); else appendErrorA (arg5.arg8); }
-	if (arg6.argW) { if (arg6.type == 1) appendErrorW (arg6.argW); else appendErrorA (arg6.arg8); }
-	if (arg7.argW) { if (arg7.type == 1) appendErrorW (arg7.argW); else appendErrorA (arg7.arg8); }
-	if (arg8.argW) { if (arg8.type == 1) appendErrorW (arg8.argW); else appendErrorA (arg8.arg8); }
-	if (arg9.argW) { if (arg9.type == 1) appendErrorW (arg9.argW); else appendErrorA (arg9.arg8); }
-	if (arg10.argW) { if (arg10.type == 1) appendErrorW (arg10.argW); else appendErrorA (arg10.arg8); }
-	if (arg11.argW) { if (arg11.type == 1) appendErrorW (arg11.argW); else appendErrorA (arg11.arg8); }
-	appendErrorW (L"\n");
 }
 
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12, const MelderArg& arg13)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	if (arg5.argW) { if (arg5.type == 1) appendErrorW (arg5.argW); else appendErrorA (arg5.arg8); }
-	if (arg6.argW) { if (arg6.type == 1) appendErrorW (arg6.argW); else appendErrorA (arg6.arg8); }
-	if (arg7.argW) { if (arg7.type == 1) appendErrorW (arg7.argW); else appendErrorA (arg7.arg8); }
-	if (arg8.argW) { if (arg8.type == 1) appendErrorW (arg8.argW); else appendErrorA (arg8.arg8); }
-	if (arg9.argW) { if (arg9.type == 1) appendErrorW (arg9.argW); else appendErrorA (arg9.arg8); }
-	if (arg10.argW) { if (arg10.type == 1) appendErrorW (arg10.argW); else appendErrorA (arg10.arg8); }
-	if (arg11.argW) { if (arg11.type == 1) appendErrorW (arg11.argW); else appendErrorA (arg11.arg8); }
-	if (arg12.argW) { if (arg12.type == 1) appendErrorW (arg12.argW); else appendErrorA (arg12.arg8); }
-	if (arg13.argW) { if (arg13.type == 1) appendErrorW (arg13.argW); else appendErrorA (arg13.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12,
-	const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	if (arg5.argW) { if (arg5.type == 1) appendErrorW (arg5.argW); else appendErrorA (arg5.arg8); }
-	if (arg6.argW) { if (arg6.type == 1) appendErrorW (arg6.argW); else appendErrorA (arg6.arg8); }
-	if (arg7.argW) { if (arg7.type == 1) appendErrorW (arg7.argW); else appendErrorA (arg7.arg8); }
-	if (arg8.argW) { if (arg8.type == 1) appendErrorW (arg8.argW); else appendErrorA (arg8.arg8); }
-	if (arg9.argW) { if (arg9.type == 1) appendErrorW (arg9.argW); else appendErrorA (arg9.arg8); }
-	if (arg10.argW) { if (arg10.type == 1) appendErrorW (arg10.argW); else appendErrorA (arg10.arg8); }
-	if (arg11.argW) { if (arg11.type == 1) appendErrorW (arg11.argW); else appendErrorA (arg11.arg8); }
-	if (arg12.argW) { if (arg12.type == 1) appendErrorW (arg12.argW); else appendErrorA (arg12.arg8); }
-	if (arg13.argW) { if (arg13.type == 1) appendErrorW (arg13.argW); else appendErrorA (arg13.arg8); }
-	if (arg14.argW) { if (arg14.type == 1) appendErrorW (arg14.argW); else appendErrorA (arg14.arg8); }
-	if (arg15.argW) { if (arg15.type == 1) appendErrorW (arg15.argW); else appendErrorA (arg15.arg8); }
-	appendErrorW (L"\n");
-}
-
-void Melder_error_ (const MelderArg& arg1, const MelderArg& arg2, const MelderArg& arg3, const MelderArg& arg4,
-	const MelderArg& arg5, const MelderArg& arg6, const MelderArg& arg7, const MelderArg& arg8,
-	const MelderArg& arg9, const MelderArg& arg10, const MelderArg& arg11, const MelderArg& arg12,
-	const MelderArg& arg13, const MelderArg& arg14, const MelderArg& arg15, const MelderArg& arg16,
-	const MelderArg& arg17, const MelderArg& arg18, const MelderArg& arg19, const MelderArg& arg20)
-{
-	if (arg1.argW) { if (arg1.type == 1) appendErrorW (arg1.argW); else appendErrorA (arg1.arg8); }
-	if (arg2.argW) { if (arg2.type == 1) appendErrorW (arg2.argW); else appendErrorA (arg2.arg8); }
-	if (arg3.argW) { if (arg3.type == 1) appendErrorW (arg3.argW); else appendErrorA (arg3.arg8); }
-	if (arg4.argW) { if (arg4.type == 1) appendErrorW (arg4.argW); else appendErrorA (arg4.arg8); }
-	if (arg5.argW) { if (arg5.type == 1) appendErrorW (arg5.argW); else appendErrorA (arg5.arg8); }
-	if (arg6.argW) { if (arg6.type == 1) appendErrorW (arg6.argW); else appendErrorA (arg6.arg8); }
-	if (arg7.argW) { if (arg7.type == 1) appendErrorW (arg7.argW); else appendErrorA (arg7.arg8); }
-	if (arg8.argW) { if (arg8.type == 1) appendErrorW (arg8.argW); else appendErrorA (arg8.arg8); }
-	if (arg9.argW) { if (arg9.type == 1) appendErrorW (arg9.argW); else appendErrorA (arg9.arg8); }
-	if (arg10.argW) { if (arg10.type == 1) appendErrorW (arg10.argW); else appendErrorA (arg10.arg8); }
-	if (arg11.argW) { if (arg11.type == 1) appendErrorW (arg11.argW); else appendErrorA (arg11.arg8); }
-	if (arg12.argW) { if (arg12.type == 1) appendErrorW (arg12.argW); else appendErrorA (arg12.arg8); }
-	if (arg13.argW) { if (arg13.type == 1) appendErrorW (arg13.argW); else appendErrorA (arg13.arg8); }
-	if (arg14.argW) { if (arg14.type == 1) appendErrorW (arg14.argW); else appendErrorA (arg14.arg8); }
-	if (arg15.argW) { if (arg15.type == 1) appendErrorW (arg15.argW); else appendErrorA (arg15.arg8); }
-	if (arg16.argW) { if (arg16.type == 1) appendErrorW (arg16.argW); else appendErrorA (arg16.arg8); }
-	if (arg17.argW) { if (arg17.type == 1) appendErrorW (arg17.argW); else appendErrorA (arg17.arg8); }
-	if (arg18.argW) { if (arg18.type == 1) appendErrorW (arg18.argW); else appendErrorA (arg18.arg8); }
-	if (arg19.argW) { if (arg19.type == 1) appendErrorW (arg19.argW); else appendErrorA (arg19.arg8); }
-	if (arg20.argW) { if (arg20.type == 1) appendErrorW (arg20.argW); else appendErrorA (arg20.arg8); }
-	appendErrorW (L"\n");
-}
+void Melder_flushError (Melder_1_ARG)   { Melder_appendError (Melder_1_ARG_CALL);   Melder_flushError (); }
+void Melder_flushError (Melder_2_ARGS)  { Melder_appendError (Melder_2_ARGS_CALL);  Melder_flushError (); }
+void Melder_flushError (Melder_3_ARGS)  { Melder_appendError (Melder_3_ARGS_CALL);  Melder_flushError (); }
+void Melder_flushError (Melder_4_ARGS)  { Melder_appendError (Melder_4_ARGS_CALL);  Melder_flushError (); }
+void Melder_flushError (Melder_5_ARGS)  { Melder_appendError (Melder_5_ARGS_CALL);  Melder_flushError (); }
+void Melder_flushError (Melder_6_ARGS)  { Melder_appendError (Melder_6_ARGS_CALL);  Melder_flushError (); }
+void Melder_flushError (Melder_7_ARGS)  { Melder_appendError (Melder_7_ARGS_CALL);  Melder_flushError (); }
+void Melder_flushError (Melder_8_ARGS)  { Melder_appendError (Melder_8_ARGS_CALL);  Melder_flushError (); }
+void Melder_flushError (Melder_9_ARGS)  { Melder_appendError (Melder_9_ARGS_CALL);  Melder_flushError (); }
+void Melder_flushError (Melder_10_ARGS) { Melder_appendError (Melder_10_ARGS_CALL); Melder_flushError (); }
+void Melder_flushError (Melder_11_ARGS) { Melder_appendError (Melder_11_ARGS_CALL); Melder_flushError (); }
+void Melder_flushError (Melder_13_ARGS) { Melder_appendError (Melder_13_ARGS_CALL); Melder_flushError (); }
+void Melder_flushError (Melder_15_ARGS) { Melder_appendError (Melder_15_ARGS_CALL); Melder_flushError (); }
+void Melder_flushError (Melder_19_ARGS) { Melder_appendError (Melder_19_ARGS_CALL); Melder_flushError (); }
 
 /* End of file melder_error.cpp */
diff --git a/sys/melder_files.cpp b/sys/melder_files.cpp
index 05c4c04..858d133 100644
--- a/sys/melder_files.cpp
+++ b/sys/melder_files.cpp
@@ -1,6 +1,6 @@
 /* melder_files.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma, 2013 Tom Naughton
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma, 2013 Tom Naughton
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -33,9 +33,9 @@
  * pb 2006/08/12 check whether unicodeName exists
  * pb 2006/10/28 erased MacOS 9 stuff
  * Erez Volk 2007/05/14 FLAC support
- * pb 2007/05/28 wchar_t
- * pb 2007/06/09 more wchar_t
- * pb 2007/08/12 more wchar_t
+ * pb 2007/05/28 wchar
+ * pb 2007/06/09 more wchar
+ * pb 2007/08/12 more wchar
  * pb 2007/10/05 FSFindFolder
  * pb 2008/11/01 warn after finding final tabs (not just spaces) in file names
  * pb 2010/12/14 more high Unicode compatibility
@@ -66,10 +66,13 @@ using namespace std;
 	#include "macport_off.h"
 #endif
 #include <errno.h>
-#include "flac_FLAC_stream_encoder.h"
 #include "abcio.h"
 #include "melder.h"
 
+//#include "flac_FLAC_stream_encoder.h"
+extern "C" int  FLAC__stream_encoder_finish (FLAC__StreamEncoder *);
+extern "C" void FLAC__stream_encoder_delete (FLAC__StreamEncoder *);
+
 #if defined (macintosh)
 	#include <sys/stat.h>
 	#define UNIX
@@ -77,33 +80,27 @@ using namespace std;
 	#include "UnicodeData.h"
 #endif
 
-static wchar_t theShellDirectory [kMelder_MAXPATH+1];
-void Melder_rememberShellDirectory (void) {
+static char32 theShellDirectory [kMelder_MAXPATH+1];
+void Melder_rememberShellDirectory () {
 	structMelderDir shellDir = { { 0 } };
 	Melder_getDefaultDir (& shellDir);
-	wcscpy (theShellDirectory, Melder_dirToPath (& shellDir));
+	str32cpy (theShellDirectory, Melder_dirToPath (& shellDir));
 }
-wchar_t * Melder_getShellDirectory (void) {
+char32 * Melder_getShellDirectory () {
 	return & theShellDirectory [0];
 }
 
-void Melder_wcsTo8bitFileRepresentation_inline (const wchar_t *wcs, char *utf8) {
-	#if defined (_WIN32)
-		int n = wcslen (wcs), i, j;
-		for (i = 0, j = 0; i < n; i ++) {
-			utf8 [j ++] = wcs [i] <= 255 ? wcs [i] : '?';   // The usual replacement on Windows.
-		}
-		utf8 [j] = '\0';	
-	#elif defined (macintosh)
+void Melder_str32To8bitFileRepresentation_inline (const char32 *string, char *utf8) {
+	#if defined (macintosh)
 		/*
 			On the Mac, the POSIX path name is stored in canonically decomposed UTF-8 encoding.
 			The path is probably in precomposed UTF-32.
 			So we first convert to UTF-16, then turn into CFString, then decompose, then convert to UTF-8.
 		*/
 		UniChar unipath [kMelder_MAXPATH+1];
-		size_t n = wcslen (wcs), n_utf16 = 0;
-		for (size_t i = 0; i < n; i ++) {
-			char32_t kar = (char32_t) wcs [i];   // change sign (bit 32 is never used)
+		int64 n = str32len (string), n_utf16 = 0;
+		for (int64 i = 0; i < n; i ++) {
+			char32 kar = (char32) string [i];   // change sign (bit 32 is never used)
 			if (kar <= 0x00FFFF) {
 				unipath [n_utf16 ++] = (UniChar) kar;   // including null byte; guarded truncation
 			} else if (kar <= 0x10FFFF) {
@@ -114,44 +111,52 @@ void Melder_wcsTo8bitFileRepresentation_inline (const wchar_t *wcs, char *utf8)
 				unipath [n_utf16 ++] = UNICODE_REPLACEMENT_CHARACTER;
 			}
 		}
-		unipath [n_utf16] = '\0';
-		CFStringRef cfpath = CFStringCreateWithCharacters (NULL, unipath, n_utf16);
-		CFMutableStringRef cfpath2 = CFStringCreateMutableCopy (NULL, 0, cfpath);
+		unipath [n_utf16] = u'\0';
+		CFStringRef cfpath = CFStringCreateWithCharacters (nullptr, unipath, n_utf16);
+		CFMutableStringRef cfpath2 = CFStringCreateMutableCopy (nullptr, 0, cfpath);
 		CFRelease (cfpath);
-		CFStringNormalize (cfpath2, kCFStringNormalizationFormD);   // Mac requires decomposed characters.
-		CFStringGetCString (cfpath2, (char *) utf8, kMelder_MAXPATH+1, kCFStringEncodingUTF8);   // Mac POSIX requires UTF-8.
+		CFStringNormalize (cfpath2, kCFStringNormalizationFormD);   // Mac requires decomposed characters
+		CFStringGetCString (cfpath2, (char *) utf8, kMelder_MAXPATH+1, kCFStringEncodingUTF8);   // Mac POSIX requires UTF-8
 		CFRelease (cfpath2);
+	#elif defined (UNIX) || defined (__CYGWIN__)
+		Melder_32to8_inline (string, utf8);
+	#elif defined (_WIN32)
+		int n = str32len (string), i, j;
+		for (i = 0, j = 0; i < n; i ++) {
+			utf8 [j ++] = string [i] <= 255 ? string [i] : '?';   // the usual replacement on Windows
+		}
+		utf8 [j] = '\0';
 	#else
-		Melder_wcsToUtf8_inline (wcs, utf8);
+		#error Unsupported platform.
 	#endif
 }
 
-#if ! defined (_WIN32)
-void Melder_8bitFileRepresentationToWcs_inline (const char *path, wchar_t *wpath) {
+#if defined (UNIX)
+void Melder_8bitFileRepresentationToStr32_inline (const char *path8, char32 *path32) {
 	#if defined (macintosh)
-		CFStringRef cfpath = CFStringCreateWithCString (NULL, path, kCFStringEncodingUTF8);
+		CFStringRef cfpath = CFStringCreateWithCString (nullptr, path8, kCFStringEncodingUTF8);
 		Melder_assert (cfpath != 0);
-		CFMutableStringRef cfpath2 = CFStringCreateMutableCopy (NULL, 0, cfpath);
+		CFMutableStringRef cfpath2 = CFStringCreateMutableCopy (nullptr, 0, cfpath);
 		CFRelease (cfpath);
-		CFStringNormalize (cfpath2, kCFStringNormalizationFormC);   // Praat requires composed characters.
+		CFStringNormalize (cfpath2, kCFStringNormalizationFormC);   // Praat requires composed characters
 		long n_utf16 = CFStringGetLength (cfpath2);
-		long n_wcs = 0;
+		long n_utf32 = 0;
 		for (long i = 0; i < n_utf16; i ++) {
-			char32_t kar1 = CFStringGetCharacterAtIndex (cfpath2, i);
+			char32 kar1 = CFStringGetCharacterAtIndex (cfpath2, i);
 			if (kar1 >= 0x00D800 && kar1 <= 0x00DBFF) {
-				char32_t kar2 = (char32_t) CFStringGetCharacterAtIndex (cfpath2, ++ i);   // convert up
+				char32 kar2 = (char32) CFStringGetCharacterAtIndex (cfpath2, ++ i);   // convert up
 				if (kar2 >= 0x00DC00 && kar2 <= 0x00DFFF) {
 					kar1 = (((kar1 & 0x3FF) << 10) | (kar2 & 0x3FF)) + 0x10000;
 				} else {
 					kar1 = UNICODE_REPLACEMENT_CHARACTER;
 				}
 			}
-			wpath [n_wcs ++] = (wchar_t) kar1;
+			path32 [n_utf32 ++] = kar1;
 		}
-		wpath [n_wcs] = '\0';
+		path32 [n_utf32] = U'\0';
 		CFRelease (cfpath2);
 	#else
-		Melder_8bitToWcs_inline (path, wpath, kMelder_textInputEncoding_UTF8);
+		Melder_8to32_inline (path8, path32, kMelder_textInputEncoding_UTF8);
 	#endif
 }
 #endif
@@ -160,36 +165,36 @@ void Melder_8bitFileRepresentationToWcs_inline (const char *path, wchar_t *wpath
 	void Melder_machToFile (void *void_fsref, MelderFile file) {
 		FSRef *fsref = (FSRef *) void_fsref;
 		char path [kMelder_MAXPATH+1];
-		FSRefMakePath (fsref, (unsigned char *) path, kMelder_MAXPATH);   // Decomposed UTF-8.
-		Melder_8bitFileRepresentationToWcs_inline (path, file -> path);
+		FSRefMakePath (fsref, (unsigned char *) path, kMelder_MAXPATH);   // decomposed UTF-8
+		Melder_8bitFileRepresentationToStr32_inline (path, file -> path);
 	}
 #endif
 
-const wchar_t * MelderFile_name (MelderFile file) {
+const char32 * MelderFile_name (MelderFile file) {
 	#if defined (UNIX)
-		wchar_t *slash = wcsrchr (file -> path, '/');
+		char32 *slash = str32rchr (file -> path, U'/');
 		return slash ? slash + 1 : file -> path;
 	#elif defined (_WIN32)
-		wchar_t *backslash = wcsrchr (file -> path, '\\');
+		char32 *backslash = str32rchr (file -> path, U'\\');
 		return backslash ? backslash + 1 : file -> path;
 	#endif
 }
 
-wchar_t * MelderDir_name (MelderDir dir) {
+char32 * MelderDir_name (MelderDir dir) {
 	#if defined (UNIX)
-		wchar_t *slash = wcsrchr (dir -> path, '/');
+		char32 *slash = str32rchr (dir -> path, U'/');
 		return slash ? slash + 1 : dir -> path;
 	#elif defined (_WIN32)
-		wchar_t *backslash = wcsrchr (dir -> path, '\\');
+		char32 *backslash = str32rchr (dir -> path, U'\\');
 		return backslash ? backslash + 1 : dir -> path;
 	#endif
 }
 
-void Melder_pathToDir (const wchar_t *path, MelderDir dir) {
-	wcscpy (dir -> path, path);
+void Melder_pathToDir (const char32 *path, MelderDir dir) {
+	str32cpy (dir -> path, path);
 }
 
-void Melder_pathToFile (const wchar_t *path, MelderFile file) {
+void Melder_pathToFile (const char32 *path, MelderFile file) {
 	/*
 	 * This handles complete path names only.
 	 * Unlike Melder_relativePathToFile, this handles Windows file names with slashes in them.
@@ -197,10 +202,10 @@ void Melder_pathToFile (const wchar_t *path, MelderFile file) {
 	 * Used if we know for sure that we have a complete path name,
 	 * i.e. if the program determined the name (fileselector, printing, prefs).
 	 */
-	wcscpy (file -> path, path);
+	str32cpy (file -> path, path);
 }
 
-void Melder_relativePathToFile (const wchar_t *path, MelderFile file) {
+void Melder_relativePathToFile (const char32 *path, MelderFile file) {
 	/*
 	 * This handles complete and partial path names,
 	 * and translates slashes to native directory separators (unlike Melder_pathToFile).
@@ -212,20 +217,17 @@ void Melder_relativePathToFile (const wchar_t *path, MelderFile file) {
 		/*
 		 * We assume that Unix complete path names start with a slash.
 		 */
-		if (path [0] == '~' && path [1] == '/') {
-			swprintf (file -> path, kMelder_MAXPATH+1, L"%ls%ls", Melder_peekUtf8ToWcs (getenv ("HOME")), & path [1]);
-		} else if (path [0] == '/' || wcsequ (path, L"<stdout>") || wcsstr (path, L"://")) {
-			wcscpy (file -> path, path);
+		if (path [0] == U'~' && path [1] == U'/') {
+			Melder_sprint (file -> path,kMelder_MAXPATH+1, Melder_peek8to32 (getenv ("HOME")), & path [1]);
+		} else if (path [0] == U'/' || str32equ (path, U"<stdout>") || str32str (path, U"://")) {
+			str32cpy (file -> path, path);
 		} else {
 			structMelderDir dir = { { 0 } };
-			Melder_getDefaultDir (& dir);   /* BUG */
-			if (dir. path [0] == '/' && dir. path [1] == '\0') {
-				wcscpy (file -> path, L"/");
-				wcscat (file -> path, path);
+			Melder_getDefaultDir (& dir);   // BUG
+			if (dir. path [0] == U'/' && dir. path [1] == U'\0') {
+				Melder_sprint (file -> path,kMelder_MAXPATH+1, U"/", path);
 			} else {
-				wcscpy (file -> path, dir. path);
-				wcscat (file -> path, L"/");
-				wcscat (file -> path, path);
+				Melder_sprint (file -> path,kMelder_MAXPATH+1, dir. path, U"/", path);
 			}
 		}
 	#elif defined (_WIN32)
@@ -236,99 +238,96 @@ void Melder_relativePathToFile (const wchar_t *path, MelderFile file) {
 		 *    \\host\path
 		 */
 		structMelderDir dir = { { 0 } };
-		if (path [0] == '~' && path [1] == '/') {
+		if (path [0] == U'~' && path [1] == U'/') {
 			Melder_getHomeDir (& dir);
-			swprintf (file -> path, kMelder_MAXPATH+1, L"%ls%ls", dir. path, & path [1]);
+			Melder_sprint (file -> path,kMelder_MAXPATH+1, dir. path, & path [1]);
 			for (;;) {
-				wchar_t *slash = wcschr (file -> path, '/');
-				if (slash == NULL) break;
-				*slash = '\\';
+				char32 *slash = str32chr (file -> path, U'/');
+				if (! slash) break;
+				*slash = U'\\';
 			}
 			return;
 		}
-		if (wcschr (path, '/') && ! wcsstr (path, L"://")) {
-			wchar_t winPath [kMelder_MAXPATH+1];
-			wcscpy (winPath, path);
+		if (str32chr (path, U'/') && ! str32str (path, U"://")) {
+			char32 winPath [kMelder_MAXPATH+1];
+			Melder_sprint (winPath,kMelder_MAXPATH+1, path);
 			for (;;) {
-				wchar_t *slash = wcschr (winPath, '/');
-				if (slash == NULL) break;
-				*slash = '\\';
+				char32 *slash = str32chr (winPath, U'/');
+				if (! slash) break;
+				*slash = U'\\';
 			}
 			Melder_relativePathToFile (winPath, file);
 			return;
 		}
-		if (wcschr (path, ':') || path [0] == '\\' && path [1] == '\\' || wcsequ (path, L"<stdout>")) {
-			wcscpy (file -> path, path);
+		if (str32chr (path, U':') || path [0] == U'\\' && path [1] == U'\\' || str32equ (path, U"<stdout>")) {
+			Melder_sprint (file -> path,kMelder_MAXPATH+1, path);
 		} else {
-			Melder_getDefaultDir (& dir);   /* BUG */
-			static MelderString buffer = { 0 };
-			MelderString_empty (& buffer);
-			MelderString_append (& buffer,
+			Melder_getDefaultDir (& dir);   // BUG
+			Melder_sprint (file -> path,kMelder_MAXPATH+1,
 				dir. path,
-				dir. path [0] != '\0' && dir. path [wcslen (dir. path) - 1] == '\\' ? L"" : L"\\",
+				dir. path [0] != U'\0' && dir. path [str32len (dir. path) - 1] == U'\\' ? U"" : U"\\",
 				path);
-			wcscpy (file -> path, buffer.string);
 		}
 	#endif
 }
 
-wchar_t * Melder_dirToPath (MelderDir dir) {
+char32 * Melder_dirToPath (MelderDir dir) {
 	return & dir -> path [0];
 }
 
-wchar_t * Melder_fileToPath (MelderFile file) {
+char32 * Melder_fileToPath (MelderFile file) {
 	return & file -> path [0];
 }
 
 void MelderFile_copy (MelderFile file, MelderFile copy) {
-	wcscpy (copy -> path, file -> path);
+	str32cpy (copy -> path, file -> path);
 }
 
 void MelderDir_copy (MelderDir dir, MelderDir copy) {
-	wcscpy (copy -> path, dir -> path);
+	str32cpy (copy -> path, dir -> path);
 }
 
 bool MelderFile_equal (MelderFile file1, MelderFile file2) {
-	return wcsequ (file1 -> path, file2 -> path);
+	return str32equ (file1 -> path, file2 -> path);
 }
 
 bool MelderDir_equal (MelderDir dir1, MelderDir dir2) {
-	return wcsequ (dir1 -> path, dir2 -> path);
+	return str32equ (dir1 -> path, dir2 -> path);
 }
 
 void MelderFile_setToNull (MelderFile file) {
-	file -> path [0] = '\0';
+	file -> path [0] = U'\0';
 }
 
 bool MelderFile_isNull (MelderFile file) {
-	return file -> path [0] == '\0';
+	return ! file || file -> path [0] == U'\0';
 }
 
 void MelderDir_setToNull (MelderDir dir) {
-	dir -> path [0] = '\0';
+	dir -> path [0] = U'\0';
 }
 
 bool MelderDir_isNull (MelderDir dir) {
-	return dir -> path [0] == '\0';
+	return dir -> path [0] == U'\0';
 }
 
-void MelderDir_getFile (MelderDir parent, const wchar_t *fileName, MelderFile file) {
+void MelderDir_getFile (MelderDir parent, const char32 *fileName, MelderFile file) {
 	#if defined (UNIX)
-		if (parent -> path [0] == '/' && parent -> path [1] == '\0') {
-			swprintf (file -> path, kMelder_MAXPATH+1, L"/%ls", fileName);
+		if (parent -> path [0] == U'/' && parent -> path [1] == U'\0') {
+			Melder_sprint (file -> path,kMelder_MAXPATH+1, U"/", fileName);
 		} else {
-			swprintf (file -> path, kMelder_MAXPATH+1, L"%ls/%ls", parent -> path, fileName);
+			Melder_sprint (file -> path,kMelder_MAXPATH+1, parent -> path, U"/", fileName);
 		}
 	#elif defined (_WIN32)
-		if (wcsrchr (file -> path, '\\') - file -> path == wcslen (file -> path) - 1) {
-			swprintf (file -> path, kMelder_MAXPATH+1, L"%ls%ls", parent -> path, fileName);
+		if (str32rchr (file -> path, U'\\') - file -> path == str32len (file -> path) - 1) {
+			Melder_sprint (file -> path,kMelder_MAXPATH+1, parent -> path, fileName);
 		} else {
-			swprintf (file -> path, kMelder_MAXPATH+1, L"%ls\\%ls", parent -> path, fileName);
+			Melder_sprint (file -> path,kMelder_MAXPATH+1, parent -> path, U"\\", fileName);
 		}
 	#endif
 }
 
-void MelderDir_relativePathToFile (MelderDir dir, const wchar_t *path, MelderFile file) {
+void MelderDir_relativePathToFile (MelderDir dir, const char32 *path, MelderFile file) {
 	structMelderDir saveDir = { { 0 } };
 	Melder_getDefaultDir (& saveDir);
 	Melder_setDefaultDir (dir);
@@ -338,7 +337,7 @@ void MelderDir_relativePathToFile (MelderDir dir, const wchar_t *path, MelderFil
 
 #ifndef UNIX
 static void Melder_getDesktop (MelderDir dir) {
-	dir -> path [0] = '\0';
+	dir -> path [0] = U'\0';
 }
 #endif
 
@@ -348,11 +347,11 @@ void MelderFile_getParentDir (MelderFile file, MelderDir parent) {
 		 * The parent of /usr/hello.txt is /usr.
 		 * The parent of /hello.txt is /.
 		 */
-		wchar_t *slash;
-		wcscpy (parent -> path, file -> path);
-		slash = wcsrchr (parent -> path, '/');
-		if (slash) *slash = '\0';
-		if (parent -> path [0] == '\0') wcscpy (parent -> path, L"/");
+		char32 *slash;
+		str32cpy (parent -> path, file -> path);
+		slash = str32rchr (parent -> path, U'/');
+		if (slash) *slash = U'\0';
+		if (parent -> path [0] == U'\0') str32cpy (parent -> path, U"/");
 	#elif defined (_WIN32)
 		/*
 		 * The parent of C:\WINDOWS\CTRL.DLL is C:\WINDOWS.
@@ -360,34 +359,34 @@ void MelderFile_getParentDir (MelderFile file, MelderDir parent) {
 		 * The parent of \\Swine\Apps\init.txt is \\Swine\Apps.
 		 * The parent of \\Swine\init.txt is \\Swine\.   (BUG ?)
 		 */
-		wchar_t *colon;
-		wcscpy (parent -> path, file -> path);
-		colon = wcschr (parent -> path, ':');
+		char32 *colon;
+		str32cpy (parent -> path, file -> path);
+		colon = str32chr (parent -> path, U':');
 		if (colon) {
-			wchar_t *backslash = wcsrchr (parent -> path, '\\');
-			if (backslash) {   /* C:\WINDOWS\CTRL.DLL or C:\AUTOEXEC.BAT */
-				if (backslash - colon == 1) {   /* C:\AUTOEXEC.BAT */
-					* (backslash + 1) = '\0';   /* C:\ */
-				} else {   /* C:\WINDOWS\CTRL.DLL */
-					*backslash = '\0';   /* C:\WINDOWS */
+			char32 *backslash = str32rchr (parent -> path, U'\\');
+			if (backslash) {   //   C:\WINDOWS\CTRL.DLL or C:\AUTOEXEC.BAT
+				if (backslash - colon == 1) {   //   C:\AUTOEXEC.BAT
+					* (backslash + 1) = U'\0';   //   C:\   -   !!! aargh this was a bug after converting this line to line comments
+				} else {   //   C:\WINDOWS\CTRL.DLL
+					*backslash = U'\0';   //   C:\WINDOWS
 				}
 			} else {   /* ??? */
-				Melder_getDesktop (parent);   /* empty string */
+				Melder_getDesktop (parent);   // empty string
 			}
-		} else if (parent -> path [0] == '\\' && parent -> path [1] == '\\') {
-			wchar_t *backslash = wcsrchr (parent -> path + 2, '\\');
-			if (backslash) {   /* \\Swine\Apps\init.txt or \\Swine\init.txt */
-				wchar_t *leftBackslash = wcschr (parent -> path + 2, '\\');
-				if (backslash - leftBackslash == 0) {   /* \\Swine\init.txt */
-					* (backslash + 1) = '\0';   /* \\Swine\ */
-				} else {   /* \\Swine\Apps\init.txt */
-					*backslash = '\0';   /* \\Swine\Apps */
+		} else if (parent -> path [0] == U'\\' && parent -> path [1] == U'\\') {
+			char32 *backslash = str32rchr (parent -> path + 2, U'\\');
+			if (backslash) {   //   \\Swine\Apps\init.txt or \\Swine\init.txt
+				char32 *leftBackslash = str32chr (parent -> path + 2, U'\\');
+				if (backslash - leftBackslash == 0) {   //   \\Swine\init.txt
+					* (backslash + 1) = U'\0';   //   \\Swine\   -
+				} else {   //   \\Swine\Apps\init.txt
+					*backslash = U'\0';   //   \\Swine\Apps
 				}
-			} else {   /* \\init.txt   ??? */
-				Melder_getDesktop (parent);   /* empty string */
+			} else {   //   \\init.txt   ???
+				Melder_getDesktop (parent);   // empty string
 			}
-		} else {   /* Unknown path type. */
-			Melder_getDesktop (parent);   /* empty string */
+		} else {   // unknown path type
+			Melder_getDesktop (parent);   // empty string
 		}
 	#endif
 }
@@ -399,21 +398,21 @@ void MelderDir_getParentDir (MelderDir dir, MelderDir parent) {
 		 * The parent of /usr is /.
 		 * The parent of / is "".
 		 */
-		wchar_t *slash;
-		wcscpy (parent -> path, dir -> path);
-		slash = wcsrchr (parent -> path, '/');
+		char32 *slash;
+		str32cpy (parent -> path, dir -> path);
+		slash = str32rchr (parent -> path, U'/');
 		if (slash) {
 			if (slash - parent -> path == 0) {
-				if (slash [1] == '\0') {   /* Child is "/". */
-					parent -> path [0] = '\0';   /* Parent is "". */
-				} else {   /* Child is "/usr". */
-					slash [1] = '\0';   /* Parent is "/". */
+				if (slash [1] == U'\0') {   // child is "/"
+					parent -> path [0] = U'\0';   // parent is ""
+				} else {   // child is "/usr"
+					slash [1] = '\0';   // parent is "/"
 				}
-			} else {   /* Child is "/usr/local". */
-				*slash = '\0';   /* Parent is "/usr". */
+			} else {   // child is "/usr/local"
+				*slash = U'\0';   // parent is "/usr"
 			}
 		} else {
-			parent -> path [0] = '\0';   /* Some failure. Desktop. */
+			parent -> path [0] = U'\0';   // some failure; desktop
 		}
 	#elif defined (_WIN32)
 		/*
@@ -421,64 +420,64 @@ void MelderDir_getParentDir (MelderDir dir, MelderDir parent) {
 		 * The parent of E:\ is the desktop.
 		 * The parent of \\Swine\ is the desktop.   (BUG ?)
 		 */
-		wchar_t *colon;
-		wcscpy (parent -> path, dir -> path);
-		colon = wcschr (parent -> path, ':');
+		char32 *colon;
+		str32cpy (parent -> path, dir -> path);
+		colon = str32chr (parent -> path, U':');
 		if (colon) {
-			int length = wcslen (parent -> path);
-			wchar_t *backslash = wcsrchr (parent -> path, '\\');
-			if (backslash) {   /* C:\WINDOWS\FONTS or C:\WINDOWS or C:\ */
-				if (backslash - parent -> path == length - 1) {   /* C:\ */
-					Melder_getDesktop (parent);   /* empty string */
-				} else if (backslash - colon == 1) {   /* C:\WINDOWS */
-					* (backslash + 1) = '\0';   /* C:\ */
-				} else {   /* C:\WINDOWS\FONTS */
-					*backslash = '\0';   /* C:\WINDOWS */
+			int length = str32len (parent -> path);
+			char32 *backslash = str32rchr (parent -> path, U'\\');
+			if (backslash) {   //   C:\WINDOWS\FONTS or C:\WINDOWS or C:\   - (cannot add a line comment with a backslash)
+				if (backslash - parent -> path == length - 1) {   //   C:\   -
+					Melder_getDesktop (parent);   // empty string
+				} else if (backslash - colon == 1) {   //   C:\WINDOWS
+					* (backslash + 1) = U'\0';   //   C:\   -
+				} else {   //   C:\WINDOWS\FONTS
+					*backslash = U'\0';   //   C:\WINDOWS
 				}
-			} else {   /* LPT1:   ??? */
-				Melder_getDesktop (parent);   /* empty string */
+			} else {   //   LPT1:   ???
+				Melder_getDesktop (parent);   // empty string
 			}
-		} else if (parent -> path [0] == '\\' && parent -> path [1] == '\\') {
-			int length = wcslen (parent -> path);
-			wchar_t *backslash = wcsrchr (parent -> path + 2, '\\');
-			if (backslash) {   /* \\Swine\Apps\Praats or \\Swine\Apps or \\Swine\ */
-				if (backslash - parent -> path == length - 1) {   /* \\Swine\ */
-					Melder_getDesktop (parent);   /* empty string */
-				} else {   /* \\Swine\Apps\Praats or \\Swine\Apps */
-					wchar_t *leftBackslash = wcschr (parent -> path + 2, '\\');
-					if (backslash - leftBackslash == 0) {   /* \\Swine\Apps */
-						* (backslash + 1) = '\0';   /* \\Swine\ */
-					} else {   /* \\Swine\Apps\Praats */
-						*backslash = '\0';   /* \\Swine\Apps */
+		} else if (parent -> path [0] == U'\\' && parent -> path [1] == U'\\') {
+			int length = str32len (parent -> path);
+			char32 *backslash = str32rchr (parent -> path + 2, U'\\');
+			if (backslash) {   //   \\Swine\Apps\Praats or \\Swine\Apps or \\Swine\   -
+				if (backslash - parent -> path == length - 1) {   //   \\Swine\   -
+					Melder_getDesktop (parent);   // empty string
+				} else {   //   \\Swine\Apps\Praats or \\Swine\Apps
+					char32 *leftBackslash = str32chr (parent -> path + 2, U'\\');
+					if (backslash - leftBackslash == 0) {   //   \\Swine\Apps
+						* (backslash + 1) = U'\0';   //   \\Swine\   -
+					} else {   //   \\Swine\Apps\Praats
+						*backslash = U'\0';   //   \\Swine\Apps
 					}
 				}
-			} else {   /* \\Swine   ??? */
-				Melder_getDesktop (parent);   /* empty string */
+			} else {   //   \\Swine   ???
+				Melder_getDesktop (parent);   // empty string
 			}
-		} else {   /* Unknown path type. */
-			Melder_getDesktop (parent);   /* empty string */
+		} else {   // unknown path type.
+			Melder_getDesktop (parent);   // empty string
 		}
 	#endif
 }
 
 bool MelderDir_isDesktop (MelderDir dir) {
-	return dir -> path [0] == '\0';
+	return dir -> path [0] == U'\0';
 }
 
-void MelderDir_getSubdir (MelderDir parent, const wchar_t *subdirName, MelderDir subdir) {
+void MelderDir_getSubdir (MelderDir parent, const char32 *subdirName, MelderDir subdir) {
 	#if defined (UNIX)
-		if (parent -> path [0] == '/' && parent -> path [1] == '\0') {
-			swprintf (subdir -> path, kMelder_MAXPATH+1, L"/%ls", subdirName);
+		if (parent -> path [0] == U'/' && parent -> path [1] == U'\0') {
+			Melder_sprint (subdir -> path,kMelder_MAXPATH+1, U"/", subdirName);
 		} else {
-			swprintf (subdir -> path, kMelder_MAXPATH+1, L"%ls/%ls", parent -> path, subdirName);
+			Melder_sprint (subdir -> path,kMelder_MAXPATH+1, parent -> path, U"/", subdirName);
 		}
 	#elif defined (_WIN32)
-		int length = wcslen (parent -> path);
-		wchar_t *backslash = wcsrchr (parent -> path, '\\');
-		if (backslash && backslash - parent -> path == length - 1) {   /* C:\ or \\Swine\ */
-			swprintf (subdir -> path, kMelder_MAXPATH+1, L"%ls%ls", parent -> path, subdirName);
-		} else {   /* C:\WINDOWS or \\Swine\Apps or even C: */
-			swprintf (subdir -> path, kMelder_MAXPATH+1, L"%ls\\%ls", parent -> path, subdirName);
+		int length = str32len (parent -> path);
+		char32 *backslash = str32rchr (parent -> path, U'\\');
+		if (backslash && backslash - parent -> path == length - 1) {   //   C:\ or \\Swine\   -
+			Melder_sprint (subdir -> path, kMelder_MAXPATH+1, parent -> path, subdirName);
+		} else {   //   C:\WINDOWS or \\Swine\Apps or even C:
+			Melder_sprint (subdir -> path,kMelder_MAXPATH+1, parent -> path, U"\\", subdirName);
 		}
 	#endif
 }
@@ -486,22 +485,31 @@ void MelderDir_getSubdir (MelderDir parent, const wchar_t *subdirName, MelderDir
 void Melder_getHomeDir (MelderDir homeDir) {
 	#if defined (UNIX)
 		char *home = getenv ("HOME");
-		wcscpy (homeDir -> path, home ? Melder_peekUtf8ToWcs (home) : L"/");
+		str32cpy (homeDir -> path, home ? Melder_peek8to32 (home) : U"/");
 	#elif defined (_WIN32)
-		if (GetEnvironmentVariable (L"USERPROFILE", homeDir -> path, kMelder_MAXPATH)) {
-			;   /* Ready. */
-		} else if (GetEnvironmentVariableW (L"HOMEDRIVE", homeDir -> path, kMelder_MAXPATH)) {
-			GetEnvironmentVariable (L"HOMEPATH", homeDir -> path + wcslen (homeDir -> path), kMelder_MAXPATH - wcslen (homeDir -> path));
-		} else {
-			MelderDir_setToNull (homeDir);   /* Windows 95 and 98: alas. */
+		WCHAR driveW [kMelder_MAXPATH+1], pathW [kMelder_MAXPATH+1];
+		DWORD n = GetEnvironmentVariableW (L"USERPROFILE", pathW, kMelder_MAXPATH+1);
+		if (n > kMelder_MAXPATH) Melder_throw (U"Home directory name too long.");
+		if (n > 0) {
+			Melder_sprint (homeDir -> path,kMelder_MAXPATH+1, Melder_peekWto32 (pathW));
+			return;
+		}
+		n = GetEnvironmentVariableW (L"HOMEDRIVE", driveW, kMelder_MAXPATH+1);
+		if (n > kMelder_MAXPATH) Melder_throw (U"Home drive name too long.");
+		if (n > 0) {
+			GetEnvironmentVariable (L"HOMEPATH", pathW, kMelder_MAXPATH+1);
+			Melder_sprint (homeDir -> path,kMelder_MAXPATH+1, Melder_peekWto32 (driveW), Melder_peekWto32 (pathW));
+			return;
 		}
+		MelderDir_setToNull (homeDir);   // Windows 95 and 98: alas
 	#endif
 }
 
 void Melder_getPrefDir (MelderDir prefDir) {
 	#if defined (macintosh)
-		Melder_getHomeDir (prefDir);
-		wcscat (prefDir -> path, L"/Library/Preferences");
+		structMelderDir homeDir;
+		Melder_getHomeDir (& homeDir);
+		Melder_sprint (prefDir -> path,kMelder_MAXPATH+1, homeDir. path, U"/Library/Preferences");
 	#elif defined (UNIX)
 		/*
 		 * Preferences files go into the home directory.
@@ -509,7 +517,9 @@ void Melder_getPrefDir (MelderDir prefDir) {
 		Melder_getHomeDir (prefDir);
 	#elif defined (_WIN32)
 		/*
+		 * On Windows 95, preferences files went in the Windows directory.
 		 * On shared systems (NT, 2000, XP), preferences files go into the home directory.
+		 * TODO: at some point, these files should be moved to HOME\AppData\Roaming\Praat.
 		 */
 		Melder_getHomeDir (prefDir);
 	#endif
@@ -517,7 +527,7 @@ void Melder_getPrefDir (MelderDir prefDir) {
 
 void Melder_getTempDir (MelderDir tempDir) {
 	#if defined (macintosh)
-		wcscpy (tempDir -> path, Melder_peekUtf8ToWcs (getenv ("TMPDIR")));   // or append /TemporaryItems
+		Melder_sprint (tempDir -> path,kMelder_MAXPATH+1, Melder_peek8to32 (getenv ("TMPDIR")));   // or append /TemporaryItems
 		// confstr with _CS_DARWIN_USER_TEMP_DIR
 	#else
 		(void) tempDir;
@@ -535,32 +545,33 @@ static size_t read_URL_data_from_file (void *buffer, size_t size, size_t nmemb,
 #endif
 
 FILE * Melder_fopen (MelderFile file, const char *type) {
+	if (MelderFile_isNull (file)) Melder_throw (U"Cannot open null file.");
 	if (! Melder_isTracing)
-		Melder_assert (wcsequ (Melder_double (1.5), L"1.5"));   // check locale settings; because of the required file portability Praat cannot stand "1,5"
+		Melder_assert (str32equ (Melder_double (1.5), U"1.5"));   // check locale settings; because of the required file portability Praat cannot stand "1,5"
 	/*
 	 * On the Unix-like systems (including MacOS), the path has to be converted to 8-bit characters in UTF-8 encoding.
 	 * On MacOS, the characters also have to be decomposed.
 	 */
 	char utf8path [kMelder_MAXPATH+1];
-	Melder_wcsTo8bitFileRepresentation_inline (file -> path, utf8path);
+	Melder_str32To8bitFileRepresentation_inline (file -> path, utf8path);
 	FILE *f;
 	file -> openForWriting = type [0] == 'w' || type [0] == 'a' || strchr (type, '+');
-	if (wcsequ (file -> path, L"<stdout>") && file -> openForWriting) {
+	if (str32equ (file -> path, U"<stdout>") && file -> openForWriting) {
 		f = stdout;
 	#ifdef CURLPRESENT
 	} else if (strstr (utf8path, "://") && file -> openForWriting) {
-		Melder_assert (type [0] == 'w');   /* Reject "append" and "random" access. */
-		f = tmpfile ();   /* Open a temporary file for writing. */
+		Melder_assert (type [0] == 'w');   // reject "append" and "random" access
+		f = tmpfile ();   // open a temporary file for writing
 	} else if (strstr (utf8path, "://") && ! file -> openForWriting) {
 		CURLcode CURLreturn;
 		CURL *CURLhandle;
 		char errorbuffer [CURL_ERROR_SIZE] = "";
-		f = tmpfile ();   /* Open a temporary file for writing. */
+		f = tmpfile ();   // open a temporary file for writing
 		if (! curl_initialized) {
 			CURLreturn = curl_global_init (CURL_GLOBAL_ALL);
 			curl_initialized = 1;
 		};
-		CURLhandle = curl_easy_init ();   /* Initialize session. */
+		CURLhandle = curl_easy_init ();   // initialize session
 		/* 
 		 * Set up the connection parameters.
 		 */
@@ -580,8 +591,8 @@ FILE * Melder_fopen (MelderFile file, const char *type) {
 		CURLreturn = curl_easy_perform (CURLhandle);
 		/* Handle errors. */
 		if (CURLreturn) {
-			Melder_error ("%s\n", errorbuffer);
-			f = NULL;
+			Melder_appendError (Melder_peek8to32 (errorbuffer));
+			f = nullptr;
 		};
 		/* Clean up session. */
 		curl_easy_cleanup (CURLhandle);
@@ -589,26 +600,26 @@ FILE * Melder_fopen (MelderFile file, const char *type) {
 		if (f) rewind (f);
 	#endif
 	} else {
-		#ifdef _WIN32
-			f = _wfopen (file -> path, Melder_peekUtf8ToWcs (type));
+		#if defined (_WIN32) && ! defined (__CYGWIN__)
+			f = _wfopen (Melder_peek32toW (file -> path), Melder_peek32toW (Melder_peek8to32 (type)));
 		#else
 			f = fopen ((char *) utf8path, type);
 		#endif
 	}
 	if (! f) {
-		wchar_t *path = file -> path;
-		Melder_error_ ("Cannot ", type [0] == 'r' ? "open" : type [0] == 'a' ? "append to" : "create",
-			" file ", file, ".");
-		if (path [0] == '\0')
-			Melder_error_ ("Hint: empty file name.");
-		else if (path [0] == ' ' || path [0] == '\t')
-			Melder_error_ ("Hint: file name starts with a space or tab.");
-		else if (path [wcslen (path) - 1] == ' ' || path [wcslen (path) - 1] == '\t')
-			Melder_error_ ("Hint: file name ends in a space or tab.");
-		else if (wcschr (path, '\n'))
-			Melder_error_ ("Hint: file name contains a newline symbol.");
+		char32 *path = file -> path;
+		Melder_appendError (U"Cannot ", type [0] == 'r' ? U"open" : type [0] == 'a' ? U"append to" : U"create",
+			U" file ", file, U".");
+		if (path [0] == U'\0')
+			Melder_appendError (U"Hint: empty file name.");
+		else if (path [0] == U' ' || path [0] == U'\t')
+			Melder_appendError (U"Hint: file name starts with a space or tab.");
+		else if (path [str32len (path) - 1] == U' ' || path [str32len (path) - 1] == U'\t')
+			Melder_appendError (U"Hint: file name ends in a space or tab.");
+		else if (str32chr (path, U'\n'))
+			Melder_appendError (U"Hint: file name contains a newline symbol.");
 		throw MelderError ();
-		return NULL;
+		return nullptr;
 	}
 	return f;
 }
@@ -616,9 +627,9 @@ FILE * Melder_fopen (MelderFile file, const char *type) {
 void Melder_fclose (MelderFile file, FILE *f) {
 	if (! f) return;
 	#if defined (CURLPRESENT)
- 	if (wcsstr (file -> wpath, L"://") && file -> openForWriting) {
+ 	if (str32str (file -> wpath, U"://") && file -> openForWriting) {
 		unsigned char utf8path [kMelder_MAXPATH+1];
-		Melder_wcsTo8bitFileRepresentation_inline (file -> path, utf8path);
+		Melder_str32To8bitFileRepresentation_inline (file -> path, utf8path);
 		/* Rewind the file. */
 		if (f) rewind (f);
 		CURLcode CURLreturn;
@@ -636,7 +647,7 @@ void Melder_fclose (MelderFile file, FILE *f) {
 		/* Debugging: Verbose messages */
 		/* CURLreturn = curl_easy_setopt (CURLhandle, CURLOPT_VERBOSE, 1); */
         /* Catch FILE: protocol errors. No solution yet */
-		if (wcsstr (file -> path, L"file://") || wcsstr (file -> path, L"FILE://")) {
+		if (str32str (file -> path, U"file://") || str32str (file -> path, U"FILE://")) {
 			CURLreturn = curl_easy_setopt (CURLhandle, CURLOPT_VERBOSE, 1);
 		}
 		/* Do not return Error pages, just fail. */
@@ -657,18 +668,18 @@ void Melder_fclose (MelderFile file, FILE *f) {
 		/* Handle errors. */
 		if (CURLreturn) {
 			curl_easy_cleanup (CURLhandle);
-			f = NULL;
-			Melder_throw (errorbuffer, "\n");
+			f = nullptr;
+			Melder_throw (Melder_peek8to32 (errorbuffer), U"\n");
 	    };
 		/* Clean up session */
 		curl_easy_cleanup (CURLhandle);
     }
 	#endif
 	if (f != stdout && fclose (f) == EOF)
-		Melder_throw ("Error closing file ", file, ".");
+		Melder_throw (U"Error closing file ", file, U".");
 }
 
-void Melder_files_cleanUp (void) {
+void Melder_files_cleanUp () {
 	#if defined (CURLPRESENT)
 		if (curl_initialized) {
 			curl_global_cleanup ();
@@ -680,7 +691,7 @@ void Melder_files_cleanUp (void) {
 bool MelderFile_exists (MelderFile file) {
 	#if defined (UNIX)
 		char utf8path [kMelder_MAXPATH+1];
-		Melder_wcsTo8bitFileRepresentation_inline (file -> path, utf8path);
+		Melder_str32To8bitFileRepresentation_inline (file -> path, utf8path);
 		struct stat statistics;
 		return ! stat (utf8path, & statistics);
 	#else
@@ -709,7 +720,7 @@ bool MelderFile_readable (MelderFile file) {
 long MelderFile_length (MelderFile file) {
 	#if defined (UNIX)
 		char utf8path [kMelder_MAXPATH+1];
-		Melder_wcsTo8bitFileRepresentation_inline (file -> path, utf8path);
+		Melder_str32To8bitFileRepresentation_inline (file -> path, utf8path);
 		struct stat statistics;
 		if (stat ((char *) utf8path, & statistics)) return -1;
 		return statistics. st_size;
@@ -729,85 +740,89 @@ long MelderFile_length (MelderFile file) {
 
 void MelderFile_delete (MelderFile file) {
 	if (! file) return;
-	#if defined (_WIN32)
-		DeleteFile (file -> path);
-	#else
+	#if defined (UNIX)
 		char utf8path [kMelder_MAXPATH+1];
-		Melder_wcsTo8bitFileRepresentation_inline (file -> path, utf8path);
+		Melder_str32To8bitFileRepresentation_inline (file -> path, utf8path);
 		remove ((char *) utf8path);
+	#elif defined (_WIN32)
+		DeleteFile (Melder_peek32toW (file -> path));
 	#endif
 }
 
-wchar_t * Melder_peekExpandBackslashes (const wchar_t *message) {
-	static wchar_t names [11] [kMelder_MAXPATH+1];
+char32 * Melder_peekExpandBackslashes (const char32 *message) {
+	static char32 names [11] [kMelder_MAXPATH+1];
 	static int index = 0;
-	const wchar_t *from;
-	wchar_t *to;
+	const char32 *from;
+	char32 *to;
 	if (++ index == 11) index = 0;
 	for (from = & message [0], to = & names [index] [0]; *from != '\0'; from ++, to ++) {
 		*to = *from;
-		if (*from == '\\') { * ++ to = 'b'; * ++ to = 's'; }
+		if (*from == U'\\') { * ++ to = U'b'; * ++ to = U's'; }
 	}
-	*to = '\0';
+	*to = U'\0';
 	return & names [index] [0];
 }
 
-const wchar_t * MelderFile_messageName (MelderFile file) {
-	return Melder_wcscat (L_LEFT_DOUBLE_QUOTE, file -> path, L_RIGHT_DOUBLE_QUOTE);
+const char32 * MelderFile_messageName (MelderFile file) {
+	return Melder_cat (U_LEFT_DOUBLE_QUOTE, file -> path, U_RIGHT_DOUBLE_QUOTE);   // BUG: is cat allowed here?
 }
 
 void Melder_getDefaultDir (MelderDir dir) {
-	#if defined (_WIN32)
-		GetCurrentDirectory (kMelder_MAXPATH, dir -> path);
-	#else
+	#if defined (UNIX)
 		char path [kMelder_MAXPATH+1];
 		getcwd (path, kMelder_MAXPATH+1);
-		Melder_8bitFileRepresentationToWcs_inline (path, dir -> path);
+		Melder_8bitFileRepresentationToStr32_inline (path, dir -> path);
+	#elif defined (_WIN32)
+		static WCHAR dirPathW [kMelder_MAXPATH+1];
+		GetCurrentDirectory (kMelder_MAXPATH+1, dirPathW);
+		Melder_sprint (dir -> path,kMelder_MAXPATH+1, Melder_peekWto32 (dirPathW));
 	#endif
 }
 
 void Melder_setDefaultDir (MelderDir dir) {
-	#if defined (_WIN32)
-		SetCurrentDirectory (dir -> path);
-	#else
-		chdir (Melder_peekWcsToUtf8 (dir -> path));
+	#if defined (UNIX)
+		chdir (Melder_peek32to8 (dir -> path));
+	#elif defined (_WIN32)
+		SetCurrentDirectory (Melder_peek32toW (dir -> path));
 	#endif
 }
 
 void MelderFile_setDefaultDir (MelderFile file) {
-	structMelderDir dir = { { 0 } };
+	structMelderDir dir { { 0 } };
 	MelderFile_getParentDir (file, & dir);
 	Melder_setDefaultDir (& dir);
 }
 
-void Melder_createDirectory (MelderDir parent, const wchar_t *dirName, int mode) {
-#if defined (_WIN32)
+void Melder_createDirectory (MelderDir parent, const char32 *dirName, int mode) {
+#if defined (UNIX)
+	structMelderFile file = { 0 };
+	if (dirName [0] == U'/') {
+		Melder_sprint (file. path,kMelder_MAXPATH+1, dirName);   // absolute path
+	} else if (parent -> path [0] == U'/' && parent -> path [1] == U'\0') {
+		Melder_sprint (file. path,kMelder_MAXPATH+1, U"/", dirName);   // relative path in root directory
+	} else {
+		Melder_sprint (file. path,kMelder_MAXPATH+1, parent -> path, U"/", dirName);   // relative path
+	}
+	char utf8path [kMelder_MAXPATH+1];
+	Melder_str32To8bitFileRepresentation_inline (file. path, utf8path);
+	if (mkdir (utf8path, mode) == -1 && errno != EEXIST)   // ignore if directory already exists
+		Melder_throw (U"Cannot create directory ", & file, U".");
+#elif defined (_WIN32)
 	structMelderFile file = { 0 };
 	SECURITY_ATTRIBUTES sa;
 	(void) mode;
 	sa. nLength = sizeof (SECURITY_ATTRIBUTES);
-	sa. lpSecurityDescriptor = NULL;
-	sa. bInheritHandle = FALSE;
-	if (wcschr (dirName, ':') || dirName [0] == '/' && dirName [1] == '/') {
-		swprintf (file. path, kMelder_MAXPATH+1, L"%ls", dirName);   // absolute path
+	sa. lpSecurityDescriptor = nullptr;
+	sa. bInheritHandle = false;
+	if (str32chr (dirName, U':') || dirName [0] == U'/' && dirName [1] == U'/') {
+		Melder_sprint (file. path,kMelder_MAXPATH+1, dirName);   // absolute path
 	} else {
-		swprintf (file. path, kMelder_MAXPATH+1, L"%ls/%ls", parent -> path, dirName);   // relative path
+		Melder_sprint (file. path,kMelder_MAXPATH+1, parent -> path, U"/", dirName);   // relative path
 	}
-	if (! CreateDirectoryW (file. path, & sa) && GetLastError () != ERROR_ALREADY_EXISTS)   // ignore if directory already exists
-		Melder_throw ("Cannot create directory ", & file, ".");
+	if (! CreateDirectoryW (Melder_peek32toW (file. path), & sa) && GetLastError () != ERROR_ALREADY_EXISTS)   // ignore if directory already exists
+		Melder_throw (U"Cannot create directory ", & file, U".");
 #else
-	structMelderFile file = { 0 };
-	if (dirName [0] == '/') {
-		swprintf (file. path, kMelder_MAXPATH+1, L"%ls", dirName);   // absolute path
-	} else if (parent -> path [0] == '/' && parent -> path [1] == '\0') {
-		swprintf (file. path, kMelder_MAXPATH+1, L"/%ls", dirName);   // relative path in root directory
-	} else {
-		swprintf (file. path, kMelder_MAXPATH+1, L"%ls/%ls", parent -> path, dirName);   // relative path
-	}
-	char utf8path [kMelder_MAXPATH+1];
-	Melder_wcsTo8bitFileRepresentation_inline (file. path, utf8path);
-	if (mkdir (utf8path, mode) == -1 && errno != EEXIST)   // ignore if directory already exists
-		Melder_throw ("Cannot create directory ", & file, ".");
+	#error Unsupported operating system.
 #endif
 }
 
@@ -827,8 +842,8 @@ char * MelderFile_readLine (MelderFile me) {
 	long i;
 	static char *buffer;
 	static long capacity;
-	if (! my filePointer) return NULL;
-	if (feof (my filePointer)) return NULL;
+	if (! my filePointer) return nullptr;
+	if (feof (my filePointer)) return nullptr;
 	if (! buffer) {
 		buffer = Melder_malloc (char, capacity = 100);
 	}
@@ -841,21 +856,21 @@ char * MelderFile_readLine (MelderFile me) {
 			break;
 		if (c == '\n') {
 			c = fgetc (my filePointer);
-			if (feof (my filePointer)) break;   /* Ignore last empty line (Unix). */
+			if (feof (my filePointer)) break;   // ignore last empty line (Unix)
 			ungetc (c, my filePointer);
-			break;   /* Unix line separator. */
+			break;   // Unix line separator
 		}
 		if (c == '\r') {
 			c = fgetc (my filePointer);
-			if (feof (my filePointer)) break;   /* Ignore last empty line (Macintosh). */
+			if (feof (my filePointer)) break;   // ignore last empty line (Macintosh)
 			if (c == '\n') {
 				c = fgetc (my filePointer);
-				if (feof (my filePointer)) break;   /* Ignore last empty line (Windows). */
+				if (feof (my filePointer)) break;   // ignore last empty line (Windows)
 				ungetc (c, my filePointer);
-				break;   /* Windows line separator. */
+				break;   // Windows line separator
 			}
 			ungetc (c, my filePointer);
-			break;   /* Macintosh line separator. */
+			break;   // Macintosh line separator
 		}
 		buffer [i] = c;
 	}
@@ -873,8 +888,8 @@ void MelderFile_seek (MelderFile me, long position, int direction) {
 	if (! my filePointer) return;
 	if (fseek (my filePointer, position, direction)) {
 		fclose (my filePointer);
-		my filePointer = NULL;
-		Melder_throw ("Cannot seek in file ", me, ".");
+		my filePointer = nullptr;
+		Melder_throw (U"Cannot seek in file ", me, U".");
 	}
 }
 
@@ -883,8 +898,8 @@ long MelderFile_tell (MelderFile me) {
 	if (! my filePointer) return 0;
 	if ((result = ftell (my filePointer)) == -1) {
 		fclose (my filePointer);
-		my filePointer = NULL;
-		Melder_throw ("Cannot tell in file ", me, ".");
+		my filePointer = nullptr;
+		Melder_throw (U"Cannot tell in file ", me, U".");
 	}
 	return result;
 }
@@ -900,7 +915,7 @@ static void _MelderFile_close (MelderFile me, bool mayThrow) {
 			FLAC__stream_encoder_finish (my flacEncoder);   // This already calls fclose! BUG: we cannot get any error messages out.
 			FLAC__stream_encoder_delete (my flacEncoder);
 		}
-	} else if (my filePointer != NULL) {
+	} else if (my filePointer) {
 		if (mayThrow) {
 			Melder_fclose (me, my filePointer);
 		} else {
@@ -908,10 +923,10 @@ static void _MelderFile_close (MelderFile me, bool mayThrow) {
 		}
 	}
 	/* Set everything to zero, except paths (they stay around for error messages and the like). */
-	my filePointer = NULL;
+	my filePointer = nullptr;
 	my openForWriting = my openForReading = false;
 	my indent = 0;
-	my flacEncoder = NULL;
+	my flacEncoder = nullptr;
 }
 void MelderFile_close (MelderFile me) {
 	_MelderFile_close (me, true);
diff --git a/sys/melder_ftoa.cpp b/sys/melder_ftoa.cpp
index 7161b95..71980dc 100644
--- a/sys/melder_ftoa.cpp
+++ b/sys/melder_ftoa.cpp
@@ -1,6 +1,6 @@
 /* melder_ftoa.cpp
  *
- * Copyright (C) 1992-2011,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -32,6 +32,7 @@
  * pb 2010/10/16 Melder_naturalLogarithm
  * pb 2011/04/05 C++
  * pb 2014/01/09 use fabs in calculating minimum precision
+ * pb 2015/05/28 char32
  */
 
 #include "melder.h"
@@ -44,13 +45,22 @@
 #define MAXIMUM_NUMERIC_STRING_LENGTH  400
 	/* = sign + 324 + point + 60 + e + sign + 3 + null byte + ("·10^^" - "e") + 4 extra */
 
-static wchar_t buffers [NUMBER_OF_BUFFERS] [MAXIMUM_NUMERIC_STRING_LENGTH + 1];
+static  char   buffers8  [NUMBER_OF_BUFFERS] [MAXIMUM_NUMERIC_STRING_LENGTH + 1];
+static  char32 buffers32 [NUMBER_OF_BUFFERS] [MAXIMUM_NUMERIC_STRING_LENGTH + 1];
 static int ibuffer = 0;
 
-const wchar_t * Melder_integer (int64_t value) {
+#define CONVERT_BUFFER_TO_CHAR32 \
+	char32 *q = buffers32 [ibuffer]; \
+	while (*p != '\0') * q ++ = (char32) (char8) * p ++; /* change sign before extending (should be unnecessary, because all characters should be below 128) */ \
+	*q = U'\0'; \
+	return buffers32 [ibuffer];
+
+const char * Melder8_integer (int64 value) {
 	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
 	if (sizeof (long) == 8) {
-		swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%ld", value);
+		int n = snprintf (buffers8 [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH + 1, "%ld", (long) value);   // cast to identical type, to make compiler happy
+		Melder_assert (n > 0);
+		Melder_assert (n <= MAXIMUM_NUMERIC_STRING_LENGTH);
 	} else if (sizeof (long long) == 8) {
 		/*
 		 * There are buggy platforms (namely 32-bit Mingw on Windows XP) that support long long and %lld but that convert
@@ -58,220 +68,335 @@ const wchar_t * Melder_integer (int64_t value) {
 		 * There are also buggy platforms (namely 32-bit gcc on Linux) that support long long and %I64d but that convert
 		 * the argument to a 32-bit long.
 		 */
-		static const wchar_t *formatString = NULL;
+		static const char *formatString = nullptr;
 		if (! formatString) {
-			wchar_t tryBuffer [MAXIMUM_NUMERIC_STRING_LENGTH + 1];
-			swprintf (tryBuffer, MAXIMUM_NUMERIC_STRING_LENGTH, L"%lld", 1000000000000LL);
-			if (wcsequ (tryBuffer, L"1000000000000")) {
-				formatString = L"%lld";
-			} else {
-				swprintf (tryBuffer, MAXIMUM_NUMERIC_STRING_LENGTH, L"%I64d", 1000000000000LL);
-				if (wcsequ (tryBuffer, L"1000000000000")) {
-					formatString = L"%I64d";
-				} else {
-					wprintf (tryBuffer);
-					Melder_fatal ("Found no way to print 64-bit integers.");
+			char tryBuffer [MAXIMUM_NUMERIC_STRING_LENGTH + 1];
+			formatString = "%lld";
+			sprintf (tryBuffer, formatString, 1000000000000LL);
+			if (! strequ (tryBuffer, "1000000000000")) {
+				formatString = "%I64d";
+				sprintf (tryBuffer, formatString, 1000000000000LL);
+				if (! strequ (tryBuffer, "1000000000000")) {
+					Melder_fatal (U"Found no way to print 64-bit integers on this machine.");
 				}
 			}
 		}
-		swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, formatString, value);
+		int n = snprintf (buffers8 [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH + 1, formatString, value);
+		Melder_assert (n > 0);
+		Melder_assert (n <= MAXIMUM_NUMERIC_STRING_LENGTH);
 	} else {
-		Melder_fatal ("Neither long nor long long is 8 bytes on this machine.");
+		Melder_fatal (U"Neither long nor long long is 8 bytes on this machine.");
 	}
-	return buffers [ibuffer];
+	return buffers8 [ibuffer];
+}
+const char32 * Melder_integer (int64 value) {
+	const char *p = Melder8_integer (value);
+	CONVERT_BUFFER_TO_CHAR32
 }
 
-const wchar_t * Melder_bigInteger (int64_t value) {
-	wchar_t *text;
-	int quintillions, quadrillions, trillions, billions, millions, thousands, units;
-	bool firstDigitPrinted = false;
+const char * Melder8_bigInteger (int64 value) {
 	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	text = buffers [ibuffer];
-	text [0] = L'\0';
+	char *text = buffers8 [ibuffer];
+	text [0] = '\0';
 	if (value < 0) {
-		swprintf (text, MAXIMUM_NUMERIC_STRING_LENGTH, L"-");
+		sprintf (text, "-");
 		value = - value;
 	}
-	quintillions =  value / 1000000000000000000LL;
-	value -= quintillions * 1000000000000000000LL;
-	quadrillions =  value / 1000000000000000LL;
-	value -= quadrillions * 1000000000000000LL;
-	trillions =     value / 1000000000000LL;
-	value -=    trillions * 1000000000000LL;
-	billions =      value / 1000000000LL;
-	value -=     billions * 1000000000LL;
-	millions =      value / 1000000LL;
-	value -=     millions * 1000000LL;
-	thousands =     value / 1000LL;
-	value -=    thousands * 1000LL;
-	units = value;
+	int quintillions =  value / 1000000000000000000LL;
+	value -=     quintillions * 1000000000000000000LL;
+	int quadrillions =  value / 1000000000000000LL;
+	value -=     quadrillions * 1000000000000000LL;
+	int trillions =     value / 1000000000000LL;
+	value -=        trillions * 1000000000000LL;
+	int billions =      value / 1000000000LL;
+	value -=         billions * 1000000000LL;
+	int millions =      value / 1000000LL;
+	value -=         millions * 1000000LL;
+	int thousands =     value / 1000LL;
+	value -=        thousands * 1000LL;
+	int units = value;
+	bool firstDigitPrinted = false;
 	if (quintillions) {
-		swprintf (text + wcslen (text), MAXIMUM_NUMERIC_STRING_LENGTH, firstDigitPrinted ? L"%03d," : L"%d,", quintillions);
-		firstDigitPrinted = TRUE;
+		sprintf (text + strlen (text), firstDigitPrinted ? "%03d," : "%d,", quintillions);
+		firstDigitPrinted = true;
 	}
 	if (quadrillions || firstDigitPrinted) {
-		swprintf (text + wcslen (text), MAXIMUM_NUMERIC_STRING_LENGTH, firstDigitPrinted ? L"%03d," : L"%d,", quadrillions);
-		firstDigitPrinted = TRUE;
+		sprintf (text + strlen (text), firstDigitPrinted ? "%03d," : "%d,", quadrillions);
+		firstDigitPrinted = true;
 	}
 	if (trillions || firstDigitPrinted) {
-		swprintf (text + wcslen (text), MAXIMUM_NUMERIC_STRING_LENGTH, firstDigitPrinted ? L"%03d," : L"%d,", trillions);
-		firstDigitPrinted = TRUE;
+		sprintf (text + strlen (text), firstDigitPrinted ? "%03d," : "%d,", trillions);
+		firstDigitPrinted = true;
 	}
 	if (billions || firstDigitPrinted) {
-		swprintf (text + wcslen (text), MAXIMUM_NUMERIC_STRING_LENGTH, firstDigitPrinted ? L"%03d," : L"%d,", billions);
-		firstDigitPrinted = TRUE;
+		sprintf (text + strlen (text), firstDigitPrinted ? "%03d," : "%d,", billions);
+		firstDigitPrinted = true;
 	}
 	if (millions || firstDigitPrinted) {
-		swprintf (text + wcslen (text), MAXIMUM_NUMERIC_STRING_LENGTH, firstDigitPrinted ? L"%03d," : L"%d,", millions);
-		firstDigitPrinted = TRUE;
+		sprintf (text + strlen (text), firstDigitPrinted ? "%03d," : "%d,", millions);
+		firstDigitPrinted = true;
 	}
 	if (thousands || firstDigitPrinted) {
-		swprintf (text + wcslen (text), MAXIMUM_NUMERIC_STRING_LENGTH, firstDigitPrinted ? L"%03d," : L"%d,", thousands);
-		firstDigitPrinted = TRUE;
+		sprintf (text + strlen (text), firstDigitPrinted ? "%03d," : "%d,", thousands);
+		firstDigitPrinted = true;
 	}
-	swprintf (text + wcslen (text), MAXIMUM_NUMERIC_STRING_LENGTH, firstDigitPrinted ? L"%03d" : L"%d", units);
+	sprintf (text + strlen (text), firstDigitPrinted ? "%03d" : "%d", units);
 	return text;
 }
+const char32 * Melder_bigInteger (int64 value) {
+	const char *p = Melder8_bigInteger (value);
+	CONVERT_BUFFER_TO_CHAR32
+}
 
-const wchar_t * Melder_boolean (bool value) {
-	return value ? L"yes" : L"no";
+const char * Melder8_boolean (bool value) {
+	return value ? "yes" : "no";
+}
+const char32 * Melder_boolean (bool value) {
+	return value ? U"yes" : U"no";
 }
 
-const wchar_t * Melder_double (double value) {
-	if (value == NUMundefined) return L"--undefined--";
+const char * Melder8_double (double value) {
+	if (value == NUMundefined) return "--undefined--";
 	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	#if defined (macintosh)
-		/*
-		 * OPTIMIZATION: strtod may be 100 times faster than wcstod on the Mac. 20080106
-		 */
-		static char buffer [MAXIMUM_NUMERIC_STRING_LENGTH + 1];
-		sprintf (buffer, "%.15g", value);
-		if (strtod (buffer, NULL) != value) {
-			sprintf (buffer, "%.16g", value);
-			if (strtod (buffer, NULL) != value) {
-				sprintf (buffer, "%.17g", value);
-			}
-		}
-		#if 0
-			wchar_t *to = & buffers [ibuffer] [0];
-			char *from = & buffer [0];
-			for (; (*to++ = *from++) != '\0';) ;
-			*to = '\0';
-		#else
-			Melder_8bitToWcs_inline (buffer, buffers [ibuffer], kMelder_textInputEncoding_UTF8);   // guaranteed not to fail
-		#endif
-	#else
-		swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.15g", value);
-		if (wcstod (buffers [ibuffer], NULL) != value) {
-			swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.16g", value);
-			if (wcstod (buffers [ibuffer], NULL) != value) {
-				swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.17g", value);
-			}
+	sprintf (buffers8 [ibuffer], "%.15g", value);
+	if (strtod (buffers8 [ibuffer], nullptr) != value) {
+		sprintf (buffers8 [ibuffer], "%.16g", value);
+		if (strtod (buffers8 [ibuffer], nullptr) != value) {
+			sprintf (buffers8 [ibuffer], "%.17g", value);
 		}
-	#endif
-	return buffers [ibuffer];
+	}
+	return buffers8 [ibuffer];
+}
+const char32 * Melder_double (double value) {
+	const char *p = Melder8_double (value);
+	CONVERT_BUFFER_TO_CHAR32
 }
 
-const wchar_t * Melder_single (double value) {
-	if (value == NUMundefined) return L"--undefined--";
+const char * Melder8_single (double value) {
+	if (value == NUMundefined) return "--undefined--";
 	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.9g", value);
-	return buffers [ibuffer];
+	sprintf (buffers8 [ibuffer], "%.9g", value);
+	return buffers8 [ibuffer];
+}
+const char32 * Melder_single (double value) {
+	const char *p = Melder8_single (value);
+	CONVERT_BUFFER_TO_CHAR32
 }
 
-const wchar_t * Melder_half (double value) {
-	if (value == NUMundefined) return L"--undefined--";
+const char * Melder8_half (double value) {
+	if (value == NUMundefined) return "--undefined--";
 	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.4g", value);
-	return buffers [ibuffer];
+	sprintf (buffers8 [ibuffer], "%.4g", value);
+	return buffers8 [ibuffer];
+}
+const char32 * Melder_half (double value) {
+	const char *p = Melder8_half (value);
+	CONVERT_BUFFER_TO_CHAR32
 }
 
-const wchar_t * Melder_fixed (double value, int precision) {
+const char * Melder8_fixed (double value, int precision) {
 	int minimumPrecision;
-	if (value == NUMundefined) return L"--undefined--";
-	if (value == 0.0) return L"0";
+	if (value == NUMundefined) return "--undefined--";
+	if (value == 0.0) return "0";
 	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
 	if (precision > 60) precision = 60;
 	minimumPrecision = - (int) floor (log10 (fabs (value)));
-	swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.*f",
+	int n = snprintf (buffers8 [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH + 1, "%.*f",
 		minimumPrecision > precision ? minimumPrecision : precision, value);
-	return buffers [ibuffer];
+	Melder_assert (n > 0);
+	Melder_assert (n <= MAXIMUM_NUMERIC_STRING_LENGTH);
+	return buffers8 [ibuffer];
+}
+const char32 * Melder_fixed (double value, int precision) {
+	const char *p = Melder8_fixed (value, precision);
+	CONVERT_BUFFER_TO_CHAR32
 }
 
-const wchar_t * Melder_fixedExponent (double value, int exponent, int precision) {
+const char * Melder8_fixedExponent (double value, int exponent, int precision) {
 	double factor = pow (10, exponent);
 	int minimumPrecision;
-	if (value == NUMundefined) return L"--undefined--";
-	if (value == 0.0) return L"0";
+	if (value == NUMundefined) return "--undefined--";
+	if (value == 0.0) return "0";
 	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
 	if (precision > 60) precision = 60;
 	value /= factor;
 	minimumPrecision = - (int) floor (log10 (fabs (value)));
-	swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.*fE%d",
+	int n = snprintf (buffers8 [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH + 1, "%.*fE%d",
 		minimumPrecision > precision ? minimumPrecision : precision, value, exponent);
-	return buffers [ibuffer];
+	Melder_assert (n > 0);
+	Melder_assert (n <= MAXIMUM_NUMERIC_STRING_LENGTH);
+	return buffers8 [ibuffer];
+}
+const char32 * Melder_fixedExponent (double value, int exponent, int precision) {
+	const char *p = Melder8_fixedExponent (value, exponent, precision);
+	CONVERT_BUFFER_TO_CHAR32
 }
 
-const wchar_t * Melder_percent (double value, int precision) {
+const char * Melder8_percent (double value, int precision) {
 	int minimumPrecision;
-	if (value == NUMundefined) return L"--undefined--";
-	if (value == 0.0) return L"0";
+	if (value == NUMundefined) return "--undefined--";
+	if (value == 0.0) return "0";
 	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
 	if (precision > 60) precision = 60;
 	value *= 100.0;
 	minimumPrecision = - (int) floor (log10 (fabs (value)));
-	swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.*f%%",
+	int n = snprintf (buffers8 [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH + 1, "%.*f%%",
 		minimumPrecision > precision ? minimumPrecision : precision, value);
-	return buffers [ibuffer];
+	Melder_assert (n > 0);
+	Melder_assert (n <= MAXIMUM_NUMERIC_STRING_LENGTH);
+	return buffers8 [ibuffer];
+}
+const char32 * Melder_percent (double value, int precision) {
+	const char *p = Melder8_percent (value, precision);
+	CONVERT_BUFFER_TO_CHAR32
 }
 
-const wchar_t * Melder_float (const wchar_t *number) {
+const char32 * Melder_float (const char32 *number) {
 	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	if (wcschr (number, 'e') == NULL) {
-		wcscpy (buffers [ibuffer], number);
+	if (! str32chr (number, 'e')) {
+		str32cpy (buffers32 [ibuffer], number);
 	} else {
-		wchar_t *b = buffers [ibuffer];
-		const wchar_t *n = number;
-		while (*n != 'e') *(b++) = *(n++); *b = '\0';
+		char32 *b = buffers32 [ibuffer];
+		const char32 *n = number;
+		while (*n != U'e') *(b++) = *(n++); *b = U'\0';
 		if (number [0] == '1' && number [1] == 'e') {
-			wcscpy (buffers [ibuffer], L"10^^"); b = buffers [ibuffer] + 4;
+			str32cpy (buffers32 [ibuffer], U"10^^"); b = buffers32 [ibuffer] + 4;
 		} else {
-			wcscat (buffers [ibuffer], L"·10^^"); b += 7;
+			str32cpy (buffers32 [ibuffer] + str32len (buffers32 [ibuffer]), U"·10^^"); b += 5;
 		}
-		Melder_assert (*n == 'e');
-		if (*++n == '+') n ++;   // ignore leading plus sign in exponent
-		if (*n == '-') *(b++) = *(n++);   // copy sign of negative exponent
-		while (*n == '0') n ++;   // ignore leading zeroes in exponent
-		while (*n >= '0' && *n <= '9') *(b++) = *(n++);
-		*(b++) = '^';
-		while (*n != '\0') *(b++) = *(n++); *b = '\0';
+		Melder_assert (*n == U'e');
+		if (*++n == U'+') n ++;   // ignore leading plus sign in exponent
+		if (*n == U'-') *(b++) = *(n++);   // copy sign of negative exponent
+		while (*n == U'0') n ++;   // ignore leading zeroes in exponent
+		while (*n >= U'0' && *n <= U'9') *(b++) = *(n++);
+		*(b++) = U'^';
+		while (*n != U'\0') *(b++) = *(n++);
+		*b = U'\0';
 	}
-	return buffers [ibuffer];
+	return buffers32 [ibuffer];
 }
 
-const wchar_t * Melder_naturalLogarithm (double lnNumber) {
-	if (lnNumber == NUMundefined) return L"--undefined--";
-	if (lnNumber == -INFINITY) return L"0";
+const char * Melder8_naturalLogarithm (double lnNumber) {
+	if (lnNumber == NUMundefined) return "--undefined--";
+	if (lnNumber == -INFINITY) return "0";
 	double log10Number = lnNumber * NUMlog10e;
-	if (log10Number < -41) {
+	if (log10Number < -41.0) {
 		if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-		long ceiling = ceil (log10Number);
+		long ceiling = (long) ceil (log10Number);
 		double remainder = log10Number - ceiling;
-		double remainder10 = pow (10, remainder);
+		double remainder10 = pow (10.0, remainder);
 		while (remainder10 < 1.0) {
-			remainder10 *= 10;
+			remainder10 *= 10.0;
 			ceiling --;
 		}
-		swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.15g", remainder10);
-		if (wcstod (buffers [ibuffer], NULL) != remainder10) {
-			swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.16g", remainder10);
-			if (wcstod (buffers [ibuffer], NULL) != remainder10) swprintf (buffers [ibuffer], MAXIMUM_NUMERIC_STRING_LENGTH, L"%.17g", remainder10);
+		sprintf (buffers8 [ibuffer], "%.15g", remainder10);
+		if (strtod (buffers8 [ibuffer], nullptr) != remainder10) {
+			sprintf (buffers8 [ibuffer], "%.16g", remainder10);
+			if (strtod (buffers8 [ibuffer], nullptr) != remainder10) sprintf (buffers8 [ibuffer], "%.17g", remainder10);
 		}
-		swprintf (buffers [ibuffer] + wcslen (buffers [ibuffer]), 100, L"e-%ld", ceiling);
+		sprintf (buffers8 [ibuffer] + strlen (buffers8 [ibuffer]), "e-%ld", ceiling);
+	} else {
+		return Melder8_double (exp (lnNumber));
+	}
+	return buffers8 [ibuffer];
+}
+const char32 * Melder_naturalLogarithm (double lnNumber) {
+	const char *p = Melder8_naturalLogarithm (lnNumber);
+	CONVERT_BUFFER_TO_CHAR32
+}
+
+const char * Melder8_pointer (void *pointer) {
+	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
+	sprintf (buffers8 [ibuffer], "%p", pointer);
+	return buffers8 [ibuffer];
+}
+const char32 * Melder_pointer (void *pointer) {
+	const char *p = Melder8_pointer (pointer);
+	CONVERT_BUFFER_TO_CHAR32
+}
+
+const char32 * Melder_character (char32 kar) {
+	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
+	buffers32 [ibuffer] [0] = kar;
+	buffers32 [ibuffer] [1] = U'\0';
+	return buffers32 [ibuffer];
+}
+
+static MelderString thePadBuffers [NUMBER_OF_BUFFERS];
+static int iPadBuffer { 0 };
+
+const char32 * Melder_pad (int64 width, const char32 *string) {
+	if (++ iPadBuffer == NUMBER_OF_BUFFERS) iPadBuffer = 0;
+	int64 length = str32len (string);
+	int64 tooShort = width - length;
+	if (tooShort <= 0) return string;
+	MelderString_empty (& thePadBuffers [iPadBuffer]);
+	for (int64 i = 0; i < tooShort; i ++)
+		MelderString_appendCharacter (& thePadBuffers [iPadBuffer], U' ');
+	MelderString_append (& thePadBuffers [iPadBuffer], string);
+	return thePadBuffers [iPadBuffer]. string;
+}
+
+const char32 * Melder_pad (const char32 *string, int64 width) {
+	if (++ iPadBuffer == NUMBER_OF_BUFFERS) iPadBuffer = 0;
+	int64 length = str32len (string);
+	int64 tooShort = width - length;
+	if (tooShort <= 0) return string;
+	MelderString_copy (& thePadBuffers [iPadBuffer], string);
+	for (int64 i = 0; i < tooShort; i ++)
+		MelderString_appendCharacter (& thePadBuffers [iPadBuffer], U' ');
+	return thePadBuffers [iPadBuffer]. string;
+}
+
+const char32 * Melder_truncate (int64 width, const char32 *string) {
+	if (++ iPadBuffer == NUMBER_OF_BUFFERS) iPadBuffer = 0;
+	int64 length = str32len (string);
+	int64 tooLong = length - width;
+	if (tooLong <= 0) return string;
+	MelderString_ncopy (& thePadBuffers [iPadBuffer], string + tooLong, width);
+	return thePadBuffers [iPadBuffer]. string;
+}
+
+const char32 * Melder_truncate (const char32 *string, int64 width) {
+	if (++ iPadBuffer == NUMBER_OF_BUFFERS) iPadBuffer = 0;
+	int64 length = str32len (string);
+	int64 tooLong = length - width;
+	if (tooLong <= 0) return string;
+	MelderString_ncopy (& thePadBuffers [iPadBuffer], string, width);
+	return thePadBuffers [iPadBuffer]. string;
+}
+
+const char32 * Melder_padOrTruncate (int64 width, const char32 *string) {
+	if (++ iPadBuffer == NUMBER_OF_BUFFERS) iPadBuffer = 0;
+	int64 length = str32len (string);
+	int64 tooLong = length - width;
+	if (tooLong == 0) return string;
+	if (tooLong < 0) {
+		int64 tooShort = - tooLong;
+		MelderString_empty (& thePadBuffers [iPadBuffer]);
+		for (int64 i = 0; i < tooShort; i ++)
+			MelderString_appendCharacter (& thePadBuffers [iPadBuffer], U' ');
+		MelderString_append (& thePadBuffers [iPadBuffer], string);
+	} else {
+		MelderString_ncopy (& thePadBuffers [iPadBuffer], string + tooLong, width);
+	}
+	return thePadBuffers [iPadBuffer]. string;
+}
+
+const char32 * Melder_padOrTruncate (const char32 *string, int64 width) {
+	if (++ iPadBuffer == NUMBER_OF_BUFFERS) iPadBuffer = 0;
+	int64 length = str32len (string);
+	int64 tooLong = length - width;
+	if (tooLong == 0) return string;
+	if (tooLong < 0) {
+		int64 tooShort = - tooLong;
+		MelderString_copy (& thePadBuffers [iPadBuffer], string);
+		for (int64 i = 0; i < tooShort; i ++)
+			MelderString_appendCharacter (& thePadBuffers [iPadBuffer], U' ');
 	} else {
-		return Melder_double (exp (lnNumber));
+		MelderString_ncopy (& thePadBuffers [iPadBuffer], string, width);
 	}
-	return buffers [ibuffer];
+	return thePadBuffers [iPadBuffer]. string;
 }
 
 /* End of file melder_ftoa.cpp */
diff --git a/sys/melder_info.cpp b/sys/melder_info.cpp
index bcaf263..a4fa8ec 100644
--- a/sys/melder_info.cpp
+++ b/sys/melder_info.cpp
@@ -1,6 +1,6 @@
 /* melder_info.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,223 +20,419 @@
 #include "melder.h"
 #include "NUM.h"   // NUMundefined
 
-static void defaultInformation (const wchar_t *message) {
+static void defaultInformation (const char32 *message) {
 	Melder_writeToConsole (message, false);
 }
 
-static void (*theInformation) (const wchar_t *) = defaultInformation;
+static void (*theInformation) (const char32 *) = defaultInformation;
 
-void Melder_setInformationProc (void (*information) (const wchar_t *)) {
+void Melder_setInformationProc (void (*information) (const char32 *)) {
 	theInformation = information ? information : defaultInformation;
 }
 
 static MelderString theForegroundBuffer = { 0 }, *theInfos = & theForegroundBuffer;
 
-void MelderInfo_open (void) {
+void MelderInfo_open () {
 	MelderString_empty (theInfos);
 }
 
-void MelderInfo_write (const wchar_t *s1) {
-	MelderString_append (theInfos, s1);
-	if (Melder_batch && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
+void MelderInfo_write (Melder_1_ARG) {
+	MelderString_append (theInfos, Melder_1_ARG_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+	}
+}
+void MelderInfo_write (Melder_2_ARGS) {
+	MelderString_append (theInfos, Melder_2_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+	}
+}
+void MelderInfo_write (Melder_3_ARGS) {
+	MelderString_append (theInfos, Melder_3_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+	}
+}
+void MelderInfo_write (Melder_4_ARGS) {
+	MelderString_append (theInfos, Melder_4_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
 	}
 }
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2) {
-	MelderString_append (theInfos, s1, s2);
+void MelderInfo_write (Melder_5_ARGS) {
+	MelderString_append (theInfos, Melder_5_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
 	}
 }
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3) {
-	MelderString_append (theInfos, s1, s2, s3);
+void MelderInfo_write (Melder_6_ARGS) {
+	MelderString_append (theInfos, Melder_6_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
 	}
 }
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4) {
-	MelderString_append (theInfos, s1, s2, s3, s4);
+void MelderInfo_write (Melder_7_ARGS) {
+	MelderString_append (theInfos, Melder_7_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
 	}
 }
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5) {
-	MelderString_append (theInfos, s1, s2, s3, s4, s5);
+void MelderInfo_write (Melder_8_ARGS) {
+	MelderString_append (theInfos, Melder_8_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
 	}
 }
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6);
+void MelderInfo_write (Melder_9_ARGS) {
+	MelderString_append (theInfos, Melder_9_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
 	}
 }
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7) {
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6, s7);
+void MelderInfo_write (Melder_10_ARGS) {
+	MelderString_append (theInfos, Melder_10_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
-		Melder_writeToConsole (s7, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
 	}
 }
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8) {
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6, s7, s8);
+void MelderInfo_write (Melder_11_ARGS) {
+	MelderString_append (theInfos, Melder_11_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
-		Melder_writeToConsole (s7, false);
-		Melder_writeToConsole (s8, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
 	}
 }
-void MelderInfo_write (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9) {
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6, s7, s8, s9);
+void MelderInfo_write (Melder_13_ARGS) {
+	MelderString_append (theInfos, Melder_13_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
-		Melder_writeToConsole (s7, false);
-		Melder_writeToConsole (s8, false);
-		Melder_writeToConsole (s9, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+		Melder_writeToConsole (arg12._arg, false);
+		Melder_writeToConsole (arg13._arg, false);
+	}
+}
+void MelderInfo_write (Melder_15_ARGS) {
+	MelderString_append (theInfos, Melder_15_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+		Melder_writeToConsole (arg12._arg, false);
+		Melder_writeToConsole (arg13._arg, false);
+		Melder_writeToConsole (arg14._arg, false);
+		Melder_writeToConsole (arg15._arg, false);
+	}
+}
+void MelderInfo_write (Melder_19_ARGS) {
+	MelderString_append (theInfos, Melder_19_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+		Melder_writeToConsole (arg12._arg, false);
+		Melder_writeToConsole (arg13._arg, false);
+		Melder_writeToConsole (arg14._arg, false);
+		Melder_writeToConsole (arg15._arg, false);
+		Melder_writeToConsole (arg16._arg, false);
+		Melder_writeToConsole (arg17._arg, false);
+		Melder_writeToConsole (arg18._arg, false);
+		Melder_writeToConsole (arg19._arg, false);
 	}
 }
 
-void MelderInfo_writeLine (const wchar_t *s1) {
-	MelderString_append (theInfos, s1);
-	MelderString_appendCharacter (theInfos, '\n');
-	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (L"\n", false);
+void MelderInfo_writeLine (Melder_1_ARG) {
+	MelderString_append (theInfos, Melder_1_ARG_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (U"\n", false);
 	}
 }
-void MelderInfo_writeLine (const wchar_t *s1, const wchar_t *s2) {
-	MelderString_append (theInfos, s1, s2);
-	MelderString_appendCharacter (theInfos, '\n');
+void MelderInfo_writeLine (Melder_2_ARGS) {
+	MelderString_append (theInfos, Melder_2_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (L"\n", false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (U"\n", false);
 	}
 }
-void MelderInfo_writeLine (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3) {
-	MelderString_append (theInfos, s1, s2, s3);
-	MelderString_appendCharacter (theInfos, '\n');
+void MelderInfo_writeLine (Melder_3_ARGS) {
+	MelderString_append (theInfos, Melder_3_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (L"\n", false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (U"\n", false);
 	}
 }
-void MelderInfo_writeLine (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4) {
-	MelderString_append (theInfos, s1, s2, s3, s4);
-	MelderString_appendCharacter (theInfos, '\n');
+void MelderInfo_writeLine (Melder_4_ARGS) {
+	MelderString_append (theInfos, Melder_4_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (L"\n", false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (U"\n", false);
 	}
 }
-void MelderInfo_writeLine (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5) {
-	MelderString_append (theInfos, s1, s2, s3, s4, s5);
-	MelderString_appendCharacter (theInfos, '\n');
+void MelderInfo_writeLine (Melder_5_ARGS) {
+	MelderString_append (theInfos, Melder_5_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (L"\n", false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (U"\n", false);
 	}
 }
-void MelderInfo_writeLine (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6);
-	MelderString_appendCharacter (theInfos, '\n');
+void MelderInfo_writeLine (Melder_6_ARGS) {
+	MelderString_append (theInfos, Melder_6_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
-		Melder_writeToConsole (L"\n", false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (U"\n", false);
 	}
 }
-void MelderInfo_writeLine (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7) {
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6, s7);
-	MelderString_appendCharacter (theInfos, '\n');
+void MelderInfo_writeLine (Melder_7_ARGS) {
+	MelderString_append (theInfos, Melder_7_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
-		Melder_writeToConsole (s7, false);
-		Melder_writeToConsole (L"\n", false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (U"\n", false);
 	}
 }
-void MelderInfo_writeLine (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8) {
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6, s7, s8);
-	MelderString_appendCharacter (theInfos, '\n');
+void MelderInfo_writeLine (Melder_8_ARGS) {
+	MelderString_append (theInfos, Melder_8_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
-		Melder_writeToConsole (s7, false);
-		Melder_writeToConsole (s8, false);
-		Melder_writeToConsole (L"\n", false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (U"\n", false);
 	}
 }
-void MelderInfo_writeLine (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9) {
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6, s7, s8, s9);
-	MelderString_appendCharacter (theInfos, '\n');
+void MelderInfo_writeLine (Melder_9_ARGS) {
+	MelderString_append (theInfos, Melder_9_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
-		Melder_writeToConsole (s7, false);
-		Melder_writeToConsole (s8, false);
-		Melder_writeToConsole (s9, false);
-		Melder_writeToConsole (L"\n", false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (U"\n", false);
+	}
+}
+void MelderInfo_writeLine (Melder_10_ARGS) {
+	MelderString_append (theInfos, Melder_10_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (U"\n", false);
+	}
+}
+void MelderInfo_writeLine (Melder_11_ARGS) {
+	MelderString_append (theInfos, Melder_11_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+		Melder_writeToConsole (U"\n", false);
+	}
+}
+void MelderInfo_writeLine (Melder_13_ARGS) {
+	MelderString_append (theInfos, Melder_13_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+		Melder_writeToConsole (arg12._arg, false);
+		Melder_writeToConsole (arg13._arg, false);
+		Melder_writeToConsole (U"\n", false);
+	}
+}
+void MelderInfo_writeLine (Melder_15_ARGS) {
+	MelderString_append (theInfos, Melder_15_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+		Melder_writeToConsole (arg12._arg, false);
+		Melder_writeToConsole (arg13._arg, false);
+		Melder_writeToConsole (arg14._arg, false);
+		Melder_writeToConsole (arg15._arg, false);
+		Melder_writeToConsole (U"\n", false);
+	}
+}
+void MelderInfo_writeLine (Melder_19_ARGS) {
+	MelderString_append (theInfos, Melder_19_ARGS_CALL);
+	MelderString_appendCharacter (theInfos, U'\n');
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+		Melder_writeToConsole (arg12._arg, false);
+		Melder_writeToConsole (arg13._arg, false);
+		Melder_writeToConsole (arg14._arg, false);
+		Melder_writeToConsole (arg15._arg, false);
+		Melder_writeToConsole (arg16._arg, false);
+		Melder_writeToConsole (arg17._arg, false);
+		Melder_writeToConsole (arg18._arg, false);
+		Melder_writeToConsole (arg19._arg, false);
+		Melder_writeToConsole (U"\n", false);
 	}
 }
 
-void MelderInfo_close (void) {
+void MelderInfo_close () {
 	if (theInfos == & theForegroundBuffer) {
 		/*
 			When writing to the Info window or the console, we must add a newline symbol,
@@ -244,167 +440,248 @@ void MelderInfo_close (void) {
 			When writing to a diverted string, we must *not* add a newline symbol,
 			because scripts expect returned strings without appended newlines!
 		*/
-		if (theInfos -> length == 0 || theInfos -> string [theInfos -> length - 1] != '\n') {   // Only if no newline there yet.
-			MelderString_appendCharacter (theInfos, '\n');
+		if (theInfos -> length == 0 || theInfos -> string [theInfos -> length - 1] != U'\n') {   // Only if no newline there yet.
+			MelderString_appendCharacter (theInfos, U'\n');
 			if (theInformation == defaultInformation) {
-				Melder_writeToConsole (L"\n", false);
+				Melder_writeToConsole (U"\n", false);
 			}
 		}
 		if (theInformation != defaultInformation) {
-			theInformation (theInfos -> string ? theInfos -> string : L"");
+			theInformation (theInfos -> string ? theInfos -> string : U"");
 		}
 	}
 }
 
-void MelderInfo_drain (void) {
+void MelderInfo_drain () {
 	if (theInfos == & theForegroundBuffer) {
 		if (theInformation != defaultInformation) {
-			theInformation (theInfos -> string ? theInfos -> string : L"");
+			theInformation (theInfos -> string ? theInfos -> string : U"");
 		}
 	}
 }
 
-void Melder_informationReal (double value, const wchar_t *units) {
+void Melder_informationReal (double value, const char32 *units) {
 	MelderInfo_open ();
 	if (value == NUMundefined)
-		MelderInfo_write (L"--undefined--");
-	else if (units == NULL)
-		MelderInfo_write (Melder_double (value));
+		MelderInfo_write (U"--undefined--");
+	else if (! units)
+		MelderInfo_write (value);
 	else
-		MelderInfo_write (Melder_double (value), L" ", units);
+		MelderInfo_write (value, U" ", units);
 	MelderInfo_close ();
 }
 
 void Melder_divertInfo (MelderString *buffer) {
-	theInfos = buffer == NULL ? & theForegroundBuffer : buffer;
+	theInfos = ( buffer ? buffer : & theForegroundBuffer );
 }
 
-void Melder_clearInfo (void) {
+void Melder_clearInfo () {
 	if (theInfos == & theForegroundBuffer) {
 		MelderString_empty (theInfos);
 		if (theInformation != defaultInformation) {
-			theInformation (L"");
+			theInformation (U"");
 		}
 	}
 }
 
-const wchar_t * Melder_getInfo (void) {
-	return theInfos -> string ? theInfos -> string : L"";
+const char32 * Melder_getInfo () {
+	return theInfos -> string ? theInfos -> string : U"";
 }
 
-void Melder_information (const wchar_t *s1) {
-	MelderString_empty (theInfos);
-	MelderString_append (theInfos, s1);
+void Melder_information (Melder_1_ARG) {
+	MelderString_copy (theInfos, Melder_1_ARG_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
+		Melder_writeToConsole (arg1 ._arg, false);
 	}
 	MelderInfo_close ();
 }
-
-void Melder_information (const wchar_t *s1, const wchar_t *s2) {
-	MelderString_empty (theInfos);
-	MelderString_append (theInfos, s1, s2);
+void Melder_information (Melder_2_ARGS) {
+	MelderString_copy (theInfos, Melder_2_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
 	}
 	MelderInfo_close ();
 }
-
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3) {
-	MelderString_empty (theInfos);
-	MelderString_append (theInfos, s1, s2, s3);
+void Melder_information (Melder_3_ARGS) {
+	MelderString_copy (theInfos, Melder_3_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
 	}
 	MelderInfo_close ();
 }
-
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4) {
-	MelderString_empty (theInfos);
-	MelderString_append (theInfos, s1, s2, s3, s4);
+void Melder_information (Melder_4_ARGS) {
+	MelderString_copy (theInfos, Melder_4_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
 	}
 	MelderInfo_close ();
 }
-
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5) {
-	MelderString_empty (theInfos);
-	MelderString_append (theInfos, s1, s2, s3, s4, s5);
+void Melder_information (Melder_5_ARGS) {
+	MelderString_copy (theInfos, Melder_5_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
 	}
 	MelderInfo_close ();
 }
-
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
-	MelderString_empty (theInfos);
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6);
+void Melder_information (Melder_6_ARGS) {
+	MelderString_copy (theInfos, Melder_6_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
 	}
 	MelderInfo_close ();
 }
-
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7) {
-	MelderString_empty (theInfos);
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6, s7);
+void Melder_information (Melder_7_ARGS) {
+	MelderString_copy (theInfos, Melder_7_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
-		Melder_writeToConsole (s7, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
 	}
 	MelderInfo_close ();
 }
-
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8) {
-	MelderString_empty (theInfos);
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6, s7, s8);
+void Melder_information (Melder_8_ARGS) {
+	MelderString_copy (theInfos, Melder_8_ARGS_CALL);
 	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
-		Melder_writeToConsole (s7, false);
-		Melder_writeToConsole (s8, false);
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
 	}
 	MelderInfo_close ();
 }
-
-void Melder_information (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9) {
-	MelderString_empty (theInfos);
-	MelderString_append (theInfos, s1, s2, s3, s4, s5, s6, s7, s8, s9);
-	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
-		Melder_writeToConsole (s1, false);
-		Melder_writeToConsole (s2, false);
-		Melder_writeToConsole (s3, false);
-		Melder_writeToConsole (s4, false);
-		Melder_writeToConsole (s5, false);
-		Melder_writeToConsole (s6, false);
-		Melder_writeToConsole (s7, false);
-		Melder_writeToConsole (s8, false);
-		Melder_writeToConsole (s9, false);
+void Melder_information (Melder_9_ARGS) {
+	MelderString_copy (theInfos, Melder_9_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+	}
+	MelderInfo_close ();
+}
+void Melder_information (Melder_10_ARGS) {
+	MelderString_copy (theInfos, Melder_10_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+	}
+	MelderInfo_close ();
+}
+void Melder_information (Melder_11_ARGS) {
+	MelderString_copy (theInfos, Melder_11_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+	}
+	MelderInfo_close ();
+}
+void Melder_information (Melder_13_ARGS) {
+	MelderString_copy (theInfos, Melder_13_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+		Melder_writeToConsole (arg12._arg, false);
+		Melder_writeToConsole (arg13._arg, false);
+	}
+	MelderInfo_close ();
+}
+void Melder_information (Melder_15_ARGS) {
+	MelderString_copy (theInfos, Melder_15_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+		Melder_writeToConsole (arg12._arg, false);
+		Melder_writeToConsole (arg13._arg, false);
+		Melder_writeToConsole (arg14._arg, false);
+		Melder_writeToConsole (arg15._arg, false);
+	}
+	MelderInfo_close ();
+}
+void Melder_information (Melder_19_ARGS) {
+	MelderString_copy (theInfos, Melder_19_ARGS_CALL);
+	if (theInformation == defaultInformation && theInfos == & theForegroundBuffer) {
+		Melder_writeToConsole (arg1 ._arg, false);
+		Melder_writeToConsole (arg2 ._arg, false);
+		Melder_writeToConsole (arg3 ._arg, false);
+		Melder_writeToConsole (arg4 ._arg, false);
+		Melder_writeToConsole (arg5 ._arg, false);
+		Melder_writeToConsole (arg6 ._arg, false);
+		Melder_writeToConsole (arg7 ._arg, false);
+		Melder_writeToConsole (arg8 ._arg, false);
+		Melder_writeToConsole (arg9 ._arg, false);
+		Melder_writeToConsole (arg10._arg, false);
+		Melder_writeToConsole (arg11._arg, false);
+		Melder_writeToConsole (arg12._arg, false);
+		Melder_writeToConsole (arg13._arg, false);
+		Melder_writeToConsole (arg14._arg, false);
+		Melder_writeToConsole (arg15._arg, false);
+		Melder_writeToConsole (arg16._arg, false);
+		Melder_writeToConsole (arg17._arg, false);
+		Melder_writeToConsole (arg18._arg, false);
+		Melder_writeToConsole (arg19._arg, false);
 	}
 	MelderInfo_close ();
 }
diff --git a/sys/melder_quantity.cpp b/sys/melder_quantity.cpp
index cfb405c..2846150 100644
--- a/sys/melder_quantity.cpp
+++ b/sys/melder_quantity.cpp
@@ -1,6 +1,6 @@
 /* melder_quantity.cpp
  *
- * Copyright (C) 2007-2011 Paul Boersma
+ * Copyright (C) 2007-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,24 +19,24 @@
 
 /*
  * pb 2007/03/17 created
- * pb 2007/08/14 wchar_t
+ * pb 2007/08/14 wchar
  * pb 2008/03/07 typo
  * pb 2011/04/05 C++
  */
 
 #include "melder.h"
 
-static const wchar_t * texts [1+MelderQuantity_NUMBER_OF_QUANTITIES] [4] = {
-	{ L"", L"", L"", L"" },
-	{ L"Time", L"Time (s)", L"seconds", L"s" },
-	{ L"Frequency", L"Frequency (Hz)", L"Hertz", L"Hz" },
-	{ L"Frequency", L"Frequency (Bark)", L"Bark", L"Bark" },
-	{ L"Distance from glottis", L"Distance from glottis (m)", L"metres", L"m" },	
+static const char32 * texts [1+MelderQuantity_NUMBER_OF_QUANTITIES] [4] = {
+	{ U"", U"", U"", U"" },
+	{ U"Time", U"Time (s)", U"seconds", U"s" },
+	{ U"Frequency", U"Frequency (Hz)", U"Hertz", U"Hz" },
+	{ U"Frequency", U"Frequency (Bark)", U"Bark", U"Bark" },
+	{ U"Distance from glottis", U"Distance from glottis (m)", U"metres", U"m" },	
 };
 
-const wchar_t * MelderQuantity_getText (int quantity) { return texts [quantity] [0]; }
-const wchar_t * MelderQuantity_getWithUnitText (int quantity) { return texts [quantity] [1]; }
-const wchar_t * MelderQuantity_getLongUnitText (int quantity) { return texts [quantity] [2]; }
-const wchar_t * MelderQuantity_getShortUnitText (int quantity) { return texts [quantity] [3]; }
+const char32 * MelderQuantity_getText (int quantity) { return texts [quantity] [0]; }
+const char32 * MelderQuantity_getWithUnitText (int quantity) { return texts [quantity] [1]; }
+const char32 * MelderQuantity_getLongUnitText (int quantity) { return texts [quantity] [2]; }
+const char32 * MelderQuantity_getShortUnitText (int quantity) { return texts [quantity] [3]; }
 
 /* End of file melder_quantity.cpp */
diff --git a/sys/melder_readtext.cpp b/sys/melder_readtext.cpp
index a1852d5..9311e88 100644
--- a/sys/melder_readtext.cpp
+++ b/sys/melder_readtext.cpp
@@ -1,6 +1,6 @@
 /* melder_readtext.cpp
  *
- * Copyright (C) 2008-2011,2014 Paul Boersma
+ * Copyright (C) 2008-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,11 +18,13 @@
  */
 
 /*
+ * pb 2007/12/09 made MelderFile_readText ignore null bytes
  * pb 2008/11/04 split off from melder_strings.c and melder_encodings.c
  * pb 2010/03/09 support Unicode values above 0xFFFF
  * pb 2011/04/05 C++
  * pb 2011/07/03 C++
- * pb 2014/12/17 int64_t
+ * pb 2014/12/17 int64
+ * pb 2015/05/26 char32
  */
 
 #include "melder.h"
@@ -30,92 +32,92 @@
 #include "abcio.h"
 #define my  me ->
 
-wchar_t MelderReadText_getChar (MelderReadText me) {
-	if (my stringW != NULL) {
-		if (* my readPointerW == '\0') return 0;
-		return * my readPointerW ++;
+char32 MelderReadText_getChar (MelderReadText me) {
+	if (my string32) {
+		if (* my readPointer32 == U'\0') return U'\0';
+		return * my readPointer32 ++;
 	} else {
-		if (* my readPointer8 == '\0') return 0;
+		if (* my readPointer8 == '\0') return U'\0';
 		if (my input8Encoding == kMelder_textInputEncoding_UTF8) {
-			char32_t kar1 = * (char8_t *) my readPointer8 ++;
-			if (kar1 <= 0x7F) {
+			char32 kar1 = (char32) (char8) * my readPointer8 ++;
+			if (kar1 <= 0x00007F) {
 				return kar1;
-			} else if (kar1 <= 0xDF) {
-				char32_t kar2 = * (char8_t *) my readPointer8 ++;
-				return ((kar1 & 0x1F) << 6) | (kar2 & 0x3F);
-			} else if (kar1 <= 0xEF) {
-				char32_t kar2 = * (char8_t *) my readPointer8 ++;
-				char32_t kar3 = * (char8_t *) my readPointer8 ++;
-				return ((kar1 & 0x0F) << 12) | ((kar2 & 0x3F) << 6) | (kar3 & 0x3F);
-			} else if (kar1 <= 0xF4) {
-				char32_t kar2 = * (char8_t *) my readPointer8 ++;
-				char32_t kar3 = * (char8_t *) my readPointer8 ++;
-				char32_t kar4 = * (char8_t *) my readPointer8 ++;
-				return ((kar1 & 0x07) << 18) | ((kar2 & 0x3F) << 12) | ((kar3 & 0x3F) << 6) | (kar4 & 0x3F);   // BUG: should be UTF-16 on Windows
+			} else if (kar1 <= 0x0000DF) {
+				char32 kar2 = (char32) (char8) * my readPointer8 ++;
+				return ((kar1 & 0x00001F) << 6) | (kar2 & 0x00003F);
+			} else if (kar1 <= 0x0000EF) {
+				char32 kar2 = (char32) (char8) * my readPointer8 ++;
+				char32 kar3 = (char32) (char8) * my readPointer8 ++;
+				return ((kar1 & 0x00000F) << 12) | ((kar2 & 0x00003F) << 6) | (kar3 & 0x00003F);
+			} else if (kar1 <= 0x0000F4) {
+				char32 kar2 = (char32) (char8) * my readPointer8 ++;
+				char32 kar3 = (char32) (char8) * my readPointer8 ++;
+				char32 kar4 = (char32) (char8) * my readPointer8 ++;
+				return ((kar1 & 0x000007) << 18) | ((kar2 & 0x00003F) << 12) | ((kar3 & 0x00003F) << 6) | (kar4 & 0x00003F);
 			} else {
 				return UNICODE_REPLACEMENT_CHARACTER;
 			}
 		} else if (my input8Encoding == kMelder_textInputEncoding_MACROMAN) {
-			return Melder_decodeMacRoman [* (unsigned char *) my readPointer8 ++];
+			return Melder_decodeMacRoman [(char8) * my readPointer8 ++];
 		} else if (my input8Encoding == kMelder_textInputEncoding_WINDOWS_LATIN1) {
-			return Melder_decodeWindowsLatin1 [* (unsigned char *) my readPointer8 ++];
+			return Melder_decodeWindowsLatin1 [(char8) * my readPointer8 ++];
 		} else {
 			/* Unknown encoding. */
-			return * (char8_t *) my readPointer8 ++;
+			return (char32) (char8) * my readPointer8 ++;
 		}
 	}
 }
 
-wchar_t * MelderReadText_readLine (MelderReadText me) {
-	if (my stringW != NULL) {
-		Melder_assert (my readPointerW != NULL);
-		Melder_assert (my readPointer8 == NULL);
-		if (*my readPointerW == '\0') {   // tried to read past end of file
-			return NULL;
+char32 * MelderReadText_readLine (MelderReadText me) {
+	if (my string32) {
+		Melder_assert (my readPointer32);
+		Melder_assert (! my readPointer8);
+		if (*my readPointer32 == U'\0') {   // tried to read past end of file
+			return nullptr;
 		}
-		wchar_t *result = my readPointerW;
-		wchar_t *newline = wcschr (result, '\n');
-		if (newline != NULL) {
-			*newline = '\0';
-			my readPointerW = newline + 1;
+		char32 *result = my readPointer32;
+		char32 *newline = str32chr (result, U'\n');
+		if (newline) {
+			*newline = U'\0';
+			my readPointer32 = newline + 1;
 		} else {
-			my readPointerW += wcslen (result);
+			my readPointer32 += str32len (result);
 		}
 		return result;
 	} else {
-		Melder_assert (my string8 != NULL);
-		Melder_assert (my readPointerW == NULL);
-		Melder_assert (my readPointer8 != NULL);
+		Melder_assert (my string8);
+		Melder_assert (! my readPointer32);
+		Melder_assert (my readPointer8);
 		if (*my readPointer8 == '\0') {   // tried to read past end of file
-			return NULL;
+			return nullptr;
 		}
 		char *result8 = my readPointer8;
 		char *newline = strchr (result8, '\n');
-		if (newline != NULL) {
+		if (newline) {
 			*newline = '\0';
 			my readPointer8 = newline + 1;
 		} else {
 			my readPointer8 += strlen (result8);
 		}
-		static wchar_t *textW = NULL;
-		static size_t size = 0;
-		size_t sizeNeeded = strlen (result8) + 1;
+		static char32 *text32 = nullptr;
+		static int64 size = 0;
+		int64 sizeNeeded = (int64) strlen (result8) + 1;
 		if (sizeNeeded > size) {
-			Melder_free (textW);
-			textW = Melder_malloc_f (wchar_t, sizeNeeded + 100);
+			Melder_free (text32);
+			text32 = Melder_malloc_f (char32, sizeNeeded + 100);
 			size = sizeNeeded + 100;
 		}
-		Melder_8bitToWcs_inline (result8, textW, my input8Encoding);
-		return textW;
+		Melder_8to32_inline (result8, text32, my input8Encoding);
+		return text32;
 	}
 }
 
-int64_t MelderReadText_getNumberOfLines (MelderReadText me) {
-	int64_t n = 0;
-	if (my stringW != NULL) {
-		wchar_t *p = & my stringW [0];
-		for (; *p != '\0'; p ++) if (*p == '\n') n ++;
-		if (p - my stringW > 1 && p [-1] != '\n') n ++;
+int64 MelderReadText_getNumberOfLines (MelderReadText me) {
+	int64 n = 0;
+	if (my string32) {
+		char32 *p = & my string32 [0];
+		for (; *p != U'\0'; p ++) if (*p == U'\n') n ++;
+		if (p - my string32 > 1 && p [-1] != U'\n') n ++;
 	} else {
 		char *p = & my string8 [0];
 		for (; *p != '\0'; p ++) if (*p == '\n') n ++;
@@ -124,12 +126,12 @@ int64_t MelderReadText_getNumberOfLines (MelderReadText me) {
 	return n;
 }
 
-const wchar_t * MelderReadText_getLineNumber (MelderReadText me) {
-	int64_t result = 1;
-	if (my stringW != NULL) {
-		wchar_t *p = my stringW;
-		while (my readPointerW - p > 0) {
-			if (*p == '\0' || *p == '\n') result ++;
+const char32 * MelderReadText_getLineNumber (MelderReadText me) {
+	int64 result = 1;
+	if (my string32) {
+		char32 *p = my string32;
+		while (my readPointer32 - p > 0) {
+			if (*p == U'\0' || *p == U'\n') result ++;
 			p ++;
 		}
 	} else {
@@ -161,16 +163,16 @@ static size_t fread_multi (char *buffer, size_t numberOfBytes, FILE *f) {
 	return numberOfBytesRead;
 }
 
-static wchar_t * _MelderFile_readText (MelderFile file, char **string8) {
+static char32 * _MelderFile_readText (MelderFile file, char **string8) {
 	try {
 		int type = 0;   // 8-bit
-		autostring text;
+		autostring32 text;
 		autofile f = Melder_fopen (file, "rb");
 		if (fseeko (f, 0, SEEK_END) < 0) {
-			Melder_throw ("Cannot count the bytes in the file.");
+			Melder_throw (U"Cannot count the bytes in the file.");
 		}
 		Melder_assert (sizeof (off_t) >= 8);
-		int64_t length = ftello (f);
+		int64 length = ftello (f);
 		rewind (f);
 		if (length >= 2) {
 			int firstByte = fgetc (f), secondByte = fgetc (f);
@@ -183,116 +185,108 @@ static wchar_t * _MelderFile_readText (MelderFile file, char **string8) {
 		if (type == 0) {
 			rewind (f);   // length and type already set correctly.
 			autostring8 text8bit = Melder_malloc (char, length + 1);
-			Melder_assert (text8bit.peek() != NULL);
+			Melder_assert (text8bit.peek());
 			size_t numberOfBytesRead = fread_multi (text8bit.peek(), (size_t) length, f);
-			if ((int64_t) numberOfBytesRead < length)
-				Melder_throw ("The file contains ", (double) length, " bytes, but we could read only ",
-					(double) numberOfBytesRead, " of them.");
+			if ((int64) numberOfBytesRead < length)
+				Melder_throw (U"The file contains ", length, U" bytes, but we could read only ",
+					numberOfBytesRead, U" of them.");
 			text8bit [length] = '\0';
 			/*
 			 * Count and repair null bytes.
 			 */
 			if (length > 0) {
-				int64_t numberOfNullBytes = 0;
-				for (char *p = & text8bit [length - 1]; (int64_t) (p - text8bit.peek()) >= 0; p --) {
+				int64 numberOfNullBytes = 0;
+				for (char *p = & text8bit [length - 1]; (int64) (p - text8bit.peek()) >= 0; p --) {
 					if (*p == '\0') {
 						numberOfNullBytes += 1;
 						/*
 						 * Shift.
 						 */
-						for (char *q = p; (int64_t) (q - text8bit.peek()) < length; q ++) {
+						for (char *q = p; (int64) (q - text8bit.peek()) < length; q ++) {
 							*q = q [1];
 						}
 					}
 				}
 				if (numberOfNullBytes > 0) {
-					Melder_warning ("Ignored ", numberOfNullBytes, " null bytes in text file ", file, ".");
+					Melder_warning (U"Ignored ", numberOfNullBytes, U" null bytes in text file ", file, U".");
 				}
 			}
-			if (string8 != NULL) {
+			if (string8) {
 				*string8 = text8bit.transfer();
 				(void) Melder_killReturns_inline (*string8);
-				return NULL;   // OK
+				return nullptr;   // OK
 			} else {
-				text.reset (Melder_8bitToWcs (text8bit.peek(), 0));
+				text.reset (Melder_8to32 (text8bit.peek(), 0));
 			}
 		} else {
 			length = length / 2 - 1;   // Byte Order Mark subtracted. Length = number of UTF-16 codes
-			text.reset (Melder_malloc (wchar_t, length + 1));
+			text.reset (Melder_malloc (char32, length + 1));
 			if (type == 1) {
-				for (int64_t i = 0; i < length; i ++) {
-					char16_t kar1 = bingetu2 (f);
-					if (sizeof (wchar_t) == 2) {   // wchar_t is UTF-16 (or its signed counterpart)?
-						text [i] = (wchar_t) kar1;
-					} else {   // wchar_t is UTF-32 (or its signed counterpart)
-						if (kar1 < 0xD800) {
-							text [i] = (wchar_t) kar1;   // convert up without sign extension
-						} else if (kar1 < 0xDC00) {
-							length --;
-							char16_t kar2 = bingetu2 (f);
-							if (kar2 >= 0xDC00 && kar2 <= 0xDFFF) {
-								text [i] = (wchar_t) (0x00010000 +
-									(uint32_t) (((uint32_t) kar1 & 0x000003FF) << 10) +
-									(uint32_t)  ((uint32_t) kar2 & 0x000003FF));
-							} else {
-								text [i] = UNICODE_REPLACEMENT_CHARACTER;
-							}
-						} else if (kar1 < 0xE000) {
-							text [i] = UNICODE_REPLACEMENT_CHARACTER;
+				for (int64 i = 0; i < length; i ++) {
+					char16 kar1 = bingetu2 (f);
+					if (kar1 < 0xD800) {
+						text [i] = (char32) kar1;   // convert up without sign extension
+					} else if (kar1 < 0xDC00) {
+						length --;
+						char16 kar2 = bingetu2 (f);
+						if (kar2 >= 0xDC00 && kar2 <= 0xDFFF) {
+							text [i] = (char32) (0x010000 +
+								(char32) (((char32) kar1 & 0x0003FF) << 10) +
+								(char32)  ((char32) kar2 & 0x0003FF));
 						} else {
-							text [i] = (wchar_t) kar1;   // convert up without sign extension
+							text [i] = UNICODE_REPLACEMENT_CHARACTER;
 						}
+					} else if (kar1 < 0xE000) {
+						text [i] = UNICODE_REPLACEMENT_CHARACTER;
+					} else {
+						text [i] = (char32) kar1;   // convert up without sign extension
 					}
 				}
 			} else {
-				for (int64_t i = 0; i < length; i ++) {
-					char16_t kar1 = bingetu2LE (f);
-					if (sizeof (wchar_t) == 2) {   // wchar_t is UTF-16 (or its signed counterpart)?
-						text [i] = (wchar_t) kar1;
-					} else {   // wchar_t is UTF-32 (or its signed counterpart)
-						if (kar1 < 0xD800) {
-							text [i] = (wchar_t) kar1;   // convert up without sign extension
-						} else if (kar1 < 0xDC00) {
-							length --;
-							char16_t kar2 = bingetu2LE (f);
-							if (kar2 >= 0xDC00 && kar2 <= 0xDFFF) {
-								text [i] = (wchar_t) (0x00010000 +
-									(uint32_t) (((uint32_t) kar1 & 0x000003FF) << 10) +
-									(uint32_t)  ((uint32_t) kar2 & 0x000003FF));
-							} else {
-								text [i] = UNICODE_REPLACEMENT_CHARACTER;
-							}
-						} else if (kar1 < 0xE000) {
-							text [i] = UNICODE_REPLACEMENT_CHARACTER;
-						} else if (kar1 <= 0xFFFF) {
-							text [i] = (wchar_t) kar1;   // convert up without sign extension
+				for (int64 i = 0; i < length; i ++) {
+					char16 kar1 = bingetu2LE (f);
+					if (kar1 < 0xD800) {
+						text [i] = (char32) kar1;   // convert up without sign extension
+					} else if (kar1 < 0xDC00) {
+						length --;
+						char16 kar2 = bingetu2LE (f);
+						if (kar2 >= 0xDC00 && kar2 <= 0xDFFF) {
+							text [i] = (char32) (0x010000 +
+								(char32) (((char32) kar1 & 0x0003FF) << 10) +
+								(char32)  ((char32) kar2 & 0x0003FF));
 						} else {
-							Melder_fatal ("MelderFile_readText: unsigned short greater than 0xFFFF: should not occur.");
+							text [i] = UNICODE_REPLACEMENT_CHARACTER;
 						}
+					} else if (kar1 < 0xE000) {
+						text [i] = UNICODE_REPLACEMENT_CHARACTER;
+					} else if (kar1 <= 0xFFFF) {
+						text [i] = (char32) kar1;   // convert up without sign extension
+					} else {
+						Melder_fatal (U"MelderFile_readText: unsigned short greater than 0xFFFF: should not occur.");
 					}
 				}
 			}
 			text [length] = '\0';
-			(void) Melder_killReturns_inlineW (text.peek());
+			(void) Melder_killReturns_inline (text.peek());
 		}
 		f.close (file);
 		return text.transfer();
 	} catch (MelderError) {
-		Melder_throw ("Error reading file ", file, ".");
+		Melder_throw (U"Error reading file ", file, U".");
 	}
 }
 
-wchar_t * MelderFile_readText (MelderFile file) {
-	return _MelderFile_readText (file, NULL);
+char32 * MelderFile_readText (MelderFile file) {
+	return _MelderFile_readText (file, nullptr);
 }
 
 MelderReadText MelderReadText_createFromFile (MelderFile file) {
 	autoMelderReadText me = Melder_calloc (struct structMelderReadText, 1);
-	my stringW = _MelderFile_readText (file, & my string8);
-	if (my stringW != NULL) {
-		my readPointerW = & my stringW [0];
+	my string32 = _MelderFile_readText (file, & my string8);
+	if (my string32) {
+		my readPointer32 = & my string32 [0];
 	} else {
-		Melder_assert (my string8 != NULL);
+		Melder_assert (my string8);
 		my readPointer8 = & my string8 [0];
 		my input8Encoding = Melder_getInputEncoding ();
 		if (my input8Encoding == kMelder_textInputEncoding_UTF8 ||
@@ -300,10 +294,10 @@ MelderReadText MelderReadText_createFromFile (MelderFile file) {
 			my input8Encoding == kMelder_textInputEncoding_UTF8_THEN_WINDOWS_LATIN1 ||
 			my input8Encoding == kMelder_textInputEncoding_UTF8_THEN_MACROMAN)
 		{
-			if (Melder_strIsValidUtf8 (my string8)) {
+			if (Melder_str8IsValidUtf8 (my string8)) {
 				my input8Encoding = kMelder_textInputEncoding_UTF8;
 			} else if (my input8Encoding == kMelder_textInputEncoding_UTF8) {
-				Melder_throw ("Text is not valid UTF-8; please try a different text input encoding.");
+				Melder_throw (U"Text is not valid UTF-8; please try a different text input encoding.");
 			} else if (my input8Encoding == kMelder_textInputEncoding_UTF8_THEN_ISO_LATIN1) {
 				my input8Encoding = kMelder_textInputEncoding_ISO_LATIN1;
 			} else if (my input8Encoding == kMelder_textInputEncoding_UTF8_THEN_WINDOWS_LATIN1) {
@@ -316,11 +310,11 @@ MelderReadText MelderReadText_createFromFile (MelderFile file) {
 	return me.transfer();
 }
 
-MelderReadText MelderReadText_createFromString (const wchar_t *string);
+MelderReadText MelderReadText_createFromString (const char32 *string);
 
 void MelderReadText_delete (MelderReadText me) {
-	if (me == NULL) return;
-	Melder_free (my stringW);
+	if (! me) return;
+	Melder_free (my string32);
 	Melder_free (my string8);
 	Melder_free (me);
 }
diff --git a/sys/melder_strings.cpp b/sys/melder_strings.cpp
index 5b38a98..108af95 100644
--- a/sys/melder_strings.cpp
+++ b/sys/melder_strings.cpp
@@ -22,28 +22,52 @@
 #define my  me ->
 #define FREE_THRESHOLD_BYTES 10000LL
 
-static double totalNumberOfAllocations = 0, totalNumberOfDeallocations = 0, totalAllocationSize = 0, totalDeallocationSize = 0;
+static int64 totalNumberOfAllocations = 0, totalNumberOfDeallocations = 0, totalAllocationSize = 0, totalDeallocationSize = 0;
 
-void MelderString_free (MelderString *me) {
-	if (my string == NULL) return;
+void MelderString16_free (MelderString16 *me) {
+	if (! my string) return;
 	Melder_free (my string);
-	if (Melder_debug == 34) fprintf (stderr, "from MelderString_free\t%p\t%lld\t%d\n", my string, (long long) my bufferSize, (int) sizeof (wchar_t));
+	if (Melder_debug == 34) fprintf (stderr, "from MelderString16_free\t%p\t%lld\t%d\n", my string, (long long) my bufferSize, 2);
 	totalNumberOfDeallocations += 1;
-	totalDeallocationSize += my bufferSize * (int64_t) sizeof (wchar_t);
+	totalDeallocationSize += my bufferSize * (int64) sizeof (char16_t);
 	my bufferSize = 0;
 	my length = 0;
 }
 
-void MelderString16_free (MelderString16 *me) {
-	if (my string == NULL) return;
+void MelderString_free (MelderString *me) {
+	if (! my string) return;
 	Melder_free (my string);
-	if (Melder_debug == 34) fprintf (stderr, "from MelderString16_free\t%p\t%lld\t%d\n", my string, (long long) my bufferSize, 2);
+	if (Melder_debug == 34) fprintf (stderr, "from MelderString32_free\t%p\t%lld\t%d\n", my string, (long long) my bufferSize, 2);
 	totalNumberOfDeallocations += 1;
-	totalDeallocationSize += my bufferSize * (int64_t) sizeof (char16_t);
+	totalDeallocationSize += my bufferSize * (int64) sizeof (char32);
 	my bufferSize = 0;
 	my length = 0;
 }
 
+void MelderString_expand (MelderString *me, int64 sizeNeeded) {
+	Melder_assert (my bufferSize >= 0);
+	Melder_assert (sizeNeeded >= 0);
+	sizeNeeded = (int64) (1.618034 * sizeNeeded) + 100;
+	Melder_assert (sizeNeeded > 0);
+	if (my string) {
+		totalNumberOfDeallocations += 1;
+		totalDeallocationSize += my bufferSize * (int64) sizeof (char32);
+	}
+	int64 bytesNeeded = sizeNeeded * (int64) sizeof (char32);
+	Melder_assert (bytesNeeded > 0);
+	try {
+		if (Melder_debug == 34) fprintf (stderr, "from MelderString:expandIfNecessary\t%p\t%lld\t%d\n", my string, (long long) sizeNeeded, (int) sizeof (char32));
+		my string = (char32 *) Melder_realloc (my string, bytesNeeded);
+	} catch (MelderError) {
+		my bufferSize = 0;
+		my length = 0;
+		throw;
+	}
+	totalNumberOfAllocations += 1;
+	totalAllocationSize += bytesNeeded;
+	my bufferSize = sizeNeeded;
+}
+
 #define expandIfNecessary(type) \
 	if (sizeNeeded > my bufferSize) { \
 		Melder_assert (my bufferSize >= 0); \
@@ -69,408 +93,1046 @@ void MelderString16_free (MelderString16 *me) {
 		my bufferSize = sizeNeeded; \
 	}
 
-void MelderString_empty (MelderString *me) {
-	if (my bufferSize * (int64) sizeof (wchar) >= FREE_THRESHOLD_BYTES) {
-		MelderString_free (me);
+void MelderString16_empty (MelderString16 *me) {
+	if (my bufferSize * (int64) sizeof (char16) >= FREE_THRESHOLD_BYTES) {
+		MelderString16_free (me);
 	}
 	int64 sizeNeeded = 1;
-	expandIfNecessary (wchar)
+	expandIfNecessary (char16)
 	my string [0] = '\0';
 	my length = 0;
 }
 
-void MelderString16_empty (MelderString16 *me) {
-	if (my bufferSize * (int64) sizeof (wchar) >= FREE_THRESHOLD_BYTES) {
-		MelderString16_free (me);
+void MelderString_empty (MelderString *me) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) {
+		MelderString_free (me);
 	}
-	int64_t sizeNeeded = 1;
-	expandIfNecessary (char16)
+	int64 sizeNeeded = 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
 	my string [0] = '\0';
 	my length = 0;
 }
 
-void MelderString_copy (MelderString *me, const wchar_t *source) {
-	if (my bufferSize * (int64) sizeof (wchar) >= FREE_THRESHOLD_BYTES)
-		MelderString_free (me);
-	if (source == NULL) source = L"";
-	int64 length = (int64) wcslen (source);
-	int64 sizeNeeded = length + 1;
-	expandIfNecessary (wchar)
-	wcscpy (my string, source);
-	my length = length;
+void MelderString_copy (MelderString *me, Melder_1_ARG) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	int64 sizeNeeded = length1 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+}
+void MelderString_copy (MelderString *me, Melder_2_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	int64 sizeNeeded = length1 + length2 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+}
+void MelderString_copy (MelderString *me, Melder_3_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	int64 sizeNeeded = length1 + length2 + length3 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+}
+void MelderString_copy (MelderString *me, Melder_4_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+}
+void MelderString_copy (MelderString *me, Melder_5_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + length5 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+}
+void MelderString_copy (MelderString *me, Melder_6_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + length5 + length6 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+}
+void MelderString_copy (MelderString *me, Melder_7_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + length5 + length6 + length7 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+}
+void MelderString_copy (MelderString *me, Melder_8_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+}
+void MelderString_copy (MelderString *me, Melder_9_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+}
+void MelderString_copy (MelderString *me, Melder_10_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+	str32cpy (my string + my length, s10);  my length += length10;
+}
+void MelderString_copy (MelderString *me, Melder_11_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+	str32cpy (my string + my length, s10);  my length += length10;
+	str32cpy (my string + my length, s11);  my length += length11;
+}
+void MelderString_copy (MelderString *me, Melder_13_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";  int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";  int64 length13 = str32len (s13);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + length12 + length13 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+	str32cpy (my string + my length, s10);  my length += length10;
+	str32cpy (my string + my length, s11);  my length += length11;
+	str32cpy (my string + my length, s12);  my length += length12;
+	str32cpy (my string + my length, s13);  my length += length13;
+}
+void MelderString_copy (MelderString *me, Melder_15_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";  int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";  int64 length13 = str32len (s13);
+	const char32 *s14 = arg14._arg ? arg14._arg : U"";  int64 length14 = str32len (s14);
+	const char32 *s15 = arg15._arg ? arg15._arg : U"";  int64 length15 = str32len (s15);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + length12 + length13 + length14 + length15 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+	str32cpy (my string + my length, s10);  my length += length10;
+	str32cpy (my string + my length, s11);  my length += length11;
+	str32cpy (my string + my length, s12);  my length += length12;
+	str32cpy (my string + my length, s13);  my length += length13;
+	str32cpy (my string + my length, s14);  my length += length14;
+	str32cpy (my string + my length, s15);  my length += length15;
+}
+void MelderString_copy (MelderString *me, Melder_19_ARGS) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES) MelderString_free (me);
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";  int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";  int64 length13 = str32len (s13);
+	const char32 *s14 = arg14._arg ? arg14._arg : U"";  int64 length14 = str32len (s14);
+	const char32 *s15 = arg15._arg ? arg15._arg : U"";  int64 length15 = str32len (s15);
+	const char32 *s16 = arg16._arg ? arg16._arg : U"";  int64 length16 = str32len (s16);
+	const char32 *s17 = arg17._arg ? arg17._arg : U"";  int64 length17 = str32len (s17);
+	const char32 *s18 = arg18._arg ? arg18._arg : U"";  int64 length18 = str32len (s18);
+	const char32 *s19 = arg19._arg ? arg19._arg : U"";  int64 length19 = str32len (s19);
+	int64 sizeNeeded = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + length12 + length13 + length14 + length15 + length16 + length17 + length18 + length19 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string, s1);  my length = length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+	str32cpy (my string + my length, s10);  my length += length10;
+	str32cpy (my string + my length, s11);  my length += length11;
+	str32cpy (my string + my length, s12);  my length += length12;
+	str32cpy (my string + my length, s13);  my length += length13;
+	str32cpy (my string + my length, s14);  my length += length14;
+	str32cpy (my string + my length, s15);  my length += length15;
+	str32cpy (my string + my length, s16);  my length += length16;
+	str32cpy (my string + my length, s17);  my length += length17;
+	str32cpy (my string + my length, s18);  my length += length18;
+	str32cpy (my string + my length, s19);  my length += length19;
 }
 
-void MelderString_ncopy (MelderString *me, const wchar_t *source, int64 n) {
-	if (my bufferSize * (int64) sizeof (wchar_t) >= FREE_THRESHOLD_BYTES)
+void MelderString_ncopy (MelderString *me, const char32 *source, int64 n) {
+	if (my bufferSize * (int64) sizeof (char32) >= FREE_THRESHOLD_BYTES)
 		MelderString_free (me);
-	if (source == NULL) source = L"";
-	int64 length = (int64) wcslen (source);
+	if (! source) source = U"";
+	int64 length = str32len (source);
 	if (length > n) length = n;
 	int64 sizeNeeded = length + 1;
-	expandIfNecessary (wchar)
-	wcsncpy (my string, source, (size_t) length);
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32ncpy (my string, source, length);
 	my string [length] = '\0';
 	my length = length;
 }
 
-void MelderString_append (MelderString *me, const wchar_t *s1) {
-	if (s1 == NULL) s1 = L"";
-	int64 length1 = (int64) wcslen (s1);
+/*void MelderString_append (MelderString *me, Melder_1_ARG) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = _str32len (s1);
 	int64 sizeNeeded = my length + length1 + 1;
-	expandIfNecessary (wchar)
-	wcscpy (my string + my length, s1);
-	my length += length1;
-}
-
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2) {
-	if (s1 == NULL) s1 = L"";
-	if (s2 == NULL) s2 = L"";
-	int64 length1 = (int64) wcslen (s1);
-	int64 length2 = (int64) wcslen (s2);
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	_str32cpy (my string + my length, s1);   my length += length1;
+}*/
+void MelderString_append (MelderString *me, Melder_2_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
 	int64 sizeNeeded = my length + length1 + length2 + 1;
-	expandIfNecessary (wchar)
-	wcscpy (my string + my length, s1);
-	my length += length1;
-	wcscpy (my string + my length, s2);
-	my length += length2;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
 }
-
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3) {
-	if (s1 == NULL) s1 = L"";
-	if (s2 == NULL) s2 = L"";
-	if (s3 == NULL) s3 = L"";
-	int64 length1 = (int64) wcslen (s1);
-	int64 length2 = (int64) wcslen (s2);
-	int64 length3 = (int64) wcslen (s3);
+void MelderString_append (MelderString *me, Melder_3_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
 	int64 sizeNeeded = my length + length1 + length2 + length3 + 1;
-	expandIfNecessary (wchar)
-	wcscpy (my string + my length, s1);
-	my length += length1;
-	wcscpy (my string + my length, s2);
-	my length += length2;
-	wcscpy (my string + my length, s3);
-	my length += length3;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
 }
-
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4) {
-	if (s1 == NULL) s1 = L"";
-	if (s2 == NULL) s2 = L"";
-	if (s3 == NULL) s3 = L"";
-	if (s4 == NULL) s4 = L"";
-	int64 length1 = (int64) wcslen (s1);
-	int64 length2 = (int64) wcslen (s2);
-	int64 length3 = (int64) wcslen (s3);
-	int64 length4 = (int64) wcslen (s4);
+void MelderString_append (MelderString *me, Melder_4_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
 	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + 1;
-	expandIfNecessary (wchar)
-	wcscpy (my string + my length, s1);
-	my length += length1;
-	wcscpy (my string + my length, s2);
-	my length += length2;
-	wcscpy (my string + my length, s3);
-	my length += length3;
-	wcscpy (my string + my length, s4);
-	my length += length4;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
 }
-
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5)
-{
-	if (s1 == NULL) s1 = L"";
-	if (s2 == NULL) s2 = L"";
-	if (s3 == NULL) s3 = L"";
-	if (s4 == NULL) s4 = L"";
-	if (s5 == NULL) s5 = L"";
-	int64 length1 = (int64) wcslen (s1);
-	int64 length2 = (int64) wcslen (s2);
-	int64 length3 = (int64) wcslen (s3);
-	int64 length4 = (int64) wcslen (s4);
-	int64 length5 = (int64) wcslen (s5);
+void MelderString_append (MelderString *me, Melder_5_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
 	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + 1;
-	expandIfNecessary (wchar)
-	wcscpy (my string + my length, s1);
-	my length += length1;
-	wcscpy (my string + my length, s2);
-	my length += length2;
-	wcscpy (my string + my length, s3);
-	my length += length3;
-	wcscpy (my string + my length, s4);
-	my length += length4;
-	wcscpy (my string + my length, s5);
-	my length += length5;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
 }
-
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6)
-{
-	if (s1 == NULL) s1 = L"";
-	if (s2 == NULL) s2 = L"";
-	if (s3 == NULL) s3 = L"";
-	if (s4 == NULL) s4 = L"";
-	if (s5 == NULL) s5 = L"";
-	if (s6 == NULL) s6 = L"";
-	int64 length1 = (int64) wcslen (s1);
-	int64 length2 = (int64) wcslen (s2);
-	int64 length3 = (int64) wcslen (s3);
-	int64 length4 = (int64) wcslen (s4);
-	int64 length5 = (int64) wcslen (s5);
-	int64 length6 = (int64) wcslen (s6);
+void MelderString_append (MelderString *me, Melder_6_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
 	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + length6 + 1;
-	expandIfNecessary (wchar)
-	wcscpy (my string + my length, s1);
-	my length += length1;
-	wcscpy (my string + my length, s2);
-	my length += length2;
-	wcscpy (my string + my length, s3);
-	my length += length3;
-	wcscpy (my string + my length, s4);
-	my length += length4;
-	wcscpy (my string + my length, s5);
-	my length += length5;
-	wcscpy (my string + my length, s6);
-	my length += length6;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
 }
-
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6, const wchar_t *s7)
-{
-	if (s1 == NULL) s1 = L"";
-	if (s2 == NULL) s2 = L"";
-	if (s3 == NULL) s3 = L"";
-	if (s4 == NULL) s4 = L"";
-	if (s5 == NULL) s5 = L"";
-	if (s6 == NULL) s6 = L"";
-	if (s7 == NULL) s7 = L"";
-	int64 length1 = (int64) wcslen (s1);
-	int64 length2 = (int64) wcslen (s2);
-	int64 length3 = (int64) wcslen (s3);
-	int64 length4 = (int64) wcslen (s4);
-	int64 length5 = (int64) wcslen (s5);
-	int64 length6 = (int64) wcslen (s6);
-	int64 length7 = (int64) wcslen (s7);
+void MelderString_append (MelderString *me, Melder_7_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
 	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + length6 + length7 + 1;
-	expandIfNecessary (wchar)
-	wcscpy (my string + my length, s1);
-	my length += length1;
-	wcscpy (my string + my length, s2);
-	my length += length2;
-	wcscpy (my string + my length, s3);
-	my length += length3;
-	wcscpy (my string + my length, s4);
-	my length += length4;
-	wcscpy (my string + my length, s5);
-	my length += length5;
-	wcscpy (my string + my length, s6);
-	my length += length6;
-	wcscpy (my string + my length, s7);
-	my length += length7;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
 }
-
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8)
-{
-	if (s1 == NULL) s1 = L"";
-	if (s2 == NULL) s2 = L"";
-	if (s3 == NULL) s3 = L"";
-	if (s4 == NULL) s4 = L"";
-	if (s5 == NULL) s5 = L"";
-	if (s6 == NULL) s6 = L"";
-	if (s7 == NULL) s7 = L"";
-	if (s8 == NULL) s8 = L"";
-	int64 length1 = (int64) wcslen (s1);
-	int64 length2 = (int64) wcslen (s2);
-	int64 length3 = (int64) wcslen (s3);
-	int64 length4 = (int64) wcslen (s4);
-	int64 length5 = (int64) wcslen (s5);
-	int64 length6 = (int64) wcslen (s6);
-	int64 length7 = (int64) wcslen (s7);
-	int64 length8 = (int64) wcslen (s8);
+void MelderString_append (MelderString *me, Melder_8_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
 	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + 1;
-	expandIfNecessary (wchar)
-	wcscpy (my string + my length, s1);
-	my length += length1;
-	wcscpy (my string + my length, s2);
-	my length += length2;
-	wcscpy (my string + my length, s3);
-	my length += length3;
-	wcscpy (my string + my length, s4);
-	my length += length4;
-	wcscpy (my string + my length, s5);
-	my length += length5;
-	wcscpy (my string + my length, s6);
-	my length += length6;
-	wcscpy (my string + my length, s7);
-	my length += length7;
-	wcscpy (my string + my length, s8);
-	my length += length8;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
 }
-
-void MelderString_append (MelderString *me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9)
-{
-	if (s1 == NULL) s1 = L"";
-	if (s2 == NULL) s2 = L"";
-	if (s3 == NULL) s3 = L"";
-	if (s4 == NULL) s4 = L"";
-	if (s5 == NULL) s5 = L"";
-	if (s6 == NULL) s6 = L"";
-	if (s7 == NULL) s7 = L"";
-	if (s8 == NULL) s8 = L"";
-	if (s9 == NULL) s9 = L"";
-	int64 length1 = (int64) wcslen (s1);
-	int64 length2 = (int64) wcslen (s2);
-	int64 length3 = (int64) wcslen (s3);
-	int64 length4 = (int64) wcslen (s4);
-	int64 length5 = (int64) wcslen (s5);
-	int64 length6 = (int64) wcslen (s6);
-	int64 length7 = (int64) wcslen (s7);
-	int64 length8 = (int64) wcslen (s8);
-	int64 length9 = (int64) wcslen (s9);
-	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9 + 1;
-	expandIfNecessary (wchar)
-	wcscpy (my string + my length, s1);
-	my length += length1;
-	wcscpy (my string + my length, s2);
-	my length += length2;
-	wcscpy (my string + my length, s3);
-	my length += length3;
-	wcscpy (my string + my length, s4);
-	my length += length4;
-	wcscpy (my string + my length, s5);
-	my length += length5;
-	wcscpy (my string + my length, s6);
-	my length += length6;
-	wcscpy (my string + my length, s7);
-	my length += length7;
-	wcscpy (my string + my length, s8);
-	my length += length8;
-	wcscpy (my string + my length, s9);
-	my length += length9;
+void MelderString_append (MelderString *me, Melder_9_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
 }
-
-void MelderString_appendCharacter (MelderString *me, wchar_t character) {
-	int64 sizeNeeded = my length + 2;   // make room for character and null byte
-	expandIfNecessary (wchar)
-	my string [my length] = character;
-	my length ++;
-	my string [my length] = L'\0';
+void MelderString_append (MelderString *me, Melder_10_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+	str32cpy (my string + my length, s10);  my length += length10;
+}
+void MelderString_append (MelderString *me, Melder_11_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+	str32cpy (my string + my length, s10);  my length += length10;
+	str32cpy (my string + my length, s11);  my length += length11;
+}
+void MelderString_append (MelderString *me, Melder_13_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";  int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";  int64 length13 = str32len (s13);
+	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + length12 + length13 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+	str32cpy (my string + my length, s10);  my length += length10;
+	str32cpy (my string + my length, s11);  my length += length11;
+	str32cpy (my string + my length, s12);  my length += length12;
+	str32cpy (my string + my length, s13);  my length += length13;
+}
+void MelderString_append (MelderString *me, Melder_15_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";  int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";  int64 length13 = str32len (s13);
+	const char32 *s14 = arg14._arg ? arg14._arg : U"";  int64 length14 = str32len (s14);
+	const char32 *s15 = arg15._arg ? arg15._arg : U"";  int64 length15 = str32len (s15);
+	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + length12 + length13 + length14 + length15 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+	str32cpy (my string + my length, s10);  my length += length10;
+	str32cpy (my string + my length, s11);  my length += length11;
+	str32cpy (my string + my length, s12);  my length += length12;
+	str32cpy (my string + my length, s13);  my length += length13;
+	str32cpy (my string + my length, s14);  my length += length14;
+	str32cpy (my string + my length, s15);  my length += length15;
+}
+void MelderString_append (MelderString *me, Melder_19_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";  int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";  int64 length13 = str32len (s13);
+	const char32 *s14 = arg14._arg ? arg14._arg : U"";  int64 length14 = str32len (s14);
+	const char32 *s15 = arg15._arg ? arg15._arg : U"";  int64 length15 = str32len (s15);
+	const char32 *s16 = arg16._arg ? arg16._arg : U"";  int64 length16 = str32len (s16);
+	const char32 *s17 = arg17._arg ? arg17._arg : U"";  int64 length17 = str32len (s17);
+	const char32 *s18 = arg18._arg ? arg18._arg : U"";  int64 length18 = str32len (s18);
+	const char32 *s19 = arg19._arg ? arg19._arg : U"";  int64 length19 = str32len (s19);
+	int64 sizeNeeded = my length + length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + length12 + length13 + length14 + length15 + length16 + length17 + length18 + length19 + 1;
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
+	str32cpy (my string + my length, s1);   my length += length1;
+	str32cpy (my string + my length, s2);   my length += length2;
+	str32cpy (my string + my length, s3);   my length += length3;
+	str32cpy (my string + my length, s4);   my length += length4;
+	str32cpy (my string + my length, s5);   my length += length5;
+	str32cpy (my string + my length, s6);   my length += length6;
+	str32cpy (my string + my length, s7);   my length += length7;
+	str32cpy (my string + my length, s8);   my length += length8;
+	str32cpy (my string + my length, s9);   my length += length9;
+	str32cpy (my string + my length, s10);  my length += length10;
+	str32cpy (my string + my length, s11);  my length += length11;
+	str32cpy (my string + my length, s12);  my length += length12;
+	str32cpy (my string + my length, s13);  my length += length13;
+	str32cpy (my string + my length, s14);  my length += length14;
+	str32cpy (my string + my length, s15);  my length += length15;
+	str32cpy (my string + my length, s16);  my length += length16;
+	str32cpy (my string + my length, s17);  my length += length17;
+	str32cpy (my string + my length, s18);  my length += length18;
+	str32cpy (my string + my length, s19);  my length += length19;
 }
 
-void MelderString16_appendCharacter (MelderString16 *me, wchar_t character) {
-	int64 sizeNeeded = my length + 3;   // make room for character, potential surrogate character, and null byte
+void MelderString16_appendCharacter (MelderString16 *me, char32 kar) {
+	int64 sizeNeeded = my length + 3;   // make room for character, potential surrogate character, and null character
 	expandIfNecessary (char16)
-	if (sizeof (wchar_t) == 2) {   // wchar_t is UTF-16?
-		my string [my length] = (char16) character;   // guarded cast
+	if (kar <= 0x00FFFF) {
+		my string [my length] = (char16) kar;   // guarded cast
+		my length ++;
+	} else if (kar <= 0x10FFFF) {
+		kar -= 0x010000;
+		my string [my length] = (char16) (0x00D800 | (kar >> 10));
+		my length ++;
+		my string [my length] = (char16) (0x00DC00 | (kar & 0x0003FF));
+		my length ++;
+	} else {
+		my string [my length] = UNICODE_REPLACEMENT_CHARACTER;
 		my length ++;
-	} else {   // wchar_t is UTF-32.
-		char32 kar = (char32) character;
-		if (kar <= 0x00FFFF) {
-			my string [my length] = (char16) character;   // guarded cast
-			my length ++;
-		} else if (kar <= 0x10FFFF) {
-			kar -= 0x010000;
-			my string [my length] = (char16) (0x00D800 | (kar >> 10));
-			my length ++;
-			my string [my length] = (char16) (0x00DC00 | (kar & 0x0003FF));
-			my length ++;
-		} else {
-			my string [my length] = UNICODE_REPLACEMENT_CHARACTER;
-			my length ++;
-		}
 	}
 	my string [my length] = '\0';
 }
 
-void MelderString32_appendCharacter (MelderString32 *me, char32 character) {
-	int64 sizeNeeded = my length + 2;   // make room for character and null byte
-	expandIfNecessary (char32)
+void MelderString_appendCharacter (MelderString *me, char32 character) {
+	int64 sizeNeeded = my length + 2;   // make room for character and null character
+	if (sizeNeeded > my bufferSize) MelderString_expand (me, sizeNeeded);
 	my string [my length] = character;
 	my length ++;
 	my string [my length] = U'\0';
 }
 
-void MelderString_get (MelderString *me, wchar_t *destination) {
+void MelderString_get (MelderString *me, char32 *destination) {
 	if (my string) {
-		wcscpy (destination, my string);
+		str32cpy (destination, my string);
 	} else {
-		destination [0] = L'\0';
+		destination [0] = U'\0';
 	}
 }
 
-double MelderString_allocationCount (void) {
+int64 MelderString_allocationCount () {
 	return totalNumberOfAllocations;
 }
 
-double MelderString_deallocationCount (void) {
+int64 MelderString_deallocationCount () {
 	return totalNumberOfDeallocations;
 }
 
-double MelderString_allocationSize (void) {
+int64 MelderString_allocationSize () {
 	return totalAllocationSize;
 }
 
-double MelderString_deallocationSize (void) {
+int64 MelderString_deallocationSize () {
 	return totalDeallocationSize;
 }
 
-#define NUMBER_OF_BUFFERS  33
-static MelderString buffer [NUMBER_OF_BUFFERS] = { { 0 } };
-static int ibuffer = 0;
+#define NUMBER_OF_CAT_BUFFERS  33
+static MelderString theCatBuffers [NUMBER_OF_CAT_BUFFERS] = { { 0 } };
+static int iCatBuffer = 0;
 
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2) {
-	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	MelderString_empty (& buffer [ibuffer]);
-	MelderString_append (& buffer [ibuffer], s1, s2);
-	return buffer [ibuffer].string;
+const char32 * Melder_cat (Melder_2_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_2_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
 }
-
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3) {
-	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	MelderString_empty (& buffer [ibuffer]);
-	MelderString_append (& buffer [ibuffer], s1, s2, s3);
-	return buffer [ibuffer].string;
+const char32 * Melder_cat (Melder_3_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_3_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
 }
-
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4) {
-	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	MelderString_empty (& buffer [ibuffer]);
-	MelderString_append (& buffer [ibuffer], s1, s2, s3, s4);
-	return buffer [ibuffer].string;
+const char32 * Melder_cat (Melder_4_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_4_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
 }
-
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5) {
-	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	MelderString_empty (& buffer [ibuffer]);
-	MelderString_append (& buffer [ibuffer], s1, s2, s3, s4, s5);
-	return buffer [ibuffer].string;
+const char32 * Melder_cat (Melder_5_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_5_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
 }
-
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
-	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	MelderString_empty (& buffer [ibuffer]);
-	MelderString_append (& buffer [ibuffer], s1, s2, s3, s4, s5, s6);
-	return buffer [ibuffer].string;
+const char32 * Melder_cat (Melder_6_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_6_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
 }
-
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7) {
-	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	MelderString_empty (& buffer [ibuffer]);
-	MelderString_append (& buffer [ibuffer], s1, s2, s3, s4, s5, s6, s7);
-	return buffer [ibuffer].string;
+const char32 * Melder_cat (Melder_7_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_7_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
 }
-
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8) {
-	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	MelderString_empty (& buffer [ibuffer]);
-	MelderString_append (& buffer [ibuffer], s1, s2, s3, s4, s5, s6, s7, s8);
-	return buffer [ibuffer].string;
+const char32 * Melder_cat (Melder_8_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_8_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
+}
+const char32 * Melder_cat (Melder_9_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_9_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
+}
+const char32 * Melder_cat (Melder_10_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_10_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
+}
+const char32 * Melder_cat (Melder_11_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_11_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
+}
+const char32 * Melder_cat (Melder_13_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_13_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
+}
+const char32 * Melder_cat (Melder_15_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_15_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
+}
+const char32 * Melder_cat (Melder_19_ARGS) {
+	if (++ iCatBuffer == NUMBER_OF_CAT_BUFFERS) iCatBuffer = 0;
+	MelderString_copy (& theCatBuffers [iCatBuffer], Melder_19_ARGS_CALL);
+	return theCatBuffers [iCatBuffer].string;
 }
 
-const wchar_t * Melder_wcscat (const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9) {
-	if (++ ibuffer == NUMBER_OF_BUFFERS) ibuffer = 0;
-	MelderString_empty (& buffer [ibuffer]);
-	MelderString_append (& buffer [ibuffer], s1, s2, s3, s4, s5, s6, s7, s8, s9);
-	return buffer [ibuffer].string;
+#define Melder_sprint_HANDLE_OVERFLOW  \
+	if (totalLength >= bufferSize) { \
+		for (int64 i = 0; i < bufferSize; i ++) \
+			buffer [i] = U'?'; \
+		if (bufferSize > 0) buffer [bufferSize - 1] = U'\0'; \
+		return; \
+	}
+
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_1_ARG) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";
+	int64 totalLength = str32len (s1);
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_2_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";
+	int64 totalLength = length1 + str32len (s2);
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);
+	str32cpy (buffer + length1, s2);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_3_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	int64 totalLength = length1 + length2 + length3;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_4_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	int64 totalLength = length1 + length2 + length3 + length4;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_5_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	int64 totalLength = length1 + length2 + length3 + length4 + length5;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);   length += length4;
+	str32cpy (buffer + length, s5);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_6_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	int64 totalLength = length1 + length2 + length3 + length4 + length5 + length6;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);   length += length4;
+	str32cpy (buffer + length, s5);   length += length5;
+	str32cpy (buffer + length, s6);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_7_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	int64 totalLength = length1 + length2 + length3 + length4 + length5 + length6 + length7;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);   length += length4;
+	str32cpy (buffer + length, s5);   length += length5;
+	str32cpy (buffer + length, s6);   length += length6;
+	str32cpy (buffer + length, s7);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_8_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	int64 totalLength = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);   length += length4;
+	str32cpy (buffer + length, s5);   length += length5;
+	str32cpy (buffer + length, s6);   length += length6;
+	str32cpy (buffer + length, s7);   length += length7;
+	str32cpy (buffer + length, s8);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_9_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	int64 totalLength = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);   length += length4;
+	str32cpy (buffer + length, s5);   length += length5;
+	str32cpy (buffer + length, s6);   length += length6;
+	str32cpy (buffer + length, s7);   length += length7;
+	str32cpy (buffer + length, s8);   length += length8;
+	str32cpy (buffer + length, s9);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_10_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	int64 totalLength = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);   length += length4;
+	str32cpy (buffer + length, s5);   length += length5;
+	str32cpy (buffer + length, s6);   length += length6;
+	str32cpy (buffer + length, s7);   length += length7;
+	str32cpy (buffer + length, s8);   length += length8;
+	str32cpy (buffer + length, s9);   length += length9;
+	str32cpy (buffer + length, s10);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_11_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	int64 totalLength = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);   length += length4;
+	str32cpy (buffer + length, s5);   length += length5;
+	str32cpy (buffer + length, s6);   length += length6;
+	str32cpy (buffer + length, s7);   length += length7;
+	str32cpy (buffer + length, s8);   length += length8;
+	str32cpy (buffer + length, s9);   length += length9;
+	str32cpy (buffer + length, s10);  length += length10;
+	str32cpy (buffer + length, s11);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_13_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";  int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";  int64 length13 = str32len (s13);
+	int64 totalLength = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + length12 + length13;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);   length += length4;
+	str32cpy (buffer + length, s5);   length += length5;
+	str32cpy (buffer + length, s6);   length += length6;
+	str32cpy (buffer + length, s7);   length += length7;
+	str32cpy (buffer + length, s8);   length += length8;
+	str32cpy (buffer + length, s9);   length += length9;
+	str32cpy (buffer + length, s10);  length += length10;
+	str32cpy (buffer + length, s11);  length += length11;
+	str32cpy (buffer + length, s12);  length += length12;
+	str32cpy (buffer + length, s13);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_15_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";  int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";  int64 length13 = str32len (s13);
+	const char32 *s14 = arg14._arg ? arg14._arg : U"";  int64 length14 = str32len (s14);
+	const char32 *s15 = arg15._arg ? arg15._arg : U"";  int64 length15 = str32len (s15);
+	int64 totalLength = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + length12 + length13 + length14 + length15;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);   length += length4;
+	str32cpy (buffer + length, s5);   length += length5;
+	str32cpy (buffer + length, s6);   length += length6;
+	str32cpy (buffer + length, s7);   length += length7;
+	str32cpy (buffer + length, s8);   length += length8;
+	str32cpy (buffer + length, s9);   length += length9;
+	str32cpy (buffer + length, s10);  length += length10;
+	str32cpy (buffer + length, s11);  length += length11;
+	str32cpy (buffer + length, s12);  length += length12;
+	str32cpy (buffer + length, s13);  length += length13;
+	str32cpy (buffer + length, s14);  length += length14;
+	str32cpy (buffer + length, s15);
+}
+void Melder_sprint (char32 *buffer, int64 bufferSize, Melder_19_ARGS) {
+	const char32 *s1  = arg1._arg  ? arg1._arg  : U"";  int64 length1  = str32len (s1);
+	const char32 *s2  = arg2._arg  ? arg2._arg  : U"";  int64 length2  = str32len (s2);
+	const char32 *s3  = arg3._arg  ? arg3._arg  : U"";  int64 length3  = str32len (s3);
+	const char32 *s4  = arg4._arg  ? arg4._arg  : U"";  int64 length4  = str32len (s4);
+	const char32 *s5  = arg5._arg  ? arg5._arg  : U"";  int64 length5  = str32len (s5);
+	const char32 *s6  = arg6._arg  ? arg6._arg  : U"";  int64 length6  = str32len (s6);
+	const char32 *s7  = arg7._arg  ? arg7._arg  : U"";  int64 length7  = str32len (s7);
+	const char32 *s8  = arg8._arg  ? arg8._arg  : U"";  int64 length8  = str32len (s8);
+	const char32 *s9  = arg9._arg  ? arg9._arg  : U"";  int64 length9  = str32len (s9);
+	const char32 *s10 = arg10._arg ? arg10._arg : U"";  int64 length10 = str32len (s10);
+	const char32 *s11 = arg11._arg ? arg11._arg : U"";  int64 length11 = str32len (s11);
+	const char32 *s12 = arg12._arg ? arg12._arg : U"";  int64 length12 = str32len (s12);
+	const char32 *s13 = arg13._arg ? arg13._arg : U"";  int64 length13 = str32len (s13);
+	const char32 *s14 = arg14._arg ? arg14._arg : U"";  int64 length14 = str32len (s14);
+	const char32 *s15 = arg15._arg ? arg15._arg : U"";  int64 length15 = str32len (s15);
+	const char32 *s16 = arg16._arg ? arg16._arg : U"";  int64 length16 = str32len (s16);
+	const char32 *s17 = arg17._arg ? arg17._arg : U"";  int64 length17 = str32len (s17);
+	const char32 *s18 = arg18._arg ? arg18._arg : U"";  int64 length18 = str32len (s18);
+	const char32 *s19 = arg19._arg ? arg19._arg : U"";  int64 length19 = str32len (s19);
+	int64 totalLength = length1 + length2 + length3 + length4 + length5 + length6 + length7 + length8 + length9
+		+ length10 + length11 + length12 + length13 + length14 + length15 + length16 + length17 + length18 + length19;
+	Melder_sprint_HANDLE_OVERFLOW
+	str32cpy (buffer, s1);  int64 length = length1;
+	str32cpy (buffer + length, s2);   length += length2;
+	str32cpy (buffer + length, s3);   length += length3;
+	str32cpy (buffer + length, s4);   length += length4;
+	str32cpy (buffer + length, s5);   length += length5;
+	str32cpy (buffer + length, s6);   length += length6;
+	str32cpy (buffer + length, s7);   length += length7;
+	str32cpy (buffer + length, s8);   length += length8;
+	str32cpy (buffer + length, s9);   length += length9;
+	str32cpy (buffer + length, s10);  length += length10;
+	str32cpy (buffer + length, s11);  length += length11;
+	str32cpy (buffer + length, s12);  length += length12;
+	str32cpy (buffer + length, s13);  length += length13;
+	str32cpy (buffer + length, s14);  length += length14;
+	str32cpy (buffer + length, s15);  length += length15;
+	str32cpy (buffer + length, s16);  length += length16;
+	str32cpy (buffer + length, s17);  length += length17;
+	str32cpy (buffer + length, s18);  length += length18;
+	str32cpy (buffer + length, s19);
 }
 
 /* End of file melder_strings.cpp */
diff --git a/sys/melder_sysenv.cpp b/sys/melder_sysenv.cpp
index 62268e8..cc372dc 100644
--- a/sys/melder_sysenv.cpp
+++ b/sys/melder_sysenv.cpp
@@ -1,6 +1,6 @@
 /* melder_sysenv.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,32 +39,33 @@
 #endif
 #include "melder.h"
 
-wchar_t * Melder_getenv (const wchar_t *variableName) {
-	#if defined (macintosh) || defined (UNIX) || defined (__MINGW32__)
-		return Melder_peekUtf8ToWcs (getenv (Melder_peekWcsToUtf8 (variableName)));
+char32 * Melder_getenv (const char32 *variableName) {
+	#if defined (macintosh) || defined (UNIX) || defined (__MINGW32__) || defined (__CYGWIN__)
+		return Melder_peek8to32 (getenv (Melder_peek32to8 (variableName)));
 	#elif defined (_WIN32)
-		static wchar_t buffer [11] [255];
+		static char32 buffer [11] [255];
 		static int ibuffer = 0;
 		if (++ ibuffer == 11) ibuffer = 0;
-		long n = GetEnvironmentVariableW (variableName, buffer [ibuffer], 255);
-		if (n == ERROR_ENVVAR_NOT_FOUND) return NULL;
+		long n = GetEnvironmentVariableW (variableName, buffer [ibuffer], 255);   BUG
+		if (n == ERROR_ENVVAR_NOT_FOUND) return nullptr;
 		return & buffer [ibuffer] [0];
 	#endif
 }
 
-void Melder_system (const wchar_t *command) {
+void Melder_system (const char32 *command) {
+	if (! command) command = U"";
 	#if defined (macintosh) || defined (UNIX)
-		if (system (Melder_peekWcsToUtf8 (command)) != 0)
-			Melder_throw ("System command failed.");
+		if (system (Melder_peek32to8 (command)) != 0)
+			Melder_throw (U"System command failed.");
 	#elif defined (_WIN32)
 		STARTUPINFO siStartInfo;
 		PROCESS_INFORMATION piProcInfo;
-		wchar_t *comspec = Melder_getenv (L"COMSPEC");   // e.g. "C:\WINDOWS\COMMAND.COM" or "C:\WINNT\windows32\cmd.exe"
-		if (comspec == NULL) {
-			comspec = Melder_getenv (L"ComSpec");
+		char32 *comspec = Melder_getenv (U"COMSPEC");   // e.g. "C:\WINDOWS\COMMAND.COM" or "C:\WINNT\windows32\cmd.exe"
+		if (! comspec) {
+			comspec = Melder_getenv (U"ComSpec");
 		}
-		MelderString buffer = { 0 };
-		if (comspec != NULL) {
+		autoMelderString buffer;
+		if (comspec) {
 			MelderString_copy (& buffer, comspec);
 		} else {
 			OSVERSIONINFOEX osVersionInfo;
@@ -73,23 +74,23 @@ void Melder_system (const wchar_t *command) {
 			if (! GetVersionEx ((OSVERSIONINFO *) & osVersionInfo)) {
 				osVersionInfo. dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
 				if (! GetVersionEx ((OSVERSIONINFO *) & osVersionInfo))
-					Melder_throw ("System command cannot find system version.");
+					Melder_throw (U"System command cannot find system version.");
 			}
 			switch (osVersionInfo. dwPlatformId) {
 				case VER_PLATFORM_WIN32_NT: {
-					MelderString_copy (& buffer, L"cmd.exe");
+					MelderString_copy (& buffer, U"cmd.exe");
 				} break; case VER_PLATFORM_WIN32_WINDOWS: {
-					MelderString_copy (& buffer, L"command.com");
+					MelderString_copy (& buffer, U"command.com");
 				} break; default: {
-					MelderString_copy (& buffer, L"command.com");
+					MelderString_copy (& buffer, U"command.com");
 				}
 			}
 		}
-		MelderString_append (& buffer, L" /c ", command);
+		MelderString_append (& buffer, U" /c ", command);
         memset (& siStartInfo, 0, sizeof (siStartInfo));
         siStartInfo. cb = sizeof (siStartInfo);
-		if (! CreateProcess (NULL, buffer.string, NULL, NULL, TRUE, 0, NULL, NULL, & siStartInfo, & piProcInfo))
-			Melder_throw ("Cannot create subprocess.");
+		if (! CreateProcess (nullptr, Melder_peek32toW (buffer.string), nullptr, nullptr, true, CREATE_NO_WINDOW, nullptr, nullptr, & siStartInfo, & piProcInfo))
+			Melder_throw (U"Cannot create subprocess.");
 		WaitForSingleObject (piProcInfo. hProcess, -1);
 		CloseHandle (piProcInfo. hProcess);
 		CloseHandle (piProcInfo. hThread);
diff --git a/sys/melder_textencoding.cpp b/sys/melder_textencoding.cpp
index 85c4a8a..7fc88de 100644
--- a/sys/melder_textencoding.cpp
+++ b/sys/melder_textencoding.cpp
@@ -1,6 +1,6 @@
 /* melder_textencoding.cpp
  *
- * Copyright (C) 2007-2011,2014 Paul Boersma
+ * Copyright (C) 2007-2011,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,11 +21,10 @@
  * pb 2007/06/02 utf8 <-> wcs
  * pb 2007/06/14 separated from melder_strings.c and melder_alloc.c
  * pb 2007/06/16 text encoding preferences
- * pb 2007/08/12 prefs in wchar_t
+ * pb 2007/08/12 prefs in wchar
  * pb 2007/09/04 Melder_malloc rather than malloc in Melder_wcsToAscii (had caused an error in counting memory leaks)
  * pb 2007/10/06 Melder_peekWcsToCfstring
  * pb 2007/12/09 made MelderFile_writeCharacter compatible with the ISO Latin-1 preference
- * pb 2007/12/09 made MelderFile_readText ignore null bytes
  * pb 2008/11/05 split off from melder_encodings.c
  * pb 2010/03/08 support for Unicode values above 0xFFFF
  * pb 2011/04/05 C++
@@ -36,6 +35,7 @@
 #include "Preferences.h"
 #include "UnicodeData.h"
 #include "abcio.h"
+#include <math.h>
 
 #if defined (macintosh)
 	#include "macport_on.h"
@@ -53,53 +53,34 @@ static struct {
 } preferences;
 
 void Melder_setInputEncoding (enum kMelder_textInputEncoding encoding) { preferences. inputEncoding = encoding; }
-int Melder_getInputEncoding (void) { return preferences. inputEncoding; }
+int Melder_getInputEncoding () { return preferences. inputEncoding; }
 
 void Melder_setOutputEncoding (enum kMelder_textOutputEncoding encoding) { preferences. outputEncoding = encoding; }
-enum kMelder_textOutputEncoding Melder_getOutputEncoding (void) { return preferences. outputEncoding; }
+enum kMelder_textOutputEncoding Melder_getOutputEncoding () { return preferences. outputEncoding; }
 
-void Melder_textEncoding_prefs (void) {
-	Preferences_addEnum (L"TextEncoding.inputEncoding", & preferences. inputEncoding, kMelder_textInputEncoding, kMelder_textInputEncoding_DEFAULT);
-	Preferences_addEnum (L"TextEncoding.outputEncoding", & preferences. outputEncoding, kMelder_textOutputEncoding, kMelder_textOutputEncoding_DEFAULT);
+void Melder_textEncoding_prefs () {
+	Preferences_addEnum (U"TextEncoding.inputEncoding", & preferences. inputEncoding, kMelder_textInputEncoding, kMelder_textInputEncoding_DEFAULT);
+	Preferences_addEnum (U"TextEncoding.outputEncoding", & preferences. outputEncoding, kMelder_textOutputEncoding, kMelder_textOutputEncoding_DEFAULT);
 }
 
-bool Melder_isValidAscii (const wchar_t *text) {
-	for (; *text != '\0'; text ++) {
-		if (sizeof (wchar_t) == 2) {
-			if ((char16_t) *text > 127) return false;   // make unsigned
-		} else {
-			if ((char32_t) *text > 127) return false;   // make unsigned
-		}
-	}
-	return true;
-}
-
-bool Melder_isValidAscii (const char32_t *text) {
+bool Melder_isValidAscii (const char32 *text) {
 	for (; *text != '\0'; text ++) {
 		if (*text > 127) return false;
 	}
 	return true;
 }
 
-bool Melder_isEncodable (const wchar_t *text, int outputEncoding) {
+bool Melder_isEncodable (const char32 *text, int outputEncoding) {
 	switch (outputEncoding) {
 		case kMelder_textOutputEncoding_ASCII: {
 			for (; *text != '\0'; text ++) {
-				if (sizeof (wchar_t) == 2) {
-					if ((char16_t) *text > 127) return false;   // make unsigned
-				} else {
-					if ((char32_t) *text > 127) return false;   // make unsigned
-				}
+				if (*text > 127) return false;
 			}
 			return true;
 		} break;
 		case kMelder_textOutputEncoding_ISO_LATIN1: {
 			for (; *text != '\0'; text ++) {
-				if (sizeof (wchar_t) == 2) {
-					if ((char16_t) *text > 255) return false;   // make unsigned
-				} else {
-					if ((char32_t) *text > 255) return false;   // make unsigned
-				}
+				if (*text > 255) return false;
 			}
 			return true;
 		} break;
@@ -113,9 +94,9 @@ bool Melder_isEncodable (const wchar_t *text, int outputEncoding) {
 	return false;
 }
 
-bool Melder_strIsValidUtf8 (const char *string) {
-	for (const char8_t *p = (const char8_t *) & string [0]; *p != '\0'; p ++) {
-		char32_t kar = (char32_t) *p;
+bool Melder_str8IsValidUtf8 (const char *string) {
+	for (const char8 *p = (const char8 *) & string [0]; *p != '\0'; p ++) {
+		char32 kar = (char32) *p;
 		if (kar <= 0x7F) {
 			;
 		} else if (kar <= 0xC1) {
@@ -178,14 +159,103 @@ long Melder_killReturns_inlineCHAR (CHAR *text) {
 	*to = '\0';   // closing null character
 	return to - text;
 }
-long Melder_killReturns_inlineW (wchar_t *text) {
-	return Melder_killReturns_inlineCHAR <wchar_t> (text);
+long Melder_killReturns_inline (char32 *text) {
+	return Melder_killReturns_inlineCHAR <char32> (text);
 }
-long Melder_killReturns_inline32 (char32_t *text) {
-	return Melder_killReturns_inlineCHAR <char32_t> (text);
+
+size_t str32len_utf8 (const char32 *string, bool nativizeNewlines) {
+	size_t length = 0;
+	for (const char32 *p = & string [0]; *p != U'\0'; p ++) {
+		char32 kar = *p;
+		if (kar <= 0x00007F) {
+			#ifdef _WIN32
+				if (nativizeNewlines && kar == U'\n') length ++;
+			#else
+				(void) nativizeNewlines;
+			#endif
+			length ++;
+		} else if (kar <= 0x0007FF) {
+			length += 2;
+		} else if (kar <= 0x00FFFF) {
+			length += 3;
+		} else {
+			Melder_assert (kar <= 0x10FFFF);
+			length += 4;
+		}
+	}
+	return length;
 }
 
-char32_t Melder_decodeMacRoman [256] = {
+size_t str32len_utf16 (const char32 *string, bool nativizeNewlines) {
+	size_t length = 0;
+	for (const char32 *p = & string [0]; *p != U'\0'; p ++) {
+		char32 kar = *p;
+		if (kar <= 0x00007F) {
+			#ifdef _WIN32
+				if (nativizeNewlines && kar == U'\n') length ++;
+			#else
+				(void) nativizeNewlines;
+			#endif
+			length ++;
+		} else if (kar >= 0x010000) {
+			length += 2;
+		} else {
+			length += 1;
+		}
+	}
+	return length;
+}
+
+char32 * Melder_peek8to32 (const char *textA) {
+	if (textA == NULL) return NULL;
+	static MelderString buffers [19] { { 0 } };
+	static int ibuffer = 0;
+	if (++ ibuffer == 11) ibuffer = 0;
+	MelderString_empty (& buffers [ibuffer]);
+	unsigned long n = strlen (textA), i, j;
+	for (i = 0, j = 0; i <= n; i ++) {
+		char8 kar1 = (char8) textA [i];   // convert sign
+		if (kar1 <= 0x7F) {
+			MelderString_appendCharacter (& buffers [ibuffer],
+				(char32) kar1);
+		} else if (kar1 <= 0xC1) {
+			MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
+		} else if (kar1 <= 0xDF) {
+			char8 kar2 = textA [++ i];
+			if ((kar2 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
+			MelderString_appendCharacter (& buffers [ibuffer],
+				(char32) ((char32) ((char32) kar1 & 0x00001F) << 6) |
+						  (char32) ((char32) kar2 & 0x00003F));
+		} else if (kar1 <= 0xEF) {
+			char8 kar2 = textA [++ i];
+			if ((kar2 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
+			char8 kar3 = textA [++ i];
+			if ((kar3 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
+			MelderString_appendCharacter (& buffers [ibuffer],
+				(char32) ((char32) ((char32) kar1 & 0x00000F) << 12) |
+				(char32) ((char32) ((char32) kar2 & 0x00003F) << 6) |
+						  (char32) ((char32) kar3 & 0x00003F));
+		} else if (kar1 <= 0xF4) {
+			char8 kar2 = (char8) textA [++ i];
+			if ((kar2 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
+			char8 kar3 = (char8) textA [++ i];
+			if ((kar3 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
+			char8 kar4 = (char8) textA [++ i];
+			if ((kar4 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
+			char32 character =
+				(char32) ((char32) ((char32) kar1 & 0x000007) << 18) |
+				(char32) ((char32) ((char32) kar2 & 0x00003F) << 12) |
+				(char32) ((char32) ((char32) kar3 & 0x00003F) << 6) |
+						  (char32) ((char32) kar4 & 0x00003F);
+			MelderString_appendCharacter (& buffers [ibuffer], character);
+		} else {
+			MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
+		}
+	}
+	return buffers [ibuffer]. string;
+}
+
+char32 Melder_decodeMacRoman [256] = {
 	  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,  19,
 	 20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,
 	 40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
@@ -253,7 +323,7 @@ char32_t Melder_decodeMacRoman [256] = {
 	UNICODE_MACRON, UNICODE_BREVE, UNICODE_DOT_ABOVE, UNICODE_RING_ABOVE, UNICODE_CEDILLA,
 	UNICODE_DOUBLE_ACUTE_ACCENT, UNICODE_OGONEK, UNICODE_CARON };
 
-char32_t Melder_decodeWindowsLatin1 [256] = {
+char32 Melder_decodeWindowsLatin1 [256] = {
 	  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,  19,
 	 20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,
 	 40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
@@ -277,9 +347,8 @@ char32_t Melder_decodeWindowsLatin1 [256] = {
 	220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
 	240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 };
 
-template <class CHAR>
-void Melder_8bitToCHAR_inline (const char *string, CHAR *wcs, int inputEncoding) {
-	CHAR *q = & wcs [0];
+void Melder_8to32_inline (const char *string8, char32 *string32, int inputEncoding) {
+	char32 *q = & string32 [0];
 	if (inputEncoding == 0) {
 		inputEncoding = preferences. inputEncoding;
 		/*
@@ -300,7 +369,7 @@ void Melder_8bitToCHAR_inline (const char *string, CHAR *wcs, int inputEncoding)
 		inputEncoding == kMelder_textInputEncoding_UTF8_THEN_WINDOWS_LATIN1 ||
 		inputEncoding == kMelder_textInputEncoding_UTF8_THEN_MACROMAN)
 	{
-		if (Melder_strIsValidUtf8 (string)) {
+		if (Melder_str8IsValidUtf8 (string8)) {
 			inputEncoding = kMelder_textInputEncoding_UTF8;
 		} else if (inputEncoding == kMelder_textInputEncoding_UTF8_THEN_ISO_LATIN1) {
 			inputEncoding = kMelder_textInputEncoding_ISO_LATIN1;
@@ -310,34 +379,25 @@ void Melder_8bitToCHAR_inline (const char *string, CHAR *wcs, int inputEncoding)
 			inputEncoding = kMelder_textInputEncoding_MACROMAN;
 		} else {
 			Melder_assert (inputEncoding == kMelder_textInputEncoding_UTF8);
-			Melder_throw ("Text is not valid UTF-8; please try a different text input encoding.");
+			Melder_throw (U"Text is not valid UTF-8; please try a different text input encoding.");
 		}
 	}
-	const unsigned char *p = (const unsigned char *) & string [0];
+	const char8 *p = (const char8 *) & string8 [0];
 	if (inputEncoding == kMelder_textInputEncoding_UTF8) {
 		while (*p != '\0') {
-			char32_t kar1 = * p ++;
-			if (kar1 <= 0x7F) {
-				* q ++ = (CHAR) kar1;
-			} else if (kar1 <= 0xDF) {
-				char32_t kar2 = * p ++;
-				* q ++ = (CHAR) (((kar1 & 0x1F) << 6) | (kar2 & 0x3F));
-			} else if (kar1 <= 0xEF) {
-				char32_t kar2 = * p ++, kar3 = * p ++;
-				* q ++ = (CHAR) (((kar1 & 0x0F) << 12) | ((kar2 & 0x3F) << 6) | (kar3 & 0x3F));
-			} else if (kar1 <= 0xF4) {
-				char32_t kar2 = * p ++, kar3 = * p ++, kar4 = * p ++;
-				char32_t kar = ((kar1 & 0x07) << 18) | ((kar2 & 0x3F) << 12) | ((kar3 & 0x3F) << 6) | (kar4 & 0x3F);
-				if (sizeof (CHAR) == 2) {
-					/*
-					 * Convert to UTF-16 surrogate pair.
-					 */
-					kar -= 0x10000;
-					* q ++ = 0xD800 | (kar >> 10);
-					* q ++ = 0xDC00 | (kar & 0x3FF);
-				} else {
-					* q ++ = (CHAR) kar;
-				}
+			char32 kar1 = * p ++;   // convert up without sign extension
+			if (kar1 <= 0x00007F) {
+				* q ++ = kar1;
+			} else if (kar1 <= 0x0000DF) {
+				char32 kar2 = * p ++;   // convert up without sign extension
+				* q ++ = ((kar1 & 0x00001F) << 6) | (kar2 & 0x00003F);
+			} else if (kar1 <= 0x0000EF) {
+				char32 kar2 = * p ++, kar3 = * p ++;   // convert up without sign extension
+				* q ++ = ((kar1 & 0x00000F) << 12) | ((kar2 & 0x00003F) << 6) | (kar3 & 0x00003F);
+			} else if (kar1 <= 0x0000F4) {
+				char32 kar2 = * p ++, kar3 = * p ++, kar4 = * p ++;   // convert up without sign extension
+				char32 kar = ((kar1 & 0x000007) << 18) | ((kar2 & 0x00003F) << 12) | ((kar3 & 0x00003F) << 6) | (kar4 & 0x00003F);
+				* q ++ = kar;
 			}
 		}
 	} else if (inputEncoding == kMelder_textInputEncoding_ISO_LATIN1) {
@@ -346,331 +406,161 @@ void Melder_8bitToCHAR_inline (const char *string, CHAR *wcs, int inputEncoding)
 		}
 	} else if (inputEncoding == kMelder_textInputEncoding_WINDOWS_LATIN1) {
 		while (*p != '\0') {
-			* q ++ = (CHAR) Melder_decodeWindowsLatin1 [* p ++];
+			* q ++ = Melder_decodeWindowsLatin1 [* p ++];
 		}
 	} else if (inputEncoding == kMelder_textInputEncoding_MACROMAN) {
 		while (*p != '\0') {
-			* q ++ = (CHAR) Melder_decodeMacRoman [* p ++];
+			* q ++ = Melder_decodeMacRoman [* p ++];
 		}
 	} else if (inputEncoding != kMelder_textInputEncoding_UTF8) {
-		Melder_fatal ("Unknown text input encoding %d.", inputEncoding);
+		Melder_fatal (U"Unknown text input encoding ", inputEncoding, U".");
 	}
-	* q = '\0';
-	(void) Melder_killReturns_inlineCHAR <CHAR> (wcs);
-}
-void Melder_8bitToWcs_inline (const char *string, wchar_t *wcs, int inputEncoding) {
-	Melder_8bitToCHAR_inline <wchar_t> (string, wcs, inputEncoding);
-}
-void Melder_8bitToUtf32_inline (const char *string, char32_t *wcs, int inputEncoding) {
-	Melder_8bitToCHAR_inline <char32_t> (string, wcs, inputEncoding);
+	* q = U'\0';   // closing null character
+	(void) Melder_killReturns_inlineCHAR <char32> (string32);
 }
 
-wchar_t * Melder_8bitToWcs (const char *string, int inputEncoding) {
+char32 * Melder_8to32 (const char *string, int inputEncoding) {
 	if (string == NULL) return NULL;
-	autostring result = Melder_malloc (wchar_t, (int64_t) strlen (string) + 1);
-	Melder_8bitToWcs_inline (string, result.peek(), inputEncoding);
-	return result.transfer();
-}
-char32_t * Melder_8bitToUtf32 (const char *string, int inputEncoding) {
-	if (string == NULL) return NULL;
-	autostring32 result = Melder_malloc (char32_t, (int64_t) strlen (string) + 1);
-	Melder_8bitToUtf32_inline (string, result.peek(), inputEncoding);
+	autostring32 result = Melder_malloc (char32, (int64) strlen (string) + 1);
+	Melder_8to32_inline (string, result.peek(), inputEncoding);
 	return result.transfer();
 }
 
-wchar_t * Melder_utf8ToWcs (const char *string) {
-	if (string == NULL) return NULL;
-	autostring result = Melder_malloc (wchar_t, (int64_t) strlen (string) + 1);
-	Melder_8bitToWcs_inline (string, result.peek(), kMelder_textInputEncoding_UTF8);
-	return result.transfer();
-}
-char32_t * Melder_utf8ToUtf32 (const char *string) {
+char32 * Melder_8to32 (const char *string) {
 	if (string == NULL) return NULL;
-	autostring32 result = Melder_malloc (char32_t, (int64_t) strlen (string) + 1);
-	Melder_8bitToUtf32_inline (string, result.peek(), kMelder_textInputEncoding_UTF8);
+	autostring32 result = Melder_malloc (char32, (int64) strlen (string) + 1);
+	Melder_8to32_inline (string, result.peek(), kMelder_textInputEncoding_UTF8);
 	return result.transfer();
 }
 
-char32_t * Melder_utf8ToUtf32_f (const char *string) {
-	char32_t *result = Melder_malloc_f (char32_t, (int64_t) strlen (string) + 1);
-	Melder_assert (Melder_strIsValidUtf8 (string));
-	const char8_t *p = (const char8_t *) & string [0];
-	char32_t *q = & result [0];
-	while (*p != '\0') {
-		char32_t kar1 = (char32_t) * p ++;   // convert up
-		if (kar1 <= 0x7F) {
-			* q ++ = kar1;
-		} else if (kar1 <= 0xDF) {
-			char32_t kar2 = (char32_t) * p ++;   // convert up
-			* q ++ = ((kar1 & 0x1F) << 6) | (kar2 & 0x3F);
-		} else if (kar1 <= 0xEF) {
-			char32_t kar2 = (char32_t) * p ++, kar3 = (char32_t) * p ++;   // convert up
-			* q ++ = ((kar1 & 0x0F) << 12) | ((kar2 & 0x3F) << 6) | (kar3 & 0x3F);
-		} else if (kar1 <= 0xF4) {
-			char32_t kar2 = (char32_t) * p ++, kar3 = (char32_t) * p ++, kar4 = (char32_t) * p ++;   // convert up
-			* q ++ = ((kar1 & 0x07) << 18) | ((kar2 & 0x3F) << 12) | ((kar3 & 0x3F) << 6) | (kar4 & 0x3F);
-		}
-	}
-	* q = '\0';   // closing null character
-	return result;
-}
-
-wchar_t * Melder_peekUtf8ToWcs (const char *textA) {
-	if (textA == NULL) return NULL;
-	static MelderString buffers [11] = { { 0 } };
+char32 * Melder_peek16to32 (const char16 *text) {
+	if (text == NULL) return nullptr;
+	static MelderString buffers [19] { { 0 } };
 	static int ibuffer = 0;
-	if (++ ibuffer == 11) ibuffer = 0;
+	if (++ ibuffer == 19) ibuffer = 0;
 	MelderString_empty (& buffers [ibuffer]);
-	unsigned long n = strlen (textA), i, j;
-	for (i = 0, j = 0; i <= n; i ++) {
-		char8_t kar1 = (char8_t) textA [i];   // convert sign
-		if (kar1 <= 0x7F) {
-			MelderString_appendCharacter (& buffers [ibuffer],
-				(char32_t) kar1);
-		} else if (kar1 <= 0xC1) {
-			MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
-		} else if (kar1 <= 0xDF) {
-			char8_t kar2 = (char8_t) textA [++ i];
-			if ((kar2 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
-			MelderString_appendCharacter (& buffers [ibuffer],
-				(char32_t) ((char32_t) ((char32_t) kar1 & 0x1F) << 6) |
-				            (char32_t) ((char32_t) kar2 & 0x3F));
-		} else if (kar1 <= 0xEF) {
-			char8_t kar2 = (char8_t) textA [++ i];
-			if ((kar2 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
-			char8_t kar3 = (char8_t) textA [++ i];
-			if ((kar3 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
-			MelderString_appendCharacter (& buffers [ibuffer],
-				(char32_t) ((char32_t) ((char32_t) kar1 & 0x0F) << 12) |
-				(char32_t) ((char32_t) ((char32_t) kar2 & 0x3F) << 6) |
-				            (char32_t) ((char32_t) kar3 & 0x3F));
-		} else if (kar1 <= 0xF4) {
-			char8_t kar2 = (char8_t) textA [++ i];
-			if ((kar2 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
-			char8_t kar3 = (char8_t) textA [++ i];
-			if ((kar3 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
-			char8_t kar4 = (char8_t) textA [++ i];
-			if ((kar4 & 0xC0) != 0x80) MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
-			char32_t character =
-				(char32_t) ((char32_t) ((char32_t) kar1 & 0x07) << 18) |
-				(char32_t) ((char32_t) ((char32_t) kar2 & 0x3F) << 12) |
-				(char32_t) ((char32_t) ((char32_t) kar3 & 0x3F) << 6) |
-			                (char32_t) ((char32_t) kar4 & 0x3F);
-			if (sizeof (wchar_t) == 2) {
-				/*
-				 * Convert to UTF-16 surrogate pair.
-				 */
-				character -= 0x010000;
-				MelderString_appendCharacter (& buffers [ibuffer], 0x00D800 | (character >> 10));
-				MelderString_appendCharacter (& buffers [ibuffer], 0x00DC00 | (character & 0x0003FF));
+	for (;;) {
+		char16 kar1 = * text ++;
+		if (kar1 == u'\0') return buffers [ibuffer]. string;
+		if (kar1 < 0xD800) {
+			MelderString_appendCharacter (& buffers [ibuffer], (char32) kar1);   // convert up without sign extension
+		} else if (kar1 < 0xDC00) {
+			char16 kar2 = * text ++;
+			if (kar2 >= 0xDC00 && kar2 <= 0xDFFF) {
+				MelderString_appendCharacter (& buffers [ibuffer],
+					(char32) (0x010000 +
+						(char32) (((char32) kar1 & 0x0003FF) << 10) +
+						(char32)  ((char32) kar2 & 0x0003FF)));
 			} else {
-				MelderString_appendCharacter (& buffers [ibuffer], (wchar_t) character);   // convert sign
+				MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
 			}
-		} else {
+		} else if (kar1 < 0xE000) {
 			MelderString_appendCharacter (& buffers [ibuffer], UNICODE_REPLACEMENT_CHARACTER);
-		}
-	}
-	return buffers [ibuffer]. string;
-}
-
-size_t wcslen_utf8 (const wchar_t *wcs, bool expandNewlines) {
-	size_t length = 0;
-	for (const wchar_t *p = & wcs [0]; *p != '\0'; p ++) {
-		if (sizeof (wchar_t) == 2) {
-			char16_t kar1 = (char16_t) *p;   // convert sign
-			if (kar1 <= 0x007F) {
-				#ifdef _WIN32
-					if (expandNewlines && kar1 == '\n') length ++;
-				#else
-					(void) expandNewlines;
-				#endif
-				length ++;
-			} else if (kar1 <= 0x07FF) {
-				length += 2;
-			} else if (kar1 >= 0xD800 && kar1 <= 0xDBFF) {
-				char16_t kar2 = (char16_t) * ++ p;
-				Melder_assert (kar2 >= 0xDC00 && kar2 <= 0xDFFF);
-				length += 4;
-			} else {
-				Melder_assert (kar1 <= 0xD7FF || kar1 >= 0xE000);
-				length += 3;
-			}
 		} else {
-			char32_t kar = (char32_t) *p;   // convert sign
-			if (kar <= 0x0000007F) {
-				#ifdef _WIN32
-					if (expandNewlines && kar == '\n') length ++;
-				#else
-					(void) expandNewlines;
-				#endif
-				length ++;
-			} else if (kar <= 0x000007FF) {
-				length += 2;
-			} else if (kar <= 0x0000FFFF) {
-				length += 3;
-			} else {
-				Melder_assert (kar <= 0x0010FFFF);
-				length += 4;
-			}
+			MelderString_appendCharacter (& buffers [ibuffer], (char32) kar1);   // convert up without sign extension
 		}
 	}
-	return length;
 }
 
-size_t wcslen_utf16 (const wchar_t *wcs, bool expandNewlines) {
-	size_t length = 0;
-	for (const wchar_t *p = & wcs [0]; *p != '\0'; p ++) {
-		if (sizeof (wchar_t) == 2) {
-			#ifdef _WIN32
-				char16_t kar = (char16_t) *p;   // convert sign
-				if (expandNewlines && kar == '\n') length ++;
-			#else
-				(void) expandNewlines;
-			#endif
-			length ++;
-		} else {
-			char32_t kar = (char32_t) *p;   // convert sign
-			if (kar <= 0x0000007F) {
-				#ifdef _WIN32
-					if (expandNewlines && kar == '\n') length ++;
-				#else
-					(void) expandNewlines;
-				#endif
-				length ++;
-			} else if (kar >= 0x00010000) {
-				length += 2;
-			} else {
-				length += 1;
-			}
-		}
-	}
-	return length;
-}
-
-void Melder_wcsToUtf8_inline (const wchar_t *wcs, char *utf8) {
-	size_t n = wcslen (wcs), i, j;
-	for (i = 0, j = 0; i < n; i ++) {
-		char32_t kar = sizeof (wchar_t) == 2 ?
-			(char16_t) wcs [i] :   // crucial cast: prevents sign extension
-			(char32_t) wcs [i];
-		if (kar <= 0x0000007F) {
-			#ifdef _WIN32
-				if (kar == '\n') utf8 [j ++] = 13;
-			#endif
-			utf8 [j ++] = (char) (char8_t) kar;   // guarded truncation
-		} else if (kar <= 0x000007FF) {
-			utf8 [j ++] = (char) (char8_t) (0xC0 | (kar >> 6));
-			utf8 [j ++] = (char) (char8_t) (0x80 | (kar & 0x00003F));
-		} else if (kar <= 0x0000FFFF) {
-			if (sizeof (wchar_t) == 2) {
-				if ((kar & 0xF800) == 0xD800) {
-					if (kar > 0xDBFF)
-						Melder_fatal ("Incorrect Unicode value (first surrogate member %X).", kar);
-					char32_t kar2 = (char16_t) wcs [++ i];   // crucial cast: prevents sign extension
-					if (kar2 < 0xDC00 || kar2 > 0xDFFF)
-						Melder_fatal ("Incorrect Unicode value (second surrogate member %X).", kar2);
-					kar = (((kar & 0x3FF) << 10) | (kar2 & 0x3FF)) + 0x10000;   // decode UTF-16
-					utf8 [j ++] = (char) (char8_t) (0xF0 | (kar >> 18));
-					utf8 [j ++] = (char) (char8_t) (0x80 | ((kar >> 12) & 0x00003F));
-					utf8 [j ++] = (char) (char8_t) (0x80 | ((kar >> 6) & 0x00003F));
-					utf8 [j ++] = (char) (char8_t) (0x80 | (kar & 0x00003F));
-				} else {
-					utf8 [j ++] = (char) (char8_t) (0xE0 | (kar >> 12));
-					utf8 [j ++] = (char) (char8_t) (0x80 | ((kar >> 6) & 0x00003F));
-					utf8 [j ++] = (char) (char8_t) (0x80 | (kar & 0x00003F));
-				}
-			} else {
-				utf8 [j ++] = (char) (char8_t) (0xE0 | (kar >> 12));
-				utf8 [j ++] = (char) (char8_t) (0x80 | ((kar >> 6) & 0x00003F));
-				utf8 [j ++] = (char) (char8_t) (0x80 | (kar & 0x00003F));
-			}
-		} else {
-			utf8 [j ++] = (char) (char8_t) (0xF0 | (kar >> 18));
-			utf8 [j ++] = (char) (char8_t) (0x80 | ((kar >> 12) & 0x00003F));
-			utf8 [j ++] = (char) (char8_t) (0x80 | ((kar >> 6) & 0x00003F));
-			utf8 [j ++] = (char) (char8_t) (0x80 | (kar & 0x00003F));
-		}
-	}
-	utf8 [j] = '\0';
+char32 * Melder_16to32 (const char16 *text) {
+	return Melder_dup (Melder_peek16to32 (text));
 }
 
-void Melder_str32ToUtf8_inline (const char32 *string, char *utf8) {
+void Melder_32to8_inline (const char32 *string, char *utf8) {
 	int64 n = str32len (string), i, j;
 	for (i = 0, j = 0; i < n; i ++) {
 		char32 kar = string [i];
 		if (kar <= 0x00007F) {   // 7 bits
 			#ifdef _WIN32
-				if (kar == '\n') utf8 [j ++] = 13;
+				if (kar == U'\n') utf8 [j ++] = 13;
 			#endif
-			utf8 [j ++] = (char) (char8_t) kar;   // guarded truncation
+			utf8 [j ++] = (char) (char8) kar;   // guarded truncation
 		} else if (kar <= 0x0007FF) {   // 11 bits
-			utf8 [j ++] = (char) (char8_t) (0xC0 | (kar >> 6));   // the upper 5 bits yield a number between 0xC4 and 0xDF
-			utf8 [j ++] = (char) (char8_t) (0x80 | (kar & 0x00003F));   // the lower 6 bits yield a number between 0x80 and 0xBF
+			utf8 [j ++] = (char) (char8) (0x0000C0 | (kar >> 6));   // the upper 5 bits yield a number between 0xC4 and 0xDF
+			utf8 [j ++] = (char) (char8) (0x000080 | (kar & 0x00003F));   // the lower 6 bits yield a number between 0x80 and 0xBF
 		} else if (kar <= 0x00FFFF) {   // 16 bits
-			utf8 [j ++] = (char) (char8_t) (0xE0 | (kar >> 12));   // the upper 4 bits yield a number between 0xE0 and 0xEF
-			utf8 [j ++] = (char) (char8_t) (0x80 | ((kar >> 6) & 0x00003F));
-			utf8 [j ++] = (char) (char8_t) (0x80 | (kar & 0x00003F));
+			utf8 [j ++] = (char) (char8) (0x0000E0 | (kar >> 12));   // the upper 4 bits yield a number between 0xE0 and 0xEF
+			utf8 [j ++] = (char) (char8) (0x000080 | ((kar >> 6) & 0x00003F));
+			utf8 [j ++] = (char) (char8) (0x000080 | (kar & 0x00003F));
 		} else {   // 21 bits
-			utf8 [j ++] = (char) (char8_t) (0xF0 | (kar >> 18));   // the upper 3 bits yield a number between 0xF0 and 0xF4 (0x10FFFF >> 18 == 4)
-			utf8 [j ++] = (char) (char8_t) (0x80 | ((kar >> 12) & 0x00003F));   // the next 6 bits
-			utf8 [j ++] = (char) (char8_t) (0x80 | ((kar >> 6) & 0x00003F));   // the third 6 bits
-			utf8 [j ++] = (char) (char8_t) (0x80 | (kar & 0x00003F));   // the lower 6 bits
+			utf8 [j ++] = (char) (char8) (0x0000F0 | (kar >> 18));   // the upper 3 bits yield a number between 0xF0 and 0xF4 (0x10FFFF >> 18 == 4)
+			utf8 [j ++] = (char) (char8) (0x000080 | ((kar >> 12) & 0x00003F));   // the next 6 bits
+			utf8 [j ++] = (char) (char8) (0x000080 | ((kar >> 6) & 0x00003F));   // the third 6 bits
+			utf8 [j ++] = (char) (char8) (0x000080 | (kar & 0x00003F));   // the lower 6 bits
 		}
 	}
 	utf8 [j] = '\0';
 }
 
-char * Melder_wcsToUtf8 (const wchar_t *string) {
+char * Melder_32to8 (const char32 *string) {
 	if (string == NULL) return NULL;
-	autostring8 result = Melder_malloc (char, (int64_t) wcslen_utf8 (string, true) + 1);
-	Melder_wcsToUtf8_inline (string, result.peek());
+	autostring8 result = Melder_malloc (char, (int64) str32len_utf8 (string, true) + 1);
+	Melder_32to8_inline (string, result.peek());
 	return result.transfer();
 }
 
-char * Melder_peekWcsToUtf8 (const wchar_t *text) {
+char * Melder_peek32to8 (const char32 *text) {
 	if (text == NULL) return NULL;
-	static char *buffer [11] = { NULL };
-	static size_t bufferSize [11] = { 0 };
+	static char *buffer [19] = { NULL };
+	static int64 bufferSize [19] = { 0 };
 	static int ibuffer = 0;
-	if (++ ibuffer == 11) ibuffer = 0;
-	size_t sizeNeeded = wcslen (text) * 4 + 1;
-	if ((bufferSize [ibuffer] - sizeNeeded) * sizeof (char) >= 10000) {
+	if (++ ibuffer == 19) ibuffer = 0;
+	int64 sizeNeeded = str32len (text) * 4 + 1;
+	if ((bufferSize [ibuffer] - sizeNeeded) * (int64) sizeof (char) >= 10000) {
 		Melder_free (buffer [ibuffer]);
 		bufferSize [ibuffer] = 0;
 	}
 	if (sizeNeeded > bufferSize [ibuffer]) {
-		sizeNeeded = (size_t) (sizeNeeded * 1.61803) + 100;
+		sizeNeeded = (int64) floor (sizeNeeded * 1.61803) + 100;
 		buffer [ibuffer] = (char *) Melder_realloc_f (buffer [ibuffer], (int64) sizeNeeded * (int64) sizeof (char));
 		bufferSize [ibuffer] = sizeNeeded;
 	}
-	Melder_wcsToUtf8_inline (text, buffer [ibuffer]);
+	Melder_32to8_inline (text, buffer [ibuffer]);
 	return buffer [ibuffer];
 }
 
-const uint16_t * Melder_peekWcsToUtf16 (const wchar_t *text) {
+char16 * Melder_peek32to16 (const char32 *text, bool nativizeNewlines) {
 	if (text == NULL) return NULL;
-	static MelderString16 buffers [11] = { { 0 } };
+	static MelderString16 buffers [19] = { { 0 } };
 	static int ibuffer = 0;
-	if (++ ibuffer == 11) ibuffer = 0;
+	if (++ ibuffer == 19) ibuffer = 0;
 	MelderString16_empty (& buffers [ibuffer]);
-	unsigned long n = wcslen (text);
-	for (unsigned long i = 0; i <= n; i ++) {
-		#ifdef _WIN32
-			if (text [i] == '\n') MelderString16_appendCharacter (& buffers [ibuffer], 13);
-		#endif
-		MelderString16_appendCharacter (& buffers [ibuffer], text [i]);
+	int64 n = str32len (text);
+	if (nativizeNewlines) {
+		for (int64 i = 0; i <= n; i ++) {
+			#ifdef _WIN32
+				if (text [i] == U'\n')
+					MelderString16_appendCharacter (& buffers [ibuffer], (char32) 13);
+			#endif
+			MelderString16_appendCharacter (& buffers [ibuffer], text [i]);
+		}
+	} else {
+		for (int64 i = 0; i <= n; i ++) {
+			MelderString16_appendCharacter (& buffers [ibuffer], text [i]);
+		}
 	}
-	return (uint16_t *) buffers [ibuffer]. string;   // return type is such that this routine can be called by C
+	return buffers [ibuffer]. string;
+}
+char16 * Melder_peek32to16 (const char32 *text) {
+	return Melder_peek32to16 (text, false);
+}
+
+char16 * Melder_32to16 (const char32 *text) {
+	char16 *text16 = Melder_peek32to16 (text);
+	int64 length = str16len (text16);
+	char16 *result = Melder_malloc (char16, length + 1);
+	str16cpy (result, text16);
+	return result;
 }
 
 #if defined (macintosh)
-const void * Melder_peekWcsToCfstring (const wchar_t *text) {
+const void * Melder_peek32toCfstring (const char32 *text) {
 	if (text == NULL) return NULL;
 	static CFStringRef cfString [11];
 	static int icfString = 0;
 	if (++ icfString == 11) icfString = 0;
 	if (cfString [icfString] != NULL) CFRelease (cfString [icfString]);
-	cfString [icfString] = CFStringCreateWithCString (NULL, Melder_peekWcsToUtf8 (text), kCFStringEncodingUTF8);
+	cfString [icfString] = CFStringCreateWithCString (NULL, (const char *) Melder_peek32to8 (text), kCFStringEncodingUTF8);
 	return cfString [icfString];
 }
 #endif
diff --git a/sys/melder_time.cpp b/sys/melder_time.cpp
index c09b4bc..2626d35 100644
--- a/sys/melder_time.cpp
+++ b/sys/melder_time.cpp
@@ -87,7 +87,7 @@ uint64_t GetPIDTimeInNanoseconds(void)
 }
 */
 
-double Melder_clock (void) {
+double Melder_clock () {
 	#if defined (macintosh) || defined (UNIX)
 		/*
 		 * The clock counts the number of seconds elapsed since 1969.
@@ -117,7 +117,7 @@ double Melder_clock (void) {
 	#endif
 }
 
-double Melder_stopwatch (void) {
+double Melder_stopwatch () {
 	static double lastTime;
 	double now = Melder_clock ();
 	double timeElapsed = lastTime == 0 ? -1.0 : now - lastTime;
diff --git a/sys/melder_token.cpp b/sys/melder_token.cpp
index b1e79e9..c942309 100644
--- a/sys/melder_token.cpp
+++ b/sys/melder_token.cpp
@@ -1,6 +1,6 @@
 /* melder_token.cpp
  *
- * Copyright (C) 2006-2011 Paul Boersma
+ * Copyright (C) 2006-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 
 /*
  * pb 2006/04/16 created
- * pb 2007/08/10 wchar_t
+ * pb 2007/08/10 wchar
  * pb 2007/11/18 moved Melder_get/free/searchToken(s) here
  * pb 2011/04/05 C++
  */
@@ -27,53 +27,53 @@
 #include "melder.h"
 #include "NUM.h"
 
-long Melder_countTokens (const wchar_t *string) {
+long Melder_countTokens (const char32 *string) {
 	long numberOfTokens = 0;
-	const wchar_t *p = & string [0];
+	const char32 *p = & string [0];
 	for (;;) {
-		while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') p ++;
-		if (*p == '\0') return numberOfTokens;
+		while (*p == U' ' || *p == U'\t' || *p == U'\n' || *p == U'\r') p ++;
+		if (*p == U'\0') return numberOfTokens;
 		numberOfTokens ++;
-		while (*p != ' ' && *p != '\t' && *p != '\n' && *p != '\r') {
-			if (*p == '\0') return numberOfTokens;
+		while (*p != U' ' && *p != U'\t' && *p != U'\n' && *p != U'\r') {
+			if (*p == U'\0') return numberOfTokens;
 			p ++;
 		}
 	}
 	return 0;   // should not occur
 }
 
-static wchar_t *theMelderToken, *theMelderTokenLast;
+static char32 *theMelderToken;
 
-wchar_t *Melder_firstToken (const wchar_t *string) {
+char32 *Melder_firstToken (const char32 *string) {
 	Melder_free (theMelderToken);
-	theMelderToken = Melder_wcsdup_f (string);
-	return Melder_wcstok (theMelderToken, L" \t\n\r", & theMelderTokenLast);
+	theMelderToken = Melder_dup_f (string);
+	return Melder_tok (theMelderToken, U" \t\n\r");
 }
 
-wchar_t *Melder_nextToken (void) {
-	return Melder_wcstok (NULL, L" \t\n\r", & theMelderTokenLast);
+char32 *Melder_nextToken () {
+	return Melder_tok (nullptr, U" \t\n\r");
 }
 
-wchar_t ** Melder_getTokens (const wchar_t *string, long *n) {
-	wchar_t *token;
+char32 ** Melder_getTokens (const char32 *string, long *n) {
+	char32 *token;
 	long itoken = 0;
 	*n = Melder_countTokens (string);
-	if (*n == 0) return NULL;
-	autostringvector result (1, *n);
-	for (token = Melder_firstToken (string); token != NULL; token = Melder_nextToken ()) {
-		result [++ itoken] = Melder_wcsdup (token);
+	if (*n == 0) return nullptr;
+	autostring32vector result (1, *n);
+	for (token = Melder_firstToken (string); token != nullptr; token = Melder_nextToken ()) {
+		result [++ itoken] = Melder_dup (token);
 	}
 	return result.transfer();
 }
 
-void Melder_freeTokens (wchar_t ***tokens) {
+void Melder_freeTokens (char32 ***tokens) {
 	NUMvector_free (*tokens, 1);
-	*tokens = NULL;
+	*tokens = nullptr;
 }
 
-long Melder_searchToken (const wchar_t *string, wchar_t **tokens, long n) {
+long Melder_searchToken (const char32 *string, char32 **tokens, long n) {
 	for (long i = 1; i <= n; i ++) {
-		if (wcsequ (string, tokens [i])) return i;
+		if (str32equ (string, tokens [i])) return i;
 	}
 	return 0;
 }
diff --git a/sys/melder_writetext.cpp b/sys/melder_writetext.cpp
index 795d95f..32e77a8 100644
--- a/sys/melder_writetext.cpp
+++ b/sys/melder_writetext.cpp
@@ -21,7 +21,7 @@
  * pb 2007/06/02 utf8 <-> wcs
  * pb 2007/06/14 separated from melder_strings.c and melder_alloc.c
  * pb 2007/06/16 text encoding preferences
- * pb 2007/08/12 prefs in wchar_t
+ * pb 2007/08/12 prefs in wchar
  * pb 2007/09/04 Melder_malloc rather than malloc in Melder_wcsToAscii (had caused an error in counting memory leaks)
  * pb 2007/10/06 Melder_peekWcsToCfstring
  * pb 2007/12/09 made MelderFile_writeCharacter compatible with the ISO Latin-1 preference
@@ -44,87 +44,42 @@
 	#include "macport_off.h"
 #endif
 
-static void Melder_fwriteUnicodeAsUtf8 (char32_t unicode, FILE *f) {
-	if (unicode <= 0x0000007F) {
-		#ifdef _WIN32
-			if (unicode == '\n') fputc (13, f);
-		#endif
-		fputc ((int) unicode, f);   // because fputc wants an int instead of an uint8_t (guarded conversion)
-	} else if (unicode <= 0x000007FF) {
-		fputc (0xC0 | (unicode >> 6), f);
-		fputc (0x80 | (unicode & 0x0000003F), f);
-	} else if (unicode <= 0x0000FFFF) {
-		fputc (0xE0 | (unicode >> 12), f);
-		fputc (0x80 | ((unicode >> 6) & 0x0000003F), f);
-		fputc (0x80 | (unicode & 0x0000003F), f);
-	} else {
-		fputc (0xF0 | (unicode >> 18), f);
-		fputc (0x80 | ((unicode >> 12) & 0x0000003F), f);
-		fputc (0x80 | ((unicode >> 6) & 0x0000003F), f);
-		fputc (0x80 | (unicode & 0x0000003F), f);
-	}
-}
-
-void Melder_fwriteWcsAsUtf8 (const wchar_t *ptr, size_t n, FILE *f) {
+void Melder_fwrite32to8 (const char32 *string, FILE *f) {
 	/*
 	 * Precondition:
-	 *    the string's encoding is either UTF-32 or UTF-16.
+	 *    the string's encoding is UTF-32.
 	 * Failure:
 	 *    if the precondition does not hold, we don't crash,
 	 *    but the characters that are written may be incorrect.
 	 */
-	for (size_t i = 0; i < n; i ++) {
-		if (sizeof (wchar_t) == 4) {
-			/*
-			 * We are likely to be on Macintosh or Linux.
-			 * We assume that the string's encoding is UTF-32.
-			 */
-			Melder_fwriteUnicodeAsUtf8 ((char32_t) ptr [i], f);   // safe conversion, because sign bit is zero
-		} else if (sizeof (wchar_t) == 2) {
-			/*
-			 * We are likely to be on Windows.
-			 * We assume that the string's encoding is UTF-16;
-			 * if it turns out to be otherwise, we write question marks.
-			 */
-			char32_t kar1 = (char32_t) (char16_t) ptr [i];   // don't extend sign
-			if (kar1 < 0x00D800) {
-				Melder_fwriteUnicodeAsUtf8 (kar1, f);   // a character from the Basic Multilingual Plane
-			} else if (kar1 < 0x00DC00) {
-				/*
-				 * We detected a surrogate code point
-				 * and will therefore translate two UTF-16 words into one Unicode supplementary character.
-				 */
-				char32_t kar2 = (char32_t) (char16_t) ptr [++ i];   // don't extend sign
-				if (kar2 == 0) {   // string exhausted?
-					// Melder_fatal ("Detected a bare (final) high surrogate in UTF-16.");
-					Melder_fwriteUnicodeAsUtf8 (UNICODE_REPLACEMENT_CHARACTER, f);
-					return;
-				}
-				if (kar2 >= 0x00DC00 && kar2 <= 0x00DFFF) {
-					Melder_fwriteUnicodeAsUtf8 (0x010000 + ((kar1 - 0x00D800) << 10) + (kar2 - 0x00DC00), f);
-				} else {
-					// Melder_fatal ("Detected a bare high surrogate in UTF-16.");
-					Melder_fwriteUnicodeAsUtf8 (UNICODE_REPLACEMENT_CHARACTER, f);
-					i --;   // try to interpret the next character in the normal way
-				}
-			} else if (kar1 < 0x00E000) {
-				// Melder_fatal ("Detected a bare low surrogate in UTF-16.");
-				Melder_fwriteUnicodeAsUtf8 (UNICODE_REPLACEMENT_CHARACTER, f);
-			} else if (kar1 <= 0x00FFFF) {
-				Melder_fwriteUnicodeAsUtf8 (kar1, f);   // a character from the Basic Multilingual Plane
-			} else {
-				Melder_fatal ("Melder_fwriteWcsAsUtf8: unsigned short greater than 0xFFFF: should not occur.");
-			}
+	for (const char32* p = string; *p != U'\0'; p ++) {
+		char32 kar = *p;
+		if (kar <= 0x00007F) {
+			#ifdef _WIN32
+				if (kar == U'\n') fputc (13, f);
+			#endif
+			fputc ((int) kar, f);   // because fputc wants an int instead of an uint8_t (guarded conversion)
+		} else if (kar <= 0x0007FF) {
+			fputc (0xC0 | (kar >> 6), f);
+			fputc (0x80 | (kar & 0x00003F), f);
+		} else if (kar <= 0x00FFFF) {
+			fputc (0xE0 | (kar >> 12), f);
+			fputc (0x80 | ((kar >> 6) & 0x00003F), f);
+			fputc (0x80 | (kar & 0x00003F), f);
 		} else {
-			Melder_fatal ("Melder_fwriteWcsAsUtf8: unsupported size of wide character.");
+			fputc (0xF0 | (kar >> 18), f);
+			fputc (0x80 | ((kar >> 12) & 0x00003F), f);
+			fputc (0x80 | ((kar >> 6) & 0x00003F), f);
+			fputc (0x80 | (kar & 0x00003F), f);
 		}
 	}
 }
 
-void MelderFile_writeText (MelderFile file, const wchar_t *text, enum kMelder_textOutputEncoding outputEncoding) {
+void MelderFile_writeText (MelderFile file, const char32 *text, enum kMelder_textOutputEncoding outputEncoding) {
+	if (! text) text = U"";
 	autofile f = Melder_fopen (file, "wb");
 	if (outputEncoding == kMelder_textOutputEncoding_UTF8) {
-		Melder_fwriteWcsAsUtf8 (text, wcslen (text), f);
+		Melder_fwrite32to8 (text, f);
 	} else if ((outputEncoding == kMelder_textOutputEncoding_ASCII_THEN_UTF16 && Melder_isValidAscii (text)) ||
 		(outputEncoding == kMelder_textOutputEncoding_ISO_LATIN1_THEN_UTF16 && Melder_isEncodable (text, kMelder_textOutputEncoding_ISO_LATIN1)))
 	{
@@ -134,48 +89,39 @@ void MelderFile_writeText (MelderFile file, const wchar_t *text, enum kMelder_te
 			#define putc_unlocked  putc
 		#endif
 		flockfile (f);
-		size_t n = wcslen (text);
+		size_t n = str32len (text);
 		for (size_t i = 0; i < n; i ++) {
-			char32_t kar = sizeof (wchar_t) == 2 ?
-				(char16_t) text [i] :   // don't extend sign
-				(char32_t) text [i];
+			char32 kar = text [i];
 			#ifdef _WIN32
-				if (kar == '\n') putc_unlocked (13, f);
+				if (kar == U'\n') putc_unlocked (13, f);
 			#endif
 			putc_unlocked (kar, f);
 		}
 		funlockfile (f);
 	} else {
 		binputu2 (0xFEFF, f);   // Byte Order Mark
-		size_t n = wcslen (text);
+		size_t n = str32len (text);
 		for (size_t i = 0; i < n; i ++) {
-			if (sizeof (wchar_t) == 2) {   // wchar_t is UTF-16?
-				char16_t kar = (char16_t) text [i];
-				#ifdef _WIN32
-					if (kar == '\n') binputu2 (13, f);
-				#endif
-				binputu2 (kar, f);
-			} else {   // wchar_t is UTF-32.
-				char32_t kar = (char32_t) text [i];
-				#ifdef _WIN32
-					if (kar == '\n') binputu2 (13, f);
-				#endif
-				if (kar <= 0x00FFFF) {
-					binputu2 ((char16_t) kar, f);   // guarded conversion down
-				} else if (kar <= 0x10FFFF) {
-					kar -= 0x010000;
-					binputu2 (0xD800 | (uint16_t) (kar >> 10), f);
-					binputu2 (0xDC00 | (uint16_t) ((char16_t) kar & 0x3ff), f);
-				} else {
-					binputu2 (UNICODE_REPLACEMENT_CHARACTER, f);
-				}
+			char32 kar = text [i];
+			#ifdef _WIN32
+				if (kar == U'\n') binputu2 (13, f);
+			#endif
+			if (kar <= 0x00FFFF) {
+				binputu2 ((char16) kar, f);   // guarded conversion down
+			} else if (kar <= 0x10FFFF) {
+				kar -= 0x010000;
+				binputu2 (0xD800 | (uint16) (kar >> 10), f);
+				binputu2 (0xDC00 | (uint16) ((char16) kar & 0x3ff), f);
+			} else {
+				binputu2 (UNICODE_REPLACEMENT_CHARACTER, f);
 			}
 		}
 	}
 	f.close (file);
 }
 
-void MelderFile_appendText (MelderFile file, const wchar_t *text) {
+void MelderFile_appendText (MelderFile file, const char32 *text) {
+	if (! text) text = U"";
 	autofile f1;
 	try {
 		f1.reset (Melder_fopen (file, "rb"));
@@ -199,7 +145,7 @@ void MelderFile_appendText (MelderFile file, const wchar_t *text) {
 		int outputEncoding = Melder_getOutputEncoding ();
 		if (outputEncoding == kMelder_textOutputEncoding_UTF8) {   // TODO: read as file's encoding
 			autofile f2 = Melder_fopen (file, "ab");
-			Melder_fwriteWcsAsUtf8 (text, wcslen (text), f2);
+			Melder_fwrite32to8 (text, f2);
 			f2.close (file);
 		} else if ((outputEncoding == kMelder_textOutputEncoding_ASCII_THEN_UTF16 && Melder_isEncodable (text, kMelder_textOutputEncoding_ASCII))
 		    || (outputEncoding == kMelder_textOutputEncoding_ISO_LATIN1_THEN_UTF16 && Melder_isEncodable (text, kMelder_textOutputEncoding_ISO_LATIN1)))
@@ -208,121 +154,87 @@ void MelderFile_appendText (MelderFile file, const wchar_t *text) {
 			 * Append ASCII or ISOLatin1 text to ASCII or ISOLatin1 file.
 			 */
 			autofile f2 = Melder_fopen (file, "ab");
-			size_t n = wcslen (text);
-			for (size_t i = 0; i < n; i ++) {
-				uint32_t kar = sizeof (wchar_t) == 2 ?
-					(uint16_t) text [i] :   // don't extend sign
-					(uint32_t) text [i];
+			int64 n = str32len (text);
+			for (int64 i = 0; i < n; i ++) {
+				char32 kar = text [i];
 				#ifdef _WIN32
-					if (kar == '\n') fputc (13, f2);
+					if (kar == U'\n') fputc (13, f2);
 				#endif
-				fputc ((uint8_t) kar, f2);
+				fputc ((char8) kar, f2);
 			}
 			f2.close (file);
 		} else {
 			/*
 			 * Convert to wide character file.
 			 */
-			autostring oldText = MelderFile_readText (file);
+			autostring32 oldText = MelderFile_readText (file);
 			autofile f2 = Melder_fopen (file, "wb");
 			binputu2 (0xfeff, f2);
-			size_t n = wcslen (oldText.peek());
-			for (size_t i = 0; i < n; i ++) {
-				if (sizeof (wchar_t) == 2) {   // wchar_t is UTF-16?
-					char16_t kar = (char16_t) oldText [i];   // reinterpret sign bit
-					#ifdef _WIN32
-						if (kar == '\n') binputu2 (13, f2);
-					#endif
-					binputu2 (kar, f2);
-				} else {   // wchar_t is UTF-32.
-					char32_t kar = (char32_t) oldText [i];   // sign bit is always 0
-					#ifdef _WIN32
-						if (kar == '\n') binputu2 (13, f2);
-					#endif
-					if (kar <= 0x0000FFFF) {
-						binputu2 ((uint16_t) kar, f2);   // guarded conversion down
-					} else if (kar <= 0x0010FFFF) {
-						kar -= 0x00010000;
-						binputu2 (0xD800 | (uint16_t) (kar >> 10), f2);
-						binputu2 (0xDC00 | (uint16_t) ((uint16_t) kar & 0x03ff), f2);
-					} else {
-						binputu2 (UNICODE_REPLACEMENT_CHARACTER, f2);
-					}
+			int64 n = str32len (oldText.peek());
+			for (int64 i = 0; i < n; i ++) {
+				char32 kar = oldText [i];
+				#ifdef _WIN32
+					if (kar == U'\n') binputu2 (13, f2);
+				#endif
+				if (kar <= 0x00FFFF) {
+					binputu2 ((uint16) kar, f2);   // guarded conversion down
+				} else if (kar <= 0x10FFFF) {
+					kar -= 0x010000;
+					binputu2 ((uint16) (0x00D800 | (kar >> 10)), f2);
+					binputu2 ((uint16) (0x00DC00 | (kar & 0x0003ff)), f2);
+				} else {
+					binputu2 (UNICODE_REPLACEMENT_CHARACTER, f2);
 				}
 			}
-			n = wcslen (text);
-			for (unsigned long i = 0; i < n; i ++) {
-				if (sizeof (wchar_t) == 2) {   // wchar_t is UTF-16?
-					char16_t kar = (char16_t) text [i];   // reinterpret sign bit
-					#ifdef _WIN32
-						if (kar == '\n') binputu2 (13, f2);
-					#endif
-					binputu2 (kar, f2);
-				} else {   // wchar_t is UTF-32.
-					char32_t kar = (char32_t) text [i];   // sign bit is always 0
-					#ifdef _WIN32
-						if (kar == '\n') binputu2 (13, f2);
-					#endif
-					if (kar <= 0x00FFFF) {
-						binputu2 ((char16_t) kar, f2);   // guarded conversion down
-					} else if (kar <= 0x10FFFF) {
-						kar -= 0x010000;
-						binputu2 (0xD800 | (char16_t) (kar >> 10), f2);
-						binputu2 (0xDC00 | (char16_t) ((char16_t) kar & 0x03ff), f2);
-					} else {
-						binputu2 (UNICODE_REPLACEMENT_CHARACTER, f2);
-					}
+			n = str32len (text);
+			for (int64 i = 0; i < n; i ++) {
+				char32 kar = text [i];
+				#ifdef _WIN32
+					if (kar == U'\n') binputu2 (13, f2);
+				#endif
+				if (kar <= 0x00FFFF) {
+					binputu2 ((uint16) kar, f2);   // guarded conversion down
+				} else if (kar <= 0x10FFFF) {
+					kar -= 0x010000;
+					binputu2 ((uint16) (0x00D800 | (kar >> 10)), f2);
+					binputu2 ((uint16) (0x00DC00 | (kar & 0x0003ff)), f2);
+				} else {
+					binputu2 (UNICODE_REPLACEMENT_CHARACTER, f2);
 				}
 			}
 			f2.close (file);
 		}
 	} else {
 		autofile f2 = Melder_fopen (file, "ab");
-		unsigned long n = wcslen (text);
-		for (unsigned long i = 0; i < n; i ++) {
+		int64 n = str32len (text);
+		for (int64 i = 0; i < n; i ++) {
 			if (type == 1) {
-				if (sizeof (wchar_t) == 2) {   // wchar_t is UTF-16?
-					uint16_t kar = (uint16_t) text [i];   // reinterpret sign bit
-					#ifdef _WIN32
-						if (kar == '\n') binputu2 (13, f2);
-					#endif
-					binputu2 (kar, f2);
-				} else {   // wchar_t is UTF-32
-					char32_t kar = (char32_t) text [i];   // sign bit is always 0
-					#ifdef _WIN32
-						if (kar == '\n') binputu2 (13, f2);
-					#endif
-					if (kar <= 0x00FFFF) {
-						binputu2 ((char16_t) kar, f2);   // guarded conversion down
-					} else if (kar <= 0x10FFFF) {
-						kar -= 0x010000;
-						binputu2 (0xD800 | (uint16_t) (kar >> 10), f2);
-						binputu2 (0xDC00 | (uint16_t) ((uint16_t) kar & 0x03ff), f2);
-					} else {
-						binputu2 (UNICODE_REPLACEMENT_CHARACTER, f2);
-					}
+				char32 kar = text [i];
+				#ifdef _WIN32
+					if (kar == U'\n') binputu2 (13, f2);
+				#endif
+				if (kar <= 0x00FFFF) {
+					binputu2 ((uint16) kar, f2);   // guarded conversion down
+				} else if (kar <= 0x10FFFF) {
+					kar -= 0x010000;
+					binputu2 ((uint16) (0x00D800 | (kar >> 10)), f2);
+					binputu2 ((uint16) (0x00DC00 | (kar & 0x0003ff)), f2);
+				} else {
+					binputu2 (UNICODE_REPLACEMENT_CHARACTER, f2);
 				}
 			} else {
-				if (sizeof (wchar_t) == 2) {   // wchar_t is UTF-16?
-					uint16_t kar = (uint16_t) text [i];   // reinterpret sign bit
-					#ifdef _WIN32
-						if (kar == '\n') binputu2LE (13, f2);
-					#endif
-					binputu2LE (kar, f2);
-				} else {   // wchar_t is UTF-32
-					char32_t kar = (char32_t) text [i];   // sign bit is always 0
-					#ifdef _WIN32
-						if (kar == '\n') binputu2LE (13, f2);
-					#endif
-					if (kar <= 0x00FFFF) {
-						binputu2LE ((char16_t) kar, f2);   // guarded conversion down
-					} else if (kar <= 0x10FFFF) {
-						kar -= 0x010000;
-						binputu2LE (0xD800 | (uint16_t) (kar >> 10), f2);
-						binputu2LE (0xDC00 | (uint16_t) ((uint16_t) kar & 0x3ff), f2);
-					} else {
-						binputu2LE (UNICODE_REPLACEMENT_CHARACTER, f2);
-					}
+				char32 kar = text [i];
+				#ifdef _WIN32
+					if (kar == U'\n') binputu2LE (13, f2);
+				#endif
+				if (kar <= 0x00FFFF) {
+					binputu2LE ((uint16) kar, f2);   // guarded conversion down
+				} else if (kar <= 0x10FFFF) {
+					kar -= 0x010000;
+					binputu2LE ((uint16) (0x00D800 | (kar >> 10)), f2);
+					binputu2LE ((uint16) (0x00DC00 | (kar & 0x0003ff)), f2);
+				} else {
+					binputu2LE (UNICODE_REPLACEMENT_CHARACTER, f2);
 				}
 			}
 		}
@@ -330,50 +242,29 @@ void MelderFile_appendText (MelderFile file, const wchar_t *text) {
 	}
 }
 
-static void _MelderFile_write (MelderFile file, const wchar_t *string) {
-	if (string == NULL) return;
-	size_t length = wcslen (string);
+static void _MelderFile_write (MelderFile file, const char32 *string) {
+	if (! string) return;
+	int64 length = str32len (string);
 	FILE *f = file -> filePointer;
 	if (file -> outputEncoding == kMelder_textOutputEncoding_ASCII || file -> outputEncoding == kMelder_textOutputEncoding_ISO_LATIN1) {
-		for (size_t i = 0; i < length; i ++) {
-			char kar = string [i];   // truncate
+		for (int64 i = 0; i < length; i ++) {
+			char kar = (char) (char8) string [i];   // truncate
 			if (kar == '\n' && file -> requiresCRLF) putc (13, f);
 			putc (kar, f);
 		}
 	} else if (file -> outputEncoding == kMelder_textOutputEncoding_UTF8) {
-		for (size_t i = 0; i < length; i ++) {
-			char32_t kar = sizeof (wchar_t) == 2 ?
-				(char16_t) string [i] :   // don't extend sign
-				(char32_t) string [i];
+		for (int64 i = 0; i < length; i ++) {
+			char32 kar = string [i];
 			if (kar <= 0x00007F) {
-				if (kar == '\n' && file -> requiresCRLF) putc (13, f);
+				if (kar == U'\n' && file -> requiresCRLF) putc (13, f);
 				putc ((int) kar, f);   // guarded conversion down
 			} else if (kar <= 0x0007FF) {
 				putc (0xC0 | (kar >> 6), f);
 				putc (0x80 | (kar & 0x00003F), f);
 			} else if (kar <= 0x00FFFF) {
-				if (sizeof (wchar_t) == 2) {
-					if ((kar & 0x00F800) == 0x00D800) {
-						if (kar > 0x00DBFF)
-							Melder_fatal ("Incorrect Unicode value (first surrogate member %lX).", kar);
-						char32_t kar2 = (char32_t) (char16_t) string [++ i];   // don't extend sign
-						if (kar2 < 0x00DC00 || kar2 > 0x00DFFF)
-							Melder_fatal ("Incorrect Unicode value (second surrogate member %lX).", kar2);
-						kar = (((kar & 0x0003FF) << 10) | (kar2 & 0x0003FF)) + 0x010000;   // decode UTF-16
-						putc (0xF0 | (kar >> 18), f);
-						putc (0x80 | ((kar >> 12) & 0x00003F), f);
-						putc (0x80 | ((kar >> 6) & 0x00003F), f);
-						putc (0x80 | (kar & 0x00003F), f);
-					} else {
-						putc (0xE0 | (kar >> 12), f);
-						putc (0x80 | ((kar >> 6) & 0x00003F), f);
-						putc (0x80 | (kar & 0x00003F), f);
-					}
-				} else {
-					putc (0xE0 | (kar >> 12), f);
-					putc (0x80 | ((kar >> 6) & 0x00003F), f);
-					putc (0x80 | (kar & 0x00003F), f);
-				}
+				putc (0xE0 | (kar >> 12), f);
+				putc (0x80 | ((kar >> 6) & 0x00003F), f);
+				putc (0x80 | (kar & 0x00003F), f);
 			} else {
 				putc (0xF0 | (kar >> 18), f);
 				putc (0x80 | ((kar >> 12) & 0x00003F), f);
@@ -382,66 +273,38 @@ static void _MelderFile_write (MelderFile file, const wchar_t *string) {
 			}
 		}
 	} else {
-		for (size_t i = 0; i < length; i ++) {
-			char32_t kar = sizeof (wchar_t) == 2 ?
-				(char16_t) string [i] :   // don't extend sign
-				(char32_t) string [i];
-			if (kar == '\n' && file -> requiresCRLF) binputu2 (13, f);
-			if (sizeof (wchar_t) == 2) {   // wchar_t is UTF-16?
-				binputu2 ((char16_t) kar, f);
-			} else {   // wchar_t is UTF-32.
-				if (kar <= 0x00FFFF) {
-					binputu2 ((char16_t) kar, f);
-				} else if (kar <= 0x10FFFF) {
-					kar -= 0x010000;
-					binputu2 (0xD800 | (char16_t) (kar >> 10), f);
-					binputu2 (0xDC00 | (char16_t) ((char16_t) kar & 0x03ff), f);
-				} else {
-					binputu2 (UNICODE_REPLACEMENT_CHARACTER, f);
-				}
+		for (int64 i = 0; i < length; i ++) {
+			char32 kar = string [i];
+			if (kar == U'\n' && file -> requiresCRLF) binputu2 (13, f);
+			if (kar <= 0x00FFFF) {
+				binputu2 ((char16) kar, f);
+			} else if (kar <= 0x10FFFF) {
+				kar -= 0x010000;
+				binputu2 (0xD800 | (char16) (kar >> 10), f);
+				binputu2 (0xDC00 | (char16) ((char16) kar & 0x03ff), f);
+			} else {
+				binputu2 (UNICODE_REPLACEMENT_CHARACTER, f);
 			}
 		}
 	}
 }
 
-void MelderFile_writeCharacter (MelderFile file, wchar_t character) {
+void MelderFile_writeCharacter (MelderFile file, char32 kar) {
 	FILE *f = file -> filePointer;
-	char32_t kar = sizeof (wchar_t) == 2 ?
-		(char16_t) character :   // don't extend sign
-		(char32_t) character;
 	if (file -> outputEncoding == kMelder_textOutputEncoding_ASCII || file -> outputEncoding == kMelder_textOutputEncoding_ISO_LATIN1) {
-		if (kar == '\n' && file -> requiresCRLF) putc (13, f);
-		putc (kar, f);
+		if (kar == U'\n' && file -> requiresCRLF) putc (13, f);
+		putc ((int) kar, f);
 	} else if (file -> outputEncoding == kMelder_textOutputEncoding_UTF8) {
 		if (kar <= 0x00007F) {
-			if (kar == '\n' && file -> requiresCRLF) putc (13, f);
+			if (kar == U'\n' && file -> requiresCRLF) putc (13, f);
 			putc ((int) kar, f);   // guarded conversion down
 		} else if (kar <= 0x0007FF) {
 			putc (0xC0 | (kar >> 6), f);
 			putc (0x80 | (kar & 0x00003F), f);
 		} else if (kar <= 0x00FFFF) {
-			if (sizeof (wchar_t) == 2) {
-				if ((kar & 0x00F800) == 0x00D800) {
-					static char32_t buffer;   // NOT REENTRANT
-					if (kar >= 0x00D800 && kar <= 0x00DBFF) {
-						buffer = kar;
-					} else {
-						kar = (((buffer & 0x3FF) << 10) | (kar & 0x3FF)) + 0x10000;   // decode UTF-16
-						putc (0xF0 | (kar >> 18), f);
-						putc (0x80 | ((kar >> 12) & 0x00003F), f);
-						putc (0x80 | ((kar >> 6) & 0x00003F), f);
-						putc (0x80 | (kar & 0x00003F), f);
-					}
-				} else {
-					putc (0xE0 | (kar >> 12), f);
-					putc (0x80 | ((kar >> 6) & 0x00003F), f);
-					putc (0x80 | (kar & 0x00003F), f);
-				}
-			} else {
-				putc (0xE0 | (kar >> 12), f);
-				putc (0x80 | ((kar >> 6) & 0x00003F), f);
-				putc (0x80 | (kar & 0x00003F), f);
-			}
+			putc (0xE0 | (kar >> 12), f);
+			putc (0x80 | ((kar >> 6) & 0x00003F), f);
+			putc (0x80 | (kar & 0x00003F), f);
 		} else {
 			putc (0xF0 | (kar >> 18), f);
 			putc (0x80 | ((kar >> 12) & 0x00003F), f);
@@ -449,104 +312,173 @@ void MelderFile_writeCharacter (MelderFile file, wchar_t character) {
 			putc (0x80 | (kar & 0x00003F), f);
 		}
 	} else {
-		if (kar == '\n' && file -> requiresCRLF) binputu2 (13, f);
-		if (sizeof (wchar_t) == 2) {   // wchar_t is UTF-16?
-			binputu2 ((uint16_t) kar, f);
-		} else {   // wchar_t is UTF-32.
-			if (kar <= 0x0000FFFF) {
-				binputu2 ((uint16_t) kar, f);
-			} else if (kar <= 0x0010FFFF) {
-				kar -= 0x00010000;
-				binputu2 (0xD800 | (uint16_t) (kar >> 10), f);
-				binputu2 (0xDC00 | (uint16_t) ((uint16_t) kar & 0x03ff), f);
-			} else {
-				binputu2 (UNICODE_REPLACEMENT_CHARACTER, f);
-			}
+		if (kar == U'\n' && file -> requiresCRLF) binputu2 (13, f);
+		if (kar <= 0x00FFFF) {
+			binputu2 ((uint16) kar, f);
+		} else if (kar <= 0x10FFFF) {
+			kar -= 0x010000;
+			binputu2 (0xD800 | (uint16) (kar >> 10), f);
+			binputu2 (0xDC00 | (uint16) ((uint16) kar & 0x0003ff), f);
+		} else {
+			binputu2 (UNICODE_REPLACEMENT_CHARACTER, f);
 		}
 	}
 }
 
-void MelderFile_write (MelderFile file, const wchar_t *s1) {
-	if (file -> filePointer == NULL) return;
-	_MelderFile_write (file, s1);
+void MelderFile_write (MelderFile file, Melder_1_ARG) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+}
+void MelderFile_write (MelderFile file, Melder_2_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+}
+void MelderFile_write (MelderFile file, Melder_3_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+}
+void MelderFile_write (MelderFile file, Melder_4_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+}
+void MelderFile_write (MelderFile file, Melder_5_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+	_MelderFile_write (file, arg5. _arg);
+}
+void MelderFile_write (MelderFile file, Melder_6_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+	_MelderFile_write (file, arg5. _arg);
+	_MelderFile_write (file, arg6. _arg);
 }
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2) {
-	if (file -> filePointer == NULL) return;
-	_MelderFile_write (file, s1);
-	_MelderFile_write (file, s2);
+void MelderFile_write (MelderFile file, Melder_7_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+	_MelderFile_write (file, arg5. _arg);
+	_MelderFile_write (file, arg6. _arg);
+	_MelderFile_write (file, arg7. _arg);
 }
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3) {
-	if (file -> filePointer == NULL) return;
-	_MelderFile_write (file, s1);
-	_MelderFile_write (file, s2);
-	_MelderFile_write (file, s3);
+void MelderFile_write (MelderFile file, Melder_8_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+	_MelderFile_write (file, arg5. _arg);
+	_MelderFile_write (file, arg6. _arg);
+	_MelderFile_write (file, arg7. _arg);
+	_MelderFile_write (file, arg8. _arg);
 }
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4) {
-	if (file -> filePointer == NULL) return;
-	_MelderFile_write (file, s1);
-	_MelderFile_write (file, s2);
-	_MelderFile_write (file, s3);
-	_MelderFile_write (file, s4);
+void MelderFile_write (MelderFile file, Melder_9_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+	_MelderFile_write (file, arg5. _arg);
+	_MelderFile_write (file, arg6. _arg);
+	_MelderFile_write (file, arg7. _arg);
+	_MelderFile_write (file, arg8. _arg);
+	_MelderFile_write (file, arg9. _arg);
 }
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5)
-{
-	if (file -> filePointer == NULL) return;
-	_MelderFile_write (file, s1);
-	_MelderFile_write (file, s2);
-	_MelderFile_write (file, s3);
-	_MelderFile_write (file, s4);
-	_MelderFile_write (file, s5);
+void MelderFile_write (MelderFile file, Melder_10_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+	_MelderFile_write (file, arg5. _arg);
+	_MelderFile_write (file, arg6. _arg);
+	_MelderFile_write (file, arg7. _arg);
+	_MelderFile_write (file, arg8. _arg);
+	_MelderFile_write (file, arg9. _arg);
+	_MelderFile_write (file, arg10._arg);
 }
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6)
-{
-	if (file -> filePointer == NULL) return;
-	_MelderFile_write (file, s1);
-	_MelderFile_write (file, s2);
-	_MelderFile_write (file, s3);
-	_MelderFile_write (file, s4);
-	_MelderFile_write (file, s5);
-	_MelderFile_write (file, s6);
+void MelderFile_write (MelderFile file, Melder_11_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+	_MelderFile_write (file, arg5. _arg);
+	_MelderFile_write (file, arg6. _arg);
+	_MelderFile_write (file, arg7. _arg);
+	_MelderFile_write (file, arg8. _arg);
+	_MelderFile_write (file, arg9. _arg);
+	_MelderFile_write (file, arg10._arg);
+	_MelderFile_write (file, arg11._arg);
 }
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6, const wchar_t *s7)
-{
-	if (file -> filePointer == NULL) return;
-	_MelderFile_write (file, s1);
-	_MelderFile_write (file, s2);
-	_MelderFile_write (file, s3);
-	_MelderFile_write (file, s4);
-	_MelderFile_write (file, s5);
-	_MelderFile_write (file, s6);
-	_MelderFile_write (file, s7);
+void MelderFile_write (MelderFile file, Melder_13_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+	_MelderFile_write (file, arg5. _arg);
+	_MelderFile_write (file, arg6. _arg);
+	_MelderFile_write (file, arg7. _arg);
+	_MelderFile_write (file, arg8. _arg);
+	_MelderFile_write (file, arg9. _arg);
+	_MelderFile_write (file, arg10._arg);
+	_MelderFile_write (file, arg11._arg);
+	_MelderFile_write (file, arg12._arg);
+	_MelderFile_write (file, arg13._arg);
 }
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8)
-{
-	if (file -> filePointer == NULL) return;
-	_MelderFile_write (file, s1);
-	_MelderFile_write (file, s2);
-	_MelderFile_write (file, s3);
-	_MelderFile_write (file, s4);
-	_MelderFile_write (file, s5);
-	_MelderFile_write (file, s6);
-	_MelderFile_write (file, s7);
-	_MelderFile_write (file, s8);
+void MelderFile_write (MelderFile file, Melder_15_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+	_MelderFile_write (file, arg5. _arg);
+	_MelderFile_write (file, arg6. _arg);
+	_MelderFile_write (file, arg7. _arg);
+	_MelderFile_write (file, arg8. _arg);
+	_MelderFile_write (file, arg9. _arg);
+	_MelderFile_write (file, arg10._arg);
+	_MelderFile_write (file, arg11._arg);
+	_MelderFile_write (file, arg12._arg);
+	_MelderFile_write (file, arg13._arg);
+	_MelderFile_write (file, arg14._arg);
+	_MelderFile_write (file, arg15._arg);
 }
-void MelderFile_write (MelderFile file, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4,
-	const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9)
-{
-	if (file -> filePointer == NULL) return;
-	_MelderFile_write (file, s1);
-	_MelderFile_write (file, s2);
-	_MelderFile_write (file, s3);
-	_MelderFile_write (file, s4);
-	_MelderFile_write (file, s5);
-	_MelderFile_write (file, s6);
-	_MelderFile_write (file, s7);
-	_MelderFile_write (file, s8);
-	_MelderFile_write (file, s9);
+void MelderFile_write (MelderFile file, Melder_19_ARGS) {
+	if (! file -> filePointer) return;
+	_MelderFile_write (file, arg1. _arg);
+	_MelderFile_write (file, arg2. _arg);
+	_MelderFile_write (file, arg3. _arg);
+	_MelderFile_write (file, arg4. _arg);
+	_MelderFile_write (file, arg5. _arg);
+	_MelderFile_write (file, arg6. _arg);
+	_MelderFile_write (file, arg7. _arg);
+	_MelderFile_write (file, arg8. _arg);
+	_MelderFile_write (file, arg9. _arg);
+	_MelderFile_write (file, arg10._arg);
+	_MelderFile_write (file, arg11._arg);
+	_MelderFile_write (file, arg12._arg);
+	_MelderFile_write (file, arg13._arg);
+	_MelderFile_write (file, arg14._arg);
+	_MelderFile_write (file, arg15._arg);
+	_MelderFile_write (file, arg16._arg);
+	_MelderFile_write (file, arg17._arg);
+	_MelderFile_write (file, arg18._arg);
+	_MelderFile_write (file, arg19._arg);
 }
 
 /* End of file melder_writetext.cpp */
diff --git a/sys/motifEmulator.cpp b/sys/motifEmulator.cpp
index c4b918e..239ad6a 100644
--- a/sys/motifEmulator.cpp
+++ b/sys/motifEmulator.cpp
@@ -1,6 +1,6 @@
 /* motifEmulator.cpp
  *
- * Copyright (C) 1993-2011,2012 Paul Boersma
+ * Copyright (C) 1993-2011,2012,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -35,7 +35,7 @@
  * pb 2007/01/25 XmATTACH_POSITION
  * pb 2007/02/13 Win: removed Ctrl-. as meaning Escape
  * pb 2007/08/07 GuiMacDrawingArea_clipOn_graphicsContext
- * pb 2007/10/06 wchar_t
+ * pb 2007/10/06 wchar
  * pb 2007/10/16 Unicode support in lists
  * pb 2007/12/15 userData
  * pb 2007/12/26 extractions to Gui*.c
@@ -59,7 +59,7 @@
 #include "machine.h"
 
 static void (*theOpenDocumentCallback) (MelderFile file);
-static int (*theQuitApplicationCallback) (void);
+static int (*theQuitApplicationCallback) ();
 
 #if defined (macintosh) && useCarbon || defined (_WIN32)
 
@@ -91,7 +91,7 @@ static int (*theQuitApplicationCallback) (void);
 #define _motif_OPTION_MASK  4
 
 #if mac
-	void motif_mac_defaultFont (void) {
+	void motif_mac_defaultFont () {
 		TextFont (systemFont);
 		TextSize (13);
 		TextFace (0);
@@ -143,7 +143,7 @@ static const char *motif_resourceNames [] = {
 
 /* Modes. */
 
-struct Gui theGui;   /* Global variable. */
+struct Gui theGui;   // global variable
 
 /********** XWindows routines. **********/
 
@@ -209,29 +209,27 @@ void _Gui_callCallbacks (GuiObject w, XtCallbackList *callbacks, XtPointer call)
 #elif mac
 	#define MAXIMUM_NUMBER_OF_MENUS  32767
 #endif
-static GuiObject theMenus [1+MAXIMUM_NUMBER_OF_MENUS];   /* We can freely use and reuse these menu ids */
+static GuiObject theMenus [1+MAXIMUM_NUMBER_OF_MENUS];   // we can freely use and reuse these menu ids
 #if win
-	static int theCommandShow = False;   /* Last argument of WinMain. */
-	static wchar_t theApplicationName [100], theWindowClassName [100], theDrawingAreaClassName [100], theApplicationClassName [100];
-	wchar_t * _GuiWin_getDrawingAreaClassName (void) { return theDrawingAreaClassName; }
-	static int (*theUserMessageCallback) (void);
+	static char32 theApplicationName [100], theWindowClassName [100], theDrawingAreaClassName [100], theApplicationClassName [100];
+	char32 * _GuiWin_getDrawingAreaClassName () { return theDrawingAreaClassName; }
+	static int (*theUserMessageCallback) ();
 	#define MINIMUM_MENU_ITEM_ID  (MAXIMUM_NUMBER_OF_MENUS + 1)
 	#define MAXIMUM_MENU_ITEM_ID  32767
-	static short theMenuItems [1+MAXIMUM_MENU_ITEM_ID];   /* We can freely use and reuse the item ids 4001..32767 */
+	static short theMenuItems [1+MAXIMUM_MENU_ITEM_ID];   // we can freely use and reuse the item ids 4001..32767
 #elif mac
-	static GuiObject theMenuBar;   /* There is only one menu bar on the Macintosh. */
-	static int theHelpMenuOffset;   /* The number of items in the global help menu before we add the first item. */
-	static int (*theUserMessageCallbackA) (char *message);
-	static int (*theUserMessageCallbackW) (wchar_t *message);
+	static GuiObject theMenuBar;   // there is only one menu bar on the Macintosh
+	static int theHelpMenuOffset;   // the number of items in the global help menu before we add the first item
+	static int (*theUserMessageCallback) (char32 *message);
 #endif
 
-static GuiObject theApplicationShell;   /* For global menus. */
+static GuiObject theApplicationShell;   // for global menus
 #define MAXIMUM_NUMBER_OF_SHELLS  1000
-static GuiObject theShells [MAXIMUM_NUMBER_OF_SHELLS];   /* For XmUpdateDisplay and suspend events. */
-static int theBackground = False;   /* Set by suspend and resume events; used by Motif-style activation methods. */
-static int theDialogHint = False;   /* Should the shell that is currently being created, have dialog or document looks? */
+static GuiObject theShells [MAXIMUM_NUMBER_OF_SHELLS];   // for XmUpdateDisplay and suspend events
+static int theBackground = False;   // set by suspend and resume events; used by Motif-style activation methods
+static int theDialogHint = False;   // should the shell that is currently being created, have dialog or document looks?
 long numberOfWidgets = 0;
-long Gui_getNumberOfMotifWidgets (void) { return numberOfWidgets; }
+long Gui_getNumberOfMotifWidgets () { return numberOfWidgets; }
 
 static void _motif_addShell (GuiObject me) {
 	int i;
@@ -261,7 +259,7 @@ static XtPointer theTimeOutClosures [10];
 	static unsigned long theTimeOutIntervals [10];
 #endif
 
-static void Native_move (GuiObject w, int dx, int dy);   /* Forward. */
+static void Native_move (GuiObject w, int dx, int dy);   // forward
 
 static void cb_scroll (GuiObject scrollBar, XtPointer closure, XtPointer call) {
 	GuiObject scrolledWindow = (GuiObject) closure;
@@ -278,7 +276,7 @@ static void cb_scroll (GuiObject scrollBar, XtPointer closure, XtPointer call) {
 	#elif mac
 		previousShift = horizontal ?
 			scrolledWindow -> motiff.scrolledWindow.clipWindow -> rect. left - workWindow -> rect. left :
-			scrolledWindow -> motiff.scrolledWindow.clipWindow -> rect. top - workWindow -> rect. top;   /* different? */
+			scrolledWindow -> motiff.scrolledWindow.clipWindow -> rect. top - workWindow -> rect. top;   // different?
 	#endif
 	newShift = scrollBar -> value;
 	distance = previousShift - newShift;
@@ -286,7 +284,7 @@ static void cb_scroll (GuiObject scrollBar, XtPointer closure, XtPointer call) {
 		{ workWindow -> x += distance; Native_move (workWindow, distance, 0); }
 	else
 		{ workWindow -> y += distance; Native_move (workWindow, 0, distance); }
-	XmUpdateDisplay (NULL);   /* If dragging. */
+	XmUpdateDisplay (NULL);   // if dragging
 }
 
 /* These are like the toolkit's query_geometry methods: */
@@ -296,16 +294,17 @@ static int Native_titleWidth (GuiObject me) {
 		if (my parent -> window) {
 			HDC dc = GetDC (my parent -> window);
 			SIZE size;
-			SelectFont (dc, GetStockFont (ANSI_VAR_FONT));   /* Possible BUG. */
-			GetTextExtentPoint32 (dc, my name, wcslen (my name), & size);
+			SelectFont (dc, GetStockFont (ANSI_VAR_FONT));   // possible BUG
+			WCHAR *nameW = Melder_peek32toW (my name);
+			GetTextExtentPoint32 (dc, nameW, wcslen (nameW), & size);
 			ReleaseDC (my parent -> window, dc);
 			return size. cx;
-		} else return 7 * wcslen (my name);
+		} else return 7 * str32len (my name);
 	#elif mac
 		int width;
 		SetPortWindowPort (my macWindow);
 		motif_mac_defaultFont ();
-		char *nameA = Melder_peekWcsToUtf8 (my name);
+		char *nameA = Melder_peek32to8 (my name);
 		width = TextWidth ((Ptr) nameA, 0, strlen (nameA));
 		motif_mac_defaultFont ();
 		return width;
@@ -332,7 +331,7 @@ static int NativeButton_preferredHeight (GuiObject me) {
 
 /***** WIDGET *****/
 
-GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const wchar_t *name) {
+GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const char32 *name) {
 	GuiObject me = Melder_calloc_f (struct structGuiObject, 1);
 	if (Melder_debug == 34) fprintf (stderr, "from _Gui_initializeWidget\t%p\t%ld\t%ld\n", me, 1L, (long) sizeof (struct structGuiObject));
 	my magicNumber = 15111959;
@@ -358,7 +357,7 @@ GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const wchar_
 	/*
 	 * Copy the name into my name.
 	 */
-	my name = Melder_wcsdup_f (name);
+	my name = Melder_dup_f (name);
 
 	/*
 	 * I am in the same shell as my parent, so I inherit my parent's "shell" attribute.
@@ -421,14 +420,14 @@ GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const wchar_
 			my height = Gui_LABEL_HEIGHT;
 		} break; case xmCascadeButtonWidgetClass: {
 			if (my parent -> rowColumnType == XmMENU_BAR) {
-				wchar_t *hyphen = wcsstr (my name, L" -");
-				if (hyphen) hyphen [2] = '\0';   /* Chop any trailing spaces. */
+				char32 *hyphen = str32str (my name, U" -");
+				if (hyphen) hyphen [2] = U'\0';   // chop any trailing spaces
 				my x = 2;
 				my y = 2;
 				my width = NativeButton_preferredWidth (me);
-				my height = NativeButton_preferredHeight (me) + 4;   /* BUG: menu bar should be large enough. */
+				my height = NativeButton_preferredHeight (me) + 4;   // BUG: menu bar should be large enough
 			} else {
-				my motiff.cascadeButton.inBar = TRUE;
+				my motiff.cascadeButton.inBar = true;
 			}
 		} break; case xmToggleButtonWidgetClass: {
 			my x = 2;
@@ -486,7 +485,7 @@ GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const wchar_
 		} break; case xmScrolledWindowWidgetClass: {
 			my x = 1;
 			my y = 1;
-			my width = parent -> width - 17;   /* Exact fit: scroll bar (16) plus border (1). */
+			my width = parent -> width - 17;   // exact fit: scroll bar (16) plus border (1)
 			my height = parent -> height - 17;
 			if (my widgetClass == xmTextWidgetClass) { my width = 3000; my height = 30000; }   // BUG: either put in GuiText or erase
 		}
@@ -510,7 +509,7 @@ GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const wchar_
 	if (MEMBER2 (me, BulletinBoard, Form) && MEMBER (my parent, Shell))
 		my leftAttachment = my rightAttachment = my topAttachment = my bottomAttachment = XmATTACH_FORM;
 
-	if (MEMBER (me, CascadeButton) && wcsequ (name, L"Help"))
+	if (MEMBER (me, CascadeButton) && str32equ (name, U"Help"))
 		my rightAttachment = XmATTACH_FORM;   /* !!!!!! */
 
 	/* A child of a scrolled window will be installed as the workWindow of that scrolled window,
@@ -521,9 +520,9 @@ GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const wchar_
 	 */
 
 	if (my parent && MEMBER (my parent, ScrolledWindow) &&
-		! MEMBER (me, ScrollBar) &&   /* 'me' is one of the two scroll bars, or a new one. */
-		my parent -> motiff.scrolledWindow.clipWindow != NULL)   /* 'me' is probably the clip window now. */
-			my parent -> motiff.scrolledWindow.workWindow = me;   /* Install. */
+		! MEMBER (me, ScrollBar) &&   // 'me' is one of the two scroll bars, or a new one
+		my parent -> motiff.scrolledWindow.clipWindow != NULL)   // 'me' is probably the clip window now
+			my parent -> motiff.scrolledWindow.workWindow = me;   // install
 	return me;
 }
 
@@ -550,7 +549,7 @@ GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const wchar_
 				if (MEMBER (me, ScrollBar)) {
 					parentRect = & my rect;
 				} else {
-					if (parent -> motiff.scrolledWindow.clipWindow == NULL) return;   /* During destruction. */
+					if (parent -> motiff.scrolledWindow.clipWindow == NULL) return;   // during destruction
 					parentRect = & parent -> motiff.scrolledWindow.clipWindow -> rect;
 				}
 			}
@@ -566,7 +565,7 @@ GuiObject _Gui_initializeWidget (int widgetClass, GuiObject parent, const wchar_
 		_motif_clipRect = clipRect;
 	}
 
-	void GuiMac_clipOff (void) { ClipRect (& _motif_wideRect); }
+	void GuiMac_clipOff () { ClipRect (& _motif_wideRect); }
 
 	void _GuiMac_clipOffValid (GuiObject me) {
 		Rect clipRect = _motif_clipRect;
@@ -700,11 +699,11 @@ void _GuiNativeControl_setSensitive (GuiObject me) {
 	#endif
 }
 
-wchar_t * _GuiWin_expandAmpersands (const wchar_t *title) {
-	static wchar_t buffer [300];
-	const wchar_t *from = title;
-	wchar_t *to = & buffer [0];
-	while (*from) { if (*from == '&') * to ++ = '&'; * to ++ = * from ++; } * to = '\0';
+char32 * _GuiWin_expandAmpersands (const char32 *title) {
+	static char32 buffer [300];
+	const char32 *from = title;
+	char32 *to = & buffer [0];
+	while (*from) { if (*from == U'&') * to ++ = U'&'; * to ++ = * from ++; } * to = U'\0';
 	return buffer;
 }
 
@@ -715,14 +714,14 @@ void _GuiNativeControl_setTitle (GuiObject me) {
 		SelectBrush (dc, GetStockBrush (LTGRAY_BRUSH));
 		Rectangle (dc, 0, 0, my width, my height);
 		ReleaseDC (my window, dc);
-		SetWindowText (my window, _GuiWin_expandAmpersands (my name));
+		SetWindowTextW (my window, Melder_peek32toW (_GuiWin_expandAmpersands (my name)));
 	#elif mac
 		Melder_assert (my nat.control.handle);
 		if (my widgetClass == xmLabelWidgetClass) {
 			/*
 			 * Static Text controls on the Mac do not understand SetControlTitle.
 			 */
-			CFStringRef cfString = (CFStringRef) Melder_peekWcsToCfstring (my name);
+			CFStringRef cfString = (CFStringRef) Melder_peek32toCfstring (my name);
 			SetControlData (my nat.control.handle, kControlEntireControl, kControlStaticTextCFStringTag, sizeof (CFStringRef), & cfString);
 			/* SetControlData does not redraw the control. */
 			if (IsControlVisible (my nat.control.handle))
@@ -730,29 +729,29 @@ void _GuiNativeControl_setTitle (GuiObject me) {
 		} else if (my nat.control.isPopup) {
 			GuiObject menu = my subMenuId, item;
 			if (menu) for (item = menu -> firstChild; item; item = item -> nextSibling) {
-				if (wcsequ (item -> name, my name)) {
+				if (str32equ (item -> name, my name)) {
 					SetControlValue (my nat.control.handle, item -> nat.entry.item);
 					return;
 				}
 			}
 			SetControlValue (my nat.control.handle, 0);
 		} else {
-			SetControlTitleWithCFString (my nat.control.handle, (CFStringRef) Melder_peekWcsToCfstring (my name));
+			SetControlTitleWithCFString (my nat.control.handle, (CFStringRef) Melder_peek32toCfstring (my name));
 		}
 	#endif
 }
 
 static int _XmScrollBar_check (GuiObject me) {
 	if (my maximum < my minimum)
-		Melder_warning ("XmScrollBar: maximum (", my maximum, ") less than minimum (", my minimum, ").");
+		Melder_warning (U"XmScrollBar: maximum (", my maximum, U") less than minimum (", my minimum, U").");
 	else if (my sliderSize > my maximum - my minimum)
-		Melder_warning ("XmScrollBar: slider size (", my sliderSize, ") greater than maximum (",
-			my maximum, ") minus minimum (", my minimum, ").");
+		Melder_warning (U"XmScrollBar: slider size (", my sliderSize, U") greater than maximum (",
+			my maximum, U") minus minimum (", my minimum, U").");
 	else if (my value < my minimum)
-		Melder_warning ("XmScrollBar: value (", my value, ") less than minimum (", my minimum, ").");
+		Melder_warning (U"XmScrollBar: value (", my value, U") less than minimum (", my minimum, U").");
 	else if (my value > my maximum - my sliderSize)
-		Melder_warning ("XmScrollBar: value (", my value, ") greater than maximum (",
-			my maximum, ") minus slider size (", my sliderSize, ").");
+		Melder_warning (U"XmScrollBar: value (", my value, U") greater than maximum (",
+			my maximum, U") minus slider size (", my sliderSize, U").");
 	else return 1;
 	return 0;
 }
@@ -782,7 +781,7 @@ static void NativeScrollBar_set (GuiObject me) {
 			scrollInfo. nPage = my sliderSize;
 			scrollInfo. nPos = my value;
 		#endif
-		if (my window) SetScrollInfo (my window, SB_CTL, & scrollInfo, TRUE);
+		if (my window) SetScrollInfo (my window, SB_CTL, & scrollInfo, true);
 	}
 	#elif mac
 		if (! my nat.control.handle) return;
@@ -797,7 +796,7 @@ static void NativeMenuItem_delete (GuiObject me) {
 	#if win
 		RemoveMenu (my nat.entry.handle, my nat.entry.id, MF_BYCOMMAND);
 	#elif mac
-		trace ("begin");
+		trace (U"begin");
 		GuiObject subview;
 		DeleteMenuItem (my nat.entry.handle, my nat.entry.item);
 		for (subview = my parent -> firstChild; subview; subview = subview -> nextSibling) {
@@ -844,7 +843,7 @@ static int NativeMenuItem_getPosition (GuiObject me) {
 		 */
 		while (prev && (MEMBER (prev, PulldownMenu) || ! prev -> managed))
 			prev = prev -> previousSibling;
-		if (prev) {   /* Is there a previous managed non-pulldown sibling? */
+		if (prev) {   // is there a previous managed non-pulldown sibling?
 			position = prev -> nat.entry.item + 1;   /* Then I must be the next item in the native menu structure. */
 		} else {
 			/*
@@ -852,12 +851,12 @@ static int NativeMenuItem_getPosition (GuiObject me) {
 			 * However, if the menu is the system's help menu (the question mark in System 7),
 			 * the menu already contains a button called "Show balloon help".
 			 */
-			if (my parent -> nat.menu.id == kHMHelpMenuID) {   /* Is this the system help menu? */
-				if (theHelpMenuOffset == 0)   /* Haven't we asked yet for the length of the system help menu? */
-					theHelpMenuOffset = CountMenuItems (my nat.entry.handle);   /* So ask now. */
-				position = theHelpMenuOffset + 1;   /* Then I must be the next item in the native menu structure. */
-			} else {   /* This must be a menu of our own. */
-				position = 1;   /* I must be the first item in the native menu structure. */
+			if (my parent -> nat.menu.id == kHMHelpMenuID) {   // is this the system help menu?
+				if (theHelpMenuOffset == 0)   // haven't we asked yet for the length of the system help menu?
+					theHelpMenuOffset = CountMenuItems (my nat.entry.handle);   // so ask now
+				position = theHelpMenuOffset + 1;   // then I must be the next item in the native menu structure
+			} else {   // this must be a menu of our own
+				position = 1;   // I must be the first item in the native menu structure
 			}
 		}
 	#endif
@@ -893,31 +892,30 @@ static void NativeMenuItem_setText (GuiObject me) {
 		if (acc == 0) {
 			MelderString_copy (& title, _GuiWin_expandAmpersands (my name));
 		} else {
-			static const wchar_t *keyStrings [256] = {
-				0, L"<-", L"->", L"Up", L"Down", L"PAUSE", L"Del", L"Ins", L"Backspace", L"Tab", L"LineFeed", L"Home", L"End", L"Enter", L"PageUp", L"PageDown",
-				L"Esc", L"F1", L"F2", L"F3", L"F4", L"F5", L"F6", L"F7", L"F8", L"F9", L"F10", L"F11", L"F12", 0, 0, 0,
-				L"Space", L"!", L"\"", L"#", L"$", L"%", L"&", L"\'", L"(", L")", L"*", L"+", L",", L"-", L".", L"/",
-				L"0", L"1", L"2", L"3", L"4", L"5", L"6", L"7", L"8", L"9", L":", L";", L"<", L"=", L">", L"?",
-				L"@", L"A", L"B", L"C", L"D", L"E", L"F", L"G", L"H", L"I", L"J", L"K", L"L", L"M", L"N", L"O",
-				L"P", L"Q", L"R", L"S", L"T", L"U", L"V", L"W", L"X", L"Y", L"Z", L"[", L"\\", L"]", L"^", L"_",
-				L"`", L"a", L"b", L"c", L"d", L"e", L"f", L"g", L"h", L"i", L"j", L"k", L"l", L"m", L"n", L"o",
-				L"p", L"q", L"r", L"s", L"t", L"u", L"v", L"w", L"x", L"y", L"z", L"{", L"|", L"}", L"~", L"Del",
+			static const char32 *keyStrings [256] = {
+				0, U"<-", U"->", U"Up", U"Down", U"PAUSE", U"Del", U"Ins", U"Backspace", U"Tab", U"LineFeed", U"Home", U"End", U"Enter", U"PageUp", U"PageDown",
+				U"Esc", U"F1", U"F2", U"F3", U"F4", U"F5", U"F6", U"F7", U"F8", U"F9", U"F10", U"F11", U"F12", 0, 0, 0,
+				U"Space", U"!", U"\"", U"#", U"$", U"%", U"&", U"\'", U"(", U")", U"*", U"+", U",", U"-", U".", U"/",
+				U"0", U"1", U"2", U"3", U"4", U"5", U"6", U"7", U"8", U"9", U":", U";", U"<", U"=", U">", U"?",
+				U"@", U"A", U"B", U"C", U"D", U"E", U"F", U"G", U"H", U"I", U"J", U"K", U"L", U"M", U"N", U"O",
+				U"P", U"Q", U"R", U"S", U"T", U"U", U"V", U"W", U"X", U"Y", U"Z", U"[", U"\\", U"]", U"^", U"_",
+				U"`", U"a", U"b", U"c", U"d", U"e", U"f", U"g", U"h", U"i", U"j", U"k", U"l", U"m", U"n", U"o",
+				U"p", U"q", U"r", U"s", U"t", U"u", U"v", U"w", U"x", U"y", U"z", U"{", U"|", U"}", U"~", U"Del",
 				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"[", L"]", L",", L"?", L".", L"\\",
-				L";", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"-", L"`", L"=", L"\'", 0,
+				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, U"[", U"]", U",", U"?", U".", U"\\",
+				U";", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, U"-", U"`", U"=", U"\'", 0,
 				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 				0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-			const wchar_t *keyString = keyStrings [acc] ? keyStrings [acc] : L"???";
-			MelderString_empty (& title);
-			MelderString_append (&title, _GuiWin_expandAmpersands (my name), L"\t",
-				modifiers & _motif_COMMAND_MASK ? L"Ctrl-" : NULL,
-				modifiers & _motif_OPTION_MASK ? L"Alt-" : NULL,
-				modifiers & _motif_SHIFT_MASK ? L"Shift-" : NULL, keyString);
+			const char32 *keyString = keyStrings [acc] ? keyStrings [acc] : U"???";
+			MelderString_copy (& title, _GuiWin_expandAmpersands (my name), U"\t",
+				modifiers & _motif_COMMAND_MASK ? U"Ctrl-" : NULL,
+				modifiers & _motif_OPTION_MASK ? U"Alt-" : NULL,
+				modifiers & _motif_SHIFT_MASK ? U"Shift-" : NULL, keyString);
 		}
-		ModifyMenu (my nat.entry.handle, my nat.entry.id, MF_BYCOMMAND | MF_STRING, my nat.entry.id, title.string);
+		ModifyMenu (my nat.entry.handle, my nat.entry.id, MF_BYCOMMAND | MF_STRING, my nat.entry.id, Melder_peek32toW (title.string));
 	#elif mac
 		static int theGlyphs [1+31] = { 0,
 			kMenuLeftArrowDashedGlyph, kMenuRightArrowDashedGlyph, kMenuUpArrowDashedGlyph, kMenuDownwardArrowDashedGlyph, 0,
@@ -927,12 +925,12 @@ static void NativeMenuItem_setText (GuiObject me) {
 			kMenuF5Glyph, kMenuF6Glyph, kMenuF7Glyph, kMenuF8Glyph, kMenuF9Glyph,
 			kMenuF10Glyph, kMenuF11Glyph, kMenuF12Glyph, 0, 0,
 			0 };
-		SetMenuItemTextWithCFString (my nat.entry.handle, my nat.entry.item, (CFStringRef) Melder_peekWcsToCfstring (my name));
+		SetMenuItemTextWithCFString (my nat.entry.handle, my nat.entry.item, (CFStringRef) Melder_peek32toCfstring (my name));
 		if (acc > 32) {
 			SetItemCmd (my nat.entry.handle, my nat.entry.item, acc);
 		} else {
 			Melder_assert (acc > 0 && acc < 32);
-			SetItemCmd (my nat.entry.handle, my nat.entry.item, ' ');   /* Funny that this should be needed. */
+			SetItemCmd (my nat.entry.handle, my nat.entry.item, ' ');   // funny that this should be needed
 			SetMenuItemKeyGlyph (my nat.entry.handle, my nat.entry.item, theGlyphs [acc]);
 		}
 		SetMenuItemModifiers (my nat.entry.handle, my nat.entry.item,
@@ -960,7 +958,7 @@ static void _GuiNativizeWidget (GuiObject me) {
 				int id;
 				for (id = 1; id <= MAXIMUM_NUMBER_OF_MENUS; id ++) if (! theMenus [id]) break;
 				my nat.menu.id = id;
-				theMenus [my nat.menu.id] = me;   /* Instead of UserData fields. */
+				theMenus [my nat.menu.id] = me;   // instead of UserData fields
 				/*
 				 * This will be a hierarchical menu.
 				 */
@@ -969,12 +967,12 @@ static void _GuiNativizeWidget (GuiObject me) {
 				int ident;
 				for (ident = 1; ident <= MAXIMUM_NUMBER_OF_MENUS; ident ++) if (! theMenus [ident]) break;
 				my nat.menu.id = ident;
-				theMenus [my nat.menu.id] = me;   /* Instead of RefCon fields. */
+				theMenus [my nat.menu.id] = me;   // instead of RefCon fields
 				/*
 				 * This will be a hierarchical menu.
 				 */
 				CreateNewMenu (my nat.menu.id, 0, & my nat.menu.handle);
-				SetMenuTitleWithCFString (my nat.menu.handle, (CFStringRef) Melder_peekWcsToCfstring (my name));
+				SetMenuTitleWithCFString (my nat.menu.handle, (CFStringRef) Melder_peek32toCfstring (my name));
 				InsertMenu (my nat.menu.handle, kInsertHierarchicalMenu);
 			#endif
 		} else {
@@ -994,34 +992,34 @@ static void _GuiNativizeWidget (GuiObject me) {
 				int id;
 				for (id = MINIMUM_MENU_ITEM_ID; id <= MAXIMUM_MENU_ITEM_ID; id ++) if (! theMenuItems [id]) break;
 				my nat.entry.id = id;   // install unique ID
-				theMenuItems [id] = TRUE;
+				theMenuItems [id] = true;
 			}
 			#endif
 		}
 	} else switch (my widgetClass) {
 		case xmBulletinBoardWidgetClass: {
 			#if win
-				my window = CreateWindowEx (0, theWindowClassName, L"bulletinBoard", WS_CHILD | WS_BORDER | WS_CLIPSIBLINGS,
+				my window = CreateWindowEx (0, Melder_peek32toW (theWindowClassName), L"bulletinBoard", WS_CHILD | WS_BORDER | WS_CLIPSIBLINGS,
 					my x, my y, my width, my height, my parent -> window, NULL, theGui.instance, NULL);
 				SetWindowLongPtr (my window, GWLP_USERDATA, (LONG_PTR) me);
 			#endif
 		} break;
-		case xmDrawingAreaWidgetClass: Melder_fatal ("Should be implemented in GuiDrawingArea."); break;
+		case xmDrawingAreaWidgetClass: Melder_fatal (U"Should be implemented in GuiDrawingArea."); break;
 		case xmFormWidgetClass: {
 			#if win
-				my window = CreateWindowEx (0, theWindowClassName, L"form", WS_CHILD | WS_CLIPSIBLINGS,
+				my window = CreateWindowEx (0, Melder_peek32toW (theWindowClassName), L"form", WS_CHILD | WS_CLIPSIBLINGS,
 					my x, my y, my width, my height, my parent -> window, NULL, theGui.instance, NULL);
 				SetWindowLongPtr (my window, GWLP_USERDATA, (LONG_PTR) me);
 			#endif
 		} break;
 		case xmRowColumnWidgetClass: {
 			#if win
-				my window = CreateWindowEx (0, theWindowClassName, L"rowColumn", WS_CHILD | WS_CLIPSIBLINGS,
+				my window = CreateWindowEx (0, Melder_peek32toW (theWindowClassName), L"rowColumn", WS_CHILD | WS_CLIPSIBLINGS,
 					my x, my y, my width, my height, my parent -> window, NULL, theGui.instance, NULL);
 				SetWindowLongPtr (my window, GWLP_USERDATA, (LONG_PTR) me);
 			#endif
 		} break;
-		case xmListWidgetClass: Melder_fatal ("Should be implemented in GuiList."); break;
+		case xmListWidgetClass: Melder_fatal (U"Should be implemented in GuiList."); break;
 		case xmMenuBarWidgetClass: {
 			#if win
 				if (! my shell -> motiff.shell.isDialog && my shell -> nat.shell.menuBar == NULL && my parent -> widgetClass != xmRowColumnWidgetClass) {
@@ -1030,10 +1028,10 @@ static void _GuiNativizeWidget (GuiObject me) {
 					my nat.menu.handle = bar;
 					my shell -> nat.shell.menuBar = me;   // does this have to be?
 				} else {
-					my widgetClass = xmRowColumnWidgetClass;   /* !!!!!!!!!!!!! */
+					my widgetClass = xmRowColumnWidgetClass;   // !!!!!!!!!!!!!
 					my orientation = XmHORIZONTAL;
 					my rowColumnType = XmMENU_BAR;
-					my window = CreateWindowEx (0, theWindowClassName, L"rowColumn", WS_CHILD,
+					my window = CreateWindowEx (0, Melder_peek32toW (theWindowClassName), L"rowColumn", WS_CHILD,
 						my x, my y, my width, my height, my parent -> window, NULL, theGui.instance, NULL);
 					SetWindowLongPtr (my window, GWLP_USERDATA, (LONG_PTR) me);
 				}
@@ -1045,10 +1043,10 @@ static void _GuiNativizeWidget (GuiObject me) {
 				 * This is Motif style, and only works well for Macintoshes with large screens.
 				 */
 				if (/*(GuiObject) GetWRefCon (my macWindow) == theApplicationShell && theMenuBar == NULL*/ my parent == NULL) {
-					//Melder_casual ("Creating the top menu bar.");
+					//Melder_casual (U"Creating the top menu bar.");
 					theMenuBar = me;
 				} else {
-					my widgetClass = xmRowColumnWidgetClass;   /* !!!!!!!!!!!!! */
+					my widgetClass = xmRowColumnWidgetClass;   // !!!!!!!!!!!!!
 					my orientation = XmHORIZONTAL;
 					my rowColumnType = XmMENU_BAR;
 				}
@@ -1059,7 +1057,7 @@ static void _GuiNativizeWidget (GuiObject me) {
 				int id;
 				for (id = 1; id <= MAXIMUM_NUMBER_OF_MENUS; id ++) if (! theMenus [id]) break;
 				my nat.menu.id = id;
-				theMenus [my nat.menu.id] = me;   /* Instead of UserData fields. */
+				theMenus [my nat.menu.id] = me;   // instead of UserData fields
 				if (MEMBER (my parent, MenuBar)) {
 					GuiObject menu;
 					UINT beforeID = -1;
@@ -1068,7 +1066,7 @@ static void _GuiNativizeWidget (GuiObject me) {
 					 * Insert the menu before the Help menu, if that exists; otherwise, at the end.
 					 */
 					for (menu = my parent -> firstChild; menu != NULL; menu = menu -> nextSibling) {
-						if (MEMBER (menu, PulldownMenu) && wcsequ (menu -> name, L"Help") && menu != me) {
+						if (MEMBER (menu, PulldownMenu) && str32equ (menu -> name, U"Help") && menu != me) {
 							beforeID = (UINT) menu -> nat.menu./*handle*/id;
 							break;
 						}
@@ -1077,8 +1075,8 @@ static void _GuiNativizeWidget (GuiObject me) {
 						MENUITEMINFO info;
 						info. cbSize = sizeof (MENUITEMINFO);
 						info. fMask = MIIM_TYPE | MIIM_SUBMENU | MIIM_ID;
-						info. fType = MFT_STRING | ( wcsequ (my name, L"Help") ? MFT_RIGHTJUSTIFY : 0 );
-						info. dwTypeData = my name;
+						info. fType = MFT_STRING | ( str32equ (my name, U"Help") ? MFT_RIGHTJUSTIFY : 0 );
+						info. dwTypeData = Melder_peek32toW (my name);
 						info. hSubMenu = my nat.menu.handle;
 						info. wID = (UINT) my nat.menu./*handle*/id;
 						InsertMenuItem (my parent -> nat.menu.handle, beforeID, 0, & info);
@@ -1095,12 +1093,12 @@ static void _GuiNativizeWidget (GuiObject me) {
 				int ident;
 				for (ident = 1; ident <= MAXIMUM_NUMBER_OF_MENUS; ident ++) if (! theMenus [ident]) break;
 				my nat.menu.id = ident;
-				theMenus [my nat.menu.id] = me;   /* Instead of RefCon fields. */
+				theMenus [my nat.menu.id] = me;   // instead of RefCon fields
 				if (MEMBER (my parent, MenuBar)) {
 					/*
 					 * This will be a menu in the Macintosh menu bar.
 					 */
-					if (USE_QUESTION_MARK_HELP_MENU && wcsequ (my name, L"Help")) {
+					if (USE_QUESTION_MARK_HELP_MENU && str32equ (my name, U"Help")) {
 						HMGetHelpMenu (& my nat.menu.handle, NULL);
 						theMenus [my nat.menu.id] = NULL;
 						my nat.menu.id = kHMHelpMenuID;
@@ -1108,10 +1106,10 @@ static void _GuiNativizeWidget (GuiObject me) {
 					} else {
 						int beforeID = 0;
 						CreateNewMenu (my nat.menu.id, 0, & my nat.menu.handle);
-						SetMenuTitleWithCFString (my nat.menu.handle, (CFStringRef) Melder_peekWcsToCfstring (my name));
+						SetMenuTitleWithCFString (my nat.menu.handle, (CFStringRef) Melder_peek32toCfstring (my name));
 						for (ident = 1; ident <= MAXIMUM_NUMBER_OF_MENUS; ident ++) {
 							GuiObject menu = theMenus [ident];
-							if (menu && wcsequ (menu -> name, L"Help")) {
+							if (menu && str32equ (menu -> name, U"Help")) {
 								beforeID = ident;
 								break;
 							}
@@ -1125,28 +1123,28 @@ static void _GuiNativizeWidget (GuiObject me) {
 					 * It is implemented as a Mac pop-up menu.
 					 */
 					CreateNewMenu (my nat.menu.id, 0, & my nat.menu.handle);
-					SetMenuTitleWithCFString (my nat.menu.handle, (CFStringRef) Melder_peekWcsToCfstring (my name));
+					SetMenuTitleWithCFString (my nat.menu.handle, (CFStringRef) Melder_peek32toCfstring (my name));
 					InsertMenu (my nat.menu.handle, -1);
 				}
 			#endif
 		} break;
-		case xmLabelWidgetClass: Melder_fatal ("Should be implemented in GuiLabel."); break;
+		case xmLabelWidgetClass: Melder_fatal (U"Should be implemented in GuiLabel."); break;
 		case xmCascadeButtonWidgetClass: {
 			if (! my motiff.cascadeButton.inBar) {
 				#if win
-					my window = CreateWindow (L"button", _GuiWin_expandAmpersands (my name),
+					my window = CreateWindow (L"button", Melder_peek32toW (_GuiWin_expandAmpersands (my name)),
 						WS_CHILD | BS_PUSHBUTTON | WS_CLIPSIBLINGS,
 						my x, my y, my width, my height, my parent -> window, (HMENU) 1, theGui.instance, NULL);
 					SetWindowLongPtr (my window, GWLP_USERDATA, (LONG_PTR) me);
-					SetWindowFont (my window, GetStockFont (ANSI_VAR_FONT), FALSE);
+					SetWindowFont (my window, GetStockFont (ANSI_VAR_FONT), false);
 				#elif mac
-					if (wcsstr (my name, L" -") || (my parent -> rowColumnType == XmMENU_BAR && my parent -> y < 5)) {
+					if (str32str (my name, U" -") || (my parent -> rowColumnType == XmMENU_BAR && my parent -> y < 5)) {
 						my nat.control.isBevel = true;
 						CreateBevelButtonControl (my macWindow, & my rect, NULL, kControlBevelButtonSmallBevel,
 							kControlBehaviorPushbutton, NULL, 1, kControlBehaviorCommandMenu, 0, & my nat.control.handle);
 						Melder_assert (my nat.control.handle != NULL);
 						SetControlReference (my nat.control.handle, (long) me);
-						my isControl = TRUE;
+						my isControl = true;
 						_GuiNativeControl_setFont (me, 0, 13);
 						_GuiNativeControl_setTitle (me);
 					} else {
@@ -1156,20 +1154,20 @@ static void _GuiNativizeWidget (GuiObject me) {
 							0, teFlushLeft, 0, & my nat.control.handle);
 						Melder_assert (my nat.control.handle != NULL);
 						SetControlReference (my nat.control.handle, (long) me);
-						my isControl = TRUE;
+						my isControl = true;
 						_GuiNativeControl_setFont (me, 0, 13);
 						_GuiNativeControl_setTitle (me);
-						SetControlMaximum (my nat.control.handle, 32767);   /* The default seems to be 9 on MacOS X. */
+						SetControlMaximum (my nat.control.handle, 32767);   // the default seems to be 9 on MacOS X
 					}
 				#endif
 			}
 		} break;
-		case xmPushButtonWidgetClass: Melder_fatal ("Should be implemented in GuiButton."); break;
-		case xmTextWidgetClass: Melder_fatal ("Should be implemented in GuiText."); break;
-		case xmToggleButtonWidgetClass: Melder_fatal ("Should be implemented in GuiCheckButton and GuiRadioButton."); break;
+		case xmPushButtonWidgetClass: Melder_fatal (U"Should be implemented in GuiButton."); break;
+		case xmTextWidgetClass: Melder_fatal (U"Should be implemented in GuiText."); break;
+		case xmToggleButtonWidgetClass: Melder_fatal (U"Should be implemented in GuiCheckButton and GuiRadioButton."); break;
 		case xmScaleWidgetClass: {
 			#if win
-				my window = CreateWindow (PROGRESS_CLASS, _GuiWin_expandAmpersands (my name), WS_CHILD | WS_CLIPSIBLINGS,
+				my window = CreateWindow (PROGRESS_CLASS, Melder_peek32toW (_GuiWin_expandAmpersands (my name)), WS_CHILD | WS_CLIPSIBLINGS,
 					my x, my y, my width, my height, my parent -> window, (HMENU) 1, theGui.instance, NULL);
 				SetWindowLongPtr (my window, GWLP_USERDATA, (LONG_PTR) me);
 				SendMessage (my window, PBM_SETRANGE, (WPARAM) 0, (LPARAM) MAKELONG (0, 10000));
@@ -1177,8 +1175,8 @@ static void _GuiNativizeWidget (GuiObject me) {
 		} break;
 		case xmScrollBarWidgetClass: {
 			#if win
-				my window = CreateWindow (L"scrollbar", my name, WS_CHILD |
-					( wcsequ (my name, L"verticalScrollBar") ? SBS_VERT : SBS_HORZ ) | WS_CLIPSIBLINGS,
+				my window = CreateWindow (L"scrollbar", Melder_peek32toW (my name), WS_CHILD |
+					( str32equ (my name, U"verticalScrollBar") ? SBS_VERT : SBS_HORZ ) | WS_CLIPSIBLINGS,
 					my x, my y, my width, my height, my parent -> window, (HMENU) 1, theGui.instance, NULL);
 				SetWindowLongPtr (my window, GWLP_USERDATA, (LONG_PTR) me);
 				NativeScrollBar_set (me);
@@ -1186,7 +1184,7 @@ static void _GuiNativizeWidget (GuiObject me) {
 				my nat.control.handle = NewControl (my macWindow, & my rect,
 					(const unsigned char *) "\000", false, 0, 0, 0, kControlScrollBarLiveProc, (long) me);
 				Melder_assert (my nat.control.handle);
-				my isControl = TRUE;
+				my isControl = true;
 			#endif
 			my minimum = 0;
 			my maximum = 100;
@@ -1206,7 +1204,7 @@ static void _GuiNativizeWidget (GuiObject me) {
 			 *      (shell.)form.(scrolledWindow.)clipWindow.column.row.pushButton
 			 */
 			#if win
-				my window = CreateWindowEx (0, theWindowClassName, L"scrolledWindow", WS_CHILD | WS_CLIPSIBLINGS,
+				my window = CreateWindowEx (0, Melder_peek32toW (theWindowClassName), L"scrolledWindow", WS_CHILD | WS_CLIPSIBLINGS,
 					my x, my y, my width, my height, my parent -> window, NULL, theGui.instance, NULL);
 				SetWindowLongPtr (my window, GWLP_USERDATA, (LONG_PTR) me);
 			#endif
@@ -1224,10 +1222,10 @@ static void _GuiNativizeWidget (GuiObject me) {
 				XmNincrement, CELL_HEIGHT, XmNpageIncrement, 101 - CELL_HEIGHT, NULL);
 			my motiff.scrolledWindow.clipWindow = XmCreateBulletinBoard (me, "clipWindow", NULL, 0);
 			XtVaSetValues (my motiff.scrolledWindow.clipWindow,
-				XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 1,   /* For border. */
-				XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, 16,   /* For scroll bar. */
-				XmNtopAttachment, XmATTACH_FORM, XmNtopOffset, 1,   /* For border. */
-				XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 16, NULL);   /* For scroll bar. */
+				XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 1,   // for border
+				XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, 16,   // for scroll bar
+				XmNtopAttachment, XmATTACH_FORM, XmNtopOffset, 1,   // for border
+				XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 16, NULL);   // for scroll bar
 			XtAddCallback (my motiff.scrolledWindow.verticalBar, XmNvalueChangedCallback, cb_scroll, (XtPointer) me);
 			XtAddCallback (my motiff.scrolledWindow.verticalBar, XmNdragCallback, cb_scroll, (XtPointer) me);
 			XtAddCallback (my motiff.scrolledWindow.horizontalBar, XmNvalueChangedCallback, cb_scroll, (XtPointer) me);
@@ -1235,35 +1233,35 @@ static void _GuiNativizeWidget (GuiObject me) {
 		} break;
 		case xmShellWidgetClass: {
 			#if win
-				static LPCTSTR className = theApplicationClassName;   /* Only for first window. */
+				static char32 *className { theApplicationClassName };   // only for first window
 				my window = CreateWindowEx (theDialogHint ? WS_EX_DLGMODALFRAME /* | WS_EX_TOPMOST */ : 0,
-					className, className,
+					Melder_peek32toW (className), Melder_peek32toW (className),
 					theDialogHint ? WS_CAPTION | WS_SYSMENU : WS_OVERLAPPEDWINDOW,
 					CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,  my parent ? my parent -> window : NULL, NULL, theGui.instance, NULL);
-				className = theWindowClassName;   /* All later windows. */
+				className = theWindowClassName;   // all later windows
 				SetWindowLongPtr (my window, GWLP_USERDATA, (LONG_PTR) me);
 			#elif mac
 				Rect r = my rect;
-				if (wcsstr (my name, L"fullscreen")) {
+				if (str32str (my name, U"fullscreen")) {
 					my motiff.shell.canFullScreen = true;
 				}
 				OffsetRect (& r, 0, 22);
 				CreateNewWindow (kDocumentWindowClass, kWindowCloseBoxAttribute +
 					( theDialogHint ? 0 : kWindowCollapseBoxAttribute + kWindowResizableAttribute + kWindowFullZoomAttribute),
 					& r, & my nat.window.ptr);
-				SetWRefCon (my nat.window.ptr, (long) me);   /* So we can find the widget from the event with GetWRefCon (). */
+				SetWRefCon (my nat.window.ptr, (long) me);   // so we can find the widget from the event with GetWRefCon ()
 				CreateRootControl (my nat.window.ptr, & my nat.window.rootControl);
 				if (theDialogHint) {
 					SetThemeWindowBackground (my nat.window.ptr, kThemeBrushDialogBackgroundActive, False);
 				} else {
 					SetThemeWindowBackground (my nat.window.ptr, kThemeBrushDialogBackgroundActive, False);
 				}
-				my macWindow = my nat.window.ptr;   /* Associate drawing context; child widgets will inherit. */
-				my motiff.shell.active = true;   /* Why? */
+				my macWindow = my nat.window.ptr;   // associate drawing context; child widgets will inherit
+				my motiff.shell.active = true;   // why?
 				SetPortWindowPort (my macWindow);
-				motif_mac_defaultFont ();   /* Will be set back after every change. */
+				motif_mac_defaultFont ();   // will be set back after every change
 			#endif
-			my motiff.shell.isDialog = theDialogHint;   /* So we can maintain a single Shell class instead of two different. */
+			my motiff.shell.isDialog = theDialogHint;   // so we can maintain a single Shell class instead of two different
 		} break;
 		default: break;
 	}
@@ -1271,16 +1269,16 @@ static void _GuiNativizeWidget (GuiObject me) {
 }
 
 static GuiObject createWidget (int widgetClass, GuiObject parent, const char *name) {
-	GuiObject me = _Gui_initializeWidget (widgetClass, parent, Melder_peekUtf8ToWcs (name));
+	GuiObject me = _Gui_initializeWidget (widgetClass, parent, Melder_peek8to32 (name));
 	_GuiNativizeWidget (me);
 	return me;
 }
 
 void _Gui_invalidateWidget (GuiObject me) {
-	if (! my managed) return;   /* Should be: visible. */
+	if (! my managed) return;   // should be: visible
 	if (MEMBER (me, Shell) /*||
 		 my widgetClass == xmRowColumnWidgetClass ||
-		 my widgetClass == xmFormWidgetClass*/) return;   /* Composites are not invalidated !!!!! ???? */
+		 my widgetClass == xmFormWidgetClass*/) return;   // composites are not invalidated !!!!! ????
 	#if mac
 		_GuiMac_clipOnParent (me);
 		EraseRect (& my rect);
@@ -1289,7 +1287,7 @@ void _Gui_invalidateWidget (GuiObject me) {
 }
 
 void _Gui_validateWidget (GuiObject me) {
-	if (! my managed) return;   /* Should be: visible. */
+	if (! my managed) return;   // should be: visible
 	if (MEMBER (me, Shell)) return;
 	#if mac
 		_GuiMac_clipOnParent (me);
@@ -1312,12 +1310,12 @@ static void Native_move (GuiObject me, int dx, int dy) {
 		my nat.shell.duringMoveWindow = True;
 		if (my motiff.shell.isDialog)
 			MoveWindow (my window, my x, my y, my width + 2 * GetSystemMetrics (SM_CXFIXEDFRAME),
-				my height + 2 * GetSystemMetrics (SM_CYFIXEDFRAME) + GetSystemMetrics (SM_CYCAPTION), TRUE);
+				my height + 2 * GetSystemMetrics (SM_CYFIXEDFRAME) + GetSystemMetrics (SM_CYCAPTION), true);
 		else
 			MoveWindow (my window, my x, my y,
 				my width + 2 * GetSystemMetrics (SM_CXSIZEFRAME),
 				my height + 2 * GetSystemMetrics (SM_CYSIZEFRAME) + GetSystemMetrics (SM_CYCAPTION) +
-				( my nat.shell.menuBar != NULL ? GetSystemMetrics (SM_CYMENU) : 0 ), TRUE);
+				( my nat.shell.menuBar != NULL ? GetSystemMetrics (SM_CYMENU) : 0 ), true);
 	} else
 		MoveWindow (my window, my x, my y, my width, my height, True);
 #elif mac
@@ -1346,9 +1344,9 @@ static void Native_move (GuiObject me, int dx, int dy) {
 	} else if (MEMBER (me, Shell)) {
 		MoveWindow (my nat.window.ptr, my rect.left, my rect.top + 22, 0);
 	} else if (MEMBER (me, DrawingArea)) {
-		_Gui_callCallbacks (me, & my motiff.drawingArea.moveCallbacks, 0);   /* Only Mac? */
+		_Gui_callCallbacks (me, & my motiff.drawingArea.moveCallbacks, 0);   // only Mac?
 	}
-	if (! my isControl) _Gui_invalidateWidget (me);   /* At new position. */
+	if (! my isControl) _Gui_invalidateWidget (me);   // at new position
 	/*
 	 * Because all non-shell coordinates are port-relative on Mac, we have to recursively move the children.
 	 */
@@ -1414,7 +1412,7 @@ static void shellResizeWidget (GuiObject me, int dx, int dy, int dw, int dh) {
 			if (rect.left!=my x||rect.right!=my x + my width||rect.top !=my y||rect.bottom!=my y +my height)
 			Melder_warning ("class %d x %d left %d y %d top %d width %d right %d height %d bottom %d",
 			my widgetClass, my x, rect.left, my y, rect.top, my width, rect.right, my height, rect.bottom);*/
-			MoveWindow (my window, my x, my y, my width, my height, TRUE);
+			MoveWindow (my window, my x, my y, my width, my height, true);
 			if (MEMBER (me, DrawingArea)) _GuiWinDrawingArea_shellResize (me);
 		}
 	#elif mac
@@ -1494,13 +1492,13 @@ static void resizeWidget (GuiObject me, int dw, int dh) {
 	GuiObject child;
 	#if win
 		if (my window && ! MEMBER (me, Shell)) {
-			MoveWindow (my window, my x, my y, my width, my height, TRUE);
+			MoveWindow (my window, my x, my y, my width, my height, true);
 			if (MEMBER (me, DrawingArea)) _GuiWinDrawingArea_shellResize (me);
 		}
 	#elif mac
 	{
 		if ((dw == 0 && dh == 0) || (my parent && MEMBER (my parent, PulldownMenu))) return;
-		if (! my isControl) _Gui_invalidateWidget (me);   /* At old position. */
+		if (! my isControl) _Gui_invalidateWidget (me);   // at old position
 		my rect.right += dw;
 		my rect.bottom += dh;
 		if (MEMBER (me, Text)) {
@@ -1515,7 +1513,7 @@ static void resizeWidget (GuiObject me, int dw, int dh) {
 		} else if (MEMBER (me, DrawingArea)) {
 			_GuiMacDrawingArea_shellResize (me);
 		}
-		if (! my isControl) _Gui_invalidateWidget (me);   /* At new position. */
+		if (! my isControl) _Gui_invalidateWidget (me);   // at new position
 	}
 	#endif
 	if (MEMBER2 (me, Form, ScrolledWindow))
@@ -1626,7 +1624,7 @@ static void _motif_setValues (GuiObject me, va_list arg) {
 			Melder_assert (MEMBER2 (me, Form, BulletinBoard));
 			text = va_arg (arg, char *);
 			#if win
-				SetWindowText (my shell -> window, Melder_peekUtf8ToWcs (text));
+				SetWindowTextW (my shell -> window, Melder_peek32toW (Melder_peek8to32 (text)));
 			#elif mac
 				ptext [0] = strlen (text); strcpy ((char *) ptext + 1, text);
 				SetWTitle (my macWindow, ptext);
@@ -1675,7 +1673,7 @@ static void _motif_setValues (GuiObject me, va_list arg) {
 			Melder_assert (MEMBER2 (me, CascadeButton, PushButton));
 			text = va_arg (arg, char *);
 			Melder_free (my name);
-			my name = Melder_utf8ToWcs (text);   // BUG throwable
+			my name = Melder_8to32 (text);   // BUG throwable
 			if (my inMenu) {
 				NativeMenuItem_setText (me);
 			} else if (MEMBER (me, CascadeButton) && my motiff.cascadeButton.inBar) {
@@ -1781,14 +1779,14 @@ static void _motif_setValues (GuiObject me, va_list arg) {
 				ptext [0] = strlen (text); strcpy ((char *) ptext + 1, text);
 				SetWTitle (my nat.window.ptr, ptext);
 			#elif win
-				SetWindowText (my window, Melder_peekUtf8ToWcs (text));
+				SetWindowTextW (my window, Melder_peek32toW (Melder_peek8to32 (text)));
 			#endif
 			break;
 		case XmNtitleString:
 			Melder_assert (MEMBER (me, Scale));
 			text = va_arg (arg, char *);
 			Melder_free (my name);
-			my name = Melder_utf8ToWcs (text); // BUG throwable
+			my name = Melder_8to32 (text);   // BUG throwable
 			_Gui_invalidateWidget (me);
 			break;
 		case XmNtopAttachment:
@@ -1835,11 +1833,10 @@ static void _motif_setValues (GuiObject me, va_list arg) {
 
 		default: {
 			if (resource < 0 || resource >= sizeof motif_resourceNames / sizeof (char *))
-				Melder_flushError ("(XtVaSetValues:) Resource out of range (%d).", resource);
+				Melder_flushError (U"(XtVaSetValues:) Resource out of range (", resource, U").");
 			else
-				Melder_flushError ("(XtVaSetValues:) Unknown resource \"%s\".",
-					motif_resourceNames [resource]);
-			return;   /* Because we do not know how to skip this unknown resource." */
+				Melder_flushError (U"(XtVaSetValues:) Unknown resource \"", Melder_peek8to32 (motif_resourceNames [resource]), U"\".");
+			return;   // because we do not know how to skip this unknown resource
 		}
 	}
 
@@ -1930,7 +1927,7 @@ void _Gui_manageScrolledWindow (GuiObject me) {
 	Melder_assert (my widgetClass == xmScrolledWindowWidgetClass);
 	clipWindow = my motiff.scrolledWindow.clipWindow;
 	workWindow = my motiff.scrolledWindow.workWindow;
-	if (clipWindow == NULL || horzBar == NULL || vertBar == NULL) return;   /* Apparently during destruction of scrolled window. */
+	if (clipWindow == NULL || horzBar == NULL || vertBar == NULL) return;   // apparently during destruction of scrolled window
 	/*
 	 * We must find out if the scrolling policy of each bar is automatic.
 	 * Otherwise, we must not change them automatically.
@@ -2000,7 +1997,7 @@ static void _motif_manage (GuiObject me) {
 
 	for (child = my firstChild; child; child = child -> nextSibling) {
 		if (child -> managed && ! MEMBER (child, Shell)) {
-			int dx = 0, dy = 0;   /* By default, the child does not move. */
+			int dx = 0, dy = 0;   // by default, the child does not move
 			if (MEMBER (me, RowColumn)) {
 				#if mac
 					if (my rowColumnType == XmMENU_BAR && MEMBER (child, CascadeButton) &&
@@ -2120,7 +2117,7 @@ static void xt_addCallback (XtCallbackList *callbacks, XtCallbackProc proc, XtPo
 			return;
 		}
 	}
-	Melder_assert (i < MAXNUM_CALLBACKS);   /* Will always fail if we arrive here. */
+	Melder_assert (i < MAXNUM_CALLBACKS);   // will always fail if we arrive here
 }
 
 void XtAddCallback (GuiObject me, int kind, XtCallbackProc proc, XtPointer closure) {
@@ -2148,9 +2145,9 @@ void XtAddCallback (GuiObject me, int kind, XtCallbackProc proc, XtPointer closu
 		break;
 		default:
 			if (kind < 0 || kind >= sizeof motif_resourceNames / sizeof (char *))
-				Melder_flushError ("(XtAddCallback:) Callback name out of range (%d).", kind);
+				Melder_flushError (U"(XtAddCallback:) Callback name out of range (", kind, U").");
 			else
-				Melder_flushError ("(XtAddCallback:) Unknown callback \"%s\".", motif_resourceNames [kind]);
+				Melder_flushError (U"(XtAddCallback:) Unknown callback \"", Melder_peek8to32 (motif_resourceNames [kind]), U"\".");
 	}
 }
 
@@ -2219,10 +2216,10 @@ void XtDestroyWidget (GuiObject me) {
 	if (my widgetClass == xmShellWidgetClass) {
 		XtUnmanageChild (me);
 		#if win
-			natWindow = my window;   /* Save for destroy. */
+			natWindow = my window;   // save for destroy
 			my window = NULL;
 		#elif mac
-			my macWindow = NULL;   /* Notify children. */
+			my macWindow = NULL;   // notify children
 		#endif
 	}
 	if (MEMBER2 (me, Form, BulletinBoard) && MEMBER (my parent, Shell) &&
@@ -2237,10 +2234,10 @@ void XtDestroyWidget (GuiObject me) {
 		return;
 	}
 	while (subview) {
-		GuiObject nextSibling = subview -> nextSibling;   /* Save... */
+		GuiObject nextSibling = subview -> nextSibling;   // save...
 		//if (subview -> widgetClass != xmShellWidgetClass)   /* FIX instead of Xm's being_destroyed mark. */   // removed 20090105
 			XtDestroyWidget (subview);
-		subview = nextSibling;   /* ...because we can't dereference dead subview. */
+		subview = nextSibling;   // ...because we can't dereference dead subview
 	}
 	if (my destroyCallback) my destroyCallback (me, my destroyClosure, NULL);
 	switch (my widgetClass) {
@@ -2306,7 +2303,7 @@ void XtDestroyWidget (GuiObject me) {
 		case xmPushButtonWidgetClass: {
 			if (my inMenu) {
 				#if win
-					if (my nat.entry.id) theMenuItems [my nat.entry.id] = FALSE;
+					if (my nat.entry.id) theMenuItems [my nat.entry.id] = false;
 				#elif mac
 					DeleteMenuItem (my nat.entry.handle, my nat.entry.item);
 					for (subview = my parent -> firstChild; subview; subview = subview -> nextSibling) {
@@ -2325,7 +2322,7 @@ void XtDestroyWidget (GuiObject me) {
 		case xmToggleButtonWidgetClass: {
 			if (my inMenu) {
 				#if win
-					if (my nat.entry.id) theMenuItems [my nat.entry.id] = FALSE;
+					if (my nat.entry.id) theMenuItems [my nat.entry.id] = false;
 				#elif mac
 					DeleteMenuItem (my nat.entry.handle, my nat.entry.item);
 					for (subview = my parent -> firstChild; subview; subview = subview -> nextSibling) {
@@ -2367,7 +2364,7 @@ void XtDestroyWidget (GuiObject me) {
 		case xmSeparatorWidgetClass: {
 			if (my inMenu) {
 				#if win
-					if (my nat.entry.id) theMenuItems [my nat.entry.id] = FALSE;
+					if (my nat.entry.id) theMenuItems [my nat.entry.id] = false;
 				#elif mac
 					DeleteMenuItem (my nat.entry.handle, my nat.entry.item);
 					for (subview = my parent -> firstChild; subview; subview = subview -> nextSibling) {
@@ -2391,11 +2388,11 @@ void XtDestroyWidget (GuiObject me) {
 		} break;
 	}
 	Melder_free (my name);
-	if (my parent && me == my parent -> firstChild)   /* Remove dangling reference. */
+	if (my parent && me == my parent -> firstChild)   // remove dangling reference
 		my parent -> firstChild = my nextSibling;
-	if (my previousSibling)   /* Remove dangling reference. */
+	if (my previousSibling)   // remove dangling reference
 		my previousSibling -> nextSibling = my nextSibling;
-	if (my nextSibling)   /* Remove dangling reference: two-way linked list. */
+	if (my nextSibling)   // remove dangling reference: two-way linked list
 		my nextSibling -> previousSibling = my previousSibling;
 	if (my parent && MEMBER (my parent, ScrolledWindow)) {
 		if (me == my parent -> motiff.scrolledWindow.workWindow) {
@@ -2423,7 +2420,7 @@ void XtMapWidget (GuiObject me) {
 	switch (my widgetClass) {
 		case xmShellWidgetClass:
 			#if win
-				ShowWindow (my window, theCommandShow);
+				ShowWindow (my window, theGui.commandShow);
 				//UpdateWindow (my window);
 			#elif mac
 				ShowWindow (my nat.window.ptr);
@@ -2438,25 +2435,26 @@ static void mapWidget (GuiObject me) {
 	GuiObject child;
 	Melder_assert (my widgetClass != xmPulldownMenuWidgetClass);
 	if (my inMenu) {
-		trace ("showing a menu item");
+		trace (U"showing a menu item");
 		#if win
 			int position = NativeMenuItem_getPosition (me);
 			switch (my widgetClass) {
 				case xmPushButtonWidgetClass: {
 					InsertMenu (my nat.entry.handle, position, MF_STRING | MF_BYPOSITION | ( my insensitive ? MF_GRAYED : MF_ENABLED ),
-						my nat.entry.id, _GuiWin_expandAmpersands (my name));
+						my nat.entry.id, Melder_peek32toW (_GuiWin_expandAmpersands (my name)));
 				} break;
 				case xmToggleButtonWidgetClass: {
 					InsertMenu (my nat.entry.handle, position, MF_STRING | MF_UNCHECKED | MF_BYPOSITION | ( my insensitive ? MF_GRAYED : MF_ENABLED ),
-						my nat.entry.id, _GuiWin_expandAmpersands (my name));
+						my nat.entry.id, Melder_peek32toW (_GuiWin_expandAmpersands (my name)));
 				} break;
 				case xmCascadeButtonWidgetClass: {
 					my nat.entry.id = (ULONG_PTR) my subMenuId -> nat.menu.handle;
 					InsertMenu (my nat.entry.handle, position, MF_POPUP | MF_BYPOSITION | ( my insensitive ? MF_GRAYED : MF_ENABLED ),
-						my nat.entry.id, _GuiWin_expandAmpersands (my name));
+						my nat.entry.id, Melder_peek32toW (_GuiWin_expandAmpersands (my name)));
 				} break;
 				case xmSeparatorWidgetClass: {
-					InsertMenu (my nat.entry.handle, position, MF_SEPARATOR | MF_BYPOSITION, my nat.entry.id, _GuiWin_expandAmpersands (my name));
+					InsertMenu (my nat.entry.handle, position, MF_SEPARATOR | MF_BYPOSITION,
+						my nat.entry.id, Melder_peek32toW (_GuiWin_expandAmpersands (my name)));
 				} break;
 			}
 		#elif mac
@@ -2489,12 +2487,12 @@ static void mapWidget (GuiObject me) {
 			 * Set text, sensitivity, submenu. BUGS: should also set toggle state and accelerator text.
 			 */
 			if (my widgetClass == xmSeparatorWidgetClass) {
-				trace ("inserting Carbon menu separator at position %d", item);
+				trace (U"inserting Carbon menu separator at position ", item);
 				InsertMenuItem (my nat.entry.handle, (unsigned char *) "\001-", my nat.entry.item - 1);
 			} else {
-				trace ("inserting Carbon menu item \"%ls\" at position %d", my name, item);
+				trace (U"inserting Carbon menu item \"", my name, U"\" at position ", item);
 				InsertMenuItem (my nat.entry.handle, (unsigned char *) "\001 ", my nat.entry.item - 1);
-				SetMenuItemTextWithCFString (my nat.entry.handle, my nat.entry.item, (CFStringRef) Melder_peekWcsToCfstring (my name));
+				SetMenuItemTextWithCFString (my nat.entry.handle, my nat.entry.item, (CFStringRef) Melder_peek32toCfstring (my name));
 				if (my insensitive) DisableMenuItem (my nat.entry.handle, my nat.entry.item);
 				if (mac_text [mac_text [0]] == ':')
 					SetItemStyle (my nat.entry.handle, my nat.entry.item, underline);
@@ -2521,7 +2519,7 @@ static void mapWidget (GuiObject me) {
 		#endif
 		case xmShellWidgetClass: {
 			#if win
-				ShowWindow (my window, theCommandShow);
+				ShowWindow (my window, theGui.commandShow);
 			#elif mac
 				SelectWindow (my nat.window.ptr);
 				ShowWindow (my nat.window.ptr);
@@ -2536,7 +2534,7 @@ static void mapWidget (GuiObject me) {
 			#if win
 				DrawMenuBar (my shell -> window);   // every window has its own menu bar
 			#elif mac
-				DrawMenuBar ();   /* There is a single Mac menu bar for all windows. */
+				DrawMenuBar ();   // there is a single Mac menu bar for all windows
 			#endif
 		} break;
 		case xmPushButtonWidgetClass: _GuiNativeControl_show (me); break;
@@ -2544,7 +2542,7 @@ static void mapWidget (GuiObject me) {
 		case xmScrollBarWidgetClass: {
 			#if win
 			if (! my window) {
-				my window = CreateWindow (L"scrollbar", my name, WS_CHILD |
+				my window = CreateWindow (L"scrollbar", Melder_peek32toW (my name), WS_CHILD |
 					( my orientation == XmHORIZONTAL ? SBS_HORZ : SBS_VERT) | WS_CLIPSIBLINGS,
 					my x, my y, my width, my height, my parent -> window, (HMENU) 1, theGui.instance, NULL);
 				SetWindowLongPtr (my window, GWLP_USERDATA, (LONG_PTR) me);
@@ -2621,10 +2619,10 @@ void XtManageChild (GuiObject me) {
 		int visible = True;
 		GuiObject widget;
 		for (widget = me; widget != NULL; widget = widget -> parent) {
-			if (! widget -> managed &&   /* If a parent is invisible, so are its children. */
-					! MEMBER (widget, PulldownMenu))   /* The exception: "shown" even if not popped up. */
+			if (! widget -> managed &&   // if a parent is invisible, so are its children
+					! MEMBER (widget, PulldownMenu))   // the exception: "shown" even if not popped up
 				{ visible = False; break; }
-			if (MEMBER (widget, Shell)) break;   /* Root: end of chain. */
+			if (MEMBER (widget, Shell)) break;   // root: end of chain
 		}
 		if (visible) mapWidget (me);
 	}
@@ -2751,7 +2749,7 @@ void XtUnmanageChildren (GuiObjectList children, Cardinal num_children) {
 		(void) reply;
 		(void) handlerRefCon;
 		return noErr;
-		Melder_warning (L"Open app event.");
+		Melder_warning (U"Open app event.");
 	}
 	static pascal OSErr _motif_processQuitApplicationMessage (const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon) {
 		/*
@@ -2762,7 +2760,7 @@ void XtUnmanageChildren (GuiObjectList children, Cardinal num_children) {
 		(void) reply;
 		(void) handlerRefCon;
 		if (theQuitApplicationCallback)
-			return theQuitApplicationCallback () ? noErr : userCanceledErr;   /* BUG anti Mac documentation */
+			return theQuitApplicationCallback () ? noErr : userCanceledErr;   // BUG anti Mac documentation
 		exit (0);
 		return noErr;
 	}
@@ -2791,47 +2789,51 @@ void XtUnmanageChildren (GuiObjectList children, Cardinal num_children) {
 		AEDisposeDesc (& documentList);
 		return noErr;
 	}
-	static pascal OSErr _motif_processSignalA (const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon) {
-		static int duringAppleEvent = FALSE;
+	static pascal OSErr _motif_processSignal8 (const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon) {
+		static bool duringAppleEvent = false;
 		(void) reply;
 		(void) handlerRefCon;
 		if (! duringAppleEvent) {
 			char *buffer;
 			long actualSize;
-			duringAppleEvent = TRUE;
+			duringAppleEvent = true;
 			//AEInteractWithUser (kNoTimeOut, NULL, NULL);   // use time out of 0 to execute immediately (without bringing to foreground)
 			ProcessSerialNumber psn;
 			GetCurrentProcess (& psn);
 			SetFrontProcess (& psn);
-			AEGetParamPtr (theAppleEvent, 1, typeChar, NULL, NULL, 0, & actualSize);
+			AEGetParamPtr (theAppleEvent, 1, typeUTF8Text, NULL, NULL, 0, & actualSize);
 			buffer = (char *) malloc (actualSize);
-			AEGetParamPtr (theAppleEvent, 1, typeChar, NULL, & buffer [0], actualSize, NULL);
-			if (theUserMessageCallbackA)
-				theUserMessageCallbackA (buffer);
+			AEGetParamPtr (theAppleEvent, 1, typeUTF8Text, NULL, & buffer [0], actualSize, NULL);
+			if (theUserMessageCallback) {
+				autostring32 buffer32 = Melder_8to32 (buffer);
+				theUserMessageCallback (buffer32.peek());
+			}
 			free (buffer);
-			duringAppleEvent = FALSE;
+			duringAppleEvent = false;
 		}
 		return noErr;
 	}
-	static pascal OSErr _motif_processSignalW (const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon) {
-		static int duringAppleEvent = FALSE;
+	static pascal OSErr _motif_processSignal16 (const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon) {
+		static bool duringAppleEvent = false;
 		(void) reply;
 		(void) handlerRefCon;
 		if (! duringAppleEvent) {
-			wchar_t *buffer;
+			char16 *buffer;
 			long actualSize;
-			duringAppleEvent = TRUE;
+			duringAppleEvent = true;
 			//AEInteractWithUser (kNoTimeOut, NULL, NULL);   // use time out of 0 to execute immediately (without bringing to foreground)
 			ProcessSerialNumber psn;
 			GetCurrentProcess (& psn);
 			SetFrontProcess (& psn);
-			AEGetParamPtr (theAppleEvent, 1, typeUnicodeText, NULL, NULL, 0, & actualSize);
-			buffer = (wchar_t *) malloc (actualSize);
-			AEGetParamPtr (theAppleEvent, 1, typeUnicodeText, NULL, & buffer [0], actualSize, NULL);
-			if (theUserMessageCallbackW)
-				theUserMessageCallbackW (buffer);
+			AEGetParamPtr (theAppleEvent, 1, typeUTF16ExternalRepresentation, NULL, NULL, 0, & actualSize);
+			buffer = (char16 *) malloc (actualSize);
+			AEGetParamPtr (theAppleEvent, 1, typeUTF16ExternalRepresentation, NULL, & buffer [0], actualSize, NULL);
+			if (theUserMessageCallback) {
+				autostring32 buffer32 = Melder_16to32 (buffer);
+				theUserMessageCallback (buffer32.peek());
+			}
 			free (buffer);
-			duringAppleEvent = FALSE;
+			duringAppleEvent = false;
 		}
 		return noErr;
 	}
@@ -2839,7 +2841,7 @@ void XtUnmanageChildren (GuiObjectList children, Cardinal num_children) {
 	static LRESULT CALLBACK windowProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam);
 #endif
 
-void GuiInitialize (const char *name, unsigned int *argc, char **argv)
+void GuiAppInitialize (const char *name, unsigned int argc, char **argv)
 {
 	(void) argc;
 	#if mac
@@ -2851,19 +2853,19 @@ void GuiInitialize (const char *name, unsigned int *argc, char **argv)
 		AEInstallEventHandler (kCoreEventClass, kAEOpenApplication, NewAEEventHandlerUPP (_motif_processOpenApplicationMessage), 0, false);
 		AEInstallEventHandler (kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP (_motif_processQuitApplicationMessage), 0, false);
 		AEInstallEventHandler (kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerUPP (_motif_processOpenDocumentsMessage), 0, false);
-		AEInstallEventHandler (758934755, 0, NewAEEventHandlerUPP (_motif_processSignalA), 0, false);
-		AEInstallEventHandler (758934756, 0, NewAEEventHandlerUPP (_motif_processSignalW), 0, false);
+		AEInstallEventHandler (758934755, 0, NewAEEventHandlerUPP (_motif_processSignal8),  0, false);
+		AEInstallEventHandler (758934756, 0, NewAEEventHandlerUPP (_motif_processSignal16), 0, false);
 		//USE_QUESTION_MARK_HELP_MENU = 1;
 		theUserFocusEventTarget = GetUserFocusEventTarget ();
 	#elif win
 	{
 		HWND window;
 		WNDCLASSEX windowClass;
-		swprintf (theApplicationName, 100, argv [0] ? Melder_peekUtf8ToWcs (argv [0]) : L"Unknown");
-		swprintf (theApplicationClassName, 100, L"PraatShell%d %ls", PRAAT_WINDOW_CLASS_NUMBER, theApplicationName);
-		swprintf (theWindowClassName, 100, L"PraatChildWindow%d %ls", PRAAT_WINDOW_CLASS_NUMBER, theApplicationName);
-		swprintf (theDrawingAreaClassName, 100, L"PraatDrawingArea%d %ls", PRAAT_WINDOW_CLASS_NUMBER, theApplicationName);
-		window = FindWindow (theWindowClassName, NULL);
+		Melder_sprint (theApplicationName,100, Melder_peek8to32 (argv [0]));
+		Melder_sprint (theApplicationClassName,100, U"PraatShell", PRAAT_WINDOW_CLASS_NUMBER, U" ", theApplicationName);
+		Melder_sprint (theWindowClassName,100, U"PraatChildWindow", PRAAT_WINDOW_CLASS_NUMBER, U" ", theApplicationName);
+		Melder_sprint (theDrawingAreaClassName,100, U"PraatDrawingArea", PRAAT_WINDOW_CLASS_NUMBER, U" ", theApplicationName);
+		window = FindWindow (Melder_peek32toW (theWindowClassName), NULL);
 		if (window != NULL) {
 			/*
 			 * We are in the second instance of Praat.
@@ -2873,46 +2875,21 @@ void GuiInitialize (const char *name, unsigned int *argc, char **argv)
 			 */
 			if (IsIconic (window)) ShowWindow (window, SW_RESTORE);
 			SetForegroundWindow (window);
-			if (theOpenDocumentCallback && argv [3] [0]) {
-				structMelderFile file = { 0 };
-				/*
-				 * The user dropped a file on the Praat icon or double-clicked a Praat file
-				 * while Praat was already running.
-				 * Windows may have enclosed the path between quotes;
-				 * this is especially likely to happen if the path contains spaces,
-				 * which on Windows XP is very usual.
-				 */
-				wchar_t *s = Melder_utf8ToWcs (argv [3]);
-				for (;;) {
-					bool endSeen = false;
-					while (*s == ' ' || *s == '\n') s ++;
-					if (*s == '\0') break;
-					wchar_t *path = s;
-					if (*s == '\"') {
-						path = ++ s;
-						while (*s != '\"' && *s != '\0') s ++;
-						if (*s == '\0') break;
-						Melder_assert (*s == '\"');
-						*s = '\0';
-					} else {
-						while (*s != ' ' && *s != '\n' && *s != '\0') s ++;
-						if (*s == ' ' || *s == '\n') {
-							*s = '\0';
-						} else {
-							endSeen = true;
-						}
+			if (theOpenDocumentCallback) {
+				for (unsigned int iarg = 1; iarg < argc; iarg ++) {
+					if (argv [iarg] [0] != '-') {
+						structMelderDir dir { 0 };
+						Melder_sprint (dir. path,kMelder_MAXPATH+1, Melder_getShellDirectory ());
+						Melder_setDefaultDir (& dir);
+						structMelderFile file = { 0 };
+						Melder_relativePathToFile (Melder_peek8to32 (argv [iarg]), & file);
+						theOpenDocumentCallback (& file);
 					}
-					swprintf (file. path, 500, L"%ls", path);
-					theOpenDocumentCallback (& file);
-					if (endSeen) break;
-					s ++;
 				}
 			}
 			exit (0);   // possible problem
 		}
 
-		sscanf (argv [1], "%p", & theGui.instance);
-
 		windowClass. cbSize = sizeof (WNDCLASSEX);
 		windowClass. style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS |
 			CS_OWNDC   // crucial: see GraphicsScreen_init ()
@@ -2925,28 +2902,19 @@ void GuiInitialize (const char *name, unsigned int *argc, char **argv)
 		windowClass. hCursor = LoadCursor (NULL, IDC_ARROW);
 		windowClass. hbrBackground = /*(HBRUSH) (COLOR_WINDOW + 1)*/ GetStockBrush (LTGRAY_BRUSH);
 		windowClass. lpszMenuName = NULL;
-		windowClass. lpszClassName = theWindowClassName;
+		windowClass. lpszClassName = Melder_32toW (theWindowClassName);
 		windowClass. hIconSm = NULL;
 		RegisterClassEx (& windowClass);
 		windowClass. hbrBackground = GetStockBrush (WHITE_BRUSH);
-		windowClass. lpszClassName = theDrawingAreaClassName;
+		windowClass. lpszClassName = Melder_32toW (theDrawingAreaClassName);
 		RegisterClassEx (& windowClass);
-		windowClass. lpszClassName = theApplicationClassName;
+		windowClass. lpszClassName = Melder_32toW (theApplicationClassName);
 		RegisterClassEx (& windowClass);
 		InitCommonControls ();
-		theCommandShow = atoi (argv [2]);
 	}
 	#endif
 }
 
-void GuiAppInitialize (const char *name,
-	void *dum2, int dum3, unsigned int *argc, char **argv, void *dum4, void *dum5)
-{
-	(void) dum4;
-	(void) dum5;
-	GuiInitialize (name, argc, argv);
-}
-
 void GuiApp_setApplicationShell (GuiObject shell) {
 	theApplicationShell = shell;
 }
@@ -3001,7 +2969,7 @@ void XtVaGetValues (GuiObject me, ...) {
 		case XmNlabelString:
 		case XmNtitleString:
 			Melder_assert (my widgetClass == xmCascadeButtonWidgetClass || my widgetClass == xmScaleWidgetClass);
-			text = Melder_wcsToUtf8 (my name); // BUG throwable
+			text = Melder_32to8 (my name);   // BUG throwable
 			*va_arg (arg, char **) = text;
 			break;
 		case XmNdialogTitle:
@@ -3097,10 +3065,9 @@ void XtVaGetValues (GuiObject me, ...) {
 		case XmNverticalScrollBar: *va_arg (arg, GuiObject *) = my motiff.scrolledWindow.verticalBar; break;
 		default: {
 			if (resource < 0 || resource >= sizeof motif_resourceNames / sizeof (char *))
-				Melder_flushError ("(XtVaGetValues:) Resource out of range (%d).", resource);
+				Melder_flushError (U"(XtVaGetValues:) Resource out of range (", resource, U").");
 			else
-				Melder_flushError ("(XtVaGetValues:) Unknown resource \"%s\".",
-					motif_resourceNames [resource]);
+				Melder_flushError (U"(XtVaGetValues:) Unknown resource \"", Melder_peek8to32 (motif_resourceNames [resource]), U"\".");
 			return;
 		}
 	}
@@ -3283,7 +3250,7 @@ void XmScrollBarSetValues (GuiObject me, int value, int sliderSize,
 	NativeScrollBar_set (me);
 	#if mac
 		if (theGui.duringUpdate)
-			_Gui_invalidateWidget (me);   /* HACK: necessary because VisRgn has temporarily been changed. */
+			_Gui_invalidateWidget (me);   // HACK: necessary because VisRgn has temporarily been changed
 	#endif
 	if (notify)	_Gui_callCallbacks (me, & my motiff.scrollBar.valueChangedCallbacks, NULL);
 }
@@ -3337,7 +3304,7 @@ void XmToggleButtonGadgetSetState (GuiObject me, Boolean value, Boolean notify)
 				GuiMac_clipOff ();
 			} break;
 			case xmCascadeButtonWidgetClass: {
-				if (my isControl) {   /* In window menu bar or in dynamic menu. */
+				if (my isControl) {   // in window menu bar or in dynamic menu
 					_GuiMac_clipOnParent (me);
 					Draw1Control (my nat.control.handle);
 					/* BUG: should make insensitive if not my shell.active or my macWindow != FrontWindow () */
@@ -3446,43 +3413,46 @@ void XmUpdateDisplay (GuiObject displayDummy) {
 
 /***** EVENT *****/
 
-static long numberOfTextWidgets = 0, textWidgetLocation = 0;
-static GuiObject nextTextWidget = NULL;
-static void _motif_inspectTextWidgets (GuiObject me, GuiObject text) {
+static void _motif_inspectTextWidgets (GuiObject me, GuiObject text,
+	long *p_numberOfTextWidgets, long *p_textWidgetLocation)
+{
 	for (GuiObject sub = my firstChild; sub != NULL; sub = sub -> nextSibling) {
 		if (MEMBER (sub, Shell)) continue;
 		if (MEMBER (sub, Text)) {
-			numberOfTextWidgets ++;
+			(*p_numberOfTextWidgets) ++;
 			if (sub == text) {
-				textWidgetLocation = numberOfTextWidgets;
+				*p_textWidgetLocation = *p_numberOfTextWidgets;
 			}
 		} else {
-			_motif_inspectTextWidgets (sub, text);
+			_motif_inspectTextWidgets (sub, text, p_numberOfTextWidgets, p_textWidgetLocation);
 		}
 	}
 }
-static void _motif_getLocatedTextWidget (GuiObject me) {
+static GuiObject _motif_getLocatedTextWidget (GuiObject me,
+	long *p_itextWidget, long textWidgetLocation)
+{
 	for (GuiObject sub = my firstChild; sub != NULL; sub = sub -> nextSibling) {
 		if (MEMBER (sub, Shell)) continue;
 		if (MEMBER (sub, Text)) {
-			numberOfTextWidgets ++;
-			if (numberOfTextWidgets == textWidgetLocation) {
-				nextTextWidget = sub;
+			(*p_itextWidget) ++;
+			if (*p_itextWidget == textWidgetLocation) {
+				return sub;
 			}
 		} else {
-			_motif_getLocatedTextWidget (sub);
+			GuiObject locatedTextWidget = _motif_getLocatedTextWidget (sub, p_itextWidget, textWidgetLocation);
+			if (locatedTextWidget) return locatedTextWidget;
 		}
 	}
+	return NULL;
 }
 static GuiObject _motif_getNextTextWidget (GuiObject shell, GuiObject text, bool backward) {
-	numberOfTextWidgets = 0;
-	textWidgetLocation = 0;
-	_motif_inspectTextWidgets (shell, text);
+	long numberOfTextWidgets = 0, textWidgetLocation = 0;
+	_motif_inspectTextWidgets (shell, text, & numberOfTextWidgets, & textWidgetLocation);
+	trace (U"Found ", numberOfTextWidgets, U" text widgets.");
 	if (numberOfTextWidgets == 0) return NULL;   // no tab navigation if there is no text widget (shouldn't normally occur)
 	Melder_assert (textWidgetLocation >= 1);
 	Melder_assert (textWidgetLocation <= numberOfTextWidgets);
 	if (numberOfTextWidgets == 1) return NULL;   // no tab navigation if there is only one text widget
-	nextTextWidget = NULL;
 	if (backward) {
 		textWidgetLocation --;   // tab to previous text widget
 		if (textWidgetLocation < 1) textWidgetLocation = numberOfTextWidgets;   // if at beginning, then tab around to last text widget
@@ -3490,9 +3460,8 @@ static GuiObject _motif_getNextTextWidget (GuiObject shell, GuiObject text, bool
 		textWidgetLocation ++;   // tab to next text widget
 		if (textWidgetLocation > numberOfTextWidgets) textWidgetLocation = 1;   // if at end, then tab around to first text widget
 	}
-	numberOfTextWidgets = 0;
-	_motif_getLocatedTextWidget (shell);
-	return nextTextWidget;
+	long itextWidget = 0;
+	return _motif_getLocatedTextWidget (shell, & itextWidget, textWidgetLocation);
 }
 
 #if win
@@ -3650,7 +3619,7 @@ static void _motif_processActivateEvent (EventRecord *event) {
 static void _motif_processOsEvent (EventRecord *event) {
 	unsigned char messageKind = ((unsigned long) event -> message & 0xFF000000) >> 24;
 	if (messageKind == mouseMovedMessage) {
-		Melder_fatal ("_motif_processOsEvent -- mouseMovedMessage");
+		Melder_fatal (U"_motif_processOsEvent -- mouseMovedMessage");
 		Point location = event -> where;
 	} else if (messageKind == suspendResumeMessage && 0) {
 		//Melder_fatal ("_motif_processOsEvent -- suspendResumeMessage");
@@ -3682,7 +3651,7 @@ static GuiObject _motif_findDrawingArea (GuiObject me) {
 	GuiObject sub;
 	if (my widgetClass == xmDrawingAreaWidgetClass) return me;
 	for (sub = my firstChild; sub != NULL; sub = sub -> nextSibling)
-		if (sub -> widgetClass != xmShellWidgetClass) {   /* Only in same mac window. */
+		if (sub -> widgetClass != xmShellWidgetClass) {   // only in same Mac window
 			GuiObject drawingArea = _motif_findDrawingArea (sub);
 			if (drawingArea) return drawingArea;
 		}
@@ -3709,7 +3678,7 @@ static int _motif_shell_processKeyboardEquivalent (GuiObject shell, unsigned cha
 	 * These bytes are above 128, except Option-Command-I and Option-Command-N, which give 94 and 126 instead,
 	 * but since these are shifted characters ("^" and "~"), there will be no confusion. So we fix it all.
 	 */
-	//Melder_casual ("Keyboard shortcut %d to shell %ld", (int) kar, shell);
+	//Melder_casual (U"Keyboard shortcut ", (int) kar, U" to shell ", Melder_pointer (shell));
 	if (modifiers == (_motif_COMMAND_MASK | _motif_OPTION_MASK)) {
 		if (modifiers & _motif_SHIFT_MASK) {
 			/* Ignore the triple modifiers! */
@@ -3841,7 +3810,7 @@ static bool _motif_processKeyDownEvent (EventHandlerCallRef nextHandler, EventRe
 				GuiObject nextTextWidget = _motif_getNextTextWidget (shell, text, modifiers & _motif_SHIFT_MASK);
 				if (nextTextWidget != NULL) {
 					_GuiText_setTheTextFocus (nextTextWidget);
-					((GuiText) nextTextWidget -> userData) -> f_setSelection (0, 10000000);
+					GuiText_setSelection ((GuiText) nextTextWidget -> userData, 0, 10000000);
 					return true;
 				}
 			}
@@ -4155,7 +4124,7 @@ static void _motif_processMouseDownEvent (EventRecord *event) {
 						case kControlEditTextPart: _GuiMacText_handleClick (control, event); break;
 						default: break;
 					}
-				} else {   /* Clicked in content region, but not in a control. */
+				} else {   // clicked in content region, but not in a control
 					GuiObject shell, clicked;
 					LABEL_clickedOutsideControl:
 					shell = (GuiObject) GetWRefCon (macvenster);
@@ -4165,9 +4134,9 @@ static void _motif_processMouseDownEvent (EventRecord *event) {
 						if (clicked -> widgetClass == xmListWidgetClass) {
 							_GuiMacList_handleClick (clicked, event);
 						} else if (clicked -> widgetClass == xmTextWidgetClass) {
-							if (clicked -> isControl) {   /* A click in the margin of an EditText control !! */
+							if (clicked -> isControl) {   // a click in the margin of an EditText control !!
 								_GuiMacText_handleClick (clicked, event);   // BUG?:
-								;   /* Do nothing. To react would feel like clicking after all text. */
+								;   // do nothing; to react would feel like clicking after all text
 							} else {
 								_GuiMacText_handleClick (clicked, event);
 							}
@@ -4253,7 +4222,7 @@ void XtNextEvent (XEvent *xevent) {
 	#endif
 }
 
-static void processWorkProcsAndTimeOuts (void) {
+static void processWorkProcsAndTimeOuts () {
 	long i;
 	if (theNumberOfWorkProcs) for (i = 9; i >= 1; i --)
 		if (theWorkProcs [i])
@@ -4262,7 +4231,7 @@ static void processWorkProcsAndTimeOuts (void) {
 		if (theNumberOfTimeOuts) {
 			clock_t now = clock ();
 			for (i = 1; i < 10; i ++) if (theTimeOutProcs [i]) {
-				static volatile clock_t timeElapsed;   /* Careful: use 32-bit integers circularly; prevent optimization. */
+				static volatile clock_t timeElapsed;   // careful: use 32-bit integers circularly; prevent optimization
 				timeElapsed = now - theTimeOutStarts [i];
 				if (timeElapsed > theTimeOutIntervals [i]) {
 					theTimeOutProcs [i] (theTimeOutClosures [i], & i);
@@ -4282,7 +4251,7 @@ void GuiNextEvent (XEvent *xevent) {
 				processWorkProcsAndTimeOuts ();   // Handle chores during idle time.
 				xevent -> message = 0;   // Hand null message to XtDispatchEvent.
 			}
-		} else GetMessage (xevent, NULL, 0, 0);   // Be neighbour-friendly: do not hand null events.
+		} else GetMessage (xevent, NULL, 0, 0);   // be neighbour-friendly: do not hand null events
 	#elif mac
 		processWorkProcsAndTimeOuts ();
 		XtNextEvent (xevent);
@@ -4324,11 +4293,11 @@ static int win_processKeyboardEquivalent (GuiObject me, int kar, int modifiers)
 	static GuiObject _motif_findDrawingArea (GuiObject me) {
 		if (my widgetClass == xmDrawingAreaWidgetClass) return me;
 		for (GuiObject sub = my firstChild; sub != NULL; sub = sub -> nextSibling)
-			if (! MEMBER (sub, Shell)) {   /* Only in same top window. */
+			if (! MEMBER (sub, Shell)) {   // only in same top window
 				GuiObject drawingArea = _motif_findDrawingArea (sub);
 				if (drawingArea) return drawingArea;
 			}
-		return NULL;   /* No DrawingArea found. */
+		return NULL;   // no DrawingArea found
 	}
 #endif
 
@@ -4390,44 +4359,44 @@ modifiers & _motif_SHIFT_MASK ? " shift" : "", message -> message == WM_KEYDOWN
 				unsigned long acc = my shell -> motiff.shell.lowAccelerators [modifiers];
 				//if (kar != VK_CONTROL) Melder_casual ("%d %d", acc, kar);
 				if (kar < 48) {
-					if (kar == VK_BACK) {   /* Shortcut or text. */
+					if (kar == VK_BACK) {   // shortcut or text
 						if (acc & 1 << GuiMenu_BACKSPACE) { win_processKeyboardEquivalent (my shell, GuiMenu_BACKSPACE, modifiers); return; }
-					} else if (kar == VK_TAB) {   /* Shortcut or text. */
+					} else if (kar == VK_TAB) {   // shortcut or text
 						if (acc & 1 << GuiMenu_TAB) { win_processKeyboardEquivalent (my shell, GuiMenu_TAB, modifiers); return; }
-					} else if (kar == VK_RETURN) {   /* Shortcut, default button, or text. */
-						//Melder_information (L"RETURN ", Melder_integer (acc), L" def ", Melder_integer ((long) my shell -> defaultButton));
+					} else if (kar == VK_RETURN) {   // shortcut, default button, or text
+						//Melder_information (U"RETURN ", acc, U" def ", Melder_pointer (my shell -> defaultButton));
 						if (acc & 1 << GuiMenu_ENTER) { win_processKeyboardEquivalent (my shell, GuiMenu_ENTER, modifiers); return; }
 						else {
 							if (my shell -> defaultButton && _GuiWinButton_tryToHandleShortcutKey (my shell -> defaultButton)) return;
 						}
-					} else if (kar == VK_ESCAPE) {   /* Shortcut or cancel button. */
+					} else if (kar == VK_ESCAPE) {   // shortcut or cancel button
 						if (acc & 1 << GuiMenu_ESCAPE) { win_processKeyboardEquivalent (my shell, GuiMenu_ESCAPE, modifiers); return; }
 						else {
 							if (my shell -> cancelButton && _GuiWinButton_tryToHandleShortcutKey (my shell -> cancelButton)) return;
 						}
 						return;
-					} else if (kar == VK_PRIOR) {   /* Shortcut or text. */
+					} else if (kar == VK_PRIOR) {   // shortcut or text
 						if (acc & 1 << GuiMenu_PAGE_UP) { win_processKeyboardEquivalent (my shell, GuiMenu_PAGE_UP, modifiers); return; }
-					} else if (kar == VK_NEXT) {   /* Shortcut or text. */
+					} else if (kar == VK_NEXT) {   // shortcut or text
 						if (acc & 1 << GuiMenu_PAGE_DOWN) { win_processKeyboardEquivalent (my shell, GuiMenu_PAGE_DOWN, modifiers); return; }
-					} else if (kar == VK_HOME) {   /* Shortcut or text. */
+					} else if (kar == VK_HOME) {   // shortcut or text
 						if (acc & 1 << GuiMenu_HOME) { win_processKeyboardEquivalent (my shell, GuiMenu_HOME, modifiers); return; }
-					} else if (kar == VK_END) {   /* Shortcut or text. */
+					} else if (kar == VK_END) {   // shortcut or text
 						if (acc & 1 << GuiMenu_END) { win_processKeyboardEquivalent (my shell, GuiMenu_END, modifiers); return; }
-					} else if (kar == VK_LEFT) {   /* Shortcut or text. */
+					} else if (kar == VK_LEFT) {   // shortcut or text
 						if (acc & 1 << GuiMenu_LEFT_ARROW) { win_processKeyboardEquivalent (my shell, GuiMenu_LEFT_ARROW, modifiers); return; }
-					} else if (kar == VK_RIGHT) {   /* Shortcut or text. */
+					} else if (kar == VK_RIGHT) {   // shortcut or text
 						if (acc & 1 << GuiMenu_RIGHT_ARROW) { win_processKeyboardEquivalent (my shell, GuiMenu_RIGHT_ARROW, modifiers); return; }
-					} else if (kar == VK_UP) {   /* Shortcut or text. */
+					} else if (kar == VK_UP) {   // shortcut or text
 						if (acc & 1 << GuiMenu_UP_ARROW) { win_processKeyboardEquivalent (my shell, GuiMenu_UP_ARROW, modifiers); return; }
-					} else if (kar == VK_DOWN) {   /* Shortcut or text. */
+					} else if (kar == VK_DOWN) {   // shortcut or text
 						if (acc & 1 << GuiMenu_DOWN_ARROW) { win_processKeyboardEquivalent (my shell, GuiMenu_DOWN_ARROW, modifiers); return; }
-					} else if (kar == VK_INSERT) {   /* Shortcut. */
+					} else if (kar == VK_INSERT) {   // shortcut
 						win_processKeyboardEquivalent (my shell, GuiMenu_INSERT, modifiers);
 						return;
-					} else if (kar == VK_DELETE) {   /* Shortcut or text. */
+					} else if (kar == VK_DELETE) {   // shortcut or text
 						if (acc & 1 << GuiMenu_DELETE) { win_processKeyboardEquivalent (my shell, GuiMenu_DELETE, modifiers); return; }
-					} else if (kar == VK_HELP) {   /* Simulate Command-?. */
+					} else if (kar == VK_HELP) {   // simulate Command-?
 						win_processKeyboardEquivalent (my shell, '?', modifiers | _motif_SHIFT_MASK);
 						return;
 					}
@@ -4442,7 +4411,7 @@ modifiers & _motif_SHIFT_MASK ? " shift" : "", message -> message == WM_KEYDOWN
 				 */
 				} else if (modifiers & _motif_COMMAND_MASK) {
 					if (MEMBER (me, Text) && (kar == 'X' || kar == 'C' || kar == 'V' || kar == 'Z')) {
-						;   // Let window proc handle text editing.
+						;   // let window proc handle text editing
 					} else if (kar >= 186) {
 						int shift = modifiers & _motif_SHIFT_MASK;
 						/*
@@ -4455,7 +4424,7 @@ modifiers & _motif_SHIFT_MASK ? " shift" : "", message -> message == WM_KEYDOWN
 						    kar == 190 && win_processKeyboardEquivalent (my shell, shift ? '>' : '.', modifiers) ||
 						    kar == 191 && win_processKeyboardEquivalent (my shell, shift ? '?' : '/', modifiers) ||
 						    kar == 192 && win_processKeyboardEquivalent (my shell, shift ? '~' : '`', modifiers) ||
-						    kar == 219 && win_processKeyboardEquivalent (my shell, shift ? '{' : '[', modifiers) ||   /* Alt-GR-ringel-s is here. */
+						    kar == 219 && win_processKeyboardEquivalent (my shell, shift ? '{' : '[', modifiers) ||   // Alt-GR-ringel-s is here
 						    kar == 220 && win_processKeyboardEquivalent (my shell, shift ? '|' : '\\', modifiers) ||
 						    kar == 221 && win_processKeyboardEquivalent (my shell, shift ? '}' : ']', modifiers) ||
 						    kar == 222 && win_processKeyboardEquivalent (my shell, shift ? '\"' : '\'', modifiers))
@@ -4463,7 +4432,7 @@ modifiers & _motif_SHIFT_MASK ? " shift" : "", message -> message == WM_KEYDOWN
 							return;
 						}
 					} else {
-						if (win_processKeyboardEquivalent (my shell, kar, modifiers)) return;   /* Handle shortcuts like Ctrl-T and Ctrl-Alt-T. */
+						if (win_processKeyboardEquivalent (my shell, kar, modifiers)) return;   // handle shortcuts like Ctrl-T and Ctrl-Alt-T
 						/* Let window proc handle international Alt-GR (= Ctrl-Alt) sequences, which are plain characters. */
 					}
 				}
@@ -4488,10 +4457,12 @@ modifiers & _motif_SHIFT_MASK ? " shift" : "", message -> message == WM_KEYDOWN
 			 * Next, try tab navigation.
 			 */
 			if (me && MEMBER (me, Text) && kar == 9) {
+				trace (U"Tab navigation with shell ", Melder_pointer (my shell), U" and from text widget ", Melder_pointer (me));
 				GuiObject nextTextWidget = _motif_getNextTextWidget (my shell, me, GetKeyState (VK_SHIFT) < 0);
+				trace (U"Tab navigation to text widget ", Melder_pointer (nextTextWidget));
 				if (nextTextWidget != NULL) {
 					_GuiText_setTheTextFocus (nextTextWidget);
-					((GuiText) nextTextWidget -> userData) -> f_setSelection (0, 10000000);
+					GuiText_setSelection ((GuiText) nextTextWidget -> userData, 0, 10000000);
 					return;
 				}
 			}
@@ -4501,7 +4472,7 @@ modifiers & _motif_SHIFT_MASK ? " shift" : "", message -> message == WM_KEYDOWN
 			 * post the associated menu, if any.
 			 */
 			GuiObject me = (GuiObject) GetWindowLongPtr (message -> hwnd, GWLP_USERDATA);
-			//Melder_information (Melder_integer ((long) me), L" -- ", Melder_integer ((long) my subMenuId));
+			//Melder_information (Melder_pointer (me), U" -- ", Melder_pointer (my subMenuId));
 			if (me && MEMBER (me, CascadeButton) && my subMenuId) {
 				RECT rect;
 				GetWindowRect (my window, & rect);
@@ -4524,35 +4495,27 @@ void GuiMainLoop () {
 }
 
 #if win
+	#if defined (_WIN32)
+		#define main wingwmain
+	#endif
 	extern int main (int argc, char *argv []);
-	int APIENTRY WinMain (HINSTANCE instance, HINSTANCE previousInstance, LPSTR commandLine, int commandShow) {
-		int argc = 4;
-		char instanceString [20], commandShowString [20];
-		const char *argv [4];
-		(void) previousInstance;
-		argv [0] = "dummy";
-		sprintf (instanceString, "%p", instance);
-		sprintf (commandShowString, "%d", commandShow);
-		argv [1] = & instanceString [0];
-		argv [2] = & commandShowString [0];
-		argv [3] = Melder_wcsToUtf8 (GetCommandLineW ());   // it's OK to ignore the possibility of low memory
-		if (argv [3] [0] == '\"') {
-			argv [3] ++;   // skip quote
-			while (argv [3] [0] != '\"') { argv [3] ++; }
-			argv [3] ++;   // skip quote
-			if (argv [3] [0] == ' ') argv [3] ++;
-		} else {
-			while (argv [3] [0] != ' ' && argv [3] [0] != '\0')  { argv [3] ++; }
-			if (argv [3] [0] == ' ') argv [3] ++;
+	int APIENTRY WinMain (HINSTANCE instance, HINSTANCE /*previousInstance*/, LPSTR commandLine, int commandShow) {
+		theGui.instance = instance;
+		theGui.commandShow = commandShow;
+		int argc;
+		WCHAR** argvW = CommandLineToArgvW (GetCommandLineW (), & argc);
+		char** argv = Melder_malloc (char*, argc);
+		for (int iarg = 0; iarg < argc; iarg ++) {
+			argv [iarg] = Melder_32to8 (Melder_peekWto32 (argvW [iarg]));
 		}
-		return main (argc, (char **) & argv [0]);
+		return main (argc, argv);
 	}
 
 	static void on_close (HWND window) {
 		GuiObject me = (GuiObject) GetWindowLongPtr (window, GWLP_USERDATA);
 		if (me) {
 			if (my widgetClass == xmShellWidgetClass) {
-				int deleteResponse = my deleteResponse;   /* Save this, in case the callback should kill the widget (XmDO_NOTHING). */
+				int deleteResponse = my deleteResponse;   // save this, in case the callback should kill the widget (XmDO_NOTHING)
 				GuiObject parent = my parent;
 				if (my motiff.shell.goAwayCallback)
 					my motiff.shell.goAwayCallback (me, my motiff.shell.goAwayClosure, NULL);
@@ -4628,7 +4591,7 @@ void GuiMainLoop () {
 							} else if (codeNotify == EN_SETFOCUS) {
 								_GuiText_handleFocusReception (control);
 							} else if (codeNotify == EN_KILLFOCUS) {
-								_GuiText_handleFocusLoss (control);   /* For button clicks (see above). */
+								_GuiText_handleFocusLoss (control);   // for button clicks (see above)
 							}
 							break;
 						default: break;
@@ -4713,7 +4676,7 @@ void GuiMainLoop () {
 		Melder_assert (down == true);
 		GuiObject me = (GuiObject) GetWindowLongPtr (window, GWLP_USERDATA);
 		if (me && key >= VK_LEFT && key <= VK_DOWN) {
-			//Melder_warning ("Widget type ", Melder_integer (my widgetClass));
+			//Melder_warning (U"Widget type ", my widgetClass);
 			if (MEMBER (me, Shell)) {
 				GuiObject drawingArea = _motif_findDrawingArea (me);
 				if (drawingArea) {
@@ -4730,7 +4693,7 @@ void GuiMainLoop () {
 	static void on_char (HWND window, TCHAR kar, int repeat) {
 		GuiObject me = (GuiObject) GetWindowLongPtr (window, GWLP_USERDATA);
 		if (me) {
-			//Melder_warning ("Widget type ", Melder_integer (my widgetClass));
+			//Melder_warning (U"Widget type ", my widgetClass);
 			if (MEMBER (me, Shell)) {
 				GuiObject drawingArea = _motif_findDrawingArea (me);
 				if (drawingArea) {
@@ -4812,28 +4775,25 @@ void GuiMainLoop () {
 			default: return DefWindowProc (window, message, wParam, lParam);
 		}
 	}
-	int motif_win_mouseStillDown (void) {
+	bool motif_win_mouseStillDown () {
 		XEvent event;
 		if (! GetCapture ()) SetCapture (theApplicationShell -> window);
 		if (PeekMessage (& event, 0, 0, 0, PM_REMOVE)) {
 			if (event. message == WM_LBUTTONUP) {
 				DispatchMessage (& event);
 				ReleaseCapture ();
-				return False;
+				return false;
 			}
 		}
-		return True;
+		return true;
 	}
 	void motif_win_setUserMessageCallback (int (*userMessageCallback) (void)) {
 		theUserMessageCallback = userMessageCallback;
 	}
 #endif
 #if mac
-	void motif_mac_setUserMessageCallbackA (int (*userMessageCallback) (char *message)) {
-		theUserMessageCallbackA = userMessageCallback;
-	}
-	void motif_mac_setUserMessageCallbackW (int (*userMessageCallback) (wchar_t *message)) {
-		theUserMessageCallbackW = userMessageCallback;
+	void motif_mac_setUserMessageCallback (int (*userMessageCallback) (char32 *message)) {
+		theUserMessageCallback = userMessageCallback;
 	}
 #endif
 void Gui_setOpenDocumentCallback (void (*openDocumentCallback) (MelderFile file)) {
diff --git a/sys/oo.h b/sys/oo.h
index 232aa81..51d6015 100644
--- a/sys/oo.h
+++ b/sys/oo.h
@@ -215,7 +215,6 @@
 /*** Class declaration in header file. ***/
 
 #define oo_CLASS_CREATE(klas,parent) \
-	typedef _Thing_auto <struct##klas> auto##klas; \
 	extern struct structClassInfo theClassInfo_##klas; \
 	extern ClassInfo class##klas
 
@@ -238,10 +237,10 @@
 #define oo_ENUMx_SET(type,storage,Type,x,setType)  type x [1 + setType##_MAX];
 #define oo_ENUMx_VECTOR(type,storage,Type,x,min,max)  type *x;
 
-#define oo_STRINGx(storage,x)  wchar_t *x;
-#define oo_STRINGx_ARRAY(storage,x,cap,n)  wchar_t *x [cap];
-#define oo_STRINGx_SET(storage,x,setType)  wchar_t *x [1 + setType##_MAX];
-#define oo_STRINGx_VECTOR(storage,x,min,max)  wchar_t **x;
+#define oo_STRINGx(storage,x)  char32 *x;
+#define oo_STRINGx_ARRAY(storage,x,cap,n)  char32 *x [cap];
+#define oo_STRINGx_SET(storage,x,setType)  char32 *x [1 + setType##_MAX];
+#define oo_STRINGx_VECTOR(storage,x,min,max)  char32 **x;
 
 #define oo_STRUCT(Type,x)  struct struct##Type x;
 #define oo_STRUCT_ARRAY(Type,x,cap,n)  struct struct##Type x [cap];
@@ -250,6 +249,7 @@
 #define oo_STRUCT_MATRIX_FROM(Type,x,row1,row2,col1,col2)  struct struct##Type **x;
 
 #define oo_OBJECT(Class,version,x)  Class x;
+#define oo_AUTO_OBJECT(Class,version,x)  auto##Class x;
 #define oo_COLLECTION(Class,x,ItemClass,version)  Class x;
 #define oo_FILE(x)  structMelderFile x;
 #define oo_DIR(x)  structMelderDir x;
@@ -267,27 +267,28 @@
 		static Data_Description s_description; \
 		bool canWriteAsEncoding (int outputEncoding); \
 		void writeText (MelderFile openFile); \
-		void readText (MelderReadText text); \
+		void readText (MelderReadText text, int formatVersion); \
 		void writeBinary (FILE *f); \
-		void readBinary (FILE *f); \
+		void readBinary (FILE *f, int formatVersion); \
 	};
 
 #define oo_DEFINE_CLASS(klas,parent) \
-	typedef class struct##klas *klas; \
+	typedef struct struct##klas *klas; \
+	typedef _Thing_auto <struct##klas> auto##klas; \
 	typedef struct##parent klas##_Parent; \
-	class struct##klas : public struct##parent { \
-		public:
+	struct struct##klas : public struct##parent {
+
 #define oo_END_CLASS(Class) \
-		virtual void v_destroy (); \
-		virtual void v_copy (Any data_to); \
-		virtual bool v_equal (Any otherData); \
+		void v_destroy () override; \
+		void v_copy (Any data_to) override; \
+		bool v_equal (Any otherData) override; \
 		static Data_Description s_description; \
-		virtual Data_Description v_description () { return s_description; } \
-		virtual bool v_canWriteAsEncoding (int outputEncoding); \
-		virtual void v_writeText (MelderFile openFile); \
-		virtual void v_readText (MelderReadText text); \
-		virtual void v_writeBinary (FILE *f); \
-		virtual void v_readBinary (FILE *f); \
+		Data_Description v_description () override { return s_description; } \
+		bool v_canWriteAsEncoding (int outputEncoding) override; \
+		void v_writeText (MelderFile openFile) override; \
+		void v_readText (MelderReadText text, int formatVersion) override; \
+		void v_writeBinary (FILE *f) override; \
+		void v_readBinary (FILE *f, int formatVersion) override; \
 	};
 
 /*** Miscellaneous. ***/
@@ -300,9 +301,6 @@
 #define oo_FROM(from)
 #define oo_ENDFROM
 
-/* For OBJECT fields that have version numbers: */
-#define oo_VERSION(version)
-
 /* Examples of the usage of the following macros:
 	For code that should only appear in reading methods (consistency checks etc.),
 		use:  #if oo_READING
@@ -322,19 +320,14 @@
 #define oo_DECLARING  1
 #define oo_DESTROYING  0
 #define oo_COPYING  0
-#define oo_EQUALLING  0
 #define oo_COMPARING  0
 #define oo_VALIDATING_ASCII  0
 #define oo_READING  0
 #define oo_READING_TEXT  0
 #define oo_READING_BINARY  0
-#define oo_READING_CACHE  0
-#define oo_READING_LISP  0
 #define oo_WRITING  0
 #define oo_WRITING_TEXT  0
 #define oo_WRITING_BINARY  0
-#define oo_WRITING_CACHE  0
-#define oo_WRITING_LISP  0
 #define oo_DESCRIBING  0
 
 /* End of file oo.h */
diff --git a/sys/oo_CAN_WRITE_AS_ENCODING.h b/sys/oo_CAN_WRITE_AS_ENCODING.h
index 976b495..a249522 100644
--- a/sys/oo_CAN_WRITE_AS_ENCODING.h
+++ b/sys/oo_CAN_WRITE_AS_ENCODING.h
@@ -1,6 +1,6 @@
 /* oo_CAN_WRITE_AS_ENCODING.h
  *
- * Copyright (C) 2007-2012,2013,2014 Paul Boersma
+ * Copyright (C) 2007-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,20 +39,33 @@
 
 #define oo_STRINGx(storage,x)  \
 	if (our x && ! Melder_isEncodable (our x, encoding)) return false;
+#define oo_STRING32x(storage,x)  \
+	if (our x && ! Melder_isEncodable (our x, encoding)) return false;
 
 #define oo_STRINGx_ARRAY(storage,x,cap,n)  \
 	for (int i = 0; i < n; i ++) \
 		if (our x [i] && ! Melder_isEncodable (our x [i], encoding)) return false;
+#define oo_STRING32x_ARRAY(storage,x,cap,n)  \
+	for (int i = 0; i < n; i ++) \
+		if (our x [i] && ! Melder_isEncodable (our x [i], encoding)) return false;
 
 #define oo_STRINGx_SET(storage,x,setType)  \
 	for (int i = 0; i <= setType##_MAX; i ++) \
 		if (our x [i] && ! Melder_isEncodable (our x [i], encoding)) return false;
+#define oo_STRING32x_SET(storage,x,setType)  \
+	for (int i = 0; i <= setType##_MAX; i ++) \
+		if (our x [i] && ! Melder_isEncodable (our x [i], encoding)) return false;
 
 #define oo_STRINGx_VECTOR(storage,x,min,max)  \
 	if (our x) { \
 		for (long i = min; i <= max; i ++) \
 			if (our x [i] && ! Melder_isEncodable (our x [i], encoding)) return false; \
 	}
+#define oo_STRING32x_VECTOR(storage,x,min,max)  \
+	if (our x) { \
+		for (long i = min; i <= max; i ++) \
+			if (our x [i] && ! Melder_isEncodable (our x [i], encoding)) return false; \
+	}
 
 #define oo_STRUCT(Type,x)  \
 	if (! our x. canWriteAsEncoding (encoding)) return false;
@@ -81,6 +94,9 @@
 #define oo_OBJECT(Class,version,x)  \
 	if (our x && ! Data_canWriteAsEncoding (our x, encoding)) return false;
 
+#define oo_AUTO_OBJECT(Class,version,x)  \
+	if (our x && ! Data_canWriteAsEncoding (our x.get(), encoding)) return false;
+
 #define oo_COLLECTION(Class,x,ItemClass,version)  \
 	if (our x && ! Data_canWriteAsEncoding (our x, encoding)) return false;
 
@@ -116,24 +132,17 @@
 
 #define oo_ENDFROM
 
-#define oo_VERSION(version)
-
 #define oo_DECLARING  0
 #define oo_DESTROYING  0
 #define oo_COPYING  0
-#define oo_EQUALLING  0
 #define oo_COMPARING  0
 #define oo_VALIDATING_ENCODING  1
 #define oo_READING  0
 #define oo_READING_TEXT  0
 #define oo_READING_BINARY  0
-#define oo_READING_CACHE  0
-#define oo_READING_LISP  0
 #define oo_WRITING  0
 #define oo_WRITING_TEXT  0
 #define oo_WRITING_BINARY  0
-#define oo_WRITING_CACHE  0
-#define oo_WRITING_LISP  0
 #define oo_DESCRIBING  0
 
 /* End of file oo_CAN_WRITE_AS_ENCODING.h */
diff --git a/sys/oo_COPY.h b/sys/oo_COPY.h
index 9db3646..96caef5 100644
--- a/sys/oo_COPY.h
+++ b/sys/oo_COPY.h
@@ -1,6 +1,6 @@
 /* oo_COPY.h
  *
- * Copyright (C) 1994-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1994-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,21 +49,21 @@
 	if (our x) thy x = NUMvector_copy (our x, min, max);
 
 #define oo_STRINGx(storage,x)  \
-	if (our x) thy x = Melder_wcsdup (our x);
+	if (our x) thy x = Melder_dup (our x);
 
 #define oo_STRINGx_ARRAY(storage,x,cap,n)  \
 	for (int i = 0; i < n; i ++) \
-		if (our x [i]) thy x [i] = Melder_wcsdup (our x [i]);
+		if (our x [i]) thy x [i] = Melder_dup (our x [i]);
 
 #define oo_STRINGx_SET(storage,x,setType)  \
 	for (int i = 0; i <= setType##_MAX; i ++) \
-		if (our x [i]) thy x [i] = Melder_wcsdup (our x [i]);
+		if (our x [i]) thy x [i] = Melder_dup (our x [i]);
 
 #define oo_STRINGx_VECTOR(storage,x,min,max)  \
 	if (our x) { \
-		thy x = NUMvector <wchar_t*> (min, max); \
+		thy x = NUMvector <char32*> (min, max); \
 		for (long i = min; i <= max; i ++) \
-			if (our x [i]) thy x [i] = Melder_wcsdup (our x [i]); \
+			if (our x [i]) thy x [i] = Melder_dup (our x [i]); \
 	}
 
 #define oo_STRUCT(Type,x)  \
@@ -95,6 +95,9 @@
 #define oo_OBJECT(Class,version,x)  \
 	if (our x) thy x = Data_copy (our x);
 
+#define oo_AUTO_OBJECT(Class,version,x)  \
+	if (our x) thy x = Data_copy (our x.get());
+
 #define oo_COLLECTION(Class,x,ItemClass,version)  \
 	if (our x) thy x = Data_copy (our x);
 
@@ -128,24 +131,17 @@
 
 #define oo_ENDFROM
 
-#define oo_VERSION(version)
-
 #define oo_DECLARING  0
 #define oo_DESTROYING  0
 #define oo_COPYING  1
-#define oo_EQUALLING  0
 #define oo_COMPARING  0
 #define oo_VALIDATING_ENCODING  0
 #define oo_READING  0
 #define oo_READING_TEXT  0
 #define oo_READING_BINARY  0
-#define oo_READING_CACHE  0
-#define oo_READING_LISP  0
 #define oo_WRITING  0
 #define oo_WRITING_TEXT  0
 #define oo_WRITING_BINARY  0
-#define oo_WRITING_CACHE  0
-#define oo_WRITING_LISP  0
 #define oo_DESCRIBING  0
 
 /* End of file oo_COPY.h */
diff --git a/sys/oo_DESCRIPTION.h b/sys/oo_DESCRIPTION.h
index 88f3f34..401ac37 100644
--- a/sys/oo_DESCRIPTION.h
+++ b/sys/oo_DESCRIPTION.h
@@ -20,246 +20,255 @@
 #include "oo_undef.h"
 
 #undef oo_BYTE
-#define oo_BYTE(x)  { L"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char) },
+#define oo_BYTE(x)  { U"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char) },
 #undef oo_INT
-#define oo_INT(x)  { L"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int) },
+#define oo_INT(x)  { U"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int) },
 #undef oo_INT32
-#define oo_INT32(x)  { L"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int32) },
+#define oo_INT32(x)  { U"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int32) },
 #undef oo_LONG
-#define oo_LONG(x)  { L"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long) },
+#define oo_LONG(x)  { U"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long) },
 #undef oo_UBYTE
-#define oo_UBYTE(x)  { L"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char) },
+#define oo_UBYTE(x)  { U"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char) },
 #undef oo_UINT
-#define oo_UINT(x)  { L"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int) },
+#define oo_UINT(x)  { U"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int) },
 #undef oo_ULONG
-#define oo_ULONG(x)  { L"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long) },
+#define oo_ULONG(x)  { U"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long) },
 #undef oo_BOOL
-#define oo_BOOL(x)  { L"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool) },
+#define oo_BOOL(x)  { U"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool) },
 #undef oo_FLOAT
-#define oo_FLOAT(x)  { L"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double) },
+#define oo_FLOAT(x)  { U"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double) },
 #undef oo_DOUBLE
-#define oo_DOUBLE(x)  { L"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double) },
+#define oo_DOUBLE(x)  { U"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double) },
 #undef oo_FCOMPLEX
-#define oo_FCOMPLEX(x)  { L"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex) },
+#define oo_FCOMPLEX(x)  { U"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex) },
 #undef oo_DCOMPLEX
-#define oo_DCOMPLEX(x)  { L"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex) },
+#define oo_DCOMPLEX(x)  { U"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex) },
 
 #undef oo_BYTE_ARRAY
-#define oo_BYTE_ARRAY(x,cap,n)  { L"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_BYTE_ARRAY(x,cap,n)  { U"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_INT_ARRAY
-#define oo_INT_ARRAY(x,cap,n)  { L"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_INT_ARRAY(x,cap,n)  { U"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_LONG_ARRAY
-#define oo_LONG_ARRAY(x,cap,n)  { L"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_LONG_ARRAY(x,cap,n)  { U"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_UBYTE_ARRAY
-#define oo_UBYTE_ARRAY(x,cap,n)  { L"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_UBYTE_ARRAY(x,cap,n)  { U"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_UINT_ARRAY
-#define oo_UINT_ARRAY(x,cap,n)  { L"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_UINT_ARRAY(x,cap,n)  { U"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_ULONG_ARRAY
-#define oo_ULONG_ARRAY(x,cap,n)  { L"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_ULONG_ARRAY(x,cap,n)  { U"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_BOOL_ARRAY
-#define oo_BOOL_ARRAY(x,cap,n)  { L"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_BOOL_ARRAY(x,cap,n)  { U"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_FLOAT_ARRAY
-#define oo_FLOAT_ARRAY(x,cap,n)  { L"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_FLOAT_ARRAY(x,cap,n)  { U"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_DOUBLE_ARRAY
-#define oo_DOUBLE_ARRAY(x,cap,n)  { L"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_DOUBLE_ARRAY(x,cap,n)  { U"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_FCOMPLEX_ARRAY
-#define oo_FCOMPLEX_ARRAY(x,cap,n)  { L"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_FCOMPLEX_ARRAY(x,cap,n)  { U"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_DCOMPLEX_ARRAY
-#define oo_DCOMPLEX_ARRAY(x,cap,n)  { L"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_DCOMPLEX_ARRAY(x,cap,n)  { U"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, - cap, (const char32 *) 0, U"" #n },
 
 #undef oo_BYTE_SET
-#define oo_BYTE_SET(x,setType)  { L"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue }, /* BUG function pointer to pointer */
+#define oo_BYTE_SET(x,setType)  { U"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue }, /* BUG function pointer to pointer */
 #undef oo_INT_SET
-#define oo_INT_SET(x,setType)  { L"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_INT_SET(x,setType)  { U"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_LONG_SET
-#define oo_LONG_SET(x,setType)  { L"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_LONG_SET(x,setType)  { U"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_UBYTE_SET
-#define oo_UBYTE_SET(x,setType)  { L"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_UBYTE_SET(x,setType)  { U"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_UINT_SET
-#define oo_UINT_SET(x,setType)  { L"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_UINT_SET(x,setType)  { U"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_ULONG_SET
-#define oo_ULONG_SET(x,setType)  { L"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_ULONG_SET(x,setType)  { U"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_BOOL_SET
-#define oo_BOOL_SET(x,setType)  { L"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_BOOL_SET(x,setType)  { U"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_FLOAT_SET
-#define oo_FLOAT_SET(x,setType)  { L"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_FLOAT_SET(x,setType)  { U"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_DOUBLE_SET
-#define oo_DOUBLE_SET(x,setType)  { L"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_DOUBLE_SET(x,setType)  { U"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_FCOMPLEX_SET
-#define oo_FCOMPLEX_SET(x,setType)  { L"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_FCOMPLEX_SET(x,setType)  { U"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_DCOMPLEX_SET
-#define oo_DCOMPLEX_SET(x,setType)  { L"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_DCOMPLEX_SET(x,setType)  { U"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 
 #undef oo_BYTE_VECTOR_FROM
-#define oo_BYTE_VECTOR_FROM(x,min,max)  { L"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 1, L"" #min, L"" #max },
+#define oo_BYTE_VECTOR_FROM(x,min,max)  { U"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_INT_VECTOR_FROM
-#define oo_INT_VECTOR_FROM(x,min,max)  { L"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, 1, L"" #min, L"" #max },
+#define oo_INT_VECTOR_FROM(x,min,max)  { U"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_LONG_VECTOR_FROM
-#define oo_LONG_VECTOR_FROM(x,min,max)  { L"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, 1, L"" #min, L"" #max },
+#define oo_LONG_VECTOR_FROM(x,min,max)  { U"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_UBYTE_VECTOR_FROM
-#define oo_UBYTE_VECTOR_FROM(x,min,max)  { L"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, 1, L"" #min, L"" #max },
+#define oo_UBYTE_VECTOR_FROM(x,min,max)  { U"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_UINT_VECTOR_FROM
-#define oo_UINT_VECTOR_FROM(x,min,max)  { L"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, 1, L"" #min, L"" #max },
+#define oo_UINT_VECTOR_FROM(x,min,max)  { U"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_ULONG_VECTOR_FROM
-#define oo_ULONG_VECTOR_FROM(x,min,max)  { L"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, 1, L"" #min, L"" #max },
+#define oo_ULONG_VECTOR_FROM(x,min,max)  { U"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_BOOL_VECTOR_FROM
-#define oo_BOOL_VECTOR_FROM(x,min,max)  { L"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, 1, L"" #min, L"" #max },
+#define oo_BOOL_VECTOR_FROM(x,min,max)  { U"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_FLOAT_VECTOR_FROM
-#define oo_FLOAT_VECTOR_FROM(x,min,max)  { L"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 1, L"" #min, L"" #max },
+#define oo_FLOAT_VECTOR_FROM(x,min,max)  { U"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_DOUBLE_VECTOR_FROM
-#define oo_DOUBLE_VECTOR_FROM(x,min,max)  { L"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 1, L"" #min, L"" #max },
+#define oo_DOUBLE_VECTOR_FROM(x,min,max)  { U"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_FCOMPLEX_VECTOR_FROM
-#define oo_FCOMPLEX_VECTOR_FROM(x,min,max)  { L"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, 1, L"" #min, L"" #max },
+#define oo_FCOMPLEX_VECTOR_FROM(x,min,max)  { U"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_DCOMPLEX_VECTOR_FROM
-#define oo_DCOMPLEX_VECTOR_FROM(x,min,max)  { L"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, 1, L"" #min, L"" #max },
+#define oo_DCOMPLEX_VECTOR_FROM(x,min,max)  { U"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, 1, U"" #min, U"" #max },
 
 #undef oo_BYTE_MATRIX_FROM
-#define oo_BYTE_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_BYTE_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_INT_MATRIX_FROM
-#define oo_INT_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_INT_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_LONG_MATRIX_FROM
-#define oo_LONG_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_LONG_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_UBYTE_MATRIX_FROM
-#define oo_UBYTE_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_UBYTE_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_UINT_MATRIX_FROM
-#define oo_UINT_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_UINT_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_ULONG_MATRIX_FROM
-#define oo_ULONG_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_ULONG_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_BOOL_MATRIX_FROM
-#define oo_BOOL_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_BOOL_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_FLOAT_MATRIX_FROM
-#define oo_FLOAT_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_FLOAT_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_DOUBLE_MATRIX_FROM
-#define oo_DOUBLE_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_DOUBLE_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_FCOMPLEX_MATRIX_FROM
-#define oo_FCOMPLEX_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_FCOMPLEX_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_DCOMPLEX_MATRIX_FROM
-#define oo_DCOMPLEX_MATRIX_FROM(x,r1,r2,c1,c2)  { L"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_DCOMPLEX_MATRIX_FROM(x,r1,r2,c1,c2)  { U"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 
 #undef oo_BYTE_VECTOR
-#define oo_BYTE_VECTOR(x,n)  { L"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_BYTE_VECTOR(x,n)  { U"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_INT_VECTOR
-#define oo_INT_VECTOR(x,n)  { L"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_INT_VECTOR(x,n)  { U"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_LONG_VECTOR
-#define oo_LONG_VECTOR(x,n)  { L"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_LONG_VECTOR(x,n)  { U"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_UBYTE_VECTOR
-#define oo_UBYTE_VECTOR(x,n)  { L"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_UBYTE_VECTOR(x,n)  { U"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_UINT_VECTOR
-#define oo_UINT_VECTOR(x,n)  { L"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_UINT_VECTOR(x,n)  { U"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_ULONG_VECTOR
-#define oo_ULONG_VECTOR(x,n)  { L"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_ULONG_VECTOR(x,n)  { U"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_BOOL_VECTOR
-#define oo_BOOL_VECTOR(x,n)  { L"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_BOOL_VECTOR(x,n)  { U"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_FLOAT_VECTOR
-#define oo_FLOAT_VECTOR(x,n)  { L"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_FLOAT_VECTOR(x,n)  { U"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_DOUBLE_VECTOR
-#define oo_DOUBLE_VECTOR(x,n)  { L"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_DOUBLE_VECTOR(x,n)  { U"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_FCOMPLEX_VECTOR
-#define oo_FCOMPLEX_VECTOR(x,n)  { L"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_FCOMPLEX_VECTOR(x,n)  { U"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_DCOMPLEX_VECTOR
-#define oo_DCOMPLEX_VECTOR(x,n)  { L"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_DCOMPLEX_VECTOR(x,n)  { U"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, 1, (const char32 *) 0, U"" #n },
 
 #undef oo_BYTE_MATRIX
-#define oo_BYTE_MATRIX(x,nrow,ncol)  { L"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_BYTE_MATRIX(x,nrow,ncol)  { U"" #x, bytewa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 #undef oo_INT_MATRIX
-#define oo_INT_MATRIX(x,nrow,ncol)  { L"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_INT_MATRIX(x,nrow,ncol)  { U"" #x, intwa, Melder_offsetof (ooSTRUCT, x), sizeof (int), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 #undef oo_LONG_MATRIX
-#define oo_LONG_MATRIX(x,nrow,ncol)  { L"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_LONG_MATRIX(x,nrow,ncol)  { U"" #x, longwa, Melder_offsetof (ooSTRUCT, x), sizeof (long), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 #undef oo_UBYTE_MATRIX
-#define oo_UBYTE_MATRIX(x,nrow,ncol)  { L"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_UBYTE_MATRIX(x,nrow,ncol)  { U"" #x, ubytewa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned char), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 #undef oo_UINT_MATRIX
-#define oo_UINT_MATRIX(x,nrow,ncol)  { L"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_UINT_MATRIX(x,nrow,ncol)  { U"" #x, uintwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned int), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 #undef oo_ULONG_MATRIX
-#define oo_ULONG_MATRIX(x,nrow,ncol)  { L"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_ULONG_MATRIX(x,nrow,ncol)  { U"" #x, ulongwa, Melder_offsetof (ooSTRUCT, x), sizeof (unsigned long), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 #undef oo_BOOL_MATRIX
-#define oo_BOOL_MATRIX(x,nrow,ncol)  { L"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_BOOL_MATRIX(x,nrow,ncol)  { U"" #x, boolwa, Melder_offsetof (ooSTRUCT, x), sizeof (bool), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 #undef oo_FLOAT_MATRIX
-#define oo_FLOAT_MATRIX(x,nrow,ncol)  { L"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_FLOAT_MATRIX(x,nrow,ncol)  { U"" #x, floatwa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 #undef oo_DOUBLE_MATRIX
-#define oo_DOUBLE_MATRIX(x,nrow,ncol)  { L"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_DOUBLE_MATRIX(x,nrow,ncol)  { U"" #x, doublewa, Melder_offsetof (ooSTRUCT, x), sizeof (double), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 #undef oo_FCOMPLEX_MATRIX
-#define oo_FCOMPLEX_MATRIX(x,nrow,ncol)  { L"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_FCOMPLEX_MATRIX(x,nrow,ncol)  { U"" #x, fcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (fcomplex), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 #undef oo_DCOMPLEX_MATRIX
-#define oo_DCOMPLEX_MATRIX(x,nrow,ncol)  { L"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_DCOMPLEX_MATRIX(x,nrow,ncol)  { U"" #x, dcomplexwa, Melder_offsetof (ooSTRUCT, x), sizeof (dcomplex), 0, 0, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 
 #undef oo_ENUM
-#define oo_ENUM(Type,x)  { L"" #x, enumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), L"" #Type, (void *) Type##_getText },
+#define oo_ENUM(Type,x)  { U"" #x, enumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), U"" #Type, (void *) Type##_getText },
 #undef oo_LENUM
-#define oo_LENUM(Type,x)  { L"" #x, lenumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed short), L"" #Type, (void *) Type##_getText },
+#define oo_LENUM(Type,x)  { U"" #x, lenumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed short), U"" #Type, (void *) Type##_getText },
 #undef oo_ENUM_ARRAY
-#define oo_ENUM_ARRAY(Type,x,cap,n)  { L"" #x, enumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), L"" #Type, (void *) Type##_getText, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_ENUM_ARRAY(Type,x,cap,n)  { U"" #x, enumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), U"" #Type, (void *) Type##_getText, - cap, (const char32 *) 0, U"" #n },
 #undef oo_LENUM_ARRAY
-#define oo_LENUM_ARRAY(Type,x,cap,n)  { L"" #x, lenumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed short), L"" #Type, (void *) Type##_getText, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_LENUM_ARRAY(Type,x,cap,n)  { U"" #x, lenumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed short), U"" #Type, (void *) Type##_getText, - cap, (const char32 *) 0, U"" #n },
 #undef oo_ENUM_SET
-#define oo_ENUM_SET(Type,x,setType)  { L"" #x, enumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), L"" #Type, (void *) Type##_getText, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_ENUM_SET(Type,x,setType)  { U"" #x, enumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), U"" #Type, (void *) Type##_getText, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_LENUM_SET
-#define oo_LENUM_SET(Type,x,setType)  { L"" #x, lenumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed short), L"" #Type, (void *) Type##_getText, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_LENUM_SET(Type,x,setType)  { U"" #x, lenumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed short), U"" #Type, (void *) Type##_getText, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_ENUM_VECTOR_FROM
-#define oo_ENUM_VECTOR_FROM(Type,x,min,max)  { L"" #x, enumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), L"" #Type, (void *) Type##_getText, 1, L"" #min, L"" #max },
+#define oo_ENUM_VECTOR_FROM(Type,x,min,max)  { U"" #x, enumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), U"" #Type, (void *) Type##_getText, 1, U"" #min, U"" #max },
 #undef oo_LENUM_VECTOR_FROM
-#define oo_LENUM_VECTOR_FROM(Type,x,min,max)  { L"" #x, lenumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed short), L"" #Type, (void *) Type##_getText, 1, L"" #min, L"" #max },
+#define oo_LENUM_VECTOR_FROM(Type,x,min,max)  { U"" #x, lenumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed short), U"" #Type, (void *) Type##_getText, 1, U"" #min, U"" #max },
 #undef oo_ENUM_VECTOR
-#define oo_ENUM_VECTOR(Type,x,n)  { L"" #x, enumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), L"" #Type, (void *) Type##_getText, 1, (const wchar_t *) 0, L"" #n },
+#define oo_ENUM_VECTOR(Type,x,n)  { U"" #x, enumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), U"" #Type, (void *) Type##_getText, 1, (const char32 *) 0, U"" #n },
 #undef oo_LENUM_VECTOR
-#define oo_LENUM_VECTOR(Type,x,n)  { L"" #x, lenumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed short), L"" #Type, (void *) Type##_getText, 1, (const wchar_t *) 0, L"" #n },
+#define oo_LENUM_VECTOR(Type,x,n)  { U"" #x, lenumwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed short), U"" #Type, (void *) Type##_getText, 1, (const char32 *) 0, U"" #n },
 #undef oo_BOOLEAN
-#define oo_BOOLEAN(x)  { L"" #x, booleanwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char) },
+#define oo_BOOLEAN(x)  { U"" #x, booleanwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char) },
 #undef oo_BOOLEAN_ARRAY
-#define oo_BOOLEAN_ARRAY(x,cap,n)  { L"" #x, booleanwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_BOOLEAN_ARRAY(x,cap,n)  { U"" #x, booleanwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_BOOLEAN_SET
-#define oo_BOOLEAN_SET(x,setType)  { L"" #x, booleanwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_BOOLEAN_SET(x,setType)  { U"" #x, booleanwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_BOOLEAN_VECTOR_FROM
-#define oo_BOOLEAN_VECTOR_FROM(x,min,max)  { L"" #x, booleanwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, (const wchar_t *) 1, L"" #min, L"" #max },
+#define oo_BOOLEAN_VECTOR_FROM(x,min,max)  { U"" #x, booleanwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, (const char32 *) 1, U"" #min, U"" #max },
 #undef oo_BOOLEAN_VECTOR
-#define oo_BOOLEAN_VECTOR(x,n)  { L"" #x, booleanwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_BOOLEAN_VECTOR(x,n)  { U"" #x, booleanwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_QUESTION
-#define oo_QUESTION(x)  { L"" #x, questionwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char) },
+#define oo_QUESTION(x)  { U"" #x, questionwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char) },
 #undef oo_QUESTION_ARRAY
-#define oo_QUESTION_ARRAY(x,cap,n)  { L"" #x, questionwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_QUESTION_ARRAY(x,cap,n)  { U"" #x, questionwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_QUESTION_SET
-#define oo_QUESTION_SET(x,setType)  { L"" #x, questionwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_QUESTION_SET(x,setType)  { U"" #x, questionwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_QUESTION_VECTOR_FROM
-#define oo_QUESTION_VECTOR_FROM(x,min,max)  { L"" #x, questionwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 1, L"" #min, L"" #max },
+#define oo_QUESTION_VECTOR_FROM(x,min,max)  { U"" #x, questionwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_QUESTION_VECTOR
-#define oo_QUESTION_VECTOR(x,n)  { L"" #x, questionwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_QUESTION_VECTOR(x,n)  { U"" #x, questionwa, Melder_offsetof (ooSTRUCT, x), sizeof (signed char), 0, 0, 1, (const char32 *) 0, U"" #n },
 
 #undef oo_STRING
-#define oo_STRING(x)  { L"" #x, stringwa, Melder_offsetof (ooSTRUCT, x), sizeof (wchar_t *) },
+#define oo_STRING(x)  { U"" #x, stringwa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *) },
 #undef oo_LSTRING
-#define oo_LSTRING(x)  { L"" #x, lstringwa, Melder_offsetof (ooSTRUCT, x), sizeof (wchar_t *) },
+#define oo_LSTRING(x)  { U"" #x, lstringwa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *) },
 
 #undef oo_STRING_ARRAY
-#define oo_STRING_ARRAY(x,cap,n)  { L"" #x, stringwa, Melder_offsetof (ooSTRUCT, x), sizeof (wchar_t *), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_STRING_ARRAY(x,cap,n)  { U"" #x, stringwa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, - cap, (const char32 *) 0, U"" #n },
 #undef oo_LSTRING_ARRAY
-#define oo_LSTRING_ARRAY(x,cap,n)  { L"" #x, lstringwa, Melder_offsetof (ooSTRUCT, x), sizeof (wchar_t *), 0, 0, - cap, (const wchar_t *) 0, L"" #n },
+#define oo_LSTRING_ARRAY(x,cap,n)  { U"" #x, lstringwa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, - cap, (const char32 *) 0, U"" #n },
 
 #undef oo_STRING_SET
-#define oo_STRING_SET(x,setType)  { L"" #x, stringwa, Melder_offsetof (ooSTRUCT, x), sizeof (wchar_t *), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_STRING_SET(x,setType)  { U"" #x, stringwa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
+#undef oo_STRING32_SET
+#define oo_STRING32_SET(x,setType)  { U"" #x, string32wa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 #undef oo_LSTRING_SET
-#define oo_LSTRING_SET(x,setType)  { L"" #x, lstringwa, Melder_offsetof (ooSTRUCT, x), sizeof (wchar_t *), 0, 0, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
+#define oo_LSTRING_SET(x,setType)  { U"" #x, lstringwa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
+#undef oo_LSTRING32_SET
+#define oo_LSTRING32_SET(x,setType)  { U"" #x, lstring32wa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
 
 #undef oo_STRING_VECTOR_FROM
-#define oo_STRING_VECTOR_FROM(x,min,max)  { L"" #x, stringwa, Melder_offsetof (ooSTRUCT, x), sizeof (wchar_t *), 0, 0, 1, L"" #min, L"" #max },
+#define oo_STRING_VECTOR_FROM(x,min,max)  { U"" #x, stringwa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, 1, U"" #min, U"" #max },
+#undef oo_STRING32_VECTOR_FROM
+#define oo_STRING32_VECTOR_FROM(x,min,max)  { U"" #x, string32wa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, 1, U"" #min, U"" #max },
 #undef oo_LSTRING_VECTOR_FROM
-#define oo_LSTRING_VECTOR_FROM(x,min,max)  { L"" #x, lstringwa, Melder_offsetof (ooSTRUCT, x), sizeof (wchar_t *), 0, 0, 1, L"" #min, L"" #max },
+#define oo_LSTRING_VECTOR_FROM(x,min,max)  { U"" #x, lstringwa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, 1, U"" #min, U"" #max },
+#undef oo_LSTRING32_VECTOR_FROM
+#define oo_LSTRING32_VECTOR_FROM(x,min,max)  { U"" #x, lstring32wa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, 1, U"" #min, U"" #max },
 
 #undef oo_STRING_VECTOR
-#define oo_STRING_VECTOR(x,n)  { L"" #x, stringwa, Melder_offsetof (ooSTRUCT, x), sizeof (wchar_t *), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_STRING_VECTOR(x,n)  { U"" #x, stringwa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, 1, (const char32 *) 0, U"" #n },
 #undef oo_LSTRING_VECTOR
-#define oo_LSTRING_VECTOR(x,n)  { L"" #x, lstringwa, Melder_offsetof (ooSTRUCT, x), sizeof (wchar_t *), 0, 0, 1, (const wchar_t *) 0, L"" #n },
+#define oo_LSTRING_VECTOR(x,n)  { U"" #x, lstringwa, Melder_offsetof (ooSTRUCT, x), sizeof (char32 *), 0, 0, 1, (const char32 *) 0, U"" #n },
 
-#define oo_STRUCT(Type,x)  { L"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), L"" #Type, & struct##Type :: s_description },
-#define oo_STRUCT_ARRAY(Type,x,cap,n)  { L"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), L"" #Type, & struct##Type :: s_description, - cap, (const wchar_t *) 0, L"" #n },
-#define oo_STRUCT_SET(Type,x,setType)  { L"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), L"" #Type, & struct##Type :: s_description, 3, (const wchar_t *) setType##_getText, (const wchar_t *) setType##_getValue },
-#define oo_STRUCT_VECTOR_FROM(Type,x,min,max)  { L"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), L"" #Type, & struct##Type :: s_description, 1, L"" #min, L"" #max },
+#define oo_STRUCT(Type,x)  { U"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), U"" #Type, & struct##Type :: s_description },
+#define oo_STRUCT_ARRAY(Type,x,cap,n)  { U"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), U"" #Type, & struct##Type :: s_description, - cap, (const char32 *) 0, U"" #n },
+#define oo_STRUCT_SET(Type,x,setType)  { U"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), U"" #Type, & struct##Type :: s_description, 3, (const char32 *) setType##_getText, (const char32 *) setType##_getValue },
+#define oo_STRUCT_VECTOR_FROM(Type,x,min,max)  { U"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), U"" #Type, & struct##Type :: s_description, 1, U"" #min, U"" #max },
 #undef oo_STRUCT_VECTOR
-#define oo_STRUCT_VECTOR(Type,x,n)  { L"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), L"" #Type, & struct##Type :: s_description, 1, (const wchar_t *) 0, L"" #n },
-#define oo_STRUCT_MATRIX_FROM(Type,x,r1,r2,c1,c2)  { L"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), L"" #Type, & struct##Type :: s_description, 2, L"" #r1, L"" #r2, L"" #c1, L"" #c2 },
+#define oo_STRUCT_VECTOR(Type,x,n)  { U"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), U"" #Type, & struct##Type :: s_description, 1, (const char32 *) 0, U"" #n },
+#define oo_STRUCT_MATRIX_FROM(Type,x,r1,r2,c1,c2)  { U"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), U"" #Type, & struct##Type :: s_description, 2, U"" #r1, U"" #r2, U"" #c1, U"" #c2 },
 #undef oo_STRUCT_MATRIX
-#define oo_STRUCT_MATRIX(Type,x,nrow,ncol)  { L"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), L"" #Type, & struct##Type :: s_description, 2, (const wchar_t *) 0, L"" #nrow, (const wchar_t *) 0, L"" #ncol },
+#define oo_STRUCT_MATRIX(Type,x,nrow,ncol)  { U"" #x, structwa, Melder_offsetof (ooSTRUCT, x), sizeof (struct struct##Type), U"" #Type, & struct##Type :: s_description, 2, (const char32 *) 0, U"" #nrow, (const char32 *) 0, U"" #ncol },
 
-#define oo_OBJECT(Type,version,x)  { L"" #x, objectwa, Melder_offsetof (ooSTRUCT, x), sizeof (Type), L"" #Type, & theClassInfo_##Type },
-#define oo_COLLECTION(Type,x,ItemType,version)  { L"" #x, collectionwa, Melder_offsetof (ooSTRUCT, x), sizeof (class struct##ItemType), L"" #Type, & theClassInfo_##Type, 0, (const wchar_t *) & theClassInfo_##ItemType },
+#define oo_OBJECT(Type,version,x)  { U"" #x, objectwa, Melder_offsetof (ooSTRUCT, x), sizeof (Type), U"" #Type, & theClassInfo_##Type },
+#define oo_AUTO_OBJECT(Type,version,x)  { U"" #x, autoobjectwa, Melder_offsetof (ooSTRUCT, x), sizeof (Type), U"" #Type, & theClassInfo_##Type },
+#define oo_COLLECTION(Type,x,ItemType,version)  { U"" #x, collectionwa, Melder_offsetof (ooSTRUCT, x), sizeof (class struct##ItemType), U"" #Type, & theClassInfo_##Type, 0, (const char32 *) & theClassInfo_##ItemType },
 #define oo_FILE(x)
 #define oo_DIR(x)
 
@@ -272,7 +281,7 @@
 
 #define oo_DEFINE_CLASS(Class,Parent) \
 	static struct structData_Description the##Class##_description [] = { \
-		{ L"" #Class, inheritwa, 0, sizeof (class struct##Class), L"" #Class, & theClassInfo_##Parent },
+		{ U"" #Class, inheritwa, 0, sizeof (class struct##Class), U"" #Class, & theClassInfo_##Parent },
 #define oo_END_CLASS(Class) \
 		{ 0 } \
 	}; \
@@ -284,24 +293,17 @@
 #define oo_FROM(from)
 #define oo_ENDFROM
 
-#define oo_VERSION(version)
-
 #define oo_DECLARING  0
 #define oo_DESTROYING  0
 #define oo_COPYING  0
-#define oo_EQUALLING  0
 #define oo_COMPARING  0
 #define oo_VALIDATING_ENCODING  0
 #define oo_READING  0
 #define oo_READING_TEXT  0
 #define oo_READING_BINARY  0
-#define oo_READING_CACHE  0
-#define oo_READING_LISP  0
 #define oo_WRITING  0
 #define oo_WRITING_TEXT  0
 #define oo_WRITING_BINARY  0
-#define oo_WRITING_CACHE  0
-#define oo_WRITING_LISP  0
 #define oo_DESCRIBING  1
 
 /* End of file oo_DESCRIPTION.h */
diff --git a/sys/oo_DESTROY.h b/sys/oo_DESTROY.h
index 879442c..905baa7 100644
--- a/sys/oo_DESTROY.h
+++ b/sys/oo_DESTROY.h
@@ -1,6 +1,6 @@
 /* oo_DESTROY.h
  *
- * Copyright (C) 1994-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1994-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -56,7 +56,7 @@
 	if (our x) { \
 		for (long i = min; i <= max; i ++) \
 			Melder_free (our x [i]); \
-		NUMvector_free <wchar_t*> (our x, min); \
+		NUMvector_free <char32*> (our x, min); \
 	}
 
 #define oo_STRUCT(Type,x)  \
@@ -88,6 +88,8 @@
 #define oo_OBJECT(Class,version,x)  \
 	forget (our x);
 
+#define oo_AUTO_OBJECT(Class,version,x)
+
 #define oo_COLLECTION(Class,x,ItemClass,version)  \
 	forget (our x);
 
@@ -118,24 +120,17 @@
 
 #define oo_ENDFROM
 
-#define oo_VERSION(version)
-
 #define oo_DECLARING  0
 #define oo_DESTROYING  1
 #define oo_COPYING  0
-#define oo_EQUALLING  0
 #define oo_COMPARING  0
 #define oo_VALIDATING_ENCODING  0
 #define oo_READING  0
 #define oo_READING_TEXT  0
 #define oo_READING_BINARY  0
-#define oo_READING_CACHE  0
-#define oo_READING_LISP  0
 #define oo_WRITING  0
 #define oo_WRITING_TEXT  0
 #define oo_WRITING_BINARY  0
-#define oo_WRITING_CACHE  0
-#define oo_WRITING_LISP  0
 #define oo_DESCRIBING  0
 
 /* End of file oo_DESTROY.h */
diff --git a/sys/oo_EQUAL.h b/sys/oo_EQUAL.h
index 6d8aef5..a39f6c7 100644
--- a/sys/oo_EQUAL.h
+++ b/sys/oo_EQUAL.h
@@ -1,6 +1,6 @@
 /* oo_EQUAL.h
  *
- * Copyright (C) 1994-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1994-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -52,21 +52,21 @@
 		(our x && ! NUMvector_equal <type> (our x, thy x, min, max))) return false;
 
 #define oo_STRINGx(storage,x)  \
-	if (! Melder_wcsequ (our x, thy x)) return false;
+	if (! Melder_equ (our x, thy x)) return false;
 
 #define oo_STRINGx_ARRAY(storage,x,cap,n)  \
 	for (int i = 0; i < n; i ++) \
-		if (! Melder_wcsequ (our x [i], thy x [i])) return false;
+		if (! Melder_equ (our x [i], thy x [i])) return false;
 
 #define oo_STRINGx_SET(storage,x,setType)  \
 	for (int i = 0; i <= setType##_MAX; i ++) \
-		if (! Melder_wcsequ (our x [i], thy x [i])) return false;
+		if (! Melder_equ (our x [i], thy x [i])) return false;
 
 #define oo_STRINGx_VECTOR(storage,x,min,max)  \
 	if (! our x != ! thy x) return false; \
 	if (our x) { \
 		for (long i = min; i <= max; i ++) \
-			if (! Melder_wcsequ (our x [i], thy x [i])) return false; \
+			if (! Melder_equ (our x [i], thy x [i])) return false; \
 	}
 
 #define oo_STRUCT(Type,x)  \
@@ -98,6 +98,9 @@
 #define oo_OBJECT(Class,version,x)  \
 	if (! our x != ! thy x || (our x && ! Data_equal (our x, thy x))) return false;
 
+#define oo_AUTO_OBJECT(Class,version,x)  \
+	if (! our x != ! thy x || (our x && ! Data_equal (our x.get(), thy x.get()))) return false;
+
 #define oo_COLLECTION(Class,x,ItemClass,version)  \
 	if (! our x != ! thy x || (our x && ! Data_equal (our x, thy x))) return false;
 
@@ -133,24 +136,17 @@
 
 #define oo_ENDFROM
 
-#define oo_VERSION(version)
-
 #define oo_DECLARING  0
 #define oo_DESTROYING  0
 #define oo_COPYING  0
-#define oo_EQUALLING  1
 #define oo_COMPARING  1
 #define oo_VALIDATING_ENCODING  0
 #define oo_READING  0
 #define oo_READING_TEXT  0
 #define oo_READING_BINARY  0
-#define oo_READING_CACHE  0
-#define oo_READING_LISP  0
 #define oo_WRITING  0
 #define oo_WRITING_TEXT  0
 #define oo_WRITING_BINARY  0
-#define oo_WRITING_CACHE  0
-#define oo_WRITING_LISP  0
 #define oo_DESCRIBING  0
 
 /* End of file oo_EQUAL.h */
diff --git a/sys/oo_READ_BINARY.h b/sys/oo_READ_BINARY.h
index cd27af6..17bfc57 100644
--- a/sys/oo_READ_BINARY.h
+++ b/sys/oo_READ_BINARY.h
@@ -1,6 +1,6 @@
 /* oo_READ_BINARY.h
  *
- * Copyright (C) 1994-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1994-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@
 	our x = binget##storage (f);
 
 #define oo_ARRAY(type,storage,x,cap,n)  \
-	if (n > cap) Melder_throw ("Number of \"", #x, "\" (", n, ") greater than ", cap, "."); \
+	if (n > cap) Melder_throw (U"Number of \"" #x U"\" (", n, U") greater than ", cap, U"."); \
 	for (int i = 0; i < n; i ++) { \
 		our x [i] = binget##storage (f); \
 	}
@@ -44,31 +44,31 @@
 	}
 
 #define oo_ENUMx(type,storage,Type,x)  \
-	our x = binget##storage (f, Type##_MIN, Type##_MAX, L"" #Type);
+	our x = binget##storage (f, Type##_MIN, Type##_MAX, U"" #Type);
 
 #define oo_ENUMx_ARRAY(type,storage,Type,x,cap,n)  \
-	if (n > cap) Melder_throw ("Number of \"", #x, "\" (", n, ") greater than ", cap, "."); \
+	if (n > cap) Melder_throw (U"Number of \"" #x U"\" (", n, U") greater than ", cap, U"."); \
 	for (int i = 0; i < n; i ++) { \
-		our x [i] = binget##storage (f, Type##_MIN, Type##_MAX, L"" #Type); \
+		our x [i] = binget##storage (f, Type##_MIN, Type##_MAX, U"" #Type); \
 	}
 
 #define oo_ENUMx_SET(type,storage,Type,x,setType)  \
 	for (int i = 0; i <= setType##_MAX; i ++) { \
-		our x [i] = binget##storage (f, Type##_MIN, Type##_MAX, L"" #Type); \
+		our x [i] = binget##storage (f, Type##_MIN, Type##_MAX, U"" #Type); \
 	}
 
 #define oo_ENUMx_VECTOR(type,storage,Type,x,min,max)  \
 	if (max >= min) { \
 		our x = NUMvector <type> (min, max); \
 		for (long i = min; i <= max; i ++) { \
-			our x [i] = binget##storage (f, Type##_MIN, Type##_MAX, L"" #Type); \
+			our x [i] = binget##storage (f, Type##_MIN, Type##_MAX, U"" #Type); \
 	}
 
 #define oo_STRINGx(storage,x)  \
 	our x = binget##storage (f);
 
 #define oo_STRINGx_ARRAY(storage,x,cap,n)  \
-	if (n > cap) Melder_throw ("Number of \"", #x, "\" (", n, ") greater than ", cap, "."); \
+	if (n > cap) Melder_throw (U"Number of \"" #x U"\" (", n, U") greater than ", cap, U"."); \
 	for (int i = 0; i < n; i ++) { \
 		our x [i] = binget##storage (f); \
 	}
@@ -80,31 +80,31 @@
 
 #define oo_STRINGx_VECTOR(storage,x,min,max)  \
 	if (max >= min) { \
-		our x = NUMvector <wchar_t *> (min, max); \
+		our x = NUMvector <char32 *> (min, max); \
 		for (long i = min; i <= max; i ++) { \
 			our x [i] = binget##storage (f); \
 		} \
 	}
 
 #define oo_STRUCT(Type,x)  \
-	our x. readBinary (f);
+	our x. readBinary (f, formatVersion);
 
 #define oo_STRUCT_ARRAY(Type,x,cap,n) \
-	if (n > cap) Melder_throw ("Number of \"", #x, "\" (", n, ") greater than ", cap, "."); \
+	if (n > cap) Melder_throw (U"Number of \"", #x, U"\" (", n, U") greater than ", cap, U"."); \
 	for (int i = 0; i < n; i ++) { \
-		our x [i]. readBinary (f); \
+		our x [i]. readBinary (f, formatVersion); \
 	}
 
 #define oo_STRUCT_SET(Type,x,setType) \
 	for (int i = 0; i <= setType##_MAX; i ++) { \
-		our x [i]. readBinary (f); \
+		our x [i]. readBinary (f, formatVersion); \
 	}
 
 #define oo_STRUCT_VECTOR_FROM(Type,x,min,max)  \
 	if (max >= min) { \
 		our x = NUMvector <struct##Type> (min, max); \
 		for (long i = min; i <= max; i ++) { \
-			our x [i]. readBinary (f); \
+			our x [i]. readBinary (f, formatVersion); \
 		} \
 	}
 
@@ -113,30 +113,30 @@
 		our x = NUMmatrix <struct##Type> (row1, row2, col1, col2); \
 		for (long i = row1; i <= row2; i ++) { \
 			for (long j = col1; j <= col2; j ++) { \
-				our x [i] [j]. readBinary (f); \
+				our x [i] [j]. readBinary (f, formatVersion); \
 			} \
 		} \
 	}
 
-#define oo_OBJECT(Class,version,x)  \
+#define oo_OBJECT(Class,formatVersion,x)  \
 	if (bingetex (f)) { \
-		long saveVersion = Thing_version; \
 		our x = Thing_new (Class); \
-		Thing_version = version; \
-		our x -> v_readBinary (f); \
-		Thing_version = saveVersion; \
+		our x -> v_readBinary (f, formatVersion); \
 	}
 
-#define oo_COLLECTION(Class,x,ItemClass,version)  \
+#define oo_AUTO_OBJECT(Class,formatVersion,x)  \
+	if (bingetex (f)) { \
+		our x = Thing_new (Class); \
+		our x -> v_readBinary (f, formatVersion); \
+	}
+
+#define oo_COLLECTION(Class,x,ItemClass,formatVersion)  \
 	{ \
 		int32_t n = bingeti4 (f); \
 		our x = Class##_create (); \
 		for (int32_t i = 1; i <= n; i ++) { \
-			long saveVersion = Thing_version; \
 			auto##ItemClass item = (ItemClass) Thing_new (ItemClass); \
-			Thing_version = version; \
-			item.peek() -> v_readBinary (f); \
-			Thing_version = saveVersion; \
+			item.peek() -> v_readBinary (f, formatVersion); \
 			Collection_addItem (our x, item.transfer()); \
 		} \
 	}
@@ -146,18 +146,17 @@
 #define oo_DIR(x)
 
 #define oo_DEFINE_STRUCT(Type)  \
-	void struct##Type :: readBinary (FILE *f) { \
-		int localVersion = Thing_version; (void) localVersion;
+	void struct##Type :: readBinary (FILE *f, int formatVersion) { \
+		(void) formatVersion;
 
 #define oo_END_STRUCT(Type)  \
 	}
 
 #define oo_DEFINE_CLASS(Class,Parent)  \
-	void struct##Class :: v_readBinary (FILE *f) { \
-		int localVersion = Thing_version; (void) localVersion; \
-		if (localVersion > our classInfo -> version) \
-			Melder_throw ("The format of this file is too new. Download a newer version of Praat."); \
-		Class##_Parent :: v_readBinary (f);
+	void struct##Class :: v_readBinary (FILE *f, int formatVersion) { \
+		if (formatVersion > our classInfo -> version) \
+			Melder_throw (U"The format of this file is too new. Download a newer version of Praat."); \
+		Class##_Parent :: v_readBinary (f, formatVersion);
 
 #define oo_END_CLASS(Class)  \
 	}
@@ -169,30 +168,22 @@
 	}
 
 #define oo_FROM(from)  \
-	if (localVersion >= from) {
+	if (formatVersion >= from) {
 
 #define oo_ENDFROM  \
 	}
 
-#define oo_VERSION(version)  \
-	Thing_version = version;
-
 #define oo_DECLARING  0
 #define oo_DESTROYING  0
 #define oo_COPYING  0
-#define oo_EQUALLING  0
 #define oo_COMPARING  0
 #define oo_VALIDATING_ENCODING  0
 #define oo_READING  1
 #define oo_READING_TEXT  0
 #define oo_READING_BINARY  1
-#define oo_READING_CACHE  0
-#define oo_READING_LISP  0
 #define oo_WRITING  0
 #define oo_WRITING_TEXT  0
 #define oo_WRITING_BINARY  0
-#define oo_WRITING_CACHE  0
-#define oo_WRITING_LISP  0
 #define oo_DESCRIBING  0
 
 /* End of file oo_READ_BINARY.h */
diff --git a/sys/oo_READ_TEXT.h b/sys/oo_READ_TEXT.h
index 4de9aab..e71662a 100644
--- a/sys/oo_READ_TEXT.h
+++ b/sys/oo_READ_TEXT.h
@@ -1,6 +1,6 @@
 /* oo_READ_TEXT.h
  *
- * Copyright (C) 1994-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1994-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,16 +23,16 @@
 	try { \
 		our x = texget##storage (a_text); \
 	} catch (MelderError) { \
-		Melder_throw ("\"", #x, L"\" not read."); \
+		Melder_throw (U"\"" #x U"\" not read."); \
 	}
 
 #define oo_ARRAY(type,storage,x,cap,n)  \
-	if (n > cap) Melder_throw ("Number of \"", #x, "\" (", n, ") greater than ", cap, "."); \
+	if (n > cap) Melder_throw (U"Number of \"" #x U"\" (", n, U") greater than ", cap, U"."); \
 	for (long i = 0; i < n; i ++) { \
 		try { \
 			our x [i] = texget##storage (a_text); \
 		} catch (MelderError) { \
-			Melder_throw ("Element ", i+1, " of \"", #x, "\" not read."); \
+			Melder_throw (U"Element ", i+1, U" of \"" #x U"\" not read."); \
 		} \
 	}
 
@@ -41,7 +41,7 @@
 		try { \
 			our x [i] = texget##storage (a_text); \
 		} catch (MelderError) { \
-			Melder_throw ("Element ", i+1, " of \"", #x, "\" not read."); \
+			Melder_throw (U"Element ", i+1, U" of \"" #x, U"\" not read."); \
 		} \
 	}
 
@@ -59,7 +59,7 @@
 	our x = texget##storage (a_text, Type##_getValue);
 
 #define oo_ENUMx_ARRAY(type,storage,Type,x,cap,n)  \
-	if (n > cap) Melder_throw ("Number of \"", #x, "\" (", n, ") greater than ", cap, "."); \
+	if (n > cap) Melder_throw (U"Number of \"" #x U"\" (", n, U") greater than ", cap, U"."); \
 	for (long i = 0; i < n; i ++) { \
 		our x [i] = texget##storage (a_text, Type##_getValue); \
 	}
@@ -81,11 +81,11 @@
 	try { \
 		our x = texget##storage (a_text); \
 	} catch (MelderError) { \
-		Melder_throw ("String \"", #x, "\" not read."); \
+		Melder_throw (U"String \"" #x U"\" not read."); \
 	}
 
 #define oo_STRINGx_ARRAY(storage,x,cap,n)  \
-	if (n > cap) Melder_throw ("Number of \"", #x, "\" (", n, ") greater than ", cap, "."); \
+	if (n > cap) Melder_throw (U"Number of \"" #x U"\" (", n, U") greater than ", cap, U"."); \
 	for (long i = 0; i < n; i ++) { \
 		our x [i] = texget##storage (a_text); \
 	}
@@ -97,35 +97,35 @@
 
 #define oo_STRINGx_VECTOR(storage,x,min,max)  \
 	if (max >= min) { \
-		our x = NUMvector <wchar_t*> (min, max); \
+		our x = NUMvector <char32*> (min, max); \
 		for (long i = min; i <= max; i ++) { \
 			try { \
 				our x [i] = texget##storage (a_text); \
 			} catch (MelderError) { \
-				Melder_throw ("Element ", i, " of \"" #x, "\" not read."); \
+				Melder_throw (U"Element ", i, U" of \"" #x U"\" not read."); \
 			} \
 		} \
 	}
 
 #define oo_STRUCT(Type,x)  \
-	our x. readText (a_text);
+	our x. readText (a_text, formatVersion);
 
 #define oo_STRUCT_ARRAY(Type,x,cap,n) \
-	if (n > cap) Melder_throw ("Number of \"", #x, "\" (", n, ") greater than ", cap, "."); \
+	if (n > cap) Melder_throw (U"Number of \"" #x U"\" (", n, U") greater than ", cap, U"."); \
 	for (long i = 0; i < n; i ++) { \
-		our x [i]. readText (a_text); \
+		our x [i]. readText (a_text, formatVersion); \
 	}
 
 #define oo_STRUCT_SET(Type,x,setType) \
 	for (long i = 0; i <= setType##_MAX; i ++) { \
-		our x [i]. readText (a_text); \
+		our x [i]. readText (a_text, formatVersion); \
 	}
 
 #define oo_STRUCT_VECTOR_FROM(Type,x,min,max)  \
 	if (max >= min) { \
 		our x = NUMvector <struct##Type> (min, max); \
 		for (long i = min; i <= max; i ++) { \
-			our x [i]. readText (a_text); \
+			our x [i]. readText (a_text, formatVersion); \
 		} \
 	}
 
@@ -134,30 +134,30 @@
 		our x = NUMmatrix <struct##Type> (row1, row2, col1, col2); \
 		for (long i = row1; i <= row2; i ++) { \
 			for (long j = col1; j <= col2; j ++) { \
-				our x [i] [j]. readText (a_text); \
+				our x [i] [j]. readText (a_text, formatVersion); \
 			} \
 		} \
 	}
 
-#define oo_OBJECT(Class,version,x)  \
+#define oo_OBJECT(Class,formatVersion,x)  \
 	if (texgetex (a_text) == 1) { \
-		long saveVersion = Thing_version; \
 		our x = Thing_new (Class); \
-		Thing_version = version; \
-		our x -> v_readText (a_text); \
-		Thing_version = saveVersion; \
+		our x -> v_readText (a_text, formatVersion); \
 	}
 
-#define oo_COLLECTION(Class,x,ItemClass,version)  \
+#define oo_AUTO_OBJECT(Class,formatVersion,x)  \
+	if (texgetex (a_text) == 1) { \
+		our x = Thing_new (Class); \
+		our x -> v_readText (a_text, formatVersion); \
+	}
+
+#define oo_COLLECTION(Class,x,ItemClass,formatVersion)  \
 	{ \
 		long n = texgeti4 (a_text); \
 		our x = Class##_create (); \
 		for (long i = 1; i <= n; i ++) { \
-			long saveVersion = Thing_version; \
 			auto##ItemClass item = (ItemClass) Thing_new (ItemClass); \
-			Thing_version = version; \
-			item.peek() -> v_readText (a_text); \
-			Thing_version = saveVersion; \
+			item.peek() -> v_readText (a_text, formatVersion); \
 			Collection_addItem (our x, item.transfer()); \
 		} \
 	}
@@ -167,18 +167,17 @@
 #define oo_DIR(x)
 
 #define oo_DEFINE_STRUCT(Type)  \
-	void struct##Type :: readText (MelderReadText a_text) { \
-		int localVersion = Thing_version; (void) localVersion;
+	void struct##Type :: readText (MelderReadText a_text, int formatVersion) { \
+		(void) formatVersion;
 
 #define oo_END_STRUCT(Type)  \
 	}
 
 #define oo_DEFINE_CLASS(Class,Parent)  \
-	void struct##Class :: v_readText (MelderReadText a_text) { \
-		int localVersion = Thing_version; (void) localVersion; \
-		if (localVersion > our classInfo -> version) \
-			Melder_throw ("The format of this file is too new. Download a newer version of Praat."); \
-		Class##_Parent :: v_readText (a_text);
+	void struct##Class :: v_readText (MelderReadText a_text, int formatVersion) { \
+		if (formatVersion > our classInfo -> version) \
+			Melder_throw (U"The format of this file is too new. Download a newer version of Praat."); \
+		Class##_Parent :: v_readText (a_text, formatVersion);
 
 #define oo_END_CLASS(Class)  \
 	}
@@ -190,30 +189,22 @@
 	}
 
 #define oo_FROM(from)  \
-	if (localVersion >= from) {
+	if (formatVersion >= from) {
 
 #define oo_ENDFROM  \
 	}
 
-#define oo_VERSION(version)  \
-	Thing_version = version;
-
 #define oo_DECLARING  0
 #define oo_DESTROYING  0
 #define oo_COPYING  0
-#define oo_EQUALLING  0
 #define oo_COMPARING  0
 #define oo_VALIDATING_ENCODING  0
 #define oo_READING  1
 #define oo_READING_TEXT  1
 #define oo_READING_BINARY  0
-#define oo_READING_CACHE  0
-#define oo_READING_LISP  0
 #define oo_WRITING  0
 #define oo_WRITING_TEXT  0
 #define oo_WRITING_BINARY  0
-#define oo_WRITING_CACHE  0
-#define oo_WRITING_LISP  0
 #define oo_DESCRIBING  0
 
 /* End of file oo_READ_TEXT.h */
diff --git a/sys/oo_WRITE_BINARY.h b/sys/oo_WRITE_BINARY.h
index a722853..e1e0ba9 100644
--- a/sys/oo_WRITE_BINARY.h
+++ b/sys/oo_WRITE_BINARY.h
@@ -1,6 +1,6 @@
 /* oo_WRITE_BINARY.h
  *
- * Copyright (C) 1994-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1994-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -89,10 +89,15 @@
 			our x [i] [j]. writeBinary (f);
 
 #define oo_OBJECT(Class,version,x)  \
-	binputex (our x != NULL, f); \
+	binputex ((bool) our x, f); \
 	if (our x) \
 		Data_writeBinary (our x, f);
 
+#define oo_AUTO_OBJECT(Class,version,x)  \
+	binputex ((bool) our x, f); \
+	if (our x) \
+		Data_writeBinary (our x.get(), f);
+
 #define oo_COLLECTION(Class,x,ItemClass,version)  \
 	binputi4 (our x ? our x -> size : 0, f); \
 	if (our x) { \
@@ -129,24 +134,17 @@
 
 #define oo_ENDFROM
 
-#define oo_VERSION(version)
-
 #define oo_DECLARING  0
 #define oo_DESTROYING  0
 #define oo_COPYING  0
-#define oo_EQUALLING  0
 #define oo_COMPARING  0
 #define oo_VALIDATING_ENCODING  0
 #define oo_READING  0
 #define oo_READING_TEXT  0
 #define oo_READING_BINARY  0
-#define oo_READING_CACHE  0
-#define oo_READING_LISP  0
 #define oo_WRITING  1
 #define oo_WRITING_TEXT  0
 #define oo_WRITING_BINARY  1
-#define oo_WRITING_CACHE  0
-#define oo_WRITING_LISP  0
 #define oo_DESCRIBING  0
 
 /* End of file oo_WRITE_BINARY.h */
diff --git a/sys/oo_WRITE_TEXT.h b/sys/oo_WRITE_TEXT.h
index 292af9f..2cf09c7 100644
--- a/sys/oo_WRITE_TEXT.h
+++ b/sys/oo_WRITE_TEXT.h
@@ -1,6 +1,6 @@
 /* oo_WRITE_TEXT.h
  *
- * Copyright (C) 1994-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1994-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,108 +20,108 @@
 #include "oo_undef.h"
 
 #define oo_SIMPLE(type,storage,x)  \
-	texput##storage (file, our x, L"" #x, 0,0,0,0,0);
+	texput##storage (file, our x, U"" #x, 0,0,0,0,0);
 
 #define oo_ARRAY(type,storage,x,cap,n)  \
-	texputintro (file, L"" #x " []: ", n ? NULL : L"(empty)", 0,0,0,0); \
+	texputintro (file, U"" #x U" []: ", n ? nullptr : U"(empty)", 0,0,0,0); \
 	for (int i = 0; i < n; i ++) \
-		texput##storage (file, our x [i], L"" #x " [", Melder_integer (i), L"]", 0,0,0); \
+		texput##storage (file, our x [i], U"" #x " [", Melder_integer (i), U"]", 0,0,0); \
 	texexdent (file);
 
 #define oo_SET(type,storage,x,setType)  \
-	texputintro (file, L"" #x " []:", 0,0,0,0,0); \
+	texputintro (file, U"" #x U" []:", 0,0,0,0,0); \
 	for (int i = 0; i <= setType##_MAX; i ++) \
-		texput##storage (file, our x [i], L"" #x " [", setType##_getText (i), L"]", 0,0,0); \
+		texput##storage (file, our x [i], U"" #x U" [", setType##_getText (i), U"]", 0,0,0); \
 	texexdent (file);
 
 #define oo_VECTOR(type,storage,x,min,max)  \
 	if (our x) \
-		NUMvector_writeText_##storage (our x, min, max, file, L"" #x);
+		NUMvector_writeText_##storage (our x, min, max, file, U"" #x);
 
 #define oo_MATRIX(type,storage,x,row1,row2,col1,col2)  \
 	if (our x) \
-		NUMmatrix_writeText_##storage (our x, row1, row2, col1, col2, file, L"" #x);
+		NUMmatrix_writeText_##storage (our x, row1, row2, col1, col2, file, U"" #x);
 
 #define oo_ENUMx(type,storage,Type,x)  \
-	texput##storage (file, our x, Type##_getText, L"" #x, 0,0,0,0,0);
+	texput##storage (file, our x, Type##_getText, U"" #x, 0,0,0,0,0);
 
 #define oo_ENUMx_ARRAY(type,storage,Type,x,cap,n)  \
-	texputintro (file, L"" #x " []:", 0,0,0,0,0); \
+	texputintro (file, U"" #x U" []:", 0,0,0,0,0); \
 	for (int i = 0; i < n; i ++) \
-		texput##storage (file, our x [i], Type##_getText, L"" #x " [", Melder_integer (i), L"]", 0,0,0); \
+		texput##storage (file, our x [i], Type##_getText, U"" #x U" [", Melder_integer (i), U"]", 0,0,0); \
 	texexdent (file);
 
 #define oo_ENUMx_SET(type,storage,Type,x,setType)  \
-	texputintro (file, L"" #x " []: ", n ? NULL : L"(empty)", 0,0,0,0); \
+	texputintro (file, U"" #x U" []: ", n ? nullptr : U"(empty)", 0,0,0,0); \
 	for (int i = 0; i <= setType##_MAX; i ++) \
-		texput##storage (file, our x [i], Type##_getText, L"" #x " [", setType##_getText (i), L"]", 0,0,0); \
+		texput##storage (file, our x [i], Type##_getText, U"" #x U" [", setType##_getText (i), U"]", 0,0,0); \
 	texexdent (file);
 
 #define oo_ENUMx_VECTOR(type,storage,Type,x,min,max)  \
-	texputintro (file, L"" #x " []: ", max >= min ? NULL : L"(empty)", 0,0,0,0); \
+	texputintro (file, U"" #x U" []: ", max >= min ? nullptr : U"(empty)", 0,0,0,0); \
 	for (long i = min; i <= max; i ++) \
-		texput##storage (file, our x [i], Type##_getText, L"" #x " [", Melder_integer (i), L"]", 0,0,0); \
+		texput##storage (file, our x [i], Type##_getText, U"" #x U" [", Melder_integer (i), U"]", 0,0,0); \
 	texexdent (file);
 
 #define oo_STRINGx(storage,x)  \
-	texput##storage (file, our x, L""#x, 0,0,0,0,0);
+	texput##storage (file, our x, U""#x, 0,0,0,0,0);
 
 #define oo_STRINGx_ARRAY(storage,x,cap,n)  \
-	texputintro (file, L"" #x " []: ", n ? NULL : L"(empty)", 0,0,0,0); \
+	texputintro (file, U"" #x U" []: ", n ? nullptr : U"(empty)", 0,0,0,0); \
 	for (int i = 0; i < n; i ++) \
-		texput##storage (file, our x [i], L"" #x " [", Melder_integer (i), L"]", 0,0,0); \
+		texput##storage (file, our x [i], U"" #x U" [", Melder_integer (i), U"]", 0,0,0); \
 	texexdent (file);
 
 #define oo_STRINGx_SET(storage,x,setType)  \
-	texputintro (file, L"" #x " []:", 0,0,0,0,0); \
+	texputintro (file, U"" #x U" []:", 0,0,0,0,0); \
 	for (int i = 0; i <= setType##_MAX; i ++) \
-		texput##storage (file, our x [i], L"" #x " [", setType##_getText (i), L"]", 0,0,0); \
+		texput##storage (file, our x [i], U"" #x U" [", setType##_getText (i), U"]", 0,0,0); \
 	texexdent (file);
 
 #define oo_STRINGx_VECTOR(storage,x,min,max)  \
-	texputintro (file, L"" #x " []: ", max >= min ? NULL : L"(empty)", 0,0,0,0); \
+	texputintro (file, U"" #x U" []: ", max >= min ? nullptr : U"(empty)", 0,0,0,0); \
 	for (long i = min; i <= max; i ++) \
-		texput##storage (file, our x [i], L"" #x " [", Melder_integer (i), L"]", 0,0,0); \
+		texput##storage (file, our x [i], U"" #x U" [", Melder_integer (i), U"]", 0,0,0); \
 	texexdent (file);
 
 #define oo_STRUCT(Type,x)  \
-	texputintro (file, L"" #x ":", 0,0,0,0,0); \
+	texputintro (file, U"" #x U":", 0,0,0,0,0); \
 	our x. writeText (file); \
 	texexdent (file);
 
 #define oo_STRUCT_ARRAY(Type,x,cap,n)  \
-	texputintro (file, L"" #x " []: ", n ? NULL : L"(empty)", 0,0,0,0); \
+	texputintro (file, U"" #x U" []: ", n ? nullptr : U"(empty)", 0,0,0,0); \
 	for (int i = 0; i < n; i ++) { \
-		texputintro (file, L"" #x " [", Melder_integer (i), L"]:", 0,0,0); \
+		texputintro (file, U"" #x " [", Melder_integer (i), U"]:", 0,0,0); \
 		our x [i]. writeText (file); \
 		texexdent (file); \
 	} \
 	texexdent (file);
 
 #define oo_STRUCT_SET(Type,x,setType)  \
-	texputintro (file, L"" #x " []:", 0,0,0,0,0); \
+	texputintro (file, U"" #x U" []:", 0,0,0,0,0); \
 	for (int i = 0; i <= setType##_MAX; i ++) { \
-		texputintro (file, L"" #x " [", setType##_getText (i), L"]:", 0,0,0); \
+		texputintro (file, U"" #x U" [", setType##_getText (i), U"]:", 0,0,0); \
 		our x [i]. writeText (file); \
 		texexdent (file); \
 	} \
 	texexdent (file);
 
 #define oo_STRUCT_VECTOR_FROM(Type,x,min,max)  \
-	texputintro (file, L"" #x " []: ", max >= min ? NULL : L"(empty)", 0,0,0,0); \
+	texputintro (file, U"" #x U" []: ", max >= min ? nullptr : U"(empty)", 0,0,0,0); \
 	for (long i = min; i <= max; i ++) { \
-		texputintro (file, L"" #x " [", Melder_integer (i), L"]:", 0,0,0); \
+		texputintro (file, U"" #x U" [", Melder_integer (i), U"]:", 0,0,0); \
 		our x [i]. writeText (file); \
 		texexdent (file); \
 	} \
 	texexdent (file);
 
 #define oo_STRUCT_MATRIX_FROM(Type,x,row1,row2,col1,col2)  \
-	texputintro (file, L"" #x " [] []: ", row2 >= row1 ? NULL : L"(empty)", 0,0,0,0); \
+	texputintro (file, U"" #x U" [] []: ", row2 >= row1 ? nullptr : U"(empty)", 0,0,0,0); \
 	for (long i = row1; i <= row2; i ++) { \
-		texputintro (file, L"" #x " [", Melder_integer (i), L"]:", 0,0,0); \
+		texputintro (file, U"" #x U" [", Melder_integer (i), U"]:", 0,0,0); \
 		for (long j = col1; j <= col2; j ++) { \
-			texputintro (file, L"" #x " [", Melder_integer (i), L"] [", Melder_integer (j), L"]:", 0); \
+			texputintro (file, U"" #x U" [", Melder_integer (i), U"] [", Melder_integer (j), U"]:", 0); \
 			our x [i] [j]. writeText (file); \
 			texexdent (file); \
 		} \
@@ -130,16 +130,21 @@
 	texexdent (file);
 
 #define oo_OBJECT(Class,version,x)  \
-	texputex (file, our x != NULL, L"" #x, 0,0,0,0,0); \
+	texputex (file, our x, U"" #x, 0,0,0,0,0); \
 	if (our x) \
 		Data_writeText (our x, file);
 
+#define oo_AUTO_OBJECT(Class,version,x)  \
+	texputex (file, !! our x, U"" #x, 0,0,0,0,0); \
+	if (our x) \
+		Data_writeText (our x.get(), file);
+
 #define oo_COLLECTION(Class,x,ItemClass,version)  \
-	texputi4 (file, our x ? our x -> size : 0, L"" #x ": size", 0,0,0,0,0); \
+	texputi4 (file, our x ? our x -> size : 0, U"" #x U": size", 0,0,0,0,0); \
 	if (our x) { \
 		for (long i = 1; i <= our x -> size; i ++) { \
 			ItemClass data = (ItemClass) our x -> item [i]; \
-			texputintro (file, L"" #x " [", Melder_integer (i), L"]:", 0,0,0); \
+			texputintro (file, U"" #x U" [", Melder_integer (i), U"]:", 0,0,0); \
 			data -> struct##ItemClass :: v_writeText (file); \
 			texexdent (file); \
 		} \
@@ -166,26 +171,19 @@
 
 #define oo_ENDFROM
 
-#define oo_VERSION(version)
-
 #define oo_IF(condition)  if (condition) {
 #define oo_ENDIF  }
 #define oo_DECLARING  0
 #define oo_DESTROYING  0
 #define oo_COPYING  0
-#define oo_EQUALLING  0
 #define oo_COMPARING  0
 #define oo_VALIDATING_ENCODING  0
 #define oo_READING  0
 #define oo_READING_TEXT  0
 #define oo_READING_BINARY  0
-#define oo_READING_CACHE  0
-#define oo_READING_LISP  0
 #define oo_WRITING  1
 #define oo_WRITING_TEXT  1
 #define oo_WRITING_BINARY  0
-#define oo_WRITING_CACHE  0
-#define oo_WRITING_LISP  0
 #define oo_DESCRIBING  0
 
 /* End of file oo_WRITE_TEXT.h */
diff --git a/sys/oo_undef.h b/sys/oo_undef.h
index 75d9aec..79499d7 100644
--- a/sys/oo_undef.h
+++ b/sys/oo_undef.h
@@ -1,6 +1,6 @@
 /* oo_undef.h
  *
- * Copyright (C) 1994-2011,2013 Paul Boersma
+ * Copyright (C) 1994-2011,2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -40,6 +40,7 @@
 #undef oo_STRUCT_MATRIX_FROM
 
 #undef oo_OBJECT
+#undef oo_AUTO_OBJECT
 #undef oo_COLLECTION
 #undef oo_FILE
 #undef oo_DIR
@@ -56,24 +57,17 @@
 #undef oo_FROM
 #undef oo_ENDFROM
 
-#undef oo_VERSION
-
 #undef oo_DECLARING
 #undef oo_DESTROYING
 #undef oo_COPYING
-#undef oo_EQUALLING
 #undef oo_COMPARING
 #undef oo_VALIDATING_ENCODING
 #undef oo_READING
 #undef oo_READING_TEXT
 #undef oo_READING_BINARY
-#undef oo_READING_CACHE
-#undef oo_READING_LISP
 #undef oo_WRITING
 #undef oo_WRITING_TEXT
 #undef oo_WRITING_BINARY
-#undef oo_WRITING_CACHE
-#undef oo_WRITING_LISP
 #undef oo_DESCRIBING
 
 /* End of file oo_undef.h */
diff --git a/sys/praat.cpp b/sys/praat.cpp
index 453ca5a..ad160ea 100644
--- a/sys/praat.cpp
+++ b/sys/praat.cpp
@@ -1,6 +1,6 @@
 /* praat.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -37,9 +37,15 @@
 #if defined (UNIX)
 	#include <unistd.h>
 #endif
+#if defined (_WIN32)
+	#include <windows.h>
+	#include <fcntl.h>
+	#include <io.h>
+#endif
 
 #include "praatP.h"
 #include "praat_script.h"
+#include "praat_version.h"
 #include "site.h"
 #include "machine.h"
 #include "Printer.h"
@@ -62,14 +68,13 @@ PraatObjects theCurrentPraatObjects = & theForegroundPraatObjects;
 structPraatPicture theForegroundPraatPicture;
 PraatPicture theCurrentPraatPicture = & theForegroundPraatPicture;
 struct PraatP praatP;
-static int doingCommandLineInterface;
-static char programName [64];
+static char32 programName [64];
 static structMelderDir homeDir = { { 0 } };
 /*
- * praatDirectory: preferences and buttons files.
+ * praatDirectory: preferences file, buttons file, message files, tracing file, plugins.
  *    Unix:   /u/miep/.myProg-dir   (without slash)
  *    Windows XP/Vista/7:   \\myserver\myshare\Miep\MyProg
- *                    or:   C:\Documents and settings\Miep\MyProg
+ *                    or:   C:\Users\Miep\MyProg
  *    Mac X:   /Users/Miep/Library/Preferences/MyProg Prefs
  */
 extern structMelderDir praatDir;
@@ -78,7 +83,7 @@ structMelderDir praatDir = { { 0 } };
  * prefsFile: preferences file.
  *    Unix:   /u/miep/.myProg-dir/prefs5
  *    Windows XP/Vista/7:   \\myserver\myshare\Miep\MyProg\Preferences5.ini
- *                       or:   C:\Documents and settings\Miep\MyProg\Preferences5.ini
+ *                       or:   C:\Users\Miep\MyProg\Preferences5.ini
  *    Mac X:   /Users/Miep/Library/Preferences/MyProg Prefs/Prefs5
  */
 static structMelderFile prefsFile = { 0 };
@@ -86,21 +91,21 @@ static structMelderFile prefsFile = { 0 };
  * buttonsFile: buttons file.
  *    Unix:   /u/miep/.myProg-dir/buttons
  *    Windows XP/Vista/7:   \\myserver\myshare\Miep\MyProg\Buttons5.ini
- *                    or:   C:\Documents and settings\Miep\MyProg\Buttons5.ini
+ *                    or:   C:\Users\Miep\MyProg\Buttons5.ini
  *    Mac X:   /Users/Miep/Library/Preferences/MyProg Prefs/Buttons5
  */
 static structMelderFile buttonsFile = { 0 };
 #if defined (UNIX)
-	static structMelderFile pidFile = { 0 };   /* Like /u/miep/.myProg-dir/pid */
-	static structMelderFile messageFile = { 0 };   /* Like /u/miep/.myProg-dir/message */
+	static structMelderFile pidFile = { 0 };   // like /u/miep/.myProg-dir/pid
+	static structMelderFile messageFile = { 0 };   // like /u/miep/.myProg-dir/message
 #elif defined (_WIN32)
-	static structMelderFile messageFile = { 0 };   /* Like C:\Windows\myProg\Message.txt */
+	static structMelderFile messageFile = { 0 };   // like C:\Users\Miep\myProg\Message.txt
 #endif
 /*
  * tracingFile: tracing file.
  *    Unix:   /u/miep/.myProg-dir/tracing
  *    Windows XP/Vista/7:   \\myserver\myshare\Miep\MyProg\Tracing.txt
- *                    or:   C:\Documents and settings\Miep\MyProg\Tracing.txt
+ *                    or:   C:\Users\Miep\MyProg\Tracing.txt
  *    Mac X:   /Users/Miep/Library/Preferences/MyProg Prefs/Tracing.txt
  */
 static structMelderFile tracingFile = { 0 };
@@ -109,375 +114,348 @@ static GuiList praatList_objects;
 
 /***** selection *****/
 
-long praat_getIdOfSelected (ClassInfo klas, int inplace) {
+long praat_idOfSelected (ClassInfo klas, int inplace) {
 	int place = inplace, IOBJECT;
 	if (place == 0) place = 1;
 	if (place > 0) {
-		WHERE (SELECTED && (klas == NULL || CLASS == klas)) {
+		WHERE (SELECTED && (! klas || CLASS == klas)) {
 			if (place == 1) return ID;
 			place --;
 		}
 	} else {
-		WHERE_DOWN (SELECTED && (klas == NULL || CLASS == klas)) {
+		WHERE_DOWN (SELECTED && (! klas || CLASS == klas)) {
 			if (place == -1) return ID;
 			place ++;
 		}
 	}
 	if (inplace) {
-		Melder_throw ("No ", klas ? klas -> className : L"object", " #", inplace, " selected.");
+		Melder_throw (U"No ", klas ? klas -> className : U"object", U" #", inplace, U" selected.");
 	} else {
-		Melder_throw ("No ", klas ? klas -> className : L"object", " selected.");
+		Melder_throw (U"No ", klas ? klas -> className : U"object", U" selected.");
 	}
 	return 0;
 }
 
-wchar_t * praat_getNameOfSelected (ClassInfo klas, int inplace) {
+char32 * praat_nameOfSelected (ClassInfo klas, int inplace) {
 	int place = inplace, IOBJECT;
 	if (place == 0) place = 1;
 	if (place > 0) {
-		WHERE (SELECTED && (klas == NULL || CLASS == klas)) {
-			if (place == 1) return klas == NULL ? FULL_NAME : NAME;
+		WHERE (SELECTED && (! klas || CLASS == klas)) {
+			if (place == 1) return klas ? NAME : FULL_NAME;
 			place --;
 		}
 	} else {
-		WHERE_DOWN (SELECTED && (klas == NULL || CLASS == klas)) {
-			if (place == -1) return klas == NULL ? FULL_NAME : NAME;
+		WHERE_DOWN (SELECTED && (! klas || CLASS == klas)) {
+			if (place == -1) return klas ? NAME : FULL_NAME;
 			place ++;
 		}
 	}
 	if (inplace) {
-		Melder_throw ("No ", klas ? klas -> className : L"object", " #", inplace, " selected.");
+		Melder_throw (U"No ", klas ? klas -> className : U"object", U" #", inplace, U" selected.");
 	} else {
-		Melder_throw ("No ", klas ? klas -> className : L"object", " selected.");
+		Melder_throw (U"No ", klas ? klas -> className : U"object", U" selected.");
 	}
-	return 0;   // Failure.
+	return 0;   // failure
 }
 
-int praat_selection (ClassInfo klas) {
-	if (klas == NULL) return theCurrentPraatObjects -> totalSelection;
+int praat_numberOfSelected (ClassInfo klas) {
+	if (! klas) return theCurrentPraatObjects -> totalSelection;
 	long readableClassId = klas -> sequentialUniqueIdOfReadableClass;
-	if (readableClassId == 0) Melder_fatal ("No sequential unique ID for class %ls.", klas -> className);
+	if (readableClassId == 0) Melder_fatal (U"No sequential unique ID for class ", klas -> className, U".");
 	return theCurrentPraatObjects -> numberOfSelected [readableClassId];
 }
 
 void praat_deselect (int IOBJECT) {
 	if (! SELECTED) return;
-	SELECTED = FALSE;
+	SELECTED = false;
 	theCurrentPraatObjects -> totalSelection -= 1;
-	long readableClassId = ((Thing) theCurrentPraatObjects -> list [IOBJECT]. object) -> classInfo -> sequentialUniqueIdOfReadableClass;
+	long readableClassId = theCurrentPraatObjects -> list [IOBJECT]. object -> classInfo -> sequentialUniqueIdOfReadableClass;
 	Melder_assert (readableClassId != 0);
 	theCurrentPraatObjects -> numberOfSelected [readableClassId] -= 1;
 	if (! theCurrentPraatApplication -> batch && ! Melder_backgrounding) {
-		praatList_objects -> f_deselectItem (IOBJECT);
+		trace (U"deselecting object ", IOBJECT);
+		GuiList_deselectItem (praatList_objects, IOBJECT);
+		trace (U"deselected object ", IOBJECT);
 	}
 }
 
-void praat_deselectAll (void) { int IOBJECT; WHERE (1) praat_deselect (IOBJECT); }
+void praat_deselectAll () { int IOBJECT; WHERE (1) praat_deselect (IOBJECT); }
 
 void praat_select (int IOBJECT) {
 	if (SELECTED) return;
-	SELECTED = TRUE;
+	SELECTED = true;
 	theCurrentPraatObjects -> totalSelection += 1;
-	Thing object = (Thing) theCurrentPraatObjects -> list [IOBJECT]. object;
-	Melder_assert (object != NULL);
+	Thing object = theCurrentPraatObjects -> list [IOBJECT]. object;
+	Melder_assert (object);
 	long readableClassId = object -> classInfo -> sequentialUniqueIdOfReadableClass;
-	if (readableClassId == 0) Melder_fatal ("No sequential unique ID for class %ls.", object -> classInfo -> className);
+	if (readableClassId == 0) Melder_fatal (U"No sequential unique ID for class ", object -> classInfo -> className, U".");
 	theCurrentPraatObjects -> numberOfSelected [readableClassId] += 1;
 	if (! theCurrentPraatApplication -> batch && ! Melder_backgrounding) {
-		praatList_objects -> f_selectItem (IOBJECT);
+		GuiList_selectItem (praatList_objects, IOBJECT);
 	}
 }
 
-void praat_selectAll (void) { int IOBJECT; WHERE (1) praat_select (IOBJECT); }
+void praat_selectAll () { int IOBJECT; WHERE (1) praat_select (IOBJECT); }
 
-void praat_list_background (void) {
+void praat_list_background () {
 	int IOBJECT;
-	WHERE (SELECTED) praatList_objects -> f_deselectItem (IOBJECT);
+	WHERE (SELECTED) GuiList_deselectItem (praatList_objects, IOBJECT);
 }
-void praat_list_foreground (void) {
+void praat_list_foreground () {
 	int IOBJECT;
 	WHERE (SELECTED) {
-		praatList_objects -> f_selectItem (IOBJECT);
+		GuiList_selectItem (praatList_objects, IOBJECT);
 	}
 }
 
-Data praat_onlyObject (ClassInfo klas) {
+Daata praat_onlyObject (ClassInfo klas) {
 	int IOBJECT, result = 0, found = 0;
 	WHERE (SELECTED && CLASS == klas) { result = IOBJECT; found += 1; }
-	if (found != 1) return NULL;
+	if (found != 1) return nullptr;
 	return theCurrentPraatObjects -> list [result]. object;
 }
 
-Data praat_firstObject (ClassInfo klas) {
+Daata praat_firstObject (ClassInfo klas) {
 	int IOBJECT;
 	LOOP {
 		if (CLASS == klas) return theCurrentPraatObjects -> list [IOBJECT]. object;
 	}
-	return NULL;   // this is often OK
+	return nullptr;   // this is often OK
 }
 
-Data praat_onlyObject_generic (ClassInfo klas) {
+Daata praat_onlyObject_generic (ClassInfo klas) {
 	int IOBJECT, result = 0, found = 0;
-	WHERE (SELECTED && Thing_subclass ((ClassInfo) CLASS, klas)) { result = IOBJECT; found += 1; }
-	if (found != 1) return NULL;
+	WHERE (SELECTED && Thing_isSubclass (CLASS, klas)) { result = IOBJECT; found += 1; }
+	if (found != 1) return nullptr;
 	return theCurrentPraatObjects -> list [result]. object;
 }
 
-Data praat_firstObject_generic (ClassInfo klas) {
+Daata praat_firstObject_generic (ClassInfo klas) {
 	int IOBJECT;
 	LOOP {
-		if (Thing_subclass ((ClassInfo) CLASS, klas)) return theCurrentPraatObjects -> list [IOBJECT]. object;
+		if (Thing_isSubclass (CLASS, klas)) return theCurrentPraatObjects -> list [IOBJECT]. object;
 	}
-	return NULL;   // this is often OK
+	return nullptr;   // this is often OK
 }
 
-praat_Object praat_onlyScreenObject (void) {
+praat_Object praat_onlyScreenObject () {
 	int IOBJECT, result = 0, found = 0;
 	WHERE (SELECTED) { result = IOBJECT; found += 1; }
-	if (found != 1) Melder_fatal ("praat_onlyScreenObject: found %d objects instead of 1.", found);
+	if (found != 1) Melder_fatal (U"praat_onlyScreenObject: found ", found, U" objects instead of 1.");
 	return & theCurrentPraatObjects -> list [result];
 }
 
-Data praat_firstObject_any () {
+Daata praat_firstObject_any () {
 	int IOBJECT;
 	LOOP {
 		return theCurrentPraatObjects -> list [IOBJECT]. object;
 	}
-	return NULL;   // this is often OK
+	return nullptr;   // this is often OK
 }
 
-Collection praat_getSelectedObjects (void) {
-	autoCollection thee = Collection_create (NULL, 10);
+Collection praat_getSelectedObjects () {
+	autoCollection thee = Collection_create (nullptr, 10);
 	Collection_dontOwnItems (thee.peek());
 	int IOBJECT;
 	LOOP {
-		iam_LOOP (Data);
+		iam_LOOP (Daata);
 		Collection_addItem (thee.peek(), me);
 	}
 	return thee.transfer();
 }
 
-wchar_t *praat_name (int IOBJECT) { return wcschr (FULL_NAME, ' ') + 1; }
+char32 *praat_name (int IOBJECT) { return str32chr (FULL_NAME, U' ') + 1; }
 
-void praat_write_do (Any dia, const wchar_t *extension) {
+void praat_write_do (UiForm dia, const char32 *extension) {
 	int IOBJECT, found = 0;
-	Data data = NULL;
-	static MelderString defaultFileName = { 0 };
-	MelderString_empty (& defaultFileName);
-	WHERE (SELECTED) { if (! data) data = (Data) OBJECT; found += 1; }
+	Daata data = nullptr;
+	static MelderString defaultFileName { 0 };
+	WHERE (SELECTED) { if (! data) data = (Daata) OBJECT; found += 1; }
 	if (found == 1) {
-		MelderString_append (& defaultFileName, data -> name);
-		if (defaultFileName.length > 50) { defaultFileName.string [50] = '\0'; defaultFileName.length = 50; }
-		MelderString_append (& defaultFileName, L".", extension ? extension : Thing_className (data));
-	} else if (extension == NULL) {
-		MelderString_append (& defaultFileName, L"praat.Collection");
+		MelderString_copy (& defaultFileName, data -> name);
+		if (defaultFileName.length > 50) { defaultFileName.string [50] = U'\0'; defaultFileName.length = 50; }
+		MelderString_append (& defaultFileName, U".", extension ? extension : Thing_className (data));
+	} else if (! extension) {
+		MelderString_copy (& defaultFileName, U"praat.Collection");
 	} else {
-		MelderString_append (& defaultFileName, L"praat.", extension);
+		MelderString_copy (& defaultFileName, U"praat.", extension);
 	}
 	UiOutfile_do (dia, defaultFileName.string);
 }
 
 static void removeAllReferencesToEditor (Any editor) {
-	int iobject, ieditor;
 	/*
 	 * Remove all references to this editor.
 	 * It may be editing multiple objects.
 	 */
-	for (iobject = 1; iobject <= theCurrentPraatObjects -> n; iobject ++)
-		for (ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++)
+	for (int iobject = 1; iobject <= theCurrentPraatObjects -> n; iobject ++)
+		for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++)
 			if (theCurrentPraatObjects -> list [iobject]. editors [ieditor] == editor)
-				theCurrentPraatObjects -> list [iobject]. editors [ieditor] = NULL;
+				theCurrentPraatObjects -> list [iobject]. editors [ieditor] = nullptr;
 	if (praatP. editor == editor)
-		praatP. editor = NULL;
+		praatP. editor = nullptr;
 }
 
-static void praat_remove (int iobject) {
+static void praat_remove (int iobject, bool removeVisibly) {
 /* Remove the "object" from the list. */
 /* Kill everything to do with selection. */
-	int ieditor;
+
 	Melder_assert (iobject >= 1 && iobject <= theCurrentPraatObjects -> n);
-	if (theCurrentPraatObjects -> list [iobject]. _beingCreated) {
-		theCurrentPraatObjects -> list [iobject]. _beingCreated = FALSE;
+	if (theCurrentPraatObjects -> list [iobject]. isBeingCreated) {
+		theCurrentPraatObjects -> list [iobject]. isBeingCreated = false;
 		theCurrentPraatObjects -> totalBeingCreated --;
 	}
-	praat_deselect (iobject);
+	trace (U"deselect object ", iobject);
+	if (removeVisibly)
+		praat_deselect (iobject);
+	trace (U"deselected object ", iobject);
 
 	/*
 	 * To prevent synchronization problems, kill editors before killing the data.
 	 */
-	for (ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++) {
-		Editor editor = (Editor) theCurrentPraatObjects -> list [iobject]. editors [ieditor];   /* Save this one reference. */
+	for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++) {
+		Editor editor = theCurrentPraatObjects -> list [iobject]. editors [ieditor];   // save this one reference
 		if (editor) {
+			trace (U"remove references to editor ", ieditor);
 			removeAllReferencesToEditor (editor);
-			forget (editor);
+			trace (U"forget editor ", ieditor);
+			if (removeVisibly)
+				forget (editor);
+			trace (U"forgeotten editor ", ieditor);
 		}
 	}
 	MelderFile_setToNull (& theCurrentPraatObjects -> list [iobject]. file);
+	trace (U"free name");
 	Melder_free (theCurrentPraatObjects -> list [iobject]. name);
+	trace (U"forget object");
 	forget (theCurrentPraatObjects -> list [iobject]. object);
+	trace (U"forgotten object");
 }
 
-void praat_cleanUpName (wchar_t *name) {
+void praat_cleanUpName (char32 *name) {
 	/*
 	 * Replaces spaces and special characters by underscores.
 	 */
 	for (; *name; name ++) {
-		#if 1
-			if (wcschr (L" ,.:;\\/()[]{}~`\'<>*&^%#@!?$\"|", *name)) *name = '_';
-		#else
-			if (! iswalnum (*name) && *name != '-' && *name != '+') *name = '_';
-		#endif
+		if (str32chr (U" ,.:;\\/()[]{}~`\'<>*&^%#@!?$\"|", *name)) *name = U'_';
 	}
 }
 
 /***** objects + commands *****/
 
-void praat_newWithFile (Data me, const wchar_t *myName, MelderFile file) {
-	int IOBJECT, ieditor;   // must be local: praat_new can be called from within a loop!!!
-	if (me == NULL)
-		Melder_throw ("No object was put into the list.");
-	/*
-	 * If my class is Collection, I'll have to be unpacked.
-	 */
+static void praat_new_unpackCollection (autoCollection me, const char32* myName) {
+	for (long idata = 1; idata <= my size; idata ++) {
+		autoDaata object = (Daata) my item [idata];
+		my item [idata] = nullptr;   // disown; once the elements are autoThings, the move will handle this
+		const char32 *name = object -> name ? object -> name : myName;
+		Melder_assert (name);
+		praat_new (object.transfer(), name);   // recurse
+	}
+}
+
+void praat_newWithFile (autoDaata me, MelderFile file, const char32 *myName) {
+	if (! me)
+		Melder_throw (U"No object was put into the list.");
+
 	if (my classInfo == classCollection) {
-		Collection list = (Collection) me;
-		try {
-			for (long idata = 1; idata <= list -> size; idata ++) {
-				Data object = (Data) list -> item [idata];
-				const wchar_t *name = object -> name ? object -> name : myName;
-				Melder_assert (name != NULL);
-				praat_new (object, name);   // recurse
-			}
-		} catch (MelderError) {
-			list -> size = 0;   // disown
-			forget (list);
-			throw;
-		}
-		list -> size = 0;   // disown
-		forget (list);
+		praat_new_unpackCollection (me.static_cast_move<structCollection>(), myName);
+		//praat_new_unpackCollection (static_cast<Collection> (me.transfer()), myName);
+			// yuck; this should be done with move(), but how do we cast an autoDaata to autoCollection?
 		return;
 	}
 
-	MelderString name = { 0 }, givenName = { 0 };
+	autoMelderString name, givenName;
 	if (myName && myName [0]) {
 		MelderString_copy (& givenName, myName);
 		/*
 		 * Remove extension.
 		 */
-		wchar_t *p = wcsrchr (givenName.string, '.');
-		if (p) *p = '\0';
+		char32 *p = str32rchr (givenName.string, U'.');
+		if (p) *p = U'\0';
 		praat_cleanUpName (givenName.string);
 	} else {
-		MelderString_copy (& givenName, my name && my name [0] ? my name : L"untitled");
+		MelderString_copy (& givenName, my name && my name [0] ? my name : U"untitled");
 	}
-	MelderString_append (& name, Thing_className (me), L" ", givenName.string);
+	MelderString_append (& name, Thing_className (me.get()), U" ", givenName.string);
 
 	if (theCurrentPraatObjects -> n == praat_MAXNUM_OBJECTS) {
-		forget (me);
-		Melder_throw ("The Object Window cannot contain more than ", praat_MAXNUM_OBJECTS, " objects. You could remove some objects.");
+		//forget (me);
+		Melder_throw (U"The Object Window cannot contain more than ", praat_MAXNUM_OBJECTS, U" objects. You could remove some objects.");
 	}
 		
-	IOBJECT = ++ theCurrentPraatObjects -> n;
-	Melder_assert (FULL_NAME == NULL);
-	FULL_NAME = Melder_wcsdup_f (name.string);   // all right to crash if out of memory
+	int IOBJECT = ++ theCurrentPraatObjects -> n;
+	Melder_assert (FULL_NAME == nullptr);
+	FULL_NAME = Melder_dup_f (name.string);   // all right to crash if out of memory
 	++ theCurrentPraatObjects -> uniqueId;
 
 	if (! theCurrentPraatApplication -> batch) {   // put a new object on the screen, at the bottom of the list
-		MelderString listName = { 0 };
-		MelderString_append (& listName, Melder_integer (theCurrentPraatObjects -> uniqueId), L". ", name.string);
-		praatList_objects -> f_insertItem (listName.string, theCurrentPraatObjects -> n);
-		MelderString_free (& listName);
+		GuiList_insertItem (praatList_objects,
+			Melder_cat (theCurrentPraatObjects -> uniqueId, U". ", name.string),
+			theCurrentPraatObjects -> n);
 	}
-	OBJECT = me;
-	SELECTED = FALSE;
 	CLASS = my classInfo;
-	for (ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++)
-		EDITOR [ieditor] = NULL;
-	if (file != NULL) {
+	OBJECT = me.transfer();
+	SELECTED = false;
+	for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++)
+		EDITOR [ieditor] = nullptr;
+	if (file) {
 		MelderFile_copy (file, & theCurrentPraatObjects -> list [IOBJECT]. file);
 	} else {
 		MelderFile_setToNull (& theCurrentPraatObjects -> list [IOBJECT]. file);
 	}
 	ID = theCurrentPraatObjects -> uniqueId;
-	theCurrentPraatObjects -> list [IOBJECT]. _beingCreated = TRUE;
-	Thing_setName ((Thing) OBJECT, givenName.string);
+	theCurrentPraatObjects -> list [IOBJECT]. isBeingCreated = true;
+	Thing_setName (OBJECT, givenName.string);
 	theCurrentPraatObjects -> totalBeingCreated ++;
-	MelderString_free (& givenName);
-	MelderString_free (& name);
 }
 
-static MelderString thePraatNewName = { 0 };
-void praat_newWithFile (Data me, const wchar_t *s1, const wchar_t *s2, MelderFile file) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2);
-	praat_newWithFile (me, thePraatNewName.string, file);
-}
-void praat_newWithFile (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, MelderFile file) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2, s3);
-	praat_newWithFile (me, thePraatNewName.string, file);
-}
-void praat_newWithFile (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, MelderFile file) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2, s3, s4);
-	praat_newWithFile (me, thePraatNewName.string, file);
+static MelderString thePraatNewName { 0 };
+void praat_new (Daata me) {
+	praat_newWithFile (me, nullptr, U"");
 }
-void praat_newWithFile (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, MelderFile file) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2, s3, s4, s5);
-	praat_newWithFile (me, thePraatNewName.string, file);
+void praat_new (Daata me, Melder_1_ARG) {
+	praat_newWithFile (me, nullptr, Melder_1_ARG_CALL);
 }
-void praat_new (Data me, const wchar_t *s1) {
-	praat_newWithFile (me, s1, NULL);
-}
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2);
+void praat_new (Daata me, Melder_2_ARGS) {
+	MelderString_copy (& thePraatNewName, Melder_2_ARGS_CALL);
 	praat_new (me, thePraatNewName.string);
 }
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2, s3);
+void praat_new (Daata me, Melder_3_ARGS) {
+	MelderString_copy (& thePraatNewName, Melder_3_ARGS_CALL);
 	praat_new (me, thePraatNewName.string);
 }
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2, s3, s4);
-	return praat_new (me, thePraatNewName.string);
+void praat_new (Daata me, Melder_4_ARGS) {
+	MelderString_copy (& thePraatNewName, Melder_4_ARGS_CALL);
+	praat_new (me, thePraatNewName.string);
 }
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2, s3, s4, s5);
+void praat_new (Daata me, Melder_5_ARGS) {
+	MelderString_copy (& thePraatNewName, Melder_5_ARGS_CALL);
 	praat_new (me, thePraatNewName.string);
 }
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2, s3, s4, s5, s6);
+void praat_new (Daata me, Melder_6_ARGS) {
+	MelderString_copy (& thePraatNewName, Melder_6_ARGS_CALL);
 	praat_new (me, thePraatNewName.string);
 }
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2, s3, s4, s5, s6, s7);
+void praat_new (Daata me, Melder_7_ARGS) {
+	MelderString_copy (& thePraatNewName, Melder_7_ARGS_CALL);
 	praat_new (me, thePraatNewName.string);
 }
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2, s3, s4, s5, s6, s7, s8);
+void praat_new (Daata me, Melder_8_ARGS) {
+	MelderString_copy (& thePraatNewName, Melder_8_ARGS_CALL);
 	praat_new (me, thePraatNewName.string);
 }
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9) {
-	MelderString_empty (& thePraatNewName);
-	MelderString_append (& thePraatNewName, s1, s2, s3, s4, s5, s6, s7, s8, s9);
+void praat_new (Daata me, Melder_9_ARGS) {
+	MelderString_copy (& thePraatNewName, Melder_9_ARGS_CALL);
 	praat_new (me, thePraatNewName.string);
 }
 
-void praat_updateSelection (void) {
+void praat_updateSelection () {
 	if (theCurrentPraatObjects -> totalBeingCreated) {
 		int IOBJECT;
 		praat_deselectAll ();
-		WHERE (theCurrentPraatObjects -> list [IOBJECT]. _beingCreated) {
+		WHERE (theCurrentPraatObjects -> list [IOBJECT]. isBeingCreated) {
 			praat_select (IOBJECT);
-			theCurrentPraatObjects -> list [IOBJECT]. _beingCreated = FALSE;
+			theCurrentPraatObjects -> list [IOBJECT]. isBeingCreated = false;
 		}
 		theCurrentPraatObjects -> totalBeingCreated = 0;
 		praat_show ();
@@ -486,26 +464,28 @@ void praat_updateSelection (void) {
 
 static void gui_cb_list (void *void_me, GuiListEvent event) {
 	(void) event; (void) void_me;
-	int IOBJECT, first = TRUE;
+	int IOBJECT;
+	bool first = true;
 	WHERE (SELECTED) {
-		SELECTED = FALSE;
-		long readableClassId = ((Thing) theCurrentPraatObjects -> list [IOBJECT]. object) -> classInfo -> sequentialUniqueIdOfReadableClass;
+		SELECTED = false;
+		long readableClassId = theCurrentPraatObjects -> list [IOBJECT]. object -> classInfo -> sequentialUniqueIdOfReadableClass;
 		theCurrentPraatObjects -> numberOfSelected [readableClassId] --;
 		Melder_assert (theCurrentPraatObjects -> numberOfSelected [readableClassId] >= 0);
 	}
 	theCurrentPraatObjects -> totalSelection = 0;
-	long numberOfSelected, *selected = praatList_objects -> f_getSelectedPositions (& numberOfSelected);
-	if (selected != NULL) {
+	long numberOfSelected;
+	long *selected = GuiList_getSelectedPositions (praatList_objects, & numberOfSelected);
+	if (selected) {
 		for (long iselected = 1; iselected <= numberOfSelected; iselected ++) {
 			IOBJECT = selected [iselected];
-			SELECTED = TRUE;
-			long readableClassId = ((Thing) theCurrentPraatObjects -> list [IOBJECT]. object) -> classInfo -> sequentialUniqueIdOfReadableClass;
+			SELECTED = true;
+			long readableClassId = theCurrentPraatObjects -> list [IOBJECT]. object -> classInfo -> sequentialUniqueIdOfReadableClass;
 			theCurrentPraatObjects -> numberOfSelected [readableClassId] ++;
 			Melder_assert (theCurrentPraatObjects -> numberOfSelected [readableClassId] > 0);
-			UiHistory_write (first ? L"\nselectObject: \"" : L"\nplusObject: \"");
+			UiHistory_write (first ? U"\nselectObject: \"" : U"\nplusObject: \"");
 			UiHistory_write_expandQuotes (FULL_NAME);
-			UiHistory_write (L"\"");
-			first = FALSE;
+			UiHistory_write (U"\"");
+			first = false;
 			theCurrentPraatObjects -> totalSelection += 1;
 		}
 		NUMvector_free <long> (selected, 1);
@@ -513,123 +493,127 @@ static void gui_cb_list (void *void_me, GuiListEvent event) {
 	praat_show ();
 }
 
-void praat_list_renameAndSelect (int position, const wchar_t *name) {
+void praat_list_renameAndSelect (int position, const char32 *name) {
 	if (! theCurrentPraatApplication -> batch) {
-		praatList_objects -> f_replaceItem (name, position);   // void if name equal
+		GuiList_replaceItem (praatList_objects, name, position);   // void if name equal
 		if (! Melder_backgrounding)
-			praatList_objects -> f_selectItem (position);
+			GuiList_selectItem (praatList_objects, position);
 	}
 }
 
 /***** objects *****/
 
-void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2) {
+void praat_name2 (char32 *name, ClassInfo klas1, ClassInfo klas2) {
 	int i1 = 1;
-	while (theCurrentPraatObjects -> list [i1]. selected == 0 || theCurrentPraatObjects -> list [i1]. klas != klas1) i1 ++;
+	while (theCurrentPraatObjects -> list [i1]. isSelected == 0 || theCurrentPraatObjects -> list [i1]. klas != klas1) i1 ++;
 	int i2 = 1;
-	while (theCurrentPraatObjects -> list [i2]. selected == 0 || theCurrentPraatObjects -> list [i2]. klas != klas2) i2 ++;
-	wchar_t *name1 = wcschr (theCurrentPraatObjects -> list [i1]. name, ' ') + 1;
-	wchar_t *name2 = wcschr (theCurrentPraatObjects -> list [i2]. name, ' ') + 1;
-	if (wcsequ (name1, name2))
-		wcscpy (name, name1);
+	while (theCurrentPraatObjects -> list [i2]. isSelected == 0 || theCurrentPraatObjects -> list [i2]. klas != klas2) i2 ++;
+	char32 *name1 = str32chr (theCurrentPraatObjects -> list [i1]. name, U' ') + 1;
+	char32 *name2 = str32chr (theCurrentPraatObjects -> list [i2]. name, U' ') + 1;
+	if (str32equ (name1, name2))
+		Melder_sprint (name,200, name1);
 	else
-		swprintf (name, 200, L"%ls_%ls", name1, name2);
+		Melder_sprint (name,200, name1, U"_", name2);
 }
 
 void praat_removeObject (int i) {
 	int j, ieditor;
-	praat_remove (i);   /* Dangle. */
+	praat_remove (i, true);   // dangle
 	for (j = i; j < theCurrentPraatObjects -> n; j ++)
-		theCurrentPraatObjects -> list [j] = theCurrentPraatObjects -> list [j + 1];   /* Undangle but create second references. */
-	theCurrentPraatObjects -> list [theCurrentPraatObjects -> n]. name = NULL;   /* Undangle or remove second reference. */
-	theCurrentPraatObjects -> list [theCurrentPraatObjects -> n]. object = NULL;   /* Undangle or remove second reference. */
-	theCurrentPraatObjects -> list [theCurrentPraatObjects -> n]. selected = 0;
+		theCurrentPraatObjects -> list [j] = theCurrentPraatObjects -> list [j + 1];   // undangle but create second references
+	theCurrentPraatObjects -> list [theCurrentPraatObjects -> n]. name = nullptr;   // undangle or remove second reference
+	theCurrentPraatObjects -> list [theCurrentPraatObjects -> n]. object = nullptr;   // undangle or remove second reference
+	theCurrentPraatObjects -> list [theCurrentPraatObjects -> n]. isSelected = 0;
 	for (ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++)
-		theCurrentPraatObjects -> list [theCurrentPraatObjects -> n]. editors [ieditor] = NULL;   /* Undangle or remove second reference. */
-	MelderFile_setToNull (& theCurrentPraatObjects -> list [theCurrentPraatObjects -> n]. file);   /* Undangle or remove second reference. */
+		theCurrentPraatObjects -> list [theCurrentPraatObjects -> n]. editors [ieditor] = nullptr;   // undangle or remove second reference
+	MelderFile_setToNull (& theCurrentPraatObjects -> list [theCurrentPraatObjects -> n]. file);   // undangle or remove second reference
 	-- theCurrentPraatObjects -> n;
 	if (! theCurrentPraatApplication -> batch) {
-		praatList_objects -> f_deleteItem (i);
+		GuiList_deleteItem (praatList_objects, i);
 	}
 }
 
 static void praat_exit (int exit_code) {
+//Melder_setTracing (true);
 	int IOBJECT;
 	#ifdef _WIN32
 		if (! theCurrentPraatApplication -> batch) {
 			Melder_assert (theCurrentPraatApplication);
 			Melder_assert (theCurrentPraatApplication -> topShell);
 			Melder_assert (theCurrentPraatApplication -> topShell -> d_xmShell);
-			trace ("destroy the object window");
+			trace (U"destroy the object window");
 			XtDestroyWidget (theCurrentPraatApplication -> topShell -> d_xmShell);
 		}
 	#endif
-	trace ("destroy the picture window");
+	trace (U"destroy the picture window");
 	praat_picture_exit ();
-	praat_statistics_exit ();   /* Record total memory use across sessions. */
+	praat_statistics_exit ();   // record total memory use across sessions
 
-	trace ("stop receiving messages");
-	#if defined (UNIX)
-		/*
-		 * We are going to delete the process id ("pid") file, if it's ours.
-		 */
-		if (pidFile. path [0]) {
-			try {
-				/*
-				 * To see whether we own the pid file,
-				 * we look into it to see whether its pid equals our pid.
-				 * If not, then we are probably living in an old invocation of the program,
-				 * and the pid file was written by the latest invocation of the program,
-				 * which owns the pid (this means sendpraat can only send to the latest Praat if more than one are open).
-				 */
-				autofile f = Melder_fopen (& pidFile, "r");
-				long pid;
-				if (fscanf (f, "%ld", & pid) < 1) throw MelderError ();
-				f.close (& pidFile);
-				if (pid == getpid ()) {   // is the pid in the pid file equal to our pid?
-					MelderFile_delete (& pidFile);   // ...then we own the pid file and can delete it
+	if (! praatP.ignorePreferenceFiles) {
+		trace (U"stop receiving messages");
+		#if defined (UNIX)
+			/*
+			 * We are going to delete the process id ("pid") file, if it's ours.
+			 */
+			if (pidFile. path [0]) {
+				try {
+					/*
+					 * To see whether we own the pid file,
+					 * we look into it to see whether its pid equals our pid.
+					 * If not, then we are probably living in an old invocation of the program,
+					 * and the pid file was written by the latest invocation of the program,
+					 * which owns the pid (this means sendpraat can only send to the latest Praat if more than one are open).
+					 */
+					autofile f = Melder_fopen (& pidFile, "r");
+					long pid;
+					if (fscanf (f, "%ld", & pid) < 1) throw MelderError ();
+					f.close (& pidFile);
+					if (pid == getpid ()) {   // is the pid in the pid file equal to our pid?
+						MelderFile_delete (& pidFile);   // ...then we own the pid file and can delete it
+					}
+				} catch (MelderError) {
+					Melder_clearError ();   // if the pid file is somehow missing or corrupted, we just ignore that
 				}
-			} catch (MelderError) {
-				Melder_clearError ();   // if the pid file is somehow missing or corrupted, we just ignore that
 			}
-		}
-	#endif
+		#endif
 
-	trace ("save the preferences");
-	Melder_assert (wcsequ (Melder_double (1.5), L"1.5"));   // refuse to write the preferences if the locale is wrong (even if tracing is on)
-	Preferences_write (& prefsFile);
+		trace (U"save the preferences");
+		Melder_assert (str32equ (Melder_double (1.5), U"1.5"));   // refuse to write the preferences if the locale is wrong (even if tracing is on)
+		Preferences_write (& prefsFile);
 
-	trace ("save the script buttons");
-	if (! theCurrentPraatApplication -> batch) {
-		try {
-			autoMelderString buffer;
-			MelderString_append (& buffer, L"# Buttons (1).\n");
-			MelderString_append (& buffer, L"# This file is generated automatically when you quit the ", Melder_peekUtf8ToWcs (praatP.title), L" program.\n");
-			MelderString_append (& buffer, L"# It contains the buttons that you added interactively to the fixed or dynamic menus,\n");
-			MelderString_append (& buffer, L"# and the buttons that you hid or showed.\n\n");
-			praat_saveMenuCommands (& buffer);
-			praat_saveAddedActions (& buffer);
-			MelderFile_writeText (& buttonsFile, buffer.string, kMelder_textOutputEncoding_ASCII_THEN_UTF16);
-		} catch (MelderError) {
-			Melder_clearError ();
+		trace (U"save the script buttons");
+		if (! theCurrentPraatApplication -> batch) {
+			try {
+				autoMelderString buffer;
+				MelderString_append (& buffer, U"# Buttons (1).\n");
+				MelderString_append (& buffer, U"# This file is generated automatically when you quit the ", praatP.title, U" program.\n");
+				MelderString_append (& buffer, U"# It contains the buttons that you added interactively to the fixed or dynamic menus,\n");
+				MelderString_append (& buffer, U"# and the buttons that you hid or showed.\n\n");
+				praat_saveMenuCommands (& buffer);
+				praat_saveAddedActions (& buffer);
+				MelderFile_writeText (& buttonsFile, buffer.string, kMelder_textOutputEncoding_ASCII_THEN_UTF16);
+			} catch (MelderError) {
+				Melder_clearError ();
+			}
 		}
 	}
 
-	trace ("flush the file-based objects");
-	WHERE_DOWN (! MelderFile_isNull (& theCurrentPraatObjects -> list [IOBJECT]. file)) praat_remove (IOBJECT);
-	Melder_files_cleanUp ();   /* If a URL is open. */
+	trace (U"flush the file-based objects");
+	WHERE_DOWN (! MelderFile_isNull (& theCurrentPraatObjects -> list [IOBJECT]. file)) {
+		trace (U"removing object based on file ", & theCurrentPraatObjects -> list [IOBJECT]. file);
+		praat_remove (IOBJECT, false);
+	}
+	Melder_files_cleanUp ();   // in case a URL is open
 
-	trace ("leave the program");
+	trace (U"leave the program");
 	exit (exit_code);
 }
 
-static void cb_Editor_destruction (Editor me, void *closure) {
-	(void) closure;
+static void cb_Editor_destruction (Editor me, void * /*closure*/) {
 	removeAllReferencesToEditor (me);   // remove reference(s) to moribund Editor
 }
 
-static void cb_Editor_dataChanged (Editor me, void *closure) {
-	(void) closure;
+static void cb_Editor_dataChanged (Editor me, void * /*closure*/) {
 	for (int iobject = 1; iobject <= theCurrentPraatObjects -> n; iobject ++) {
 		bool editingThisObject = false;
 		/*
@@ -645,63 +629,63 @@ static void cb_Editor_dataChanged (Editor me, void *closure) {
 			 * Notify all other editors associated with this object.
 			 */
 			for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++) {
-				Editor otherEditor = (Editor) theCurrentPraatObjects -> list [iobject]. editors [ieditor];
-				if (otherEditor != NULL && otherEditor != me) {
-					otherEditor -> dataChanged ();
+				Editor otherEditor = theCurrentPraatObjects -> list [iobject]. editors [ieditor];
+				if (otherEditor && otherEditor != me) {
+					Editor_dataChanged (otherEditor);
 				}
 			}
 		}
 	}
 }
 
-static void cb_Editor_publication (Editor me, void *closure, Data publication) {
+static void cb_Editor_publication (Editor /*me*/, void * /*closure*/, Daata publication) {
 /*
    The default publish callback.
    Works nicely if the publisher invents a name.
 */
-	(void) me;
-	(void) closure;
 	try {
-		praat_new (publication, NULL);
+		praat_new (publication, U"");
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 	praat_updateSelection ();
 }
 
 int praat_installEditor (Editor editor, int IOBJECT) {
-	if (editor == NULL) return 0;
+	if (! editor) return 0;
 	for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++) {
-		if (EDITOR [ieditor] == NULL) {
+		if (! EDITOR [ieditor]) {
 			EDITOR [ieditor] = editor;
-			editor -> setDestructionCallback (cb_Editor_destruction, NULL);
-			editor -> setDataChangedCallback (cb_Editor_dataChanged, NULL);
-			if (! editor -> d_publicationCallback) editor -> setPublicationCallback (cb_Editor_publication, NULL);
+			Editor_setDestructionCallback (editor, cb_Editor_destruction, nullptr);
+			Editor_setDataChangedCallback (editor, cb_Editor_dataChanged, nullptr);
+			if (! editor -> d_publicationCallback)
+				Editor_setPublicationCallback (editor, cb_Editor_publication, nullptr);
 			return 1;
 		}
 	}
 	forget (editor);
-	Melder_throw ("(praat_installEditor:) Cannot have more than ", praat_MAXNUM_EDITORS, " editors with one object.");
+	Melder_throw (U"(praat_installEditor:) Cannot have more than ", praat_MAXNUM_EDITORS, U" editors with one object.");
 }
 
 int praat_installEditor2 (Editor editor, int i1, int i2) {
-	if (editor == NULL) return 0;
+	if (! editor) return 0;
 	int ieditor1 = 0;
 	for (; ieditor1 < praat_MAXNUM_EDITORS; ieditor1 ++)
-		if (theCurrentPraatObjects -> list [i1]. editors [ieditor1] == NULL)
+		if (! theCurrentPraatObjects -> list [i1]. editors [ieditor1])
 			break;
 	int ieditor2 = 0;
 	for (; ieditor2 < praat_MAXNUM_EDITORS; ieditor2 ++)
-		if (theCurrentPraatObjects -> list [i2]. editors [ieditor2] == NULL)
+		if (! theCurrentPraatObjects -> list [i2]. editors [ieditor2])
 			break;
 	if (ieditor1 < praat_MAXNUM_EDITORS && ieditor2 < praat_MAXNUM_EDITORS) {
 		theCurrentPraatObjects -> list [i1]. editors [ieditor1] = theCurrentPraatObjects -> list [i2]. editors [ieditor2] = editor;
-		editor -> setDestructionCallback (cb_Editor_destruction, NULL);
-		editor -> setDataChangedCallback (cb_Editor_dataChanged, NULL);
-		if (! editor -> d_publicationCallback) editor -> setPublicationCallback (cb_Editor_publication, NULL);
+		Editor_setDestructionCallback (editor, cb_Editor_destruction, nullptr);
+		Editor_setDataChangedCallback (editor, cb_Editor_dataChanged, nullptr);
+		if (! editor -> d_publicationCallback)
+			Editor_setPublicationCallback (editor, cb_Editor_publication, nullptr);
 	} else {
 		forget (editor);
-		Melder_throw ("(praat_installEditor2:) Cannot have more than ", praat_MAXNUM_EDITORS, " editors with one object.");
+		Melder_throw (U"(praat_installEditor2:) Cannot have more than ", praat_MAXNUM_EDITORS, U" editors with one object.");
 	}
 	return 1;
 }
@@ -710,76 +694,79 @@ int praat_installEditor3 (Editor editor, int i1, int i2, int i3) {
 	if (! editor) return 0;
 	int ieditor1 = 0;
 	for (; ieditor1 < praat_MAXNUM_EDITORS; ieditor1 ++)
-		if (theCurrentPraatObjects -> list [i1]. editors [ieditor1] == NULL)
+		if (! theCurrentPraatObjects -> list [i1]. editors [ieditor1])
 			break;
 	int ieditor2 = 0;
 	for (; ieditor2 < praat_MAXNUM_EDITORS; ieditor2 ++)
-		if (theCurrentPraatObjects -> list [i2]. editors [ieditor2] == NULL)
+		if (! theCurrentPraatObjects -> list [i2]. editors [ieditor2])
 			break;
 	int ieditor3 = 0;
 	for (; ieditor3 < praat_MAXNUM_EDITORS; ieditor3 ++)
-		if (theCurrentPraatObjects -> list [i3]. editors [ieditor3] == NULL)
+		if (! theCurrentPraatObjects -> list [i3]. editors [ieditor3])
 			break;
 	if (ieditor1 < praat_MAXNUM_EDITORS && ieditor2 < praat_MAXNUM_EDITORS && ieditor3 < praat_MAXNUM_EDITORS) {
 		theCurrentPraatObjects -> list [i1]. editors [ieditor1] = theCurrentPraatObjects -> list [i2]. editors [ieditor2] = theCurrentPraatObjects -> list [i3]. editors [ieditor3] = editor;
-		editor -> setDestructionCallback (cb_Editor_destruction, NULL);
-		editor -> setDataChangedCallback (cb_Editor_dataChanged, NULL);
-		if (! editor -> d_publicationCallback) editor -> setPublicationCallback (cb_Editor_publication, NULL);
+		Editor_setDestructionCallback (editor, cb_Editor_destruction, nullptr);
+		Editor_setDataChangedCallback (editor, cb_Editor_dataChanged, nullptr);
+		if (! editor -> d_publicationCallback)
+			Editor_setPublicationCallback (editor, cb_Editor_publication, nullptr);
 	} else {
 		forget (editor);
-		Melder_throw ("(praat_installEditor3:) Cannot have more than ", praat_MAXNUM_EDITORS, " editors with one object.");
+		Melder_throw (U"(praat_installEditor3:) Cannot have more than ", praat_MAXNUM_EDITORS, U" editors with one object.");
 	}
 	return 1;
 }
 
 int praat_installEditorN (Editor editor, Ordered objects) {
-	long iOrderedObject, iPraatObject;
-	if (editor == NULL) return 0;
+	if (! editor) return 0;
 	/*
 	 * First check whether all objects in the Ordered are also in the List of Objects (Praat crashes if not),
 	 * and check whether there is room to add an editor for each.
 	 */
-	for (iOrderedObject = 1; iOrderedObject <= objects -> size; iOrderedObject ++) {
-		Data object = (Data) objects -> item [iOrderedObject];
-		for (iPraatObject = 1; iPraatObject <= theCurrentPraatObjects -> n; iPraatObject ++) {
+	for (long iOrderedObject = 1; iOrderedObject <= objects -> size; iOrderedObject ++) {
+		Daata object = (Daata) objects -> item [iOrderedObject];
+		long iPraatObject = 1;
+		for (; iPraatObject <= theCurrentPraatObjects -> n; iPraatObject ++) {
 			if (object == theCurrentPraatObjects -> list [iPraatObject]. object) {
 				int ieditor = 0;
 				for (; ieditor < praat_MAXNUM_EDITORS; ieditor ++) {
-					if (theCurrentPraatObjects -> list [iPraatObject]. editors [ieditor] == NULL) {
+					if (! theCurrentPraatObjects -> list [iPraatObject]. editors [ieditor]) {
 						break;
 					}
 				}
 				if (ieditor >= praat_MAXNUM_EDITORS) {
 					forget (editor);
-					Melder_throw ("Cannot view the same object in more than ", praat_MAXNUM_EDITORS, " windows.");
+					Melder_throw (U"Cannot view the same object in more than ", praat_MAXNUM_EDITORS, U" windows.");
 				}
 				break;
 			}
 		}
-		Melder_assert (iPraatObject <= theCurrentPraatObjects -> n);   /* An element of the Ordered does not occur in the List of Objects. */
+		Melder_assert (iPraatObject <= theCurrentPraatObjects -> n);   // an element of the Ordered does not occur in the List of Objects
 	}
 	/*
 	 * There appears to be room for all elements of the Ordered. The editor window can appear. Install the editor in all objects.
 	 */
-	for (iOrderedObject = 1; iOrderedObject <= objects -> size; iOrderedObject ++) {
-		Data object = (Data) objects -> item [iOrderedObject];
-		for (iPraatObject = 1; iPraatObject <= theCurrentPraatObjects -> n; iPraatObject ++) {
+	for (long iOrderedObject = 1; iOrderedObject <= objects -> size; iOrderedObject ++) {
+		Daata object = (Daata) objects -> item [iOrderedObject];
+		long iPraatObject = 1;
+		for (; iPraatObject <= theCurrentPraatObjects -> n; iPraatObject ++) {
 			if (object == theCurrentPraatObjects -> list [iPraatObject]. object) {
 				int ieditor = 0;
 				for (; ieditor < praat_MAXNUM_EDITORS; ieditor ++) {
-					if (theCurrentPraatObjects -> list [iPraatObject]. editors [ieditor] == NULL) {
+					if (! theCurrentPraatObjects -> list [iPraatObject]. editors [ieditor]) {
 						theCurrentPraatObjects -> list [iPraatObject]. editors [ieditor] = editor;
-						editor -> setDestructionCallback (cb_Editor_destruction, NULL);
-						editor -> setDataChangedCallback (cb_Editor_dataChanged, NULL);
-						if (! editor -> d_publicationCallback) editor -> setPublicationCallback (cb_Editor_publication, NULL);
+						Editor_setDestructionCallback (editor, cb_Editor_destruction, nullptr);
+						Editor_setDataChangedCallback (editor, cb_Editor_dataChanged, nullptr);
+						if (! editor -> d_publicationCallback)
+							Editor_setPublicationCallback (editor, cb_Editor_publication, nullptr);
 						break;
 					}
 				}
-				Melder_assert (ieditor < praat_MAXNUM_EDITORS);   /* We just checked, but nevertheless. */
+				Melder_assert (ieditor < praat_MAXNUM_EDITORS);   // we just checked, but nevertheless
 				break;
 			}
 		}
-		Melder_assert (iPraatObject <= theCurrentPraatObjects -> n);   /* We already checked, but still. */
+		Melder_assert (iPraatObject <= theCurrentPraatObjects -> n);   // we already checked, but still
 	}
 	return 1;
 }
@@ -788,65 +775,65 @@ void praat_dataChanged (Any object) {
 	/*
 	 * This function can be called at error time, which is weird.
 	 */
-	wchar_t *saveError = NULL;
+	char32 *saveError = nullptr;
 	bool duringError = Melder_hasError ();
 	if (duringError) {
-		saveError = Melder_wcsdup_f (Melder_getError ());
+		saveError = Melder_dup_f (Melder_getError ());
 		Melder_clearError ();
 	}
 	int IOBJECT;
 	WHERE (OBJECT == object) {
 		for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++) {
-			Editor editor = (Editor) EDITOR [ieditor];
-			if (editor != NULL) {
-				editor -> dataChanged ();
+			Editor editor = EDITOR [ieditor];
+			if (editor) {
+				Editor_dataChanged (editor);
 			}
 		}
 	}
 	if (duringError) {
-		Melder_error_ (saveError);   // BUG: this appends an empty newline to the original error message
+		Melder_appendError (saveError);   // BUG: this appends an empty newline to the original error message
 		Melder_free (saveError);   // BUG: who will catch the error?
 	}
 }
 
-static void helpProc (const wchar_t *query) {
+static void helpProc (const char32 *query) {
 	if (theCurrentPraatApplication -> batch) {
-		Melder_flushError ("Cannot view manual from batch.");
+		Melder_flushError (U"Cannot view manual from batch.");
 		return;
 	}
 	try {
 		Manual_create (query, theCurrentPraatApplication -> manPages, false);
 	} catch (MelderError) {
-		Melder_flushError ("help: no help on \"%ls\".", query);
+		Melder_flushError (U"help: no help on \"", query, U"\".");
 	}
 }
 
 static int publishProc (void *anything) {
 	try {
-		praat_new ((Data) anything, NULL);
+		praat_new ((Daata) anything, U"");
 		praat_updateSelection ();
 		return 1;
 	} catch (MelderError) {
-		Melder_throw ("Not published.");
+		Melder_throw (U"Not published.");
 	}
 }
 
 /***** QUIT *****/
 
-FORM (Quit, L"Confirm Quit", L"Quit")
-	LABEL (L"label", L"You have objects in your list!")
+FORM (Quit, U"Confirm Quit", U"Quit")
+	LABEL (U"label", U"You have objects in your list!")
 	OK
 {
-	wchar_t prompt [300];
+	char32 prompt [300];
 	if (ScriptEditors_dirty ()) {
 		if (theCurrentPraatObjects -> n)
-			swprintf (prompt, 300, L"You have objects and unsaved scripts! Do you still want to quit %ls?", Melder_peekUtf8ToWcs (praatP.title));
+			Melder_sprint (prompt,300, U"You have objects and unsaved scripts! Do you still want to quit ", praatP.title, U"?");
 		else
-			swprintf (prompt, 300, L"You have unsaved scripts! Do you still want to quit %ls?", Melder_peekUtf8ToWcs (praatP.title));
-		SET_STRING (L"label", prompt);
+			Melder_sprint (prompt,300, U"You have unsaved scripts! Do you still want to quit ", praatP.title, U"?");
+		SET_STRING (U"label", prompt);
 	} else if (theCurrentPraatObjects -> n) {
-		swprintf (prompt, 300, L"You have objects in your list! Do you still want to quit %ls?", Melder_peekUtf8ToWcs (praatP.title));
-		SET_STRING (L"label", prompt);
+		Melder_sprint (prompt,300, U"You have objects in your list! Do you still want to quit ", praatP.title, U"?");
+		SET_STRING (U"label", prompt);
 	} else {
 		praat_exit (0);
 	}
@@ -855,11 +842,11 @@ DO
 	praat_exit (0);
 END
 
-static void gui_cb_quit (void *p) {
-	DO_Quit (NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);
+static void gui_cb_quit (void *) {
+	DO_Quit (nullptr, 0, nullptr, nullptr, nullptr, nullptr, false, nullptr);
 }
 
-void praat_dontUsePictureWindow (void) { praatP.dontUsePictureWindow = TRUE; }
+void praat_dontUsePictureWindow () { praatP.dontUsePictureWindow = true; }
 
 /********** INITIALIZATION OF THE PRAAT SHELL **********/
 
@@ -868,7 +855,7 @@ void praat_dontUsePictureWindow (void) { praatP.dontUsePictureWindow = TRUE; }
 		Melder_assert (signum == SIGUSR1);
 		#if 0
 			gboolean retval;
-			g_signal_emit_by_name (GTK_OBJECT (theCurrentPraatApplication -> topShell -> d_gtkWindow), "client-event", NULL, & retval);
+			g_signal_emit_by_name (GTK_OBJECT (theCurrentPraatApplication -> topShell -> d_gtkWindow), "client-event", nullptr, & retval);
 		#else
 			#if ALLOW_GDK_DRAWING && ! defined (NO_GRAPHICS)
 				GdkEventClient gevent;
@@ -877,7 +864,7 @@ void praat_dontUsePictureWindow (void) { praatP.dontUsePictureWindow = TRUE; }
 				gevent. send_event = 1;
 				gevent. message_type = gdk_atom_intern_static_string ("SENDPRAAT");
 				gevent. data_format = 8;
-				// Melder_casual ("event put");
+				// Melder_casual (U"event put");
 				gdk_event_put ((GdkEvent *) & gevent);
 			#endif
 		#endif
@@ -889,7 +876,7 @@ void praat_dontUsePictureWindow (void) { praatP.dontUsePictureWindow = TRUE; }
 		static gboolean cb_userMessage (GtkWidget widget, GdkEventClient *event, gpointer user_data) {
 			(void) widget;
 			(void) user_data;
-			//Melder_casual ("client event called");
+			//Melder_casual (U"client event called");
 			autofile f;
 			try {
 				f.reset (Melder_fopen (& messageFile, "r"));
@@ -903,10 +890,9 @@ void praat_dontUsePictureWindow (void) { praatP.dontUsePictureWindow = TRUE; }
 			{// scope
 				autoPraatBackground background;
 				try {
-					praat_executeScriptFromFile (& messageFile, NULL);
+					praat_executeScriptFromFile (& messageFile, nullptr);
 				} catch (MelderError) {
-					Melder_error_ (Melder_peekUtf8ToWcs (praatP.title), L": message not completely handled.");
-					Melder_flushError (NULL);
+					Melder_flushError (praatP.title, U": message not completely handled.");
 				}
 			}
 			if (narg && pid) kill (pid, SIGUSR2);
@@ -914,142 +900,185 @@ void praat_dontUsePictureWindow (void) { praatP.dontUsePictureWindow = TRUE; }
 		}
 	#endif
 #elif defined (_WIN32)
-	static int cb_userMessage (void) {
+	static int cb_userMessage () {
 		autoPraatBackground background;
 		try {
-			praat_executeScriptFromFile (& messageFile, NULL);
+			praat_executeScriptFromFile (& messageFile, nullptr);
 		} catch (MelderError) {
-			Melder_error_ (Melder_peekUtf8ToWcs (praatP.title), L": message not completely handled.");
-			Melder_flushError (NULL);
+			Melder_flushError (praatP.title, U": message not completely handled.");
 		}
 		return 0;
 	}
 	extern "C" char *sendpraat (void *display, const char *programName, long timeOut, const char *text);
 	extern "C" wchar_t *sendpraatW (void *display, const wchar_t *programName, long timeOut, const wchar_t *text);
 	static void cb_openDocument (MelderFile file) {
-		wchar_t text [500];
+		char32 text [kMelder_MAXPATH+25];
 		/*
 		 * The user dropped a file on the Praat icon, while Praat is already running.
-		 * Windows may have enclosed the path between quotes;
-		 * this is especially likely to happen for a path that contains spaces.
 		 */
-		swprintf (text, 500, L"Read from file... %ls", file -> path);
-		sendpraatW (NULL, Melder_peekUtf8ToWcs (praatP.title), 0, text);
+		Melder_sprint (text,500, U"Read from file... ", file -> path);
+		#ifdef __CYGWIN__
+			sendpraat (nullptr, Melder_peek32to8 (praatP.title), 0, Melder_peek32to8 (text));
+		#else
+			sendpraatW (nullptr, Melder_peek32toW (praatP.title), 0, Melder_peek32toW (text));
+		#endif
 	}
 #elif cocoa
-	static int (*theUserMessageCallbackA) (char *message);
-	static int (*theUserMessageCallbackW) (wchar_t *message);
-	static void mac_setUserMessageCallbackA (int (*userMessageCallback) (char *message)) {
-		theUserMessageCallbackA = userMessageCallback;
-	}
-	static void mac_setUserMessageCallbackW (int (*userMessageCallback) (wchar_t *message)) {
-		theUserMessageCallbackW = userMessageCallback;
+	static int (*theUserMessageCallback) (char32 *message);
+	static void mac_setUserMessageCallback (int (*userMessageCallback) (char32 *message)) {
+		theUserMessageCallback = userMessageCallback;
 	}
-	static pascal OSErr mac_processSignalA (const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon) {
-		static int duringAppleEvent = FALSE;
+	static pascal OSErr mac_processSignal8 (const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon) {
+		static bool duringAppleEvent = false;   // FIXME: may have to be atomic?
 		(void) reply;
 		(void) handlerRefCon;
 		if (! duringAppleEvent) {
 			char *buffer;
-			long actualSize;
-			duringAppleEvent = TRUE;
-			//AEInteractWithUser (kNoTimeOut, NULL, NULL);   // use time out of 0 to execute immediately (without bringing to foreground)
+			Size actualSize;
+			duringAppleEvent = true;
+			//AEInteractWithUser (kNoTimeOut, nullptr, nullptr);   // use time out of 0 to execute immediately (without bringing to foreground)
 			ProcessSerialNumber psn;
 			GetCurrentProcess (& psn);
 			SetFrontProcess (& psn);
-			AEGetParamPtr (theAppleEvent, 1, typeChar, NULL, NULL, 0, & actualSize);
-			buffer = (char *) malloc (actualSize);
-			AEGetParamPtr (theAppleEvent, 1, typeChar, NULL, & buffer [0], actualSize, NULL);
-			if (theUserMessageCallbackA)
-				theUserMessageCallbackA (buffer);
+			AEGetParamPtr (theAppleEvent, 1, typeUTF8Text, nullptr, nullptr, 0, & actualSize);
+			buffer = (char *) malloc ((size_t) actualSize);
+			AEGetParamPtr (theAppleEvent, 1, typeUTF8Text, nullptr, & buffer [0], actualSize, nullptr);
+			if (theUserMessageCallback) {
+				autostring32 buffer32 = Melder_8to32 (buffer);
+				theUserMessageCallback (buffer32.peek());
+			}
 			free (buffer);
-			duringAppleEvent = FALSE;
+			duringAppleEvent = false;
 		}
 		return noErr;
 	}
-	static pascal OSErr mac_processSignalW (const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon) {
-		static int duringAppleEvent = FALSE;
+	static pascal OSErr mac_processSignal16 (const AppleEvent *theAppleEvent, AppleEvent *reply, long handlerRefCon) {
+		static bool duringAppleEvent = false;   // FIXME: may have to be atomic?
 		(void) reply;
 		(void) handlerRefCon;
 		if (! duringAppleEvent) {
-			wchar_t *buffer;
-			long actualSize;
-			duringAppleEvent = TRUE;
-			//AEInteractWithUser (kNoTimeOut, NULL, NULL);   // use time out of 0 to execute immediately (without bringing to foreground)
+			char16 *buffer;
+			Size actualSize;
+			duringAppleEvent = true;
+			//AEInteractWithUser (kNoTimeOut, nullptr, nullptr);   // use time out of 0 to execute immediately (without bringing to foreground)
 			ProcessSerialNumber psn;
 			GetCurrentProcess (& psn);
 			SetFrontProcess (& psn);
-			AEGetParamPtr (theAppleEvent, 1, typeUnicodeText, NULL, NULL, 0, & actualSize);
-			buffer = (wchar_t *) malloc (actualSize);
-			AEGetParamPtr (theAppleEvent, 1, typeUnicodeText, NULL, & buffer [0], actualSize, NULL);
-			if (theUserMessageCallbackW)
-				theUserMessageCallbackW (buffer);
+			AEGetParamPtr (theAppleEvent, 1, typeUTF16ExternalRepresentation, nullptr, nullptr, 0, & actualSize);
+			buffer = (char16 *) malloc ((size_t) actualSize);
+			AEGetParamPtr (theAppleEvent, 1, typeUTF16ExternalRepresentation, nullptr, & buffer [0], actualSize, nullptr);
+			if (theUserMessageCallback) {
+				autostring32 buffer32 = Melder_16to32 (buffer);
+				theUserMessageCallback (buffer32.peek());
+			}
 			free (buffer);
-			duringAppleEvent = FALSE;
+			duringAppleEvent = false;
 		}
 		return noErr;
 	}
-	static int cb_userMessageA (char *messageA) {
-		autoPraatBackground background;
-		autostring message = Melder_8bitToWcs (messageA, 0);
-		try {
-			praat_executeScriptFromText (message.peek());
-		} catch (MelderError) {
-			Melder_error_ (praatP.title, ": message not completely handled.");
-			Melder_flushError (NULL);
-		}
-		return 0;
-	}
-	static int cb_userMessageW (wchar_t *message) {
+	static int cb_userMessage (char32 *message) {
 		autoPraatBackground background;
 		try {
 			praat_executeScriptFromText (message);
 		} catch (MelderError) {
-			Melder_error_ (praatP.title, ": message not completely handled.");
-			Melder_flushError (NULL);
+			Melder_flushError (praatP.title, U": message not completely handled.");
 		}
 		return 0;
 	}
-	static int cb_quitApplication (void) {
-		DO_Quit (NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);
+	static int cb_quitApplication () {
+		DO_Quit (nullptr, 0, nullptr, nullptr, nullptr, nullptr, false, nullptr);
 		return 0;
 	}
 #elif defined (macintosh)
-	static int cb_userMessageA (char *messageA) {
-		autoPraatBackground background;
-		autostring message = Melder_8bitToWcs (messageA, 0);
-		try {
-			praat_executeScriptFromText (message.peek());
-		} catch (MelderError) {
-			Melder_error_ (praatP.title, ": message not completely handled.");
-			Melder_flushError (NULL);
-		}
-		return 0;
-	}
-	static int cb_userMessageW (wchar_t *message) {
+	static int cb_userMessage (char32 *message) {
 		autoPraatBackground background;
 		try {
 			praat_executeScriptFromText (message);
 		} catch (MelderError) {
-			Melder_error_ (praatP.title, ": message not completely handled.");
-			Melder_flushError (NULL);
+			Melder_flushError (praatP.title, U": message not completely handled.");
 		}
 		return 0;
 	}
-	static int cb_quitApplication (void) {
-		DO_Quit (NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);
+	static int cb_quitApplication () {
+		DO_Quit (nullptr, 0, nullptr, nullptr, nullptr, nullptr, false, nullptr);
 		return 0;
 	}
 #endif
 
-static wchar_t * thePraatStandAloneScriptText = NULL;
+static const char32 * thePraatStandAloneScriptText = nullptr;
 
-void praat_setStandAloneScriptText (wchar_t *text) {
+void praat_setStandAloneScriptText (const char32 *text) {
 	thePraatStandAloneScriptText = text;
 }
 
-void praat_init (const char *title, unsigned int argc, char **argv) {
-	static char truncatedTitle [300];   // static because praatP.title will point into it
+static bool tryToAttachToTheCommandLine ()
+{
+	bool weHaveSucceeded = false;
+	#if defined (_WIN32)
+		/*
+		 * On Windows, console applications are automatically attached to the command line,
+		 * but Praat is always a Windows application instead, so command line attachment
+		 * has to be handled explicitly, as here.
+		 */
+		if (AttachConsole (ATTACH_PARENT_PROCESS)) {   // was Praat called from either a console window or a "system" command?
+			/*
+			 * Redirect stdout to the console (note: no UTF-8!).
+			 */
+			HANDLE handle = GetStdHandle (STD_OUTPUT_HANDLE);
+			int fileHandle = _open_osfhandle ((intptr_t) handle, _O_TEXT);
+			FILE* f = _fdopen (fileHandle, "w");
+			*stdout = *f;
+			setvbuf (stdout, nullptr, _IONBF, 0);
+			/*
+			 * Redirect stderr to the console (note: no UTF-8!).
+			 */
+			handle = GetStdHandle (STD_ERROR_HANDLE);
+			fileHandle = _open_osfhandle ((intptr_t) handle, _O_TEXT);
+			f = _fdopen (fileHandle, "w");
+			*stderr = *f;
+			setvbuf (stderr, nullptr, _IONBF, 0);
+			/*
+			 * Redirect stdin from the console (note: no UTF-8!).
+			 */
+			handle = GetStdHandle (STD_INPUT_HANDLE);
+			fileHandle = _open_osfhandle ((intptr_t) handle, _O_TEXT);
+			f = _fdopen (fileHandle, "r");
+			*stdin = *f;
+			setvbuf (stdin, nullptr, _IONBF, 0);
+			/*
+			 */
+			weHaveSucceeded = true;
+		} else {   // Praat was called from Windows Explorer, typically by double-clicking or dropping a file
+			DWORD err = GetLastError ();
+			if (err == ERROR_ACCESS_DENIED) {
+				printf ("Apparently Praat has been called as a console application.\n"
+					"Did you compile it without the -mwindows flag?\n");
+				Melder_fatal (U"Apparently Praat has been called as a console application.\n"
+					"Did you compile it without the -mwindows flag?");
+			} else if (err == ERROR_INVALID_HANDLE) {
+				(void) 0;   // a normal case: the parent process is Windows Explorer or so, which doesn't have a console (Windows XP, 10?)
+			} else if (err == ERROR_GEN_FAILURE) {
+				(void) 0;   // another normal case: there is no parent process (Windows 7)?
+			} else {
+				printf ("AttachConsole() returned unknown error %d\n", (int) err);
+				Melder_fatal (U"AttachConsole() returned unknown error ", err);
+			}
+		}
+	#else
+		weHaveSucceeded = isatty (fileno (stdout));
+			// this is true if Praat was called from a terminal window or a system() command or Xcode,
+			// and false if Praat was called from the Finder by double-clicking or dropping a file.
+	#endif
+	return weHaveSucceeded;
+}
+
+void praat_init (const char32 *title, unsigned int argc, char **argv)
+{
+	bool weWereStartedFromTheCommandLine = tryToAttachToTheCommandLine ();
+
+	for (unsigned int iarg = 0; iarg < argc; iarg ++) {
+		//Melder_casual (U"arg ", iarg, U": <<", Melder_peek8to32 (argv [iarg]), U">>");
+	}
 	#if defined (UNIX)
 		setlocale (LC_ALL, "C");
 		setenv ("PULSE_LATENCY_MSEC", "1", 0);   // Rafael Laboissiere, August 2014
@@ -1058,11 +1087,12 @@ void praat_init (const char *title, unsigned int argc, char **argv) {
 	#elif defined (macintosh)
 		setlocale (LC_ALL, "en_US");   // required to make swprintf work correctly; the default "C" locale does not do that!
 	#endif
-	char *p;
 	#ifdef macintosh
-		SInt32 macSystemVersion;
-		Gestalt ('sysv', & macSystemVersion);
-		Melder_systemVersion = macSystemVersion;
+		SInt32 sys1, sys2, sys3;
+		Gestalt ('sys1', & sys1);
+		Gestalt ('sys2', & sys2);
+		Gestalt ('sys3', & sys3);
+		Melder_systemVersion = sys1 * 10000 + sys2 * 100 + sys3;
 	#endif
 	/*
 		Initialize numerical libraries.
@@ -1072,108 +1102,134 @@ void praat_init (const char *title, unsigned int argc, char **argv) {
 	Melder_alloc_init ();
 	Melder_message_init ();
 	/*
-		Remember the current directory. Only useful for scripts run from batch.
+		Remember the current directory. Useful only for scripts run from batch.
 	*/
 	Melder_rememberShellDirectory ();
 
 	/*
 	 * Install the preferences of the Praat shell, and set the defaults.
 	 */
-	praat_statistics_prefs ();   // Number of sessions, memory used...
-	praat_picture_prefs ();   // Font...
+	praat_statistics_prefs ();   // number of sessions, memory used...
+	praat_picture_prefs ();   // font...
 	Graphics_prefs ();
-	structEditor     :: f_preferences ();   // Erase picture first...
-	structHyperPage  :: f_preferences ();   // Font...
-	Site_prefs ();   // Print command...
-	Melder_audio_prefs ();   // Use speaker (Sun & HP), output gain (HP)...
+	structEditor     :: f_preferences ();   // erase picture first...
+	structHyperPage  :: f_preferences ();   // font...
+	Site_prefs ();   // print command...
+	Melder_audio_prefs ();   // asynchronicity, silence after...
 	Melder_textEncoding_prefs ();
-	Printer_prefs ();   // Paper size, printer command...
-	structTextEditor :: f_preferences ();   // Font size...
+	Printer_prefs ();   // paper size, printer command...
+	structTextEditor :: f_preferences ();   // font size...
 
-	unsigned int iarg_batchName = 1;
-	#if defined (UNIX) || defined (macintosh) || defined (_WIN32) && defined (CONSOLE_APPLICATION)
-		/*
-		 * Running the Praat shell from the Unix command line,
-		 * or running PRAATCON.EXE from the Windows command prompt:
-		 *    <programName> <scriptFileName>
-		 */
-		if (argc > iarg_batchName
-			&& argv [iarg_batchName] [0] == '-'
-			&& argv [iarg_batchName] [1] == 'a'
-			&& argv [iarg_batchName] [2] == '\0')
-		{
+	praatP.argc = argc;
+	praatP.argv = argv;
+	praatP.argumentNumber = 1;
+	const char32 *unknownCommandLineOption = nullptr;
+
+	/*
+	 * Running Praat from the command line.
+	 */
+	bool foundTheOpenOption = false;
+	while (praatP.argumentNumber < argc && argv [praatP.argumentNumber] [0] == '-') {
+		if (strequ (argv [praatP.argumentNumber], "-")) {
+			praatP.hasCommandLineInput = true;
+		} else if (strequ (argv [praatP.argumentNumber], "--open")) {
+			foundTheOpenOption = true;
+			praatP.argumentNumber += 1;
+		} else if (strequ (argv [praatP.argumentNumber], "--no-pref-files")) {
+			praatP.ignorePreferenceFiles = true;
+			praatP.argumentNumber += 1;
+		} else if (strequ (argv [praatP.argumentNumber], "--no-plugins")) {
+			praatP.ignorePlugins = true;
+			praatP.argumentNumber += 1;
+		} else if (strnequ (argv [praatP.argumentNumber], "--pref-dir=", 11)) {
+			Melder_pathToDir (Melder_peek8to32 (argv [praatP.argumentNumber] + 11), & praatDir);
+			praatP.argumentNumber += 1;
+		} else if (strequ (argv [praatP.argumentNumber], "--version")) {
+			#define xstr(s) str(s)
+			#define str(s) #s
+			printf ("%s %s (%s %d, %d)\n", Melder_peek32to8 (title), xstr (PRAAT_VERSION_STR), xstr (PRAAT_MONTH), PRAAT_DAY, PRAAT_YEAR);
+			exit (0);
+		} else if (strequ (argv [praatP.argumentNumber], "--help")) {
+			printf ("Usage: praat [options] script-file-name [script-arguments]\n");
+			printf ("Options:\n");
+			printf ("  --open           interpret the command line arguments as files to be opened in the GUI,\n");
+			printf ("                   instead of as a script file name and its arguments\n");
+			printf ("  --no-pref-files  don't read or write the preferences file and the buttons file\n");
+			printf ("  --no-plugins     don't activate the plugins\n");
+			printf ("  --pref-dir=DIR   set the preferences directory to DIR\n");
+			printf ("  --version        print the Praat version\n");
+			printf ("  --help           print this list of command line options\n");
+			printf ("  -a, --ansi       on Windows: use ISO Latin-1 encoding instead of UTF-16LE (not recommended)\n");
+			exit (0);
+		} else if (strequ (argv [praatP.argumentNumber], "-a") || strequ (argv [praatP.argumentNumber], "--ansi")) {
 			Melder_consoleIsAnsi = true;
-			iarg_batchName ++;
-		}
-		//fprintf (stdout, "Console <%d> <%s>", Melder_consoleIsAnsi, argv [1]);
-		bool hasCommandLineInput =
-			argc > iarg_batchName
-			&& argv [iarg_batchName] [0] == '-'
-			&& argv [iarg_batchName] [1] == '\0';
-		MelderString_copy (& theCurrentPraatApplication -> batchName,
-			hasCommandLineInput ? L""
-			: argc > iarg_batchName && argv [iarg_batchName] [0] != '-' /* funny Mac test */ ? Melder_peekUtf8ToWcs (argv [iarg_batchName])
-			: L"");
-
-		Melder_batch = theCurrentPraatApplication -> batchName.string [0] != '\0' || thePraatStandAloneScriptText != NULL;
-
-		#if defined (_WIN32) && defined (CONSOLE_APPLICATION)
-			if (! Melder_batch) {
-				fprintf (stderr, "Usage: PRAATCON <scriptFileName>\n");
-				exit (0);
-			}
+			praatP.argumentNumber += 1;
+		#if defined (macintosh)
+		} else if (strequ (argv [praatP.argumentNumber], "-NSDocumentRevisionsDebugMode")) {
+			(void) 0;   // ignore this option, which was added by Xcode
+			praatP.argumentNumber += 2;   // jump over the argument, which is usually "YES" (this jump works correctly even if this argument is missing)
+		} else if (strnequ (argv [praatP.argumentNumber], "-psn_", 5)) {
+			(void) 0;   // ignore this option, which was added by the Finder, perhaps when dragging a file on Praat (Process Serial Number)
+			praatP.argumentNumber += 1;
 		#endif
+		} else {
+			unknownCommandLineOption = Melder_8to32 (argv [praatP.argumentNumber]);
+			praatP.argumentNumber = UINT32_MAX;   // ignore all other command line options
+			break;
+		}
+	}
+
+	const bool thereIsAFileNameInTheArgumentList = ( praatP.argumentNumber < argc );
+	Melder_batch = weWereStartedFromTheCommandLine && thereIsAFileNameInTheArgumentList && ! foundTheOpenOption;
+	const bool fileNamesCameInByDropping = ( thereIsAFileNameInTheArgumentList && ! weWereStartedFromTheCommandLine );   // doesn't happen on the Mac
+	praatP.userWantsToOpen = foundTheOpenOption || fileNamesCameInByDropping;
+
+	if (Melder_batch) {
+		Melder_assert (praatP.argumentNumber < argc);
 		/*
-		 * Running the Praat shell from the command line:
-		 *    praat -
+		 * We now get the script file name. It is next on the command line
+		 * (not necessarily *last* on the line, because there may be script arguments after it).
 		 */
-		if (hasCommandLineInput) {
-			Melder_batch = true;
-			doingCommandLineInterface = TRUE;   /* Read from stdin. */
-		}
+		MelderString_copy (& theCurrentPraatApplication -> batchName, Melder_peek8to32 (argv [praatP.argumentNumber ++]));
+		if (praatP.hasCommandLineInput)
+			Melder_throw (U"Cannot have both command line input and a script file.");
+	} else {
+		MelderString_copy (& theCurrentPraatApplication -> batchName, U"");
+	}
+	//Melder_casual (U"Script file name <<", theCurrentPraatApplication -> batchName.string, U">>");
 
-		/* Take from 'title' ("myProg 3.2" becomes "myProg") or from command line ("/ifa/praat" becomes "praat"). */
-		strcpy (truncatedTitle, argc && argv [0] [0] ? argv [0] : title && title [0] ? title : "praat");
-		//Melder_fatal ("<%s>", argv [0]);
-	#else
-		#if defined (_WIN32)
-			MelderString_copy (& theCurrentPraatApplication -> batchName,
-				argv [3] ? Melder_peekUtf8ToWcs (argv [3]) : L"");   /* The command line. */
-		#endif
-		Melder_batch = false;   // PRAAT.EXE on Windows is always interactive
-		strcpy (truncatedTitle, title && title [0] ? title : "praat");
-	#endif
-	theCurrentPraatApplication -> batch = Melder_batch;
+	Melder_batch |= !! thePraatStandAloneScriptText;
 
 	/*
-	 * Construct a program name like "myProg 3.2" by removing directory path.
+	 * Running the Praat shell from the command line:
+	 *    praat -
 	 */
-	p = strrchr (truncatedTitle, Melder_DIRECTORY_SEPARATOR);
-	praatP.title = p ? p + 1 : truncatedTitle;
+	Melder_batch |= praatP.hasCommandLineInput;
+
+	praatP.title = Melder_dup (title && title [0] ? title : U"Praat");
+
+	theCurrentPraatApplication -> batch = Melder_batch;
 
 	/*
 	 * Construct a program name like "myProg" for file and directory names.
 	 */
-	strcpy (programName, praatP.title);
-	if ((p = strchr (programName, ' ')) != NULL) *p = '\0';
-	#if defined (_WIN32)
-		if ((p = strchr (programName, '.')) != NULL) *p = '\0';   /* Chop off ".exe". */
-	#endif
+	str32cpy (programName, praatP.title);
 
 	/*
 	 * Construct a main-window title like "MyProg 3.2".
 	 */
-	praatP.title [0] = toupper (praatP.title [0]);
+	programName [0] = (char32) tolower ((int) programName [0]);
 
 	/*
 	 * Get home directory, e.g. "/home/miep/", or "/Users/miep/", or just "/".
 	 */
 	Melder_getHomeDir (& homeDir);
+
 	/*
-	 * Get the program's private directory:
+	 * Get the program's private directory (if not yet set by the --prefdir option):
 	 *    "/u/miep/.myProg-dir" (Unix)
 	 *    "/Users/miep/Library/Preferences/MyProg Prefs" (Macintosh)
-	 *    "C:\Documents and Settings\Miep\MyProg" (Windows)
+	 *    "C:\Users\Miep\MyProg" (Windows)
 	 * and construct a preferences-file name and a script-buttons-file name like
 	 *    /u/miep/.myProg-dir/prefs5
 	 *    /u/miep/.myProg-dir/buttons5
@@ -1181,48 +1237,60 @@ void praat_init (const char *title, unsigned int argc, char **argv) {
 	 *    /Users/miep/Library/Preferences/MyProg Prefs/Prefs5
 	 *    /Users/miep/Library/Preferences/MyProg Prefs/Buttons5
 	 * or
-	 *    C:\Documents and Settings\Miep\MyProg\Preferences5.ini
-	 *    C:\Documents and Settings\Miep\MyProg\Buttons5.ini
-	 * On Unix, also create names for process-id and message files.
+	 *    C:\Users\Miep\MyProg\Preferences5.ini
+	 *    C:\Users\Miep\MyProg\Buttons5.ini
+	 * Also create names for message and tracing files.
 	 */
-	{
-		structMelderDir prefParentDir = { { 0 } };   /* Directory under which to store our preferences directory. */
-		wchar_t name [256];
+	if (MelderDir_isNull (& praatDir)) {   // not yet set by the --prefdir option?
+		structMelderDir prefParentDir { { 0 } };   // directory under which to store our preferences directory
 		Melder_getPrefDir (& prefParentDir);
+
 		/*
 		 * Make sure that the program's private directory exists.
 		 */
+		char32 name [256];
 		#if defined (UNIX)
-			swprintf (name, 256, L".%ls-dir", Melder_utf8ToWcs (programName));   /* For example .myProg-dir */
+			Melder_sprint (name,256, U".", programName, U"-dir");   // for example .myProg-dir
 		#elif defined (macintosh)
-			swprintf (name, 256, L"%ls Prefs", Melder_utf8ToWcs (praatP.title));   /* For example MyProg Prefs */
+			Melder_sprint (name,256, praatP.title, U" Prefs");   // for example MyProg Prefs
 		#elif defined (_WIN32)
-			swprintf (name, 256, L"%ls", Melder_utf8ToWcs (praatP.title));   /* For example MyProg */
-		#endif
-		#if defined (UNIX) || defined (macintosh)
-			Melder_createDirectory (& prefParentDir, name, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
-		#else
-			Melder_createDirectory (& prefParentDir, name, 0);
+			Melder_sprint (name,256, praatP.title);   // for example MyProg
 		#endif
-		MelderDir_getSubdir (& prefParentDir, name, & praatDir);
+		try {
+			#if defined (UNIX) || defined (macintosh)
+				Melder_createDirectory (& prefParentDir, name, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
+			#else
+				Melder_createDirectory (& prefParentDir, name, 0);
+			#endif
+			MelderDir_getSubdir (& prefParentDir, name, & praatDir);
+		} catch (MelderError) {
+			/*
+			 * If we arrive here, the directory could not be created,
+			 * and all the files are null. Praat should nevertheless start up.
+			 */
+			Melder_clearError ();
+		}
+	}
+	if (! MelderDir_isNull (& praatDir)) {
 		#if defined (UNIX)
-			MelderDir_getFile (& praatDir, L"prefs5", & prefsFile);
-			MelderDir_getFile (& praatDir, L"buttons5", & buttonsFile);
-			MelderDir_getFile (& praatDir, L"pid", & pidFile);
-			MelderDir_getFile (& praatDir, L"message", & messageFile);
-			MelderDir_getFile (& praatDir, L"tracing", & tracingFile);
+			MelderDir_getFile (& praatDir, U"prefs5", & prefsFile);
+			MelderDir_getFile (& praatDir, U"buttons5", & buttonsFile);
+			MelderDir_getFile (& praatDir, U"pid", & pidFile);
+			MelderDir_getFile (& praatDir, U"message", & messageFile);
+			MelderDir_getFile (& praatDir, U"tracing", & tracingFile);
 		#elif defined (_WIN32)
-			MelderDir_getFile (& praatDir, L"Preferences5.ini", & prefsFile);
-			MelderDir_getFile (& praatDir, L"Buttons5.ini", & buttonsFile);
-			MelderDir_getFile (& praatDir, L"Message.txt", & messageFile);
-			MelderDir_getFile (& praatDir, L"Tracing.txt", & tracingFile);
+			MelderDir_getFile (& praatDir, U"Preferences5.ini", & prefsFile);
+			MelderDir_getFile (& praatDir, U"Buttons5.ini", & buttonsFile);
+			MelderDir_getFile (& praatDir, U"Message.txt", & messageFile);
+			MelderDir_getFile (& praatDir, U"Tracing.txt", & tracingFile);
 		#elif defined (macintosh)
-			MelderDir_getFile (& praatDir, L"Prefs5", & prefsFile);
-			MelderDir_getFile (& praatDir, L"Buttons5", & buttonsFile);
-			MelderDir_getFile (& praatDir, L"Tracing.txt", & tracingFile);
+			MelderDir_getFile (& praatDir, U"Prefs5", & prefsFile);
+			MelderDir_getFile (& praatDir, U"Buttons5", & buttonsFile);
+			MelderDir_getFile (& praatDir, U"Tracing.txt", & tracingFile);
 		#endif
 		Melder_tracingToFile (& tracingFile);
 	}
+
 	#if defined (UNIX)
 		if (! Melder_batch) {
 			/*
@@ -1245,14 +1313,12 @@ void praat_init (const char *title, unsigned int argc, char **argv) {
 	#elif defined (macintosh)
 		#if useCarbon
 			if (! Melder_batch) {
-				motif_mac_setUserMessageCallbackA (cb_userMessageA);
-				motif_mac_setUserMessageCallbackW (cb_userMessageW);
+				motif_mac_setUserMessageCallback (cb_userMessage);
 				Gui_setQuitApplicationCallback (cb_quitApplication);
 			}
 		#else
 			if (! Melder_batch) {
-				mac_setUserMessageCallbackA (cb_userMessageA);
-				mac_setUserMessageCallbackW (cb_userMessageW);
+				mac_setUserMessageCallback (cb_userMessage);
 				Gui_setQuitApplicationCallback (cb_quitApplication);
 			}
 		#endif
@@ -1261,100 +1327,97 @@ void praat_init (const char *title, unsigned int argc, char **argv) {
 	/*
 	 * Make room for commands.
 	 */
-	trace ("initing actions");
+	trace (U"initing actions");
 	praat_actions_init ();
-	trace ("initing menu commands");
+	trace (U"initing menu commands");
 	praat_menuCommands_init ();
 
-	GuiWindow raam = NULL;
+	GuiWindow raam = nullptr;
 	if (Melder_batch) {
-		#if defined (UNIX) || defined (macintosh) || defined (_WIN32) && defined (CONSOLE_APPLICATION)
-			MelderString_empty (& theCurrentPraatApplication -> batchName);
-			for (unsigned int i = iarg_batchName; i < argc; i ++) {
-				int needsQuoting = strchr (argv [i], ' ') != NULL && (i == iarg_batchName || i < argc - 1);
-				if (i > 1) MelderString_append (& theCurrentPraatApplication -> batchName, L" ");
-				if (needsQuoting) MelderString_append (& theCurrentPraatApplication -> batchName, L"\"");
-				MelderString_append (& theCurrentPraatApplication -> batchName, Melder_peekUtf8ToWcs (argv [i]));
-				if (needsQuoting) MelderString_append (& theCurrentPraatApplication -> batchName, L"\"");
-			}
-		#elif defined (_WIN32)
-			MelderString_copy (& theCurrentPraatApplication -> batchName, Melder_peekUtf8ToWcs (argv [3]));
-		#endif
+		MelderString_empty (& theCurrentPraatApplication -> batchName);
+		for (unsigned int i = praatP.argumentNumber - 1; i < argc; i ++) {
+			if (i >= praatP.argumentNumber) MelderString_append (& theCurrentPraatApplication -> batchName, U" ");
+			bool needsQuoting = !! strchr (argv [i], ' ') && (i == praatP.argumentNumber - 1 || i < argc - 1);
+			if (needsQuoting) MelderString_append (& theCurrentPraatApplication -> batchName, U"\"");
+			MelderString_append (& theCurrentPraatApplication -> batchName, Melder_peek8to32 (argv [i]));
+			if (needsQuoting) MelderString_append (& theCurrentPraatApplication -> batchName, U"\"");
+		}
 	} else {
-		trace ("starting the application");
+		trace (U"starting the application");
 		Machine_initLookAndFeel (argc, argv);
 		/*
 		 * Start the application.
 		 */
 		#if gtk
-			trace ("locale %s", setlocale (LC_ALL, NULL));
-			g_set_application_name (title);
-			trace ("locale %s", setlocale (LC_ALL, NULL));
+			trace (U"locale ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
+			g_set_application_name (Melder_peek32to8 (title));
+			trace (U"locale ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 		#elif cocoa
 			//[NSApplication sharedApplication];
 			[GuiCocoaApplication sharedApplication];
 		#elif defined (_WIN32)
-			argv [0] = & praatP. title [0];   /* argc == 4 */
+			argv [0] = Melder_32to8 (praatP. title);   // argc == 4
 			Gui_setOpenDocumentCallback (cb_openDocument);
-			GuiAppInitialize ("Praatwulg", NULL, 0, & argc, argv, NULL, NULL);
+			GuiAppInitialize ("Praatwulg", argc, argv);
 		#elif defined (macintosh)
-			GuiAppInitialize ("Praatwulg", NULL, 0, & argc, argv, NULL, NULL);
+			GuiAppInitialize ("Praatwulg", argc, argv);
 		#endif
 
-		trace ("creating and installing the Objects window");
-		char objectWindowTitle [100];
-		sprintf (objectWindowTitle, "%s Objects", praatP.title);
+		trace (U"creating and installing the Objects window");
+		char32 objectWindowTitle [100];
+		Melder_sprint (objectWindowTitle,100, praatP.title, U" Objects");
 		double x, y;
-		trace ("locale %s", setlocale (LC_ALL, NULL));
-		Gui_getWindowPositioningBounds (& x, & y, NULL, NULL);
-		trace ("locale %s", setlocale (LC_ALL, NULL));
-		theCurrentPraatApplication -> topShell = raam = GuiWindow_create (x + 10, y, WINDOW_WIDTH, WINDOW_HEIGHT, 450, 250,
-			Melder_peekUtf8ToWcs (objectWindowTitle), gui_cb_quit, NULL, 0);
-		trace ("locale %s", setlocale (LC_ALL, NULL));
+		trace (U"locale ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
+		Gui_getWindowPositioningBounds (& x, & y, nullptr, nullptr);
+		trace (U"locale ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
+		theCurrentPraatApplication -> topShell = raam =
+			GuiWindow_create (x + 10, y, WINDOW_WIDTH, WINDOW_HEIGHT, 450, 250,
+				objectWindowTitle, gui_cb_quit, nullptr, 0);
+		trace (U"locale ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 		#if motif
 			GuiApp_setApplicationShell (theCurrentPraatApplication -> topShell -> d_xmShell);
 		#endif
-		trace ("before objects window shows locale %s", setlocale (LC_ALL, NULL));
-		raam -> f_show ();
-		trace ("after objects window shows locale %s", setlocale (LC_ALL, NULL));
+		trace (U"before objects window shows locale ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
+		GuiThing_show (raam);
+		trace (U"after objects window shows locale ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 	}
-	Thing_recognizeClassesByName (classCollection, classStrings, classManPages, classSortedSetOfString, NULL);
+	Thing_recognizeClassesByName (classCollection, classStrings, classManPages, classSortedSetOfString, nullptr);
 	if (Melder_batch) {
 		Melder_backgrounding = true;
-		trace ("adding menus without GUI");
-		praat_addMenus (NULL);
-		trace ("adding fixed buttons without GUI");
-		praat_addFixedButtons (NULL);
+		trace (U"adding menus without GUI");
+		praat_addMenus (nullptr);
+		trace (U"adding fixed buttons without GUI");
+		praat_addFixedButtons (nullptr);
 	} else {
 
 		#ifdef macintosh
 			#if ! useCarbon
-				AEInstallEventHandler (758934755, 0, (AEEventHandlerProcPtr) (mac_processSignalA), 0, false);
-				AEInstallEventHandler (758934756, 0, (AEEventHandlerProcPtr) (mac_processSignalW), 0, false);
+				AEInstallEventHandler (758934755, 0, (AEEventHandlerProcPtr) (mac_processSignal8), 0, false);   // for receiving sendpraat
+				AEInstallEventHandler (758934756, 0, (AEEventHandlerProcPtr) (mac_processSignal16), 0, false);   // for receiving sendpraatW
 			#endif
-			MelderGui_create (raam);   /* BUG: default Melder_assert would call printf recursively!!! */
+			MelderGui_create (raam);   // BUG: default Melder_assert would call printf recursively!!!
 		#endif
 		#if defined (macintosh) && useCarbon
-			trace ("creating the menu bar along the top of the screen (Mac only)");
-			raam -> f_addMenuBar ();   // yes, on the Mac we create a menu bar twice: once at the top of the screen, once in the Objects window
+			trace (U"creating the menu bar along the top of the screen (Mac only)");
+			GuiWindow_addMenuBar (raam);   // yes, on the Mac we create a menu bar twice: once at the top of the screen, once in the Objects window
 		#endif
-		trace ("creating the menu bar in the Objects window");
-		raam -> f_addMenuBar ();
+		trace (U"creating the menu bar in the Objects window");
+		GuiWindow_addMenuBar (raam);
 		praatP.menuBar = raam;
 		praat_addMenus (praatP.menuBar);
 
-		trace ("creating the object list in the Objects window");
-		GuiLabel_createShown (raam, 3, -250, Machine_getMainWindowMenuBarHeight () + 5, Machine_getMainWindowMenuBarHeight () + 5 + Gui_LABEL_HEIGHT, L"Objects:", 0);
-		praatList_objects = GuiList_create (raam, 0, -250, Machine_getMainWindowMenuBarHeight () + 26, -100, true, L" Objects ");
-		praatList_objects -> f_setSelectionChangedCallback (gui_cb_list, 0);
-		praatList_objects -> f_show ();
+		trace (U"creating the object list in the Objects window");
+		GuiLabel_createShown (raam, 3, -250, Machine_getMainWindowMenuBarHeight () + 5, Machine_getMainWindowMenuBarHeight () + 5 + Gui_LABEL_HEIGHT, U"Objects:", 0);
+		praatList_objects = GuiList_create (raam, 0, -250, Machine_getMainWindowMenuBarHeight () + 26, -100, true, U" Objects ");
+		GuiList_setSelectionChangedCallback (praatList_objects, gui_cb_list, 0);
+		GuiThing_show (praatList_objects);
 		praat_addFixedButtons (raam);
 
-		trace ("creating the dynamic menu in the Objects window");
+		trace (U"creating the dynamic menu in the Objects window");
 		praat_actions_createDynamicMenu (raam);
-		trace ("showing the Objects window");
-		raam -> f_show ();
-	//Melder_fatal ("stop");
+		trace (U"showing the Objects window");
+		GuiThing_show (raam);
+	//Melder_fatal (U"stop");
 		#if defined (UNIX) && ! defined (NO_GRAPHICS)
 			try {
 				autofile f = Melder_fopen (& pidFile, "a");
@@ -1369,10 +1432,12 @@ void praat_init (const char *title, unsigned int argc, char **argv) {
 			}
 		#endif
 		#ifdef UNIX
-			Preferences_read (& prefsFile);
+			if (! praatP.ignorePreferenceFiles) {
+				Preferences_read (& prefsFile);
+			}
 		#endif
-		#if ! defined (CONSOLE_APPLICATION) && ! defined (macintosh)
-			trace ("initializing the Gui late");
+		#if ! defined (macintosh)
+			trace (U"initializing the Gui late");
 			MelderGui_create (theCurrentPraatApplication -> topShell);   // Mac: done this earlier
 		#endif
 		Melder_setHelpProc (helpProc);
@@ -1380,25 +1445,28 @@ void praat_init (const char *title, unsigned int argc, char **argv) {
 	Melder_setPublishProc (publishProc);
 	theCurrentPraatApplication -> manPages = ManPages_create ();
 
-	trace ("creating the Picture window");
-	trace ("before picture window shows: locale is %s", setlocale (LC_ALL, NULL));
+	trace (U"creating the Picture window");
+	trace (U"before picture window shows: locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 	if (! praatP.dontUsePictureWindow) praat_picture_init ();
-	trace ("after picture window shows: locale is %s", setlocale (LC_ALL, NULL));
+	trace (U"after picture window shows: locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
+
+	if (unknownCommandLineOption) {
+		Melder_fatal (U"Unrecognized command line option ", unknownCommandLineOption);
+	}
 }
 
-static void executeStartUpFile (MelderDir startUpDirectory, const wchar_t *fileNameTemplate) {
-	wchar_t name [256];
-	swprintf (name, 256, fileNameTemplate, Melder_peekUtf8ToWcs (programName));
-	if (! MelderDir_isNull (startUpDirectory)) {   // Should not occur on modern systems.
+static void executeStartUpFile (MelderDir startUpDirectory, const char32 *fileNameHead, const char32 *fileNameTail) {
+	char32 name [256];
+	Melder_sprint (name,256, fileNameHead, programName, fileNameTail);
+	if (! MelderDir_isNull (startUpDirectory)) {   // should not occur on modern systems
 		structMelderFile startUp = { 0 };
 		MelderDir_getFile (startUpDirectory, name, & startUp);
 		if (! MelderFile_readable (& startUp))
-			return; // it's OK if the file doesn't exist
+			return;   // it's OK if the file doesn't exist
 		try {
-			praat_executeScriptFromFile (& startUp, NULL);
+			praat_executeScriptFromFile (& startUp, nullptr);
 		} catch (MelderError) {
-			Melder_error_ (praatP.title, ": start-up file ", & startUp, " not completed.");
-			Melder_flushError (NULL);
+			Melder_flushError (praatP.title, U": start-up file ", & startUp, U" not completed.");
 		}
 	}
 }
@@ -1407,115 +1475,116 @@ static void executeStartUpFile (MelderDir startUpDirectory, const wchar_t *fileN
 	#include <gdk/gdkkeysyms.h>
 	#if ALLOW_GDK_DRAWING
 		static gint theKeySnooper (GtkWidget *widget, GdkEventKey *event, gpointer data) {
-			trace ("keyval %ld, type %ld", (long) event -> keyval, (long) event -> type);
+			trace (U"keyval ", event -> keyval, U", type ", event -> type);
 			if ((event -> keyval == GDK_Tab || event -> keyval == GDK_ISO_Left_Tab) && event -> type == GDK_KEY_PRESS) {
-				trace ("tab key pressed in window %p", widget);
-				if (event -> state == 0) {
+				trace (U"tab key pressed in window ", Melder_pointer (widget));
+				if ((event -> state & GDK_MODIFIER_MASK) == 0) {
 					if (GTK_IS_WINDOW (widget)) {
 						GtkWidget *shell = gtk_widget_get_toplevel (GTK_WIDGET (widget));
-						trace ("tab pressed in GTK window %p", shell);
+						trace (U"tab pressed in GTK window ", Melder_pointer (shell));
 						void (*tabCallback) (GuiObject, gpointer) = (void (*) (GuiObject, gpointer)) g_object_get_data (G_OBJECT (widget), "tabCallback");
 						if (tabCallback) {
-							trace ("a tab callback exists");
+							trace (U"a tab callback exists");
 							void *tabClosure = g_object_get_data (G_OBJECT (widget), "tabClosure");
 							tabCallback (widget, tabClosure);
-							return TRUE;
+							return true;
 						}
 					}
-				} else if (event -> state == GDK_SHIFT_MASK) {   // BUG: 
+				} else if ((event -> state & GDK_MODIFIER_MASK) == GDK_SHIFT_MASK) {
 					if (GTK_IS_WINDOW (widget)) {
 						GtkWidget *shell = gtk_widget_get_toplevel (GTK_WIDGET (widget));
-						trace ("shift-tab pressed in GTK window %p", shell);
+						trace (U"shift-tab pressed in GTK window ", Melder_pointer (shell));
 						void (*tabCallback) (GuiObject, gpointer) = (void (*) (GuiObject, gpointer)) g_object_get_data (G_OBJECT (widget), "shiftTabCallback");
 						if (tabCallback) {
-							trace ("a shift tab callback exists");
+							trace (U"a shift tab callback exists");
 							void *tabClosure = g_object_get_data (G_OBJECT (widget), "shiftTabClosure");
 							tabCallback (widget, tabClosure);
-							return TRUE;
+							return true;
 						}
 					}
 				}
 			}
-			trace ("end");
-			return FALSE;   // pass event on
+			trace (U"end");
+			return false;   // pass event on
 		}
 	#endif
 #endif
 
-void praat_run (void) {
-	trace ("adding menus, second round");
+void praat_run () {
+	trace (U"adding menus, second round");
 	praat_addMenus2 ();
-	trace ("locale is %s", setlocale (LC_ALL, NULL));
+	trace (U"locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 
-	trace ("adding the Quit command");
+	trace (U"adding the Quit command");
 	#if defined (macintosh) && useCarbon
-		praat_addMenuCommand (L"Objects", L"Praat", L"Quit", 0, praat_HIDDEN, DO_Quit);   // the Quit command is needed for scripts, not for the GUI
+		praat_addMenuCommand (U"Objects", U"Praat", U"Quit", nullptr, praat_HIDDEN, DO_Quit);   // the Quit command is needed for scripts, not for the GUI
 	#else
-		praat_addMenuCommand (L"Objects", L"Praat", L"-- quit --", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"Praat", L"Quit", 0, praat_UNHIDABLE + 'Q', DO_Quit);
+		praat_addMenuCommand (U"Objects", U"Praat", U"-- quit --", nullptr, 0, nullptr);
+		praat_addMenuCommand (U"Objects", U"Praat", U"Quit", nullptr, praat_UNHIDABLE + 'Q', DO_Quit);
 	#endif
 
-	trace ("read the preferences file, and notify those who want to be notified of this");
+	trace (U"read the preferences file, and notify those who want to be notified of this");
 	/* ...namely, those who already have a window (namely, the Picture window),
 	 * and those that regard the start of a new session as a meaningful event
 	 * (namely, the session counter and the cross-session memory counter).
 	 */
-	Preferences_read (& prefsFile);
-	if (! praatP.dontUsePictureWindow) praat_picture_prefsChanged ();
-	praat_statistics_prefsChanged ();
-			//Melder_error3 (L"batch name <<", theCurrentPraatApplication -> batchName.string, L">>");
-			//Melder_flushError (NULL);
+	if (! praatP.ignorePreferenceFiles) {
+		Preferences_read (& prefsFile);
+		if (! praatP.dontUsePictureWindow) praat_picture_prefsChanged ();
+		praat_statistics_prefsChanged ();
+	}
 
 	praatP.phase = praat_STARTING_UP;
 
-	trace ("execute start-up file(s)");
+	trace (U"execute start-up file(s)");
 	/*
 	 * On Unix and the Mac, we try no less than three start-up file names.
 	 */
 	#if defined (UNIX) || defined (macintosh)
 		structMelderDir usrLocal = { { 0 } };
-		Melder_pathToDir (L"/usr/local", & usrLocal);
-		executeStartUpFile (& usrLocal, L"%ls-startUp");
+		Melder_pathToDir (U"/usr/local", & usrLocal);
+		executeStartUpFile (& usrLocal, U"", U"-startUp");
 	#endif
 	#if defined (UNIX) || defined (macintosh)
-		executeStartUpFile (& homeDir, L".%ls-user-startUp");   // not on Windows (empty file name error)
+		executeStartUpFile (& homeDir, U".", U"-user-startUp");   // not on Windows (empty file name error)
 	#endif
 	#if defined (UNIX) || defined (macintosh) || defined (_WIN32)
-		executeStartUpFile (& homeDir, L"%ls-user-startUp");
+		executeStartUpFile (& homeDir, U"", U"-user-startUp");
 	#endif
 
-	trace ("install plug-ins");
-	trace ("locale is %s", setlocale (LC_ALL, NULL));
-	/* The Praat phase should remain praat_STARTING_UP,
-	 * because any added commands must not be included in the buttons file.
-	 */
-	structMelderFile searchPattern = { 0 };
-	MelderDir_getFile (& praatDir, L"plugin_*", & searchPattern);
-	try {
-		autoStrings directoryNames = Strings_createAsDirectoryList (Melder_fileToPath (& searchPattern));
-		if (directoryNames -> numberOfStrings > 0) {
-			for (long i = 1; i <= directoryNames -> numberOfStrings; i ++) {
-				structMelderDir pluginDir = { { 0 } };
-				structMelderFile plugin = { 0 };
-				MelderDir_getSubdir (& praatDir, directoryNames -> strings [i], & pluginDir);
-				MelderDir_getFile (& pluginDir, L"setup.praat", & plugin);
-				if (MelderFile_readable (& plugin)) {
-					Melder_backgrounding = true;
-					try {
-						praat_executeScriptFromFile (& plugin, NULL);
-					} catch (MelderError) {
-						Melder_error_ (praatP.title, ": plugin ", & plugin, " contains an error.");
-						Melder_flushError (NULL);
+	if (! MelderDir_isNull (& praatDir) && ! praatP.ignorePlugins) {
+		trace (U"install plug-ins");
+		trace (U"locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
+		/* The Praat phase should remain praat_STARTING_UP,
+		 * because any added commands must not be included in the buttons file.
+		 */
+		structMelderFile searchPattern { 0 };
+		MelderDir_getFile (& praatDir, U"plugin_*", & searchPattern);
+		try {
+			autoStrings directoryNames = Strings_createAsDirectoryList (Melder_fileToPath (& searchPattern));
+			if (directoryNames -> numberOfStrings > 0) {
+				for (long i = 1; i <= directoryNames -> numberOfStrings; i ++) {
+					structMelderDir pluginDir = { { 0 } };
+					structMelderFile plugin = { 0 };
+					MelderDir_getSubdir (& praatDir, directoryNames -> strings [i], & pluginDir);
+					MelderDir_getFile (& pluginDir, U"setup.praat", & plugin);
+					if (MelderFile_readable (& plugin)) {
+						Melder_backgrounding = true;
+						try {
+							praat_executeScriptFromFile (& plugin, nullptr);
+						} catch (MelderError) {
+							Melder_flushError (praatP.title, U": plugin ", & plugin, U" contains an error.");
+						}
+						Melder_backgrounding = false;
 					}
-					Melder_backgrounding = false;
 				}
 			}
+		} catch (MelderError) {
+			Melder_clearError ();   // in case Strings_createAsDirectoryList () threw an error
 		}
-	} catch (MelderError) {
-		Melder_clearError ();   // in case Strings_createAsDirectoryList () threw an error
 	}
 
-	Melder_assert (wcsequ (Melder_double (1.5), L"1.5"));   // check locale settings; because of the required file portability Praat cannot stand "1,5"
+	Melder_assert (str32equ (Melder_double (1.5), U"1.5"));   // check locale settings; because of the required file portability Praat cannot stand "1,5"
 	{ int dummy = 200;
 		Melder_assert ((int) (signed char) dummy == -56);   // bingeti1 relies on this
 		Melder_assert ((int) (unsigned char) dummy == 200);
@@ -1523,160 +1592,132 @@ void praat_run (void) {
 		Melder_assert ((double) (signed char) dummy == -56.0);
 		Melder_assert ((double) (unsigned char) dummy == 200.0);
 	}
-	{ uint16_t dummy = 40000;
+	{ uint16 dummy = 40000;
 		Melder_assert ((int) (int16_t) dummy == -25536);   // bingeti2 relies on this
 		Melder_assert ((short) (int16_t) dummy == -25536);   // bingete2 relies on this
 		Melder_assert ((double) dummy == 40000.0);
 		Melder_assert ((double) (int16_t) dummy == -25536.0);
 	}
 	{
-		int64_t dummy = 1000000000000;
-		if (! wcsequ (Melder_integer (dummy), L"1000000000000"))
-			Melder_fatal ("The number 1000000000000 is mistaken written on this machine as %ls", Melder_integer (dummy));
+		int64 dummy = 1000000000000;
+		if (! str32equ (Melder_integer (dummy), U"1000000000000"))
+			Melder_fatal (U"The number 1000000000000 is mistaken written on this machine as ", dummy, U".");
 	}
 	{ uint32_t dummy = 0xffffffff;
-		Melder_assert ((int64_t) dummy == 4294967295LL);
-		Melder_assert (wcsequ (Melder_integer (dummy), L"4294967295"));
+		Melder_assert ((int64) dummy == 4294967295LL);
+		Melder_assert (str32equ (Melder_integer (dummy), U"4294967295"));
 		Melder_assert (double (dummy) == 4294967295.0);
 	}
 	{ double dummy = 3000000000.0;
-		Melder_assert ((uint32_t) dummy == 3000000000);
+		Melder_assert ((uint32) dummy == 3000000000);
+	}
+	{
+		Melder_assert (str32len (U"hello") == 5);
+		Melder_assert (str32ncmp (U"hellogoodbye", U"hellogee", 6) == 0);
+		Melder_assert (str32ncmp (U"hellogoodbye", U"hellogee", 7) > 0);
+		Melder_assert (str32str (U"hellogoodbye", U"ogo"));
+		Melder_assert (! str32str (U"hellogoodbye", U"oygo"));
 	}
 
 	if (sizeof (off_t) < 8)
-		Melder_fatal ("sizeof(off_t) is less than 8. Compile Praat with -D_FILE_OFFSET_BITS=64.");
+		Melder_fatal (U"sizeof(off_t) is less than 8. Compile Praat with -D_FILE_OFFSET_BITS=64.");
 
 	if (Melder_batch) {
-		if (thePraatStandAloneScriptText != NULL) {
+		if (thePraatStandAloneScriptText) {
 			try {
 				praat_executeScriptFromText (thePraatStandAloneScriptText);
 				praat_exit (0);
 			} catch (MelderError) {
-				Melder_flushError ("%s: stand-alone script session interrupted.", praatP.title);
+				Melder_flushError (praatP.title, U": stand-alone script session interrupted.");
 				praat_exit (-1);
 			}
-		} else if (doingCommandLineInterface) {
+		} else if (praatP.hasCommandLineInput) {
 			try {
 				praat_executeCommandFromStandardInput (praatP.title);
 				praat_exit (0);
 			} catch (MelderError) {
-				Melder_flushError ("%s: command line session interrupted.", praatP.title);
+				Melder_flushError (praatP.title, U": command line session interrupted.");
 				praat_exit (-1);
 			}
 		} else {
 			try {
+				//Melder_casual (U"Script <<", theCurrentPraatApplication -> batchName.string, U">>");
 				praat_executeScriptFromFileNameWithArguments (theCurrentPraatApplication -> batchName.string);
 				praat_exit (0);
 			} catch (MelderError) {
-				/*
-				 * Try to get the error message out; this is a bit complicated...
-				 */
-				structMelderFile batchFile = { 0 };
-				try {
-					Melder_relativePathToFile (theCurrentPraatApplication -> batchName.string, & batchFile);
-				} catch (MelderError) {
-					praat_exit (-1);
-				}
-				#if defined (_WIN32) && ! defined (CONSOLE_APPLICATION)
-					MelderGui_create (NULL);
-				#endif
-				Melder_error_ (praatP.title, ": command file ", & batchFile, " not completed.");
-				Melder_flushError (NULL);
+				Melder_flushError (praatP.title, U": script command <<",
+					theCurrentPraatApplication -> batchName.string, U">> not completed.");
 				praat_exit (-1);
 			}
 		}
 	} else /* GUI */ {
-		trace ("reading the added script buttons");
-		/* Each line separately: every error should be ignored.
-		 */
-		praatP.phase = praat_READING_BUTTONS;
-		{// scope
-			autostring buttons;
-			try {
-				buttons.reset (MelderFile_readText (& buttonsFile));
-			} catch (MelderError) {
-				Melder_clearError ();
-			}
-			if (buttons.peek()) {
-				wchar_t *line = buttons.peek();
-				for (;;) {
-					wchar_t *newline = wcschr (line, '\n');
-					if (newline) *newline = '\0';
-					try {
-						praat_executeCommand (NULL, line);
-					} catch (MelderError) {
-						Melder_clearError ();   // ignore this line, but not necessarily the next
+		if (! praatP.ignorePreferenceFiles) {
+			trace (U"reading the added script buttons");
+			/* Each line separately: every error should be ignored.
+			 */
+			praatP.phase = praat_READING_BUTTONS;
+			{// scope
+				autostring32 buttons;
+				try {
+					buttons.reset (MelderFile_readText (& buttonsFile));
+				} catch (MelderError) {
+					Melder_clearError ();
+				}
+				if (buttons.peek()) {
+					char32 *line = buttons.peek();
+					for (;;) {
+						char32 *newline = str32chr (line, U'\n');
+						if (newline) *newline = U'\0';
+						try {
+							praat_executeCommand (nullptr, line);
+						} catch (MelderError) {
+							Melder_clearError ();   // ignore this line, but not necessarily the next
+						}
+						if (! newline) break;
+						line = newline + 1;
 					}
-					if (newline == NULL) break;
-					line = newline + 1;
 				}
 			}
 		}
 
-		trace ("sorting the commands");
-		trace ("locale is %s", setlocale (LC_ALL, NULL));
+		trace (U"sorting the commands");
+		trace (U"locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 		praat_sortMenuCommands ();
 		praat_sortActions ();
 
+		if (praatP.userWantsToOpen) {
+			for (; praatP.argumentNumber < praatP.argc; praatP.argumentNumber ++) {
+				//Melder_casual (U"File to open <<", Melder_peek8to32 (theArgv [iarg]), U">>");
+				autostring32 text = Melder_dup (Melder_cat (U"Read from file... ",
+															Melder_peek8to32 (praatP.argv [praatP.argumentNumber])));
+				try {
+					praat_executeScriptFromText (text.peek());
+				} catch (MelderError) {
+					Melder_flushError ();
+				}
+			}
+		}
+
 		praatP.phase = praat_HANDLING_EVENTS;
 
 		#if gtk
 			//gtk_widget_add_events (G_OBJECT (theCurrentPraatApplication -> topShell), GDK_ALL_EVENTS_MASK);
-			trace ("install GTK key snooper");
-			trace ("locale is %s", setlocale (LC_ALL, NULL));
+			trace (U"install GTK key snooper");
+			trace (U"locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 			#if ALLOW_GDK_DRAWING
-				g_signal_connect (G_OBJECT (theCurrentPraatApplication -> topShell -> d_gtkWindow), "client-event", G_CALLBACK (cb_userMessage), NULL);
+				g_signal_connect (G_OBJECT (theCurrentPraatApplication -> topShell -> d_gtkWindow), "client-event",
+					G_CALLBACK (cb_userMessage), nullptr);
 			#endif
 			signal (SIGUSR1, cb_sigusr1);
 			#if ALLOW_GDK_DRAWING
 				gtk_key_snooper_install (theKeySnooper, 0);
 			#endif
-			trace ("start the GTK event loop");
-			trace ("locale is %s", setlocale (LC_ALL, NULL));
+			trace (U"start the GTK event loop");
+			trace (U"locale is ", Melder_peek8to32 (setlocale (LC_ALL, nullptr)));
 			gtk_main ();
 		#elif cocoa
 			[NSApp run];
 		#elif motif
-			#if defined (_WIN32)
-				if (theCurrentPraatApplication -> batchName.string [0] != '\0') {
-					wchar_t text [500];
-					/*
-					 * The user dropped one or more files on the Praat icon, while Praat was not running yet.
-					 * Windows may have enclosed each path between quotes;
-					 * this is especially likely to happen for paths that contain spaces (which is usual).
-					 */
-
-					wchar_t *s = theCurrentPraatApplication -> batchName.string;
-					for (;;) {
-						bool endSeen = false;
-						while (*s == ' ' || *s == '\n') s ++;
-						if (*s == '\0') break;
-						wchar_t *path = s;
-						if (*s == '\"') {
-							path = ++ s;
-							while (*s != '\"' && *s != '\0') s ++;
-							if (*s == '\0') break;
-							Melder_assert (*s == '\"');
-							*s = '\0';
-						} else {
-							while (*s != ' ' && *s != '\n' && *s != '\0') s ++;
-							if (*s == ' ' || *s == '\n') {
-								*s = '\0';
-							} else {
-								endSeen = true;
-							}
-						}
-						swprintf (text, 500, L"Read from file... %ls", path);
-						try {
-							praat_executeScriptFromText (text);
-						} catch (MelderError) {
-							Melder_flushError (NULL);
-						}
-						if (endSeen) break;
-						s ++;
-					}
-				}
-			#endif
 			for (;;) {
 				XEvent event;
 				GuiNextEvent (& event);
diff --git a/sys/praat.h b/sys/praat.h
index 3472193..dfe634b 100644
--- a/sys/praat.h
+++ b/sys/praat.h
@@ -1,6 +1,6 @@
 /* praat.h
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@
 // File main_Sybil.cpp: //
 int main (unsigned int argc, char **argv)
 {
-	praat_init ("Praat_Sybil", argc, argv);   // Obligatory.
+	praat_init (U"Praat_Sybil", argc, argv);   // Obligatory.
 	INCLUDE_LIBRARY (praat_Fon_init)   // Optional: inherit phonetic stuff.
 	INCLUDE_LIBRARY (praat_Sybil_init)   // Optional: add Sybil's things.
 	INCLUDE_MANPAGES (manual_Sybil)
@@ -56,31 +56,26 @@ To make any class string-readable, use Thing_recognizeClassesByName ().
 String-readable classes are known by Thing_newFromClassName () and can therefore
 be read by Data_readFromTextFile () and Data_readFromBinaryFile ().
 */
-void praat_init (const char *title, unsigned int argc, char **argv);
-void praat_run (void);
-void praat_setStandAloneScriptText (wchar_t *text);   // call before praat_init if you want to create a stand-alone application without Objects and Picture window
+void praat_init (const char32 *title, unsigned int argc, char **argv);
+void praat_run ();
+void praat_setStandAloneScriptText (const char32 *text);   // call before praat_init if you want to create a stand-alone application without Objects and Picture window
 
 void praat_addAction (ClassInfo class1, int n1, ClassInfo class2, int n2, ClassInfo class3, int n3,
-	const wchar_t *title, const wchar_t *after, unsigned long flags,
-	void (*callback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure));
+	const char32 *title, const char32 *after, unsigned long flags, UiCallback callback);
 /* 'class2', 'class3', 'title', 'after', and 'callback' may be NULL; 'title' is reference-copied. */
 void praat_addAction1 (ClassInfo class1, int n1,
-	const wchar_t *title, const wchar_t *after, unsigned long flags,
-	void (*callback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure));
+	const char32 *title, const char32 *after, unsigned long flags, UiCallback callback);
 void praat_addAction2 (ClassInfo class1, int n1, ClassInfo class2, int n2,
-	const wchar_t *title, const wchar_t *after, unsigned long flags,
-	void (*callback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure));
+	const char32 *title, const char32 *after, unsigned long flags, UiCallback callback);
 void praat_addAction3 (ClassInfo class1, int n1, ClassInfo class2, int n2, ClassInfo class3, int n3,
-	const wchar_t *title, const wchar_t *after, unsigned long flags,
-	void (*callback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure));
+	const char32 *title, const char32 *after, unsigned long flags, UiCallback callback);
 void praat_addAction4 (ClassInfo class1, int n1, ClassInfo class2, int n2, ClassInfo class3, int n3, ClassInfo class4, int n4,
-	const wchar_t *title, const wchar_t *after, unsigned long flags,
-	void (*callback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure));
+	const char32 *title, const char32 *after, unsigned long flags, UiCallback callback);
 /*
 	'title' is the name that will appear in the dynamic menu,
 		and also the command that is used in command files.
 	'callback' refers to a function prototyped like this:
-		static int DO_Class_action (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, void *closure);
+		static int DO_Class_action (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, void *closure);
 		this function should throw an exception if the command failed,
 		and return 1 if the command was executed successfully;
 		this function will be called by 'praat' when the user clicks a menu command,
@@ -117,25 +112,25 @@ void praat_addAction4 (ClassInfo class1, int n1, ClassInfo class2, int n2, Class
 #define praat_DEPTH_6  0x00060000
 #define praat_DEPTH_7  0x00070000
 #define praat_CTRL  0x00200000
-void praat_removeAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const wchar_t *title);
+void praat_removeAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const char32 *title);
 	/* 'class2' and 'class3' may be NULL. */
 	/* 'title' may be NULL; reference-copied. */
 
-GuiMenuItem praat_addMenuCommand (const wchar_t *window, const wchar_t *menu, const wchar_t *title,
-	const wchar_t *after, unsigned long flags, void (*callback) (UiForm, int narg, Stackel args, const wchar_t *, Interpreter, const wchar_t *, bool, void *));
+GuiMenuItem praat_addMenuCommand (const char32 *window, const char32 *menu, const char32 *title /* cattable */,
+	const char32 *after, unsigned long flags, UiCallback callback);
 /* All strings are reference-copied; 'title', 'after', and 'callback' may be NULL. */
 
 #define praat_MAXNUM_EDITORS 5
 #include "Ui.h"
 typedef struct {
 	ClassInfo klas;   // the class
-	Data object;   // the instance
-	wchar_t *name;   // the name of the object as it appears in the List
+	Daata object;   // the instance
+	char32 *name;   // the name of the object as it appears in the List
+	structMelderFile file;   // is this Object associated with a file?
 	long id;   // the unique number of the object
-	int selected;   // is the name of the object inverted in the list?
+	bool isSelected;   // is the name of the object inverted in the list?
 	Editor editors [praat_MAXNUM_EDITORS];   // are there editors open with this Object in it?
-	structMelderFile file;   // is this (very large) Object (partially) in a file?
-	int _beingCreated;
+	bool isBeingCreated;
 } structPraat_Object, *praat_Object;
 
 #define praat_MAXNUM_OBJECTS 10000   /* Maximum number of objects in the list. */
@@ -167,28 +162,25 @@ extern structPraatPicture theForegroundPraatPicture;
 extern PraatPicture theCurrentPraatPicture;
 	/* The global objects containing the state of the application; only reachable from interface files. */
 
-Data praat_onlyObject (ClassInfo klas);
-	/* Returns a selected Data of class 'klas'. */
-Data praat_onlyObject_generic (ClassInfo klas);
-	/* Returns a selected Data of class 'klas' or a subclass. */
-praat_Object praat_onlyScreenObject (void);
-wchar_t *praat_name (int iobject);
-void praat_write_do (Any dia, const wchar_t *extension);
-void praat_new (Data me, const wchar_t *s1);
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2);
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3);
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4);
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5);
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6);
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7);
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8);
-void praat_new (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, const wchar_t *s6, const wchar_t *s7, const wchar_t *s8, const wchar_t *s9);
-void praat_newWithFile (Data me, const wchar_t *s1, MelderFile file);
-void praat_newWithFile (Data me, const wchar_t *s1, const wchar_t *s2, MelderFile file);
-void praat_newWithFile (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, MelderFile file);
-void praat_newWithFile (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, MelderFile file);
-void praat_newWithFile (Data me, const wchar_t *s1, const wchar_t *s2, const wchar_t *s3, const wchar_t *s4, const wchar_t *s5, MelderFile file);
-void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
+Daata praat_onlyObject (ClassInfo klas);
+	/* Returns a selected Daata of class 'klas'. */
+Daata praat_onlyObject_generic (ClassInfo klas);
+	/* Returns a selected Daata of class 'klas' or a subclass. */
+praat_Object praat_onlyScreenObject ();
+char32 *praat_name (int iobject);
+void praat_write_do (UiForm dia, const char32 *extension);
+void praat_new (Daata me);
+void praat_new (Daata me, Melder_1_ARG);
+void praat_new (Daata me, Melder_2_ARGS);
+void praat_new (Daata me, Melder_3_ARGS);
+void praat_new (Daata me, Melder_4_ARGS);
+void praat_new (Daata me, Melder_5_ARGS);
+void praat_new (Daata me, Melder_6_ARGS);
+void praat_new (Daata me, Melder_7_ARGS);
+void praat_new (Daata me, Melder_8_ARGS);
+void praat_new (Daata me, Melder_9_ARGS);
+void praat_newWithFile (autoDaata me, MelderFile file, const char32 *name);
+void praat_name2 (char32 *name, ClassInfo klas1, ClassInfo klas2);
 
 /* Macros for description of forms (dialog boxes).
 	FORM prompts the user for arguments to DO_proc.
@@ -249,7 +241,7 @@ void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
 #ifndef _EditorM_h_
 
 #define FORM(proc,name,helpTitle) \
-	static void DO_##proc (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *buttonClosure) { \
+	static void DO_##proc (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *buttonClosure) { \
 		static UiForm dia; \
 		if (dia == NULL) { \
 			Any radio = 0; \
@@ -294,7 +286,7 @@ void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
 #define DO \
 			UiForm_do (dia, modified); \
 		} else if (sendingForm == NULL) { \
-			trace ("args %p", args); \
+			trace (U"args ", Melder_pointer (args)); \
 			if (args) { \
 				UiForm_call (dia, narg, args, interpreter); \
 			} else { \
@@ -309,7 +301,7 @@ void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
 #define DO_ALTERNATIVE(alternative) \
 			UiForm_do (dia, modified); \
 		} else if (sendingForm == NULL) { \
-			trace ("alternative args %p", args); \
+			trace (U"alternative args ", Melder_pointer (args)); \
 			try { \
 				if (args) { \
 					UiForm_call (dia, narg, args, interpreter); \
@@ -317,13 +309,13 @@ void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
 					UiForm_parseString (dia, sendingString, interpreter); \
 				} \
 			} catch (MelderError) { \
-				wchar_t *parkedError = Melder_wcsdup_f (Melder_getError ()); \
+				char32 *parkedError = Melder_dup_f (Melder_getError ()); \
 				Melder_clearError (); \
 				try { \
 					DO_##alternative (NULL, narg, args, sendingString, interpreter, invokingButtonTitle, modified, buttonClosure); \
 				} catch (MelderError) { \
 					Melder_clearError (); \
-					Melder_error_ (parkedError); \
+					Melder_appendError (parkedError); \
 					Melder_free (parkedError); \
 					throw; \
 				} \
@@ -354,7 +346,7 @@ void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
 		}
 
 #define DIRECT(proc) \
-	static void DO_##proc (UiForm dummy1, int narg, Stackel args, const wchar_t *dummy2, Interpreter dummy3, const wchar_t *dummy4, bool dummy5, void *dummy6) { \
+	static void DO_##proc (UiForm dummy1, int narg, Stackel args, const char32 *dummy2, Interpreter dummy3, const char32 *dummy4, bool dummy5, void *dummy6) { \
 		(void) dummy1; (void) narg; (void) args; (void) dummy2; (void) dummy3; (void) dummy4; (void) dummy5; (void) dummy6; \
 		{ \
 			try { \
@@ -363,45 +355,16 @@ void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
 				{
 
 #define DIRECT2(proc) \
-	static void DO_##proc (UiForm dummy1, int narg, Stackel args, const wchar_t *dummy2, Interpreter dummy3, const wchar_t *dummy4, bool dummy5, void *dummy6) { \
+	static void DO_##proc (UiForm dummy1, int narg, Stackel args, const char32 *dummy2, Interpreter dummy3, const char32 *dummy4, bool dummy5, void *dummy6) { \
 		(void) dummy1; (void) narg; (void) args; (void) dummy2; (void) dummy3; (void) dummy4; (void) dummy5; (void) dummy6; \
 		{ \
 			try { \
 				int IOBJECT = 0; \
 				(void) IOBJECT;
 
-#define FORM_READ(proc,title,help,allowMult) \
-	static void DO_##proc (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *okClosure) { \
-		static UiForm dia; \
-		(void) narg; \
-		(void) interpreter; \
-		(void) modified; \
-		(void) okClosure; \
-		if (dia == NULL) \
-			dia = UiInfile_create (theCurrentPraatApplication -> topShell, title, DO_##proc, okClosure, invokingButtonTitle, help, allowMult); \
-		if (sendingForm == NULL && args == NULL && sendingString == NULL) { \
-			UiInfile_do (dia); \
-		} else { \
-			try { \
-				MelderFile file; \
-				int IOBJECT = 0; \
-				structMelderFile file2 = { 0 }; \
-				(void) IOBJECT; \
-				if (args == NULL && sendingString == NULL) { \
-					file = UiFile_getFile (dia); \
-				} else { \
-					Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); \
-					file = & file2; \
-				} \
-				{
-
 #define FORM_READ2(proc,title,help,allowMult) \
-	static void DO_##proc (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *okClosure) { \
+	static void DO_##proc (UiForm sendingForm, int, Stackel args, const char32 *sendingString, Interpreter, const char32 *invokingButtonTitle, bool, void *okClosure) { \
 		static UiForm dia; \
-		(void) narg; \
-		(void) interpreter; \
-		(void) modified; \
-		(void) okClosure; \
 		if (dia == NULL) \
 			dia = UiInfile_create (theCurrentPraatApplication -> topShell, title, DO_##proc, okClosure, invokingButtonTitle, help, allowMult); \
 		if (sendingForm == NULL && args == NULL && sendingString == NULL) { \
@@ -417,15 +380,11 @@ void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
 				} else { \
 					Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); \
 					file = & file2; \
-				} \
+				}
 
 #define FORM_WRITE(proc,title,help,ext) \
-	static void DO_##proc (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *okClosure) { \
-		static Any dia; \
-		(void) narg; \
-		(void) interpreter; \
-		(void) modified; \
-		(void) okClosure; \
+	static void DO_##proc (UiForm sendingForm, int, Stackel args, const char32 *sendingString, Interpreter, const char32 *invokingButtonTitle, bool, void *okClosure) { \
+		static UiForm dia; \
 		if (dia == NULL) \
 			dia = UiOutfile_create (theCurrentPraatApplication -> topShell, title, DO_##proc, okClosure, invokingButtonTitle, help); \
 		if (sendingForm == NULL && args == NULL && sendingString == NULL) { \
@@ -445,12 +404,8 @@ void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
 				{
 
 #define FORM_WRITE2(proc,title,help,ext) \
-	static void DO_##proc (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *okClosure) { \
-		static Any dia; \
-		(void) narg; \
-		(void) interpreter; \
-		(void) modified; \
-		(void) okClosure; \
+	static void DO_##proc (UiForm sendingForm, int, Stackel args, const char32 *sendingString, Interpreter, const char32 *invokingButtonTitle, bool, void *okClosure) { \
+		static UiForm dia; \
 		if (dia == NULL) \
 			dia = UiOutfile_create (theCurrentPraatApplication -> topShell, title, DO_##proc, okClosure, invokingButtonTitle, help); \
 		if (sendingForm == NULL && args == NULL && sendingString == NULL) { \
@@ -490,13 +445,13 @@ void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
 
 #define WHERE(condition)  for (IOBJECT = 1; IOBJECT <= theCurrentPraatObjects -> n; IOBJECT ++) if (condition)
 #define WHERE_DOWN(condition)  for (IOBJECT = theCurrentPraatObjects -> n; IOBJECT > 0; IOBJECT --) if (condition)
-#define SELECTED  (theCurrentPraatObjects -> list [IOBJECT]. selected)
+#define SELECTED  (theCurrentPraatObjects -> list [IOBJECT]. isSelected)
 #define CLASS  (theCurrentPraatObjects -> list [IOBJECT]. klas)
 #define OBJECT  (theCurrentPraatObjects -> list [IOBJECT]. object)
 #define GRAPHICS  theCurrentPraatPicture -> graphics
 #define FULL_NAME  (theCurrentPraatObjects -> list [IOBJECT]. name)
 #define ID  (theCurrentPraatObjects -> list [IOBJECT]. id)
-#define ID_AND_FULL_NAME  Melder_wcscat (Melder_integer (ID), L". ", FULL_NAME)
+#define ID_AND_FULL_NAME  Melder_cat (ID, U". ", FULL_NAME)
 #define NAME  praat_name (IOBJECT)
 #define EVERY(proc)  WHERE (SELECTED) proc;
 #define EVERY_CHECK(proc)  EVERY (if (! proc) return 0)
@@ -504,9 +459,9 @@ void praat_name2 (wchar_t *name, ClassInfo klas1, ClassInfo klas2);
 #define ONLY(klas)  praat_onlyObject (klas)
 #define ONLY_GENERIC(klas)  praat_onlyObject_generic (klas)
 #define ONLY_OBJECT  (praat_onlyScreenObject () -> object)
-Data praat_firstObject (ClassInfo klas);
-Data praat_firstObject_generic (ClassInfo klas);
-Data praat_firstObject_any ();
+Daata praat_firstObject (ClassInfo klas);
+Daata praat_firstObject_generic (ClassInfo klas);
+Daata praat_firstObject_any ();
 #define FIRST(Klas)  (Klas) praat_firstObject (class##Klas)
 #define FIRST_GENERIC(Klas)  (Klas) praat_firstObject_generic (class##Klas)
 #define FIRST_ANY(Klas)  (Klas) praat_firstObject_any ()
@@ -514,7 +469,7 @@ Data praat_firstObject_any ();
 #define EVERY_DRAW(proc) \
 	praat_picture_open (); WHERE (SELECTED) proc; praat_picture_close (); return 1;
 
-/* Used by praat_Sybil.c, if you put an Editor on the screen: */
+/* Used by praat_Sybil.cpp, if you put an Editor on the screen: */
 int praat_installEditor (Editor editor, int iobject);
 /* This routine adds a reference to a new editor (unless it is NULL) to the screen object
    which is in the list at position 'iobject'.
@@ -526,7 +481,7 @@ int praat_installEditor (Editor editor, int iobject);
       Return value: normally 1, but 0 if 'editor' is NULL.
    A typical calling sequence is:
 	DIRECT (Spectrogram_edit)
-		if (praat.batch) Melder_throw ("Cannot edit a Spectrogram from batch.");
+		if (praat.batch) Melder_throw (U"Cannot edit a Spectrogram from batch.");
 		else WHERE (SELECTED)
 			praat_installEditor
 				(SpectrogramEditor_create (praat.topShell, ID_AND_FULL_NAME, OBJECT), IOBJECT);
@@ -550,7 +505,7 @@ void praat_picture_close ();
 /* For main.cpp */
 
 #define INCLUDE_LIBRARY(praat_xxx_init) \
-   { extern void praat_xxx_init (void); praat_xxx_init (); }
+   { extern void praat_xxx_init (); praat_xxx_init (); }
 #define INCLUDE_MANPAGES(manual_xxx_init) \
    { extern void manual_xxx_init (ManPages me); manual_xxx_init (theCurrentPraatApplication -> manPages); }
 
@@ -566,12 +521,12 @@ void praat_setLogo (double width_mm, double height_mm, void (*draw) (Graphics g)
 /* To remove the selected objects of class Klas from the list: */
 /*
 	for (i = praat.n; i >= 1; i --)   // Down!
-		if (praat.list[i].selected && Thing_member (praat.list[i].object, classKlas)
+		if (praat.list[i].selected && Thing_isa (praat.list[i].object, classKlas)
 			praat_removeObject (i);
 	praat_show ();   // Needed because the selection has changed.
 */
-void praat_removeObject (int i);   /* i = 1..praat.n */
-void praat_show (void);   // forces an update of the dynamic menu
+void praat_removeObject (int i);   // i = 1..praat.n
+void praat_show ();   // forces an update of the dynamic menu
 void praat_updateSelection ();
 	/* If you require the correct selection immediately after calling praat_new. */
 
@@ -590,4 +545,8 @@ struct autoPraatPicture {
 	~autoPraatPicture () { praat_picture_close (); }
 };
 
+#if defined (_WIN32)
+	#define main wingwmain
+#endif
+
 /* End of file praat.h */
diff --git a/sys/praatP.h b/sys/praatP.h
index fb453d7..778d1ea 100644
--- a/sys/praatP.h
+++ b/sys/praatP.h
@@ -1,6 +1,6 @@
 /* praatP.h
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,23 +19,23 @@
 
 #include "praat.h"
 
-void praat_addActionScript (const wchar_t *className1, int n1, const wchar_t *className2, int n2, const wchar_t *className3, int n3,
-	const wchar_t *title, const wchar_t *after, int depth, const wchar_t *script);
+void praat_addActionScript (const char32 *className1, int n1, const char32 *className2, int n2, const char32 *className3, int n3,
+	const char32 *title, const char32 *after, int depth, const char32 *script);
 /* No strings may be NULL; unspecify them by giving an empty string. 'title' and 'script' are deep-copied. */
-void praat_removeAction_classNames (const wchar_t *className1, const wchar_t *className2,
-	const wchar_t *className3, const wchar_t *title);
+void praat_removeAction_classNames (const char32 *className1, const char32 *className2,
+	const char32 *className3, const char32 *title);
 /* No arguments may be NULL; unspecify them by giving an empty string. */
 /* 'title' is deep-copied. */
-void praat_hideAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const wchar_t *title);
-void praat_hideAction_classNames (const wchar_t *className1, const wchar_t *className2,
-	const wchar_t *className3, const wchar_t *title);
-void praat_showAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const wchar_t *title);
-void praat_showAction_classNames (const wchar_t *className1, const wchar_t *className2,
-	const wchar_t *className3, const wchar_t *title);
+void praat_hideAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const char32 *title);
+void praat_hideAction_classNames (const char32 *className1, const char32 *className2,
+	const char32 *className3, const char32 *title);
+void praat_showAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const char32 *title);
+void praat_showAction_classNames (const char32 *className1, const char32 *className2,
+	const char32 *className3, const char32 *title);
 void praat_sortActions ();
 
-void praat_addMenuCommandScript (const wchar_t *window, const wchar_t *menu, const wchar_t *title,
-	const wchar_t *after, int depth, const wchar_t *script);
+void praat_addMenuCommandScript (const char32 *window, const char32 *menu, const char32 *title,
+	const char32 *after, int depth, const char32 *script);
 /* All strings are deep-copied and may not be NULL; unspecify them by giving an empty string. */
 /*
 	For the Praat objects window:
@@ -43,11 +43,11 @@ void praat_addMenuCommandScript (const wchar_t *window, const wchar_t *menu, con
 	For the Praat picture window:
 	'window' is "Picture", 'menu' is "File", "Edit", "Margins", "World", "Select", "Pen", "Font", or "Help".
 */
-void praat_hideMenuCommand (const wchar_t *window, const wchar_t *menu, const wchar_t *title);
-void praat_showMenuCommand (const wchar_t *window, const wchar_t *menu, const wchar_t *title);
+void praat_hideMenuCommand (const char32 *window, const char32 *menu, const char32 *title);
+void praat_showMenuCommand (const char32 *window, const char32 *menu, const char32 *title);
 void praat_saveMenuCommands (MelderString *buffer);
-void praat_addFixedButtonCommand (GuiForm parent, const wchar_t *title, void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *), int x, int y);
-void praat_sensitivizeFixedButtonCommand (const wchar_t *title, int sensitive);
+void praat_addFixedButtonCommand (GuiForm parent, const char32 *title, UiCallback callback, int x, int y);
+void praat_sensitivizeFixedButtonCommand (const char32 *title, int sensitive);
 void praat_sortMenuCommands ();
 
 #define praat_MAXNUM_MENUS 20   /* Maximum number of added New, Open, Save, or Help menus. */
@@ -55,10 +55,10 @@ void praat_sortMenuCommands ();
 
 typedef struct structPraat_Command {
 	ClassInfo class1, class2, class3, class4;   // selected classes
-	short n1, n2, n3, n4;   // number of selected objects of each class; 0 means "any number"
-	const wchar_t *title;   // button text = command text
-	void (*callback) (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *closure);   // multi-purpose
-		/* If both sendingForm and sendingString are NULL, this routine is an activate callback;
+	int32 n1, n2, n3, n4;   // number of selected objects of each class; 0 means "any number"
+	const char32 *title;   // button text = command text
+	UiCallback callback;   // multi-purpose
+		/* If both UiCallback::sendingForm and sendingString are NULL, this routine is an activate callback;
 			you should directly execute the command, or call UiForm_do(dialog) if you need arguments;
 			UiForm_do will call this routine again with sendingForm = dialog. */
 		/* If sendingForm exists, this routine is an ok callback,
@@ -67,31 +67,29 @@ typedef struct structPraat_Command {
 			UiForm_parseString should be called, which will call this routine again with sendingForm. */
 		/* All of these things are normally taken care of by the macros defined in praat.h. */
 	signed char
-		visible,   /* Selected classes match class1, class2, and class3? */
-		executable,   /* Command actually executable? Button not grey? */
-		depth,   /* 1 = subcommand */
+		visible,   // do the selected classes match class1, class2, class3 and class4?
+		executable,   // is the command actually executable? I.e. isn't the button greyed out?
+		depth,   // 0 = command in main menu, 1 = command in submenu, 2 = command in submenu of submenu
 		hidden,
 		toggled,
 		phase,
 		unhidable,
 		attractive;
 	GuiThing button;
-	const wchar_t *window, *menu;
-	const wchar_t *script;   // if 'callback' equals DO_RunTheScriptFromAnyAddedMenuCommand
-	const wchar_t *after;   // title of previous command, often NULL
-	long uniqueID;   // for sorting the added commands
-	long sortingTail;
+	const char32 *window, *menu;
+	const char32 *script;   // if 'callback' equals DO_RunTheScriptFromAnyAddedMenuCommand
+	const char32 *after;   // title of previous command, often NULL
+	int32 uniqueID;   // for sorting the added commands
+	int32 sortingTail;
 } *praat_Command;
 
 #define praat_STARTING_UP  1
 #define praat_READING_BUTTONS  2
 #define praat_HANDLING_EVENTS  3
 
-long praat_getIdOfSelected (ClassInfo klas, int inplace);
-wchar_t * praat_getNameOfSelected (ClassInfo klas, int inplace);
-
-int praat_selection (ClassInfo klas);
-	/* How many objects of this class (excluding subclasses) are currently selected? */
+int praat_numberOfSelected (ClassInfo klas);
+long praat_idOfSelected (ClassInfo klas, int inplace);
+char32 * praat_nameOfSelected (ClassInfo klas, int inplace);
 
 /* Used by praat.cpp; defined in praat_picture.cpp.
 */
@@ -104,12 +102,12 @@ void praat_picture_prefsChanged ();
    (after reading the prefs file).
    Picture window will update the font menu.
 */
-GuiMenu praat_picture_resolveMenu (const wchar_t *menu);
+GuiMenu praat_picture_resolveMenu (const char32 *menu);
 void praat_picture_background ();
 void praat_picture_foreground ();
 
 
-/* The following routines are a bit private (used by praat_script.c). */
+/* The following routines are a bit private (used by praat_script.cpp). */
 /* If you must call them, follow them by praat_show (). */
 void praat_deselect (int i);
 void praat_deselectAll ();
@@ -120,16 +118,16 @@ void praat_list_background ();
 void praat_list_foreground ();   // updates the list of objects after backgrounding
 void praat_background ();
 void praat_foreground ();
-Editor praat_findEditorFromString (const wchar_t *string);
+Editor praat_findEditorFromString (const char32 *string);
 Editor praat_findEditorById (long id);
 
-void praat_showLogo (int autoPopDown);
+void praat_showLogo (bool autoPopDown);
 
 /* Communication with praat_menuCommands.cpp: */
 void praat_menuCommands_init ();
 void praat_menuCommands_exit ();
-int praat_doMenuCommand (const wchar_t *command, const wchar_t *arguments, Interpreter interpreter);   // 0 = not found
-int praat_doMenuCommand (const wchar_t *command, int narg, Stackel args, Interpreter interpreter);   // 0 = not found
+int praat_doMenuCommand (const char32 *command, const char32 *arguments, Interpreter interpreter);   // 0 = not found
+int praat_doMenuCommand (const char32 *command, int narg, Stackel args, Interpreter interpreter);   // 0 = not found
 long praat_getNumberOfMenuCommands ();
 praat_Command praat_getMenuCommand (long i);
 
@@ -139,8 +137,8 @@ void praat_actions_createWriteMenu (GuiWindow window);
 void praat_actions_init ();   // creates space for action commands
 void praat_actions_createDynamicMenu (GuiWindow window);
 void praat_saveAddedActions (MelderString *buffer);
-int praat_doAction (const wchar_t *command, const wchar_t *arguments, Interpreter interpreter);   // 0 = not found
-int praat_doAction (const wchar_t *command, int narg, Stackel args, Interpreter interpreter);   // 0 = not found
+int praat_doAction (const char32 *command, const char32 *arguments, Interpreter interpreter);   // 0 = not found
+int praat_doAction (const char32 *command, int narg, Stackel args, Interpreter interpreter);   // 0 = not found
 long praat_getNumberOfActions ();   // for ButtonEditor
 praat_Command praat_getAction (long i);   // for ButtonEditor
 
@@ -149,22 +147,29 @@ void praat_statistics_prefs ();   // at init time
 void praat_statistics_prefsChanged ();   // after reading prefs file
 void praat_statistics_exit ();   // at exit time
 void praat_reportMemoryUse ();
+void praat_reportSystemProperties ();
 void praat_reportGraphicalProperties ();
 void praat_reportIntegerProperties ();
 void praat_reportTextProperties ();
 
 /* Communication with praat_objectMenus.cpp: */
-GuiMenu praat_objects_resolveMenu (const wchar_t *menu);
+GuiMenu praat_objects_resolveMenu (const char32 *menu);
 void praat_addFixedButtons (GuiWindow window);
 void praat_addMenus (GuiWindow window);
 void praat_addMenus2 ();
 
-void praat_cleanUpName (wchar_t *name);
-void praat_list_renameAndSelect (int position, const wchar_t *name);
+void praat_cleanUpName (char32 *name);
+void praat_list_renameAndSelect (int position, const char32 *name);
 
 extern struct PraatP {
-	int dontUsePictureWindow;   // see praat_dontUsePictureWindow ()
-	char *title;
+	unsigned int argc;
+	char **argv;
+	unsigned int argumentNumber;
+	bool userWantsToOpen;
+	bool dontUsePictureWindow;   // see praat_dontUsePictureWindow ()
+	bool ignorePreferenceFiles, ignorePlugins;
+	bool hasCommandLineInput;
+	char32 *title;
 	GuiWindow menuBar;
 	int phase;
 	Editor editor;   // scripting environment
diff --git a/sys/praat_actions.cpp b/sys/praat_actions.cpp
index e0ec535..ce96209 100644
--- a/sys/praat_actions.cpp
+++ b/sys/praat_actions.cpp
@@ -1,6 +1,6 @@
 /* praat_actions.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -55,21 +55,21 @@ static void fixSelectionSpecification (ClassInfo *class1, int *n1, ClassInfo *cl
 	/* Now: if *class3, then *class2, and if *class2, then *class1.
 	 * Bubble-sort the input by class name.
 	 */
-	if (*class2 && wcscmp ((*class1) -> className, (*class2) -> className) > 0) {
+	if (*class2 && str32cmp ((*class1) -> className, (*class2) -> className) > 0) {
 		ClassInfo helpClass1 = *class1; *class1 = *class2; *class2 = helpClass1;
 		int helpN1 = *n1; *n1 = *n2; *n2 = helpN1;
 	}
-	if (*class3 && wcscmp ((*class2) -> className, (*class3) -> className) > 0) {
+	if (*class3 && str32cmp ((*class2) -> className, (*class3) -> className) > 0) {
 		ClassInfo helpClass2 = *class2; *class2 = *class3; *class3 = helpClass2;
 		int helpN2 = *n2; *n2 = *n3; *n3 = helpN2;
-		if (wcscmp ((*class1) -> className, (*class2) -> className) > 0) {
+		if (str32cmp ((*class1) -> className, (*class2) -> className) > 0) {
 			ClassInfo helpClass1 = *class1; *class1 = *class2; *class2 = helpClass1;
 			int helpN1 = *n1; *n1 = *n2; *n2 = helpN1;
 		}
 	}
 }
 
-static long lookUpMatchingAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, ClassInfo class4, const wchar_t *title) {
+static long lookUpMatchingAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, ClassInfo class4, const char32 *title) {
 /*
  * An action command is fully specified by its environment (the selected classes) and its title.
  * Precondition:
@@ -78,31 +78,32 @@ static long lookUpMatchingAction (ClassInfo class1, ClassInfo class2, ClassInfo
 	for (long i = 1; i <= theNumberOfActions; i ++)
 		if (class1 == theActions [i]. class1 && class2 == theActions [i]. class2 &&
 		    class3 == theActions [i]. class3 && class4 == theActions [i]. class4 &&
-		    title && theActions [i]. title && wcsequ (theActions [i]. title, title)) return i;
+		    title && theActions [i]. title && str32equ (theActions [i]. title, title)) return i;
 	return 0;   /* Not found. */
 }
 
 void praat_addAction (ClassInfo class1, int n1, ClassInfo class2, int n2, ClassInfo class3, int n3,
-	const wchar_t *title, const wchar_t *after, unsigned long flags, void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *))
+	const char32 *title, const char32 *after, unsigned long flags, UiCallback callback)
 { praat_addAction4 (class1, n1, class2, n2, class3, n3, NULL, 0, title, after, flags, callback); }
 
 void praat_addAction1 (ClassInfo class1, int n1,
-	const wchar_t *title, const wchar_t *after, unsigned long flags, void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *))
+	const char32 *title, const char32 *after, unsigned long flags, UiCallback callback)
 { praat_addAction4 (class1, n1, NULL, 0, NULL, 0, NULL, 0, title, after, flags, callback); }
 
 void praat_addAction2 (ClassInfo class1, int n1, ClassInfo class2, int n2,
-	const wchar_t *title, const wchar_t *after, unsigned long flags, void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *))
+	const char32 *title, const char32 *after, unsigned long flags, UiCallback callback)
 { praat_addAction4 (class1, n1, class2, n2, NULL, 0, NULL, 0, title, after, flags, callback); }
 
 void praat_addAction3 (ClassInfo class1, int n1, ClassInfo class2, int n2, ClassInfo class3, int n3,
-	const wchar_t *title, const wchar_t *after, unsigned long flags, void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *))
+	const char32 *title, const char32 *after, unsigned long flags, UiCallback callback)
 { praat_addAction4 (class1, n1, class2, n2, class3, n3, NULL, 0, title, after, flags, callback); }
 
 void praat_addAction4 (ClassInfo class1, int n1, ClassInfo class2, int n2, ClassInfo class3, int n3, ClassInfo class4, int n4,
-	const wchar_t *title, const wchar_t *after, unsigned long flags, void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *))
+	const char32 *title, const char32 *after, unsigned long flags, UiCallback callback)
 {
 	try {
-		int depth = flags, unhidable = FALSE, hidden = FALSE, key = 0, attractive = 0;
+		int depth = flags, key = 0;
+		bool unhidable = false, hidden = false, attractive = false;
 		unsigned long motifFlags = 0;
 		if (flags > 7) {
 			depth = ((flags & praat_DEPTH_7) >> 16);
@@ -115,14 +116,14 @@ void praat_addAction4 (ClassInfo class1, int n1, ClassInfo class2, int n2, Class
 		fixSelectionSpecification (& class1, & n1, & class2, & n2, & class3, & n3);
 
 		if (callback && ! title)
-			Melder_throw ("An action command with callback has no title. Classes: ",
-				class1 ? class1 -> className : L"", L" ",
-				class2 ? class2 -> className : L"", L" ",
-				class3 ? class3 -> className : L"", L" ",
-				class4 ? class4 -> className : L"", L".");
+			Melder_throw (U"An action command with callback has no title. Classes: ",
+				class1 ? class1 -> className : U"", U" ",
+				class2 ? class2 -> className : U"", U" ",
+				class3 ? class3 -> className : U"", U" ",
+				class4 ? class4 -> className : U"", U".");
 
 		if (! class1)
-			Melder_throw ("The action command \"", title, "\" has no first class.");
+			Melder_throw (U"The action command \"", title, U"\" has no first class.");
 
 		/*
 		 * Determine the position of the new command.
@@ -131,8 +132,8 @@ void praat_addAction4 (ClassInfo class1, int n1, ClassInfo class2, int n2, Class
 		if (after) {   // search for existing command with same selection
 			long found = lookUpMatchingAction (class1, class2, class3, class4, after);
 			if (found == 0)
-				Melder_throw ("The action command \"", title, "\" cannot be put after \"", after, "\",\n"
-					"because the latter command does not exist.");
+				Melder_throw (U"The action command \"", title, U"\" cannot be put after \"", after, U"\",\n"
+					U"because the latter command does not exist.");
 			position = found + 1;   // after 'after'
 		} else {
 			position = theNumberOfActions + 1;   // at end
@@ -142,7 +143,7 @@ void praat_addAction4 (ClassInfo class1, int n1, ClassInfo class2, int n2, Class
 		 * Increment the command area.
 		 */
 		if (theNumberOfActions >= praat_MAXNUM_LOOSE_COMMANDS)
-			Melder_throw ("Too many action commands (maximum ", praat_MAXNUM_LOOSE_COMMANDS, ").");
+			Melder_throw (U"Too many action commands (maximum ", praat_MAXNUM_LOOSE_COMMANDS, U").");
 		theNumberOfActions += 1;
 
 		/*
@@ -162,41 +163,41 @@ void praat_addAction4 (ClassInfo class1, int n1, ClassInfo class2, int n2, Class
 		theActions [position]. n3 = n3;
 		theActions [position]. class4 = class4;
 		theActions [position]. n4 = n4;
-		theActions [position]. title = Melder_wcsdup_f (title);
+		theActions [position]. title = Melder_dup_f (title);
 		theActions [position]. depth = depth;
-		theActions [position]. callback = callback;   /* NULL for a separator. */
-		theActions [position]. button = NULL;
-		theActions [position]. script = NULL;
+		theActions [position]. callback = callback;   // NULL for a separator
+		theActions [position]. button = nullptr;
+		theActions [position]. script = nullptr;
 		theActions [position]. hidden = hidden;
 		theActions [position]. unhidable = unhidable;
 		theActions [position]. attractive = attractive;
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 }
 
-static void deleteDynamicMenu (void) {
+static void deleteDynamicMenu () {
 	if (praatP.phase != praat_HANDLING_EVENTS) return;
 	if (actionsInvisible) return;
 	static long numberOfDeletions;
-	trace ("deletion #%ld", ++ numberOfDeletions);
+	trace (U"deletion #", ++ numberOfDeletions);
 	for (int i = 1; i <= theNumberOfActions; i ++) {
 		if (theActions [i]. button) {
-			trace ("trying to destroy action %d of %d: %ls", (int) i, (int) theNumberOfActions, theActions [i]. title);
+			trace (U"trying to destroy action ", i, U" of ", theNumberOfActions, U": ", theActions [i]. title);
 			#if gtk || cocoa
 				if (theActions [i]. button -> d_parent == praat_form) {
-					trace ("destroy a label or a push button or a cascade button");
+					trace (U"destroy a label or a push button or a cascade button");
 					GuiObject_destroy (theActions [i]. button -> d_widget);
 				} else if (praat_writeMenu && theActions [i]. button -> d_parent == praat_writeMenu) {
-					trace ("destroying Save menu item");
+					trace (U"destroying Save menu item");
 					GuiObject_destroy (theActions [i]. button -> d_widget);
 				}
 			#elif motif
 				if (theActions [i]. button -> classInfo == classGuiButton && theActions [i]. button -> d_widget -> subMenuId) {   // a cascade button (not a direct child of the form)?
-					trace ("destroy the xm menu bar; this also destroys the xm button and the xm menu");
+					trace (U"destroy the xm menu bar; this also destroys the xm button and the xm menu");
 					GuiObject_destroy (theActions [i]. button -> d_widget -> parent);   // the Motif parent, i.e. not d_parent -> d_widget !
 				} else if (theActions [i]. button -> d_parent == praat_form) {
-					trace ("destroy a label or a push button");
+					trace (U"destroy a label or a push button");
 					GuiObject_destroy (theActions [i]. button -> d_widget);
 				}
 			#endif
@@ -206,49 +207,49 @@ static void deleteDynamicMenu (void) {
 	if (praat_writeMenu) {
 		#if gtk || cocoa
 			if (praat_writeMenuSeparator) {
-				trace ("destroy the Save menu separator");
+				trace (U"destroy the Save menu separator");
 				GuiObject_destroy (praat_writeMenuSeparator -> d_widget);
 			}
 			//praat_writeMenu -> f_empty ();
 		#elif motif
 			GuiObject_destroy (praat_writeMenu -> d_xmMenuTitle);
 			GuiObject_destroy (praat_writeMenu -> d_widget);
-			praat_writeMenu = GuiMenu_createInWindow (praatP.menuBar, L"Save", 0);
+			praat_writeMenu = GuiMenu_createInWindow (praatP.menuBar, U"Save", 0);
 		#endif
 		praat_writeMenuSeparator = NULL;
 	}
 	actionsInvisible = true;
 }
 
-static void updateDynamicMenu (void) {
+static void updateDynamicMenu () {
 	if (praatP.phase != praat_HANDLING_EVENTS) return;
 	praat_sortActions ();
 	deleteDynamicMenu ();
 	praat_show ();
 }
 
-void praat_addActionScript (const wchar_t *className1, int n1, const wchar_t *className2, int n2, const wchar_t *className3, int n3,
-	const wchar_t *title, const wchar_t *after, int depth, const wchar_t *script)
+void praat_addActionScript (const char32 *className1, int n1, const char32 *className2, int n2, const char32 *className3, int n3,
+	const char32 *title, const char32 *after, int depth, const char32 *script)
 {
 	try {
 		ClassInfo class1 = NULL, class2 = NULL, class3 = NULL;
 		Melder_assert (className1 && className2 && className3 && title && after && script);
-		if (wcslen (className1)) {
-			class1 = Thing_classFromClassName (className1);
+		if (str32len (className1)) {
+			class1 = Thing_classFromClassName (className1, NULL);
 		}
-		if (wcslen (className2)) {
-			class2 = Thing_classFromClassName (className2);
+		if (str32len (className2)) {
+			class2 = Thing_classFromClassName (className2, NULL);
 		}
-		if (wcslen (className3)) {
-			class3 = Thing_classFromClassName (className3);
+		if (str32len (className3)) {
+			class3 = Thing_classFromClassName (className3, NULL);
 		}
 		fixSelectionSpecification (& class1, & n1, & class2, & n2, & class3, & n3);
 
-		if (wcslen (script) && ! wcslen (title))
-			Melder_throw ("Command with callback has no title. Classes: ", className1, " ", className2, " ", className3, ".");
+		if (str32len (script) && ! str32len (title))
+			Melder_throw (U"Command with callback has no title. Classes: ", className1, U" ", className2, U" ", className3, U".");
 
-		if (! wcslen (className1))
-			Melder_throw ("Command \"", title, "\" has no first class.");
+		if (! str32len (className1))
+			Melder_throw (U"Command \"", title, U"\" has no first class.");
 
 		/*
 		 * If the button already exists, remove it.
@@ -263,7 +264,7 @@ void praat_addActionScript (const wchar_t *className1, int n1, const wchar_t *cl
 		 * Determine the position of the new command.
 		 */
 		long position;
-		if (wcslen (after)) {   /* Search for existing command with same selection. */
+		if (str32len (after)) {   /* Search for existing command with same selection. */
 			long found = lookUpMatchingAction (class1, class2, class3, NULL, after);
 			if (found) {
 				position = found + 1;   // after 'after'
@@ -278,7 +279,7 @@ void praat_addActionScript (const wchar_t *className1, int n1, const wchar_t *cl
 		 * Increment the command area.
 		 */
 		if (theNumberOfActions >= praat_MAXNUM_LOOSE_COMMANDS)
-			Melder_throw ("Too many actions (maximum is ", praat_MAXNUM_LOOSE_COMMANDS, ").");
+			Melder_throw (U"Too many actions (maximum is ", praat_MAXNUM_LOOSE_COMMANDS, U").");
 		theNumberOfActions += 1;
 
 		/*
@@ -296,18 +297,18 @@ void praat_addActionScript (const wchar_t *className1, int n1, const wchar_t *cl
 		theActions [position]. n2 = n2;
 		theActions [position]. class3 = class3;
 		theActions [position]. n3 = n3;
-		theActions [position]. title = wcslen (title) ? Melder_wcsdup_f (title) : NULL;   // allow old-fashioned untitled separators
+		theActions [position]. title = str32len (title) ? Melder_dup_f (title) : nullptr;   // allow old-fashioned untitled separators
 		theActions [position]. depth = depth;
-		theActions [position]. callback = wcslen (script) ? DO_RunTheScriptFromAnyAddedMenuCommand : NULL;   // NULL for a separator
+		theActions [position]. callback = str32len (script) ? DO_RunTheScriptFromAnyAddedMenuCommand : nullptr;   // NULL for a separator
 		theActions [position]. button = NULL;
-		if (wcslen (script) == 0) {
+		if (str32len (script) == 0) {
 			theActions [position]. script = NULL;
 		} else {
 			structMelderFile file = { 0 };
 			Melder_relativePathToFile (script, & file);
-			theActions [position]. script = Melder_wcsdup_f (Melder_fileToPath (& file));
+			theActions [position]. script = Melder_dup_f (Melder_fileToPath (& file));
 		}
-		theActions [position]. after = wcslen (after) ? Melder_wcsdup_f (after) : NULL;
+		theActions [position]. after = str32len (after) ? Melder_dup_f (after) : nullptr;
 		theActions [position]. phase = praatP.phase;
 		if (praatP.phase >= praat_READING_BUTTONS) {
 			static long uniqueID = 0;
@@ -315,185 +316,185 @@ void praat_addActionScript (const wchar_t *className1, int n1, const wchar_t *cl
 		}
 		updateDynamicMenu ();
 	} catch (MelderError) {
-		Melder_throw ("Praat: script action not added.");
+		Melder_throw (U"Praat: script action not added.");
 	}
 }
 
-void praat_removeAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const wchar_t *title) {
+void praat_removeAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const char32 *title) {
 	try {
 		int n1, n2, n3;
 		fixSelectionSpecification (& class1, & n1, & class2, & n2, & class3, & n3);
-		long found = lookUpMatchingAction (class1, class2, class3, NULL, title);
+		long found = lookUpMatchingAction (class1, class2, class3, nullptr, title);
 		if (! found) {
-			Melder_throw ("Action command \"", class1 -> className,
-				class2 ? L" & ": L"", class2 -> className,
-				class3 ? L" & ": L"", class3 -> className,
-				": ", title, "\" not found.");
+			Melder_throw (U"Action command \"", class1 -> className,
+				class2 ? U" & ": U"", class2 -> className,
+				class3 ? U" & ": U"", class3 -> className,
+				U": ", title, U"\" not found.");
 		}
 		Melder_free (theActions [found]. title);
 		theNumberOfActions --;
 		for (long i = found; i <= theNumberOfActions; i ++) theActions [i] = theActions [i + 1];
 	} catch (MelderError) {
-		Melder_throw ("Praat: action not removed.");
+		Melder_throw (U"Praat: action not removed.");
 	}
 }
 
-void praat_removeAction_classNames (const wchar_t *className1, const wchar_t *className2,
-	const wchar_t *className3, const wchar_t *title)
+void praat_removeAction_classNames (const char32 *className1, const char32 *className2,
+	const char32 *className3, const char32 *title)
 {
 	try {
-		ClassInfo class1 = NULL, class2 = NULL, class3 = NULL;
+		ClassInfo class1 = nullptr, class2 = nullptr, class3 = nullptr;
 		Melder_assert (className1 && className2 && className3 && title);
-		if (wcslen (className1)) {
-			class1 = Thing_classFromClassName (className1);
+		if (str32len (className1)) {
+			class1 = Thing_classFromClassName (className1, nullptr);
 		}
-		if (wcslen (className2)) {
-			class2 = Thing_classFromClassName (className2);
+		if (str32len (className2)) {
+			class2 = Thing_classFromClassName (className2, nullptr);
 		}
-		if (wcslen (className3)) {
-			class3 = Thing_classFromClassName (className3);
+		if (str32len (className3)) {
+			class3 = Thing_classFromClassName (className3, nullptr);
 		}
 		praat_removeAction (class1, class2, class3, title);
 		updateDynamicMenu ();
 	} catch (MelderError) {
-		Melder_throw ("Praat: action not removed.");
+		Melder_throw (U"Praat: action not removed.");
 	}
 }
 
-void praat_hideAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const wchar_t *title) {
+void praat_hideAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const char32 *title) {
 	try {
 		int n1, n2, n3;
 		fixSelectionSpecification (& class1, & n1, & class2, & n2, & class3, & n3);
-		long found = lookUpMatchingAction (class1, class2, class3, NULL, title);
+		long found = lookUpMatchingAction (class1, class2, class3, nullptr, title);
 		if (! found) {
-			Melder_throw ("Praat: action command \"", class1 ? class1 -> className : NULL,
-				class2 ? " & ": NULL, class2 ? class2 -> className : NULL,
-				class3 ? " & ": NULL, class3 ? class3 -> className : NULL,
-				": ", title, "\" not found.");
+			Melder_throw (U"Praat: action command \"", class1 ? class1 -> className : nullptr,
+				class2 ? U" & ": NULL, class2 ? class2 -> className : nullptr,
+				class3 ? U" & ": NULL, class3 ? class3 -> className : nullptr,
+				U": ", title, U"\" not found.");
 		}
 		if (! theActions [found]. hidden) {
-			theActions [found]. hidden = TRUE;
+			theActions [found]. hidden = true;
 			if (praatP.phase >= praat_READING_BUTTONS) theActions [found]. toggled = ! theActions [found]. toggled;
 			updateDynamicMenu ();
 		}
 	} catch (MelderError) {
-		Melder_throw ("Praat: action not hidden.");
+		Melder_throw (U"Praat: action not hidden.");
 	}
 }
 
-void praat_hideAction_classNames (const wchar_t *className1, const wchar_t *className2,
-	const wchar_t *className3, const wchar_t *title)
+void praat_hideAction_classNames (const char32 *className1, const char32 *className2,
+	const char32 *className3, const char32 *title)
 {
 	try {
-		ClassInfo class1 = NULL, class2 = NULL, class3 = NULL;
+		ClassInfo class1 = nullptr, class2 = nullptr, class3 = nullptr;
 		Melder_assert (className1 && className2 && className3 && title);
-		if (wcslen (className1)) {
-			class1 = Thing_classFromClassName (className1);
+		if (str32len (className1)) {
+			class1 = Thing_classFromClassName (className1, nullptr);
 		}
-		if (wcslen (className2)) {
-			class2 = Thing_classFromClassName (className2);
+		if (str32len (className2)) {
+			class2 = Thing_classFromClassName (className2, nullptr);
 		}
-		if (wcslen (className3)) {
-			class3 = Thing_classFromClassName (className3);
+		if (str32len (className3)) {
+			class3 = Thing_classFromClassName (className3, nullptr);
 		}
 		praat_hideAction (class1, class2, class3, title);
 	} catch (MelderError) {
-		Melder_throw ("Praat: action not hidden.");
+		Melder_throw (U"Praat: action not hidden.");
 	}
 }
 
-void praat_showAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const wchar_t *title) {
+void praat_showAction (ClassInfo class1, ClassInfo class2, ClassInfo class3, const char32 *title) {
 	try {
 		int n1, n2, n3;
 		fixSelectionSpecification (& class1, & n1, & class2, & n2, & class3, & n3);
 		long found = lookUpMatchingAction (class1, class2, class3, NULL, title);
 		if (! found) {
-			Melder_throw ("Action command \"", class1 ? class1 -> className : NULL,
-				class2 ? L" & ": NULL, class2 ? class2 -> className : NULL,
-				class3 ? L" & ": NULL, class3 ? class3 -> className : NULL,
-				L": ", title, "\" not found.");
+			Melder_throw (U"Action command \"", class1 ? class1 -> className : nullptr,
+				class2 ? U" & ": NULL, class2 ? class2 -> className : nullptr,
+				class3 ? U" & ": NULL, class3 ? class3 -> className : nullptr,
+				U": ", title, U"\" not found.");
 		}
 		if (theActions [found]. hidden) {
-			theActions [found]. hidden = FALSE;
+			theActions [found]. hidden = false;
 			if (praatP.phase >= praat_READING_BUTTONS) theActions [found]. toggled = ! theActions [found]. toggled;
 			updateDynamicMenu ();
 		}
 	} catch (MelderError) {
-		Melder_throw ("Praat: action not shown.");
+		Melder_throw (U"Praat: action not shown.");
 	}
 }
 
-void praat_showAction_classNames (const wchar_t *className1, const wchar_t *className2,
-	const wchar_t *className3, const wchar_t *title)
+void praat_showAction_classNames (const char32 *className1, const char32 *className2,
+	const char32 *className3, const char32 *title)
 {
 	try {
-		ClassInfo class1 = NULL, class2 = NULL, class3 = NULL;
+		ClassInfo class1 = nullptr, class2 = nullptr, class3 = nullptr;
 		Melder_assert (className1 && className2 && className3 && title);
-		if (wcslen (className1)) {
-			class1 = Thing_classFromClassName (className1);
+		if (str32len (className1)) {
+			class1 = Thing_classFromClassName (className1, nullptr);
 		}
-		if (wcslen (className2)) {
-			class2 = Thing_classFromClassName (className2);
+		if (str32len (className2)) {
+			class2 = Thing_classFromClassName (className2, nullptr);
 		}
-		if (wcslen (className3)) {
-			class3 = Thing_classFromClassName (className3);
+		if (str32len (className3)) {
+			class3 = Thing_classFromClassName (className3, nullptr);
 		}
 		praat_showAction (class1, class2, class3, title);
 	} catch (MelderError) {
-		Melder_throw ("Praat: action not shown.");
+		Melder_throw (U"Praat: action not shown.");
 	}
 }
 
 static int compareActions (const void *void_me, const void *void_thee) {
 	praat_Command me = (praat_Command) void_me, thee = (praat_Command) void_thee;
 	int compare;
-	compare = wcscmp (my class1 -> className, thy class1 -> className);
-	if (compare) return my class1 == classData ? -1 : thy class1 == classData ? 1 : compare;
+	compare = str32cmp (my class1 -> className, thy class1 -> className);
+	if (compare) return my class1 == classDaata ? -1 : thy class1 == classDaata ? 1 : compare;
 	if (my class2) {
 		if (! thy class2) return 1;
-		compare = wcscmp (my class2 -> className, thy class2 -> className);
+		compare = str32cmp (my class2 -> className, thy class2 -> className);
 		if (compare) return compare;
 	} else if (thy class2) return -1;
 	if (my class3) {
 		if (! thy class3) return 1;
-		compare = wcscmp (my class3 -> className, thy class3 -> className);
+		compare = str32cmp (my class3 -> className, thy class3 -> className);
 		if (compare) return compare;
 	} else if (thy class3) return -1;
 	if (my sortingTail < thy sortingTail) return -1;
 	return 1;
 }
 
-void praat_sortActions (void) {
+void praat_sortActions () {
 	for (long i = 1; i <= theNumberOfActions; i ++)
 		theActions [i]. sortingTail = i;
 	qsort (& theActions [1], theNumberOfActions, sizeof (struct structPraat_Command), compareActions);
 }
 
-static const wchar_t *numberString (int number) {
-	return number == 1 ? L"one" : number == 2 ? L"two" : number == 3 ? L"three" : L"any number of";
+static const char32 *numberString (int number) {
+	return number == 1 ? U"one" : number == 2 ? U"two" : number == 3 ? U"three" : U"any number of";
 }
-static const wchar_t *classString (ClassInfo klas) {
-	return klas == classData ? L"" : klas -> className;
+static const char32 *classString (ClassInfo klas) {
+	return klas == classDaata ? U"" : klas -> className;
 }
-static const wchar_t *objectString (int number) {
-	return number == 1 ? L"object" : L"objects";
+static const char32 *objectString (int number) {
+	return number == 1 ? U"object" : U"objects";
 }
 static bool allowExecutionHook (void *closure) {
-	void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *) = (void (*) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *)) closure;
+	UiCallback callback = (UiCallback) closure;
 	Melder_assert (sizeof (callback) == sizeof (void *));
 	long numberOfMatchingCallbacks = 0, firstMatchingCallback = 0;
 	for (long i = 1; i <= theNumberOfActions; i ++) {
 		praat_Command me = & theActions [i];
 		if (my callback == callback) {
 			int sel1, sel2 = 0, sel3 = 0, sel4 = 0;
-			if (! my class1) Melder_throw ("No class1???");
+			if (! my class1) Melder_throw (U"No class1???");
 			numberOfMatchingCallbacks += 1;
 			if (! firstMatchingCallback) firstMatchingCallback = i;
-			sel1 = my class1 == classData ? theCurrentPraatObjects -> totalSelection : praat_selection (my class1);
+			sel1 = my class1 == classDaata ? theCurrentPraatObjects -> totalSelection : praat_numberOfSelected (my class1);
 			if (sel1 == 0) continue;
-			if (my class2 && (sel2 = praat_selection (my class2)) == 0) continue;
-			if (my class3 && (sel3 = praat_selection (my class3)) == 0) continue;
-			if (my class4 && (sel4 = praat_selection (my class4)) == 0) continue;
+			if (my class2 && (sel2 = praat_numberOfSelected (my class2)) == 0) continue;
+			if (my class3 && (sel3 = praat_numberOfSelected (my class3)) == 0) continue;
+			if (my class4 && (sel4 = praat_numberOfSelected (my class4)) == 0) continue;
 			if (sel1 + sel2 + sel3 + sel4 != theCurrentPraatObjects -> totalSelection) continue;
 			if ((my n1 && sel1 != my n1) || (my n2 && sel2 != my n2) || (my n3 && sel3 != my n3) || (my n4 && sel4 != my n4)) continue;
 			return true;   // found a matching action
@@ -501,14 +502,14 @@ static bool allowExecutionHook (void *closure) {
 	}
 	if (numberOfMatchingCallbacks == 1) {
 		praat_Command me = & theActions [firstMatchingCallback];
-		Melder_error_ ("Selection changed! It should be:");
-		if (my class1) Melder_error_ ("   ", numberString (my n1), " ", classString (my class1), " ", objectString (my n1));
-		if (my class2) Melder_error_ ("   ", numberString (my n2), " ", classString (my class2), " ", objectString (my n2));
-		if (my class3) Melder_error_ ("   ", numberString (my n3), " ", classString (my class3), " ", objectString (my n3));
-		if (my class4) Melder_error_ ("   ", numberString (my n4), " ", classString (my class4), " ", objectString (my n4));
+		Melder_appendError (U"Selection changed! It should be:");
+		if (my class1) Melder_appendError (U"   ", numberString (my n1), U" ", classString (my class1), U" ", objectString (my n1));
+		if (my class2) Melder_appendError (U"   ", numberString (my n2), U" ", classString (my class2), U" ", objectString (my n2));
+		if (my class3) Melder_appendError (U"   ", numberString (my n3), U" ", classString (my class3), U" ", objectString (my n3));
+		if (my class4) Melder_appendError (U"   ", numberString (my n4), U" ", classString (my class4), U" ", objectString (my n4));
 		throw MelderError ();
 	} else {
-		Melder_throw ("Selection changed!");
+		Melder_throw (U"Selection changed!");
 	}
 	return false;
 }
@@ -519,38 +520,36 @@ static void do_menu (I, bool modified) {
  *	Call that callback!
  *	Catch the error queue for menu commands without dots (...).
  */
-	void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *) = (void (*) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *)) void_me;
+	UiCallback callback = (UiCallback) void_me;
 	for (long i = 1; i <= theNumberOfActions; i ++) {
 		praat_Command me = & theActions [i];
 		if (my callback == callback) {
-			if (my title != NULL && ! wcsstr (my title, L"...")) {
-				UiHistory_write (L"\n");
+			if (my title != NULL && ! str32str (my title, U"...")) {
+				UiHistory_write (U"\n");
 				UiHistory_write_colonize (my title);
 			}
 			Ui_setAllowExecutionHook (allowExecutionHook, (void *) callback);   // BUG: one shouldn't assign a function pointer to a void pointer
 			try {
-				callback (NULL, 0, NULL, NULL, NULL, my title, modified, NULL);
+				callback (nullptr, 0, nullptr, nullptr, nullptr, my title, modified, nullptr);
 			} catch (MelderError) {
-				Melder_error_ ("Command \"", my title, "\" not executed.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Command \"", my title, U"\" not executed.");
 			}
 			Ui_setAllowExecutionHook (NULL, NULL);
 			praat_updateSelection (); return;
 		}
 		if (my callback == DO_RunTheScriptFromAnyAddedMenuCommand && my script == (void *) void_me) {
-			if (my title != NULL && ! wcsstr (my title, L"...")) {
-				UiHistory_write (L"\nexecute ");
+			if (my title != NULL && ! str32str (my title, U"...")) {
+				UiHistory_write (U"\nexecute ");
 				UiHistory_write (my script);
 			} else {
-				UiHistory_write (L"\nexecute \"");
+				UiHistory_write (U"\nexecute \"");
 				UiHistory_write (my script);
-				UiHistory_write (L"\"");
+				UiHistory_write (U"\"");
 			}
 			try {
-				DO_RunTheScriptFromAnyAddedMenuCommand (NULL, 0, NULL, my script, NULL, NULL, false, NULL);
+				DO_RunTheScriptFromAnyAddedMenuCommand (nullptr, 0, nullptr, my script, nullptr, nullptr, false, nullptr);
 			} catch (MelderError) {
-				Melder_error_ ("Command \"", my title, "\" not executed.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Command \"", my title, U"\" not executed.");
 			}
 			praat_updateSelection (); return;
 		}
@@ -566,7 +565,7 @@ static void gui_button_cb_menu (I, GuiButtonEvent event) {
 	do_menu (void_me, event -> shiftKeyPressed | event -> commandKeyPressed | event -> optionKeyPressed | event -> extraControlKeyPressed);
 }
 
-void praat_actions_show (void) {
+void praat_actions_show () {
 	#if defined (macintosh)
 		const int BUTTON_VSPACING = 8;
 	#else
@@ -579,14 +578,14 @@ void praat_actions_show (void) {
 	if (! theCurrentPraatApplication -> batch) {
 		deleteDynamicMenu ();
 		if (! Melder_backgrounding) {
-			praat_writeMenu -> f_setSensitive (false);
-			if (praat_writeMenuSeparator) praat_writeMenuSeparator -> f_hide ();
+			GuiThing_setSensitive (praat_writeMenu, false);
+			if (praat_writeMenuSeparator) GuiThing_hide (praat_writeMenuSeparator);
 		}
 
 		/* Determine the visibility and sensitivity of all the actions.
 		 */
 		if (theCurrentPraatObjects -> totalSelection != 0 && ! Melder_backgrounding)
-			praat_writeMenu -> f_setSensitive (true);
+			GuiThing_setSensitive (praat_writeMenu, true);
 	}
 	for (long i = 1; i <= theNumberOfActions; i ++) {
 		int sel1 = 0, sel2 = 0, sel3 = 0, sel4 = 0;
@@ -594,37 +593,37 @@ void praat_actions_show (void) {
 
 		/* Clean up from previous selection. */
 
-		theActions [i]. visible = FALSE;
-		theActions [i]. executable = FALSE;
+		theActions [i]. visible = false;
+		theActions [i]. executable = false;
 
 		/* Match the actually selected classes with the selection required for this visibility. */
 
-		if (! theActions [i]. class1) continue;   /* At least one class selected. */
-		sel1 = theActions [i]. class1 == classData ? theCurrentPraatObjects -> totalSelection : praat_selection (theActions [i]. class1);
+		if (! theActions [i]. class1) continue;   // at least one class selected
+		sel1 = theActions [i]. class1 == classDaata ? theCurrentPraatObjects -> totalSelection : praat_numberOfSelected (theActions [i]. class1);
 		if (sel1 == 0) continue;
-		if (theActions [i]. class2 && (sel2 = praat_selection (theActions [i]. class2)) == 0) continue;
-		if (theActions [i]. class3 && (sel3 = praat_selection (theActions [i]. class3)) == 0) continue;
-		if (theActions [i]. class4 && (sel4 = praat_selection (theActions [i]. class4)) == 0) continue;
-		if (sel1 + sel2 + sel3 + sel4 != theCurrentPraatObjects -> totalSelection) continue;   /* Other classes selected? Do not show. */
+		if (theActions [i]. class2 && (sel2 = praat_numberOfSelected (theActions [i]. class2)) == 0) continue;
+		if (theActions [i]. class3 && (sel3 = praat_numberOfSelected (theActions [i]. class3)) == 0) continue;
+		if (theActions [i]. class4 && (sel4 = praat_numberOfSelected (theActions [i]. class4)) == 0) continue;
+		if (sel1 + sel2 + sel3 + sel4 != theCurrentPraatObjects -> totalSelection) continue;   // other classes selected? Do not show
 		theActions [i]. visible = ! theActions [i]. hidden;
 
 		/* Match the actually selected objects with the selection required for this action. */
 
-		if (! theActions [i]. callback) continue;   /* Separators are not executable. */
+		if (! theActions [i]. callback) continue;   // separators are not executable
 		if ((n1 && sel1 != n1) || (n2 && sel2 != n2) || (n3 && sel3 != n3) || (n4 && sel4 != n4)) continue;
-		theActions [i]. executable = TRUE;
+		theActions [i]. executable = true;
 	}
 
 	/* Create a new column of buttons in the dynamic menu. */
 	if (! theCurrentPraatApplication -> batch && ! Melder_backgrounding) {
 		actionsInvisible = false;
-		GuiMenu currentSubmenu1 = NULL, currentSubmenu2 = NULL;
-		int writeMenuGoingToSeparate = FALSE;
+		GuiMenu currentSubmenu1 = NULL, currentSubmenu2 = nullptr;
+		bool writeMenuGoingToSeparate = false;
 		int y = Machine_getMenuBarHeight () + 10;
-		for (long i = 1; i <= theNumberOfActions; i ++) {   /* Add buttons or make existing buttons sensitive (executable). */
+		for (long i = 1; i <= theNumberOfActions; i ++) {   // add buttons or make existing buttons sensitive (executable)
 			praat_Command me = & theActions [i];
-			if (my depth == 0) currentSubmenu1 = NULL, currentSubmenu2 = NULL;   /* Prevent attachment of later deep actions to earlier submenus after removal of label. */
-			if (my depth == 1) currentSubmenu2 = NULL;   /* Prevent attachment of later deep actions to earlier submenus after removal of label. */
+			if (my depth == 0) currentSubmenu1 = nullptr, currentSubmenu2 = nullptr;   // prevent attachment of later deep actions to earlier submenus after removal of label
+			if (my depth == 1) currentSubmenu2 = nullptr;   // prevent attachment of later deep actions to earlier submenus after removal of label
 			if (! my visible) continue;
 			if (my callback) {
 				/* Apparently a true command: create a button in the dynamic menu.
@@ -633,13 +632,13 @@ void praat_actions_show (void) {
 				 */
 				GuiMenu parentMenu = my depth > 1 && currentSubmenu2 ? currentSubmenu2 : my depth > 0 && currentSubmenu1 ? currentSubmenu1 : NULL;
 
-				if (wcsnequ (my title, L"Save ", 5) || wcsnequ (my title, L"Write ", 6) || wcsnequ (my title, L"Append to ", 10)) {
+				if (str32nequ (my title, U"Save ", 5) || str32nequ (my title, U"Write ", 6) || str32nequ (my title, U"Append to ", 10)) {
 					parentMenu = praat_writeMenu;
 					if (! praat_writeMenuSeparator) {
 						if (writeMenuGoingToSeparate)
 							praat_writeMenuSeparator = GuiMenu_addSeparator (parentMenu);
-						else if (wcsequ (my title, L"Save as binary file..."))
-							writeMenuGoingToSeparate = TRUE;
+						else if (str32equ (my title, U"Save as binary file..."))
+							writeMenuGoingToSeparate = true;
 					}
 				}
 				if (parentMenu) {
@@ -669,9 +668,9 @@ void praat_actions_show (void) {
 				/*
 				 * Apparently a separator in a submenu.
 				 */
-				if (currentSubmenu2 || currentSubmenu1) {   /* These separators are not shown in a flattened menu. */
+				if (currentSubmenu2 || currentSubmenu1) {   // these separators are not shown in a flattened menu
 					my button = GuiMenu_addSeparator (currentSubmenu2 ? currentSubmenu2 : currentSubmenu1);
-					my button -> f_show ();
+					GuiThing_show (my button);
 				}
 			} else {
 				/*
@@ -687,7 +686,7 @@ void praat_actions_show (void) {
 					currentSubmenu2 = GuiMenu_createInMenu (currentSubmenu1, my title, 0);
 					my button = currentSubmenu2 -> d_menuItem;
 				}
-				my button -> f_show ();
+				GuiThing_show (my button);
 			}
 		}
 	}
@@ -695,13 +694,13 @@ void praat_actions_show (void) {
 
 void praat_actions_createWriteMenu (GuiWindow window) {
 	if (theCurrentPraatApplication -> batch) return;
-	praat_writeMenu = GuiMenu_createInWindow (window, L"Save", GuiMenu_INSENSITIVE);
+	praat_writeMenu = GuiMenu_createInWindow (window, U"Save", GuiMenu_INSENSITIVE);
 	#if gtk
 		GuiMenu_addSeparator (praat_writeMenu);
 	#endif
 }
 
-void praat_actions_init (void) {
+void praat_actions_init () {
 	theActions = Melder_calloc_f (struct structPraat_Command, 1 + praat_MAXNUM_LOOSE_COMMANDS);
 }
 
@@ -720,49 +719,49 @@ void praat_saveAddedActions (MelderString *buffer) {
 		for (long iaction = 1; iaction <= theNumberOfActions; iaction ++) {
 			praat_Command me = & theActions [iaction];
 			if (my uniqueID == ident && ! my hidden && my title) {
-				MelderString_append (buffer, L"Add action command...");
-				MelderString_append (buffer, L" ", my class1 -> className, L" ", Melder_integer (my n1));
-				MelderString_append (buffer, L" ", my class2 ? my class2 -> className : L"\"\"", L" ", Melder_integer (my n2));
-				MelderString_append (buffer, L" ", my class3 ? my class3 -> className : L"\"\"", L" ", Melder_integer (my n3));
-				MelderString_append (buffer, L" \"", my title, L"\" \"", my after ? my after : L"", L"\" ", Melder_integer (my depth));
-				MelderString_append (buffer, L" ", my script ? my script : L"", L"\n");
+				MelderString_append (buffer, U"Add action command...",
+					U" ", my class1 -> className, U" ", my n1,
+					U" ", ( my class2 ? my class2 -> className : U"\"\"" ), U" ", my n2,
+					U" ", ( my class3 ? my class3 -> className : U"\"\"" ), U" ", my n3,
+					U" \"", my title, U"\" \"", ( my after ? my after : U"", U"\" " ), my depth);
+				MelderString_append (buffer, U" ", my script ? my script : U"", U"\n");
 				break;
 			}
 		}
 	for (long iaction = 1; iaction <= theNumberOfActions; iaction ++) {
 		praat_Command me = & theActions [iaction];
 		if (my toggled && my title && ! my uniqueID && ! my script) {
-			MelderString_append (buffer, my hidden ? L"Hide" : L"Show", L" action command...");
-			MelderString_append (buffer, L" ", my class1 -> className);
-			MelderString_append (buffer, L" ", my class2 ? my class2 -> className : L"\"\"");
-			MelderString_append (buffer, L" ", my class3 ? my class3 -> className : L"\"\"");
-			MelderString_append (buffer, L" ", my title, L"\n");
+			MelderString_append (buffer, ( my hidden ? U"Hide" : U"Show" ), U" action command...",
+				U" ", my class1 -> className,
+				U" ", ( my class2 ? my class2 -> className : U"\"\"" ),
+				U" ", ( my class3 ? my class3 -> className : U"\"\"" ),
+				U" ", my title, U"\n");
 		}
 	}
 }
 
-int praat_doAction (const wchar_t *command, const wchar_t *arguments, Interpreter interpreter) {
+int praat_doAction (const char32 *command, const char32 *arguments, Interpreter interpreter) {
 	long i = 1;
-	while (i <= theNumberOfActions && (! theActions [i]. executable || wcscmp (theActions [i]. title, command))) i ++;
-	if (i > theNumberOfActions) return 0;   /* Not found. */
-	theActions [i]. callback (NULL, 0, NULL, arguments, interpreter, command, false, NULL);
+	while (i <= theNumberOfActions && (! theActions [i]. executable || str32cmp (theActions [i]. title, command))) i ++;
+	if (i > theNumberOfActions) return 0;   // not found
+	theActions [i]. callback (nullptr, 0, nullptr, arguments, interpreter, command, false, nullptr);
 	return 1;
 }
 
-int praat_doAction (const wchar_t *command, int narg, Stackel args, Interpreter interpreter) {
+int praat_doAction (const char32 *command, int narg, Stackel args, Interpreter interpreter) {
 	long i = 1;
-	while (i <= theNumberOfActions && (! theActions [i]. executable || wcscmp (theActions [i]. title, command))) i ++;
-	if (i > theNumberOfActions) return 0;   /* Not found. */
-	theActions [i]. callback (NULL, narg, args, NULL, interpreter, command, false, NULL);
+	while (i <= theNumberOfActions && (! theActions [i]. executable || str32cmp (theActions [i]. title, command))) i ++;
+	if (i > theNumberOfActions) return 0;   // not found
+	theActions [i]. callback (nullptr, narg, args, nullptr, interpreter, command, false, nullptr);
 	return 1;
 }
 
-long praat_getNumberOfActions (void) { return theNumberOfActions; }
+long praat_getNumberOfActions () { return theNumberOfActions; }
 
 praat_Command praat_getAction (long i)
-	{ return i < 0 || i > theNumberOfActions ? NULL : & theActions [i]; }
+	{ return i < 0 || i > theNumberOfActions ? nullptr : & theActions [i]; }
 
-void praat_background (void) {
+void praat_background () {
 	if (Melder_batch) return;
 	if (Melder_backgrounding) return;
 	deleteDynamicMenu ();
@@ -771,7 +770,7 @@ void praat_background (void) {
 	if (! praatP.dontUsePictureWindow) praat_picture_background ();
 }
 
-void praat_foreground (void) {
+void praat_foreground () {
 	if (Melder_batch) return;
 	if (! Melder_backgrounding) return;
 	Melder_backgrounding = false;
diff --git a/sys/praat_logo.cpp b/sys/praat_logo.cpp
index 9d1c9bd..4c24619 100644
--- a/sys/praat_logo.cpp
+++ b/sys/praat_logo.cpp
@@ -1,6 +1,6 @@
 /* praat_logo.cpp
  *
- * Copyright (C) 1996-2012,2013,2014 Paul Boersma, 2008 Stefan de Konink
+ * Copyright (C) 1996-2012,2013,2014,2015 Paul Boersma, 2008 Stefan de Konink
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,11 +31,11 @@ static void logo_defaultDraw (Graphics g) {
 	Graphics_setFont (g, kGraphics_font_TIMES);
 	Graphics_setFontSize (g, 24);
 	Graphics_setFontStyle (g, Graphics_ITALIC);
-	Graphics_setUnderscoreIsSubscript (g, FALSE);   /* Because program names may contain underscores. */
-	Graphics_text (g, 0.5, 0.6, Melder_peekUtf8ToWcs (praatP.title));
+	Graphics_setUnderscoreIsSubscript (g, false);   // because program names may contain underscores
+	Graphics_text (g, 0.5, 0.6, praatP.title);
 	Graphics_setFontStyle (g, 0);
 	Graphics_setFontSize (g, 12);
-	Graphics_text (g, 0.5, 0.25, L"\\s{Built on the} %%Praat shell%\\s{,© Paul Boersma, 1992-2015");
+	Graphics_text (g, 0.5, 0.25, U"\\s{Built on the} %%Praat shell%\\s{,© Paul Boersma, 1992-2015");
 }
 
 static struct {
@@ -51,7 +51,7 @@ static struct {
 static void logo_timeOut (XtPointer closure, XtIntervalId *id) {
 	(void) closure;
 	(void) id;
- 	theLogo.form -> f_hide ();
+ 	GuiThing_hide (theLogo.form);
 }
 #endif
 
@@ -86,15 +86,15 @@ static void gui_drawingarea_cb_expose (I, GuiDrawingAreaExposeEvent event) {
 static void gui_drawingarea_cb_click (I, GuiDrawingAreaClickEvent event) {
 	(void) void_me;
 	(void) event;
- 	theLogo.form -> f_hide ();
+ 	GuiThing_hide (theLogo.form);
 }
 
 static void gui_cb_goAway (I) {
 	(void) void_me;
- 	theLogo.form -> f_hide ();
+ 	GuiThing_hide (theLogo.form);
 }
 
-void praat_showLogo (int autoPopDown) {
+void praat_showLogo (bool autoPopDown) {
 	#if gtk
 		static const gchar *authors [3] = { "Paul Boersma", "David Weenink", NULL };
 
@@ -102,9 +102,7 @@ void praat_showLogo (int autoPopDown) {
 		#define xstr(s) str(s)
 		#define str(s) #s
 		gtk_about_dialog_set_version (GTK_ABOUT_DIALOG (dialog), xstr (PRAAT_VERSION_STR));
-		static const wchar_t *copyright = Melder_utf8ToWcs ("Copyright © 1992–" xstr(PRAAT_YEAR) " by Paul Boersma and David Weenink");
-		gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (dialog),
-			Melder_peekWcsToUtf8 (copyright));
+		gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (dialog), "Copyright © 1992–" xstr(PRAAT_YEAR) " by Paul Boersma and David Weenink");
 		gtk_about_dialog_set_license (GTK_ABOUT_DIALOG (dialog), "GPL");
 		gtk_about_dialog_set_website (GTK_ABOUT_DIALOG (dialog), "http://www.praat.org");
 		//gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG (dialog), authors);
@@ -118,13 +116,13 @@ void praat_showLogo (int autoPopDown) {
 			int width  = theLogo.width_mm  / 25.4 * Gui_getResolution (NULL);
 			int height = theLogo.height_mm / 25.4 * Gui_getResolution (NULL);
 			theLogo.dia = GuiDialog_create (theCurrentPraatApplication -> topShell, 100, 100, width, height,
-				L"About", gui_cb_goAway, NULL, 0);
+				U"About", gui_cb_goAway, NULL, 0);
 			theLogo.form = theLogo.dia;
 			theLogo.drawingArea = GuiDrawingArea_createShown (theLogo.form, 0, width, 0, height,
 				gui_drawingarea_cb_expose, gui_drawingarea_cb_click, NULL, NULL, NULL, 0);
 		}
-		theLogo.form -> f_show ();
-		theLogo.dia -> f_show ();
+		GuiThing_show (theLogo.form);
+		GuiThing_show (theLogo.dia);
 		#if motif
 			if (autoPopDown)
 				GuiAddTimeOut (2000, logo_timeOut, (XtPointer) NULL);
diff --git a/sys/praat_menuCommands.cpp b/sys/praat_menuCommands.cpp
index 6716baf..c74295d 100644
--- a/sys/praat_menuCommands.cpp
+++ b/sys/praat_menuCommands.cpp
@@ -1,6 +1,6 @@
 /* praat_menuCommands.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 static long theNumberOfCommands = 0;
 static struct structPraat_Command *theCommands;
 
-void praat_menuCommands_init (void) {
+void praat_menuCommands_init () {
 	theCommands = Melder_calloc_f (struct structPraat_Command, praat_MAXNUM_FIXED_COMMANDS + 1);
 }
 
@@ -34,71 +34,69 @@ static int compareMenuCommands (const void *void_me, const void *void_thee) {
 	int compare;
 	if (my window) {
 		if (! thy window) return 1;
-		compare = wcscmp (my window, thy window);
+		compare = str32cmp (my window, thy window);
 		if (compare) return compare;
 	} else if (thy window) return -1;
 	if (my menu) {
 		if (! thy menu) return 1;
-		compare = wcscmp (my menu, thy menu);
+		compare = str32cmp (my menu, thy menu);
 		if (compare) return compare;
 	} else if (thy menu) return -1;
 	if (my sortingTail < thy sortingTail) return -1;
 	return 1;
 }
 
-void praat_sortMenuCommands (void) {
+void praat_sortMenuCommands () {
 	for (long i = 1; i <= theNumberOfCommands; i ++)
 		theCommands [i]. sortingTail = i;
 	qsort (& theCommands [1], theNumberOfCommands, sizeof (struct structPraat_Command), compareMenuCommands);
 }
 
-static long lookUpMatchingMenuCommand (const wchar_t *window, const wchar_t *menu, const wchar_t *title) {
+static long lookUpMatchingMenuCommand (const char32 *window, const char32 *menu, const char32 *title) {
 /*
  * A menu command is fully specified by its environment (window + menu) and its title.
  */
 	for (long i = 1; i <= theNumberOfCommands; i ++) {
-		const wchar_t *tryWindow = theCommands [i]. window;
-		const wchar_t *tryMenu = theCommands [i]. menu;
-		const wchar_t *tryTitle = theCommands [i]. title;
-		if ((window == tryWindow || (window && tryWindow && wcsequ (window, tryWindow))) &&
-		    (menu == tryMenu || (menu && tryMenu && wcsequ (menu, tryMenu))) &&
-		    (title == tryTitle || (title && tryTitle && wcsequ (title, tryTitle)))) return i;
+		const char32 *tryWindow = theCommands [i]. window;
+		const char32 *tryMenu = theCommands [i]. menu;
+		const char32 *tryTitle = theCommands [i]. title;
+		if ((window == tryWindow || (window && tryWindow && str32equ (window, tryWindow))) &&
+		    (menu == tryMenu || (menu && tryMenu && str32equ (menu, tryMenu))) &&
+		    (title == tryTitle || (title && tryTitle && str32equ (title, tryTitle)))) return i;
 	}
 	return 0;   // not found
 }
 
 static void do_menu (I, unsigned long modified) {
-	void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *) = (void (*) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *)) void_me;
+	UiCallback callback = (UiCallback) void_me;
 	Melder_assert (callback != NULL);
 	for (long i = 1; i <= theNumberOfCommands; i ++) {
 		praat_Command me = & theCommands [i];
 		if (my callback == callback) {
-			if (my title != NULL && ! wcsstr (my title, L"...")) {
-				UiHistory_write (L"\n");
+			if (my title != NULL && ! str32str (my title, U"...")) {
+				UiHistory_write (U"\n");
 				UiHistory_write_expandQuotes (my title);
 			}
 			try {
 				callback (NULL, 0, NULL, NULL, NULL, my title, modified, NULL);
 			} catch (MelderError) {
-				Melder_error_ ("Command \"", my title, "\" not executed.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Command \"", my title, U"\" not executed.");
 			}
 			praat_updateSelection (); return;
 		}
 		if (my callback == DO_RunTheScriptFromAnyAddedMenuCommand && my script == (void *) void_me) {
-			if (my title != NULL && ! wcsstr (my title, L"...")) {
-				UiHistory_write (L"\nexecute ");
+			if (my title != NULL && ! str32str (my title, U"...")) {
+				UiHistory_write (U"\nexecute ");
 				UiHistory_write (my script);
 			} else {
-				UiHistory_write (L"\nexecute \"");
+				UiHistory_write (U"\nexecute \"");
 				UiHistory_write (my script);
-				UiHistory_write (L"\"");
+				UiHistory_write (U"\"");
 			}
 			try {
 				DO_RunTheScriptFromAnyAddedMenuCommand (NULL, 0, NULL, my script, NULL, NULL, false, NULL);
 			} catch (MelderError) {
-				Melder_error_ ("Command \"", my title, "\" not executed.");
-				Melder_flushError (NULL);
+				Melder_flushError (U"Command \"", my title, U"\" not executed.");
 			}
 			praat_updateSelection (); return;
 		}
@@ -114,17 +112,18 @@ static void gui_cb_menu (GUI_ARGS) {
 	do_menu (void_me, modified);
 }
 
-static GuiMenu windowMenuToWidget (const wchar_t *window, const wchar_t *menu) {
+static GuiMenu windowMenuToWidget (const char32 *window, const char32 *menu) {
 	return
-		wcsequ (window, L"Picture") ? praat_picture_resolveMenu (menu) :
-		wcsequ (window, L"Objects") ? praat_objects_resolveMenu (menu) : NULL;
+		str32equ (window, U"Picture") ? praat_picture_resolveMenu (menu) :
+		str32equ (window, U"Objects") ? praat_objects_resolveMenu (menu) : NULL;
 }
 
-GuiMenuItem praat_addMenuCommand (const wchar_t *window, const wchar_t *menu, const wchar_t *title,
-	const wchar_t *after, unsigned long flags, void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *))
+GuiMenuItem praat_addMenuCommand (const char32 *window, const char32 *menu, const char32 *title /* cattable */,
+	const char32 *after, unsigned long flags, UiCallback callback)
 {
 	long position;
-	int depth = flags, unhidable = FALSE, hidden = FALSE, key = 0;
+	int depth = flags, key = 0;
+	bool unhidable = false, hidden = false;
 	unsigned long guiFlags = 0;
 	if (flags > 7) {
 		depth = ((flags & praat_DEPTH_7) >> 16);
@@ -134,45 +133,46 @@ GuiMenuItem praat_addMenuCommand (const wchar_t *window, const wchar_t *menu, co
 		guiFlags = key ? flags & (0x006000FF | GuiMenu_BUTTON_STATE_MASK) : flags & GuiMenu_BUTTON_STATE_MASK;
 	}
 	if (callback && ! title) {
-		Melder_error_ ("praat_addMenuCommand: command with callback has no title. Window \"", window, "\", menu \"", menu, "\".");
-		Melder_flushError (NULL);
+		Melder_flushError (U"praat_addMenuCommand: command with callback has no title. Window \"", window, U"\", menu \"", menu, U"\".");
 		return NULL;
 	}
 
-	/* Determine the position of the new command.
+	/*
+	 * Determine the position of the new command.
 	 */
-	if (after) {   /* Search for existing command with same selection. */
+	if (after) {   // search for existing command with same selection
 		long found = lookUpMatchingMenuCommand (window, menu, after);
 		if (found) {
 			position = found + 1;   // after 'after'
 		} else {
-			Melder_error_ ("praat_addMenuCommand: the command \"", title, "\" cannot be put after \"", after, "\",\n"
-				"in the menu \"", menu, "\" in the window \"", window, "\"\n"
-				"because the latter command does not exist.");
-			Melder_flushError (NULL);
+			Melder_flushError (U"praat_addMenuCommand: the command \"", title, U"\" cannot be put after \"", after, U"\",\n"
+				U"in the menu \"", menu, U"\" in the window \"", window, U"\"\n"
+				U"because the latter command does not exist.");
 			return NULL;
 		}
 	} else {
 		position = theNumberOfCommands + 1;   // at end
 	}
 
-	/* Increment the command area.
+	/*
+	 * Increment the command area.
 	 */
 	if (theNumberOfCommands >= praat_MAXNUM_FIXED_COMMANDS) {
-		Melder_flushError ("praat_addMenuCommand: too many menu commands.");
+		Melder_flushError (U"praat_addMenuCommand: too many menu commands.");
 		return NULL;
 	}
 	theNumberOfCommands += 1;
 
-	/* Make room for insertion.
+	/*
+	 * Make room for insertion.
 	 */
 	for (long i = theNumberOfCommands; i > position; i --) theCommands [i] = theCommands [i - 1];
 	memset (& theCommands [position], 0, sizeof (struct structPraat_Command));
 
-	trace ("insert new command \"%ls\"", title);
-	theCommands [position]. window = Melder_wcsdup_f (window);
-	theCommands [position]. menu = Melder_wcsdup_f (menu);
-	theCommands [position]. title = Melder_wcsdup_f (title);
+	theCommands [position]. window = Melder_dup_f (window);
+	theCommands [position]. menu = Melder_dup_f (menu);
+	theCommands [position]. title = Melder_dup_f (title);
+	trace (U"insert new command \"", title, U"\"");
 	theCommands [position]. depth = depth;
 	theCommands [position]. callback = callback;   // NULL for a separator or cascade button
 	theCommands [position]. executable = callback != NULL;
@@ -205,7 +205,7 @@ GuiMenuItem praat_addMenuCommand (const wchar_t *window, const wchar_t *menu, co
 					 */
 					if (theCommands [parentPosition]. callback == NULL && theCommands [parentPosition]. title != NULL && theCommands [parentPosition]. title [0] != '-') {
 						if (theCommands [parentPosition]. button == NULL)
-							Melder_fatal ("No button for %ls/%ls/%ls.", window, menu, title);
+							Melder_fatal (U"No button for ", window, U"/", menu, U"/", title, U".");
 						Thing_cast (GuiMenuItem, parentButton_as_GuiMenuItem, theCommands [parentPosition]. button);
 						parentMenu = parentButton_as_GuiMenuItem -> d_menu;
 					}
@@ -215,52 +215,53 @@ GuiMenuItem praat_addMenuCommand (const wchar_t *window, const wchar_t *menu, co
 			if (! parentMenu) parentMenu = windowMenuToWidget (window, menu);   // fallback: put the command in the window's top menu
 		}
 		if (! parentMenu) {
-			trace ("WARNING: no parent menu for %ls/%ls/%ls.", window, menu, title);
+			trace (U"WARNING: no parent menu for ", window, U"/", menu, U"/", title, U".");
 			return NULL;
 		}
 
-		/* WHAT TO PUT THERE?
+		/*
+		 * WHAT TO PUT THERE?
 		 */
 
-		if (title == NULL || title [0] == '-') {
-			trace ("insert the command as a separator");
+		if (title == NULL || title [0] == U'-') {
+			trace (U"insert the command as a separator");
 			theCommands [position]. button = GuiMenu_addSeparator (parentMenu);
 			Melder_assert (theCommands [position]. button != NULL);
 		} else if (callback == NULL) {
-			trace ("insert the command as a submenu");
+			trace (U"insert the command as a submenu");
 			theCommands [position]. button = GuiMenu_createInMenu (parentMenu, title, 0) -> d_menuItem;
 			Melder_assert (theCommands [position]. button != NULL);
 		} else {
-			trace ("insert the command as a normal menu item");
+			trace (U"insert the command as a normal menu item");
 			theCommands [position]. button = GuiMenu_addItem (parentMenu, title, guiFlags, gui_cb_menu, (void *) callback);
 			Melder_assert (theCommands [position]. button != NULL);
 		}
-		if (hidden) theCommands [position]. button -> f_hide ();
+		if (hidden) GuiThing_hide (theCommands [position]. button);
 	}
 	Thing_cast (GuiMenuItem, button_as_GuiMenuItem, theCommands [position]. button);
 	return button_as_GuiMenuItem;
 }
 
-void praat_addMenuCommandScript (const wchar_t *window, const wchar_t *menu, const wchar_t *title,
-	const wchar_t *after, int depth, const wchar_t *script)
+void praat_addMenuCommandScript (const char32 *window, const char32 *menu, const char32 *title,
+	const char32 *after, int depth, const char32 *script)
 {
 	try {
 		Melder_assert (window && menu && title && after && script);
-		if (wcslen (script) && ! wcslen (title))
-			Melder_throw ("Command with script has no title. Window \"", window, "\", menu \"", menu, "\".");
+		if (str32len (script) && ! str32len (title))
+			Melder_throw (U"Command with script has no title. Window \"", window, U"\", menu \"", menu, U"\".");
 
 		/*
 		 * Determine the position of the new command.
 		 */
 		long position;
-		if (wcslen (after)) {   /* Search for existing command with same selection. */
+		if (str32len (after)) {   // search for existing command with same selection
 			long found = lookUpMatchingMenuCommand (window, menu, after);
 			if (found) {
-				position = found + 1;   /* After 'after'. */
+				position = found + 1;   // after 'after'
 			} else {
-				/*Melder_throw ("The menu command \"", title, "\" cannot be put after \"", after, "\",\n"
-					"in the menu \"", menu, "\" in the window \"", window, "\"\n"
-					"because the latter command does not exist.", title, after, menu, window);*/
+				/*Melder_throw (U"The menu command \"", title, U"\" cannot be put after \"", after, U"\",\n"
+					U"in the menu \"", menu, "\" in the window \"", window, U"\"\n"
+					U"because the latter command does not exist.");*/
 				position = theNumberOfCommands + 1;   // default: at end
 			}
 		} else {
@@ -271,7 +272,7 @@ void praat_addMenuCommandScript (const wchar_t *window, const wchar_t *menu, con
 		 * Increment the command area.
 		 */
 		if (theNumberOfCommands >= praat_MAXNUM_FIXED_COMMANDS)
-			Melder_throw ("Too many menu commands (maximum ", praat_MAXNUM_FIXED_COMMANDS, ").");
+			Melder_throw (U"Too many menu commands (maximum ", praat_MAXNUM_FIXED_COMMANDS, U").");
 		theNumberOfCommands += 1;
 
 		/*
@@ -283,20 +284,20 @@ void praat_addMenuCommandScript (const wchar_t *window, const wchar_t *menu, con
 		/*
 		 * Insert new command.
 		 */
-		theCommands [position]. window = Melder_wcsdup_f (window);
-		theCommands [position]. menu = Melder_wcsdup_f (menu);
-		theCommands [position]. title = wcslen (title) ? Melder_wcsdup_f (title) : NULL;   /* Allow old-fashioned untitled separators. */
+		theCommands [position]. window = Melder_dup_f (window);
+		theCommands [position]. menu = Melder_dup_f (menu);
+		theCommands [position]. title = str32len (title) ? Melder_dup_f (title) : NULL;   // allow old-fashioned untitled separators
 		theCommands [position]. depth = depth;
-		theCommands [position]. callback = wcslen (script) ? DO_RunTheScriptFromAnyAddedMenuCommand : NULL;   /* NULL for a separator or cascade button. */
-		theCommands [position]. executable = wcslen (script) != 0;
-		if (wcslen (script) == 0) {
-			theCommands [position]. script = Melder_wcsdup_f (L"");   /* Empty string, which will be needed to signal origin. */
+		theCommands [position]. callback = str32len (script) ? DO_RunTheScriptFromAnyAddedMenuCommand : NULL;   // NULL for a separator or cascade button
+		theCommands [position]. executable = str32len (script) != 0;
+		if (str32len (script) == 0) {
+			theCommands [position]. script = Melder_dup_f (U"");   // Empty string, which will be needed to signal origin
 		} else {
 			structMelderFile file = { 0 };
 			Melder_relativePathToFile (script, & file);
-			theCommands [position]. script = Melder_wcsdup_f (Melder_fileToPath (& file));
+			theCommands [position]. script = Melder_dup_f (Melder_fileToPath (& file));
 		}
-		theCommands [position]. after = wcslen (after) ? Melder_wcsdup_f (after) : NULL;
+		theCommands [position]. after = str32len (after) ? Melder_dup_f (after) : NULL;
 		if (praatP.phase >= praat_READING_BUTTONS) {
 			static long uniqueID = 0;
 			theCommands [position]. uniqueID = ++ uniqueID;
@@ -311,20 +312,20 @@ void praat_addMenuCommandScript (const wchar_t *window, const wchar_t *menu, con
 			 * if 'depth' is inappropriate, the alleged subitem will be put in the top menu.
 			 */
 			if (depth == 0) {
-				parentMenu = windowMenuToWidget (window, menu);   /* Not a subitem: in the top menu. */
+				parentMenu = windowMenuToWidget (window, menu);   // not a subitem: in the top menu
 			} else {
 				for (long parentPosition = position - 1; parentPosition > 0; parentPosition --) {
 					if (theCommands [parentPosition]. depth == depth - 1) {
 						if (theCommands [parentPosition]. callback == NULL && theCommands [parentPosition]. title != NULL && theCommands [parentPosition]. title [0] != '-') {
 							if (theCommands [parentPosition]. button == NULL)
-								Melder_fatal ("No button for %ls/%ls/%ls.", window, menu, title);
+								Melder_fatal (U"No button for ", window, U"/", menu, U"/", title, U".");
 							Melder_assert (theCommands [parentPosition]. button -> classInfo == classGuiMenuItem);
 							parentMenu = (static_cast <GuiMenuItem> (theCommands [parentPosition]. button)) -> d_menu;
 						}
 						break;
 					}
 				}
-				if (! parentMenu) parentMenu = windowMenuToWidget (window, menu);   /* Fallback: a subitem without a menu title. */
+				if (! parentMenu) parentMenu = windowMenuToWidget (window, menu);   // fallback: a subitem without a menu title
 			}
 			if (parentMenu) {
 				/* WHAT TO PUT THERE?
@@ -334,114 +335,115 @@ void praat_addMenuCommandScript (const wchar_t *window, const wchar_t *menu, con
 				} else if (script [0] == '\0') {
 					theCommands [position]. button = GuiMenu_createInMenu (parentMenu, title, 0) -> d_menuItem;
 				} else {
-					theCommands [position]. button = GuiMenu_addItem (parentMenu, title, 0, gui_cb_menu, (void *) theCommands [position]. script);   /* Not just "script"!! */
+					theCommands [position]. button = GuiMenu_addItem (parentMenu, title, 0, gui_cb_menu, (void *) theCommands [position]. script);   // not just "script"!!
 				}
 			}
 		}
 
 		if (praatP.phase >= praat_HANDLING_EVENTS) praat_sortMenuCommands ();
 	} catch (MelderError) {
-		Melder_throw ("Script menu command not added.");
+		Melder_throw (U"Script menu command not added.");
 	}
 }
 
-void praat_hideMenuCommand (const wchar_t *window, const wchar_t *menu, const wchar_t *title) {
+void praat_hideMenuCommand (const char32 *window, const char32 *menu, const char32 *title) {
 	if (theCurrentPraatApplication -> batch || ! window || ! menu || ! title) return;
 	long found = lookUpMatchingMenuCommand (window, menu, title);
 	if (! found) return;
 	praat_Command command = & theCommands [found];
 	if (! command -> hidden && ! command -> unhidable) {
-		command -> hidden = TRUE;
+		command -> hidden = true;
 		if (praatP.phase >= praat_READING_BUTTONS) command -> toggled = ! command -> toggled;
-		if (command -> button) command -> button -> f_hide ();
+		if (command -> button) GuiThing_hide (command -> button);
 	}
 }
 
-void praat_showMenuCommand (const wchar_t *window, const wchar_t *menu, const wchar_t *title) {
+void praat_showMenuCommand (const char32 *window, const char32 *menu, const char32 *title) {
 	if (theCurrentPraatApplication -> batch || ! window || ! menu || ! title) return;
 	long found = lookUpMatchingMenuCommand (window, menu, title);
 	if (! found) return;
 	praat_Command command = & theCommands [found];
 	if (command -> hidden) {
-		command -> hidden = FALSE;
+		command -> hidden = false;
 		if (praatP.phase >= praat_READING_BUTTONS) command -> toggled = ! command -> toggled;
-		if (command -> button) command -> button -> f_show ();
+		if (command -> button) GuiThing_show (command -> button);
 	}
 }
 
 void praat_saveMenuCommands (MelderString *buffer) {
 	long maxID = 0;
 	for (long i = 1; i <= theNumberOfCommands; i ++) if (theCommands [i]. uniqueID > maxID) maxID = theCommands [i]. uniqueID;
-	for (long id = 1; id <= maxID; id ++)   /* Sorted. */
+	for (long id = 1; id <= maxID; id ++)   // sorted
 		for (long i = 1; i <= theNumberOfCommands; i ++) {
 			praat_Command me = & theCommands [i];
 			if (my uniqueID == id && ! my hidden && my window && my menu && my title) {
-				MelderString_append (buffer, L"Add menu command... \"", my window, L"\" \"", my menu, L"\" \"", my title, L"\" \"");
-				MelderString_append (buffer, my after ? my after : L"", L"\" ", Melder_integer (my depth), L" ", my script ? my script : L"", L"\n");
+				MelderString_append (buffer, U"Add menu command... \"", my window, U"\" \"", my menu, U"\" \"", my title, U"\" \"",
+					( my after ? my after : U"" ), U"\" ", my depth, U" ", ( my script ? my script : U"" ), U"\n");
 				break;
 			}
 		}
 	for (long i = 1; i <= theNumberOfCommands; i ++) {
 		praat_Command me = & theCommands [i];
 		if (my toggled && my window && my menu && my title && ! my uniqueID && ! my script)
-			MelderString_append (buffer, my hidden ? L"Hide" : L"Show", L" menu command... \"",
-				my window, L"\" \"", my menu, L"\" ", my title, L"\n");
+			MelderString_append (buffer, my hidden ? U"Hide" : U"Show", U" menu command... \"",
+				my window, U"\" \"", my menu, U"\" ", my title, U"\n");
 	}
 }
 
 /***** FIXED BUTTONS *****/
 
-void praat_addFixedButtonCommand (GuiForm parent, const wchar_t *title, void (*callback) (UiForm, int, Stackel, const wchar_t *, Interpreter, const wchar_t *, bool, void *), int x, int y) {
+void praat_addFixedButtonCommand (GuiForm parent, const char32 *title, UiCallback callback, int x, int y) {
 	praat_Command me = & theCommands [++ theNumberOfCommands];
-	my window = Melder_wcsdup_f (L"Objects");
+	my window = Melder_dup_f (U"Objects");
 	my title = title;
 	my callback = callback;
-	my unhidable = TRUE;
+	my unhidable = true;
 	if (theCurrentPraatApplication -> batch) {
 		my button = NULL;
 	} else {
 		GuiThing button = my button = GuiButton_create (parent, x, x + 82, -y - Gui_PUSHBUTTON_HEIGHT, -y,
 			title, gui_button_cb_menu, (void *) callback, 0);   // BUG: shouldn't convert a function pointer to a void pointer
-		button -> f_setSensitive (false);
-		button -> f_show ();
+		GuiThing_setSensitive (button, false);
+		GuiThing_show (button);
 	}
 	my executable = false;
 }
 
-void praat_sensitivizeFixedButtonCommand (const wchar_t *title, int sensitive) {
+void praat_sensitivizeFixedButtonCommand (const char32 *title, int sensitive) {
 	long i = 1;
 	for (; i <= theNumberOfCommands; i ++)
-		if (wcsequ (theCommands [i]. title, title)) break;   // search
+		if (str32equ (theCommands [i]. title, title)) break;   // search
 	theCommands [i]. executable = sensitive;
-	if (! theCurrentPraatApplication -> batch && ! Melder_backgrounding) theCommands [i]. button -> f_setSensitive (sensitive);
+	if (! theCurrentPraatApplication -> batch && ! Melder_backgrounding)
+		GuiThing_setSensitive (theCommands [i]. button, sensitive);
 }
 
-int praat_doMenuCommand (const wchar_t *command, const wchar_t *arguments, Interpreter interpreter) {
+int praat_doMenuCommand (const char32 *command, const char32 *arguments, Interpreter interpreter) {
 	long i = 1;
-	while (i <= theNumberOfCommands && (! theCommands [i]. executable || ! wcsequ (theCommands [i]. title, command) ||
-		(! wcsequ (theCommands [i]. window, L"Objects") && ! wcsequ (theCommands [i]. window, L"Picture")))) i ++;
+	while (i <= theNumberOfCommands && (! theCommands [i]. executable || ! str32equ (theCommands [i]. title, command) ||
+		(! str32equ (theCommands [i]. window, U"Objects") && ! str32equ (theCommands [i]. window, U"Picture")))) i ++;
 	if (i > theNumberOfCommands) return 0;
 	theCommands [i]. callback (NULL, 0, NULL, arguments, interpreter, command, false, NULL);
 	return 1;
 }
 
-int praat_doMenuCommand (const wchar_t *command, int narg, Stackel args, Interpreter interpreter) {
+int praat_doMenuCommand (const char32 *command, int narg, Stackel args, Interpreter interpreter) {
 	long i = 1;
-	while (i <= theNumberOfCommands && (! theCommands [i]. executable || ! wcsequ (theCommands [i]. title, command) ||
-		(! wcsequ (theCommands [i]. window, L"Objects") && ! wcsequ (theCommands [i]. window, L"Picture")))) i ++;
+	while (i <= theNumberOfCommands && (! theCommands [i]. executable || ! str32equ (theCommands [i]. title, command) ||
+		(! str32equ (theCommands [i]. window, U"Objects") && ! str32equ (theCommands [i]. window, U"Picture")))) i ++;
 	if (i > theNumberOfCommands) return 0;
 	theCommands [i]. callback (NULL, narg, args, NULL, interpreter, command, false, NULL);
 	return 1;
 }
 
-long praat_getNumberOfMenuCommands (void) { return theNumberOfCommands; }
+long praat_getNumberOfMenuCommands () { return theNumberOfCommands; }
 
 praat_Command praat_getMenuCommand (long i)
 	{ return i < 1 || i > theNumberOfCommands ? NULL : & theCommands [i]; }
 
 void praat_addCommandsToEditor (Editor me) {
-	const wchar_t *windowName = my classInfo -> className;
-	for (long i = 1; i <= theNumberOfCommands; i ++) if (wcsequ (theCommands [i]. window, windowName)) {
+	const char32 *windowName = my classInfo -> className;
+	for (long i = 1; i <= theNumberOfCommands; i ++) if (str32equ (theCommands [i]. window, windowName)) {
 		Editor_addCommandScript (me, theCommands [i]. menu, theCommands [i]. title, 0, theCommands [i]. script);
 	}
 }
diff --git a/sys/praat_objectMenus.cpp b/sys/praat_objectMenus.cpp
index f0b3439..d3a13bf 100644
--- a/sys/praat_objectMenus.cpp
+++ b/sys/praat_objectMenus.cpp
@@ -1,6 +1,6 @@
 /* praat_objectMenus.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,6 +25,7 @@
 #include "DataEditor.h"
 #include "site.h"
 #include "GraphicsP.h"
+//#include <string>
 
 #undef iam
 #define iam iam_LOOP
@@ -33,117 +34,126 @@
 
 /********** Callbacks of the fixed buttons. **********/
 
-DIRECT (Remove)
+DIRECT2 (Remove) {
 	WHERE_DOWN (SELECTED)
 		praat_removeObject (IOBJECT);
 	praat_show ();
-END
+END2 }
 
-FORM (Rename, L"Rename object", L"Rename...")
-	LABEL (L"rename object", L"New name:")
-	TEXTFIELD (L"newName", L"")
-	OK
-{ int IOBJECT; WHERE (SELECTED) SET_STRING (L"newName", NAME) }
+FORM (Rename, U"Rename object", U"Rename...") {
+	LABEL (U"rename object", U"New name:")
+	TEXTFIELD (U"newName", U"")
+	OK2
+{ int IOBJECT; WHERE (SELECTED) SET_STRING (U"newName", NAME) }
 DO
-	wchar_t *string = GET_STRING (L"newName");
+	char32 *string = GET_STRING (U"newName");
 	if (theCurrentPraatObjects -> totalSelection == 0)
-		Melder_throw ("Selection changed!\nNo object selected. Cannot rename.");
+		Melder_throw (U"Selection changed!\nNo object selected. Cannot rename.");
 	if (theCurrentPraatObjects -> totalSelection > 1)
-		Melder_throw (L"Selection changed!\nCannot rename more than one object at a time.");
+		Melder_throw (U"Selection changed!\nCannot rename more than one object at a time.");
 	WHERE (SELECTED) break;
-	praat_cleanUpName (string);   /* This is allowed because "string" is local and dispensible. */
-	static MelderString fullName = { 0 };
-	MelderString_empty (& fullName);
-	MelderString_append (& fullName, Thing_className ((Thing) OBJECT), L" ", string);
-	if (! wcsequ (fullName.string, FULL_NAME)) {
-		Melder_free (FULL_NAME), FULL_NAME = Melder_wcsdup_f (fullName.string);
-		MelderString listName = { 0 };
-		MelderString_append (& listName, Melder_integer (ID), L". ", fullName.string);
+	praat_cleanUpName (string);   // this is allowed because "string" is local and dispensible
+	#if 0
+	std::u32string newFullName = std::u32string (Thing_className (OBJECT) + U" " + string;
+	if (newFullName != std::u32string (FULL_NAME)) {
+		Melder_free (FULL_NAME), FULL_NAME = Melder_dup_f (newFullName.c_str());
+		praat_list_renameAndSelect (IOBJECT, (std::u32string (Melder_integer (ID)) + U". " + newFullName). c_str());
+		for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++)
+			if (EDITOR [ieditor]) Thing_setName (EDITOR [ieditor], newFullName.c_str());
+		Thing_setName (OBJECT, string);
+	}
+	#else
+	static MelderString fullName { 0 };
+	MelderString_copy (& fullName, Thing_className (OBJECT), U" ", string);
+	if (! str32equ (fullName.string, FULL_NAME)) {
+		Melder_free (FULL_NAME), FULL_NAME = Melder_dup_f (fullName.string);
+		autoMelderString listName;
+		MelderString_append (& listName, ID, U". ", fullName.string);
 		praat_list_renameAndSelect (IOBJECT, listName.string);
-		MelderString_free (& listName);
 		for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++)
-			if (EDITOR [ieditor]) Thing_setName ((Thing) EDITOR [ieditor], fullName.string);
-		Thing_setName ((Thing) OBJECT, string);
+			if (EDITOR [ieditor]) Thing_setName (EDITOR [ieditor], fullName.string);
+		Thing_setName (OBJECT, string);
 	}
-END
+	#endif
+END2 }
 
-FORM (Copy, L"Copy object", L"Copy...")
-	LABEL (L"copy object", L"Name of new object:")
-	TEXTFIELD (L"newName", L"")
-	OK
-{ int IOBJECT; WHERE (SELECTED) SET_STRING (L"newName", NAME) }
+FORM (Copy, U"Copy object", U"Copy...") {
+	LABEL (U"copy object", U"Name of new object:")
+	TEXTFIELD (U"newName", U"")
+	OK2
+{ int IOBJECT; WHERE (SELECTED) SET_STRING (U"newName", NAME) }
 DO
 	if (theCurrentPraatObjects -> totalSelection == 0)
-		Melder_throw ("Selection changed!\nNo object selected. Cannot copy.");
+		Melder_throw (U"Selection changed!\nNo object selected. Cannot copy.");
 	if (theCurrentPraatObjects -> totalSelection > 1)
-		Melder_throw ("Selection changed!\nCannot copy more than one object at a time.");
+		Melder_throw (U"Selection changed!\nCannot copy more than one object at a time.");
 	WHERE (SELECTED) {
-		wchar_t *name = GET_STRING (L"newName");
-		praat_new (Data_copy ((Data) OBJECT), name);
+		char32 *name = GET_STRING (U"newName");
+		praat_new (Data_copy ((Daata) OBJECT), name);
 	}
-END
+END2 }
 
-DIRECT (Info)
+DIRECT2 (Info) {
 	if (theCurrentPraatObjects -> totalSelection == 0)
-		Melder_throw ("Selection changed!\nNo object selected. Cannot query.");
+		Melder_throw (U"Selection changed!\nNo object selected. Cannot query.");
 	if (theCurrentPraatObjects -> totalSelection > 1)
-		Melder_throw ("Selection changed!\nCannot query more than one object at a time.");
-	WHERE (SELECTED) Thing_infoWithId ((Thing) OBJECT, ID);
-END
+		Melder_throw (U"Selection changed!\nCannot query more than one object at a time.");
+	WHERE (SELECTED) Thing_infoWithIdAndFile (OBJECT, ID, & theCurrentPraatObjects -> list [IOBJECT]. file);
+END2 }
 
-DIRECT (Inspect)
+DIRECT2 (Inspect) {
 	if (theCurrentPraatObjects -> totalSelection == 0)
-		Melder_throw ("Selection changed!\nNo object selected. Cannot inspect.");
+		Melder_throw (U"Selection changed!\nNo object selected. Cannot inspect.");
 	if (theCurrentPraatApplication -> batch) {
-		Melder_throw ("Cannot inspect data from batch.");
+		Melder_throw (U"Cannot inspect data from batch.");
 	} else {
 		WHERE (SELECTED) {
 			praat_installEditor (DataEditor_create (ID_AND_FULL_NAME, OBJECT), IOBJECT);
 		}
 	}
-END
+END2 }
 
 /********** The fixed menus. **********/
 
 static GuiMenu praatMenu, editMenu, windowMenu, newMenu, readMenu, goodiesMenu, preferencesMenu, technicalMenu, applicationHelpMenu, helpMenu;
 
-GuiMenu praat_objects_resolveMenu (const wchar_t *menu) {
+GuiMenu praat_objects_resolveMenu (const char32 *menu) {
 	return
-		wcsequ (menu, L"Praat") || wcsequ (menu, L"Control") ? praatMenu :
+		str32equ (menu, U"Praat") || str32equ (menu, U"Control") ? praatMenu :
 		#if cocoa
-			wcsequ (menu, L"Edit") ? editMenu :
-			wcsequ (menu, L"Window") ? windowMenu :
+			str32equ (menu, U"Edit") ? editMenu :
+			str32equ (menu, U"Window") ? windowMenu :
 		#endif
-		wcsequ (menu, L"New") || wcsequ (menu, L"Create") ? newMenu :
-		wcsequ (menu, L"Open") || wcsequ (menu, L"Read") ? readMenu :
-		wcsequ (menu, L"Help") ? helpMenu :
-		wcsequ (menu, L"Goodies") ? goodiesMenu :
-		wcsequ (menu, L"Preferences") ? preferencesMenu :
-		wcsequ (menu, L"Technical") ? technicalMenu :
+		str32equ (menu, U"New") || str32equ (menu, U"Create") ? newMenu :
+		str32equ (menu, U"Open") || str32equ (menu, U"Read") ? readMenu :
+		str32equ (menu, U"Help") ? helpMenu :
+		str32equ (menu, U"Goodies") ? goodiesMenu :
+		str32equ (menu, U"Preferences") ? preferencesMenu :
+		str32equ (menu, U"Technical") ? technicalMenu :
 		#ifdef macintosh
-			wcsequ (menu, L"ApplicationHelp") ? applicationHelpMenu :
+			str32equ (menu, U"ApplicationHelp") ? applicationHelpMenu :
 		#else
-			wcsequ (menu, L"ApplicationHelp") ? helpMenu :
+			str32equ (menu, U"ApplicationHelp") ? helpMenu :
 		#endif
 		newMenu;   /* Default. */
 }
 
 /********** Callbacks of the Praat menu. **********/
 
-DIRECT (About)
-	praat_showLogo (FALSE);
-END
+DIRECT2 (About) {
+	praat_showLogo (false);
+END2 }
 
-DIRECT (praat_newScript)
+DIRECT2 (praat_newScript) {
 	autoScriptEditor editor = ScriptEditor_createFromText (NULL, NULL);
 	editor.transfer();   // the user becomes the owner
-END
+END2 }
 
-DIRECT (praat_openScript)
+DIRECT2 (praat_openScript) {
 	autoScriptEditor editor = ScriptEditor_createFromText (NULL, NULL);
 	TextEditor_showOpen (editor.peek());
 	editor.transfer();   // the user becomes the owner
-END
+END2 }
 
 static ButtonEditor theButtonEditor;
 
@@ -153,141 +163,140 @@ static void cb_ButtonEditor_destruction (Editor editor, void *closure) {
 	theButtonEditor = NULL;
 }
 
-DIRECT (praat_editButtons)
+DIRECT2 (praat_editButtons) {
 	if (theButtonEditor) {
-		theButtonEditor -> raise ();
+		Editor_raise (theButtonEditor);
 	} else {
 		theButtonEditor = ButtonEditor_create ();
-		theButtonEditor -> setDestructionCallback (cb_ButtonEditor_destruction, NULL);
+		Editor_setDestructionCallback (theButtonEditor, cb_ButtonEditor_destruction, NULL);
 	}
-END
-
-FORM (praat_addMenuCommand, L"Add menu command", L"Add menu command...")
-	WORD (L"Window", L"Objects")
-	WORD (L"Menu", L"New")
-	SENTENCE (L"Command", L"Hallo...")
-	SENTENCE (L"After command", L"")
-	INTEGER (L"Depth", L"0")
-	LABEL (L"", L"Script file:")
-	TEXTFIELD (L"Script", L"/u/miep/hallo.praat")
-	OK
+END2 }
+
+FORM (praat_addMenuCommand, U"Add menu command", U"Add menu command...") {
+	WORD (U"Window", U"Objects")
+	WORD (U"Menu", U"New")
+	SENTENCE (U"Command", U"Hallo...")
+	SENTENCE (U"After command", U"")
+	INTEGER (U"Depth", U"0")
+	LABEL (U"", U"Script file:")
+	TEXTFIELD (U"Script", U"/u/miep/hallo.praat")
+	OK2
 DO
-	praat_addMenuCommandScript (GET_STRING (L"Window"), GET_STRING (L"Menu"),
-		GET_STRING (L"Command"), GET_STRING (L"After command"),
-		GET_INTEGER (L"Depth"), GET_STRING (L"Script"));
-END
-
-FORM (praat_hideMenuCommand, L"Hide menu command", L"Hide menu command...")
-	WORD (L"Window", L"Objects")
-	WORD (L"Menu", L"New")
-	SENTENCE (L"Command", L"Hallo...")
-	OK
+	praat_addMenuCommandScript (GET_STRING (U"Window"), GET_STRING (U"Menu"),
+		GET_STRING (U"Command"), GET_STRING (U"After command"),
+		GET_INTEGER (U"Depth"), GET_STRING (U"Script"));
+END2 }
+
+FORM (praat_hideMenuCommand, U"Hide menu command", U"Hide menu command...") {
+	WORD (U"Window", U"Objects")
+	WORD (U"Menu", U"New")
+	SENTENCE (U"Command", U"Hallo...")
+	OK2
 DO
-	praat_hideMenuCommand (GET_STRING (L"Window"), GET_STRING (L"Menu"), GET_STRING (L"Command"));
-END
-
-FORM (praat_showMenuCommand, L"Show menu command", L"Show menu command...")
-	WORD (L"Window", L"Objects")
-	WORD (L"Menu", L"New")
-	SENTENCE (L"Command", L"Hallo...")
-	OK
+	praat_hideMenuCommand (GET_STRING (U"Window"), GET_STRING (U"Menu"), GET_STRING (U"Command"));
+END2 }
+
+FORM (praat_showMenuCommand, U"Show menu command", U"Show menu command...") {
+	WORD (U"Window", U"Objects")
+	WORD (U"Menu", U"New")
+	SENTENCE (U"Command", U"Hallo...")
+	OK2
 DO
-	praat_showMenuCommand (GET_STRING (L"Window"), GET_STRING (L"Menu"), GET_STRING (L"Command"));
-END
-
-FORM (praat_addAction, L"Add action command", L"Add action command...")
-	WORD (L"Class 1", L"Sound")
-	INTEGER (L"Number 1", L"0")
-	WORD (L"Class 2", L"")
-	INTEGER (L"Number 2", L"0")
-	WORD (L"Class 3", L"")
-	INTEGER (L"Number 3", L"0")
-	SENTENCE (L"Command", L"Play reverse")
-	SENTENCE (L"After command", L"Play")
-	INTEGER (L"Depth", L"0")
-	LABEL (L"", L"Script file:")
-	TEXTFIELD (L"Script", L"/u/miep/playReverse.praat")
-	OK
+	praat_showMenuCommand (GET_STRING (U"Window"), GET_STRING (U"Menu"), GET_STRING (U"Command"));
+END2 }
+
+FORM (praat_addAction, U"Add action command", U"Add action command...") {
+	WORD (U"Class 1", U"Sound")
+	INTEGER (U"Number 1", U"0")
+	WORD (U"Class 2", U"")
+	INTEGER (U"Number 2", U"0")
+	WORD (U"Class 3", U"")
+	INTEGER (U"Number 3", U"0")
+	SENTENCE (U"Command", U"Play reverse")
+	SENTENCE (U"After command", U"Play")
+	INTEGER (U"Depth", U"0")
+	LABEL (U"", U"Script file:")
+	TEXTFIELD (U"Script", U"/u/miep/playReverse.praat")
+	OK2
 DO
-	praat_addActionScript (GET_STRING (L"Class 1"), GET_INTEGER (L"Number 1"),
-		GET_STRING (L"Class 2"), GET_INTEGER (L"Number 2"), GET_STRING (L"Class 3"),
-		GET_INTEGER (L"Number 3"), GET_STRING (L"Command"), GET_STRING (L"After command"),
-		GET_INTEGER (L"Depth"), GET_STRING (L"Script"));
-END
-
-FORM (praat_hideAction, L"Hide action command", L"Hide action command...")
-	WORD (L"Class 1", L"Sound")
-	WORD (L"Class 2", L"")
-	WORD (L"Class 3", L"")
-	SENTENCE (L"Command", L"Play")
-	OK
+	praat_addActionScript (GET_STRING (U"Class 1"), GET_INTEGER (U"Number 1"),
+		GET_STRING (U"Class 2"), GET_INTEGER (U"Number 2"), GET_STRING (U"Class 3"),
+		GET_INTEGER (U"Number 3"), GET_STRING (U"Command"), GET_STRING (U"After command"),
+		GET_INTEGER (U"Depth"), GET_STRING (U"Script"));
+END2 }
+
+FORM (praat_hideAction, U"Hide action command", U"Hide action command...") {
+	WORD (U"Class 1", U"Sound")
+	WORD (U"Class 2", U"")
+	WORD (U"Class 3", U"")
+	SENTENCE (U"Command", U"Play")
+	OK2
 DO
-	praat_hideAction_classNames (GET_STRING (L"Class 1"), GET_STRING (L"Class 2"), GET_STRING (L"Class 3"), GET_STRING (L"Command"));
-END
-
-FORM (praat_showAction, L"Show action command", L"Show action command...")
-	WORD (L"Class 1", L"Sound")
-	WORD (L"Class 2", L"")
-	WORD (L"Class 3", L"")
-	SENTENCE (L"Command", L"Play")
-	OK
+	praat_hideAction_classNames (GET_STRING (U"Class 1"), GET_STRING (U"Class 2"), GET_STRING (U"Class 3"), GET_STRING (U"Command"));
+END2 }
+
+FORM (praat_showAction, U"Show action command", U"Show action command...") {
+	WORD (U"Class 1", U"Sound")
+	WORD (U"Class 2", U"")
+	WORD (U"Class 3", U"")
+	SENTENCE (U"Command", U"Play")
+	OK2
 DO
-	praat_showAction_classNames (GET_STRING (L"Class 1"), GET_STRING (L"Class 2"), GET_STRING (L"Class 3"), GET_STRING (L"Command"));
-END
+	praat_showAction_classNames (GET_STRING (U"Class 1"), GET_STRING (U"Class 2"), GET_STRING (U"Class 3"), GET_STRING (U"Command"));
+END2 }
 
 /********** Callbacks of the Preferences menu. **********/
 
-FORM (TextInputEncodingSettings, L"Text reading preferences", L"Unicode")
-	RADIO_ENUM (L"Encoding of 8-bit text files", kMelder_textInputEncoding, DEFAULT)
-	OK
-SET_ENUM (L"Encoding of 8-bit text files", kMelder_textInputEncoding, Melder_getInputEncoding ())
+FORM (TextInputEncodingSettings, U"Text reading preferences", U"Unicode") {
+	RADIO_ENUM (U"Encoding of 8-bit text files", kMelder_textInputEncoding, DEFAULT)
+	OK2
+SET_ENUM (U"Encoding of 8-bit text files", kMelder_textInputEncoding, Melder_getInputEncoding ())
 DO
-	Melder_setInputEncoding (GET_ENUM (kMelder_textInputEncoding, L"Encoding of 8-bit text files"));
-END
+	Melder_setInputEncoding (GET_ENUM (kMelder_textInputEncoding, U"Encoding of 8-bit text files"));
+END2 }
 
-FORM (TextOutputEncodingSettings, L"Text writing preferences", L"Unicode")
-	RADIO_ENUM (L"Output encoding", kMelder_textOutputEncoding, DEFAULT)
-	OK
-SET_ENUM (L"Output encoding", kMelder_textOutputEncoding, Melder_getOutputEncoding ())
+FORM (TextOutputEncodingSettings, U"Text writing preferences", U"Unicode") {
+	RADIO_ENUM (U"Output encoding", kMelder_textOutputEncoding, DEFAULT)
+	OK2
+SET_ENUM (U"Output encoding", kMelder_textOutputEncoding, Melder_getOutputEncoding ())
 DO
-	Melder_setOutputEncoding (GET_ENUM (kMelder_textOutputEncoding, L"Output encoding"));
-END
+	Melder_setOutputEncoding (GET_ENUM (kMelder_textOutputEncoding, U"Output encoding"));
+END2 }
 
-FORM (GraphicsCjkFontStyleSettings, L"CJK font style preferences", 0)
-	OPTIONMENU_ENUM (L"CJK font style", kGraphics_cjkFontStyle, DEFAULT)
-	OK
-SET_ENUM (L"CJK font style", kGraphics_cjkFontStyle, theGraphicsCjkFontStyle)
+FORM (GraphicsCjkFontStyleSettings, U"CJK font style preferences", 0) {
+	OPTIONMENU_ENUM (U"CJK font style", kGraphics_cjkFontStyle, DEFAULT)
+	OK2
+SET_ENUM (U"CJK font style", kGraphics_cjkFontStyle, theGraphicsCjkFontStyle)
 DO
-	theGraphicsCjkFontStyle = GET_ENUM (kGraphics_cjkFontStyle, L"CJK font style");
-END
-
+	theGraphicsCjkFontStyle = GET_ENUM (kGraphics_cjkFontStyle, U"CJK font style");
+END2 }
 
 /********** Callbacks of the Goodies menu. **********/
 
-FORM (praat_calculator, L"Calculator", L"Calculator")
-	LABEL (L"", L"Type any numeric formula or string formula:")
-	TEXTFIELD (L"expression", L"5*5")
-	LABEL (L"", L"Note that you can include many special functions in your formula,")
-	LABEL (L"", L"including statistical functions and acoustics-auditory conversions.")
-	LABEL (L"", L"For details, click Help.")
-	OK
+FORM (praat_calculator, U"Calculator", U"Calculator") {
+	LABEL (U"", U"Type any numeric formula or string formula:")
+	TEXTFIELD (U"expression", U"5*5")
+	LABEL (U"", U"Note that you can include many special functions in your formula,")
+	LABEL (U"", U"including statistical functions and acoustics-auditory conversions.")
+	LABEL (U"", U"For details, click Help.")
+	OK2
 DO
 	struct Formula_Result result;
 	if (interpreter == NULL) {
 		interpreter = Interpreter_create (NULL, NULL);
 		try {
-			Interpreter_anyExpression (interpreter, GET_STRING (L"expression"), & result);
+			Interpreter_anyExpression (interpreter, GET_STRING (U"expression"), & result);
 			forget (interpreter);
 		} catch (MelderError) {
 			forget (interpreter);
 			throw;
 		}
 	} else {
-		Interpreter_anyExpression (interpreter, GET_STRING (L"expression"), & result);
+		Interpreter_anyExpression (interpreter, GET_STRING (U"expression"), & result);
 	}
 	switch (result. expressionType) {
 		case kFormula_EXPRESSION_TYPE_NUMERIC: {
-			Melder_information (Melder_double (result. result.numericResult));
+			Melder_information (result. result.numericResult);
 		} break;
 		case kFormula_EXPRESSION_TYPE_STRING: {
 			Melder_information (result. result.stringResult);
@@ -296,32 +305,32 @@ DO
 		case kFormula_EXPRESSION_TYPE_NUMERIC_ARRAY: {
 		}
 	}
-END
-
-FORM (praat_reportDifferenceOfTwoProportions, L"Report difference of two proportions", L"Difference of two proportions")
-	INTEGER (L"left Row 1", L"71")
-	INTEGER (L"right Row 1", L"39")
-	INTEGER (L"left Row 2", L"93")
-	INTEGER (L"right Row 2", L"27")
-	OK
+END2 }
+
+FORM (praat_reportDifferenceOfTwoProportions, U"Report difference of two proportions", U"Difference of two proportions") {
+	INTEGER (U"left Row 1", U"71")
+	INTEGER (U"right Row 1", U"39")
+	INTEGER (U"left Row 2", U"93")
+	INTEGER (U"right Row 2", U"27")
+	OK2
 DO
-	double a = GET_INTEGER (L"left Row 1"), b = GET_INTEGER (L"right Row 1");
-	double c = GET_INTEGER (L"left Row 2"), d = GET_INTEGER (L"right Row 2");
+	double a = GET_INTEGER (U"left Row 1"), b = GET_INTEGER (U"right Row 1");
+	double c = GET_INTEGER (U"left Row 2"), d = GET_INTEGER (U"right Row 2");
 	double n = a + b + c + d;
 	double aexp, bexp, cexp, dexp, crossDifference, x2;
-	REQUIRE (a >= 0 && b >= 0 && c >= 0 && d >= 0, L"Numbers must not be negative.")
-	REQUIRE ((a > 0 || b > 0) && (c > 0 || d > 0), L"Row totals must be positive.")
-	REQUIRE ((a > 0 || c > 0) && (b > 0 || d > 0), L"Column totals must be positive.")
+	REQUIRE (a >= 0 && b >= 0 && c >= 0 && d >= 0, U"Numbers must not be negative.")
+	REQUIRE ((a > 0 || b > 0) && (c > 0 || d > 0), U"Row totals must be positive.")
+	REQUIRE ((a > 0 || c > 0) && (b > 0 || d > 0), U"Column totals must be positive.")
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Observed row 1 =    ", Melder_integer (a), L"    ", Melder_integer (b));
-	MelderInfo_writeLine (L"Observed row 2 =    ", Melder_integer (c), L"    ", Melder_integer (d));
+	MelderInfo_writeLine (U"Observed row 1 =    ", lround (a), U"    ", lround (b));
+	MelderInfo_writeLine (U"Observed row 2 =    ", lround (c), U"    ", lround (d));
 	aexp = (a + b) * (a + c) / n;
 	bexp = (a + b) * (b + d) / n;
 	cexp = (a + c) * (c + d) / n;
 	dexp = (b + d) * (c + d) / n;
-	MelderInfo_writeLine (L"");
-	MelderInfo_writeLine (L"Expected row 1 =    ", Melder_double (aexp), L"    ", Melder_double (bexp));
-	MelderInfo_writeLine (L"Expected row 2 =    ", Melder_double (cexp), L"    ", Melder_double (dexp));
+	MelderInfo_writeLine (U"");
+	MelderInfo_writeLine (U"Expected row 1 =    ", aexp, U"    ", bexp);
+	MelderInfo_writeLine (U"Expected row 2 =    ", cexp, U"    ", dexp);
 	/*
 	 * Continuity correction:
 	 * bring the observed numbers closer to the expected numbers by 0.5 (if possible).
@@ -334,230 +343,235 @@ DO
 	else if (c > cexp) { c -= 0.5; if (c < cexp) c = cexp; }
 	if (d < dexp) { d += 0.5; if (d > dexp) d = dexp; }
 	else if (d > dexp) { d -= 0.5; if (d < dexp) d = dexp; }
-	MelderInfo_writeLine (L"");
-	MelderInfo_writeLine (L"Corrected observed row 1 =    ", Melder_double (a), L"    ", Melder_double (b));
-	MelderInfo_writeLine (L"Corrected observed row 2 =    ", Melder_double (c), L"    ", Melder_double (d));
+	MelderInfo_writeLine (U"");
+	MelderInfo_writeLine (U"Corrected observed row 1 =    ", a, U"    ", b);
+	MelderInfo_writeLine (U"Corrected observed row 2 =    ", c, U"    ", d);
 	
 	n = a + b + c + d;
 	crossDifference = a * d - b * c;
 	x2 = n * crossDifference * crossDifference / (a + b) / (c + d) / (a + c) / (b + d);
-	MelderInfo_writeLine (L"");
-	MelderInfo_writeLine (L"Chi-square =    ", Melder_double (x2));
-	MelderInfo_writeLine (L"Two-tailed p =    ", Melder_double (NUMchiSquareQ (x2, 1)));
+	MelderInfo_writeLine (U"");
+	MelderInfo_writeLine (U"Chi-square =    ", x2);
+	MelderInfo_writeLine (U"Two-tailed p =    ", NUMchiSquareQ (x2, 1));
 	MelderInfo_close ();
-END
+END2 }
 
 /********** Callbacks of the Technical menu. **********/
 
-FORM (praat_debug, L"Set debugging options", 0)
-	LABEL (L"", L"If you switch Tracing on, Praat will write lots of detailed ")
-	LABEL (L"", L"information about what goes on in Praat")
+FORM (praat_debug, U"Set debugging options", 0) {
+	LABEL (U"", U"If you switch Tracing on, Praat will write lots of detailed ")
+	LABEL (U"", U"information about what goes on in Praat")
 	structMelderDir dir;
 	Melder_getPrefDir (& dir);
 	structMelderFile file;
 	#ifdef UNIX
-		MelderDir_getFile (& dir, L"tracing", & file);
+		MelderDir_getFile (& dir, U"tracing", & file);
 	#else
-		MelderDir_getFile (& dir, L"Tracing.txt", & file);
+		MelderDir_getFile (& dir, U"Tracing.txt", & file);
 	#endif
-	LABEL (L"", Melder_wcscat (L"to ", Melder_fileToPath (& file), L"."))
-	BOOLEAN (L"Tracing", 0)
-	LABEL (L"", L"Setting the following to anything other than zero")
-	LABEL (L"", L"will alter the behaviour of Praat")
-	LABEL (L"", L"in unpredictable ways.")
-	INTEGER (L"Debug option", L"0")
-	OK
-SET_INTEGER (L"Tracing", Melder_isTracing)
-SET_INTEGER (L"Debug option", Melder_debug)
+	LABEL (U"", Melder_cat (U"to ", Melder_fileToPath (& file), U"."))
+	BOOLEAN (U"Tracing", 0)
+	LABEL (U"", U"Setting the following to anything other than zero")
+	LABEL (U"", U"will alter the behaviour of Praat")
+	LABEL (U"", U"in unpredictable ways.")
+	INTEGER (U"Debug option", U"0")
+	OK2
+SET_INTEGER (U"Tracing", Melder_isTracing)
+SET_INTEGER (U"Debug option", Melder_debug)
 DO
-	Melder_setTracing (GET_INTEGER (L"Tracing"));
-	Melder_debug = GET_INTEGER (L"Debug option");
-END
+	Melder_setTracing (GET_INTEGER (U"Tracing"));
+	Melder_debug = GET_INTEGER (U"Debug option");
+END2 }
 
-DIRECT (praat_listReadableTypesOfObjects)
+DIRECT2 (praat_listReadableTypesOfObjects) {
 	Thing_listReadableClasses ();
-END
+END2 }
+
+DIRECT2 (praat_reportSystemProperties) {
+	praat_reportSystemProperties ();
+END2 }
 
-DIRECT (praat_reportGraphicalProperties)
+DIRECT2 (praat_reportGraphicalProperties) {
 	praat_reportGraphicalProperties ();
-END
+END2 }
 
-DIRECT (praat_reportIntegerProperties)
+DIRECT2 (praat_reportIntegerProperties) {
 	praat_reportIntegerProperties ();
-END
+END2 }
 
-DIRECT (praat_reportMemoryUse)
+DIRECT2 (praat_reportMemoryUse) {
 	praat_reportMemoryUse ();
-END
+END2 }
 
-DIRECT (praat_reportTextProperties)
+DIRECT2 (praat_reportTextProperties) {
 	praat_reportTextProperties ();
-END
+END2 }
 
 /********** Callbacks of the Open menu. **********/
 
 static void readFromFile (MelderFile file) {
-	autoData object = (Data) Data_readFromFile (file);
+	autoDaata object = (Daata) Data_readFromFile (file);
 	if (object.peek() == NULL) return;
-	if (Thing_member (object.peek(), classManPages) && ! Melder_batch) {
+	if (Thing_isa (object.peek(), classManPages) && ! Melder_batch) {
 		ManPages pages = (ManPages) object.peek();
 		ManPage firstPage = static_cast<ManPage> (pages -> pages -> item [1]);
 		Manual_create (firstPage -> title, object.transfer(), true);
 		if (pages -> executable)
-			Melder_warning (L"These manual pages contain links to executable scripts.\n"
+			Melder_warning (U"These manual pages contain links to executable scripts.\n"
 				"Only navigate these pages if you trust their author!");
 		return;
 	}
-	if (Thing_member (object.peek(), classScript) && ! Melder_batch) {
+	if (Thing_isa (object.peek(), classScript) && ! Melder_batch) {
 		ScriptEditor_createFromScript (NULL, (Script) object.peek());
 		return;
 	}
-	praat_new (object.transfer(), MelderFile_name (file));
+	praat_newWithFile (object.transfer(), file, MelderFile_name (file));
 	praat_updateSelection ();
 }
 
-FORM_READ (Data_readFromFile, L"Read Object(s) from file", 0, true)
+FORM_READ2 (Data_readFromFile, U"Read Object(s) from file", 0, true) {
 	readFromFile (file);
-END
+END2 }
 
 /********** Callbacks of the Save menu. **********/
 
-FORM_WRITE (Data_writeToTextFile, L"Save Object(s) as one text file", 0, 0)
+FORM_WRITE2 (Data_writeToTextFile, U"Save Object(s) as one text file", 0, 0) {
 	if (theCurrentPraatObjects -> totalSelection == 1) {
 		LOOP {
-			iam (Data);
+			iam (Daata);
 			Data_writeToTextFile (me, file);
 		}
 	} else {
 		autoCollection set = praat_getSelectedObjects ();
 		Data_writeToTextFile (set.peek(), file);
 	}
-END
+END2 }
 
-FORM_WRITE (Data_writeToShortTextFile, L"Save Object(s) as one short text file", 0, 0)
+FORM_WRITE2 (Data_writeToShortTextFile, U"Save Object(s) as one short text file", 0, 0) {
 	if (theCurrentPraatObjects -> totalSelection == 1) {
 		LOOP {
-			iam (Data);
+			iam (Daata);
 			Data_writeToShortTextFile (me, file);
 		}
 	} else {
 		autoCollection set = praat_getSelectedObjects ();
 		Data_writeToShortTextFile (set.peek(), file);
 	}
-END
+END2 }
 
-FORM_WRITE (Data_writeToBinaryFile, L"Save Object(s) as one binary file", 0, 0)
+FORM_WRITE2 (Data_writeToBinaryFile, U"Save Object(s) as one binary file", 0, 0) {
 	if (theCurrentPraatObjects -> totalSelection == 1) {
 		LOOP {
-			iam (Data);
+			iam (Daata);
 			Data_writeToBinaryFile (me, file);
 		}
 	} else {
 		autoCollection set = praat_getSelectedObjects ();
 		Data_writeToBinaryFile (set.peek(), file);
 	}
-END
+END2 }
 
-FORM (ManPages_saveToHtmlDirectory, L"Save all pages as HTML files", 0)
-	LABEL (L"", L"Type a directory name:")
-	TEXTFIELD (L"directory", L"")
-	OK
+FORM (ManPages_saveToHtmlDirectory, U"Save all pages as HTML files", 0) {
+	LABEL (U"", U"Type a directory name:")
+	TEXTFIELD (U"directory", U"")
+	OK2
 structMelderDir currentDirectory = { { 0 } };
 Melder_getDefaultDir (& currentDirectory);
-SET_STRING (L"directory", Melder_dirToPath (& currentDirectory))
+SET_STRING (U"directory", Melder_dirToPath (& currentDirectory))
 DO
-	wchar_t *directory = GET_STRING (L"directory");
+	char32 *directory = GET_STRING (U"directory");
 	LOOP {
 		iam (ManPages);
 		ManPages_writeAllToHtmlDir (me, directory);
 	}
-END
+END2 }
 
-DIRECT (ManPages_view)
+DIRECT2 (ManPages_view) {
 	LOOP {
 		iam (ManPages);
 		ManPage firstPage = static_cast<ManPage> (my pages -> item [1]);
 		autoManual manual = Manual_create (firstPage -> title, me, false);
 		if (my executable)
-			Melder_warning (L"These manual pages contain links to executable scripts.\n"
+			Melder_warning (U"These manual pages contain links to executable scripts.\n"
 				"Only navigate these pages if you trust their author!");
 		praat_installEditor (manual.transfer(), IOBJECT);
 	}
-END
+END2 }
 
 /********** Callbacks of the Help menu. **********/
 
-FORM (SearchManual, L"Search manual", L"Manual")
-	LABEL (L"", L"Search for strings (separate with spaces):")
-	TEXTFIELD (L"query", L"")
-	OK
+FORM (SearchManual, U"Search manual", U"Manual") {
+	LABEL (U"", U"Search for strings (separate with spaces):")
+	TEXTFIELD (U"query", U"")
+	OK2
 DO
 	if (theCurrentPraatApplication -> batch)
-		Melder_throw (L"Cannot view a manual from batch.");
-	Manual manPage = Manual_create (L"Intro", theCurrentPraatApplication -> manPages, false);
-	Manual_search (manPage, GET_STRING (L"query"));
-END
+		Melder_throw (U"Cannot view a manual from batch.");
+	Manual manPage = Manual_create (U"Intro", theCurrentPraatApplication -> manPages, false);
+	Manual_search (manPage, GET_STRING (U"query"));
+END2 }
 
-FORM (GoToManualPage, L"Go to manual page", 0)
+FORM (GoToManualPage, U"Go to manual page", 0) {
 	{long numberOfPages;
-	const wchar_t **pages = ManPages_getTitles (theCurrentPraatApplication -> manPages, & numberOfPages);
-	LIST (L"Page", numberOfPages, pages, 1)}
-	OK
+	const char32 **pages = ManPages_getTitles (theCurrentPraatApplication -> manPages, & numberOfPages);
+	LIST (U"Page", numberOfPages, pages, 1)}
+	OK2
 DO
 	if (theCurrentPraatApplication -> batch)
-		Melder_throw (L"Cannot view a manual from batch.");
-	Manual manPage = Manual_create (L"Intro", theCurrentPraatApplication -> manPages, false);
-	HyperPage_goToPage_i (manPage, GET_INTEGER (L"Page"));
-END
-
-FORM (WriteManualToHtmlDirectory, L"Save all pages as HTML files", 0)
-	LABEL (L"", L"Type a directory name:")
-	TEXTFIELD (L"directory", L"")
-	OK
+		Melder_throw (U"Cannot view a manual from batch.");
+	Manual manPage = Manual_create (U"Intro", theCurrentPraatApplication -> manPages, false);
+	HyperPage_goToPage_i (manPage, GET_INTEGER (U"Page"));
+END2 }
+
+FORM (WriteManualToHtmlDirectory, U"Save all pages as HTML files", 0) {
+	LABEL (U"", U"Type a directory name:")
+	TEXTFIELD (U"directory", U"")
+	OK2
 structMelderDir currentDirectory = { { 0 } };
 Melder_getDefaultDir (& currentDirectory);
-SET_STRING (L"directory", Melder_dirToPath (& currentDirectory))
+SET_STRING (U"directory", Melder_dirToPath (& currentDirectory))
 DO
-	wchar_t *directory = GET_STRING (L"directory");
+	char32 *directory = GET_STRING (U"directory");
 	ManPages_writeAllToHtmlDir (theCurrentPraatApplication -> manPages, directory);
-END
+END2 }
 
 /********** Menu descriptions. **********/
 
-void praat_show (void) {
+void praat_show () {
 	/*
 	 * (De)sensitivize the fixed buttons as appropriate for the current selection.
 	 */
-	praat_sensitivizeFixedButtonCommand (L"Remove", theCurrentPraatObjects -> totalSelection != 0);
-	praat_sensitivizeFixedButtonCommand (L"Rename...", theCurrentPraatObjects -> totalSelection == 1);
-	praat_sensitivizeFixedButtonCommand (L"Copy...", theCurrentPraatObjects -> totalSelection == 1);
-	praat_sensitivizeFixedButtonCommand (L"Info", theCurrentPraatObjects -> totalSelection == 1);
-	praat_sensitivizeFixedButtonCommand (L"Inspect", theCurrentPraatObjects -> totalSelection != 0);
+	praat_sensitivizeFixedButtonCommand (U"Remove", theCurrentPraatObjects -> totalSelection != 0);
+	praat_sensitivizeFixedButtonCommand (U"Rename...", theCurrentPraatObjects -> totalSelection == 1);
+	praat_sensitivizeFixedButtonCommand (U"Copy...", theCurrentPraatObjects -> totalSelection == 1);
+	praat_sensitivizeFixedButtonCommand (U"Info", theCurrentPraatObjects -> totalSelection == 1);
+	praat_sensitivizeFixedButtonCommand (U"Inspect", theCurrentPraatObjects -> totalSelection != 0);
 	praat_actions_show ();
-	if (theCurrentPraatApplication == & theForegroundPraatApplication && theButtonEditor) theButtonEditor -> dataChanged ();
+	if (theCurrentPraatApplication == & theForegroundPraatApplication && theButtonEditor)
+		Editor_dataChanged (theButtonEditor);
 }
 
 /********** Menu descriptions. **********/
 
 void praat_addFixedButtons (GuiWindow window) {
-	praat_addFixedButtonCommand (window, L"Rename...", DO_Rename, 8, 70);
-	praat_addFixedButtonCommand (window, L"Copy...", DO_Copy, 98, 70);
-	praat_addFixedButtonCommand (window, L"Inspect", DO_Inspect, 8, 40);
-	praat_addFixedButtonCommand (window, L"Info", DO_Info, 98, 40);
-	praat_addFixedButtonCommand (window, L"Remove", DO_Remove, 8, 10);
+	praat_addFixedButtonCommand (window, U"Rename...", DO_Rename, 8, 70);
+	praat_addFixedButtonCommand (window, U"Copy...", DO_Copy, 98, 70);
+	praat_addFixedButtonCommand (window, U"Inspect", DO_Inspect, 8, 40);
+	praat_addFixedButtonCommand (window, U"Info", DO_Info, 98, 40);
+	praat_addFixedButtonCommand (window, U"Remove", DO_Remove, 8, 10);
 }
 
-static void searchProc (void) {
+static void searchProc () {
 	DO_SearchManual (NULL, 0, NULL, NULL, NULL, NULL, false, NULL);
 }
 
-static MelderString itemTitle_about = { 0 };
+static MelderString itemTitle_about { 0 };
 
 static Any scriptRecognizer (int nread, const char *header, MelderFile file) {
-	const wchar_t *name = MelderFile_name (file);
+	const char32 *name = MelderFile_name (file);
 	if (nread < 2) return NULL;
-	if ((header [0] == '#' && header [1] == '!') || wcsstr (name, L".praat") == name + wcslen (name) - 6
-	    || wcsstr (name, L".html") == name + wcslen (name) - 5)
+	if ((header [0] == '#' && header [1] == '!') || str32str (name, U".praat") == name + str32len (name) - 6
+	    || str32str (name, U".html") == name + str32len (name) - 5)
 	{
 		return Script_createFromFile (file);
 	}
@@ -568,29 +582,29 @@ static void cb_openDocument (MelderFile file) {
 	try {
 		readFromFile (file);
 	} catch (MelderError) {
-		Melder_flushError (NULL);
+		Melder_flushError ();
 	}
 }
 
 #if cocoa
-DIRECT (praat_cut)
+DIRECT2 (praat_cut) {
 	[[[NSApp keyWindow] fieldEditor: YES forObject: nil] cut: nil];
-END
-DIRECT (praat_copy)
+END2 }
+DIRECT2 (praat_copy) {
 	[[[NSApp keyWindow] fieldEditor: YES forObject: nil] copy: nil];
-END
-DIRECT (praat_paste)
+END2 }
+DIRECT2 (praat_paste) {
 	[[[NSApp keyWindow] fieldEditor: YES forObject: nil] pasteAsPlainText: nil];
-END
-DIRECT (praat_minimize)
+END2 }
+DIRECT2 (praat_minimize) {
 	[[NSApp keyWindow] performMiniaturize: nil];
-END
-DIRECT (praat_zoom)
+END2 }
+DIRECT2 (praat_zoom) {
 	[[NSApp keyWindow] performZoom: nil];
-END
-DIRECT (praat_close)
+END2 }
+DIRECT2 (praat_close) {
 	[[NSApp keyWindow] performClose: nil];
-END
+END2 }
 #endif
 
 void praat_addMenus (GuiWindow window) {
@@ -603,95 +617,100 @@ void praat_addMenus (GuiWindow window) {
 	 */
 	if (! theCurrentPraatApplication -> batch) {
 		#ifdef macintosh
-			praatMenu = GuiMenu_createInWindow (NULL, L"\024", 0);
+			praatMenu = GuiMenu_createInWindow (NULL, U"\024", 0);
 			#if cocoa
-				editMenu = GuiMenu_createInWindow (NULL, L"Edit", 0);
-				windowMenu = GuiMenu_createInWindow (NULL, L"Window", 0);
+				editMenu = GuiMenu_createInWindow (NULL, U"Edit", 0);
+				windowMenu = GuiMenu_createInWindow (NULL, U"Window", 0);
 			#endif
 		#else
-			praatMenu = GuiMenu_createInWindow (window, L"Praat", 0);
+			praatMenu = GuiMenu_createInWindow (window, U"Praat", 0);
 		#endif
-		newMenu = GuiMenu_createInWindow (window, L"New", 0);
-		readMenu = GuiMenu_createInWindow (window, L"Open", 0);
+		newMenu = GuiMenu_createInWindow (window, U"New", 0);
+		readMenu = GuiMenu_createInWindow (window, U"Open", 0);
 		praat_actions_createWriteMenu (window);
 		#ifdef macintosh
-			applicationHelpMenu = GuiMenu_createInWindow (NULL, L"Help", 0);
+			applicationHelpMenu = GuiMenu_createInWindow (NULL, U"Help", 0);
 		#endif
-		helpMenu = GuiMenu_createInWindow (window, L"Help", 0);
+		helpMenu = GuiMenu_createInWindow (window, U"Help", 0);
 	}
 	
-	MelderString_append (& itemTitle_about, L"About ", Melder_peekUtf8ToWcs (praatP.title), L"...");
+	MelderString_append (& itemTitle_about, U"About ", praatP.title, U"...");
 	#ifdef macintosh
-		praat_addMenuCommand (L"Objects", L"Praat", itemTitle_about.string, 0, praat_UNHIDABLE, DO_About);
+		praat_addMenuCommand (U"Objects", U"Praat", itemTitle_about.string, 0, praat_UNHIDABLE, DO_About);
 		#if cocoa
-			praat_addMenuCommand (L"Objects", L"Edit", L"Cut", 0, praat_UNHIDABLE + 'X', DO_praat_cut);
-			praat_addMenuCommand (L"Objects", L"Edit", L"Copy", 0, praat_UNHIDABLE + 'C', DO_praat_copy);
-			praat_addMenuCommand (L"Objects", L"Edit", L"Paste", 0, praat_UNHIDABLE + 'V', DO_praat_paste);
-			praat_addMenuCommand (L"Objects", L"Window", L"Minimize", 0, praat_UNHIDABLE, DO_praat_minimize);
-			praat_addMenuCommand (L"Objects", L"Window", L"Zoom", 0, praat_UNHIDABLE, DO_praat_zoom);
-			praat_addMenuCommand (L"Objects", L"Window", L"Close", 0, 'W', DO_praat_close);
+			/*
+			 * HACK: give the following command weird names,
+			 * because otherwise they may be called from a script.
+			 * (we add three alt-spaces)
+			 */
+			praat_addMenuCommand (U"Objects", U"Edit", U"Cut   ", 0, praat_UNHIDABLE + 'X', DO_praat_cut);
+			praat_addMenuCommand (U"Objects", U"Edit", U"Copy   ", 0, praat_UNHIDABLE + 'C', DO_praat_copy);
+			praat_addMenuCommand (U"Objects", U"Edit", U"Paste   ", 0, praat_UNHIDABLE + 'V', DO_praat_paste);
+			praat_addMenuCommand (U"Objects", U"Window", U"Minimize   ", 0, praat_UNHIDABLE, DO_praat_minimize);
+			praat_addMenuCommand (U"Objects", U"Window", U"Zoom   ", 0, praat_UNHIDABLE, DO_praat_zoom);
+			praat_addMenuCommand (U"Objects", U"Window", U"Close   ", 0, 'W', DO_praat_close);
 		#endif
 	#endif
 	#ifdef UNIX
-		praat_addMenuCommand (L"Objects", L"Praat", itemTitle_about.string, 0, praat_UNHIDABLE, DO_About);
+		praat_addMenuCommand (U"Objects", U"Praat", itemTitle_about.string, 0, praat_UNHIDABLE, DO_About);
 	#endif
-	praat_addMenuCommand (L"Objects", L"Praat", L"-- script --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"Praat", L"New Praat script", 0, 0, DO_praat_newScript);
-	praat_addMenuCommand (L"Objects", L"Praat", L"Open Praat script...", 0, 0, DO_praat_openScript);
-	praat_addMenuCommand (L"Objects", L"Praat", L"-- buttons --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"Praat", L"Add menu command...", 0, praat_HIDDEN, DO_praat_addMenuCommand);
-	praat_addMenuCommand (L"Objects", L"Praat", L"Hide menu command...", 0, praat_HIDDEN, DO_praat_hideMenuCommand);
-	praat_addMenuCommand (L"Objects", L"Praat", L"Show menu command...", 0, praat_HIDDEN, DO_praat_showMenuCommand);
-	praat_addMenuCommand (L"Objects", L"Praat", L"Add action command...", 0, praat_HIDDEN, DO_praat_addAction);
-	praat_addMenuCommand (L"Objects", L"Praat", L"Hide action command...", 0, praat_HIDDEN, DO_praat_hideAction);
-	praat_addMenuCommand (L"Objects", L"Praat", L"Show action command...", 0, praat_HIDDEN, DO_praat_showAction);
-
-	GuiMenuItem menuItem = praat_addMenuCommand (L"Objects", L"Praat", L"Goodies", 0, praat_UNHIDABLE, 0);
+	praat_addMenuCommand (U"Objects", U"Praat", U"-- script --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"Praat", U"New Praat script", 0, 0, DO_praat_newScript);
+	praat_addMenuCommand (U"Objects", U"Praat", U"Open Praat script...", 0, 0, DO_praat_openScript);
+	praat_addMenuCommand (U"Objects", U"Praat", U"-- buttons --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"Praat", U"Add menu command...", 0, praat_HIDDEN, DO_praat_addMenuCommand);
+	praat_addMenuCommand (U"Objects", U"Praat", U"Hide menu command...", 0, praat_HIDDEN, DO_praat_hideMenuCommand);
+	praat_addMenuCommand (U"Objects", U"Praat", U"Show menu command...", 0, praat_HIDDEN, DO_praat_showMenuCommand);
+	praat_addMenuCommand (U"Objects", U"Praat", U"Add action command...", 0, praat_HIDDEN, DO_praat_addAction);
+	praat_addMenuCommand (U"Objects", U"Praat", U"Hide action command...", 0, praat_HIDDEN, DO_praat_hideAction);
+	praat_addMenuCommand (U"Objects", U"Praat", U"Show action command...", 0, praat_HIDDEN, DO_praat_showAction);
+
+	GuiMenuItem menuItem = praat_addMenuCommand (U"Objects", U"Praat", U"Goodies", 0, praat_UNHIDABLE, 0);
 	goodiesMenu = menuItem ? menuItem -> d_menu : NULL;
-	praat_addMenuCommand (L"Objects", L"Goodies", L"Calculator...", 0, 'U', DO_praat_calculator);
-	praat_addMenuCommand (L"Objects", L"Goodies", L"Report difference of two proportions...", 0, 0, DO_praat_reportDifferenceOfTwoProportions);
+	praat_addMenuCommand (U"Objects", U"Goodies", U"Calculator...", 0, 'U', DO_praat_calculator);
+	praat_addMenuCommand (U"Objects", U"Goodies", U"Report difference of two proportions...", 0, 0, DO_praat_reportDifferenceOfTwoProportions);
 
-	menuItem = praat_addMenuCommand (L"Objects", L"Praat", L"Preferences", 0, praat_UNHIDABLE, 0);
+	menuItem = praat_addMenuCommand (U"Objects", U"Praat", U"Preferences", 0, praat_UNHIDABLE, 0);
 	preferencesMenu = menuItem ? menuItem -> d_menu : NULL;
-	praat_addMenuCommand (L"Objects", L"Preferences", L"Buttons...", 0, praat_UNHIDABLE, DO_praat_editButtons);   /* Cannot be hidden. */
-	praat_addMenuCommand (L"Objects", L"Preferences", L"-- encoding prefs --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"Preferences", L"Text reading preferences...", 0, 0, DO_TextInputEncodingSettings);
-	praat_addMenuCommand (L"Objects", L"Preferences", L"Text writing preferences...", 0, 0, DO_TextOutputEncodingSettings);
-	praat_addMenuCommand (L"Objects", L"Preferences", L"CJK font style preferences...", 0, 0, DO_GraphicsCjkFontStyleSettings);
+	praat_addMenuCommand (U"Objects", U"Preferences", U"Buttons...", 0, praat_UNHIDABLE, DO_praat_editButtons);   /* Cannot be hidden. */
+	praat_addMenuCommand (U"Objects", U"Preferences", U"-- encoding prefs --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"Preferences", U"Text reading preferences...", 0, 0, DO_TextInputEncodingSettings);
+	praat_addMenuCommand (U"Objects", U"Preferences", U"Text writing preferences...", 0, 0, DO_TextOutputEncodingSettings);
+	praat_addMenuCommand (U"Objects", U"Preferences", U"CJK font style preferences...", 0, 0, DO_GraphicsCjkFontStyleSettings);
 
-	menuItem = praat_addMenuCommand (L"Objects", L"Praat", L"Technical", 0, praat_UNHIDABLE, 0);
+	menuItem = praat_addMenuCommand (U"Objects", U"Praat", U"Technical", 0, praat_UNHIDABLE, 0);
 	technicalMenu = menuItem ? menuItem -> d_menu : NULL;
-	praat_addMenuCommand (L"Objects", L"Technical", L"List readable types of objects", 0, 0, DO_praat_listReadableTypesOfObjects);
-	praat_addMenuCommand (L"Objects", L"Technical", L"Report memory use", 0, 0, DO_praat_reportMemoryUse);
-	praat_addMenuCommand (L"Objects", L"Technical", L"Report integer properties", 0, 0, DO_praat_reportIntegerProperties);
-	praat_addMenuCommand (L"Objects", L"Technical", L"Report text properties", 0, 0, DO_praat_reportTextProperties);
-	praat_addMenuCommand (L"Objects", L"Technical", L"Report graphical properties", 0, 0, DO_praat_reportGraphicalProperties);
-	praat_addMenuCommand (L"Objects", L"Technical", L"Debug...", 0, 0, DO_praat_debug);
-
-	praat_addMenuCommand (L"Objects", L"Open", L"Read from file...", 0, praat_ATTRACTIVE + 'O', DO_Data_readFromFile);
-
-	praat_addAction1 (classData, 0, L"Save as text file...", 0, 0, DO_Data_writeToTextFile);
-	praat_addAction1 (classData, 0, L"Write to text file...", 0, praat_HIDDEN, DO_Data_writeToTextFile);
-	praat_addAction1 (classData, 0, L"Save as short text file...", 0, 0, DO_Data_writeToShortTextFile);
-	praat_addAction1 (classData, 0, L"Write to short text file...", 0, praat_HIDDEN, DO_Data_writeToShortTextFile);
-	praat_addAction1 (classData, 0, L"Save as binary file...", 0, 0, DO_Data_writeToBinaryFile);
-	praat_addAction1 (classData, 0, L"Write to binary file...", 0, praat_HIDDEN, DO_Data_writeToBinaryFile);
-
-	praat_addAction1 (classManPages, 1, L"Save to HTML directory...", 0, 0, DO_ManPages_saveToHtmlDirectory);
-	praat_addAction1 (classManPages, 1, L"View", 0, 0, DO_ManPages_view);
+	praat_addMenuCommand (U"Objects", U"Technical", U"List readable types of objects", 0, 0, DO_praat_listReadableTypesOfObjects);
+	praat_addMenuCommand (U"Objects", U"Technical", U"Report memory use", 0, 0, DO_praat_reportMemoryUse);
+	praat_addMenuCommand (U"Objects", U"Technical", U"Report integer properties", 0, 0, DO_praat_reportIntegerProperties);
+	praat_addMenuCommand (U"Objects", U"Technical", U"Report text properties", 0, 0, DO_praat_reportTextProperties);
+	praat_addMenuCommand (U"Objects", U"Technical", U"Report system properties", 0, 0, DO_praat_reportSystemProperties);
+	praat_addMenuCommand (U"Objects", U"Technical", U"Report graphical properties", 0, 0, DO_praat_reportGraphicalProperties);
+	praat_addMenuCommand (U"Objects", U"Technical", U"Debug...", 0, 0, DO_praat_debug);
+
+	praat_addMenuCommand (U"Objects", U"Open", U"Read from file...", 0, praat_ATTRACTIVE + 'O', DO_Data_readFromFile);
+
+	praat_addAction1 (classDaata, 0, U"Save as text file...", 0, 0, DO_Data_writeToTextFile);
+	praat_addAction1 (classDaata, 0, U"Write to text file...", 0, praat_HIDDEN, DO_Data_writeToTextFile);
+	praat_addAction1 (classDaata, 0, U"Save as short text file...", 0, 0, DO_Data_writeToShortTextFile);
+	praat_addAction1 (classDaata, 0, U"Write to short text file...", 0, praat_HIDDEN, DO_Data_writeToShortTextFile);
+	praat_addAction1 (classDaata, 0, U"Save as binary file...", 0, 0, DO_Data_writeToBinaryFile);
+	praat_addAction1 (classDaata, 0, U"Write to binary file...", 0, praat_HIDDEN, DO_Data_writeToBinaryFile);
+
+	praat_addAction1 (classManPages, 1, U"Save to HTML directory...", 0, 0, DO_ManPages_saveToHtmlDirectory);
+	praat_addAction1 (classManPages, 1, U"View", 0, 0, DO_ManPages_view);
 }
 
-void praat_addMenus2 (void) {
-	static MelderString itemTitle_search = { 0 };
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"-- manual --", 0, 0, 0);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Go to manual page...", 0, 0, DO_GoToManualPage);
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", L"Write manual to HTML directory...", 0, praat_HIDDEN, DO_WriteManualToHtmlDirectory);
-	MelderString_empty (& itemTitle_search);
-	MelderString_append (& itemTitle_search, L"Search ", Melder_peekUtf8ToWcs (praatP.title), L" manual...");
-	praat_addMenuCommand (L"Objects", L"ApplicationHelp", itemTitle_search.string, 0, 'M', DO_SearchManual);
+void praat_addMenus2 () {
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"-- manual --", 0, 0, 0);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Go to manual page...", 0, 0, DO_GoToManualPage);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp", U"Write manual to HTML directory...", 0, praat_HIDDEN, DO_WriteManualToHtmlDirectory);
+	praat_addMenuCommand (U"Objects", U"ApplicationHelp",
+		Melder_cat (U"Search ", praatP.title, U" manual..."),
+		0, 'M', DO_SearchManual);
 	#ifdef _WIN32
-		praat_addMenuCommand (L"Objects", L"Help", L"-- about --", 0, 0, 0);
-		praat_addMenuCommand (L"Objects", L"Help", itemTitle_about.string, 0, praat_UNHIDABLE, DO_About);
+		praat_addMenuCommand (U"Objects", U"Help", U"-- about --", 0, 0, 0);
+		praat_addMenuCommand (U"Objects", U"Help", itemTitle_about.string, 0, praat_UNHIDABLE, DO_About);
 	#endif
 
 	#if defined (macintosh) || defined (_WIN32)
diff --git a/sys/praat_picture.cpp b/sys/praat_picture.cpp
index 11efc64..476629e 100644
--- a/sys/praat_picture.cpp
+++ b/sys/praat_picture.cpp
@@ -1,6 +1,6 @@
 /* praat_picture.cpp
  *
- * Copyright (C) 1992-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,10 +27,10 @@
 
 static bool praat_mouseSelectsInnerViewport;
 
-void praat_picture_prefs (void) {
-	Preferences_addEnum (L"Picture.font", & theCurrentPraatPicture -> font, kGraphics_font, kGraphics_font_DEFAULT);
-	Preferences_addInt (L"Picture.fontSize", & theCurrentPraatPicture -> fontSize, 10);
-	Preferences_addBool (L"Picture.mouseSelectsInnerViewport", & praat_mouseSelectsInnerViewport, false);
+void praat_picture_prefs () {
+	Preferences_addEnum (U"Picture.font", & theCurrentPraatPicture -> font, kGraphics_font, kGraphics_font_DEFAULT);
+	Preferences_addInt (U"Picture.fontSize", & theCurrentPraatPicture -> fontSize, 10);
+	Preferences_addBool (U"Picture.mouseSelectsInnerViewport", & praat_mouseSelectsInnerViewport, false);
 }
 
 /***** static variable *****/
@@ -43,12 +43,12 @@ static Picture praat_picture;
 
 static GuiMenuItem praatButton_fonts [1 + kGraphics_font_MAX];
 
-static void updateFontMenu (void) {
+static void updateFontMenu () {
 	if (! theCurrentPraatApplication -> batch) {
 		if (theCurrentPraatPicture -> font < kGraphics_font_MIN) theCurrentPraatPicture -> font = kGraphics_font_MIN;
 		if (theCurrentPraatPicture -> font > kGraphics_font_MAX) theCurrentPraatPicture -> font = kGraphics_font_MAX;   // we no longer have New Century Schoolbook
 		for (int i = kGraphics_font_MIN; i <= kGraphics_font_MAX; i ++) {
-			praatButton_fonts [i] -> f_check (theCurrentPraatPicture -> font == i);
+			GuiMenuItem_check (praatButton_fonts [i], theCurrentPraatPicture -> font == i);
 		}
 	}
 }
@@ -70,13 +70,13 @@ DIRECT (Courier)   { setFont (kGraphics_font_COURIER);   } END
 /***** "Font" MENU: size part *****/
 
 static GuiMenuItem praatButton_10, praatButton_12, praatButton_14, praatButton_18, praatButton_24;
-static void updateSizeMenu (void) {
+static void updateSizeMenu () {
 	if (! theCurrentPraatApplication -> batch) {
-		praatButton_10 -> f_check (theCurrentPraatPicture -> fontSize == 10);
-		praatButton_12 -> f_check (theCurrentPraatPicture -> fontSize == 12);
-		praatButton_14 -> f_check (theCurrentPraatPicture -> fontSize == 14);
-		praatButton_18 -> f_check (theCurrentPraatPicture -> fontSize == 18);
-		praatButton_24 -> f_check (theCurrentPraatPicture -> fontSize == 24);
+		GuiMenuItem_check (praatButton_10, theCurrentPraatPicture -> fontSize == 10);
+		GuiMenuItem_check (praatButton_12, theCurrentPraatPicture -> fontSize == 12);
+		GuiMenuItem_check (praatButton_14, theCurrentPraatPicture -> fontSize == 14);
+		GuiMenuItem_check (praatButton_18, theCurrentPraatPicture -> fontSize == 18);
+		GuiMenuItem_check (praatButton_24, theCurrentPraatPicture -> fontSize == 24);
 	}
 }
 static void setFontSize (int fontSize) {
@@ -96,12 +96,12 @@ DIRECT (12) { setFontSize (12); } END
 DIRECT (14) { setFontSize (14); } END
 DIRECT (18) { setFontSize (18); } END
 DIRECT (24) { setFontSize (24); } END
-FORM (Font_size, L"Praat picture: Font size", L"Font menu") {
-	NATURAL (L"Font size (points)", L"10")
+FORM (Font_size, U"Praat picture: Font size", U"Font menu") {
+	NATURAL (U"Font size (points)", U"10")
 OK2
-	SET_INTEGER (L"Font size", (long) theCurrentPraatPicture -> fontSize);
+	SET_INTEGER (U"Font size", (long) theCurrentPraatPicture -> fontSize);
 DO
-	setFontSize (GET_INTEGER (L"Font size"));
+	setFontSize (GET_INTEGER (U"Font size"));
 END2 }
 
 /*static void setFontSize_keepInnerViewport (int fontSize) {
@@ -130,16 +130,16 @@ END2 }
 /***** "Select" MENU *****/
 
 static GuiMenuItem praatButton_innerViewport, praatButton_outerViewport;
-static void updateViewportMenu (void) {
+static void updateViewportMenu () {
 	if (! theCurrentPraatApplication -> batch) {
-		praatButton_innerViewport -> f_check (praat_mouseSelectsInnerViewport ? 1 : 0);
-		praatButton_outerViewport -> f_check (praat_mouseSelectsInnerViewport ? 0 : 1);
+		GuiMenuItem_check (praatButton_innerViewport, praat_mouseSelectsInnerViewport ? 1 : 0);
+		GuiMenuItem_check (praatButton_outerViewport, praat_mouseSelectsInnerViewport ? 0 : 1);
 	}
 }
 
 DIRECT (MouseSelectsInnerViewport) {
 	if (theCurrentPraatPicture != & theForegroundPraatPicture)
-		Melder_throw ("Mouse commands are not available inside pictures.");
+		Melder_throw (U"Mouse commands are not available inside pictures.");
 	{// scope
 		autoPraatPicture picture;
 		Picture_setMouseSelectsInnerViewport (praat_picture, praat_mouseSelectsInnerViewport = true);
@@ -149,7 +149,7 @@ DIRECT (MouseSelectsInnerViewport) {
 
 DIRECT (MouseSelectsOuterViewport) {
 	if (theCurrentPraatPicture != & theForegroundPraatPicture)
-		Melder_throw ("Mouse commands are not available inside pictures.");
+		Melder_throw (U"Mouse commands are not available inside pictures.");
 	{// scope
 		autoPraatPicture picture;
 		Picture_setMouseSelectsInnerViewport (praat_picture, praat_mouseSelectsInnerViewport = false);
@@ -157,50 +157,50 @@ DIRECT (MouseSelectsOuterViewport) {
 	updateViewportMenu ();
 } END
 
-FORM (SelectInnerViewport, L"Praat picture: Select inner viewport", L"Select inner viewport...") {
-	LABEL (L"", L"The viewport is the selected rectangle in the Picture window.")
-	LABEL (L"", L"It is where your next drawing will appear.")
-	LABEL (L"", L"The rectangle you select here will not include the margins.")
-	LABEL (L"", L"")
-	REAL (L"left Horizontal range (inches)", L"0.0")
-	REAL (L"right Horizontal range (inches)", L"6.0")
-	REAL (L"left Vertical range (inches)", L"0.0")
-	REAL (L"right Vertical range (inches)", L"6.0")
+FORM (SelectInnerViewport, U"Praat picture: Select inner viewport", U"Select inner viewport...") {
+	LABEL (U"", U"The viewport is the selected rectangle in the Picture window.")
+	LABEL (U"", U"It is where your next drawing will appear.")
+	LABEL (U"", U"The rectangle you select here will not include the margins.")
+	LABEL (U"", U"")
+	REAL (U"left Horizontal range (inches)", U"0.0")
+	REAL (U"right Horizontal range (inches)", U"6.0")
+	REAL (U"left Vertical range (inches)", U"0.0")
+	REAL (U"right Vertical range (inches)", U"6.0")
 OK2
 	double xmargin = theCurrentPraatPicture -> fontSize * 4.2 / 72.0, ymargin = theCurrentPraatPicture -> fontSize * 2.8 / 72.0;
 	if (ymargin > 0.4 * (theCurrentPraatPicture -> y2NDC - theCurrentPraatPicture -> y1NDC))
 		ymargin = 0.4 * (theCurrentPraatPicture -> y2NDC - theCurrentPraatPicture -> y1NDC);
 	if (xmargin > 0.4 * (theCurrentPraatPicture -> x2NDC - theCurrentPraatPicture -> x1NDC))
 		xmargin = 0.4 * (theCurrentPraatPicture -> x2NDC - theCurrentPraatPicture -> x1NDC);
-	SET_REAL (L"left Horizontal range", theCurrentPraatPicture -> x1NDC + xmargin);
-	SET_REAL (L"right Horizontal range", theCurrentPraatPicture -> x2NDC - xmargin);
-	SET_REAL (L"left Vertical range", 12 - theCurrentPraatPicture -> y2NDC + ymargin);
-	SET_REAL (L"right Vertical range", 12 - theCurrentPraatPicture -> y1NDC - ymargin);
+	SET_REAL (U"left Horizontal range", theCurrentPraatPicture -> x1NDC + xmargin)
+	SET_REAL (U"right Horizontal range", theCurrentPraatPicture -> x2NDC - xmargin)
+	SET_REAL (U"left Vertical range", 12 - theCurrentPraatPicture -> y2NDC + ymargin)
+	SET_REAL (U"right Vertical range", 12 - theCurrentPraatPicture -> y1NDC - ymargin)
 DO
-	//if (theCurrentPraatObjects != & theForegroundPraatObjects) Melder_throw ("Viewport commands are not available inside manuals.");
-	double left = GET_REAL (L"left Horizontal range"), right = GET_REAL (L"right Horizontal range");
-	double top = GET_REAL (L"left Vertical range"), bottom = GET_REAL (L"right Vertical range");
+	//if (theCurrentPraatObjects != & theForegroundPraatObjects) Melder_throw (U"Viewport commands are not available inside manuals.");
+	double left = GET_REAL (U"left Horizontal range"), right = GET_REAL (U"right Horizontal range");
+	double top = GET_REAL (U"left Vertical range"), bottom = GET_REAL (U"right Vertical range");
 	double xmargin = theCurrentPraatPicture -> fontSize * 4.2 / 72.0, ymargin = theCurrentPraatPicture -> fontSize * 2.8 / 72.0;
-	trace ("1: xmargin %f ymargin %f", xmargin, ymargin);
+	trace (U"1: xmargin ", xmargin, U" ymargin ", ymargin);
 	if (theCurrentPraatPicture != & theForegroundPraatPicture) {
 		long x1DC, x2DC, y1DC, y2DC;
 		Graphics_inqWsViewport (GRAPHICS, & x1DC, & x2DC, & y1DC, & y2DC);
 		double x1wNDC, x2wNDC, y1wNDC, y2wNDC;
 		Graphics_inqWsWindow (GRAPHICS, & x1wNDC, & x2wNDC, & y1wNDC, & y2wNDC);
 		double wDC = (x2DC - x1DC) / (x2wNDC - x1wNDC);
-		double hDC = abs (y2DC - y1DC) / (y2wNDC - y1wNDC);
+		double hDC = labs (y2DC - y1DC) / (y2wNDC - y1wNDC);
 		xmargin *= Graphics_getResolution (GRAPHICS) / wDC;
 		ymargin *= Graphics_getResolution (GRAPHICS) / hDC;
 	}
 	if (xmargin > 2 * (right - left)) xmargin = 2 * (right - left);
 	if (ymargin > 2 * (bottom - top)) ymargin = 2 * (bottom - top);
-	trace ("2: xmargin %f ymargin %f", xmargin, ymargin);
+	trace (U"2: xmargin ", xmargin, U" ymargin ", ymargin);
 	if (left == right) {
-		Melder_throw ("The left and right edges of the viewport cannot be equal.\nPlease change the horizontal range.");
+		Melder_throw (U"The left and right edges of the viewport cannot be equal.\nPlease change the horizontal range.");
 	}
 	if (left > right) { double temp; temp = left; left = right; right = temp; }
 	if (top == bottom) {
-		Melder_throw ("The top and bottom edges of the viewport cannot be equal.\nPlease change the vertical range.");
+		Melder_throw (U"The top and bottom edges of the viewport cannot be equal.\nPlease change the vertical range.");
 	}
 	theCurrentPraatPicture -> x1NDC = left - xmargin;
 	theCurrentPraatPicture -> x2NDC = right + xmargin;
@@ -222,33 +222,38 @@ DO
 		theCurrentPraatPicture -> y1NDC = bottom - ymargin;
 		theCurrentPraatPicture -> y2NDC = top + ymargin;
 	}
-	trace ("3: x1NDC %f x2NDC %f y1NDC %f y2NDC %f", theCurrentPraatPicture -> x1NDC, theCurrentPraatPicture -> x2NDC, theCurrentPraatPicture -> y1NDC, theCurrentPraatPicture -> y2NDC);
+	trace (U"3:"
+		U" x1NDC ", theCurrentPraatPicture -> x1NDC,
+		U" x2NDC ", theCurrentPraatPicture -> x2NDC,
+		U" y1NDC ", theCurrentPraatPicture -> y1NDC,
+		U" y2NDC ", theCurrentPraatPicture -> y2NDC
+	);
 END2 }
 
-FORM (SelectOuterViewport, L"Praat picture: Select outer viewport", L"Select outer viewport...") {
-	LABEL (L"", L"The viewport is the selected rectangle in the Picture window.")
-	LABEL (L"", L"It is where your next drawing will appear.")
-	LABEL (L"", L"The rectangle you select here will include the margins.")
-	LABEL (L"", L"")
-	REAL (L"left Horizontal range (inches)", L"0.0")
-	REAL (L"right Horizontal range (inches)", L"6.0")
-	REAL (L"left Vertical range (inches)", L"0.0")
-	REAL (L"right Vertical range (inches)", L"6.0")
+FORM (SelectOuterViewport, U"Praat picture: Select outer viewport", U"Select outer viewport...") {
+	LABEL (U"", U"The viewport is the selected rectangle in the Picture window.")
+	LABEL (U"", U"It is where your next drawing will appear.")
+	LABEL (U"", U"The rectangle you select here will include the margins.")
+	LABEL (U"", U"")
+	REAL (U"left Horizontal range (inches)", U"0.0")
+	REAL (U"right Horizontal range (inches)", U"6.0")
+	REAL (U"left Vertical range (inches)", U"0.0")
+	REAL (U"right Vertical range (inches)", U"6.0")
 OK2
-	SET_REAL (L"left Horizontal range", theCurrentPraatPicture -> x1NDC);
-	SET_REAL (L"right Horizontal range", theCurrentPraatPicture -> x2NDC);
-	SET_REAL (L"left Vertical range", 12 - theCurrentPraatPicture -> y2NDC);
-	SET_REAL (L"right Vertical range", 12 - theCurrentPraatPicture -> y1NDC);
+	SET_REAL (U"left Horizontal range", theCurrentPraatPicture -> x1NDC);
+	SET_REAL (U"right Horizontal range", theCurrentPraatPicture -> x2NDC);
+	SET_REAL (U"left Vertical range", 12 - theCurrentPraatPicture -> y2NDC);
+	SET_REAL (U"right Vertical range", 12 - theCurrentPraatPicture -> y1NDC);
 DO
-	//if (theCurrentPraatObjects != & theForegroundPraatObjects) Melder_throw ("Viewport commands are not available inside manuals.");
-	double left = GET_REAL (L"left Horizontal range"), right = GET_REAL (L"right Horizontal range");
-	double top = GET_REAL (L"left Vertical range"), bottom = GET_REAL (L"right Vertical range");
+	//if (theCurrentPraatObjects != & theForegroundPraatObjects) Melder_throw (U"Viewport commands are not available inside manuals.");
+	double left = GET_REAL (U"left Horizontal range"), right = GET_REAL (U"right Horizontal range");
+	double top = GET_REAL (U"left Vertical range"), bottom = GET_REAL (U"right Vertical range");
 	if (left == right) {
-		Melder_throw ("The left and right edges of the viewport cannot be equal.\nPlease change the horizontal range.");
+		Melder_throw (U"The left and right edges of the viewport cannot be equal.\nPlease change the horizontal range.");
 	}
 	if (left > right) { double temp; temp = left; left = right; right = temp; }
 	if (top == bottom) {
-		Melder_throw ("The top and bottom edges of the viewport cannot be equal.\nPlease change the vertical range.");
+		Melder_throw (U"The top and bottom edges of the viewport cannot be equal.\nPlease change the vertical range.");
 	}
 	theCurrentPraatPicture -> x1NDC = left;
 	theCurrentPraatPicture -> x2NDC = right;
@@ -272,29 +277,29 @@ DO
 	}
 END2 }
 
-FORM (ViewportText, L"Praat picture: Viewport text", L"Viewport text...") {
-	RADIO (L"Horizontal alignment", 2)
-		RADIOBUTTON (L"Left")
-		RADIOBUTTON (L"Centre")
-		RADIOBUTTON (L"Right")
-	RADIO (L"Vertical alignment", 2)
-		RADIOBUTTON (L"Bottom")
-		RADIOBUTTON (L"Half")
-		RADIOBUTTON (L"Top")
-	REAL (L"Rotation (degrees)", L"0")
-	TEXTFIELD (L"text", L"")
+FORM (ViewportText, U"Praat picture: Viewport text", U"Viewport text...") {
+	RADIO (U"Horizontal alignment", 2)
+		RADIOBUTTON (U"Left")
+		RADIOBUTTON (U"Centre")
+		RADIOBUTTON (U"Right")
+	RADIO (U"Vertical alignment", 2)
+		RADIOBUTTON (U"Bottom")
+		RADIOBUTTON (U"Half")
+		RADIOBUTTON (U"Top")
+	REAL (U"Rotation (degrees)", U"0")
+	TEXTFIELD (U"text", U"")
 OK2
 DO
 	double x1WC, x2WC, y1WC, y2WC;
-	int hor = GET_INTEGER (L"Horizontal alignment") - 1;
-	int vert = GET_INTEGER (L"Vertical alignment") - 1;
+	int hor = GET_INTEGER (U"Horizontal alignment") - 1;
+	int vert = GET_INTEGER (U"Vertical alignment") - 1;
 	autoPraatPicture picture;
 	Graphics_inqWindow (GRAPHICS, & x1WC, & x2WC, & y1WC, & y2WC);
 	Graphics_setWindow (GRAPHICS, 0, 1, 0, 1);
 	Graphics_setTextAlignment (GRAPHICS, hor, vert);
-	Graphics_setTextRotation (GRAPHICS, GET_REAL (L"Rotation"));
+	Graphics_setTextRotation (GRAPHICS, GET_REAL (U"Rotation"));
 	Graphics_text (GRAPHICS, hor == 0 ? 0 : hor == 1 ? 0.5 : 1,
-		vert == 0 ? 0 : vert == 1 ? 0.5 : 1, GET_STRING (L"text"));
+		vert == 0 ? 0 : vert == 1 ? 0.5 : 1, GET_STRING (U"text"));
 	Graphics_setTextRotation (GRAPHICS, 0.0);
 	Graphics_setWindow (GRAPHICS, x1WC, x2WC, y1WC, y2WC);
 END2 }
@@ -307,28 +312,28 @@ static GuiMenuItem praatButton_black, praatButton_white, praatButton_red, praatB
 	praatButton_teal, praatButton_purple, praatButton_olive, praatButton_pink, praatButton_silver, praatButton_grey;
 
 
-static void updatePenMenu (void) {
+static void updatePenMenu () {
 	if (! theCurrentPraatApplication -> batch) {
 		for (int i = Graphics_DRAWN; i <= Graphics_DASHED; i ++) {
-			praatButton_lines [i] -> f_check (theCurrentPraatPicture -> lineType == i);
+			GuiMenuItem_check (praatButton_lines [i], theCurrentPraatPicture -> lineType == i);
 		}
-		praatButton_black   -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_BLACK));
-		praatButton_white   -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_WHITE));
-		praatButton_red     -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_RED));
-		praatButton_green   -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_GREEN));
-		praatButton_blue    -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_BLUE));
-		praatButton_yellow  -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_YELLOW));
-		praatButton_cyan    -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_CYAN));
-		praatButton_magenta -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_MAGENTA));
-		praatButton_maroon  -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_MAROON));
-		praatButton_lime    -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_LIME));
-		praatButton_navy    -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_NAVY));
-		praatButton_teal    -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_TEAL));
-		praatButton_purple  -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_PURPLE));
-		praatButton_olive   -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_OLIVE));
-		praatButton_pink    -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_PINK));
-		praatButton_silver  -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_SILVER));
-		praatButton_grey    -> f_check (Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_GREY));
+		GuiMenuItem_check (praatButton_black   , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_BLACK));
+		GuiMenuItem_check (praatButton_white   , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_WHITE));
+		GuiMenuItem_check (praatButton_red     , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_RED));
+		GuiMenuItem_check (praatButton_green   , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_GREEN));
+		GuiMenuItem_check (praatButton_blue    , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_BLUE));
+		GuiMenuItem_check (praatButton_yellow  , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_YELLOW));
+		GuiMenuItem_check (praatButton_cyan    , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_CYAN));
+		GuiMenuItem_check (praatButton_magenta , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_MAGENTA));
+		GuiMenuItem_check (praatButton_maroon  , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_MAROON));
+		GuiMenuItem_check (praatButton_lime    , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_LIME));
+		GuiMenuItem_check (praatButton_navy    , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_NAVY));
+		GuiMenuItem_check (praatButton_teal    , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_TEAL));
+		GuiMenuItem_check (praatButton_purple  , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_PURPLE));
+		GuiMenuItem_check (praatButton_olive   , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_OLIVE));
+		GuiMenuItem_check (praatButton_pink    , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_PINK));
+		GuiMenuItem_check (praatButton_silver  , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_SILVER));
+		GuiMenuItem_check (praatButton_grey    , Graphics_Colour_equal (theCurrentPraatPicture -> colour, Graphics_GREY));
 	}
 }
 static void setLineType (int lineType) {
@@ -346,12 +351,12 @@ DIRECT (Dotted_line)        { setLineType (Graphics_DOTTED);        } END
 DIRECT (Dashed_line)        { setLineType (Graphics_DASHED);        } END
 DIRECT (Dashed_dotted_line) { setLineType (Graphics_DASHED_DOTTED); } END
 
-FORM (Line_width, L"Praat picture: Line width", 0) {
-	POSITIVE (L"Line width", L"1.0")
+FORM (Line_width, U"Praat picture: Line width", 0) {
+	POSITIVE (U"Line width", U"1.0")
 OK2
-	SET_REAL (L"Line width", theCurrentPraatPicture -> lineWidth);
+	SET_REAL (U"Line width", theCurrentPraatPicture -> lineWidth);
 DO
-	double lineWidth = GET_REAL (L"Line width");
+	double lineWidth = GET_REAL (U"Line width");
 	{// scope
 		autoPraatPicture picture;
 		Graphics_setLineWidth (GRAPHICS, lineWidth);
@@ -359,12 +364,12 @@ DO
 	theCurrentPraatPicture -> lineWidth = lineWidth;
 END2 }
 
-FORM (Arrow_size, L"Praat picture: Arrow size", 0) {
-	POSITIVE (L"Arrow size", L"1.0")
+FORM (Arrow_size, U"Praat picture: Arrow size", 0) {
+	POSITIVE (U"Arrow size", U"1.0")
 OK2
-	SET_REAL (L"Arrow size", theCurrentPraatPicture -> arrowSize);
+	SET_REAL (U"Arrow size", theCurrentPraatPicture -> arrowSize);
 DO
-	double arrowSize = GET_REAL (L"Arrow size");
+	double arrowSize = GET_REAL (U"Arrow size");
 	{// scope
 		autoPraatPicture picture;
 		Graphics_setArrowSize (GRAPHICS, arrowSize);
@@ -372,14 +377,14 @@ DO
 	theCurrentPraatPicture -> arrowSize = arrowSize;
 END2 }
 
-FORM (Speckle_size, L"Praat picture: Speckle size", 0) {
-	LABEL (L"", L"Here you determine the diameter (in millimetres)")
-	LABEL (L"", L"of the dots that are drawn by \"speckle\" commands.")
-	POSITIVE (L"Speckle size (mm)", L"1.0")
+FORM (Speckle_size, U"Praat picture: Speckle size", 0) {
+	LABEL (U"", U"Here you determine the diameter (in millimetres)")
+	LABEL (U"", U"of the dots that are drawn by \"speckle\" commands.")
+	POSITIVE (U"Speckle size (mm)", U"1.0")
 OK2
-	SET_REAL (L"Speckle size", theCurrentPraatPicture -> speckleSize);
+	SET_REAL (U"Speckle size", theCurrentPraatPicture -> speckleSize);
 DO
-	double speckleSize = GET_REAL (L"Speckle size");
+	double speckleSize = GET_REAL (U"Speckle size");
 	{// scope
 		autoPraatPicture picture;
 		Graphics_setSpeckleSize (GRAPHICS, speckleSize);
@@ -415,11 +420,11 @@ DIRECT (Pink)    { setColour (Graphics_PINK);    } END
 DIRECT (Silver)  { setColour (Graphics_SILVER);  } END
 DIRECT (Grey)    { setColour (Graphics_GREY);    } END
 
-FORM (Colour, L"Praat picture: Colour", 0) {
-	COLOUR (L"Colour (0-1, name, or {r,g,b})", L"0.0")
+FORM (Colour, U"Praat picture: Colour", 0) {
+	COLOUR (U"Colour (0-1, name, or {r,g,b})", U"0.0")
 OK2
 DO
-	Graphics_Colour colour = GET_COLOUR (L"Colour");
+	Graphics_Colour colour = GET_COLOUR (U"Colour");
 	{// scope
 		autoPraatPicture picture;
 		Graphics_setColour (GRAPHICS, colour);
@@ -432,125 +437,153 @@ END2 }
 
 /***** "File" MENU *****/
 
-FORM_READ (Picture_readFromPraatPictureFile, L"Read picture from praat picture file", 0, false) {
+FORM_READ2 (Picture_readFromPraatPictureFile, U"Read picture from praat picture file", 0, false) {
 	Picture_readFromPraatPictureFile (praat_picture, file);
-} END
+END2 }
 
-static void DO_Picture_writeToEpsFile (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
-	static Any dia;
+static void DO_Picture_writeToEpsFile (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *dummy) {
+	static UiForm dia;
 	(void) narg;
 	(void) interpreter;
 	(void) modified;
 	(void) dummy;
-	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, L"Save as EPS file",
+	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, U"Save as EPS file",
 		DO_Picture_writeToEpsFile, NULL, invokingButtonTitle, NULL);
 	if (sendingForm == NULL && args == NULL && sendingString == NULL) {
-		UiOutfile_do (dia, L"praat.eps");
+		UiOutfile_do (dia, U"praat.eps");
 	} else { MelderFile file; structMelderFile file2 = { 0 };
 		if (args == NULL && sendingString == NULL) file = UiFile_getFile (dia);
 		else { Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); file = & file2; }
-		Picture_writeToEpsFile (praat_picture, file, TRUE, FALSE);
+		Picture_writeToEpsFile (praat_picture, file, true, false);
 	}
 }
-/*FORM_WRITE (Picture_writeToEpsFile, L"Save picture as Encapsulated PostScript file", 0, L"praat.eps")
-	if (! Picture_writeToEpsFile (praat_picture, fileName, TRUE)) return 0;
+/*FORM_WRITE (Picture_writeToEpsFile, U"Save picture as Encapsulated PostScript file", 0, U"praat.eps")
+	if (! Picture_writeToEpsFile (praat_picture, fileName, true, false)) return 0;
 END*/
 
-static void DO_Picture_writeToFontlessEpsFile_xipa (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
-	static Any dia;
+static void DO_Picture_writeToFontlessEpsFile_xipa (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *dummy) {
+	static UiForm dia;
 	(void) narg;
 	(void) interpreter;
 	(void) modified;
 	(void) dummy;
-	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, L"Save as fontless EPS file",
+	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, U"Save as fontless EPS file",
 		DO_Picture_writeToFontlessEpsFile_xipa, NULL, invokingButtonTitle, NULL);
 	if (sendingForm == NULL && args == NULL && sendingString == NULL) {
-		UiOutfile_do (dia, L"praat.eps");
+		UiOutfile_do (dia, U"praat.eps");
 	} else { MelderFile file; structMelderFile file2 = { 0 };
 		if (args == NULL && sendingString == NULL) file = UiFile_getFile (dia);
 		else { Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); file = & file2; }
-		Picture_writeToEpsFile (praat_picture, file, FALSE, FALSE);
+		Picture_writeToEpsFile (praat_picture, file, false, false);
 	}
 }
 
-static void DO_Picture_writeToFontlessEpsFile_silipa (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
-	static Any dia;
+static void DO_Picture_writeToFontlessEpsFile_silipa (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *dummy) {
+	static UiForm dia;
 	(void) narg;
 	(void) interpreter;
 	(void) modified;
 	(void) dummy;
-	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, L"Save as fontless EPS file",
+	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, U"Save as fontless EPS file",
 		DO_Picture_writeToFontlessEpsFile_silipa, NULL, invokingButtonTitle, NULL);
 	if (sendingForm == NULL && args == NULL && sendingString == NULL) {
-		UiOutfile_do (dia, L"praat.eps");
+		UiOutfile_do (dia, U"praat.eps");
 	} else { MelderFile file; structMelderFile file2 = { 0 };
 		if (args == NULL && sendingString == NULL) file = UiFile_getFile (dia);
 		else { Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); file = & file2; }
-		Picture_writeToEpsFile (praat_picture, file, FALSE, TRUE);
+		Picture_writeToEpsFile (praat_picture, file, false, true);
 	}
 }
 
-static void DO_Picture_writeToPdfFile (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
-	static Any dia;
+static void DO_Picture_writeToPdfFile (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *dummy) {
+	static UiForm dia;
 	(void) narg;
 	(void) interpreter;
 	(void) modified;
 	(void) dummy;
-	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, L"Save as PDF file",
+	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, U"Save as PDF file",
 		DO_Picture_writeToPdfFile, NULL, invokingButtonTitle, NULL);
 	if (sendingForm == NULL && args == NULL && sendingString == NULL) {
-		UiOutfile_do (dia, L"praat.pdf");
+		UiOutfile_do (dia, U"praat.pdf");
 	} else { MelderFile file; structMelderFile file2 = { 0 };
 		if (args == NULL && sendingString == NULL) file = UiFile_getFile (dia);
 		else { Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); file = & file2; }
-		Picture_writeToPdfFile (praat_picture, file);
+		if (theCurrentPraatPicture == & theForegroundPraatPicture) {
+			Picture_writeToPdfFile (praat_picture, file);
+		} else {
+			try {
+				//autoPraatPicture picture;
+				autoGraphics graphics = Graphics_create_pdffile (file, 300, NUMundefined, 10.24, NUMundefined, 7.68);
+				Graphics_play (GRAPHICS, graphics.peek());
+			} catch (MelderError) {
+				Melder_throw (U"Picture not written to PDF file ", file, U".");
+			}
+		}
 	}
 }
 
-static void DO_Picture_writeToPngFile_300 (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
-	static Any dia;
+static void DO_Picture_writeToPngFile_300 (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *dummy) {
+	static UiForm dia;
 	(void) narg;
 	(void) interpreter;
 	(void) modified;
 	(void) dummy;
-	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, L"Save as PNG file",
+	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, U"Save as PNG file",
 		DO_Picture_writeToPngFile_300, NULL, invokingButtonTitle, NULL);
 	if (sendingForm == NULL && args == NULL && sendingString == NULL) {
-		UiOutfile_do (dia, L"praat.png");
+		UiOutfile_do (dia, U"praat.png");
 	} else { MelderFile file; structMelderFile file2 = { 0 };
 		if (args == NULL && sendingString == NULL) file = UiFile_getFile (dia);
 		else { Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); file = & file2; }
-		Picture_writeToPngFile_300 (praat_picture, file);
+		if (theCurrentPraatPicture == & theForegroundPraatPicture) {
+			Picture_writeToPngFile_300 (praat_picture, file);
+		} else {
+			try {
+				autoGraphics graphics = Graphics_create_pngfile (file, 300, 0.0, 10.24, 0.0, 7.68);
+				Graphics_play (GRAPHICS, graphics.peek());
+			} catch (MelderError) {
+				Melder_throw (U"Picture not written to PNG file ", file, U".");
+			}
+		}
 	}
 }
 
-static void DO_Picture_writeToPngFile_600 (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
-	static Any dia;
+static void DO_Picture_writeToPngFile_600 (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *dummy) {
+	static UiForm dia;
 	(void) narg;
 	(void) interpreter;
 	(void) modified;
 	(void) dummy;
-	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, L"Save as PNG file",
+	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, U"Save as PNG file",
 		DO_Picture_writeToPngFile_600, NULL, invokingButtonTitle, NULL);
 	if (sendingForm == NULL && args == NULL && sendingString == NULL) {
-		UiOutfile_do (dia, L"praat.png");
+		UiOutfile_do (dia, U"praat.png");
 	} else { MelderFile file; structMelderFile file2 = { 0 };
 		if (args == NULL && sendingString == NULL) file = UiFile_getFile (dia);
 		else { Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); file = & file2; }
-		Picture_writeToPngFile_600 (praat_picture, file);
+		if (theCurrentPraatPicture == & theForegroundPraatPicture) {
+			Picture_writeToPngFile_600 (praat_picture, file);
+		} else {
+			try {
+				autoGraphics graphics = Graphics_create_pngfile (file, 600, 0.0, 10.24, 0.0, 7.68);
+				Graphics_play (GRAPHICS, graphics.peek());
+			} catch (MelderError) {
+				Melder_throw (U"Picture not written to PNG file ", file, U".");
+			}
+		}
 	}
 }
 
-static void DO_Picture_writeToPraatPictureFile (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
-	static Any dia;
+static void DO_Picture_writeToPraatPictureFile (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *dummy) {
+	static UiForm dia;
 	(void) narg;
 	(void) interpreter;
 	(void) modified;
 	(void) dummy;
-	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, L"Save as Praat picture file",
+	if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, U"Save as Praat picture file",
 		DO_Picture_writeToPraatPictureFile, NULL, invokingButtonTitle, NULL);
 	if (sendingForm == NULL && args == NULL && sendingString == NULL) {
-		UiOutfile_do (dia, L"praat.prapic");
+		UiOutfile_do (dia, U"praat.prapic");
 	} else { MelderFile file; structMelderFile file2 = { 0 };
 		if (args == NULL && sendingString == NULL) file = UiFile_getFile (dia);
 		else { Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); file = & file2; }
@@ -573,16 +606,16 @@ DIRECT (Print) {
 } END
 
 #ifdef _WIN32
-	static void DO_Picture_writeToWindowsMetafile (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
+	static void DO_Picture_writeToWindowsMetafile (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter, const char32 *invokingButtonTitle, bool modified, void *dummy) {
 		static Any dia;
 		(void) narg;
 		(void) interpreter;
 		(void) modified;
 		(void) dummy;
-		if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, L"Save as Windows metafile",
+		if (! dia) dia = UiOutfile_create (theCurrentPraatApplication -> topShell, U"Save as Windows metafile",
 			DO_Picture_writeToWindowsMetafile, NULL, invokingButtonTitle, NULL);
 		if (sendingForm == NULL && args == NULL && sendingString == NULL) {
-			UiOutfile_do (dia, L"praat.emf");
+			UiOutfile_do (dia, U"praat.emf");
 		} else { MelderFile file; structMelderFile file2 = { 0 };
 			if (args == NULL && sendingString == NULL) file = UiFile_getFile (dia);
 			else { Melder_relativePathToFile (args ? args [1]. string : sendingString, & file2); file = & file2; }
@@ -618,107 +651,107 @@ DIRECT (Erase_all) {
 
 /***** "World" MENU *****/
 
-FORM (Text, L"Praat picture: Text", L"Text...") {
-	REAL (L"Horizontal position", L"0.0")
-	OPTIONMENU (L"Horizontal alignment", 2)
-		OPTION (L"Left")
-		OPTION (L"Centre")
-		OPTION (L"Right")
-	REAL (L"Vertical position", L"0.0")
-	OPTIONMENU (L"Vertical alignment", 2)
-		OPTION (L"Bottom")
-		OPTION (L"Half")
-		OPTION (L"Top")
-	LABEL (L"", L"Text:")
-	TEXTFIELD (L"text", L"")
+FORM (Text, U"Praat picture: Text", U"Text...") {
+	REAL (U"Horizontal position", U"0.0")
+	OPTIONMENU (U"Horizontal alignment", 2)
+		OPTION (U"Left")
+		OPTION (U"Centre")
+		OPTION (U"Right")
+	REAL (U"Vertical position", U"0.0")
+	OPTIONMENU (U"Vertical alignment", 2)
+		OPTION (U"Bottom")
+		OPTION (U"Half")
+		OPTION (U"Top")
+	LABEL (U"", U"Text:")
+	TEXTFIELD (U"text", U"")
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setTextAlignment (GRAPHICS,
-		GET_INTEGER (L"Horizontal alignment") - 1, GET_INTEGER (L"Vertical alignment") - 1);
+		GET_INTEGER (U"Horizontal alignment") - 1, GET_INTEGER (U"Vertical alignment") - 1);
 	Graphics_setInner (GRAPHICS);
-	Graphics_text (GRAPHICS, GET_REAL (L"Horizontal position"),
-		GET_REAL (L"Vertical position"), GET_STRING (L"text"));
+	Graphics_text (GRAPHICS, GET_REAL (U"Horizontal position"),
+		GET_REAL (U"Vertical position"), GET_STRING (U"text"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (Text_special, L"Praat picture: Text special", 0) {
-	REAL (L"Horizontal position", L"0.0")
-	OPTIONMENU (L"Horizontal alignment", 2)
-		OPTION (L"left")
-		OPTION (L"centre")
-		OPTION (L"right")
-	REAL (L"Vertical position", L"0.0")
-	OPTIONMENU (L"Vertical alignment", 2)
-		OPTION (L"bottom")
-		OPTION (L"half")
-		OPTION (L"top")
-	OPTIONMENU_ENUM (L"Font", kGraphics_font, DEFAULT)
-	NATURAL (L"Font size", L"10")
-	SENTENCE (L"Rotation (degrees or dx;dy)", L"0")
-	LABEL (L"", L"Text:")
-	TEXTFIELD (L"text", L"")
+FORM (Text_special, U"Praat picture: Text special", 0) {
+	REAL (U"Horizontal position", U"0.0")
+	OPTIONMENU (U"Horizontal alignment", 2)
+		OPTION (U"left")
+		OPTION (U"centre")
+		OPTION (U"right")
+	REAL (U"Vertical position", U"0.0")
+	OPTIONMENU (U"Vertical alignment", 2)
+		OPTION (U"bottom")
+		OPTION (U"half")
+		OPTION (U"top")
+	OPTIONMENU_ENUM (U"Font", kGraphics_font, DEFAULT)
+	NATURAL (U"Font size", U"10")
+	SENTENCE (U"Rotation (degrees or dx;dy)", U"0")
+	LABEL (U"", U"Text:")
+	TEXTFIELD (U"text", U"")
 OK2
 DO
 	kGraphics_font currentFont = Graphics_inqFont (GRAPHICS);
 	int currentSize = Graphics_inqFontSize (GRAPHICS);
 	autoPraatPicture picture;
-	Graphics_setTextAlignment (GRAPHICS, GET_INTEGER (L"Horizontal alignment") - 1, GET_INTEGER (L"Vertical alignment") - 1);
+	Graphics_setTextAlignment (GRAPHICS, GET_INTEGER (U"Horizontal alignment") - 1, GET_INTEGER (U"Vertical alignment") - 1);
 	Graphics_setInner (GRAPHICS);
-	Graphics_setFont (GRAPHICS, GET_ENUM (kGraphics_font, L"Font"));
-	Graphics_setFontSize (GRAPHICS, GET_INTEGER (L"Font size"));
-	wchar_t *rotation = GET_STRING (L"Rotation"), *semicolon;
-	if ((semicolon = wcschr (rotation, ';')) != NULL)
+	Graphics_setFont (GRAPHICS, GET_ENUM (kGraphics_font, U"Font"));
+	Graphics_setFontSize (GRAPHICS, GET_INTEGER (U"Font size"));
+	char32 *rotation = GET_STRING (U"Rotation"), *semicolon;
+	if ((semicolon = str32chr (rotation, ';')) != NULL)
 		Graphics_setTextRotation_vector (GRAPHICS, Melder_atof (rotation), Melder_atof (semicolon + 1));
 	else
 		Graphics_setTextRotation (GRAPHICS, Melder_atof (rotation));
-	Graphics_text (GRAPHICS, GET_REAL (L"Horizontal position"), GET_REAL (L"Vertical position"), GET_STRING (L"text"));
+	Graphics_text (GRAPHICS, GET_REAL (U"Horizontal position"), GET_REAL (U"Vertical position"), GET_STRING (U"text"));
 	Graphics_setFont (GRAPHICS, currentFont);
 	Graphics_setFontSize (GRAPHICS, currentSize);
 	Graphics_setTextRotation (GRAPHICS, 0.0);
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-static void dia_line (Any dia) {
-	REAL (L"From x", L"0.0")
-	REAL (L"From y", L"0.0")
-	REAL (L"To x", L"1.0")
-	REAL (L"To y", L"1.0")
+static void dia_line (UiForm dia) {
+	REAL (U"From x", U"0.0")
+	REAL (U"From y", U"0.0")
+	REAL (U"To x", U"1.0")
+	REAL (U"To y", U"1.0")
 }
-FORM (DrawLine, L"Praat picture: Draw line", 0) {
+FORM (DrawLine, U"Praat picture: Draw line", 0) {
 	dia_line (dia);
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_line (GRAPHICS, GET_REAL (L"From x"), GET_REAL (L"From y"), GET_REAL (L"To x"),
-		GET_REAL (L"To y"));
+	Graphics_line (GRAPHICS, GET_REAL (U"From x"), GET_REAL (U"From y"), GET_REAL (U"To x"),
+		GET_REAL (U"To y"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (DrawArrow, L"Praat picture: Draw arrow", 0) {
+FORM (DrawArrow, U"Praat picture: Draw arrow", 0) {
 	dia_line (dia);
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_arrow (GRAPHICS, GET_REAL (L"From x"), GET_REAL (L"From y"), GET_REAL (L"To x"),
-		GET_REAL (L"To y"));
+	Graphics_arrow (GRAPHICS, GET_REAL (U"From x"), GET_REAL (U"From y"), GET_REAL (U"To x"),
+		GET_REAL (U"To y"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (DrawDoubleArrow, L"Praat picture: Draw double arrow", 0) {
+FORM (DrawDoubleArrow, U"Praat picture: Draw double arrow", 0) {
 	dia_line (dia);
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_doubleArrow (GRAPHICS, GET_REAL (L"From x"), GET_REAL (L"From y"), GET_REAL (L"To x"),
-		GET_REAL (L"To y"));
+	Graphics_doubleArrow (GRAPHICS, GET_REAL (U"From x"), GET_REAL (U"From y"), GET_REAL (U"To x"),
+		GET_REAL (U"To y"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-Thing_define (PraatPictureFunction, Data) {
+Thing_define (PraatPictureFunction, Daata) {
 	// new data:
 	public:
 		double xmin, xmax, dx, x1;
@@ -730,22 +763,22 @@ Thing_define (PraatPictureFunction, Data) {
 		virtual bool v_hasGetDx   () { return true; }   virtual double v_getDx   ()        { return dx; }
 		virtual bool v_hasGetX    () { return true; }   virtual double v_getX    (long ix) { return x1 + (ix - 1) * dx; }
 };
-Thing_implement (PraatPictureFunction, Data, 0);
-
-FORM (DrawFunction, L"Praat picture: Draw function", 0) {
-	LABEL (L"", L"This command assumes that the x and y axes")
-	LABEL (L"", L"have been set by a Draw command or by \"Axes...\".")
-	REAL (L"From x", L"0.0")
-	REAL (L"To x", L"0.0 (= all)")
-	NATURAL (L"Number of horizontal steps", L"1000")
-	LABEL (L"", L"Formula:")
-	TEXTFIELD (L"formula", L"x^2 - x^4")
+Thing_implement (PraatPictureFunction, Daata, 0);
+
+FORM (DrawFunction, U"Praat picture: Draw function", 0) {
+	LABEL (U"", U"This command assumes that the x and y axes")
+	LABEL (U"", U"have been set by a Draw command or by \"Axes...\".")
+	REAL (U"From x", U"0.0")
+	REAL (U"To x", U"0.0 (= all)")
+	NATURAL (U"Number of horizontal steps", U"1000")
+	LABEL (U"", U"Formula:")
+	TEXTFIELD (U"formula", U"x^2 - x^4")
 OK2
 DO
 	double x1WC, x2WC, y1WC, y2WC;
-	double fromX = GET_REAL (L"From x"), toX = GET_REAL (L"To x");
-	long n = GET_INTEGER (L"Number of horizontal steps");
-	wchar_t *formula = GET_STRING (L"formula");
+	double fromX = GET_REAL (U"From x"), toX = GET_REAL (U"To x");
+	long n = GET_INTEGER (U"Number of horizontal steps");
+	char32 *formula = GET_STRING (U"formula");
 	if (n < 2) return;
 	Graphics_inqWindow (GRAPHICS, & x1WC, & x2WC, & y1WC, & y2WC);
 	if (fromX == toX) fromX = x1WC, toX = x2WC;
@@ -756,7 +789,7 @@ DO
 	function -> nx = n;
 	function -> x1 = fromX;
 	function -> dx = (toX - fromX) / (n - 1);
-	Formula_compile (interpreter, function.peek(), formula, kFormula_EXPRESSION_TYPE_NUMERIC, TRUE);
+	Formula_compile (interpreter, function.peek(), formula, kFormula_EXPRESSION_TYPE_NUMERIC, true);
 	for (long i = 1; i <= n; i ++) {
 		struct Formula_Result result;
 		Formula_run (1, i, & result);
@@ -768,180 +801,180 @@ DO
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-static void dia_rectangle (Any dia) {
-	REAL (L"From x", L"0.0")
-	REAL (L"To x", L"1.0")
-	REAL (L"From y", L"0.0")
-	REAL (L"To y", L"1.0")
+static void dia_rectangle (UiForm dia) {
+	REAL (U"From x", U"0.0")
+	REAL (U"To x", U"1.0")
+	REAL (U"From y", U"0.0")
+	REAL (U"To y", U"1.0")
 }
-FORM (DrawRectangle, L"Praat picture: Draw rectangle", 0) {
+FORM (DrawRectangle, U"Praat picture: Draw rectangle", 0) {
 	dia_rectangle (dia);
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
 	Graphics_rectangle (GRAPHICS,
-		GET_REAL (L"From x"), GET_REAL (L"To x"), GET_REAL (L"From y"), GET_REAL (L"To y"));
+		GET_REAL (U"From x"), GET_REAL (U"To x"), GET_REAL (U"From y"), GET_REAL (U"To y"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (PaintRectangle, L"Praat picture: Paint rectangle", 0) {
-	COLOUR (L"Colour (0-1, name, or {r,g,b})", L"0.5")
+FORM (PaintRectangle, U"Praat picture: Paint rectangle", 0) {
+	COLOUR (U"Colour (0-1, name, or {r,g,b})", U"0.5")
 	dia_rectangle (dia);
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_setColour (GRAPHICS, GET_COLOUR (L"Colour"));
-	Graphics_fillRectangle (GRAPHICS, GET_REAL (L"From x"), GET_REAL (L"To x"), GET_REAL (L"From y"), GET_REAL (L"To y"));
+	Graphics_setColour (GRAPHICS, GET_COLOUR (U"Colour"));
+	Graphics_fillRectangle (GRAPHICS, GET_REAL (U"From x"), GET_REAL (U"To x"), GET_REAL (U"From y"), GET_REAL (U"To y"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (DrawRoundedRectangle, L"Praat picture: Draw rounded rectangle", 0) {
+FORM (DrawRoundedRectangle, U"Praat picture: Draw rounded rectangle", 0) {
 	dia_rectangle (dia);
-	POSITIVE (L"Radius (mm)", L"3.0")
+	POSITIVE (U"Radius (mm)", U"3.0")
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
 	Graphics_roundedRectangle (GRAPHICS,
-		GET_REAL (L"From x"), GET_REAL (L"To x"), GET_REAL (L"From y"), GET_REAL (L"To y"), GET_REAL (L"Radius"));
+		GET_REAL (U"From x"), GET_REAL (U"To x"), GET_REAL (U"From y"), GET_REAL (U"To y"), GET_REAL (U"Radius"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (PaintRoundedRectangle, L"Praat picture: Paint rounded rectangle", 0) {
-	COLOUR (L"Colour (0-1, name, or {r,g,b})", L"0.5")
+FORM (PaintRoundedRectangle, U"Praat picture: Paint rounded rectangle", 0) {
+	COLOUR (U"Colour (0-1, name, or {r,g,b})", U"0.5")
 	dia_rectangle (dia);
-	POSITIVE (L"Radius (mm)", L"3.0")
+	POSITIVE (U"Radius (mm)", U"3.0")
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_setColour (GRAPHICS, GET_COLOUR (L"Colour"));
-	Graphics_fillRoundedRectangle (GRAPHICS, GET_REAL (L"From x"), GET_REAL (L"To x"), GET_REAL (L"From y"), GET_REAL (L"To y"), GET_REAL (L"Radius"));
+	Graphics_setColour (GRAPHICS, GET_COLOUR (U"Colour"));
+	Graphics_fillRoundedRectangle (GRAPHICS, GET_REAL (U"From x"), GET_REAL (U"To x"), GET_REAL (U"From y"), GET_REAL (U"To y"), GET_REAL (U"Radius"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (DrawArc, L"Praat picture: Draw arc", 0) {
-	REAL (L"Centre x", L"0.0")
-	REAL (L"Centre y", L"0.0")
-	POSITIVE (L"Radius (along x)", L"1.0")
-	REAL (L"From angle (degrees)", L"0.0")
-	REAL (L"To angle (degrees)", L"90.0")
+FORM (DrawArc, U"Praat picture: Draw arc", 0) {
+	REAL (U"Centre x", U"0.0")
+	REAL (U"Centre y", U"0.0")
+	POSITIVE (U"Radius (along x)", U"1.0")
+	REAL (U"From angle (degrees)", U"0.0")
+	REAL (U"To angle (degrees)", U"90.0")
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_arc (GRAPHICS, GET_REAL (L"Centre x"), GET_REAL (L"Centre y"), GET_REAL (L"Radius"),
-		GET_REAL (L"From angle"), GET_REAL (L"To angle"));
+	Graphics_arc (GRAPHICS, GET_REAL (U"Centre x"), GET_REAL (U"Centre y"), GET_REAL (U"Radius"),
+		GET_REAL (U"From angle"), GET_REAL (U"To angle"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (DrawEllipse, L"Praat picture: Draw ellipse", 0) {
+FORM (DrawEllipse, U"Praat picture: Draw ellipse", 0) {
 	dia_rectangle (dia);
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
 	Graphics_ellipse (GRAPHICS,
-		GET_REAL (L"From x"), GET_REAL (L"To x"), GET_REAL (L"From y"), GET_REAL (L"To y"));
+		GET_REAL (U"From x"), GET_REAL (U"To x"), GET_REAL (U"From y"), GET_REAL (U"To y"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (PaintEllipse, L"Praat picture: Paint ellipse", 0) {
-	COLOUR (L"Colour (0-1, name, or {r,g,b})", L"0.5")
+FORM (PaintEllipse, U"Praat picture: Paint ellipse", 0) {
+	COLOUR (U"Colour (0-1, name, or {r,g,b})", U"0.5")
 	dia_rectangle (dia);
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_setColour (GRAPHICS, GET_COLOUR (L"Colour"));
-	Graphics_fillEllipse (GRAPHICS, GET_REAL (L"From x"), GET_REAL (L"To x"), GET_REAL (L"From y"), GET_REAL (L"To y"));
+	Graphics_setColour (GRAPHICS, GET_COLOUR (U"Colour"));
+	Graphics_fillEllipse (GRAPHICS, GET_REAL (U"From x"), GET_REAL (U"To x"), GET_REAL (U"From y"), GET_REAL (U"To y"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (DrawCircle, L"Praat picture: Draw circle", 0) {
-	REAL (L"Centre x", L"0.0")
-	REAL (L"Centre y", L"0.0")
-	POSITIVE (L"Radius (along x)", L"1.0")
+FORM (DrawCircle, U"Praat picture: Draw circle", 0) {
+	REAL (U"Centre x", U"0.0")
+	REAL (U"Centre y", U"0.0")
+	POSITIVE (U"Radius (along x)", U"1.0")
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_circle (GRAPHICS, GET_REAL (L"Centre x"), GET_REAL (L"Centre y"), GET_REAL (L"Radius"));
+	Graphics_circle (GRAPHICS, GET_REAL (U"Centre x"), GET_REAL (U"Centre y"), GET_REAL (U"Radius"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (PaintCircle, L"Praat picture: Paint circle", 0) {
-	COLOUR (L"Colour (0-1, name, or {r,g,b})", L"0.5")
-	REAL (L"Centre x", L"0")
-	REAL (L"Centre y", L"0")
-	POSITIVE (L"Radius (along x)", L"1.0")
+FORM (PaintCircle, U"Praat picture: Paint circle", 0) {
+	COLOUR (U"Colour (0-1, name, or {r,g,b})", U"0.5")
+	REAL (U"Centre x", U"0")
+	REAL (U"Centre y", U"0")
+	POSITIVE (U"Radius (along x)", U"1.0")
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_setColour (GRAPHICS, GET_COLOUR (L"Colour"));
-	Graphics_fillCircle (GRAPHICS, GET_REAL (L"Centre x"), GET_REAL (L"Centre y"), GET_REAL (L"Radius"));
+	Graphics_setColour (GRAPHICS, GET_COLOUR (U"Colour"));
+	Graphics_fillCircle (GRAPHICS, GET_REAL (U"Centre x"), GET_REAL (U"Centre y"), GET_REAL (U"Radius"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (DrawCircle_mm, L"Praat picture: Draw circle (mm)", 0) {
-	REAL (L"Centre x", L"0.0")
-	REAL (L"Centre y", L"0.0")
-	POSITIVE (L"Diameter (mm)", L"5.0")
+FORM (DrawCircle_mm, U"Praat picture: Draw circle (mm)", 0) {
+	REAL (U"Centre x", U"0.0")
+	REAL (U"Centre y", U"0.0")
+	POSITIVE (U"Diameter (mm)", U"5.0")
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_circle_mm (GRAPHICS, GET_REAL (L"Centre x"), GET_REAL (L"Centre y"), GET_REAL (L"Diameter"));
+	Graphics_circle_mm (GRAPHICS, GET_REAL (U"Centre x"), GET_REAL (U"Centre y"), GET_REAL (U"Diameter"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (PaintCircle_mm, L"Praat picture: Paint circle (mm)", 0) {
-	COLOUR (L"Colour (0-1, name, or {r,g,b})", L"0.5")
-	REAL (L"Centre x", L"0.0")
-	REAL (L"Centre y", L"0.0")
-	POSITIVE (L"Diameter (mm)", L"5.0")
+FORM (PaintCircle_mm, U"Praat picture: Paint circle (mm)", 0) {
+	COLOUR (U"Colour (0-1, name, or {r,g,b})", U"0.5")
+	REAL (U"Centre x", U"0.0")
+	REAL (U"Centre y", U"0.0")
+	POSITIVE (U"Diameter (mm)", U"5.0")
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_setColour (GRAPHICS, GET_COLOUR (L"Colour"));
-	Graphics_fillCircle_mm (GRAPHICS, GET_REAL (L"Centre x"), GET_REAL (L"Centre y"), GET_REAL (L"Diameter"));
+	Graphics_setColour (GRAPHICS, GET_COLOUR (U"Colour"));
+	Graphics_fillCircle_mm (GRAPHICS, GET_REAL (U"Centre x"), GET_REAL (U"Centre y"), GET_REAL (U"Diameter"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
-FORM (InsertPictureFromFile, L"Praat picture: Insert picture from file", L"Insert picture from file...") {
-	LABEL (L"", L"File name:")
-	TEXTFIELD (L"fileName", L"~/Desktop/paul.jpg")
+FORM (InsertPictureFromFile, U"Praat picture: Insert picture from file", U"Insert picture from file...") {
+	LABEL (U"", U"File name:")
+	TEXTFIELD (U"fileName", U"~/Desktop/paul.jpg")
 	dia_rectangle (dia);
 OK2
 DO
 	autoPraatPicture picture;
 	Graphics_setInner (GRAPHICS);
-	Graphics_imageFromFile (GRAPHICS, GET_STRING (L"fileName"), GET_REAL (L"From x"), GET_REAL (L"To x"), GET_REAL (L"From y"), GET_REAL (L"To y"));
+	Graphics_imageFromFile (GRAPHICS, GET_STRING (U"fileName"), GET_REAL (U"From x"), GET_REAL (U"To x"), GET_REAL (U"From y"), GET_REAL (U"To y"));
 	Graphics_unsetInner (GRAPHICS);
 END2 }
 
 
-FORM (Axes, L"Praat picture: Axes", L"Axes...") {
-	REAL (L"left Left and right", L"0.0")
-	REAL (L"right Left and right", L"1.0")
-	REAL (L"left Bottom and top", L"0.0")
-	REAL (L"right Bottom and top", L"1.0")
+FORM (Axes, U"Praat picture: Axes", U"Axes...") {
+	REAL (U"left Left and right", U"0.0")
+	REAL (U"right Left and right", U"1.0")
+	REAL (U"left Bottom and top", U"0.0")
+	REAL (U"right Bottom and top", U"1.0")
 OK2
 	double x1WC, x2WC, y1WC, y2WC;
 	Graphics_inqWindow (GRAPHICS, & x1WC, & x2WC, & y1WC, & y2WC);
-	SET_REAL (L"left Left and right", x1WC);
-	SET_REAL (L"right Left and right", x2WC);
-	SET_REAL (L"left Bottom and top", y1WC);
-	SET_REAL (L"right Bottom and top", y2WC);
+	SET_REAL (U"left Left and right", x1WC);
+	SET_REAL (U"right Left and right", x2WC);
+	SET_REAL (U"left Bottom and top", y1WC);
+	SET_REAL (U"right Bottom and top", y2WC);
 DO
-	double left = GET_REAL (L"left Left and right"), right = GET_REAL (L"right Left and right");
-	double top = GET_REAL (L"right Bottom and top"), bottom = GET_REAL (L"left Bottom and top");
-	REQUIRE (right != left, L"Left and right must not be equal.")
-	REQUIRE (top != bottom, L"Top and bottom must not be equal.")
+	double left = GET_REAL (U"left Left and right"), right = GET_REAL (U"right Left and right");
+	double top = GET_REAL (U"right Bottom and top"), bottom = GET_REAL (U"left Bottom and top");
+	REQUIRE (right != left, U"Left and right must not be equal.")
+	REQUIRE (top != bottom, U"Top and bottom must not be equal.")
 	autoPraatPicture picture;
 	Graphics_setWindow (GRAPHICS, left, right, bottom, top);
 END2 }
@@ -953,105 +986,105 @@ DIRECT (DrawInnerBox) {
 	Graphics_drawInnerBox (GRAPHICS);
 } END
 
-FORM (Text_left, L"Praat picture: Text left", L"Text left/right/top/bottom...") {
-	BOOLEAN (L"Far", 1)
-	TEXTFIELD (L"text", L"")
+FORM (Text_left, U"Praat picture: Text left", U"Text left/right/top/bottom...") {
+	BOOLEAN (U"Far", 1)
+	TEXTFIELD (U"text", U"")
 OK2
 DO
 	autoPraatPicture picture;
-	Graphics_textLeft (GRAPHICS, GET_INTEGER (L"Far"), GET_STRING (L"text"));
+	Graphics_textLeft (GRAPHICS, GET_INTEGER (U"Far"), GET_STRING (U"text"));
 END2 }
 
-FORM (Text_right, L"Praat picture: Text right", L"Text left/right/top/bottom...") {
-	BOOLEAN (L"Far", 1)
-	TEXTFIELD (L"text", L"")
+FORM (Text_right, U"Praat picture: Text right", U"Text left/right/top/bottom...") {
+	BOOLEAN (U"Far", 1)
+	TEXTFIELD (U"text", U"")
 OK2
 DO
 	autoPraatPicture picture;
-	Graphics_textRight (GRAPHICS, GET_INTEGER (L"Far"), GET_STRING (L"text"));
+	Graphics_textRight (GRAPHICS, GET_INTEGER (U"Far"), GET_STRING (U"text"));
 END2 }
 
-FORM (Text_top, L"Praat picture: Text top", L"Text left/right/top/bottom...") {
-	BOOLEAN (L"Far", 0)
-	TEXTFIELD (L"text", L"")
+FORM (Text_top, U"Praat picture: Text top", U"Text left/right/top/bottom...") {
+	BOOLEAN (U"Far", 0)
+	TEXTFIELD (U"text", U"")
 OK2
 DO
 	autoPraatPicture picture;
-	Graphics_textTop (GRAPHICS, GET_INTEGER (L"Far"), GET_STRING (L"text"));
+	Graphics_textTop (GRAPHICS, GET_INTEGER (U"Far"), GET_STRING (U"text"));
 END2 }
 
-FORM (Text_bottom, L"Praat picture: Text bottom", L"Text left/right/top/bottom...") {
-	BOOLEAN (L"Far", 1)
-	TEXTFIELD (L"text", L"")
+FORM (Text_bottom, U"Praat picture: Text bottom", U"Text left/right/top/bottom...") {
+	BOOLEAN (U"Far", 1)
+	TEXTFIELD (U"text", U"")
 OK2
 DO
 	autoPraatPicture picture;
-	Graphics_textBottom (GRAPHICS, GET_INTEGER (L"Far"), GET_STRING (L"text"));
+	Graphics_textBottom (GRAPHICS, GET_INTEGER (U"Far"), GET_STRING (U"text"));
 END2 }
 
-static void dia_marksEvery (Any dia) {
-	POSITIVE (L"Units", L"1.0")
-	POSITIVE (L"Distance", L"0.1")
-	BOOLEAN (L"Write numbers", 1)
-	BOOLEAN (L"Draw ticks", 1)
-	BOOLEAN (L"Draw dotted lines", 1)
+static void dia_marksEvery (UiForm dia) {
+	POSITIVE (U"Units", U"1.0")
+	POSITIVE (U"Distance", U"0.1")
+	BOOLEAN (U"Write numbers", 1)
+	BOOLEAN (U"Draw ticks", 1)
+	BOOLEAN (U"Draw dotted lines", 1)
 }
-static void do_marksEvery (Any dia, void (*Graphics_marksEvery) (Graphics, double, double, bool, bool, bool)) {
+static void do_marksEvery (UiForm dia, void (*Graphics_marksEvery) (Graphics, double, double, bool, bool, bool)) {
 	autoPraatPicture picture;
-	Graphics_marksEvery (GRAPHICS, GET_REAL (L"Units"), GET_REAL (L"Distance"),
-		GET_INTEGER (L"Write numbers"),
-		GET_INTEGER (L"Draw ticks"), GET_INTEGER (L"Draw dotted lines"));
+	Graphics_marksEvery (GRAPHICS, GET_REAL (U"Units"), GET_REAL (U"Distance"),
+		GET_INTEGER (U"Write numbers"),
+		GET_INTEGER (U"Draw ticks"), GET_INTEGER (U"Draw dotted lines"));
 }
-FORM (Marks_left_every, L"Praat picture: Marks left every...", L"Marks left/right/top/bottom every...") {
+FORM (Marks_left_every, U"Praat picture: Marks left every...", U"Marks left/right/top/bottom every...") {
 	dia_marksEvery (dia); OK2 DO do_marksEvery (dia, Graphics_marksLeftEvery); END2 }
-FORM (Marks_right_every, L"Praat picture: Marks right every...", L"Marks left/right/top/bottom every...") {
+FORM (Marks_right_every, U"Praat picture: Marks right every...", U"Marks left/right/top/bottom every...") {
 	dia_marksEvery (dia); OK2 DO do_marksEvery (dia, Graphics_marksRightEvery); END2 }
-FORM (Marks_bottom_every, L"Praat picture: Marks bottom every...", L"Marks left/right/top/bottom every...") {
+FORM (Marks_bottom_every, U"Praat picture: Marks bottom every...", U"Marks left/right/top/bottom every...") {
 	dia_marksEvery (dia); OK2 DO do_marksEvery (dia, Graphics_marksBottomEvery); END2 }
-FORM (Marks_top_every, L"Praat picture: Marks top every...", L"Marks left/right/top/bottom every...") {
+FORM (Marks_top_every, U"Praat picture: Marks top every...", U"Marks left/right/top/bottom every...") {
 	dia_marksEvery (dia); OK2 DO do_marksEvery (dia, Graphics_marksTopEvery); END2 }
 
-static void dia_marks (Any dia) {
-	NATURAL (L"Number of marks", L"6")
-	BOOLEAN (L"Write numbers", 1)
-	BOOLEAN (L"Draw ticks", 1)
-	BOOLEAN (L"Draw dotted lines", 1)
+static void dia_marks (UiForm dia) {
+	NATURAL (U"Number of marks", U"6")
+	BOOLEAN (U"Write numbers", 1)
+	BOOLEAN (U"Draw ticks", 1)
+	BOOLEAN (U"Draw dotted lines", 1)
 }
-static void do_marks (Any dia, void (*Graphics_marks) (Graphics, int, bool, bool, bool)) {
-	long numberOfMarks = GET_INTEGER (L"Number of marks");
-	REQUIRE (numberOfMarks >= 2, L"`Number of marks' must be at least 2.")
+static void do_marks (UiForm dia, void (*Graphics_marks) (Graphics, int, bool, bool, bool)) {
+	long numberOfMarks = GET_INTEGER (U"Number of marks");
+	REQUIRE (numberOfMarks >= 2, U"`Number of marks' must be at least 2.")
 	autoPraatPicture picture;
-	Graphics_marks (GRAPHICS, numberOfMarks, GET_INTEGER (L"Write numbers"),
-		GET_INTEGER (L"Draw ticks"), GET_INTEGER (L"Draw dotted lines"));
+	Graphics_marks (GRAPHICS, numberOfMarks, GET_INTEGER (U"Write numbers"),
+		GET_INTEGER (U"Draw ticks"), GET_INTEGER (U"Draw dotted lines"));
 }
-FORM (Marks_left, L"Praat picture: Marks left", L"Marks left/right/top/bottom...") {
+FORM (Marks_left, U"Praat picture: Marks left", U"Marks left/right/top/bottom...") {
 	dia_marks (dia); OK2 DO do_marks (dia, Graphics_marksLeft); END2 }
-FORM (Marks_right, L"Praat picture: Marks right", L"Marks left/right/top/bottom...") {
+FORM (Marks_right, U"Praat picture: Marks right", U"Marks left/right/top/bottom...") {
 	dia_marks (dia); OK2 DO do_marks (dia, Graphics_marksRight); END2 }
-FORM (Marks_bottom, L"Praat picture: Marks bottom", L"Marks left/right/top/bottom...") {
+FORM (Marks_bottom, U"Praat picture: Marks bottom", U"Marks left/right/top/bottom...") {
 	dia_marks (dia); OK2 DO do_marks (dia, Graphics_marksBottom); END2 }
-FORM (Marks_top, L"Praat picture: Marks top", L"Marks left/right/top/bottom...") {
+FORM (Marks_top, U"Praat picture: Marks top", U"Marks left/right/top/bottom...") {
 	dia_marks (dia); OK2 DO do_marks (dia, Graphics_marksTop); END2 }
 
-static void dia_marksLogarithmic (Any dia) {
-	NATURAL (L"Marks per decade", L"3")
-	BOOLEAN (L"Write numbers", 1)
-	BOOLEAN (L"Draw ticks", 1)
-	BOOLEAN (L"Draw dotted lines", 1)
+static void dia_marksLogarithmic (UiForm dia) {
+	NATURAL (U"Marks per decade", U"3")
+	BOOLEAN (U"Write numbers", 1)
+	BOOLEAN (U"Draw ticks", 1)
+	BOOLEAN (U"Draw dotted lines", 1)
 }
-static void do_marksLogarithmic (Any dia, void (*Graphics_marksLogarithmic) (Graphics, int, bool, bool, bool)) {
-	long numberOfMarksPerDecade = GET_INTEGER (L"Marks per decade");
+static void do_marksLogarithmic (UiForm dia, void (*Graphics_marksLogarithmic) (Graphics, int, bool, bool, bool)) {
+	long numberOfMarksPerDecade = GET_INTEGER (U"Marks per decade");
 	autoPraatPicture picture;
-	Graphics_marksLogarithmic (GRAPHICS, numberOfMarksPerDecade, GET_INTEGER (L"Write numbers"),
-		GET_INTEGER (L"Draw ticks"), GET_INTEGER (L"Draw dotted lines"));
+	Graphics_marksLogarithmic (GRAPHICS, numberOfMarksPerDecade, GET_INTEGER (U"Write numbers"),
+		GET_INTEGER (U"Draw ticks"), GET_INTEGER (U"Draw dotted lines"));
 }
-FORM (marksLeftLogarithmic, L"Praat picture: Logarithmic marks left", L"Logarithmic marks left/right/top/bottom...") {
+FORM (marksLeftLogarithmic, U"Praat picture: Logarithmic marks left", U"Logarithmic marks left/right/top/bottom...") {
 	dia_marksLogarithmic (dia); OK2 DO do_marksLogarithmic (dia, Graphics_marksLeftLogarithmic); END2 }
-FORM (marksRightLogarithmic, L"Praat picture: Logarithmic marks right", L"Logarithmic marks left/right/top/bottom...") {
+FORM (marksRightLogarithmic, U"Praat picture: Logarithmic marks right", U"Logarithmic marks left/right/top/bottom...") {
 	dia_marksLogarithmic (dia); OK2 DO do_marksLogarithmic (dia, Graphics_marksRightLogarithmic); END2 }
-FORM (marksBottomLogarithmic, L"Praat picture: Logarithmic marks bottom", L"Logarithmic marks left/right/top/bottom...") {
+FORM (marksBottomLogarithmic, U"Praat picture: Logarithmic marks bottom", U"Logarithmic marks left/right/top/bottom...") {
 	dia_marksLogarithmic (dia); OK2 DO do_marksLogarithmic (dia, Graphics_marksBottomLogarithmic); END2 }
-FORM (marksTopLogarithmic, L"Praat picture: Logarithmic marks top", L"Logarithmic marks left/right/top/bottom...") {
+FORM (marksTopLogarithmic, U"Praat picture: Logarithmic marks top", U"Logarithmic marks left/right/top/bottom...") {
 	dia_marksLogarithmic (dia); OK2 DO do_marksLogarithmic (dia, Graphics_marksTopLogarithmic); END2 }
 
 static void sortBoundingBox (double *x1WC, double *x2WC, double *y1WC, double *y2WC) {
@@ -1060,19 +1093,19 @@ static void sortBoundingBox (double *x1WC, double *x2WC, double *y1WC, double *y
 	if (*y1WC > *y2WC) temp = *y1WC, *y1WC = *y2WC, *y2WC = temp;
 }
 
-static void dia_oneMark (Any dia) {
-	REAL (L"Position", L"0.0")
-	BOOLEAN (L"Write number", 1)
-	BOOLEAN (L"Draw tick", 1)
-	BOOLEAN (L"Draw dotted line", 1)
-	LABEL (L"", L"Draw text:")
-	TEXTFIELD (L"text", L"")
+static void dia_oneMark (UiForm dia) {
+	REAL (U"Position", U"0.0")
+	BOOLEAN (U"Write number", 1)
+	BOOLEAN (U"Draw tick", 1)
+	BOOLEAN (U"Draw dotted line", 1)
+	LABEL (U"", U"Draw text:")
+	TEXTFIELD (U"text", U"")
 }
-FORM (Mark_left, L"Praat picture: One mark left", L"One mark left/right/top/bottom...") {
+FORM (Mark_left, U"Praat picture: One mark left", U"One mark left/right/top/bottom...") {
 	dia_oneMark (dia);
 OK2
 DO
-	double position = GET_REAL (L"Position");
+	double position = GET_REAL (U"Position");
 	double x1WC, x2WC, y1WC, y2WC, dy;
 	{// scope
 		autoPraatPicture picture;
@@ -1081,18 +1114,18 @@ DO
 	sortBoundingBox (& x1WC, & x2WC, & y1WC, & y2WC);
 	dy = 0.2 * (y2WC - y1WC);
 	if (position < y1WC - dy || position > y2WC + dy)
-		Melder_throw ("\"Position\" must be between ", y1WC, " and ", y2WC, ".");
+		Melder_throw (U"\"Position\" must be between ", y1WC, U" and ", y2WC, U".");
 	autoPraatPicture picture;
-	Graphics_markLeft (GRAPHICS, position, GET_INTEGER (L"Write number"),
-		GET_INTEGER (L"Draw tick"), GET_INTEGER (L"Draw dotted line"),
-		GET_STRING (L"text"));
+	Graphics_markLeft (GRAPHICS, position, GET_INTEGER (U"Write number"),
+		GET_INTEGER (U"Draw tick"), GET_INTEGER (U"Draw dotted line"),
+		GET_STRING (U"text"));
 END2 }
 
-FORM (Mark_right, L"Praat picture: One mark right", L"One mark left/right/top/bottom...") {
+FORM (Mark_right, U"Praat picture: One mark right", U"One mark left/right/top/bottom...") {
 	dia_oneMark (dia);
 OK2
 DO
-	double position = GET_REAL (L"Position");
+	double position = GET_REAL (U"Position");
 	double x1WC, x2WC, y1WC, y2WC, dy;
 	{// scope
 		autoPraatPicture picture;
@@ -1101,18 +1134,18 @@ DO
 	sortBoundingBox (& x1WC, & x2WC, & y1WC, & y2WC);
 	dy = 0.2 * (y2WC - y1WC);
 	if (position < y1WC - dy || position > y2WC + dy)
-		Melder_throw ("\"Position\" must be between ", y1WC, " and ", y2WC, ".");
+		Melder_throw (U"\"Position\" must be between ", y1WC, U" and ", y2WC, U".");
 	autoPraatPicture picture;
-	Graphics_markRight (GRAPHICS, position, GET_INTEGER (L"Write number"),
-		GET_INTEGER (L"Draw tick"), GET_INTEGER (L"Draw dotted line"),
-		GET_STRING (L"text"));
+	Graphics_markRight (GRAPHICS, position, GET_INTEGER (U"Write number"),
+		GET_INTEGER (U"Draw tick"), GET_INTEGER (U"Draw dotted line"),
+		GET_STRING (U"text"));
 END2 }
 
-FORM (Mark_top, L"Praat picture: One mark top", L"One mark left/right/top/bottom...") {
+FORM (Mark_top, U"Praat picture: One mark top", U"One mark left/right/top/bottom...") {
 	dia_oneMark (dia);
 OK2
 DO
-	double position = GET_REAL (L"Position");
+	double position = GET_REAL (U"Position");
 	double x1WC, x2WC, y1WC, y2WC, dx;
 	{// scope
 		autoPraatPicture picture;   // WHY?
@@ -1121,18 +1154,18 @@ DO
 	sortBoundingBox (& x1WC, & x2WC, & y1WC, & y2WC);
 	dx = 0.2 * (x2WC - x1WC);
 	if (position < x1WC - dx || position > x2WC + dx)
-		Melder_throw ("\"Position\" must be between ", x1WC, " and ", x2WC, ".");
+		Melder_throw (U"\"Position\" must be between ", x1WC, U" and ", x2WC, U".");
 	autoPraatPicture picture;
-	Graphics_markTop (GRAPHICS, position, GET_INTEGER (L"Write number"),
-		GET_INTEGER (L"Draw tick"), GET_INTEGER (L"Draw dotted line"),
-		GET_STRING (L"text"));
+	Graphics_markTop (GRAPHICS, position, GET_INTEGER (U"Write number"),
+		GET_INTEGER (U"Draw tick"), GET_INTEGER (U"Draw dotted line"),
+		GET_STRING (U"text"));
 END2 }
 
-FORM (Mark_bottom, L"Praat picture: One mark bottom", L"One mark left/right/top/bottom...") {
+FORM (Mark_bottom, U"Praat picture: One mark bottom", U"One mark left/right/top/bottom...") {
 	dia_oneMark (dia);
 OK2
 DO
-	double position = GET_REAL (L"Position");
+	double position = GET_REAL (U"Position");
 	double x1WC, x2WC, y1WC, y2WC, dx;
 	{// scope
 		autoPraatPicture picture;
@@ -1141,26 +1174,26 @@ DO
 	sortBoundingBox (& x1WC, & x2WC, & y1WC, & y2WC);
 	dx = 0.2 * (x2WC - x1WC);
 	if (position < x1WC - dx || position > x2WC + dx)
-		Melder_throw ("\"Position\" must be between ", x1WC, " and ", x2WC, ".");
+		Melder_throw (U"\"Position\" must be between ", x1WC, U" and ", x2WC, U".");
 	autoPraatPicture picture;
-	Graphics_markBottom (GRAPHICS, position, GET_INTEGER (L"Write number"),
-		GET_INTEGER (L"Draw tick"), GET_INTEGER (L"Draw dotted line"),
-		GET_STRING (L"text"));
+	Graphics_markBottom (GRAPHICS, position, GET_INTEGER (U"Write number"),
+		GET_INTEGER (U"Draw tick"), GET_INTEGER (U"Draw dotted line"),
+		GET_STRING (U"text"));
 END2 }
 
-static void dia_oneLogarithmicMark (Any dia) {
-	REAL (L"Position", L"1.0")
-	BOOLEAN (L"Write number", 1)
-	BOOLEAN (L"Draw tick", 1)
-	BOOLEAN (L"Draw dotted line", 1)
-	LABEL (L"", L"Draw text:")
-	TEXTFIELD (L"text", L"")
+static void dia_oneLogarithmicMark (UiForm dia) {
+	REAL (U"Position", U"1.0")
+	BOOLEAN (U"Write number", 1)
+	BOOLEAN (U"Draw tick", 1)
+	BOOLEAN (U"Draw dotted line", 1)
+	LABEL (U"", U"Draw text:")
+	TEXTFIELD (U"text", U"")
 }
-FORM (LogarithmicMark_left, L"Praat picture: One logarithmic mark left", L"One logarithmic mark left/right/top/bottom...") {
+FORM (LogarithmicMark_left, U"Praat picture: One logarithmic mark left", U"One logarithmic mark left/right/top/bottom...") {
 	dia_oneLogarithmicMark (dia);
 OK2
 DO
-	double position = GET_REAL (L"Position");
+	double position = GET_REAL (U"Position");
 	double x1WC, x2WC, y1WC, y2WC, dy;
 	{// scope
 		autoPraatPicture picture;
@@ -1169,18 +1202,18 @@ DO
 	sortBoundingBox (& x1WC, & x2WC, & y1WC, & y2WC);
 	dy = 0.2 * (y2WC - y1WC);
 	if (position < pow (10, y1WC - dy) || position > pow (10, y2WC + dy))
-		Melder_throw ("\"Position\" must be between ", pow (10, y1WC), " and ", pow (10, y2WC), ".");
+		Melder_throw (U"\"Position\" must be between ", pow (10, y1WC), U" and ", pow (10, y2WC), U".");
 	autoPraatPicture picture;
-	Graphics_markLeftLogarithmic (GRAPHICS, position, GET_INTEGER (L"Write number"),
-		GET_INTEGER (L"Draw tick"), GET_INTEGER (L"Draw dotted line"),
-		GET_STRING (L"text"));
+	Graphics_markLeftLogarithmic (GRAPHICS, position, GET_INTEGER (U"Write number"),
+		GET_INTEGER (U"Draw tick"), GET_INTEGER (U"Draw dotted line"),
+		GET_STRING (U"text"));
 END2 }
 
-FORM (LogarithmicMark_right, L"Praat picture: One logarithmic mark right", L"One logarithmic mark left/right/top/bottom...") {
+FORM (LogarithmicMark_right, U"Praat picture: One logarithmic mark right", U"One logarithmic mark left/right/top/bottom...") {
 	dia_oneLogarithmicMark (dia);
 OK2
 DO
-	double position = GET_REAL (L"Position");
+	double position = GET_REAL (U"Position");
 	double x1WC, x2WC, y1WC, y2WC, dy;
 	{// scope
 		autoPraatPicture picture;
@@ -1189,18 +1222,18 @@ DO
 	sortBoundingBox (& x1WC, & x2WC, & y1WC, & y2WC);
 	dy = 0.2 * (y2WC - y1WC);
 	if (position < pow (10, y1WC - dy) || position > pow (10, y2WC + dy))
-		Melder_throw ("\"Position\" must be between ", pow (10, y1WC), " and ", pow (10, y2WC), ".");
+		Melder_throw (U"\"Position\" must be between ", pow (10, y1WC), U" and ", pow (10, y2WC), U".");
 	autoPraatPicture picture;
-	Graphics_markRightLogarithmic (GRAPHICS, position, GET_INTEGER (L"Write number"),
-		GET_INTEGER (L"Draw tick"), GET_INTEGER (L"Draw dotted line"),
-		GET_STRING (L"text"));
+	Graphics_markRightLogarithmic (GRAPHICS, position, GET_INTEGER (U"Write number"),
+		GET_INTEGER (U"Draw tick"), GET_INTEGER (U"Draw dotted line"),
+		GET_STRING (U"text"));
 END2 }
 
-FORM (LogarithmicMark_top, L"Praat picture: One logarithmic mark top", L"One logarithmic mark left/right/top/bottom...") {
+FORM (LogarithmicMark_top, U"Praat picture: One logarithmic mark top", U"One logarithmic mark left/right/top/bottom...") {
 	dia_oneLogarithmicMark (dia);
 OK2
 DO
-	double position = GET_REAL (L"Position");
+	double position = GET_REAL (U"Position");
 	double x1WC, x2WC, y1WC, y2WC, dx;
 	{// scope
 		autoPraatPicture picture;
@@ -1209,18 +1242,18 @@ DO
 	sortBoundingBox (& x1WC, & x2WC, & y1WC, & y2WC);
 	dx = 0.2 * (x2WC - x1WC);
 	if (position < pow (10, x1WC - dx) || position > pow (10, x2WC + dx))
-		Melder_throw ("\"Position\" must be between ", pow (10, x1WC), " and ", pow (10, x2WC), ".");
+		Melder_throw (U"\"Position\" must be between ", pow (10, x1WC), U" and ", pow (10, x2WC), U".");
 	autoPraatPicture picture;
-	Graphics_markTopLogarithmic (GRAPHICS, position, GET_INTEGER (L"Write number"),
-		GET_INTEGER (L"Draw tick"), GET_INTEGER (L"Draw dotted line"),
-		GET_STRING (L"text"));
+	Graphics_markTopLogarithmic (GRAPHICS, position, GET_INTEGER (U"Write number"),
+		GET_INTEGER (U"Draw tick"), GET_INTEGER (U"Draw dotted line"),
+		GET_STRING (U"text"));
 END2 }
 
-FORM (LogarithmicMark_bottom, L"Praat picture: One logarithmic mark bottom", L"One logarithmic mark left/right/top/bottom...") {
+FORM (LogarithmicMark_bottom, U"Praat picture: One logarithmic mark bottom", U"One logarithmic mark left/right/top/bottom...") {
 	dia_oneLogarithmicMark (dia);
 OK2
 DO
-	double position = GET_REAL (L"Position");
+	double position = GET_REAL (U"Position");
 	double x1WC, x2WC, y1WC, y2WC, dx;
 	{// scope
 		autoPraatPicture picture;
@@ -1229,138 +1262,138 @@ DO
 	sortBoundingBox (& x1WC, & x2WC, & y1WC, & y2WC);
 	dx = 0.2 * (x2WC - x1WC);
 	if (position < pow (10, x1WC - dx) || position > pow (10, x2WC + dx))
-		Melder_throw ("\"Position\" must be between ", pow (10, x1WC), " and ", pow (10, x2WC), ".");
+		Melder_throw (U"\"Position\" must be between ", pow (10, x1WC), U" and ", pow (10, x2WC), U".");
 	autoPraatPicture picture;
-	Graphics_markBottomLogarithmic (GRAPHICS, position, GET_INTEGER (L"Write number"),
-		GET_INTEGER (L"Draw tick"), GET_INTEGER (L"Draw dotted line"),
-		GET_STRING (L"text"));
+	Graphics_markBottomLogarithmic (GRAPHICS, position, GET_INTEGER (U"Write number"),
+		GET_INTEGER (U"Draw tick"), GET_INTEGER (U"Draw dotted line"),
+		GET_STRING (U"text"));
 END2 }
 
-FORM (dxMMtoWC, L"Compute horizontal distance in world coordinates", 0) {
-	REAL (L"Distance (mm)", L"10.0")
+FORM (dxMMtoWC, U"Compute horizontal distance in world coordinates", 0) {
+	REAL (U"Distance (mm)", U"10.0")
 OK2
 DO
 	Graphics_setFontSize (GRAPHICS, theCurrentPraatPicture -> fontSize);
 	Graphics_setViewport (GRAPHICS, theCurrentPraatPicture -> x1NDC, theCurrentPraatPicture -> x2NDC, theCurrentPraatPicture -> y1NDC, theCurrentPraatPicture -> y2NDC);
 	Graphics_setInner (GRAPHICS);
-	double wc = Graphics_dxMMtoWC (GRAPHICS, GET_REAL (L"Distance"));
+	double wc = Graphics_dxMMtoWC (GRAPHICS, GET_REAL (U"Distance"));
 	Graphics_unsetInner (GRAPHICS);
-	Melder_informationReal (wc, L"(world coordinates)");
+	Melder_informationReal (wc, U"(world coordinates)");
 END2 }
 
-FORM (dxWCtoMM, L"Compute horizontal distance in millimetres", 0) {
-	REAL (L"Distance (wc)", L"0.1")
+FORM (dxWCtoMM, U"Compute horizontal distance in millimetres", 0) {
+	REAL (U"Distance (wc)", U"0.1")
 OK2
 DO
 	Graphics_setFontSize (GRAPHICS, theCurrentPraatPicture -> fontSize);
 	Graphics_setViewport (GRAPHICS, theCurrentPraatPicture -> x1NDC, theCurrentPraatPicture -> x2NDC, theCurrentPraatPicture -> y1NDC, theCurrentPraatPicture -> y2NDC);
 	Graphics_setInner (GRAPHICS);
-	double mm = Graphics_dxWCtoMM (GRAPHICS, GET_REAL (L"Distance"));
+	double mm = Graphics_dxWCtoMM (GRAPHICS, GET_REAL (U"Distance"));
 	Graphics_unsetInner (GRAPHICS);
-	Melder_informationReal (mm, L"mm");
+	Melder_informationReal (mm, U"mm");
 END2 }
 
-FORM (dyMMtoWC, L"Compute vertical distance in world coordinates", 0) {
-	REAL (L"Distance (mm)", L"10.0")
+FORM (dyMMtoWC, U"Compute vertical distance in world coordinates", 0) {
+	REAL (U"Distance (mm)", U"10.0")
 OK2
 DO
 	Graphics_setFontSize (GRAPHICS, theCurrentPraatPicture -> fontSize);
 	Graphics_setViewport (GRAPHICS, theCurrentPraatPicture -> x1NDC, theCurrentPraatPicture -> x2NDC, theCurrentPraatPicture -> y1NDC, theCurrentPraatPicture -> y2NDC);
 	Graphics_setInner (GRAPHICS);
-	double wc = Graphics_dyMMtoWC (GRAPHICS, GET_REAL (L"Distance"));
+	double wc = Graphics_dyMMtoWC (GRAPHICS, GET_REAL (U"Distance"));
 	Graphics_unsetInner (GRAPHICS);
-	Melder_informationReal (wc, L"(world coordinates)");
+	Melder_informationReal (wc, U"(world coordinates)");
 END2 }
 
-FORM (dyWCtoMM, L"Compute vertical distance in millimetres", 0) {
-	REAL (L"Distance (wc)", L"1.0")
+FORM (dyWCtoMM, U"Compute vertical distance in millimetres", 0) {
+	REAL (U"Distance (wc)", U"1.0")
 OK2
 DO
 	Graphics_setFontSize (GRAPHICS, theCurrentPraatPicture -> fontSize);
 	Graphics_setViewport (GRAPHICS, theCurrentPraatPicture -> x1NDC, theCurrentPraatPicture -> x2NDC, theCurrentPraatPicture -> y1NDC, theCurrentPraatPicture -> y2NDC);
 	Graphics_setInner (GRAPHICS);
-	double mm = Graphics_dyWCtoMM (GRAPHICS, GET_REAL (L"Distance"));
+	double mm = Graphics_dyWCtoMM (GRAPHICS, GET_REAL (U"Distance"));
 	Graphics_unsetInner (GRAPHICS);
-	Melder_informationReal (mm, L"mm");
+	Melder_informationReal (mm, U"mm");
 END2 }
 
-FORM (textWidth_wc, L"Text width in world coordinates", 0) {
-	TEXTFIELD (L"text", L"Hello world")
+FORM (textWidth_wc, U"Text width in world coordinates", 0) {
+	TEXTFIELD (U"text", U"Hello world")
 OK2
 DO
 	Graphics_setFont (GRAPHICS, static_cast<kGraphics_font> (theCurrentPraatPicture -> font));
 	Graphics_setFontSize (GRAPHICS, theCurrentPraatPicture -> fontSize);
 	Graphics_setViewport (GRAPHICS, theCurrentPraatPicture -> x1NDC, theCurrentPraatPicture -> x2NDC, theCurrentPraatPicture -> y1NDC, theCurrentPraatPicture -> y2NDC);
 	Graphics_setInner (GRAPHICS);
-	double wc = Graphics_textWidth (GRAPHICS, GET_STRING (L"text"));
+	double wc = Graphics_textWidth (GRAPHICS, GET_STRING (U"text"));
 	Graphics_unsetInner (GRAPHICS);
-	Melder_informationReal (wc, L"(world coordinates)");
+	Melder_informationReal (wc, U"(world coordinates)");
 END2 }
 
-FORM (textWidth_mm, L"Text width in millimetres", 0) {
-	TEXTFIELD (L"text", L"Hello world")
+FORM (textWidth_mm, U"Text width in millimetres", 0) {
+	TEXTFIELD (U"text", U"Hello world")
 OK2
 DO
 	Graphics_setFont (GRAPHICS, static_cast<kGraphics_font> (theCurrentPraatPicture -> font));
 	Graphics_setFontSize (GRAPHICS, theCurrentPraatPicture -> fontSize);
 	Graphics_setViewport (GRAPHICS, theCurrentPraatPicture -> x1NDC, theCurrentPraatPicture -> x2NDC, theCurrentPraatPicture -> y1NDC, theCurrentPraatPicture -> y2NDC);
 	Graphics_setInner (GRAPHICS);
-	double mm = Graphics_dxWCtoMM (GRAPHICS, Graphics_textWidth (GRAPHICS, GET_STRING (L"text")));
+	double mm = Graphics_dxWCtoMM (GRAPHICS, Graphics_textWidth (GRAPHICS, GET_STRING (U"text")));
 	Graphics_unsetInner (GRAPHICS);
-	Melder_informationReal (mm, L"mm");
+	Melder_informationReal (mm, U"mm");
 END2 }
 
-FORM (textWidth_ps_wc, L"PostScript text width in world coordinates", 0) {
-	RADIO (L"Phonetic font", 1)
-		RADIOBUTTON (L"XIPA")
-		RADIOBUTTON (L"SILIPA")
-	TEXTFIELD (L"text", L"Hello world")
+FORM (textWidth_ps_wc, U"PostScript text width in world coordinates", 0) {
+	RADIO (U"Phonetic font", 1)
+		RADIOBUTTON (U"XIPA")
+		RADIOBUTTON (U"SILIPA")
+	TEXTFIELD (U"text", U"Hello world")
 OK2
 DO
 	Graphics_setFont (GRAPHICS, static_cast<kGraphics_font> (theCurrentPraatPicture -> font));
 	Graphics_setFontSize (GRAPHICS, theCurrentPraatPicture -> fontSize);
 	Graphics_setViewport (GRAPHICS, theCurrentPraatPicture -> x1NDC, theCurrentPraatPicture -> x2NDC, theCurrentPraatPicture -> y1NDC, theCurrentPraatPicture -> y2NDC);
 	Graphics_setInner (GRAPHICS);
-	double wc = Graphics_textWidth_ps (GRAPHICS, GET_STRING (L"text"), GET_INTEGER (L"Phonetic font") - 1);
+	double wc = Graphics_textWidth_ps (GRAPHICS, GET_STRING (U"text"), GET_INTEGER (U"Phonetic font") - 1);
 	Graphics_unsetInner (GRAPHICS);
-	Melder_informationReal (wc, L"(world coordinates)");
+	Melder_informationReal (wc, U"(world coordinates)");
 END2 }
 
-FORM (textWidth_ps_mm, L"PostScript text width in millimetres", 0) {
-	RADIO (L"Phonetic font", 1)
-		RADIOBUTTON (L"XIPA")
-		RADIOBUTTON (L"SILIPA")
-	TEXTFIELD (L"text", L"Hello world")
+FORM (textWidth_ps_mm, U"PostScript text width in millimetres", 0) {
+	RADIO (U"Phonetic font", 1)
+		RADIOBUTTON (U"XIPA")
+		RADIOBUTTON (U"SILIPA")
+	TEXTFIELD (U"text", U"Hello world")
 OK2
 DO
 	Graphics_setFont (GRAPHICS, static_cast<kGraphics_font> (theCurrentPraatPicture -> font));
 	Graphics_setFontSize (GRAPHICS, theCurrentPraatPicture -> fontSize);
 	Graphics_setViewport (GRAPHICS, theCurrentPraatPicture -> x1NDC, theCurrentPraatPicture -> x2NDC, theCurrentPraatPicture -> y1NDC, theCurrentPraatPicture -> y2NDC);
 	Graphics_setInner (GRAPHICS);
-	double mm = Graphics_textWidth_ps_mm (GRAPHICS, GET_STRING (L"text"), GET_INTEGER (L"Phonetic font") - 1);
+	double mm = Graphics_textWidth_ps_mm (GRAPHICS, GET_STRING (U"text"), GET_INTEGER (U"Phonetic font") - 1);
 	Graphics_unsetInner (GRAPHICS);
-	Melder_informationReal (mm, L"mm");
+	Melder_informationReal (mm, U"mm");
 END2 }
 
 DIRECT (SearchManual) { Melder_search (); } END
-DIRECT (PictureWindowHelp) { Melder_help (L"Picture window"); } END
-DIRECT (AboutSpecialSymbols) { Melder_help (L"Special symbols"); } END
-DIRECT (AboutTextStyles) { Melder_help (L"Text styles"); } END
-DIRECT (PhoneticSymbols) { Melder_help (L"Phonetic symbols"); } END
+DIRECT (PictureWindowHelp) { Melder_help (U"Picture window"); } END
+DIRECT (AboutSpecialSymbols) { Melder_help (U"Special symbols"); } END
+DIRECT (AboutTextStyles) { Melder_help (U"Text styles"); } END
+DIRECT (PhoneticSymbols) { Melder_help (U"Phonetic symbols"); } END
 DIRECT (Picture_settings_report) {
 	MelderInfo_open ();
-	const wchar_t *units = theCurrentPraatPicture == & theForegroundPraatPicture ? L" inches" : L"";
-	MelderInfo_writeLine (L"Outer viewport left: ", Melder_double (theCurrentPraatPicture -> x1NDC), units);
-	MelderInfo_writeLine (L"Outer viewport right: ", Melder_double (theCurrentPraatPicture -> x2NDC), units);
-	MelderInfo_writeLine (L"Outer viewport top: ", Melder_double (
+	const char32 *units = theCurrentPraatPicture == & theForegroundPraatPicture ? U" inches" : U"";
+	MelderInfo_writeLine (U"Outer viewport left: ", theCurrentPraatPicture -> x1NDC, units);
+	MelderInfo_writeLine (U"Outer viewport right: ", theCurrentPraatPicture -> x2NDC, units);
+	MelderInfo_writeLine (U"Outer viewport top: ",
 		theCurrentPraatPicture != & theForegroundPraatPicture ?
 			theCurrentPraatPicture -> y1NDC :
-			12 - theCurrentPraatPicture -> y2NDC), units);
-	MelderInfo_writeLine (L"Outer viewport bottom: ", Melder_double (
+			12 - theCurrentPraatPicture -> y2NDC, units);
+	MelderInfo_writeLine (U"Outer viewport bottom: ",
 		theCurrentPraatPicture != & theForegroundPraatPicture ?
 			theCurrentPraatPicture -> y2NDC :
-			12 - theCurrentPraatPicture -> y1NDC), units);
-	MelderInfo_writeLine (L"Font size: ", Melder_double (theCurrentPraatPicture -> fontSize), L" points");
+			12 - theCurrentPraatPicture -> y1NDC, units);
+	MelderInfo_writeLine (U"Font size: ", theCurrentPraatPicture -> fontSize, U" points");
 	double xmargin = theCurrentPraatPicture -> fontSize * 4.2 / 72.0, ymargin = theCurrentPraatPicture -> fontSize * 2.8 / 72.0;
 	if (theCurrentPraatPicture != & theForegroundPraatPicture) {
 		long x1DC, x2DC, y1DC, y2DC;
@@ -1376,36 +1409,36 @@ DIRECT (Picture_settings_report) {
 		ymargin = 0.4 * (theCurrentPraatPicture -> y2NDC - theCurrentPraatPicture -> y1NDC);
 	if (xmargin > 0.4 * (theCurrentPraatPicture -> x2NDC - theCurrentPraatPicture -> x1NDC))
 		xmargin = 0.4 * (theCurrentPraatPicture -> x2NDC - theCurrentPraatPicture -> x1NDC);
-	MelderInfo_writeLine (L"Inner viewport left: ", Melder_double (theCurrentPraatPicture -> x1NDC + xmargin), units);
-	MelderInfo_writeLine (L"Inner viewport right: ", Melder_double (theCurrentPraatPicture -> x2NDC - xmargin), units);
-	MelderInfo_writeLine (L"Inner viewport top: ", Melder_double (
+	MelderInfo_writeLine (U"Inner viewport left: ", theCurrentPraatPicture -> x1NDC + xmargin, units);
+	MelderInfo_writeLine (U"Inner viewport right: ", theCurrentPraatPicture -> x2NDC - xmargin, units);
+	MelderInfo_writeLine (U"Inner viewport top: ",
 		theCurrentPraatPicture != & theForegroundPraatPicture ?
 			theCurrentPraatPicture -> y1NDC + ymargin :
-			12 - theCurrentPraatPicture -> y2NDC + ymargin), units);
-	MelderInfo_writeLine (L"Inner viewport bottom: ", Melder_double (
+			12 - theCurrentPraatPicture -> y2NDC + ymargin, units);
+	MelderInfo_writeLine (U"Inner viewport bottom: ",
 		theCurrentPraatPicture != & theForegroundPraatPicture ?
 			theCurrentPraatPicture -> y2NDC - ymargin :
-			12 - theCurrentPraatPicture -> y1NDC - ymargin), units);
-	MelderInfo_writeLine (L"Font: ", kGraphics_font_getText (theCurrentPraatPicture -> font));
-	MelderInfo_writeLine (L"Line type: ",
-		theCurrentPraatPicture -> lineType == Graphics_DRAWN ? L"Solid" :
-		theCurrentPraatPicture -> lineType == Graphics_DOTTED ? L"Dotted" :
-		theCurrentPraatPicture -> lineType == Graphics_DASHED ? L"Dashed" :
-		theCurrentPraatPicture -> lineType == Graphics_DASHED_DOTTED ? L"Dashed-dotted" :
-		L"(unknown)");
-	MelderInfo_writeLine (L"Line width: ", Melder_double (theCurrentPraatPicture -> lineWidth));
-	MelderInfo_writeLine (L"Arrow size: ", Melder_double (theCurrentPraatPicture -> arrowSize));
-	MelderInfo_writeLine (L"Speckle size: ", Melder_double (theCurrentPraatPicture -> speckleSize));
-	MelderInfo_writeLine (L"Colour: ", Graphics_Colour_name (theCurrentPraatPicture -> colour));
-	MelderInfo_writeLine (L"Red: ", Melder_double (theCurrentPraatPicture -> colour. red));
-	MelderInfo_writeLine (L"Green: ", Melder_double (theCurrentPraatPicture -> colour. green));
-	MelderInfo_writeLine (L"Blue: ", Melder_double (theCurrentPraatPicture -> colour. blue));
+			12 - theCurrentPraatPicture -> y1NDC - ymargin, units);
+	MelderInfo_writeLine (U"Font: ", kGraphics_font_getText (theCurrentPraatPicture -> font));
+	MelderInfo_writeLine (U"Line type: ",
+		theCurrentPraatPicture -> lineType == Graphics_DRAWN ? U"Solid" :
+		theCurrentPraatPicture -> lineType == Graphics_DOTTED ? U"Dotted" :
+		theCurrentPraatPicture -> lineType == Graphics_DASHED ? U"Dashed" :
+		theCurrentPraatPicture -> lineType == Graphics_DASHED_DOTTED ? U"Dashed-dotted" :
+		U"(unknown)");
+	MelderInfo_writeLine (U"Line width: ", theCurrentPraatPicture -> lineWidth);
+	MelderInfo_writeLine (U"Arrow size: ", theCurrentPraatPicture -> arrowSize);
+	MelderInfo_writeLine (U"Speckle size: ", theCurrentPraatPicture -> speckleSize);
+	MelderInfo_writeLine (U"Colour: ", Graphics_Colour_name (theCurrentPraatPicture -> colour));
+	MelderInfo_writeLine (U"Red: ", theCurrentPraatPicture -> colour. red);
+	MelderInfo_writeLine (U"Green: ", theCurrentPraatPicture -> colour. green);
+	MelderInfo_writeLine (U"Blue: ", theCurrentPraatPicture -> colour. blue);
 	double x1WC, x2WC, y1WC, y2WC;
 	Graphics_inqWindow (GRAPHICS, & x1WC, & x2WC, & y1WC, & y2WC);
-	MelderInfo_writeLine (L"Axis left: ", Melder_double (x1WC));
-	MelderInfo_writeLine (L"Axis right: ", Melder_double (x2WC));
-	MelderInfo_writeLine (L"Axis bottom: ", Melder_double (y1WC));
-	MelderInfo_writeLine (L"Axis top: ", Melder_double (y2WC));
+	MelderInfo_writeLine (U"Axis left: ", x1WC);
+	MelderInfo_writeLine (U"Axis right: ", x2WC);
+	MelderInfo_writeLine (U"Axis bottom: ", y1WC);
+	MelderInfo_writeLine (U"Axis top: ", y2WC);
 	MelderInfo_close ();
 } END
 
@@ -1427,22 +1460,22 @@ static void cb_selectionChanged (Picture p, void *closure,
 		double xmargin = fontSize * 4.2 / 72.0, ymargin = fontSize * 2.8 / 72.0;
 		if (ymargin > 0.4 * (theCurrentPraatPicture -> y2NDC - theCurrentPraatPicture -> y1NDC)) ymargin = 0.4 * (theCurrentPraatPicture -> y2NDC - theCurrentPraatPicture -> y1NDC);
 		if (xmargin > 0.4 * (theCurrentPraatPicture -> x2NDC - theCurrentPraatPicture -> x1NDC)) xmargin = 0.4 * (theCurrentPraatPicture -> x2NDC - theCurrentPraatPicture -> x1NDC);
-		UiHistory_write (L"\nSelect inner viewport: ");
+		UiHistory_write (U"\nSelect inner viewport: ");
 		UiHistory_write (Melder_single (theCurrentPraatPicture -> x1NDC + xmargin));
-		UiHistory_write (L", ");
+		UiHistory_write (U", ");
 		UiHistory_write (Melder_single (theCurrentPraatPicture -> x2NDC - xmargin));
-		UiHistory_write (L", ");
+		UiHistory_write (U", ");
 		UiHistory_write (Melder_single (12 - theCurrentPraatPicture -> y2NDC + ymargin));
-		UiHistory_write (L", ");
+		UiHistory_write (U", ");
 		UiHistory_write (Melder_single (12 - theCurrentPraatPicture -> y1NDC - ymargin));
 	} else {
-		UiHistory_write (L"\nSelect outer viewport: ");
+		UiHistory_write (U"\nSelect outer viewport: ");
 		UiHistory_write (Melder_single (theCurrentPraatPicture -> x1NDC));
-		UiHistory_write (L", ");
+		UiHistory_write (U", ");
 		UiHistory_write (Melder_single (theCurrentPraatPicture -> x2NDC));
-		UiHistory_write (L", ");
+		UiHistory_write (U", ");
 		UiHistory_write (Melder_single (12 - theCurrentPraatPicture -> y2NDC));
-		UiHistory_write (L", ");
+		UiHistory_write (U", ");
 		UiHistory_write (Melder_single (12 - theCurrentPraatPicture -> y1NDC));
 	}
 }
@@ -1453,30 +1486,30 @@ static GuiWindow dialog;
 
 static GuiMenu fileMenu, editMenu, marginsMenu, worldMenu, selectMenu, fontMenu, penMenu, helpMenu;
 
-GuiMenu praat_picture_resolveMenu (const wchar_t *menu) {
+GuiMenu praat_picture_resolveMenu (const char32 *menu) {
 	return
-		wcsequ (menu, L"File") ? fileMenu :
-		wcsequ (menu, L"Edit") ? editMenu :
-		wcsequ (menu, L"Margins") ? marginsMenu :
-		wcsequ (menu, L"World") ? worldMenu :
-		wcsequ (menu, L"Select") ? selectMenu :
-		wcsequ (menu, L"Font") ? fontMenu :
-		wcsequ (menu, L"Pen") ? penMenu :
-		wcsequ (menu, L"Help") ? helpMenu :
-		editMenu;   /* Default. */
+		str32equ (menu, U"File") ? fileMenu :
+		str32equ (menu, U"Edit") ? editMenu :
+		str32equ (menu, U"Margins") ? marginsMenu :
+		str32equ (menu, U"World") ? worldMenu :
+		str32equ (menu, U"Select") ? selectMenu :
+		str32equ (menu, U"Font") ? fontMenu :
+		str32equ (menu, U"Pen") ? penMenu :
+		str32equ (menu, U"Help") ? helpMenu :
+		editMenu;   // default
 }
 
-void praat_picture_exit (void) {
+void praat_picture_exit () {
 	Picture_remove (& praat_picture);
 }
 
-void praat_picture_open (void) {
+void praat_picture_open () {
 	Graphics_markGroup (GRAPHICS);   // we start a group of graphics output here
 	if (theCurrentPraatPicture == & theForegroundPraatPicture && ! theCurrentPraatApplication -> batch) {
 		#if gtk
 			gtk_window_present (GTK_WINDOW (dialog -> d_gtkWindow));
 		#elif cocoa
-			dialog -> f_show ();
+			GuiThing_show (dialog);
 		#elif motif
 			XtMapWidget (dialog -> d_xmShell);
 			XMapRaised (XtDisplay (dialog -> d_xmShell), XtWindow (dialog -> d_xmShell));
@@ -1504,7 +1537,7 @@ void praat_picture_open (void) {
 	Graphics_setWindow (GRAPHICS, x1WC, x2WC, y1WC, y2WC);
 }
 
-void praat_picture_close (void) {
+void praat_picture_close () {
 	if (theCurrentPraatPicture != & theForegroundPraatPicture) return;
 	if (! theCurrentPraatApplication -> batch) {
 		Picture_highlight (praat_picture);
@@ -1520,7 +1553,7 @@ Graphics praat_picture_editor_open (bool eraseFirst) {
 	return GRAPHICS;
 }
 
-void praat_picture_editor_close (void) {
+void praat_picture_editor_close () {
 	praat_picture_close ();
 }
 
@@ -1533,11 +1566,10 @@ static Any pictureRecognizer (int nread, const char *header, MelderFile file) {
 	return NULL;
 }
 
-void praat_picture_init (void) {
+void praat_picture_init () {
 	GuiScrolledWindow scrollWindow;
 	GuiDrawingArea drawingArea = NULL;
 	int margin, width, height, resolution, x, y;
-	static MelderString itemTitle_search = { 0 };
 	theCurrentPraatPicture -> lineType = Graphics_DRAWN;
 	theCurrentPraatPicture -> colour = Graphics_BLACK;
 	theCurrentPraatPicture -> lineWidth = 1.0;
@@ -1551,8 +1583,6 @@ void praat_picture_init (void) {
 	Data_recognizeFileType (pictureRecognizer);
 
 	if (! theCurrentPraatApplication -> batch) {
-		char pictureWindowTitle [100];
-		// Ook al eerder gezien... Migreren naar UI?
 		double screenX, screenY, screenWidth, screenHeight;
 		Gui_getWindowPositioningBounds (& screenX, & screenY, & screenWidth, & screenHeight);
 		resolution = Gui_getResolution (NULL);
@@ -1574,200 +1604,199 @@ void praat_picture_init (void) {
 			y = screenY + 0;
 			width += margin * 2;
 		#endif
-		sprintf (pictureWindowTitle, "%s Picture", praatP.title);
-		dialog = GuiWindow_create (x, y, width, height, 400, 200, Melder_peekUtf8ToWcs (pictureWindowTitle), NULL, NULL, 0);
-		dialog -> f_addMenuBar ();
+		dialog = GuiWindow_create (x, y, width, height, 400, 200, Melder_cat (praatP.title, U" Picture"), NULL, NULL, 0);
+		GuiWindow_addMenuBar (dialog);
 	}
 	if (! theCurrentPraatApplication -> batch) {
-		fileMenu =    GuiMenu_createInWindow (dialog, L"File", 0);
-		editMenu =    GuiMenu_createInWindow (dialog, L"Edit", 0);
-		marginsMenu = GuiMenu_createInWindow (dialog, L"Margins", 0);
-		worldMenu =   GuiMenu_createInWindow (dialog, L"World", 0);
-		selectMenu =  GuiMenu_createInWindow (dialog, L"Select", 0);
-		penMenu =     GuiMenu_createInWindow (dialog, L"Pen", 0);
-		fontMenu =    GuiMenu_createInWindow (dialog, L"Font", 0);
-		helpMenu =    GuiMenu_createInWindow (dialog, L"Help", 0);
+		fileMenu =    GuiMenu_createInWindow (dialog, U"File", 0);
+		editMenu =    GuiMenu_createInWindow (dialog, U"Edit", 0);
+		marginsMenu = GuiMenu_createInWindow (dialog, U"Margins", 0);
+		worldMenu =   GuiMenu_createInWindow (dialog, U"World", 0);
+		selectMenu =  GuiMenu_createInWindow (dialog, U"Select", 0);
+		penMenu =     GuiMenu_createInWindow (dialog, U"Pen", 0);
+		fontMenu =    GuiMenu_createInWindow (dialog, U"Font", 0);
+		helpMenu =    GuiMenu_createInWindow (dialog, U"Help", 0);
 	}
 
-	praat_addMenuCommand (L"Picture", L"File", L"Picture info", 0, 0, DO_Picture_settings_report);
-	praat_addMenuCommand (L"Picture", L"File", L"Picture settings report", 0, praat_HIDDEN, DO_Picture_settings_report);
-	praat_addMenuCommand (L"Picture", L"File", L"-- save --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"File", U"Picture info", 0, 0, DO_Picture_settings_report);
+	praat_addMenuCommand (U"Picture", U"File", U"Picture settings report", 0, praat_HIDDEN, DO_Picture_settings_report);
+	praat_addMenuCommand (U"Picture", U"File", U"-- save --", 0, 0, 0);
 	#if defined (macintosh) || defined (UNIX)
-		praat_addMenuCommand (L"Picture", L"File", L"Save as PDF file...", 0, 'S', DO_Picture_writeToPdfFile);
-		praat_addMenuCommand (L"Picture", L"File", L"Write to PDF file...", 0, praat_HIDDEN, DO_Picture_writeToPdfFile);
+		praat_addMenuCommand (U"Picture", U"File", U"Save as PDF file...", 0, 'S', DO_Picture_writeToPdfFile);
+		praat_addMenuCommand (U"Picture", U"File", U"Write to PDF file...", 0, praat_HIDDEN, DO_Picture_writeToPdfFile);
 	#endif
-	praat_addMenuCommand (L"Picture", L"File", L"Save as 300-dpi PNG file...", 0, 0, DO_Picture_writeToPngFile_300);
+	praat_addMenuCommand (U"Picture", U"File", U"Save as 300-dpi PNG file...", 0, 0, DO_Picture_writeToPngFile_300);
 	#if defined (_WIN32)
-		praat_addMenuCommand (L"Picture", L"File", L"Save as 600-dpi PNG file...", 0, 'S', DO_Picture_writeToPngFile_600);
+		praat_addMenuCommand (U"Picture", U"File", U"Save as 600-dpi PNG file...", 0, 'S', DO_Picture_writeToPngFile_600);
 	#endif
 	#if defined (macintosh) || defined (UNIX)
-		praat_addMenuCommand (L"Picture", L"File", L"Save as 600-dpi PNG file...", 0, 0, DO_Picture_writeToPngFile_600);
+		praat_addMenuCommand (U"Picture", U"File", U"Save as 600-dpi PNG file...", 0, 0, DO_Picture_writeToPngFile_600);
 	#endif
-	praat_addMenuCommand (L"Picture", L"File", L"Save as EPS file", 0, 0, NULL);
-		praat_addMenuCommand (L"Picture", L"File", L"PostScript settings...", 0, 1, DO_PostScript_settings);
-		praat_addMenuCommand (L"Picture", L"File", L"Save as EPS file...", 0, 1, DO_Picture_writeToEpsFile);
-		praat_addMenuCommand (L"Picture", L"File", L"Write to EPS file...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Picture_writeToEpsFile);
-		praat_addMenuCommand (L"Picture", L"File", L"Save as fontless EPS file (XIPA)...", 0, 1, DO_Picture_writeToFontlessEpsFile_xipa);
-		praat_addMenuCommand (L"Picture", L"File", L"Write to fontless EPS file (XIPA)...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Picture_writeToFontlessEpsFile_xipa);
-		praat_addMenuCommand (L"Picture", L"File", L"Save as fontless EPS file (SILIPA)...", 0, 1, DO_Picture_writeToFontlessEpsFile_silipa);
-		praat_addMenuCommand (L"Picture", L"File", L"Write to fontless EPS file (SILIPA)...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Picture_writeToFontlessEpsFile_silipa);
+	praat_addMenuCommand (U"Picture", U"File", U"Save as EPS file", 0, 0, NULL);
+		praat_addMenuCommand (U"Picture", U"File", U"PostScript settings...", 0, 1, DO_PostScript_settings);
+		praat_addMenuCommand (U"Picture", U"File", U"Save as EPS file...", 0, 1, DO_Picture_writeToEpsFile);
+		praat_addMenuCommand (U"Picture", U"File", U"Write to EPS file...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Picture_writeToEpsFile);
+		praat_addMenuCommand (U"Picture", U"File", U"Save as fontless EPS file (XIPA)...", 0, 1, DO_Picture_writeToFontlessEpsFile_xipa);
+		praat_addMenuCommand (U"Picture", U"File", U"Write to fontless EPS file (XIPA)...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Picture_writeToFontlessEpsFile_xipa);
+		praat_addMenuCommand (U"Picture", U"File", U"Save as fontless EPS file (SILIPA)...", 0, 1, DO_Picture_writeToFontlessEpsFile_silipa);
+		praat_addMenuCommand (U"Picture", U"File", U"Write to fontless EPS file (SILIPA)...", 0, praat_HIDDEN + praat_DEPTH_1, DO_Picture_writeToFontlessEpsFile_silipa);
 	#ifdef _WIN32
-		praat_addMenuCommand (L"Picture", L"File", L"Save as Windows metafile...", 0, 0, DO_Picture_writeToWindowsMetafile);
-		praat_addMenuCommand (L"Picture", L"File", L"Write to Windows metafile...", 0, praat_HIDDEN, DO_Picture_writeToWindowsMetafile);
+		praat_addMenuCommand (U"Picture", U"File", U"Save as Windows metafile...", 0, 0, DO_Picture_writeToWindowsMetafile);
+		praat_addMenuCommand (U"Picture", U"File", U"Write to Windows metafile...", 0, praat_HIDDEN, DO_Picture_writeToWindowsMetafile);
 	#endif
-	praat_addMenuCommand (L"Picture", L"File", L"-- praat picture file --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"File", L"Read from praat picture file...", 0, 0, DO_Picture_readFromPraatPictureFile);
-	praat_addMenuCommand (L"Picture", L"File", L"Save as praat picture file...", 0, 0, DO_Picture_writeToPraatPictureFile);
-	praat_addMenuCommand (L"Picture", L"File", L"Write to praat picture file...", 0, praat_HIDDEN, DO_Picture_writeToPraatPictureFile);
-	praat_addMenuCommand (L"Picture", L"File", L"-- print --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"File", U"-- praat picture file --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"File", U"Read from praat picture file...", 0, 0, DO_Picture_readFromPraatPictureFile);
+	praat_addMenuCommand (U"Picture", U"File", U"Save as praat picture file...", 0, 0, DO_Picture_writeToPraatPictureFile);
+	praat_addMenuCommand (U"Picture", U"File", U"Write to praat picture file...", 0, praat_HIDDEN, DO_Picture_writeToPraatPictureFile);
+	praat_addMenuCommand (U"Picture", U"File", U"-- print --", 0, 0, 0);
 	#if defined (macintosh)
-		praat_addMenuCommand (L"Picture", L"File", L"Page setup...", 0, 0, DO_Page_setup);
+		praat_addMenuCommand (U"Picture", U"File", U"Page setup...", 0, 0, DO_Page_setup);
 	#endif
-	praat_addMenuCommand (L"Picture", L"File", L"Print...", 0, 'P', DO_Print);
+	praat_addMenuCommand (U"Picture", U"File", U"Print...", 0, 'P', DO_Print);
 
-	praat_addMenuCommand (L"Picture", L"Edit", L"Undo", 0, 'Z', DO_Undo);
+	praat_addMenuCommand (U"Picture", U"Edit", U"Undo", 0, 'Z', DO_Undo);
 	#if defined (macintosh) || defined (_WIN32)
-		praat_addMenuCommand (L"Picture", L"Edit", L"-- clipboard --", 0, 0, 0);
-		praat_addMenuCommand (L"Picture", L"Edit", L"Copy to clipboard", 0, 'C', DO_Copy_picture_to_clipboard);
+		praat_addMenuCommand (U"Picture", U"Edit", U"-- clipboard --", 0, 0, 0);
+		praat_addMenuCommand (U"Picture", U"Edit", U"Copy to clipboard", 0, 'C', DO_Copy_picture_to_clipboard);
 	#endif
-	praat_addMenuCommand (L"Picture", L"Edit", L"-- erase --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Edit", L"Erase all", 0, 'E', DO_Erase_all);
-
-	praat_addMenuCommand (L"Picture", L"Margins", L"Draw inner box", 0, 0, DO_DrawInnerBox);
-	praat_addMenuCommand (L"Picture", L"Margins", L"-- text --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Text left...", 0, 0, DO_Text_left);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Text right...", 0, 0, DO_Text_right);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Text top...", 0, 0, DO_Text_top);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Text bottom...", 0, 0, DO_Text_bottom);
-	praat_addMenuCommand (L"Picture", L"Margins", L"-- marks every --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Marks left every...", 0, 0, DO_Marks_left_every);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Marks right every...", 0, 0, DO_Marks_right_every);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Marks bottom every...", 0, 0, DO_Marks_bottom_every);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Marks top every...", 0, 0, DO_Marks_top_every);
-	praat_addMenuCommand (L"Picture", L"Margins", L"-- one mark --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Margins", L"One mark left...", 0, 0, DO_Mark_left);
-	praat_addMenuCommand (L"Picture", L"Margins", L"One mark right...", 0, 0, DO_Mark_right);
-	praat_addMenuCommand (L"Picture", L"Margins", L"One mark bottom...", 0, 0, DO_Mark_bottom);
-	praat_addMenuCommand (L"Picture", L"Margins", L"One mark top...", 0, 0, DO_Mark_top);
-	praat_addMenuCommand (L"Picture", L"Margins", L"-- marks --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Marks", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Marks left...", 0, 1, DO_Marks_left);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Marks right...", 0, 1, DO_Marks_right);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Marks bottom...", 0, 1, DO_Marks_bottom);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Marks top...", 0, 1, DO_Marks_top);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Logarithmic marks", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Logarithmic marks left...", 0, 1, DO_marksLeftLogarithmic);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Logarithmic marks right...", 0, 1, DO_marksRightLogarithmic);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Logarithmic marks bottom...", 0, 1, DO_marksBottomLogarithmic);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Logarithmic marks top...", 0, 1, DO_marksTopLogarithmic);
-	praat_addMenuCommand (L"Picture", L"Margins", L"One logarithmic mark", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Margins", L"One logarithmic mark left...", 0, 1, DO_LogarithmicMark_left);
-	praat_addMenuCommand (L"Picture", L"Margins", L"One logarithmic mark right...", 0, 1, DO_LogarithmicMark_right);
-	praat_addMenuCommand (L"Picture", L"Margins", L"One logarithmic mark bottom...", 0, 1, DO_LogarithmicMark_bottom);
-	praat_addMenuCommand (L"Picture", L"Margins", L"One logarithmic mark top...", 0, 1, DO_LogarithmicMark_top);
-	praat_addMenuCommand (L"Picture", L"Margins", L"-- axes --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Margins", L"Axes...", 0, 0, DO_Axes);
-
-	praat_addMenuCommand (L"Picture", L"World", L"Text...", 0, 0, DO_Text);
-	praat_addMenuCommand (L"Picture", L"World", L"Text special...", 0, 0, DO_Text_special);
-	praat_addMenuCommand (L"Picture", L"World", L"-- line --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"World", L"Draw line...", 0, 0, DO_DrawLine);
-	praat_addMenuCommand (L"Picture", L"World", L"Draw arrow...", 0, 0, DO_DrawArrow);
-	praat_addMenuCommand (L"Picture", L"World", L"Draw two-way arrow...", 0, 0, DO_DrawDoubleArrow);
-	praat_addMenuCommand (L"Picture", L"World", L"-- function --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"World", L"Draw function...", 0, 0, DO_DrawFunction);
-	praat_addMenuCommand (L"Picture", L"World", L"-- rectangle --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"World", L"Draw rectangle...", 0, 0, DO_DrawRectangle);
-	praat_addMenuCommand (L"Picture", L"World", L"Paint rectangle...", 0, 0, DO_PaintRectangle);
-	praat_addMenuCommand (L"Picture", L"World", L"Draw rounded rectangle...", 0, 0, DO_DrawRoundedRectangle);
-	praat_addMenuCommand (L"Picture", L"World", L"Paint rounded rectangle...", 0, 0, DO_PaintRoundedRectangle);
-	praat_addMenuCommand (L"Picture", L"World", L"-- arc --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"World", L"Draw arc...", 0, 0, DO_DrawArc);
-	praat_addMenuCommand (L"Picture", L"World", L"Draw ellipse...", 0, 0, DO_DrawEllipse);
-	praat_addMenuCommand (L"Picture", L"World", L"Paint ellipse...", 0, 0, DO_PaintEllipse);
-	praat_addMenuCommand (L"Picture", L"World", L"Draw circle...", 0, 0, DO_DrawCircle);
-	praat_addMenuCommand (L"Picture", L"World", L"Paint circle...", 0, 0, DO_PaintCircle);
-	praat_addMenuCommand (L"Picture", L"World", L"Draw circle (mm)...", 0, 0, DO_DrawCircle_mm);
-	praat_addMenuCommand (L"Picture", L"World", L"Paint circle (mm)...", 0, 0, DO_PaintCircle_mm);
-	praat_addMenuCommand (L"Picture", L"World", L"-- picture --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"World", L"Insert picture from file...", 0, 0, DO_InsertPictureFromFile);
-	praat_addMenuCommand (L"Picture", L"World", L"-- axes --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"World", L"Axes...", 0, 0, DO_Axes);
-	praat_addMenuCommand (L"Picture", L"World", L"Measure", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"World", L"Horizontal mm to wc...", 0, 1, DO_dxMMtoWC);
-	praat_addMenuCommand (L"Picture", L"World", L"Horizontal wc to mm...", 0, 1, DO_dxWCtoMM);
-	praat_addMenuCommand (L"Picture", L"World", L"Vertical mm to wc...", 0, 1, DO_dyMMtoWC);
-	praat_addMenuCommand (L"Picture", L"World", L"Vertical wc to mm...", 0, 1, DO_dyWCtoMM);
-	praat_addMenuCommand (L"Picture", L"World", L"-- text measure --", 0, 1, 0);
-	praat_addMenuCommand (L"Picture", L"World", L"Text width (wc)...", 0, 1, DO_textWidth_wc);
-	praat_addMenuCommand (L"Picture", L"World", L"Text width (mm)...", 0, 1, DO_textWidth_mm);
-	praat_addMenuCommand (L"Picture", L"World", L"PostScript text width (wc)...", 0, 1, DO_textWidth_ps_wc);
-	praat_addMenuCommand (L"Picture", L"World", L"PostScript text width (mm)...", 0, 1, DO_textWidth_ps_mm);
-
-	praatButton_innerViewport = praat_addMenuCommand (L"Picture", L"Select", L"Mouse selects inner viewport", 0, praat_RADIO_FIRST, DO_MouseSelectsInnerViewport);
-	praatButton_outerViewport = praat_addMenuCommand (L"Picture", L"Select", L"Mouse selects outer viewport", 0, praat_RADIO_NEXT, DO_MouseSelectsOuterViewport);
-	praat_addMenuCommand (L"Picture", L"Select", L"-- select --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Select", L"Select inner viewport...", 0, 0, DO_SelectInnerViewport);
-	praat_addMenuCommand (L"Picture", L"Select", L"Select outer viewport...", 0, 0, DO_SelectOuterViewport);
-	praat_addMenuCommand (L"Picture", L"Select", L"Viewport...", 0, praat_HIDDEN, DO_SelectOuterViewport);
-	praat_addMenuCommand (L"Picture", L"Select", L"-- viewport drawing --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Select", L"Viewport text...", 0, 0, DO_ViewportText);
-
-	praatButton_lines [Graphics_DRAWN] = praat_addMenuCommand (L"Picture", L"Pen", L"Solid line", 0, praat_RADIO_FIRST, DO_Solid_line);
-	praat_addMenuCommand (L"Picture", L"Pen", L"Plain line", 0, praat_RADIO_NEXT | praat_HIDDEN, DO_Solid_line);
-	praatButton_lines [Graphics_DOTTED] = praat_addMenuCommand (L"Picture", L"Pen", L"Dotted line", 0, praat_RADIO_NEXT, DO_Dotted_line);
-	praatButton_lines [Graphics_DASHED] = praat_addMenuCommand (L"Picture", L"Pen", L"Dashed line", 0, praat_RADIO_NEXT, DO_Dashed_line);
-	praatButton_lines [Graphics_DASHED_DOTTED] = praat_addMenuCommand (L"Picture", L"Pen", L"Dashed-dotted line", 0, praat_RADIO_NEXT, DO_Dashed_dotted_line);
-	praat_addMenuCommand (L"Picture", L"Pen", L"-- line width --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Pen", L"Line width...", 0, 0, DO_Line_width);
-	praat_addMenuCommand (L"Picture", L"Pen", L"Arrow size...", 0, 0, DO_Arrow_size);
-	praat_addMenuCommand (L"Picture", L"Pen", L"Speckle size...", 0, 0, DO_Speckle_size);
-	praat_addMenuCommand (L"Picture", L"Pen", L"-- colour --", 0, 0, 0);
-	praat_addMenuCommand (L"Picture", L"Pen", L"Colour...", 0, 0, DO_Colour);
-	praatButton_black = praat_addMenuCommand (L"Picture", L"Pen", L"Black", 0, praat_CHECKBUTTON, DO_Black);
-	praatButton_white = praat_addMenuCommand (L"Picture", L"Pen", L"White", 0, praat_CHECKBUTTON, DO_White);
-	praatButton_red = praat_addMenuCommand (L"Picture", L"Pen", L"Red", 0, praat_CHECKBUTTON, DO_Red);
-	praatButton_green = praat_addMenuCommand (L"Picture", L"Pen", L"Green", 0, praat_CHECKBUTTON, DO_Green);
-	praatButton_blue = praat_addMenuCommand (L"Picture", L"Pen", L"Blue", 0, praat_CHECKBUTTON, DO_Blue);
-	praatButton_yellow = praat_addMenuCommand (L"Picture", L"Pen", L"Yellow", 0, praat_CHECKBUTTON, DO_Yellow);
-	praatButton_cyan = praat_addMenuCommand (L"Picture", L"Pen", L"Cyan", 0, praat_CHECKBUTTON, DO_Cyan);
-	praatButton_magenta = praat_addMenuCommand (L"Picture", L"Pen", L"Magenta", 0, praat_CHECKBUTTON, DO_Magenta);
-	praatButton_maroon = praat_addMenuCommand (L"Picture", L"Pen", L"Maroon", 0, praat_CHECKBUTTON, DO_Maroon);
-	praatButton_lime = praat_addMenuCommand (L"Picture", L"Pen", L"Lime", 0, praat_CHECKBUTTON, DO_Lime);
-	praatButton_navy = praat_addMenuCommand (L"Picture", L"Pen", L"Navy", 0, praat_CHECKBUTTON, DO_Navy);
-	praatButton_teal = praat_addMenuCommand (L"Picture", L"Pen", L"Teal", 0, praat_CHECKBUTTON, DO_Teal);
-	praatButton_purple = praat_addMenuCommand (L"Picture", L"Pen", L"Purple", 0, praat_CHECKBUTTON, DO_Purple);
-	praatButton_olive = praat_addMenuCommand (L"Picture", L"Pen", L"Olive", 0, praat_CHECKBUTTON, DO_Olive);
-	praatButton_pink = praat_addMenuCommand (L"Picture", L"Pen", L"Pink", 0, praat_CHECKBUTTON, DO_Pink);
-	praatButton_silver = praat_addMenuCommand (L"Picture", L"Pen", L"Silver", 0, praat_CHECKBUTTON, DO_Silver);
-	praatButton_grey = praat_addMenuCommand (L"Picture", L"Pen", L"Grey", 0, praat_CHECKBUTTON, DO_Grey);
-
-	praat_addMenuCommand (L"Picture", L"Font", L"Font size...", 0, 0, DO_Font_size);
-	praatButton_10 = praat_addMenuCommand (L"Picture", L"Font", L"10", 0, praat_CHECKBUTTON, DO_10);
-	praatButton_12 = praat_addMenuCommand (L"Picture", L"Font", L"12", 0, praat_CHECKBUTTON, DO_12);
-	praatButton_14 = praat_addMenuCommand (L"Picture", L"Font", L"14", 0, praat_CHECKBUTTON, DO_14);
-	praatButton_18 = praat_addMenuCommand (L"Picture", L"Font", L"18", 0, praat_CHECKBUTTON, DO_18);
-	praatButton_24 = praat_addMenuCommand (L"Picture", L"Font", L"24", 0, praat_CHECKBUTTON, DO_24);
-	praat_addMenuCommand (L"Picture", L"Font", L"-- font ---", 0, 0, 0);
-	praatButton_fonts [kGraphics_font_TIMES] = praat_addMenuCommand (L"Picture", L"Font", L"Times", 0, praat_RADIO_FIRST, DO_Times);
-	praatButton_fonts [kGraphics_font_HELVETICA] = praat_addMenuCommand (L"Picture", L"Font", L"Helvetica", 0, praat_RADIO_NEXT, DO_Helvetica);
-	praatButton_fonts [kGraphics_font_PALATINO] = praat_addMenuCommand (L"Picture", L"Font", L"Palatino", 0, praat_RADIO_NEXT, DO_Palatino);
-	praatButton_fonts [kGraphics_font_COURIER] = praat_addMenuCommand (L"Picture", L"Font", L"Courier", 0, praat_RADIO_NEXT, DO_Courier);
-
-	praat_addMenuCommand (L"Picture", L"Help", L"Picture window help", 0, '?', DO_PictureWindowHelp);
-	praat_addMenuCommand (L"Picture", L"Help", L"About special symbols", 0, 0, DO_AboutSpecialSymbols);
-	praat_addMenuCommand (L"Picture", L"Help", L"About text styles", 0, 0, DO_AboutTextStyles);
-	praat_addMenuCommand (L"Picture", L"Help", L"Phonetic symbols", 0, 0, DO_PhoneticSymbols);
-	praat_addMenuCommand (L"Picture", L"Help", L"-- manual --", 0, 0, 0);
-	MelderString_empty (& itemTitle_search);
-	MelderString_append (& itemTitle_search, L"Search ", Melder_peekUtf8ToWcs (praatP.title), L" manual...");
-	praat_addMenuCommand (L"Picture", L"Help", itemTitle_search.string, 0, 'M', DO_SearchManual);
+	praat_addMenuCommand (U"Picture", U"Edit", U"-- erase --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Edit", U"Erase all", 0, 'E', DO_Erase_all);
+
+	praat_addMenuCommand (U"Picture", U"Margins", U"Draw inner box", 0, 0, DO_DrawInnerBox);
+	praat_addMenuCommand (U"Picture", U"Margins", U"-- text --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Text left...", 0, 0, DO_Text_left);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Text right...", 0, 0, DO_Text_right);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Text top...", 0, 0, DO_Text_top);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Text bottom...", 0, 0, DO_Text_bottom);
+	praat_addMenuCommand (U"Picture", U"Margins", U"-- marks every --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Marks left every...", 0, 0, DO_Marks_left_every);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Marks right every...", 0, 0, DO_Marks_right_every);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Marks bottom every...", 0, 0, DO_Marks_bottom_every);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Marks top every...", 0, 0, DO_Marks_top_every);
+	praat_addMenuCommand (U"Picture", U"Margins", U"-- one mark --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Margins", U"One mark left...", 0, 0, DO_Mark_left);
+	praat_addMenuCommand (U"Picture", U"Margins", U"One mark right...", 0, 0, DO_Mark_right);
+	praat_addMenuCommand (U"Picture", U"Margins", U"One mark bottom...", 0, 0, DO_Mark_bottom);
+	praat_addMenuCommand (U"Picture", U"Margins", U"One mark top...", 0, 0, DO_Mark_top);
+	praat_addMenuCommand (U"Picture", U"Margins", U"-- marks --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Marks", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Marks left...", 0, 1, DO_Marks_left);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Marks right...", 0, 1, DO_Marks_right);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Marks bottom...", 0, 1, DO_Marks_bottom);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Marks top...", 0, 1, DO_Marks_top);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Logarithmic marks", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Logarithmic marks left...", 0, 1, DO_marksLeftLogarithmic);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Logarithmic marks right...", 0, 1, DO_marksRightLogarithmic);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Logarithmic marks bottom...", 0, 1, DO_marksBottomLogarithmic);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Logarithmic marks top...", 0, 1, DO_marksTopLogarithmic);
+	praat_addMenuCommand (U"Picture", U"Margins", U"One logarithmic mark", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Margins", U"One logarithmic mark left...", 0, 1, DO_LogarithmicMark_left);
+	praat_addMenuCommand (U"Picture", U"Margins", U"One logarithmic mark right...", 0, 1, DO_LogarithmicMark_right);
+	praat_addMenuCommand (U"Picture", U"Margins", U"One logarithmic mark bottom...", 0, 1, DO_LogarithmicMark_bottom);
+	praat_addMenuCommand (U"Picture", U"Margins", U"One logarithmic mark top...", 0, 1, DO_LogarithmicMark_top);
+	praat_addMenuCommand (U"Picture", U"Margins", U"-- axes --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Margins", U"Axes...", 0, 0, DO_Axes);
+
+	praat_addMenuCommand (U"Picture", U"World", U"Text...", 0, 0, DO_Text);
+	praat_addMenuCommand (U"Picture", U"World", U"Text special...", 0, 0, DO_Text_special);
+	praat_addMenuCommand (U"Picture", U"World", U"-- line --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"World", U"Draw line...", 0, 0, DO_DrawLine);
+	praat_addMenuCommand (U"Picture", U"World", U"Draw arrow...", 0, 0, DO_DrawArrow);
+	praat_addMenuCommand (U"Picture", U"World", U"Draw two-way arrow...", 0, 0, DO_DrawDoubleArrow);
+	praat_addMenuCommand (U"Picture", U"World", U"-- function --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"World", U"Draw function...", 0, 0, DO_DrawFunction);
+	praat_addMenuCommand (U"Picture", U"World", U"-- rectangle --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"World", U"Draw rectangle...", 0, 0, DO_DrawRectangle);
+	praat_addMenuCommand (U"Picture", U"World", U"Paint rectangle...", 0, 0, DO_PaintRectangle);
+	praat_addMenuCommand (U"Picture", U"World", U"Draw rounded rectangle...", 0, 0, DO_DrawRoundedRectangle);
+	praat_addMenuCommand (U"Picture", U"World", U"Paint rounded rectangle...", 0, 0, DO_PaintRoundedRectangle);
+	praat_addMenuCommand (U"Picture", U"World", U"-- arc --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"World", U"Draw arc...", 0, 0, DO_DrawArc);
+	praat_addMenuCommand (U"Picture", U"World", U"Draw ellipse...", 0, 0, DO_DrawEllipse);
+	praat_addMenuCommand (U"Picture", U"World", U"Paint ellipse...", 0, 0, DO_PaintEllipse);
+	praat_addMenuCommand (U"Picture", U"World", U"Draw circle...", 0, 0, DO_DrawCircle);
+	praat_addMenuCommand (U"Picture", U"World", U"Paint circle...", 0, 0, DO_PaintCircle);
+	praat_addMenuCommand (U"Picture", U"World", U"Draw circle (mm)...", 0, 0, DO_DrawCircle_mm);
+	praat_addMenuCommand (U"Picture", U"World", U"Paint circle (mm)...", 0, 0, DO_PaintCircle_mm);
+	praat_addMenuCommand (U"Picture", U"World", U"-- picture --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"World", U"Insert picture from file...", 0, 0, DO_InsertPictureFromFile);
+	praat_addMenuCommand (U"Picture", U"World", U"-- axes --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"World", U"Axes...", 0, 0, DO_Axes);
+	praat_addMenuCommand (U"Picture", U"World", U"Measure", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"World", U"Horizontal mm to wc...", 0, 1, DO_dxMMtoWC);
+	praat_addMenuCommand (U"Picture", U"World", U"Horizontal wc to mm...", 0, 1, DO_dxWCtoMM);
+	praat_addMenuCommand (U"Picture", U"World", U"Vertical mm to wc...", 0, 1, DO_dyMMtoWC);
+	praat_addMenuCommand (U"Picture", U"World", U"Vertical wc to mm...", 0, 1, DO_dyWCtoMM);
+	praat_addMenuCommand (U"Picture", U"World", U"-- text measure --", 0, 1, 0);
+	praat_addMenuCommand (U"Picture", U"World", U"Text width (wc)...", 0, 1, DO_textWidth_wc);
+	praat_addMenuCommand (U"Picture", U"World", U"Text width (mm)...", 0, 1, DO_textWidth_mm);
+	praat_addMenuCommand (U"Picture", U"World", U"PostScript text width (wc)...", 0, 1, DO_textWidth_ps_wc);
+	praat_addMenuCommand (U"Picture", U"World", U"PostScript text width (mm)...", 0, 1, DO_textWidth_ps_mm);
+
+	praatButton_innerViewport = praat_addMenuCommand (U"Picture", U"Select", U"Mouse selects inner viewport", 0, praat_RADIO_FIRST, DO_MouseSelectsInnerViewport);
+	praatButton_outerViewport = praat_addMenuCommand (U"Picture", U"Select", U"Mouse selects outer viewport", 0, praat_RADIO_NEXT, DO_MouseSelectsOuterViewport);
+	praat_addMenuCommand (U"Picture", U"Select", U"-- select --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Select", U"Select inner viewport...", 0, 0, DO_SelectInnerViewport);
+	praat_addMenuCommand (U"Picture", U"Select", U"Select outer viewport...", 0, 0, DO_SelectOuterViewport);
+	praat_addMenuCommand (U"Picture", U"Select", U"Viewport...", 0, praat_HIDDEN, DO_SelectOuterViewport);
+	praat_addMenuCommand (U"Picture", U"Select", U"-- viewport drawing --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Select", U"Viewport text...", 0, 0, DO_ViewportText);
+
+	praatButton_lines [Graphics_DRAWN] = praat_addMenuCommand (U"Picture", U"Pen", U"Solid line", 0, praat_RADIO_FIRST, DO_Solid_line);
+	praat_addMenuCommand (U"Picture", U"Pen", U"Plain line", 0, praat_RADIO_NEXT | praat_HIDDEN, DO_Solid_line);
+	praatButton_lines [Graphics_DOTTED] = praat_addMenuCommand (U"Picture", U"Pen", U"Dotted line", 0, praat_RADIO_NEXT, DO_Dotted_line);
+	praatButton_lines [Graphics_DASHED] = praat_addMenuCommand (U"Picture", U"Pen", U"Dashed line", 0, praat_RADIO_NEXT, DO_Dashed_line);
+	praatButton_lines [Graphics_DASHED_DOTTED] = praat_addMenuCommand (U"Picture", U"Pen", U"Dashed-dotted line", 0, praat_RADIO_NEXT, DO_Dashed_dotted_line);
+	praat_addMenuCommand (U"Picture", U"Pen", U"-- line width --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Pen", U"Line width...", 0, 0, DO_Line_width);
+	praat_addMenuCommand (U"Picture", U"Pen", U"Arrow size...", 0, 0, DO_Arrow_size);
+	praat_addMenuCommand (U"Picture", U"Pen", U"Speckle size...", 0, 0, DO_Speckle_size);
+	praat_addMenuCommand (U"Picture", U"Pen", U"-- colour --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Pen", U"Colour...", 0, 0, DO_Colour);
+	praatButton_black = praat_addMenuCommand (U"Picture", U"Pen", U"Black", 0, praat_CHECKBUTTON, DO_Black);
+	praatButton_white = praat_addMenuCommand (U"Picture", U"Pen", U"White", 0, praat_CHECKBUTTON, DO_White);
+	praatButton_red = praat_addMenuCommand (U"Picture", U"Pen", U"Red", 0, praat_CHECKBUTTON, DO_Red);
+	praatButton_green = praat_addMenuCommand (U"Picture", U"Pen", U"Green", 0, praat_CHECKBUTTON, DO_Green);
+	praatButton_blue = praat_addMenuCommand (U"Picture", U"Pen", U"Blue", 0, praat_CHECKBUTTON, DO_Blue);
+	praatButton_yellow = praat_addMenuCommand (U"Picture", U"Pen", U"Yellow", 0, praat_CHECKBUTTON, DO_Yellow);
+	praatButton_cyan = praat_addMenuCommand (U"Picture", U"Pen", U"Cyan", 0, praat_CHECKBUTTON, DO_Cyan);
+	praatButton_magenta = praat_addMenuCommand (U"Picture", U"Pen", U"Magenta", 0, praat_CHECKBUTTON, DO_Magenta);
+	praatButton_maroon = praat_addMenuCommand (U"Picture", U"Pen", U"Maroon", 0, praat_CHECKBUTTON, DO_Maroon);
+	praatButton_lime = praat_addMenuCommand (U"Picture", U"Pen", U"Lime", 0, praat_CHECKBUTTON, DO_Lime);
+	praatButton_navy = praat_addMenuCommand (U"Picture", U"Pen", U"Navy", 0, praat_CHECKBUTTON, DO_Navy);
+	praatButton_teal = praat_addMenuCommand (U"Picture", U"Pen", U"Teal", 0, praat_CHECKBUTTON, DO_Teal);
+	praatButton_purple = praat_addMenuCommand (U"Picture", U"Pen", U"Purple", 0, praat_CHECKBUTTON, DO_Purple);
+	praatButton_olive = praat_addMenuCommand (U"Picture", U"Pen", U"Olive", 0, praat_CHECKBUTTON, DO_Olive);
+	praatButton_pink = praat_addMenuCommand (U"Picture", U"Pen", U"Pink", 0, praat_CHECKBUTTON, DO_Pink);
+	praatButton_silver = praat_addMenuCommand (U"Picture", U"Pen", U"Silver", 0, praat_CHECKBUTTON, DO_Silver);
+	praatButton_grey = praat_addMenuCommand (U"Picture", U"Pen", U"Grey", 0, praat_CHECKBUTTON, DO_Grey);
+
+	praat_addMenuCommand (U"Picture", U"Font", U"Font size...", 0, 0, DO_Font_size);
+	praatButton_10 = praat_addMenuCommand (U"Picture", U"Font", U"10", 0, praat_CHECKBUTTON, DO_10);
+	praatButton_12 = praat_addMenuCommand (U"Picture", U"Font", U"12", 0, praat_CHECKBUTTON, DO_12);
+	praatButton_14 = praat_addMenuCommand (U"Picture", U"Font", U"14", 0, praat_CHECKBUTTON, DO_14);
+	praatButton_18 = praat_addMenuCommand (U"Picture", U"Font", U"18", 0, praat_CHECKBUTTON, DO_18);
+	praatButton_24 = praat_addMenuCommand (U"Picture", U"Font", U"24", 0, praat_CHECKBUTTON, DO_24);
+	praat_addMenuCommand (U"Picture", U"Font", U"-- font ---", 0, 0, 0);
+	praatButton_fonts [kGraphics_font_TIMES] = praat_addMenuCommand (U"Picture", U"Font", U"Times", 0, praat_RADIO_FIRST, DO_Times);
+	praatButton_fonts [kGraphics_font_HELVETICA] = praat_addMenuCommand (U"Picture", U"Font", U"Helvetica", 0, praat_RADIO_NEXT, DO_Helvetica);
+	praatButton_fonts [kGraphics_font_PALATINO] = praat_addMenuCommand (U"Picture", U"Font", U"Palatino", 0, praat_RADIO_NEXT, DO_Palatino);
+	praatButton_fonts [kGraphics_font_COURIER] = praat_addMenuCommand (U"Picture", U"Font", U"Courier", 0, praat_RADIO_NEXT, DO_Courier);
+
+	praat_addMenuCommand (U"Picture", U"Help", U"Picture window help", 0, '?', DO_PictureWindowHelp);
+	praat_addMenuCommand (U"Picture", U"Help", U"About special symbols", 0, 0, DO_AboutSpecialSymbols);
+	praat_addMenuCommand (U"Picture", U"Help", U"About text styles", 0, 0, DO_AboutTextStyles);
+	praat_addMenuCommand (U"Picture", U"Help", U"Phonetic symbols", 0, 0, DO_PhoneticSymbols);
+	praat_addMenuCommand (U"Picture", U"Help", U"-- manual --", 0, 0, 0);
+	praat_addMenuCommand (U"Picture", U"Help",
+		Melder_cat (U"Search ", praatP.title, U" manual..."),
+		0, 'M', DO_SearchManual);
 
 	if (! theCurrentPraatApplication -> batch) {
 		width = height = resolution * 12;
 		scrollWindow = GuiScrolledWindow_createShown (dialog, margin, 0, Machine_getMenuBarHeight () + margin, 0, 1, 1, 0);
 		drawingArea = GuiDrawingArea_createShown (scrollWindow, width, height, NULL, NULL, NULL, NULL, NULL, 0);
-		dialog -> f_show ();
+		GuiThing_show (dialog);
 	}
 
 	// TODO: Paul: deze moet VOOR de update functies anders krijgen die void_me 0x0
@@ -1782,15 +1811,15 @@ void praat_picture_init (void) {
 	updateViewportMenu ();
 }
 
-void praat_picture_prefsChanged (void) {
+void praat_picture_prefsChanged () {
 	updateFontMenu ();
 	updateSizeMenu ();
 	updateViewportMenu ();
-	Graphics_setFontSize (theCurrentPraatPicture -> graphics, theCurrentPraatPicture -> fontSize);   /* So that the thickness of the selection rectangle is correct. */
+	Graphics_setFontSize (theCurrentPraatPicture -> graphics, theCurrentPraatPicture -> fontSize);   // so that the thickness of the selection rectangle is correct
 	Picture_setMouseSelectsInnerViewport (praat_picture, praat_mouseSelectsInnerViewport);
 }
 
-void praat_picture_background (void) {
+void praat_picture_background () {
 	if (theCurrentPraatPicture != & theForegroundPraatPicture) return;   // Demo window and pictures ignore this
 	if (! theCurrentPraatApplication -> batch) {
 		//Picture_unhighlight (praat_picture);
@@ -1800,7 +1829,7 @@ void praat_picture_background (void) {
 	}
 }
 
-void praat_picture_foreground (void) {
+void praat_picture_foreground () {
 	if (theCurrentPraatPicture != & theForegroundPraatPicture) return;   // Demo window and pictures ignore this
 	if (! theCurrentPraatApplication -> batch) {
 		#if cocoa
diff --git a/sys/praat_script.cpp b/sys/praat_script.cpp
index 466eb35..aae99ee 100644
--- a/sys/praat_script.cpp
+++ b/sys/praat_script.cpp
@@ -1,6 +1,6 @@
 /* praat_script.cpp
  *
- * Copyright (C) 1993-2012,2013,2014 Paul Boersma
+ * Copyright (C) 1993-2012,2013,2014,2015 Paul Boersma
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,36 +25,36 @@
 #include "UiPause.h"
 #include "DemoEditor.h"
 
-static int praat_findObjectFromString (Interpreter interpreter, const wchar_t *string) {
+static int praat_findObjectFromString (Interpreter interpreter, const char32 *string) {
 	try {
 		int IOBJECT;
-		while (*string == ' ') string ++;
-		if (*string >= 'A' && *string <= 'Z') {
+		while (*string == U' ') string ++;
+		if (*string >= U'A' && *string <= U'Z') {
 			/*
 			 * Find the object by its name.
 			 */
-			static MelderString buffer = { 0 };
+			static MelderString buffer { 0 };
 			MelderString_copy (& buffer, string);
-			wchar_t *space = wcschr (buffer.string, ' ');
+			char32 *space = str32chr (buffer.string, U' ');
 			if (space == NULL)
-				Melder_throw ("Missing space in name.");
-			*space = '\0';
-			wchar_t *className = & buffer.string [0], *givenName = space + 1;
+				Melder_throw (U"Missing space in name.");
+			*space = U'\0';
+			char32 *className = & buffer.string [0], *givenName = space + 1;
 			WHERE_DOWN (1) {
-				Data object = (Data) OBJECT;
-				if (wcsequ (className, Thing_className ((Thing) OBJECT)) && wcsequ (givenName, object -> name))
+				Daata object = (Daata) OBJECT;
+				if (str32equ (className, Thing_className (OBJECT)) && str32equ (givenName, object -> name))
 					return IOBJECT;
 			}
 			/*
 			 * No object with that name. Perhaps the class name was wrong?
 			 */
-			ClassInfo klas = Thing_classFromClassName (className);
+			ClassInfo klas = Thing_classFromClassName (className, NULL);
 			WHERE_DOWN (1) {
-				Data object = (Data) OBJECT;
-				if (wcsequ (klas -> className, Thing_className ((Thing) OBJECT)) && wcsequ (givenName, object -> name))
+				Daata object = (Daata) OBJECT;
+				if (str32equ (klas -> className, Thing_className (OBJECT)) && str32equ (givenName, object -> name))
 					return IOBJECT;
 			}
-			Melder_throw ("No object with that name.");
+			Melder_throw (U"No object with that name.");
 		} else {
 			/*
 			 * Find the object by its ID.
@@ -64,35 +64,35 @@ static int praat_findObjectFromString (Interpreter interpreter, const wchar_t *s
 			long id = (long) value;
 			WHERE (ID == id)
 				return IOBJECT;
-			Melder_throw ("No object with number ", id, ".");
+			Melder_throw (U"No object with number ", id, U".");
 		}
 	} catch (MelderError) {
-		Melder_throw ("Object \"", string, L"\" does not exist.");
+		Melder_throw (U"Object \"", string, U"\" does not exist.");
 	}
 }
 
-Editor praat_findEditorFromString (const wchar_t *string) {
+Editor praat_findEditorFromString (const char32 *string) {
 	int IOBJECT;
-	while (*string == ' ') string ++;
-	if (*string >= 'A' && *string <= 'Z') {
+	while (*string == U' ') string ++;
+	if (*string >= U'A' && *string <= U'Z') {
 		WHERE_DOWN (1) {
 			for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++) {
-				Editor editor = (Editor) theCurrentPraatObjects -> list [IOBJECT]. editors [ieditor];
+				Editor editor = theCurrentPraatObjects -> list [IOBJECT]. editors [ieditor];
 				if (editor != NULL) {
-					const wchar_t *name = wcschr (editor -> name, ' ') + 1;
-					if (wcsequ (name, string)) return editor;
+					const char32 *name = str32chr (editor -> name, U' ') + 1;
+					if (str32equ (name, string)) return editor;
 				}
 			}
 		}
 	} else {
 		WHERE_DOWN (1) {
 			for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++) {
-				Editor editor = (Editor) theCurrentPraatObjects -> list [IOBJECT]. editors [ieditor];
-				if (editor && wcsequ (editor -> name, string)) return editor;
+				Editor editor = theCurrentPraatObjects -> list [IOBJECT]. editors [ieditor];
+				if (editor && str32equ (editor -> name, string)) return editor;
 			}
 		}
 	}
-	Melder_throw ("Editor \"", string, "\" does not exist.");
+	Melder_throw (U"Editor \"", string, U"\" does not exist.");
 }
 
 Editor praat_findEditorById (long id) {
@@ -100,22 +100,22 @@ Editor praat_findEditorById (long id) {
 	WHERE (1) {
 		if (ID == id) {
 			for (int ieditor = 0; ieditor < praat_MAXNUM_EDITORS; ieditor ++) {
-				Editor editor = (Editor) theCurrentPraatObjects -> list [IOBJECT]. editors [ieditor];
+				Editor editor = theCurrentPraatObjects -> list [IOBJECT]. editors [ieditor];
 				if (editor) return editor;
 			}
 		}
 	}
-	Melder_throw ("Editor ", id, " does not exist.");
+	Melder_throw (U"Editor ", id, U" does not exist.");
 }
 
-static int parseCommaSeparatedArguments (Interpreter interpreter, wchar_t *arguments, structStackel args []) {
+static int parseCommaSeparatedArguments (Interpreter interpreter, char32 *arguments, structStackel args []) {
 	int narg = 0, depth = 0;
-	for (wchar_t *p = arguments; ; p ++) {
-		bool endOfArguments = *p == '\0';
-		if (endOfArguments || (*p == ',' && depth == 0)) {
+	for (char32 *p = arguments; ; p ++) {
+		bool endOfArguments = *p == U'\0';
+		if (endOfArguments || (*p == U',' && depth == 0)) {
 			if (narg == MAXIMUM_NUMBER_OF_FIELDS)
-				Melder_throw ("Cannot have more than ", MAXIMUM_NUMBER_OF_FIELDS, " arguments");
-			*p = '\0';
+				Melder_throw (U"Cannot have more than ", MAXIMUM_NUMBER_OF_FIELDS, U" arguments");
+			*p = U'\0';
 			struct Formula_Result result;
 			Interpreter_anyExpression (interpreter, arguments, & result);
 			narg ++;
@@ -144,15 +144,15 @@ static int parseCommaSeparatedArguments (Interpreter interpreter, wchar_t *argum
 				} break;
 			}
 			arguments = p + 1;
-		} else if (*p == '(' || *p == '[' || *p == '{') {
+		} else if (*p == U'(' || *p == U'[' || *p == U'{') {
 			depth ++;
-		} else if (*p == ')' || *p == ']' || *p == '}') {
+		} else if (*p == U')' || *p == U']' || *p == U'}') {
 			depth --;
-		} else if (*p == '\"') {
+		} else if (*p == U'\"') {
 			for (;;) {
 				p ++;
-				if (*p == '\"') {
-					if (p [1] == '\"') p ++;
+				if (*p == U'\"') {
+					if (p [1] == U'\"') p ++;
 					else break;
 				}
 			}
@@ -162,19 +162,19 @@ static int parseCommaSeparatedArguments (Interpreter interpreter, wchar_t *argum
 	return narg;
 }
 
-int praat_executeCommand (Interpreter interpreter, wchar_t *command) {
+int praat_executeCommand (Interpreter interpreter, char32 *command) {
 	static struct structStackel args [1 + MAXIMUM_NUMBER_OF_FIELDS];
-	//Melder_casual ("praat_executeCommand: %ld: %ls", interpreter, command);
-	if (command [0] == '\0' || command [0] == '#' || command [0] == '!' || command [0] == ';')
+	//trace (U"praat_executeCommand: ", Melder_pointer (interpreter), U": ", command);
+	if (command [0] == U'\0' || command [0] == U'#' || command [0] == U'!' || command [0] == U';')
 		/* Skip empty lines and comments. */;
-	else if ((command [0] == '.' || command [0] == '+' || command [0] == '-') && isupper (command [1])) {   // selection?
+	else if ((command [0] == U'.' || command [0] == U'+' || command [0] == U'-') && isupper ((int) command [1])) {   // selection?
 		int IOBJECT = praat_findObjectFromString (interpreter, command + 1);
 		if (command [0] == '.') praat_deselectAll ();
 		if (command [0] == '-') praat_deselect (IOBJECT); else praat_select (IOBJECT); 
 		praat_show ();
-	} else if (islower (command [0])) {   // all directives start with a lower-case letter
-		if (wcsnequ (command, L"select ", 7)) {
-			if (wcsnequ (command + 7, L"all", 3) && (command [10] == '\0' || command [10] == ' ' || command [10] == '\t')) {
+	} else if (islower ((int) command [0])) {   // all directives start with a lower-case letter
+		if (str32nequ (command, U"select ", 7)) {
+			if (str32nequ (command + 7, U"all", 3) && (command [10] == U'\0' || command [10] == U' ' || command [10] == U'\t')) {
 				praat_selectAll ();
 				praat_show ();
 			} else {
@@ -183,190 +183,190 @@ int praat_executeCommand (Interpreter interpreter, wchar_t *command) {
 				praat_select (IOBJECT);
 				praat_show ();
 			}
-		} else if (wcsnequ (command, L"plus ", 5)) {
+		} else if (str32nequ (command, U"plus ", 5)) {
 			int IOBJECT = praat_findObjectFromString (interpreter, command + 5);
 			praat_select (IOBJECT);
 			praat_show ();
-		} else if (wcsnequ (command, L"minus ", 6)) {
+		} else if (str32nequ (command, U"minus ", 6)) {
 			int IOBJECT = praat_findObjectFromString (interpreter, command + 6);
 			praat_deselect (IOBJECT);
 			praat_show ();
-		} else if (wcsnequ (command, L"echo ", 5)) {
+		} else if (str32nequ (command, U"echo ", 5)) {
 			MelderInfo_open ();
 			MelderInfo_write (command + 5);
 			MelderInfo_close ();
-		} else if (wcsnequ (command, L"clearinfo", 9)) {
+		} else if (str32nequ (command, U"clearinfo", 9)) {
 			Melder_clearInfo ();
-		} else if (wcsnequ (command, L"print ", 6)) {
+		} else if (str32nequ (command, U"print ", 6)) {
 			MelderInfo_write (command + 6);
 			MelderInfo_drain ();
-		} else if (wcsnequ (command, L"printtab", 8)) {
-			MelderInfo_write (L"\t");
+		} else if (str32nequ (command, U"printtab", 8)) {
+			MelderInfo_write (U"\t");
 			MelderInfo_drain ();
-		} else if (wcsnequ (command, L"printline", 9)) {
+		} else if (str32nequ (command, U"printline", 9)) {
 			if (command [9] == ' ') MelderInfo_write (command + 10);
-			MelderInfo_write (L"\n");
+			MelderInfo_write (U"\n");
 			MelderInfo_drain ();
-		} else if (wcsnequ (command, L"fappendinfo ", 12)) {
+		} else if (str32nequ (command, U"fappendinfo ", 12)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw ("The script command \"fappendinfo\" is not available inside pictures.");
+				Melder_throw (U"The script command \"fappendinfo\" is not available inside pictures.");
 			structMelderFile file = { 0 };
 			Melder_relativePathToFile (command + 12, & file);
 			MelderFile_appendText (& file, Melder_getInfo ());
-		} else if (wcsnequ (command, L"unix ", 5)) {
+		} else if (str32nequ (command, U"unix ", 5)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw ("The script command \"unix\" is not available inside manuals.");
+				Melder_throw (U"The script command \"unix\" is not available inside manuals.");
 			try {
 				Melder_system (command + 5);
 			} catch (MelderError) {
-				Melder_throw ("Unix command \"", command + 5, "\" returned error status;\n"
-					"if you want to ignore this, use `unix_nocheck' instead of `unix'.");
+				Melder_throw (U"Unix command \"", command + 5, U"\" returned error status;\n"
+					U"if you want to ignore this, use `unix_nocheck' instead of `unix'.");
 			}
-		} else if (wcsnequ (command, L"unix_nocheck ", 13)) {
+		} else if (str32nequ (command, U"unix_nocheck ", 13)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw (L"The script command \"unix_nocheck\" is not available inside manuals.");
+				Melder_throw (U"The script command \"unix_nocheck\" is not available inside manuals.");
 			try {
 				Melder_system (command + 13);
 			} catch (MelderError) {
 				Melder_clearError ();
 			}
-		} else if (wcsnequ (command, L"system ", 7)) {
+		} else if (str32nequ (command, U"system ", 7)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw (L"The script command \"system\" is not available inside manuals.");
+				Melder_throw (U"The script command \"system\" is not available inside manuals.");
 			try {
 				Melder_system (command + 7);
 			} catch (MelderError) {
-				Melder_throw ("System command \"", command + 7, "\" returned error status;\n"
-					"if you want to ignore this, use `system_nocheck' instead of `system'.");
+				Melder_throw (U"System command \"", command + 7, U"\" returned error status;\n"
+					U"if you want to ignore this, use `system_nocheck' instead of `system'.");
 			}
-		} else if (wcsnequ (command, L"system_nocheck ", 15)) {
+		} else if (str32nequ (command, U"system_nocheck ", 15)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw ("The script command \"system_nocheck\" is not available inside manuals.");
+				Melder_throw (U"The script command \"system_nocheck\" is not available inside manuals.");
 			try {
 				Melder_system (command + 15);
 			} catch (MelderError) {
 				Melder_clearError ();
 			}
-		} else if (wcsnequ (command, L"nowarn ", 7)) {
+		} else if (str32nequ (command, U"nowarn ", 7)) {
 			autoMelderWarningOff nowarn;
 			praat_executeCommand (interpreter, command + 7);
-		} else if (wcsnequ (command, L"noprogress ", 11)) {
+		} else if (str32nequ (command, U"noprogress ", 11)) {
 			autoMelderProgressOff noprogress;
 			praat_executeCommand (interpreter, command + 11);
-		} else if (wcsnequ (command, L"nocheck ", 8)) {
+		} else if (str32nequ (command, U"nocheck ", 8)) {
 			try {
 				praat_executeCommand (interpreter, command + 8);
 			} catch (MelderError) {
 				Melder_clearError ();
 				return 0;
 			}
-		} else if (wcsnequ (command, L"demo ", 5)) {
+		} else if (str32nequ (command, U"demo ", 5)) {
 			autoDemoOpen demo;
 			praat_executeCommand (interpreter, command + 5);
-		} else if (wcsnequ (command, L"asynchronous ", 13)) {
+		} else if (str32nequ (command, U"asynchronous ", 13)) {
 			autoMelderAsynchronous asynchronous;
 			praat_executeCommand (interpreter, command + 13);
-		} else if (wcsnequ (command, L"pause ", 6) || wcsequ (command, L"pause")) {
+		} else if (str32nequ (command, U"pause ", 6) || str32equ (command, U"pause")) {
 			if (theCurrentPraatApplication -> batch)
 				return 1;   // in batch we ignore pause statements
-			UiPause_begin (theCurrentPraatApplication -> topShell, L"stop or continue", interpreter);
-			UiPause_comment (wcsequ (command, L"pause") ? L"..." : command + 6);
-			UiPause_end (1, 1, 0, L"Continue", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, interpreter);
-		} else if (wcsnequ (command, L"execute ", 8)) {
+			UiPause_begin (theCurrentPraatApplication -> topShell, U"stop or continue", interpreter);
+			UiPause_comment (str32equ (command, U"pause") ? U"..." : command + 6);
+			UiPause_end (1, 1, 0, U"Continue", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, interpreter);
+		} else if (str32nequ (command, U"execute ", 8)) {
 			praat_executeScriptFromFileNameWithArguments (command + 8);
-		} else if (wcsnequ (command, L"editor", 6)) {
+		} else if (str32nequ (command, U"editor", 6)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw ("The script command \"editor\" is not available inside manuals.");
-			if (command [6] == ' ' && isalpha (command [7])) {
+				Melder_throw (U"The script command \"editor\" is not available inside manuals.");
+			if (command [6] == U' ' && isalpha ((int) command [7])) {
 				praatP. editor = praat_findEditorFromString (command + 7);
-			} else if (command [6] == '\0') {
+			} else if (command [6] == U'\0') {
 				if (interpreter && interpreter -> editorClass) {
 					praatP. editor = praat_findEditorFromString (interpreter -> environmentName);
 				} else {
-					Melder_throw ("The function \"editor\" requires an argument when called from outside an editor.");
+					Melder_throw (U"The function \"editor\" requires an argument when called from outside an editor.");
 				}
 			} else {
 				Interpreter_voidExpression (interpreter, command);
 			}
-		} else if (wcsnequ (command, L"endeditor", 9)) {
+		} else if (str32nequ (command, U"endeditor", 9)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw ("The script command \"endeditor\" is not available inside manuals.");
+				Melder_throw (U"The script command \"endeditor\" is not available inside manuals.");
 			praatP. editor = NULL;
-		} else if (wcsnequ (command, L"sendpraat ", 10)) {
+		} else if (str32nequ (command, U"sendpraat ", 10)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw ("The script command \"sendpraat\" is not available inside manuals.");
-			wchar_t programName [41], *q = & programName [0];
+				Melder_throw (U"The script command \"sendpraat\" is not available inside manuals.");
+			char32 programName [41], *q = & programName [0];
 			#ifdef macintosh
 				#define SENDPRAAT_TIMEOUT  10
 			#else
 				#define SENDPRAAT_TIMEOUT  0
 			#endif
-			const wchar_t *p = command + 10;
-			while (*p == ' ' || *p == '\t') p ++;
-			while (*p != '\0' && *p != ' ' && *p != '\t' && q < programName + 39) *q ++ = *p ++;
+			const char32 *p = command + 10;
+			while (*p == U' ' || *p == U'\t') p ++;
+			while (*p != U'\0' && *p != U' ' && *p != U'\t' && q < programName + 39) *q ++ = *p ++;
 			*q = '\0';
 			if (q == programName)
-				Melder_throw ("Missing program name after `sendpraat'.");
-			while (*p == ' ' || *p == '\t') p ++;
-			if (*p == '\0')
-				Melder_throw ("Missing command after `sendpraat'.");
+				Melder_throw (U"Missing program name after `sendpraat'.");
+			while (*p == U' ' || *p == U'\t') p ++;
+			if (*p == U'\0')
+				Melder_throw (U"Missing command after `sendpraat'.");
 			#if motif
-			char *result = sendpraat (XtDisplay (theCurrentPraatApplication -> topShell), Melder_peekWcsToUtf8 (programName),
-				SENDPRAAT_TIMEOUT, Melder_peekWcsToUtf8 (p));
+			char *result = sendpraat (XtDisplay (theCurrentPraatApplication -> topShell), Melder_peek32to8 (programName),
+				SENDPRAAT_TIMEOUT, Melder_peek32to8 (p));
 			if (result)
-				Melder_throw (result, "\nMessage to ", programName, " not completed.");
+				Melder_throw (Melder_peek8to32 (result), U"\nMessage to ", programName, U" not completed.");
 			#endif
-		} else if (wcsnequ (command, L"sendsocket ", 11)) {
+		} else if (str32nequ (command, U"sendsocket ", 11)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw ("The script command \"sendsocket\" is not available inside manuals.");
-			wchar_t hostName [61], *q = & hostName [0];
-			const wchar_t *p = command + 11;
-			while (*p == ' ' || *p == '\t') p ++;
-			while (*p != '\0' && *p != ' ' && *p != '\t' && q < hostName + 59) *q ++ = *p ++;
-			*q = '\0';
+				Melder_throw (U"The script command \"sendsocket\" is not available inside manuals.");
+			char32 hostName [61], *q = & hostName [0];
+			const char32 *p = command + 11;
+			while (*p == U' ' || *p == U'\t') p ++;
+			while (*p != U'\0' && *p != U' ' && *p != U'\t' && q < hostName + 59) *q ++ = *p ++;
+			*q = U'\0';
 			if (q == hostName)
-				Melder_throw ("Missing host name after `sendsocket'.");
-			while (*p == ' ' || *p == '\t') p ++;
-			if (*p == '\0')
-				Melder_throw ("Missing command after `sendsocket'.");
-			char *result = sendsocket (Melder_peekWcsToUtf8 (hostName), Melder_peekWcsToUtf8 (p));
+				Melder_throw (U"Missing host name after `sendsocket'.");
+			while (*p == U' ' || *p == U'\t') p ++;
+			if (*p == U'\0')
+				Melder_throw (U"Missing command after `sendsocket'.");
+			char *result = sendsocket (Melder_peek32to8 (hostName), Melder_peek32to8 (p));
 			if (result)
-				Melder_throw (result, "\nMessage to ", hostName, " not completed.");
-		} else if (wcsnequ (command, L"filedelete ", 11)) {
+				Melder_throw (Melder_peek8to32 (result), U"\nMessage to ", hostName, U" not completed.");
+		} else if (str32nequ (command, U"filedelete ", 11)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw ("The script command \"filedelete\" is not available inside manuals.");
-			const wchar_t *p = command + 11;
+				Melder_throw (U"The script command \"filedelete\" is not available inside manuals.");
+			const char32 *p = command + 11;
 			structMelderFile file = { 0 };
-			while (*p == ' ' || *p == '\t') p ++;
-			if (*p == '\0')
-				Melder_throw ("Missing file name after `filedelete'.");
+			while (*p == U' ' || *p == U'\t') p ++;
+			if (*p == U'\0')
+				Melder_throw (U"Missing file name after `filedelete'.");
 			Melder_relativePathToFile (p, & file);
 			MelderFile_delete (& file);
-		} else if (wcsnequ (command, L"fileappend ", 11)) {
+		} else if (str32nequ (command, U"fileappend ", 11)) {
 			if (theCurrentPraatObjects != & theForegroundPraatObjects)
-				Melder_throw ("The script command \"fileappend\" is not available inside manuals.");
-			const wchar_t *p = command + 11;
-			wchar_t path [256], *q = & path [0];
-			while (*p == ' ' || *p == '\t') p ++;
-			if (*p == '\0')
-				Melder_throw (L"Missing file name after `fileappend'.");
+				Melder_throw (U"The script command \"fileappend\" is not available inside manuals.");
+			const char32 *p = command + 11;
+			char32 path [kMelder_MAXPATH+1], *q = & path [0];
+			while (*p == U' ' || *p == U'\t') p ++;
+			if (*p == U'\0')
+				Melder_throw (U"Missing file name after `fileappend'.");
 			if (*p == '\"') {
 				for (;;) {
-					int kar = * ++ p;
-					if (kar == '\"') if (* ++ p == '\"') *q ++ = '\"'; else break;
-					else if (kar == '\0') break;
+					char32 kar = * ++ p;
+					if (kar == U'\"') if (* ++ p == U'\"') *q ++ = U'\"'; else break;
+					else if (kar == U'\0') break;
 					else *q ++ = kar;
 				}
 			} else {
 				for (;;) {
-					int kar = * p;
-					if (kar == '\0' || kar == ' ' || kar == '\t') break;
+					char32 kar = * p;
+					if (kar == U'\0' || kar == U' ' || kar == U'\t') break;
 					*q ++ = kar;
 					p ++;
 				}
 			}
-			*q = '\0';
-			if (*p == ' ' || *p == '\t') {
+			*q = U'\0';
+			if (*p == U' ' || *p == U'\t') {
 				structMelderFile file = { 0 };
 				Melder_relativePathToFile (path, & file);
 				MelderFile_appendText (& file, p + 1);
@@ -384,31 +384,31 @@ int praat_executeCommand (Interpreter interpreter, wchar_t *command) {
  		/* Parse command line into command and arguments. */
 		/* The separation is formed by the three dots or a colon. */
 
-		wchar_t *arguments = & command [0];
-		for (arguments = & command [0]; *arguments != '\0'; arguments ++) {
-			if (*arguments == ':') {
+		char32 *arguments = & command [0];
+		for (arguments = & command [0]; *arguments != U'\0'; arguments ++) {
+			if (*arguments == U':') {
 				hasColon = true;
-				if (arguments [1] == '\0') {
+				if (arguments [1] == U'\0') {
 					arguments = & arguments [1];   // empty string
 				} else {
-					if (arguments [1] != ' ') {
-						Melder_throw ("There should be a space after the colon.");
+					if (arguments [1] != U' ') {
+						Melder_throw (U"There should be a space after the colon.");
 					}
-					arguments [1] = '\0';   // new end of "command"
+					arguments [1] = U'\0';   // new end of "command"
 					arguments += 2;   // the arguments start after the space
 				}
 				break;
 			}
-			if (*arguments == '.' && arguments [1] == '.' && arguments [2] == '.') {
+			if (*arguments == U'.' && arguments [1] == U'.' && arguments [2] == U'.') {
 				hasDots = true;
 				arguments += 3;
-				if (*arguments == '\0') {
+				if (*arguments == U'\0') {
 					// empty string
 				} else {
-					if (*arguments != ' ') {
-						Melder_throw ("There should be a space after the three dots.");
+					if (*arguments != U' ') {
+						Melder_throw (U"There should be a space after the three dots.");
 					}
-					*arguments = '\0';   // new end of "command"
+					*arguments = U'\0';   // new end of "command"
 					arguments ++;   // the arguments start after the space
 				}
 				break;
@@ -419,27 +419,27 @@ int praat_executeCommand (Interpreter interpreter, wchar_t *command) {
 		/* First try loose commands, then fixed commands. */
 
 		int narg;
-		wchar_t command2 [200];
+		char32 command2 [200];
 		if (hasColon) {
 			narg = parseCommaSeparatedArguments (interpreter, arguments, args);
-			wcscpy (command2, command);
-			wchar_t *colon = wcschr (command2, ':');
-			colon [0] = colon [1] = colon [2] = '.';
-			colon [3] = '\0';
+			str32cpy (command2, command);
+			char32 *colon = str32chr (command2, U':');
+			colon [0] = colon [1] = colon [2] = U'.';
+			colon [3] = U'\0';
 		}
 		if (theCurrentPraatObjects == & theForegroundPraatObjects && praatP. editor != NULL) {
 			if (hasColon) {
-				Editor_doMenuCommand ((Editor) praatP. editor, command2, narg, args, NULL, interpreter);
+				Editor_doMenuCommand (praatP. editor, command2, narg, args, NULL, interpreter);
 			} else {
-				Editor_doMenuCommand ((Editor) praatP. editor, command, 0, NULL, arguments, interpreter);
+				Editor_doMenuCommand (praatP. editor, command, 0, NULL, arguments, interpreter);
 			}
 		} else if (theCurrentPraatObjects != & theForegroundPraatObjects &&
-		    (wcsnequ (command, L"Save ", 5) ||
-			 wcsnequ (command, L"Write ", 6) ||
-			 wcsnequ (command, L"Append ", 7) ||
-			 wcsequ (command, L"Quit")))
+		    (str32nequ (command, U"Save ", 5) ||
+			 str32nequ (command, U"Write ", 6) ||
+			 str32nequ (command, U"Append ", 7) ||
+			 str32equ (command, U"Quit")))
 		{
-			Melder_throw ("Commands that write files (including Quit) are not available inside manuals.");
+			Melder_throw (U"Commands that write files (including Quit) are not available inside manuals.");
 		} else {
 			bool theCommandIsAnExistingAction = false;
 			try {
@@ -454,8 +454,8 @@ int praat_executeCommand (Interpreter interpreter, wchar_t *command) {
 				 * Anything could have gone wrong in its execution,
 				 * but one invisible problem can be checked here.
 				 */
-				if (hasDots && arguments [0] != '\0' && arguments [wcslen (arguments) - 1] == ' ') {
-					Melder_throw ("It may be helpful to remove the trailing spaces in \"", arguments, "\".");
+				if (hasDots && arguments [0] != U'\0' && arguments [str32len (arguments) - 1] == U' ') {
+					Melder_throw (U"It may be helpful to remove the trailing spaces in \"", arguments, U"\".");
 				} else {
 					throw;
 				}
@@ -474,23 +474,23 @@ int praat_executeCommand (Interpreter interpreter, wchar_t *command) {
 					 * Anything could have gone wrong in its execution,
 					 * but one invisible problem can be checked here.
 					 */
-					if (hasDots && arguments [0] != '\0' && arguments [wcslen (arguments) - 1] == ' ') {
-						Melder_throw ("It may be helpful to remove the trailing spaces in \"", arguments, L"\".");
+					if (hasDots && arguments [0] != U'\0' && arguments [str32len (arguments) - 1] == U' ') {
+						Melder_throw (U"It may be helpful to remove the trailing spaces in \"", arguments, U"\".");
 					} else {
 						throw;
 					}
 				}
 				if (! theCommandIsAnExistingMenuCommand) {
-					if (wcsnequ (command, L"ARGS ", 5)) {
-						Melder_throw ("Command \"ARGS\" no longer supported. Instead use \"form\" and \"endform\".");
-					} else if (wcschr (command, '=')) {
-						Melder_throw ("Command \"", command, "\" not recognized.\n"
-							"Probable cause: you are trying to use a variable name that starts with a capital.");
-					} else if (command [0] != '\0' && command [wcslen (command) - 1] == ' ') {
-						Melder_throw ("Command \"", command, "\" not available for current selection. "
-							"It may be helpful to remove the trailing spaces.");
+					if (str32nequ (command, U"ARGS ", 5)) {
+						Melder_throw (U"Command \"ARGS\" no longer supported. Instead use \"form\" and \"endform\".");
+					} else if (str32chr (command, U'=')) {
+						Melder_throw (U"Command \"", command, U"\" not recognized.\n"
+							U"Probable cause: you are trying to use a variable name that starts with a capital.");
+					} else if (command [0] != U'\0' && command [str32len (command) - 1] == U' ') {
+						Melder_throw (U"Command \"", command, U"\" not available for current selection. "
+							U"It may be helpful to remove the trailing spaces.");
 					} else {
-						Melder_throw ("Command \"", command, "\" not available for current selection.");
+						Melder_throw (U"Command \"", command, U"\" not available for current selection.");
 					}
 				}
 			}
@@ -500,102 +500,104 @@ int praat_executeCommand (Interpreter interpreter, wchar_t *command) {
 	return 1;
 }
 
-void praat_executeCommandFromStandardInput (const char *programName) {
-	char command [1000]; // can be recursive
+void praat_executeCommandFromStandardInput (const char32 *programName) {
+	char command8 [1000];   // can be recursive
+	/*
+	 * FIXME: implement for Windows.
+	 */
 	for (;;) {
-		char *newLine;
-		printf ("%s > ", programName);
-		if (! fgets (command, 999, stdin))
-			Melder_throw ("Cannot read input.");
-		newLine = strchr (command, '\n');
+		printf ("%s > ", Melder_peek32to8 (programName));
+		if (! fgets (command8, 999, stdin))
+			Melder_throw (U"Cannot read input.");
+		char *newLine = strchr (command8, '\n');
 		if (newLine) *newLine = '\0';
-		autostring commandW = Melder_utf8ToWcs (command);
+		autostring32 command32 = Melder_8to32 (command8);
 		try {
-			praat_executeCommand (NULL, commandW.peek());
+			praat_executeCommand (NULL, command32.peek());
 		} catch (MelderError) {
-			Melder_error_ (programName, ": command \"", command, "\" not executed.");
-			Melder_flushError (NULL);
+			Melder_flushError (programName, U": command \"", Melder_peek8to32 (command8), U"\" not executed.");
 		}
 	}
 }
 
-void praat_executeScriptFromFile (MelderFile file, const wchar_t *arguments) {
+void praat_executeScriptFromFile (MelderFile file, const char32 *arguments) {
 	try {
-		autostring text = MelderFile_readText (file);
+		autostring32 text = MelderFile_readText (file);
 		autoMelderFileSetDefaultDir dir (file);   // so that relative file names can be used inside the script
 		Melder_includeIncludeFiles (& text);
 		autoInterpreter interpreter = Interpreter_createFromEnvironment (praatP.editor);
 		if (arguments) {
-			Interpreter_readParameters (interpreter.peek(), text.peek());
-			Interpreter_getArgumentsFromString (interpreter.peek(), arguments);
+			Interpreter_readParameters (interpreter.get(), text.peek());
+			Interpreter_getArgumentsFromString (interpreter.get(), arguments);
 		}
-		Interpreter_run (interpreter.peek(), text.peek());
+		Interpreter_run (interpreter.get(), text.peek());
 	} catch (MelderError) {
-		Melder_throw (L"Script ", file, L" not completed.");
+		Melder_throw (U"Script ", file, U" not completed.");
 	}
 }
 
-void praat_executeScriptFromFileName (const wchar_t *fileName, int narg, Stackel args) {
+void praat_executeScriptFromFileName (const char32 *fileName, int narg, Stackel args) {
 	/*
 	 * The argument 'fileName' is unsafe. Duplicate its contents.
 	 */
 	structMelderFile file = { 0 };
 	Melder_relativePathToFile (fileName, & file);
 	try {
-		autostring text = MelderFile_readText (& file);
+		autostring32 text = MelderFile_readText (& file);
 		autoMelderFileSetDefaultDir dir (& file);   // so that relative file names can be used inside the script
 		Melder_includeIncludeFiles (& text);
 		autoInterpreter interpreter = Interpreter_createFromEnvironment (praatP.editor);
-		Interpreter_readParameters (interpreter.peek(), text.peek());
-		Interpreter_getArgumentsFromArgs (interpreter.peek(), narg, args);
-		Interpreter_run (interpreter.peek(), text.peek());
+		Interpreter_readParameters (interpreter.get(), text.peek());
+		Interpreter_getArgumentsFromArgs (interpreter.get(), narg, args);
+		Interpreter_run (interpreter.get(), text.peek());
 	} catch (MelderError) {
-		Melder_throw (L"Script ", & file, L" not completed.");   // don't refer to 'fileName', because its contents may have changed
+		Melder_throw (U"Script ", & file, U" not completed.");   // don't refer to 'fileName', because its contents may have changed
 	}
 }
 
-void praat_executeScriptFromFileNameWithArguments (const wchar_t *nameAndArguments) {
-	wchar_t path [256];
-	const wchar_t *p, *arguments;
+void praat_executeScriptFromFileNameWithArguments (const char32 *nameAndArguments) {
+	char32 path [256];
+	const char32 *p, *arguments;
 	structMelderFile file = { 0 };
 	/*
 	 * Split into file name and arguments.
 	 */
 	p = nameAndArguments;
-	while (*p == ' ' || *p == '\t') p ++;
-	if (*p == '\"') {
-		wchar_t *q = path;
+	while (*p == U' ' || *p == U'\t') p ++;
+	if (*p == U'\"') {
+		char32 *q = path;
 		p ++;   // skip quote
-		while (*p != '\"' && *p != '\0') * q ++ = * p ++;
-		*q = '\0';
+		while (*p != U'\"' && *p != U'\0') * q ++ = * p ++;
+		*q = U'\0';
 		arguments = p;
-		if (*arguments == '\"') arguments ++;
-		if (*arguments == ' ') arguments ++;
+		if (*arguments == U'\"') arguments ++;
+		if (*arguments == U' ') arguments ++;
 	} else {
-		wchar_t *q = path;
-		while (*p != ' ' && *p != '\0') * q ++ = * p ++;
-		*q = '\0';
+		char32 *q = path;
+		while (*p != U' ' && *p != U'\0') * q ++ = * p ++;
+		*q = U'\0';
 		arguments = p;
-		if (*arguments == ' ') arguments ++;
+		if (*arguments == U' ') arguments ++;
 	}
 	Melder_relativePathToFile (path, & file);
 	praat_executeScriptFromFile (& file, arguments);
 }
 
-void praat_executeScriptFromText (wchar_t *text) {
+void praat_executeScriptFromText (const char32 *text) {
 	try {
 		autoInterpreter interpreter = Interpreter_create (NULL, NULL);
-		Interpreter_run (interpreter.peek(), text);
+		autostring32 string = Melder_dup (text);   // copy, because Interpreter will change it (UGLY)
+		Interpreter_run (interpreter.peek(), string.peek());
 	} catch (MelderError) {
-		Melder_throw (L"Script not completed.");
+		Melder_throw (U"Script not completed.");
 	}
 }
 
-void praat_executeScriptFromDialog (Any dia) {
-	wchar_t *path = UiForm_getString (dia, L"$file");
+void praat_executeScriptFromDialog (UiForm dia) {
+	char32 *path = UiForm_getString (dia, U"$file");
 	structMelderFile file = { 0 };
 	Melder_pathToFile (path, & file);
-	autostring text = MelderFile_readText (& file);
+	autostring32 text = MelderFile_readText (& file);
 	autoMelderFileSetDefaultDir dir (& file);
 	Melder_includeIncludeFiles (& text);
 	autoInterpreter interpreter = Interpreter_createFromEnvironment (praatP.editor);
@@ -605,26 +607,24 @@ void praat_executeScriptFromDialog (Any dia) {
 	Interpreter_run (interpreter.peek(), text.peek());
 }
 
-static void secondPassThroughScript (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString_dummy, Interpreter interpreter_dummy, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
-	(void) sendingString_dummy;
-	(void) interpreter_dummy;
-	(void) invokingButtonTitle;
-	(void) modified;
-	(void) dummy;
+static void secondPassThroughScript (UiForm sendingForm, int /* narg */, Stackel /* args */,
+	const char32 * /* sendingString_dummy */, Interpreter /* interpreter_dummy */,
+	const char32 * /* invokingButtonTitle */, bool /* modified */, void *)
+{
 	praat_executeScriptFromDialog (sendingForm);
 }
 
 static void firstPassThroughScript (MelderFile file) {
 	try {
-		autostring text = MelderFile_readText (file);
+		autostring32 text = MelderFile_readText (file);
 		{// scope
 			autoMelderFileSetDefaultDir dir (file);
 			Melder_includeIncludeFiles (& text);
 		}
 		autoInterpreter interpreter = Interpreter_createFromEnvironment (praatP.editor);
-		if (Interpreter_readParameters (interpreter.peek(), text.peek()) > 0) {
-			Any form = Interpreter_createForm (interpreter.peek(),
-				praatP.editor ? ((Editor) praatP.editor) -> d_windowForm : theCurrentPraatApplication -> topShell,
+		if (Interpreter_readParameters (interpreter.get(), text.peek()) > 0) {
+			UiForm form = Interpreter_createForm (interpreter.peek(),
+				praatP.editor ? praatP.editor -> d_windowForm : theCurrentPraatApplication -> topShell,
 				Melder_fileToPath (file), secondPassThroughScript, NULL, false);
 			UiForm_destroyWhenUnmanaged (form);
 			UiForm_do (form, false);
@@ -633,31 +633,27 @@ static void firstPassThroughScript (MelderFile file) {
 			praat_executeScriptFromFile (file, NULL);
 		}
 	} catch (MelderError) {
-		Melder_throw ("Script ", file, " not completed.");
+		Melder_throw (U"Script ", file, U" not completed.");
 	}
 }
 
-static void fileSelectorOkCallback (UiForm dia, int narg, Stackel args, const wchar_t *sendingString_dummy, Interpreter interpreter_dummy, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
-	(void) sendingString_dummy;
-	(void) interpreter_dummy;
-	(void) invokingButtonTitle;
-	(void) modified;
-	(void) dummy;
+static void fileSelectorOkCallback (UiForm dia, int /* narg */, Stackel /* args */,
+	const char32 * /* sendingString_dummy */, Interpreter /* interpreter_dummy */,
+	const char32 * /* invokingButtonTitle */, bool /* modified */, void *)
+{
 	firstPassThroughScript (UiFile_getFile (dia));
 }
 
-void DO_RunTheScriptFromAnyAddedMenuCommand (UiForm sendingForm_dummy, int narg, Stackel args, const wchar_t *scriptPath, Interpreter interpreter, const wchar_t *invokingButtonTitle, bool modified, void *dummy) {
+void DO_RunTheScriptFromAnyAddedMenuCommand (UiForm /* sendingForm_dummy */, int /* narg */, Stackel /* args */,
+	const char32 *scriptPath, Interpreter /* interpreter */,
+	const char32 * /* invokingButtonTitle */, bool /* modified */, void *)
+{
 	structMelderFile file = { 0 };
-	(void) sendingForm_dummy;
-	(void) interpreter;
-	(void) invokingButtonTitle;
-	(void) modified;
-	(void) dummy;
-	Melder_relativePathToFile ((wchar_t *) scriptPath, & file);
+	Melder_relativePathToFile (scriptPath, & file);
 	firstPassThroughScript (& file);
 }
 
-void DO_RunTheScriptFromAnyAddedEditorCommand (Editor editor, const wchar_t *script) {
+void DO_RunTheScriptFromAnyAddedEditorCommand (Editor editor, const char32 *script) {
 	praatP.editor = editor;
 	DO_RunTheScriptFromAnyAddedMenuCommand (NULL, 0, NULL, script, NULL, NULL, false, NULL);
 	/*praatP.editor = NULL;*/
diff --git a/sys/praat_script.h b/sys/praat_script.h
index 6208bf6..90eb30b 100644
--- a/sys/praat_script.h
+++ b/sys/praat_script.h
@@ -2,7 +2,7 @@
 #define _praat_script_h_
 /* praat_script.h
  *
- * Copyright (C) 1992-2011,2013,2014 Paul Boersma
+ * Copyright (C) 1992-2011,2013,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,16 +21,16 @@
 
 #include "Interpreter.h"
 
-int praat_executeCommand (Interpreter me, wchar_t *command);
-void praat_executeCommandFromStandardInput (const char *programName);
-void praat_executeScriptFromFile (MelderFile file, const wchar_t *arguments);
-void praat_executeScriptFromFileName (const wchar_t *fileName, int narg, Stackel args);
-void praat_executeScriptFromFileNameWithArguments (const wchar_t *nameAndArguments);
-void praat_executeScriptFromText (wchar_t *text);
-void praat_executeScriptFromDialog (Any dia);
-void DO_praat_runScript (UiForm sendingForm, int narg, Stackel args, const wchar_t *sendingString, Interpreter interpreter_dummy, const wchar_t *invokingButtonTitle, bool modified, void *dummy);
-void DO_RunTheScriptFromAnyAddedMenuCommand (UiForm sendingForm_dummy, int narg, Stackel args, const wchar_t *scriptPath, Interpreter interpreter_dummy, const wchar_t *invokingButtonTitle, bool modified, void *dummy);
-void DO_RunTheScriptFromAnyAddedEditorCommand (Editor editor, const wchar_t *script);
+int praat_executeCommand (Interpreter me, char32 *command);
+void praat_executeCommandFromStandardInput (const char32 *programName);
+void praat_executeScriptFromFile (MelderFile file, const char32 *arguments);
+void praat_executeScriptFromFileName (const char32 *fileName, int narg, Stackel args);
+void praat_executeScriptFromFileNameWithArguments (const char32 *nameAndArguments);
+void praat_executeScriptFromText (const char32 *text);
+void praat_executeScriptFromDialog (UiForm dia);
+void DO_praat_runScript (UiForm sendingForm, int narg, Stackel args, const char32 *sendingString, Interpreter interpreter_dummy, const char32 *invokingButtonTitle, bool modified, void *dummy);
+void DO_RunTheScriptFromAnyAddedMenuCommand (UiForm sendingForm_dummy, int narg, Stackel args, const char32 *scriptPath, Interpreter interpreter_dummy, const char32 *invokingButtonTitle, bool modified, void *dummy);
+void DO_RunTheScriptFromAnyAddedEditorCommand (Editor editor, const char32 *script);
 
 /* End of file praat_script.h */
 #endif
diff --git a/sys/praat_statistics.cpp b/sys/praat_statistics.cpp
index 8a994de..6968b01 100644
--- a/sys/praat_statistics.cpp
+++ b/sys/praat_statistics.cpp
@@ -1,6 +1,6 @@
 /* praat_statistics.cpp
  *
- * Copyright (C) 1992-2012,2014 Paul Boersma
+ * Copyright (C) 1992-2012,2014,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,22 +24,22 @@
 static struct {
 	long batchSessions, interactiveSessions;
 	double memory;
-	wchar_t dateOfFirstSession [Preferences_STRING_BUFFER_SIZE];
+	char32 dateOfFirstSession [Preferences_STRING_BUFFER_SIZE];
 } statistics;
 
 void praat_statistics_prefs () {
-	Preferences_addLong (L"PraatShell.batchSessions", & statistics.batchSessions, 0);
-	Preferences_addLong (L"PraatShell.interactiveSessions", & statistics.interactiveSessions, 0);
-	Preferences_addDouble (L"PraatShell.memory", & statistics.memory, 0.0);
-	Preferences_addString (L"PraatShell.dateOfFirstSession", & statistics.dateOfFirstSession [0], L"");
+	Preferences_addLong (U"PraatShell.batchSessions", & statistics.batchSessions, 0);
+	Preferences_addLong (U"PraatShell.interactiveSessions", & statistics.interactiveSessions, 0);
+	Preferences_addDouble (U"PraatShell.memory", & statistics.memory, 0.0);
+	Preferences_addString (U"PraatShell.dateOfFirstSession", & statistics.dateOfFirstSession [0], U"");
 }
 
 void praat_statistics_prefsChanged () {
 	if (! statistics.dateOfFirstSession [0]) {
 		time_t today = time (NULL);
-		wchar_t *newLine;
-		wcscpy (statistics.dateOfFirstSession, Melder_peekUtf8ToWcs (ctime (& today)));
-		newLine = wcschr (statistics.dateOfFirstSession, '\n');
+		char32 *newLine;
+		str32cpy (statistics.dateOfFirstSession, Melder_peek8to32 (ctime (& today)));
+		newLine = str32chr (statistics.dateOfFirstSession, '\n');
 		if (newLine) *newLine = '\0';
 	}
 	if (theCurrentPraatApplication -> batch)
@@ -54,58 +54,94 @@ void praat_statistics_exit () {
 
 void praat_reportIntegerProperties () {
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Integer properties of this edition of Praat on this computer:\n");
-	MelderInfo_writeLine (L"A \"short integer\" is ",      Melder_integer (sizeof (short)       * 8), L" bits.");
-	MelderInfo_writeLine (L"An \"integer\" is ",           Melder_integer (sizeof (int)         * 8), L" bits.");
-	MelderInfo_writeLine (L"A \"long integer\" is ",       Melder_integer (sizeof (long)        * 8), L" bits.");
-	MelderInfo_writeLine (L"A \"long long integer\" is ",  Melder_integer (sizeof (long long)   * 8), L" bits.");
-	MelderInfo_writeLine (L"A pointer is ",                Melder_integer (sizeof (void *)      * 8), L" bits.");
-	MelderInfo_writeLine (L"A memory object size is ",     Melder_integer (sizeof (size_t)      * 8), L" bits.");
-	MelderInfo_writeLine (L"A file offset is ",            Melder_integer (sizeof (off_t)       * 8), L" bits.");
+	MelderInfo_writeLine (U"Integer properties of this edition of Praat on this computer:\n");
+	MelderInfo_writeLine (U"A \"short integer\" is ",      sizeof (short)       * 8, U" bits.");
+	MelderInfo_writeLine (U"An \"integer\" is ",           sizeof (int)         * 8, U" bits.");
+	MelderInfo_writeLine (U"A \"long integer\" is ",       sizeof (long)        * 8, U" bits.");
+	MelderInfo_writeLine (U"A \"long long integer\" is ",  sizeof (long long)   * 8, U" bits.");
+	MelderInfo_writeLine (U"A pointer is ",                sizeof (void *)      * 8, U" bits.");
+	MelderInfo_writeLine (U"A memory object size is ",     sizeof (size_t)      * 8, U" bits.");
+	MelderInfo_writeLine (U"A file offset is ",            sizeof (off_t)       * 8, U" bits.");
 	MelderInfo_close ();
 }
 
 void praat_reportTextProperties () {
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Text properties of this edition of Praat on this computer:\n");
-	MelderInfo_writeLine (L"Locale: ", Melder_peekUtf8ToWcs (setlocale (LC_ALL, NULL)));
+	MelderInfo_writeLine (U"Text properties of this edition of Praat on this computer:\n");
+	MelderInfo_writeLine (U"Locale: ", Melder_peek8to32 (setlocale (LC_ALL, NULL)));
+	MelderInfo_writeLine (U"A \"char\" is ",                                      8, U" bits.");
+	MelderInfo_writeLine (U"A \"char16_t\" is ",           sizeof (char16_t)    * 8, U" bits.");
+	MelderInfo_writeLine (U"A \"wchar_t\" is ",            sizeof (wchar_t)     * 8, U" bits.");
+	MelderInfo_writeLine (U"A \"char32_t\" is ",           sizeof (char32_t)    * 8, U" bits.");
+	MelderInfo_close ();
+}
+
+void praat_reportSystemProperties () {
+	#define xstr(s) str(s)
+	#define str(s) #s
+	MelderInfo_open ();
+	MelderInfo_writeLine (U"System properties of this edition of Praat on this computer:\n");
+	#ifdef _WIN32
+		MelderInfo_writeLine (U"_WIN32 is \"" xstr (_WIN32) "\".");
+	#endif
+	#ifdef WINVER
+		MelderInfo_writeLine (U"WINVER is \"" xstr (WINVER) "\".");
+	#endif
+	#ifdef _WIN32_WINNT
+		MelderInfo_writeLine (U"_WIN32_WINNT is \"" xstr (_WIN32_WINNT) "\".");
+	#endif
+	#ifdef _WIN32_IE
+		MelderInfo_writeLine (U"_WIN32_IE is \"" xstr (_WIN32_IE) "\".");
+	#endif
+	#ifdef UNICODE
+		MelderInfo_writeLine (U"UNICODE is \"" xstr (UNICODE) "\".");
+	#endif
+	#ifdef _FILE_OFFSET_BITS
+		MelderInfo_writeLine (U"_FILE_OFFSET_BITS is \"" xstr (_FILE_OFFSET_BITS) "\".");
+	#endif
+	#ifdef macintosh
+		MelderInfo_writeLine (U"macintosh is \"" xstr (macintosh) "\".");
+	#endif
+	#ifdef linux
+		MelderInfo_writeLine (U"linux is \"" xstr (linux) "\".");
+	#endif
 	MelderInfo_close ();
 }
 
 void praat_reportGraphicalProperties () {
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Graphical properties of this edition of Praat on this computer:\n");
+	MelderInfo_writeLine (U"Graphical properties of this edition of Praat on this computer:\n");
 	double x, y, width, height;
 	Gui_getWindowPositioningBounds (& x, & y, & width, & height);
-	MelderInfo_writeLine (L"Window positioning area: x = ", Melder_double (x), L", y = ", Melder_double (y),
-		L", width = ", Melder_double (width), L", height = ", Melder_double (height));
+	MelderInfo_writeLine (U"Window positioning area: x = ", x, U", y = ", y,
+		U", width = ", width, U", height = ", height);
 	#if defined (macintosh)
 		CGDirectDisplayID screen = CGMainDisplayID ();
 		CGSize screenSize_mm = CGDisplayScreenSize (screen);
 		double diagonal_mm = sqrt (screenSize_mm. width * screenSize_mm. width + screenSize_mm. height * screenSize_mm. height);
 		double diagonal_inch = diagonal_mm / 25.4;
-		MelderInfo_writeLine (L"\nScreen size: ", Melder_double (screenSize_mm. width), L" x ", Melder_double (screenSize_mm. height),
-			L" mm (diagonal ", Melder_fixed (diagonal_mm, 1), L" mm = ", Melder_fixed (diagonal_inch, 1), L" inch)");
+		MelderInfo_writeLine (U"\nScreen size: ", screenSize_mm. width, U" x ", screenSize_mm. height,
+			U" mm (diagonal ", Melder_fixed (diagonal_mm, 1), U" mm = ", Melder_fixed (diagonal_inch, 1), U" inch)");
 		size_t screenWidth_pixels = CGDisplayPixelsWide (screen);
 		size_t screenHeight_pixels = CGDisplayPixelsHigh (screen);
-		MelderInfo_writeLine (L"Screen \"resolution\": ", Melder_integer (screenWidth_pixels), L" x ", Melder_integer (screenHeight_pixels), L" pixels");
+		MelderInfo_writeLine (U"Screen \"resolution\": ", screenWidth_pixels, U" x ", screenHeight_pixels, U" pixels");
 		double resolution = 25.4 * screenWidth_pixels / screenSize_mm. width;
-		MelderInfo_writeLine (L"Screen resolution: ", Melder_fixed (resolution, 1), L" pixels/inch");
+		MelderInfo_writeLine (U"Screen resolution: ", Melder_fixed (resolution, 1), U" pixels/inch");
 	#elif defined (_WIN32)
 		/*for (int i = 0; i <= 88; i ++)
-			MelderInfo_writeLine (L"System metric ", Melder_integer (i), L": ", Melder_integer (GetSystemMetrics (i)));*/
+			MelderInfo_writeLine (U"System metric ", i, U": ", GetSystemMetrics (i));*/
 	#endif
 	MelderInfo_close ();
 }
 
 void praat_reportMemoryUse () {
 	MelderInfo_open ();
-	MelderInfo_writeLine (L"Memory use by Praat:\n");
-	MelderInfo_writeLine (L"Currently in use:\n"
-		L"   Strings: ", Melder_integer (MelderString_allocationCount () - MelderString_deallocationCount ()));
-	MelderInfo_writeLine (L"   Arrays: ", Melder_integer (NUM_getTotalNumberOfArrays ()));
-	MelderInfo_writeLine (L"   Things: ", Melder_integer (Thing_getTotalNumberOfThings ()),
-		L" (objects in list: ", Melder_integer (theCurrentPraatObjects -> n), L")");
+	MelderInfo_writeLine (U"Memory use by Praat:\n");
+	MelderInfo_writeLine (U"Currently in use:\n"
+		U"   Strings: ", MelderString_allocationCount () - MelderString_deallocationCount ());
+	MelderInfo_writeLine (U"   Arrays: ", NUM_getTotalNumberOfArrays ());
+	MelderInfo_writeLine (U"   Things: ", Thing_getTotalNumberOfThings (),
+		U" (objects in list: ", theCurrentPraatObjects -> n, U")");
 	long numberOfMotifWidgets =
 		#if motif && (defined (_WIN32) || defined (macintosh))
 			Gui_getNumberOfMotifWidgets ();
@@ -113,29 +149,29 @@ void praat_reportMemoryUse () {
 			0;
 		#endif
 	if (numberOfMotifWidgets > 0) {
-		MelderInfo_writeLine (L"   Motif widgets: ", Melder_integer (numberOfMotifWidgets));
+		MelderInfo_writeLine (U"   Motif widgets: ", numberOfMotifWidgets);
 	}
-	MelderInfo_writeLine (L"   Other: ",
+	MelderInfo_writeLine (U"   Other: ",
 		Melder_bigInteger (Melder_allocationCount () - Melder_deallocationCount ()
 			- Thing_getTotalNumberOfThings () - NUM_getTotalNumberOfArrays ()
 			- (MelderString_allocationCount () - MelderString_deallocationCount ())
 			- numberOfMotifWidgets));
 	MelderInfo_writeLine (
-		L"\nMemory history of this session:\n"
-		L"   Total created: ", Melder_bigInteger (Melder_allocationCount ()), L" (", Melder_bigInteger (Melder_allocationSize ()), L" bytes)");
-	MelderInfo_writeLine (L"   Total deleted: ", Melder_bigInteger (Melder_deallocationCount ()));
-	MelderInfo_writeLine (L"   Reallocations: ", Melder_bigInteger (Melder_movingReallocationsCount ()), L" moving, ",
-		Melder_bigInteger (Melder_reallocationsInSituCount ()), L" in situ");
+		U"\nMemory history of this session:\n"
+		U"   Total created: ", Melder_bigInteger (Melder_allocationCount ()), U" (", Melder_bigInteger (Melder_allocationSize ()), U" bytes)");
+	MelderInfo_writeLine (U"   Total deleted: ", Melder_bigInteger (Melder_deallocationCount ()));
+	MelderInfo_writeLine (U"   Reallocations: ", Melder_bigInteger (Melder_movingReallocationsCount ()), U" moving, ",
+		Melder_bigInteger (Melder_reallocationsInSituCount ()), U" in situ");
 	MelderInfo_writeLine (
-		L"   Strings created: ", Melder_bigInteger (MelderString_allocationCount ()), L" (", Melder_bigInteger (MelderString_allocationSize ()), L" bytes)");
+		U"   Strings created: ", Melder_bigInteger (MelderString_allocationCount ()), U" (", Melder_bigInteger (MelderString_allocationSize ()), U" bytes)");
 	MelderInfo_writeLine (
-		L"   Strings deleted: ", Melder_bigInteger (MelderString_deallocationCount ()), L" (", Melder_bigInteger (MelderString_deallocationSize ()), L" bytes)");
-	MelderInfo_writeLine (L"\nHistory of all sessions from ", statistics.dateOfFirstSession, L" until today:");
-	MelderInfo_writeLine (L"   Sessions: ", Melder_integer (statistics.interactiveSessions), L" interactive, ",
-		Melder_integer (statistics.batchSessions), L" batch");
-	MelderInfo_writeLine (L"   Total memory use: ", Melder_bigInteger (statistics.memory + Melder_allocationSize ()), L" bytes");
-	MelderInfo_writeLine (L"\nNumber of fixed menu commands: ", Melder_integer (praat_getNumberOfMenuCommands ()));
-	MelderInfo_writeLine (L"Number of dynamic menu commands: ", Melder_integer (praat_getNumberOfActions ()));
+		U"   Strings deleted: ", Melder_bigInteger (MelderString_deallocationCount ()), U" (", Melder_bigInteger (MelderString_deallocationSize ()), U" bytes)");
+	MelderInfo_writeLine (U"\nHistory of all sessions from ", statistics.dateOfFirstSession, U" until today:");
+	MelderInfo_writeLine (U"   Sessions: ", statistics.interactiveSessions, U" interactive, ",
+		statistics.batchSessions, U" batch");
+	MelderInfo_writeLine (U"   Total memory use: ", Melder_bigInteger ((int64) statistics.memory + Melder_allocationSize ()), U" bytes");
+	MelderInfo_writeLine (U"\nNumber of fixed menu commands: ", praat_getNumberOfMenuCommands ());
+	MelderInfo_writeLine (U"Number of dynamic menu commands: ", praat_getNumberOfActions ());
 	MelderInfo_close ();
 }
 
diff --git a/sys/praat_version.h b/sys/praat_version.h
index a62aacc..b8cb4d8 100644
--- a/sys/praat_version.h
+++ b/sys/praat_version.h
@@ -1,5 +1,5 @@
-#define PRAAT_VERSION_STR 5.4.06
-#define PRAAT_VERSION_NUM 5406
+#define PRAAT_VERSION_STR 6.0
+#define PRAAT_VERSION_NUM 6000
 #define PRAAT_YEAR 2015
-#define PRAAT_MONTH February
-#define PRAAT_DAY 21
+#define PRAAT_MONTH October
+#define PRAAT_DAY 28
diff --git a/sys/prefs.h b/sys/prefs.h
index 5b30c74..fec260c 100644
--- a/sys/prefs.h
+++ b/sys/prefs.h
@@ -2,7 +2,7 @@
 #define _prefs_h_
 /* prefs.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,37 +23,55 @@
 
 #define prefs_begin(Klas) \
 	public: static void f_preferences (); \
-	virtual void v_copyPreferencesToInstance ();
+	void v_copyPreferencesToInstance () override;
 
 #define prefs_add_int(Klas,name,version,default) \
 	private: static int s_##name; public: virtual int & pref_##name () { return s_##name; } \
-	private: static const wchar_t * sdefault_##name; public: virtual const wchar_t * default_##name () { return sdefault_##name; }
+	private: static const char32 * sdefault_##name; public: virtual const char32 * default_##name () { return sdefault_##name; }
 #define prefs_add_int_with_data(Klas,name,version,default)  public: int p_##name; prefs_add_int (Klas, name, version, default)
+#define prefs_override_int(Klas,name,version,default) \
+	private: static int s_##name; public: int & pref_##name () override { return s_##name; } \
+	private: static const char32 * sdefault_##name; public: const char32 * default_##name () override { return sdefault_##name; }
 
 #define prefs_add_long(Klas,name,version,default) \
 	private: static long s_##name; public: virtual long & pref_##name () { return s_##name; } \
-	private: static const wchar_t * sdefault_##name; public: virtual const wchar_t * default_##name () { return sdefault_##name; }
+	private: static const char32 * sdefault_##name; public: virtual const char32 * default_##name () { return sdefault_##name; }
 #define prefs_add_long_with_data(Klas,name,version,default)  public: long p_##name; prefs_add_long (Klas, name, version, default)
+#define prefs_override_long(Klas,name,version,default) \
+	private: static long s_##name; public: long & pref_##name () override { return s_##name; } \
+	private: static const char32 * sdefault_##name; public: const char32 * default_##name () override { return sdefault_##name; }
 
 #define prefs_add_bool(Klas,name,version,default) \
 	private: static bool s_##name; public: virtual bool & pref_##name () { return s_##name; } \
 	private: static bool sdefault_##name; public: virtual bool default_##name () { return sdefault_##name; }
 #define prefs_add_bool_with_data(Klas,name,version,default)  public: bool p_##name; prefs_add_bool (Klas, name, version, default)
+#define prefs_override_bool(Klas,name,version,default) \
+	private: static bool s_##name; public: bool & pref_##name () override { return s_##name; } \
+	private: static bool sdefault_##name; public: bool default_##name () override { return sdefault_##name; }
 
 #define prefs_add_double(Klas,name,version,default) \
 	private: static double s_##name; public: virtual double & pref_##name () { return s_##name; } \
-	private: static const wchar_t * sdefault_##name; public: virtual const wchar_t * default_##name () { return sdefault_##name; }
+	private: static const char32 * sdefault_##name; public: virtual const char32 * default_##name () { return sdefault_##name; }
 #define prefs_add_double_with_data(Klas,name,version,default)  public: double p_##name; prefs_add_double (Klas, name, version, default)
+#define prefs_override_double(Klas,name,version,default) \
+	private: static double s_##name; public: double & pref_##name () override { return s_##name; } \
+	private: static const char32 * sdefault_##name; public: const char32 * default_##name () override { return sdefault_##name; }
 
 #define prefs_add_enum(Klas,name,version,enumerated,default) \
 	private: static enum enumerated s_##name; public: virtual enum enumerated & pref_##name () { return s_##name; } \
 	private: static enum enumerated sdefault_##name; public: virtual enum enumerated default_##name () { return sdefault_##name; }
 #define prefs_add_enum_with_data(Klas,name,version,enumerated,default)  public: enumerated p_##name; prefs_add_enum (Klas, name, version, enumerated, default)
+#define prefs_override_enum(Klas,name,version,enumerated,default) \
+	private: static enum enumerated s_##name; public: enum enumerated & pref_##name () override { return s_##name; } \
+	private: static enum enumerated sdefault_##name; public: enum enumerated default_##name () override { return sdefault_##name; }
 
 #define prefs_add_string(Klas,name,version,default) \
-	private: static wchar_t s_##name [Preferences_STRING_BUFFER_SIZE]; public: virtual wchar_t * pref_##name () { return & s_##name [0]; } \
-	private: static const wchar_t * sdefault_##name; public: virtual const wchar_t * default_##name () { return sdefault_##name; }
-#define prefs_add_string_with_data(Klas,name,version,default)  public: wchar_t p_##name [Preferences_STRING_BUFFER_SIZE]; prefs_add_string (Klas, name, version, default)
+	private: static char32 s_##name [Preferences_STRING_BUFFER_SIZE]; public: virtual char32 * pref_##name () { return & s_##name [0]; } \
+	private: static const char32 * sdefault_##name; public: virtual const char32 * default_##name () { return sdefault_##name; }
+#define prefs_add_string_with_data(Klas,name,version,default)  public: char32 p_##name [Preferences_STRING_BUFFER_SIZE]; prefs_add_string (Klas, name, version, default)
+#define prefs_override_string(Klas,name,version,default) \
+	private: static char32 s_##name [Preferences_STRING_BUFFER_SIZE]; public: char32 * pref_##name () override { return & s_##name [0]; } \
+	private: static const char32 * sdefault_##name; public: const char32 * default_##name () override{ return sdefault_##name; }
 
 #define prefs_end(Klas)
 
diff --git a/sys/prefs_copyToInstance.h b/sys/prefs_copyToInstance.h
index cb3bc8d..3d29518 100644
--- a/sys/prefs_copyToInstance.h
+++ b/sys/prefs_copyToInstance.h
@@ -1,6 +1,6 @@
 /* prefs_copyToInstance.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,16 +22,22 @@
 #undef prefs_begin
 #undef prefs_add_int
 #undef prefs_add_int_with_data
+#undef prefs_override_int
 #undef prefs_add_long
 #undef prefs_add_long_with_data
+#undef prefs_override_long
 #undef prefs_add_bool
 #undef prefs_add_bool_with_data
+#undef prefs_override_bool
 #undef prefs_add_double
 #undef prefs_add_double_with_data
+#undef prefs_override_double
 #undef prefs_add_enum
 #undef prefs_add_enum_with_data
+#undef prefs_override_enum
 #undef prefs_add_string
 #undef prefs_add_string_with_data
+#undef prefs_override_string
 #undef prefs_end
 
 #define prefs_begin(Klas) \
@@ -40,21 +46,27 @@
 
 #define prefs_add_int(Klas,name,version,default)
 #define prefs_add_int_with_data(Klas,name,version,default)  p_##name = pref_##name ();
+#define prefs_override_int(Klas,name,version,default)
 
 #define prefs_add_long(Klas,name,version,default)
 #define prefs_add_long_with_data(Klas,name,version,default)  p_##name = pref_##name ();
+#define prefs_override_long(Klas,name,version,default)
 
 #define prefs_add_bool(Klas,name,version,default)
 #define prefs_add_bool_with_data(Klas,name,version,default)  p_##name = pref_##name ();
+#define prefs_override_bool(Klas,name,version,default)
 
 #define prefs_add_double(Klas,name,version,default)
 #define prefs_add_double_with_data(Klas,name,version,default)  p_##name = pref_##name ();
+#define prefs_override_double(Klas,name,version,default)
 
 #define prefs_add_enum(Klas,name,version,enumerated,default)
 #define prefs_add_enum_with_data(Klas,name,version,enumerated,default)  p_##name = pref_##name ();
+#define prefs_override_enum(Klas,name,version,enumerated,default)
 
 #define prefs_add_string(Klas,name,version,default)
-#define prefs_add_string_with_data(Klas,name,version,default)  wcscpy (& p_##name [0], pref_##name ());
+#define prefs_add_string_with_data(Klas,name,version,default)  str32cpy (& p_##name [0], pref_##name ());
+#define prefs_override_string(Klas,name,version,default)
 
 #define prefs_end(Klas) \
 	}
diff --git a/sys/prefs_define.h b/sys/prefs_define.h
index c8954fa..27ae724 100644
--- a/sys/prefs_define.h
+++ b/sys/prefs_define.h
@@ -1,6 +1,6 @@
 /* prefs_define.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,50 +22,74 @@
 #undef prefs_begin
 #undef prefs_add_int
 #undef prefs_add_int_with_data
+#undef prefs_override_int
 #undef prefs_add_long
 #undef prefs_add_long_with_data
+#undef prefs_override_long
 #undef prefs_add_bool
 #undef prefs_add_bool_with_data
+#undef prefs_override_bool
 #undef prefs_add_double
 #undef prefs_add_double_with_data
+#undef prefs_override_double
 #undef prefs_add_enum
 #undef prefs_add_enum_with_data
+#undef prefs_override_enum
 #undef prefs_add_string
 #undef prefs_add_string_with_data
+#undef prefs_override_string
 #undef prefs_end
 
 #define prefs_begin(Klas)
 
 #define prefs_add_int(Klas,name,version,default) \
 	int struct##Klas :: s_##name; \
-	const wchar_t * struct##Klas :: sdefault_##name = default;
+	const char32 * struct##Klas :: sdefault_##name = default;
 #define prefs_add_int_with_data(Klas,name,version,default)  prefs_add_int (Klas, name, version, default)
+#define prefs_override_int(Klas,name,version,default) \
+	int struct##Klas :: s_##name; \
+	const char32 * struct##Klas :: sdefault_##name = default;
 
 #define prefs_add_long(Klas,name,version,default) \
 	long struct##Klas :: s_##name; \
-	const wchar_t * struct##Klas :: sdefault_##name = default;
+	const char32 * struct##Klas :: sdefault_##name = default;
 #define prefs_add_long_with_data(Klas,name,version,default)  prefs_add_long (Klas, name, version, default)
+#define prefs_override_long(Klas,name,version,default) \
+	long struct##Klas :: s_##name; \
+	const char32 * struct##Klas :: sdefault_##name = default;
 
 #define prefs_add_bool(Klas,name,version,default) \
 	bool struct##Klas :: s_##name; \
 	bool struct##Klas :: sdefault_##name = default;
 #define prefs_add_bool_with_data(Klas,name,version,default)  prefs_add_bool (Klas, name, version, default)
+#define prefs_override_bool(Klas,name,version,default) \
+	bool struct##Klas :: s_##name; \
+	bool struct##Klas :: sdefault_##name = default;
 
 #define prefs_add_double(Klas,name,version,default) \
 	double struct##Klas :: s_##name; \
-	const wchar_t * struct##Klas :: sdefault_##name = default;
+	const char32 * struct##Klas :: sdefault_##name = default;
 #define prefs_add_double_with_data(Klas,name,version,default)  prefs_add_double (Klas, name, version, default)
+#define prefs_override_double(Klas,name,version,default) \
+	double struct##Klas :: s_##name; \
+	const char32 * struct##Klas :: sdefault_##name = default;
 
 #define prefs_add_enum(Klas,name,version,enumerated,default) \
 	enum enumerated struct##Klas :: s_##name; \
 	enum enumerated struct##Klas :: sdefault_##name = enumerated##_##default;
 #define prefs_add_enum_with_data(Klas,name,version,enumerated,default)  prefs_add_enum (Klas, name, version, enumerated, default)
-
-#define prefs_end(Klas)
+#define prefs_override_enum(Klas,name,version,enumerated,default) \
+	enum enumerated struct##Klas :: s_##name; \
+	enum enumerated struct##Klas :: sdefault_##name = enumerated##_##default;
 
 #define prefs_add_string(Klas,name,version,default) \
-	wchar_t struct##Klas :: s_##name [Preferences_STRING_BUFFER_SIZE]; \
-	const wchar_t * struct##Klas :: sdefault_##name = default;
+	char32 struct##Klas :: s_##name [Preferences_STRING_BUFFER_SIZE]; \
+	const char32 * struct##Klas :: sdefault_##name = default;
 #define prefs_add_string_with_data(Klas,name,version,default)  prefs_add_string (Klas, name, version, default)
+#define prefs_override_string(Klas,name,version,default) \
+	char32 struct##Klas :: s_##name [Preferences_STRING_BUFFER_SIZE]; \
+	const char32 * struct##Klas :: sdefault_##name = default;
+
+#define prefs_end(Klas)
 
 /* End of file prefs_define.h */
diff --git a/sys/prefs_install.h b/sys/prefs_install.h
index dd43dd3..6bee05d 100644
--- a/sys/prefs_install.h
+++ b/sys/prefs_install.h
@@ -1,6 +1,6 @@
 /* prefs_install.h
  *
- * Copyright (C) 2013 Paul Boersma
+ * Copyright (C) 2013,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,44 +22,62 @@
 #undef prefs_begin
 #undef prefs_add_int
 #undef prefs_add_int_with_data
+#undef prefs_override_int
 #undef prefs_add_long
 #undef prefs_add_long_with_data
+#undef prefs_override_long
 #undef prefs_add_bool
 #undef prefs_add_bool_with_data
+#undef prefs_override_bool
 #undef prefs_add_double
 #undef prefs_add_double_with_data
+#undef prefs_override_double
 #undef prefs_add_enum
 #undef prefs_add_enum_with_data
+#undef prefs_override_enum
 #undef prefs_add_string
 #undef prefs_add_string_with_data
+#undef prefs_override_string
 #undef prefs_end
 
 #define prefs_begin(Klas) \
 	void struct##Klas :: f_preferences () {
 
 #define prefs_add_int(Klas,name,version,default) \
-	Preferences_addInt (Melder_wcscat (L"" #Klas "." #name, version >= 2 ? L"." #version : L""), & s_##name, Melder_atof (sdefault_##name));
+	Preferences_addInt (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name, Melder_atoi (sdefault_##name));
 #define prefs_add_int_with_data(Klas,name,version,default)  prefs_add_int (Klas, name, version, default)
+#define prefs_override_int(Klas,name,version,default) \
+	Preferences_addInt (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name, Melder_atoi (sdefault_##name));
 
 #define prefs_add_long(Klas,name,version,default) \
-	Preferences_addLong (Melder_wcscat (L"" #Klas "." #name, version >= 2 ? L"." #version : L""), & s_##name, Melder_atof (sdefault_##name));
+	Preferences_addLong (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name, Melder_atoi (sdefault_##name));
 #define prefs_add_long_with_data(Klas,name,version,default)  prefs_add_long (Klas, name, version, default)
+#define prefs_override_long(Klas,name,version,default) \
+	Preferences_addLong (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name, Melder_atoi (sdefault_##name));
 
 #define prefs_add_bool(Klas,name,version,default) \
-	Preferences_addBool (Melder_wcscat (L"" #Klas "." #name, version >= 2 ? L"." #version : L""), & s_##name, default);
+	Preferences_addBool (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name, default);
 #define prefs_add_bool_with_data(Klas,name,version,default)  prefs_add_bool (Klas, name, version, default)
+#define prefs_override_bool(Klas,name,version,default) \
+	Preferences_addBool (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name, default);
 
 #define prefs_add_double(Klas,name,version,default) \
-	Preferences_addDouble (Melder_wcscat (L"" #Klas "." #name, version >= 2 ? L"." #version : L""), & s_##name, Melder_atof (sdefault_##name));
+	Preferences_addDouble (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name, Melder_atof (sdefault_##name));
 #define prefs_add_double_with_data(Klas,name,version,default)  prefs_add_double (Klas, name, version, default)
+#define prefs_override_double(Klas,name,version,default) \
+	Preferences_addDouble (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name, Melder_atof (sdefault_##name));
 
 #define prefs_add_enum(Klas,name,version,enumerated,default) \
-	Preferences_addEnum (Melder_wcscat (L"" #Klas "." #name, version >= 2 ? L"." #version : L""), & s_##name, enumerated, enumerated##_##default);
+	Preferences_addEnum (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name, enumerated, enumerated##_##default);
 #define prefs_add_enum_with_data(Klas,name,version,enumerated,default)  prefs_add_enum (Klas, name, version, enumerated, default)
+#define prefs_override_enum(Klas,name,version,enumerated,default) \
+	Preferences_addEnum (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name, enumerated, enumerated##_##default);
 
 #define prefs_add_string(Klas,name,version,default) \
-	Preferences_addString (Melder_wcscat (L"" #Klas "." #name, version >= 2 ? L"." #version : L""), & s_##name [0], default);
+	Preferences_addString (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name [0], default);
 #define prefs_add_string_with_data(Klas,name,version,default)  prefs_add_string (Klas, name, version, default)
+#define prefs_override_string(Klas,name,version,default) \
+	Preferences_addString (Melder_cat (U"" #Klas U"." #name, version >= 2 ? U"." #version : U""), & s_##name [0], default);
 
 #define prefs_end(Klas) \
 	}
diff --git a/sys/sendpraat.c b/sys/sendpraat.c
index c389a8d..65d724d 100644
--- a/sys/sendpraat.c
+++ b/sys/sendpraat.c
@@ -1,6 +1,6 @@
 /* sendpraat.c */
 /* by Paul Boersma */
-/* 12 April 2014 */
+/* 1 June 2015 */
 
 /*
  * The sendpraat subroutine (Unix with GTK; Windows; Macintosh) sends a message
@@ -110,7 +110,7 @@ char *sendpraat (void *display, const char *programName, long timeOut, const cha
 	#elif mac
 		AEDesc programDescriptor;
 		AppleEvent event, reply;
-		OSErr err;
+		OSStatus err;
 		UInt32 signature;
 		(void) display;
 	#endif
@@ -134,7 +134,7 @@ char *sendpraat (void *display, const char *programName, long timeOut, const cha
 	 * If the text is going to be sent in a file, create its name.
 	 * The file is going to be written into the preferences directory of the receiving program.
 	 * On Unix, the name will be something like /home/jane/.praat-dir/message.
-	 * On Windows, the name will be something like C:\Documents and Settings\Jane\Praat\Message.txt,
+	 * On Windows, the name will be something like C:\Users\Jane\Praat\Message.txt,
 	 * or C:\Windows\Praat\Message.txt on older systems.
 	 * On Macintosh, the text is NOT going to be sent in a file.
 	 */
@@ -264,7 +264,7 @@ char *sendpraat (void *display, const char *programName, long timeOut, const cha
 		if (timeOut) {
 			signal (SIGALRM, handleTimeOut);
 			alarm (timeOut);
-			theTimeOut = timeOut;   /* Hand an argument to handleTimeOut () in a static variable. */
+			theTimeOut = timeOut;   // hand an argument to handleTimeOut () in a static variable
 			errorMessage [0] = '\0';
 			pause ();
 			if (errorMessage [0] != '\0') return errorMessage;
@@ -274,7 +274,7 @@ char *sendpraat (void *display, const char *programName, long timeOut, const cha
 		 * Notify the running program by sending a WM_USER message to its main window.
 		 */
 		if (SendMessage (window, WM_USER, 0, 0)) {
-			sprintf (errorMessage, "Program %s returns error.", programName);   /* BUG? */
+			sprintf (errorMessage, "Program %s returns error.", programName);   // BUG?
 			return errorMessage;
 		}
 	#elif mac
@@ -313,6 +313,7 @@ char *sendpraat (void *display, const char *programName, long timeOut, const cha
 	return errorMessage [0] == '\0' ? NULL : errorMessage;
 }
 
+#ifndef __CYGWIN__
 wchar_t *sendpraatW (void *display, const wchar_t *programName, long timeOut, const wchar_t *text) {
 	wchar_t nativeProgramName [100];
 	#if gtk
@@ -327,7 +328,7 @@ wchar_t *sendpraatW (void *display, const wchar_t *programName, long timeOut, co
 	#elif mac
 		AEDesc programDescriptor;
 		AppleEvent event, reply;
-		OSErr err;
+		OSStatus err;
 		UInt32 signature;
 		(void) display;
 	#endif
@@ -351,7 +352,7 @@ wchar_t *sendpraatW (void *display, const wchar_t *programName, long timeOut, co
 	 * If the text is going to be sent in a file, create its name.
 	 * The file is going to be written into the preferences directory of the receiving program.
 	 * On Unix, the name will be something like /home/jane/.praat-dir/message.
-	 * On Windows, the name will be something like C:\Documents and Settings\Jane\Praat\Message.txt,
+	 * On Windows, the name will be something like C:\Users\Jane\Praat\Message.txt,
 	 * or C:\Windows\Praat\Message.txt on older systems.
 	 * On Macintosh, the text is NOT going to be sent in a file.
 	 */
@@ -501,9 +502,9 @@ wchar_t *sendpraatW (void *display, const wchar_t *programName, long timeOut, co
 		}
 	#elif mac
 		/*
-		 * Notify the running program by sending it an Apple event of the magic class 758934755.
+		 * Notify the running program by sending it an Apple event of the magic class 758934756.
 		 */
-		AECreateAppleEvent (758934755, 0, & programDescriptor, kAutoGenerateReturnID, 1, & event);
+		AECreateAppleEvent (758934756, 0, & programDescriptor, kAutoGenerateReturnID, 1, & event);
 		AEPutParamPtr (& event, 1, typeUnicodeText, text, wcslen (text) + 1);
 		#ifdef __MACH__
 			err = AESendMessage (& event, & reply,
@@ -534,6 +535,7 @@ wchar_t *sendpraatW (void *display, const wchar_t *programName, long timeOut, co
 	 */
 	return errorMessageW [0] == '\0' ? NULL : errorMessageW;
 }
+#endif
 
 /*
  * To compile sendpraat as a stand-alone program, use the -DSTAND_ALONE option to the C compiler:
diff --git a/sys/sendsocket.c b/sys/sendsocket.c
index 8bcc649..fcd922e 100644
--- a/sys/sendsocket.c
+++ b/sys/sendsocket.c
@@ -62,17 +62,17 @@ char * sendsocket (const char *hostNameAndPort, const char *command) {
 	port = atoi (colon + 1);
 {
 	struct hostent *host;
-	struct sockaddr_in his_addr;   /* Address of remote host. */
+	struct sockaddr_in his_addr;   // address of remote host
 	int stat, sokket = -1;
 	long bytesSent;
-	result [0] = '\0';   /* No error yet. */
+	result [0] = '\0';   // no error yet
 
 	#ifdef _WIN32
 	{
 		static int initialized;
 		if (! initialized) {
 			WSADATA wsaData;
-			WORD requestedWinsockVersion = MAKEWORD (1,1);   /* Require version 1.1. */
+			WORD requestedWinsockVersion = MAKEWORD (1,1);   // require version 1.1
 			if (WSAStartup (requestedWinsockVersion, & wsaData)) {
 				return "Cannot send to socket because the socket library (WINSOCK.DLL) is not available, "
 					"too old, or otherwise unusable.";
@@ -110,7 +110,7 @@ char * sendsocket (const char *hostNameAndPort, const char *command) {
 	}
 
 	/*
-		Melder_casual ("Connected to port %d on host %s.", ntohs (his_addr. sin_port), inet_ntoa (his_addr. sin_addr));
+		Melder_casual (U"Connected to port ", ntohs (his_addr. sin_port), U" on host ", Melder_peek8to32 (inet_ntoa (his_addr. sin_addr)), U".");
 	*/
    
 	bytesSent = send (sokket, command, strlen (command) + 1, 0);   /* Include null byte. */
@@ -119,7 +119,7 @@ char * sendsocket (const char *hostNameAndPort, const char *command) {
 		goto end;
 	}
 	/*
-		Melder_casual ("sendsocket: %d bytes written.", bytesSent);
+		Melder_casual (U"sendsocket: ", bytesSent, U" bytes written.");
 	*/
 end:
 	if (sokket >= 0) {
diff --git a/sys/site.cpp b/sys/site.cpp
index fe89274..0b6c2c5 100644
--- a/sys/site.cpp
+++ b/sys/site.cpp
@@ -1,6 +1,6 @@
 /* site.cpp
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
  * pb 2002/03/07 GPL
  * pb 2004/10/21 simplified print command
  * pb 2005/03/02 pref string buffer 260 bytes long
- * pb 2007/08/12 wchar_t
+ * pb 2007/08/12 wchar
  * pb 2007/12/09 preferences
  * pb 2011/05/15 C++
  */
@@ -30,14 +30,14 @@
 #include <string.h>
 #include "site.h"
 
-static wchar_t printCommand [Preferences_STRING_BUFFER_SIZE];
+static char32 printCommand [Preferences_STRING_BUFFER_SIZE];
 
-wchar_t * Site_getPrintCommand (void) { return printCommand; }
+char32 * Site_getPrintCommand () { return printCommand; }
 
-void Site_setPrintCommand (const wchar_t *text) { wcscpy (printCommand, text); }
+void Site_setPrintCommand (const char32 *text) { str32cpy (printCommand, text); }
 
-void Site_prefs (void) {
-	Preferences_addString (L"Site.printCommand", printCommand, L"lp -c %s");
+void Site_prefs () {
+	Preferences_addString (U"Site.printCommand", printCommand, U"lp -c %s");
 }
 
 /* End of file site.cpp */
diff --git a/sys/site.h b/sys/site.h
index 5a56793..c75714d 100644
--- a/sys/site.h
+++ b/sys/site.h
@@ -2,7 +2,7 @@
 #define _site_h_
 /* site.h
  *
- * Copyright (C) 1992-2011 Paul Boersma
+ * Copyright (C) 1992-2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,10 +19,10 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-wchar_t *Site_getPrintCommand (void);
-void Site_setPrintCommand (const wchar_t *text);
+char32 *Site_getPrintCommand ();
+void Site_setPrintCommand (const char32 *text);
 
-void Site_prefs (void);
+void Site_prefs ();
 
 /* End of file site.h */
 #endif
diff --git a/sys/winport_off.h b/sys/winport_off.h
index adc6aef..26a6691 100644
--- a/sys/winport_off.h
+++ b/sys/winport_off.h
@@ -1,6 +1,6 @@
 /* winport_off.h
  *
- * Copyright (C) 2011 Paul Boersma
+ * Copyright (C) 2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,7 +18,6 @@
  */
 
 #undef Graphics
-#undef Data
 #undef Polygon
 
 /* End of file winport_off.h */
diff --git a/sys/winport_on.h b/sys/winport_on.h
index 26ce31d..5a2d794 100644
--- a/sys/winport_on.h
+++ b/sys/winport_on.h
@@ -1,6 +1,6 @@
 /* winport_on.h
  *
- * Copyright (C) 2011 Paul Boersma
+ * Copyright (C) 2011,2015 Paul Boersma
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,7 +18,6 @@
  */
 
 #define Graphics WindowsGraphics
-#define Data WindowsData
 #define Polygon WindowsPolygon
 
 /* End of file winport_on.h */
diff --git a/test/fon/data.praat b/test/fon/data.praat
index fb6529e..a475bc9 100644
Binary files a/test/fon/data.praat and b/test/fon/data.praat differ
diff --git a/test/kar/unicode.praat b/test/kar/unicode.praat
index f4c0fc2..d870dc0 100644
Binary files a/test/kar/unicode.praat and b/test/kar/unicode.praat differ
diff --git "a/test/kar/a\314\212bc\314\247e\314\201u\314\210.wav" "b/test/kar/\303\245b\303\247\303\251\303\274.wav"
similarity index 100%
rename from "test/kar/a\314\212bc\314\247e\314\201u\314\210.wav"
rename to "test/kar/\303\245b\303\247\303\251\303\274.wav"
diff --git a/test/manually/demo_pdf.praat b/test/manually/demo_pdf.praat
new file mode 100644
index 0000000..22b34bc
--- /dev/null
+++ b/test/manually/demo_pdf.praat
@@ -0,0 +1,6 @@
+demo Draw inner box
+demo Axes: 0, 100, 0, 100
+demo Draw line: 0, 0, 100, 100
+Draw line: 0, 1, 1, 0
+demo Save as PDF file: "kanweg.pdf"
+demo Save as 300-dpi PNG file: "kanweg.png"
\ No newline at end of file
diff --git a/test/manually/testCommandLineCalls.praat b/test/manually/testCommandLineCalls.praat
new file mode 100644
index 0000000..a306a70
--- /dev/null
+++ b/test/manually/testCommandLineCalls.praat
@@ -0,0 +1,33 @@
+form Test command line calls
+	sentence First_text I love you
+	real Beep_duration 0.4
+	sentence Second_text Me too
+endform
+
+writeInfoLine: "She: """, first_text$, """"
+appendInfoLine: "He: """, second_text$, """"
+
+synth1 = Create SpeechSynthesizer: "English", "f1"
+Play text: first_text$
+Create Sound as pure tone: "beep", 1, 0.0, beep_duration,
+... 44100, 440, 0.2, 0.01, 0.01
+Play
+Remove
+synth2 = Create SpeechSynthesizer: "English", "m1"
+Play text: second_text$
+
+exit
+
+Praat.exe c:\Users\pboersma\Desktop\testCommandLineCalls.praat "I love you" 0.4 Me too
+
+Praat.exe c:\Users\pboersma\Desktop\testCommandLineCalls.praat "I love you" 0.4 "Me too"
+
+import os
+os.system('Praat.exe c:\\Users\\pboersma\\Desktop\\testCommandLineCalls.praat "I love you" 0.4 Me too')
+
+import subprocess
+subprocess.call('Praat.exe c:\\Users\\pboersma\\Desktop\\testCommandLineCalls.praat "I love you" 0.4 Me too')
+
+subprocess.call(['Praat.exe', 'c:\\Users\\pboersma\\Desktop\\testCommandLineCalls.praat', 'I love you', '0.4', 'Me too'])
+
+subprocess.call(['Praat.exe', 'c:\\Users\\pboersma\\Desktop\\testCommandLineCalls.praat', 'I love you', '0.4', 'Me', 'too'])exit
diff --git a/test/num/fisherQ.praat b/test/num/fisherQ.praat
index f0bf602..ec596bf 100644
--- a/test/num/fisherQ.praat
+++ b/test/num/fisherQ.praat
@@ -88,7 +88,7 @@ assert fisherQ (1, 1e19, 1e19) = undefined
 #
 Debug... no 29   ; set invFisherQ to GSL
 f = invFisherQ (0.01, 1, 10000)   ; not such an unusual case
-assert "'f'" = "nan" or "'f'" = "NaN"
+assert "'f'" = "nan" or "'f'" = "NaN" or index ("'f'", "NAN") or "'f:5'" = "6.63743"
 Debug... no 0   ; use our corrected NUMridders again
 f = invFisherQ (0.01, 1, 10000)   ; same case
 assert "'f:5'" = "6.63743"
diff --git a/test/num/mathFunctions.praat b/test/num/mathFunctions.praat
index db17744..e568fcd 100644
--- a/test/num/mathFunctions.praat
+++ b/test/num/mathFunctions.praat
@@ -9,10 +9,10 @@ assert sqrt (123456789^2) = 123456789
 assert abs (sqrt (2) ^ 2 - 2) < 1e-15
 
 printline exp
-# Paul Boersma, September 20, 2006
+# Paul Boersma, September 13, 2015
 assert exp (-10000) = 0
 assert exp (0) = 1
-assert exp (1) = e
+assert abs (exp (1) - e) < 1e-15
 assert abs (1 - exp (100) / e ^ 100) < 1e-13
 assert abs (1 - exp (100) * exp (-100)) < 1e-15
 assert abs (1 - e ^ 100 * e ^ -100) < 1e-14
diff --git a/test/runAllTests.praat b/test/runAllTests.praat
index d712323..b0c19a5 100644
--- a/test/runAllTests.praat
+++ b/test/runAllTests.praat
@@ -14,65 +14,89 @@ else
 	exitScript: "Unknown operating system."
 endif
 
+writeInfoLine: "Running all tests..."
+
+memoryReport$ = Report memory use
+strings_before = extractNumber (memoryReport$, "Strings:")
+arrays_before  = extractNumber (memoryReport$, "Arrays:")
+things_before  = extractNumber (memoryReport$, "Things:")
+other_before   = extractNumber (memoryReport$, "Other:")
+
 directories = Create Strings as directory list: "directories", "."
 numberOfDirectories = Get number of strings
 for directory to numberOfDirectories
-	appendInfoLine: directory
 	selectObject: directories
 	directory$ = Get string: directory
-	appendInfoLine: directory$
 	if directory$ <> "manually"
 		files = Create Strings as file list: "files", directory$ + "/*.praat"
 		numberOfFiles = Get number of strings
 		for file to numberOfFiles
 			selectObject: files
 			file$ = Get string: file
-			appendInfoLine: "### executing ", directory$, "/", file$, ":"
-			runScript: directory$ + "/" + file$
+			path$ = directory$ + "/" + file$
+			appendInfoLine: "### executing ", path$, ":"
+			runScript: path$
 		endfor
+		removeObject: files
 	endif
 endfor
+removeObject: directories
 
-directories1 = Create Strings as directory list... directories1 .
+directories1 = Create Strings as directory list: "directories1", "."
 numberOfDirectories1 = Get number of strings
 for directory1 to numberOfDirectories1
-	select Strings directories1
-	directory1$ = Get string... directory1
+	selectObject: directories1
+	directory1$ = Get string: directory1
 	if directory1$ <> "manually"
-		directories2 = Create Strings as directory list... directories2 'directory1$'/*
+		directories2 = Create Strings as directory list: "directories2", directory1$ + "/*"
 		numberOfDirectories2 = Get number of strings
 		for directory2 to numberOfDirectories2
-			select Strings directories2
-			directory2$ = Get string... directory2
-			files = Create Strings as file list... files 'directory1$'/'directory2$'/*.praat
+			selectObject: directories2
+			directory2$ = Get string: directory2
+			files = Create Strings as file list: "files", directory1$ + "/" + directory2$ + "/*.praat"
 			numberOfFiles = Get number of strings
 			for file to numberOfFiles
-				select files
-				file$ = Get string... file
-				printline ### executing 'directory1$'/'directory2$'/'file$':
-				execute 'directory1$'/'directory2$'/'file$'
+				selectObject: files
+				file$ = Get string: file
+				path$ = directory1$ + "/" + directory2$ + "/" + file$
+				appendInfoLine: "### executing ", path$, ":"
+				runScript: path$
 			endfor
+			removeObject: files
 		endfor
+		removeObject: directories2
 	endif
 endfor
+removeObject: directories1
 
-echo                  ALL PRAAT TESTS WENT OK
-printline
-line5$ = "        #####          #####        #####   #####"
-line8$ = "        #####          #####        #######"
-line1$ = "               ######               #####           #####"
-line2$ = "           ##############           #####         #####"
-line4$ = "        #####          #####        #####     #####"
-line7$ = "        #####          #####        #########"
-line9$ = "        #####          #####        #####"
-line3$ = "         #####        #####         #####       #####"
-line6$ = "        #####          #####        ##### #####"
+writeInfoLine: "                 ALL PRAAT TESTS WENT OK"
+appendInfoLine: ""
+line$ [5] = "        #####          #####        #####   #####"
+line$ [8] = "        #####          #####        #######"
+line$ [1] = "               ######               #####           #####"
+line$ [2] = "           ##############           #####         #####"
+line$ [4] = "        #####          #####        #####     #####"
+line$ [7] = "        #####          #####        #########"
+line$ [9] = "        #####          #####        #####"
+line$ [3] = "         #####        #####         #####       #####"
+line$ [6] = "        #####          #####        ##### #####"
 for line from 1 to 9
-	line$ = line'line'$
-	printline 'line$'
+	appendInfoLine: line$ [line]
 endfor
-for line2 from 1 to 8
-	line = 9 - line2
-	line$ = line'line'$
-	printline 'line$'
+for line from 1 to 8
+	appendInfoLine: line$ [9 - line]
 endfor
+
+memoryReport$ = Report memory use
+strings_after = extractNumber (memoryReport$, "Strings:")
+arrays_after  = extractNumber (memoryReport$, "Arrays:")
+things_after  = extractNumber (memoryReport$, "Things:")
+other_after   = extractNumber (memoryReport$, "Other:")
+
+appendInfoLine ()
+appendInfoLine: "Leaking:"
+appendInfoLine: "   Strings: ", strings_after - strings_before
+appendInfoLine: "   Arrays: ", arrays_after - arrays_before
+appendInfoLine: "   Things: ", things_after - things_before
+appendInfoLine: "   Other: ", other_after - other_before
+
diff --git a/test/test.txt b/test/test.praat
similarity index 100%
rename from test/test.txt
rename to test/test.praat

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/praat.git



More information about the debian-med-commit mailing list